diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000..7ac3d6078d --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,293 @@ +# Python CircleCI 2.0 configuration file +# +# Check https://circleci.com/docs/2.0/language-python/ for more details +# +version: 2 +jobs: + build: + docker: + # specify the version you desire here + # use `-browsers` prefix for selenium tests, e.g. `3.6.1-browsers` + - image: circleci/python:2.7.13 + + # Specify service dependencies here if necessary + # CircleCI maintains a library of pre-built images + # documented at https://circleci.com/docs/2.0/circleci-images/ + # - image: circleci/postgres:9.4 + environment: + TEST_PLATFORM: "-e megaatmega2560" + + working_directory: ~/Marlin + + steps: + - checkout + + - restore_cache: + paths: + - ~/.platformio + - ~/Marlin/.piolibdeps + keys: + - v1-dependencies-{{ checksum "~/Marlin/platformio.ini" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + + - run: + name: install dependencies + command: | + sudo pip install -U platformio + + # run tests! + - run: + name: run tests + command: | + # + # + # Fetch the tag information for the current branch + ls -la + git fetch origin --tags + # + # Publish the buildroot script folder + chmod +x buildroot/bin/* + export PATH=`pwd`/buildroot/bin/:${PATH} + + # Generate custom version include + generate_version ./Marlin/src/inc + cat ./Marlin/src/inc/_Version.h + # + # Backup pins_RAMPS.h + # + cp Marlin/src/pins/pins_RAMPS.h Marlin/src/pins/pins_RAMPS.h.backup + # + + env_backup + + ################################# + # Build all sample configurations + ################################# + + echo testing megaatmega2560 targets... + export TEST_PLATFORM="-e megaatmega2560" + restore_configs + echo use_example_configs adafruit/ST7565 + use_example_configs adafruit/ST7565 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs BQ/Hephestos + use_example_configs BQ/Hephestos + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs BQ/Hephestos_2 + use_example_configs BQ/Hephestos_2 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs BQ/WITBOX + use_example_configs BQ/WITBOX + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs AliExpress/CL-260 + use_example_configs AliExpress/CL-260 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Cartesio + use_example_configs Cartesio + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/FLSUN/auto_calibrate + use_example_configs delta/FLSUN/auto_calibrate + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/FLSUN/kossel_mini + use_example_configs delta/FLSUN/kossel_mini + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/generic + use_example_configs delta/generic + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/kossel_mini + use_example_configs delta/kossel_mini + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs delta/kossel_xl + use_example_configs delta/kossel_xl + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Felix + use_example_configs Felix + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Felix/DUAL + use_example_configs Felix/DUAL + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs gCreate/gMax1.5+ + use_example_configs gCreate/gMax1.5+ + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Geeetech/GT2560 + use_example_configs Geeetech/GT2560 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Geeetech/I3_Pro_X-GT2560 + use_example_configs Geeetech/I3_Pro_X-GT2560 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Infitary/i3-M508 + use_example_configs Infitary/i3-M508 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + # + # Disabled due to compile failure on E0_AUTO_FAN_PIN PB8 + # + # use_example_configs Malyan/M200 + # build_marlin_pio ./ ${TEST_PLATFORM} + # restore_configs + echo use_example_configs Micromake/C1/basic + use_example_configs Micromake/C1/basic + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Micromake/C1/enhanced + use_example_configs Micromake/C1/enhanced + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs RepRapWorld/Megatronics + use_example_configs RepRapWorld/Megatronics + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs RigidBot + use_example_configs RigidBot + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs SCARA + use_example_configs SCARA + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Velleman/K8200 + use_example_configs Velleman/K8200 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Velleman/K8400/Dual-head + use_example_configs Velleman/K8400/Dual-head + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Velleman/K8400 + use_example_configs Velleman/K8400 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Wanhao/Duplicator6 + use_example_configs Wanhao/Duplicator6 + build_marlin_pio ./ ${TEST_PLATFORM} + # + # Disabled due to compile failure on https://github.com/stawel/SlowSoftI2CMaster + # + # - Requires https://github.com/stawel/SlowSoftI2CMaster + # restore_configs + # use_example_configs wt150 + # build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing anet10 targets... + export TEST_PLATFORM="-e anet10" + restore_configs + echo use_example_configs Anet/A6 + use_example_configs Anet/A6 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Anet/A8 + use_example_configs Anet/A8 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Creality/CR-10 + use_example_configs Creality/CR-10 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Malyan/M150 + use_example_configs Malyan/M150 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Sanguinololu + use_example_configs Sanguinololu + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs TinyBoy2 + use_example_configs TinyBoy2 + build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing rambo targets... + export TEST_PLATFORM="-e rambo" + restore_configs + echo use_example_configs AlephObjects/TAZ4 + use_example_configs AlephObjects/TAZ4 + build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing teensy20 targets... + export TEST_PLATFORM="-e teensy20" + # + # Disabled due to Z_MIN_PIN related compile failure + # + # restore_configs + # use_example_configs delta/kossel_pro + # build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs makibox + use_example_configs makibox + build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing sanguino_atmega644p targets... + export TEST_PLATFORM="-e sanguino_atmega644p" + restore_configs + echo use_example_configs tvrrug/Round2 + use_example_configs tvrrug/Round2 + build_marlin_pio ./ ${TEST_PLATFORM} + + + echo testing LPC1768 targets... + export TEST_PLATFORM="-e LPC1768" + restore_configs + echo use_example_configs FolgerTech/i3-2020 + use_example_configs FolgerTech/i3-2020 + build_marlin_pio ./ ${TEST_PLATFORM} + restore_configs + echo use_example_configs Mks/Sbase + use_example_configs Mks/Sbase + build_marlin_pio ./ ${TEST_PLATFORM} + + # + # Disabled due to numerous compile failures + # + # echo testing STM32F1 targets... + # export TEST_PLATFORM="-e STM32F1" + # restore_configs + # use_example_configs STM32F10 + # build_marlin_pio ./ ${TEST_PLATFORM} + # restore_configs + # use_example_configs stm32f103ret6 + # build_marlin_pio ./ ${TEST_PLATFORM} + + + # + # Disabled due do pin related compile failures + # + # echo testing DUE targets... + # export TEST_PLATFORM="-e DUE" + # restore_configs + # use_example_configs UltiMachine/Archim2 + # build_marlin_pio ./ ${TEST_PLATFORM} + + # + # Remove temp files from dependencies tree prior to caching + rm -rf ~/Marlin/.piolibdeps/_tmp_* + + # + # Restore the environment + # + env_restore + + - save_cache: + paths: + - ~/.platformio + - ~/Marlin/.piolibdeps + key: v1-dependencies-{{ checksum "~/Marlin/platformio.ini" }} diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index a0fa3eff17..0000000000 --- a/.editorconfig +++ /dev/null @@ -1,19 +0,0 @@ -# editorconfig.org -root = true - -[{*.patch,syntax_test_*}] -trim_trailing_whitespace = false - -[{*.c,*.cpp,*.h}] -charset = utf-8 - -[{*.c,*.cpp,*.h,Makefile}] -trim_trailing_whitespace = true -insert_final_newline = true -end_of_line = lf -indent_style = space -indent_size = 2 - -[{*.py,*.conf,*.sublime-project}] -indent_style = tab -indent_size = 4 diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index a973242932..0000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -github: [thinkyhead] -patreon: thinkyhead -custom: ["https://www.thinkyhead.com/donate-to-marlin"] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 6e735974a9..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -name: Bug report -about: Report a bug in Marlin -title: "[BUG] (short description)" -labels: '' -assignees: '' - ---- - - - -### Bug Description - - - -### Configuration Files - -**Required:** Include a ZIP file containing `Configuration.h` and `Configuration_adv.h`. - -If you've made any other modifications describe them in detail here. - -### Steps to Reproduce - - - -1. [First Step] -2. [Second Step] -3. [and so on...] - -**Expected behavior:** - - - -**Actual behavior:** - - - -#### Additional Information - -* Provide pictures or links to videos that clearly demonstrate the issue. -* See [Contributing to Marlin](https://github.com/MarlinFirmware/Marlin/blob/2.0.x/.github/contributing.md) for additional guidelines. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 4b283d2600..0000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,17 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Marlin Documentation - url: http://marlinfw.org/ - about: Lots of documentation on installing and using Marlin. - - name: MarlinFirmware Facebook group - url: https://www.facebook.com/groups/1049718498464482 - about: Please ask and answer questions here. - - name: Marlin on Discord - url: https://discord.gg/n5NJ59y - about: Join the Discord server for support and discussion. - - name: Marlin Discussion Forum - url: http://forums.reprap.org/list.php?415 - about: A searchable web forum hosted by RepRap dot org. - - name: Marlin Videos on YouTube - url: https://www.youtube.com/results?search_query=marlin+firmware - about: Tutorials and more from Marlin users all around the world. Great for new users! diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 24de8d0141..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -name: Feature request -about: Request a Feature -title: "[FR] (feature request title)" -labels: 'T: Feature Request' -assignees: '' - ---- - - - -### Description - - - -### Feature Workflow - - - -1. [First Action] -2. [Second Action] -3. [and so on...] - -#### Additional Information - -* Provide pictures or links that demonstrate a similar feature or concept. -* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines. diff --git a/.github/contributing.md b/.github/contributing.md index 6bc7b5a005..808c87bb04 100644 --- a/.github/contributing.md +++ b/.github/contributing.md @@ -34,15 +34,16 @@ This project and everyone participating in it is governed by the [Marlin Code of We have a Message Board and a Facebook group where our knowledgable user community can provide helpful advice if you have questions. -* [Marlin RepRap forum](https://reprap.org/forum/list.php?415) +* [Marlin RepRap forum](http://forums.reprap.org/list.php?415) * [MarlinFirmware on Facebook](https://www.facebook.com/groups/1049718498464482/) -If chat is more your speed, you can join the MarlinFirmware Discord server: +If chat is more your speed, you can join the MarlinFirmware Slack team: -* Use the link https://discord.gg/n5NJ59y to join up as a General User. -* Even though our Discord is pretty active, it may take a while for community members to respond — please be patient! -* Use the `#general` channel for general questions or discussion about Marlin. -* Other channels exist for certain topics or are limited to Patrons. Check the channel list. +* Join the Marlin Slack Team + * To obtain group access, please [send a request](http://www.thinkyhead.com/contact/9) to @thinkyhead. + * Even though Slack is a chat service, sometimes it takes several hours for community members to respond — please be patient! + * Use the `#general` channel for general questions or discussion about Marlin. + * Other channels exist for certain topics. Check the channel list. ## How Can I Contribute? @@ -92,7 +93,7 @@ Before creating a suggestion, please check [this list](#before-submitting-a-sugg #### Before Submitting a Feature Request -* **Check the [Marlin website](https://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](https://marlinfw.org/docs/configuration/configuration.html). +* **Check the [Marlin website](http://marlinfw.org/)** for tips — you might discover that the feature is already included. Most importantly, check if you're using [the latest version of Marlin](https://github.com/MarlinFirmware/Marlin/releases) and if you can get the desired behavior by changing [Marlin's config settings](http://marlinfw.org/docs/configuration/configuration.html). * **Perform a [cursory search](https://github.com/MarlinFirmware/Marlin/issues?q=is%3Aissue)** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. #### How Do I Submit A (Good) Feature Request? @@ -116,12 +117,12 @@ Unsure where to begin contributing to Marlin? You can start by looking through t ### Pull Requests -Pull Requests should always be targeted to working branches (e.g., `bugfix-1.1.x` and/or `bugfix-2.0.x`) and never to release branches (e.g., `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](https://marlinfw.org/docs/development/getting_started_pull_requests.html) and Github's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation. +Pull Requests should always be targeted to working branches (e.g., `bugfix-1.1.x` and/or `bugfix-2.0.x`) and never to release branches (e.g., `1.1.x`). If this is your first Pull Request, please read our [Guide to Pull Requests](http://marlinfw.org/docs/development/getting_started_pull_requests.html) and Github's [Pull Request](https://help.github.com/articles/creating-a-pull-request/) documentation. * Fill in [the required template](pull_request_template.md). * Don't include issue numbers in the PR title. * Include pictures, diagrams, and links to videos in your Pull Request to demonstrate your changes, if needed. -* Follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) posted on our website. +* Follow the [Coding Standards](http://marlinfw.org/docs/development/coding_standards.html) posted on our website. * Document new code with clear and concise comments. * End all files with a newline. @@ -136,7 +137,7 @@ Pull Requests should always be targeted to working branches (e.g., `bugfix-1.1.x ### C++ Coding Standards -* Please read and follow the [Coding Standards](https://marlinfw.org/docs/development/coding_standards.html) posted on our website. Failure to follow these guidelines will delay evaluation and acceptance of Pull Requests. +* Please read and follow the [Coding Standards](http://marlinfw.org/docs/development/coding_standards.html) posted on our website. Failure to follow these guidelines will delay evaluation and acceptance of Pull Requests. ### Documentation diff --git a/.github/issue_template.md b/.github/issue_template.md index a211ca5e27..58b4894f67 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -1,11 +1,31 @@ -# NO SUPPORT REQUESTS PLEASE + + +### Description + + + +### Steps to Reproduce + + + +1. [First Step] +2. [Second Step] +3. [and so on...] + +**Expected behavior:** [What you expect to happen] + +**Actual behavior:** [What actually happens] + +#### Additional Information + +* Include a ZIP file containing your `Configuration.h` and `Configuration_adv.h` files. +* Provide pictures or links to videos that clearly demonstrate the issue. +* See [How Can I Contribute](#how-can-i-contribute) for additional guidelines. diff --git a/.github/lock.yml b/.github/lock.yml deleted file mode 100644 index c5ceff66b0..0000000000 --- a/.github/lock.yml +++ /dev/null @@ -1,40 +0,0 @@ -# -# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app -# - -# Number of days of inactivity before a closed issue or pull request is locked -daysUntilLock: 60 - -# Skip issues and pull requests created before a given timestamp. Timestamp must -# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable -skipCreatedBefore: false - -# Issues and pull requests with these labels will be ignored. Set to `[]` to disable -exemptLabels: [ 'no-locking' ] - -# Label to add before locking, such as `outdated`. Set to `false` to disable -lockLabel: false - -# Comment to post before locking. Set to `false` to disable -lockComment: > - This thread has been automatically locked since there has not been - any recent activity after it was closed. Please open a new issue for - related bugs. - -# Assign `resolved` as the reason for locking. Set to `false` to disable -setLockReason: true - -# Limit to only `issues` or `pulls` -# only: issues - -# Optionally, specify configuration settings just for `issues` or `pulls` -# issues: -# exemptLabels: -# - help-wanted -# lockLabel: outdated - -# pulls: -# daysUntilLock: 30 - -# Repository to extend settings from -# _extends: repo diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d82fb0f9e3..9298b2b96d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,10 +14,6 @@ We must be able to understand your proposed change from this description. If we -### Configurations - - - ### Related Issues diff --git a/.github/workflows/bump-date.yml b/.github/workflows/bump-date.yml deleted file mode 100644 index 54902da8c9..0000000000 --- a/.github/workflows/bump-date.yml +++ /dev/null @@ -1,35 +0,0 @@ -# -# bump-date.yml -# Bump the distribution date once per day -# - -name: Bump Distribution Date - -on: - schedule: - - cron: '0 0 * * *' - -jobs: - bump_date: - name: Bump Distribution Date - if: github.repository == 'MarlinFirmware/Marlin' - - runs-on: ubuntu-latest - - steps: - - - name: Check out bugfix-2.0.x - uses: actions/checkout@v2 - with: - ref: bugfix-2.0.x - - - name: Bump Distribution Date - run: | - # Inline Bump Script - DIST=$( date +"%Y-%m-%d" ) - eval "sed -E -i 's/(#define +STRING_DISTRIBUTION_DATE) .*$/\1 \"$DIST\"/g' Marlin/src/inc/Version.h" && \ - git config user.name "${GITHUB_ACTOR}" && \ - git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" && \ - git add . && \ - git commit -m "[cron] Bump distribution date ($DIST)" && \ - git push diff --git a/.github/workflows/check-pr.yml b/.github/workflows/check-pr.yml deleted file mode 100644 index aa4a2c59c9..0000000000 --- a/.github/workflows/check-pr.yml +++ /dev/null @@ -1,33 +0,0 @@ -# -# check-pr.yml -# Close PRs directed at release branches -# - -name: PR Bad Target - -on: - pull_request: - branches: - - 1.0.x - - 1.1.x - - 2.0.x - -jobs: - bad_target: - name: PR Bad Target - if: github.repository == 'MarlinFirmware/Marlin' - - runs-on: ubuntu-latest - - steps: - - uses: peter-evans/close-pull@v1 - with: - delete-branch: false - comment: > - Thanks for your contribution! Unfortunately we can't accept PRs directed at release branches. We make patches to the bugfix branches and only later do we push them out as releases. - - Please redo this PR starting with the `bugfix-2.0.x` branch and be careful to target `bugfix-2.0.x` when resubmitting the PR. - - It may help to set your fork's default branch to `bugfix-2.0.x`. - - See [this page](http://marlinfw.org/docs/development/getting_started_pull_requests.html) for full instructions. diff --git a/.github/workflows/close-stale.yml b/.github/workflows/close-stale.yml deleted file mode 100644 index 89d5d65351..0000000000 --- a/.github/workflows/close-stale.yml +++ /dev/null @@ -1,27 +0,0 @@ -# -# close-stale.yml -# Close open issues after a period of inactivity -# - -name: Close Stale Issues - -on: - schedule: - - cron: "22 1 * * *" - -jobs: - stale: - name: Close Stale Issues - if: github.repository == 'MarlinFirmware/Marlin' - - runs-on: ubuntu-latest - - steps: - - uses: actions/stale@v3 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-issue-message: 'This issue has had no activity in the last 30 days. Please add a reply if you want to keep this issue active, otherwise it will be automatically closed within 7 days.' - days-before-stale: 30 - days-before-close: 7 - stale-issue-label: 'stale-closing-soon' - exempt-issue-labels: 'T: Feature Request' diff --git a/.github/workflows/lock-closed.yml b/.github/workflows/lock-closed.yml deleted file mode 100644 index 8cdcd7a836..0000000000 --- a/.github/workflows/lock-closed.yml +++ /dev/null @@ -1,32 +0,0 @@ -# -# lock-closed.yml -# Lock closed issues after a period of inactivity -# - -name: Lock Closed Issues - -on: - schedule: - - cron: '0 1/13 * * *' - -jobs: - lock: - name: Lock Closed Issues - if: github.repository == 'MarlinFirmware/Marlin' - - runs-on: ubuntu-latest - - steps: - - uses: dessant/lock-threads@v2 - with: - github-token: ${{ github.token }} - process-only: 'issues' - issue-lock-inactive-days: '60' - issue-exclude-created-before: '' - issue-exclude-labels: 'no-locking' - issue-lock-labels: '' - issue-lock-comment: > - This issue has been automatically locked since there - has not been any recent activity after it was closed. - Please open a new issue for related bugs. - issue-lock-reason: '' diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml deleted file mode 100644 index b228783799..0000000000 --- a/.github/workflows/test-builds.yml +++ /dev/null @@ -1,123 +0,0 @@ -# -# test-builds.yml -# Do test builds to catch compile errors -# - -name: CI - -on: - pull_request: - branches: - - bugfix-2.0.x - paths-ignore: - - config/** - - data/** - - docs/** - - '**/*.md' - push: - branches: - - bugfix-2.0.x - paths-ignore: - - config/** - - data/** - - docs/** - - '**/*.md' - -jobs: - test_builds: - name: Run All Tests - if: github.repository == 'MarlinFirmware/Marlin' - - runs-on: ubuntu-latest - - strategy: - matrix: - test-platform: - # Base Environments - - - DUE - - esp32 - - linux_native - - mega2560 - - teensy31 - - teensy35 - - teensy41 - - SAMD51_grandcentral_m4 - - # Extended AVR Environments - - - FYSETC_F6_13 - - mega1280 - - rambo - - sanguino1284p - - sanguino644p - - # Extended STM32 Environments - - - STM32F103RC_btt - - STM32F103RC_btt_USB - - STM32F103RE_btt - - STM32F103RE_btt_USB - - STM32F103RC_fysetc - - STM32F103RC_meeb - - jgaurora_a5s_a1 - - STM32F103VE_longer - - STM32F407VE_black - - STM32F401VE_STEVAL - - BIGTREE_BTT002 - - BIGTREE_SKR_PRO - - BIGTREE_GTR_V1_0 - - mks_robin - - mks_robin_stm32 - - ARMED - - FYSETC_S6 - - STM32F070CB_malyan - - STM32F070RB_malyan - - malyan_M300 - - mks_robin_lite - - FLYF407ZG - - rumba32 - - mks_robin_pro - - STM32F103RET6_creality - - LERDGEX - - mks_robin_nano35 - - # Put lengthy tests last - - - LPC1768 - - LPC1769 - - # STM32 with non-STM framework. both broken for now. they should use HAL_STM32 which is working. - - #- STM32F4 - #- STM32F7 - - # Non-working environment tests - #- at90usb1286_cdc - #- at90usb1286_dfu - #- STM32F103CB_malyan - #- mks_robin_mini - - steps: - - - name: Select Python 3.7 - uses: actions/setup-python@v1 - with: - python-version: '3.7' # Version range or exact version of a Python version to use, using semvers version range syntax. - architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified - - - name: Install PlatformIO - run: | - pip install -U https://github.com/platformio/platformio-core/archive/develop.zip - platformio update - - - name: Check out the PR - uses: actions/checkout@v2 - - - name: Run ${{ matrix.test-platform }} Tests - run: | - # Inline tests script - chmod +x buildroot/bin/* - chmod +x buildroot/tests/* - export PATH=./buildroot/bin/:./buildroot/tests/:${PATH} - run_tests . ${{ matrix.test-platform }} diff --git a/.github/workflows/unlock-reopened.yml b/.github/workflows/unlock-reopened.yml deleted file mode 100644 index 614ef3fab2..0000000000 --- a/.github/workflows/unlock-reopened.yml +++ /dev/null @@ -1,22 +0,0 @@ -# -# unlock-reopened.yml -# Unlock an issue whenever it is re-opened -# - -name: "Unlock reopened issue" - -on: - issues: - types: [reopened] - -jobs: - unlock: - name: Unlock Reopened - if: github.repository == 'MarlinFirmware/Marlin' - - runs-on: ubuntu-latest - - steps: - - uses: OSDKDev/unlock-issues@v1.1 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.gitignore b/.gitignore index c163d339df..7a364bbd42 100755 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,9 @@ # # Marlin 3D Printer Firmware -# Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +# Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] # # Based on Sprinter and grbl. -# Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm +# Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # # Our automatic versioning scheme generates the following file @@ -146,9 +146,6 @@ Marlin/*/*/readme.txt Marlin/*/*/*/readme.txt Marlin/*/*/*/*/readme.txt -# Secure Credentials -Configuration_Secure.h - #Visual Studio *.sln *.vcxproj @@ -174,13 +171,3 @@ CMakeListsPrivate.txt #CLion cmake-build-* - -#Eclipse -.project -.cproject -.pydevproject -.settings -.classpath - -#Python -__pycache__ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..7a80292f3b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,52 @@ +dist: trusty +sudo: false + +language: python +python: + - "2.7" + +notifications: + email: false + +# Cache PlatformIO packages using Travis CI container-based infrastructure +sudo: false +cache: + pip: true + directories: + - "~/.platformio" + +env: + - TEST_PLATFORM="megaatmega2560" + - TEST_PLATFORM="LPC1768" + - TEST_PLATFORM="DUE" + - TEST_PLATFORM="STM32F1" + - TEST_PLATFORM="teensy35" + +before_install: + # + # Fetch the tag information for the current branch + - git fetch origin --tags + # + # Publish the buildroot script folder + - chmod +x ${TRAVIS_BUILD_DIR}/buildroot/bin/* + - export PATH=${TRAVIS_BUILD_DIR}/buildroot/bin/:${PATH} + - chmod +x ${TRAVIS_BUILD_DIR}/buildroot/share/tests/* + - export PATH=${TRAVIS_BUILD_DIR}/buildroot/share/tests/:${PATH} + +install: + #- pip install -U platformio + - pip install -U https://github.com/platformio/platformio-core/archive/develop.zip + +before_script: + # Update PlatformIO packages + - platformio update + # + # Change current working directory to the build dir + - cd ${TRAVIS_BUILD_DIR} + # + # Generate custom version include + - generate_version ${TRAVIS_BUILD_DIR}/Marlin/src/inc + - cat ${TRAVIS_BUILD_DIR}/Marlin/src/inc/_Version.h + # +script: + - start_tests ${TRAVIS_BUILD_DIR} ${TEST_PLATFORM} diff --git a/LICENSE b/LICENSE index 6c0e10f3b8..f27031ae85 100644 --- a/LICENSE +++ b/LICENSE @@ -3,7 +3,7 @@ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (c) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -634,7 +634,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} - Copyright (c) {year} {name of author} + Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -647,14 +647,14 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - {project} Copyright (c) {year} {fullname} + {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -666,11 +666,12 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. + diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index db266b524b..bd63e6362b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Configuration.h @@ -34,8 +33,11 @@ * - Extra features * * Advanced settings can be found in Configuration_adv.h + * */ -#define CONFIGURATION_H_VERSION 020007 +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 //=========================================================================== //============================= Getting Started ============================= @@ -44,13 +46,13 @@ /** * Here are some standard links for getting your machine calibrated: * - * https://reprap.org/wiki/Calibration - * https://youtu.be/wAL9d7FgInk + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk * http://calculator.josefprusa.cz - * https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide - * https://www.thingiverse.com/thing:5573 + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap - * https://www.thingiverse.com/thing:298812 + * http://www.thingiverse.com/thing:298812 */ //=========================================================================== @@ -69,9 +71,13 @@ // @section info -// Author info of this build printed to the host during boot and M115 +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. #define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. -//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 /** * *** VENDORS PLEASE READ *** @@ -84,13 +90,10 @@ * respectfully request that you retain the unmodified Marlin boot screen. */ -// Show the Marlin bootscreen on startup. ** ENABLE FOR PRODUCTION ** -#define SHOW_BOOTSCREEN - -// Show the bitmap in Marlin/_Bootscreen.h on startup. +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. //#define SHOW_CUSTOM_BOOTSCREEN -// Show the bitmap in Marlin/_Statusscreen.h on the status screen. +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. //#define CUSTOM_STATUS_SCREEN_IMAGE // @section machine @@ -98,7 +101,6 @@ /** * Select the serial port on the board to use for communication with the host. * This allows the connection of wireless adapters (for instance) to non-default port pins. - * Serial port -1 is the USB emulated serial port, if available. * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. * * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] @@ -107,6 +109,9 @@ /** * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] */ //#define SERIAL_PORT_2 -1 @@ -125,37 +130,32 @@ // Enable the Bluetooth serial interface on AT90USB devices //#define BLUETOOTH -// Choose the name from boards.h that matches your setup +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD #define MOTHERBOARD BOARD_RAMPS_14_EFB #endif -// Name displayed in the LCD "Ready" message and Info menu +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message //#define CUSTOM_MACHINE_NAME "3D Printer" -// Printer's unique ID, used by some programs to differentiate between machines. -// Choose your own or use a service like https://www.uuidgenerator.net/version4 +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) //#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" // @section extruder // This defines the number of extruders -// :[0, 1, 2, 3, 4, 5, 6, 7, 8] +// :[1, 2, 3, 4, 5] #define EXTRUDERS 1 // Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. -#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 // For Cyclops or any "multi-extruder" that shares a single nozzle. //#define SINGLENOZZLE -// Save and restore temperature and fan speed on tool-change. -// Set standby for the unselected tool with M104/106/109 T... -#if ENABLED(SINGLENOZZLE) - //#define SINGLENOZZLE_STANDBY_TEMP - //#define SINGLENOZZLE_STANDBY_FAN -#endif - /** * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. * @@ -175,16 +175,6 @@ //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs #endif -/** - * Průša Multi-Material Unit v2 - * - * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. - * Requires EXTRUDERS = 5 - * - * For additional configuration see Configuration_adv.h - */ -//#define PRUSA_MMU2 - // A dual extruder that uses a single stepper motor //#define SWITCHING_EXTRUDER #if ENABLED(SWITCHING_EXTRUDER) @@ -195,52 +185,25 @@ #endif #endif -// A dual-nozzle that uses a servomotor to raise/lower one (or both) of the nozzles +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles //#define SWITCHING_NOZZLE #if ENABLED(SWITCHING_NOZZLE) #define SWITCHING_NOZZLE_SERVO_NR 0 - //#define SWITCHING_NOZZLE_E1_SERVO_NR 1 // If two servos are used, the index of the second - #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 (single servo) or lowered/raised (dual servo) + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 #endif /** * Two separate X-carriages with extruders that connect to a moving part - * via a solenoid docking mechanism. Requires SOL1_PIN and SOL2_PIN. + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. */ //#define PARKING_EXTRUDER - -/** - * Two separate X-carriages with extruders that connect to a moving part - * via a magnetic docking mechanism using movements and no solenoid - * - * project : https://www.thingiverse.com/thing:3080893 - * movements : https://youtu.be/0xCEiG9VS3k - * https://youtu.be/Bqbcs0CU2FE - */ -//#define MAGNETIC_PARKING_EXTRUDER - -#if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) - +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders - #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder - //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 - - #if ENABLED(PARKING_EXTRUDER) - - #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage - #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil - #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // (ms) Delay for magnetic field. No delay if 0 or not defined. - //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 - - #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) - - #define MPE_FAST_SPEED 9000 // (mm/min) Speed for travel before last distance point - #define MPE_SLOW_SPEED 4500 // (mm/min) Speed for last distance travel to park and couple - #define MPE_TRAVEL_DISTANCE 10 // (mm) Last distance point - #define MPE_COMPENSATION 0 // Offset Compensation -1 , 0 , 1 (multiplier) only for coupling - - #endif - + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking #endif /** @@ -250,153 +213,103 @@ * the E3D Tool Changer. Toolheads are locked with a servo. */ //#define SWITCHING_TOOLHEAD - -/** - * Magnetic Switching Toolhead - * - * Support swappable and dockable toolheads with a magnetic - * docking mechanism using movement and no servo. - */ -//#define MAGNETIC_SWITCHING_TOOLHEAD - -/** - * Electromagnetic Switching Toolhead - * - * Parking for CoreXY / HBot kinematics. - * Toolheads are parked at one edge and held with an electromagnet. - * Supports more than 2 Toolheads. See https://youtu.be/JolbsAKTKf4 - */ -//#define ELECTROMAGNETIC_SWITCHING_TOOLHEAD - -#if ANY(SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) - #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock - #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis - #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis - #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders - #if ENABLED(SWITCHING_TOOLHEAD) - #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector - #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock - #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) - #define SWITCHING_TOOLHEAD_Y_RELEASE 5 // (mm) Security distance Y axis - #define SWITCHING_TOOLHEAD_X_SECURITY { 90, 150 } // (mm) Security distance X axis (T0,T1) - //#define PRIME_BEFORE_REMOVE // Prime the nozzle before release from the dock - #if ENABLED(PRIME_BEFORE_REMOVE) - #define SWITCHING_TOOLHEAD_PRIME_MM 20 // (mm) Extruder prime length - #define SWITCHING_TOOLHEAD_RETRACT_MM 10 // (mm) Retract after priming length - #define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/min) Extruder prime feedrate - #define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/min) Extruder retract feedrate - #endif - #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) - #define SWITCHING_TOOLHEAD_Z_HOP 2 // (mm) Z raise for switching - #endif +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking #endif /** * "Mixing Extruder" - * - Adds G-codes M163 and M164 to set and "commit" the current mix factors. + * - Adds a new code, M165, to set the current mix factors. * - Extends the stepping routines to move multiple steppers in proportion to the mix. - * - Optional support for Repetier Firmware's 'M164 S' supporting virtual tools. - * - This implementation supports up to two mixing extruders. - * - Enable DIRECT_MIXING_IN_G1 for M165 and mixing in G1 (from Pia Taubert's reference implementation). + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation */ //#define MIXING_EXTRUDER #if ENABLED(MIXING_EXTRUDER) #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands - //#define GRADIENT_MIX // Support for gradient mixing with M166 and LCD - #if ENABLED(GRADIENT_MIX) - //#define GRADIENT_VTOOL // Add M166 T to use a V-tool index as a Gradient alias - #endif #endif // Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). // The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). // For the other hotends it is their distance from the extruder 0 hotend. -//#define HOTEND_OFFSET_X { 0.0, 20.00 } // (mm) relative X-offset for each nozzle -//#define HOTEND_OFFSET_Y { 0.0, 5.00 } // (mm) relative Y-offset for each nozzle -//#define HOTEND_OFFSET_Z { 0.0, 0.00 } // (mm) relative Z-offset for each nozzle +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle // @section machine /** - * Power Supply Control + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN * - * Enable and connect the power supply to the PS_ON_PIN. - * Specify whether the power supply is active HIGH or active LOW. + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } */ -//#define PSU_CONTROL -//#define PSU_NAME "Power Supply" +#define POWER_SUPPLY 0 -#if ENABLED(PSU_CONTROL) - #define PSU_ACTIVE_STATE LOW // Set 'LOW' for ATX, 'HIGH' for X-Box +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF - //#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80 - //#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power - - //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin #if ENABLED(AUTO_POWER_CONTROL) - #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_FANS // Turn on PSU if fans need power #define AUTO_POWER_E_FANS #define AUTO_POWER_CONTROLLERFAN - #define AUTO_POWER_CHAMBER_FAN - //#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU over this temperature - //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU over this temperature #define POWER_TIMEOUT 30 #endif + #endif +// @section temperature + //=========================================================================== //============================= Thermal Settings ============================ //=========================================================================== -// @section temperature /** * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table * * Temperature sensors available: * - * -5 : PT100 / PT1000 with MAX31865 (only for sensors 0-1) - * -3 : thermocouple with MAX31855 (only for sensors 0-1) - * -2 : thermocouple with MAX6675 (only for sensors 0-1) * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) * -1 : thermocouple with AD595 * 0 : not used * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) - * 331 : (3.3V scaled thermistor 1 table for MEGA) - * 332 : (3.3V scaled thermistor 1 table for DUE) * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) - * 202 : 200k thermistor - Copymaster 3D * 3 : Mendel-parts thermistor (4.7k pullup) * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! - * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan, J-Head, and E3D) (4.7k pullup) + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) * 501 : 100K Zonestar (Tronxy X3A) Thermistor - * 502 : 100K Zonestar Thermistor used by hot bed in Zonestar Průša P802M - * 512 : 100k RPW-Ultra hotend thermistor (4.7k pullup) * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) * 10 : 100k RS thermistor 198-961 (4.7k pullup) - * 11 : 100k beta 3950 1% thermistor (Used in Keenovo AC silicone mats and most Wanhao i3 machines) (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" * 15 : 100k thermistor calibration for JGAurora A5 hotend - * 18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 - * 20 : Pt100 with circuit in the Ultimainboard V2.x with 5v excitation (AVR) - * 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....) - * 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB) - * 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB) - * 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup) - * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x + * 20 : the PT100 circuit found in the Ultimainboard V2.x * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 - * 61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup * 66 : 4.7M High Temperature thermistor from Dyze Design - * 67 : 450C thermistor from SliceEngineering * 70 : the 100K thermistor found in the bq Hephestos 2 * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor - * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) * * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. * (but gives greater accuracy and more stable PID) @@ -404,109 +317,105 @@ * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) * - * 1047 : Pt1000 with 4k7 pullup (E3D) + * 1047 : Pt1000 with 4k7 pullup * 1010 : Pt1000 with 1k pullup (non standard) * 147 : Pt100 with 4k7 pullup * 110 : Pt100 with 1k pullup (non standard) * - * 1000 : Custom - Specify parameters in Configuration_adv.h - * * Use these for Testing or Development purposes. NEVER for production machine. * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 #define TEMP_SENSOR_4 0 -#define TEMP_SENSOR_5 0 -#define TEMP_SENSOR_6 0 -#define TEMP_SENSOR_7 0 #define TEMP_SENSOR_BED 0 -#define TEMP_SENSOR_PROBE 0 #define TEMP_SENSOR_CHAMBER 0 // Dummy thermistor constant temperature readings, for use with 998 and 999 #define DUMMY_THERMISTOR_998_VALUE 25 #define DUMMY_THERMISTOR_999_VALUE 100 -// Resistor values when using a MAX31865 (sensor -5) -// Sensor value is typically 100 (PT100) or 1000 (PT1000) -// Calibration value is typically 430 ohm for AdaFruit PT100 modules and 4300 ohm for AdaFruit PT1000 modules. -//#define MAX31865_SENSOR_OHMS 100 -//#define MAX31865_CALIBRATION_OHMS 430 - // Use temp sensor 1 as a redundant sensor with sensor 0. If the readings // from the two sensors differ too much the print will be aborted. //#define TEMP_SENSOR_1_AS_REDUNDANT #define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 -#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 -#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer -#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. -#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190 -#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer -#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. -// Below this temperature the heater will be switched off -// because it probably indicates a broken thermistor wire. -#define HEATER_0_MINTEMP 5 -#define HEATER_1_MINTEMP 5 -#define HEATER_2_MINTEMP 5 -#define HEATER_3_MINTEMP 5 -#define HEATER_4_MINTEMP 5 -#define HEATER_5_MINTEMP 5 -#define HEATER_6_MINTEMP 5 -#define HEATER_7_MINTEMP 5 -#define BED_MINTEMP 5 +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 -// Above this temperature the heater will be switched off. -// This can protect components from overheating, but NOT from shorts and failures. -// (Use MINTEMP for thermistor short/failure protection.) +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. #define HEATER_0_MAXTEMP 275 #define HEATER_1_MAXTEMP 275 #define HEATER_2_MAXTEMP 275 #define HEATER_3_MAXTEMP 275 #define HEATER_4_MAXTEMP 275 -#define HEATER_5_MAXTEMP 275 -#define HEATER_6_MAXTEMP 275 -#define HEATER_7_MAXTEMP 275 -#define BED_MAXTEMP 150 +#define BED_MAXTEMP 150 //=========================================================================== //============================= PID Settings ================================ //=========================================================================== -// PID Tuning Guide here: https://reprap.org/wiki/PID_Tuning +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning // Comment the following line to disable PID and enable bang-bang. #define PIDTEMP #define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current #define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current #define PID_K1 0.95 // Smoothing factor within any PID loop - #if ENABLED(PIDTEMP) - //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of PROGMEM) - //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 - #if ENABLED(PID_PARAMS_PER_HOTEND) - // Specify between 1 and HOTENDS values per array. - // If fewer than EXTRUDER values are provided, the last element will be repeated. - #define DEFAULT_Kp_LIST { 22.20, 22.20 } - #define DEFAULT_Ki_LIST { 1.08, 1.08 } - #define DEFAULT_Kd_LIST { 114.00, 114.00 } - #else - #define DEFAULT_Kp 22.20 - #define DEFAULT_Ki 1.08 - #define DEFAULT_Kd 114.00 - #endif #endif // PIDTEMP //=========================================================================== -//====================== PID > Bed Temperature Control ====================== +//============================= PID > Bed Temperature Control =============== //=========================================================================== /** @@ -535,26 +444,24 @@ #define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current #if ENABLED(PIDTEMPBED) - //#define MIN_BED_POWER 0 + //#define PID_BED_DEBUG // Sends debug data to the serial port. - // 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) - // from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) #define DEFAULT_bedKp 10.00 #define DEFAULT_bedKi .023 #define DEFAULT_bedKd 305.4 + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. #endif // PIDTEMPBED -#if EITHER(PIDTEMP, PIDTEMPBED) - //#define PID_DEBUG // Sends debug data to the serial port. Use 'M303 D' to toggle activation. - //#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX - //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay - #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature - // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. -#endif - // @section extruder /** @@ -593,7 +500,6 @@ #define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders #define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed -#define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber //=========================================================================== //============================= Mechanical Settings ========================= @@ -601,7 +507,7 @@ // @section machine -// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics, +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics // either in the usual order or reversed //#define COREXY //#define COREXZ @@ -609,7 +515,6 @@ //#define COREYX //#define COREZX //#define COREZY -//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042 //=========================================================================== //============================== Endstop Settings =========================== @@ -654,13 +559,13 @@ #endif // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). -#define X_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define X_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Y_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Z_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Z_MIN_PROBE_ENDSTOP_INVERTING false // Set to true to invert the logic of the probe. +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. /** * Stepper Drivers @@ -670,13 +575,11 @@ * * A4988 is assumed for unspecified drivers. * - * Options: A4988, A5984, DRV8825, LV8729, L6470, L6474, POWERSTEP01, - * TB6560, TB6600, TMC2100, - * TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE, - * TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE, + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, - * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE - * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] */ //#define X_DRIVER_TYPE A4988 //#define Y_DRIVER_TYPE A4988 @@ -684,37 +587,32 @@ //#define X2_DRIVER_TYPE A4988 //#define Y2_DRIVER_TYPE A4988 //#define Z2_DRIVER_TYPE A4988 -//#define Z3_DRIVER_TYPE A4988 -//#define Z4_DRIVER_TYPE A4988 //#define E0_DRIVER_TYPE A4988 //#define E1_DRIVER_TYPE A4988 //#define E2_DRIVER_TYPE A4988 //#define E3_DRIVER_TYPE A4988 //#define E4_DRIVER_TYPE A4988 -//#define E5_DRIVER_TYPE A4988 -//#define E6_DRIVER_TYPE A4988 -//#define E7_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. //#define ENDSTOP_INTERRUPTS_FEATURE /** - * Endstop Noise Threshold + * Endstop Noise Filter * - * Enable if your probe or endstops falsely trigger due to noise. - * - * - Higher values may affect repeatability or accuracy of some bed probes. - * - To fix noise install a 100nF ceramic capacitor in parallel with the switch. - * - This feature is not required for common micro-switches mounted on PCBs - * based on the Makerbot design, which already have the 100nF capacitor. - * - * :[2,3,4,5,6,7] + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) */ -//#define ENDSTOP_NOISE_THRESHOLD 2 - -// Check for stuck or disconnected endstops during homing moves. -//#define DETECT_BROKEN_ENDSTOP +//#define ENDSTOP_NOISE_FILTER //============================================================================= //============================== Movement Settings ============================ @@ -739,35 +637,25 @@ /** * Default Axis Steps Per Unit (steps/mm) * Override with M92 - * X, Y, Z, E0 [, E1[, E2...]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ #define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } /** * Default Max Feed Rate (mm/s) * Override with M203 - * X, Y, Z, E0 [, E1[, E2...]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ #define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } -//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 -#if ENABLED(LIMITED_MAX_FR_EDITING) - #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits -#endif - /** * Default Max Acceleration (change/s) change = mm/s * (Maximum start speed for accelerated moves) * Override with M201 - * X, Y, Z, E0 [, E1[, E2...]] + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] */ #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } -//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 -#if ENABLED(LIMITED_MAX_ACCEL_EDITING) - #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits -#endif - /** * Default Acceleration (change/s) change = mm/s * Override with M204 @@ -781,41 +669,17 @@ #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves /** - * Default Jerk limits (mm/s) + * Default Jerk (mm/s) * Override with M205 X Y Z E * * "Jerk" specifies the minimum speed change that requires acceleration. * When changing speed and direction, if the difference is less than the * value set here, it may happen instantaneously. */ -//#define CLASSIC_JERK -#if ENABLED(CLASSIC_JERK) - #define DEFAULT_XJERK 10.0 - #define DEFAULT_YJERK 10.0 - #define DEFAULT_ZJERK 0.3 - - //#define TRAVEL_EXTRA_XYJERK 0.0 // Additional jerk allowance for all travel moves - - //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 - #if ENABLED(LIMITED_JERK_EDITING) - #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits - #endif -#endif - -#define DEFAULT_EJERK 5.0 // May be used by Linear Advance - -/** - * Junction Deviation Factor - * - * See: - * https://reprap.org/forum/read.php?1,739819 - * https://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html - */ -#if DISABLED(CLASSIC_JERK) - #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge - #define JD_HANDLE_SMALL_SEGMENTS // Use curvature estimation instead of just the junction angle - // for small segments (< 1mm) with large junction angles (> 135°). -#endif +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 /** * S-Curve Acceleration @@ -833,25 +697,22 @@ // @section probes // -// See https://marlinfw.org/docs/configuration/probes.html +// See http://marlinfw.org/docs/configuration/probes.html // /** - * Enable this option for a probe connected to the Z-MIN pin. - * The probe replaces the Z-MIN endstop and is used for Z homing. - * (Automatically enables USE_PROBE_FOR_Z_HOMING.) + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. */ #define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN -// Force the use of the probe for Z-axis homing -//#define USE_PROBE_FOR_Z_HOMING - /** - * Z_MIN_PROBE_PIN + * Z_MIN_PROBE_ENDSTOP * - * Define this pin if the probe is not connected to Z_MIN_PIN. - * If not defined the default pin for the selected MOTHERBOARD - * will be used. Most of the time the default is what you want. + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. * * - The simplest option is to use a free endstop connector. * - Use 5V for powered (usually inductive) sensors. @@ -860,8 +721,12 @@ * - For simple switches connect... * - normally-closed switches to GND and D32. * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * */ -//#define Z_MIN_PROBE_PIN 32 // Pin 32 is the RAMPS default +//#define Z_MIN_PROBE_ENDSTOP /** * Probe Type @@ -884,45 +749,34 @@ */ //#define FIX_MOUNTED_PROBE -/** - * Use the nozzle as the probe, as with a conductive - * nozzle system or a piezo-electric smart effector. - */ -//#define NOZZLE_AS_PROBE - /** * Z Servo Probe, such as an endstop switch on a rotating arm. */ -//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. -//#define Z_SERVO_ANGLES { 70, 0 } // Z Servo Deploy and Stow angles +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles /** * The BLTouch probe uses a Hall effect sensor and emulates a servo. */ //#define BLTOUCH - -/** - * Pressure sensor with a BLTouch-like interface - */ -//#define CREALITY_TOUCH - -/** - * Touch-MI Probe by hotends.fr - * - * This probe is deployed and activated by moving the X-axis to a magnet at the edge of the bed. - * By default, the magnet is assumed to be on the left and activated by a home. If the magnet is - * on the right, enable and set TOUCH_MI_DEPLOY_XPOS to the deploy position. - * - * Also requires: BABYSTEPPING, BABYSTEP_ZPROBE_OFFSET, Z_SAFE_HOMING, - * and a minimum Z_HOMING_HEIGHT of 10. - */ -//#define TOUCH_MI_PROBE -#if ENABLED(TOUCH_MI_PROBE) - #define TOUCH_MI_RETRACT_Z 0.5 // Height at which the probe retracts - //#define TOUCH_MI_DEPLOY_XPOS (X_MAX_BED + 2) // For a magnet on the right side of the bed - //#define TOUCH_MI_MANUAL_DEPLOY // For manual deploy (LCD menu) +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed #endif +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + // A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) //#define SOLENOID_PROBE @@ -930,88 +784,49 @@ //#define Z_PROBE_SLED //#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. -// A probe deployed by moving the x-axis, such as the Wilson II's rack-and-pinion probe designed by Marty Rice. -//#define RACK_AND_PINION_PROBE -#if ENABLED(RACK_AND_PINION_PROBE) - #define Z_PROBE_DEPLOY_X X_MIN_POS - #define Z_PROBE_RETRACT_X X_MAX_POS -#endif - -// Duet Smart Effector (for delta printers) - https://bit.ly/2ul5U7J -// When the pin is defined you can use M672 to set/reset the probe sensivity. -//#define DUET_SMART_EFFECTOR -#if ENABLED(DUET_SMART_EFFECTOR) - #define SMART_EFFECTOR_MOD_PIN -1 // Connect a GPIO pin to the Smart Effector MOD pin -#endif - -/** - * Use StallGuard2 to probe the bed with the nozzle. - * Requires stallGuard-capable Trinamic stepper drivers. - * CAUTION: This can damage machines with Z lead screws. - * Take extreme care when setting up this feature. - */ -//#define SENSORLESS_PROBING - // // For Z_PROBE_ALLEN_KEY see the Delta example configurations. // /** - * Nozzle-to-Probe offsets { X, Y, Z } + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. * - * - Use a caliper or ruler to measure the distance from the tip of - * the Nozzle to the center-point of the Probe in the X and Y axes. - * - For the Z offset use your best known value and adjust at runtime. - * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc. + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 * - * Assuming the typical work area orientation: - * - Probe to RIGHT of the Nozzle has a Positive X offset - * - Probe to LEFT of the Nozzle has a Negative X offset - * - Probe in BACK of the Nozzle has a Positive Y offset - * - Probe in FRONT of the Nozzle has a Negative Y offset - * - * Some examples: - * #define NOZZLE_TO_PROBE_OFFSET { 10, 10, -1 } // Example "1" - * #define NOZZLE_TO_PROBE_OFFSET {-10, 5, -1 } // Example "2" - * #define NOZZLE_TO_PROBE_OFFSET { 5, -5, -1 } // Example "3" - * #define NOZZLE_TO_PROBE_OFFSET {-15,-10, -1 } // Example "4" - * - * +-- BACK ---+ - * | [+] | - * L | 1 | R <-- Example "1" (right+, back+) - * E | 2 | I <-- Example "2" ( left-, back+) - * F |[-] N [+]| G <-- Nozzle - * T | 3 | H <-- Example "3" (right+, front-) - * | 4 | T <-- Example "4" ( left-, front-) - * | [-] | - * O-- FRONT --+ + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) */ -#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] -// Most probes should stay away from the edges of the bed, but -// with NOZZLE_AS_PROBE this can be negative for a wider probing area. -#define PROBING_MARGIN 10 +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 -// X and Y axis travel speed (mm/min) between probes -#define XY_PROBE_SPEED (133*60) +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 -// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2) +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) #define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z -// Feedrate (mm/min) for the "accurate" probe of each point +// Feedrate (mm/m) for the "accurate" probe of each point #define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) -/** - * Multiple Probing - * - * You may get improved results by probing 2 or more times. - * With EXTRA_PROBING the more atypical reading(s) will be disregarded. - * - * A total of 2 does fast/slow probes with a weighted average. - * A total of 3 or more adds more slow probes, taking the average. - */ +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. //#define MULTIPLE_PROBING 2 -//#define EXTRA_PROBING 1 /** * Z probes require clearance when deploying, stowing, and moving between @@ -1021,7 +836,7 @@ * * Use these settings to specify the distance (mm) to raise the probe (or * lower the bed). The values set here apply over and above any (negative) - * probe Z Offset set with NOZZLE_TO_PROBE_OFFSET, M851, or the LCD. + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. * Only integer values >= 1 are valid here. * * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. @@ -1041,27 +856,6 @@ // Enable the M48 repeatability test to test probe accuracy //#define Z_MIN_PROBE_REPEATABILITY_TEST -// Before deploy/stow pause for user confirmation -//#define PAUSE_BEFORE_DEPLOY_STOW -#if ENABLED(PAUSE_BEFORE_DEPLOY_STOW) - //#define PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED // For Manual Deploy Allenkey Probe -#endif - -/** - * Enable one or more of the following if probing seems unreliable. - * Heaters and/or fans can be disabled during probing to minimize electrical - * noise. A delay can also be added to allow noise and vibration to settle. - * These options are most useful for the BLTouch probe, but may also improve - * readings with inductive probes and piezo sensors. - */ -//#define PROBING_HEATERS_OFF // Turn heaters off when probing -#if ENABLED(PROBING_HEATERS_OFF) - //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) -#endif -//#define PROBING_FANS_OFF // Turn fans off when probing -//#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing -//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors - // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 // :{ 0:'Low', 1:'High' } #define X_ENABLE_ON 0 @@ -1069,19 +863,18 @@ #define Z_ENABLE_ON 0 #define E_ENABLE_ON 0 // For all extruders -// Disable axis steppers immediately when they're not being stepped. +// Disables axis stepper immediately when it's not being used. // WARNING: When motors turn off there is a chance of losing position accuracy! #define DISABLE_X false #define DISABLE_Y false #define DISABLE_Z false - -// Turn off the display blinking that warns about possible accuracy reduction +// Warn on display about possibly reduced accuracy //#define DISABLE_REDUCED_ACCURACY_WARNING // @section extruder -#define DISABLE_E false // Disable the extruder when not stepping -#define DISABLE_INACTIVE_EXTRUDER // Keep only the active extruder enabled +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. // @section machine @@ -1098,20 +891,15 @@ #define INVERT_E2_DIR false #define INVERT_E3_DIR false #define INVERT_E4_DIR false -#define INVERT_E5_DIR false -#define INVERT_E6_DIR false -#define INVERT_E7_DIR false // @section homing -//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed -//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. -//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ... - // Be sure to have this much clearance over your Z_MAX_POS to prevent grinding. - -//#define Z_AFTER_HOMING 10 // (mm) Height to move to after homing Z +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. // Direction of endstops when homing; 1=MAX, -1=MIN // :[-1,1] @@ -1158,7 +946,7 @@ #define MAX_SOFTWARE_ENDSTOP_Z #endif -#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD #endif @@ -1168,30 +956,15 @@ * * RAMPS-based boards use SERVO3_PIN for the first runout sensor. * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. */ //#define FILAMENT_RUNOUT_SENSOR #if ENABLED(FILAMENT_RUNOUT_SENSOR) - #define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500. - #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. - #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. - #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. - //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. - - // Set one or more commands to execute on filament runout. - // (After 'M412 H' Marlin will ask the host to handle the process.) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. #define FILAMENT_RUNOUT_SCRIPT "M600" - - // After a runout is detected, continue printing this length of filament - // before executing the runout script. Useful for a sensor at the end of - // a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead. - //#define FILAMENT_RUNOUT_DISTANCE_MM 25 - - #ifdef FILAMENT_RUNOUT_DISTANCE_MM - // Enable this option to use an encoder disc that toggles the runout pin - // as the filament moves. (Be sure to set FILAMENT_RUNOUT_DISTANCE_MM - // large enough to avoid false positives.) - //#define FILAMENT_MOTION_SENSOR - #endif #endif //=========================================================================== @@ -1251,7 +1024,7 @@ */ //#define DEBUG_LEVELING_FEATURE -#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL) +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) // Gradually reduce leveling correction until a set height is reached, // at which point movement will be level to the machine's XY plane. // The height can be set with M420 Z @@ -1270,20 +1043,24 @@ #if ENABLED(G26_MESH_VALIDATION) #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. - #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. - #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool. - #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. - #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. #endif #endif -#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) // Set the number of grid points per dimension. #define GRID_MAX_POINTS_X 3 #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + // Probe along the Y axis, advancing X after each column //#define PROBE_Y_FIRST @@ -1337,6 +1114,19 @@ #endif // BED_LEVELING +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + /** * Add a bed leveling sub-menu for ABL or MBL. * Include a guided procedure if manual probing is enabled. @@ -1344,19 +1134,16 @@ //#define LCD_BED_LEVELING #if ENABLED(LCD_BED_LEVELING) - #define MESH_EDIT_Z_STEP 0.025 // (mm) Step size while manually probing Z axis. - #define LCD_PROBE_Z_RANGE 4 // (mm) Z Range centered on Z_MIN_POS for LCD Z adjustment - //#define MESH_EDIT_MENU // Add a menu to edit mesh points + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment #endif // Add a menu item to move between bed corners for manual bed adjustment //#define LEVEL_BED_CORNERS #if ENABLED(LEVEL_BED_CORNERS) - #define LEVEL_CORNERS_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets - #define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points - #define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points - //#define LEVEL_CENTER_TOO // Move to the center after the last corner + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner #endif /** @@ -1365,6 +1152,7 @@ */ //#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + // @section homing // The center of the bed is at (X=0, Y=0) @@ -1382,23 +1170,20 @@ // // - Allow Z homing only after X and Y homing AND stepper drivers still enabled. // - If stepper drivers time out, it will need X and Y homing again before Z homing. -// - Move the Z probe (or nozzle) to a defined XY point before Z Homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). // - Prevent Z homing when the Z probe is outside bed area. // //#define Z_SAFE_HOMING #if ENABLED(Z_SAFE_HOMING) - #define Z_SAFE_HOMING_X_POINT X_CENTER // X point for Z homing - #define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). #endif -// Homing speeds (mm/min) +// Homing speeds (mm/m) #define HOMING_FEEDRATE_XY (50*60) #define HOMING_FEEDRATE_Z (4*60) -// Validate that endstops are triggered on homing moves -#define VALIDATE_HOMING_ENDSTOPS - // @section calibrate /** @@ -1462,22 +1247,17 @@ // @section extras -/** - * EEPROM - * - * Persistent storage to preserve configurable settings across reboots. - * - * M500 - Store settings to EEPROM. - * M501 - Read settings from EEPROM. (i.e., Throw away unsaved changes) - * M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.) - */ -//#define EEPROM_SETTINGS // Persistent storage with M500 and M501 -//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! -#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. -#define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load -#if ENABLED(EEPROM_SETTINGS) - //#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors. -#endif +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. // // Host Keepalive @@ -1489,6 +1269,11 @@ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. #define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + // // G20/G21 Inch mode support // @@ -1502,12 +1287,10 @@ // @section temperature // Preheat Constants -#define PREHEAT_1_LABEL "PLA" #define PREHEAT_1_TEMP_HOTEND 180 #define PREHEAT_1_TEMP_BED 70 #define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 -#define PREHEAT_2_LABEL "ABS" #define PREHEAT_2_TEMP_HOTEND 240 #define PREHEAT_2_TEMP_BED 110 #define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 @@ -1526,13 +1309,10 @@ //#define NOZZLE_PARK_FEATURE #if ENABLED(NOZZLE_PARK_FEATURE) - // Specify a park position as { X, Y, Z_raise } + // Specify a park position as { X, Y, Z } #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } - //#define NOZZLE_PARK_X_ONLY // X move only is required to park - //#define NOZZLE_PARK_Y_ONLY // Y move only is required to park - #define NOZZLE_PARK_Z_RAISE_MIN 2 // (mm) Always raise Z by at least this distance - #define NOZZLE_PARK_XY_FEEDRATE 100 // (mm/s) X and Y axes feedrate (also used for delta Z axis) - #define NOZZLE_PARK_Z_FEEDRATE 5 // (mm/s) Z axis feedrate (not used for delta printers) + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) #endif /** @@ -1571,6 +1351,7 @@ * * Caveats: The ending Z should be the same as starting Z. * Attention: EXPERIMENTAL. G-code arguments may change. + * */ //#define NOZZLE_CLEAN_FEATURE @@ -1581,10 +1362,9 @@ // Default number of triangles #define NOZZLE_CLEAN_TRIANGLES 3 - // Specify positions for each tool as { { X, Y, Z }, { X, Y, Z } } - // Dual hotend system may use { { -20, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }, { 420, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }} - #define NOZZLE_CLEAN_START_POINT { { 30, 30, (Z_MIN_POS + 1) } } - #define NOZZLE_CLEAN_END_POINT { { 100, 60, (Z_MIN_POS + 1) } } + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} // Circular pattern radius #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 @@ -1593,18 +1373,8 @@ // Middle point of circle #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT - // Move the nozzle to the initial position after cleaning + // Moves the nozzle to the initial position #define NOZZLE_CLEAN_GOBACK - - // For a purge/clean station that's always at the gantry height (thus no Z move) - //#define NOZZLE_CLEAN_NO_Z - - // For a purge/clean station mounted on the X axis - //#define NOZZLE_CLEAN_NO_Y - - // Explicit wipe G-code script applies to a G12 with no arguments. - //#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0" - #endif /** @@ -1638,37 +1408,6 @@ */ //#define PRINTCOUNTER -/** - * Password - * - * Set a numerical password for the printer which can be requested: - * - * - When the printer boots up - * - Upon opening the 'Print from Media' Menu - * - When SD printing is completed or aborted - * - * The following G-codes can be used: - * - * M510 - Lock Printer. Blocks all commands except M511. - * M511 - Unlock Printer. - * M512 - Set, Change and Remove Password. - * - * If you forget the password and get locked out you'll need to re-flash - * the firmware with the feature disabled, reset EEPROM, and (optionally) - * re-flash the firmware again with this feature enabled. - */ -//#define PASSWORD_FEATURE -#if ENABLED(PASSWORD_FEATURE) - #define PASSWORD_LENGTH 4 // (#) Number of digits (1-9). 3 or 4 is recommended - #define PASSWORD_ON_STARTUP - #define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P command. Disable to prevent brute-force attack. - #define PASSWORD_CHANGE_GCODE // Change the password with M512 P S. - //#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent gcodes from running - //#define PASSWORD_AFTER_SD_PRINT_END - //#define PASSWORD_AFTER_SD_PRINT_ABORT - //#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE -#endif - //============================================================================= //============================= LCD and SD support ============================ //============================================================================= @@ -1680,10 +1419,10 @@ * * Select the language to display on the LCD. These languages are available: * - * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it, - * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, tr, uk, vi, zh_CN, zh_TW, test + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test * - * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } */ #define LCD_LANGUAGE en @@ -1705,24 +1444,18 @@ * - Click the controller to view the LCD menu * - The LCD will display Japanese, Western, or Cyrillic text * - * See https://marlinfw.org/docs/development/lcd_language.html + * See http://marlinfw.org/docs/development/lcd_language.html * * :['JAPANESE', 'WESTERN', 'CYRILLIC'] */ #define DISPLAY_CHARSET_HD44780 JAPANESE -/** - * Info Screen Style (0:Classic, 1:Průša) - * - * :[0:'Classic', 1:'Průša'] - */ -#define LCD_INFO_SCREEN_STYLE 0 - /** * SD CARD * * SD Card support is disabled by default. If your controller has an SD slot, * you must uncomment the following option or it won't work. + * */ //#define SDSUPPORT @@ -1791,14 +1524,6 @@ // //#define REVERSE_MENU_DIRECTION -// -// This option reverses the encoder direction for Select Screen. -// -// If CLOCKWISE normally moves LEFT this makes it go RIGHT. -// If CLOCKWISE normally moves RIGHT this makes it go LEFT. -// -//#define REVERSE_SELECT_DIRECTION - // // Individual Axis Homing // @@ -1831,7 +1556,7 @@ // // RepRapDiscount Smart Controller. -// https://reprap.org/wiki/RepRapDiscount_Smart_Controller +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller // // Note: Usually sold with a white PCB. // @@ -1855,13 +1580,13 @@ // // PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) -// https://reprap.org/wiki/PanelOne +// http://reprap.org/wiki/PanelOne // //#define PANEL_ONE // // GADGETS3D G3D LCD/SD Controller -// https://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel // // Note: Usually sold with a blue PCB. // @@ -1875,7 +1600,7 @@ // // Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller -// https://www.aliexpress.com/item/32765887917.html +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html // //#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 @@ -1947,26 +1672,11 @@ // // -// 2-wire Non-latching LCD SR from https://goo.gl/aJJ4sH -// LCD configuration: https://reprap.org/wiki/SAV_3D_LCD +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD // //#define SAV_3DLCD -// -// 3-wire SR LCD with strobe using 74HC4094 -// https://github.com/mikeshub/SailfishLCD -// Uses the code directly from Sailfish -// -//#define FF_INTERFACEBOARD - -// -// TFT GLCD Panel with Marlin UI -// Panel connected to main board by SPI or I2C interface. -// See https://github.com/Serhiy-K/TFTGLCDAdapter -// -//#define TFTGLCD_PANEL_SPI -//#define TFTGLCD_PANEL_I2C - //============================================================================= //======================= LCD / Controller Selection ======================= //========================= (Graphical LCDs) ======================== @@ -1978,12 +1688,10 @@ // IMPORTANT: The U8glib library is required for Graphical Display! // https://github.com/olikraus/U8glib_Arduino // -// NOTE: If the LCD is unresponsive you may need to reverse the plugs. -// // // RepRapDiscount FULL GRAPHIC Smart Controller -// https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER @@ -1996,20 +1704,20 @@ // // Activate one of these if you have a Panucatt Devices // Viki 2.0 or mini Viki with Graphic LCD -// https://www.panucatt.com +// http://panucatt.com // //#define VIKI2 //#define miniVIKI // // MakerLab Mini Panel with graphic -// controller and SD support - https://reprap.org/wiki/Mini_panel +// controller and SD support - http://reprap.org/wiki/Mini_panel // //#define MINIPANEL // // MaKr3d Makr-Panel with graphic controller and SD support. -// https://reprap.org/wiki/MaKr3d_MaKrPanel +// http://reprap.org/wiki/MaKr3d_MaKrPanel // //#define MAKRPANEL @@ -2036,73 +1744,6 @@ // //#define LCD_FOR_MELZI -// -// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder -// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) -// -//#define ULTI_CONTROLLER - -// -// MKS MINI12864 with graphic controller and SD support -// https://reprap.org/wiki/MKS_MINI_12864 -// -//#define MKS_MINI_12864 - -// -// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout. -// https://www.aliexpress.com/item/33018110072.html -// -//#define MKS_LCD12864 - -// -// FYSETC variant of the MINI12864 graphic controller with SD support -// https://wiki.fysetc.com/Mini12864_Panel/ -// -//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default -//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on) -//#define FYSETC_MINI_12864_2_0 // Type A/B. Discreet RGB Backlight -//#define FYSETC_MINI_12864_2_1 // Type A/B. NeoPixel RGB Backlight -//#define FYSETC_GENERIC_12864_1_1 // Larger display with basic ON/OFF backlight. - -// -// Factory display for Creality CR-10 -// https://www.aliexpress.com/item/32833148327.html -// -// This is RAMPS-compatible using a single 10-pin connector. -// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) -// -//#define CR10_STOCKDISPLAY - -// -// Ender-2 OEM display, a variant of the MKS_MINI_12864 -// -//#define ENDER2_STOCKDISPLAY - -// -// ANET and Tronxy Graphical Controller -// -// Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 -// A clone of the RepRapDiscount full graphics display but with -// different pins/wiring (see pins_ANET_10.h). -// -//#define ANET_FULL_GRAPHICS_LCD - -// -// AZSMZ 12864 LCD with SD -// https://www.aliexpress.com/item/32837222770.html -// -//#define AZSMZ_12864 - -// -// Silvergate GLCD controller -// https://github.com/android444/Silvergate -// -//#define SILVER_GATE_GLCD_CONTROLLER - -//============================================================================= -//============================== OLED Displays ============================== -//============================================================================= - // // SSD1306 OLED full graphics generic display // @@ -2113,18 +1754,46 @@ // //#define SAV_3DGLCD #if ENABLED(SAV_3DGLCD) - #define U8GLIB_SSD1306 - //#define U8GLIB_SH1106 + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 #endif +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + // // TinyBoy2 128x64 OLED / Encoder Panel // //#define OLED_PANEL_TINYBOY2 // -// MKS OLED 1.3" 128×64 FULL GRAPHICS CONTROLLER -// https://reprap.org/wiki/MKS_12864OLED +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED // // Tiny, but very sharp OLED display // @@ -2132,151 +1801,43 @@ //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller // -// Zonestar OLED 128×64 FULL GRAPHICS CONTROLLER +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html // -//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller -//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default) -//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller +//#define AZSMZ_12864 // -// Einstart S OLED SSD1306 +// Silvergate GLCD controller +// http://github.com/android444/Silvergate // -//#define U8GLIB_SH1106_EINSTART - -// -// Overlord OLED display/controller with i2c buzzer and LEDs -// -//#define OVERLORD_OLED - -// -// FYSETC OLED 2.42" 128×64 FULL GRAPHICS CONTROLLER with WS2812 RGB -// Where to find : https://www.aliexpress.com/item/4000345255731.html -//#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller - -//============================================================================= -//========================== Extensible UI Displays =========================== -//============================================================================= - -// -// DGUS Touch Display with DWIN OS. (Choose one.) -// ORIGIN : https://www.aliexpress.com/item/32993409517.html -// FYSETC : https://www.aliexpress.com/item/32961471929.html -// -//#define DGUS_LCD_UI_ORIGIN -//#define DGUS_LCD_UI_FYSETC -//#define DGUS_LCD_UI_HIPRECY - -// -// Touch-screen LCD for Malyan M200/M300 printers -// -//#define MALYAN_LCD -#if ENABLED(MALYAN_LCD) - #define LCD_SERIAL_PORT 1 // Default is 1 for Malyan M200 -#endif - -// -// Touch UI for FTDI EVE (FT800/FT810) displays -// See Configuration_adv.h for all configuration options. -// -//#define TOUCH_UI_FTDI_EVE - -// -// Touch-screen LCD for Anycubic printers -// -//#define ANYCUBIC_LCD_I3MEGA -//#define ANYCUBIC_LCD_CHIRON -#if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - #define LCD_SERIAL_PORT 3 // Default is 3 for Anycubic - //#define ANYCUBIC_LCD_DEBUG -#endif - -// -// Third-party or vendor-customized controller interfaces. -// Sources should be installed in 'src/lcd/extensible_ui'. -// -//#define EXTENSIBLE_UI - -#if ENABLED(EXTENSIBLE_UI) - //#define EXTUI_LOCAL_BEEPER // Enables use of local Beeper pin with external display -#endif - -//============================================================================= -//=============================== Graphical TFTs ============================== -//============================================================================= - -/** - * TFT Type - Select your Display type - * - * Available options are: - * MKS_TS35_V2_0, - * MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, - * MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R - * TFT_TRONXY_X5SA, ANYCUBIC_TFT35, LONGER_LK_TFT28 - * TFT_GENERIC - * - * For TFT_GENERIC, you need to configure these 3 options: - * Driver: TFT_DRIVER - * Current Drivers are: AUTO, ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488 - * Resolution: TFT_WIDTH and TFT_HEIGHT - * Interface: TFT_INTERFACE_FSMC or TFT_INTERFACE_SPI - */ -//#define TFT_GENERIC - -/** - * TFT UI - User Interface Selection. Enable one of the following options: - * - * TFT_CLASSIC_UI - Emulated DOGM - 128x64 Upscaled - * TFT_COLOR_UI - Marlin Default Menus, Touch Friendly, using full TFT capabilities - * TFT_LVGL_UI - A Modern UI using LVGL - * - * For LVGL_UI also copy the 'assets' folder from the build directory to the - * root of your SD card, together with the compiled firmware. - */ -//#define TFT_CLASSIC_UI -//#define TFT_COLOR_UI -//#define TFT_LVGL_UI - -/** - * TFT Rotation. Set to one of the following values: - * - * TFT_ROTATE_90, TFT_ROTATE_90_MIRROR_X, TFT_ROTATE_90_MIRROR_Y, - * TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y, - * TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y, - * TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION - */ -//#define TFT_ROTATION TFT_NO_ROTATION +//#define SILVER_GATE_GLCD_CONTROLLER //============================================================================= //============================ Other Controllers ============================ //============================================================================= // -// Ender-3 v2 OEM display. A DWIN display with Rotary Encoder. +// CONTROLLER TYPE: Standalone / Serial // -//#define DWIN_CREALITY_LCD // -// ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8 +// LCD for Malyan M200 printers. // -//#define TOUCH_SCREEN -#if ENABLED(TOUCH_SCREEN) - #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens - #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus +//#define MALYAN_LCD - #define TOUCH_SCREEN_CALIBRATION - - //#define XPT2046_X_CALIBRATION 12316 - //#define XPT2046_Y_CALIBRATION -8981 - //#define XPT2046_X_OFFSET -43 - //#define XPT2046_Y_OFFSET 257 -#endif +// +// CONTROLLER TYPE: Keypad / Add-on +// // // RepRapWorld REPRAPWORLD_KEYPAD v1.1 -// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/ +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. // //#define REPRAPWORLD_KEYPAD -//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 //============================================================================= //=============================== Extra Features ============================== @@ -2284,10 +1845,6 @@ // @section extras -// Set number of user-controlled fans. Disable to use all board-defined fans. -// :[1,2,3,4,5,6,7,8] -//#define NUM_M106_FANS 1 - // Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN @@ -2300,7 +1857,6 @@ // affecting heaters, and the fan if FAN_SOFT_PWM is enabled. // However, control resolution will be halved for each increment; // at zero value, there are 128 effective control positions. -// :[0,1,2,3,4,5,6,7] #define SOFT_PWM_SCALE 0 // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can @@ -2314,6 +1870,13 @@ // then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) //#define TEMP_STAT_LEDS +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + // Support for the BariCUDA Paste Extruder //#define BARICUDA @@ -2323,9 +1886,6 @@ // Support for PCA9632 PWM LED driver //#define PCA9632 -// Support for PCA9533 PWM LED driver -//#define PCA9533 - /** * RGB LED / LED Strip Control * @@ -2335,53 +1895,38 @@ * Adds the M150 command to set the LED (or LED strip) color. * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of * luminance values can be set from 0 to 255. - * For NeoPixel LED an overall brightness parameter is also available. + * For Neopixel LED an overall brightness parameter is also available. * * *** CAUTION *** * LED Strips require a MOSFET Chip between PWM lines and LEDs, * as the Arduino cannot handle the current the LEDs will require. * Failure to follow this precaution can destroy your Arduino! - * NOTE: A separate 5V power supply is required! The NeoPixel LED needs + * NOTE: A separate 5V power supply is required! The Neopixel LED needs * more current than the Arduino 5V linear regulator can produce. * *** CAUTION *** * * LED Type. Enable only one of the following two options. + * */ //#define RGB_LED //#define RGBW_LED -#if EITHER(RGB_LED, RGBW_LED) - //#define RGB_LED_R_PIN 34 - //#define RGB_LED_G_PIN 43 - //#define RGB_LED_B_PIN 35 - //#define RGB_LED_W_PIN -1 +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 #endif -// Support for Adafruit NeoPixel LED driver +// Support for Adafruit Neopixel LED driver //#define NEOPIXEL_LED #if ENABLED(NEOPIXEL_LED) #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) - #define NEOPIXEL_PIN 4 // LED driving pin - //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE - //#define NEOPIXEL2_PIN 5 - #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip. (Longest strip when NEOPIXEL2_SEPARATE is disabled.) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup - - // Support for second Adafruit NeoPixel LED driver controlled with M150 S1 ... - //#define NEOPIXEL2_SEPARATE - #if ENABLED(NEOPIXEL2_SEPARATE) - #define NEOPIXEL2_PIXELS 15 // Number of LEDs in the second strip - #define NEOPIXEL2_BRIGHTNESS 127 // Initial brightness (0-255) - #define NEOPIXEL2_STARTUP_TEST // Cycle through colors at startup - #else - //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel - #endif - - // Use a single NeoPixel LED for static (background) lighting - //#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use - //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W #endif /** @@ -2395,20 +1940,25 @@ * - Change to green once print has finished * - Turn off after the print has finished and the user has pushed a button */ -#if ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) #define PRINTER_EVENT_LEDS #endif +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + /** * Number of servos * * For some servo-related options NUM_SERVOS will be set automatically. * Set this manually if there are extra servos needing manual control. - * Set to 0 to turn off servo support. + * Leave undefined or set to 0 to entirely disable the servo subsystem. */ //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command -// (ms) Delay before the next move will start, to give the servo time to reach its target angle. +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. // 300ms is a good value but you can try less delay. // If the servo can't reach the requested position, increase it. #define SERVO_DELAY { 300 } @@ -2416,5 +1966,7 @@ // Only power servos during movement, otherwise leave off to prevent jitter //#define DEACTIVATE_SERVOS_AFTER_MOVE -// Edit servo angles with M281 and save to EEPROM with M500 +// Allow servo angle to be edited and saved to EEPROM //#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index bcacddd20d..f5e753882a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Configuration_adv.h @@ -29,89 +28,17 @@ * Some of these settings can damage your printer if improperly set! * * Basic settings can be found in Configuration.h + * */ -#define CONFIGURATION_ADV_H_VERSION 020007 +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 -//=========================================================================== -//============================= Thermal Settings ============================ -//=========================================================================== // @section temperature -/** - * Thermocouple sensors are quite sensitive to noise. Any noise induced in - * the sensor wires, such as by stepper motor wires run in parallel to them, - * may result in the thermocouple sensor reporting spurious errors. This - * value is the number of errors which can occur in a row before the error - * is reported. This allows us to ignore intermittent error conditions while - * still detecting an actual failure, which should result in a continuous - * stream of errors from the sensor. - * - * Set this value to 0 to fail on the first error to occur. - */ -#define THERMOCOUPLE_MAX_ERRORS 15 - -// -// Custom Thermistor 1000 parameters -// -#if TEMP_SENSOR_0 == 1000 - #define HOTEND0_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define HOTEND0_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define HOTEND0_BETA 3950 // Beta value -#endif - -#if TEMP_SENSOR_1 == 1000 - #define HOTEND1_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define HOTEND1_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define HOTEND1_BETA 3950 // Beta value -#endif - -#if TEMP_SENSOR_2 == 1000 - #define HOTEND2_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define HOTEND2_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define HOTEND2_BETA 3950 // Beta value -#endif - -#if TEMP_SENSOR_3 == 1000 - #define HOTEND3_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define HOTEND3_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define HOTEND3_BETA 3950 // Beta value -#endif - -#if TEMP_SENSOR_4 == 1000 - #define HOTEND4_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define HOTEND4_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define HOTEND4_BETA 3950 // Beta value -#endif - -#if TEMP_SENSOR_5 == 1000 - #define HOTEND5_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define HOTEND5_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define HOTEND5_BETA 3950 // Beta value -#endif - -#if TEMP_SENSOR_6 == 1000 - #define HOTEND6_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define HOTEND6_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define HOTEND6_BETA 3950 // Beta value -#endif - -#if TEMP_SENSOR_7 == 1000 - #define HOTEND7_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define HOTEND7_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define HOTEND7_BETA 3950 // Beta value -#endif - -#if TEMP_SENSOR_BED == 1000 - #define BED_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define BED_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define BED_BETA 3950 // Beta value -#endif - -#if TEMP_SENSOR_CHAMBER == 1000 - #define CHAMBER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor - #define CHAMBER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C - #define CHAMBER_BETA 3950 // Beta value -#endif +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== // // Hephestos 2 24V heated bed upgrade kit. @@ -124,48 +51,10 @@ #define HEATER_BED_INVERTING true #endif -// -// Heated Bed Bang-Bang options -// #if DISABLED(PIDTEMPBED) - #define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control #if ENABLED(BED_LIMIT_SWITCHING) - #define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS - #endif -#endif - -// -// Heated Chamber options -// -#if TEMP_SENSOR_CHAMBER - #define CHAMBER_MINTEMP 5 - #define CHAMBER_MAXTEMP 60 - #define TEMP_CHAMBER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target - //#define CHAMBER_LIMIT_SWITCHING - //#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin - //#define HEATER_CHAMBER_INVERTING false - - //#define CHAMBER_FAN // Enable a fan on the chamber - #if ENABLED(CHAMBER_FAN) - #define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve. - #if CHAMBER_FAN_MODE == 0 - #define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255) - #elif CHAMBER_FAN_MODE == 1 - #define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255); turns on when chamber temperature is above the target - #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target - #elif CHAMBER_FAN_MODE == 2 - #define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255) - #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target - #endif - #endif - - //#define CHAMBER_VENT // Enable a servo-controlled vent on the chamber - #if ENABLED(CHAMBER_VENT) - #define CHAMBER_VENT_SERVO_NR 1 // Index of the vent servo - #define HIGH_EXCESS_HEAT_LIMIT 5 // How much above target temp to consider there is excess heat in the chamber - #define LOW_EXCESS_HEAT_LIMIT 3 - #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20 - #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS #endif #endif @@ -189,11 +78,6 @@ #define THERMAL_PROTECTION_PERIOD 40 // Seconds #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius - //#define ADAPTIVE_FAN_SLOWING // Slow part cooling fan if temperature drops - #if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP) - //#define NO_FAN_SLOWING_IN_PID_TUNING // Don't slow fan speed during M303 - #endif - /** * Whenever an M104, M109, or M303 increases the target temperature, the * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature @@ -214,115 +98,44 @@ * Thermal Protection parameters for the bed are just as above for hotends. */ #if ENABLED(THERMAL_PROTECTION_BED) - #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds - #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius /** * As described above, except for the bed (M140/M190/M303). */ - #define WATCH_BED_TEMP_PERIOD 60 // Seconds - #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius -#endif - -/** - * Thermal Protection parameters for the heated chamber. - */ -#if ENABLED(THERMAL_PROTECTION_CHAMBER) - #define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // Seconds - #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius - - /** - * Heated chamber watch settings (M141/M191). - */ - #define WATCH_CHAMBER_TEMP_PERIOD 60 // Seconds - #define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius #endif #if ENABLED(PIDTEMP) - // Add an experimental additional term to the heater power, proportional to the extrusion speed. - // A well-chosen Kc value should add just enough power to melt the increased material volume. + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. //#define PID_EXTRUSION_SCALING #if ENABLED(PID_EXTRUSION_SCALING) - #define DEFAULT_Kc (100) // heating power = Kc * e_speed + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) #define LPQ_MAX_LEN 50 #endif - - /** - * Add an experimental additional term to the heater power, proportional to the fan speed. - * A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan. - * You can either just add a constant compensation with the DEFAULT_Kf value - * or follow the instruction below to get speed-dependent compensation. - * - * Constant compensation (use only with fanspeeds of 0% and 100%) - * --------------------------------------------------------------------- - * A good starting point for the Kf-value comes from the calculation: - * kf = (power_fan * eff_fan) / power_heater * 255 - * where eff_fan is between 0.0 and 1.0, based on fan-efficiency and airflow to the nozzle / heater. - * - * Example: - * Heater: 40W, Fan: 0.1A * 24V = 2.4W, eff_fan = 0.8 - * Kf = (2.4W * 0.8) / 40W * 255 = 12.24 - * - * Fan-speed dependent compensation - * -------------------------------- - * 1. To find a good Kf value, set the hotend temperature, wait for it to settle, and enable the fan (100%). - * Make sure PID_FAN_SCALING_LIN_FACTOR is 0 and PID_FAN_SCALING_ALTERNATIVE_DEFINITION is not enabled. - * If you see the temperature drop repeat the test, increasing the Kf value slowly, until the temperature - * drop goes away. If the temperature overshoots after enabling the fan, the Kf value is too big. - * 2. Note the Kf-value for fan-speed at 100% - * 3. Determine a good value for PID_FAN_SCALING_MIN_SPEED, which is around the speed, where the fan starts moving. - * 4. Repeat step 1. and 2. for this fan speed. - * 5. Enable PID_FAN_SCALING_ALTERNATIVE_DEFINITION and enter the two identified Kf-values in - * PID_FAN_SCALING_AT_FULL_SPEED and PID_FAN_SCALING_AT_MIN_SPEED. Enter the minimum speed in PID_FAN_SCALING_MIN_SPEED - */ - //#define PID_FAN_SCALING - #if ENABLED(PID_FAN_SCALING) - //#define PID_FAN_SCALING_ALTERNATIVE_DEFINITION - #if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION) - // The alternative definition is used for an easier configuration. - // Just figure out Kf at fullspeed (255) and PID_FAN_SCALING_MIN_SPEED. - // DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly. - - #define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf - #define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf - #define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING - - #define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED) - #define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0 - - #else - #define PID_FAN_SCALING_LIN_FACTOR (0) // Power loss due to cooling = Kf * (fan_speed) - #define DEFAULT_Kf 10 // A constant value added to the PID-tuner - #define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING - #endif - #endif #endif /** - * Automatic Temperature Mode - * - * Dynamically adjust the hotend target temperature based on planned E moves. - * - * (Contrast with PID_EXTRUSION_SCALING, which tracks E movement and adjusts PID - * behavior using an additional kC value.) - * - * Autotemp is calculated by (mintemp + factor * mm_per_sec), capped to maxtemp. - * - * Enable Autotemp Mode with M104/M109 F S B. - * Disable by sending M104/M109 with no F parameter (or F0 with AUTOTEMP_PROPORTIONAL). + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode */ #define AUTOTEMP #if ENABLED(AUTOTEMP) - #define AUTOTEMP_OLDWEIGHT 0.98 - // Turn on AUTOTEMP on M104/M109 by default using proportions set here - //#define AUTOTEMP_PROPORTIONAL - #if ENABLED(AUTOTEMP_PROPORTIONAL) - #define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature - #define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature - #define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F) - #endif + #define AUTOTEMP_OLDWEIGHT 0.98 #endif +// Show extra position information in M114 +//#define M114_DETAIL + // Show Temperature ADC value // Enable for M105 to include ADC values read from temperature sensors. //#define SHOW_TEMP_ADC_VALUES @@ -363,20 +176,8 @@ #if ENABLED(EXTRUDER_RUNOUT_PREVENT) #define EXTRUDER_RUNOUT_MINTEMP 190 #define EXTRUDER_RUNOUT_SECONDS 30 - #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/min) - #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm) -#endif - -/** - * Hotend Idle Timeout - * Prevent filament in the nozzle from charring and causing a critical jam. - */ -//#define HOTEND_IDLE_TIMEOUT -#if ENABLED(HOTEND_IDLE_TIMEOUT) - #define HOTEND_IDLE_TIMEOUT_SEC (5*60) // (seconds) Time without extruder movement to trigger protection - #define HOTEND_IDLE_MIN_TRIGGER 180 // (°C) Minimum temperature to enable hotend protection - #define HOTEND_IDLE_NOZZLE_TARGET 0 // (°C) Safe temperature for the nozzle after timeout - #define HOTEND_IDLE_BED_TARGET 0 // (°C) Safe temperature for the bed after timeout + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm #endif // @section temperature @@ -392,22 +193,14 @@ * Controller Fan * To cool down the stepper drivers and MOSFETs. * - * The fan turns on automatically whenever any driver is enabled and turns - * off (or reduces to idle speed) shortly after drivers are turned off. + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. */ //#define USE_CONTROLLER_FAN #if ENABLED(USE_CONTROLLER_FAN) //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan - //#define CONTROLLER_FAN_USE_Z_ONLY // With this option only the Z axis is considered - //#define CONTROLLER_FAN_IGNORE_Z // Ignore Z stepper. Useful when stepper timeout is disabled. - #define CONTROLLERFAN_SPEED_MIN 0 // (0-255) Minimum speed. (If set below this value the fan is turned off.) - #define CONTROLLERFAN_SPEED_ACTIVE 255 // (0-255) Active speed, used when any motor is enabled - #define CONTROLLERFAN_SPEED_IDLE 0 // (0-255) Idle speed, used when motors are disabled - #define CONTROLLERFAN_IDLE_TIME 60 // (seconds) Extra time to keep the fan running after disabling motors - //#define CONTROLLER_FAN_EDITABLE // Enable M710 configurable settings - #if ENABLED(CONTROLLER_FAN_EDITABLE) - #define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu - #endif + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed #endif // When first starting the main fan, run it at full speed for the @@ -415,9 +208,6 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) //#define FAN_KICKSTART_TIME 100 -// Some coolers may require a non-zero "off" state. -//#define FAN_OFF_PWM 1 - /** * PWM Fan Scaling * @@ -433,33 +223,6 @@ //#define FAN_MIN_PWM 50 //#define FAN_MAX_PWM 128 -/** - * FAST PWM FAN Settings - * - * Use to change the FAST FAN PWM frequency (if enabled in Configuration.h) - * Combinations of PWM Modes, prescale values and TOP resolutions are used internally to produce a - * frequency as close as possible to the desired frequency. - * - * FAST_PWM_FAN_FREQUENCY [undefined by default] - * Set this to your desired frequency. - * If left undefined this defaults to F = F_CPU/(2*255*1) - * i.e., F = 31.4kHz on 16MHz microcontrollers or F = 39.2kHz on 20MHz microcontrollers. - * These defaults are the same as with the old FAST_PWM_FAN implementation - no migration is required - * NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior. - * - * USE_OCR2A_AS_TOP [undefined by default] - * Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2: - * 16MHz MCUs: [62.5KHz, 31.4KHz (default), 7.8KHz, 3.92KHz, 1.95KHz, 977Hz, 488Hz, 244Hz, 60Hz, 122Hz, 30Hz] - * 20MHz MCUs: [78.1KHz, 39.2KHz (default), 9.77KHz, 4.9KHz, 2.44KHz, 1.22KHz, 610Hz, 305Hz, 153Hz, 76Hz, 38Hz] - * A greater range can be achieved by enabling USE_OCR2A_AS_TOP. But note that this option blocks the use of - * PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.) - * USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies. - */ -#if ENABLED(FAST_PWM_FAN) - //#define FAST_PWM_FAN_FREQUENCY 31400 - //#define USE_OCR2A_AS_TOP -#endif - // @section extruder /** @@ -479,15 +242,9 @@ #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 #define E4_AUTO_FAN_PIN -1 -#define E5_AUTO_FAN_PIN -1 -#define E6_AUTO_FAN_PIN -1 -#define E7_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 - #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 -#define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed -#define CHAMBER_AUTO_FAN_TEMPERATURE 30 -#define CHAMBER_AUTO_FAN_SPEED 255 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed /** * Part-Cooling Fan Multiplexer @@ -509,15 +266,17 @@ #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) - //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm - //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu - //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. - //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light, requires NEOPIXEL_LED. + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } #endif #endif +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + // @section homing // If you want endstops to stay on (by default) even when not homing @@ -556,7 +315,7 @@ //#define X_DUAL_ENDSTOPS #if ENABLED(X_DUAL_ENDSTOPS) #define X2_USE_ENDSTOP _XMAX_ - #define X2_ENDSTOP_ADJUSTMENT 0 + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 #endif #endif @@ -566,28 +325,16 @@ //#define Y_DUAL_ENDSTOPS #if ENABLED(Y_DUAL_ENDSTOPS) #define Y2_USE_ENDSTOP _YMAX_ - #define Y2_ENDSTOP_ADJUSTMENT 0 + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 #endif #endif -// -// For Z set the number of stepper drivers -// -#define NUM_Z_STEPPER_DRIVERS 1 // (1-4) Z options change based on how many - -#if NUM_Z_STEPPER_DRIVERS > 1 - //#define Z_MULTI_ENDSTOPS - #if ENABLED(Z_MULTI_ENDSTOPS) - #define Z2_USE_ENDSTOP _XMAX_ - #define Z2_ENDSTOP_ADJUSTMENT 0 - #if NUM_Z_STEPPER_DRIVERS >= 3 - #define Z3_USE_ENDSTOP _YMAX_ - #define Z3_ENDSTOP_ADJUSTMENT 0 - #endif - #if NUM_Z_STEPPER_DRIVERS >= 4 - #define Z4_USE_ENDSTOP _ZMAX_ - #define Z4_ENDSTOP_ADJUSTMENT 0 - #endif +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 #endif #endif @@ -600,44 +347,40 @@ * The inactive carriage is parked automatically to prevent oozing. * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. * By default the X2 stepper is assigned to the first unused E plug on the board. - * - * The following Dual X Carriage modes can be selected with M605 S: - * - * 0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel - * results as long as it supports dual X-carriages. (M605 S0) - * - * 1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so - * that additional slicer support is not required. (M605 S1) - * - * 2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with - * the first X-carriage and extruder, to print 2 copies of the same object at the same time. - * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and - * follow with M605 S2 to initiate duplicated movement. - * - * 3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates - * the movement of the first except the second extruder is reversed in the X axis. - * Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and - * follow with M605 S3 to initiate mirrored movement. */ //#define DUAL_X_CARRIAGE #if ENABLED(DUAL_X_CARRIAGE) - #define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS - #define X1_MAX_POS X_BED_SIZE // Set a maximum so the first X-carriage can't hit the parked second X-carriage - #define X2_MIN_POS 80 // Set a minimum to ensure the second X-carriage can't hit the parked first X-carriage - #define X2_MAX_POS 353 // Set this to the distance between toolheads when both heads are homed - #define X2_HOME_DIR 1 // Set to 1. The second X-carriage always homes to the maximum endstop position - #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS. - // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software - // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops - // without modifying the firmware (through the "M218 T1 X???" command). - // Remember: you should set the second extruder x-offset to 0 in your slicer. + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) // This is the default power-up mode which can be later using M605. - #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder // Default x offset in duplication mode (typically set to half print bed width) #define DEFAULT_DUPLICATION_X_OFFSET 100 -#endif + +#endif // DUAL_X_CARRIAGE // Activate a solenoid on the active extruder with M380. Disable all with M381. // Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. @@ -645,187 +388,25 @@ // @section homing -/** - * Homing Procedure - * Homing (G28) does an indefinite move towards the endstops to establish - * the position of the toolhead relative to the workspace. - */ +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially -//#define SENSORLESS_BACKOFF_MM { 2, 2 } // (mm) Backoff from endstops before sensorless homing +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X -#define HOMING_BUMP_MM { 5, 5, 2 } // (mm) Backoff from endstops after first bump -#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING -//#define HOMING_BACKOFF_POST_MM { 2, 2, 2 } // (mm) Backoff from endstops after homing +// @section machine -//#define QUICK_HOME // If G28 contains XY do a diagonal move first -//#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X -//#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first +#define AXIS_RELATIVE_MODES {false, false, false, false} -// @section bltouch - -#if ENABLED(BLTOUCH) - /** - * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES - * Do not activate settings that the probe might not understand. Clones might misunderstand - * advanced commands. - * - * Note: If the probe is not deploying, do a "Reset" and "Self-Test" and then check the - * wiring of the BROWN, RED and ORANGE wires. - * - * Note: If the trigger signal of your probe is not being recognized, it has been very often - * because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable" - * like they would be with a real switch. So please check the wiring first. - * - * Settings for all BLTouch and clone probes: - */ - - // Safety: The probe needs time to recognize the command. - // Minimum command delay (ms). Enable and increase if needed. - //#define BLTOUCH_DELAY 500 - - /** - * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones: - */ - - // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful - // in special cases, like noisy or filtered input configurations. - //#define BLTOUCH_FORCE_SW_MODE - - /** - * Settings for BLTouch Smart 3.0 and 3.1 - * Summary: - * - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes - * - High-Speed mode - * - Disable LCD voltage options - */ - - /** - * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller! - * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup. - * If disabled, OD mode is the hard-coded default on 3.0 - * On startup, Marlin will compare its eeprom to this value. If the selected mode - * differs, a mode set eeprom write will be completed at initialization. - * Use the option below to force an eeprom write to a V3.1 probe regardless. - */ - //#define BLTOUCH_SET_5V_MODE - - /** - * Safety: Activate if connecting a probe with an unknown voltage mode. - * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0 - * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write ) - * To preserve the life of the probe, use this once then turn it off and re-flash. - */ - //#define BLTOUCH_FORCE_MODE_SET - - /** - * Use "HIGH SPEED" mode for probing. - * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. - * This feature was designed for Delta's with very fast Z moves however higher speed cartesians may function - * If the machine cannot raise the probe fast enough after a trigger, it may enter a fault state. - */ - //#define BLTOUCH_HS_MODE - - // Safety: Enable voltage mode settings in the LCD menu. - //#define BLTOUCH_LCD_VOLTAGE_MENU - -#endif // BLTOUCH - -// @section extras - -/** - * Z Steppers Auto-Alignment - * Add the G34 command to align multiple Z steppers using a bed probe. - */ -//#define Z_STEPPER_AUTO_ALIGN -#if ENABLED(Z_STEPPER_AUTO_ALIGN) - // Define probe X and Y positions for Z1, Z2 [, Z3 [, Z4]] - // If not defined, probe limits will be used. - // Override with 'M422 S X Y' - //#define Z_STEPPER_ALIGN_XY { { 10, 190 }, { 100, 10 }, { 190, 190 } } - - /** - * Orientation for the automatically-calculated probe positions. - * Override Z stepper align points with 'M422 S X Y' - * - * 2 Steppers: (0) (1) - * | | 2 | - * | 1 2 | | - * | | 1 | - * - * 3 Steppers: (0) (1) (2) (3) - * | 3 | 1 | 2 1 | 2 | - * | | 3 | | 3 | - * | 1 2 | 2 | 3 | 1 | - * - * 4 Steppers: (0) (1) (2) (3) - * | 4 3 | 1 4 | 2 1 | 3 2 | - * | | | | | - * | 1 2 | 2 3 | 3 4 | 4 1 | - */ - #ifndef Z_STEPPER_ALIGN_XY - //#define Z_STEPPERS_ORIENTATION 0 - #endif - - // Provide Z stepper positions for more rapid convergence in bed alignment. - // Requires triple stepper drivers (i.e., set NUM_Z_STEPPER_DRIVERS to 3) - //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - // Define Stepper XY positions for Z1, Z2, Z3 corresponding to - // the Z screw positions in the bed carriage. - // Define one position per Z stepper in stepper driver order. - #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } - #else - // Amplification factor. Used to scale the correction step up or down in case - // the stepper (spindle) position is farther out than the test point. - #define Z_STEPPER_ALIGN_AMP 1.0 // Use a value > 1.0 NOTE: This may cause instability! - #endif - - // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm - #define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle - #define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment - #define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this - #define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done? - // After G34, re-home Z (G28 Z) or just calculate it from the last probe heights? - // Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed. - #define HOME_AFTER_G34 -#endif - -// -// Add the G35 command to read bed corners to help adjust screws. Requires a bed probe. -// -//#define ASSISTED_TRAMMING -#if ENABLED(ASSISTED_TRAMMING) - - // Define positions for probing points, use the hotend as reference not the sensor. - #define TRAMMING_POINT_XY { { 20, 20 }, { 200, 20 }, { 200, 200 }, { 20, 200 } } - - // Define positions names for probing points. - #define TRAMMING_POINT_NAME_1 "Front-Left" - #define TRAMMING_POINT_NAME_2 "Front-Right" - #define TRAMMING_POINT_NAME_3 "Back-Right" - #define TRAMMING_POINT_NAME_4 "Back-Left" - - #define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation - //#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first - //#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item for Assisted Tramming - - /** - * Screw thread: - * M3: 30 = Clockwise, 31 = Counter-Clockwise - * M4: 40 = Clockwise, 41 = Counter-Clockwise - * M5: 50 = Clockwise, 51 = Counter-Clockwise - */ - #define TRAMMING_SCREW_THREAD 30 - -#endif - -// @section motion - -#define AXIS_RELATIVE_MODES { false, false, false, false } - -// Add a Duplicate option for well-separated conjoined nozzles -//#define MULTI_NOZZLE_DUPLICATION +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE // By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. #define INVERT_X_STEP_PIN false @@ -833,139 +414,52 @@ #define INVERT_Z_STEP_PIN false #define INVERT_E_STEP_PIN false -/** - * Idle Stepper Shutdown - * Set DISABLE_INACTIVE_? 'true' to shut down axis steppers after an idle period. - * The Deactive Time can be overridden with M18 and M84. Set to 0 for No Timeout. - */ +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. #define DEFAULT_STEPPER_DEACTIVE_TIME 120 #define DISABLE_INACTIVE_X true #define DISABLE_INACTIVE_Y true -#define DISABLE_INACTIVE_Z true // Set 'false' if the nozzle could fall onto your printed part! +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. #define DISABLE_INACTIVE_E true -// If the Nozzle or Bed falls when the Z stepper is disabled, set its resting position here. -//#define Z_AFTER_DEACTIVATE Z_HOME_POS +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 //#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated -// Default Minimum Feedrates for printing and travel moves -#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S. -#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T. +// @section lcd -// Minimum time that a segment needs to take as the buffer gets emptied -#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B. +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif -// Slow down the machine if the lookahead buffer is (by default) half full. -// Increase the slowdown divisor for larger buffer sizes. +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full #define SLOWDOWN -#if ENABLED(SLOWDOWN) - #define SLOWDOWN_DIVISOR 2 -#endif -/** - * XY Frequency limit - * Reduce resonance by limiting the frequency of small zigzag infill moves. - * See https://hydraraptor.blogspot.com/2010/12/frequency-limit.html - * Use M201 F G to change limits at runtime. - */ -//#define XY_FREQUENCY_LIMIT 10 // (Hz) Maximum frequency of small zigzag infill moves. Set with M201 F. -#ifdef XY_FREQUENCY_LIMIT - #define XY_FREQUENCY_MIN_PERCENT 5 // (percent) Minimum FR percentage to apply. Set with M201 G. -#endif +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 // Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end // of the buffer and all stops. This should not be much greater than zero and should only be changed // if unwanted behavior is observed on a user's machine when running at very slow speeds. -#define MINIMUM_PLANNER_SPEED 0.05 // (mm/s) +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) // -// Backlash Compensation -// Adds extra movement to axes on direction-changes to account for backlash. +// Use Junction Deviation instead of traditional Jerk Limiting // -//#define BACKLASH_COMPENSATION -#if ENABLED(BACKLASH_COMPENSATION) - // Define values for backlash distance and correction. - // If BACKLASH_GCODE is enabled these values are the defaults. - #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (mm) - #define BACKLASH_CORRECTION 0.0 // 0.0 = no correction; 1.0 = full correction - - // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments - // to reduce print artifacts. (Enabling this is costly in memory and computation!) - //#define BACKLASH_SMOOTHING_MM 3 // (mm) - - // Add runtime configuration and tuning of backlash values (M425) - //#define BACKLASH_GCODE - - #if ENABLED(BACKLASH_GCODE) - // Measure the Z backlash when probing (G29) and set with "M425 Z" - #define MEASURE_BACKLASH_WHEN_PROBING - - #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) - // When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT - // mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION - // increments while checking for the contact to be broken. - #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) - #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) - #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/min) - #endif - #endif -#endif - -/** - * Automatic backlash, position and hotend offset calibration - * - * Enable G425 to run automatic calibration using an electrically- - * conductive cube, bolt, or washer mounted on the bed. - * - * G425 uses the probe to touch the top and sides of the calibration object - * on the bed and measures and/or correct positional offsets, axis backlash - * and hotend offsets. - * - * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within - * ±5mm of true values for G425 to succeed. - */ -//#define CALIBRATION_GCODE -#if ENABLED(CALIBRATION_GCODE) - - //#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..." - //#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved" - - #define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm - - #define CALIBRATION_FEEDRATE_SLOW 60 // mm/min - #define CALIBRATION_FEEDRATE_FAST 1200 // mm/min - #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min - - // The following parameters refer to the conical section of the nozzle tip. - #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm - #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm - - // Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM). - //#define CALIBRATION_REPORTING - - // The true location and dimension the cube/bolt/washer on the bed. - #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm - #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm - - // Comment out any sides which are unreachable by the probe. For best - // auto-calibration results, all sides must be reachable. - #define CALIBRATION_MEASURE_RIGHT - #define CALIBRATION_MEASURE_FRONT - #define CALIBRATION_MEASURE_LEFT - #define CALIBRATION_MEASURE_BACK - - // Probing at the exact top center only works if the center is flat. If - // probing on a screwhead or hollow washer, probe near the edges. - //#define CALIBRATION_MEASURE_AT_TOP_EDGES - - // Define the pin to read during calibration - #ifndef CALIBRATION_PIN - //#define CALIBRATION_PIN -1 // Define here to override the default pin - #define CALIBRATION_PIN_INVERTING false // Set to true to invert the custom pin - //#define CALIBRATION_PIN_PULLDOWN - #define CALIBRATION_PIN_PULLUP - #endif +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge #endif /** @@ -976,19 +470,8 @@ */ //#define ADAPTIVE_STEP_SMOOTHING -/** - * Custom Microstepping - * Override as-needed for your setup. Up to 3 MS pins are supported. - */ -//#define MICROSTEP1 LOW,LOW,LOW -//#define MICROSTEP2 HIGH,LOW,LOW -//#define MICROSTEP4 LOW,HIGH,LOW -//#define MICROSTEP8 HIGH,HIGH,LOW -//#define MICROSTEP16 LOW,LOW,HIGH -//#define MICROSTEP32 HIGH,LOW,HIGH - -// Microstep settings (Requires a board with pins named X_MS1, X_MS2, etc.) -#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** * @section stepper motor current @@ -1014,109 +497,43 @@ //#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) //#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis -/** - * I2C-based DIGIPOTs (e.g., Azteeg X3 Pro) - */ -//#define DIGIPOT_MCP4018 // Requires https://github.com/stawel/SlowSoftI2CMaster -//#define DIGIPOT_MCP4451 -#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) - #define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT:4 AZTEEG_X3_PRO:8 MKS_SBASE:5 MIGHTYBOARD_REVE:5 - - // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. - // These correspond to the physical drivers, so be mindful if the order is changed. - #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO - - //#define DIGIPOT_USE_RAW_VALUES // Use DIGIPOT_MOTOR_CURRENT raw wiper values (instead of A4988 motor currents) - +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) /** * Common slave addresses: * * A (A shifted) B (B shifted) IC * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 - * AZTEEG_X5_MINI 0x2C (0x58) 0x2E (0x5C) MCP4451 * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 */ - //#define DIGIPOT_I2C_ADDRESS_A 0x2C // Unshifted slave address for first DIGIPOT - //#define DIGIPOT_I2C_ADDRESS_B 0x2D // Unshifted slave address for second DIGIPOT + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT #endif +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + //=========================================================================== //=============================Additional Features=========================== //=========================================================================== +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + // @section lcd -#if EITHER(ULTIPANEL, EXTENSIBLE_UI) - #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel - #define SHORT_MANUAL_Z_MOVE 0.025 // (mm) Smallest manual Z move (< 0.1mm) - #if ENABLED(ULTIPANEL) - #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" - #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen - #endif -#endif - -// Change values more rapidly when the encoder is rotated faster -#define ENCODER_RATE_MULTIPLIER -#if ENABLED(ENCODER_RATE_MULTIPLIER) - #define ENCODER_10X_STEPS_PER_SEC 30 // (steps/s) Encoder rate for 10x speed - #define ENCODER_100X_STEPS_PER_SEC 80 // (steps/s) Encoder rate for 100x speed -#endif - -// Play a beep when the feedrate is changed from the Status Screen -//#define BEEP_ON_FEEDRATE_CHANGE -#if ENABLED(BEEP_ON_FEEDRATE_CHANGE) - #define FEEDRATE_CHANGE_BEEP_DURATION 10 - #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 -#endif - -#if HAS_LCD_MENU - - // Add Probe Z Offset calibration to the Z Probe Offsets menu - #if HAS_BED_PROBE - //#define PROBE_OFFSET_WIZARD - #if ENABLED(PROBE_OFFSET_WIZARD) - #define PROBE_OFFSET_START -4.0 // Estimated nozzle-to-probe Z offset, plus a little extra - #endif - #endif - - // Include a page of printer information in the LCD Main Menu - //#define LCD_INFO_MENU - #if ENABLED(LCD_INFO_MENU) - //#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages - #endif - - // BACK menu items keep the highlight at the top - //#define TURBO_BACK_MENU_ITEM - - /** - * LED Control Menu - * Add LED Control to the LCD menu - */ - //#define LED_CONTROL_MENU - #if ENABLED(LED_CONTROL_MENU) - #define LED_COLOR_PRESETS // Enable the Preset Color menu option - //#define NEO2_COLOR_PRESETS // Enable a second NeoPixel Preset Color menu option - #if ENABLED(LED_COLOR_PRESETS) - #define LED_USER_PRESET_RED 255 // User defined RED value - #define LED_USER_PRESET_GREEN 128 // User defined GREEN value - #define LED_USER_PRESET_BLUE 0 // User defined BLUE value - #define LED_USER_PRESET_WHITE 255 // User defined WHITE value - #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity - //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup - #endif - #if ENABLED(NEO2_COLOR_PRESETS) - #define NEO2_USER_PRESET_RED 255 // User defined RED value - #define NEO2_USER_PRESET_GREEN 128 // User defined GREEN value - #define NEO2_USER_PRESET_BLUE 0 // User defined BLUE value - #define NEO2_USER_PRESET_WHITE 255 // User defined WHITE value - #define NEO2_USER_PRESET_BRIGHTNESS 255 // User defined intensity - //#define NEO2_USER_PRESET_STARTUP // Have the printer display the user preset color on startup for the second strip - #endif - #endif - -#endif // HAS_LCD_MENU +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU // Scroll a longer status message into view //#define STATUS_MESSAGE_SCROLLING @@ -1130,62 +547,52 @@ // Add an 'M73' G-code to set the current percentage //#define LCD_SET_PROGRESS_MANUALLY -// Show the E position (filament used) during printing -//#define LCD_SHOW_E_TOTAL - -#if ENABLED(SHOW_BOOTSCREEN) - #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) -#endif - -#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) - //#define SHOW_REMAINING_TIME // Display estimated time to completion - #if ENABLED(SHOW_REMAINING_TIME) - //#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation - //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY - #if HAS_MARLINUI_U8GLIB - //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup #endif - - #if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) - //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing - #if ENABLED(LCD_PROGRESS_BAR) - #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar - #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message - #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) - //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it - //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar - #endif - #endif -#endif +#endif // LED_CONTROL_MENU #if ENABLED(SDSUPPORT) - // The standard SD detect circuit reads LOW when media is inserted and HIGH when empty. - // Enable this option and set to HIGH if your SD cards are incorrectly detected. - //#define SD_DETECT_STATE HIGH + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED - //#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash) - - #define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls - - #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished - #define SD_FINISHED_RELEASECOMMAND "M84" // Use "M84XYE" to keep Z enabled so your bed stays in place + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. // Reverse SD sort to show "more recent" files first, according to the card's FAT. // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. #define SDCARD_RATHERRECENTFIRST - #define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing - - //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files - - #define EVENT_GCODE_SD_ABORT "G28XY" // G-code to run on SD Abort Print (e.g., "G28XY" or "G27") - - #if ENABLED(PRINTER_EVENT_LEDS) - #define PE_LEDS_COMPLETED_TIME (30*60) // (seconds) Time to keep the LED "done" color before restoring normal illumination - #endif + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART /** * Continue after Power-Loss (Creality3D) @@ -1197,19 +604,8 @@ */ //#define POWER_LOSS_RECOVERY #if ENABLED(POWER_LOSS_RECOVERY) - #define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) - //#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss - //#define POWER_LOSS_RECOVER_ZHOME // Z homing is needed for proper recovery. 99.9% of the time this should be disabled! - //#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS) - //#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. - //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss - //#define POWER_LOSS_PULL // Set pullup / pulldown as appropriate - //#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume - //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power. - - // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card, - // especially with "vase mode" printing. Set too high and vases cannot be continued. - #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss #endif /** @@ -1241,7 +637,7 @@ #if ENABLED(SDCARD_SORT_ALPHA) #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. #define FOLDER_SORTING -1 // -1=above 0=none 1=below - #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 G-code. + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. @@ -1256,15 +652,12 @@ // Enable this option to scroll long filenames in the SD card menu //#define SCROLL_LONG_FILENAMES - // Leave the heaters on after Stop Print (not recommended!) - //#define SD_ABORT_NO_COOLDOWN - /** * This option allows you to abort SD printing when any endstop is triggered. * This feature must be enabled with "M540 S1" or from the LCD menu. * To have any effect, endstops must be enabled during SD printing. */ - //#define SD_ABORT_ON_ENDSTOP_HIT + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED /** * This option makes it easier to print the same SD Card file again. @@ -1278,76 +671,8 @@ */ //#define AUTO_REPORT_SD_STATUS - /** - * Support for USB thumb drives using an Arduino USB Host Shield or - * equivalent MAX3421E breakout board. The USB thumb drive will appear - * to Marlin as an SD card. - * - * The MAX3421E can be assigned the same pins as the SD card reader, with - * the following pin mapping: - * - * SCLK, MOSI, MISO --> SCLK, MOSI, MISO - * INT --> SD_DETECT_PIN [1] - * SS --> SDSS - * - * [1] On AVR an interrupt-capable pin is best for UHS3 compatibility. - */ - //#define USB_FLASH_DRIVE_SUPPORT - #if ENABLED(USB_FLASH_DRIVE_SUPPORT) - #define USB_CS_PIN SDSS - #define USB_INTR_PIN SD_DETECT_PIN - - /** - * USB Host Shield Library - * - * - UHS2 uses no interrupts and has been production-tested - * on a LulzBot TAZ Pro with a 32-bit Archim board. - * - * - UHS3 is newer code with better USB compatibility. But it - * is less tested and is known to interfere with Servos. - * [1] This requires USB_INTR_PIN to be interrupt-capable. - */ - //#define USE_UHS3_USB - #endif - - /** - * When using a bootloader that supports SD-Firmware-Flashing, - * add a menu item to activate SD-FW-Update on the next reboot. - * - * Requires ATMEGA2560 (Arduino Mega) - * - * Tested with this bootloader: - * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560 - */ - //#define SD_FIRMWARE_UPDATE - #if ENABLED(SD_FIRMWARE_UPDATE) - #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF - #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0 - #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF - #endif - - // Add an optimized binary file transfer mode, initiated with 'M28 B1' - //#define BINARY_FILE_TRANSFER - - /** - * Set this option to one of the following (or the board's defaults apply): - * - * LCD - Use the SD drive in the external LCD controller. - * ONBOARD - Use the SD drive on the control board. (No SD_DETECT_PIN. M21 to init.) - * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file). - * - * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ] - */ - //#define SDCARD_CONNECTION LCD - #endif // SDSUPPORT -/** - * By default an onboard SD card reader may be shared as a USB mass- - * storage device. This option hides the SD card from the host PC. - */ -//#define NO_SD_HOST_DRIVE // Disable SD Card access over USB (for security). - /** * Additional options for Graphical Displays * @@ -1360,12 +685,11 @@ * controller events, as there is a trade-off between reliable * printing performance versus fast display updates. */ -#if HAS_MARLINUI_U8GLIB +#if ENABLED(DOGLCD) // Show SD percentage next to the progress bar //#define DOGM_SD_PERCENT - // Save many cycles by drawing a hollow frame or no frame on the Info Screen - //#define XYZ_NO_FRAME + // Enable to save many cycles by drawing a hollow frame on the Info Screen #define XYZ_HOLLOW_FRAME // Enable to save many cycles by drawing a hollow frame on Menu Screens @@ -1375,222 +699,48 @@ // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. //#define USE_BIG_EDIT_FONT - // A smaller font may be used on the Info Screen. Costs 2434 bytes of PROGMEM. + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. //#define USE_SMALL_INFOFONT + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + // Swap the CW/CCW indicators in the graphics overlay //#define OVERLAY_GFX_REVERSE - /** - * ST7920-based LCDs can emulate a 16 x 4 character display using - * the ST7920 character-generator for very fast screen updates. - * Enable LIGHTWEIGHT_UI to use this special display mode. - * - * Since LIGHTWEIGHT_UI has limited space, the position and status - * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the - * length of time to display the status message before clearing. - * - * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. - * This will prevent position updates from being displayed. - */ #if ENABLED(U8GLIB_ST7920) - // Enable this option and reduce the value to optimize screen updates. - // The normal delay is 10µs. Use the lowest value that still gives a reliable display. - //#define DOGM_SPI_DELAY_US 5 - + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ //#define LIGHTWEIGHT_UI #if ENABLED(LIGHTWEIGHT_UI) #define STATUS_EXPIRE_SECONDS 20 #endif #endif - /** - * Status (Info) Screen customizations - * These options may affect code size and screen render time. - * Custom status screens can forcibly override these settings. - */ - //#define STATUS_COMBINE_HEATERS // Use combined heater images instead of separate ones - //#define STATUS_HOTEND_NUMBERLESS // Use plain hotend icons instead of numbered ones (with 2+ hotends) - #define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM) - #define STATUS_HOTEND_ANIM // Use a second bitmap to indicate hotend heating - #define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating - #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating - //#define STATUS_CUTTER_ANIM // Use a second bitmap to indicate spindle / laser active - //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap - //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap - //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames - //#define STATUS_HEAT_PERCENT // Show heating in a progress bar - //#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving 399 bytes of flash) - //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~‭3260 (or ~940) bytes of PROGMEM. - - // Frivolous Game Options - //#define MARLIN_BRICKOUT - //#define MARLIN_INVADERS - //#define MARLIN_SNAKE - //#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu - -#endif // HAS_MARLINUI_U8GLIB - -// -// Additional options for DGUS / DWIN displays -// -#if HAS_DGUS_LCD - #define LCD_SERIAL_PORT 3 - #define LCD_BAUDRATE 115200 - - #define DGUS_RX_BUFFER_SIZE 128 - #define DGUS_TX_BUFFER_SIZE 48 - //#define SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR) - - #define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates - - #if EITHER(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) - #define DGUS_PRINT_FILENAME // Display the filename during printing - #define DGUS_PREHEAT_UI // Display a preheat screen during heatup - - #if ENABLED(DGUS_LCD_UI_FYSETC) - //#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for UI_FYSETC - #else - #define DGUS_UI_MOVE_DIS_OPTION // Enabled by default for UI_HIPRECY - #endif - - #define DGUS_FILAMENT_LOADUNLOAD - #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - #define DGUS_FILAMENT_PURGE_LENGTH 10 - #define DGUS_FILAMENT_LOAD_LENGTH_PER_TIME 0.5 // (mm) Adjust in proportion to DGUS_UPDATE_INTERVAL_MS - #endif - - #define DGUS_UI_WAITING // Show a "waiting" screen between some screens - #if ENABLED(DGUS_UI_WAITING) - #define DGUS_UI_WAITING_STATUS 10 - #define DGUS_UI_WAITING_STATUS_PERIOD 8 // Increase to slower waiting status looping - #endif - #endif -#endif // HAS_DGUS_LCD - -// -// Touch UI for the FTDI Embedded Video Engine (EVE) -// -#if ENABLED(TOUCH_UI_FTDI_EVE) - // Display board used - //#define LCD_FTDI_VM800B35A // FTDI 3.5" with FT800 (320x240) - //#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272) - //#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272) - //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) - //#define LCD_ALEPHOBJECTS_CLCD_UI // Aleph Objects Color LCD UI - //#define LCD_FYSETC_TFT81050 // FYSETC with 5" (800x480) - - // Correct the resolution if not using the stock TFT panel. - //#define TOUCH_UI_320x240 - //#define TOUCH_UI_480x272 - //#define TOUCH_UI_800x480 - - // Mappings for boards with a standard RepRapDiscount Display connector - //#define AO_EXP1_PINMAP // AlephObjects CLCD UI EXP1 mapping - //#define AO_EXP2_PINMAP // AlephObjects CLCD UI EXP2 mapping - //#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping - //#define S6_TFT_PINMAP // FYSETC S6 pin mapping - //#define F6_TFT_PINMAP // FYSETC F6 pin mapping - - //#define OTHER_PIN_LAYOUT // Define pins manually below - #if ENABLED(OTHER_PIN_LAYOUT) - // Pins for CS and MOD_RESET (PD) must be chosen - #define CLCD_MOD_RESET 9 - #define CLCD_SPI_CS 10 - - // If using software SPI, specify pins for SCLK, MOSI, MISO - //#define CLCD_USE_SOFT_SPI - #if ENABLED(CLCD_USE_SOFT_SPI) - #define CLCD_SOFT_SPI_MOSI 11 - #define CLCD_SOFT_SPI_MISO 12 - #define CLCD_SOFT_SPI_SCLK 13 - #endif - #endif - - // Display Orientation. An inverted (i.e. upside-down) display - // is supported on the FT800. The FT810 and beyond also support - // portrait and mirrored orientations. - //#define TOUCH_UI_INVERTED - //#define TOUCH_UI_PORTRAIT - //#define TOUCH_UI_MIRRORED - - // UTF8 processing and rendering. - // Unsupported characters are shown as '?'. - //#define TOUCH_UI_USE_UTF8 - #if ENABLED(TOUCH_UI_USE_UTF8) - // Western accents support. These accented characters use - // combined bitmaps and require relatively little storage. - #define TOUCH_UI_UTF8_WESTERN_CHARSET - #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET) - // Additional character groups. These characters require - // full bitmaps and take up considerable storage: - //#define TOUCH_UI_UTF8_SUPERSCRIPTS // ¹ ² ³ - //#define TOUCH_UI_UTF8_COPYRIGHT // © ® - //#define TOUCH_UI_UTF8_GERMANIC // ß - //#define TOUCH_UI_UTF8_SCANDINAVIAN // Æ Ð Ø Þ æ ð ø þ - //#define TOUCH_UI_UTF8_PUNCTUATION // « » ¿ ¡ - //#define TOUCH_UI_UTF8_CURRENCY // ¢ £ ¤ ¥ - //#define TOUCH_UI_UTF8_ORDINALS // º ª - //#define TOUCH_UI_UTF8_MATHEMATICS // ± × ÷ - //#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾ - //#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬ - #endif - #endif - - // Use a smaller font when labels don't fit buttons - #define TOUCH_UI_FIT_TEXT - - // Allow language selection from menu at run-time (otherwise use LCD_LANGUAGE) - //#define LCD_LANGUAGE_1 en - //#define LCD_LANGUAGE_2 fr - //#define LCD_LANGUAGE_3 de - //#define LCD_LANGUAGE_4 es - //#define LCD_LANGUAGE_5 it - - // Use a numeric passcode for "Screen lock" keypad. - // (recommended for smaller displays) - //#define TOUCH_UI_PASSCODE - - // Output extra debug info for Touch UI events - //#define TOUCH_UI_DEBUG - - // Developer menu (accessed by touching "About Printer" copyright text) - //#define TOUCH_UI_DEVELOPER_MENU -#endif - -// -// Classic UI Options -// -#if TFT_SCALED_DOGLCD - //#define TFT_MARLINUI_COLOR 0xFFFF // White - //#define TFT_MARLINBG_COLOR 0x0000 // Black - //#define TFT_DISABLED_COLOR 0x0003 // Almost black - //#define TFT_BTCANCEL_COLOR 0xF800 // Red - //#define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow - //#define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan -#endif - -// -// ADC Button Debounce -// -#if HAS_ADC_BUTTONS - #define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast -#endif +#endif // DOGLCD // @section safety -/** - * The watchdog hardware timer will do a reset and disable all outputs - * if the firmware gets too overloaded to read the temperature sensors. - * - * If you find that watchdog reboot causes your AVR board to hang forever, - * enable WATCHDOG_RESET_MANUAL to use a custom timer instead of WDTO. - * NOTE: This method is less reliable as it can only catch hangups while - * interrupts are enabled. - */ +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. #define USE_WATCHDOG + #if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. //#define WATCHDOG_RESET_MANUAL #endif @@ -1605,32 +755,14 @@ */ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) - //#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR - //#define BABYSTEP_WITHOUT_HOMING - //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement). - //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! - #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way - //#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps - #define BABYSTEP_MULTIPLICATOR_Z 1 // (steps or mm) Steps or millimeter distance for each Z babystep - #define BABYSTEP_MULTIPLICATOR_XY 1 // (steps or mm) Steps or millimeter distance for each XY babystep - - //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. - #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) - #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. - // Note: Extra time may be added to mitigate controller latency. - //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle. - #if ENABLED(MOVE_Z_WHEN_IDLE) - #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size. - #endif - #endif - - //#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28 - - //#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - //#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets - //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor - #endif + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor #endif // @section extruder @@ -1648,58 +780,18 @@ * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) * print acceleration will be reduced during the affected moves to keep within the limit. * - * See https://marlinfw.org/docs/features/lin_advance.html for full instructions. + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. */ //#define LIN_ADVANCE #if ENABLED(LIN_ADVANCE) - //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants - #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed - //#define LA_DEBUG // If enabled, this will generate debug information output over USB. - //#define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. #endif // @section leveling -/** - * Points to probe for all 3-point Leveling procedures. - * Override if the automatically selected points are inadequate. - */ -#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL) - //#define PROBE_PT_1_X 15 - //#define PROBE_PT_1_Y 180 - //#define PROBE_PT_2_X 15 - //#define PROBE_PT_2_Y 20 - //#define PROBE_PT_3_X 170 - //#define PROBE_PT_3_Y 20 -#endif - -/** - * Probing Margins - * - * Override PROBING_MARGIN for each side of the build plate - * Useful to get probe points to exact positions on targets or - * to allow leveling to avoid plate clamps on only specific - * sides of the bed. With NOZZLE_AS_PROBE negative values are - * allowed, to permit probing outside the bed. - * - * If you are replacing the prior *_PROBE_BED_POSITION options, - * LEFT and FRONT values in most cases will map directly over - * RIGHT and REAR would be the inverse such as - * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) - * - * This will allow all positions to match at compilation, however - * should the probe position be modified with M851XY then the - * probe points will follow. This prevents any change from causing - * the probe to be unable to reach any points. - */ -#if PROBE_SELECTED && !IS_KINEMATIC - //#define PROBING_MARGIN_LEFT PROBING_MARGIN - //#define PROBING_MARGIN_RIGHT PROBING_MARGIN - //#define PROBING_MARGIN_FRONT PROBING_MARGIN - //#define PROBING_MARGIN_BACK PROBING_MARGIN -#endif - -#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) // Override the mesh area if the automatic (max) area is too large //#define MESH_MIN_X MESH_INSET //#define MESH_MIN_Y MESH_INSET @@ -1722,118 +814,43 @@ #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" - -#endif - -/** - * Thermal Probe Compensation - * Probe measurements are adjusted to compensate for temperature distortion. - * Use G76 to calibrate this feature. Use M871 to set values manually. - * For a more detailed explanation of the process see G76_M871.cpp. - */ -#if HAS_BED_PROBE && TEMP_SENSOR_PROBE && TEMP_SENSOR_BED - // Enable thermal first layer compensation using bed and probe temperatures - #define PROBE_TEMP_COMPENSATION - - // Add additional compensation depending on hotend temperature - // Note: this values cannot be calibrated and have to be set manually - #if ENABLED(PROBE_TEMP_COMPENSATION) - // Park position to wait for probe cooldown - #define PTC_PARK_POS { 0, 0, 100 } - - // Probe position to probe and wait for probe to reach target temperature - #define PTC_PROBE_POS { 90, 100 } - - // Enable additional compensation using hotend temperature - // Note: this values cannot be calibrated automatically but have to be set manually - //#define USE_TEMP_EXT_COMPENSATION - - // Probe temperature calibration generates a table of values starting at PTC_SAMPLE_START - // (e.g. 30), in steps of PTC_SAMPLE_RES (e.g. 5) with PTC_SAMPLE_COUNT (e.g. 10) samples. - - //#define PTC_SAMPLE_START 30.0f - //#define PTC_SAMPLE_RES 5.0f - //#define PTC_SAMPLE_COUNT 10U - - // Bed temperature calibration builds a similar table. - - //#define BTC_SAMPLE_START 60.0f - //#define BTC_SAMPLE_RES 5.0f - //#define BTC_SAMPLE_COUNT 10U - - // The temperature the probe should be at while taking measurements during bed temperature - // calibration. - //#define BTC_PROBE_TEMP 30.0f - - // Height above Z=0.0f to raise the nozzle. Lowering this can help the probe to heat faster. - // Note: the Z=0.0f offset is determined by the probe offset which can be set using M851. - //#define PTC_PROBE_HEATING_OFFSET 0.5f - - // Height to raise the Z-probe between heating and taking the next measurement. Some probes - // may fail to untrigger if they have been triggered for a long time, which can be solved by - // increasing the height the probe is raised to. - //#define PTC_PROBE_RAISE 15U - - // If the probe is outside of the defined range, use linear extrapolation using the closest - // point and the PTC_LINEAR_EXTRAPOLATION'th next point. E.g. if set to 4 it will use data[0] - // and data[4] to perform linear extrapolation for values below PTC_SAMPLE_START. - //#define PTC_LINEAR_EXTRAPOLATION 4 - #endif + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" #endif // @section extras -// -// G60/G61 Position Save and Return -// -//#define SAVED_POSITIONS 1 // Each saved position slot costs 12 bytes - // // G2/G3 Arc Support // -#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes #if ENABLED(ARC_SUPPORT) - #define MM_PER_ARC_SEGMENT 1 // (mm) Length (or minimum length) of each arc segment - //#define ARC_SEGMENTS_PER_R 1 // Max segment length, MM_PER = Min - #define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle - //#define ARC_SEGMENTS_PER_SEC 50 // Use feedrate to choose segment length (with MM_PER_ARC_SEGMENT as the minimum) - #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections - //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles - //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes - //#define SF_ARC_FIX // Enable only if using SkeinForge with "Arc Point" fillet procedure + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes #endif // Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. //#define BEZIER_CURVE_SUPPORT -/** - * Direct Stepping - * - * Comparable to the method used by Klipper, G6 direct stepping significantly - * reduces motion calculations, increases top printing speeds, and results in - * less step aliasing by calculating all motions in advance. - * Preparing your G-code: https://github.com/colinrgodsey/step-daemon - */ -//#define DIRECT_STEPPING - -/** - * G38 Probe Target - * - * This option adds G38.2 and G38.3 (probe towards target) - * and optionally G38.4 and G38.5 (probe away from target). - * Set MULTIPLE_PROBING for G38 to probe more than once. - */ +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch //#define G38_PROBE_TARGET #if ENABLED(G38_PROBE_TARGET) - //#define G38_PROBE_AWAY // Include G38.4 and G38.5 to probe away from target - #define G38_MINIMUM_MOVE 0.0275 // (mm) Minimum distance that will produce a move. + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) #endif // Moves (or segments) with fewer steps than this will be joined with the next move #define MIN_STEPS_PER_SEGMENT 6 /** - * Minimum delay before and after setting the stepper DIR (in ns) + * Minimum delay after setting the stepper DIR (in ns) * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) * 20 : Minimum for TMC2xxx drivers * 200 : Minimum for A4988 drivers @@ -1845,14 +862,12 @@ * * Override the default value based on the driver type set in Configuration.h. */ -//#define MINIMUM_STEPPER_POST_DIR_DELAY 650 -//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650 +//#define MINIMUM_STEPPER_DIR_DELAY 650 /** * Minimum stepper driver pulse width (in µs) * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers - * 0 : Minimum 500ns for LV8729, adjusted in stepper.h - * 1 : Minimum for A4988 and A5984 stepper drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers * 2 : Minimum for DRV8825 stepper drivers * 3 : Minimum for TB6600 stepper drivers * 30 : Minimum for TB6560 stepper drivers @@ -1864,12 +879,12 @@ /** * Maximum stepping rate (in Hz) the stepper driver allows * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) - * 5000000 : Maximum for TMC2xxx stepper drivers - * 1000000 : Maximum for LV8729 stepper driver - * 500000 : Maximum for A4988 stepper driver - * 250000 : Maximum for DRV8825 stepper driver - * 150000 : Maximum for TB6600 stepper driver - * 15000 : Maximum for TB6560 stepper driver + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver * * Override the default value based on the driver type set in Configuration.h. */ @@ -1884,16 +899,14 @@ //================================= Buffers ================================= //=========================================================================== -// @section motion +// @section hidden -// The number of linear moves that can be in the planner at once. -// The value of BLOCK_BUFFER_SIZE must be a power of 2 (e.g. 8, 16, 32) -#if BOTH(SDSUPPORT, DIRECT_STEPPING) - #define BLOCK_BUFFER_SIZE 8 -#elif ENABLED(SDSUPPORT) - #define BLOCK_BUFFER_SIZE 16 +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller #else - #define BLOCK_BUFFER_SIZE 16 + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer #endif // @section serial @@ -1923,9 +936,6 @@ //#define SERIAL_XON_XOFF #endif -// Add M575 G-code to change the baud rate -//#define BAUD_RATE_GCODE - #if ENABLED(SDSUPPORT) // Enable this option to collect and display the maximum // RX queue usage after transferring a file to SD. @@ -1936,14 +946,10 @@ //#define SERIAL_STATS_DROPPED_RX #endif -/** - * Emergency Command Parser - * - * Add a low-level parser to intercept certain commands as they - * enter the serial receive buffer, so they cannot be blocked. - * Currently handles M108, M112, M410, M876 - * NOTE: Not yet implemented for all platforms. - */ +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! //#define EMERGENCY_PARSER // Bad Serial-connections can miss a received command by sending an 'ok' @@ -1955,24 +961,8 @@ // Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. //#define ADVANCED_OK -// Printrun may have trouble receiving long strings all at once. -// This option inserts short delays between lines of serial output. -#define SERIAL_OVERRUN_PROTECTION - -// For serial echo, the number of digits after the decimal point -//#define SERIAL_FLOAT_PRECISION 4 - // @section extras -/** - * Extra Fan Speed - * Adds a secondary fan speed for each print-cooling fan. - * 'M106 P T3-255' : Set a secondary speed for - * 'M106 P T2' : Use the set secondary speed - * 'M106 P T1' : Restore the previous fan speed - */ -//#define EXTRA_FAN_SPEED - /** * Firmware-based and LCD-controlled retract * @@ -1986,96 +976,30 @@ * Be sure to turn off auto-retract during filament change. * * Note that M207 / M208 / M209 settings are saved to EEPROM. + * */ -//#define FWRETRACT +//#define FWRETRACT // ONLY PARTIALLY TESTED #if ENABLED(FWRETRACT) - #define FWRETRACT_AUTORETRACT // Override slicer retractions - #if ENABLED(FWRETRACT_AUTORETRACT) - #define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length - #define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length - #endif - #define RETRACT_LENGTH 3 // (mm) Default retract length (positive value) - #define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value) - #define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting - #define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise - #define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover) - #define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange) - #define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction - #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction - #if ENABLED(MIXING_EXTRUDER) - //#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously - #endif + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) #endif /** - * Universal tool change settings. - * Applies to all types of extruders except where explicitly noted. + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed */ -#if HAS_MULTI_EXTRUDER - // Z raise distance for tool-change, as needed for some extruders - #define TOOLCHANGE_ZRAISE 2 // (mm) - //#define TOOLCHANGE_ZRAISE_BEFORE_RETRACT // Apply raise before swap retraction (if enabled) - //#define TOOLCHANGE_NO_RETURN // Never return to previous position on tool-change - #if ENABLED(TOOLCHANGE_NO_RETURN) - //#define EVENT_GCODE_AFTER_TOOLCHANGE "G12X" // Extra G-code to run after tool-change - #endif - - /** - * Retract and prime filament on tool-change to reduce - * ooze and stringing and to get cleaner transitions. - */ - //#define TOOLCHANGE_FILAMENT_SWAP - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - // Load / Unload - #define TOOLCHANGE_FS_LENGTH 12 // (mm) Load / Unload length - #define TOOLCHANGE_FS_EXTRA_RESUME_LENGTH 0 // (mm) Extra length for better restart, fine tune by LCD/Gcode) - #define TOOLCHANGE_FS_RETRACT_SPEED (50*60) // (mm/min) (Unloading) - #define TOOLCHANGE_FS_UNRETRACT_SPEED (25*60) // (mm/min) (On SINGLENOZZLE or Bowden loading must be slowed down) - - // Longer prime to clean out a SINGLENOZZLE - #define TOOLCHANGE_FS_EXTRA_PRIME 0 // (mm) Extra priming length - #define TOOLCHANGE_FS_PRIME_SPEED (4.6*60) // (mm/min) Extra priming feedrate - #define TOOLCHANGE_FS_WIPE_RETRACT 0 // (mm/min) Retract before cooling for less stringing, better wipe, etc. - - // Cool after prime to reduce stringing - #define TOOLCHANGE_FS_FAN -1 // Fan index or -1 to skip - #define TOOLCHANGE_FS_FAN_SPEED 255 // 0-255 - #define TOOLCHANGE_FS_FAN_TIME 10 // (seconds) - - // Swap uninitialized extruder with TOOLCHANGE_FS_PRIME_SPEED for all lengths (recover + prime) - // (May break filament if not retracted beforehand.) - //#define TOOLCHANGE_FS_INIT_BEFORE_SWAP - - // Prime on the first T0 (If other, TOOLCHANGE_FS_INIT_BEFORE_SWAP applied) - // Enable it (M217 V[0/1]) before printing, to avoid unwanted priming on host connect - //#define TOOLCHANGE_FS_PRIME_FIRST_USED - - /** - * Tool Change Migration - * This feature provides G-code and LCD options to switch tools mid-print. - * All applicable tool properties are migrated so the print can continue. - * Tools must be closely matching and other restrictions may apply. - * Useful to: - * - Change filament color without interruption - * - Switch spools automatically on filament runout - * - Switch to a different nozzle on an extruder jam - */ - #define TOOLCHANGE_MIGRATION_FEATURE - - #endif - - /** - * Position to park head during tool change. - * Doesn't apply to SWITCHING_TOOLHEAD, DUAL_X_CARRIAGE, or PARKING_EXTRUDER - */ - //#define TOOLCHANGE_PARK - #if ENABLED(TOOLCHANGE_PARK) - #define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 } - #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/min) - //#define TOOLCHANGE_PARK_X_ONLY // X axis only move - //#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move - #endif -#endif // HAS_MULTI_EXTRUDER +//#define EXTRA_FAN_SPEED /** * Advanced Pause @@ -2112,21 +1036,18 @@ // Set to 0 for manual extrusion. // Filament can be extruded repeatedly from the Filament Change menu // until extrusion is consistent, and to purge old filament. - #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. - //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. // Filament Unload does a Retract, Delay, and Purge first: - #define FILAMENT_UNLOAD_PURGE_RETRACT 13 // (mm) Unload initial retract length. - #define FILAMENT_UNLOAD_PURGE_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. - #define FILAMENT_UNLOAD_PURGE_FEEDRATE 25 // (mm/s) feedrate to purge before unload #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. - //#define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) @@ -2142,269 +1063,113 @@ */ #if HAS_DRIVER(TMC26X) - #if AXIS_DRIVER_TYPE_X(TMC26X) - #define X_MAX_CURRENT 1000 // (mA) - #define X_SENSE_RESISTOR 91 // (mOhms) - #define X_MICROSTEPS 16 // Number of microsteps - #endif + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps - #if AXIS_DRIVER_TYPE_X2(TMC26X) - #define X2_MAX_CURRENT 1000 - #define X2_SENSE_RESISTOR 91 - #define X2_MICROSTEPS 16 - #endif + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 - #if AXIS_DRIVER_TYPE_Y(TMC26X) - #define Y_MAX_CURRENT 1000 - #define Y_SENSE_RESISTOR 91 - #define Y_MICROSTEPS 16 - #endif + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 - #if AXIS_DRIVER_TYPE_Y2(TMC26X) - #define Y2_MAX_CURRENT 1000 - #define Y2_SENSE_RESISTOR 91 - #define Y2_MICROSTEPS 16 - #endif + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 - #if AXIS_DRIVER_TYPE_Z(TMC26X) - #define Z_MAX_CURRENT 1000 - #define Z_SENSE_RESISTOR 91 - #define Z_MICROSTEPS 16 - #endif + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 - #if AXIS_DRIVER_TYPE_Z2(TMC26X) - #define Z2_MAX_CURRENT 1000 - #define Z2_SENSE_RESISTOR 91 - #define Z2_MICROSTEPS 16 - #endif + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 - #if AXIS_DRIVER_TYPE_Z3(TMC26X) - #define Z3_MAX_CURRENT 1000 - #define Z3_SENSE_RESISTOR 91 - #define Z3_MICROSTEPS 16 - #endif + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 - #if AXIS_DRIVER_TYPE_Z4(TMC26X) - #define Z4_MAX_CURRENT 1000 - #define Z4_SENSE_RESISTOR 91 - #define Z4_MICROSTEPS 16 - #endif + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 - #if AXIS_DRIVER_TYPE_E0(TMC26X) - #define E0_MAX_CURRENT 1000 - #define E0_SENSE_RESISTOR 91 - #define E0_MICROSTEPS 16 - #endif + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 - #if AXIS_DRIVER_TYPE_E1(TMC26X) - #define E1_MAX_CURRENT 1000 - #define E1_SENSE_RESISTOR 91 - #define E1_MICROSTEPS 16 - #endif + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 - #if AXIS_DRIVER_TYPE_E2(TMC26X) - #define E2_MAX_CURRENT 1000 - #define E2_SENSE_RESISTOR 91 - #define E2_MICROSTEPS 16 - #endif - - #if AXIS_DRIVER_TYPE_E3(TMC26X) - #define E3_MAX_CURRENT 1000 - #define E3_SENSE_RESISTOR 91 - #define E3_MICROSTEPS 16 - #endif - - #if AXIS_DRIVER_TYPE_E4(TMC26X) - #define E4_MAX_CURRENT 1000 - #define E4_SENSE_RESISTOR 91 - #define E4_MICROSTEPS 16 - #endif - - #if AXIS_DRIVER_TYPE_E5(TMC26X) - #define E5_MAX_CURRENT 1000 - #define E5_SENSE_RESISTOR 91 - #define E5_MICROSTEPS 16 - #endif - - #if AXIS_DRIVER_TYPE_E6(TMC26X) - #define E6_MAX_CURRENT 1000 - #define E6_SENSE_RESISTOR 91 - #define E6_MICROSTEPS 16 - #endif - - #if AXIS_DRIVER_TYPE_E7(TMC26X) - #define E7_MAX_CURRENT 1000 - #define E7_SENSE_RESISTOR 91 - #define E7_MICROSTEPS 16 - #endif + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 #endif // TMC26X // @section tmc_smart /** - * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode - * connect your SPI pins to the hardware SPI interface on your board and define - * the required CS pins in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 - * pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). * You may also use software SPI if you wish to use general purpose IO pins. * - * To use TMC2208 stepper UART-configurable stepper drivers connect #_SERIAL_TX_PIN - * to the driver side PDN_UART pin with a 1K resistor. - * To use the reading capabilities, also connect #_SERIAL_RX_PIN to PDN_UART without - * a resistor. + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. * The drivers can also be used with hardware serial. * - * TMCStepper library is required to use TMC stepper drivers. - * https://github.com/teemuatlut/TMCStepper + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper */ -#if HAS_TRINAMIC_CONFIG +#if HAS_TRINAMIC + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 - #if AXIS_IS_TMC(X) - #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. - #define X_CURRENT_HOME X_CURRENT // (mA) RMS current for sensorless homing - #define X_MICROSTEPS 16 // 0..256 - #define X_RSENSE 0.11 - #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... - #endif + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 - #if AXIS_IS_TMC(X2) - #define X2_CURRENT 800 - #define X2_CURRENT_HOME X2_CURRENT - #define X2_MICROSTEPS 16 - #define X2_RSENSE 0.11 - #define X2_CHAIN_POS -1 - #endif + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 - #if AXIS_IS_TMC(Y) - #define Y_CURRENT 800 - #define Y_CURRENT_HOME Y_CURRENT - #define Y_MICROSTEPS 16 - #define Y_RSENSE 0.11 - #define Y_CHAIN_POS -1 - #endif + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 - #if AXIS_IS_TMC(Y2) - #define Y2_CURRENT 800 - #define Y2_CURRENT_HOME Y2_CURRENT - #define Y2_MICROSTEPS 16 - #define Y2_RSENSE 0.11 - #define Y2_CHAIN_POS -1 - #endif + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 - #if AXIS_IS_TMC(Z) - #define Z_CURRENT 800 - #define Z_CURRENT_HOME Z_CURRENT - #define Z_MICROSTEPS 16 - #define Z_RSENSE 0.11 - #define Z_CHAIN_POS -1 - #endif + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 - #if AXIS_IS_TMC(Z2) - #define Z2_CURRENT 800 - #define Z2_CURRENT_HOME Z2_CURRENT - #define Z2_MICROSTEPS 16 - #define Z2_RSENSE 0.11 - #define Z2_CHAIN_POS -1 - #endif + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 - #if AXIS_IS_TMC(Z3) - #define Z3_CURRENT 800 - #define Z3_CURRENT_HOME Z3_CURRENT - #define Z3_MICROSTEPS 16 - #define Z3_RSENSE 0.11 - #define Z3_CHAIN_POS -1 - #endif + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 - #if AXIS_IS_TMC(Z4) - #define Z4_CURRENT 800 - #define Z4_CURRENT_HOME Z4_CURRENT - #define Z4_MICROSTEPS 16 - #define Z4_RSENSE 0.11 - #define Z4_CHAIN_POS -1 - #endif + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 - #if AXIS_IS_TMC(E0) - #define E0_CURRENT 800 - #define E0_MICROSTEPS 16 - #define E0_RSENSE 0.11 - #define E0_CHAIN_POS -1 - #endif + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 - #if AXIS_IS_TMC(E1) - #define E1_CURRENT 800 - #define E1_MICROSTEPS 16 - #define E1_RSENSE 0.11 - #define E1_CHAIN_POS -1 - #endif + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 - #if AXIS_IS_TMC(E2) - #define E2_CURRENT 800 - #define E2_MICROSTEPS 16 - #define E2_RSENSE 0.11 - #define E2_CHAIN_POS -1 - #endif - - #if AXIS_IS_TMC(E3) - #define E3_CURRENT 800 - #define E3_MICROSTEPS 16 - #define E3_RSENSE 0.11 - #define E3_CHAIN_POS -1 - #endif - - #if AXIS_IS_TMC(E4) - #define E4_CURRENT 800 - #define E4_MICROSTEPS 16 - #define E4_RSENSE 0.11 - #define E4_CHAIN_POS -1 - #endif - - #if AXIS_IS_TMC(E5) - #define E5_CURRENT 800 - #define E5_MICROSTEPS 16 - #define E5_RSENSE 0.11 - #define E5_CHAIN_POS -1 - #endif - - #if AXIS_IS_TMC(E6) - #define E6_CURRENT 800 - #define E6_MICROSTEPS 16 - #define E6_RSENSE 0.11 - #define E6_CHAIN_POS -1 - #endif - - #if AXIS_IS_TMC(E7) - #define E7_CURRENT 800 - #define E7_MICROSTEPS 16 - #define E7_RSENSE 0.11 - #define E7_CHAIN_POS -1 - #endif + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 /** - * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here. - * The default pins can be found in your board's pins file. - */ - //#define X_CS_PIN -1 - //#define Y_CS_PIN -1 - //#define Z_CS_PIN -1 - //#define X2_CS_PIN -1 - //#define Y2_CS_PIN -1 - //#define Z2_CS_PIN -1 - //#define Z3_CS_PIN -1 - //#define E0_CS_PIN -1 - //#define E1_CS_PIN -1 - //#define E2_CS_PIN -1 - //#define E3_CS_PIN -1 - //#define E4_CS_PIN -1 - //#define E5_CS_PIN -1 - //#define E6_CS_PIN -1 - //#define E7_CS_PIN -1 - - /** - * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160). + * Use software SPI for TMC2130. * The default SW SPI pins are defined the respective pins files, * but you can override or define them here. */ @@ -2414,78 +1179,21 @@ //#define TMC_SW_SCK -1 /** - * Four TMC2209 drivers can use the same HW/SW serial port with hardware configured addresses. - * Set the address using jumpers on pins MS1 and MS2. - * Address | MS1 | MS2 - * 0 | LOW | LOW - * 1 | HIGH | LOW - * 2 | LOW | HIGH - * 3 | HIGH | HIGH - * - * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers - * on the same serial port, either here or in your board's pins file. - */ - #define X_SLAVE_ADDRESS 0 - #define Y_SLAVE_ADDRESS 0 - #define Z_SLAVE_ADDRESS 0 - #define X2_SLAVE_ADDRESS 0 - #define Y2_SLAVE_ADDRESS 0 - #define Z2_SLAVE_ADDRESS 0 - #define Z3_SLAVE_ADDRESS 0 - #define Z4_SLAVE_ADDRESS 0 - #define E0_SLAVE_ADDRESS 0 - #define E1_SLAVE_ADDRESS 0 - #define E2_SLAVE_ADDRESS 0 - #define E3_SLAVE_ADDRESS 0 - #define E4_SLAVE_ADDRESS 0 - #define E5_SLAVE_ADDRESS 0 - #define E6_SLAVE_ADDRESS 0 - #define E7_SLAVE_ADDRESS 0 - - /** - * Software enable - * - * Use for drivers that do not use a dedicated enable pin, but rather handle the same - * function through a communication line such as SPI or UART. - */ - //#define SOFTWARE_DRIVER_ENABLE - - /** - * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only * Use Trinamic's ultra quiet stepping mode. * When disabled, Marlin will use spreadCycle stepping mode. */ - #define STEALTHCHOP_XY - #define STEALTHCHOP_Z - #define STEALTHCHOP_E + #define STEALTHCHOP /** - * Optimize spreadCycle chopper parameters by using predefined parameter sets - * or with the help of an example included in the library. - * Provided parameter sets are - * CHOPPER_DEFAULT_12V - * CHOPPER_DEFAULT_19V - * CHOPPER_DEFAULT_24V - * CHOPPER_DEFAULT_36V - * CHOPPER_09STEP_24V // 0.9 degree steppers (24V) - * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Průša firmware for MK3 (24V) - * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 - * - * Define you own with - * { , , hysteresis_start[1..8] } - */ - #define CHOPPER_TIMING CHOPPER_DEFAULT_12V - - /** - * Monitor Trinamic drivers - * for error conditions like overtemperature and short to ground. - * To manage over-temp Marlin can decrease the driver current until the error condition clears. + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. * Other detected conditions can be used to stop the current print. - * Relevant G-codes: + * Relevant g-codes: * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. * M911 - Report stepper driver overtemperature pre-warn condition. * M912 - Clear stepper driver overtemperature pre-warn condition flag. - * M122 - Report driver parameters (Requires TMC_DEBUG) + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) */ //#define MONITOR_DRIVER_STATUS @@ -2496,10 +1204,9 @@ #endif /** - * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. * This mode allows for faster movements at the expense of higher noise levels. - * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD. + * STEALTHCHOP needs to be enabled. * M913 X/Y/Z/E to live tune the setting */ //#define HYBRID_THRESHOLD @@ -2510,298 +1217,125 @@ #define Y2_HYBRID_THRESHOLD 100 #define Z_HYBRID_THRESHOLD 3 #define Z2_HYBRID_THRESHOLD 3 - #define Z3_HYBRID_THRESHOLD 3 - #define Z4_HYBRID_THRESHOLD 3 #define E0_HYBRID_THRESHOLD 30 #define E1_HYBRID_THRESHOLD 30 #define E2_HYBRID_THRESHOLD 30 #define E3_HYBRID_THRESHOLD 30 #define E4_HYBRID_THRESHOLD 30 - #define E5_HYBRID_THRESHOLD 30 - #define E6_HYBRID_THRESHOLD 30 - #define E7_HYBRID_THRESHOLD 30 /** - * Use StallGuard to home / probe X, Y, Z. - * - * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only - * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. * X, Y, and Z homing will always be done in spreadCycle mode. * - * X/Y/Z_STALL_SENSITIVITY is the default stall threshold. - * Use M914 X Y Z to set the stall threshold at runtime: - * - * Sensitivity TMC2209 Others - * HIGHEST 255 -64 (Too sensitive => False positive) - * LOWEST 0 63 (Too insensitive => No trigger) - * - * It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }. - * - * SPI_ENDSTOPS *** Beta feature! *** TMC2130 Only *** - * Poll the driver through SPI to determine load when homing. - * Removes the need for a wire from DIAG1 to an endstop pin. - * - * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when - * homing and adds a guard period for endstop triggering. - * - * Comment *_STALL_SENSITIVITY to disable sensorless homing for that axis. + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting */ - //#define SENSORLESS_HOMING // StallGuard capable drivers only + //#define SENSORLESS_HOMING // TMC2130 only - #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) - // TMC2209: 0...255. TMC2130: -64...63 - #define X_STALL_SENSITIVITY 8 - #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY - #define Y_STALL_SENSITIVITY 8 - #define Y2_STALL_SENSITIVITY Y_STALL_SENSITIVITY - //#define Z_STALL_SENSITIVITY 8 - //#define Z2_STALL_SENSITIVITY Z_STALL_SENSITIVITY - //#define Z3_STALL_SENSITIVITY Z_STALL_SENSITIVITY - //#define Z4_STALL_SENSITIVITY Z_STALL_SENSITIVITY - //#define SPI_ENDSTOPS // TMC2130 only - //#define IMPROVE_HOMING_RELIABILITY + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 #endif - /** - * TMC Homing stepper phase. - * - * Improve homing repeatability by homing to stepper coil's nearest absolute - * phase position. Trinamic drivers use a stepper phase table with 1024 values - * spanning 4 full steps with 256 positions each (ergo, 1024 positions). - * Full step positions (128, 384, 640, 896) have the highest holding torque. - * - * Values from 0..1023, -1 to disable homing phase for that axis. - */ - //#define TMC_HOME_PHASE { 896, 896, 896 } - - /** - * Beta feature! - * Create a 50/50 square wave step pulse optimal for stepper drivers. - */ - //#define SQUARE_WAVE_STEPPING - /** * Enable M122 debugging command for TMC stepper drivers. * M122 S0/1 will enable continous reporting. */ //#define TMC_DEBUG + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + /** * You can set your own advanced settings by filling in predefined functions. * A list of available functions can be found on the library github page - * https://github.com/teemuatlut/TMCStepper + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper * * Example: * #define TMC_ADV() { \ - * stepperX.diag0_otpw(1); \ - * stepperY.intpol(0); \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ * } */ #define TMC_ADV() { } -#endif // HAS_TRINAMIC_CONFIG +#endif // TMC2130 || TMC2208 -// @section L64XX +// @section L6470 /** - * L64XX Stepper Driver options + * L6470 Stepper Driver options * - * Arduino-L6470 library (0.8.0 or higher) is required. + * The Arduino-L6470 library is required for this stepper driver. * https://github.com/ameyer/Arduino-L6470 - * - * Requires the following to be defined in your pins_YOUR_BOARD file - * L6470_CHAIN_SCK_PIN - * L6470_CHAIN_MISO_PIN - * L6470_CHAIN_MOSI_PIN - * L6470_CHAIN_SS_PIN - * ENABLE_RESET_L64XX_CHIPS(Q) where Q is 1 to enable and 0 to reset */ +#if HAS_DRIVER(L6470) -#if HAS_L64XX + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall - //#define L6470_CHITCHAT // Display additional status info + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 - #if AXIS_IS_L64XX(X) - #define X_MICROSTEPS 128 // Number of microsteps (VALID: 1, 2, 4, 8, 16, 32, 128) - L6474 max is 16 - #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current - // L6470 & L6474 - VALID: 375 x (1 - 16) - 6A max - rounds down - // POWERSTEP01: VALID: 1000 x (1 - 32) - 32A max - rounds down - #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) - // L6470 & L6474 - VALID: 31.25 * (1-128) - 4A max - rounds down - // POWERSTEP01: VALID: 200 x (1 - 32) - 6.4A max - rounds down - // L6474 - STALLCURRENT setting is used to set the nominal (TVAL) current - #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - not used by L6474 - #define X_CHAIN_POS -1 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI - #define X_SLEW_RATE 1 // 0-3, Slew 0 is slowest, 3 is fastest - #endif + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 - #if AXIS_IS_L64XX(X2) - #define X2_MICROSTEPS 128 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 - #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS -1 - #define X2_SLEW_RATE 1 - #endif + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 - #if AXIS_IS_L64XX(Y) - #define Y_MICROSTEPS 128 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 - #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS -1 - #define Y_SLEW_RATE 1 - #endif + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 - #if AXIS_IS_L64XX(Y2) - #define Y2_MICROSTEPS 128 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 - #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS -1 - #define Y2_SLEW_RATE 1 - #endif + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 - #if AXIS_IS_L64XX(Z) - #define Z_MICROSTEPS 128 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 - #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS -1 - #define Z_SLEW_RATE 1 - #endif + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 - #if AXIS_IS_L64XX(Z2) - #define Z2_MICROSTEPS 128 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 - #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS -1 - #define Z2_SLEW_RATE 1 - #endif + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 - #if AXIS_IS_L64XX(Z3) - #define Z3_MICROSTEPS 128 - #define Z3_OVERCURRENT 2000 - #define Z3_STALLCURRENT 1500 - #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS -1 - #define Z3_SLEW_RATE 1 - #endif + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 - #if AXIS_IS_L64XX(Z4) - #define Z4_MICROSTEPS 128 - #define Z4_OVERCURRENT 2000 - #define Z4_STALLCURRENT 1500 - #define Z4_MAX_VOLTAGE 127 - #define Z4_CHAIN_POS -1 - #define Z4_SLEW_RATE 1 - #endif + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 - #if AXIS_IS_L64XX(E0) - #define E0_MICROSTEPS 128 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 - #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS -1 - #define E0_SLEW_RATE 1 - #endif + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 - #if AXIS_IS_L64XX(E1) - #define E1_MICROSTEPS 128 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 - #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS -1 - #define E1_SLEW_RATE 1 - #endif - - #if AXIS_IS_L64XX(E2) - #define E2_MICROSTEPS 128 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 - #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS -1 - #define E2_SLEW_RATE 1 - #endif - - #if AXIS_IS_L64XX(E3) - #define E3_MICROSTEPS 128 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 - #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS -1 - #define E3_SLEW_RATE 1 - #endif - - #if AXIS_IS_L64XX(E4) - #define E4_MICROSTEPS 128 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 - #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS -1 - #define E4_SLEW_RATE 1 - #endif - - #if AXIS_IS_L64XX(E5) - #define E5_MICROSTEPS 128 - #define E5_OVERCURRENT 2000 - #define E5_STALLCURRENT 1500 - #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS -1 - #define E5_SLEW_RATE 1 - #endif - - #if AXIS_IS_L64XX(E6) - #define E6_MICROSTEPS 128 - #define E6_OVERCURRENT 2000 - #define E6_STALLCURRENT 1500 - #define E6_MAX_VOLTAGE 127 - #define E6_CHAIN_POS -1 - #define E6_SLEW_RATE 1 - #endif - - #if AXIS_IS_L64XX(E7) - #define E7_MICROSTEPS 128 - #define E7_OVERCURRENT 2000 - #define E7_STALLCURRENT 1500 - #define E7_MAX_VOLTAGE 127 - #define E7_CHAIN_POS -1 - #define E7_SLEW_RATE 1 - #endif - - /** - * Monitor L6470 drivers for error conditions like over temperature and over current. - * In the case of over temperature Marlin can decrease the drive until the error condition clears. - * Other detected conditions can be used to stop the current print. - * Relevant G-codes: - * M906 - I1/2/3/4/5 Set or get motor drive level using axis codes X, Y, Z, E. Report values if no axis codes given. - * I not present or I0 or I1 - X, Y, Z or E0 - * I2 - X2, Y2, Z2 or E1 - * I3 - Z3 or E3 - * I4 - Z4 or E4 - * I5 - E5 - * M916 - Increase drive level until get thermal warning - * M917 - Find minimum current thresholds - * M918 - Increase speed until max or error - * M122 S0/1 - Report driver parameters - */ - //#define MONITOR_L6470_DRIVER_STATUS - - #if ENABLED(MONITOR_L6470_DRIVER_STATUS) - #define KVAL_HOLD_STEP_DOWN 1 - //#define L6470_STOP_ON_ERROR - #endif - -#endif // HAS_L64XX - -// @section i2cbus - -// -// I2C Master ID for LPC176x LCD and Digital Current control -// Does not apply to other peripherals based on the Wire library. -// -//#define I2C_MASTER_ID 1 // Set a value from 0 to 2 +#endif // L6470 /** * TWI/I2C BUS @@ -2831,54 +1365,13 @@ * echo:i2c-reply: from:99 bytes:5 data:hello */ +// @section i2cbus + //#define EXPERIMENTAL_I2CBUS -#if ENABLED(EXPERIMENTAL_I2CBUS) - #define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave -#endif +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave // @section extras -/** - * Photo G-code - * Add the M240 G-code to take a photo. - * The photo can be triggered by a digital pin or a physical movement. - */ -//#define PHOTO_GCODE -#if ENABLED(PHOTO_GCODE) - // A position to move to (and raise Z) before taking the photo - //#define PHOTO_POSITION { X_MAX_POS - 5, Y_MAX_POS, 0 } // { xpos, ypos, zraise } (M240 X Y Z) - //#define PHOTO_DELAY_MS 100 // (ms) Duration to pause before moving back (M240 P) - //#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S) - - // Canon RC-1 or homebrew digital camera trigger - // Data from: https://www.doc-diy.net/photo/rc-1_hacked/ - //#define PHOTOGRAPH_PIN 23 - - // Canon Hack Development Kit - // https://captain-slow.dk/2014/03/09/3d-printing-timelapses/ - //#define CHDK_PIN 4 - - // Optional second move with delay to trigger the camera shutter - //#define PHOTO_SWITCH_POSITION { X_MAX_POS, Y_MAX_POS } // { xpos, ypos } (M240 I J) - - // Duration to hold the switch or keep CHDK_PIN high - //#define PHOTO_SWITCH_MS 50 // (ms) (M240 D) - - /** - * PHOTO_PULSES_US may need adjustment depending on board and camera model. - * Pin must be running at 48.4kHz. - * Be sure to use a PHOTOGRAPH_PIN which can rise and fall quick enough. - * (e.g., MKS SBase temp sensor pin was too slow, so used P1.23 on J8.) - * - * Example pulse data for Nikon: https://bit.ly/2FKD0Aq - * IR Wiring: https://git.io/JvJf7 - */ - //#define PHOTO_PULSES_US { 2000, 27850, 400, 1580, 400, 3580, 400 } // (µs) Durations for each 48.4kHz oscillation - #ifdef PHOTO_PULSES_US - #define PHOTO_PULSE_DELAY_US 13 // (µs) Approximate duration of each HIGH and LOW pulse in the oscillation - #endif -#endif - /** * Spindle & Laser control * @@ -2892,154 +1385,38 @@ * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V * hardware PWM pin for the speed control and a pin for the rotation direction. * - * See https://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. */ -//#define SPINDLE_FEATURE -//#define LASER_FEATURE -#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) - #define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if the on/off function is active HIGH - #define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power - #define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) - #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC) + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction /** - * Speed / Power can be set ('M3 S') and displayed in terms of: - * - PWM255 (S0 - S255) - * - PERCENT (S0 - S100) - * - RPM (S0 - S50000) Best for use with a spindle + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) */ - #define CUTTER_POWER_UNIT PWM255 - /** - * Relative Cutter Power - * Normally, 'M3 O' sets - * OCR power is relative to the range SPEED_POWER_MIN...SPEED_POWER_MAX. - * so input powers of 0...255 correspond to SPEED_POWER_MIN...SPEED_POWER_MAX - * instead of normal range (0 to SPEED_POWER_MAX). - * Best used with (e.g.) SuperPID router controller: S0 = 5,000 RPM and S255 = 30,000 RPM - */ - //#define CUTTER_POWER_RELATIVE // Set speed proportional to [SPEED_POWER_MIN...SPEED_POWER_MAX] + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM - #if ENABLED(SPINDLE_FEATURE) - //#define SPINDLE_CHANGE_DIR // Enable if your spindle controller can change spindle direction - #define SPINDLE_CHANGE_DIR_STOP // Enable if the spindle should stop before changing spin direction - #define SPINDLE_INVERT_DIR false // Set to "true" if the spin direction is reversed - - #define SPINDLE_LASER_POWERUP_DELAY 5000 // (ms) Delay to allow the spindle/laser to come up to speed/power - #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // (ms) Delay to allow the spindle to stop - - /** - * M3/M4 Power Equation - * - * Each tool uses different value ranges for speed / power control. - * These parameters are used to convert between tool power units and PWM. - * - * Speed/Power = (PWMDC / 255 * 100 - SPEED_POWER_INTERCEPT) / SPEED_POWER_SLOPE - * PWMDC = (spdpwr - SPEED_POWER_MIN) / (SPEED_POWER_MAX - SPEED_POWER_MIN) / SPEED_POWER_SLOPE - */ - #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage - #define SPEED_POWER_MIN 5000 // (RPM) - #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM - #define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments) - - #else - - #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage - #define SPEED_POWER_MIN 0 // (%) 0-100 - #define SPEED_POWER_MAX 100 // (%) 0-100 - #define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments) - - /** - * Enable inline laser power to be handled in the planner / stepper routines. - * Inline power is specified by the I (inline) flag in an M3 command (e.g., M3 S20 I) - * or by the 'S' parameter in G0/G1/G2/G3 moves (see LASER_MOVE_POWER). - * - * This allows the laser to keep in perfect sync with the planner and removes - * the powerup/down delay since lasers require negligible time. - */ - #define LASER_POWER_INLINE - - #if ENABLED(LASER_POWER_INLINE) - /** - * Scale the laser's power in proportion to the movement rate. - * - * - Sets the entry power proportional to the entry speed over the nominal speed. - * - Ramps the power up every N steps to approximate the speed trapezoid. - * - Due to the limited power resolution this is only approximate. - */ - #define LASER_POWER_INLINE_TRAPEZOID - - /** - * Continuously calculate the current power (nominal_power * current_rate / nominal_rate). - * Required for accurate power with non-trapezoidal acceleration (e.g., S_CURVE_ACCELERATION). - * This is a costly calculation so this option is discouraged on 8-bit AVR boards. - * - * LASER_POWER_INLINE_TRAPEZOID_CONT_PER defines how many step cycles there are between power updates. If your - * board isn't able to generate steps fast enough (and you are using LASER_POWER_INLINE_TRAPEZOID_CONT), increase this. - * Note that when this is zero it means it occurs every cycle; 1 means a delay wait one cycle then run, etc. - */ - //#define LASER_POWER_INLINE_TRAPEZOID_CONT - - /** - * Stepper iterations between power updates. Increase this value if the board - * can't keep up with the processing demands of LASER_POWER_INLINE_TRAPEZOID_CONT. - * Disable (or set to 0) to recalculate power on every stepper iteration. - */ - //#define LASER_POWER_INLINE_TRAPEZOID_CONT_PER 10 - - /** - * Include laser power in G0/G1/G2/G3/G5 commands with the 'S' parameter - */ - //#define LASER_MOVE_POWER - - #if ENABLED(LASER_MOVE_POWER) - // Turn off the laser on G0 moves with no power parameter. - // If a power parameter is provided, use that instead. - //#define LASER_MOVE_G0_OFF - - // Turn off the laser on G28 homing. - //#define LASER_MOVE_G28_OFF - #endif - - /** - * Inline flag inverted - * - * WARNING: M5 will NOT turn off the laser unless another move - * is done (so G-code files must end with 'M5 I'). - */ - //#define LASER_POWER_INLINE_INVERT - - /** - * Continuously apply inline power. ('M3 S3' == 'G1 S3' == 'M3 S3 I') - * - * The laser might do some weird things, so only enable this - * feature if you understand the implications. - */ - //#define LASER_POWER_INLINE_CONTINUOUS - - #else - - #define SPINDLE_LASER_POWERUP_DELAY 50 // (ms) Delay to allow the spindle/laser to come up to speed/power - #define SPINDLE_LASER_POWERDOWN_DELAY 50 // (ms) Delay to allow the spindle to stop - - #endif - #endif -#endif - -/** - * Coolant Control - * - * Add the M7, M8, and M9 commands to turn mist or flood coolant on and off. - * - * Note: COOLANT_MIST_PIN and/or COOLANT_FLOOD_PIN must also be defined. - */ -//#define COOLANT_CONTROL -#if ENABLED(COOLANT_CONTROL) - #define COOLANT_MIST // Enable if mist coolant is present - #define COOLANT_FLOOD // Enable if flood coolant is present - #define COOLANT_MIST_INVERT false // Set "true" if the on/off function is reversed - #define COOLANT_FLOOD_INVERT false // Set "true" if the on/off function is reversed + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% #endif /** @@ -3075,24 +1452,6 @@ //#define FILAMENT_LCD_DISPLAY #endif -/** - * Power Monitor - * Monitor voltage (V) and/or current (A), and -when possible- power (W) - * - * Read and configure with M430 - * - * The current sensor feeds DC voltage (relative to the measured current) to an analog pin - * The voltage sensor feeds DC voltage (relative to the measured voltage) to an analog pin - */ -//#define POWER_MONITOR_CURRENT // Monitor the system current -//#define POWER_MONITOR_VOLTAGE // Monitor the system voltage -#if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) - #define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF! - #define POWER_MONITOR_CURRENT_OFFSET -1 // Offset value for current sensors with linear function output - #define POWER_MONITOR_VOLTS_PER_VOLT 0.11786 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF! - #define POWER_MONITOR_FIXED_VOLTAGE 13.6 // Voltage for a current sensor with no voltage sensor (for power display) -#endif - /** * CNC Coordinate Systems * @@ -3101,6 +1460,11 @@ */ //#define CNC_COORDINATE_SYSTEMS +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + /** * Auto-report temperatures with M155 S */ @@ -3110,16 +1474,6 @@ * Include capabilities in M115 output */ #define EXTENDED_CAPABILITIES_REPORT -#if ENABLED(EXTENDED_CAPABILITIES_REPORT) - //#define M115_GEOMETRY_REPORT -#endif - -/** - * Expected Printer Check - * Add the M16 G-code to compare a string to the MACHINE_NAME. - * M16 with a non-matching string causes the printer to halt. - */ -//#define EXPECTED_PRINTER_CHECK /** * Disable all Volumetric extrusion options @@ -3132,21 +1486,9 @@ * Activate to make volumetric extrusion the default method, * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. * - * M200 D0 to disable, M200 Dn to set a new diameter (and enable volumetric). - * M200 S0/S1 to disable/enable volumetric extrusion. + * M200 D0 to disable, M200 Dn to set a new diameter. */ //#define VOLUMETRIC_DEFAULT_ON - - //#define VOLUMETRIC_EXTRUDER_LIMIT - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - /** - * Default volumetric extrusion limit in cubic mm per second (mm^3/sec). - * This factory setting applies to all extruders. - * Use 'M200 [T] L' to override and 'M502' to reset. - * A non-zero value activates Volume-based Extrusion Limiting. - */ - #define DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT 0.00 // (mm^3/sec) - #endif #endif /** @@ -3158,13 +1500,6 @@ */ //#define NO_WORKSPACE_OFFSETS -// Extra options for the M114 "Current Position" report -//#define M114_DETAIL // Use 'M114` for details to check planner calculations -//#define M114_REALTIME // Real current position based on forward kinematics -//#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed. - -//#define REPORT_FAN_CHANGE // Report the new fan speed when changed by M106 (and others) - /** * Set the number of proportional font spaces required to fill up a typical character space. * This can help to better align the output of commands like `G29 O` Mesh Output. @@ -3179,54 +1514,11 @@ */ #define FASTER_GCODE_PARSER -#if ENABLED(FASTER_GCODE_PARSER) - //#define GCODE_QUOTED_STRINGS // Support for quoted string parameters -#endif - -//#define GCODE_CASE_INSENSITIVE // Accept G-code sent to the firmware in lowercase - -//#define REPETIER_GCODE_M360 // Add commands originally from Repetier FW - -/** - * CNC G-code options - * Support CNC-style G-code dialects used by laser cutters, drawing machine cams, etc. - * Note that G0 feedrates should be used with care for 3D printing (if used at all). - * High feedrates may cause ringing and harm print quality. - */ -//#define PAREN_COMMENTS // Support for parentheses-delimited comments -//#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc. - -// Enable and set a (default) feedrate for all G0 moves -//#define G0_FEEDRATE 3000 // (mm/min) -#ifdef G0_FEEDRATE - //#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode -#endif - -/** - * Startup commands - * - * Execute certain G-code commands immediately after power-on. - */ -//#define STARTUP_COMMANDS "M17 Z" - -/** - * G-code Macros - * - * Add G-codes M810-M819 to define and run G-code macros. - * Macros are not saved to EEPROM. - */ -//#define GCODE_MACROS -#if ENABLED(GCODE_MACROS) - #define GCODE_MACROS_SLOTS 5 // Up to 10 may be used - #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro -#endif - /** * User-defined menu items that execute custom GCode */ //#define CUSTOM_USER_MENUS #if ENABLED(CUSTOM_USER_MENUS) - //#define CUSTOM_USER_MENU_TITLE "Custom Commands" #define USER_SCRIPT_DONE "M117 User Script Done" #define USER_SCRIPT_AUDIBLE_FEEDBACK //#define USER_SCRIPT_RETURN // Return to status screen after a script @@ -3234,10 +1526,10 @@ #define USER_DESC_1 "Home & UBL Info" #define USER_GCODE_1 "G28\nG29 W" - #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL + #define USER_DESC_2 "Preheat for PLA" #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) - #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL + #define USER_DESC_3 "Preheat for ABS" #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) #define USER_DESC_4 "Heat Bed/Home/Level" @@ -3248,43 +1540,35 @@ #endif /** - * Host Action Commands - * - * Define host streamer action commands in compliance with the standard. - * - * See https://reprap.org/wiki/G-code#Action_commands - * Common commands ........ poweroff, pause, paused, resume, resumed, cancel - * G29_RETRY_AND_RECOVER .. probe_rewipe, probe_failed - * - * Some features add reason codes to extend these commands. - * - * Host Prompt Support enables Marlin to use the host for user prompts so - * filament runout and other processes can be managed from the host side. + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. */ -//#define HOST_ACTION_COMMANDS -#if ENABLED(HOST_ACTION_COMMANDS) - //#define HOST_PROMPT_SUPPORT - //#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start -#endif +//#define ACTION_ON_KILL "poweroff" /** - * Cancel Objects - * - * Implement M486 to allow Marlin to skip objects + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. */ -//#define CANCEL_OBJECTS +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== /** - * I2C position encoders for closed loop control. - * Developed by Chris Barr at Aus3D. + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. * - * Wiki: https://wiki.aus3d.com.au/Magnetic_Encoder - * Github: https://github.com/Aus3D/MagneticEncoder + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder * - * Supplier: https://aus3d.com.au/magnetic-encoder-module - * Alternative Supplier: https://reliabuild3d.com/ + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ * - * Reliabuild encoders have been modified to improve reliability. + * Reilabuild encoders have been modified to improve reliability. */ //#define I2C_POSITION_ENCODERS @@ -3336,7 +1620,7 @@ //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given // axis after which the printer will abort. Comment out to - // disable abort behavior. + // disable abort behaviour. #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault // for this amount of time (in ms) before the encoder @@ -3354,46 +1638,6 @@ #endif // I2C_POSITION_ENCODERS -/** - * Analog Joystick(s) - */ -//#define JOYSTICK -#if ENABLED(JOYSTICK) - #define JOY_X_PIN 5 // RAMPS: Suggested pin A5 on AUX2 - #define JOY_Y_PIN 10 // RAMPS: Suggested pin A10 on AUX2 - #define JOY_Z_PIN 12 // RAMPS: Suggested pin A12 on AUX2 - #define JOY_EN_PIN 44 // RAMPS: Suggested pin D44 on AUX2 - - //#define INVERT_JOY_X // Enable if X direction is reversed - //#define INVERT_JOY_Y // Enable if Y direction is reversed - //#define INVERT_JOY_Z // Enable if Z direction is reversed - - // Use M119 with JOYSTICK_DEBUG to find reasonable values after connecting: - #define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max - #define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 } - #define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 } - //#define JOYSTICK_DEBUG -#endif - -/** - * Mechanical Gantry Calibration - * Modern replacement for the Prusa TMC_Z_CALIBRATION. - * Adds capability to work with any adjustable current drivers. - * Implemented as G34 because M915 is deprecated. - */ -//#define MECHANICAL_GANTRY_CALIBRATION -#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) - #define GANTRY_CALIBRATION_CURRENT 600 // Default calibration current in ma - #define GANTRY_CALIBRATION_EXTRA_HEIGHT 15 // Extra distance in mm past Z_###_POS to move - #define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move - //#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction - - //#define GANTRY_CALIBRATION_SAFE_POSITION { X_CENTER, Y_CENTER } // Safe position for nozzle - //#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM - //#define GANTRY_CALIBRATION_COMMANDS_PRE "" - #define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position -#endif - /** * MAX7219 Debug Matrix * @@ -3407,12 +1651,10 @@ #define MAX7219_LOAD_PIN 44 //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix - #define MAX7219_INIT_TEST 2 // Test pattern at startup: 0=none, 1=sweep, 2=spiral + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) // connector at: right=0 bottom=-90 top=90 left=180 - //#define MAX7219_REVERSE_ORDER // The individual LED matrix units may be in reversed order - //#define MAX7219_SIDE_BY_SIDE // Big chip+matrix boards can be chained side-by-side /** * Sample debug features @@ -3437,153 +1679,19 @@ //#define NANODLP_Z_SYNC #if ENABLED(NANODLP_Z_SYNC) //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. - // Default behavior is limited to Z axis only. + // Default behaviour is limited to Z axis only. #endif /** * WiFi Support (Espressif ESP32 WiFi) */ -//#define WIFISUPPORT // Marlin embedded WiFi managenent -//#define ESP3D_WIFISUPPORT // ESP3D Library WiFi management (https://github.com/luc-github/ESP3DLib) - -#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) - //#define WEBSUPPORT // Start a webserver (which may include auto-discovery) - //#define OTASUPPORT // Support over-the-air firmware updates - //#define WIFI_CUSTOM_COMMAND // Accept feature config commands (e.g., WiFi ESP3D) from the host - - /** - * To set a default WiFi SSID / Password, create a file called Configuration_Secure.h with - * the following defines, customized for your network. This specific file is excluded via - * .gitignore to prevent it from accidentally leaking to the public. - * - * #define WIFI_SSID "WiFi SSID" - * #define WIFI_PWD "WiFi Password" - */ - //#include "Configuration_Secure.h" // External file with WiFi SSID / Password +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" #endif -/** - * Průša Multi-Material Unit v2 - * Enable in Configuration.h - */ -#if ENABLED(PRUSA_MMU2) - - // Serial port used for communication with MMU2. - // For AVR enable the UART port used for the MMU. (e.g., mmuSerial) - // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2) - #define MMU2_SERIAL_PORT 2 - #define MMU2_SERIAL mmuSerial - - // Use hardware reset for MMU if a pin is defined for it - //#define MMU2_RST_PIN 23 - - // Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up) - //#define MMU2_MODE_12V - - // G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout - #define MMU2_FILAMENT_RUNOUT_SCRIPT "M600" - - // Add an LCD menu for MMU2 - //#define MMU2_MENUS - #if ENABLED(MMU2_MENUS) - // Settings for filament load / unload from the LCD menu. - // This is for Průša MK3-style extruders. Customize for your hardware. - #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 - #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ - { 7.2, 1145 }, \ - { 14.4, 871 }, \ - { 36.0, 1393 }, \ - { 14.4, 871 }, \ - { 50.0, 198 } - - #define MMU2_RAMMING_SEQUENCE \ - { 1.0, 1000 }, \ - { 1.0, 1500 }, \ - { 2.0, 2000 }, \ - { 1.5, 3000 }, \ - { 2.5, 4000 }, \ - { -15.0, 5000 }, \ - { -14.0, 1200 }, \ - { -6.0, 600 }, \ - { 10.0, 700 }, \ - { -10.0, 400 }, \ - { -50.0, 2000 } - #endif - - /** - * MMU Extruder Sensor - * - * Support for a Průša (or other) IR Sensor to detect filament near the extruder - * and make loading more reliable. Suitable for an extruder equipped with a filament - * sensor less than 38mm from the gears. - * - * During loading the extruder will stop when the sensor is triggered, then do a last - * move up to the gears. If no filament is detected, the MMU2 can make some more attempts. - * If all attempts fail, a filament runout will be triggered. - */ - //#define MMU_EXTRUDER_SENSOR - #if ENABLED(MMU_EXTRUDER_SENSOR) - #define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail - #endif - - /** - * Using a sensor like the MMU2S - * This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S. - * See https://help.prusa3d.com/en/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560, step 11 - */ - //#define PRUSA_MMU2_S_MODE - #if ENABLED(PRUSA_MMU2_S_MODE) - #define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries) - - #define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min) - #define MMU2_CAN_LOAD_SEQUENCE \ - { 0.1, MMU2_CAN_LOAD_FEEDRATE }, \ - { 60.0, MMU2_CAN_LOAD_FEEDRATE }, \ - { -52.0, MMU2_CAN_LOAD_FEEDRATE } - - #define MMU2_CAN_LOAD_RETRACT 6.0 // (mm) Keep under the distance between Load Sequence values - #define MMU2_CAN_LOAD_DEVIATION 0.8 // (mm) Acceptable deviation - - #define MMU2_CAN_LOAD_INCREMENT 0.2 // (mm) To reuse within MMU2 module - #define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \ - { -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE } - - #endif - - //#define MMU2_DEBUG // Write debug info to serial output - -#endif // PRUSA_MMU2 - -/** - * Advanced Print Counter settings - */ -#if ENABLED(PRINTCOUNTER) - #define SERVICE_WARNING_BUZZES 3 - // Activate up to 3 service interval watchdogs - //#define SERVICE_NAME_1 "Service S" - //#define SERVICE_INTERVAL_1 100 // print hours - //#define SERVICE_NAME_2 "Service L" - //#define SERVICE_INTERVAL_2 200 // print hours - //#define SERVICE_NAME_3 "Service 3" - //#define SERVICE_INTERVAL_3 1 // print hours -#endif - -// @section develop - -// -// M100 Free Memory Watcher to debug memory usage -// -//#define M100_FREE_MEMORY_WATCHER - -// -// M42 - Set pin states -// -//#define DIRECT_PIN_CONTROL - -// -// M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe -// -//#define PINS_DEBUGGING - // Enable Marlin dev mode which adds some special commands //#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/Makefile b/Marlin/Makefile index 49cb960b92..da3897e807 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -14,7 +14,7 @@ # Detailed instructions for using the makefile: # # 1. Modify the line containing "ARDUINO_INSTALL_DIR" to point to the directory that -# contains the Arduino installation (for example, under macOS, this +# contains the Arduino installation (for example, under Mac OS X, this # might be /Applications/Arduino.app/Contents/Resources/Java). # # 2. Modify the line containing "UPLOAD_PORT" to refer to the filename @@ -22,10 +22,8 @@ # (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file # changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*). # -# 3. Set the line containing "MCU" to match your board's processor. Set -# "PROG_MCU" as the AVR part name corresponding to "MCU". You can use the -# following command to get a list of correspondences: `avrdude -c alf -p x` -# Older boards are atmega8 based, newer ones like Arduino Mini, Bluetooth +# 3. Set the line containing "MCU" to match your board's processor. +# Older one's are atmega8 based, newer ones like Arduino Mini, Bluetooth # or Diecimila have the atmega168. If you're using a LilyPad Arduino, # change F_CPU to 8000000. If you are using Gen7 electronics, you # probably need to use 20000000. Either way, you must regenerate @@ -36,18 +34,18 @@ # 5. Type "make upload", reset your Arduino board, and press enter to # upload your program to the Arduino board. # -# Note that all settings at the top of this file can be overridden from +# Note that all settings at the top of this file can be overriden from # the command line with, for example, "make HARDWARE_MOTHERBOARD=71" # # To compile for RAMPS (atmega2560) with Arduino 1.6.9 at root/arduino you would use... # # make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \ -# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino +# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino # # To compile and upload simply add "upload" to the end of the line... # # make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \ -# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino upload +# HARDWARE_MOTHERBOARD=33 ARDUINO_INSTALL_DIR=/root/arduino upload # # If uploading doesn't work try adding the parameter "AVRDUDE_PROGRAMMER=wiring" or # start upload manually (using stk500) like so: @@ -59,26 +57,7 @@ # # This defines the board to compile for (see boards.h for your board's ID) -HARDWARE_MOTHERBOARD ?= 1020 - -ifeq ($(OS),Windows_NT) - # Windows - ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino - ARDUINO_USER_DIR ?= ${HOME}/Arduino -else - UNAME_S := $(shell uname -s) - ifeq ($(UNAME_S),Linux) - # Linux - ARDUINO_INSTALL_DIR ?= /usr/share/arduino - ARDUINO_USER_DIR ?= ${HOME}/Arduino - endif - ifeq ($(UNAME_S),Darwin) - # Darwin (macOS) - ARDUINO_INSTALL_DIR ?= /Applications/Arduino.app/Contents/Java - ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino - AVR_TOOLS_PATH ?= /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/ - endif -endif +HARDWARE_MOTHERBOARD ?= 11 # Arduino source install directory, and version number # On most linuxes this will be /usr/share/arduino @@ -88,44 +67,35 @@ ARDUINO_VERSION ?= 106 # The installed Libraries are in the User folder ARDUINO_USER_DIR ?= ${HOME}/Arduino -# You can optionally set a path to the avr-gcc tools. -# Requires a trailing slash. For example, /usr/local/avr-gcc/bin/ +# You can optionally set a path to the avr-gcc tools. Requires a trailing slash. (ex: /usr/local/avr-gcc/bin) AVR_TOOLS_PATH ?= -# Programmer configuration +#Programmer configuration UPLOAD_RATE ?= 57600 AVRDUDE_PROGRAMMER ?= arduino -# On most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1 +# on most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1 UPLOAD_PORT ?= /dev/ttyUSB0 -# Directory used to build files in, contains all the build files, from object -# files to the final hex file on linux it is best to put an absolute path -# like /home/username/tmp . +#Directory used to build files in, contains all the build files, from object files to the final hex file +#on linux it is best to put an absolute path like /home/username/tmp . BUILD_DIR ?= applet # This defines whether Liquid_TWI2 support will be built LIQUID_TWI2 ?= 0 -# This defines if Wire is needed +# this defines if Wire is needed WIRE ?= 0 -# This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h) -# Disabling this (and SPEAKER) saves approximatively 350 bytes of memory. -TONE ?= 1 +# this defines if U8GLIB is needed (may require RELOC_WORKAROUND) +U8GLIB ?= 1 -# This defines if U8GLIB is needed (may require RELOC_WORKAROUND) -U8GLIB ?= 0 - -# This defines whether to include the Trinamic TMCStepper library -TMC ?= 0 - -# This defines whether to include the AdaFruit NeoPixel library -NEOPIXEL ?= 0 +# this defines whether to include the Trinamic TMC2630Stepper +TMC2630 ?= 1 ############ # Try to automatically determine whether RELOC_WORKAROUND is needed based # on GCC versions: -# https://www.avrfreaks.net/comment/1789106#comment-1789106 +# http://www.avrfreaks.net/comment/1789106#comment-1789106 CC_MAJ:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC__ | cut -f3 -d\ ) CC_MIN:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_MINOR__ | cut -f3 -d\ ) @@ -133,7 +103,7 @@ CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | c CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) ))) ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1) @echo This version of GCC is likely broken. Enabling relocation workaround. - RELOC_WORKAROUND = 1 + RELOC_WORKAROUND = 1 endif ############################################################################ @@ -152,444 +122,298 @@ ifeq ($(HARDWARE_MOTHERBOARD),0) # # MEGA/RAMPS up to 1.2 -else ifeq ($(HARDWARE_MOTHERBOARD),1000) +else ifeq ($(HARDWARE_MOTHERBOARD),3) # RAMPS 1.3 (Power outputs: Hotend, Fan, Bed) -else ifeq ($(HARDWARE_MOTHERBOARD),1010) +else ifeq ($(HARDWARE_MOTHERBOARD),33) # RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Bed) -else ifeq ($(HARDWARE_MOTHERBOARD),1011) +else ifeq ($(HARDWARE_MOTHERBOARD),34) # RAMPS 1.3 (Power outputs: Hotend, Fan0, Fan1) -else ifeq ($(HARDWARE_MOTHERBOARD),1012) +else ifeq ($(HARDWARE_MOTHERBOARD),35) # RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Fan) -else ifeq ($(HARDWARE_MOTHERBOARD),1013) +else ifeq ($(HARDWARE_MOTHERBOARD),36) # RAMPS 1.3 (Power outputs: Spindle, Controller Fan) -else ifeq ($(HARDWARE_MOTHERBOARD),1014) +else ifeq ($(HARDWARE_MOTHERBOARD),38) # RAMPS 1.4 (Power outputs: Hotend, Fan, Bed) -else ifeq ($(HARDWARE_MOTHERBOARD),1020) +else ifeq ($(HARDWARE_MOTHERBOARD),43) # RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Bed) -else ifeq ($(HARDWARE_MOTHERBOARD),1021) +else ifeq ($(HARDWARE_MOTHERBOARD),44) # RAMPS 1.4 (Power outputs: Hotend, Fan0, Fan1) -else ifeq ($(HARDWARE_MOTHERBOARD),1022) +else ifeq ($(HARDWARE_MOTHERBOARD),45) # RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Fan) -else ifeq ($(HARDWARE_MOTHERBOARD),1023) +else ifeq ($(HARDWARE_MOTHERBOARD),46) # RAMPS 1.4 (Power outputs: Spindle, Controller Fan) -else ifeq ($(HARDWARE_MOTHERBOARD),1024) +else ifeq ($(HARDWARE_MOTHERBOARD),48) # RAMPS Plus 3DYMY (Power outputs: Hotend, Fan, Bed) -else ifeq ($(HARDWARE_MOTHERBOARD),1030) +else ifeq ($(HARDWARE_MOTHERBOARD),143) # RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Bed) -else ifeq ($(HARDWARE_MOTHERBOARD),1031) +else ifeq ($(HARDWARE_MOTHERBOARD),144) # RAMPS Plus 3DYMY (Power outputs: Hotend, Fan0, Fan1) -else ifeq ($(HARDWARE_MOTHERBOARD),1032) +else ifeq ($(HARDWARE_MOTHERBOARD),145) # RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Fan) -else ifeq ($(HARDWARE_MOTHERBOARD),1033) +else ifeq ($(HARDWARE_MOTHERBOARD),146) # RAMPS Plus 3DYMY (Power outputs: Spindle, Controller Fan) -else ifeq ($(HARDWARE_MOTHERBOARD),1034) +else ifeq ($(HARDWARE_MOTHERBOARD),148) # # RAMPS Derivatives - ATmega1280, ATmega2560 # # 3Drag Controller -else ifeq ($(HARDWARE_MOTHERBOARD),1100) +else ifeq ($(HARDWARE_MOTHERBOARD),77) # Velleman K8200 Controller (derived from 3Drag Controller) -else ifeq ($(HARDWARE_MOTHERBOARD),1101) +else ifeq ($(HARDWARE_MOTHERBOARD),78) # Velleman K8400 Controller (derived from 3Drag Controller) -else ifeq ($(HARDWARE_MOTHERBOARD),1102) -# Velleman K8600 Controller (Vertex Nano) -else ifeq ($(HARDWARE_MOTHERBOARD),1103) -# Velleman K8800 Controller (Vertex Delta) -else ifeq ($(HARDWARE_MOTHERBOARD),1104) +else ifeq ($(HARDWARE_MOTHERBOARD),79) # 2PrintBeta BAM&DICE with STK drivers -else ifeq ($(HARDWARE_MOTHERBOARD),1105) +else ifeq ($(HARDWARE_MOTHERBOARD),401) # 2PrintBeta BAM&DICE Due with STK drivers -else ifeq ($(HARDWARE_MOTHERBOARD),1106) +else ifeq ($(HARDWARE_MOTHERBOARD),402) # MKS BASE v1.0 -else ifeq ($(HARDWARE_MOTHERBOARD),1107) -# MKS v1.4 with A4982 stepper drivers -else ifeq ($(HARDWARE_MOTHERBOARD),1108) +else ifeq ($(HARDWARE_MOTHERBOARD),40) # MKS v1.5 with Allegro A4982 stepper drivers -else ifeq ($(HARDWARE_MOTHERBOARD),1109) -# MKS v1.6 with Allegro A4982 stepper drivers -else ifeq ($(HARDWARE_MOTHERBOARD),1110) +else ifeq ($(HARDWARE_MOTHERBOARD),405) # MKS BASE 1.0 with Heroic HR4982 stepper drivers -else ifeq ($(HARDWARE_MOTHERBOARD),1111) +else ifeq ($(HARDWARE_MOTHERBOARD),41) # MKS GEN v1.3 or 1.4 -else ifeq ($(HARDWARE_MOTHERBOARD),1112) +else ifeq ($(HARDWARE_MOTHERBOARD),47) # MKS GEN L -else ifeq ($(HARDWARE_MOTHERBOARD),1113) +else ifeq ($(HARDWARE_MOTHERBOARD),53) # zrib V2.0 control board (Chinese knock off RAMPS replica) -else ifeq ($(HARDWARE_MOTHERBOARD),1114) -# BigTreeTech or BIQU KFB2.0 -else ifeq ($(HARDWARE_MOTHERBOARD),1115) +else ifeq ($(HARDWARE_MOTHERBOARD),504) # Felix 2.0+ Electronics Board (RAMPS like) -else ifeq ($(HARDWARE_MOTHERBOARD),1116) +else ifeq ($(HARDWARE_MOTHERBOARD),37) # Invent-A-Part RigidBoard -else ifeq ($(HARDWARE_MOTHERBOARD),1117) +else ifeq ($(HARDWARE_MOTHERBOARD),42) # Invent-A-Part RigidBoard V2 -else ifeq ($(HARDWARE_MOTHERBOARD),1118) +else ifeq ($(HARDWARE_MOTHERBOARD),52) # Sainsmart 2-in-1 board -else ifeq ($(HARDWARE_MOTHERBOARD),1119) +else ifeq ($(HARDWARE_MOTHERBOARD),49) # Ultimaker -else ifeq ($(HARDWARE_MOTHERBOARD),1120) +else ifeq ($(HARDWARE_MOTHERBOARD),7) # Ultimaker (Older electronics. Pre 1.5.4. This is rare) -else ifeq ($(HARDWARE_MOTHERBOARD),1121) - MCU ?= atmega1280 - PROG_MCU ?= m1280 - +else ifeq ($(HARDWARE_MOTHERBOARD),71) +MCU ?= atmega1280 # Azteeg X3 -else ifeq ($(HARDWARE_MOTHERBOARD),1122) +else ifeq ($(HARDWARE_MOTHERBOARD),67) # Azteeg X3 Pro -else ifeq ($(HARDWARE_MOTHERBOARD),1123) +else ifeq ($(HARDWARE_MOTHERBOARD),68) # Ultimainboard 2.x (Uses TEMP_SENSOR 20) -else ifeq ($(HARDWARE_MOTHERBOARD),1124) +else ifeq ($(HARDWARE_MOTHERBOARD),72) # Rumba -else ifeq ($(HARDWARE_MOTHERBOARD),1125) -# Raise3D Rumba -else ifeq ($(HARDWARE_MOTHERBOARD),1126) -# Rapide Lite RL200 Rumba -else ifeq ($(HARDWARE_MOTHERBOARD),1127) -# Formbot T-Rex 2 Plus -else ifeq ($(HARDWARE_MOTHERBOARD),1128) -# Formbot T-Rex 3 -else ifeq ($(HARDWARE_MOTHERBOARD),1129) -# Formbot Raptor -else ifeq ($(HARDWARE_MOTHERBOARD),1130) -# Formbot Raptor 2 -else ifeq ($(HARDWARE_MOTHERBOARD),1131) +else ifeq ($(HARDWARE_MOTHERBOARD),80) # bq ZUM Mega 3D -else ifeq ($(HARDWARE_MOTHERBOARD),1132) +else ifeq ($(HARDWARE_MOTHERBOARD),503) # MakeBoard Mini v2.1.2 is a control board sold by MicroMake -else ifeq ($(HARDWARE_MOTHERBOARD),1133) +else ifeq ($(HARDWARE_MOTHERBOARD),431) # TriGorilla Anycubic version 1.3 based on RAMPS EFB -else ifeq ($(HARDWARE_MOTHERBOARD),1134) +else ifeq ($(HARDWARE_MOTHERBOARD),343) # TriGorilla Anycubic version 1.4 based on RAMPS EFB -else ifeq ($(HARDWARE_MOTHERBOARD),1135) -# TriGorilla Anycubic version 1.4 Rev 1.1 -else ifeq ($(HARDWARE_MOTHERBOARD),1136) +else ifeq ($(HARDWARE_MOTHERBOARD),443) # Creality: Ender-4, CR-8 -else ifeq ($(HARDWARE_MOTHERBOARD),1137) -# Creality: CR10S, CR20, CR-X -else ifeq ($(HARDWARE_MOTHERBOARD),1138) -# Dagoma F5 -else ifeq ($(HARDWARE_MOTHERBOARD),1139) -# FYSETC F6 1.3 -else ifeq ($(HARDWARE_MOTHERBOARD),1140) -# FYSETC F6 1.5 -else ifeq ($(HARDWARE_MOTHERBOARD),1141) -# Duplicator i3 Plus -else ifeq ($(HARDWARE_MOTHERBOARD),1142) -# VORON -else ifeq ($(HARDWARE_MOTHERBOARD),1143) -# TRONXY V3 1.0 -else ifeq ($(HARDWARE_MOTHERBOARD),1144) -# Z-Bolt X Series -else ifeq ($(HARDWARE_MOTHERBOARD),1145) -# TT OSCAR -else ifeq ($(HARDWARE_MOTHERBOARD),1146) -# Overlord/Overlord Pro -else ifeq ($(HARDWARE_MOTHERBOARD),1147) -# ADIMLab Gantry v1 -else ifeq ($(HARDWARE_MOTHERBOARD),1148) -# ADIMLab Gantry v2 -else ifeq ($(HARDWARE_MOTHERBOARD),1149) -# BIQU Tango V1 -else ifeq ($(HARDWARE_MOTHERBOARD),1150) -# MKS GEN L V2 -else ifeq ($(HARDWARE_MOTHERBOARD),1151) -# MKS GEN L V2.1 -else ifeq ($(HARDWARE_MOTHERBOARD),1152) -# Copymaster 3D -else ifeq ($(HARDWARE_MOTHERBOARD),1153) -# Ortur 4 -else ifeq ($(HARDWARE_MOTHERBOARD),1154) -# Tenlog D3 Hero -else ifeq ($(HARDWARE_MOTHERBOARD),1155) - -# -# RAMBo and derivatives -# - -# Rambo -else ifeq ($(HARDWARE_MOTHERBOARD),1200) -# Mini-Rambo -else ifeq ($(HARDWARE_MOTHERBOARD),1201) -# Mini-Rambo 1.0a -else ifeq ($(HARDWARE_MOTHERBOARD),1202) -# Einsy Rambo -else ifeq ($(HARDWARE_MOTHERBOARD),1203) -# Einsy Retro -else ifeq ($(HARDWARE_MOTHERBOARD),1204) -# abee Scoovo X9H -else ifeq ($(HARDWARE_MOTHERBOARD),1205) +else ifeq ($(HARDWARE_MOTHERBOARD),243) # # Other ATmega1280, ATmega2560 # # Cartesio CN Controls V11 -else ifeq ($(HARDWARE_MOTHERBOARD),1300) +else ifeq ($(HARDWARE_MOTHERBOARD),111) # Cartesio CN Controls V12 -else ifeq ($(HARDWARE_MOTHERBOARD),1301) -# Cartesio CN Controls V15 -else ifeq ($(HARDWARE_MOTHERBOARD),1302) +else ifeq ($(HARDWARE_MOTHERBOARD),112) # Cheaptronic v1.0 -else ifeq ($(HARDWARE_MOTHERBOARD),1303) +else ifeq ($(HARDWARE_MOTHERBOARD),2) # Cheaptronic v2.0 -else ifeq ($(HARDWARE_MOTHERBOARD),1304) +else ifeq ($(HARDWARE_MOTHERBOARD),21) # Makerbot Mightyboard Revision E -else ifeq ($(HARDWARE_MOTHERBOARD),1305) +else ifeq ($(HARDWARE_MOTHERBOARD),200) # Megatronics -else ifeq ($(HARDWARE_MOTHERBOARD),1306) +else ifeq ($(HARDWARE_MOTHERBOARD),70) # Megatronics v2.0 -else ifeq ($(HARDWARE_MOTHERBOARD),1307) +else ifeq ($(HARDWARE_MOTHERBOARD),701) # Megatronics v3.0 -else ifeq ($(HARDWARE_MOTHERBOARD),1308) +else ifeq ($(HARDWARE_MOTHERBOARD),703) # Megatronics v3.1 -else ifeq ($(HARDWARE_MOTHERBOARD),1309) -# Megatronics v3.2 -else ifeq ($(HARDWARE_MOTHERBOARD),1310) +else ifeq ($(HARDWARE_MOTHERBOARD),704) +# Rambo +else ifeq ($(HARDWARE_MOTHERBOARD),301) +# Mini-Rambo +else ifeq ($(HARDWARE_MOTHERBOARD),302) +# Mini-Rambo 1.0a +else ifeq ($(HARDWARE_MOTHERBOARD),303) +# Einsy Rambo +else ifeq ($(HARDWARE_MOTHERBOARD),304) +# Einsy Retro +else ifeq ($(HARDWARE_MOTHERBOARD),305) # Elefu Ra Board (v3) -else ifeq ($(HARDWARE_MOTHERBOARD),1311) +else ifeq ($(HARDWARE_MOTHERBOARD),21) # Leapfrog -else ifeq ($(HARDWARE_MOTHERBOARD),1312) +else ifeq ($(HARDWARE_MOTHERBOARD),999) # Mega controller -else ifeq ($(HARDWARE_MOTHERBOARD),1313) -# Geeetech GT2560 Rev B for Mecreator2 -else ifeq ($(HARDWARE_MOTHERBOARD),1314) +else ifeq ($(HARDWARE_MOTHERBOARD),310) +# abee Scoovo X9H +else ifeq ($(HARDWARE_MOTHERBOARD),321) # Geeetech GT2560 Rev. A -else ifeq ($(HARDWARE_MOTHERBOARD),1315) +else ifeq ($(HARDWARE_MOTHERBOARD),74) # Geeetech GT2560 Rev. A+ (with auto level probe) -else ifeq ($(HARDWARE_MOTHERBOARD),1316) -# Geeetech GT2560 Rev B for A10(M/D) -else ifeq ($(HARDWARE_MOTHERBOARD),1317) -# Geeetech GT2560 Rev B for A20(M/D) -else ifeq ($(HARDWARE_MOTHERBOARD),1318) -# Einstart retrofit -else ifeq ($(HARDWARE_MOTHERBOARD),1319) -# Wanhao 0ne+ i3 Mini -else ifeq ($(HARDWARE_MOTHERBOARD),1320) +else ifeq ($(HARDWARE_MOTHERBOARD),75) # # ATmega1281, ATmega2561 # -# Minitronics v1.0/1.1 -else ifeq ($(HARDWARE_MOTHERBOARD),1400) - MCU ?= atmega1281 - PROG_MCU ?= m1281 -# Silvergate v1.0 -else ifeq ($(HARDWARE_MOTHERBOARD),1401) - MCU ?= atmega1281 - PROG_MCU ?= m1281 +else ifeq ($(HARDWARE_MOTHERBOARD),702) +MCU ?= atmega1281 +else ifeq ($(HARDWARE_MOTHERBOARD),25) +MCU ?= atmega1281 # # Sanguinololu and Derivatives - ATmega644P, ATmega1284P # # Sanguinololu < 1.2 -else ifeq ($(HARDWARE_MOTHERBOARD),1500) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega644p - PROG_MCU ?= m644p +else ifeq ($(HARDWARE_MOTHERBOARD),6) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega644p # Sanguinololu 1.2 and above -else ifeq ($(HARDWARE_MOTHERBOARD),1501) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega644p - PROG_MCU ?= m644p +else ifeq ($(HARDWARE_MOTHERBOARD),62) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega644p # Melzi -else ifeq ($(HARDWARE_MOTHERBOARD),1502) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega644p - PROG_MCU ?= m644p -# Melzi V2.0 -else ifeq ($(HARDWARE_MOTHERBOARD),1503) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega1284p - PROG_MCU ?= m1284p +else ifeq ($(HARDWARE_MOTHERBOARD),63) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega644p # Melzi with ATmega1284 (MaKr3d version) -else ifeq ($(HARDWARE_MOTHERBOARD),1504) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega1284p - PROG_MCU ?= m1284p +else ifeq ($(HARDWARE_MOTHERBOARD),66) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega1284p # Melzi Creality3D board (for CR-10 etc) -else ifeq ($(HARDWARE_MOTHERBOARD),1505) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega1284p - PROG_MCU ?= m1284p +else ifeq ($(HARDWARE_MOTHERBOARD),89) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega1284p # Melzi Malyan M150 board -else ifeq ($(HARDWARE_MOTHERBOARD),1506) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega1284p - PROG_MCU ?= m1284p +else ifeq ($(HARDWARE_MOTHERBOARD),92) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega1284p # Tronxy X5S -else ifeq ($(HARDWARE_MOTHERBOARD),1507) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega1284p - PROG_MCU ?= m1284p +else ifeq ($(HARDWARE_MOTHERBOARD),505) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega1284p # STB V1.1 -else ifeq ($(HARDWARE_MOTHERBOARD),1508) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega1284p - PROG_MCU ?= m1284p +else ifeq ($(HARDWARE_MOTHERBOARD),64) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega1284p # Azteeg X1 -else ifeq ($(HARDWARE_MOTHERBOARD),1509) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega1284p - PROG_MCU ?= m1284p +else ifeq ($(HARDWARE_MOTHERBOARD),65) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega1284p # Anet 1.0 (Melzi clone) -else ifeq ($(HARDWARE_MOTHERBOARD),1510) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega1284p - PROG_MCU ?= m1284p +else ifeq ($(HARDWARE_MOTHERBOARD),69) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega1284p # # Other ATmega644P, ATmega644, ATmega1284P # # Gen3 Monolithic Electronics -else ifeq ($(HARDWARE_MOTHERBOARD),1600) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega644p - PROG_MCU ?= m644p +else ifeq ($(HARDWARE_MOTHERBOARD),22) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega644p # Gen3+ -else ifeq ($(HARDWARE_MOTHERBOARD),1601) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega644p - PROG_MCU ?= m644p +else ifeq ($(HARDWARE_MOTHERBOARD),9) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega644p # Gen6 -else ifeq ($(HARDWARE_MOTHERBOARD),1602) - HARDWARE_VARIANT ?= Gen6 - MCU ?= atmega644p - PROG_MCU ?= m644p +else ifeq ($(HARDWARE_MOTHERBOARD),5) +HARDWARE_VARIANT ?= Gen6 +MCU ?= atmega644p # Gen6 deluxe -else ifeq ($(HARDWARE_MOTHERBOARD),1603) - HARDWARE_VARIANT ?= Gen6 - MCU ?= atmega644p - PROG_MCU ?= m644p +else ifeq ($(HARDWARE_MOTHERBOARD),51) +HARDWARE_VARIANT ?= Gen6 +MCU ?= atmega644p # Gen7 custom (Alfons3 Version) -else ifeq ($(HARDWARE_MOTHERBOARD),1604) - HARDWARE_VARIANT ?= Gen7 - MCU ?= atmega644 - PROG_MCU ?= m644 - F_CPU ?= 20000000 +else ifeq ($(HARDWARE_MOTHERBOARD),10) +HARDWARE_VARIANT ?= Gen7 +MCU ?= atmega644 +F_CPU ?= 20000000 # Gen7 v1.1, v1.2 -else ifeq ($(HARDWARE_MOTHERBOARD),1605) - HARDWARE_VARIANT ?= Gen7 - MCU ?= atmega644p - PROG_MCU ?= m644p - F_CPU ?= 20000000 +else ifeq ($(HARDWARE_MOTHERBOARD),11) +HARDWARE_VARIANT ?= Gen7 +MCU ?= atmega644p +F_CPU ?= 20000000 # Gen7 v1.3 -else ifeq ($(HARDWARE_MOTHERBOARD),1606) - HARDWARE_VARIANT ?= Gen7 - MCU ?= atmega644p - PROG_MCU ?= m644p - F_CPU ?= 20000000 +else ifeq ($(HARDWARE_MOTHERBOARD),12) +HARDWARE_VARIANT ?= Gen7 +MCU ?= atmega644p +F_CPU ?= 20000000 # Gen7 v1.4 -else ifeq ($(HARDWARE_MOTHERBOARD),1607) - HARDWARE_VARIANT ?= Gen7 - MCU ?= atmega1284p - PROG_MCU ?= m1284p - F_CPU ?= 20000000 +else ifeq ($(HARDWARE_MOTHERBOARD),13) +HARDWARE_VARIANT ?= Gen7 +MCU ?= atmega1284p +F_CPU ?= 20000000 # Alpha OMCA board -else ifeq ($(HARDWARE_MOTHERBOARD),1608) - HARDWARE_VARIANT ?= SanguinoA - MCU ?= atmega644 - PROG_MCU ?= m644 +else ifeq ($(HARDWARE_MOTHERBOARD),90) +HARDWARE_VARIANT ?= SanguinoA +MCU ?= atmega644 # Final OMCA board -else ifeq ($(HARDWARE_MOTHERBOARD),1609) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega644p - PROG_MCU ?= m644p +else ifeq ($(HARDWARE_MOTHERBOARD),91) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega644p # Sethi 3D_1 -else ifeq ($(HARDWARE_MOTHERBOARD),1610) - HARDWARE_VARIANT ?= Sanguino - MCU ?= atmega644p - PROG_MCU ?= m644p +else ifeq ($(HARDWARE_MOTHERBOARD),20) +HARDWARE_VARIANT ?= Sanguino +MCU ?= atmega644p # # Teensyduino - AT90USB1286, AT90USB1286P # # Teensylu -else ifeq ($(HARDWARE_MOTHERBOARD),1700) - HARDWARE_VARIANT ?= Teensy - MCU ?= at90usb1286 - PROG_MCU ?= usb1286 +else ifeq ($(HARDWARE_MOTHERBOARD),8) +HARDWARE_VARIANT ?= Teensy +MCU ?= at90usb1286 # Printrboard (AT90USB1286) -else ifeq ($(HARDWARE_MOTHERBOARD),1701) - HARDWARE_VARIANT ?= Teensy - MCU ?= at90usb1286 - PROG_MCU ?= usb1286 +else ifeq ($(HARDWARE_MOTHERBOARD),81) +HARDWARE_VARIANT ?= Teensy +MCU ?= at90usb1286 # Printrboard Revision F (AT90USB1286) -else ifeq ($(HARDWARE_MOTHERBOARD),1702) - HARDWARE_VARIANT ?= Teensy - MCU ?= at90usb1286 - PROG_MCU ?= usb1286 +else ifeq ($(HARDWARE_MOTHERBOARD),811) +HARDWARE_VARIANT ?= Teensy +MCU ?= at90usb1286 # Brainwave (AT90USB646) -else ifeq ($(HARDWARE_MOTHERBOARD),1703) - HARDWARE_VARIANT ?= Teensy - MCU ?= at90usb646 - PROG_MCU ?= usb646 +else ifeq ($(HARDWARE_MOTHERBOARD),82) +HARDWARE_VARIANT ?= Teensy +MCU ?= at90usb646 # Brainwave Pro (AT90USB1286) -else ifeq ($(HARDWARE_MOTHERBOARD),1704) - HARDWARE_VARIANT ?= Teensy - MCU ?= at90usb1286 - PROG_MCU ?= usb1286 +else ifeq ($(HARDWARE_MOTHERBOARD),83) +HARDWARE_VARIANT ?= Teensy +MCU ?= at90usb1286 # SAV Mk-I (AT90USB1286) -else ifeq ($(HARDWARE_MOTHERBOARD),1705) - HARDWARE_VARIANT ?= Teensy - MCU ?= at90usb1286 - PROG_MCU ?= usb1286 +else ifeq ($(HARDWARE_MOTHERBOARD),84) +HARDWARE_VARIANT ?= Teensy +MCU ?= at90usb1286 # Teensy++2.0 (AT90USB1286) -else ifeq ($(HARDWARE_MOTHERBOARD),1706) - HARDWARE_VARIANT ?= Teensy - MCU ?= at90usb1286 - PROG_MCU ?= usb1286 +else ifeq ($(HARDWARE_MOTHERBOARD),85) +HARDWARE_VARIANT ?= Teensy +MCU ?= at90usb1286 # 5DPrint D8 Driver Board -else ifeq ($(HARDWARE_MOTHERBOARD),1707) - HARDWARE_VARIANT ?= Teensy - MCU ?= at90usb1286 - PROG_MCU ?= usb1286 +else ifeq ($(HARDWARE_MOTHERBOARD),88) +HARDWARE_VARIANT ?= Teensy +MCU ?= at90usb1286 -# UltiMachine Archim1 (with DRV8825 drivers) -else ifeq ($(HARDWARE_MOTHERBOARD),3023) - HARDWARE_VARIANT ?= archim - MCPU = cortex-m3 - F_CPU = 84000000 - IS_MCU = 0 -# UltiMachine Archim2 (with TMC2130 drivers) -else ifeq ($(HARDWARE_MOTHERBOARD),3024) - HARDWARE_VARIANT ?= archim - MCPU = cortex-m3 - F_CPU = 84000000 - IS_MCU = 0 endif # Be sure to regenerate speed_lookuptable.h with create_speed_lookuptable.py # if you are setting this to something other than 16MHz -# Do not put the UL suffix, it's done later on. # Set to 16Mhz if not yet set. F_CPU ?= 16000000 -# Set to microcontroller if IS_MCU not yet set -IS_MCU ?= 1 - -ifeq ($(IS_MCU),1) - # Set to arduino, ATmega2560 if not yet set. - HARDWARE_VARIANT ?= arduino - MCU ?= atmega2560 - PROG_MCU ?= m2560 - - TOOL_PREFIX = avr - MCU_FLAGS = -mmcu=$(MCU) - SIZE_FLAGS = --mcu=$(MCU) -C -else - TOOL_PREFIX = arm-none-eabi - CPU_FLAGS = -mthumb -mcpu=$(MCPU) - SIZE_FLAGS = -A -endif +# Set to arduino, ATmega2560 if not yet set. +HARDWARE_VARIANT ?= arduino +MCU ?= atmega2560 # Arduino contained the main source code for the Arduino # Libraries, the "hardware variant" are for boards @@ -610,137 +434,99 @@ VPATH = . VPATH += $(BUILD_DIR) VPATH += $(HARDWARE_SRC) +# U8glib +VPATH += $(ARDUINO_USER_DIR)/libraries/U8glib +VPATH += $(ARDUINO_USER_DIR)/libraries/U8glib/clib + ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino)) - # Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8) - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI - # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/LiquidCrystal/src +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/libraries/SPI endif -ifeq ($(IS_MCU),1) - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino - - # Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8) - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial - # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src -endif +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src - ifeq ($(LIQUID_TWI2), 1) - WIRE = 1 - VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2 +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2 endif ifeq ($(WIRE), 1) - # Old libraries (avr-core 1.6.21 / Arduino < 1.6.8) - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility - # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src/utility +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Wire/utility endif ifeq ($(NEOPIXEL), 1) VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel endif ifeq ($(U8GLIB), 1) VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/csrc -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/cppsrc -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/fntsrc +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/clib endif -ifeq ($(TMC), 1) -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMCStepper/src -VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMCStepper/src/source +ifeq ($(TMC2630), 1) +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMC2130Stepper/src +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMC2130Stepper/src/source endif ifeq ($(HARDWARE_VARIANT), arduino) - HARDWARE_SUB_VARIANT ?= mega - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/variants/$(HARDWARE_SUB_VARIANT) -else ifeq ($(HARDWARE_VARIANT), Sanguino) - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/variants/sanguino -else ifeq ($(HARDWARE_VARIANT), archim) - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/libsam - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/CMSIS/CMSIS/Include/ - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/CMSIS/Device/ATMEL/ - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/cores/arduino - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/cores/arduino/avr - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/cores/arduino/USB - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/libraries/Wire/src - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/libraries/SPI/src - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/libraries/U8glib/src/clib - VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim - LDSCRIPT = $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/linker_scripts/gcc/flash.ld - LDLIBS = $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/libsam_sam3x8e_gcc_rel.a +HARDWARE_SUB_VARIANT ?= mega +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/variants/$(HARDWARE_SUB_VARIANT) else - HARDWARE_SUB_VARIANT ?= standard - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/$(HARDWARE_VARIANT)/variants/$(HARDWARE_SUB_VARIANT) +ifeq ($(HARDWARE_VARIANT), Sanguino) +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/variants/sanguino +else +HARDWARE_SUB_VARIANT ?= standard +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/$(HARDWARE_VARIANT)/variants/$(HARDWARE_SUB_VARIANT) +endif endif - LIB_SRC = wiring.c \ - wiring_analog.c wiring_digital.c \ - wiring_shift.c WInterrupts.c hooks.c - -ifeq ($(HARDWARE_VARIANT), archim) - LIB_ASRC += wiring_pulse_asm.S -else - LIB_SRC += wiring_pulse.c -endif + wiring_analog.c wiring_digital.c \ + wiring_pulse.c \ + wiring_shift.c WInterrupts.c hooks.c ifeq ($(HARDWARE_VARIANT), Teensy) - LIB_SRC = wiring.c - VPATH += $(ARDUINO_INSTALL_DIR)/hardware/teensy/cores/teensy +LIB_SRC = wiring.c +VPATH += $(ARDUINO_INSTALL_DIR)/hardware/teensy/cores/teensy endif -LIB_CXXSRC = WMath.cpp WString.cpp Print.cpp SPI.cpp +LIB_CXXSRC = WMath.cpp WString.cpp Print.cpp SPI.cpp Tone.cpp ifeq ($(NEOPIXEL), 1) - LIB_CXXSRC += Adafruit_NeoPixel.cpp +LIB_CXXSRC += Adafruit_NeoPixel.cpp endif ifeq ($(LIQUID_TWI2), 0) - LIB_CXXSRC += LiquidCrystal.cpp +LIB_CXXSRC += LiquidCrystal.cpp else - LIB_SRC += twi.c - LIB_CXXSRC += Wire.cpp LiquidTWI2.cpp +LIB_SRC += twi.c +LIB_CXXSRC += Wire.cpp LiquidTWI2.cpp endif ifeq ($(WIRE), 1) - LIB_SRC += twi.c - LIB_CXXSRC += Wire.cpp -endif - -ifeq ($(TONE), 1) - LIB_CXXSRC += Tone.cpp +LIB_SRC += twi.c +LIB_CXXSRC += Wire.cpp endif ifeq ($(U8GLIB), 1) - LIB_CXXSRC += U8glib.cpp - LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c \ - u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c \ - u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c +LIB_CXXSRC += U8glib.cpp +LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c u8g_font_data.c endif -ifeq ($(TMC), 1) - LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \ - CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \ - DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \ - SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \ - TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp +ifeq ($(TMC2630), 1) +LIB_CXXSRC += TMC2130Stepper.cpp TMC2130Stepper_COOLCONF.cpp TMC2130Stepper_DRV_STATUS.cpp TMC2130Stepper_IHOLD_IRUN.cpp TMC2130Stepper_CHOPCONF.cpp TMC2130Stepper_GCONF.cpp TMC2130Stepper_PWMCONF.cpp SW_SPI.cpp endif ifeq ($(RELOC_WORKAROUND), 1) - LD_PREFIX=-nodefaultlibs - LD_SUFFIX=-lm -lgcc -lc -lgcc +LD_PREFIX=-nodefaultlibs +LD_SUFFIX=-lm -lgcc -lc -lgcc endif #Check for Arduino 1.0.0 or higher and use the correct source files for that version ifeq ($(shell [ $(ARDUINO_VERSION) -ge 100 ] && echo true), true) - LIB_CXXSRC += main.cpp +LIB_CXXSRC += main.cpp else - LIB_SRC += pins_arduino.c main.c +LIB_SRC += pins_arduino.c main.c endif FORMAT = ihex @@ -758,91 +544,62 @@ OPT = s DEFINES ?= # Program settings -CC = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-gcc -CXX = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-g++ -OBJCOPY = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-objcopy -OBJDUMP = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-objdump -AR = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-ar -SIZE = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-size -NM = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-nm +CC = $(AVR_TOOLS_PATH)avr-gcc +CXX = $(AVR_TOOLS_PATH)avr-g++ +OBJCOPY = $(AVR_TOOLS_PATH)avr-objcopy +OBJDUMP = $(AVR_TOOLS_PATH)avr-objdump +AR = $(AVR_TOOLS_PATH)avr-ar +SIZE = $(AVR_TOOLS_PATH)avr-size +NM = $(AVR_TOOLS_PATH)avr-nm AVRDUDE = avrdude REMOVE = rm -f MV = mv -f # Place -D or -U options here -CDEFS = -DF_CPU=$(F_CPU)UL ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION) +CDEFS = -DF_CPU=$(F_CPU) ${addprefix -D , $(DEFINES)} CXXDEFS = $(CDEFS) ifeq ($(HARDWARE_VARIANT), Teensy) - CDEFS += -DUSB_SERIAL - LIB_SRC += usb.c pins_teensy.c - LIB_CXXSRC += usb_api.cpp - -else ifeq ($(HARDWARE_VARIANT), archim) - CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ - CDEFS += -DUSB_VID=0x27B1 -DUSB_PID=0x0001 -DUSBCON - CDEFS += '-DUSB_MANUFACTURER="UltiMachine"' '-DUSB_PRODUCT_STRING="Archim"' - - LIB_CXXSRC += variant.cpp IPAddress.cpp Reset.cpp RingBuffer.cpp Stream.cpp \ - UARTClass.cpp USARTClass.cpp abi.cpp new.cpp watchdog.cpp CDC.cpp \ - PluggableUSB.cpp USBCore.cpp - - LIB_SRC += cortex_handlers.c iar_calls_sam3.c syscalls_sam3.c dtostrf.c itoa.c - - ifeq ($(U8GLIB), 1) - LIB_SRC += u8g_com_api.c u8g_pb32h1.c - endif +CDEFS += -DUSB_SERIAL +LIB_SRC += usb.c pins_teensy.c +LIB_CXXSRC += usb_api.cpp endif # Add all the source directories as include directories too CINCS = ${addprefix -I ,${VPATH}} CXXINCS = ${addprefix -I ,${VPATH}} -# Silence warnings for library code (won't work for .h files, unfortunately) -LIBWARN = -w -Wno-packed-bitfield-compat - # Compiler flag to set the C/CPP Standard level. CSTANDARD = -std=gnu99 CXXSTANDARD = -std=gnu++11 CDEBUG = -g$(DEBUG) -CWARN = -Wall -Wstrict-prototypes -Wno-packed-bitfield-compat -Wno-pragmas -Wunused-parameter -CXXWARN = -Wall -Wno-packed-bitfield-compat -Wno-pragmas -Wunused-parameter -CTUNING = -fsigned-char -funsigned-bitfields -fno-exceptions \ - -fshort-enums -ffunction-sections -fdata-sections +CWARN = -Wall -Wstrict-prototypes +CTUNING = -w -fsigned-char -funsigned-bitfields -fpack-struct \ + -fshort-enums -ffunction-sections -fdata-sections -flto \ + -DARDUINO=$(ARDUINO_VERSION) ifneq ($(HARDWARE_MOTHERBOARD),) - CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD} +CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD} endif - #CEXTRA = -Wa,-adhlns=$(<:.c=.lst) -CXXEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics -fno-rtti -CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CEXTRA) $(CTUNING) $(CSTANDARD) -CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) $(CXXEXTRA) $(CTUNING) $(CXXSTANDARD) -ASFLAGS := $(CDEFS) +CEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics + +CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CEXTRA) $(CTUNING) $(CSTANDARD) +CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) -Wall $(CEXTRA) $(CTUNING) $(CXXSTANDARD) #ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs +LDFLAGS = -lm -ifeq ($(HARDWARE_VARIANT), archim) - LD_PREFIX = -Wl,--gc-sections,-Map,Marlin.ino.map,--cref,--check-sections,--entry=Reset_Handler,--unresolved-symbols=report-all,--warn-common,--warn-section-align - LD_SUFFIX = $(LDLIBS) - - LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty - LDFLAGS += -u _lseek -u _read -u _write -u _exit -u kill -u _getpid -else - LD_PREFIX = -Wl,--gc-sections,--relax - LDFLAGS = -lm - CTUNING += -flto -endif # Programming support using avrdude. Settings and variables. AVRDUDE_PORT = $(UPLOAD_PORT) AVRDUDE_WRITE_FLASH = -Uflash:w:$(BUILD_DIR)/$(TARGET).hex:i ifeq ($(shell uname -s), Linux) - AVRDUDE_CONF = /etc/avrdude/avrdude.conf +AVRDUDE_CONF = /etc/avrdude/avrdude.conf else - AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf +AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf endif AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \ - -p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \ - -b$(UPLOAD_RATE) + -p$(MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \ + -b$(UPLOAD_RATE) # Since Marlin 2.0, the source files may be distributed into several # different directories, so it is necessary to find them recursively @@ -862,17 +619,17 @@ LST = $(LIB_ASRC:.S=.lst) $(LIB_CXXSRC:.cpp=.lst) $(LIB_SRC:.c=.lst) # Combine all necessary flags and optional flags. # Add target processor to flags. -ALL_CFLAGS = $(MCU_FLAGS) $(CPU_FLAGS) $(CFLAGS) -I. -ALL_CXXFLAGS = $(MCU_FLAGS) $(CPU_FLAGS) $(CXXFLAGS) -ALL_ASFLAGS = $(MCU_FLAGS) $(CPU_FLAGS) $(ASFLAGS) -x assembler-with-cpp +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) +ALL_CXXFLAGS = -mmcu=$(MCU) $(CXXFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -x assembler-with-cpp $(ASFLAGS) # set V=1 (eg, "make V=1") to print the full commands etc. ifneq ($V,1) - Pecho=@echo - P=@ + Pecho=@echo + P=@ else - Pecho=@: - P= + Pecho=@: + P= endif # Create required build hierarchy if it does not exist @@ -882,10 +639,9 @@ $(shell mkdir -p $(dir $(OBJ))) # Default target. all: sizeafter -build: elf hex bin +build: elf hex elf: $(BUILD_DIR)/$(TARGET).elf -bin: $(BUILD_DIR)/$(TARGET).bin hex: $(BUILD_DIR)/$(TARGET).hex eep: $(BUILD_DIR)/$(TARGET).eep lss: $(BUILD_DIR)/$(TARGET).lss @@ -902,9 +658,9 @@ ifeq (${AVRDUDE_PROGRAMMER}, arduino) stty -hup < $(UPLOAD_PORT); true endif -# Display size of file. + # Display size of file. HEXSIZE = $(SIZE) --target=$(FORMAT) $(BUILD_DIR)/$(TARGET).hex -ELFSIZE = $(SIZE) $(SIZE_FLAGS) $(BUILD_DIR)/$(TARGET).elf; \ +ELFSIZE = $(SIZE) --mcu=$(MCU) -C $(BUILD_DIR)/$(TARGET).elf; \ $(SIZE) $(BUILD_DIR)/$(TARGET).elf sizebefore: $P if [ -f $(BUILD_DIR)/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi @@ -915,10 +671,10 @@ sizeafter: build # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. COFFCONVERT=$(OBJCOPY) --debugging \ - --change-section-address .data-0x800000 \ - --change-section-address .bss-0x800000 \ - --change-section-address .noinit-0x800000 \ - --change-section-address .eeprom-0x810000 + --change-section-address .data-0x800000 \ + --change-section-address .bss-0x800000 \ + --change-section-address .noinit-0x800000 \ + --change-section-address .eeprom-0x810000 coff: $(BUILD_DIR)/$(TARGET).elf @@ -929,20 +685,16 @@ extcoff: $(TARGET).elf $(COFFCONVERT) -O coff-ext-avr $(BUILD_DIR)/$(TARGET).elf $(TARGET).cof -.SUFFIXES: .elf .hex .eep .lss .sym .bin +.SUFFIXES: .elf .hex .eep .lss .sym .PRECIOUS: .o .elf.hex: $(Pecho) " COPY $@" $P $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ -.elf.bin: - $(Pecho) " COPY $@" - $P $(OBJCOPY) -O binary -R .eeprom $< $@ - .elf.eep: -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ - --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ # Create extended listing file from ELF output file. .elf.lss: @@ -952,36 +704,32 @@ extcoff: $(TARGET).elf .elf.sym: $(NM) -n $< > $@ -# Link: create ELF output file from library. + # Link: create ELF output file from library. $(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h $(Pecho) " CXX $@" - $P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX) + $P $(CC) $(LD_PREFIX) $(ALL_CXXFLAGS) -Wl,--gc-sections,--relax -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX) # Object files that were found in "src" will be stored in $(BUILD_DIR) # in directories that mirror the structure of "src" $(BUILD_DIR)/%.o: %.c Configuration.h Configuration_adv.h $(MAKEFILE) $(Pecho) " CC $<" - $P $(CC) -MMD -c $(ALL_CFLAGS) $(CWARN) $< -o $@ + $P $(CC) -MMD -c $(ALL_CFLAGS) $< -o $@ $(BUILD_DIR)/%.o: %.cpp Configuration.h Configuration_adv.h $(MAKEFILE) $(Pecho) " CXX $<" - $P $(CXX) -MMD -c $(ALL_CXXFLAGS) $(CXXWARN) $< -o $@ + $P $(CXX) -MMD -c $(ALL_CXXFLAGS) $< -o $@ # Object files for Arduino libs will be created in $(BUILD_DIR)/arduino $(BUILD_DIR)/arduino/%.o: %.c Configuration.h Configuration_adv.h $(MAKEFILE) $(Pecho) " CC $<" - $P $(CC) -MMD -c $(ALL_CFLAGS) $(LIBWARN) $< -o $@ + $P $(CC) -MMD -c $(ALL_CFLAGS) $< -o $@ $(BUILD_DIR)/arduino/%.o: %.cpp Configuration.h Configuration_adv.h $(MAKEFILE) $(Pecho) " CXX $<" - $P $(CXX) -MMD -c $(ALL_CXXFLAGS) $(LIBWARN) $< -o $@ - -$(BUILD_DIR)/arduino/%.o: %.S $(MAKEFILE) - $(Pecho) " CXX $<" - $P $(CXX) -MMD -c $(ALL_ASFLAGS) $< -o $@ + $P $(CXX) -MMD -c $(ALL_CXXFLAGS) $< -o $@ # Target: clean project. clean: @@ -989,7 +737,7 @@ clean: $P rm -rf $(BUILD_DIR) -.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter +.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter # Automaticaly include the dependency files created by gcc -include ${patsubst %.o, %.d, ${OBJ}} diff --git a/Marlin/Marlin.ino b/Marlin/Marlin.ino index 57c825445f..842b2a14b9 100644 --- a/Marlin/Marlin.ino +++ b/Marlin/Marlin.ino @@ -1,8 +1,9 @@ -/*============================================================================== +/* +================================================================================ Marlin Firmware - (c) 2011-2020 MarlinFirmware + (c) 2011-2018 MarlinFirmware Portions of Marlin are (c) by their respective authors. All code complies with GPLv2 and/or GPLv3 @@ -11,33 +12,30 @@ Greetings! Thank you for choosing Marlin 2 as your 3D printer firmware. To configure Marlin you must edit Configuration.h and Configuration_adv.h -located in the root 'Marlin' folder. Check our Configurations repository to -see if there's a more suitable starting-point for your specific hardware. +located in the root 'Marlin' folder. Check the config/examples folder to see if +there's a more suitable starting-point for your specific hardware. Before diving in, we recommend the following essential links: Marlin Firmware Official Website - - https://marlinfw.org/ + - http://marlinfw.org/ The official Marlin Firmware website contains the most up-to-date documentation. Contributions are always welcome! Configuration - - https://github.com/MarlinFirmware/Configurations - Example configurations for several printer models. - - https://www.youtube.com/watch?v=3gwWVFtdg-4 A good 20-minute overview of Marlin configuration by Tom Sanladerer. (Applies to Marlin 1.0.x, so Jerk and Acceleration should be halved.) Also... https://www.google.com/search?tbs=vid%3A1&q=configure+marlin - - https://marlinfw.org/docs/configuration/configuration.html + - http://marlinfw.org/docs/configuration/configuration.html Marlin's configuration options are explained in more detail here. Getting Help - - https://reprap.org/forum/list.php?415 + - http://forums.reprap.org/list.php?415 The Marlin Discussion Forum is a great place to get help from other Marlin users who may have experienced similar issues to your own. @@ -47,11 +45,9 @@ Getting Help Contributing - - https://marlinfw.org/docs/development/contributing.html + - http://marlinfw.org/docs/development/contributing.html If you'd like to contribute to Marlin, read this first! - - https://marlinfw.org/docs/development/coding_standards.html + - http://marlinfw.org/docs/development/coding_standards.html Before submitting code get to know the Coding Standards. - - -------------------------------------------------------------------------------*/ +*/ diff --git a/Marlin/Version.h b/Marlin/Version.h deleted file mode 100644 index 60e068ba35..0000000000 --- a/Marlin/Version.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//////////////////////////// -// VENDOR VERSION EXAMPLE // -//////////////////////////// - -/** - * Marlin release version identifier - */ -//#define SHORT_BUILD_VERSION "2.0.7.2" - -/** - * Verbose version identifier which should contain a reference to the location - * from where the binary was downloaded or the source code was compiled. - */ -//#define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION - -/** - * The STRING_DISTRIBUTION_DATE represents when the binary file was built, - * here we define this default string as the date where the latest release - * version was tagged. - */ -//#define STRING_DISTRIBUTION_DATE "2020-07-09" - -/** - * Defines a generic printer name to be output to the LCD after booting Marlin. - */ -//#define MACHINE_NAME "3D Printer" - -/** - * The SOURCE_CODE_URL is the location where users will find the Marlin Source - * Code which is installed on the device. In most cases —unless the manufacturer - * has a distinct Github fork— the Source Code URL should just be the main - * Marlin repository. - */ -//#define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin" - -/** - * Default generic printer UUID. - */ -//#define DEFAULT_MACHINE_UUID "cede2a2f-41a2-4748-9b12-c55c62f367ff" - -/** - * The WEBSITE_URL is the location where users can get more information such as - * documentation about a specific Marlin release. - */ -//#define WEBSITE_URL "https://marlinfw.org" - -/** - * Set the vendor info the serial USB interface, if changable - * Currently only supported by DUE platform - */ -//#define USB_DEVICE_VENDOR_ID 0x0000 -//#define USB_DEVICE_PRODUCT_ID 0x0000 -//#define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL diff --git a/Marlin/lib/readme.txt b/Marlin/lib/readme.txt index 5ec60aa858..dbadc3d630 100644 --- a/Marlin/lib/readme.txt +++ b/Marlin/lib/readme.txt @@ -33,4 +33,4 @@ PlatformIO will find your libraries automatically, configure preprocessor's include paths and build them. More information about PlatformIO Library Dependency Finder -- https://docs.platformio.org/page/librarymanager/ldf.html +- http://docs.platformio.org/page/librarymanager/ldf.html diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp deleted file mode 100644 index 58d57c8ee5..0000000000 --- a/Marlin/src/HAL/AVR/HAL.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __AVR__ - -#include "../../inc/MarlinConfig.h" -#include "HAL.h" - -// ------------------------ -// Public Variables -// ------------------------ - -//uint8_t MCUSR; - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_init() { - // Init Servo Pins - #define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW) - #if HAS_SERVO_0 - INIT_SERVO(0); - #endif - #if HAS_SERVO_1 - INIT_SERVO(1); - #endif - #if HAS_SERVO_2 - INIT_SERVO(2); - #endif - #if HAS_SERVO_3 - INIT_SERVO(3); - #endif -} - -#if ENABLED(SDSUPPORT) - - #include "../../sd/SdFatUtil.h" - int freeMemory() { return SdFatUtil::FreeRam(); } - -#else // !SDSUPPORT - -extern "C" { - extern char __bss_end; - extern char __heap_start; - extern void* __brkval; - - int freeMemory() { - int free_memory; - if ((int)__brkval == 0) - free_memory = ((int)&free_memory) - ((int)&__bss_end); - else - free_memory = ((int)&free_memory) - ((int)__brkval); - return free_memory; - } -} - -#endif // !SDSUPPORT - -#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h deleted file mode 100644 index 6e0afa8f10..0000000000 --- a/Marlin/src/HAL/AVR/HAL.h +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../shared/Marduino.h" -#include "../shared/HAL_SPI.h" -#include "fastio.h" -#include "watchdog.h" -#include "math.h" - -#ifdef IS_AT90USB - #include -#else - #define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion - #include "MarlinSerial.h" -#endif - -#include -#include -#include -#include -#include -#include - -#ifndef pgm_read_ptr - // Compatibility for avr-libc 1.8.0-4.1 included with Ubuntu for - // Windows Subsystem for Linux on Windows 10 as of 10/18/2019 - #define pgm_read_ptr_far(address_long) (void*)__ELPM_word((uint32_t)(address_long)) - #define pgm_read_ptr_near(address_short) (void*)__LPM_word((uint16_t)(address_short)) - #define pgm_read_ptr(address_short) pgm_read_ptr_near(address_short) -#endif - -// ------------------------ -// Defines -// ------------------------ - -// AVR PROGMEM extension for sprintf_P -#define S_FMT "%S" - -// AVR PROGMEM extension for string define -#define PGMSTR(NAM,STR) const char NAM[] PROGMEM = STR - -#ifndef CRITICAL_SECTION_START - #define CRITICAL_SECTION_START() unsigned char _sreg = SREG; cli() - #define CRITICAL_SECTION_END() SREG = _sreg -#endif -#define ISRS_ENABLED() TEST(SREG, SREG_I) -#define ENABLE_ISRS() sei() -#define DISABLE_ISRS() cli() - -// ------------------------ -// Types -// ------------------------ - -typedef int8_t pin_t; - -#define SHARED_SERVOS HAS_SERVOS -#define HAL_SERVO_LIB Servo - -// ------------------------ -// Public Variables -// ------------------------ - -//extern uint8_t MCUSR; - -// Serial ports -#ifdef IS_AT90USB - #define MYSERIAL0 TERN(BLUETOOTH, bluetoothSerial, Serial) -#else - #if !WITHIN(SERIAL_PORT, -1, 3) - #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." - #endif - #define MYSERIAL0 customizedSerial1 - - #ifdef SERIAL_PORT_2 - #if !WITHIN(SERIAL_PORT_2, -1, 3) - #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." - #endif - #define MYSERIAL1 customizedSerial2 - #endif -#endif - -#ifdef LCD_SERIAL_PORT - #if !WITHIN(LCD_SERIAL_PORT, -1, 3) - #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." - #endif - #define LCD_SERIAL lcdSerial - #if HAS_DGUS_LCD - #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free() - #endif -#endif - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_init(); - -//void cli(); - -//void _delay_ms(const int delay); - -inline void HAL_clear_reset_source() { MCUSR = 0; } -inline uint8_t HAL_get_reset_source() { return MCUSR; } - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -extern "C" { - int freeMemory(); -} -#pragma GCC diagnostic pop - -// ADC -#ifdef DIDR2 - #define HAL_ANALOG_SELECT(ind) do{ if (ind < 8) SBI(DIDR0, ind); else SBI(DIDR2, ind & 0x07); }while(0) -#else - #define HAL_ANALOG_SELECT(ind) SBI(DIDR0, ind); -#endif - -inline void HAL_adc_init() { - ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07; - DIDR0 = 0; - #ifdef DIDR2 - DIDR2 = 0; - #endif -} - -#define SET_ADMUX_ADCSRA(ch) ADMUX = _BV(REFS0) | (ch & 0x07); SBI(ADCSRA, ADSC) -#ifdef MUX5 - #define HAL_START_ADC(ch) if (ch > 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(ch) -#else - #define HAL_START_ADC(ch) ADCSRB = 0; SET_ADMUX_ADCSRA(ch) -#endif - -#define HAL_ADC_VREF 5.0 -#define HAL_ADC_RESOLUTION 10 -#define HAL_READ_ADC() ADC -#define HAL_ADC_READY() !TEST(ADCSRA, ADSC) - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -#define HAL_SENSITIVE_PINS 0, 1 - -#ifdef __AVR_AT90USB1286__ - #define JTAG_DISABLE() do{ MCUCR = 0x80; MCUCR = 0x80; }while(0) -#endif - -// AVR compatibility -#define strtof strtod - -#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment - -/** - * set_pwm_frequency - * Sets the frequency of the timer corresponding to the provided pin - * as close as possible to the provided desired frequency. Internally - * calculates the required waveform generation mode, prescaler and - * resolution values required and sets the timer registers accordingly. - * NOTE that the frequency is applied to all pins on the timer (Ex OC3A, OC3B and OC3B) - * NOTE that there are limitations, particularly if using TIMER2. (see Configuration_adv.h -> FAST FAN PWM Settings) - */ -void set_pwm_frequency(const pin_t pin, int f_desired); - -/** - * set_pwm_duty - * Sets the PWM duty cycle of the provided pin to the provided value - * Optionally allows inverting the duty cycle [default = false] - * Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] - */ -void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false); diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp deleted file mode 100644 index 31e589746c..0000000000 --- a/Marlin/src/HAL/AVR/HAL_SPI.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Adapted from Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman - */ - -/** - * HAL for AVR - SPI functions - */ - -#ifdef __AVR__ - -#include "../../inc/MarlinConfig.h" - -void spiBegin() { - OUT_WRITE(SS_PIN, HIGH); - SET_OUTPUT(SCK_PIN); - SET_INPUT(MISO_PIN); - SET_OUTPUT(MOSI_PIN); - - #if DISABLED(SOFTWARE_SPI) - // SS must be in output mode even it is not chip select - //SET_OUTPUT(SS_PIN); - // set SS high - may be chip select for another SPI device - //#if SET_SPI_SS_HIGH - //WRITE(SS_PIN, HIGH); - //#endif - // set a default rate - spiInit(1); - #endif -} - -#if NONE(SOFTWARE_SPI, FORCE_SOFT_SPI) - - // ------------------------ - // Hardware SPI - // ------------------------ - - // make sure SPCR rate is in expected bits - #if (SPR0 != 0 || SPR1 != 1) - #error "unexpected SPCR bits" - #endif - - /** - * Initialize hardware SPI - * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6] - */ - void spiInit(uint8_t spiRate) { - // See avr processor documentation - CBI( - #ifdef PRR - PRR - #elif defined(PRR0) - PRR0 - #endif - , PRSPI); - - SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1); - SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X); - } - - /** SPI receive a byte */ - uint8_t spiRec() { - SPDR = 0xFF; - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - return SPDR; - } - - /** SPI read data */ - void spiRead(uint8_t* buf, uint16_t nbyte) { - if (nbyte-- == 0) return; - SPDR = 0xFF; - for (uint16_t i = 0; i < nbyte; i++) { - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - buf[i] = SPDR; - SPDR = 0xFF; - } - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - buf[nbyte] = SPDR; - } - - /** SPI send a byte */ - void spiSend(uint8_t b) { - SPDR = b; - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - } - - /** SPI send block */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPDR = token; - for (uint16_t i = 0; i < 512; i += 2) { - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - SPDR = buf[i]; - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - SPDR = buf[i + 1]; - } - while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - } - - - /** begin spi transaction */ - void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - // Based on Arduino SPI library - // Clock settings are defined as follows. Note that this shows SPI2X - // inverted, so the bits form increasing numbers. Also note that - // fosc/64 appears twice - // SPR1 SPR0 ~SPI2X Freq - // 0 0 0 fosc/2 - // 0 0 1 fosc/4 - // 0 1 0 fosc/8 - // 0 1 1 fosc/16 - // 1 0 0 fosc/32 - // 1 0 1 fosc/64 - // 1 1 0 fosc/64 - // 1 1 1 fosc/128 - - // We find the fastest clock that is less than or equal to the - // given clock rate. The clock divider that results in clock_setting - // is 2 ^^ (clock_div + 1). If nothing is slow enough, we'll use the - // slowest (128 == 2 ^^ 7, so clock_div = 6). - uint8_t clockDiv; - - // When the clock is known at compiletime, use this if-then-else - // cascade, which the compiler knows how to completely optimize - // away. When clock is not known, use a loop instead, which generates - // shorter code. - if (__builtin_constant_p(spiClock)) { - if (spiClock >= F_CPU / 2) clockDiv = 0; - else if (spiClock >= F_CPU / 4) clockDiv = 1; - else if (spiClock >= F_CPU / 8) clockDiv = 2; - else if (spiClock >= F_CPU / 16) clockDiv = 3; - else if (spiClock >= F_CPU / 32) clockDiv = 4; - else if (spiClock >= F_CPU / 64) clockDiv = 5; - else clockDiv = 6; - } - else { - uint32_t clockSetting = F_CPU / 2; - clockDiv = 0; - while (clockDiv < 6 && spiClock < clockSetting) { - clockSetting /= 2; - clockDiv++; - } - } - - // Compensate for the duplicate fosc/64 - if (clockDiv == 6) clockDiv = 7; - - // Invert the SPI2X bit - clockDiv ^= 0x1; - - SPCR = _BV(SPE) | _BV(MSTR) | ((bitOrder == LSBFIRST) ? _BV(DORD) : 0) | - (dataMode << CPHA) | ((clockDiv >> 1) << SPR0); - SPSR = clockDiv | 0x01; - } - - -#else // SOFTWARE_SPI || FORCE_SOFT_SPI - - // ------------------------ - // Software SPI - // ------------------------ - - // nop to tune soft SPI timing - #define nop asm volatile ("\tnop\n") - - void spiInit(uint8_t) { /* do nothing */ } - - // Begin SPI transaction, set clock, bit order, data mode - void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { /* do nothing */ } - - // Soft SPI receive byte - uint8_t spiRec() { - uint8_t data = 0; - // no interrupts during byte receive - about 8µs - cli(); - // output pin high - like sending 0xFF - WRITE(MOSI_PIN, HIGH); - - LOOP_L_N(i, 8) { - WRITE(SCK_PIN, HIGH); - - nop; // adjust so SCK is nice - nop; - - data <<= 1; - - if (READ(MISO_PIN)) data |= 1; - - WRITE(SCK_PIN, LOW); - } - - sei(); - return data; - } - - // Soft SPI read data - void spiRead(uint8_t* buf, uint16_t nbyte) { - for (uint16_t i = 0; i < nbyte; i++) - buf[i] = spiRec(); - } - - // Soft SPI send byte - void spiSend(uint8_t data) { - // no interrupts during byte send - about 8µs - cli(); - LOOP_L_N(i, 8) { - WRITE(SCK_PIN, LOW); - WRITE(MOSI_PIN, data & 0x80); - data <<= 1; - WRITE(SCK_PIN, HIGH); - } - - nop; // hold SCK high for a few ns - nop; - nop; - nop; - - WRITE(SCK_PIN, LOW); - - sei(); - } - - // Soft SPI send block - void spiSendBlock(uint8_t token, const uint8_t* buf) { - spiSend(token); - for (uint16_t i = 0; i < 512; i++) - spiSend(buf[i]); - } - -#endif // SOFTWARE_SPI || FORCE_SOFT_SPI - -#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp deleted file mode 100644 index 8feac32aa7..0000000000 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ /dev/null @@ -1,802 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * MarlinSerial.cpp - Hardware serial library for Wiring - * Copyright (c) 2006 Nicholas Zambetti. All right reserved. - * - * Modified 23 November 2006 by David A. Mellis - * Modified 28 September 2010 by Mark Sproul - * Modified 14 February 2016 by Andreas Hardtung (added tx buffer) - * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF) - * Modified 10 June 2018 by Eduardo José Tagle (See #10991) - * Templatized 01 October 2018 by Eduardo José Tagle to allow multiple instances - */ - -#ifdef __AVR__ - -// Disable HardwareSerial.cpp to support chips without a UART (Attiny, etc.) - -#include "../../inc/MarlinConfig.h" - -#if !IS_AT90USB && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) - -#include "MarlinSerial.h" -#include "../../MarlinCore.h" - -#if ENABLED(DIRECT_STEPPING) - #include "../../feature/direct_stepping.h" -#endif - -template typename MarlinSerial::ring_buffer_r MarlinSerial::rx_buffer = { 0, 0, { 0 } }; -template typename MarlinSerial::ring_buffer_t MarlinSerial::tx_buffer = { 0 }; -template bool MarlinSerial::_written = false; -template uint8_t MarlinSerial::xon_xoff_state = MarlinSerial::XON_XOFF_CHAR_SENT | MarlinSerial::XON_CHAR; -template uint8_t MarlinSerial::rx_dropped_bytes = 0; -template uint8_t MarlinSerial::rx_buffer_overruns = 0; -template uint8_t MarlinSerial::rx_framing_errors = 0; -template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::rx_max_enqueued = 0; - -// A SW memory barrier, to ensure GCC does not overoptimize loops -#define sw_barrier() asm volatile("": : :"memory"); - -#include "../../feature/e_parser.h" - -// "Atomically" read the RX head index value without disabling interrupts: -// This MUST be called with RX interrupts enabled, and CAN'T be called -// from the RX ISR itself! -template -FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_head() { - if (Cfg::RX_SIZE > 256) { - // Keep reading until 2 consecutive reads return the same value, - // meaning there was no update in-between caused by an interrupt. - // This works because serial RX interrupts happen at a slower rate - // than successive reads of a variable, so 2 consecutive reads with - // the same value means no interrupt updated it. - ring_buffer_pos_t vold, vnew = rx_buffer.head; - sw_barrier(); - do { - vold = vnew; - vnew = rx_buffer.head; - sw_barrier(); - } while (vold != vnew); - return vnew; - } - else { - // With an 8bit index, reads are always atomic. No need for special handling - return rx_buffer.head; - } -} - -template -volatile bool MarlinSerial::rx_tail_value_not_stable = false; -template -volatile uint16_t MarlinSerial::rx_tail_value_backup = 0; - -// Set RX tail index, taking into account the RX ISR could interrupt -// the write to this variable in the middle - So a backup strategy -// is used to ensure reads of the correct values. -// -Must NOT be called from the RX ISR - -template -FORCE_INLINE void MarlinSerial::atomic_set_rx_tail(typename MarlinSerial::ring_buffer_pos_t value) { - if (Cfg::RX_SIZE > 256) { - // Store the new value in the backup - rx_tail_value_backup = value; - sw_barrier(); - // Flag we are about to change the true value - rx_tail_value_not_stable = true; - sw_barrier(); - // Store the new value - rx_buffer.tail = value; - sw_barrier(); - // Signal the new value is completely stored into the value - rx_tail_value_not_stable = false; - sw_barrier(); - } - else - rx_buffer.tail = value; -} - -// Get the RX tail index, taking into account the read could be -// interrupting in the middle of the update of that index value -// -Called from the RX ISR - -template -FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_tail() { - if (Cfg::RX_SIZE > 256) { - // If the true index is being modified, return the backup value - if (rx_tail_value_not_stable) return rx_tail_value_backup; - } - // The true index is stable, return it - return rx_buffer.tail; -} - -// (called with RX interrupts disabled) -template -FORCE_INLINE void MarlinSerial::store_rxd_char() { - - static EmergencyParser::State emergency_state; // = EP_RESET - - // This must read the R_UCSRA register before reading the received byte to detect error causes - if (Cfg::DROPPED_RX && B_DOR && !++rx_dropped_bytes) --rx_dropped_bytes; - if (Cfg::RX_OVERRUNS && B_DOR && !++rx_buffer_overruns) --rx_buffer_overruns; - if (Cfg::RX_FRAMING_ERRORS && B_FE && !++rx_framing_errors) --rx_framing_errors; - - // Read the character from the USART - uint8_t c = R_UDR; - - #if ENABLED(DIRECT_STEPPING) - if (page_manager.maybe_store_rxd_char(c)) return; - #endif - - // Get the tail - Nothing can alter its value while this ISR is executing, but there's - // a chance that this ISR interrupted the main process while it was updating the index. - // The backup mechanism ensures the correct value is always returned. - const ring_buffer_pos_t t = atomic_read_rx_tail(); - - // Get the head pointer - This ISR is the only one that modifies its value, so it's safe to read here - ring_buffer_pos_t h = rx_buffer.head; - - // Get the next element - ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the RX FIFO is - // full, so don't write the character or advance the head. - if (i != t) { - rx_buffer.buffer[h] = c; - h = i; - } - else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) - --rx_dropped_bytes; - - if (Cfg::MAX_RX_QUEUED) { - // Calculate count of bytes stored into the RX buffer - const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // Keep track of the maximum count of enqueued bytes - NOLESS(rx_max_enqueued, rx_count); - } - - if (Cfg::XONOFF) { - // If the last char that was sent was an XON - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { - - // Bytes stored into the RX buffer - const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // If over 12.5% of RX buffer capacity, send XOFF before running out of - // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react - // and stop sending bytes. This translates to 13mS propagation time. - if (rx_count >= (Cfg::RX_SIZE) / 8) { - - // At this point, definitely no TX interrupt was executing, since the TX ISR can't be preempted. - // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens - // to be in the middle of trying to disable the RX interrupt in the main program, eventually the - // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure - // the sending of the XOFF char is to send it HERE AND NOW. - - // About to send the XOFF char - xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; - - // Wait until the TX register becomes empty and send it - Here there could be a problem - // - While waiting for the TX register to empty, the RX register could receive a new - // character. This must also handle that situation! - while (!B_UDRE) { - - if (B_RXC) { - // A char arrived while waiting for the TX buffer to be empty - Receive and process it! - - i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // Read the character from the USART - c = R_UDR; - - if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the FIFO is - // full, so don't write the character or advance the head. - if (i != t) { - rx_buffer.buffer[h] = c; - h = i; - } - else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) - --rx_dropped_bytes; - } - sw_barrier(); - } - - R_UDR = XOFF_CHAR; - - // Clear the TXC bit -- "can be cleared by writing a one to its bit - // location". This makes sure flush() won't return until the bytes - // actually got written - B_TXC = 1; - - // At this point there could be a race condition between the write() function - // and this sending of the XOFF char. This interrupt could happen between the - // wait to be empty TX buffer loop and the actual write of the character. Since - // the TX buffer is full because it's sending the XOFF char, the only way to be - // sure the write() function will succeed is to wait for the XOFF char to be - // completely sent. Since an extra character could be received during the wait - // it must also be handled! - while (!B_UDRE) { - - if (B_RXC) { - // A char arrived while waiting for the TX buffer to be empty - Receive and process it! - - i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // Read the character from the USART - c = R_UDR; - - if (Cfg::EMERGENCYPARSER) - emergency_parser.update(emergency_state, c); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the FIFO is - // full, so don't write the character or advance the head. - if (i != t) { - rx_buffer.buffer[h] = c; - h = i; - } - else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) - --rx_dropped_bytes; - } - sw_barrier(); - } - - // At this point everything is ready. The write() function won't - // have any issues writing to the UART TX register if it needs to! - } - } - } - - // Store the new head value - The main loop will retry until the value is stable - rx_buffer.head = h; -} - -// (called with TX irqs disabled) -template -FORCE_INLINE void MarlinSerial::_tx_udr_empty_irq() { - if (Cfg::TX_SIZE > 0) { - // Read positions - uint8_t t = tx_buffer.tail; - const uint8_t h = tx_buffer.head; - - if (Cfg::XONOFF) { - // If an XON char is pending to be sent, do it now - if (xon_xoff_state == XON_CHAR) { - - // Send the character - R_UDR = XON_CHAR; - - // clear the TXC bit -- "can be cleared by writing a one to its bit - // location". This makes sure flush() won't return until the bytes - // actually got written - B_TXC = 1; - - // Remember we sent it. - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - - // If nothing else to transmit, just disable TX interrupts. - if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) - - return; - } - } - - // If nothing to transmit, just disable TX interrupts. This could - // happen as the result of the non atomicity of the disabling of RX - // interrupts that could end reenabling TX interrupts as a side effect. - if (h == t) { - B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) - return; - } - - // There is something to TX, Send the next byte - const uint8_t c = tx_buffer.buffer[t]; - t = (t + 1) & (Cfg::TX_SIZE - 1); - R_UDR = c; - tx_buffer.tail = t; - - // Clear the TXC bit (by writing a one to its bit location). - // Ensures flush() won't return until the bytes are actually written/ - B_TXC = 1; - - // Disable interrupts if there is nothing to transmit following this byte - if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) - } -} - -// Public Methods -template -void MarlinSerial::begin(const long baud) { - uint16_t baud_setting; - bool useU2X = true; - - #if F_CPU == 16000000UL && SERIAL_PORT == 0 - // Hard-coded exception for compatibility with the bootloader shipped - // with the Duemilanove and previous boards, and the firmware on the - // 8U2 on the Uno and Mega 2560. - if (baud == 57600) useU2X = false; - #endif - - R_UCSRA = 0; - if (useU2X) { - B_U2X = 1; - baud_setting = (F_CPU / 4 / baud - 1) / 2; - } - else - baud_setting = (F_CPU / 8 / baud - 1) / 2; - - // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) - R_UBRRH = baud_setting >> 8; - R_UBRRL = baud_setting; - - B_RXEN = 1; - B_TXEN = 1; - B_RXCIE = 1; - if (Cfg::TX_SIZE > 0) B_UDRIE = 0; - _written = false; -} - -template -void MarlinSerial::end() { - B_RXEN = 0; - B_TXEN = 0; - B_RXCIE = 0; - B_UDRIE = 0; -} - -template -int MarlinSerial::peek() { - const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; - return h == t ? -1 : rx_buffer.buffer[t]; -} - -template -int MarlinSerial::read() { - const ring_buffer_pos_t h = atomic_read_rx_head(); - - // Read the tail. Main thread owns it, so it is safe to directly read it - ring_buffer_pos_t t = rx_buffer.tail; - - // If nothing to read, return now - if (h == t) return -1; - - // Get the next char - const int v = rx_buffer.buffer[t]; - t = (ring_buffer_pos_t)(t + 1) & (Cfg::RX_SIZE - 1); - - // Advance tail - Making sure the RX ISR will always get an stable value, even - // if it interrupts the writing of the value of that variable in the middle. - atomic_set_rx_tail(t); - - if (Cfg::XONOFF) { - // If the XOFF char was sent, or about to be sent... - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { - // Get count of bytes in the RX buffer - const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - if (rx_count < (Cfg::RX_SIZE) / 10) { - if (Cfg::TX_SIZE > 0) { - // Signal we want an XON character to be sent. - xon_xoff_state = XON_CHAR; - // Enable TX ISR. Non atomic, but it will eventually enable them - B_UDRIE = 1; - } - else { - // If not using TX interrupts, we must send the XON char now - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - while (!B_UDRE) sw_barrier(); - R_UDR = XON_CHAR; - } - } - } - } - - return v; -} - -template -typename MarlinSerial::ring_buffer_pos_t MarlinSerial::available() { - const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; - return (ring_buffer_pos_t)(Cfg::RX_SIZE + h - t) & (Cfg::RX_SIZE - 1); -} - -template -void MarlinSerial::flush() { - - // Set the tail to the head: - // - Read the RX head index in a safe way. (See atomic_read_rx_head.) - // - Set the tail, making sure the RX ISR will always get a stable value, even - // if it interrupts the writing of the value of that variable in the middle. - atomic_set_rx_tail(atomic_read_rx_head()); - - if (Cfg::XONOFF) { - // If the XOFF char was sent, or about to be sent... - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { - if (Cfg::TX_SIZE > 0) { - // Signal we want an XON character to be sent. - xon_xoff_state = XON_CHAR; - // Enable TX ISR. Non atomic, but it will eventually enable it. - B_UDRIE = 1; - } - else { - // If not using TX interrupts, we must send the XON char now - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - while (!B_UDRE) sw_barrier(); - R_UDR = XON_CHAR; - } - } - } -} - -template -void MarlinSerial::write(const uint8_t c) { - if (Cfg::TX_SIZE == 0) { - - _written = true; - while (!B_UDRE) sw_barrier(); - R_UDR = c; - - } - else { - - _written = true; - - // If the TX interrupts are disabled and the data register - // is empty, just write the byte to the data register and - // be done. This shortcut helps significantly improve the - // effective datarate at high (>500kbit/s) bitrates, where - // interrupt overhead becomes a slowdown. - // Yes, there is a race condition between the sending of the - // XOFF char at the RX ISR, but it is properly handled there - if (!B_UDRIE && B_UDRE) { - R_UDR = c; - - // clear the TXC bit -- "can be cleared by writing a one to its bit - // location". This makes sure flush() won't return until the bytes - // actually got written - B_TXC = 1; - return; - } - - const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); - - // If global interrupts are disabled (as the result of being called from an ISR)... - if (!ISRS_ENABLED()) { - - // Make room by polling if it is possible to transmit, and do so! - while (i == tx_buffer.tail) { - - // If we can transmit another byte, do it. - if (B_UDRE) _tx_udr_empty_irq(); - - // Make sure compiler rereads tx_buffer.tail - sw_barrier(); - } - } - else { - // Interrupts are enabled, just wait until there is space - while (i == tx_buffer.tail) sw_barrier(); - } - - // Store new char. head is always safe to move - tx_buffer.buffer[tx_buffer.head] = c; - tx_buffer.head = i; - - // Enable TX ISR - Non atomic, but it will eventually enable TX ISR - B_UDRIE = 1; - } -} - -template -void MarlinSerial::flushTX() { - - if (Cfg::TX_SIZE == 0) { - // No bytes written, no need to flush. This special case is needed since there's - // no way to force the TXC (transmit complete) bit to 1 during initialization. - if (!_written) return; - - // Wait until everything was transmitted - while (!B_TXC) sw_barrier(); - - // At this point nothing is queued anymore (DRIE is disabled) and - // the hardware finished transmission (TXC is set). - - } - else { - - // No bytes written, no need to flush. This special case is needed since there's - // no way to force the TXC (transmit complete) bit to 1 during initialization. - if (!_written) return; - - // If global interrupts are disabled (as the result of being called from an ISR)... - if (!ISRS_ENABLED()) { - - // Wait until everything was transmitted - We must do polling, as interrupts are disabled - while (tx_buffer.head != tx_buffer.tail || !B_TXC) { - - // If there is more space, send an extra character - if (B_UDRE) _tx_udr_empty_irq(); - - sw_barrier(); - } - - } - else { - // Wait until everything was transmitted - while (tx_buffer.head != tx_buffer.tail || !B_TXC) sw_barrier(); - } - - // At this point nothing is queued anymore (DRIE is disabled) and - // the hardware finished transmission (TXC is set). - } -} - -/** - * Imports from print.h - */ - -template -void MarlinSerial::print(char c, int base) { - print((long)c, base); -} - -template -void MarlinSerial::print(unsigned char b, int base) { - print((unsigned long)b, base); -} - -template -void MarlinSerial::print(int n, int base) { - print((long)n, base); -} - -template -void MarlinSerial::print(unsigned int n, int base) { - print((unsigned long)n, base); -} - -template -void MarlinSerial::print(long n, int base) { - if (base == 0) write(n); - else if (base == 10) { - if (n < 0) { print('-'); n = -n; } - printNumber(n, 10); - } - else - printNumber(n, base); -} - -template -void MarlinSerial::print(unsigned long n, int base) { - if (base == 0) write(n); - else printNumber(n, base); -} - -template -void MarlinSerial::print(double n, int digits) { - printFloat(n, digits); -} - -template -void MarlinSerial::println() { - print('\r'); - print('\n'); -} - -template -void MarlinSerial::println(const String& s) { - print(s); - println(); -} - -template -void MarlinSerial::println(const char c[]) { - print(c); - println(); -} - -template -void MarlinSerial::println(char c, int base) { - print(c, base); - println(); -} - -template -void MarlinSerial::println(unsigned char b, int base) { - print(b, base); - println(); -} - -template -void MarlinSerial::println(int n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(unsigned int n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(long n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(unsigned long n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(double n, int digits) { - print(n, digits); - println(); -} - -// Private Methods - -template -void MarlinSerial::printNumber(unsigned long n, uint8_t base) { - if (n) { - unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 - int8_t i = 0; - while (n) { - buf[i++] = n % base; - n /= base; - } - while (i--) - print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); - } - else - print('0'); -} - -template -void MarlinSerial::printFloat(double number, uint8_t digits) { - // Handle negative numbers - if (number < 0.0) { - print('-'); - number = -number; - } - - // Round correctly so that print(1.999, 2) prints as "2.00" - double rounding = 0.5; - LOOP_L_N(i, digits) rounding *= 0.1; - number += rounding; - - // Extract the integer part of the number and print it - unsigned long int_part = (unsigned long)number; - double remainder = number - (double)int_part; - print(int_part); - - // Print the decimal point, but only if there are digits beyond - if (digits) { - print('.'); - // Extract digits from the remainder one at a time - while (digits--) { - remainder *= 10.0; - int toPrint = int(remainder); - print(toPrint); - remainder -= toPrint; - } - } -} - -// Hookup ISR handlers -ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) { - MarlinSerial>::store_rxd_char(); -} - -ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) { - MarlinSerial>::_tx_udr_empty_irq(); -} - -// Preinstantiate -template class MarlinSerial>; - -// Instantiate -MarlinSerial> customizedSerial1; - -#ifdef SERIAL_PORT_2 - - // Hookup ISR handlers - ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _RX_vect)) { - MarlinSerial>::store_rxd_char(); - } - - ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _UDRE_vect)) { - MarlinSerial>::_tx_udr_empty_irq(); - } - - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> customizedSerial2; - -#endif - -#ifdef MMU2_SERIAL_PORT - - ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _RX_vect)) { - MarlinSerial>::store_rxd_char(); - } - - ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _UDRE_vect)) { - MarlinSerial>::_tx_udr_empty_irq(); - } - - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> mmuSerial; - -#endif - -#ifdef LCD_SERIAL_PORT - - ISR(SERIAL_REGNAME(USART, LCD_SERIAL_PORT, _RX_vect)) { - MarlinSerial>::store_rxd_char(); - } - - ISR(SERIAL_REGNAME(USART, LCD_SERIAL_PORT, _UDRE_vect)) { - MarlinSerial>::_tx_udr_empty_irq(); - } - - // Preinstantiate - template class MarlinSerial>; - - // Instantiate - MarlinSerial> lcdSerial; - - #if HAS_DGUS_LCD - template - typename MarlinSerial::ring_buffer_pos_t MarlinSerial::get_tx_buffer_free() { - const ring_buffer_pos_t t = tx_buffer.tail, // next byte to send. - h = tx_buffer.head; // next pos for queue. - int ret = t - h - 1; - if (ret < 0) ret += Cfg::TX_SIZE + 1; - return ret; - } - #endif - -#endif - -#endif // !IS_AT90USB && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) - -// For AT90USB targets use the UART for BT interfacing -#if BOTH(IS_AT90USB, BLUETOOTH) - HardwareSerial bluetoothSerial; -#endif - -#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h deleted file mode 100644 index 3850e2a47e..0000000000 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ /dev/null @@ -1,332 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MarlinSerial.h - Hardware serial library for Wiring - * Copyright (c) 2006 Nicholas Zambetti. All right reserved. - * - * Modified 28 September 2010 by Mark Sproul - * Modified 14 February 2016 by Andreas Hardtung (added tx buffer) - * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF) - * Templatized 01 October 2018 by Eduardo José Tagle to allow multiple instances - */ - -#include - -#include "../../inc/MarlinConfigPre.h" - -#ifndef SERIAL_PORT - #define SERIAL_PORT 0 -#endif - -#ifndef USBCON - - // The presence of the UBRRH register is used to detect a UART. - #define UART_PRESENT(port) ((port == 0 && (defined(UBRRH) || defined(UBRR0H))) || \ - (port == 1 && defined(UBRR1H)) || (port == 2 && defined(UBRR2H)) || \ - (port == 3 && defined(UBRR3H))) - - // These are macros to build serial port register names for the selected SERIAL_PORT (C preprocessor - // requires two levels of indirection to expand macro values properly) - #define SERIAL_REGNAME(registerbase,number,suffix) _SERIAL_REGNAME(registerbase,number,suffix) - #if SERIAL_PORT == 0 && (!defined(UBRR0H) || !defined(UDR0)) // use un-numbered registers if necessary - #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##suffix - #else - #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##number##suffix - #endif - - // Registers used by MarlinSerial class (expanded depending on selected serial port) - - // Templated 8bit register (generic) - #define UART_REGISTER_DECL_BASE(registerbase, suffix) \ - template struct R_##registerbase##x##suffix {} - - // Templated 8bit register (specialization for each port) - #define UART_REGISTER_DECL(port, registerbase, suffix) \ - template<> struct R_##registerbase##x##suffix { \ - constexpr R_##registerbase##x##suffix(int) {} \ - FORCE_INLINE void operator=(uint8_t newVal) const { SERIAL_REGNAME(registerbase,port,suffix) = newVal; } \ - FORCE_INLINE operator uint8_t() const { return SERIAL_REGNAME(registerbase,port,suffix); } \ - } - - // Templated 1bit register (generic) - #define UART_BIT_DECL_BASE(registerbase, suffix, bit) \ - templatestruct B_##bit##x {} - - // Templated 1bit register (specialization for each port) - #define UART_BIT_DECL(port, registerbase, suffix, bit) \ - template<> struct B_##bit##x { \ - constexpr B_##bit##x(int) {} \ - FORCE_INLINE void operator=(int newVal) const { \ - if (newVal) \ - SBI(SERIAL_REGNAME(registerbase,port,suffix),SERIAL_REGNAME(bit,port,)); \ - else \ - CBI(SERIAL_REGNAME(registerbase,port,suffix),SERIAL_REGNAME(bit,port,)); \ - } \ - FORCE_INLINE operator bool() const { return TEST(SERIAL_REGNAME(registerbase,port,suffix),SERIAL_REGNAME(bit,port,)); } \ - } - - #define UART_DECL_BASE() \ - UART_REGISTER_DECL_BASE(UCSR,A);\ - UART_REGISTER_DECL_BASE(UDR,);\ - UART_REGISTER_DECL_BASE(UBRR,H);\ - UART_REGISTER_DECL_BASE(UBRR,L);\ - UART_BIT_DECL_BASE(UCSR,B,RXEN);\ - UART_BIT_DECL_BASE(UCSR,B,TXEN);\ - UART_BIT_DECL_BASE(UCSR,A,TXC);\ - UART_BIT_DECL_BASE(UCSR,B,RXCIE);\ - UART_BIT_DECL_BASE(UCSR,A,UDRE);\ - UART_BIT_DECL_BASE(UCSR,A,FE);\ - UART_BIT_DECL_BASE(UCSR,A,DOR);\ - UART_BIT_DECL_BASE(UCSR,B,UDRIE);\ - UART_BIT_DECL_BASE(UCSR,A,RXC);\ - UART_BIT_DECL_BASE(UCSR,A,U2X) - - #define UART_DECL(port) \ - UART_REGISTER_DECL(port,UCSR,A);\ - UART_REGISTER_DECL(port,UDR,);\ - UART_REGISTER_DECL(port,UBRR,H);\ - UART_REGISTER_DECL(port,UBRR,L);\ - UART_BIT_DECL(port,UCSR,B,RXEN);\ - UART_BIT_DECL(port,UCSR,B,TXEN);\ - UART_BIT_DECL(port,UCSR,A,TXC);\ - UART_BIT_DECL(port,UCSR,B,RXCIE);\ - UART_BIT_DECL(port,UCSR,A,UDRE);\ - UART_BIT_DECL(port,UCSR,A,FE);\ - UART_BIT_DECL(port,UCSR,A,DOR);\ - UART_BIT_DECL(port,UCSR,B,UDRIE);\ - UART_BIT_DECL(port,UCSR,A,RXC);\ - UART_BIT_DECL(port,UCSR,A,U2X) - - // Declare empty templates - UART_DECL_BASE(); - - // And all the specializations for each possible serial port - #if UART_PRESENT(0) - UART_DECL(0); - #endif - #if UART_PRESENT(1) - UART_DECL(1); - #endif - #if UART_PRESENT(2) - UART_DECL(2); - #endif - #if UART_PRESENT(3) - UART_DECL(3); - #endif - - #define DEC 10 - #define HEX 16 - #define OCT 8 - #define BIN 2 - #define BYTE 0 - - // Templated type selector - template struct TypeSelector { typedef T type;} ; - template struct TypeSelector { typedef F type; }; - - template - class MarlinSerial { - protected: - // Registers - static constexpr R_UCSRxA R_UCSRA = 0; - static constexpr R_UDRx R_UDR = 0; - static constexpr R_UBRRxH R_UBRRH = 0; - static constexpr R_UBRRxL R_UBRRL = 0; - - // Bits - static constexpr B_RXENx B_RXEN = 0; - static constexpr B_TXENx B_TXEN = 0; - static constexpr B_TXCx B_TXC = 0; - static constexpr B_RXCIEx B_RXCIE = 0; - static constexpr B_UDREx B_UDRE = 0; - static constexpr B_FEx B_FE = 0; - static constexpr B_DORx B_DOR = 0; - static constexpr B_UDRIEx B_UDRIE = 0; - static constexpr B_RXCx B_RXC = 0; - static constexpr B_U2Xx B_U2X = 0; - - // Base size of type on buffer size - typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t; - - struct ring_buffer_r { - volatile ring_buffer_pos_t head, tail; - unsigned char buffer[Cfg::RX_SIZE]; - }; - - struct ring_buffer_t { - volatile uint8_t head, tail; - unsigned char buffer[Cfg::TX_SIZE]; - }; - - static ring_buffer_r rx_buffer; - static ring_buffer_t tx_buffer; - static bool _written; - - static constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent - XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send - - // XON / XOFF character definitions - static constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19; - static uint8_t xon_xoff_state, - rx_dropped_bytes, - rx_buffer_overruns, - rx_framing_errors; - static ring_buffer_pos_t rx_max_enqueued; - - static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_head(); - - static volatile bool rx_tail_value_not_stable; - static volatile uint16_t rx_tail_value_backup; - - static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value); - static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail(); - - public: - - FORCE_INLINE static void store_rxd_char(); - FORCE_INLINE static void _tx_udr_empty_irq(); - - public: - MarlinSerial() {}; - static void begin(const long); - static void end(); - static int peek(); - static int read(); - static void flush(); - static ring_buffer_pos_t available(); - static void write(const uint8_t c); - static void flushTX(); - #if HAS_DGUS_LCD - static ring_buffer_pos_t get_tx_buffer_free(); - #endif - - static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } - - FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } - FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } - FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } - FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; } - - FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } - FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } - FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } - FORCE_INLINE static void print(const char* str) { write(str); } - - static void print(char, int = BYTE); - static void print(unsigned char, int = BYTE); - static void print(int, int = DEC); - static void print(unsigned int, int = DEC); - static void print(long, int = DEC); - static void print(unsigned long, int = DEC); - static void print(double, int = 2); - - static void println(const String& s); - static void println(const char[]); - static void println(char, int = BYTE); - static void println(unsigned char, int = BYTE); - static void println(int, int = DEC); - static void println(unsigned int, int = DEC); - static void println(long, int = DEC); - static void println(unsigned long, int = DEC); - static void println(double, int = 2); - static void println(); - operator bool() { return true; } - - private: - static void printNumber(unsigned long, const uint8_t); - static void printFloat(double, uint8_t); - }; - - template - struct MarlinSerialCfg { - static constexpr int PORT = serial; - static constexpr unsigned int RX_SIZE = RX_BUFFER_SIZE; - static constexpr unsigned int TX_SIZE = TX_BUFFER_SIZE; - static constexpr bool XONOFF = ENABLED(SERIAL_XON_XOFF); - static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); - static constexpr bool DROPPED_RX = ENABLED(SERIAL_STATS_DROPPED_RX); - static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); - static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS); - static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); - }; - extern MarlinSerial> customizedSerial1; - - #ifdef SERIAL_PORT_2 - - extern MarlinSerial> customizedSerial2; - - #endif - -#endif // !USBCON - -#ifdef MMU2_SERIAL_PORT - template - struct MMU2SerialCfg { - static constexpr int PORT = serial; - static constexpr bool XONOFF = false; - static constexpr bool EMERGENCYPARSER = false; - static constexpr bool DROPPED_RX = false; - static constexpr bool RX_FRAMING_ERRORS = false; - static constexpr bool MAX_RX_QUEUED = false; - static constexpr unsigned int RX_SIZE = 32; - static constexpr unsigned int TX_SIZE = 32; - static constexpr bool RX_OVERRUNS = false; - }; - - extern MarlinSerial> mmuSerial; -#endif - -#ifdef LCD_SERIAL_PORT - - template - struct LCDSerialCfg { - static constexpr int PORT = serial; - static constexpr bool XONOFF = false; - static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); - static constexpr bool DROPPED_RX = false; - static constexpr bool RX_FRAMING_ERRORS = false; - static constexpr bool MAX_RX_QUEUED = false; - #if HAS_DGUS_LCD - static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE; - static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE; - static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); - #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - static constexpr unsigned int RX_SIZE = 64; - static constexpr unsigned int TX_SIZE = 128; - static constexpr bool RX_OVERRUNS = false; - #else - static constexpr unsigned int RX_SIZE = 64; - static constexpr unsigned int TX_SIZE = 128; - static constexpr bool RX_OVERRUNS = false - #endif - }; - - extern MarlinSerial> lcdSerial; - -#endif - -// Use the UART for Bluetooth in AT90USB configurations -#if BOTH(IS_AT90USB, BLUETOOTH) - extern HardwareSerial bluetoothSerial; -#endif diff --git a/Marlin/src/HAL/AVR/Servo.cpp b/Marlin/src/HAL/AVR/Servo.cpp deleted file mode 100644 index 526352b773..0000000000 --- a/Marlin/src/HAL/AVR/Servo.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 - * Copyright (c) 2009 Michael Margolis. All right reserved. - */ - -/** - * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. - * The servos are pulsed in the background using the value most recently written using the write() method - * - * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. - * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. - * - * The methods are: - * - * Servo - Class for manipulating servo motors connected to Arduino pins. - * - * attach(pin) - Attach a servo motor to an i/o pin. - * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds - * Default min is 544, max is 2400 - * - * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) - * writeMicroseconds() - Set the servo pulse width in microseconds. - * move(pin, angle) - Sequence of attach(pin), write(angle), safe_delay(servo_delay[servoIndex]). - * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after servo_delay[servoIndex]. - * read() - Get the last-written servo pulse width as an angle between 0 and 180. - * readMicroseconds() - Get the last-written servo pulse width in microseconds. - * attached() - Return true if a servo is attached. - * detach() - Stop an attached servo from pulsing its i/o pin. - */ - -#ifdef __AVR__ - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include - -#include "../shared/servo.h" -#include "../shared/servo_private.h" - -static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) - - -/************ static functions common to all instances ***********************/ - -static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) { - if (Channel[timer] < 0) - *TCNTn = 0; // channel set to -1 indicated that refresh interval completed so reset the timer - else { - if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive) - extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated - } - - Channel[timer]++; // increment to the next channel - if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { - *OCRnA = *TCNTn + SERVO(timer, Channel[timer]).ticks; - if (SERVO(timer, Channel[timer]).Pin.isActive) // check if activated - extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // it's an active channel so pulse it high - } - else { - // finished all channels so wait for the refresh period to expire before starting over - if (((unsigned)*TCNTn) + 4 < usToTicks(REFRESH_INTERVAL)) // allow a few ticks to ensure the next OCR1A not missed - *OCRnA = (unsigned int)usToTicks(REFRESH_INTERVAL); - else - *OCRnA = *TCNTn + 4; // at least REFRESH_INTERVAL has elapsed - Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel - } -} - -#ifndef WIRING // Wiring pre-defines signal handlers so don't define any if compiling for the Wiring platform - - // Interrupt handlers for Arduino - #ifdef _useTimer1 - SIGNAL(TIMER1_COMPA_vect) { handle_interrupts(_timer1, &TCNT1, &OCR1A); } - #endif - - #ifdef _useTimer3 - SIGNAL(TIMER3_COMPA_vect) { handle_interrupts(_timer3, &TCNT3, &OCR3A); } - #endif - - #ifdef _useTimer4 - SIGNAL(TIMER4_COMPA_vect) { handle_interrupts(_timer4, &TCNT4, &OCR4A); } - #endif - - #ifdef _useTimer5 - SIGNAL(TIMER5_COMPA_vect) { handle_interrupts(_timer5, &TCNT5, &OCR5A); } - #endif - -#else // WIRING - - // Interrupt handlers for Wiring - #ifdef _useTimer1 - void Timer1Service() { handle_interrupts(_timer1, &TCNT1, &OCR1A); } - #endif - #ifdef _useTimer3 - void Timer3Service() { handle_interrupts(_timer3, &TCNT3, &OCR3A); } - #endif - -#endif // WIRING - -/****************** end of static functions ******************************/ - -void initISR(timer16_Sequence_t timer) { - #ifdef _useTimer1 - if (timer == _timer1) { - TCCR1A = 0; // normal counting mode - TCCR1B = _BV(CS11); // set prescaler of 8 - TCNT1 = 0; // clear the timer count - #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__) - SBI(TIFR, OCF1A); // clear any pending interrupts; - SBI(TIMSK, OCIE1A); // enable the output compare interrupt - #else - // here if not ATmega8 or ATmega128 - SBI(TIFR1, OCF1A); // clear any pending interrupts; - SBI(TIMSK1, OCIE1A); // enable the output compare interrupt - #endif - #ifdef WIRING - timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service); - #endif - } - #endif - - #ifdef _useTimer3 - if (timer == _timer3) { - TCCR3A = 0; // normal counting mode - TCCR3B = _BV(CS31); // set prescaler of 8 - TCNT3 = 0; // clear the timer count - #ifdef __AVR_ATmega128__ - SBI(TIFR, OCF3A); // clear any pending interrupts; - SBI(ETIMSK, OCIE3A); // enable the output compare interrupt - #else - SBI(TIFR3, OCF3A); // clear any pending interrupts; - SBI(TIMSK3, OCIE3A); // enable the output compare interrupt - #endif - #ifdef WIRING - timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only - #endif - } - #endif - - #ifdef _useTimer4 - if (timer == _timer4) { - TCCR4A = 0; // normal counting mode - TCCR4B = _BV(CS41); // set prescaler of 8 - TCNT4 = 0; // clear the timer count - TIFR4 = _BV(OCF4A); // clear any pending interrupts; - TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt - } - #endif - - #ifdef _useTimer5 - if (timer == _timer5) { - TCCR5A = 0; // normal counting mode - TCCR5B = _BV(CS51); // set prescaler of 8 - TCNT5 = 0; // clear the timer count - TIFR5 = _BV(OCF5A); // clear any pending interrupts; - TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt - } - #endif -} - -void finISR(timer16_Sequence_t timer) { - // Disable use of the given timer - #ifdef WIRING - if (timer == _timer1) { - CBI( - #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) - TIMSK1 - #else - TIMSK - #endif - , OCIE1A); // disable timer 1 output compare interrupt - timerDetach(TIMER1OUTCOMPAREA_INT); - } - else if (timer == _timer3) { - CBI( - #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) - TIMSK3 - #else - ETIMSK - #endif - , OCIE3A); // disable the timer3 output compare A interrupt - timerDetach(TIMER3OUTCOMPAREA_INT); - } - #else // !WIRING - // For arduino - in future: call here to a currently undefined function to reset the timer - UNUSED(timer); - #endif -} - -#endif // HAS_SERVOS - -#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/ServoTimers.h b/Marlin/src/HAL/AVR/ServoTimers.h deleted file mode 100644 index 436b28141f..0000000000 --- a/Marlin/src/HAL/AVR/ServoTimers.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * ServoTimers.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 - * Copyright (c) 2009 Michael Margolis. All right reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * Defines for 16 bit timers used with Servo library - * - * If _useTimerX is defined then TimerX is a 16 bit timer on the current board - * timer16_Sequence_t enumerates the sequence that the timers should be allocated - * _Nbr_16timers indicates how many 16 bit timers are available. - */ - -/** - * AVR Only definitions - * -------------------- - */ - -#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays -#define SERVO_TIMER_PRESCALER 8 // timer prescaler - -// Say which 16 bit timers can be used and in what order -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - //#define _useTimer1 - #define _useTimer4 - #if NUM_SERVOS > SERVOS_PER_TIMER - #define _useTimer3 - #if !HAS_MOTOR_CURRENT_PWM && SERVOS > 2 * SERVOS_PER_TIMER - #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. - #endif - #endif -#elif defined(__AVR_ATmega32U4__) - #define _useTimer3 -#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) - #define _useTimer3 -#elif defined(__AVR_ATmega128__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega2561__) - #define _useTimer3 -#else - // everything else -#endif - -typedef enum { - #ifdef _useTimer1 - _timer1, - #endif - #ifdef _useTimer3 - _timer3, - #endif - #ifdef _useTimer4 - _timer4, - #endif - #ifdef _useTimer5 - _timer5, - #endif - _Nbr_16timers -} timer16_Sequence_t; diff --git a/Marlin/src/HAL/AVR/eeprom.cpp b/Marlin/src/HAL/AVR/eeprom.cpp deleted file mode 100644 index c7906985eb..0000000000 --- a/Marlin/src/HAL/AVR/eeprom.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __AVR__ - -#include "../../inc/MarlinConfig.h" - -#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) - -/** - * PersistentStore for Arduino-style EEPROM interface - * with implementations supplied by the framework. - */ - -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(E2END + 1) -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } -bool PersistentStore::access_start() { return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; // always assume success for AVR's -} - -#endif // EEPROM_SETTINGS || SD_FIRMWARE_UPDATE -#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/endstop_interrupts.h b/Marlin/src/HAL/AVR/endstop_interrupts.h deleted file mode 100644 index ae9a605acc..0000000000 --- a/Marlin/src/HAL/AVR/endstop_interrupts.h +++ /dev/null @@ -1,261 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Endstop Interrupts - * - * Without endstop interrupts the endstop pins must be polled continually in - * the temperature-ISR via endstops.update(), most of the time finding no change. - * With this feature endstops.update() is called only when we know that at - * least one endstop has changed state, saving valuable CPU cycles. - * - * This feature only works when all used endstop pins can generate either an - * 'external interrupt' or a 'pin change interrupt'. - * - * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. - * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) - */ - -#include "../../module/endstops.h" - -#include - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -/** - * Patch for pins_arduino.h (...\Arduino\hardware\arduino\avr\variants\mega\pins_arduino.h) - * - * These macros for the Arduino MEGA do not include the two connected pins on Port J (D14, D15). - * So we extend them here because these are the normal pins for Y_MIN and Y_MAX on RAMPS. - * There are more PCI-enabled processor pins on Port J, but they are not connected to Arduino MEGA. - */ -#if defined(ARDUINO_AVR_MEGA2560) || defined(ARDUINO_AVR_MEGA) - - #define digitalPinHasPCICR(p) (WITHIN(p, 10, 15) || WITHIN(p, 50, 53) || WITHIN(p, 62, 69)) - - #undef digitalPinToPCICR - #define digitalPinToPCICR(p) (digitalPinHasPCICR(p) ? (&PCICR) : nullptr) - - #undef digitalPinToPCICRbit - #define digitalPinToPCICRbit(p) (WITHIN(p, 10, 13) || WITHIN(p, 50, 53) ? 0 : \ - WITHIN(p, 14, 15) ? 1 : \ - WITHIN(p, 62, 69) ? 2 : \ - 0) - - #undef digitalPinToPCMSK - #define digitalPinToPCMSK(p) (WITHIN(p, 10, 13) || WITHIN(p, 50, 53) ? (&PCMSK0) : \ - WITHIN(p, 14, 15) ? (&PCMSK1) : \ - WITHIN(p, 62, 69) ? (&PCMSK2) : \ - nullptr) - - #undef digitalPinToPCMSKbit - #define digitalPinToPCMSKbit(p) (WITHIN(p, 10, 13) ? ((p) - 6) : \ - (p) == 14 || (p) == 51 ? 2 : \ - (p) == 15 || (p) == 52 ? 1 : \ - (p) == 50 ? 3 : \ - (p) == 53 ? 0 : \ - WITHIN(p, 62, 69) ? ((p) - 62) : \ - 0) - -#elif defined(__AVR_ATmega164A__) || defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324A__) || \ - defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega324PB__) || \ - defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || \ - defined(__AVR_ATmega1284P__) - - #define digitalPinHasPCICR(p) WITHIN(p, 0, NUM_DIGITAL_PINS) - -#else - - #error "Unsupported AVR variant!" - -#endif - - -// Install Pin change interrupt for a pin. Can be called multiple times. -void pciSetup(const int8_t pin) { - if (digitalPinHasPCICR(pin)) { - SBI(*digitalPinToPCMSK(pin), digitalPinToPCMSKbit(pin)); // enable pin - SBI(PCIFR, digitalPinToPCICRbit(pin)); // clear any outstanding interrupt - SBI(PCICR, digitalPinToPCICRbit(pin)); // enable interrupt for the group - } -} - -// Handlers for pin change interrupts -#ifdef PCINT0_vect - ISR(PCINT0_vect) { endstop_ISR(); } -#endif - -#ifdef PCINT1_vect - ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect)); -#endif - -#ifdef PCINT2_vect - ISR(PCINT2_vect, ISR_ALIASOF(PCINT0_vect)); -#endif - -#ifdef PCINT3_vect - ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect)); -#endif - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - #if HAS_X_MAX - #if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT) - _ATTACH(X_MAX_PIN); - #else - static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable"); - pciSetup(X_MAX_PIN); - #endif - #endif - #if HAS_X_MIN - #if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT) - _ATTACH(X_MIN_PIN); - #else - static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable"); - pciSetup(X_MIN_PIN); - #endif - #endif - #if HAS_Y_MAX - #if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Y_MAX_PIN); - #else - static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable"); - pciSetup(Y_MAX_PIN); - #endif - #endif - #if HAS_Y_MIN - #if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Y_MIN_PIN); - #else - static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable"); - pciSetup(Y_MIN_PIN); - #endif - #endif - #if HAS_Z_MAX - #if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Z_MAX_PIN); - #else - static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable"); - pciSetup(Z_MAX_PIN); - #endif - #endif - #if HAS_Z_MIN - #if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Z_MIN_PIN); - #else - static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable"); - pciSetup(Z_MIN_PIN); - #endif - #endif - #if HAS_X2_MAX - #if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT) - _ATTACH(X2_MAX_PIN); - #else - static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable"); - pciSetup(X2_MAX_PIN); - #endif - #endif - #if HAS_X2_MIN - #if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT) - _ATTACH(X2_MIN_PIN); - #else - static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable"); - pciSetup(X2_MIN_PIN); - #endif - #endif - #if HAS_Y2_MAX - #if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Y2_MAX_PIN); - #else - static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable"); - pciSetup(Y2_MAX_PIN); - #endif - #endif - #if HAS_Y2_MIN - #if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Y2_MIN_PIN); - #else - static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable"); - pciSetup(Y2_MIN_PIN); - #endif - #endif - #if HAS_Z2_MAX - #if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Z2_MAX_PIN); - #else - static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable"); - pciSetup(Z2_MAX_PIN); - #endif - #endif - #if HAS_Z2_MIN - #if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Z2_MIN_PIN); - #else - static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable"); - pciSetup(Z2_MIN_PIN); - #endif - #endif - #if HAS_Z3_MAX - #if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Z3_MAX_PIN); - #else - static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable"); - pciSetup(Z3_MAX_PIN); - #endif - #endif - #if HAS_Z3_MIN - #if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Z3_MIN_PIN); - #else - static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable"); - pciSetup(Z3_MIN_PIN); - #endif - #endif - #if HAS_Z4_MAX - #if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Z4_MAX_PIN); - #else - static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable"); - pciSetup(Z4_MAX_PIN); - #endif - #endif - #if HAS_Z4_MIN - #if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Z4_MIN_PIN); - #else - static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable"); - pciSetup(Z4_MIN_PIN); - #endif - #endif - #if HAS_Z_MIN_PROBE_PIN - #if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT) - _ATTACH(Z_MIN_PROBE_PIN); - #else - static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable"); - pciSetup(Z_MIN_PROBE_PIN); - #endif - #endif - - // If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI. -} diff --git a/Marlin/src/HAL/AVR/fast_pwm.cpp b/Marlin/src/HAL/AVR/fast_pwm.cpp deleted file mode 100644 index 238c1124ad..0000000000 --- a/Marlin/src/HAL/AVR/fast_pwm.cpp +++ /dev/null @@ -1,282 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __AVR__ - -#include "../../inc/MarlinConfigPre.h" - -#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM - -#include "HAL.h" - -struct Timer { - volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer - volatile uint16_t* OCRnQ[3]; // max 3 OCR registers per timer - volatile uint16_t* ICRn; // max 1 ICR register per timer - uint8_t n; // the timer number [0->5] - uint8_t q; // the timer output [0->2] (A->C) -}; - -/** - * get_pwm_timer - * Get the timer information and register of the provided pin. - * Return a Timer struct containing this information. - * Used by set_pwm_frequency, set_pwm_duty - */ -Timer get_pwm_timer(const pin_t pin) { - uint8_t q = 0; - switch (digitalPinToTimer(pin)) { - // Protect reserved timers (TIMER0 & TIMER1) - #ifdef TCCR0A - #if !AVR_AT90USB1286_FAMILY - case TIMER0A: - #endif - case TIMER0B: - #endif - #ifdef TCCR1A - case TIMER1A: case TIMER1B: - #endif - break; - #if defined(TCCR2) || defined(TCCR2A) - #ifdef TCCR2 - case TIMER2: { - Timer timer = { - /*TCCRnQ*/ { &TCCR2, nullptr, nullptr }, - /*OCRnQ*/ { (uint16_t*)&OCR2, nullptr, nullptr }, - /*ICRn*/ nullptr, - /*n, q*/ 2, 0 - }; - } - #elif defined(TCCR2A) - #if ENABLED(USE_OCR2A_AS_TOP) - case TIMER2A: break; // protect TIMER2A - case TIMER2B: { - Timer timer = { - /*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr }, - /*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, - /*ICRn*/ nullptr, - /*n, q*/ 2, 1 - }; - return timer; - } - #else - case TIMER2B: ++q; - case TIMER2A: { - Timer timer = { - /*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr }, - /*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, - /*ICRn*/ nullptr, - 2, q - }; - return timer; - } - #endif - #endif - #endif - #ifdef OCR3C - case TIMER3C: ++q; - case TIMER3B: ++q; - case TIMER3A: { - Timer timer = { - /*TCCRnQ*/ { &TCCR3A, &TCCR3B, &TCCR3C }, - /*OCRnQ*/ { &OCR3A, &OCR3B, &OCR3C }, - /*ICRn*/ &ICR3, - /*n, q*/ 3, q - }; - return timer; - } - #elif defined(OCR3B) - case TIMER3B: ++q; - case TIMER3A: { - Timer timer = { - /*TCCRnQ*/ { &TCCR3A, &TCCR3B, nullptr }, - /*OCRnQ*/ { &OCR3A, &OCR3B, nullptr }, - /*ICRn*/ &ICR3, - /*n, q*/ 3, q - }; - return timer; - } - #endif - #ifdef TCCR4A - case TIMER4C: ++q; - case TIMER4B: ++q; - case TIMER4A: { - Timer timer = { - /*TCCRnQ*/ { &TCCR4A, &TCCR4B, &TCCR4C }, - /*OCRnQ*/ { &OCR4A, &OCR4B, &OCR4C }, - /*ICRn*/ &ICR4, - /*n, q*/ 4, q - }; - return timer; - } - #endif - #ifdef TCCR5A - case TIMER5C: ++q; - case TIMER5B: ++q; - case TIMER5A: { - Timer timer = { - /*TCCRnQ*/ { &TCCR5A, &TCCR5B, &TCCR5C }, - /*OCRnQ*/ { &OCR5A, &OCR5B, &OCR5C }, - /*ICRn*/ &ICR5, - /*n, q*/ 5, q - }; - return timer; - } - #endif - } - Timer timer = { - /*TCCRnQ*/ { nullptr, nullptr, nullptr }, - /*OCRnQ*/ { nullptr, nullptr, nullptr }, - /*ICRn*/ nullptr, - 0, 0 - }; - return timer; -} - -void set_pwm_frequency(const pin_t pin, int f_desired) { - Timer timer = get_pwm_timer(pin); - if (timer.n == 0) return; // Don't proceed if protected timer or not recognised - uint16_t size; - if (timer.n == 2) size = 255; else size = 65535; - - uint16_t res = 255; // resolution (TOP value) - uint8_t j = 0; // prescaler index - uint8_t wgm = 1; // waveform generation mode - - // Calculating the prescaler and resolution to use to achieve closest frequency - if (f_desired != 0) { - int f = (F_CPU) / (2 * 1024 * size) + 1; // Initialize frequency as lowest (non-zero) achievable - uint16_t prescaler[] = { 0, 1, 8, /*TIMER2 ONLY*/32, 64, /*TIMER2 ONLY*/128, 256, 1024 }; - - // loop over prescaler values - LOOP_S_L_N(i, 1, 8) { - uint16_t res_temp_fast = 255, res_temp_phase_correct = 255; - if (timer.n == 2) { - // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP - #if ENABLED(USE_OCR2A_AS_TOP) - const uint16_t rtf = (F_CPU) / (prescaler[i] * f_desired); - res_temp_fast = rtf - 1; - res_temp_phase_correct = rtf / 2; - #endif - } - else { - // Skip TIMER2 specific prescalers when not TIMER2 - if (i == 3 || i == 5) continue; - const uint16_t rtf = (F_CPU) / (prescaler[i] * f_desired); - res_temp_fast = rtf - 1; - res_temp_phase_correct = rtf / 2; - } - - LIMIT(res_temp_fast, 1U, size); - LIMIT(res_temp_phase_correct, 1U, size); - // Calculate frequencies of test prescaler and resolution values - const int f_temp_fast = (F_CPU) / (prescaler[i] * (1 + res_temp_fast)), - f_temp_phase_correct = (F_CPU) / (2 * prescaler[i] * res_temp_phase_correct), - f_diff = ABS(f - f_desired), - f_fast_diff = ABS(f_temp_fast - f_desired), - f_phase_diff = ABS(f_temp_phase_correct - f_desired); - - // If FAST values are closest to desired f - if (f_fast_diff < f_diff && f_fast_diff <= f_phase_diff) { - // Remember this combination - f = f_temp_fast; - res = res_temp_fast; - j = i; - // Set the Wave Generation Mode to FAST PWM - if (timer.n == 2) { - wgm = ( - #if ENABLED(USE_OCR2A_AS_TOP) - WGM2_FAST_PWM_OCR2A - #else - WGM2_FAST_PWM - #endif - ); - } - else wgm = WGM_FAST_PWM_ICRn; - } - // If PHASE CORRECT values are closes to desired f - else if (f_phase_diff < f_diff) { - f = f_temp_phase_correct; - res = res_temp_phase_correct; - j = i; - // Set the Wave Generation Mode to PWM PHASE CORRECT - if (timer.n == 2) { - wgm = ( - #if ENABLED(USE_OCR2A_AS_TOP) - WGM2_PWM_PC_OCR2A - #else - WGM2_PWM_PC - #endif - ); - } - else wgm = WGM_PWM_PC_ICRn; - } - } - } - _SET_WGMnQ(timer.TCCRnQ, wgm); - _SET_CSn(timer.TCCRnQ, j); - - if (timer.n == 2) { - #if ENABLED(USE_OCR2A_AS_TOP) - _SET_OCRnQ(timer.OCRnQ, 0, res); // Set OCR2A value (TOP) = res - #endif - } - else - _SET_ICRn(timer.ICRn, res); // Set ICRn value (TOP) = res -} - -void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { - // If v is 0 or v_size (max), digitalWrite to LOW or HIGH. - // Note that digitalWrite also disables pwm output for us (sets COM bit to 0) - if (v == 0) - digitalWrite(pin, invert); - else if (v == v_size) - digitalWrite(pin, !invert); - else { - Timer timer = get_pwm_timer(pin); - if (timer.n == 0) return; // Don't proceed if protected timer or not recognised - // Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted) - _SET_COMnQ(timer.TCCRnQ, (timer.q - #ifdef TCCR2 - + (timer.q == 2) // COM20 is on bit 4 of TCCR2, thus requires q + 1 in the macro - #endif - ), COM_CLEAR_SET + invert - ); - - uint16_t top; - if (timer.n == 2) { // if TIMER2 - top = ( - #if ENABLED(USE_OCR2A_AS_TOP) - *timer.OCRnQ[0] // top = OCR2A - #else - 255 // top = 0xFF (max) - #endif - ); - } - else - top = *timer.ICRn; // top = ICRn - - _SET_OCRnQ(timer.OCRnQ, timer.q, v * float(top) / float(v_size)); // Scale 8/16-bit v to top value - } -} - -#endif // NEEDS_HARDWARE_PWM -#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/fastio.cpp b/Marlin/src/HAL/AVR/fastio.cpp deleted file mode 100644 index b51d7f9768..0000000000 --- a/Marlin/src/HAL/AVR/fastio.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Fast I/O for extended pins - */ - -#ifdef __AVR__ - -#include "fastio.h" - -#ifdef FASTIO_EXT_START - -#include "../shared/Marduino.h" - -#define _IS_EXT(P) WITHIN(P, FASTIO_EXT_START, FASTIO_EXT_END) - -void extDigitalWrite(const int8_t pin, const uint8_t state) { - #define _WCASE(N) case N: WRITE(N, state); break - switch (pin) { - default: digitalWrite(pin, state); - #if _IS_EXT(70) - _WCASE(70); - #endif - #if _IS_EXT(71) - _WCASE(71); - #endif - #if _IS_EXT(72) - _WCASE(72); - #endif - #if _IS_EXT(73) - _WCASE(73); - #endif - #if _IS_EXT(74) - _WCASE(74); - #endif - #if _IS_EXT(75) - _WCASE(75); - #endif - #if _IS_EXT(76) - _WCASE(76); - #endif - #if _IS_EXT(77) - _WCASE(77); - #endif - #if _IS_EXT(78) - _WCASE(78); - #endif - #if _IS_EXT(79) - _WCASE(79); - #endif - #if _IS_EXT(80) - _WCASE(80); - #endif - #if _IS_EXT(81) - _WCASE(81); - #endif - #if _IS_EXT(82) - _WCASE(82); - #endif - #if _IS_EXT(83) - _WCASE(83); - #endif - #if _IS_EXT(84) - _WCASE(84); - #endif - #if _IS_EXT(85) - _WCASE(85); - #endif - #if _IS_EXT(86) - _WCASE(86); - #endif - #if _IS_EXT(87) - _WCASE(87); - #endif - #if _IS_EXT(88) - _WCASE(88); - #endif - #if _IS_EXT(89) - _WCASE(89); - #endif - #if _IS_EXT(90) - _WCASE(90); - #endif - #if _IS_EXT(91) - _WCASE(91); - #endif - #if _IS_EXT(92) - _WCASE(92); - #endif - #if _IS_EXT(93) - _WCASE(93); - #endif - #if _IS_EXT(94) - _WCASE(94); - #endif - #if _IS_EXT(95) - _WCASE(95); - #endif - #if _IS_EXT(96) - _WCASE(96); - #endif - #if _IS_EXT(97) - _WCASE(97); - #endif - #if _IS_EXT(98) - _WCASE(98); - #endif - #if _IS_EXT(99) - _WCASE(99); - #endif - #if _IS_EXT(100) - _WCASE(100); - #endif - } -} - -uint8_t extDigitalRead(const int8_t pin) { - #define _RCASE(N) case N: return READ(N) - switch (pin) { - default: return digitalRead(pin); - #if _IS_EXT(70) - _RCASE(70); - #endif - #if _IS_EXT(71) - _RCASE(71); - #endif - #if _IS_EXT(72) - _RCASE(72); - #endif - #if _IS_EXT(73) - _RCASE(73); - #endif - #if _IS_EXT(74) - _RCASE(74); - #endif - #if _IS_EXT(75) - _RCASE(75); - #endif - #if _IS_EXT(76) - _RCASE(76); - #endif - #if _IS_EXT(77) - _RCASE(77); - #endif - #if _IS_EXT(78) - _RCASE(78); - #endif - #if _IS_EXT(79) - _RCASE(79); - #endif - #if _IS_EXT(80) - _RCASE(80); - #endif - #if _IS_EXT(81) - _RCASE(81); - #endif - #if _IS_EXT(82) - _RCASE(82); - #endif - #if _IS_EXT(83) - _RCASE(83); - #endif - #if _IS_EXT(84) - _RCASE(84); - #endif - #if _IS_EXT(85) - _RCASE(85); - #endif - #if _IS_EXT(86) - _RCASE(86); - #endif - #if _IS_EXT(87) - _RCASE(87); - #endif - #if _IS_EXT(88) - _RCASE(88); - #endif - #if _IS_EXT(89) - _RCASE(89); - #endif - #if _IS_EXT(90) - _RCASE(90); - #endif - #if _IS_EXT(91) - _RCASE(91); - #endif - #if _IS_EXT(92) - _RCASE(92); - #endif - #if _IS_EXT(93) - _RCASE(93); - #endif - #if _IS_EXT(94) - _RCASE(94); - #endif - #if _IS_EXT(95) - _RCASE(95); - #endif - #if _IS_EXT(96) - _RCASE(96); - #endif - #if _IS_EXT(97) - _RCASE(97); - #endif - #if _IS_EXT(98) - _RCASE(98); - #endif - #if _IS_EXT(99) - _RCASE(99); - #endif - #if _IS_EXT(100) - _RCASE(100); - #endif - } -} - -#if 0 -/** - * Set Timer 5 PWM frequency in Hz, from 3.8Hz up to ~16MHz - * with a minimum resolution of 100 steps. - * - * DC values -1.0 to 1.0. Negative duty cycle inverts the pulse. - */ -uint16_t set_pwm_frequency_hz(const float &hz, const float dca, const float dcb, const float dcc) { - float count = 0; - if (hz > 0 && (dca || dcb || dcc)) { - count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq. - uint16_t prescaler; // Range of 30.5Hz (65535) 64.5KHz (>31) - - if (count >= 255. * 256.) { prescaler = 1024; SET_CS(5, PRESCALER_1024); } - else if (count >= 255. * 64.) { prescaler = 256; SET_CS(5, PRESCALER_256); } - else if (count >= 255. * 8.) { prescaler = 64; SET_CS(5, PRESCALER_64); } - else if (count >= 255.) { prescaler = 8; SET_CS(5, PRESCALER_8); } - else { prescaler = 1; SET_CS(5, PRESCALER_1); } - - count /= float(prescaler); - const float pwm_top = round(count); // Get the rounded count - - ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP - OCR5A = pwm_top * ABS(dca); // Update and scale DCs - OCR5B = pwm_top * ABS(dcb); - OCR5C = pwm_top * ABS(dcc); - _SET_COM(5, A, dca ? (dca < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); // Set compare modes - _SET_COM(5, B, dcb ? (dcb < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); - _SET_COM(5, C, dcc ? (dcc < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); - - SET_WGM(5, FAST_PWM_ICRn); // Fast PWM with ICR5 as TOP - - //SERIAL_ECHOLNPGM("Timer 5 Settings:"); - //SERIAL_ECHOLNPAIR(" Prescaler=", prescaler); - //SERIAL_ECHOLNPAIR(" TOP=", ICR5); - //SERIAL_ECHOLNPAIR(" OCR5A=", OCR5A); - //SERIAL_ECHOLNPAIR(" OCR5B=", OCR5B); - //SERIAL_ECHOLNPAIR(" OCR5C=", OCR5C); - } - else { - // Restore the default for Timer 5 - SET_WGM(5, PWM_PC_8); // PWM 8-bit (Phase Correct) - SET_COMS(5, NORMAL, NORMAL, NORMAL); // Do nothing - SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250KHz - OCR5A = OCR5B = OCR5C = 0; - } - return round(count); -} -#endif - -#endif // FASTIO_EXT_START -#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/fastio.h b/Marlin/src/HAL/AVR/fastio.h deleted file mode 100644 index dd01634661..0000000000 --- a/Marlin/src/HAL/AVR/fastio.h +++ /dev/null @@ -1,373 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O Routines for AVR - * Use direct port manipulation to save scads of processor time. - * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. - */ - -#include - -#if defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__) - #define AVR_AT90USB1286_FAMILY 1 -#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__) - #define AVR_ATmega1284_FAMILY 1 -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - #define AVR_ATmega2560_FAMILY 1 -#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) - #define AVR_ATmega2561_FAMILY 1 -#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) - #define AVR_ATmega328_FAMILY 1 -#endif - -/** - * Include Ports and Functions - */ -#if AVR_ATmega328_FAMILY - #include "fastio/fastio_168.h" -#elif AVR_ATmega1284_FAMILY - #include "fastio/fastio_644.h" -#elif AVR_ATmega2560_FAMILY - #include "fastio/fastio_1280.h" -#elif AVR_AT90USB1286_FAMILY - #include "fastio/fastio_AT90USB.h" -#elif AVR_ATmega2561_FAMILY - #include "fastio/fastio_1281.h" -#else - #error "No FastIO definition for the selected AVR Board." -#endif - -/** - * Magic I/O routines - * - * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); - * - * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/cpp/Stringification.html - */ - -#define _READ(IO) TEST(DIO ## IO ## _RPORT, DIO ## IO ## _PIN) - -#define _WRITE_NC(IO,V) do{ \ - if (V) SBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \ - else CBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \ -}while(0) - -#define _WRITE_C(IO,V) do{ \ - uint8_t port_bits = DIO ## IO ## _WPORT; /* Get a mask from the current port bits */ \ - if (V) port_bits = ~port_bits; /* For setting bits, invert the mask */ \ - DIO ## IO ## _RPORT = port_bits & _BV(DIO ## IO ## _PIN); /* Atomically toggle the output port bits */ \ -}while(0) - -#define _WRITE(IO,V) do{ if (&(DIO ## IO ## _RPORT) < (uint8_t*)0x100) _WRITE_NC(IO,V); else _WRITE_C(IO,V); }while(0) - -#define _TOGGLE(IO) (DIO ## IO ## _RPORT = _BV(DIO ## IO ## _PIN)) - -#define _SET_INPUT(IO) CBI(DIO ## IO ## _DDR, DIO ## IO ## _PIN) -#define _SET_OUTPUT(IO) SBI(DIO ## IO ## _DDR, DIO ## IO ## _PIN) - -#define _IS_INPUT(IO) !TEST(DIO ## IO ## _DDR, DIO ## IO ## _PIN) -#define _IS_OUTPUT(IO) TEST(DIO ## IO ## _DDR, DIO ## IO ## _PIN) - -// digitalRead/Write wrappers -#ifdef FASTIO_EXT_START - void extDigitalWrite(const int8_t pin, const uint8_t state); - uint8_t extDigitalRead(const int8_t pin); -#else - #define extDigitalWrite(IO,V) digitalWrite(IO,V) - #define extDigitalRead(IO) digitalRead(IO) -#endif - -#define READ(IO) _READ(IO) -#define WRITE(IO,V) _WRITE(IO,V) -#define TOGGLE(IO) _TOGGLE(IO) - -#define SET_INPUT(IO) _SET_INPUT(IO) -#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _WRITE(IO, HIGH); }while(0) -#define SET_INPUT_PULLDOWN SET_INPUT -#define SET_OUTPUT(IO) _SET_OUTPUT(IO) -#define SET_PWM SET_OUTPUT - -#define IS_INPUT(IO) _IS_INPUT(IO) -#define IS_OUTPUT(IO) _IS_OUTPUT(IO) - -#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -/** - * Timer and Interrupt Control - */ - -// Waveform Generation Modes -enum WaveGenMode : char { - WGM_NORMAL, // 0 - WGM_PWM_PC_8, // 1 - WGM_PWM_PC_9, // 2 - WGM_PWM_PC_10, // 3 - WGM_CTC_OCRnA, // 4 COM OCnx - WGM_FAST_PWM_8, // 5 - WGM_FAST_PWM_9, // 6 - WGM_FAST_PWM_10, // 7 - WGM_PWM_PC_FC_ICRn, // 8 - WGM_PWM_PC_FC_OCRnA, // 9 COM OCnA - WGM_PWM_PC_ICRn, // 10 - WGM_PWM_PC_OCRnA, // 11 COM OCnA - WGM_CTC_ICRn, // 12 COM OCnx - WGM_reserved, // 13 - WGM_FAST_PWM_ICRn, // 14 COM OCnA - WGM_FAST_PWM_OCRnA // 15 COM OCnA -}; - -// Wavefore Generation Modes (Timer 2 only) -enum WaveGenMode2 : char { - WGM2_NORMAL, // 0 - WGM2_PWM_PC, // 1 - WGM2_CTC_OCR2A, // 2 - WGM2_FAST_PWM, // 3 - WGM2_reserved_1, // 4 - WGM2_PWM_PC_OCR2A, // 5 - WGM2_reserved_2, // 6 - WGM2_FAST_PWM_OCR2A, // 7 -}; - -// Compare Modes -enum CompareMode : char { - COM_NORMAL, // 0 - COM_TOGGLE, // 1 Non-PWM: OCnx ... Both PWM (WGM 9,11,14,15): OCnA only ... else NORMAL - COM_CLEAR_SET, // 2 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down - COM_SET_CLEAR // 3 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down -}; - -// Clock Sources -enum ClockSource : char { - CS_NONE, // 0 - CS_PRESCALER_1, // 1 - CS_PRESCALER_8, // 2 - CS_PRESCALER_64, // 3 - CS_PRESCALER_256, // 4 - CS_PRESCALER_1024, // 5 - CS_EXT_FALLING, // 6 - CS_EXT_RISING // 7 -}; - -// Clock Sources (Timer 2 only) -enum ClockSource2 : char { - CS2_NONE, // 0 - CS2_PRESCALER_1, // 1 - CS2_PRESCALER_8, // 2 - CS2_PRESCALER_32, // 3 - CS2_PRESCALER_64, // 4 - CS2_PRESCALER_128, // 5 - CS2_PRESCALER_256, // 6 - CS2_PRESCALER_1024 // 7 -}; - -// Get interrupt bits in an orderly way -// Ex: cs = GET_CS(0); coma1 = GET_COM(A,1); -#define GET_WGM(T) (((TCCR##T##A >> WGM##T##0) & 0x3) | ((TCCR##T##B >> WGM##T##2 << 2) & 0xC)) -#define GET_CS(T) ((TCCR##T##B >> CS##T##0) & 0x7) -#define GET_COM(T,Q) ((TCCR##T##Q >> COM##T##Q##0) & 0x3) -#define GET_COMA(T) GET_COM(T,A) -#define GET_COMB(T) GET_COM(T,B) -#define GET_COMC(T) GET_COM(T,C) -#define GET_ICNC(T) (!!(TCCR##T##B & _BV(ICNC##T))) -#define GET_ICES(T) (!!(TCCR##T##B & _BV(ICES##T))) -#define GET_FOC(T,Q) (!!(TCCR##T##C & _BV(FOC##T##Q))) -#define GET_FOCA(T) GET_FOC(T,A) -#define GET_FOCB(T) GET_FOC(T,B) -#define GET_FOCC(T) GET_FOC(T,C) - -// Set Wave Generation Mode bits -// Ex: SET_WGM(5,CTC_ICRn); -#define _SET_WGM(T,V) do{ \ - TCCR##T##A = (TCCR##T##A & ~(0x3 << WGM##T##0)) | (( int(V) & 0x3) << WGM##T##0); \ - TCCR##T##B = (TCCR##T##B & ~(0x3 << WGM##T##2)) | (((int(V) >> 2) & 0x3) << WGM##T##2); \ - }while(0) -#define SET_WGM(T,V) _SET_WGM(T,WGM_##V) -// Runtime (see set_pwm_frequency): -#define _SET_WGMnQ(TCCRnQ, V) do{ \ - *(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << 0)) | (( int(V) & 0x3) << 0); \ - *(TCCRnQ)[1] = (*(TCCRnQ)[1] & ~(0x3 << 3)) | (((int(V) >> 2) & 0x3) << 3); \ - }while(0) - -// Set Clock Select bits -// Ex: SET_CS3(PRESCALER_64); -#define _SET_CS(T,V) (TCCR##T##B = (TCCR##T##B & ~(0x7 << CS##T##0)) | ((int(V) & 0x7) << CS##T##0)) -#define _SET_CS0(V) _SET_CS(0,V) -#define _SET_CS1(V) _SET_CS(1,V) -#ifdef TCCR2 - #define _SET_CS2(V) (TCCR2 = (TCCR2 & ~(0x7 << CS20)) | (int(V) << CS20)) -#else - #define _SET_CS2(V) _SET_CS(2,V) -#endif -#define _SET_CS3(V) _SET_CS(3,V) -#define _SET_CS4(V) _SET_CS(4,V) -#define _SET_CS5(V) _SET_CS(5,V) -#define SET_CS0(V) _SET_CS0(CS_##V) -#define SET_CS1(V) _SET_CS1(CS_##V) -#ifdef TCCR2 - #define SET_CS2(V) _SET_CS2(CS2_##V) -#else - #define SET_CS2(V) _SET_CS2(CS_##V) -#endif -#define SET_CS3(V) _SET_CS3(CS_##V) -#define SET_CS4(V) _SET_CS4(CS_##V) -#define SET_CS5(V) _SET_CS5(CS_##V) -#define SET_CS(T,V) SET_CS##T(V) -// Runtime (see set_pwm_frequency) -#define _SET_CSn(TCCRnQ, V) do{ \ - (*(TCCRnQ)[1] = (*(TCCRnQ[1]) & ~(0x7 << 0)) | ((int(V) & 0x7) << 0)); \ - }while(0) - -// Set Compare Mode bits -// Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET); -#define _SET_COM(T,Q,V) (TCCR##T##Q = (TCCR##T##Q & ~(0x3 << COM##T##Q##0)) | (int(V) << COM##T##Q##0)) -#define SET_COM(T,Q,V) _SET_COM(T,Q,COM_##V) -#define SET_COMA(T,V) SET_COM(T,A,V) -#define SET_COMB(T,V) SET_COM(T,B,V) -#define SET_COMC(T,V) SET_COM(T,C,V) -#define SET_COMS(T,V1,V2,V3) do{ SET_COMA(T,V1); SET_COMB(T,V2); SET_COMC(T,V3); }while(0) -// Runtime (see set_pwm_duty) -#define _SET_COMnQ(TCCRnQ, Q, V) do{ \ - (*(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << (6-2*(Q)))) | (int(V) << (6-2*(Q)))); \ - }while(0) - -// Set OCRnQ register -// Runtime (see set_pwm_duty): -#define _SET_OCRnQ(OCRnQ, Q, V) do{ \ - (*(OCRnQ)[(Q)] = (0x0000) | (int(V) & 0xFFFF)); \ - }while(0) - -// Set ICRn register (one per timer) -// Runtime (see set_pwm_frequency) -#define _SET_ICRn(ICRn, V) do{ \ - (*(ICRn) = (0x0000) | (int(V) & 0xFFFF)); \ - }while(0) - -// Set Noise Canceler bit -// Ex: SET_ICNC(2,1) -#define SET_ICNC(T,V) (TCCR##T##B = (V) ? TCCR##T##B | _BV(ICNC##T) : TCCR##T##B & ~_BV(ICNC##T)) - -// Set Input Capture Edge Select bit -// Ex: SET_ICES(5,0) -#define SET_ICES(T,V) (TCCR##T##B = (V) ? TCCR##T##B | _BV(ICES##T) : TCCR##T##B & ~_BV(ICES##T)) - -// Set Force Output Compare bit -// Ex: SET_FOC(3,A,1) -#define SET_FOC(T,Q,V) (TCCR##T##C = (V) ? TCCR##T##C | _BV(FOC##T##Q) : TCCR##T##C & ~_BV(FOC##T##Q)) -#define SET_FOCA(T,V) SET_FOC(T,A,V) -#define SET_FOCB(T,V) SET_FOC(T,B,V) -#define SET_FOCC(T,V) SET_FOC(T,C,V) - -#if 0 - -/** - * PWM availability macros - */ - -// Determine which harware PWMs are already in use -#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN) -#if PIN_EXISTS(CONTROLLER_FAN) - #define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN) -#else - #define PWM_CHK_FAN_B(P) _PWM_CHK_FAN_B(P) -#endif - -#if ANY_PIN(FAN, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7) - #if PIN_EXISTS(FAN7) - #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN || P == FAN7_PIN) - #elif PIN_EXISTS(FAN6) - #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN) - #elif PIN_EXISTS(FAN5) - #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN) - #elif PIN_EXISTS(FAN4) - #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN) - #elif PIN_EXISTS(FAN3) - #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN) - #elif PIN_EXISTS(FAN2) - #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN) - #elif PIN_EXISTS(FAN1) - #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN) - #else - #define PWM_CHK_FAN_A(P) (P == FAN0_PIN) - #endif -#else - #define PWM_CHK_FAN_A(P) false -#endif - -#if HAS_MOTOR_CURRENT_PWM - #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) - #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z || P == MOTOR_CURRENT_PWM_XY) - #elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z) - #else - #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E) - #endif -#else - #define PWM_CHK_MOTOR_CURRENT(P) false -#endif - -#ifdef NUM_SERVOS - #if AVR_ATmega2560_FAMILY - #define PWM_CHK_SERVO(P) (P == 5 || (NUM_SERVOS > 12 && P == 6) || (NUM_SERVOS > 24 && P == 46)) // PWMS 3A, 4A & 5A - #elif AVR_ATmega2561_FAMILY - #define PWM_CHK_SERVO(P) (P == 5) // PWM3A - #elif AVR_ATmega1284_FAMILY - #define PWM_CHK_SERVO(P) false - #elif AVR_AT90USB1286_FAMILY - #define PWM_CHK_SERVO(P) (P == 16) // PWM3A - #elif AVR_ATmega328_FAMILY - #define PWM_CHK_SERVO(P) false - #endif -#else - #define PWM_CHK_SERVO(P) false -#endif - -#if ENABLED(BARICUDA) - #if HAS_HEATER_1 && HAS_HEATER_2 - #define PWM_CHK_HEATER(P) (P == HEATER_1_PIN || P == HEATER_2_PIN) - #elif HAS_HEATER_1 - #define PWM_CHK_HEATER(P) (P == HEATER_1_PIN) - #endif -#else - #define PWM_CHK_HEATER(P) false -#endif - -#define PWM_CHK(P) (PWM_CHK_HEATER(P) || PWM_CHK_SERVO(P) || PWM_CHK_MOTOR_CURRENT(P) || PWM_CHK_FAN_A(P) || PWM_CHK_FAN_B(P)) - -#endif // PWM_CHK is not used in Marlin - -// define which hardware PWMs are available for the current CPU -// all timer 1 PWMS deleted from this list because they are never available -#if AVR_ATmega2560_FAMILY - #define PWM_PIN(P) ((P >= 2 && P <= 10) || P == 13 || P == 44 || P == 45 || P == 46) -#elif AVR_ATmega2561_FAMILY - #define PWM_PIN(P) ((P >= 2 && P <= 6) || P == 9) -#elif AVR_ATmega1284_FAMILY - #define PWM_PIN(P) (P == 3 || P == 4 || P == 14 || P == 15) -#elif AVR_AT90USB1286_FAMILY - #define PWM_PIN(P) (P == 0 || P == 1 || P == 14 || P == 15 || P == 16 || P == 24) -#elif AVR_ATmega328_FAMILY - #define PWM_PIN(P) (P == 3 || P == 5 || P == 6 || P == 11) -#else - #error "unknown CPU" -#endif diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h deleted file mode 100644 index a611ccd7c4..0000000000 --- a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/AVR." -#endif diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_adv.h b/Marlin/src/HAL/AVR/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/AVR/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_post.h b/Marlin/src/HAL/AVR/inc/Conditionals_post.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/AVR/inc/Conditionals_post.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h deleted file mode 100644 index 731cf92865..0000000000 --- a/Marlin/src/HAL/AVR/inc/SanityCheck.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test AVR-specific configuration values for errors at compile-time. - */ - -/** - * Checks for FAST PWM - */ -#if ENABLED(FAST_PWM_FAN) && (ENABLED(USE_OCR2A_AS_TOP) && defined(TCCR2)) - #error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2" -#endif - -/** - * Sanity checks for Spindle / Laser PWM - */ -#if ENABLED(SPINDLE_LASER_PWM) - #include "../ServoTimers.h" // Needed to check timer availability (_useTimer3) - #if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13) - #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt." - #elif NUM_SERVOS > 0 && defined(_useTimer3) && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5) - #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system." - #endif -#elif defined(SPINDLE_LASER_FREQUENCY) - #error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_PWM." -#endif - -/** - * The Trinamic library includes SoftwareSerial.h, leading to a compile error. - */ -#if BOTH(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE) - #error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." -#endif - -#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS) - #error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue." -#endif diff --git a/Marlin/src/HAL/AVR/math.h b/Marlin/src/HAL/AVR/math.h deleted file mode 100644 index 7ede4accc0..0000000000 --- a/Marlin/src/HAL/AVR/math.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Optimized math functions for AVR - */ - -// intRes = longIn1 * longIn2 >> 24 -// uses: -// A[tmp] to store 0 -// B[tmp] to store bits 16-23 of the 48bit result. The top bit is used to round the two byte result. -// note that the lower two bytes and the upper byte of the 48bit result are not calculated. -// this can cause the result to be out by one as the lower bytes may cause carries into the upper ones. -// B A are bits 24-39 and are the returned value -// C B A is longIn1 -// D C B A is longIn2 -// -static FORCE_INLINE uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) { - uint8_t tmp1; - uint8_t tmp2; - uint16_t intRes; - __asm__ __volatile__( - A("clr %[tmp1]") - A("mul %A[longIn1], %B[longIn2]") - A("mov %[tmp2], r1") - A("mul %B[longIn1], %C[longIn2]") - A("movw %A[intRes], r0") - A("mul %C[longIn1], %C[longIn2]") - A("add %B[intRes], r0") - A("mul %C[longIn1], %B[longIn2]") - A("add %A[intRes], r0") - A("adc %B[intRes], r1") - A("mul %A[longIn1], %C[longIn2]") - A("add %[tmp2], r0") - A("adc %A[intRes], r1") - A("adc %B[intRes], %[tmp1]") - A("mul %B[longIn1], %B[longIn2]") - A("add %[tmp2], r0") - A("adc %A[intRes], r1") - A("adc %B[intRes], %[tmp1]") - A("mul %C[longIn1], %A[longIn2]") - A("add %[tmp2], r0") - A("adc %A[intRes], r1") - A("adc %B[intRes], %[tmp1]") - A("mul %B[longIn1], %A[longIn2]") - A("add %[tmp2], r1") - A("adc %A[intRes], %[tmp1]") - A("adc %B[intRes], %[tmp1]") - A("lsr %[tmp2]") - A("adc %A[intRes], %[tmp1]") - A("adc %B[intRes], %[tmp1]") - A("mul %D[longIn2], %A[longIn1]") - A("add %A[intRes], r0") - A("adc %B[intRes], r1") - A("mul %D[longIn2], %B[longIn1]") - A("add %B[intRes], r0") - A("clr r1") - : [intRes] "=&r" (intRes), - [tmp1] "=&r" (tmp1), - [tmp2] "=&r" (tmp2) - : [longIn1] "d" (longIn1), - [longIn2] "d" (longIn2) - : "cc" - ); - return intRes; -} - -// intRes = intIn1 * intIn2 >> 16 -// uses: -// r26 to store 0 -// r27 to store the byte 1 of the 24 bit result -static FORCE_INLINE uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) { - uint8_t tmp; - uint16_t intRes; - __asm__ __volatile__ ( - A("clr %[tmp]") - A("mul %[charIn1], %B[intIn2]") - A("movw %A[intRes], r0") - A("mul %[charIn1], %A[intIn2]") - A("add %A[intRes], r1") - A("adc %B[intRes], %[tmp]") - A("lsr r0") - A("adc %A[intRes], %[tmp]") - A("adc %B[intRes], %[tmp]") - A("clr r1") - : [intRes] "=&r" (intRes), - [tmp] "=&r" (tmp) - : [charIn1] "d" (charIn1), - [intIn2] "d" (intIn2) - : "cc" - ); - return intRes; -} diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h deleted file mode 100644 index dac6b1b150..0000000000 --- a/Marlin/src/HAL/AVR/pinsDebug.h +++ /dev/null @@ -1,403 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * PWM print routines for Atmel 8 bit AVR CPUs - */ - -#include "../../inc/MarlinConfig.h" - -#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS - -#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14) - #define AVR_ATmega2560_FAMILY_PLUS_70 1 -#endif - -#if AVR_AT90USB1286_FAMILY - - // Working with Teensyduino extension so need to re-define some things - #include "pinsDebug_Teensyduino.h" - // Can't use the "digitalPinToPort" function from the Teensyduino type IDEs - // portModeRegister takes a different argument - #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p) - #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p) - #define digitalPinToPort_DEBUG(p) digitalPinToPort_Teensy(p) - #define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin)) - -#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70 - - #include "pinsDebug_plus_70.h" - #define digitalPinToTimer_DEBUG(p) digitalPinToTimer_plus_70(p) - #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask_plus_70(p) - #define digitalPinToPort_DEBUG(p) digitalPinToPort_plus_70(p) - bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } - -#else - - #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p) - #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p) - #define digitalPinToPort_DEBUG(p) digitalPinToPort(p) - bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } - #define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) - -#endif - -#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0) -#if AVR_ATmega1284_FAMILY - #define DIGITAL_PIN_TO_ANALOG_PIN(P) int(analogInputToDigitalPin(0) - (P)) - #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(7) && (P) <= analogInputToDigitalPin(0)) -#else - #define DIGITAL_PIN_TO_ANALOG_PIN(P) int((P) - analogInputToDigitalPin(0)) - #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7))) -#endif -#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) -#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin - -void PRINT_ARRAY_NAME(uint8_t x) { - char *name_mem_pointer = (char*)pgm_read_ptr(&pin_array[x].name); - LOOP_L_N(y, MAX_NAME_LENGTH) { - char temp_char = pgm_read_byte(name_mem_pointer + y); - if (temp_char != 0) - SERIAL_CHAR(temp_char); - else { - LOOP_L_N(i, MAX_NAME_LENGTH - y) SERIAL_CHAR(' '); - break; - } - } -} - -#define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital) - - -#if defined(__AVR_ATmega1284P__) // 1284 IDE extensions set this to the number of - #undef NUM_DIGITAL_PINS // digital only pins while all other CPUs have it - #define NUM_DIGITAL_PINS 32 // set to digital only + digital/analog -#endif - -#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), V); SERIAL_ECHO(buffer); }while(0) -#define PWM_CASE(N,Z) \ - case TIMER##N##Z: \ - if (TCCR##N##A & (_BV(COM##N##Z##1) | _BV(COM##N##Z##0))) { \ - PWM_PRINT(OCR##N##Z); \ - return true; \ - } else return false - - - -/** - * Print a pin's PWM status. - * Return true if it's currently a PWM pin. - */ -static bool pwm_status(uint8_t pin) { - char buffer[20]; // for the sprintf statements - - switch (digitalPinToTimer_DEBUG(pin)) { - - #if defined(TCCR0A) && defined(COM0A1) - #ifdef TIMER0A - #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs - PWM_CASE(0, A); - #endif - #endif - PWM_CASE(0, B); - #endif - - #if defined(TCCR1A) && defined(COM1A1) - PWM_CASE(1, A); - PWM_CASE(1, B); - #if defined(COM1C1) && defined(TIMER1C) - PWM_CASE(1, C); - #endif - #endif - - #if defined(TCCR2A) && defined(COM2A1) - PWM_CASE(2, A); - PWM_CASE(2, B); - #endif - - #if defined(TCCR3A) && defined(COM3A1) - PWM_CASE(3, A); - PWM_CASE(3, B); - #ifdef COM3C1 - PWM_CASE(3, C); - #endif - #endif - - #ifdef TCCR4A - PWM_CASE(4, A); - PWM_CASE(4, B); - PWM_CASE(4, C); - #endif - - #if defined(TCCR5A) && defined(COM5A1) - PWM_CASE(5, A); - PWM_CASE(5, B); - PWM_CASE(5, C); - #endif - - case NOT_ON_TIMER: - default: - return false; - } - SERIAL_ECHO_SP(2); -} // pwm_status - - -const volatile uint8_t* const PWM_other[][3] PROGMEM = { - { &TCCR0A, &TCCR0B, &TIMSK0 }, - { &TCCR1A, &TCCR1B, &TIMSK1 }, - #if defined(TCCR2A) && defined(COM2A1) - { &TCCR2A, &TCCR2B, &TIMSK2 }, - #endif - #if defined(TCCR3A) && defined(COM3A1) - { &TCCR3A, &TCCR3B, &TIMSK3 }, - #endif - #ifdef TCCR4A - { &TCCR4A, &TCCR4B, &TIMSK4 }, - #endif - #if defined(TCCR5A) && defined(COM5A1) - { &TCCR5A, &TCCR5B, &TIMSK5 }, - #endif -}; - - -const volatile uint8_t* const PWM_OCR[][3] PROGMEM = { - - #ifdef TIMER0A - { &OCR0A, &OCR0B, 0 }, - #else - { 0, &OCR0B, 0 }, - #endif - - #if defined(COM1C1) && defined(TIMER1C) - { (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, (const uint8_t*)&OCR1C }, - #else - { (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, 0 }, - #endif - - #if defined(TCCR2A) && defined(COM2A1) - { &OCR2A, &OCR2B, 0 }, - #endif - - #if defined(TCCR3A) && defined(COM3A1) - #ifdef COM3C1 - { (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, (const uint8_t*)&OCR3C }, - #else - { (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, 0 }, - #endif - #endif - - #ifdef TCCR4A - { (const uint8_t*)&OCR4A, (const uint8_t*)&OCR4B, (const uint8_t*)&OCR4C }, - #endif - - #if defined(TCCR5A) && defined(COM5A1) - { (const uint8_t*)&OCR5A, (const uint8_t*)&OCR5B, (const uint8_t*)&OCR5C }, - #endif -}; - - -#define TCCR_A(T) pgm_read_word(&PWM_other[T][0]) -#define TCCR_B(T) pgm_read_word(&PWM_other[T][1]) -#define TIMSK(T) pgm_read_word(&PWM_other[T][2]) -#define CS_0 0 -#define CS_1 1 -#define CS_2 2 -#define WGM_0 0 -#define WGM_1 1 -#define WGM_2 3 -#define WGM_3 4 -#define TOIE 0 - -#define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L]) - -static void err_is_counter() { SERIAL_ECHOPGM(" non-standard PWM mode"); } -static void err_is_interrupt() { SERIAL_ECHOPGM(" compare interrupt enabled"); } -static void err_prob_interrupt() { SERIAL_ECHOPGM(" overflow interrupt enabled"); } -static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); SERIAL_ECHO_SP(14); } - -inline void com_print(const uint8_t N, const uint8_t Z) { - const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); - SERIAL_ECHOPGM(" COM"); - SERIAL_CHAR('0' + N, Z); - SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03)); -} - -void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout - char buffer[20]; // for the sprintf statements - const uint8_t *TCCRB = (uint8_t*)TCCR_B(T), - *TCCRA = (uint8_t*)TCCR_A(T); - uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1)))); - if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1); - - SERIAL_ECHOPGM(" TIMER"); - SERIAL_CHAR(T + '0', L); - SERIAL_ECHO_SP(3); - - if (N == 3) { - const uint8_t *OCRVAL8 = (uint8_t*)OCR_VAL(T, L - 'A'); - PWM_PRINT(*OCRVAL8); - } - else { - const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A'); - PWM_PRINT(*OCRVAL16); - } - SERIAL_ECHOPAIR(" WGM: ", WGM); - com_print(T,L); - SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) )); - - SERIAL_ECHOPGM(" TCCR"); - SERIAL_CHAR(T + '0'); - SERIAL_ECHOPAIR("A: ", *TCCRA); - - SERIAL_ECHOPGM(" TCCR"); - SERIAL_CHAR(T + '0'); - SERIAL_ECHOPAIR("B: ", *TCCRB); - - const uint8_t *TMSK = (uint8_t*)TIMSK(T); - SERIAL_ECHOPGM(" TIMSK"); - SERIAL_CHAR(T + '0'); - SERIAL_ECHOPAIR(": ", *TMSK); - - const uint8_t OCIE = L - 'A' + 1; - if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); } - else { if (WGM == 0 || WGM == 4 || WGM == 12 || WGM == 13) err_is_counter(); } - if (TEST(*TMSK, OCIE)) err_is_interrupt(); - if (TEST(*TMSK, TOIE)) err_prob_interrupt(); -} - -static void pwm_details(uint8_t pin) { - switch (digitalPinToTimer_DEBUG(pin)) { - - #if defined(TCCR0A) && defined(COM0A1) - #ifdef TIMER0A - #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs - case TIMER0A: timer_prefix(0, 'A', 3); break; - #endif - #endif - case TIMER0B: timer_prefix(0, 'B', 3); break; - #endif - - #if defined(TCCR1A) && defined(COM1A1) - case TIMER1A: timer_prefix(1, 'A', 4); break; - case TIMER1B: timer_prefix(1, 'B', 4); break; - #if defined(COM1C1) && defined(TIMER1C) - case TIMER1C: timer_prefix(1, 'C', 4); break; - #endif - #endif - - #if defined(TCCR2A) && defined(COM2A1) - case TIMER2A: timer_prefix(2, 'A', 3); break; - case TIMER2B: timer_prefix(2, 'B', 3); break; - #endif - - #if defined(TCCR3A) && defined(COM3A1) - case TIMER3A: timer_prefix(3, 'A', 4); break; - case TIMER3B: timer_prefix(3, 'B', 4); break; - #ifdef COM3C1 - case TIMER3C: timer_prefix(3, 'C', 4); break; - #endif - #endif - - #ifdef TCCR4A - case TIMER4A: timer_prefix(4, 'A', 4); break; - case TIMER4B: timer_prefix(4, 'B', 4); break; - case TIMER4C: timer_prefix(4, 'C', 4); break; - #endif - - #if defined(TCCR5A) && defined(COM5A1) - case TIMER5A: timer_prefix(5, 'A', 4); break; - case TIMER5B: timer_prefix(5, 'B', 4); break; - case TIMER5C: timer_prefix(5, 'C', 4); break; - #endif - - case NOT_ON_TIMER: break; - - } - SERIAL_ECHOPGM(" "); - - // on pins that have two PWMs, print info on second PWM - #if AVR_ATmega2560_FAMILY || AVR_AT90USB1286_FAMILY - // looking for port B7 - PWMs 0A and 1C - if (digitalPinToPort_DEBUG(pin) == 'B' - 64 && 0x80 == digitalPinToBitMask_DEBUG(pin)) { - #if !AVR_AT90USB1286_FAMILY - SERIAL_ECHOPGM("\n ."); - SERIAL_ECHO_SP(18); - SERIAL_ECHOPGM("TIMER1C"); - print_is_also_tied(); - timer_prefix(1, 'C', 4); - #else - SERIAL_ECHOPGM("\n ."); - SERIAL_ECHO_SP(18); - SERIAL_ECHOPGM("TIMER0A"); - print_is_also_tied(); - timer_prefix(0, 'A', 3); - #endif - } - #else - UNUSED(print_is_also_tied); - #endif -} // pwm_details - - -#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs - int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed - const uint8_t port = digitalPinToPort_DEBUG(pin); - return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask_DEBUG(pin)) ? HIGH : LOW; - } -#endif - -#ifndef PRINT_PORT - - void print_port(int8_t pin) { // print port number - #ifdef digitalPinToPort_DEBUG - uint8_t x; - SERIAL_ECHOPGM(" Port: "); - #if AVR_AT90USB1286_FAMILY - x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64; - #else - x = digitalPinToPort_DEBUG(pin) + 64; - #endif - SERIAL_CHAR(x); - - #if AVR_AT90USB1286_FAMILY - if (pin == 46) - x = '2'; - else if (pin == 47) - x = '3'; - else { - uint8_t temp = digitalPinToBitMask_DEBUG(pin); - for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; - } - #else - uint8_t temp = digitalPinToBitMask_DEBUG(pin); - for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; - #endif - SERIAL_CHAR(x); - #else - SERIAL_ECHO_SP(10); - #endif - } - - #define PRINT_PORT(p) print_port(p) - -#endif - -#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) diff --git a/Marlin/src/HAL/AVR/spi_pins.h b/Marlin/src/HAL/AVR/spi_pins.h deleted file mode 100644 index f3fa78e2bf..0000000000 --- a/Marlin/src/HAL/AVR/spi_pins.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Define SPI Pins: SCK, MISO, MOSI, SS - */ -#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) - #define AVR_SCK_PIN 13 - #define AVR_MISO_PIN 12 - #define AVR_MOSI_PIN 11 - #define AVR_SS_PIN 10 -#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__) - #define AVR_SCK_PIN 7 - #define AVR_MISO_PIN 6 - #define AVR_MOSI_PIN 5 - #define AVR_SS_PIN 4 -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - #define AVR_SCK_PIN 52 - #define AVR_MISO_PIN 50 - #define AVR_MOSI_PIN 51 - #define AVR_SS_PIN 53 -#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) - #define AVR_SCK_PIN 21 - #define AVR_MISO_PIN 23 - #define AVR_MOSI_PIN 22 - #define AVR_SS_PIN 20 -#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) - #define AVR_SCK_PIN 10 - #define AVR_MISO_PIN 12 - #define AVR_MOSI_PIN 11 - #define AVR_SS_PIN 16 -#endif - -#ifndef SCK_PIN - #define SCK_PIN AVR_SCK_PIN -#endif -#ifndef MISO_PIN - #define MISO_PIN AVR_MISO_PIN -#endif -#ifndef MOSI_PIN - #define MOSI_PIN AVR_MOSI_PIN -#endif -#ifndef SS_PIN - #define SS_PIN AVR_SS_PIN -#endif diff --git a/Marlin/src/HAL/AVR/timers.h b/Marlin/src/HAL/AVR/timers.h deleted file mode 100644 index 82eb8b14b1..0000000000 --- a/Marlin/src/HAL/AVR/timers.h +++ /dev/null @@ -1,260 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// ------------------------ -// Types -// ------------------------ - -typedef uint16_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFF - -// ------------------------ -// Defines -// ------------------------ - -#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 1 -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 0 -#endif - -#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0) - -#define STEPPER_TIMER_RATE HAL_TIMER_RATE -#define STEPPER_TIMER_PRESCALE 8 -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) -#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A) - -#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B) -#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) -#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B) - -FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) { - switch (timer_num) { - case STEP_TIMER_NUM: - // waveform generation = 0100 = CTC - SET_WGM(1, CTC_OCRnA); - - // output mode = 00 (disconnected) - SET_COMA(1, NORMAL); - - // Set the timer pre-scaler - // Generally we use a divider of 8, resulting in a 2MHz timer - // frequency on a 16MHz MCU. If you are going to change this, be - // sure to regenerate speed_lookuptable.h with - // create_speed_lookuptable.py - SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler - - // Init Stepper ISR to 122 Hz for quick starting - // (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency - OCR1A = 0x4000; - TCNT1 = 0; - break; - - case TEMP_TIMER_NUM: - // Use timer0 for temperature measurement - // Interleave temperature interrupt with millies interrupt - OCR0B = 128; - break; - } -} - -#define TIMER_OCR_1 OCR1A -#define TIMER_COUNTER_1 TCNT1 - -#define TIMER_OCR_0 OCR0A -#define TIMER_COUNTER_0 TCNT0 - -#define _CAT(a,V...) a##V -#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare) -#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer) -#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer) - -/** - * On AVR there is no hardware prioritization and preemption of - * interrupts, so this emulates it. The UART has first priority - * (otherwise, characters will be lost due to UART overflow). - * Then: Stepper, Endstops, Temperature, and -finally- all others. - */ -#define HAL_timer_isr_prologue(TIMER_NUM) -#define HAL_timer_isr_epilogue(TIMER_NUM) - -/* 18 cycles maximum latency */ -#ifndef HAL_STEP_TIMER_ISR - -#define HAL_STEP_TIMER_ISR() \ -extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \ -extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \ -void TIMER1_COMPA_vect() { \ - __asm__ __volatile__ ( \ - A("push r16") /* 2 Save R16 */ \ - A("in r16, __SREG__") /* 1 Get SREG */ \ - A("push r16") /* 2 Save SREG into stack */ \ - A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \ - A("push r16") /* 2 Save TIMSK0 into the stack */ \ - A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \ - A("sts %[timsk0], r16") /* 2 And set the new value */ \ - A("lds r16, %[timsk1]") /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \ - A("andi r16,~%[msk1]") /* 1 Disable the stepper ISR */ \ - A("sts %[timsk1], r16") /* 2 And set the new value */ \ - A("push r16") /* 2 Save TIMSK1 into stack */ \ - A("in r16, 0x3B") /* 1 Get RAMPZ register */ \ - A("push r16") /* 2 Save RAMPZ into stack */ \ - A("in r16, 0x3C") /* 1 Get EIND register */ \ - A("push r0") /* C runtime can modify all the following registers without restoring them */ \ - A("push r1") \ - A("push r18") \ - A("push r19") \ - A("push r20") \ - A("push r21") \ - A("push r22") \ - A("push r23") \ - A("push r24") \ - A("push r25") \ - A("push r26") \ - A("push r27") \ - A("push r30") \ - A("push r31") \ - A("clr r1") /* C runtime expects this register to be 0 */ \ - A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \ - A("pop r31") \ - A("pop r30") \ - A("pop r27") \ - A("pop r26") \ - A("pop r25") \ - A("pop r24") \ - A("pop r23") \ - A("pop r22") \ - A("pop r21") \ - A("pop r20") \ - A("pop r19") \ - A("pop r18") \ - A("pop r1") \ - A("pop r0") \ - A("out 0x3C, r16") /* 1 Restore EIND register */ \ - A("pop r16") /* 2 Get the original RAMPZ register value */ \ - A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \ - A("pop r16") /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \ - A("ori r16,%[msk1]") /* 1 Reenable the stepper ISR */ \ - A("cli") /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \ - A("sts %[timsk1], r16") /* 2 And restore the old value - This reenables the stepper ISR */ \ - A("pop r16") /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \ - A("sts %[timsk0], r16") /* 2 And restore the old value - This reenables the temperature ISR */ \ - A("pop r16") /* 2 Get the old SREG value */ \ - A("out __SREG__, r16") /* 1 And restore the SREG value */ \ - A("pop r16") /* 2 Restore R16 value */ \ - A("reti") /* 4 Return from interrupt */ \ - : \ - : [timsk0] "i" ((uint16_t)&TIMSK0), \ - [timsk1] "i" ((uint16_t)&TIMSK1), \ - [msk0] "M" ((uint8_t)(1<. - * - */ - -/** - * Based on u8g_com_st7920_hw_spi.c - * - * Universal 8bit Graphics Library - * - * Copyright (c) 2011, olikraus@gmail.com - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM) - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_U8GLIB - -#include "../shared/Marduino.h" -#include "../shared/Delay.h" - -#include - -uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock; -volatile uint8_t *u8g_outData, *u8g_outClock; - -static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) { - u8g_outData = portOutputRegister(digitalPinToPort(dataPin)); - u8g_outClock = portOutputRegister(digitalPinToPort(clockPin)); - u8g_bitData = digitalPinToBitMask(dataPin); - u8g_bitClock = digitalPinToBitMask(clockPin); - - u8g_bitNotClock = u8g_bitClock; - u8g_bitNotClock ^= 0xFF; - - u8g_bitNotData = u8g_bitData; - u8g_bitNotData ^= 0xFF; -} - -void u8g_spiSend_sw_AVR_mode_0(uint8_t val) { - uint8_t bitData = u8g_bitData, - bitNotData = u8g_bitNotData, - bitClock = u8g_bitClock, - bitNotClock = u8g_bitNotClock; - volatile uint8_t *outData = u8g_outData, - *outClock = u8g_outClock; - U8G_ATOMIC_START(); - LOOP_L_N(i, 8) { - if (val & 0x80) - *outData |= bitData; - else - *outData &= bitNotData; - *outClock |= bitClock; - val <<= 1; - *outClock &= bitNotClock; - } - U8G_ATOMIC_END(); -} - -void u8g_spiSend_sw_AVR_mode_3(uint8_t val) { - uint8_t bitData = u8g_bitData, - bitNotData = u8g_bitNotData, - bitClock = u8g_bitClock, - bitNotClock = u8g_bitNotClock; - volatile uint8_t *outData = u8g_outData, - *outClock = u8g_outClock; - U8G_ATOMIC_START(); - LOOP_L_N(i, 8) { - *outClock &= bitNotClock; - if (val & 0x80) - *outData |= bitData; - else - *outData &= bitNotData; - *outClock |= bitClock; - val <<= 1; - } - U8G_ATOMIC_END(); -} - - -#if ENABLED(FYSETC_MINI_12864) - #define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_3 -#else - #define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_0 -#endif - -uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - switch (msg) { - case U8G_COM_MSG_INIT: - u8g_com_arduino_init_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK]); - u8g_com_arduino_assign_pin_output_high(u8g); - u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 0); - u8g_com_arduino_digital_write(u8g, U8G_PI_MOSI, 0); - break; - - case U8G_COM_MSG_STOP: - break; - - case U8G_COM_MSG_RESET: - if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_CHIP_SELECT: - #if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 - if (arg_val) { // SCK idle state needs to be set to the proper idle state before - // the next chip select goes active - u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active - u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); - } - else { - u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH); - u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 0); // Set SCK to mode 0 idle state after CS goes inactive - } - #else - u8g_com_arduino_digital_write(u8g, U8G_PI_CS, !arg_val); - #endif - break; - - case U8G_COM_MSG_WRITE_BYTE: - SPISEND_SW_AVR(arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: { - uint8_t *ptr = (uint8_t *)arg_ptr; - while (arg_val > 0) { - SPISEND_SW_AVR(*ptr++); - arg_val--; - } - } - break; - - case U8G_COM_MSG_WRITE_SEQ_P: { - uint8_t *ptr = (uint8_t *)arg_ptr; - while (arg_val > 0) { - SPISEND_SW_AVR(u8g_pgm_read(ptr)); - ptr++; - arg_val--; - } - } - break; - - case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ - u8g_com_arduino_digital_write(u8g, U8G_PI_A0, arg_val); - break; - } - return 1; -} - -#endif // HAS_MARLINUI_U8GLIB -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/AVR/watchdog.cpp b/Marlin/src/HAL/AVR/watchdog.cpp deleted file mode 100644 index 3f10c4adff..0000000000 --- a/Marlin/src/HAL/AVR/watchdog.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __AVR__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - -#include "watchdog.h" - -#include "../../MarlinCore.h" - -// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s. -void watchdog_init() { - #if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S) - #define WDTO_NS WDTO_8S - #else - #define WDTO_NS WDTO_4S - #endif - #if ENABLED(WATCHDOG_RESET_MANUAL) - // Enable the watchdog timer, but only for the interrupt. - // Take care, as this requires the correct order of operation, with interrupts disabled. - // See the datasheet of any AVR chip for details. - wdt_reset(); - cli(); - _WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE); - _WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5 - // So worked for up to WDTO_2S - sei(); - wdt_reset(); - #else - wdt_enable(WDTO_NS); // The function handles the upper bit correct. - #endif - //delay(10000); // test it! -} - -//=========================================================================== -//=================================== ISR =================================== -//=========================================================================== - -// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled. -#if ENABLED(WATCHDOG_RESET_MANUAL) - ISR(WDT_vect) { - sei(); // With the interrupt driven serial we need to allow interrupts. - SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED); - minkill(); // interrupt-safe final kill and infinite loop - } -#endif - -#endif // USE_WATCHDOG -#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/watchdog.h b/Marlin/src/HAL/AVR/watchdog.h deleted file mode 100644 index a16c88b35e..0000000000 --- a/Marlin/src/HAL/AVR/watchdog.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// Initialize watchdog with a 4 second interrupt time -void watchdog_init(); - -// Reset watchdog. MUST be called at least every 4 seconds after the -// first watchdog_init or AVR will go into emergency procedures. -inline void HAL_watchdog_refresh() { wdt_reset(); } diff --git a/Marlin/src/HAL/DUE/DebugMonitor.cpp b/Marlin/src/HAL/DUE/DebugMonitor.cpp deleted file mode 100644 index 79759151d8..0000000000 --- a/Marlin/src/HAL/DUE/DebugMonitor.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_SAM - -#include "../../core/macros.h" -#include "../../core/serial.h" - -#include "../shared/backtrace/unwinder.h" -#include "../shared/backtrace/unwmemaccess.h" - -#include - -// Debug monitor that dumps to the Programming port all status when -// an exception or WDT timeout happens - And then resets the board - -// All the Monitor routines must run with interrupts disabled and -// under an ISR execution context. That is why we cannot reuse the -// Serial interrupt routines or any C runtime, as we don't know the -// state we are when running them - -// A SW memory barrier, to ensure GCC does not overoptimize loops -#define sw_barrier() __asm__ volatile("": : :"memory"); - -// (re)initialize UART0 as a monitor output to 250000,n,8,1 -static void TXBegin() { - - // Disable UART interrupt in NVIC - NVIC_DisableIRQ( UART_IRQn ); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); - - // Disable clock - pmc_disable_periph_clk( ID_UART ); - - // Configure PMC - pmc_enable_periph_clk( ID_UART ); - - // Disable PDC channel - UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; - - // Reset and disable receiver and transmitter - UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; - - // Configure mode: 8bit, No parity, 1 bit stop - UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; - - // Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds - UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4)); - - // Enable receiver and transmitter - UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; -} - -// Send character through UART with no interrupts -static void TX(char c) { - while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); }; - UART->UART_THR = c; -} - -// Send String through UART -static void TX(const char* s) { - while (*s) TX(*s++); -} - -static void TXDigit(uint32_t d) { - if (d < 10) TX((char)(d+'0')); - else if (d < 16) TX((char)(d+'A'-10)); - else TX('?'); -} - -// Send Hex number thru UART -static void TXHex(uint32_t v) { - TX("0x"); - for (uint8_t i = 0; i < 8; i++, v <<= 4) - TXDigit((v >> 28) & 0xF); -} - -// Send Decimal number thru UART -static void TXDec(uint32_t v) { - if (!v) { - TX('0'); - return; - } - - char nbrs[14]; - char *p = &nbrs[0]; - while (v != 0) { - *p++ = '0' + (v % 10); - v /= 10; - } - do { - p--; - TX(*p); - } while (p != &nbrs[0]); -} - -// Dump a backtrace entry -static bool UnwReportOut(void* ctx, const UnwReport* bte) { - int* p = (int*)ctx; - - (*p)++; - TX('#'); TXDec(*p); TX(" : "); - TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); - TX('+'); TXDec(bte->address - bte->function); - TX(" PC:");TXHex(bte->address); TX('\n'); - return true; -} - -#ifdef UNW_DEBUG - void UnwPrintf(const char* format, ...) { - char dest[256]; - va_list argptr; - va_start(argptr, format); - vsprintf(dest, format, argptr); - va_end(argptr); - TX(&dest[0]); - } -#endif - -/* Table of function pointers for passing to the unwinder */ -static const UnwindCallbacks UnwCallbacks = { - UnwReportOut, - UnwReadW, - UnwReadH, - UnwReadB - #ifdef UNW_DEBUG - , UnwPrintf - #endif -}; - -/** - * HardFaultHandler_C: - * This is called from the HardFault_HandlerAsm with a pointer the Fault stack - * as the parameter. We can then read the values from the stack and place them - * into local variables for ease of reading. - * We then read the various Fault Status and Address Registers to help decode - * cause of the fault. - * The function ends with a BKPT instruction to force control back into the debugger - */ -extern "C" -void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { - - static const char* causestr[] = { - "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" - }; - - UnwindFrame btf; - - // Dump report to the Programming port (interrupts are DISABLED) - TXBegin(); - TX("\n\n## Software Fault detected ##\n"); - TX("Cause: "); TX(causestr[cause]); TX('\n'); - - TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); - TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); - TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); - TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); - TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); - TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); - TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); - TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); - - // Configurable Fault Status Register - // Consists of MMSR, BFSR and UFSR - TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); - - // Hard Fault Status Register - TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); - - // Debug Fault Status Register - TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); - - // Auxiliary Fault Status Register - TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); - - // Read the Fault Address Registers. These may not contain valid values. - // Check BFARVALID/MMARVALID to see if they are valid values - // MemManage Fault Address Register - TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); - - // Bus Fault Address Register - TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); - - TX("ExcLR: "); TXHex(lr); TX('\n'); - TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); - - btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer - btf.fp = btf.sp; - btf.lr = ((unsigned long)sp[5]); - btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it - - // Perform a backtrace - TX("\nBacktrace:\n\n"); - int ctr = 0; - UnwindStart(&btf, &UnwCallbacks, &ctr); - - // Disable all NVIC interrupts - NVIC->ICER[0] = 0xFFFFFFFF; - NVIC->ICER[1] = 0xFFFFFFFF; - - // Relocate VTOR table to default position - SCB->VTOR = 0; - - // Disable USB - otg_disable(); - - // Restart watchdog - WDT_Restart(WDT); - - // Reset controller - NVIC_SystemReset(); - for (;;) WDT_Restart(WDT); -} - -__attribute__((naked)) void NMI_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#0") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void HardFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#1") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void MemManage_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#2") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void BusFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#3") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void UsageFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#4") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void DebugMon_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#5") - A("b HardFault_HandlerC") - ); -} - -/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ -__attribute__((naked)) void WDT_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#6") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void RSTC_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#7") - A("b HardFault_HandlerC") - ); -} - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp deleted file mode 100644 index 6ce85a4643..0000000000 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL for Arduino Due and compatible (SAM3X8E) - */ - -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" -#include "HAL.h" - -#include -#include "usb/usb_task.h" - -// ------------------------ -// Public Variables -// ------------------------ - -uint16_t HAL_adc_result; - -// ------------------------ -// Public functions -// ------------------------ - -// HAL initialization task -void HAL_init() { - // Initialize the USB stack - #if ENABLED(SDSUPPORT) - OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up - #endif - usb_task_init(); -} - -// HAL idle task -void HAL_idletask() { - // Perform USB stack housekeeping - usb_task_idle(); -} - -// Disable interrupts -void cli() { noInterrupts(); } - -// Enable interrupts -void sei() { interrupts(); } - -void HAL_clear_reset_source() { } - -uint8_t HAL_get_reset_source() { - switch ((RSTC->RSTC_SR >> 8) & 0x07) { - case 0: return RST_POWER_ON; - case 1: return RST_BACKUP; - case 2: return RST_WATCHDOG; - case 3: return RST_SOFTWARE; - case 4: return RST_EXTERNAL; - default: return 0; - } -} - -void _delay_ms(const int delay_ms) { - // Todo: port for Due? - delay(delay_ms); -} - -extern "C" { - extern unsigned int _ebss; // end of bss section -} - -// Return free memory between end of heap (or end bss) and whatever is current -int freeMemory() { - int free_memory, heap_end = (int)_sbrk(0); - return (int)&free_memory - (heap_end ?: (int)&_ebss); -} - -// ------------------------ -// ADC -// ------------------------ - -void HAL_adc_start_conversion(const uint8_t ch) { - HAL_adc_result = analogRead(ch); -} - -uint16_t HAL_adc_get_result() { - // nop - return HAL_adc_result; -} - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h deleted file mode 100644 index 88ace59575..0000000000 --- a/Marlin/src/HAL/DUE/HAL.h +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL for Arduino Due and compatible (SAM3X8E) - */ - -#define CPU_32_BIT - -#include "../shared/Marduino.h" -#include "../shared/eeprom_if.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" -#include "fastio.h" -#include "watchdog.h" - -#include - -#define _MSERIAL(X) Serial##X -#define MSERIAL(X) _MSERIAL(X) -#define Serial0 Serial - -// Define MYSERIAL0/1 before MarlinSerial includes! -#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER) - #define MYSERIAL0 customizedSerial1 -#elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) -#else - #error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration." -#endif - -#ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER) - #define MYSERIAL1 customizedSerial2 - #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) - #else - #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." - #endif -#endif - -#ifdef LCD_SERIAL_PORT - #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL lcdSerial - #elif WITHIN(LCD_SERIAL_PORT, 0, 3) - #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) - #else - #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." - #endif -#endif - -#include "MarlinSerial.h" -#include "MarlinSerialUSB.h" - -// On AVR this is in math.h? -#define square(x) ((x)*(x)) - -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*((void**)(addr))) -#undef pgm_read_word -#define pgm_read_word(addr) (*((uint16_t*)(addr))) - -typedef int8_t pin_t; - -#define SHARED_SERVOS HAS_SERVOS -#define HAL_SERVO_LIB Servo - -// -// Interrupts -// -#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() -#define CRITICAL_SECTION_END() if (!primask) __enable_irq() -#define ISRS_ENABLED() (!__get_PRIMASK()) -#define ENABLE_ISRS() __enable_irq() -#define DISABLE_ISRS() __disable_irq() - -void cli(); // Disable interrupts -void sei(); // Enable interrupts - -void HAL_clear_reset_source(); // clear reset reason -uint8_t HAL_get_reset_source(); // get reset reason - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -// -// ADC -// -extern uint16_t HAL_adc_result; // result of last ADC conversion - -#ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) -#endif - -#define HAL_ANALOG_SELECT(ch) - -inline void HAL_adc_init() {}//todo - -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 -#define HAL_START_ADC(ch) HAL_adc_start_conversion(ch) -#define HAL_READ_ADC() HAL_adc_result -#define HAL_ADC_READY() true - -void HAL_adc_start_conversion(const uint8_t ch); -uint16_t HAL_adc_get_result(); - -// -// Pin Map -// -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -// -// Tone -// -void toneInit(); -void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0); -void noTone(const pin_t _pin); - -// Enable hooks into idle and setup for HAL -#define HAL_IDLETASK 1 -void HAL_idletask(); -void HAL_init(); - -// -// Utility functions -// -void _delay_ms(const int delay); - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -int freeMemory(); -#pragma GCC diagnostic pop - -#ifdef __cplusplus - extern "C" { -#endif -char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s); -#ifdef __cplusplus - } -#endif diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp deleted file mode 100644 index 0451d8bcc4..0000000000 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ /dev/null @@ -1,825 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Software SPI functions originally from Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman - * - * Completely rewritten and tuned by Eduardo José Tagle in 2017/2018 - * in ARM thumb2 inline assembler and tuned for maximum speed and performance - * allowing SPI clocks of up to 12 Mhz to increase SD card read/write performance - */ - -/** - * HAL for Arduino Due and compatible (SAM3X8E) - * - * For ARDUINO_ARCH_SAM - */ - -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" -#include "../shared/Delay.h" - -// ------------------------ -// Public functions -// ------------------------ - -#if EITHER(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI) - - // ------------------------ - // Software SPI - // ------------------------ - - // Make sure GCC optimizes this file. - // Note that this line triggers a bug in GCC which is fixed by casting. - // See the note below. - #pragma GCC optimize (3) - - typedef uint8_t (*pfnSpiTransfer)(uint8_t b); - typedef void (*pfnSpiRxBlock)(uint8_t* buf, uint32_t nbyte); - typedef void (*pfnSpiTxBlock)(const uint8_t* buf, uint32_t nbyte); - - /* ---------------- Macros to be able to access definitions from asm */ - #define _PORT(IO) DIO ## IO ## _WPORT - #define _PIN_MASK(IO) MASK(DIO ## IO ## _PIN) - #define _PIN_SHIFT(IO) DIO ## IO ## _PIN - #define PORT(IO) _PORT(IO) - #define PIN_MASK(IO) _PIN_MASK(IO) - #define PIN_SHIFT(IO) _PIN_SHIFT(IO) - - // run at ~8 .. ~10Mhz - Tx version (Rx data discarded) - static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0 - uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ - uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); - uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ - uint32_t SCK_MASK = PIN_MASK(SCK_PIN); - uint32_t idx = 0; - - /* Negate bout, as the assembler requires a negated value */ - bout = ~bout; - - /* The software SPI routine */ - __asm__ __volatile__( - A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax - - /* Bit 7 */ - A("ubfx %[idx],%[txval],#7,#1") /* Place bit 7 in bit 0 of idx*/ - - A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[idx],%[txval],#6,#1") /* Place bit 6 in bit 0 of idx*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 6 */ - A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[idx],%[txval],#5,#1") /* Place bit 5 in bit 0 of idx*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 5 */ - A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[idx],%[txval],#4,#1") /* Place bit 4 in bit 0 of idx*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 4 */ - A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[idx],%[txval],#3,#1") /* Place bit 3 in bit 0 of idx*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 3 */ - A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[idx],%[txval],#2,#1") /* Place bit 2 in bit 0 of idx*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 2 */ - A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[idx],%[txval],#1,#1") /* Place bit 1 in bit 0 of idx*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 1 */ - A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[idx],%[txval],#0,#1") /* Place bit 0 in bit 0 of idx*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 0 */ - A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("nop") /* Result will be 0 */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - : [idx]"+r"( idx ) - : [txval]"r"( bout ) , - [mosi_mask]"r"( MOSI_MASK ), - [mosi_port]"r"( MOSI_PORT_PLUS30 ), - [sck_mask]"r"( SCK_MASK ), - [sck_port]"r"( SCK_PORT_PLUS30 ) - : "cc" - ); - - return 0; - } - - // Calculates the bit band alias address and returns a pointer address to word. - // addr: The byte address of bitbanding bit. - // bit: The bit position of bitbanding bit. - #define BITBAND_ADDRESS(addr, bit) \ - (((uint32_t)(addr) & 0xF0000000) + 0x02000000 + ((uint32_t)(addr)&0xFFFFF)*32 + (bit)*4) - - // run at ~8 .. ~10Mhz - Rx version (Tx line not altered) - static uint8_t spiTransferRx0(uint8_t) { // using Mode 0 - uint32_t bin = 0; - uint32_t work = 0; - uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ - uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ - uint32_t SCK_MASK = PIN_MASK(SCK_PIN); - - /* The software SPI routine */ - __asm__ __volatile__( - A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax - - /* bit 7 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */ - - /* bit 6 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */ - - /* bit 5 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */ - - /* bit 4 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */ - - /* bit 3 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */ - - /* bit 2 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */ - - /* bit 1 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */ - - /* bit 0 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ - - : [bin]"+r"(bin), - [work]"+r"(work) - : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), - [sck_mask]"r"( SCK_MASK ), - [sck_port]"r"( SCK_PORT_PLUS30 ) - : "cc" - ); - - return bin; - } - - // run at ~4Mhz - static uint8_t spiTransfer1(uint8_t b) { // using Mode 0 - int bits = 8; - do { - WRITE(MOSI_PIN, b & 0x80); - b <<= 1; // little setup time - - WRITE(SCK_PIN, HIGH); - DELAY_NS(125); // 10 cycles @ 84mhz - - b |= (READ(MISO_PIN) != 0); - - WRITE(SCK_PIN, LOW); - DELAY_NS(125); // 10 cycles @ 84mhz - } while (--bits); - return b; - } - - // all the others - static uint32_t spiDelayCyclesX4 = (F_CPU) / 1000000; // 4µs => 125khz - - static uint8_t spiTransferX(uint8_t b) { // using Mode 0 - int bits = 8; - do { - WRITE(MOSI_PIN, b & 0x80); - b <<= 1; // little setup time - - WRITE(SCK_PIN, HIGH); - __delay_4cycles(spiDelayCyclesX4); - - b |= (READ(MISO_PIN) != 0); - - WRITE(SCK_PIN, LOW); - __delay_4cycles(spiDelayCyclesX4); - } while (--bits); - return b; - } - - // Pointers to generic functions for byte transfers - - /** - * Note: The cast is unnecessary, but without it, this file triggers a GCC 4.8.3-2014 bug. - * Later GCC versions do not have this problem, but at this time (May 2018) Arduino still - * uses that buggy and obsolete GCC version!! - */ - static pfnSpiTransfer spiTransferRx = (pfnSpiTransfer)spiTransferX; - static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX; - - // Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded) - static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) { - uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ - uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); - uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ - uint32_t SCK_MASK = PIN_MASK(SCK_PIN); - uint32_t work = 0; - uint32_t txval = 0; - - /* The software SPI routine */ - __asm__ __volatile__( - A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax - - L("loop%=") - A("ldrb.w %[txval], [%[ptr]], #1") /* Load value to send, increment buffer */ - A("mvn %[txval],%[txval]") /* Negate value */ - - /* Bit 7 */ - A("ubfx %[work],%[txval],#7,#1") /* Place bit 7 in bit 0 of work*/ - - A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[work],%[txval],#6,#1") /* Place bit 6 in bit 0 of work*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 6 */ - A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[work],%[txval],#5,#1") /* Place bit 5 in bit 0 of work*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 5 */ - A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[work],%[txval],#4,#1") /* Place bit 4 in bit 0 of work*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 4 */ - A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[work],%[txval],#3,#1") /* Place bit 3 in bit 0 of work*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 3 */ - A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[work],%[txval],#2,#1") /* Place bit 2 in bit 0 of work*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 2 */ - A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[work],%[txval],#1,#1") /* Place bit 1 in bit 0 of work*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 1 */ - A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ubfx %[work],%[txval],#0,#1") /* Place bit 0 in bit 0 of work*/ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - - /* Bit 0 */ - A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("subs %[todo],#1") /* Decrement count of pending words to send, update status */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bne.n loop%=") /* Repeat until done */ - - : [ptr]"+r" ( ptr ) , - [todo]"+r" ( todo ) , - [work]"+r"( work ) , - [txval]"+r"( txval ) - : [mosi_mask]"r"( MOSI_MASK ), - [mosi_port]"r"( MOSI_PORT_PLUS30 ), - [sck_mask]"r"( SCK_MASK ), - [sck_port]"r"( SCK_PORT_PLUS30 ) - : "cc" - ); - } - - static void spiRxBlock0(uint8_t* ptr, uint32_t todo) { - uint32_t bin = 0; - uint32_t work = 0; - uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ - uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ - uint32_t SCK_MASK = PIN_MASK(SCK_PIN); - - /* The software SPI routine */ - __asm__ __volatile__( - A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax - - L("loop%=") - - /* bit 7 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */ - - /* bit 6 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */ - - /* bit 5 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */ - - /* bit 4 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */ - - /* bit 3 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */ - - /* bit 2 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */ - - /* bit 1 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */ - - /* bit 0 */ - A("str %[sck_mask],[%[sck_port]]") /* SODR */ - A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ - A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ - A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ - - A("subs %[todo],#1") /* Decrement count of pending words to send, update status */ - A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */ - A("bne.n loop%=") /* Repeat until done */ - - : [ptr]"+r"(ptr), - [todo]"+r"(todo), - [bin]"+r"(bin), - [work]"+r"(work) - : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), - [sck_mask]"r"( SCK_MASK ), - [sck_port]"r"( SCK_PORT_PLUS30 ) - : "cc" - ); - } - - static void spiTxBlockX(const uint8_t* buf, uint32_t todo) { - do { - (void)spiTransferTx(*buf++); - } while (--todo); - } - - static void spiRxBlockX(uint8_t* buf, uint32_t todo) { - do { - *buf++ = spiTransferRx(0xFF); - } while (--todo); - } - - // Pointers to generic functions for block tranfers - static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; - static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; - - #if MB(ALLIGATOR) - #define _SS_WRITE(S) WRITE(SS_PIN, S) - #else - #define _SS_WRITE(S) NOOP - #endif - - void spiBegin() { - SET_OUTPUT(SS_PIN); - _SS_WRITE(HIGH); - SET_OUTPUT(SCK_PIN); - SET_INPUT(MISO_PIN); - SET_OUTPUT(MOSI_PIN); - } - - uint8_t spiRec() { - _SS_WRITE(LOW); - WRITE(MOSI_PIN, HIGH); // Output 1s 1 - uint8_t b = spiTransferRx(0xFF); - _SS_WRITE(HIGH); - return b; - } - - void spiRead(uint8_t* buf, uint16_t nbyte) { - if (nbyte) { - _SS_WRITE(LOW); - WRITE(MOSI_PIN, HIGH); // Output 1s 1 - spiRxBlock(buf, nbyte); - _SS_WRITE(HIGH); - } - } - - void spiSend(uint8_t b) { - _SS_WRITE(LOW); - (void)spiTransferTx(b); - _SS_WRITE(HIGH); - } - - void spiSendBlock(uint8_t token, const uint8_t* buf) { - _SS_WRITE(LOW); - (void)spiTransferTx(token); - spiTxBlock(buf, 512); - _SS_WRITE(HIGH); - } - - /** - * spiRate should be - * 0 : 8 - 10 MHz - * 1 : 4 - 5 MHz - * 2 : 2 - 2.5 MHz - * 3 : 1 - 1.25 MHz - * 4 : 500 - 625 kHz - * 5 : 250 - 312 kHz - * 6 : 125 - 156 kHz - */ - void spiInit(uint8_t spiRate) { - switch (spiRate) { - case 0: - spiTransferTx = (pfnSpiTransfer)spiTransferTx0; - spiTransferRx = (pfnSpiTransfer)spiTransferRx0; - spiTxBlock = (pfnSpiTxBlock)spiTxBlock0; - spiRxBlock = (pfnSpiRxBlock)spiRxBlock0; - break; - case 1: - spiTransferTx = (pfnSpiTransfer)spiTransfer1; - spiTransferRx = (pfnSpiTransfer)spiTransfer1; - spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; - spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; - break; - default: - spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate); - spiTransferTx = (pfnSpiTransfer)spiTransferX; - spiTransferRx = (pfnSpiTransfer)spiTransferX; - spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; - spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; - break; - } - - _SS_WRITE(HIGH); - WRITE(MOSI_PIN, HIGH); - WRITE(SCK_PIN, LOW); - } - - /** Begin SPI transaction, set clock, bit order, data mode */ - void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - // TODO: to be implemented - } - - #pragma GCC reset_options - -#else // !SOFTWARE_SPI - - #define WHILE_TX(N) while ((SPI0->SPI_SR & SPI_SR_TDRE) == (N)) - #define WHILE_RX(N) while ((SPI0->SPI_SR & SPI_SR_RDRF) == (N)) - #define FLUSH_TX() do{ WHILE_RX(1) SPI0->SPI_RDR; }while(0) - - #if MB(ALLIGATOR) - - // slave selects controlled by SPI controller - // doesn't support changing SPI speeds for SD card - - // ------------------------ - // hardware SPI - // ------------------------ - static bool spiInitialized = false; - - void spiInit(uint8_t spiRate) { - if (spiInitialized) return; - - // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz - constexpr int spiDivider[] = { 10, 21, 42, 84, 168, 255, 255 }; - if (spiRate > 6) spiRate = 1; - - // Set SPI mode 1, clock, select not active after transfer, with delay between transfers - SPI_ConfigureNPCS(SPI0, SPI_CHAN_DAC, - SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDivider[spiRate]) | - SPI_CSR_DLYBCT(1)); - // Set SPI mode 0, clock, select not active after transfer, with delay between transfers - SPI_ConfigureNPCS(SPI0, SPI_CHAN_EEPROM1, SPI_CSR_NCPHA | - SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDivider[spiRate]) | - SPI_CSR_DLYBCT(1)); - - // Set SPI mode 0, clock, select not active after transfer, with delay between transfers - SPI_ConfigureNPCS(SPI0, SPI_CHAN, SPI_CSR_NCPHA | - SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDivider[spiRate]) | - SPI_CSR_DLYBCT(1)); - SPI_Enable(SPI0); - spiInitialized = true; - } - - void spiBegin() { - if (spiInitialized) return; - - // Configure SPI pins - PIO_Configure( - g_APinDescription[SCK_PIN].pPort, - g_APinDescription[SCK_PIN].ulPinType, - g_APinDescription[SCK_PIN].ulPin, - g_APinDescription[SCK_PIN].ulPinConfiguration); - PIO_Configure( - g_APinDescription[MOSI_PIN].pPort, - g_APinDescription[MOSI_PIN].ulPinType, - g_APinDescription[MOSI_PIN].ulPin, - g_APinDescription[MOSI_PIN].ulPinConfiguration); - PIO_Configure( - g_APinDescription[MISO_PIN].pPort, - g_APinDescription[MISO_PIN].ulPinType, - g_APinDescription[MISO_PIN].ulPin, - g_APinDescription[MISO_PIN].ulPinConfiguration); - - // set master mode, peripheral select, fault detection - SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS); - SPI_Enable(SPI0); - - SET_OUTPUT(DAC0_SYNC); - #if HAS_MULTI_EXTRUDER - SET_OUTPUT(DAC1_SYNC); - WRITE(DAC1_SYNC, HIGH); - #endif - SET_OUTPUT(SPI_EEPROM1_CS); - SET_OUTPUT(SPI_EEPROM2_CS); - SET_OUTPUT(SPI_FLASH_CS); - WRITE(DAC0_SYNC, HIGH); - WRITE(SPI_EEPROM1_CS, HIGH); - WRITE(SPI_EEPROM2_CS, HIGH); - WRITE(SPI_FLASH_CS, HIGH); - WRITE(SS_PIN, HIGH); - - OUT_WRITE(SDSS, LOW); - - PIO_Configure( - g_APinDescription[SPI_PIN].pPort, - g_APinDescription[SPI_PIN].ulPinType, - g_APinDescription[SPI_PIN].ulPin, - g_APinDescription[SPI_PIN].ulPinConfiguration - ); - - spiInit(1); - } - - // Read single byte from SPI - uint8_t spiRec() { - // write dummy byte with address and end transmission flag - SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER; - - WHILE_TX(0); - WHILE_RX(0); - - //DELAY_US(1U); - return SPI0->SPI_RDR; - } - - uint8_t spiRec(uint32_t chan) { - - WHILE_TX(0); - FLUSH_RX(); - - // write dummy byte with address and end transmission flag - SPI0->SPI_TDR = 0x000000FF | SPI_PCS(chan) | SPI_TDR_LASTXFER; - WHILE_RX(0); - - return SPI0->SPI_RDR; - } - - // Read from SPI into buffer - void spiRead(uint8_t* buf, uint16_t nbyte) { - if (!nbyte) return; - --nbyte; - for (int i = 0; i < nbyte; i++) { - //WHILE_TX(0); - SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN); - WHILE_RX(0); - buf[i] = SPI0->SPI_RDR; - //DELAY_US(1U); - } - buf[nbyte] = spiRec(); - } - - // Write single byte to SPI - void spiSend(const byte b) { - // write byte with address and end transmission flag - SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER; - WHILE_TX(0); - WHILE_RX(0); - SPI0->SPI_RDR; - //DELAY_US(1U); - } - - void spiSend(const uint8_t* buf, size_t nbyte) { - if (!nbyte) return; - --nbyte; - for (size_t i = 0; i < nbyte; i++) { - SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN); - WHILE_TX(0); - WHILE_RX(0); - SPI0->SPI_RDR; - //DELAY_US(1U); - } - spiSend(buf[nbyte]); - } - - void spiSend(uint32_t chan, byte b) { - WHILE_TX(0); - // write byte with address and end transmission flag - SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(chan) | SPI_TDR_LASTXFER; - WHILE_RX(0); - FLUSH_RX(); - } - - void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) { - if (!nbyte) return; - --nbyte; - for (size_t i = 0; i < nbyte; i++) { - WHILE_TX(0); - SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(chan); - WHILE_RX(0); - FLUSH_RX(); - } - spiSend(chan, buf[nbyte]); - } - - // Write from buffer to SPI - void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN); - WHILE_TX(0); - //WHILE_RX(0); - //SPI0->SPI_RDR; - for (int i = 0; i < 511; i++) { - SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN); - WHILE_TX(0); - WHILE_RX(0); - SPI0->SPI_RDR; - //DELAY_US(1U); - } - spiSend(buf[511]); - } - - /** Begin SPI transaction, set clock, bit order, data mode */ - void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - // TODO: to be implemented - } - - #else // U8G compatible hardware SPI - - #define SPI_MODE_0_DUE_HW 2 // DUE CPHA control bit is inverted - #define SPI_MODE_1_DUE_HW 3 - #define SPI_MODE_2_DUE_HW 0 - #define SPI_MODE_3_DUE_HW 1 - - /** - * The DUE SPI controller is set up so the upper word of the longword - * written to the transmit data register selects which SPI Chip Select - * Register is used. This allows different streams to have different SPI - * settings. - * - * In practice it's spooky. Some combinations hang the system, while others - * upset the peripheral device. - * - * SPI mode should be the same for all streams. The FYSETC_MINI_12864 gets - * upset if the clock phase changes after chip select goes active. - * - * SPI_CSR_CSAAT should be set for all streams. If not the WHILE_TX(0) - * macro returns immediately which can result in the SPI chip select going - * inactive before all the data has been sent. - * - * The TMC2130 library uses SPI0->SPI_CSR[3]. - * - * The U8G hardware SPI uses SPI0->SPI_CSR[0]. The system hangs and/or the - * FYSETC_MINI_12864 gets upset if lower baud rates are used and the SD card - * is inserted or removed. - * - * The SD card uses SPI0->SPI_CSR[3]. Efforts were made to use [1] and [2] - * but they all resulted in hangs or garbage on the LCD. - * - * The SPI controlled chip selects are NOT enabled in the GPIO controller. - * The application must control the chip select. - * - * All of the above can be avoided by defining FORCE_SOFT_SPI to force the - * display to use software SPI. - */ - - void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified) - // Also sets U8G SPI rate to 4MHz and the SPI mode to 3 - - // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz - constexpr int spiDivider[] = { 10, 21, 42, 84, 168, 255, 255 }; - if (spiRate > 6) spiRate = 1; - - // Enable PIOA and SPI0 - REG_PMC_PCER0 = (1UL << ID_PIOA) | (1UL << ID_SPI0); - - // Disable PIO on A26 and A27 - REG_PIOA_PDR = 0x0C000000; - OUT_WRITE(SDSS, HIGH); - - // Reset SPI0 (from sam lib) - SPI0->SPI_CR = SPI_CR_SPIDIS; - SPI0->SPI_CR = SPI_CR_SWRST; - SPI0->SPI_CR = SPI_CR_SWRST; - SPI0->SPI_CR = SPI_CR_SPIEN; - - // TMC2103 compatible setup - // Master mode, no fault detection, PCS bits in data written to TDR select CSR register - SPI0->SPI_MR = SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS; - // SPI mode 3, 8 Bit data transfer, baud rate - SPI0->SPI_CSR[3] = SPI_CSR_SCBR(spiDivider[spiRate]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW; // use same CSR as TMC2130 - SPI0->SPI_CSR[0] = SPI_CSR_SCBR(spiDivider[1]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW; // U8G default to 4MHz - } - - void spiBegin() { spiInit(); } - - static uint8_t spiTransfer(uint8_t data) { - WHILE_TX(0); - SPI0->SPI_TDR = (uint32_t)data | 0x00070000UL; // Add TMC2130 PCS bits to every byte (use SPI0->SPI_CSR[3]) - WHILE_TX(0); - WHILE_RX(0); - return SPI0->SPI_RDR; - } - - uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); } - - void spiRead(uint8_t* buf, uint16_t nbyte) { - for (int i = 0; i < nbyte; i++) - buf[i] = spiTransfer(0xFF); - } - - void spiSend(uint8_t data) { spiTransfer(data); } - - void spiSend(const uint8_t* buf, size_t nbyte) { - for (uint16_t i = 0; i < nbyte; i++) - spiTransfer(buf[i]); - } - - void spiSendBlock(uint8_t token, const uint8_t* buf) { - spiTransfer(token); - for (uint16_t i = 0; i < 512; i++) - spiTransfer(buf[i]); - } - - #endif // !ALLIGATOR -#endif // !SOFTWARE_SPI - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/InterruptVectors.cpp b/Marlin/src/HAL/DUE/InterruptVectors.cpp deleted file mode 100644 index e4e0ce99f2..0000000000 --- a/Marlin/src/HAL/DUE/InterruptVectors.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * InterruptVectors_Due.cpp - This module relocates the Interrupt vector table to SRAM, - * allowing to register new interrupt handlers at runtime. Specially valuable and needed - * because Arduino runtime allocates some interrupt handlers that we NEED to override to - * properly support extended functionality, as for example, USB host or USB device (MSD, MTP) - * and custom serial port handlers, and we don't actually want to modify and/or recompile the - * Arduino runtime. We just want to run as much as possible on Stock Arduino - * - * Copyright (c) 2017 Eduardo José Tagle. All right reserved - */ -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" -#include "HAL.h" -#include "InterruptVectors.h" - -/* The relocated Exception/Interrupt Table - According to the ARM - reference manual, alignment to 128 bytes should suffice, but in - practice, we need alignment to 256 bytes to make this work in all - cases */ -__attribute__ ((aligned(256))) -static DeviceVectors ram_tab = { nullptr }; - -/** - * This function checks if the exception/interrupt table is already in SRAM or not. - * If it is not, then it copies the ROM table to the SRAM and relocates the table - * by reprogramming the NVIC registers - */ -static pfnISR_Handler* get_relocated_table_addr() { - // Get the address of the interrupt/exception table - uint32_t isrtab = SCB->VTOR; - - // If already relocated, we are done! - if (isrtab >= IRAM0_ADDR) - return (pfnISR_Handler*)isrtab; - - // Get the address of the table stored in FLASH - const pfnISR_Handler* romtab = (const pfnISR_Handler*)isrtab; - - // Copy it to SRAM - memcpy(&ram_tab, romtab, sizeof(ram_tab)); - - // Disable global interrupts - CRITICAL_SECTION_START(); - - // Set the vector table base address to the SRAM copy - SCB->VTOR = (uint32_t)(&ram_tab); - - // Reenable interrupts - CRITICAL_SECTION_END(); - - // Return the address of the table - return (pfnISR_Handler*)(&ram_tab); -} - -pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler) { - // Get the address of the relocated table - pfnISR_Handler *isrtab = get_relocated_table_addr(); - - // Disable global interrupts - CRITICAL_SECTION_START(); - - // Get the original handler - pfnISR_Handler oldHandler = isrtab[irq + 16]; - - // Install the new one - isrtab[irq + 16] = newHandler; - - // Reenable interrupts - CRITICAL_SECTION_END(); - - // Return the original one - return oldHandler; -} - -#endif diff --git a/Marlin/src/HAL/DUE/InterruptVectors.h b/Marlin/src/HAL/DUE/InterruptVectors.h deleted file mode 100644 index 6faeb34b7a..0000000000 --- a/Marlin/src/HAL/DUE/InterruptVectors.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * InterruptVectors_Due.h - * - * This module relocates the Interrupt vector table to SRAM, allowing new - * interrupt handlers to be added at runtime. This is required because the - * Arduino runtime steals interrupt handlers that Marlin MUST use to support - * extended functionality such as USB hosts and USB devices (MSD, MTP) and - * custom serial port handlers. Rather than modifying and/or recompiling the - * Arduino runtime, We just want to run as much as possible on Stock Arduino. - * - * Copyright (c) 2017 Eduardo José Tagle. All right reserved - */ - -#ifdef ARDUINO_ARCH_SAM - -// ISR handler type -typedef void (*pfnISR_Handler)(); - -// Install a new interrupt vector handler for the given irq, returning the old one -pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler); - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/MarlinSerial.cpp b/Marlin/src/HAL/DUE/MarlinSerial.cpp deleted file mode 100644 index c9a372eeb1..0000000000 --- a/Marlin/src/HAL/DUE/MarlinSerial.cpp +++ /dev/null @@ -1,641 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE - * Copyright (c) 2017 Eduardo José Tagle. All right reserved - * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. - */ -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" - -#include "MarlinSerial.h" -#include "InterruptVectors.h" -#include "../../MarlinCore.h" - -template typename MarlinSerial::ring_buffer_r MarlinSerial::rx_buffer = { 0, 0, { 0 } }; -template typename MarlinSerial::ring_buffer_t MarlinSerial::tx_buffer = { 0 }; -template bool MarlinSerial::_written = false; -template uint8_t MarlinSerial::xon_xoff_state = MarlinSerial::XON_XOFF_CHAR_SENT | MarlinSerial::XON_CHAR; -template uint8_t MarlinSerial::rx_dropped_bytes = 0; -template uint8_t MarlinSerial::rx_buffer_overruns = 0; -template uint8_t MarlinSerial::rx_framing_errors = 0; -template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::rx_max_enqueued = 0; - -// A SW memory barrier, to ensure GCC does not overoptimize loops -#define sw_barrier() asm volatile("": : :"memory"); - -#include "../../feature/e_parser.h" - -// (called with RX interrupts disabled) -template -FORCE_INLINE void MarlinSerial::store_rxd_char() { - - static EmergencyParser::State emergency_state; // = EP_RESET - - // Get the tail - Nothing can alter its value while we are at this ISR - const ring_buffer_pos_t t = rx_buffer.tail; - - // Get the head pointer - ring_buffer_pos_t h = rx_buffer.head; - - // Get the next element - ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // Read the character from the USART - uint8_t c = HWUART->UART_RHR; - - if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the RX FIFO is - // full, so don't write the character or advance the head. - if (i != t) { - rx_buffer.buffer[h] = c; - h = i; - } - else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) - --rx_dropped_bytes; - - const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - // Calculate count of bytes stored into the RX buffer - - // Keep track of the maximum count of enqueued bytes - if (Cfg::MAX_RX_QUEUED) NOLESS(rx_max_enqueued, rx_count); - - if (Cfg::XONOFF) { - // If the last char that was sent was an XON - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { - - // Bytes stored into the RX buffer - const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // If over 12.5% of RX buffer capacity, send XOFF before running out of - // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react - // and stop sending bytes. This translates to 13mS propagation time. - if (rx_count >= (Cfg::RX_SIZE) / 8) { - - // At this point, definitely no TX interrupt was executing, since the TX isr can't be preempted. - // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens - // to be in the middle of trying to disable the RX interrupt in the main program, eventually the - // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure - // the sending of the XOFF char is to send it HERE AND NOW. - - // About to send the XOFF char - xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; - - // Wait until the TX register becomes empty and send it - Here there could be a problem - // - While waiting for the TX register to empty, the RX register could receive a new - // character. This must also handle that situation! - uint32_t status; - while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) { - - if (status & UART_SR_RXRDY) { - // We received a char while waiting for the TX buffer to be empty - Receive and process it! - - i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // Read the character from the USART - c = HWUART->UART_RHR; - - if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the FIFO is - // full, so don't write the character or advance the head. - if (i != t) { - rx_buffer.buffer[h] = c; - h = i; - } - else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) - --rx_dropped_bytes; - } - sw_barrier(); - } - - HWUART->UART_THR = XOFF_CHAR; - - // At this point there could be a race condition between the write() function - // and this sending of the XOFF char. This interrupt could happen between the - // wait to be empty TX buffer loop and the actual write of the character. Since - // the TX buffer is full because it's sending the XOFF char, the only way to be - // sure the write() function will succeed is to wait for the XOFF char to be - // completely sent. Since an extra character could be received during the wait - // it must also be handled! - while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) { - - if (status & UART_SR_RXRDY) { - // A char arrived while waiting for the TX buffer to be empty - Receive and process it! - - i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - - // Read the character from the USART - c = HWUART->UART_RHR; - - if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); - - // If the character is to be stored at the index just before the tail - // (such that the head would advance to the current tail), the FIFO is - // full, so don't write the character or advance the head. - if (i != t) { - rx_buffer.buffer[h] = c; - h = i; - } - else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) - --rx_dropped_bytes; - } - sw_barrier(); - } - - // At this point everything is ready. The write() function won't - // have any issues writing to the UART TX register if it needs to! - } - } - } - - // Store the new head value - rx_buffer.head = h; -} - -template -FORCE_INLINE void MarlinSerial::_tx_thr_empty_irq() { - if (Cfg::TX_SIZE > 0) { - // Read positions - uint8_t t = tx_buffer.tail; - const uint8_t h = tx_buffer.head; - - if (Cfg::XONOFF) { - // If an XON char is pending to be sent, do it now - if (xon_xoff_state == XON_CHAR) { - - // Send the character - HWUART->UART_THR = XON_CHAR; - - // Remember we sent it. - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - - // If nothing else to transmit, just disable TX interrupts. - if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY; - - return; - } - } - - // If nothing to transmit, just disable TX interrupts. This could - // happen as the result of the non atomicity of the disabling of RX - // interrupts that could end reenabling TX interrupts as a side effect. - if (h == t) { - HWUART->UART_IDR = UART_IDR_TXRDY; - return; - } - - // There is something to TX, Send the next byte - const uint8_t c = tx_buffer.buffer[t]; - t = (t + 1) & (Cfg::TX_SIZE - 1); - HWUART->UART_THR = c; - tx_buffer.tail = t; - - // Disable interrupts if there is nothing to transmit following this byte - if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY; - } -} - -template -void MarlinSerial::UART_ISR() { - const uint32_t status = HWUART->UART_SR; - - // Data received? - if (status & UART_SR_RXRDY) store_rxd_char(); - - if (Cfg::TX_SIZE > 0) { - // Something to send, and TX interrupts are enabled (meaning something to send)? - if ((status & UART_SR_TXRDY) && (HWUART->UART_IMR & UART_IMR_TXRDY)) _tx_thr_empty_irq(); - } - - // Acknowledge errors - if ((status & UART_SR_OVRE) || (status & UART_SR_FRAME)) { - if (Cfg::DROPPED_RX && (status & UART_SR_OVRE) && !++rx_dropped_bytes) --rx_dropped_bytes; - if (Cfg::RX_OVERRUNS && (status & UART_SR_OVRE) && !++rx_buffer_overruns) --rx_buffer_overruns; - if (Cfg::RX_FRAMING_ERRORS && (status & UART_SR_FRAME) && !++rx_framing_errors) --rx_framing_errors; - - // TODO: error reporting outside ISR - HWUART->UART_CR = UART_CR_RSTSTA; - } -} - -// Public Methods -template -void MarlinSerial::begin(const long baud_setting) { - - // Disable UART interrupt in NVIC - NVIC_DisableIRQ( HWUART_IRQ ); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); - - // Disable clock - pmc_disable_periph_clk( HWUART_IRQ_ID ); - - // Configure PMC - pmc_enable_periph_clk( HWUART_IRQ_ID ); - - // Disable PDC channel - HWUART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; - - // Reset and disable receiver and transmitter - HWUART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; - - // Configure mode: 8bit, No parity, 1 bit stop - HWUART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; - - // Configure baudrate (asynchronous, no oversampling) - HWUART->UART_BRGR = (SystemCoreClock / (baud_setting << 4)); - - // Configure interrupts - HWUART->UART_IDR = 0xFFFFFFFF; - HWUART->UART_IER = UART_IER_RXRDY | UART_IER_OVRE | UART_IER_FRAME; - - // Install interrupt handler - install_isr(HWUART_IRQ, UART_ISR); - - // Configure priority. We need a very high priority to avoid losing characters - // and we need to be able to preempt the Stepper ISR and everything else! - // (this could probably be fixed by using DMA with the Serial port) - NVIC_SetPriority(HWUART_IRQ, 1); - - // Enable UART interrupt in NVIC - NVIC_EnableIRQ(HWUART_IRQ); - - // Enable receiver and transmitter - HWUART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; - - if (Cfg::TX_SIZE > 0) _written = false; -} - -template -void MarlinSerial::end() { - // Disable UART interrupt in NVIC - NVIC_DisableIRQ( HWUART_IRQ ); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); - - pmc_disable_periph_clk( HWUART_IRQ_ID ); -} - -template -int MarlinSerial::peek() { - const int v = rx_buffer.head == rx_buffer.tail ? -1 : rx_buffer.buffer[rx_buffer.tail]; - return v; -} - -template -int MarlinSerial::read() { - - const ring_buffer_pos_t h = rx_buffer.head; - ring_buffer_pos_t t = rx_buffer.tail; - - if (h == t) return -1; - - int v = rx_buffer.buffer[t]; - t = (ring_buffer_pos_t)(t + 1) & (Cfg::RX_SIZE - 1); - - // Advance tail - rx_buffer.tail = t; - - if (Cfg::XONOFF) { - // If the XOFF char was sent, or about to be sent... - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { - // Get count of bytes in the RX buffer - const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); - // When below 10% of RX buffer capacity, send XON before running out of RX buffer bytes - if (rx_count < (Cfg::RX_SIZE) / 10) { - if (Cfg::TX_SIZE > 0) { - // Signal we want an XON character to be sent. - xon_xoff_state = XON_CHAR; - // Enable TX isr. - HWUART->UART_IER = UART_IER_TXRDY; - } - else { - // If not using TX interrupts, we must send the XON char now - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); - HWUART->UART_THR = XON_CHAR; - } - } - } - } - - return v; -} - -template -typename MarlinSerial::ring_buffer_pos_t MarlinSerial::available() { - const ring_buffer_pos_t h = rx_buffer.head, t = rx_buffer.tail; - return (ring_buffer_pos_t)(Cfg::RX_SIZE + h - t) & (Cfg::RX_SIZE - 1); -} - -template -void MarlinSerial::flush() { - rx_buffer.tail = rx_buffer.head; - - if (Cfg::XONOFF) { - if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { - if (Cfg::TX_SIZE > 0) { - // Signal we want an XON character to be sent. - xon_xoff_state = XON_CHAR; - // Enable TX isr. - HWUART->UART_IER = UART_IER_TXRDY; - } - else { - // If not using TX interrupts, we must send the XON char now - xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; - while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); - HWUART->UART_THR = XON_CHAR; - } - } - } -} - -template -void MarlinSerial::write(const uint8_t c) { - _written = true; - - if (Cfg::TX_SIZE == 0) { - while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); - HWUART->UART_THR = c; - } - else { - - // If the TX interrupts are disabled and the data register - // is empty, just write the byte to the data register and - // be done. This shortcut helps significantly improve the - // effective datarate at high (>500kbit/s) bitrates, where - // interrupt overhead becomes a slowdown. - // Yes, there is a race condition between the sending of the - // XOFF char at the RX isr, but it is properly handled there - if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) { - HWUART->UART_THR = c; - return; - } - - const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); - - // If global interrupts are disabled (as the result of being called from an ISR)... - if (!ISRS_ENABLED()) { - - // Make room by polling if it is possible to transmit, and do so! - while (i == tx_buffer.tail) { - // If we can transmit another byte, do it. - if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq(); - // Make sure compiler rereads tx_buffer.tail - sw_barrier(); - } - } - else { - // Interrupts are enabled, just wait until there is space - while (i == tx_buffer.tail) sw_barrier(); - } - - // Store new char. head is always safe to move - tx_buffer.buffer[tx_buffer.head] = c; - tx_buffer.head = i; - - // Enable TX isr - Non atomic, but it will eventually enable TX isr - HWUART->UART_IER = UART_IER_TXRDY; - } -} - -template -void MarlinSerial::flushTX() { - // TX - - if (Cfg::TX_SIZE == 0) { - // No bytes written, no need to flush. This special case is needed since there's - // no way to force the TXC (transmit complete) bit to 1 during initialization. - if (!_written) return; - - // Wait until everything was transmitted - while (!(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier(); - - // At this point nothing is queued anymore (DRIE is disabled) and - // the hardware finished transmission (TXC is set). - - } - else { - // If we have never written a byte, no need to flush. This special - // case is needed since there is no way to force the TXC (transmit - // complete) bit to 1 during initialization - if (!_written) return; - - // If global interrupts are disabled (as the result of being called from an ISR)... - if (!ISRS_ENABLED()) { - - // Wait until everything was transmitted - We must do polling, as interrupts are disabled - while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) { - // If there is more space, send an extra character - if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq(); - sw_barrier(); - } - - } - else { - // Wait until everything was transmitted - while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier(); - } - - // At this point nothing is queued anymore (DRIE is disabled) and - // the hardware finished transmission (TXC is set). - } -} - -/** - * Imports from print.h - */ - -template -void MarlinSerial::print(char c, int base) { - print((long)c, base); -} - -template -void MarlinSerial::print(unsigned char b, int base) { - print((unsigned long)b, base); -} - -template -void MarlinSerial::print(int n, int base) { - print((long)n, base); -} - -template -void MarlinSerial::print(unsigned int n, int base) { - print((unsigned long)n, base); -} - -template -void MarlinSerial::print(long n, int base) { - if (base == 0) write(n); - else if (base == 10) { - if (n < 0) { print('-'); n = -n; } - printNumber(n, 10); - } - else - printNumber(n, base); -} - -template -void MarlinSerial::print(unsigned long n, int base) { - if (base == 0) write(n); - else printNumber(n, base); -} - -template -void MarlinSerial::print(double n, int digits) { - printFloat(n, digits); -} - -template -void MarlinSerial::println() { - print('\r'); - print('\n'); -} - -template -void MarlinSerial::println(const String& s) { - print(s); - println(); -} - -template -void MarlinSerial::println(const char c[]) { - print(c); - println(); -} - -template -void MarlinSerial::println(char c, int base) { - print(c, base); - println(); -} - -template -void MarlinSerial::println(unsigned char b, int base) { - print(b, base); - println(); -} - -template -void MarlinSerial::println(int n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(unsigned int n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(long n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(unsigned long n, int base) { - print(n, base); - println(); -} - -template -void MarlinSerial::println(double n, int digits) { - print(n, digits); - println(); -} - -// Private Methods -template -void MarlinSerial::printNumber(unsigned long n, uint8_t base) { - if (n) { - unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 - int8_t i = 0; - while (n) { - buf[i++] = n % base; - n /= base; - } - while (i--) - print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); - } - else - print('0'); -} - -template -void MarlinSerial::printFloat(double number, uint8_t digits) { - // Handle negative numbers - if (number < 0.0) { - print('-'); - number = -number; - } - - // Round correctly so that print(1.999, 2) prints as "2.00" - double rounding = 0.5; - LOOP_L_N(i, digits) rounding *= 0.1; - number += rounding; - - // Extract the integer part of the number and print it - unsigned long int_part = (unsigned long)number; - double remainder = number - (double)int_part; - print(int_part); - - // Print the decimal point, but only if there are digits beyond - if (digits) { - print('.'); - // Extract digits from the remainder one at a time - while (digits--) { - remainder *= 10.0; - int toPrint = int(remainder); - print(toPrint); - remainder -= toPrint; - } - } -} - -// If not using the USB port as serial port -#if SERIAL_PORT >= 0 - template class MarlinSerial>; // Define - MarlinSerial> customizedSerial1; // Instantiate -#endif - -#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 - template class MarlinSerial>; // Define - MarlinSerial> customizedSerial2; // Instantiate -#endif - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h deleted file mode 100644 index a194eba2f3..0000000000 --- a/Marlin/src/HAL/DUE/MarlinSerial.h +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MarlinSerial_Due.h - Hardware serial library for Arduino DUE - * Copyright (c) 2017 Eduardo José Tagle. All right reserved - * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. - */ - -#include - -#include "../../inc/MarlinConfigPre.h" - -#define DEC 10 -#define HEX 16 -#define OCT 8 -#define BIN 2 - -// Define constants and variables for buffering incoming serial data. We're -// using a ring buffer (I think), in which rx_buffer_head is the index of the -// location to which to write the next incoming character and rx_buffer_tail -// is the index of the location from which to read. -// 256 is the max limit due to uint8_t head and tail. Use only powers of 2. (...,16,32,64,128,256) -#ifndef RX_BUFFER_SIZE - #define RX_BUFFER_SIZE 128 -#endif -#ifndef TX_BUFFER_SIZE - #define TX_BUFFER_SIZE 32 -#endif - -//#if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 -// #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops." -//#elif RX_BUFFER_SIZE && (RX_BUFFER_SIZE < 2 || !IS_POWER_OF_2(RX_BUFFER_SIZE)) -// #error "RX_BUFFER_SIZE must be a power of 2 greater than 1." -//#elif TX_BUFFER_SIZE && (TX_BUFFER_SIZE < 2 || TX_BUFFER_SIZE > 256 || !IS_POWER_OF_2(TX_BUFFER_SIZE)) -// #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256." -//#endif - -// Templated type selector -template struct TypeSelector { typedef T type;} ; -template struct TypeSelector { typedef F type; }; - -// Templated structure wrapper -template struct StructWrapper { - constexpr StructWrapper(int) {} - FORCE_INLINE S* operator->() const { return (S*)addr; } -}; - -template -class MarlinSerial { -protected: - // Information for all supported UARTs - static constexpr uint32_t BASES[] = {0x400E0800U, 0x40098000U, 0x4009C000U, 0x400A0000U, 0x400A4000U}; - static constexpr IRQn_Type IRQS[] = { UART_IRQn, USART0_IRQn, USART1_IRQn, USART2_IRQn, USART3_IRQn}; - static constexpr int IRQ_IDS[] = { ID_UART, ID_USART0, ID_USART1, ID_USART2, ID_USART3}; - - // Alias for shorter code - static constexpr StructWrapper HWUART = 0; - static constexpr IRQn_Type HWUART_IRQ = IRQS[Cfg::PORT]; - static constexpr int HWUART_IRQ_ID = IRQ_IDS[Cfg::PORT]; - - // Base size of type on buffer size - typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t; - - struct ring_buffer_r { - volatile ring_buffer_pos_t head, tail; - unsigned char buffer[Cfg::RX_SIZE]; - }; - - struct ring_buffer_t { - volatile uint8_t head, tail; - unsigned char buffer[Cfg::TX_SIZE]; - }; - - static ring_buffer_r rx_buffer; - static ring_buffer_t tx_buffer; - static bool _written; - - static constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent - XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send - - // XON / XOFF character definitions - static constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19; - static uint8_t xon_xoff_state, - rx_dropped_bytes, - rx_buffer_overruns, - rx_framing_errors; - static ring_buffer_pos_t rx_max_enqueued; - - FORCE_INLINE static void store_rxd_char(); - FORCE_INLINE static void _tx_thr_empty_irq(); - static void UART_ISR(); - -public: - MarlinSerial() {}; - static void begin(const long); - static void end(); - static int peek(); - static int read(); - static void flush(); - static ring_buffer_pos_t available(); - static void write(const uint8_t c); - static void flushTX(); - - static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } - - FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } - FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } - FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } - FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; } - - FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } - FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } - FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } - FORCE_INLINE static void print(const char* str) { write(str); } - - static void print(char, int = 0); - static void print(unsigned char, int = 0); - static void print(int, int = DEC); - static void print(unsigned int, int = DEC); - static void print(long, int = DEC); - static void print(unsigned long, int = DEC); - static void print(double, int = 2); - - static void println(const String& s); - static void println(const char[]); - static void println(char, int = 0); - static void println(unsigned char, int = 0); - static void println(int, int = DEC); - static void println(unsigned int, int = DEC); - static void println(long, int = DEC); - static void println(unsigned long, int = DEC); - static void println(double, int = 2); - static void println(); - operator bool() { return true; } - -private: - static void printNumber(unsigned long, const uint8_t); - static void printFloat(double, uint8_t); -}; - -// Serial port configuration -template -struct MarlinSerialCfg { - static constexpr int PORT = serial; - static constexpr unsigned int RX_SIZE = RX_BUFFER_SIZE; - static constexpr unsigned int TX_SIZE = TX_BUFFER_SIZE; - static constexpr bool XONOFF = ENABLED(SERIAL_XON_XOFF); - static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); - static constexpr bool DROPPED_RX = ENABLED(SERIAL_STATS_DROPPED_RX); - static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); - static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS); - static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); -}; - -#if SERIAL_PORT >= 0 - extern MarlinSerial> customizedSerial1; -#endif - -#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 - extern MarlinSerial> customizedSerial2; -#endif diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp deleted file mode 100644 index a41dbfeb7a..0000000000 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE - * Copyright (c) 2017 Eduardo José Tagle. All right reserved - * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. - */ -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" - -#if HAS_USB_SERIAL - -#include "MarlinSerialUSB.h" - -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif - -// Imports from Atmel USB Stack/CDC implementation -extern "C" { - bool usb_task_cdc_isenabled(); - bool usb_task_cdc_dtr_active(); - bool udi_cdc_is_rx_ready(); - int udi_cdc_getc(); - bool udi_cdc_is_tx_ready(); - int udi_cdc_putc(int value); -}; - -// Pending character -static int pending_char = -1; - -#if ENABLED(EMERGENCY_PARSER) - static EmergencyParser::State emergency_state; // = EP_RESET -#endif - -// Public Methods -void MarlinSerialUSB::begin(const long) {} - -void MarlinSerialUSB::end() {} - -int MarlinSerialUSB::peek() { - if (pending_char >= 0) - return pending_char; - - // If USB CDC not enumerated or not configured on the PC side - if (!usb_task_cdc_isenabled()) - return -1; - - // If no bytes sent from the PC - if (!udi_cdc_is_rx_ready()) - return -1; - - pending_char = udi_cdc_getc(); - - TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)pending_char)); - - return pending_char; -} - -int MarlinSerialUSB::read() { - if (pending_char >= 0) { - int ret = pending_char; - pending_char = -1; - return ret; - } - - // If USB CDC not enumerated or not configured on the PC side - if (!usb_task_cdc_isenabled()) - return -1; - - // If no bytes sent from the PC - if (!udi_cdc_is_rx_ready()) - return -1; - - int c = udi_cdc_getc(); - - TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)c)); - - return c; -} - -bool MarlinSerialUSB::available() { - /* If Pending chars */ - return pending_char >= 0 || - /* or USB CDC enumerated and configured on the PC side and some - bytes where sent to us */ - (usb_task_cdc_isenabled() && udi_cdc_is_rx_ready()); -} - -void MarlinSerialUSB::flush() { } -void MarlinSerialUSB::flushTX() { } - -void MarlinSerialUSB::write(const uint8_t c) { - - /* Do not even bother sending anything if USB CDC is not enumerated - or not configured on the PC side or there is no program on the PC - listening to our messages */ - if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) - return; - - /* Wait until the PC has read the pending to be sent data */ - while (usb_task_cdc_isenabled() && - usb_task_cdc_dtr_active() && - !udi_cdc_is_tx_ready()) { - }; - - /* Do not even bother sending anything if USB CDC is not enumerated - or not configured on the PC side or there is no program on the PC - listening to our messages at this point */ - if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) - return; - - // Fifo full - // udi_cdc_signal_overrun(); - udi_cdc_putc(c); -} - -/** - * Imports from print.h - */ - -void MarlinSerialUSB::print(char c, int base) { - print((long)c, base); -} - -void MarlinSerialUSB::print(unsigned char b, int base) { - print((unsigned long)b, base); -} - -void MarlinSerialUSB::print(int n, int base) { - print((long)n, base); -} - -void MarlinSerialUSB::print(unsigned int n, int base) { - print((unsigned long)n, base); -} - -void MarlinSerialUSB::print(long n, int base) { - if (base == 0) - write(n); - else if (base == 10) { - if (n < 0) { - print('-'); - n = -n; - } - printNumber(n, 10); - } - else - printNumber(n, base); -} - -void MarlinSerialUSB::print(unsigned long n, int base) { - if (base == 0) write(n); - else printNumber(n, base); -} - -void MarlinSerialUSB::print(double n, int digits) { - printFloat(n, digits); -} - -void MarlinSerialUSB::println() { - print('\r'); - print('\n'); -} - -void MarlinSerialUSB::println(const String& s) { - print(s); - println(); -} - -void MarlinSerialUSB::println(const char c[]) { - print(c); - println(); -} - -void MarlinSerialUSB::println(char c, int base) { - print(c, base); - println(); -} - -void MarlinSerialUSB::println(unsigned char b, int base) { - print(b, base); - println(); -} - -void MarlinSerialUSB::println(int n, int base) { - print(n, base); - println(); -} - -void MarlinSerialUSB::println(unsigned int n, int base) { - print(n, base); - println(); -} - -void MarlinSerialUSB::println(long n, int base) { - print(n, base); - println(); -} - -void MarlinSerialUSB::println(unsigned long n, int base) { - print(n, base); - println(); -} - -void MarlinSerialUSB::println(double n, int digits) { - print(n, digits); - println(); -} - -// Private Methods - -void MarlinSerialUSB::printNumber(unsigned long n, uint8_t base) { - if (n) { - unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 - int8_t i = 0; - while (n) { - buf[i++] = n % base; - n /= base; - } - while (i--) - print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); - } - else - print('0'); -} - -void MarlinSerialUSB::printFloat(double number, uint8_t digits) { - // Handle negative numbers - if (number < 0.0) { - print('-'); - number = -number; - } - - // Round correctly so that print(1.999, 2) prints as "2.00" - double rounding = 0.5; - LOOP_L_N(i, digits) - rounding *= 0.1; - - number += rounding; - - // Extract the integer part of the number and print it - unsigned long int_part = (unsigned long)number; - double remainder = number - (double)int_part; - print(int_part); - - // Print the decimal point, but only if there are digits beyond - if (digits) { - print('.'); - // Extract digits from the remainder one at a time - while (digits--) { - remainder *= 10.0; - int toPrint = int(remainder); - print(toPrint); - remainder -= toPrint; - } - } -} - -// Preinstantiate -#if SERIAL_PORT == -1 - MarlinSerialUSB customizedSerial1; -#endif -#if SERIAL_PORT_2 == -1 - MarlinSerialUSB customizedSerial2; -#endif - -#endif // HAS_USB_SERIAL -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h deleted file mode 100644 index 2e3622e553..0000000000 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MarlinSerialUSB_Due.h - Hardware Serial over USB (CDC) library for Arduino DUE - * Copyright (c) 2017 Eduardo José Tagle. All right reserved - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_USB_SERIAL - -#include - -#define DEC 10 -#define HEX 16 -#define OCT 8 -#define BIN 2 - -class MarlinSerialUSB { - -public: - MarlinSerialUSB() {}; - static void begin(const long); - static void end(); - static int peek(); - static int read(); - static void flush(); - static void flushTX(); - static bool available(); - static void write(const uint8_t c); - - #if ENABLED(SERIAL_STATS_DROPPED_RX) - FORCE_INLINE static uint32_t dropped() { return 0; } - #endif - - #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - FORCE_INLINE static int rxMaxEnqueued() { return 0; } - #endif - - FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } - FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } - FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } - FORCE_INLINE static void print(const char* str) { write(str); } - - static void print(char, int = 0); - static void print(unsigned char, int = 0); - static void print(int, int = DEC); - static void print(unsigned int, int = DEC); - static void print(long, int = DEC); - static void print(unsigned long, int = DEC); - static void print(double, int = 2); - - static void println(const String& s); - static void println(const char[]); - static void println(char, int = 0); - static void println(unsigned char, int = 0); - static void println(int, int = DEC); - static void println(unsigned int, int = DEC); - static void println(long, int = DEC); - static void println(unsigned long, int = DEC); - static void println(double, int = 2); - static void println(); - operator bool() { return true; } - -private: - static void printNumber(unsigned long, const uint8_t); - static void printFloat(double, uint8_t); -}; - -#if SERIAL_PORT == -1 - extern MarlinSerialUSB customizedSerial1; -#endif - -#if SERIAL_PORT_2 == -1 - extern MarlinSerialUSB customizedSerial2; -#endif - -#endif // HAS_USB_SERIAL diff --git a/Marlin/src/HAL/DUE/Servo.cpp b/Marlin/src/HAL/DUE/Servo.cpp deleted file mode 100644 index 5524aa9cef..0000000000 --- a/Marlin/src/HAL/DUE/Servo.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* - Copyright (c) 2013 Arduino LLC. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include "../shared/servo.h" -#include "../shared/servo_private.h" - -static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) - -// ------------------------ -/// Interrupt handler for the TC0 channel 1. -// ------------------------ -void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel); - -#ifdef _useTimer1 - void HANDLER_FOR_TIMER1() { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); } -#endif -#ifdef _useTimer2 - void HANDLER_FOR_TIMER2() { Servo_Handler(_timer2, TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); } -#endif -#ifdef _useTimer3 - void HANDLER_FOR_TIMER3() { Servo_Handler(_timer3, TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); } -#endif -#ifdef _useTimer4 - void HANDLER_FOR_TIMER4() { Servo_Handler(_timer4, TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); } -#endif -#ifdef _useTimer5 - void HANDLER_FOR_TIMER5() { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); } -#endif - -void Servo_Handler(timer16_Sequence_t timer, Tc *tc, uint8_t channel) { - // clear interrupt - tc->TC_CHANNEL[channel].TC_SR; - if (Channel[timer] < 0) - tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer - else if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive) - extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated - - Channel[timer]++; // increment to the next channel - if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { - tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks; - if (SERVO(timer,Channel[timer]).Pin.isActive) // check if activated - extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // its an active channel so pulse it high - } - else { - // finished all channels so wait for the refresh period to expire before starting over - tc->TC_CHANNEL[channel].TC_RA = - tc->TC_CHANNEL[channel].TC_CV < usToTicks(REFRESH_INTERVAL) - 4 - ? (unsigned int)usToTicks(REFRESH_INTERVAL) // allow a few ticks to ensure the next OCR1A not missed - : tc->TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed - Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel - } -} - -static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) { - pmc_enable_periph_clk(id); - TC_Configure(tc, channel, - TC_CMR_TCCLKS_TIMER_CLOCK3 | // MCK/32 - TC_CMR_WAVE | // Waveform mode - TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC - - /* 84MHz, MCK/32, for 1.5ms: 3937 */ - TC_SetRA(tc, channel, 2625); // 1ms - - /* Configure and enable interrupt */ - NVIC_EnableIRQ(irqn); - // TC_IER_CPAS: RA Compare - tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; - - // Enables the timer clock and performs a software reset to start the counting - TC_Start(tc, channel); -} - -void initISR(timer16_Sequence_t timer) { - #ifdef _useTimer1 - if (timer == _timer1) - _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1); - #endif - #ifdef _useTimer2 - if (timer == _timer2) - _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2); - #endif - #ifdef _useTimer3 - if (timer == _timer3) - _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3); - #endif - #ifdef _useTimer4 - if (timer == _timer4) - _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4); - #endif - #ifdef _useTimer5 - if (timer == _timer5) - _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5); - #endif -} - -void finISR(timer16_Sequence_t) { - #ifdef _useTimer1 - TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); - #endif - #ifdef _useTimer2 - TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); - #endif - #ifdef _useTimer3 - TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); - #endif - #ifdef _useTimer4 - TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); - #endif - #ifdef _useTimer5 - TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); - #endif -} - -#endif // HAS_SERVOS - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/ServoTimers.h b/Marlin/src/HAL/DUE/ServoTimers.h deleted file mode 100644 index c32c938253..0000000000 --- a/Marlin/src/HAL/DUE/ServoTimers.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (c) 2013 Arduino LLC. All right reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * Defines for 16 bit timers used with Servo library - * - * If _useTimerX is defined then TimerX is a 32 bit timer on the current board - * timer16_Sequence_t enumerates the sequence that the timers should be allocated - * _Nbr_16timers indicates how many timers are available. - */ - -/** - * SAM Only definitions - * -------------------- - */ - -// For SAM3X: -//!#define _useTimer1 -//!#define _useTimer2 -#define _useTimer3 -//!#define _useTimer4 -#define _useTimer5 - -#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays -#define SERVO_TIMER_PRESCALER 32 // timer prescaler - -/* - TC0, chan 0 => TC0_Handler - TC0, chan 1 => TC1_Handler - TC0, chan 2 => TC2_Handler - TC1, chan 0 => TC3_Handler - TC1, chan 1 => TC4_Handler - TC1, chan 2 => TC5_Handler - TC2, chan 0 => TC6_Handler - TC2, chan 1 => TC7_Handler - TC2, chan 2 => TC8_Handler - */ - -#ifdef _useTimer1 - #define TC_FOR_TIMER1 TC1 - #define CHANNEL_FOR_TIMER1 0 - #define ID_TC_FOR_TIMER1 ID_TC3 - #define IRQn_FOR_TIMER1 TC3_IRQn - #define HANDLER_FOR_TIMER1 TC3_Handler -#endif -#ifdef _useTimer2 - #define TC_FOR_TIMER2 TC1 - #define CHANNEL_FOR_TIMER2 1 - #define ID_TC_FOR_TIMER2 ID_TC4 - #define IRQn_FOR_TIMER2 TC4_IRQn - #define HANDLER_FOR_TIMER2 TC4_Handler -#endif -#ifdef _useTimer3 - #define TC_FOR_TIMER3 TC1 - #define CHANNEL_FOR_TIMER3 2 - #define ID_TC_FOR_TIMER3 ID_TC5 - #define IRQn_FOR_TIMER3 TC5_IRQn - #define HANDLER_FOR_TIMER3 TC5_Handler -#endif -#ifdef _useTimer4 - #define TC_FOR_TIMER4 TC0 - #define CHANNEL_FOR_TIMER4 2 - #define ID_TC_FOR_TIMER4 ID_TC2 - #define IRQn_FOR_TIMER4 TC2_IRQn - #define HANDLER_FOR_TIMER4 TC2_Handler -#endif -#ifdef _useTimer5 - #define TC_FOR_TIMER5 TC0 - #define CHANNEL_FOR_TIMER5 0 - #define ID_TC_FOR_TIMER5 ID_TC0 - #define IRQn_FOR_TIMER5 TC0_IRQn - #define HANDLER_FOR_TIMER5 TC0_Handler -#endif - -typedef enum : unsigned char { - #ifdef _useTimer1 - _timer1, - #endif - #ifdef _useTimer2 - _timer2, - #endif - #ifdef _useTimer3 - _timer3, - #endif - #ifdef _useTimer4 - _timer4, - #endif - #ifdef _useTimer5 - _timer5, - #endif - _Nbr_16timers -} timer16_Sequence_t; diff --git a/Marlin/src/HAL/DUE/Tone.cpp b/Marlin/src/HAL/DUE/Tone.cpp deleted file mode 100644 index 9beb602223..0000000000 --- a/Marlin/src/HAL/DUE/Tone.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Description: Tone function for Arduino Due and compatible (SAM3X8E) - * Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012 - */ - -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" -#include "HAL.h" - -static pin_t tone_pin; -volatile static int32_t toggles; - -void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) { - tone_pin = _pin; - toggles = 2 * frequency * duration / 1000; - HAL_timer_start(TONE_TIMER_NUM, 2 * frequency); -} - -void noTone(const pin_t _pin) { - HAL_timer_disable_interrupt(TONE_TIMER_NUM); - extDigitalWrite(_pin, LOW); -} - -HAL_TONE_TIMER_ISR() { - static uint8_t pin_state = 0; - HAL_timer_isr_prologue(TONE_TIMER_NUM); - - if (toggles) { - toggles--; - extDigitalWrite(tone_pin, (pin_state ^= 1)); - } - else noTone(tone_pin); // turn off interrupt -} - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp deleted file mode 100644 index be4b49c0f9..0000000000 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - - -/** - * Based on u8g_com_msp430_hw_spi.c - * - * Universal 8bit Graphics Library - * - * Copyright (c) 2012, olikraus@gmail.com - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef __SAM3X8E__ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_U8GLIB - -#include - -#include "../../../MarlinCore.h" - -void spiBegin(); -void spiInit(uint8_t spiRate); -void spiSend(uint8_t b); -void spiSend(const uint8_t* buf, size_t n); - -#include "../../shared/Marduino.h" -#include "../fastio.h" - -void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) { - PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1, - g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT -} - -void u8g_SetPILevel_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index, uint8_t level) { - volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort; - uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin; - if (level) port->PIO_SODR = mask; - else port->PIO_CODR = mask; -} - -uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - switch (msg) { - case U8G_COM_MSG_STOP: - break; - - case U8G_COM_MSG_INIT: - u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, 1); - u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, 1); - - u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_CS); - u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_A0); - - u8g_Delay(5); - - spiBegin(); - - #ifndef SPI_SPEED - #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card - #endif - spiInit(2); - - break; - - case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ - u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, arg_val); - break; - - case U8G_COM_MSG_CHIP_SELECT: - u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, (arg_val ? 0 : 1)); - break; - - case U8G_COM_MSG_RESET: - break; - - case U8G_COM_MSG_WRITE_BYTE: - - spiSend((uint8_t)arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: { - uint8_t *ptr = (uint8_t*) arg_ptr; - while (arg_val > 0) { - spiSend(*ptr++); - arg_val--; - } - } - break; - - case U8G_COM_MSG_WRITE_SEQ_P: { - uint8_t *ptr = (uint8_t*) arg_ptr; - while (arg_val > 0) { - spiSend(*ptr++); - arg_val--; - } - } - break; - } - return 1; -} - -#endif // HAS_MARLINUI_U8GLIB - -#endif // __SAM3X8E__ diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp deleted file mode 100644 index 47060d6a5b..0000000000 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Based on u8g_com_st7920_hw_spi.c - * - * Universal 8bit Graphics Library - * - * Copyright (c) 2011, olikraus@gmail.com - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef ARDUINO_ARCH_SAM - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(U8GLIB_ST7920) - -#include "../../shared/Delay.h" - -#include - -#include "u8g_com_HAL_DUE_sw_spi_shared.h" - -#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_0 - -static uint8_t rs_last_state = 255; - -static void u8g_com_DUE_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) { - if (rs != rs_last_state) { // time to send a command/data byte - rs_last_state = rs; - SPISEND_SW_DUE(rs ? 0x0FA : 0x0F8); // Command or Data - DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe - } - SPISEND_SW_DUE(val & 0xF0); - SPISEND_SW_DUE(val << 4); -} - -uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - switch (msg) { - case U8G_COM_MSG_INIT: - SCK_pPio = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].pPort; - SCK_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].ulPin; - MOSI_pPio = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].pPort; - MOSI_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].ulPin; - - u8g_SetPILevel_DUE(u8g, U8G_PI_CS, 0); - u8g_SetPIOutput_DUE(u8g, U8G_PI_CS); - u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); - u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK); - u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0); - u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI); - - SCK_pPio->PIO_CODR = SCK_dwMask; //SCK low - needed at power up but not after reset - MOSI_pPio->PIO_CODR = MOSI_dwMask; //MOSI low - needed at power up but not after reset - - u8g_Delay(5); - - u8g->pin_list[U8G_PI_A0_STATE] = 0; /* initial RS state: command mode */ - break; - - case U8G_COM_MSG_STOP: - break; - - case U8G_COM_MSG_RESET: - if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel_DUE(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ - u8g->pin_list[U8G_PI_A0_STATE] = arg_val; - break; - - case U8G_COM_MSG_CHIP_SELECT: - if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS]) - u8g_SetPILevel_DUE(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select - break; - - case U8G_COM_MSG_WRITE_BYTE: - - u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: { - uint8_t *ptr = (uint8_t*) arg_ptr; - while (arg_val > 0) { - u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); - arg_val--; - } - } - break; - - case U8G_COM_MSG_WRITE_SEQ_P: { - uint8_t *ptr = (uint8_t*) arg_ptr; - while (arg_val > 0) { - u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); - arg_val--; - } - } - break; - } - return 1; -} - -#if ENABLED(LIGHTWEIGHT_UI) - #include "../../../lcd/ultralcd.h" - #include "../../shared/HAL_ST7920.h" - - #define ST7920_CS_PIN LCD_PINS_RS - - #if DOGM_SPI_DELAY_US > 0 - #define U8G_DELAY() DELAY_US(DOGM_SPI_DELAY_US) - #else - #define U8G_DELAY() DELAY_US(10) - #endif - - void ST7920_cs() { - WRITE(ST7920_CS_PIN, HIGH); - U8G_DELAY(); - } - - void ST7920_ncs() { - WRITE(ST7920_CS_PIN, LOW); - } - - void ST7920_set_cmd() { - SPISEND_SW_DUE(0xF8); - DELAY_US(40); - } - - void ST7920_set_dat() { - SPISEND_SW_DUE(0xFA); - DELAY_US(40); - } - - void ST7920_write_byte(const uint8_t val) { - SPISEND_SW_DUE(val & 0xF0); - SPISEND_SW_DUE(val << 4); - } -#endif // LIGHTWEIGHT_UI - -#endif // U8GLIB_ST7920 -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp deleted file mode 100644 index ea7204fa36..0000000000 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Based on u8g_com_std_sw_spi.c - * - * Universal 8bit Graphics Library - * - * Copyright (c) 2015, olikraus@gmail.com - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef ARDUINO_ARCH_SAM - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920) - -#undef SPI_SPEED -#define SPI_SPEED 2 // About 2 MHz - -#include "u8g_com_HAL_DUE_sw_spi_shared.h" - -#include "../../shared/Marduino.h" -#include "../../shared/Delay.h" - -#include - -#if ENABLED(FYSETC_MINI_12864) - #define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_3 -#else - #define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_0 -#endif - -uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - switch (msg) { - case U8G_COM_MSG_INIT: - SCK_pPio = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].pPort; - SCK_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].ulPin; - MOSI_pPio = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].pPort; - MOSI_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].ulPin; - u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK); - u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI); - u8g_SetPIOutput_DUE(u8g, U8G_PI_CS); - u8g_SetPIOutput_DUE(u8g, U8G_PI_A0); - if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput_DUE(u8g, U8G_PI_RESET); - u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); - u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0); - break; - - case U8G_COM_MSG_STOP: - break; - - case U8G_COM_MSG_RESET: - if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel_DUE(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_CHIP_SELECT: - #if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 - if (arg_val) { // SCK idle state needs to be set to the proper idle state before - // the next chip select goes active - u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 1); //set SCK to mode 3 idle state before CS goes active - u8g_SetPILevel_DUE(u8g, U8G_PI_CS, LOW); - } - else { - u8g_SetPILevel_DUE(u8g, U8G_PI_CS, HIGH); - u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); //set SCK to mode 0 idle state after CS goes inactive - } - #else - u8g_SetPILevel_DUE(u8g, U8G_PI_CS, !arg_val); - #endif - break; - - case U8G_COM_MSG_WRITE_BYTE: - SPISEND_SW_DUE(arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: { - uint8_t *ptr = (uint8_t *)arg_ptr; - while (arg_val > 0) { - SPISEND_SW_DUE(*ptr++); - arg_val--; - } - } - break; - - case U8G_COM_MSG_WRITE_SEQ_P: { - uint8_t *ptr = (uint8_t *)arg_ptr; - while (arg_val > 0) { - SPISEND_SW_DUE(u8g_pgm_read(ptr)); - ptr++; - arg_val--; - } - } - break; - - case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ - u8g_SetPILevel_DUE(u8g, U8G_PI_A0, arg_val); - break; - } - return 1; -} - -#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920 -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp deleted file mode 100644 index 615a386c35..0000000000 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Based on u8g_com_st7920_hw_spi.c - * - * Universal 8bit Graphics Library - * - * Copyright (c) 2011, olikraus@gmail.com - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef ARDUINO_ARCH_SAM - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_U8GLIB - -#include "../../shared/Delay.h" - -#include - -#include "u8g_com_HAL_DUE_sw_spi_shared.h" - -void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index) { - PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1, - g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT -} - -void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level) { - volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort; - uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin; - if (level) port->PIO_SODR = mask; else port->PIO_CODR = mask; -} - -Pio *SCK_pPio, *MOSI_pPio; -uint32_t SCK_dwMask, MOSI_dwMask; - -void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz - LOOP_L_N(i, 8) { - if (val & 0x80) - MOSI_pPio->PIO_SODR = MOSI_dwMask; - else - MOSI_pPio->PIO_CODR = MOSI_dwMask; - DELAY_NS(48); - SCK_pPio->PIO_SODR = SCK_dwMask; - DELAY_NS(905); - val <<= 1; - SCK_pPio->PIO_CODR = SCK_dwMask; - } -} - -void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz - LOOP_L_N(i, 8) { - SCK_pPio->PIO_CODR = SCK_dwMask; - DELAY_NS(50); - if (val & 0x80) - MOSI_pPio->PIO_SODR = MOSI_dwMask; - else - MOSI_pPio->PIO_CODR = MOSI_dwMask; - val <<= 1; - DELAY_NS(10); - SCK_pPio->PIO_SODR = SCK_dwMask; - DELAY_NS(70); - } -} - -#endif // HAS_MARLINUI_U8GLIB -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h deleted file mode 100644 index f076c503ca..0000000000 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../inc/MarlinConfigPre.h" -#include "../../shared/Marduino.h" -#include - -void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index); -void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level); - -void u8g_spiSend_sw_DUE_mode_0(uint8_t val); -void u8g_spiSend_sw_DUE_mode_3(uint8_t val); - -extern Pio *SCK_pPio, *MOSI_pPio; -extern uint32_t SCK_dwMask, MOSI_dwMask; diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp deleted file mode 100644 index 6f38da0967..0000000000 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ /dev/null @@ -1,1011 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(FLASH_EEPROM_EMULATION) - -/* EEPROM emulation over flash with reduced wear - * - * We will use 2 contiguous groups of pages as main and alternate. - * We want an structure that allows to read as fast as possible, - * without the need of scanning the whole FLASH memory. - * - * FLASH bits default erased state is 1, and can be set to 0 - * on a per bit basis. To reset them to 1, a full page erase - * is needed. - * - * Values are stored as differences that should be applied to a - * completely erased EEPROM (filled with 0xFFs). We just encode - * the starting address of the values to change, the length of - * the block of new values, and the values themselves. All diffs - * are accumulated into a RAM buffer, compacted into the least - * amount of non overlapping diffs possible and sorted by starting - * address before being saved into the next available page of FLASH - * of the current group. - * Once the current group is completely full, we compact it and save - * it into the other group, then erase the current group and switch - * to that new group and set it as current. - * - * The FLASH endurance is about 1/10 ... 1/100 of an EEPROM - * endurance, but EEPROM endurance is specified per byte, not - * per page. We can't emulate EE endurance with FLASH for all - * bytes, but we can emulate endurance for a given percent of - * bytes. - */ - -//#define EE_EMU_DEBUG - -#define EEPROMSize 4096 -#define PagesPerGroup 128 -#define GroupCount 2 -#define PageSize 256U - - /* Flash storage */ -typedef struct FLASH_SECTOR { - uint8_t page[PageSize]; -} FLASH_SECTOR_T; - -#define PAGE_FILL \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF - -#define FLASH_INIT_FILL \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ - PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL - -/* This is the FLASH area used to emulate a 2Kbyte EEPROM -- We need this buffer aligned - to a 256 byte boundary. */ -static const uint8_t flashStorage[PagesPerGroup * GroupCount * PageSize] __attribute__ ((aligned (PageSize))) = { FLASH_INIT_FILL }; - -/* Get the address of an specific page */ -static const FLASH_SECTOR_T* getFlashStorage(int page) { - return (const FLASH_SECTOR_T*)&flashStorage[page*PageSize]; -} - -static uint8_t buffer[256] = {0}, // The RAM buffer to accumulate writes - curPage = 0, // Current FLASH page inside the group - curGroup = 0xFF; // Current FLASH group - -#define DEBUG_OUT ENABLED(EE_EMU_DEBUG) -#include "../../core/debug_out.h" - -static void ee_Dump(const int page, const void* data) { - - #ifdef EE_EMU_DEBUG - - const uint8_t* c = (const uint8_t*) data; - char buffer[80]; - - sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page); - DEBUG_ECHO(buffer); - - char* p = &buffer[0]; - for (int i = 0; i< PageSize; ++i) { - if ((i & 0xF) == 0) p += sprintf_P(p, PSTR("%04x] "), i); - - p += sprintf_P(p, PSTR(" %02x"), c[i]); - if ((i & 0xF) == 0xF) { - *p++ = '\n'; - *p = 0; - DEBUG_ECHO(buffer); - p = &buffer[0]; - } - } - - #else - UNUSED(page); - UNUSED(data); - #endif -} - -/* Flash Writing Protection Key */ -#define FWP_KEY 0x5Au - -#if SAM4S_SERIES - #define EEFC_FCR_FCMD(value) \ - ((EEFC_FCR_FCMD_Msk & ((value) << EEFC_FCR_FCMD_Pos))) - #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE | EEFC_FSR_FLERR) -#else - #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE) -#endif - -/** - * Writes the contents of the specified page (no previous erase) - * @param page (page #) - * @param data (pointer to the data buffer) - */ -__attribute__ ((long_call, section (".ramfunc"))) -static bool ee_PageWrite(uint16_t page, const void* data) { - - uint16_t i; - uint32_t addrflash = uint32_t(getFlashStorage(page)); - - // Read the flash contents - uint32_t pageContents[PageSize>>2]; - memcpy(pageContents, (void*)addrflash, PageSize); - - // We ONLY want to toggle bits that have changed, and that have changed to 0. - // SAM3X8E tends to destroy contiguous bits if reprogrammed without erasing, so - // we try by all means to avoid this. That is why it says: "The Partial - // Programming mode works only with 128-bit (or higher) boundaries. It cannot - // be used with boundaries lower than 128 bits (8, 16 or 32-bit for example)." - // All bits that did not change, set them to 1. - for (i = 0; i > 2; i++) - pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i])); - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM PageWrite ", page); - DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash); - DEBUG_ECHOLNPAIR(" base address ", (uint32_t)getFlashStorage(0)); - DEBUG_FLUSH(); - - // Get the page relative to the start of the EFC controller, and the EFC controller to use - Efc *efc; - uint16_t fpage; - if (addrflash >= IFLASH1_ADDR) { - efc = EFC1; - fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE; - } - else { - efc = EFC0; - fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE; - } - - // Get the page that must be unlocked, then locked - uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1)); - - // Disable all interrupts - __disable_irq(); - - // Get the FLASH wait states - uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos; - - // Set wait states to 6 (SAM errata) - efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(6); - - // Unlock the flash page - uint32_t status; - efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB); - while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { - // force compiler to not optimize this -- NOPs don't work! - __asm__ __volatile__(""); - }; - - if ((status & EEFC_ERROR_FLAGS) != 0) { - - // Restore original wait states - efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); - - // Reenable interrupts - __enable_irq(); - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ", page); - return false; - } - - // Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption. - const uint32_t * aligned_src = (const uint32_t *) &pageContents[0]; /*data;*/ - uint32_t * p_aligned_dest = (uint32_t *) addrflash; - for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) { - *p_aligned_dest++ = *aligned_src++; - } - efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_WPL); - while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { - // force compiler to not optimize this -- NOPs don't work! - __asm__ __volatile__(""); - }; - - if ((status & EEFC_ERROR_FLAGS) != 0) { - - // Restore original wait states - efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); - - // Reenable interrupts - __enable_irq(); - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Write failure for page ", page); - - return false; - } - - // Restore original wait states - efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); - - // Reenable interrupts - __enable_irq(); - - // Compare contents - if (memcmp(getFlashStorage(page),data,PageSize)) { - - #ifdef EE_EMU_DEBUG - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Verify Write failure for page ", page); - - ee_Dump( page, (uint32_t *)addrflash); - ee_Dump(-page, data); - - // Calculate count of changed bits - uint32_t* p1 = (uint32_t*)addrflash; - uint32_t* p2 = (uint32_t*)data; - int count = 0; - for (i =0; i> 2; i++) { - if (p1[i] != p2[i]) { - uint32_t delta = p1[i] ^ p2[i]; - while (delta) { - if ((delta&1) != 0) - count++; - delta >>= 1; - } - } - } - DEBUG_ECHOLNPAIR("--> Differing bits: ", count); - #endif - - return false; - } - - return true; -} - -/** - * Erases the contents of the specified page - * @param page (page #) - */ -__attribute__ ((long_call, section (".ramfunc"))) -static bool ee_PageErase(uint16_t page) { - - uint16_t i; - uint32_t addrflash = uint32_t(getFlashStorage(page)); - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM PageErase ", page); - DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash); - DEBUG_ECHOLNPAIR(" base address ", (uint32_t)getFlashStorage(0)); - DEBUG_FLUSH(); - - // Get the page relative to the start of the EFC controller, and the EFC controller to use - Efc *efc; - uint16_t fpage; - if (addrflash >= IFLASH1_ADDR) { - efc = EFC1; - fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE; - } - else { - efc = EFC0; - fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE; - } - - // Get the page that must be unlocked, then locked - uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1)); - - // Disable all interrupts - __disable_irq(); - - // Get the FLASH wait states - uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos; - - // Set wait states to 6 (SAM errata) - efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(6); - - // Unlock the flash page - uint32_t status; - efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB); - while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { - // force compiler to not optimize this -- NOPs don't work! - __asm__ __volatile__(""); - }; - if ((status & EEFC_ERROR_FLAGS) != 0) { - - // Restore original wait states - efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); - - // Reenable interrupts - __enable_irq(); - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ",page); - - return false; - } - - // Erase Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption. - uint32_t * p_aligned_dest = (uint32_t *) addrflash; - for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) { - *p_aligned_dest++ = 0xFFFFFFFF; - } - efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_EWPL); - while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { - // force compiler to not optimize this -- NOPs don't work! - __asm__ __volatile__(""); - }; - if ((status & EEFC_ERROR_FLAGS) != 0) { - - // Restore original wait states - efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); - - // Reenable interrupts - __enable_irq(); - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Erase failure for page ",page); - - return false; - } - - // Restore original wait states - efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); - - // Reenable interrupts - __enable_irq(); - - // Check erase - uint32_t * aligned_src = (uint32_t *) addrflash; - for (i = 0; i < PageSize >> 2; i++) { - if (*aligned_src++ != 0xFFFFFFFF) { - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Verify Erase failure for page ",page); - ee_Dump(page, (uint32_t *)addrflash); - return false; - } - } - - return true; -} - -static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer=false) { - - uint32_t baddr; - uint32_t blen; - - // If we were requested an address outside of the emulated range, fail now - if (address >= EEPROMSize) - return false; - - // Check that the value is not contained in the RAM buffer - if (!excludeRAMBuffer) { - uint16_t i = 0; - while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ - - // Get the address of the block - baddr = buffer[i] | (buffer[i + 1] << 8); - - // Get the length of the block - blen = buffer[i + 2]; - - // If we reach the end of the list, break loop - if (blen == 0xFF) - break; - - // Check if data is contained in this block - if (address >= baddr && - address < (baddr + blen)) { - - // Yes, it is contained. Return it! - return buffer[i + 3 + address - baddr]; - } - - // As blocks are always sorted, if the starting address of this block is higher - // than the address we are looking for, break loop now - We wont find the value - // associated to the address - if (baddr > address) - break; - - // Jump to the next block - i += 3 + blen; - } - } - - // It is NOT on the RAM buffer. It could be stored in FLASH. We are - // ensured on a given FLASH page, address contents are never repeated - // but on different pages, there is no such warranty, so we must go - // backwards from the last written FLASH page to the first one. - for (int page = curPage - 1; page >= 0; --page) { - - // Get a pointer to the flash page - uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); - - uint16_t i = 0; - while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ - - // Get the address of the block - baddr = pflash[i] | (pflash[i + 1] << 8); - - // Get the length of the block - blen = pflash[i + 2]; - - // If we reach the end of the list, break loop - if (blen == 0xFF) - break; - - // Check if data is contained in this block - if (address >= baddr && address < (baddr + blen)) - return pflash[i + 3 + address - baddr]; // Yes, it is contained. Return it! - - // As blocks are always sorted, if the starting address of this block is higher - // than the address we are looking for, break loop now - We wont find the value - // associated to the address - if (baddr > address) break; - - // Jump to the next block - i += 3 + blen; - } - } - - // If reached here, value is not stored, so return its default value - return 0xFF; -} - -static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) { - uint32_t baddr, - blen, - nextAddr = 0xFFFF, - nextRange = 0; - - // Check that the value is not contained in the RAM buffer - if (!excludeRAMBuffer) { - uint16_t i = 0; - while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ - - // Get the address of the block - baddr = buffer[i] | (buffer[i + 1] << 8); - - // Get the length of the block - blen = buffer[i + 2]; - - // If we reach the end of the list, break loop - if (blen == 0xFF) break; - - // Check if address and address + 1 is contained in this block - if (address >= baddr && address < (baddr + blen)) - return address | ((blen - address + baddr) << 16); // Yes, it is contained. Return it! - - // Otherwise, check if we can use it as a limit - if (baddr > address && baddr < nextAddr) { - nextAddr = baddr; - nextRange = blen; - } - - // As blocks are always sorted, if the starting address of this block is higher - // than the address we are looking for, break loop now - We wont find the value - // associated to the address - if (baddr > address) break; - - // Jump to the next block - i += 3 + blen; - } - } - - // It is NOT on the RAM buffer. It could be stored in FLASH. We are - // ensured on a given FLASH page, address contents are never repeated - // but on different pages, there is no such warranty, so we must go - // backwards from the last written FLASH page to the first one. - for (int page = curPage - 1; page >= 0; --page) { - - // Get a pointer to the flash page - uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); - - uint16_t i = 0; - while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ - - // Get the address of the block - baddr = pflash[i] | (pflash[i + 1] << 8); - - // Get the length of the block - blen = pflash[i + 2]; - - // If we reach the end of the list, break loop - if (blen == 0xFF) break; - - // Check if data is contained in this block - if (address >= baddr && address < (baddr + blen)) - return address | ((blen - address + baddr) << 16); // Yes, it is contained. Return it! - - // Otherwise, check if we can use it as a limit - if (baddr > address && baddr < nextAddr) { - nextAddr = baddr; - nextRange = blen; - } - - // As blocks are always sorted, if the starting address of this block is higher - // than the address we are looking for, break loop now - We wont find the value - // associated to the address - if (baddr > address) break; - - // Jump to the next block - i += 3 + blen; - } - } - - // If reached here, we will return the next valid address - return nextAddr | (nextRange << 16); -} - -static bool ee_IsPageClean(int page) { - uint32_t* pflash = (uint32_t*) getFlashStorage(page); - for (uint16_t i = 0; i < (PageSize >> 2); ++i) - if (*pflash++ != 0xFFFFFFFF) return false; - return true; -} - -static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData=0xFF) { - - // Check if RAM buffer has something to be written - bool isEmpty = true; - uint32_t* p = (uint32_t*) &buffer[0]; - for (uint16_t j = 0; j < (PageSize >> 2); j++) { - if (*p++ != 0xFFFFFFFF) { - isEmpty = false; - break; - } - } - - // If something has to be written, do so! - if (!isEmpty) { - - // Write the current ram buffer into FLASH - ee_PageWrite(curPage + curGroup * PagesPerGroup, buffer); - - // Clear the RAM buffer - memset(buffer, 0xFF, sizeof(buffer)); - - // Increment the page to use the next time - ++curPage; - } - - // Did we reach the maximum count of available pages per group for storage ? - if (curPage < PagesPerGroup) { - - // Do we have an override address ? - if (overrideAddress < EEPROMSize) { - - // Yes, just store the value into the RAM buffer - buffer[0] = overrideAddress & 0xFF; - buffer[0 + 1] = (overrideAddress >> 8) & 0xFF; - buffer[0 + 2] = 1; - buffer[0 + 3] = overrideData; - } - - // Done! - return true; - } - - // We have no space left on the current group - We must compact the values - uint16_t i = 0; - - // Compute the next group to use - int curwPage = 0, curwGroup = curGroup + 1; - if (curwGroup >= GroupCount) curwGroup = 0; - - uint32_t rdAddr = 0; - do { - - // Get the next valid range - uint32_t addrRange = ee_GetAddrRange(rdAddr, true); - - // Make sure not to skip the override address, if specified - int rdRange; - if (overrideAddress < EEPROMSize && - rdAddr <= overrideAddress && - (addrRange & 0xFFFF) > overrideAddress) { - - rdAddr = overrideAddress; - rdRange = 1; - } - else { - rdAddr = addrRange & 0xFFFF; - rdRange = addrRange >> 16; - } - - // If no range, break loop - if (rdRange == 0) - break; - - do { - - // Get the value - uint8_t rdValue = overrideAddress == rdAddr ? overrideData : ee_Read(rdAddr, true); - - // Do not bother storing default values - if (rdValue != 0xFF) { - - // If we have room, add it to the buffer - if (buffer[i + 2] == 0xFF) { - - // Uninitialized buffer, just add it! - buffer[i] = rdAddr & 0xFF; - buffer[i + 1] = (rdAddr >> 8) & 0xFF; - buffer[i + 2] = 1; - buffer[i + 3] = rdValue; - - } - else { - // Buffer already has contents. Check if we can extend it - - // Get the address of the block - uint32_t baddr = buffer[i] | (buffer[i + 1] << 8); - - // Get the length of the block - uint32_t blen = buffer[i + 2]; - - // Can we expand it ? - if (rdAddr == (baddr + blen) && - i < (PageSize - 4) && /* This block has a chance to contain data AND */ - buffer[i + 2] < (PageSize - i - 3)) {/* There is room for this block to be expanded */ - - // Yes, do it - ++buffer[i + 2]; - - // And store the value - buffer[i + 3 + rdAddr - baddr] = rdValue; - - } - else { - - // No, we can't expand it - Skip the existing block - i += 3 + blen; - - // Can we create a new slot ? - if (i > (PageSize - 4)) { - - // Not enough space - Write the current buffer to FLASH - ee_PageWrite(curwPage + curwGroup * PagesPerGroup, buffer); - - // Advance write page (as we are compacting, should never overflow!) - ++curwPage; - - // Clear RAM buffer - memset(buffer, 0xFF, sizeof(buffer)); - - // Start fresh */ - i = 0; - } - - // Enough space, add the new block - buffer[i] = rdAddr & 0xFF; - buffer[i + 1] = (rdAddr >> 8) & 0xFF; - buffer[i + 2] = 1; - buffer[i + 3] = rdValue; - } - } - } - - // Go to the next address - ++rdAddr; - - // Repeat for bytes of this range - } while (--rdRange); - - // Repeat until we run out of ranges - } while (rdAddr < EEPROMSize); - - // We must erase the previous group, in preparation for the next swap - for (int page = 0; page < curPage; page++) { - ee_PageErase(page + curGroup * PagesPerGroup); - } - - // Finally, Now the active group is the created new group - curGroup = curwGroup; - curPage = curwPage; - - // Done! - return true; -} - -static bool ee_Write(uint32_t address, uint8_t data) { - - // If we were requested an address outside of the emulated range, fail now - if (address >= EEPROMSize) return false; - - // Lets check if we have a block with that data previously defined. Block - // start addresses are always sorted in ascending order - uint16_t i = 0; - while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ - - // Get the address of the block - uint32_t baddr = buffer[i] | (buffer[i + 1] << 8); - - // Get the length of the block - uint32_t blen = buffer[i + 2]; - - // If we reach the end of the list, break loop - if (blen == 0xFF) - break; - - // Check if data is contained in this block - if (address >= baddr && - address < (baddr + blen)) { - - // Yes, it is contained. Just modify it - buffer[i + 3 + address - baddr] = data; - - // Done! - return true; - } - - // Maybe we could add it to the front or to the back - // of this block ? - if ((address + 1) == baddr || address == (baddr + blen)) { - - // Potentially, it could be done. But we must ensure there is room - // so we can expand the block. Lets find how much free space remains - uint32_t iend = i; - do { - uint32_t ln = buffer[iend + 2]; - if (ln == 0xFF) break; - iend += 3 + ln; - } while (iend <= (PageSize - 4)); /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ - - // Here, inxt points to the first free address in the buffer. Do we have room ? - if (iend < PageSize) { - // Yes, at least a byte is free - We can expand the block - - // Do we have to insert at the beginning ? - if ((address + 1) == baddr) { - - // Insert at the beginning - - // Make room at the beginning for our byte - memmove(&buffer[i + 3 + 1], &buffer[i + 3], iend - i - 3); - - // Adjust the header and store the data - buffer[i] = address & 0xFF; - buffer[i + 1] = (address >> 8) & 0xFF; - buffer[i + 2]++; - buffer[i + 3] = data; - - } - else { - - // Insert at the end - There is a very interesting thing that could happen here: - // Maybe we could coalesce the next block with this block. Let's try to do it! - uint16_t inext = i + 3 + blen; - if (inext <= (PageSize - 4) && - (buffer[inext] | uint16_t(buffer[inext + 1] << 8)) == (baddr + blen + 1)) { - // YES! ... we can coalesce blocks! . Do it! - - // Adjust this block header to include the next one - buffer[i + 2] += buffer[inext + 2] + 1; - - // Store data at the right place - buffer[i + 3 + blen] = data; - - // Remove the next block header and append its data - memmove(&buffer[inext + 1], &buffer[inext + 3], iend - inext - 3); - - // Finally, as we have saved 2 bytes at the end, make sure to clean them - buffer[iend - 2] = 0xFF; - buffer[iend - 1] = 0xFF; - - } - else { - // NO ... No coalescing possible yet - - // Make room at the end for our byte - memmove(&buffer[i + 3 + blen + 1], &buffer[i + 3 + blen], iend - i - 3 - blen); - - // And add the data to the block - buffer[i + 2]++; - buffer[i + 3 + blen] = data; - } - } - - // Done! - return true; - } - } - - // As blocks are always sorted, if the starting address of this block is higher - // than the address we are looking for, break loop now - We wont find the value - // associated to the address - if (baddr > address) break; - - // Jump to the next block - i += 3 + blen; - } - - // Value is not stored AND we can't expand previous block to contain it. We must create a new block - - // First, lets find how much free space remains - uint32_t iend = i; - while (iend <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ - uint32_t ln = buffer[iend + 2]; - if (ln == 0xFF) break; - iend += 3 + ln; - } - - // If there is room for a new block, insert it at the proper place - if (iend <= (PageSize - 4)) { - - // We have room to create a new block. Do so --- But add - // the block at the proper position, sorted by starting - // address, so it will be possible to compact it with other blocks. - - // Make space - memmove(&buffer[i + 4], &buffer[i], iend - i); - - // And add the block - buffer[i] = address & 0xFF; - buffer[i + 1] = (address >> 8) & 0xFF; - buffer[i + 2] = 1; - buffer[i + 3] = data; - - // Done! - return true; - } - - // Not enough room to store this information on this FLASH page - Perform a - // flush and override the address with the specified contents - return ee_Flush(address, data); -} - -static void ee_Init() { - - // Just init once! - if (curGroup != 0xFF) return; - - // Clean up the SRAM buffer - memset(buffer, 0xFF, sizeof(buffer)); - - // Now, we must find out the group where settings are stored - for (curGroup = 0; curGroup < GroupCount; curGroup++) - if (!ee_IsPageClean(curGroup * PagesPerGroup)) break; - - // If all groups seem to be used, default to first group - if (curGroup >= GroupCount) curGroup = 0; - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Current Group: ",curGroup); - DEBUG_FLUSH(); - - // Now, validate that all the other group pages are empty - for (int grp = 0; grp < GroupCount; grp++) { - if (grp == curGroup) continue; - - for (int page = 0; page < PagesPerGroup; page++) { - if (!ee_IsPageClean(grp * PagesPerGroup + page)) { - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on group ", grp); - DEBUG_FLUSH(); - ee_PageErase(grp * PagesPerGroup + page); - } - } - } - - // Finally, for the active group, determine the first unused page - // and also validate that all the other ones are clean - for (curPage = 0; curPage < PagesPerGroup; curPage++) { - if (ee_IsPageClean(curGroup * PagesPerGroup + curPage)) { - ee_Dump(curGroup * PagesPerGroup + curPage, getFlashStorage(curGroup * PagesPerGroup + curPage)); - break; - } - } - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Active page: ", curPage); - DEBUG_FLUSH(); - - // Make sure the pages following the first clean one are also clean - for (int page = curPage + 1; page < PagesPerGroup; page++) { - if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) { - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on active group ", curGroup); - DEBUG_FLUSH(); - ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page)); - ee_PageErase(curGroup * PagesPerGroup + page); - } - } -} - -/* PersistentStore -----------------------------------------------------------*/ - -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } -bool PersistentStore::access_start() { ee_Init(); return true; } -bool PersistentStore::access_finish() { ee_Flush(); return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != ee_Read(uint32_t(p))) { - ee_Write(uint32_t(p), v); - delay(2); - if (ee_Read(uint32_t(p)) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = ee_Read(uint32_t(pos)); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // FLASH_EEPROM_EMULATION -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/eeprom_wired.cpp b/Marlin/src/HAL/DUE/eeprom_wired.cpp deleted file mode 100644 index 4599d6a7cd..0000000000 --- a/Marlin/src/HAL/DUE/eeprom_wired.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -/** - * PersistentStore for Arduino-style EEPROM interface - * with simple implementations supplied by Marlin. - */ - -#include "../shared/eeprom_if.h" -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM." -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } -bool PersistentStore::access_start() { eeprom_init(); return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - delay(2); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/endstop_interrupts.h b/Marlin/src/HAL/DUE/endstop_interrupts.h deleted file mode 100644 index 999ada5127..0000000000 --- a/Marlin/src/HAL/DUE/endstop_interrupts.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Endstop Interrupts - * - * Without endstop interrupts the endstop pins must be polled continually in - * the temperature-ISR via endstops.update(), most of the time finding no change. - * With this feature endstops.update() is called only when we know that at - * least one endstop has changed state, saving valuable CPU cycles. - * - * This feature only works when all used endstop pins can generate an 'external interrupt'. - * - * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. - * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) - */ - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -/** - * Endstop interrupts for Due based targets. - * On Due, all pins support external interrupt capability. - */ - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); -} diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h deleted file mode 100644 index 286319302d..0000000000 --- a/Marlin/src/HAL/DUE/fastio.h +++ /dev/null @@ -1,562 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O Routines for SAM3X8E - * Use direct port manipulation to save scads of processor time. - * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. - */ - -/** - * Description: Fast IO functions for Arduino Due and compatible (SAM3X8E) - * - * For ARDUINO_ARCH_SAM - * Note the code here was specifically crafted by disassembling what GCC produces - * out of it, so GCC is able to optimize it out as much as possible to the least - * amount of instructions. Be very carefull if you modify them, as "clean code" - * leads to less efficient compiled code!! - */ - -#include - -#include "../../inc/MarlinConfigPre.h" - -/** - * Utility functions - */ - -// Due has 12 PWMs assigned to logical pins 2-13. -// 6, 7, 8 & 9 come from the PWM controller. The others come from the timers. -#define PWM_PIN(P) WITHIN(P, 2, 13) - -#ifndef MASK - #define MASK(PIN) (1 << PIN) -#endif - -/** - * Magic I/O routines - * - * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); - * - * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/cpp/Stringification.html - */ - -// Read a pin -#define _READ(IO) bool(DIO ## IO ## _WPORT -> PIO_PDSR & MASK(DIO ## IO ## _PIN)) - -// Write to a pin -#define _WRITE(IO,V) do { \ - volatile Pio* port = (DIO ## IO ## _WPORT); \ - const uint32_t mask = MASK(DIO ## IO ## _PIN); \ - if (V) port->PIO_SODR = mask; \ - else port->PIO_CODR = mask; \ -}while(0) - -// Toggle a pin -#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) - -#if MB(PRINTRBOARD_G2) - - #include "fastio/G2_pins.h" - - // Set pin as input - #define _SET_INPUT(IO) do{ \ - pmc_enable_periph_clk(G2_g_APinDescription[IO].ulPeripheralId); \ - PIO_Configure((DIO ## IO ## _WPORT), PIO_INPUT, MASK(DIO ## IO ## _PIN), 0); \ - }while(0) - - // Set pin as output - #define _SET_OUTPUT(IO) do{ \ - uint32_t mask = MASK(G2_g_APinDescription[IO].ulPeripheralId); \ - if ((PMC->PMC_PCSR0 & mask) != (mask)) PMC->PMC_PCER0 = mask; \ - volatile Pio* port = (DIO ## IO ## _WPORT); \ - mask = MASK(DIO ## IO ## _PIN); \ - if (_READ(IO)) port->PIO_SODR = mask; \ - else port->PIO_CODR = mask; \ - port->PIO_IDR = mask; \ - const uint32_t pin_config = G2_g_APinDescription[IO].ulPinConfiguration; \ - if (pin_config & PIO_PULLUP) port->PIO_PUER = mask; \ - else port->PIO_PUDR = mask; \ - if (pin_config & PIO_OPENDRAIN) port->PIO_MDER = mask; \ - else port->PIO_MDDR = mask; \ - port->PIO_PER = mask; \ - port->PIO_OER = mask; \ - g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT; \ - }while(0) - - /** - * Set pin as output with comments - * #define _SET_OUTPUT(IO) do{ \ - * uint32_t mask = MASK(G2_g_APinDescription[IO].ulPeripheralId); \ - * if ((PMC->PMC_PCSR0 & mask ) != (mask)) PMC->PMC_PCER0 = mask; \ // enable PIO clock if not already enabled - * - * volatile Pio* port = (DIO ## IO ## _WPORT); \ - * const uint32_t mask = MASK(DIO ## IO ## _PIN); \ - * if (_READ(IO)) port->PIO_SODR = mask; \ // set output to match input BEFORE setting direction or will glitch the output - * else port->PIO_CODR = mask; \ - * - * port->PIO_IDR = mask; \ // disable interrupt - * - * uint32_t pin_config = G2_g_APinDescription[IO].ulPinConfiguration; \ - * if (pin_config & PIO_PULLUP) pPio->PIO_PUER = mask; \ // enable pullup if necessary - * else pPio->PIO_PUDR = mask; \ - * - * if (pin_config & PIO_OPENDRAIN) port->PIO_MDER = mask; \ // Enable multi-drive if necessary - * else port->PIO_MDDR = mask; \ - * - * port->PIO_PER = mask; \ - * port->PIO_OER = mask; \ // set to output - * - * g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT; \ - * }while(0) - */ - -#else - - // Set pin as input - #define _SET_INPUT(IO) do{ \ - pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \ - PIO_Configure(digitalPinToPort(IO), PIO_INPUT, digitalPinToBitMask(IO), 0); \ - }while(0) - - // Set pin as output - #define _SET_OUTPUT(IO) do{ \ - pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \ - PIO_Configure(digitalPinToPort(IO), _READ(IO) ? PIO_OUTPUT_1 : PIO_OUTPUT_0, digitalPinToBitMask(IO), g_APinDescription[IO].ulPinConfiguration); \ - g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT; \ - }while(0) -#endif - -// Set pin as input with pullup mode -#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) - -// Read a pin (wrapper) -#define READ(IO) _READ(IO) - -// Write to a pin (wrapper) -#define WRITE(IO,V) _WRITE(IO,V) - -// Toggle a pin (wrapper) -#define TOGGLE(IO) _TOGGLE(IO) - -// Set pin as input (wrapper) -#define SET_INPUT(IO) _SET_INPUT(IO) -// Set pin as input with pullup (wrapper) -#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) -// Set pin as output (wrapper) - reads the pin and sets the output to that value -#define SET_OUTPUT(IO) _SET_OUTPUT(IO) -// Set pin as PWM -#define SET_PWM SET_OUTPUT - -// Check if pin is an input -#define IS_INPUT(IO) ((digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) == 0) -// Check if pin is an output -#define IS_OUTPUT(IO) ((digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) != 0) - -// Shorthand -#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) - -/** - * Ports and functions - * Added as necessary or if I feel like it- not a comprehensive list! - */ - -// UART -#define RXD DIO0 -#define TXD DIO1 - -// TWI (I2C) -#define SCL DIO21 -#define SDA DIO20 - -/** - * pins - */ - -#define DIO0_PIN 8 -#define DIO0_WPORT PIOA - -#define DIO1_PIN 9 -#define DIO1_WPORT PIOA - -#define DIO2_PIN 25 -#define DIO2_WPORT PIOB - -#define DIO3_PIN 28 -#define DIO3_WPORT PIOC - -#define DIO4_PIN 26 -#define DIO4_WPORT PIOC - -#define DIO5_PIN 25 -#define DIO5_WPORT PIOC - -#define DIO6_PIN 24 -#define DIO6_WPORT PIOC - -#define DIO7_PIN 23 -#define DIO7_WPORT PIOC - -#define DIO8_PIN 22 -#define DIO8_WPORT PIOC - -#define DIO9_PIN 21 -#define DIO9_WPORT PIOC - -#define DIO10_PIN 29 -#define DIO10_WPORT PIOC - -#define DIO11_PIN 7 -#define DIO11_WPORT PIOD - -#define DIO12_PIN 8 -#define DIO12_WPORT PIOD - -#define DIO13_PIN 27 -#define DIO13_WPORT PIOB - -#define DIO14_PIN 4 -#define DIO14_WPORT PIOD - -#define DIO15_PIN 5 -#define DIO15_WPORT PIOD - -#define DIO16_PIN 13 -#define DIO16_WPORT PIOA - -#define DIO17_PIN 12 -#define DIO17_WPORT PIOA - -#define DIO18_PIN 11 -#define DIO18_WPORT PIOA - -#define DIO19_PIN 10 -#define DIO19_WPORT PIOA - -#define DIO20_PIN 12 -#define DIO20_WPORT PIOB - -#define DIO21_PIN 13 -#define DIO21_WPORT PIOB - -#define DIO22_PIN 26 -#define DIO22_WPORT PIOB - -#define DIO23_PIN 14 -#define DIO23_WPORT PIOA - -#define DIO24_PIN 15 -#define DIO24_WPORT PIOA - -#define DIO25_PIN 0 -#define DIO25_WPORT PIOD - -#define DIO26_PIN 1 -#define DIO26_WPORT PIOD - -#define DIO27_PIN 2 -#define DIO27_WPORT PIOD - -#define DIO28_PIN 3 -#define DIO28_WPORT PIOD - -#define DIO29_PIN 6 -#define DIO29_WPORT PIOD - -#define DIO30_PIN 9 -#define DIO30_WPORT PIOD - -#define DIO31_PIN 7 -#define DIO31_WPORT PIOA - -#define DIO32_PIN 10 -#define DIO32_WPORT PIOD - -#define DIO33_PIN 1 -#define DIO33_WPORT PIOC - -#if !MB(PRINTRBOARD_G2) // normal DUE pin mapping - - #define DIO34_PIN 2 - #define DIO34_WPORT PIOC - - #define DIO35_PIN 3 - #define DIO35_WPORT PIOC - - #define DIO36_PIN 4 - #define DIO36_WPORT PIOC - - #define DIO37_PIN 5 - #define DIO37_WPORT PIOC - - #define DIO38_PIN 6 - #define DIO38_WPORT PIOC - - #define DIO39_PIN 7 - #define DIO39_WPORT PIOC - - #define DIO40_PIN 8 - #define DIO40_WPORT PIOC - - #define DIO41_PIN 9 - #define DIO41_WPORT PIOC - -#endif // !PRINTRBOARD_G2 - -#define DIO42_PIN 19 -#define DIO42_WPORT PIOA - -#define DIO43_PIN 20 -#define DIO43_WPORT PIOA - -#define DIO44_PIN 19 -#define DIO44_WPORT PIOC - -#define DIO45_PIN 18 -#define DIO45_WPORT PIOC - -#define DIO46_PIN 17 -#define DIO46_WPORT PIOC - -#define DIO47_PIN 16 -#define DIO47_WPORT PIOC - -#define DIO48_PIN 15 -#define DIO48_WPORT PIOC - -#define DIO49_PIN 14 -#define DIO49_WPORT PIOC - -#define DIO50_PIN 13 -#define DIO50_WPORT PIOC - -#define DIO51_PIN 12 -#define DIO51_WPORT PIOC - -#define DIO52_PIN 21 -#define DIO52_WPORT PIOB - -#define DIO53_PIN 14 -#define DIO53_WPORT PIOB - -#define DIO54_PIN 16 -#define DIO54_WPORT PIOA - -#define DIO55_PIN 24 -#define DIO55_WPORT PIOA - -#define DIO56_PIN 23 -#define DIO56_WPORT PIOA - -#define DIO57_PIN 22 -#define DIO57_WPORT PIOA - -#define DIO58_PIN 6 -#define DIO58_WPORT PIOA - -#define DIO59_PIN 4 -#define DIO59_WPORT PIOA - -#define DIO60_PIN 3 -#define DIO60_WPORT PIOA - -#define DIO61_PIN 2 -#define DIO61_WPORT PIOA - -#define DIO62_PIN 17 -#define DIO62_WPORT PIOB - -#define DIO63_PIN 18 -#define DIO63_WPORT PIOB - -#define DIO64_PIN 19 -#define DIO64_WPORT PIOB - -#define DIO65_PIN 20 -#define DIO65_WPORT PIOB - -#define DIO66_PIN 15 -#define DIO66_WPORT PIOB - -#define DIO67_PIN 16 -#define DIO67_WPORT PIOB - -#define DIO68_PIN 1 -#define DIO68_WPORT PIOA - -#define DIO69_PIN 0 -#define DIO69_WPORT PIOA - -#define DIO70_PIN 17 -#define DIO70_WPORT PIOA - -#define DIO71_PIN 18 -#define DIO71_WPORT PIOA - -#define DIO72_PIN 30 -#define DIO72_WPORT PIOC - -#define DIO73_PIN 21 -#define DIO73_WPORT PIOA - -#define DIO74_PIN 25 -#define DIO74_WPORT PIOA - -#define DIO75_PIN 26 -#define DIO75_WPORT PIOA - -#define DIO76_PIN 27 -#define DIO76_WPORT PIOA - -#define DIO77_PIN 28 -#define DIO77_WPORT PIOA - -#define DIO78_PIN 23 -#define DIO78_WPORT PIOB - -#define DIO79_PIN 17 -#define DIO79_WPORT PIOA - -#define DIO80_PIN 12 -#define DIO80_WPORT PIOB - -#define DIO81_PIN 8 -#define DIO81_WPORT PIOA - -#define DIO82_PIN 11 -#define DIO82_WPORT PIOA - -#define DIO83_PIN 13 -#define DIO83_WPORT PIOA - -#define DIO84_PIN 4 -#define DIO84_WPORT PIOD - -#define DIO85_PIN 11 -#define DIO85_WPORT PIOB - -#define DIO86_PIN 21 -#define DIO86_WPORT PIOB - -#define DIO87_PIN 29 -#define DIO87_WPORT PIOA - -#define DIO88_PIN 15 -#define DIO88_WPORT PIOB - -#define DIO89_PIN 14 -#define DIO89_WPORT PIOB - -#define DIO90_PIN 1 -#define DIO90_WPORT PIOA - -#define DIO91_PIN 15 -#define DIO91_WPORT PIOB - -#if ARDUINO_SAM_ARCHIM - - #define DIO92_PIN 11 - #define DIO92_WPORT PIOC - - #define DIO93_PIN 2 - #define DIO93_WPORT PIOB - - #define DIO94_PIN 1 - #define DIO94_WPORT PIOB - - #define DIO95_PIN 0 - #define DIO95_WPORT PIOB - - #define DIO96_PIN 10 - #define DIO96_WPORT PIOC - - #define DIO97_PIN 24 - #define DIO97_WPORT PIOB - - #define DIO98_PIN 7 - #define DIO98_WPORT PIOB - - #define DIO99_PIN 6 - #define DIO99_WPORT PIOB - - #define DIO100_PIN 8 - #define DIO100_WPORT PIOB - - #define DIO101_PIN 5 - #define DIO101_WPORT PIOB - - #define DIO102_PIN 4 - #define DIO102_WPORT PIOB - - #define DIO103_PIN 3 - #define DIO103_WPORT PIOB - - #define DIO104_PIN 20 - #define DIO104_WPORT PIOC - - #define DIO105_PIN 22 - #define DIO105_WPORT PIOB - - #define DIO106_PIN 27 - #define DIO106_WPORT PIOC - - #define DIO107_PIN 10 - #define DIO107_WPORT PIOB - - #define DIO108_PIN 9 - #define DIO108_WPORT PIOB - -#else // !ARDUINO_SAM_ARCHIM - - #define DIO92_PIN 5 - #define DIO92_WPORT PIOA - - #define DIO93_PIN 12 - #define DIO93_WPORT PIOB - - #define DIO94_PIN 22 - #define DIO94_WPORT PIOB - - #define DIO95_PIN 23 - #define DIO95_WPORT PIOB - - #define DIO96_PIN 24 - #define DIO96_WPORT PIOB - - #define DIO97_PIN 20 - #define DIO97_WPORT PIOC - - #define DIO98_PIN 27 - #define DIO98_WPORT PIOC - - #define DIO99_PIN 10 - #define DIO99_WPORT PIOC - - #define DIO100_PIN 11 - #define DIO100_WPORT PIOC - -#endif // !ARDUINO_SAM_ARCHIM diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp deleted file mode 100644 index d9fbabce21..0000000000 --- a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp +++ /dev/null @@ -1,206 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * The PWM module is only used to generate interrupts at specified times. It - * is NOT used to directly toggle pins. The ISR writes to the pin assigned to - * that interrupt. - * - * All PWMs use the same repetition rate. The G2 needs about 10KHz min in order to - * not have obvious ripple on the Vref signals. - * - * The data structures are setup to minimize the computation done by the ISR which - * minimizes ISR execution time. Execution times are 0.8 to 1.1 microseconds. - * - * FIve PWM interrupt sources are used. Channel 0 sets the base period. All Vref - * signals are set active when this counter overflows and resets to zero. The compare - * values in channels 1-4 are set to give the desired duty cycle for that Vref pin. - * When counter 0 matches the compare value then that channel generates an interrupt. - * The ISR checks the source of the interrupt and sets the corresponding pin inactive. - * - * Some jitter in the Vref signal is OK so the interrupt priority is left at its default value. - */ - -#include "../../../inc/MarlinConfig.h" - -#if MB(PRINTRBOARD_G2) - -#include "G2_PWM.h" - -#if PIN_EXISTS(MOTOR_CURRENT_PWM_X) - #define G2_PWM_X 1 -#else - #define G2_PWM_X 0 -#endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) - #define G2_PWM_Y 1 -#else - #define G2_PWM_Y 0 -#endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - #define G2_PWM_Z 1 -#else - #define G2_PWM_Z 0 -#endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - #define G2_PWM_E 1 -#else - #define G2_PWM_E 0 -#endif -#define G2_MASK_X(V) (G2_PWM_X * (V)) -#define G2_MASK_Y(V) (G2_PWM_Y * (V)) -#define G2_MASK_Z(V) (G2_PWM_Z * (V)) -#define G2_MASK_E(V) (G2_PWM_E * (V)) - -volatile uint32_t *SODR_A = &PIOA->PIO_SODR, - *SODR_B = &PIOB->PIO_SODR, - *CODR_A = &PIOA->PIO_CODR, - *CODR_B = &PIOB->PIO_CODR; - -PWM_map ISR_table[NUM_PWMS] = PWM_MAP_INIT; - -void Stepper::digipot_init() { - - #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) - OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, 0); // init pins - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) - OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, 0); - #endif - #if G2_PWM_Z - OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, 0); - #endif - #if G2_PWM_E - OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, 0); - #endif - - #define WPKEY (0x50574D << 8) // “PWM” in ASCII - #define WPCMD_DIS_SW 0 // command to disable Write Protect SW - #define WPRG_ALL (PWM_WPCR_WPRG0 | PWM_WPCR_WPRG1 | PWM_WPCR_WPRG2 | PWM_WPCR_WPRG3 | PWM_WPCR_WPRG4 | PWM_WPCR_WPRG5) // all Write Protect Groups - - #define PWM_CLOCK_F F_CPU / 1000000UL // set clock to 1MHz - - PMC->PMC_PCER1 = PMC_PCER1_PID36; // enable PWM controller clock (disabled on power up) - - PWM->PWM_WPCR = WPKEY | WPRG_ALL | WPCMD_DIS_SW; // enable setting of all PWM registers - PWM->PWM_CLK = PWM_CLOCK_F; // enable CLK_A and set it to 1MHz, leave CLK_B disabled - PWM->PWM_CH_NUM[0].PWM_CMR = 0b1011; // set channel 0 to Clock A input & to left aligned - if (G2_PWM_X) PWM->PWM_CH_NUM[1].PWM_CMR = 0b1011; // set channel 1 to Clock A input & to left aligned - if (G2_PWM_Y) PWM->PWM_CH_NUM[2].PWM_CMR = 0b1011; // set channel 2 to Clock A input & to left aligned - if (G2_PWM_Z) PWM->PWM_CH_NUM[3].PWM_CMR = 0b1011; // set channel 3 to Clock A input & to left aligned - if (G2_PWM_E) PWM->PWM_CH_NUM[4].PWM_CMR = 0b1011; // set channel 4 to Clock A input & to left aligned - - PWM->PWM_CH_NUM[0].PWM_CPRD = PWM_PERIOD_US; // set channel 0 Period - - PWM->PWM_IER2 = PWM_IER1_CHID0; // generate interrupt when counter0 overflows - PWM->PWM_IER2 = PWM_IER2_CMPM0 - | G2_MASK_X(PWM_IER2_CMPM1) - | G2_MASK_Y(PWM_IER2_CMPM2) - | G2_MASK_Z(PWM_IER2_CMPM3) - | G2_MASK_E(PWM_IER2_CMPM4) - ; // generate interrupt on compare event - - if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[0])); // interrupt when counter0 == CMPV - used to set Motor 1 PWM inactive - if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[0])); // interrupt when counter0 == CMPV - used to set Motor 2 PWM inactive - if (G2_PWM_Z) PWM->PWM_CMP[3].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[1])); // interrupt when counter0 == CMPV - used to set Motor 3 PWM inactive - if (G2_PWM_E) PWM->PWM_CMP[4].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[2])); // interrupt when counter0 == CMPV - used to set Motor 4 PWM inactive - - if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPM = 0x0001; // enable compare event - if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPM = 0x0001; // enable compare event - if (G2_PWM_Z) PWM->PWM_CMP[3].PWM_CMPM = 0x0001; // enable compare event - if (G2_PWM_E) PWM->PWM_CMP[4].PWM_CMPM = 0x0001; // enable compare event - - PWM->PWM_SCM = PWM_SCM_UPDM_MODE0 | PWM_SCM_SYNC0 - | G2_MASK_X(PWM_SCM_SYNC1) - | G2_MASK_Y(PWM_SCM_SYNC2) - | G2_MASK_Z(PWM_SCM_SYNC3) - | G2_MASK_E(PWM_SCM_SYNC4) - ; // sync 1-4 with 0, use mode 0 for updates - - PWM->PWM_ENA = PWM_ENA_CHID0 - | G2_MASK_X(PWM_ENA_CHID1) - | G2_MASK_Y(PWM_ENA_CHID2) - | G2_MASK_Z(PWM_ENA_CHID3) - | G2_MASK_E(PWM_ENA_CHID4) - ; // enable channels used by G2 - - PWM->PWM_IER1 = PWM_IER1_CHID0 - | G2_MASK_X(PWM_IER1_CHID1) - | G2_MASK_Y(PWM_IER1_CHID2) - | G2_MASK_Z(PWM_IER1_CHID3) - | G2_MASK_E(PWM_IER1_CHID4) - ; // enable interrupts for channels used by G2 - - NVIC_EnableIRQ(PWM_IRQn); // Enable interrupt handler - NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals) -} - -void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { - - if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed - - switch (driver) { - case 0: - if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); // update X & Y - if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); - if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPMUPD = 0x0001; // enable compare event - if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPMUPD = 0x0001; // enable compare event - if (G2_PWM_X || G2_PWM_Y) PWM->PWM_SCUC = PWM_SCUC_UPDULOCK; // tell the PWM controller to update the values on the next cycle - break; - case 1: - if (G2_PWM_Z) { - PWM->PWM_CMP[3].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); // update Z - PWM->PWM_CMP[3].PWM_CMPMUPD = 0x0001; // enable compare event - PWM->PWM_SCUC = PWM_SCUC_UPDULOCK; // tell the PWM controller to update the values on the next cycle - } - break; - default: - if (G2_PWM_E) { - PWM->PWM_CMP[4].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); // update E - PWM->PWM_CMP[4].PWM_CMPMUPD = 0x0001; // enable compare event - PWM->PWM_SCUC = PWM_SCUC_UPDULOCK; // tell the PWM controller to update the values on the next cycle - } - break; - } -} - -volatile uint32_t PWM_ISR1_STATUS, PWM_ISR2_STATUS; - -void PWM_Handler() { - PWM_ISR1_STATUS = PWM->PWM_ISR1; - PWM_ISR2_STATUS = PWM->PWM_ISR2; - if (PWM_ISR1_STATUS & PWM_IER1_CHID0) { // CHAN_0 interrupt - if (G2_PWM_X) *ISR_table[0].set_register = ISR_table[0].write_mask; // set X to active - if (G2_PWM_Y) *ISR_table[1].set_register = ISR_table[1].write_mask; // set Y to active - if (G2_PWM_Z) *ISR_table[2].set_register = ISR_table[2].write_mask; // set Z to active - if (G2_PWM_E) *ISR_table[3].set_register = ISR_table[3].write_mask; // set E to active - } - else { - if (G2_PWM_X && (PWM_ISR2_STATUS & PWM_IER2_CMPM1)) *ISR_table[0].clr_register = ISR_table[0].write_mask; // set X to inactive - if (G2_PWM_Y && (PWM_ISR2_STATUS & PWM_IER2_CMPM2)) *ISR_table[1].clr_register = ISR_table[1].write_mask; // set Y to inactive - if (G2_PWM_Z && (PWM_ISR2_STATUS & PWM_IER2_CMPM3)) *ISR_table[2].clr_register = ISR_table[2].write_mask; // set Z to inactive - if (G2_PWM_E && (PWM_ISR2_STATUS & PWM_IER2_CMPM4)) *ISR_table[3].clr_register = ISR_table[3].write_mask; // set E to inactive - } - return; -} - -#endif // PRINTRBOARD_G2 diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.h b/Marlin/src/HAL/DUE/fastio/G2_PWM.h deleted file mode 100644 index dc4edffff8..0000000000 --- a/Marlin/src/HAL/DUE/fastio/G2_PWM.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * This module is stripped down version of the LPC1768_PWM.h file from - * PR #7500. It is hardwired for the PRINTRBOARD_G2 Motor Current needs. - */ - -#include "../../../inc/MarlinConfigPre.h" -#include "../../../module/stepper.h" -//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\module\stepper.h -//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\HAL\HAL_DUE\G2_PWM.h - -#define PWM_PERIOD_US 100 // base repetition rate in micro seconds - -typedef struct { // holds the data needed by the ISR to control the Vref pin - volatile uint32_t* set_register; - volatile uint32_t* clr_register; - uint32_t write_mask; -} PWM_map; - -#define G2_VREF(I) (uint32_t)(I * 5 * 0.15) // desired Vref * 1000 (scaled so don't loose accuracy in next step) - -#define G2_VREF_COUNT(Q) (uint32_t)map(constrain(Q, 500, 3.3 * 1000), 0, 3.3 * 1000, 0, PWM_PERIOD_US) // under 500 the results are very non-linear - -extern volatile uint32_t *SODR_A, *SODR_B, *CODR_A, *CODR_B; - -#define _PIN(IO) (DIO ## IO ## _PIN) - -#define PWM_MAP_INIT_ROW(IO,ZZ) { ZZ == 'A' ? SODR_A : SODR_B, ZZ == 'A' ? CODR_A : CODR_B, 1 << _PIN(IO) } - - -#define PWM_MAP_INIT { PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_X_PIN, 'B'), \ - PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Y_PIN, 'B'), \ - PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Z_PIN, 'B'), \ - PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_E_PIN, 'A'), \ - }; - -#define NUM_PWMS 4 - -extern PWM_map ISR_table[NUM_PWMS]; - -extern uint32_t motor_current_setting[3]; - -#define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4) -#define COPY_ACTIVE_TABLE() do{ LOOP_L_N(i, 6) work_table[i] = active_table[i]; }while(0) - -#define PWM_MR0 19999 // base repetition rate minus one count - 20mS -#define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output -#define PWM_PCLKSEL0 0x00 // select clock source for prescaler - defaults to 25MHz on power up - // 0: 25MHz, 1: 100MHz, 2: 50MHz, 3: 12.5MHZ to PWM1 prescaler -#define MR0_MARGIN 200 // if channel value too close to MR0 the system locks up - -extern bool PWM_table_swap; // flag to tell the ISR that the tables have been swapped - -#define HAL_G2_PWM_ISR void PWM_Handler() - -extern volatile uint32_t PWM_ISR1_STATUS, PWM_ISR2_STATUS; diff --git a/Marlin/src/HAL/DUE/fastio/G2_pins.h b/Marlin/src/HAL/DUE/fastio/G2_pins.h deleted file mode 100644 index 80c87bd392..0000000000 --- a/Marlin/src/HAL/DUE/fastio/G2_pins.h +++ /dev/null @@ -1,278 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -/** - * This file contains the custom port/pin definitions for the PRINTRBOARD_G2 - * motherboard. This motherboard uses the SAM3X8C which is a subset of the - * SAM3X8E used in the DUE board. It uses port/pin pairs that are not - * available using the DUE definitions. - * - * The first part is a copy of the pin descriptions in the - * "variants\arduino_due_x\variant.cpp" file but with pins 34-41 replaced by - * the G2 pins. - * - * The second part is the FASTIO port/pin definitions. - * - * THESE PINS CAN ONLY BE ACCESSED VIA FASTIO COMMANDS. - */ - -/* - Copyright (c) 2011 Arduino. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -typedef struct _G2_PinDescription { - Pio* pPort; - uint32_t ulPin; - uint32_t ulPeripheralId; - EPioType ulPinType; - uint32_t ulPinConfiguration; - uint32_t ulPinAttribute; - EAnalogChannel ulAnalogChannel; /* Analog pin in the Arduino context (label on the board) */ - EAnalogChannel ulADCChannelNumber; /* ADC Channel number in the SAM device */ - EPWMChannel ulPWMChannel; - ETCChannel ulTCChannel; -} G2_PinDescription; - -/** - * This section is a copy of the pin descriptions in the "variants\arduino_due_x\variant.cpp" file - * with pins 34-41 replaced by the G2 pins. - */ - -/** - * Pins descriptions - */ -const G2_PinDescription G2_g_APinDescription[] = { - // 0 .. 53 - Digital pins - // ---------------------- - // 0/1 - UART (Serial) - { PIOA, PIO_PA8A_URXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // URXD - { PIOA, PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // UTXD - - // 2 - { PIOB, PIO_PB25B_TIOA0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHA0 }, // TIOA0 - { PIOC, PIO_PC28B_TIOA7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA7 }, // TIOA7 - { PIOC, PIO_PC26B_TIOB6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB6 }, // TIOB6 - - // 5 - { PIOC, PIO_PC25B_TIOA6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA6 }, // TIOA6 - { PIOC, PIO_PC24B_PWML7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH7, NOT_ON_TIMER }, // PWML7 - { PIOC, PIO_PC23B_PWML6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH6, NOT_ON_TIMER }, // PWML6 - { PIOC, PIO_PC22B_PWML5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWML5 - { PIOC, PIO_PC21B_PWML4, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH4, NOT_ON_TIMER }, // PWML4 - // 10 - { PIOC, PIO_PC29B_TIOB7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB7 }, // TIOB7 - { PIOD, PIO_PD7B_TIOA8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA8 }, // TIOA8 - { PIOD, PIO_PD8B_TIOB8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB8 }, // TIOB8 - - // 13 - AMBER LED - { PIOB, PIO_PB27B_TIOB0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHB0 }, // TIOB0 - - // 14/15 - USART3 (Serial3) - { PIOD, PIO_PD4B_TXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD3 - { PIOD, PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD3 - - // 16/17 - USART1 (Serial2) - { PIOA, PIO_PA13A_TXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD1 - { PIOA, PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD1 - - // 18/19 - USART0 (Serial1) - { PIOA, PIO_PA11A_TXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD0 - { PIOA, PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD0 - - // 20/21 - TWI1 - { PIOB, PIO_PB12A_TWD1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD1 - SDA0 - { PIOB, PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK1 - SCL0 - - // 22 - { PIOB, PIO_PB26, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 22 - { PIOA, PIO_PA14, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 23 - { PIOA, PIO_PA15, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 24 - { PIOD, PIO_PD0, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 25 - - // 26 - { PIOD, PIO_PD1, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 26 - { PIOD, PIO_PD2, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 27 - { PIOD, PIO_PD3, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 28 - { PIOD, PIO_PD6, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 29 - - // 30 - { PIOD, PIO_PD9, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 30 - { PIOA, PIO_PA7, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 31 - { PIOD, PIO_PD10, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 32 - { PIOC, PIO_PC1, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 33 - - // 34 - - // start of custom pins - { PIOA, PIO_PA29, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 34 Y_STEP_PIN - { PIOB, PIO_PB1, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 35 Y_DIR_PIN - { PIOB, PIO_PB0, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 36 Y_ENABLE_PIN - { PIOB, PIO_PB22, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 37 E0_ENABLE_PIN - { PIOB, PIO_PB11, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 38 E0_MS1_PIN - { PIOB, PIO_PB10, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 39 E0_MS3_PIN - { PIOA, PIO_PA5, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 40 HEATER_0_PIN - { PIOB, PIO_PB24, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 41 HEATER_BED_PIN - // end of custom pins - - // 42 - { PIOA, PIO_PA19, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 42 - { PIOA, PIO_PA20, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 43 - { PIOC, PIO_PC19, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 44 - { PIOC, PIO_PC18, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 45 - - // 46 - { PIOC, PIO_PC17, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 46 - { PIOC, PIO_PC16, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 47 - { PIOC, PIO_PC15, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 48 - { PIOC, PIO_PC14, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 49 - - // 50 - { PIOC, PIO_PC13, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 50 - { PIOC, PIO_PC12, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 51 - { PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52 - { PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53 - - - // 54 .. 65 - Analog pins - // ---------------------- - { PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0 - { PIOA, PIO_PA24X1_AD6, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC1, ADC6, NOT_ON_PWM, NOT_ON_TIMER }, // AD1 - { PIOA, PIO_PA23X1_AD5, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC2, ADC5, NOT_ON_PWM, NOT_ON_TIMER }, // AD2 - { PIOA, PIO_PA22X1_AD4, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC3, ADC4, NOT_ON_PWM, NOT_ON_TIMER }, // AD3 - // 58 - { PIOA, PIO_PA6X1_AD3, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // AD4 - { PIOA, PIO_PA4X1_AD2, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC5, ADC2, NOT_ON_PWM, NOT_ON_TIMER }, // AD5 - { PIOA, PIO_PA3X1_AD1, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC6, ADC1, NOT_ON_PWM, TC0_CHB1 }, // AD6 - { PIOA, PIO_PA2X1_AD0, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC7, ADC0, NOT_ON_PWM, TC0_CHA1 }, // AD7 - // 62 - { PIOB, PIO_PB17X1_AD10, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC8, ADC10, NOT_ON_PWM, NOT_ON_TIMER }, // AD8 - { PIOB, PIO_PB18X1_AD11, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC9, ADC11, NOT_ON_PWM, NOT_ON_TIMER }, // AD9 - { PIOB, PIO_PB19X1_AD12, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC10, ADC12, NOT_ON_PWM, NOT_ON_TIMER }, // AD10 - { PIOB, PIO_PB20X1_AD13, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC11, ADC13, NOT_ON_PWM, NOT_ON_TIMER }, // AD11 - - // 66/67 - DAC0/DAC1 - { PIOB, PIO_PB15X1_DAC0, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC12, DA0, NOT_ON_PWM, NOT_ON_TIMER }, // DAC0 - { PIOB, PIO_PB16X1_DAC1, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC13, DA1, NOT_ON_PWM, NOT_ON_TIMER }, // DAC1 - - // 68/69 - CANRX0/CANTX0 - { PIOA, PIO_PA1A_CANRX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC14, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX - { PIOA, PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC15, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX - - // 70/71 - TWI0 - { PIOA, PIO_PA17A_TWD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD0 - SDA1 - { PIOA, PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK0 - SCL1 - - // 72/73 - LEDs - { PIOC, PIO_PC30, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER RXL - { PIOA, PIO_PA21, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER TXL - - // 74/75/76 - SPI - { PIOA, PIO_PA25A_SPI0_MISO,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MISO - { PIOA, PIO_PA26A_SPI0_MOSI,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MOSI - { PIOA, PIO_PA27A_SPI0_SPCK,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // SPCK - - // 77 - SPI CS0 - { PIOA, PIO_PA28A_SPI0_NPCS0,ID_PIOA,PIO_PERIPH_A,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS0 - - // 78 - SPI CS3 (unconnected) - { PIOB, PIO_PB23B_SPI0_NPCS3,ID_PIOB,PIO_PERIPH_B,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS3 - - // 79 .. 84 - "All pins" masks - - // 79 - TWI0 all pins - { PIOA, PIO_PA17A_TWD0|PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 80 - TWI1 all pins - { PIOB, PIO_PB12A_TWD1|PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 81 - UART (Serial) all pins - { PIOA, PIO_PA8A_URXD|PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 82 - USART0 (Serial1) all pins - { PIOA, PIO_PA11A_TXD0|PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 83 - USART1 (Serial2) all pins - { PIOA, PIO_PA13A_TXD1|PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 84 - USART3 (Serial3) all pins - { PIOD, PIO_PD4B_TXD3|PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - - // 85 - USB - { PIOB, PIO_PB11A_UOTGID|PIO_PB10A_UOTGVBOF, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF - - // 86 - SPI CS2 - { PIOB, PIO_PB21B_SPI0_NPCS2, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS2 - - // 87 - SPI CS1 - { PIOA, PIO_PA29A_SPI0_NPCS1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS1 - - // 88/89 - CANRX1/CANTX1 (same physical pin for 66/53) - { PIOB, PIO_PB15A_CANRX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX1 - { PIOB, PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX1 - - // 90 .. 91 - "All CAN pins" masks - // 90 - CAN0 all pins - { PIOA, PIO_PA1A_CANRX0|PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 91 - CAN1 all pins - { PIOB, PIO_PB15A_CANRX1|PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - - // END - { nullptr, 0, 0, PIO_NOT_A_PIN, PIO_DEFAULT, 0, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER } -}; - -// This section replaces the FASTIO definitions of pins 34-41 - -#define DIO34_PIN 29 -#define DIO34_WPORT PIOA // only available via FASTIO // 34 PA29 - Y_STEP_PIN - -#define DIO35_PIN 1 -#define DIO35_WPORT PIOB // only available via FASTIO // 35 PAB1 - Y_DIR_PIN - -#define DIO36_PIN 0 -#define DIO36_WPORT PIOB // only available via FASTIO // 36 PB0 - Y_ENABLE_PIN - -#define DIO37_PIN 22 -#define DIO37_WPORT PIOB // only available via FASTIO // 37 PB22 - E0_ENABLE_PIN - -#define DIO38_PIN 11 -#define DIO38_WPORT PIOB // only available via FASTIO // 38 PB11 - E0_MS1_PIN - -#define DIO39_PIN 10 -#define DIO39_WPORT PIOB // only available via FASTIO // 39 PB10 - E0_MS3_PIN - -#define DIO40_PIN 5 -#define DIO40_WPORT PIOA // only available via FASTIO // 40 PA5 - HEATER_0_PIN - -#define DIO41_PIN 24 -#define DIO41_WPORT PIOB // only available via FASTIO // 41 PB24 - HEATER_BED_PIN diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h deleted file mode 100644 index 5867414447..0000000000 --- a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/DUE." -#endif diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_adv.h b/Marlin/src/HAL/DUE/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/DUE/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_post.h b/Marlin/src/HAL/DUE/inc/Conditionals_post.h deleted file mode 100644 index ce6d3fdde2..0000000000 --- a/Marlin/src/HAL/DUE/inc/Conditionals_post.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if USE_FALLBACK_EEPROM - #define FLASH_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) - #define USE_SHARED_EEPROM 1 -#endif diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h deleted file mode 100644 index 6880696506..0000000000 --- a/Marlin/src/HAL/DUE/inc/SanityCheck.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test Arduino Due specific configuration values for errors at compile-time. - */ - -/** - * HARDWARE VS. SOFTWARE SPI COMPATIBILITY - * - * DUE selects hardware vs. software SPI depending on whether one of the hardware-controllable SDSS pins is in use. - * - * The hardware SPI controller doesn't allow software SPIs to control any shared pins. - * - * When DUE software SPI is used then Trinamic drivers must use the TMC softSPI. - * - * When DUE hardware SPI is used then a Trinamic driver can use either its hardware SPI or, if there are no shared - * pins, its software SPI. - * - * Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time - * as the TMC2130 soft SPI the most common setup. - */ -#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN)) - -#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130) - #if ENABLED(TMC_USE_SW_SPI) - #if DISABLED(DUE_SOFTWARE_SPI) && (_IS_HW_SPI(MOSI) || _IS_HW_SPI(MISO) || _IS_HW_SPI(SCK)) - #error "DUE hardware SPI is required but is incompatible with TMC2130 software SPI. Either disable TMC_USE_SW_SPI or use separate pins for the two SPIs." - #endif - #elif ENABLED(DUE_SOFTWARE_SPI) - #error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix." - #endif -#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on DUE." -#endif - -#if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." -#endif diff --git a/Marlin/src/HAL/DUE/pinsDebug.h b/Marlin/src/HAL/DUE/pinsDebug.h deleted file mode 100644 index a99ca8ecce..0000000000 --- a/Marlin/src/HAL/DUE/pinsDebug.h +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Support routines for Due - */ - -/** - * Translation of routines & variables used by pinsDebug.h - */ - -#include "../shared/Marduino.h" - -/** - * Due/Marlin quirks - * - * a) determining the state of a pin - * The Due/Arduino status definitions for the g_pinStatus[pin] array are: - * #define PIN_STATUS_DIGITAL_INPUT_PULLUP (0x01) - * #define PIN_STATUS_DIGITAL_INPUT (0x02) - * #define PIN_STATUS_DIGITAL_OUTPUT (0x03) - * #define PIN_STATUS_ANALOG (0x04) - * #define PIN_STATUS_PWM (0x05) - * #define PIN_STATUS_TIMER (0x06) - * - * These are only valid if the following Due/Arduino provided functions are used: - * analogRead - * analogWrite - * digitalWrite - * pinMode - * - * The FASTIO routines do not touch the g_pinStatus[pin] array. - * - * The net result is that both the g_pinStatus[pin] array and the PIO_OSR register - * needs to be looked at when determining if a pin is an input or an output. - * - * b) Due has only pins 6, 7, 8 & 9 enabled for PWMs. FYI - they run at 1KHz - * - * c) NUM_DIGITAL_PINS does not include the analog pins - * - * d) Pins 0-78 are defined for Due but 78 has a comment of "unconnected!". 78 is - * included just in case. - */ - -#define NUMBER_PINS_TOTAL PINS_COUNT - -#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin -#define PRINT_PORT(p) -#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0) -#define GET_ARRAY_PIN(p) pin_array[p].pin -#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital -#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0) -#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) -#define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1))) -#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \ - ((g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_PWM)) -#define MULTI_NAME_PAD 14 // space needed to be pretty if not first name assigned to a pin - -bool GET_PINMODE(int8_t pin) { // 1: output, 0: input - volatile Pio* port = g_APinDescription[pin].pPort; - uint32_t mask = g_APinDescription[pin].ulPin; - uint8_t pin_status = g_pinStatus[pin] & 0xF; - return ( (pin_status == 0 && (port->PIO_OSR & mask)) - || pin_status == PIN_STATUS_DIGITAL_OUTPUT - || pwm_status(pin)); -} - - -void pwm_details(int32_t pin) { - if (pwm_status(pin)) { - uint32_t chan = g_APinDescription[pin].ulPWMChannel; - SERIAL_ECHOPAIR("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY); - } -} - -/** - * DUE Board pin | PORT | Label - * ----------------+--------+------- - * 0 | PA8 | "RX0" - * 1 | PA9 | "TX0" - * 2 TIOA0 | PB25 | - * 3 TIOA7 | PC28 | - * 4 NPCS1 | PA29 | - * TIOB6 | PC26 | - * 5 TIOA6 | PC25 | - * 6 PWML7 | PC24 | - * 7 PWML6 | PC23 | - * 8 PWML5 | PC22 | - * 9 PWML4 | PC21 | - * 10 NPCS0 | PA28 | - * TIOB7 | PC29 | - * 11 TIOA8 | PD7 | - * 12 TIOB8 | PD8 | - * 13 TIOB0 | PB27 | LED AMBER "L" - * 14 TXD3 | PD4 | "TX3" - * 15 RXD3 | PD5 | "RX3" - * 16 TXD1 | PA13 | "TX2" - * 17 RXD1 | PA12 | "RX2" - * 18 TXD0 | PA11 | "TX1" - * 19 RXD0 | PA10 | "RX1" - * 20 | PB12 | "SDA" - * 21 | PB13 | "SCL" - * 22 | PB26 | - * 23 | PA14 | - * 24 | PA15 | - * 25 | PD0 | - * 26 | PD1 | - * 27 | PD2 | - * 28 | PD3 | - * 29 | PD6 | - * 30 | PD9 | - * 31 | PA7 | - * 32 | PD10 | - * 33 | PC1 | - * 34 | PC2 | - * 35 | PC3 | - * 36 | PC4 | - * 37 | PC5 | - * 38 | PC6 | - * 39 | PC7 | - * 40 | PC8 | - * 41 | PC9 | - * 42 | PA19 | - * 43 | PA20 | - * 44 | PC19 | - * 45 | PC18 | - * 46 | PC17 | - * 47 | PC16 | - * 48 | PC15 | - * 49 | PC14 | - * 50 | PC13 | - * 51 | PC12 | - * 52 NPCS2 | PB21 | - * 53 | PB14 | - * 54 | PA16 | "A0" - * 55 | PA24 | "A1" - * 56 | PA23 | "A2" - * 57 | PA22 | "A3" - * 58 TIOB2 | PA6 | "A4" - * 69 | PA4 | "A5" - * 60 TIOB1 | PA3 | "A6" - * 61 TIOA1 | PA2 | "A7" - * 62 | PB17 | "A8" - * 63 | PB18 | "A9" - * 64 | PB19 | "A10" - * 65 | PB20 | "A11" - * 66 | PB15 | "DAC0" - * 67 | PB16 | "DAC1" - * 68 | PA1 | "CANRX" - * 69 | PA0 | "CANTX" - * 70 | PA17 | "SDA1" - * 71 | PA18 | "SCL1" - * 72 | PC30 | LED AMBER "RX" - * 73 | PA21 | LED AMBER "TX" - * 74 MISO | PA25 | - * 75 MOSI | PA26 | - * 76 SCLK | PA27 | - * 77 NPCS0 | PA28 | - * 78 NPCS3 | PB23 | unconnected! - * - * USB pin | PORT - * ----------------+-------- - * ID | PB11 - * VBOF | PB10 - */ diff --git a/Marlin/src/HAL/DUE/spi_pins.h b/Marlin/src/HAL/DUE/spi_pins.h deleted file mode 100644 index e28eaf8270..0000000000 --- a/Marlin/src/HAL/DUE/spi_pins.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Define SPI Pins: SCK, MISO, MOSI, SS - * - * Available chip select pins for HW SPI are 4 10 52 77 - */ -#if SDSS == 4 || SDSS == 10 || SDSS == 52 || SDSS == 77 || SDSS == 87 - #if SDSS == 4 - #define SPI_PIN 87 - #define SPI_CHAN 1 - #elif SDSS == 10 - #define SPI_PIN 77 - #define SPI_CHAN 0 - #elif SDSS == 52 - #define SPI_PIN 86 - #define SPI_CHAN 2 - #elif SDSS == 77 - #define SPI_PIN 77 - #define SPI_CHAN 0 - #else - #define SPI_PIN 87 - #define SPI_CHAN 1 - #endif - #define SCK_PIN 76 - #define MISO_PIN 74 - #define MOSI_PIN 75 -#else - // defaults - #define DUE_SOFTWARE_SPI - #ifndef SCK_PIN - #define SCK_PIN 52 - #endif - #ifndef MISO_PIN - #define MISO_PIN 50 - #endif - #ifndef MOSI_PIN - #define MOSI_PIN 51 - #endif -#endif - -/* A.28, A.29, B.21, C.26, C.29 */ -#define SS_PIN SDSS diff --git a/Marlin/src/HAL/DUE/timers.cpp b/Marlin/src/HAL/DUE/timers.cpp deleted file mode 100644 index 9b937d1a7c..0000000000 --- a/Marlin/src/HAL/DUE/timers.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL Timers for Arduino Due and compatible (SAM3X8E) - */ - -#ifdef ARDUINO_ARCH_SAM - -// ------------------------ -// Includes -// ------------------------ -#include "../../inc/MarlinConfig.h" -#include "HAL.h" - -// ------------------------ -// Local defines -// ------------------------ - -#define NUM_HARDWARE_TIMERS 9 - -// ------------------------ -// Private Variables -// ------------------------ - -const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { - { TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5] - { TC0, 1, TC1_IRQn, 0}, // 1 - { TC0, 2, TC2_IRQn, 2}, // 2 - stepper - { TC1, 0, TC3_IRQn, 0}, // 3 - stepper for BOARD_ARCHIM1 - { TC1, 1, TC4_IRQn, 15}, // 4 - temperature - { TC1, 2, TC5_IRQn, 3}, // 5 - [servo timer3] - { TC2, 0, TC6_IRQn, 14}, // 6 - tone - { TC2, 1, TC7_IRQn, 0}, // 7 - { TC2, 2, TC8_IRQn, 0}, // 8 -}; - -// ------------------------ -// Public functions -// ------------------------ - -/* - Timer_clock1: Prescaler 2 -> 42MHz - Timer_clock2: Prescaler 8 -> 10.5MHz - Timer_clock3: Prescaler 32 -> 2.625MHz - Timer_clock4: Prescaler 128 -> 656.25kHz -*/ - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - Tc *tc = TimerConfig[timer_num].pTimerRegs; - IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; - uint32_t channel = TimerConfig[timer_num].channel; - - // Disable interrupt, just in case it was already enabled - NVIC_DisableIRQ(irq); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); - - // Disable timer interrupt - tc->TC_CHANNEL[channel].TC_IDR = TC_IDR_CPCS; - - // Stop timer, just in case, to be able to reconfigure it - TC_Stop(tc, channel); - - pmc_set_writeprotect(false); - pmc_enable_periph_clk((uint32_t)irq); - NVIC_SetPriority(irq, TimerConfig [timer_num].priority); - - // wave mode, reset counter on match with RC, - TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); - - // Set compare value - TC_SetRC(tc, channel, VARIANT_MCK / 2 / frequency); - - // And start timer - TC_Start(tc, channel); - - // enable interrupt on RC compare - tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPCS; - - // Finally, enable IRQ - NVIC_EnableIRQ(irq); -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; - NVIC_EnableIRQ(irq); -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; - NVIC_DisableIRQ(irq); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); -} - -// missing from CMSIS: Check if interrupt is enabled or not -static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) { - return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0; -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; - return NVIC_GetEnabledIRQ(irq); -} - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/timers.h b/Marlin/src/HAL/DUE/timers.h deleted file mode 100644 index 0e1ea07cc2..0000000000 --- a/Marlin/src/HAL/DUE/timers.h +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Timers for Arduino Due and compatible (SAM3X8E) - */ - -#include - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -typedef uint32_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF - -#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 2 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 4 // Timer Index for Temperature -#endif -#ifndef TONE_TIMER_NUM - #define TONE_TIMER_NUM 6 // index of timer to use for beeper tones -#endif - -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency - -#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs -#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() void TC2_Handler() -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() void TC4_Handler() -#endif -#ifndef HAL_TONE_TIMER_ISR - #define HAL_TONE_TIMER_ISR() void TC6_Handler() -#endif - -// ------------------------ -// Types -// ------------------------ - -typedef struct { - Tc *pTimerRegs; - uint16_t channel; - IRQn_Type IRQ_Id; - uint8_t priority; -} tTimerConfig; - -// ------------------------ -// Public Variables -// ------------------------ - -extern const tTimerConfig TimerConfig[]; - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); - -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { - const tTimerConfig * const pConfig = &TimerConfig[timer_num]; - pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = compare; -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - const tTimerConfig * const pConfig = &TimerConfig[timer_num]; - return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC; -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - const tTimerConfig * const pConfig = &TimerConfig[timer_num]; - return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV; -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { - const tTimerConfig * const pConfig = &TimerConfig[timer_num]; - // Reading the status register clears the interrupt flag - pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR; -} - -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/DUE/upload_extra_script.py b/Marlin/src/HAL/DUE/upload_extra_script.py deleted file mode 100644 index d52a0a3642..0000000000 --- a/Marlin/src/HAL/DUE/upload_extra_script.py +++ /dev/null @@ -1,18 +0,0 @@ -# -# Set upload_command -# -# Windows: bossac.exe -# Other: leave unchanged -# - -import platform -current_OS = platform.system() - -if current_OS == 'Windows': - - Import("env") - - # Use bossac.exe on Windows - env.Replace( - UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE" - ) diff --git a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp deleted file mode 100644 index ea2936359d..0000000000 --- a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/** - * Interface from Atmel USB MSD to Marlin SD card - */ - -#ifdef ARDUINO_ARCH_SAM - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../../../sd/cardreader.h" -extern "C" { -#include "sd_mmc_spi_mem.h" -} - -#define SD_MMC_BLOCK_SIZE 512 - -void sd_mmc_spi_mem_init() { -} - -Ctrl_status sd_mmc_spi_test_unit_ready() { - #ifdef DISABLE_DUE_SD_MMC - return CTRL_NO_PRESENT; - #endif - if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) - return CTRL_NO_PRESENT; - return CTRL_GOOD; -} - -// NOTE: This function is defined as returning the address of the last block -// in the card, which is cardSize() - 1 -Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) { - if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) - return CTRL_NO_PRESENT; - *nb_sector = card.getSd2Card().cardSize() - 1; - return CTRL_GOOD; -} - -bool sd_mmc_spi_unload(bool) { return true; } - -bool sd_mmc_spi_wr_protect() { return false; } - -bool sd_mmc_spi_removal() { - return (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()); -} - -#if ACCESS_USB == true -/** - * \name MEM <-> USB Interface - * @{ - */ - -#include "udi_msc.h" - -COMPILER_WORD_ALIGNED -uint8_t sector_buf[SD_MMC_BLOCK_SIZE]; - -// #define DEBUG_MMC - -Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) { - #ifdef DISABLE_DUE_SD_MMC - return CTRL_NO_PRESENT; - #endif - if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) - return CTRL_NO_PRESENT; - - #ifdef DEBUG_MMC - { - char buffer[80]; - sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr); - PORT_REDIRECT(0); - SERIAL_ECHO(buffer); - } - #endif - - // Start reading - if (!card.getSd2Card().readStart(addr)) - return CTRL_FAIL; - - // For each specified sector - while (nb_sector--) { - - // Read a sector - card.getSd2Card().readData(sector_buf); - - // RAM -> USB - if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { - card.getSd2Card().readStop(); - return CTRL_FAIL; - } - } - - // Stop reading - card.getSd2Card().readStop(); - - // Done - return CTRL_GOOD; -} - -Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) { - #ifdef DISABLE_DUE_SD_MMC - return CTRL_NO_PRESENT; - #endif - if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) - return CTRL_NO_PRESENT; - - #ifdef DEBUG_MMC - { - char buffer[80]; - sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr); - PORT_REDIRECT(0); - SERIAL_ECHO(buffer); - } - #endif - - if (!card.getSd2Card().writeStart(addr, nb_sector)) - return CTRL_FAIL; - - // For each specified sector - while (nb_sector--) { - - // USB -> RAM - if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { - card.getSd2Card().writeStop(); - return CTRL_FAIL; - } - - // Write a sector - card.getSd2Card().writeData(sector_buf); - } - - // Stop writing - card.getSd2Card().writeStop(); - - // Done - return CTRL_GOOD; -} - -#endif // ACCESS_USB == true - -#endif // SDSUPPORT -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/watchdog.cpp b/Marlin/src/HAL/DUE/watchdog.cpp deleted file mode 100644 index 0f46971830..0000000000 --- a/Marlin/src/HAL/DUE/watchdog.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_SAM - -#include "../../inc/MarlinConfig.h" -#include "../../MarlinCore.h" -#include "watchdog.h" - -// Override Arduino runtime to either config or disable the watchdog -// -// We need to configure the watchdog as soon as possible in the boot -// process, because watchdog initialization at hardware reset on SAM3X8E -// is unreliable, and there is risk of unintended resets if we delay -// that initialization to a later time. -void watchdogSetup() { - - #if ENABLED(USE_WATCHDOG) - - // 4 seconds timeout - uint32_t timeout = 4000; - - // Calculate timeout value in WDT counter ticks: This assumes - // the slow clock is running at 32.768 kHz watchdog - // frequency is therefore 32768 / 128 = 256 Hz - timeout = (timeout << 8) / 1000; - if (timeout == 0) - timeout = 1; - else if (timeout > 0xFFF) - timeout = 0xFFF; - - // We want to enable the watchdog with the specified timeout - uint32_t value = - WDT_MR_WDV(timeout) | // With the specified timeout - WDT_MR_WDD(timeout) | // and no invalid write window - #if !(SAMV70 || SAMV71 || SAME70 || SAMS70) - WDT_MR_WDRPROC | // WDT fault resets processor only - We want - // to keep PIO controller state - #endif - WDT_MR_WDDBGHLT | // WDT stops in debug state. - WDT_MR_WDIDLEHLT; // WDT stops in idle state. - - #if ENABLED(WATCHDOG_RESET_MANUAL) - // We enable the watchdog timer, but only for the interrupt. - - // Configure WDT to only trigger an interrupt - value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt. - - // Disable WDT interrupt (just in case, to avoid triggering it!) - NVIC_DisableIRQ(WDT_IRQn); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); - - // Initialize WDT with the given parameters - WDT_Enable(WDT, value); - - // Configure and enable WDT interrupt. - NVIC_ClearPendingIRQ(WDT_IRQn); - NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups - NVIC_EnableIRQ(WDT_IRQn); - - #else - - // a WDT fault triggers a reset - value |= WDT_MR_WDRSTEN; - - // Initialize WDT with the given parameters - WDT_Enable(WDT, value); - - #endif - - // Reset the watchdog - WDT_Restart(WDT); - - #else - - // Make sure to completely disable the Watchdog - WDT_Disable(WDT); - - #endif -} - -#if ENABLED(USE_WATCHDOG) - // Initialize watchdog - On SAM3X, Watchdog was already configured - // and enabled or disabled at startup, so no need to reconfigure it - // here. - void watchdog_init() { - // Reset watchdog to start clean - WDT_Restart(WDT); - } -#endif // USE_WATCHDOG - -#endif diff --git a/Marlin/src/HAL/DUE/watchdog.h b/Marlin/src/HAL/DUE/watchdog.h deleted file mode 100644 index 5725a10007..0000000000 --- a/Marlin/src/HAL/DUE/watchdog.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// Arduino Due core now has watchdog support - -#include "HAL.h" - -// Initialize watchdog with a 4 second interrupt time -void watchdog_init(); - -// Reset watchdog. MUST be called at least every 4 seconds after the -// first watchdog_init or AVR will go into emergency procedures. -inline void HAL_watchdog_refresh() { watchdogReset(); } diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp deleted file mode 100644 index d4b2f42c53..0000000000 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "FlushableHardwareSerial.h" - -#ifdef ARDUINO_ARCH_ESP32 - -FlushableHardwareSerial::FlushableHardwareSerial(int uart_nr) - : HardwareSerial(uart_nr) -{} - -FlushableHardwareSerial flushableSerial(0); - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h deleted file mode 100644 index b43caea13c..0000000000 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef ARDUINO_ARCH_ESP32 - -#include - -class FlushableHardwareSerial : public HardwareSerial { -public: - FlushableHardwareSerial(int uart_nr); - - inline void flushTX() { /* No need to flush the hardware serial, but defined here for compatibility. */ } -}; - -extern FlushableHardwareSerial flushableSerial; - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp deleted file mode 100644 index 1e00df5177..0000000000 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ /dev/null @@ -1,274 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../inc/MarlinConfig.h" - -#include -#include -#include -#include - -#if ENABLED(WIFISUPPORT) - #include - #include "wifi.h" - #if ENABLED(OTASUPPORT) - #include "ota.h" - #endif - #if ENABLED(WEBSUPPORT) - #include "spiffs.h" - #include "web.h" - #endif -#endif - -// ------------------------ -// Externs -// ------------------------ - -portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED; - -// ------------------------ -// Local defines -// ------------------------ - -#define V_REF 1100 - -// ------------------------ -// Public Variables -// ------------------------ - -uint16_t HAL_adc_result; - -// ------------------------ -// Private Variables -// ------------------------ - -esp_adc_cal_characteristics_t characteristics[ADC_ATTEN_MAX]; -adc_atten_t attenuations[ADC1_CHANNEL_MAX] = {}; -uint32_t thresholds[ADC_ATTEN_MAX]; -volatile int numPWMUsed = 0, - pwmPins[MAX_PWM_PINS], - pwmValues[MAX_PWM_PINS]; - -// ------------------------ -// Public functions -// ------------------------ - -#if ENABLED(WIFI_CUSTOM_COMMAND) - - bool wifi_custom_command(char * const command_ptr) { - #if ENABLED(ESP3D_WIFISUPPORT) - return esp3dlib.parse(command_ptr); - #else - UNUSED(command_ptr); - return false; - #endif - } - -#endif - -void HAL_init() { i2s_init(); } - -void HAL_init_board() { - - #if ENABLED(ESP3D_WIFISUPPORT) - esp3dlib.init(); - #elif ENABLED(WIFISUPPORT) - wifi_init(); - TERN_(OTASUPPORT, OTA_init()); - #if ENABLED(WEBSUPPORT) - spiffs_init(); - web_init(); - #endif - server.begin(); - #endif - - // ESP32 uses a GPIO matrix that allows pins to be assigned to hardware serial ports. - // The following code initializes hardware Serial1 and Serial2 to use user-defined pins - // if they have been defined. - #if defined(HARDWARE_SERIAL1_RX) && defined(HARDWARE_SERIAL1_TX) - HardwareSerial Serial1(1); - #ifdef TMC_BAUD_RATE // use TMC_BAUD_RATE for Serial1 if defined - Serial1.begin(TMC_BAUD_RATE, SERIAL_8N1, HARDWARE_SERIAL1_RX, HARDWARE_SERIAL1_TX); - #else // use default BAUDRATE if TMC_BAUD_RATE not defined - Serial1.begin(BAUDRATE, SERIAL_8N1, HARDWARE_SERIAL1_RX, HARDWARE_SERIAL1_TX); - #endif - #endif - #if defined(HARDWARE_SERIAL2_RX) && defined(HARDWARE_SERIAL2_TX) - HardwareSerial Serial2(2); - #ifdef TMC_BAUD_RATE // use TMC_BAUD_RATE for Serial1 if defined - Serial2.begin(TMC_BAUD_RATE, SERIAL_8N1, HARDWARE_SERIAL2_RX, HARDWARE_SERIAL2_TX); - #else // use default BAUDRATE if TMC_BAUD_RATE not defined - Serial2.begin(BAUDRATE, SERIAL_8N1, HARDWARE_SERIAL2_RX, HARDWARE_SERIAL2_TX); - #endif - #endif - -} - -void HAL_idletask() { - #if BOTH(WIFISUPPORT, OTASUPPORT) - OTA_handle(); - #endif - TERN_(ESP3D_WIFISUPPORT, esp3dlib.idletask()); -} - -void HAL_clear_reset_source() { } - -uint8_t HAL_get_reset_source() { return rtc_get_reset_reason(1); } - -void _delay_ms(int delay_ms) { delay(delay_ms); } - -// return free memory between end of heap (or end bss) and whatever is current -int freeMemory() { return ESP.getFreeHeap(); } - -// ------------------------ -// ADC -// ------------------------ -#define ADC1_CHANNEL(pin) ADC1_GPIO ## pin ## _CHANNEL - -adc1_channel_t get_channel(int pin) { - switch (pin) { - case 39: return ADC1_CHANNEL(39); - case 36: return ADC1_CHANNEL(36); - case 35: return ADC1_CHANNEL(35); - case 34: return ADC1_CHANNEL(34); - case 33: return ADC1_CHANNEL(33); - case 32: return ADC1_CHANNEL(32); - } - return ADC1_CHANNEL_MAX; -} - -void adc1_set_attenuation(adc1_channel_t chan, adc_atten_t atten) { - if (attenuations[chan] != atten) { - adc1_config_channel_atten(chan, atten); - attenuations[chan] = atten; - } -} - -void HAL_adc_init() { - // Configure ADC - adc1_config_width(ADC_WIDTH_12Bit); - - // Configure channels only if used as (re-)configuring a pin for ADC that is used elsewhere might have adverse effects - TERN_(HAS_TEMP_ADC_0, adc1_set_attenuation(get_channel(TEMP_0_PIN), ADC_ATTEN_11db)); - TERN_(HAS_TEMP_ADC_1, adc1_set_attenuation(get_channel(TEMP_1_PIN), ADC_ATTEN_11db)); - TERN_(HAS_TEMP_ADC_2, adc1_set_attenuation(get_channel(TEMP_2_PIN), ADC_ATTEN_11db)); - TERN_(HAS_TEMP_ADC_3, adc1_set_attenuation(get_channel(TEMP_3_PIN), ADC_ATTEN_11db)); - TERN_(HAS_TEMP_ADC_4, adc1_set_attenuation(get_channel(TEMP_4_PIN), ADC_ATTEN_11db)); - TERN_(HAS_TEMP_ADC_5, adc1_set_attenuation(get_channel(TEMP_5_PIN), ADC_ATTEN_11db)); - TERN_(HAS_TEMP_ADC_6, adc2_set_attenuation(get_channel(TEMP_6_PIN), ADC_ATTEN_11db)); - TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db)); - TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db)); - TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db)); - TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db)); - - // Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail. - // That's why we're not setting it up here. - - // Calculate ADC characteristics (i.e., gain and offset factors for each attenuation level) - for (int i = 0; i < ADC_ATTEN_MAX; i++) { - esp_adc_cal_characterize(ADC_UNIT_1, (adc_atten_t)i, ADC_WIDTH_BIT_12, V_REF, &characteristics[i]); - - // Change attenuation 100mV below the calibrated threshold - thresholds[i] = esp_adc_cal_raw_to_voltage(4095, &characteristics[i]); - } -} - -void HAL_adc_start_conversion(const uint8_t adc_pin) { - const adc1_channel_t chan = get_channel(adc_pin); - uint32_t mv; - esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv); - HAL_adc_result = mv * 1023.0 / 3300.0; - - // Change the attenuation level based on the new reading - adc_atten_t atten; - if (mv < thresholds[ADC_ATTEN_DB_0] - 100) - atten = ADC_ATTEN_DB_0; - else if (mv > thresholds[ADC_ATTEN_DB_0] - 50 && mv < thresholds[ADC_ATTEN_DB_2_5] - 100) - atten = ADC_ATTEN_DB_2_5; - else if (mv > thresholds[ADC_ATTEN_DB_2_5] - 50 && mv < thresholds[ADC_ATTEN_DB_6] - 100) - atten = ADC_ATTEN_DB_6; - else if (mv > thresholds[ADC_ATTEN_DB_6] - 50) - atten = ADC_ATTEN_DB_11; - else return; - - adc1_set_attenuation(chan, atten); -} - -void analogWrite(pin_t pin, int value) { - // Use ledc hardware for internal pins - if (pin < 34) { - static int cnt_channel = 1, pin_to_channel[40] = { 0 }; - if (pin_to_channel[pin] == 0) { - ledcAttachPin(pin, cnt_channel); - ledcSetup(cnt_channel, 490, 8); - ledcWrite(cnt_channel, value); - pin_to_channel[pin] = cnt_channel++; - } - ledcWrite(pin_to_channel[pin], value); - return; - } - - int idx = -1; - - // Search Pin - for (int i = 0; i < numPWMUsed; ++i) - if (pwmPins[i] == pin) { idx = i; break; } - - // not found ? - if (idx < 0) { - // No slots remaining - if (numPWMUsed >= MAX_PWM_PINS) return; - - // Take new slot for pin - idx = numPWMUsed; - pwmPins[idx] = pin; - // Start timer on first use - if (idx == 0) HAL_timer_start(PWM_TIMER_NUM, PWM_TIMER_FREQUENCY); - - ++numPWMUsed; - } - - // Use 7bit internal value - add 1 to have 100% high at 255 - pwmValues[idx] = (value + 1) / 2; -} - -// Handle PWM timer interrupt -HAL_PWM_TIMER_ISR() { - HAL_timer_isr_prologue(PWM_TIMER_NUM); - - static uint8_t count = 0; - - for (int i = 0; i < numPWMUsed; ++i) { - if (count == 0) // Start of interval - WRITE(pwmPins[i], pwmValues[i] ? HIGH : LOW); - else if (pwmValues[i] == count) // End of duration - WRITE(pwmPins[i], LOW); - } - - // 128 for 7 Bit resolution - count = (count + 1) & 0x7F; - - HAL_timer_isr_epilogue(PWM_TIMER_NUM); -} - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h deleted file mode 100644 index ebc16c9525..0000000000 --- a/Marlin/src/HAL/ESP32/HAL.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL for Espressif ESP32 WiFi - */ - -#define CPU_32_BIT - -#include - -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" - -#include "fastio.h" -#include "watchdog.h" -#include "i2s.h" - -#if ENABLED(WIFISUPPORT) - #include "WebSocketSerial.h" -#endif - -#if ENABLED(ESP3D_WIFISUPPORT) - #include "esp3dlib.h" -#endif - -#include "FlushableHardwareSerial.h" - -// ------------------------ -// Defines -// ------------------------ - -extern portMUX_TYPE spinlock; - -#define MYSERIAL0 flushableSerial - -#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) - #if ENABLED(ESP3D_WIFISUPPORT) - #define MYSERIAL1 Serial2Socket - #else - #define MYSERIAL1 webSocketSerial - #endif -#endif - -#define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock) -#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&spinlock) -#define ISRS_ENABLED() (spinlock.owner == portMUX_FREE_VAL) -#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock) -#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock) - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*(addr)) - -// ------------------------ -// Types -// ------------------------ - -typedef int16_t pin_t; - -#define HAL_SERVO_LIB Servo - -// ------------------------ -// Public Variables -// ------------------------ - -/** result of last ADC conversion */ -extern uint16_t HAL_adc_result; - -// ------------------------ -// Public functions -// ------------------------ - -// clear reset reason -void HAL_clear_reset_source(); - -// reset reason -uint8_t HAL_get_reset_source(); - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -void _delay_ms(int delay); - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -int freeMemory(); -#pragma GCC diagnostic pop - -void analogWrite(pin_t pin, int value); - -// ADC -#define HAL_ANALOG_SELECT(pin) - -void HAL_adc_init(); - -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 -#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) -#define HAL_READ_ADC() HAL_adc_result -#define HAL_ADC_READY() true - -void HAL_adc_start_conversion(const uint8_t adc_pin); - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -// Enable hooks into idle and setup for HAL -#define HAL_IDLETASK 1 -#define BOARD_INIT() HAL_init_board(); -void HAL_idletask(); -void HAL_init(); -void HAL_init_board(); - -// -// Delay in cycles (used by DELAY_NS / DELAY_US) -// -FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { - unsigned long start, ccount, stop; - - /** - * It's important to care for race conditions (and overflows) here. - * Race condition example: If `stop` calculates to being close to the upper boundary of - * `uint32_t` and if at the same time a longer loop interruption kicks in (e.g. due to other - * FreeRTOS tasks or interrupts), `ccount` might overflow (and therefore be below `stop` again) - * without the loop ever being able to notice that `ccount` had already been above `stop` once - * (and that therefore the number of cycles to delay has already passed). - * As DELAY_CYCLES (through DELAY_NS / DELAY_US) is used by software SPI bit banging to drive - * LCDs and therefore might be called very, very often, this seemingly improbable situation did - * actually happen in reality. It resulted in apparently random print pauses of ~17.9 seconds - * (0x100000000 / 240 MHz) or multiples thereof, essentially ruining the current print by causing - * large blobs of filament. - */ - - __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (start) ); - stop = start + x; - ccount = start; - - if (stop >= start) { - // no overflow, so only loop while in between start and stop: - // 0x00000000 -----------------start****stop-- 0xFFFFFFFF - while (ccount >= start && ccount < stop) { - __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); - } - } - else { - // stop did overflow, so only loop while outside of stop and start: - // 0x00000000 **stop-------------------start** 0xFFFFFFFF - while (ccount >= start || ccount < stop) { - __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); - } - } - -} diff --git a/Marlin/src/HAL/ESP32/HAL_SPI.cpp b/Marlin/src/HAL/ESP32/HAL_SPI.cpp deleted file mode 100644 index 8e5875fc38..0000000000 --- a/Marlin/src/HAL/ESP32/HAL_SPI.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../inc/MarlinConfig.h" - -#include "../shared/HAL_SPI.h" - -#include -#include - -// ------------------------ -// Public Variables -// ------------------------ - -static SPISettings spiConfig; - -// ------------------------ -// Public functions -// ------------------------ - -#if ENABLED(SOFTWARE_SPI) - - // ------------------------ - // Software SPI - // ------------------------ - #error "Software SPI not supported for ESP32. Use Hardware SPI." - -#else - -// ------------------------ -// Hardware SPI -// ------------------------ - -void spiBegin() { - #if !PIN_EXISTS(SS) - #error "SS_PIN not defined!" - #endif - - OUT_WRITE(SS_PIN, HIGH); -} - -void spiInit(uint8_t spiRate) { - uint32_t clock; - - switch (spiRate) { - case SPI_FULL_SPEED: clock = 16000000; break; - case SPI_HALF_SPEED: clock = 8000000; break; - case SPI_QUARTER_SPEED: clock = 4000000; break; - case SPI_EIGHTH_SPEED: clock = 2000000; break; - case SPI_SIXTEENTH_SPEED: clock = 1000000; break; - case SPI_SPEED_5: clock = 500000; break; - case SPI_SPEED_6: clock = 250000; break; - default: clock = 1000000; // Default from the SPI library - } - - spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); - SPI.begin(); -} - -uint8_t spiRec() { - SPI.beginTransaction(spiConfig); - uint8_t returnByte = SPI.transfer(0xFF); - SPI.endTransaction(); - return returnByte; -} - -void spiRead(uint8_t* buf, uint16_t nbyte) { - SPI.beginTransaction(spiConfig); - SPI.transferBytes(0, buf, nbyte); - SPI.endTransaction(); -} - -void spiSend(uint8_t b) { - SPI.beginTransaction(spiConfig); - SPI.transfer(b); - SPI.endTransaction(); -} - -void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPI.beginTransaction(spiConfig); - SPI.transfer(token); - SPI.writeBytes(const_cast(buf), 512); - SPI.endTransaction(); -} - -void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - spiConfig = SPISettings(spiClock, bitOrder, dataMode); - - SPI.beginTransaction(spiConfig); -} - -#endif // !SOFTWARE_SPI - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/Servo.cpp b/Marlin/src/HAL/ESP32/Servo.cpp deleted file mode 100644 index fcf5848581..0000000000 --- a/Marlin/src/HAL/ESP32/Servo.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include "Servo.h" - -// Adjacent channels (0/1, 2/3 etc.) share the same timer and therefore the same frequency and resolution settings on ESP32, -// so we only allocate servo channels up high to avoid side effects with regards to analogWrite (fans, leds, laser pwm etc.) -int Servo::channel_next_free = 12; - -Servo::Servo() { - channel = channel_next_free++; -} - -int8_t Servo::attach(const int inPin) { - if (channel >= CHANNEL_MAX_NUM) return -1; - if (inPin > 0) pin = inPin; - - ledcSetup(channel, 50, 16); // channel X, 50 Hz, 16-bit depth - ledcAttachPin(pin, channel); - return true; -} - -void Servo::detach() { ledcDetachPin(pin); } - -int Servo::read() { return degrees; } - -void Servo::write(int inDegrees) { - degrees = constrain(inDegrees, MIN_ANGLE, MAX_ANGLE); - int us = map(degrees, MIN_ANGLE, MAX_ANGLE, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); - int duty = map(us, 0, TAU_USEC, 0, MAX_COMPARE); - ledcWrite(channel, duty); -} - -void Servo::move(const int value) { - constexpr uint16_t servo_delay[] = SERVO_DELAY; - static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - if (attach(0) >= 0) { - write(value); - safe_delay(servo_delay[channel]); - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); - } -} -#endif // HAS_SERVOS - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/Servo.h b/Marlin/src/HAL/ESP32/Servo.h deleted file mode 100644 index b0d9294527..0000000000 --- a/Marlin/src/HAL/ESP32/Servo.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -class Servo { - static const int MIN_ANGLE = 0, - MAX_ANGLE = 180, - MIN_PULSE_WIDTH = 544, // Shortest pulse sent to a servo - MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo - TAU_MSEC = 20, - TAU_USEC = (TAU_MSEC * 1000), - MAX_COMPARE = ((1 << 16) - 1), // 65535 - CHANNEL_MAX_NUM = 16; - -public: - Servo(); - int8_t attach(const int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) - void detach(); - void write(int degrees); // set angle - void move(const int degrees); // attach the servo, then move to value - int read(); // returns current pulse width as an angle between 0 and 180 degrees - -private: - static int channel_next_free; - int channel; - int pin; - int degrees; -}; diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp deleted file mode 100644 index ca7f47a1f8..0000000000 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(WIFISUPPORT) - -#include "WebSocketSerial.h" -#include "wifi.h" -#include - -WebSocketSerial webSocketSerial; -AsyncWebSocket ws("/ws"); // TODO Move inside the class. - -// RingBuffer impl - -#define NEXT_INDEX(I, SIZE) ((I + 1) & (ring_buffer_pos_t)(SIZE - 1)) - -RingBuffer::RingBuffer(ring_buffer_pos_t size) - : data(new uint8_t[size]), - size(size), - read_index(0), - write_index(0) -{} - -RingBuffer::~RingBuffer() { delete[] data; } - -ring_buffer_pos_t RingBuffer::write(const uint8_t c) { - const ring_buffer_pos_t n = NEXT_INDEX(write_index, size); - - if (n != read_index) { - this->data[write_index] = c; - write_index = n; - return 1; - } - - // TODO: buffer is full, handle? - return 0; -} - -ring_buffer_pos_t RingBuffer::write(const uint8_t *buffer, ring_buffer_pos_t size) { - ring_buffer_pos_t written = 0; - for (ring_buffer_pos_t i = 0; i < size; i++) { - written += write(buffer[i]); - } - return written; -} - -int RingBuffer::available() { - return (size - read_index + write_index) & (size - 1); -} - -int RingBuffer::peek() { - return available() ? data[read_index] : -1; -} - -int RingBuffer::read() { - if (available()) { - const int ret = data[read_index]; - read_index = NEXT_INDEX(read_index, size); - return ret; - } - return -1; -} - -ring_buffer_pos_t RingBuffer::read(uint8_t *buffer) { - ring_buffer_pos_t len = available(); - - for (ring_buffer_pos_t i = 0; read_index != write_index; i++) { - buffer[i] = data[read_index]; - read_index = NEXT_INDEX(read_index, size); - } - - return len; -} - -void RingBuffer::flush() { read_index = write_index; } - -// WebSocketSerial impl -WebSocketSerial::WebSocketSerial() - : rx_buffer(RingBuffer(RX_BUFFER_SIZE)), - tx_buffer(RingBuffer(TX_BUFFER_SIZE)) -{} - -void WebSocketSerial::begin(const long baud_setting) { - ws.onEvent([this](AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { - switch (type) { - case WS_EVT_CONNECT: client->ping(); break; // client connected - case WS_EVT_DISCONNECT: // client disconnected - case WS_EVT_ERROR: // error was received from the other end - case WS_EVT_PONG: break; // pong message was received (in response to a ping request maybe) - case WS_EVT_DATA: { // data packet - AwsFrameInfo * info = (AwsFrameInfo*)arg; - if (info->opcode == WS_TEXT || info->message_opcode == WS_TEXT) - this->rx_buffer.write(data, len); - } - } - }); - server.addHandler(&ws); -} - -void WebSocketSerial::end() { } -int WebSocketSerial::peek() { return rx_buffer.peek(); } -int WebSocketSerial::read() { return rx_buffer.read(); } -int WebSocketSerial::available() { return rx_buffer.available(); } -void WebSocketSerial::flush() { rx_buffer.flush(); } - -size_t WebSocketSerial::write(const uint8_t c) { - size_t ret = tx_buffer.write(c); - - if (ret && c == '\n') { - uint8_t tmp[TX_BUFFER_SIZE]; - ring_buffer_pos_t size = tx_buffer.read(tmp); - ws.textAll(tmp, size); - } - - return ret; -} - -size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) { - size_t written = 0; - for (size_t i = 0; i < size; i++) - written += write(buffer[i]); - return written; -} - -void WebSocketSerial::flushTX() { - // No need to do anything as there's no benefit to sending partial lines over the websocket connection. -} - -#endif // WIFISUPPORT -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.h b/Marlin/src/HAL/ESP32/WebSocketSerial.h deleted file mode 100644 index 7a25c6dc5e..0000000000 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfig.h" - -#include - -#ifndef TX_BUFFER_SIZE - #define TX_BUFFER_SIZE 32 -#endif -#if ENABLED(WIFISUPPORT) - #ifndef RX_BUFFER_SIZE - #define RX_BUFFER_SIZE 128 - #endif - #if TX_BUFFER_SIZE <= 0 - #error "TX_BUFFER_SIZE is required for the WebSocket." - #endif -#endif - -typedef uint16_t ring_buffer_pos_t; - -class RingBuffer { - uint8_t *data; - ring_buffer_pos_t size, read_index, write_index; - -public: - RingBuffer(ring_buffer_pos_t size); - ~RingBuffer(); - - int available(); - int peek(); - int read(); - ring_buffer_pos_t read(uint8_t *buffer); - void flush(); - ring_buffer_pos_t write(const uint8_t c); - ring_buffer_pos_t write(const uint8_t* buffer, ring_buffer_pos_t size); -}; - -class WebSocketSerial: public Stream { - RingBuffer rx_buffer; - RingBuffer tx_buffer; - -public: - WebSocketSerial(); - void begin(const long); - void end(); - int available(); - int peek(); - int read(); - void flush(); - void flushTX(); - size_t write(const uint8_t c); - size_t write(const uint8_t* buffer, size_t size); - - operator bool() { return true; } - - #if ENABLED(SERIAL_STATS_DROPPED_RX) - FORCE_INLINE uint32_t dropped() { return 0; } - #endif - - #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - FORCE_INLINE int rxMaxEnqueued() { return 0; } - #endif -}; - -extern WebSocketSerial webSocketSerial; diff --git a/Marlin/src/HAL/ESP32/eeprom.cpp b/Marlin/src/HAL/ESP32/eeprom.cpp deleted file mode 100644 index 1bf687c6fe..0000000000 --- a/Marlin/src/HAL/ESP32/eeprom.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(EEPROM_SETTINGS) - -#include "../shared/eeprom_api.h" -#include - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { return EEPROM.begin(MARLIN_EEPROM_SIZE); } -bool PersistentStore::access_finish() { EEPROM.end(); return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - for (size_t i = 0; i < size; i++) { - EEPROM.write(pos++, value[i]); - crc16(crc, &value[i], 1); - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - for (size_t i = 0; i < size; i++) { - uint8_t c = EEPROM.read(pos++); - if (writing) value[i] = c; - crc16(crc, &c, 1); - } - return false; -} - -#endif // EEPROM_SETTINGS -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/endstop_interrupts.h b/Marlin/src/HAL/ESP32/endstop_interrupts.h deleted file mode 100644 index 743ccd99c9..0000000000 --- a/Marlin/src/HAL/ESP32/endstop_interrupts.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Endstop Interrupts - * - * Without endstop interrupts the endstop pins must be polled continually in - * the stepper-ISR via endstops.update(), most of the time finding no change. - * With this feature endstops.update() is called only when we know that at - * least one endstop has changed state, saving valuable CPU cycles. - * - * This feature only works when all used endstop pins can generate an 'external interrupt'. - * - * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. - * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) - */ - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void ICACHE_RAM_ATTR endstop_ISR() { endstops.update(); } - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); -} diff --git a/Marlin/src/HAL/ESP32/fastio.h b/Marlin/src/HAL/ESP32/fastio.h deleted file mode 100644 index 2ded3a5f62..0000000000 --- a/Marlin/src/HAL/ESP32/fastio.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "i2s.h" - -/** - * Utility functions - */ - -// I2S expander pin mapping. -#define IS_I2S_EXPANDER_PIN(IO) TEST(IO, 7) -#define I2S_EXPANDER_PIN_INDEX(IO) (IO & 0x7F) - -// Set pin as input -#define _SET_INPUT(IO) pinMode(IO, INPUT) - -// Set pin as output -#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) - -// Set pin as input with pullup mode -#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT) - -// Read a pin wrapper -#define READ(IO) (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO)) - -// Write to a pin wrapper -#define WRITE(IO, v) (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v)) - -// Set pin as input wrapper -#define SET_INPUT(IO) _SET_INPUT(IO) - -// Set pin as input with pullup wrapper -#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) - -// Set pin as output wrapper -#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0) - -// Set pin as PWM -#define SET_PWM SET_OUTPUT - -// Set pin as output and init -#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) - -// PWM outputs -#define PWM_PIN(P) (P < 34 || P > 127) // NOTE Pins >= 34 are input only on ESP32, so they can't be used for output. - -// Toggle pin value -#define TOGGLE(IO) WRITE(IO, !READ(IO)) - -// -// Ports and functions -// - -// UART -#define RXD 3 -#define TXD 1 - -// TWI (I2C) -#define SCL 5 -#define SDA 4 diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp deleted file mode 100644 index 99b2f755e5..0000000000 --- a/Marlin/src/HAL/ESP32/i2s.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../inc/MarlinConfigPre.h" - -#include "i2s.h" - -#include "../shared/Marduino.h" -#include -#include -#include -#include -#include "../../module/stepper.h" - -#define DMA_BUF_COUNT 8 // number of DMA buffers to store data -#define DMA_BUF_LEN 4092 // maximum size in bytes -#define I2S_SAMPLE_SIZE 4 // 4 bytes, 32 bits per sample -#define DMA_SAMPLE_COUNT DMA_BUF_LEN / I2S_SAMPLE_SIZE // number of samples per buffer - -typedef enum { - I2S_NUM_0 = 0x0, /*!< I2S 0*/ - I2S_NUM_1 = 0x1, /*!< I2S 1*/ - I2S_NUM_MAX, -} i2s_port_t; - -typedef struct { - uint32_t **buffers; - uint32_t *current; - uint32_t rw_pos; - lldesc_t **desc; - xQueueHandle queue; -} i2s_dma_t; - -static portMUX_TYPE i2s_spinlock[I2S_NUM_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED}; -static i2s_dev_t* I2S[I2S_NUM_MAX] = {&I2S0, &I2S1}; -static i2s_dma_t dma; - -// output value -uint32_t i2s_port_data = 0; - -#define I2S_ENTER_CRITICAL() portENTER_CRITICAL(&i2s_spinlock[i2s_num]) -#define I2S_EXIT_CRITICAL() portEXIT_CRITICAL(&i2s_spinlock[i2s_num]) - -static inline void gpio_matrix_out_check(uint32_t gpio, uint32_t signal_idx, bool out_inv, bool oen_inv) { - //if pin = -1, do not need to configure - if (gpio != -1) { - PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio], PIN_FUNC_GPIO); - gpio_set_direction((gpio_num_t)gpio, (gpio_mode_t)GPIO_MODE_DEF_OUTPUT); - gpio_matrix_out(gpio, signal_idx, out_inv, oen_inv); - } -} - -static esp_err_t i2s_reset_fifo(i2s_port_t i2s_num) { - I2S_ENTER_CRITICAL(); - I2S[i2s_num]->conf.rx_fifo_reset = 1; - I2S[i2s_num]->conf.rx_fifo_reset = 0; - I2S[i2s_num]->conf.tx_fifo_reset = 1; - I2S[i2s_num]->conf.tx_fifo_reset = 0; - I2S_EXIT_CRITICAL(); - - return ESP_OK; -} - -esp_err_t i2s_start(i2s_port_t i2s_num) { - //start DMA link - I2S_ENTER_CRITICAL(); - i2s_reset_fifo(i2s_num); - - //reset dma - I2S[i2s_num]->lc_conf.in_rst = 1; - I2S[i2s_num]->lc_conf.in_rst = 0; - I2S[i2s_num]->lc_conf.out_rst = 1; - I2S[i2s_num]->lc_conf.out_rst = 0; - - I2S[i2s_num]->conf.tx_reset = 1; - I2S[i2s_num]->conf.tx_reset = 0; - I2S[i2s_num]->conf.rx_reset = 1; - I2S[i2s_num]->conf.rx_reset = 0; - - I2S[i2s_num]->int_clr.val = 0xFFFFFFFF; - I2S[i2s_num]->out_link.start = 1; - I2S[i2s_num]->conf.tx_start = 1; - I2S_EXIT_CRITICAL(); - - return ESP_OK; -} - -esp_err_t i2s_stop(i2s_port_t i2s_num) { - I2S_ENTER_CRITICAL(); - I2S[i2s_num]->out_link.stop = 1; - I2S[i2s_num]->conf.tx_start = 0; - - I2S[i2s_num]->int_clr.val = I2S[i2s_num]->int_st.val; //clear pending interrupt - I2S_EXIT_CRITICAL(); - - return ESP_OK; -} - -static void IRAM_ATTR i2s_intr_handler_default(void *arg) { - int dummy; - lldesc_t *finish_desc; - portBASE_TYPE high_priority_task_awoken = pdFALSE; - - if (I2S0.int_st.out_eof) { - // Get the descriptor of the last item in the linkedlist - finish_desc = (lldesc_t*) I2S0.out_eof_des_addr; - - // If the queue is full it's because we have an underflow, - // more than buf_count isr without new data, remove the front buffer - if (xQueueIsQueueFullFromISR(dma.queue)) - xQueueReceiveFromISR(dma.queue, &dummy, &high_priority_task_awoken); - - xQueueSendFromISR(dma.queue, (void *)(&finish_desc->buf), &high_priority_task_awoken); - } - - if (high_priority_task_awoken == pdTRUE) portYIELD_FROM_ISR(); - - // clear interrupt - I2S0.int_clr.val = I2S0.int_st.val; //clear pending interrupt -} - -void stepperTask(void* parameter) { - uint32_t remaining = 0; - - while (1) { - xQueueReceive(dma.queue, &dma.current, portMAX_DELAY); - dma.rw_pos = 0; - - while (dma.rw_pos < DMA_SAMPLE_COUNT) { - // Fill with the port data post pulse_phase until the next step - if (remaining) { - i2s_push_sample(); - remaining--; - } - else { - Stepper::pulse_phase_isr(); - remaining = Stepper::block_phase_isr(); - } - } - } -} - -int i2s_init() { - periph_module_enable(PERIPH_I2S0_MODULE); - - /** - * Each i2s transfer will take - * fpll = PLL_D2_CLK -- clka_en = 0 - * - * fi2s = fpll / N + b/a -- N = clkm_div_num - * fi2s = 160MHz / 2 - * fi2s = 80MHz - * - * fbclk = fi2s / M -- M = tx_bck_div_num - * fbclk = 80MHz / 2 - * fbclk = 40MHz - * - * fwclk = fbclk / 32 - * - * for fwclk = 250kHz (4µS pulse time) - * N = 10 - * M = 20 - */ - - // Allocate the array of pointers to the buffers - dma.buffers = (uint32_t **)malloc(sizeof(uint32_t*) * DMA_BUF_COUNT); - if (dma.buffers == nullptr) return -1; - - // Allocate each buffer that can be used by the DMA controller - for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) { - dma.buffers[buf_idx] = (uint32_t*) heap_caps_calloc(1, DMA_BUF_LEN, MALLOC_CAP_DMA); - if (dma.buffers[buf_idx] == nullptr) return -1; - } - - // Allocate the array of DMA descriptors - dma.desc = (lldesc_t**) malloc(sizeof(lldesc_t*) * DMA_BUF_COUNT); - if (dma.desc == nullptr) return -1; - - // Allocate each DMA descriptor that will be used by the DMA controller - for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) { - dma.desc[buf_idx] = (lldesc_t*) heap_caps_malloc(sizeof(lldesc_t), MALLOC_CAP_DMA); - if (dma.desc[buf_idx] == nullptr) return -1; - } - - // Initialize - for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) { - dma.desc[buf_idx]->owner = 1; - dma.desc[buf_idx]->eof = 1; // set to 1 will trigger the interrupt - dma.desc[buf_idx]->sosf = 0; - dma.desc[buf_idx]->length = DMA_BUF_LEN; - dma.desc[buf_idx]->size = DMA_BUF_LEN; - dma.desc[buf_idx]->buf = (uint8_t *) dma.buffers[buf_idx]; - dma.desc[buf_idx]->offset = 0; - dma.desc[buf_idx]->empty = (uint32_t)((buf_idx < (DMA_BUF_COUNT - 1)) ? (dma.desc[buf_idx + 1]) : dma.desc[0]); - } - - dma.queue = xQueueCreate(DMA_BUF_COUNT, sizeof(uint32_t *)); - - // Set the first DMA descriptor - I2S0.out_link.addr = (uint32_t)dma.desc[0]; - - // stop i2s - i2s_stop(I2S_NUM_0); - - // configure I2S data port interface. - i2s_reset_fifo(I2S_NUM_0); - - //reset i2s - I2S0.conf.tx_reset = 1; - I2S0.conf.tx_reset = 0; - I2S0.conf.rx_reset = 1; - I2S0.conf.rx_reset = 0; - - //reset dma - I2S0.lc_conf.in_rst = 1; - I2S0.lc_conf.in_rst = 0; - I2S0.lc_conf.out_rst = 1; - I2S0.lc_conf.out_rst = 0; - - //Enable and configure DMA - I2S0.lc_conf.check_owner = 0; - I2S0.lc_conf.out_loop_test = 0; - I2S0.lc_conf.out_auto_wrback = 0; - I2S0.lc_conf.out_data_burst_en = 0; - I2S0.lc_conf.outdscr_burst_en = 0; - I2S0.lc_conf.out_no_restart_clr = 0; - I2S0.lc_conf.indscr_burst_en = 0; - I2S0.lc_conf.out_eof_mode = 1; - - I2S0.conf2.lcd_en = 0; - I2S0.conf2.camera_en = 0; - I2S0.pdm_conf.pcm2pdm_conv_en = 0; - I2S0.pdm_conf.pdm2pcm_conv_en = 0; - - I2S0.fifo_conf.dscr_en = 0; - - I2S0.conf_chan.tx_chan_mod = ( - #if ENABLED(I2S_STEPPER_SPLIT_STREAM) - 4 - #else - 0 - #endif - ); - I2S0.fifo_conf.tx_fifo_mod = 0; - I2S0.conf.tx_mono = 0; - - I2S0.conf_chan.rx_chan_mod = 0; - I2S0.fifo_conf.rx_fifo_mod = 0; - I2S0.conf.rx_mono = 0; - - I2S0.fifo_conf.dscr_en = 1; //connect dma to fifo - - I2S0.conf.tx_start = 0; - I2S0.conf.rx_start = 0; - - I2S0.conf.tx_msb_right = 1; - I2S0.conf.tx_right_first = 1; - - I2S0.conf.tx_slave_mod = 0; // Master - I2S0.fifo_conf.tx_fifo_mod_force_en = 1; - - I2S0.pdm_conf.rx_pdm_en = 0; - I2S0.pdm_conf.tx_pdm_en = 0; - - I2S0.conf.tx_short_sync = 0; - I2S0.conf.rx_short_sync = 0; - I2S0.conf.tx_msb_shift = 0; - I2S0.conf.rx_msb_shift = 0; - - // set clock - I2S0.clkm_conf.clka_en = 0; // Use PLL/2 as reference - I2S0.clkm_conf.clkm_div_num = 10; // minimum value of 2, reset value of 4, max 256 - I2S0.clkm_conf.clkm_div_a = 0; // 0 at reset, what about divide by 0? (not an issue) - I2S0.clkm_conf.clkm_div_b = 0; // 0 at reset - - // fbck = fi2s / tx_bck_div_num - I2S0.sample_rate_conf.tx_bck_div_num = 2; // minimum value of 2 defaults to 6 - - // Enable TX interrupts - I2S0.int_ena.out_eof = 1; - I2S0.int_ena.out_dscr_err = 0; - I2S0.int_ena.out_total_eof = 0; - I2S0.int_ena.out_done = 0; - - // Allocate and Enable the I2S interrupt - intr_handle_t i2s_isr_handle; - esp_intr_alloc(ETS_I2S0_INTR_SOURCE, 0, i2s_intr_handler_default, nullptr, &i2s_isr_handle); - esp_intr_enable(i2s_isr_handle); - - // Create the task that will feed the buffer - xTaskCreatePinnedToCore(stepperTask, "StepperTask", 10000, nullptr, 1, nullptr, CONFIG_ARDUINO_RUNNING_CORE); // run I2S stepper task on same core as rest of Marlin - - // Route the i2s pins to the appropriate GPIO - gpio_matrix_out_check(I2S_DATA, I2S0O_DATA_OUT23_IDX, 0, 0); - gpio_matrix_out_check(I2S_BCK, I2S0O_BCK_OUT_IDX, 0, 0); - gpio_matrix_out_check(I2S_WS, I2S0O_WS_OUT_IDX, 0, 0); - - // Start the I2S peripheral - return i2s_start(I2S_NUM_0); -} - -void i2s_write(uint8_t pin, uint8_t val) { - #if ENABLED(I2S_STEPPER_SPLIT_STREAM) - if (pin >= 16) { - SET_BIT_TO(I2S0.conf_single_data, pin, val); - return; - } - #endif - SET_BIT_TO(i2s_port_data, pin, val); -} - -uint8_t i2s_state(uint8_t pin) { - #if ENABLED(I2S_STEPPER_SPLIT_STREAM) - if (pin >= 16) return TEST(I2S0.conf_single_data, pin); - #endif - return TEST(i2s_port_data, pin); -} - -void i2s_push_sample() { - dma.current[dma.rw_pos++] = i2s_port_data; -} - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/i2s.h b/Marlin/src/HAL/ESP32/i2s.h deleted file mode 100644 index 573b983837..0000000000 --- a/Marlin/src/HAL/ESP32/i2s.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// current value of the outputs provided over i2s -extern uint32_t i2s_port_data; - -int i2s_init(); - -uint8_t i2s_state(uint8_t pin); - -void i2s_write(uint8_t pin, uint8_t val); - -void i2s_push_sample(); diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h b/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h deleted file mode 100644 index 4da600179d..0000000000 --- a/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/ESP32." -#endif diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h b/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_post.h b/Marlin/src/HAL/ESP32/inc/Conditionals_post.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/ESP32/inc/Conditionals_post.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/ESP32/inc/SanityCheck.h b/Marlin/src/HAL/ESP32/inc/SanityCheck.h deleted file mode 100644 index f57a6c5910..0000000000 --- a/Marlin/src/HAL/ESP32/inc/SanityCheck.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if ENABLED(EMERGENCY_PARSER) - #error "EMERGENCY_PARSER is not yet implemented for ESP32. Disable EMERGENCY_PARSER to continue." -#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on ESP32." -#endif - -#if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." -#endif - -#if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT) - #error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT." -#endif diff --git a/Marlin/src/HAL/ESP32/spi_pins.h b/Marlin/src/HAL/ESP32/spi_pins.h deleted file mode 100644 index 15f8f2ab6b..0000000000 --- a/Marlin/src/HAL/ESP32/spi_pins.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define SS_PIN SDSS -#define SCK_PIN 18 -#define MISO_PIN 19 -#define MOSI_PIN 23 diff --git a/Marlin/src/HAL/ESP32/spiffs.cpp b/Marlin/src/HAL/ESP32/spiffs.cpp deleted file mode 100644 index a0e713bff0..0000000000 --- a/Marlin/src/HAL/ESP32/spiffs.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(WIFISUPPORT, WEBSUPPORT) - -#include "../../core/serial.h" - -#include -#include - -bool spiffs_initialized; - -void spiffs_init() { - if (SPIFFS.begin(true)) // formatOnFail = true - spiffs_initialized = true; - else - SERIAL_ERROR_MSG("SPIFFS mount failed"); -} - -#endif // WIFISUPPORT && WEBSUPPORT -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/spiffs.h b/Marlin/src/HAL/ESP32/spiffs.h deleted file mode 100644 index 64ec7dd11e..0000000000 --- a/Marlin/src/HAL/ESP32/spiffs.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -extern bool spiffs_initialized; - -void spiffs_init(); diff --git a/Marlin/src/HAL/ESP32/timers.cpp b/Marlin/src/HAL/ESP32/timers.cpp deleted file mode 100644 index 3300aea8a8..0000000000 --- a/Marlin/src/HAL/ESP32/timers.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include -#include -#include -#include -#include - -#include "../../inc/MarlinConfig.h" - -// ------------------------ -// Local defines -// ------------------------ - -#define NUM_HARDWARE_TIMERS 4 - -// ------------------------ -// Private Variables -// ------------------------ - -static timg_dev_t *TG[2] = {&TIMERG0, &TIMERG1}; - -const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { - { TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper - { TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature - { TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM - { TIMER_GROUP_1, TIMER_1, 1, nullptr }, // 3 -}; - -// ------------------------ -// Public functions -// ------------------------ - -void IRAM_ATTR timer_isr(void *para) { - const tTimerConfig& timer = TimerConfig[(int)para]; - - // Retrieve the interrupt status and the counter value - // from the timer that reported the interrupt - uint32_t intr_status = TG[timer.group]->int_st_timers.val; - TG[timer.group]->hw_timer[timer.idx].update = 1; - - // Clear the interrupt - if (intr_status & BIT(timer.idx)) { - switch (timer.idx) { - case TIMER_0: TG[timer.group]->int_clr_timers.t0 = 1; break; - case TIMER_1: TG[timer.group]->int_clr_timers.t1 = 1; break; - case TIMER_MAX: break; - } - } - - timer.fn(); - - // After the alarm has been triggered - // Enable it again so it gets triggered the next time - TG[timer.group]->hw_timer[timer.idx].config.alarm_en = TIMER_ALARM_EN; -} - -/** - * Enable and initialize the timer - * @param timer_num timer number to initialize - * @param frequency frequency of the timer - */ -void HAL_timer_start(const uint8_t timer_num, uint32_t frequency) { - const tTimerConfig timer = TimerConfig[timer_num]; - - timer_config_t config; - config.divider = timer.divider; - config.counter_dir = TIMER_COUNT_UP; - config.counter_en = TIMER_PAUSE; - config.alarm_en = TIMER_ALARM_EN; - config.intr_type = TIMER_INTR_LEVEL; - config.auto_reload = true; - - // Select and initialize the timer - timer_init(timer.group, timer.idx, &config); - - // Timer counter initial value and auto reload on alarm - timer_set_counter_value(timer.group, timer.idx, 0x00000000ULL); - - // Configure the alam value and the interrupt on alarm - timer_set_alarm_value(timer.group, timer.idx, (HAL_TIMER_RATE) / timer.divider / frequency - 1); - - timer_enable_intr(timer.group, timer.idx); - - timer_isr_register(timer.group, timer.idx, timer_isr, (void*)(uint32_t)timer_num, 0, nullptr); - - timer_start(timer.group, timer.idx); -} - -/** - * Set the upper value of the timer, when the timer reaches this upper value the - * interrupt should be triggered and the counter reset - * @param timer_num timer number to set the count to - * @param count threshold at which the interrupt is triggered - */ -void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t count) { - const tTimerConfig timer = TimerConfig[timer_num]; - timer_set_alarm_value(timer.group, timer.idx, count); -} - -/** - * Get the current upper value of the timer - * @param timer_num timer number to get the count from - * @return the timer current threshold for the alarm to be triggered - */ -hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - const tTimerConfig timer = TimerConfig[timer_num]; - - uint64_t alarm_value; - timer_get_alarm_value(timer.group, timer.idx, &alarm_value); - - return alarm_value; -} - -/** - * Get the current counter value between 0 and the maximum count (HAL_timer_set_count) - * @param timer_num timer number to get the current count - * @return the current counter of the alarm - */ -hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - const tTimerConfig timer = TimerConfig[timer_num]; - uint64_t counter_value; - timer_get_counter_value(timer.group, timer.idx, &counter_value); - return counter_value; -} - -/** - * Enable timer interrupt on the timer - * @param timer_num timer number to enable interrupts on - */ -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - //const tTimerConfig timer = TimerConfig[timer_num]; - //timer_enable_intr(timer.group, timer.idx); -} - -/** - * Disable timer interrupt on the timer - * @param timer_num timer number to disable interrupts on - */ -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - //const tTimerConfig timer = TimerConfig[timer_num]; - //timer_disable_intr(timer.group, timer.idx); -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - const tTimerConfig timer = TimerConfig[timer_num]; - return TG[timer.group]->int_ena.val | BIT(timer_num); -} - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/timers.h b/Marlin/src/HAL/ESP32/timers.h deleted file mode 100644 index d722670f33..0000000000 --- a/Marlin/src/HAL/ESP32/timers.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include -#include - -// Includes needed to get I2S_STEPPER_STREAM. Note that pins.h -// is included in case this header is being included early. -#include "../../inc/MarlinConfig.h" -#include "../../pins/pins.h" - -// ------------------------ -// Defines -// ------------------------ -// -#define FORCE_INLINE __attribute__((always_inline)) inline - -typedef uint64_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif -#ifndef PWM_TIMER_NUM - #define PWM_TIMER_NUM 2 // index of timer to use for PWM outputs -#endif - -#define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals - -#if ENABLED(I2S_STEPPER_STREAM) - #define STEPPER_TIMER_PRESCALE 1 - #define STEPPER_TIMER_RATE 250000 // 250khz, 4µs pulses of i2s word clock - #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs // wrong would be 0.25 -#else - #define STEPPER_TIMER_PRESCALE 40 - #define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // frequency of stepper timer, 2MHz - #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs -#endif - -#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts - -#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency - -#define PWM_TIMER_PRESCALE 10 -#if ENABLED(FAST_PWM_FAN) - #define PWM_TIMER_FREQUENCY FAST_PWM_FAN_FREQUENCY -#else - #define PWM_TIMER_FREQUENCY (50*128) // 50Hz and 7bit resolution -#endif -#define MAX_PWM_PINS 32 // Number of PWM pin-slots - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() -#endif -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() -#endif -#ifndef HAL_PWM_TIMER_ISR - #define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler() -#endif - -extern "C" void tempTC_Handler(); -extern "C" void stepTC_Handler(); -extern "C" void pwmTC_Handler(); - -// ------------------------ -// Types -// ------------------------ - -typedef struct { - timer_group_t group; - timer_idx_t idx; - uint32_t divider; - void (*fn)(); -} tTimerConfig; - -// ------------------------ -// Public Variables -// ------------------------ - -extern const tTimerConfig TimerConfig[]; - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_timer_start (const uint8_t timer_num, uint32_t frequency); -void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t count); -hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); -hal_timer_t HAL_timer_get_count(const uint8_t timer_num); - -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -#define HAL_timer_isr_prologue(TIMER_NUM) -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/ESP32/watchdog.cpp b/Marlin/src/HAL/ESP32/watchdog.cpp deleted file mode 100644 index f6fcfa3182..0000000000 --- a/Marlin/src/HAL/ESP32/watchdog.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - -#include "watchdog.h" - -void watchdogSetup() { - // do whatever. don't remove this function. -} - -void watchdog_init() { - // TODO -} - -#endif // USE_WATCHDOG - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/watchdog.h b/Marlin/src/HAL/ESP32/watchdog.h deleted file mode 100644 index b6c169e347..0000000000 --- a/Marlin/src/HAL/ESP32/watchdog.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { -#endif - - esp_err_t esp_task_wdt_reset(); - -#ifdef __cplusplus - } -#endif - -// Initialize watchdog with a 4 second interrupt time -void watchdog_init(); - -// Reset watchdog. -inline void HAL_watchdog_refresh() { esp_task_wdt_reset(); } diff --git a/Marlin/src/HAL/ESP32/web.cpp b/Marlin/src/HAL/ESP32/web.cpp deleted file mode 100644 index 7a27707a3e..0000000000 --- a/Marlin/src/HAL/ESP32/web.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(WIFISUPPORT, WEBSUPPORT) - -#include "../../inc/MarlinConfig.h" - -#undef DISABLED // esp32-hal-gpio.h -#include -#include "wifi.h" - -AsyncEventSource events("/events"); // event source (Server-Sent events) - -void onNotFound(AsyncWebServerRequest *request) { - request->send(404); -} - -void web_init() { - server.addHandler(&events); // attach AsyncEventSource - server.serveStatic("/", SPIFFS, "/www").setDefaultFile("index.html"); - server.onNotFound(onNotFound); -} - -#endif // WIFISUPPORT && WEBSUPPORT -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/web.h b/Marlin/src/HAL/ESP32/web.h deleted file mode 100644 index 60023ac636..0000000000 --- a/Marlin/src/HAL/ESP32/web.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -void web_init(); diff --git a/Marlin/src/HAL/ESP32/wifi.cpp b/Marlin/src/HAL/ESP32/wifi.cpp deleted file mode 100644 index f4cf5a606a..0000000000 --- a/Marlin/src/HAL/ESP32/wifi.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_ESP32 - -#include "../../core/serial.h" -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(WIFISUPPORT) - -#include -#include -#include -#include "wifi.h" - -AsyncWebServer server(80); - -#ifndef WIFI_HOSTNAME - #define WIFI_HOSTNAME DEFAULT_WIFI_HOSTNAME -#endif - -void wifi_init() { - - SERIAL_ECHO_MSG("Starting WiFi..."); - - WiFi.mode(WIFI_STA); - WiFi.begin(WIFI_SSID, WIFI_PWD); - - while (WiFi.waitForConnectResult() != WL_CONNECTED) { - SERIAL_ERROR_MSG("Unable to connect to WiFi with SSID '" WIFI_SSID "', restarting."); - delay(5000); - ESP.restart(); - } - - delay(10); - if (!MDNS.begin(WIFI_HOSTNAME)) { - SERIAL_ERROR_MSG("Unable to start mDNS with hostname '" WIFI_HOSTNAME "', restarting."); - delay(5000); - ESP.restart(); - } - - MDNS.addService("http", "tcp", 80); - - SERIAL_ECHOLNPAIR("Successfully connected to WiFi with SSID '" WIFI_SSID "', hostname: '" WIFI_HOSTNAME "', IP address: ", WiFi.localIP().toString().c_str()); -} - -#endif // WIFISUPPORT -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/wifi.h b/Marlin/src/HAL/ESP32/wifi.h deleted file mode 100644 index 759a73b252..0000000000 --- a/Marlin/src/HAL/ESP32/wifi.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -extern AsyncWebServer server; - -#define DEFAULT_WIFI_HOSTNAME "marlin" - -void wifi_init(); diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h deleted file mode 100644 index 5eca2f7eac..0000000000 --- a/Marlin/src/HAL/HAL.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "platforms.h" - -#include HAL_PATH(.,HAL.h) - -#ifdef SERIAL_PORT_2 - #define NUM_SERIAL 2 -#else - #define NUM_SERIAL 1 -#endif - -#define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION) - -#ifndef I2C_ADDRESS - #define I2C_ADDRESS(A) uint8_t(A) -#endif - -// Needed for AVR sprintf_P PROGMEM extension -#ifndef S_FMT - #define S_FMT "%s" -#endif - -// String helper -#ifndef PGMSTR - #define PGMSTR(NAM,STR) const char NAM[] = STR -#endif - -inline void watchdog_refresh() { - TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); -} diff --git a/Marlin/src/HAL/HAL_AVR/HAL.cpp b/Marlin/src/HAL/HAL_AVR/HAL.cpp new file mode 100644 index 0000000000..e694559761 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/HAL.cpp @@ -0,0 +1,94 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +****************************************************************************/ + +#ifdef __AVR__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +//uint8_t MCUSR; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(SDSUPPORT) + + #include "../../sd/SdFatUtil.h" + int freeMemory() { return SdFatUtil::FreeRam(); } + +#else // !SDSUPPORT + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + int freeMemory() { + int free_memory; + if ((int)__brkval == 0) + free_memory = ((int)&free_memory) - ((int)&__bss_end); + else + free_memory = ((int)&free_memory) - ((int)__brkval); + return free_memory; + } +} + +#endif // !SDSUPPORT + +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/HAL.h b/Marlin/src/HAL/HAL_AVR/HAL.h new file mode 100644 index 0000000000..84cdc865f0 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/HAL.h @@ -0,0 +1,358 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _HAL_AVR_H_ +#define _HAL_AVR_H_ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +#include + +#include +#include +#include +#include +#include + +#include "../shared/HAL_SPI.h" +#include "fastio_AVR.h" +#include "watchdog_AVR.h" +#include "math_AVR.h" + +#ifdef USBCON + #include "HardwareSerial.h" +#else + #include "MarlinSerial.h" +#endif + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +//#define analogInputToDigitalPin(IO) IO + +#ifndef CRITICAL_SECTION_START + #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli() + #define CRITICAL_SECTION_END SREG = _sreg +#endif +#define ISRS_ENABLED() TEST(SREG, SREG_I) +#define ENABLE_ISRS() sei() +#define DISABLE_ISRS() cli() + +// On AVR this is in math.h? +//#define square(x) ((x)*(x)) + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef uint16_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFF + +typedef int8_t pin_t; + +#define HAL_SERVO_LIB Servo + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +//extern uint8_t MCUSR; + +#define NUM_SERIAL 1 + +#ifdef USBCON + #if ENABLED(BLUETOOTH) + #define MYSERIAL0 bluetoothSerial + #else + #define MYSERIAL0 Serial + #endif +#else + #define MYSERIAL0 customizedSerial +#endif + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +//void cli(void); + +//void _delay_ms(const int delay); + +inline void HAL_clear_reset_source(void) { MCUSR = 0; } +inline uint8_t HAL_get_reset_source(void) { return MCUSR; } + +extern "C" { + int freeMemory(void); +} + +// timers +#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz + +#define STEP_TIMER_NUM 1 +#define TEMP_TIMER_NUM 0 +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0) + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE +#define STEPPER_TIMER_PRESCALE 8 +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) +#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A) + +#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B) +#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) +#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B) + +FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + UNUSED(frequency); + switch (timer_num) { + case STEP_TIMER_NUM: + // waveform generation = 0100 = CTC + SET_WGM(1, CTC_OCRnA); + + // output mode = 00 (disconnected) + SET_COMA(1, NORMAL); + + // Set the timer pre-scaler + // Generally we use a divider of 8, resulting in a 2MHz timer + // frequency on a 16MHz MCU. If you are going to change this, be + // sure to regenerate speed_lookuptable.h with + // create_speed_lookuptable.py + SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler + + // Init Stepper ISR to 122 Hz for quick starting + // (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency + OCR1A = 0x4000; + TCNT1 = 0; + break; + + case TEMP_TIMER_NUM: + // Use timer0 for temperature measurement + // Interleave temperature interrupt with millies interrupt + OCR0B = 128; + break; + } +} + +#define TIMER_OCR_1 OCR1A +#define TIMER_COUNTER_1 TCNT1 + +#define TIMER_OCR_0 OCR0A +#define TIMER_COUNTER_0 TCNT0 + +#define _CAT(a, ...) a ## __VA_ARGS__ +#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare) +#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer) +#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer) + +/** + * On AVR there is no hardware prioritization and preemption of + * interrupts, so this emulates it. The UART has first priority + * (otherwise, characters will be lost due to UART overflow). + * Then: Stepper, Endstops, Temperature, and -finally- all others. + */ +#define HAL_timer_isr_prologue(TIMER_NUM) +#define HAL_timer_isr_epilogue(TIMER_NUM) + +/* 18 cycles maximum latency */ +#define HAL_STEP_TIMER_ISR \ +extern "C" void TIMER1_COMPA_vect (void) __attribute__ ((signal, naked, used, externally_visible)); \ +extern "C" void TIMER1_COMPA_vect_bottom (void) asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \ +void TIMER1_COMPA_vect (void) { \ + __asm__ __volatile__ ( \ + A("push r16") /* 2 Save R16 */ \ + A("in r16, __SREG__") /* 1 Get SREG */ \ + A("push r16") /* 2 Save SREG into stack */ \ + A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \ + A("push r16") /* 2 Save TIMSK0 into the stack */ \ + A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \ + A("sts %[timsk0], r16") /* 2 And set the new value */ \ + A("lds r16, %[timsk1]") /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \ + A("andi r16,~%[msk1]") /* 1 Disable the stepper ISR */ \ + A("sts %[timsk1], r16") /* 2 And set the new value */ \ + A("push r16") /* 2 Save TIMSK1 into stack */ \ + A("in r16, 0x3B") /* 1 Get RAMPZ register */ \ + A("push r16") /* 2 Save RAMPZ into stack */ \ + A("in r16, 0x3C") /* 1 Get EIND register */ \ + A("push r0") /* C runtime can modify all the following registers without restoring them */ \ + A("push r1") \ + A("push r18") \ + A("push r19") \ + A("push r20") \ + A("push r21") \ + A("push r22") \ + A("push r23") \ + A("push r24") \ + A("push r25") \ + A("push r26") \ + A("push r27") \ + A("push r30") \ + A("push r31") \ + A("clr r1") /* C runtime expects this register to be 0 */ \ + A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \ + A("pop r31") \ + A("pop r30") \ + A("pop r27") \ + A("pop r26") \ + A("pop r25") \ + A("pop r24") \ + A("pop r23") \ + A("pop r22") \ + A("pop r21") \ + A("pop r20") \ + A("pop r19") \ + A("pop r18") \ + A("pop r1") \ + A("pop r0") \ + A("out 0x3C, r16") /* 1 Restore EIND register */ \ + A("pop r16") /* 2 Get the original RAMPZ register value */ \ + A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \ + A("pop r16") /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \ + A("ori r16,%[msk1]") /* 1 Reenable the stepper ISR */ \ + A("cli") /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \ + A("sts %[timsk1], r16") /* 2 And restore the old value - This reenables the stepper ISR */ \ + A("pop r16") /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \ + A("sts %[timsk0], r16") /* 2 And restore the old value - This reenables the temperature ISR */ \ + A("pop r16") /* 2 Get the old SREG value */ \ + A("out __SREG__, r16") /* 1 And restore the SREG value */ \ + A("pop r16") /* 2 Restore R16 value */ \ + A("reti") /* 4 Return from interrupt */ \ + : \ + : [timsk0] "i" ((uint16_t)&TIMSK0), \ + [timsk1] "i" ((uint16_t)&TIMSK1), \ + [msk0] "M" ((uint8_t)(1< 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(pin) +#else + #define HAL_START_ADC(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin) +#endif + +#define HAL_READ_ADC() ADC +#define HAL_ADC_READY() !TEST(ADCSRA, ADSC) + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#define HAL_SENSITIVE_PINS 0, 1 + +// AVR compatibility +#define strtof strtod + +#endif // _HAL_AVR_H_ diff --git a/Marlin/src/HAL/HAL_AVR/HAL_spi_AVR.cpp b/Marlin/src/HAL/HAL_AVR/HAL_spi_AVR.cpp new file mode 100644 index 0000000000..4e4b248182 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/HAL_spi_AVR.cpp @@ -0,0 +1,278 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * Description: HAL for AVR - SPI functions + * + * For __AVR__ + */ + +#ifdef __AVR__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../../inc/MarlinConfig.h" + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void spiBegin (void) { + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + + #if DISABLED(SOFTWARE_SPI) + // SS must be in output mode even it is not chip select + SET_OUTPUT(SS_PIN); + // set SS high - may be chip select for another SPI device + #if SET_SPI_SS_HIGH + WRITE(SS_PIN, HIGH); + #endif // SET_SPI_SS_HIGH + // set a default rate + spiInit(1); + #endif // SOFTWARE_SPI +} + + +//------------------------------------------------------------------------------ +#if DISABLED(SOFTWARE_SPI) + // functions for hardware SPI + //------------------------------------------------------------------------------ + // make sure SPCR rate is in expected bits + #if (SPR0 != 0 || SPR1 != 1) + #error "unexpected SPCR bits" + #endif + + /** + * Initialize hardware SPI + * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6] + */ + void spiInit(uint8_t spiRate) { + // See avr processor documentation + CBI( + #ifdef PRR + PRR + #elif defined(PRR0) + PRR0 + #endif + , PRSPI); + + SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1); + SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X); + } + + //------------------------------------------------------------------------------ + /** SPI receive a byte */ + uint8_t spiRec(void) { + SPDR = 0xFF; + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + return SPDR; + } + //------------------------------------------------------------------------------ + /** SPI read data */ + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte-- == 0) return; + SPDR = 0xFF; + for (uint16_t i = 0; i < nbyte; i++) { + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + buf[i] = SPDR; + SPDR = 0xFF; + } + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + buf[nbyte] = SPDR; + } + //------------------------------------------------------------------------------ + /** SPI send a byte */ + void spiSend(uint8_t b) { + SPDR = b; + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + } + //------------------------------------------------------------------------------ + /** SPI send block */ + void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + } + + + /** begin spi transaction */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // Based on Arduino SPI library + // Clock settings are defined as follows. Note that this shows SPI2X + // inverted, so the bits form increasing numbers. Also note that + // fosc/64 appears twice + // SPR1 SPR0 ~SPI2X Freq + // 0 0 0 fosc/2 + // 0 0 1 fosc/4 + // 0 1 0 fosc/8 + // 0 1 1 fosc/16 + // 1 0 0 fosc/32 + // 1 0 1 fosc/64 + // 1 1 0 fosc/64 + // 1 1 1 fosc/128 + + // We find the fastest clock that is less than or equal to the + // given clock rate. The clock divider that results in clock_setting + // is 2 ^^ (clock_div + 1). If nothing is slow enough, we'll use the + // slowest (128 == 2 ^^ 7, so clock_div = 6). + uint8_t clockDiv; + + // When the clock is known at compiletime, use this if-then-else + // cascade, which the compiler knows how to completely optimize + // away. When clock is not known, use a loop instead, which generates + // shorter code. + if (__builtin_constant_p(spiClock)) { + if (spiClock >= F_CPU / 2) clockDiv = 0; + else if (spiClock >= F_CPU / 4) clockDiv = 1; + else if (spiClock >= F_CPU / 8) clockDiv = 2; + else if (spiClock >= F_CPU / 16) clockDiv = 3; + else if (spiClock >= F_CPU / 32) clockDiv = 4; + else if (spiClock >= F_CPU / 64) clockDiv = 5; + else clockDiv = 6; + } + else { + uint32_t clockSetting = F_CPU / 2; + clockDiv = 0; + while (clockDiv < 6 && spiClock < clockSetting) { + clockSetting /= 2; + clockDiv++; + } + } + + // Compensate for the duplicate fosc/64 + if (clockDiv == 6) clockDiv = 7; + + // Invert the SPI2X bit + clockDiv ^= 0x1; + + SPCR = _BV(SPE) | _BV(MSTR) | ((bitOrder == SPI_LSBFIRST) ? _BV(DORD) : 0) | + (dataMode << CPHA) | ((clockDiv >> 1) << SPR0); + SPSR = clockDiv | 0x01; + } + + + //------------------------------------------------------------------------------ +#else // SOFTWARE_SPI + //------------------------------------------------------------------------------ + /** nop to tune soft SPI timing */ + #define nop asm volatile ("\tnop\n") + + /** Set SPI rate */ + void spiInit(uint8_t spiRate) { + // nothing to do + UNUSED(spiRate); + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // nothing to do + UNUSED(spiBeginTransaction); + } + + //------------------------------------------------------------------------------ + /** Soft SPI receive byte */ + uint8_t spiRec() { + uint8_t data = 0; + // no interrupts during byte receive - about 8µs + cli(); + // output pin high - like sending 0xFF + WRITE(MOSI_PIN, HIGH); + + for (uint8_t i = 0; i < 8; i++) { + WRITE(SCK_PIN, HIGH); + + // adjust so SCK is nice + nop; + nop; + + data <<= 1; + + if (READ(MISO_PIN)) data |= 1; + + WRITE(SCK_PIN, LOW); + } + // enable interrupts + sei(); + return data; + } + //------------------------------------------------------------------------------ + /** Soft SPI read data */ + void spiRead(uint8_t* buf, uint16_t nbyte) { + for (uint16_t i = 0; i < nbyte; i++) + buf[i] = spiRec(); + } + //------------------------------------------------------------------------------ + /** Soft SPI send byte */ + void spiSend(uint8_t data) { + // no interrupts during byte send - about 8µs + cli(); + for (uint8_t i = 0; i < 8; i++) { + WRITE(SCK_PIN, LOW); + + WRITE(MOSI_PIN, data & 0x80); + + data <<= 1; + + WRITE(SCK_PIN, HIGH); + } + // hold SCK high for a few ns + nop; + nop; + nop; + nop; + + WRITE(SCK_PIN, LOW); + // enable interrupts + sei(); + } + //------------------------------------------------------------------------------ + /** Soft SPI send block */ + void spiSendBlock(uint8_t token, const uint8_t* buf) { + spiSend(token); + for (uint16_t i = 0; i < 512; i++) + spiSend(buf[i]); + } +#endif // SOFTWARE_SPI + + +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp b/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp new file mode 100644 index 0000000000..ece2497766 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/MarlinSerial.cpp @@ -0,0 +1,749 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MarlinSerial.cpp - Hardware serial library for Wiring + * Copyright (c) 2006 Nicholas Zambetti. All right reserved. + * + * Modified 23 November 2006 by David A. Mellis + * Modified 28 September 2010 by Mark Sproul + * Modified 14 February 2016 by Andreas Hardtung (added tx buffer) + * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF) + * Modified 10 June 2018 by Eduardo José Tagle (See #10991) + */ + +#ifdef __AVR__ + +// Disable HardwareSerial.cpp to support chips without a UART (Attiny, etc.) + +#include "../../inc/MarlinConfig.h" + +#if !defined(USBCON) && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) + + #include "MarlinSerial.h" + #include "../../Marlin.h" + + struct ring_buffer_r { + unsigned char buffer[RX_BUFFER_SIZE]; + volatile ring_buffer_pos_t head, tail; + }; + + #if TX_BUFFER_SIZE > 0 + struct ring_buffer_t { + unsigned char buffer[TX_BUFFER_SIZE]; + volatile uint8_t head, tail; + }; + #endif + + #if UART_PRESENT(SERIAL_PORT) + ring_buffer_r rx_buffer = { { 0 }, 0, 0 }; + #if TX_BUFFER_SIZE > 0 + ring_buffer_t tx_buffer = { { 0 }, 0, 0 }; + #endif + static bool _written; + #endif + + #if ENABLED(SERIAL_XON_XOFF) + constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent + XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send + // XON / XOFF character definitions + constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19; + uint8_t xon_xoff_state = XON_XOFF_CHAR_SENT | XON_CHAR; + #endif + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + uint8_t rx_dropped_bytes = 0; + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + uint8_t rx_buffer_overruns = 0; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + uint8_t rx_framing_errors = 0; + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + ring_buffer_pos_t rx_max_enqueued = 0; + #endif + + // A SW memory barrier, to ensure GCC does not overoptimize loops + #define sw_barrier() asm volatile("": : :"memory"); + + #if ENABLED(EMERGENCY_PARSER) + #include "../../feature/emergency_parser.h" + #endif + + // "Atomically" read the RX head index value without disabling interrupts: + // This MUST be called with RX interrupts enabled, and CAN'T be called + // from the RX ISR itself! + FORCE_INLINE ring_buffer_pos_t atomic_read_rx_head() { + #if RX_BUFFER_SIZE > 256 + // Keep reading until 2 consecutive reads return the same value, + // meaning there was no update in-between caused by an interrupt. + // This works because serial RX interrupts happen at a slower rate + // than successive reads of a variable, so 2 consecutive reads with + // the same value means no interrupt updated it. + ring_buffer_pos_t vold, vnew = rx_buffer.head; + sw_barrier(); + do { + vold = vnew; + vnew = rx_buffer.head; + sw_barrier(); + } while (vold != vnew); + return vnew; + #else + // With an 8bit index, reads are always atomic. No need for special handling + return rx_buffer.head; + #endif + } + + #if RX_BUFFER_SIZE > 256 + static volatile bool rx_tail_value_not_stable = false; + static volatile uint16_t rx_tail_value_backup = 0; + #endif + + // Set RX tail index, taking into account the RX ISR could interrupt + // the write to this variable in the middle - So a backup strategy + // is used to ensure reads of the correct values. + // -Must NOT be called from the RX ISR - + FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value) { + #if RX_BUFFER_SIZE > 256 + // Store the new value in the backup + rx_tail_value_backup = value; + sw_barrier(); + // Flag we are about to change the true value + rx_tail_value_not_stable = true; + sw_barrier(); + // Store the new value + rx_buffer.tail = value; + sw_barrier(); + // Signal the new value is completely stored into the value + rx_tail_value_not_stable = false; + sw_barrier(); + #else + rx_buffer.tail = value; + #endif + } + + // Get the RX tail index, taking into account the read could be + // interrupting in the middle of the update of that index value + // -Called from the RX ISR - + FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail() { + #if RX_BUFFER_SIZE > 256 + // If the true index is being modified, return the backup value + if (rx_tail_value_not_stable) return rx_tail_value_backup; + #endif + // The true index is stable, return it + return rx_buffer.tail; + } + + // (called with RX interrupts disabled) + FORCE_INLINE void store_rxd_char() { + + #if ENABLED(EMERGENCY_PARSER) + static EmergencyParser::State emergency_state; // = EP_RESET + #endif + + // Get the tail - Nothing can alter its value while this ISR is executing, but there's + // a chance that this ISR interrupted the main process while it was updating the index. + // The backup mechanism ensures the correct value is always returned. + const ring_buffer_pos_t t = atomic_read_rx_tail(); + + // Get the head pointer - This ISR is the only one that modifies its value, so it's safe to read here + ring_buffer_pos_t h = rx_buffer.head; + + // Get the next element + ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // This must read the M_UCSRxA register before reading the received byte to detect error causes + #if ENABLED(SERIAL_STATS_DROPPED_RX) + if (TEST(M_UCSRxA, M_DORx) && !++rx_dropped_bytes) --rx_dropped_bytes; + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + if (TEST(M_UCSRxA, M_DORx) && !++rx_buffer_overruns) --rx_buffer_overruns; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + if (TEST(M_UCSRxA, M_FEx) && !++rx_framing_errors) --rx_framing_errors; + #endif + + // Read the character from the USART + uint8_t c = M_UDRx; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the RX FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + // Calculate count of bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Keep track of the maximum count of enqueued bytes + NOLESS(rx_max_enqueued, rx_count); + #endif + + #if ENABLED(SERIAL_XON_XOFF) + // If the last char that was sent was an XON + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { + + // Bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // If over 12.5% of RX buffer capacity, send XOFF before running out of + // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react + // and stop sending bytes. This translates to 13mS propagation time. + if (rx_count >= (RX_BUFFER_SIZE) / 8) { + + // At this point, definitely no TX interrupt was executing, since the TX ISR can't be preempted. + // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens + // to be in the middle of trying to disable the RX interrupt in the main program, eventually the + // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure + // the sending of the XOFF char is to send it HERE AND NOW. + + // About to send the XOFF char + xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; + + // Wait until the TX register becomes empty and send it - Here there could be a problem + // - While waiting for the TX register to empty, the RX register could receive a new + // character. This must also handle that situation! + while (!TEST(M_UCSRxA, M_UDREx)) { + + if (TEST(M_UCSRxA,M_RXCx)) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + c = M_UDRx; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + } + sw_barrier(); + } + + M_UDRx = XOFF_CHAR; + + // Clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + SBI(M_UCSRxA, M_TXCx); + + // At this point there could be a race condition between the write() function + // and this sending of the XOFF char. This interrupt could happen between the + // wait to be empty TX buffer loop and the actual write of the character. Since + // the TX buffer is full because it's sending the XOFF char, the only way to be + // sure the write() function will succeed is to wait for the XOFF char to be + // completely sent. Since an extra character could be received during the wait + // it must also be handled! + while (!TEST(M_UCSRxA, M_UDREx)) { + + if (TEST(M_UCSRxA,M_RXCx)) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + c = M_UDRx; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + } + sw_barrier(); + } + + // At this point everything is ready. The write() function won't + // have any issues writing to the UART TX register if it needs to! + } + } + #endif // SERIAL_XON_XOFF + + // Store the new head value - The main loop will retry until the value is stable + rx_buffer.head = h; + } + + #if TX_BUFFER_SIZE > 0 + + // (called with TX irqs disabled) + FORCE_INLINE void _tx_udr_empty_irq(void) { + + // Read positions + uint8_t t = tx_buffer.tail; + const uint8_t h = tx_buffer.head; + + #if ENABLED(SERIAL_XON_XOFF) + // If an XON char is pending to be sent, do it now + if (xon_xoff_state == XON_CHAR) { + + // Send the character + M_UDRx = XON_CHAR; + + // clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + SBI(M_UCSRxA, M_TXCx); + + // Remember we sent it. + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + + // If nothing else to transmit, just disable TX interrupts. + if (h == t) CBI(M_UCSRxB, M_UDRIEx); // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + + return; + } + #endif + + // If nothing to transmit, just disable TX interrupts. This could + // happen as the result of the non atomicity of the disabling of RX + // interrupts that could end reenabling TX interrupts as a side effect. + if (h == t) { + CBI(M_UCSRxB, M_UDRIEx); // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + return; + } + + // There is something to TX, Send the next byte + const uint8_t c = tx_buffer.buffer[t]; + t = (t + 1) & (TX_BUFFER_SIZE - 1); + M_UDRx = c; + tx_buffer.tail = t; + + // Clear the TXC bit (by writing a one to its bit location). + // Ensures flush() won't return until the bytes are actually written/ + SBI(M_UCSRxA, M_TXCx); + + // Disable interrupts if there is nothing to transmit following this byte + if (h == t) CBI(M_UCSRxB, M_UDRIEx); // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + } + + #ifdef M_USARTx_UDRE_vect + ISR(M_USARTx_UDRE_vect) { _tx_udr_empty_irq(); } + #endif + + #endif // TX_BUFFER_SIZE + + #ifdef M_USARTx_RX_vect + ISR(M_USARTx_RX_vect) { store_rxd_char(); } + #endif + + // Public Methods + + void MarlinSerial::begin(const long baud) { + uint16_t baud_setting; + bool useU2X = true; + + #if F_CPU == 16000000UL && SERIAL_PORT == 0 + // Hard-coded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards, and the firmware on the + // 8U2 on the Uno and Mega 2560. + if (baud == 57600) useU2X = false; + #endif + + if (useU2X) { + M_UCSRxA = _BV(M_U2Xx); + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } + else { + M_UCSRxA = 0; + baud_setting = (F_CPU / 8 / baud - 1) / 2; + } + + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + M_UBRRxH = baud_setting >> 8; + M_UBRRxL = baud_setting; + + SBI(M_UCSRxB, M_RXENx); + SBI(M_UCSRxB, M_TXENx); + SBI(M_UCSRxB, M_RXCIEx); + #if TX_BUFFER_SIZE > 0 + CBI(M_UCSRxB, M_UDRIEx); + #endif + _written = false; + } + + void MarlinSerial::end() { + CBI(M_UCSRxB, M_RXENx); + CBI(M_UCSRxB, M_TXENx); + CBI(M_UCSRxB, M_RXCIEx); + CBI(M_UCSRxB, M_UDRIEx); + } + + int MarlinSerial::peek(void) { + const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; + return h == t ? -1 : rx_buffer.buffer[t]; + } + + int MarlinSerial::read(void) { + const ring_buffer_pos_t h = atomic_read_rx_head(); + + // Read the tail. Main thread owns it, so it is safe to directly read it + ring_buffer_pos_t t = rx_buffer.tail; + + // If nothing to read, return now + if (h == t) return -1; + + // Get the next char + const int v = rx_buffer.buffer[t]; + t = (ring_buffer_pos_t)(t + 1) & (RX_BUFFER_SIZE - 1); + + // Advance tail - Making sure the RX ISR will always get an stable value, even + // if it interrupts the writing of the value of that variable in the middle. + atomic_set_rx_tail(t); + + #if ENABLED(SERIAL_XON_XOFF) + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + // Get count of bytes in the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + if (rx_count < (RX_BUFFER_SIZE) / 10) { + #if TX_BUFFER_SIZE > 0 + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX ISR. Non atomic, but it will eventually enable them + SBI(M_UCSRxB, M_UDRIEx); + #else + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!TEST(M_UCSRxA, M_UDREx)) sw_barrier(); + M_UDRx = XON_CHAR; + #endif + } + } + #endif + + return v; + } + + ring_buffer_pos_t MarlinSerial::available(void) { + const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; + return (ring_buffer_pos_t)(RX_BUFFER_SIZE + h - t) & (RX_BUFFER_SIZE - 1); + } + + void MarlinSerial::flush(void) { + + // Set the tail to the head: + // - Read the RX head index in a safe way. (See atomic_read_rx_head.) + // - Set the tail, making sure the RX ISR will always get a stable value, even + // if it interrupts the writing of the value of that variable in the middle. + atomic_set_rx_tail(atomic_read_rx_head()); + + #if ENABLED(SERIAL_XON_XOFF) + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + #if TX_BUFFER_SIZE > 0 + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX ISR. Non atomic, but it will eventually enable it. + SBI(M_UCSRxB, M_UDRIEx); + #else + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!TEST(M_UCSRxA, M_UDREx)) sw_barrier(); + M_UDRx = XON_CHAR; + #endif + } + #endif + } + + #if TX_BUFFER_SIZE > 0 + void MarlinSerial::write(const uint8_t c) { + _written = true; + + // If the TX interrupts are disabled and the data register + // is empty, just write the byte to the data register and + // be done. This shortcut helps significantly improve the + // effective datarate at high (>500kbit/s) bitrates, where + // interrupt overhead becomes a slowdown. + // Yes, there is a race condition between the sending of the + // XOFF char at the RX ISR, but it is properly handled there + if (!TEST(M_UCSRxB, M_UDRIEx) && TEST(M_UCSRxA, M_UDREx)) { + M_UDRx = c; + + // clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + SBI(M_UCSRxA, M_TXCx); + return; + } + + const uint8_t i = (tx_buffer.head + 1) & (TX_BUFFER_SIZE - 1); + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Make room by polling if it is possible to transmit, and do so! + while (i == tx_buffer.tail) { + + // If we can transmit another byte, do it. + if (TEST(M_UCSRxA, M_UDREx)) _tx_udr_empty_irq(); + + // Make sure compiler rereads tx_buffer.tail + sw_barrier(); + } + } + else { + // Interrupts are enabled, just wait until there is space + while (i == tx_buffer.tail) { sw_barrier(); } + } + + // Store new char. head is always safe to move + tx_buffer.buffer[tx_buffer.head] = c; + tx_buffer.head = i; + + // Enable TX ISR - Non atomic, but it will eventually enable TX ISR + SBI(M_UCSRxB, M_UDRIEx); + } + + void MarlinSerial::flushTX(void) { + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Wait until everything was transmitted - We must do polling, as interrupts are disabled + while (tx_buffer.head != tx_buffer.tail || !TEST(M_UCSRxA, M_TXCx)) { + + // If there is more space, send an extra character + if (TEST(M_UCSRxA, M_UDREx)) + _tx_udr_empty_irq(); + + sw_barrier(); + } + + } + else { + // Wait until everything was transmitted + while (tx_buffer.head != tx_buffer.tail || !TEST(M_UCSRxA, M_TXCx)) sw_barrier(); + } + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } + + #else // TX_BUFFER_SIZE == 0 + + void MarlinSerial::write(const uint8_t c) { + _written = true; + while (!TEST(M_UCSRxA, M_UDREx)) sw_barrier(); + M_UDRx = c; + } + + void MarlinSerial::flushTX(void) { + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // Wait until everything was transmitted + while (!TEST(M_UCSRxA, M_TXCx)) sw_barrier(); + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } + #endif // TX_BUFFER_SIZE == 0 + + /** + * Imports from print.h + */ + + void MarlinSerial::print(char c, int base) { + print((long)c, base); + } + + void MarlinSerial::print(unsigned char b, int base) { + print((unsigned long)b, base); + } + + void MarlinSerial::print(int n, int base) { + print((long)n, base); + } + + void MarlinSerial::print(unsigned int n, int base) { + print((unsigned long)n, base); + } + + void MarlinSerial::print(long n, int base) { + if (base == 0) write(n); + else if (base == 10) { + if (n < 0) { print('-'); n = -n; } + printNumber(n, 10); + } + else + printNumber(n, base); + } + + void MarlinSerial::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); + } + + void MarlinSerial::print(double n, int digits) { + printFloat(n, digits); + } + + void MarlinSerial::println(void) { + print('\r'); + print('\n'); + } + + void MarlinSerial::println(const String& s) { + print(s); + println(); + } + + void MarlinSerial::println(const char c[]) { + print(c); + println(); + } + + void MarlinSerial::println(char c, int base) { + print(c, base); + println(); + } + + void MarlinSerial::println(unsigned char b, int base) { + print(b, base); + println(); + } + + void MarlinSerial::println(int n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(unsigned int n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(long n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(unsigned long n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(double n, int digits) { + print(n, digits); + println(); + } + + // Private Methods + + void MarlinSerial::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); + } + + void MarlinSerial::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i = 0; i < digits; ++i) + rounding *= 0.1; + + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } + } + } + + // Preinstantiate + MarlinSerial customizedSerial; + +#endif // !USBCON && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) + +// For AT90USB targets use the UART for BT interfacing +#if defined(USBCON) && ENABLED(BLUETOOTH) + HardwareSerial bluetoothSerial; +#endif + +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/MarlinSerial.h b/Marlin/src/HAL/HAL_AVR/MarlinSerial.h new file mode 100644 index 0000000000..8c2b3f3186 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/MarlinSerial.h @@ -0,0 +1,177 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MarlinSerial.h - Hardware serial library for Wiring + * Copyright (c) 2006 Nicholas Zambetti. All right reserved. + * + * Modified 28 September 2010 by Mark Sproul + * Modified 14 February 2016 by Andreas Hardtung (added tx buffer) + * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF) + */ + +#ifndef _MARLINSERIAL_H_ +#define _MARLINSERIAL_H_ + +#include "../../inc/MarlinConfigPre.h" + +#include + +#ifndef SERIAL_PORT + #define SERIAL_PORT 0 +#endif + +// The presence of the UBRRH register is used to detect a UART. +#define UART_PRESENT(port) ((port == 0 && (defined(UBRRH) || defined(UBRR0H))) || \ + (port == 1 && defined(UBRR1H)) || (port == 2 && defined(UBRR2H)) || \ + (port == 3 && defined(UBRR3H))) + +// These are macros to build serial port register names for the selected SERIAL_PORT (C preprocessor +// requires two levels of indirection to expand macro values properly) +#define SERIAL_REGNAME(registerbase,number,suffix) SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) +#if SERIAL_PORT == 0 && (!defined(UBRR0H) || !defined(UDR0)) // use un-numbered registers if necessary + #define SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) registerbase##suffix +#else + #define SERIAL_REGNAME_INTERNAL(registerbase,number,suffix) registerbase##number##suffix +#endif + +// Registers used by MarlinSerial class (expanded depending on selected serial port) +#define M_UCSRxA SERIAL_REGNAME(UCSR,SERIAL_PORT,A) // defines M_UCSRxA to be UCSRnA where n is the serial port number +#define M_UCSRxB SERIAL_REGNAME(UCSR,SERIAL_PORT,B) +#define M_RXENx SERIAL_REGNAME(RXEN,SERIAL_PORT,) +#define M_TXENx SERIAL_REGNAME(TXEN,SERIAL_PORT,) +#define M_TXCx SERIAL_REGNAME(TXC,SERIAL_PORT,) +#define M_RXCIEx SERIAL_REGNAME(RXCIE,SERIAL_PORT,) +#define M_UDREx SERIAL_REGNAME(UDRE,SERIAL_PORT,) +#define M_FEx SERIAL_REGNAME(FE,SERIAL_PORT,) +#define M_DORx SERIAL_REGNAME(DOR,SERIAL_PORT,) +#define M_UPEx SERIAL_REGNAME(UPE,SERIAL_PORT,) +#define M_UDRIEx SERIAL_REGNAME(UDRIE,SERIAL_PORT,) +#define M_UDRx SERIAL_REGNAME(UDR,SERIAL_PORT,) +#define M_UBRRxH SERIAL_REGNAME(UBRR,SERIAL_PORT,H) +#define M_UBRRxL SERIAL_REGNAME(UBRR,SERIAL_PORT,L) +#define M_RXCx SERIAL_REGNAME(RXC,SERIAL_PORT,) +#define M_USARTx_RX_vect SERIAL_REGNAME(USART,SERIAL_PORT,_RX_vect) +#define M_U2Xx SERIAL_REGNAME(U2X,SERIAL_PORT,) +#define M_USARTx_UDRE_vect SERIAL_REGNAME(USART,SERIAL_PORT,_UDRE_vect) + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 +#define BYTE 0 + +#ifndef USBCON + // We're using a ring buffer (I think), in which rx_buffer_head is the index of the + // location to which to write the next incoming character and rx_buffer_tail is the + // index of the location from which to read. + #if RX_BUFFER_SIZE > 256 + typedef uint16_t ring_buffer_pos_t; + #else + typedef uint8_t ring_buffer_pos_t; + #endif + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + extern uint8_t rx_dropped_bytes; + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + extern uint8_t rx_buffer_overruns; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + extern uint8_t rx_framing_errors; + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + extern ring_buffer_pos_t rx_max_enqueued; + #endif + + class MarlinSerial { + + public: + MarlinSerial() {}; + static void begin(const long); + static void end(); + static int peek(void); + static int read(void); + static void flush(void); + static ring_buffer_pos_t available(void); + static void write(const uint8_t c); + static void flushTX(void); + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + FORCE_INLINE static uint32_t dropped() { return rx_dropped_bytes; } + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + FORCE_INLINE static uint32_t buffer_overruns() { return rx_buffer_overruns; } + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + FORCE_INLINE static uint32_t framing_errors() { return rx_framing_errors; } + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return rx_max_enqueued; } + #endif + + FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } + FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } + FORCE_INLINE static void print(const char* str) { write(str); } + + static void print(char, int = BYTE); + static void print(unsigned char, int = BYTE); + static void print(int, int = DEC); + static void print(unsigned int, int = DEC); + static void print(long, int = DEC); + static void print(unsigned long, int = DEC); + static void print(double, int = 2); + + static void println(const String& s); + static void println(const char[]); + static void println(char, int = BYTE); + static void println(unsigned char, int = BYTE); + static void println(int, int = DEC); + static void println(unsigned int, int = DEC); + static void println(long, int = DEC); + static void println(unsigned long, int = DEC); + static void println(double, int = 2); + static void println(void); + operator bool() { return true; } + + private: + static void printNumber(unsigned long, const uint8_t); + static void printFloat(double, uint8_t); + }; + + extern MarlinSerial customizedSerial; + +#endif // !USBCON + +// Use the UART for Bluetooth in AT90USB configurations +#if defined(USBCON) && ENABLED(BLUETOOTH) + extern HardwareSerial bluetoothSerial; +#endif + +#endif // _MARLINSERIAL_H_ diff --git a/Marlin/src/HAL/HAL_AVR/SanityCheck.h b/Marlin/src/HAL/HAL_AVR/SanityCheck.h new file mode 100644 index 0000000000..254da910c1 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/SanityCheck.h @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _SANITYCHECK_AVR_8_BIT_H_ +#define _SANITYCHECK_AVR_8_BIT_H_ + +/** + * Test AVR specific configuration values for errors at compile-time. + */ + +/** + * Digipot requirement + */ + #if ENABLED(DIGIPOT_MCP4018) + #if !defined(DIGIPOTS_I2C_SDA_X) || !defined(DIGIPOTS_I2C_SDA_Y) || !defined(DIGIPOTS_I2C_SDA_Z) \ + || !defined(DIGIPOTS_I2C_SDA_E0) || !defined(DIGIPOTS_I2C_SDA_E1) + #error "DIGIPOT_MCP4018 requires DIGIPOTS_I2C_SDA_* pins to be defined." + #endif +#endif + +/** + * Sanity checks for Spindle / Laser + */ +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !(WITHIN(SPINDLE_LASER_PWM_PIN, 2, 13) || WITHIN(SPINDLE_LASER_PWM_PIN, 44, 46)) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif SPINDLE_LASER_POWERUP_DELAY < 1 + #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." + #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13) + #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt." + #elif PIN_EXISTS(X_MAX) && X_MAX_PIN == SPINDLE_LASER_PWM_PIN + #error "SPINDLE_LASER_PWM pin is in use by X_MAX endstop." + #elif PIN_EXISTS(X_MIN) && X_MIN_PIN == SPINDLE_LASER_PWM_PIN + #error "SPINDLE_LASER_PWM pin is in use by X_MIN endstop." + #elif PIN_EXISTS(Z_STEP) && Z_STEP_PIN == SPINDLE_LASER_PWM_PIN + #error "SPINDLE_LASER_PWM pin in use by Z_STEP." + #elif NUM_SERVOS > 0 && (WITHIN(SPINDLE_LASER_PWM_PIN, 2, 3) || SPINDLE_LASER_PWM_PIN == 5) + #error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #elif PIN_EXISTS(MOTOR_CURRENT_PWM_XY) && SPINDLE_LASER_PWM_PIN == MOTOR_CURRENT_PWM_XY_PIN + #error "SPINDLE_LASER_PWM_PIN is used by MOTOR_CURRENT_PWM_XY." + #elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z) && SPINDLE_LASER_PWM_PIN == MOTOR_CURRENT_PWM_Z_PIN + #error "SPINDLE_LASER_PWM_PIN is used by MOTOR_CURRENT_PWM_Z." + #elif PIN_EXISTS(MOTOR_CURRENT_PWM_E) && SPINDLE_LASER_PWM_PIN == MOTOR_CURRENT_PWM_E_PIN + #error "SPINDLE_LASER_PWM_PIN is used by MOTOR_CURRENT_PWM_E." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +/** + * TMC2208 software UART and ENDSTOP_INTERRUPTS both use pin change interrupts (PCI) + */ +#if HAS_DRIVER(TMC2208) && ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && !( \ + defined(X_HARDWARE_SERIAL ) \ + || defined(X2_HARDWARE_SERIAL) \ + || defined(Y_HARDWARE_SERIAL ) \ + || defined(Y2_HARDWARE_SERIAL) \ + || defined(Z_HARDWARE_SERIAL ) \ + || defined(Z2_HARDWARE_SERIAL) \ + || defined(E0_HARDWARE_SERIAL) \ + || defined(E1_HARDWARE_SERIAL) \ + || defined(E2_HARDWARE_SERIAL) \ + || defined(E3_HARDWARE_SERIAL) \ + || defined(E4_HARDWARE_SERIAL) ) + #error "Select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE." +#endif + +#endif // _SANITYCHECK_AVR_8_BIT_H_ diff --git a/Marlin/src/HAL/HAL_AVR/ServoTimers.h b/Marlin/src/HAL/HAL_AVR/ServoTimers.h new file mode 100644 index 0000000000..4af997f1ef --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/ServoTimers.h @@ -0,0 +1,95 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * ServoTimers.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _SERVOTIMERS_H_ +#define _SERVOTIMERS_H_ + +/** + * Defines for 16 bit timers used with Servo library + * + * If _useTimerX is defined then TimerX is a 16 bit timer on the current board + * timer16_Sequence_t enumerates the sequence that the timers should be allocated + * _Nbr_16timers indicates how many 16 bit timers are available. + */ + +/** + * AVR Only definitions + * -------------------- + */ + +#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays +#define PRESCALER 8 // timer prescaler + +// Say which 16 bit timers can be used and in what order +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + //#define _useTimer1 + #define _useTimer3 + #define _useTimer4 + #if !HAS_MOTOR_CURRENT_PWM + #define _useTimer5 // Timer 5 is used for motor current PWM and can't be used for servos. + #endif +#elif defined(__AVR_ATmega32U4__) + #define _useTimer3 +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) + #define _useTimer3 +#elif defined(__AVR_ATmega128__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega2561__) + #define _useTimer3 +#else + // everything else +#endif + +typedef enum { + #if ENABLED(_useTimer1) + _timer1, + #endif + #if ENABLED(_useTimer3) + _timer3, + #endif + #if ENABLED(_useTimer4) + _timer4, + #endif + #if ENABLED(_useTimer5) + _timer5, + #endif + _Nbr_16timers +} timer16_Sequence_t; + +#endif // _SERVOTIMERS_H_ diff --git a/Marlin/src/HAL/HAL_AVR/endstop_interrupts.h b/Marlin/src/HAL/HAL_AVR/endstop_interrupts.h new file mode 100644 index 0000000000..358b97f6ab --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/endstop_interrupts.h @@ -0,0 +1,241 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate either an + * 'external interrupt' or a 'pin change interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../core/macros.h" +#include +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.update(); } + +/** + * Patch for pins_arduino.h (...\Arduino\hardware\arduino\avr\variants\mega\pins_arduino.h) + * + * These macros for the Arduino MEGA do not include the two connected pins on Port J (D13, D14). + * So we extend them here because these are the normal pins for Y_MIN and Y_MAX on RAMPS. + * There are more PCI-enabled processor pins on Port J, but they are not connected to Arduino MEGA. + */ +#if defined(ARDUINO_AVR_MEGA2560) || defined(ARDUINO_AVR_MEGA) + #undef digitalPinToPCICR + #define digitalPinToPCICR(p) ( WITHIN(p, 10, 15) || \ + WITHIN(p, 50, 53) || \ + WITHIN(p, 62, 69) ? &PCICR : (uint8_t*)0 ) + #undef digitalPinToPCICRbit + #define digitalPinToPCICRbit(p) ( WITHIN(p, 10, 13) || WITHIN(p, 50, 53) ? 0 : \ + WITHIN(p, 14, 15) ? 1 : \ + WITHIN(p, 62, 69) ? 2 : \ + 0 ) + #undef digitalPinToPCMSK + #define digitalPinToPCMSK(p) ( WITHIN(p, 10, 13) || WITHIN(p, 50, 53) ? &PCMSK0 : \ + WITHIN(p, 14, 15) ? &PCMSK1 : \ + WITHIN(p, 62, 69) ? &PCMSK2 : \ + (uint8_t *)0 ) + #undef digitalPinToPCMSKbit + #define digitalPinToPCMSKbit(p) ( WITHIN(p, 10, 13) ? ((p) - 6) : \ + (p) == 14 || (p) == 51 ? 2 : \ + (p) == 15 || (p) == 52 ? 1 : \ + (p) == 50 ? 3 : \ + (p) == 53 ? 0 : \ + WITHIN(p, 62, 69) ? ((p) - 62) : \ + 0 ) +#endif + + +// Install Pin change interrupt for a pin. Can be called multiple times. +void pciSetup(const int8_t pin) { + SBI(*digitalPinToPCMSK(pin), digitalPinToPCMSKbit(pin)); // enable pin + SBI(PCIFR, digitalPinToPCICRbit(pin)); // clear any outstanding interrupt + SBI(PCICR, digitalPinToPCICRbit(pin)); // enable interrupt for the group +} + + +// Handlers for pin change interrupts +#ifdef PCINT0_vect + ISR(PCINT0_vect) { endstop_ISR(); } +#endif + +#ifdef PCINT1_vect + ISR(PCINT1_vect) { endstop_ISR(); } +#endif + +#ifdef PCINT2_vect + ISR(PCINT2_vect) { endstop_ISR(); } +#endif + +#ifdef PCINT3_vect + ISR(PCINT3_vect) { endstop_ISR(); } +#endif + +void setup_endstop_interrupts( void ) { + + #if HAS_X_MAX + #if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT) // if pin has an external interrupt + attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); // assign it + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(X_MAX_PIN) != NULL, "X_MAX_PIN is not interrupt-capable"); // if pin has no pin change interrupt - error + pciSetup(X_MAX_PIN); // assign it + #endif + #endif + + #if HAS_X_MIN + #if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(X_MIN_PIN) != NULL, "X_MIN_PIN is not interrupt-capable"); + pciSetup(X_MIN_PIN); + #endif + #endif + + #if HAS_Y_MAX + #if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Y_MAX_PIN) != NULL, "Y_MAX_PIN is not interrupt-capable"); + pciSetup(Y_MAX_PIN); + #endif + #endif + + #if HAS_Y_MIN + #if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Y_MIN_PIN) != NULL, "Y_MIN_PIN is not interrupt-capable"); + pciSetup(Y_MIN_PIN); + #endif + #endif + + #if HAS_Z_MAX + #if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Z_MAX_PIN) != NULL, "Z_MAX_PIN is not interrupt-capable"); + pciSetup(Z_MAX_PIN); + #endif + #endif + + #if HAS_Z_MIN + #if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Z_MIN_PIN) != NULL, "Z_MIN_PIN is not interrupt-capable"); + pciSetup(Z_MIN_PIN); + #endif + #endif + + #if HAS_X2_MAX + #if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(X2_MAX_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(X2_MAX_PIN) != NULL, "X2_MAX_PIN is not interrupt-capable"); + pciSetup(X2_MAX_PIN); + #endif + #endif + + #if HAS_X2_MIN + #if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(X2_MIN_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(X2_MIN_PIN) != NULL, "X2_MIN_PIN is not interrupt-capable"); + pciSetup(X2_MIN_PIN); + #endif + #endif + + #if HAS_Y2_MAX + #if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Y2_MAX_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Y2_MAX_PIN) != NULL, "Y2_MAX_PIN is not interrupt-capable"); + pciSetup(Y2_MAX_PIN); + #endif + #endif + + #if HAS_Y2_MIN + #if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Y2_MIN_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Y2_MIN_PIN) != NULL, "Y2_MIN_PIN is not interrupt-capable"); + pciSetup(Y2_MIN_PIN); + #endif + #endif + + #if HAS_Z2_MAX + #if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Z2_MAX_PIN) != NULL, "Z2_MAX_PIN is not interrupt-capable"); + pciSetup(Z2_MAX_PIN); + #endif + #endif + + #if HAS_Z2_MIN + #if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Z2_MIN_PIN) != NULL, "Z2_MIN_PIN is not interrupt-capable"); + pciSetup(Z2_MIN_PIN); + #endif + #endif + + #if HAS_Z_MIN_PROBE_PIN + #if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT) + attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); + #else + // Not all used endstop/probe -pins can raise interrupts. Please deactivate ENDSTOP_INTERRUPTS or change the pin configuration! + static_assert(digitalPinToPCICR(Z_MIN_PROBE_PIN) != NULL, "Z_MIN_PROBE_PIN is not interrupt-capable"); + pciSetup(Z_MIN_PROBE_PIN); + #endif + #endif + + // If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI. +} + +#endif // _ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1280.h b/Marlin/src/HAL/HAL_AVR/fastio_1280.h similarity index 81% rename from Marlin/src/HAL/AVR/fastio/fastio_1280.h rename to Marlin/src/HAL/HAL_AVR/fastio_1280.h index f482f823e8..1c65f2bde7 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_1280.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_1280.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,20 +16,22 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Pin mapping for the 1280 and 2560 * - * Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 | 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100 - * Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 | E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx - * Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 78 79 80 xx xx 84 85 71 70 xx xx xx xx xx 81 82 83 xx xx 72 73 75 76 77 74 xx xx xx xx xx + * Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100 + * Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx + * Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx */ -#include "../fastio.h" +#ifndef _FASTIO_1280_H_ +#define _FASTIO_1280_H_ + +#include "fastio_AVR.h" // change for your board #define DEBUG_LED DIO21 @@ -71,13 +73,13 @@ #define DIO0_RPORT PINE #define DIO0_WPORT PORTE #define DIO0_DDR DDRE -#define DIO0_PWM nullptr +#define DIO0_PWM NULL #define DIO1_PIN PINE1 #define DIO1_RPORT PINE #define DIO1_WPORT PORTE #define DIO1_DDR DDRE -#define DIO1_PWM nullptr +#define DIO1_PWM NULL #define DIO2_PIN PINE4 #define DIO2_RPORT PINE @@ -137,13 +139,13 @@ #define DIO11_RPORT PINB #define DIO11_WPORT PORTB #define DIO11_DDR DDRB -#define DIO11_PWM nullptr +#define DIO11_PWM NULL #define DIO12_PIN PINB6 #define DIO12_RPORT PINB #define DIO12_WPORT PORTB #define DIO12_DDR DDRB -#define DIO12_PWM nullptr +#define DIO12_PWM NULL #define DIO13_PIN PINB7 #define DIO13_RPORT PINB @@ -155,181 +157,181 @@ #define DIO14_RPORT PINJ #define DIO14_WPORT PORTJ #define DIO14_DDR DDRJ -#define DIO14_PWM nullptr +#define DIO14_PWM NULL #define DIO15_PIN PINJ0 #define DIO15_RPORT PINJ #define DIO15_WPORT PORTJ #define DIO15_DDR DDRJ -#define DIO15_PWM nullptr +#define DIO15_PWM NULL #define DIO16_PIN PINH1 #define DIO16_RPORT PINH #define DIO16_WPORT PORTH #define DIO16_DDR DDRH -#define DIO16_PWM nullptr +#define DIO16_PWM NULL #define DIO17_PIN PINH0 #define DIO17_RPORT PINH #define DIO17_WPORT PORTH #define DIO17_DDR DDRH -#define DIO17_PWM nullptr +#define DIO17_PWM NULL #define DIO18_PIN PIND3 #define DIO18_RPORT PIND #define DIO18_WPORT PORTD #define DIO18_DDR DDRD -#define DIO18_PWM nullptr +#define DIO18_PWM NULL #define DIO19_PIN PIND2 #define DIO19_RPORT PIND #define DIO19_WPORT PORTD #define DIO19_DDR DDRD -#define DIO19_PWM nullptr +#define DIO19_PWM NULL #define DIO20_PIN PIND1 #define DIO20_RPORT PIND #define DIO20_WPORT PORTD #define DIO20_DDR DDRD -#define DIO20_PWM nullptr +#define DIO20_PWM NULL #define DIO21_PIN PIND0 #define DIO21_RPORT PIND #define DIO21_WPORT PORTD #define DIO21_DDR DDRD -#define DIO21_PWM nullptr +#define DIO21_PWM NULL #define DIO22_PIN PINA0 #define DIO22_RPORT PINA #define DIO22_WPORT PORTA #define DIO22_DDR DDRA -#define DIO22_PWM nullptr +#define DIO22_PWM NULL #define DIO23_PIN PINA1 #define DIO23_RPORT PINA #define DIO23_WPORT PORTA #define DIO23_DDR DDRA -#define DIO23_PWM nullptr +#define DIO23_PWM NULL #define DIO24_PIN PINA2 #define DIO24_RPORT PINA #define DIO24_WPORT PORTA #define DIO24_DDR DDRA -#define DIO24_PWM nullptr +#define DIO24_PWM NULL #define DIO25_PIN PINA3 #define DIO25_RPORT PINA #define DIO25_WPORT PORTA #define DIO25_DDR DDRA -#define DIO25_PWM nullptr +#define DIO25_PWM NULL #define DIO26_PIN PINA4 #define DIO26_RPORT PINA #define DIO26_WPORT PORTA #define DIO26_DDR DDRA -#define DIO26_PWM nullptr +#define DIO26_PWM NULL #define DIO27_PIN PINA5 #define DIO27_RPORT PINA #define DIO27_WPORT PORTA #define DIO27_DDR DDRA -#define DIO27_PWM nullptr +#define DIO27_PWM NULL #define DIO28_PIN PINA6 #define DIO28_RPORT PINA #define DIO28_WPORT PORTA #define DIO28_DDR DDRA -#define DIO28_PWM nullptr +#define DIO28_PWM NULL #define DIO29_PIN PINA7 #define DIO29_RPORT PINA #define DIO29_WPORT PORTA #define DIO29_DDR DDRA -#define DIO29_PWM nullptr +#define DIO29_PWM NULL #define DIO30_PIN PINC7 #define DIO30_RPORT PINC #define DIO30_WPORT PORTC #define DIO30_DDR DDRC -#define DIO30_PWM nullptr +#define DIO30_PWM NULL #define DIO31_PIN PINC6 #define DIO31_RPORT PINC #define DIO31_WPORT PORTC #define DIO31_DDR DDRC -#define DIO31_PWM nullptr +#define DIO31_PWM NULL #define DIO32_PIN PINC5 #define DIO32_RPORT PINC #define DIO32_WPORT PORTC #define DIO32_DDR DDRC -#define DIO32_PWM nullptr +#define DIO32_PWM NULL #define DIO33_PIN PINC4 #define DIO33_RPORT PINC #define DIO33_WPORT PORTC #define DIO33_DDR DDRC -#define DIO33_PWM nullptr +#define DIO33_PWM NULL #define DIO34_PIN PINC3 #define DIO34_RPORT PINC #define DIO34_WPORT PORTC #define DIO34_DDR DDRC -#define DIO34_PWM nullptr +#define DIO34_PWM NULL #define DIO35_PIN PINC2 #define DIO35_RPORT PINC #define DIO35_WPORT PORTC #define DIO35_DDR DDRC -#define DIO35_PWM nullptr +#define DIO35_PWM NULL #define DIO36_PIN PINC1 #define DIO36_RPORT PINC #define DIO36_WPORT PORTC #define DIO36_DDR DDRC -#define DIO36_PWM nullptr +#define DIO36_PWM NULL #define DIO37_PIN PINC0 #define DIO37_RPORT PINC #define DIO37_WPORT PORTC #define DIO37_DDR DDRC -#define DIO37_PWM nullptr +#define DIO37_PWM NULL #define DIO38_PIN PIND7 #define DIO38_RPORT PIND #define DIO38_WPORT PORTD #define DIO38_DDR DDRD -#define DIO38_PWM nullptr +#define DIO38_PWM NULL #define DIO39_PIN PING2 #define DIO39_RPORT PING #define DIO39_WPORT PORTG #define DIO39_DDR DDRG -#define DIO39_PWM nullptr +#define DIO39_PWM NULL #define DIO40_PIN PING1 #define DIO40_RPORT PING #define DIO40_WPORT PORTG #define DIO40_DDR DDRG -#define DIO40_PWM nullptr +#define DIO40_PWM NULL #define DIO41_PIN PING0 #define DIO41_RPORT PING #define DIO41_WPORT PORTG #define DIO41_DDR DDRG -#define DIO41_PWM nullptr +#define DIO41_PWM NULL #define DIO42_PIN PINL7 #define DIO42_RPORT PINL #define DIO42_WPORT PORTL #define DIO42_DDR DDRL -#define DIO42_PWM nullptr +#define DIO42_PWM NULL #define DIO43_PIN PINL6 #define DIO43_RPORT PINL #define DIO43_WPORT PORTL #define DIO43_DDR DDRL -#define DIO43_PWM nullptr +#define DIO43_PWM NULL #define DIO44_PIN PINL5 #define DIO44_RPORT PINL @@ -353,312 +355,309 @@ #define DIO47_RPORT PINL #define DIO47_WPORT PORTL #define DIO47_DDR DDRL -#define DIO47_PWM nullptr +#define DIO47_PWM NULL #define DIO48_PIN PINL1 #define DIO48_RPORT PINL #define DIO48_WPORT PORTL #define DIO48_DDR DDRL -#define DIO48_PWM nullptr +#define DIO48_PWM NULL #define DIO49_PIN PINL0 #define DIO49_RPORT PINL #define DIO49_WPORT PORTL #define DIO49_DDR DDRL -#define DIO49_PWM nullptr +#define DIO49_PWM NULL #define DIO50_PIN PINB3 #define DIO50_RPORT PINB #define DIO50_WPORT PORTB #define DIO50_DDR DDRB -#define DIO50_PWM nullptr +#define DIO50_PWM NULL #define DIO51_PIN PINB2 #define DIO51_RPORT PINB #define DIO51_WPORT PORTB #define DIO51_DDR DDRB -#define DIO51_PWM nullptr +#define DIO51_PWM NULL #define DIO52_PIN PINB1 #define DIO52_RPORT PINB #define DIO52_WPORT PORTB #define DIO52_DDR DDRB -#define DIO52_PWM nullptr +#define DIO52_PWM NULL #define DIO53_PIN PINB0 #define DIO53_RPORT PINB #define DIO53_WPORT PORTB #define DIO53_DDR DDRB -#define DIO53_PWM nullptr +#define DIO53_PWM NULL #define DIO54_PIN PINF0 #define DIO54_RPORT PINF #define DIO54_WPORT PORTF #define DIO54_DDR DDRF -#define DIO54_PWM nullptr +#define DIO54_PWM NULL #define DIO55_PIN PINF1 #define DIO55_RPORT PINF #define DIO55_WPORT PORTF #define DIO55_DDR DDRF -#define DIO55_PWM nullptr +#define DIO55_PWM NULL #define DIO56_PIN PINF2 #define DIO56_RPORT PINF #define DIO56_WPORT PORTF #define DIO56_DDR DDRF -#define DIO56_PWM nullptr +#define DIO56_PWM NULL #define DIO57_PIN PINF3 #define DIO57_RPORT PINF #define DIO57_WPORT PORTF #define DIO57_DDR DDRF -#define DIO57_PWM nullptr +#define DIO57_PWM NULL #define DIO58_PIN PINF4 #define DIO58_RPORT PINF #define DIO58_WPORT PORTF #define DIO58_DDR DDRF -#define DIO58_PWM nullptr +#define DIO58_PWM NULL #define DIO59_PIN PINF5 #define DIO59_RPORT PINF #define DIO59_WPORT PORTF #define DIO59_DDR DDRF -#define DIO59_PWM nullptr +#define DIO59_PWM NULL #define DIO60_PIN PINF6 #define DIO60_RPORT PINF #define DIO60_WPORT PORTF #define DIO60_DDR DDRF -#define DIO60_PWM nullptr +#define DIO60_PWM NULL #define DIO61_PIN PINF7 #define DIO61_RPORT PINF #define DIO61_WPORT PORTF #define DIO61_DDR DDRF -#define DIO61_PWM nullptr +#define DIO61_PWM NULL #define DIO62_PIN PINK0 #define DIO62_RPORT PINK #define DIO62_WPORT PORTK #define DIO62_DDR DDRK -#define DIO62_PWM nullptr +#define DIO62_PWM NULL #define DIO63_PIN PINK1 #define DIO63_RPORT PINK #define DIO63_WPORT PORTK #define DIO63_DDR DDRK -#define DIO63_PWM nullptr +#define DIO63_PWM NULL #define DIO64_PIN PINK2 #define DIO64_RPORT PINK #define DIO64_WPORT PORTK #define DIO64_DDR DDRK -#define DIO64_PWM nullptr +#define DIO64_PWM NULL #define DIO65_PIN PINK3 #define DIO65_RPORT PINK #define DIO65_WPORT PORTK #define DIO65_DDR DDRK -#define DIO65_PWM nullptr +#define DIO65_PWM NULL #define DIO66_PIN PINK4 #define DIO66_RPORT PINK #define DIO66_WPORT PORTK #define DIO66_DDR DDRK -#define DIO66_PWM nullptr +#define DIO66_PWM NULL #define DIO67_PIN PINK5 #define DIO67_RPORT PINK #define DIO67_WPORT PORTK #define DIO67_DDR DDRK -#define DIO67_PWM nullptr +#define DIO67_PWM NULL #define DIO68_PIN PINK6 #define DIO68_RPORT PINK #define DIO68_WPORT PORTK #define DIO68_DDR DDRK -#define DIO68_PWM nullptr +#define DIO68_PWM NULL #define DIO69_PIN PINK7 #define DIO69_RPORT PINK #define DIO69_WPORT PORTK #define DIO69_DDR DDRK -#define DIO69_PWM nullptr - -//#define FASTIO_EXT_START 70 -//#define FASTIO_EXT_END 85 +#define DIO69_PWM NULL #define DIO70_PIN PING4 #define DIO70_RPORT PING #define DIO70_WPORT PORTG #define DIO70_DDR DDRG -#define DIO70_PWM nullptr +#define DIO70_PWM NULL #define DIO71_PIN PING3 #define DIO71_RPORT PING #define DIO71_WPORT PORTG #define DIO71_DDR DDRG -#define DIO71_PWM nullptr +#define DIO71_PWM NULL #define DIO72_PIN PINJ2 #define DIO72_RPORT PINJ #define DIO72_WPORT PORTJ #define DIO72_DDR DDRJ -#define DIO72_PWM nullptr +#define DIO72_PWM NULL #define DIO73_PIN PINJ3 #define DIO73_RPORT PINJ #define DIO73_WPORT PORTJ #define DIO73_DDR DDRJ -#define DIO73_PWM nullptr +#define DIO73_PWM NULL #define DIO74_PIN PINJ7 #define DIO74_RPORT PINJ #define DIO74_WPORT PORTJ #define DIO74_DDR DDRJ -#define DIO74_PWM nullptr +#define DIO74_PWM NULL #define DIO75_PIN PINJ4 #define DIO75_RPORT PINJ #define DIO75_WPORT PORTJ #define DIO75_DDR DDRJ -#define DIO75_PWM nullptr +#define DIO75_PWM NULL #define DIO76_PIN PINJ5 #define DIO76_RPORT PINJ #define DIO76_WPORT PORTJ #define DIO76_DDR DDRJ -#define DIO76_PWM nullptr +#define DIO76_PWM NULL #define DIO77_PIN PINJ6 #define DIO77_RPORT PINJ #define DIO77_WPORT PORTJ #define DIO77_DDR DDRJ -#define DIO77_PWM nullptr +#define DIO77_PWM NULL #define DIO78_PIN PINE2 #define DIO78_RPORT PINE #define DIO78_WPORT PORTE #define DIO78_DDR DDRE -#define DIO78_PWM nullptr +#define DIO78_PWM NULL #define DIO79_PIN PINE6 #define DIO79_RPORT PINE #define DIO79_WPORT PORTE #define DIO79_DDR DDRE -#define DIO79_PWM nullptr +#define DIO79_PWM NULL #define DIO80_PIN PINE7 #define DIO80_RPORT PINE #define DIO80_WPORT PORTE #define DIO80_DDR DDRE -#define DIO80_PWM nullptr +#define DIO80_PWM NULL #define DIO81_PIN PIND4 #define DIO81_RPORT PIND #define DIO81_WPORT PORTD #define DIO81_DDR DDRD -#define DIO81_PWM nullptr +#define DIO81_PWM NULL #define DIO82_PIN PIND5 #define DIO82_RPORT PIND #define DIO82_WPORT PORTD #define DIO82_DDR DDRD -#define DIO82_PWM nullptr +#define DIO82_PWM NULL #define DIO83_PIN PIND6 #define DIO83_RPORT PIND #define DIO83_WPORT PORTD #define DIO83_DDR DDRD -#define DIO83_PWM nullptr +#define DIO83_PWM NULL #define DIO84_PIN PINH2 #define DIO84_RPORT PINH #define DIO84_WPORT PORTH #define DIO84_DDR DDRH -#define DIO84_PWM nullptr +#define DIO84_PWM NULL #define DIO85_PIN PINH7 #define DIO85_RPORT PINH #define DIO85_WPORT PORTH #define DIO85_DDR DDRH -#define DIO85_PWM nullptr +#define DIO85_PWM NULL #undef PA0 #define PA0_PIN PINA0 #define PA0_RPORT PINA #define PA0_WPORT PORTA #define PA0_DDR DDRA -#define PA0_PWM nullptr +#define PA0_PWM NULL #undef PA1 #define PA1_PIN PINA1 #define PA1_RPORT PINA #define PA1_WPORT PORTA #define PA1_DDR DDRA -#define PA1_PWM nullptr +#define PA1_PWM NULL #undef PA2 #define PA2_PIN PINA2 #define PA2_RPORT PINA #define PA2_WPORT PORTA #define PA2_DDR DDRA -#define PA2_PWM nullptr +#define PA2_PWM NULL #undef PA3 #define PA3_PIN PINA3 #define PA3_RPORT PINA #define PA3_WPORT PORTA #define PA3_DDR DDRA -#define PA3_PWM nullptr +#define PA3_PWM NULL #undef PA4 #define PA4_PIN PINA4 #define PA4_RPORT PINA #define PA4_WPORT PORTA #define PA4_DDR DDRA -#define PA4_PWM nullptr +#define PA4_PWM NULL #undef PA5 #define PA5_PIN PINA5 #define PA5_RPORT PINA #define PA5_WPORT PORTA #define PA5_DDR DDRA -#define PA5_PWM nullptr +#define PA5_PWM NULL #undef PA6 #define PA6_PIN PINA6 #define PA6_RPORT PINA #define PA6_WPORT PORTA #define PA6_DDR DDRA -#define PA6_PWM nullptr +#define PA6_PWM NULL #undef PA7 #define PA7_PIN PINA7 #define PA7_RPORT PINA #define PA7_WPORT PORTA #define PA7_DDR DDRA -#define PA7_PWM nullptr +#define PA7_PWM NULL #undef PB0 #define PB0_PIN PINB0 #define PB0_RPORT PINB #define PB0_WPORT PORTB #define PB0_DDR DDRB -#define PB0_PWM nullptr +#define PB0_PWM NULL #undef PB1 #define PB1_PIN PINB1 #define PB1_RPORT PINB #define PB1_WPORT PORTB #define PB1_DDR DDRB -#define PB1_PWM nullptr +#define PB1_PWM NULL #undef PB2 #define PB2_PIN PINB2 #define PB2_RPORT PINB #define PB2_WPORT PORTB #define PB2_DDR DDRB -#define PB2_PWM nullptr +#define PB2_PWM NULL #undef PB3 #define PB3_PIN PINB3 #define PB3_RPORT PINB #define PB3_WPORT PORTB #define PB3_DDR DDRB -#define PB3_PWM nullptr +#define PB3_PWM NULL #undef PB4 #define PB4_PIN PINB4 #define PB4_RPORT PINB @@ -670,13 +669,13 @@ #define PB5_RPORT PINB #define PB5_WPORT PORTB #define PB5_DDR DDRB -#define PB5_PWM nullptr +#define PB5_PWM NULL #undef PB6 #define PB6_PIN PINB6 #define PB6_RPORT PINB #define PB6_WPORT PORTB #define PB6_DDR DDRB -#define PB6_PWM nullptr +#define PB6_PWM NULL #undef PB7 #define PB7_PIN PINB7 #define PB7_RPORT PINB @@ -689,117 +688,117 @@ #define PC0_RPORT PINC #define PC0_WPORT PORTC #define PC0_DDR DDRC -#define PC0_PWM nullptr +#define PC0_PWM NULL #undef PC1 #define PC1_PIN PINC1 #define PC1_RPORT PINC #define PC1_WPORT PORTC #define PC1_DDR DDRC -#define PC1_PWM nullptr +#define PC1_PWM NULL #undef PC2 #define PC2_PIN PINC2 #define PC2_RPORT PINC #define PC2_WPORT PORTC #define PC2_DDR DDRC -#define PC2_PWM nullptr +#define PC2_PWM NULL #undef PC3 #define PC3_PIN PINC3 #define PC3_RPORT PINC #define PC3_WPORT PORTC #define PC3_DDR DDRC -#define PC3_PWM nullptr +#define PC3_PWM NULL #undef PC4 #define PC4_PIN PINC4 #define PC4_RPORT PINC #define PC4_WPORT PORTC #define PC4_DDR DDRC -#define PC4_PWM nullptr +#define PC4_PWM NULL #undef PC5 #define PC5_PIN PINC5 #define PC5_RPORT PINC #define PC5_WPORT PORTC #define PC5_DDR DDRC -#define PC5_PWM nullptr +#define PC5_PWM NULL #undef PC6 #define PC6_PIN PINC6 #define PC6_RPORT PINC #define PC6_WPORT PORTC #define PC6_DDR DDRC -#define PC6_PWM nullptr +#define PC6_PWM NULL #undef PC7 #define PC7_PIN PINC7 #define PC7_RPORT PINC #define PC7_WPORT PORTC #define PC7_DDR DDRC -#define PC7_PWM nullptr +#define PC7_PWM NULL #undef PD0 #define PD0_PIN PIND0 #define PD0_RPORT PIND #define PD0_WPORT PORTD #define PD0_DDR DDRD -#define PD0_PWM nullptr +#define PD0_PWM NULL #undef PD1 #define PD1_PIN PIND1 #define PD1_RPORT PIND #define PD1_WPORT PORTD #define PD1_DDR DDRD -#define PD1_PWM nullptr +#define PD1_PWM NULL #undef PD2 #define PD2_PIN PIND2 #define PD2_RPORT PIND #define PD2_WPORT PORTD #define PD2_DDR DDRD -#define PD2_PWM nullptr +#define PD2_PWM NULL #undef PD3 #define PD3_PIN PIND3 #define PD3_RPORT PIND #define PD3_WPORT PORTD #define PD3_DDR DDRD -#define PD3_PWM nullptr +#define PD3_PWM NULL #undef PD4 #define PD4_PIN PIND4 #define PD4_RPORT PIND #define PD4_WPORT PORTD #define PD4_DDR DDRD -#define PD4_PWM nullptr +#define PD4_PWM NULL #undef PD5 #define PD5_PIN PIND5 #define PD5_RPORT PIND #define PD5_WPORT PORTD #define PD5_DDR DDRD -#define PD5_PWM nullptr +#define PD5_PWM NULL #undef PD6 #define PD6_PIN PIND6 #define PD6_RPORT PIND #define PD6_WPORT PORTD #define PD6_DDR DDRD -#define PD6_PWM nullptr +#define PD6_PWM NULL #undef PD7 #define PD7_PIN PIND7 #define PD7_RPORT PIND #define PD7_WPORT PORTD #define PD7_DDR DDRD -#define PD7_PWM nullptr +#define PD7_PWM NULL #undef PE0 #define PE0_PIN PINE0 #define PE0_RPORT PINE #define PE0_WPORT PORTE #define PE0_DDR DDRE -#define PE0_PWM nullptr +#define PE0_PWM NULL #undef PE1 #define PE1_PIN PINE1 #define PE1_RPORT PINE #define PE1_WPORT PORTE #define PE1_DDR DDRE -#define PE1_PWM nullptr +#define PE1_PWM NULL #undef PE2 #define PE2_PIN PINE2 #define PE2_RPORT PINE #define PE2_WPORT PORTE #define PE2_DDR DDRE -#define PE2_PWM nullptr +#define PE2_PWM NULL #undef PE3 #define PE3_PIN PINE3 #define PE3_RPORT PINE @@ -823,93 +822,93 @@ #define PE6_RPORT PINE #define PE6_WPORT PORTE #define PE6_DDR DDRE -#define PE6_PWM nullptr +#define PE6_PWM NULL #undef PE7 #define PE7_PIN PINE7 #define PE7_RPORT PINE #define PE7_WPORT PORTE #define PE7_DDR DDRE -#define PE7_PWM nullptr +#define PE7_PWM NULL #undef PF0 #define PF0_PIN PINF0 #define PF0_RPORT PINF #define PF0_WPORT PORTF #define PF0_DDR DDRF -#define PF0_PWM nullptr +#define PF0_PWM NULL #undef PF1 #define PF1_PIN PINF1 #define PF1_RPORT PINF #define PF1_WPORT PORTF #define PF1_DDR DDRF -#define PF1_PWM nullptr +#define PF1_PWM NULL #undef PF2 #define PF2_PIN PINF2 #define PF2_RPORT PINF #define PF2_WPORT PORTF #define PF2_DDR DDRF -#define PF2_PWM nullptr +#define PF2_PWM NULL #undef PF3 #define PF3_PIN PINF3 #define PF3_RPORT PINF #define PF3_WPORT PORTF #define PF3_DDR DDRF -#define PF3_PWM nullptr +#define PF3_PWM NULL #undef PF4 #define PF4_PIN PINF4 #define PF4_RPORT PINF #define PF4_WPORT PORTF #define PF4_DDR DDRF -#define PF4_PWM nullptr +#define PF4_PWM NULL #undef PF5 #define PF5_PIN PINF5 #define PF5_RPORT PINF #define PF5_WPORT PORTF #define PF5_DDR DDRF -#define PF5_PWM nullptr +#define PF5_PWM NULL #undef PF6 #define PF6_PIN PINF6 #define PF6_RPORT PINF #define PF6_WPORT PORTF #define PF6_DDR DDRF -#define PF6_PWM nullptr +#define PF6_PWM NULL #undef PF7 #define PF7_PIN PINF7 #define PF7_RPORT PINF #define PF7_WPORT PORTF #define PF7_DDR DDRF -#define PF7_PWM nullptr +#define PF7_PWM NULL #undef PG0 #define PG0_PIN PING0 #define PG0_RPORT PING #define PG0_WPORT PORTG #define PG0_DDR DDRG -#define PG0_PWM nullptr +#define PG0_PWM NULL #undef PG1 #define PG1_PIN PING1 #define PG1_RPORT PING #define PG1_WPORT PORTG #define PG1_DDR DDRG -#define PG1_PWM nullptr +#define PG1_PWM NULL #undef PG2 #define PG2_PIN PING2 #define PG2_RPORT PING #define PG2_WPORT PORTG #define PG2_DDR DDRG -#define PG2_PWM nullptr +#define PG2_PWM NULL #undef PG3 #define PG3_PIN PING3 #define PG3_RPORT PING #define PG3_WPORT PORTG #define PG3_DDR DDRG -#define PG3_PWM nullptr +#define PG3_PWM NULL #undef PG4 #define PG4_PIN PING4 #define PG4_RPORT PING #define PG4_WPORT PORTG #define PG4_DDR DDRG -#define PG4_PWM nullptr +#define PG4_PWM NULL #undef PG5 #define PG5_PIN PING5 #define PG5_RPORT PING @@ -922,19 +921,19 @@ #define PH0_RPORT PINH #define PH0_WPORT PORTH #define PH0_DDR DDRH -#define PH0_PWM nullptr +#define PH0_PWM NULL #undef PH1 #define PH1_PIN PINH1 #define PH1_RPORT PINH #define PH1_WPORT PORTH #define PH1_DDR DDRH -#define PH1_PWM nullptr +#define PH1_PWM NULL #undef PH2 #define PH2_PIN PINH2 #define PH2_RPORT PINH #define PH2_WPORT PORTH #define PH2_DDR DDRH -#define PH2_PWM nullptr +#define PH2_PWM NULL #undef PH3 #define PH3_PIN PINH3 #define PH3_RPORT PINH @@ -964,124 +963,124 @@ #define PH7_RPORT PINH #define PH7_WPORT PORTH #define PH7_DDR DDRH -#define PH7_PWM nullptr +#define PH7_PWM NULL #undef PJ0 #define PJ0_PIN PINJ0 #define PJ0_RPORT PINJ #define PJ0_WPORT PORTJ #define PJ0_DDR DDRJ -#define PJ0_PWM nullptr +#define PJ0_PWM NULL #undef PJ1 #define PJ1_PIN PINJ1 #define PJ1_RPORT PINJ #define PJ1_WPORT PORTJ #define PJ1_DDR DDRJ -#define PJ1_PWM nullptr +#define PJ1_PWM NULL #undef PJ2 #define PJ2_PIN PINJ2 #define PJ2_RPORT PINJ #define PJ2_WPORT PORTJ #define PJ2_DDR DDRJ -#define PJ2_PWM nullptr +#define PJ2_PWM NULL #undef PJ3 #define PJ3_PIN PINJ3 #define PJ3_RPORT PINJ #define PJ3_WPORT PORTJ #define PJ3_DDR DDRJ -#define PJ3_PWM nullptr +#define PJ3_PWM NULL #undef PJ4 #define PJ4_PIN PINJ4 #define PJ4_RPORT PINJ #define PJ4_WPORT PORTJ #define PJ4_DDR DDRJ -#define PJ4_PWM nullptr +#define PJ4_PWM NULL #undef PJ5 #define PJ5_PIN PINJ5 #define PJ5_RPORT PINJ #define PJ5_WPORT PORTJ #define PJ5_DDR DDRJ -#define PJ5_PWM nullptr +#define PJ5_PWM NULL #undef PJ6 #define PJ6_PIN PINJ6 #define PJ6_RPORT PINJ #define PJ6_WPORT PORTJ #define PJ6_DDR DDRJ -#define PJ6_PWM nullptr +#define PJ6_PWM NULL #undef PJ7 #define PJ7_PIN PINJ7 #define PJ7_RPORT PINJ #define PJ7_WPORT PORTJ #define PJ7_DDR DDRJ -#define PJ7_PWM nullptr +#define PJ7_PWM NULL #undef PK0 #define PK0_PIN PINK0 #define PK0_RPORT PINK #define PK0_WPORT PORTK #define PK0_DDR DDRK -#define PK0_PWM nullptr +#define PK0_PWM NULL #undef PK1 #define PK1_PIN PINK1 #define PK1_RPORT PINK #define PK1_WPORT PORTK #define PK1_DDR DDRK -#define PK1_PWM nullptr +#define PK1_PWM NULL #undef PK2 #define PK2_PIN PINK2 #define PK2_RPORT PINK #define PK2_WPORT PORTK #define PK2_DDR DDRK -#define PK2_PWM nullptr +#define PK2_PWM NULL #undef PK3 #define PK3_PIN PINK3 #define PK3_RPORT PINK #define PK3_WPORT PORTK #define PK3_DDR DDRK -#define PK3_PWM nullptr +#define PK3_PWM NULL #undef PK4 #define PK4_PIN PINK4 #define PK4_RPORT PINK #define PK4_WPORT PORTK #define PK4_DDR DDRK -#define PK4_PWM nullptr +#define PK4_PWM NULL #undef PK5 #define PK5_PIN PINK5 #define PK5_RPORT PINK #define PK5_WPORT PORTK #define PK5_DDR DDRK -#define PK5_PWM nullptr +#define PK5_PWM NULL #undef PK6 #define PK6_PIN PINK6 #define PK6_RPORT PINK #define PK6_WPORT PORTK #define PK6_DDR DDRK -#define PK6_PWM nullptr +#define PK6_PWM NULL #undef PK7 #define PK7_PIN PINK7 #define PK7_RPORT PINK #define PK7_WPORT PORTK #define PK7_DDR DDRK -#define PK7_PWM nullptr +#define PK7_PWM NULL #undef PL0 #define PL0_PIN PINL0 #define PL0_RPORT PINL #define PL0_WPORT PORTL #define PL0_DDR DDRL -#define PL0_PWM nullptr +#define PL0_PWM NULL #undef PL1 #define PL1_PIN PINL1 #define PL1_RPORT PINL #define PL1_WPORT PORTL #define PL1_DDR DDRL -#define PL1_PWM nullptr +#define PL1_PWM NULL #undef PL2 #define PL2_PIN PINL2 #define PL2_RPORT PINL #define PL2_WPORT PORTL #define PL2_DDR DDRL -#define PL2_PWM nullptr +#define PL2_PWM NULL #undef PL3 #define PL3_PIN PINL3 #define PL3_RPORT PINL @@ -1105,10 +1104,12 @@ #define PL6_RPORT PINL #define PL6_WPORT PORTL #define PL6_DDR DDRL -#define PL6_PWM nullptr +#define PL6_PWM NULL #undef PL7 #define PL7_PIN PINL7 #define PL7_RPORT PINL #define PL7_WPORT PORTL #define PL7_DDR DDRL -#define PL7_PWM nullptr +#define PL7_PWM NULL + +#endif // _FASTIO_1280_H_ diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1281.h b/Marlin/src/HAL/HAL_AVR/fastio_1281.h similarity index 82% rename from Marlin/src/HAL/AVR/fastio/fastio_1281.h rename to Marlin/src/HAL/HAL_AVR/fastio_1281.h index e0bc5e2995..94ab6b7553 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_1281.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_1281.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Pin mapping for the 1281 and 2561 @@ -28,7 +27,10 @@ * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 G0 G1 G2 G3 G4 G5 */ -#include "../fastio.h" +#ifndef _FASTIO_1281_H_ +#define _FASTIO_1281_H_ + +#include "fastio_AVR.h" // change for your board #define DEBUG_LED DIO46 @@ -63,13 +65,13 @@ #define DIO0_RPORT PINE #define DIO0_WPORT PORTE #define DIO0_DDR DDRE -#define DIO0_PWM nullptr +#define DIO0_PWM NULL #define DIO1_PIN PINE1 #define DIO1_RPORT PINE #define DIO1_WPORT PORTE #define DIO1_DDR DDRE -#define DIO1_PWM nullptr +#define DIO1_PWM NULL #define DIO2_PIN PINE4 #define DIO2_RPORT PINE @@ -123,339 +125,339 @@ #define DIO10_RPORT PINB #define DIO10_WPORT PORTB #define DIO10_DDR DDRB -#define DIO10_PWM nullptr +#define DIO10_PWM NULL #define DIO11_PIN PINB2 #define DIO11_RPORT PINB #define DIO11_WPORT PORTB #define DIO11_DDR DDRB -#define DIO11_PWM nullptr +#define DIO11_PWM NULL #define DIO12_PIN PINB3 #define DIO12_RPORT PINB #define DIO12_WPORT PORTB #define DIO12_DDR DDRB -#define DIO12_PWM nullptr +#define DIO12_PWM NULL #define DIO13_PIN PINE2 #define DIO13_RPORT PINE #define DIO13_WPORT PORTE #define DIO13_DDR DDRE -#define DIO13_PWM nullptr +#define DIO13_PWM NULL #define DIO14_PIN PINE6 #define DIO14_RPORT PINE #define DIO14_WPORT PORTE #define DIO14_DDR DDRE -#define DIO14_PWM nullptr +#define DIO14_PWM NULL #define DIO15_PIN PINE7 #define DIO15_RPORT PINE #define DIO15_WPORT PORTE #define DIO15_DDR DDRE -#define DIO15_PWM nullptr +#define DIO15_PWM NULL #define DIO16_PIN PINB0 #define DIO16_RPORT PINB #define DIO16_WPORT PORTB #define DIO16_DDR DDRB -#define DIO16_PWM nullptr +#define DIO16_PWM NULL #define DIO17_PIN PIND0 #define DIO17_RPORT PIND #define DIO17_WPORT PORTD #define DIO17_DDR DDRD -#define DIO17_PWM nullptr +#define DIO17_PWM NULL #define DIO18_PIN PIND1 #define DIO18_RPORT PIND #define DIO18_WPORT PORTD #define DIO18_DDR DDRD -#define DIO18_PWM nullptr +#define DIO18_PWM NULL #define DIO19_PIN PIND2 #define DIO19_RPORT PIND #define DIO19_WPORT PORTD #define DIO19_DDR DDRD -#define DIO19_PWM nullptr +#define DIO19_PWM NULL #define DIO20_PIN PIND3 #define DIO20_RPORT PIND #define DIO20_WPORT PORTD #define DIO20_DDR DDRD -#define DIO20_PWM nullptr +#define DIO20_PWM NULL #define DIO21_PIN PIND4 #define DIO21_RPORT PIND #define DIO21_WPORT PORTD #define DIO21_DDR DDRD -#define DIO21_PWM nullptr +#define DIO21_PWM NULL #define DIO22_PIN PIND5 #define DIO22_RPORT PIND #define DIO22_WPORT PORTD #define DIO22_DDR DDRD -#define DIO22_PWM nullptr +#define DIO22_PWM NULL #define DIO23_PIN PIND6 #define DIO23_RPORT PIND #define DIO23_WPORT PORTD #define DIO23_DDR DDRD -#define DIO23_PWM nullptr +#define DIO23_PWM NULL #define DIO24_PIN PIND7 #define DIO24_RPORT PIND #define DIO24_WPORT PORTD #define DIO24_DDR DDRD -#define DIO24_PWM nullptr +#define DIO24_PWM NULL #define DIO25_PIN PING0 #define DIO25_RPORT PING #define DIO25_WPORT PORTG #define DIO25_DDR DDRG -#define DIO25_PWM nullptr +#define DIO25_PWM NULL #define DIO26_PIN PING1 #define DIO26_RPORT PING #define DIO26_WPORT PORTG #define DIO26_DDR DDRG -#define DIO26_PWM nullptr +#define DIO26_PWM NULL #define DIO27_PIN PING2 #define DIO27_RPORT PING #define DIO27_WPORT PORTG #define DIO27_DDR DDRG -#define DIO27_PWM nullptr +#define DIO27_PWM NULL #define DIO28_PIN PING3 #define DIO28_RPORT PING #define DIO28_WPORT PORTG #define DIO28_DDR DDRG -#define DIO28_PWM nullptr +#define DIO28_PWM NULL #define DIO29_PIN PING4 #define DIO29_RPORT PING #define DIO29_WPORT PORTG #define DIO29_DDR DDRG -#define DIO29_PWM nullptr +#define DIO29_PWM NULL #define DIO30_PIN PINC0 #define DIO30_RPORT PINC #define DIO30_WPORT PORTC #define DIO30_DDR DDRC -#define DIO30_PWM nullptr +#define DIO30_PWM NULL #define DIO31_PIN PINC1 #define DIO31_RPORT PINC #define DIO31_WPORT PORTC #define DIO31_DDR DDRC -#define DIO31_PWM nullptr +#define DIO31_PWM NULL #define DIO32_PIN PINC2 #define DIO32_RPORT PINC #define DIO32_WPORT PORTC #define DIO32_DDR DDRC -#define DIO32_PWM nullptr +#define DIO32_PWM NULL #define DIO33_PIN PINC3 #define DIO33_RPORT PINC #define DIO33_WPORT PORTC #define DIO33_DDR DDRC -#define DIO33_PWM nullptr +#define DIO33_PWM NULL #define DIO34_PIN PINC4 #define DIO34_RPORT PINC #define DIO34_WPORT PORTC #define DIO34_DDR DDRC -#define DIO34_PWM nullptr +#define DIO34_PWM NULL #define DIO35_PIN PINC5 #define DIO35_RPORT PINC #define DIO35_WPORT PORTC #define DIO35_DDR DDRC -#define DIO35_PWM nullptr +#define DIO35_PWM NULL #define DIO36_PIN PINC6 #define DIO36_RPORT PINC #define DIO36_WPORT PORTC #define DIO36_DDR DDRC -#define DIO36_PWM nullptr +#define DIO36_PWM NULL #define DIO37_PIN PINC7 #define DIO37_RPORT PINC #define DIO37_WPORT PORTC #define DIO37_DDR DDRC -#define DIO37_PWM nullptr +#define DIO37_PWM NULL #define DIO38_PIN PINA0 #define DIO38_RPORT PINA #define DIO38_WPORT PORTA #define DIO38_DDR DDRA -#define DIO38_PWM nullptr +#define DIO38_PWM NULL #define DIO39_PIN PINA1 #define DIO39_RPORT PINA #define DIO39_WPORT PORTA #define DIO39_DDR DDRA -#define DIO39_PWM nullptr +#define DIO39_PWM NULL #define DIO40_PIN PINA2 #define DIO40_RPORT PINA #define DIO40_WPORT PORTA #define DIO40_DDR DDRA -#define DIO40_PWM nullptr +#define DIO40_PWM NULL #define DIO41_PIN PINA3 #define DIO41_RPORT PINA #define DIO41_WPORT PORTA #define DIO41_DDR DDRA -#define DIO41_PWM nullptr +#define DIO41_PWM NULL #define DIO42_PIN PINA4 #define DIO42_RPORT PINA #define DIO42_WPORT PORTA #define DIO42_DDR DDRA -#define DIO42_PWM nullptr +#define DIO42_PWM NULL #define DIO43_PIN PINA5 #define DIO43_RPORT PINA #define DIO43_WPORT PORTA #define DIO43_DDR DDRA -#define DIO43_PWM nullptr +#define DIO43_PWM NULL #define DIO44_PIN PINA6 #define DIO44_RPORT PINA #define DIO44_WPORT PORTA #define DIO44_DDR DDRA -#define DIO44_PWM nullptr +#define DIO44_PWM NULL #define DIO45_PIN PINA7 #define DIO45_RPORT PINA #define DIO45_WPORT PORTA #define DIO45_DDR DDRA -#define DIO45_PWM nullptr +#define DIO45_PWM NULL #define DIO46_PIN PINF0 #define DIO46_RPORT PINF #define DIO46_WPORT PORTF #define DIO46_DDR DDRF -#define DIO46_PWM nullptr +#define DIO46_PWM NULL #define DIO47_PIN PINF1 #define DIO47_RPORT PINF #define DIO47_WPORT PORTF #define DIO47_DDR DDRF -#define DIO47_PWM nullptr +#define DIO47_PWM NULL #define DIO48_PIN PINF2 #define DIO48_RPORT PINF #define DIO48_WPORT PORTF #define DIO48_DDR DDRF -#define DIO48_PWM nullptr +#define DIO48_PWM NULL #define DIO49_PIN PINF3 #define DIO49_RPORT PINF #define DIO49_WPORT PORTF #define DIO49_DDR DDRF -#define DIO49_PWM nullptr +#define DIO49_PWM NULL #define DIO50_PIN PINF4 #define DIO50_RPORT PINF #define DIO50_WPORT PORTF #define DIO50_DDR DDRF -#define DIO50_PWM nullptr +#define DIO50_PWM NULL #define DIO51_PIN PINF5 #define DIO51_RPORT PINF #define DIO51_WPORT PORTF #define DIO51_DDR DDRF -#define DIO51_PWM nullptr +#define DIO51_PWM NULL #define DIO52_PIN PINF6 #define DIO52_RPORT PINF #define DIO52_WPORT PORTF #define DIO52_DDR DDRF -#define DIO52_PWM nullptr +#define DIO52_PWM NULL #define DIO53_PIN PINF7 #define DIO53_RPORT PINF #define DIO53_WPORT PORTF #define DIO53_DDR DDRF -#define DIO53_PWM nullptr +#define DIO53_PWM NULL #undef PA0 #define PA0_PIN PINA0 #define PA0_RPORT PINA #define PA0_WPORT PORTA #define PA0_DDR DDRA -#define PA0_PWM nullptr +#define PA0_PWM NULL #undef PA1 #define PA1_PIN PINA1 #define PA1_RPORT PINA #define PA1_WPORT PORTA #define PA1_DDR DDRA -#define PA1_PWM nullptr +#define PA1_PWM NULL #undef PA2 #define PA2_PIN PINA2 #define PA2_RPORT PINA #define PA2_WPORT PORTA #define PA2_DDR DDRA -#define PA2_PWM nullptr +#define PA2_PWM NULL #undef PA3 #define PA3_PIN PINA3 #define PA3_RPORT PINA #define PA3_WPORT PORTA #define PA3_DDR DDRA -#define PA3_PWM nullptr +#define PA3_PWM NULL #undef PA4 #define PA4_PIN PINA4 #define PA4_RPORT PINA #define PA4_WPORT PORTA #define PA4_DDR DDRA -#define PA4_PWM nullptr +#define PA4_PWM NULL #undef PA5 #define PA5_PIN PINA5 #define PA5_RPORT PINA #define PA5_WPORT PORTA #define PA5_DDR DDRA -#define PA5_PWM nullptr +#define PA5_PWM NULL #undef PA6 #define PA6_PIN PINA6 #define PA6_RPORT PINA #define PA6_WPORT PORTA #define PA6_DDR DDRA -#define PA6_PWM nullptr +#define PA6_PWM NULL #undef PA7 #define PA7_PIN PINA7 #define PA7_RPORT PINA #define PA7_WPORT PORTA #define PA7_DDR DDRA -#define PA7_PWM nullptr +#define PA7_PWM NULL #undef PB0 #define PB0_PIN PINB0 #define PB0_RPORT PINB #define PB0_WPORT PORTB #define PB0_DDR DDRB -#define PB0_PWM nullptr +#define PB0_PWM NULL #undef PB1 #define PB1_PIN PINB1 #define PB1_RPORT PINB #define PB1_WPORT PORTB #define PB1_DDR DDRB -#define PB1_PWM nullptr +#define PB1_PWM NULL #undef PB2 #define PB2_PIN PINB2 #define PB2_RPORT PINB #define PB2_WPORT PORTB #define PB2_DDR DDRB -#define PB2_PWM nullptr +#define PB2_PWM NULL #undef PB3 #define PB3_PIN PINB3 #define PB3_RPORT PINB #define PB3_WPORT PORTB #define PB3_DDR DDRB -#define PB3_PWM nullptr +#define PB3_PWM NULL #undef PB4 #define PB4_PIN PINB4 #define PB4_RPORT PINB @@ -467,13 +469,13 @@ #define PB5_RPORT PINB #define PB5_WPORT PORTB #define PB5_DDR DDRB -#define PB5_PWM nullptr +#define PB5_PWM NULL #undef PB6 #define PB6_PIN PINB6 #define PB6_RPORT PINB #define PB6_WPORT PORTB #define PB6_DDR DDRB -#define PB6_PWM nullptr +#define PB6_PWM NULL #undef PB7 #define PB7_PIN PINB7 #define PB7_RPORT PINB @@ -486,117 +488,117 @@ #define PC0_RPORT PINC #define PC0_WPORT PORTC #define PC0_DDR DDRC -#define PC0_PWM nullptr +#define PC0_PWM NULL #undef PC1 #define PC1_PIN PINC1 #define PC1_RPORT PINC #define PC1_WPORT PORTC #define PC1_DDR DDRC -#define PC1_PWM nullptr +#define PC1_PWM NULL #undef PC2 #define PC2_PIN PINC2 #define PC2_RPORT PINC #define PC2_WPORT PORTC #define PC2_DDR DDRC -#define PC2_PWM nullptr +#define PC2_PWM NULL #undef PC3 #define PC3_PIN PINC3 #define PC3_RPORT PINC #define PC3_WPORT PORTC #define PC3_DDR DDRC -#define PC3_PWM nullptr +#define PC3_PWM NULL #undef PC4 #define PC4_PIN PINC4 #define PC4_RPORT PINC #define PC4_WPORT PORTC #define PC4_DDR DDRC -#define PC4_PWM nullptr +#define PC4_PWM NULL #undef PC5 #define PC5_PIN PINC5 #define PC5_RPORT PINC #define PC5_WPORT PORTC #define PC5_DDR DDRC -#define PC5_PWM nullptr +#define PC5_PWM NULL #undef PC6 #define PC6_PIN PINC6 #define PC6_RPORT PINC #define PC6_WPORT PORTC #define PC6_DDR DDRC -#define PC6_PWM nullptr +#define PC6_PWM NULL #undef PC7 #define PC7_PIN PINC7 #define PC7_RPORT PINC #define PC7_WPORT PORTC #define PC7_DDR DDRC -#define PC7_PWM nullptr +#define PC7_PWM NULL #undef PD0 #define PD0_PIN PIND0 #define PD0_RPORT PIND #define PD0_WPORT PORTD #define PD0_DDR DDRD -#define PD0_PWM nullptr +#define PD0_PWM NULL #undef PD1 #define PD1_PIN PIND1 #define PD1_RPORT PIND #define PD1_WPORT PORTD #define PD1_DDR DDRD -#define PD1_PWM nullptr +#define PD1_PWM NULL #undef PD2 #define PD2_PIN PIND2 #define PD2_RPORT PIND #define PD2_WPORT PORTD #define PD2_DDR DDRD -#define PD2_PWM nullptr +#define PD2_PWM NULL #undef PD3 #define PD3_PIN PIND3 #define PD3_RPORT PIND #define PD3_WPORT PORTD #define PD3_DDR DDRD -#define PD3_PWM nullptr +#define PD3_PWM NULL #undef PD4 #define PD4_PIN PIND4 #define PD4_RPORT PIND #define PD4_WPORT PORTD #define PD4_DDR DDRD -#define PD4_PWM nullptr +#define PD4_PWM NULL #undef PD5 #define PD5_PIN PIND5 #define PD5_RPORT PIND #define PD5_WPORT PORTD #define PD5_DDR DDRD -#define PD5_PWM nullptr +#define PD5_PWM NULL #undef PD6 #define PD6_PIN PIND6 #define PD6_RPORT PIND #define PD6_WPORT PORTD #define PD6_DDR DDRD -#define PD6_PWM nullptr +#define PD6_PWM NULL #undef PD7 #define PD7_PIN PIND7 #define PD7_RPORT PIND #define PD7_WPORT PORTD #define PD7_DDR DDRD -#define PD7_PWM nullptr +#define PD7_PWM NULL #undef PE0 #define PE0_PIN PINE0 #define PE0_RPORT PINE #define PE0_WPORT PORTE #define PE0_DDR DDRE -#define PE0_PWM nullptr +#define PE0_PWM NULL #undef PE1 #define PE1_PIN PINE1 #define PE1_RPORT PINE #define PE1_WPORT PORTE #define PE1_DDR DDRE -#define PE1_PWM nullptr +#define PE1_PWM NULL #undef PE2 #define PE2_PIN PINE2 #define PE2_RPORT PINE #define PE2_WPORT PORTE #define PE2_DDR DDRE -#define PE2_PWM nullptr +#define PE2_PWM NULL #undef PE3 #define PE3_PIN PINE3 #define PE3_RPORT PINE @@ -620,96 +622,98 @@ #define PE6_RPORT PINE #define PE6_WPORT PORTE #define PE6_DDR DDRE -#define PE6_PWM nullptr +#define PE6_PWM NULL #undef PE7 #define PE7_PIN PINE7 #define PE7_RPORT PINE #define PE7_WPORT PORTE #define PE7_DDR DDRE -#define PE7_PWM nullptr +#define PE7_PWM NULL #undef PF0 #define PF0_PIN PINF0 #define PF0_RPORT PINF #define PF0_WPORT PORTF #define PF0_DDR DDRF -#define PF0_PWM nullptr +#define PF0_PWM NULL #undef PF1 #define PF1_PIN PINF1 #define PF1_RPORT PINF #define PF1_WPORT PORTF #define PF1_DDR DDRF -#define PF1_PWM nullptr +#define PF1_PWM NULL #undef PF2 #define PF2_PIN PINF2 #define PF2_RPORT PINF #define PF2_WPORT PORTF #define PF2_DDR DDRF -#define PF2_PWM nullptr +#define PF2_PWM NULL #undef PF3 #define PF3_PIN PINF3 #define PF3_RPORT PINF #define PF3_WPORT PORTF #define PF3_DDR DDRF -#define PF3_PWM nullptr +#define PF3_PWM NULL #undef PF4 #define PF4_PIN PINF4 #define PF4_RPORT PINF #define PF4_WPORT PORTF #define PF4_DDR DDRF -#define PF4_PWM nullptr +#define PF4_PWM NULL #undef PF5 #define PF5_PIN PINF5 #define PF5_RPORT PINF #define PF5_WPORT PORTF #define PF5_DDR DDRF -#define PF5_PWM nullptr +#define PF5_PWM NULL #undef PF6 #define PF6_PIN PINF6 #define PF6_RPORT PINF #define PF6_WPORT PORTF #define PF6_DDR DDRF -#define PF6_PWM nullptr +#define PF6_PWM NULL #undef PF7 #define PF7_PIN PINF7 #define PF7_RPORT PINF #define PF7_WPORT PORTF #define PF7_DDR DDRF -#define PF7_PWM nullptr +#define PF7_PWM NULL #undef PG0 #define PG0_PIN PING0 #define PG0_RPORT PING #define PG0_WPORT PORTG #define PG0_DDR DDRG -#define PG0_PWM nullptr +#define PG0_PWM NULL #undef PG1 #define PG1_PIN PING1 #define PG1_RPORT PING #define PG1_WPORT PORTG #define PG1_DDR DDRG -#define PG1_PWM nullptr +#define PG1_PWM NULL #undef PG2 #define PG2_PIN PING2 #define PG2_RPORT PING #define PG2_WPORT PORTG #define PG2_DDR DDRG -#define PG2_PWM nullptr +#define PG2_PWM NULL #undef PG3 #define PG3_PIN PING3 #define PG3_RPORT PING #define PG3_WPORT PORTG #define PG3_DDR DDRG -#define PG3_PWM nullptr +#define PG3_PWM NULL #undef PG4 #define PG4_PIN PING4 #define PG4_RPORT PING #define PG4_WPORT PORTG #define PG4_DDR DDRG -#define PG4_PWM nullptr +#define PG4_PWM NULL #undef PG5 #define PG5_PIN PING5 #define PG5_RPORT PING #define PG5_WPORT PORTG #define PG5_DDR DDRG #define PG5_PWM &OCR0B + +#endif // _FASTIO_1281_H_ diff --git a/Marlin/src/HAL/AVR/fastio/fastio_168.h b/Marlin/src/HAL/HAL_AVR/fastio_168.h similarity index 83% rename from Marlin/src/HAL/AVR/fastio/fastio_168.h rename to Marlin/src/HAL/HAL_AVR/fastio_168.h index 8cfdd1e8f8..33492d15dc 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_168.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_168.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Pin mapping for the 168, 328, and 328P @@ -28,7 +27,10 @@ * Port: B0 B1 B2 B3 B4 B5 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 */ -#include "../fastio.h" +#ifndef _FASTIO_168_H_ +#define _FASTIO_168_H_ + +#include "fastio_AVR.h" #define DEBUG_LED AIO5 @@ -60,19 +62,19 @@ #define DIO0_RPORT PIND #define DIO0_WPORT PORTD #define DIO0_DDR DDRD -#define DIO0_PWM nullptr +#define DIO0_PWM NULL #define DIO1_PIN PIND1 #define DIO1_RPORT PIND #define DIO1_WPORT PORTD #define DIO1_DDR DDRD -#define DIO1_PWM nullptr +#define DIO1_PWM NULL #define DIO2_PIN PIND2 #define DIO2_RPORT PIND #define DIO2_WPORT PORTD #define DIO2_DDR DDRD -#define DIO2_PWM nullptr +#define DIO2_PWM NULL #define DIO3_PIN PIND3 #define DIO3_RPORT PIND @@ -84,7 +86,7 @@ #define DIO4_RPORT PIND #define DIO4_WPORT PORTD #define DIO4_DDR DDRD -#define DIO4_PWM nullptr +#define DIO4_PWM NULL #define DIO5_PIN PIND5 #define DIO5_RPORT PIND @@ -102,25 +104,25 @@ #define DIO7_RPORT PIND #define DIO7_WPORT PORTD #define DIO7_DDR DDRD -#define DIO7_PWM nullptr +#define DIO7_PWM NULL #define DIO8_PIN PINB0 #define DIO8_RPORT PINB #define DIO8_WPORT PORTB #define DIO8_DDR DDRB -#define DIO8_PWM nullptr +#define DIO8_PWM NULL #define DIO9_PIN PINB1 #define DIO9_RPORT PINB #define DIO9_WPORT PORTB #define DIO9_DDR DDRB -#define DIO9_PWM nullptr +#define DIO9_PWM NULL #define DIO10_PIN PINB2 #define DIO10_RPORT PINB #define DIO10_WPORT PORTB #define DIO10_DDR DDRB -#define DIO10_PWM nullptr +#define DIO10_PWM NULL #define DIO11_PIN PINB3 #define DIO11_RPORT PINB @@ -132,82 +134,82 @@ #define DIO12_RPORT PINB #define DIO12_WPORT PORTB #define DIO12_DDR DDRB -#define DIO12_PWM nullptr +#define DIO12_PWM NULL #define DIO13_PIN PINB5 #define DIO13_RPORT PINB #define DIO13_WPORT PORTB #define DIO13_DDR DDRB -#define DIO13_PWM nullptr +#define DIO13_PWM NULL #define DIO14_PIN PINC0 #define DIO14_RPORT PINC #define DIO14_WPORT PORTC #define DIO14_DDR DDRC -#define DIO14_PWM nullptr +#define DIO14_PWM NULL #define DIO15_PIN PINC1 #define DIO15_RPORT PINC #define DIO15_WPORT PORTC #define DIO15_DDR DDRC -#define DIO15_PWM nullptr +#define DIO15_PWM NULL #define DIO16_PIN PINC2 #define DIO16_RPORT PINC #define DIO16_WPORT PORTC #define DIO16_DDR DDRC -#define DIO16_PWM nullptr +#define DIO16_PWM NULL #define DIO17_PIN PINC3 #define DIO17_RPORT PINC #define DIO17_WPORT PORTC #define DIO17_DDR DDRC -#define DIO17_PWM nullptr +#define DIO17_PWM NULL #define DIO18_PIN PINC4 #define DIO18_RPORT PINC #define DIO18_WPORT PORTC #define DIO18_DDR DDRC -#define DIO18_PWM nullptr +#define DIO18_PWM NULL #define DIO19_PIN PINC5 #define DIO19_RPORT PINC #define DIO19_WPORT PORTC #define DIO19_DDR DDRC -#define DIO19_PWM nullptr +#define DIO19_PWM NULL #define DIO20_PIN PINC6 #define DIO20_RPORT PINC #define DIO20_WPORT PORTC #define DIO20_DDR DDRC -#define DIO20_PWM nullptr +#define DIO20_PWM NULL #define DIO21_PIN PINC7 #define DIO21_RPORT PINC #define DIO21_WPORT PORTC #define DIO21_DDR DDRC -#define DIO21_PWM nullptr +#define DIO21_PWM NULL #undef PB0 #define PB0_PIN PINB0 #define PB0_RPORT PINB #define PB0_WPORT PORTB #define PB0_DDR DDRB -#define PB0_PWM nullptr +#define PB0_PWM NULL #undef PB1 #define PB1_PIN PINB1 #define PB1_RPORT PINB #define PB1_WPORT PORTB #define PB1_DDR DDRB -#define PB1_PWM nullptr +#define PB1_PWM NULL #undef PB2 #define PB2_PIN PINB2 #define PB2_RPORT PINB #define PB2_WPORT PORTB #define PB2_DDR DDRB -#define PB2_PWM nullptr +#define PB2_PWM NULL #undef PB3 #define PB3_PIN PINB3 @@ -221,105 +223,105 @@ #define PB4_RPORT PINB #define PB4_WPORT PORTB #define PB4_DDR DDRB -#define PB4_PWM nullptr +#define PB4_PWM NULL #undef PB5 #define PB5_PIN PINB5 #define PB5_RPORT PINB #define PB5_WPORT PORTB #define PB5_DDR DDRB -#define PB5_PWM nullptr +#define PB5_PWM NULL #undef PB6 #define PB6_PIN PINB6 #define PB6_RPORT PINB #define PB6_WPORT PORTB #define PB6_DDR DDRB -#define PB6_PWM nullptr +#define PB6_PWM NULL #undef PB7 #define PB7_PIN PINB7 #define PB7_RPORT PINB #define PB7_WPORT PORTB #define PB7_DDR DDRB -#define PB7_PWM nullptr +#define PB7_PWM NULL #undef PC0 #define PC0_PIN PINC0 #define PC0_RPORT PINC #define PC0_WPORT PORTC #define PC0_DDR DDRC -#define PC0_PWM nullptr +#define PC0_PWM NULL #undef PC1 #define PC1_PIN PINC1 #define PC1_RPORT PINC #define PC1_WPORT PORTC #define PC1_DDR DDRC -#define PC1_PWM nullptr +#define PC1_PWM NULL #undef PC2 #define PC2_PIN PINC2 #define PC2_RPORT PINC #define PC2_WPORT PORTC #define PC2_DDR DDRC -#define PC2_PWM nullptr +#define PC2_PWM NULL #undef PC3 #define PC3_PIN PINC3 #define PC3_RPORT PINC #define PC3_WPORT PORTC #define PC3_DDR DDRC -#define PC3_PWM nullptr +#define PC3_PWM NULL #undef PC4 #define PC4_PIN PINC4 #define PC4_RPORT PINC #define PC4_WPORT PORTC #define PC4_DDR DDRC -#define PC4_PWM nullptr +#define PC4_PWM NULL #undef PC5 #define PC5_PIN PINC5 #define PC5_RPORT PINC #define PC5_WPORT PORTC #define PC5_DDR DDRC -#define PC5_PWM nullptr +#define PC5_PWM NULL #undef PC6 #define PC6_PIN PINC6 #define PC6_RPORT PINC #define PC6_WPORT PORTC #define PC6_DDR DDRC -#define PC6_PWM nullptr +#define PC6_PWM NULL #undef PC7 #define PC7_PIN PINC7 #define PC7_RPORT PINC #define PC7_WPORT PORTC #define PC7_DDR DDRC -#define PC7_PWM nullptr +#define PC7_PWM NULL #undef PD0 #define PD0_PIN PIND0 #define PD0_RPORT PIND #define PD0_WPORT PORTD #define PD0_DDR DDRD -#define PD0_PWM nullptr +#define PD0_PWM NULL #undef PD1 #define PD1_PIN PIND1 #define PD1_RPORT PIND #define PD1_WPORT PORTD #define PD1_DDR DDRD -#define PD1_PWM nullptr +#define PD1_PWM NULL #undef PD2 #define PD2_PIN PIND2 #define PD2_RPORT PIND #define PD2_WPORT PORTD #define PD2_DDR DDRD -#define PD2_PWM nullptr +#define PD2_PWM NULL #undef PD3 #define PD3_PIN PIND3 @@ -333,7 +335,7 @@ #define PD4_RPORT PIND #define PD4_WPORT PORTD #define PD4_DDR DDRD -#define PD4_PWM nullptr +#define PD4_PWM NULL #undef PD5 #define PD5_PIN PIND5 @@ -354,4 +356,6 @@ #define PD7_RPORT PIND #define PD7_WPORT PORTD #define PD7_DDR DDRD -#define PD7_PWM nullptr +#define PD7_PWM NULL + +#endif // _FASTIO_168_H_ diff --git a/Marlin/src/HAL/AVR/fastio/fastio_644.h b/Marlin/src/HAL/HAL_AVR/fastio_644.h similarity index 82% rename from Marlin/src/HAL/AVR/fastio/fastio_644.h rename to Marlin/src/HAL/HAL_AVR/fastio_644.h index f4a9427e0a..171172023b 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_644.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_644.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Pin mapping for the 644, 644p, 644pa, and 1284p @@ -54,7 +53,10 @@ * +--------+ */ -#include "../fastio.h" +#ifndef _FASTIO_644_H_ +#define _FASTIO_644_H_ + +#include "fastio_AVR.h" #define DEBUG_LED DIO0 @@ -91,462 +93,464 @@ #define DIO0_RPORT PINB #define DIO0_WPORT PORTB #define DIO0_DDR DDRB -#define DIO0_PWM nullptr +#define DIO0_PWM NULL #define DIO1_PIN PINB1 #define DIO1_RPORT PINB #define DIO1_WPORT PORTB #define DIO1_DDR DDRB -#define DIO1_PWM nullptr +#define DIO1_PWM NULL #define DIO2_PIN PINB2 #define DIO2_RPORT PINB #define DIO2_WPORT PORTB #define DIO2_DDR DDRB -#define DIO2_PWM nullptr +#define DIO2_PWM NULL #define DIO3_PIN PINB3 #define DIO3_RPORT PINB #define DIO3_WPORT PORTB #define DIO3_DDR DDRB -#define DIO3_PWM &OCR0A +#define DIO3_PWM OCR0A #define DIO4_PIN PINB4 #define DIO4_RPORT PINB #define DIO4_WPORT PORTB #define DIO4_DDR DDRB -#define DIO4_PWM &OCR0B +#define DIO4_PWM OCR0B #define DIO5_PIN PINB5 #define DIO5_RPORT PINB #define DIO5_WPORT PORTB #define DIO5_DDR DDRB -#define DIO5_PWM nullptr +#define DIO5_PWM NULL #define DIO6_PIN PINB6 #define DIO6_RPORT PINB #define DIO6_WPORT PORTB #define DIO6_DDR DDRB -#define DIO6_PWM nullptr +#define DIO6_PWM NULL #define DIO7_PIN PINB7 #define DIO7_RPORT PINB #define DIO7_WPORT PORTB #define DIO7_DDR DDRB -#define DIO7_PWM nullptr +#define DIO7_PWM NULL #define DIO8_PIN PIND0 #define DIO8_RPORT PIND #define DIO8_WPORT PORTD #define DIO8_DDR DDRD -#define DIO8_PWM nullptr +#define DIO8_PWM NULL #define DIO9_PIN PIND1 #define DIO9_RPORT PIND #define DIO9_WPORT PORTD #define DIO9_DDR DDRD -#define DIO9_PWM nullptr +#define DIO9_PWM NULL #define DIO10_PIN PIND2 #define DIO10_RPORT PIND #define DIO10_WPORT PORTD #define DIO10_DDR DDRD -#define DIO10_PWM nullptr +#define DIO10_PWM NULL #define DIO11_PIN PIND3 #define DIO11_RPORT PIND #define DIO11_WPORT PORTD #define DIO11_DDR DDRD -#define DIO11_PWM nullptr +#define DIO11_PWM NULL #define DIO12_PIN PIND4 #define DIO12_RPORT PIND #define DIO12_WPORT PORTD #define DIO12_DDR DDRD -#define DIO12_PWM &OCR1B +#define DIO12_PWM OCR1B #define DIO13_PIN PIND5 #define DIO13_RPORT PIND #define DIO13_WPORT PORTD #define DIO13_DDR DDRD -#define DIO13_PWM &OCR1A +#define DIO13_PWM OCR1A #define DIO14_PIN PIND6 #define DIO14_RPORT PIND #define DIO14_WPORT PORTD #define DIO14_DDR DDRD -#define DIO14_PWM &OCR2B +#define DIO14_PWM OCR2B #define DIO15_PIN PIND7 #define DIO15_RPORT PIND #define DIO15_WPORT PORTD #define DIO15_DDR DDRD -#define DIO15_PWM &OCR2A +#define DIO15_PWM OCR2A #define DIO16_PIN PINC0 #define DIO16_RPORT PINC #define DIO16_WPORT PORTC #define DIO16_DDR DDRC -#define DIO16_PWM nullptr +#define DIO16_PWM NULL #define DIO17_PIN PINC1 #define DIO17_RPORT PINC #define DIO17_WPORT PORTC #define DIO17_DDR DDRC -#define DIO17_PWM nullptr +#define DIO17_PWM NULL #define DIO18_PIN PINC2 #define DIO18_RPORT PINC #define DIO18_WPORT PORTC #define DIO18_DDR DDRC -#define DIO18_PWM nullptr +#define DIO18_PWM NULL #define DIO19_PIN PINC3 #define DIO19_RPORT PINC #define DIO19_WPORT PORTC #define DIO19_DDR DDRC -#define DIO19_PWM nullptr +#define DIO19_PWM NULL #define DIO20_PIN PINC4 #define DIO20_RPORT PINC #define DIO20_WPORT PORTC #define DIO20_DDR DDRC -#define DIO20_PWM nullptr +#define DIO20_PWM NULL #define DIO21_PIN PINC5 #define DIO21_RPORT PINC #define DIO21_WPORT PORTC #define DIO21_DDR DDRC -#define DIO21_PWM nullptr +#define DIO21_PWM NULL #define DIO22_PIN PINC6 #define DIO22_RPORT PINC #define DIO22_WPORT PORTC #define DIO22_DDR DDRC -#define DIO22_PWM nullptr +#define DIO22_PWM NULL #define DIO23_PIN PINC7 #define DIO23_RPORT PINC #define DIO23_WPORT PORTC #define DIO23_DDR DDRC -#define DIO23_PWM nullptr +#define DIO23_PWM NULL #define DIO24_PIN PINA7 #define DIO24_RPORT PINA #define DIO24_WPORT PORTA #define DIO24_DDR DDRA -#define DIO24_PWM nullptr +#define DIO24_PWM NULL #define DIO25_PIN PINA6 #define DIO25_RPORT PINA #define DIO25_WPORT PORTA #define DIO25_DDR DDRA -#define DIO25_PWM nullptr +#define DIO25_PWM NULL #define DIO26_PIN PINA5 #define DIO26_RPORT PINA #define DIO26_WPORT PORTA #define DIO26_DDR DDRA -#define DIO26_PWM nullptr +#define DIO26_PWM NULL #define DIO27_PIN PINA4 #define DIO27_RPORT PINA #define DIO27_WPORT PORTA #define DIO27_DDR DDRA -#define DIO27_PWM nullptr +#define DIO27_PWM NULL #define DIO28_PIN PINA3 #define DIO28_RPORT PINA #define DIO28_WPORT PORTA #define DIO28_DDR DDRA -#define DIO28_PWM nullptr +#define DIO28_PWM NULL #define DIO29_PIN PINA2 #define DIO29_RPORT PINA #define DIO29_WPORT PORTA #define DIO29_DDR DDRA -#define DIO29_PWM nullptr +#define DIO29_PWM NULL #define DIO30_PIN PINA1 #define DIO30_RPORT PINA #define DIO30_WPORT PORTA #define DIO30_DDR DDRA -#define DIO30_PWM nullptr +#define DIO30_PWM NULL #define DIO31_PIN PINA0 #define DIO31_RPORT PINA #define DIO31_WPORT PORTA #define DIO31_DDR DDRA -#define DIO31_PWM nullptr +#define DIO31_PWM NULL #define AIO0_PIN PINA0 #define AIO0_RPORT PINA #define AIO0_WPORT PORTA #define AIO0_DDR DDRA -#define AIO0_PWM nullptr +#define AIO0_PWM NULL #define AIO1_PIN PINA1 #define AIO1_RPORT PINA #define AIO1_WPORT PORTA #define AIO1_DDR DDRA -#define AIO1_PWM nullptr +#define AIO1_PWM NULL #define AIO2_PIN PINA2 #define AIO2_RPORT PINA #define AIO2_WPORT PORTA #define AIO2_DDR DDRA -#define AIO2_PWM nullptr +#define AIO2_PWM NULL #define AIO3_PIN PINA3 #define AIO3_RPORT PINA #define AIO3_WPORT PORTA #define AIO3_DDR DDRA -#define AIO3_PWM nullptr +#define AIO3_PWM NULL #define AIO4_PIN PINA4 #define AIO4_RPORT PINA #define AIO4_WPORT PORTA #define AIO4_DDR DDRA -#define AIO4_PWM nullptr +#define AIO4_PWM NULL #define AIO5_PIN PINA5 #define AIO5_RPORT PINA #define AIO5_WPORT PORTA #define AIO5_DDR DDRA -#define AIO5_PWM nullptr +#define AIO5_PWM NULL #define AIO6_PIN PINA6 #define AIO6_RPORT PINA #define AIO6_WPORT PORTA #define AIO6_DDR DDRA -#define AIO6_PWM nullptr +#define AIO6_PWM NULL #define AIO7_PIN PINA7 #define AIO7_RPORT PINA #define AIO7_WPORT PORTA #define AIO7_DDR DDRA -#define AIO7_PWM nullptr +#define AIO7_PWM NULL #undef PA0 #define PA0_PIN PINA0 #define PA0_RPORT PINA #define PA0_WPORT PORTA #define PA0_DDR DDRA -#define PA0_PWM nullptr +#define PA0_PWM NULL #undef PA1 #define PA1_PIN PINA1 #define PA1_RPORT PINA #define PA1_WPORT PORTA #define PA1_DDR DDRA -#define PA1_PWM nullptr +#define PA1_PWM NULL #undef PA2 #define PA2_PIN PINA2 #define PA2_RPORT PINA #define PA2_WPORT PORTA #define PA2_DDR DDRA -#define PA2_PWM nullptr +#define PA2_PWM NULL #undef PA3 #define PA3_PIN PINA3 #define PA3_RPORT PINA #define PA3_WPORT PORTA #define PA3_DDR DDRA -#define PA3_PWM nullptr +#define PA3_PWM NULL #undef PA4 #define PA4_PIN PINA4 #define PA4_RPORT PINA #define PA4_WPORT PORTA #define PA4_DDR DDRA -#define PA4_PWM nullptr +#define PA4_PWM NULL #undef PA5 #define PA5_PIN PINA5 #define PA5_RPORT PINA #define PA5_WPORT PORTA #define PA5_DDR DDRA -#define PA5_PWM nullptr +#define PA5_PWM NULL #undef PA6 #define PA6_PIN PINA6 #define PA6_RPORT PINA #define PA6_WPORT PORTA #define PA6_DDR DDRA -#define PA6_PWM nullptr +#define PA6_PWM NULL #undef PA7 #define PA7_PIN PINA7 #define PA7_RPORT PINA #define PA7_WPORT PORTA #define PA7_DDR DDRA -#define PA7_PWM nullptr +#define PA7_PWM NULL #undef PB0 #define PB0_PIN PINB0 #define PB0_RPORT PINB #define PB0_WPORT PORTB #define PB0_DDR DDRB -#define PB0_PWM nullptr +#define PB0_PWM NULL #undef PB1 #define PB1_PIN PINB1 #define PB1_RPORT PINB #define PB1_WPORT PORTB #define PB1_DDR DDRB -#define PB1_PWM nullptr +#define PB1_PWM NULL #undef PB2 #define PB2_PIN PINB2 #define PB2_RPORT PINB #define PB2_WPORT PORTB #define PB2_DDR DDRB -#define PB2_PWM nullptr +#define PB2_PWM NULL #undef PB3 #define PB3_PIN PINB3 #define PB3_RPORT PINB #define PB3_WPORT PORTB #define PB3_DDR DDRB -#define PB3_PWM &OCR0A +#define PB3_PWM OCR0A #undef PB4 #define PB4_PIN PINB4 #define PB4_RPORT PINB #define PB4_WPORT PORTB #define PB4_DDR DDRB -#define PB4_PWM &OCR0B +#define PB4_PWM OCR0B #undef PB5 #define PB5_PIN PINB5 #define PB5_RPORT PINB #define PB5_WPORT PORTB #define PB5_DDR DDRB -#define PB5_PWM nullptr +#define PB5_PWM NULL #undef PB6 #define PB6_PIN PINB6 #define PB6_RPORT PINB #define PB6_WPORT PORTB #define PB6_DDR DDRB -#define PB6_PWM nullptr +#define PB6_PWM NULL #undef PB7 #define PB7_PIN PINB7 #define PB7_RPORT PINB #define PB7_WPORT PORTB #define PB7_DDR DDRB -#define PB7_PWM nullptr +#define PB7_PWM NULL #undef PC0 #define PC0_PIN PINC0 #define PC0_RPORT PINC #define PC0_WPORT PORTC #define PC0_DDR DDRC -#define PC0_PWM nullptr +#define PC0_PWM NULL #undef PC1 #define PC1_PIN PINC1 #define PC1_RPORT PINC #define PC1_WPORT PORTC #define PC1_DDR DDRC -#define PC1_PWM nullptr +#define PC1_PWM NULL #undef PC2 #define PC2_PIN PINC2 #define PC2_RPORT PINC #define PC2_WPORT PORTC #define PC2_DDR DDRC -#define PC2_PWM nullptr +#define PC2_PWM NULL #undef PC3 #define PC3_PIN PINC3 #define PC3_RPORT PINC #define PC3_WPORT PORTC #define PC3_DDR DDRC -#define PC3_PWM nullptr +#define PC3_PWM NULL #undef PC4 #define PC4_PIN PINC4 #define PC4_RPORT PINC #define PC4_WPORT PORTC #define PC4_DDR DDRC -#define PC4_PWM nullptr +#define PC4_PWM NULL #undef PC5 #define PC5_PIN PINC5 #define PC5_RPORT PINC #define PC5_WPORT PORTC #define PC5_DDR DDRC -#define PC5_PWM nullptr +#define PC5_PWM NULL #undef PC6 #define PC6_PIN PINC6 #define PC6_RPORT PINC #define PC6_WPORT PORTC #define PC6_DDR DDRC -#define PC6_PWM nullptr +#define PC6_PWM NULL #undef PC7 #define PC7_PIN PINC7 #define PC7_RPORT PINC #define PC7_WPORT PORTC #define PC7_DDR DDRC -#define PC7_PWM nullptr +#define PC7_PWM NULL #undef PD0 #define PD0_PIN PIND0 #define PD0_RPORT PIND #define PD0_WPORT PORTD #define PD0_DDR DDRD -#define PD0_PWM nullptr +#define PD0_PWM NULL #undef PD1 #define PD1_PIN PIND1 #define PD1_RPORT PIND #define PD1_WPORT PORTD #define PD1_DDR DDRD -#define PD1_PWM nullptr +#define PD1_PWM NULL #undef PD2 #define PD2_PIN PIND2 #define PD2_RPORT PIND #define PD2_WPORT PORTD #define PD2_DDR DDRD -#define PD2_PWM nullptr +#define PD2_PWM NULL #undef PD3 #define PD3_PIN PIND3 #define PD3_RPORT PIND #define PD3_WPORT PORTD #define PD3_DDR DDRD -#define PD3_PWM nullptr +#define PD3_PWM NULL #undef PD4 #define PD4_PIN PIND4 #define PD4_RPORT PIND #define PD4_WPORT PORTD #define PD4_DDR DDRD -#define PD4_PWM nullptr +#define PD4_PWM NULL #undef PD5 #define PD5_PIN PIND5 #define PD5_RPORT PIND #define PD5_WPORT PORTD #define PD5_DDR DDRD -#define PD5_PWM nullptr +#define PD5_PWM NULL #undef PD6 #define PD6_PIN PIND6 #define PD6_RPORT PIND #define PD6_WPORT PORTD #define PD6_DDR DDRD -#define PD6_PWM &OCR2B +#define PD6_PWM OCR2B #undef PD7 #define PD7_PIN PIND7 #define PD7_RPORT PIND #define PD7_WPORT PORTD #define PD7_DDR DDRD -#define PD7_PWM &OCR2A +#define PD7_PWM OCR2A + +#endif // _FASTIO_644_H_ diff --git a/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h b/Marlin/src/HAL/HAL_AVR/fastio_AT90USB.h similarity index 81% rename from Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h rename to Marlin/src/HAL/HAL_AVR/fastio_AT90USB.h index 51d400b705..6043292960 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h +++ b/Marlin/src/HAL/HAL_AVR/fastio_AT90USB.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Pin mapping (Teensy) for AT90USB646, 647, 1286, and 1287 @@ -29,7 +28,10 @@ * The logical pins 46 and 47 are not supported by Teensyduino, but are supported below as E2 and E3 */ -#include "../fastio.h" +#ifndef _FASTIO_AT90USB_H_ +#define _FASTIO_AT90USB_H_ + +#include "fastio_AVR.h" // change for your board #define DEBUG_LED DIO31 /* led D5 red */ @@ -45,325 +47,325 @@ #define DIO0_PIN PIND0 #define DIO0_RPORT PIND #define DIO0_WPORT PORTD -#define DIO0_PWM 0 +#define DIO0_PWM NULL #define DIO0_DDR DDRD #define DIO1_PIN PIND1 #define DIO1_RPORT PIND #define DIO1_WPORT PORTD -#define DIO1_PWM 0 +#define DIO1_PWM NULL #define DIO1_DDR DDRD #define DIO2_PIN PIND2 #define DIO2_RPORT PIND #define DIO2_WPORT PORTD -#define DIO2_PWM 0 +#define DIO2_PWM NULL #define DIO2_DDR DDRD #define DIO3_PIN PIND3 #define DIO3_RPORT PIND #define DIO3_WPORT PORTD -#define DIO3_PWM 0 +#define DIO3_PWM NULL #define DIO3_DDR DDRD #define DIO4_PIN PIND4 #define DIO4_RPORT PIND #define DIO4_WPORT PORTD -#define DIO4_PWM 0 +#define DIO4_PWM NULL #define DIO4_DDR DDRD #define DIO5_PIN PIND5 #define DIO5_RPORT PIND #define DIO5_WPORT PORTD -#define DIO5_PWM 0 +#define DIO5_PWM NULL #define DIO5_DDR DDRD #define DIO6_PIN PIND6 #define DIO6_RPORT PIND #define DIO6_WPORT PORTD -#define DIO6_PWM 0 +#define DIO6_PWM NULL #define DIO6_DDR DDRD #define DIO7_PIN PIND7 #define DIO7_RPORT PIND #define DIO7_WPORT PORTD -#define DIO7_PWM 0 +#define DIO7_PWM NULL #define DIO7_DDR DDRD #define DIO8_PIN PINE0 #define DIO8_RPORT PINE #define DIO8_WPORT PORTE -#define DIO8_PWM 0 +#define DIO8_PWM NULL #define DIO8_DDR DDRE #define DIO9_PIN PINE1 #define DIO9_RPORT PINE #define DIO9_WPORT PORTE -#define DIO9_PWM 0 +#define DIO9_PWM NULL #define DIO9_DDR DDRE #define DIO10_PIN PINC0 #define DIO10_RPORT PINC #define DIO10_WPORT PORTC -#define DIO10_PWM 0 +#define DIO10_PWM NULL #define DIO10_DDR DDRC #define DIO11_PIN PINC1 #define DIO11_RPORT PINC #define DIO11_WPORT PORTC -#define DIO11_PWM 0 +#define DIO11_PWM NULL #define DIO11_DDR DDRC #define DIO12_PIN PINC2 #define DIO12_RPORT PINC #define DIO12_WPORT PORTC -#define DIO12_PWM 0 +#define DIO12_PWM NULL #define DIO12_DDR DDRC #define DIO13_PIN PINC3 #define DIO13_RPORT PINC #define DIO13_WPORT PORTC -#define DIO13_PWM 0 +#define DIO13_PWM NULL #define DIO13_DDR DDRC #define DIO14_PIN PINC4 #define DIO14_RPORT PINC #define DIO14_WPORT PORTC -#define DIO14_PWM 0 // OC3C +#define DIO14_PWM NULL #define DIO14_DDR DDRC #define DIO15_PIN PINC5 #define DIO15_RPORT PINC #define DIO15_WPORT PORTC -#define DIO15_PWM 0 // OC3B +#define DIO15_PWM NULL #define DIO15_DDR DDRC #define DIO16_PIN PINC6 #define DIO16_RPORT PINC #define DIO16_WPORT PORTC -#define DIO16_PWM 0 // OC3A +#define DIO16_PWM NULL #define DIO16_DDR DDRC #define DIO17_PIN PINC7 #define DIO17_RPORT PINC #define DIO17_WPORT PORTC -#define DIO17_PWM 0 +#define DIO17_PWM NULL #define DIO17_DDR DDRC #define DIO18_PIN PINE6 #define DIO18_RPORT PINE #define DIO18_WPORT PORTE -#define DIO18_PWM 0 +#define DIO18_PWM NULL #define DIO18_DDR DDRE #define DIO19_PIN PINE7 #define DIO19_RPORT PINE #define DIO19_WPORT PORTE -#define DIO19_PWM 0 +#define DIO19_PWM NULL #define DIO19_DDR DDRE #define DIO20_PIN PINB0 #define DIO20_RPORT PINB #define DIO20_WPORT PORTB -#define DIO20_PWM 0 +#define DIO20_PWM NULL #define DIO20_DDR DDRB #define DIO21_PIN PINB1 #define DIO21_RPORT PINB #define DIO21_WPORT PORTB -#define DIO21_PWM 0 +#define DIO21_PWM NULL #define DIO21_DDR DDRB #define DIO22_PIN PINB2 #define DIO22_RPORT PINB #define DIO22_WPORT PORTB -#define DIO22_PWM 0 +#define DIO22_PWM NULL #define DIO22_DDR DDRB #define DIO23_PIN PINB3 #define DIO23_RPORT PINB #define DIO23_WPORT PORTB -#define DIO23_PWM 0 +#define DIO23_PWM NULL #define DIO23_DDR DDRB #define DIO24_PIN PINB4 #define DIO24_RPORT PINB #define DIO24_WPORT PORTB -#define DIO24_PWM 0 // OC2A +#define DIO24_PWM NULL #define DIO24_DDR DDRB #define DIO25_PIN PINB5 #define DIO25_RPORT PINB #define DIO25_WPORT PORTB -#define DIO25_PWM 0 // OC1A +#define DIO25_PWM NULL #define DIO25_DDR DDRB #define DIO26_PIN PINB6 #define DIO26_RPORT PINB #define DIO26_WPORT PORTB -#define DIO26_PWM 0 // OC1B +#define DIO26_PWM NULL #define DIO26_DDR DDRB #define DIO27_PIN PINB7 #define DIO27_RPORT PINB #define DIO27_WPORT PORTB -#define DIO27_PWM 0 // OC1C +#define DIO27_PWM NULL #define DIO27_DDR DDRB #define DIO28_PIN PINA0 #define DIO28_RPORT PINA #define DIO28_WPORT PORTA -#define DIO28_PWM 0 +#define DIO28_PWM NULL #define DIO28_DDR DDRA #define DIO29_PIN PINA1 #define DIO29_RPORT PINA #define DIO29_WPORT PORTA -#define DIO29_PWM 0 +#define DIO29_PWM NULL #define DIO29_DDR DDRA #define DIO30_PIN PINA2 #define DIO30_RPORT PINA #define DIO30_WPORT PORTA -#define DIO30_PWM 0 +#define DIO30_PWM NULL #define DIO30_DDR DDRA #define DIO31_PIN PINA3 #define DIO31_RPORT PINA #define DIO31_WPORT PORTA -#define DIO31_PWM 0 +#define DIO31_PWM NULL #define DIO31_DDR DDRA #define DIO32_PIN PINA4 #define DIO32_RPORT PINA #define DIO32_WPORT PORTA -#define DIO32_PWM 0 +#define DIO32_PWM NULL #define DIO32_DDR DDRA #define DIO33_PIN PINA5 #define DIO33_RPORT PINA #define DIO33_WPORT PORTA -#define DIO33_PWM 0 +#define DIO33_PWM NULL #define DIO33_DDR DDRA #define DIO34_PIN PINA6 #define DIO34_RPORT PINA #define DIO34_WPORT PORTA -#define DIO34_PWM 0 +#define DIO34_PWM NULL #define DIO34_DDR DDRA #define DIO35_PIN PINA7 #define DIO35_RPORT PINA #define DIO35_WPORT PORTA -#define DIO35_PWM 0 +#define DIO35_PWM NULL #define DIO35_DDR DDRA #define DIO36_PIN PINE4 #define DIO36_RPORT PINE #define DIO36_WPORT PORTE -#define DIO36_PWM 0 +#define DIO36_PWM NULL #define DIO36_DDR DDRE #define DIO37_PIN PINE5 #define DIO37_RPORT PINE #define DIO37_WPORT PORTE -#define DIO37_PWM 0 +#define DIO37_PWM NULL #define DIO37_DDR DDRE #define DIO38_PIN PINF0 #define DIO38_RPORT PINF #define DIO38_WPORT PORTF -#define DIO38_PWM 0 +#define DIO38_PWM NULL #define DIO38_DDR DDRF #define DIO39_PIN PINF1 #define DIO39_RPORT PINF #define DIO39_WPORT PORTF -#define DIO39_PWM 0 +#define DIO39_PWM NULL #define DIO39_DDR DDRF #define DIO40_PIN PINF2 #define DIO40_RPORT PINF #define DIO40_WPORT PORTF -#define DIO40_PWM 0 +#define DIO40_PWM NULL #define DIO40_DDR DDRF #define DIO41_PIN PINF3 #define DIO41_RPORT PINF #define DIO41_WPORT PORTF -#define DIO41_PWM 0 +#define DIO41_PWM NULL #define DIO41_DDR DDRF #define DIO42_PIN PINF4 #define DIO42_RPORT PINF #define DIO42_WPORT PORTF -#define DIO42_PWM 0 +#define DIO42_PWM NULL #define DIO42_DDR DDRF #define DIO43_PIN PINF5 #define DIO43_RPORT PINF #define DIO43_WPORT PORTF -#define DIO43_PWM 0 +#define DIO43_PWM NULL #define DIO43_DDR DDRF #define DIO44_PIN PINF6 #define DIO44_RPORT PINF #define DIO44_WPORT PORTF -#define DIO44_PWM 0 +#define DIO44_PWM NULL #define DIO44_DDR DDRF #define DIO45_PIN PINF7 #define DIO45_RPORT PINF #define DIO45_WPORT PORTF -#define DIO45_PWM 0 +#define DIO45_PWM NULL #define DIO45_DDR DDRF #define AIO0_PIN PINF0 #define AIO0_RPORT PINF #define AIO0_WPORT PORTF -#define AIO0_PWM 0 +#define AIO0_PWM NULL #define AIO0_DDR DDRF #define AIO1_PIN PINF1 #define AIO1_RPORT PINF #define AIO1_WPORT PORTF -#define AIO1_PWM 0 +#define AIO1_PWM NULL #define AIO1_DDR DDRF #define AIO2_PIN PINF2 #define AIO2_RPORT PINF #define AIO2_WPORT PORTF -#define AIO2_PWM 0 +#define AIO2_PWM NULL #define AIO2_DDR DDRF #define AIO3_PIN PINF3 #define AIO3_RPORT PINF #define AIO3_WPORT PORTF -#define AIO3_PWM 0 +#define AIO3_PWM NULL #define AIO3_DDR DDRF #define AIO4_PIN PINF4 #define AIO4_RPORT PINF #define AIO4_WPORT PORTF -#define AIO4_PWM 0 +#define AIO4_PWM NULL #define AIO4_DDR DDRF #define AIO5_PIN PINF5 #define AIO5_RPORT PINF #define AIO5_WPORT PORTF -#define AIO5_PWM 0 +#define AIO5_PWM NULL #define AIO5_DDR DDRF #define AIO6_PIN PINF6 #define AIO6_RPORT PINF #define AIO6_WPORT PORTF -#define AIO6_PWM 0 +#define AIO6_PWM NULL #define AIO6_DDR DDRF #define AIO7_PIN PINF7 #define AIO7_RPORT PINF #define AIO7_WPORT PORTF -#define AIO7_PWM 0 +#define AIO7_PWM NULL #define AIO7_DDR DDRF //-- Begin not supported by Teensyduino @@ -371,13 +373,13 @@ #define DIO46_PIN PINE2 #define DIO46_RPORT PINE #define DIO46_WPORT PORTE -#define DIO46_PWM 0 +#define DIO46_PWM NULL #define DIO46_DDR DDRE #define DIO47_PIN PINE3 #define DIO47_RPORT PINE #define DIO47_WPORT PORTE -#define DIO47_PWM 0 +#define DIO47_PWM NULL #define DIO47_DDR DDRE #define TEENSY_E2 46 @@ -389,300 +391,300 @@ #define PA0_PIN PINA0 #define PA0_RPORT PINA #define PA0_WPORT PORTA -#define PA0_PWM 0 +#define PA0_PWM NULL #define PA0_DDR DDRA #undef PA1 #define PA1_PIN PINA1 #define PA1_RPORT PINA #define PA1_WPORT PORTA -#define PA1_PWM 0 +#define PA1_PWM NULL #define PA1_DDR DDRA #undef PA2 #define PA2_PIN PINA2 #define PA2_RPORT PINA #define PA2_WPORT PORTA -#define PA2_PWM 0 +#define PA2_PWM NULL #define PA2_DDR DDRA #undef PA3 #define PA3_PIN PINA3 #define PA3_RPORT PINA #define PA3_WPORT PORTA -#define PA3_PWM 0 +#define PA3_PWM NULL #define PA3_DDR DDRA #undef PA4 #define PA4_PIN PINA4 #define PA4_RPORT PINA #define PA4_WPORT PORTA -#define PA4_PWM 0 +#define PA4_PWM NULL #define PA4_DDR DDRA #undef PA5 #define PA5_PIN PINA5 #define PA5_RPORT PINA #define PA5_WPORT PORTA -#define PA5_PWM 0 +#define PA5_PWM NULL #define PA5_DDR DDRA #undef PA6 #define PA6_PIN PINA6 #define PA6_RPORT PINA #define PA6_WPORT PORTA -#define PA6_PWM 0 +#define PA6_PWM NULL #define PA6_DDR DDRA #undef PA7 #define PA7_PIN PINA7 #define PA7_RPORT PINA #define PA7_WPORT PORTA -#define PA7_PWM 0 +#define PA7_PWM NULL #define PA7_DDR DDRA #undef PB0 #define PB0_PIN PINB0 #define PB0_RPORT PINB #define PB0_WPORT PORTB -#define PB0_PWM 0 +#define PB0_PWM NULL #define PB0_DDR DDRB #undef PB1 #define PB1_PIN PINB1 #define PB1_RPORT PINB #define PB1_WPORT PORTB -#define PB1_PWM 0 +#define PB1_PWM NULL #define PB1_DDR DDRB #undef PB2 #define PB2_PIN PINB2 #define PB2_RPORT PINB #define PB2_WPORT PORTB -#define PB2_PWM 0 +#define PB2_PWM NULL #define PB2_DDR DDRB #undef PB3 #define PB3_PIN PINB3 #define PB3_RPORT PINB #define PB3_WPORT PORTB -#define PB3_PWM 0 +#define PB3_PWM NULL #define PB3_DDR DDRB #undef PB4 #define PB4_PIN PINB4 #define PB4_RPORT PINB #define PB4_WPORT PORTB -#define PB4_PWM 0 +#define PB4_PWM NULL #define PB4_DDR DDRB #undef PB5 #define PB5_PIN PINB5 #define PB5_RPORT PINB #define PB5_WPORT PORTB -#define PB5_PWM 0 +#define PB5_PWM NULL #define PB5_DDR DDRB #undef PB6 #define PB6_PIN PINB6 #define PB6_RPORT PINB #define PB6_WPORT PORTB -#define PB6_PWM 0 +#define PB6_PWM NULL #define PB6_DDR DDRB #undef PB7 #define PB7_PIN PINB7 #define PB7_RPORT PINB #define PB7_WPORT PORTB -#define PB7_PWM 0 +#define PB7_PWM NULL #define PB7_DDR DDRB #undef PC0 #define PC0_PIN PINC0 #define PC0_RPORT PINC #define PC0_WPORT PORTC -#define PC0_PWM 0 +#define PC0_PWM NULL #define PC0_DDR DDRC #undef PC1 #define PC1_PIN PINC1 #define PC1_RPORT PINC #define PC1_WPORT PORTC -#define PC1_PWM 0 +#define PC1_PWM NULL #define PC1_DDR DDRC #undef PC2 #define PC2_PIN PINC2 #define PC2_RPORT PINC #define PC2_WPORT PORTC -#define PC2_PWM 0 +#define PC2_PWM NULL #define PC2_DDR DDRC #undef PC3 #define PC3_PIN PINC3 #define PC3_RPORT PINC #define PC3_WPORT PORTC -#define PC3_PWM 0 +#define PC3_PWM NULL #define PC3_DDR DDRC #undef PC4 #define PC4_PIN PINC4 #define PC4_RPORT PINC #define PC4_WPORT PORTC -#define PC4_PWM 0 +#define PC4_PWM NULL #define PC4_DDR DDRC #undef PC5 #define PC5_PIN PINC5 #define PC5_RPORT PINC #define PC5_WPORT PORTC -#define PC5_PWM 0 +#define PC5_PWM NULL #define PC5_DDR DDRC #undef PC6 #define PC6_PIN PINC6 #define PC6_RPORT PINC #define PC6_WPORT PORTC -#define PC6_PWM 0 +#define PC6_PWM NULL #define PC6_DDR DDRC #undef PC7 #define PC7_PIN PINC7 #define PC7_RPORT PINC #define PC7_WPORT PORTC -#define PC7_PWM 0 +#define PC7_PWM NULL #define PC7_DDR DDRC #undef PD0 #define PD0_PIN PIND0 #define PD0_RPORT PIND #define PD0_WPORT PORTD -#define PD0_PWM 0 // OC0B +#define PD0_PWM NULL #define PD0_DDR DDRD #undef PD1 #define PD1_PIN PIND1 #define PD1_RPORT PIND #define PD1_WPORT PORTD -#define PD1_PWM 0 // OC2B +#define PD1_PWM NULL #define PD1_DDR DDRD #undef PD2 #define PD2_PIN PIND2 #define PD2_RPORT PIND #define PD2_WPORT PORTD -#define PD2_PWM 0 +#define PD2_PWM NULL #define PD2_DDR DDRD #undef PD3 #define PD3_PIN PIND3 #define PD3_RPORT PIND #define PD3_WPORT PORTD -#define PD3_PWM 0 +#define PD3_PWM NULL #define PD3_DDR DDRD #undef PD4 #define PD4_PIN PIND4 #define PD4_RPORT PIND #define PD4_WPORT PORTD -#define PD4_PWM 0 +#define PD4_PWM NULL #define PD4_DDR DDRD #undef PD5 #define PD5_PIN PIND5 #define PD5_RPORT PIND #define PD5_WPORT PORTD -#define PD5_PWM 0 +#define PD5_PWM NULL #define PD5_DDR DDRD #undef PD6 #define PD6_PIN PIND6 #define PD6_RPORT PIND #define PD6_WPORT PORTD -#define PD6_PWM 0 +#define PD6_PWM NULL #define PD6_DDR DDRD #undef PD7 #define PD7_PIN PIND7 #define PD7_RPORT PIND #define PD7_WPORT PORTD -#define PD7_PWM 0 +#define PD7_PWM NULL #define PD7_DDR DDRD #undef PE0 #define PE0_PIN PINE0 #define PE0_RPORT PINE #define PE0_WPORT PORTE -#define PE0_PWM 0 +#define PE0_PWM NULL #define PE0_DDR DDRE #undef PE1 #define PE1_PIN PINE1 #define PE1_RPORT PINE #define PE1_WPORT PORTE -#define PE1_PWM 0 +#define PE1_PWM NULL #define PE1_DDR DDRE #undef PE2 #define PE2_PIN PINE2 #define PE2_RPORT PINE #define PE2_WPORT PORTE -#define PE2_PWM 0 +#define PE2_PWM NULL #define PE2_DDR DDRE #undef PE3 #define PE3_PIN PINE3 #define PE3_RPORT PINE #define PE3_WPORT PORTE -#define PE3_PWM 0 +#define PE3_PWM NULL #define PE3_DDR DDRE #undef PE4 #define PE4_PIN PINE4 #define PE4_RPORT PINE #define PE4_WPORT PORTE -#define PE4_PWM 0 +#define PE4_PWM NULL #define PE4_DDR DDRE #undef PE5 #define PE5_PIN PINE5 #define PE5_RPORT PINE #define PE5_WPORT PORTE -#define PE5_PWM 0 +#define PE5_PWM NULL #define PE5_DDR DDRE #undef PE6 #define PE6_PIN PINE6 #define PE6_RPORT PINE #define PE6_WPORT PORTE -#define PE6_PWM 0 +#define PE6_PWM NULL #define PE6_DDR DDRE #undef PE7 #define PE7_PIN PINE7 #define PE7_RPORT PINE #define PE7_WPORT PORTE -#define PE7_PWM 0 +#define PE7_PWM NULL #define PE7_DDR DDRE #undef PF0 #define PF0_PIN PINF0 #define PF0_RPORT PINF #define PF0_WPORT PORTF -#define PF0_PWM 0 +#define PF0_PWM NULL #define PF0_DDR DDRF #undef PF1 #define PF1_PIN PINF1 #define PF1_RPORT PINF #define PF1_WPORT PORTF -#define PF1_PWM 0 +#define PF1_PWM NULL #define PF1_DDR DDRF #undef PF2 #define PF2_PIN PINF2 #define PF2_RPORT PINF #define PF2_WPORT PORTF -#define PF2_PWM 0 +#define PF2_PWM NULL #define PF2_DDR DDRF #undef PF3 #define PF3_PIN PINF3 #define PF3_RPORT PINF #define PF3_WPORT PORTF -#define PF3_PWM 0 +#define PF3_PWM NULL #define PF3_DDR DDRF #undef PF4 #define PF4_PIN PINF4 #define PF4_RPORT PINF #define PF4_WPORT PORTF -#define PF4_PWM 0 +#define PF4_PWM NULL #define PF4_DDR DDRF #undef PF5 #define PF5_PIN PINF5 #define PF5_RPORT PINF #define PF5_WPORT PORTF -#define PF5_PWM 0 +#define PF5_PWM NULL #define PF5_DDR DDRF #undef PF6 #define PF6_PIN PINF6 #define PF6_RPORT PINF #define PF6_WPORT PORTF -#define PF6_PWM 0 +#define PF6_PWM NULL #define PF6_DDR DDRF #undef PF7 #define PF7_PIN PINF7 #define PF7_RPORT PINF #define PF7_WPORT PORTF -#define PF7_PWM 0 +#define PF7_PWM NULL #define PF7_DDR DDRF /** - * Some of the pin mapping functions of the Teensduino extension to the Arduino IDE - * do not function the same as the other Arduino extensions. + * some of the pin mapping functions of the Teensduino extension to the Arduino IDE + * do not function the same as the other Arduino extensions */ //digitalPinToTimer(pin) function works like Arduino but Timers are not defined @@ -695,3 +697,5 @@ #define TIMER3A 5 #define TIMER3B 4 #define TIMER3C 3 + +#endif // _FASTIO_AT90USB_H_ diff --git a/Marlin/src/HAL/HAL_AVR/fastio_AVR.h b/Marlin/src/HAL/HAL_AVR/fastio_AVR.h new file mode 100644 index 0000000000..a4e3c5d74d --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/fastio_AVR.h @@ -0,0 +1,316 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Fast I/O Routines for AVR + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +#ifndef _FASTIO_ARDUINO_H_ +#define _FASTIO_ARDUINO_H_ + +#include +#include "../../core/macros.h" + +#define AVR_AT90USB1286_FAMILY (defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__)) +#define AVR_ATmega1284_FAMILY (defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__)) +#define AVR_ATmega2560_FAMILY (defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)) +#define AVR_ATmega2561_FAMILY (defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__)) +#define AVR_ATmega328_FAMILY (defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)) + +/** + * Include Ports and Functions + */ +#if AVR_ATmega328_FAMILY + #include "fastio_168.h" +#elif AVR_ATmega1284_FAMILY + #include "fastio_644.h" +#elif AVR_ATmega2560_FAMILY + #include "fastio_1280.h" +#elif AVR_AT90USB1286_FAMILY + #include "fastio_AT90USB.h" +#elif AVR_ATmega2561_FAMILY + #include "fastio_1281.h" +#else + #error "No FastIO definition for the selected AVR Board." +#endif + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); + * + * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + */ + +#define _READ(IO) TEST(DIO ## IO ## _RPORT, DIO ## IO ## _PIN) + +#define _WRITE_NC(IO,V) do{ \ + if (V) SBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \ + else CBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \ +}while(0) + +#define _WRITE_C(IO,V) do{ \ + uint8_t port_bits = DIO ## IO ## _WPORT; /* Get a mask from the current port bits */ \ + if (V) port_bits = ~port_bits; /* For setting bits, invert the mask */ \ + DIO ## IO ## _RPORT = port_bits & _BV(DIO ## IO ## _PIN); /* Atomically toggle the output port bits */ \ +}while(0) + +#define _WRITE(IO,V) do{ if (&(DIO ## IO ## _RPORT) < (uint8_t*)0x100) _WRITE_NC(IO,V); else _WRITE_C(IO,V); }while(0) + +#define _TOGGLE(IO) (DIO ## IO ## _RPORT = _BV(DIO ## IO ## _PIN)) + +#define _SET_INPUT(IO) CBI(DIO ## IO ## _DDR, DIO ## IO ## _PIN) +#define _SET_OUTPUT(IO) SBI(DIO ## IO ## _DDR, DIO ## IO ## _PIN) + +#define _GET_INPUT(IO) !TEST(DIO ## IO ## _DDR, DIO ## IO ## _PIN) +#define _GET_OUTPUT(IO) TEST(DIO ## IO ## _DDR, DIO ## IO ## _PIN) +#define _GET_TIMER(IO) DIO ## IO ## _PWM + +#define READ(IO) _READ(IO) +#define WRITE(IO,V) _WRITE(IO,V) +#define TOGGLE(IO) _TOGGLE(IO) + +#define SET_INPUT(IO) _SET_INPUT(IO) +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _WRITE(IO, HIGH); }while(0) +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) + +#define GET_INPUT(IO) _GET_INPUT(IO) +#define GET_OUTPUT(IO) _GET_OUTPUT(IO) +#define GET_TIMER(IO) _GET_TIMER(IO) + +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +/** + * Timer and Interrupt Control + */ + +// Waveform Generation Modes +enum WaveGenMode : char { + WGM_NORMAL, // 0 + WGM_PWM_PC_8, // 1 + WGM_PWM_PC_9, // 2 + WGM_PWM_PC_10, // 3 + WGM_CTC_OCRnA, // 4 COM OCnx + WGM_FAST_PWM_8, // 5 + WGM_FAST_PWM_9, // 6 + WGM_FAST_PWM_10, // 7 + WGM_PWM_PC_FC_ICRn, // 8 + WGM_PWM_PC_FC_OCRnA, // 9 COM OCnA + WGM_PWM_PC_ICRn, // 10 + WGM_PWM_PC_OCRnA, // 11 COM OCnA + WGM_CTC_ICRn, // 12 COM OCnx + WGM_reserved, // 13 + WGM_FAST_PWM_ICRn, // 14 COM OCnA + WGM_FAST_PWM_OCRnA // 15 COM OCnA +}; + +// Compare Modes +enum CompareMode : char { + COM_NORMAL, // 0 + COM_TOGGLE, // 1 Non-PWM: OCnx ... Both PWM (WGM 9,11,14,15): OCnA only ... else NORMAL + COM_CLEAR_SET, // 2 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down + COM_SET_CLEAR // 3 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down +}; + +// Clock Sources +enum ClockSource : char { + CS_NONE, // 0 + CS_PRESCALER_1, // 1 + CS_PRESCALER_8, // 2 + CS_PRESCALER_64, // 3 + CS_PRESCALER_256, // 4 + CS_PRESCALER_1024, // 5 + CS_EXT_FALLING, // 6 + CS_EXT_RISING // 7 +}; + +// Clock Sources (Timer 2 only) +enum ClockSource2 : char { + CS2_NONE, // 0 + CS2_PRESCALER_1, // 1 + CS2_PRESCALER_8, // 2 + CS2_PRESCALER_32, // 3 + CS2_PRESCALER_64, // 4 + CS2_PRESCALER_128, // 5 + CS2_PRESCALER_256, // 6 + CS2_PRESCALER_1024 // 7 +}; + +// Get interrupt bits in an orderly way +// Ex: cs = GET_CS(0); coma1 = GET_COM(A,1); +#define GET_WGM(T) (((TCCR##T##A >> WGM##T##0) & 0x3) | ((TCCR##T##B >> WGM##T##2 << 2) & 0xC)) +#define GET_CS(T) ((TCCR##T##B >> CS##T##0) & 0x7) +#define GET_COM(T,Q) ((TCCR##T##Q >> COM##T##Q##0) & 0x3) +#define GET_COMA(T) GET_COM(T,A) +#define GET_COMB(T) GET_COM(T,B) +#define GET_COMC(T) GET_COM(T,C) +#define GET_ICNC(T) (!!(TCCR##T##B & _BV(ICNC##T))) +#define GET_ICES(T) (!!(TCCR##T##B & _BV(ICES##T))) +#define GET_FOC(T,Q) (!!(TCCR##T##C & _BV(FOC##T##Q))) +#define GET_FOCA(T) GET_FOC(T,A) +#define GET_FOCB(T) GET_FOC(T,B) +#define GET_FOCC(T) GET_FOC(T,C) + +// Set Wave Generation Mode bits +// Ex: SET_WGM(5,CTC_ICRn); +#define _SET_WGM(T,V) do{ \ + TCCR##T##A = (TCCR##T##A & ~(0x3 << WGM##T##0)) | (( int(V) & 0x3) << WGM##T##0); \ + TCCR##T##B = (TCCR##T##B & ~(0x3 << WGM##T##2)) | (((int(V) >> 2) & 0x3) << WGM##T##2); \ + }while(0) +#define SET_WGM(T,V) _SET_WGM(T,WGM_##V) + +// Set Clock Select bits +// Ex: SET_CS3(PRESCALER_64); +#define _SET_CS(T,V) (TCCR##T##B = (TCCR##T##B & ~(0x7 << CS##T##0)) | ((int(V) & 0x7) << CS##T##0)) +#define _SET_CS0(V) _SET_CS(0,V) +#define _SET_CS1(V) _SET_CS(1,V) +#ifdef TCCR2 + #define _SET_CS2(V) (TCCR2 = (TCCR2 & ~(0x7 << CS20)) | (int(V) << CS20)) +#else + #define _SET_CS2(V) _SET_CS(2,V) +#endif +#define _SET_CS3(V) _SET_CS(3,V) +#define _SET_CS4(V) _SET_CS(4,V) +#define _SET_CS5(V) _SET_CS(5,V) +#define SET_CS0(V) _SET_CS0(CS_##V) +#define SET_CS1(V) _SET_CS1(CS_##V) +#ifdef TCCR2 + #define SET_CS2(V) _SET_CS2(CS2_##V) +#else + #define SET_CS2(V) _SET_CS2(CS_##V) +#endif +#define SET_CS3(V) _SET_CS3(CS_##V) +#define SET_CS4(V) _SET_CS4(CS_##V) +#define SET_CS5(V) _SET_CS5(CS_##V) +#define SET_CS(T,V) SET_CS##T(V) + +// Set Compare Mode bits +// Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET); +#define _SET_COM(T,Q,V) (TCCR##T##Q = (TCCR##T##Q & ~(0x3 << COM##T##Q##0)) | (int(V) << COM##T##Q##0)) +#define SET_COM(T,Q,V) _SET_COM(T,Q,COM_##V) +#define SET_COMA(T,V) SET_COM(T,A,V) +#define SET_COMB(T,V) SET_COM(T,B,V) +#define SET_COMC(T,V) SET_COM(T,C,V) +#define SET_COMS(T,V1,V2,V3) do{ SET_COMA(T,V1); SET_COMB(T,V2); SET_COMC(T,V3); }while(0) + +// Set Noise Canceler bit +// Ex: SET_ICNC(2,1) +#define SET_ICNC(T,V) (TCCR##T##B = (V) ? TCCR##T##B | _BV(ICNC##T) : TCCR##T##B & ~_BV(ICNC##T)) + +// Set Input Capture Edge Select bit +// Ex: SET_ICES(5,0) +#define SET_ICES(T,V) (TCCR##T##B = (V) ? TCCR##T##B | _BV(ICES##T) : TCCR##T##B & ~_BV(ICES##T)) + +// Set Force Output Compare bit +// Ex: SET_FOC(3,A,1) +#define SET_FOC(T,Q,V) (TCCR##T##C = (V) ? TCCR##T##C | _BV(FOC##T##Q) : TCCR##T##C & ~_BV(FOC##T##Q)) +#define SET_FOCA(T,V) SET_FOC(T,A,V) +#define SET_FOCB(T,V) SET_FOC(T,B,V) +#define SET_FOCC(T,V) SET_FOC(T,C,V) + + +/** + * PWM availability macros + */ + +// Determine which harware PWMs are already in use +#if PIN_EXISTS(CONTROLLER_FAN) + #define PWM_CHK_FAN_B(p) (p == CONTROLLER_FAN_PIN || p == E0_AUTO_FAN_PIN || p == E1_AUTO_FAN_PIN || p == E2_AUTO_FAN_PIN || p == E3_AUTO_FAN_PIN || p == E4_AUTO_FAN_PIN || p == CHAMBER_AUTO_FAN_PIN) +#else + #define PWM_CHK_FAN_B(p) (p == E0_AUTO_FAN_PIN || p == E1_AUTO_FAN_PIN || p == E2_AUTO_FAN_PIN || p == E3_AUTO_FAN_PIN || p == E4_AUTO_FAN_PIN || p == CHAMBER_AUTO_FAN_PIN) +#endif + +#if PIN_EXISTS(FAN) || PIN_EXISTS(FAN1) || PIN_EXISTS(FAN2) + #if PIN_EXISTS(FAN2) + #define PWM_CHK_FAN_A(p) (p == FAN_PIN || p == FAN1_PIN || p == FAN2_PIN) + #elif PIN_EXISTS(FAN1) + #define PWM_CHK_FAN_A(p) (p == FAN_PIN || p == FAN1_PIN) + #else + #define PWM_CHK_FAN_A(p) (p == FAN_PIN) + #endif +#else + #define PWM_CHK_FAN_A(p) false +#endif + +#if HAS_MOTOR_CURRENT_PWM + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + #define PWM_CHK_MOTOR_CURRENT(p) (p == MOTOR_CURRENT_PWM_E || p == MOTOR_CURRENT_PWM_Z || p == MOTOR_CURRENT_PWM_XY) + #elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #define PWM_CHK_MOTOR_CURRENT(p) (p == MOTOR_CURRENT_PWM_E || p == MOTOR_CURRENT_PWM_Z) + #else + #define PWM_CHK_MOTOR_CURRENT(p) (p == MOTOR_CURRENT_PWM_E) + #endif +#else + #define PWM_CHK_MOTOR_CURRENT(p) false +#endif + +#ifdef NUM_SERVOS + #if AVR_ATmega2560_FAMILY + #define PWM_CHK_SERVO(p) (p == 5 || (NUM_SERVOS > 12 && p == 6) || (NUM_SERVOS > 24 && p == 46)) // PWMS 3A, 4A & 5A + #elif AVR_ATmega2561_FAMILY + #define PWM_CHK_SERVO(p) (p == 5) // PWM3A + #elif AVR_ATmega1284_FAMILY + #define PWM_CHK_SERVO(p) false + #elif AVR_AT90USB1286_FAMILY + #define PWM_CHK_SERVO(p) (p == 16) // PWM3A + #elif AVR_ATmega328_FAMILY + #define PWM_CHK_SERVO(p) false + #endif +#else + #define PWM_CHK_SERVO(p) false +#endif + +#if ENABLED(BARICUDA) + #if HAS_HEATER_1 && HAS_HEATER_2 + #define PWM_CHK_HEATER(p) (p == HEATER_1_PIN || p == HEATER_2_PIN) + #elif HAS_HEATER_1 + #define PWM_CHK_HEATER(p) (p == HEATER_1_PIN) + #endif +#else + #define PWM_CHK_HEATER(p) false +#endif + +#define PWM_CHK(p) (PWM_CHK_HEATER(p) || PWM_CHK_SERVO(p) || PWM_CHK_MOTOR_CURRENT(p)\ + || PWM_CHK_FAN_A(p) || PWM_CHK_FAN_B(p)) + +// define which hardware PWMs are available for the current CPU +// all timer 1 PWMS deleted from this list because they are never available +#if AVR_ATmega2560_FAMILY + #define PWM_PINS(p) ((p >= 2 && p <= 10) || p == 13 || p == 44 || p == 45 || p == 46) +#elif AVR_ATmega2561_FAMILY + #define PWM_PINS(p) ((p >= 2 && p <= 6) || p == 9) +#elif AVR_ATmega1284_FAMILY + #define PWM_PINS(p) (p == 3 || p == 4 || p == 14 || p == 15) +#elif AVR_AT90USB1286_FAMILY + #define PWM_PINS(p) (p == 0 || p == 1 || p == 14 || p == 15 || p == 16 || p == 24) +#elif AVR_ATmega328_FAMILY + #define PWM_PINS(p) (p == 3 || p == 5 || p == 6 || p == 11) +#else + #error "unknown CPU" +#endif + +// finally - the macro that tells us if a pin is an available hardware PWM +#define USEABLE_HARDWARE_PWM(p) (PWM_PINS(p) && !PWM_CHK(p)) + +#endif // _FASTIO_ARDUINO_H_ diff --git a/Marlin/src/HAL/HAL_AVR/math_AVR.h b/Marlin/src/HAL/HAL_AVR/math_AVR.h new file mode 100644 index 0000000000..6348ed8bbf --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/math_AVR.h @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _MATH_AVR_H_ +#define _MATH_AVR_H_ + +/** + * Optimized math functions for AVR + */ + +// intRes = longIn1 * longIn2 >> 24 +// uses: +// A[tmp] to store 0 +// B[tmp] to store bits 16-23 of the 48bit result. The top bit is used to round the two byte result. +// note that the lower two bytes and the upper byte of the 48bit result are not calculated. +// this can cause the result to be out by one as the lower bytes may cause carries into the upper ones. +// B A are bits 24-39 and are the returned value +// C B A is longIn1 +// D C B A is longIn2 +// +static FORCE_INLINE uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) { + register uint8_t tmp1; + register uint8_t tmp2; + register uint16_t intRes; + __asm__ __volatile__( + A("clr %[tmp1]") + A("mul %A[longIn1], %B[longIn2]") + A("mov %[tmp2], r1") + A("mul %B[longIn1], %C[longIn2]") + A("movw %A[intRes], r0") + A("mul %C[longIn1], %C[longIn2]") + A("add %B[intRes], r0") + A("mul %C[longIn1], %B[longIn2]") + A("add %A[intRes], r0") + A("adc %B[intRes], r1") + A("mul %A[longIn1], %C[longIn2]") + A("add %[tmp2], r0") + A("adc %A[intRes], r1") + A("adc %B[intRes], %[tmp1]") + A("mul %B[longIn1], %B[longIn2]") + A("add %[tmp2], r0") + A("adc %A[intRes], r1") + A("adc %B[intRes], %[tmp1]") + A("mul %C[longIn1], %A[longIn2]") + A("add %[tmp2], r0") + A("adc %A[intRes], r1") + A("adc %B[intRes], %[tmp1]") + A("mul %B[longIn1], %A[longIn2]") + A("add %[tmp2], r1") + A("adc %A[intRes], %[tmp1]") + A("adc %B[intRes], %[tmp1]") + A("lsr %[tmp2]") + A("adc %A[intRes], %[tmp1]") + A("adc %B[intRes], %[tmp1]") + A("mul %D[longIn2], %A[longIn1]") + A("add %A[intRes], r0") + A("adc %B[intRes], r1") + A("mul %D[longIn2], %B[longIn1]") + A("add %B[intRes], r0") + A("clr r1") + : [intRes] "=&r" (intRes), + [tmp1] "=&r" (tmp1), + [tmp2] "=&r" (tmp2) + : [longIn1] "d" (longIn1), + [longIn2] "d" (longIn2) + : "cc" + ); + return intRes; +} + +// intRes = intIn1 * intIn2 >> 16 +// uses: +// r26 to store 0 +// r27 to store the byte 1 of the 24 bit result +static FORCE_INLINE uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) { + register uint8_t tmp; + register uint16_t intRes; + __asm__ __volatile__ ( + A("clr %[tmp]") + A("mul %[charIn1], %B[intIn2]") + A("movw %A[intRes], r0") + A("mul %[charIn1], %A[intIn2]") + A("add %A[intRes], r1") + A("adc %B[intRes], %[tmp]") + A("lsr r0") + A("adc %A[intRes], %[tmp]") + A("adc %B[intRes], %[tmp]") + A("clr r1") + : [intRes] "=&r" (intRes), + [tmp] "=&r" (tmp) + : [charIn1] "d" (charIn1), + [intIn2] "d" (intIn2) + : "cc" + ); + return intRes; +} + +#endif // _MATH_AVR_H_ diff --git a/Marlin/src/HAL/HAL_AVR/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_AVR/persistent_store_eeprom.cpp new file mode 100644 index 0000000000..1593b1829c --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/persistent_store_eeprom.cpp @@ -0,0 +1,68 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../shared/persistent_store_api.h" + +bool PersistentStore::access_start() { return true; } +bool PersistentStore::access_finish() { return true; } + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; // always assume success for AVR's +} + +size_t PersistentStore::capacity() { return E2END + 1; } + +#endif // EEPROM_SETTINGS +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/pinsDebug.h b/Marlin/src/HAL/HAL_AVR/pinsDebug.h new file mode 100644 index 0000000000..ea35f881e5 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/pinsDebug.h @@ -0,0 +1,410 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * PWM print routines for Atmel 8 bit AVR CPUs + */ + +#ifndef _PINSDEBUG_AVR_8_BIT_ +#define _PINSDEBUG_AVR_8_BIT_ + +#include "../../inc/MarlinConfig.h" + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS + +#if AVR_AT90USB1286_FAMILY + // Working with Teensyduino extension so need to re-define some things + #include "pinsDebug_Teensyduino.h" + // Can't use the "digitalPinToPort" function from the Teensyduino type IDEs + // portModeRegister takes a different argument + #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p) + #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p) + #define digitalPinToPort_DEBUG(p) digitalPinToPort_Teensy(p) + #define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin)) +#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70 + #include "pinsDebug_plus_70.h" + #define digitalPinToTimer_DEBUG(p) digitalPinToTimer_plus_70(p) + #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask_plus_70(p) + #define digitalPinToPort_DEBUG(p) digitalPinToPort_plus_70(p) + bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } + +#else + #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p) + #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p) + #define digitalPinToPort_DEBUG(p) digitalPinToPort(p) + bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } + #define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) +#endif + +#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0) +#if AVR_ATmega1284_FAMILY + #define DIGITAL_PIN_TO_ANALOG_PIN(P) int(analogInputToDigitalPin(0) - (P)) + #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(7) && (P) <= analogInputToDigitalPin(0)) +#else + #define DIGITAL_PIN_TO_ANALOG_PIN(P) int((P) - analogInputToDigitalPin(0)) + #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7))) +#endif +#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) +#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin + +void PRINT_ARRAY_NAME(uint8_t x) { + char *name_mem_pointer = (char*)pgm_read_ptr(&pin_array[x].name); + for (uint8_t y = 0; y < MAX_NAME_LENGTH; y++) { + char temp_char = pgm_read_byte(name_mem_pointer + y); + if (temp_char != 0) + SERIAL_CHAR(temp_char); + else { + for (uint8_t i = 0; i < MAX_NAME_LENGTH - y; i++) SERIAL_CHAR(' '); + break; + } + } +} + +#define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital) + + +#if defined(__AVR_ATmega1284P__) // 1284 IDE extensions set this to the number of + #undef NUM_DIGITAL_PINS // digital only pins while all other CPUs have it + #define NUM_DIGITAL_PINS 32 // set to digital only + digital/analog +#endif + +#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), V); SERIAL_ECHO(buffer); }while(0) +#define PWM_CASE(N,Z) \ + case TIMER##N##Z: \ + if (TCCR##N##A & (_BV(COM##N##Z##1) | _BV(COM##N##Z##0))) { \ + PWM_PRINT(OCR##N##Z); \ + return true; \ + } else return false + + + +/** + * Print a pin's PWM status. + * Return true if it's currently a PWM pin. + */ +static bool pwm_status(uint8_t pin) { + char buffer[20]; // for the sprintf statements + + switch (digitalPinToTimer_DEBUG(pin)) { + + #if defined(TCCR0A) && defined(COM0A1) + #ifdef TIMER0A + #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs + PWM_CASE(0, A); + #endif + #endif + PWM_CASE(0, B); + #endif + + #if defined(TCCR1A) && defined(COM1A1) + PWM_CASE(1, A); + PWM_CASE(1, B); + #if defined(COM1C1) && defined(TIMER1C) + PWM_CASE(1, C); + #endif + #endif + + #if defined(TCCR2A) && defined(COM2A1) + PWM_CASE(2, A); + PWM_CASE(2, B); + #endif + + #if defined(TCCR3A) && defined(COM3A1) + PWM_CASE(3, A); + PWM_CASE(3, B); + #ifdef COM3C1 + PWM_CASE(3, C); + #endif + #endif + + #ifdef TCCR4A + PWM_CASE(4, A); + PWM_CASE(4, B); + PWM_CASE(4, C); + #endif + + #if defined(TCCR5A) && defined(COM5A1) + PWM_CASE(5, A); + PWM_CASE(5, B); + PWM_CASE(5, C); + #endif + + case NOT_ON_TIMER: + default: + return false; + } + SERIAL_PROTOCOL_SP(2); +} // pwm_status + + +const volatile uint8_t* const PWM_other[][3] PROGMEM = { + { &TCCR0A, &TCCR0B, &TIMSK0 }, + { &TCCR1A, &TCCR1B, &TIMSK1 }, + #if defined(TCCR2A) && defined(COM2A1) + { &TCCR2A, &TCCR2B, &TIMSK2 }, + #endif + #if defined(TCCR3A) && defined(COM3A1) + { &TCCR3A, &TCCR3B, &TIMSK3 }, + #endif + #ifdef TCCR4A + { &TCCR4A, &TCCR4B, &TIMSK4 }, + #endif + #if defined(TCCR5A) && defined(COM5A1) + { &TCCR5A, &TCCR5B, &TIMSK5 }, + #endif +}; + + +const volatile uint8_t* const PWM_OCR[][3] PROGMEM = { + + #ifdef TIMER0A + { &OCR0A, &OCR0B, 0 }, + #else + { 0, &OCR0B, 0 }, + #endif + + #if defined(COM1C1) && defined(TIMER1C) + { (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, (const uint8_t*)&OCR1C }, + #else + { (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, 0 }, + #endif + + #if defined(TCCR2A) && defined(COM2A1) + { &OCR2A, &OCR2B, 0 }, + #endif + + #if defined(TCCR3A) && defined(COM3A1) + #ifdef COM3C1 + { (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, (const uint8_t*)&OCR3C }, + #else + { (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, 0 }, + #endif + #endif + + #ifdef TCCR4A + { (const uint8_t*)&OCR4A, (const uint8_t*)&OCR4B, (const uint8_t*)&OCR4C }, + #endif + + #if defined(TCCR5A) && defined(COM5A1) + { (const uint8_t*)&OCR5A, (const uint8_t*)&OCR5B, (const uint8_t*)&OCR5C }, + #endif +}; + + +#define TCCR_A(T) pgm_read_word(&PWM_other[T][0]) +#define TCCR_B(T) pgm_read_word(&PWM_other[T][1]) +#define TIMSK(T) pgm_read_word(&PWM_other[T][2]) +#define CS_0 0 +#define CS_1 1 +#define CS_2 2 +#define WGM_0 0 +#define WGM_1 1 +#define WGM_2 3 +#define WGM_3 4 +#define TOIE 0 + +#define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L]) + +static void err_is_counter() { SERIAL_PROTOCOLPGM(" non-standard PWM mode"); } +static void err_is_interrupt() { SERIAL_PROTOCOLPGM(" compare interrupt enabled"); } +static void err_prob_interrupt() { SERIAL_PROTOCOLPGM(" overflow interrupt enabled"); } +static void print_is_also_tied() { SERIAL_PROTOCOLPGM(" is also tied to this pin"); SERIAL_PROTOCOL_SP(14); } + +void com_print(uint8_t N, uint8_t Z) { + const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); + SERIAL_PROTOCOLPGM(" COM"); + SERIAL_PROTOCOLCHAR(N + '0'); + switch (Z) { + case 'A': + SERIAL_PROTOCOLPAIR("A: ", ((*TCCRA & (_BV(7) | _BV(6))) >> 6)); + break; + case 'B': + SERIAL_PROTOCOLPAIR("B: ", ((*TCCRA & (_BV(5) | _BV(4))) >> 4)); + break; + case 'C': + SERIAL_PROTOCOLPAIR("C: ", ((*TCCRA & (_BV(3) | _BV(2))) >> 2)); + break; + } +} + +void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout + char buffer[20]; // for the sprintf statements + const uint8_t *TCCRB = (uint8_t*)TCCR_B(T), + *TCCRA = (uint8_t*)TCCR_A(T); + uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1)))); + if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1); + + SERIAL_PROTOCOLPGM(" TIMER"); + SERIAL_PROTOCOLCHAR(T + '0'); + SERIAL_PROTOCOLCHAR(L); + SERIAL_PROTOCOL_SP(3); + + if (N == 3) { + const uint8_t *OCRVAL8 = (uint8_t*)OCR_VAL(T, L - 'A'); + PWM_PRINT(*OCRVAL8); + } + else { + const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A'); + PWM_PRINT(*OCRVAL16); + } + SERIAL_PROTOCOLPAIR(" WGM: ", WGM); + com_print(T,L); + SERIAL_PROTOCOLPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) )); + + SERIAL_PROTOCOLPGM(" TCCR"); + SERIAL_PROTOCOLCHAR(T + '0'); + SERIAL_PROTOCOLPAIR("A: ", *TCCRA); + + SERIAL_PROTOCOLPGM(" TCCR"); + SERIAL_PROTOCOLCHAR(T + '0'); + SERIAL_PROTOCOLPAIR("B: ", *TCCRB); + + const uint8_t *TMSK = (uint8_t*)TIMSK(T); + SERIAL_PROTOCOLPGM(" TIMSK"); + SERIAL_PROTOCOLCHAR(T + '0'); + SERIAL_PROTOCOLPAIR(": ", *TMSK); + + const uint8_t OCIE = L - 'A' + 1; + if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); } + else { if (WGM == 0 || WGM == 4 || WGM == 12 || WGM == 13) err_is_counter(); } + if (TEST(*TMSK, OCIE)) err_is_interrupt(); + if (TEST(*TMSK, TOIE)) err_prob_interrupt(); +} + +static void pwm_details(uint8_t pin) { + switch (digitalPinToTimer_DEBUG(pin)) { + + #if defined(TCCR0A) && defined(COM0A1) + #ifdef TIMER0A + #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs + case TIMER0A: timer_prefix(0, 'A', 3); break; + #endif + #endif + case TIMER0B: timer_prefix(0, 'B', 3); break; + #endif + + #if defined(TCCR1A) && defined(COM1A1) + case TIMER1A: timer_prefix(1, 'A', 4); break; + case TIMER1B: timer_prefix(1, 'B', 4); break; + #if defined(COM1C1) && defined(TIMER1C) + case TIMER1C: timer_prefix(1, 'C', 4); break; + #endif + #endif + + #if defined(TCCR2A) && defined(COM2A1) + case TIMER2A: timer_prefix(2, 'A', 3); break; + case TIMER2B: timer_prefix(2, 'B', 3); break; + #endif + + #if defined(TCCR3A) && defined(COM3A1) + case TIMER3A: timer_prefix(3, 'A', 4); break; + case TIMER3B: timer_prefix(3, 'B', 4); break; + #ifdef COM3C1 + case TIMER3C: timer_prefix(3, 'C', 4); break; + #endif + #endif + + #ifdef TCCR4A + case TIMER4A: timer_prefix(4, 'A', 4); break; + case TIMER4B: timer_prefix(4, 'B', 4); break; + case TIMER4C: timer_prefix(4, 'C', 4); break; + #endif + + #if defined(TCCR5A) && defined(COM5A1) + case TIMER5A: timer_prefix(5, 'A', 4); break; + case TIMER5B: timer_prefix(5, 'B', 4); break; + case TIMER5C: timer_prefix(5, 'C', 4); break; + #endif + + case NOT_ON_TIMER: break; + + } + SERIAL_PROTOCOLPGM(" "); + + // on pins that have two PWMs, print info on second PWM + #if AVR_ATmega2560_FAMILY || AVR_AT90USB1286_FAMILY + // looking for port B7 - PWMs 0A and 1C + if (digitalPinToPort_DEBUG(pin) == 'B' - 64 && 0x80 == digitalPinToBitMask_DEBUG(pin)) { + #if !AVR_AT90USB1286_FAMILY + SERIAL_PROTOCOLPGM("\n ."); + SERIAL_PROTOCOL_SP(18); + SERIAL_PROTOCOLPGM("TIMER1C"); + print_is_also_tied(); + timer_prefix(1, 'C', 4); + #else + SERIAL_PROTOCOLPGM("\n ."); + SERIAL_PROTOCOL_SP(18); + SERIAL_PROTOCOLPGM("TIMER0A"); + print_is_also_tied(); + timer_prefix(0, 'A', 3); + #endif + } + #endif +} // pwm_details + + +#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs + int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed + const uint8_t port = digitalPinToPort_DEBUG(pin); + return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask_DEBUG(pin)) ? HIGH : LOW; + } +#endif + +#ifndef PRINT_PORT + + void print_port(int8_t pin) { // print port number + #ifdef digitalPinToPort_DEBUG + uint8_t x; + SERIAL_PROTOCOLPGM(" Port: "); + #if AVR_AT90USB1286_FAMILY + x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64; + #else + x = digitalPinToPort_DEBUG(pin) + 64; + #endif + SERIAL_CHAR(x); + + #if AVR_AT90USB1286_FAMILY + if (pin == 46) + x = '2'; + else if (pin == 47) + x = '3'; + else { + uint8_t temp = digitalPinToBitMask_DEBUG(pin); + for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; + } + #else + uint8_t temp = digitalPinToBitMask_DEBUG(pin); + for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; + #endif + SERIAL_CHAR(x); + #else + SERIAL_PROTOCOL_SP(10); + #endif + } + + #define PRINT_PORT(p) print_port(p) + +#endif + +#define PRINT_PIN(p) do {sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer);} while (0) + +#endif // _PINSDEBUG_AVR_8_BIT_ diff --git a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h b/Marlin/src/HAL/HAL_AVR/pinsDebug_Teensyduino.h similarity index 83% rename from Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h rename to Marlin/src/HAL/HAL_AVR/pinsDebug_Teensyduino.h index 051972a861..840e2a22e9 100644 --- a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h +++ b/Marlin/src/HAL/HAL_AVR/pinsDebug_Teensyduino.h @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,10 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef _PINSDEBUG_TEENSYSUINO_H_ +#define _PINSDEBUG_TEENSYSUINO_H_ // // some of the pin mapping functions of the Teensduino extension to the Arduino IDE @@ -102,7 +107,9 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = { // digitalPinToBitMask(pin) is OK -#define digitalRead_mod(p) extDigitalRead(p) // Teensyduino's version of digitalRead doesn't - // disable the PWMs so we can use it as is +#define digitalRead_mod(p) digitalRead(p) // Teensyduino's version of digitalRead doesn't + // disable the PWMs so we can use it as is // portModeRegister(pin) is OK + +#endif // _PINSDEBUG_TEENSYSUINO_H_ diff --git a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h b/Marlin/src/HAL/HAL_AVR/pinsDebug_plus_70.h similarity index 93% rename from Marlin/src/HAL/AVR/pinsDebug_plus_70.h rename to Marlin/src/HAL/HAL_AVR/pinsDebug_plus_70.h index db3fdf1f76..5a0f840140 100644 --- a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h +++ b/Marlin/src/HAL/HAL_AVR/pinsDebug_plus_70.h @@ -1,6 +1,10 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,21 +17,26 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Structures for 2560 family boards that use more than 70 pins */ -#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14) - #undef NUM_DIGITAL_PINS +#ifndef _PINSDEBUG_PLUS_70_H_ +#define _PINSDEBUG_PLUS_70_H_ + +#undef NUM_DIGITAL_PINS +#if MB(BQ_ZUM_MEGA_3D) #define NUM_DIGITAL_PINS 85 #elif MB(MIGHTYBOARD_REVE) - #undef NUM_DIGITAL_PINS #define NUM_DIGITAL_PINS 80 +#elif MB(MINIRAMBO) + #define NUM_DIGITAL_PINS 85 +#elif MB(SCOOVO_X9H) + #define NUM_DIGITAL_PINS 85 #endif #define PA 1 @@ -44,7 +53,7 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = { // PORTLIST - // ------------------------ + // ------------------------------------------- PE , // PE 0 ** 0 ** USART0_RX PE , // PE 1 ** 1 ** USART0_TX PE , // PE 4 ** 2 ** PWM2 @@ -137,7 +146,7 @@ const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = { const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = { // PIN IN PORT - // ------------------------ + // ------------------------------------------- _BV( 0 ) , // PE 0 ** 0 ** USART0_RX _BV( 1 ) , // PE 1 ** 1 ** USART0_TX _BV( 4 ) , // PE 4 ** 2 ** PWM2 @@ -231,7 +240,7 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = { const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = { // TIMERS - // ------------------------ + // ------------------------------------------- NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX TIMER3B , // PE 4 ** 2 ** PWM2 @@ -327,3 +336,6 @@ const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = { * PCINT14 J5 76 * PCINT15 J6 77 */ + + +#endif // _PINSDEBUG_PLUS_70_H_ diff --git a/Marlin/src/HAL/HAL_AVR/servo_AVR.cpp b/Marlin/src/HAL/HAL_AVR/servo_AVR.cpp new file mode 100644 index 0000000000..ea227b1956 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/servo_AVR.cpp @@ -0,0 +1,218 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. All right reserved. + */ + +/** + * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + * The servos are pulsed in the background using the value most recently written using the write() method + * + * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + * + * The methods are: + * + * Servo - Class for manipulating servo motors connected to Arduino pins. + * + * attach(pin) - Attach a servo motor to an i/o pin. + * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds + * Default min is 544, max is 2400 + * + * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) + * writeMicroseconds() - Set the servo pulse width in microseconds. + * move(pin, angle) - Sequence of attach(pin), write(angle), safe_delay(servo_delay[servoIndex]). + * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after servo_delay[servoIndex]. + * read() - Get the last-written servo pulse width as an angle between 0 and 180. + * readMicroseconds() - Get the last-written servo pulse width in microseconds. + * attached() - Return true if a servo is attached. + * detach() - Stop an attached servo from pulsing its i/o pin. + * + */ + +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include +#include + +#include "../shared/servo.h" +#include "../shared/servo_private.h" + +static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) + + +/************ static functions common to all instances ***********************/ + +static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) { + if (Channel[timer] < 0) + *TCNTn = 0; // channel set to -1 indicated that refresh interval completed so reset the timer + else { + if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive) + digitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated + } + + Channel[timer]++; // increment to the next channel + if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { + *OCRnA = *TCNTn + SERVO(timer, Channel[timer]).ticks; + if (SERVO(timer, Channel[timer]).Pin.isActive) // check if activated + digitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // it's an active channel so pulse it high + } + else { + // finished all channels so wait for the refresh period to expire before starting over + if (((unsigned)*TCNTn) + 4 < usToTicks(REFRESH_INTERVAL)) // allow a few ticks to ensure the next OCR1A not missed + *OCRnA = (unsigned int)usToTicks(REFRESH_INTERVAL); + else + *OCRnA = *TCNTn + 4; // at least REFRESH_INTERVAL has elapsed + Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel + } +} + +#ifndef WIRING // Wiring pre-defines signal handlers so don't define any if compiling for the Wiring platform + + // Interrupt handlers for Arduino + #if ENABLED(_useTimer1) + SIGNAL(TIMER1_COMPA_vect) { handle_interrupts(_timer1, &TCNT1, &OCR1A); } + #endif + + #if ENABLED(_useTimer3) + SIGNAL(TIMER3_COMPA_vect) { handle_interrupts(_timer3, &TCNT3, &OCR3A); } + #endif + + #if ENABLED(_useTimer4) + SIGNAL(TIMER4_COMPA_vect) { handle_interrupts(_timer4, &TCNT4, &OCR4A); } + #endif + + #if ENABLED(_useTimer5) + SIGNAL(TIMER5_COMPA_vect) { handle_interrupts(_timer5, &TCNT5, &OCR5A); } + #endif + +#else // WIRING + + // Interrupt handlers for Wiring + #if ENABLED(_useTimer1) + void Timer1Service() { handle_interrupts(_timer1, &TCNT1, &OCR1A); } + #endif + #if ENABLED(_useTimer3) + void Timer3Service() { handle_interrupts(_timer3, &TCNT3, &OCR3A); } + #endif + +#endif // WIRING + +/****************** end of static functions ******************************/ + +void initISR(timer16_Sequence_t timer) { + #if ENABLED(_useTimer1) + if (timer == _timer1) { + TCCR1A = 0; // normal counting mode + TCCR1B = _BV(CS11); // set prescaler of 8 + TCNT1 = 0; // clear the timer count + #if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__) + SBI(TIFR, OCF1A); // clear any pending interrupts; + SBI(TIMSK, OCIE1A); // enable the output compare interrupt + #else + // here if not ATmega8 or ATmega128 + SBI(TIFR1, OCF1A); // clear any pending interrupts; + SBI(TIMSK1, OCIE1A); // enable the output compare interrupt + #endif + #ifdef WIRING + timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service); + #endif + } + #endif + + #if ENABLED(_useTimer3) + if (timer == _timer3) { + TCCR3A = 0; // normal counting mode + TCCR3B = _BV(CS31); // set prescaler of 8 + TCNT3 = 0; // clear the timer count + #ifdef __AVR_ATmega128__ + SBI(TIFR, OCF3A); // clear any pending interrupts; + SBI(ETIMSK, OCIE3A); // enable the output compare interrupt + #else + SBI(TIFR3, OCF3A); // clear any pending interrupts; + SBI(TIMSK3, OCIE3A); // enable the output compare interrupt + #endif + #ifdef WIRING + timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only + #endif + } + #endif + + #if ENABLED(_useTimer4) + if (timer == _timer4) { + TCCR4A = 0; // normal counting mode + TCCR4B = _BV(CS41); // set prescaler of 8 + TCNT4 = 0; // clear the timer count + TIFR4 = _BV(OCF4A); // clear any pending interrupts; + TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt + } + #endif + + #if ENABLED(_useTimer5) + if (timer == _timer5) { + TCCR5A = 0; // normal counting mode + TCCR5B = _BV(CS51); // set prescaler of 8 + TCNT5 = 0; // clear the timer count + TIFR5 = _BV(OCF5A); // clear any pending interrupts; + TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt + } + #endif +} + +void finISR(timer16_Sequence_t timer) { + // Disable use of the given timer + #ifdef WIRING + if (timer == _timer1) { + CBI( + #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + TIMSK1 + #else + TIMSK + #endif + , OCIE1A); // disable timer 1 output compare interrupt + timerDetach(TIMER1OUTCOMPAREA_INT); + } + else if (timer == _timer3) { + CBI( + #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + TIMSK3 + #else + ETIMSK + #endif + , OCIE3A); // disable the timer3 output compare A interrupt + timerDetach(TIMER3OUTCOMPAREA_INT); + } + #else // !WIRING + // For arduino - in future: call here to a currently undefined function to reset the timer + UNUSED(timer); + #endif +} + +#endif // HAS_SERVOS + +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/spi_pins.h b/Marlin/src/HAL/HAL_AVR/spi_pins.h new file mode 100644 index 0000000000..d4838956e7 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/spi_pins.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _SPI_PINS_H_ +#define _SPI_PINS_H_ + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + */ +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) + #define AVR_SCK_PIN 13 + #define AVR_MISO_PIN 12 + #define AVR_MOSI_PIN 11 + #define AVR_SS_PIN 10 +#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__) + #define AVR_SCK_PIN 7 + #define AVR_MISO_PIN 6 + #define AVR_MOSI_PIN 5 + #define AVR_SS_PIN 4 +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #define AVR_SCK_PIN 52 + #define AVR_MISO_PIN 50 + #define AVR_MOSI_PIN 51 + #define AVR_SS_PIN 53 +#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) + #define AVR_SCK_PIN 21 + #define AVR_MISO_PIN 23 + #define AVR_MOSI_PIN 22 + #define AVR_SS_PIN 20 +#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + #define AVR_SCK_PIN 10 + #define AVR_MISO_PIN 12 + #define AVR_MOSI_PIN 11 + #define AVR_SS_PIN 16 +#endif + +#ifndef SCK_PIN + #define SCK_PIN AVR_SCK_PIN +#endif +#ifndef MISO_PIN + #define MISO_PIN AVR_MISO_PIN +#endif +#ifndef MOSI_PIN + #define MOSI_PIN AVR_MOSI_PIN +#endif +#ifndef SS_PIN + #define SS_PIN AVR_SS_PIN +#endif + + +#endif // _SPI_PINS_H_ diff --git a/Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp new file mode 100644 index 0000000000..6af106439a --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.cpp @@ -0,0 +1,73 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog_AVR.h" + +#include "../../Marlin.h" + +// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s. +void watchdog_init() { + #if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S) + #define WDTO_NS WDTO_8S + #else + #define WDTO_NS WDTO_4S + #endif + #if ENABLED(WATCHDOG_RESET_MANUAL) + // We enable the watchdog timer, but only for the interrupt. + // Take care, as this requires the correct order of operation, with interrupts disabled. + // See the datasheet of any AVR chip for details. + wdt_reset(); + cli(); + _WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE); + _WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5 + // So worked for up to WDTO_2S + sei(); + wdt_reset(); + #else + wdt_enable(WDTO_NS); // The function handles the upper bit correct. + #endif + //delay(10000); // test it! +} + +//=========================================================================== +//=================================== ISR =================================== +//=========================================================================== + +// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled. +#if ENABLED(WATCHDOG_RESET_MANUAL) + ISR(WDT_vect) { + sei(); // With the interrupt driven serial we need to allow interrupts. + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Watchdog barked, please turn off the printer."); + kill(PSTR("ERR:Watchdog")); //kill blocks //up to 16 characters so it fits on a 16x2 display + while (1); //wait for user or serial reset + } +#endif // WATCHDOG_RESET_MANUAL + +#endif // USE_WATCHDOG +#endif // __AVR__ diff --git a/Marlin/src/HAL/HAL_AVR/watchdog_AVR.h b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.h new file mode 100644 index 0000000000..90c6185cb6 --- /dev/null +++ b/Marlin/src/HAL/HAL_AVR/watchdog_AVR.h @@ -0,0 +1,35 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _WATCHDOG_AVR_H_ +#define _WATCHDOG_AVR_H_ + +#include + +// Initialize watchdog with a 4 second interrupt time +void watchdog_init(); + +// Reset watchdog. MUST be called at least every 4 seconds after the +// first watchdog_init or AVR will go into emergency procedures. +inline void watchdog_reset() { wdt_reset(); } + +#endif // _WATCHDOG_AVR_H_ diff --git a/Marlin/src/HAL/HAL_DUE/DebugMonitor_Due.cpp b/Marlin/src/HAL/HAL_DUE/DebugMonitor_Due.cpp new file mode 100644 index 0000000000..b46a1b48ac --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/DebugMonitor_Due.cpp @@ -0,0 +1,342 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../core/macros.h" +#include "../../core/serial.h" +#include + +#include "../shared/backtrace/unwinder.h" +#include "../shared/backtrace/unwmemaccess.h" + +// Debug monitor that dumps to the Programming port all status when +// an exception or WDT timeout happens - And then resets the board + +// All the Monitor routines must run with interrupts disabled and +// under an ISR execution context. That is why we cannot reuse the +// Serial interrupt routines or any C runtime, as we don't know the +// state we are when running them + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); + +// (re)initialize UART0 as a monitor output to 250000,n,8,1 +static void TXBegin(void) { + + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( UART_IRQn ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable clock + pmc_disable_periph_clk( ID_UART ); + + // Configure PMC + pmc_enable_periph_clk( ID_UART ); + + // Disable PDC channel + UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; + + // Reset and disable receiver and transmitter + UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; + + // Configure mode: 8bit, No parity, 1 bit stop + UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; + + // Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds + UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4)); + + // Enable receiver and transmitter + UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; +} + +// Send character through UART with no interrupts +static void TX(char c) { + while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); }; + UART->UART_THR = c; +} + +// Send String through UART +static void TX(const char* s) { + while (*s) TX(*s++); +} + +static void TXDigit(uint32_t d) { + if (d < 10) TX((char)(d+'0')); + else if (d < 16) TX((char)(d+'A'-10)); + else TX('?'); +} + +// Send Hex number thru UART +static void TXHex(uint32_t v) { + TX("0x"); + for (uint8_t i = 0; i < 8; i++, v <<= 4) + TXDigit((v >> 28) & 0xF); +} + +// Send Decimal number thru UART +static void TXDec(uint32_t v) { + if (!v) { + TX('0'); + return; + } + + char nbrs[14]; + char *p = &nbrs[0]; + while (v != 0) { + *p++ = '0' + (v % 10); + v /= 10; + } + do { + p--; + TX(*p); + } while (p != &nbrs[0]); +} + +// Dump a backtrace entry +static bool UnwReportOut(void* ctx, const UnwReport* bte) { + int* p = (int*)ctx; + + (*p)++; + TX('#'); TXDec(*p); TX(" : "); + TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); + TX('+'); TXDec(bte->address - bte->function); + TX(" PC:");TXHex(bte->address); TX('\n'); + return true; +} + +#ifdef UNW_DEBUG + void UnwPrintf(const char* format, ...) { + char dest[256]; + va_list argptr; + va_start(argptr, format); + vsprintf(dest, format, argptr); + va_end(argptr); + TX(&dest[0]); + } +#endif + +/* Table of function pointers for passing to the unwinder */ +static const UnwindCallbacks UnwCallbacks = { + UnwReportOut, + UnwReadW, + UnwReadH, + UnwReadB + #if defined(UNW_DEBUG) + ,UnwPrintf + #endif +}; + +/** + * HardFaultHandler_C: + * This is called from the HardFault_HandlerAsm with a pointer the Fault stack + * as the parameter. We can then read the values from the stack and place them + * into local variables for ease of reading. + * We then read the various Fault Status and Address Registers to help decode + * cause of the fault. + * The function ends with a BKPT instruction to force control back into the debugger + */ +extern "C" +void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { + + static const char* causestr[] = { + "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" + }; + + UnwindFrame btf; + + // Dump report to the Programming port (interrupts are DISABLED) + TXBegin(); + TX("\n\n## Software Fault detected ##\n"); + TX("Cause: "); TX(causestr[cause]); TX('\n'); + + TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); + TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); + TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); + TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); + TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); + TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); + TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); + TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); + + // Configurable Fault Status Register + // Consists of MMSR, BFSR and UFSR + TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); + + // Hard Fault Status Register + TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); + + // Debug Fault Status Register + TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); + + // Auxiliary Fault Status Register + TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); + + // Read the Fault Address Registers. These may not contain valid values. + // Check BFARVALID/MMARVALID to see if they are valid values + // MemManage Fault Address Register + TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); + + // Bus Fault Address Register + TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); + + TX("ExcLR: "); TXHex(lr); TX('\n'); + TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); + + btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer + btf.fp = btf.sp; + btf.lr = ((unsigned long)sp[5]); + btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it + + // Perform a backtrace + TX("\nBacktrace:\n\n"); + int ctr = 0; + UnwindStart(&btf, &UnwCallbacks, &ctr); + + // Disable all NVIC interrupts + NVIC->ICER[0] = 0xFFFFFFFF; + NVIC->ICER[1] = 0xFFFFFFFF; + + // Relocate VTOR table to default position + SCB->VTOR = 0; + + // Disable USB + otg_disable(); + + // Restart watchdog + WDT_Restart(WDT); + + // Reset controller + NVIC_SystemReset(); + for (;;) WDT_Restart(WDT); +} + +__attribute__((naked)) void NMI_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#0") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void HardFault_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#1") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void MemManage_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#2") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void BusFault_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#3") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void UsageFault_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#4") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void DebugMon_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#5") + A("b HardFault_HandlerC") + ); +} + +/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ +__attribute__((naked)) void WDT_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#6") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void RSTC_Handler(void) { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#7") + A("b HardFault_HandlerC") + ); +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/EepromEmulation_Due.cpp b/Marlin/src/HAL/HAL_DUE/EepromEmulation_Due.cpp new file mode 100644 index 0000000000..bd5e051f2c --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/EepromEmulation_Due.cpp @@ -0,0 +1,1034 @@ + +/* EEPROM emulation over flash with reduced wear + * + * We will use 2 contiguous groups of pages as main and alternate. + * We want an structure that allows to read as fast as possible, + * without the need of scanning the whole FLASH memory. + * + * FLASH bits default erased state is 1, and can be set to 0 + * on a per bit basis. To reset them to 1, a full page erase + * is needed. + * + * Values are stored as differences that should be applied to a + * completely erased EEPROM (filled with 0xFFs). We just encode + * the starting address of the values to change, the length of + * the block of new values, and the values themselves. All diffs + * are accumulated into a RAM buffer, compacted into the least + * amount of non overlapping diffs possible and sorted by starting + * address before being saved into the next available page of FLASH + * of the current group. + * Once the current group is completely full, we compact it and save + * it into the other group, then erase the current group and switch + * to that new group and set it as current. + * + * The FLASH endurance is about 1/10 ... 1/100 of an EEPROM + * endurance, but EEPROM endurance is specified per byte, not + * per page. We can't emulate EE endurance with FLASH for all + * bytes, but we can emulate endurance for a given percent of + * bytes. + * + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../shared/persistent_store_api.h" +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) && DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) + +#include + +#define EEPROMSize 4096 +#define PagesPerGroup 128 +#define GroupCount 2 +#define PageSize 256 + + /* Flash storage */ +typedef struct FLASH_SECTOR { + uint8_t page[PageSize]; +} FLASH_SECTOR_T; + +#define PAGE_FILL \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + +#define FLASH_INIT_FILL \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL + +/* This is the FLASH area used to emulate a 2Kbyte EEPROM -- We need this buffer aligned + to a 256 byte boundary. */ +static const uint8_t flashStorage[PagesPerGroup * GroupCount * PageSize] __attribute__ ((aligned (PageSize))) = { FLASH_INIT_FILL }; + +/* Get the address of an specific page */ +static const FLASH_SECTOR_T* getFlashStorage(int page) { + return (const FLASH_SECTOR_T*)&flashStorage[page*PageSize]; +} + +static uint8_t buffer[256] = {0}; // The RAM buffer to accumulate writes +static uint8_t curPage = 0; // Current FLASH page inside the group +static uint8_t curGroup = 0xFF; // Current FLASH group + +//#define EE_EMU_DEBUG +#ifdef EE_EMU_DEBUG + static void ee_Dump(int page,const void* data) { + + const uint8_t* c = (const uint8_t*) data; + char buffer[80]; + + sprintf(buffer, "Page: %d (0x%04x)\n", page, page); + SERIAL_PROTOCOL(buffer); + + char* p = &buffer[0]; + for (int i = 0; i< PageSize; ++i) { + if ((i & 15) == 0) { + p += sprintf(p,"%04x] ",i); + } + + p += sprintf(p," %02x",c[i]); + if ((i & 15) == 15) { + *p++ = '\n'; + *p = 0; + SERIAL_PROTOCOL(buffer); + p = &buffer[0]; + } + } + } +#endif + +/* Flash Writing Protection Key */ +#define FWP_KEY 0x5Au + +#if SAM4S_SERIES + #define EEFC_FCR_FCMD(value) \ + ((EEFC_FCR_FCMD_Msk & ((value) << EEFC_FCR_FCMD_Pos))) + #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE | EEFC_FSR_FLERR) +#else + #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE) +#endif + + +/** + * Writes the contents of the specified page (no previous erase) + * @param page (page #) + * @param data (pointer to the data buffer) + */ +__attribute__ ((long_call, section (".ramfunc"))) +static bool ee_PageWrite(uint16_t page,const void* data) { + + int i; + uint32_t addrflash = ((uint32_t)getFlashStorage(page)); + + // Read the flash contents + uint32_t pageContents[PageSize>>2]; + memcpy(pageContents, (void*)addrflash, PageSize); + + // We ONLY want to toggle bits that have changed, and that have changed to 0. + // SAM3X8E tends to destroy contiguous bits if reprogrammed without erasing, so + // we try by all means to avoid this. That is why it says: "The Partial + // Programming mode works only with 128-bit (or higher) boundaries. It cannot + // be used with boundaries lower than 128 bits (8, 16 or 32-bit for example)." + // All bits that did not change, set them to 1. + for (i = 0; i > 2; i++) { + pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i])); + } + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM PageWrite ",page); + SERIAL_ECHOLNPAIR(" in FLASH address ",(uint32_t)addrflash); + SERIAL_ECHOLNPAIR(" base address ",(uint32_t)getFlashStorage(0)); + SERIAL_FLUSH(); + #endif + + // Get the page relative to the start of the EFC controller, and the EFC controller to use + Efc *efc; + uint16_t fpage; + if (addrflash >= IFLASH1_ADDR) { + efc = EFC1; + fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE; + } + else { + efc = EFC0; + fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE; + } + + // Get the page that must be unlocked, then locked + uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1)); + + // Disable all interrupts + __disable_irq(); + + // Get the FLASH wait states + uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos; + + // Set wait states to 6 (SAM errata) + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(6); + + // Unlock the flash page + uint32_t status; + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Unlock failure for page ",page); + #endif + return false; + } + + // Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption. + const uint32_t * aligned_src = (const uint32_t *) &pageContents[0]; /*data;*/ + uint32_t * p_aligned_dest = (uint32_t *) addrflash; + for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) { + *p_aligned_dest++ = *aligned_src++; + } + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_WPL); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Write failure for page ",page); + #endif + return false; + } + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + // Compare contents + if (memcmp(getFlashStorage(page),data,PageSize)) { + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Verify Write failure for page ",page); + + ee_Dump( page,(uint32_t *) addrflash); + ee_Dump(-page,data); + + // Calculate count of changed bits + uint32_t* p1 = (uint32_t*)addrflash; + uint32_t* p2 = (uint32_t*)data; + int count = 0; + for (i =0; i> 2; i++) { + if (p1[i] != p2[i]) { + uint32_t delta = p1[i] ^ p2[i]; + while (delta) { + if ((delta&1) != 0) + count++; + delta >>= 1; + } + } + } + SERIAL_ECHOLNPAIR("--> Differing bits: ",count); + #endif + + return false; + } + + return true; +} + +/** + * Erases the contents of the specified page + * @param page (page #) + */ +__attribute__ ((long_call, section (".ramfunc"))) +static bool ee_PageErase(uint16_t page) { + + int i; + uint32_t addrflash = ((uint32_t)getFlashStorage(page)); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM PageErase ", page); + SERIAL_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash); + SERIAL_ECHOLNPAIR(" base address ", (uint32_t)getFlashStorage(0)); + SERIAL_FLUSH(); + #endif + + // Get the page relative to the start of the EFC controller, and the EFC controller to use + Efc *efc; + uint16_t fpage; + if (addrflash >= IFLASH1_ADDR) { + efc = EFC1; + fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE; + } + else { + efc = EFC0; + fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE; + } + + // Get the page that must be unlocked, then locked + uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1)); + + // Disable all interrupts + __disable_irq(); + + // Get the FLASH wait states + uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos; + + // Set wait states to 6 (SAM errata) + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(6); + + // Unlock the flash page + uint32_t status; + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Unlock failure for page ",page); + #endif + return false; + } + + // Erase Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption. + uint32_t * p_aligned_dest = (uint32_t *) addrflash; + for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) { + *p_aligned_dest++ = 0xFFFFFFFF; + } + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_EWPL); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Erase failure for page ",page); + #endif + return false; + } + + // Restore original wait states + efc->EEFC_FMR = efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + // Check erase + uint32_t * aligned_src = (uint32_t *) addrflash; + for (i = 0; i < PageSize >> 2; i++) { + if (*aligned_src++ != 0xFFFFFFFF) { + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Verify Erase failure for page ",page); + + ee_Dump( page,(uint32_t *) addrflash); + #endif + return false; + } + } + + return true; +} +static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer = false) { + + uint32_t baddr; + uint32_t blen; + + // If we were requested an address outside of the emulated range, fail now + if (address >= EEPROMSize) + return false; + + // Check that the value is not contained in the RAM buffer + if (!excludeRAMBuffer) { + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + blen = buffer[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Return it! + return buffer[i + 3 + address - baddr]; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + } + + // It is NOT on the RAM buffer. It could be stored in FLASH. We are + // ensured on a given FLASH page, address contents are never repeated + // but on different pages, there is no such warranty, so we must go + // backwards from the last written FLASH page to the first one. + for (int page = curPage - 1; page >= 0; --page) { + + // Get a pointer to the flash page + uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = pflash[i] | (pflash[i + 1] << 8); + + // Get the length of the block + blen = pflash[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Return it! + return pflash[i + 3 + address - baddr]; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + } + + // If reached here, value is not stored, so return its default value + return 0xFF; +} + +static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer = false) { + uint32_t baddr; + uint32_t blen; + uint32_t nextAddr = 0xFFFF; + uint32_t nextRange = 0; + + // Check that the value is not contained in the RAM buffer + if (!excludeRAMBuffer) { + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + blen = buffer[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if address and address + 1 is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Return it! + return address | ((blen - address + baddr) << 16); + } + + // Otherwise, check if we can use it as a limit + if (baddr > address && baddr < nextAddr) { + nextAddr = baddr; + nextRange = blen; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + } + + // It is NOT on the RAM buffer. It could be stored in FLASH. We are + // ensured on a given FLASH page, address contents are never repeated + // but on different pages, there is no such warranty, so we must go + // backwards from the last written FLASH page to the first one. + for (int page = curPage - 1; page >= 0; --page) { + + // Get a pointer to the flash page + uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = pflash[i] | (pflash[i + 1] << 8); + + // Get the length of the block + blen = pflash[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Return it! + return address | ((blen - address + baddr) << 16); + } + + // Otherwise, check if we can use it as a limit + if (baddr > address && baddr < nextAddr) { + nextAddr = baddr; + nextRange = blen; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + } + + // If reached here, we will return the next valid address + return nextAddr | (nextRange << 16); +} + +static bool ee_IsPageClean(int page) { + + uint32_t* pflash = (uint32_t*) getFlashStorage(page); + for (int i = 0; i < (PageSize >> 2); ++i) { + if (*pflash++ != 0xFFFFFFFF) + return false; + } + return true; +} + +static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData = 0xFF) { + + // Check if RAM buffer has something to be written + bool isEmpty = true; + uint32_t* p = (uint32_t*) &buffer[0]; + for (int j = 0; j < (PageSize >> 2); j++) { + if (*p++ != 0xFFFFFFFF) { + isEmpty = false; + break; + } + } + + // If something has to be written, do so! + if (!isEmpty) { + + // Write the current ram buffer into FLASH + ee_PageWrite(curPage + curGroup * PagesPerGroup, buffer); + + // Clear the RAM buffer + memset(buffer, 0xFF, sizeof(buffer)); + + // Increment the page to use the next time + ++curPage; + } + + // Did we reach the maximum count of available pages per group for storage ? + if (curPage < PagesPerGroup) { + + // Do we have an override address ? + if (overrideAddress < EEPROMSize) { + + // Yes, just store the value into the RAM buffer + buffer[0] = overrideAddress & 0xFF; + buffer[0 + 1] = (overrideAddress >> 8) & 0xFF; + buffer[0 + 2] = 1; + buffer[0 + 3] = overrideData; + } + + // Done! + return true; + } + + // We have no space left on the current group - We must compact the values + int i = 0; + + // Compute the next group to use + int curwPage = 0; + int curwGroup = curGroup + 1; + if (curwGroup >= GroupCount) + curwGroup = 0; + + uint32_t rdAddr = 0; + do { + + // Get the next valid range + uint32_t addrRange = ee_GetAddrRange(rdAddr, true); + + // Make sure not to skip the override address, if specified + int rdRange; + if (overrideAddress < EEPROMSize && + rdAddr <= overrideAddress && + (addrRange & 0xFFFF) > overrideAddress) { + + rdAddr = overrideAddress; + rdRange = 1; + } + else { + rdAddr = addrRange & 0xFFFF; + rdRange = addrRange >> 16; + } + + // If no range, break loop + if (rdRange == 0) + break; + + do { + + // Get the value + uint8_t rdValue = overrideAddress == rdAddr ? overrideData : ee_Read(rdAddr, true); + + // Do not bother storing default values + if (rdValue != 0xFF) { + + // If we have room, add it to the buffer + if (buffer[i + 2] == 0xFF) { + + // Uninitialized buffer, just add it! + buffer[i] = rdAddr & 0xFF; + buffer[i + 1] = (rdAddr >> 8) & 0xFF; + buffer[i + 2] = 1; + buffer[i + 3] = rdValue; + + } + else { + // Buffer already has contents. Check if we can extend it + + // Get the address of the block + uint32_t baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + uint32_t blen = buffer[i + 2]; + + // Can we expand it ? + if (rdAddr == (baddr + blen) && + i < (PageSize - 4) && /* This block has a chance to contain data AND */ + buffer[i + 2] < (PageSize - i - 3)) {/* There is room for this block to be expanded */ + + // Yes, do it + ++buffer[i + 2]; + + // And store the value + buffer[i + 3 + rdAddr - baddr] = rdValue; + + } + else { + + // No, we can't expand it - Skip the existing block + i += 3 + blen; + + // Can we create a new slot ? + if (i > (PageSize - 4)) { + + // Not enough space - Write the current buffer to FLASH + ee_PageWrite(curwPage + curwGroup * PagesPerGroup, buffer); + + // Advance write page (as we are compacting, should never overflow!) + ++curwPage; + + // Clear RAM buffer + memset(buffer, 0xFF, sizeof(buffer)); + + // Start fresh */ + i = 0; + } + + // Enough space, add the new block + buffer[i] = rdAddr & 0xFF; + buffer[i + 1] = (rdAddr >> 8) & 0xFF; + buffer[i + 2] = 1; + buffer[i + 3] = rdValue; + } + } + } + + // Go to the next address + ++rdAddr; + + // Repeat for bytes of this range + } while (--rdRange); + + // Repeat until we run out of ranges + } while (rdAddr < EEPROMSize); + + // We must erase the previous group, in preparation for the next swap + for (int page = 0; page < curPage; page++) { + ee_PageErase(page + curGroup * PagesPerGroup); + } + + // Finally, Now the active group is the created new group + curGroup = curwGroup; + curPage = curwPage; + + // Done! + return true; +} + +static bool ee_Write(uint32_t address, uint8_t data) { + + // If we were requested an address outside of the emulated range, fail now + if (address >= EEPROMSize) + return false; + + // Lets check if we have a block with that data previously defined. Block + // start addresses are always sorted in ascending order + int i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + uint32_t baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + uint32_t blen = buffer[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Just modify it + buffer[i + 3 + address - baddr] = data; + + // Done! + return true; + } + + // Maybe we could add it to the front or to the back + // of this block ? + if ((address + 1) == baddr || + address == (baddr + blen)) { + + // Potentially, it could be done. But we must ensure there is room + // so we can expand the block. Lets find how much free space remains + uint32_t iend = i; + do { + uint32_t ln = buffer[iend + 2]; + if (ln == 0xFF) break; + iend += 3 + ln; + } while (iend <= (PageSize - 4)); /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Here, inxt points to the first free address in the buffer. Do we have room ? + if (iend < PageSize) { + // Yes, at least a byte is free - We can expand the block + + // Do we have to insert at the beginning ? + if ((address + 1) == baddr) { + + // Insert at the beginning + + // Make room at the beginning for our byte + memmove(&buffer[i + 3 + 1], &buffer[i + 3], iend - i - 3); + + // Adjust the header and store the data + buffer[i] = address & 0xFF; + buffer[i + 1] = (address >> 8) & 0xFF; + buffer[i + 2]++; + buffer[i + 3] = data; + + } + else { + + // Insert at the end - There is a very interesting thing that could happen here: + // Maybe we could coalesce the next block with this block. Let's try to do it! + int inext = i + 3 + blen; + if (inext <= (PageSize - 4) && + (buffer[inext] | (buffer[inext + 1] << 8)) == (baddr + blen + 1)) { + // YES! ... we can coalesce blocks! . Do it! + + // Adjust this block header to include the next one + buffer[i + 2] += buffer[inext + 2] + 1; + + // Store data at the right place + buffer[i + 3 + blen] = data; + + // Remove the next block header and append its data + memmove(&buffer[inext + 1], &buffer[inext + 3], iend - inext - 3); + + // Finally, as we have saved 2 bytes at the end, make sure to clean them + buffer[iend - 2] = 0xFF; + buffer[iend - 1] = 0xFF; + + } + else { + // NO ... No coalescing possible yet + + // Make room at the end for our byte + memmove(&buffer[i + 3 + blen + 1], &buffer[i + 3 + blen], iend - i - 3 - blen); + + // And add the data to the block + buffer[i + 2]++; + buffer[i + 3 + blen] = data; + } + } + + // Done! + return true; + } + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + + // Value is not stored AND we can't expand previous block to contain it. We must create a new block + + // First, lets find how much free space remains + uint32_t iend = i; + while (iend <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + uint32_t ln = buffer[iend + 2]; + if (ln == 0xFF) break; + iend += 3 + ln; + } + + // If there is room for a new block, insert it at the proper place + if (iend <= (PageSize - 4)) { + + // We have room to create a new block. Do so --- But add + // the block at the proper position, sorted by starting + // address, so it will be possible to compact it with other blocks. + + // Make space + memmove(&buffer[i + 4], &buffer[i], iend - i); + + // And add the block + buffer[i] = address & 0xFF; + buffer[i + 1] = (address >> 8) & 0xFF; + buffer[i + 2] = 1; + buffer[i + 3] = data; + + // Done! + return true; + } + + // Not enough room to store this information on this FLASH page - Perform a + // flush and override the address with the specified contents + return ee_Flush(address, data); +} + +static void ee_Init() { + + // Just init once! + if (curGroup != 0xFF) + return; + + // Clean up the SRAM buffer + memset(buffer, 0xFF, sizeof(buffer)); + + // Now, we must find out the group where settings are stored + for (curGroup = 0; curGroup < GroupCount; curGroup++) { + if (!ee_IsPageClean(curGroup * PagesPerGroup)) + break; + } + + // If all groups seem to be used, default to first group + if (curGroup >= GroupCount) + curGroup = 0; + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Current Group: ",curGroup); + SERIAL_FLUSH(); + #endif + + // Now, validate that all the other group pages are empty + for (int grp = 0; grp < GroupCount; grp++) { + if (grp == curGroup) + continue; + + for (int page = 0; page < PagesPerGroup; page++) { + if (!ee_IsPageClean(grp * PagesPerGroup + page)) { + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR("EEPROM Page ",page); + SERIAL_ECHOLNPAIR(" not clean on group ",grp); + SERIAL_FLUSH(); + #endif + ee_PageErase(grp * PagesPerGroup + page); + } + } + } + + // Finally, for the active group, determine the first unused page + // and also validate that all the other ones are clean + for (curPage = 0; curPage < PagesPerGroup; curPage++) { + if (ee_IsPageClean(curGroup * PagesPerGroup + curPage)) { + #ifdef EE_EMU_DEBUG + ee_Dump(curGroup * PagesPerGroup + curPage, getFlashStorage(curGroup * PagesPerGroup + curPage)); + #endif + break; + } + } + + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("EEPROM Active page: ",curPage); + SERIAL_FLUSH(); + #endif + + // Make sure the pages following the first clean one are also clean + for (int page = curPage + 1; page < PagesPerGroup; page++) { + if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) { + #ifdef EE_EMU_DEBUG + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR("EEPROM Page ",page); + SERIAL_ECHOLNPAIR(" not clean on active group ",curGroup); + SERIAL_FLUSH(); + ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page)); + #endif + ee_PageErase(curGroup * PagesPerGroup + page); + } + } +} + +uint8_t eeprom_read_byte(uint8_t* addr) { + ee_Init(); + return ee_Read((uint32_t)addr); +} + +void eeprom_write_byte(uint8_t* addr, uint8_t value) { + ee_Init(); + ee_Write((uint32_t)addr, value); +} + +void eeprom_update_block(const void* __src, void* __dst, size_t __n) { + uint8_t* dst = (uint8_t*)__dst; + const uint8_t* src = (const uint8_t*)__src; + while (__n--) { + eeprom_write_byte(dst, *src); + ++dst; + ++src; + } +} + +void eeprom_read_block(void* __dst, const void* __src, size_t __n) { + uint8_t* dst = (uint8_t*)__dst; + uint8_t* src = (uint8_t*)__src; + while (__n--) { + *dst = eeprom_read_byte(src); + ++dst; + ++src; + } +} + +void eeprom_flush(void) { + ee_Flush(); +} + +#endif // ENABLED(EEPROM_SETTINGS) && DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) +#endif // ARDUINO_ARCH_AVR \ No newline at end of file diff --git a/Marlin/src/HAL/HAL_DUE/HAL.cpp b/Marlin/src/HAL/HAL_DUE/HAL.cpp new file mode 100644 index 0000000000..9d932d94db --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL.cpp @@ -0,0 +1,137 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * Description: HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifdef ARDUINO_ARCH_SAM + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include +#include "usb/usb_task.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// HAL initialization task +void HAL_init(void) { + // Initialize the USB stack + #if ENABLED(SDSUPPORT) + OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up + #endif + usb_task_init(); +} + +// HAL idle task +void HAL_idletask(void) { + // Perform USB stack housekeeping + usb_task_idle(); +} + +// Disable interrupts +void cli(void) { noInterrupts(); } + +// Enable interrupts +void sei(void) { interrupts(); } + +void HAL_clear_reset_source(void) { } + +uint8_t HAL_get_reset_source(void) { + switch ((RSTC->RSTC_SR >> 8) & 0x07) { + case 0: return RST_POWER_ON; + case 1: return RST_BACKUP; + case 2: return RST_WATCHDOG; + case 3: return RST_SOFTWARE; + case 4: return RST_EXTERNAL; + default: return 0; + } +} + +void _delay_ms(const int delay_ms) { + // Todo: port for Due? + delay(delay_ms); +} + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +// Return free memory between end of heap (or end bss) and whatever is current +int freeMemory() { + int free_memory, heap_end = (int)_sbrk(0); + return (int)&free_memory - (heap_end ? heap_end : (int)&_ebss); +} + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + HAL_adc_result = analogRead(adc_pin); +} + +uint16_t HAL_adc_get_result(void) { + // nop + return HAL_adc_result; +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/HAL.h b/Marlin/src/HAL/HAL_DUE/HAL.h new file mode 100644 index 0000000000..7cba8097ce --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL.h @@ -0,0 +1,185 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifndef _HAL_DUE_H +#define _HAL_DUE_H + +#define CPU_32_BIT + +#include + +#include + +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" +#include "fastio_Due.h" +#include "watchdog_Due.h" +#include "HAL_timers_Due.h" + +// +// Defines +// +#define NUM_SERIAL 1 +#define MYSERIAL0 customizedSerial + +// We need the previous define before the include, or compilation bombs... +#include "MarlinSerial_Due.h" +#include "MarlinSerialUSB_Due.h" + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +#ifndef vsnprintf_P + #define vsnprintf_P vsnprintf +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef int8_t pin_t; + +#define HAL_SERVO_LIB Servo + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +extern uint16_t HAL_adc_result; // result of last ADC conversion + +void cli(void); // Disable interrupts +void sei(void); // Enable interrupts + +void HAL_clear_reset_source(void); // clear reset reason +uint8_t HAL_get_reset_source(void); // get reset reason + +void _delay_ms(const int delay); + +int freeMemory(void); + +/** + * SPI: Extended functions taking a channel number (hardware SPI only) + */ + +// Write single byte to specified SPI channel +void spiSend(uint32_t chan, byte b); + +// Write buffer to specified SPI channel +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); + +// Read single byte from specified SPI channel +uint8_t spiRec(uint32_t chan); + +/** + * EEPROM + */ + +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +/** + * ADC + */ + +#define HAL_ANALOG_SELECT(pin) + +inline void HAL_adc_init(void) {}//todo + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(void); +uint16_t HAL_getAdcReading(uint8_t chan); +void HAL_startAdcConversion(uint8_t chan); +uint8_t HAL_pinToAdcChannel(int pin); +uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); +//uint16_t HAL_getAdcSuperSample(uint8_t chan); +void HAL_enable_AdcFreerun(void); +//void HAL_disable_AdcFreerun(uint8_t chan); + +/** + * Pin Map + */ +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +/** + * Tone + */ +void toneInit(); +void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0); +void noTone(const pin_t _pin); + +// Enable hooks into idle and setup for HAL +#define HAL_IDLETASK 1 +#define HAL_INIT 1 +void HAL_idletask(void); +void HAL_init(void); + +#ifdef __cplusplus + extern "C" { +#endif +char *dtostrf (double __val, signed char __width, unsigned char __prec, char *__s); +#ifdef __cplusplus + } +#endif + +#endif // _HAL_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp b/Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp new file mode 100644 index 0000000000..a45306e316 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp @@ -0,0 +1,865 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + * + * Completely rewritten and tuned by Eduardo José Tagle in 2017/2018 + * in ARM thumb2 inline assembler and tuned for maximum speed and performance + * allowing SPI clocks of up to 12 Mhz to increase SD card read/write performance + */ + +/** + * Description: HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifdef ARDUINO_ARCH_SAM + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(DUE_SOFTWARE_SPI) + + // -------------------------------------------------------------------------- + // software SPI + // -------------------------------------------------------------------------- + + // Make sure GCC optimizes this file. + // Note that this line triggers a bug in GCC which is fixed by casting. + // See the note below. + #pragma GCC optimize (3) + + typedef uint8_t (*pfnSpiTransfer)(uint8_t b); + typedef void (*pfnSpiRxBlock)(uint8_t* buf, uint32_t nbyte); + typedef void (*pfnSpiTxBlock)(const uint8_t* buf, uint32_t nbyte); + + /* ---------------- Macros to be able to access definitions from asm */ + #define _PORT(IO) DIO ## IO ## _WPORT + #define _PIN_MASK(IO) MASK(DIO ## IO ## _PIN) + #define _PIN_SHIFT(IO) DIO ## IO ## _PIN + #define PORT(IO) _PORT(IO) + #define PIN_MASK(IO) _PIN_MASK(IO) + #define PIN_SHIFT(IO) _PIN_SHIFT(IO) + + // run at ~8 .. ~10Mhz - Tx version (Rx data discarded) + static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0 + register uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ + register uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); + register uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + register uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + register uint32_t idx = 0; + + /* Negate bout, as the assembler requires a negated value */ + bout = ~bout; + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + /* Bit 7 */ + A("ubfx %[idx],%[txval],#7,#1") /* Place bit 7 in bit 0 of idx*/ + + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#6,#1") /* Place bit 6 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 6 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#5,#1") /* Place bit 5 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 5 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#4,#1") /* Place bit 4 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 4 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#3,#1") /* Place bit 3 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 3 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#2,#1") /* Place bit 2 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 2 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#1,#1") /* Place bit 1 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 1 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#0,#1") /* Place bit 0 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 0 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("nop") /* Result will be 0 */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + : [idx]"+r"( idx ) + : [txval]"r"( bout ) , + [mosi_mask]"r"( MOSI_MASK ), + [mosi_port]"r"( MOSI_PORT_PLUS30 ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + + return 0; + } + + // Calculates the bit band alias address and returns a pointer address to word. + // addr: The byte address of bitbanding bit. + // bit: The bit position of bitbanding bit. + #define BITBAND_ADDRESS(addr, bit) \ + (((uint32_t)(addr) & 0xF0000000) + 0x02000000 + ((uint32_t)(addr)&0xFFFFF)*32 + (bit)*4) + + // run at ~8 .. ~10Mhz - Rx version (Tx line not altered) + static uint8_t spiTransferRx0(uint8_t bout) { // using Mode 0 + register uint32_t bin = 0; + register uint32_t work = 0; + register uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ + register uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + register uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + UNUSED(bout); + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + /* bit 7 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */ + + /* bit 6 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */ + + /* bit 5 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */ + + /* bit 4 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */ + + /* bit 3 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */ + + /* bit 2 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */ + + /* bit 1 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */ + + /* bit 0 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ + + : [bin]"+r"(bin), + [work]"+r"(work) + : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + + return bin; + } + + // run at ~4Mhz + static uint8_t spiTransfer1(uint8_t b) { // using Mode 0 + int bits = 8; + do { + WRITE(MOSI_PIN, b & 0x80); + b <<= 1; // little setup time + + WRITE(SCK_PIN, HIGH); + DELAY_NS(125); // 10 cycles @ 84mhz + + b |= (READ(MISO_PIN) != 0); + + WRITE(SCK_PIN, LOW); + DELAY_NS(125); // 10 cycles @ 84mhz + } while (--bits); + return b; + } + + // all the others + static uint32_t spiDelayCyclesX4 = (F_CPU/1000000); // 4uS => 125khz + + static uint8_t spiTransferX(uint8_t b) { // using Mode 0 + int bits = 8; + do { + WRITE(MOSI_PIN, b & 0x80); + b <<= 1; // little setup time + + WRITE(SCK_PIN, HIGH); + __delay_4cycles(spiDelayCyclesX4); + + b |= (READ(MISO_PIN) != 0); + + WRITE(SCK_PIN, LOW); + __delay_4cycles(spiDelayCyclesX4); + } while (--bits); + return b; + } + + // Pointers to generic functions for byte transfers + + /** + * Note: The cast is unnecessary, but without it, this file triggers a GCC 4.8.3-2014 bug. + * Later GCC versions do not have this problem, but at this time (May 2018) Arduino still + * uses that buggy and obsolete GCC version!! + */ + static pfnSpiTransfer spiTransferRx = (pfnSpiTransfer)spiTransferX; + static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX; + + // Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded) + static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) { + register uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ + register uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); + register uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + register uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + register uint32_t work = 0; + register uint32_t txval = 0; + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + L("loop%=") + A("ldrb.w %[txval], [%[ptr]], #1") /* Load value to send, increment buffer */ + A("mvn %[txval],%[txval]") /* Negate value */ + + /* Bit 7 */ + A("ubfx %[work],%[txval],#7,#1") /* Place bit 7 in bit 0 of work*/ + + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#6,#1") /* Place bit 6 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 6 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#5,#1") /* Place bit 5 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 5 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#4,#1") /* Place bit 4 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 4 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#3,#1") /* Place bit 3 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 3 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#2,#1") /* Place bit 2 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 2 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#1,#1") /* Place bit 1 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 1 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#0,#1") /* Place bit 0 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 0 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("subs %[todo],#1") /* Decrement count of pending words to send, update status */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bne.n loop%=") /* Repeat until done */ + + : [ptr]"+r" ( ptr ) , + [todo]"+r" ( todo ) , + [work]"+r"( work ) , + [txval]"+r"( txval ) + : [mosi_mask]"r"( MOSI_MASK ), + [mosi_port]"r"( MOSI_PORT_PLUS30 ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + } + + static void spiRxBlock0(uint8_t* ptr, uint32_t todo) { + register uint32_t bin = 0; + register uint32_t work = 0; + register uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ + register uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + register uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + L("loop%=") + + /* bit 7 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */ + + /* bit 6 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */ + + /* bit 5 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */ + + /* bit 4 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */ + + /* bit 3 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */ + + /* bit 2 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */ + + /* bit 1 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */ + + /* bit 0 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ + + A("subs %[todo],#1") /* Decrement count of pending words to send, update status */ + A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */ + A("bne.n loop%=") /* Repeat until done */ + + : [ptr]"+r"(ptr), + [todo]"+r"(todo), + [bin]"+r"(bin), + [work]"+r"(work) + : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + } + + static void spiTxBlockX(const uint8_t* buf, uint32_t todo) { + do { + (void) spiTransferTx(*buf++); + } while (--todo); + } + + static void spiRxBlockX(uint8_t* buf, uint32_t todo) { + do { + *buf++ = spiTransferRx(0xFF); + } while (--todo); + } + + // Pointers to generic functions for block tranfers + static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; + static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; + + #if MB(ALLIGATOR) // control SDSS pin + void spiBegin() { + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + } + + uint8_t spiRec() { + WRITE(SS_PIN, LOW); + WRITE(MOSI_PIN, 1); /* Output 1s 1*/ + uint8_t b = spiTransferRx(0xFF); + WRITE(SS_PIN, HIGH); + return b; + } + + void spiRead(uint8_t* buf, uint16_t nbyte) { + uint32_t todo = nbyte; + if (todo == 0) return; + + WRITE(SS_PIN, LOW); + WRITE(MOSI_PIN, 1); /* Output 1s 1*/ + spiRxBlock(buf,nbyte); + WRITE(SS_PIN, HIGH); + } + + void spiSend(uint8_t b) { + WRITE(SS_PIN, LOW); + (void) spiTransferTx(b); + WRITE(SS_PIN, HIGH); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + WRITE(SS_PIN, LOW); + (void) spiTransferTx(token); + spiTxBlock(buf,512); + WRITE(SS_PIN, HIGH); + + #else // let calling routine control SDSS + void spiBegin() { + SET_OUTPUT(SS_PIN); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + } + + uint8_t spiRec() { + WRITE(MOSI_PIN, 1); /* Output 1s 1*/ + uint8_t b = spiTransferRx(0xFF); + return b; + } + + void spiRead(uint8_t* buf, uint16_t nbyte) { + uint32_t todo = nbyte; + if (todo == 0) return; + + WRITE(MOSI_PIN, 1); /* Output 1s 1*/ + spiRxBlock(buf,nbyte); + } + + void spiSend(uint8_t b) { + (void) spiTransferTx(b); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + (void) spiTransferTx(token); + spiTxBlock(buf,512); + + #endif + + } + + /** + * spiRate should be + * 0 : 8 - 10 MHz + * 1 : 4 - 5 MHz + * 2 : 2 - 2.5 MHz + * 3 : 1 - 1.25 MHz + * 4 : 500 - 625 kHz + * 5 : 250 - 312 kHz + * 6 : 125 - 156 kHz + */ + void spiInit(uint8_t spiRate) { + switch (spiRate) { + case 0: + spiTransferTx = (pfnSpiTransfer)spiTransferTx0; + spiTransferRx = (pfnSpiTransfer)spiTransferRx0; + spiTxBlock = (pfnSpiTxBlock)spiTxBlock0; + spiRxBlock = (pfnSpiRxBlock)spiRxBlock0; + break; + case 1: + spiTransferTx = (pfnSpiTransfer)spiTransfer1; + spiTransferRx = (pfnSpiTransfer)spiTransfer1; + spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; + spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; + break; + default: + spiDelayCyclesX4 = (F_CPU/1000000) >> (6 - spiRate); + spiTransferTx = (pfnSpiTransfer)spiTransferX; + spiTransferRx = (pfnSpiTransfer)spiTransferX; + spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; + spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; + break; + } + + #if MB(ALLIGATOR) + WRITE(SS_PIN, HIGH); + #endif + WRITE(MOSI_PIN, HIGH); + WRITE(SCK_PIN, LOW); + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // TODO: to be implemented + } + + #pragma GCC reset_options + +#else // !SOFTWARE_SPI + + #if MB(ALLIGATOR) + + // slave selects controlled by SPI controller + // doesn't support changing SPI speeds for SD card + + // -------------------------------------------------------------------------- + // hardware SPI + // -------------------------------------------------------------------------- + // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz + int spiDueDividors[] = { 10, 21, 42, 84, 168, 255, 255 }; + bool spiInitMaded = false; + + void spiBegin() { + if (spiInitMaded == false) { + // Configure SPI pins + PIO_Configure( + g_APinDescription[SCK_PIN].pPort, + g_APinDescription[SCK_PIN].ulPinType, + g_APinDescription[SCK_PIN].ulPin, + g_APinDescription[SCK_PIN].ulPinConfiguration); + PIO_Configure( + g_APinDescription[MOSI_PIN].pPort, + g_APinDescription[MOSI_PIN].ulPinType, + g_APinDescription[MOSI_PIN].ulPin, + g_APinDescription[MOSI_PIN].ulPinConfiguration); + PIO_Configure( + g_APinDescription[MISO_PIN].pPort, + g_APinDescription[MISO_PIN].ulPinType, + g_APinDescription[MISO_PIN].ulPin, + g_APinDescription[MISO_PIN].ulPinConfiguration); + + // set master mode, peripheral select, fault detection + SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS); + SPI_Enable(SPI0); + + #if MB(ALLIGATOR) + SET_OUTPUT(DAC0_SYNC); + #if EXTRUDERS > 1 + SET_OUTPUT(DAC1_SYNC); + WRITE(DAC1_SYNC, HIGH); + #endif + SET_OUTPUT(SPI_EEPROM1_CS); + SET_OUTPUT(SPI_EEPROM2_CS); + SET_OUTPUT(SPI_FLASH_CS); + WRITE(DAC0_SYNC, HIGH); + WRITE(SPI_EEPROM1_CS, HIGH ); + WRITE(SPI_EEPROM2_CS, HIGH ); + WRITE(SPI_FLASH_CS, HIGH ); + WRITE(SS_PIN, HIGH ); + #endif // MB(ALLIGATOR) + + OUT_WRITE(SDSS,0); + + PIO_Configure( + g_APinDescription[SPI_PIN].pPort, + g_APinDescription[SPI_PIN].ulPinType, + g_APinDescription[SPI_PIN].ulPin, + g_APinDescription[SPI_PIN].ulPinConfiguration); + + spiInit(1); + spiInitMaded = true; + } + } + + void spiInit(uint8_t spiRate) { + if (spiInitMaded == false) { + if (spiRate > 6) spiRate = 1; + + #if MB(ALLIGATOR) + // Set SPI mode 1, clock, select not active after transfer, with delay between transfers + SPI_ConfigureNPCS(SPI0, SPI_CHAN_DAC, + SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiRate]) | + SPI_CSR_DLYBCT(1)); + // Set SPI mode 0, clock, select not active after transfer, with delay between transfers + SPI_ConfigureNPCS(SPI0, SPI_CHAN_EEPROM1, SPI_CSR_NCPHA | + SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiRate]) | + SPI_CSR_DLYBCT(1)); + #endif//MB(ALLIGATOR) + + // Set SPI mode 0, clock, select not active after transfer, with delay between transfers + SPI_ConfigureNPCS(SPI0, SPI_CHAN, SPI_CSR_NCPHA | + SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiRate]) | + SPI_CSR_DLYBCT(1)); + SPI_Enable(SPI0); + spiInitMaded = true; + } + } + + // Write single byte to SPI + void spiSend(byte b) { + // write byte with address and end transmission flag + SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER; + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // clear status + SPI0->SPI_RDR; + //DELAY_US(1U); + } + + void spiSend(const uint8_t* buf, size_t n) { + if (n == 0) return; + for (size_t i = 0; i < n - 1; i++) { + SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN); + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + SPI0->SPI_RDR; + //DELAY_US(1U); + } + spiSend(buf[n - 1]); + } + + void spiSend(uint32_t chan, byte b) { + uint8_t dummy_read = 0; + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + // write byte with address and end transmission flag + SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(chan) | SPI_TDR_LASTXFER; + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // clear status + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 1) + dummy_read = SPI0->SPI_RDR; + UNUSED(dummy_read); + } + + void spiSend(uint32_t chan, const uint8_t* buf, size_t n) { + uint8_t dummy_read = 0; + if (n == 0) return; + for (int i = 0; i < (int)n - 1; i++) { + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(chan); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 1) + dummy_read = SPI0->SPI_RDR; + UNUSED(dummy_read); + } + spiSend(chan, buf[n - 1]); + } + + // Read single byte from SPI + uint8_t spiRec() { + // write dummy byte with address and end transmission flag + SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER; + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // get byte from receive register + //DELAY_US(1U); + return SPI0->SPI_RDR; + } + + uint8_t spiRec(uint32_t chan) { + uint8_t spirec_tmp; + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 1) + spirec_tmp = SPI0->SPI_RDR; + UNUSED(spirec_tmp); + + // write dummy byte with address and end transmission flag + SPI0->SPI_TDR = 0x000000FF | SPI_PCS(chan) | SPI_TDR_LASTXFER; + + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // get byte from receive register + return SPI0->SPI_RDR; + } + + // Read from SPI into buffer + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte-- == 0) return; + + for (int i = 0; i < nbyte; i++) { + //while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + buf[i] = SPI0->SPI_RDR; + //DELAY_US(1U); + } + buf[nbyte] = spiRec(); + } + + // Write from buffer to SPI + void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN); + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + //while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + //SPI0->SPI_RDR; + for (int i = 0; i < 511; i++) { + SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN); + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + SPI0->SPI_RDR; + //DELAY_US(1U); + } + spiSend(buf[511]); + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // TODO: to be implemented + } + + #else // U8G compatible hardware SPI + + #define SPI_MODE_0_DUE_HW 2 // DUE CPHA control bit is inverted + #define SPI_MODE_1_DUE_HW 3 + #define SPI_MODE_2_DUE_HW 0 + #define SPI_MODE_3_DUE_HW 1 + + void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified) + // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz + int spiDueDividors[] = { 10, 21, 42, 84, 168, 255, 255 }; + if (spiRate > 6) spiRate = 1; + + // Enable PIOA and SPI0 + REG_PMC_PCER0 = (1UL << ID_PIOA) | (1UL << ID_SPI0); + + // Disable PIO on A26 and A27 + REG_PIOA_PDR = 0x0C000000; + OUT_WRITE(SDSS, 1); + + // Reset SPI0 (from sam lib) + SPI0->SPI_CR = SPI_CR_SPIDIS; + SPI0->SPI_CR = SPI_CR_SWRST; + SPI0->SPI_CR = SPI_CR_SWRST; + SPI0->SPI_CR = SPI_CR_SPIEN; + + // TMC2103 compatible setup + // Master mode, no fault detection, PCS bits in data written to TDR select CSR register + SPI0->SPI_MR = SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS; + // SPI mode 0, 8 Bit data transfer, baud rate + SPI0->SPI_CSR[3] = SPI_CSR_SCBR(spiDueDividors[spiRate]) | SPI_CSR_CSAAT | SPI_MODE_0_DUE_HW; // use same CSR as TMC2130 + } + + static uint8_t spiTransfer(uint8_t data) { + + // Wait until tx register is empty + while( (SPI0->SPI_SR & SPI_SR_TDRE) == 0 ); + // Send data + SPI0->SPI_TDR = (uint32_t)data | 0x00070000UL; // Add TMC2130 PCS bits to every byte + + // wait for transmit register empty + while ((SPI0->SPI_SR & SPI_SR_TDRE) == 0); + + // wait for receive register + while ((SPI0->SPI_SR & SPI_SR_RDRF) == 0); + // get byte from receive register + return SPI0->SPI_RDR; + } + + void spiBegin() { + spiInit(); + } + + uint8_t spiRec() { + uint8_t data = spiTransfer(0xFF); + return data; + } + + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte == 0) return; + for (int i = 0; i < nbyte; i++) + buf[i] = spiTransfer(0xFF); + } + + void spiSend(uint8_t data) { + spiTransfer(data); + } + + void spiSend(const uint8_t* buf, size_t n) { + if (n == 0) return; + for (uint16_t i = 0; i < n; i++) + spiTransfer(buf[i]); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + spiTransfer(token); + for (uint16_t i = 0; i < 512; i++) + spiTransfer(buf[i]); + } + + #endif // !ALLIGATOR +#endif // !SOFTWARE_SPI + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp new file mode 100644 index 0000000000..eb23692b44 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.cpp @@ -0,0 +1,158 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifdef ARDUINO_ARCH_SAM + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include "HAL_timers_Due.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 9 + +#define PRESCALER 2 +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { + { TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5] + { TC0, 1, TC1_IRQn, 0}, // 1 + { TC0, 2, TC2_IRQn, 0}, // 2 + { TC1, 0, TC3_IRQn, 2}, // 3 - stepper + { TC1, 1, TC4_IRQn, 15}, // 4 - temperature + { TC1, 2, TC5_IRQn, 3}, // 5 - [servo timer3] + { TC2, 0, TC6_IRQn, 14}, // 6 - tone + { TC2, 1, TC7_IRQn, 0}, // 7 + { TC2, 2, TC8_IRQn, 0}, // 8 +}; + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +/* + Timer_clock1: Prescaler 2 -> 42MHz + Timer_clock2: Prescaler 8 -> 10.5MHz + Timer_clock3: Prescaler 32 -> 2.625MHz + Timer_clock4: Prescaler 128 -> 656.25kHz +*/ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + Tc *tc = TimerConfig[timer_num].pTimerRegs; + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + uint32_t channel = TimerConfig[timer_num].channel; + + // Disable interrupt, just in case it was already enabled + NVIC_DisableIRQ(irq); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable timer interrupt + tc->TC_CHANNEL[channel].TC_IDR = TC_IDR_CPCS; + + // Stop timer, just in case, to be able to reconfigure it + TC_Stop(tc, channel); + + pmc_set_writeprotect(false); + pmc_enable_periph_clk((uint32_t)irq); + NVIC_SetPriority(irq, TimerConfig [timer_num].priority); + + // wave mode, reset counter on match with RC, + TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); + + // Set compare value + TC_SetRC(tc, channel, VARIANT_MCK / 2 / frequency); + + // And start timer + TC_Start(tc, channel); + + // enable interrupt on RC compare + tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPCS; + + // Finally, enable IRQ + NVIC_EnableIRQ(irq); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + NVIC_EnableIRQ(irq); +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + NVIC_DisableIRQ(irq); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +// missing from CMSIS: Check if interrupt is enabled or not +static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) { + return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0; +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + return NVIC_GetEnabledIRQ(irq); +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h new file mode 100644 index 0000000000..dd342f5471 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/HAL_timers_Due.h @@ -0,0 +1,124 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifndef _HAL_TIMERS_DUE_H +#define _HAL_TIMERS_DUE_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals + +#define STEP_TIMER_NUM 3 // index of timer to use for stepper +#define TEMP_TIMER_NUM 4 // index of timer to use for temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM +#define TONE_TIMER_NUM 6 // index of timer to use for beeper tones + +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define HAL_STEP_TIMER_ISR void TC3_Handler() +#define HAL_TEMP_TIMER_ISR void TC4_Handler() +#define HAL_TONE_TIMER_ISR void TC6_Handler() + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef struct { + Tc *pTimerRegs; + uint16_t channel; + IRQn_Type IRQ_Id; + uint8_t priority; +} tTimerConfig; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +extern const tTimerConfig TimerConfig[]; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = compare; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV; +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + // Reading the status register clears the interrupt flag + pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR; +} + +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.cpp b/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.cpp new file mode 100644 index 0000000000..9b226a60da --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.cpp @@ -0,0 +1,97 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * InterruptVectors_Due.cpp - This module relocates the Interrupt vector table to SRAM, + * allowing to register new interrupt handlers at runtime. Specially valuable and needed + * because Arduino runtime allocates some interrupt handlers that we NEED to override to + * properly support extended functionality, as for example, USB host or USB device (MSD, MTP) + * and custom serial port handlers, and we don't actually want to modify and/or recompile the + * Arduino runtime. We just want to run as much as possible on Stock Arduino + * + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + */ +#ifdef ARDUINO_ARCH_SAM + +#include "HAL.h" +#include "InterruptVectors_Due.h" + +/* The relocated Exception/Interrupt Table - According to the ARM + reference manual, alignment to 128 bytes should suffice, but in + practice, we need alignment to 256 bytes to make this work in all + cases */ +__attribute__ ((aligned(256))) +static DeviceVectors ram_tab = { NULL }; + +/** + * This function checks if the exception/interrupt table is already in SRAM or not. + * If it is not, then it copies the ROM table to the SRAM and relocates the table + * by reprogramming the NVIC registers + */ +static pfnISR_Handler* get_relocated_table_addr(void) { + // Get the address of the interrupt/exception table + uint32_t isrtab = SCB->VTOR; + + // If already relocated, we are done! + if (isrtab >= IRAM0_ADDR) + return (pfnISR_Handler*)isrtab; + + // Get the address of the table stored in FLASH + const pfnISR_Handler* romtab = (const pfnISR_Handler*)isrtab; + + // Copy it to SRAM + memcpy(&ram_tab, romtab, sizeof(ram_tab)); + + // Disable global interrupts + CRITICAL_SECTION_START; + + // Set the vector table base address to the SRAM copy + SCB->VTOR = (uint32_t)(&ram_tab); + + // Reenable interrupts + CRITICAL_SECTION_END; + + // Return the address of the table + return (pfnISR_Handler*)(&ram_tab); +} + +pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler) { + // Get the address of the relocated table + pfnISR_Handler *isrtab = get_relocated_table_addr(); + + // Disable global interrupts + CRITICAL_SECTION_START; + + // Get the original handler + pfnISR_Handler oldHandler = isrtab[irq + 16]; + + // Install the new one + isrtab[irq + 16] = newHandler; + + // Reenable interrupts + CRITICAL_SECTION_END; + + // Return the original one + return oldHandler; +} + +#endif diff --git a/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.h b/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.h new file mode 100644 index 0000000000..efc63de25d --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/InterruptVectors_Due.h @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * InterruptVectors_Due.h + * + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * + * This module relocates the Interrupt vector table to SRAM, allowing new + * interrupt handlers to be added at runtime. This is required because the + * Arduino runtime steals interrupt handlers that Marlin MUST use to support + * extended functionality such as USB hosts and USB devices (MSD, MTP) and + * custom serial port handlers. Rather than modifying and/or recompiling the + * Arduino runtime, We just want to run as much as possible on Stock Arduino. + * + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + */ + +#ifndef INTERRUPTVECTORS_DUE_H +#define INTERRUPTVECTORS_DUE_H + +#include "../../inc/MarlinConfig.h" + +#ifdef ARDUINO_ARCH_SAM + +// ISR handler type +typedef void (*pfnISR_Handler)(void); + +// Install a new interrupt vector handler for the given irq, returning the old one +pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler); + +#endif // ARDUINO_ARCH_SAM +#endif // INTERRUPTVECTORS_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.cpp b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.cpp new file mode 100644 index 0000000000..eed4c73999 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.cpp @@ -0,0 +1,292 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#if SERIAL_PORT == -1 + +#include "MarlinSerialUSB_Due.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/emergency_parser.h" +#endif + +// Imports from Atmel USB Stack/CDC implementation +extern "C" { + bool usb_task_cdc_isenabled(void); + bool usb_task_cdc_dtr_active(void); + bool udi_cdc_is_rx_ready(void); + int udi_cdc_getc(void); + bool udi_cdc_is_tx_ready(void); + int udi_cdc_putc(int value); +}; + +// Pending character +static int pending_char = -1; + +#if ENABLED(EMERGENCY_PARSER) + static EmergencyParser::State emergency_state; // = EP_RESET +#endif + +// Public Methods +void MarlinSerialUSB::begin(const long baud_setting) { +} + +void MarlinSerialUSB::end() { +} + +int MarlinSerialUSB::peek(void) { + if (pending_char >= 0) + return pending_char; + + // If USB CDC not enumerated or not configured on the PC side + if (!usb_task_cdc_isenabled()) + return -1; + + // If no bytes sent from the PC + if (!udi_cdc_is_rx_ready()) + return -1; + + pending_char = udi_cdc_getc(); + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, (char)pending_char); + #endif + + return pending_char; +} + +int MarlinSerialUSB::read(void) { + if (pending_char >= 0) { + int ret = pending_char; + pending_char = -1; + return ret; + } + + // If USB CDC not enumerated or not configured on the PC side + if (!usb_task_cdc_isenabled()) + return -1; + + // If no bytes sent from the PC + if (!udi_cdc_is_rx_ready()) + return -1; + + int c = udi_cdc_getc(); + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, (char)c); + #endif + + return c; +} + +bool MarlinSerialUSB::available(void) { + /* If Pending chars */ + return pending_char >= 0 || + /* or USB CDC enumerated and configured on the PC side and some + bytes where sent to us */ + (usb_task_cdc_isenabled() && udi_cdc_is_rx_ready()); +} + +void MarlinSerialUSB::flush(void) { +} + +void MarlinSerialUSB::write(const uint8_t c) { + + /* Do not even bother sending anything if USB CDC is not enumerated + or not configured on the PC side or there is no program on the PC + listening to our messages */ + if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) + return; + + /* Wait until the PC has read the pending to be sent data */ + while (usb_task_cdc_isenabled() && + usb_task_cdc_dtr_active() && + !udi_cdc_is_tx_ready()) { + }; + + /* Do not even bother sending anything if USB CDC is not enumerated + or not configured on the PC side or there is no program on the PC + listening to our messages at this point */ + if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) + return; + + // Fifo full + // udi_cdc_signal_overrun(); + udi_cdc_putc(c); +} + +/** +* Imports from print.h +*/ + +void MarlinSerialUSB::print(char c, int base) { + print((long)c, base); +} + +void MarlinSerialUSB::print(unsigned char b, int base) { + print((unsigned long)b, base); +} + +void MarlinSerialUSB::print(int n, int base) { + print((long)n, base); +} + +void MarlinSerialUSB::print(unsigned int n, int base) { + print((unsigned long)n, base); +} + +void MarlinSerialUSB::print(long n, int base) { + if (base == 0) + write(n); + else if (base == 10) { + if (n < 0) { + print('-'); + n = -n; + } + printNumber(n, 10); + } + else + printNumber(n, base); +} + +void MarlinSerialUSB::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); +} + +void MarlinSerialUSB::print(double n, int digits) { + printFloat(n, digits); +} + +void MarlinSerialUSB::println(void) { + print('\r'); + print('\n'); +} + +void MarlinSerialUSB::println(const String& s) { + print(s); + println(); +} + +void MarlinSerialUSB::println(const char c[]) { + print(c); + println(); +} + +void MarlinSerialUSB::println(char c, int base) { + print(c, base); + println(); +} + +void MarlinSerialUSB::println(unsigned char b, int base) { + print(b, base); + println(); +} + +void MarlinSerialUSB::println(int n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(unsigned int n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(long n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(unsigned long n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(double n, int digits) { + print(n, digits); + println(); +} + +// Private Methods + +void MarlinSerialUSB::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); +} + +void MarlinSerialUSB::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i = 0; i < digits; ++i) + rounding *= 0.1; + + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } + } +} + +// Preinstantiate +MarlinSerialUSB customizedSerial; + +#endif // SERIAL_PORT == -1 + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.h b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.h new file mode 100644 index 0000000000..bfa2ccedc0 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/MarlinSerialUSB_Due.h @@ -0,0 +1,95 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MarlinSerialUSB_Due.h - Hardware Serial over USB (CDC) library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + */ + +#ifndef MARLINSERIALUSB_DUE_H +#define MARLINSERIALUSB_DUE_H + +#include "../../inc/MarlinConfig.h" + +#if SERIAL_PORT == -1 + +#include + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 + +class MarlinSerialUSB { + +public: + MarlinSerialUSB() {}; + static void begin(const long); + static void end(); + static int peek(void); + static int read(void); + static void flush(void); + static bool available(void); + static void write(const uint8_t c); + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + FORCE_INLINE static uint32_t dropped() { return 0; } + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + FORCE_INLINE static int rxMaxEnqueued() { return 0; } + #endif + + FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } + FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } + FORCE_INLINE static void print(const char* str) { write(str); } + + static void print(char, int = 0); + static void print(unsigned char, int = 0); + static void print(int, int = DEC); + static void print(unsigned int, int = DEC); + static void print(long, int = DEC); + static void print(unsigned long, int = DEC); + static void print(double, int = 2); + + static void println(const String& s); + static void println(const char[]); + static void println(char, int = 0); + static void println(unsigned char, int = 0); + static void println(int, int = DEC); + static void println(unsigned int, int = DEC); + static void println(long, int = DEC); + static void println(unsigned long, int = DEC); + static void println(double, int = 2); + static void println(void); + operator bool() { return true; } + +private: + static void printNumber(unsigned long, const uint8_t); + static void printFloat(double, uint8_t); +}; + +extern MarlinSerialUSB customizedSerial; + +#endif // SERIAL_PORT == -1 +#endif // MARLINSERIAL_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp new file mode 100644 index 0000000000..0ff98e62ff --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.cpp @@ -0,0 +1,703 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#include "MarlinSerial_Due.h" +#include "InterruptVectors_Due.h" +#include "../../Marlin.h" + +// If not using the USB port as serial port +#if SERIAL_PORT >= 0 + + // Based on selected port, use the proper configuration + #if SERIAL_PORT == 0 + #define HWUART UART + #define HWUART_IRQ UART_IRQn + #define HWUART_IRQ_ID ID_UART + #elif SERIAL_PORT == 1 + #define HWUART ((Uart*)USART0) + #define HWUART_IRQ USART0_IRQn + #define HWUART_IRQ_ID ID_USART0 + #elif SERIAL_PORT == 2 + #define HWUART ((Uart*)USART1) + #define HWUART_IRQ USART1_IRQn + #define HWUART_IRQ_ID ID_USART1 + #elif SERIAL_PORT == 3 + #define HWUART ((Uart*)USART2) + #define HWUART_IRQ USART2_IRQn + #define HWUART_IRQ_ID ID_USART2 + #elif SERIAL_PORT == 4 + #define HWUART ((Uart*)USART3) + #define HWUART_IRQ USART3_IRQn + #define HWUART_IRQ_ID ID_USART3 + #endif + + struct ring_buffer_r { + unsigned char buffer[RX_BUFFER_SIZE]; + volatile ring_buffer_pos_t head, tail; + }; + + #if TX_BUFFER_SIZE > 0 + struct ring_buffer_t { + unsigned char buffer[TX_BUFFER_SIZE]; + volatile uint8_t head, tail; + }; + #endif + + ring_buffer_r rx_buffer = { { 0 }, 0, 0 }; + #if TX_BUFFER_SIZE > 0 + ring_buffer_t tx_buffer = { { 0 }, 0, 0 }; + #endif + static bool _written; + + #if ENABLED(SERIAL_XON_XOFF) + constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent + XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send + // XON / XOFF character definitions + constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19; + uint8_t xon_xoff_state = XON_XOFF_CHAR_SENT | XON_CHAR; + + // Validate that RX buffer size is at least 4096 bytes- According to several experiments, on + // the original Arduino Due that uses a ATmega16U2 as USB to serial bridge, due to the introduced + // latencies, at least 2959 bytes of RX buffering (when transmitting at 250kbits/s) are required + // to avoid overflows. + + #if RX_BUFFER_SIZE < 4096 + #error Arduino DUE requires at least 4096 bytes of RX buffer to avoid buffer overflows when using XON/XOFF handshake + #endif + #endif + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + uint8_t rx_dropped_bytes = 0; + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + uint8_t rx_buffer_overruns = 0; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + uint8_t rx_framing_errors = 0; + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + ring_buffer_pos_t rx_max_enqueued = 0; + #endif + + // A SW memory barrier, to ensure GCC does not overoptimize loops + #define sw_barrier() asm volatile("": : :"memory"); + + #if ENABLED(EMERGENCY_PARSER) + #include "../../feature/emergency_parser.h" + #endif + + // (called with RX interrupts disabled) + FORCE_INLINE void store_rxd_char() { + + #if ENABLED(EMERGENCY_PARSER) + static EmergencyParser::State emergency_state; // = EP_RESET + #endif + + // Get the tail - Nothing can alter its value while we are at this ISR + const ring_buffer_pos_t t = rx_buffer.tail; + + // Get the head pointer + ring_buffer_pos_t h = rx_buffer.head; + + // Get the next element + ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + uint8_t c = HWUART->UART_RHR; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the RX FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + // Calculate count of bytes stored into the RX buffer + + // Keep track of the maximum count of enqueued bytes + NOLESS(rx_max_enqueued, rx_count); + #endif + + #if ENABLED(SERIAL_XON_XOFF) + // If the last char that was sent was an XON + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { + + // Bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // If over 12.5% of RX buffer capacity, send XOFF before running out of + // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react + // and stop sending bytes. This translates to 13mS propagation time. + if (rx_count >= (RX_BUFFER_SIZE) / 8) { + + // At this point, definitely no TX interrupt was executing, since the TX isr can't be preempted. + // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens + // to be in the middle of trying to disable the RX interrupt in the main program, eventually the + // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure + // the sending of the XOFF char is to send it HERE AND NOW. + + // About to send the XOFF char + xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; + + // Wait until the TX register becomes empty and send it - Here there could be a problem + // - While waiting for the TX register to empty, the RX register could receive a new + // character. This must also handle that situation! + uint32_t status; + while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) { + + if (status & UART_SR_RXRDY) { + // We received a char while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + c = HWUART->UART_RHR; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + } + sw_barrier(); + } + + HWUART->UART_THR = XOFF_CHAR; + + // At this point there could be a race condition between the write() function + // and this sending of the XOFF char. This interrupt could happen between the + // wait to be empty TX buffer loop and the actual write of the character. Since + // the TX buffer is full because it's sending the XOFF char, the only way to be + // sure the write() function will succeed is to wait for the XOFF char to be + // completely sent. Since an extra character could be received during the wait + // it must also be handled! + while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) { + + if (status & UART_SR_RXRDY) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + + // Read the character from the USART + c = HWUART->UART_RHR; + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + #if ENABLED(SERIAL_STATS_DROPPED_RX) + else if (!++rx_dropped_bytes) --rx_dropped_bytes; + #endif + } + sw_barrier(); + } + + // At this point everything is ready. The write() function won't + // have any issues writing to the UART TX register if it needs to! + } + } + #endif // SERIAL_XON_XOFF + + // Store the new head value + rx_buffer.head = h; + } + + #if TX_BUFFER_SIZE > 0 + + FORCE_INLINE void _tx_thr_empty_irq(void) { + // Read positions + uint8_t t = tx_buffer.tail; + const uint8_t h = tx_buffer.head; + + #if ENABLED(SERIAL_XON_XOFF) + // If an XON char is pending to be sent, do it now + if (xon_xoff_state == XON_CHAR) { + + // Send the character + HWUART->UART_THR = XON_CHAR; + + // Remember we sent it. + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + + // If nothing else to transmit, just disable TX interrupts. + if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY; + + return; + } + #endif + + // If nothing to transmit, just disable TX interrupts. This could + // happen as the result of the non atomicity of the disabling of RX + // interrupts that could end reenabling TX interrupts as a side effect. + if (h == t) { + HWUART->UART_IDR = UART_IDR_TXRDY; + return; + } + + // There is something to TX, Send the next byte + const uint8_t c = tx_buffer.buffer[t]; + t = (t + 1) & (TX_BUFFER_SIZE - 1); + HWUART->UART_THR = c; + tx_buffer.tail = t; + + // Disable interrupts if there is nothing to transmit following this byte + if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY; + } + + #endif // TX_BUFFER_SIZE > 0 + + static void UART_ISR(void) { + const uint32_t status = HWUART->UART_SR; + + // Data received? + if (status & UART_SR_RXRDY) store_rxd_char(); + + #if TX_BUFFER_SIZE > 0 + // Something to send, and TX interrupts are enabled (meaning something to send)? + if ((status & UART_SR_TXRDY) && (HWUART->UART_IMR & UART_IMR_TXRDY)) _tx_thr_empty_irq(); + #endif + + // Acknowledge errors + if ((status & UART_SR_OVRE) || (status & UART_SR_FRAME)) { + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + if (status & UART_SR_OVRE && !++rx_dropped_bytes) --rx_dropped_bytes; + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + if (status & UART_SR_OVRE && !++rx_buffer_overruns) --rx_buffer_overruns; + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + if (status & UART_SR_FRAME && !++rx_framing_errors) --rx_framing_errors; + #endif + + // TODO: error reporting outside ISR + HWUART->UART_CR = UART_CR_RSTSTA; + } + } + + // Public Methods + + void MarlinSerial::begin(const long baud_setting) { + + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( HWUART_IRQ ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable clock + pmc_disable_periph_clk( HWUART_IRQ_ID ); + + // Configure PMC + pmc_enable_periph_clk( HWUART_IRQ_ID ); + + // Disable PDC channel + HWUART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; + + // Reset and disable receiver and transmitter + HWUART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; + + // Configure mode: 8bit, No parity, 1 bit stop + HWUART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; + + // Configure baudrate (asynchronous, no oversampling) + HWUART->UART_BRGR = (SystemCoreClock / (baud_setting << 4)); + + // Configure interrupts + HWUART->UART_IDR = 0xFFFFFFFF; + HWUART->UART_IER = UART_IER_RXRDY | UART_IER_OVRE | UART_IER_FRAME; + + // Install interrupt handler + install_isr(HWUART_IRQ, UART_ISR); + + // Configure priority. We need a very high priority to avoid losing characters + // and we need to be able to preempt the Stepper ISR and everything else! + // (this could probably be fixed by using DMA with the Serial port) + NVIC_SetPriority(HWUART_IRQ, 1); + + // Enable UART interrupt in NVIC + NVIC_EnableIRQ(HWUART_IRQ); + + // Enable receiver and transmitter + HWUART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; + + #if TX_BUFFER_SIZE > 0 + _written = false; + #endif + } + + void MarlinSerial::end() { + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( HWUART_IRQ ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + pmc_disable_periph_clk( HWUART_IRQ_ID ); + } + + int MarlinSerial::peek(void) { + const int v = rx_buffer.head == rx_buffer.tail ? -1 : rx_buffer.buffer[rx_buffer.tail]; + return v; + } + + int MarlinSerial::read(void) { + + const ring_buffer_pos_t h = rx_buffer.head; + ring_buffer_pos_t t = rx_buffer.tail; + + if (h == t) return -1; + + int v = rx_buffer.buffer[t]; + t = (ring_buffer_pos_t)(t + 1) & (RX_BUFFER_SIZE - 1); + + // Advance tail + rx_buffer.tail = t; + + #if ENABLED(SERIAL_XON_XOFF) + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + // Get count of bytes in the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(RX_BUFFER_SIZE - 1); + // When below 10% of RX buffer capacity, send XON before running out of RX buffer bytes + if (rx_count < (RX_BUFFER_SIZE) / 10) { + #if TX_BUFFER_SIZE > 0 + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX isr. + HWUART->UART_IER = UART_IER_TXRDY; + #else + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); + HWUART->UART_THR = XON_CHAR; + #endif + } + } + #endif + + return v; + } + + ring_buffer_pos_t MarlinSerial::available(void) { + const ring_buffer_pos_t h = rx_buffer.head, t = rx_buffer.tail; + return (ring_buffer_pos_t)(RX_BUFFER_SIZE + h - t) & (RX_BUFFER_SIZE - 1); + } + + void MarlinSerial::flush(void) { + rx_buffer.tail = rx_buffer.head; + + #if ENABLED(SERIAL_XON_XOFF) + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + #if TX_BUFFER_SIZE > 0 + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX isr. + HWUART->UART_IER = UART_IER_TXRDY; + #else + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); + HWUART->UART_THR = XON_CHAR; + #endif + } + #endif + } + + #if TX_BUFFER_SIZE > 0 + void MarlinSerial::write(const uint8_t c) { + _written = true; + + // If the TX interrupts are disabled and the data register + // is empty, just write the byte to the data register and + // be done. This shortcut helps significantly improve the + // effective datarate at high (>500kbit/s) bitrates, where + // interrupt overhead becomes a slowdown. + // Yes, there is a race condition between the sending of the + // XOFF char at the RX isr, but it is properly handled there + if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) { + HWUART->UART_THR = c; + return; + } + + const uint8_t i = (tx_buffer.head + 1) & (TX_BUFFER_SIZE - 1); + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Make room by polling if it is possible to transmit, and do so! + while (i == tx_buffer.tail) { + // If we can transmit another byte, do it. + if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq(); + // Make sure compiler rereads tx_buffer.tail + sw_barrier(); + } + } + else { + // Interrupts are enabled, just wait until there is space + while (i == tx_buffer.tail) sw_barrier(); + } + + // Store new char. head is always safe to move + tx_buffer.buffer[tx_buffer.head] = c; + tx_buffer.head = i; + + // Enable TX isr - Non atomic, but it will eventually enable TX isr + HWUART->UART_IER = UART_IER_TXRDY; + } + + void MarlinSerial::flushTX(void) { + // TX + + // If we have never written a byte, no need to flush. This special + // case is needed since there is no way to force the TXC (transmit + // complete) bit to 1 during initialization + if (!_written) return; + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Wait until everything was transmitted - We must do polling, as interrupts are disabled + while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) { + // If there is more space, send an extra character + if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq(); + sw_barrier(); + } + + } + else { + // Wait until everything was transmitted + while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier(); + } + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } + + #else // TX_BUFFER_SIZE == 0 + + void MarlinSerial::write(const uint8_t c) { + _written = true; + while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); + HWUART->UART_THR = c; + } + + void MarlinSerial::flushTX(void) { + // TX + + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // Wait until everything was transmitted + while (!(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier(); + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } + #endif // TX_BUFFER_SIZE == 0 + + /** + * Imports from print.h + */ + + void MarlinSerial::print(char c, int base) { + print((long)c, base); + } + + void MarlinSerial::print(unsigned char b, int base) { + print((unsigned long)b, base); + } + + void MarlinSerial::print(int n, int base) { + print((long)n, base); + } + + void MarlinSerial::print(unsigned int n, int base) { + print((unsigned long)n, base); + } + + void MarlinSerial::print(long n, int base) { + if (base == 0) write(n); + else if (base == 10) { + if (n < 0) { print('-'); n = -n; } + printNumber(n, 10); + } + else + printNumber(n, base); + } + + void MarlinSerial::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); + } + + void MarlinSerial::print(double n, int digits) { + printFloat(n, digits); + } + + void MarlinSerial::println(void) { + print('\r'); + print('\n'); + } + + void MarlinSerial::println(const String& s) { + print(s); + println(); + } + + void MarlinSerial::println(const char c[]) { + print(c); + println(); + } + + void MarlinSerial::println(char c, int base) { + print(c, base); + println(); + } + + void MarlinSerial::println(unsigned char b, int base) { + print(b, base); + println(); + } + + void MarlinSerial::println(int n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(unsigned int n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(long n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(unsigned long n, int base) { + print(n, base); + println(); + } + + void MarlinSerial::println(double n, int digits) { + print(n, digits); + println(); + } + + // Private Methods + + void MarlinSerial::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); + } + + void MarlinSerial::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i = 0; i < digits; ++i) rounding *= 0.1; + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } + } + } + + // Preinstantiate + MarlinSerial customizedSerial; +#endif + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h new file mode 100644 index 0000000000..2f5a07f515 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/MarlinSerial_Due.h @@ -0,0 +1,148 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MarlinSerial_Due.h - Hardware serial library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. + */ + +#ifndef MARLINSERIAL_DUE_H +#define MARLINSERIAL_DUE_H + +#include "../../inc/MarlinConfig.h" + +#if SERIAL_PORT >= 0 + +#include + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 + +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which rx_buffer_head is the index of the +// location to which to write the next incoming character and rx_buffer_tail +// is the index of the location from which to read. +// 256 is the max limit due to uint8_t head and tail. Use only powers of 2. (...,16,32,64,128,256) +#ifndef RX_BUFFER_SIZE + #define RX_BUFFER_SIZE 128 +#endif +#ifndef TX_BUFFER_SIZE + #define TX_BUFFER_SIZE 32 +#endif + +//#if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 +// #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops." +//#elif RX_BUFFER_SIZE && (RX_BUFFER_SIZE < 2 || !IS_POWER_OF_2(RX_BUFFER_SIZE)) +// #error "RX_BUFFER_SIZE must be a power of 2 greater than 1." +//#elif TX_BUFFER_SIZE && (TX_BUFFER_SIZE < 2 || TX_BUFFER_SIZE > 256 || !IS_POWER_OF_2(TX_BUFFER_SIZE)) +// #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256." +//#endif + +#if RX_BUFFER_SIZE > 256 + typedef uint16_t ring_buffer_pos_t; +#else + typedef uint8_t ring_buffer_pos_t; +#endif + +#if ENABLED(SERIAL_STATS_DROPPED_RX) + extern uint8_t rx_dropped_bytes; +#endif + +#if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + extern uint8_t rx_buffer_overruns; +#endif + +#if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + extern uint8_t rx_framing_errors; +#endif + +#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + extern ring_buffer_pos_t rx_max_enqueued; +#endif + +class MarlinSerial { + +public: + MarlinSerial() {}; + static void begin(const long); + static void end(); + static int peek(void); + static int read(void); + static void flush(void); + static ring_buffer_pos_t available(void); + static void write(const uint8_t c); + static void flushTX(void); + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + FORCE_INLINE static uint32_t dropped() { return rx_dropped_bytes; } + #endif + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + FORCE_INLINE static uint32_t buffer_overruns() { return rx_buffer_overruns; } + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + FORCE_INLINE static uint32_t framing_errors() { return rx_framing_errors; } + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return rx_max_enqueued; } + #endif + + FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } + FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } + FORCE_INLINE static void print(const char* str) { write(str); } + + static void print(char, int = 0); + static void print(unsigned char, int = 0); + static void print(int, int = DEC); + static void print(unsigned int, int = DEC); + static void print(long, int = DEC); + static void print(unsigned long, int = DEC); + static void print(double, int = 2); + + static void println(const String& s); + static void println(const char[]); + static void println(char, int = 0); + static void println(unsigned char, int = 0); + static void println(int, int = DEC); + static void println(unsigned int, int = DEC); + static void println(long, int = DEC); + static void println(unsigned long, int = DEC); + static void println(double, int = 2); + static void println(void); + operator bool() { return true; } + +private: + static void printNumber(unsigned long, const uint8_t); + static void printFloat(double, uint8_t); +}; + +extern MarlinSerial customizedSerial; + +#endif // SERIAL_PORT >= 0 + +#endif // MARLINSERIAL_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/SanityCheck.h b/Marlin/src/HAL/HAL_DUE/SanityCheck.h new file mode 100644 index 0000000000..f24233a859 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/SanityCheck.h @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Test Arduino Due specific configuration values for errors at compile-time. + */ + +/** + * HARDWARE VS. SOFTWARE SPI COMPATIBILITY + * + * DUE selects hardware vs. software SPI depending on whether one of the hardware-controllable SDSS pins is in use. + * + * The hardware SPI controller doesn't allow software SPIs to control any shared pins. + * + * When DUE software SPI is used then Trinamic drivers must use the TMC softSPI. + * + * When DUE hardware SPI is used then a Trinamic driver can use either its hardware SPI or, if there are no shared + * pins, its software SPI. + * + * Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time + * as the TMC2130 soft SPI the most common setup. + */ +#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN)) + +#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130) + #if ENABLED(TMC_USE_SW_SPI) + #if DISABLED(DUE_SOFTWARE_SPI) && (_IS_HW_SPI(MOSI) || _IS_HW_SPI(MISO) || _IS_HW_SPI(SCK)) + #error "DUE hardware SPI is required but is incompatible with TMC2130 software SPI. Either disable TMC_USE_SW_SPI or use separate pins for the two SPIs." + #endif + #elif ENABLED(DUE_SOFTWARE_SPI) + #error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix." + #endif +#endif diff --git a/Marlin/src/HAL/HAL_DUE/ServoTimers.h b/Marlin/src/HAL/HAL_DUE/ServoTimers.h new file mode 100644 index 0000000000..8d5d0fa583 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/ServoTimers.h @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2013 Arduino LLC. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * Defines for 16 bit timers used with Servo library + * + * If _useTimerX is defined then TimerX is a 32 bit timer on the current board + * timer16_Sequence_t enumerates the sequence that the timers should be allocated + * _Nbr_16timers indicates how many timers are available. + */ + +/** + * SAM Only definitions + * -------------------- + */ + +// For SAM3X: +//!#define _useTimer1 +//!#define _useTimer2 +#define _useTimer3 +//!#define _useTimer4 +#define _useTimer5 + +#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays +#define PRESCALER 32 // timer prescaler + +/* + TC0, chan 0 => TC0_Handler + TC0, chan 1 => TC1_Handler + TC0, chan 2 => TC2_Handler + TC1, chan 0 => TC3_Handler + TC1, chan 1 => TC4_Handler + TC1, chan 2 => TC5_Handler + TC2, chan 0 => TC6_Handler + TC2, chan 1 => TC7_Handler + TC2, chan 2 => TC8_Handler + */ + +#ifdef _useTimer1 + #define TC_FOR_TIMER1 TC1 + #define CHANNEL_FOR_TIMER1 0 + #define ID_TC_FOR_TIMER1 ID_TC3 + #define IRQn_FOR_TIMER1 TC3_IRQn + #define HANDLER_FOR_TIMER1 TC3_Handler +#endif +#ifdef _useTimer2 + #define TC_FOR_TIMER2 TC1 + #define CHANNEL_FOR_TIMER2 1 + #define ID_TC_FOR_TIMER2 ID_TC4 + #define IRQn_FOR_TIMER2 TC4_IRQn + #define HANDLER_FOR_TIMER2 TC4_Handler +#endif +#ifdef _useTimer3 + #define TC_FOR_TIMER3 TC1 + #define CHANNEL_FOR_TIMER3 2 + #define ID_TC_FOR_TIMER3 ID_TC5 + #define IRQn_FOR_TIMER3 TC5_IRQn + #define HANDLER_FOR_TIMER3 TC5_Handler +#endif +#ifdef _useTimer4 + #define TC_FOR_TIMER4 TC0 + #define CHANNEL_FOR_TIMER4 2 + #define ID_TC_FOR_TIMER4 ID_TC2 + #define IRQn_FOR_TIMER4 TC2_IRQn + #define HANDLER_FOR_TIMER4 TC2_Handler +#endif +#ifdef _useTimer5 + #define TC_FOR_TIMER5 TC0 + #define CHANNEL_FOR_TIMER5 0 + #define ID_TC_FOR_TIMER5 ID_TC0 + #define IRQn_FOR_TIMER5 TC0_IRQn + #define HANDLER_FOR_TIMER5 TC0_Handler +#endif + +//typedef enum { _timer1, _timer2, _timer3, _timer4, _timer5, _Nbr_16timers } timer16_Sequence_t; +typedef enum { _timer3, _timer5, _Nbr_16timers } timer16_Sequence_t; diff --git a/Marlin/src/HAL/HAL_DUE/Servo_Due.cpp b/Marlin/src/HAL/HAL_DUE/Servo_Due.cpp new file mode 100644 index 0000000000..d2207d91aa --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/Servo_Due.cpp @@ -0,0 +1,160 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/* + Copyright (c) 2013 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include +#include "../shared/servo.h" +#include "../shared/servo_private.h" + +static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) + +//------------------------------------------------------------------------------ +/// Interrupt handler for the TC0 channel 1. +//------------------------------------------------------------------------------ +void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel); + +#ifdef _useTimer1 + void HANDLER_FOR_TIMER1(void) { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); } +#endif +#ifdef _useTimer2 + void HANDLER_FOR_TIMER2(void) { Servo_Handler(_timer2, TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); } +#endif +#ifdef _useTimer3 + void HANDLER_FOR_TIMER3(void) { Servo_Handler(_timer3, TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); } +#endif +#ifdef _useTimer4 + void HANDLER_FOR_TIMER4(void) { Servo_Handler(_timer4, TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); } +#endif +#ifdef _useTimer5 + void HANDLER_FOR_TIMER5(void) { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); } +#endif + +void Servo_Handler(timer16_Sequence_t timer, Tc *tc, uint8_t channel) { + // clear interrupt + tc->TC_CHANNEL[channel].TC_SR; + if (Channel[timer] < 0) + tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer + else if (SERVO_INDEX(timer,Channel[timer]) < ServoCount && SERVO(timer,Channel[timer]).Pin.isActive) + digitalWrite(SERVO(timer,Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated + + Channel[timer]++; // increment to the next channel + if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { + tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks; + if (SERVO(timer,Channel[timer]).Pin.isActive) // check if activated + digitalWrite( SERVO(timer,Channel[timer]).Pin.nbr,HIGH); // its an active channel so pulse it high + } + else { + // finished all channels so wait for the refresh period to expire before starting over + tc->TC_CHANNEL[channel].TC_RA = + tc->TC_CHANNEL[channel].TC_CV < usToTicks(REFRESH_INTERVAL) - 4 + ? (unsigned int)usToTicks(REFRESH_INTERVAL) // allow a few ticks to ensure the next OCR1A not missed + : tc->TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed + Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel + } +} + +static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) { + pmc_enable_periph_clk(id); + TC_Configure(tc, channel, + TC_CMR_TCCLKS_TIMER_CLOCK3 | // MCK/32 + TC_CMR_WAVE | // Waveform mode + TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC + + /* 84MHz, MCK/32, for 1.5ms: 3937 */ + TC_SetRA(tc, channel, 2625); // 1ms + + /* Configure and enable interrupt */ + NVIC_EnableIRQ(irqn); + // TC_IER_CPAS: RA Compare + tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; + + // Enables the timer clock and performs a software reset to start the counting + TC_Start(tc, channel); +} + +void initISR(timer16_Sequence_t timer) { + #ifdef _useTimer1 + if (timer == _timer1) + _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1); + #endif + #ifdef _useTimer2 + if (timer == _timer2) + _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2); + #endif + #ifdef _useTimer3 + if (timer == _timer3) + _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3); + #endif + #ifdef _useTimer4 + if (timer == _timer4) + _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4); + #endif + #ifdef _useTimer5 + if (timer == _timer5) + _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5); + #endif +} + +void finISR(timer16_Sequence_t timer) { + #ifdef _useTimer1 + TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); + #endif + #ifdef _useTimer2 + TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); + #endif + #ifdef _useTimer3 + TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); + #endif + #ifdef _useTimer4 + TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); + #endif + #ifdef _useTimer5 + TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); + #endif +} + +#endif // HAS_SERVOS + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/Tone.cpp b/Marlin/src/HAL/HAL_DUE/Tone.cpp new file mode 100644 index 0000000000..55c03f5e58 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/Tone.cpp @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: Tone function for Arduino Due and compatible (SAM3X8E) + * Derived from http://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012 + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "HAL.h" +#include "HAL_timers_Due.h" + +static pin_t tone_pin; +volatile static int32_t toggles; + +void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) { + tone_pin = _pin; + toggles = 2 * frequency * duration / 1000; + HAL_timer_start(TONE_TIMER_NUM, 2 * frequency); +} + +void noTone(const pin_t _pin) { + HAL_timer_disable_interrupt(TONE_TIMER_NUM); + digitalWrite(_pin, LOW); +} + +HAL_TONE_TIMER_ISR { + static uint8_t pin_state = 0; + HAL_timer_isr_prologue(TONE_TIMER_NUM); + + if (toggles) { + toggles--; + digitalWrite(tone_pin, (pin_state ^= 1)); + } + else noTone(tone_pin); // turn off interrupt +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h b/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h new file mode 100644 index 0000000000..42cdba19fc --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/endstop_interrupts.h @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.update(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); // assign it + #endif + #if HAS_X_MIN + attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_DUE/fastio_Due.h b/Marlin/src/HAL/HAL_DUE/fastio_Due.h new file mode 100644 index 0000000000..bb25f45174 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/fastio_Due.h @@ -0,0 +1,499 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Fast I/O Routines for SAM3X8E + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +/** + * Description: Fast IO functions for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + * Note the code here was specifically crafted by disassembling what GCC produces + * out of it, so GCC is able to optimize it out as much as possible to the least + * amount of instructions. Be very carefull if you modify them, as "clean code" + * leads to less efficient compiled code!! + */ + +#ifndef _FASTIO_DUE_H +#define _FASTIO_DUE_H + +#include + +/** + * Utility functions + */ + +// Due has 12 PWMs assigned to logical pins 2-13. +// 6, 7, 8 & 9 come from the PWM controller. The others come from the timers. +#define USEABLE_HARDWARE_PWM(p) ((2 <= p) && (p <= 13)) + +#ifndef MASK + #define MASK(PIN) (1 << PIN) +#endif + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); + * + * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + */ + +// Read a pin +#define _READ(IO) bool(DIO ## IO ## _WPORT -> PIO_PDSR & MASK(DIO ## IO ## _PIN)) + +// Write to a pin +#define _WRITE_VAR(IO,V) do { \ + volatile Pio* port = digitalPinToPort(IO); \ + uint32_t mask = digitalPinToBitMask(IO); \ + if (V) port->PIO_SODR = mask; \ + else port->PIO_CODR = mask; \ +} while(0) + +// Write to a pin +#define _WRITE(IO,V) do { \ + volatile Pio* port = (DIO ## IO ## _WPORT); \ + uint32_t mask = MASK(DIO ## IO ## _PIN); \ + if (V) port->PIO_SODR = mask; \ + else port->PIO_CODR = mask; \ +} while(0) + +// Toggle a pin +#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) + +// Set pin as input +#define _SET_INPUT(IO) do{ \ + pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \ + PIO_Configure(digitalPinToPort(IO), PIO_INPUT, digitalPinToBitMask(IO), 0); \ +}while(0) + +// Set pin as output +#define _SET_OUTPUT(IO) do{ \ + pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \ + PIO_Configure(digitalPinToPort(IO), _READ(IO) ? PIO_OUTPUT_1 : PIO_OUTPUT_0, digitalPinToBitMask(IO), g_APinDescription[IO].ulPinConfiguration); \ + g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT;\ +}while(0) + +// Set pin as input with pullup mode +#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) + +// Read a pin (wrapper) +#define READ(IO) _READ(IO) + +// Write to a pin (wrapper) +#define WRITE_VAR(IO,V) _WRITE_VAR(IO,V) +#define WRITE(IO,V) _WRITE(IO,V) + +// Toggle a pin (wrapper) +#define TOGGLE(IO) _TOGGLE(IO) + +// Set pin as input (wrapper) +#define SET_INPUT(IO) _SET_INPUT(IO) +// Set pin as input with pullup (wrapper) +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) +// Set pin as output (wrapper) - reads the pin and sets the output to that value +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) + +// Check if pin is an input +#define GET_INPUT(IO) !(digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) +// Check if pin is an output +#define GET_OUTPUT(IO) !!(digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) +// Check if pin is a timer - Must be a constexpr +#define GET_TIMER(IO) ((IO) >= 2 && (IO) <= 13) + +// Shorthand +#define OUT_WRITE(IO,V) { SET_OUTPUT(IO); WRITE(IO,V); } + +/** + * Ports and functions + * Added as necessary or if I feel like it- not a comprehensive list! + */ + +// UART +#define RXD DIO0 +#define TXD DIO1 + +// TWI (I2C) +#define SCL DIO21 +#define SDA DIO20 + +/** + * pins + */ + +#define DIO0_PIN 8 +#define DIO0_WPORT PIOA + +#define DIO1_PIN 9 +#define DIO1_WPORT PIOA + +#define DIO2_PIN 25 +#define DIO2_WPORT PIOB + +#define DIO3_PIN 28 +#define DIO3_WPORT PIOC + +#define DIO4_PIN 26 +#define DIO4_WPORT PIOC + +#define DIO5_PIN 25 +#define DIO5_WPORT PIOC + +#define DIO6_PIN 24 +#define DIO6_WPORT PIOC + +#define DIO7_PIN 23 +#define DIO7_WPORT PIOC + +#define DIO8_PIN 22 +#define DIO8_WPORT PIOC + +#define DIO9_PIN 21 +#define DIO9_WPORT PIOC + +#define DIO10_PIN 29 +#define DIO10_WPORT PIOC + +#define DIO11_PIN 7 +#define DIO11_WPORT PIOD + +#define DIO12_PIN 8 +#define DIO12_WPORT PIOD + +#define DIO13_PIN 27 +#define DIO13_WPORT PIOB + +#define DIO14_PIN 4 +#define DIO14_WPORT PIOD + +#define DIO15_PIN 5 +#define DIO15_WPORT PIOD + +#define DIO16_PIN 13 +#define DIO16_WPORT PIOA + +#define DIO17_PIN 12 +#define DIO17_WPORT PIOA + +#define DIO18_PIN 11 +#define DIO18_WPORT PIOA + +#define DIO19_PIN 10 +#define DIO19_WPORT PIOA + +#define DIO20_PIN 12 +#define DIO20_WPORT PIOB + +#define DIO21_PIN 13 +#define DIO21_WPORT PIOB + +#define DIO22_PIN 26 +#define DIO22_WPORT PIOB + +#define DIO23_PIN 14 +#define DIO23_WPORT PIOA + +#define DIO24_PIN 15 +#define DIO24_WPORT PIOA + +#define DIO25_PIN 0 +#define DIO25_WPORT PIOD + +#define DIO26_PIN 1 +#define DIO26_WPORT PIOD + +#define DIO27_PIN 2 +#define DIO27_WPORT PIOD + +#define DIO28_PIN 3 +#define DIO28_WPORT PIOD + +#define DIO29_PIN 6 +#define DIO29_WPORT PIOD + +#define DIO30_PIN 9 +#define DIO30_WPORT PIOD + +#define DIO31_PIN 7 +#define DIO31_WPORT PIOA + +#define DIO32_PIN 10 +#define DIO32_WPORT PIOD + +#define DIO33_PIN 1 +#define DIO33_WPORT PIOC + +#define DIO34_PIN 2 +#define DIO34_WPORT PIOC + +#define DIO35_PIN 3 +#define DIO35_WPORT PIOC + +#define DIO36_PIN 4 +#define DIO36_WPORT PIOC + +#define DIO37_PIN 5 +#define DIO37_WPORT PIOC + +#define DIO38_PIN 6 +#define DIO38_WPORT PIOC + +#define DIO39_PIN 7 +#define DIO39_WPORT PIOC + +#define DIO40_PIN 8 +#define DIO40_WPORT PIOC + +#define DIO41_PIN 9 +#define DIO41_WPORT PIOC + +#define DIO42_PIN 19 +#define DIO42_WPORT PIOA + +#define DIO43_PIN 20 +#define DIO43_WPORT PIOA + +#define DIO44_PIN 19 +#define DIO44_WPORT PIOC + +#define DIO45_PIN 18 +#define DIO45_WPORT PIOC + +#define DIO46_PIN 17 +#define DIO46_WPORT PIOC + +#define DIO47_PIN 16 +#define DIO47_WPORT PIOC + +#define DIO48_PIN 15 +#define DIO48_WPORT PIOC + +#define DIO49_PIN 14 +#define DIO49_WPORT PIOC + +#define DIO50_PIN 13 +#define DIO50_WPORT PIOC + +#define DIO51_PIN 12 +#define DIO51_WPORT PIOC + +#define DIO52_PIN 21 +#define DIO52_WPORT PIOB + +#define DIO53_PIN 14 +#define DIO53_WPORT PIOB + +#define DIO54_PIN 16 +#define DIO54_WPORT PIOA + +#define DIO55_PIN 24 +#define DIO55_WPORT PIOA + +#define DIO56_PIN 23 +#define DIO56_WPORT PIOA + +#define DIO57_PIN 22 +#define DIO57_WPORT PIOA + +#define DIO58_PIN 6 +#define DIO58_WPORT PIOA + +#define DIO59_PIN 4 +#define DIO59_WPORT PIOA + +#define DIO60_PIN 3 +#define DIO60_WPORT PIOA + +#define DIO61_PIN 2 +#define DIO61_WPORT PIOA + +#define DIO62_PIN 17 +#define DIO62_WPORT PIOB + +#define DIO63_PIN 18 +#define DIO63_WPORT PIOB + +#define DIO64_PIN 19 +#define DIO64_WPORT PIOB + +#define DIO65_PIN 20 +#define DIO65_WPORT PIOB + +#define DIO66_PIN 15 +#define DIO66_WPORT PIOB + +#define DIO67_PIN 16 +#define DIO67_WPORT PIOB + +#define DIO68_PIN 1 +#define DIO68_WPORT PIOA + +#define DIO69_PIN 0 +#define DIO69_WPORT PIOA + +#define DIO70_PIN 17 +#define DIO70_WPORT PIOA + +#define DIO71_PIN 18 +#define DIO71_WPORT PIOA + +#define DIO72_PIN 30 +#define DIO72_WPORT PIOC + +#define DIO73_PIN 21 +#define DIO73_WPORT PIOA + +#define DIO74_PIN 25 +#define DIO74_WPORT PIOA + +#define DIO75_PIN 26 +#define DIO75_WPORT PIOA + +#define DIO76_PIN 27 +#define DIO76_WPORT PIOA + +#define DIO77_PIN 28 +#define DIO77_WPORT PIOA + +#define DIO78_PIN 23 +#define DIO78_WPORT PIOB + +#define DIO79_PIN 17 +#define DIO79_WPORT PIOA + +#define DIO80_PIN 12 +#define DIO80_WPORT PIOB + +#define DIO81_PIN 8 +#define DIO81_WPORT PIOA + +#define DIO82_PIN 11 +#define DIO82_WPORT PIOA + +#define DIO83_PIN 13 +#define DIO83_WPORT PIOA + +#define DIO84_PIN 4 +#define DIO84_WPORT PIOD + +#define DIO85_PIN 11 +#define DIO85_WPORT PIOB + +#define DIO86_PIN 21 +#define DIO86_WPORT PIOB + +#define DIO87_PIN 29 +#define DIO87_WPORT PIOA + +#define DIO88_PIN 15 +#define DIO88_WPORT PIOB + +#define DIO89_PIN 14 +#define DIO89_WPORT PIOB + +#define DIO90_PIN 1 +#define DIO90_WPORT PIOA + +#define DIO91_PIN 15 +#define DIO91_WPORT PIOB + +#if ARDUINO_SAM_ARCHIM + #define DIO92_PIN 11 + #define DIO92_WPORT PIOC + + #define DIO93_PIN 2 + #define DIO93_WPORT PIOB + + #define DIO94_PIN 1 + #define DIO94_WPORT PIOB + + #define DIO95_PIN 0 + #define DIO95_WPORT PIOB + + #define DIO96_PIN 10 + #define DIO96_WPORT PIOC + + #define DIO97_PIN 24 + #define DIO97_WPORT PIOB + + #define DIO98_PIN 7 + #define DIO98_WPORT PIOB + + #define DIO99_PIN 6 + #define DIO99_WPORT PIOB + + #define DIO100_PIN 8 + #define DIO100_WPORT PIOB + + #define DIO101_PIN 5 + #define DIO101_WPORT PIOB + + #define DIO102_PIN 4 + #define DIO102_WPORT PIOB + + #define DIO103_PIN 3 + #define DIO103_WPORT PIOB + + #define DIO104_PIN 20 + #define DIO104_WPORT PIOC + + #define DIO105_PIN 22 + #define DIO105_WPORT PIOB + + #define DIO106_PIN 27 + #define DIO106_WPORT PIOC + + #define DIO107_PIN 10 + #define DIO107_WPORT PIOB +#else + #define DIO92_PIN 5 + #define DIO92_WPORT PIOA + + #define DIO93_PIN 12 + #define DIO93_WPORT PIOB + + #define DIO94_PIN 22 + #define DIO94_WPORT PIOB + + #define DIO95_PIN 23 + #define DIO95_WPORT PIOB + + #define DIO96_PIN 24 + #define DIO96_WPORT PIOB + + #define DIO97_PIN 20 + #define DIO97_WPORT PIOC + + #define DIO98_PIN 27 + #define DIO98_WPORT PIOC + + #define DIO99_PIN 10 + #define DIO99_WPORT PIOC + + #define DIO100_PIN 11 + #define DIO100_WPORT PIOC +#endif + +#endif // _FASTIO_DUE_H diff --git a/Marlin/src/HAL/HAL_DUE/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_DUE/persistent_store_eeprom.cpp new file mode 100644 index 0000000000..fa611111d0 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/persistent_store_eeprom.cpp @@ -0,0 +1,82 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../../inc/MarlinConfig.h" +#include "../shared/persistent_store_api.h" + +#if DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) + #define E2END 0xFFF // Default to Flash emulated EEPROM size (EepromEmulation_Due.cpp) +#endif + +extern void eeprom_flush(void); + +bool PersistentStore::access_start() { return true; } + +bool PersistentStore::access_finish() { + #if DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) + eeprom_flush(); + #endif + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +size_t PersistentStore::capacity() { return E2END + 1; } + +#endif // EEPROM_SETTINGS +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/HAL_DUE/pinsDebug.h b/Marlin/src/HAL/HAL_DUE/pinsDebug.h new file mode 100644 index 0000000000..691830b873 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/pinsDebug.h @@ -0,0 +1,190 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Support routines for Due + */ + +/** + * Translation of routines & variables used by pinsDebug.h + */ + +#include + +/** + * Due/Marlin quirks + * + * a) determining the state of a pin + * The Due/Arduino status definitions for the g_pinStatus[pin] array are: + * #define PIN_STATUS_DIGITAL_INPUT_PULLUP (0x01) + * #define PIN_STATUS_DIGITAL_INPUT (0x02) + * #define PIN_STATUS_DIGITAL_OUTPUT (0x03) + * #define PIN_STATUS_ANALOG (0x04) + * #define PIN_STATUS_PWM (0x05) + * #define PIN_STATUS_TIMER (0x06) + * + * These are only valid if the following Due/Arduino provided functions are used: + * analogRead + * analogWrite + * digitalWrite + * pinMode + * + * The FASTIO routines do not touch the g_pinStatus[pin] array. + * + * The net result is that both the g_pinStatus[pin] array and the PIO_OSR register + * needs to be looked at when determining if a pin is an input or an output. + * + * b) Due has only pins 6, 7, 8 & 9 enabled for PWMs. FYI - they run at 1KHz + * + * c) NUM_DIGITAL_PINS does not include the analog pins + * + * d) Pins 0-78 are defined for Due but 78 has a comment of "unconnected!". 78 is + * included just in case. + */ + +#define NUMBER_PINS_TOTAL PINS_COUNT + +#define digitalRead_mod(p) digitalRead(p) // AVR digitalRead disabled PWM before it read the pin +#define PRINT_PORT(p) +#define NAME_FORMAT(p) PSTR("%-##p##s") +#define PRINT_ARRAY_NAME(x) do {sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer);} while (0) +#define PRINT_PIN(p) do {sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer);} while (0) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0) +#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) +#define IS_ANALOG(P) (((P) >= analogInputToDigitalPin(0)) && ((P) <= analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1))) +#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \ + ((g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_PWM)) +#define MULTI_NAME_PAD 14 // space needed to be pretty if not first name assigned to a pin + +bool GET_PINMODE(int8_t pin) { // 1: output, 0: input + volatile Pio* port = g_APinDescription[pin].pPort; + uint32_t mask = g_APinDescription[pin].ulPin; + uint8_t pin_status = g_pinStatus[pin] & 0xF; + return ( (pin_status == 0 && (port->PIO_OSR & mask)) + || pin_status == PIN_STATUS_DIGITAL_OUTPUT + || pwm_status(pin)); +} + +bool GET_ARRAY_IS_DIGITAL(int8_t pin) { + uint8_t pin_status = g_pinStatus[pin] & 0xF; + return !(pin_status == PIN_STATUS_ANALOG); +} + +void pwm_details(int32_t pin) { + if (pwm_status(pin)) { + uint32_t chan = g_APinDescription[pin].ulPWMChannel; + SERIAL_PROTOCOLPAIR("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY); + } +} + +/** + * DUE Board pin | PORT | Label + * ----------------+--------+------- + * 0 | PA8 | "RX0" + * 1 | PA9 | "TX0" + * 2 TIOA0 | PB25 | + * 3 TIOA7 | PC28 | + * 4 NPCS1 | PA29 | + * TIOB6 | PC26 | + * 5 TIOA6 | PC25 | + * 6 PWML7 | PC24 | + * 7 PWML6 | PC23 | + * 8 PWML5 | PC22 | + * 9 PWML4 | PC21 | + * 10 NPCS0 | PA28 | + * TIOB7 | PC29 | + * 11 TIOA8 | PD7 | + * 12 TIOB8 | PD8 | + * 13 TIOB0 | PB27 | LED AMBER "L" + * 14 TXD3 | PD4 | "TX3" + * 15 RXD3 | PD5 | "RX3" + * 16 TXD1 | PA13 | "TX2" + * 17 RXD1 | PA12 | "RX2" + * 18 TXD0 | PA11 | "TX1" + * 19 RXD0 | PA10 | "RX1" + * 20 | PB12 | "SDA" + * 21 | PB13 | "SCL" + * 22 | PB26 | + * 23 | PA14 | + * 24 | PA15 | + * 25 | PD0 | + * 26 | PD1 | + * 27 | PD2 | + * 28 | PD3 | + * 29 | PD6 | + * 30 | PD9 | + * 31 | PA7 | + * 32 | PD10 | + * 33 | PC1 | + * 34 | PC2 | + * 35 | PC3 | + * 36 | PC4 | + * 37 | PC5 | + * 38 | PC6 | + * 39 | PC7 | + * 40 | PC8 | + * 41 | PC9 | + * 42 | PA19 | + * 43 | PA20 | + * 44 | PC19 | + * 45 | PC18 | + * 46 | PC17 | + * 47 | PC16 | + * 48 | PC15 | + * 49 | PC14 | + * 50 | PC13 | + * 51 | PC12 | + * 52 NPCS2 | PB21 | + * 53 | PB14 | + * 54 | PA16 | "A0" + * 55 | PA24 | "A1" + * 56 | PA23 | "A2" + * 57 | PA22 | "A3" + * 58 TIOB2 | PA6 | "A4" + * 69 | PA4 | "A5" + * 60 TIOB1 | PA3 | "A6" + * 61 TIOA1 | PA2 | "A7" + * 62 | PB17 | "A8" + * 63 | PB18 | "A9" + * 64 | PB19 | "A10" + * 65 | PB20 | "A11" + * 66 | PB15 | "DAC0" + * 67 | PB16 | "DAC1" + * 68 | PA1 | "CANRX" + * 69 | PA0 | "CANTX" + * 70 | PA17 | "SDA1" + * 71 | PA18 | "SCL1" + * 72 | PC30 | LED AMBER "RX" + * 73 | PA21 | LED AMBER "TX" + * 74 MISO | PA25 | + * 75 MOSI | PA26 | + * 76 SCLK | PA27 | + * 77 NPCS0 | PA28 | + * 78 NPCS3 | PB23 | unconnected! + * + * USB pin | PORT + * ----------------+-------- + * ID | PB11 + * VBOF | PB10 + * + */ \ No newline at end of file diff --git a/Marlin/src/HAL/HAL_DUE/spi_pins.h b/Marlin/src/HAL/HAL_DUE/spi_pins.h new file mode 100644 index 0000000000..d0eb711df2 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/spi_pins.h @@ -0,0 +1,59 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + * + * Available chip select pins for HW SPI are 4 10 52 77 + */ +#if (SDSS == 4) || (SDSS == 10) || (SDSS == 52) || (SDSS == 77) + #if (SDSS == 4) + #define SPI_PIN 87 + #define SPI_CHAN 1 + #elif (SDSS == 10) + #define SPI_PIN 77 + #define SPI_CHAN 0 + #elif (SDSS == 52) + #define SPI_PIN 86 + #define SPI_CHAN 2 + #else + #define SPI_PIN 77 + #define SPI_CHAN 0 + #endif + #define SCK_PIN 76 + #define MISO_PIN 74 + #define MOSI_PIN 75 +#else + // defaults + #define DUE_SOFTWARE_SPI + #define SCK_PIN 52 + #define MISO_PIN 50 + #define MOSI_PIN 51 +#endif + +/* A.28, A.29, B.21, C.26, C.29 */ +#define SS_PIN SDSS + +#endif /* SPI_PINS_H_ */ diff --git a/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_shared_hw_spi.cpp new file mode 100644 index 0000000000..0dab3bb412 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_shared_hw_spi.cpp @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017, 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +/* + + based on u8g_com_msp430_hw_spi.c + + Universal 8bit Graphics Library + + Copyright (c) 2012, olikraus@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifdef __SAM3X8E__ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include + +#include "../../Marlin.h" + +#define SPI_FULL_SPEED 0 +#define SPI_HALF_SPEED 1 +#define SPI_QUARTER_SPEED 2 +#define SPI_EIGHTH_SPEED 3 +#define SPI_SIXTEENTH_SPEED 4 +#define SPI_SPEED_5 5 +#define SPI_SPEED_6 6 + +void spiBegin(); +void spiInit(uint8_t spiRate); +void spiSend(uint8_t b); +void spiSend(const uint8_t* buf, size_t n); + +#include +#include "fastio_Due.h" + +void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) { + PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1, + g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT +} + +void u8g_SetPILevel_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index, uint8_t level) { + volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort; + uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin; + if (level) port->PIO_SODR = mask; + else port->PIO_CODR = mask; +} + +uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + switch(msg) + { + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_INIT: + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, 1); + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, 1); + + u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_CS); + u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_A0); + + u8g_Delay(5); + + spiBegin(); + + #ifndef SPI_SPEED + #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card + #endif + spiInit(2); + + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, (arg_val ? 0 : 1)); + break; + + case U8G_COM_MSG_RESET: + break; + + case U8G_COM_MSG_WRITE_BYTE: + + spiSend((uint8_t)arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // DOGLCD + +#endif //__SAM3X8E__ diff --git a/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp b/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp new file mode 100644 index 0000000000..243033e68b --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp @@ -0,0 +1,185 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Based on u8g_com_st7920_hw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2011, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include +#include +#include "../shared/Delay.h" + +void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index) { + PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1, + g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT +} + +void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level) { + volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort; + uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin; + if (level) port->PIO_SODR = mask; + else port->PIO_CODR = mask; +} + +Pio *SCK_pPio, *MOSI_pPio; +uint32_t SCK_dwMask, MOSI_dwMask; + +static void spiSend_sw_DUE(uint8_t val) { // 800KHz + for (uint8_t i = 0; i < 8; i++) { + if (val & 0x80) + MOSI_pPio->PIO_SODR = MOSI_dwMask; + else + MOSI_pPio->PIO_CODR = MOSI_dwMask; + DELAY_NS(48); + SCK_pPio->PIO_SODR = SCK_dwMask; + DELAY_NS(905); // 762 dead, 810 garbage, 858/0 900kHz, 905/1 825k, 953/1 800k, 1000/2 725KHz + val <<= 1; + SCK_pPio->PIO_CODR = SCK_dwMask; + } +} + +static uint8_t rs_last_state = 255; + +static void u8g_com_DUE_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) { + uint8_t i; + + if ( rs != rs_last_state) { // time to send a command/data byte + rs_last_state = rs; + + if ( rs == 0 ) + /* command */ + spiSend_sw_DUE(0x0F8); + else + /* data */ + spiSend_sw_DUE(0x0FA); + + DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe + } + + spiSend_sw_DUE(val & 0x0F0); + spiSend_sw_DUE(val << 4); +} + + +uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + SCK_pPio = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].pPort; + SCK_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].ulPin; + MOSI_pPio = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].pPort; + MOSI_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].ulPin; + + u8g_SetPILevel_DUE(u8g, U8G_PI_CS, 0); + u8g_SetPIOutput_DUE(u8g, U8G_PI_CS); + u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); + u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK); + u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0); + u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI); + + SCK_pPio->PIO_CODR = SCK_dwMask; //SCK low - needed at power up but not after reset + MOSI_pPio->PIO_CODR = MOSI_dwMask; //MOSI low - needed at power up but not after reset + + u8g_Delay(5); + + u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */ + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel_DUE(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + break; + + case U8G_COM_MSG_CHIP_SELECT: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS]) + u8g_SetPILevel_DUE(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select + break; + + case U8G_COM_MSG_WRITE_BYTE: + + u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // DOGLCD + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/arduino_due_x.h b/Marlin/src/HAL/HAL_DUE/usb/arduino_due_x.h similarity index 92% rename from Marlin/src/HAL/DUE/usb/arduino_due_x.h rename to Marlin/src/HAL/HAL_DUE/usb/arduino_due_x.h index d3b333fb34..c1434228cd 100644 --- a/Marlin/src/HAL/DUE/usb/arduino_due_x.h +++ b/Marlin/src/HAL/HAL_DUE/usb/arduino_due_x.h @@ -40,12 +40,15 @@ * \asf_license_stop * */ -#pragma once - -/** - * Support and FAQ: visit Atmel Support +/* + * Support and FAQ: visit Atmel Support */ +#ifndef ARDUINO_DUE_X_H_INCLUDED +#define ARDUINO_DUE_X_H_INCLUDED + +/* ------------------------------------------------------------------------ */ + /** * \page arduino_due_x_opfreq "Arduino Due/X - Operating frequencies" * This page lists several definition related to the board operating frequency @@ -93,5 +96,8 @@ #define USB_VBOF_GPIO (PIO_PB10_IDX) #define USB_VBOF_FLAGS (PIO_PERIPH_A | PIO_DEFAULT) /*! Active level of the USB_VBOF output pin. */ -#define USB_VBOF_ACTIVE_STATE LOW +#define USB_VBOF_ACTIVE_LEVEL LOW /* ------------------------------------------------------------------------ */ + + +#endif /* ARDUINO_DUE_X_H_INCLUDED */ diff --git a/Marlin/src/HAL/DUE/usb/compiler.h b/Marlin/src/HAL/HAL_DUE/usb/compiler.h similarity index 86% rename from Marlin/src/HAL/DUE/usb/compiler.h rename to Marlin/src/HAL/HAL_DUE/usb/compiler.h index f89e554c45..43895381a2 100644 --- a/Marlin/src/HAL/DUE/usb/compiler.h +++ b/Marlin/src/HAL/HAL_DUE/usb/compiler.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef UTILS_COMPILER_H @@ -105,14 +105,14 @@ * \brief Marking \a v as a unused parameter or value. */ #ifndef UNUSED - #define UNUSED(x) ((void)(x)) +#define UNUSED(x) (void) (x) #endif /** * \def unused * \brief Marking \a v as a unused parameter or value. */ -#define unused(v) do { (void)(v); }while(0) +#define unused(v) do { (void)(v); } while(0) /** * \def barrier @@ -169,15 +169,15 @@ * heuristics and inline the function no matter how big it thinks it * becomes. */ -#ifdef __CC_ARM +#if defined(__CC_ARM) # define __always_inline __forceinline #elif (defined __GNUC__) #ifdef __always_inline -# undef __always_inline +# undef __always_inline #endif -# define __always_inline inline __attribute__((__always_inline__)) +# define __always_inline inline __attribute__((__always_inline__)) #elif (defined __ICCARM__) -# define __always_inline _Pragma("inline=forced") +# define __always_inline _Pragma("inline=forced") #endif /** @@ -187,12 +187,12 @@ * This annotation instructs the compiler to ignore its inlining * heuristics and not inline the function. */ -#ifdef __CC_ARM -# define __no_inline __attribute__((noinline)) +#if defined(__CC_ARM) +# define __no_inline __attribute__((noinline)) #elif (defined __GNUC__) -# define __no_inline __attribute__((__noinline__)) +# define __no_inline __attribute__((__noinline__)) #elif (defined __ICCARM__) -# define __no_inline _Pragma("inline=never") +# define __no_inline _Pragma("inline=never") #endif /*! \brief This macro is used to test fatal errors. @@ -204,16 +204,16 @@ * * \param expr Expression to evaluate and supposed to be nonzero. */ -#ifdef _ASSERT_ENABLE_ +#if defined(_ASSERT_ENABLE_) # if defined(TEST_SUITE_DEFINE_ASSERT_MACRO) // Assert() is defined in unit_test/suite.h # include "unit_test/suite.h" # else #undef TEST_SUITE_DEFINE_ASSERT_MACRO # define Assert(expr) \ - {\ - if (!(expr)) while (true);\ - } + {\ + if (!(expr)) while (true);\ + } # endif #else # define Assert(expr) ((void) 0) @@ -230,7 +230,7 @@ /* Define NO_INIT attribute */ #if 0 //ndef NO_INIT -#ifdef __CC_ARM +#if defined ( __CC_ARM ) # define NO_INIT __attribute__((zero_init)) #elif defined ( __ICCARM__ ) # define NO_INIT __no_init @@ -262,7 +262,7 @@ //! @{ typedef unsigned char Bool; //!< Boolean. #ifndef __cplusplus -#ifndef __bool_true_false_are_defined +#if !defined(__bool_true_false_are_defined) typedef unsigned char bool; //!< Boolean. #endif #endif @@ -443,9 +443,9 @@ typedef struct #define DISABLE 0 #define ENABLE 1 #ifndef __cplusplus -#ifndef __bool_true_false_are_defined -#define false (1==0) -#define true (1==1) +#if !defined(__bool_true_false_are_defined) +#define false 0 +#define true 1 #endif #endif #ifndef PASS @@ -609,37 +609,37 @@ typedef struct # define clz(u) ((u) ? __CLZ(u) : 32) #else # define clz(u) (((u) == 0) ? 32 : \ - ((u) & (1UL << 31)) ? 0 : \ - ((u) & (1UL << 30)) ? 1 : \ - ((u) & (1UL << 29)) ? 2 : \ - ((u) & (1UL << 28)) ? 3 : \ - ((u) & (1UL << 27)) ? 4 : \ - ((u) & (1UL << 26)) ? 5 : \ - ((u) & (1UL << 25)) ? 6 : \ - ((u) & (1UL << 24)) ? 7 : \ - ((u) & (1UL << 23)) ? 8 : \ - ((u) & (1UL << 22)) ? 9 : \ - ((u) & (1UL << 21)) ? 10 : \ - ((u) & (1UL << 20)) ? 11 : \ - ((u) & (1UL << 19)) ? 12 : \ - ((u) & (1UL << 18)) ? 13 : \ - ((u) & (1UL << 17)) ? 14 : \ - ((u) & (1UL << 16)) ? 15 : \ - ((u) & (1UL << 15)) ? 16 : \ - ((u) & (1UL << 14)) ? 17 : \ - ((u) & (1UL << 13)) ? 18 : \ - ((u) & (1UL << 12)) ? 19 : \ - ((u) & (1UL << 11)) ? 20 : \ - ((u) & (1UL << 10)) ? 21 : \ - ((u) & (1UL << 9)) ? 22 : \ - ((u) & (1UL << 8)) ? 23 : \ - ((u) & (1UL << 7)) ? 24 : \ - ((u) & (1UL << 6)) ? 25 : \ - ((u) & (1UL << 5)) ? 26 : \ - ((u) & (1UL << 4)) ? 27 : \ - ((u) & (1UL << 3)) ? 28 : \ - ((u) & (1UL << 2)) ? 29 : \ - ((u) & (1UL << 1)) ? 30 : \ + ((u) & (1ul << 31)) ? 0 : \ + ((u) & (1ul << 30)) ? 1 : \ + ((u) & (1ul << 29)) ? 2 : \ + ((u) & (1ul << 28)) ? 3 : \ + ((u) & (1ul << 27)) ? 4 : \ + ((u) & (1ul << 26)) ? 5 : \ + ((u) & (1ul << 25)) ? 6 : \ + ((u) & (1ul << 24)) ? 7 : \ + ((u) & (1ul << 23)) ? 8 : \ + ((u) & (1ul << 22)) ? 9 : \ + ((u) & (1ul << 21)) ? 10 : \ + ((u) & (1ul << 20)) ? 11 : \ + ((u) & (1ul << 19)) ? 12 : \ + ((u) & (1ul << 18)) ? 13 : \ + ((u) & (1ul << 17)) ? 14 : \ + ((u) & (1ul << 16)) ? 15 : \ + ((u) & (1ul << 15)) ? 16 : \ + ((u) & (1ul << 14)) ? 17 : \ + ((u) & (1ul << 13)) ? 18 : \ + ((u) & (1ul << 12)) ? 19 : \ + ((u) & (1ul << 11)) ? 20 : \ + ((u) & (1ul << 10)) ? 21 : \ + ((u) & (1ul << 9)) ? 22 : \ + ((u) & (1ul << 8)) ? 23 : \ + ((u) & (1ul << 7)) ? 24 : \ + ((u) & (1ul << 6)) ? 25 : \ + ((u) & (1ul << 5)) ? 26 : \ + ((u) & (1ul << 4)) ? 27 : \ + ((u) & (1ul << 3)) ? 28 : \ + ((u) & (1ul << 2)) ? 29 : \ + ((u) & (1ul << 1)) ? 30 : \ 31) #endif #endif @@ -654,38 +654,38 @@ typedef struct #if (defined __GNUC__) || (defined __CC_ARM) # define ctz(u) ((u) ? __builtin_ctz(u) : 32) #else -# define ctz(u) ((u) & (1UL << 0) ? 0 : \ - (u) & (1UL << 1) ? 1 : \ - (u) & (1UL << 2) ? 2 : \ - (u) & (1UL << 3) ? 3 : \ - (u) & (1UL << 4) ? 4 : \ - (u) & (1UL << 5) ? 5 : \ - (u) & (1UL << 6) ? 6 : \ - (u) & (1UL << 7) ? 7 : \ - (u) & (1UL << 8) ? 8 : \ - (u) & (1UL << 9) ? 9 : \ - (u) & (1UL << 10) ? 10 : \ - (u) & (1UL << 11) ? 11 : \ - (u) & (1UL << 12) ? 12 : \ - (u) & (1UL << 13) ? 13 : \ - (u) & (1UL << 14) ? 14 : \ - (u) & (1UL << 15) ? 15 : \ - (u) & (1UL << 16) ? 16 : \ - (u) & (1UL << 17) ? 17 : \ - (u) & (1UL << 18) ? 18 : \ - (u) & (1UL << 19) ? 19 : \ - (u) & (1UL << 20) ? 20 : \ - (u) & (1UL << 21) ? 21 : \ - (u) & (1UL << 22) ? 22 : \ - (u) & (1UL << 23) ? 23 : \ - (u) & (1UL << 24) ? 24 : \ - (u) & (1UL << 25) ? 25 : \ - (u) & (1UL << 26) ? 26 : \ - (u) & (1UL << 27) ? 27 : \ - (u) & (1UL << 28) ? 28 : \ - (u) & (1UL << 29) ? 29 : \ - (u) & (1UL << 30) ? 30 : \ - (u) & (1UL << 31) ? 31 : \ +# define ctz(u) ((u) & (1ul << 0) ? 0 : \ + (u) & (1ul << 1) ? 1 : \ + (u) & (1ul << 2) ? 2 : \ + (u) & (1ul << 3) ? 3 : \ + (u) & (1ul << 4) ? 4 : \ + (u) & (1ul << 5) ? 5 : \ + (u) & (1ul << 6) ? 6 : \ + (u) & (1ul << 7) ? 7 : \ + (u) & (1ul << 8) ? 8 : \ + (u) & (1ul << 9) ? 9 : \ + (u) & (1ul << 10) ? 10 : \ + (u) & (1ul << 11) ? 11 : \ + (u) & (1ul << 12) ? 12 : \ + (u) & (1ul << 13) ? 13 : \ + (u) & (1ul << 14) ? 14 : \ + (u) & (1ul << 15) ? 15 : \ + (u) & (1ul << 16) ? 16 : \ + (u) & (1ul << 17) ? 17 : \ + (u) & (1ul << 18) ? 18 : \ + (u) & (1ul << 19) ? 19 : \ + (u) & (1ul << 20) ? 20 : \ + (u) & (1ul << 21) ? 21 : \ + (u) & (1ul << 22) ? 22 : \ + (u) & (1ul << 23) ? 23 : \ + (u) & (1ul << 24) ? 24 : \ + (u) & (1ul << 25) ? 25 : \ + (u) & (1ul << 26) ? 26 : \ + (u) & (1ul << 27) ? 27 : \ + (u) & (1ul << 28) ? 28 : \ + (u) & (1ul << 29) ? 29 : \ + (u) & (1ul << 30) ? 30 : \ + (u) & (1ul << 31) ? 31 : \ 32) #endif #endif @@ -998,14 +998,14 @@ typedef U8 Byte; //!< 8-bit unsigned integer. #endif // #ifndef __ASSEMBLY__ -#ifdef __ICCARM__ +#if defined(__ICCARM__) #define SHORTENUM __packed #elif defined(__GNUC__) #define SHORTENUM __attribute__((packed)) #endif /* No operation */ -#ifdef __ICCARM__ +#if defined(__ICCARM__) #define nop() __no_operation() #elif defined(__GNUC__) #define nop() (__NOP()) @@ -1106,16 +1106,17 @@ static inline uint16_t convert_byte_array_to_16_bit(uint8_t *data) /* Converts a 8 Byte array into a 32-Bit value */ static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data) { - union - { - uint32_t u32; - uint8_t u8[8]; - }long_addr; - uint8_t index; - for (index = 0; index < 4; index++) { - long_addr.u8[index] = *data++; - } - return long_addr.u32; + union + { + uint32_t u32; + uint8_t u8[8]; + }long_addr; + uint8_t index; + for (index = 0; index < 4; index++) + { + long_addr.u8[index] = *data++; + } + return long_addr.u32; } /** diff --git a/Marlin/src/HAL/DUE/usb/conf_access.h b/Marlin/src/HAL/HAL_DUE/usb/conf_access.h similarity index 97% rename from Marlin/src/HAL/DUE/usb/conf_access.h rename to Marlin/src/HAL/HAL_DUE/usb/conf_access.h index f401685223..fdac1ab7e8 100644 --- a/Marlin/src/HAL/DUE/usb/conf_access.h +++ b/Marlin/src/HAL/HAL_DUE/usb/conf_access.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _CONF_ACCESS_H_ diff --git a/Marlin/src/HAL/DUE/usb/conf_clock.h b/Marlin/src/HAL/HAL_DUE/usb/conf_clock.h similarity index 97% rename from Marlin/src/HAL/DUE/usb/conf_clock.h rename to Marlin/src/HAL/HAL_DUE/usb/conf_clock.h index 97e70e99a5..d0f68500ad 100644 --- a/Marlin/src/HAL/DUE/usb/conf_clock.h +++ b/Marlin/src/HAL/HAL_DUE/usb/conf_clock.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CONF_CLOCK_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/conf_usb.h b/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h similarity index 92% rename from Marlin/src/HAL/DUE/usb/conf_usb.h rename to Marlin/src/HAL/HAL_DUE/usb/conf_usb.h index 4de9e347e2..604fd2019b 100644 --- a/Marlin/src/HAL/DUE/usb/conf_usb.h +++ b/Marlin/src/HAL/HAL_DUE/usb/conf_usb.h @@ -41,22 +41,26 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _CONF_USB_H_ #define _CONF_USB_H_ #undef UNUSED /* To avoid a macro clash as macros.h already defines it */ -#include "../../../inc/MarlinConfigPre.h" +#include "../../../core/macros.h" /* For ENABLED()/DISABLED() */ +#include "../../../../Configuration.h" /* For CUSTOM_MACHINE_NAME definition - We just need the name, no C++ allowed! */ #include "compiler.h" + /** * USB Device Configuration * @{ */ //! Device definition (mandatory) +#define USB_DEVICE_VENDOR_ID 0x03EB /* ATMEL VID */ +#define USB_DEVICE_PRODUCT_ID 0x2424 /* MSC / CDC */ #define USB_DEVICE_MAJOR_VERSION 1 #define USB_DEVICE_MINOR_VERSION 0 #define USB_DEVICE_POWER 100 // Consumption on Vbus line (mA) @@ -66,6 +70,15 @@ // (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_SELF_POWERED) // (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_BUS_POWERED) +//! USB Device string definitions (Optional) +#define USB_DEVICE_MANUFACTURE_NAME "marlinfw.org" +#ifdef CUSTOM_MACHINE_NAME + #define USB_DEVICE_PRODUCT_NAME CUSTOM_MACHINE_NAME +#else + #define USB_DEVICE_PRODUCT_NAME "3D Printer" +#endif +#define USB_DEVICE_SERIAL_NAME "123985739853" + /** * Device speeds support * Low speed not supported by CDC and MSC @@ -76,7 +89,7 @@ //#define USB_DEVICE_LOW_SPEED //! To define a Full speed device -//#define USB_DEVICE_FULL_SPEED +//#define USB_DEVICE_FULL_SPEED //! To authorize the High speed #ifndef USB_DEVICE_FULL_SPEED diff --git a/Marlin/src/HAL/DUE/usb/ctrl_access.c b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.c similarity index 99% rename from Marlin/src/HAL/DUE/usb/ctrl_access.c rename to Marlin/src/HAL/HAL_DUE/usb/ctrl_access.c index 99f97f62cb..0ec14e0b8f 100644 --- a/Marlin/src/HAL/DUE/usb/ctrl_access.c +++ b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.c @@ -53,7 +53,7 @@ * ******************************************************************************/ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/ctrl_access.h b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h similarity index 99% rename from Marlin/src/HAL/DUE/usb/ctrl_access.h rename to Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h index b33839076e..af6c8ceb96 100644 --- a/Marlin/src/HAL/DUE/usb/ctrl_access.h +++ b/Marlin/src/HAL/HAL_DUE/usb/ctrl_access.h @@ -53,7 +53,7 @@ * ******************************************************************************/ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ diff --git a/Marlin/src/HAL/DUE/usb/genclk.h b/Marlin/src/HAL/HAL_DUE/usb/genclk.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/genclk.h rename to Marlin/src/HAL/HAL_DUE/usb/genclk.h index cde03bc0d1..895aba0352 100644 --- a/Marlin/src/HAL/DUE/usb/genclk.h +++ b/Marlin/src/HAL/HAL_DUE/usb/genclk.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CHIP_GENCLK_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/mrepeat.h b/Marlin/src/HAL/HAL_DUE/usb/mrepeat.h similarity index 99% rename from Marlin/src/HAL/DUE/usb/mrepeat.h rename to Marlin/src/HAL/HAL_DUE/usb/mrepeat.h index 8363d9cde3..5a2017be99 100644 --- a/Marlin/src/HAL/DUE/usb/mrepeat.h +++ b/Marlin/src/HAL/HAL_DUE/usb/mrepeat.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _MREPEAT_H_ diff --git a/Marlin/src/HAL/DUE/usb/osc.h b/Marlin/src/HAL/HAL_DUE/usb/osc.h similarity index 96% rename from Marlin/src/HAL/DUE/usb/osc.h rename to Marlin/src/HAL/HAL_DUE/usb/osc.h index 953bcbbed1..fe09d6fd3e 100644 --- a/Marlin/src/HAL/DUE/usb/osc.h +++ b/Marlin/src/HAL/HAL_DUE/usb/osc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CHIP_OSC_H_INCLUDED @@ -61,27 +61,27 @@ extern "C" { * Below BOARD_XXX macros are related to the specific board, and * should be defined by the board code, otherwise default value are used. */ -#ifndef BOARD_FREQ_SLCK_XTAL +#if !defined(BOARD_FREQ_SLCK_XTAL) # warning The board slow clock xtal frequency has not been defined. # define BOARD_FREQ_SLCK_XTAL (32768UL) #endif -#ifndef BOARD_FREQ_SLCK_BYPASS +#if !defined(BOARD_FREQ_SLCK_BYPASS) # warning The board slow clock bypass frequency has not been defined. # define BOARD_FREQ_SLCK_BYPASS (32768UL) #endif -#ifndef BOARD_FREQ_MAINCK_XTAL +#if !defined(BOARD_FREQ_MAINCK_XTAL) # warning The board main clock xtal frequency has not been defined. # define BOARD_FREQ_MAINCK_XTAL (12000000UL) #endif -#ifndef BOARD_FREQ_MAINCK_BYPASS +#if !defined(BOARD_FREQ_MAINCK_BYPASS) # warning The board main clock bypass frequency has not been defined. # define BOARD_FREQ_MAINCK_BYPASS (12000000UL) #endif -#ifndef BOARD_OSC_STARTUP_US +#if !defined(BOARD_OSC_STARTUP_US) # warning The board main clock xtal startup time has not been defined. # define BOARD_OSC_STARTUP_US (15625UL) #endif diff --git a/Marlin/src/HAL/DUE/usb/pll.h b/Marlin/src/HAL/HAL_DUE/usb/pll.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/pll.h rename to Marlin/src/HAL/HAL_DUE/usb/pll.h index 8eaf27672b..d3d2174870 100644 --- a/Marlin/src/HAL/DUE/usb/pll.h +++ b/Marlin/src/HAL/HAL_DUE/usb/pll.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CHIP_PLL_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/preprocessor.h b/Marlin/src/HAL/HAL_DUE/usb/preprocessor.h similarity index 95% rename from Marlin/src/HAL/DUE/usb/preprocessor.h rename to Marlin/src/HAL/HAL_DUE/usb/preprocessor.h index c12d01cb64..184c03ae71 100644 --- a/Marlin/src/HAL/DUE/usb/preprocessor.h +++ b/Marlin/src/HAL/HAL_DUE/usb/preprocessor.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _PREPROCESSOR_H_ diff --git a/Marlin/src/HAL/DUE/usb/sbc_protocol.h b/Marlin/src/HAL/HAL_DUE/usb/sbc_protocol.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/sbc_protocol.h rename to Marlin/src/HAL/HAL_DUE/usb/sbc_protocol.h index ab845739fd..082b735fa6 100644 --- a/Marlin/src/HAL/DUE/usb/sbc_protocol.h +++ b/Marlin/src/HAL/HAL_DUE/usb/sbc_protocol.h @@ -52,7 +52,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _SBC_PROTOCOL_H_ #define _SBC_PROTOCOL_H_ diff --git a/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp new file mode 100644 index 0000000000..4de46104e2 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.cpp @@ -0,0 +1,131 @@ +/** + * Interface from Atmel USB MSD to Marlin SD card + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "../../../sd/cardreader.h" +extern "C" { +#include "sd_mmc_spi_mem.h" +} + +#define SD_MMC_BLOCK_SIZE 512 + +void sd_mmc_spi_mem_init(void) { +} + +Ctrl_status sd_mmc_spi_test_unit_ready(void) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return CTRL_NO_PRESENT; + return CTRL_GOOD; +} + +Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return CTRL_NO_PRESENT; + *nb_sector = card.getSd2Card().cardSize(); + return CTRL_GOOD; +} + +bool sd_mmc_spi_unload(bool unload) { + return true; +} + +bool sd_mmc_spi_wr_protect(void) { + return false; +} + +bool sd_mmc_spi_removal(void) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return true; + return false; +} + +#if ACCESS_USB == true +/** + * \name MEM <-> USB Interface + * @{ + */ + +#include "udi_msc.h" + +COMPILER_WORD_ALIGNED +uint8_t sector_buf[SD_MMC_BLOCK_SIZE]; + +// #define DEBUG_MMC + +Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return CTRL_NO_PRESENT; + + #ifdef DEBUG_MMC + char buffer[80]; + sprintf(buffer, "SDRD: %d @ 0x%08x\n", nb_sector, addr); + SERIAL_PROTOCOL_P(0, buffer); + #endif + + // Start reading + if (!card.getSd2Card().readStart(addr)) + return CTRL_FAIL; + + // For each specified sector + while (nb_sector--) { + + // Read a sector + card.getSd2Card().readData(sector_buf); + + // RAM -> USB + if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { + card.getSd2Card().readStop(); + return CTRL_FAIL; + } + } + + // Stop reading + card.getSd2Card().readStop(); + + // Done + return CTRL_GOOD; +} + +Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) { + if (!IS_SD_INSERTED || IS_SD_PRINTING || IS_SD_FILE_OPEN || !card.cardOK) + return CTRL_NO_PRESENT; + + #ifdef DEBUG_MMC + char buffer[80]; + sprintf(buffer, "SDWR: %d @ 0x%08x\n", nb_sector, addr); + SERIAL_PROTOCOL_P(0, buffer); + #endif + + if (!card.getSd2Card().writeStart(addr, nb_sector)) + return CTRL_FAIL; + + // For each specified sector + while (nb_sector--) { + + // USB -> RAM + if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { + card.getSd2Card().writeStop(); + return CTRL_FAIL; + } + + // Write a sector + card.getSd2Card().writeData(sector_buf); + } + + // Stop writing + card.getSd2Card().writeStop(); + + // Done + return CTRL_GOOD; +} + +#endif // ACCESS_USB == true + +#endif // SDSUPPORT +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h rename to Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.h index d77e4f9523..6df82c146b 100644 --- a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h +++ b/Marlin/src/HAL/HAL_DUE/usb/sd_mmc_spi_mem.h @@ -42,7 +42,7 @@ * ******************************************************************************/ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ diff --git a/Marlin/src/HAL/DUE/usb/spc_protocol.h b/Marlin/src/HAL/HAL_DUE/usb/spc_protocol.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/spc_protocol.h rename to Marlin/src/HAL/HAL_DUE/usb/spc_protocol.h index d67cc5c788..e5e7603c9a 100644 --- a/Marlin/src/HAL/DUE/usb/spc_protocol.h +++ b/Marlin/src/HAL/HAL_DUE/usb/spc_protocol.h @@ -43,12 +43,12 @@ * \asf_license_stop * */ - /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ -#ifndef _SPC_PROTOCOL_H_ -#define _SPC_PROTOCOL_H_ +#ifndef _SPC_PROTOCOL_H_ +#define _SPC_PROTOCOL_H_ + /** * \ingroup usb_msc_protocol diff --git a/Marlin/src/HAL/DUE/usb/stringz.h b/Marlin/src/HAL/HAL_DUE/usb/stringz.h similarity index 96% rename from Marlin/src/HAL/DUE/usb/stringz.h rename to Marlin/src/HAL/HAL_DUE/usb/stringz.h index fc9aaf38a4..b914b73489 100644 --- a/Marlin/src/HAL/DUE/usb/stringz.h +++ b/Marlin/src/HAL/HAL_DUE/usb/stringz.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _STRINGZ_H_ diff --git a/Marlin/src/HAL/DUE/usb/sysclk.c b/Marlin/src/HAL/HAL_DUE/usb/sysclk.c similarity index 97% rename from Marlin/src/HAL/DUE/usb/sysclk.c rename to Marlin/src/HAL/HAL_DUE/usb/sysclk.c index cbb4e2c9ef..899244dd88 100644 --- a/Marlin/src/HAL/DUE/usb/sysclk.c +++ b/Marlin/src/HAL/HAL_DUE/usb/sysclk.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/sysclk.h b/Marlin/src/HAL/HAL_DUE/usb/sysclk.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/sysclk.h rename to Marlin/src/HAL/HAL_DUE/usb/sysclk.h index 16db8c86d3..48c99de298 100644 --- a/Marlin/src/HAL/DUE/usb/sysclk.h +++ b/Marlin/src/HAL/HAL_DUE/usb/sysclk.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef CHIP_SYSCLK_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/tpaste.h b/Marlin/src/HAL/HAL_DUE/usb/tpaste.h similarity index 97% rename from Marlin/src/HAL/DUE/usb/tpaste.h rename to Marlin/src/HAL/HAL_DUE/usb/tpaste.h index 2ad3f2758e..f8ec44a41d 100644 --- a/Marlin/src/HAL/DUE/usb/tpaste.h +++ b/Marlin/src/HAL/HAL_DUE/usb/tpaste.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _TPASTE_H_ diff --git a/Marlin/src/HAL/DUE/usb/udc.c b/Marlin/src/HAL/HAL_DUE/usb/udc.c similarity index 99% rename from Marlin/src/HAL/DUE/usb/udc.c rename to Marlin/src/HAL/HAL_DUE/usb/udc.c index 60bf0cfff3..048a902d3b 100644 --- a/Marlin/src/HAL/DUE/usb/udc.c +++ b/Marlin/src/HAL/HAL_DUE/usb/udc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udc.h b/Marlin/src/HAL/HAL_DUE/usb/udc.h similarity index 99% rename from Marlin/src/HAL/DUE/usb/udc.h rename to Marlin/src/HAL/HAL_DUE/usb/udc.h index 8d92eb5c03..885bdf04d6 100644 --- a/Marlin/src/HAL/DUE/usb/udc.h +++ b/Marlin/src/HAL/HAL_DUE/usb/udc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDC_H_ diff --git a/Marlin/src/HAL/DUE/usb/udc_desc.h b/Marlin/src/HAL/HAL_DUE/usb/udc_desc.h similarity index 97% rename from Marlin/src/HAL/DUE/usb/udc_desc.h rename to Marlin/src/HAL/HAL_DUE/usb/udc_desc.h index 052ca08eca..88ed08a961 100644 --- a/Marlin/src/HAL/DUE/usb/udc_desc.h +++ b/Marlin/src/HAL/HAL_DUE/usb/udc_desc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDC_DESC_H_ diff --git a/Marlin/src/HAL/DUE/usb/udd.h b/Marlin/src/HAL/HAL_DUE/usb/udd.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/udd.h rename to Marlin/src/HAL/HAL_DUE/usb/udd.h index 7ec8c03dee..10807f43d7 100644 --- a/Marlin/src/HAL/DUE/usb/udd.h +++ b/Marlin/src/HAL/HAL_DUE/usb/udd.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDD_H_ @@ -94,11 +94,11 @@ typedef struct { uint16_t payload_size; //! Callback called after reception of ZLP from setup request - void (*callback)(void); + void (*callback) (void); //! Callback called when the buffer given (.payload) is full or empty. //! This one return false to abort data transfer, or true with a new buffer in .payload. - bool (*over_under_run)(void); + bool(*over_under_run) (void); } udd_ctrl_request_t; extern udd_ctrl_request_t udd_g_ctrlreq; @@ -123,7 +123,7 @@ extern udd_ctrl_request_t udd_g_ctrlreq; * Registered by routine udd_ep_wait_stall_clear() * Callback called when endpoint stall is cleared. */ -typedef void (*udd_callback_halt_cleared_t)(void); +typedef void (*udd_callback_halt_cleared_t) (void); /** * \brief End of transfer callback function type. diff --git a/Marlin/src/HAL/DUE/usb/udi.h b/Marlin/src/HAL/HAL_DUE/usb/udi.h similarity index 94% rename from Marlin/src/HAL/DUE/usb/udi.h rename to Marlin/src/HAL/HAL_DUE/usb/udi.h index febf03b718..1fc7ae5d01 100644 --- a/Marlin/src/HAL/DUE/usb/udi.h +++ b/Marlin/src/HAL/HAL_DUE/usb/udi.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDI_H_ @@ -82,7 +82,7 @@ typedef struct { * * \return \c 1 if function was successfully done, otherwise \c 0. */ - bool (*enable)(void); + bool(*enable) (void); /** * \brief Disable the interface. @@ -95,7 +95,7 @@ typedef struct { * - the device is detached from the host (i.e. Vbus is no * longer present) */ - void (*disable)(void); + void (*disable) (void); /** * \brief Handle a control request directed at an interface. @@ -108,7 +108,7 @@ typedef struct { * * \return \c 1 if this interface supports the SETUP request, otherwise \c 0. */ - bool (*setup)(void); + bool(*setup) (void); /** * \brief Returns the current setting of the selected interface. @@ -117,12 +117,12 @@ typedef struct { * * \return alternate setting of selected interface */ - uint8_t (*getsetting)(void); + uint8_t(*getsetting) (void); /** * \brief To signal that a SOF is occurred */ - void (*sof_notify)(void); + void(*sof_notify) (void); } udi_api_t; //@} diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c similarity index 99% rename from Marlin/src/HAL/DUE/usb/udi_cdc.c rename to Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c index cbe23dbb68..e54ee570fa 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc.c +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM @@ -458,7 +458,7 @@ void udi_cdc_data_sof_notify(void) } -// ------------------------ +//------------------------------------------------- //------- Internal routines to control serial line static uint8_t udi_cdc_setup_to_port(void) @@ -579,7 +579,7 @@ static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, } -// ------------------------ +//------------------------------------------------- //------- Internal routines to process data transfer @@ -781,7 +781,7 @@ static void udi_cdc_tx_send(uint8_t port) } -// ------------------------ +//--------------------------------------------- //------- Application interface diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc.h b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h similarity index 99% rename from Marlin/src/HAL/DUE/usb/udi_cdc.h rename to Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h index 0ecf7bb00e..45c5cef5ae 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc.h +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDI_CDC_H_ @@ -55,7 +55,7 @@ #include "udi.h" // Check the number of port -#ifndef UDI_CDC_PORT_NB +#ifndef UDI_CDC_PORT_NB # define UDI_CDC_PORT_NB 1 #endif #if (UDI_CDC_PORT_NB < 1) || (UDI_CDC_PORT_NB > 7) @@ -701,7 +701,7 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s * another "Composite Device" module, like "USB HID Mouse (Composite Device)". * * Also, you can refer to application note - * + * * AVR4902 ASF - USB Composite Device. * * \section udi_cdc_use_case_composite_setup Setup steps diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc_conf.h b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_conf.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/udi_cdc_conf.h rename to Marlin/src/HAL/HAL_DUE/usb/udi_cdc_conf.h index d406a87743..b99d611171 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc_conf.h +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_conf.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDI_CDC_CONF_H_ @@ -50,7 +50,7 @@ #include "usb_protocol_cdc.h" #include "conf_usb.h" -#ifndef UDI_CDC_PORT_NB +#ifndef UDI_CDC_PORT_NB # define UDI_CDC_PORT_NB 1 #endif diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc_desc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_desc.c similarity index 98% rename from Marlin/src/HAL/DUE/usb/udi_cdc_desc.c rename to Marlin/src/HAL/HAL_DUE/usb/udi_cdc_desc.c index 97c334e2a8..8f730ba823 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc_desc.c +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_cdc_desc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udi_composite_desc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_composite_desc.c similarity index 93% rename from Marlin/src/HAL/DUE/usb/udi_composite_desc.c rename to Marlin/src/HAL/HAL_DUE/usb/udi_composite_desc.c index da74fbe60d..3c5f001a26 100644 --- a/Marlin/src/HAL/DUE/usb/udi_composite_desc.c +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_composite_desc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM @@ -67,9 +67,9 @@ UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = { .bLength = sizeof(usb_dev_desc_t), .bDescriptorType = USB_DT_DEVICE, .bcdUSB = LE16(USB_V2_0), - .bDeviceClass = CDC_CLASS_MULTI, - .bDeviceSubClass = CDC_SUBCLASS_ACM, - .bDeviceProtocol = CDC_PROTOCOL_V25TER, + .bDeviceClass = 0, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, .idVendor = LE16(USB_DEVICE_VENDOR_ID), .idProduct = LE16(USB_DEVICE_PRODUCT_ID), @@ -101,9 +101,9 @@ UDC_DESC_STORAGE usb_dev_qual_desc_t udc_device_qual = { .bLength = sizeof(usb_dev_qual_desc_t), .bDescriptorType = USB_DT_DEVICE_QUALIFIER, .bcdUSB = LE16(USB_V2_0), - .bDeviceClass = CDC_CLASS_MULTI, - .bDeviceSubClass = CDC_SUBCLASS_ACM, - .bDeviceProtocol = CDC_PROTOCOL_V25TER, + .bDeviceClass = 0, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, .bNumConfigurations = 1 }; diff --git a/Marlin/src/HAL/DUE/usb/udi_msc.c b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.c similarity index 98% rename from Marlin/src/HAL/DUE/usb/udi_msc.c rename to Marlin/src/HAL/HAL_DUE/usb/udi_msc.c index b7c3bb5ea0..97d3f2990b 100644 --- a/Marlin/src/HAL/DUE/usb/udi_msc.c +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.c @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM @@ -457,7 +457,7 @@ uint8_t udi_msc_getsetting(void) } -// ------------------------ +//--------------------------------------------- //------- Routines to process CBW packet static void udi_msc_cbw_invalid(void) @@ -613,7 +613,7 @@ static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag) } -// ------------------------ +//--------------------------------------------- //------- Routines to process small data packet static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size) @@ -645,7 +645,7 @@ static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent, } -// ------------------------ +//--------------------------------------------- //------- Routines to process CSW packet static void udi_msc_csw_process(void) @@ -691,7 +691,7 @@ static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent, } -// ------------------------ +//--------------------------------------------- //------- Routines manage sense data static void udi_msc_clear_sense(void) @@ -757,7 +757,7 @@ static void udi_msc_sense_command_invalid(void) } -// ------------------------ +//--------------------------------------------- //------- Routines manage SCSI Commands static void udi_msc_spc_requestsense(void) diff --git a/Marlin/src/HAL/DUE/usb/udi_msc.h b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/udi_msc.h rename to Marlin/src/HAL/HAL_DUE/usb/udi_msc.h index 730dbc8eec..c632ee4aac 100644 --- a/Marlin/src/HAL/DUE/usb/udi_msc.h +++ b/Marlin/src/HAL/HAL_DUE/usb/udi_msc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _UDI_MSC_H_ @@ -290,7 +290,7 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, * another "Composite Device" module, like "USB HID Mouse (Composite Device)". * * Also, you can refer to application note - * + * * AVR4902 ASF - USB Composite Device. * * \section udi_msc_use_case_composite_setup Setup steps diff --git a/Marlin/src/HAL/DUE/usb/uotghs_device_due.c b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c similarity index 99% rename from Marlin/src/HAL/DUE/usb/uotghs_device_due.c rename to Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c index e13232a39c..0dfcd5ac1f 100644 --- a/Marlin/src/HAL/DUE/usb/uotghs_device_due.c +++ b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.c @@ -40,9 +40,8 @@ * \asf_license_stop * */ - /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifdef ARDUINO_ARCH_SAM @@ -506,7 +505,7 @@ static bool udd_ep_interrupt(void); //@} -// ------------------------ +//-------------------------------------------------------- //--- INTERNAL ROUTINES TO MANAGED GLOBAL EVENTS /** @@ -1307,7 +1306,7 @@ void udd_test_mode_packet(void) -// ------------------------ +//-------------------------------------------------------- //--- INTERNAL ROUTINES TO MANAGED THE CONTROL ENDPOINT static void udd_reset_ep_ctrl(void) @@ -1479,7 +1478,7 @@ static void udd_ctrl_in_sent(void) // The IN data don't must be written in endpoint 0 DPRAM during // a next setup reception in same endpoint 0 DPRAM. // Thereby, an OUT ZLP reception must check before IN data write - // and if no OUT ZLP is received the data must be written quickly (800µs) + // and if no OUT ZLP is recevied the data must be written quickly (800us) // before an eventually ZLP OUT and SETUP reception flags = cpu_irq_save(); if (Is_udd_out_received(0)) { @@ -1729,7 +1728,7 @@ static bool udd_ctrl_interrupt(void) } -// ------------------------ +//-------------------------------------------------------- //--- INTERNAL ROUTINES TO MANAGED THE BULK/INTERRUPT/ISOCHRONOUS ENDPOINTS #if (0 != USB_DEVICE_MAX_EP) @@ -1905,7 +1904,7 @@ static void udd_ep_in_sent(udd_ep_id_t ep) ptr_src = &ptr_job->buf[ptr_job->buf_cnt]; nb_remain = ptr_job->buf_size - ptr_job->buf_cnt; // Fill a bank even if no data (ZLP) - nb_data = min(nb_remain, pkt_size); + nb_data = MIN(nb_remain, pkt_size); // Modify job information ptr_job->buf_cnt += nb_data; ptr_job->buf_load = nb_data; diff --git a/Marlin/src/HAL/DUE/usb/uotghs_device_due.h b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.h similarity index 99% rename from Marlin/src/HAL/DUE/usb/uotghs_device_due.h rename to Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.h index 6df26d63df..1cd6914f85 100644 --- a/Marlin/src/HAL/DUE/usb/uotghs_device_due.h +++ b/Marlin/src/HAL/HAL_DUE/usb/uotghs_device_due.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef UOTGHS_DEVICE_DUE_H_INCLUDED @@ -291,7 +291,7 @@ extern "C" { //! available greater size, then applies register format of UOTGHS controller //! for endpoint size bit-field. #undef udd_format_endpoint_size -#define udd_format_endpoint_size(size) (32 - clz(((uint32_t)min(max(size, 8), 1024) << 1) - 1) - 1 - 3) +#define udd_format_endpoint_size(size) (32 - clz(((uint32_t)MIN(MAX(size, 8), 1024) << 1) - 1) - 1 - 3) //! Configures the selected endpoint size #define udd_configure_endpoint_size(ep, size) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPSIZE_Msk, udd_format_endpoint_size(size))) //! Gets the configured selected endpoint size diff --git a/Marlin/src/HAL/DUE/usb/uotghs_otg.h b/Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h similarity index 99% rename from Marlin/src/HAL/DUE/usb/uotghs_otg.h rename to Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h index eca5e938bb..86c903b2c1 100644 --- a/Marlin/src/HAL/DUE/usb/uotghs_otg.h +++ b/Marlin/src/HAL/HAL_DUE/usb/uotghs_otg.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef UOTGHS_OTG_H_INCLUDED diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol.h b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol.h similarity index 99% rename from Marlin/src/HAL/DUE/usb/usb_protocol.h rename to Marlin/src/HAL/HAL_DUE/usb/usb_protocol.h index ea51a86896..31c783f974 100644 --- a/Marlin/src/HAL/DUE/usb/usb_protocol.h +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol.h @@ -44,7 +44,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _USB_PROTOCOL_H_ diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_cdc.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h rename to Marlin/src/HAL/HAL_DUE/usb/usb_protocol_cdc.h index d594db52e3..875e7e4dda 100644 --- a/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_cdc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _USB_PROTOCOL_CDC_H_ #define _USB_PROTOCOL_CDC_H_ @@ -61,8 +61,6 @@ #define CDC_CLASS_DEVICE 0x02 //!< USB Communication Device Class #define CDC_CLASS_COMM 0x02 //!< CDC Communication Class Interface #define CDC_CLASS_DATA 0x0A //!< CDC Data Class Interface -#define CDC_CLASS_MULTI 0xEF //!< CDC Multi-interface Function - //@} //! \name USB CDC Subclass IDs diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_msc.h similarity index 98% rename from Marlin/src/HAL/DUE/usb/usb_protocol_msc.h rename to Marlin/src/HAL/HAL_DUE/usb/usb_protocol_msc.h index 0fef308046..db8f9cafd0 100644 --- a/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_protocol_msc.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _USB_PROTOCOL_MSC_H_ diff --git a/Marlin/src/HAL/DUE/usb/usb_task.c b/Marlin/src/HAL/HAL_DUE/usb/usb_task.c similarity index 95% rename from Marlin/src/HAL/DUE/usb/usb_task.c rename to Marlin/src/HAL/HAL_DUE/usb/usb_task.c index 66bdb265d8..c9de09c113 100644 --- a/Marlin/src/HAL/DUE/usb/usb_task.c +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_task.c @@ -41,15 +41,14 @@ * */ -// Support and FAQ: visit Atmel Support +// Support and FAQ: visit Atmel Support #ifdef ARDUINO_ARCH_SAM -#include -#include - #include "conf_usb.h" #include "udc.h" +#include +#include #if ENABLED(SDSUPPORT) static volatile bool main_b_msc_enable = false; @@ -76,14 +75,14 @@ void usb_task_idle(void) { bool usb_task_msc_isenabled(void) { return main_b_msc_enable; } #endif -bool usb_task_cdc_enable(const uint8_t port) { UNUSED(port); return ((main_b_cdc_enable = true)); } -void usb_task_cdc_disable(const uint8_t port) { UNUSED(port); main_b_cdc_enable = false; main_b_dtr_active = false; } +bool usb_task_cdc_enable(const uint8_t port) { return ((main_b_cdc_enable = true)); } +void usb_task_cdc_disable(const uint8_t port) { main_b_cdc_enable = false; main_b_dtr_active = false; } bool usb_task_cdc_isenabled(void) { return main_b_cdc_enable; } /*! \brief Called by CDC interface * Callback running when CDC device have received data */ -void usb_task_cdc_rx_notify(const uint8_t port) { UNUSED(port); } +void usb_task_cdc_rx_notify(const uint8_t port) { } /*! \brief Configures communication line * @@ -91,13 +90,13 @@ void usb_task_cdc_rx_notify(const uint8_t port) { UNUSED(port); } */ static uint16_t dwDTERate = 0; void usb_task_cdc_config(const uint8_t port, usb_cdc_line_coding_t *cfg) { - UNUSED(port); - // Store last DTE rate - dwDTERate = cfg->dwDTERate; + // Store last DTE rate + dwDTERate = cfg->dwDTERate; } + void usb_task_cdc_set_dtr(const uint8_t port, const bool b_enable) { - UNUSED(port); + // Keep DTR status main_b_dtr_active = b_enable; diff --git a/Marlin/src/HAL/DUE/usb/usb_task.h b/Marlin/src/HAL/HAL_DUE/usb/usb_task.h similarity index 97% rename from Marlin/src/HAL/DUE/usb/usb_task.h rename to Marlin/src/HAL/HAL_DUE/usb/usb_task.h index e9831ae062..fad62fda50 100644 --- a/Marlin/src/HAL/DUE/usb/usb_task.h +++ b/Marlin/src/HAL/HAL_DUE/usb/usb_task.h @@ -41,7 +41,7 @@ * */ /* - * Support and FAQ: visit Atmel Support + * Support and FAQ: visit Atmel Support */ #ifndef _USB_TASK_H_ diff --git a/Marlin/src/HAL/HAL_DUE/watchdog_Due.cpp b/Marlin/src/HAL/HAL_DUE/watchdog_Due.cpp new file mode 100644 index 0000000000..3467fdd942 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/watchdog_Due.cpp @@ -0,0 +1,115 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" +#include "../../Marlin.h" +#include "watchdog_Due.h" + +// Override Arduino runtime to either config or disable the watchdog +// +// We need to configure the watchdog as soon as possible in the boot +// process, because watchdog initialization at hardware reset on SAM3X8E +// is unreliable, and there is risk of unintended resets if we delay +// that initialization to a later time. +void watchdogSetup(void) { + + #if ENABLED(USE_WATCHDOG) + + // 4 seconds timeout + uint32_t timeout = 4000; + + // Calculate timeout value in WDT counter ticks: This assumes + // the slow clock is running at 32.768 kHz watchdog + // frequency is therefore 32768 / 128 = 256 Hz + timeout = (timeout << 8) / 1000; + if (timeout == 0) + timeout = 1; + else if (timeout > 0xFFF) + timeout = 0xFFF; + + // We want to enable the watchdog with the specified timeout + uint32_t value = + WDT_MR_WDV(timeout) | // With the specified timeout + WDT_MR_WDD(timeout) | // and no invalid write window + #if !(SAMV70 || SAMV71 || SAME70 || SAMS70) + WDT_MR_WDRPROC | // WDT fault resets processor only - We want + // to keep PIO controller state + #endif + WDT_MR_WDDBGHLT | // WDT stops in debug state. + WDT_MR_WDIDLEHLT; // WDT stops in idle state. + + #if ENABLED(WATCHDOG_RESET_MANUAL) + // We enable the watchdog timer, but only for the interrupt. + + // Configure WDT to only trigger an interrupt + value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt. + + // Disable WDT interrupt (just in case, to avoid triggering it!) + NVIC_DisableIRQ(WDT_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Initialize WDT with the given parameters + WDT_Enable(WDT, value); + + // Configure and enable WDT interrupt. + NVIC_ClearPendingIRQ(WDT_IRQn); + NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups + NVIC_EnableIRQ(WDT_IRQn); + + #else + + // a WDT fault triggers a reset + value |= WDT_MR_WDRSTEN; + + // Initialize WDT with the given parameters + WDT_Enable(WDT, value); + + #endif + + // Reset the watchdog + WDT_Restart(WDT); + + #else + + // Make sure to completely disable the Watchdog + WDT_Disable(WDT); + + #endif +} + +#if ENABLED(USE_WATCHDOG) + // Initialize watchdog - On SAM3X, Watchdog was already configured + // and enabled or disabled at startup, so no need to reconfigure it + // here. + void watchdog_init(void) { + // Reset watchdog to start clean + WDT_Restart(WDT); + } +#endif // USE_WATCHDOG + +#endif diff --git a/Marlin/src/HAL/HAL_DUE/watchdog_Due.h b/Marlin/src/HAL/HAL_DUE/watchdog_Due.h new file mode 100644 index 0000000000..57120309a3 --- /dev/null +++ b/Marlin/src/HAL/HAL_DUE/watchdog_Due.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef WATCHDOG_DUE_H +#define WATCHDOG_DUE_H + +// Arduino Due core now has watchdog support + +#include "HAL.h" + +// Initialize watchdog with a 4 second interrupt time +void watchdog_init(); + +// Reset watchdog. MUST be called at least every 4 seconds after the +// first watchdog_init or AVR will go into emergency procedures. +inline void watchdog_reset() { watchdogReset(); } + +#endif // WATCHDOG_DUE_H diff --git a/Marlin/src/HAL/HAL_ESP32/HAL.cpp b/Marlin/src/HAL/HAL_ESP32/HAL.cpp new file mode 100644 index 0000000000..f928d635f7 --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/HAL.cpp @@ -0,0 +1,155 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef ARDUINO_ARCH_ESP32 + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include +#include +#include + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(WIFISUPPORT) + #include "ota.h" +#endif + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED; + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define V_REF 1100 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +esp_adc_cal_characteristics_t characteristics; + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_init(void) { + #if ENABLED(WIFISUPPORT) + OTA_init(); + #endif +} + +void HAL_idletask(void) { + #if ENABLED(WIFISUPPORT) + OTA_handle(); + #endif +} + +void HAL_clear_reset_source(void) { } + +uint8_t HAL_get_reset_source (void) { + return rtc_get_reset_reason(1); +} + +void _delay_ms(int delay_ms) { + delay(delay_ms); +} + +// return free memory between end of heap (or end bss) and whatever is current +int freeMemory() { + return ESP.getFreeHeap(); +} + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- +#define ADC1_CHANNEL(pin) ADC1_GPIO##pin_CHANNEL + +adc1_channel_t get_channel(int pin) { + switch (pin) { + case 36: return ADC1_GPIO36_CHANNEL; + case 39: return ADC1_GPIO39_CHANNEL; + } + + return ADC1_CHANNEL_MAX; +} + +void HAL_adc_init() { + // Configure ADC + adc1_config_width(ADC_WIDTH_12Bit); + adc1_config_channel_atten(get_channel(36), ADC_ATTEN_11db); + adc1_config_channel_atten(get_channel(39), ADC_ATTEN_11db); + + // Calculate ADC characteristics i.e. gain and offset factors + esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, V_REF, &characteristics); +} + +void HAL_adc_start_conversion (uint8_t adc_pin) { + uint32_t mv; + esp_adc_cal_get_voltage((adc_channel_t)get_channel(adc_pin), &characteristics, &mv); + + HAL_adc_result = mv*1023.0/3300.0; +} + +int pin_to_channel[40] = {}; +int cnt_channel = 1; +void analogWrite(int pin, int value) { + if (pin_to_channel[pin] == 0) { + ledcAttachPin(pin, cnt_channel); + ledcSetup(cnt_channel, 490, 8); + ledcWrite(cnt_channel, value); + + pin_to_channel[pin] = cnt_channel++; + } + + ledcWrite(pin_to_channel[pin], value); +} +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/HAL_ESP32/HAL.h b/Marlin/src/HAL/HAL_ESP32/HAL.h new file mode 100644 index 0000000000..106299295a --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/HAL.h @@ -0,0 +1,127 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * Description: HAL for Espressif ESP32 WiFi + */ + +#ifndef _HAL_ESP32_H +#define _HAL_ESP32_H + +#define CPU_32_BIT + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +#undef DISABLED +#undef _BV + +#include + +#undef DISABLED +#define DISABLED(b) (!_CAT(SWITCH_ENABLED_, b)) + +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio_ESP32.h" +#include "watchdog_ESP32.h" + +#include "HAL_timers_ESP32.h" + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +extern portMUX_TYPE spinlock; + +#define NUM_SERIAL 1 +#define MYSERIAL0 Serial + +#define CRITICAL_SECTION_START portENTER_CRITICAL(&spinlock) +#define CRITICAL_SECTION_END portEXIT_CRITICAL(&spinlock) +#define ISRS_ENABLED() (spinlock.owner == portMUX_FREE_VAL) +#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock) +#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock) + + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef int16_t pin_t; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +/** result of last ADC conversion */ +extern uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// clear reset reason +void HAL_clear_reset_source (void); + +// reset reason +uint8_t HAL_get_reset_source (void); + +void _delay_ms(int delay); + +int freeMemory(void); + +void analogWrite(int pin, int value); + +// EEPROM +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +// ADC +#define HAL_ANALOG_SELECT(pin) + +void HAL_adc_init(void); + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion (uint8_t adc_pin); + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +// Enable hooks into idle and setup for HAL +#define HAL_IDLETASK 1 +#define HAL_INIT 1 +void HAL_idletask(void); +void HAL_init(void); + +#endif // _HAL_ESP32_H diff --git a/Marlin/src/HAL/HAL_ESP32/HAL_spi_ESP32.cpp b/Marlin/src/HAL/HAL_ESP32/HAL_spi_ESP32.cpp new file mode 100644 index 0000000000..c93227822d --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/HAL_spi_ESP32.cpp @@ -0,0 +1,109 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef ARDUINO_ARCH_ESP32 + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "../shared/HAL_SPI.h" +#include "pins_arduino.h" +#include "spi_pins.h" +#include "../../core/macros.h" +#include + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +static SPISettings spiConfig; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Hardware SPI +// -------------------------------------------------------------------------- + +void spiBegin() { + #if !PIN_EXISTS(SS) + #error "SS_PIN not defined!" + #endif + + WRITE(SS_PIN, HIGH); + SET_OUTPUT(SS_PIN); +} + +void spiInit(uint8_t spiRate) { + uint32_t clock; + + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV2 ; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +} + +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.transferBytes(0, buf, nbyte); + SPI.endTransaction(); +} + +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); +} + +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPI.transfer(token); + SPI.writeBytes(const_cast(buf), 512); + SPI.endTransaction(); +} + +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, bitOrder, dataMode); + + SPI.beginTransaction(spiConfig); +} + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/HAL_ESP32/HAL_timers_ESP32.cpp b/Marlin/src/HAL/HAL_ESP32/HAL_timers_ESP32.cpp new file mode 100644 index 0000000000..f3d444af0c --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/HAL_timers_ESP32.cpp @@ -0,0 +1,202 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef ARDUINO_ARCH_ESP32 + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include +#include "esp_types.h" +#include "soc/timer_group_struct.h" +#include "driver/periph_ctrl.h" +#include "driver/timer.h" + +#include "HAL.h" + +#include "HAL_timers_ESP32.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 4 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +static timg_dev_t *TG[2] = {&TIMERG0, &TIMERG1}; + +const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { + { TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper + { TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature + { TIMER_GROUP_1, TIMER_0, 1, NULL }, // 2 + { TIMER_GROUP_1, TIMER_1, 1, NULL }, // 3 +}; + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void IRAM_ATTR timer_group0_isr(void *para) { + const int timer_idx = (int)para; + + // Retrieve the interrupt status and the counter value + // from the timer that reported the interrupt + uint32_t intr_status = TIMERG0.int_st_timers.val; + TIMERG0.hw_timer[timer_idx].update = 1; + + // Clear the interrupt + if (intr_status & BIT(timer_idx)) { + switch (timer_idx) { + case TIMER_0: TIMERG0.int_clr_timers.t0 = 1; break; + case TIMER_1: TIMERG0.int_clr_timers.t1 = 1; break; + } + } + + const tTimerConfig timer = TimerConfig[timer_idx]; + timer.fn(); + + // After the alarm has been triggered + // Enable it again so it gets triggered the next time + TIMERG0.hw_timer[timer_idx].config.alarm_en = TIMER_ALARM_EN; +} + +/** + * Enable and initialize the timer + * @param timer_num timer number to initialize + * @param frequency frequency of the timer + */ +void HAL_timer_start(const uint8_t timer_num, uint32_t frequency) { + const tTimerConfig timer = TimerConfig[timer_num]; + + timer_config_t config; + config.divider = STEPPER_TIMER_PRESCALE; + config.counter_dir = TIMER_COUNT_UP; + config.counter_en = TIMER_PAUSE; + config.alarm_en = TIMER_ALARM_EN; + config.intr_type = TIMER_INTR_LEVEL; + config.auto_reload = true; + + // Select and initialize the timer + timer_init(timer.group, timer.idx, &config); + + // Timer counter initial value and auto reload on alarm + timer_set_counter_value(timer.group, timer.idx, 0x00000000ULL); + + // Configure the alam value and the interrupt on alarm + timer_set_alarm_value(timer.group, timer.idx, (HAL_TIMER_RATE) / timer.divider / frequency - 1); + + timer_enable_intr(timer.group, timer.idx); + + // TODO need to deal with timer_group1_isr + timer_isr_register(timer.group, timer.idx, timer_group0_isr, (void*)timer.idx, NULL, NULL); + + timer_start(timer.group, timer.idx); +} + +/** + * Set the upper value of the timer, when the timer reaches this upper value the + * interrupt should be triggered and the counter reset + * @param timer_num timer number to set the count to + * @param count threshold at which the interrupt is triggered + */ +void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t count) { + const tTimerConfig timer = TimerConfig[timer_num]; + timer_set_alarm_value(timer.group, timer.idx, count); +} + +/** + * Get the current upper value of the timer + * @param timer_num timer number to get the count from + * @return the timer current threshold for the alarm to be triggered + */ +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + const tTimerConfig timer = TimerConfig[timer_num]; + + uint64_t alarm_value; + timer_get_alarm_value(timer.group, timer.idx, &alarm_value); + + return alarm_value; +} + +/** + * Get the current counter value between 0 and the maximum count (HAL_timer_set_count) + * @param timer_num timer number to get the current count + * @return the current counter of the alarm + */ +hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + const tTimerConfig timer = TimerConfig[timer_num]; + + uint64_t counter_value; + timer_get_counter_value(timer.group, timer.idx, &counter_value); + + return counter_value; +} + +/** + * Enable timer interrupt on the timer + * @param timer_num timer number to enable interrupts on + */ +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + const tTimerConfig timer = TimerConfig[timer_num]; + //timer_enable_intr(timer.group, timer.idx); +} + +/** + * Disable timer interrupt on the timer + * @param timer_num timer number to disable interrupts on + */ +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + const tTimerConfig timer = TimerConfig[timer_num]; + // timer_disable_intr(timer.group, timer.idx); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + const tTimerConfig timer = TimerConfig[timer_num]; + return TG[timer.group]->int_ena.val | BIT(timer_num); +} + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/HAL_ESP32/HAL_timers_ESP32.h b/Marlin/src/HAL/HAL_ESP32/HAL_timers_ESP32.h new file mode 100644 index 0000000000..a2d0c0b6db --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/HAL_timers_ESP32.h @@ -0,0 +1,108 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _HAL_TIMERS_ESP32_H +#define _HAL_TIMERS_ESP32_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include +#include "driver/timer.h" + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- +// +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint64_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL + +#define STEP_TIMER_NUM 0 // index of timer to use for stepper +#define TEMP_TIMER_NUM 1 // index of timer to use for temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals + +#define STEPPER_TIMER_PRESCALE 40 +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer, 2MHz +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts + +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define HAL_TEMP_TIMER_ISR extern "C" void tempTC_Handler(void) +#define HAL_STEP_TIMER_ISR extern "C" void stepTC_Handler(void) + +extern "C" void tempTC_Handler(void); +extern "C" void stepTC_Handler(void); + + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef struct { + timer_group_t group; + timer_idx_t idx; + uint32_t divider; + void (*fn)(void); +} tTimerConfig; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +extern const tTimerConfig TimerConfig[]; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start (const uint8_t timer_num, uint32_t frequency); +void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t count); +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); +hal_timer_t HAL_timer_get_count(const uint8_t timer_num); + +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +#define HAL_timer_isr_prologue(TIMER_NUM) +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_ESP32_H diff --git a/Marlin/src/HAL/HAL_ESP32/SanityCheck.h b/Marlin/src/HAL/HAL_ESP32/SanityCheck.h new file mode 100644 index 0000000000..a96f665151 --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/SanityCheck.h @@ -0,0 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for ESP32. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_ESP32/endstop_interrupts.h b/Marlin/src/HAL/HAL_ESP32/endstop_interrupts.h new file mode 100644 index 0000000000..b064f16bf5 --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/endstop_interrupts.h @@ -0,0 +1,75 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the stepper-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void ICACHE_RAM_ATTR endstop_ISR(void) { endstops.update(); } + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_X_MIN + attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_ESP32/fastio_ESP32.h b/Marlin/src/HAL/HAL_ESP32/fastio_ESP32.h new file mode 100644 index 0000000000..5f609c4f0c --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/fastio_ESP32.h @@ -0,0 +1,72 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _FASTIO_ESP32_H +#define _FASTIO_ESP32_H + +/** + * Utility functions + */ + +// set pin as input +#define _SET_INPUT(IO) pinMode(IO, INPUT) + +// set pin as output +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) + +// set pin as input with pullup mode +#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT) + +// Read a pin wrapper +#define READ(IO) digitalRead(IO) + +// Write to a pin wrapper +#define WRITE(IO, v) digitalWrite(IO, v) + +// set pin as input wrapper +#define SET_INPUT(IO) _SET_INPUT(IO) + +// set pin as input with pullup wrapper +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) + +// set pin as output wrapper +#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); WRITE(IO, LOW); }while(0) + +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +// +// ports and functions +// + +// UART +#define RXD 3 +#define TXD 1 + +// TWI (I2C) +#define SCL 5 +#define SDA 4 + +// +// pins +// + +#endif // _FASTIO_ESP32_H diff --git a/Marlin/src/HAL/ESP32/ota.cpp b/Marlin/src/HAL/HAL_ESP32/ota.cpp similarity index 82% rename from Marlin/src/HAL/ESP32/ota.cpp rename to Marlin/src/HAL/HAL_ESP32/ota.cpp index 69a3e25e56..b7fd1bb5c4 100644 --- a/Marlin/src/HAL/ESP32/ota.cpp +++ b/Marlin/src/HAL/HAL_ESP32/ota.cpp @@ -1,6 +1,6 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com * * This program is free software: you can redistribute it and/or modify @@ -14,23 +14,31 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * + * along with this program. If not, see . */ #ifdef ARDUINO_ARCH_ESP32 #include "../../inc/MarlinConfigPre.h" -#if BOTH(WIFISUPPORT, OTASUPPORT) +#if ENABLED(WIFISUPPORT) #include #include #include #include -#include +#include "driver/timer.h" void OTA_init() { + WiFi.mode(WIFI_STA); + WiFi.begin(WIFI_SSID, WIFI_PWD); + + while (WiFi.waitForConnectResult() != WL_CONNECTED) { + Serial.println("Connection Failed! Rebooting..."); + delay(5000); + ESP.restart(); + } + ArduinoOTA .onStart([]() { timer_pause(TIMER_GROUP_0, TIMER_0); @@ -68,5 +76,6 @@ void OTA_handle() { ArduinoOTA.handle(); } -#endif // WIFISUPPORT && OTASUPPORT +#endif // WIFISUPPORT + #endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/ota.h b/Marlin/src/HAL/HAL_ESP32/ota.h similarity index 79% rename from Marlin/src/HAL/ESP32/ota.h rename to Marlin/src/HAL/HAL_ESP32/ota.h index 546ace82db..4af2a74cab 100644 --- a/Marlin/src/HAL/ESP32/ota.h +++ b/Marlin/src/HAL/HAL_ESP32/ota.h @@ -1,6 +1,6 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com * * This program is free software: you can redistribute it and/or modify @@ -14,10 +14,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * + * along with this program. If not, see . */ -#pragma once + +#ifndef _HAL_OTA_H +#define _HAL_OTA_H void OTA_init(); void OTA_handle(); + +#endif diff --git a/Marlin/src/HAL/ESP32/servotimers.h b/Marlin/src/HAL/HAL_ESP32/servotimers.h similarity index 76% rename from Marlin/src/HAL/ESP32/servotimers.h rename to Marlin/src/HAL/HAL_ESP32/servotimers.h index 5f1c4b1601..98b0b3c54e 100644 --- a/Marlin/src/HAL/ESP32/servotimers.h +++ b/Marlin/src/HAL/HAL_ESP32/servotimers.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,6 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once diff --git a/Marlin/src/HAL/HAL_ESP32/spi_pins.h b/Marlin/src/HAL/HAL_ESP32/spi_pins.h new file mode 100644 index 0000000000..ecd58b9100 --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/spi_pins.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + +#define SS_PIN 5 +#define SCK_PIN 18 +#define MISO_PIN 19 +#define MOSI_PIN 23 + +#endif // SPI_PINS_H_ diff --git a/Marlin/src/HAL/HAL_ESP32/watchdog_ESP32.cpp b/Marlin/src/HAL/HAL_ESP32/watchdog_ESP32.cpp new file mode 100644 index 0000000000..07e00e95b4 --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/watchdog_ESP32.cpp @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog_ESP32.h" + +void watchdogSetup(void) { + // do whatever. don't remove this function. +} + +void watchdog_init(void) { + // TODO +} + +#endif // USE_WATCHDOG + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/HAL_ESP32/watchdog_ESP32.h b/Marlin/src/HAL/HAL_ESP32/watchdog_ESP32.h new file mode 100644 index 0000000000..39f0287275 --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/watchdog_ESP32.h @@ -0,0 +1,32 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef WATCHDOG_ESP32_H +#define WATCHDOG_ESP32_H + +// Initialize watchdog with a 4 second interrupt time +void watchdog_init(); + +// Reset watchdog. +inline void watchdog_reset() {}; + +#endif // WATCHDOG_ESP32_H diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL.cpp b/Marlin/src/HAL/HAL_LPC1768/HAL.cpp new file mode 100644 index 0000000000..aec9b4ce73 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL.cpp @@ -0,0 +1,281 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +****************************************************************************/ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +HalSerial usb_serial; + +// U8glib required functions +extern "C" void u8g_xMicroDelay(uint16_t val) { + DELAY_US(val); +} +extern "C" void u8g_MicroDelay(void) { + u8g_xMicroDelay(1); +} +extern "C" void u8g_10MicroDelay(void) { + u8g_xMicroDelay(10); +} +extern "C" void u8g_Delay(uint16_t val) { + delay(val); +} +//************************// + +// return free heap space +int freeMemory() { + char stack_end; + void *heap_start = malloc(sizeof(uint32_t)); + if (heap_start == 0) return 0; + + uint32_t result = (uint32_t)&stack_end - (uint32_t)heap_start; + free(heap_start); + return result; +} + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- + +#define ADC_DONE 0x80000000 +#define ADC_OVERRUN 0x40000000 + +void HAL_adc_init(void) { + LPC_SC->PCONP |= (1 << 12); // Enable CLOCK for internal ADC controller + LPC_SC->PCLKSEL0 &= ~(0x3 << 24); + LPC_SC->PCLKSEL0 |= (0x1 << 24); // 0: 25MHz, 1: 100MHz, 2: 50MHz, 3: 12.5MHZ to ADC clock divider + LPC_ADC->ADCR = (0 << 0) // SEL: 0 = no channels selected + | (0xFF << 8) // select slowest clock for A/D conversion 150 - 190 uS for a complete conversion + | (0 << 16) // BURST: 0 = software control + | (0 << 17) // CLKS: not applicable + | (1 << 21) // PDN: 1 = operational + | (0 << 24) // START: 0 = no start + | (0 << 27); // EDGE: not applicable +} + +// externals need to make the call to KILL compile +#include "../../core/language.h" + +extern void kill(const char*); +extern const char errormagic[]; + +void HAL_adc_enable_channel(int ch) { + pin_t pin = analogInputToDigitalPin(ch); + + if (pin == -1) { + SERIAL_PRINTF("%sINVALID ANALOG PORT:%d\n", errormagic, ch); + kill(MSG_KILLED); + } + + int8_t pin_port = LPC1768_PIN_PORT(pin), + pin_port_pin = LPC1768_PIN_PIN(pin), + pinsel_start_bit = pin_port_pin > 15 ? 2 * (pin_port_pin - 16) : 2 * pin_port_pin; + uint8_t pin_sel_register = (pin_port == 0 && pin_port_pin <= 15) ? 0 : + pin_port == 0 ? 1 : + pin_port == 1 ? 3 : 10; + + switch (pin_sel_register) { + case 1: + LPC_PINCON->PINSEL1 &= ~(0x3 << pinsel_start_bit); + LPC_PINCON->PINSEL1 |= (0x1 << pinsel_start_bit); + break; + case 3: + LPC_PINCON->PINSEL3 &= ~(0x3 << pinsel_start_bit); + LPC_PINCON->PINSEL3 |= (0x3 << pinsel_start_bit); + break; + case 0: + LPC_PINCON->PINSEL0 &= ~(0x3 << pinsel_start_bit); + LPC_PINCON->PINSEL0 |= (0x2 << pinsel_start_bit); + break; + }; +} + +void HAL_adc_start_conversion(const uint8_t ch) { + if (analogInputToDigitalPin(ch) == -1) { + SERIAL_PRINTF("HAL: HAL_adc_start_conversion: invalid channel %d\n", ch); + return; + } + + LPC_ADC->ADCR &= ~0xFF; // Reset + SBI(LPC_ADC->ADCR, ch); // Select Channel + SBI(LPC_ADC->ADCR, 24); // Start conversion +} + +bool HAL_adc_finished(void) { + return LPC_ADC->ADGDR & ADC_DONE; +} + +// possible config options if something similar is extended to more platforms. +#define ADC_USE_MEDIAN_FILTER // Filter out erroneous readings +#define ADC_MEDIAN_FILTER_SIZE 23 // Higher values increase step delay (phase shift), + // (ADC_MEDIAN_FILTER_SIZE + 1) / 2 sample step delay (12 samples @ 500Hz: 24ms phase shift) + // Memory usage per ADC channel (bytes): (6 * ADC_MEDIAN_FILTER_SIZE) + 16 + // 8 * ((6 * 23) + 16 ) = 1232 Bytes for 8 channels + +#define ADC_USE_LOWPASS_FILTER // Filter out high frequency noise +#define ADC_LOWPASS_K_VALUE 6 // Higher values increase rise time + // Rise time sample delays for 100% signal convergence on full range step + // (1 : 13, 2 : 32, 3 : 67, 4 : 139, 5 : 281, 6 : 565, 7 : 1135, 8 : 2273) + // K = 6, 565 samples, 500Hz sample rate, 1.13s convergence on full range step + // Memory usage per ADC channel (bytes): 4 (32 Bytes for 8 channels) + + +// Sourced from https://embeddedgurus.com/stack-overflow/tag/median-filter/ +struct MedianFilter { + #define STOPPER 0 // Smaller than any datum + struct Pair { + Pair *point; // Pointers forming list linked in sorted order + uint16_t value; // Values to sort + }; + + Pair buffer[ADC_MEDIAN_FILTER_SIZE] = {}; // Buffer of nwidth pairs + Pair *datpoint = buffer; // Pointer into circular buffer of data + Pair small = {NULL, STOPPER}; // Chain stopper + Pair big = {&small, 0}; // Pointer to head (largest) of linked list. + + uint16_t update(uint16_t datum) { + Pair *successor; // Pointer to successor of replaced data item + Pair *scan; // Pointer used to scan down the sorted list + Pair *scanold; // Previous value of scan + Pair *median; // Pointer to median + uint16_t i; + + if (datum == STOPPER) { + datum = STOPPER + 1; // No stoppers allowed. + } + + if ( (++datpoint - buffer) >= (ADC_MEDIAN_FILTER_SIZE)) { + datpoint = buffer; // Increment and wrap data in pointer. + } + + datpoint->value = datum; // Copy in new datum + successor = datpoint->point; // Save pointer to old value's successor + median = &big; // Median initially to first in chain + scanold = NULL; // Scanold initially null. + scan = &big; // Points to pointer to first (largest) datum in chain + + // Handle chain-out of first item in chain as special case + if (scan->point == datpoint) { + scan->point = successor; + } + scanold = scan; // Save this pointer and + scan = scan->point ; // step down chain + + // Loop through the chain, normal loop exit via break. + for (i = 0 ; i < ADC_MEDIAN_FILTER_SIZE; ++i) { + // Handle odd-numbered item in chain + if (scan->point == datpoint) { + scan->point = successor; // Chain out the old datum + } + + if (scan->value < datum) { // If datum is larger than scanned value + datpoint->point = scanold->point; // Chain it in here + scanold->point = datpoint; // Mark it chained in + datum = STOPPER; + } + + // Step median pointer down chain after doing odd-numbered element + median = median->point; // Step median pointer + if (scan == &small) { + break; // Break at end of chain + } + scanold = scan; // Save this pointer and + scan = scan->point; // step down chain + + // Handle even-numbered item in chain. + if (scan->point == datpoint) { + scan->point = successor; + } + + if (scan->value < datum) { + datpoint->point = scanold->point; + scanold->point = datpoint; + datum = STOPPER; + } + + if (scan == &small) { + break; + } + + scanold = scan; + scan = scan->point; + } + return median->value; + } +}; + +struct LowpassFilter { + uint32_t data_delay = 0; + uint16_t update(const uint16_t value) { + data_delay -= (data_delay >> (ADC_LOWPASS_K_VALUE)) - value; + return (uint16_t)(data_delay >> (ADC_LOWPASS_K_VALUE)); + } +}; + +uint16_t HAL_adc_get_result(void) { + uint32_t adgdr = LPC_ADC->ADGDR; + CBI(LPC_ADC->ADCR, 24); // Stop conversion + + if (adgdr & ADC_OVERRUN) return 0; + uint16_t data = (adgdr >> 4) & 0xFFF; // copy the 12bit data value + uint8_t adc_channel = (adgdr >> 24) & 0x7; // copy the 3bit used channel + + #ifdef ADC_USE_MEDIAN_FILTER + static MedianFilter median_filter[NUM_ANALOG_INPUTS]; + data = median_filter[adc_channel].update(data); + #endif + + #ifdef ADC_USE_LOWPASS_FILTER + static LowpassFilter lowpass_filter[NUM_ANALOG_INPUTS]; + data = lowpass_filter[adc_channel].update(data); + #endif + + return ((data >> 2) & 0x3FF); // return 10bit value as Marlin expects +} + +#define SBIT_CNTEN 0 +#define SBIT_PWMEN 2 +#define SBIT_PWMMR0R 1 + +#define PWM_1 0 //P2_00 (0-1 Bits of PINSEL4) +#define PWM_2 2 //P2_01 (2-3 Bits of PINSEL4) +#define PWM_3 4 //P2_02 (4-5 Bits of PINSEL4) +#define PWM_4 6 //P2_03 (6-7 Bits of PINSEL4) +#define PWM_5 8 //P2_04 (8-9 Bits of PINSEL4) +#define PWM_6 10 //P2_05 (10-11 Bits of PINSEL4) + +void HAL_pwm_init(void) { + LPC_PINCON->PINSEL4 = _BV(PWM_5) | _BV(PWM_6); + + LPC_PWM1->TCR = _BV(SBIT_CNTEN) | _BV(SBIT_PWMEN); + LPC_PWM1->PR = 0x0; // No prescalar + LPC_PWM1->MCR = _BV(SBIT_PWMMR0R); // Reset on PWMMR0, reset TC if it matches MR0 + LPC_PWM1->MR0 = 255; // set PWM cycle(Ton+Toff)=255) + LPC_PWM1->MR5 = 0; // Set 50% Duty Cycle for the channels + LPC_PWM1->MR6 = 0; + + // Trigger the latch Enable Bits to load the new Match Values MR0, MR5, MR6 + LPC_PWM1->LER = _BV(0) | _BV(5) | _BV(6); + // Enable the PWM output pins for PWM_5-PWM_6(P2_04 - P2_05) + LPC_PWM1->PCR = _BV(13) | _BV(14); +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL.h b/Marlin/src/HAL/HAL_LPC1768/HAL.h new file mode 100644 index 0000000000..5a90dafa66 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL.h @@ -0,0 +1,158 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL_LPC1768/HAL.h + * Hardware Abstraction Layer for NXP LPC1768 + */ + +#ifndef _HAL_LPC1768_H_ +#define _HAL_LPC1768_H_ + +#define CPU_32_BIT + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include +#include + +#undef min +#undef max + +#include + +void _printf (const char *format, ...); +void _putc(uint8_t c); +uint8_t _getc(); + +extern "C" volatile uint32_t _millis; + +//arduino: Print.h +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 +//arduino: binary.h (weird defines) +#define B01 1 +#define B10 2 + +#include +#include + +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" +#include "fastio.h" +#include "watchdog.h" +#include "serial.h" +#include "HAL_timers.h" +#include "HardwareSerial.h" + +#ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(600) +#endif +#ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(750) +#endif +#ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(750) +#endif + +extern HalSerial usb_serial; + +#if !WITHIN(SERIAL_PORT, -1, 3) + #error "SERIAL_PORT must be from -1 to 3" +#endif + +#if SERIAL_PORT == -1 + #define MYSERIAL0 usb_serial +#elif SERIAL_PORT == 0 + extern HardwareSerial Serial; + #define MYSERIAL0 Serial +#elif SERIAL_PORT == 1 + extern HardwareSerial Serial1; + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 2 + extern HardwareSerial Serial2; + #define MYSERIAL0 Serial2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 Serial3 + extern HardwareSerial Serial3; +#endif + +#ifdef SERIAL_PORT_2 + #if !WITHIN(SERIAL_PORT_2, -1, 3) + #error "SERIAL_PORT_2 must be from -1 to 3" + #elif SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different than SERIAL_PORT" + #endif + #define NUM_SERIAL 2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 usb_serial + #elif SERIAL_PORT_2 == 0 + extern HardwareSerial Serial; + #define MYSERIAL1 Serial + #elif SERIAL_PORT_2 == 1 + extern HardwareSerial Serial1; + #define MYSERIAL1 Serial1 + #elif SERIAL_PORT_2 == 2 + extern HardwareSerial Serial2; + #define MYSERIAL1 Serial2 + #elif SERIAL_PORT_2 == 3 + extern HardwareSerial Serial3; + #define MYSERIAL1 Serial3 + #endif +#else + #define NUM_SERIAL 1 +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +//Utility functions +int freeMemory(void); + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + +// ADC +#define HAL_ANALOG_SELECT(pin) HAL_adc_enable_channel(pin) +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_get_result() +#define HAL_ADC_READY() HAL_adc_finished() + +void HAL_adc_init(void); +void HAL_adc_enable_channel(int pin); +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(void); +bool HAL_adc_finished(void); + +#endif // _HAL_LPC1768_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/HAL_spi.cpp new file mode 100644 index 0000000000..c8fe029d39 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_spi.cpp @@ -0,0 +1,273 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * For TARGET_LPC1768 + */ + +/** + * Hardware SPI and a software SPI implementations are included in this file. + * The hardware SPI runs faster and has higher throughput but is not compatible + * with some LCD interfaces/adapters. + * + * Control of the slave select pin(s) is handled by the calling routines. + * + * Some of the LCD interfaces/adapters result in the LCD SPI and the SD card + * SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with + * WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is + * active. If any of these pins are shared then the software SPI must be used. + * + * A more sophisticated hardware SPI can be found at the following link. This + * implementation has not been fully debugged. + * https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(LPC_SOFTWARE_SPI) + + #include "SoftwareSPI.h" + + // -------------------------------------------------------------------------- + // Software SPI + // -------------------------------------------------------------------------- + + static uint8_t SPI_speed = 0; + + static uint8_t spiTransfer(uint8_t b) { + return swSpiTransfer(b, SPI_speed, SCK_PIN, MISO_PIN, MOSI_PIN); + } + + void spiBegin() { + swSpiBegin(SCK_PIN, MISO_PIN, MOSI_PIN); + } + + void spiInit(uint8_t spiRate) { + SPI_speed = swSpiInit(spiRate, SCK_PIN, MOSI_PIN); + } + + uint8_t spiRec() { + uint8_t b = spiTransfer(0xFF); + return b; + } + + void spiRead(uint8_t*buf, uint16_t nbyte) { + if (nbyte == 0) return; + for (int i = 0; i < nbyte; i++) { + buf[i] = spiTransfer(0xFF); + } + } + + void spiSend(uint8_t b) { + uint8_t response = spiTransfer(b); + UNUSED(response); + } + + void spiSend(const uint8_t* buf, size_t n) { + uint8_t response; + if (n == 0) return; + for (uint16_t i = 0; i < n; i++) { + response = spiTransfer(buf[i]); + } + UNUSED(response); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + uint8_t response; + response = spiTransfer(token); + + for (uint16_t i = 0; i < 512; i++) { + response = spiTransfer(buf[i]); + } + UNUSED(response); + WRITE(SS_PIN, HIGH); + } + +#else + + // hardware SPI + + #include + #include + #include + + void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0 + + PINSEL_CFG_Type PinCfg; // data structure to hold init values + PinCfg.Funcnum = 2; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = LPC1768_PIN_PIN(SCK_PIN); + PinCfg.Portnum = LPC1768_PIN_PORT(SCK_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(SCK_PIN); + + PinCfg.Pinnum = LPC1768_PIN_PIN(MISO_PIN); + PinCfg.Portnum = LPC1768_PIN_PORT(MISO_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_INPUT(MISO_PIN); + + PinCfg.Pinnum = LPC1768_PIN_PIN(MOSI_PIN); + PinCfg.Portnum = LPC1768_PIN_PORT(MOSI_PIN); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(MOSI_PIN); + } + + void spiInit(uint8_t spiRate) { + SSP_Cmd(LPC_SSP0, DISABLE); // Disable SSP0 before changing rate + // table to convert Marlin spiRates (0-5 plus default) into bit rates + uint32_t Marlin_speed[7]; // CPSR is always 2 + Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED + Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED + Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED + Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED + Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 + Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 + Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h + + // divide PCLK by 2 for SSP0 + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_SSP0, CLKPWR_PCLKSEL_CCLK_DIV_2); + + // setup for SPI mode + SSP_CFG_Type HW_SPI_init; // data structure to hold init values + SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode + HW_SPI_init.ClockRate = Marlin_speed[MIN(spiRate, 6)]; // put in the specified bit rate + SSP_Init(LPC_SSP0, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers + + SSP_Cmd(LPC_SSP0, ENABLE); // start SSP0 running + } + + void spiSend(uint8_t b) { + while (!SSP_GetStatus(LPC_SSP0, SSP_STAT_TXFIFO_NOTFULL)); // wait for room in the buffer + SSP_SendData(LPC_SSP0, b & 0x00FF); + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)); // wait for it to finish + } + + + void spiSend(const uint8_t* buf, size_t n) { + if (n == 0) return; + for (uint16_t i = 0; i < n; i++) { + while (!SSP_GetStatus(LPC_SSP0, SSP_STAT_TXFIFO_NOTFULL)); // wait for room in the buffer + SSP_SendData(LPC_SSP0, buf[i] & 0x00FF); + } + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)); // wait for it to finish + } + + void spiSend(uint32_t chan, byte b) { + } + + void spiSend(uint32_t chan, const uint8_t* buf, size_t n) { + } + + static uint8_t get_one_byte() { + // send a dummy byte so can clock in receive data + SSP_SendData(LPC_SSP0,0x00FF); + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)); // wait for it to finish + return SSP_ReceiveData(LPC_SSP0) & 0x00FF; + } + + // Read single byte from SPI + uint8_t spiRec() { + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_RXFIFO_NOTEMPTY) || SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)) SSP_ReceiveData(LPC_SSP0); //flush the receive buffer + return get_one_byte(); + } + + uint8_t spiRec(uint32_t chan) { + return 0; + } + + // Read from SPI into buffer + void spiRead(uint8_t*buf, uint16_t nbyte) { + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_RXFIFO_NOTEMPTY) || SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)) SSP_ReceiveData(LPC_SSP0); //flush the receive buffer + if (nbyte == 0) return; + for (int i = 0; i < nbyte; i++) { + buf[i] = get_one_byte(); + } + } + + static uint8_t spiTransfer(uint8_t b) { + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_RXFIFO_NOTEMPTY) || SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)) SSP_ReceiveData(LPC_SSP0); //flush the receive buffer + SSP_SendData(LPC_SSP0, b); // send the byte + while (SSP_GetStatus(LPC_SSP0, SSP_STAT_BUSY)); // wait for it to finish + return SSP_ReceiveData(LPC_SSP0) & 0x00FF; + } + + // Write from buffer to SPI + void spiSendBlock(uint8_t token, const uint8_t* buf) { + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // TODO: to be implemented + + } + +#endif // ENABLED(LPC_SOFTWARE_SPI) + +void SPIClass::begin() { spiBegin(); } + +void SPIClass::beginTransaction(SPISettings cfg) { + uint8_t spiRate; + switch(cfg.spiRate()) { + case 8000000: spiRate=0 ;break; + case 4000000: spiRate=1 ;break; + case 2000000: spiRate=2 ;break; + case 1000000: spiRate=3 ;break; + case 500000: spiRate=4 ;break; + case 250000: spiRate=5 ;break; + case 125000: spiRate=6 ;break; + default: spiRate=2; break; + } + spiInit(spiRate); +} + +uint8_t SPIClass::transfer(uint8_t B) { + return spiTransfer(B); +} +uint16_t SPIClass::transfer16(uint16_t data) { + uint16_t buffer; + buffer = transfer((data>>8) & 0xFF) << 8; + buffer |= transfer(data & 0xFF) && 0xFF; + return buffer; +} + +SPIClass SPI; + +#endif // TARGET_LPC1768 + diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_temp.h b/Marlin/src/HAL/HAL_LPC1768/HAL_temp.h new file mode 100644 index 0000000000..20d2cf8d05 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_temp.h @@ -0,0 +1 @@ +// blank file needed until I get platformio to update it's copy of U8Glib-HAL \ No newline at end of file diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp new file mode 100644 index 0000000000..3714fe1a39 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.cpp @@ -0,0 +1,66 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: + * + * Timers for LPC1768 + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" +#include "HAL_timers.h" + +void HAL_timer_init(void) { + SBI(LPC_SC->PCONP, SBIT_TIMER0); // Power ON Timer 0 + LPC_TIM0->PR = (HAL_TIMER_RATE) / (STEPPER_TIMER_RATE) - 1; // Use prescaler to set frequency if needed + + SBI(LPC_SC->PCONP, SBIT_TIMER1); // Power ON Timer 1 + LPC_TIM1->PR = (HAL_TIMER_RATE) / 1000000 - 1; +} + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + LPC_TIM0->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them + LPC_TIM0->MR0 = uint32_t(STEPPER_TIMER_RATE) / frequency; // Match value (period) to set frequency + LPC_TIM0->TCR = _BV(SBIT_CNTEN); // Counter Enable + + NVIC_SetPriority(TIMER0_IRQn, NVIC_EncodePriority(0, 1, 0)); + NVIC_EnableIRQ(TIMER0_IRQn); + break; + + case 1: + LPC_TIM1->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them + LPC_TIM1->MR0 = uint32_t(TEMP_TIMER_RATE) / frequency; + LPC_TIM1->TCR = _BV(SBIT_CNTEN); // Counter Enable + + NVIC_SetPriority(TIMER1_IRQn, NVIC_EncodePriority(0, 2, 0)); + NVIC_EnableIRQ(TIMER1_IRQn); + break; + + default: break; + } +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h new file mode 100644 index 0000000000..4257028fc6 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/HAL_timers.h @@ -0,0 +1,171 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifndef _HAL_TIMERS_H +#define _HAL_TIMERS_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +#include "../../core/macros.h" + +#define SBIT_TIMER0 1 +#define SBIT_TIMER1 2 + +#define SBIT_CNTEN 0 + +#define SBIT_MR0I 0 // Timer 0 Interrupt when TC matches MR0 +#define SBIT_MR0R 1 // Timer 0 Reset TC on Match +#define SBIT_MR0S 2 // Timer 0 Stop TC and PC on Match +#define SBIT_MR1I 3 +#define SBIT_MR1R 4 +#define SBIT_MR1S 5 +#define SBIT_MR2I 6 +#define SBIT_MR2R 7 +#define SBIT_MR2S 8 +#define SBIT_MR3I 9 +#define SBIT_MR3R 10 +#define SBIT_MR3S 11 + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define _HAL_TIMER(T) _CAT(LPC_TIM, T) +#define _HAL_TIMER_IRQ(T) TIMER##T##_IRQn +#define __HAL_TIMER_ISR(T) extern "C" void TIMER##T##_IRQHandler(void) +#define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T) + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals + +#define STEP_TIMER_NUM 0 // Timer Index for Stepper +#define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM +#define PWM_TIMER_NUM 3 // Timer Index for PWM + +#define TEMP_TIMER_RATE 1000000 +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define HAL_STEP_TIMER_ISR _HAL_TIMER_ISR(STEP_TIMER_NUM) +#define HAL_TEMP_TIMER_ISR _HAL_TIMER_ISR(TEMP_TIMER_NUM) + +// Timer references by index +#define STEP_TIMER _HAL_TIMER(STEP_TIMER_NUM) +#define TEMP_TIMER _HAL_TIMER(TEMP_TIMER_NUM) + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- +void HAL_timer_init(void); +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: STEP_TIMER->MR0 = compare; break; // Stepper Timer Match Register 0 + case 1: TEMP_TIMER->MR0 = compare; break; // Temp Timer Match Register 0 + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return STEP_TIMER->MR0; // Stepper Timer Match Register 0 + case 1: return TEMP_TIMER->MR0; // Temp Timer Match Register 0 + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return STEP_TIMER->TC; // Stepper Timer Count + case 1: return TEMP_TIMER->TC; // Temp Timer Count + } + return 0; +} + +FORCE_INLINE static void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_EnableIRQ(TIMER0_IRQn); // Enable interrupt handler + case 1: NVIC_EnableIRQ(TIMER1_IRQn); // Enable interrupt handler + } +} + +FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DisableIRQ(TIMER0_IRQn); // Disable interrupt handler + case 1: NVIC_DisableIRQ(TIMER1_IRQn); // Disable interrupt handler + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +// This function is missing from CMSIS +FORCE_INLINE static bool NVIC_GetEnableIRQ(IRQn_Type IRQn) { + return (NVIC->ISER[((uint32_t)IRQn) >> 5] & (1 << ((uint32_t)IRQn) & 0x1F)) != 0; +} + +FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return NVIC_GetEnableIRQ(TIMER0_IRQn); // Check if interrupt is enabled or not + case 1: return NVIC_GetEnableIRQ(TIMER1_IRQn); // Check if interrupt is enabled or not + } + return false; +} + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case 0: SBI(STEP_TIMER->IR, SBIT_CNTEN); break; + case 1: SBI(TEMP_TIMER->IR, SBIT_CNTEN); break; + } +} + +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_H diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.cpp b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.cpp new file mode 100644 index 0000000000..b27d8e1f31 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.cpp @@ -0,0 +1,576 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * The class Servo uses the PWM class to implement its functions + * + * All PWMs use the same repetition rate - 20mS because that's the normal servo rate + */ + +/** + * This is a hybrid system. + * + * The PWM1 module is used to directly control the Servo 0, 1 & 3 pins and D9 & D10 pins. This keeps + * the pulse width jitter to under a microsecond. + * + * For all other pins a timer is used to generate interrupts. The ISR + * routine does the actual setting/clearing of pins. The upside is that any pin can + * have a PWM channel assigned to it. The downside is that there is more pulse width + * jitter. The jitter depends on what else is happening in the system and what ISRs + * pre-empt the PWM ISR. + */ + +/** + * The data structures are set up to minimize the computation done by the ISR which + * minimizes ISR execution time. Execution times are 5-14µs depending on how full the + * ISR table is. 14uS is for a 20 element ISR table. + * + * Two tables are used. One table contains the data used by the ISR to update/control + * the PWM pins. The other is used as an aid when updating the ISR table. + * + * See the end of this file for details on the hardware/firmware interaction + */ + +/** + * Directly controlled PWM pins ( + * NA means not being used as a directly controlled PWM pin + * + * Re-ARM MKS Sbase + * PWM1.1 P1_18 SERVO3_PIN NA(no connection) + * PWM1.1 P2_00 NA(E0_STEP_PIN) NA(X stepper) + * PWM1.2 P1_20 SERVO0_PIN NA(no connection) + * PWM1.2 P2_01 NA(X_STEP_PIN) NA(Y stepper) + * PWM1.3 P1_21 SERVO1_PIN NA(no connection) + * PWM1.3 P2_02 NA(Y_STEP_PIN) NA(Z stepper) + * PWM1.4 P1_23 NA(SDSS(SSEL0)) SERVO0_PIN + * PWM1.4 P2_03 NA(Z_STEP_PIN) NA(E0 stepper) + * PWM1.5 P1_24 NA(X_MIN_PIN) NA(X_MIN_pin) + * PWM1.5 P2_04 RAMPS_D9_PIN FAN_PIN + * PWM1.6 P1_26 NA(Y_MIN_PIN) NA(Y_MIN_pin) + * PWM1.6 P2_05 RAMPS_D10_PIN HEATER_BED_PIN + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" +#include +#include "LPC1768_PWM.h" +#include + +#define NUM_ISR_PWMS 20 + +#define HAL_PWM_TIMER LPC_TIM3 +#define HAL_PWM_TIMER_ISR extern "C" void TIMER3_IRQHandler(void) +#define HAL_PWM_TIMER_IRQn TIMER3_IRQn + +#define LPC_PORT_OFFSET (0x0020) +#define LPC_PIN(pin) (1UL << pin) +#define LPC_GPIO(port) ((volatile LPC_GPIO_TypeDef *)(LPC_GPIO0_BASE + LPC_PORT_OFFSET * port)) + +typedef struct { // holds all data needed to control/init one of the PWM channels + bool active_flag; // THIS TABLE ENTRY IS ACTIVELY TOGGLING A PIN + pin_t pin; + volatile uint32_t* set_register; + volatile uint32_t* clr_register; + uint32_t write_mask; // USED BY SET/CLEAR COMMANDS + uint32_t microseconds; // value written to MR register + uint32_t min; // lower value limit checked by WRITE routine before writing to the MR register + uint32_t max; // upper value limit checked by WRITE routine before writing to the MR register + uint8_t servo_index; // 0 - MAX_SERVO -1 : servo index, 0xFF : PWM channel +} PWM_map; + +PWM_map PWM1_map_A[NUM_ISR_PWMS]; // compiler will initialize to all zeros +PWM_map PWM1_map_B[NUM_ISR_PWMS]; // compiler will initialize to all zeros + +PWM_map *active_table = PWM1_map_A; +PWM_map *work_table = PWM1_map_B; +PWM_map *temp_table; + +#define P1_18_PWM_channel 1 // servo 3 +#define P1_20_PWM_channel 2 // servo 0 +#define P1_21_PWM_channel 3 // servo 1 +#define P1_23_PWM_channel 4 // servo 0 for MKS Sbase +#define P2_04_PWM_channel 5 // D9 +#define P2_05_PWM_channel 6 // D10 + +typedef struct { + uint32_t min; + uint32_t max; + bool assigned; +} table_direct; + +table_direct direct_table[6]; // compiler will initialize to all zeros + +/** + * Prescale register and MR0 register values + * + * 100MHz PCLK 50MHz PCLK 25MHz PCLK 12.5MHz PCLK + * ----------------- ----------------- ----------------- ----------------- + * desired prescale MR0 prescale MR0 prescale MR0 prescale MR0 resolution + * prescale register register register register register register register register in degrees + * freq value value value value value value value value + * + * 8 11.5 159,999 5.25 159,999 2.13 159,999 0.5625 159,999 0.023 + * 4 24 79,999 11.5 79,999 5.25 79,999 2.125 79,999 0.045 + * 2 49 39,999 24 39,999 11.5 39,999 5.25 39,999 0.090 + * 1 99 19,999 49 19,999 24 19,999 11.5 19,999 0.180 + * 0.5 199 9,999 99 9,999 49 9,999 24 9,999 0.360 + * 0.25 399 4,999 199 4,999 99 4,999 49 4,999 0.720 + * 0.125 799 2,499 399 2,499 199 2,499 99 2,499 1.440 + * + * The desired prescale frequency column comes from an input in the range of 544 - 2400 microseconds + * and the desire to just shift the input left or right as needed. + * + * A resolution of 0.2 degrees seems reasonable so a prescale frequency output of 1MHz is being used. + * It also means we don't need to scale the input. + * + * The PCLK is set to 25MHz because that's the slowest one that gives whole numbers for prescale and + * MR0 registers. + * + * Final settings: + * PCLKSEL0: 0x0 + * PWM1PR: 0x018 (24) + * PWM1MR0: 0x04E1F (19,999) + * + */ + +void LPC1768_PWM_init(void) { + + ///// directly controlled PWM pins (interrupts not used for these) + + #define SBIT_CNTEN 0 // PWM1 counter & pre-scaler enable/disable + #define SBIT_CNTRST 1 // reset counters to known state + #define SBIT_PWMEN 3 // 1 - PWM, 0 - timer + #define SBIT_PWMMR0R 1 + #define PCPWM1 6 + #define PCLK_PWM1 12 + + SBI(LPC_SC->PCONP, PCPWM1); // Enable PWM1 controller (enabled on power up) + LPC_SC->PCLKSEL0 &= ~(0x3 << PCLK_PWM1); + LPC_SC->PCLKSEL0 |= (LPC_PWM1_PCLKSEL0 << PCLK_PWM1); + + uint32_t PR = (CLKPWR_GetPCLK(CLKPWR_PCLKSEL_PWM1) / 1000000) - 1; // Prescalar to create 1 MHz output + + LPC_PWM1->MR0 = LPC_PWM1_MR0; // TC resets every 19,999 + 1 cycles - sets PWM cycle(Ton+Toff) to 20 mS + // MR0 must be set before TCR enables the PWM + LPC_PWM1->TCR = _BV(SBIT_CNTEN) | _BV(SBIT_CNTRST) | _BV(SBIT_PWMEN); // Enable counters, reset counters, set mode to PWM + CBI(LPC_PWM1->TCR, SBIT_CNTRST); // Take counters out of reset + LPC_PWM1->PR = PR; + LPC_PWM1->MCR = _BV(SBIT_PWMMR0R) | _BV(0); // Reset TC if it matches MR0, disable all interrupts except for MR0 + LPC_PWM1->CTCR = 0; // Disable counter mode (enable PWM mode) + LPC_PWM1->LER = 0x07F; // Set the latch Enable Bits to load the new Match Values for MR0 - MR6 + LPC_PWM1->PCR = 0; // Single edge mode for all channels, PWM1 control of outputs off + + //// interrupt controlled PWM setup + + LPC_SC->PCONP |= 1 << 23; // power on timer3 + HAL_PWM_TIMER->PR = PR; + HAL_PWM_TIMER->MCR = 0x0B; // Interrupt on MR0 & MR1, reset on MR0 + HAL_PWM_TIMER->MR0 = LPC_PWM1_MR0; + HAL_PWM_TIMER->MR1 = 0; + HAL_PWM_TIMER->TCR = _BV(0); // enable + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); + NVIC_SetPriority(HAL_PWM_TIMER_IRQn, NVIC_EncodePriority(0, 4, 0)); +} + + +bool ISR_table_update = false; // flag to tell the ISR that the tables need to be updated & swapped +uint8_t ISR_index = 0; // index used by ISR to skip already actioned entries +#define COPY_ACTIVE_TABLE for (uint8_t i = 0; i < NUM_ISR_PWMS ; i++) work_table[i] = active_table[i] +uint32_t first_MR1_value = LPC_PWM1_MR0 + 1; + +void LPC1768_PWM_sort(void) { + + for (uint8_t i = NUM_ISR_PWMS; --i;) { // (bubble) sort table by microseconds + bool didSwap = false; + PWM_map temp; + for (uint16_t j = 0; j < i; ++j) { + if (work_table[j].microseconds > work_table[j + 1].microseconds) { + temp = work_table[j + 1]; + work_table[j + 1] = work_table[j]; + work_table[j] = temp; + didSwap = true; + } + } + if (!didSwap) break; + } +} + +bool LPC1768_PWM_attach_pin(pin_t pin, uint32_t min /* = 1 */, uint32_t max /* = (LPC_PWM1_MR0 - 1) */, uint8_t servo_index /* = 0xFF */) { + + pin = GET_PIN_MAP_PIN(GET_PIN_MAP_INDEX(pin & 0xFF)); // Sometimes the upper byte is garbled + +//// direct control PWM code + switch (pin) { + case P1_23: // MKS Sbase Servo 0, PWM1 channel 4 (J3-8 PWM1.4) + direct_table[P1_23_PWM_channel - 1].min = min; + direct_table[P1_23_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P1_23_PWM_channel - 1].assigned = true; + return true; + case P1_20: // Servo 0, PWM1 channel 2 (Pin 11 P1.20 PWM1.2) + direct_table[P1_20_PWM_channel - 1].min = min; + direct_table[P1_20_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P1_20_PWM_channel - 1].assigned = true; + return true; + case P1_21: // Servo 1, PWM1 channel 3 (Pin 6 P1.21 PWM1.3) + direct_table[P1_21_PWM_channel - 1].min = min; + direct_table[P1_21_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P1_21_PWM_channel - 1].assigned = true; + return true; + case P1_18: // Servo 3, PWM1 channel 1 (Pin 4 P1.18 PWM1.1) + direct_table[P1_18_PWM_channel - 1].min = min; + direct_table[P1_18_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P1_18_PWM_channel - 1].assigned = true; + return true; + case P2_04: // D9 FET, PWM1 channel 5 (Pin 9 P2_04 PWM1.5) + direct_table[P2_04_PWM_channel - 1].min = min; + direct_table[P2_04_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P2_04_PWM_channel - 1].assigned = true; + return true; + case P2_05: // D10 FET, PWM1 channel 6 (Pin 10 P2_05 PWM1.6) + direct_table[P2_05_PWM_channel - 1].min = min; + direct_table[P2_05_PWM_channel - 1].max = MIN(max, LPC_PWM1_MR0 - MR0_MARGIN); + direct_table[P2_05_PWM_channel - 1].assigned = true; + return true; + } + +//// interrupt controlled PWM code + NVIC_DisableIRQ(HAL_PWM_TIMER_IRQn); // make it safe to update the active table + // OK to update the active table because the + // ISR doesn't use any of the changed items + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + if (ISR_table_update) //use work table if that's the newest + temp_table = work_table; + else + temp_table = active_table; + + uint8_t slot = 0; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) // see if already in table + if (temp_table[i].pin == pin) { + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + return 1; + } + + for (uint8_t i = 1; (i < NUM_ISR_PWMS + 1) && !slot; i++) // find empty slot + if ( !(temp_table[i - 1].set_register)) { slot = i; break; } // any item that can't be zero when active or just attached is OK + + if (!slot) { + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + return 0; + } + + slot--; // turn it into array index + + temp_table[slot].pin = pin; // init slot + temp_table[slot].set_register = &LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOSET; + temp_table[slot].clr_register = &LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOCLR; + temp_table[slot].write_mask = LPC_PIN(LPC1768_PIN_PIN(pin)); + temp_table[slot].min = min; + temp_table[slot].max = max; // different max for ISR PWMs than for direct PWMs + temp_table[slot].servo_index = servo_index; + temp_table[slot].active_flag = false; + + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + + return 1; +} + + +bool LPC1768_PWM_detach_pin(pin_t pin) { + + pin = GET_PIN_MAP_PIN(GET_PIN_MAP_INDEX(pin & 0xFF)); + +//// direct control PWM code + switch (pin) { + case P1_23: // MKS Sbase Servo 0, PWM1 channel 4 (J3-8 PWM1.4) + if (!direct_table[P1_23_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P1_23_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL3 &= ~(0x3 << 14); // return pin to general purpose I/O + direct_table[P1_23_PWM_channel - 1].assigned = false; + return true; + case P1_20: // Servo 0, PWM1 channel 2 (Pin 11 P1.20 PWM1.2) + if (!direct_table[P1_20_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P1_20_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL3 &= ~(0x3 << 8); // return pin to general purpose I/O + direct_table[P1_20_PWM_channel - 1].assigned = false; + return true; + case P1_21: // Servo 1, PWM1 channel 3 (Pin 6 P1.21 PWM1.3) + if (!direct_table[P1_21_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P1_21_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL3 &= ~(0x3 << 10); // return pin to general purpose I/O + direct_table[P1_21_PWM_channel - 1].assigned = false; + return true; + case P1_18: // Servo 3, PWM1 channel 1 (Pin 4 P1.18 PWM1.1) + if (!direct_table[P1_18_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P1_18_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL3 &= ~(0x3 << 4); // return pin to general purpose I/O + direct_table[P1_18_PWM_channel - 1].assigned = false; + return true; + case P2_04: // D9 FET, PWM1 channel 5 (Pin 9 P2_04 PWM1.5) + if (!direct_table[P2_04_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P2_04_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL4 &= ~(0x3 << 10); // return pin to general purpose I/O + direct_table[P2_04_PWM_channel - 1].assigned = false; + return true; + case P2_05: // D10 FET, PWM1 channel 6 (Pin 10 P2_05 PWM1.6) + if (!direct_table[P2_05_PWM_channel - 1].assigned) return false; + CBI(LPC_PWM1->PCR, 8 + P2_05_PWM_channel); // disable PWM1 module control of this pin + LPC_PINCON->PINSEL4 &= ~(0x3 << 4); // return pin to general purpose I/O + direct_table[P2_05_PWM_channel - 1].assigned = false; + return true; + } + +//// interrupt controlled PWM code + NVIC_DisableIRQ(HAL_PWM_TIMER_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + if (ISR_table_update) { + ISR_table_update = false; // don't update yet - have another update to do + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + } + else { + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + COPY_ACTIVE_TABLE; // copy active table into work table + } + + uint8_t slot = 0xFF; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) { // find slot + if (work_table[i].pin == pin) { + slot = i; + break; + } + } + if (slot == 0xFF) // return error if pin not found + return false; + + work_table[slot] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + + LPC1768_PWM_sort(); // sort table by microseconds + ISR_table_update = true; + return true; +} + +// value is 0-20,000 microseconds (0% to 100% duty cycle) +// servo routine provides values in the 544 - 2400 range +bool LPC1768_PWM_write(pin_t pin, uint32_t value) { + + pin = GET_PIN_MAP_PIN(GET_PIN_MAP_INDEX(pin & 0xFF)); + +//// direct control PWM code + switch (pin) { + case P1_23: // MKS Sbase Servo 0, PWM1 channel 4 (J3-8 PWM1.4) + if (!direct_table[P1_23_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P1_23_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL3 = 0x2 << 14; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR4 = MAX(MIN(value, direct_table[P1_23_PWM_channel - 1].max), direct_table[P1_23_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P1_23_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P1_20: // Servo 0, PWM1 channel 2 (Pin 11 P1.20 PWM1.2) + if (!direct_table[P1_20_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P1_20_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL3 |= 0x2 << 8; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR2 = MAX(MIN(value, direct_table[P1_20_PWM_channel - 1].max), direct_table[P1_20_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P1_20_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P1_21: // Servo 1, PWM1 channel 3 (Pin 6 P1.21 PWM1.3) + if (!direct_table[P1_21_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P1_21_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL3 |= 0x2 << 10; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR3 = MAX(MIN(value, direct_table[P1_21_PWM_channel - 1].max), direct_table[P1_21_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P1_21_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P1_18: // Servo 3, PWM1 channel 1 (Pin 4 P1.18 PWM1.1) + if (!direct_table[P1_18_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P1_18_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL3 |= 0x2 << 4; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR1 = MAX(MIN(value, direct_table[P1_18_PWM_channel - 1].max), direct_table[P1_18_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P1_18_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P2_04: // D9 FET, PWM1 channel 5 (Pin 9 P2_04 PWM1.5) + if (!direct_table[P2_04_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P2_04_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL4 |= 0x1 << 8; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR5 = MAX(MIN(value, direct_table[P2_04_PWM_channel - 1].max), direct_table[P2_04_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P2_04_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + case P2_05: // D10 FET, PWM1 channel 6 (Pin 10 P2_05 PWM1.6) + if (!direct_table[P2_05_PWM_channel - 1].assigned) return false; + LPC_PWM1->PCR |= _BV(8 + P2_05_PWM_channel); // enable PWM1 module control of this pin + LPC_PINCON->PINSEL4 |= 0x1 << 10; // must set pin function AFTER setting PCR + // load the new time value + LPC_PWM1->MR6 = MAX(MIN(value, direct_table[P2_05_PWM_channel - 1].max), direct_table[P2_05_PWM_channel - 1].min); + LPC_PWM1->LER = 0x1 << P2_05_PWM_channel; // Set the latch Enable Bit to load the new Match Value on the next MR0 + return true; + } + +//// interrupt controlled PWM code + NVIC_DisableIRQ(HAL_PWM_TIMER_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + if (!ISR_table_update) // use the most up to date table + COPY_ACTIVE_TABLE; // copy active table into work table + + uint8_t slot = 0xFF; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) // find slot + if (work_table[i].pin == pin) { slot = i; break; } + if (slot == 0xFF) { // return error if pin not found + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); + return false; + } + + work_table[slot].microseconds = MAX(MIN(value, work_table[slot].max), work_table[slot].min);; + work_table[slot].active_flag = true; + + LPC1768_PWM_sort(); // sort table by microseconds + ISR_table_update = true; + + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + return 1; +} + + +bool useable_hardware_PWM(pin_t pin) { + + pin = GET_PIN_MAP_PIN(GET_PIN_MAP_INDEX(pin & 0xFF)); + + NVIC_DisableIRQ(HAL_PWM_TIMER_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + bool return_flag = false; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) // see if it's already setup + if (active_table[i].pin == pin) return_flag = true; + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) // see if there is an empty slot + if (!active_table[i].set_register) return_flag = true; + NVIC_EnableIRQ(HAL_PWM_TIMER_IRQn); // re-enable PWM interrupts + return return_flag; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +#define PWM_LPC1768_ISR_SAFETY_FACTOR 5 // amount of time needed to guarantee MR1 count will be above TC +volatile bool in_PWM_isr = false; + +HAL_PWM_TIMER_ISR { + bool first_active_entry = true; + uint32_t next_MR1_val; + + if (in_PWM_isr) goto exit_PWM_ISR; // prevent re-entering this ISR + in_PWM_isr = true; + + if (HAL_PWM_TIMER->IR & 0x01) { // MR0 interrupt + next_MR1_val = first_MR1_value; // only used if have a blank ISR table + if (ISR_table_update) { // new values have been loaded so swap tables + temp_table = active_table; + active_table = work_table; + work_table = temp_table; + ISR_table_update = false; + } + } + HAL_PWM_TIMER->IR = 0x3F; // clear all interrupts + + for (uint8_t i = 0; i < NUM_ISR_PWMS; i++) { + if (active_table[i].active_flag) { + if (first_active_entry) { + first_active_entry = false; + next_MR1_val = active_table[i].microseconds; + } + if (HAL_PWM_TIMER->TC < active_table[i].microseconds) { + *active_table[i].set_register = active_table[i].write_mask; // set pin high + } + else { + *active_table[i].clr_register = active_table[i].write_mask; // set pin low + next_MR1_val = (i == NUM_ISR_PWMS -1) + ? LPC_PWM1_MR0 + 1 // done with table, wait for MR0 + : active_table[i + 1].microseconds; // set next MR1 interrupt? + } + } + } + if (first_active_entry) next_MR1_val = LPC_PWM1_MR0 + 1; // empty table so disable MR1 interrupt + HAL_PWM_TIMER->MR1 = MAX(next_MR1_val, HAL_PWM_TIMER->TC + PWM_LPC1768_ISR_SAFETY_FACTOR); // set next + in_PWM_isr = false; + + exit_PWM_ISR: + return; +} +#endif + + +///////////////////////////////////////////////////////////////// +///////////////// HARDWARE FIRMWARE INTERACTION //////////////// +///////////////////////////////////////////////////////////////// + +/** + * There are two distinct systems used for PWMs: + * directly controlled pins + * ISR controlled pins. + * + * The two systems are independent of each other. The use the same counter frequency so there's no + * translation needed when setting the time values. The init, attach, detach and write routines all + * start with the direct pin code which is followed by the ISR pin code. + * + * The PMW1 module handles the directly controlled pins. Each directly controlled pin is associated + * with a match register (MR1 - MR6). When the associated MR equals the module's TIMER/COUNTER (TC) + * then the pins is set to low. The MR0 register controls the repetition rate. When the TC equals + * MR0 then the TC is reset and ALL directly controlled pins are set high. The resulting pulse widths + * are almost immune to system loading and ISRs. No PWM1 interrupts are used. + * + * The ISR controlled pins use the TIMER/COUNTER, MR0 and MR1 registers from one timer. MR0 controls + * period of the controls the repetition rate. When the TC equals MR0 then the TC is reset and an + * interrupt is generated. When the TC equals MR1 then an interrupt is generated. + * + * Each interrupt does the following: + * 1) Swaps the tables if it's a MR0 interrupt and the swap flag is set. It then clears the swap flag. + * 2) Scans the entire ISR table (it's been sorted low to high time) + * a. If its the first active entry then it grabs the time as a tentative time for MR1 + * b. If active and TC is less than the time then it sets the pin high + * c. If active and TC is more than the time it sets the pin high + * d. On every entry that sets a pin low it grabs the NEXT entry's time for use as the next MR1. + * This results in MR1 being set to the time in the first active entry that does NOT set a + * pin low. + * e. If it's setting the last entry's pin low then it sets MR1 to a value bigger than MR0 + * f. If no value has been grabbed for the next MR1 then it's an empty table and MR1 is set to a + * value greater than MR0 + */ diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h new file mode 100644 index 0000000000..6c1a2480b8 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_PWM.h @@ -0,0 +1,79 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * The class Servo uses the PWM class to implement its functions + * + * All PWMs use the same repetition rate - 20mS because that's the normal servo rate + */ + +/** + * This is a hybrid system. + * + * The PWM1 module is used to directly control the Servo 0, 1 & 3 pins. This keeps + * the pulse width jitter to under a microsecond. + * + * For all other pins the PWM1 module is used to generate interrupts. The ISR + * routine does the actual setting/clearing of pins. The upside is that any pin can + * have a PWM channel assigned to it. The downside is that there is more pulse width + * jitter. The jitter depends on what else is happening in the system and what ISRs + * prempt the PWM ISR. Writing to the SD card can add 20 microseconds to the pulse + * width. + */ + +/** + * The data structures are setup to minimize the computation done by the ISR which + * minimizes ISR execution time. Execution times are 2.2 - 3.7 microseconds. + * + * Two tables are used. active_table is used by the ISR. Changes to the table are + * are done by copying the active_table into the work_table, updating the work_table + * and then swapping the two tables. Swapping is done by manipulating pointers. + * + * Immediately after the swap the ISR uses the work_table until the start of the + * next 20mS cycle. During this transition the "work_table" is actually the table + * that was being used before the swap. The "active_table" contains the data that + * will start being used at the start of the next 20mS period. This keeps the pins + * well behaved during the transition. + * + * The ISR's priority is set to the maximum otherwise other ISRs can cause considerable + * jitter in the PWM high time. + * + * See the end of this file for details on the hardware/firmware interaction + */ + +#ifndef _LPC1768_PWM_H_ +#define _LPC1768_PWM_H_ + +#include +#include + +#define LPC_PWM1_MR0 19999 // base repetition rate minus one count - 20mS +#define LPC_PWM1_PCLKSEL0 CLKPWR_PCLKSEL_CCLK_DIV_4 // select clock divider for prescaler - defaults to 4 on power up +#define MR0_MARGIN 200 // if channel value too close to MR0 the system locks up + +void LPC1768_PWM_init(void); +bool LPC1768_PWM_attach_pin(pin_t pin, uint32_t min=1, uint32_t max=(LPC_PWM1_MR0 - (MR0_MARGIN)), uint8_t servo_index=0xFF); +bool LPC1768_PWM_write(pin_t pin, uint32_t value); +bool LPC1768_PWM_detach_pin(pin_t pin); +bool useable_hardware_PWM(pin_t pin); + +#endif // _LPC1768_PWM_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp new file mode 100644 index 0000000000..4997c5e4bc --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.cpp @@ -0,0 +1,163 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Based on servo.cpp - Interrupt driven Servo library for Arduino using 16 bit + * timers- Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. + */ + +/** + * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + * The servos are pulsed in the background using the value most recently written using the write() method + * + * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + * + * The methods are: + * + * Servo - Class for manipulating servo motors connected to Arduino pins. + * + * attach(pin) - Attach a servo motor to an i/o pin. + * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds + * Default min is 544, max is 2400 + * + * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) + * writeMicroseconds() - Set the servo pulse width in microseconds. + * move(pin, angle) - Sequence of attach(pin), write(angle), safe_delay(servo_delay[servoIndex]). + * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after servo_delay[servoIndex]. + * read() - Get the last-written servo pulse width as an angle between 0 and 180. + * readMicroseconds() - Get the last-written servo pulse width in microseconds. + * attached() - Return true if a servo is attached. + * detach() - Stop an attached servo from pulsing its i/o pin. + * + */ + +/** + * The only time that this library wants physical movement is when a WRITE + * command is issued. Before that all the attach & detach activity is solely + * within the data base. + * + * The PWM output is inactive until the first WRITE. After that it stays active + * unless DEACTIVATE_SERVOS_AFTER_MOVE is enabled and a MOVE command was issued. + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + + #include "LPC1768_PWM.h" + #include "LPC1768_Servo.h" + #include "servo_private.h" + + ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures + uint8_t ServoCount = 0; // the total number of attached servos + + #define US_TO_PULSE_WIDTH(p) p + #define PULSE_WIDTH_TO_US(p) p + #define TRIM_DURATION 0 + #define SERVO_MIN() MIN_PULSE_WIDTH // minimum value in uS for this servo + #define SERVO_MAX() MAX_PULSE_WIDTH // maximum value in uS for this servo + + Servo::Servo() { + if (ServoCount < MAX_SERVOS) { + this->servoIndex = ServoCount++; // assign a servo index to this instance + servo_info[this->servoIndex].pulse_width = US_TO_PULSE_WIDTH(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009 + } + else + this->servoIndex = INVALID_SERVO; // too many servos + } + + int8_t Servo::attach(const int pin) { + return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); + } + + int8_t Servo::attach(const int pin, const int min, const int max) { + + if (this->servoIndex >= MAX_SERVOS) return -1; + + if (pin > 0) servo_info[this->servoIndex].Pin.nbr = pin; // only assign a pin value if the pin info is + // greater than zero. This way the init routine can + // assign the pin and the MOVE command only needs the value. + + this->min = MIN_PULSE_WIDTH; //resolution of min/max is 1 uS + this->max = MAX_PULSE_WIDTH; + + servo_info[this->servoIndex].Pin.isActive = true; + + return this->servoIndex; + } + + void Servo::detach() { + servo_info[this->servoIndex].Pin.isActive = false; + } + + void Servo::write(int value) { + if (value < MIN_PULSE_WIDTH) { // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) + value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(), SERVO_MAX()); + // odd - this sets zero degrees to 544 and 180 degrees to 2400 microseconds but the literature says + // zero degrees should be 500 microseconds and 180 should be 2500 + } + this->writeMicroseconds(value); + } + + void Servo::writeMicroseconds(int value) { + // calculate and store the values for the given channel + byte channel = this->servoIndex; + if (channel < MAX_SERVOS) { // ensure channel is valid + // ensure pulse width is valid + value = constrain(value, SERVO_MIN(), SERVO_MAX()) - (TRIM_DURATION); + value = US_TO_PULSE_WIDTH(value); // convert to pulse_width after compensating for interrupt overhead - 12 Aug 2009 + + servo_info[channel].pulse_width = value; + LPC1768_PWM_attach_pin(servo_info[this->servoIndex].Pin.nbr, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH, this->servoIndex); + LPC1768_PWM_write(servo_info[this->servoIndex].Pin.nbr, value); + + } + } + + // return the value as degrees + int Servo::read() { return map(this->readMicroseconds() + 1, SERVO_MIN(), SERVO_MAX(), 0, 180); } + + int Servo::readMicroseconds() { + return (this->servoIndex == INVALID_SERVO) ? 0 : PULSE_WIDTH_TO_US(servo_info[this->servoIndex].pulse_width) + TRIM_DURATION; + } + + bool Servo::attached() { return servo_info[this->servoIndex].Pin.isActive; } + + void Servo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { // notice the pin number is zero here + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + LPC1768_PWM_detach_pin(servo_info[this->servoIndex].Pin.nbr); // shut down the PWM signal + LPC1768_PWM_attach_pin(servo_info[this->servoIndex].Pin.nbr, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH, this->servoIndex); // make sure no one else steals the slot + #endif + } + } + +#endif // HAS_SERVOS +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h new file mode 100644 index 0000000000..f0d6f048a5 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/LPC1768_Servo.h @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * The class Servo uses the PWM class to implement its functions + * + * The PWM1 module is only used to generate interrups at specified times. It + * is NOT used to directly toggle pins. The ISR writes to the pin assigned to + * that interrupt + * + * All PWMs use the same repetition rate - 20mS because that's the normal servo rate + * + */ + +#ifndef LPC1768_SERVO_H +#define LPC1768_SERVO_H + +#include + + class Servo { + public: + Servo(); + int8_t attach(const int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) + int8_t attach(const int pin, const int min, const int max); // as above but also sets min and max values for writes. + void detach(); + void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + void writeMicroseconds(int value); // write pulse width in microseconds + void move(const int value); // attach the servo, then move to value + // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach + int read(); // returns current pulse width as an angle between 0 and 180 degrees + int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) + bool attached(); // return true if this servo is attached, otherwise false + + private: + uint8_t servoIndex; // index into the channel data for this servo + int min; + int max; + }; + + #define HAL_SERVO_LIB Servo + +#endif // LPC1768_SERVO_H diff --git a/Marlin/src/HAL/HAL_LPC1768/SanityCheck.h b/Marlin/src/HAL/HAL_LPC1768/SanityCheck.h new file mode 100644 index 0000000000..16299696a1 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/SanityCheck.h @@ -0,0 +1,76 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Test Re-ARM specific configuration values for errors at compile-time. + */ + +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !PWM_PIN(SPINDLE_LASER_PWM_PIN) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) + #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" + #elif SPINDLE_LASER_POWERUP_DELAY < 1 + #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." + #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI) \ + && (MB(RAMPS_14_RE_ARM_EFB) \ + || MB(RAMPS_14_RE_ARM_EEB) \ + || MB(RAMPS_14_RE_ARM_EFF) \ + || MB(RAMPS_14_RE_ARM_EEF) \ + || MB(RAMPS_14_RE_ARM_SF)) + #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 require TMC_USE_SW_SPI" +#endif diff --git a/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.cpp b/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.cpp new file mode 100644 index 0000000000..546a1d50f1 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.cpp @@ -0,0 +1,90 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * For TARGET_LPC1768 + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +// -------------------------------------------------------------------------- +// Software SPI +// -------------------------------------------------------------------------- + +/** + * This software SPI runs at multiple rates. The SD software provides an index + * (spiRate) of 0-6. The mapping is: + * 0 - about 5 MHz peak (6 MHz on LPC1769) + * 1-2 - about 2 MHz peak + * 3 - about 1 MHz peak + * 4 - about 500 kHz peak + * 5 - about 250 kHz peak + * 6 - about 125 kHz peak + */ + +uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) { + for (uint8_t i = 0; i < 8; i++) { + if (spi_speed == 0) { + WRITE(mosi_pin, !!(b & 0x80)); + WRITE(sck_pin, HIGH); + b <<= 1; + if (miso_pin >= 0 && READ(miso_pin)) b |= 1; + WRITE(sck_pin, LOW); + } + else { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + for (uint8_t j = 0; j < spi_speed; j++) + WRITE(mosi_pin, state); + + for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); j++) + WRITE(sck_pin, HIGH); + + b <<= 1; + if (miso_pin >= 0 && READ(miso_pin)) b |= 1; + + for (uint8_t j = 0; j < spi_speed; j++) + WRITE(sck_pin, LOW); + } + } + return b; +} + +void swSpiBegin(const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin) { + SET_OUTPUT(sck_pin); + if (VALID_PIN(miso_pin)) SET_INPUT(miso_pin); + SET_OUTPUT(mosi_pin); +} + +uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin) { + WRITE(mosi_pin, HIGH); + WRITE(sck_pin, LOW); + return (SystemCoreClock == 120000000 ? 44 : 38) / POW(2, 6 - MIN(spiRate, 6)); +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.h b/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.h new file mode 100644 index 0000000000..49136e2aa3 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/SoftwareSPI.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _SOFTWARE_SPI_H_ +#define _SOFTWARE_SPI_H_ + +#include + +// -------------------------------------------------------------------------- +// Software SPI +// -------------------------------------------------------------------------- + +/** + * This software SPI runs at multiple rates. The SD software provides an index + * (spiRate) of 0-6. The mapping is: + * 0 - about 5 MHz peak (6 MHz on LPC1769) + * 1-2 - about 2 MHz peak + * 3 - about 1 MHz peak + * 4 - about 500 kHz peak + * 5 - about 250 kHz peak + * 6 - about 125 kHz peak + */ + +void swSpiBegin(const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin); + +// Returns the spi_speed value to be passed to swSpiTransfer +uint8_t swSpiInit(const uint8_t spiRate, const pin_t sck_pin, const pin_t mosi_pin); + +uint8_t swSpiTransfer(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin); + +#endif // _SOFTWARE_SPI_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/WInterrupts.cpp b/Marlin/src/HAL/HAL_LPC1768/WInterrupts.cpp new file mode 100644 index 0000000000..a92a61a8fd --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/WInterrupts.cpp @@ -0,0 +1,162 @@ +/** + * Copyright (c) 2011-2012 Arduino. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +#define GNUM 31 + +typedef void (*interruptCB)(void); + +static interruptCB callbacksP0[GNUM] = {}; +static interruptCB callbacksP2[GNUM] = {}; + +extern "C" void GpioEnableInt(const uint32_t port, const uint32_t pin, const uint32_t mode); +extern "C" void GpioDisableInt(const uint32_t port, const uint32_t pin); + + +static void __initialize() { + NVIC_SetPriority(EINT3_IRQn, NVIC_EncodePriority(0, 1, 0)); + NVIC_EnableIRQ(EINT3_IRQn); +} + +void attachInterrupt(const pin_t pin, void (*callback)(void), uint32_t mode) { + static int enabled = 0; + + if (!INTERRUPT_PIN(pin)) return; + + if (!enabled) { + __initialize(); + ++enabled; + } + + uint8_t myport = LPC1768_PIN_PORT(pin), + mypin = LPC1768_PIN_PIN(pin); + + if (myport == 0) + callbacksP0[mypin] = callback; + else + callbacksP2[mypin] = callback; + + // Enable interrupt + GpioEnableInt(myport,mypin,mode); +} + +void detachInterrupt(const pin_t pin) { + if (!INTERRUPT_PIN(pin)) return; + + const uint8_t myport = LPC1768_PIN_PORT(pin), + mypin = LPC1768_PIN_PIN(pin); + + // Disable interrupt + GpioDisableInt(myport, mypin); + + // unset callback + if (myport == 0) + callbacksP0[mypin] = 0; + else //if (myport == 2 ) + callbacksP2[mypin] = 0; +} + + +extern "C" void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode) { + //pin here is the processor pin, not logical pin + if (port == 0) { + LPC_GPIOINT->IO0IntClr = _BV(pin); + if (mode == RISING) { + SBI(LPC_GPIOINT->IO0IntEnR, pin); + CBI(LPC_GPIOINT->IO0IntEnF, pin); + } + else if (mode == FALLING) { + SBI(LPC_GPIOINT->IO0IntEnF, pin); + CBI(LPC_GPIOINT->IO0IntEnR, pin); + } + else if (mode == CHANGE) { + SBI(LPC_GPIOINT->IO0IntEnR, pin); + SBI(LPC_GPIOINT->IO0IntEnF, pin); + } + } + else { + LPC_GPIOINT->IO2IntClr = _BV(pin); + if (mode == RISING) { + SBI(LPC_GPIOINT->IO2IntEnR, pin); + CBI(LPC_GPIOINT->IO2IntEnF, pin); + } + else if (mode == FALLING) { + SBI(LPC_GPIOINT->IO2IntEnF, pin); + CBI(LPC_GPIOINT->IO2IntEnR, pin); + } + else if (mode == CHANGE) { + SBI(LPC_GPIOINT->IO2IntEnR, pin); + SBI(LPC_GPIOINT->IO2IntEnF, pin); + } + } +} + +extern "C" void GpioDisableInt(const uint32_t port, const uint32_t pin) { + if (port == 0) { + CBI(LPC_GPIOINT->IO0IntEnR, pin); + CBI(LPC_GPIOINT->IO0IntEnF, pin); + LPC_GPIOINT->IO0IntClr = _BV(pin); + } + else { + CBI(LPC_GPIOINT->IO2IntEnR, pin); + CBI(LPC_GPIOINT->IO2IntEnF, pin); + LPC_GPIOINT->IO2IntClr = _BV(pin); + } +} + +extern "C" void EINT3_IRQHandler(void) { + // Read in all current interrupt registers. We do this once as the + // GPIO interrupt registers are on the APB bus, and this is slow. + uint32_t rise0 = LPC_GPIOINT->IO0IntStatR, + fall0 = LPC_GPIOINT->IO0IntStatF, + rise2 = LPC_GPIOINT->IO2IntStatR, + fall2 = LPC_GPIOINT->IO2IntStatF; + + // Clear the interrupts ASAP + LPC_GPIOINT->IO0IntClr = LPC_GPIOINT->IO2IntClr = 0xFFFFFFFF; + NVIC_ClearPendingIRQ(EINT3_IRQn); + + while (rise0 > 0) { // If multiple pins changes happened continue as long as there are interrupts pending + const uint8_t bitloc = 31 - __CLZ(rise0); // CLZ returns number of leading zeros, 31 minus that is location of first pending interrupt + if (callbacksP0[bitloc] != NULL) callbacksP0[bitloc](); + rise0 -= _BV(bitloc); + } + + while (fall0 > 0) { + const uint8_t bitloc = 31 - __CLZ(fall0); + if (callbacksP0[bitloc] != NULL) callbacksP0[bitloc](); + fall0 -= _BV(bitloc); + } + + while(rise2 > 0) { + const uint8_t bitloc = 31 - __CLZ(rise2); + if (callbacksP2[bitloc] != NULL) callbacksP2[bitloc](); + rise2 -= _BV(bitloc); + } + + while (fall2 > 0) { + const uint8_t bitloc = 31 - __CLZ(fall2); + if (callbacksP2[bitloc] != NULL) callbacksP2[bitloc](); + fall2 -= _BV(bitloc); + } +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/arduino.cpp b/Marlin/src/HAL/HAL_LPC1768/arduino.cpp new file mode 100644 index 0000000000..92efd3495a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/arduino.cpp @@ -0,0 +1,179 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef TARGET_LPC1768 + +#include "LPC1768_PWM.h" +#include + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +// Interrupts +void cli(void) { __disable_irq(); } // Disable +void sei(void) { __enable_irq(); } // Enable + +// Time functions +void _delay_ms(const int delay_ms) { + delay(delay_ms); +} + +uint32_t millis() { + return _millis; +} + +// This is required for some Arduino libraries we are using +void delayMicroseconds(uint32_t us) { + DELAY_US(us); +} + +extern "C" void delay(const int msec) { + volatile millis_t end = _millis + msec; + SysTick->VAL = SysTick->LOAD; // reset systick counter so next systick is in exactly 1ms + // this could extend the time between systicks by upto 1ms + while PENDING(_millis, end) __WFE(); +} + +// IO functions +// As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) +void pinMode(const pin_t pin, const uint8_t mode) { + if (!VALID_PIN(pin)) return; + + PINSEL_CFG_Type config = { LPC1768_PIN_PORT(pin), + LPC1768_PIN_PIN(pin), + PINSEL_FUNC_0, + PINSEL_PINMODE_TRISTATE, + PINSEL_PINMODE_NORMAL }; + switch (mode) { + case INPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + break; + case OUTPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR |= LPC_PIN(LPC1768_PIN_PIN(pin)); + break; + case INPUT_PULLUP: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + config.Pinmode = PINSEL_PINMODE_PULLUP; + break; + case INPUT_PULLDOWN: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + config.Pinmode = PINSEL_PINMODE_PULLDOWN; + break; + default: return; + } + PINSEL_ConfigPin(&config); +} + +void digitalWrite(pin_t pin, uint8_t pin_status) { + if (!VALID_PIN(pin)) return; + + if (pin_status) + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOSET = LPC_PIN(LPC1768_PIN_PIN(pin)); + else + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOCLR = LPC_PIN(LPC1768_PIN_PIN(pin)); + + pinMode(pin, OUTPUT); // Set pin mode on every write (Arduino version does this) + + /** + * Must be done AFTER the output state is set. Doing this before will cause a + * 2uS glitch if writing a "1". + * + * When the Port Direction bit is written to a "1" the output is immediately set + * to the value of the FIOPIN bit which is "0" because of power up defaults. + */ +} + +bool digitalRead(pin_t pin) { + if (!VALID_PIN(pin)) return false; + + return LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOPIN & LPC_PIN(LPC1768_PIN_PIN(pin)) ? 1 : 0; +} + +void analogWrite(pin_t pin, int pwm_value) { // 1 - 254: pwm_value, 0: LOW, 255: HIGH + if (!VALID_PIN(pin)) return; + + #define MR0_MARGIN 200 // if channel value too close to MR0 the system locks up + + static bool out_of_PWM_slots = false; + + uint value = MAX(MIN(pwm_value, 255), 0); + if (value == 0 || value == 255) { // treat as digital pin + LPC1768_PWM_detach_pin(pin); // turn off PWM + digitalWrite(pin, value); + } + else { + if (LPC1768_PWM_attach_pin(pin, 1, LPC_PWM1->MR0, 0xFF)) + LPC1768_PWM_write(pin, map(value, 0, 255, 1, LPC_PWM1->MR0)); // map 1-254 onto PWM range + else { // out of PWM channels + if (!out_of_PWM_slots) SERIAL_ECHOPGM(".\nWARNING - OUT OF PWM CHANNELS\n.\n"); //only warn once + out_of_PWM_slots = true; + digitalWrite(pin, value); // treat as a digital pin if out of channels + } + } +} + +extern bool HAL_adc_finished(); + +uint16_t analogRead(pin_t adc_pin) { + HAL_adc_start_conversion(adc_pin); + while (!HAL_adc_finished()); // Wait for conversion to finish + return HAL_adc_get_result(); +} + +// ************************** +// Persistent Config Storage +// ************************** + +void eeprom_write_byte(unsigned char *pos, unsigned char value) { + +} + +unsigned char eeprom_read_byte(uint8_t * pos) { return '\0'; } + +void eeprom_read_block(void *__dst, const void *__src, size_t __n) { } + +void eeprom_update_block(const void *__src, void *__dst, size_t __n) { } + +char *dtostrf (double __val, signed char __width, unsigned char __prec, char *__s) { + char format_string[20]; + snprintf(format_string, 20, "%%%d.%df", __width, __prec); + sprintf(__s, format_string, __val); + return __s; +} + +int32_t random(int32_t max) { + return rand() % max; +} + +int32_t random(int32_t min, int32_t max) { + return min + rand() % (max - min); +} + +void randomSeed(uint32_t value) { + srand(value); +} + +int map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/debug_extra_script.py b/Marlin/src/HAL/HAL_LPC1768/debug_extra_script.py new file mode 100644 index 0000000000..ae53adea0a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/debug_extra_script.py @@ -0,0 +1,21 @@ +Import("env") + +env.AddPostAction( + "$BUILD_DIR/firmware.hex", + env.VerboseAction(" ".join([ + "sed", "-i.bak", + "s/:10040000FFFFFFFFFFFFFFFFFFFFFFFFDEF9FFFF23/:10040000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFD/", + "$BUILD_DIR/firmware.hex" + ]), "Fixing $BUILD_DIR/firmware.hex secure flash flags")) +env.AddPreAction( + "upload", + env.VerboseAction(" ".join([ + "echo", + "'h\\nloadfile $BUILD_DIR/firmware.hex\\nr\\nq\\n'", + ">$BUILD_DIR/aux.jlink" + ]), "Creating auxiliary files")) + +env.Replace( + UPLOADHEXCMD= + 'JLinkExe -device MK20DX256xxx7 -speed 4000 -if swd -autoconnect 1 -CommanderScript $BUILD_DIR/aux.jlink -SkipProgOnCRCMatch = 1 -VerifyDownload = 1' +) diff --git a/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h b/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h new file mode 100644 index 0000000000..48312ccc07 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/endstop_interrupts.h @@ -0,0 +1,102 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.update(); } + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + #if !LPC1768_PIN_INTERRUPT_M(X_MAX_PIN) + #error "X_MAX_PIN is not an INTERRUPT capable pin." + #endif + attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_X_MIN + #if !LPC1768_PIN_INTERRUPT_M(X_MIN_PIN) + #error "X_MIN_PIN is not an INTERRUPT capable pin." + #endif + attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + #if !LPC1768_PIN_INTERRUPT_M(Y_MAX_PIN) + #error "Y_MAX_PIN is not an INTERRUPT capable pin." + #endif + attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + #if !LPC1768_PIN_INTERRUPT_M(Y_MIN_PIN) + #error "Y_MIN_PIN is not an INTERRUPT capable pin." + #endif + attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + #if !LPC1768_PIN_INTERRUPT_M(Z_MAX_PIN) + #error "Z_MAX_PIN is not an INTERRUPT capable pin." + #endif + attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN) + #error "Z_MIN_PIN is not an INTERRUPT capable pin." + #endif + attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + #if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN) + #error "Z2_MAX_PIN is not an INTERRUPT capable pin." + #endif + attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + #if !LPC1768_PIN_INTERRUPT_M(Z2_MIN_PIN) + #error "Z2_MIN_PIN is not an INTERRUPT capable pin." + #endif + attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN) + #error "Z_MIN_PROBE_PIN is not an INTERRUPT capable pin." + #endif + attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/fastio.h b/Marlin/src/HAL/HAL_LPC1768/fastio.h new file mode 100644 index 0000000000..5f55f73c86 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/fastio.h @@ -0,0 +1,131 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Fast I/O Routines for LPC1768/9 + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +/** + * Description: Fast IO functions LPC1768 + * + * For TARGET LPC1768 + */ + +#ifndef _FASTIO_LPC1768_H +#define _FASTIO_LPC1768_H + +#include +#include +#include + +bool useable_hardware_PWM(pin_t pin); +#define USEABLE_HARDWARE_PWM(pin) useable_hardware_PWM(pin) + +#define LPC_PORT_OFFSET (0x0020) +#define LPC_PIN(pin) (1UL << pin) +#define LPC_GPIO(port) ((volatile LPC_GPIO_TypeDef *)(LPC_GPIO0_BASE + LPC_PORT_OFFSET * port)) + +#define SET_DIR_INPUT(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(IO))) +#define SET_DIR_OUTPUT(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIODIR |= LPC_PIN(LPC1768_PIN_PIN(IO))) + +#define SET_MODE(IO, mode) (pin_mode((LPC1768_PIN_PORT(IO), LPC1768_PIN_PIN(IO)), mode)) + +#define WRITE_PIN_SET(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIOSET = LPC_PIN(LPC1768_PIN_PIN(IO))) +#define WRITE_PIN_CLR(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIOCLR = LPC_PIN(LPC1768_PIN_PIN(IO))) + +#define READ_PIN(IO) ((LPC_GPIO(LPC1768_PIN_PORT(IO))->FIOPIN & LPC_PIN(LPC1768_PIN_PIN(IO))) ? 1 : 0) +#define WRITE_PIN(IO,V) ((V) ? WRITE_PIN_SET(IO) : WRITE_PIN_CLR(IO)) + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); + * + * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + */ + +/// Read a pin +#define _READ(IO) READ_PIN(IO) + +/// Write to a pin +#define _WRITE_VAR(IO,V) digitalWrite(IO,V) + +#define _WRITE(IO,V) WRITE_PIN(IO,V) + +/// toggle a pin +#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) + +/// set pin as input +#define _SET_INPUT(IO) SET_DIR_INPUT(IO) + +/// set pin as output +#define _SET_OUTPUT(IO) SET_DIR_OUTPUT(IO) + +/// set pin as input with pullup mode +#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) + +/// set pin as input with pulldown mode +#define _PULLDOWN(IO,V) pinMode(IO, (V) ? INPUT_PULLDOWN : INPUT) + +/// check if pin is an input +#define _GET_INPUT(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIODIR & LPC_PIN(LPC1768_PIN_PIN(IO)) != 0) + +/// check if pin is an output +#define _GET_OUTPUT(IO) (LPC_GPIO(LPC1768_PIN_PORT(IO))->FIODIR & LPC_PIN(LPC1768_PIN_PIN(IO)) == 0) + +/// check if pin is a timer +/// all gpio pins are pwm capable, either interrupt or hardware pwm controlled +#define _GET_TIMER(IO) TRUE + +/// Read a pin wrapper +#define READ(IO) _READ(IO) + +/// Write to a pin wrapper +#define WRITE_VAR(IO,V) _WRITE_VAR(IO,V) +#define WRITE(IO,V) _WRITE(IO,V) + +/// toggle a pin wrapper +#define TOGGLE(IO) _TOGGLE(IO) + +/// set pin as input wrapper +#define SET_INPUT(IO) _SET_INPUT(IO) +/// set pin as input with pullup wrapper +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) +/// set pin as input with pulldown wrapper +#define SET_INPUT_PULLDOWN(IO) do{ _SET_INPUT(IO); _PULLDOWN(IO, HIGH); }while(0) +/// set pin as output wrapper - reads the pin and sets the output to that value +#define SET_OUTPUT(IO) do{ _WRITE(IO, _READ(IO)); _SET_OUTPUT(IO); }while(0) + +/// check if pin is an input wrapper +#define GET_INPUT(IO) _GET_INPUT(IO) +/// check if pin is an output wrapper +#define GET_OUTPUT(IO) _GET_OUTPUT(IO) + +/// check if pin is a timer (wrapper) +#define GET_TIMER(IO) _GET_TIMER(IO) + +// Shorthand +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +#endif // _FASTIO_LPC1768_H diff --git a/Marlin/src/HAL/LINUX/include/Arduino.h b/Marlin/src/HAL/HAL_LPC1768/include/Arduino.h similarity index 76% rename from Marlin/src/HAL/LINUX/include/Arduino.h rename to Marlin/src/HAL/HAL_LPC1768/include/Arduino.h index e28b474ede..aebc76a6ea 100644 --- a/Marlin/src/HAL/LINUX/include/Arduino.h +++ b/Marlin/src/HAL/HAL_LPC1768/include/Arduino.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,15 +16,15 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once +#ifndef __ARDUINO_H__ +#define __ARDUINO_H__ #include #include #include -#include #include @@ -49,6 +49,8 @@ typedef uint8_t byte; #define PGM_P const char * // Used for libraries, preprocessor, and constants +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) #define abs(x) ((x)>0?(x):-(x)) #ifndef isnan @@ -63,10 +65,10 @@ typedef uint8_t byte; #define constrain(value, arg_min, arg_max) ((value) < (arg_min) ? (arg_min) :((value) > (arg_max) ? (arg_max) : (value))) //Interrupts -void cli(); // Disable -void sei(); // Enable -void attachInterrupt(uint32_t pin, void (*callback)(), uint32_t mode); -void detachInterrupt(uint32_t pin); +void cli(void); // Disable +void sei(void); // Enable +void attachInterrupt(const pin_t pin, void (*callback)(void), uint32_t mode); +void detachInterrupt(const pin_t pin); extern "C" void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode); extern "C" void GpioDisableInt(uint32_t port, uint32_t pin); @@ -81,7 +83,6 @@ extern "C" void GpioDisableInt(uint32_t port, uint32_t pin); #define pgm_read_word(addr) pgm_read_word_near(addr) #define pgm_read_dword(addr) pgm_read_dword_near(addr) -using std::memcpy; #define memcpy_P memcpy #define sprintf_P sprintf #define strstr_P strstr @@ -90,6 +91,7 @@ using std::memcpy; #define strcpy_P strcpy #define snprintf_P snprintf #define strlen_P strlen +#define strchr_P strchr // Time functions extern "C" { @@ -106,10 +108,18 @@ bool digitalRead(pin_t); void analogWrite(pin_t, int); uint16_t analogRead(pin_t); +// EEPROM +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + int32_t random(int32_t); int32_t random(int32_t, int32_t); void randomSeed(uint32_t); -char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s); +char *dtostrf (double __val, signed char __width, unsigned char __prec, char *__s); int map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max); + +#endif // __ARDUINO_DEF_H__ diff --git a/Marlin/src/HAL/HAL_LPC1768/include/HardwareSerial.cpp b/Marlin/src/HAL/HAL_LPC1768/include/HardwareSerial.cpp new file mode 100644 index 0000000000..152b045d55 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/HardwareSerial.cpp @@ -0,0 +1,335 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef TARGET_LPC1768 + +#include "HardwareSerial.h" + +#if SERIAL_PORT == 0 || SERIAL_PORT_2 == 0 + HardwareSerial Serial = HardwareSerial(LPC_UART0); +#elif SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 + HardwareSerial Serial1 = HardwareSerial((LPC_UART_TypeDef *) LPC_UART1); +#elif SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 + HardwareSerial Serial2 = HardwareSerial(LPC_UART2); +#elif SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 + HardwareSerial Serial3 = HardwareSerial(LPC_UART3); +#endif + +void HardwareSerial::begin(uint32_t baudrate) { + + UART_CFG_Type UARTConfigStruct; + PINSEL_CFG_Type PinCfg; + UART_FIFO_CFG_Type FIFOConfig; + + if (Baudrate == baudrate) return; // No need to re-initialize + + if (UARTx == LPC_UART0) { + // Initialize UART0 pin connect + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 2; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 3; + PINSEL_ConfigPin(&PinCfg); + } else if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) { + // Initialize UART1 pin connect + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 15; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 16; + PINSEL_ConfigPin(&PinCfg); + } else if (UARTx == LPC_UART2) { + // Initialize UART2 pin connect + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 10; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 11; + PINSEL_ConfigPin(&PinCfg); + } else if (UARTx == LPC_UART3) { + // Initialize UART2 pin connect + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 0; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 1; + PINSEL_ConfigPin(&PinCfg); + } + + /* Initialize UART Configuration parameter structure to default state: + * Baudrate = 9600bps + * 8 data bit + * 1 Stop bit + * None parity + */ + UART_ConfigStructInit(&UARTConfigStruct); + + // Re-configure baudrate + UARTConfigStruct.Baud_rate = baudrate; + + // Initialize eripheral with given to corresponding parameter + UART_Init(UARTx, &UARTConfigStruct); + + // Enable and reset the TX and RX FIFOs + UART_FIFOConfigStructInit(&FIFOConfig); + UART_FIFOConfig(UARTx, &FIFOConfig); + + // Enable UART Transmit + UART_TxCmd(UARTx, ENABLE); + + // Configure Interrupts + UART_IntConfig(UARTx, UART_INTCFG_RBR, ENABLE); + UART_IntConfig(UARTx, UART_INTCFG_RLS, ENABLE); + + // Set proper priority and enable interrupts + if (UARTx == LPC_UART0) { + NVIC_SetPriority(UART0_IRQn, NVIC_EncodePriority(0, 3, 0)); + NVIC_EnableIRQ(UART0_IRQn); + } + else if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) { + NVIC_SetPriority(UART1_IRQn, NVIC_EncodePriority(0, 3, 0)); + NVIC_EnableIRQ(UART1_IRQn); + } + else if (UARTx == LPC_UART2) { + NVIC_SetPriority(UART2_IRQn, NVIC_EncodePriority(0, 3, 0)); + NVIC_EnableIRQ(UART2_IRQn); + } + else if (UARTx == LPC_UART3) { + NVIC_SetPriority(UART3_IRQn, NVIC_EncodePriority(0, 3, 0)); + NVIC_EnableIRQ(UART3_IRQn); + } + + RxQueueWritePos = RxQueueReadPos = 0; + #if TX_BUFFER_SIZE > 0 + TxQueueWritePos = TxQueueReadPos = 0; + #endif + + // Save the configured baudrate + Baudrate = baudrate; +} + +int16_t HardwareSerial::peek() { + int16_t byte = -1; + + // Temporarily lock out UART receive interrupts during this read so the UART receive + // interrupt won't cause problems with the index values + UART_IntConfig(UARTx, UART_INTCFG_RBR, DISABLE); + + if (RxQueueReadPos != RxQueueWritePos) + byte = RxBuffer[RxQueueReadPos]; + + // Re-enable UART interrupts + UART_IntConfig(UARTx, UART_INTCFG_RBR, ENABLE); + + return byte; +} + +int16_t HardwareSerial::read() { + int16_t byte = -1; + + // Temporarily lock out UART receive interrupts during this read so the UART receive + // interrupt won't cause problems with the index values + UART_IntConfig(UARTx, UART_INTCFG_RBR, DISABLE); + + if (RxQueueReadPos != RxQueueWritePos) { + byte = RxBuffer[RxQueueReadPos]; + RxQueueReadPos = (RxQueueReadPos + 1) % RX_BUFFER_SIZE; + } + + // Re-enable UART interrupts + UART_IntConfig(UARTx, UART_INTCFG_RBR, ENABLE); + + return byte; +} + +size_t HardwareSerial::write(uint8_t send) { +#if TX_BUFFER_SIZE > 0 + size_t bytes = 0; + uint32_t fifolvl = 0; + + // If the Tx Buffer is full, wait for space to clear + if ((TxQueueWritePos+1) % TX_BUFFER_SIZE == TxQueueReadPos) flushTX(); + + // Temporarily lock out UART transmit interrupts during this read so the UART transmit interrupt won't + // cause problems with the index values + UART_IntConfig(UARTx, UART_INTCFG_THRE, DISABLE); + + // LPC17xx.h incorrectly defines FIFOLVL as a uint8_t, when it's actually a 32-bit register + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) { + fifolvl = *(reinterpret_cast(&((LPC_UART1_TypeDef *) UARTx)->FIFOLVL)); + } else fifolvl = *(reinterpret_cast(&UARTx->FIFOLVL)); + + // If the queue is empty and there's space in the FIFO, immediately send the byte + if (TxQueueWritePos == TxQueueReadPos && fifolvl < UART_TX_FIFO_SIZE) { + bytes = UART_Send(UARTx, &send, 1, BLOCKING); + } + // Otherwiise, write the byte to the transmit buffer + else if ((TxQueueWritePos+1) % TX_BUFFER_SIZE != TxQueueReadPos) { + TxBuffer[TxQueueWritePos] = send; + TxQueueWritePos = (TxQueueWritePos+1) % TX_BUFFER_SIZE; + bytes++; + } + + // Re-enable the TX Interrupt + UART_IntConfig(UARTx, UART_INTCFG_THRE, ENABLE); + + return bytes; +#else + return UART_Send(UARTx, &send, 1, BLOCKING); +#endif +} + +#if TX_BUFFER_SIZE > 0 + void HardwareSerial::flushTX() { + // Wait for the tx buffer and FIFO to drain + while (TxQueueWritePos != TxQueueReadPos && UART_CheckBusy(UARTx) == SET); + } +#endif + +size_t HardwareSerial::available() { + return (RxQueueWritePos + RX_BUFFER_SIZE - RxQueueReadPos) % RX_BUFFER_SIZE; +} + +void HardwareSerial::flush() { + RxQueueWritePos = 0; + RxQueueReadPos = 0; +} + +size_t HardwareSerial::printf(const char *format, ...) { + char RxBuffer[256]; + va_list vArgs; + va_start(vArgs, format); + int length = vsnprintf(RxBuffer, 256, format, vArgs); + va_end(vArgs); + if (length > 0 && length < 256) { + for (size_t i = 0; i < (size_t)length; ++i) + write(RxBuffer[i]); + } + return length; +} + +void HardwareSerial::IRQHandler() { + uint32_t IIRValue; + uint8_t LSRValue, byte; + + IIRValue = UART_GetIntId(UARTx); + IIRValue &= UART_IIR_INTID_MASK; // check bit 1~3, interrupt identification + + // Receive Line Status + if (IIRValue == UART_IIR_INTID_RLS) { + LSRValue = UART_GetLineStatus(UARTx); + + // Receive Line Status + if (LSRValue & (UART_LSR_OE | UART_LSR_PE | UART_LSR_FE | UART_LSR_RXFE | UART_LSR_BI)) { + // There are errors or break interrupt + // Read LSR will clear the interrupt + Status = LSRValue; + byte = UART_ReceiveByte(UARTx); // Dummy read on RX to clear interrupt, then bail out + return; + } + } + + // Receive Data Available + if (IIRValue == UART_IIR_INTID_RDA) { + // Clear the FIFO + while (UART_Receive(UARTx, &byte, 1, NONE_BLOCKING)) { + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, byte); + #endif + if ((RxQueueWritePos + 1) % RX_BUFFER_SIZE != RxQueueReadPos) { + RxBuffer[RxQueueWritePos] = byte; + RxQueueWritePos = (RxQueueWritePos + 1) % RX_BUFFER_SIZE; + } else + break; + } + // Character timeout indicator + } else if (IIRValue == UART_IIR_INTID_CTI) { + // Character Time-out indicator + Status |= 0x100; // Bit 9 as the CTI error + } + + #if TX_BUFFER_SIZE > 0 + if (IIRValue == UART_IIR_INTID_THRE) { + // Disable THRE interrupt + UART_IntConfig(UARTx, UART_INTCFG_THRE, DISABLE); + + // Wait for FIFO buffer empty + while (UART_CheckBusy(UARTx) == SET); + + // Transfer up to UART_TX_FIFO_SIZE bytes of data + for (int i = 0; i < UART_TX_FIFO_SIZE && TxQueueWritePos != TxQueueReadPos; i++) { + // Move a piece of data into the transmit FIFO + if (UART_Send(UARTx, &TxBuffer[TxQueueReadPos], 1, NONE_BLOCKING)) { + TxQueueReadPos = (TxQueueReadPos+1) % TX_BUFFER_SIZE; + } else break; + } + + // If there is no more data to send, disable the transmit interrupt - else enable it or keep it enabled + if (TxQueueWritePos == TxQueueReadPos) { + UART_IntConfig(UARTx, UART_INTCFG_THRE, DISABLE); + } else UART_IntConfig(UARTx, UART_INTCFG_THRE, ENABLE); + } + #endif +} + +#ifdef __cplusplus +extern "C" { +#endif + +void UART0_IRQHandler(void) { + #if SERIAL_PORT == 0 || SERIAL_PORT_2 == 0 + Serial.IRQHandler(); + #endif +} + +void UART1_IRQHandler(void) { + #if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 + Serial1.IRQHandler(); + #endif +} + +void UART2_IRQHandler(void) { + #if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 + Serial2.IRQHandler(); + #endif +} + +void UART3_IRQHandler(void) { + #if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 + Serial3.IRQHandler(); + #endif +} + +#ifdef __cplusplus +} +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/include/HardwareSerial.h b/Marlin/src/HAL/HAL_LPC1768/include/HardwareSerial.h new file mode 100644 index 0000000000..f3bd2f6b42 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/HardwareSerial.h @@ -0,0 +1,91 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef HARDWARE_SERIAL_H_ +#define HARDWARE_SERIAL_H_ + +#include "../../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../../feature/emergency_parser.h" +#endif + +#include +#include +#include + +extern "C" { + #include + #include "lpc17xx_pinsel.h" +} + +class HardwareSerial : public Stream { +private: + LPC_UART_TypeDef *UARTx; + + uint32_t Baudrate; + uint32_t Status; + uint8_t RxBuffer[RX_BUFFER_SIZE]; + uint32_t RxQueueWritePos; + uint32_t RxQueueReadPos; + #if TX_BUFFER_SIZE > 0 + uint8_t TxBuffer[TX_BUFFER_SIZE]; + uint32_t TxQueueWritePos; + uint32_t TxQueueReadPos; + #endif + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + #endif + +public: + HardwareSerial(LPC_UART_TypeDef *UARTx) + : UARTx(UARTx) + , Baudrate(0) + , RxQueueWritePos(0) + , RxQueueReadPos(0) + #if TX_BUFFER_SIZE > 0 + , TxQueueWritePos(0) + , TxQueueReadPos(0) + #endif + #if ENABLED(EMERGENCY_PARSER) + , emergency_state(EmergencyParser::State::EP_RESET) + #endif + { + } + + void begin(uint32_t baudrate); + int16_t peek(); + int16_t read(); + size_t write(uint8_t send); + #if TX_BUFFER_SIZE > 0 + void flushTX(); + #endif + size_t available(); + void flush(); + size_t printf(const char *format, ...); + + operator bool() { return true; } + + void IRQHandler(); + +}; + +#endif // MARLIN_SRC_HAL_HAL_SERIAL_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/include/SPI.h b/Marlin/src/HAL/HAL_LPC1768/include/SPI.h new file mode 100644 index 0000000000..2515634236 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/SPI.h @@ -0,0 +1,49 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#include "../../shared/HAL_SPI.h" + +#include + +#define MSBFIRST 1 +#define SPI_MODE3 0 + +class SPISettings { + public: + SPISettings(uint32_t speed, int, int) : spi_speed(speed) {}; + uint32_t spiRate() { return spi_speed; } + private: + uint32_t spi_speed; +}; + +class SPIClass { + public: + void begin(); + void beginTransaction(SPISettings); + void endTransaction() {}; + uint8_t transfer(uint8_t data); + uint16_t transfer16(uint16_t data); +}; + +extern SPIClass SPI; diff --git a/Marlin/src/HAL/HAL_LPC1768/include/SoftwareSerial.cpp b/Marlin/src/HAL/HAL_LPC1768/include/SoftwareSerial.cpp new file mode 100644 index 0000000000..1d469dab3a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/SoftwareSerial.cpp @@ -0,0 +1,329 @@ +/* + * SoftwareSerial.cpp (formerly NewSoftSerial.cpp) + * + * Multi-instance software serial library for Arduino/Wiring + * -- Interrupt-driven receive and other improvements by ladyada + * (http://ladyada.net) + * -- Tuning, circular buffer, derivation from class Print/Stream, + * multi-instance support, porting to 8MHz processors, + * various optimizations, PROGMEM delay tables, inverse logic and + * direct port writing by Mikal Hart (http://www.arduiniana.org) + * -- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) + * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) + * -- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * The latest version of this library can always be found at + * http://arduiniana.org. + */ + +#ifdef TARGET_LPC1768 + +// +// Includes +// +//#include +#include "../../../inc/MarlinConfig.h" +#include "../../shared/Delay.h" +#include +#include +#include +#include +#include "../fastio.h" +#include "SoftwareSerial.h" + +void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode); +void GpioDisableInt(uint32_t port, uint32_t pin); +// +// Statics +// +SoftwareSerial *SoftwareSerial::active_object = 0; +unsigned char SoftwareSerial::_receive_buffer[_SS_MAX_RX_BUFF]; +volatile uint8_t SoftwareSerial::_receive_buffer_tail = 0; +volatile uint8_t SoftwareSerial::_receive_buffer_head = 0; + +typedef struct _DELAY_TABLE { + long baud; + uint16_t rx_delay_centering; + uint16_t rx_delay_intrabit; + uint16_t rx_delay_stopbit; + uint16_t tx_delay; +} DELAY_TABLE; + +// rough delay estimation +static const DELAY_TABLE table[] = { + //baud |rxcenter|rxintra |rxstop |tx { 250000, 2, 4, 4, 4, }, //Done but not good due to instruction cycle error { 115200, 4, 8, 8, 8, }, //Done but not good due to instruction cycle error + //{ 74880, 69, 139, 62, 162, }, // estimation + //{ 57600, 100, 185, 1, 208, }, // Done but not good due to instruction cycle error + //{ 38400, 13, 26, 26, 26, }, // Done + //{ 19200, 26, 52, 52, 52, }, // Done { 9600, 52, 104, 104, 104, }, // Done + //{ 4800, 104, 208, 208, 208, }, + //{ 2400, 208, 417, 417, 417, }, + //{ 1200, 416, 833, 833, 833,}, +}; + +// +// Private methods +// + +inline void SoftwareSerial::tunedDelay(const uint32_t count) { + DELAY_US(count); +} + +// This function sets the current object as the "listening" +// one and returns true if it replaces another +bool SoftwareSerial::listen() { + if (!_rx_delay_stopbit) + return false; + + if (active_object != this) { + if (active_object) + active_object->stopListening(); + + _buffer_overflow = false; + _receive_buffer_head = _receive_buffer_tail = 0; + active_object = this; + + setRxIntMsk(true); + return true; + } + + return false; +} + +// Stop listening. Returns true if we were actually listening. +bool SoftwareSerial::stopListening() { + if (active_object == this) { + setRxIntMsk(false); + active_object = NULL; + return true; + } + return false; +} + +// +// The receive routine called by the interrupt handler +// +void SoftwareSerial::recv() { + uint8_t d = 0; + + // If RX line is high, then we don't see any start bit + // so interrupt is probably not for us + if (_inverse_logic ? rx_pin_read() : !rx_pin_read()) { + // Disable further interrupts during reception, this prevents + // triggering another interrupt directly after we return, which can + // cause problems at higher baudrates. + setRxIntMsk(false);//__disable_irq();// + + // Wait approximately 1/2 of a bit width to "center" the sample + tunedDelay(_rx_delay_centering); + // Read each of the 8 bits + for (uint8_t i=8; i > 0; --i) { + tunedDelay(_rx_delay_intrabit); + d >>= 1; + if (rx_pin_read()) d |= 0x80; + } + + if (_inverse_logic) d = ~d; + + // if buffer full, set the overflow flag and return + uint8_t next = (_receive_buffer_tail + 1) % _SS_MAX_RX_BUFF; + if (next != _receive_buffer_head) { + // save new data in buffer: tail points to where byte goes + _receive_buffer[_receive_buffer_tail] = d; // save new byte + _receive_buffer_tail = next; + } + else { + _buffer_overflow = true; + } + tunedDelay(_rx_delay_stopbit); + // Re-enable interrupts when we're sure to be inside the stop bit + setRxIntMsk(true); //__enable_irq();// + } +} + +uint32_t SoftwareSerial::rx_pin_read() { + return digitalRead(_receivePin); +} + +// +// Interrupt handling +// + +/* static */ +inline void SoftwareSerial::handle_interrupt() { + if (active_object) + active_object->recv(); +} +extern "C" void intWrapper() { + SoftwareSerial::handle_interrupt(); +} +// +// Constructor +// +SoftwareSerial::SoftwareSerial(pin_t receivePin, pin_t transmitPin, bool inverse_logic /* = false */) : + _rx_delay_centering(0), + _rx_delay_intrabit(0), + _rx_delay_stopbit(0), + _tx_delay(0), + _buffer_overflow(false), + _inverse_logic(inverse_logic) { + setTX(transmitPin); + setRX(receivePin); +} + +// +// Destructor +// +SoftwareSerial::~SoftwareSerial() { + end(); +} + +void SoftwareSerial::setTX(pin_t tx) { + // First write, then set output. If we do this the other way around, + // the pin would be output low for a short while before switching to + // output hihg. Now, it is input with pullup for a short while, which + // is fine. With inverse logic, either order is fine. + + digitalWrite(tx, _inverse_logic ? LOW : HIGH); + pinMode(tx,OUTPUT); + _transmitPin = tx; +} + +void SoftwareSerial::setRX(pin_t rx) { + pinMode(rx, INPUT_PULLUP); // pullup for normal logic! + //if (!_inverse_logic) + // digitalWrite(rx, HIGH); + _receivePin = rx; + _receivePort = LPC1768_PIN_PORT(rx); + _receivePortPin = LPC1768_PIN_PIN(rx); + /* GPIO_T * rxPort = digitalPinToPort(rx); + _receivePortRegister = portInputRegister(rxPort); + _receiveBitMask = digitalPinToBitMask(rx);*/ +} + +// +// Public methods +// + +void SoftwareSerial::begin(long speed) { + _rx_delay_centering = _rx_delay_intrabit = _rx_delay_stopbit = _tx_delay = 0; + + for(uint8_t i = 0; i < sizeof(table)/sizeof(table[0]); ++i) { + long baud = table[i].baud; + if (baud == speed) { + _rx_delay_centering = table[i].rx_delay_centering; + _rx_delay_intrabit = table[i].rx_delay_intrabit; + _rx_delay_stopbit = table[i].rx_delay_stopbit; + _tx_delay = table[i].tx_delay; + break; + } + } + + attachInterrupt(_receivePin, intWrapper, CHANGE); //this->handle_interrupt, CHANGE); + + listen(); + tunedDelay(_tx_delay); + +} + +void SoftwareSerial::setRxIntMsk(bool enable) { + if (enable) + GpioEnableInt(_receivePort,_receivePin,CHANGE); + else + GpioDisableInt(_receivePort,_receivePin); +} + +void SoftwareSerial::end() { + stopListening(); +} + + +// Read data from buffer +int16_t SoftwareSerial::read() { + if (!isListening()) return -1; + + // Empty buffer? + if (_receive_buffer_head == _receive_buffer_tail) return -1; + + // Read from "head" + uint8_t d = _receive_buffer[_receive_buffer_head]; // grab next byte + _receive_buffer_head = (_receive_buffer_head + 1) % _SS_MAX_RX_BUFF; + return d; +} + +size_t SoftwareSerial::available() { + if (!isListening()) return 0; + + return (_receive_buffer_tail + _SS_MAX_RX_BUFF - _receive_buffer_head) % _SS_MAX_RX_BUFF; +} + +size_t SoftwareSerial::write(uint8_t b) { + // By declaring these as local variables, the compiler will put them + // in registers _before_ disabling interrupts and entering the + // critical timing sections below, which makes it a lot easier to + // verify the cycle timings + + bool inv = _inverse_logic; + uint16_t delay = _tx_delay; + + if (inv) b = ~b; + + cli(); // turn off interrupts for a clean txmit + + // Write the start bit + digitalWrite(_transmitPin, !!inv); + + tunedDelay(delay); + + // Write each of the 8 bits + for (uint8_t i = 8; i > 0; --i) { + digitalWrite(_transmitPin, b & 1); // send 1 //(GPIO_Desc[_transmitPin].P)->DOUT |= GPIO_Desc[_transmitPin].bit; + // send 0 //(GPIO_Desc[_transmitPin].P)->DOUT &= ~GPIO_Desc[_transmitPin].bit; + tunedDelay(delay); + b >>= 1; + } + + // restore pin to natural state + digitalWrite(_transmitPin, !inv); + + sei(); // turn interrupts back on + tunedDelay(delay); + + return 1; +} + +void SoftwareSerial::flush() { + if (!isListening()) return; + + cli(); + _receive_buffer_head = _receive_buffer_tail = 0; + sei(); +} + +int16_t SoftwareSerial::peek() { + if (!isListening()) + return -1; + + // Empty buffer? + if (_receive_buffer_head == _receive_buffer_tail) + return -1; + + // Read from "head" + return _receive_buffer[_receive_buffer_head]; +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/include/SoftwareSerial.h b/Marlin/src/HAL/HAL_LPC1768/include/SoftwareSerial.h new file mode 100644 index 0000000000..f208e14b05 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/SoftwareSerial.h @@ -0,0 +1,120 @@ +/* + * SoftwareSerial.h (formerly NewSoftSerial.h) + * + * Multi-instance software serial library for Arduino/Wiring + * -- Interrupt-driven receive and other improvements by ladyada + * (http://ladyada.net) + * -- Tuning, circular buffer, derivation from class Print/Stream, + * multi-instance support, porting to 8MHz processors, + * various optimizations, PROGMEM delay tables, inverse logic and + * direct port writing by Mikal Hart (http://www.arduiniana.org) + * -- Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com) + * -- 20MHz processor support by Garrett Mace (http://www.macetech.com) + * -- ATmega1280/2560 support by Brett Hagman (http://www.roguerobotics.com/) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * The latest version of this library can always be found at + * http://arduiniana.org. + */ + +#ifndef SOFTWARESERIAL_H +#define SOFTWARESERIAL_H + +#include +#include +//#include "serial.h" +#include +#include + +/****************************************************************************** +* Definitions +******************************************************************************/ + +#define _SS_MAX_RX_BUFF 64 // RX buffer size + +class SoftwareSerial : public Stream +{ +private: + // per object data + pin_t _receivePin; + pin_t _transmitPin; +// uint32_t _receiveBitMask; // for rx interrupts + uint32_t _receivePort; + uint32_t _receivePortPin; + + + // Expressed as 4-cycle delays (must never be 0!) + uint16_t _rx_delay_centering; + uint16_t _rx_delay_intrabit; + uint16_t _rx_delay_stopbit; + uint16_t _tx_delay; + + uint16_t _buffer_overflow:1; + uint16_t _inverse_logic:1; + + // static data + static unsigned char _receive_buffer[_SS_MAX_RX_BUFF]; + static volatile uint8_t _receive_buffer_tail; + static volatile uint8_t _receive_buffer_head; + static SoftwareSerial *active_object; + + // private methods + void recv(); + uint32_t rx_pin_read(); + void tx_pin_write(uint8_t pin_state); + void setTX(pin_t transmitPin); + void setRX(pin_t receivePin); + void setRxIntMsk(bool enable); + + // private static method for timing + static inline void tunedDelay(uint32_t delay); + +public: + // public methods + + SoftwareSerial(pin_t receivePin, pin_t transmitPin, bool inverse_logic = false); + ~SoftwareSerial(); + void begin(long speed); + bool listen(); + void end(); + bool isListening() { return this == active_object; } + bool stopListening(); + bool overflow() { bool ret = _buffer_overflow; if (ret) _buffer_overflow = false; return ret; } + int16_t peek(); + + virtual size_t write(uint8_t byte); + virtual int16_t read(); + virtual size_t available(); + virtual void flush(); + operator bool() { return true; } + + using Print::write; + //using HalSerial::write; + + // public only for easy access by interrupt handlers + static inline void handle_interrupt() __attribute__((__always_inline__)); +}; + +// Arduino 0012 workaround +#undef int +#undef char +#undef long +#undef byte +#undef float +#undef abs +#undef round + +#endif // SOFTWARESERIAL_H diff --git a/Marlin/src/HAL/HAL_LPC1768/include/Wire.cpp b/Marlin/src/HAL/HAL_LPC1768/include/Wire.cpp new file mode 100644 index 0000000000..28e1fa9b56 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/Wire.cpp @@ -0,0 +1,219 @@ +/* + TwoWire.cpp - TWI/I2C library for Wiring & Arduino + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifdef TARGET_LPC1768 + +extern "C" { + #include + #include + #include + #include + #include + #include +} + +#include + +#define USEDI2CDEV_M 1 + +#if (USEDI2CDEV_M == 0) + #define I2CDEV_M LPC_I2C0 +#elif (USEDI2CDEV_M == 1) + #define I2CDEV_M LPC_I2C1 +#elif (USEDI2CDEV_M == 2) + #define I2CDEV_M LPC_I2C2 +#else + #error "Master I2C device not defined!" +#endif + +// Initialize Class Variables ////////////////////////////////////////////////// + +uint8_t TwoWire::rxBuffer[BUFFER_LENGTH]; +uint8_t TwoWire::rxBufferIndex = 0; +uint8_t TwoWire::rxBufferLength = 0; + +uint8_t TwoWire::txAddress = 0; +uint8_t TwoWire::txBuffer[BUFFER_LENGTH]; +uint8_t TwoWire::txBufferIndex = 0; +uint8_t TwoWire::txBufferLength = 0; + +uint8_t TwoWire::transmitting = 0; + +// Constructors //////////////////////////////////////////////////////////////// + +TwoWire::TwoWire() { +} + +// Public Methods ////////////////////////////////////////////////////////////// + +void TwoWire::begin(void) { + rxBufferIndex = 0; + rxBufferLength = 0; + + txBufferIndex = 0; + txBufferLength = 0; + + /* + * Init I2C pin connect + */ + PINSEL_CFG_Type PinCfg; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + + #if USEDI2CDEV_M == 0 + PinCfg.Funcnum = 1; + PinCfg.Pinnum = 27; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA0 / D57 AUX-1 + PinCfg.Pinnum = 28; + PINSEL_ConfigPin(&PinCfg); // SCL0 / D58 AUX-1 + #endif + + #if USEDI2CDEV_M == 1 + PinCfg.Funcnum = 3; + PinCfg.Pinnum = 0; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA1 / D20 SCA + PinCfg.Pinnum = 1; + PINSEL_ConfigPin(&PinCfg); // SCL1 / D21 SCL + #endif + + #if USEDI2CDEV_M == 2 + PinCfg.Funcnum = 2; + PinCfg.Pinnum = 10; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA2 / D38 X_ENABLE_PIN + PinCfg.Pinnum = 11; + PINSEL_ConfigPin(&PinCfg); // SCL2 / D55 X_DIR_PIN + #endif + + // Initialize I2C peripheral + I2C_Init(I2CDEV_M, 100000); + + // Enable Master I2C operation + I2C_Cmd(I2CDEV_M, I2C_MASTER_MODE, ENABLE); +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) { + // clamp to buffer length + if (quantity > BUFFER_LENGTH) + quantity = BUFFER_LENGTH; + + // perform blocking read into buffer + I2C_M_SETUP_Type transferMCfg; + transferMCfg.sl_addr7bit = address >> 1; // not sure about the right shift + transferMCfg.tx_data = NULL; + transferMCfg.tx_length = 0; + transferMCfg.rx_data = rxBuffer; + transferMCfg.rx_length = quantity; + transferMCfg.retransmissions_max = 3; + I2C_MasterTransferData(I2CDEV_M, &transferMCfg, I2C_TRANSFER_POLLING); + + // set rx buffer iterator vars + rxBufferIndex = 0; + rxBufferLength = transferMCfg.rx_count; + + return transferMCfg.rx_count; +} + +uint8_t TwoWire::requestFrom(int address, int quantity) { + return requestFrom((uint8_t)address, (uint8_t)quantity); +} + +void TwoWire::beginTransmission(uint8_t address) { + // indicate that we are transmitting + transmitting = 1; + // set address of targeted slave + txAddress = address; + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; +} + +void TwoWire::beginTransmission(int address) { + beginTransmission((uint8_t)address); +} + +uint8_t TwoWire::endTransmission(void) { + // transmit buffer (blocking) + I2C_M_SETUP_Type transferMCfg; + transferMCfg.sl_addr7bit = txAddress >> 1; // not sure about the right shift + transferMCfg.tx_data = txBuffer; + transferMCfg.tx_length = txBufferLength; + transferMCfg.rx_data = NULL; + transferMCfg.rx_length = 0; + transferMCfg.retransmissions_max = 3; + Status status = I2C_MasterTransferData(I2CDEV_M, &transferMCfg, I2C_TRANSFER_POLLING); + + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; + + // indicate that we are done transmitting + transmitting = 0; + + return status == SUCCESS ? 0 : 4; +} + +// must be called after beginTransmission(address) +size_t TwoWire::write(uint8_t data) { + if (transmitting) { + // don't bother if buffer is full + if (txBufferLength >= BUFFER_LENGTH) return 0; + + // put byte in tx buffer + txBuffer[txBufferIndex++] = data; + + // update amount in buffer + txBufferLength = txBufferIndex; + } + + return 1; +} + +// must be called after beginTransmission(address) +size_t TwoWire::write(const uint8_t *data, size_t quantity) { + size_t sent = 0; + if (transmitting) + for (sent = 0; sent < quantity; ++sent) + if (!write(data[sent])) break; + + return sent; +} + +// Must be called after requestFrom(address, numBytes) +int TwoWire::available(void) { + return rxBufferLength - rxBufferIndex; +} + +// Must be called after requestFrom(address, numBytes) +int TwoWire::read(void) { + return rxBufferIndex < rxBufferLength ? rxBuffer[rxBufferIndex++] : -1; +} + +// Must be called after requestFrom(address, numBytes) +int TwoWire::peek(void) { + return rxBufferIndex < rxBufferLength ? rxBuffer[rxBufferIndex] : -1; +} + +// Preinstantiate Objects ////////////////////////////////////////////////////// + +TwoWire Wire = TwoWire(); + +#endif // TARGET_LPC1768 \ No newline at end of file diff --git a/Marlin/src/HAL/HAL_LPC1768/include/Wire.h b/Marlin/src/HAL/HAL_LPC1768/include/Wire.h new file mode 100644 index 0000000000..b833d699e4 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/Wire.h @@ -0,0 +1,67 @@ +/** + * TwoWire.h - TWI/I2C library for Arduino & Wiring + * Copyright (c) 2006 Nicholas Zambetti. All right reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts + */ + +#ifndef _TWOWIRE_H_ +#define _TWOWIRE_H_ + +#include + +#define BUFFER_LENGTH 32 + +class TwoWire { + private: + static uint8_t rxBuffer[]; + static uint8_t rxBufferIndex; + static uint8_t rxBufferLength; + + static uint8_t txAddress; + static uint8_t txBuffer[]; + static uint8_t txBufferIndex; + static uint8_t txBufferLength; + + static uint8_t transmitting; + + public: + TwoWire(); + void begin(); + void beginTransmission(uint8_t); + void beginTransmission(int); + uint8_t endTransmission(void); + uint8_t endTransmission(uint8_t); + + uint8_t requestFrom(uint8_t, uint8_t); + uint8_t requestFrom(int, int); + + virtual size_t write(uint8_t); + virtual size_t write(const uint8_t *, size_t); + virtual int available(void); + virtual int read(void); + virtual int peek(void); + + inline size_t write(unsigned long n) { return write((uint8_t)n); } + inline size_t write(long n) { return write((uint8_t)n); } + inline size_t write(unsigned int n) { return write((uint8_t)n); } + inline size_t write(int n) { return write((uint8_t)n); } +}; + +extern TwoWire Wire; + +#endif // _TWOWIRE_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.c b/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.c new file mode 100644 index 0000000000..6c46c89b0c --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.c @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// adapted from I2C/master/master.c example +// https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html + +#ifdef TARGET_LPC1768 + +#include "../../../inc/MarlinConfigPre.h" + +#if MB(MKS_SBASE) + +#include "digipot_mcp4451_I2C_routines.h" + +#ifdef __cplusplus + extern "C" { +#endif + +// These two routines are exact copies of the lpc17xx_i2c.c routines. Couldn't link to +// to the lpc17xx_i2c.c routines so had to copy them into this file & rename them. + +static uint32_t _I2C_Start(LPC_I2C_TypeDef *I2Cx) { + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + + // Enter to Master Transmitter mode + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + // Wait for complete + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +static void _I2C_Stop(LPC_I2C_TypeDef *I2Cx) { + // Make sure start bit is not active + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + + I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; +} + +PINSEL_CFG_Type PinCfg; +I2C_M_SETUP_Type transferMCfg; + +#define I2C_status (LPC_I2C1->I2STAT & I2C_STAT_CODE_BITMASK) + +uint8_t digipot_mcp4451_start(uint8_t sla) { // send slave address and write bit + // Sometimes TX data ACK or NAK status is returned. That mean the start state didn't + // happen which means only the value of the slave address was send. Keep looping until + // the slave address and write bit are actually sent. + do { + _I2C_Stop(I2CDEV_M); // output stop state on I2C bus + _I2C_Start(I2CDEV_M); // output start state on I2C bus + while ((I2C_status != I2C_I2STAT_M_TX_START) + && (I2C_status != I2C_I2STAT_M_TX_RESTART) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for start to be asserted + + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_STAC; // clear start state before tansmitting slave address + LPC_I2C1->I2DAT = (sla << 1) & I2C_I2DAT_BITMASK; // transmit slave address & write bit + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + while ((I2C_status != I2C_I2STAT_M_TX_SLAW_ACK) + && (I2C_status != I2C_I2STAT_M_TX_SLAW_NACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)) { /* wait for slaw to finish */ } + } while ( (I2C_status == I2C_I2STAT_M_TX_DAT_ACK) || (I2C_status == I2C_I2STAT_M_TX_DAT_NACK)); + return 1; +} + +void digipot_mcp4451_init(void) { + /** + * Init I2C pin connect + */ + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + #if USEDI2CDEV_M == 0 + PinCfg.Funcnum = 1; + PinCfg.Pinnum = 27; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA0 / D57 AUX-1 + PinCfg.Pinnum = 28; + PINSEL_ConfigPin(&PinCfg); // SCL0 / D58 AUX-1 + #elif USEDI2CDEV_M == 1 + PinCfg.Funcnum = 3; + PinCfg.Pinnum = 0; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA1 / D20 SCA + PinCfg.Pinnum = 1; + PINSEL_ConfigPin(&PinCfg); // SCL1 / D21 SCL + #elif USEDI2CDEV_M == 2 + PinCfg.Funcnum = 2; + PinCfg.Pinnum = 10; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA2 / D38 X_ENABLE_PIN + PinCfg.Pinnum = 11; + PINSEL_ConfigPin(&PinCfg); // SCL2 / D55 X_DIR_PIN + #endif + // Initialize I2C peripheral + I2C_Init(I2CDEV_M, 400000); // hardwired to 400KHz bit rate, 100KHz is the other option + + // Enable Master I2C operation + I2C_Cmd(I2CDEV_M, I2C_MASTER_MODE, ENABLE); +} + +uint8_t digipot_mcp4451_send_byte(uint8_t data) { + LPC_I2C1->I2DAT = data & I2C_I2DAT_BITMASK; // transmit data + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + while (I2C_status != I2C_I2STAT_M_TX_DAT_ACK && I2C_status != I2C_I2STAT_M_TX_DAT_NACK); // wait for xmit to finish + return 1; +} + +#ifdef __cplusplus + } +#endif + +#endif // MB(MKS_SBASE) +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.h b/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.h new file mode 100644 index 0000000000..e44e155a40 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/digipot_mcp4451_I2C_routines.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// adapted from I2C/master/master.c example +// https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html + +#ifndef _DIGIPOT_MCP4451_I2C_ROUTINES_H_ +#define _DIGIPOT_MCP4451_I2C_ROUTINES_H_ + +#define USEDI2CDEV_M 1 // use I2C1 controller + +#if USEDI2CDEV_M == 0 + #define I2CDEV_M LPC_I2C0 +#elif USEDI2CDEV_M == 1 + #define I2CDEV_M LPC_I2C1 +#elif USEDI2CDEV_M == 2 + #define I2CDEV_M LPC_I2C2 +#else + #error "Master I2C device not defined!" +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#include +#include +#include + +uint8_t digipot_mcp4451_start(uint8_t sla); +void digipot_mcp4451_init(void); +uint8_t digipot_mcp4451_send_byte(uint8_t data); + +#ifdef __cplusplus + } +#endif + +#endif // _DIGIPOT_MCP4451_I2C_ROUTINES_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.cpp b/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.cpp new file mode 100644 index 0000000000..f05fa00ace --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.cpp @@ -0,0 +1,74 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef TARGET_LPC1768 + +#include + +#include "../../../gcode/parser.h" + +// Get the digital pin for an analog index +pin_t analogInputToDigitalPin(const int8_t p) { + return (WITHIN(p, 0, NUM_ANALOG_INPUTS) ? adc_pin_table[p] : P_NC); +} + +// Return the index of a pin number +// The pin number given here is in the form ppp:nnnnn +int16_t GET_PIN_MAP_INDEX(const pin_t pin) { + const uint16_t index = (LPC1768_PIN_PORT(pin) << 5) | LPC1768_PIN_PIN(pin); + return (index < NUM_DIGITAL_PINS && pin_map[index] != P_NC) ? index : -1; +} + +// Test whether the pin is valid +bool VALID_PIN(const pin_t p) { + const int16_t ind = GET_PIN_MAP_INDEX(p); + return ind >= 0 && pin_map[ind] >= 0; +} + +// Get the analog index for a digital pin +int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t p) { + return (VALID_PIN(p) ? LPC1768_PIN_ADC(p) : -1); +} + +// Test whether the pin is PWM +bool PWM_PIN(const pin_t p) { + return VALID_PIN(p) && LPC1768_PIN_PWM(p); +} + +// Test whether the pin is interruptable +bool INTERRUPT_PIN(const pin_t p) { + return VALID_PIN(p) && LPC1768_PIN_INTERRUPT(p); +} + +// Get the pin number at the given index +pin_t GET_PIN_MAP_PIN(const int16_t ind) { + return WITHIN(ind, 0, NUM_DIGITAL_PINS - 1) ? pin_map[ind] : P_NC; +} + +int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { + const uint16_t val = (uint16_t)parser.intval(code), port = val / 100, pin = val % 100; + const int16_t ind = (port < (NUM_DIGITAL_PINS >> 5) && (pin < 32)) + ? GET_PIN_MAP_INDEX(port << 5 | pin) : -2; + return ind > -2 ? ind : dval; +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.h b/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.h new file mode 100644 index 0000000000..de727b8bde --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/pinmapping.h @@ -0,0 +1,294 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _PINMAPPING_H_ +#define _PINMAPPING_H_ + +#include "../../../inc/MarlinConfigPre.h" + +#include + +typedef int16_t pin_t; + +#define PORT_0 000 +#define PORT_1 001 +#define PORT_2 010 +#define PORT_3 011 +#define PORT_4 100 + +#define PORT_(p) PORT_##p +#define PORT(p) PORT_(p) + +#define PIN_0 00000 +#define PIN_1 00001 +#define PIN_2 00010 +#define PIN_3 00011 +#define PIN_4 00100 +#define PIN_5 00101 +#define PIN_6 00110 +#define PIN_7 00111 +#define PIN_8 01000 +#define PIN_9 01001 +#define PIN_10 01010 +#define PIN_11 01011 +#define PIN_12 01100 +#define PIN_13 01101 +#define PIN_14 01110 +#define PIN_15 01111 +#define PIN_16 10000 +#define PIN_17 10001 +#define PIN_18 10010 +#define PIN_19 10011 +#define PIN_20 10100 +#define PIN_21 10101 +#define PIN_22 10110 +#define PIN_23 10111 +#define PIN_24 11000 +#define PIN_25 11001 +#define PIN_26 11010 +#define PIN_27 11011 +#define PIN_28 11100 +#define PIN_29 11101 +#define PIN_30 11110 +#define PIN_31 11111 + +#define PIN_(p) PIN_##p +#define PIN(p) PIN_(p) + +#define ADC_NONE 0000 +#define ADC_CHAN_0 0001 +#define ADC_CHAN_1 0010 +#define ADC_CHAN_2 0011 +#define ADC_CHAN_3 0100 +#define ADC_CHAN_4 0101 +#define ADC_CHAN_5 0110 +#define ADC_CHAN_6 0111 +#define ADC_CHAN_7 1000 + +#define ADC_CHAN_(c) ADC_CHAN_##c +#define ADC_CHAN(p) ADC_CHAN_(p) + +#define BOOL_0 0 +#define BOOL_1 1 +#define BOOL_(b) BOOL_##b + +#define INTERRUPT(b) BOOL_(b) +#define PWM(b) BOOL_(b) + +// Combine elements into pin bits: 0b00AAAAWIPPPNNNNN +#define LPC1768_PIN_(port, pin, int, pwm, adc) 0b00##adc##pwm##int##port##pin +#define LPC1768_PIN(port, pin, int, pwm, adc) LPC1768_PIN_(port, pin, int, pwm, adc) + +constexpr uint8_t LPC1768_PIN_PORT(const pin_t pin) { return ((uint8_t)((pin >> 5) & 0b111)); } +constexpr uint8_t LPC1768_PIN_PIN(const pin_t pin) { return ((uint8_t)(pin & 0b11111)); } +constexpr bool LPC1768_PIN_INTERRUPT(const pin_t pin) { return (((pin >> 8) & 0b1) != 0); } +constexpr bool LPC1768_PIN_PWM(const pin_t pin) { return (((pin >> 9) & 0b1) != 0); } +constexpr int8_t LPC1768_PIN_ADC(const pin_t pin) { return (int8_t)((pin >> 10) & 0b1111) - 1; } + +// ****************** +// Runtime pinmapping +// ****************** +#define P_NC -1 + +#if SERIAL_PORT != 3 && SERIAL_PORT_2 != 3 + #define P0_00 LPC1768_PIN(PORT(0), PIN( 0), INTERRUPT(1), PWM(0), ADC_NONE) + #define P0_01 LPC1768_PIN(PORT(0), PIN( 1), INTERRUPT(1), PWM(0), ADC_NONE) +#endif +#if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + #define P0_02 LPC1768_PIN(PORT(0), PIN( 2), INTERRUPT(1), PWM(0), ADC_CHAN(7)) + #define P0_03 LPC1768_PIN(PORT(0), PIN( 3), INTERRUPT(1), PWM(0), ADC_CHAN(6)) +#endif +#define P0_04 LPC1768_PIN(PORT(0), PIN( 4), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_05 LPC1768_PIN(PORT(0), PIN( 5), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_06 LPC1768_PIN(PORT(0), PIN( 6), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_07 LPC1768_PIN(PORT(0), PIN( 7), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_08 LPC1768_PIN(PORT(0), PIN( 8), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_09 LPC1768_PIN(PORT(0), PIN( 9), INTERRUPT(1), PWM(0), ADC_NONE) +#if SERIAL_PORT != 2 && SERIAL_PORT_2 != 2 + #define P0_10 LPC1768_PIN(PORT(0), PIN(10), INTERRUPT(1), PWM(0), ADC_NONE) + #define P0_11 LPC1768_PIN(PORT(0), PIN(11), INTERRUPT(1), PWM(0), ADC_NONE) +#endif +#if SERIAL_PORT != 1 && SERIAL_PORT_2 != 1 + #define P0_15 LPC1768_PIN(PORT(0), PIN(15), INTERRUPT(1), PWM(0), ADC_NONE) + #define P0_16 LPC1768_PIN(PORT(0), PIN(16), INTERRUPT(1), PWM(0), ADC_NONE) +#endif +#define P0_17 LPC1768_PIN(PORT(0), PIN(17), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_18 LPC1768_PIN(PORT(0), PIN(18), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_19 LPC1768_PIN(PORT(0), PIN(19), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_20 LPC1768_PIN(PORT(0), PIN(20), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_21 LPC1768_PIN(PORT(0), PIN(21), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_22 LPC1768_PIN(PORT(0), PIN(22), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_23 LPC1768_PIN(PORT(0), PIN(23), INTERRUPT(1), PWM(0), ADC_CHAN(0)) +#define P0_24 LPC1768_PIN(PORT(0), PIN(24), INTERRUPT(1), PWM(0), ADC_CHAN(1)) +#define P0_25 LPC1768_PIN(PORT(0), PIN(25), INTERRUPT(1), PWM(0), ADC_CHAN(2)) +#define P0_26 LPC1768_PIN(PORT(0), PIN(26), INTERRUPT(1), PWM(0), ADC_CHAN(3)) +#define P0_27 LPC1768_PIN(PORT(0), PIN(27), INTERRUPT(1), PWM(0), ADC_NONE) +#define P0_28 LPC1768_PIN(PORT(0), PIN(28), INTERRUPT(1), PWM(0), ADC_NONE) +#if SERIAL_PORT != -1 && SERIAL_PORT_2 != -1 + #define P0_29 LPC1768_PIN(PORT(0), PIN(29), INTERRUPT(1), PWM(0), ADC_NONE) + #define P0_30 LPC1768_PIN(PORT(0), PIN(30), INTERRUPT(1), PWM(0), ADC_NONE) +#endif +#define P1_00 LPC1768_PIN(PORT(1), PIN( 0), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_01 LPC1768_PIN(PORT(1), PIN( 1), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_04 LPC1768_PIN(PORT(1), PIN( 4), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_08 LPC1768_PIN(PORT(1), PIN( 8), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_09 LPC1768_PIN(PORT(1), PIN( 9), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_10 LPC1768_PIN(PORT(1), PIN(10), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_14 LPC1768_PIN(PORT(1), PIN(14), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_15 LPC1768_PIN(PORT(1), PIN(15), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_16 LPC1768_PIN(PORT(1), PIN(16), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_17 LPC1768_PIN(PORT(1), PIN(17), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_18 LPC1768_PIN(PORT(1), PIN(18), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_19 LPC1768_PIN(PORT(1), PIN(19), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_20 LPC1768_PIN(PORT(1), PIN(20), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_21 LPC1768_PIN(PORT(1), PIN(21), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_22 LPC1768_PIN(PORT(1), PIN(22), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_23 LPC1768_PIN(PORT(1), PIN(23), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_24 LPC1768_PIN(PORT(1), PIN(24), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_25 LPC1768_PIN(PORT(1), PIN(25), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_26 LPC1768_PIN(PORT(1), PIN(26), INTERRUPT(0), PWM(1), ADC_NONE) +#define P1_27 LPC1768_PIN(PORT(1), PIN(27), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_28 LPC1768_PIN(PORT(1), PIN(28), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_29 LPC1768_PIN(PORT(1), PIN(29), INTERRUPT(0), PWM(0), ADC_NONE) +#define P1_30 LPC1768_PIN(PORT(1), PIN(30), INTERRUPT(0), PWM(0), ADC_CHAN(4)) +#define P1_31 LPC1768_PIN(PORT(1), PIN(31), INTERRUPT(0), PWM(0), ADC_CHAN(5)) +#define P2_00 LPC1768_PIN(PORT(2), PIN( 0), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_01 LPC1768_PIN(PORT(2), PIN( 1), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_02 LPC1768_PIN(PORT(2), PIN( 2), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_03 LPC1768_PIN(PORT(2), PIN( 3), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_04 LPC1768_PIN(PORT(2), PIN( 4), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_05 LPC1768_PIN(PORT(2), PIN( 5), INTERRUPT(1), PWM(1), ADC_NONE) +#define P2_06 LPC1768_PIN(PORT(2), PIN( 6), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_07 LPC1768_PIN(PORT(2), PIN( 7), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_08 LPC1768_PIN(PORT(2), PIN( 8), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_09 LPC1768_PIN(PORT(2), PIN( 9), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_10 LPC1768_PIN(PORT(2), PIN(10), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_11 LPC1768_PIN(PORT(2), PIN(11), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_12 LPC1768_PIN(PORT(2), PIN(12), INTERRUPT(1), PWM(0), ADC_NONE) +#define P2_13 LPC1768_PIN(PORT(2), PIN(13), INTERRUPT(1), PWM(0), ADC_NONE) +#define P3_25 LPC1768_PIN(PORT(3), PIN(25), INTERRUPT(0), PWM(1), ADC_NONE) +#define P3_26 LPC1768_PIN(PORT(3), PIN(26), INTERRUPT(0), PWM(1), ADC_NONE) +#define P4_28 LPC1768_PIN(PORT(4), PIN(28), INTERRUPT(0), PWM(0), ADC_NONE) +#define P4_29 LPC1768_PIN(PORT(4), PIN(29), INTERRUPT(0), PWM(0), ADC_NONE) + +// Pin index for M43 and M226 +constexpr pin_t pin_map[] = { + #if SERIAL_PORT != 3 && SERIAL_PORT_2 != 3 + P0_00, P0_01, + #else + P_NC, P_NC, + #endif + #if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + P0_02, P0_03, + #else + P_NC, P_NC, + #endif + P0_04, P0_05, P0_06, P0_07, + P0_08, P0_09, + #if SERIAL_PORT != 2 && SERIAL_PORT_2 != 2 + P0_10, P0_11, + #else + P_NC, P_NC, + #endif + P_NC, P_NC, P_NC, + #if SERIAL_PORT != 1 && SERIAL_PORT_2 != 1 + P0_15, + P0_16, + #else + P_NC, + P_NC, + #endif + P0_17, P0_18, P0_19, P0_20, P0_21, P0_22, P0_23, + P0_24, P0_25, P0_26, P0_27, P0_28, + #if SERIAL_PORT != -1 && SERIAL_PORT_2 != -1 + P0_29, P0_30, + #else + P_NC, P_NC, + #endif + P_NC, + + P1_00, P1_01, P_NC, P_NC, P1_04, P_NC, P_NC, P_NC, + P1_08, P1_09, P1_10, P_NC, P_NC, P_NC, P1_14, P1_15, + P1_16, P1_17, P1_18, P1_19, P1_20, P1_21, P1_22, P1_23, + P1_24, P1_25, P1_26, P1_27, P1_28, P1_29, P1_30, P1_31, + + P2_00, P2_01, P2_02, P2_03, P2_04, P2_05, P2_06, P2_07, + P2_08, P2_09, P2_10, P2_11, P2_12, P2_13, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P3_25, P3_26, P_NC, P_NC, P_NC, P_NC, P_NC, + + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, P_NC, + P_NC, P_NC, P_NC, P_NC, P4_28, P4_29, P_NC, P_NC +}; + +constexpr uint8_t NUM_DIGITAL_PINS = COUNT(pin_map); + +constexpr pin_t adc_pin_table[] = { + P0_23, P0_24, P0_25, P0_26, P1_30, P1_31, + #if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + P0_03, P0_02 + #endif +}; + +#if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + #define NUM_ANALOG_INPUTS 8 +#else + #define NUM_ANALOG_INPUTS 6 +#endif + +// P0.6 thru P0.9 are for the onboard SD card +#define HAL_SENSITIVE_PINS P0_06, P0_07, P0_08, P0_09 + +// Get the digital pin for an analog index +pin_t analogInputToDigitalPin(const int8_t p); +#define digitalPinToInterrupt(pin) (pin) +// Return the index of a pin number +// The pin number given here is in the form ppp:nnnnn +int16_t GET_PIN_MAP_INDEX(const pin_t pin); + +// Test whether the pin is valid +bool VALID_PIN(const pin_t p); + +// Get the analog index for a digital pin +int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t p); + +// Test whether the pin is PWM +bool PWM_PIN(const pin_t p); + +// Test whether the pin is interruptable +bool INTERRUPT_PIN(const pin_t p); +#define LPC1768_PIN_INTERRUPT_M(pin) (((pin >> 8) & 0b1) != 0) + +// Get the pin number at the given index +pin_t GET_PIN_MAP_PIN(const int16_t ind); + +// Parse a G-code word into a pin index +int16_t PARSED_PIN_INDEX(const char code, const int16_t dval); + +#endif // _PINMAPPING_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/include/serial.h b/Marlin/src/HAL/HAL_LPC1768/include/serial.h new file mode 100644 index 0000000000..3fe8a8cb1d --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/include/serial.h @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _HAL_SERIAL_H_ +#define _HAL_SERIAL_H_ + +#include "../../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../../feature/emergency_parser.h" +#endif + +#include +#include +#include + +/** + * Generic RingBuffer + * T type of the buffer array + * S size of the buffer (must be power of 2) + */ + +template class RingBuffer { +public: + RingBuffer() {index_read = index_write = 0;} + + uint32_t available() {return mask(index_write - index_read);} + uint32_t free() {return buffer_size - available();} + bool empty() {return index_read == index_write;} + bool full() {return next(index_write) == index_read;} + void clear() {index_read = index_write = 0;} + + bool peek(T *const value) { + if (value == nullptr || empty()) return false; + *value = buffer[index_read]; + return true; + } + + uint32_t read(T *const value) { + if (value == nullptr || empty()) return 0; + *value = buffer[index_read]; + index_read = next(index_read); + return 1; + } + + uint32_t write(T value) { + uint32_t next_head = next(index_write); + if (next_head == index_read) return 0; // buffer full + buffer[index_write] = value; + index_write = next_head; + return 1; + } + +private: + inline uint32_t mask(uint32_t val) { + return val & buffer_mask; + } + + inline uint32_t next(uint32_t val) { + return mask(val + 1); + } + + static const uint32_t buffer_size = S; + static const uint32_t buffer_mask = buffer_size - 1; + T buffer[buffer_size]; + volatile uint32_t index_write; + volatile uint32_t index_read; +}; + +/** + * Serial Interface Class + * Data is injected directly into, and consumed from, the fifo buffers + */ + +class HalSerial: public Print { +public: + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + #endif + + HalSerial() : host_connected(false) { } + virtual ~HalSerial() { } + + operator bool() { return host_connected; } + + void begin(int32_t baud) { } + + int16_t peek() { + uint8_t value; + return receive_buffer.peek(&value) ? value : -1; + } + + int16_t read() { + uint8_t value; + return receive_buffer.read(&value) ? value : -1; + } + + size_t write(const uint8_t c) { + if (!host_connected) return 0; // Do not fill buffer when host disconnected + while (transmit_buffer.write(c) == 0) { // Block until there is free room in buffer + if (!host_connected) return 0; // Break infinite loop on host disconect + } + return 1; + } + + size_t available() { + return (size_t)receive_buffer.available(); + } + + void flush() { + receive_buffer.clear(); + } + + uint8_t availableForWrite(void) { + return transmit_buffer.free() > 255 ? 255 : (uint8_t)transmit_buffer.free(); + } + + void flushTX(void) { + while (transmit_buffer.available() && host_connected) { /* nada */} + } + + size_t printf(const char *format, ...) { + static char buffer[256]; + va_list vArgs; + va_start(vArgs, format); + int length = vsnprintf((char *) buffer, 256, (char const *) format, vArgs); + va_end(vArgs); + size_t i = 0; + if (length > 0 && length < 256) { + while (i < (size_t)length && host_connected) { + i += transmit_buffer.write(buffer[i]); + } + } + return i; + } + + RingBuffer receive_buffer; + RingBuffer transmit_buffer; + volatile bool host_connected; +}; + +#endif // _HAL_SERIAL_H_ diff --git a/Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py b/Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py new file mode 100644 index 0000000000..44ded586fe --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/lpc1768_flag_script.py @@ -0,0 +1,60 @@ +from __future__ import print_function +import sys + +#dynamic build flags for generic compile options +if __name__ == "__main__": + args = " ".join([ "-std=gnu11", + "-std=gnu++11", + "-Os", + "-mcpu=cortex-m3", + "-mthumb", + + "-fsigned-char", + "-fno-move-loop-invariants", + "-fno-strict-aliasing", + "-fsingle-precision-constant", + + "--specs=nano.specs", + "--specs=nosys.specs", + + # For external libraries + "-IMarlin/src/HAL/HAL_LPC1768/include", + + # For MarlinFirmware/U8glib-HAL + "-IMarlin/src/HAL/HAL_LPC1768/u8g", + "-DU8G_HAL_LINKS", + + "-MMD", + "-MP", + "-DTARGET_LPC1768" + ]) + + for i in range(1, len(sys.argv)): + args += " " + sys.argv[i] + + print(args) + +# extra script for linker options +else: + from SCons.Script import DefaultEnvironment + env = DefaultEnvironment() + env.Append( + ARFLAGS=["rcs"], + + ASFLAGS=["-x", "assembler-with-cpp"], + + CXXFLAGS=[ + "-fabi-version=0", + "-fno-use-cxa-atexit", + "-fno-threadsafe-statics" + ], + LINKFLAGS=[ + "-Wl,-Tframeworks/CMSIS/LPC1768/system/LPC1768.ld,--gc-sections", + "-Os", + "-mcpu=cortex-m3", + "-mthumb", + "--specs=nano.specs", + "--specs=nosys.specs", + "-u_printf_float" + ], + ) diff --git a/Marlin/src/HAL/HAL_LPC1768/main.cpp b/Marlin/src/HAL/HAL_LPC1768/main.cpp new file mode 100644 index 0000000000..399120dac7 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/main.cpp @@ -0,0 +1,120 @@ +#ifdef TARGET_LPC1768 + +// --------------------- +// Userspace entry point +// --------------------- +extern void setup(); +extern void loop(); + +extern "C" { + #include +} + +#include +#include +#include +#include +#include +#include +#include + +extern "C" { + #include + #include + #include +} + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" +#include "fastio.h" +#include "HAL_timers.h" +#include +#include +#include +#include "serial.h" +#include "LPC1768_PWM.h" + +static __INLINE uint32_t SysTick_Config(uint32_t ticks) { + if (ticks > SysTick_LOAD_RELOAD_Msk) return 1; + + SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; // Set reload register + SysTick->VAL = 0; // Load the SysTick Counter Value + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; // Enable SysTick IRQ and SysTick Timer + + NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(0, 0, 0)); // Set Priority for Cortex-M3 System Interrupts + return 0; +} + +extern "C" { + extern int isLPC1769(); + extern void disk_timerproc(void); + volatile uint32_t _millis; + + void SysTick_Handler(void) { + ++_millis; + disk_timerproc(); + } + + // Runs after clock init and before global static constructors + void SystemPostInit() { + _millis = 0; // Initialize the millisecond counter value + SysTick_Config(SystemCoreClock / 1000); // Start millisecond global counter + + // Runs before setup() to configure LED_PIN and used to indicate successful bootloader execution + #if PIN_EXISTS(LED) + SET_DIR_OUTPUT(LED_PIN); + WRITE_PIN_CLR(LED_PIN); + + // MKS_SBASE has 3 other LEDs the bootloader uses during flashing. Clear them. + SET_DIR_OUTPUT(P1_19); + WRITE_PIN_CLR(P1_19); + SET_DIR_OUTPUT(P1_20); + WRITE_PIN_CLR(P1_20); + SET_DIR_OUTPUT(P1_21); + WRITE_PIN_CLR(P1_21); + + for (uint8_t i = 6; i--;) { + TOGGLE(LED_PIN); + delay(100); + } + #endif + } +} + +extern uint32_t MSC_SD_Init(uint8_t pdrv); + +int main(void) { + + (void)MSC_SD_Init(0); + + USB_Init(); // USB Initialization + USB_Connect(TRUE); // USB Connect + + const uint32_t usb_timeout = millis() + 2000; + while (!USB_Configuration && PENDING(millis(), usb_timeout)) { + delay(50); + #if PIN_EXISTS(LED) + TOGGLE(LED_PIN); // Flash quickly during USB initialization + #endif + } + + #if NUM_SERIAL > 0 + MYSERIAL0.begin(BAUDRATE); + #if NUM_SERIAL > 1 + MYSERIAL1.begin(BAUDRATE); + #endif + SERIAL_PRINTF("\n\necho:%s (%dMhz) Initialized\n", isLPC1769() ? "LPC1769" : "LPC1768", SystemCoreClock / 1000000); + SERIAL_FLUSHTX(); + #endif + + HAL_timer_init(); + + LPC1768_PWM_init(); + + setup(); + for (;;) loop(); +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/persistent_store_api.h b/Marlin/src/HAL/HAL_LPC1768/persistent_store_api.h new file mode 100644 index 0000000000..9f6d626491 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/persistent_store_api.h @@ -0,0 +1,24 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../shared/persistent_store_api.h" + +//#define FLASH_EEPROM diff --git a/Marlin/src/HAL/HAL_LPC1768/persistent_store_flash.cpp b/Marlin/src/HAL/HAL_LPC1768/persistent_store_flash.cpp new file mode 100644 index 0000000000..daffddf079 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/persistent_store_flash.cpp @@ -0,0 +1,138 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef TARGET_LPC1768 + +/** + * Emulate EEPROM storage using Flash Memory + * + * Use a single 32K flash sector to store EEPROM data. To reduce the + * number of erase operations a simple "levelling" scheme is used that + * maintains a number of EEPROM "slots" within the larger flash sector. + * Each slot is used in turn and the entire sector is only erased when all + * slots have been used. + * + * A simple RAM image is used to hold the EEPROM data during I/O operations + * and this is flushed to the next available slot when an update is complete. + * If RAM usage becomes an issue we could store this image in one of the two + * 16Kb I/O buffers (intended to hold DMA USB and Ethernet data, but currently + * unused). + */ +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "persistent_store_api.h" +#include "../../inc/MarlinConfig.h" + +#if ENABLED(FLASH_EEPROM) + +extern "C" { + #include "lpc17xx_iap.h" +} + +#define SECTOR_START(sector) ((sector < 16) ? (sector * 0x1000) : ((sector - 14) * 0x8000)) +#define EEPROM_SECTOR 29 +#define EEPROM_SIZE (4096) +#define SECTOR_SIZE (32768) +#define EEPROM_SLOTS (SECTOR_SIZE/EEPROM_SIZE) +#define EEPROM_ERASE (0xff) +#define SLOT_ADDRESS(sector, slot) (((uint8_t *)SECTOR_START(sector)) + slot * EEPROM_SIZE) + +static uint8_t ram_eeprom[EEPROM_SIZE]; +static bool eeprom_dirty = false; +static int current_slot = 0; + +bool PersistentStore::access_start() { + uint32_t first_nblank_loc, first_nblank_val; + IAP_STATUS_CODE status; + + // discover which slot we are currently using. + __disable_irq(); + status = BlankCheckSector(EEPROM_SECTOR, EEPROM_SECTOR, &first_nblank_loc, &first_nblank_val); + __enable_irq(); + SERIAL_PROTOCOLLNPAIR("Blank check status: ", status); + if (status == CMD_SUCCESS) { + // sector is blank so nothing stored yet + SERIAL_PROTOCOLLNPGM("FLASH empty"); + for (int i = 0; i < EEPROM_SIZE; i++) ram_eeprom[i] = EEPROM_ERASE; + current_slot = EEPROM_SLOTS; + } + else { + // current slot is the first non blank one + current_slot = first_nblank_loc / EEPROM_SIZE; + SERIAL_PROTOCOLLNPAIR("Flash slot: ", current_slot); + uint8_t *eeprom_data = SLOT_ADDRESS(EEPROM_SECTOR, current_slot); + SERIAL_PROTOCOLLNPAIR("Address: ", (int)eeprom_data); + + // load current settings + for (int i = 0; i < EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i]; + } + eeprom_dirty = false; + + return true; +} + +bool PersistentStore::access_finish() { + if (eeprom_dirty) { + IAP_STATUS_CODE status; + if (--current_slot < 0) { + // all slots have been used, erase everything and start again + __disable_irq(); + PrepareSector(EEPROM_SECTOR, EEPROM_SECTOR); + status = EraseSector(EEPROM_SECTOR, EEPROM_SECTOR); + __enable_irq(); + SERIAL_PROTOCOLLNPAIR("Erase status: ", status); + current_slot = EEPROM_SLOTS - 1; + } + SERIAL_PROTOCOLLNPAIR("Writing data to: ", current_slot); + __disable_irq(); + PrepareSector(EEPROM_SECTOR, EEPROM_SECTOR); + status = CopyRAM2Flash(SLOT_ADDRESS(EEPROM_SECTOR, current_slot), ram_eeprom, IAP_WRITE_4096); + __enable_irq(); + SERIAL_PROTOCOLLNPAIR("CopyRAM2Flash status: ", status); + if (status != CMD_SUCCESS) return false; + eeprom_dirty = false; + } + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + for (int i = 0; i < size; i++) ram_eeprom[pos + i] = value[i]; + eeprom_dirty = true; + crc16(crc, value, size); + pos += size; + return false; // return true for any error +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos]; + if (writing) for (int i = 0; i < size; i++) value[i] = ram_eeprom[pos + i]; + crc16(crc, buff, size); + pos += size; + return false; // return true for any error +} + +size_t PersistentStore::capacity() { return EEPROM_SIZE; } + +#endif // FLASH_EEPROM +#endif // EEPROM_SETTINGS +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/persistent_store_sdcard.cpp b/Marlin/src/HAL/HAL_LPC1768/persistent_store_sdcard.cpp new file mode 100644 index 0000000000..490f16e07b --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/persistent_store_sdcard.cpp @@ -0,0 +1,183 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../../inc/MarlinConfig.h" +#include "persistent_store_api.h" + +#if DISABLED(FLASH_EEPROM) + +#include +#include + +extern uint32_t MSC_Aquire_Lock(); +extern uint32_t MSC_Release_Lock(); + +FATFS fat_fs; +FIL eeprom_file; +bool eeprom_file_open = false; + +bool PersistentStore::access_start() { + const char eeprom_erase_value = 0xFF; + MSC_Aquire_Lock(); + if (f_mount(&fat_fs, "", 1)) { + MSC_Release_Lock(); + return false; + } + FRESULT res = f_open(&eeprom_file, "eeprom.dat", FA_OPEN_ALWAYS | FA_WRITE | FA_READ); + if (res) MSC_Release_Lock(); + + if (res == FR_OK) { + UINT bytes_written; + FSIZE_t file_size = f_size(&eeprom_file); + f_lseek(&eeprom_file, file_size); + while (file_size < capacity() && res == FR_OK) { + res = f_write(&eeprom_file, &eeprom_erase_value, 1, &bytes_written); + file_size++; + } + } + if (res == FR_OK) { + f_lseek(&eeprom_file, 0); + f_sync(&eeprom_file); + eeprom_file_open = true; + } + return res == FR_OK; +} + +bool PersistentStore::access_finish() { + f_close(&eeprom_file); + f_unmount(""); + MSC_Release_Lock(); + eeprom_file_open = false; + return true; +} + +// This extra chit-chat goes away soon, but is helpful for now +// to see errors that are happening in read_data / write_data +static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) { + const char * const rw_str = write ? PSTR("write") : PSTR("read"); + SERIAL_PROTOCOLCHAR(' '); + serialprintPGM(rw_str); + SERIAL_PROTOCOLPAIR("_data(", pos); + SERIAL_PROTOCOLPAIR(",", (int)value); + SERIAL_PROTOCOLPAIR(",", (int)size); + SERIAL_PROTOCOLLNPGM(", ...)"); + if (total) { + SERIAL_PROTOCOLPGM(" f_"); + serialprintPGM(rw_str); + SERIAL_PROTOCOLPAIR("()=", (int)s); + SERIAL_PROTOCOLPAIR("\n size=", size); + SERIAL_PROTOCOLPGM("\n bytes_"); + serialprintPGM(write ? PSTR("written=") : PSTR("read=")); + SERIAL_PROTOCOLLN(total); + } + else + SERIAL_PROTOCOLLNPAIR(" f_lseek()=", (int)s); +} + +// File function return codes for type FRESULT. This goes away soon, but +// is helpful right now to see any errors in read_data and write_data. +// +// typedef enum { +// FR_OK = 0, /* (0) Succeeded */ +// FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ +// FR_INT_ERR, /* (2) Assertion failed */ +// FR_NOT_READY, /* (3) The physical drive cannot work */ +// FR_NO_FILE, /* (4) Could not find the file */ +// FR_NO_PATH, /* (5) Could not find the path */ +// FR_INVALID_NAME, /* (6) The path name format is invalid */ +// FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ +// FR_EXIST, /* (8) Access denied due to prohibited access */ +// FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ +// FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ +// FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ +// FR_NOT_ENABLED, /* (12) The volume has no work area */ +// FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ +// FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ +// FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ +// FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ +// FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ +// FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ +// FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +// } FRESULT; + +bool PersistentStore::write_data(int &pos, const uint8_t *value, const size_t size, uint16_t *crc) { + if (!eeprom_file_open) return true; + FRESULT s; + UINT bytes_written = 0; + + s = f_lseek(&eeprom_file, pos); + if (s) { + debug_rw(true, pos, value, size, s); + return s; + } + + s = f_write(&eeprom_file, (void*)value, size, &bytes_written); + if (s) { + debug_rw(true, pos, value, size, s, bytes_written); + return s; + } + crc16(crc, value, size); + pos += size; + return bytes_written != size; // return true for any error +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { + if (!eeprom_file_open) return true; + UINT bytes_read = 0; + FRESULT s; + s = f_lseek(&eeprom_file, pos); + + if (s) { + debug_rw(false, pos, value, size, s); + return true; + } + + if (writing) { + s = f_read(&eeprom_file, (void*)value, size, &bytes_read); + crc16(crc, value, size); + } + else { + uint8_t temp[size]; + s = f_read(&eeprom_file, (void*)temp, size, &bytes_read); + crc16(crc, temp, size); + } + + if (s) { + debug_rw(false, pos, value, size, s, bytes_read); + return true; + } + + pos += size; + return bytes_read != size; // return true for any error +} + +size_t PersistentStore::capacity() { return 4096; } // 4KiB of Emulated EEPROM + +#endif // !FLASH_EEPROM +#endif // EEPROM_SETTINGS +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/pinsDebug.h b/Marlin/src/HAL/HAL_LPC1768/pinsDebug.h new file mode 100644 index 0000000000..1ee7f44d69 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/pinsDebug.h @@ -0,0 +1,82 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Support routines for LPC1768 + */ + +/** + * Translation of routines & variables used by pinsDebug.h + */ + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS +#define pwm_details(pin) pin = pin // do nothing // print PWM details +#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin. +#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) +#define digitalRead_mod(p) digitalRead(p) +#define PRINT_PORT(p) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define NAME_FORMAT(p) PSTR("%-##p##s") +#define PRINT_ARRAY_NAME(x) do {sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer);} while (0) +#define PRINT_PIN(p) do {sprintf_P(buffer, PSTR("%d.%02d"), LPC1768_PIN_PORT(p), LPC1768_PIN_PIN(p)); SERIAL_ECHO(buffer);} while (0) +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin + +// active ADC function/mode/code values for PINSEL registers +constexpr int8_t ADC_pin_mode(pin_t pin) { + return (LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 2 ? 2 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 3 ? 2 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 23 ? 1 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 24 ? 1 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 25 ? 1 : + LPC1768_PIN_PORT(pin) == 0 && LPC1768_PIN_PIN(pin) == 26 ? 1 : + LPC1768_PIN_PORT(pin) == 1 && LPC1768_PIN_PIN(pin) == 30 ? 3 : + LPC1768_PIN_PORT(pin) == 1 && LPC1768_PIN_PIN(pin) == 31 ? 3 : -1); +} + +int8_t get_pin_mode(pin_t pin) { + if (!VALID_PIN(pin)) return -1; + uint8_t pin_port = LPC1768_PIN_PORT(pin); + uint8_t pin_port_pin = LPC1768_PIN_PIN(pin); + //get appropriate PINSEL register + volatile uint32_t * pinsel_reg = (pin_port == 0 && pin_port_pin <= 15) ? &LPC_PINCON->PINSEL0 : + (pin_port == 0) ? &LPC_PINCON->PINSEL1 : + (pin_port == 1 && pin_port_pin <= 15) ? &LPC_PINCON->PINSEL2 : + pin_port == 1 ? &LPC_PINCON->PINSEL3 : + pin_port == 2 ? &LPC_PINCON->PINSEL4 : + pin_port == 3 ? &LPC_PINCON->PINSEL7 : &LPC_PINCON->PINSEL9; + uint8_t pinsel_start_bit = pin_port_pin > 15 ? 2 * (pin_port_pin - 16) : 2 * pin_port_pin; + int8_t pin_mode = (int8_t) ((*pinsel_reg >> pinsel_start_bit) & 0x3); + return pin_mode; +} + +bool GET_PINMODE(pin_t pin) { + int8_t pin_mode = get_pin_mode(pin); + if (pin_mode == -1 || pin_mode == ADC_pin_mode(pin)) // found an invalid pin or active analog pin + return false; + + uint32_t * FIO_reg[5] PROGMEM = {(uint32_t*) 0x2009C000,(uint32_t*) 0x2009C020,(uint32_t*) 0x2009C040,(uint32_t*) 0x2009C060,(uint32_t*) 0x2009C080}; + return ((*FIO_reg[LPC1768_PIN_PORT(pin)] >> LPC1768_PIN_PIN(pin) & 1) != 0); //input/output state +} + +bool GET_ARRAY_IS_DIGITAL(pin_t pin) { + return (!IS_ANALOG(pin) || get_pin_mode(pin) != ADC_pin_mode(pin)); +} diff --git a/Marlin/src/HAL/LINUX/servo_private.h b/Marlin/src/HAL/HAL_LPC1768/servo_private.h similarity index 90% rename from Marlin/src/HAL/LINUX/servo_private.h rename to Marlin/src/HAL/HAL_LPC1768/servo_private.h index bcc8d2037f..451c487d73 100644 --- a/Marlin/src/HAL/LINUX/servo_private.h +++ b/Marlin/src/HAL/HAL_LPC1768/servo_private.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 @@ -45,8 +44,12 @@ * Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. * * The only modification was to update/delete macros to match the LPC176x. + * */ +#ifndef SERVO_PRIVATE_H +#define SERVO_PRIVATE_H + #include // Macros @@ -77,3 +80,5 @@ typedef struct { extern uint8_t ServoCount; extern ServoInfo_t servo_info[MAX_SERVOS]; + +#endif // SERVO_PRIVATE_H diff --git a/Marlin/src/HAL/HAL_LPC1768/spi_pins.h b/Marlin/src/HAL/HAL_LPC1768/spi_pins.h new file mode 100644 index 0000000000..841a3f845f --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/spi_pins.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef SPI_PINS_LPC1768_H +#define SPI_PINS_LPC1768_H + +#include "src/core/macros.h" + +#if ENABLED(SDSUPPORT) && ENABLED(DOGLCD) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) + #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently + // needed due to the speed and mode requred for communicating with each device being different. + // This requirement can be removed if the SPI access to these devices is updated to use + // spiBeginTransaction. +#endif + +/** onboard SD card */ +//#define SCK_PIN P0_07 +//#define MISO_PIN P0_08 +//#define MOSI_PIN P0_09 +//#define SS_PIN P0_06 +/** external */ +#ifndef SCK_PIN + #define SCK_PIN P0_15 +#endif +#ifndef MISO_PIN + #define MISO_PIN P0_17 +#endif +#ifndef MOSI_PIN + #define MOSI_PIN P0_18 +#endif +#ifndef SS_PIN + #define SS_PIN P1_23 +#endif +#ifndef SDSS + #define SDSS SS_PIN +#endif + +#endif // SPI_PINS_LPC1768_H diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.c b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.c new file mode 100644 index 0000000000..80bf5fc633 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.c @@ -0,0 +1,172 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// adapted from I2C/master/master.c example +// https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html + +#ifdef TARGET_LPC1768 + +#ifdef __cplusplus + extern "C" { +#endif + +#include +#include +#include + +////////////////////////////////////////////////////////////////////////////////////// + +// These two routines are exact copies of the lpc17xx_i2c.c routines. Couldn't link to +// to the lpc17xx_i2c.c routines so had to copy them into this file & rename them. + +static uint32_t _I2C_Start (LPC_I2C_TypeDef *I2Cx) { + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + + // Enter to Master Transmitter mode + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + // Wait for complete + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +static void _I2C_Stop (LPC_I2C_TypeDef *I2Cx) { + /* Make sure start bit is not active */ + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + + I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; +} + +////////////////////////////////////////////////////////////////////////////////////// + +#define U8G_I2C_OPT_FAST 16 // from u8g.h + +#define USEDI2CDEV_M 1 + +#define I2CDEV_S_ADDR 0x78 // from SSD1306 //actual address is 0x3C - shift left 1 with LSB set to 0 to indicate write + +#define BUFFER_SIZE 0x1 // only do single byte transfers with LCDs + +#if (USEDI2CDEV_M == 0) + #define I2CDEV_M LPC_I2C0 +#elif (USEDI2CDEV_M == 1) + #define I2CDEV_M LPC_I2C1 +#elif (USEDI2CDEV_M == 2) + #define I2CDEV_M LPC_I2C2 +#else + #error "Master I2C device not defined!" +#endif + +PINSEL_CFG_Type PinCfg; +I2C_M_SETUP_Type transferMCfg; + +#define I2C_status (LPC_I2C1->I2STAT & I2C_STAT_CODE_BITMASK) + +uint8_t u8g_i2c_start(uint8_t sla) { // send slave address and write bit + // Sometimes TX data ACK or NAK status is returned. That mean the start state didn't + // happen which means only the value of the slave address was send. Keep looping until + // the slave address and write bit are actually sent. + do{ + _I2C_Stop(I2CDEV_M); // output stop state on I2C bus + _I2C_Start(I2CDEV_M); // output start state on I2C bus + while ((I2C_status != I2C_I2STAT_M_TX_START) + && (I2C_status != I2C_I2STAT_M_TX_RESTART) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for start to be asserted + + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_STAC; // clear start state before tansmitting slave address + LPC_I2C1->I2DAT = I2CDEV_S_ADDR & I2C_I2DAT_BITMASK; // transmit slave address & write bit + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + while ((I2C_status != I2C_I2STAT_M_TX_SLAW_ACK) + && (I2C_status != I2C_I2STAT_M_TX_SLAW_NACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for slaw to finish + }while ( (I2C_status == I2C_I2STAT_M_TX_DAT_ACK) || (I2C_status == I2C_I2STAT_M_TX_DAT_NACK)); + return 1; +} + +void u8g_i2c_init(uint8_t clock_option) { + + /** + * Init I2C pin connect + */ + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + #if ((USEDI2CDEV_M == 0)) + PinCfg.Funcnum = 1; + PinCfg.Pinnum = 27; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA0 / D57 AUX-1 + PinCfg.Pinnum = 28; + PINSEL_ConfigPin(&PinCfg); // SCL0 / D58 AUX-1 + #endif + #if ((USEDI2CDEV_M == 1)) + PinCfg.Funcnum = 3; + PinCfg.Pinnum = 0; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA1 / D20 SCA + PinCfg.Pinnum = 1; + PINSEL_ConfigPin(&PinCfg); // SCL1 / D21 SCL + #endif + #if ((USEDI2CDEV_M == 2)) + PinCfg.Funcnum = 2; + PinCfg.Pinnum = 10; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); // SDA2 / D38 X_ENABLE_PIN + PinCfg.Pinnum = 11; + PINSEL_ConfigPin(&PinCfg); // SCL2 / D55 X_DIR_PIN + #endif + // Initialize I2C peripheral + I2C_Init(I2CDEV_M, (clock_option & U8G_I2C_OPT_FAST) ? 400000: 100000); // LCD data rates + + // Enable Master I2C operation + I2C_Cmd(I2CDEV_M, I2C_MASTER_MODE, ENABLE); + + u8g_i2c_start(0); // send slave address and write bit +} + +volatile extern uint32_t _millis; +uint8_t u8g_i2c_send_byte(uint8_t data) { + #define I2C_TIMEOUT 3 + LPC_I2C1->I2DAT = data & I2C_I2DAT_BITMASK; // transmit data + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + uint32_t timeout = _millis + I2C_TIMEOUT; + while ((I2C_status != I2C_I2STAT_M_TX_DAT_ACK) && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK) && (timeout > _millis)); // wait for xmit to finish + // had hangs with SH1106 so added time out - have seen temporary screen corruption when this happens + return 1; +} + +void u8g_i2c_stop(void) { +} + + +#ifdef __cplusplus + } +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.h b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.h new file mode 100644 index 0000000000..5f7337316a --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_I2C_routines.h @@ -0,0 +1,27 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +void u8g_i2c_init(uint8_t options); +uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos); +uint8_t u8g_i2c_start(uint8_t sla); +uint8_t u8g_i2c_send_byte(uint8_t data); +void u8g_i2c_stop(void); diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_defines.h b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_defines.h new file mode 100644 index 0000000000..fc7d3a1e49 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_defines.h @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * LPC1768 LCD-specific defines + */ + +// The following are optional depending on the platform. + +// definitions of HAL specific com and device drivers. +uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + + +// connect U8g com generic com names to the desired driver +#define U8G_COM_HW_SPI u8g_com_HAL_LPC1768_hw_spi_fn // use LPC1768 specific hardware SPI routine +#define U8G_COM_SW_SPI u8g_com_HAL_LPC1768_sw_spi_fn // use LPC1768 specific software SPI routine +#define U8G_COM_ST7920_HW_SPI u8g_com_HAL_LPC1768_ST7920_hw_spi_fn +#define U8G_COM_ST7920_SW_SPI u8g_com_HAL_LPC1768_ST7920_sw_spi_fn +#define U8G_COM_SSD_I2C u8g_com_HAL_LPC1768_ssd_hw_i2c_fn + +// let these default for now +#define U8G_COM_PARALLEL u8g_com_null_fn +#define U8G_COM_T6963 u8g_com_null_fn +#define U8G_COM_FAST_PARALLEL u8g_com_null_fn +#define U8G_COM_UC_I2C u8g_com_null_fn diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_delay.h b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_delay.h new file mode 100644 index 0000000000..28c950ae49 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_delay.h @@ -0,0 +1,42 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * LCD delay routines - used by all the drivers. + * + * These are based on the LPC1768 routines. + * + * Couldn't just call exact copies because the overhead resulted in the + * one microsecond delay being about 4uS. + */ + +#ifdef __cplusplus + extern "C" { +#endif + +void U8g_delay(int msec); +void u8g_MicroDelay(void); +void u8g_10MicroDelay(void); + +#ifdef __cplusplus + } +#endif diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.c b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.c new file mode 100644 index 0000000000..57073d9a04 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.c @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Low level pin manipulation routines - used by all the drivers. + * + * These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines. + * + * Couldn't just call exact copies because the overhead killed the LCD update speed + * With an intermediate level the softspi was running in the 10-20kHz range which + * resulted in using about about 25% of the CPU's time. + */ + +#ifdef TARGET_LPC1768 + +#include +#include +#include "../../../core/macros.h" +//#include + +#define LPC_PORT_OFFSET (0x0020) +#define LPC_PIN(pin) (1UL << pin) +#define LPC_GPIO(port) ((volatile LPC_GPIO_TypeDef *)(LPC_GPIO0_BASE + LPC_PORT_OFFSET * port)) + +#define INPUT 0 +#define OUTPUT 1 +#define INPUT_PULLUP 2 + + +uint8_t LPC1768_PIN_PORT(const uint8_t pin); +uint8_t LPC1768_PIN_PIN(const uint8_t pin); + +#ifdef __cplusplus + extern "C" { +#endif + +// I/O functions +// As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) +void pinMode_LCD(uint8_t pin, uint8_t mode) { + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + PINSEL_CFG_Type config = { LPC1768_PIN_PORT(pin), + LPC1768_PIN_PIN(pin), + PINSEL_FUNC_0, + PINSEL_PINMODE_TRISTATE, + PINSEL_PINMODE_NORMAL }; + switch(mode) { + case INPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + PINSEL_ConfigPin(&config); + break; + case OUTPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR |= LPC_PIN(LPC1768_PIN_PIN(pin)); + PINSEL_ConfigPin(&config); + break; + case INPUT_PULLUP: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + config.Pinmode = PINSEL_PINMODE_PULLUP; + PINSEL_ConfigPin(&config); + break; + default: + break; + } +} + +void u8g_SetPinOutput(uint8_t internal_pin_number) { + pinMode_LCD(internal_pin_number, 1); // OUTPUT +} + +void u8g_SetPinInput(uint8_t internal_pin_number) { + pinMode_LCD(internal_pin_number, 0); // INPUT +} + +void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status) { + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + if (pin_status) + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOSET = LPC_PIN(LPC1768_PIN_PIN(pin)); + else + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOCLR = LPC_PIN(LPC1768_PIN_PIN(pin)); +} + +uint8_t u8g_GetPinLevel(uint8_t pin) { + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + return (uint32_t)LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOPIN & LPC_PIN(LPC1768_PIN_PIN(pin)) ? 1 : 0; +} + + +#ifdef __cplusplus + } +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.h b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.h new file mode 100644 index 0000000000..5a900ac45c --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g/HAL_LCD_pin_routines.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Low level pin manipulation routines - used by all the drivers. + * + * These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines. + * + * Couldn't just call exact copies because the overhead killed the LCD update speed + * With an intermediate level the softspi was running in the 10-20kHz range which + * resulted in using about about 25% of the CPU's time. + */ + +void u8g_SetPinOutput(uint8_t internal_pin_number); +void u8g_SetPinInput(uint8_t internal_pin_number); +void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status); +uint8_t u8g_GetPinLevel(uint8_t pin); diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_hw_spi.cpp similarity index 88% rename from Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp rename to Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_hw_spi.cpp index 057e10e0f5..9cd913f743 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_hw_spi.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -55,12 +55,20 @@ #ifdef TARGET_LPC1768 -#include "../../../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_U8GLIB +#if ENABLED(DOGLCD) +//#include #include -#include "../../shared/HAL_SPI.h" + +#define SPI_FULL_SPEED 0 +#define SPI_HALF_SPEED 1 +#define SPI_QUARTER_SPEED 2 +#define SPI_EIGHTH_SPEED 3 +#define SPI_SIXTEENTH_SPEED 4 +#define SPI_SPEED_5 5 +#define SPI_SPEED_6 6 void spiBegin(); void spiInit(uint8_t spiRate); @@ -124,6 +132,6 @@ uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, return 1; } -#endif // HAS_MARLINUI_U8GLIB +#endif // DOGLCD #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp similarity index 86% rename from Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp rename to Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp index 6f7efba4ae..06399d3947 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -26,6 +26,8 @@ * COM interface for Arduino (AND ATmega) and the SSDxxxx chip (SOLOMON) variant * I2C protocol * + * ToDo: Rename this to u8g_com_avr_ssd_i2c.c + * * Universal 8bit Graphics Library * * Copyright (c) 2011, olikraus@gmail.com @@ -75,9 +77,9 @@ #ifdef TARGET_LPC1768 -#include "../../../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_U8GLIB +#if ENABLED(DOGLCD) #include @@ -86,13 +88,16 @@ #define I2C_CMD_MODE 0x000 #define I2C_DATA_MODE 0x040 +//#define U8G_I2C_OPT_FAST 16 + uint8_t u8g_com_ssd_I2C_start_sequence(u8g_t *u8g) { /* are we requested to set the a0 state? */ if (u8g->pin_list[U8G_PI_SET_A0] == 0) return 1; /* setup bus, might be a repeated start */ - if (u8g_i2c_start(I2C_SLA) == 0) return 0; - if (u8g->pin_list[U8G_PI_A0_STATE] == 0) { + if (u8g_i2c_start(I2C_SLA) == 0) + return 0; + if (u8g->pin_list[U8G_PI_A0_STATE] == 0 ) { if (u8g_i2c_send_byte(I2C_CMD_MODE) == 0) return 0; } else if (u8g_i2c_send_byte(I2C_DATA_MODE) == 0) @@ -103,11 +108,11 @@ uint8_t u8g_com_ssd_I2C_start_sequence(u8g_t *u8g) { } uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - switch (msg) { + switch(msg) { case U8G_COM_MSG_INIT: //u8g_com_arduino_digital_write(u8g, U8G_PI_SCL, HIGH); //u8g_com_arduino_digital_write(u8g, U8G_PI_SDA, HIGH); - //u8g->pin_list[U8G_PI_A0_STATE] = 0; /* initial RS state: unknown mode */ + //u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: unknown mode */ u8g_i2c_init(u8g->pin_list[U8G_PI_I2C_OPTION]); u8g_com_ssd_I2C_start_sequence(u8g); @@ -135,11 +140,8 @@ uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_v case U8G_COM_MSG_WRITE_BYTE: //u8g->pin_list[U8G_PI_SET_A0] = 1; - if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) { - u8g_i2c_stop(); - return 0; - } - + //if (u8g_com_arduino_ssd_start_sequence(u8g) == 0) + // return u8g_i2c_stop(), 0; if (u8g_i2c_send_byte(arg_val) == 0) { u8g_i2c_stop(); return 0; @@ -154,7 +156,7 @@ uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_v return 0; } - uint8_t *ptr = (uint8_t *)arg_ptr; + register uint8_t *ptr = (uint8_t *)arg_ptr; while (arg_val > 0) { if (u8g_i2c_send_byte(*ptr++) == 0) { u8g_i2c_stop(); @@ -173,7 +175,7 @@ uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_v return 0; } - uint8_t *ptr = (uint8_t *)arg_ptr; + register uint8_t *ptr = (uint8_t *)arg_ptr; while (arg_val > 0) { if (u8g_i2c_send_byte(u8g_pgm_read(ptr)) == 0) return 0; @@ -187,12 +189,15 @@ uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_v case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ u8g->pin_list[U8G_PI_A0_STATE] = arg_val; u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again */ + + u8g_i2c_start(0); // send slave address and write bit + u8g_i2c_send_byte(arg_val ? 0x40 : 0x80); // Write to ? Graphics DRAM mode : Command mode break; } // switch return 1; } -#endif // HAS_MARLINUI_U8GLIB +#endif // DOGLCD #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_sw_i2c.cpp under construction b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_sw_i2c.cpp under construction new file mode 100644 index 0000000000..80c8da7239 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_ssd_sw_i2c.cpp under construction @@ -0,0 +1,254 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Based on U8G2 code - u8x8_byte.c + * + * Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/) + * + * Copyright (c) 2016, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Software i2c, + * ignores ACK response (which is anyway not provided by some displays) + * also does not allow reading from the device + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include + +//void pinMode(int16_t pin, uint8_t mode); +//void digitalWrite(int16_t pin, uint8_t pin_status); + + +#define I2C_SLA (0x3C*2) +//#define I2C_CMD_MODE 0x080 +#define I2C_CMD_MODE 0x000 +#define I2C_DATA_MODE 0x040 + +//static uint8_t I2C_speed; // 3 - 400KHz, 13 - 100KHz +//#define SPEED_400KHz 3 +//#define SPEED_100KHz 13 + +// #define U8G_I2C_OPT_FAST 16 + +uint8_t SCL_pin_HAL_LPC1768_sw_I2C, SCL_port_HAL_LPC1768_sw_I2C, SDA_pin_HAL_LPC1768_sw_I2C, SDA_port_HAL_LPC1768_sw_I2C; + +#define SPI_SPEED 2 //20: 200KHz 5:750KHz 2:3-4MHz + +uint8_t u8g_i2c_send_byte_sw(uint8_t data) { + for (uint8_t i = 0; i < 9; i++) { // 1 extra bit for the ack/nak + + if (val & 0x80) + for (uint8_t j = 0; j < SPI_SPEED; j++) { + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + } + else + for (uint8_t j = 0; j < SPI_SPEED; j++) { + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + } + + for (uint8_t j = 0; j < SPI_SPEED; j++) { + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + } + + for (uint8_t j = 0; j < SPI_SPEED; j++) { + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + } + val <<= 1; + } + return 1; +} + + +uint8_t u8g_i2c_start_sw(uint8_t sla) { // assert start condition and then send slave address with write bit + /* send the start condition, both lines go from 1 to 0 */ + + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + DELAY_US(2); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + DELAY_US(2); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOSET = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + DELAY_US(2); + LPC_GPIO(SDA_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SDA_pin_HAL_LPC1768_sw_I2C); + DELAY_US(2); + LPC_GPIO(SCL_port_HAL_LPC1768_sw_I2C)->FIOCLR = LPC_PIN(SCL_pin_HAL_LPC1768_sw_I2C); + + u8g_i2c_send_byte_sw(I2C_SLA); // send slave address with write bit +} + + +void u8g_i2c_stop_sw(void) { } + +void u8g_i2c_init_sw(uint8_t clock_option) { u8g_i2c_start(0); } // send slave address and write bit + +uint8_t u8g_com_ssd_I2C_start_sequence_sw(u8g_t *u8g) { + /* are we requested to set the a0 state? */ + if (u8g->pin_list[U8G_PI_SET_A0] == 0) return 1; + + /* setup bus, might be a repeated start */ + if (u8g_i2c_start(I2C_SLA) == 0) return 0; + if (u8g->pin_list[U8G_PI_A0_STATE] == 0) { + if (u8g_i2c_send_byte(I2C_CMD_MODE) == 0) return 0; + } + else if (u8g_i2c_send_byte(I2C_DATA_MODE) == 0) return 0; + + u8g->pin_list[U8G_PI_SET_A0] = 0; + + return 1; +} + +uint8_t u8g_com_HAL_LPC1768_ssd_sw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + SCL_pin_HAL_LPC1768_sw_I2C = LPC1768_PIN_PIN(u8g->pin_list[U8G_PI_SCL]); + SCL_port_HAL_LPC1768_sw_I2C = LPC1768_PIN_PORT(u8g->pin_list[U8G_PI_SCL]); + SDA_pin_HAL_LPC1768_sw_I2C = LPC1768_PIN_PIN(u8g->pin_list[U8G_PI_SDA]); + SDA_port_HAL_LPC1768_sw_I2C = LPC1768_PIN_PORT(u8g->pin_list[U8G_PI_SDA]); + // As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) + #define OUTPUT 0x1 + u8g_SetPIOutput(u8g, U8G_PI_SCL); + u8g_SetPIOutput(u8g, U8G_PI_SDA); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS]) u8g_SetPIOutput(u8g, U8G_PI_CS); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_A0]) u8g_SetPIOutput(u8g, U8G_PI_A0); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput(u8g, U8G_PI_RESET); + + //u8g_com_arduino_digital_write(u8g, U8G_PI_SCL, HIGH); + //u8g_com_arduino_digital_write(u8g, U8G_PI_SDA, HIGH); + //u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: unknown mode */ + + u8g_i2c_init_sw(u8g->pin_list[U8G_PI_I2C_OPTION]); + u8g_com_ssd_I2C_start_sequence_sw(u8g); + break; + + case U8G_COM_MSG_STOP: break; + + case U8G_COM_MSG_RESET: break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g->pin_list[U8G_PI_A0_STATE] = 0; + u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again, also forces start condition */ + if (arg_val == 0) { + /* disable chip, send stop condition */ + u8g_i2c_stop_sw(); + } + else { + /* enable, do nothing: any byte writing will trigger the i2c start */ + } + break; + + case U8G_COM_MSG_WRITE_BYTE: + //u8g->pin_list[U8G_PI_SET_A0] = 1; + //if (u8g_com_arduino_ssd_start_sequence(u8g) == 0) + // return u8g_i2c_stop(), 0; + if (u8g_i2c_send_byte_sw(arg_val) == 0) + return u8g_i2c_stop_sw(), 0; + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + //u8g->pin_list[U8G_PI_SET_A0] = 1; + if (u8g_com_ssd_I2C_start_sequence_sw(u8g) == 0) + return u8g_i2c_stop_sw(), 0; + + register uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + if (u8g_i2c_send_byte_sw(*ptr++) == 0) + return u8g_i2c_stop_sw(), 0; + arg_val--; + } + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + //u8g->pin_list[U8G_PI_SET_A0] = 1; + if (u8g_com_ssd_I2C_start_sequence_sw(u8g) == 0) + return u8g_i2c_stop_sw(), 0; + + register uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + if (u8g_i2c_send_byte_sw(u8g_pgm_read(ptr)) == 0) return 0; + ptr++; + arg_val--; + } + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again */ + u8g_i2c_start_sw(0); // send slave address and write bit + u8g_i2c_send_byte_sw(arg_val ? 0x40 : 0x80); // Write to ? Graphics DRAM mode : Command mode + break; + } + return 1; +} + +#endif // DOGLCD + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp similarity index 75% rename from Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp rename to Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp index 592e27f6c0..6b036ba5ea 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -55,13 +55,21 @@ #ifdef TARGET_LPC1768 -#include "../../../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_U8GLIB +#if ENABLED(DOGLCD) +//#include #include -#include "../../shared/HAL_SPI.h" -#include "../../shared/Delay.h" +#include "../shared/Delay.h" + +#define SPI_FULL_SPEED 0 +#define SPI_HALF_SPEED 1 +#define SPI_QUARTER_SPEED 2 +#define SPI_EIGHTH_SPEED 3 +#define SPI_SIXTEENTH_SPEED 4 +#define SPI_SPEED_5 5 +#define SPI_SPEED_6 6 void spiBegin(); void spiInit(uint8_t spiRate); @@ -72,25 +80,32 @@ static uint8_t rs_last_state = 255; static void u8g_com_LPC1768_st7920_write_byte_hw_spi(uint8_t rs, uint8_t val) { - if (rs != rs_last_state) { // Time to send a command/data byte + if ( rs != rs_last_state) { // time to send a command/data byte rs_last_state = rs; - spiSend(rs ? 0x0FA : 0x0F8); // Send data or command - DELAY_US(40); // Give the controller some time: 20 is bad, 30 is OK, 40 is safe + + if ( rs == 0 ) + /* command */ + spiSend(0x0F8); + else + /* data */ + spiSend(0x0FA); + + DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe } - spiSend(val & 0xF0); + spiSend(val & 0x0F0); spiSend(val << 4); } uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - switch (msg) { + switch(msg) { case U8G_COM_MSG_INIT: u8g_SetPILevel(u8g, U8G_PI_CS, 0); u8g_SetPIOutput(u8g, U8G_PI_CS); u8g_Delay(5); spiBegin(); - spiInit(SPI_EIGHTH_SPEED); // ST7920 max speed is about 1.1 MHz - u8g->pin_list[U8G_PI_A0_STATE] = 0; // initial RS state: command mode + spiInit(SPI_EIGHTH_SPEED); // ST7920 max speed is about 1.1 MHz + u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */ break; case U8G_COM_MSG_STOP: @@ -100,12 +115,12 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); break; - case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1) + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ u8g->pin_list[U8G_PI_A0_STATE] = arg_val; break; case U8G_COM_MSG_CHIP_SELECT: - u8g_SetPILevel(u8g, U8G_PI_CS, arg_val); // Note: the ST7920 has an active high chip-select + u8g_SetPILevel(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select break; case U8G_COM_MSG_WRITE_BYTE: @@ -133,6 +148,6 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar return 1; } -#endif // HAS_MARLINUI_U8GLIB +#endif // DOGLCD #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp similarity index 82% rename from Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp rename to Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp index 10d8494162..a189b9126d 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -55,34 +55,43 @@ #ifdef TARGET_LPC1768 -#include "../../../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfigPre.h" -#if ENABLED(U8GLIB_ST7920) +#if ENABLED(DOGLCD) #include -#include -#include "../../shared/Delay.h" +#include "SoftwareSPI.h" +#include "../shared/Delay.h" -#undef SPI_SPEED #define SPI_SPEED 3 // About 1 MHz static pin_t SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL; static uint8_t SPI_speed = 0; +static uint8_t rs_last_state = 255; static void u8g_com_LPC1768_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) { - static uint8_t rs_last_state = 255; - if (rs != rs_last_state) { - // Transfer Data (FA) or Command (F8) - swSpiTransfer(rs ? 0x0FA : 0x0F8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); + + if (rs != rs_last_state) { // time to send a command/data byte rs_last_state = rs; - DELAY_US(40); // Give the controller time to process the data: 20 is bad, 30 is OK, 40 is safe + + if (rs == 0) + /* command */ + swSpiTransfer(0x0F8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); + else + /* data */ + swSpiTransfer(0x0FA, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); + + DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe } + swSpiTransfer(val & 0x0F0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); swSpiTransfer(val << 4, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); } -uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - switch (msg) { +uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + switch(msg) + { case U8G_COM_MSG_INIT: SCK_pin_ST7920_HAL = u8g->pin_list[U8G_PI_SCK]; MOSI_pin_ST7920_HAL_HAL = u8g->pin_list[U8G_PI_MOSI]; @@ -98,7 +107,7 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar u8g_SetPILevel(u8g, U8G_PI_SCK, 0); u8g_SetPILevel(u8g, U8G_PI_MOSI, 0); - u8g->pin_list[U8G_PI_A0_STATE] = 0; /* initial RS state: command mode */ + u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */ break; case U8G_COM_MSG_STOP: @@ -141,5 +150,6 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar return 1; } -#endif // U8GLIB_ST7920 +#endif // DOGLCD + #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_sw_spi.cpp new file mode 100644 index 0000000000..533ebda37c --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/u8g_com_HAL_LPC1768_sw_spi.cpp @@ -0,0 +1,129 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Based on u8g_com_std_sw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2015, olikraus@gmail.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include +#include "SoftwareSPI.h" + +#define SPI_SPEED 2 // About 2 MHz + +static uint8_t SPI_speed = 0; + +static void u8g_sw_spi_HAL_LPC1768_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) { + swSpiTransfer(val, SPI_speed, clockPin, -1, dataPin); +} + +uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch(msg) { + case U8G_COM_MSG_INIT: + u8g_SetPIOutput(u8g, U8G_PI_SCK); + u8g_SetPIOutput(u8g, U8G_PI_MOSI); + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_SetPIOutput(u8g, U8G_PI_A0); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput(u8g, U8G_PI_RESET); + SPI_speed = swSpiInit(SPI_SPEED, u8g->pin_list[U8G_PI_SCK], u8g->pin_list[U8G_PI_MOSI]); + u8g_SetPILevel(u8g, U8G_PI_SCK, 0); + u8g_SetPILevel(u8g, U8G_PI_MOSI, 0); + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g_SetPILevel(u8g, U8G_PI_CS, !arg_val); + break; + + case U8G_COM_MSG_WRITE_BYTE: + u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel(u8g, U8G_PI_A0, arg_val); + break; + } + return 1; +} + +#endif // DOGLCD + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py new file mode 100644 index 0000000000..aa24cacc45 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py @@ -0,0 +1,148 @@ +# +# sets output_port +# if target_filename is found then that drive is used +# else if target_drive is found then that drive is used +# + +target_filename = "FIRMWARE.CUR" +target_drive = "REARM" + +import os +import platform +current_OS = platform.system() + +#env_vars = subprocess.check_output('platformio run -t envdump') +#env_vars = env_vars.split('\n') +#for env in env_vars: +# print env +#exit(0) + +build_type = os.environ.get("BUILD_TYPE", 'Not Set') +if build_type == 'upload' or build_type == 'traceback' or build_type == 'Not Set' : + + if current_OS == 'Windows': + + # + # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:' + # Windows - doesn't care about the disk's name, only cares about the drive letter + # + + # + # get all drives on this computer + # + + import subprocess + + driveStr = subprocess.check_output("fsutil fsinfo drives") # typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' + driveStr = driveStr.strip().lstrip('Drives: ') # typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' + drives = driveStr.split() # typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\', 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\'] + + upload_disk = 'Disk not found' + target_file_found = False + target_drive_found = False + for drive in drives: + final_drive_name = drive.strip().rstrip('\\') # typical result (string): 'C:' + try: + volume_info = subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT) + except Exception as e: + continue + else: + if target_drive in volume_info and target_file_found == False: # set upload if not found target file yet + target_drive_found = True + upload_disk = final_drive_name + if target_filename in volume_info: + if target_file_found == False: + upload_disk = final_drive_name + target_file_found = True + + # + # set upload_port to drive if found + # + + if target_file_found == True or target_drive_found == True: + Import("env") + env.Replace( + UPLOAD_PORT = upload_disk + ) + print 'upload disk: ' , upload_disk + else: + print '\nUnable to find destination disk. File must be copied manually. \n' + + + if current_OS == 'Linux': + + # + # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive' + # + + upload_disk = 'Disk not found' + target_file_found = False + target_drive_found = False + medias = os.listdir('/media') # + for media in medias: + drives = os.listdir('/media/' + media) # + if target_drive in drives and target_file_found == False: # set upload if not found target file yet + target_drive_found = True + upload_disk = '/media/' + media + '/' + target_drive + '/' + for drive in drives: + try: + files = os.listdir('/media/' + media + '/' + drive ) + except: + continue + else: + if target_filename in files: + if target_file_found == False: + upload_disk = '/media/' + media + '/' + drive + '/' + target_file_found = True + + # + # set upload_port to drive if found + # + + if target_file_found == True or target_drive_found == True: + Import("env") + env.Replace( + UPLOAD_FLAGS = "-P$UPLOAD_PORT", + UPLOAD_PORT = upload_disk + ) + print 'upload disk: ' , upload_disk + else: + print '\nUnable to find destination disk. File must be copied manually. \n' + + + if current_OS == 'Darwin': # MAC + + # + # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive' + # + + import os + upload_disk = 'Disk not found' + drives = os.listdir('/Volumes') # human readable names + target_file_found = False + target_drive_found = False + if target_drive in drives and target_file_found == False: # set upload if not found target file yet + target_drive_found = True + upload_disk = '/Volumes/' + target_drive + '/' + for drive in drives: + try: + filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected + except: + continue + else: + if target_filename in filenames: + if target_file_found == False: + upload_disk = '/Volumes/' + drive + '/' + target_file_found = True + # + # set upload_port to drive if found + # + + if target_file_found == True or target_drive_found == True: + Import("env") + env.Replace( + UPLOAD_PORT = upload_disk + ) + print '\nupload disk: ' , upload_disk, '\n' + else: + print '\nUnable to find destination disk. File must be copied manually. \n' diff --git a/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp b/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp new file mode 100644 index 0000000000..589e05ebd6 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/watchdog.cpp @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "lpc17xx_wdt.h" +#include "watchdog.h" + +void watchdog_init(void) { + WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET); + WDT_Start(WDT_TIMEOUT); +} + +void HAL_clear_reset_source(void) { + WDT_ClrTimeOutFlag(); +} + +uint8_t HAL_get_reset_source(void) { + if (TEST(WDT_ReadTimeOutFlag(), 0)) return RST_WATCHDOG; + return RST_POWER_ON; +} + +void watchdog_reset() { + WDT_Feed(); + #if PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heart beat indicator + #endif +} + +#else + void HAL_clear_reset_source(void) {} + uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } +#endif // USE_WATCHDOG + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/HAL_LPC1768/watchdog.h b/Marlin/src/HAL/HAL_LPC1768/watchdog.h new file mode 100644 index 0000000000..90147bd702 --- /dev/null +++ b/Marlin/src/HAL/HAL_LPC1768/watchdog.h @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef WATCHDOG_LPC1768_H +#define WATCHDOG_LPC1768_H + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 + +#define WDT_TIMEOUT 4000000 // 4 second timeout + +void watchdog_init(void); +void watchdog_reset(void); +void HAL_clear_reset_source(void); +uint8_t HAL_get_reset_source(void); + +#endif /* WATCHDOG_H */ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL.cpp new file mode 100644 index 0000000000..95dbb0a502 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL.cpp @@ -0,0 +1,279 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +#define __I +#define __IO + typedef struct + { + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5]; + __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + } SCB_Type; + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- +USBSerial SerialUSB; + +uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- +STM32ADC adc(ADC1); + +uint8 adc_pins[] = { + #if HAS_TEMP_ADC_0 + TEMP_0_PIN, + #endif + #if HAS_TEMP_ADC_1 + TEMP_1_PIN + #endif + #if HAS_TEMP_ADC_2 + TEMP_2_PIN, + #endif + #if HAS_TEMP_ADC_3 + TEMP_3_PIN, + #endif + #if HAS_TEMP_ADC_4 + TEMP_4_PIN, + #endif + #if HAS_HEATED_BED + TEMP_BED_PIN, + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + FILWIDTH_PIN, + #endif +}; + +enum TEMP_PINS : char { + #if HAS_TEMP_ADC_0 + TEMP_0, + #endif + #if HAS_TEMP_ADC_1 + TEMP_1, + #endif + #if HAS_TEMP_ADC_2 + TEMP_2, + #endif + #if HAS_TEMP_ADC_3 + TEMP_3, + #endif + #if HAS_TEMP_ADC_4 + TEMP_4, + #endif + #if HAS_HEATED_BED + TEMP_BED, + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + FILWIDTH, + #endif + ADC_PIN_COUNT +}; + +uint16_t HAL_adc_results[ADC_PIN_COUNT]; + + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- +static void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_init(void) { + NVIC_SetPriorityGrouping(0x3); +} + +/* VGPV Done with defines +// disable interrupts +void cli(void) { noInterrupts(); } + +// enable interrupts +void sei(void) { interrupts(); } +*/ + +void HAL_clear_reset_source(void) { } + +/** + * TODO: Check this and change or remove. + * currently returns 1 that's equal to poweron reset. + */ +uint8_t HAL_get_reset_source(void) { return 1; } + +void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +/** + * TODO: Change this to correct it for libmaple + */ + +// return free memory between end of heap (or end bss) and whatever is current + +/* +#include "wirish/syscalls.c" +//extern caddr_t _sbrk(int incr); +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) +#endif + +extern "C" { + static int freeMemory() { + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); + } + int freeMemory() { + int free_memory; + int heap_end = (int)_sbrk(0); + free_memory = ((int)&free_memory) - ((int)heap_end); + return free_memory; + } +} +*/ + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- +// Init the AD in continuous capture mode +void HAL_adc_init(void) { + // configure the ADC + adc.calibrate(); + adc.setSampleRate(ADC_SMPR_41_5); // ? + adc.setPins(adc_pins, ADC_PIN_COUNT); + adc.setDMA(HAL_adc_results, (uint16_t)ADC_PIN_COUNT, (uint32_t)(DMA_MINC_MODE | DMA_CIRC_MODE), (void (*)())NULL); + adc.setScanMode(); + adc.setContinuous(); + adc.startConversion(); +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + TEMP_PINS pin_index; + switch (adc_pin) { + #if HAS_TEMP_ADC_0 + case TEMP_0_PIN: pin_index = TEMP_0; break; + #endif + #if HAS_TEMP_ADC_1 + case TEMP_1_PIN: pin_index = TEMP_1; break; + #endif + #if HAS_TEMP_ADC_2 + case TEMP_2_PIN: pin_index = TEMP_2; break; + #endif + #if HAS_TEMP_ADC_3 + case TEMP_3_PIN: pin_index = TEMP_3; break; + #endif + #if HAS_TEMP_ADC_4 + case TEMP_4_PIN: pin_index = TEMP_4; break; + #endif + #if HAS_HEATED_BED + case TEMP_BED_PIN: pin_index = TEMP_BED; break; + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + case FILWIDTH_PIN: pin_index = FILWIDTH; break; + #endif + } + HAL_adc_result = (HAL_adc_results[(int)pin_index] >> 2) & 0x3FF; // shift to get 10 bits only. +} + +uint16_t HAL_adc_get_result(void) { + return HAL_adc_result; +} + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL.h b/Marlin/src/HAL/HAL_STM32F1/HAL.h new file mode 100644 index 0000000000..8a436d999a --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL.h @@ -0,0 +1,252 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifndef _HAL_STM32F1_H +#define _HAL_STM32F1_H + +#define CPU_32_BIT +#undef DEBUG_NONE + +#ifndef vsnprintf_P + #define vsnprintf_P vsnprintf +#endif + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include +#include +#include + +// -------------------------------------------------------------------------- +// Undefine DEBUG_ settings +// -------------------------------------------------------------------------- + + +#undef DEBUG_NONE +#undef DEBUG_FAULT +#undef DEBUG_ALL + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio_Stm32f1.h" +#include "watchdog_Stm32f1.h" + +#include "HAL_timers_Stm32f1.h" + + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#if !WITHIN(SERIAL_PORT, -1, 3) + #error "SERIAL_PORT must be from -1 to 3" +#endif +#if SERIAL_PORT == -1 +extern USBSerial SerialUSB; + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 0 + #define MYSERIAL0 Serial +#elif SERIAL_PORT == 1 + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 Serial2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 Serial3 +#endif + +#ifdef SERIAL_PORT_2 + #if !WITHIN(SERIAL_PORT_2, -1, 3) + #error "SERIAL_PORT_2 must be from -1 to 3" + #elif SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different than SERIAL_PORT" + #endif + #define NUM_SERIAL 2 + #if SERIAL_PORT_2 == -1 + extern USBSerial SerialUSB; + #define MYSERIAL1 SerialUSB + #elif SERIAL_PORT_2 == 0 + #define MYSERIAL1 Serial + #elif SERIAL_PORT_2 == 1 + #define MYSERIAL1 Serial1 + #elif SERIAL_PORT_2 == 2 + #define MYSERIAL1 Serial2 + #elif SERIAL_PORT_2 == 3 + #define MYSERIAL1 Serial3 + #endif +#else + #define NUM_SERIAL 1 +#endif + +// Use HAL_init() to set interrupt grouping. +#define HAL_INIT +void HAL_init(); + +/** + * TODO: review this to return 1 for pins that are not analog input + */ +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) (p) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_primask(); (void)__iCliRetVal() +#define CRITICAL_SECTION_END if (!primask) (void)__iSeiRetVal() +#define ISRS_ENABLED() (!__get_primask()) +#define ENABLE_ISRS() ((void)__iSeiRetVal()) +#define DISABLE_ISRS() ((void)__iCliRetVal()) + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef int8_t pin_t; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +/** result of last ADC conversion */ +extern uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// Disable interrupts +#define cli() noInterrupts() + +// Enable interrupts +#define sei() interrupts() + +// Memory related +#define __bss_end __bss_end__ + +/** clear reset reason */ +void HAL_clear_reset_source (void); + +/** reset reason */ +uint8_t HAL_get_reset_source (void); + +void _delay_ms(const int delay); + +/* +extern "C" { + int freeMemory(void); +} +*/ + +extern "C" char* _sbrk(int incr); +/* +static int freeMemory() { + volatile int top; + top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); + return top; +} +*/ +static int freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + + +// EEPROM + +/** + * TODO: Write all this eeprom stuff. Can emulate eeprom in flash as last resort. + * Wire library should work for i2c eeproms. + */ +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +// ADC + +#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT_ANALOG); + +void HAL_adc_init(void); + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(void); + +/* Todo: Confirm none of this is needed. +uint16_t HAL_getAdcReading(uint8_t chan); + +void HAL_startAdcConversion(uint8_t chan); +uint8_t HAL_pinToAdcChannel(int pin); + +uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); +//uint16_t HAL_getAdcSuperSample(uint8_t chan); + +void HAL_enable_AdcFreerun(void); +//void HAL_disable_AdcFreerun(uint8_t chan); + +*/ + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#endif // _HAL_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.cpp new file mode 100644 index 0000000000..60cdfbf2f3 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.cpp @@ -0,0 +1,120 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +uint8_t ServoCount; //=0 + +#include "HAL_Servo_Stm32f1.h" + +//#include "Servo.h" + +#include +#include +#include +#include + +/** + * 20 millisecond period config. For a 1-based prescaler, + * + * (prescaler * overflow / CYC_MSEC) msec = 1 timer cycle = 20 msec + * => prescaler * overflow = 20 * CYC_MSEC + * + * This uses the smallest prescaler that allows an overflow < 2^16. + */ +#define MAX_OVERFLOW ((1 << 16) - 1) +#define CYC_MSEC (1000 * CYCLES_PER_MICROSECOND) +#define TAU_MSEC 20 +#define TAU_USEC (TAU_MSEC * 1000) +#define TAU_CYC (TAU_MSEC * CYC_MSEC) +#define SERVO_PRESCALER (TAU_CYC / MAX_OVERFLOW + 1) +#define SERVO_OVERFLOW ((uint16)round((double)TAU_CYC / SERVO_PRESCALER)) + +// Unit conversions +#define US_TO_COMPARE(us) ((uint16)map((us), 0, TAU_USEC, 0, SERVO_OVERFLOW)) +#define COMPARE_TO_US(c) ((uint32)map((c), 0, SERVO_OVERFLOW, 0, TAU_USEC)) +#define ANGLE_TO_US(a) ((uint16)(map((a), this->minAngle, this->maxAngle, \ + SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW))) +#define US_TO_ANGLE(us) ((int16)(map((us), SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW, \ + this->minAngle, this->maxAngle))) + +libServo::libServo() { + this->servoIndex = ServoCount < MAX_SERVOS ? ServoCount++ : INVALID_SERVO; +} + +bool libServo::attach(const int32_t pin, const int32_t minAngle, const int32_t maxAngle) { + if (this->servoIndex >= MAX_SERVOS) return false; + + this->pin = pin; + this->minAngle = minAngle; + this->maxAngle = maxAngle; + + timer_dev *tdev = PIN_MAP[this->pin].timer_device; + uint8 tchan = PIN_MAP[this->pin].timer_channel; + + pinMode(this->pin, PWM); + pwmWrite(this->pin, 0); + + timer_pause(tdev); + timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based + timer_set_reload(tdev, SERVO_OVERFLOW); + timer_generate_update(tdev); + timer_resume(tdev); + + return true; +} + +bool libServo::detach() { + if (!this->attached()) return false; + pwmWrite(this->pin, 0); + return true; +} + +int32_t libServo::read() const { + if (this->attached()) { + timer_dev *tdev = PIN_MAP[this->pin].timer_device; + uint8 tchan = PIN_MAP[this->pin].timer_channel; + return US_TO_ANGLE(COMPARE_TO_US(timer_get_compare(tdev, tchan))); + } + return 0; +} + +void libServo::move(const int32_t value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + + if (this->attached()) { + pwmWrite(this->pin, US_TO_COMPARE(ANGLE_TO_US(constrain(value, this->minAngle, this->maxAngle)))); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} +#endif // HAS_SERVOS + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.h new file mode 100644 index 0000000000..778269361f --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_Servo_Stm32f1.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef HAL_SERVO_STM32F1_H +#define HAL_SERVO_STM32F1_H + +// Pin number of unattached pins +#define NOT_ATTACHED (-1) +#define INVALID_SERVO 255 + +#ifndef MAX_SERVOS + #define MAX_SERVOS 3 +#endif + +#define SERVO_DEFAULT_MIN_PW 544 +#define SERVO_DEFAULT_MAX_PW 2400 +#define SERVO_DEFAULT_MIN_ANGLE 0 +#define SERVO_DEFAULT_MAX_ANGLE 180 + +#define HAL_SERVO_LIB libServo + +class libServo { + public: + libServo(); + bool attach(const int32_t pin, const int32_t minAngle=SERVO_DEFAULT_MIN_ANGLE, const int32_t maxAngle=SERVO_DEFAULT_MAX_ANGLE); + bool attached() const { return this->pin != NOT_ATTACHED; } + bool detach(); + void move(const int32_t value); + int32_t read() const; + private: + uint8_t servoIndex; // index into the channel data for this servo + int32_t pin = NOT_ATTACHED; + int32_t minAngle; + int32_t maxAngle; +}; + +#endif // HAL_SERVO_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_spi_Stm32f1.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL_spi_Stm32f1.cpp new file mode 100644 index 0000000000..02314a346c --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_spi_Stm32f1.cpp @@ -0,0 +1,176 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * Adapted to the STM32F1 HAL + */ + +#ifdef __STM32F1__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "../shared/HAL_SPI.h" +#include "pins_arduino.h" +#include "spi_pins.h" +#include "../../core/macros.h" +#include + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +static SPISettings spiConfig; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(SOFTWARE_SPI) + + // -------------------------------------------------------------------------- + // Software SPI + // -------------------------------------------------------------------------- + #error "Software SPI not supported for STM32F1. Use hardware SPI." + +#else + +// -------------------------------------------------------------------------- +// Hardware SPI +// -------------------------------------------------------------------------- + +/** + * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz + */ + +/** + * @brief Begin SPI port setup + * + * @return Nothing + * + * @details Only configures SS pin since libmaple creates and initialize the SPI object + */ +void spiBegin() { + #if !PIN_EXISTS(SS) + #error "SS_PIN not defined!" + #endif + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); +} + +/** + * @brief Initializes SPI port to required speed rate and transfer mode (MSB, SPI MODE 0) + * + * @param spiRate Rate as declared in HAL.h (speed do not match AVR) + * @return Nothing + * + * @details + */ +void spiInit(uint8_t spiRate) { + uint8_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV2 ; break; + case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; + case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; + case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; + case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; + case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; + default: clock = SPI_CLOCK_DIV2; // Default from the SPI library + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE3); + SPI.begin(); +} + +/** + * @brief Receives a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +} + +/** + * @brief Receives a number of bytes from the SPI port to a buffer + * + * @param buf Pointer to starting address of buffer to write to. + * @param nbyte Number of bytes to receive. + * @return Nothing + * + * @details Uses DMA + */ +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.dmaTransfer(0, const_cast(buf), nbyte); + SPI.endTransaction(); +} + +/** + * @brief Sends a single byte on SPI port + * + * @param b Byte to send + * + * @details + */ +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.send(b); + SPI.endTransaction(); +} + +/** + * @brief Write token and then write from 512 byte buffer to SPI (for SD card) + * + * @param buf Pointer with buffer start address + * @return Nothing + * + * @details Use DMA + */ +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPI.send(token); + SPI.dmaSend(const_cast(buf), 512); + SPI.endTransaction(); +} + +/** Begin SPI transaction, set clock, bit order, data mode */ +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, (BitOrder)bitOrder, dataMode); + SPI.beginTransaction(spiConfig); +} + +#endif // SOFTWARE_SPI + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp new file mode 100644 index 0000000000..5c9f5e893e --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.cpp @@ -0,0 +1,219 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include "HAL_timers_Stm32f1.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 4 + +//#define PRESCALER 1 +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- +/* VGPV +const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { + { TC0, 0, TC0_IRQn, 0}, // 0 - [servo timer5] + { TC0, 1, TC1_IRQn, 0}, // 1 + { TC0, 2, TC2_IRQn, 0}, // 2 + { TC1, 0, TC3_IRQn, 2}, // 3 - stepper + { TC1, 1, TC4_IRQn, 15}, // 4 - temperature + { TC1, 2, TC5_IRQn, 0}, // 5 - [servo timer3] + { TC2, 0, TC6_IRQn, 0}, // 6 + { TC2, 1, TC7_IRQn, 0}, // 7 + { TC2, 2, TC8_IRQn, 0}, // 8 +}; +*/ +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +/** + * Timer_clock1: Prescaler 2 -> 36 MHz + * Timer_clock2: Prescaler 8 -> 9 MHz + * Timer_clock3: Prescaler 32 -> 2.25 MHz + * Timer_clock4: Prescaler 128 -> 562.5 kHz + */ + +/** + * TODO: Calculate Timer prescale value, so we get the 32bit to adjust + */ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + nvic_irq_num irq_num; + switch (timer_num) { + case 1: irq_num = NVIC_TIMER1_CC; break; + case 2: irq_num = NVIC_TIMER2; break; + case 3: irq_num = NVIC_TIMER3; break; + case 4: irq_num = NVIC_TIMER4; break; + case 5: irq_num = NVIC_TIMER5; break; + default: + /** + * We should not get here, add Sanitycheck for timer number. Should be a general timer + * since basic timers do not have CC channels. + * Advanced timers should be skipped if possible too, and are not listed above. + */ + break; + } + + /** + * Give the Stepper ISR a higher priority (lower number) + * so it automatically preempts the Temperature ISR. + */ + + switch (timer_num) { + case STEP_TIMER_NUM: + timer_pause(STEP_TIMER_DEV); + timer_set_count(STEP_TIMER_DEV, 0); + timer_set_prescaler(STEP_TIMER_DEV, (uint16)(STEPPER_TIMER_PRESCALE - 1)); + timer_set_reload(STEP_TIMER_DEV, 0xFFFF); + timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, MIN(HAL_TIMER_TYPE_MAX, (STEPPER_TIMER_RATE / frequency))); + timer_attach_interrupt(STEP_TIMER_DEV, STEP_TIMER_CHAN, stepTC_Handler); + nvic_irq_set_priority(irq_num, 1); + timer_generate_update(STEP_TIMER_DEV); + timer_resume(STEP_TIMER_DEV); + break; + case TEMP_TIMER_NUM: + timer_pause(TEMP_TIMER_DEV); + timer_set_count(TEMP_TIMER_DEV, 0); + timer_set_prescaler(TEMP_TIMER_DEV, (uint16)(TEMP_TIMER_PRESCALE - 1)); + timer_set_reload(TEMP_TIMER_DEV, 0xFFFF); + timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, MIN(HAL_TIMER_TYPE_MAX, ((F_CPU / TEMP_TIMER_PRESCALE) / frequency))); + timer_attach_interrupt(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, tempTC_Handler); + nvic_irq_set_priority(irq_num, 2); + timer_generate_update(TEMP_TIMER_DEV); + timer_resume(TEMP_TIMER_DEV); + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: ENABLE_STEPPER_DRIVER_INTERRUPT(); break; + case TEMP_TIMER_NUM: ENABLE_TEMPERATURE_INTERRUPT(); break; + default: break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: DISABLE_STEPPER_DRIVER_INTERRUPT(); break; + case TEMP_TIMER_NUM: DISABLE_TEMPERATURE_INTERRUPT(); break; + default: break; + } +} + +static inline bool timer_irq_enabled(const timer_dev * const dev, const uint8 interrupt) { + return bool(*bb_perip(&(dev->regs).adv->DIER, interrupt)); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: return timer_irq_enabled(STEP_TIMER_DEV, STEP_TIMER_CHAN); + case TEMP_TIMER_NUM: return timer_irq_enabled(TEMP_TIMER_DEV, TEMP_TIMER_CHAN); + } + return false; +} + +timer_dev* get_timer_dev(int number) { + switch (number) { + #if STM32_HAVE_TIMER(1) + case 1: return &timer1; + #endif + #if STM32_HAVE_TIMER(2) + case 2: return &timer2; + #endif + #if STM32_HAVE_TIMER(3) + case 3: return &timer3; + #endif + #if STM32_HAVE_TIMER(4) + case 4: return &timer4; + #endif + #if STM32_HAVE_TIMER(5) + case 5: return &timer5; + #endif + #if STM32_HAVE_TIMER(6) + case 6: return &timer6; + #endif + #if STM32_HAVE_TIMER(7) + case 7: return &timer7; + #endif + #if STM32_HAVE_TIMER(8) + case 8: return &timer8; + #endif + #if STM32_HAVE_TIMER(9) + case 9: return &timer9; + #endif + #if STM32_HAVE_TIMER(10) + case 10: return &timer10; + #endif + #if STM32_HAVE_TIMER(11) + case 11: return &timer11; + #endif + #if STM32_HAVE_TIMER(12) + case 12: return &timer12; + #endif + #if STM32_HAVE_TIMER(13) + case 13: return &timer14; + #endif + #if STM32_HAVE_TIMER(14) + case 14: return &timer14; + #endif + } +} + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h new file mode 100644 index 0000000000..98542f8374 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/HAL_timers_Stm32f1.h @@ -0,0 +1,171 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifndef _HAL_TIMERS_STM32F1_H +#define _HAL_TIMERS_STM32F1_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +/** + * TODO: Check and confirm what timer we will use for each Temps and stepper driving. + * We should probable drive temps with PWM. + */ +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint16_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFF + +#define HAL_TIMER_RATE (F_CPU) // frequency of timers peripherals + +#define STEP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts +#define TEMP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts + +#if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8) + #define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4 +#else + #define STEP_TIMER_NUM 5 // for other boards, five is fine. +#endif +#define TEMP_TIMER_NUM 2 // index of timer to use for temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_PRESCALE 18 // prescaler for setting stepper timer, 4Mhz +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +timer_dev* get_timer_dev(int number); +#define TIMER_DEV(num) get_timer_dev(num) +#define STEP_TIMER_DEV TIMER_DEV(STEP_TIMER_NUM) +#define TEMP_TIMER_DEV TIMER_DEV(TEMP_TIMER_NUM) + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() timer_enable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() timer_disable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() timer_enable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN) +#define DISABLE_TEMPERATURE_INTERRUPT() timer_disable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN) + +#define HAL_timer_get_count(timer_num) timer_get_count(TIMER_DEV(timer_num)) + +// TODO change this + + +#define HAL_TEMP_TIMER_ISR extern "C" void tempTC_Handler(void) +#define HAL_STEP_TIMER_ISR extern "C" void stepTC_Handler(void) + +extern "C" void tempTC_Handler(void); +extern "C" void stepTC_Handler(void); + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- +/* +static HardwareTimer StepperTimer(STEP_TIMER_NUM); +static HardwareTimer TempTimer(TEMP_TIMER_NUM); +*/ +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +/** + * NOTE: By default libmaple sets ARPE = 1, which means the Auto reload register is preloaded (will only update with an update event) + * Thus we have to pause the timer, update the value, refresh, resume the timer. + * That seems like a big waste of time and may be better to change the timer config to ARPE = 0, so ARR can be updated any time. + * We are using a Channel in each timer in Capture/Compare mode. We could also instead use the Time Update Event Interrupt, but need to disable ARPE + * so we can change the ARR value on the fly (without calling refresh), and not get an interrupt right there because we caused an UEV. + * This mode pretty much makes 2 timers unusable for PWM since they have their counts updated all the time on ISRs. + * The way Marlin manages timer interrupts doesn't make for an efficient usage in STM32F1 + * Todo: Look at that possibility later. + */ + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + //compare = MIN(compare, HAL_TIMER_TYPE_MAX); + switch (timer_num) { + case STEP_TIMER_NUM: + timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, compare); + return; + case TEMP_TIMER_NUM: + timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, compare); + return; + default: + return; + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: + return timer_get_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN); + case TEMP_TIMER_NUM: + return timer_get_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN); + default: + return 0; + } +} + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: + timer_set_count(STEP_TIMER_DEV, 0); + timer_generate_update(STEP_TIMER_DEV); + return; + case TEMP_TIMER_NUM: + timer_set_count(TEMP_TIMER_DEV, 0); + timer_generate_update(TEMP_TIMER_DEV); + return; + default: + return; + } +} + +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F1/README.md b/Marlin/src/HAL/HAL_STM32F1/README.md new file mode 100644 index 0000000000..a28000f030 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/README.md @@ -0,0 +1,34 @@ +# This HAL is for STM32F103 boards used with libmaple/stm32duino Arduino core. + +# This HAL is in development. Currently has been tested in Malyan M200 (103CBT6), Chitu 3d (103ZET6), and custom boards(103VET6). + +### The stm32 core needs a modification in the file util.h to avoid conflict with Marlin macros for Debug. +Since only 1 file needs change in the stm32duino core, it's preferable over making changes to Marlin. + + +After these lines: +<> +#else +#define ASSERT_FAULT(exp) (void)((0)) +#endif +<> + +Add the following 3 lines: +<> +#undef DEBUG_NONE +#undef DEBUG_FAULT +#undef DEBUG_ALL +<> + +### Main developers: +Victorpv +xC000005 + + +### Most up to date repository for this HAL: +https://github.com/victorpv/Marlin/tree/bugfix-2.0.x + +PRs should only be sent to Marlin bugfix-2.0.x branch once tested in printing so not to introduce new bugs. +For testing/dev, you can submit to the above branch + + diff --git a/Marlin/src/HAL/HAL_STM32F1/SanityCheck.h b/Marlin/src/HAL/HAL_STM32F1/SanityCheck.h new file mode 100644 index 0000000000..40917f03fe --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/SanityCheck.h @@ -0,0 +1,72 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +/** + * Test Re-ARM specific configuration values for errors at compile-time. + */ +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !PWM_PIN(SPINDLE_LASER_PWM_PIN) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif SPINDLE_LASER_POWERUP_DELAY < 0 + #error "SPINDLE_LASER_POWERUP_DELAY must be positive" + #elif SPINDLE_LASER_POWERDOWN_DELAY < 0 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be positive" + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for STM32F1. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_STM32F1/binary.h b/Marlin/src/HAL/HAL_STM32F1/binary.h new file mode 100644 index 0000000000..70d5ead723 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/binary.h @@ -0,0 +1 @@ +#include "bit_constants.h" diff --git a/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h b/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h new file mode 100644 index 0000000000..27ef0a487c --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/endstop_interrupts.h @@ -0,0 +1,87 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Endstop interrupts for Libmaple STM32F1 based targets. + * + * On STM32F, all pins support external interrupt capability. + * Any pin can be used for external interrupts, but there are some restrictions. + * At most 16 different external interrupts can be used at one time. + * Further, you can’t just pick any 16 pins to use. This is because every pin on the STM32 + * connects to what is called an EXTI line, and only one pin per EXTI line can be used for external interrupts at a time + * Check the Reference Manual of the MCU to confirm which line is used by each pin + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.update(); } + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(X_MAX_PIN, endstop_ISR, CHANGE); // assign it + #endif + #if HAS_X_MIN + attachInterrupt(X_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(Y_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(Y_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(Z_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(Z_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(Z2_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F1/fastio_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/fastio_Stm32f1.h new file mode 100644 index 0000000000..d6683e36ee --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/fastio_Stm32f1.h @@ -0,0 +1,58 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Fast I/O interfaces for STM32F1 + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#ifndef _FASTIO_STM32F1_H +#define _FASTIO_STM32F1_H + +#include + +#define READ(IO) (PIN_MAP[IO].gpio_device->regs->IDR & (1U << PIN_MAP[IO].gpio_bit) ? HIGH : LOW) +#define WRITE(IO,V) (PIN_MAP[IO].gpio_device->regs->BSRR = (1U << PIN_MAP[IO].gpio_bit) << (16 * !(bool)V)) +#define TOGGLE(IO) (PIN_MAP[IO].gpio_device->regs->ODR = PIN_MAP[IO].gpio_device->regs->ODR ^ (1U << PIN_MAP[IO].gpio_bit)) +#define WRITE_VAR(IO,V) WRITE(IO,V) + +#define _GET_MODE(IO) gpio_get_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit) +#define _SET_MODE(IO,M) gpio_set_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit, M) +#define _SET_OUTPUT(IO) _SET_MODE(IO, GPIO_OUTPUT_PP) + +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +#define SET_INPUT(IO) _SET_MODE(IO, GPIO_INPUT_FLOATING) +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, GPIO_INPUT_PU) +#define SET_OUTPUT(IO) OUT_WRITE(IO,LOW) + +#define GET_INPUT(IO) (_GET_MODE(IO) == GPIO_INPUT_FLOATING || _GET_MODE(IO) == GPIO_INPUT_ANALOG || _GET_MODE(IO) == GPIO_INPUT_PU || _GET_MODE(IO) == GPIO_INPUT_PD) +#define GET_OUTPUT(IO) (_GET_MODE(IO) == GPIO_OUTPUT_PP) +#define GET_TIMER(IO) (PIN_MAP[IO].timer_device != NULL) + +/** + * TODO: Write a macro to test if PIN is PWM or not. + */ +#define PWM_PIN(p) true + +#endif // _FASTIO_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F1/persistent_store_flash.cpp b/Marlin/src/HAL/HAL_STM32F1/persistent_store_flash.cpp new file mode 100644 index 0000000000..ad29a1be47 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/persistent_store_flash.cpp @@ -0,0 +1,107 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * persistent_store_flash.cpp + * HAL for stm32duino and compatible (STM32F1) + * Implementation of EEPROM settings in SDCard + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +// This is for EEPROM emulation in flash +#if ENABLED(EEPROM_SETTINGS) && ENABLED(FLASH_EEPROM_EMULATION) + +#include "../shared/persistent_store_api.h" + +#include +#include + +// Store settings in the last two pages +// Flash pages must be erased before writing, so keep track. +bool firstWrite = false; +uint32_t pageBase = EEPROM_START_ADDRESS; + +bool PersistentStore::access_start() { + firstWrite = true; + return true; +} + +bool PersistentStore::access_finish() { + FLASH_Lock(); + firstWrite = false; + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, const size_t size, uint16_t *crc) { + FLASH_Status status; + + if (firstWrite) { + FLASH_Unlock(); + status = FLASH_ErasePage(EEPROM_PAGE0_BASE); + if (status != FLASH_COMPLETE) return true; + status = FLASH_ErasePage(EEPROM_PAGE1_BASE); + if (status != FLASH_COMPLETE) return true; + firstWrite = false; + } + + // First write full words + int i = 0; + int wordsToWrite = size / sizeof(uint16_t); + uint16_t* wordBuffer = (uint16_t *)value; + while (wordsToWrite) { + status = FLASH_ProgramHalfWord(pageBase + pos + (i * 2), wordBuffer[i]); + if (status != FLASH_COMPLETE) return true; + wordsToWrite--; + i++; + } + + // Now, write any remaining single byte + if (size & 1) { + uint16_t temp = value[size - 1]; + status = FLASH_ProgramHalfWord(pageBase + pos + i, temp); + if (status != FLASH_COMPLETE) return true; + } + + crc16(crc, value, size); + pos += ((size + 1) & ~1); + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { + for (uint16_t i = 0; i < size; i++) { + byte* accessPoint = (byte*)(pageBase + pos + i); + uint8_t c = *accessPoint; + if (writing) value[i] = c; + crc16(crc, &c, 1); + } + pos += ((size + 1) & ~1); + return false; +} + +size_t PersistentStore::capacity() { return E2END + 1; } + +#endif // EEPROM_SETTINGS && EEPROM FLASH +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/persistent_store_sdcard.cpp b/Marlin/src/HAL/HAL_STM32F1/persistent_store_sdcard.cpp new file mode 100644 index 0000000000..349abba246 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/persistent_store_sdcard.cpp @@ -0,0 +1,86 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) && DISABLED(FLASH_EEPROM_EMULATION) + +#include "../shared/persistent_store_api.h" + +#include "../../sd/cardreader.h" + +#define HAL_STM32F1_EEPROM_SIZE 4096 +char HAL_STM32F1_eeprom_content[HAL_STM32F1_EEPROM_SIZE]; + +char eeprom_filename[] = "eeprom.dat"; + +bool PersistentStore::access_start() { + if (!card.cardOK) return false; + int16_t bytes_read = 0; + constexpr char eeprom_zero = 0xFF; + card.openFile(eeprom_filename, true); + bytes_read = card.read(HAL_STM32F1_eeprom_content, HAL_STM32F1_EEPROM_SIZE); + if (bytes_read < 0) return false; + for (; bytes_read < HAL_STM32F1_EEPROM_SIZE; bytes_read++) + HAL_STM32F1_eeprom_content[bytes_read] = eeprom_zero; + card.closefile(); + return true; +} + +bool PersistentStore::access_finish() { + if (!card.cardOK) return false; + card.openFile(eeprom_filename, true); + int16_t bytes_written = card.write(HAL_STM32F1_eeprom_content, HAL_STM32F1_EEPROM_SIZE); + card.closefile(); + return (bytes_written == HAL_STM32F1_EEPROM_SIZE); +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, const size_t size, uint16_t *crc) { + for (int i = 0; i < size; i++) + HAL_STM32F1_eeprom_content[pos + i] = value[i]; + crc16(crc, value, size); + pos += size; + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { + for (int i = 0; i < size; i++) { + uint8_t c = HAL_STM32F1_eeprom_content[pos + i]; + if (writing) value[i] = c; + crc16(crc, &c, 1); + } + pos += size; + return false; +} + +size_t PersistentStore::capacity() { return HAL_STM32F1_EEPROM_SIZE; } + +#endif // EEPROM_SETTINGS + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/pinsDebug.h b/Marlin/src/HAL/HAL_STM32F1/pinsDebug.h new file mode 100644 index 0000000000..e5022f79a4 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/pinsDebug.h @@ -0,0 +1 @@ +#error Debug pins is not supported on this Platform! diff --git a/Marlin/src/HAL/HAL_STM32F1/spi_pins.h b/Marlin/src/HAL/HAL_STM32F1/spi_pins.h new file mode 100644 index 0000000000..f834cea3c2 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/spi_pins.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + * + * Any PIN can be used for Chip Select (SS) + */ +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 +#define SS_PIN PA4 + +#endif // SPI_PINS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F1/stm32f1_flag_script.py b/Marlin/src/HAL/HAL_STM32F1/stm32f1_flag_script.py new file mode 100644 index 0000000000..0610ce132a --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/stm32f1_flag_script.py @@ -0,0 +1,55 @@ +from __future__ import print_function +import sys + +#dynamic build flags for generic compile options +if __name__ == "__main__": + args = " ".join([ "-std=gnu11", + "-std=gnu++11", + "-Os", + "-mcpu=cortex-m3", + "-mthumb", + + "-ffreestanding", + "-fsigned-char", + "-fno-move-loop-invariants", + "-fno-strict-aliasing", + + "--specs=nano.specs", + "--specs=nosys.specs", + + "-IMarlin/src/HAL", + + "-MMD", + "-MP", + "-DTARGET_STM32F1" + ]) + + for i in range(1, len(sys.argv)): + args += " " + sys.argv[i] + + print(args) + +# extra script for linker options +else: + from SCons.Script import DefaultEnvironment + env = DefaultEnvironment() + env.Append( + ARFLAGS=["rcs"], + + ASFLAGS=["-x", "assembler-with-cpp"], + + CXXFLAGS=[ + "-fabi-version=0", + "-fno-use-cxa-atexit", + "-fno-threadsafe-statics" + ], + LINKFLAGS=[ + "-Os", + "-mcpu=cortex-m3", + "-ffreestanding", + "-mthumb", + "--specs=nano.specs", + "--specs=nosys.specs", + "-u_printf_float", + ], + ) diff --git a/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.cpp b/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.cpp new file mode 100644 index 0000000000..101ad5ca5e --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.cpp @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include +#include "watchdog_Stm32f1.h" + +void watchdogSetup(void) { + // do whatever. don't remove this function. +} + +/** + * @brief Initialized the independent hardware watchdog. + * + * @return No return + * + * @details The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and 625 reload value (counts down to 0) + */ +void watchdog_init(void) { + //iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD); +} + +#endif // USE_WATCHDOG + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.h b/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.h new file mode 100644 index 0000000000..f307950c76 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F1/watchdog_Stm32f1.h @@ -0,0 +1,55 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifndef WATCHDOG_STM32F1_H +#define WATCHDOG_STM32F1_H + +#include + +#include "../../inc/MarlinConfig.h" + +/** + * The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and + * 625 reload value (counts down to 0) + * use 1250 for 8 seconds + */ +#define STM32F1_WD_RELOAD 625 + +// Arduino STM32F1 core now has watchdog support + +// Initialize watchdog with a 4 second countdown time +void watchdog_init(); + +// Reset watchdog. MUST be called at least every 4 seconds after the +// first watchdog_init or STM32F1 will reset. +inline void watchdog_reset() { + #if PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heart beat indicator + #endif + iwdg_feed(); +} + +#endif // WATCHDOG_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.cpp b/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.cpp new file mode 100644 index 0000000000..7be880ace0 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.cpp @@ -0,0 +1,571 @@ +/** + ****************************************************************************** + * @file EEPROM/EEPROM_Emulation/src/eeprom.c + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file provides all the EEPROM emulation firmware functions. + ****************************************************************************** + * @attention + * + *

© Copyright © 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup EEPROM_Emulation + * @{ + */ +#if defined(STM32F4) || defined(STM32F4xx) + +/* Includes ------------------------------------------------------------------*/ +#include "eeprom_emul.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Global variable used to store variable value in read sequence */ +uint16_t DataVar = 0; + +/* Virtual address defined by the user: 0xFFFF value is prohibited */ +uint16_t VirtAddVarTab[NB_OF_VAR]; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +static HAL_StatusTypeDef EE_Format(void); +static uint16_t EE_FindValidPage(uint8_t Operation); +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_VerifyPageFullyErased(uint32_t Address); + +/** + * @brief Restore the pages to a known good state in case of page's status + * corruption after a power loss. + * @param None. + * @retval - Flash error code: on write Flash error + * - FLASH_COMPLETE: on success + */ +uint16_t EE_Initialize(void) { + uint16_t PageStatus0 = 6, PageStatus1 = 6; + uint16_t VarIdx = 0; + uint16_t EepromStatus = 0, ReadStatus = 0; + int16_t x = -1; + HAL_StatusTypeDef FlashStatus; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + + /* Get Page0 status */ + PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); + /* Get Page1 status */ + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + /* Check for invalid header states and repair if necessary */ + switch (PageStatus0) { + case ERASED: + if (PageStatus1 == VALID_PAGE) { /* Page0 erased, Page1 valid */ + /* Erase Page0 */ + if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) { + return FlashStatus; + } + } + } + else if (PageStatus1 == RECEIVE_DATA) { /* Page0 erased, Page1 receive */ + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Mark Page1 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else { /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + break; + + case RECEIVE_DATA: + if (PageStatus1 == VALID_PAGE) { /* Page0 receive, Page1 valid */ + /* Transfer data from Page1 to Page0 */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + if (VarIdx != x) { + /* Read the last variables' updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page0 */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page0 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + else if (PageStatus1 == ERASED) { /* Page0 receive, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Mark Page0 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + break; + + case VALID_PAGE: + if (PageStatus1 == VALID_PAGE) { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else if (PageStatus1 == ERASED) { /* Page0 valid, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + else { /* Page0 valid, Page1 receive */ + /* Transfer data from Page0 to Page1 */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + + if (VarIdx != x) { + /* Read the last variables' updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page1 */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page1 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + break; + + default: /* Any other state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + break; + } + + return HAL_OK; +} + +/** + * @brief Verify if specified page is fully erased. + * @param Address: page address + * This parameter can be one of the following values: + * @arg PAGE0_BASE_ADDRESS: Page0 base address + * @arg PAGE1_BASE_ADDRESS: Page1 base address + * @retval page fully erased status: + * - 0: if Page not erased + * - 1: if Page erased + */ +uint16_t EE_VerifyPageFullyErased(uint32_t Address) { + uint32_t ReadStatus = 1; + uint16_t AddressValue = 0x5555; + /* Check each active page address starting from end */ + while (Address <= PAGE0_END_ADDRESS) { + /* Get the current location content to be compared with virtual address */ + AddressValue = (*(__IO uint16_t*)Address); + /* Compare the read address with the virtual address */ + if (AddressValue != ERASED) { + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + /* Next address location */ + Address += 4; + } + /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */ + return ReadStatus; +} + +/** + * @brief Returns the last stored variable data, if found, which correspond to + * the passed virtual address + * @param VirtAddress: Variable virtual address + * @param Data: Global variable contains the read variable value + * @retval Success or error status: + * - 0: if variable was found + * - 1: if the variable was not found + * - NO_VALID_PAGE: if no valid page was found. + */ +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) { + uint16_t ValidPage = PAGE0; + uint16_t AddressValue = 0x5555, ReadStatus = 1; + uint32_t Address = EEPROM_START_ADDRESS, PageStartAddress = EEPROM_START_ADDRESS; + + /* Get active Page for read operation */ + ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start Address */ + PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); + + /* Get the valid Page end Address */ + Address = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE)); + + /* Check each active page address starting from end */ + while (Address > (PageStartAddress + 2)) { + /* Get the current location content to be compared with virtual address */ + AddressValue = (*(__IO uint16_t*)Address); + + /* Compare the read address with the virtual address */ + if (AddressValue == VirtAddress) { + /* Get content of Address-2 which is variable value */ + *Data = (*(__IO uint16_t*)(Address - 2)); + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + else /* Next address location */ + Address -= 4; + } + /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */ + return ReadStatus; +} + +/** + * @brief Writes/upadtes variable data in EEPROM. + * @param VirtAddress: Variable virtual address + * @param Data: 16 bit data to be written + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data) { + /* Write the variable virtual address and value in the EEPROM */ + uint16_t Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + + /* In case the EEPROM active page is full */ + if (Status == PAGE_FULL) /* Perform Page transfer */ + Status = EE_PageTransfer(VirtAddress, Data); + + /* Return last operation status */ + return Status; +} + +/** + * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE + * @param None + * @retval Status of the last operation (Flash write or erase) done during + * EEPROM formating + */ +static HAL_StatusTypeDef EE_Format(void) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + pEraseInit.Sector = PAGE1_ID; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + + return HAL_OK; +} + +/** + * @brief Find valid Page for write or read operation + * @param Operation: operation to achieve on the valid page. + * This parameter can be one of the following values: + * @arg READ_FROM_VALID_PAGE: read operation from valid page + * @arg WRITE_IN_VALID_PAGE: write operation from valid page + * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case + * of no valid page was found + */ +static uint16_t EE_FindValidPage(uint8_t Operation) { + uint16_t PageStatus0 = 6, PageStatus1 = 6; + + /* Get Page0 actual status */ + PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); + + /* Get Page1 actual status */ + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + /* Write or read operation */ + switch (Operation) { + case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */ + if (PageStatus1 == VALID_PAGE) { + /* Page0 receiving data */ + if (PageStatus0 == RECEIVE_DATA) return PAGE0; /* Page0 valid */ + else return PAGE1; /* Page1 valid */ + } + else if (PageStatus0 == VALID_PAGE) { + /* Page1 receiving data */ + if (PageStatus1 == RECEIVE_DATA) return PAGE1; /* Page1 valid */ + else return PAGE0; /* Page0 valid */ + } + else + return NO_VALID_PAGE; /* No valid Page */ + + case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */ + if (PageStatus0 == VALID_PAGE) + return PAGE0; /* Page0 valid */ + else if (PageStatus1 == VALID_PAGE) + return PAGE1; /* Page1 valid */ + else + return NO_VALID_PAGE; /* No valid Page */ + + default: + return PAGE0; /* Page0 valid */ + } +} + +/** + * @brief Verify if active page is full and Writes variable in EEPROM. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint16_t ValidPage = PAGE0; + uint32_t Address = EEPROM_START_ADDRESS, PageEndAddress = EEPROM_START_ADDRESS+PAGE_SIZE; + + /* Get valid Page for write operation */ + ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start Address */ + Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); + + /* Get the valid Page end Address */ + PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 1) + (uint32_t)((ValidPage + 1) * PAGE_SIZE)); + + /* Check each active page address starting from begining */ + while (Address < PageEndAddress) { + /* Verify if Address and Address+2 contents are 0xFFFFFFFF */ + if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF) { + /* Set variable data */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address, Data); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + /* Set variable virtual address */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address + 2, VirtAddress); + /* Return program operation status */ + return FlashStatus; + } + else /* Next address location */ + Address += 4; + } + + /* Return PAGE_FULL in case the valid page is full */ + return PAGE_FULL; +} + +/** + * @brief Transfers last updated variables data from the full Page to + * an empty one. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint32_t NewPageAddress = EEPROM_START_ADDRESS; + uint16_t OldPageId=0; + uint16_t ValidPage = PAGE0, VarIdx = 0; + uint16_t EepromStatus = 0, ReadStatus = 0; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + /* Get active Page for read operation */ + ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + + if (ValidPage == PAGE1) { /* Page1 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE0_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE1_ID; + } + else if (ValidPage == PAGE0) { /* Page0 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE1_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE0_ID; + } + else + return NO_VALID_PAGE; /* No valid Page */ + + /* Set the new Page status to RECEIVE_DATA status */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, RECEIVE_DATA); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Write the variable passed as parameter in the new active page */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + + /* Transfer process: transfer variables from old to the new active page */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (VirtAddVarTab[VarIdx] != VirtAddress) { /* Check each variable except the one passed as parameter */ + /* Read the other last variable updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the new active page */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = OldPageId; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + /* Erase the old Page: Set old Page status to ERASED status */ + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Set new Page status to VALID_PAGE status */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Return last operation flash status */ + return FlashStatus; +} + +#endif // STM32F4 || STM32F4xx + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.h b/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.h new file mode 100644 index 0000000000..a7e3e0f012 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/EEPROM_Emul/eeprom_emul.h @@ -0,0 +1,117 @@ +/** + ****************************************************************************** + * @file EEPROM/EEPROM_Emulation/inc/eeprom.h + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file contains all the functions prototypes for the EEPROM + * emulation firmware library. + ****************************************************************************** + * @attention + * + *

© Copyright � 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __EEEPROM_EMUL_H +#define __EEEPROM_EMUL_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- +#include "../../../inc/MarlinConfig.h" +#include "../HAL.h" + +/* Exported constants --------------------------------------------------------*/ +/* EEPROM emulation firmware error codes */ +#define EE_OK (uint32_t)HAL_OK +#define EE_ERROR (uint32_t)HAL_ERROR +#define EE_BUSY (uint32_t)HAL_BUSY +#define EE_TIMEOUT (uint32_t)HAL_TIMEOUT + +/* Define the size of the sectors to be used */ +#define PAGE_SIZE (uint32_t)0x4000 /* Page size = 16KByte */ + +/* Device voltage range supposed to be [2.7V to 3.6V], the operation will + be done by word */ +#define VOLTAGE_RANGE (uint8_t)VOLTAGE_RANGE_3 + +/* EEPROM start address in Flash */ +#define EEPROM_START_ADDRESS ((uint32_t)0x08078000) /* EEPROM emulation start address: + after 480KByte of used Flash memory */ + +/* Pages 0 and 1 base and end addresses */ +#define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x0000)) +#define PAGE0_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1))) +#define PAGE0_ID FLASH_SECTOR_1 + +#define PAGE1_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x4000)) +#define PAGE1_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1))) +#define PAGE1_ID FLASH_SECTOR_2 + +/* Used Flash pages for EEPROM emulation */ +#define PAGE0 ((uint16_t)0x0000) +#define PAGE1 ((uint16_t)0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/ + +/* No valid page define */ +#define NO_VALID_PAGE ((uint16_t)0x00AB) + +/* Page status definitions */ +#define ERASED ((uint16_t)0xFFFF) /* Page is empty */ +#define RECEIVE_DATA ((uint16_t)0xEEEE) /* Page is marked to receive data */ +#define VALID_PAGE ((uint16_t)0x0000) /* Page containing valid data */ + +/* Valid pages in read and write defines */ +#define READ_FROM_VALID_PAGE ((uint8_t)0x00) +#define WRITE_IN_VALID_PAGE ((uint8_t)0x01) + +/* Page full define */ +#define PAGE_FULL ((uint8_t)0x80) + +/* Variables' number */ +#define NB_OF_VAR ((uint16_t)4096) + +/* Exported types ------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +uint16_t EE_Initialize(void); +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); + +#endif /* __EEEPROM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp b/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp new file mode 100644 index 0000000000..19853171fe --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp @@ -0,0 +1,143 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +/** + * Description: functions for I2C connected external EEPROM. + * Not platform dependent. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) && DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "EEPROM_Emul/eeprom_emul.h" + + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- +static bool eeprom_initialized = false; +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// FLASH_FLAG_PGSERR (Programming Sequence Error) was renamed to +// FLASH_FLAG_ERSERR (Erasing Sequence Error) in STM32F4 +// #define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR + +// -------------------------------------------------------------------------- +// EEPROM +// -------------------------------------------------------------------------- + + +void eeprom_init() { + if (!eeprom_initialized) { + HAL_FLASH_Unlock(); + + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + /* EEPROM Init */ + if (EE_Initialize() != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); + eeprom_initialized = true; + } +} + +void eeprom_write_byte(unsigned char *pos, unsigned char value) { + uint16_t eeprom_address = (unsigned) pos; + + eeprom_init(); + + HAL_FLASH_Unlock(); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + if (EE_WriteVariable(eeprom_address, (uint16_t) value) != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); +} + +unsigned char eeprom_read_byte(unsigned char *pos) { + uint16_t data = 0xFF; + uint16_t eeprom_address = (unsigned)pos; + + eeprom_init(); + + if (EE_ReadVariable(eeprom_address, &data) != EE_OK) { + return (unsigned char)data; + } + return (unsigned char)data; +} + +void eeprom_read_block(void *__dst, const void *__src, size_t __n) { + uint16_t data = 0xFF; + uint16_t eeprom_address = (unsigned) __src; + + eeprom_init(); + + for (uint8_t c = 0; c < __n; c++) { + EE_ReadVariable(eeprom_address+c, &data); + *((uint8_t*)__dst + c) = data; + } +} + +void eeprom_update_block(const void *__src, void *__dst, size_t __n) { + +} + +#endif // ENABLED(EEPROM_SETTINGS) && DISABLED(I2C_EEPROM) && DISABLED(SPI_EEPROM) +#endif // STM32F4 || STM32F4xx + diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL.cpp b/Marlin/src/HAL/HAL_STM32F4/HAL.cpp new file mode 100644 index 0000000000..c79af5859a --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL.cpp @@ -0,0 +1,133 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +//#include + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +/* VGPV Done with defines +// disable interrupts +void cli(void) { noInterrupts(); } + +// enable interrupts +void sei(void) { interrupts(); } +*/ + +void HAL_clear_reset_source(void) { __HAL_RCC_CLEAR_RESET_FLAGS(); } + +uint8_t HAL_get_reset_source (void) { + if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) return RST_WATCHDOG; + + if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) return RST_SOFTWARE; + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) return RST_EXTERNAL; + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) return RST_POWER_ON; + return 0; +} + +void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +// return free memory between end of heap (or end bss) and whatever is current + +/* +#include "wirish/syscalls.c" +//extern caddr_t _sbrk(int incr); +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) +#endif + +extern "C" { + static int freeMemory() { + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); + } + int freeMemory() { + int free_memory; + int heap_end = (int)_sbrk(0); + free_memory = ((int)&free_memory) - ((int)heap_end); + return free_memory; + } +} +*/ + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + HAL_adc_result = analogRead(adc_pin); +} + +uint16_t HAL_adc_get_result(void) { + return HAL_adc_result; +} + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL.h b/Marlin/src/HAL/HAL_STM32F4/HAL.h new file mode 100644 index 0000000000..c7565e47ab --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL.h @@ -0,0 +1,251 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _HAL_STM32F4_H +#define _HAL_STM32F4_H + +#define CPU_32_BIT +#undef DEBUG_NONE + +#ifndef vsnprintf_P + #define vsnprintf_P vsnprintf +#endif + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +#include "Arduino.h" + +#ifdef USBCON + #include +#endif + +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" +#include "fastio_STM32F4.h" +#include "watchdog_STM32F4.h" + +#include "HAL_timers_STM32F4.h" + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +//Serial override +//extern HalSerial usb_serial; + +#if SERIAL_PORT == 0 + #error "Serial port 0 does not exist" +#endif + +#if !WITHIN(SERIAL_PORT, -1, 6) + #error "SERIAL_PORT must be from -1 to 6" +#endif +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 1 + #define MYSERIAL0 SerialUART1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 SerialUART2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 SerialUART3 +#elif SERIAL_PORT == 4 + #define MYSERIAL0 SerialUART4 +#elif SERIAL_PORT == 5 + #define MYSERIAL0 SerialUART5 +#elif SERIAL_PORT == 6 + #define MYSERIAL0 SerialUART6 +#endif + +#ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == 0 + #error "Serial port 0 does not exist" + #endif + + #if !WITHIN(SERIAL_PORT_2, -1, 6) + #error "SERIAL_PORT_2 must be from -1 to 6" + #elif SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different than SERIAL_PORT" + #endif + #define NUM_SERIAL 2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 SerialUSB + #elif SERIAL_PORT_2 == 1 + #define MYSERIAL1 SerialUART1 + #elif SERIAL_PORT_2 == 2 + #define MYSERIAL1 SerialUART2 + #elif SERIAL_PORT_2 == 3 + #define MYSERIAL1 SerialUART3 + #elif SERIAL_PORT_2 == 4 + #define MYSERIAL1 SerialUART4 + #elif SERIAL_PORT_2 == 5 + #define MYSERIAL1 SerialUART5 + #elif SERIAL_PORT_2 == 6 + #define MYSERIAL1 SerialUART6 + #endif +#else + #define NUM_SERIAL 1 +#endif + +#define _BV(b) (1 << (b)) + +/** + * TODO: review this to return 1 for pins that are not analog input + */ +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) (p) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() +#define cli() __disable_irq() +#define sei() __enable_irq() + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef int8_t pin_t; + +#define HAL_SERVO_LIB libServo + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +/** result of last ADC conversion */ +extern uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// Memory related +#define __bss_end __bss_end__ + +/** clear reset reason */ +void HAL_clear_reset_source (void); + +/** reset reason */ +uint8_t HAL_get_reset_source (void); + +void _delay_ms(const int delay); + +/* +extern "C" { + int freeMemory(void); +} +*/ + +extern "C" char* _sbrk(int incr); + +/* +static int freeMemory() { + volatile int top; + top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); + return top; +} +*/ + +static int freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + +// EEPROM + +/** + * TODO: Write all this eeprom stuff. Can emulate eeprom in flash as last resort. + * Wire library should work for i2c eeproms. + */ +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +// ADC + +#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) + +inline void HAL_adc_init(void) {} + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(void); + +/* Todo: Confirm none of this is needed. +uint16_t HAL_getAdcReading(uint8_t chan); + +void HAL_startAdcConversion(uint8_t chan); +uint8_t HAL_pinToAdcChannel(int pin); + +uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); +//uint16_t HAL_getAdcSuperSample(uint8_t chan); + +void HAL_enable_AdcFreerun(void); +//void HAL_disable_AdcFreerun(uint8_t chan); + +*/ + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#endif // _HAL_STM32F4_H diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.cpp b/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.cpp new file mode 100644 index 0000000000..2877e88d54 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.cpp @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "HAL_Servo_STM32F4.h" + +int8_t libServo::attach(const int pin) { + return Servo::attach(pin); +} + +int8_t libServo::attach(const int pin, const int min, const int max) { + return Servo::attach(pin, min, max); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} +#endif // HAS_SERVOS + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.h b/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.h new file mode 100644 index 0000000000..b68910387c --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_Servo_STM32F4.h @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef HAL_SERVO_STM32F4_H +#define HAL_SERVO_STM32F4_H + +#include + +// Inherit and expand on the official library +class libServo : public Servo { +public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); +private: + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; + +#endif // HAL_SERVO_STM32F4_H diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_spi_STM32F4.cpp b/Marlin/src/HAL/HAL_STM32F4/HAL_spi_STM32F4.cpp new file mode 100644 index 0000000000..5e3ff4d9d9 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_spi_STM32F4.cpp @@ -0,0 +1,176 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * Adapted to the STM32F4 HAL + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "../shared/HAL_SPI.h" +#include "pins_arduino.h" +#include "spi_pins.h" +#include "../../core/macros.h" +#include + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +static SPISettings spiConfig; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(SOFTWARE_SPI) + + // -------------------------------------------------------------------------- + // Software SPI + // -------------------------------------------------------------------------- + #error "Software SPI not supported for STM32F4. Use hardware SPI." + +#else + +// -------------------------------------------------------------------------- +// Hardware SPI +// -------------------------------------------------------------------------- + +/** + * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz + */ + +/** + * @brief Begin SPI port setup + * + * @return Nothing + * + * @details Only configures SS pin since libmaple creates and initialize the SPI object + */ +void spiBegin(void) { + #if !PIN_EXISTS(SS) + #error SS_PIN not defined! + #endif + + OUT_WRITE(SS_PIN, HIGH); +} + +/** Configure SPI for specified SPI speed */ +void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 20000000; break; // 13.9mhz=20000000 6.75mhz=10000000 3.38mhz=5000000 .833mhz=1000000 + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 300000; break; + default: clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +/** + * @brief Receives a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +} + +/** + * @brief Receives a number of bytes from the SPI port to a buffer + * + * @param buf Pointer to starting address of buffer to write to. + * @param nbyte Number of bytes to receive. + * @return Nothing + * + * @details Uses DMA + */ +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + + #ifdef STM32GENERIC + SPI.dmaTransfer(0, const_cast(buf), nbyte); + #else + SPI.transfer((uint8_t*)buf, nbyte); + #endif + + SPI.endTransaction(); +} + +/** + * @brief Sends a single byte on SPI port + * + * @param b Byte to send + * + * @details + */ +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); +} + +/** + * @brief Write token and then write from 512 byte buffer to SPI (for SD card) + * + * @param buf Pointer with buffer start address + * @return Nothing + * + * @details Use DMA + */ +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPI.transfer(token); + + #ifdef STM32GENERIC + SPI.dmaSend(const_cast(buf), 512); + #else + SPI.transfer((uint8_t*)buf, (uint8_t*)0, 512); + #endif + + SPI.endTransaction(); +} + +#endif // SOFTWARE_SPI + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.cpp b/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.cpp new file mode 100644 index 0000000000..64da993ef8 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.cpp @@ -0,0 +1,159 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include "HAL_timers_STM32F4.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 2 +#define STEP_TIMER_IRQ_ID TIM5_IRQn +#define TEMP_TIMER_IRQ_ID TIM7_IRQn + +//#define PRESCALER 1 +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +stm32f4_timer_t TimerHandle[NUM_HARDWARE_TIMERS]; + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +bool timers_initialized[NUM_HARDWARE_TIMERS] = {false}; + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + + if (!timers_initialized[timer_num]) { + constexpr uint32_t step_prescaler = STEPPER_TIMER_PRESCALE - 1, + temp_prescaler = TEMP_TIMER_PRESCALE - 1; + switch (timer_num) { + case STEP_TIMER_NUM: + // STEPPER TIMER TIM5 - use a 32bit timer + #ifdef STM32GENERIC + __HAL_RCC_TIM5_CLK_ENABLE(); + TimerHandle[timer_num].handle.Instance = TIM5; + TimerHandle[timer_num].handle.Init.Prescaler = step_prescaler; + TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; + TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + TimerHandle[timer_num].callback = (uint32_t)TC5_Handler; + #else + TimerHandle[timer_num].timer = TIM5; + TimerHandle[timer_num].irqHandle = TC5_Handler; + TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / step_prescaler) / frequency) - 1, step_prescaler); + #endif + HAL_NVIC_SetPriority(STEP_TIMER_IRQ_ID, 6, 0); + break; + + case TEMP_TIMER_NUM: + // TEMP TIMER TIM7 - any available 16bit Timer (1 already used for PWM) + #ifdef STM32GENERIC + __HAL_RCC_TIM7_CLK_ENABLE(); + TimerHandle[timer_num].handle.Instance = TIM7; + TimerHandle[timer_num].handle.Init.Prescaler = temp_prescaler; + TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; + TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + TimerHandle[timer_num].callback = (uint32_t)TC7_Handler; + #else + TimerHandle[timer_num].timer = TIM7; + TimerHandle[timer_num].irqHandle = TC7_Handler; + TimerHandleInit(&TimerHandle[timer_num], (((HAL_TIMER_RATE) / temp_prescaler) / frequency) - 1, temp_prescaler); + #endif + HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_ID, 2, 0); + break; + } + timers_initialized[timer_num] = true; + } + + #ifdef STM32GENERIC + TimerHandle[timer_num].handle.Init.Period = (((HAL_TIMER_RATE) / TimerHandle[timer_num].handle.Init.Prescaler) / frequency) - 1; + if (HAL_TIM_Base_Init(&TimerHandle[timer_num].handle) == HAL_OK) + HAL_TIM_Base_Start_IT(&TimerHandle[timer_num].handle); + #endif +} + +#ifdef STM32GENERIC + extern "C" void TIM5_IRQHandler() { + ((void(*)(void))TimerHandle[0].callback)(); + } + extern "C" void TIM7_IRQHandler() { + ((void(*)(void))TimerHandle[1].callback)(); + } +#endif + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: HAL_NVIC_EnableIRQ(STEP_TIMER_IRQ_ID); break; + case TEMP_TIMER_NUM: HAL_NVIC_EnableIRQ(TEMP_TIMER_IRQ_ID); break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: HAL_NVIC_DisableIRQ(STEP_TIMER_IRQ_ID); break; + case TEMP_TIMER_NUM: HAL_NVIC_DisableIRQ(TEMP_TIMER_IRQ_ID); break; + } + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)STEP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)STEP_TIMER_IRQ_ID) & (uint32_t)0x1F)); + case TEMP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) & (uint32_t)0x1F)); + } + return false; +} + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.h b/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.h new file mode 100644 index 0000000000..83081ed756 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/HAL_timers_STM32F4.h @@ -0,0 +1,134 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _HAL_TIMERS_STM32F4_H +#define _HAL_TIMERS_STM32F4_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define FORCE_INLINE __attribute__((always_inline)) inline + +#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? +#define HAL_TIMER_TYPE_MAX 0xFFFF + +#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals + +#define STEP_TIMER_NUM 0 // index of timer to use for stepper +#define TEMP_TIMER_NUM 1 // index of timer to use for temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +// TODO change this + +#ifdef STM32GENERIC + extern void TC5_Handler(); + extern void TC7_Handler(); + #define HAL_STEP_TIMER_ISR void TC5_Handler() + #define HAL_TEMP_TIMER_ISR void TC7_Handler() +#else + extern void TC5_Handler(stimer_t *htim); + extern void TC7_Handler(stimer_t *htim); + #define HAL_STEP_TIMER_ISR void TC5_Handler(stimer_t *htim) + #define HAL_TEMP_TIMER_ISR void TC7_Handler(stimer_t *htim) +#endif + + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +#ifdef STM32GENERIC + typedef struct { + TIM_HandleTypeDef handle; + uint32_t callback; + } tTimerConfig; + typedef tTimerConfig stm32f4_timer_t; +#else + typedef stimer_t stm32f4_timer_t; +#endif + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +extern stm32f4_timer_t TimerHandle[]; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +FORCE_INLINE static uint32_t HAL_timer_get_count(const uint8_t timer_num) { + return __HAL_TIM_GET_COUNTER(&TimerHandle[timer_num].handle); +} + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { + __HAL_TIM_SET_AUTORELOAD(&TimerHandle[timer_num].handle, compare); + if (HAL_timer_get_count(timer_num) >= compare) + TimerHandle[timer_num].handle.Instance->EGR |= TIM_EGR_UG; // Generate an immediate update interrupt +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + return __HAL_TIM_GET_AUTORELOAD(&TimerHandle[timer_num].handle); +} + +#ifdef STM32GENERIC + FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + if (__HAL_TIM_GET_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE) == SET) + __HAL_TIM_CLEAR_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE); + } +#else + #define HAL_timer_isr_prologue(TIMER_NUM) +#endif + +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_STM32F4_H diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md b/Marlin/src/HAL/HAL_STM32F4/README.md similarity index 100% rename from Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md rename to Marlin/src/HAL/HAL_STM32F4/README.md diff --git a/Marlin/src/HAL/HAL_STM32F4/SanityCheck.h b/Marlin/src/HAL/HAL_STM32F4/SanityCheck.h new file mode 100644 index 0000000000..605eb9cb15 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/SanityCheck.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Test Re-ARM specific configuration values for errors at compile-time. + */ +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !PWM_PIN(SPINDLE_LASER_PWM_PIN) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) + #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" + #elif SPINDLE_LASER_POWERUP_DELAY < 1 + #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." + #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for STM32F4. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h b/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h new file mode 100644 index 0000000000..2ccfd57066 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/endstop_interrupts.h @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.update(); } + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(X_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_X_MIN + attachInterrupt(X_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(Y_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(Y_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(Z_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(Z_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(Z2_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F4/fastio_STM32F4.h b/Marlin/src/HAL/HAL_STM32F4/fastio_STM32F4.h new file mode 100644 index 0000000000..e185344dc2 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/fastio_STM32F4.h @@ -0,0 +1,150 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Fast I/O interfaces for STM32F4 + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#ifndef _FASTIO_STM32F4_H +#define _FASTIO_STM32F4_H + +#define _BV(b) (1 << (b)) + +#define USEABLE_HARDWARE_PWM(p) true + +#define READ(IO) digitalRead(IO) +#define WRITE(IO,V) digitalWrite(IO,V) +#define WRITE_VAR(IO,V) WRITE(IO,V) + +#define _GET_MODE(IO) +#define _SET_MODE(IO,M) pinMode(IO, M) +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ + +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ +#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) + +#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) + +#define GET_INPUT(IO) +#define GET_OUTPUT(IO) +#define GET_TIMER(IO) + +#define PORTA 0 +#define PORTB 1 +#define PORTC 2 +#define PORTD 3 +#define PORTE 4 + +#define _STM32_PIN(_PORT,_PIN) ((PORT##_PORT * 16) + _PIN) + +#define PA0 _STM32_PIN(A, 0) +#define PA1 _STM32_PIN(A, 1) +#define PA2 _STM32_PIN(A, 2) +#define PA3 _STM32_PIN(A, 3) +#define PA4 _STM32_PIN(A, 4) +#define PA5 _STM32_PIN(A, 5) +#define PA6 _STM32_PIN(A, 6) +#define PA7 _STM32_PIN(A, 7) +#define PA8 _STM32_PIN(A, 8) +#define PA9 _STM32_PIN(A, 9) +#define PA10 _STM32_PIN(A, 10) +#define PA11 _STM32_PIN(A, 11) +#define PA12 _STM32_PIN(A, 12) +#define PA13 _STM32_PIN(A, 13) +#define PA14 _STM32_PIN(A, 14) +#define PA15 _STM32_PIN(A, 15) + +#define PB0 _STM32_PIN(B, 0) +#define PB1 _STM32_PIN(B, 1) +#define PB2 _STM32_PIN(B, 2) +#define PB3 _STM32_PIN(B, 3) +#define PB4 _STM32_PIN(B, 4) +#define PB5 _STM32_PIN(B, 5) +#define PB6 _STM32_PIN(B, 6) +#define PB7 _STM32_PIN(B, 7) +#define PB8 _STM32_PIN(B, 8) +#define PB9 _STM32_PIN(B, 9) +#define PB10 _STM32_PIN(B, 10) +#define PB11 _STM32_PIN(B, 11) +#define PB12 _STM32_PIN(B, 12) +#define PB13 _STM32_PIN(B, 13) +#define PB14 _STM32_PIN(B, 14) +#define PB15 _STM32_PIN(B, 15) + +#define PC0 _STM32_PIN(C, 0) +#define PC1 _STM32_PIN(C, 1) +#define PC2 _STM32_PIN(C, 2) +#define PC3 _STM32_PIN(C, 3) +#define PC4 _STM32_PIN(C, 4) +#define PC5 _STM32_PIN(C, 5) +#define PC6 _STM32_PIN(C, 6) +#define PC7 _STM32_PIN(C, 7) +#define PC8 _STM32_PIN(C, 8) +#define PC9 _STM32_PIN(C, 9) +#define PC10 _STM32_PIN(C, 10) +#define PC11 _STM32_PIN(C, 11) +#define PC12 _STM32_PIN(C, 12) +#define PC13 _STM32_PIN(C, 13) +#define PC14 _STM32_PIN(C, 14) +#define PC15 _STM32_PIN(C, 15) + +#define PD0 _STM32_PIN(D, 0) +#define PD1 _STM32_PIN(D, 1) +#define PD2 _STM32_PIN(D, 2) +#define PD3 _STM32_PIN(D, 3) +#define PD4 _STM32_PIN(D, 4) +#define PD5 _STM32_PIN(D, 5) +#define PD6 _STM32_PIN(D, 6) +#define PD7 _STM32_PIN(D, 7) +#define PD8 _STM32_PIN(D, 8) +#define PD9 _STM32_PIN(D, 9) +#define PD10 _STM32_PIN(D, 10) +#define PD11 _STM32_PIN(D, 11) +#define PD12 _STM32_PIN(D, 12) +#define PD13 _STM32_PIN(D, 13) +#define PD14 _STM32_PIN(D, 14) +#define PD15 _STM32_PIN(D, 15) + +#define PE0 _STM32_PIN(E, 0) +#define PE1 _STM32_PIN(E, 1) +#define PE2 _STM32_PIN(E, 2) +#define PE3 _STM32_PIN(E, 3) +#define PE4 _STM32_PIN(E, 4) +#define PE5 _STM32_PIN(E, 5) +#define PE6 _STM32_PIN(E, 6) +#define PE7 _STM32_PIN(E, 7) +#define PE8 _STM32_PIN(E, 8) +#define PE9 _STM32_PIN(E, 9) +#define PE10 _STM32_PIN(E, 10) +#define PE11 _STM32_PIN(E, 11) +#define PE12 _STM32_PIN(E, 12) +#define PE13 _STM32_PIN(E, 13) +#define PE14 _STM32_PIN(E, 14) +#define PE15 _STM32_PIN(E, 15) + +#endif // _FASTIO_STM32F4_H diff --git a/Marlin/src/HAL/HAL_STM32F4/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_STM32F4/persistent_store_eeprom.cpp new file mode 100644 index 0000000000..194cd21bc6 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/persistent_store_eeprom.cpp @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +#include "../shared/persistent_store_api.h" + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +bool PersistentStore::access_start() { return true; } +bool PersistentStore::access_finish() { return true; } + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +size_t PersistentStore::capacity() { return E2END + 1; } + +#endif // EEPROM_SETTINGS +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/pinsDebug.h b/Marlin/src/HAL/HAL_STM32F4/pinsDebug.h new file mode 100644 index 0000000000..e5022f79a4 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/pinsDebug.h @@ -0,0 +1 @@ +#error Debug pins is not supported on this Platform! diff --git a/Marlin/src/HAL/HAL_STM32F4/spi_pins.h b/Marlin/src/HAL/HAL_STM32F4/spi_pins.h new file mode 100644 index 0000000000..f178ac8107 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/spi_pins.h @@ -0,0 +1,41 @@ +/** +* Marlin 3D Printer Firmware +* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +*/ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + * + */ +#ifndef SCK_PIN + #define SCK_PIN PA5 +#endif +#ifndef MISO_PIN + #define MISO_PIN PA6 +#endif +#ifndef MOSI_PIN + #define MOSI_PIN PA7 +#endif +#ifndef SS_PIN + #define SS_PIN PA8 +#endif + +#endif // SPI_PINS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.cpp b/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.cpp new file mode 100644 index 0000000000..f5dd6bdfae --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.cpp @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if defined(STM32F4) || defined(STM32F4xx) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + + #include "watchdog_STM32F4.h" + + IWDG_HandleTypeDef hiwdg; + + void watchdog_init() { + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock + hiwdg.Init.Reload = 4095; //4095 counts = 4 seconds at 1024Hz + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { + //Error_Handler(); + } + } + + void watchdog_reset() { + /* Refresh IWDG: reload counter */ + if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { + /* Refresh Error */ + //Error_Handler(); + } + else { + #if PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heart beat indicator + #endif + } + } + +#endif // USE_WATCHDOG + +#endif // STM32F4 || STM32F4xx diff --git a/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.h b/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.h new file mode 100644 index 0000000000..89295a78e1 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F4/watchdog_STM32F4.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef WATCHDOG_STM32F4_H +#define WATCHDOG_STM32F4_H + +#include "../../inc/MarlinConfig.h" + +extern IWDG_HandleTypeDef hiwdg; + +void watchdog_init(); +void watchdog_reset(); + +#endif // WATCHDOG_STM32F1_H diff --git a/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.cpp b/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.cpp new file mode 100644 index 0000000000..d28577758c --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.cpp @@ -0,0 +1,571 @@ +/** + ****************************************************************************** + * @file EEPROM/EEPROM_Emulation/src/eeprom.c + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file provides all the EEPROM emulation firmware functions. + ****************************************************************************** + * @attention + * + *

© Copyright 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/** @addtogroup EEPROM_Emulation + * @{ + */ +#ifdef STM32F7 + +/* Includes ------------------------------------------------------------------*/ +#include "eeprom_emul.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Global variable used to store variable value in read sequence */ +uint16_t DataVar = 0; + +/* Virtual address defined by the user: 0xFFFF value is prohibited */ +uint16_t VirtAddVarTab[NB_OF_VAR]; + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +static HAL_StatusTypeDef EE_Format(void); +static uint16_t EE_FindValidPage(uint8_t Operation); +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_VerifyPageFullyErased(uint32_t Address); + +/** + * @brief Restore the pages to a known good state in case of page's status + * corruption after a power loss. + * @param None. + * @retval - Flash error code: on write Flash error + * - FLASH_COMPLETE: on success + */ +uint16_t EE_Initialize(void) { + uint16_t PageStatus0 = 6, PageStatus1 = 6; + uint16_t VarIdx = 0; + uint16_t EepromStatus = 0, ReadStatus = 0; + int16_t x = -1; + HAL_StatusTypeDef FlashStatus; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + + /* Get Page0 status */ + PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); + /* Get Page1 status */ + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + /* Check for invalid header states and repair if necessary */ + switch (PageStatus0) { + case ERASED: + if (PageStatus1 == VALID_PAGE) { /* Page0 erased, Page1 valid */ + /* Erase Page0 */ + if(!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) { + return FlashStatus; + } + } + } + else if (PageStatus1 == RECEIVE_DATA) { /* Page0 erased, Page1 receive */ + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Mark Page1 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else { /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + break; + + case RECEIVE_DATA: + if (PageStatus1 == VALID_PAGE) { /* Page0 receive, Page1 valid */ + /* Transfer data from Page1 to Page0 */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + if (VarIdx != x) { + /* Read the last variables' updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page0 */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page0 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + else if (PageStatus1 == ERASED) { /* Page0 receive, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Mark Page0 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + break; + + case VALID_PAGE: + if (PageStatus1 == VALID_PAGE) { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else if (PageStatus1 == ERASED) { /* Page0 valid, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + else { /* Page0 valid, Page1 receive */ + /* Transfer data from Page0 to Page1 */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + + if (VarIdx != x) { + /* Read the last variables' updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page1 */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page1 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + break; + + default: /* Any other state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + break; + } + + return HAL_OK; +} + +/** + * @brief Verify if specified page is fully erased. + * @param Address: page address + * This parameter can be one of the following values: + * @arg PAGE0_BASE_ADDRESS: Page0 base address + * @arg PAGE1_BASE_ADDRESS: Page1 base address + * @retval page fully erased status: + * - 0: if Page not erased + * - 1: if Page erased + */ +uint16_t EE_VerifyPageFullyErased(uint32_t Address) { + uint32_t ReadStatus = 1; + uint16_t AddressValue = 0x5555; + /* Check each active page address starting from end */ + while (Address <= PAGE0_END_ADDRESS) { + /* Get the current location content to be compared with virtual address */ + AddressValue = (*(__IO uint16_t*)Address); + /* Compare the read address with the virtual address */ + if (AddressValue != ERASED) { + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + /* Next address location */ + Address += 4; + } + /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */ + return ReadStatus; +} + +/** + * @brief Returns the last stored variable data, if found, which correspond to + * the passed virtual address + * @param VirtAddress: Variable virtual address + * @param Data: Global variable contains the read variable value + * @retval Success or error status: + * - 0: if variable was found + * - 1: if the variable was not found + * - NO_VALID_PAGE: if no valid page was found. + */ +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) { + uint16_t ValidPage = PAGE0; + uint16_t AddressValue = 0x5555, ReadStatus = 1; + uint32_t Address = EEPROM_START_ADDRESS, PageStartAddress = EEPROM_START_ADDRESS; + + /* Get active Page for read operation */ + ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start Address */ + PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); + + /* Get the valid Page end Address */ + Address = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE)); + + /* Check each active page address starting from end */ + while (Address > (PageStartAddress + 2)) { + /* Get the current location content to be compared with virtual address */ + AddressValue = (*(__IO uint16_t*)Address); + + /* Compare the read address with the virtual address */ + if (AddressValue == VirtAddress) { + /* Get content of Address-2 which is variable value */ + *Data = (*(__IO uint16_t*)(Address - 2)); + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + else /* Next address location */ + Address -= 4; + } + /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */ + return ReadStatus; +} + +/** + * @brief Writes/upadtes variable data in EEPROM. + * @param VirtAddress: Variable virtual address + * @param Data: 16 bit data to be written + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data) { + /* Write the variable virtual address and value in the EEPROM */ + uint16_t Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + + /* In case the EEPROM active page is full */ + if (Status == PAGE_FULL) /* Perform Page transfer */ + Status = EE_PageTransfer(VirtAddress, Data); + + /* Return last operation status */ + return Status; +} + +/** + * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE + * @param None + * @retval Status of the last operation (Flash write or erase) done during + * EEPROM formating + */ +static HAL_StatusTypeDef EE_Format(void) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + pEraseInit.Sector = PAGE1_ID; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + + return HAL_OK; +} + +/** + * @brief Find valid Page for write or read operation + * @param Operation: operation to achieve on the valid page. + * This parameter can be one of the following values: + * @arg READ_FROM_VALID_PAGE: read operation from valid page + * @arg WRITE_IN_VALID_PAGE: write operation from valid page + * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case + * of no valid page was found + */ +static uint16_t EE_FindValidPage(uint8_t Operation) { + uint16_t PageStatus0 = 6, PageStatus1 = 6; + + /* Get Page0 actual status */ + PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS); + + /* Get Page1 actual status */ + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + /* Write or read operation */ + switch (Operation) { + case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */ + if (PageStatus1 == VALID_PAGE) { + /* Page0 receiving data */ + if (PageStatus0 == RECEIVE_DATA) return PAGE0; /* Page0 valid */ + else return PAGE1; /* Page1 valid */ + } + else if (PageStatus0 == VALID_PAGE) { + /* Page1 receiving data */ + if (PageStatus1 == RECEIVE_DATA) return PAGE1; /* Page1 valid */ + else return PAGE0; /* Page0 valid */ + } + else + return NO_VALID_PAGE; /* No valid Page */ + + case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */ + if (PageStatus0 == VALID_PAGE) + return PAGE0; /* Page0 valid */ + else if (PageStatus1 == VALID_PAGE) + return PAGE1; /* Page1 valid */ + else + return NO_VALID_PAGE; /* No valid Page */ + + default: + return PAGE0; /* Page0 valid */ + } +} + +/** + * @brief Verify if active page is full and Writes variable in EEPROM. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint16_t ValidPage = PAGE0; + uint32_t Address = EEPROM_START_ADDRESS, PageEndAddress = EEPROM_START_ADDRESS+PAGE_SIZE; + + /* Get valid Page for write operation */ + ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start Address */ + Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE)); + + /* Get the valid Page end Address */ + PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 1) + (uint32_t)((ValidPage + 1) * PAGE_SIZE)); + + /* Check each active page address starting from begining */ + while (Address < PageEndAddress) { + /* Verify if Address and Address+2 contents are 0xFFFFFFFF */ + if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF) { + /* Set variable data */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address, Data); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + /* Set variable virtual address */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address + 2, VirtAddress); + /* Return program operation status */ + return FlashStatus; + } + else /* Next address location */ + Address += 4; + } + + /* Return PAGE_FULL in case the valid page is full */ + return PAGE_FULL; +} + +/** + * @brief Transfers last updated variables data from the full Page to + * an empty one. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) { + HAL_StatusTypeDef FlashStatus = HAL_OK; + uint32_t NewPageAddress = EEPROM_START_ADDRESS; + uint16_t OldPageId=0; + uint16_t ValidPage = PAGE0, VarIdx = 0; + uint16_t EepromStatus = 0, ReadStatus = 0; + uint32_t SectorError = 0; + FLASH_EraseInitTypeDef pEraseInit; + + /* Get active Page for read operation */ + ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + + if (ValidPage == PAGE1) { /* Page1 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE0_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE1_ID; + } + else if (ValidPage == PAGE0) { /* Page0 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE1_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE0_ID; + } + else + return NO_VALID_PAGE; /* No valid Page */ + + /* Set the new Page status to RECEIVE_DATA status */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, RECEIVE_DATA); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Write the variable passed as parameter in the new active page */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + + /* Transfer process: transfer variables from old to the new active page */ + for (VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (VirtAddVarTab[VarIdx] != VirtAddress) { /* Check each variable except the one passed as parameter */ + /* Read the other last variable updates */ + ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the new active page */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = OldPageId; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + /* Erase the old Page: Set old Page status to ERASED status */ + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Set new Page status to VALID_PAGE status */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Return last operation flash status */ + return FlashStatus; +} + +#endif // STM32F7 + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.h b/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.h new file mode 100644 index 0000000000..8a45608ed9 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/EEPROM_Emul/eeprom_emul.h @@ -0,0 +1,118 @@ +/** + ****************************************************************************** + * @file EEPROM/EEPROM_Emulation/inc/eeprom.h + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file contains all the functions prototypes for the EEPROM + * emulation firmware library. + ****************************************************************************** + * @attention + * + *

© Copyright © 2016 STMicroelectronics International N.V. + * All rights reserved.

+ * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __EEEPROM_EMUL_H +#define __EEEPROM_EMUL_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- +#include "../../../inc/MarlinConfig.h" +#include "../HAL.h" + +/* Exported constants --------------------------------------------------------*/ +/* EEPROM emulation firmware error codes */ +#define EE_OK (uint32_t)HAL_OK +#define EE_ERROR (uint32_t)HAL_ERROR +#define EE_BUSY (uint32_t)HAL_BUSY +#define EE_TIMEOUT (uint32_t)HAL_TIMEOUT + +/* Define the size of the sectors to be used */ +#define PAGE_SIZE (uint32_t)0x4000 /* Page size = 16KByte */ + +/* Device voltage range supposed to be [2.7V to 3.6V], the operation will + be done by word */ +#define VOLTAGE_RANGE (uint8_t)VOLTAGE_RANGE_3 + +/* EEPROM start address in Flash */ +#define EEPROM_START_ADDRESS ((uint32_t)0x08100000) /* EEPROM emulation start address: + from sector2 : after 16KByte of used + Flash memory */ + +/* Pages 0 and 1 base and end addresses */ +#define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x0000)) +#define PAGE0_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1))) +#define PAGE0_ID FLASH_SECTOR_1 + +#define PAGE1_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x4000)) +#define PAGE1_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1))) +#define PAGE1_ID FLASH_SECTOR_2 + +/* Used Flash pages for EEPROM emulation */ +#define PAGE0 ((uint16_t)0x0000) +#define PAGE1 ((uint16_t)0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/ + +/* No valid page define */ +#define NO_VALID_PAGE ((uint16_t)0x00AB) + +/* Page status definitions */ +#define ERASED ((uint16_t)0xFFFF) /* Page is empty */ +#define RECEIVE_DATA ((uint16_t)0xEEEE) /* Page is marked to receive data */ +#define VALID_PAGE ((uint16_t)0x0000) /* Page containing valid data */ + +/* Valid pages in read and write defines */ +#define READ_FROM_VALID_PAGE ((uint8_t)0x00) +#define WRITE_IN_VALID_PAGE ((uint8_t)0x01) + +/* Page full define */ +#define PAGE_FULL ((uint8_t)0x80) + +/* Variables' number */ +#define NB_OF_VAR ((uint16_t)4096) + +/* Exported types ------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +uint16_t EE_Initialize(void); +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); + +#endif /* __EEEPROM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp b/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp new file mode 100644 index 0000000000..0a7f5193f0 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef STM32F7 + +/** + * Description: functions for I2C connected external EEPROM. + * Not platform dependent. + */ + +#include "../../inc/MarlinConfig.h" + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "EEPROM_Emul/eeprom_emul.h" + + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- +static bool eeprom_initialized = false; +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +// FLASH_FLAG_PGSERR (Programming Sequence Error) was renamed to +// FLASH_FLAG_ERSERR (Erasing Sequence Error) in STM32F7 +#define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR + +// -------------------------------------------------------------------------- +// EEPROM +// -------------------------------------------------------------------------- + + +void eeprom_init() { + if (!eeprom_initialized) { + HAL_FLASH_Unlock(); + + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + /* EEPROM Init */ + if (EE_Initialize() != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); + eeprom_initialized = true; + } +} + +void eeprom_write_byte(unsigned char *pos, unsigned char value) { + uint16_t eeprom_address = (unsigned) pos; + + eeprom_init(); + + HAL_FLASH_Unlock(); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + if (EE_WriteVariable(eeprom_address, (uint16_t) value) != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); +} + +unsigned char eeprom_read_byte(unsigned char *pos) { + uint16_t data = 0xFF; + uint16_t eeprom_address = (unsigned)pos; + + eeprom_init(); + + if (EE_ReadVariable(eeprom_address, &data) != EE_OK) { + return (unsigned char)data; + } + return (unsigned char)data; +} + +void eeprom_read_block(void *__dst, const void *__src, size_t __n) { + uint16_t data = 0xFF; + uint16_t eeprom_address = (unsigned) __src; + + eeprom_init(); + + for (uint8_t c = 0; c < __n; c++) { + EE_ReadVariable(eeprom_address+c, &data); + *((uint8_t*)__dst + c) = data; + } +} + +void eeprom_update_block(const void *__src, void *__dst, size_t __n) { + +} + +#endif // STM32F7 + diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL.cpp new file mode 100644 index 0000000000..a5c4f39429 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL.cpp @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +#ifdef STM32F7 + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +//#include + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +/* VGPV Done with defines +// disable interrupts +void cli(void) { noInterrupts(); } + +// enable interrupts +void sei(void) { interrupts(); } +*/ + +void HAL_clear_reset_source(void) { __HAL_RCC_CLEAR_RESET_FLAGS(); } + +uint8_t HAL_get_reset_source (void) { + if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) + return RST_WATCHDOG; + + if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) + return RST_SOFTWARE; + + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) + return RST_EXTERNAL; + + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) + return RST_POWER_ON; + return 0; +} + +void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +// return free memory between end of heap (or end bss) and whatever is current + +/* +#include "wirish/syscalls.c" +//extern caddr_t _sbrk(int incr); +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) +#endif + +extern "C" { + static int freeMemory() { + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); + } + int freeMemory() { + int free_memory; + int heap_end = (int)_sbrk(0); + free_memory = ((int)&free_memory) - ((int)heap_end); + return free_memory; + } +} +*/ + +// -------------------------------------------------------------------------- +// ADC +// -------------------------------------------------------------------------- + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + HAL_adc_result = analogRead(adc_pin); +} + +uint16_t HAL_adc_get_result(void) { + return HAL_adc_result; +} + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL.h b/Marlin/src/HAL/HAL_STM32F7/HAL.h new file mode 100644 index 0000000000..2eb8f89b79 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL.h @@ -0,0 +1,240 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _HAL_STM32F7_H +#define _HAL_STM32F7_H + +#define CPU_32_BIT +#undef DEBUG_NONE + +#ifndef vsnprintf_P + #define vsnprintf_P vsnprintf +#endif + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +#include "Arduino.h" + +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio_STM32F7.h" +#include "watchdog_STM32F7.h" + +#include "HAL_timers_STM32F7.h" + + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +//Serial override +//extern HalSerial usb_serial; + +#if !WITHIN(SERIAL_PORT, -1, 6) + #error "SERIAL_PORT must be from -1 to 6" +#endif +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 1 + #define MYSERIAL0 SerialUART1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 SerialUART2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 SerialUART3 +#elif SERIAL_PORT == 4 + #define MYSERIAL0 SerialUART4 +#elif SERIAL_PORT == 5 + #define MYSERIAL0 SerialUART5 +#elif SERIAL_PORT == 6 + #define MYSERIAL0 SerialUART6 +#endif + +#ifdef SERIAL_PORT_2 + #if !WITHIN(SERIAL_PORT_2, -1, 6) + #error "SERIAL_PORT_2 must be from -1 to 6" + #elif SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 must be different than SERIAL_PORT" + #endif + #define NUM_SERIAL 2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 SerialUSB + #elif SERIAL_PORT_2 == 1 + #define MYSERIAL1 SerialUART1 + #elif SERIAL_PORT_2 == 2 + #define MYSERIAL1 SerialUART2 + #elif SERIAL_PORT_2 == 3 + #define MYSERIAL1 SerialUART3 + #elif SERIAL_PORT_2 == 4 + #define MYSERIAL1 SerialUART4 + #elif SERIAL_PORT_2 == 5 + #define MYSERIAL1 SerialUART5 + #elif SERIAL_PORT_2 == 6 + #define MYSERIAL1 SerialUART6 + #endif +#else + #define NUM_SERIAL 1 +#endif + +#define _BV(b) (1 << (b)) + +/** + * TODO: review this to return 1 for pins that are not analog input + */ +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) (p) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() +#define cli() __disable_irq() +#define sei() __enable_irq() + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef int8_t pin_t; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +/** result of last ADC conversion */ +extern uint16_t HAL_adc_result; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + + + +// Memory related +#define __bss_end __bss_end__ + +/** clear reset reason */ +void HAL_clear_reset_source (void); + +/** reset reason */ +uint8_t HAL_get_reset_source (void); + +void _delay_ms(const int delay); + +/* +extern "C" { + int freeMemory(void); +} +*/ + +extern "C" char* _sbrk(int incr); +/* +static int freeMemory() { + volatile int top; + top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); + return top; +} +*/ +static int freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + + +// EEPROM + +/** + * TODO: Write all this eeprom stuff. Can emulate eeprom in flash as last resort. + * Wire library should work for i2c eeproms. + */ +void eeprom_write_byte(unsigned char *pos, unsigned char value); +unsigned char eeprom_read_byte(unsigned char *pos); +void eeprom_read_block (void *__dst, const void *__src, size_t __n); +void eeprom_update_block (const void *__src, void *__dst, size_t __n); + +// ADC + +#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) + +inline void HAL_adc_init(void) {} + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(void); + +/* Todo: Confirm none of this is needed. +uint16_t HAL_getAdcReading(uint8_t chan); + +void HAL_startAdcConversion(uint8_t chan); +uint8_t HAL_pinToAdcChannel(int pin); + +uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); +//uint16_t HAL_getAdcSuperSample(uint8_t chan); + +void HAL_enable_AdcFreerun(void); +//void HAL_disable_AdcFreerun(uint8_t chan); + +*/ + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#endif // _HAL_STM32F7_H diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.cpp new file mode 100644 index 0000000000..43d95e9059 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.cpp @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef STM32F7 + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "HAL_Servo_STM32F7.h" + +int8_t libServo::attach(const int pin) { + if (this->servoIndex >= MAX_SERVOS) return -1; + return Servo::attach(pin); +} + +int8_t libServo::attach(const int pin, const int min, const int max) { + return Servo::attach(pin, min, max); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} +#endif // HAS_SERVOS + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.h b/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.h new file mode 100644 index 0000000000..14ba0528b0 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_Servo_STM32F7.h @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef HAL_SERVO_STM32F7_H +#define HAL_SERVO_STM32F7_H + +#include <../../libraries/Servo/src/Servo.h> + +// Inherit and expand on the official library +class libServo : public Servo { +public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); +private: + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; + +#endif // HAL_SERVO_STM32F7_H diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp new file mode 100644 index 0000000000..094ceda2da --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_spi_STM32F7.cpp @@ -0,0 +1,165 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (C) 2009 by William Greiman + */ + +/** + * Adapted to the STM32F7 HAL + */ + +#ifdef STM32F7 + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" +#include "../shared/HAL_SPI.h" +#include "pins_arduino.h" +#include "spi_pins.h" +#include "../../core/macros.h" +#include + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +static SPISettings spiConfig; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if ENABLED(SOFTWARE_SPI) + // -------------------------------------------------------------------------- + // Software SPI + // -------------------------------------------------------------------------- + #error "Software SPI not supported for STM32F7. Use hardware SPI." + +#else + +// -------------------------------------------------------------------------- +// Hardware SPI +// -------------------------------------------------------------------------- + +/** + * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz + */ + +/** + * @brief Begin SPI port setup + * + * @return Nothing + * + * @details Only configures SS pin since libmaple creates and initialize the SPI object + */ +void spiBegin(void) { + #if !PIN_EXISTS(SS) + #error SS_PIN not defined! + #endif + + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); +} + +/** Configure SPI for specified SPI speed */ +void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 20000000; break; // 13.9mhz=20000000 6.75mhz=10000000 3.38mhz=5000000 .833mhz=1000000 + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 300000; break; + default: + clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +/** + * @brief Receives a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +} + +/** + * @brief Receives a number of bytes from the SPI port to a buffer + * + * @param buf Pointer to starting address of buffer to write to. + * @param nbyte Number of bytes to receive. + * @return Nothing + * + * @details Uses DMA + */ +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.dmaTransfer(0, const_cast(buf), nbyte); + SPI.endTransaction(); +} + +/** + * @brief Sends a single byte on SPI port + * + * @param b Byte to send + * + * @details + */ +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); +} + +/** + * @brief Write token and then write from 512 byte buffer to SPI (for SD card) + * + * @param buf Pointer with buffer start address + * @return Nothing + * + * @details Use DMA + */ +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPI.transfer(token); + SPI.dmaSend(const_cast(buf), 512); + SPI.endTransaction(); +} + +#endif // SOFTWARE_SPI + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp new file mode 100644 index 0000000000..3d48f5c291 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.cpp @@ -0,0 +1,156 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef STM32F7 + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "HAL.h" + +#include "HAL_timers_STM32F7.h" + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 2 + +//#define PRESCALER 1 +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +tTimerConfig timerConfig[NUM_HARDWARE_TIMERS]; + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + + +bool timers_initialized[NUM_HARDWARE_TIMERS] = {false}; + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + + if (!timers_initialized[timer_num]) { + switch (timer_num) { + case STEP_TIMER_NUM: + //STEPPER TIMER TIM5 //use a 32bit timer + __HAL_RCC_TIM5_CLK_ENABLE(); + timerConfig[0].timerdef.Instance = TIM5; + timerConfig[0].timerdef.Init.Prescaler = (STEPPER_TIMER_PRESCALE); + timerConfig[0].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; + timerConfig[0].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + timerConfig[0].IRQ_Id = TIM5_IRQn; + timerConfig[0].callback = (uint32_t)TC5_Handler; + HAL_NVIC_SetPriority(timerConfig[0].IRQ_Id, 1, 0); + pinMode(STEPPER_ENABLE_PIN,OUTPUT); + digitalWrite(STEPPER_ENABLE_PIN,LOW); + break; + case TEMP_TIMER_NUM: + //TEMP TIMER TIM7 // any available 16bit Timer (1 already used for PWM) + __HAL_RCC_TIM7_CLK_ENABLE(); + timerConfig[1].timerdef.Instance = TIM7; + timerConfig[1].timerdef.Init.Prescaler = (TEMP_TIMER_PRESCALE); + timerConfig[1].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; + timerConfig[1].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + timerConfig[1].IRQ_Id = TIM7_IRQn; + timerConfig[1].callback = (uint32_t)TC7_Handler; + HAL_NVIC_SetPriority(timerConfig[1].IRQ_Id, 2, 0); + break; + } + timers_initialized[timer_num] = true; + } + + timerConfig[timer_num].timerdef.Init.Period = (((HAL_TIMER_RATE) / timerConfig[timer_num].timerdef.Init.Prescaler) / frequency) - 1; + + if (HAL_TIM_Base_Init(&timerConfig[timer_num].timerdef) == HAL_OK) + HAL_TIM_Base_Start_IT(&timerConfig[timer_num].timerdef); +} + +//forward the interrupt +extern "C" void TIM5_IRQHandler() { + ((void(*)(void))timerConfig[0].callback)(); +} +extern "C" void TIM7_IRQHandler() { + ((void(*)(void))timerConfig[1].callback)(); +} + +void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { + __HAL_TIM_SetAutoreload(&timerConfig[timer_num].timerdef, compare); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + HAL_NVIC_EnableIRQ(timerConfig[timer_num].IRQ_Id); +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + HAL_NVIC_DisableIRQ(timerConfig[timer_num].IRQ_Id); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + return __HAL_TIM_GetAutoreload(&timerConfig[timer_num].timerdef); +} + +uint32_t HAL_timer_get_count(const uint8_t timer_num) { + return __HAL_TIM_GetCounter(&timerConfig[timer_num].timerdef); +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + if (__HAL_TIM_GET_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE) == SET) { + __HAL_TIM_CLEAR_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE); + } +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + const uint32_t IRQ_Id = uint32_t(timerConfig[timer_num].IRQ_Id); + return NVIC->ISER[IRQ_Id >> 5] & _BV32(IRQ_Id & 0x1F); +} + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h new file mode 100644 index 0000000000..92f0215fce --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/HAL_timers_STM32F7.h @@ -0,0 +1,105 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef _HAL_TIMERS_STM32F7_H +#define _HAL_TIMERS_STM32F7_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define FORCE_INLINE __attribute__((always_inline)) inline + +#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? +#define HAL_TIMER_TYPE_MAX 0xFFFF + +#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals + +#define STEP_TIMER_NUM 0 // index of timer to use for stepper +#define TEMP_TIMER_NUM 1 // index of timer to use for temperature +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz + +#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) +#define TEMP_ISR_ENABLED() HAL_timer_interrupt_enabled(TEMP_TIMER_NUM) +// TODO change this + + +extern void TC5_Handler(); +extern void TC7_Handler(); +#define HAL_STEP_TIMER_ISR void TC5_Handler() +#define HAL_TEMP_TIMER_ISR void TC7_Handler() + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef struct { + TIM_HandleTypeDef timerdef; + IRQn_Type IRQ_Id; + uint32_t callback; +} tTimerConfig; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +//extern const tTimerConfig timerConfig[]; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare); +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); +uint32_t HAL_timer_get_count(const uint8_t timer_num); +void HAL_timer_isr_prologue(const uint8_t timer_num); +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_STM32F7_H diff --git a/Marlin/src/HAL/HAL_STM32F7/README.md b/Marlin/src/HAL/HAL_STM32F7/README.md new file mode 100644 index 0000000000..2fb39bf25a --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/README.md @@ -0,0 +1,28 @@ +# This HAL is for the STM32F765 board "The Borg" used with STM32Generic Arduino core by danieleff. + +# Original core is located at: + +https://github.com/danieleff/STM32GENERIC + +but i have not committed the changes needed for the Borg there yet, so please use: + +https://github.com/Spawn32/STM32GENERIC + +Unzip it into [Arduino]/hardware folder + + +Download the latest GNU ARM Embedded Toolchain: + +https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads + +(The one in Arduino dosen't support STM32F7). + +Change compiler.path in platform.txt to point to that you downloaded. + +# This HAL is in development. +# Currently only tested on "The Borg". + +You will also need the latest Arduino 1.9.0-beta or newer. + +This HAL is a modified version of Chris Barr's Picoprint STM32F4 HAL, so shouldn't be to hard to get it to work on a F4. + diff --git a/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h b/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h new file mode 100644 index 0000000000..5bd0793a4d --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/SanityCheck.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Test Re-ARM specific configuration values for errors at compile-time. + */ +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE requires SPINDLE_LASER_ENABLE_PIN." + #elif SPINDLE_DIR_CHANGE && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN not defined." + #elif ENABLED(SPINDLE_LASER_PWM) && PIN_EXISTS(SPINDLE_LASER_PWM) + #if !PWM_PIN(SPINDLE_LASER_PWM_PIN) + #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." + #elif !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) + #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" + #elif SPINDLE_LASER_POWERUP_DELAY < 1 + #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." + #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." + #elif !defined(SPINDLE_LASER_PWM_INVERT) + #error "SPINDLE_LASER_PWM_INVERT missing." + #elif !defined(SPEED_POWER_SLOPE) || !defined(SPEED_POWER_INTERCEPT) || !defined(SPEED_POWER_MIN) || !defined(SPEED_POWER_MAX) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif PIN_EXISTS(CASE_LIGHT) && SPINDLE_LASER_PWM_PIN == CASE_LIGHT_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CASE_LIGHT_PIN." + #elif PIN_EXISTS(E0_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E0_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E0_AUTO_FAN_PIN." + #elif PIN_EXISTS(E1_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E1_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E1_AUTO_FAN_PIN." + #elif PIN_EXISTS(E2_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E2_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E2_AUTO_FAN_PIN." + #elif PIN_EXISTS(E3_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E3_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN." + #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN." + #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN." + #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN1_PIN." + #elif PIN_EXISTS(FAN2) && SPINDLE_LASER_PWM_PIN == FAN2_PIN + #error "SPINDLE_LASER_PWM_PIN is used FAN2_PIN." + #elif PIN_EXISTS(CONTROLLERFAN) && SPINDLE_LASER_PWM_PIN == CONTROLLERFAN_PIN + #error "SPINDLE_LASER_PWM_PIN is used by CONTROLLERFAN_PIN." + #endif + #endif +#endif // SPINDLE_LASER_ENABLE + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for STM32F7. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp b/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp new file mode 100644 index 0000000000..b29480faf8 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/TMC2660.cpp @@ -0,0 +1,931 @@ +/** + * TMC26XStepper.cpp - - TMC26X Stepper library for Wiring/Arduino + * + * based on the stepper library by Tom Igoe, et. al. + * + * Copyright (c) 2011, Interactive Matter, Marcus Nowotny + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +//#include "Arduino.h" + +#ifdef STM32F7 + +#include +#include +#include "TMC2660.h" + +#include "../../HAL/HAL_STM32F7/HAL.h" +#include "../../core/serial.h" +#include "../../inc/MarlinConfig.h" +#include "../../Marlin.h" +#include "../../module/stepper_indirection.h" +#include "../../module/printcounter.h" +#include "../../libs/duration_t.h" +#include "../../libs/hex_print_routines.h" + + +//some default values used in initialization +#define DEFAULT_MICROSTEPPING_VALUE 32 + +//TMC26X register definitions +#define DRIVER_CONTROL_REGISTER 0x0ul +#define CHOPPER_CONFIG_REGISTER 0x80000ul +#define COOL_STEP_REGISTER 0xA0000ul +#define STALL_GUARD2_LOAD_MEASURE_REGISTER 0xC0000ul +#define DRIVER_CONFIG_REGISTER 0xE0000ul + +#define REGISTER_BIT_PATTERN 0xFFFFFul + +//definitions for the driver control register +#define MICROSTEPPING_PATTERN 0xFul +#define STEP_INTERPOLATION 0x200ul +#define DOUBLE_EDGE_STEP 0x100ul +#define VSENSE 0x40ul +#define READ_MICROSTEP_POSTION 0x0ul +#define READ_STALL_GUARD_READING 0x10ul +#define READ_STALL_GUARD_AND_COOL_STEP 0x20ul +#define READ_SELECTION_PATTERN 0x30ul + +//definitions for the chopper config register +#define CHOPPER_MODE_STANDARD 0x0ul +#define CHOPPER_MODE_T_OFF_FAST_DECAY 0x4000ul +#define T_OFF_PATTERN 0xFul +#define RANDOM_TOFF_TIME 0x2000ul +#define BLANK_TIMING_PATTERN 0x18000ul +#define BLANK_TIMING_SHIFT 15 +#define HYSTERESIS_DECREMENT_PATTERN 0x1800ul +#define HYSTERESIS_DECREMENT_SHIFT 11 +#define HYSTERESIS_LOW_VALUE_PATTERN 0x780ul +#define HYSTERESIS_LOW_SHIFT 7 +#define HYSTERESIS_START_VALUE_PATTERN 0x78ul +#define HYSTERESIS_START_VALUE_SHIFT 4 +#define T_OFF_TIMING_PATERN 0xFul + +//definitions for cool step register +#define MINIMUM_CURRENT_FOURTH 0x8000ul +#define CURRENT_DOWN_STEP_SPEED_PATTERN 0x6000ul +#define SE_MAX_PATTERN 0xF00ul +#define SE_CURRENT_STEP_WIDTH_PATTERN 0x60ul +#define SE_MIN_PATTERN 0xFul + +//definitions for stall guard2 current register +#define STALL_GUARD_FILTER_ENABLED 0x10000ul +#define STALL_GUARD_TRESHHOLD_VALUE_PATTERN 0x17F00ul +#define CURRENT_SCALING_PATTERN 0x1Ful +#define STALL_GUARD_CONFIG_PATTERN 0x17F00ul +#define STALL_GUARD_VALUE_PATTERN 0x7F00ul + +//definitions for the input from the TCM260 +#define STATUS_STALL_GUARD_STATUS 0x1ul +#define STATUS_OVER_TEMPERATURE_SHUTDOWN 0x2ul +#define STATUS_OVER_TEMPERATURE_WARNING 0x4ul +#define STATUS_SHORT_TO_GROUND_A 0x8ul +#define STATUS_SHORT_TO_GROUND_B 0x10ul +#define STATUS_OPEN_LOAD_A 0x20ul +#define STATUS_OPEN_LOAD_B 0x40ul +#define STATUS_STAND_STILL 0x80ul +#define READOUT_VALUE_PATTERN 0xFFC00ul + +#define CPU_32_BIT + +//default values +#define INITIAL_MICROSTEPPING 0x3ul //32th microstepping + +SPIClass SPI_6(SPI6, SPI6_MOSI_PIN, SPI6_MISO_PIN, SPI6_SCK_PIN); + +#define STEPPER_SPI SPI_6 + +//debuging output + +//#define TMC_DEBUG1 + +unsigned char current_scaling = 0; + +/** + * Constructor + * number_of_steps - the steps per rotation + * cs_pin - the SPI client select pin + * dir_pin - the pin where the direction pin is connected + * step_pin - the pin where the step pin is connected + */ +TMC26XStepper::TMC26XStepper(int number_of_steps, int cs_pin, int dir_pin, int step_pin, unsigned int current, unsigned int resistor) { + // We are not started yet + started = false; + + // By default cool step is not enabled + cool_step_enabled = false; + + // Save the pins for later use + this->cs_pin = cs_pin; + this->dir_pin = dir_pin; + this->step_pin = step_pin; + + // Store the current sense resistor value for later use + this->resistor = resistor; + + // Initizalize our status values + this->steps_left = 0; + this->direction = 0; + + // Initialize register values + driver_control_register_value = DRIVER_CONTROL_REGISTER | INITIAL_MICROSTEPPING; + chopper_config_register = CHOPPER_CONFIG_REGISTER; + + // Setting the default register values + driver_control_register_value = DRIVER_CONTROL_REGISTER|INITIAL_MICROSTEPPING; + microsteps = _BV(INITIAL_MICROSTEPPING); + chopper_config_register = CHOPPER_CONFIG_REGISTER; + cool_step_register_value = COOL_STEP_REGISTER; + stall_guard2_current_register_value = STALL_GUARD2_LOAD_MEASURE_REGISTER; + driver_configuration_register_value = DRIVER_CONFIG_REGISTER | READ_STALL_GUARD_READING; + + // Set the current + setCurrent(current); + // Set to a conservative start value + setConstantOffTimeChopper(7, 54, 13,12,1); + // Set a nice microstepping value + setMicrosteps(DEFAULT_MICROSTEPPING_VALUE); + // Save the number of steps + this->number_of_steps = number_of_steps; +} + + +/** + * start & configure the stepper driver + * just must be called. + */ +void TMC26XStepper::start() { + + #ifdef TMC_DEBUG1 + SERIAL_ECHOPGM("\n TMC26X stepper library \n"); + SERIAL_ECHOPAIR("\n CS pin: ", cs_pin); + SERIAL_ECHOPAIR("\n DIR pin: ", dir_pin); + SERIAL_ECHOPAIR("\n STEP pin: ", step_pin); + SERIAL_PRINTF("\n current scaling: %d", current_scaling); + SERIAL_PRINTF("\n Resistor: %d", resistor); + //SERIAL_PRINTF("\n current: %d", current); + SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); + #endif + + //set the pins as output & its initial value + pinMode(step_pin, OUTPUT); + pinMode(dir_pin, OUTPUT); + pinMode(cs_pin, OUTPUT); + //pinMode(STEPPER_ENABLE_PIN, OUTPUT); + digitalWrite(step_pin, LOW); + digitalWrite(dir_pin, LOW); + digitalWrite(cs_pin, HIGH); + + STEPPER_SPI.begin(); + STEPPER_SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); + + //set the initial values + send262(driver_control_register_value); + send262(chopper_config_register); + send262(cool_step_register_value); + send262(stall_guard2_current_register_value); + send262(driver_configuration_register_value); + + //save that we are in running mode + started = true; +} + +/** + * Mark the driver as unstarted to be able to start it again + */ +void TMC26XStepper::un_start() { started = false; } + + +/** + * Sets the speed in revs per minute + */ +void TMC26XStepper::setSpeed(unsigned int whatSpeed) { + this->speed = whatSpeed; + this->step_delay = 60UL * sq(1000UL) / ((unsigned long)this->number_of_steps * (unsigned long)whatSpeed * (unsigned long)this->microsteps); + #ifdef TMC_DEBUG0 // crashes + //SERIAL_PRINTF("Step delay in micros: "); + SERIAL_ECHOPAIR("\nStep delay in micros: ", this->step_delay); + #endif + // Update the next step time + this->next_step_time = this->last_step_time + this->step_delay; +} + +unsigned int TMC26XStepper::getSpeed(void) { return this->speed; } + +/** + * Moves the motor steps_to_move steps. + * Negative indicates the reverse direction. + */ +char TMC26XStepper::step(int steps_to_move) { + if (this->steps_left == 0) { + this->steps_left = ABS(steps_to_move); // how many steps to take + + // determine direction based on whether steps_to_move is + or -: + if (steps_to_move > 0) + this->direction = 1; + else if (steps_to_move < 0) + this->direction = 0; + return 0; + } + return -1; +} + +char TMC26XStepper::move(void) { + // decrement the number of steps, moving one step each time: + if (this->steps_left > 0) { + unsigned long time = micros(); + // move only if the appropriate delay has passed: + + // rem if (time >= this->next_step_time) { + + if (ABS(time - this->last_step_time) > this->step_delay) { + // increment or decrement the step number, + // depending on direction: + if (this->direction == 1) + digitalWrite(step_pin, HIGH); + else { + digitalWrite(dir_pin, HIGH); + digitalWrite(step_pin, HIGH); + } + // get the timeStamp of when you stepped: + this->last_step_time = time; + this->next_step_time = time + this->step_delay; + // decrement the steps left: + steps_left--; + //disable the step & dir pins + digitalWrite(step_pin, LOW); + digitalWrite(dir_pin, LOW); + } + return -1; + } + return 0; +} + +char TMC26XStepper::isMoving(void) { return this->steps_left > 0; } + +unsigned int TMC26XStepper::getStepsLeft(void) { return this->steps_left; } + +char TMC26XStepper::stop(void) { + //note to self if the motor is currently moving + char state = isMoving(); + //stop the motor + this->steps_left = 0; + this->direction = 0; + //return if it was moving + return state; +} + +void TMC26XStepper::setCurrent(unsigned int current) { + unsigned char current_scaling = 0; + //calculate the current scaling from the max current setting (in mA) + float mASetting = (float)current, + resistor_value = (float)this->resistor; + // remove vsense flag + this->driver_configuration_register_value &= ~(VSENSE); + // Derived from I = (cs + 1) / 32 * (Vsense / Rsense) + // leading to cs = 32 * R * I / V (with V = 0,31V oder 0,165V and I = 1000 * current) + // with Rsense = 0,15 + // for vsense = 0,310V (VSENSE not set) + // or vsense = 0,165V (VSENSE set) + current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.31 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 + + // Check if the current scalingis too low + if (current_scaling < 16) { + // Set the csense bit to get a use half the sense voltage (to support lower motor currents) + this->driver_configuration_register_value |= VSENSE; + // and recalculate the current setting + current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.165 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 + #ifdef TMC_DEBUG0 // crashes + //SERIAL_PRINTF("CS (Vsense=1): "); + SERIAL_ECHOPAIR("\nCS (Vsense=1): ",current_scaling); + } else { + //SERIAL_PRINTF("CS: "); + SERIAL_ECHOPAIR("\nCS: ", current_scaling); + #endif + } + + // do some sanity checks + NOMORE(current_scaling, 31); + + // delete the old value + stall_guard2_current_register_value &= ~(CURRENT_SCALING_PATTERN); + // set the new current scaling + stall_guard2_current_register_value |= current_scaling; + // if started we directly send it to the motor + if (started) { + send262(driver_configuration_register_value); + send262(stall_guard2_current_register_value); + } +} + +unsigned int TMC26XStepper::getCurrent(void) { + // Calculate the current according to the datasheet to be on the safe side. + // This is not the fastest but the most accurate and illustrative way. + float result = (float)(stall_guard2_current_register_value & CURRENT_SCALING_PATTERN), + resistor_value = (float)this->resistor, + voltage = (driver_configuration_register_value & VSENSE) ? 0.165 : 0.31; + result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); + return (unsigned int)result; +} + +void TMC26XStepper::setStallGuardThreshold(char stall_guard_threshold, char stall_guard_filter_enabled) { + // We just have 5 bits + LIMIT(stall_guard_threshold, -64, 63); + + // Add trim down to 7 bits + stall_guard_threshold &= 0x7F; + // Delete old stall guard settings + stall_guard2_current_register_value &= ~(STALL_GUARD_CONFIG_PATTERN); + if (stall_guard_filter_enabled) + stall_guard2_current_register_value |= STALL_GUARD_FILTER_ENABLED; + + // Set the new stall guard threshold + stall_guard2_current_register_value |= (((unsigned long)stall_guard_threshold << 8) & STALL_GUARD_CONFIG_PATTERN); + // If started we directly send it to the motor + if (started) send262(stall_guard2_current_register_value); +} + +char TMC26XStepper::getStallGuardThreshold(void) { + unsigned long stall_guard_threshold = stall_guard2_current_register_value & STALL_GUARD_VALUE_PATTERN; + //shift it down to bit 0 + stall_guard_threshold >>= 8; + //convert the value to an int to correctly handle the negative numbers + char result = stall_guard_threshold; + //check if it is negative and fill it up with leading 1 for proper negative number representation + //rem if (result & _BV(6)) { + + if (TEST(result, 6)) result |= 0xC0; + return result; +} + +char TMC26XStepper::getStallGuardFilter(void) { + if (stall_guard2_current_register_value & STALL_GUARD_FILTER_ENABLED) + return -1; + return 0; +} + +/** + * Set the number of microsteps per step. + * 0,2,4,8,16,32,64,128,256 is supported + * any value in between will be mapped to the next smaller value + * 0 and 1 set the motor in full step mode + */ +void TMC26XStepper::setMicrosteps(int number_of_steps) { + long setting_pattern; + //poor mans log + if (number_of_steps >= 256) { + setting_pattern = 0; + microsteps = 256; + } + else if (number_of_steps >= 128) { + setting_pattern = 1; + microsteps = 128; + } + else if (number_of_steps >= 64) { + setting_pattern = 2; + microsteps = 64; + } + else if (number_of_steps >= 32) { + setting_pattern = 3; + microsteps = 32; + } + else if (number_of_steps >= 16) { + setting_pattern = 4; + microsteps = 16; + } + else if (number_of_steps >= 8) { + setting_pattern = 5; + microsteps = 8; + } + else if (number_of_steps >= 4) { + setting_pattern = 6; + microsteps = 4; + } + else if (number_of_steps >= 2) { + setting_pattern = 7; + microsteps = 2; + //1 and 0 lead to full step + } + else if (number_of_steps <= 1) { + setting_pattern = 8; + microsteps = 1; + } + #ifdef TMC_DEBUG0 // crashes + //SERIAL_PRINTF("Microstepping: "); + SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); + #endif + // Delete the old value + this->driver_control_register_value &= 0xFFFF0UL; + // Set the new value + this->driver_control_register_value |= setting_pattern; + + // If started we directly send it to the motor + if (started) send262(driver_control_register_value); + + // Recalculate the stepping delay by simply setting the speed again + this->setSpeed(this->speed); +} + +/** + * returns the effective number of microsteps at the moment + */ +int TMC26XStepper::getMicrosteps(void) { return microsteps; } + +/** + * constant_off_time: The off time setting controls the minimum chopper frequency. + * For most applications an off time within the range of 5μs to 20μs will fit. + * 2...15: off time setting + * + * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the + * duration of the ringing on the sense resistor. For + * 0: min. setting 3: max. setting + * + * fast_decay_time_setting: Fast decay time setting. With CHM=1, these bits control the portion of fast decay for each chopper cycle. + * 0: slow decay only + * 1...15: duration of fast decay phase + * + * sine_wave_offset: Sine wave offset. With CHM=1, these bits control the sine wave offset. + * A positive offset corrects for zero crossing error. + * -3..-1: negative offset 0: no offset 1...12: positive offset + * + * use_current_comparator: Selects usage of the current comparator for termination of the fast decay cycle. + * If current comparator is enabled, it terminates the fast decay cycle in case the current + * reaches a higher negative value than the actual positive value. + * 1: enable comparator termination of fast decay cycle + * 0: end by time only + */ +void TMC26XStepper::setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, unsigned char use_current_comparator) { + // Perform some sanity checks + LIMIT(constant_off_time, 2, 15); + + // Save the constant off time + this->constant_off_time = constant_off_time; + + // Calculate the value acc to the clock cycles + const char blank_value = blank_time >= 54 ? 3 : + blank_time >= 36 ? 2 : + blank_time >= 24 ? 1 : 0; + + LIMIT(fast_decay_time_setting, 0, 15); + LIMIT(sine_wave_offset, -3, 12); + + // Shift the sine_wave_offset + sine_wave_offset += 3; + + // Calculate the register setting + // First of all delete all the values for this + chopper_config_register &= ~(_BV(12) | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); + // Set the constant off pattern + chopper_config_register |= CHOPPER_MODE_T_OFF_FAST_DECAY; + // Set the blank timing value + chopper_config_register |= ((unsigned long)blank_value) << BLANK_TIMING_SHIFT; + // Setting the constant off time + chopper_config_register |= constant_off_time; + // Set the fast decay time + // Set msb + chopper_config_register |= (((unsigned long)(fast_decay_time_setting & 0x8)) << HYSTERESIS_DECREMENT_SHIFT); + // Other bits + chopper_config_register |= (((unsigned long)(fast_decay_time_setting & 0x7)) << HYSTERESIS_START_VALUE_SHIFT); + // Set the sine wave offset + chopper_config_register |= (unsigned long)sine_wave_offset << HYSTERESIS_LOW_SHIFT; + // Using the current comparator? + if (!use_current_comparator) + chopper_config_register |= _BV(12); + + // If started we directly send it to the motor + if (started) { + // rem send262(driver_control_register_value); + send262(chopper_config_register); + } +} + +/** + * constant_off_time: The off time setting controls the minimum chopper frequency. + * For most applications an off time within the range of 5μs to 20μs will fit. + * 2...15: off time setting + * + * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the + * duration of the ringing on the sense resistor. For + * 0: min. setting 3: max. setting + * + * hysteresis_start: Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value HEND. + * 1...8 + * + * hysteresis_end: Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by HDEC. + * The sum HSTRT+HEND must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. + * -3..-1: negative HEND 0: zero HEND 1...12: positive HEND + * + * hysteresis_decrement: Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. + * 0: fast decrement 3: very slow decrement + */ + +void TMC26XStepper::setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement) { + // Perform some sanity checks + LIMIT(constant_off_time, 2, 15); + + // Save the constant off time + this->constant_off_time = constant_off_time; + + // Calculate the value acc to the clock cycles + const char blank_value = blank_time >= 54 ? 3 : + blank_time >= 36 ? 2 : + blank_time >= 24 ? 1 : 0; + + LIMIT(hysteresis_start, 1, 8); + hysteresis_start--; + + LIMIT(hysteresis_start, -3, 12); + + // Shift the hysteresis_end + hysteresis_end += 3; + + LIMIT(hysteresis_decrement, 0, 3); + + //first of all delete all the values for this + chopper_config_register &= ~(CHOPPER_MODE_T_OFF_FAST_DECAY | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); + + //set the blank timing value + chopper_config_register |= ((unsigned long)blank_value) << BLANK_TIMING_SHIFT; + //setting the constant off time + chopper_config_register |= constant_off_time; + //set the hysteresis_start + chopper_config_register |= ((unsigned long)hysteresis_start) << HYSTERESIS_START_VALUE_SHIFT; + //set the hysteresis end + chopper_config_register |= ((unsigned long)hysteresis_end) << HYSTERESIS_LOW_SHIFT; + //set the hystereis decrement + chopper_config_register |= ((unsigned long)blank_value) << BLANK_TIMING_SHIFT; + //if started we directly send it to the motor + if (started) { + //rem send262(driver_control_register_value); + send262(chopper_config_register); + } +} + +/** + * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. + * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, thus it depends on the microstep position. + * With some motors a slightly audible beat can occur between the chopper frequencies, especially when they are near to each other. This typically occurs at a + * few microstep positions within each quarter wave. This effect normally is not audible when compared to mechanical noise generated by ball bearings, etc. + * Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. + * Hint: A common factor, which can cause motor noise, is a bad PCB layout causing coupling of both sense resistor voltages + * (please refer to sense resistor layout hint in chapter 8.1). + * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. + * It modulates the slow decay time setting when switched on by the RNDTF bit. The RNDTF feature further spreads the chopper spectrum, + * reducing electromagnetic emission on single frequencies. + */ +void TMC26XStepper::setRandomOffTime(char value) { + if (value) + chopper_config_register |= RANDOM_TOFF_TIME; + else + chopper_config_register &= ~(RANDOM_TOFF_TIME); + //if started we directly send it to the motor + if (started) { + //rem send262(driver_control_register_value); + send262(chopper_config_register); + } +} + +void TMC26XStepper::setCoolStepConfiguration( + unsigned int lower_SG_threshold, + unsigned int SG_hysteresis, + unsigned char current_decrement_step_size, + unsigned char current_increment_step_size, + unsigned char lower_current_limit) +{ + // Sanitize the input values + NOMORE(lower_SG_threshold, 480); + // Divide by 32 + lower_SG_threshold >>= 5; + NOMORE(SG_hysteresis, 480); + // Divide by 32 + SG_hysteresis >>= 5; + NOMORE(current_decrement_step_size, 3); + NOMORE(current_increment_step_size, 3); + NOMORE(lower_current_limit, 1); + + // Store the lower level in order to enable/disable the cool step + this->cool_step_lower_threshold=lower_SG_threshold; + // If cool step is not enabled we delete the lower value to keep it disabled + if (!this->cool_step_enabled) lower_SG_threshold = 0; + // The good news is that we can start with a complete new cool step register value + // And simply set the values in the register + cool_step_register_value = ((unsigned long)lower_SG_threshold) + | (((unsigned long)SG_hysteresis) << 8) + | (((unsigned long)current_decrement_step_size) << 5) + | (((unsigned long)current_increment_step_size) << 13) + | (((unsigned long)lower_current_limit) << 15) + | COOL_STEP_REGISTER; // Register signature + + //SERIAL_PRINTFln(cool_step_register_value,HEX); + if (started) send262(cool_step_register_value); +} + +void TMC26XStepper::setCoolStepEnabled(boolean enabled) { + // Simply delete the lower limit to disable the cool step + cool_step_register_value &= ~SE_MIN_PATTERN; + // And set it to the proper value if cool step is to be enabled + if (enabled) + cool_step_register_value |= this->cool_step_lower_threshold; + // And save the enabled status + this->cool_step_enabled = enabled; + // Save the register value + if (started) send262(cool_step_register_value); +} + +boolean TMC26XStepper::isCoolStepEnabled(void) { return this->cool_step_enabled; } + +unsigned int TMC26XStepper::getCoolStepLowerSgThreshold() { + // We return our internally stored value - in order to provide the correct setting even if cool step is not enabled + return this->cool_step_lower_threshold<<5; +} + +unsigned int TMC26XStepper::getCoolStepUpperSgThreshold() { + return (unsigned char)((cool_step_register_value & SE_MAX_PATTERN) >> 8) << 5; +} + +unsigned char TMC26XStepper::getCoolStepCurrentIncrementSize() { + return (unsigned char)((cool_step_register_value & CURRENT_DOWN_STEP_SPEED_PATTERN) >> 13); +} + +unsigned char TMC26XStepper::getCoolStepNumberOfSGReadings() { + return (unsigned char)((cool_step_register_value & SE_CURRENT_STEP_WIDTH_PATTERN) >> 5); +} + +unsigned char TMC26XStepper::getCoolStepLowerCurrentLimit() { + return (unsigned char)((cool_step_register_value & MINIMUM_CURRENT_FOURTH) >> 15); +} + +void TMC26XStepper::setEnabled(boolean enabled) { + //delete the t_off in the chopper config to get sure + chopper_config_register &= ~(T_OFF_PATTERN); + if (enabled) { + //and set the t_off time + chopper_config_register |= this->constant_off_time; + } + //if not enabled we don't have to do anything since we already delete t_off from the register + if (started) send262(chopper_config_register); +} + +boolean TMC26XStepper::isEnabled() { return !!(chopper_config_register & T_OFF_PATTERN); } + +/** + * reads a value from the TMC26X status register. The value is not obtained directly but can then + * be read by the various status routines. + * + */ +void TMC26XStepper::readStatus(char read_value) { + unsigned long old_driver_configuration_register_value = driver_configuration_register_value; + //reset the readout configuration + driver_configuration_register_value &= ~(READ_SELECTION_PATTERN); + //this now equals TMC26X_READOUT_POSITION - so we just have to check the other two options + if (read_value == TMC26X_READOUT_STALLGUARD) + driver_configuration_register_value |= READ_STALL_GUARD_READING; + else if (read_value == TMC26X_READOUT_CURRENT) + driver_configuration_register_value |= READ_STALL_GUARD_AND_COOL_STEP; + + //all other cases are ignored to prevent funny values + //check if the readout is configured for the value we are interested in + if (driver_configuration_register_value != old_driver_configuration_register_value) { + //because then we need to write the value twice - one time for configuring, second time to get the value, see below + send262(driver_configuration_register_value); + } + //write the configuration to get the last status + send262(driver_configuration_register_value); +} + +int TMC26XStepper::getMotorPosition(void) { + //we read it out even if we are not started yet - perhaps it is useful information for somebody + readStatus(TMC26X_READOUT_POSITION); + return getReadoutValue(); +} + +//reads the stall guard setting from last status +//returns -1 if stallguard information is not present +int TMC26XStepper::getCurrentStallGuardReading(void) { + //if we don't yet started there cannot be a stall guard value + if (!started) return -1; + //not time optimal, but solution optiomal: + //first read out the stall guard value + readStatus(TMC26X_READOUT_STALLGUARD); + return getReadoutValue(); +} + +unsigned char TMC26XStepper::getCurrentCSReading(void) { + //if we don't yet started there cannot be a stall guard value + if (!started) return 0; + //not time optimal, but solution optiomal: + //first read out the stall guard value + readStatus(TMC26X_READOUT_CURRENT); + return (getReadoutValue() & 0x1F); +} + +unsigned int TMC26XStepper::getCurrentCurrent(void) { + float result = (float)getCurrentCSReading(), + resistor_value = (float)this->resistor, + voltage = (driver_configuration_register_value & VSENSE)? 0.165 : 0.31; + result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); + return (unsigned int)result; +} + +/** + * Return true if the stallguard threshold has been reached + */ +boolean TMC26XStepper::isStallGuardOverThreshold(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_STALL_GUARD_STATUS); +} + +/** + * returns if there is any over temperature condition: + * OVER_TEMPERATURE_PREWARING if pre warning level has been reached + * OVER_TEMPERATURE_SHUTDOWN if the temperature is so hot that the driver is shut down + * Any of those levels are not too good. + */ +char TMC26XStepper::getOverTemperature(void) { + if (!this->started) return 0; + + if (driver_status_result & STATUS_OVER_TEMPERATURE_SHUTDOWN) + return TMC26X_OVERTEMPERATURE_SHUTDOWN; + + if (driver_status_result & STATUS_OVER_TEMPERATURE_WARNING) + return TMC26X_OVERTEMPERATURE_PREWARING; + + return 0; +} + +// Is motor channel A shorted to ground +boolean TMC26XStepper::isShortToGroundA(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_SHORT_TO_GROUND_A); +} + +// Is motor channel B shorted to ground +boolean TMC26XStepper::isShortToGroundB(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_SHORT_TO_GROUND_B); +} + +// Is motor channel A connected +boolean TMC26XStepper::isOpenLoadA(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_OPEN_LOAD_A); +} + +// Is motor channel B connected +boolean TMC26XStepper::isOpenLoadB(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_OPEN_LOAD_B); +} + +// Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s +boolean TMC26XStepper::isStandStill(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_STAND_STILL); +} + +//is chopper inactive since 2^20 clock cycles - defaults to ~0,08s +boolean TMC26XStepper::isStallGuardReached(void) { + if (!this->started) return false; + return (driver_status_result & STATUS_STALL_GUARD_STATUS); +} + +//reads the stall guard setting from last status +//returns -1 if stallguard inforamtion is not present +int TMC26XStepper::getReadoutValue(void) { + return (int)(driver_status_result >> 10); +} + +int TMC26XStepper::getResistor() { return this->resistor; } + +boolean TMC26XStepper::isCurrentScalingHalfed() { + return !!(this->driver_configuration_register_value & VSENSE); +} +/** + * version() returns the version of the library: + */ +int TMC26XStepper::version(void) { return 1; } + +void TMC26XStepper::debugLastStatus() { + #ifdef TMC_DEBUG1 + if (this->started) { + if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_PREWARING) + SERIAL_ECHOLNPGM("\n WARNING: Overtemperature Prewarning!"); + else if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_SHUTDOWN) + SERIAL_ECHOLNPGM("\n ERROR: Overtemperature Shutdown!"); + + if (this->isShortToGroundA()) + SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel A!"); + + if (this->isShortToGroundB()) + SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel B!"); + + if (this->isOpenLoadA()) + SERIAL_ECHOLNPGM("\n ERROR: Channel A seems to be unconnected!"); + + if (this->isOpenLoadB()) + SERIAL_ECHOLNPGM("\n ERROR: Channel B seems to be unconnected!"); + + if (this->isStallGuardReached()) + SERIAL_ECHOLNPGM("\n INFO: Stall Guard level reached!"); + + if (this->isStandStill()) + SERIAL_ECHOLNPGM("\n INFO: Motor is standing still."); + + unsigned long readout_config = driver_configuration_register_value & READ_SELECTION_PATTERN; + const int value = getReadoutValue(); + if (readout_config == READ_MICROSTEP_POSTION) { + //SERIAL_PRINTF("Microstep postion phase A: "); + SERIAL_ECHOPAIR("\n Microstep postion phase A: ", value); + } + else if (readout_config == READ_STALL_GUARD_READING) { + //SERIAL_PRINTF("Stall Guard value:"); + SERIAL_ECHOPAIR("\n Stall Guard value:", value); + } + else if (readout_config == READ_STALL_GUARD_AND_COOL_STEP) { + int stallGuard = value & 0xF, current = value & 0x1F0; + //SERIAL_PRINTF("Approx Stall Guard: "); + SERIAL_ECHOPAIR("\n Approx Stall Guard: ", stallGuard); + //SERIAL_PRINTF("Current level"); + SERIAL_ECHOPAIR("\n Current level", current); + } + } + #endif +} + +/** + * send register settings to the stepper driver via SPI + * returns the current status + */ +inline void TMC26XStepper::send262(unsigned long datagram) { + unsigned long i_datagram; + + //preserver the previous spi mode + //unsigned char oldMode = SPCR & SPI_MODE_MASK; + + //if the mode is not correct set it to mode 3 + //if (oldMode != SPI_MODE3) { + // SPI.setDataMode(SPI_MODE3); + //} + + //select the TMC driver + digitalWrite(cs_pin,LOW); + + //ensure that only valid bist are set (0-19) + //datagram &=REGISTER_BIT_PATTERN; + + #ifdef TMC_DEBUG1 + //SERIAL_PRINTF("Sending "); + //SERIAL_PRINTF("Sending ", datagram,HEX); + //SERIAL_ECHOPAIR("\n\nSending \n", print_hex_long(datagram)); + SERIAL_PRINTF("\n\nSending %x", datagram); + #endif + + //write/read the values + i_datagram = STEPPER_SPI.transfer((datagram >> 16) & 0xFF); + i_datagram <<= 8; + i_datagram |= STEPPER_SPI.transfer((datagram >> 8) & 0xFF); + i_datagram <<= 8; + i_datagram |= STEPPER_SPI.transfer((datagram) & 0xFF); + i_datagram >>= 4; + + #ifdef TMC_DEBUG1 + //SERIAL_PRINTF("Received "); + //SERIAL_PRINTF("Received ", i_datagram,HEX); + //SERIAL_ECHOPAIR("\n\nReceived \n", i_datagram); + SERIAL_PRINTF("\n\nReceived %x", i_datagram); + debugLastStatus(); + #endif + + //deselect the TMC chip + digitalWrite(cs_pin,HIGH); + + //restore the previous SPI mode if neccessary + //if the mode is not correct set it to mode 3 + //if (oldMode != SPI_MODE3) { + // SPI.setDataMode(oldMode); + //} + + //store the datagram as status result + driver_status_result = i_datagram; +} + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/TMC2660.h b/Marlin/src/HAL/HAL_STM32F7/TMC2660.h new file mode 100644 index 0000000000..4c8f2bf731 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/TMC2660.h @@ -0,0 +1,607 @@ +/** + * TMC26XStepper.h - - TMC26X Stepper library for Wiring/Arduino + * + * based on the stepper library by Tom Igoe, et. al. + * + * Copyright (c) 2011, Interactive Matter, Marcus Nowotny + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "../../inc/MarlinConfig.h" + +// ensure this library description is only included once +#ifndef _TMC26XSTEPPER_H_ +#define _TMC26XSTEPPER_H_ + +//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature situation in the TMC chip +/*! + * This warning indicates that the TCM chip is too warm. + * It is still working but some parameters may be inferior. + * You should do something against it. + */ +#define TMC26X_OVERTEMPERATURE_PREWARING 1 +//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature shutdown in the TMC chip +/*! + * This warning indicates that the TCM chip is too warm to operate and has shut down to prevent damage. + * It will stop working until it cools down again. + * If you encouter this situation you must do something against it. Like reducing the current or improving the PCB layout + * and/or heat management. + */ +#define TMC26X_OVERTEMPERATURE_SHUTDOWN 2 + +//which values can be read out +/*! + * Selects to readout the microstep position from the motor. + *\sa readStatus() + */ +#define TMC26X_READOUT_POSITION 0 +/*! + * Selects to read out the StallGuard value of the motor. + *\sa readStatus() + */ +#define TMC26X_READOUT_STALLGUARD 1 +/*! + * Selects to read out the current current setting (acc. to CoolStep) and the upper bits of the StallGuard value from the motor. + *\sa readStatus(), setCurrent() + */ +#define TMC26X_READOUT_CURRENT 3 + +/*! + * Define to set the minimum current for CoolStep operation to 1/2 of the selected CS minium. + *\sa setCoolStepConfiguration() + */ +#define COOL_STEP_HALF_CS_LIMIT 0 +/*! + * Define to set the minimum current for CoolStep operation to 1/4 of the selected CS minium. + *\sa setCoolStepConfiguration() + */ +#define COOL_STEP_QUARTDER_CS_LIMIT 1 + +/*! + * \class TMC26XStepper + * \brief Class representing a TMC26X stepper driver + * + * In order to use one fo those drivers in your Arduino code you have to create an object of that class: + * \code + * TMC26XStepper stepper = TMC26XStepper(200,1,2,3,500); + * \endcode + * see TMC26XStepper(int number_of_steps, int cs_pin, int dir_pin, int step_pin, unsigned int rms_current) + * + * Keep in mind that you need to start the driver with start() in order to get the TMC26X configured. + * + * The most important function is the move(). It checks if the motor has to do a step or not. + * It is important that you call move() as often as possible in your Arduino loop() routine. I suggest + * to use a very fast loop routine and always call it at the beginning or the end. + * + * In order to move you have to provide a movement speed with setSpeed(). The speed is a positive value setting + * the rotations per minute. + * + * To really move the motor you have to call step() to tell the driver to move the motor the given number + * of steps in the given direction. Positive values move the motor in one direction, negative values in the other direction. + * + * You can check with isMoving() if the mototr is still moving or stop it apruptely with stop(). + */ +class TMC26XStepper { + public: + /*! + * \brief creates a new represenatation of a stepper motor connected to a TMC26X stepper driver + * + * This is the main constructor. If in doubt use this. You must provide all parameters as described below. + * + * \param number_of_steps the number of steps the motor has per rotation. + * \param cs_pin The Arduino pin you have connected the Cient Select Pin (!CS) of the TMC26X for SPI + * \param dir_pin the number of the Arduino pin the Direction input of the TMC26X is connected + * \param step_pin the number of the Arduino pin the step pin of the TMC26X driver is connected. + * \param rms_current the maximum current to privide to the motor in mA (!). A value of 200 would send up to 200mA to the motor + * \param resistor the current sense resistor in milli Ohm, defaults to ,15 Ohm ( or 150 milli Ohm) as in the TMC260 Arduino Shield + * + * Keep in mind that you must also call TMC26XStepper.start() in order to configure the stepper driver for use. + * + * By default the Constant Off Time chopper is used, see TCM262Stepper.setConstantOffTimeChopper() for details. + * This should work on most motors (YMMV). You may want to configure and use the Spread Cycle Chopper, see setSpreadCycleChopper(). + * + * By default a microstepping of 1/32th is used to provide a smooth motor run, while still giving a good progression per step. + * You can select a different stepping with setMicrosteps() to aa different value. + * \sa start(), setMicrosteps() + */ + TMC26XStepper(int number_of_steps, int cs_pin, int dir_pin, int step_pin, unsigned int current, unsigned int resistor=100); //resistor=150 + + /*! + * \brief configures and starts the TMC26X stepper driver. Before you called this function the stepper driver is in nonfunctional mode. + * + * This routine configures the TMC26X stepper driver for the given values via SPI. + * Most member functions are non functional if the driver has not been started. + * Therefore it is best to call this in your Arduino setup() function. + */ + void start(); + + /*! + * \brief resets the stepper in unconfigured mode. + * + * This routine enables you to call start again. It does not change anything + * in the internal stepper configuration or the desired configuration. + * It just marks the stepper as not yet startet. You do not have to reconfigure + * the stepper to start it again, but it is not reset to any factory settings + * this has to be configured back by yourself. + * (Hint: Normally you do not need this function) + */ + void un_start(); + + + /*! + * \brief Sets the rotation speed in revolutions per minute. + * \param whatSpeed the desired speed in rotations per minute. + */ + void setSpeed(unsigned int whatSpeed); + + /*! + * \brief reads out the currently selected speed in revolutions per minute. + * \sa setSpeed() + */ + unsigned int getSpeed(void); + + /*! + * \brief Set the number of microsteps in 2^i values (rounded) up to 256 + * + * This method set's the number of microsteps per step in 2^i interval. + * This means you can select 1, 2, 4, 16, 32, 64, 128 or 256 as valid microsteps. + * If you give any other value it will be rounded to the next smaller number (3 would give a microstepping of 2). + * You can always check the current microstepping with getMicrosteps(). + */ + void setMicrosteps(int number_of_steps); + + /*! + * \brief returns the effective current number of microsteps selected. + * + * This function always returns the effective number of microsteps. + * This can be a bit different than the micro steps set in setMicrosteps() since it is rounded to 2^i. + * + * \sa setMicrosteps() + */ + int getMicrosteps(void); + + /*! + * \brief Initiate a movement for the given number of steps. Positive numbers move in one, negative numbers in the other direction. + * + * \param number_of_steps The number of steps to move the motor. + * \return 0 if the motor was not moving and moves now. -1 if the motor is moving and the new steps could not be set. + * + * If the previous movement is not finished yet the function will return -1 and not change the steps to move the motor. + * If the motor does not move it return 0 + * + * The direction of the movement is indicated by the sign of the steps parameter. It is not determinable if positive values are right + * or left This depends on the internal construction of the motor and how you connected it to the stepper driver. + * + * You can always verify with isMoving() or even use stop() to stop the motor before giving it new step directions. + * \sa isMoving(), getStepsLeft(), stop() + */ + char step(int number_of_steps); + + /*! + * \brief Central movement method, must be called as often as possible in the lopp function and is very fast. + * + * This routine checks if the motor still has to move, if the waiting delay has passed to send a new step command to the motor + * and manages the number of steps yet to move to fulfill the current move command. + * + * This function is implemented to be as fast as possible to call it as often as possible in your loop routine. + * The more regurlarly you call this function the better. In both senses of 'regularly': Calling it as often as + * possible is not a bad idea and if you even manage that the intervals you call this function are not too irregular helps too. + * + * You can call this routine even if you know that the motor is not moving. It introduces just a very small penalty in your code. + * You must not call isMoving() to determine if you need to call this function, since taht is done internally already and only + * slows down you code. + * + * How often you call this function directly influences your top moving speed for the motor. It may be a good idea to call this + * from a timer overflow interrupt to ensure proper calling. + * \sa step() + */ + char move(void); + + /*! + * \brief checks if the motor still has to move to fulfill the last movement command. + * \return 0 if the motor stops, -1 if the motor is moving. + * + * This method can be used to determine if the motor is ready for new movements. + *\sa step(), move() + */ + char isMoving(void); + + /*! + * \brief Get the number of steps left in the current movement. + * \return The number of steps left in the movement. This number is always positive. + */ + unsigned int getStepsLeft(void); + + /*! + * \brief Stops the motor regardless if it moves or not. + * \return -1 if the motor was moving and is really stoped or 0 if it was not moving at all. + * + * This method directly and apruptely stops the motor and may be used as an emergency stop. + */ + char stop(void); + + /*! + * \brief Sets and configure the classical Constant Off Timer Chopper + * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) + * \param blank_time Selects the comparator blank time. This time needs to safely cover the switching event and the duration of the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting + * \param fast_decay_time_setting Fast decay time setting. Controls the portion of fast decay for each chopper cycle. 0: slow decay only, 1…15: duration of fast decay phase + * \param sine_wave_offset Sine wave offset. Controls the sine wave offset. A positive offset corrects for zero crossing error. -3…-1: negative offset, 0: no offset,1…12: positive offset + * \param use_curreent_comparator Selects usage of the current comparator for termination of the fast decay cycle. If current comparator is enabled, it terminates the fast decay cycle in case the current reaches a higher negative value than the actual positive value. (0 disable, -1 enable). + * + * The classic constant off time chopper uses a fixed portion of fast decay following each on phase. + * While the duration of the on time is determined by the chopper comparator, the fast decay time needs + * to be set by the user in a way, that the current decay is enough for the driver to be able to follow + * the falling slope of the sine wave, and on the other hand it should not be too long, in order to minimize + * motor current ripple and power dissipation. This best can be tuned using an oscilloscope or + * trying out motor smoothness at different velocities. A good starting value is a fast decay time setting + * similar to the slow decay time setting. + * After tuning of the fast decay time, the offset should be determined, in order to have a smooth zero transition. + * This is necessary, because the fast decay phase leads to the absolute value of the motor current being lower + * than the target current (see figure 17). If the zero offset is too low, the motor stands still for a short + * moment during current zero crossing, if it is set too high, it makes a larger microstep. + * Typically, a positive offset setting is required for optimum operation. + * + * \sa setSpreadCycleChoper() for other alternatives. + * \sa setRandomOffTime() for spreading the noise over a wider spectrum + */ + void setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, unsigned char use_current_comparator); + + /*! + * \brief Sets and configures with spread cycle chopper. + * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) + * \param blank_time Selects the comparator blank time. This time needs to safely cover the switching event and the duration of the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting + * \param hysteresis_start Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value. 1 … 8 + * \param hysteresis_end Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by hysteresis_decrement. The sum hysteresis_start + hysteresis_end must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. + * \param hysteresis_decrement Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. 0 (fast decrement) … 3 (slow decrement). + * + * The spreadCycle chopper scheme (pat.fil.) is a precise and simple to use chopper principle, which automatically determines + * the optimum fast decay portion for the motor. Anyhow, a number of settings can be made in order to optimally fit the driver + * to the motor. + * Each chopper cycle is comprised of an on-phase, a slow decay phase, a fast decay phase and a second slow decay phase. + * The slow decay phases limit the maximum chopper frequency and are important for low motor and driver power dissipation. + * The hysteresis start setting limits the chopper frequency by forcing the driver to introduce a minimum amount of + * current ripple into the motor coils. The motor inductivity determines the ability to follow a changing motor current. + * The duration of the on- and fast decay phase needs to cover at least the blank time, because the current comparator is + * disabled during this time. + * + * \sa setRandomOffTime() for spreading the noise over a wider spectrum + */ + void setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement); + + /*! + * \brief Use random off time for noise reduction (0 for off, -1 for on). + * \param value 0 for off, -1 for on + * + * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. + * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, + * thus it depends on the microstep position. With some motors a slightly audible beat can occur between the chopper + * frequencies, especially when they are near to each other. This typically occurs at a few microstep positions within + * each quarter wave. + * This effect normally is not audible when compared to mechanical noise generated by ball bearings, + * etc. Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. + * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. + * It modulates the slow decay time setting when switched on. The random off time feature further spreads the chopper spectrum, + * reducing electromagnetic emission on single frequencies. + */ + void setRandomOffTime(char value); + + /*! + * \brief set the maximum motor current in mA (1000 is 1 Amp) + * Keep in mind this is the maximum peak Current. The RMS current will be 1/sqrt(2) smaller. The actual current can also be smaller + * by employing CoolStep. + * \param current the maximum motor current in mA + * \sa getCurrent(), getCurrentCurrent() + */ + void setCurrent(unsigned int current); + + /*! + * \brief readout the motor maximum current in mA (1000 is an Amp) + * This is the maximum current. to get the current current - which may be affected by CoolStep us getCurrentCurrent() + * \return the maximum motor current in milli amps + * \sa getCurrentCurrent() + */ + unsigned int getCurrent(void); + + /*! + * \brief set the StallGuard threshold in order to get sensible StallGuard readings. + * \param stall_guard_threshold -64 … 63 the StallGuard threshold + * \param stall_guard_filter_enabled 0 if the filter is disabled, -1 if it is enabled + * + * The StallGuard threshold is used to optimize the StallGuard reading to sensible values. It should be at 0 at + * the maximum allowable load on the otor (but not before). = is a good starting point (and the default) + * If you get Stall Gaurd readings of 0 without any load or with too little laod increase the value. + * If you get readings of 1023 even with load decrease the setting. + * + * If you switch on the filter the StallGuard reading is only updated each 4th full step to reduce the noise in the + * reading. + * + * \sa getCurrentStallGuardReading() to read out the current value. + */ + void setStallGuardThreshold(char stall_guard_threshold, char stall_guard_filter_enabled); + + /*! + * \brief reads out the StallGuard threshold + * \return a number between -64 and 63. + */ + char getStallGuardThreshold(void); + + /*! + * \brief returns the current setting of the StallGuard filter + * \return 0 if not set, -1 if set + */ + char getStallGuardFilter(void); + + /*! + * \brief This method configures the CoolStep smart energy operation. You must have a proper StallGuard configuration for the motor situation (current, voltage, speed) in rder to use this feature. + * \param lower_SG_threshold Sets the lower threshold for stallGuard2TM reading. Below this value, the motor current becomes increased. Allowed values are 0...480 + * \param SG_hysteresis Sets the distance between the lower and the upper threshold for stallGuard2TM reading. Above the upper threshold (which is lower_SG_threshold+SG_hysteresis+1) the motor current becomes decreased. Allowed values are 0...480 + * \param current_decrement_step_size Sets the current decrement steps. If the StallGuard value is above the threshold the current gets decremented by this step size. 0...32 + * \param current_increment_step_size Sets the current increment step. The current becomes incremented for each measured stallGuard2TM value below the lower threshold. 0...8 + * \param lower_current_limit Sets the lower motor current limit for coolStepTM operation by scaling the CS value. Values can be COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT + * The CoolStep smart energy operation automatically adjust the current sent into the motor according to the current load, + * read out by the StallGuard in order to provide the optimum torque with the minimal current consumption. + * You configure the CoolStep current regulator by defining upper and lower bounds of StallGuard readouts. If the readout is above the + * limit the current gets increased, below the limit the current gets decreased. + * You can specify the upper an lower threshold of the StallGuard readout in order to adjust the current. You can also set the number of + * StallGuard readings neccessary above or below the limit to get a more stable current adjustement. + * The current adjustement itself is configured by the number of steps the current gests in- or decreased and the absolut minimum current + * (1/2 or 1/4th otf the configured current). + * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT + */ + void setCoolStepConfiguration(unsigned int lower_SG_threshold, unsigned int SG_hysteresis, unsigned char current_decrement_step_size, + unsigned char current_increment_step_size, unsigned char lower_current_limit); + + /*! + * \brief enables or disables the CoolStep smart energy operation feature. It must be configured before enabling it. + * \param enabled true if CoolStep should be enabled, false if not. + * \sa setCoolStepConfiguration() + */ + void setCoolStepEnabled(boolean enabled); + + + /*! + * \brief check if the CoolStep feature is enabled + * \sa setCoolStepEnabled() + */ + boolean isCoolStepEnabled(); + + /*! + * \brief returns the lower StallGuard threshold for the CoolStep operation + * \sa setCoolStepConfiguration() + */ + unsigned int getCoolStepLowerSgThreshold(); + + /*! + * \brief returns the upper StallGuard threshold for the CoolStep operation + * \sa setCoolStepConfiguration() + */ + unsigned int getCoolStepUpperSgThreshold(); + + /*! + * \brief returns the number of StallGuard readings befor CoolStep adjusts the motor current. + * \sa setCoolStepConfiguration() + */ + unsigned char getCoolStepNumberOfSGReadings(); + + /*! + * \brief returns the increment steps for the current for the CoolStep operation + * \sa setCoolStepConfiguration() + */ + unsigned char getCoolStepCurrentIncrementSize(); + + /*! + * \brief returns the absolut minium current for the CoolStep operation + * \sa setCoolStepConfiguration() + * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT + */ + unsigned char getCoolStepLowerCurrentLimit(); + + /*! + * \brief Get the current microstep position for phase A + * \return The current microstep position for phase A 0…255 + * + * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. + */ + int getMotorPosition(void); + + /*! + * \brief Reads the current StallGuard value. + * \return The current StallGuard value, lesser values indicate higher load, 0 means stall detected. + * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. + * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. + */ + int getCurrentStallGuardReading(void); + + /*! + * \brief Reads the current current setting value as fraction of the maximum current + * Returns values between 0 and 31, representing 1/32 to 32/32 (=1) + * \sa setCoolStepConfiguration() + */ + unsigned char getCurrentCSReading(void); + + + /*! + *\brief a convenience method to determine if the current scaling uses 0.31V or 0.165V as reference. + *\return false if 0.13V is the reference voltage, true if 0.165V is used. + */ + boolean isCurrentScalingHalfed(); + + /*! + * \brief Reads the current current setting value and recalculates the absolute current in mA (1A would be 1000). + * This method calculates the currently used current setting (either by setting or by CoolStep) and reconstructs + * the current in mA by usinge the VSENSE and resistor value. This method uses floating point math - so it + * may not be the fastest. + * \sa getCurrentCSReading(), getResistor(), isCurrentScalingHalfed(), getCurrent() + */ + unsigned int getCurrentCurrent(void); + + /*! + * \brief checks if there is a StallGuard warning in the last status + * \return 0 if there was no warning, -1 if there was some warning. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + * + * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. + */ + boolean isStallGuardOverThreshold(void); + + /*! + * \brief Return over temperature status of the last status readout + * return 0 is everything is OK, TMC26X_OVERTEMPERATURE_PREWARING if status is reached, TMC26X_OVERTEMPERATURE_SHUTDOWN is the chip is shutdown, -1 if the status is unknown. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + char getOverTemperature(void); + + /*! + * \brief Is motor channel A shorted to ground detected in the last status readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + + boolean isShortToGroundA(void); + + /*! + * \brief Is motor channel B shorted to ground detected in the last status readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isShortToGroundB(void); + /*! + * \brief iIs motor channel A connected according to the last statu readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isOpenLoadA(void); + + /*! + * \brief iIs motor channel A connected according to the last statu readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isOpenLoadB(void); + + /*! + * \brief Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isStandStill(void); + + /*! + * \brief checks if there is a StallGuard warning in the last status + * \return 0 if there was no warning, -1 if there was some warning. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + * + * \sa isStallGuardOverThreshold() + * TODO why? + * + * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. + */ + boolean isStallGuardReached(void); + + /*! + *\brief enables or disables the motor driver bridges. If disabled the motor can run freely. If enabled not. + *\param enabled a boolean value true if the motor should be enabled, false otherwise. + */ + void setEnabled(boolean enabled); + + /*! + *\brief checks if the output bridges are enabled. If the bridges are not enabled the motor can run freely + *\return true if the bridges and by that the motor driver are enabled, false if not. + *\sa setEnabled() + */ + boolean isEnabled(); + + /*! + * \brief Manually read out the status register + * This function sends a byte to the motor driver in order to get the current readout. The parameter read_value + * seletcs which value will get returned. If the read_vlaue changes in respect to the previous readout this method + * automatically send two bytes to the motor: one to set the redout and one to get the actual readout. So this method + * may take time to send and read one or two bits - depending on the previous readout. + * \param read_value selects which value to read out (0..3). You can use the defines TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, or TMC_262_READOUT_CURRENT + * \sa TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, TMC_262_READOUT_CURRENT + */ + void readStatus(char read_value); + + /*! + * \brief Returns the current sense resistor value in milliohm. + * The default value of ,15 Ohm will return 150. + */ + int getResistor(); + + /*! + * \brief Prints out all the information that can be found in the last status read out - it does not force a status readout. + * The result is printed via Serial + */ + void debugLastStatus(void); + /*! + * \brief library version + * \return the version number as int. + */ + int version(void); + + private: + unsigned int steps_left; // The steps the motor has to do to complete the movement + int direction; // Direction of rotation + unsigned long step_delay; // Delay between steps, in ms, based on speed + int number_of_steps; // Total number of steps this motor can take + unsigned int speed; // Store the current speed in order to change the speed after changing microstepping + unsigned int resistor; // Current sense resitor value in milliohm + + unsigned long last_step_time; // Time stamp in ms of when the last step was taken + unsigned long next_step_time; // Time stamp in ms of when the last step was taken + + // Driver control register copies to easily set & modify the registers + unsigned long driver_control_register_value; + unsigned long chopper_config_register; + unsigned long cool_step_register_value; + unsigned long stall_guard2_current_register_value; + unsigned long driver_configuration_register_value; + // The driver status result + unsigned long driver_status_result; + + // Helper routione to get the top 10 bit of the readout + inline int getReadoutValue(); + + // The pins for the stepper driver + unsigned char cs_pin; + unsigned char step_pin; + unsigned char dir_pin; + + // Status values + boolean started; // If the stepper has been started yet + int microsteps; // The current number of micro steps + char constant_off_time; // We need to remember this value in order to enable and disable the motor + unsigned char cool_step_lower_threshold; // we need to remember the threshold to enable and disable the CoolStep feature + boolean cool_step_enabled; // We need to remember this to configure the coolstep if it si enabled + + // SPI sender + inline void send262(unsigned long datagram); +}; + +#endif // _TMC26XSTEPPER_H_ diff --git a/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h b/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h new file mode 100644 index 0000000000..5b2cdb3a9e --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/endstop_interrupts.h @@ -0,0 +1,64 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.update(); } + +void setup_endstop_interrupts(void) { + #if HAS_X_MAX + attachInterrupt(X_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_X_MIN + attachInterrupt(X_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MAX + attachInterrupt(Y_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Y_MIN + attachInterrupt(Y_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MAX + attachInterrupt(Z_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN + attachInterrupt(Z_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MAX + attachInterrupt(Z2_MAX_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z2_MIN + attachInterrupt(Z2_MIN_PIN, endstop_ISR, CHANGE); + #endif + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(Z_MIN_PROBE_PIN, endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F7/fastio_STM32F7.h b/Marlin/src/HAL/HAL_STM32F7/fastio_STM32F7.h new file mode 100644 index 0000000000..2d82530b89 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/fastio_STM32F7.h @@ -0,0 +1,184 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2017 Victor Perez + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Fast I/O interfaces for STM32F7 + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#ifndef _FASTIO_STM32F7_H +#define _FASTIO_STM32F7_H + +#define _BV(b) (1 << (b)) + +#define READ(IO) digitalRead(IO) +#define WRITE(IO,V) digitalWrite(IO,V) +#define WRITE_VAR(IO,V) WRITE(IO,V) + +#define _GET_MODE(IO) +#define _SET_MODE(IO,M) pinMode(IO, M) +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ + +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ +#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) + +#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) + +#define GET_INPUT(IO) +#define GET_OUTPUT(IO) +#define GET_TIMER(IO) + +#define PORTA 0 +#define PORTB 1 +#define PORTC 2 +#define PORTD 3 +#define PORTE 4 +#define PORTF 5 +#define PORTG 6 + +#define _STM32_PIN(_PORT,_PIN) ((PORT##_PORT * 16) + _PIN) + +#define PA0 _STM32_PIN(A, 0) +#define PA1 _STM32_PIN(A, 1) +#define PA2 _STM32_PIN(A, 2) +#define PA3 _STM32_PIN(A, 3) +#define PA4 _STM32_PIN(A, 4) +#define PA5 _STM32_PIN(A, 5) +#define PA6 _STM32_PIN(A, 6) +#define PA7 _STM32_PIN(A, 7) +#define PA8 _STM32_PIN(A, 8) +#define PA9 _STM32_PIN(A, 9) +#define PA10 _STM32_PIN(A, 10) +#define PA11 _STM32_PIN(A, 11) +#define PA12 _STM32_PIN(A, 12) +#define PA13 _STM32_PIN(A, 13) +#define PA14 _STM32_PIN(A, 14) +#define PA15 _STM32_PIN(A, 15) + +#define PB0 _STM32_PIN(B, 0) +#define PB1 _STM32_PIN(B, 1) +#define PB2 _STM32_PIN(B, 2) +#define PB3 _STM32_PIN(B, 3) +#define PB4 _STM32_PIN(B, 4) +#define PB5 _STM32_PIN(B, 5) +#define PB6 _STM32_PIN(B, 6) +#define PB7 _STM32_PIN(B, 7) +#define PB8 _STM32_PIN(B, 8) +#define PB9 _STM32_PIN(B, 9) +#define PB10 _STM32_PIN(B, 10) +#define PB11 _STM32_PIN(B, 11) +#define PB12 _STM32_PIN(B, 12) +#define PB13 _STM32_PIN(B, 13) +#define PB14 _STM32_PIN(B, 14) +#define PB15 _STM32_PIN(B, 15) + +#define PC0 _STM32_PIN(C, 0) +#define PC1 _STM32_PIN(C, 1) +#define PC2 _STM32_PIN(C, 2) +#define PC3 _STM32_PIN(C, 3) +#define PC4 _STM32_PIN(C, 4) +#define PC5 _STM32_PIN(C, 5) +#define PC6 _STM32_PIN(C, 6) +#define PC7 _STM32_PIN(C, 7) +#define PC8 _STM32_PIN(C, 8) +#define PC9 _STM32_PIN(C, 9) +#define PC10 _STM32_PIN(C, 10) +#define PC11 _STM32_PIN(C, 11) +#define PC12 _STM32_PIN(C, 12) +#define PC13 _STM32_PIN(C, 13) +#define PC14 _STM32_PIN(C, 14) +#define PC15 _STM32_PIN(C, 15) + +#define PD0 _STM32_PIN(D, 0) +#define PD1 _STM32_PIN(D, 1) +#define PD2 _STM32_PIN(D, 2) +#define PD3 _STM32_PIN(D, 3) +#define PD4 _STM32_PIN(D, 4) +#define PD5 _STM32_PIN(D, 5) +#define PD6 _STM32_PIN(D, 6) +#define PD7 _STM32_PIN(D, 7) +#define PD8 _STM32_PIN(D, 8) +#define PD9 _STM32_PIN(D, 9) +#define PD10 _STM32_PIN(D, 10) +#define PD11 _STM32_PIN(D, 11) +#define PD12 _STM32_PIN(D, 12) +#define PD13 _STM32_PIN(D, 13) +#define PD14 _STM32_PIN(D, 14) +#define PD15 _STM32_PIN(D, 15) + +#define PE0 _STM32_PIN(E, 0) +#define PE1 _STM32_PIN(E, 1) +#define PE2 _STM32_PIN(E, 2) +#define PE3 _STM32_PIN(E, 3) +#define PE4 _STM32_PIN(E, 4) +#define PE5 _STM32_PIN(E, 5) +#define PE6 _STM32_PIN(E, 6) +#define PE7 _STM32_PIN(E, 7) +#define PE8 _STM32_PIN(E, 8) +#define PE9 _STM32_PIN(E, 9) +#define PE10 _STM32_PIN(E, 10) +#define PE11 _STM32_PIN(E, 11) +#define PE12 _STM32_PIN(E, 12) +#define PE13 _STM32_PIN(E, 13) +#define PE14 _STM32_PIN(E, 14) +#define PE15 _STM32_PIN(E, 15) + +#define PF0 _STM32_PIN(F, 0) +#define PF1 _STM32_PIN(F, 1) +#define PF2 _STM32_PIN(F, 2) +#define PF3 _STM32_PIN(F, 3) +#define PF4 _STM32_PIN(F, 4) +#define PF5 _STM32_PIN(F, 5) +#define PF6 _STM32_PIN(F, 6) +#define PF7 _STM32_PIN(F, 7) +#define PF8 _STM32_PIN(F, 8) +#define PF9 _STM32_PIN(F, 9) +#define PF10 _STM32_PIN(F, 10) +#define PF11 _STM32_PIN(F, 11) +#define PF12 _STM32_PIN(F, 12) +#define PF13 _STM32_PIN(F, 13) +#define PF14 _STM32_PIN(F, 14) +#define PF15 _STM32_PIN(F, 15) + +#define PG0 _STM32_PIN(G, 0) +#define PG1 _STM32_PIN(G, 1) +#define PG2 _STM32_PIN(G, 2) +#define PG3 _STM32_PIN(G, 3) +#define PG4 _STM32_PIN(G, 4) +#define PG5 _STM32_PIN(G, 5) +#define PG6 _STM32_PIN(G, 6) +#define PG7 _STM32_PIN(G, 7) +#define PG8 _STM32_PIN(G, 8) +#define PG9 _STM32_PIN(G, 9) +#define PG10 _STM32_PIN(G, 10) +#define PG11 _STM32_PIN(G, 11) +#define PG12 _STM32_PIN(G, 12) +#define PG13 _STM32_PIN(G, 13) +#define PG14 _STM32_PIN(G, 14) +#define PG15 _STM32_PIN(G, 15) + +#endif // _FASTIO_STM32F7_H diff --git a/Marlin/src/HAL/HAL_STM32F7/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_STM32F7/persistent_store_eeprom.cpp new file mode 100644 index 0000000000..bd08ad7f0b --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/persistent_store_eeprom.cpp @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef STM32F7 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../shared/persistent_store_api.h" + +bool PersistentStore::access_start() { return true; } +bool PersistentStore::access_finish() { return true; } + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +size_t PersistentStore::capacity() { return E2END + 1; } + +#endif // EEPROM_SETTINGS +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/pinsDebug.h b/Marlin/src/HAL/HAL_STM32F7/pinsDebug.h new file mode 100644 index 0000000000..e5022f79a4 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/pinsDebug.h @@ -0,0 +1 @@ +#error Debug pins is not supported on this Platform! diff --git a/Marlin/src/HAL/HAL_STM32F7/spi_pins.h b/Marlin/src/HAL/HAL_STM32F7/spi_pins.h new file mode 100644 index 0000000000..2d1e96ec59 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/spi_pins.h @@ -0,0 +1,32 @@ +/** +* Marlin 3D Printer Firmware +* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +*/ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + * + */ +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 +#define SS_PIN PA8 + +#endif // SPI_PINS_H_ diff --git a/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.cpp b/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.cpp new file mode 100644 index 0000000000..0b0031a236 --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.cpp @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef STM32F7 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + + #include "watchdog_STM32F7.h" + + IWDG_HandleTypeDef hiwdg; + + void watchdog_init() { + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock + hiwdg.Init.Reload = 4095; //4095 counts = 4 seconds at 1024Hz + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { + //Error_Handler(); + } + } + + void watchdog_reset() { + /* Refresh IWDG: reload counter */ + if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { + /* Refresh Error */ + //Error_Handler(); + } + } + +#endif // USE_WATCHDOG + +#endif // STM32F7 diff --git a/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.h b/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.h new file mode 100644 index 0000000000..977f0f9b7e --- /dev/null +++ b/Marlin/src/HAL/HAL_STM32F7/watchdog_STM32F7.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef WATCHDOG_STM32F7_H +#define WATCHDOG_STM32F7_H + +#include "../../inc/MarlinConfig.h" + +extern IWDG_HandleTypeDef hiwdg; + +void watchdog_init(); +void watchdog_reset(); + +#endif // WATCHDOG_STM32F1_H diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/HAL.cpp b/Marlin/src/HAL/HAL_TEENSY31_32/HAL.cpp new file mode 100644 index 0000000000..fa5cdd8d1a --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/HAL.cpp @@ -0,0 +1,90 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +****************************************************************************/ + + +/** + * Description: HAL for Teensy32 (MK20DX256) + */ + +#ifdef __MK20DX256__ + +#include "HAL.h" +#include "../Delay.h" + +#include + +uint16_t HAL_adc_result; + +static const uint8_t pin2sc1a[] = { + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, 0, 19, 3, 31, // 0-13, we treat them as A0-A13 + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, // 14-23 (A0-A9) + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, // 24-33 + 0+64, 19+64, 3+64, 31+64, // 34-37 (A10-A13) + 26, 22, 23, 27, 29, 30 // 38-43: temp. sensor, VREF_OUT, A14, bandgap, VREFH, VREFL. A14 isn't connected to anything in Teensy 3.0. +}; + +/* + // disable interrupts + void cli(void) { noInterrupts(); } + + // enable interrupts + void sei(void) { interrupts(); } +*/ + +void HAL_adc_init() { + analog_init(); + while (ADC0_SC3 & ADC_SC3_CAL) {}; // Wait for calibration to finish + NVIC_ENABLE_IRQ(IRQ_FTM1); +} + +void HAL_clear_reset_source(void) { } + +uint8_t HAL_get_reset_source(void) { + switch (RCM_SRS0) { + case 128: return RST_POWER_ON; break; + case 64: return RST_EXTERNAL; break; + case 32: return RST_WATCHDOG; break; + // case 8: return RST_LOSS_OF_LOCK; break; + // case 4: return RST_LOSS_OF_CLOCK; break; + // case 2: return RST_LOW_VOLTAGE; break; + } + return 0; +} + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + int freeMemory() { + int free_memory; + if ((int)__brkval == 0) + free_memory = ((int)&free_memory) - ((int)&__bss_end); + else + free_memory = ((int)&free_memory) - ((int)__brkval); + return free_memory; + } +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { ADC0_SC1A = pin2sc1a[adc_pin]; } + +uint16_t HAL_adc_get_result(void) { return ADC0_RA; } + +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h b/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h new file mode 100644 index 0000000000..ce40eb24e0 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/HAL.h @@ -0,0 +1,159 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: HAL for Teensy 3.5 and Teensy 3.6 + */ + +#pragma once + +#define CPU_32_BIT + +// _BV is re-defined in Arduino.h +#undef _BV + +#include + +// Redefine sq macro defined by teensy3/wiring.h +#undef sq +#define sq(x) ((x)*(x)) + +#include "../math_32bit.h" +#include "../HAL_SPI.h" + +#include "fastio_Teensy.h" +#include "watchdog_Teensy.h" + +#include "HAL_timers_Teensy.h" + +#include + +#define ST7920_DELAY_1 DELAY_NS(600) +#define ST7920_DELAY_2 DELAY_NS(750) +#define ST7920_DELAY_3 DELAY_NS(750) + +//#undef MOTHERBOARD +//#define MOTHERBOARD BOARD_TEENSY31_32 + +#define IS_32BIT_TEENSY defined(__MK20DX256__) +#define IS_TEENSY32 defined(__MK20DX256__) + +#define NUM_SERIAL 1 + +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 0 + #define MYSERIAL0 Serial +#elif SERIAL_PORT == 1 + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 Serial2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 Serial3 +#endif + +#define HAL_SERVO_LIB libServo + +typedef int8_t pin_t; + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +// Add type-checking to pgm_read_word +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// Clear the reset reason +void HAL_clear_reset_source(void); + +// Get the reason for the reset +uint8_t HAL_get_reset_source(void); + +FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + int freeMemory(void); +} + +// SPI: Extended functions which take a channel number (hardware SPI only) + +// Write single byte to specified SPI channel +void spiSend(uint32_t chan, byte b); + +// Write buffer to specified SPI channel +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); + +// Read single byte from specified SPI channel +uint8_t spiRec(uint32_t chan); + +// ADC + +void HAL_adc_init(); + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_get_result() +#define HAL_ADC_READY() true + +#define HAL_ANALOG_SELECT(pin) NOOP; + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(void); + +/* +uint16_t HAL_getAdcReading(uint8_t chan); + +void HAL_startAdcConversion(uint8_t chan); +uint8_t HAL_pinToAdcChannel(int pin); + +uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); +//uint16_t HAL_getAdcSuperSample(uint8_t chan); + +void HAL_enable_AdcFreerun(void); +//void HAL_disable_AdcFreerun(uint8_t chan); +*/ + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/HAL_Servo_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_Servo_Teensy.cpp new file mode 100644 index 0000000000..7864ee715f --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_Servo_Teensy.cpp @@ -0,0 +1,36 @@ +#ifdef __MK20DX256__ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "HAL_Servo_Teensy.h" + +uint8_t servoPin[MAX_SERVOS] = { 0 }; + +int8_t libServo::attach(const int pin) { + if (this->servoIndex >= MAX_SERVOS) return -1; + if (pin > 0) servoPin[this->servoIndex] = pin; + return Servo::attach(servoPin[this->servoIndex]); +} + +int8_t libServo::attach(const int pin, const int min, const int max) { + if (pin > 0) servoPin[this->servoIndex] = pin; + return Servo::attach(servoPin[this->servoIndex], min, max); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} + +#endif // HAS_SERVOS + +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/HAL_Servo_Teensy.h b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_Servo_Teensy.h new file mode 100644 index 0000000000..c18d96ae12 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_Servo_Teensy.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#include + +// Inherit and expand on the official library +class libServo : public Servo { + public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); + private: + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/HAL_spi_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_spi_Teensy.cpp new file mode 100644 index 0000000000..4c57f02436 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_spi_Teensy.cpp @@ -0,0 +1,132 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifdef __MK20DX256__ + +#include "HAL.h" +#include +#include +#include "spi_pins.h" +#include "../../core/macros.h" + +static SPISettings spiConfig; + +/** + * Standard SPI functions + */ + +// Initialise SPI bus +void spiBegin(void) { + #if !PIN_EXISTS(SS) + #error "SS_PIN not defined!" + #endif + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + + //#if DISABLED(SOFTWARE_SPI) + #if 0 + // set SS high - may be chip select for another SPI device + #if SET_SPI_SS_HIGH + WRITE(SS_PIN, HIGH); + #endif + // set a default rate + spiInit(SPI_HALF_SPEED); // 1 + #endif +} + +// Configure SPI for specified SPI speed +void spiInit(uint8_t spiRate) { + // Use data rates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 10000000; break; + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 312500; break; + default: clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +// SPI receive a byte +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + const uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; + //SPDR = 0xFF; + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //return SPDR; +} + +// SPI read data +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.transfer(buf, nbyte); + SPI.endTransaction(); + //if (nbyte-- == 0) return; + // SPDR = 0xFF; + //for (uint16_t i = 0; i < nbyte; i++) { + // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + // buf[i] = SPDR; + // SPDR = 0xFF; + //} + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //buf[nbyte] = SPDR; +} + +// SPI send a byte +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); + //SPDR = b; + //while (!TEST(SPSR, SPIF)) { /* nada */ } +} + +// SPI send block +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPI.endTransaction(); +} + + +// Begin SPI transaction, set clock, bit order, data mode +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, bitOrder, dataMode); + SPI.beginTransaction(spiConfig); +} + +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/HAL_timers_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_timers_Teensy.cpp new file mode 100644 index 0000000000..aff44d4486 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_timers_Teensy.cpp @@ -0,0 +1,113 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +****************************************************************************/ + + +/** + * Teensy3.2 __MK20DX256__ + */ + +#ifdef __MK20DX256__ + +#include "HAL.h" +#include "HAL_timers_Teensy.h" + +/** \brief Instruction Synchronization Barrier + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. +*/ +FORCE_INLINE static void __ISB(void) { + __asm__ __volatile__("isb 0xF":::"memory"); +} + +/** \brief Data Synchronization Barrier + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. +*/ +FORCE_INLINE static void __DSB(void) { + __asm__ __volatile__("dsb 0xF":::"memory"); +} + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + FTM0_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; + FTM0_SC = 0x00; // Set this to zero before changing the modulus + FTM0_CNT = 0x0000; // Reset the count to zero + FTM0_MOD = 0xFFFF; // max modulus = 65535 + FTM0_C0V = FTM0_TIMER_RATE / frequency; // Initial FTM Channel 0 compare value + FTM0_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM0_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 8 + FTM0_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + case 1: + FTM1_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; // Disable write protection, Enable FTM1 + FTM1_SC = 0x00; // Set this to zero before changing the modulus + FTM1_CNT = 0x0000; // Reset the count to zero + FTM1_MOD = 0xFFFF; // max modulus = 65535 + FTM1_C0V = FTM1_TIMER_RATE / frequency; // Initial FTM Channel 0 compare value 65535 + FTM1_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM1_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 4 + FTM1_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch(timer_num) { + case 0: NVIC_ENABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_ENABLE_IRQ(IRQ_FTM1); break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DISABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_DISABLE_IRQ(IRQ_FTM1); break; + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return NVIC_IS_ENABLED(IRQ_FTM0); + case 1: return NVIC_IS_ENABLED(IRQ_FTM1); + } + return false; +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch(timer_num) { + case 0: + FTM0_CNT = 0x0000; + FTM0_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM0_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + case 1: + FTM1_CNT = 0x0000; + FTM1_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM1_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + } +} + +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/HAL_timers_Teensy.h b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_timers_Teensy.h new file mode 100644 index 0000000000..7a50b04c2d --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/HAL_timers_Teensy.h @@ -0,0 +1,108 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +****************************************************************************/ + +/** + * Description: HAL for + * Teensy3.2 (__MK20DX256__) + */ + +#pragma once + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define FTM0_TIMER_PRESCALE 8 +#define FTM1_TIMER_PRESCALE 4 +#define FTM0_TIMER_PRESCALE_BITS 0b011 +#define FTM1_TIMER_PRESCALE_BITS 0b010 + +#define FTM0_TIMER_RATE (F_BUS / FTM0_TIMER_PRESCALE) // 60MHz / 8 = 7500kHz +#define FTM1_TIMER_RATE (F_BUS / FTM1_TIMER_PRESCALE) // 60MHz / 4 = 15MHz + +#define HAL_TIMER_RATE (FTM0_TIMER_RATE) + +#define STEP_TIMER_NUM 0 +#define TEMP_TIMER_NUM 1 +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_FREQUENCY 1000 + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define HAL_STEP_TIMER_ISR extern "C" void ftm0_isr(void) //void TC3_Handler() +#define HAL_TEMP_TIMER_ISR extern "C" void ftm1_isr(void) //void TC4_Handler() + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: FTM0_C0V = compare; break; + case 1: FTM1_C0V = compare; break; + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_C0V; + case 1: return FTM1_C0V; + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_CNT; + case 1: return FTM1_CNT; + } + return 0; +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +void HAL_timer_isr_prologue(const uint8_t timer_num); +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/SanityCheck.h b/Marlin/src/HAL/HAL_TEENSY31_32/SanityCheck.h new file mode 100644 index 0000000000..777f3834a6 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/SanityCheck.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Test TEENSY35_36 specific configuration values for errors at compile-time. + */ + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.1/3.2. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/endstop_interrupts.h b/Marlin/src/HAL/HAL_TEENSY31_32/endstop_interrupts.h new file mode 100644 index 0000000000..353fd853f3 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/endstop_interrupts.h @@ -0,0 +1,86 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#pragma once + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.update(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ + +void setup_endstop_interrupts( void ) { + + #if HAS_X_MAX + attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); // assign it + #endif + + #if HAS_X_MIN + attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Y_MAX + attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Y_MIN + attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z_MAX + attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z_MIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z2_MAX + attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z2_MIN + attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); + #endif +} diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/fastio_Teensy.h b/Marlin/src/HAL/HAL_TEENSY31_32/fastio_Teensy.h new file mode 100644 index 0000000000..6dc5c14a98 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/fastio_Teensy.h @@ -0,0 +1,92 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Fast I/O Routines for Teensy 3.5 and Teensy 3.6 + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +#pragma once + +#ifndef MASK + #define MASK(PIN) (1 << PIN) +#endif + +#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) +#define GPIO_BITBAND(reg, bit) (*(uint32_t *)GPIO_BITBAND_ADDR((reg), (bit))) + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); + * + * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + */ + +#define _READ(p) bool(CORE_PIN ## p ## _PINREG & CORE_PIN ## p ## _BITMASK) + +#define _WRITE(P,V) do{ \ + if (V) CORE_PIN ## P ## _PORTSET = CORE_PIN ## P ## _BITMASK; \ + else CORE_PIN ## P ## _PORTCLEAR = CORE_PIN ## P ## _BITMASK; \ +}while(0) + +#define _TOGGLE(P) (*(&(CORE_PIN ## P ## _PORTCLEAR)+1) = CORE_PIN ## P ## _BITMASK) + +#define _SET_INPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _SET_OUTPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ +}while(0) + +#define _SET_INPUT_PULLUP(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _GET_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) +#define _GET_OUTPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) + +#define READ(IO) _READ(IO) + +#define WRITE_VAR(IO,V) _WRITE_VAR(IO,V) +#define WRITE(IO,V) _WRITE(IO,V) +#define TOGGLE(IO) _TOGGLE(IO) + +#define SET_INPUT(IO) _SET_INPUT(IO) +#define SET_INPUT_PULLUP(IO) _SET_INPUT_PULLUP(IO) +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) + +#define GET_INPUT(IO) _GET_INPUT(IO) +#define GET_OUTPUT(IO) _GET_OUTPUT(IO) + +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +/** + * Ports, functions, and pins + */ + +#define DIO0_PIN 8 diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_TEENSY31_32/persistent_store_impl.cpp new file mode 100644 index 0000000000..ac59212300 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/persistent_store_impl.cpp @@ -0,0 +1,51 @@ +#ifdef __MK20DX256__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../persistent_store_api.h" + +namespace HAL { +namespace PersistentStore { + +bool access_start() { return true; } +bool access_finish() { return true; } + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +} // PersistentStore +} // HAL + +#endif // EEPROM_SETTINGS +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/pinsDebug.h b/Marlin/src/HAL/HAL_TEENSY31_32/pinsDebug.h new file mode 100644 index 0000000000..47b99ae317 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/pinsDebug.h @@ -0,0 +1 @@ +#error "Debug pins is not supported on the Teensy 3.1 / 3.2 Platform!" diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/spi_pins.h b/Marlin/src/HAL/HAL_TEENSY31_32/spi_pins.h new file mode 100644 index 0000000000..6a468682e8 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/spi_pins.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#define SCK_PIN 13 +#define MISO_PIN 12 +#define MOSI_PIN 11 +#define SS_PIN 20 //SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/watchdog_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY31_32/watchdog_Teensy.cpp new file mode 100644 index 0000000000..47774b3ac2 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/watchdog_Teensy.cpp @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef __MK20DX256__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog_Teensy.h" + +void watchdog_init() { + WDOG_TOVALH = 0; + WDOG_TOVALL = 4000; + WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; +} + +#endif // USE_WATCHDOG + +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/watchdog_Teensy.h b/Marlin/src/HAL/HAL_TEENSY31_32/watchdog_Teensy.h new file mode 100644 index 0000000000..2b8ec00a1d --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY31_32/watchdog_Teensy.h @@ -0,0 +1,35 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#include "HAL.h" + +// Arduino Due core now has watchdog support + +void watchdog_init(); + +inline void watchdog_reset() { + // Watchdog refresh sequence + WDOG_REFRESH = 0xA602; + WDOG_REFRESH = 0xB480; +} diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.cpp new file mode 100644 index 0000000000..4f7f67a3bb --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.cpp @@ -0,0 +1,98 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +****************************************************************************/ + + +/** + * Description: HAL for Teensy35 (MK64FX512) + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "HAL.h" +#include "../shared/Delay.h" + +#include + +uint16_t HAL_adc_result; + +static const uint8_t pin2sc1a[] = { + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, 3, 19+128, 14+128, 15+128, // 0-13 -> A0-A13 + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, // 14-23 are A0-A9 + 255, 255, 255, 255, 255, 255, 255, // 24-30 are digital only + 14+128, 15+128, 17, 18, 4+128, 5+128, 6+128, 7+128, 17+128, // 31-39 are A12-A20 + 255, 255, 255, 255, 255, 255, 255, 255, 255, // 40-48 are digital only + 10+128, 11+128, // 49-50 are A23-A24 + 255, 255, 255, 255, 255, 255, 255, // 51-57 are digital only + 255, 255, 255, 255, 255, 255, // 58-63 (sd card pins) are digital only + 3, 19+128, // 64-65 are A10-A11 + 23, 23+128,// 66-67 are A21-A22 (DAC pins) + 1, 1+128, // 68-69 are A25-A26 (unused USB host port on Teensy 3.5) + 26, // 70 is Temperature Sensor + 18+128 // 71 is Vref +}; + +/* + // disable interrupts + void cli(void) { noInterrupts(); } + + // enable interrupts + void sei(void) { interrupts(); } +*/ + +void HAL_adc_init() { + analog_init(); + while (ADC0_SC3 & ADC_SC3_CAL) {}; // Wait for calibration to finish + NVIC_ENABLE_IRQ(IRQ_FTM1); +} + +void HAL_clear_reset_source(void) { } + +uint8_t HAL_get_reset_source(void) { + switch (RCM_SRS0) { + case 128: return RST_POWER_ON; break; + case 64: return RST_EXTERNAL; break; + case 32: return RST_WATCHDOG; break; + // case 8: return RST_LOSS_OF_LOCK; break; + // case 4: return RST_LOSS_OF_CLOCK; break; + // case 2: return RST_LOW_VOLTAGE; break; + } + return 0; +} + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + int freeMemory() { + int free_memory; + if ((int)__brkval == 0) + free_memory = ((int)&free_memory) - ((int)&__bss_end); + else + free_memory = ((int)&free_memory) - ((int)__brkval); + return free_memory; + } +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { ADC0_SC1A = pin2sc1a[adc_pin]; } + +uint16_t HAL_adc_get_result(void) { return ADC0_RA; } + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h new file mode 100644 index 0000000000..b60a5d28ad --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL.h @@ -0,0 +1,175 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: HAL for Teensy 3.5 and Teensy 3.6 + */ + +#ifndef _HAL_TEENSY_H +#define _HAL_TEENSY_H + +#define CPU_32_BIT + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +// _BV is re-defined in Arduino.h +#undef _BV + +#include + +// Redefine sq macro defined by teensy3/wiring.h +#undef sq +#define sq(x) ((x)*(x)) + +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio_Teensy.h" +#include "watchdog_Teensy.h" + +#include "HAL_timers_Teensy.h" + +#include + +#define ST7920_DELAY_1 DELAY_NS(600) +#define ST7920_DELAY_2 DELAY_NS(750) +#define ST7920_DELAY_3 DELAY_NS(750) + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#undef MOTHERBOARD +#define MOTHERBOARD BOARD_TEENSY35_36 + +#define IS_32BIT_TEENSY (defined(__MK64FX512__) || defined(__MK66FX1M0__)) +#define IS_TEENSY35 defined(__MK64FX512__) +#define IS_TEENSY36 defined(__MK66FX1M0__) + +#define NUM_SERIAL 1 + +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif SERIAL_PORT == 0 + #define MYSERIAL0 Serial +#elif SERIAL_PORT == 1 + #define MYSERIAL0 Serial1 +#elif SERIAL_PORT == 2 + #define MYSERIAL0 Serial2 +#elif SERIAL_PORT == 3 + #define MYSERIAL0 Serial3 +#endif + +#define HAL_SERVO_LIB libServo + +typedef int8_t pin_t; + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12u) ? (p) + 54u : -1) +#endif + +#define CRITICAL_SECTION_START uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +#undef sq +#define sq(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +// Add type-checking to pgm_read_word +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +/** clear reset reason */ +void HAL_clear_reset_source(void); + +/** reset reason */ +uint8_t HAL_get_reset_source(void); + +FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + int freeMemory(void); +} + +// SPI: Extended functions which take a channel number (hardware SPI only) +/** Write single byte to specified SPI channel */ +void spiSend(uint32_t chan, byte b); +/** Write buffer to specified SPI channel */ +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +/** Read single byte from specified SPI channel */ +uint8_t spiRec(uint32_t chan); + +// ADC + +void HAL_adc_init(); + +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_get_result() +#define HAL_ADC_READY() true + +#define HAL_ANALOG_SELECT(pin) NOOP; + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(void); + +/* + uint16_t HAL_getAdcReading(uint8_t chan); + + void HAL_startAdcConversion(uint8_t chan); + uint8_t HAL_pinToAdcChannel(int pin); + + uint16_t HAL_getAdcFreerun(uint8_t chan, bool wait_for_conversion = false); + //uint16_t HAL_getAdcSuperSample(uint8_t chan); + + void HAL_enable_AdcFreerun(void); + //void HAL_disable_AdcFreerun(uint8_t chan); +*/ + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +// -------------------------------------------------------------------------- +// +// -------------------------------------------------------------------------- + +#endif // _HAL_TEENSY_H diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.cpp new file mode 100644 index 0000000000..ff56036ccd --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.cpp @@ -0,0 +1,36 @@ +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "HAL_Servo_Teensy.h" + +uint8_t servoPin[MAX_SERVOS] = { 0 }; + +int8_t libServo::attach(const int pin) { + if (this->servoIndex >= MAX_SERVOS) return -1; + if (pin > 0) servoPin[this->servoIndex] = pin; + return Servo::attach(servoPin[this->servoIndex]); +} + +int8_t libServo::attach(const int pin, const int min, const int max) { + if (pin > 0) servoPin[this->servoIndex] = pin; + return Servo::attach(servoPin[this->servoIndex], min, max); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif + } +} + +#endif // HAS_SERVOS + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.h b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.h new file mode 100644 index 0000000000..78b2092051 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_Servo_Teensy.h @@ -0,0 +1,18 @@ +#ifndef _HAL_SERVO_TEENSY_H_ +#define _HAL_SERVO_TEENSY_H_ + +#include + +// Inherit and expand on the official library +class libServo : public Servo { + public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); + private: + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; + +#endif // _HAL_SERVO_TEENSY_H_ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_spi_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_spi_Teensy.cpp new file mode 100644 index 0000000000..6220225a1d --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_spi_Teensy.cpp @@ -0,0 +1,111 @@ +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "HAL.h" +#include +#include +#include "spi_pins.h" +#include "../../core/macros.h" + +static SPISettings spiConfig; + +// Standard SPI functions +/** Initialize SPI bus */ +void spiBegin(void) { + #if !PIN_EXISTS(SS) + #error SS_PIN not defined! + #endif + SET_OUTPUT(SS_PIN); + WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + + //#if DISABLED(SOFTWARE_SPI) + #if 0 + // set SS high - may be chip select for another SPI device + #if SET_SPI_SS_HIGH + WRITE(SS_PIN, HIGH); + #endif // SET_SPI_SS_HIGH + // set a default rate + spiInit(SPI_HALF_SPEED); // 1 + #endif // SOFTWARE_SPI +} + +/** Configure SPI for specified SPI speed */ +void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 10000000; break; + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 312500; break; + default: + clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +//------------------------------------------------------------------------------ +/** SPI receive a byte */ +uint8_t spiRec(void) { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +// SPDR = 0xFF; +// while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +// return SPDR; +} +//------------------------------------------------------------------------------ +/** SPI read data */ +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.transfer(buf, nbyte); + SPI.endTransaction(); +//if (nbyte-- == 0) return; +// SPDR = 0xFF; +//for (uint16_t i = 0; i < nbyte; i++) { +// while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +// buf[i] = SPDR; +// SPDR = 0xFF; +//} +//while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +//buf[nbyte] = SPDR; +} +//------------------------------------------------------------------------------ +/** SPI send a byte */ +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); +// SPDR = b; +// while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +} +//------------------------------------------------------------------------------ +/** SPI send block */ +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPI.endTransaction(); +} + + +/** Begin SPI transaction, set clock, bit order, data mode */ +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, bitOrder, dataMode); + + SPI.beginTransaction(spiConfig); +} + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.cpp new file mode 100644 index 0000000000..d31d9ddf67 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.cpp @@ -0,0 +1,114 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +****************************************************************************/ + + +/** + * Teensy3.5 __MK64FX512__ + * Teensy3.6 __MK66FX1M0__ + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "HAL.h" +#include "HAL_timers_Teensy.h" + +/** \brief Instruction Synchronization Barrier + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. +*/ +FORCE_INLINE static void __ISB(void) { + __asm__ __volatile__("isb 0xF":::"memory"); +} + +/** \brief Data Synchronization Barrier + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. +*/ +FORCE_INLINE static void __DSB(void) { + __asm__ __volatile__("dsb 0xF":::"memory"); +} + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + FTM0_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; + FTM0_SC = 0x00; // Set this to zero before changing the modulus + FTM0_CNT = 0x0000; // Reset the count to zero + FTM0_MOD = 0xFFFF; // max modulus = 65535 + FTM0_C0V = FTM0_TIMER_RATE / frequency; // Initial FTM Channel 0 compare value + FTM0_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM0_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 8 + FTM0_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + case 1: + FTM1_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; // Disable write protection, Enable FTM1 + FTM1_SC = 0x00; // Set this to zero before changing the modulus + FTM1_CNT = 0x0000; // Reset the count to zero + FTM1_MOD = 0xFFFF; // max modulus = 65535 + FTM1_C0V = FTM1_TIMER_RATE / frequency; // Initial FTM Channel 0 compare value 65535 + FTM1_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM1_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 4 + FTM1_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch(timer_num) { + case 0: NVIC_ENABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_ENABLE_IRQ(IRQ_FTM1); break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DISABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_DISABLE_IRQ(IRQ_FTM1); break; + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return NVIC_IS_ENABLED(IRQ_FTM0); + case 1: return NVIC_IS_ENABLED(IRQ_FTM1); + } + return false; +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch(timer_num) { + case 0: + FTM0_CNT = 0x0000; + FTM0_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM0_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + case 1: + FTM1_CNT = 0x0000; + FTM1_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM1_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + } +} + +#endif // Teensy3.5 or Teensy3.6 diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h new file mode 100644 index 0000000000..b44c310156 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/HAL_timers_Teensy.h @@ -0,0 +1,112 @@ +/* ************************************************************************** + + Marlin 3D Printer Firmware + Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +****************************************************************************/ + +/** + * Description: HAL for + * Teensy3.5 (__MK64FX512__) + * Teensy3.6 (__MK66FX1M0__) + */ + +#ifndef _HAL_TIMERS_TEENSY_H +#define _HAL_TIMERS_TEENSY_H + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define FTM0_TIMER_PRESCALE 8 +#define FTM1_TIMER_PRESCALE 4 +#define FTM0_TIMER_PRESCALE_BITS 0b011 +#define FTM1_TIMER_PRESCALE_BITS 0b010 + +#define FTM0_TIMER_RATE (F_BUS / FTM0_TIMER_PRESCALE) // 60MHz / 8 = 7500kHz +#define FTM1_TIMER_RATE (F_BUS / FTM1_TIMER_PRESCALE) // 60MHz / 4 = 15MHz + +#define HAL_TIMER_RATE (FTM0_TIMER_RATE) + +#define STEP_TIMER_NUM 0 +#define TEMP_TIMER_NUM 1 +#define PULSE_TIMER_NUM STEP_TIMER_NUM + +#define TEMP_TIMER_FREQUENCY 1000 + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define HAL_STEP_TIMER_ISR extern "C" void ftm0_isr(void) //void TC3_Handler() +#define HAL_TEMP_TIMER_ISR extern "C" void ftm1_isr(void) //void TC4_Handler() + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: FTM0_C0V = compare; break; + case 1: FTM1_C0V = compare; break; + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_C0V; + case 1: return FTM1_C0V; + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_CNT; + case 1: return FTM1_CNT; + } + return 0; +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num); +void HAL_timer_disable_interrupt(const uint8_t timer_num); +bool HAL_timer_interrupt_enabled(const uint8_t timer_num); + +void HAL_timer_isr_prologue(const uint8_t timer_num); +#define HAL_timer_isr_epilogue(TIMER_NUM) + +#endif // _HAL_TIMERS_TEENSY_H diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/SanityCheck.h b/Marlin/src/HAL/HAL_TEENSY35_36/SanityCheck.h new file mode 100644 index 0000000000..c8a9ee9bdf --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/SanityCheck.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Test TEENSY35_36 specific configuration values for errors at compile-time. + */ + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.5/3.6. Disable EMERGENCY_PARSER to continue." +#endif diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h b/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h new file mode 100644 index 0000000000..00e1b8b38a --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/endstop_interrupts.h @@ -0,0 +1,89 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#ifndef _ENDSTOP_INTERRUPTS_H_ +#define _ENDSTOP_INTERRUPTS_H_ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR(void) { endstops.update(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ + +void setup_endstop_interrupts( void ) { + + #if HAS_X_MAX + attachInterrupt(digitalPinToInterrupt(X_MAX_PIN), endstop_ISR, CHANGE); // assign it + #endif + + #if HAS_X_MIN + attachInterrupt(digitalPinToInterrupt(X_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Y_MAX + attachInterrupt(digitalPinToInterrupt(Y_MAX_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Y_MIN + attachInterrupt(digitalPinToInterrupt(Y_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z_MAX + attachInterrupt(digitalPinToInterrupt(Z_MAX_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z_MIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z2_MAX + attachInterrupt(digitalPinToInterrupt(Z2_MAX_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z2_MIN + attachInterrupt(digitalPinToInterrupt(Z2_MIN_PIN), endstop_ISR, CHANGE); + #endif + + #if HAS_Z_MIN_PROBE_PIN + attachInterrupt(digitalPinToInterrupt(Z_MIN_PROBE_PIN), endstop_ISR, CHANGE); + #endif +} + +#endif //_ENDSTOP_INTERRUPTS_H_ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/fastio_Teensy.h b/Marlin/src/HAL/HAL_TEENSY35_36/fastio_Teensy.h new file mode 100644 index 0000000000..4d31310d8d --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/fastio_Teensy.h @@ -0,0 +1,95 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Fast I/O Routines for Teensy 3.5 and Teensy 3.6 + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +#ifndef _FASTIO_TEENSY_H +#define _FASTIO_TEENSY_H + +#ifndef MASK + #define MASK(PIN) (1 << PIN) +#endif + +#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) +#define GPIO_BITBAND(reg, bit) (*(uint32_t *)GPIO_BITBAND_ADDR((reg), (bit))) + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); + * + * Why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html + */ + +#define _READ(p) bool(CORE_PIN ## p ## _PINREG & CORE_PIN ## p ## _BITMASK) + +#define _WRITE(P,V) do{ \ + if (V) CORE_PIN ## P ## _PORTSET = CORE_PIN ## P ## _BITMASK; \ + else CORE_PIN ## P ## _PORTCLEAR = CORE_PIN ## P ## _BITMASK; \ +}while(0) + +#define _TOGGLE(P) (*(&(CORE_PIN ## P ## _PORTCLEAR)+1) = CORE_PIN ## P ## _BITMASK) + +#define _SET_INPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _SET_OUTPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ +}while(0) + +#define _SET_INPUT_PULLUP(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _GET_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) +#define _GET_OUTPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) + +#define READ(IO) _READ(IO) + +#define WRITE_VAR(IO,V) _WRITE_VAR(IO,V) +#define WRITE(IO,V) _WRITE(IO,V) +#define TOGGLE(IO) _TOGGLE(IO) + +#define SET_INPUT(IO) _SET_INPUT(IO) +#define SET_INPUT_PULLUP(IO) _SET_INPUT_PULLUP(IO) +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) + +#define GET_INPUT(IO) _GET_INPUT(IO) +#define GET_OUTPUT(IO) _GET_OUTPUT(IO) + +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +/** + * Ports, functions, and pins + */ + +#define DIO0_PIN 8 + +#endif /* _FASTIO_TEENSY_H */ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_eeprom.cpp new file mode 100644 index 0000000000..46e88e04a5 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_eeprom.cpp @@ -0,0 +1,71 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../shared/persistent_store_api.h" +#include + +bool PersistentStore::access_start() { return true; } +bool PersistentStore::access_finish() { return true; } + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +size_t PersistentStore::capacity() { return E2END + 1; } + +#endif // EEPROM_SETTINGS +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp new file mode 100644 index 0000000000..009cdaa504 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp @@ -0,0 +1,51 @@ +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../shared/persistent_store_api.h" + +namespace HAL { +namespace PersistentStore { + +bool access_start() { return true; } +bool access_finish() { return true; } + +bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + }; + return false; +} + +bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + uint8_t c = eeprom_read_byte((unsigned char*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +} // PersistentStore +} // HAL + +#endif // EEPROM_SETTINGS +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/pinsDebug.h b/Marlin/src/HAL/HAL_TEENSY35_36/pinsDebug.h new file mode 100644 index 0000000000..f94f55c1d2 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/pinsDebug.h @@ -0,0 +1,110 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef HAL_PINSDEBUG_TEENSY_H + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin + +#define FTM0_CH0_PIN 22 +#define FTM0_CH1_PIN 23 +#define FTM0_CH2_PIN 9 +#define FTM0_CH3_PIN 10 +#define FTM0_CH4_PIN 6 +#define FTM0_CH5_PIN 20 +#define FTM0_CH6_PIN 21 +#define FTM0_CH7_PIN 5 +#define FTM1_CH0_PIN 3 +#define FTM1_CH1_PIN 4 +#define FTM2_CH0_PIN 29 +#define FTM2_CH1_PIN 30 +#define FTM3_CH0_PIN 2 +#define FTM3_CH1_PIN 14 +#define FTM3_CH2_PIN 7 +#define FTM3_CH3_PIN 8 +#define FTM3_CH4_PIN 35 +#define FTM3_CH5_PIN 36 +#define FTM3_CH6_PIN 37 +#define FTM3_CH7_PIN 38 +#if defined(__MK66FX1M0__) // Teensy3.6 + #define TPM1_CH0_PIN 16 + #define TPM1_CH1_PIN 17 +#endif + +#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && (P) <= analogInputToDigitalPin(9)) || ((P) >= analogInputToDigitalPin(12) && (P) <= analogInputToDigitalPin(20)) + +void HAL_print_analog_pin(char buffer[], int8_t pin) { + if (pin <= 23) sprintf(buffer, "(A%2d) ", int(pin - 14)); + else if (pin <= 39) sprintf(buffer, "(A%2d) ", int(pin - 19)); +} + +void HAL_analog_pin_state(char buffer[], int8_t pin) { + if (pin <= 23) sprintf(buffer, "Analog in =% 5d", analogRead(pin - 14)); + else if (pin <= 39) sprintf(buffer, "Analog in =% 5d", analogRead(pin - 19)); +} + +#define PWM_PRINT(V) do{ sprintf(buffer, "PWM: %4d", 22); SERIAL_ECHO(buffer); }while(0) +#define FTM_CASE(N,Z) \ + case FTM##N##_CH##Z##_PIN: \ + if (FTM##N##_C##Z##V) { \ + PWM_PRINT(FTM##N##_C##Z##V); \ + return true; \ + } else return false + +/** + * Print a pin's PWM status. + * Return true if it's currently a PWM pin. + */ +bool HAL_pwm_status(int8_t pin) { + char buffer[20]; // for the sprintf statements + switch(pin) { + FTM_CASE(0,0); + FTM_CASE(0,1); + FTM_CASE(0,2); + FTM_CASE(0,3); + FTM_CASE(0,4); + FTM_CASE(0,5); + FTM_CASE(0,6); + FTM_CASE(0,7); + FTM_CASE(1,0); + FTM_CASE(1,1); + FTM_CASE(2,0); + FTM_CASE(2,1); + FTM_CASE(3,0); + FTM_CASE(3,1); + FTM_CASE(3,2); + FTM_CASE(3,3); + FTM_CASE(3,4); + FTM_CASE(3,5); + FTM_CASE(3,6); + FTM_CASE(3,7); + + case NOT_ON_TIMER: + default: + return false; + } + SERIAL_PROTOCOLPGM(" "); +} + +static void HAL_pwm_details(uint8_t pin) { /* TODO */ } + +#endif diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/spi_pins.h b/Marlin/src/HAL/HAL_TEENSY35_36/spi_pins.h new file mode 100644 index 0000000000..ecbc690e4d --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/spi_pins.h @@ -0,0 +1,31 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef SPI_PINS_H_ +#define SPI_PINS_H_ + +#define SCK_PIN 13 +#define MISO_PIN 12 +#define MOSI_PIN 11 +#define SS_PIN 20 //SDSS // A.28, A.29, B.21, C.26, C.29 + +#endif /* SPI_PINS_H_ */ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.cpp new file mode 100644 index 0000000000..0c15824742 --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.cpp @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog_Teensy.h" + +void watchdog_init() { + WDOG_TOVALH = 0; + WDOG_TOVALL = 4000; + WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; +} + +#endif // USE_WATCHDOG + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.h b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.h new file mode 100644 index 0000000000..ca05dd225a --- /dev/null +++ b/Marlin/src/HAL/HAL_TEENSY35_36/watchdog_Teensy.h @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef WATCHDOG_TEENSY_H +#define WATCHDOG_TEENSY_H + +#include "HAL.h" + +// Arduino Due core now has watchdog support + +void watchdog_init(); + +inline void watchdog_reset() { + // Watchdog refresh sequence + WDOG_REFRESH = 0xA602; + WDOG_REFRESH = 0xB480; +} + +#endif // WATCHDOG_TEENSY_H diff --git a/Marlin/src/HAL/LINUX/HAL.cpp b/Marlin/src/HAL/LINUX/HAL.cpp deleted file mode 100644 index d7d7c2d2b4..0000000000 --- a/Marlin/src/HAL/LINUX/HAL.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include "../../inc/MarlinConfig.h" -#include "../shared/Delay.h" - -HalSerial usb_serial; - -// U8glib required functions -extern "C" void u8g_xMicroDelay(uint16_t val) { - DELAY_US(val); -} -extern "C" void u8g_MicroDelay() { - u8g_xMicroDelay(1); -} -extern "C" void u8g_10MicroDelay() { - u8g_xMicroDelay(10); -} -extern "C" void u8g_Delay(uint16_t val) { - delay(val); -} -//************************// - -// return free heap space -int freeMemory() { - return 0; -} - -// ------------------------ -// ADC -// ------------------------ - -void HAL_adc_init() { - -} - -void HAL_adc_enable_channel(const uint8_t ch) { - -} - -uint8_t active_ch = 0; -void HAL_adc_start_conversion(const uint8_t ch) { - active_ch = ch; -} - -bool HAL_adc_finished() { - return true; -} - -uint16_t HAL_adc_get_result() { - pin_t pin = analogInputToDigitalPin(active_ch); - if (!VALID_PIN(pin)) return 0; - uint16_t data = ((Gpio::get(pin) >> 2) & 0x3FF); - return data; // return 10bit value as Marlin expects -} - -void HAL_pwm_init() { - -} - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h deleted file mode 100644 index 2e545e03d6..0000000000 --- a/Marlin/src/HAL/LINUX/HAL.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define CPU_32_BIT - -#define F_CPU 100000000 -#define SystemCoreClock F_CPU -#include -#include -#include - -#undef min -#undef max - -#include - -void _printf (const char *format, ...); -void _putc(uint8_t c); -uint8_t _getc(); - -//extern "C" volatile uint32_t _millis; - -//arduino: Print.h -#define DEC 10 -#define HEX 16 -#define OCT 8 -#define BIN 2 -//arduino: binary.h (weird defines) -#define B01 1 -#define B10 2 - -#include "hardware/Clock.h" - -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" -#include "fastio.h" -#include "watchdog.h" -#include "serial.h" - -#define SHARED_SERVOS HAS_SERVOS - -extern HalSerial usb_serial; -#define MYSERIAL0 usb_serial - -#define ST7920_DELAY_1 DELAY_NS(600) -#define ST7920_DELAY_2 DELAY_NS(750) -#define ST7920_DELAY_3 DELAY_NS(750) - -// -// Interrupts -// -#define CRITICAL_SECTION_START() -#define CRITICAL_SECTION_END() -#define ISRS_ENABLED() -#define ENABLE_ISRS() -#define DISABLE_ISRS() - -inline void HAL_init() {} - -// Utility functions -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -int freeMemory(); -#pragma GCC diagnostic pop - -// ADC -#define HAL_ADC_VREF 5.0 -#define HAL_ADC_RESOLUTION 10 -#define HAL_ANALOG_SELECT(ch) HAL_adc_enable_channel(ch) -#define HAL_START_ADC(ch) HAL_adc_start_conversion(ch) -#define HAL_READ_ADC() HAL_adc_get_result() -#define HAL_ADC_READY() true - -void HAL_adc_init(); -void HAL_adc_enable_channel(const uint8_t ch); -void HAL_adc_start_conversion(const uint8_t ch); -uint16_t HAL_adc_get_result(); - -// Reset source -inline void HAL_clear_reset_source(void) {} -inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -/* ---------------- Delay in cycles */ -FORCE_INLINE static void DELAY_CYCLES(uint64_t x) { - Clock::delayCycles(x); -} - -// Add strcmp_P if missing -#ifndef strcmp_P - #define strcmp_P(a, b) strcmp((a), (b)) -#endif diff --git a/Marlin/src/HAL/LINUX/arduino.cpp b/Marlin/src/HAL/LINUX/arduino.cpp deleted file mode 100644 index 4b56d02a38..0000000000 --- a/Marlin/src/HAL/LINUX/arduino.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include -#include "../../inc/MarlinConfig.h" -#include "hardware/Clock.h" -#include "../shared/Delay.h" - -// Interrupts -void cli() { } // Disable -void sei() { } // Enable - -// Time functions -void _delay_ms(const int delay_ms) { - delay(delay_ms); -} - -uint32_t millis() { - return (uint32_t)Clock::millis(); -} - -// This is required for some Arduino libraries we are using -void delayMicroseconds(uint32_t us) { - Clock::delayMicros(us); -} - -extern "C" void delay(const int msec) { - Clock::delayMillis(msec); -} - -// IO functions -// As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) -void pinMode(const pin_t pin, const uint8_t mode) { - if (!VALID_PIN(pin)) return; - Gpio::setMode(pin, mode); -} - -void digitalWrite(pin_t pin, uint8_t pin_status) { - if (!VALID_PIN(pin)) return; - Gpio::set(pin, pin_status); -} - -bool digitalRead(pin_t pin) { - if (!VALID_PIN(pin)) return false; - return Gpio::get(pin); -} - -void analogWrite(pin_t pin, int pwm_value) { // 1 - 254: pwm_value, 0: LOW, 255: HIGH - if (!VALID_PIN(pin)) return; - Gpio::set(pin, pwm_value); -} - -uint16_t analogRead(pin_t adc_pin) { - if (!VALID_PIN(DIGITAL_PIN_TO_ANALOG_PIN(adc_pin))) return 0; - return Gpio::get(DIGITAL_PIN_TO_ANALOG_PIN(adc_pin)); -} - -char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s) { - char format_string[20]; - snprintf(format_string, 20, "%%%d.%df", __width, __prec); - sprintf(__s, format_string, __val); - return __s; -} - -int32_t random(int32_t max) { - return rand() % max; -} - -int32_t random(int32_t min, int32_t max) { - return min + rand() % (max - min); -} - -void randomSeed(uint32_t value) { - srand(value); -} - -int map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) { - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; -} - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/eeprom.cpp b/Marlin/src/HAL/LINUX/eeprom.cpp deleted file mode 100644 index 967ca851ab..0000000000 --- a/Marlin/src/HAL/LINUX/eeprom.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(EEPROM_SETTINGS) - -#include "../shared/eeprom_api.h" -#include - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB of Emulated EEPROM -#endif - -uint8_t buffer[MARLIN_EEPROM_SIZE]; -char filename[] = "eeprom.dat"; - -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { - const char eeprom_erase_value = 0xFF; - FILE * eeprom_file = fopen(filename, "rb"); - if (eeprom_file == nullptr) return false; - - fseek(eeprom_file, 0L, SEEK_END); - std::size_t file_size = ftell(eeprom_file); - - if (file_size < MARLIN_EEPROM_SIZE) { - memset(buffer + file_size, eeprom_erase_value, MARLIN_EEPROM_SIZE - file_size); - } - else { - fseek(eeprom_file, 0L, SEEK_SET); - fread(buffer, sizeof(uint8_t), sizeof(buffer), eeprom_file); - } - - fclose(eeprom_file); - return true; -} - -bool PersistentStore::access_finish() { - FILE * eeprom_file = fopen(filename, "wb"); - if (eeprom_file == nullptr) return false; - fwrite(buffer, sizeof(uint8_t), sizeof(buffer), eeprom_file); - fclose(eeprom_file); - return true; -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - std::size_t bytes_written = 0; - - for (std::size_t i = 0; i < size; i++) { - buffer[pos+i] = value[i]; - bytes_written ++; - } - - crc16(crc, value, size); - pos = pos + size; - return (bytes_written != size); // return true for any error -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { - std::size_t bytes_read = 0; - if (writing) { - for (std::size_t i = 0; i < size; i++) { - value[i] = buffer[pos+i]; - bytes_read ++; - } - crc16(crc, value, size); - } - else { - uint8_t temp[size]; - for (std::size_t i = 0; i < size; i++) { - temp[i] = buffer[pos+i]; - bytes_read ++; - } - crc16(crc, temp, size); - } - - pos = pos + size; - return bytes_read != size; // return true for any error -} - -#endif // EEPROM_SETTINGS -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/fastio.h b/Marlin/src/HAL/LINUX/fastio.h deleted file mode 100644 index 4567c62a51..0000000000 --- a/Marlin/src/HAL/LINUX/fastio.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O Routines for X86_64 - */ - -#include "../shared/Marduino.h" -#include - -#define SET_DIR_INPUT(IO) Gpio::setDir(IO, 1) -#define SET_DIR_OUTPUT(IO) Gpio::setDir(IO, 0) - -#define SET_MODE(IO, mode) Gpio::setMode(IO, mode) - -#define WRITE_PIN_SET(IO) Gpio::set(IO) -#define WRITE_PIN_CLR(IO) Gpio::clear(IO) - -#define READ_PIN(IO) Gpio::get(IO) -#define WRITE_PIN(IO,V) Gpio::set(IO, V) - -/** - * Magic I/O routines - * - * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); - * - * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html - */ - -/// Read a pin -#define _READ(IO) READ_PIN(IO) - -/// Write to a pin -#define _WRITE(IO,V) WRITE_PIN(IO,V) - -/// toggle a pin -#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) - -/// set pin as input -#define _SET_INPUT(IO) SET_DIR_INPUT(IO) - -/// set pin as output -#define _SET_OUTPUT(IO) SET_DIR_OUTPUT(IO) - -/// set pin as input with pullup mode -#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) - -/// set pin as input with pulldown mode -#define _PULLDOWN(IO,V) pinMode(IO, (V) ? INPUT_PULLDOWN : INPUT) - -// hg42: all pins can be input or output (I hope) -// hg42: undefined pins create compile error (IO, is no pin) -// hg42: currently not used, but was used by pinsDebug - -/// check if pin is an input -#define _IS_INPUT(IO) (LPC1768_PIN_PIN(IO) >= 0) - -/// check if pin is an output -#define _IS_OUTPUT(IO) (LPC1768_PIN_PIN(IO) >= 0) - -/// Read a pin wrapper -#define READ(IO) _READ(IO) - -/// Write to a pin wrapper -#define WRITE(IO,V) _WRITE(IO,V) - -/// toggle a pin wrapper -#define TOGGLE(IO) _TOGGLE(IO) - -/// set pin as input wrapper -#define SET_INPUT(IO) _SET_INPUT(IO) -/// set pin as input with pullup wrapper -#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) -/// set pin as input with pulldown wrapper -#define SET_INPUT_PULLDOWN(IO) do{ _SET_INPUT(IO); _PULLDOWN(IO, HIGH); }while(0) -/// set pin as output wrapper - reads the pin and sets the output to that value -#define SET_OUTPUT(IO) do{ _WRITE(IO, _READ(IO)); _SET_OUTPUT(IO); }while(0) -// set pin as PWM -#define SET_PWM(IO) SET_OUTPUT(IO) - -/// check if pin is an input wrapper -#define IS_INPUT(IO) _IS_INPUT(IO) -/// check if pin is an output wrapper -#define IS_OUTPUT(IO) _IS_OUTPUT(IO) - -// Shorthand -#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) diff --git a/Marlin/src/HAL/LINUX/hardware/Clock.cpp b/Marlin/src/HAL/LINUX/hardware/Clock.cpp deleted file mode 100644 index 1984a4a44e..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/Clock.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include "../../../inc/MarlinConfig.h" -#include "Clock.h" - -std::chrono::nanoseconds Clock::startup = std::chrono::high_resolution_clock::now().time_since_epoch(); -uint32_t Clock::frequency = F_CPU; -double Clock::time_multiplier = 1.0; - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Clock.h b/Marlin/src/HAL/LINUX/hardware/Clock.h deleted file mode 100644 index 072eacfd73..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/Clock.h +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include -#include - -class Clock { -public: - static uint64_t ticks(uint32_t frequency = Clock::frequency) { - return (Clock::nanos() - Clock::startup.count()) / (1000000000ULL / frequency); - } - - static uint64_t nanosToTicks(uint64_t ns, uint32_t frequency = Clock::frequency) { - return ns / (1000000000ULL / frequency); - } - - // Time acceleration compensated - static uint64_t ticksToNanos(uint64_t tick, uint32_t frequency = Clock::frequency) { - return (tick * (1000000000ULL / frequency)) / Clock::time_multiplier; - } - - static void setFrequency(uint32_t freq) { - Clock::frequency = freq; - } - - // Time Acceleration compensated - static uint64_t nanos() { - auto now = std::chrono::high_resolution_clock::now().time_since_epoch(); - return (now.count() - Clock::startup.count()) * Clock::time_multiplier; - } - - static uint64_t micros() { - return Clock::nanos() / 1000; - } - - static uint64_t millis() { - return Clock::micros() / 1000; - } - - static double seconds() { - return Clock::nanos() / 1000000000.0; - } - - static void delayCycles(uint64_t cycles) { - std::this_thread::sleep_for(std::chrono::nanoseconds( (1000000000L / frequency) * cycles) / Clock::time_multiplier ); - } - - static void delayMicros(uint64_t micros) { - std::this_thread::sleep_for(std::chrono::microseconds( micros ) / Clock::time_multiplier); - } - - static void delayMillis(uint64_t millis) { - std::this_thread::sleep_for(std::chrono::milliseconds( millis ) / Clock::time_multiplier); - } - - static void delaySeconds(double secs) { - std::this_thread::sleep_for(std::chrono::duration(secs * 1000) / Clock::time_multiplier); - } - - // Will reduce timer resolution increasing likelihood of overflows - static void setTimeMultiplier(double tm) { - Clock::time_multiplier = tm; - } - -private: - static std::chrono::nanoseconds startup; - static uint32_t frequency; - static double time_multiplier; -}; diff --git a/Marlin/src/HAL/LINUX/hardware/Gpio.cpp b/Marlin/src/HAL/LINUX/hardware/Gpio.cpp deleted file mode 100644 index 61a7be7da9..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/Gpio.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include "Gpio.h" - -pin_data Gpio::pin_map[Gpio::pin_count+1] = {}; -IOLogger* Gpio::logger = nullptr; - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Gpio.h b/Marlin/src/HAL/LINUX/hardware/Gpio.h deleted file mode 100644 index 9255ec1dfc..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/Gpio.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "Clock.h" -#include "../../../inc/MarlinConfigPre.h" -#include - -typedef int16_t pin_type; - -struct GpioEvent { - enum Type { - NOP, - FALL, - RISE, - SET_VALUE, - SETM, - SETD - }; - uint64_t timestamp; - pin_type pin_id; - GpioEvent::Type event; - - GpioEvent(uint64_t timestamp, pin_type pin_id, GpioEvent::Type event){ - this->timestamp = timestamp; - this->pin_id = pin_id; - this->event = event; - } -}; - -class IOLogger { -public: - virtual ~IOLogger(){}; - virtual void log(GpioEvent ev) = 0; -}; - -class Peripheral { -public: - virtual ~Peripheral(){}; - virtual void interrupt(GpioEvent ev) = 0; - virtual void update() = 0; -}; - -struct pin_data { - uint8_t dir; - uint8_t mode; - uint16_t value; - Peripheral* cb; -}; - -class Gpio { -public: - - static const pin_type pin_count = 255; - static pin_data pin_map[pin_count+1]; - - static bool valid_pin(pin_type pin) { - return pin >= 0 && pin <= pin_count; - } - - static void set(pin_type pin) { - set(pin, 1); - } - - static void set(pin_type pin, uint16_t value) { - if (!valid_pin(pin)) return; - GpioEvent::Type evt_type = value > 1 ? GpioEvent::SET_VALUE : value > pin_map[pin].value ? GpioEvent::RISE : value < pin_map[pin].value ? GpioEvent::FALL : GpioEvent::NOP; - pin_map[pin].value = value; - GpioEvent evt(Clock::nanos(), pin, evt_type); - if (pin_map[pin].cb != nullptr) { - pin_map[pin].cb->interrupt(evt); - } - if (Gpio::logger != nullptr) Gpio::logger->log(evt); - } - - static uint16_t get(pin_type pin) { - if (!valid_pin(pin)) return 0; - return pin_map[pin].value; - } - - static void clear(pin_type pin) { - set(pin, 0); - } - - static void setMode(pin_type pin, uint8_t value) { - if (!valid_pin(pin)) return; - pin_map[pin].mode = value; - GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETM); - if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt); - if (Gpio::logger != nullptr) Gpio::logger->log(evt); - } - - static uint8_t getMode(pin_type pin) { - if (!valid_pin(pin)) return 0; - return pin_map[pin].mode; - } - - static void setDir(pin_type pin, uint8_t value) { - if (!valid_pin(pin)) return; - pin_map[pin].dir = value; - GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETD); - if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt); - if (Gpio::logger != nullptr) Gpio::logger->log(evt); - } - - static uint8_t getDir(pin_type pin) { - if (!valid_pin(pin)) return 0; - return pin_map[pin].dir; - } - - static void attachPeripheral(pin_type pin, Peripheral* per) { - if (!valid_pin(pin)) return; - pin_map[pin].cb = per; - } - - static void attachLogger(IOLogger* logger) { - Gpio::logger = logger; - } - -private: - static IOLogger* logger; -}; diff --git a/Marlin/src/HAL/LINUX/hardware/Heater.cpp b/Marlin/src/HAL/LINUX/hardware/Heater.cpp deleted file mode 100644 index 70df816182..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/Heater.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include "Clock.h" -#include -#include "../../../inc/MarlinConfig.h" - -#include "Heater.h" - -Heater::Heater(pin_t heater, pin_t adc) { - heater_state = 0; - room_temp_raw = 150; - last = Clock::micros(); - heater_pin = heater; - adc_pin = adc; - heat = 0.0; -} - -Heater::~Heater() { -} - -void Heater::update() { - // crude pwm read and cruder heat simulation - auto now = Clock::micros(); - double delta = (now - last); - if (delta > 1000 ) { - heater_state = pwmcap.update(0xFFFF * Gpio::pin_map[heater_pin].value); - last = now; - heat += (heater_state - heat) * (delta / 1000000000.0); - - NOLESS(heat, room_temp_raw); - Gpio::pin_map[analogInputToDigitalPin(adc_pin)].value = 0xFFFF - (uint16_t)heat; - } -} - -void Heater::interrupt(GpioEvent ev) { - // ununsed -} - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Heater.h b/Marlin/src/HAL/LINUX/hardware/Heater.h deleted file mode 100644 index b17078d0b7..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/Heater.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "Gpio.h" - -struct LowpassFilter { - uint64_t data_delay = 0; - uint16_t update(uint16_t value) { - data_delay = data_delay - (data_delay >> 6) + value; - return (uint16_t)(data_delay >> 6); - } -}; - -class Heater: public Peripheral { -public: - Heater(pin_t heater, pin_t adc); - virtual ~Heater(); - void interrupt(GpioEvent ev); - void update(); - - pin_t heater_pin, adc_pin; - uint16_t room_temp_raw; - uint16_t heater_state; - LowpassFilter pwmcap; - double heat; - uint64_t last; -}; diff --git a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp deleted file mode 100644 index c11fd1f55c..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include "IOLoggerCSV.h" - -IOLoggerCSV::IOLoggerCSV(std::string filename) { - file.open(filename); -} - -IOLoggerCSV::~IOLoggerCSV() { - file.close(); -} - -void IOLoggerCSV::log(GpioEvent ev) { - std::lock_guard lock(vector_lock); - events.push_back(ev); //minimal impact to signal handler -} - -void IOLoggerCSV::flush() { - { std::lock_guard lock(vector_lock); - while (!events.empty()) { - file << events.front().timestamp << ", "<< events.front().pin_id << ", " << events.front().event << std::endl; - events.pop_front(); - } - } - file.flush(); -} - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h deleted file mode 100644 index d8fe7383bd..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include -#include -#include -#include "Gpio.h" - -class IOLoggerCSV: public IOLogger { -public: - IOLoggerCSV(std::string filename); - virtual ~IOLoggerCSV(); - void flush(); - void log(GpioEvent ev); - -private: - std::ofstream file; - std::list events; - std::mutex vector_lock; -}; diff --git a/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp b/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp deleted file mode 100644 index c5b3ccc986..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include -#include -#include "Clock.h" -#include "LinearAxis.h" - -LinearAxis::LinearAxis(pin_type enable, pin_type dir, pin_type step, pin_type end_min, pin_type end_max) { - enable_pin = enable; - dir_pin = dir; - step_pin = step; - min_pin = end_min; - max_pin = end_max; - - min_position = 50; - max_position = (200*80) + min_position; - position = rand() % ((max_position - 40) - min_position) + (min_position + 20); - last_update = Clock::nanos(); - - Gpio::attachPeripheral(step_pin, this); - -} - -LinearAxis::~LinearAxis() { - -} - -void LinearAxis::update() { - -} - -void LinearAxis::interrupt(GpioEvent ev) { - if (ev.pin_id == step_pin && !Gpio::pin_map[enable_pin].value){ - if (ev.event == GpioEvent::RISE) { - last_update = ev.timestamp; - position += -1 + 2 * Gpio::pin_map[dir_pin].value; - Gpio::pin_map[min_pin].value = (position < min_position); - //Gpio::pin_map[max_pin].value = (position > max_position); - //if (position < min_position) printf("axis(%d) endstop : pos: %d, mm: %f, min: %d\n", step_pin, position, position / 80.0, Gpio::pin_map[min_pin].value); - } - } -} - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/LinearAxis.h b/Marlin/src/HAL/LINUX/hardware/LinearAxis.h deleted file mode 100644 index 34541e79a1..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/LinearAxis.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include -#include "Gpio.h" - -class LinearAxis: public Peripheral { -public: - LinearAxis(pin_type enable, pin_type dir, pin_type step, pin_type end_min, pin_type end_max); - virtual ~LinearAxis(); - void update(); - void interrupt(GpioEvent ev); - - pin_type enable_pin; - pin_type dir_pin; - pin_type step_pin; - pin_type min_pin; - pin_type max_pin; - - int32_t position; - int32_t min_position; - int32_t max_position; - uint64_t last_update; - -}; diff --git a/Marlin/src/HAL/LINUX/hardware/Timer.cpp b/Marlin/src/HAL/LINUX/hardware/Timer.cpp deleted file mode 100644 index 9f0d6a8f3a..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/Timer.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include "Timer.h" -#include - -Timer::Timer() { - active = false; - compare = 0; - frequency = 0; - overruns = 0; - timerid = 0; - cbfn = nullptr; - period = 0; - start_time = 0; - avg_error = 0; -} - -Timer::~Timer() { - timer_delete(timerid); -} - -void Timer::init(uint32_t sig_id, uint32_t sim_freq, callback_fn* fn) { - struct sigaction sa; - struct sigevent sev; - - frequency = sim_freq; - cbfn = fn; - - sa.sa_flags = SA_SIGINFO; - sa.sa_sigaction = Timer::handler; - sigemptyset(&sa.sa_mask); - if (sigaction(SIGRTMIN, &sa, nullptr) == -1) { - return; // todo: handle error - } - - sigemptyset(&mask); - sigaddset(&mask, SIGRTMIN); - - disable(); - - sev.sigev_notify = SIGEV_SIGNAL; - sev.sigev_signo = SIGRTMIN; - sev.sigev_value.sival_ptr = (void*)this; - if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) { - return; // todo: handle error - } -} - -void Timer::start(uint32_t frequency) { - setCompare(this->frequency / frequency); - //printf("timer(%ld) started\n", getID()); -} - -void Timer::enable() { - if (sigprocmask(SIG_UNBLOCK, &mask, nullptr) == -1) { - return; // todo: handle error - } - active = true; - //printf("timer(%ld) enabled\n", getID()); -} - -void Timer::disable() { - if (sigprocmask(SIG_SETMASK, &mask, nullptr) == -1) { - return; // todo: handle error - } - active = false; -} - -void Timer::setCompare(uint32_t compare) { - uint32_t nsec_offset = 0; - if (active) { - nsec_offset = Clock::nanos() - this->start_time; // calculate how long the timer would have been running for - nsec_offset = nsec_offset < 1000 ? nsec_offset : 0; // constrain, this shouldn't be needed but apparently Marlin enables interrupts on the stepper timer before initialising it, todo: investigate ?bug? - } - this->compare = compare; - uint64_t ns = Clock::ticksToNanos(compare, frequency) - nsec_offset; - struct itimerspec its; - its.it_value.tv_sec = ns / 1000000000; - its.it_value.tv_nsec = ns % 1000000000; - its.it_interval.tv_sec = its.it_value.tv_sec; - its.it_interval.tv_nsec = its.it_value.tv_nsec; - - if (timer_settime(timerid, 0, &its, nullptr) == -1) { - printf("timer(%ld) failed, compare: %d(%ld)\n", getID(), compare, its.it_value.tv_nsec); - return; // todo: handle error - } - //printf("timer(%ld) started, compare: %d(%d)\n", getID(), compare, its.it_value.tv_nsec); - this->period = its.it_value.tv_nsec; - this->start_time = Clock::nanos(); -} - -uint32_t Timer::getCount() { - return Clock::nanosToTicks(Clock::nanos() - this->start_time, frequency); -} - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Timer.h b/Marlin/src/HAL/LINUX/hardware/Timer.h deleted file mode 100644 index 757efdcdbd..0000000000 --- a/Marlin/src/HAL/LINUX/hardware/Timer.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include -#include -#include -#include -#include -#include - -#include "Clock.h" - -class Timer { -public: - Timer(); - virtual ~Timer(); - - typedef void (callback_fn)(); - - void init(uint32_t sig_id, uint32_t sim_freq, callback_fn* fn); - void start(uint32_t frequency); - void enable(); - bool enabled() {return active;} - void disable(); - void setCompare(uint32_t compare); - uint32_t getCount(); - uint32_t getCompare() {return compare;} - uint32_t getOverruns() {return overruns;} - uint32_t getAvgError() {return avg_error;} - - intptr_t getID() { - return (*(intptr_t*)timerid); - } - - static void handler(int sig, siginfo_t *si, void *uc){ - Timer* _this = (Timer*)si->si_value.sival_ptr; - _this->avg_error += (Clock::nanos() - _this->start_time) - _this->period; //high_resolution_clock is also limited in precision, but best we have - _this->avg_error /= 2; //very crude precision analysis (actually within +-500ns usually) - _this->start_time = Clock::nanos(); // wrap - _this->cbfn(); - _this->overruns += timer_getoverrun(_this->timerid); // even at 50Khz this doesn't stay zero, again demonstrating the limitations - // using a realtime linux kernel would help somewhat - } - -private: - bool active; - uint32_t compare; - uint32_t frequency; - uint32_t overruns; - timer_t timerid; - sigset_t mask; - callback_fn* cbfn; - uint64_t period; - uint64_t avg_error; - uint64_t start_time; -}; diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h b/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h deleted file mode 100644 index 99a6fc2753..0000000000 --- a/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/LINUX." -#endif diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h b/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_post.h b/Marlin/src/HAL/LINUX/inc/Conditionals_post.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/LINUX/inc/Conditionals_post.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/LINUX/inc/SanityCheck.h b/Marlin/src/HAL/LINUX/inc/SanityCheck.h deleted file mode 100644 index 84167c97a1..0000000000 --- a/Marlin/src/HAL/LINUX/inc/SanityCheck.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test X86_64-specific configuration values for errors at compile-time. - */ - -// Emulating RAMPS -#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) - #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" -#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on LINUX." -#endif - -#if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." -#endif diff --git a/Marlin/src/HAL/LINUX/include/pinmapping.cpp b/Marlin/src/HAL/LINUX/include/pinmapping.cpp deleted file mode 100644 index 870ab3a96e..0000000000 --- a/Marlin/src/HAL/LINUX/include/pinmapping.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include - -#include "../../../gcode/parser.h" - -uint8_t analog_offset = NUM_DIGITAL_PINS - NUM_ANALOG_INPUTS; - -// Get the digital pin for an analog index -pin_t analogInputToDigitalPin(const int8_t p) { - return (WITHIN(p, 0, NUM_ANALOG_INPUTS) ? analog_offset + p : P_NC); -} - -// Return the index of a pin number -int16_t GET_PIN_MAP_INDEX(const pin_t pin) { - return pin; -} - -// Test whether the pin is valid -bool VALID_PIN(const pin_t p) { - return WITHIN(p, 0, NUM_DIGITAL_PINS); -} - -// Get the analog index for a digital pin -int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t p) { - return (WITHIN(p, analog_offset, NUM_DIGITAL_PINS) ? p - analog_offset : P_NC); -} - -// Test whether the pin is PWM -bool PWM_PIN(const pin_t p) { - return false; -} - -// Test whether the pin is interruptable -bool INTERRUPT_PIN(const pin_t p) { - return false; -} - -// Get the pin number at the given index -pin_t GET_PIN_MAP_PIN(const int16_t ind) { - return ind; -} - -int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { - return parser.intval(code, dval); -} - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/include/pinmapping.h b/Marlin/src/HAL/LINUX/include/pinmapping.h deleted file mode 100644 index 98f4b812e8..0000000000 --- a/Marlin/src/HAL/LINUX/include/pinmapping.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../inc/MarlinConfigPre.h" - -#include -#include "../hardware/Gpio.h" - -typedef pin_type pin_t; - -#define P_NC -1 -constexpr uint16_t NUM_DIGITAL_PINS = Gpio::pin_count; -constexpr uint8_t NUM_ANALOG_INPUTS = 16; - -#define HAL_SENSITIVE_PINS - -// Get the digital pin for an analog index -pin_t analogInputToDigitalPin(const int8_t p); - -// Return the index of a pin number -int16_t GET_PIN_MAP_INDEX(const pin_t pin); - -// Test whether the pin is valid -bool VALID_PIN(const pin_t p); - -// Get the analog index for a digital pin -int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t p); - -// Test whether the pin is PWM -bool PWM_PIN(const pin_t p); - -// Test whether the pin is interruptable -bool INTERRUPT_PIN(const pin_t p); - -// Get the pin number at the given index -pin_t GET_PIN_MAP_PIN(const int16_t ind); - -// Parse a G-code word into a pin index -int16_t PARSED_PIN_INDEX(const char code, const int16_t dval); diff --git a/Marlin/src/HAL/LINUX/include/serial.h b/Marlin/src/HAL/LINUX/include/serial.h deleted file mode 100644 index e916249389..0000000000 --- a/Marlin/src/HAL/LINUX/include/serial.h +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../inc/MarlinConfigPre.h" -#if ENABLED(EMERGENCY_PARSER) - #include "../../../feature/e_parser.h" -#endif - -#include -#include - -/** - * Generic RingBuffer - * T type of the buffer array - * S size of the buffer (must be power of 2) - */ -template class RingBuffer { -public: - RingBuffer() { index_read = index_write = 0; } - uint32_t available() volatile { return index_write - index_read; } - uint32_t free() volatile { return buffer_size - available(); } - bool empty() volatile { return index_read == index_write; } - bool full() volatile { return available() == buffer_size; } - void clear() volatile { index_read = index_write = 0; } - - bool peek(T *value) volatile { - if (value == 0 || available() == 0) - return false; - *value = buffer[mask(index_read)]; - return true; - } - - int read() volatile { - if (empty()) return -1; - return buffer[mask(index_read++)]; - } - - bool write(T value) volatile { - if (full()) return false; - buffer[mask(index_write++)] = value; - return true; - } - -private: - uint32_t mask(uint32_t val) volatile { - return buffer_mask & val; - } - - static const uint32_t buffer_size = S; - static const uint32_t buffer_mask = buffer_size - 1; - volatile T buffer[buffer_size]; - volatile uint32_t index_write; - volatile uint32_t index_read; -}; - -class HalSerial { -public: - - #if ENABLED(EMERGENCY_PARSER) - EmergencyParser::State emergency_state; - static inline bool emergency_parser_enabled() { return true; } - #endif - - HalSerial() { host_connected = true; } - - void begin(int32_t) {} - - void end() {} - - int peek() { - uint8_t value; - return receive_buffer.peek(&value) ? value : -1; - } - - int read() { return receive_buffer.read(); } - - size_t write(char c) { - if (!host_connected) return 0; - while (!transmit_buffer.free()); - return transmit_buffer.write(c); - } - - operator bool() { return host_connected; } - - uint16_t available() { - return (uint16_t)receive_buffer.available(); - } - - void flush() { receive_buffer.clear(); } - - uint8_t availableForWrite() { - return transmit_buffer.free() > 255 ? 255 : (uint8_t)transmit_buffer.free(); - } - - void flushTX() { - if (host_connected) - while (transmit_buffer.available()) { /* nada */ } - } - - void printf(const char *format, ...) { - static char buffer[256]; - va_list vArgs; - va_start(vArgs, format); - int length = vsnprintf((char *) buffer, 256, (char const *) format, vArgs); - va_end(vArgs); - if (length > 0 && length < 256) { - if (host_connected) { - for (int i = 0; i < length;) { - if (transmit_buffer.write(buffer[i])) { - ++i; - } - } - } - } - } - - #define DEC 10 - #define HEX 16 - #define OCT 8 - #define BIN 2 - - void print_bin(uint32_t value, uint8_t num_digits) { - uint32_t mask = 1 << (num_digits -1); - for (uint8_t i = 0; i < num_digits; i++) { - if (!(i % 4) && i) write(' '); - if (!(i % 16) && i) write(' '); - if (value & mask) write('1'); - else write('0'); - value <<= 1; - } - } - - void print(const char value[]) { printf("%s" , value); } - void print(char value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 8); - else if (nbase == OCT) printf("%3o", value); - else if (nbase == HEX) printf("%2X", value); - else if (nbase == DEC ) printf("%d", value); - else printf("%c" , value); - } - void print(unsigned char value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 8); - else if (nbase == OCT) printf("%3o", value); - else if (nbase == HEX) printf("%2X", value); - else printf("%u" , value); - } - void print(int value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 16); - else if (nbase == OCT) printf("%6o", value); - else if (nbase == HEX) printf("%4X", value); - else printf("%d", value); - } - void print(unsigned int value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 16); - else if (nbase == OCT) printf("%6o", value); - else if (nbase == HEX) printf("%4X", value); - else printf("%u" , value); - } - void print(long value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 32); - else if (nbase == OCT) printf("%11o", value); - else if (nbase == HEX) printf("%8X", value); - else printf("%ld" , value); - } - void print(unsigned long value, int nbase = 0) { - if (nbase == BIN) print_bin(value, 32); - else if (nbase == OCT) printf("%11o", value); - else if (nbase == HEX) printf("%8X", value); - else printf("%lu" , value); - } - void print(float value, int round = 6) { printf("%f" , value); } - void print(double value, int round = 6) { printf("%f" , value); } - - void println(const char value[]) { printf("%s\n" , value); } - void println(char value, int nbase = 0) { print(value, nbase); println(); } - void println(unsigned char value, int nbase = 0) { print(value, nbase); println(); } - void println(int value, int nbase = 0) { print(value, nbase); println(); } - void println(unsigned int value, int nbase = 0) { print(value, nbase); println(); } - void println(long value, int nbase = 0) { print(value, nbase); println(); } - void println(unsigned long value, int nbase = 0) { print(value, nbase); println(); } - void println(float value, int round = 6) { printf("%f\n" , value); } - void println(double value, int round = 6) { printf("%f\n" , value); } - void println() { print('\n'); } - - volatile RingBuffer receive_buffer; - volatile RingBuffer transmit_buffer; - volatile bool host_connected; -}; diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp deleted file mode 100644 index 481f059030..0000000000 --- a/Marlin/src/HAL/LINUX/main.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -extern void setup(); -extern void loop(); - -#include - -#include -#include - -#include "../../inc/MarlinConfig.h" -#include -#include -#include "../shared/Delay.h" -#include "hardware/IOLoggerCSV.h" -#include "hardware/Heater.h" -#include "hardware/LinearAxis.h" - -// simple stdout / stdin implementation for fake serial port -void write_serial_thread() { - for (;;) { - for (std::size_t i = usb_serial.transmit_buffer.available(); i > 0; i--) { - fputc(usb_serial.transmit_buffer.read(), stdout); - } - std::this_thread::yield(); - } -} - -void read_serial_thread() { - char buffer[255] = {}; - for (;;) { - std::size_t len = _MIN(usb_serial.receive_buffer.free(), 254U); - if (fgets(buffer, len, stdin)) - for (std::size_t i = 0; i < strlen(buffer); i++) - usb_serial.receive_buffer.write(buffer[i]); - std::this_thread::yield(); - } -} - -void simulation_loop() { - Heater hotend(HEATER_0_PIN, TEMP_0_PIN); - Heater bed(HEATER_BED_PIN, TEMP_BED_PIN); - LinearAxis x_axis(X_ENABLE_PIN, X_DIR_PIN, X_STEP_PIN, X_MIN_PIN, X_MAX_PIN); - LinearAxis y_axis(Y_ENABLE_PIN, Y_DIR_PIN, Y_STEP_PIN, Y_MIN_PIN, Y_MAX_PIN); - LinearAxis z_axis(Z_ENABLE_PIN, Z_DIR_PIN, Z_STEP_PIN, Z_MIN_PIN, Z_MAX_PIN); - LinearAxis extruder0(E0_ENABLE_PIN, E0_DIR_PIN, E0_STEP_PIN, P_NC, P_NC); - - //#define GPIO_LOGGING // Full GPIO and Positional Logging - - #ifdef GPIO_LOGGING - IOLoggerCSV logger("all_gpio_log.csv"); - Gpio::attachLogger(&logger); - - std::ofstream position_log; - position_log.open("axis_position_log.csv"); - - int32_t x,y,z; - #endif - - for (;;) { - - hotend.update(); - bed.update(); - - x_axis.update(); - y_axis.update(); - z_axis.update(); - extruder0.update(); - - #ifdef GPIO_LOGGING - if (x_axis.position != x || y_axis.position != y || z_axis.position != z) { - uint64_t update = MAX3(x_axis.last_update, y_axis.last_update, z_axis.last_update); - position_log << update << ", " << x_axis.position << ", " << y_axis.position << ", " << z_axis.position << std::endl; - position_log.flush(); - x = x_axis.position; - y = y_axis.position; - z = z_axis.position; - } - // flush the logger - logger.flush(); - #endif - - std::this_thread::yield(); - } -} - -int main() { - std::thread write_serial (write_serial_thread); - std::thread read_serial (read_serial_thread); - - #ifdef MYSERIAL0 - MYSERIAL0.begin(BAUDRATE); - SERIAL_ECHOLNPGM("x86_64 Initialized"); - SERIAL_FLUSHTX(); - #endif - - Clock::setFrequency(F_CPU); - Clock::setTimeMultiplier(1.0); // some testing at 10x - - HAL_timer_init(); - - std::thread simulation (simulation_loop); - - DELAY_US(10000); - - setup(); - for (;;) { - loop(); - std::this_thread::yield(); - } - - simulation.join(); - write_serial.join(); - read_serial.join(); -} - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/pinsDebug.h b/Marlin/src/HAL/LINUX/pinsDebug.h deleted file mode 100644 index a93ceddc61..0000000000 --- a/Marlin/src/HAL/LINUX/pinsDebug.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Support routines for X86_64 - */ - -/** - * Translation of routines & variables used by pinsDebug.h - */ - -#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define pwm_details(pin) pin = pin // do nothing // print PWM details -#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin. -#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) -#define digitalRead_mod(p) digitalRead(p) -#define PRINT_PORT(p) -#define GET_ARRAY_PIN(p) pin_array[p].pin -#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) -#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin - -// active ADC function/mode/code values for PINSEL registers -constexpr int8_t ADC_pin_mode(pin_t pin) { - return (-1); -} - -int8_t get_pin_mode(pin_t pin) { - if (!VALID_PIN(pin)) return -1; - return 0; -} - -bool GET_PINMODE(pin_t pin) { - int8_t pin_mode = get_pin_mode(pin); - if (pin_mode == -1 || pin_mode == ADC_pin_mode(pin)) // found an invalid pin or active analog pin - return false; - - return (Gpio::getMode(pin) != 0); //input/output state -} - -bool GET_ARRAY_IS_DIGITAL(pin_t pin) { - return (!IS_ANALOG(pin) || get_pin_mode(pin) != ADC_pin_mode(pin)); -} diff --git a/Marlin/src/HAL/LINUX/spi_pins.h b/Marlin/src/HAL/LINUX/spi_pins.h deleted file mode 100644 index 01ba28e5b6..0000000000 --- a/Marlin/src/HAL/LINUX/spi_pins.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../core/macros.h" -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) - #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently - // needed due to the speed and mode required for communicating with each device being different. - // This requirement can be removed if the SPI access to these devices is updated to use - // spiBeginTransaction. -#endif - -/** onboard SD card */ -//#define SCK_PIN P0_07 -//#define MISO_PIN P0_08 -//#define MOSI_PIN P0_09 -//#define SS_PIN P0_06 -/** external */ -#ifndef SCK_PIN - #define SCK_PIN 50 -#endif -#ifndef MISO_PIN - #define MISO_PIN 51 -#endif -#ifndef MOSI_PIN - #define MOSI_PIN 52 -#endif -#ifndef SS_PIN - #define SS_PIN 53 -#endif -#ifndef SDSS - #define SDSS SS_PIN -#endif diff --git a/Marlin/src/HAL/LINUX/timers.cpp b/Marlin/src/HAL/LINUX/timers.cpp deleted file mode 100644 index 66d80f2518..0000000000 --- a/Marlin/src/HAL/LINUX/timers.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include "hardware/Timer.h" - -#include "../../inc/MarlinConfig.h" - -/** - * Use POSIX signals to attempt to emulate Interrupts - * This has many limitations and is not fit for the purpose - */ - -HAL_STEP_TIMER_ISR(); -HAL_TEMP_TIMER_ISR(); - -Timer timers[2]; - -void HAL_timer_init() { - timers[0].init(0, STEPPER_TIMER_RATE, TIMER0_IRQHandler); - timers[1].init(1, TEMP_TIMER_RATE, TIMER1_IRQHandler); -} - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - timers[timer_num].start(frequency); -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - timers[timer_num].enable(); -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - timers[timer_num].disable(); -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - return timers[timer_num].enabled(); -} - -void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { - timers[timer_num].setCompare(compare); -} - -hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - return timers[timer_num].getCompare(); -} - -hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - return timers[timer_num].getCount(); -} - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/timers.h b/Marlin/src/HAL/LINUX/timers.h deleted file mode 100644 index 1beaea95ab..0000000000 --- a/Marlin/src/HAL/LINUX/timers.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL timers for Linux X86_64 - */ - -#include - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -typedef uint32_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF - -#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif - -#define TEMP_TIMER_RATE 1000000 -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency - -#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs -#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() extern "C" void TIMER0_IRQHandler() -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() extern "C" void TIMER1_IRQHandler() -#endif - -// PWM timer -#define HAL_PWM_TIMER -#define HAL_PWM_TIMER_ISR() extern "C" void TIMER3_IRQHandler() -#define HAL_PWM_TIMER_IRQn - - -void HAL_timer_init(); -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); - -void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare); -hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); -hal_timer_t HAL_timer_get_count(const uint8_t timer_num); -FORCE_INLINE static void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) { - const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks; - if (HAL_timer_get_compare(timer_num) < mincmp) HAL_timer_set_compare(timer_num, mincmp); -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -#define HAL_timer_isr_prologue(TIMER_NUM) -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/LINUX/watchdog.cpp b/Marlin/src/HAL/LINUX/watchdog.cpp deleted file mode 100644 index c15b0e311c..0000000000 --- a/Marlin/src/HAL/LINUX/watchdog.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __PLAT_LINUX__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - -#include "watchdog.h" - -void watchdog_init() {} -void HAL_watchdog_refresh() {} - -#endif - -#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/watchdog.h b/Marlin/src/HAL/LINUX/watchdog.h deleted file mode 100644 index 472624cc78..0000000000 --- a/Marlin/src/HAL/LINUX/watchdog.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define WDT_TIMEOUT 4000000 // 4 second timeout - -void watchdog_init(); -void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/LPC1768/DebugMonitor.cpp b/Marlin/src/HAL/LPC1768/DebugMonitor.cpp deleted file mode 100644 index 783b10cfac..0000000000 --- a/Marlin/src/HAL/LPC1768/DebugMonitor.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../core/macros.h" -#include "../../core/serial.h" -#include - -#include "../shared/backtrace/unwinder.h" -#include "../shared/backtrace/unwmemaccess.h" -#include "watchdog.h" -#include - - -// Debug monitor that dumps to the Programming port all status when -// an exception or WDT timeout happens - And then resets the board - -// All the Monitor routines must run with interrupts disabled and -// under an ISR execution context. That is why we cannot reuse the -// Serial interrupt routines or any C runtime, as we don't know the -// state we are when running them - -// A SW memory barrier, to ensure GCC does not overoptimize loops -#define sw_barrier() __asm__ volatile("": : :"memory"); - -// (re)initialize UART0 as a monitor output to 250000,n,8,1 -static void TXBegin() { -} - -// Send character through UART with no interrupts -static void TX(char c) { - _DBC(c); -} - -// Send String through UART -static void TX(const char* s) { - while (*s) TX(*s++); -} - -static void TXDigit(uint32_t d) { - if (d < 10) TX((char)(d+'0')); - else if (d < 16) TX((char)(d+'A'-10)); - else TX('?'); -} - -// Send Hex number thru UART -static void TXHex(uint32_t v) { - TX("0x"); - for (uint8_t i = 0; i < 8; i++, v <<= 4) - TXDigit((v >> 28) & 0xF); -} - -// Send Decimal number thru UART -static void TXDec(uint32_t v) { - if (!v) { - TX('0'); - return; - } - - char nbrs[14]; - char *p = &nbrs[0]; - while (v != 0) { - *p++ = '0' + (v % 10); - v /= 10; - } - do { - p--; - TX(*p); - } while (p != &nbrs[0]); -} - -// Dump a backtrace entry -static bool UnwReportOut(void* ctx, const UnwReport* bte) { - int* p = (int*)ctx; - - (*p)++; - TX('#'); TXDec(*p); TX(" : "); - TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); - TX('+'); TXDec(bte->address - bte->function); - TX(" PC:");TXHex(bte->address); TX('\n'); - return true; -} - -#ifdef UNW_DEBUG - void UnwPrintf(const char* format, ...) { - char dest[256]; - va_list argptr; - va_start(argptr, format); - vsprintf(dest, format, argptr); - va_end(argptr); - TX(&dest[0]); - } -#endif - -/* Table of function pointers for passing to the unwinder */ -static const UnwindCallbacks UnwCallbacks = { - UnwReportOut, - UnwReadW, - UnwReadH, - UnwReadB - #ifdef UNW_DEBUG - ,UnwPrintf - #endif -}; - - -/** - * HardFaultHandler_C: - * This is called from the HardFault_HandlerAsm with a pointer the Fault stack - * as the parameter. We can then read the values from the stack and place them - * into local variables for ease of reading. - * We then read the various Fault Status and Address Registers to help decode - * cause of the fault. - * The function ends with a BKPT instruction to force control back into the debugger - */ -extern "C" -void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { - - static const char* causestr[] = { - "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" - }; - - UnwindFrame btf; - - // Dump report to the Programming port (interrupts are DISABLED) - TXBegin(); - TX("\n\n## Software Fault detected ##\n"); - TX("Cause: "); TX(causestr[cause]); TX('\n'); - - TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); - TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); - TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); - TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); - TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); - TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); - TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); - TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); - - // Configurable Fault Status Register - // Consists of MMSR, BFSR and UFSR - TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); - - // Hard Fault Status Register - TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); - - // Debug Fault Status Register - TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); - - // Auxiliary Fault Status Register - TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); - - // Read the Fault Address Registers. These may not contain valid values. - // Check BFARVALID/MMARVALID to see if they are valid values - // MemManage Fault Address Register - TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); - - // Bus Fault Address Register - TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); - - TX("ExcLR: "); TXHex(lr); TX('\n'); - TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); - - btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer - btf.fp = btf.sp; - btf.lr = ((unsigned long)sp[5]); - btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it - - // Perform a backtrace - TX("\nBacktrace:\n\n"); - int ctr = 0; - UnwindStart(&btf, &UnwCallbacks, &ctr); - - // Disable all NVIC interrupts - NVIC->ICER[0] = 0xFFFFFFFF; - NVIC->ICER[1] = 0xFFFFFFFF; - - // Relocate VTOR table to default position - SCB->VTOR = 0; - - // Clear cause of reset to prevent entering smoothie bootstrap - HAL_clear_reset_source(); - - // Restart watchdog - #if ENABLED(USE_WATCHDOG) - //WDT_Restart(WDT); - watchdog_init(); - #endif - - // Reset controller - NVIC_SystemReset(); - - // Nothing below here is compiled because NVIC_SystemReset loops forever - - for (;;) { TERN_(USE_WATCHDOG, watchdog_init()); } -} - -extern "C" { -__attribute__((naked)) void NMI_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#0") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void HardFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#1") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void MemManage_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#2") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void BusFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#3") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void UsageFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#4") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void DebugMon_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#5") - A("b HardFault_HandlerC") - ); -} - -/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ -__attribute__((naked)) void WDT_IRQHandler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#6") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void RSTC_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#7") - A("b HardFault_HandlerC") - ); -} -} -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp deleted file mode 100644 index 939f1e8a94..0000000000 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../inc/MarlinConfig.h" -#include "../shared/Delay.h" -#include "../../../gcode/parser.h" - -#if ENABLED(USE_WATCHDOG) - #include "watchdog.h" -#endif - -uint32_t HAL_adc_reading = 0; - -// U8glib required functions -extern "C" void u8g_xMicroDelay(uint16_t val) { - DELAY_US(val); -} -extern "C" void u8g_MicroDelay() { - u8g_xMicroDelay(1); -} -extern "C" void u8g_10MicroDelay() { - u8g_xMicroDelay(10); -} -extern "C" void u8g_Delay(uint16_t val) { - delay(val); -} -//************************// - -// return free heap space -int freeMemory() { - char stack_end; - void *heap_start = malloc(sizeof(uint32_t)); - if (heap_start == 0) return 0; - - uint32_t result = (uint32_t)&stack_end - (uint32_t)heap_start; - free(heap_start); - return result; -} - -// scan command line for code -// return index into pin map array if found and the pin is valid. -// return dval if not found or not a valid pin. -int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { - const uint16_t val = (uint16_t)parser.intval(code, -1), port = val / 100, pin = val % 100; - const int16_t ind = (port < ((NUM_DIGITAL_PINS) >> 5) && pin < 32) ? ((port << 5) | pin) : -2; - return ind > -1 ? ind : dval; -} - -void flashFirmware(const int16_t) { NVIC_SystemReset(); } - -void HAL_clear_reset_source(void) { - TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag()); -} - -uint8_t HAL_get_reset_source(void) { - #if ENABLED(USE_WATCHDOG) - if (watchdog_timed_out()) return RST_WATCHDOG; - #endif - return RST_POWER_ON; -} - -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h deleted file mode 100644 index cb637e715d..0000000000 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL_LPC1768/HAL.h - * Hardware Abstraction Layer for NXP LPC1768 - */ - -#define CPU_32_BIT - -void HAL_init(); - -#include -#include -#include - -extern "C" volatile uint32_t _millis; - -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" -#include "fastio.h" -#include "watchdog.h" -#include "MarlinSerial.h" - -#include -#include -#include - -// i2c uses 8-bit shifted address -#define I2C_ADDRESS(A) uint8_t((A) << 1) - -// -// Default graphical display delays -// -#ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(600) -#endif -#ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(750) -#endif -#ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(750) -#endif - -#define _MSERIAL(X) MSerial##X -#define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial - -#if SERIAL_PORT == -1 - #define MYSERIAL0 UsbSerial -#elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) -#else - #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." -#endif - -#ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 UsbSerial - #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) - #else - #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." - #endif -#endif - -#ifdef LCD_SERIAL_PORT - #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL UsbSerial - #elif WITHIN(LCD_SERIAL_PORT, 0, 3) - #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) - #else - #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." - #endif -#endif - -// -// Interrupts -// -#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() -#define CRITICAL_SECTION_END() if (!primask) __enable_irq() -#define ISRS_ENABLED() (!__get_PRIMASK()) -#define ENABLE_ISRS() __enable_irq() -#define DISABLE_ISRS() __disable_irq() - -// -// Utility functions -// -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -int freeMemory(); -#pragma GCC diagnostic pop - -// -// ADC API -// - -#define ADC_MEDIAN_FILTER_SIZE (23) // Higher values increase step delay (phase shift), - // (ADC_MEDIAN_FILTER_SIZE + 1) / 2 sample step delay (12 samples @ 500Hz: 24ms phase shift) - // Memory usage per ADC channel (bytes): (6 * ADC_MEDIAN_FILTER_SIZE) + 16 - // 8 * ((6 * 23) + 16 ) = 1232 Bytes for 8 channels - -#define ADC_LOWPASS_K_VALUE (2) // Higher values increase rise time - // Rise time sample delays for 100% signal convergence on full range step - // (1 : 13, 2 : 32, 3 : 67, 4 : 139, 5 : 281, 6 : 565, 7 : 1135, 8 : 2273) - // K = 6, 565 samples, 500Hz sample rate, 1.13s convergence on full range step - // Memory usage per ADC channel (bytes): 4 (32 Bytes for 8 channels) - -#define HAL_ADC_VREF 3.3 // ADC voltage reference - -#define HAL_ADC_RESOLUTION 12 // 15 bit maximum, raw temperature is stored as int16_t -#define HAL_ADC_FILTERED // Disable oversampling done in Marlin as ADC values already filtered in HAL - -using FilteredADC = LPC176x::ADC; -extern uint32_t HAL_adc_reading; -[[gnu::always_inline]] inline void HAL_start_adc(const pin_t pin) { - HAL_adc_reading = FilteredADC::read(pin) >> (16 - HAL_ADC_RESOLUTION); // returns 16bit value, reduce to required bits -} -[[gnu::always_inline]] inline uint16_t HAL_read_adc() { - return HAL_adc_reading; -} - -#define HAL_adc_init() -#define HAL_ANALOG_SELECT(pin) FilteredADC::enable_channel(pin) -#define HAL_START_ADC(pin) HAL_start_adc(pin) -#define HAL_READ_ADC() HAL_read_adc() -#define HAL_ADC_READY() (true) - -// Test whether the pin is valid -constexpr bool VALID_PIN(const pin_t pin) { - return LPC176x::pin_is_valid(pin); -} - -// Get the analog index for a digital pin -constexpr int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t pin) { - return (LPC176x::pin_is_valid(pin) && LPC176x::pin_has_adc(pin)) ? pin : -1; -} - -// Return the index of a pin number -constexpr int16_t GET_PIN_MAP_INDEX(const pin_t pin) { - return LPC176x::pin_index(pin); -} - -// Get the pin number at the given index -constexpr pin_t GET_PIN_MAP_PIN(const int16_t index) { - return LPC176x::pin_index(index); -} - -// Parse a G-code word into a pin index -int16_t PARSED_PIN_INDEX(const char code, const int16_t dval); -// P0.6 thru P0.9 are for the onboard SD card -#define HAL_SENSITIVE_PINS P0_06, P0_07, P0_08, P0_09 - -#define HAL_IDLETASK 1 -void HAL_idletask(); - -#define PLATFORM_M997_SUPPORT -void flashFirmware(const int16_t); - -#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment - -/** - * set_pwm_frequency - * Set the frequency of the timer corresponding to the provided pin - * All Hardware PWM pins run at the same frequency and all - * Software PWM pins run at the same frequency - */ -void set_pwm_frequency(const pin_t pin, int f_desired); - -/** - * set_pwm_duty - * Set the PWM duty cycle of the provided pin to the provided value - * Optionally allows inverting the duty cycle [default = false] - * Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] - */ -void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false); - -// Reset source -void HAL_clear_reset_source(void); -uint8_t HAL_get_reset_source(void); - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -// Add strcmp_P if missing -#ifndef strcmp_P - #define strcmp_P(a, b) strcmp((a), (b)) -#endif diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp deleted file mode 100644 index b3d2908ac9..0000000000 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Software SPI functions originally from Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman - */ - -/** - * For TARGET_LPC1768 - */ - -/** - * Hardware SPI and Software SPI implementations are included in this file. - * The hardware SPI runs faster and has higher throughput but is not compatible - * with some LCD interfaces/adapters. - * - * Control of the slave select pin(s) is handled by the calling routines. - * - * Some of the LCD interfaces/adapters result in the LCD SPI and the SD card - * SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with - * WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is - * active. If any of these pins are shared then the software SPI must be used. - * - * A more sophisticated hardware SPI can be found at the following link. - * This implementation has not been fully debugged. - * https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e - */ - -#ifdef TARGET_LPC1768 - -#include "../../inc/MarlinConfig.h" -#include - -// Hardware SPI and SPIClass -#include -#include - -// ------------------------ -// Public functions -// ------------------------ -#if ENABLED(LPC_SOFTWARE_SPI) - - #include - - // Software SPI - - static uint8_t SPI_speed = 0; - - static uint8_t spiTransfer(uint8_t b) { - return swSpiTransfer(b, SPI_speed, SCK_PIN, MISO_PIN, MOSI_PIN); - } - - void spiBegin() { - swSpiBegin(SCK_PIN, MISO_PIN, MOSI_PIN); - } - - void spiInit(uint8_t spiRate) { - SPI_speed = swSpiInit(spiRate, SCK_PIN, MOSI_PIN); - } - - uint8_t spiRec() { return spiTransfer(0xFF); } - - void spiRead(uint8_t*buf, uint16_t nbyte) { - for (int i = 0; i < nbyte; i++) - buf[i] = spiTransfer(0xFF); - } - - void spiSend(uint8_t b) { (void)spiTransfer(b); } - - void spiSend(const uint8_t* buf, size_t nbyte) { - for (uint16_t i = 0; i < nbyte; i++) - (void)spiTransfer(buf[i]); - } - - void spiSendBlock(uint8_t token, const uint8_t* buf) { - (void)spiTransfer(token); - for (uint16_t i = 0; i < 512; i++) - (void)spiTransfer(buf[i]); - } - -#else - - void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0 - spiInit(SPI_SPEED); - } - - void spiInit(uint8_t spiRate) { - #if MISO_PIN == BOARD_SPI1_MISO_PIN - SPI.setModule(1); - #elif MISO_PIN == BOARD_SPI2_MISO_PIN - SPI.setModule(2); - #endif - SPI.setDataSize(DATA_SIZE_8BIT); - SPI.setDataMode(SPI_MODE0); - - SPI.setClock(SPISettings::spiRate2Clock(spiRate)); - SPI.begin(); - } - - static uint8_t doio(uint8_t b) { - return SPI.transfer(b & 0x00FF) & 0x00FF; - } - - void spiSend(uint8_t b) { doio(b); } - - void spiSend(const uint8_t* buf, size_t nbyte) { - for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]); - } - - void spiSend(uint32_t chan, byte b) { - } - - void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) { - } - - // Read single byte from SPI - uint8_t spiRec() { return doio(0xFF); } - - uint8_t spiRec(uint32_t chan) { return 0; } - - // Read from SPI into buffer - void spiRead(uint8_t *buf, uint16_t nbyte) { - for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF); - } - - uint8_t spiTransfer(uint8_t b) { - return doio(b); - } - - // Write from buffer to SPI - void spiSendBlock(uint8_t token, const uint8_t* buf) { - (void)spiTransfer(token); - for (uint16_t i = 0; i < 512; i++) - (void)spiTransfer(buf[i]); - } - - /** Begin SPI transaction, set clock, bit order, data mode */ - void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - // TODO: to be implemented - - } - -#endif // LPC_SOFTWARE_SPI - -/** - * @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset. - */ -static inline void waitSpiTxEnd(LPC_SSP_TypeDef *spi_d) { - while (SSP_GetStatus(spi_d, SSP_STAT_TXFIFO_EMPTY) == RESET) { /* nada */ } // wait until TXE=1 - while (SSP_GetStatus(spi_d, SSP_STAT_BUSY) == SET) { /* nada */ } // wait until BSY=0 -} - -// Retain the pin init state of the SPI, to avoid init more than once, -// even if more instances of SPIClass exist -static bool spiInitialised[BOARD_NR_SPI] = { false }; - -SPIClass::SPIClass(uint8_t device) { - // Init things specific to each SPI device - // clock divider setup is a bit of hack, and needs to be improved at a later date. - - #if BOARD_NR_SPI >= 1 - _settings[0].spi_d = LPC_SSP0; - _settings[0].dataMode = SPI_MODE0; - _settings[0].dataSize = DATA_SIZE_8BIT; - _settings[0].clock = SPI_CLOCK_MAX; - //_settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); - #endif - - #if BOARD_NR_SPI >= 2 - _settings[1].spi_d = LPC_SSP1; - _settings[1].dataMode = SPI_MODE0; - _settings[1].dataSize = DATA_SIZE_8BIT; - _settings[1].clock = SPI_CLOCK_MAX; - //_settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); - #endif - - setModule(device); - - // Init the GPDMA controller - // TODO: call once in the constructor? or each time? - GPDMA_Init(); -} - -void SPIClass::begin() { - // Init the SPI pins in the first begin call - if ((_currentSetting->spi_d == LPC_SSP0 && spiInitialised[0] == false) || - (_currentSetting->spi_d == LPC_SSP1 && spiInitialised[1] == false)) { - pin_t sck, miso, mosi; - if (_currentSetting->spi_d == LPC_SSP0) { - sck = BOARD_SPI1_SCK_PIN; - miso = BOARD_SPI1_MISO_PIN; - mosi = BOARD_SPI1_MOSI_PIN; - spiInitialised[0] = true; - } - else if (_currentSetting->spi_d == LPC_SSP1) { - sck = BOARD_SPI2_SCK_PIN; - miso = BOARD_SPI2_MISO_PIN; - mosi = BOARD_SPI2_MOSI_PIN; - spiInitialised[1] = true; - } - PINSEL_CFG_Type PinCfg; // data structure to hold init values - PinCfg.Funcnum = 2; - PinCfg.OpenDrain = 0; - PinCfg.Pinmode = 0; - PinCfg.Pinnum = LPC176x::pin_bit(sck); - PinCfg.Portnum = LPC176x::pin_port(sck); - PINSEL_ConfigPin(&PinCfg); - SET_OUTPUT(sck); - - PinCfg.Pinnum = LPC176x::pin_bit(miso); - PinCfg.Portnum = LPC176x::pin_port(miso); - PINSEL_ConfigPin(&PinCfg); - SET_INPUT(miso); - - PinCfg.Pinnum = LPC176x::pin_bit(mosi); - PinCfg.Portnum = LPC176x::pin_port(mosi); - PINSEL_ConfigPin(&PinCfg); - SET_OUTPUT(mosi); - } - - updateSettings(); - SSP_Cmd(_currentSetting->spi_d, ENABLE); // start SSP running -} - -void SPIClass::beginTransaction(const SPISettings &cfg) { - setBitOrder(cfg.bitOrder); - setDataMode(cfg.dataMode); - setDataSize(cfg.dataSize); - //setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); - begin(); -} - -uint8_t SPIClass::transfer(const uint16_t b) { - // Send and receive a single byte - SSP_ReceiveData(_currentSetting->spi_d); // read any previous data - SSP_SendData(_currentSetting->spi_d, b); - waitSpiTxEnd(_currentSetting->spi_d); // wait for it to finish - return SSP_ReceiveData(_currentSetting->spi_d); -} - -uint16_t SPIClass::transfer16(const uint16_t data) { - return (transfer((data >> 8) & 0xFF) << 8) | (transfer(data & 0xFF) & 0xFF); -} - -void SPIClass::end() { - // SSP_Cmd(_currentSetting->spi_d, DISABLE); // stop device or SSP_DeInit? - SSP_DeInit(_currentSetting->spi_d); -} - -void SPIClass::send(uint8_t data) { - SSP_SendData(_currentSetting->spi_d, data); -} - -void SPIClass::dmaSend(void *buf, uint16_t length, bool minc) { - //TODO: LPC dma can only write 0xFFF bytes at once. - GPDMA_Channel_CFG_Type GPDMACfg; - - /* Configure GPDMA channel 0 -------------------------------------------------------------*/ - /* DMA Channel 0 */ - GPDMACfg.ChannelNum = 0; - // Source memory - GPDMACfg.SrcMemAddr = (uint32_t)buf; - // Destination memory - Not used - GPDMACfg.DstMemAddr = 0; - // Transfer size - GPDMACfg.TransferSize = length; - // Transfer width - GPDMACfg.TransferWidth = (_currentSetting->dataSize == DATA_SIZE_16BIT) ? GPDMA_WIDTH_HALFWORD : GPDMA_WIDTH_BYTE; - // Transfer type - GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_M2P; - // Source connection - unused - GPDMACfg.SrcConn = 0; - // Destination connection - GPDMACfg.DstConn = (_currentSetting->spi_d == LPC_SSP0) ? GPDMA_CONN_SSP0_Tx : GPDMA_CONN_SSP1_Tx; - - GPDMACfg.DMALLI = 0; - - // Enable dma on SPI - SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, ENABLE); - - // Only increase memory if minc is true - GPDMACfg.MemoryIncrease = (minc ? GPDMA_DMACCxControl_SI : 0); - - // Setup channel with given parameter - GPDMA_Setup(&GPDMACfg); - - // Enable DMA - GPDMA_ChannelCmd(0, ENABLE); - - // Wait for data transfer - while (!GPDMA_IntGetStatus(GPDMA_STAT_RAWINTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_RAWINTERR, 0)) { } - - // Clear err and int - GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); - GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0); - - // Disable DMA - GPDMA_ChannelCmd(0, DISABLE); - - waitSpiTxEnd(_currentSetting->spi_d); - - SSP_DMACmd(_currentSetting->spi_d, SSP_DMA_TX, DISABLE); -} - -uint16_t SPIClass::read() { - return SSP_ReceiveData(_currentSetting->spi_d); -} - -void SPIClass::read(uint8_t *buf, uint32_t len) { - for (uint16_t i = 0; i < len; i++) buf[i] = transfer(0xFF); -} - -void SPIClass::setClock(uint32_t clock) { - _currentSetting->clock = clock; -} - -void SPIClass::setModule(uint8_t device) { - _currentSetting = &_settings[device - 1];// SPI channels are called 1 2 and 3 but the array is zero indexed -} - -void SPIClass::setBitOrder(uint8_t bitOrder) { - _currentSetting->bitOrder = bitOrder; -} - -void SPIClass::setDataMode(uint8_t dataMode) { - _currentSetting->dataMode = dataMode; -} - -void SPIClass::setDataSize(uint32_t ds) { - _currentSetting->dataSize = ds; -} - -/** - * Set up/tear down - */ -void SPIClass::updateSettings() { - //SSP_DeInit(_currentSetting->spi_d); //todo: need force de init?! - - // divide PCLK by 2 for SSP0 - CLKPWR_SetPCLKDiv(_currentSetting->spi_d == LPC_SSP0 ? CLKPWR_PCLKSEL_SSP0 : CLKPWR_PCLKSEL_SSP1, CLKPWR_PCLKSEL_CCLK_DIV_2); - - SSP_CFG_Type HW_SPI_init; // data structure to hold init values - SSP_ConfigStructInit(&HW_SPI_init); // set values for SPI mode - HW_SPI_init.ClockRate = _currentSetting->clock; - HW_SPI_init.Databit = _currentSetting->dataSize; - - /** - * SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge - * 0 0 0 Falling Rising - * 1 0 1 Rising Falling - * 2 1 0 Rising Falling - * 3 1 1 Falling Rising - */ - switch (_currentSetting->dataMode) { - case SPI_MODE0: - HW_SPI_init.CPHA = SSP_CPHA_FIRST; - HW_SPI_init.CPOL = SSP_CPOL_HI; - break; - case SPI_MODE1: - HW_SPI_init.CPHA = SSP_CPHA_SECOND; - HW_SPI_init.CPOL = SSP_CPOL_HI; - break; - case SPI_MODE2: - HW_SPI_init.CPHA = SSP_CPHA_FIRST; - HW_SPI_init.CPOL = SSP_CPOL_LO; - break; - case SPI_MODE3: - HW_SPI_init.CPHA = SSP_CPHA_SECOND; - HW_SPI_init.CPOL = SSP_CPOL_LO; - break; - default: - break; - } - - // TODO: handle bitOrder - SSP_Init(_currentSetting->spi_d, &HW_SPI_init); // puts the values into the proper bits in the SSP0 registers -} - -#if MISO_PIN == BOARD_SPI1_MISO_PIN - SPIClass SPI(1); -#elif MISO_PIN == BOARD_SPI2_MISO_PIN - SPIClass SPI(2); -#endif - -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp deleted file mode 100644 index 5374e005d3..0000000000 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../inc/MarlinConfigPre.h" -#include "MarlinSerial.h" - -#if USING_SERIAL_0 - MarlinSerial MSerial(LPC_UART0); - extern "C" void UART0_IRQHandler() { - MSerial.IRQHandler(); - } -#endif - -#if USING_SERIAL_1 - MarlinSerial MSerial1((LPC_UART_TypeDef *) LPC_UART1); - extern "C" void UART1_IRQHandler() { - MSerial1.IRQHandler(); - } -#endif - -#if USING_SERIAL_2 - MarlinSerial MSerial2(LPC_UART2); - extern "C" void UART2_IRQHandler() { - MSerial2.IRQHandler(); - } -#endif - -#if USING_SERIAL_3 - MarlinSerial MSerial3(LPC_UART3); - extern "C" void UART3_IRQHandler() { - MSerial3.IRQHandler(); - } -#endif - -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h deleted file mode 100644 index 8d6b64378a..0000000000 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include -#include - -#include "../../inc/MarlinConfigPre.h" -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif - -#ifndef SERIAL_PORT - #define SERIAL_PORT 0 -#endif -#ifndef RX_BUFFER_SIZE - #define RX_BUFFER_SIZE 128 -#endif -#ifndef TX_BUFFER_SIZE - #define TX_BUFFER_SIZE 32 -#endif - -class MarlinSerial : public HardwareSerial { -public: - MarlinSerial(LPC_UART_TypeDef *UARTx) : - HardwareSerial(UARTx) - #if ENABLED(EMERGENCY_PARSER) - , emergency_state(EmergencyParser::State::EP_RESET) - #endif - { } - - void end() {} - - #if ENABLED(EMERGENCY_PARSER) - bool recv_callback(const char c) override { - emergency_parser.update(emergency_state, c); - return true; // do not discard character - } - - EmergencyParser::State emergency_state; - static inline bool emergency_parser_enabled() { return true; } - #endif -}; - -extern MarlinSerial MSerial; -extern MarlinSerial MSerial1; -extern MarlinSerial MSerial2; -extern MarlinSerial MSerial3; diff --git a/Marlin/src/HAL/LPC1768/Servo.h b/Marlin/src/HAL/LPC1768/Servo.h deleted file mode 100644 index eb12fd20f4..0000000000 --- a/Marlin/src/HAL/LPC1768/Servo.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 - * Copyright (c) 2009 Michael Margolis. All right reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#pragma once - -/** - * Based on "servo.h - Interrupt driven Servo library for Arduino using 16 bit timers - - * Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. - * - * The only modification was to update/delete macros to match the LPC176x. - */ - -#include - -class libServo: public Servo { - public: - void move(const int value) { - constexpr uint16_t servo_delay[] = SERVO_DELAY; - static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - - if (attach(servo_info[servoIndex].Pin.nbr) >= 0) { // try to reattach - write(value); - safe_delay(servo_delay[servoIndex]); // delay to allow servo to reach position - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); - } - - } -}; - -#define HAL_SERVO_LIB libServo diff --git a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp deleted file mode 100644 index 2558486375..0000000000 --- a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -/** - * Emulate EEPROM storage using Flash Memory - * - * Use a single 32K flash sector to store EEPROM data. To reduce the - * number of erase operations a simple "levelling" scheme is used that - * maintains a number of EEPROM "slots" within the larger flash sector. - * Each slot is used in turn and the entire sector is only erased when all - * slots have been used. - * - * A simple RAM image is used to hold the EEPROM data during I/O operations - * and this is flushed to the next available slot when an update is complete. - * If RAM usage becomes an issue we could store this image in one of the two - * 16Kb I/O buffers (intended to hold DMA USB and Ethernet data, but currently - * unused). - */ -#include "../../inc/MarlinConfig.h" - -#if ENABLED(FLASH_EEPROM_EMULATION) - -#include "../shared/eeprom_api.h" - -extern "C" { - #include -} - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -#define SECTOR_START(sector) ((sector < 16) ? (sector << 12) : ((sector - 14) << 15)) -#define EEPROM_SECTOR 29 -#define SECTOR_SIZE 32768 -#define EEPROM_SLOTS ((SECTOR_SIZE)/(MARLIN_EEPROM_SIZE)) -#define EEPROM_ERASE 0xFF -#define SLOT_ADDRESS(sector, slot) (((uint8_t *)SECTOR_START(sector)) + slot * (MARLIN_EEPROM_SIZE)) - -static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; -static bool eeprom_dirty = false; -static int current_slot = 0; - -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { - uint32_t first_nblank_loc, first_nblank_val; - IAP_STATUS_CODE status; - - // discover which slot we are currently using. - __disable_irq(); - status = BlankCheckSector(EEPROM_SECTOR, EEPROM_SECTOR, &first_nblank_loc, &first_nblank_val); - __enable_irq(); - - if (status == CMD_SUCCESS) { - // sector is blank so nothing stored yet - for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EEPROM_ERASE; - current_slot = EEPROM_SLOTS; - } - else { - // current slot is the first non blank one - current_slot = first_nblank_loc / (MARLIN_EEPROM_SIZE); - uint8_t *eeprom_data = SLOT_ADDRESS(EEPROM_SECTOR, current_slot); - // load current settings - for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i]; - } - eeprom_dirty = false; - - return true; -} - -bool PersistentStore::access_finish() { - if (eeprom_dirty) { - IAP_STATUS_CODE status; - if (--current_slot < 0) { - // all slots have been used, erase everything and start again - __disable_irq(); - status = EraseSector(EEPROM_SECTOR, EEPROM_SECTOR); - __enable_irq(); - - current_slot = EEPROM_SLOTS - 1; - } - - __disable_irq(); - status = CopyRAM2Flash(SLOT_ADDRESS(EEPROM_SECTOR, current_slot), ram_eeprom, IAP_WRITE_4096); - __enable_irq(); - - if (status != CMD_SUCCESS) return false; - eeprom_dirty = false; - } - return true; -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - for (size_t i = 0; i < size; i++) ram_eeprom[pos + i] = value[i]; - eeprom_dirty = true; - crc16(crc, value, size); - pos += size; - return false; // return true for any error -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos]; - if (writing) for (size_t i = 0; i < size; i++) value[i] = ram_eeprom[pos + i]; - crc16(crc, buff, size); - pos += size; - return false; // return true for any error -} - -#endif // FLASH_EEPROM_EMULATION -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp deleted file mode 100644 index 9f2475f490..0000000000 --- a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDCARD_EEPROM_EMULATION) - -#include "../shared/eeprom_api.h" - -#include -#include - -extern uint32_t MSC_Aquire_Lock(); -extern uint32_t MSC_Release_Lock(); - -FATFS fat_fs; -FIL eeprom_file; -bool eeprom_file_open = false; - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(0x1000) // 4KiB of Emulated EEPROM -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { - const char eeprom_erase_value = 0xFF; - MSC_Aquire_Lock(); - if (f_mount(&fat_fs, "", 1)) { - MSC_Release_Lock(); - return false; - } - FRESULT res = f_open(&eeprom_file, "eeprom.dat", FA_OPEN_ALWAYS | FA_WRITE | FA_READ); - if (res) MSC_Release_Lock(); - - if (res == FR_OK) { - UINT bytes_written; - FSIZE_t file_size = f_size(&eeprom_file); - f_lseek(&eeprom_file, file_size); - while (file_size < capacity() && res == FR_OK) { - res = f_write(&eeprom_file, &eeprom_erase_value, 1, &bytes_written); - file_size++; - } - } - if (res == FR_OK) { - f_lseek(&eeprom_file, 0); - f_sync(&eeprom_file); - eeprom_file_open = true; - } - return res == FR_OK; -} - -bool PersistentStore::access_finish() { - f_close(&eeprom_file); - f_unmount(""); - MSC_Release_Lock(); - eeprom_file_open = false; - return true; -} - -// This extra chit-chat goes away soon, but is helpful for now -// to see errors that are happening in read_data / write_data -static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) { - PGM_P const rw_str = write ? PSTR("write") : PSTR("read"); - SERIAL_CHAR(' '); - serialprintPGM(rw_str); - SERIAL_ECHOLNPAIR("_data(", pos, ",", int(value), ",", int(size), ", ...)"); - if (total) { - SERIAL_ECHOPGM(" f_"); - serialprintPGM(rw_str); - SERIAL_ECHOPAIR("()=", int(s), "\n size=", int(size), "\n bytes_"); - serialprintPGM(write ? PSTR("written=") : PSTR("read=")); - SERIAL_ECHOLN(total); - } - else - SERIAL_ECHOLNPAIR(" f_lseek()=", int(s)); -} - -// File function return codes for type FRESULT. This goes away soon, but -// is helpful right now to see any errors in read_data and write_data. -// -// typedef enum { -// FR_OK = 0, /* (0) Succeeded */ -// FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ -// FR_INT_ERR, /* (2) Assertion failed */ -// FR_NOT_READY, /* (3) The physical drive cannot work */ -// FR_NO_FILE, /* (4) Could not find the file */ -// FR_NO_PATH, /* (5) Could not find the path */ -// FR_INVALID_NAME, /* (6) The path name format is invalid */ -// FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ -// FR_EXIST, /* (8) Access denied due to prohibited access */ -// FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ -// FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ -// FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ -// FR_NOT_ENABLED, /* (12) The volume has no work area */ -// FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ -// FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ -// FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ -// FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ -// FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ -// FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ -// FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ -// } FRESULT; - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - if (!eeprom_file_open) return true; - FRESULT s; - UINT bytes_written = 0; - - s = f_lseek(&eeprom_file, pos); - if (s) { - debug_rw(true, pos, value, size, s); - return s; - } - - s = f_write(&eeprom_file, (void*)value, size, &bytes_written); - if (s) { - debug_rw(true, pos, value, size, s, bytes_written); - return s; - } - crc16(crc, value, size); - pos += size; - return bytes_written != size; // return true for any error -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { - if (!eeprom_file_open) return true; - UINT bytes_read = 0; - FRESULT s; - s = f_lseek(&eeprom_file, pos); - - if (s) { - debug_rw(false, pos, value, size, s); - return true; - } - - if (writing) { - s = f_read(&eeprom_file, (void*)value, size, &bytes_read); - crc16(crc, value, size); - } - else { - uint8_t temp[size]; - s = f_read(&eeprom_file, (void*)temp, size, &bytes_read); - crc16(crc, temp, size); - } - - if (s) { - debug_rw(false, pos, value, size, s, bytes_read); - return true; - } - - pos += size; - return bytes_read != size; // return true for any error -} - -#endif // SDCARD_EEPROM_EMULATION -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp deleted file mode 100644 index 16c15eaf00..0000000000 --- a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -/** - * PersistentStore for Arduino-style EEPROM interface - * with implementations supplied by the framework. - */ - -#include "../shared/eeprom_if.h" -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x8000 // 32KB‬ -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { eeprom_init(); return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t v = *value; - - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - uint8_t * const p = (uint8_t * const)pos; - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - - crc16(crc, &v, 1); - pos++; - value++; - }; - - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - // Read from external EEPROM - const uint8_t c = eeprom_read_byte((uint8_t*)pos); - - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/endstop_interrupts.h b/Marlin/src/HAL/LPC1768/endstop_interrupts.h deleted file mode 100644 index b0d0c0ec5c..0000000000 --- a/Marlin/src/HAL/LPC1768/endstop_interrupts.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Endstop Interrupts - * - * Without endstop interrupts the endstop pins must be polled continually in - * the temperature-ISR via endstops.update(), most of the time finding no change. - * With this feature endstops.update() is called only when we know that at - * least one endstop has changed state, saving valuable CPU cycles. - * - * This feature only works when all used endstop pins can generate an 'external interrupt'. - * - * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. - * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) - */ - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - #define LPC1768_PIN_INTERRUPT_M(pin) ((pin >> 0x5 & 0x7) == 0 || (pin >> 0x5 & 0x7) == 2) - - #if HAS_X_MAX - #if !LPC1768_PIN_INTERRUPT_M(X_MAX_PIN) - #error "X_MAX_PIN is not INTERRUPT-capable." - #endif - _ATTACH(X_MAX_PIN); - #endif - #if HAS_X_MIN - #if !LPC1768_PIN_INTERRUPT_M(X_MIN_PIN) - #error "X_MIN_PIN is not INTERRUPT-capable." - #endif - _ATTACH(X_MIN_PIN); - #endif - #if HAS_Y_MAX - #if !LPC1768_PIN_INTERRUPT_M(Y_MAX_PIN) - #error "Y_MAX_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Y_MAX_PIN); - #endif - #if HAS_Y_MIN - #if !LPC1768_PIN_INTERRUPT_M(Y_MIN_PIN) - #error "Y_MIN_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Y_MIN_PIN); - #endif - #if HAS_Z_MAX - #if !LPC1768_PIN_INTERRUPT_M(Z_MAX_PIN) - #error "Z_MAX_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Z_MAX_PIN); - #endif - #if HAS_Z_MIN - #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN) - #error "Z_MIN_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Z_MIN_PIN); - #endif - #if HAS_Z2_MAX - #if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN) - #error "Z2_MAX_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Z2_MAX_PIN); - #endif - #if HAS_Z2_MIN - #if !LPC1768_PIN_INTERRUPT_M(Z2_MIN_PIN) - #error "Z2_MIN_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Z2_MIN_PIN); - #endif - #if HAS_Z3_MAX - #if !LPC1768_PIN_INTERRUPT_M(Z3_MAX_PIN) - #error "Z3_MIN_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Z3_MAX_PIN); - #endif - #if HAS_Z3_MIN - #if !LPC1768_PIN_INTERRUPT_M(Z3_MIN_PIN) - #error "Z3_MIN_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Z3_MIN_PIN); - #endif - #if HAS_Z4_MAX - #if !LPC1768_PIN_INTERRUPT_M(Z4_MAX_PIN) - #error "Z4_MIN_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Z4_MAX_PIN); - #endif - #if HAS_Z4_MIN - #if !LPC1768_PIN_INTERRUPT_M(Z4_MIN_PIN) - #error "Z4_MIN_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Z4_MIN_PIN); - #endif - #if HAS_Z_MIN_PROBE_PIN - #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN) - #error "Z_MIN_PROBE_PIN is not INTERRUPT-capable." - #endif - _ATTACH(Z_MIN_PROBE_PIN); - #endif -} diff --git a/Marlin/src/HAL/LPC1768/fast_pwm.cpp b/Marlin/src/HAL/LPC1768/fast_pwm.cpp deleted file mode 100644 index dd440b5e77..0000000000 --- a/Marlin/src/HAL/LPC1768/fast_pwm.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../inc/MarlinConfigPre.h" - -#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM - -#include - -void set_pwm_frequency(const pin_t pin, int f_desired) { - LPC176x::pwm_set_frequency(pin, f_desired); -} - -void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { - LPC176x::pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size); -} - -#endif // NEEDS_HARDWARE_PWM -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/fastio.h b/Marlin/src/HAL/LPC1768/fastio.h deleted file mode 100644 index c553ffb182..0000000000 --- a/Marlin/src/HAL/LPC1768/fastio.h +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O Routines for LPC1768/9 - * Use direct port manipulation to save scads of processor time. - * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. - */ - -/** - * Description: Fast IO functions LPC1768 - * - * For TARGET LPC1768 - */ - -#include "../shared/Marduino.h" - -#define PWM_PIN(P) true // all pins are PWM capable - -#define LPC_PIN(pin) LPC176x::gpio_pin(pin) -#define LPC_GPIO(port) LPC176x::gpio_port(port) - -#define SET_DIR_INPUT(IO) LPC176x::gpio_set_input(IO) -#define SET_DIR_OUTPUT(IO) LPC176x::gpio_set_output(IO) - -#define SET_MODE(IO, mode) pinMode(IO, mode) - -#define WRITE_PIN_SET(IO) LPC176x::gpio_set(IO) -#define WRITE_PIN_CLR(IO) LPC176x::gpio_clear(IO) - -#define READ_PIN(IO) LPC176x::gpio_get(IO) -#define WRITE_PIN(IO,V) LPC176x::gpio_set(IO, V) - -/** - * Magic I/O routines - * - * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); - * - * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html - */ - -/// Read a pin -#define _READ(IO) READ_PIN(IO) - -/// Write to a pin -#define _WRITE(IO,V) WRITE_PIN(IO,V) - -/// toggle a pin -#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) - -/// set pin as input -#define _SET_INPUT(IO) SET_DIR_INPUT(IO) - -/// set pin as output -#define _SET_OUTPUT(IO) SET_DIR_OUTPUT(IO) - -/// set pin as input with pullup mode -#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) - -/// set pin as input with pulldown mode -#define _PULLDOWN(IO,V) pinMode(IO, (V) ? INPUT_PULLDOWN : INPUT) - -/// check if pin is an input -#define _IS_INPUT(IO) (!LPC176x::gpio_get_dir(IO)) - -/// check if pin is an output -#define _IS_OUTPUT(IO) (LPC176x::gpio_get_dir(IO)) - -/// Read a pin wrapper -#define READ(IO) _READ(IO) - -/// Write to a pin wrapper -#define WRITE(IO,V) _WRITE(IO,V) - -/// toggle a pin wrapper -#define TOGGLE(IO) _TOGGLE(IO) - -/// set pin as input wrapper -#define SET_INPUT(IO) _SET_INPUT(IO) -/// set pin as input with pullup wrapper -#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) -/// set pin as input with pulldown wrapper -#define SET_INPUT_PULLDOWN(IO) do{ _SET_INPUT(IO); _PULLDOWN(IO, HIGH); }while(0) -/// set pin as output wrapper - reads the pin and sets the output to that value -#define SET_OUTPUT(IO) do{ _WRITE(IO, _READ(IO)); _SET_OUTPUT(IO); }while(0) -// set pin as PWM -#define SET_PWM SET_OUTPUT - -/// check if pin is an input wrapper -#define IS_INPUT(IO) _IS_INPUT(IO) -/// check if pin is an output wrapper -#define IS_OUTPUT(IO) _IS_OUTPUT(IO) - -// Shorthand -#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h deleted file mode 100644 index 32ef908d63..0000000000 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_FSMC_TFT - #error "Sorry! FSMC TFT displays are not current available for HAL/LPC1768." -#endif diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h deleted file mode 100644 index ce6d3fdde2..0000000000 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if USE_FALLBACK_EEPROM - #define FLASH_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) - #define USE_SHARED_EEPROM 1 -#endif diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h deleted file mode 100644 index f5051d32a1..0000000000 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ /dev/null @@ -1,276 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if PIO_PLATFORM_VERSION < 1001 - #error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically." -#endif -#if PIO_FRAMEWORK_VERSION < 2005 - #error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries." -#endif - -/** - * Detect an old pins file by checking for old ADC pins values. - */ -#define _OLD_TEMP_PIN(P) PIN_EXISTS(P) && _CAT(P,_PIN) <= 7 && _CAT(P,_PIN) != 2 && _CAT(P,_PIN) != 3 -#if _OLD_TEMP_PIN(TEMP_BED) - #error "TEMP_BED_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." -#elif _OLD_TEMP_PIN(TEMP_0) - #error "TEMP_0_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." -#elif _OLD_TEMP_PIN(TEMP_1) - #error "TEMP_1_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." -#elif _OLD_TEMP_PIN(TEMP_2) - #error "TEMP_2_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." -#elif _OLD_TEMP_PIN(TEMP_3) - #error "TEMP_3_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." -#elif _OLD_TEMP_PIN(TEMP_4) - #error "TEMP_4_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." -#elif _OLD_TEMP_PIN(TEMP_5) - #error "TEMP_5_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." -#elif _OLD_TEMP_PIN(TEMP_6) - #error "TEMP_6_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." -#elif _OLD_TEMP_PIN(TEMP_7) - #error "TEMP_7_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." -#endif -#undef _OLD_TEMP_PIN - -/** - * Because PWM hardware channels all share the same frequency, along with the - * fallback software channels, FAST_PWM_FAN is incompatible with Servos. - */ -static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are incompatible with FAST_PWM_FAN on LPC176x boards."); - -#if SPINDLE_LASER_FREQUENCY - static_assert(!NUM_SERVOS, "BLTOUCH and Servos are incompatible with SPINDLE_LASER_FREQUENCY on LPC176x boards."); -#endif - -/** - * Test LPC176x-specific configuration values for errors at compile-time. - */ - -//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) -// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" -//#endif - -#if MB(RAMPS_14_RE_ARM_EFB, RAMPS_14_RE_ARM_EEB, RAMPS_14_RE_ARM_EFF, RAMPS_14_RE_ARM_EEF, RAMPS_14_RE_ARM_SF) - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI) - #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 requires TMC_USE_SW_SPI." - #endif -#endif - -static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported on LPC176x."); - -/** - * Flag any serial port conflicts - * - * Port | TX | RX | - * --- | --- | --- | - * Serial | P0_02 | P0_03 | - * Serial1 | P0_15 | P0_16 | - * Serial2 | P0_10 | P0_11 | - * Serial3 | P0_00 | P0_01 | - */ -#define ANY_TX(N,V...) DO(IS_TX##N,||,V) -#define ANY_RX(N,V...) DO(IS_RX##N,||,V) - -#if USING_SERIAL_0 - #define IS_TX0(P) (P == P0_02) - #define IS_RX0(P) (P == P0_03) - #if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI) - #error "Serial port pins (0) conflict with Trinamic SPI pins!" - #elif ENABLED(MK2_MULTIPLEXER) && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN)) - #error "Serial port pins (0) conflict with MK2 multiplexer pins!" - #elif (AXIS_HAS_SPI(X) && IS_TX0(X_CS_PIN)) || (AXIS_HAS_SPI(Y) && IS_RX0(Y_CS_PIN)) - #error "Serial port pins (0) conflict with X/Y axis SPI pins!" - #endif - #undef IS_TX0 - #undef IS_RX0 -#endif - -#if USING_SERIAL_1 - #define IS_TX1(P) (P == P0_15) - #define IS_RX1(P) (P == P0_16) - #define _IS_TX1_1 IS_TX1 - #define _IS_RX1_1 IS_RX1 - #if IS_TX1(TMC_SW_SCK) - #error "Serial port pins (1) conflict with other pins!" - #elif HAS_WIRED_LCD - #if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1) - #error "Serial port pins (1) conflict with Encoder Buttons!" - #elif ANY_TX(1, SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \ - || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, MISO_PIN, DOGLCD_A0, SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN) - #error "Serial port pins (1) conflict with LCD pins!" - #endif - #endif - #undef IS_TX1 - #undef IS_RX1 - #undef _IS_TX1_1 - #undef _IS_RX1_1 -#endif - -#if USING_SERIAL_2 - #define IS_TX2(P) (P == P0_10) - #define IS_RX2(P) (P == P0_11) - #define _IS_TX2_1 IS_TX2 - #define _IS_RX2_1 IS_RX2 - #if IS_TX2(X2_ENABLE_PIN) || ANY_RX(2, X2_DIR_PIN, X2_STEP_PIN) || (AXIS_HAS_SPI(X2) && IS_TX2(X2_CS_PIN)) - #error "Serial port pins (2) conflict with X2 pins!" - #elif IS_TX2(Y2_ENABLE_PIN) || ANY_RX(2, Y2_DIR_PIN, Y2_STEP_PIN) || (AXIS_HAS_SPI(Y2) && IS_TX2(Y2_CS_PIN)) - #error "Serial port pins (2) conflict with Y2 pins!" - #elif IS_TX2(Z2_ENABLE_PIN) || ANY_RX(2, Z2_DIR_PIN, Z2_STEP_PIN) || (AXIS_HAS_SPI(Z2) && IS_TX2(Z2_CS_PIN)) - #error "Serial port pins (2) conflict with Z2 pins!" - #elif IS_TX2(Z3_ENABLE_PIN) || ANY_RX(2, Z3_DIR_PIN, Z3_STEP_PIN) || (AXIS_HAS_SPI(Z3) && IS_TX2(Z3_CS_PIN)) - #error "Serial port pins (2) conflict with Z3 pins!" - #elif IS_TX2(Z4_ENABLE_PIN) || ANY_RX(2, Z4_DIR_PIN, Z4_STEP_PIN) || (AXIS_HAS_SPI(Z4) && IS_TX2(Z4_CS_PIN)) - #error "Serial port pins (2) conflict with Z4 pins!" - #elif ANY_RX(2, X_DIR_PIN, Y_DIR_PIN) - #error "Serial port pins (2) conflict with other pins!" - #elif Y_HOME_DIR < 0 && IS_TX2(Y_STOP_PIN) - #error "Serial port pins (2) conflict with Y endstop pin!" - #elif HAS_CUSTOM_PROBE_PIN && IS_TX2(Z_MIN_PROBE_PIN) - #error "Serial port pins (2) conflict with probe pin!" - #elif ANY_TX(2, X_ENABLE_PIN, Y_ENABLE_PIN) || ANY_RX(2, X_DIR_PIN, Y_DIR_PIN) - #error "Serial port pins (2) conflict with X/Y stepper pins!" - #elif HAS_MULTI_EXTRUDER && (IS_TX2(E1_ENABLE_PIN) || (AXIS_HAS_SPI(E1) && IS_TX2(E1_CS_PIN))) - #error "Serial port pins (2) conflict with E1 stepper pins!" - #elif EXTRUDERS && ANY_RX(2, E0_DIR_PIN, E0_STEP_PIN) - #error "Serial port pins (2) conflict with E stepper pins!" - #endif - #undef IS_TX2 - #undef IS_RX2 - #undef _IS_TX2_1 - #undef _IS_RX2_1 -#endif - -#if USING_SERIAL_3 - #define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00) - #define PIN_IS_RX3(P) (P##_PIN == P0_01) - #if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX) - #error "Serial port pins (3) conflict with X endstop pins!" - #elif PIN_IS_TX3(Y_SERIAL_TX) || PIN_IS_TX3(Y_SERIAL_RX) || PIN_IS_RX3(X_SERIAL_TX) || PIN_IS_RX3(X_SERIAL_RX) - #error "Serial port pins (3) conflict with X/Y axis UART pins!" - #elif PIN_IS_TX3(X2_DIR) || PIN_IS_RX3(X2_STEP) - #error "Serial port pins (3) conflict with X2 pins!" - #elif PIN_IS_TX3(Y2_DIR) || PIN_IS_RX3(Y2_STEP) - #error "Serial port pins (3) conflict with Y2 pins!" - #elif PIN_IS_TX3(Z2_DIR) || PIN_IS_RX3(Z2_STEP) - #error "Serial port pins (3) conflict with Z2 pins!" - #elif PIN_IS_TX3(Z3_DIR) || PIN_IS_RX3(Z3_STEP) - #error "Serial port pins (3) conflict with Z3 pins!" - #elif PIN_IS_TX3(Z4_DIR) || PIN_IS_RX3(Z4_STEP) - #error "Serial port pins (3) conflict with Z4 pins!" - #elif HAS_MULTI_EXTRUDER && (PIN_IS_TX3(E1_DIR) || PIN_IS_RX3(E1_STEP)) - #error "Serial port pins (3) conflict with E1 pins!" - #endif - #undef PIN_IS_TX3 - #undef PIN_IS_RX3 -#endif - -#undef ANY_TX -#undef ANY_RX - -// -// Flag any i2c pin conflicts -// -#if ANY(HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC, EXPERIMENTAL_I2CBUS, I2C_POSITION_ENCODERS, PCA9632, I2C_EEPROM) - #define USEDI2CDEV_M 1 // /Wire.cpp - - #if USEDI2CDEV_M == 0 // P0_27 [D57] (AUX-1) .......... P0_28 [D58] (AUX-1) - #define PIN_IS_SDA0(P) (P##_PIN == P0_27) - #define IS_SCL0(P) (P == P0_28) - #if ENABLED(SDSUPPORT) && PIN_IS_SDA0(SD_DETECT) - #error "SDA0 overlaps with SD_DETECT_PIN!" - #elif PIN_IS_SDA0(E0_AUTO_FAN) - #error "SDA0 overlaps with E0_AUTO_FAN_PIN!" - #elif PIN_IS_SDA0(BEEPER) - #error "SDA0 overlaps with BEEPER_PIN!" - #elif IS_SCL0(BTN_ENC) - #error "SCL0 overlaps with Encoder Button!" - #elif IS_SCL0(SS_PIN) - #error "SCL0 overlaps with SS_PIN!" - #elif IS_SCL0(LCD_SDSS) - #error "SCL0 overlaps with LCD_SDSS!" - #endif - #undef PIN_IS_SDA0 - #undef IS_SCL0 - #elif USEDI2CDEV_M == 1 // P0_00 [D20] (SCA) ............ P0_01 [D21] (SCL) - #define PIN_IS_SDA1(P) (PIN_EXISTS(P) && P##_PIN == P0_00) - #define PIN_IS_SCL1(P) (P##_PIN == P0_01) - #if PIN_IS_SDA1(X_MIN) || PIN_IS_SCL1(X_MAX) - #error "One or more i2c (1) pins overlaps with X endstop pins! Disable i2c peripherals." - #elif PIN_IS_SDA1(X2_DIR) || PIN_IS_SCL1(X2_STEP) - #error "One or more i2c (1) pins overlaps with X2 pins! Disable i2c peripherals." - #elif PIN_IS_SDA1(Y2_DIR) || PIN_IS_SCL1(Y2_STEP) - #error "One or more i2c (1) pins overlaps with Y2 pins! Disable i2c peripherals." - #elif PIN_IS_SDA1(Z2_DIR) || PIN_IS_SCL1(Z2_STEP) - #error "One or more i2c (1) pins overlaps with Z2 pins! Disable i2c peripherals." - #elif PIN_IS_SDA1(Z3_DIR) || PIN_IS_SCL1(Z3_STEP) - #error "One or more i2c (1) pins overlaps with Z3 pins! Disable i2c peripherals." - #elif PIN_IS_SDA1(Z4_DIR) || PIN_IS_SCL1(Z4_STEP) - #error "One or more i2c (1) pins overlaps with Z4 pins! Disable i2c peripherals." - #elif HAS_MULTI_EXTRUDER && (PIN_IS_SDA1(E1_DIR) || PIN_IS_SCL1(E1_STEP)) - #error "One or more i2c (1) pins overlaps with E1 pins! Disable i2c peripherals." - #endif - #undef PIN_IS_SDA1 - #undef PIN_IS_SCL1 - #elif USEDI2CDEV_M == 2 // P0_10 [D38] (X_ENABLE_PIN) ... P0_11 [D55] (X_DIR_PIN) - #define PIN_IS_SDA2(P) (P##_PIN == P0_10) - #define PIN_IS_SCL2(P) (P##_PIN == P0_11) - #if PIN_IS_SDA2(Y_STOP) - #error "i2c SDA2 overlaps with Y endstop pin!" - #elif HAS_CUSTOM_PROBE_PIN && PIN_IS_SDA2(Z_MIN_PROBE) - #error "i2c SDA2 overlaps with Z probe pin!" - #elif PIN_IS_SDA2(X_ENABLE) || PIN_IS_SDA2(Y_ENABLE) - #error "i2c SDA2 overlaps with X/Y ENABLE pin!" - #elif AXIS_HAS_SPI(X) && PIN_IS_SDA2(X_CS) - #error "i2c SDA2 overlaps with X CS pin!" - #elif PIN_IS_SDA2(X2_ENABLE) - #error "i2c SDA2 overlaps with X2 enable pin! Disable i2c peripherals." - #elif PIN_IS_SDA2(Y2_ENABLE) - #error "i2c SDA2 overlaps with Y2 enable pin! Disable i2c peripherals." - #elif PIN_IS_SDA2(Z2_ENABLE) - #error "i2c SDA2 overlaps with Z2 enable pin! Disable i2c peripherals." - #elif PIN_IS_SDA2(Z3_ENABLE) - #error "i2c SDA2 overlaps with Z3 enable pin! Disable i2c peripherals." - #elif PIN_IS_SDA2(Z4_ENABLE) - #error "i2c SDA2 overlaps with Z4 enable pin! Disable i2c peripherals." - #elif HAS_MULTI_EXTRUDER && PIN_IS_SDA2(E1_ENABLE) - #error "i2c SDA2 overlaps with E1 enable pin! Disable i2c peripherals." - #elif HAS_MULTI_EXTRUDER && AXIS_HAS_SPI(E1) && PIN_IS_SDA2(E1_CS) - #error "i2c SDA2 overlaps with E1 CS pin! Disable i2c peripherals." - #elif EXTRUDERS && (PIN_IS_SDA2(E0_STEP) || PIN_IS_SDA2(E0_DIR)) - #error "i2c SCL2 overlaps with E0 STEP/DIR pin! Disable i2c peripherals." - #elif PIN_IS_SDA2(X_DIR) || PIN_IS_SDA2(Y_DIR) - #error "One or more i2c pins overlaps with X/Y DIR pin! Disable i2c peripherals." - #endif - #undef PIN_IS_SDA2 - #undef PIN_IS_SCL2 - #endif - - #undef USEDI2CDEV_M -#endif - -#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." -#elif ENABLED(SERIAL_STATS_DROPPED_RX) - #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." -#endif diff --git a/Marlin/src/HAL/LPC1768/include/SPI.h b/Marlin/src/HAL/LPC1768/include/SPI.h deleted file mode 100644 index 9da2a32556..0000000000 --- a/Marlin/src/HAL/LPC1768/include/SPI.h +++ /dev/null @@ -1,176 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../shared/HAL_SPI.h" - -#include -#include -#include - -//#define MSBFIRST 1 - -#define SPI_MODE0 0 -#define SPI_MODE1 1 -#define SPI_MODE2 2 -#define SPI_MODE3 3 - -#define DATA_SIZE_8BIT SSP_DATABIT_8 -#define DATA_SIZE_16BIT SSP_DATABIT_16 - -#define SPI_CLOCK_DIV2 8333333 //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED -#define SPI_CLOCK_DIV4 4166667 //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED -#define SPI_CLOCK_DIV8 2083333 //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED -#define SPI_CLOCK_DIV16 1000000 //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED -#define SPI_CLOCK_DIV32 500000 //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 -#define SPI_CLOCK_DIV64 250000 //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 -#define SPI_CLOCK_DIV128 125000 //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h - -#define SPI_CLOCK_MAX SPI_CLOCK_DIV2 - -#define BOARD_NR_SPI 2 - -//#define BOARD_SPI1_NSS_PIN PA4 ?! -#define BOARD_SPI1_SCK_PIN P0_15 -#define BOARD_SPI1_MISO_PIN P0_17 -#define BOARD_SPI1_MOSI_PIN P0_18 - -//#define BOARD_SPI2_NSS_PIN PB12 ?! -#define BOARD_SPI2_SCK_PIN P0_07 -#define BOARD_SPI2_MISO_PIN P0_08 -#define BOARD_SPI2_MOSI_PIN P0_09 - -class SPISettings { -public: - SPISettings(uint32_t spiRate, int inBitOrder, int inDataMode) { - init_AlwaysInline(spiRate2Clock(spiRate), inBitOrder, inDataMode, DATA_SIZE_8BIT); - } - SPISettings(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { - if (__builtin_constant_p(inClock)) - init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); - else - init_MightInline(inClock, inBitOrder, inDataMode, inDataSize); - } - SPISettings() { - init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); - } - - //uint32_t spiRate() const { return spi_speed; } - - static inline uint32_t spiRate2Clock(uint32_t spiRate) { - uint32_t Marlin_speed[7]; // CPSR is always 2 - Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED - Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED - Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED - Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED - Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 - Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 - Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h - return Marlin_speed[spiRate > 6 ? 6 : spiRate]; - } - -private: - void init_MightInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { - init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); - } - void init_AlwaysInline(uint32_t inClock, uint8_t inBitOrder, uint8_t inDataMode, uint32_t inDataSize) __attribute__((__always_inline__)) { - clock = inClock; - bitOrder = inBitOrder; - dataMode = inDataMode; - dataSize = inDataSize; - } - - //uint32_t spi_speed; - uint32_t clock; - uint32_t dataSize; - //uint32_t clockDivider; - uint8_t bitOrder; - uint8_t dataMode; - LPC_SSP_TypeDef *spi_d; - - friend class SPIClass; -}; - -/** - * @brief Wirish SPI interface. - * - * This is the same interface is available across HAL - * - * This implementation uses software slave management, so the caller - * is responsible for controlling the slave select line. - */ -class SPIClass { -public: - /** - * @param spiPortNumber Number of the SPI port to manage. - */ - SPIClass(uint8_t spiPortNumber); - - /** - * Select and configure the current selected SPI device to use - */ - void begin(); - - /** - * Disable the current SPI device - */ - void end(); - - void beginTransaction(const SPISettings&); - void endTransaction() {} - - // Transfer using 1 "Data Size" - uint8_t transfer(uint16_t data); - // Transfer 2 bytes in 8 bit mode - uint16_t transfer16(uint16_t data); - - void send(uint8_t data); - - uint16_t read(); - void read(uint8_t *buf, uint32_t len); - - void dmaSend(void *buf, uint16_t length, bool minc); - - /** - * @brief Sets the number of the SPI peripheral to be used by - * this HardwareSPI instance. - * - * @param spi_num Number of the SPI port. 1-2 in low density devices - * or 1-3 in high density devices. - */ - void setModule(uint8_t device); - - void setClock(uint32_t clock); - void setBitOrder(uint8_t bitOrder); - void setDataMode(uint8_t dataMode); - void setDataSize(uint32_t ds); - - inline uint32_t getDataSize() { return _currentSetting->dataSize; } - -private: - SPISettings _settings[BOARD_NR_SPI]; - SPISettings *_currentSetting; - - void updateSettings(); -}; - -extern SPIClass SPI; diff --git a/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.c b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.c deleted file mode 100644 index f442ab71c0..0000000000 --- a/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.c +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * digipot_mcp4451_I2C_routines.c - * Adapted from https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html - */ - -#ifdef TARGET_LPC1768 - -#include "../../../inc/MarlinConfigPre.h" - -#if MB(MKS_SBASE) - -#ifdef __cplusplus - extern "C" { -#endif - -#include "digipot_mcp4451_I2C_routines.h" - -// These two routines are exact copies of the lpc17xx_i2c.c routines. Couldn't link to -// to the lpc17xx_i2c.c routines so had to copy them into this file & rename them. - -static uint32_t _I2C_Start(LPC_I2C_TypeDef *I2Cx) { - // Reset STA, STO, SI - I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; - - // Enter to Master Transmitter mode - I2Cx->I2CONSET = I2C_I2CONSET_STA; - - // Wait for complete - while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); - I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; - return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); -} - -static void _I2C_Stop(LPC_I2C_TypeDef *I2Cx) { - // Make sure start bit is not active - if (I2Cx->I2CONSET & I2C_I2CONSET_STA) - I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; - - I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; - I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; -} - -I2C_M_SETUP_Type transferMCfg; - -#define I2C_status (LPC_I2C1->I2STAT & I2C_STAT_CODE_BITMASK) - -uint8_t digipot_mcp4451_start(uint8_t sla) { // send slave address and write bit - // Sometimes TX data ACK or NAK status is returned. That mean the start state didn't - // happen which means only the value of the slave address was send. Keep looping until - // the slave address and write bit are actually sent. - do { - _I2C_Stop(I2CDEV_M); // output stop state on I2C bus - _I2C_Start(I2CDEV_M); // output start state on I2C bus - while ((I2C_status != I2C_I2STAT_M_TX_START) - && (I2C_status != I2C_I2STAT_M_TX_RESTART) - && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) - && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for start to be asserted - - LPC_I2C1->I2CONCLR = I2C_I2CONCLR_STAC; // clear start state before tansmitting slave address - LPC_I2C1->I2DAT = (sla << 1) & I2C_I2DAT_BITMASK; // transmit slave address & write bit - LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; - LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; - while ((I2C_status != I2C_I2STAT_M_TX_SLAW_ACK) - && (I2C_status != I2C_I2STAT_M_TX_SLAW_NACK) - && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) - && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)) { /* wait for slaw to finish */ } - } while ( (I2C_status == I2C_I2STAT_M_TX_DAT_ACK) || (I2C_status == I2C_I2STAT_M_TX_DAT_NACK)); - return 1; -} - -uint8_t digipot_mcp4451_send_byte(uint8_t data) { - LPC_I2C1->I2DAT = data & I2C_I2DAT_BITMASK; // transmit data - LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; - LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; - while (I2C_status != I2C_I2STAT_M_TX_DAT_ACK && I2C_status != I2C_I2STAT_M_TX_DAT_NACK); // wait for xmit to finish - return 1; -} - -#ifdef __cplusplus - } -#endif - -#endif // MB(MKS_SBASE) -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h deleted file mode 100644 index 9b6c62b052..0000000000 --- a/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * digipot_mcp4451_I2C_routines.h - * Adapted from https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html - */ - -#ifdef __cplusplus - extern "C" { -#endif - -#include -#include -#include -#include "i2c_util.h" - -uint8_t digipot_mcp4451_start(uint8_t sla); -uint8_t digipot_mcp4451_send_byte(uint8_t data); - -#ifdef __cplusplus - } -#endif diff --git a/Marlin/src/HAL/LPC1768/include/i2c_util.c b/Marlin/src/HAL/LPC1768/include/i2c_util.c deleted file mode 100644 index e52fb7c4de..0000000000 --- a/Marlin/src/HAL/LPC1768/include/i2c_util.c +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL_LPC1768/include/i2c_util.c - */ - -#ifdef TARGET_LPC1768 - -#include "i2c_util.h" - -#define U8G_I2C_OPT_FAST 16 // from u8g.h - -#ifdef __cplusplus - extern "C" { -#endif - -void configure_i2c(const uint8_t clock_option) { - /** - * Init I2C pin connect - */ - PINSEL_CFG_Type PinCfg; - PinCfg.OpenDrain = 0; - PinCfg.Pinmode = 0; - PinCfg.Portnum = 0; - #if I2C_MASTER_ID == 0 - PinCfg.Funcnum = 1; - PinCfg.Pinnum = 27; // SDA0 / D57 AUX-1 ... SCL0 / D58 AUX-1 - #elif I2C_MASTER_ID == 1 - PinCfg.Funcnum = 3; - PinCfg.Pinnum = 0; // SDA1 / D20 SCA ... SCL1 / D21 SCL - #elif I2C_MASTER_ID == 2 - PinCfg.Funcnum = 2; - PinCfg.Pinnum = 10; // SDA2 / D38 X_ENABLE_PIN ... SCL2 / D55 X_DIR_PIN - #endif - PINSEL_ConfigPin(&PinCfg); - PinCfg.Pinnum += 1; - PINSEL_ConfigPin(&PinCfg); - - // Initialize I2C peripheral - I2C_Init(I2CDEV_M, (clock_option & U8G_I2C_OPT_FAST) ? 400000: 100000); // LCD data rates - - // Enable Master I2C operation - I2C_Cmd(I2CDEV_M, I2C_MASTER_MODE, ENABLE); -} - -#ifdef __cplusplus - } -#endif - -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/include/i2c_util.h b/Marlin/src/HAL/LPC1768/include/i2c_util.h deleted file mode 100644 index a57f68a407..0000000000 --- a/Marlin/src/HAL/LPC1768/include/i2c_util.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL_LPC1768/include/i2c_util.h - */ - -#include "../../../inc/MarlinConfigPre.h" - -#ifndef I2C_MASTER_ID - #define I2C_MASTER_ID 1 -#endif - -#if I2C_MASTER_ID == 0 - #define I2CDEV_M LPC_I2C0 -#elif I2C_MASTER_ID == 1 - #define I2CDEV_M LPC_I2C1 -#elif I2C_MASTER_ID == 2 - #define I2CDEV_M LPC_I2C2 -#else - #error "Master I2C device not defined!" -#endif - -#include -#include -#include - -#ifdef __cplusplus - extern "C" { -#endif - -void configure_i2c(const uint8_t clock_option); - -#ifdef __cplusplus - } -#endif diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp deleted file mode 100644 index 0b4045cb99..0000000000 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern "C" { - #include -} - -#include "../../sd/cardreader.h" -#include "../../inc/MarlinConfig.h" -#include "../../core/millis_t.h" - -extern uint32_t MSC_SD_Init(uint8_t pdrv); -extern "C" int isLPC1769(); -extern "C" void disk_timerproc(); - -void SysTick_Callback() { disk_timerproc(); } - -void HAL_init() { - - // Init LEDs - #if PIN_EXISTS(LED) - SET_DIR_OUTPUT(LED_PIN); - WRITE_PIN_CLR(LED_PIN); - #if PIN_EXISTS(LED2) - SET_DIR_OUTPUT(LED2_PIN); - WRITE_PIN_CLR(LED2_PIN); - #if PIN_EXISTS(LED3) - SET_DIR_OUTPUT(LED3_PIN); - WRITE_PIN_CLR(LED3_PIN); - #if PIN_EXISTS(LED4) - SET_DIR_OUTPUT(LED4_PIN); - WRITE_PIN_CLR(LED4_PIN); - #endif - #endif - #endif - - // Flash status LED 3 times to indicate Marlin has started booting - LOOP_L_N(i, 6) { - TOGGLE(LED_PIN); - delay(100); - } - #endif - - // Init Servo Pins - #define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW) - #if HAS_SERVO_0 - INIT_SERVO(0); - #endif - #if HAS_SERVO_1 - INIT_SERVO(1); - #endif - #if HAS_SERVO_2 - INIT_SERVO(2); - #endif - #if HAS_SERVO_3 - INIT_SERVO(3); - #endif - - //debug_frmwrk_init(); - //_DBG("\n\nDebug running\n"); - // Initialize the SD card chip select pins as soon as possible - #if PIN_EXISTS(SS) - OUT_WRITE(SS_PIN, HIGH); - #endif - - #if PIN_EXISTS(ONBOARD_SD_CS) && ONBOARD_SD_CS_PIN != SS_PIN - OUT_WRITE(ONBOARD_SD_CS_PIN, HIGH); - #endif - - #ifdef LPC1768_ENABLE_CLKOUT_12M - /** - * CLKOUTCFG register - * bit 8 (CLKOUT_EN) = enables CLKOUT signal. Disabled for now to prevent glitch when enabling GPIO. - * bits 7:4 (CLKOUTDIV) = set to 0 for divider setting of /1 - * bits 3:0 (CLKOUTSEL) = set to 1 to select main crystal oscillator as CLKOUT source - */ - LPC_SC->CLKOUTCFG = (0<<8)|(0<<4)|(1<<0); - // set P1.27 pin to function 01 (CLKOUT) - PINSEL_CFG_Type PinCfg; - PinCfg.Portnum = 1; - PinCfg.Pinnum = 27; - PinCfg.Funcnum = 1; // function 01 (CLKOUT) - PinCfg.OpenDrain = 0; // not open drain - PinCfg.Pinmode = 2; // no pull-up/pull-down - PINSEL_ConfigPin(&PinCfg); - // now set CLKOUT_EN bit - LPC_SC->CLKOUTCFG |= (1<<8); - #endif - - USB_Init(); // USB Initialization - USB_Connect(FALSE); // USB clear connection - delay(1000); // Give OS time to notice - USB_Connect(TRUE); - - #if DISABLED(NO_SD_HOST_DRIVE) - MSC_SD_Init(0); // Enable USB SD card access - #endif - - const millis_t usb_timeout = millis() + 2000; - while (!USB_Configuration && PENDING(millis(), usb_timeout)) { - delay(50); - HAL_idletask(); - #if PIN_EXISTS(LED) - TOGGLE(LED_PIN); // Flash quickly during USB initialization - #endif - } - - HAL_timer_init(); -} - -// HAL idle task -void HAL_idletask() { - #if HAS_SHARED_MEDIA - // If Marlin is using the SD card we need to lock it to prevent access from - // a PC via USB. - // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but - // this will not reliably detect delete operations. To be safe we will lock - // the disk if Marlin has it mounted. Unfortunately there is currently no way - // to unmount the disk from the LCD menu. - // if (IS_SD_PRINTING() || IS_SD_FILE_OPEN()) - if (card.isMounted()) - MSC_Aquire_Lock(); - else - MSC_Release_Lock(); - #endif - // Perform USB stack housekeeping - MSC_RunDeferredCommands(); -} - -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/pinsDebug.h b/Marlin/src/HAL/LPC1768/pinsDebug.h deleted file mode 100644 index f80551604f..0000000000 --- a/Marlin/src/HAL/LPC1768/pinsDebug.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Support routines for LPC1768 - */ - -/** - * Translation of routines & variables used by pinsDebug.h - */ - -#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define pwm_details(pin) pin = pin // do nothing // print PWM details -#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin. -#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) -#define digitalRead_mod(p) extDigitalRead(p) -#define PRINT_PORT(p) -#define GET_ARRAY_PIN(p) pin_array[p].pin -#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%d.%02d"), LPC176x::pin_port(p), LPC176x::pin_bit(p)); SERIAL_ECHO(buffer); }while(0) -#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin - -// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities -#ifndef M43_NEVER_TOUCH - #define M43_NEVER_TOUCH(Q) ((Q) == P0_29 || (Q) == P0_30 || (Q) == P2_09) // USB pins -#endif - -bool GET_PINMODE(const pin_t pin) { - if (!LPC176x::pin_is_valid(pin) || LPC176x::pin_adc_enabled(pin)) // found an invalid pin or active analog pin - return false; - - return LPC176x::gpio_direction(pin); -} - -bool GET_ARRAY_IS_DIGITAL(const pin_t pin) { - return (!LPC176x::pin_has_adc(pin) || !LPC176x::pin_adc_enabled(pin)); -} diff --git a/Marlin/src/HAL/LPC1768/spi_pins.h b/Marlin/src/HAL/LPC1768/spi_pins.h deleted file mode 100644 index b4da5d4df2..0000000000 --- a/Marlin/src/HAL/LPC1768/spi_pins.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../core/macros.h" - -#if BOTH(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) - #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently - // needed due to the speed and mode required for communicating with each device being different. - // This requirement can be removed if the SPI access to these devices is updated to use - // spiBeginTransaction. -#endif - -/** onboard SD card */ -//#define SCK_PIN P0_07 -//#define MISO_PIN P0_08 -//#define MOSI_PIN P0_09 -//#define SS_PIN P0_06 -/** external */ -#ifndef SCK_PIN - #define SCK_PIN P0_15 -#endif -#ifndef MISO_PIN - #define MISO_PIN P0_17 -#endif -#ifndef MOSI_PIN - #define MOSI_PIN P0_18 -#endif -#ifndef SS_PIN - #define SS_PIN P1_23 -#endif -#if !defined(SDSS) || SDSS == P_NC // gets defaulted in pins.h - #undef SDSS - #define SDSS SS_PIN -#endif diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp deleted file mode 100644 index 84907acd07..0000000000 --- a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_SPI_TFT - -#include "tft_spi.h" - -//TFT_SPI tft; - -SPIClass TFT_SPI::SPIx(1); - -#define TFT_CS_H WRITE(TFT_CS_PIN, HIGH) -#define TFT_CS_L WRITE(TFT_CS_PIN, LOW) - -#define TFT_DC_H WRITE(TFT_DC_PIN, HIGH) -#define TFT_DC_L WRITE(TFT_DC_PIN, LOW) - -#define TFT_RST_H WRITE(TFT_RESET_PIN, HIGH) -#define TFT_RST_L WRITE(TFT_RESET_PIN, LOW) - -#define TFT_BLK_H WRITE(TFT_BACKLIGHT_PIN, HIGH) -#define TFT_BLK_L WRITE(TFT_BACKLIGHT_PIN, LOW) - -void TFT_SPI::Init() { - #if PIN_EXISTS(TFT_RESET) - SET_OUTPUT(TFT_RESET_PIN); - TFT_RST_H; - delay(100); - #endif - - #if PIN_EXISTS(TFT_BACKLIGHT) - SET_OUTPUT(TFT_BACKLIGHT_PIN); - TFT_BLK_H; - #endif - - SET_OUTPUT(TFT_DC_PIN); - SET_OUTPUT(TFT_CS_PIN); - - TFT_DC_H; - TFT_CS_H; - - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - #if 0 - #if SPI_DEVICE == 1 - #define SPI_CLOCK_MAX SPI_CLOCK_DIV4 - #else - #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 - #endif - uint8_t clock; - uint8_t spiRate = SPI_FULL_SPEED; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_MAX ; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - #endif - - #if TFT_MISO_PIN == BOARD_SPI1_MISO_PIN - SPIx.setModule(1); - #elif TFT_MISO_PIN == BOARD_SPI2_MISO_PIN - SPIx.setModule(2); - #endif - SPIx.setClock(SPI_CLOCK_MAX); - SPIx.setBitOrder(MSBFIRST); - SPIx.setDataMode(SPI_MODE0); -} - -void TFT_SPI::DataTransferBegin(uint16_t DataSize) { - SPIx.setDataSize(DataSize); - SPIx.begin(); - TFT_CS_L; -} - -uint32_t TFT_SPI::GetID() { - uint32_t id; - id = ReadID(LCD_READ_ID); - if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) - id = ReadID(LCD_READ_ID4); - return id; -} - -uint32_t TFT_SPI::ReadID(uint16_t Reg) { - uint32_t data = 0; - - #if PIN_EXISTS(TFT_MISO) - uint8_t d = 0; - SPIx.setDataSize(DATASIZE_8BIT); - SPIx.setClock(SPI_CLOCK_DIV64); - SPIx.begin(); - TFT_CS_L; - WriteReg(Reg); - - LOOP_L_N(i, 4) { - SPIx.read((uint8_t*)&d, 1); - data = (data << 8) | d; - } - - DataTransferEnd(); - SPIx.setClock(SPI_CLOCK_MAX); - #endif - - return data >> 7; -} - -bool TFT_SPI::isBusy() { - return false; -} - -void TFT_SPI::Abort() { - DataTransferEnd(); -} - -void TFT_SPI::Transmit(uint16_t Data) { - SPIx.transfer(Data); -} - -void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DataTransferBegin(DATASIZE_16BIT); //16 - TFT_DC_H; - SPIx.dmaSend(Data, Count, MemoryIncrease); - DataTransferEnd(); -} - -#endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.h b/Marlin/src/HAL/LPC1768/tft/tft_spi.h deleted file mode 100644 index 4753fdbae9..0000000000 --- a/Marlin/src/HAL/LPC1768/tft/tft_spi.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../inc/MarlinConfig.h" - -#include -#include -// #include - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif -#ifndef LCD_READ_ID4 - #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) -#endif - -#define DATASIZE_8BIT SSP_DATABIT_8 -#define DATASIZE_16BIT SSP_DATABIT_16 -#define TFT_IO_DRIVER TFT_SPI - -#define DMA_MINC_ENABLE 1 -#define DMA_MINC_DISABLE 0 - -class TFT_SPI { -private: - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - -public: - static SPIClass SPIx; - - static void Init(); - static uint32_t GetID(); - static bool isBusy(); - static void Abort(); - - static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT); - static void DataTransferEnd() { OUT_WRITE(TFT_CS_PIN, HIGH); SPIx.end(); }; - static void DataTransferAbort(); - - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg) { OUT_WRITE(TFT_A0_PIN, LOW); Transmit(Reg); OUT_WRITE(TFT_A0_PIN, HIGH); } - - static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } - // static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } - static void WriteMultiple(uint16_t Color, uint32_t Count) { - static uint16_t Data; Data = Color; - //LPC dma can only write 0xFFF bytes at once. - #define MAX_DMA_SIZE (0xFFF - 1) - while (Count > 0) { - TransmitDMA(DMA_MINC_DISABLE, &Data, Count > MAX_DMA_SIZE ? MAX_DMA_SIZE : Count); - Count = Count > MAX_DMA_SIZE ? Count - MAX_DMA_SIZE : 0; - } - #undef MAX_DMA_SIZE - } -}; diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp deleted file mode 100644 index 5f96630043..0000000000 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046 - -#include "xpt2046.h" -#include - -uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } - -#if ENABLED(TOUCH_BUTTONS_HW_SPI) - #include - - SPIClass XPT2046::SPIx(TOUCH_BUTTONS_HW_SPI_DEVICE); - - static void touch_spi_init(uint8_t spiRate) { - XPT2046::SPIx.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); - XPT2046::SPIx.setClock(SPI_CLOCK_DIV128); - XPT2046::SPIx.setBitOrder(MSBFIRST); - XPT2046::SPIx.setDataMode(SPI_MODE0); - XPT2046::SPIx.setDataSize(DATA_SIZE_8BIT); - } -#endif - -void XPT2046::Init() { - SET_INPUT(TOUCH_MISO_PIN); - SET_OUTPUT(TOUCH_MOSI_PIN); - SET_OUTPUT(TOUCH_SCK_PIN); - OUT_WRITE(TOUCH_CS_PIN, HIGH); - - #if PIN_EXISTS(TOUCH_INT) - // Optional Pendrive interrupt pin - SET_INPUT(TOUCH_INT_PIN); - #endif - - TERN_(TOUCH_BUTTONS_HW_SPI, touch_spi_init(SPI_SPEED_6)); - - // Read once to enable pendrive status pin - getRawData(XPT2046_X); -} - -bool XPT2046::isTouched() { - return isBusy() ? false : ( - #if PIN_EXISTS(TOUCH_INT) - READ(TOUCH_INT_PIN) != HIGH - #else - getRawData(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD - #endif - ); -} - -bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { - if (isBusy()) return false; - if (!isTouched()) return false; - *x = getRawData(XPT2046_X); - *y = getRawData(XPT2046_Y); - return isTouched(); -} - -uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { - uint16_t data[3]; - - DataTransferBegin(); - TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.begin()); - - for (uint16_t i = 0; i < 3 ; i++) { - IO(coordinate); - data[i] = (IO() << 4) | (IO() >> 4); - } - - TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.end()); - DataTransferEnd(); - - uint16_t delta01 = delta(data[0], data[1]), - delta02 = delta(data[0], data[2]), - delta12 = delta(data[1], data[2]); - - if (delta01 > delta02 || delta01 > delta12) - data[delta02 > delta12 ? 0 : 1] = data[2]; - - return (data[0] + data[1]) >> 1; -} - -uint16_t XPT2046::IO(uint16_t data) { - return TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); -} - -extern uint8_t spiTransfer(uint8_t b); - -#if ENABLED(TOUCH_BUTTONS_HW_SPI) - uint16_t XPT2046::HardwareIO(uint16_t data) { - return SPIx.transfer(data & 0xFF); - } -#endif - -uint16_t XPT2046::SoftwareIO(uint16_t data) { - uint16_t result = 0; - - for (uint8_t j = 0x80; j; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - WRITE(TOUCH_MOSI_PIN, data & j ? HIGH : LOW); - if (READ(TOUCH_MISO_PIN)) result |= j; - WRITE(TOUCH_SCK_PIN, HIGH); - } - WRITE(TOUCH_SCK_PIN, LOW); - - return result; -} - -#endif // HAS_TFT_XPT2046 diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.h b/Marlin/src/HAL/LPC1768/tft/xpt2046.h deleted file mode 100644 index 019f75efce..0000000000 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(TOUCH_BUTTONS_HW_SPI) - #include -#endif - -#ifndef TOUCH_MISO_PIN - #define TOUCH_MISO_PIN MISO_PIN -#endif -#ifndef TOUCH_MOSI_PIN - #define TOUCH_MOSI_PIN MOSI_PIN -#endif -#ifndef TOUCH_SCK_PIN - #define TOUCH_SCK_PIN SCK_PIN -#endif -#ifndef TOUCH_CS_PIN - #define TOUCH_CS_PIN CS_PIN -#endif -#ifndef TOUCH_INT_PIN - #define TOUCH_INT_PIN -1 -#endif - -#define XPT2046_DFR_MODE 0x00 -#define XPT2046_SER_MODE 0x04 -#define XPT2046_CONTROL 0x80 - -enum XPTCoordinate : uint8_t { - XPT2046_X = 0x10 | XPT2046_CONTROL | XPT2046_DFR_MODE, - XPT2046_Y = 0x50 | XPT2046_CONTROL | XPT2046_DFR_MODE, - XPT2046_Z1 = 0x30 | XPT2046_CONTROL | XPT2046_DFR_MODE, - XPT2046_Z2 = 0x40 | XPT2046_CONTROL | XPT2046_DFR_MODE, -}; - -#if !defined(XPT2046_Z1_THRESHOLD) - #define XPT2046_Z1_THRESHOLD 10 -#endif - -class XPT2046 { -private: - static bool isBusy() { return false; } - - static uint16_t getRawData(const XPTCoordinate coordinate); - static bool isTouched(); - - static inline void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; - static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; - #if ENABLED(TOUCH_BUTTONS_HW_SPI) - static uint16_t HardwareIO(uint16_t data); - #endif - static uint16_t SoftwareIO(uint16_t data); - static uint16_t IO(uint16_t data = 0); - -public: - #if ENABLED(TOUCH_BUTTONS_HW_SPI) - static SPIClass SPIx; - #endif - - static void Init(); - static bool getRawPoint(int16_t *x, int16_t *y); -}; diff --git a/Marlin/src/HAL/LPC1768/timers.cpp b/Marlin/src/HAL/LPC1768/timers.cpp deleted file mode 100644 index a7a40584da..0000000000 --- a/Marlin/src/HAL/LPC1768/timers.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Description: - * - * Timers for LPC1768 - */ - -#ifdef TARGET_LPC1768 - -#include "../../inc/MarlinConfig.h" - -void HAL_timer_init() { - SBI(LPC_SC->PCONP, SBIT_TIMER0); // Power ON Timer 0 - LPC_TIM0->PR = (HAL_TIMER_RATE) / (STEPPER_TIMER_RATE) - 1; // Use prescaler to set frequency if needed - - SBI(LPC_SC->PCONP, SBIT_TIMER1); // Power ON Timer 1 - LPC_TIM1->PR = (HAL_TIMER_RATE) / 1000000 - 1; -} - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - switch (timer_num) { - case 0: - LPC_TIM0->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them - LPC_TIM0->MR0 = uint32_t(STEPPER_TIMER_RATE) / frequency; // Match value (period) to set frequency - LPC_TIM0->TCR = _BV(SBIT_CNTEN); // Counter Enable - - NVIC_SetPriority(TIMER0_IRQn, NVIC_EncodePriority(0, 1, 0)); - NVIC_EnableIRQ(TIMER0_IRQn); - break; - - case 1: - LPC_TIM1->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them - LPC_TIM1->MR0 = uint32_t(TEMP_TIMER_RATE) / frequency; - LPC_TIM1->TCR = _BV(SBIT_CNTEN); // Counter Enable - - NVIC_SetPriority(TIMER1_IRQn, NVIC_EncodePriority(0, 2, 0)); - NVIC_EnableIRQ(TIMER1_IRQn); - break; - - default: break; - } -} - -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/timers.h b/Marlin/src/HAL/LPC1768/timers.h deleted file mode 100644 index e6744fb005..0000000000 --- a/Marlin/src/HAL/LPC1768/timers.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL For LPC1768 - */ - -#include - -#include "../../core/macros.h" - -#define SBIT_TIMER0 1 -#define SBIT_TIMER1 2 - -#define SBIT_CNTEN 0 - -#define SBIT_MR0I 0 // Timer 0 Interrupt when TC matches MR0 -#define SBIT_MR0R 1 // Timer 0 Reset TC on Match -#define SBIT_MR0S 2 // Timer 0 Stop TC and PC on Match -#define SBIT_MR1I 3 -#define SBIT_MR1R 4 -#define SBIT_MR1S 5 -#define SBIT_MR2I 6 -#define SBIT_MR2R 7 -#define SBIT_MR2S 8 -#define SBIT_MR3I 9 -#define SBIT_MR3R 10 -#define SBIT_MR3S 11 - -// ------------------------ -// Defines -// ------------------------ - -#define _HAL_TIMER(T) _CAT(LPC_TIM, T) -#define _HAL_TIMER_IRQ(T) TIMER##T##_IRQn -#define __HAL_TIMER_ISR(T) extern "C" void TIMER##T##_IRQHandler() -#define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T) - -typedef uint32_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF - -#define HAL_TIMER_RATE ((F_CPU) / 4) // frequency of timers peripherals - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif -#ifndef PWM_TIMER_NUM - #define PWM_TIMER_NUM 3 // Timer Index for PWM -#endif - -#define TEMP_TIMER_RATE 1000000 -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency - -#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs -#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() _HAL_TIMER_ISR(STEP_TIMER_NUM) -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() _HAL_TIMER_ISR(TEMP_TIMER_NUM) -#endif - -// Timer references by index -#define STEP_TIMER_PTR _HAL_TIMER(STEP_TIMER_NUM) -#define TEMP_TIMER_PTR _HAL_TIMER(TEMP_TIMER_NUM) - -// ------------------------ -// Public functions -// ------------------------ -void HAL_timer_init(); -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); - -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { - switch (timer_num) { - case 0: STEP_TIMER_PTR->MR0 = compare; break; // Stepper Timer Match Register 0 - case 1: TEMP_TIMER_PTR->MR0 = compare; break; // Temp Timer Match Register 0 - } -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - switch (timer_num) { - case 0: return STEP_TIMER_PTR->MR0; // Stepper Timer Match Register 0 - case 1: return TEMP_TIMER_PTR->MR0; // Temp Timer Match Register 0 - } - return 0; -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - switch (timer_num) { - case 0: return STEP_TIMER_PTR->TC; // Stepper Timer Count - case 1: return TEMP_TIMER_PTR->TC; // Temp Timer Count - } - return 0; -} - -FORCE_INLINE static void HAL_timer_enable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case 0: NVIC_EnableIRQ(TIMER0_IRQn); break; // Enable interrupt handler - case 1: NVIC_EnableIRQ(TIMER1_IRQn); break; // Enable interrupt handler - } -} - -FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case 0: NVIC_DisableIRQ(TIMER0_IRQn); break; // Disable interrupt handler - case 1: NVIC_DisableIRQ(TIMER1_IRQn); break; // Disable interrupt handler - } - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); -} - -// This function is missing from CMSIS -FORCE_INLINE static bool NVIC_GetEnableIRQ(IRQn_Type IRQn) { - return (NVIC->ISER[((uint32_t)IRQn) >> 5] & (1 << ((uint32_t)IRQn) & 0x1F)) != 0; -} - -FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - switch (timer_num) { - case 0: return NVIC_GetEnableIRQ(TIMER0_IRQn); // Check if interrupt is enabled or not - case 1: return NVIC_GetEnableIRQ(TIMER1_IRQn); // Check if interrupt is enabled or not - } - return false; -} - -FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { - switch (timer_num) { - case 0: SBI(STEP_TIMER_PTR->IR, SBIT_CNTEN); break; - case 1: SBI(TEMP_TIMER_PTR->IR, SBIT_CNTEN); break; - } -} - -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp deleted file mode 100644 index a48a820dc4..0000000000 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// adapted from I2C/master/master.c example -// https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html - -#ifdef TARGET_LPC1768 - -#include "../include/i2c_util.h" -#include "../../../core/millis_t.h" - -extern int millis(); - -#ifdef __cplusplus - extern "C" { -#endif - -////////////////////////////////////////////////////////////////////////////////////// - -// These two routines are exact copies of the lpc17xx_i2c.c routines. Couldn't link to -// to the lpc17xx_i2c.c routines so had to copy them into this file & rename them. - -static uint32_t _I2C_Start(LPC_I2C_TypeDef *I2Cx) { - // Reset STA, STO, SI - I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; - - // Enter to Master Transmitter mode - I2Cx->I2CONSET = I2C_I2CONSET_STA; - - // Wait for complete - while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); - I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; - return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); -} - -static void _I2C_Stop (LPC_I2C_TypeDef *I2Cx) { - /* Make sure start bit is not active */ - if (I2Cx->I2CONSET & I2C_I2CONSET_STA) - I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; - - I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; - I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; -} - -////////////////////////////////////////////////////////////////////////////////////// - -#define I2CDEV_S_ADDR 0x78 // from SSD1306 //actual address is 0x3C - shift left 1 with LSB set to 0 to indicate write - -#define BUFFER_SIZE 0x1 // only do single byte transfers with LCDs - -I2C_M_SETUP_Type transferMCfg; - -#define I2C_status (LPC_I2C1->I2STAT & I2C_STAT_CODE_BITMASK) - -// Send slave address and write bit -uint8_t u8g_i2c_start(const uint8_t sla) { - // Sometimes TX data ACK or NAK status is returned. That mean the start state didn't - // happen which means only the value of the slave address was send. Keep looping until - // the slave address and write bit are actually sent. - do{ - _I2C_Stop(I2CDEV_M); // output stop state on I2C bus - _I2C_Start(I2CDEV_M); // output start state on I2C bus - while ((I2C_status != I2C_I2STAT_M_TX_START) - && (I2C_status != I2C_I2STAT_M_TX_RESTART) - && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) - && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for start to be asserted - - LPC_I2C1->I2CONCLR = I2C_I2CONCLR_STAC; // clear start state before tansmitting slave address - LPC_I2C1->I2DAT = I2CDEV_S_ADDR & I2C_I2DAT_BITMASK; // transmit slave address & write bit - LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; - LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; - while ((I2C_status != I2C_I2STAT_M_TX_SLAW_ACK) - && (I2C_status != I2C_I2STAT_M_TX_SLAW_NACK) - && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) - && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for slaw to finish - }while ( (I2C_status == I2C_I2STAT_M_TX_DAT_ACK) || (I2C_status == I2C_I2STAT_M_TX_DAT_NACK)); - return 1; -} - -void u8g_i2c_init(const uint8_t clock_option) { - configure_i2c(clock_option); - u8g_i2c_start(0); // Send slave address and write bit -} - -uint8_t u8g_i2c_send_byte(uint8_t data) { - #define I2C_TIMEOUT 3 - LPC_I2C1->I2DAT = data & I2C_I2DAT_BITMASK; // transmit data - LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; - LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; - const millis_t timeout = millis() + I2C_TIMEOUT; - while ((I2C_status != I2C_I2STAT_M_TX_DAT_ACK) && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK) && PENDING(millis(), timeout)); // wait for xmit to finish - // had hangs with SH1106 so added time out - have seen temporary screen corruption when this happens - return 1; -} - -void u8g_i2c_stop() { -} - - -#ifdef __cplusplus - } -#endif - -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h deleted file mode 100644 index 2d976c92d2..0000000000 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -void u8g_i2c_init(const uint8_t clock_options); -//uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos); -uint8_t u8g_i2c_start(uint8_t sla); -uint8_t u8g_i2c_send_byte(uint8_t data); -void u8g_i2c_stop(); diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_defines.h b/Marlin/src/HAL/LPC1768/u8g/LCD_defines.h deleted file mode 100644 index d2260037b6..0000000000 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_defines.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * LPC1768 LCD-specific defines - */ - -// The following are optional depending on the platform. - -// definitions of HAL specific com and device drivers. -uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); -uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); -uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); -uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); -uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - - -// connect U8g com generic com names to the desired driver -#define U8G_COM_HW_SPI u8g_com_HAL_LPC1768_hw_spi_fn // use LPC1768 specific hardware SPI routine -#define U8G_COM_SW_SPI u8g_com_HAL_LPC1768_sw_spi_fn // use LPC1768 specific software SPI routine -#define U8G_COM_ST7920_HW_SPI u8g_com_HAL_LPC1768_ST7920_hw_spi_fn -#define U8G_COM_ST7920_SW_SPI u8g_com_HAL_LPC1768_ST7920_sw_spi_fn -#define U8G_COM_SSD_I2C u8g_com_HAL_LPC1768_ssd_hw_i2c_fn - -// let these default for now -#define U8G_COM_PARALLEL u8g_com_null_fn -#define U8G_COM_T6963 u8g_com_null_fn -#define U8G_COM_FAST_PARALLEL u8g_com_null_fn -#define U8G_COM_UC_I2C u8g_com_null_fn diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h b/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h deleted file mode 100644 index 0b9e2b4fd0..0000000000 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * LCD delay routines - used by all the drivers. - * - * These are based on the LPC1768 routines. - * - * Couldn't just call exact copies because the overhead - * results in a one microsecond delay taking about 4µS. - */ - -#ifdef __cplusplus - extern "C" { -#endif - -void U8g_delay(int msec); -void u8g_MicroDelay(); -void u8g_10MicroDelay(); - -#ifdef __cplusplus - } -#endif diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c deleted file mode 100644 index 466fc80203..0000000000 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Low level pin manipulation routines - used by all the drivers. - * - * These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines. - * - * Couldn't just call exact copies because the overhead killed the LCD update speed - * With an intermediate level the softspi was running in the 10-20kHz range which - * resulted in using about about 25% of the CPU's time. - */ - -#ifdef TARGET_LPC1768 - -#include -#include -#include "../../../core/macros.h" -//#include - -#define LPC_PORT_OFFSET (0x0020) -#define LPC_PIN(pin) (1UL << pin) -#define LPC_GPIO(port) ((volatile LPC_GPIO_TypeDef *)(LPC_GPIO0_BASE + LPC_PORT_OFFSET * port)) - -#define INPUT 0 -#define OUTPUT 1 -#define INPUT_PULLUP 2 - -uint8_t LPC1768_PIN_PORT(const uint8_t pin); -uint8_t LPC1768_PIN_PIN(const uint8_t pin); - -#ifdef __cplusplus - extern "C" { -#endif - -// I/O functions -// As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) -void pinMode_LCD(uint8_t pin, uint8_t mode) { - #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) - #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) - PINSEL_CFG_Type config = { LPC1768_PIN_PORT(pin), - LPC1768_PIN_PIN(pin), - PINSEL_FUNC_0, - PINSEL_PINMODE_TRISTATE, - PINSEL_PINMODE_NORMAL }; - switch (mode) { - case INPUT: - LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); - PINSEL_ConfigPin(&config); - break; - case OUTPUT: - LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR |= LPC_PIN(LPC1768_PIN_PIN(pin)); - PINSEL_ConfigPin(&config); - break; - case INPUT_PULLUP: - LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); - config.Pinmode = PINSEL_PINMODE_PULLUP; - PINSEL_ConfigPin(&config); - break; - default: break; - } -} - -void u8g_SetPinOutput(uint8_t internal_pin_number) { - pinMode_LCD(internal_pin_number, 1); // OUTPUT -} - -void u8g_SetPinInput(uint8_t internal_pin_number) { - pinMode_LCD(internal_pin_number, 0); // INPUT -} - -void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status) { - #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) - #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) - if (pin_status) - LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOSET = LPC_PIN(LPC1768_PIN_PIN(pin)); - else - LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOCLR = LPC_PIN(LPC1768_PIN_PIN(pin)); -} - -uint8_t u8g_GetPinLevel(uint8_t pin) { - #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) - #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) - return (uint32_t)LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOPIN & LPC_PIN(LPC1768_PIN_PIN(pin)) ? 1 : 0; -} - -#ifdef __cplusplus - } -#endif - -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h deleted file mode 100644 index d60d93dadd..0000000000 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Low level pin manipulation routines - used by all the drivers. - * - * These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines. - * - * Couldn't just call exact copies because the overhead killed the LCD update speed - * With an intermediate level the softspi was running in the 10-20kHz range which - * resulted in using about about 25% of the CPU's time. - */ - -void u8g_SetPinOutput(uint8_t internal_pin_number); -void u8g_SetPinInput(uint8_t internal_pin_number); -void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status); -uint8_t u8g_GetPinLevel(uint8_t pin); diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp deleted file mode 100644 index ca9d6ecfbe..0000000000 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp +++ /dev/null @@ -1,207 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Based on u8g_com_std_sw_spi.c - * - * Universal 8bit Graphics Library - * - * Copyright (c) 2015, olikraus@gmail.com - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef TARGET_LPC1768 - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920) - -#include - -#undef SPI_SPEED -#define SPI_SPEED 2 // About 2 MHz - -#include -#include -#include -#include - -#include - -uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { - - LOOP_L_N(i, 8) { - if (spi_speed == 0) { - LPC176x::gpio_set(mosi_pin, !!(b & 0x80)); - LPC176x::gpio_set(sck_pin, HIGH); - b <<= 1; - if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1; - LPC176x::gpio_set(sck_pin, LOW); - } - else { - const uint8_t state = (b & 0x80) ? HIGH : LOW; - LOOP_L_N(j, spi_speed) - LPC176x::gpio_set(mosi_pin, state); - - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) - LPC176x::gpio_set(sck_pin, HIGH); - - b <<= 1; - if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1; - - LOOP_L_N(j, spi_speed) - LPC176x::gpio_set(sck_pin, LOW); - } - } - - return b; -} - -uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { - - LOOP_L_N(i, 8) { - const uint8_t state = (b & 0x80) ? HIGH : LOW; - if (spi_speed == 0) { - LPC176x::gpio_set(sck_pin, LOW); - LPC176x::gpio_set(mosi_pin, state); - LPC176x::gpio_set(mosi_pin, state); // need some setup time - LPC176x::gpio_set(sck_pin, HIGH); - } - else { - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) - LPC176x::gpio_set(sck_pin, LOW); - - LOOP_L_N(j, spi_speed) - LPC176x::gpio_set(mosi_pin, state); - - LOOP_L_N(j, spi_speed) - LPC176x::gpio_set(sck_pin, HIGH); - } - b <<= 1; - if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1; - } - - return b; -} - -static uint8_t SPI_speed = 0; - -static void u8g_sw_spi_HAL_LPC1768_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) { - #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) - swSpiTransfer_mode_3(val, SPI_speed, clockPin, -1, dataPin); - #else - swSpiTransfer_mode_0(val, SPI_speed, clockPin, -1, dataPin); - #endif -} - -uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - switch (msg) { - case U8G_COM_MSG_INIT: - u8g_SetPIOutput(u8g, U8G_PI_SCK); - u8g_SetPIOutput(u8g, U8G_PI_MOSI); - u8g_SetPIOutput(u8g, U8G_PI_CS); - u8g_SetPIOutput(u8g, U8G_PI_A0); - if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput(u8g, U8G_PI_RESET); - SPI_speed = swSpiInit(SPI_SPEED, u8g->pin_list[U8G_PI_SCK], u8g->pin_list[U8G_PI_MOSI]); - u8g_SetPILevel(u8g, U8G_PI_SCK, 0); - u8g_SetPILevel(u8g, U8G_PI_MOSI, 0); - break; - - case U8G_COM_MSG_STOP: - break; - - case U8G_COM_MSG_RESET: - if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_CHIP_SELECT: - #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 - if (arg_val) { // SCK idle state needs to be set to the proper idle state before - // the next chip select goes active - u8g_SetPILevel(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active - u8g_SetPILevel(u8g, U8G_PI_CS, LOW); - } - else { - u8g_SetPILevel(u8g, U8G_PI_CS, HIGH); - u8g_SetPILevel(u8g, U8G_PI_SCK, 0); // Set SCK to mode 0 idle state after CS goes inactive - } - #else - u8g_SetPILevel(u8g, U8G_PI_CS, !arg_val); - #endif - break; - - case U8G_COM_MSG_WRITE_BYTE: - u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: { - uint8_t *ptr = (uint8_t *)arg_ptr; - while (arg_val > 0) { - u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], *ptr++); - arg_val--; - } - } - break; - - case U8G_COM_MSG_WRITE_SEQ_P: { - uint8_t *ptr = (uint8_t *)arg_ptr; - while (arg_val > 0) { - u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], u8g_pgm_read(ptr)); - ptr++; - arg_val--; - } - } - break; - - case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ - u8g_SetPILevel(u8g, U8G_PI_A0, arg_val); - break; - } - return 1; -} - -#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920 -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/upload_extra_script.py b/Marlin/src/HAL/LPC1768/upload_extra_script.py deleted file mode 100755 index 9b0d0617a0..0000000000 --- a/Marlin/src/HAL/LPC1768/upload_extra_script.py +++ /dev/null @@ -1,145 +0,0 @@ -# -# sets output_port -# if target_filename is found then that drive is used -# else if target_drive is found then that drive is used -# -from __future__ import print_function - -target_filename = "FIRMWARE.CUR" -target_drive = "REARM" - -import os -import getpass -import platform - -current_OS = platform.system() -Import("env") - -def print_error(e): - print('\nUnable to find destination disk (%s)\n' \ - 'Please select it in platformio.ini using the upload_port keyword ' \ - '(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \ - 'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \ - %(e, env.get('PIOENV'))) - -try: - if current_OS == 'Windows': - # - # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:' - # Windows - doesn't care about the disk's name, only cares about the drive letter - # - - # - # get all drives on this computer - # - import subprocess - # typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' - driveStr = str(subprocess.check_output("fsutil fsinfo drives")) - # typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' - # driveStr = driveStr.strip().lstrip('Drives: ') <- Doesn't work in other Languages as English. In German is "Drives:" = "Laufwerke:" - FirstFound = driveStr.find(':',0,-1) # Find the first ":" and - driveStr = driveStr[FirstFound + 1 : -1] # truncate to the rest - # typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\', - # 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\'] - drives = driveStr.split() - - upload_disk = 'Disk not found' - target_file_found = False - target_drive_found = False - for drive in drives: - final_drive_name = drive.strip().rstrip('\\') # typical result (string): 'C:' - try: - volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT)) - except Exception as e: - continue - else: - if target_drive in volume_info and target_file_found == False: # set upload if not found target file yet - target_drive_found = True - upload_disk = final_drive_name - if target_filename in volume_info: - if target_file_found == False: - upload_disk = final_drive_name - target_file_found = True - - # - # set upload_port to drive if found - # - - if target_file_found == True or target_drive_found == True: - env.Replace( - UPLOAD_PORT=upload_disk - ) - print('upload disk: ', upload_disk) - else: - print_error('Autodetect Error') - - elif current_OS == 'Linux': - # - # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive' - # - upload_disk = 'Disk not found' - target_file_found = False - target_drive_found = False - drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser())) - if target_drive in drives: # If target drive is found, use it. - target_drive_found = True - upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep - else: - for drive in drives: - try: - files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive)) - except: - continue - else: - if target_filename in files: - upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep - target_file_found = True - break - # - # set upload_port to drive if found - # - - if target_file_found or target_drive_found: - env.Replace( - UPLOAD_FLAGS="-P$UPLOAD_PORT", - UPLOAD_PORT=upload_disk - ) - print('upload disk: ', upload_disk) - else: - print_error('Autodetect Error') - - elif current_OS == 'Darwin': # MAC - # - # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive' - # - upload_disk = 'Disk not found' - drives = os.listdir('/Volumes') # human readable names - target_file_found = False - target_drive_found = False - if target_drive in drives and target_file_found == False: # set upload if not found target file yet - target_drive_found = True - upload_disk = '/Volumes/' + target_drive + '/' - for drive in drives: - try: - filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected - except: - continue - else: - if target_filename in filenames: - if target_file_found == False: - upload_disk = '/Volumes/' + drive + '/' - target_file_found = True - # - # set upload_port to drive if found - # - - if target_file_found == True or target_drive_found == True: - env.Replace( - UPLOAD_PORT=upload_disk - ) - print('\nupload disk: ', upload_disk, '\n') - else: - print_error('Autodetect Error') - -except Exception as e: - print_error(str(e)) diff --git a/Marlin/src/HAL/LPC1768/usb_serial.cpp b/Marlin/src/HAL/LPC1768/usb_serial.cpp deleted file mode 100644 index d225ce4188..0000000000 --- a/Marlin/src/HAL/LPC1768/usb_serial.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(EMERGENCY_PARSER) - -#include "../../feature/e_parser.h" - -EmergencyParser::State emergency_state; - -bool CDC_RecvCallback(const char buffer) { - emergency_parser.update(emergency_state, buffer); - return true; -} - -#endif // EMERGENCY_PARSER -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/watchdog.cpp b/Marlin/src/HAL/LPC1768/watchdog.cpp deleted file mode 100644 index 3cd22d6651..0000000000 --- a/Marlin/src/HAL/LPC1768/watchdog.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - -#include -#include "watchdog.h" - -void watchdog_init() { - #if ENABLED(WATCHDOG_RESET_MANUAL) - // We enable the watchdog timer, but only for the interrupt. - - // Configure WDT to only trigger an interrupt - // Disable WDT interrupt (just in case, to avoid triggering it!) - NVIC_DisableIRQ(WDT_IRQn); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); - - // Configure WDT to only trigger an interrupt - // Initialize WDT with the given parameters - WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_INT_ONLY); - - // Configure and enable WDT interrupt. - NVIC_ClearPendingIRQ(WDT_IRQn); - NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups - NVIC_EnableIRQ(WDT_IRQn); - #else - WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET); - #endif - WDT_Start(WDT_TIMEOUT); -} - -void HAL_watchdog_refresh() { - WDT_Feed(); - #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) - TOGGLE(LED_PIN); // heartbeat indicator - #endif -} - -// Timeout state -bool watchdog_timed_out() { return TEST(WDT_ReadTimeOutFlag(), 0); } -void watchdog_clear_timeout_flag() { WDT_ClrTimeOutFlag(); } - -#endif // USE_WATCHDOG -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/watchdog.h b/Marlin/src/HAL/LPC1768/watchdog.h deleted file mode 100644 index cc170881f3..0000000000 --- a/Marlin/src/HAL/LPC1768/watchdog.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define WDT_TIMEOUT 4000000 // 4 second timeout - -void watchdog_init(); -void HAL_watchdog_refresh(); - -bool watchdog_timed_out(); -void watchdog_clear_timeout_flag(); diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp deleted file mode 100644 index 9f24d30071..0000000000 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ /dev/null @@ -1,473 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __SAMD51__ - -#include "../../inc/MarlinConfig.h" -#include -#include - -// ------------------------ -// Local defines -// ------------------------ - -#define GET_TEMP_0_ADC() TERN(HAS_TEMP_ADC_0, PIN_TO_ADC(TEMP_0_PIN), -1) -#define GET_TEMP_1_ADC() TERN(HAS_TEMP_ADC_1, PIN_TO_ADC(TEMP_1_PIN), -1) -#define GET_TEMP_2_ADC() TERN(HAS_TEMP_ADC_2, PIN_TO_ADC(TEMP_2_PIN), -1) -#define GET_TEMP_3_ADC() TERN(HAS_TEMP_ADC_3, PIN_TO_ADC(TEMP_3_PIN), -1) -#define GET_TEMP_4_ADC() TERN(HAS_TEMP_ADC_4, PIN_TO_ADC(TEMP_4_PIN), -1) -#define GET_TEMP_5_ADC() TERN(HAS_TEMP_ADC_5, PIN_TO_ADC(TEMP_5_PIN), -1) -#define GET_TEMP_6_ADC() TERN(HAS_TEMP_ADC_6, PIN_TO_ADC(TEMP_6_PIN), -1) -#define GET_TEMP_7_ADC() TERN(HAS_TEMP_ADC_7, PIN_TO_ADC(TEMP_7_PIN), -1) -#define GET_PROBE_ADC() TERN(HAS_TEMP_PROBE, PIN_TO_ADC(TEMP_PROBE_PIN), -1) -#define GET_BED_ADC() TERN(HAS_TEMP_ADC_BED, PIN_TO_ADC(TEMP_BED_PIN), -1) -#define GET_CHAMBER_ADC() TERN(HAS_TEMP_ADC_CHAMBER, PIN_TO_ADC(TEMP_CHAMBER_PIN), -1) -#define GET_FILAMENT_WIDTH_ADC() TERN(FILAMENT_WIDTH_SENSOR, PIN_TO_ADC(FILWIDTH_PIN), -1) -#define GET_BUTTONS_ADC() TERN(HAS_ADC_BUTTONS, PIN_TO_ADC(ADC_KEYPAD_PIN), -1) - -#define IS_ADC_REQUIRED(n) ( \ - GET_TEMP_0_ADC() == n || GET_TEMP_1_ADC() == n || GET_TEMP_2_ADC() == n || GET_TEMP_3_ADC() == n \ - || GET_TEMP_4_ADC() == n || GET_TEMP_5_ADC() == n || GET_TEMP_6_ADC() == n || GET_TEMP_7_ADC() == n \ - || GET_PROBE_ADC() == n \ - || GET_BED_ADC() == n \ - || GET_CHAMBER_ADC() == n \ - || GET_FILAMENT_WIDTH_ADC() == n \ - || GET_BUTTONS_ADC() == n \ -) - -#if IS_ADC_REQUIRED(0) - #define ADC0_IS_REQUIRED 1 - #define FIRST_ADC 0 -#else - #define FIRST_ADC 1 -#endif -#if IS_ADC_REQUIRED(1) - #define ADC1_IS_REQUIRED 1 - #define LAST_ADC 1 -#else - #define LAST_ADC 0 -#endif -#if ADC0_IS_REQUIRED || ADC1_IS_REQUIRED - #define ADC_IS_REQUIRED 1 - #define DMA_IS_REQUIRED 1 -#endif - -// ------------------------ -// Types -// ------------------------ - -#if DMA_IS_REQUIRED - - // Struct must be 32 bits aligned because of DMA accesses but fields needs to be 8 bits packed - typedef struct __attribute__((aligned(4), packed)) { - ADC_INPUTCTRL_Type INPUTCTRL; - } HAL_DMA_DAC_Registers; // DMA transfered registers - -#endif - -// ------------------------ -// Private Variables -// ------------------------ - -uint16_t HAL_adc_result; - -#if ADC_IS_REQUIRED - - // Pins used by ADC inputs. Order must be ADC0 inputs first then ADC1 - const uint8_t adc_pins[] = { - // ADC0 pins - #if GET_TEMP_0_ADC() == 0 - TEMP_0_PIN, - #endif - #if GET_TEMP_1_ADC() == 0 - TEMP_1_PIN, - #endif - #if GET_TEMP_2_ADC() == 0 - TEMP_2_PIN, - #endif - #if GET_TEMP_3_ADC() == 0 - TEMP_3_PIN, - #endif - #if GET_TEMP_4_ADC() == 0 - TEMP_4_PIN, - #endif - #if GET_TEMP_5_ADC() == 0 - TEMP_5_PIN, - #endif - #if GET_TEMP_6_ADC() == 0 - TEMP_6_PIN, - #endif - #if GET_TEMP_7_ADC() == 0 - TEMP_7_PIN, - #endif - #if GET_PROBE_ADC() == 0 - TEMP_PROBE_PIN, - #endif - #if GET_BED_ADC() == 0 - TEMP_BED_PIN, - #endif - #if GET_CHAMBER_ADC() == 0 - TEMP_CHAMBER_PIN, - #endif - #if GET_FILAMENT_WIDTH_ADC() == 0 - FILWIDTH_PIN, - #endif - #if GET_BUTTONS_ADC() == 0 - ADC_KEYPAD_PIN, - #endif - // ADC1 pins - #if GET_TEMP_0_ADC() == 1 - TEMP_0_PIN, - #endif - #if GET_TEMP_1_ADC() == 1 - TEMP_1_PIN, - #endif - #if GET_TEMP_2_ADC() == 1 - TEMP_2_PIN, - #endif - #if GET_TEMP_3_ADC() == 1 - TEMP_3_PIN, - #endif - #if GET_TEMP_4_ADC() == 1 - TEMP_4_PIN, - #endif - #if GET_TEMP_5_ADC() == 1 - TEMP_5_PIN, - #endif - #if GET_TEMP_6_ADC() == 1 - TEMP_6_PIN, - #endif - #if GET_TEMP_7_ADC() == 1 - TEMP_7_PIN, - #endif - #if GET_PROBE_ADC() == 1 - TEMP_PROBE_PIN, - #endif - #if GET_BED_ADC() == 1 - TEMP_BED_PIN, - #endif - #if GET_CHAMBER_ADC() == 1 - TEMP_CHAMBER_PIN, - #endif - #if GET_FILAMENT_WIDTH_ADC() == 1 - FILWIDTH_PIN, - #endif - #if GET_BUTTONS_ADC() == 1 - ADC_KEYPAD_PIN, - #endif - }; - - uint16_t HAL_adc_results[COUNT(adc_pins)]; - - #if ADC0_IS_REQUIRED - Adafruit_ZeroDMA adc0DMAProgram, - adc0DMARead; - - const HAL_DMA_DAC_Registers adc0_dma_regs_list[] = { - #if GET_TEMP_0_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_0_PIN) }, - #endif - #if GET_TEMP_1_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_1_PIN) }, - #endif - #if GET_TEMP_2_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_2_PIN) }, - #endif - #if GET_TEMP_3_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_3_PIN) }, - #endif - #if GET_TEMP_4_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_4_PIN) }, - #endif - #if GET_TEMP_5_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_5_PIN) }, - #endif - #if GET_TEMP_6_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_6_PIN) }, - #endif - #if GET_TEMP_7_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_7_PIN) }, - #endif - #if GET_PROBE_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_PROBE_PIN) }, - #endif - #if GET_BED_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_BED_PIN) }, - #endif - #if GET_CHAMBER_ADC() == 0 - { PIN_TO_INPUTCTRL(TEMP_CHAMBER_PIN) }, - #endif - #if GET_FILAMENT_WIDTH_ADC() == 0 - { PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, - #endif - #if GET_BUTTONS_ADC() == 0 - { PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) }, - #endif - }; - - #define ADC0_AINCOUNT COUNT(adc0_dma_regs_list) - #endif // ADC0_IS_REQUIRED - - #if ADC1_IS_REQUIRED - Adafruit_ZeroDMA adc1DMAProgram, - adc1DMARead; - - const HAL_DMA_DAC_Registers adc1_dma_regs_list[] = { - #if GET_TEMP_0_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_0_PIN) }, - #endif - #if GET_TEMP_1_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_1_PIN) }, - #endif - #if GET_TEMP_2_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_2_PIN) }, - #endif - #if GET_TEMP_3_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_3_PIN) }, - #endif - #if GET_TEMP_4_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_4_PIN) }, - #endif - #if GET_TEMP_5_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_5_PIN) }, - #endif - #if GET_TEMP_6_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_6_PIN) }, - #endif - #if GET_TEMP_7_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_7_PIN) }, - #endif - #if GET_PROBE_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_PROBE_PIN) }, - #endif - #if GET_BED_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_BED_PIN) }, - #endif - #if GET_CHAMBER_ADC() == 1 - { PIN_TO_INPUTCTRL(TEMP_CHAMBER_PIN) }, - #endif - #if GET_FILAMENT_WIDTH_ADC() == 1 - { PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, - #endif - #if GET_BUTTONS_ADC() == 1 - { PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) }, - #endif - }; - - #define ADC1_AINCOUNT COUNT(adc1_dma_regs_list) - #endif // ADC1_IS_REQUIRED - -#endif // ADC_IS_REQUIRED - -// ------------------------ -// Private functions -// ------------------------ - -#if DMA_IS_REQUIRED - - void dma_init() { - DmacDescriptor *descriptor; - - #if ADC0_IS_REQUIRED - adc0DMAProgram.setTrigger(ADC0_DMAC_ID_SEQ); - adc0DMAProgram.setAction(DMA_TRIGGER_ACTON_BEAT); - adc0DMAProgram.loop(true); - if (adc0DMAProgram.allocate() == DMA_STATUS_OK) { - descriptor = adc0DMAProgram.addDescriptor( - (void *)adc0_dma_regs_list, // SRC - (void *)&ADC0->DSEQDATA.reg, // DEST - sizeof(adc0_dma_regs_list) / 4, // CNT - DMA_BEAT_SIZE_WORD, - true, // SRCINC - false, // DSTINC - DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE - DMA_STEPSEL_SRC // STEPSEL - ); - if (descriptor != nullptr) - descriptor->BTCTRL.bit.EVOSEL = DMA_EVENT_OUTPUT_BEAT; - adc0DMAProgram.startJob(); - } - - adc0DMARead.setTrigger(ADC0_DMAC_ID_RESRDY); - adc0DMARead.setAction(DMA_TRIGGER_ACTON_BEAT); - adc0DMARead.loop(true); - if (adc0DMARead.allocate() == DMA_STATUS_OK) { - adc0DMARead.addDescriptor( - (void *)&ADC0->RESULT.reg, // SRC - &HAL_adc_results, // DEST - ADC0_AINCOUNT, // CNT - DMA_BEAT_SIZE_HWORD, - false, // SRCINC - true, // DSTINC - DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE - DMA_STEPSEL_DST // STEPSEL - ); - adc0DMARead.startJob(); - } - #endif - #if ADC1_IS_REQUIRED - adc1DMAProgram.setTrigger(ADC1_DMAC_ID_SEQ); - adc1DMAProgram.setAction(DMA_TRIGGER_ACTON_BEAT); - adc1DMAProgram.loop(true); - if (adc1DMAProgram.allocate() == DMA_STATUS_OK) { - descriptor = adc1DMAProgram.addDescriptor( - (void *)adc1_dma_regs_list, // SRC - (void *)&ADC1->DSEQDATA.reg, // DEST - sizeof(adc1_dma_regs_list) / 4, // CNT - DMA_BEAT_SIZE_WORD, - true, // SRCINC - false, // DSTINC - DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE - DMA_STEPSEL_SRC // STEPSEL - ); - if (descriptor != nullptr) - descriptor->BTCTRL.bit.EVOSEL = DMA_EVENT_OUTPUT_BEAT; - adc1DMAProgram.startJob(); - } - - adc1DMARead.setTrigger(ADC1_DMAC_ID_RESRDY); - adc1DMARead.setAction(DMA_TRIGGER_ACTON_BEAT); - adc1DMARead.loop(true); - if (adc1DMARead.allocate() == DMA_STATUS_OK) { - adc1DMARead.addDescriptor( - (void *)&ADC1->RESULT.reg, // SRC - &HAL_adc_results[ADC0_AINCOUNT], // DEST - ADC1_AINCOUNT, // CNT - DMA_BEAT_SIZE_HWORD, - false, // SRCINC - true, // DSTINC - DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE - DMA_STEPSEL_DST // STEPSEL - ); - adc1DMARead.startJob(); - } - #endif - - DMAC->PRICTRL0.bit.RRLVLEN0 = true; // Activate round robin for DMA channels required by ADCs - } - -#endif // DMA_IS_REQUIRED - -// ------------------------ -// Public functions -// ------------------------ - -// HAL initialization task -void HAL_init() { - TERN_(DMA_IS_REQUIRED, dma_init()); - #if ENABLED(SDSUPPORT) - #if SD_CONNECTION_IS(ONBOARD) && PIN_EXISTS(SD_DETECT) - SET_INPUT_PULLUP(SD_DETECT_PIN); - #endif - OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up - #endif -} - -// HAL idle task -/* -void HAL_idletask() { -} -*/ - -void HAL_clear_reset_source() { } - -#pragma push_macro("WDT") -#undef WDT // Required to be able to use '.bit.WDT'. Compiler wrongly replace struct field with WDT define -uint8_t HAL_get_reset_source() { - RSTC_RCAUSE_Type resetCause; - - resetCause.reg = REG_RSTC_RCAUSE; - if (resetCause.bit.POR) return RST_POWER_ON; - else if (resetCause.bit.EXT) return RST_EXTERNAL; - else if (resetCause.bit.BODCORE || resetCause.bit.BODVDD) return RST_BROWN_OUT; - else if (resetCause.bit.WDT) return RST_WATCHDOG; - else if (resetCause.bit.SYST || resetCause.bit.NVM) return RST_SOFTWARE; - else if (resetCause.bit.BACKUP) return RST_BACKUP; - return 0; -} -#pragma pop_macro("WDT") - -extern "C" { - void * _sbrk(int incr); - - extern unsigned int __bss_end__; // end of bss section -} - -// Return free memory between end of heap (or end bss) and whatever is current -int freeMemory() { - int free_memory, heap_end = (int)_sbrk(0); - return (int)&free_memory - (heap_end ?: (int)&__bss_end__); -} - -// ------------------------ -// ADC -// ------------------------ - -void HAL_adc_init() { - #if ADC_IS_REQUIRED - memset(HAL_adc_results, 0xFF, sizeof(HAL_adc_results)); // Fill result with invalid values - - LOOP_L_N(pi, COUNT(adc_pins)) - pinPeripheral(adc_pins[pi], PIO_ANALOG); - - LOOP_S_LE_N(ai, FIRST_ADC, LAST_ADC) { - Adc* adc = ((Adc*[])ADC_INSTS)[ai]; - - // ADC clock setup - GCLK->PCHCTRL[ADC0_GCLK_ID + ai].bit.CHEN = false; - SYNC(GCLK->PCHCTRL[ADC0_GCLK_ID + ai].bit.CHEN); - GCLK->PCHCTRL[ADC0_GCLK_ID + ai].reg = GCLK_PCHCTRL_GEN_GCLK1 | GCLK_PCHCTRL_CHEN; // 48MHz startup code programmed - SYNC(!GCLK->PCHCTRL[ADC0_GCLK_ID + ai].bit.CHEN); - adc->CTRLA.bit.PRESCALER = ADC_CTRLA_PRESCALER_DIV32_Val; // 1.5MHZ adc clock - - // ADC setup - // Preloaded data (fixed for all ADC instances hence not loaded by DMA) - adc->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_AREFA_Val; // VRefA pin - SYNC(adc->SYNCBUSY.bit.REFCTRL); - adc->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_10BIT_Val; // ... ADC_CTRLB_RESSEL_16BIT_Val - SYNC(adc->SYNCBUSY.bit.CTRLB); - adc->SAMPCTRL.bit.SAMPLEN = (6 - 1); // Sampling clocks - //adc->AVGCTRL.reg = ADC_AVGCTRL_SAMPLENUM_16 | ADC_AVGCTRL_ADJRES(4); // 16 Accumulated conversions and shift 4 to get oversampled 12 bits result - //SYNC(adc->SYNCBUSY.bit.AVGCTRL); - - // Registers loaded by DMA - adc->DSEQCTRL.bit.INPUTCTRL = true; - adc->DSEQCTRL.bit.AUTOSTART = true; // Start conversion after DMA sequence - - adc->CTRLA.bit.ENABLE = true; // Enable ADC - SYNC(adc->SYNCBUSY.bit.ENABLE); - } - #endif // ADC_IS_REQUIRED -} - -void HAL_adc_start_conversion(const uint8_t adc_pin) { - #if ADC_IS_REQUIRED - LOOP_L_N(pi, COUNT(adc_pins)) { - if (adc_pin == adc_pins[pi]) { - HAL_adc_result = HAL_adc_results[pi]; - return; - } - } - #endif - - HAL_adc_result = 0xFFFF; -} - -#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h deleted file mode 100644 index 7cb3635bd7..0000000000 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define CPU_32_BIT - -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" -#include "fastio.h" -#include "watchdog.h" - -#ifdef ADAFRUIT_GRAND_CENTRAL_M4 - #include "MarlinSerial_AGCM4.h" - - // Serial ports - - // MYSERIAL0 required before MarlinSerial includes! - - #define __MSERIAL(X) Serial##X - #define _MSERIAL(X) __MSERIAL(X) - #define MSERIAL(X) _MSERIAL(INCREMENT(X)) - - #if SERIAL_PORT == -1 - #define MYSERIAL0 Serial - #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) - #else - #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." - #endif - - #ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 Serial - #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) - #else - #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." - #endif - #endif - - #ifdef LCD_SERIAL_PORT - #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL Serial - #elif WITHIN(LCD_SERIAL_PORT, 0, 3) - #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) - #else - #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." - #endif - #endif - -#endif // ADAFRUIT_GRAND_CENTRAL_M4 - -typedef int8_t pin_t; - -#define SHARED_SERVOS HAS_SERVOS -#define HAL_SERVO_LIB Servo - -// -// Interrupts -// -#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() -#define CRITICAL_SECTION_END() if (!primask) __enable_irq() -#define ISRS_ENABLED() (!__get_PRIMASK()) -#define ENABLE_ISRS() __enable_irq() -#define DISABLE_ISRS() __disable_irq() - -#define cli() __disable_irq() // Disable interrupts -#define sei() __enable_irq() // Enable interrupts - -void HAL_clear_reset_source(); // clear reset reason -uint8_t HAL_get_reset_source(); // get reset reason - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -// -// ADC -// -extern uint16_t HAL_adc_result; // Most recent ADC conversion - -#define HAL_ANALOG_SELECT(pin) - -void HAL_adc_init(); - -//#define HAL_ADC_FILTERED // Disable Marlin's oversampling. The HAL filters ADC values. -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 // ... 12 -#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) -#define HAL_READ_ADC() HAL_adc_result -#define HAL_ADC_READY() true - -void HAL_adc_start_conversion(const uint8_t adc_pin); - -// -// Pin Map -// -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -// -// Tone -// -void toneInit(); -void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0); -void noTone(const pin_t _pin); - -// Enable hooks into idle and setup for HAL -void HAL_init(); -/* -#define HAL_IDLETASK 1 -void HAL_idletask(); -*/ - -// -// Utility functions -// -FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -int freeMemory(); -#pragma GCC diagnostic pop - -#ifdef __cplusplus - extern "C" { -#endif -char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s); -#ifdef __cplusplus - } -#endif diff --git a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp deleted file mode 100644 index c3acd38237..0000000000 --- a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Hardware and software SPI implementations are included in this file. - * - * Control of the slave select pin(s) is handled by the calling routines and - * SAMD51 let hardware SPI handling to remove SS from its logic. - */ - -#ifdef __SAMD51__ - -// -------------------------------------------------------------------------- -// Includes -// -------------------------------------------------------------------------- - -#include "../../inc/MarlinConfig.h" -#include - -// -------------------------------------------------------------------------- -// Public functions -// -------------------------------------------------------------------------- - -#if EITHER(SOFTWARE_SPI, FORCE_SOFT_SPI) - - // ------------------------ - // Software SPI - // ------------------------ - #error "Software SPI not supported for SAMD51. Use Hardware SPI." - -#else // !SOFTWARE_SPI - - #ifdef ADAFRUIT_GRAND_CENTRAL_M4 - #if SD_CONNECTION_IS(ONBOARD) - #define sdSPI SDCARD_SPI - #else - #define sdSPI SPI - #endif - #endif - - static SPISettings spiConfig; - - // ------------------------ - // Hardware SPI - // ------------------------ - void spiBegin() { - spiInit(SPI_HALF_SPEED); - } - - void spiInit(uint8_t spiRate) { - // Use datarates Marlin uses - uint32_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = 8000000; break; - case SPI_HALF_SPEED: clock = 4000000; break; - case SPI_QUARTER_SPEED: clock = 2000000; break; - case SPI_EIGHTH_SPEED: clock = 1000000; break; - case SPI_SIXTEENTH_SPEED: clock = 500000; break; - case SPI_SPEED_5: clock = 250000; break; - case SPI_SPEED_6: clock = 125000; break; - default: clock = 4000000; break; // Default from the SPI library - } - spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); - sdSPI.begin(); - } - - /** - * @brief Receives a single byte from the SPI port. - * - * @return Byte received - * - * @details - */ - uint8_t spiRec() { - sdSPI.beginTransaction(spiConfig); - uint8_t returnByte = sdSPI.transfer(0xFF); - sdSPI.endTransaction(); - return returnByte; - } - - /** - * @brief Receives a number of bytes from the SPI port to a buffer - * - * @param buf Pointer to starting address of buffer to write to. - * @param nbyte Number of bytes to receive. - * @return Nothing - */ - void spiRead(uint8_t* buf, uint16_t nbyte) { - if (nbyte == 0) return; - memset(buf, 0xFF, nbyte); - sdSPI.beginTransaction(spiConfig); - sdSPI.transfer(buf, nbyte); - sdSPI.endTransaction(); - } - - /** - * @brief Sends a single byte on SPI port - * - * @param b Byte to send - * - * @details - */ - void spiSend(uint8_t b) { - sdSPI.beginTransaction(spiConfig); - sdSPI.transfer(b); - sdSPI.endTransaction(); - } - - /** - * @brief Write token and then write from 512 byte buffer to SPI (for SD card) - * - * @param buf Pointer with buffer start address - * @return Nothing - * - * @details Uses DMA - */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { - sdSPI.beginTransaction(spiConfig); - sdSPI.transfer(token); - sdSPI.transfer((uint8_t*)buf, nullptr, 512); - sdSPI.endTransaction(); - } - - void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - spiConfig = SPISettings(spiClock, (BitOrder)bitOrder, dataMode); - sdSPI.beginTransaction(spiConfig); - } -#endif // !SOFTWARE_SPI - -#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp deleted file mode 100644 index abc5f3acbf..0000000000 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ADAFRUIT_GRAND_CENTRAL_M4 - -/** - * Framework doesn't define some serial to save sercom resources - * hence if these are used I need to define them - */ - -#include "../../inc/MarlinConfig.h" - -#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 - Uart Serial2(&sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX); - void SERCOM4_0_Handler() { Serial2.IrqHandler(); } - void SERCOM4_1_Handler() { Serial2.IrqHandler(); } - void SERCOM4_2_Handler() { Serial2.IrqHandler(); } - void SERCOM4_3_Handler() { Serial2.IrqHandler(); } -#endif - -#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 - Uart Serial3(&sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX); - void SERCOM1_0_Handler() { Serial3.IrqHandler(); } - void SERCOM1_1_Handler() { Serial3.IrqHandler(); } - void SERCOM1_2_Handler() { Serial3.IrqHandler(); } - void SERCOM1_3_Handler() { Serial3.IrqHandler(); } -#endif - -#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 - Uart Serial4(&sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX); - void SERCOM5_0_Handler() { Serial4.IrqHandler(); } - void SERCOM5_1_Handler() { Serial4.IrqHandler(); } - void SERCOM5_2_Handler() { Serial4.IrqHandler(); } - void SERCOM5_3_Handler() { Serial4.IrqHandler(); } -#endif - -#endif // ADAFRUIT_GRAND_CENTRAL_M4 diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h deleted file mode 100644 index f3821d8d5a..0000000000 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -extern Uart Serial2; -extern Uart Serial3; -extern Uart Serial4; diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.cpp b/Marlin/src/HAL/SAMD51/QSPIFlash.cpp deleted file mode 100644 index 307eb3fd45..0000000000 --- a/Marlin/src/HAL/SAMD51/QSPIFlash.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(QSPI_EEPROM) - -#include "QSPIFlash.h" - -#define INVALID_ADDR 0xFFFFFFFF -#define SECTOR_OF(a) (a & ~(SFLASH_SECTOR_SIZE - 1)) -#define OFFSET_OF(a) (a & (SFLASH_SECTOR_SIZE - 1)) - -Adafruit_SPIFlashBase * QSPIFlash::_flashBase = nullptr; -uint8_t QSPIFlash::_buf[SFLASH_SECTOR_SIZE]; -uint32_t QSPIFlash::_addr = INVALID_ADDR; - -void QSPIFlash::begin() { - if (_flashBase != nullptr) return; - - _flashBase = new Adafruit_SPIFlashBase(new Adafruit_FlashTransport_QSPI()); - _flashBase->begin(NULL); -} - -size_t QSPIFlash::size() { - return _flashBase->size(); -} - -uint8_t QSPIFlash::readByte(const uint32_t address) { - if (SECTOR_OF(address) == _addr) return _buf[OFFSET_OF(address)]; - - return _flashBase->read8(address); -} - -void QSPIFlash::writeByte(const uint32_t address, const uint8_t value) { - uint32_t const sector_addr = SECTOR_OF(address); - - // Page changes, flush old and update new cache - if (sector_addr != _addr) { - flush(); - _addr = sector_addr; - - // read a whole page from flash - _flashBase->readBuffer(sector_addr, _buf, SFLASH_SECTOR_SIZE); - } - - _buf[OFFSET_OF(address)] = value; -} - -void QSPIFlash::flush() { - if (_addr == INVALID_ADDR) return; - - _flashBase->eraseSector(_addr / SFLASH_SECTOR_SIZE); - _flashBase->writeBuffer(_addr, _buf, SFLASH_SECTOR_SIZE); - - _addr = INVALID_ADDR; -} - -#endif // QSPI_EEPROM diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.h b/Marlin/src/HAL/SAMD51/QSPIFlash.h deleted file mode 100644 index db4abec91c..0000000000 --- a/Marlin/src/HAL/SAMD51/QSPIFlash.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @file QSPIFlash.h - * - * The MIT License (MIT) - * - * Copyright (c) 2019 Ha Thach and Dean Miller for Adafruit Industries LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Derived from Adafruit_SPIFlash class with no SdFat references - */ - -#pragma once - -#include - -// This class extends Adafruit_SPIFlashBase by adding caching support. -// -// This class will use 4096 Bytes of RAM as a block cache. -class QSPIFlash { - public: - static void begin(); - static size_t size(); - static uint8_t readByte(const uint32_t address); - static void writeByte(const uint32_t address, const uint8_t v); - static void flush(); - - private: - static Adafruit_SPIFlashBase * _flashBase; - static uint8_t _buf[SFLASH_SECTOR_SIZE]; - static uint32_t _addr; -}; - -extern QSPIFlash qspi; diff --git a/Marlin/src/HAL/SAMD51/SAMD51.h b/Marlin/src/HAL/SAMD51/SAMD51.h deleted file mode 100644 index 783956140d..0000000000 --- a/Marlin/src/HAL/SAMD51/SAMD51.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define SYNC(sc) while (sc) { \ - asm(""); \ - } - -// Get SAMD port/pin from specified arduino pin -#define GET_SAMD_PORT(P) _GET_SAMD_PORT(PIN_TO_SAMD_PIN(P)) -#define GET_SAMD_PIN(P) _GET_SAMD_PIN(PIN_TO_SAMD_PIN(P)) - -// Get external interrupt line associated to specified arduino pin -#define PIN_TO_EILINE(P) _SAMDPORTPIN_TO_EILINE(GET_SAMD_PORT(P), GET_SAMD_PIN(P)) - -// Get adc/ain associated to specified arduino pin -#define PIN_TO_ADC(P) (ANAPIN_TO_ADCAIN(P) >> 8) -#define PIN_TO_AIN(P) (ANAPIN_TO_ADCAIN(P) & 0xFF) - -// Private defines -#define PIN_TO_SAMD_PIN(P) DIO##P##_PIN - -#define _GET_SAMD_PORT(P) ((P) >> 5) -#define _GET_SAMD_PIN(P) ((P) & 0x1F) - -// Get external interrupt line -#define _SAMDPORTPIN_TO_EILINE(P,B) ((P == 0 && WITHIN(B, 0, 31) && B != 8 && B != 26 && B != 28 && B != 29) ? (B) & 0xF \ - : (P == 1 && (WITHIN(B, 0, 25) || WITHIN(B, 30, 31))) ? (B) & 0xF \ - : (P == 1 && WITHIN(B, 26, 29)) ? 12 + (B) - 26 \ - : (P == 2 && (WITHIN(B, 0, 6) || WITHIN(B, 10, 31)) && B != 29) ? (B) & 0xF \ - : (P == 2 && B == 7) ? 9 \ - : (P == 3 && WITHIN(B, 0, 1)) ? (B) \ - : (P == 3 && WITHIN(B, 8, 12)) ? 3 + (B) - 8 \ - : (P == 3 && WITHIN(B, 20, 21)) ? 10 + (B) - 20 \ - : -1) - -// Get adc/ain -#define ANAPIN_TO_ADCAIN(P) _PIN_TO_ADCAIN(ANAPIN_TO_SAMDPIN(P)) -#define _PIN_TO_ADCAIN(P) _SAMDPORTPIN_TO_ADCAIN(_GET_SAMD_PORT(P), _GET_SAMD_PIN(P)) - -#define _SAMDPORTPIN_TO_ADCAIN(P,B) ((P == 0 && WITHIN(B, 2, 3)) ? 0x000 + (B) - 2 \ - : (P == 0 && WITHIN(B, 4, 7)) ? 0x000 + (B) \ - : (P == 0 && WITHIN(B, 8, 9)) ? 0x100 + 2 + (B) - 8 \ - : (P == 0 && WITHIN(B, 10, 11)) ? 0x000 + (B) \ - : (P == 1 && WITHIN(B, 0, 3)) ? 0x000 + 12 + (B) \ - : (P == 1 && WITHIN(B, 4, 7)) ? 0x100 + 6 + (B) - 4 \ - : (P == 1 && WITHIN(B, 8, 9)) ? 0x100 + (B) - 8 \ - : (P == 2 && WITHIN(B, 0, 1)) ? 0x100 + 10 + (B) \ - : (P == 2 && WITHIN(B, 2, 3)) ? 0x100 + 4 + (B) - 2 \ - : (P == 2 && WITHIN(B, 30, 31)) ? 0x100 + 12 + (B) - 30 \ - : (P == 3 && WITHIN(B, 0, 1)) ? 0x100 + 14 + (B) \ - : -1) diff --git a/Marlin/src/HAL/SAMD51/Servo.cpp b/Marlin/src/HAL/SAMD51/Servo.cpp deleted file mode 100644 index 9bab8e89be..0000000000 --- a/Marlin/src/HAL/SAMD51/Servo.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * This comes from Arduino library which at the moment is buggy and uncompilable - */ - -#ifdef __SAMD51__ - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include "../shared/servo.h" -#include "../shared/servo_private.h" -#include "SAMD51.h" - -#define __TC_GCLK_ID(t) TC##t##_GCLK_ID -#define _TC_GCLK_ID(t) __TC_GCLK_ID(t) -#define TC_GCLK_ID _TC_GCLK_ID(SERVO_TC) - -#define _TC_PRESCALER(d) TC_CTRLA_PRESCALER_DIV##d##_Val -#define TC_PRESCALER(d) _TC_PRESCALER(d) - -#define __SERVO_IRQn(t) TC##t##_IRQn -#define _SERVO_IRQn(t) __SERVO_IRQn(t) -#define SERVO_IRQn _SERVO_IRQn(SERVO_TC) - -#define HAL_SERVO_TIMER_ISR() TC_HANDLER(SERVO_TC) - -#define TIMER_TCCHANNEL(t) ((t) & 1) -#define TC_COUNTER_START_VAL 0xFFFF - - -static volatile int8_t currentServoIndex[_Nbr_16timers]; // index for the servo being pulsed for each timer (or -1 if refresh interval) - -FORCE_INLINE static uint16_t getTimerCount() { - Tc * const tc = TimerConfig[SERVO_TC].pTc; - - tc->COUNT16.CTRLBSET.reg = TC_CTRLBCLR_CMD_READSYNC; - SYNC(tc->COUNT16.SYNCBUSY.bit.CTRLB || tc->COUNT16.SYNCBUSY.bit.COUNT); - - return tc->COUNT16.COUNT.reg; -} - -// ---------------------------- -// Interrupt handler for the TC -// ---------------------------- -HAL_SERVO_TIMER_ISR() { - Tc * const tc = TimerConfig[SERVO_TC].pTc; - const timer16_Sequence_t timer = - #ifndef _useTimer1 - _timer2 - #elif !defined(_useTimer2) - _timer1 - #else - (tc->COUNT16.INTFLAG.reg & tc->COUNT16.INTENSET.reg & TC_INTFLAG_MC0) ? _timer1 : _timer2 - #endif - ; - const uint8_t tcChannel = TIMER_TCCHANNEL(timer); - - if (currentServoIndex[timer] < 0) { - #if defined(_useTimer1) && defined(_useTimer2) - if (currentServoIndex[timer ^ 1] >= 0) { - // Wait for both channels - // Clear the interrupt - tc->COUNT16.INTFLAG.reg = (tcChannel == 0) ? TC_INTFLAG_MC0 : TC_INTFLAG_MC1; - return; - } - #endif - tc->COUNT16.COUNT.reg = TC_COUNTER_START_VAL; - SYNC(tc->COUNT16.SYNCBUSY.bit.COUNT); - } - else if (SERVO_INDEX(timer, currentServoIndex[timer]) < ServoCount && SERVO(timer, currentServoIndex[timer]).Pin.isActive) - digitalWrite(SERVO(timer, currentServoIndex[timer]).Pin.nbr, LOW); // pulse this channel low if activated - - // Select the next servo controlled by this timer - currentServoIndex[timer]++; - - if (SERVO_INDEX(timer, currentServoIndex[timer]) < ServoCount && currentServoIndex[timer] < SERVOS_PER_TIMER) { - if (SERVO(timer, currentServoIndex[timer]).Pin.isActive) // check if activated - digitalWrite(SERVO(timer, currentServoIndex[timer]).Pin.nbr, HIGH); // it's an active channel so pulse it high - - tc->COUNT16.CC[tcChannel].reg = getTimerCount() - (uint16_t)SERVO(timer, currentServoIndex[timer]).ticks; - } - else { - // finished all channels so wait for the refresh period to expire before starting over - currentServoIndex[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel - - const uint16_t tcCounterValue = getTimerCount(); - - if ((TC_COUNTER_START_VAL - tcCounterValue) + 4UL < usToTicks(REFRESH_INTERVAL)) // allow a few ticks to ensure the next OCR1A not missed - tc->COUNT16.CC[tcChannel].reg = TC_COUNTER_START_VAL - (uint16_t)usToTicks(REFRESH_INTERVAL); - else - tc->COUNT16.CC[tcChannel].reg = (uint16_t)(tcCounterValue - 4UL); // at least REFRESH_INTERVAL has elapsed - } - if (tcChannel == 0) { - SYNC(tc->COUNT16.SYNCBUSY.bit.CC0); - // Clear the interrupt - tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC0; - } - else { - SYNC(tc->COUNT16.SYNCBUSY.bit.CC1); - // Clear the interrupt - tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC1; - } -} - -void initISR(timer16_Sequence_t timer) { - Tc * const tc = TimerConfig[SERVO_TC].pTc; - const uint8_t tcChannel = TIMER_TCCHANNEL(timer); - - static bool initialized = false; // Servo TC has been initialized - if (!initialized) { - NVIC_DisableIRQ(SERVO_IRQn); - - // Disable the timer - tc->COUNT16.CTRLA.bit.ENABLE = false; - SYNC(tc->COUNT16.SYNCBUSY.bit.ENABLE); - - // Select GCLK0 as timer/counter input clock source - GCLK->PCHCTRL[TC_GCLK_ID].bit.CHEN = false; - SYNC(GCLK->PCHCTRL[TC_GCLK_ID].bit.CHEN); - GCLK->PCHCTRL[TC_GCLK_ID].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN; // 120MHz startup code programmed - SYNC(!GCLK->PCHCTRL[TC_GCLK_ID].bit.CHEN); - - // Reset the timer - tc->COUNT16.CTRLA.bit.SWRST = true; - SYNC(tc->COUNT16.SYNCBUSY.bit.SWRST); - SYNC(tc->COUNT16.CTRLA.bit.SWRST); - - // Set timer counter mode to 16 bits - tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16; - - // Set timer counter mode as normal PWM - tc->COUNT16.WAVE.bit.WAVEGEN = TCC_WAVE_WAVEGEN_NPWM_Val; - - // Set the prescaler factor - tc->COUNT16.CTRLA.bit.PRESCALER = TC_PRESCALER(SERVO_TIMER_PRESCALER); - - // Count down - tc->COUNT16.CTRLBSET.reg = TC_CTRLBCLR_DIR; - SYNC(tc->COUNT16.SYNCBUSY.bit.CTRLB); - - // Reset all servo indexes - memset((void *)currentServoIndex, 0xFF, sizeof(currentServoIndex)); - - // Configure interrupt request - NVIC_ClearPendingIRQ(SERVO_IRQn); - NVIC_SetPriority(SERVO_IRQn, 5); - NVIC_EnableIRQ(SERVO_IRQn); - - initialized = true; - } - - if (!tc->COUNT16.CTRLA.bit.ENABLE) { - // Reset the timer counter - tc->COUNT16.COUNT.reg = TC_COUNTER_START_VAL; - SYNC(tc->COUNT16.SYNCBUSY.bit.COUNT); - - // Enable the timer and start it - tc->COUNT16.CTRLA.bit.ENABLE = true; - SYNC(tc->COUNT16.SYNCBUSY.bit.ENABLE); - } - // First interrupt request after 1 ms - tc->COUNT16.CC[tcChannel].reg = getTimerCount() - (uint16_t)usToTicks(1000UL); - - if (tcChannel == 0 ) { - SYNC(tc->COUNT16.SYNCBUSY.bit.CC0); - - // Clear pending match interrupt - tc->COUNT16.INTFLAG.reg = TC_INTENSET_MC0; - // Enable the match channel interrupt request - tc->COUNT16.INTENSET.reg = TC_INTENSET_MC0; - } - else { - SYNC(tc->COUNT16.SYNCBUSY.bit.CC1); - - // Clear pending match interrupt - tc->COUNT16.INTFLAG.reg = TC_INTENSET_MC1; - // Enable the match channel interrupt request - tc->COUNT16.INTENSET.reg = TC_INTENSET_MC1; - } -} - -void finISR(timer16_Sequence_t timer) { - Tc * const tc = TimerConfig[SERVO_TC].pTc; - const uint8_t tcChannel = TIMER_TCCHANNEL(timer); - - // Disable the match channel interrupt request - tc->COUNT16.INTENCLR.reg = (tcChannel == 0) ? TC_INTENCLR_MC0 : TC_INTENCLR_MC1; - - if (true - #if defined(_useTimer1) && defined(_useTimer2) - && (tc->COUNT16.INTENCLR.reg & (TC_INTENCLR_MC0|TC_INTENCLR_MC1)) == 0 - #endif - ) { - // Disable the timer if not used - tc->COUNT16.CTRLA.bit.ENABLE = false; - SYNC(tc->COUNT16.SYNCBUSY.bit.ENABLE); - } -} - -#endif // HAS_SERVOS - -#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/ServoTimers.h b/Marlin/src/HAL/SAMD51/ServoTimers.h deleted file mode 100644 index 948d515356..0000000000 --- a/Marlin/src/HAL/SAMD51/ServoTimers.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define _useTimer1 -#define _useTimer2 - -#define TRIM_DURATION 5 // compensation ticks to trim adjust for digitalWrite delays -#define SERVO_TIMER_PRESCALER 64 // timer prescaler factor to 64 (avoid overflowing 16-bit clock counter, at 120MHz this is 1831 ticks per millisecond - -#define SERVO_TC 3 - -typedef enum { - #ifdef _useTimer1 - _timer1, - #endif - #ifdef _useTimer2 - _timer2, - #endif - _Nbr_16timers -} timer16_Sequence_t; diff --git a/Marlin/src/HAL/SAMD51/eeprom_flash.cpp b/Marlin/src/HAL/SAMD51/eeprom_flash.cpp deleted file mode 100644 index 429ef1c2d4..0000000000 --- a/Marlin/src/HAL/SAMD51/eeprom_flash.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __SAMD51__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(FLASH_EEPROM_EMULATION) - -#include "../shared/eeprom_api.h" - -#define NVMCTRL_CMD(c) do{ \ - SYNC(!NVMCTRL->STATUS.bit.READY); \ - NVMCTRL->INTFLAG.bit.DONE = true; \ - NVMCTRL->CTRLB.reg = c | NVMCTRL_CTRLB_CMDEX_KEY; \ - SYNC(NVMCTRL->INTFLAG.bit.DONE); \ - }while(0) -#define NVMCTRL_FLUSH() do{ \ - if (NVMCTRL->SEESTAT.bit.LOAD) \ - NVMCTRL_CMD(NVMCTRL_CTRLB_CMD_SEEFLUSH); \ - }while(0) - -size_t PersistentStore::capacity() { - const uint8_t psz = NVMCTRL->SEESTAT.bit.PSZ, - sblk = NVMCTRL->SEESTAT.bit.SBLK; - - return (!psz && !sblk) ? 0 - : (psz <= 2) ? (0x200 << psz) - : (sblk == 1 || psz == 3) ? 4096 - : (sblk == 2 || psz == 4) ? 8192 - : (sblk <= 4 || psz == 5) ? 16384 - : (sblk >= 9 && psz == 7) ? 65536 - : 32768; -} - -bool PersistentStore::access_start() { - NVMCTRL->SEECFG.reg = NVMCTRL_SEECFG_WMODE_BUFFERED; // Buffered mode and segment reallocation active - if (NVMCTRL->SEESTAT.bit.RLOCK) - NVMCTRL_CMD(NVMCTRL_CTRLB_CMD_USEE); // Unlock E2P data write access - return true; -} - -bool PersistentStore::access_finish() { - NVMCTRL_FLUSH(); - if (!NVMCTRL->SEESTAT.bit.LOCK) - NVMCTRL_CMD(NVMCTRL_CTRLB_CMD_LSEE); // Lock E2P data write access - return true; -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - const uint8_t v = *value; - SYNC(NVMCTRL->SEESTAT.bit.BUSY); - if (NVMCTRL->INTFLAG.bit.SEESFULL) - NVMCTRL_FLUSH(); // Next write will trigger a sector reallocation. I need to flush 'pagebuffer' - ((volatile uint8_t *)SEEPROM_ADDR)[pos] = v; - SYNC(!NVMCTRL->INTFLAG.bit.SEEWRC); - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - while (size--) { - SYNC(NVMCTRL->SEESTAT.bit.BUSY); - uint8_t c = ((volatile uint8_t *)SEEPROM_ADDR)[pos]; - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } - return false; -} - -#endif // FLASH_EEPROM_EMULATION -#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp b/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp deleted file mode 100644 index b403f7939f..0000000000 --- a/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __SAMD51__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(QSPI_EEPROM) - -#include "../shared/eeprom_api.h" - -#include "QSPIFlash.h" - -static bool initialized; - -size_t PersistentStore::capacity() { return qspi.size(); } - -bool PersistentStore::access_start() { - if (!initialized) { - qspi.begin(); - initialized = true; - } - return true; -} - -bool PersistentStore::access_finish() { - qspi.flush(); - return true; -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - const uint8_t v = *value; - qspi.writeByte(pos, v); - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - while (size--) { - uint8_t c = qspi.readByte(pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } - return false; -} - -#endif // QSPI_EEPROM -#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp deleted file mode 100644 index 3283195897..0000000000 --- a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __SAMD51__ - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -/** - * PersistentStore for Arduino-style EEPROM interface - * with simple implementations supplied by Marlin. - */ - -#include "../shared/eeprom_if.h" -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM." -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { eeprom_init(); return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - const uint8_t v = *value; - uint8_t * const p = (uint8_t * const)pos; - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - delay(2); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - while (size--) { - uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/endstop_interrupts.h b/Marlin/src/HAL/SAMD51/endstop_interrupts.h deleted file mode 100644 index daac773387..0000000000 --- a/Marlin/src/HAL/SAMD51/endstop_interrupts.h +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Endstop interrupts for ATMEL SAMD51 based targets. - * - * On SAMD51, all pins support external interrupt capability. - * Any pin can be used for external interrupts, but there are some restrictions. - * At most 16 different external interrupts can be used at one time. - * Further, you can’t just pick any 16 pins to use. This is because every pin on the SAMD51 - * connects to what is called an EXTINT line, and only one pin per EXTINT line can be used for external - * interrupts at a time - */ - -/** - * Endstop Interrupts - * - * Without endstop interrupts the endstop pins must be polled continually in - * the temperature-ISR via endstops.update(), most of the time finding no change. - * With this feature endstops.update() is called only when we know that at - * least one endstop has changed state, saving valuable CPU cycles. - * - * This feature only works when all used endstop pins can generate an 'external interrupt'. - * - * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. - * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) - */ - -#include "../../module/endstops.h" - -#define MATCH_EILINE(P1,P2) (P1 != P2 && PIN_TO_EILINE(P1) == PIN_TO_EILINE(P2)) -#if HAS_X_MAX - #define MATCH_X_MAX_EILINE(P) MATCH_EILINE(P, X_MAX_PIN) -#else - #define MATCH_X_MAX_EILINE(P) false -#endif -#if HAS_X_MIN - #define MATCH_X_MIN_EILINE(P) MATCH_EILINE(P, X_MIN_PIN) -#else - #define MATCH_X_MIN_EILINE(P) false -#endif -#if HAS_Y_MAX - #define MATCH_Y_MAX_EILINE(P) MATCH_EILINE(P, Y_MAX_PIN) -#else - #define MATCH_Y_MAX_EILINE(P) false -#endif -#if HAS_Y_MIN - #define MATCH_Y_MIN_EILINE(P) MATCH_EILINE(P, Y_MIN_PIN) -#else - #define MATCH_Y_MIN_EILINE(P) false -#endif -#if HAS_Z_MAX - #define MATCH_Z_MAX_EILINE(P) MATCH_EILINE(P, Z_MAX_PIN) -#else - #define MATCH_Z_MAX_EILINE(P) false -#endif -#if HAS_Z_MIN - #define MATCH_Z_MIN_EILINE(P) MATCH_EILINE(P, Z_MIN_PIN) -#else - #define MATCH_Z_MIN_EILINE(P) false -#endif -#if HAS_Z2_MAX - #define MATCH_Z2_MAX_EILINE(P) MATCH_EILINE(P, Z2_MAX_PIN) -#else - #define MATCH_Z2_MAX_EILINE(P) false -#endif -#if HAS_Z2_MIN - #define MATCH_Z2_MIN_EILINE(P) MATCH_EILINE(P, Z2_MIN_PIN) -#else - #define MATCH_Z2_MIN_EILINE(P) false -#endif -#if HAS_Z3_MAX - #define MATCH_Z3_MAX_EILINE(P) MATCH_EILINE(P, Z3_MAX_PIN) -#else - #define MATCH_Z3_MAX_EILINE(P) false -#endif -#if HAS_Z3_MIN - #define MATCH_Z3_MIN_EILINE(P) MATCH_EILINE(P, Z3_MIN_PIN) -#else - #define MATCH_Z3_MIN_EILINE(P) false -#endif -#if HAS_Z4_MAX - #define MATCH_Z4_MAX_EILINE(P) MATCH_EILINE(P, Z4_MAX_PIN) -#else - #define MATCH_Z4_MAX_EILINE(P) false -#endif -#if HAS_Z4_MIN - #define MATCH_Z4_MIN_EILINE(P) MATCH_EILINE(P, Z4_MIN_PIN) -#else - #define MATCH_Z4_MIN_EILINE(P) false -#endif -#if HAS_Z_MIN_PROBE_PIN - #define MATCH_Z_MIN_PROBE_EILINE(P) MATCH_EILINE(P, Z_MIN_PROBE_PIN) -#else - #define MATCH_Z_MIN_PROBE_EILINE(P) false -#endif -#define AVAILABLE_EILINE(P) (PIN_TO_EILINE(P) != -1 \ - && !MATCH_X_MAX_EILINE(P) && !MATCH_X_MIN_EILINE(P) \ - && !MATCH_Y_MAX_EILINE(P) && !MATCH_Y_MIN_EILINE(P) \ - && !MATCH_Z_MAX_EILINE(P) && !MATCH_Z_MIN_EILINE(P) \ - && !MATCH_Z2_MAX_EILINE(P) && !MATCH_Z2_MIN_EILINE(P) \ - && !MATCH_Z3_MAX_EILINE(P) && !MATCH_Z3_MIN_EILINE(P) \ - && !MATCH_Z4_MAX_EILINE(P) && !MATCH_Z4_MIN_EILINE(P) \ - && !MATCH_Z_MIN_PROBE_EILINE(P)) - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) - #if HAS_X_MAX - #if !AVAILABLE_EILINE(X_MAX_PIN) - #error "X_MAX_PIN has no EXTINT line available." - #endif - _ATTACH(X_MAX_PIN); - #endif - #if HAS_X_MIN - #if !AVAILABLE_EILINE(X_MIN_PIN) - #error "X_MIN_PIN has no EXTINT line available." - #endif - _ATTACH(X_MIN_PIN); - #endif - #if HAS_Y_MAX - #if !AVAILABLE_EILINE(Y_MAX_PIN) - #error "Y_MAX_PIN has no EXTINT line available." - #endif - _ATTACH(Y_MAX_PIN); - #endif - #if HAS_Y_MIN - #if !AVAILABLE_EILINE(Y_MIN_PIN) - #error "Y_MIN_PIN has no EXTINT line available." - #endif - _ATTACH(Y_MIN_PIN); - #endif - #if HAS_Z_MAX - #if !AVAILABLE_EILINE(Z_MAX_PIN) - #error "Z_MAX_PIN has no EXTINT line available." - #endif - _ATTACH(Z_MAX_PIN); - #endif - #if HAS_Z_MIN - #if !AVAILABLE_EILINE(Z_MIN_PIN) - #error "Z_MIN_PIN has no EXTINT line available." - #endif - _ATTACH(Z_MIN_PIN); - #endif - #if HAS_Z2_MAX - #if !AVAILABLE_EILINE(Z2_MAX_PIN) - #error "Z2_MAX_PIN has no EXTINT line available." - #endif - _ATTACH(Z2_MAX_PIN); - #endif - #if HAS_Z2_MIN - #if !AVAILABLE_EILINE(Z2_MIN_PIN) - #error "Z2_MIN_PIN has no EXTINT line available." - #endif - _ATTACH(Z2_MIN_PIN); - #endif - #if HAS_Z3_MAX - #if !AVAILABLE_EILINE(Z3_MAX_PIN) - #error "Z3_MAX_PIN has no EXTINT line available." - #endif - _ATTACH(Z3_MAX_PIN); - #endif - #if HAS_Z3_MIN - #if !AVAILABLE_EILINE(Z3_MIN_PIN) - #error "Z3_MIN_PIN has no EXTINT line available." - #endif - _ATTACH(Z3_MIN_PIN); - #endif - #if HAS_Z4_MAX - #if !AVAILABLE_EILINE(Z4_MAX_PIN) - #error "Z4_MAX_PIN has no EXTINT line available." - #endif - _ATTACH(Z4_MAX_PIN); - #endif - #if HAS_Z4_MIN - #if !AVAILABLE_EILINE(Z4_MIN_PIN) - #error "Z4_MIN_PIN has no EXTINT line available." - #endif - _ATTACH(Z4_MIN_PIN); - #endif - #if HAS_Z_MIN_PROBE_PIN - #if !AVAILABLE_EILINE(Z_MIN_PROBE_PIN) - #error "Z_MIN_PROBE_PIN has no EXTINT line available." - #endif - _ATTACH(Z_MIN_PROBE_PIN); - #endif -} diff --git a/Marlin/src/HAL/SAMD51/fastio.h b/Marlin/src/HAL/SAMD51/fastio.h deleted file mode 100644 index c456dfce30..0000000000 --- a/Marlin/src/HAL/SAMD51/fastio.h +++ /dev/null @@ -1,253 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast IO functions for SAMD51 - */ - -#include "SAMD51.h" - -/** - * Utility functions - */ - -#ifndef MASK - #define MASK(PIN) (1 << PIN) -#endif - -/** - * Magic I/O routines - * - * Now you can simply SET_OUTPUT(IO); WRITE(IO, HIGH); WRITE(IO, LOW); - */ - -// Read a pin -#define READ(IO) ((PORT->Group[(EPortType)GET_SAMD_PORT(IO)].IN.reg & MASK(GET_SAMD_PIN(IO))) != 0) - -// Write to a pin -#define WRITE(IO,V) do{ \ - const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ - const uint32_t mask = MASK(GET_SAMD_PIN(IO)); \ - \ - if (V) PORT->Group[port].OUTSET.reg = mask; \ - else PORT->Group[port].OUTCLR.reg = mask; \ - }while(0) - -// Toggle a pin -#define TOGGLE(IO) PORT->Group[(EPortType)GET_SAMD_PORT(IO)].OUTTGL.reg = MASK(GET_SAMD_PIN(IO)); - -// Set pin as input -#define SET_INPUT(IO) do{ \ - const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ - const uint32_t pin = GET_SAMD_PIN(IO); \ - \ - PORT->Group[port].PINCFG[pin].reg = (uint8_t)(PORT_PINCFG_INEN); \ - PORT->Group[port].DIRCLR.reg = MASK(pin); \ - }while(0) -// Set pin as input with pullup -#define SET_INPUT_PULLUP(IO) do{ \ - const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ - const uint32_t pin = GET_SAMD_PIN(IO); \ - const uint32_t mask = MASK(pin); \ - \ - PORT->Group[port].PINCFG[pin].reg = (uint8_t)(PORT_PINCFG_INEN | PORT_PINCFG_PULLEN); \ - PORT->Group[port].DIRCLR.reg = mask; \ - PORT->Group[port].OUTSET.reg = mask; \ - }while(0) -// Set pin as input with pulldown -#define SET_INPUT_PULLDOWN(IO) do{ \ - const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ - const uint32_t pin = GET_SAMD_PIN(IO); \ - const uint32_t mask = MASK(pin); \ - \ - PORT->Group[port].PINCFG[pin].reg = (uint8_t)(PORT_PINCFG_INEN | PORT_PINCFG_PULLEN); \ - PORT->Group[port].DIRCLR.reg = mask; \ - PORT->Group[port].OUTCLR.reg = mask; \ - }while(0) -// Set pin as output (push pull) -#define SET_OUTPUT(IO) do{ \ - const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ - const uint32_t pin = GET_SAMD_PIN(IO); \ - \ - PORT->Group[port].DIRSET.reg = MASK(pin); \ - PORT->Group[port].PINCFG[pin].reg = 0; \ - }while(0) -// Set pin as output (open drain) -#define SET_OUTPUT_OD(IO) do{ \ - const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ - const uint32_t pin = GET_SAMD_PIN(IO); \ - \ - PORT->Group[port].PINCFG[pin].reg = (uint8_t)(PORT_PINCFG_PULLEN); \ - PORT->Group[port].DIRCLR.reg = MASK(pin); \ - }while(0) -// Set pin as PWM (push pull) -#define SET_PWM SET_OUTPUT -// Set pin as PWM (open drain) -#define SET_PWM_OD SET_OUTPUT_OD - -// check if pin is an output -#define IS_OUTPUT(IO) ((PORT->Group[(EPortType)GET_SAMD_PORT(IO)].DIR.reg & MASK(GET_SAMD_PIN(IO))) \ - || (PORT->Group[(EPortType)GET_SAMD_PORT(IO)].PINCFG[GET_SAMD_PIN(IO)].reg & (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)) == PORT_PINCFG_PULLEN) -// check if pin is an input -#define IS_INPUT(IO) !IS_OUTPUT(IO) - -// Shorthand -#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) -#define OUT_WRITE_OD(IO,V) do{ SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0) - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) - -/** - * Ports and functions - * Added as necessary or if I feel like it- not a comprehensive list! - */ - -#ifdef ADAFRUIT_GRAND_CENTRAL_M4 - - /* - * Adafruit Grand Central M4 has a lot of PWMs the availables are listed here. - * Some of these share the same source and so can't be used in the same time - */ - #define PWM_PIN(P) (WITHIN(P, 2, 13) || WITHIN(P, 22, 23) || WITHIN(P, 44, 45) || P == 48) - - // Return fullfilled ADCx->INPUTCTRL.reg - #define PIN_TO_INPUTCTRL(P) ( (PIN_TO_AIN(P) == 0) ? ADC_INPUTCTRL_MUXPOS_AIN0 \ - : (PIN_TO_AIN(P) == 1) ? ADC_INPUTCTRL_MUXPOS_AIN1 \ - : (PIN_TO_AIN(P) == 2) ? ADC_INPUTCTRL_MUXPOS_AIN2 \ - : (PIN_TO_AIN(P) == 3) ? ADC_INPUTCTRL_MUXPOS_AIN3 \ - : (PIN_TO_AIN(P) == 4) ? ADC_INPUTCTRL_MUXPOS_AIN4 \ - : (PIN_TO_AIN(P) == 5) ? ADC_INPUTCTRL_MUXPOS_AIN5 \ - : (PIN_TO_AIN(P) == 6) ? ADC_INPUTCTRL_MUXPOS_AIN6 \ - : (PIN_TO_AIN(P) == 7) ? ADC_INPUTCTRL_MUXPOS_AIN7 \ - : (PIN_TO_AIN(P) == 8) ? ADC_INPUTCTRL_MUXPOS_AIN8 \ - : (PIN_TO_AIN(P) == 9) ? ADC_INPUTCTRL_MUXPOS_AIN9 \ - : (PIN_TO_AIN(P) == 10) ? ADC_INPUTCTRL_MUXPOS_AIN10 \ - : (PIN_TO_AIN(P) == 11) ? ADC_INPUTCTRL_MUXPOS_AIN11 \ - : (PIN_TO_AIN(P) == 12) ? ADC_INPUTCTRL_MUXPOS_AIN12 \ - : (PIN_TO_AIN(P) == 13) ? ADC_INPUTCTRL_MUXPOS_AIN13 \ - : (PIN_TO_AIN(P) == 14) ? ADC_INPUTCTRL_MUXPOS_AIN14 \ - : ADC_INPUTCTRL_MUXPOS_AIN15) - - #define ANAPIN_TO_SAMDPIN(P) ( (P == 0) ? PIN_TO_SAMD_PIN(67) \ - : (P == 1) ? PIN_TO_SAMD_PIN(68) \ - : (P == 2) ? PIN_TO_SAMD_PIN(69) \ - : (P == 3) ? PIN_TO_SAMD_PIN(70) \ - : (P == 4) ? PIN_TO_SAMD_PIN(71) \ - : (P == 5) ? PIN_TO_SAMD_PIN(72) \ - : (P == 6) ? PIN_TO_SAMD_PIN(73) \ - : (P == 7) ? PIN_TO_SAMD_PIN(74) \ - : (P == 8) ? PIN_TO_SAMD_PIN(54) \ - : (P == 9) ? PIN_TO_SAMD_PIN(55) \ - : (P == 10) ? PIN_TO_SAMD_PIN(56) \ - : (P == 11) ? PIN_TO_SAMD_PIN(57) \ - : (P == 12) ? PIN_TO_SAMD_PIN(58) \ - : (P == 13) ? PIN_TO_SAMD_PIN(59) \ - : (P == 14) ? PIN_TO_SAMD_PIN(60) \ - : (P == 15) ? PIN_TO_SAMD_PIN(61) \ - : (P == 16) ? PIN_TO_SAMD_PIN(12) \ - : (P == 17) ? PIN_TO_SAMD_PIN(13) \ - : PIN_TO_SAMD_PIN(9)) - - #define digitalPinToAnalogInput(P) (WITHIN(P, 67, 74) ? (P) - 67 : WITHIN(P, 54, 61) ? 8 + (P) - 54 : WITHIN(P, 12, 13) ? 16 + (P) - 12 : P == 9 ? 18 : -1) - - /* - * pins - */ - - // PORTA - #define DIO67_PIN PIN_PA02 // A0 - #define DIO59_PIN PIN_PA04 // A13 - #define DIO68_PIN PIN_PA05 // A1 - #define DIO60_PIN PIN_PA06 // A14 - #define DIO61_PIN PIN_PA07 // A15 - #define DIO26_PIN PIN_PA12 - #define DIO27_PIN PIN_PA13 - #define DIO28_PIN PIN_PA14 - #define DIO23_PIN PIN_PA15 - #define DIO37_PIN PIN_PA16 - #define DIO36_PIN PIN_PA17 - #define DIO35_PIN PIN_PA18 - #define DIO34_PIN PIN_PA19 - #define DIO33_PIN PIN_PA20 - #define DIO32_PIN PIN_PA21 - #define DIO31_PIN PIN_PA22 - #define DIO30_PIN PIN_PA23 - // PORTB - #define DIO12_PIN PIN_PB00 // A16 - #define DIO13_PIN PIN_PB01 // A17 - #define DIO9_PIN PIN_PB02 // A18 - #define DIO69_PIN PIN_PB03 // A2 - #define DIO74_PIN PIN_PB04 // A7 - #define DIO54_PIN PIN_PB05 // A8 - #define DIO55_PIN PIN_PB06 // A9 - #define DIO56_PIN PIN_PB07 // A10 - #define DIO57_PIN PIN_PB08 // A11 - #define DIO58_PIN PIN_PB09 // A12 - #define DIO18_PIN PIN_PB12 - #define DIO19_PIN PIN_PB13 - #define DIO39_PIN PIN_PB14 - #define DIO38_PIN PIN_PB15 - #define DIO14_PIN PIN_PB16 - #define DIO15_PIN PIN_PB17 - #define DIO8_PIN PIN_PB18 - #define DIO29_PIN PIN_PB19 - #define DIO20_PIN PIN_PB20 - #define DIO21_PIN PIN_PB21 - #define DIO10_PIN PIN_PB22 - #define DIO11_PIN PIN_PB23 - #define DIO1_PIN PIN_PB24 - #define DIO0_PIN PIN_PB25 - #define DIO83_PIN PIN_PB28 // SD_CS - #define DIO95_PIN PIN_PB31 // SD_CD - // PORTC - #define DIO70_PIN PIN_PC00 // A3 - #define DIO71_PIN PIN_PC01 // A4 - #define DIO72_PIN PIN_PC02 // A5 - #define DIO73_PIN PIN_PC03 // A6 - #define DIO48_PIN PIN_PC04 - #define DIO49_PIN PIN_PC05 - #define DIO46_PIN PIN_PC06 - #define DIO47_PIN PIN_PC07 - #define DIO45_PIN PIN_PC10 - #define DIO44_PIN PIN_PC11 - #define DIO41_PIN PIN_PC12 - #define DIO40_PIN PIN_PC13 - #define DIO43_PIN PIN_PC14 - #define DIO42_PIN PIN_PC15 - #define DIO25_PIN PIN_PC16 - #define DIO24_PIN PIN_PC17 - #define DIO2_PIN PIN_PC18 - #define DIO3_PIN PIN_PC19 - #define DIO4_PIN PIN_PC20 - #define DIO5_PIN PIN_PC21 - #define DIO16_PIN PIN_PC22 - #define DIO17_PIN PIN_PC23 - #define DIO88_PIN PIN_PC24 // NEOPIXEL - // PORTD - #define DIO53_PIN PIN_PD10 - #define DIO22_PIN PIN_PD12 - #define DIO6_PIN PIN_PD20 - #define DIO7_PIN PIN_PD21 - -#endif // ADAFRUIT_GRAND_CENTRAL_M4 diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h deleted file mode 100644 index 932348c52f..0000000000 --- a/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/SAMD51." -#endif diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h deleted file mode 100644 index ce6d3fdde2..0000000000 --- a/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if USE_FALLBACK_EEPROM - #define FLASH_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) - #define USE_SHARED_EEPROM 1 -#endif diff --git a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h deleted file mode 100644 index 5d610acac8..0000000000 --- a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Test SAMD51 specific configuration values for errors at compile-time. - */ - -#if ENABLED(FLASH_EEPROM_EMULATION) - #warning "Did you activate the SmartEEPROM? See https://github.com/GMagician/SAMD51-SmartEEprom-Manager/releases" -#endif - -#if defined(ADAFRUIT_GRAND_CENTRAL_M4) && SD_CONNECTION_IS(CUSTOM_CABLE) - #error "No custom SD drive cable defined for this board." -#endif - -#if defined(MAX6675_SCK_PIN) && defined(MAX6675_DO_PIN) && (MAX6675_SCK_PIN == SCK1 || MAX6675_DO_PIN == MISO1) - #error "OnBoard SPI BUS can't be shared with other devices." -#endif - -#if SERVO_TC == RTC_TIMER_NUM - #error "Servos can't use RTC timer" -#endif - -#if ENABLED(EMERGENCY_PARSER) - #error "EMERGENCY_PARSER is not yet implemented for SAMD51. Disable EMERGENCY_PARSER to continue." -#endif - -#if ENABLED(SDIO_SUPPORT) - #error "SDIO_SUPPORT is not supported on SAMD51." -#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on SAMD51." -#endif diff --git a/Marlin/src/HAL/SAMD51/pinsDebug.h b/Marlin/src/HAL/SAMD51/pinsDebug.h deleted file mode 100644 index 81376db79a..0000000000 --- a/Marlin/src/HAL/SAMD51/pinsDebug.h +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define NUMBER_PINS_TOTAL PINS_COUNT - -#define digitalRead_mod(p) extDigitalRead(p) -#define PRINT_PORT(p) do{ SERIAL_ECHOPGM(" Port: "); sprintf_P(buffer, PSTR("%c%02ld"), 'A' + g_APinDescription[p].ulPort, g_APinDescription[p].ulPin); SERIAL_ECHO(buffer); }while (0) -#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) -#define GET_ARRAY_PIN(p) pin_array[p].pin -#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital -#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL) -#define DIGITAL_PIN_TO_ANALOG_PIN(p) digitalPinToAnalogInput(p) -#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P)!=-1) -#define pwm_status(pin) digitalPinHasPWM(pin) -#define MULTI_NAME_PAD 27 // space needed to be pretty if not first name assigned to a pin - -// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities -// uses pin index -#define M43_NEVER_TOUCH(Q) ((Q) >= 75) - -bool GET_PINMODE(int8_t pin) { // 1: output, 0: input - const EPortType samdport = g_APinDescription[pin].ulPort; - const uint32_t samdpin = g_APinDescription[pin].ulPin; - return PORT->Group[samdport].DIR.reg & MASK(samdpin) || (PORT->Group[samdport].PINCFG[samdpin].reg & (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)) == PORT_PINCFG_PULLEN; -} - -void pwm_details(int32_t pin) { - if (pwm_status(pin)) { - //uint32_t chan = g_APinDescription[pin].ulPWMChannel TODO when fast pwm is operative; - //SERIAL_ECHOPAIR("PWM = ", duty); - } -} - -/** - * AGCM4 Board pin | PORT | Label - * ----------------+--------+------- - * 0 | PB25 | "RX0" - * 1 | PB24 | "TX0" - * 2 | PC18 | - * 3 | PC19 | - * 4 | PC20 | - * 5 | PC21 | - * 6 | PD20 | - * 7 | PD21 | - * 8 | PB18 | - * 9 | PB2 | - * 10 | PB22 | - * 11 | PB23 | - * 12 | PB0 | "A16" - * 13 | PB1 | LED AMBER "L" / "A17" - * 14 | PB16 | "TX3" - * 15 | PB17 | "RX3" - * 16 | PC22 | "TX2" - * 17 | PC23 | "RX2" - * 18 | PB12 | "TX1" / "A18" - * 19 | PB13 | "RX1" - * 20 | PB20 | "SDA" - * 21 | PB21 | "SCL" - * 22 | PD12 | - * 23 | PA15 | - * 24 | PC17 | - * 25 | PC16 | - * 26 | PA12 | - * 27 | PA13 | - * 28 | PA14 | - * 29 | PB19 | - * 30 | PA23 | - * 31 | PA22 | - * 32 | PA21 | - * 33 | PA20 | - * 34 | PA19 | - * 35 | PA18 | - * 36 | PA17 | - * 37 | PA16 | - * 38 | PB15 | - * 39 | PB14 | - * 40 | PC13 | - * 41 | PC12 | - * 42 | PC15 | - * 43 | PC14 | - * 44 | PC11 | - * 45 | PC10 | - * 46 | PC6 | - * 47 | PC7 | - * 48 | PC4 | - * 49 | PC5 | - * 50 | PD11 | - * 51 | PD8 | - * 52 | PD9 | - * 53 | PD10 | - * 54 | PB5 | "A8" - * 55 | PB6 | "A9" - * 56 | PB7 | "A10" - * 57 | PB8 | "A11" - * 58 | PB9 | "A12" - * 69 | PA4 | "A13" - * 60 | PA6 | "A14" - * 61 | PA7 | "A15" - * 62 | PB17 | - * 63 | PB20 | - * 64 | PD11 | - * 65 | PD8 | - * 66 | PD9 | - * 67 | PA2 | "A0" / "DAC0" - * 68 | PA5 | "A1" / "DAC1" - * 69 | PB3 | "A2" - * 70 | PC0 | "A3" - * 71 | PC1 | "A4" - * 72 | PC2 | "A5" - * 73 | PC3 | "A6" - * 74 | PB4 | "A7" - * 75 | PC31 | LED GREEN "RX" - * 76 | PC30 | LED GREEN "TX" - * 77 | PA27 | USB: Host enable - * 78 | PA24 | USB: D- - * 79 | PA25 | USB: D+ - * 80 | PB29 | SD: MISO - * 81 | PB27 | SD: SCK - * 82 | PB26 | SD: MOSI - * 83 | PB28 | SD: CS - * 84 | PA3 | AREF - * 85 | PA2 | DAC0 (Duplicate) - * 86 | PA5 | DAC1 (Duplicate) - * 87 | PB1 | LED AMBER "L" (Duplicate) - * 88 | PC24 | NeoPixel - * 89 | PB10 | QSPI: SCK - * 90 | PB11 | QSPI: CS - * 91 | PA8 | QSPI: IO0 - * 92 | PA9 | QSPI: IO1 - * 93 | PA10 | QSPI: IO2 - * 94 | PA11 | QSPI: IO3 - * 95 | PB31 | SD: DETECT - */ diff --git a/Marlin/src/HAL/SAMD51/spi_pins.h b/Marlin/src/HAL/SAMD51/spi_pins.h deleted file mode 100644 index 5a9b1275ef..0000000000 --- a/Marlin/src/HAL/SAMD51/spi_pins.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef ADAFRUIT_GRAND_CENTRAL_M4 - - /* - * AGCM4 Default SPI Pins - * - * SS SCK MISO MOSI - * +-------------------------+ - * SPI | 53 52 50 51 | - * SPI1 | 83 81 80 82 | - * +-------------------------+ - * Any pin can be used for Chip Select (SS_PIN) - */ - #ifndef SCK_PIN - #define SCK_PIN 52 - #endif - #ifndef MISO_PIN - #define MISO_PIN 50 - #endif - #ifndef MOSI_PIN - #define MOSI_PIN 51 - #endif - #ifndef SDSS - #define SDSS 53 - #endif - -#else - - #error "Unsupported board!" - -#endif - -#define SS_PIN SDSS diff --git a/Marlin/src/HAL/SAMD51/timers.cpp b/Marlin/src/HAL/SAMD51/timers.cpp deleted file mode 100644 index a68af2e074..0000000000 --- a/Marlin/src/HAL/SAMD51/timers.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __SAMD51__ - -// -------------------------------------------------------------------------- -// Includes -// -------------------------------------------------------------------------- - -#include "../../inc/MarlinConfig.h" -#include "ServoTimers.h" // for SERVO_TC - -// -------------------------------------------------------------------------- -// Local defines -// -------------------------------------------------------------------------- - -#define NUM_HARDWARE_TIMERS 8 - -// -------------------------------------------------------------------------- -// Private Variables -// -------------------------------------------------------------------------- - -const tTimerConfig TimerConfig[NUM_HARDWARE_TIMERS+1] = { - { {.pTc=TC0}, TC0_IRQn, TC_PRIORITY(0) }, // 0 - stepper (assigned priority 2) - { {.pTc=TC1}, TC1_IRQn, TC_PRIORITY(1) }, // 1 - stepper (needed by 32 bit timers) - { {.pTc=TC2}, TC2_IRQn, 5 }, // 2 - tone (reserved by framework and fixed assigned priority 5) - { {.pTc=TC3}, TC3_IRQn, TC_PRIORITY(3) }, // 3 - servo (assigned priority 1) - { {.pTc=TC4}, TC4_IRQn, TC_PRIORITY(4) }, // 4 - software serial (no interrupts used) - { {.pTc=TC5}, TC5_IRQn, TC_PRIORITY(5) }, - { {.pTc=TC6}, TC6_IRQn, TC_PRIORITY(6) }, - { {.pTc=TC7}, TC7_IRQn, TC_PRIORITY(7) }, - { {.pRtc=RTC}, RTC_IRQn, TC_PRIORITY(8) } // 8 - temperature (assigned priority 6) -}; - -// -------------------------------------------------------------------------- -// Private functions -// -------------------------------------------------------------------------- - -FORCE_INLINE void Disable_Irq(IRQn_Type irq) { - NVIC_DisableIRQ(irq); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); -} - -// -------------------------------------------------------------------------- -// Public functions -// -------------------------------------------------------------------------- - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; - - // Disable interrupt, just in case it was already enabled - Disable_Irq(irq); - - if (timer_num == RTC_TIMER_NUM) { - Rtc * const rtc = TimerConfig[timer_num].pRtc; - - // Disable timer interrupt - rtc->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_CMP0; - - // RTC clock setup - OSC32KCTRL->RTCCTRL.reg = OSC32KCTRL_RTCCTRL_RTCSEL_XOSC32K; // External 32.768KHz oscillator - - // Stop timer, just in case, to be able to reconfigure it - rtc->MODE0.CTRLA.bit.ENABLE = false; - SYNC(rtc->MODE0.SYNCBUSY.bit.ENABLE); - - // Mode, reset counter on match - rtc->MODE0.CTRLA.reg = RTC_MODE0_CTRLA_MODE_COUNT32 | RTC_MODE0_CTRLA_MATCHCLR; - - // Set compare value - rtc->MODE0.COMP[0].reg = (32768 + frequency / 2) / frequency; - SYNC(rtc->MODE0.SYNCBUSY.bit.COMP0); - - // Enable interrupt on compare - rtc->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0; // reset pending interrupt - rtc->MODE0.INTENSET.reg = RTC_MODE0_INTENSET_CMP0; // enable compare 0 interrupt - - // And start timer - rtc->MODE0.CTRLA.bit.ENABLE = true; - SYNC(rtc->MODE0.SYNCBUSY.bit.ENABLE); - } - else { - Tc * const tc = TimerConfig[timer_num].pTc; - - // Disable timer interrupt - tc->COUNT32.INTENCLR.reg = TC_INTENCLR_OVF; // disable overflow interrupt - - // TCn clock setup - const uint8_t clockID = GCLK_CLKCTRL_IDs[TCC_INST_NUM + timer_num]; // TC clock are preceeded by TCC ones - GCLK->PCHCTRL[clockID].bit.CHEN = false; - SYNC(GCLK->PCHCTRL[clockID].bit.CHEN); - GCLK->PCHCTRL[clockID].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN; // 120MHz startup code programmed - SYNC(!GCLK->PCHCTRL[clockID].bit.CHEN); - - // Stop timer, just in case, to be able to reconfigure it - tc->COUNT32.CTRLA.bit.ENABLE = false; - SYNC(tc->COUNT32.SYNCBUSY.bit.ENABLE); - - // Reset timer - tc->COUNT32.CTRLA.bit.SWRST = true; - SYNC(tc->COUNT32.SYNCBUSY.bit.SWRST); - - // Wave mode, reset counter on compare match - tc->COUNT32.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; - tc->COUNT32.CTRLA.reg = TC_CTRLA_MODE_COUNT32 | TC_CTRLA_PRESCALER_DIV1; - tc->COUNT32.CTRLBCLR.reg = TC_CTRLBCLR_DIR; - SYNC(tc->COUNT32.SYNCBUSY.bit.CTRLB); - - // Set compare value - tc->COUNT32.CC[0].reg = (HAL_TIMER_RATE) / frequency; - tc->COUNT32.COUNT.reg = 0; - - // Enable interrupt on compare - tc->COUNT32.INTFLAG.reg = TC_INTFLAG_OVF; // reset pending interrupt - tc->COUNT32.INTENSET.reg = TC_INTENSET_OVF; // enable overflow interrupt - - // And start timer - tc->COUNT32.CTRLA.bit.ENABLE = true; - SYNC(tc->COUNT32.SYNCBUSY.bit.ENABLE); - } - - // Finally, enable IRQ - NVIC_SetPriority(irq, TimerConfig[timer_num].priority); - NVIC_EnableIRQ(irq); -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - const IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; - NVIC_EnableIRQ(irq); -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - const IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; - Disable_Irq(irq); -} - -// missing from CMSIS: Check if interrupt is enabled or not -static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) { - return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0; -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - const IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; - return NVIC_GetEnabledIRQ(irq); -} - -#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/timers.h b/Marlin/src/HAL/SAMD51/timers.h deleted file mode 100644 index dc6e38b730..0000000000 --- a/Marlin/src/HAL/SAMD51/timers.h +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// -------------------------------------------------------------------------- -// Defines -// -------------------------------------------------------------------------- -#define RTC_TIMER_NUM 8 // This is not a TC but a RTC - -typedef uint32_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF - -#define HAL_TIMER_RATE F_CPU // frequency of timers peripherals - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM RTC_TIMER_NUM // Timer Index for Temperature -#endif - -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency - -#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) -#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000) // stepper timer ticks per µs -#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#define TC_PRIORITY(t) t == SERVO_TC ? 1 \ - : (t == STEP_TIMER_NUM || t == PULSE_TIMER_NUM) ? 2 \ - : (t == TEMP_TIMER_NUM) ? 6 \ - : 7 - -#define _TC_HANDLER(t) void TC##t##_Handler() -#define TC_HANDLER(t) _TC_HANDLER(t) -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() TC_HANDLER(STEP_TIMER_NUM) -#endif -#if STEP_TIMER_NUM != PULSE_TIMER_NUM - #define HAL_PULSE_TIMER_ISR() TC_HANDLER(PULSE_TIMER_NUM) -#endif -#if TEMP_TIMER_NUM == RTC_TIMER_NUM - #define HAL_TEMP_TIMER_ISR() void RTC_Handler() -#else - #define HAL_TEMP_TIMER_ISR() TC_HANDLER(TEMP_TIMER_NUM) -#endif - -// -------------------------------------------------------------------------- -// Types -// -------------------------------------------------------------------------- - -typedef struct { - union { - Tc *pTc; - Rtc *pRtc; - }; - IRQn_Type IRQ_Id; - uint8_t priority; -} tTimerConfig; - -// -------------------------------------------------------------------------- -// Public Variables -// -------------------------------------------------------------------------- - -extern const tTimerConfig TimerConfig[]; - -// -------------------------------------------------------------------------- -// Public functions -// -------------------------------------------------------------------------- - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); - -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { - // Should never be called with timer RTC_TIMER_NUM - Tc * const tc = TimerConfig[timer_num].pTc; - tc->COUNT32.CC[0].reg = compare; -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - // Should never be called with timer RTC_TIMER_NUM - Tc * const tc = TimerConfig[timer_num].pTc; - return (hal_timer_t)tc->COUNT32.CC[0].reg; -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - // Should never be called with timer RTC_TIMER_NUM - Tc * const tc = TimerConfig[timer_num].pTc; - tc->COUNT32.CTRLBSET.reg = TC_CTRLBCLR_CMD_READSYNC; - SYNC(tc->COUNT32.SYNCBUSY.bit.CTRLB || tc->COUNT32.SYNCBUSY.bit.COUNT); - return tc->COUNT32.COUNT.reg; -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { - if (timer_num == RTC_TIMER_NUM) { - Rtc * const rtc = TimerConfig[timer_num].pRtc; - // Clear interrupt flag - rtc->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0; - } - else { - Tc * const tc = TimerConfig[timer_num].pTc; - // Clear interrupt flag - tc->COUNT32.INTFLAG.reg = TC_INTFLAG_OVF; - } -} - -#define HAL_timer_isr_epilogue(timer_num) diff --git a/Marlin/src/HAL/SAMD51/watchdog.cpp b/Marlin/src/HAL/SAMD51/watchdog.cpp deleted file mode 100644 index ebc8dffe13..0000000000 --- a/Marlin/src/HAL/SAMD51/watchdog.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __SAMD51__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - - #include "watchdog.h" - - void watchdog_init() { - // The low-power oscillator used by the WDT runs at 32,768 Hz with - // a 1:32 prescale, thus 1024 Hz, though probably not super precise. - - // Setup WDT clocks - MCLK->APBAMASK.bit.OSC32KCTRL_ = true; - MCLK->APBAMASK.bit.WDT_ = true; - OSC32KCTRL->OSCULP32K.bit.EN1K = true; // Enable out 1K (this is what WDT uses) - - WDT->CTRLA.bit.ENABLE = false; // Disable watchdog for config - SYNC(WDT->SYNCBUSY.bit.ENABLE); - - WDT->INTENCLR.reg = WDT_INTENCLR_EW; // Disable early warning interrupt - WDT->CONFIG.reg = WDT_CONFIG_PER_CYC4096; // Set at least 4s period for chip reset - - HAL_watchdog_refresh(); - - WDT->CTRLA.reg = WDT_CTRLA_ENABLE; // Start watchdog now in normal mode - SYNC(WDT->SYNCBUSY.bit.ENABLE); - } - -#endif // USE_WATCHDOG - -#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/watchdog.h b/Marlin/src/HAL/SAMD51/watchdog.h deleted file mode 100644 index 2cd4788229..0000000000 --- a/Marlin/src/HAL/SAMD51/watchdog.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// Initialize watchdog with a 4 second interrupt time -void watchdog_init(); - -// Reset watchdog. MUST be called at least every 4 seconds after the -// first watchdog_init or SAMD will go into emergency procedures. -inline void HAL_watchdog_refresh() { - SYNC(WDT->SYNCBUSY.bit.CLEAR); // Test first if previous is 'ongoing' to save time waiting for command execution - WDT->CLEAR.reg = WDT_CLEAR_CLEAR_KEY; -} diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp deleted file mode 100644 index 83604b1104..0000000000 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "HAL.h" -#include "usb_serial.h" - -#include "../../inc/MarlinConfig.h" -#include "../shared/Delay.h" - -#if ENABLED(SRAM_EEPROM_EMULATION) - #if STM32F7xx - #include - #elif STM32F4xx - #include - #else - #error "SRAM_EEPROM_EMULATION is currently only supported for STM32F4xx and STM32F7xx" - #endif -#endif - -// ------------------------ -// Public Variables -// ------------------------ - -uint16_t HAL_adc_result; - -// ------------------------ -// Public functions -// ------------------------ - -// Needed for DELAY_NS() / DELAY_US() on CORTEX-M7 -#if (defined(__arm__) || defined(__thumb__)) && __CORTEX_M == 7 - // HAL pre-initialization task - // Force the preinit function to run between the premain() and main() function - // of the STM32 arduino core - __attribute__((constructor (102))) - void HAL_preinit() { - enableCycleCounter(); - } -#endif - -// HAL initialization task -void HAL_init() { - FastIO_init(); - - #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) && (defined(SDSS) && SDSS != -1) - OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up - #endif - - #if PIN_EXISTS(LED) - OUT_WRITE(LED_PIN, LOW); - #endif - - #if ENABLED(SRAM_EEPROM_EMULATION) - __HAL_RCC_PWR_CLK_ENABLE(); - HAL_PWR_EnableBkUpAccess(); // Enable access to backup SRAM - __HAL_RCC_BKPSRAM_CLK_ENABLE(); - LL_PWR_EnableBkUpRegulator(); // Enable backup regulator - while (!LL_PWR_IsActiveFlag_BRR()); // Wait until backup regulator is initialized - #endif - - SetTimerInterruptPriorities(); - - TERN_(EMERGENCY_PARSER, USB_Hook_init()); -} - -void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } - -uint8_t HAL_get_reset_source() { - return - #ifdef RCC_FLAG_IWDGRST // Some sources may not exist... - RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) ? RST_WATCHDOG : - #endif - #ifdef RCC_FLAG_IWDG1RST - RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_IWDG1RST) ? RST_WATCHDOG : - #endif - #ifdef RCC_FLAG_IWDG2RST - RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_IWDG2RST) ? RST_WATCHDOG : - #endif - #ifdef RCC_FLAG_SFTRST - RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) ? RST_SOFTWARE : - #endif - #ifdef RCC_FLAG_PINRST - RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) ? RST_EXTERNAL : - #endif - #ifdef RCC_FLAG_PORRST - RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) ? RST_POWER_ON : - #endif - 0 - ; -} - -void _delay_ms(const int delay_ms) { delay(delay_ms); } - -extern "C" { - extern unsigned int _ebss; // end of bss section -} - -// ------------------------ -// ADC -// ------------------------ - -// TODO: Make sure this doesn't cause any delay -void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); } -uint16_t HAL_adc_get_result() { return HAL_adc_result; } - -// Reset the system (to initiate a firmware flash) -void flashFirmware(const int16_t) { NVIC_SystemReset(); } - -// Maple Compatibility -systickCallback_t systick_user_callback; -void systick_attach_callback(systickCallback_t cb) { systick_user_callback = cb; } -void HAL_SYSTICK_Callback() { if (systick_user_callback) systick_user_callback(); } - -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h deleted file mode 100644 index a1f7515d6b..0000000000 --- a/Marlin/src/HAL/STM32/HAL.h +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define CPU_32_BIT - -#include "../../core/macros.h" -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" -#include "fastio.h" -#include "watchdog.h" -#include "MarlinSerial.h" - -#include "../../inc/MarlinConfigPre.h" - -#include - -#ifdef USBCON - #include -#endif - -// ------------------------ -// Defines -// ------------------------ -#define _MSERIAL(X) MSerial##X -#define MSERIAL(X) _MSERIAL(X) - -#if SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB -#elif WITHIN(SERIAL_PORT, 1, 6) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) -#else - #error "SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." -#endif - -#ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 SerialUSB - #elif WITHIN(SERIAL_PORT_2, 1, 6) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) - #else - #error "SERIAL_PORT_2 must be -1 or from 1 to 6. Please update your configuration." - #endif -#endif - -#ifdef LCD_SERIAL_PORT - #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL SerialUSB - #elif WITHIN(LCD_SERIAL_PORT, 1, 6) - #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) - #else - #error "LCD_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." - #endif - #if HAS_DGUS_LCD - #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() - #endif -#endif - -/** - * TODO: review this to return 1 for pins that are not analog input - */ -#ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) (p) -#endif - -#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() -#define CRITICAL_SECTION_END() if (!primask) __enable_irq() -#define ISRS_ENABLED() (!__get_PRIMASK()) -#define ENABLE_ISRS() __enable_irq() -#define DISABLE_ISRS() __disable_irq() -#define cli() __disable_irq() -#define sei() __enable_irq() - -// On AVR this is in math.h? -#define square(x) ((x)*(x)) - -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*(addr)) - -// ------------------------ -// Types -// ------------------------ - -typedef int16_t pin_t; - -#define HAL_SERVO_LIB libServo - -// ------------------------ -// Public Variables -// ------------------------ - -// result of last ADC conversion -extern uint16_t HAL_adc_result; - -// ------------------------ -// Public functions -// ------------------------ - -// Memory related -#define __bss_end __bss_end__ - -// Enable hooks into setup for HAL -void HAL_init(); - -// Clear reset reason -void HAL_clear_reset_source(); - -// Reset reason -uint8_t HAL_get_reset_source(); - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -void _delay_ms(const int delay); - -extern "C" char* _sbrk(int incr); - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" - -static inline int freeMemory() { - volatile char top; - return &top - reinterpret_cast(_sbrk(0)); -} - -#pragma GCC diagnostic pop - -// -// ADC -// - -#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) - -inline void HAL_adc_init() {} - -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 -#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) -#define HAL_READ_ADC() HAL_adc_result -#define HAL_ADC_READY() true - -void HAL_adc_start_conversion(const uint8_t adc_pin); - -uint16_t HAL_adc_get_result(); - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -#ifdef STM32F1xx - #define JTAG_DISABLE() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_JTAGDISABLE) - #define JTAGSWD_DISABLE() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_DISABLE) -#endif - -#define PLATFORM_M997_SUPPORT -void flashFirmware(const int16_t); - -// Maple Compatibility -typedef void (*systickCallback_t)(void); -void systick_attach_callback(systickCallback_t cb); -void HAL_SYSTICK_Callback(); diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp deleted file mode 100644 index f947e6ef32..0000000000 --- a/Marlin/src/HAL/STM32/HAL_SPI.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -#include - -// ------------------------ -// Public Variables -// ------------------------ - -static SPISettings spiConfig; - -// ------------------------ -// Public functions -// ------------------------ - -#if ENABLED(SOFTWARE_SPI) - - // ------------------------ - // Software SPI - // ------------------------ - - #include "../shared/Delay.h" - - void spiBegin(void) { - OUT_WRITE(SS_PIN, HIGH); - OUT_WRITE(SCK_PIN, HIGH); - SET_INPUT(MISO_PIN); - OUT_WRITE(MOSI_PIN, HIGH); - } - - static uint16_t delay_STM32_soft_spi; - - void spiInit(uint8_t spiRate) { - // Use datarates Marlin uses - switch (spiRate) { - case SPI_FULL_SPEED: delay_STM32_soft_spi = 125; break; // desired: 8,000,000 actual: ~1.1M - case SPI_HALF_SPEED: delay_STM32_soft_spi = 125; break; // desired: 4,000,000 actual: ~1.1M - case SPI_QUARTER_SPEED:delay_STM32_soft_spi = 250; break; // desired: 2,000,000 actual: ~890K - case SPI_EIGHTH_SPEED: delay_STM32_soft_spi = 500; break; // desired: 1,000,000 actual: ~590K - case SPI_SPEED_5: delay_STM32_soft_spi = 1000; break; // desired: 500,000 actual: ~360K - case SPI_SPEED_6: delay_STM32_soft_spi = 2000; break; // desired: 250,000 actual: ~210K - default: delay_STM32_soft_spi = 4000; break; // desired: 125,000 actual: ~123K - } - SPI.begin(); - } - - // Begin SPI transaction, set clock, bit order, data mode - void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { /* do nothing */ } - - uint8_t HAL_SPI_STM32_SpiTransfer_Mode_3(uint8_t b) { // using Mode 3 - for (uint8_t bits = 8; bits--;) { - WRITE(SCK_PIN, LOW); - WRITE(MOSI_PIN, b & 0x80); - - DELAY_NS(delay_STM32_soft_spi); - WRITE(SCK_PIN, HIGH); - DELAY_NS(delay_STM32_soft_spi); - - b <<= 1; // little setup time - b |= (READ(MISO_PIN) != 0); - } - DELAY_NS(125); - return b; - } - - // Soft SPI receive byte - uint8_t spiRec() { - DISABLE_ISRS(); // No interrupts during byte receive - const uint8_t data = HAL_SPI_STM32_SpiTransfer_Mode_3(0xFF); - ENABLE_ISRS(); // Enable interrupts - return data; - } - - // Soft SPI read data - void spiRead(uint8_t *buf, uint16_t nbyte) { - for (uint16_t i = 0; i < nbyte; i++) - buf[i] = spiRec(); - } - - // Soft SPI send byte - void spiSend(uint8_t data) { - DISABLE_ISRS(); // No interrupts during byte send - HAL_SPI_STM32_SpiTransfer_Mode_3(data); // Don't care what is received - ENABLE_ISRS(); // Enable interrupts - } - - // Soft SPI send block - void spiSendBlock(uint8_t token, const uint8_t *buf) { - spiSend(token); - for (uint16_t i = 0; i < 512; i++) - spiSend(buf[i]); - } - -#else - - // ------------------------ - // Hardware SPI - // ------------------------ - - /** - * VGPV SPI speed start and PCLK2/2, by default 108/2 = 54Mhz - */ - - /** - * @brief Begin SPI port setup - * - * @return Nothing - * - * @details Only configures SS pin since stm32duino creates and initialize the SPI object - */ - void spiBegin() { - #if PIN_EXISTS(SS) - OUT_WRITE(SS_PIN, HIGH); - #endif - } - - // Configure SPI for specified SPI speed - void spiInit(uint8_t spiRate) { - // Use datarates Marlin uses - uint32_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = 20000000; break; // 13.9mhz=20000000 6.75mhz=10000000 3.38mhz=5000000 .833mhz=1000000 - case SPI_HALF_SPEED: clock = 5000000; break; - case SPI_QUARTER_SPEED: clock = 2500000; break; - case SPI_EIGHTH_SPEED: clock = 1250000; break; - case SPI_SPEED_5: clock = 625000; break; - case SPI_SPEED_6: clock = 300000; break; - default: - clock = 4000000; // Default from the SPI library - } - spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); - - #if ENABLED(CUSTOM_SPI_PINS) - SPI.setMISO(MISO_PIN); - SPI.setMOSI(MOSI_PIN); - SPI.setSCLK(SCK_PIN); - SPI.setSSEL(SS_PIN); - #endif - - SPI.begin(); - } - - /** - * @brief Receives a single byte from the SPI port. - * - * @return Byte received - * - * @details - */ - uint8_t spiRec() { - uint8_t returnByte = SPI.transfer(0xFF); - return returnByte; - } - - /** - * @brief Receive a number of bytes from the SPI port to a buffer - * - * @param buf Pointer to starting address of buffer to write to. - * @param nbyte Number of bytes to receive. - * @return Nothing - * - * @details Uses DMA - */ - void spiRead(uint8_t* buf, uint16_t nbyte) { - if (nbyte == 0) return; - memset(buf, 0xFF, nbyte); - SPI.transfer(buf, nbyte); - } - - /** - * @brief Send a single byte on SPI port - * - * @param b Byte to send - * - * @details - */ - void spiSend(uint8_t b) { - SPI.transfer(b); - } - - /** - * @brief Write token and then write from 512 byte buffer to SPI (for SD card) - * - * @param buf Pointer with buffer start address - * @return Nothing - * - * @details Use DMA - */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { - uint8_t rxBuf[512]; - SPI.transfer(token); - SPI.transfer((uint8_t*)buf, &rxBuf, 512); - } - -#endif // SOFTWARE_SPI - -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp deleted file mode 100644 index a146664366..0000000000 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" -#include "MarlinSerial.h" - -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif - -#ifndef USART4 - #define USART4 UART4 -#endif - -#ifndef USART5 - #define USART5 UART5 -#endif - -#define DECLARE_SERIAL_PORT(ser_num) \ - void _rx_complete_irq_ ## ser_num (serial_t * obj); \ - MarlinSerial MSerial ## ser_num (USART ## ser_num, &_rx_complete_irq_ ## ser_num); \ - void _rx_complete_irq_ ## ser_num (serial_t * obj) { MSerial ## ser_num ._rx_complete_irq(obj); } - -#define DECLARE_SERIAL_PORT_EXP(ser_num) DECLARE_SERIAL_PORT(ser_num) - -#if defined(SERIAL_PORT) && SERIAL_PORT >= 0 - DECLARE_SERIAL_PORT_EXP(SERIAL_PORT) -#endif - -#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 - DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2) -#endif - -#if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0 - DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT) -#endif - -void MarlinSerial::begin(unsigned long baud, uint8_t config) { - HardwareSerial::begin(baud, config); - // Replace the IRQ callback with the one we have defined - TERN_(EMERGENCY_PARSER, _serial.rx_callback = _rx_callback); -} - -// This function is Copyright (c) 2006 Nicholas Zambetti. -void MarlinSerial::_rx_complete_irq(serial_t *obj) { - // No Parity error, read byte and store it in the buffer if there is room - unsigned char c; - - if (uart_getc(obj, &c) == 0) { - - rx_buffer_index_t i = (unsigned int)(obj->rx_head + 1) % SERIAL_RX_BUFFER_SIZE; - - // if we should be storing the received character into the location - // just before the tail (meaning that the head would advance to the - // current location of the tail), we're about to overflow the buffer - // and so we don't write the character or advance the head. - if (i != obj->rx_tail) { - obj->rx_buff[obj->rx_head] = c; - obj->rx_head = i; - } - - #if ENABLED(EMERGENCY_PARSER) - emergency_parser.update(emergency_state, c); - #endif - } -} - -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h deleted file mode 100644 index 3611cc78d7..0000000000 --- a/Marlin/src/HAL/STM32/MarlinSerial.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif - -typedef void (*usart_rx_callback_t)(serial_t * obj); - -class MarlinSerial : public HardwareSerial { -public: - MarlinSerial(void* peripheral, usart_rx_callback_t rx_callback) : - HardwareSerial(peripheral), _rx_callback(rx_callback) - #if ENABLED(EMERGENCY_PARSER) - , emergency_state(EmergencyParser::State::EP_RESET) - #endif - { } - - #if ENABLED(EMERGENCY_PARSER) - static inline bool emergency_parser_enabled() { return true; } - #endif - - void begin(unsigned long baud, uint8_t config); - inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); } - - void _rx_complete_irq(serial_t* obj); - -protected: - usart_rx_callback_t _rx_callback; - #if ENABLED(EMERGENCY_PARSER) - EmergencyParser::State emergency_state; - #endif -}; - -extern MarlinSerial MSerial1; -extern MarlinSerial MSerial2; -extern MarlinSerial MSerial3; -extern MarlinSerial MSerial4; -extern MarlinSerial MSerial5; -extern MarlinSerial MSerial6; -extern MarlinSerial MSerial7; -extern MarlinSerial MSerial8; -extern MarlinSerial MSerial9; -extern MarlinSerial MSerial10; -extern MarlinSerial MSerialLP1; diff --git a/Marlin/src/HAL/STM32/README.md b/Marlin/src/HAL/STM32/README.md deleted file mode 100644 index 7680df6654..0000000000 --- a/Marlin/src/HAL/STM32/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Generic STM32 HAL based on the stm32duino core - -This HAL is intended to act as the generic STM32 HAL for all STM32 chips (The whole F, H and L family). - -Currently it supports: - * STM32F0xx - * STM32F1xx - * STM32F4xx - * STM32F7xx - -Targeting the official [Arduino STM32 Core](https://github.com/stm32duino/Arduino_Core_STM32). diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp deleted file mode 100644 index 6e73e87c21..0000000000 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDIO_SUPPORT) && !defined(STM32GENERIC) - -#include -#include - -#if NONE(STM32F103xE, STM32F103xG, STM32F4xx, STM32F7xx) - #error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported" -#endif - -#ifdef USBD_USE_CDC_COMPOSITE - - // use USB drivers - - extern "C" { int8_t SD_MSC_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); - int8_t SD_MSC_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); - extern SD_HandleTypeDef hsd; - } - - bool SDIO_Init() { - return hsd.State == HAL_SD_STATE_READY; // return pass/fail status - } - - bool SDIO_ReadBlock(uint32_t block, uint8_t *src) { - int8_t status = SD_MSC_Read(0, (uint8_t*)src, block, 1); // read one 512 byte block - return (bool) status; - } - - bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { - int8_t status = SD_MSC_Write(0, (uint8_t*)src, block, 1); // write one 512 byte block - return (bool) status; - } - -#else // !USBD_USE_CDC_COMPOSITE - - // use local drivers - #if defined(STM32F103xE) || defined(STM32F103xG) - #include - #include - #elif defined(STM32F4xx) - #include - #include - #include - #include - #elif defined(STM32F7xx) - #include - #include - #include - #include - #else - #error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported" - #endif - - SD_HandleTypeDef hsd; // create SDIO structure - - /* - SDIO_INIT_CLK_DIV is 118 - SDIO clock frequency is 48MHz / (TRANSFER_CLOCK_DIV + 2) - SDIO init clock frequency should not exceed 400KHz = 48MHz / (118 + 2) - - Default TRANSFER_CLOCK_DIV is 2 (118 / 40) - Default SDIO clock frequency is 48MHz / (2 + 2) = 12 MHz - This might be too fast for stable SDIO operations - - MKS Robin board seems to have stable SDIO with BusWide 1bit and ClockDiv 8 i.e. 4.8MHz SDIO clock frequency - Additional testing is required as there are clearly some 4bit initialization problems - - Add -DTRANSFER_CLOCK_DIV=8 to build parameters to improve SDIO stability - */ - - #ifndef TRANSFER_CLOCK_DIV - #define TRANSFER_CLOCK_DIV (uint8_t(SDIO_INIT_CLK_DIV) / 40) - #endif - - #ifndef USBD_OK - #define USBD_OK 0 - #endif - - void go_to_transfer_speed() { - SD_InitTypeDef Init; - - /* Default SDIO peripheral configuration for SD card initialization */ - Init.ClockEdge = hsd.Init.ClockEdge; - Init.ClockBypass = hsd.Init.ClockBypass; - Init.ClockPowerSave = hsd.Init.ClockPowerSave; - Init.BusWide = hsd.Init.BusWide; - Init.HardwareFlowControl = hsd.Init.HardwareFlowControl; - Init.ClockDiv = TRANSFER_CLOCK_DIV; - - /* Initialize SDIO peripheral interface with default configuration */ - SDIO_Init(hsd.Instance, Init); - } - - void SD_LowLevel_Init(void) { - uint32_t tempreg; - - __HAL_RCC_SDIO_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); //enable GPIO clocks - __HAL_RCC_GPIOD_CLK_ENABLE(); //enable GPIO clocks - - GPIO_InitTypeDef GPIO_InitStruct; - - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = 1; //GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - - #if DISABLED(STM32F1xx) - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - #endif - - GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_12; // D0 & SCK - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - #if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // define D1-D3 only if have a four bit wide SDIO bus - GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11; // D1-D3 - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - #endif - - // Configure PD.02 CMD line - GPIO_InitStruct.Pin = GPIO_PIN_2; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - - - #if DISABLED(STM32F1xx) - // TODO: use __HAL_RCC_SDIO_RELEASE_RESET() and __HAL_RCC_SDIO_CLK_ENABLE(); - RCC->APB2RSTR &= ~RCC_APB2RSTR_SDIORST_Msk; // take SDIO out of reset - RCC->APB2ENR |= RCC_APB2RSTR_SDIORST_Msk; // enable SDIO clock - // Enable the DMA2 Clock - #endif - - //Initialize the SDIO (with initial <400Khz Clock) - tempreg = 0; //Reset value - tempreg |= SDIO_CLKCR_CLKEN; // Clock enabled - tempreg |= (uint32_t)0x76; // Clock Divider. Clock = 48000 / (118 + 2) = 400Khz - // Keep the rest at 0 => HW_Flow Disabled, Rising Clock Edge, Disable CLK ByPass, Bus Width = 0, Power save Disable - SDIO->CLKCR = tempreg; - - // Power up the SDIO - SDIO->POWER = 0x03; - } - - void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { // application specific init - UNUSED(hsd); /* Prevent unused argument(s) compilation warning */ - __HAL_RCC_SDIO_CLK_ENABLE(); // turn on SDIO clock - } - - constexpr uint8_t SD_RETRY_COUNT = TERN(SD_CHECK_AND_RETRY, 3, 1); - - bool SDIO_Init() { - //init SDIO and get SD card info - - uint8_t retryCnt = SD_RETRY_COUNT; - - bool status; - hsd.Instance = SDIO; - hsd.State = (HAL_SD_StateTypeDef) 0; // HAL_SD_STATE_RESET - - /* - hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; - hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; - hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; - hsd.Init.BusWide = SDIO_BUS_WIDE_1B; - hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; - hsd.Init.ClockDiv = 8; - */ - - SD_LowLevel_Init(); - - uint8_t retry_Cnt = retryCnt; - for (;;) { - TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); - status = (bool) HAL_SD_Init(&hsd); - if (!status) break; - if (!--retry_Cnt) return false; // return failing status if retries are exhausted - } - - go_to_transfer_speed(); - - #if PINS_EXIST(SDIO_D1, SDIO_D2, SDIO_D3) // go to 4 bit wide mode if pins are defined - retry_Cnt = retryCnt; - for (;;) { - TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); - if (!HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)) break; // some cards are only 1 bit wide so a pass here is not required - if (!--retry_Cnt) break; - } - if (!retry_Cnt) { // wide bus failed, go back to one bit wide mode - hsd.State = (HAL_SD_StateTypeDef) 0; // HAL_SD_STATE_RESET - SD_LowLevel_Init(); - retry_Cnt = retryCnt; - for (;;) { - TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); - status = (bool) HAL_SD_Init(&hsd); - if (!status) break; - if (!--retry_Cnt) return false; // return failing status if retries are exhausted - } - } - #endif - - return true; - } - /* - void init_SDIO_pins(void) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - // SDIO GPIO Configuration - // PC8 ------> SDIO_D0 - // PC12 ------> SDIO_CK - // PD2 ------> SDIO_CMD - - GPIO_InitStruct.Pin = GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - } - */ - //bool SDIO_init() { return (bool) (SD_SDIO_Init() ? 1 : 0);} - //bool SDIO_Init_C() { return (bool) (SD_SDIO_Init() ? 1 : 0);} - - bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) { - hsd.Instance = SDIO; - uint8_t retryCnt = SD_RETRY_COUNT; - - bool status; - for (;;) { - TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); - status = (bool) HAL_SD_ReadBlocks(&hsd, (uint8_t*)dst, block, 1, 1000); // read one 512 byte block with 500mS timeout - status |= (bool) HAL_SD_GetCardState(&hsd); // make sure all is OK - if (!status) break; // return passing status - if (!--retryCnt) break; // return failing status if retries are exhausted - } - return status; - - /* - return (bool) ((status_read | status_card) ? 1 : 0); - - if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; - if (blockAddress >= SdCard.LogBlockNbr) return false; - if ((0x03 & (uint32_t)data)) return false; // misaligned data - - if (SdCard.CardType != CARD_SDHC_SDXC) { blockAddress *= 512U; } - - if (!SDIO_CmdReadSingleBlock(blockAddress)) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - return false; - } - - while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) {} - - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - - if (SDIO->STA & SDIO_STA_RXDAVL) { - while (SDIO->STA & SDIO_STA_RXDAVL) (void)SDIO->FIFO; - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; - } - - if (SDIO_GET_FLAG(SDIO_STA_TRX_ERROR_FLAGS)) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; - } - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - */ - - return true; - } - - bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { - hsd.Instance = SDIO; - uint8_t retryCnt = SD_RETRY_COUNT; - bool status; - for (;;) { - status = (bool) HAL_SD_WriteBlocks(&hsd, (uint8_t*)src, block, 1, 500); // write one 512 byte block with 500mS timeout - status |= (bool) HAL_SD_GetCardState(&hsd); // make sure all is OK - if (!status) break; // return passing status - if (!--retryCnt) break; // return failing status if retries are exhausted - } - return status; - } - -#endif // !USBD_USE_CDC_COMPOSITE -#endif // SDIO_SUPPORT diff --git a/Marlin/src/HAL/STM32/Servo.cpp b/Marlin/src/HAL/STM32/Servo.cpp deleted file mode 100644 index 1cf117a056..0000000000 --- a/Marlin/src/HAL/STM32/Servo.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include "Servo.h" - -static uint_fast8_t servoCount = 0; -static libServo *servos[NUM_SERVOS] = {0}; -constexpr millis_t servoDelay[] = SERVO_DELAY; -static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - -// Initialize to the default timer priority. This will be overridden by a call from timers.cpp. -// This allows all timer interrupt priorities to be managed from a single location in the HAL. -static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO); - -// This must be called after the STM32 Servo class has intialized the timer. -// It may only be needed after the first call to attach(), but it is possible -// that is is necessary after every detach() call. To be safe this is currently -// called after every call to attach(). -static void fixServoTimerInterruptPriority() { - NVIC_SetPriority(getTimerUpIrq(TIMER_SERVO), servo_interrupt_priority); -} - -libServo::libServo() -: delay(servoDelay[servoCount]), - was_attached_before_pause(false), - value_before_pause(0) -{ - servos[servoCount++] = this; -} - -int8_t libServo::attach(const int pin) { - if (servoCount >= MAX_SERVOS) return -1; - if (pin > 0) servo_pin = pin; - auto result = stm32_servo.attach(servo_pin); - fixServoTimerInterruptPriority(); - return result; -} - -int8_t libServo::attach(const int pin, const int min, const int max) { - if (servoCount >= MAX_SERVOS) return -1; - if (pin > 0) servo_pin = pin; - auto result = stm32_servo.attach(servo_pin, min, max); - fixServoTimerInterruptPriority(); - return result; -} - -void libServo::move(const int value) { - if (attach(0) >= 0) { - stm32_servo.write(value); - safe_delay(delay); - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); - } -} - -void libServo::pause() { - was_attached_before_pause = stm32_servo.attached(); - if (was_attached_before_pause) { - value_before_pause = stm32_servo.read(); - stm32_servo.detach(); - } -} - -void libServo::resume() { - if (was_attached_before_pause) { - attach(); - move(value_before_pause); - } -} - -void libServo::pause_all_servos() { - for (auto& servo : servos) - if (servo) servo->pause(); -} - -void libServo::resume_all_servos() { - for (auto& servo : servos) - if (servo) servo->resume(); -} - -void libServo::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) { - servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority); -} - -#endif // HAS_SERVOS -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/Servo.h b/Marlin/src/HAL/STM32/Servo.h deleted file mode 100644 index 1527e753b6..0000000000 --- a/Marlin/src/HAL/STM32/Servo.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -#include "../../core/millis_t.h" - -// Inherit and expand on the official library -class libServo { - public: - libServo(); - int8_t attach(const int pin = 0); // pin == 0 uses value from previous call - int8_t attach(const int pin, const int min, const int max); - void detach() { stm32_servo.detach(); } - int read() { return stm32_servo.read(); } - void move(const int value); - - void pause(); - void resume(); - - static void pause_all_servos(); - static void resume_all_servos(); - static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); - - private: - Servo stm32_servo; - - int servo_pin = 0; - millis_t delay = 0; - - bool was_attached_before_pause; - int value_before_pause; -}; diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp deleted file mode 100644 index 0933b9f4e8..0000000000 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(FLASH_EEPROM_EMULATION) - -#include "../shared/eeprom_api.h" - -#if HAS_SERVOS - #include "Servo.h" - #define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() - #define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() -#else - #define PAUSE_SERVO_OUTPUT() - #define RESUME_SERVO_OUTPUT() -#endif - -/** - * The STM32 HAL supports chips that deal with "pages" and some with "sectors" and some that - * even have multiple "banks" of flash. - * - * This code is a bit of a mashup of - * framework-arduinoststm32/cores/arduino/stm32/stm32_eeprom.c - * hal/hal_lpc1768/persistent_store_flash.cpp - * - * This has only be written against those that use a single "sector" design. - * - * Those that deal with "pages" could be made to work. Looking at the STM32F07 for example, there are - * 128 "pages", each 2kB in size. If we continued with our EEPROM being 4Kb, we'd always need to operate - * on 2 of these pages. Each write, we'd use 2 different pages from a pool of pages until we are done. - */ - -#if ENABLED(FLASH_EEPROM_LEVELING) - - #include "stm32_def.h" - - #define DEBUG_OUT ENABLED(EEPROM_CHITCHAT) - #include "src/core/debug_out.h" - - #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB - #endif - - #ifndef FLASH_SECTOR - #define FLASH_SECTOR (FLASH_SECTOR_TOTAL - 1) - #endif - #ifndef FLASH_UNIT_SIZE - #define FLASH_UNIT_SIZE 0x20000 // 128kB - #endif - - #define FLASH_ADDRESS_START (FLASH_END - ((FLASH_SECTOR_TOTAL - (FLASH_SECTOR)) * (FLASH_UNIT_SIZE)) + 1) - #define FLASH_ADDRESS_END (FLASH_ADDRESS_START + FLASH_UNIT_SIZE - 1) - - #define EEPROM_SLOTS ((FLASH_UNIT_SIZE) / (MARLIN_EEPROM_SIZE)) - #define SLOT_ADDRESS(slot) (FLASH_ADDRESS_START + (slot * (MARLIN_EEPROM_SIZE))) - - #define UNLOCK_FLASH() if (!flash_unlocked) { \ - HAL_FLASH_Unlock(); \ - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \ - FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); \ - flash_unlocked = true; \ - } - #define LOCK_FLASH() if (flash_unlocked) { HAL_FLASH_Lock(); flash_unlocked = false; } - - #define EMPTY_UINT32 ((uint32_t)-1) - #define EMPTY_UINT8 ((uint8_t)-1) - - static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; - static int current_slot = -1; - - static_assert(0 == MARLIN_EEPROM_SIZE % 4, "MARLIN_EEPROM_SIZE must be a multiple of 4"); // Ensure copying as uint32_t is safe - static_assert(0 == FLASH_UNIT_SIZE % MARLIN_EEPROM_SIZE, "MARLIN_EEPROM_SIZE must divide evenly into your FLASH_UNIT_SIZE"); - static_assert(FLASH_UNIT_SIZE >= MARLIN_EEPROM_SIZE, "FLASH_UNIT_SIZE must be greater than or equal to your MARLIN_EEPROM_SIZE"); - static_assert(IS_FLASH_SECTOR(FLASH_SECTOR), "FLASH_SECTOR is invalid"); - static_assert(IS_POWER_OF_2(FLASH_UNIT_SIZE), "FLASH_UNIT_SIZE should be a power of 2, please check your chip's spec sheet"); - -#endif - -static bool eeprom_data_written = false; - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(E2END + 1) -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { - - #if ENABLED(FLASH_EEPROM_LEVELING) - - if (current_slot == -1 || eeprom_data_written) { - // This must be the first time since power on that we have accessed the storage, or someone - // loaded and called write_data and never called access_finish. - // Lets go looking for the slot that holds our configuration. - if (eeprom_data_written) DEBUG_ECHOLN("Dangling EEPROM write_data"); - uint32_t address = FLASH_ADDRESS_START; - while (address <= FLASH_ADDRESS_END) { - uint32_t address_value = (*(__IO uint32_t*)address); - if (address_value != EMPTY_UINT32) { - current_slot = (address - (FLASH_ADDRESS_START)) / (MARLIN_EEPROM_SIZE); - break; - } - address += sizeof(uint32_t); - } - if (current_slot == -1) { - // We didn't find anything, so we'll just intialize to empty - for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EMPTY_UINT8; - current_slot = EEPROM_SLOTS; - } - else { - // load current settings - uint8_t *eeprom_data = (uint8_t *)SLOT_ADDRESS(current_slot); - for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i]; - DEBUG_ECHOLNPAIR("EEPROM loaded from slot ", current_slot, "."); - } - eeprom_data_written = false; - } - - #else - eeprom_buffer_fill(); - #endif - - return true; -} - -bool PersistentStore::access_finish() { - - if (eeprom_data_written) { - #ifdef STM32F4xx - // MCU may come up with flash error bits which prevent some flash operations. - // Clear flags prior to flash operations to prevent errors. - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); - #endif - - #if ENABLED(FLASH_EEPROM_LEVELING) - - HAL_StatusTypeDef status = HAL_ERROR; - bool flash_unlocked = false; - - if (--current_slot < 0) { - // all slots have been used, erase everything and start again - - FLASH_EraseInitTypeDef EraseInitStruct; - uint32_t SectorError = 0; - - EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; - EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; - EraseInitStruct.Sector = FLASH_SECTOR; - EraseInitStruct.NbSectors = 1; - - current_slot = EEPROM_SLOTS - 1; - UNLOCK_FLASH(); - - PAUSE_SERVO_OUTPUT(); - DISABLE_ISRS(); - status = HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError); - ENABLE_ISRS(); - RESUME_SERVO_OUTPUT(); - if (status != HAL_OK) { - DEBUG_ECHOLNPAIR("HAL_FLASHEx_Erase=", status); - DEBUG_ECHOLNPAIR("GetError=", HAL_FLASH_GetError()); - DEBUG_ECHOLNPAIR("SectorError=", SectorError); - LOCK_FLASH(); - return false; - } - } - - UNLOCK_FLASH(); - - uint32_t offset = 0; - uint32_t address = SLOT_ADDRESS(current_slot); - uint32_t address_end = address + MARLIN_EEPROM_SIZE; - uint32_t data = 0; - - bool success = true; - - while (address < address_end) { - memcpy(&data, ram_eeprom + offset, sizeof(uint32_t)); - status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data); - if (status == HAL_OK) { - address += sizeof(uint32_t); - offset += sizeof(uint32_t); - } - else { - DEBUG_ECHOLNPAIR("HAL_FLASH_Program=", status); - DEBUG_ECHOLNPAIR("GetError=", HAL_FLASH_GetError()); - DEBUG_ECHOLNPAIR("address=", address); - success = false; - break; - } - } - - LOCK_FLASH(); - - if (success) { - eeprom_data_written = false; - DEBUG_ECHOLNPAIR("EEPROM saved to slot ", current_slot, "."); - } - - return success; - - #else - // The following was written for the STM32F4 but may work with other MCUs as well. - // Most STM32F4 flash does not allow reading from flash during erase operations. - // This takes about a second on a STM32F407 with a 128kB sector used as EEPROM. - // Interrupts during this time can have unpredictable results, such as killing Servo - // output. Servo output still glitches with interrupts disabled, but recovers after the - // erase. - PAUSE_SERVO_OUTPUT(); - DISABLE_ISRS(); - eeprom_buffer_flush(); - ENABLE_ISRS(); - RESUME_SERVO_OUTPUT(); - - eeprom_data_written = false; - #endif - } - - return true; -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t v = *value; - #if ENABLED(FLASH_EEPROM_LEVELING) - if (v != ram_eeprom[pos]) { - ram_eeprom[pos] = v; - eeprom_data_written = true; - } - #else - if (v != eeprom_buffered_read_byte(pos)) { - eeprom_buffered_write_byte(pos, v); - eeprom_data_written = true; - } - #endif - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - const uint8_t c = TERN(FLASH_EEPROM_LEVELING, ram_eeprom[pos], eeprom_buffered_read_byte(pos)); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // FLASH_EEPROM_EMULATION -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp deleted file mode 100644 index 711a83ed5b..0000000000 --- a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Implementation of EEPROM settings in SD Card - */ - -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDCARD_EEPROM_EMULATION) - -#include "../shared/eeprom_api.h" -#include "../../sd/cardreader.h" - -#define EEPROM_FILENAME "eeprom.dat" - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -#define _ALIGN(x) __attribute__ ((aligned(x))) -static char _ALIGN(4) HAL_eeprom_data[MARLIN_EEPROM_SIZE]; - -bool PersistentStore::access_start() { - if (!card.isMounted()) return false; - - SdFile file, root = card.getroot(); - if (!file.open(&root, EEPROM_FILENAME, O_RDONLY)) - return true; - - int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE); - if (bytes_read < 0) return false; - for (; bytes_read < MARLIN_EEPROM_SIZE; bytes_read++) - HAL_eeprom_data[bytes_read] = 0xFF; - file.close(); - return true; -} - -bool PersistentStore::access_finish() { - if (!card.isMounted()) return false; - - SdFile file, root = card.getroot(); - int bytes_written = 0; - if (file.open(&root, EEPROM_FILENAME, O_CREAT | O_WRITE | O_TRUNC)) { - bytes_written = file.write(HAL_eeprom_data, MARLIN_EEPROM_SIZE); - file.close(); - } - return (bytes_written == MARLIN_EEPROM_SIZE); -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - for (size_t i = 0; i < size; i++) - HAL_eeprom_data[pos + i] = value[i]; - crc16(crc, value, size); - pos += size; - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { - for (size_t i = 0; i < size; i++) { - uint8_t c = HAL_eeprom_data[pos + i]; - if (writing) value[i] = c; - crc16(crc, &c, 1); - } - pos += size; - return false; -} - -#endif // SDCARD_EEPROM_EMULATION -#endif // STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/eeprom_sram.cpp b/Marlin/src/HAL/STM32/eeprom_sram.cpp deleted file mode 100644 index 5f6f26f9c6..0000000000 --- a/Marlin/src/HAL/STM32/eeprom_sram.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SRAM_EEPROM_EMULATION) - -#include "../shared/eeprom_if.h" -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t v = *value; - - // Save to Backup SRAM - *(__IO uint8_t *)(BKPSRAM_BASE + (uint8_t * const)pos) = v; - - crc16(crc, &v, 1); - pos++; - value++; - }; - - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - // Read from either external EEPROM, program flash or Backup SRAM - const uint8_t c = ( *(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)) ); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // SRAM_EEPROM_EMULATION -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/eeprom_wired.cpp b/Marlin/src/HAL/STM32/eeprom_wired.cpp deleted file mode 100644 index 8c46e45f03..0000000000 --- a/Marlin/src/HAL/STM32/eeprom_wired.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -/** - * PersistentStore for Arduino-style EEPROM interface - * with simple implementations supplied by Marlin. - */ - -#include "../shared/eeprom_if.h" -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(E2END + 1) -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { eeprom_init(); return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t v = *value; - - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - uint8_t * const p = (uint8_t * const)pos; - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - - crc16(crc, &v, 1); - pos++; - value++; - }; - - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - // Read from either external EEPROM, program flash or Backup SRAM - const uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/endstop_interrupts.h b/Marlin/src/HAL/STM32/endstop_interrupts.h deleted file mode 100644 index fdff8cc644..0000000000 --- a/Marlin/src/HAL/STM32/endstop_interrupts.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); -} diff --git a/Marlin/src/HAL/STM32/fastio.cpp b/Marlin/src/HAL/STM32/fastio.cpp deleted file mode 100644 index 0d55579d88..0000000000 --- a/Marlin/src/HAL/STM32/fastio.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -GPIO_TypeDef* FastIOPortMap[LastPort + 1]; - -void FastIO_init() { - LOOP_L_N(i, NUM_DIGITAL_PINS) - FastIOPortMap[STM_PORT(digitalPin[i])] = get_GPIO_Port(STM_PORT(digitalPin[i])); -} - -#endif diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h deleted file mode 100644 index ea28b8f3bf..0000000000 --- a/Marlin/src/HAL/STM32/fastio.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O interfaces for STM32 - * These use GPIO register access for fast port manipulation. - */ - -// ------------------------ -// Public Variables -// ------------------------ - -extern GPIO_TypeDef * FastIOPortMap[]; - -// ------------------------ -// Public functions -// ------------------------ - -void FastIO_init(); // Must be called before using fast io macros - -// ------------------------ -// Defines -// ------------------------ - -#define _BV32(b) (1UL << (b)) - -#ifndef PWM - #define PWM OUTPUT -#endif - -#if defined(STM32F0xx) || defined(STM32F1xx) || defined(STM32F3xx) || defined(STM32L0xx) || defined(STM32L4xx) - #define _WRITE(IO, V) do { \ - if (V) FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BSRR = _BV32(STM_PIN(digitalPinToPinName(IO))) ; \ - else FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BRR = _BV32(STM_PIN(digitalPinToPinName(IO))) ; \ - }while(0) -#else - #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BSRR = _BV32(STM_PIN(digitalPinToPinName(IO)) + ((V) ? 0 : 16))) -#endif - -#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->IDR, _BV32(STM_PIN(digitalPinToPinName(IO))))) -#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->ODR ^= _BV32(STM_PIN(digitalPinToPinName(IO)))) - -#define _GET_MODE(IO) -#define _SET_MODE(IO,M) pinMode(IO, M) -#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) //!< Output Push Pull Mode & GPIO_NOPULL -#define _SET_OUTPUT_OD(IO) pinMode(IO, OUTPUT_OPEN_DRAIN) - -#define WRITE(IO,V) _WRITE(IO,V) -#define READ(IO) _READ(IO) -#define TOGGLE(IO) _TOGGLE(IO) - -#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) -#define OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0) - -#define SET_INPUT(IO) _SET_MODE(IO, INPUT) //!< Input Floating Mode -#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) //!< Input with Pull-up activation -#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) //!< Input with Pull-down activation -#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) -#define SET_PWM(IO) _SET_MODE(IO, PWM) - -#define IS_INPUT(IO) -#define IS_OUTPUT(IO) - -#define PWM_PIN(P) digitalPinHasPWM(P) -#define NO_COMPILE_TIME_PWM - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_post.h b/Marlin/src/HAL/STM32/inc/Conditionals_post.h deleted file mode 100644 index 18826e11d2..0000000000 --- a/Marlin/src/HAL/STM32/inc/Conditionals_post.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// If no real or emulated EEPROM selected, fall back to SD emulation -#if USE_FALLBACK_EEPROM - #define SDCARD_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) - #define USE_SHARED_EEPROM 1 -#endif diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h deleted file mode 100644 index 30d0750d90..0000000000 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test STM32-specific configuration values for errors at compile-time. - */ -//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) -// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" -//#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32." -#endif - -#if ENABLED(SDCARD_EEPROM_EMULATION) && DISABLED(SDSUPPORT) - #undef SDCARD_EEPROM_EMULATION // Avoid additional error noise - #if USE_FALLBACK_EEPROM - #warning "EEPROM type not specified. Fallback is SDCARD_EEPROM_EMULATION." - #endif - #error "SDCARD_EEPROM_EMULATION requires SDSUPPORT. Enable SDSUPPORT or choose another EEPROM emulation." -#endif - -#if defined(STM32F4xx) && BOTH(PRINTCOUNTER, FLASH_EEPROM_EMULATION) - #warning "FLASH_EEPROM_EMULATION may cause long delays when writing and should not be used while printing." - #error "Disable PRINTCOUNTER or choose another EEPROM emulation." -#endif - -#if !defined(STM32F4xx) && ENABLED(FLASH_EEPROM_LEVELING) - #error "FLASH_EEPROM_LEVELING is currently only supported on STM32F4 hardware." -#endif - -#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." -#elif ENABLED(SERIAL_STATS_DROPPED_RX) - #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." -#endif diff --git a/Marlin/src/HAL/STM32/pinsDebug.h b/Marlin/src/HAL/STM32/pinsDebug.h deleted file mode 100644 index ec08e3fd75..0000000000 --- a/Marlin/src/HAL/STM32/pinsDebug.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if !(defined(NUM_DIGITAL_PINS) || defined(BOARD_NR_GPIO_PINS)) - #error "M43 not supported for this board" -#endif - -// Strange - STM32F4 comes to HAL_STM32 rather than HAL_STM32F4 for these files -#ifdef STM32F4 - #ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) - #include "pinsDebug_STM32duino.h" - #elif defined(BOARD_NR_GPIO_PINS) // Only in STM32GENERIC (Maple) - #include "pinsDebug_STM32GENERIC.h" - #else - #error "M43 not supported for this board" - #endif -#endif diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h b/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h deleted file mode 100644 index 9069d9f7bd..0000000000 --- a/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Support routines for STM32GENERIC (Maple) - */ - -/** - * Translation of routines & variables used by pinsDebug.h - */ - -#ifdef BOARD_NR_GPIO_PINS // Only in STM32GENERIC (Maple) - -#ifdef __STM32F1__ - #include "../STM32F1/fastio.h" -#elif defined(STM32F4) || defined(STM32F7) - #include "../STM32_F4_F7/fastio.h" -#else - #include "fastio.h" -#endif - -extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS]; - -#define NUM_DIGITAL_PINS BOARD_NR_GPIO_PINS -#define NUMBER_PINS_TOTAL BOARD_NR_GPIO_PINS -#define VALID_PIN(pin) (pin >= 0 && pin < BOARD_NR_GPIO_PINS) -#define GET_ARRAY_PIN(p) pin_t(pin_array[p].pin) -#define pwm_status(pin) PWM_PIN(pin) -#define digitalRead_mod(p) extDigitalRead(p) -#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3hd "), int16_t(p)); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PORT(p) print_port(p) -#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define MULTI_NAME_PAD 21 // space needed to be pretty if not first name assigned to a pin - -// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities -#ifndef M43_NEVER_TOUCH - #define M43_NEVER_TOUCH(Q) (Q >= 9 && Q <= 12) // SERIAL/USB pins PA9(TX) PA10(RX) -#endif - -static inline int8_t get_pin_mode(pin_t pin) { - return VALID_PIN(pin) ? _GET_MODE(pin) : -1; -} - -static inline pin_t DIGITAL_PIN_TO_ANALOG_PIN(pin_t pin) { - if (!VALID_PIN(pin)) return -1; - int8_t adc_channel = int8_t(PIN_MAP[pin].adc_channel); - #ifdef NUM_ANALOG_INPUTS - if (adc_channel >= NUM_ANALOG_INPUTS) adc_channel = ADCx; - #endif - return pin_t(adc_channel); -} - -static inline bool IS_ANALOG(pin_t pin) { - if (!VALID_PIN(pin)) return false; - if (PIN_MAP[pin].adc_channel != ADCx) { - #ifdef NUM_ANALOG_INPUTS - if (PIN_MAP[pin].adc_channel >= NUM_ANALOG_INPUTS) return false; - #endif - return _GET_MODE(pin) == GPIO_INPUT_ANALOG && !M43_NEVER_TOUCH(pin); - } - return false; -} - -static inline bool GET_PINMODE(const pin_t pin) { - return VALID_PIN(pin) && !IS_INPUT(pin); -} - -static inline bool GET_ARRAY_IS_DIGITAL(const int16_t array_pin) { - const pin_t pin = GET_ARRAY_PIN(array_pin); - return (!IS_ANALOG(pin) - #ifdef NUM_ANALOG_INPUTS - || PIN_MAP[pin].adc_channel >= NUM_ANALOG_INPUTS - #endif - ); -} - -#include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density - -static inline void pwm_details(const pin_t pin) { - if (PWM_PIN(pin)) { - timer_dev * const tdev = PIN_MAP[pin].timer_device; - const uint8_t channel = PIN_MAP[pin].timer_channel; - const char num = ( - #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) - tdev == &timer8 ? '8' : - tdev == &timer5 ? '5' : - #endif - tdev == &timer4 ? '4' : - tdev == &timer3 ? '3' : - tdev == &timer2 ? '2' : - tdev == &timer1 ? '1' : '?' - ); - char buffer[10]; - sprintf_P(buffer, PSTR(" TIM%c CH%c"), num, ('0' + channel)); - SERIAL_ECHO(buffer); - } -} - -static inline void print_port(pin_t pin) { - const char port = 'A' + char(pin >> 4); // pin div 16 - const int16_t gbit = PIN_MAP[pin].gpio_bit; - char buffer[8]; - sprintf_P(buffer, PSTR("P%c%hd "), port, gbit); - if (gbit < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(buffer); -} - -#endif // BOARD_NR_GPIO_PINS diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h b/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h deleted file mode 100644 index 71480153a7..0000000000 --- a/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h +++ /dev/null @@ -1,273 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -#ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) - -/** - * Life gets complicated if you want an easy to use 'M43 I' output (in port/pin order) - * because the variants in this platform do not always define all the I/O port/pins - * that a CPU has. - * - * VARIABLES: - * Ard_num - Arduino pin number - defined by the platform. It is used by digitalRead and - * digitalWrite commands and by M42. - * - does not contain port/pin info - * - is not in port/pin order - * - typically a variant will only assign Ard_num to port/pins that are actually used - * Index - M43 counter - only used to get Ard_num - * x - a parameter/argument used to search the pin_array to try to find a signal name - * associated with a Ard_num - * Port_pin - port number and pin number for use with CPU registers and printing reports - * - * Since M43 uses digitalRead and digitalWrite commands, only the Port_pins with an Ard_num - * are accessed and/or displayed. - * - * Three arrays are used. - * - * digitalPin[] is provided by the platform. It consists of the Port_pin numbers in - * Arduino pin number order. - * - * pin_array is a structure generated by the pins/pinsDebug.h header file. It is generated by - * the preprocessor. Only the signals associated with enabled options are in this table. - * It contains: - * - name of the signal - * - the Ard_num assigned by the pins_YOUR_BOARD.h file using the platform defines. - * EXAMPLE: "#define KILL_PIN PB1" results in Ard_num of 57. 57 is then used as the - * argument to digitalPinToPinName(IO) to get the Port_pin number - * - if it is a digital or analog signal. PWMs are considered digital here. - * - * pin_xref is a structure generated by this header file. It is generated by the - * preprocessor. It is in port/pin order. It contains just the port/pin numbers defined by the - * platform for this variant. - * - Ard_num - * - printable version of Port_pin - * - * Routines with an "x" as a parameter/argument are used to search the pin_array to try to - * find a signal name associated with a port/pin. - * - * NOTE - the Arduino pin number is what is used by the M42 command, NOT the port/pin for that - * signal. The Arduino pin number is listed by the M43 I command. - */ - -//////////////////////////////////////////////////////// -// -// make a list of the Arduino pin numbers in the Port/Pin order -// - -#define _PIN_ADD_2(NAME_ALPHA, ARDUINO_NUM) { {NAME_ALPHA}, ARDUINO_NUM }, -#define _PIN_ADD(NAME_ALPHA, ARDUINO_NUM) { NAME_ALPHA, ARDUINO_NUM }, -#define PIN_ADD(NAME) _PIN_ADD(#NAME, NAME) - -typedef struct { - char Port_pin_alpha[5]; - pin_t Ard_num; -} XrefInfo; - -const XrefInfo pin_xref[] PROGMEM = { - #include "pins_Xref.h" -}; - -//////////////////////////////////////////////////////////// - -#define MODE_PIN_INPUT 0 // Input mode (reset state) -#define MODE_PIN_OUTPUT 1 // General purpose output mode -#define MODE_PIN_ALT 2 // Alternate function mode -#define MODE_PIN_ANALOG 3 // Analog mode - -#define PIN_NUM(P) (P & 0x000F) -#define PIN_NUM_ALPHA_LEFT(P) (((P & 0x000F) < 10) ? ('0' + (P & 0x000F)) : '1') -#define PIN_NUM_ALPHA_RIGHT(P) (((P & 0x000F) > 9) ? ('0' + (P & 0x000F) - 10) : 0 ) -#define PORT_NUM(P) ((P >> 4) & 0x0007) -#define PORT_ALPHA(P) ('A' + (P >> 4)) - -/** - * Translation of routines & variables used by pinsDebug.h - */ -#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define VALID_PIN(ANUM) ((ANUM) >= 0 && (ANUM) < NUMBER_PINS_TOTAL) -#define digitalRead_mod(Ard_num) extDigitalRead(Ard_num) // must use Arduino pin numbers when doing reads -#define PRINT_PIN(Q) -#define PRINT_PORT(ANUM) port_print(ANUM) -#define DIGITAL_PIN_TO_ANALOG_PIN(ANUM) -1 // will report analog pin number in the print port routine -#define GET_PIN_MAP_PIN_M43(Index) pin_xref[Index].Ard_num - -// x is a variable used to search pin_array -#define GET_ARRAY_IS_DIGITAL(x) ((bool) pin_array[x].is_digital) -#define GET_ARRAY_PIN(x) ((pin_t) pin_array[x].pin) -#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin - -#ifndef M43_NEVER_TOUCH - #define _M43_NEVER_TOUCH(Index) (Index >= 9 && Index <= 12) // SERIAL/USB pins: PA9(TX) PA10(RX) PA11(USB_DM) PA12(USB_DP) - #ifdef KILL_PIN - #define M43_NEVER_TOUCH(Index) m43_never_touch(Index) - - bool m43_never_touch(const pin_t Index) { - static pin_t M43_kill_index = -1; - if (M43_kill_index < 0) - for (M43_kill_index = 0; M43_kill_index < NUMBER_PINS_TOTAL; M43_kill_index++) - if (KILL_PIN == GET_PIN_MAP_PIN_M43(M43_kill_index)) break; - return _M43_NEVER_TOUCH(Index) || Index == M43_kill_index; // KILL_PIN and SERIAL/USB - } - #else - #define M43_NEVER_TOUCH(Index) _M43_NEVER_TOUCH(Index) - #endif -#endif - -uint8_t get_pin_mode(const pin_t Ard_num) { - uint32_t mode_all = 0; - const PinName dp = digitalPinToPinName(Ard_num); - switch (PORT_ALPHA(dp)) { - case 'A' : mode_all = GPIOA->MODER; break; - case 'B' : mode_all = GPIOB->MODER; break; - case 'C' : mode_all = GPIOC->MODER; break; - case 'D' : mode_all = GPIOD->MODER; break; - #ifdef PE_0 - case 'E' : mode_all = GPIOE->MODER; break; - #elif defined(PF_0) - case 'F' : mode_all = GPIOF->MODER; break; - #elif defined(PG_0) - case 'G' : mode_all = GPIOG->MODER; break; - #elif defined(PH_0) - case 'H' : mode_all = GPIOH->MODER; break; - #elif defined(PI_0) - case 'I' : mode_all = GPIOI->MODER; break; - #elif defined(PJ_0) - case 'J' : mode_all = GPIOJ->MODER; break; - #elif defined(PK_0) - case 'K' : mode_all = GPIOK->MODER; break; - #elif defined(PL_0) - case 'L' : mode_all = GPIOL->MODER; break; - #endif - } - return (mode_all >> (2 * uint8_t(PIN_NUM(dp)))) & 0x03; -} - -bool GET_PINMODE(const pin_t Ard_num) { - const uint8_t pin_mode = get_pin_mode(Ard_num); - return pin_mode == MODE_PIN_OUTPUT || pin_mode == MODE_PIN_ALT; // assume all alt definitions are PWM -} - -int8_t digital_pin_to_analog_pin(pin_t Ard_num) { - Ard_num -= NUM_ANALOG_FIRST; - return (Ard_num >= 0 && Ard_num < NUM_ANALOG_INPUTS) ? Ard_num : -1; -} - -bool IS_ANALOG(const pin_t Ard_num) { - return get_pin_mode(Ard_num) == MODE_PIN_ANALOG; -} - -bool is_digital(const pin_t x) { - const uint8_t pin_mode = get_pin_mode(pin_array[x].pin); - return pin_mode == MODE_PIN_INPUT || pin_mode == MODE_PIN_OUTPUT; -} - -void port_print(const pin_t Ard_num) { - char buffer[16]; - pin_t Index; - for (Index = 0; Index < NUMBER_PINS_TOTAL; Index++) - if (Ard_num == GET_PIN_MAP_PIN_M43(Index)) break; - - const char * ppa = pin_xref[Index].Port_pin_alpha; - sprintf_P(buffer, PSTR("%s"), ppa); - SERIAL_ECHO(buffer); - if (ppa[3] == '\0') SERIAL_CHAR(' '); - - // print analog pin number - const int8_t Port_pin = digital_pin_to_analog_pin(Ard_num); - if (Port_pin >= 0) { - sprintf_P(buffer, PSTR(" (A%d) "), Port_pin); - SERIAL_ECHO(buffer); - if (Port_pin < 10) SERIAL_CHAR(' '); - } - else - SERIAL_ECHO_SP(7); - - // Print number to be used with M42 - sprintf_P(buffer, PSTR(" M42 P%d "), Ard_num); - SERIAL_ECHO(buffer); - if (Ard_num < 10) SERIAL_CHAR(' '); - if (Ard_num < 100) SERIAL_CHAR(' '); -} - -bool pwm_status(const pin_t Ard_num) { - return get_pin_mode(Ard_num) == MODE_PIN_ALT; -} - -void pwm_details(const pin_t Ard_num) { - if (pwm_status(Ard_num)) { - uint32_t alt_all = 0; - const PinName dp = digitalPinToPinName(Ard_num); - pin_t pin_number = uint8_t(PIN_NUM(dp)); - const bool over_7 = pin_number >= 8; - const uint8_t ind = over_7 ? 1 : 0; - switch (PORT_ALPHA(dp)) { // get alt function - case 'A' : alt_all = GPIOA->AFR[ind]; break; - case 'B' : alt_all = GPIOB->AFR[ind]; break; - case 'C' : alt_all = GPIOC->AFR[ind]; break; - case 'D' : alt_all = GPIOD->AFR[ind]; break; - #ifdef PE_0 - case 'E' : alt_all = GPIOE->AFR[ind]; break; - #elif defined (PF_0) - case 'F' : alt_all = GPIOF->AFR[ind]; break; - #elif defined (PG_0) - case 'G' : alt_all = GPIOG->AFR[ind]; break; - #elif defined (PH_0) - case 'H' : alt_all = GPIOH->AFR[ind]; break; - #elif defined (PI_0) - case 'I' : alt_all = GPIOI->AFR[ind]; break; - #elif defined (PJ_0) - case 'J' : alt_all = GPIOJ->AFR[ind]; break; - #elif defined (PK_0) - case 'K' : alt_all = GPIOK->AFR[ind]; break; - #elif defined (PL_0) - case 'L' : alt_all = GPIOL->AFR[ind]; break; - #endif - } - if (over_7) pin_number -= 8; - - uint8_t alt_func = (alt_all >> (4 * pin_number)) & 0x0F; - SERIAL_ECHOPAIR("Alt Function: ", alt_func); - if (alt_func < 10) SERIAL_CHAR(' '); - SERIAL_ECHOPGM(" - "); - switch (alt_func) { - case 0 : SERIAL_ECHOPGM("system (misc. I/O)"); break; - case 1 : SERIAL_ECHOPGM("TIM1/TIM2 (probably PWM)"); break; - case 2 : SERIAL_ECHOPGM("TIM3..5 (probably PWM)"); break; - case 3 : SERIAL_ECHOPGM("TIM8..11 (probably PWM)"); break; - case 4 : SERIAL_ECHOPGM("I2C1..3"); break; - case 5 : SERIAL_ECHOPGM("SPI1/SPI2"); break; - case 6 : SERIAL_ECHOPGM("SPI3"); break; - case 7 : SERIAL_ECHOPGM("USART1..3"); break; - case 8 : SERIAL_ECHOPGM("USART4..6"); break; - case 9 : SERIAL_ECHOPGM("CAN1/CAN2, TIM12..14 (probably PWM)"); break; - case 10 : SERIAL_ECHOPGM("OTG"); break; - case 11 : SERIAL_ECHOPGM("ETH"); break; - case 12 : SERIAL_ECHOPGM("FSMC, SDIO, OTG"); break; - case 13 : SERIAL_ECHOPGM("DCMI"); break; - case 14 : SERIAL_ECHOPGM("unused (shouldn't see this)"); break; - case 15 : SERIAL_ECHOPGM("EVENTOUT"); break; - } - } -} // pwm_details - -#endif // NUM_DIGITAL_PINS diff --git a/Marlin/src/HAL/STM32/pins_Xref.h b/Marlin/src/HAL/STM32/pins_Xref.h deleted file mode 100644 index 890e561860..0000000000 --- a/Marlin/src/HAL/STM32/pins_Xref.h +++ /dev/null @@ -1,612 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// make a list of the Arduino pin numbers in the Port/Pin order -// -#ifdef PA0 - PIN_ADD(PA0) -#endif -#ifdef PA1 - PIN_ADD(PA1) -#endif -#ifdef PA2 - PIN_ADD(PA2) -#endif -#ifdef PA3 - PIN_ADD(PA3) -#endif -#ifdef PA4 - PIN_ADD(PA4) -#endif -#ifdef PA5 - PIN_ADD(PA5) -#endif -#ifdef PA6 - PIN_ADD(PA6) -#endif -#ifdef PA7 - PIN_ADD(PA7) -#endif -#ifdef PA8 - PIN_ADD(PA8) -#endif -#ifdef PA9 - PIN_ADD(PA9) -#endif -#ifdef PA10 - PIN_ADD(PA10) -#endif -#ifdef PA11 - PIN_ADD(PA11) -#endif -#ifdef PA12 - PIN_ADD(PA12) -#endif -#ifdef PA13 - PIN_ADD(PA13) -#endif -#ifdef PA14 - PIN_ADD(PA14) -#endif -#ifdef PA15 - PIN_ADD(PA15) -#endif - -#ifdef PB0 - PIN_ADD(PB0) -#endif -#ifdef PB1 - PIN_ADD(PB1) -#endif -#ifdef PB2 - PIN_ADD(PB2) -#endif -#ifdef PB3 - PIN_ADD(PB3) -#endif -#ifdef PB4 - PIN_ADD(PB4) -#endif -#ifdef PB5 - PIN_ADD(PB5) -#endif -#ifdef PB6 - PIN_ADD(PB6) -#endif -#ifdef PB7 - PIN_ADD(PB7) -#endif -#ifdef PB8 - PIN_ADD(PB8) -#endif -#ifdef PB9 - PIN_ADD(PB9) -#endif -#ifdef PB10 - PIN_ADD(PB10) -#endif -#ifdef PB11 - PIN_ADD(PB11) -#endif -#ifdef PB12 - PIN_ADD(PB12) -#endif -#ifdef PB13 - PIN_ADD(PB13) -#endif -#ifdef PB14 - PIN_ADD(PB14) -#endif -#ifdef PB15 - PIN_ADD(PB15) -#endif - -#ifdef PC0 - PIN_ADD(PC0) -#endif -#ifdef PC1 - PIN_ADD(PC1) -#endif -#ifdef PC2 - PIN_ADD(PC2) -#endif -#ifdef PC3 - PIN_ADD(PC3) -#endif -#ifdef PC4 - PIN_ADD(PC4) -#endif -#ifdef PC5 - PIN_ADD(PC5) -#endif -#ifdef PC6 - PIN_ADD(PC6) -#endif -#ifdef PC7 - PIN_ADD(PC7) -#endif -#ifdef PC8 - PIN_ADD(PC8) -#endif -#ifdef PC9 - PIN_ADD(PC9) -#endif -#ifdef PC10 - PIN_ADD(PC10) -#endif -#ifdef PC11 - PIN_ADD(PC11) -#endif -#ifdef PC12 - PIN_ADD(PC12) -#endif -#ifdef PC13 - PIN_ADD(PC13) -#endif -#ifdef PC14 - PIN_ADD(PC14) -#endif -#ifdef PC15 - PIN_ADD(PC15) -#endif - -#ifdef PD0 - PIN_ADD(PD0) -#endif -#ifdef PD1 - PIN_ADD(PD1) -#endif -#ifdef PD2 - PIN_ADD(PD2) -#endif -#ifdef PD3 - PIN_ADD(PD3) -#endif -#ifdef PD4 - PIN_ADD(PD4) -#endif -#ifdef PD5 - PIN_ADD(PD5) -#endif -#ifdef PD6 - PIN_ADD(PD6) -#endif -#ifdef PD7 - PIN_ADD(PD7) -#endif -#ifdef PD8 - PIN_ADD(PD8) -#endif -#ifdef PD9 - PIN_ADD(PD9) -#endif -#ifdef PD10 - PIN_ADD(PD10) -#endif -#ifdef PD11 - PIN_ADD(PD11) -#endif -#ifdef PD12 - PIN_ADD(PD12) -#endif -#ifdef PD13 - PIN_ADD(PD13) -#endif -#ifdef PD14 - PIN_ADD(PD14) -#endif -#ifdef PD15 - PIN_ADD(PD15) -#endif - -#ifdef PE0 - PIN_ADD(PE0) -#endif -#ifdef PE1 - PIN_ADD(PE1) -#endif -#ifdef PE2 - PIN_ADD(PE2) -#endif -#ifdef PE3 - PIN_ADD(PE3) -#endif -#ifdef PE4 - PIN_ADD(PE4) -#endif -#ifdef PE5 - PIN_ADD(PE5) -#endif -#ifdef PE6 - PIN_ADD(PE6) -#endif -#ifdef PE7 - PIN_ADD(PE7) -#endif -#ifdef PE8 - PIN_ADD(PE8) -#endif -#ifdef PE9 - PIN_ADD(PE9) -#endif -#ifdef PE10 - PIN_ADD(PE10) -#endif -#ifdef PE11 - PIN_ADD(PE11) -#endif -#ifdef PE12 - PIN_ADD(PE12) -#endif -#ifdef PE13 - PIN_ADD(PE13) -#endif -#ifdef PE14 - PIN_ADD(PE14) -#endif -#ifdef PE15 - PIN_ADD(PE15) -#endif - -#ifdef PF0 - PIN_ADD(PF0) -#endif -#ifdef PF1 - PIN_ADD(PF1) -#endif -#ifdef PF2 - PIN_ADD(PF2) -#endif -#ifdef PF3 - PIN_ADD(PF3) -#endif -#ifdef PF4 - PIN_ADD(PF4) -#endif -#ifdef PF5 - PIN_ADD(PF5) -#endif -#ifdef PF6 - PIN_ADD(PF6) -#endif -#ifdef PF7 - PIN_ADD(PF7) -#endif -#ifdef PF8 - PIN_ADD(PF8) -#endif -#ifdef PF9 - PIN_ADD(PF9) -#endif -#ifdef PF10 - PIN_ADD(PF10) -#endif -#ifdef PF11 - PIN_ADD(PF11) -#endif -#ifdef PF12 - PIN_ADD(PF12) -#endif -#ifdef PF13 - PIN_ADD(PF13) -#endif -#ifdef PF14 - PIN_ADD(PF14) -#endif -#ifdef PF15 - PIN_ADD(PF15) -#endif - -#ifdef PG0 - PIN_ADD(PG0) -#endif -#ifdef PG1 - PIN_ADD(PG1) -#endif -#ifdef PG2 - PIN_ADD(PG2) -#endif -#ifdef PG3 - PIN_ADD(PG3) -#endif -#ifdef PG4 - PIN_ADD(PG4) -#endif -#ifdef PG5 - PIN_ADD(PG5) -#endif -#ifdef PG6 - PIN_ADD(PG6) -#endif -#ifdef PG7 - PIN_ADD(PG7) -#endif -#ifdef PG8 - PIN_ADD(PG8) -#endif -#ifdef PG9 - PIN_ADD(PG9) -#endif -#ifdef PG10 - PIN_ADD(PG10) -#endif -#ifdef PG11 - PIN_ADD(PG11) -#endif -#ifdef PG12 - PIN_ADD(PG12) -#endif -#ifdef PG13 - PIN_ADD(PG13) -#endif -#ifdef PG14 - PIN_ADD(PG14) -#endif -#ifdef PG15 - PIN_ADD(PG15) -#endif - -#ifdef PH0 - PIN_ADD(PH0) -#endif -#ifdef PH1 - PIN_ADD(PH1) -#endif -#ifdef PH2 - PIN_ADD(PH2) -#endif -#ifdef PH3 - PIN_ADD(PH3) -#endif -#ifdef PH4 - PIN_ADD(PH4) -#endif -#ifdef PH5 - PIN_ADD(PH5) -#endif -#ifdef PH6 - PIN_ADD(PH6) -#endif -#ifdef PH7 - PIN_ADD(PH7) -#endif -#ifdef PH8 - PIN_ADD(PH8) -#endif -#ifdef PH9 - PIN_ADD(PH9) -#endif -#ifdef PH10 - PIN_ADD(PH10) -#endif -#ifdef PH11 - PIN_ADD(PH11) -#endif -#ifdef PH12 - PIN_ADD(PH12) -#endif -#ifdef PH13 - PIN_ADD(PH13) -#endif -#ifdef PH14 - PIN_ADD(PH14) -#endif -#ifdef PH15 - PIN_ADD(PH15) -#endif - -#ifdef PI0 - PIN_ADD(PI0) -#endif -#ifdef PI1 - PIN_ADD(PI1) -#endif -#ifdef PI2 - PIN_ADD(PI2) -#endif -#ifdef PI3 - PIN_ADD(PI3) -#endif -#ifdef PI4 - PIN_ADD(PI4) -#endif -#ifdef PI5 - PIN_ADD(PI5) -#endif -#ifdef PI6 - PIN_ADD(PI6) -#endif -#ifdef PI7 - PIN_ADD(PI7) -#endif -#ifdef PI8 - PIN_ADD(PI8) -#endif -#ifdef PI9 - PIN_ADD(PI9) -#endif -#ifdef PI10 - PIN_ADD(PI10) -#endif -#ifdef PI11 - PIN_ADD(PI11) -#endif -#ifdef PI12 - PIN_ADD(PI12) -#endif -#ifdef PI13 - PIN_ADD(PI13) -#endif -#ifdef PI14 - PIN_ADD(PI14) -#endif -#ifdef PI15 - PIN_ADD(PI15) -#endif - -#ifdef PJ0 - PIN_ADD(PJ0) -#endif -#ifdef PJ1 - PIN_ADD(PJ1) -#endif -#ifdef PJ2 - PIN_ADD(PJ2) -#endif -#ifdef PJ3 - PIN_ADD(PJ3) -#endif -#ifdef PJ4 - PIN_ADD(PJ4) -#endif -#ifdef PJ5 - PIN_ADD(PJ5) -#endif -#ifdef PJ6 - PIN_ADD(PJ6) -#endif -#ifdef PJ7 - PIN_ADD(PJ7) -#endif -#ifdef PJ8 - PIN_ADD(PJ8) -#endif -#ifdef PJ9 - PIN_ADD(PJ9) -#endif -#ifdef PJ10 - PIN_ADD(PJ10) -#endif -#ifdef PJ11 - PIN_ADD(PJ11) -#endif -#ifdef PJ12 - PIN_ADD(PJ12) -#endif -#ifdef PJ13 - PIN_ADD(PJ13) -#endif -#ifdef PJ14 - PIN_ADD(PJ14) -#endif -#ifdef PJ15 - PIN_ADD(PJ15) -#endif - -#ifdef PK0 - PIN_ADD(PK0) -#endif -#ifdef PK1 - PIN_ADD(PK1) -#endif -#ifdef PK2 - PIN_ADD(PK2) -#endif -#ifdef PK3 - PIN_ADD(PK3) -#endif -#ifdef PK4 - PIN_ADD(PK4) -#endif -#ifdef PK5 - PIN_ADD(PK5) -#endif -#ifdef PK6 - PIN_ADD(PK6) -#endif -#ifdef PK7 - PIN_ADD(PK7) -#endif -#ifdef PK8 - PIN_ADD(PK8) -#endif -#ifdef PK9 - PIN_ADD(PK9) -#endif -#ifdef PK10 - PIN_ADD(PK10) -#endif -#ifdef PK11 - PIN_ADD(PK11) -#endif -#ifdef PK12 - PIN_ADD(PK12) -#endif -#ifdef PK13 - PIN_ADD(PK13) -#endif -#ifdef PK14 - PIN_ADD(PK14) -#endif -#ifdef PK15 - PIN_ADD(PK15) -#endif - -#ifdef PL0 - PIN_ADD(PL0) -#endif -#ifdef PL1 - PIN_ADD(PL1) -#endif -#ifdef PL2 - PIN_ADD(PL2) -#endif -#ifdef PL3 - PIN_ADD(PL3) -#endif -#ifdef PL4 - PIN_ADD(PL4) -#endif -#ifdef PL5 - PIN_ADD(PL5) -#endif -#ifdef PL6 - PIN_ADD(PL6) -#endif -#ifdef PL7 - PIN_ADD(PL7) -#endif -#ifdef PL8 - PIN_ADD(PL8) -#endif -#ifdef PL9 - PIN_ADD(PL9) -#endif -#ifdef PL10 - PIN_ADD(PL10) -#endif -#ifdef PL11 - PIN_ADD(PL11) -#endif -#ifdef PL12 - PIN_ADD(PL12) -#endif -#ifdef PL13 - PIN_ADD(PL13) -#endif -#ifdef PL14 - PIN_ADD(PL14) -#endif -#ifdef PL15 - PIN_ADD(PL15) -#endif diff --git a/Marlin/src/HAL/STM32/spi_pins.h b/Marlin/src/HAL/STM32/spi_pins.h deleted file mode 100644 index 176e2a7b20..0000000000 --- a/Marlin/src/HAL/STM32/spi_pins.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Define SPI Pins: SCK, MISO, MOSI, SS - */ -#ifndef SCK_PIN - #define SCK_PIN PIN_SPI_SCK -#endif -#ifndef MISO_PIN - #define MISO_PIN PIN_SPI_MISO -#endif -#ifndef MOSI_PIN - #define MOSI_PIN PIN_SPI_MOSI -#endif -#ifndef SS_PIN - #define SS_PIN PIN_SPI_SS -#endif diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp deleted file mode 100644 index 3a080d5e27..0000000000 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_FSMC_TFT - -#include "tft_fsmc.h" -#include "pinconfig.h" - -SRAM_HandleTypeDef TFT_FSMC::SRAMx; -DMA_HandleTypeDef TFT_FSMC::DMAtx; -LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD; - -void TFT_FSMC::Init() { - uint32_t controllerAddress; - - #if PIN_EXISTS(TFT_RESET) - OUT_WRITE(TFT_RESET_PIN, HIGH); - HAL_Delay(100); - #endif - - #if PIN_EXISTS(TFT_BACKLIGHT) - OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); - #endif - - FSMC_NORSRAM_TimingTypeDef Timing, ExtTiming; - - uint32_t NSBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); - - SRAMx.Instance = FSMC_NORSRAM_DEVICE; - SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE; - /* SRAMx.Init */ - SRAMx.Init.NSBank = NSBank; - SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; - SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM; - SRAMx.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; - SRAMx.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; - SRAMx.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; - SRAMx.Init.WrapMode = FSMC_WRAP_MODE_DISABLE; - SRAMx.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; - SRAMx.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; - SRAMx.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE; - SRAMx.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE; - SRAMx.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; - SRAMx.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; - #ifdef STM32F4xx - SRAMx.Init.PageSize = FSMC_PAGE_SIZE_NONE; - #endif - /* Read Timing - relatively slow to ensure ID information is correctly read from TFT controller */ - /* Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss */ - Timing.AddressSetupTime = 15; - Timing.AddressHoldTime = 15; - Timing.DataSetupTime = 24; - Timing.BusTurnAroundDuration = 0; - Timing.CLKDivision = 16; - Timing.DataLatency = 17; - Timing.AccessMode = FSMC_ACCESS_MODE_A; - /* Write Timing */ - /* Can be decreases from 8-15-8 to 0-0-1 with risk of stability loss */ - ExtTiming.AddressSetupTime = 8; - ExtTiming.AddressHoldTime = 15; - ExtTiming.DataSetupTime = 8; - ExtTiming.BusTurnAroundDuration = 0; - ExtTiming.CLKDivision = 16; - ExtTiming.DataLatency = 17; - ExtTiming.AccessMode = FSMC_ACCESS_MODE_A; - - __HAL_RCC_FSMC_CLK_ENABLE(); - - for (uint16_t i = 0; PinMap_FSMC[i].pin != NC; i++) - pinmap_pinout(PinMap_FSMC[i].pin, PinMap_FSMC); - pinmap_pinout(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); - pinmap_pinout(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); - - controllerAddress = FSMC_BANK1_1; - #ifdef PF0 - switch (NSBank) { - case FSMC_NORSRAM_BANK2: controllerAddress = FSMC_BANK1_2 ; break; - case FSMC_NORSRAM_BANK3: controllerAddress = FSMC_BANK1_3 ; break; - case FSMC_NORSRAM_BANK4: controllerAddress = FSMC_BANK1_4 ; break; - } - #endif - - controllerAddress |= (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); - - HAL_SRAM_Init(&SRAMx, &Timing, &ExtTiming); - - __HAL_RCC_DMA2_CLK_ENABLE(); - - #ifdef STM32F1xx - DMAtx.Instance = DMA2_Channel1; - #elif defined(STM32F4xx) - DMAtx.Instance = DMA2_Stream0; - DMAtx.Init.Channel = DMA_CHANNEL_0; - DMAtx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; - DMAtx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - DMAtx.Init.MemBurst = DMA_MBURST_SINGLE; - DMAtx.Init.PeriphBurst = DMA_PBURST_SINGLE; - #endif - - DMAtx.Init.Direction = DMA_MEMORY_TO_MEMORY; - DMAtx.Init.MemInc = DMA_MINC_DISABLE; - DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; - DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; - DMAtx.Init.Mode = DMA_NORMAL; - DMAtx.Init.Priority = DMA_PRIORITY_HIGH; - - LCD = (LCD_CONTROLLER_TypeDef *)controllerAddress; -} - -uint32_t TFT_FSMC::GetID() { - uint32_t id; - WriteReg(0x0000); - id = LCD->RAM; - - if (id == 0) - id = ReadID(LCD_READ_ID); - if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) - id = ReadID(LCD_READ_ID4); - return id; -} - - uint32_t TFT_FSMC::ReadID(uint16_t Reg) { - uint32_t id; - WriteReg(Reg); - id = LCD->RAM; // dummy read - id = Reg << 24; - id |= (LCD->RAM & 0x00FF) << 16; - id |= (LCD->RAM & 0x00FF) << 8; - id |= LCD->RAM & 0x00FF; - return id; - } - -bool TFT_FSMC::isBusy() { - if (__IS_DMA_ENABLED(&DMAtx)) - if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) - Abort(); - return __IS_DMA_ENABLED(&DMAtx); -} - -void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DMAtx.Init.PeriphInc = MemoryIncrease; - HAL_DMA_Init(&DMAtx); - - __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)); - __HAL_DMA_CLEAR_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)); - - #ifdef STM32F1xx - DMAtx.Instance->CNDTR = Count; - DMAtx.Instance->CPAR = (uint32_t)Data; - DMAtx.Instance->CMAR = (uint32_t)&(LCD->RAM); - #elif defined(STM32F4xx) - DMAtx.Instance->NDTR = Count; - DMAtx.Instance->PAR = (uint32_t)Data; - DMAtx.Instance->M0AR = (uint32_t)&(LCD->RAM); - #endif - __HAL_DMA_ENABLE(&DMAtx); -} - -#endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h deleted file mode 100644 index cbec7613ef..0000000000 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef STM32F1xx - #include "stm32f1xx_hal.h" -#elif defined(STM32F4xx) - #include "stm32f4xx_hal.h" -#else - #error FSMC TFT is currently only supported on STM32F1 and STM32F4 hardware. -#endif - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif -#ifndef LCD_READ_ID4 - #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) -#endif - -#define DATASIZE_8BIT SPI_DATASIZE_8BIT -#define DATASIZE_16BIT SPI_DATASIZE_16BIT -#define TFT_IO_DRIVER TFT_FSMC - -#ifdef STM32F1xx - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) -#elif defined(STM32F4xx) - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) -#endif - -typedef struct { - __IO uint16_t REG; - __IO uint16_t RAM; -} LCD_CONTROLLER_TypeDef; - -class TFT_FSMC { - private: - static SRAM_HandleTypeDef SRAMx; - static DMA_HandleTypeDef DMAtx; - - static LCD_CONTROLLER_TypeDef *LCD; - - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data) { LCD->RAM = Data; __DSB(); } - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - - public: - static void Init(); - static uint32_t GetID(); - static bool isBusy(); - static void Abort() { __HAL_DMA_DISABLE(&DMAtx); } - - static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) {} - static void DataTransferEnd() {}; - - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg) { LCD->REG = Reg; __DSB(); } - - static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); } -}; - - -#ifdef STM32F1xx - #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE) -#elif defined(STM32F4xx) - #define FSMC_PIN_DATA STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_FSMC) - #define FSMC_BANK1_1 0x60000000U - #define FSMC_BANK1_2 0x64000000U - #define FSMC_BANK1_3 0x68000000U - #define FSMC_BANK1_4 0x6C000000U -#else - #error No configuration for this MCU -#endif - -const PinMap PinMap_FSMC[] = { - {PD_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D00 - {PD_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D01 - {PD_0, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D02 - {PD_1, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D03 - {PE_7, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D04 - {PE_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D05 - {PE_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D06 - {PE_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D07 - {PE_11, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D08 - {PE_12, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D09 - {PE_13, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D10 - {PE_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D11 - {PE_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D12 - {PD_8, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D13 - {PD_9, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D14 - {PD_10, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D15 - {PD_4, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NOE - {PD_5, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_NWE - {NC, NP, 0} -}; - -const PinMap PinMap_FSMC_CS[] = { - {PD_7, (void *)FSMC_NORSRAM_BANK1, FSMC_PIN_DATA}, // FSMC_NE1 - #ifdef PF0 - {PG_9, (void *)FSMC_NORSRAM_BANK2, FSMC_PIN_DATA}, // FSMC_NE2 - {PG_10, (void *)FSMC_NORSRAM_BANK3, FSMC_PIN_DATA}, // FSMC_NE3 - {PG_12, (void *)FSMC_NORSRAM_BANK4, FSMC_PIN_DATA}, // FSMC_NE4 - #endif - {NC, NP, 0} -}; - -#define FSMC_RS(A) (void *)((2 << A) - 2) - -const PinMap PinMap_FSMC_RS[] = { - #ifdef PF0 - {PF_0, FSMC_RS( 0), FSMC_PIN_DATA}, // FSMC_A0 - {PF_1, FSMC_RS( 1), FSMC_PIN_DATA}, // FSMC_A1 - {PF_2, FSMC_RS( 2), FSMC_PIN_DATA}, // FSMC_A2 - {PF_3, FSMC_RS( 3), FSMC_PIN_DATA}, // FSMC_A3 - {PF_4, FSMC_RS( 4), FSMC_PIN_DATA}, // FSMC_A4 - {PF_5, FSMC_RS( 5), FSMC_PIN_DATA}, // FSMC_A5 - {PF_12, FSMC_RS( 6), FSMC_PIN_DATA}, // FSMC_A6 - {PF_13, FSMC_RS( 7), FSMC_PIN_DATA}, // FSMC_A7 - {PF_14, FSMC_RS( 8), FSMC_PIN_DATA}, // FSMC_A8 - {PF_15, FSMC_RS( 9), FSMC_PIN_DATA}, // FSMC_A9 - {PG_0, FSMC_RS(10), FSMC_PIN_DATA}, // FSMC_A10 - {PG_1, FSMC_RS(11), FSMC_PIN_DATA}, // FSMC_A11 - {PG_2, FSMC_RS(12), FSMC_PIN_DATA}, // FSMC_A12 - {PG_3, FSMC_RS(13), FSMC_PIN_DATA}, // FSMC_A13 - {PG_4, FSMC_RS(14), FSMC_PIN_DATA}, // FSMC_A14 - {PG_5, FSMC_RS(15), FSMC_PIN_DATA}, // FSMC_A15 - #endif - {PD_11, FSMC_RS(16), FSMC_PIN_DATA}, // FSMC_A16 - {PD_12, FSMC_RS(17), FSMC_PIN_DATA}, // FSMC_A17 - {PD_13, FSMC_RS(18), FSMC_PIN_DATA}, // FSMC_A18 - {PE_3, FSMC_RS(19), FSMC_PIN_DATA}, // FSMC_A19 - {PE_4, FSMC_RS(20), FSMC_PIN_DATA}, // FSMC_A20 - {PE_5, FSMC_RS(21), FSMC_PIN_DATA}, // FSMC_A21 - {PE_6, FSMC_RS(22), FSMC_PIN_DATA}, // FSMC_A22 - {PE_2, FSMC_RS(23), FSMC_PIN_DATA}, // FSMC_A23 - #ifdef PF0 - {PG_13, FSMC_RS(24), FSMC_PIN_DATA}, // FSMC_A24 - {PG_14, FSMC_RS(25), FSMC_PIN_DATA}, // FSMC_A25 - #endif - {NC, NP, 0} -}; diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp deleted file mode 100644 index d3eb4ba8db..0000000000 --- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_SPI_TFT - -#include "tft_spi.h" -#include "pinconfig.h" - -SPI_HandleTypeDef TFT_SPI::SPIx; -DMA_HandleTypeDef TFT_SPI::DMAtx; - -void TFT_SPI::Init() { - SPI_TypeDef *spiInstance; - - #if PIN_EXISTS(TFT_RESET) - OUT_WRITE(TFT_RESET_PIN, HIGH); - HAL_Delay(100); - #endif - - #if PIN_EXISTS(TFT_BACKLIGHT) - OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); - #endif - - OUT_WRITE(TFT_A0_PIN, HIGH); - OUT_WRITE(TFT_CS_PIN, HIGH); - - if ((spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK)) == NP) return; - if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI)) return; - - #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN) - if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO)) return; - #endif - - SPIx.Instance = spiInstance; - SPIx.State = HAL_SPI_STATE_RESET; - SPIx.Init.NSS = SPI_NSS_SOFT; - SPIx.Init.Mode = SPI_MODE_MASTER; - SPIx.Init.Direction = - #if TFT_MISO_PIN == TFT_MOSI_PIN - SPI_DIRECTION_1LINE; - #else - SPI_DIRECTION_2LINES; - #endif - SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - SPIx.Init.CLKPhase = SPI_PHASE_1EDGE; - SPIx.Init.CLKPolarity = SPI_POLARITY_LOW; - SPIx.Init.DataSize = SPI_DATASIZE_8BIT; - SPIx.Init.FirstBit = SPI_FIRSTBIT_MSB; - SPIx.Init.TIMode = SPI_TIMODE_DISABLE; - SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - SPIx.Init.CRCPolynomial = 10; - - pinmap_pinout(digitalPinToPinName(TFT_SCK_PIN), PinMap_SPI_SCLK); - pinmap_pinout(digitalPinToPinName(TFT_MOSI_PIN), PinMap_SPI_MOSI); - #if PIN_EXISTS(TFT_MISO) && (TFT_MISO_PIN != TFT_MOSI_PIN) - pinmap_pinout(digitalPinToPinName(TFT_MISO_PIN), PinMap_SPI_MISO); - #endif - pin_PullConfig(get_GPIO_Port(STM_PORT(digitalPinToPinName(TFT_SCK_PIN))), STM_LL_GPIO_PIN(digitalPinToPinName(TFT_SCK_PIN)), GPIO_PULLDOWN); - - #ifdef SPI1_BASE - if (SPIx.Instance == SPI1) { - __HAL_RCC_SPI1_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); - SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; - DMAtx.Instance = DMA1_Channel3; - } - #endif - #ifdef SPI2_BASE - if (SPIx.Instance == SPI2) { - __HAL_RCC_SPI2_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); - DMAtx.Instance = DMA1_Channel5; - } - #endif - #ifdef SPI3_BASE - if (SPIx.Instance == SPI3) { - __HAL_RCC_SPI3_CLK_ENABLE(); - __HAL_RCC_DMA2_CLK_ENABLE(); - DMAtx.Instance = DMA2_Channel2; - } - #endif - - HAL_SPI_Init(&SPIx); - - DMAtx.Init.Direction = DMA_MEMORY_TO_PERIPH; - DMAtx.Init.PeriphInc = DMA_PINC_DISABLE; - DMAtx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; - DMAtx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; - DMAtx.Init.Mode = DMA_NORMAL; - DMAtx.Init.Priority = DMA_PRIORITY_LOW; -} - -void TFT_SPI::DataTransferBegin(uint16_t DataSize) { - SPIx.Init.DataSize = DataSize == DATASIZE_8BIT ? SPI_DATASIZE_8BIT : SPI_DATASIZE_16BIT; - HAL_SPI_Init(&SPIx); - WRITE(TFT_CS_PIN, LOW); -} - -uint32_t TFT_SPI::GetID() { - uint32_t id; - id = ReadID(LCD_READ_ID); - - if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) - id = ReadID(LCD_READ_ID4); - return id; -} - -uint32_t TFT_SPI::ReadID(uint16_t Reg) { - #if !PIN_EXISTS(TFT_MISO) - return 0; - #else - uint32_t BaudRatePrescaler = SPIx.Init.BaudRatePrescaler; - uint32_t i, Data = 0; - - SPIx.Init.BaudRatePrescaler = SPIx.Instance == SPI1 ? SPI_BAUDRATEPRESCALER_8 : SPI_BAUDRATEPRESCALER_4; - DataTransferBegin(DATASIZE_8BIT); - WriteReg(Reg); - - if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_RX(&SPIx); - __HAL_SPI_ENABLE(&SPIx); - - for (i = 0; i < 4; i++) { - #if TFT_MISO_PIN != TFT_MOSI_PIN - //if (hspi->Init.Direction == SPI_DIRECTION_2LINES) { - while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} - SPIx.Instance->DR = 0; - //} - #endif - while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} - Data = (Data << 8) | SPIx.Instance->DR; - } - - __HAL_SPI_DISABLE(&SPIx); - DataTransferEnd(); - - SPIx.Init.BaudRatePrescaler = BaudRatePrescaler; - - return Data >> 7; - #endif -} - -bool TFT_SPI::isBusy() { - if (DMAtx.Instance->CCR & DMA_CCR_EN) - if (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) != 0 || __HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) != 0) - Abort(); - return DMAtx.Instance->CCR & DMA_CCR_EN; -} - -void TFT_SPI::Abort() { - __HAL_DMA_DISABLE(&DMAtx); - DataTransferEnd(); -} - -void TFT_SPI::Transmit(uint16_t Data) { - #if TFT_MISO_PIN == TFT_MOSI_PIN - SPI_1LINE_TX(&SPIx); - #endif - - __HAL_SPI_ENABLE(&SPIx); - - SPIx.Instance->DR = Data; - - while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} - while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {} - - #if TFT_MISO_PIN != TFT_MOSI_PIN - __HAL_SPI_CLEAR_OVRFLAG(&SPIx); /* Clear overrun flag in 2 Lines communication mode because received is not read */ - #endif -} - -void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DMAtx.Init.MemInc = MemoryIncrease; - HAL_DMA_Init(&DMAtx); - - DataTransferBegin(); - - #if TFT_MISO_PIN == TFT_MOSI_PIN - SPI_1LINE_TX(&SPIx); - #endif - - DMAtx.DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << DMAtx.ChannelIndex); - DMAtx.Instance->CNDTR = Count; - DMAtx.Instance->CPAR = (uint32_t)&(SPIx.Instance->DR); - DMAtx.Instance->CMAR = (uint32_t)Data; - __HAL_DMA_ENABLE(&DMAtx); - __HAL_SPI_ENABLE(&SPIx); - - SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ -} - -#endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.h b/Marlin/src/HAL/STM32/tft/tft_spi.h deleted file mode 100644 index d477b58c00..0000000000 --- a/Marlin/src/HAL/STM32/tft/tft_spi.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef STM32F1xx - #include "stm32f1xx_hal.h" -#elif defined(STM32F4xx) - #include "stm32f4xx_hal.h" -#else - #error SPI TFT is currently only supported on STM32F1 and STM32F4 hardware. -#endif - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif -#ifndef LCD_READ_ID4 - #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) -#endif - -#define DATASIZE_8BIT SPI_DATASIZE_8BIT -#define DATASIZE_16BIT SPI_DATASIZE_16BIT -#define TFT_IO_DRIVER TFT_SPI - -class TFT_SPI { -private: - static SPI_HandleTypeDef SPIx; - static DMA_HandleTypeDef DMAtx; - - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - -public: - static void Init(); - static uint32_t GetID(); - static bool isBusy(); - static void Abort(); - - static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT); - static void DataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); }; - static void DataTransferAbort(); - - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg) { WRITE(TFT_A0_PIN, LOW); Transmit(Reg); WRITE(TFT_A0_PIN, HIGH); } - - static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } -}; diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp deleted file mode 100644 index 921e377a9f..0000000000 --- a/Marlin/src/HAL/STM32/tft/xpt2046.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_TFT_XPT2046 - -#include "xpt2046.h" -#include "pinconfig.h" - -uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } - -SPI_HandleTypeDef XPT2046::SPIx; -DMA_HandleTypeDef XPT2046::DMAtx; - -void XPT2046::Init() { - SPI_TypeDef *spiInstance; - - OUT_WRITE(TOUCH_CS_PIN, HIGH); - - #if PIN_EXISTS(TOUCH_INT) - // Optional Pendrive interrupt pin - SET_INPUT(TOUCH_INT_PIN); - #endif - - spiInstance = (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TOUCH_SCK_PIN), PinMap_SPI_SCLK); - if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TOUCH_MOSI_PIN), PinMap_SPI_MOSI)) spiInstance = NP; - if (spiInstance != (SPI_TypeDef *)pinmap_peripheral(digitalPinToPinName(TOUCH_MISO_PIN), PinMap_SPI_MISO)) spiInstance = NP; - - SPIx.Instance = spiInstance; - - if (SPIx.Instance) { - SPIx.State = HAL_SPI_STATE_RESET; - SPIx.Init.NSS = SPI_NSS_SOFT; - SPIx.Init.Mode = SPI_MODE_MASTER; - SPIx.Init.Direction = SPI_DIRECTION_2LINES; - SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; - SPIx.Init.CLKPhase = SPI_PHASE_2EDGE; - SPIx.Init.CLKPolarity = SPI_POLARITY_HIGH; - SPIx.Init.DataSize = SPI_DATASIZE_8BIT; - SPIx.Init.FirstBit = SPI_FIRSTBIT_MSB; - SPIx.Init.TIMode = SPI_TIMODE_DISABLE; - SPIx.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - SPIx.Init.CRCPolynomial = 10; - - pinmap_pinout(digitalPinToPinName(TOUCH_SCK_PIN), PinMap_SPI_SCLK); - pinmap_pinout(digitalPinToPinName(TOUCH_MOSI_PIN), PinMap_SPI_MOSI); - pinmap_pinout(digitalPinToPinName(TOUCH_MISO_PIN), PinMap_SPI_MISO); - - #ifdef SPI1_BASE - if (SPIx.Instance == SPI1) { - __HAL_RCC_SPI1_CLK_ENABLE(); - SPIx.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; - #ifdef STM32F1xx - DMAtx.Instance = DMA1_Channel3; - #elif defined(STM32F4xx) - DMAtx.Instance = DMA2_Stream3; // DMA2_Stream5 - #endif - //SERIAL_ECHO_MSG(" Touch Screen on SPI1"); - } - #endif - #ifdef SPI2_BASE - if (SPIx.Instance == SPI2) { - __HAL_RCC_SPI2_CLK_ENABLE(); - #ifdef STM32F1xx - DMAtx.Instance = DMA1_Channel5; - #elif defined(STM32F4xx) - DMAtx.Instance = DMA1_Stream4; - #endif - //SERIAL_ECHO_MSG(" Touch Screen on SPI2"); - } - #endif - #ifdef SPI3_BASE - if (SPIx.Instance == SPI3) { - __HAL_RCC_SPI3_CLK_ENABLE(); - #ifdef STM32F1xx - DMAtx.Instance = DMA2_Channel2; - #elif defined(STM32F4xx) - DMAtx.Instance = DMA1_Stream5; // DMA1_Stream7 - #endif - //SERIAL_ECHO_MSG(" Touch Screen on SPI3"); - } - #endif - } - else { - SPIx.Instance = NULL; - SET_INPUT(TOUCH_MISO_PIN); - SET_OUTPUT(TOUCH_MOSI_PIN); - SET_OUTPUT(TOUCH_SCK_PIN); - //SERIAL_ECHO_MSG(" Touch Screen on Software SPI"); - } - - getRawData(XPT2046_Z1); -} - -bool XPT2046::isTouched() { - return isBusy() ? false : ( - #if PIN_EXISTS(TOUCH_INT) - READ(TOUCH_INT_PIN) != HIGH - #else - getRawData(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD - #endif - ); -} - -bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { - if (isBusy()) return false; - if (!isTouched()) return false; - *x = getRawData(XPT2046_X); - *y = getRawData(XPT2046_Y); - return isTouched(); -} - -uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { - uint16_t data[3]; - - DataTransferBegin(); - - for (uint16_t i = 0; i < 3 ; i++) { - IO(coordinate); - data[i] = (IO() << 4) | (IO() >> 4); - } - - DataTransferEnd(); - - uint16_t delta01 = delta(data[0], data[1]); - uint16_t delta02 = delta(data[0], data[2]); - uint16_t delta12 = delta(data[1], data[2]); - - if (delta01 > delta02 || delta01 > delta12) { - if (delta02 > delta12) - data[0] = data[2]; - else - data[1] = data[2]; - } - - return (data[0] + data[1]) >> 1; -} - -uint16_t XPT2046::HardwareIO(uint16_t data) { - __HAL_SPI_ENABLE(&SPIx); - while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} - SPIx.Instance->DR = data; - while ((SPIx.Instance->SR & SPI_FLAG_RXNE) != SPI_FLAG_RXNE) {} - __HAL_SPI_DISABLE(&SPIx); - - return SPIx.Instance->DR; -} - -uint16_t XPT2046::SoftwareIO(uint16_t data) { - uint16_t result = 0; - - for (uint8_t j = 0x80; j > 0; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - __DSB(); - WRITE(TOUCH_MOSI_PIN, data & j ? HIGH : LOW); - __DSB(); - if (READ(TOUCH_MISO_PIN)) result |= j; - __DSB(); - WRITE(TOUCH_SCK_PIN, HIGH); - __DSB(); - } - WRITE(TOUCH_SCK_PIN, LOW); - __DSB(); - - return result; -} - -#endif // HAS_TFT_XPT2046 diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.h b/Marlin/src/HAL/STM32/tft/xpt2046.h deleted file mode 100644 index 7a6d8439c5..0000000000 --- a/Marlin/src/HAL/STM32/tft/xpt2046.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef STM32F1xx - #include -#elif defined(STM32F4xx) - #include -#endif - -#include "../../../inc/MarlinConfig.h" - -// Not using regular SPI interface by default to avoid SPI mode conflicts with other SPI devices - -#if !PIN_EXISTS(TOUCH_MISO) - #error "TOUCH_MISO_PIN is not defined." -#elif !PIN_EXISTS(TOUCH_MOSI) - #error "TOUCH_MOSI_PIN is not defined." -#elif !PIN_EXISTS(TOUCH_SCK) - #error "TOUCH_SCK_PIN is not defined." -#elif !PIN_EXISTS(TOUCH_CS) - #error "TOUCH_CS_PIN is not defined." -#endif - -#ifndef TOUCH_INT_PIN - #define TOUCH_INT_PIN -1 -#endif - -#define XPT2046_DFR_MODE 0x00 -#define XPT2046_SER_MODE 0x04 -#define XPT2046_CONTROL 0x80 - -enum XPTCoordinate : uint8_t { - XPT2046_X = 0x10 | XPT2046_CONTROL | XPT2046_DFR_MODE, - XPT2046_Y = 0x50 | XPT2046_CONTROL | XPT2046_DFR_MODE, - XPT2046_Z1 = 0x30 | XPT2046_CONTROL | XPT2046_DFR_MODE, - XPT2046_Z2 = 0x40 | XPT2046_CONTROL | XPT2046_DFR_MODE, -}; - -#if !defined(XPT2046_Z1_THRESHOLD) - #define XPT2046_Z1_THRESHOLD 10 -#endif - -#ifdef STM32F1xx - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CCR & DMA_CCR_EN) -#elif defined(STM32F4xx) - #define __IS_DMA_ENABLED(__HANDLE__) ((__HANDLE__)->Instance->CR & DMA_SxCR_EN) -#endif - - -class XPT2046 { -private: - static SPI_HandleTypeDef SPIx; - static DMA_HandleTypeDef DMAtx; - - static bool isBusy() { return SPIx.Instance ? __IS_DMA_ENABLED(&DMAtx) : false; } - - static uint16_t getRawData(const XPTCoordinate coordinate); - static bool isTouched(); - - static inline void DataTransferBegin() { if (SPIx.Instance) { HAL_SPI_Init(&SPIx); } WRITE(TOUCH_CS_PIN, LOW); }; - static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; - static uint16_t HardwareIO(uint16_t data); - static uint16_t SoftwareIO(uint16_t data); - static uint16_t IO(uint16_t data = 0) { return SPIx.Instance ? HardwareIO(data) : SoftwareIO(data); } - -public: - static void Init(); - static bool getRawPoint(int16_t *x, int16_t *y); -}; diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp deleted file mode 100644 index c0ba19abe5..0000000000 --- a/Marlin/src/HAL/STM32/timers.cpp +++ /dev/null @@ -1,280 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfig.h" - -// ------------------------ -// Local defines -// ------------------------ - -#define NUM_HARDWARE_TIMERS 2 - -// Default timer priorities. Override by specifying alternate priorities in the board pins file. -// The TONE timer is not present here, as it currently cannot be set programmatically. It is set -// by defining TIM_IRQ_PRIO in the variant.h or platformio.ini file, which adjusts the default -// priority for STM32 HardwareTimer objects. -#define SWSERIAL_TIMER_IRQ_PRIO_DEFAULT 1 // Requires tight bit timing to communicate reliably with TMC drivers -#define SERVO_TIMER_IRQ_PRIO_DEFAULT 1 // Requires tight PWM timing to control a BLTouch reliably -#define STEP_TIMER_IRQ_PRIO_DEFAULT 2 -#define TEMP_TIMER_IRQ_PRIO_DEFAULT 14 // Low priority avoids interference with other hardware and timers - -#ifndef STEP_TIMER_IRQ_PRIO - #define STEP_TIMER_IRQ_PRIO STEP_TIMER_IRQ_PRIO_DEFAULT -#endif -#ifndef TEMP_TIMER_IRQ_PRIO - #define TEMP_TIMER_IRQ_PRIO TEMP_TIMER_IRQ_PRIO_DEFAULT -#endif -#if HAS_TMC_SW_SERIAL - #include - #ifndef SWSERIAL_TIMER_IRQ_PRIO - #define SWSERIAL_TIMER_IRQ_PRIO SWSERIAL_TIMER_IRQ_PRIO_DEFAULT - #endif -#endif -#if HAS_SERVOS - #include "Servo.h" - #ifndef SERVO_TIMER_IRQ_PRIO - #define SERVO_TIMER_IRQ_PRIO SERVO_TIMER_IRQ_PRIO_DEFAULT - #endif -#endif -#if ENABLED(SPEAKER) - // Ensure the default timer priority is somewhere between the STEP and TEMP priorities. - // The STM32 framework defaults to interrupt 14 for all timers. This should be increased so that - // timing-sensitive operations such as speaker output are not impacted by the long-running - // temperature ISR. This must be defined in the platformio.ini file or the board's variant.h, - // so that it will be consumed by framework code. - #if !(TIM_IRQ_PRIO > STEP_TIMER_IRQ_PRIO && TIM_IRQ_PRIO < TEMP_TIMER_IRQ_PRIO) - #error "Default timer interrupt priority is unspecified or set to a value which may degrade performance." - #endif -#endif - -#ifdef STM32F0xx - #define MCU_TIMER_RATE (F_CPU) // Frequency of timer peripherals - #define MCU_STEP_TIMER 16 - #define MCU_TEMP_TIMER 17 -#elif defined(STM32F1xx) - #define MCU_TIMER_RATE (F_CPU) - #define MCU_STEP_TIMER 4 - #define MCU_TEMP_TIMER 2 -#elif defined(STM32F401xC) || defined(STM32F401xE) - #define MCU_TIMER_RATE (F_CPU / 2) - #define MCU_STEP_TIMER 9 - #define MCU_TEMP_TIMER 10 -#elif defined(STM32F4xx) || defined(STM32F7xx) - #define MCU_TIMER_RATE (F_CPU / 2) - #define MCU_STEP_TIMER 6 // STM32F401 has no TIM6, TIM7, or TIM8 - #define MCU_TEMP_TIMER 14 // TIM7 is consumed by Software Serial if used. -#endif - -#ifndef HAL_TIMER_RATE - #define HAL_TIMER_RATE MCU_TIMER_RATE -#endif -#ifndef STEP_TIMER - #define STEP_TIMER MCU_STEP_TIMER -#endif -#ifndef TEMP_TIMER - #define TEMP_TIMER MCU_TEMP_TIMER -#endif - -#define __TIMER_DEV(X) TIM##X -#define _TIMER_DEV(X) __TIMER_DEV(X) -#define STEP_TIMER_DEV _TIMER_DEV(STEP_TIMER) -#define TEMP_TIMER_DEV _TIMER_DEV(TEMP_TIMER) - -#define __TIMER_IRQ_NAME(X) TIM##X##_IRQn -#define _TIMER_IRQ_NAME(X) __TIMER_IRQ_NAME(X) -#define STEP_TIMER_IRQ_NAME _TIMER_IRQ_NAME(STEP_TIMER) -#define TEMP_TIMER_IRQ_NAME _TIMER_IRQ_NAME(TEMP_TIMER) - -// ------------------------ -// Private Variables -// ------------------------ - -HardwareTimer *timer_instance[NUM_HARDWARE_TIMERS] = { NULL }; - -// ------------------------ -// Public functions -// ------------------------ - -// frequency is in Hertz -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - if (!HAL_timer_initialized(timer_num)) { - switch (timer_num) { - case STEP_TIMER_NUM: // STEPPER TIMER - use a 32bit timer if possible - timer_instance[timer_num] = new HardwareTimer(STEP_TIMER_DEV); - /* Set the prescaler to the final desired value. - * This will change the effective ISR callback frequency but when - * HAL_timer_start(timer_num=0) is called in the core for the first time - * the real frequency isn't important as long as, after boot, the ISR - * gets called with the correct prescaler and count register. So here - * we set the prescaler to the correct, final value and ignore the frequency - * asked. We will call back the ISR in 1 second to start at full speed. - * - * The proper fix, however, would be a correct initialization OR a - * HAL_timer_change(const uint8_t timer_num, const uint32_t frequency) - * which changes the prescaler when an IRQ frequency change is needed - * (for example when steppers are turned on) - */ - - timer_instance[timer_num]->setPrescaleFactor(STEPPER_TIMER_PRESCALE); //the -1 is done internally - timer_instance[timer_num]->setOverflow(_MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE) /* /frequency */), TICK_FORMAT); - break; - case TEMP_TIMER_NUM: // TEMP TIMER - any available 16bit timer - timer_instance[timer_num] = new HardwareTimer(TEMP_TIMER_DEV); - // The prescale factor is computed automatically for HERTZ_FORMAT - timer_instance[timer_num]->setOverflow(frequency, HERTZ_FORMAT); - break; - } - - // Disable preload. Leaving it default-enabled can cause the timer to stop if it happens - // to exit the ISR after the start time for the next interrupt has already passed. - timer_instance[timer_num]->setPreloadEnable(false); - - HAL_timer_enable_interrupt(timer_num); - - // Start the timer. - timer_instance[timer_num]->resume(); // First call to resume() MUST follow the attachInterrupt() - - // This is fixed in Arduino_Core_STM32 1.8. - // These calls can be removed and replaced with - // timer_instance[timer_num]->setInterruptPriority - switch (timer_num) { - case STEP_TIMER_NUM: - timer_instance[timer_num]->setInterruptPriority(STEP_TIMER_IRQ_PRIO, 0); - break; - case TEMP_TIMER_NUM: - timer_instance[timer_num]->setInterruptPriority(TEMP_TIMER_IRQ_PRIO, 0); - break; - } - } -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - if (HAL_timer_initialized(timer_num) && !timer_instance[timer_num]->hasInterrupt()) { - switch (timer_num) { - case STEP_TIMER_NUM: - timer_instance[timer_num]->attachInterrupt(Step_Handler); - break; - case TEMP_TIMER_NUM: - timer_instance[timer_num]->attachInterrupt(Temp_Handler); - break; - } - } -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - if (HAL_timer_initialized(timer_num)) timer_instance[timer_num]->detachInterrupt(); -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - return HAL_timer_initialized(timer_num) && timer_instance[timer_num]->hasInterrupt(); -} - -void SetTimerInterruptPriorities() { - TERN_(HAS_TMC_SW_SERIAL, SoftwareSerial::setInterruptPriority(SWSERIAL_TIMER_IRQ_PRIO, 0)); - TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIO, 0)); -} - -// This is a terrible hack to replicate the behavior used in the framework's SoftwareSerial.cpp -// to choose a serial timer. It will select TIM7 on most boards used by Marlin, but this is more -// resiliant to new MCUs which may not have a TIM7. Best practice is to explicitly specify -// TIMER_SERIAL to avoid relying on framework selections which may not be predictable. -#if !defined(TIMER_SERIAL) - #if defined (TIM18_BASE) - #define TIMER_SERIAL TIM18 - #elif defined (TIM7_BASE) - #define TIMER_SERIAL TIM7 - #elif defined (TIM6_BASE) - #define TIMER_SERIAL TIM6 - #elif defined (TIM22_BASE) - #define TIMER_SERIAL TIM22 - #elif defined (TIM21_BASE) - #define TIMER_SERIAL TIM21 - #elif defined (TIM17_BASE) - #define TIMER_SERIAL TIM17 - #elif defined (TIM16_BASE) - #define TIMER_SERIAL TIM16 - #elif defined (TIM15_BASE) - #define TIMER_SERIAL TIM15 - #elif defined (TIM14_BASE) - #define TIMER_SERIAL TIM14 - #elif defined (TIM13_BASE) - #define TIMER_SERIAL TIM13 - #elif defined (TIM11_BASE) - #define TIMER_SERIAL TIM11 - #elif defined (TIM10_BASE) - #define TIMER_SERIAL TIM10 - #elif defined (TIM12_BASE) - #define TIMER_SERIAL TIM12 - #elif defined (TIM19_BASE) - #define TIMER_SERIAL TIM19 - #elif defined (TIM9_BASE) - #define TIMER_SERIAL TIM9 - #elif defined (TIM5_BASE) - #define TIMER_SERIAL TIM5 - #elif defined (TIM4_BASE) - #define TIMER_SERIAL TIM4 - #elif defined (TIM3_BASE) - #define TIMER_SERIAL TIM3 - #elif defined (TIM2_BASE) - #define TIMER_SERIAL TIM2 - #elif defined (TIM20_BASE) - #define TIMER_SERIAL TIM20 - #elif defined (TIM8_BASE) - #define TIMER_SERIAL TIM8 - #elif defined (TIM1_BASE) - #define TIMER_SERIAL TIM1 - #else - #error No suitable timer found for SoftwareSerial, define TIMER_SERIAL in variant.h - #endif -#endif - -// Place all timers used into an array, then recursively check for duplicates during compilation. -// This does not currently account for timers used for PWM, such as for fans. -// Timers are actually pointers. Convert to integers to simplify constexpr logic. -static constexpr uintptr_t timers_in_use[] = { - uintptr_t(TEMP_TIMER_DEV), // Override in pins file - uintptr_t(STEP_TIMER_DEV), // Override in pins file - #if HAS_TMC_SW_SERIAL - uintptr_t(TIMER_SERIAL), // Set in variant.h, or as a define in platformio.h if not present in variant.h - #endif - #if ENABLED(SPEAKER) - uintptr_t(TIMER_TONE), // Set in variant.h, or as a define in platformio.h if not present in variant.h - #endif - #if HAS_SERVOS - uintptr_t(TIMER_SERVO), // Set in variant.h, or as a define in platformio.h if not present in variant.h - #endif - }; - -static constexpr bool verify_no_duplicate_timers() { - LOOP_L_N(i, COUNT(timers_in_use)) - LOOP_S_L_N(j, i + 1, COUNT(timers_in_use)) - if (timers_in_use[i] == timers_in_use[j]) return false; - return true; -} - -// If this assertion fails at compile time, review the timers_in_use array. If default_envs is -// defined properly in platformio.ini, VS Code can evaluate the array when hovering over it, -// making it easy to identify the conflicting timers. -static_assert(verify_no_duplicate_timers(), "One or more timer conflict detected"); - -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/timers.h b/Marlin/src/HAL/STM32/timers.h deleted file mode 100644 index 5515219ead..0000000000 --- a/Marlin/src/HAL/STM32/timers.h +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include -#include "../../inc/MarlinConfig.h" - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -// STM32 timers may be 16 or 32 bit. Limiting HAL_TIMER_TYPE_MAX to 16 bits -// avoids issues with STM32F0 MCUs, which seem to pause timers if UINT32_MAX -// is written to the register. STM32F4 timers do not manifest this issue, -// even when writing to 16 bit timers. -// -// The range of the timer can be queried at runtime using IS_TIM_32B_COUNTER_INSTANCE. -// This is a more expensive check than a simple compile-time constant, so its -// implementation is deferred until the desire for a 32-bit range outweighs the cost -// of adding a run-time check and HAL_TIMER_TYPE_MAX is refactored to allow unique -// values for each timer. -#define hal_timer_t uint32_t -#define HAL_TIMER_TYPE_MAX UINT16_MAX - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif - -#define TEMP_TIMER_FREQUENCY 1000 // Temperature::isr() is expected to be called at around 1kHz - -// TODO: get rid of manual rate/prescale/ticks/cycles taken for procedures in stepper.cpp -#define STEPPER_TIMER_RATE 2000000 // 2 Mhz -#define STEPPER_TIMER_PRESCALE ((HAL_TIMER_RATE)/(STEPPER_TIMER_RATE)) -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -extern void Step_Handler(); -extern void Temp_Handler(); - -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() void Step_Handler() -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() void Temp_Handler() -#endif - -// ------------------------ -// Public Variables -// ------------------------ - -extern HardwareTimer *timer_instance[]; - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -// Configure timer priorities for peripherals such as Software Serial or Servos. -// Exposed here to allow all timer priority information to reside in timers.cpp -void SetTimerInterruptPriorities(); - -// FORCE_INLINE because these are used in performance-critical situations -FORCE_INLINE bool HAL_timer_initialized(const uint8_t timer_num) { - return timer_instance[timer_num] != NULL; -} -FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - return HAL_timer_initialized(timer_num) ? timer_instance[timer_num]->getCount() : 0; -} - -// NOTE: Method name may be misleading. -// STM32 has an Auto-Reload Register (ARR) as opposed to a "compare" register -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t overflow) { - if (HAL_timer_initialized(timer_num)) { - timer_instance[timer_num]->setOverflow(overflow + 1, TICK_FORMAT); // Value decremented by setOverflow() - // wiki: "force all registers (Autoreload, prescaler, compare) to be taken into account" - // So, if the new overflow value is less than the count it will trigger a rollover interrupt. - if (overflow < timer_instance[timer_num]->getCount()) // Added 'if' here because reports say it won't boot without it - timer_instance[timer_num]->refresh(); - } -} - -#define HAL_timer_isr_prologue(TIMER_NUM) -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/STM32/usb_serial.cpp b/Marlin/src/HAL/STM32/usb_serial.cpp deleted file mode 100644 index 2dd1bef12c..0000000000 --- a/Marlin/src/HAL/STM32/usb_serial.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(EMERGENCY_PARSER) - -#include "usb_serial.h" -#include "../../feature/e_parser.h" - -EmergencyParser::State emergency_state = EmergencyParser::State::EP_RESET; - -int8_t (*USBD_CDC_Receive_original) (uint8_t *Buf, uint32_t *Len) = nullptr; - -static int8_t USBD_CDC_Receive_hook(uint8_t *Buf, uint32_t *Len) { - for (uint32_t i = 0; i < *Len; i++) - emergency_parser.update(emergency_state, Buf[i]); - return USBD_CDC_Receive_original(Buf, Len); -} - -typedef struct _USBD_CDC_Itf { - int8_t (* Init)(void); - int8_t (* DeInit)(void); - int8_t (* Control)(uint8_t cmd, uint8_t *pbuf, uint16_t length); - int8_t (* Receive)(uint8_t *Buf, uint32_t *Len); - int8_t (* Transferred)(void); -} USBD_CDC_ItfTypeDef; - -extern USBD_CDC_ItfTypeDef USBD_CDC_fops; - -void USB_Hook_init() { - USBD_CDC_Receive_original = USBD_CDC_fops.Receive; - USBD_CDC_fops.Receive = USBD_CDC_Receive_hook; -} - -#endif // EMERGENCY_PARSER -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/usb_serial.h b/Marlin/src/HAL/STM32/usb_serial.h deleted file mode 100644 index ca61b9ed23..0000000000 --- a/Marlin/src/HAL/STM32/usb_serial.h +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -void USB_Hook_init(); diff --git a/Marlin/src/HAL/STM32/watchdog.cpp b/Marlin/src/HAL/STM32/watchdog.cpp deleted file mode 100644 index cc18553149..0000000000 --- a/Marlin/src/HAL/STM32/watchdog.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(USE_WATCHDOG) - - #include "../../inc/MarlinConfig.h" - - #include "watchdog.h" - #include - - void watchdog_init() { - #if DISABLED(DISABLE_WATCHDOG_INIT) - IWatchdog.begin(4000000); // 4 sec timeout - #endif - } - - void HAL_watchdog_refresh() { - IWatchdog.reload(); - #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) - TOGGLE(LED_PIN); // heartbeat indicator - #endif - } - -#endif // USE_WATCHDOG -#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/watchdog.h b/Marlin/src/HAL/STM32/watchdog.h deleted file mode 100644 index 49a0d9c631..0000000000 --- a/Marlin/src/HAL/STM32/watchdog.h +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -void watchdog_init(); -void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp deleted file mode 100644 index cd1efc1659..0000000000 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ /dev/null @@ -1,420 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" -#include "HAL.h" - -#include - -// ------------------------ -// Types -// ------------------------ - -#define __I -#define __IO volatile - typedef struct { - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - } SCB_Type; - -// ------------------------ -// Local defines -// ------------------------ - -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ -#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ - -// ------------------------ -// Public Variables -// ------------------------ - -#if (defined(SERIAL_USB) && !defined(USE_USB_COMPOSITE)) - USBSerial SerialUSB; -#endif - -uint16_t HAL_adc_result; - -// ------------------------ -// Private Variables -// ------------------------ -STM32ADC adc(ADC1); - -const uint8_t adc_pins[] = { - #if HAS_TEMP_ADC_0 - TEMP_0_PIN, - #endif - #if HAS_TEMP_ADC_PROBE - TEMP_PROBE_PIN, - #endif - #if HAS_HEATED_BED - TEMP_BED_PIN, - #endif - #if HAS_TEMP_CHAMBER - TEMP_CHAMBER_PIN, - #endif - #if HAS_TEMP_ADC_1 - TEMP_1_PIN, - #endif - #if HAS_TEMP_ADC_2 - TEMP_2_PIN, - #endif - #if HAS_TEMP_ADC_3 - TEMP_3_PIN, - #endif - #if HAS_TEMP_ADC_4 - TEMP_4_PIN, - #endif - #if HAS_TEMP_ADC_5 - TEMP_5_PIN, - #endif - #if HAS_TEMP_ADC_6 - TEMP_6_PIN, - #endif - #if HAS_TEMP_ADC_7 - TEMP_7_PIN, - #endif - #if ENABLED(FILAMENT_WIDTH_SENSOR) - FILWIDTH_PIN, - #endif - #if ENABLED(ADC_KEYPAD) - ADC_KEYPAD_PIN, - #endif - #if HAS_JOY_ADC_X - JOY_X_PIN, - #endif - #if HAS_JOY_ADC_Y - JOY_Y_PIN, - #endif - #if HAS_JOY_ADC_Z - JOY_Z_PIN, - #endif - #if ENABLED(POWER_MONITOR_CURRENT) - POWER_MONITOR_CURRENT_PIN, - #endif - #if ENABLED(POWER_MONITOR_VOLTAGE) - POWER_MONITOR_VOLTAGE_PIN, - #endif -}; - -enum TempPinIndex : char { - #if HAS_TEMP_ADC_0 - TEMP_0, - #endif - #if HAS_TEMP_ADC_PROBE - TEMP_PROBE, - #endif - #if HAS_HEATED_BED - TEMP_BED, - #endif - #if HAS_TEMP_CHAMBER - TEMP_CHAMBER, - #endif - #if HAS_TEMP_ADC_1 - TEMP_1, - #endif - #if HAS_TEMP_ADC_2 - TEMP_2, - #endif - #if HAS_TEMP_ADC_3 - TEMP_3, - #endif - #if HAS_TEMP_ADC_4 - TEMP_4, - #endif - #if HAS_TEMP_ADC_5 - TEMP_5, - #endif - #if HAS_TEMP_ADC_6 - TEMP_6, - #endif - #if HAS_TEMP_ADC_7 - TEMP_7, - #endif - #if ENABLED(FILAMENT_WIDTH_SENSOR) - FILWIDTH, - #endif - #if ENABLED(ADC_KEYPAD) - ADC_KEY, - #endif - #if HAS_JOY_ADC_X - JOY_X, - #endif - #if HAS_JOY_ADC_Y - JOY_Y, - #endif - #if HAS_JOY_ADC_Z - JOY_Z, - #endif - #if ENABLED(POWER_MONITOR_CURRENT) - POWERMON_CURRENT, - #endif - #if ENABLED(POWER_MONITOR_VOLTAGE) - POWERMON_VOLTS, - #endif - ADC_PIN_COUNT -}; - -uint16_t HAL_adc_results[ADC_PIN_COUNT]; - -// ------------------------ -// Private functions -// ------------------------ -static void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ - - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ - SCB->AIRCR = reg_value; -} - -// ------------------------ -// Public functions -// ------------------------ - -// -// Leave PA11/PA12 intact if USBSerial is not used -// -#if SERIAL_USB - namespace wirish { namespace priv { - #if SERIAL_PORT > 0 - #if SERIAL_PORT2 - #if SERIAL_PORT2 > 0 - void board_setup_usb() {} - #endif - #else - void board_setup_usb() {} - #endif - #endif - } } -#endif - -void HAL_init() { - NVIC_SetPriorityGrouping(0x3); - #if PIN_EXISTS(LED) - OUT_WRITE(LED_PIN, LOW); - #endif - #ifdef USE_USB_COMPOSITE - MSC_SD_init(); - #endif - #if PIN_EXISTS(USB_CONNECT) - OUT_WRITE(USB_CONNECT_PIN, !USB_CONNECT_INVERTING); // USB clear connection - delay(1000); // Give OS time to notice - OUT_WRITE(USB_CONNECT_PIN, USB_CONNECT_INVERTING); - #endif -} - -// HAL idle task -void HAL_idletask() { - #ifdef USE_USB_COMPOSITE - #if HAS_SHARED_MEDIA - // If Marlin is using the SD card we need to lock it to prevent access from - // a PC via USB. - // Other HALs use IS_SD_PRINTING() and IS_SD_FILE_OPEN() to check for access but - // this will not reliably detect delete operations. To be safe we will lock - // the disk if Marlin has it mounted. Unfortunately there is currently no way - // to unmount the disk from the LCD menu. - // if (IS_SD_PRINTING() || IS_SD_FILE_OPEN()) - /* copy from lpc1768 framework, should be fixed later for process HAS_SHARED_MEDIA*/ - #endif - // process USB mass storage device class loop - MarlinMSC.loop(); - #endif -} - -void HAL_clear_reset_source() { } - -/** - * TODO: Check this and change or remove. - */ -uint8_t HAL_get_reset_source() { return RST_POWER_ON; } - -void _delay_ms(const int delay_ms) { delay(delay_ms); } - -extern "C" { - extern unsigned int _ebss; // end of bss section -} - -/** - * TODO: Change this to correct it for libmaple - */ - -// return free memory between end of heap (or end bss) and whatever is current - -/* -#include -//extern caddr_t _sbrk(int incr); -#ifndef CONFIG_HEAP_END -extern char _lm_heap_end; -#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) -#endif - -extern "C" { - static int freeMemory() { - char top = 't'; - return &top - reinterpret_cast(sbrk(0)); - } - int freeMemory() { - int free_memory; - int heap_end = (int)_sbrk(0); - free_memory = ((int)&free_memory) - ((int)heap_end); - return free_memory; - } -} -*/ - -// ------------------------ -// ADC -// ------------------------ -// Init the AD in continuous capture mode -void HAL_adc_init() { - // configure the ADC - adc.calibrate(); - #if F_CPU > 72000000 - adc.setSampleRate(ADC_SMPR_71_5); // 71.5 ADC cycles - #else - adc.setSampleRate(ADC_SMPR_41_5); // 41.5 ADC cycles - #endif - adc.setPins((uint8_t *)adc_pins, ADC_PIN_COUNT); - adc.setDMA(HAL_adc_results, (uint16_t)ADC_PIN_COUNT, (uint32_t)(DMA_MINC_MODE | DMA_CIRC_MODE), nullptr); - adc.setScanMode(); - adc.setContinuous(); - adc.startConversion(); -} - -void HAL_adc_start_conversion(const uint8_t adc_pin) { - //TEMP_PINS pin_index; - TempPinIndex pin_index; - switch (adc_pin) { - default: return; - #if HAS_TEMP_ADC_0 - case TEMP_0_PIN: pin_index = TEMP_0; break; - #endif - #if HAS_TEMP_ADC_PROBE - case TEMP_PROBE_PIN: pin_index = TEMP_PROBE; break; - #endif - #if HAS_HEATED_BED - case TEMP_BED_PIN: pin_index = TEMP_BED; break; - #endif - #if HAS_TEMP_CHAMBER - case TEMP_CHAMBER_PIN: pin_index = TEMP_CHAMBER; break; - #endif - #if HAS_TEMP_ADC_1 - case TEMP_1_PIN: pin_index = TEMP_1; break; - #endif - #if HAS_TEMP_ADC_2 - case TEMP_2_PIN: pin_index = TEMP_2; break; - #endif - #if HAS_TEMP_ADC_3 - case TEMP_3_PIN: pin_index = TEMP_3; break; - #endif - #if HAS_TEMP_ADC_4 - case TEMP_4_PIN: pin_index = TEMP_4; break; - #endif - #if HAS_TEMP_ADC_5 - case TEMP_5_PIN: pin_index = TEMP_5; break; - #endif - #if HAS_TEMP_ADC_6 - case TEMP_6_PIN: pin_index = TEMP_6; break; - #endif - #if HAS_TEMP_ADC_7 - case TEMP_7_PIN: pin_index = TEMP_7; break; - #endif - #if HAS_JOY_ADC_X - case JOY_X_PIN: pin_index = JOY_X; break; - #endif - #if HAS_JOY_ADC_Y - case JOY_Y_PIN: pin_index = JOY_Y; break; - #endif - #if HAS_JOY_ADC_Z - case JOY_Z_PIN: pin_index = JOY_Z; break; - #endif - #if ENABLED(FILAMENT_WIDTH_SENSOR) - case FILWIDTH_PIN: pin_index = FILWIDTH; break; - #endif - #if ENABLED(ADC_KEYPAD) - case ADC_KEYPAD_PIN: pin_index = ADC_KEY; break; - #endif - #if ENABLED(POWER_MONITOR_CURRENT) - case POWER_MONITOR_CURRENT_PIN: pin_index = POWERMON_CURRENT; break; - #endif - #if ENABLED(POWER_MONITOR_VOLTAGE) - case POWER_MONITOR_VOLTAGE_PIN: pin_index = POWERMON_VOLTS; break; - #endif - } - HAL_adc_result = (HAL_adc_results[(int)pin_index] >> 2) & 0x3FF; // shift to get 10 bits only. -} - -uint16_t HAL_adc_get_result() { return HAL_adc_result; } - -uint16_t analogRead(pin_t pin) { - const bool is_analog = _GET_MODE(pin) == GPIO_INPUT_ANALOG; - return is_analog ? analogRead(uint8_t(pin)) : 0; -} - -// Wrapper to maple unprotected analogWrite -void analogWrite(pin_t pin, int pwm_val8) { - if (PWM_PIN(pin)) - analogWrite(uint8_t(pin), pwm_val8); -} - -void flashFirmware(const int16_t) { nvic_sys_reset(); } - -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h deleted file mode 100644 index c10dea0eaf..0000000000 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ /dev/null @@ -1,246 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) - */ - -#define CPU_32_BIT - -#include "../../core/macros.h" -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" - -#include "fastio.h" -#include "watchdog.h" - - -#include -#include - -#include "../../inc/MarlinConfigPre.h" - -#ifdef USE_USB_COMPOSITE - #include "msc_sd.h" -#endif - -#include "MarlinSerial.h" - -// ------------------------ -// Defines -// ------------------------ - -#ifndef STM32_FLASH_SIZE - #if EITHER(MCU_STM32F103RE, MCU_STM32F103VE) - #define STM32_FLASH_SIZE 512 - #else - #define STM32_FLASH_SIZE 256 - #endif -#endif - -#ifdef SERIAL_USB - #ifndef USE_USB_COMPOSITE - #define UsbSerial Serial - #else - #define UsbSerial MarlinCompositeSerial - #endif -#endif - -#define _MSERIAL(X) MSerial##X -#define MSERIAL(X) _MSERIAL(X) - -#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) - #define NUM_UARTS 5 -#else - #define NUM_UARTS 3 -#endif - -#if SERIAL_PORT == -1 - #define MYSERIAL0 UsbSerial -#elif WITHIN(SERIAL_PORT, 1, NUM_UARTS) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) -#elif NUM_UARTS == 5 - #error "SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." -#else - #error "SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." -#endif - -#ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 UsbSerial - #elif WITHIN(SERIAL_PORT_2, 1, NUM_UARTS) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) - #elif NUM_UARTS == 5 - #error "SERIAL_PORT_2 must be -1 or from 1 to 5. Please update your configuration." - #else - #error "SERIAL_PORT_2 must be -1 or from 1 to 3. Please update your configuration." - #endif -#endif - -#ifdef LCD_SERIAL_PORT - #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL UsbSerial - #elif WITHIN(LCD_SERIAL_PORT, 1, NUM_UARTS) - #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) - #elif NUM_UARTS == 5 - #error "LCD_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." - #else - #error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." - #endif -#endif - -// Set interrupt grouping for this MCU -void HAL_init(); -#define HAL_IDLETASK 1 -void HAL_idletask(); - -/** - * TODO: review this to return 1 for pins that are not analog input - */ -#ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) (p) -#endif - -#ifndef digitalPinHasPWM - #define digitalPinHasPWM(P) (PIN_MAP[P].timer_device != nullptr) - #define NO_COMPILE_TIME_PWM -#endif - -#define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); (void)__iCliRetVal() -#define CRITICAL_SECTION_END() if (!primask) (void)__iSeiRetVal() -#define ISRS_ENABLED() (!__get_primask()) -#define ENABLE_ISRS() ((void)__iSeiRetVal()) -#define DISABLE_ISRS() ((void)__iCliRetVal()) - -// On AVR this is in math.h? -#define square(x) ((x)*(x)) - -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*(addr)) - -#define RST_POWER_ON 1 -#define RST_EXTERNAL 2 -#define RST_BROWN_OUT 4 -#define RST_WATCHDOG 8 -#define RST_JTAG 16 -#define RST_SOFTWARE 32 -#define RST_BACKUP 64 - -// ------------------------ -// Types -// ------------------------ - -typedef int8_t pin_t; - -// ------------------------ -// Public Variables -// ------------------------ - -// Result of last ADC conversion -extern uint16_t HAL_adc_result; - -// ------------------------ -// Public functions -// ------------------------ - -// Disable interrupts -#define cli() noInterrupts() - -// Enable interrupts -#define sei() interrupts() - -// Memory related -#define __bss_end __bss_end__ - -// Clear reset reason -void HAL_clear_reset_source(); - -// Reset reason -uint8_t HAL_get_reset_source(); - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -void _delay_ms(const int delay); - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" - -/* -extern "C" { - int freeMemory(); -} -*/ - -extern "C" char* _sbrk(int incr); - -/* -static int freeMemory() { - volatile int top; - top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); - return top; -} -*/ - -static int freeMemory() { - volatile char top; - return &top - reinterpret_cast(_sbrk(0)); -} - -#pragma GCC diagnostic pop - -// -// ADC -// - -#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT_ANALOG); - -void HAL_adc_init(); - -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 -#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) -#define HAL_READ_ADC() HAL_adc_result -#define HAL_ADC_READY() true - -void HAL_adc_start_conversion(const uint8_t adc_pin); -uint16_t HAL_adc_get_result(); - -uint16_t analogRead(pin_t pin); // need HAL_ANALOG_SELECT() first -void analogWrite(pin_t pin, int pwm_val8); // PWM only! mul by 257 in maple!? - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -#define JTAG_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY) -#define JTAGSWD_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_NONE) - -#define PLATFORM_M997_SUPPORT -void flashFirmware(const int16_t); diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp deleted file mode 100644 index 76b1c3e246..0000000000 --- a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Software SPI functions originally from Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman - * Adapted to the STM32F1 HAL - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" -#include - -// ------------------------ -// Public functions -// ------------------------ - -#if ENABLED(SOFTWARE_SPI) - - // ------------------------ - // Software SPI - // ------------------------ - #error "Software SPI not supported for STM32F1. Use hardware SPI." - -#else - -// ------------------------ -// Hardware SPI -// ------------------------ - -/** - * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz - */ - -/** - * @brief Begin SPI port setup - * - * @return Nothing - * - * @details Only configures SS pin since libmaple creates and initialize the SPI object - */ -void spiBegin() { - #if PIN_EXISTS(SS) - OUT_WRITE(SS_PIN, HIGH); - #endif -} - -/** - * @brief Initialize SPI port to required speed rate and transfer mode (MSB, SPI MODE 0) - * - * @param spiRate Rate as declared in HAL.h (speed do not match AVR) - * @return Nothing - * - * @details - */ -void spiInit(uint8_t spiRate) { - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - #if SPI_DEVICE == 1 - #define SPI_CLOCK_MAX SPI_CLOCK_DIV4 - #else - #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 - #endif - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_MAX ; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPI.setModule(SPI_DEVICE); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -} - -/** - * @brief Receive a single byte from the SPI port. - * - * @return Byte received - * - * @details - */ -uint8_t spiRec() { - uint8_t returnByte = SPI.transfer(0xFF); - return returnByte; -} - -/** - * @brief Receive a number of bytes from the SPI port to a buffer - * - * @param buf Pointer to starting address of buffer to write to. - * @param nbyte Number of bytes to receive. - * @return Nothing - * - * @details Uses DMA - */ -void spiRead(uint8_t* buf, uint16_t nbyte) { - SPI.dmaTransfer(0, const_cast(buf), nbyte); -} - -/** - * @brief Send a single byte on SPI port - * - * @param b Byte to send - * - * @details - */ -void spiSend(uint8_t b) { - SPI.send(b); -} - -/** - * @brief Write token and then write from 512 byte buffer to SPI (for SD card) - * - * @param buf Pointer with buffer start address - * @return Nothing - * - * @details Use DMA - */ -void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPI.send(token); - SPI.dmaSend(const_cast(buf), 512); -} - -#if ENABLED(SPI_EEPROM) - -// Read single byte from specified SPI channel -uint8_t spiRec(uint32_t chan) { return SPI.transfer(0xFF); } - -// Write single byte to specified SPI channel -void spiSend(uint32_t chan, byte b) { SPI.send(b); } - -// Write buffer to specified SPI channel -void spiSend(uint32_t chan, const uint8_t* buf, size_t n) { - for (size_t p = 0; p < n; p++) spiSend(chan, buf[p]); -} - -#endif // SPI_EEPROM - -#endif // SOFTWARE_SPI - -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp deleted file mode 100644 index ebf11cb429..0000000000 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" -#include "MarlinSerial.h" -#include - -// Copied from ~/.platformio/packages/framework-arduinoststm32-maple/STM32F1/system/libmaple/usart_private.h -// Changed to handle Emergency Parser -static inline __always_inline void my_usart_irq(ring_buffer *rb, ring_buffer *wb, usart_reg_map *regs, MarlinSerial &serial) { - /* Handle RXNEIE and TXEIE interrupts. - * RXNE signifies availability of a byte in DR. - * - * See table 198 (sec 27.4, p809) in STM document RM0008 rev 15. - * We enable RXNEIE. - */ - uint32_t srflags = regs->SR, cr1its = regs->CR1; - - if ((cr1its & USART_CR1_RXNEIE) && (srflags & USART_SR_RXNE)) { - if (srflags & USART_SR_FE || srflags & USART_SR_PE ) { - // framing error or parity error - regs->DR; // Read and throw away the data, which also clears FE and PE - } - else { - uint8_t c = (uint8)regs->DR; - #ifdef USART_SAFE_INSERT - // If the buffer is full and the user defines USART_SAFE_INSERT, - // ignore new bytes. - rb_safe_insert(rb, c); - #else - // By default, push bytes around in the ring buffer. - rb_push_insert(rb, c); - #endif - #if ENABLED(EMERGENCY_PARSER) - if (serial.emergency_parser_enabled()) - emergency_parser.update(serial.emergency_state, c); - #endif - } - } - else if (srflags & USART_SR_ORE) { - // overrun and empty data, just do a dummy read to clear ORE - // and prevent a raise condition where a continous interrupt stream (due to ORE set) occurs - // (see chapter "Overrun error" ) in STM32 reference manual - regs->DR; - } - - // TXE signifies readiness to send a byte to DR. - if ((cr1its & USART_CR1_TXEIE) && (srflags & USART_SR_TXE)) { - if (!rb_is_empty(wb)) - regs->DR=rb_remove(wb); - else - regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE - } -} - -// Not every MarlinSerial port should handle emergency parsing. -// It would not make sense to parse GCode from TMC responses, for example. -constexpr bool serial_handles_emergency(int port) { - return false - #ifdef SERIAL_PORT - || (SERIAL_PORT) == port - #endif - #ifdef SERIAL_PORT_2 - || (SERIAL_PORT_2) == port - #endif - #ifdef LCD_SERIAL_PORT - || (LCD_SERIAL_PORT) == port - #endif - ; -} - -#define DEFINE_HWSERIAL_MARLIN(name, n) \ - MarlinSerial name(USART##n, \ - BOARD_USART##n##_TX_PIN, \ - BOARD_USART##n##_RX_PIN, \ - serial_handles_emergency(n)); \ - extern "C" void __irq_usart##n(void) { \ - my_usart_irq(USART##n->rb, USART##n->wb, USART##n##_BASE, MSerial##n); \ - } - -#define DEFINE_HWSERIAL_UART_MARLIN(name, n) \ - MarlinSerial name(UART##n, \ - BOARD_USART##n##_TX_PIN, \ - BOARD_USART##n##_RX_PIN, \ - serial_handles_emergency(n)); \ - extern "C" void __irq_usart##n(void) { \ - my_usart_irq(UART##n->rb, UART##n->wb, UART##n##_BASE, MSerial##n); \ - } - -// Instantiate all UARTs even if they are not needed -// This avoids a bunch of logic to figure out every serial -// port which may be in use on the system. -DEFINE_HWSERIAL_MARLIN(MSerial1, 1); -DEFINE_HWSERIAL_MARLIN(MSerial2, 2); -DEFINE_HWSERIAL_MARLIN(MSerial3, 3); -#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) - DEFINE_HWSERIAL_UART_MARLIN(MSerial4, 4); - DEFINE_HWSERIAL_UART_MARLIN(MSerial5, 5); -#endif - -// Check the type of each serial port by passing it to a template function. -// HardwareSerial is known to sometimes hang the controller when an error occurs, -// so this case will fail the static assert. All other classes are assumed to be ok. -template -constexpr bool IsSerialClassAllowed(const T&) { return true; } -constexpr bool IsSerialClassAllowed(const HardwareSerial&) { return false; } - -#define CHECK_CFG_SERIAL(A) static_assert(IsSerialClassAllowed(A), STRINGIFY(A) " is defined incorrectly"); -#define CHECK_AXIS_SERIAL(A) static_assert(IsSerialClassAllowed(A##_HARDWARE_SERIAL), STRINGIFY(A) "_HARDWARE_SERIAL must be defined in the form MSerial1, rather than Serial1"); - -// If you encounter this error, replace SerialX with MSerialX, for example MSerial3. - -// Non-TMC ports were already validated in HAL.h, so do not require verbose error messages. -#ifdef MYSERIAL0 - CHECK_CFG_SERIAL(MYSERIAL0); -#endif -#ifdef MYSERIAL1 - CHECK_CFG_SERIAL(MYSERIAL1); -#endif -#ifdef LCD_SERIAL - CHECK_CFG_SERIAL(LCD_SERIAL); -#endif -#if AXIS_HAS_HW_SERIAL(X) - CHECK_AXIS_SERIAL(X); -#endif -#if AXIS_HAS_HW_SERIAL(X2) - CHECK_AXIS_SERIAL(X2); -#endif -#if AXIS_HAS_HW_SERIAL(Y) - CHECK_AXIS_SERIAL(Y); -#endif -#if AXIS_HAS_HW_SERIAL(Y2) - CHECK_AXIS_SERIAL(Y2); -#endif -#if AXIS_HAS_HW_SERIAL(Z) - CHECK_AXIS_SERIAL(Z); -#endif -#if AXIS_HAS_HW_SERIAL(Z2) - CHECK_AXIS_SERIAL(Z2); -#endif -#if AXIS_HAS_HW_SERIAL(Z3) - CHECK_AXIS_SERIAL(Z3); -#endif -#if AXIS_HAS_HW_SERIAL(Z4) - CHECK_AXIS_SERIAL(Z4); -#endif -#if AXIS_HAS_HW_SERIAL(E0) - CHECK_AXIS_SERIAL(E0); -#endif -#if AXIS_HAS_HW_SERIAL(E1) - CHECK_AXIS_SERIAL(E1); -#endif -#if AXIS_HAS_HW_SERIAL(E2) - CHECK_AXIS_SERIAL(E2); -#endif -#if AXIS_HAS_HW_SERIAL(E3) - CHECK_AXIS_SERIAL(E3); -#endif -#if AXIS_HAS_HW_SERIAL(E4) - CHECK_AXIS_SERIAL(E4); -#endif -#if AXIS_HAS_HW_SERIAL(E5) - CHECK_AXIS_SERIAL(E5); -#endif -#if AXIS_HAS_HW_SERIAL(E6) - CHECK_AXIS_SERIAL(E6); -#endif -#if AXIS_HAS_HW_SERIAL(E7) - CHECK_AXIS_SERIAL(E7); -#endif - -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h deleted file mode 100644 index 6aa94b64ff..0000000000 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include -#include -#include - -#include "../../inc/MarlinConfigPre.h" -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif - -// Increase priority of serial interrupts, to reduce overflow errors -#define UART_IRQ_PRIO 1 - -class MarlinSerial : public HardwareSerial { -public: - #if ENABLED(EMERGENCY_PARSER) - const bool ep_enabled; - EmergencyParser::State emergency_state; - inline bool emergency_parser_enabled() { return ep_enabled; } - #endif - - MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin, bool TERN_(EMERGENCY_PARSER, ep_capable)) : - HardwareSerial(usart_device, tx_pin, rx_pin) - #if ENABLED(EMERGENCY_PARSER) - , ep_enabled(ep_capable) - , emergency_state(EmergencyParser::State::EP_RESET) - #endif - { } - - #ifdef UART_IRQ_PRIO - // Shadow the parent methods to set IRQ priority after begin() - void begin(uint32 baud) { - MarlinSerial::begin(baud, SERIAL_8N1); - } - - void begin(uint32 baud, uint8_t config) { - HardwareSerial::begin(baud, config); - nvic_irq_set_priority(c_dev()->irq_num, UART_IRQ_PRIO); - } - #endif -}; - -extern MarlinSerial MSerial1; -extern MarlinSerial MSerial2; -extern MarlinSerial MSerial3; -#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) - extern MarlinSerial MSerial4; - extern MarlinSerial MSerial5; -#endif diff --git a/Marlin/src/HAL/STM32F1/README.md b/Marlin/src/HAL/STM32F1/README.md deleted file mode 100644 index b5bd5141fb..0000000000 --- a/Marlin/src/HAL/STM32F1/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# STM32F1 - -This HAL is for STM32F103 boards used with [Arduino STM32](https://github.com/rogerclarkmelbourne/Arduino_STM32) framework. - -Currently has been tested in Malyan M200 (103CBT6), SKRmini (103RCT6), Chitu 3d (103ZET6), and various 103VET6 boards. - -### Main developers: -- Victorpv -- xC000005 -- thisiskeithb -- tpruvot diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp deleted file mode 100644 index 0452cf6293..0000000000 --- a/Marlin/src/HAL/STM32F1/SPI.cpp +++ /dev/null @@ -1,718 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @author Marti Bolivar - * @brief Wirish SPI implementation. - */ - -#ifdef __STM32F1__ - -#include - -#include -#include -#include - -#include -#include - -#include "../../inc/MarlinConfig.h" -#include "spi_pins.h" - -/** Time in ms for DMA receive timeout */ -#define DMA_TIMEOUT 100 - -#if CYCLES_PER_MICROSECOND != 72 - #warning "Unexpected clock speed; SPI frequency calculation will be incorrect" -#endif - -struct spi_pins { uint8_t nss, sck, miso, mosi; }; - -static const spi_pins* dev_to_spi_pins(spi_dev *dev); -static void configure_gpios(spi_dev *dev, bool as_master); -static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq); - -#if BOARD_NR_SPI >= 3 && !defined(STM32_HIGH_DENSITY) - #error "The SPI library is misconfigured: 3 SPI ports only available on high density STM32 devices" -#endif - -static const spi_pins board_spi_pins[] __FLASH__ = { - #if BOARD_NR_SPI >= 1 - { BOARD_SPI1_NSS_PIN, - BOARD_SPI1_SCK_PIN, - BOARD_SPI1_MISO_PIN, - BOARD_SPI1_MOSI_PIN }, - #endif - #if BOARD_NR_SPI >= 2 - { BOARD_SPI2_NSS_PIN, - BOARD_SPI2_SCK_PIN, - BOARD_SPI2_MISO_PIN, - BOARD_SPI2_MOSI_PIN }, - #endif - #if BOARD_NR_SPI >= 3 - { BOARD_SPI3_NSS_PIN, - BOARD_SPI3_SCK_PIN, - BOARD_SPI3_MISO_PIN, - BOARD_SPI3_MOSI_PIN }, - #endif -}; - -#if BOARD_NR_SPI >= 1 - static void *_spi1_this; -#endif -#if BOARD_NR_SPI >= 2 - static void *_spi2_this; -#endif -#if BOARD_NR_SPI >= 3 - static void *_spi3_this; -#endif - -/** - * Constructor - */ -SPIClass::SPIClass(uint32_t spi_num) { - _currentSetting = &_settings[spi_num - 1]; // SPI channels are called 1 2 and 3 but the array is zero indexed - - switch (spi_num) { - #if BOARD_NR_SPI >= 1 - case 1: - _currentSetting->spi_d = SPI1; - _spi1_this = (void*)this; - break; - #endif - #if BOARD_NR_SPI >= 2 - case 2: - _currentSetting->spi_d = SPI2; - _spi2_this = (void*)this; - break; - #endif - #if BOARD_NR_SPI >= 3 - case 3: - _currentSetting->spi_d = SPI3; - _spi3_this = (void*)this; - break; - #endif - default: ASSERT(0); - } - - // Init things specific to each SPI device - // clock divider setup is a bit of hack, and needs to be improved at a later date. - #if BOARD_NR_SPI >= 1 - _settings[0].spi_d = SPI1; - _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); - _settings[0].spiDmaDev = DMA1; - _settings[0].spiTxDmaChannel = DMA_CH3; - _settings[0].spiRxDmaChannel = DMA_CH2; - #endif - #if BOARD_NR_SPI >= 2 - _settings[1].spi_d = SPI2; - _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); - _settings[1].spiDmaDev = DMA1; - _settings[1].spiTxDmaChannel = DMA_CH5; - _settings[1].spiRxDmaChannel = DMA_CH4; - #endif - #if BOARD_NR_SPI >= 3 - _settings[2].spi_d = SPI3; - _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); - _settings[2].spiDmaDev = DMA2; - _settings[2].spiTxDmaChannel = DMA_CH2; - _settings[2].spiRxDmaChannel = DMA_CH1; - #endif - - // added for DMA callbacks. - _currentSetting->state = SPI_STATE_IDLE; -} - -/** - * Set up/tear down - */ -void SPIClass::updateSettings() { - uint32_t flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS); - spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags); -} - -void SPIClass::begin() { - spi_init(_currentSetting->spi_d); - configure_gpios(_currentSetting->spi_d, 1); - updateSettings(); - // added for DMA callbacks. - _currentSetting->state = SPI_STATE_READY; -} - -void SPIClass::beginSlave() { - spi_init(_currentSetting->spi_d); - configure_gpios(_currentSetting->spi_d, 0); - uint32_t flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize); - spi_slave_enable(_currentSetting->spi_d, (spi_mode)_currentSetting->dataMode, flags); - // added for DMA callbacks. - _currentSetting->state = SPI_STATE_READY; -} - -void SPIClass::end() { - if (!spi_is_enabled(_currentSetting->spi_d)) return; - - // Follows RM0008's sequence for disabling a SPI in master/slave - // full duplex mode. - while (spi_is_rx_nonempty(_currentSetting->spi_d)) { - // FIXME [0.1.0] remove this once you have an interrupt based driver - volatile uint16_t rx __attribute__((unused)) = spi_rx_reg(_currentSetting->spi_d); - } - waitSpiTxEnd(_currentSetting->spi_d); - - spi_peripheral_disable(_currentSetting->spi_d); - // added for DMA callbacks. - // Need to add unsetting the callbacks for the DMA channels. - _currentSetting->state = SPI_STATE_IDLE; -} - -/* Roger Clark added 3 functions */ -void SPIClass::setClockDivider(uint32_t clockDivider) { - _currentSetting->clockDivider = clockDivider; - uint32_t cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR); - _currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR); -} - -void SPIClass::setBitOrder(BitOrder bitOrder) { - _currentSetting->bitOrder = bitOrder; - uint32_t cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST); - if (bitOrder == LSBFIRST) cr1 |= SPI_CR1_LSBFIRST; - _currentSetting->spi_d->regs->CR1 = cr1; -} - -/** - * Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly. - * Input parameter should be SPI_CR1_DFF set to 0 or 1 on a 32bit word. - */ -void SPIClass::setDataSize(uint32_t datasize) { - _currentSetting->dataSize = datasize; - uint32_t cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF); - uint8_t en = spi_is_enabled(_currentSetting->spi_d); - spi_peripheral_disable(_currentSetting->spi_d); - _currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF) | en; -} - -void SPIClass::setDataMode(uint8_t dataMode) { - /** - * Notes: - * As far as we know the AVR numbers for dataMode match the numbers required by the STM32. - * From the AVR doc https://www.atmel.com/images/doc2585.pdf section 2.4 - * - * SPI Mode CPOL CPHA Shift SCK-edge Capture SCK-edge - * 0 0 0 Falling Rising - * 1 0 1 Rising Falling - * 2 1 0 Rising Falling - * 3 1 1 Falling Rising - * - * On the STM32 it appears to be - * - * bit 1 - CPOL : Clock polarity - * (This bit should not be changed when communication is ongoing) - * 0 : CLK to 0 when idle - * 1 : CLK to 1 when idle - * - * bit 0 - CPHA : Clock phase - * (This bit should not be changed when communication is ongoing) - * 0 : The first clock transition is the first data capture edge - * 1 : The second clock transition is the first data capture edge - * - * If someone finds this is not the case or sees a logic error with this let me know ;-) - */ - _currentSetting->dataMode = dataMode; - uint32_t cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA); - _currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA)); -} - -void SPIClass::beginTransaction(uint8_t pin, const SPISettings &settings) { - setBitOrder(settings.bitOrder); - setDataMode(settings.dataMode); - setDataSize(settings.dataSize); - setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); - begin(); -} - -void SPIClass::beginTransactionSlave(const SPISettings &settings) { - setBitOrder(settings.bitOrder); - setDataMode(settings.dataMode); - setDataSize(settings.dataSize); - beginSlave(); -} - -void SPIClass::endTransaction() { } - -/** - * I/O - */ - -uint16_t SPIClass::read() { - while (!spi_is_rx_nonempty(_currentSetting->spi_d)) { /* nada */ } - return (uint16_t)spi_rx_reg(_currentSetting->spi_d); -} - -void SPIClass::read(uint8_t *buf, uint32_t len) { - if (len == 0) return; - spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. - spi_reg_map * regs = _currentSetting->spi_d->regs; - // start sequence: write byte 0 - regs->DR = 0x00FF; // write the first byte - // main loop - while (--len) { - while (!(regs->SR & SPI_SR_TXE)) { /* nada */ } // wait for TXE flag - noInterrupts(); // go atomic level - avoid interrupts to surely get the previously received data - regs->DR = 0x00FF; // write the next data item to be transmitted into the SPI_DR register. This clears the TXE flag. - while (!(regs->SR & SPI_SR_RXNE)) { /* nada */ } // wait till data is available in the DR register - *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. - interrupts(); // let systick do its job - } - // read remaining last byte - while (!(regs->SR & SPI_SR_RXNE)) { /* nada */ } // wait till data is available in the Rx register - *buf++ = (uint8)(regs->DR); // read and store the received byte -} - -void SPIClass::write(uint16_t data) { - /* Added for 16bit data Victor Perez. Roger Clark - * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, - * by taking the Tx code from transfer(byte) - * This almost doubles the speed of this function. - */ - spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) - waitSpiTxEnd(_currentSetting->spi_d); -} - -void SPIClass::write16(uint16_t data) { - // Added by stevestrong: write two consecutive bytes in 8 bit mode (DFF=0) - spi_tx_reg(_currentSetting->spi_d, data>>8); // write high byte - while (!spi_is_tx_empty(_currentSetting->spi_d)) { /* nada */ } // Wait until TXE=1 - spi_tx_reg(_currentSetting->spi_d, data); // write low byte - waitSpiTxEnd(_currentSetting->spi_d); -} - -void SPIClass::write(uint16_t data, uint32_t n) { - // Added by stevstrong: Repeatedly send same data by the specified number of times - spi_reg_map * regs = _currentSetting->spi_d->regs; - while (n--) { - regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) - while (!(regs->SR & SPI_SR_TXE)) { /* nada */ } // wait till Tx empty - } - while (regs->SR & SPI_SR_BSY) { /* nada */ } // wait until BSY=0 before returning -} - -void SPIClass::write(const void *data, uint32_t length) { - spi_dev * spi_d = _currentSetting->spi_d; - spi_tx(spi_d, data, length); // data can be array of bytes or words - waitSpiTxEnd(spi_d); -} - -uint8_t SPIClass::transfer(uint8_t byte) const { - spi_dev * spi_d = _currentSetting->spi_d; - spi_rx_reg(spi_d); // read any previous data - spi_tx_reg(spi_d, byte); // Write the data item to be transmitted into the SPI_DR register - waitSpiTxEnd(spi_d); - return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." -} - -uint16_t SPIClass::transfer16(uint16_t data) const { - // Modified by stevestrong: write & read two consecutive bytes in 8 bit mode (DFF=0) - // This is more effective than two distinct byte transfers - spi_dev * spi_d = _currentSetting->spi_d; - spi_rx_reg(spi_d); // read any previous data - spi_tx_reg(spi_d, data>>8); // write high byte - waitSpiTxEnd(spi_d); // wait until TXE=1 and then wait until BSY=0 - uint16_t ret = spi_rx_reg(spi_d)<<8; // read and shift high byte - spi_tx_reg(spi_d, data); // write low byte - waitSpiTxEnd(spi_d); // wait until TXE=1 and then wait until BSY=0 - ret += spi_rx_reg(spi_d); // read low byte - return ret; -} - -/** - * Roger Clark and Victor Perez, 2015 - * Performs a DMA SPI transfer with at least a receive buffer. - * If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer. - * On exit TX buffer is not modified, and RX buffer cotains the received data. - * Still in progress. - */ -void SPIClass::dmaTransferSet(const void *transmitBuf, void *receiveBuf) { - dma_init(_currentSetting->spiDmaDev); - //spi_rx_dma_enable(_currentSetting->spi_d); - //spi_tx_dma_enable(_currentSetting->spi_d); - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, - dma_bit_size, receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT ));// receive buffer DMA - if (!transmitBuf) { - transmitBuf = &ff; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, - dma_bit_size, (volatile void*)transmitBuf, dma_bit_size, (DMA_FROM_MEM));// Transmit FF repeatedly - } - else { - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, - dma_bit_size, (volatile void*)transmitBuf, dma_bit_size, (DMA_MINC_MODE | DMA_FROM_MEM ));// Transmit buffer DMA - } - dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); - dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, DMA_PRIORITY_VERY_HIGH); -} - -uint8_t SPIClass::dmaTransferRepeat(uint16_t length) { - if (length == 0) return 0; - if (spi_is_rx_nonempty(_currentSetting->spi_d) == 1) spi_rx_reg(_currentSetting->spi_d); - _currentSetting->state = SPI_STATE_TRANSFER; - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - spi_rx_dma_enable(_currentSetting->spi_d); - spi_tx_dma_enable(_currentSetting->spi_d); - if (_currentSetting->receiveCallback) - return 0; - - //uint32_t m = millis(); - uint8_t b = 0; - uint32_t m = millis(); - while (!(dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)) { - // Avoid interrupts and just loop waiting for the flag to be set. - if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } - } - - waitSpiTxEnd(_currentSetting->spi_d); // until TXE=1 and BSY=0 - spi_tx_dma_disable(_currentSetting->spi_d); - spi_rx_dma_disable(_currentSetting->spi_d); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - _currentSetting->state = SPI_STATE_READY; - return b; -} - -/** - * Roger Clark and Victor Perez, 2015 - * Performs a DMA SPI transfer with at least a receive buffer. - * If a TX buffer is not provided, FF is sent over and over for the length of the transfer. - * On exit TX buffer is not modified, and RX buffer contains the received data. - * Still in progress. - */ -uint8_t SPIClass::dmaTransfer(const void *transmitBuf, void *receiveBuf, uint16_t length) { - dmaTransferSet(transmitBuf, receiveBuf); - return dmaTransferRepeat(length); -} - -/** - * Roger Clark and Victor Perez, 2015 - * Performs a DMA SPI send using a TX buffer. - * On exit TX buffer is not modified. - * Still in progress. - * 2016 - stevstrong - reworked to automatically detect bit size from SPI setting - */ -void SPIClass::dmaSendSet(const void * transmitBuf, bool minc) { - uint32_t flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - dma_init(_currentSetting->spiDmaDev); - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, - (volatile void*)transmitBuf, dma_bit_size, flags);// Transmit buffer DMA - dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); -} - -uint8_t SPIClass::dmaSendRepeat(uint16_t length) { - if (length == 0) return 0; - - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - _currentSetting->state = SPI_STATE_TRANSMIT; - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); // enable transmit - spi_tx_dma_enable(_currentSetting->spi_d); - if (_currentSetting->transmitCallback) return 0; - - uint32_t m = millis(); - uint8_t b = 0; - while (!(dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)) { - // Avoid interrupts and just loop waiting for the flag to be set. - if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } - } - waitSpiTxEnd(_currentSetting->spi_d); // until TXE=1 and BSY=0 - spi_tx_dma_disable(_currentSetting->spi_d); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - _currentSetting->state = SPI_STATE_READY; - return b; -} - -uint8_t SPIClass::dmaSend(const void * transmitBuf, uint16_t length, bool minc) { - dmaSendSet(transmitBuf, minc); - return dmaSendRepeat(length); -} - -uint8_t SPIClass::dmaSendAsync(const void * transmitBuf, uint16_t length, bool minc) { - uint8_t b = 0; - - if (_currentSetting->state != SPI_STATE_READY) { - uint32_t m = millis(); - while (!(dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)) { - //Avoid interrupts and just loop waiting for the flag to be set. - //delayMicroseconds(10); - if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } - } - waitSpiTxEnd(_currentSetting->spi_d); // until TXE=1 and BSY=0 - spi_tx_dma_disable(_currentSetting->spi_d); - dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - _currentSetting->state = SPI_STATE_READY; - } - - if (length == 0) return 0; - uint32_t flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); - - dma_init(_currentSetting->spiDmaDev); - // TX - dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; - dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, - dma_bit_size, (volatile void*)transmitBuf, dma_bit_size, flags);// Transmit buffer DMA - dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); - dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit - spi_tx_dma_enable(_currentSetting->spi_d); - - _currentSetting->state = SPI_STATE_TRANSMIT; - return b; -} - - -/** - * New functions added to manage callbacks. - * Victor Perez 2017 - */ -void SPIClass::onReceive(void(*callback)()) { - _currentSetting->receiveCallback = callback; - if (callback) { - switch (_currentSetting->spi_d->clk_id) { - #if BOARD_NR_SPI >= 1 - case RCC_SPI1: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi1EventCallback); - break; - #endif - #if BOARD_NR_SPI >= 2 - case RCC_SPI2: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi2EventCallback); - break; - #endif - #if BOARD_NR_SPI >= 3 - case RCC_SPI3: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi3EventCallback); - break; - #endif - default: - ASSERT(0); - } - } - else { - dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - } -} - -void SPIClass::onTransmit(void(*callback)()) { - _currentSetting->transmitCallback = callback; - if (callback) { - switch (_currentSetting->spi_d->clk_id) { - #if BOARD_NR_SPI >= 1 - case RCC_SPI1: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi1EventCallback); - break; - #endif - #if BOARD_NR_SPI >= 2 - case RCC_SPI2: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi2EventCallback); - break; - #endif - #if BOARD_NR_SPI >= 3 - case RCC_SPI3: - dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi3EventCallback); - break; - #endif - default: - ASSERT(0); - } - } - else { - dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - } -} - -/** - * TODO: check if better to first call the customer code, next disable the DMA requests. - * Also see if we need to check whether callbacks are set or not, may be better to be checked - * during the initial setup and only set the callback to EventCallback if they are set. - */ -void SPIClass::EventCallback() { - waitSpiTxEnd(_currentSetting->spi_d); - switch (_currentSetting->state) { - case SPI_STATE_TRANSFER: - while (spi_is_rx_nonempty(_currentSetting->spi_d)) { /* nada */ } - _currentSetting->state = SPI_STATE_READY; - spi_tx_dma_disable(_currentSetting->spi_d); - spi_rx_dma_disable(_currentSetting->spi_d); - //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); - if (_currentSetting->receiveCallback) - _currentSetting->receiveCallback(); - break; - case SPI_STATE_TRANSMIT: - _currentSetting->state = SPI_STATE_READY; - spi_tx_dma_disable(_currentSetting->spi_d); - //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); - if (_currentSetting->transmitCallback) - _currentSetting->transmitCallback(); - break; - default: - break; - } -} - -void SPIClass::attachInterrupt() { - // Should be enableInterrupt() -} - -void SPIClass::detachInterrupt() { - // Should be disableInterrupt() -} - -/** - * Pin accessors - */ - -uint8_t SPIClass::misoPin() { - return dev_to_spi_pins(_currentSetting->spi_d)->miso; -} - -uint8_t SPIClass::mosiPin() { - return dev_to_spi_pins(_currentSetting->spi_d)->mosi; -} - -uint8_t SPIClass::sckPin() { - return dev_to_spi_pins(_currentSetting->spi_d)->sck; -} - -uint8_t SPIClass::nssPin() { - return dev_to_spi_pins(_currentSetting->spi_d)->nss; -} - -/** - * Deprecated functions - */ -uint8_t SPIClass::send(uint8_t data) { write(data); return 1; } -uint8_t SPIClass::send(uint8_t *buf, uint32_t len) { write(buf, len); return len; } -uint8_t SPIClass::recv() { return read(); } - -/** - * DMA call back functions, one per port. - */ -#if BOARD_NR_SPI >= 1 - void SPIClass::_spi1EventCallback() { - reinterpret_cast(_spi1_this)->EventCallback(); - } -#endif -#if BOARD_NR_SPI >= 2 - void SPIClass::_spi2EventCallback() { - reinterpret_cast(_spi2_this)->EventCallback(); - } -#endif -#if BOARD_NR_SPI >= 3 - void SPIClass::_spi3EventCallback() { - reinterpret_cast(_spi3_this)->EventCallback(); - } -#endif - -/** - * Auxiliary functions - */ -static const spi_pins* dev_to_spi_pins(spi_dev *dev) { - switch (dev->clk_id) { - #if BOARD_NR_SPI >= 1 - case RCC_SPI1: return board_spi_pins; - #endif - #if BOARD_NR_SPI >= 2 - case RCC_SPI2: return board_spi_pins + 1; - #endif - #if BOARD_NR_SPI >= 3 - case RCC_SPI3: return board_spi_pins + 2; - #endif - default: return NULL; - } -} - -static void disable_pwm(const stm32_pin_info *i) { - if (i->timer_device) - timer_set_mode(i->timer_device, i->timer_channel, TIMER_DISABLED); -} - -static void configure_gpios(spi_dev *dev, bool as_master) { - const spi_pins *pins = dev_to_spi_pins(dev); - if (!pins) return; - - const stm32_pin_info *nssi = &PIN_MAP[pins->nss], - *scki = &PIN_MAP[pins->sck], - *misoi = &PIN_MAP[pins->miso], - *mosii = &PIN_MAP[pins->mosi]; - - disable_pwm(nssi); - disable_pwm(scki); - disable_pwm(misoi); - disable_pwm(mosii); - - spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, - scki->gpio_device, scki->gpio_bit, misoi->gpio_bit, - mosii->gpio_bit); -} - -static const spi_baud_rate baud_rates[8] __FLASH__ = { - SPI_BAUD_PCLK_DIV_2, - SPI_BAUD_PCLK_DIV_4, - SPI_BAUD_PCLK_DIV_8, - SPI_BAUD_PCLK_DIV_16, - SPI_BAUD_PCLK_DIV_32, - SPI_BAUD_PCLK_DIV_64, - SPI_BAUD_PCLK_DIV_128, - SPI_BAUD_PCLK_DIV_256, -}; - -/** - * Note: This assumes you're on a LeafLabs-style board - * (CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). - */ -static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { - uint32_t clock = 0; - switch (rcc_dev_clk(dev->clk_id)) { - case RCC_AHB: - case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz - case RCC_APB1: clock = STM32_PCLK1; break; // 36 Mhz - } - clock >>= 1; - - uint8_t i = 0; - while (i < 7 && freq < clock) { clock >>= 1; i++; } - return baud_rates[i]; -} - -SPIClass SPI(SPI_DEVICE); - -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/SPI.h b/Marlin/src/HAL/STM32F1/SPI.h deleted file mode 100644 index 0d20a46577..0000000000 --- a/Marlin/src/HAL/STM32F1/SPI.h +++ /dev/null @@ -1,420 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ -#pragma once - -#include -#include -#include - -#include -#include -#include - -// SPI_HAS_TRANSACTION means SPI has -// - beginTransaction() -// - endTransaction() -// - usingInterrupt() -// - SPISetting(clock, bitOrder, dataMode) -//#define SPI_HAS_TRANSACTION - -#define SPI_CLOCK_DIV2 SPI_BAUD_PCLK_DIV_2 -#define SPI_CLOCK_DIV4 SPI_BAUD_PCLK_DIV_4 -#define SPI_CLOCK_DIV8 SPI_BAUD_PCLK_DIV_8 -#define SPI_CLOCK_DIV16 SPI_BAUD_PCLK_DIV_16 -#define SPI_CLOCK_DIV32 SPI_BAUD_PCLK_DIV_32 -#define SPI_CLOCK_DIV64 SPI_BAUD_PCLK_DIV_64 -#define SPI_CLOCK_DIV128 SPI_BAUD_PCLK_DIV_128 -#define SPI_CLOCK_DIV256 SPI_BAUD_PCLK_DIV_256 - -/* - * Roger Clark. 20150106 - * Commented out redundant AVR defined - * -#define SPI_MODE_MASK 0x0C // CPOL = bit 3, CPHA = bit 2 on SPCR -#define SPI_CLOCK_MASK 0x03 // SPR1 = bit 1, SPR0 = bit 0 on SPCR -#define SPI_2XCLOCK_MASK 0x01 // SPI2X = bit 0 on SPSR - -// define SPI_AVR_EIMSK for AVR boards with external interrupt pins -#ifdef EIMSK - #define SPI_AVR_EIMSK EIMSK -#elif defined(GICR) - #define SPI_AVR_EIMSK GICR -#elif defined(GIMSK) - #define SPI_AVR_EIMSK GIMSK -#endif -*/ - -#ifndef STM32_LSBFIRST - #define STM32_LSBFIRST 0 -#endif -#ifndef STM32_MSBFIRST - #define STM32_MSBFIRST 1 -#endif - -// PC13 or PA4 -#define BOARD_SPI_DEFAULT_SS PA4 -//#define BOARD_SPI_DEFAULT_SS PC13 - -#define SPI_MODE0 SPI_MODE_0 -#define SPI_MODE1 SPI_MODE_1 -#define SPI_MODE2 SPI_MODE_2 -#define SPI_MODE3 SPI_MODE_3 - -#define DATA_SIZE_8BIT SPI_CR1_DFF_8_BIT -#define DATA_SIZE_16BIT SPI_CR1_DFF_16_BIT - -typedef enum { - SPI_STATE_IDLE, - SPI_STATE_READY, - SPI_STATE_RECEIVE, - SPI_STATE_TRANSMIT, - SPI_STATE_TRANSFER -} spi_mode_t; - -class SPISettings { -public: - SPISettings(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode) { - if (__builtin_constant_p(inClock)) - init_AlwaysInline(inClock, inBitOrder, inDataMode, DATA_SIZE_8BIT); - else - init_MightInline(inClock, inBitOrder, inDataMode, DATA_SIZE_8BIT); - } - SPISettings(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { - if (__builtin_constant_p(inClock)) - init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); - else - init_MightInline(inClock, inBitOrder, inDataMode, inDataSize); - } - SPISettings(uint32_t inClock) { - if (__builtin_constant_p(inClock)) - init_AlwaysInline(inClock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); - else - init_MightInline(inClock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); - } - SPISettings() { - init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); - } -private: - void init_MightInline(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { - init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); - } - void init_AlwaysInline(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode, uint32_t inDataSize) __attribute__((__always_inline__)) { - clock = inClock; - bitOrder = inBitOrder; - dataMode = inDataMode; - dataSize = inDataSize; - //state = SPI_STATE_IDLE; - } - uint32_t clock; - uint32_t dataSize; - uint32_t clockDivider; - BitOrder bitOrder; - uint8_t dataMode; - uint8_t _SSPin; - volatile spi_mode_t state; - spi_dev *spi_d; - dma_channel spiRxDmaChannel, spiTxDmaChannel; - dma_dev* spiDmaDev; - void (*receiveCallback)() = NULL; - void (*transmitCallback)() = NULL; - - friend class SPIClass; -}; - -/* - * Kept for compat. - */ -static const uint8_t ff = 0xFF; - -/** - * @brief Wirish SPI interface. - * - * This implementation uses software slave management, so the caller - * is responsible for controlling the slave select line. - */ -class SPIClass { - -public: - /** - * @param spiPortNumber Number of the SPI port to manage. - */ - SPIClass(uint32_t spiPortNumber); - - /** - * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). - */ - void begin(); - - /** - * @brief Turn on a SPI port and set its GPIO pin modes for use as a slave. - * - * SPI port is enabled in full duplex mode, with software slave management. - * - * @param bitOrder Either LSBFIRST (little-endian) or MSBFIRST(big-endian) - * @param mode SPI mode to use - */ - void beginSlave(uint32_t bitOrder, uint32_t mode); - - /** - * @brief Equivalent to beginSlave(MSBFIRST, 0). - */ - void beginSlave(); - - /** - * @brief Disables the SPI port, but leaves its GPIO pin modes unchanged. - */ - void end(); - - void beginTransaction(const SPISettings &settings) { beginTransaction(BOARD_SPI_DEFAULT_SS, settings); } - void beginTransaction(uint8_t pin, const SPISettings &settings); - void endTransaction(); - - void beginTransactionSlave(const SPISettings &settings); - - void setClockDivider(uint32_t clockDivider); - void setBitOrder(BitOrder bitOrder); - void setDataMode(uint8_t dataMode); - - // SPI Configuration methods - void attachInterrupt(); - void detachInterrupt(); - - /* Victor Perez. Added to change datasize from 8 to 16 bit modes on the fly. - * Input parameter should be SPI_CR1_DFF set to 0 or 1 on a 32bit word. - * Requires an added function spi_data_size on STM32F1 / cores / maple / libmaple / spi.c - */ - void setDataSize(uint32_t ds); - - uint32_t getDataSize() { return _currentSetting->dataSize; } - - /* Victor Perez 2017. Added to set and clear callback functions for callback - * on DMA transfer completion. - * onReceive used to set the callback in case of dmaTransfer (tx/rx), once rx is completed - * onTransmit used to set the callback in case of dmaSend (tx only). That function - * will NOT be called in case of TX/RX - */ - void onReceive(void(*)()); - void onTransmit(void(*)()); - - /* - * I/O - */ - - /** - * @brief Return the next unread byte/word. - * - * If there is no unread byte/word waiting, this function will block - * until one is received. - */ - uint16_t read(); - - /** - * @brief Read length bytes, storing them into buffer. - * @param buffer Buffer to store received bytes into. - * @param length Number of bytes to store in buffer. This - * function will block until the desired number of - * bytes have been read. - */ - void read(uint8_t *buffer, uint32_t length); - - /** - * @brief Transmit one byte/word. - * @param data to transmit. - */ - void write(uint16_t data); - void write16(uint16_t data); // write 2 bytes in 8 bit mode (DFF=0) - - /** - * @brief Transmit one byte/word a specified number of times. - * @param data to transmit. - */ - void write(uint16_t data, uint32_t n); - - /** - * @brief Transmit multiple bytes/words. - * @param buffer Bytes/words to transmit. - * @param length Number of bytes/words in buffer to transmit. - */ - void write(const void * buffer, uint32_t length); - - /** - * @brief Transmit a byte, then return the next unread byte. - * - * This function transmits before receiving. - * - * @param data Byte to transmit. - * @return Next unread byte. - */ - uint8_t transfer(uint8_t data) const; - uint16_t transfer16(uint16_t data) const; - - /** - * @brief Sets up a DMA Transfer for "length" bytes. - * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. - * - * This function transmits and receives to buffers. - * - * @param transmitBuf buffer Bytes to transmit. If passed as 0, it sends FF repeatedly for "length" bytes - * @param receiveBuf buffer Bytes to save received data. - * @param length Number of bytes in buffer to transmit. - */ - uint8_t dmaTransfer(const void * transmitBuf, void * receiveBuf, uint16_t length); - void dmaTransferSet(const void *transmitBuf, void *receiveBuf); - uint8_t dmaTransferRepeat(uint16_t length); - - /** - * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. - * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. - * - * This function only transmits and does not care about the RX fifo. - * - * @param data buffer half words to transmit, - * @param length Number of bytes in buffer to transmit. - * @param minc Set to use Memory Increment mode, clear to use Circular mode. - */ - uint8_t dmaSend(const void * transmitBuf, uint16_t length, bool minc = 1); - void dmaSendSet(const void * transmitBuf, bool minc); - uint8_t dmaSendRepeat(uint16_t length); - - uint8_t dmaSendAsync(const void * transmitBuf, uint16_t length, bool minc = 1); - /* - * Pin accessors - */ - - /** - * @brief Return the number of the MISO (master in, slave out) pin - */ - uint8_t misoPin(); - - /** - * @brief Return the number of the MOSI (master out, slave in) pin - */ - uint8_t mosiPin(); - - /** - * @brief Return the number of the SCK (serial clock) pin - */ - uint8_t sckPin(); - - /** - * @brief Return the number of the NSS (slave select) pin - */ - uint8_t nssPin(); - - /* Escape hatch */ - - /** - * @brief Get a pointer to the underlying libmaple spi_dev for - * this HardwareSPI instance. - */ - spi_dev* c_dev() { return _currentSetting->spi_d; } - - spi_dev* dev() { return _currentSetting->spi_d; } - - /** - * @brief Sets the number of the SPI peripheral to be used by - * this HardwareSPI instance. - * - * @param spi_num Number of the SPI port. 1-2 in low density devices - * or 1-3 in high density devices. - */ - void setModule(int spi_num) { - _currentSetting = &_settings[spi_num - 1];// SPI channels are called 1 2 and 3 but the array is zero indexed - } - - /* -- The following methods are deprecated --------------------------- */ - - /** - * @brief Deprecated. - * - * Use HardwareSPI::transfer() instead. - * - * @see HardwareSPI::transfer() - */ - uint8_t send(uint8_t data); - - /** - * @brief Deprecated. - * - * Use HardwareSPI::write() in combination with - * HardwareSPI::read() (or HardwareSPI::transfer()) instead. - * - * @see HardwareSPI::write() - * @see HardwareSPI::read() - * @see HardwareSPI::transfer() - */ - uint8_t send(uint8_t *data, uint32_t length); - - /** - * @brief Deprecated. - * - * Use HardwareSPI::read() instead. - * - * @see HardwareSPI::read() - */ - uint8_t recv(); - -private: - - SPISettings _settings[BOARD_NR_SPI]; - SPISettings *_currentSetting; - - void updateSettings(); - - /* - * Functions added for DMA transfers with Callback. - * Experimental. - */ - - void EventCallback(); - - #if BOARD_NR_SPI >= 1 - static void _spi1EventCallback(); - #endif - #if BOARD_NR_SPI >= 2 - static void _spi2EventCallback(); - #endif - #if BOARD_NR_SPI >= 3 - static void _spi3EventCallback(); - #endif - /* - spi_dev *spi_d; - uint8_t _SSPin; - uint32_t clockDivider; - uint8_t dataMode; - BitOrder bitOrder; - */ -}; - -/** - * @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset. - */ -static inline void waitSpiTxEnd(spi_dev *spi_d) { - while (spi_is_tx_empty(spi_d) == 0) { /* nada */ } // wait until TXE=1 - while (spi_is_busy(spi_d) != 0) { /* nada */ } // wait until BSY=0 -} - -extern SPIClass SPI; diff --git a/Marlin/src/HAL/STM32F1/Servo.cpp b/Marlin/src/HAL/STM32F1/Servo.cpp deleted file mode 100644 index e1ee831493..0000000000 --- a/Marlin/src/HAL/STM32F1/Servo.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -uint8_t ServoCount = 0; - -#include "Servo.h" - -//#include "Servo.h" - -#include -#include -#include -#include - -/** - * 20 millisecond period config. For a 1-based prescaler, - * - * (prescaler * overflow / CYC_MSEC) msec = 1 timer cycle = 20 msec - * => prescaler * overflow = 20 * CYC_MSEC - * - * This uses the smallest prescaler that allows an overflow < 2^16. - */ -#define MAX_OVERFLOW UINT16_MAX //((1 << 16) - 1) -#define CYC_MSEC (1000 * CYCLES_PER_MICROSECOND) -#define TAU_MSEC 20 -#define TAU_USEC (TAU_MSEC * 1000) -#define TAU_CYC (TAU_MSEC * CYC_MSEC) -#define SERVO_PRESCALER (TAU_CYC / MAX_OVERFLOW + 1) -#define SERVO_OVERFLOW ((uint16_t)round((double)TAU_CYC / SERVO_PRESCALER)) - -// Unit conversions -#define US_TO_COMPARE(us) uint16_t(map((us), 0, TAU_USEC, 0, SERVO_OVERFLOW)) -#define COMPARE_TO_US(c) uint32_t(map((c), 0, SERVO_OVERFLOW, 0, TAU_USEC)) -#define ANGLE_TO_US(a) uint16_t(map((a), minAngle, maxAngle, SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW)) -#define US_TO_ANGLE(us) int16_t(map((us), SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW, minAngle, maxAngle)) - -void libServo::servoWrite(uint8_t inPin, uint16_t duty_cycle) { - #ifdef SERVO0_TIMER_NUM - if (servoIndex == 0) { - pwmSetDuty(duty_cycle); - return; - } - #endif - - timer_dev *tdev = PIN_MAP[inPin].timer_device; - uint8_t tchan = PIN_MAP[inPin].timer_channel; - if (tdev) timer_set_compare(tdev, tchan, duty_cycle); -} - -libServo::libServo() { - servoIndex = ServoCount < MAX_SERVOS ? ServoCount++ : INVALID_SERVO; - timer_set_interrupt_priority(SERVO0_TIMER_NUM, SERVO0_TIMER_IRQ_PRIO); -} - -bool libServo::attach(const int32_t inPin, const int32_t inMinAngle, const int32_t inMaxAngle) { - if (servoIndex >= MAX_SERVOS) return false; - if (inPin >= BOARD_NR_GPIO_PINS) return false; - - minAngle = inMinAngle; - maxAngle = inMaxAngle; - angle = -1; - - #ifdef SERVO0_TIMER_NUM - if (servoIndex == 0 && setupSoftPWM(inPin)) { - pin = inPin; // set attached() - return true; - } - #endif - - if (!PWM_PIN(inPin)) return false; - - timer_dev *tdev = PIN_MAP[inPin].timer_device; - //uint8_t tchan = PIN_MAP[inPin].timer_channel; - - SET_PWM(inPin); - servoWrite(inPin, 0); - - timer_pause(tdev); - timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based - timer_set_reload(tdev, SERVO_OVERFLOW); - timer_generate_update(tdev); - timer_resume(tdev); - - pin = inPin; // set attached() - return true; -} - -bool libServo::detach() { - if (!attached()) return false; - angle = -1; - servoWrite(pin, 0); - return true; -} - -int32_t libServo::read() const { - if (attached()) { - #ifdef SERVO0_TIMER_NUM - if (servoIndex == 0) return angle; - #endif - timer_dev *tdev = PIN_MAP[pin].timer_device; - uint8_t tchan = PIN_MAP[pin].timer_channel; - return US_TO_ANGLE(COMPARE_TO_US(timer_get_compare(tdev, tchan))); - } - return 0; -} - -void libServo::move(const int32_t value) { - constexpr uint16_t servo_delay[] = SERVO_DELAY; - static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - - if (attached()) { - angle = constrain(value, minAngle, maxAngle); - servoWrite(pin, US_TO_COMPARE(ANGLE_TO_US(angle))); - safe_delay(servo_delay[servoIndex]); - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); - } -} - -#ifdef SERVO0_TIMER_NUM - extern "C" void Servo_IRQHandler() { - static timer_dev *tdev = get_timer_dev(SERVO0_TIMER_NUM); - uint16_t SR = timer_get_status(tdev); - if (SR & TIMER_SR_CC1IF) { // channel 1 off - #ifdef SERVO0_PWM_OD - OUT_WRITE_OD(SERVO0_PIN, 1); // off - #else - OUT_WRITE(SERVO0_PIN, 0); - #endif - timer_reset_status_bit(tdev, TIMER_SR_CC1IF_BIT); - } - if (SR & TIMER_SR_CC2IF) { // channel 2 resume - #ifdef SERVO0_PWM_OD - OUT_WRITE_OD(SERVO0_PIN, 0); // on - #else - OUT_WRITE(SERVO0_PIN, 1); - #endif - timer_reset_status_bit(tdev, TIMER_SR_CC2IF_BIT); - } - } - - bool libServo::setupSoftPWM(const int32_t inPin) { - timer_dev *tdev = get_timer_dev(SERVO0_TIMER_NUM); - if (!tdev) return false; - #ifdef SERVO0_PWM_OD - OUT_WRITE_OD(inPin, 1); - #else - OUT_WRITE(inPin, 0); - #endif - - timer_pause(tdev); - timer_set_mode(tdev, 1, TIMER_OUTPUT_COMPARE); // counter with isr - timer_oc_set_mode(tdev, 1, TIMER_OC_MODE_FROZEN, 0); // no pin output change - timer_oc_set_mode(tdev, 2, TIMER_OC_MODE_FROZEN, 0); // no pin output change - timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based - timer_set_reload(tdev, SERVO_OVERFLOW); - timer_set_compare(tdev, 1, SERVO_OVERFLOW); - timer_set_compare(tdev, 2, SERVO_OVERFLOW); - timer_attach_interrupt(tdev, 1, Servo_IRQHandler); - timer_attach_interrupt(tdev, 2, Servo_IRQHandler); - timer_generate_update(tdev); - timer_resume(tdev); - - return true; - } - - void libServo::pwmSetDuty(const uint16_t duty_cycle) { - timer_dev *tdev = get_timer_dev(SERVO0_TIMER_NUM); - timer_set_compare(tdev, 1, duty_cycle); - timer_generate_update(tdev); - if (duty_cycle) { - timer_enable_irq(tdev, 1); - timer_enable_irq(tdev, 2); - } - else { - timer_disable_irq(tdev, 1); - timer_disable_irq(tdev, 2); - #ifdef SERVO0_PWM_OD - OUT_WRITE_OD(pin, 1); // off - #else - OUT_WRITE(pin, 0); - #endif - } - } - - void libServo::pauseSoftPWM() { // detach - timer_dev *tdev = get_timer_dev(SERVO0_TIMER_NUM); - timer_pause(tdev); - pwmSetDuty(0); - } - -#else - - bool libServo::setupSoftPWM(const int32_t inPin) { return false; } - void libServo::pwmSetDuty(const uint16_t duty_cycle) {} - void libServo::pauseSoftPWM() {} - -#endif - -#endif // HAS_SERVOS - -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/Servo.h b/Marlin/src/HAL/STM32F1/Servo.h deleted file mode 100644 index b6143de81d..0000000000 --- a/Marlin/src/HAL/STM32F1/Servo.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// Pin number of unattached pins -#define NOT_ATTACHED (-1) -#define INVALID_SERVO 255 - -#ifndef MAX_SERVOS - #define MAX_SERVOS 3 -#endif - -#define SERVO_DEFAULT_MIN_PW 544 -#define SERVO_DEFAULT_MAX_PW 2400 -#define SERVO_DEFAULT_MIN_ANGLE 0 -#define SERVO_DEFAULT_MAX_ANGLE 180 - -#define HAL_SERVO_LIB libServo - -class libServo { - public: - libServo(); - bool attach(const int32_t pin, const int32_t minAngle=SERVO_DEFAULT_MIN_ANGLE, const int32_t maxAngle=SERVO_DEFAULT_MAX_ANGLE); - bool attached() const { return pin != NOT_ATTACHED; } - bool detach(); - void move(const int32_t value); - int32_t read() const; - private: - void servoWrite(uint8_t pin, const uint16_t duty_cycle); - - uint8_t servoIndex; // index into the channel data for this servo - int32_t pin = NOT_ATTACHED; - int32_t minAngle; - int32_t maxAngle; - int32_t angle; - - bool setupSoftPWM(const int32_t pin); - void pauseSoftPWM(); - void pwmSetDuty(const uint16_t duty_cycle); -}; diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp deleted file mode 100644 index 993403cf72..0000000000 --- a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(__STM32F1__) && !defined(HAVE_SW_SERIAL) - -/** - * Empty class for Software Serial implementation (Custom RX/TX pins) - * - * TODO: Optionally use https://github.com/FYSETC/SoftwareSerialM if TMC UART is wanted - */ - -#include "SoftwareSerial.h" - -// Constructor - -SoftwareSerial::SoftwareSerial(int8_t RX_pin, int8_t TX_pin) {} - -// Public - -void SoftwareSerial::begin(const uint32_t baudrate) { -} - -bool SoftwareSerial::available() { - return false; -} - -uint8_t SoftwareSerial::read() { - return 0; -} - -uint16_t SoftwareSerial::write(uint8_t byte) { - return 0; -} - -void SoftwareSerial::flush() {} - -void SoftwareSerial::listen() { - listening = true; -} - -void SoftwareSerial::stopListening() { - listening = false; -} - -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.h b/Marlin/src/HAL/STM32F1/SoftwareSerial.h deleted file mode 100644 index 1c8058665a..0000000000 --- a/Marlin/src/HAL/STM32F1/SoftwareSerial.h +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -#ifndef HAVE_SW_SERIAL - #define SW_SERIAL_PLACEHOLDER 1 -#endif - -class SoftwareSerial { -public: - SoftwareSerial(int8_t RX_pin, int8_t TX_pin); - - void begin(const uint32_t baudrate); - - bool available(); - - uint8_t read(); - uint16_t write(uint8_t byte); - void flush(); - - void listen(); - void stopListening(); - -protected: - bool listening; -}; diff --git a/Marlin/src/HAL/STM32F1/build_flags.py b/Marlin/src/HAL/STM32F1/build_flags.py deleted file mode 100755 index 98c871a1d8..0000000000 --- a/Marlin/src/HAL/STM32F1/build_flags.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import print_function -import sys - -#dynamic build flags for generic compile options -if __name__ == "__main__": - args = " ".join([ "-std=gnu11", - "-Os", - "-mcpu=cortex-m3", - "-mthumb", - - "-fsigned-char", - "-fno-move-loop-invariants", - "-fno-strict-aliasing", - - "--specs=nano.specs", - "--specs=nosys.specs", - - "-IMarlin/src/HAL/STM32F1", - - "-MMD", - "-MP", - "-DTARGET_STM32F1" - ]) - - for i in range(1, len(sys.argv)): - args += " " + sys.argv[i] - - print(args) - -# extra script for linker options -else: - from SCons.Script import DefaultEnvironment - env = DefaultEnvironment() - env.Append( - ARFLAGS=["rcs"], - - ASFLAGS=["-x", "assembler-with-cpp"], - - CXXFLAGS=[ - "-fabi-version=0", - "-fno-use-cxa-atexit", - "-fno-threadsafe-statics" - ], - LINKFLAGS=[ - "-Os", - "-mcpu=cortex-m3", - "-ffreestanding", - "-mthumb", - "--specs=nano.specs", - "--specs=nosys.specs", - "-u_printf_float", - ], - ) diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp deleted file mode 100644 index 60596054e8..0000000000 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __STM32F1__ - -#include "../../../inc/MarlinConfig.h" - -#if BOTH(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) - -#include - -#undef SPI_SPEED -#define SPI_SPEED 0 // Fastest -//#define SPI_SPEED 2 // Slower - -static uint8_t SPI_speed = SPI_SPEED; - -static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) { - LOOP_L_N(i, 8) { - if (spi_speed == 0) { - WRITE(DOGLCD_MOSI, !!(b & 0x80)); - WRITE(DOGLCD_SCK, HIGH); - b <<= 1; - if (miso_pin >= 0 && READ(miso_pin)) b |= 1; - WRITE(DOGLCD_SCK, LOW); - } - else { - const uint8_t state = (b & 0x80) ? HIGH : LOW; - LOOP_L_N(j, spi_speed) - WRITE(DOGLCD_MOSI, state); - - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) - WRITE(DOGLCD_SCK, HIGH); - - b <<= 1; - if (miso_pin >= 0 && READ(miso_pin)) b |= 1; - - LOOP_L_N(j, spi_speed) - WRITE(DOGLCD_SCK, LOW); - } - } - return b; -} - -static inline uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) { - LOOP_L_N(i, 8) { - const uint8_t state = (b & 0x80) ? HIGH : LOW; - if (spi_speed == 0) { - WRITE(DOGLCD_SCK, LOW); - WRITE(DOGLCD_MOSI, state); - WRITE(DOGLCD_MOSI, state); // need some setup time - WRITE(DOGLCD_SCK, HIGH); - } - else { - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) - WRITE(DOGLCD_SCK, LOW); - - LOOP_L_N(j, spi_speed) - WRITE(DOGLCD_MOSI, state); - - LOOP_L_N(j, spi_speed) - WRITE(DOGLCD_SCK, HIGH); - } - b <<= 1; - if (miso_pin >= 0 && READ(miso_pin)) b |= 1; - } - return b; -} - -static void u8g_sw_spi_HAL_STM32F1_shift_out(uint8_t val) { - #if ENABLED(FYSETC_MINI_12864) - swSpiTransfer_mode_3(val, SPI_speed); - #else - swSpiTransfer_mode_0(val, SPI_speed); - #endif -} - -static uint8_t swSpiInit(const uint8_t spi_speed) { - #if PIN_EXISTS(LCD_RESET) - SET_OUTPUT(LCD_RESET_PIN); - #endif - SET_OUTPUT(DOGLCD_A0); - OUT_WRITE(DOGLCD_SCK, LOW); - OUT_WRITE(DOGLCD_MOSI, LOW); - OUT_WRITE(DOGLCD_CS, HIGH); - return spi_speed; -} - -uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - switch (msg) { - case U8G_COM_MSG_INIT: - SPI_speed = swSpiInit(SPI_SPEED); - break; - - case U8G_COM_MSG_STOP: - break; - - case U8G_COM_MSG_RESET: - #if PIN_EXISTS(LCD_RESET) - WRITE(LCD_RESET_PIN, arg_val); - #endif - break; - - case U8G_COM_MSG_CHIP_SELECT: - #if ENABLED(FYSETC_MINI_12864) // This LCD SPI is running mode 3 while SD card is running mode 0 - if (arg_val) { // SCK idle state needs to be set to the proper idle state before - // the next chip select goes active - WRITE(DOGLCD_SCK, HIGH); // Set SCK to mode 3 idle state before CS goes active - WRITE(DOGLCD_CS, LOW); - } - else { - WRITE(DOGLCD_CS, HIGH); - WRITE(DOGLCD_SCK, LOW); // Set SCK to mode 0 idle state after CS goes inactive - } - #else - WRITE(DOGLCD_CS, !arg_val); - #endif - break; - - case U8G_COM_MSG_WRITE_BYTE: - u8g_sw_spi_HAL_STM32F1_shift_out(arg_val); - break; - - case U8G_COM_MSG_WRITE_SEQ: { - uint8_t *ptr = (uint8_t *)arg_ptr; - while (arg_val > 0) { - u8g_sw_spi_HAL_STM32F1_shift_out(*ptr++); - arg_val--; - } - } break; - - case U8G_COM_MSG_WRITE_SEQ_P: { - uint8_t *ptr = (uint8_t *)arg_ptr; - while (arg_val > 0) { - u8g_sw_spi_HAL_STM32F1_shift_out(u8g_pgm_read(ptr)); - ptr++; - arg_val--; - } - } break; - - case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ - WRITE(DOGLCD_A0, arg_val); - break; - } - return 1; -} - -#endif // HAS_MARLINUI_U8GLIB && FORCE_SOFT_SPI -#endif // STM32F1 diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp deleted file mode 100644 index 658b7cd4a6..0000000000 --- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * PersistentStore for Arduino-style EEPROM interface - * with simple implementations supplied by Marlin. - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(IIC_BL24CXX_EEPROM) - -#include "../shared/eeprom_if.h" -#include "../shared/eeprom_api.h" - -// -// PersistentStore -// - -#ifndef MARLIN_EEPROM_SIZE - #error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM." -#endif - -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { eeprom_init(); return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t v = *value; - uint8_t * const p = (uint8_t * const)pos; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - delay(2); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t * const p = (uint8_t * const)pos; - uint8_t c = eeprom_read_byte(p); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // IIC_BL24CXX_EEPROM -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp deleted file mode 100644 index 8db8c8638b..0000000000 --- a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * persistent_store_flash.cpp - * HAL for stm32duino and compatible (STM32F1) - * Implementation of EEPROM settings in SDCard - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(FLASH_EEPROM_EMULATION) - -#include "../shared/eeprom_api.h" - -#include -#include - -// Store settings in the last two pages -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE ((EEPROM_PAGE_SIZE) * 2) -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; -static bool eeprom_dirty = false; - -bool PersistentStore::access_start() { - const uint32_t* source = reinterpret_cast(EEPROM_PAGE0_BASE); - uint32_t* destination = reinterpret_cast(ram_eeprom); - - static_assert(0 == (MARLIN_EEPROM_SIZE) % 4, "MARLIN_EEPROM_SIZE is corrupted. (Must be a multiple of 4.)"); // Ensure copying as uint32_t is safe - constexpr size_t eeprom_size_u32 = (MARLIN_EEPROM_SIZE) / 4; - - for (size_t i = 0; i < eeprom_size_u32; ++i, ++destination, ++source) - *destination = *source; - - eeprom_dirty = false; - return true; -} - -bool PersistentStore::access_finish() { - - if (eeprom_dirty) { - FLASH_Status status; - - // Instead of erasing all (both) pages, maybe in the loop we check what page we are in, and if the - // data has changed in that page. We then erase the first time we "detect" a change. In theory, if - // nothing changed in a page, we wouldn't need to erase/write it. - // Or, instead of checking at this point, turn eeprom_dirty into an array of bool the size of number - // of pages. Inside write_data, we set the flag to true at that time if something in that - // page changes...either way, something to look at later. - FLASH_Unlock(); - - #define ACCESS_FINISHED(TF) { FLASH_Lock(); eeprom_dirty = false; return TF; } - - status = FLASH_ErasePage(EEPROM_PAGE0_BASE); - if (status != FLASH_COMPLETE) ACCESS_FINISHED(true); - status = FLASH_ErasePage(EEPROM_PAGE1_BASE); - if (status != FLASH_COMPLETE) ACCESS_FINISHED(true); - - const uint16_t *source = reinterpret_cast(ram_eeprom); - for (size_t i = 0; i < MARLIN_EEPROM_SIZE; i += 2, ++source) { - if (FLASH_ProgramHalfWord(EEPROM_PAGE0_BASE + i, *source) != FLASH_COMPLETE) - ACCESS_FINISHED(false); - } - - ACCESS_FINISHED(true); - } - - return true; -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - for (size_t i = 0; i < size; ++i) ram_eeprom[pos + i] = value[i]; - eeprom_dirty = true; - crc16(crc, value, size); - pos += size; - return false; // return true for any error -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { - const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos]; - if (writing) for (size_t i = 0; i < size; i++) value[i] = ram_eeprom[pos + i]; - crc16(crc, buff, size); - pos += size; - return false; // return true for any error -} - -#endif // FLASH_EEPROM_EMULATION -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp deleted file mode 100644 index ccc3fc537f..0000000000 --- a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Platform-independent Arduino functions for I2C EEPROM. - * Enable USE_SHARED_EEPROM if not supplied by the framework. - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(IIC_BL24CXX_EEPROM) - -#include "../../libs/BL24CXX.h" -#include "../shared/eeprom_if.h" - -void eeprom_init() { BL24CXX::init(); } - -// ------------------------ -// Public functions -// ------------------------ - -void eeprom_write_byte(uint8_t *pos, unsigned char value) { - const unsigned eeprom_address = (unsigned)pos; - return BL24CXX::writeOneByte(eeprom_address, value); -} - -uint8_t eeprom_read_byte(uint8_t *pos) { - const unsigned eeprom_address = (unsigned)pos; - return BL24CXX::readOneByte(eeprom_address); -} - -#endif // IIC_BL24CXX_EEPROM -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp deleted file mode 100644 index 11959191f6..0000000000 --- a/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) - * Implementation of EEPROM settings in SD Card - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDCARD_EEPROM_EMULATION) - -#include "../shared/eeprom_api.h" -#include "../../sd/cardreader.h" - -#define EEPROM_FILENAME "eeprom.dat" - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -#define _ALIGN(x) __attribute__ ((aligned(x))) // SDIO uint32_t* compat. -static char _ALIGN(4) HAL_eeprom_data[MARLIN_EEPROM_SIZE]; - -bool PersistentStore::access_start() { - if (!card.isMounted()) return false; - - SdFile file, root = card.getroot(); - if (!file.open(&root, EEPROM_FILENAME, O_RDONLY)) - return true; // false aborts the save - - int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE); - if (bytes_read < 0) return false; - for (; bytes_read < MARLIN_EEPROM_SIZE; bytes_read++) - HAL_eeprom_data[bytes_read] = 0xFF; - file.close(); - return true; -} - -bool PersistentStore::access_finish() { - if (!card.isMounted()) return false; - - SdFile file, root = card.getroot(); - int bytes_written = 0; - if (file.open(&root, EEPROM_FILENAME, O_CREAT | O_WRITE | O_TRUNC)) { - bytes_written = file.write(HAL_eeprom_data, MARLIN_EEPROM_SIZE); - file.close(); - } - return (bytes_written == MARLIN_EEPROM_SIZE); -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - for (size_t i = 0; i < size; i++) - HAL_eeprom_data[pos + i] = value[i]; - crc16(crc, value, size); - pos += size; - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { - for (size_t i = 0; i < size; i++) { - uint8_t c = HAL_eeprom_data[pos + i]; - if (writing) value[i] = c; - crc16(crc, &c, 1); - } - pos += size; - return false; -} - -#endif // SDCARD_EEPROM_EMULATION -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp deleted file mode 100644 index fffd6ccaf0..0000000000 --- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL PersistentStore for STM32F1 - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -#include "../shared/eeprom_if.h" -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM." -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::access_start() { - eeprom_init(); - #if ENABLED(SPI_EEPROM) - #if SPI_CHAN_EEPROM1 == 1 - SET_OUTPUT(BOARD_SPI1_SCK_PIN); - SET_OUTPUT(BOARD_SPI1_MOSI_PIN); - SET_INPUT(BOARD_SPI1_MISO_PIN); - SET_OUTPUT(SPI_EEPROM1_CS); - #endif - spiInit(0); - #endif - return true; -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing && value) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/endstop_interrupts.h b/Marlin/src/HAL/STM32F1/endstop_interrupts.h deleted file mode 100644 index bcb07d991d..0000000000 --- a/Marlin/src/HAL/STM32F1/endstop_interrupts.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Endstop interrupts for Libmaple STM32F1 based targets. - * - * On STM32F, all pins support external interrupt capability. - * Any pin can be used for external interrupts, but there are some restrictions. - * At most 16 different external interrupts can be used at one time. - * Further, you can’t just pick any 16 pins to use. This is because every pin on the STM32 - * connects to what is called an EXTI line, and only one pin per EXTI line can be used for external interrupts at a time - * Check the Reference Manual of the MCU to confirm which line is used by each pin - */ - -/** - * Endstop Interrupts - * - * Without endstop interrupts the endstop pins must be polled continually in - * the temperature-ISR via endstops.update(), most of the time finding no change. - * With this feature endstops.update() is called only when we know that at - * least one endstop has changed state, saving valuable CPU cycles. - * - * This feature only works when all used endstop pins can generate an 'external interrupt'. - * - * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. - * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) - */ - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); -} diff --git a/Marlin/src/HAL/STM32F1/fastio.h b/Marlin/src/HAL/STM32F1/fastio.h deleted file mode 100644 index e0e2e03a1c..0000000000 --- a/Marlin/src/HAL/STM32F1/fastio.h +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O interfaces for STM32F1 - * These use GPIO functions instead of Direct Port Manipulation, as on AVR. - */ - -#include - -#define READ(IO) (PIN_MAP[IO].gpio_device->regs->IDR & (1U << PIN_MAP[IO].gpio_bit) ? HIGH : LOW) -#define WRITE(IO,V) (PIN_MAP[IO].gpio_device->regs->BSRR = (1U << PIN_MAP[IO].gpio_bit) << ((V) ? 0 : 16)) -#define TOGGLE(IO) (PIN_MAP[IO].gpio_device->regs->ODR = PIN_MAP[IO].gpio_device->regs->ODR ^ (1U << PIN_MAP[IO].gpio_bit)) - -#define _GET_MODE(IO) gpio_get_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit) -#define _SET_MODE(IO,M) gpio_set_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit, M) -#define _SET_OUTPUT(IO) _SET_MODE(IO, GPIO_OUTPUT_PP) -#define _SET_OUTPUT_OD(IO) _SET_MODE(IO, GPIO_OUTPUT_OD) - -#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) -#define OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0) - -#define SET_INPUT(IO) _SET_MODE(IO, GPIO_INPUT_FLOATING) -#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, GPIO_INPUT_PU) -#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, GPIO_INPUT_PD) -#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) -#define SET_PWM(IO) pinMode(IO, PWM) // do{ gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, GPIO_AF_OUTPUT_PP); timer_set_mode(PIN_MAP[pin].timer_device, PIN_MAP[pin].timer_channel, TIMER_PWM); }while(0) -#define SET_PWM_OD(IO) pinMode(IO, PWM_OPEN_DRAIN) - -#define IS_INPUT(IO) (_GET_MODE(IO) == GPIO_INPUT_FLOATING || _GET_MODE(IO) == GPIO_INPUT_ANALOG || _GET_MODE(IO) == GPIO_INPUT_PU || _GET_MODE(IO) == GPIO_INPUT_PD) -#define IS_OUTPUT(IO) (_GET_MODE(IO) == GPIO_OUTPUT_PP || _GET_MODE(IO) == GPIO_OUTPUT_OD) - -#define PWM_PIN(IO) (PIN_MAP[IO].timer_device != nullptr) - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) - -// -// Pins Definitions -// -#define PA0 0x00 -#define PA1 0x01 -#define PA2 0x02 -#define PA3 0x03 -#define PA4 0x04 -#define PA5 0x05 -#define PA6 0x06 -#define PA7 0x07 -#define PA8 0x08 -#define PA9 0x09 -#define PA10 0x0A -#define PA11 0x0B -#define PA12 0x0C -#define PA13 0x0D -#define PA14 0x0E -#define PA15 0x0F - -#define PB0 0x10 -#define PB1 0x11 -#define PB2 0x12 -#define PB3 0x13 -#define PB4 0x14 -#define PB5 0x15 -#define PB6 0x16 -#define PB7 0x17 // 36 pins (F103T) -#define PB8 0x18 -#define PB9 0x19 -#define PB10 0x1A -#define PB11 0x1B -#define PB12 0x1C -#define PB13 0x1D -#define PB14 0x1E -#define PB15 0x1F - -#if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8) - #define PC13 0x20 - #define PC14 0x21 - #define PC15 0x22 -#else - #define PC0 0x20 - #define PC1 0x21 - #define PC2 0x22 - #define PC3 0x23 - #define PC4 0x24 - #define PC5 0x25 - #define PC6 0x26 - #define PC7 0x27 - #define PC8 0x28 - #define PC9 0x29 - #define PC10 0x2A - #define PC11 0x2B - #define PC12 0x2C - #define PC13 0x2D - #define PC14 0x2E - #define PC15 0x2F -#endif - -#define PD0 0x30 -#define PD1 0x31 -#define PD2 0x32 // 64 pins (F103R) -#define PD3 0x33 -#define PD4 0x34 -#define PD5 0x35 -#define PD6 0x36 -#define PD7 0x37 -#define PD8 0x38 -#define PD9 0x39 -#define PD10 0x3A -#define PD11 0x3B -#define PD12 0x3C -#define PD13 0x3D -#define PD14 0x3E -#define PD15 0x3F - -#define PE0 0x40 -#define PE1 0x41 -#define PE2 0x42 -#define PE3 0x43 -#define PE4 0x44 -#define PE5 0x45 -#define PE6 0x46 -#define PE7 0x47 -#define PE8 0x48 -#define PE9 0x49 -#define PE10 0x4A -#define PE11 0x4B -#define PE12 0x4C -#define PE13 0x4D -#define PE14 0x4E -#define PE15 0x4F // 100 pins (F103V) - -#define PF0 0x50 -#define PF1 0x51 -#define PF2 0x52 -#define PF3 0x53 -#define PF4 0x54 -#define PF5 0x55 -#define PF6 0x56 -#define PF7 0x57 -#define PF8 0x58 -#define PF9 0x59 -#define PF10 0x5A -#define PF11 0x5B -#define PF12 0x5C -#define PF13 0x5D -#define PF14 0x5E -#define PF15 0x5F - -#define PG0 0x60 -#define PG1 0x61 -#define PG2 0x62 -#define PG3 0x63 -#define PG4 0x64 -#define PG5 0x65 -#define PG6 0x66 -#define PG7 0x67 -#define PG8 0x68 -#define PG9 0x69 -#define PG10 0x6A -#define PG11 0x6B -#define PG12 0x6C -#define PG13 0x6D -#define PG14 0x6E -#define PG15 0x6F // 144 pins (F103Z) diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h deleted file mode 100644 index f52e6fec2b..0000000000 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if ENABLED(USE_USB_COMPOSITE) - //#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE." - #undef SD_CHECK_AND_RETRY -#endif diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h deleted file mode 100644 index 656fbe1ce2..0000000000 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// If no real EEPROM, Flash emulation, or SRAM emulation is available fall back to SD emulation -#if USE_FALLBACK_EEPROM - #define SDCARD_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) - #define USE_SHARED_EEPROM 1 -#endif - -// Allow SDSUPPORT to be disabled -#if DISABLED(SDSUPPORT) - #undef SDIO_SUPPORT -#endif diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h deleted file mode 100644 index 9d5026fbab..0000000000 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test STM32F1-specific configuration values for errors at compile-time. - */ - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F1." -#endif - -#if !defined(HAVE_SW_SERIAL) && HAS_TMC_SW_SERIAL - #warning "With TMC2208/9 consider using SoftwareSerialM with HAVE_SW_SERIAL and appropriate SS_TIMER." - #error "Missing SoftwareSerial implementation." -#endif - -#if ENABLED(SDCARD_EEPROM_EMULATION) && DISABLED(SDSUPPORT) - #undef SDCARD_EEPROM_EMULATION // Avoid additional error noise - #if USE_FALLBACK_EEPROM - #warning "EEPROM type not specified. Fallback is SDCARD_EEPROM_EMULATION." - #endif - #error "SDCARD_EEPROM_EMULATION requires SDSUPPORT. Enable SDSUPPORT or choose another EEPROM emulation." -#endif - -#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." -#elif ENABLED(SERIAL_STATS_DROPPED_RX) - #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." -#endif - -#if ENABLED(NEOPIXEL_LED) - #error "NEOPIXEL_LED (Adafruit NeoPixel) is not supported for HAL/STM32F1. Comment out this line to proceed at your own risk!" -#endif diff --git a/Marlin/src/HAL/STM32F1/maple_win_usb_driver/maple_serial.inf b/Marlin/src/HAL/STM32F1/maple_win_usb_driver/maple_serial.inf deleted file mode 100644 index c39f4ce0ed..0000000000 --- a/Marlin/src/HAL/STM32F1/maple_win_usb_driver/maple_serial.inf +++ /dev/null @@ -1,56 +0,0 @@ -; -; STMicroelectronics Communication Device Class driver installation file -; (C)2006 Copyright STMicroelectronics -; - -[Version] -Signature="$Windows NT$" -Class=Ports -ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} -Provider=%STM% -LayoutFile=layout.inf - -[Manufacturer] -%MFGNAME%=VirComDevice,NT,NTamd64 - -[DestinationDirs] -DefaultDestDir = 12 - -[VirComDevice.NT] -%DESCRIPTION%=DriverInstall,USB\VID_1EAF&PID_0029&MI_01 -%DESCRIPTION%=DriverInstall,USB\VID_1EAF&PID_0029&MI_01 - -[VirComDevice.NTamd64] -%DESCRIPTION%=DriverInstall,USB\VID_1EAF&PID_0029&MI_01 -%DESCRIPTION%=DriverInstall,USB\VID_1EAF&PID_0029&MI_01 - -[DriverInstall.NT] -Include=mdmcpq.inf -CopyFiles=FakeModemCopyFileSection -AddReg=DriverInstall.NT.AddReg - -[DriverInstall.NT.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,usbser.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.NT.Services] -AddService=usbser, 0x00000002, DriverServiceInst - -[DriverServiceInst] -DisplayName=%SERVICE% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\usbser.sys - -;------------------------------------------------------------------------------ -; String Definitions -;------------------------------------------------------------------------------ - - -[Strings] -STM = "LeafLabs" -MFGNAME = "LeafLabs" -DESCRIPTION = "Maple R3" -SERVICE = "USB Virtual COM port" diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp deleted file mode 100644 index 4f44f2ee90..0000000000 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(__STM32F1__) && defined(USE_USB_COMPOSITE) - -#include "msc_sd.h" -#include "SPI.h" - -#define PRODUCT_ID 0x29 - -USBMassStorage MarlinMSC; -MarlinUSBCompositeSerial MarlinCompositeSerial; - -#include "../../inc/MarlinConfig.h" - -#if SD_CONNECTION_IS(ONBOARD) - - #include "onboard_sd.h" - - static bool MSC_Write(const uint8_t *writebuff, uint32_t startSector, uint16_t numSectors) { - return (disk_write(0, writebuff, startSector, numSectors) == RES_OK); - } - static bool MSC_Read(uint8_t *readbuff, uint32_t startSector, uint16_t numSectors) { - return (disk_read(0, readbuff, startSector, numSectors) == RES_OK); - } - -#endif - -#if ENABLED(EMERGENCY_PARSER) - void (*real_rx_callback)(void); - - void my_rx_callback(void) { - real_rx_callback(); - int len = MarlinCompositeSerial.available(); - while (len-- > 0) // >0 because available() may return a negative value - emergency_parser.update(MarlinCompositeSerial.emergency_state, MarlinCompositeSerial.peek()); - } -#endif - -void MSC_SD_init() { - USBComposite.setProductId(PRODUCT_ID); - // Just set MarlinCompositeSerial enabled to true - // because when MarlinCompositeSerial.begin() is used in setup() - // it clears all USBComposite devices. - MarlinCompositeSerial.begin(); - USBComposite.end(); - USBComposite.clear(); - // Set api and register mass storage - #if SD_CONNECTION_IS(ONBOARD) - uint32_t cardSize; - if (disk_initialize(0) == RES_OK) { - if (disk_ioctl(0, GET_SECTOR_COUNT, (void *)(&cardSize)) == RES_OK) { - MarlinMSC.setDriveData(0, cardSize, MSC_Read, MSC_Write); - MarlinMSC.registerComponent(); - } - } - #endif - // Register composite Serial - MarlinCompositeSerial.registerComponent(); - USBComposite.begin(); - #if ENABLED(EMERGENCY_PARSER) - //rx is usbSerialPart.endpoints[2] - real_rx_callback = usbSerialPart.endpoints[2].callback; - usbSerialPart.endpoints[2].callback = my_rx_callback; - #endif -} - -#endif // __STM32F1__ && USE_USB_COMPOSITE diff --git a/Marlin/src/HAL/STM32F1/msc_sd.h b/Marlin/src/HAL/STM32F1/msc_sd.h deleted file mode 100644 index 1e4e4c44b1..0000000000 --- a/Marlin/src/HAL/STM32F1/msc_sd.h +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -#include "../../inc/MarlinConfigPre.h" -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif - -class MarlinUSBCompositeSerial : public USBCompositeSerial { -public: - MarlinUSBCompositeSerial() : USBCompositeSerial() - #if ENABLED(EMERGENCY_PARSER) - , emergency_state(EmergencyParser::State::EP_RESET) - #endif - { } - - #if ENABLED(EMERGENCY_PARSER) - EmergencyParser::State emergency_state; - inline bool emergency_parser_enabled() { return true; } - #endif -}; - -extern USBMassStorage MarlinMSC; -extern MarlinUSBCompositeSerial MarlinCompositeSerial; - -void MSC_SD_init(); diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.cpp b/Marlin/src/HAL/STM32F1/onboard_sd.cpp deleted file mode 100644 index 9c2b128ddc..0000000000 --- a/Marlin/src/HAL/STM32F1/onboard_sd.cpp +++ /dev/null @@ -1,558 +0,0 @@ -/** - * STM32F1: MMCv3/SDv1/SDv2 (SPI mode) control module - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] - * Copyright (C) 2015, ChaN, all right reserved. - * - * This software is a free software and there is NO WARRANTY. - * No restriction on use. You can use, modify and redistribute it for - * personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. - * Redistributions of source code must retain the above copyright notice. - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" - -#if SD_CONNECTION_IS(ONBOARD) - -#include "onboard_sd.h" -#include "SPI.h" -#include "fastio.h" - -#if HAS_SHARED_MEDIA - #ifndef ONBOARD_SPI_DEVICE - #define ONBOARD_SPI_DEVICE SPI_DEVICE - #endif - #define ONBOARD_SD_SPI SPI -#else - SPIClass OnboardSPI(ONBOARD_SPI_DEVICE); - #define ONBOARD_SD_SPI OnboardSPI -#endif - -#if ONBOARD_SPI_DEVICE == 1 - #define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_4 -#else - #define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_2 -#endif - -#define CS_LOW() WRITE(ONBOARD_SD_CS_PIN, LOW) /* Set OnboardSPI cs low */ -#define CS_HIGH() WRITE(ONBOARD_SD_CS_PIN, HIGH) /* Set OnboardSPI cs high */ - -#define FCLK_FAST() ONBOARD_SD_SPI.setClockDivider(SPI_CLOCK_MAX) -#define FCLK_SLOW() ONBOARD_SD_SPI.setClockDivider(SPI_BAUD_PCLK_DIV_256) - -/*-------------------------------------------------------------------------- - Module Private Functions ----------------------------------------------------------------------------*/ - -/* MMC/SD command */ -#define CMD0 (0) /* GO_IDLE_STATE */ -#define CMD1 (1) /* SEND_OP_COND (MMC) */ -#define ACMD41 (0x80+41) /* SEND_OP_COND (SDC) */ -#define CMD8 (8) /* SEND_IF_COND */ -#define CMD9 (9) /* SEND_CSD */ -#define CMD10 (10) /* SEND_CID */ -#define CMD12 (12) /* STOP_TRANSMISSION */ -#define ACMD13 (0x80+13) /* SD_STATUS (SDC) */ -#define CMD16 (16) /* SET_BLOCKLEN */ -#define CMD17 (17) /* READ_SINGLE_BLOCK */ -#define CMD18 (18) /* READ_MULTIPLE_BLOCK */ -#define CMD23 (23) /* SET_BLOCK_COUNT (MMC) */ -#define ACMD23 (0x80+23) /* SET_WR_BLK_ERASE_COUNT (SDC) */ -#define CMD24 (24) /* WRITE_BLOCK */ -#define CMD25 (25) /* WRITE_MULTIPLE_BLOCK */ -#define CMD32 (32) /* ERASE_ER_BLK_START */ -#define CMD33 (33) /* ERASE_ER_BLK_END */ -#define CMD38 (38) /* ERASE */ -#define CMD48 (48) /* READ_EXTR_SINGLE */ -#define CMD49 (49) /* WRITE_EXTR_SINGLE */ -#define CMD55 (55) /* APP_CMD */ -#define CMD58 (58) /* READ_OCR */ - -static volatile DSTATUS Stat = STA_NOINIT; /* Physical drive status */ -static volatile UINT timeout; -static BYTE CardType; /* Card type flags */ - -/*-----------------------------------------------------------------------*/ -/* Send/Receive data to the MMC (Platform dependent) */ -/*-----------------------------------------------------------------------*/ - -/* Exchange a byte */ -static BYTE xchg_spi ( - BYTE dat /* Data to send */ -) { - BYTE returnByte = ONBOARD_SD_SPI.transfer(dat); - return returnByte; -} - -/* Receive multiple byte */ -static void rcvr_spi_multi ( - BYTE *buff, /* Pointer to data buffer */ - UINT btr /* Number of bytes to receive (16, 64 or 512) */ -) { - ONBOARD_SD_SPI.dmaTransfer(0, const_cast(buff), btr); -} - -#if _DISKIO_WRITE - - /* Send multiple bytes */ - static void xmit_spi_multi ( - const BYTE *buff, /* Pointer to the data */ - UINT btx /* Number of bytes to send (multiple of 16) */ - ) { - ONBOARD_SD_SPI.dmaSend(const_cast(buff), btx); - } - -#endif // _DISKIO_WRITE - -/*-----------------------------------------------------------------------*/ -/* Wait for card ready */ -/*-----------------------------------------------------------------------*/ - -static int wait_ready ( /* 1:Ready, 0:Timeout */ - UINT wt /* Timeout [ms] */ -) { - BYTE d; - - timeout = millis() + wt; - do { - d = xchg_spi(0xFF); - /* This loop takes a while. Insert rot_rdq() here for multitask environment. */ - } while (d != 0xFF && (timeout > millis())); /* Wait for card goes ready or timeout */ - - return (d == 0xFF) ? 1 : 0; -} - -/*-----------------------------------------------------------------------*/ -/* Deselect card and release SPI */ -/*-----------------------------------------------------------------------*/ - -static void deselect() { - CS_HIGH(); /* CS = H */ - xchg_spi(0xFF); /* Dummy clock (force DO hi-z for multiple slave SPI) */ -} - -/*-----------------------------------------------------------------------*/ -/* Select card and wait for ready */ -/*-----------------------------------------------------------------------*/ - -static int select() { /* 1:OK, 0:Timeout */ - CS_LOW(); /* CS = L */ - xchg_spi(0xFF); /* Dummy clock (force DO enabled) */ - - if (wait_ready(500)) return 1; /* Leading busy check: Wait for card ready */ - - deselect(); /* Timeout */ - return 0; -} - -/*-----------------------------------------------------------------------*/ -/* Control SPI module (Platform dependent) */ -/*-----------------------------------------------------------------------*/ - -static void power_on() { /* Enable SSP module and attach it to I/O pads */ - ONBOARD_SD_SPI.setModule(ONBOARD_SPI_DEVICE); - ONBOARD_SD_SPI.begin(); - ONBOARD_SD_SPI.setBitOrder(MSBFIRST); - ONBOARD_SD_SPI.setDataMode(SPI_MODE0); - OUT_WRITE(ONBOARD_SD_CS_PIN, HIGH); /* Set CS# high */ -} - -static void power_off() { /* Disable SPI function */ - select(); /* Wait for card ready */ - deselect(); -} - -/*-----------------------------------------------------------------------*/ -/* Receive a data packet from the MMC */ -/*-----------------------------------------------------------------------*/ - -static int rcvr_datablock ( /* 1:OK, 0:Error */ - BYTE *buff, /* Data buffer */ - UINT btr /* Data block length (byte) */ -) { - BYTE token; - - timeout = millis() + 200; - do { /* Wait for DataStart token in timeout of 200ms */ - token = xchg_spi(0xFF); - /* This loop will take a while. Insert rot_rdq() here for multitask environment. */ - } while ((token == 0xFF) && (timeout > millis())); - if (token != 0xFE) return 0; /* Function fails if invalid DataStart token or timeout */ - - rcvr_spi_multi(buff, btr); /* Store trailing data to the buffer */ - xchg_spi(0xFF); xchg_spi(0xFF); /* Discard CRC */ - - return 1; /* Function succeeded */ -} - -/*-----------------------------------------------------------------------*/ -/* Send a data packet to the MMC */ -/*-----------------------------------------------------------------------*/ - -#if _DISKIO_WRITE - - static int xmit_datablock ( /* 1:OK, 0:Failed */ - const BYTE *buff, /* Ponter to 512 byte data to be sent */ - BYTE token /* Token */ - ) { - BYTE resp; - - if (!wait_ready(500)) return 0; /* Leading busy check: Wait for card ready to accept data block */ - - xchg_spi(token); /* Send token */ - if (token == 0xFD) return 1; /* Do not send data if token is StopTran */ - - xmit_spi_multi(buff, 512); /* Data */ - xchg_spi(0xFF); xchg_spi(0xFF); /* Dummy CRC */ - - resp = xchg_spi(0xFF); /* Receive data resp */ - - return (resp & 0x1F) == 0x05 ? 1 : 0; /* Data was accepted or not */ - - /* Busy check is done at next transmission */ - } - -#endif // _DISKIO_WRITE - -/*-----------------------------------------------------------------------*/ -/* Send a command packet to the MMC */ -/*-----------------------------------------------------------------------*/ - -static BYTE send_cmd ( /* Return value: R1 resp (bit7==1:Failed to send) */ - BYTE cmd, /* Command index */ - DWORD arg /* Argument */ -) { - BYTE n, res; - - if (cmd & 0x80) { /* Send a CMD55 prior to ACMD */ - cmd &= 0x7F; - res = send_cmd(CMD55, 0); - if (res > 1) return res; - } - - /* Select the card and wait for ready except to stop multiple block read */ - if (cmd != CMD12) { - deselect(); - if (!select()) return 0xFF; - } - - /* Send command packet */ - xchg_spi(0x40 | cmd); /* Start + command index */ - xchg_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ - xchg_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ - xchg_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ - xchg_spi((BYTE)arg); /* Argument[7..0] */ - n = 0x01; /* Dummy CRC + Stop */ - if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) */ - if (cmd == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) */ - xchg_spi(n); - - /* Receive command resp */ - if (cmd == CMD12) xchg_spi(0xFF); /* Diacard following one byte when CMD12 */ - n = 10; /* Wait for response (10 bytes max) */ - do - res = xchg_spi(0xFF); - while ((res & 0x80) && --n); - - return res; /* Return received response */ -} - -/*-------------------------------------------------------------------------- - Public Functions ----------------------------------------------------------------------------*/ - -/*-----------------------------------------------------------------------*/ -/* Initialize disk drive */ -/*-----------------------------------------------------------------------*/ - -DSTATUS disk_initialize ( - BYTE drv /* Physical drive number (0) */ -) { - BYTE n, cmd, ty, ocr[4]; - - if (drv) return STA_NOINIT; /* Supports only drive 0 */ - power_on(); /* Initialize SPI */ - - if (Stat & STA_NODISK) return Stat; /* Is a card existing in the soket? */ - - FCLK_SLOW(); - for (n = 10; n; n--) xchg_spi(0xFF); /* Send 80 dummy clocks */ - - ty = 0; - if (send_cmd(CMD0, 0) == 1) { /* Put the card SPI state */ - timeout = millis() + 1000; /* Initialization timeout = 1 sec */ - if (send_cmd(CMD8, 0x1AA) == 1) { /* Is the catd SDv2? */ - for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); /* Get 32 bit return value of R7 resp */ - if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* Does the card support 2.7-3.6V? */ - while ((timeout > millis()) && send_cmd(ACMD41, 1UL << 30)) ; /* Wait for end of initialization with ACMD41(HCS) */ - if ((timeout > millis()) && send_cmd(CMD58, 0) == 0) { /* Check CCS bit in the OCR */ - for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); - ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; /* Check if the card is SDv2 */ - } - } - } else { /* Not an SDv2 card */ - if (send_cmd(ACMD41, 0) <= 1) { /* SDv1 or MMCv3? */ - ty = CT_SD1; cmd = ACMD41; /* SDv1 (ACMD41(0)) */ - } else { - ty = CT_MMC; cmd = CMD1; /* MMCv3 (CMD1(0)) */ - } - while ((timeout > millis()) && send_cmd(cmd, 0)) ; /* Wait for the card leaves idle state */ - if (!(timeout > millis()) || send_cmd(CMD16, 512) != 0) /* Set block length: 512 */ - ty = 0; - } - } - CardType = ty; /* Card type */ - deselect(); - - if (ty) { /* OK */ - FCLK_FAST(); /* Set fast clock */ - Stat &= ~STA_NOINIT; /* Clear STA_NOINIT flag */ - } else { /* Failed */ - power_off(); - Stat = STA_NOINIT; - } - - return Stat; -} - -/*-----------------------------------------------------------------------*/ -/* Get disk status */ -/*-----------------------------------------------------------------------*/ - -DSTATUS disk_status ( - BYTE drv /* Physical drive number (0) */ -) { - if (drv) return STA_NOINIT; /* Supports only drive 0 */ - return Stat; /* Return disk status */ -} - -/*-----------------------------------------------------------------------*/ -/* Read sector(s) */ -/*-----------------------------------------------------------------------*/ - -DRESULT disk_read ( - BYTE drv, /* Physical drive number (0) */ - BYTE *buff, /* Pointer to the data buffer to store read data */ - DWORD sector, /* Start sector number (LBA) */ - UINT count /* Number of sectors to read (1..128) */ -) { - BYTE cmd; - - if (drv || !count) return RES_PARERR; /* Check parameter */ - if (Stat & STA_NOINIT) return RES_NOTRDY; /* Check if drive is ready */ - if (!(CardType & CT_BLOCK)) sector *= 512; /* LBA ot BA conversion (byte addressing cards) */ - FCLK_FAST(); - cmd = count > 1 ? CMD18 : CMD17; /* READ_MULTIPLE_BLOCK : READ_SINGLE_BLOCK */ - if (send_cmd(cmd, sector) == 0) { - do { - if (!rcvr_datablock(buff, 512)) break; - buff += 512; - } while (--count); - if (cmd == CMD18) send_cmd(CMD12, 0); /* STOP_TRANSMISSION */ - } - deselect(); - - return count ? RES_ERROR : RES_OK; /* Return result */ -} - -/*-----------------------------------------------------------------------*/ -/* Write sector(s) */ -/*-----------------------------------------------------------------------*/ - -#if _DISKIO_WRITE - - DRESULT disk_write( - BYTE drv, /* Physical drive number (0) */ - const BYTE *buff, /* Ponter to the data to write */ - DWORD sector, /* Start sector number (LBA) */ - UINT count /* Number of sectors to write (1..128) */ - ) { - if (drv || !count) return RES_PARERR; /* Check parameter */ - if (Stat & STA_NOINIT) return RES_NOTRDY; /* Check drive status */ - if (Stat & STA_PROTECT) return RES_WRPRT; /* Check write protect */ - FCLK_FAST(); - if (!(CardType & CT_BLOCK)) sector *= 512; /* LBA ==> BA conversion (byte addressing cards) */ - - if (count == 1) { /* Single sector write */ - if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ - && xmit_datablock(buff, 0xFE)) { - count = 0; - } - } - else { /* Multiple sector write */ - if (CardType & CT_SDC) send_cmd(ACMD23, count); /* Predefine number of sectors */ - if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ - do { - if (!xmit_datablock(buff, 0xFC)) break; - buff += 512; - } while (--count); - if (!xmit_datablock(0, 0xFD)) count = 1; /* STOP_TRAN token */ - } - } - deselect(); - - return count ? RES_ERROR : RES_OK; /* Return result */ - } - -#endif // _DISKIO_WRITE - -/*-----------------------------------------------------------------------*/ -/* Miscellaneous drive controls other than data read/write */ -/*-----------------------------------------------------------------------*/ - -#if _DISKIO_IOCTL - - DRESULT disk_ioctl ( - BYTE drv, /* Physical drive number (0) */ - BYTE cmd, /* Control command code */ - void *buff /* Pointer to the conrtol data */ - ) { - DRESULT res; - BYTE n, csd[16], *ptr = (BYTE *)buff; - DWORD *dp, st, ed, csize; - #if _DISKIO_ISDIO - SDIO_CMD *sdio = buff; - BYTE rc, *buf; - UINT dc; - #endif - - if (drv) return RES_PARERR; /* Check parameter */ - if (Stat & STA_NOINIT) return RES_NOTRDY; /* Check if drive is ready */ - - res = RES_ERROR; - FCLK_FAST(); - switch (cmd) { - case CTRL_SYNC: /* Wait for end of internal write process of the drive */ - if (select()) res = RES_OK; - break; - - case GET_SECTOR_COUNT: /* Get drive capacity in unit of sector (DWORD) */ - if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { - if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ - csize = csd[9] + ((WORD)csd[8] << 8) + ((DWORD)(csd[7] & 63) << 16) + 1; - *(DWORD*)buff = csize << 10; - } else { /* SDC ver 1.XX or MMC ver 3 */ - n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; - csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; - *(DWORD*)buff = csize << (n - 9); - } - res = RES_OK; - } - break; - - case GET_BLOCK_SIZE: /* Get erase block size in unit of sector (DWORD) */ - if (CardType & CT_SD2) { /* SDC ver 2.00 */ - if (send_cmd(ACMD13, 0) == 0) { /* Read SD status */ - xchg_spi(0xFF); - if (rcvr_datablock(csd, 16)) { /* Read partial block */ - for (n = 64 - 16; n; n--) xchg_spi(0xFF); /* Purge trailing data */ - *(DWORD*)buff = 16UL << (csd[10] >> 4); - res = RES_OK; - } - } - } else { /* SDC ver 1.XX or MMC */ - if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { /* Read CSD */ - if (CardType & CT_SD1) { /* SDC ver 1.XX */ - *(DWORD*)buff = (((csd[10] & 63) << 1) + ((WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1); - } else { /* MMC */ - *(DWORD*)buff = ((WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1); - } - res = RES_OK; - } - } - break; - - case CTRL_TRIM: /* Erase a block of sectors (used when _USE_TRIM in ffconf.h is 1) */ - if (!(CardType & CT_SDC)) break; /* Check if the card is SDC */ - if (disk_ioctl(drv, MMC_GET_CSD, csd)) break; /* Get CSD */ - if (!(csd[0] >> 6) && !(csd[10] & 0x40)) break; /* Check if sector erase can be applied to the card */ - dp = (DWORD *)buff; st = dp[0]; ed = dp[1]; /* Load sector block */ - if (!(CardType & CT_BLOCK)) { - st *= 512; ed *= 512; - } - if (send_cmd(CMD32, st) == 0 && send_cmd(CMD33, ed) == 0 && send_cmd(CMD38, 0) == 0 && wait_ready(30000)) { /* Erase sector block */ - res = RES_OK; /* FatFs does not check result of this command */ - } - break; - - /* Following commands are never used by FatFs module */ - - case MMC_GET_TYPE: /* Get MMC/SDC type (BYTE) */ - *ptr = CardType; - res = RES_OK; - break; - - case MMC_GET_CSD: /* Read CSD (16 bytes) */ - if (send_cmd(CMD9, 0) == 0 && rcvr_datablock(ptr, 16)) { /* READ_CSD */ - res = RES_OK; - } - break; - - case MMC_GET_CID: /* Read CID (16 bytes) */ - if (send_cmd(CMD10, 0) == 0 && rcvr_datablock(ptr, 16)) { /* READ_CID */ - res = RES_OK; - } - break; - - case MMC_GET_OCR: /* Read OCR (4 bytes) */ - if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ - for (n = 4; n; n--) *ptr++ = xchg_spi(0xFF); - res = RES_OK; - } - break; - - case MMC_GET_SDSTAT: /* Read SD status (64 bytes) */ - if (send_cmd(ACMD13, 0) == 0) { /* SD_STATUS */ - xchg_spi(0xFF); - if (rcvr_datablock(ptr, 64)) res = RES_OK; - } - break; - - #if _DISKIO_ISDIO - - case ISDIO_READ: - sdio = buff; - if (send_cmd(CMD48, 0x80000000 | sdio->func << 28 | sdio->addr << 9 | ((sdio->ndata - 1) & 0x1FF)) == 0) { - for (Timer1 = 1000; (rc = xchg_spi(0xFF)) == 0xFF && Timer1; ) ; - if (rc == 0xFE) { - for (buf = sdio->data, dc = sdio->ndata; dc; dc--) *buf++ = xchg_spi(0xFF); - for (dc = 514 - sdio->ndata; dc; dc--) xchg_spi(0xFF); - res = RES_OK; - } - } - break; - case ISDIO_WRITE: - sdio = buff; - if (send_cmd(CMD49, 0x80000000 | sdio->func << 28 | sdio->addr << 9 | ((sdio->ndata - 1) & 0x1FF)) == 0) { - xchg_spi(0xFF); xchg_spi(0xFE); - for (buf = sdio->data, dc = sdio->ndata; dc; dc--) xchg_spi(*buf++); - for (dc = 514 - sdio->ndata; dc; dc--) xchg_spi(0xFF); - if ((xchg_spi(0xFF) & 0x1F) == 0x05) res = RES_OK; - } - break; - case ISDIO_MRITE: - sdio = buff; - if (send_cmd(CMD49, 0x84000000 | sdio->func << 28 | sdio->addr << 9 | sdio->ndata >> 8) == 0) { - xchg_spi(0xFF); xchg_spi(0xFE); - xchg_spi(sdio->ndata); - for (dc = 513; dc; dc--) xchg_spi(0xFF); - if ((xchg_spi(0xFF) & 0x1F) == 0x05) res = RES_OK; - } - break; - - #endif // _DISKIO_ISDIO - - default: res = RES_PARERR; - } - - deselect(); - return res; - } - -#endif // _DISKIO_IOCTL - -#endif // SD_CONNECTION_IS(ONBOARD) -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.h b/Marlin/src/HAL/STM32F1/onboard_sd.h deleted file mode 100644 index 1dc7ec5b3b..0000000000 --- a/Marlin/src/HAL/STM32F1/onboard_sd.h +++ /dev/null @@ -1,96 +0,0 @@ -/*----------------------------------------------------------------------- -/ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] -/ * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] -/ * Low level disk interface module include file (C)ChaN, 2015 -/-----------------------------------------------------------------------*/ - -#pragma once - -#define _DISKIO_WRITE 1 /* 1: Enable disk_write function */ -#define _DISKIO_IOCTL 1 /* 1: Enable disk_ioctl fucntion */ -#define _DISKIO_ISDIO 0 /* 1: Enable iSDIO control fucntion */ - -typedef unsigned char BYTE; -typedef unsigned short WORD; -typedef unsigned long DWORD; -typedef unsigned int UINT; - -/* Status of Disk Functions */ -typedef BYTE DSTATUS; - -/* Results of Disk Functions */ -typedef enum { - RES_OK = 0, /* 0: Successful */ - RES_ERROR, /* 1: R/W Error */ - RES_WRPRT, /* 2: Write Protected */ - RES_NOTRDY, /* 3: Not Ready */ - RES_PARERR /* 4: Invalid Parameter */ -} DRESULT; - - -#if _DISKIO_ISDIO -/* Command structure for iSDIO ioctl command */ -typedef struct { - BYTE func; /* Function number: 0..7 */ - WORD ndata; /* Number of bytes to transfer: 1..512, or mask + data */ - DWORD addr; /* Register address: 0..0x1FFFF */ - void* data; /* Pointer to the data (to be written | read buffer) */ -} SDIO_CMD; -#endif - -/*---------------------------------------*/ -/* Prototypes for disk control functions */ - -DSTATUS disk_initialize(BYTE pdrv); -DSTATUS disk_status(BYTE pdrv); -DRESULT disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count); -#if _DISKIO_WRITE - DRESULT disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); -#endif -#if _DISKIO_IOCTL - DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void* buff); -#endif - -/* Disk Status Bits (DSTATUS) */ -#define STA_NOINIT 0x01 /* Drive not initialized */ -#define STA_NODISK 0x02 /* No medium in the drive */ -#define STA_PROTECT 0x04 /* Write protected */ - -/* Command code for disk_ioctrl fucntion */ - -/* Generic command (Used by FatFs) */ -#define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */ -#define GET_SECTOR_COUNT 1 /* Get media size (needed at _USE_MKFS == 1) */ -#define GET_SECTOR_SIZE 2 /* Get sector size (needed at _MAX_SS != _MIN_SS) */ -#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at _USE_MKFS == 1) */ -#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */ - -/* Generic command (Not used by FatFs) */ -#define CTRL_FORMAT 5 /* Create physical format on the media */ -#define CTRL_POWER_IDLE 6 /* Put the device idle state */ -#define CTRL_POWER_OFF 7 /* Put the device off state */ -#define CTRL_LOCK 8 /* Lock media removal */ -#define CTRL_UNLOCK 9 /* Unlock media removal */ -#define CTRL_EJECT 10 /* Eject media */ - -/* MMC/SDC specific ioctl command (Not used by FatFs) */ -#define MMC_GET_TYPE 50 /* Get card type */ -#define MMC_GET_CSD 51 /* Get CSD */ -#define MMC_GET_CID 52 /* Get CID */ -#define MMC_GET_OCR 53 /* Get OCR */ -#define MMC_GET_SDSTAT 54 /* Get SD status */ -#define ISDIO_READ 55 /* Read data form SD iSDIO register */ -#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ -#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ - -/* ATA/CF specific ioctl command (Not used by FatFs) */ -#define ATA_GET_REV 60 /* Get F/W revision */ -#define ATA_GET_MODEL 61 /* Get model name */ -#define ATA_GET_SN 62 /* Get serial number */ - -/* MMC card type flags (MMC_GET_TYPE) */ -#define CT_MMC 0x01 /* MMC ver 3 */ -#define CT_SD1 0x02 /* SD ver 1 */ -#define CT_SD2 0x04 /* SD ver 2 */ -#define CT_SDC (CT_SD1|CT_SD2) /* SD */ -#define CT_BLOCK 0x08 /* Block addressing */ diff --git a/Marlin/src/HAL/STM32F1/pinsDebug.h b/Marlin/src/HAL/STM32F1/pinsDebug.h deleted file mode 100644 index 2d63ebd770..0000000000 --- a/Marlin/src/HAL/STM32F1/pinsDebug.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) - #include "../STM32/pinsDebug_STM32duino.h" -#elif defined(BOARD_NR_GPIO_PINS) // Only in STM32GENERIC (Maple) - #include "../STM32/pinsDebug_STM32GENERIC.h" -#else - #error "M43 not supported for this board" -#endif diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp deleted file mode 100644 index ffa6db1206..0000000000 --- a/Marlin/src/HAL/STM32F1/sdio.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef ARDUINO_ARCH_STM32F1 - -#include - -#include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density - -#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) - -#include "sdio.h" - -SDIO_CardInfoTypeDef SdCard; - -bool SDIO_Init() { - uint32_t count = 0U; - SdCard.CardType = SdCard.CardVersion = SdCard.Class = SdCard.RelCardAdd = SdCard.BlockNbr = SdCard.BlockSize = SdCard.LogBlockNbr = SdCard.LogBlockSize = 0; - - sdio_begin(); - sdio_set_dbus_width(SDIO_CLKCR_WIDBUS_1BIT); - - dma_init(SDIO_DMA_DEV); - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - dma_set_priority(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); - - if (!SDIO_CmdGoIdleState()) return false; - if (!SDIO_CmdGoIdleState()) return false; /* Hotplugged cards tends to miss first CMD0, so give them a second chance. */ - - SdCard.CardVersion = SDIO_CmdOperCond() ? CARD_V2_X : CARD_V1_X; - - do { - if (count++ == SDMMC_MAX_VOLT_TRIAL) return false; - SDIO_CmdAppOperCommand(SdCard.CardVersion == CARD_V2_X ? SDMMC_HIGH_CAPACITY : SDMMC_STD_CAPACITY); - } while ((SDIO_GetResponse(SDIO_RESP1) & 0x80000000) == 0); - - SdCard.CardType = (SDIO_GetResponse(SDIO_RESP1) & SDMMC_HIGH_CAPACITY) ? CARD_SDHC_SDXC : CARD_SDSC; - - if (!SDIO_CmdSendCID()) return false; - if (!SDIO_CmdSetRelAdd(&SdCard.RelCardAdd)) return false; /* Send CMD3 SET_REL_ADDR with argument 0. SD Card publishes its RCA. */ - if (!SDIO_CmdSendCSD(SdCard.RelCardAdd << 16U)) return false; - - SdCard.Class = (SDIO_GetResponse(SDIO_RESP2) >> 20U); - - if (SdCard.CardType == CARD_SDHC_SDXC) { - SdCard.LogBlockNbr = SdCard.BlockNbr = (((SDIO_GetResponse(SDIO_RESP2) & 0x0000003FU) << 26U) | ((SDIO_GetResponse(SDIO_RESP3) & 0xFFFF0000U) >> 6U)) + 1024; - SdCard.LogBlockSize = SdCard.BlockSize = 512U; - } - else { - SdCard.BlockNbr = ((((SDIO_GetResponse(SDIO_RESP2) & 0x000003FFU) << 2U ) | ((SDIO_GetResponse(SDIO_RESP3) & 0xC0000000U) >> 30U)) + 1U) * (4U << ((SDIO_GetResponse(SDIO_RESP3) & 0x00038000U) >> 15U)); - SdCard.BlockSize = 1U << ((SDIO_GetResponse(SDIO_RESP2) >> 16) & 0x0FU); - SdCard.LogBlockNbr = (SdCard.BlockNbr) * ((SdCard.BlockSize) / 512U); - SdCard.LogBlockSize = 512U; - } - - if (!SDIO_CmdSelDesel(SdCard.RelCardAdd << 16U)) return false; - if (!SDIO_CmdAppSetClearCardDetect(SdCard.RelCardAdd << 16U)) return false; - if (!SDIO_CmdAppSetBusWidth(SdCard.RelCardAdd << 16U, 2)) return false; - - sdio_set_dbus_width(SDIO_CLKCR_WIDBUS_4BIT); - sdio_set_clock(SDIO_CLOCK); - return true; -} - -bool SDIO_ReadBlock_DMA(uint32_t blockAddress, uint8_t *data) { - if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; - if (blockAddress >= SdCard.LogBlockNbr) return false; - if ((0x03 & (uint32_t)data)) return false; // misaligned data - - if (SdCard.CardType != CARD_SDHC_SDXC) { blockAddress *= 512U; } - - dma_setup_transfer(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, &SDIO->FIFO, DMA_SIZE_32BITS, data, DMA_SIZE_32BITS, DMA_MINC_MODE); - dma_set_num_transfers(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, 128); - dma_clear_isr_bits(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - dma_enable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - - sdio_setup_transfer(SDIO_DATA_TIMEOUT * (F_CPU / 1000U), 512, SDIO_BLOCKSIZE_512 | SDIO_DCTRL_DMAEN | SDIO_DCTRL_DTEN | SDIO_DIR_RX); - - if (!SDIO_CmdReadSingleBlock(blockAddress)) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - return false; - } - - while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) { /* wait */ } - - //If there were SDIO errors, do not wait DMA. - if (SDIO->STA & SDIO_STA_TRX_ERROR_FLAGS) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - return false; - } - - //Wait for DMA transaction to complete - while ((DMA2_BASE->ISR & (DMA_ISR_TEIF4|DMA_ISR_TCIF4)) == 0 ) { /* wait */ } - - if (DMA2_BASE->ISR & DMA_ISR_TEIF4) { - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; - } - - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - - if (SDIO->STA & SDIO_STA_RXDAVL) { - while (SDIO->STA & SDIO_STA_RXDAVL) (void)SDIO->FIFO; - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; - } - - if (SDIO_GET_FLAG(SDIO_STA_TRX_ERROR_FLAGS)) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; - } - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return true; -} - -bool SDIO_ReadBlock(uint32_t blockAddress, uint8_t *data) { - uint32_t retries = SDIO_READ_RETRIES; - while (retries--) if (SDIO_ReadBlock_DMA(blockAddress, data)) return true; - return false; -} - -uint32_t millis(); - -bool SDIO_WriteBlock(uint32_t blockAddress, const uint8_t *data) { - if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; - if (blockAddress >= SdCard.LogBlockNbr) return false; - if ((0x03 & (uint32_t)data)) return false; // misaligned data - - if (SdCard.CardType != CARD_SDHC_SDXC) { blockAddress *= 512U; } - - dma_setup_transfer(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, &SDIO->FIFO, DMA_SIZE_32BITS, (volatile void *) data, DMA_SIZE_32BITS, DMA_MINC_MODE | DMA_FROM_MEM); - dma_set_num_transfers(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, 128); - dma_clear_isr_bits(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - dma_enable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - - if (!SDIO_CmdWriteSingleBlock(blockAddress)) { - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - return false; - } - - sdio_setup_transfer(SDIO_DATA_TIMEOUT * (F_CPU / 1000U), 512U, SDIO_BLOCKSIZE_512 | SDIO_DCTRL_DMAEN | SDIO_DCTRL_DTEN); - - while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) { /* wait */ } - - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - - if (SDIO_GET_FLAG(SDIO_STA_TRX_ERROR_FLAGS)) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; - } - - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - - uint32_t timeout = millis() + SDIO_WRITE_TIMEOUT; - while (timeout > millis()) { - if (SDIO_GetCardState() == SDIO_CARD_TRANSFER) { - return true; - } - } - return false; -} - -inline uint32_t SDIO_GetCardState() { return SDIO_CmdSendStatus(SdCard.RelCardAdd << 16U) ? (SDIO_GetResponse(SDIO_RESP1) >> 9U) & 0x0FU : SDIO_CARD_ERROR; } - -// ------------------------ -// SD Commands and Responses -// ------------------------ - -void SDIO_SendCommand(uint16_t command, uint32_t argument) { SDIO->ARG = argument; SDIO->CMD = (uint32_t)(SDIO_CMD_CPSMEN | command); } -uint8_t SDIO_GetCommandResponse() { return (uint8_t)(SDIO->RESPCMD); } -uint32_t SDIO_GetResponse(uint32_t response) { return SDIO->RESP[response]; } - -bool SDIO_CmdGoIdleState() { SDIO_SendCommand(CMD0_GO_IDLE_STATE, 0); return SDIO_GetCmdError(); } -bool SDIO_CmdSendCID() { SDIO_SendCommand(CMD2_ALL_SEND_CID, 0); return SDIO_GetCmdResp2(); } -bool SDIO_CmdSetRelAdd(uint32_t *rca) { SDIO_SendCommand(CMD3_SET_REL_ADDR, 0); return SDIO_GetCmdResp6(SDMMC_CMD_SET_REL_ADDR, rca); } -bool SDIO_CmdSelDesel(uint32_t address) { SDIO_SendCommand(CMD7_SEL_DESEL_CARD, address); return SDIO_GetCmdResp1(SDMMC_CMD_SEL_DESEL_CARD); } -bool SDIO_CmdOperCond() { SDIO_SendCommand(CMD8_HS_SEND_EXT_CSD, SDMMC_CHECK_PATTERN); return SDIO_GetCmdResp7(); } -bool SDIO_CmdSendCSD(uint32_t argument) { SDIO_SendCommand(CMD9_SEND_CSD, argument); return SDIO_GetCmdResp2(); } -bool SDIO_CmdSendStatus(uint32_t argument) { SDIO_SendCommand(CMD13_SEND_STATUS, argument); return SDIO_GetCmdResp1(SDMMC_CMD_SEND_STATUS); } -bool SDIO_CmdReadSingleBlock(uint32_t address) { SDIO_SendCommand(CMD17_READ_SINGLE_BLOCK, address); return SDIO_GetCmdResp1(SDMMC_CMD_READ_SINGLE_BLOCK); } -bool SDIO_CmdWriteSingleBlock(uint32_t address) { SDIO_SendCommand(CMD24_WRITE_SINGLE_BLOCK, address); return SDIO_GetCmdResp1(SDMMC_CMD_WRITE_SINGLE_BLOCK); } -bool SDIO_CmdAppCommand(uint32_t rsa) { SDIO_SendCommand(CMD55_APP_CMD, rsa); return SDIO_GetCmdResp1(SDMMC_CMD_APP_CMD); } - -bool SDIO_CmdAppSetBusWidth(uint32_t rsa, uint32_t argument) { - if (!SDIO_CmdAppCommand(rsa)) return false; - SDIO_SendCommand(ACMD6_APP_SD_SET_BUSWIDTH, argument); - return SDIO_GetCmdResp2(); -} - -bool SDIO_CmdAppOperCommand(uint32_t sdType) { - if (!SDIO_CmdAppCommand(0)) return false; - SDIO_SendCommand(ACMD41_SD_APP_OP_COND , SDMMC_VOLTAGE_WINDOW_SD | sdType); - return SDIO_GetCmdResp3(); -} - -bool SDIO_CmdAppSetClearCardDetect(uint32_t rsa) { - if (!SDIO_CmdAppCommand(rsa)) return false; - SDIO_SendCommand(ACMD42_SD_APP_SET_CLR_CARD_DETECT, 0); - return SDIO_GetCmdResp2(); -} - -// Wait until given flags are unset or till timeout -#define SDIO_WAIT(FLAGS) do{ \ - uint32_t count = 1 + (SDIO_CMDTIMEOUT) * ((F_CPU) / 8U / 1000U); \ - do { if (!--count) return false; } while (!SDIO_GET_FLAG(FLAGS)); \ -}while(0) - -bool SDIO_GetCmdError() { - SDIO_WAIT(SDIO_STA_CMDSENT); - - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); - return true; -} - -bool SDIO_GetCmdResp1(uint8_t command) { - SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); - - if (SDIO_GET_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT)) { - SDIO_CLEAR_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT); - return false; - } - if (SDIO_GetCommandResponse() != command) return false; - - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); - return (SDIO_GetResponse(SDIO_RESP1) & SDMMC_OCR_ERRORBITS) == SDMMC_ALLZERO; -} - -bool SDIO_GetCmdResp2() { - SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); - - if (SDIO_GET_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT)) { - SDIO_CLEAR_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT); - return false; - } - - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); - return true; -} - -bool SDIO_GetCmdResp3() { - SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); - - if (SDIO_GET_FLAG(SDIO_STA_CTIMEOUT)) { - SDIO_CLEAR_FLAG(SDIO_STA_CTIMEOUT); - return false; - } - - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); - return true; -} - -bool SDIO_GetCmdResp6(uint8_t command, uint32_t *rca) { - SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); - - if (SDIO_GET_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT)) { - SDIO_CLEAR_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT); - return false; - } - if (SDIO_GetCommandResponse() != command) return false; - - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); - if (SDIO_GetResponse(SDIO_RESP1) & (SDMMC_R6_GENERAL_UNKNOWN_ERROR | SDMMC_R6_ILLEGAL_CMD | SDMMC_R6_COM_CRC_FAILED)) return false; - - *rca = SDIO_GetResponse(SDIO_RESP1) >> 16; - return true; -} - -bool SDIO_GetCmdResp7() { - SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); - - if (SDIO_GET_FLAG(SDIO_STA_CTIMEOUT)) { - SDIO_CLEAR_FLAG(SDIO_STA_CTIMEOUT); - return false; - } - - if (SDIO_GET_FLAG(SDIO_STA_CMDREND)) { SDIO_CLEAR_FLAG(SDIO_STA_CMDREND); } - return true; -} - -#endif // STM32_HIGH_DENSITY || STM32_XL_DENSITY -#endif // ARDUINO_ARCH_STM32F1 diff --git a/Marlin/src/HAL/STM32F1/sdio.h b/Marlin/src/HAL/STM32F1/sdio.h deleted file mode 100644 index 8777299f01..0000000000 --- a/Marlin/src/HAL/STM32F1/sdio.h +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfig.h" // Allow pins/pins.h to override SDIO clock / retries - -#include -#include - -// ------------------------ -// Defines -// ------------------------ - -#define SDMMC_CMD_GO_IDLE_STATE ((uint8_t)0) /* Resets the SD memory card. */ -#define SDMMC_CMD_ALL_SEND_CID ((uint8_t)2) /* Asks any card connected to the host to send the CID numbers on the CMD line. */ -#define SDMMC_CMD_SET_REL_ADDR ((uint8_t)3) /* Asks the card to publish a new relative address (RCA). */ -#define SDMMC_CMD_SEL_DESEL_CARD ((uint8_t)7) /* Selects the card by its own relative address and gets deselected by any other address */ -#define SDMMC_CMD_HS_SEND_EXT_CSD ((uint8_t)8) /* Sends SD Memory Card interface condition, which includes host supply voltage information and asks the card whether card supports voltage. */ -#define SDMMC_CMD_SEND_CSD ((uint8_t)9) /* Addressed card sends its card specific data (CSD) on the CMD line. */ -#define SDMMC_CMD_SEND_STATUS ((uint8_t)13) /*!< Addressed card sends its status register. */ -#define SDMMC_CMD_READ_SINGLE_BLOCK ((uint8_t)17) /* Reads single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of fixed 512 bytes in case of SDHC and SDXC. */ -#define SDMMC_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24) /* Writes single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of fixed 512 bytes in case of SDHC and SDXC. */ -#define SDMMC_CMD_APP_CMD ((uint8_t)55) /* Indicates to the card that the next command is an application specific command rather than a standard command. */ - -#define SDMMC_ACMD_APP_SD_SET_BUSWIDTH ((uint8_t)6) /* (ACMD6) Defines the data bus width to be used for data transfer. The allowed data bus widths are given in SCR register. */ -#define SDMMC_ACMD_SD_APP_OP_COND ((uint8_t)41) /* (ACMD41) Sends host capacity support information (HCS) and asks the accessed card to send its operating condition register (OCR) content in the response on the CMD line. */ -#define SDMMC_ACMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42) /* (ACMD42) Connect/Disconnect the 50 KOhm pull-up resistor on CD/DAT3 (pin 1) of the card */ - -#define CMD0_GO_IDLE_STATE (uint16_t)(SDMMC_CMD_GO_IDLE_STATE | SDIO_CMD_WAIT_NO_RESP) -#define CMD2_ALL_SEND_CID (uint16_t)(SDMMC_CMD_ALL_SEND_CID | SDIO_CMD_WAIT_LONG_RESP) -#define CMD3_SET_REL_ADDR (uint16_t)(SDMMC_CMD_SET_REL_ADDR | SDIO_CMD_WAIT_SHORT_RESP) -#define CMD7_SEL_DESEL_CARD (uint16_t)(SDMMC_CMD_SEL_DESEL_CARD | SDIO_CMD_WAIT_SHORT_RESP) -#define CMD8_HS_SEND_EXT_CSD (uint16_t)(SDMMC_CMD_HS_SEND_EXT_CSD | SDIO_CMD_WAIT_SHORT_RESP) -#define CMD9_SEND_CSD (uint16_t)(SDMMC_CMD_SEND_CSD | SDIO_CMD_WAIT_LONG_RESP) -#define CMD13_SEND_STATUS (uint16_t)(SDMMC_CMD_SEND_STATUS | SDIO_CMD_WAIT_SHORT_RESP) -#define CMD17_READ_SINGLE_BLOCK (uint16_t)(SDMMC_CMD_READ_SINGLE_BLOCK | SDIO_CMD_WAIT_SHORT_RESP) -#define CMD24_WRITE_SINGLE_BLOCK (uint16_t)(SDMMC_CMD_WRITE_SINGLE_BLOCK | SDIO_CMD_WAIT_SHORT_RESP) -#define CMD55_APP_CMD (uint16_t)(SDMMC_CMD_APP_CMD | SDIO_CMD_WAIT_SHORT_RESP) - -#define ACMD6_APP_SD_SET_BUSWIDTH (uint16_t)(SDMMC_ACMD_APP_SD_SET_BUSWIDTH | SDIO_CMD_WAIT_SHORT_RESP) -#define ACMD41_SD_APP_OP_COND (uint16_t)(SDMMC_ACMD_SD_APP_OP_COND | SDIO_CMD_WAIT_SHORT_RESP) -#define ACMD42_SD_APP_SET_CLR_CARD_DETECT (uint16_t)(SDMMC_ACMD_SD_APP_SET_CLR_CARD_DETECT | SDIO_CMD_WAIT_SHORT_RESP) - - -#define SDMMC_ALLZERO 0x00000000U -#define SDMMC_OCR_ERRORBITS 0xFDFFE008U - -#define SDMMC_R6_GENERAL_UNKNOWN_ERROR 0x00002000U -#define SDMMC_R6_ILLEGAL_CMD 0x00004000U -#define SDMMC_R6_COM_CRC_FAILED 0x00008000U - -#define SDMMC_VOLTAGE_WINDOW_SD 0x80100000U -#define SDMMC_HIGH_CAPACITY 0x40000000U -#define SDMMC_STD_CAPACITY 0x00000000U -#define SDMMC_CHECK_PATTERN 0x000001AAU - -#define SDIO_TRANSFER_MODE_BLOCK 0x00000000U -#define SDIO_DPSM_ENABLE 0x00000001U -#define SDIO_TRANSFER_DIR_TO_CARD 0x00000000U -#define SDIO_DATABLOCK_SIZE_512B 0x00000090U -#define SDIO_TRANSFER_DIR_TO_SDIO 0x00000100U -#define SDIO_DMA_ENABLE 0x00001000U - -#define CARD_V1_X 0x00000000U -#define CARD_V2_X 0x00000001U -#define CARD_SDSC 0x00000000U -#define CARD_SDHC_SDXC 0x00000001U - -#define SDIO_RESP1 0 -#define SDIO_RESP2 1 -#define SDIO_RESP3 2 -#define SDIO_RESP4 3 - -#define SDIO_GET_FLAG(__FLAG__) !!((SDIO->STA) & (__FLAG__)) -#define SDIO_CLEAR_FLAG(__FLAG__) (SDIO->ICR = (__FLAG__)) - -#define SDMMC_MAX_VOLT_TRIAL 0x00000FFFU -#define SDIO_CARD_TRANSFER 0x00000004U /* Card is in transfer state */ -#define SDIO_CARD_ERROR 0x000000FFU /* Card response Error */ -#define SDIO_CMDTIMEOUT 200U /* Command send and response timeout */ -#define SDIO_DATA_TIMEOUT 100U /* Read data transfer timeout */ -#define SDIO_WRITE_TIMEOUT 200U /* Write data transfer timeout */ - -#ifndef SDIO_CLOCK - #define SDIO_CLOCK 18000000 /* 18 MHz */ -#endif - -#ifndef SDIO_READ_RETRIES - #define SDIO_READ_RETRIES 3 -#endif - -// ------------------------ -// Types -// ------------------------ - -typedef struct { - uint32_t CardType; // Card Type - uint32_t CardVersion; // Card version - uint32_t Class; // Class of the card class - uint32_t RelCardAdd; // Relative Card Address - uint32_t BlockNbr; // Card Capacity in blocks - uint32_t BlockSize; // One block size in bytes - uint32_t LogBlockNbr; // Card logical Capacity in blocks - uint32_t LogBlockSize; // Logical block size in bytes -} SDIO_CardInfoTypeDef; - -// ------------------------ -// Public functions -// ------------------------ - -inline uint32_t SDIO_GetCardState(); - -bool SDIO_CmdGoIdleState(); -bool SDIO_CmdSendCID(); -bool SDIO_CmdSetRelAdd(uint32_t *rca); -bool SDIO_CmdSelDesel(uint32_t address); -bool SDIO_CmdOperCond(); -bool SDIO_CmdSendCSD(uint32_t argument); -bool SDIO_CmdSendStatus(uint32_t argument); -bool SDIO_CmdReadSingleBlock(uint32_t address); -bool SDIO_CmdWriteSingleBlock(uint32_t address); -bool SDIO_CmdAppCommand(uint32_t rsa); - -bool SDIO_CmdAppSetBusWidth(uint32_t rsa, uint32_t argument); -bool SDIO_CmdAppOperCommand(uint32_t sdType); -bool SDIO_CmdAppSetClearCardDetect(uint32_t rsa); - -void SDIO_SendCommand(uint16_t command, uint32_t argument); -uint8_t SDIO_GetCommandResponse(); -uint32_t SDIO_GetResponse(uint32_t response); -bool SDIO_GetCmdError(); -bool SDIO_GetCmdResp1(uint8_t command); -bool SDIO_GetCmdResp2(); -bool SDIO_GetCmdResp3(); -bool SDIO_GetCmdResp6(uint8_t command, uint32_t *rca); -bool SDIO_GetCmdResp7(); diff --git a/Marlin/src/HAL/STM32F1/spi_pins.h b/Marlin/src/HAL/STM32F1/spi_pins.h deleted file mode 100644 index 8f2b324f64..0000000000 --- a/Marlin/src/HAL/STM32F1/spi_pins.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) - */ - -/** - * STM32F1 Default SPI Pins - * - * SS SCK MISO MOSI - * +-----------------------------+ - * SPI1 | PA4 PA5 PA6 PA7 | - * SPI2 | PB12 PB13 PB14 PB15 | - * SPI3 | PA15 PB3 PB4 PB5 | - * +-----------------------------+ - * Any pin can be used for Chip Select (SS_PIN) - * SPI1 is enabled by default - */ -#ifndef SCK_PIN - #define SCK_PIN PA5 -#endif -#ifndef MISO_PIN - #define MISO_PIN PA6 -#endif -#ifndef MOSI_PIN - #define MOSI_PIN PA7 -#endif -#ifndef SS_PIN - #define SS_PIN PA4 -#endif -#undef SDSS -#define SDSS SS_PIN - -#if ENABLED(ENABLE_SPI3) - #define SPI_DEVICE 3 -#elif ENABLED(ENABLE_SPI2) - #define SPI_DEVICE 2 -#else - #define SPI_DEVICE 1 -#endif diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp deleted file mode 100644 index 5b52fb416f..0000000000 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_FSMC_TFT - -#include "tft_fsmc.h" -#include -#include -#include - -LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD; - -/** - * FSMC LCD IO - */ -#define __ASM __asm -#define __STATIC_INLINE static inline - -__attribute__((always_inline)) __STATIC_INLINE void __DSB() { - __ASM volatile ("dsb 0xF":::"memory"); -} - -#define FSMC_CS_NE1 PD7 - -#if ENABLED(STM32_XL_DENSITY) - #define FSMC_CS_NE2 PG9 - #define FSMC_CS_NE3 PG10 - #define FSMC_CS_NE4 PG12 - - #define FSMC_RS_A0 PF0 - #define FSMC_RS_A1 PF1 - #define FSMC_RS_A2 PF2 - #define FSMC_RS_A3 PF3 - #define FSMC_RS_A4 PF4 - #define FSMC_RS_A5 PF5 - #define FSMC_RS_A6 PF12 - #define FSMC_RS_A7 PF13 - #define FSMC_RS_A8 PF14 - #define FSMC_RS_A9 PF15 - #define FSMC_RS_A10 PG0 - #define FSMC_RS_A11 PG1 - #define FSMC_RS_A12 PG2 - #define FSMC_RS_A13 PG3 - #define FSMC_RS_A14 PG4 - #define FSMC_RS_A15 PG5 -#endif - -#define FSMC_RS_A16 PD11 -#define FSMC_RS_A17 PD12 -#define FSMC_RS_A18 PD13 -#define FSMC_RS_A19 PE3 -#define FSMC_RS_A20 PE4 -#define FSMC_RS_A21 PE5 -#define FSMC_RS_A22 PE6 -#define FSMC_RS_A23 PE2 - -#if ENABLED(STM32_XL_DENSITY) - #define FSMC_RS_A24 PG13 - #define FSMC_RS_A25 PG14 -#endif - -/* Timing configuration */ -#define FSMC_ADDRESS_SETUP_TIME 15 // AddressSetupTime -#define FSMC_DATA_SETUP_TIME 15 // DataSetupTime - -static uint8_t fsmcInit = 0; -void TFT_FSMC::Init() { - uint8_t cs = FSMC_CS_PIN, rs = FSMC_RS_PIN; - uint32_t controllerAddress; - - #if ENABLED(LCD_USE_DMA_FSMC) - dma_init(FSMC_DMA_DEV); - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); - #endif - - struct fsmc_nor_psram_reg_map* fsmcPsramRegion; - - if (fsmcInit) return; - fsmcInit = 1; - - switch (cs) { - case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; fsmcPsramRegion = FSMC_NOR_PSRAM1_BASE; break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; fsmcPsramRegion = FSMC_NOR_PSRAM2_BASE; break; - case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; fsmcPsramRegion = FSMC_NOR_PSRAM3_BASE; break; - case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; fsmcPsramRegion = FSMC_NOR_PSRAM4_BASE; break; - #endif - default: return; - } - - #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2) - - switch (rs) { - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A0: _ORADDR( 1); break; - case FSMC_RS_A1: _ORADDR( 2); break; - case FSMC_RS_A2: _ORADDR( 3); break; - case FSMC_RS_A3: _ORADDR( 4); break; - case FSMC_RS_A4: _ORADDR( 5); break; - case FSMC_RS_A5: _ORADDR( 6); break; - case FSMC_RS_A6: _ORADDR( 7); break; - case FSMC_RS_A7: _ORADDR( 8); break; - case FSMC_RS_A8: _ORADDR( 9); break; - case FSMC_RS_A9: _ORADDR(10); break; - case FSMC_RS_A10: _ORADDR(11); break; - case FSMC_RS_A11: _ORADDR(12); break; - case FSMC_RS_A12: _ORADDR(13); break; - case FSMC_RS_A13: _ORADDR(14); break; - case FSMC_RS_A14: _ORADDR(15); break; - case FSMC_RS_A15: _ORADDR(16); break; - #endif - case FSMC_RS_A16: _ORADDR(17); break; - case FSMC_RS_A17: _ORADDR(18); break; - case FSMC_RS_A18: _ORADDR(19); break; - case FSMC_RS_A19: _ORADDR(20); break; - case FSMC_RS_A20: _ORADDR(21); break; - case FSMC_RS_A21: _ORADDR(22); break; - case FSMC_RS_A22: _ORADDR(23); break; - case FSMC_RS_A23: _ORADDR(24); break; - #if ENABLED(STM32_XL_DENSITY) - case FSMC_RS_A24: _ORADDR(25); break; - case FSMC_RS_A25: _ORADDR(26); break; - #endif - default: return; - } - - rcc_clk_enable(RCC_FSMC); - - gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00 - gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01 - gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP); // FSMC_D02 - gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP); // FSMC_D03 - gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP); // FSMC_D04 - gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP); // FSMC_D05 - gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP); // FSMC_D06 - gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07 - gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08 - gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09 - gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10 - gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11 - gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12 - gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP); // FSMC_D13 - gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP); // FSMC_D14 - gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15 - - gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP); // FSMC_NOE - gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP); // FSMC_NWE - - gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx - gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax - - fsmcPsramRegion->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN; - fsmcPsramRegion->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME; - - afio_remap(AFIO_REMAP_FSMC_NADV); - - LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; -} - -void TFT_FSMC::Transmit(uint16_t Data) { - LCD->RAM = Data; - __DSB(); -} - -void TFT_FSMC::WriteReg(uint16_t Reg) { - LCD->REG = Reg; - __DSB(); -} - -uint32_t TFT_FSMC::GetID() { - uint32_t id; - WriteReg(0x0000); - id = LCD->RAM; - - if (id == 0) - id = ReadID(LCD_READ_ID); - if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) - id = ReadID(LCD_READ_ID4); - if ((id & 0xFF00) == 0 && (id & 0xFF) != 0) - id = ReadID(LCD_READ_ID4); - return id; -} - - uint32_t TFT_FSMC::ReadID(uint16_t Reg) { - uint32_t id; - WriteReg(Reg); - id = LCD->RAM; // dummy read - id = Reg << 24; - id |= (LCD->RAM & 0x00FF) << 16; - id |= (LCD->RAM & 0x00FF) << 8; - id |= LCD->RAM & 0x00FF; - return id; - } - -bool TFT_FSMC::isBusy() { - return false; -} - -void TFT_FSMC::Abort() { - -} - -void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - #if defined(FSMC_DMA_DEV) && defined(FSMC_DMA_CHANNEL) - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | MemoryIncrease); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Count); - dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - - while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}; - dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); - #endif -} - -#endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h deleted file mode 100644 index 11eb1ffa84..0000000000 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif -#ifndef LCD_READ_ID4 - #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) -#endif - -#include - -#define DATASIZE_8BIT DMA_SIZE_8BITS -#define DATASIZE_16BIT DMA_SIZE_16BITS -#define TFT_IO_DRIVER TFT_FSMC - -typedef struct { - __IO uint16_t REG; - __IO uint16_t RAM; -} LCD_CONTROLLER_TypeDef; - -class TFT_FSMC { - private: - static LCD_CONTROLLER_TypeDef *LCD; - - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - - public: - static void Init(); - static uint32_t GetID(); - static bool isBusy(); - static void Abort(); - - static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) {}; - static void DataTransferEnd() {}; - - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg); - - static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_MODE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_CIRC_MODE, &Data, Count); } - static void WriteMultiple(uint16_t Color, uint32_t Count) { - static uint16_t Data; Data = Color; - while (Count > 0) { - TransmitDMA(DMA_CIRC_MODE, &Data, Count > 0xFFFF ? 0xFFFF : Count); - Count = Count > 0xFFFF ? Count - 0xFFFF : 0; - } - } -}; diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp deleted file mode 100644 index 1095389946..0000000000 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_SPI_TFT - -#include "tft_spi.h" - -// TFT_SPI tft; - -SPIClass TFT_SPI::SPIx(1); - -#define TFT_CS_H OUT_WRITE(TFT_CS_PIN, HIGH) -#define TFT_CS_L OUT_WRITE(TFT_CS_PIN, LOW) - -#define TFT_DC_H OUT_WRITE(TFT_DC_PIN, HIGH) -#define TFT_DC_L OUT_WRITE(TFT_DC_PIN, LOW) - -#define TFT_RST_H OUT_WRITE(TFT_RST_PIN, HIGH) -#define TFT_RST_L OUT_WRITE(TFT_RST_PIN, LOW) - -#define TFT_BLK_H OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH) -#define TFT_BLK_L OUT_WRITE(TFT_BACKLIGHT_PIN, LOW) - -void TFT_SPI::Init() { - #if PIN_EXISTS(TFT_RESET) - // OUT_WRITE(TFT_RESET_PIN, HIGH); - TFT_RST_H; - delay(100); - #endif - - #if PIN_EXISTS(TFT_BACKLIGHT) - // OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); - TFT_BLK_H; - #endif - - TFT_DC_H; - TFT_CS_H; - - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - #if SPI_DEVICE == 1 - #define SPI_CLOCK_MAX SPI_CLOCK_DIV4 - #else - #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 - #endif - uint8_t clock; - uint8_t spiRate = SPI_FULL_SPEED; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_MAX ; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4 ; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8 ; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - SPIx.setModule(1); - SPIx.setClockDivider(clock); - SPIx.setBitOrder(MSBFIRST); - SPIx.setDataMode(SPI_MODE0); -} - -void TFT_SPI::DataTransferBegin(uint16_t DataSize) { - SPIx.setDataSize(DataSize); - SPIx.begin(); - TFT_CS_L; -} - -uint32_t TFT_SPI::GetID() { - uint32_t id; - id = ReadID(LCD_READ_ID); - - if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) - id = ReadID(LCD_READ_ID4); - return id; -} - -uint32_t TFT_SPI::ReadID(uint16_t Reg) { - #if !PIN_EXISTS(TFT_MISO) - return 0; - #else - uint8_t d = 0; - uint32_t data = 0; - SPIx.setClockDivider(SPI_CLOCK_DIV16); - DataTransferBegin(DATASIZE_8BIT); - WriteReg(Reg); - - LOOP_L_N(i, 4) { - SPIx.read((uint8_t*)&d, 1); - data = (data << 8) | d; - } - - DataTransferEnd(); - SPIx.setClockDivider(SPI_CLOCK_MAX); - - return data >> 7; - #endif -} - -bool TFT_SPI::isBusy() { - return false; -} - -void TFT_SPI::Abort() { - DataTransferEnd(); -} - -void TFT_SPI::Transmit(uint16_t Data) { - SPIx.send(Data); -} - -void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DataTransferBegin(); - TFT_DC_H; - if (MemoryIncrease == DMA_MINC_ENABLE) { - SPIx.dmaSend(Data, Count, true); - } - else { - SPIx.dmaSend(Data, Count, false); - } - - DataTransferEnd(); -} - -#endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.h b/Marlin/src/HAL/STM32F1/tft/tft_spi.h deleted file mode 100644 index da9a8e0c22..0000000000 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../inc/MarlinConfig.h" - -#include - -#ifndef LCD_READ_ID - #define LCD_READ_ID 0x04 // Read display identification information (0xD3 on ILI9341) -#endif -#ifndef LCD_READ_ID4 - #define LCD_READ_ID4 0xD3 // Read display identification information (0xD3 on ILI9341) -#endif - -#define DATASIZE_8BIT DATA_SIZE_8BIT -#define DATASIZE_16BIT DATA_SIZE_16BIT -#define TFT_IO_DRIVER TFT_SPI - -#define DMA_MINC_ENABLE 1 -#define DMA_MINC_DISABLE 0 - -class TFT_SPI { -private: - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - -public: - static SPIClass SPIx; - - static void Init(); - static uint32_t GetID(); - static bool isBusy(); - static void Abort(); - - static void DataTransferBegin(uint16_t DataWidth = DATA_SIZE_16BIT); - static void DataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); SPIx.end(); }; - static void DataTransferAbort(); - - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg) { WRITE(TFT_A0_PIN, LOW); Transmit(Reg); WRITE(TFT_A0_PIN, HIGH); } - - static void WriteSequence(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } - static void WriteMultiple(uint16_t Color, uint32_t Count) { - static uint16_t Data; Data = Color; - while (Count > 0) { - TransmitDMA(DMA_MINC_DISABLE, &Data, Count > 0xFFFF ? 0xFFFF : Count); - Count = Count > 0xFFFF ? Count - 0xFFFF : 0; - } - } -}; diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp deleted file mode 100644 index 616d05fead..0000000000 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_TFT_XPT2046 || HAS_TOUCH_XPT2046 - -#include "xpt2046.h" -#include - -uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } - -#if ENABLED(TOUCH_BUTTONS_HW_SPI) - #include - - SPIClass XPT2046::SPIx(TOUCH_BUTTONS_HW_SPI_DEVICE); - - static void touch_spi_init(uint8_t spiRate) { - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2; // Default from the SPI library - } - XPT2046::SPIx.setModule(TOUCH_BUTTONS_HW_SPI_DEVICE); - XPT2046::SPIx.setClockDivider(clock); - XPT2046::SPIx.setBitOrder(MSBFIRST); - XPT2046::SPIx.setDataMode(SPI_MODE0); - } -#endif // TOUCH_BUTTONS_HW_SPI - -void XPT2046::Init() { - SET_INPUT(TOUCH_MISO_PIN); - SET_OUTPUT(TOUCH_MOSI_PIN); - SET_OUTPUT(TOUCH_SCK_PIN); - OUT_WRITE(TOUCH_CS_PIN, HIGH); - - #if PIN_EXISTS(TOUCH_INT) - // Optional Pendrive interrupt pin - SET_INPUT(TOUCH_INT_PIN); - #endif - - TERN_(TOUCH_BUTTONS_HW_SPI, touch_spi_init(SPI_SPEED_6)); - - // Read once to enable pendrive status pin - getRawData(XPT2046_X); -} - -bool XPT2046::isTouched() { - return isBusy() ? false : ( - #if PIN_EXISTS(TOUCH_INT) - READ(TOUCH_INT_PIN) != HIGH - #else - getRawData(XPT2046_Z1) >= XPT2046_Z1_THRESHOLD - #endif - ); -} - -bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { - if (isBusy()) return false; - if (!isTouched()) return false; - *x = getRawData(XPT2046_X); - *y = getRawData(XPT2046_Y); - return isTouched(); -} - -uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { - uint16_t data[3]; - - DataTransferBegin(); - TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.begin()); - - for (uint16_t i = 0; i < 3 ; i++) { - IO(coordinate); - data[i] = (IO() << 4) | (IO() >> 4); - } - - TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.end()); - DataTransferEnd(); - - uint16_t delta01 = delta(data[0], data[1]), - delta02 = delta(data[0], data[2]), - delta12 = delta(data[1], data[2]); - - if (delta01 > delta02 || delta01 > delta12) - data[delta02 > delta12 ? 0 : 1] = data[2]; - - return (data[0] + data[1]) >> 1; -} - -uint16_t XPT2046::IO(uint16_t data) { - return TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); -} - -#if ENABLED(TOUCH_BUTTONS_HW_SPI) - uint16_t XPT2046::HardwareIO(uint16_t data) { - uint16_t result = SPIx.transfer(data); - return result; - } -#endif - -uint16_t XPT2046::SoftwareIO(uint16_t data) { - uint16_t result = 0; - - for (uint8_t j = 0x80; j; j >>= 1) { - WRITE(TOUCH_SCK_PIN, LOW); - WRITE(TOUCH_MOSI_PIN, data & j ? HIGH : LOW); - if (READ(TOUCH_MISO_PIN)) result |= j; - WRITE(TOUCH_SCK_PIN, HIGH); - } - WRITE(TOUCH_SCK_PIN, LOW); - - return result; -} - -#endif // HAS_TFT_XPT2046 diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h deleted file mode 100644 index 019f75efce..0000000000 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(TOUCH_BUTTONS_HW_SPI) - #include -#endif - -#ifndef TOUCH_MISO_PIN - #define TOUCH_MISO_PIN MISO_PIN -#endif -#ifndef TOUCH_MOSI_PIN - #define TOUCH_MOSI_PIN MOSI_PIN -#endif -#ifndef TOUCH_SCK_PIN - #define TOUCH_SCK_PIN SCK_PIN -#endif -#ifndef TOUCH_CS_PIN - #define TOUCH_CS_PIN CS_PIN -#endif -#ifndef TOUCH_INT_PIN - #define TOUCH_INT_PIN -1 -#endif - -#define XPT2046_DFR_MODE 0x00 -#define XPT2046_SER_MODE 0x04 -#define XPT2046_CONTROL 0x80 - -enum XPTCoordinate : uint8_t { - XPT2046_X = 0x10 | XPT2046_CONTROL | XPT2046_DFR_MODE, - XPT2046_Y = 0x50 | XPT2046_CONTROL | XPT2046_DFR_MODE, - XPT2046_Z1 = 0x30 | XPT2046_CONTROL | XPT2046_DFR_MODE, - XPT2046_Z2 = 0x40 | XPT2046_CONTROL | XPT2046_DFR_MODE, -}; - -#if !defined(XPT2046_Z1_THRESHOLD) - #define XPT2046_Z1_THRESHOLD 10 -#endif - -class XPT2046 { -private: - static bool isBusy() { return false; } - - static uint16_t getRawData(const XPTCoordinate coordinate); - static bool isTouched(); - - static inline void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; - static inline void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; - #if ENABLED(TOUCH_BUTTONS_HW_SPI) - static uint16_t HardwareIO(uint16_t data); - #endif - static uint16_t SoftwareIO(uint16_t data); - static uint16_t IO(uint16_t data = 0); - -public: - #if ENABLED(TOUCH_BUTTONS_HW_SPI) - static SPIClass SPIx; - #endif - - static void Init(); - static bool getRawPoint(int16_t *x, int16_t *y); -}; diff --git a/Marlin/src/HAL/STM32F1/timers.cpp b/Marlin/src/HAL/STM32F1/timers.cpp deleted file mode 100644 index 8c2df1e216..0000000000 --- a/Marlin/src/HAL/STM32F1/timers.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" - -// ------------------------ -// Local defines -// ------------------------ - -// ------------------------ -// Public functions -// ------------------------ - -/** - * Timer_clock1: Prescaler 2 -> 36 MHz - * Timer_clock2: Prescaler 8 -> 9 MHz - * Timer_clock3: Prescaler 32 -> 2.25 MHz - * Timer_clock4: Prescaler 128 -> 562.5 kHz - */ - -/** - * TODO: Calculate Timer prescale value, so we get the 32bit to adjust - */ - - - - -void timer_set_interrupt_priority(uint_fast8_t timer_num, uint_fast8_t priority) { - nvic_irq_num irq_num; - switch (timer_num) { - case 1: irq_num = NVIC_TIMER1_CC; break; - case 2: irq_num = NVIC_TIMER2; break; - case 3: irq_num = NVIC_TIMER3; break; - case 4: irq_num = NVIC_TIMER4; break; - case 5: irq_num = NVIC_TIMER5; break; - #ifdef STM32_HIGH_DENSITY - // 6 & 7 are basic timers, avoid them - case 8: irq_num = NVIC_TIMER8_CC; break; - #endif - default: - /** - * This should never happen. Add a Sanitycheck for timer number. - * Should be a general timer since basic timers have no CC channels. - */ - return; - } - - nvic_irq_set_priority(irq_num, priority); -} - - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - /** - * Give the Stepper ISR a higher priority (lower number) - * so it automatically preempts the Temperature ISR. - */ - - switch (timer_num) { - case STEP_TIMER_NUM: - timer_pause(STEP_TIMER_DEV); - timer_set_mode(STEP_TIMER_DEV, STEP_TIMER_CHAN, TIMER_OUTPUT_COMPARE); // counter - timer_set_count(STEP_TIMER_DEV, 0); - timer_set_prescaler(STEP_TIMER_DEV, (uint16_t)(STEPPER_TIMER_PRESCALE - 1)); - timer_set_reload(STEP_TIMER_DEV, 0xFFFF); - timer_oc_set_mode(STEP_TIMER_DEV, STEP_TIMER_CHAN, TIMER_OC_MODE_FROZEN, TIMER_OC_NO_PRELOAD); // no output pin change - timer_set_compare(STEP_TIMER_DEV, STEP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (STEPPER_TIMER_RATE) / frequency)); - timer_no_ARR_preload_ARPE(STEP_TIMER_DEV); // Need to be sure no preload on ARR register - timer_attach_interrupt(STEP_TIMER_DEV, STEP_TIMER_CHAN, stepTC_Handler); - timer_set_interrupt_priority(STEP_TIMER_NUM, STEP_TIMER_IRQ_PRIO); - timer_generate_update(STEP_TIMER_DEV); - timer_resume(STEP_TIMER_DEV); - break; - case TEMP_TIMER_NUM: - timer_pause(TEMP_TIMER_DEV); - timer_set_mode(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, TIMER_OUTPUT_COMPARE); - timer_set_count(TEMP_TIMER_DEV, 0); - timer_set_prescaler(TEMP_TIMER_DEV, (uint16_t)(TEMP_TIMER_PRESCALE - 1)); - timer_set_reload(TEMP_TIMER_DEV, 0xFFFF); - timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, _MIN(hal_timer_t(HAL_TIMER_TYPE_MAX), (F_CPU) / (TEMP_TIMER_PRESCALE) / frequency)); - timer_attach_interrupt(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, tempTC_Handler); - timer_set_interrupt_priority(TEMP_TIMER_NUM, TEMP_TIMER_IRQ_PRIO); - timer_generate_update(TEMP_TIMER_DEV); - timer_resume(TEMP_TIMER_DEV); - break; - } -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: ENABLE_STEPPER_DRIVER_INTERRUPT(); break; - case TEMP_TIMER_NUM: ENABLE_TEMPERATURE_INTERRUPT(); break; - } -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: DISABLE_STEPPER_DRIVER_INTERRUPT(); break; - case TEMP_TIMER_NUM: DISABLE_TEMPERATURE_INTERRUPT(); break; - } -} - -static inline bool timer_irq_enabled(const timer_dev * const dev, const uint8_t interrupt) { - return bool(*bb_perip(&(dev->regs).gen->DIER, interrupt)); -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: return timer_irq_enabled(STEP_TIMER_DEV, STEP_TIMER_CHAN); - case TEMP_TIMER_NUM: return timer_irq_enabled(TEMP_TIMER_DEV, TEMP_TIMER_CHAN); - } - return false; -} - -timer_dev* get_timer_dev(int number) { - switch (number) { - #if STM32_HAVE_TIMER(1) - case 1: return &timer1; - #endif - #if STM32_HAVE_TIMER(2) - case 2: return &timer2; - #endif - #if STM32_HAVE_TIMER(3) - case 3: return &timer3; - #endif - #if STM32_HAVE_TIMER(4) - case 4: return &timer4; - #endif - #if STM32_HAVE_TIMER(5) - case 5: return &timer5; - #endif - #if STM32_HAVE_TIMER(6) - case 6: return &timer6; - #endif - #if STM32_HAVE_TIMER(7) - case 7: return &timer7; - #endif - #if STM32_HAVE_TIMER(8) - case 8: return &timer8; - #endif - #if STM32_HAVE_TIMER(9) - case 9: return &timer9; - #endif - #if STM32_HAVE_TIMER(10) - case 10: return &timer10; - #endif - #if STM32_HAVE_TIMER(11) - case 11: return &timer11; - #endif - #if STM32_HAVE_TIMER(12) - case 12: return &timer12; - #endif - #if STM32_HAVE_TIMER(13) - case 13: return &timer13; - #endif - #if STM32_HAVE_TIMER(14) - case 14: return &timer14; - #endif - default: return nullptr; - } -} - -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/timers.h b/Marlin/src/HAL/STM32F1/timers.h deleted file mode 100644 index 6f360f6bfc..0000000000 --- a/Marlin/src/HAL/STM32F1/timers.h +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) - */ - -#include -#include -#include "../../core/boards.h" - -// ------------------------ -// Defines -// ------------------------ - -/** - * TODO: Check and confirm what timer we will use for each Temps and stepper driving. - * We should probable drive temps with PWM. - */ -#define FORCE_INLINE __attribute__((always_inline)) inline - -typedef uint16_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFF - -#define HAL_TIMER_RATE uint32_t(F_CPU) // frequency of timers peripherals - -#ifndef STEP_TIMER_CHAN - #define STEP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts -#endif -#ifndef TEMP_TIMER_CHAN - #define TEMP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts -#endif - -/** - * Note: Timers may be used by platforms and libraries - * - * FAN PWMs: - * With FAN_SOFT_PWM disabled the Temperature class uses - * FANx_PIN timers to generate FAN PWM signals. - * - * Speaker: - * When SPEAKER is enabled, one timer is allocated by maple/tone.cpp. - * - If BEEPER_PIN has a timer channel (and USE_PIN_TIMER is - * defined in tone.cpp) it uses the pin's own timer. - * - Otherwise it uses Timer 8 on boards with STM32_HIGH_DENSITY - * or Timer 4 on other boards. - */ -#ifndef STEP_TIMER_NUM - #if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8) - #define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4 - #else - #define STEP_TIMER_NUM 5 // for other boards, five is fine. - #endif -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 2 // Timer Index for Temperature - //#define TEMP_TIMER_NUM 4 // 2->4, Timer 2 for Stepper Current PWM -#endif - -#if MB(BTT_SKR_MINI_E3_V1_0, BTT_SKR_E3_DIP, BTT_SKR_MINI_E3_V1_2, MKS_ROBIN_LITE) - // SKR Mini E3 boards use PA8 as FAN_PIN, so TIMER 1 is used for Fan PWM. - #ifdef STM32_HIGH_DENSITY - #define SERVO0_TIMER_NUM 8 // tone.cpp uses Timer 4 - #else - #define SERVO0_TIMER_NUM 3 // tone.cpp uses Timer 8 - #endif -#else - #define SERVO0_TIMER_NUM 1 // SERVO0 or BLTOUCH -#endif - -#define STEP_TIMER_IRQ_PRIO 2 -#define TEMP_TIMER_IRQ_PRIO 3 -#define SERVO0_TIMER_IRQ_PRIO 1 - -#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency - -#define STEPPER_TIMER_PRESCALE 18 // prescaler for setting stepper timer, 4Mhz -#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -timer_dev* get_timer_dev(int number); -#define TIMER_DEV(num) get_timer_dev(num) -#define STEP_TIMER_DEV TIMER_DEV(STEP_TIMER_NUM) -#define TEMP_TIMER_DEV TIMER_DEV(TEMP_TIMER_NUM) - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() timer_enable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() timer_disable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() timer_enable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN) -#define DISABLE_TEMPERATURE_INTERRUPT() timer_disable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN) - -#define HAL_timer_get_count(timer_num) timer_get_count(TIMER_DEV(timer_num)) - -// TODO change this - -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() -#endif -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() -#endif - -extern "C" void tempTC_Handler(); -extern "C" void stepTC_Handler(); - -// ------------------------ -// Public Variables -// ------------------------ - -//static HardwareTimer StepperTimer(STEP_TIMER_NUM); -//static HardwareTimer TempTimer(TEMP_TIMER_NUM); - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -/** - * NOTE: By default libmaple sets ARPE = 1, which means the Auto reload register is preloaded (will only update with an update event) - * Thus we have to pause the timer, update the value, refresh, resume the timer. - * That seems like a big waste of time and may be better to change the timer config to ARPE = 0, so ARR can be updated any time. - * We are using a Channel in each timer in Capture/Compare mode. We could also instead use the Time Update Event Interrupt, but need to disable ARPE - * so we can change the ARR value on the fly (without calling refresh), and not get an interrupt right there because we caused an UEV. - * This mode pretty much makes 2 timers unusable for PWM since they have their counts updated all the time on ISRs. - * The way Marlin manages timer interrupts doesn't make for an efficient usage in STM32F1 - * Todo: Look at that possibility later. - */ - -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { - switch (timer_num) { - case STEP_TIMER_NUM: - // NOTE: WE have set ARPE = 0, which means the Auto reload register is not preloaded - // and there is no need to use any compare, as in the timer mode used, setting ARR to the compare value - // will result in exactly the same effect, ie trigerring an interrupt, and on top, set counter to 0 - timer_set_reload(STEP_TIMER_DEV, compare); // We reload direct ARR as needed during counting up - break; - case TEMP_TIMER_NUM: - timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, compare); - break; - } -} - -FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: - // No counter to clear - timer_generate_update(STEP_TIMER_DEV); - return; - case TEMP_TIMER_NUM: - timer_set_count(TEMP_TIMER_DEV, 0); - timer_generate_update(TEMP_TIMER_DEV); - return; - } -} - -#define HAL_timer_isr_epilogue(TIMER_NUM) - -// No command is available in framework to turn off ARPE bit, which is turned on by default in libmaple. -// Needed here to reset ARPE=0 for stepper timer -FORCE_INLINE static void timer_no_ARR_preload_ARPE(timer_dev *dev) { - bb_peri_set_bit(&(dev->regs).gen->CR1, TIMER_CR1_ARPE_BIT, 0); -} - -void timer_set_interrupt_priority(uint_fast8_t timer_num, uint_fast8_t priority); - -#define TIMER_OC_NO_PRELOAD 0 // Need to disable preload also on compare registers. diff --git a/Marlin/src/HAL/STM32F1/watchdog.cpp b/Marlin/src/HAL/STM32F1/watchdog.cpp deleted file mode 100644 index ca91a6fe43..0000000000 --- a/Marlin/src/HAL/STM32F1/watchdog.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) - */ - -#ifdef __STM32F1__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - -#include -#include "watchdog.h" - -void HAL_watchdog_refresh() { - #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) - TOGGLE(LED_PIN); // heartbeat indicator - #endif - iwdg_feed(); -} - -void watchdogSetup() { - // do whatever. don't remove this function. -} - -/** - * @brief Initialized the independent hardware watchdog. - * - * @return No return - * - * @details The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and 625 reload value (counts down to 0) - */ -void watchdog_init() { - #if DISABLED(DISABLE_WATCHDOG_INIT) - iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD); - #endif -} - -#endif // USE_WATCHDOG -#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/watchdog.h b/Marlin/src/HAL/STM32F1/watchdog.h deleted file mode 100644 index 7185d69775..0000000000 --- a/Marlin/src/HAL/STM32F1/watchdog.h +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) - */ - -#include - -/** - * The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and - * 625 reload value (counts down to 0) - * use 1250 for 8 seconds - */ -#define STM32F1_WD_RELOAD 625 - -// Arduino STM32F1 core now has watchdog support - -// Initialize watchdog with a 4 second countdown time -void watchdog_init(); - -// Reset watchdog. MUST be called at least every 4 seconds after the -// first watchdog_init or STM32F1 will reset. -void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL.cpp deleted file mode 100644 index b4629d2afd..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "HAL.h" - -//#include - -// ------------------------ -// Public Variables -// ------------------------ - -uint16_t HAL_adc_result; - -// ------------------------ -// Public functions -// ------------------------ - -/* VGPV Done with defines -// disable interrupts -void cli() { noInterrupts(); } - -// enable interrupts -void sei() { interrupts(); } -*/ - -void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } - -uint8_t HAL_get_reset_source() { - if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) return RST_WATCHDOG; - if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) return RST_SOFTWARE; - if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) return RST_EXTERNAL; - if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) return RST_POWER_ON; - return 0; -} - -void _delay_ms(const int delay_ms) { delay(delay_ms); } - -extern "C" { - extern unsigned int _ebss; // end of bss section -} - -// return free memory between end of heap (or end bss) and whatever is current - -/* -#include -//extern caddr_t _sbrk(int incr); -#ifndef CONFIG_HEAP_END -extern char _lm_heap_end; -#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) -#endif - -extern "C" { - static int freeMemory() { - char top = 't'; - return &top - reinterpret_cast(sbrk(0)); - } - int freeMemory() { - int free_memory; - int heap_end = (int)_sbrk(0); - free_memory = ((int)&free_memory) - ((int)heap_end); - return free_memory; - } -} -*/ - -// ------------------------ -// ADC -// ------------------------ - -void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); } - -uint16_t HAL_adc_get_result() { return HAL_adc_result; } - -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.h b/Marlin/src/HAL/STM32_F4_F7/HAL.h deleted file mode 100644 index 00a65de792..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/HAL.h +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define CPU_32_BIT - -#include "../../inc/MarlinConfigPre.h" - -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" - -#include "fastio.h" -#include "watchdog.h" - -#include - -#if defined(STM32F4) && USBCON - #include -#endif - -// ------------------------ -// Defines -// ------------------------ - -// Serial override -//extern HalSerial usb_serial; - -#define _MSERIAL(X) SerialUART##X -#define MSERIAL(X) _MSERIAL(X) -#define SerialUART0 Serial1 - -#if defined(STM32F4) && SERIAL_PORT == 0 - #error "SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." -#elif SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB -#elif WITHIN(SERIAL_PORT, 0, 6) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) -#else - #error "SERIAL_PORT must be from -1 to 6. Please update your configuration." -#endif - -#ifdef SERIAL_PORT_2 - #if defined(STM32F4) && SERIAL_PORT_2 == 0 - #error "SERIAL_PORT_2 cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif SERIAL_PORT_2 == -1 - #define MYSERIAL1 SerialUSB - #elif WITHIN(SERIAL_PORT_2, 0, 6) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) - #else - #error "SERIAL_PORT_2 must be from -1 to 6. Please update your configuration." - #endif -#endif - -#ifdef LCD_SERIAL_PORT - #if defined(STM32F4) && LCD_SERIAL_PORT == 0 - #error "LCD_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." - #elif LCD_SERIAL_PORT == -1 - #define LCD_SERIAL SerialUSB - #elif WITHIN(LCD_SERIAL_PORT, 0, 6) - #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) - #else - #error "LCD_SERIAL_PORT must be from -1 to 6. Please update your configuration." - #endif -#endif - -/** - * TODO: review this to return 1 for pins that are not analog input - */ -#ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) (p) -#endif - -#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() -#define CRITICAL_SECTION_END() if (!primask) __enable_irq() -#define ISRS_ENABLED() (!__get_PRIMASK()) -#define ENABLE_ISRS() __enable_irq() -#define DISABLE_ISRS() __disable_irq() -#define cli() __disable_irq() -#define sei() __enable_irq() - -// On AVR this is in math.h? -#define square(x) ((x)*(x)) - -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*(addr)) - -// ------------------------ -// Types -// ------------------------ - -typedef int8_t pin_t; - -#ifdef STM32F4 - #define HAL_SERVO_LIB libServo -#endif - -// ------------------------ -// Public Variables -// ------------------------ - -// Result of last ADC conversion -extern uint16_t HAL_adc_result; - -// ------------------------ -// Public functions -// ------------------------ - -// Memory related -#define __bss_end __bss_end__ - -inline void HAL_init() {} - -// Clear reset reason -void HAL_clear_reset_source(); - -// Reset reason -uint8_t HAL_get_reset_source(); - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -void _delay_ms(const int delay); - -/* -extern "C" { - int freeMemory(); -} -*/ - -extern "C" char* _sbrk(int incr); - -/* -int freeMemory() { - volatile int top; - top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); - return top; -} -*/ - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" - -static inline int freeMemory() { - volatile char top; - return &top - reinterpret_cast(_sbrk(0)); -} - -#pragma GCC diagnostic pop - -// -// ADC -// - -#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) - -inline void HAL_adc_init() {} - -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 -#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) -#define HAL_READ_ADC() HAL_adc_result -#define HAL_ADC_READY() true - -void HAL_adc_start_conversion(const uint8_t adc_pin); -uint16_t HAL_adc_get_result(); - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -#ifdef STM32F4 - #define JTAG_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY) - #define JTAGSWD_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_NONE) -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp deleted file mode 100644 index ebd0b4cee7..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -/** - * Software SPI functions originally from Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman - */ - -/** - * Adapted to the Marlin STM32F4/7 HAL - */ - -#include "../../inc/MarlinConfig.h" - -#include -#include -#include "../shared/HAL_SPI.h" -#include "spi_pins.h" - -// ------------------------ -// Public Variables -// ------------------------ - -static SPISettings spiConfig; - -// ------------------------ -// Public functions -// ------------------------ - -#if ENABLED(SOFTWARE_SPI) - // ------------------------ - // Software SPI - // ------------------------ - #error "Software SPI not supported for STM32F4/7. Use Hardware SPI." -#else - -// ------------------------ -// Hardware SPI -// ------------------------ - -/** - * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz - */ - -/** - * @brief Begin SPI port setup - * - * @return Nothing - * - * @details Only configures SS pin since libmaple creates and initialize the SPI object - */ -void spiBegin() { - #if !defined(SS_PIN) || SS_PIN < 0 - #error "SS_PIN not defined!" - #endif - - OUT_WRITE(SS_PIN, HIGH); -} - -/** Configure SPI for specified SPI speed */ -void spiInit(uint8_t spiRate) { - // Use datarates Marlin uses - uint32_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = 20000000; break; // 13.9mhz=20000000 6.75mhz=10000000 3.38mhz=5000000 .833mhz=1000000 - case SPI_HALF_SPEED: clock = 5000000; break; - case SPI_QUARTER_SPEED: clock = 2500000; break; - case SPI_EIGHTH_SPEED: clock = 1250000; break; - case SPI_SPEED_5: clock = 625000; break; - case SPI_SPEED_6: clock = 300000; break; - default: clock = 4000000; // Default from the SPI libarary - } - spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); - SPI.begin(); -} - -/** - * @brief Receives a single byte from the SPI port. - * - * @return Byte received - * - * @details - */ -uint8_t spiRec() { - SPI.beginTransaction(spiConfig); - uint8_t returnByte = SPI.transfer(0xFF); - SPI.endTransaction(); - return returnByte; -} - -/** - * @brief Receives a number of bytes from the SPI port to a buffer - * - * @param buf Pointer to starting address of buffer to write to. - * @param nbyte Number of bytes to receive. - * @return Nothing - * - * @details Uses DMA - */ -void spiRead(uint8_t* buf, uint16_t nbyte) { - SPI.beginTransaction(spiConfig); - #ifndef STM32GENERIC - SPI.dmaTransfer(0, const_cast(buf), nbyte); - #else - SPI.transfer((uint8_t*)buf, nbyte); - #endif - SPI.endTransaction(); -} - -/** - * @brief Sends a single byte on SPI port - * - * @param b Byte to send - * - * @details - */ -void spiSend(uint8_t b) { - SPI.beginTransaction(spiConfig); - SPI.transfer(b); - SPI.endTransaction(); -} - -/** - * @brief Write token and then write from 512 byte buffer to SPI (for SD card) - * - * @param buf Pointer with buffer start address - * @return Nothing - * - * @details Use DMA - */ -void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPI.beginTransaction(spiConfig); - SPI.transfer(token); - #ifndef STM32GENERIC - SPI.dmaSend(const_cast(buf), 512); - #else - SPI.transfer((uint8_t*)buf, nullptr, 512); - #endif - SPI.endTransaction(); -} - -#endif // SOFTWARE_SPI -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/README.md b/Marlin/src/HAL/STM32_F4_F7/README.md deleted file mode 100644 index 3b5a9ab02e..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# This HAL is for... - - - STM32F407 MCU with STM32Generic Arduino core by danieleff. - - STM32F765 board "The Borg" with STM32Generic. - -See the `README.md` files in HAL_STM32F4 and HAL_STM32F7 for the specifics of those hals. diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp deleted file mode 100644 index dc41f89131..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && defined(STM32F4) - -#include "../../../inc/MarlinConfig.h" - -// ------------------------ -// Local defines -// ------------------------ - -#define NUM_HARDWARE_TIMERS 2 -#define STEP_TIMER_IRQ_ID TIM5_IRQn -#define TEMP_TIMER_IRQ_ID TIM7_IRQn - -// ------------------------ -// Private Variables -// ------------------------ - -stm32_timer_t TimerHandle[NUM_HARDWARE_TIMERS]; - -// ------------------------ -// Public functions -// ------------------------ - -bool timers_initialized[NUM_HARDWARE_TIMERS] = {false}; - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - - if (!timers_initialized[timer_num]) { - constexpr uint32_t step_prescaler = STEPPER_TIMER_PRESCALE - 1, - temp_prescaler = TEMP_TIMER_PRESCALE - 1; - switch (timer_num) { - case STEP_TIMER_NUM: - // STEPPER TIMER TIM5 - use a 32bit timer - __HAL_RCC_TIM5_CLK_ENABLE(); - TimerHandle[timer_num].handle.Instance = TIM5; - TimerHandle[timer_num].handle.Init.Prescaler = step_prescaler; - TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; - TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - TimerHandle[timer_num].callback = (uint32_t)TC5_Handler; - HAL_NVIC_SetPriority(STEP_TIMER_IRQ_ID, 1, 0); - break; - - case TEMP_TIMER_NUM: - // TEMP TIMER TIM7 - any available 16bit Timer (1 already used for PWM) - __HAL_RCC_TIM7_CLK_ENABLE(); - TimerHandle[timer_num].handle.Instance = TIM7; - TimerHandle[timer_num].handle.Init.Prescaler = temp_prescaler; - TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; - TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - TimerHandle[timer_num].callback = (uint32_t)TC7_Handler; - HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_ID, 2, 0); - break; - } - timers_initialized[timer_num] = true; - } - - TimerHandle[timer_num].handle.Init.Period = (((HAL_TIMER_RATE) / TimerHandle[timer_num].handle.Init.Prescaler) / frequency) - 1; - if (HAL_TIM_Base_Init(&TimerHandle[timer_num].handle) == HAL_OK) - HAL_TIM_Base_Start_IT(&TimerHandle[timer_num].handle); -} - -extern "C" void TIM5_IRQHandler() { - ((void(*)())TimerHandle[0].callback)(); -} -extern "C" void TIM7_IRQHandler() { - ((void(*)())TimerHandle[1].callback)(); -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: HAL_NVIC_EnableIRQ(STEP_TIMER_IRQ_ID); break; - case TEMP_TIMER_NUM: HAL_NVIC_EnableIRQ(TEMP_TIMER_IRQ_ID); break; - } -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: HAL_NVIC_DisableIRQ(STEP_TIMER_IRQ_ID); break; - case TEMP_TIMER_NUM: HAL_NVIC_DisableIRQ(TEMP_TIMER_IRQ_ID); break; - } - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - switch (timer_num) { - case STEP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)STEP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)STEP_TIMER_IRQ_ID) & (uint32_t)0x1F)); - case TEMP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) & (uint32_t)0x1F)); - } - return false; -} - -#endif // STM32GENERIC && STM32F4 diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h deleted file mode 100644 index a4a7ad82cc..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? -#define HAL_TIMER_TYPE_MAX 0xFFFF - -#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif - -#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency - -#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz -#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -// TODO change this - -#ifdef STM32GENERIC - #define TC_TIMER_ARGS -#else - #define TC_TIMER_ARGS stimer_t *htim -#endif - -extern void TC5_Handler(TC_TIMER_ARGS); -extern void TC7_Handler(TC_TIMER_ARGS); -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() void TC5_Handler(TC_TIMER_ARGS) -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() void TC7_Handler(TC_TIMER_ARGS) -#endif - -// ------------------------ -// Types -// ------------------------ - -#ifdef STM32GENERIC - typedef struct { - TIM_HandleTypeDef handle; - uint32_t callback; - } tTimerConfig; - typedef tTimerConfig stm32_timer_t; -#else - typedef stimer_t stm32_timer_t; -#endif - -// ------------------------ -// Public Variables -// ------------------------ - -extern stm32_timer_t TimerHandle[]; - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -FORCE_INLINE static uint32_t HAL_timer_get_count(const uint8_t timer_num) { - return __HAL_TIM_GET_COUNTER(&TimerHandle[timer_num].handle); -} - -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { - __HAL_TIM_SET_AUTORELOAD(&TimerHandle[timer_num].handle, compare); - if (HAL_timer_get_count(timer_num) >= compare) - TimerHandle[timer_num].handle.Instance->EGR |= TIM_EGR_UG; // Generate an immediate update interrupt -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - return __HAL_TIM_GET_AUTORELOAD(&TimerHandle[timer_num].handle); -} - -#ifdef STM32GENERIC - FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { - if (__HAL_TIM_GET_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE) == SET) - __HAL_TIM_CLEAR_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE); - } -#else - #define HAL_timer_isr_prologue(TIMER_NUM) -#endif - -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md b/Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md deleted file mode 100644 index 23155b425e..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# This HAL is for the STM32F765 board "The Borg" used with STM32Generic Arduino core by danieleff. - -# Original core is located at: - -https://github.com/danieleff/STM32GENERIC - -but I haven't committed the changes needed for the Borg there yet, so please use: - -https://github.com/Spawn32/STM32GENERIC - -Unzip it into [Arduino]/hardware folder - - -Download the latest GNU ARM Embedded Toolchain: - -https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads - -(The one in Arduino doesn't support STM32F7). - -Change compiler.path in platform.txt to point to the one you downloaded. - -# This HAL is in development. -# Currently only tested on "The Borg". - -You will also need the latest Arduino 1.9.0-beta or newer. - -This HAL is a modified version of Chris Barr's Picoprint STM32F4 HAL, so shouldn't be to hard to get it to work on a F4. diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp deleted file mode 100644 index e67808c3c4..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp +++ /dev/null @@ -1,898 +0,0 @@ -/** - * TMC26XStepper.cpp - - TMC26X Stepper library for Wiring/Arduino - * - * based on the stepper library by Tom Igoe, et. al. - * - * Copyright (c) 2011, Interactive Matter, Marcus Nowotny - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#if defined(STM32GENERIC) && defined(STM32F7) - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_DRIVER(TMC2660) - -#include -#include -#include "TMC2660.h" - -#include "../../../inc/MarlinConfig.h" -#include "../../../MarlinCore.h" -#include "../../../module/stepper/indirection.h" -#include "../../../module/printcounter.h" -#include "../../../libs/duration_t.h" -#include "../../../libs/hex_print.h" - -//some default values used in initialization -#define DEFAULT_MICROSTEPPING_VALUE 32 - -//TMC26X register definitions -#define DRIVER_CONTROL_REGISTER 0x0UL -#define CHOPPER_CONFIG_REGISTER 0x80000UL -#define COOL_STEP_REGISTER 0xA0000ul -#define STALL_GUARD2_LOAD_MEASURE_REGISTER 0xC0000ul -#define DRIVER_CONFIG_REGISTER 0xE0000ul - -#define REGISTER_BIT_PATTERN 0xFFFFFul - -//definitions for the driver control register -#define MICROSTEPPING_PATTERN 0xFul -#define STEP_INTERPOLATION 0x200UL -#define DOUBLE_EDGE_STEP 0x100UL -#define VSENSE 0x40UL -#define READ_MICROSTEP_POSTION 0x0UL -#define READ_STALL_GUARD_READING 0x10UL -#define READ_STALL_GUARD_AND_COOL_STEP 0x20UL -#define READ_SELECTION_PATTERN 0x30UL - -//definitions for the chopper config register -#define CHOPPER_MODE_STANDARD 0x0UL -#define CHOPPER_MODE_T_OFF_FAST_DECAY 0x4000UL -#define T_OFF_PATTERN 0xFul -#define RANDOM_TOFF_TIME 0x2000UL -#define BLANK_TIMING_PATTERN 0x18000UL -#define BLANK_TIMING_SHIFT 15 -#define HYSTERESIS_DECREMENT_PATTERN 0x1800UL -#define HYSTERESIS_DECREMENT_SHIFT 11 -#define HYSTERESIS_LOW_VALUE_PATTERN 0x780UL -#define HYSTERESIS_LOW_SHIFT 7 -#define HYSTERESIS_START_VALUE_PATTERN 0x78UL -#define HYSTERESIS_START_VALUE_SHIFT 4 -#define T_OFF_TIMING_PATERN 0xFul - -//definitions for cool step register -#define MINIMUM_CURRENT_FOURTH 0x8000UL -#define CURRENT_DOWN_STEP_SPEED_PATTERN 0x6000UL -#define SE_MAX_PATTERN 0xF00ul -#define SE_CURRENT_STEP_WIDTH_PATTERN 0x60UL -#define SE_MIN_PATTERN 0xFul - -//definitions for StallGuard2 current register -#define STALL_GUARD_FILTER_ENABLED 0x10000UL -#define STALL_GUARD_TRESHHOLD_VALUE_PATTERN 0x17F00ul -#define CURRENT_SCALING_PATTERN 0x1Ful -#define STALL_GUARD_CONFIG_PATTERN 0x17F00ul -#define STALL_GUARD_VALUE_PATTERN 0x7F00ul - -//definitions for the input from the TMC2660 -#define STATUS_STALL_GUARD_STATUS 0x1UL -#define STATUS_OVER_TEMPERATURE_SHUTDOWN 0x2UL -#define STATUS_OVER_TEMPERATURE_WARNING 0x4UL -#define STATUS_SHORT_TO_GROUND_A 0x8UL -#define STATUS_SHORT_TO_GROUND_B 0x10UL -#define STATUS_OPEN_LOAD_A 0x20UL -#define STATUS_OPEN_LOAD_B 0x40UL -#define STATUS_STAND_STILL 0x80UL -#define READOUT_VALUE_PATTERN 0xFFC00ul - -#define CPU_32_BIT - -//default values -#define INITIAL_MICROSTEPPING 0x3UL //32th microstepping - -SPIClass SPI_6(SPI6, SPI6_MOSI_PIN, SPI6_MISO_PIN, SPI6_SCK_PIN); - -#define STEPPER_SPI SPI_6 - -//debuging output - -//#define TMC_DEBUG1 - -uint8_t current_scaling = 0; - -/** - * Constructor - * number_of_steps - the steps per rotation - * cs_pin - the SPI client select pin - * dir_pin - the pin where the direction pin is connected - * step_pin - the pin where the step pin is connected - */ -TMC26XStepper::TMC26XStepper(const int16_t in_steps, int16_t cs_pin, int16_t dir_pin, int16_t step_pin, uint16_t current, uint16_t resistor) { - // We are not started yet - started = false; - - // By default cool step is not enabled - cool_step_enabled = false; - - // Save the pins for later use - this->cs_pin = cs_pin; - this->dir_pin = dir_pin; - this->step_pin = step_pin; - - // Store the current sense resistor value for later use - this->resistor = resistor; - - // Initizalize our status values - this->steps_left = 0; - this->direction = 0; - - // Initialize register values - driver_control_register_value = DRIVER_CONTROL_REGISTER | INITIAL_MICROSTEPPING; - chopper_config_register = CHOPPER_CONFIG_REGISTER; - - // Setting the default register values - driver_control_register_value = DRIVER_CONTROL_REGISTER|INITIAL_MICROSTEPPING; - microsteps = _BV(INITIAL_MICROSTEPPING); - chopper_config_register = CHOPPER_CONFIG_REGISTER; - cool_step_register_value = COOL_STEP_REGISTER; - stallguard2_current_register_value = STALL_GUARD2_LOAD_MEASURE_REGISTER; - driver_configuration_register_value = DRIVER_CONFIG_REGISTER | READ_STALL_GUARD_READING; - - // Set the current - setCurrent(current); - // Set to a conservative start value - setConstantOffTimeChopper(7, 54, 13,12,1); - // Set a nice microstepping value - setMicrosteps(DEFAULT_MICROSTEPPING_VALUE); - // Save the number of steps - number_of_steps = in_steps; -} - - -/** - * start & configure the stepper driver - * just must be called. - */ -void TMC26XStepper::start() { - - #ifdef TMC_DEBUG1 - SERIAL_ECHOLNPGM("\n TMC26X stepper library"); - SERIAL_ECHOPAIR("\n CS pin: ", cs_pin); - SERIAL_ECHOPAIR("\n DIR pin: ", dir_pin); - SERIAL_ECHOPAIR("\n STEP pin: ", step_pin); - SERIAL_PRINTF("\n current scaling: %d", current_scaling); - SERIAL_PRINTF("\n Resistor: %d", resistor); - //SERIAL_PRINTF("\n current: %d", current); - SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); - #endif - - //set the pins as output & its initial value - pinMode(step_pin, OUTPUT); - pinMode(dir_pin, OUTPUT); - pinMode(cs_pin, OUTPUT); - extDigitalWrite(step_pin, LOW); - extDigitalWrite(dir_pin, LOW); - extDigitalWrite(cs_pin, HIGH); - - STEPPER_SPI.begin(); - STEPPER_SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); - - //set the initial values - send262(driver_control_register_value); - send262(chopper_config_register); - send262(cool_step_register_value); - send262(stallguard2_current_register_value); - send262(driver_configuration_register_value); - - //save that we are in running mode - started = true; -} - -/** - * Mark the driver as unstarted to be able to start it again - */ -void TMC26XStepper::un_start() { started = false; } - - -/** - * Sets the speed in revs per minute - */ -void TMC26XStepper::setSpeed(uint16_t whatSpeed) { - this->speed = whatSpeed; - this->step_delay = 60UL * sq(1000UL) / ((uint32_t)this->number_of_steps * (uint32_t)whatSpeed * (uint32_t)this->microsteps); - #ifdef TMC_DEBUG0 // crashes - SERIAL_ECHOPAIR("\nStep delay in micros: ", this->step_delay); - #endif - // Update the next step time - this->next_step_time = this->last_step_time + this->step_delay; -} - -uint16_t TMC26XStepper::getSpeed() { return this->speed; } - -/** - * Moves the motor steps_to_move steps. - * Negative indicates the reverse direction. - */ -char TMC26XStepper::step(int16_t steps_to_move) { - if (this->steps_left == 0) { - this->steps_left = ABS(steps_to_move); // how many steps to take - - // determine direction based on whether steps_to_move is + or -: - if (steps_to_move > 0) - this->direction = 1; - else if (steps_to_move < 0) - this->direction = 0; - return 0; - } - return -1; -} - -char TMC26XStepper::move() { - // decrement the number of steps, moving one step each time: - if (this->steps_left > 0) { - uint32_t time = micros(); - // move only if the appropriate delay has passed: - - // rem if (time >= this->next_step_time) { - - if (ABS(time - this->last_step_time) > this->step_delay) { - // increment or decrement the step number, - // depending on direction: - if (this->direction == 1) - extDigitalWrite(step_pin, HIGH); - else { - extDigitalWrite(dir_pin, HIGH); - extDigitalWrite(step_pin, HIGH); - } - // get the timeStamp of when you stepped: - this->last_step_time = time; - this->next_step_time = time + this->step_delay; - // decrement the steps left: - steps_left--; - //disable the step & dir pins - extDigitalWrite(step_pin, LOW); - extDigitalWrite(dir_pin, LOW); - } - return -1; - } - return 0; -} - -char TMC26XStepper::isMoving() { return this->steps_left > 0; } - -uint16_t TMC26XStepper::getStepsLeft() { return this->steps_left; } - -char TMC26XStepper::stop() { - //note to self if the motor is currently moving - char state = isMoving(); - //stop the motor - this->steps_left = 0; - this->direction = 0; - //return if it was moving - return state; -} - -void TMC26XStepper::setCurrent(uint16_t current) { - uint8_t current_scaling = 0; - //calculate the current scaling from the max current setting (in mA) - float mASetting = (float)current, - resistor_value = (float)this->resistor; - // remove vsense flag - this->driver_configuration_register_value &= ~(VSENSE); - // Derived from I = (cs + 1) / 32 * (Vsense / Rsense) - // leading to cs = 32 * R * I / V (with V = 0,31V oder 0,165V and I = 1000 * current) - // with Rsense = 0,15 - // for vsense = 0,310V (VSENSE not set) - // or vsense = 0,165V (VSENSE set) - current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.31 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 - - // Check if the current scalingis too low - if (current_scaling < 16) { - // Set the csense bit to get a use half the sense voltage (to support lower motor currents) - this->driver_configuration_register_value |= VSENSE; - // and recalculate the current setting - current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.165 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 - #ifdef TMC_DEBUG0 // crashes - SERIAL_ECHOPAIR("\nCS (Vsense=1): ",current_scaling); - #endif - } - #ifdef TMC_DEBUG0 // crashes - else - SERIAL_ECHOPAIR("\nCS: ", current_scaling); - #endif - - // do some sanity checks - NOMORE(current_scaling, 31); - - // delete the old value - stallguard2_current_register_value &= ~(CURRENT_SCALING_PATTERN); - // set the new current scaling - stallguard2_current_register_value |= current_scaling; - // if started we directly send it to the motor - if (started) { - send262(driver_configuration_register_value); - send262(stallguard2_current_register_value); - } -} - -uint16_t TMC26XStepper::getCurrent() { - // Calculate the current according to the datasheet to be on the safe side. - // This is not the fastest but the most accurate and illustrative way. - float result = (float)(stallguard2_current_register_value & CURRENT_SCALING_PATTERN), - resistor_value = (float)this->resistor, - voltage = (driver_configuration_register_value & VSENSE) ? 0.165 : 0.31; - result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); - return (uint16_t)result; -} - -void TMC26XStepper::setStallGuardThreshold(char stallguard_threshold, char stallguard_filter_enabled) { - // We just have 5 bits - LIMIT(stallguard_threshold, -64, 63); - - // Add trim down to 7 bits - stallguard_threshold &= 0x7F; - // Delete old StallGuard settings - stallguard2_current_register_value &= ~(STALL_GUARD_CONFIG_PATTERN); - if (stallguard_filter_enabled) - stallguard2_current_register_value |= STALL_GUARD_FILTER_ENABLED; - - // Set the new StallGuard threshold - stallguard2_current_register_value |= (((uint32_t)stallguard_threshold << 8) & STALL_GUARD_CONFIG_PATTERN); - // If started we directly send it to the motor - if (started) send262(stallguard2_current_register_value); -} - -char TMC26XStepper::getStallGuardThreshold() { - uint32_t stallguard_threshold = stallguard2_current_register_value & STALL_GUARD_VALUE_PATTERN; - //shift it down to bit 0 - stallguard_threshold >>= 8; - //convert the value to an int16_t to correctly handle the negative numbers - char result = stallguard_threshold; - //check if it is negative and fill it up with leading 1 for proper negative number representation - //rem if (result & _BV(6)) { - - if (TEST(result, 6)) result |= 0xC0; - return result; -} - -char TMC26XStepper::getStallGuardFilter() { - if (stallguard2_current_register_value & STALL_GUARD_FILTER_ENABLED) - return -1; - return 0; -} - -/** - * Set the number of microsteps per step. - * 0,2,4,8,16,32,64,128,256 is supported - * any value in between will be mapped to the next smaller value - * 0 and 1 set the motor in full step mode - */ -void TMC26XStepper::setMicrosteps(const int16_t in_steps) { - uint16_t setting_pattern; - - if (in_steps >= 256) setting_pattern = 0; - else if (in_steps >= 128) setting_pattern = 1; - else if (in_steps >= 64) setting_pattern = 2; - else if (in_steps >= 32) setting_pattern = 3; - else if (in_steps >= 16) setting_pattern = 4; - else if (in_steps >= 8) setting_pattern = 5; - else if (in_steps >= 4) setting_pattern = 6; - else if (in_steps >= 2) setting_pattern = 7; - else if (in_steps <= 1) setting_pattern = 8; // 1 and 0 lead to full step - - microsteps = _BV(8 - setting_pattern); - - #ifdef TMC_DEBUG0 // crashes - SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); - #endif - - // Delete the old value - this->driver_control_register_value &= 0x000FFFF0UL; - - // Set the new value - this->driver_control_register_value |= setting_pattern; - - // If started we directly send it to the motor - if (started) send262(driver_control_register_value); - - // Recalculate the stepping delay by simply setting the speed again - this->setSpeed(this->speed); -} - -/** - * returns the effective number of microsteps at the moment - */ -int16_t TMC26XStepper::getMicrosteps() { return microsteps; } - -/** - * constant_off_time: The off time setting controls the minimum chopper frequency. - * For most applications an off time within the range of 5μs to 20μs will fit. - * 2...15: off time setting - * - * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the - * duration of the ringing on the sense resistor. For - * 0: min. setting 3: max. setting - * - * fast_decay_time_setting: Fast decay time setting. With CHM=1, these bits control the portion of fast decay for each chopper cycle. - * 0: slow decay only - * 1...15: duration of fast decay phase - * - * sine_wave_offset: Sine wave offset. With CHM=1, these bits control the sine wave offset. - * A positive offset corrects for zero crossing error. - * -3..-1: negative offset 0: no offset 1...12: positive offset - * - * use_current_comparator: Selects usage of the current comparator for termination of the fast decay cycle. - * If current comparator is enabled, it terminates the fast decay cycle in case the current - * reaches a higher negative value than the actual positive value. - * 1: enable comparator termination of fast decay cycle - * 0: end by time only - */ -void TMC26XStepper::setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, uint8_t use_current_comparator) { - // Perform some sanity checks - LIMIT(constant_off_time, 2, 15); - - // Save the constant off time - this->constant_off_time = constant_off_time; - - // Calculate the value acc to the clock cycles - const char blank_value = blank_time >= 54 ? 3 : - blank_time >= 36 ? 2 : - blank_time >= 24 ? 1 : 0; - - LIMIT(fast_decay_time_setting, 0, 15); - LIMIT(sine_wave_offset, -3, 12); - - // Shift the sine_wave_offset - sine_wave_offset += 3; - - // Calculate the register setting - // First of all delete all the values for this - chopper_config_register &= ~(_BV(12) | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); - // Set the constant off pattern - chopper_config_register |= CHOPPER_MODE_T_OFF_FAST_DECAY; - // Set the blank timing value - chopper_config_register |= ((uint32_t)blank_value) << BLANK_TIMING_SHIFT; - // Setting the constant off time - chopper_config_register |= constant_off_time; - // Set the fast decay time - // Set msb - chopper_config_register |= (((uint32_t)(fast_decay_time_setting & 0x8)) << HYSTERESIS_DECREMENT_SHIFT); - // Other bits - chopper_config_register |= (((uint32_t)(fast_decay_time_setting & 0x7)) << HYSTERESIS_START_VALUE_SHIFT); - // Set the sine wave offset - chopper_config_register |= (uint32_t)sine_wave_offset << HYSTERESIS_LOW_SHIFT; - // Using the current comparator? - if (!use_current_comparator) - chopper_config_register |= _BV(12); - - // If started we directly send it to the motor - if (started) { - // rem send262(driver_control_register_value); - send262(chopper_config_register); - } -} - -/** - * constant_off_time: The off time setting controls the minimum chopper frequency. - * For most applications an off time within the range of 5μs to 20μs will fit. - * 2...15: off time setting - * - * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the - * duration of the ringing on the sense resistor. For - * 0: min. setting 3: max. setting - * - * hysteresis_start: Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value HEND. - * 1...8 - * - * hysteresis_end: Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by HDEC. - * The sum HSTRT+HEND must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. - * -3..-1: negative HEND 0: zero HEND 1...12: positive HEND - * - * hysteresis_decrement: Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. - * 0: fast decrement 3: very slow decrement - */ - -void TMC26XStepper::setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement) { - // Perform some sanity checks - LIMIT(constant_off_time, 2, 15); - - // Save the constant off time - this->constant_off_time = constant_off_time; - - // Calculate the value acc to the clock cycles - const char blank_value = blank_time >= 54 ? 3 : - blank_time >= 36 ? 2 : - blank_time >= 24 ? 1 : 0; - - LIMIT(hysteresis_start, 1, 8); - hysteresis_start--; - - LIMIT(hysteresis_start, -3, 12); - - // Shift the hysteresis_end - hysteresis_end += 3; - - LIMIT(hysteresis_decrement, 0, 3); - - //first of all delete all the values for this - chopper_config_register &= ~(CHOPPER_MODE_T_OFF_FAST_DECAY | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); - - //set the blank timing value - chopper_config_register |= ((uint32_t)blank_value) << BLANK_TIMING_SHIFT; - //setting the constant off time - chopper_config_register |= constant_off_time; - //set the hysteresis_start - chopper_config_register |= ((uint32_t)hysteresis_start) << HYSTERESIS_START_VALUE_SHIFT; - //set the hysteresis end - chopper_config_register |= ((uint32_t)hysteresis_end) << HYSTERESIS_LOW_SHIFT; - //set the hystereis decrement - chopper_config_register |= ((uint32_t)blank_value) << BLANK_TIMING_SHIFT; - //if started we directly send it to the motor - if (started) { - //rem send262(driver_control_register_value); - send262(chopper_config_register); - } -} - -/** - * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. - * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, thus it depends on the microstep position. - * With some motors a slightly audible beat can occur between the chopper frequencies, especially when they are near to each other. This typically occurs at a - * few microstep positions within each quarter wave. This effect normally is not audible when compared to mechanical noise generated by ball bearings, etc. - * Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. - * Hint: A common factor, which can cause motor noise, is a bad PCB layout causing coupling of both sense resistor voltages - * (please refer to sense resistor layout hint in chapter 8.1). - * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. - * It modulates the slow decay time setting when switched on by the RNDTF bit. The RNDTF feature further spreads the chopper spectrum, - * reducing electromagnetic emission on single frequencies. - */ -void TMC26XStepper::setRandomOffTime(char value) { - if (value) - chopper_config_register |= RANDOM_TOFF_TIME; - else - chopper_config_register &= ~(RANDOM_TOFF_TIME); - //if started we directly send it to the motor - if (started) { - //rem send262(driver_control_register_value); - send262(chopper_config_register); - } -} - -void TMC26XStepper::setCoolStepConfiguration( - uint16_t lower_SG_threshold, - uint16_t SG_hysteresis, - uint8_t current_decrement_step_size, - uint8_t current_increment_step_size, - uint8_t lower_current_limit -) { - // Sanitize the input values - NOMORE(lower_SG_threshold, 480); - // Divide by 32 - lower_SG_threshold >>= 5; - NOMORE(SG_hysteresis, 480); - // Divide by 32 - SG_hysteresis >>= 5; - NOMORE(current_decrement_step_size, 3); - NOMORE(current_increment_step_size, 3); - NOMORE(lower_current_limit, 1); - - // Store the lower level in order to enable/disable the cool step - this->cool_step_lower_threshold=lower_SG_threshold; - // If cool step is not enabled we delete the lower value to keep it disabled - if (!this->cool_step_enabled) lower_SG_threshold = 0; - // The good news is that we can start with a complete new cool step register value - // And simply set the values in the register - cool_step_register_value = ((uint32_t)lower_SG_threshold) - | (((uint32_t)SG_hysteresis) << 8) - | (((uint32_t)current_decrement_step_size) << 5) - | (((uint32_t)current_increment_step_size) << 13) - | (((uint32_t)lower_current_limit) << 15) - | COOL_STEP_REGISTER; // Register signature - - if (started) send262(cool_step_register_value); -} - -void TMC26XStepper::setCoolStepEnabled(boolean enabled) { - // Simply delete the lower limit to disable the cool step - cool_step_register_value &= ~SE_MIN_PATTERN; - // And set it to the proper value if cool step is to be enabled - if (enabled) - cool_step_register_value |= this->cool_step_lower_threshold; - // And save the enabled status - this->cool_step_enabled = enabled; - // Save the register value - if (started) send262(cool_step_register_value); -} - -boolean TMC26XStepper::isCoolStepEnabled() { return this->cool_step_enabled; } - -uint16_t TMC26XStepper::getCoolStepLowerSgThreshold() { - // We return our internally stored value - in order to provide the correct setting even if cool step is not enabled - return this->cool_step_lower_threshold<<5; -} - -uint16_t TMC26XStepper::getCoolStepUpperSgThreshold() { - return uint8_t((cool_step_register_value & SE_MAX_PATTERN) >> 8) << 5; -} - -uint8_t TMC26XStepper::getCoolStepCurrentIncrementSize() { - return uint8_t((cool_step_register_value & CURRENT_DOWN_STEP_SPEED_PATTERN) >> 13); -} - -uint8_t TMC26XStepper::getCoolStepNumberOfSGReadings() { - return uint8_t((cool_step_register_value & SE_CURRENT_STEP_WIDTH_PATTERN) >> 5); -} - -uint8_t TMC26XStepper::getCoolStepLowerCurrentLimit() { - return uint8_t((cool_step_register_value & MINIMUM_CURRENT_FOURTH) >> 15); -} - -void TMC26XStepper::setEnabled(boolean enabled) { - //delete the t_off in the chopper config to get sure - chopper_config_register &= ~(T_OFF_PATTERN); - if (enabled) { - //and set the t_off time - chopper_config_register |= this->constant_off_time; - } - //if not enabled we don't have to do anything since we already delete t_off from the register - if (started) send262(chopper_config_register); -} - -boolean TMC26XStepper::isEnabled() { return !!(chopper_config_register & T_OFF_PATTERN); } - -/** - * reads a value from the TMC26X status register. The value is not obtained directly but can then - * be read by the various status routines. - */ -void TMC26XStepper::readStatus(char read_value) { - uint32_t old_driver_configuration_register_value = driver_configuration_register_value; - //reset the readout configuration - driver_configuration_register_value &= ~(READ_SELECTION_PATTERN); - //this now equals TMC26X_READOUT_POSITION - so we just have to check the other two options - if (read_value == TMC26X_READOUT_STALLGUARD) - driver_configuration_register_value |= READ_STALL_GUARD_READING; - else if (read_value == TMC26X_READOUT_CURRENT) - driver_configuration_register_value |= READ_STALL_GUARD_AND_COOL_STEP; - - //all other cases are ignored to prevent funny values - //check if the readout is configured for the value we are interested in - if (driver_configuration_register_value != old_driver_configuration_register_value) { - //because then we need to write the value twice - one time for configuring, second time to get the value, see below - send262(driver_configuration_register_value); - } - //write the configuration to get the last status - send262(driver_configuration_register_value); -} - -int16_t TMC26XStepper::getMotorPosition() { - //we read it out even if we are not started yet - perhaps it is useful information for somebody - readStatus(TMC26X_READOUT_POSITION); - return getReadoutValue(); -} - -//reads the StallGuard setting from last status -//returns -1 if StallGuard information is not present -int16_t TMC26XStepper::getCurrentStallGuardReading() { - //if we don't yet started there cannot be a StallGuard value - if (!started) return -1; - //not time optimal, but solution optiomal: - //first read out the StallGuard value - readStatus(TMC26X_READOUT_STALLGUARD); - return getReadoutValue(); -} - -uint8_t TMC26XStepper::getCurrentCSReading() { - //if we don't yet started there cannot be a StallGuard value - if (!started) return 0; - //not time optimal, but solution optiomal: - //first read out the StallGuard value - readStatus(TMC26X_READOUT_CURRENT); - return (getReadoutValue() & 0x1F); -} - -uint16_t TMC26XStepper::getCurrentCurrent() { - float result = (float)getCurrentCSReading(), - resistor_value = (float)this->resistor, - voltage = (driver_configuration_register_value & VSENSE)? 0.165 : 0.31; - result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); - return (uint16_t)result; -} - -/** - * Return true if the StallGuard threshold has been reached - */ -boolean TMC26XStepper::isStallGuardOverThreshold() { - if (!this->started) return false; - return (driver_status_result & STATUS_STALL_GUARD_STATUS); -} - -/** - * returns if there is any over temperature condition: - * OVER_TEMPERATURE_PREWARING if pre warning level has been reached - * OVER_TEMPERATURE_SHUTDOWN if the temperature is so hot that the driver is shut down - * Any of those levels are not too good. - */ -char TMC26XStepper::getOverTemperature() { - if (!this->started) return 0; - - if (driver_status_result & STATUS_OVER_TEMPERATURE_SHUTDOWN) - return TMC26X_OVERTEMPERATURE_SHUTDOWN; - - if (driver_status_result & STATUS_OVER_TEMPERATURE_WARNING) - return TMC26X_OVERTEMPERATURE_PREWARING; - - return 0; -} - -// Is motor channel A shorted to ground -boolean TMC26XStepper::isShortToGroundA() { - if (!this->started) return false; - return (driver_status_result & STATUS_SHORT_TO_GROUND_A); -} - -// Is motor channel B shorted to ground -boolean TMC26XStepper::isShortToGroundB() { - if (!this->started) return false; - return (driver_status_result & STATUS_SHORT_TO_GROUND_B); -} - -// Is motor channel A connected -boolean TMC26XStepper::isOpenLoadA() { - if (!this->started) return false; - return (driver_status_result & STATUS_OPEN_LOAD_A); -} - -// Is motor channel B connected -boolean TMC26XStepper::isOpenLoadB() { - if (!this->started) return false; - return (driver_status_result & STATUS_OPEN_LOAD_B); -} - -// Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s -boolean TMC26XStepper::isStandStill() { - if (!this->started) return false; - return (driver_status_result & STATUS_STAND_STILL); -} - -//is chopper inactive since 2^20 clock cycles - defaults to ~0,08s -boolean TMC26XStepper::isStallGuardReached() { - if (!this->started) return false; - return (driver_status_result & STATUS_STALL_GUARD_STATUS); -} - -//reads the StallGuard setting from last status -//returns -1 if StallGuard information is not present -int16_t TMC26XStepper::getReadoutValue() { - return (int)(driver_status_result >> 10); -} - -int16_t TMC26XStepper::getResistor() { return this->resistor; } - -boolean TMC26XStepper::isCurrentScalingHalfed() { - return !!(this->driver_configuration_register_value & VSENSE); -} -/** - * version() returns the version of the library: - */ -int16_t TMC26XStepper::version() { return 1; } - -void TMC26XStepper::debugLastStatus() { - #ifdef TMC_DEBUG1 - if (this->started) { - if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_PREWARING) - SERIAL_ECHOLNPGM("\n WARNING: Overtemperature Prewarning!"); - else if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_SHUTDOWN) - SERIAL_ECHOLNPGM("\n ERROR: Overtemperature Shutdown!"); - - if (this->isShortToGroundA()) - SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel A!"); - - if (this->isShortToGroundB()) - SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel B!"); - - if (this->isOpenLoadA()) - SERIAL_ECHOLNPGM("\n ERROR: Channel A seems to be unconnected!"); - - if (this->isOpenLoadB()) - SERIAL_ECHOLNPGM("\n ERROR: Channel B seems to be unconnected!"); - - if (this->isStallGuardReached()) - SERIAL_ECHOLNPGM("\n INFO: Stall Guard level reached!"); - - if (this->isStandStill()) - SERIAL_ECHOLNPGM("\n INFO: Motor is standing still."); - - uint32_t readout_config = driver_configuration_register_value & READ_SELECTION_PATTERN; - const int16_t value = getReadoutValue(); - if (readout_config == READ_MICROSTEP_POSTION) { - SERIAL_ECHOPAIR("\n Microstep position phase A: ", value); - } - else if (readout_config == READ_STALL_GUARD_READING) { - SERIAL_ECHOPAIR("\n Stall Guard value:", value); - } - else if (readout_config == READ_STALL_GUARD_AND_COOL_STEP) { - SERIAL_ECHOPAIR("\n Approx Stall Guard: ", value & 0xF); - SERIAL_ECHOPAIR("\n Current level", value & 0x1F0); - } - } - #endif -} - -/** - * send register settings to the stepper driver via SPI - * returns the current status - */ -inline void TMC26XStepper::send262(uint32_t datagram) { - uint32_t i_datagram; - - //preserver the previous spi mode - //uint8_t oldMode = SPCR & SPI_MODE_MASK; - - //if the mode is not correct set it to mode 3 - //if (oldMode != SPI_MODE3) { - // SPI.setDataMode(SPI_MODE3); - //} - - //select the TMC driver - extDigitalWrite(cs_pin, LOW); - - //ensure that only valid bist are set (0-19) - //datagram &=REGISTER_BIT_PATTERN; - - #ifdef TMC_DEBUG1 - //SERIAL_PRINTF("Sending "); - //SERIAL_PRINTF("Sending ", datagram,HEX); - //SERIAL_ECHOPAIR("\n\nSending \n", print_hex_long(datagram)); - SERIAL_PRINTF("\n\nSending %x", datagram); - #endif - - //write/read the values - i_datagram = STEPPER_SPI.transfer((datagram >> 16) & 0xFF); - i_datagram <<= 8; - i_datagram |= STEPPER_SPI.transfer((datagram >> 8) & 0xFF); - i_datagram <<= 8; - i_datagram |= STEPPER_SPI.transfer((datagram) & 0xFF); - i_datagram >>= 4; - - #ifdef TMC_DEBUG1 - //SERIAL_PRINTF("Received "); - //SERIAL_PRINTF("Received ", i_datagram,HEX); - //SERIAL_ECHOPAIR("\n\nReceived \n", i_datagram); - SERIAL_PRINTF("\n\nReceived %x", i_datagram); - debugLastStatus(); - #endif - - //deselect the TMC chip - extDigitalWrite(cs_pin, HIGH); - - //restore the previous SPI mode if neccessary - //if the mode is not correct set it to mode 3 - //if (oldMode != SPI_MODE3) { - // SPI.setDataMode(oldMode); - //} - - //store the datagram as status result - driver_status_result = i_datagram; -} - -#endif // HAS_DRIVER(TMC2660) - -#endif // STM32GENERIC && STM32F7 diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h deleted file mode 100644 index 208c3bc7e0..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h +++ /dev/null @@ -1,593 +0,0 @@ -/** - * TMC26XStepper.h - - TMC26X Stepper library for Wiring/Arduino - * - * based on the stepper library by Tom Igoe, et. al. - * - * Copyright (c) 2011, Interactive Matter, Marcus Nowotny - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#pragma once - -#include - -//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature situation in the TMC chip -/*! - * This warning indicates that the TMC chip is too warm. - * It is still working but some parameters may be inferior. - * You should do something against it. - */ -#define TMC26X_OVERTEMPERATURE_PREWARING 1 -//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature shutdown in the TMC chip -/*! - * This warning indicates that the TMC chip is too warm to operate and has shut down to prevent damage. - * It will stop working until it cools down again. - * If you encouter this situation you must do something against it. Like reducing the current or improving the PCB layout - * and/or heat management. - */ -#define TMC26X_OVERTEMPERATURE_SHUTDOWN 2 - -//which values can be read out -/*! - * Selects to readout the microstep position from the motor. - *\sa readStatus() - */ -#define TMC26X_READOUT_POSITION 0 -/*! - * Selects to read out the StallGuard value of the motor. - *\sa readStatus() - */ -#define TMC26X_READOUT_STALLGUARD 1 -/*! - * Selects to read out the current current setting (acc. to CoolStep) and the upper bits of the StallGuard value from the motor. - *\sa readStatus(), setCurrent() - */ -#define TMC26X_READOUT_CURRENT 3 - -/*! - * Define to set the minimum current for CoolStep operation to 1/2 of the selected CS minium. - *\sa setCoolStepConfiguration() - */ -#define COOL_STEP_HALF_CS_LIMIT 0 -/*! - * Define to set the minimum current for CoolStep operation to 1/4 of the selected CS minium. - *\sa setCoolStepConfiguration() - */ -#define COOL_STEP_QUARTDER_CS_LIMIT 1 - -/*! - * \class TMC26XStepper - * \brief Class representing a TMC26X stepper driver - * - * To use one of these drivers in your code create an object of its class: - * \code - * TMC26XStepper tmc_stepper = TMC26XStepper(200,1,2,3,500); - * \endcode - * see TMC26XStepper(int16_t number_of_steps, int16_t cs_pin, int16_t dir_pin, int16_t step_pin, uint16_t rms_current) - * - * Keep in mind that you need to start the driver with start() in order to configure the TMC26X. - * - * The most important function is move(). It checks if the motor requires a step. It's important to call move() as - * often as possible in loop(). I suggest using a very fast loop routine and always call move() at the beginning or end. - * - * To move you must set a movement speed with setSpeed(). The speed is a positive value, setting the RPM. - * - * To really move the motor you have to call step() to tell the driver to move the motor the given number - * of steps in the given direction. Positive values move the motor in one direction, negative values in the other. - * - * You can check with isMoving() if the motor is still moving or stop it abruptly with stop(). - */ -class TMC26XStepper { - public: - /*! - * \brief Create a new representation of a stepper motor connected to a TMC26X stepper driver - * - * Main constructor. If in doubt use this. All parameters must be provided as described below. - * - * \param number_of_steps Number of steps the motor has per rotation. - * \param cs_pin Arduino pin connected to the Client Select Pin (!CS) of the TMC26X for SPI. - * \param dir_pin Arduino pin connected to the DIR input of the TMC26X. - * \param step_pin Arduino pin connected to the STEP pin of the TMC26X. - * \param rms_current Maximum current to provide to the motor in mA (!). A value of 200 will send up to 200mA to the motor. - * \param resistor Current sense resistor in milli-Ohm, defaults to 0.15 Ohm (or 150 milli-Ohm) as in the TMC260 Arduino Shield. - * - * You must also call TMC26XStepper.start() to configure the stepper driver for use. - * - * By default the Constant Off Time chopper is used. See TMC26XStepper.setConstantOffTimeChopper() for details. - * This should work on most motors (YMMV). You may want to configure and use the Spread Cycle Chopper. See setSpreadCycleChopper(). - * - * By default a microstepping of 1/32 is used to provide a smooth motor run while still giving a good progression per step. - * Change stepping by sending setMicrosteps() a different value. - * \sa start(), setMicrosteps() - */ - TMC26XStepper(const int16_t in_steps, int16_t cs_pin, int16_t dir_pin, int16_t step_pin, uint16_t current, uint16_t resistor=100); //resistor=150 - - /*! - * \brief Configure and start the TMC26X stepper driver. Before this is called the stepper driver is nonfunctional. - * - * Configure the TMC26X stepper driver for the given values via SPI. - * Most member functions are non-functional if the driver has not been started, - * therefore it is best to call this in setup(). - */ - void start(); - - /*! - * \brief Reset the stepper in unconfigured mode. - * - * Allows start to be called again. It doesn't change the internal stepper - * configuration or the desired configuration. It just marks the stepper as - * not-yet-started. The stepper doesn't need to be reconfigured before - * starting again, and is not reset to any factory settings. - * It must be reset intentionally. - * (Hint: Normally you do not need this function) - */ - void un_start(); - - /*! - * \brief Set the rotation speed in RPM. - * \param whatSpeed the desired speed in RPM. - */ - void setSpeed(uint16_t whatSpeed); - - /*! - * \brief Report the currently selected speed in RPM. - * \sa setSpeed() - */ - uint16_t getSpeed(); - - /*! - * \brief Set the number of microsteps in 2^i values (rounded) up to 256 - * - * This method sets the number of microsteps per step in 2^i interval. - * It accepts 1, 2, 4, 16, 32, 64, 128 or 256 as valid microsteps. - * Other values will be rounded down to the next smaller value (e.g., 3 gives a microstepping of 2). - * You can always check the current microstepping with getMicrosteps(). - */ - void setMicrosteps(const int16_t in_steps); - - /*! - * \brief Return the effective current number of microsteps selected. - * - * Always returns the effective number of microsteps. - * This may be different from the micro-steps set in setMicrosteps() since it is rounded to 2^i. - * - * \sa setMicrosteps() - */ - int16_t getMicrosteps(); - - /*! - * \brief Initiate a movement with the given number of steps. Positive values move in one direction, negative in the other. - * - * \param number_of_steps The number of steps to move the motor. - * \return 0 if the motor was not moving and moves now. -1 if the motor is moving and the new steps could not be set. - * - * If the previous movement is incomplete the function returns -1 and doesn't change the steps to move the motor. - * If the motor does not move it returns 0. - * - * The movement direction is determined by the sign of the steps parameter. The motor direction in machine space - * cannot be determined, as it depends on the construction of the motor and how it functions in the drive system. - * - * For safety, verify with isMoving() or even use stop() to stop the motor before giving it new step directions. - * \sa isMoving(), getStepsLeft(), stop() - */ - char step(int16_t number_of_steps); - - /*! - * \brief Central movement method. Must be called as often as possible in the loop function and is very fast. - * - * Check if the motor still has to move and whether the wait-to-step interval has expired, and manages the - * number of steps remaining to fulfill the current move command. - * - * This function is implemented to be as fast as possible, so call it as often as possible in your loop. - * It should be invoked with as frequently and with as much regularity as possible. - * - * This can be called even when the motor is known not to be moving. It will simply return. - * - * The frequency with which this function is called determines the top stepping speed of the motor. - * It is recommended to call this using a hardware timer to ensure regular invocation. - * \sa step() - */ - char move(); - - /*! - * \brief Check whether the last movement command is done. - * \return 0 if the motor stops, -1 if the motor is moving. - * - * Used to determine if the motor is ready for new movements. - *\sa step(), move() - */ - char isMoving(); - - /*! - * \brief Get the number of steps left in the current movement. - * \return The number of steps left in the movement. Always positive. - */ - uint16_t getStepsLeft(); - - /*! - * \brief Stop the motor immediately. - * \return -1 if the motor was moving and is really stoped or 0 if it was not moving at all. - * - * This method directly and abruptly stops the motor and may be used as an emergency stop. - */ - char stop(); - - /*! - * \brief Set and configure the classical Constant Off Timer Chopper - * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) - * \param blank_time Comparator blank time. This duration needs to safely cover the duration of the switching event and the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting - * \param fast_decay_time_setting Fast decay time setting. Controls the portion of fast decay for each chopper cycle. 0: slow decay only, 1…15: duration of fast decay phase - * \param sine_wave_offset Sine wave offset. Controls the sine wave offset. A positive offset corrects for zero crossing error. -3…-1: negative offset, 0: no offset,1…12: positive offset - * \param use_curreent_comparator Selects usage of the current comparator for termination of the fast decay cycle. If current comparator is enabled, it terminates the fast decay cycle in case the current reaches a higher negative value than the actual positive value. (0 disable, -1 enable). - * - * The classic constant off time chopper uses a fixed portion of fast decay following each on phase. - * While the duration of the on time is determined by the chopper comparator, the fast decay time needs - * to be set by the user in a way, that the current decay is enough for the driver to be able to follow - * the falling slope of the sine wave, and on the other hand it should not be too long, in order to minimize - * motor current ripple and power dissipation. This best can be tuned using an oscilloscope or - * trying out motor smoothness at different velocities. A good starting value is a fast decay time setting - * similar to the slow decay time setting. - * After tuning of the fast decay time, the offset should be determined, in order to have a smooth zero transition. - * This is necessary, because the fast decay phase leads to the absolute value of the motor current being lower - * than the target current (see figure 17). If the zero offset is too low, the motor stands still for a short - * moment during current zero crossing, if it is set too high, it makes a larger microstep. - * Typically, a positive offset setting is required for optimum operation. - * - * \sa setSpreadCycleChoper() for other alternatives. - * \sa setRandomOffTime() for spreading the noise over a wider spectrum - */ - void setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, uint8_t use_current_comparator); - - /*! - * \brief Sets and configures with spread cycle chopper. - * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) - * \param blank_time Selects the comparator blank time. This time needs to safely cover the switching event and the duration of the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting - * \param hysteresis_start Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value. 1 … 8 - * \param hysteresis_end Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by hysteresis_decrement. The sum hysteresis_start + hysteresis_end must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. - * \param hysteresis_decrement Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. 0 (fast decrement) … 3 (slow decrement). - * - * The spreadCycle chopper scheme (pat.fil.) is a precise and simple to use chopper principle, which automatically determines - * the optimum fast decay portion for the motor. Anyhow, a number of settings can be made in order to optimally fit the driver - * to the motor. - * Each chopper cycle is comprised of an on-phase, a slow decay phase, a fast decay phase and a second slow decay phase. - * The slow decay phases limit the maximum chopper frequency and are important for low motor and driver power dissipation. - * The hysteresis start setting limits the chopper frequency by forcing the driver to introduce a minimum amount of - * current ripple into the motor coils. The motor inductivity determines the ability to follow a changing motor current. - * The duration of the on- and fast decay phase needs to cover at least the blank time, because the current comparator is - * disabled during this time. - * - * \sa setRandomOffTime() for spreading the noise over a wider spectrum - */ - void setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement); - - /*! - * \brief Use random off time for noise reduction (0 for off, -1 for on). - * \param value 0 for off, -1 for on - * - * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. - * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, - * thus it depends on the microstep position. With some motors a slightly audible beat can occur between the chopper - * frequencies, especially when they are near to each other. This typically occurs at a few microstep positions within - * each quarter wave. - * This effect normally is not audible when compared to mechanical noise generated by ball bearings, - * etc. Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. - * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. - * It modulates the slow decay time setting when switched on. The random off time feature further spreads the chopper spectrum, - * reducing electromagnetic emission on single frequencies. - */ - void setRandomOffTime(char value); - - /*! - * \brief set the maximum motor current in mA (1000 is 1 Amp) - * Keep in mind this is the maximum peak Current. The RMS current will be 1/sqrt(2) smaller. The actual current can also be smaller - * by employing CoolStep. - * \param current the maximum motor current in mA - * \sa getCurrent(), getCurrentCurrent() - */ - void setCurrent(uint16_t current); - - /*! - * \brief readout the motor maximum current in mA (1000 is an Amp) - * This is the maximum current. to get the current current - which may be affected by CoolStep us getCurrentCurrent() - * \return the maximum motor current in milli amps - * \sa getCurrentCurrent() - */ - uint16_t getCurrent(); - - /*! - * \brief set the StallGuard threshold in order to get sensible StallGuard readings. - * \param stallguard_threshold -64 … 63 the StallGuard threshold - * \param stallguard_filter_enabled 0 if the filter is disabled, -1 if it is enabled - * - * The StallGuard threshold is used to optimize the StallGuard reading to sensible values. It should be at 0 at - * the maximum allowable load on the otor (but not before). = is a good starting point (and the default) - * If you get Stall Gaurd readings of 0 without any load or with too little laod increase the value. - * If you get readings of 1023 even with load decrease the setting. - * - * If you switch on the filter the StallGuard reading is only updated each 4th full step to reduce the noise in the - * reading. - * - * \sa getCurrentStallGuardReading() to read out the current value. - */ - void setStallGuardThreshold(char stallguard_threshold, char stallguard_filter_enabled); - - /*! - * \brief reads out the StallGuard threshold - * \return a number between -64 and 63. - */ - char getStallGuardThreshold(); - - /*! - * \brief returns the current setting of the StallGuard filter - * \return 0 if not set, -1 if set - */ - char getStallGuardFilter(); - - /*! - * \brief This method configures the CoolStep smart energy operation. You must have a proper StallGuard configuration for the motor situation (current, voltage, speed) in rder to use this feature. - * \param lower_SG_threshold Sets the lower threshold for stallGuard2TM reading. Below this value, the motor current becomes increased. Allowed values are 0...480 - * \param SG_hysteresis Sets the distance between the lower and the upper threshold for stallGuard2TM reading. Above the upper threshold (which is lower_SG_threshold+SG_hysteresis+1) the motor current becomes decreased. Allowed values are 0...480 - * \param current_decrement_step_size Sets the current decrement steps. If the StallGuard value is above the threshold the current gets decremented by this step size. 0...32 - * \param current_increment_step_size Sets the current increment step. The current becomes incremented for each measured stallGuard2TM value below the lower threshold. 0...8 - * \param lower_current_limit Sets the lower motor current limit for coolStepTM operation by scaling the CS value. Values can be COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT - * The CoolStep smart energy operation automatically adjust the current sent into the motor according to the current load, - * read out by the StallGuard in order to provide the optimum torque with the minimal current consumption. - * You configure the CoolStep current regulator by defining upper and lower bounds of StallGuard readouts. If the readout is above the - * limit the current gets increased, below the limit the current gets decreased. - * You can specify the upper an lower threshold of the StallGuard readout in order to adjust the current. You can also set the number of - * StallGuard readings neccessary above or below the limit to get a more stable current adjustement. - * The current adjustement itself is configured by the number of steps the current gests in- or decreased and the absolut minimum current - * (1/2 or 1/4th otf the configured current). - * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT - */ - void setCoolStepConfiguration(uint16_t lower_SG_threshold, uint16_t SG_hysteresis, uint8_t current_decrement_step_size, - uint8_t current_increment_step_size, uint8_t lower_current_limit); - - /*! - * \brief enables or disables the CoolStep smart energy operation feature. It must be configured before enabling it. - * \param enabled true if CoolStep should be enabled, false if not. - * \sa setCoolStepConfiguration() - */ - void setCoolStepEnabled(boolean enabled); - - - /*! - * \brief check if the CoolStep feature is enabled - * \sa setCoolStepEnabled() - */ - boolean isCoolStepEnabled(); - - /*! - * \brief returns the lower StallGuard threshold for the CoolStep operation - * \sa setCoolStepConfiguration() - */ - uint16_t getCoolStepLowerSgThreshold(); - - /*! - * \brief returns the upper StallGuard threshold for the CoolStep operation - * \sa setCoolStepConfiguration() - */ - uint16_t getCoolStepUpperSgThreshold(); - - /*! - * \brief returns the number of StallGuard readings befor CoolStep adjusts the motor current. - * \sa setCoolStepConfiguration() - */ - uint8_t getCoolStepNumberOfSGReadings(); - - /*! - * \brief returns the increment steps for the current for the CoolStep operation - * \sa setCoolStepConfiguration() - */ - uint8_t getCoolStepCurrentIncrementSize(); - - /*! - * \brief returns the absolut minium current for the CoolStep operation - * \sa setCoolStepConfiguration() - * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT - */ - uint8_t getCoolStepLowerCurrentLimit(); - - /*! - * \brief Get the current microstep position for phase A - * \return The current microstep position for phase A 0…255 - * - * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. - */ - int16_t getMotorPosition(); - - /*! - * \brief Reads the current StallGuard value. - * \return The current StallGuard value, lesser values indicate higher load, 0 means stall detected. - * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. - * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. - */ - int16_t getCurrentStallGuardReading(); - - /*! - * \brief Reads the current current setting value as fraction of the maximum current - * Returns values between 0 and 31, representing 1/32 to 32/32 (=1) - * \sa setCoolStepConfiguration() - */ - uint8_t getCurrentCSReading(); - - - /*! - *\brief a convenience method to determine if the current scaling uses 0.31V or 0.165V as reference. - *\return false if 0.13V is the reference voltage, true if 0.165V is used. - */ - boolean isCurrentScalingHalfed(); - - /*! - * \brief Reads the current current setting value and recalculates the absolute current in mA (1A would be 1000). - * This method calculates the currently used current setting (either by setting or by CoolStep) and reconstructs - * the current in mA by usinge the VSENSE and resistor value. This method uses floating point math - so it - * may not be the fastest. - * \sa getCurrentCSReading(), getResistor(), isCurrentScalingHalfed(), getCurrent() - */ - uint16_t getCurrentCurrent(); - - /*! - * \brief checks if there is a StallGuard warning in the last status - * \return 0 if there was no warning, -1 if there was some warning. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - * - * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. - */ - boolean isStallGuardOverThreshold(); - - /*! - * \brief Return over temperature status of the last status readout - * return 0 is everything is OK, TMC26X_OVERTEMPERATURE_PREWARING if status is reached, TMC26X_OVERTEMPERATURE_SHUTDOWN is the chip is shutdown, -1 if the status is unknown. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - char getOverTemperature(); - - /*! - * \brief Is motor channel A shorted to ground detected in the last status readout. - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - - boolean isShortToGroundA(); - - /*! - * \brief Is motor channel B shorted to ground detected in the last status readout. - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - boolean isShortToGroundB(); - /*! - * \brief iIs motor channel A connected according to the last statu readout. - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - boolean isOpenLoadA(); - - /*! - * \brief iIs motor channel A connected according to the last statu readout. - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - boolean isOpenLoadB(); - - /*! - * \brief Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s - * \return true is yes, false if not. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - */ - boolean isStandStill(); - - /*! - * \brief checks if there is a StallGuard warning in the last status - * \return 0 if there was no warning, -1 if there was some warning. - * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. - * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. - * - * \sa isStallGuardOverThreshold() - * TODO why? - * - * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. - */ - boolean isStallGuardReached(); - - /*! - *\brief enables or disables the motor driver bridges. If disabled the motor can run freely. If enabled not. - *\param enabled a boolean value true if the motor should be enabled, false otherwise. - */ - void setEnabled(boolean enabled); - - /*! - *\brief checks if the output bridges are enabled. If the bridges are not enabled the motor can run freely - *\return true if the bridges and by that the motor driver are enabled, false if not. - *\sa setEnabled() - */ - boolean isEnabled(); - - /*! - * \brief Manually read out the status register - * This function sends a byte to the motor driver in order to get the current readout. The parameter read_value - * seletcs which value will get returned. If the read_vlaue changes in respect to the previous readout this method - * automatically send two bytes to the motor: one to set the redout and one to get the actual readout. So this method - * may take time to send and read one or two bits - depending on the previous readout. - * \param read_value selects which value to read out (0..3). You can use the defines TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, or TMC_262_READOUT_CURRENT - * \sa TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, TMC_262_READOUT_CURRENT - */ - void readStatus(char read_value); - - /*! - * \brief Returns the current sense resistor value in milliohm. - * The default value of ,15 Ohm will return 150. - */ - int16_t getResistor(); - - /*! - * \brief Prints out all the information that can be found in the last status read out - it does not force a status readout. - * The result is printed via Serial - */ - void debugLastStatus(); - - /*! - * \brief library version - * \return the version number as int. - */ - int16_t version(); - - private: - uint16_t steps_left; // The steps the motor has to do to complete the movement - int16_t direction; // Direction of rotation - uint32_t step_delay; // Delay between steps, in ms, based on speed - int16_t number_of_steps; // Total number of steps this motor can take - uint16_t speed; // Store the current speed in order to change the speed after changing microstepping - uint16_t resistor; // Current sense resitor value in milliohm - - uint32_t last_step_time, // Timestamp (ms) of the last step - next_step_time; // Timestamp (ms) of the next step - - // Driver control register copies to easily set & modify the registers - uint32_t driver_control_register_value, - chopper_config_register, - cool_step_register_value, - stallguard2_current_register_value, - driver_configuration_register_value, - driver_status_result; // The driver status result - - // Helper routione to get the top 10 bit of the readout - inline int16_t getReadoutValue(); - - // The pins for the stepper driver - uint8_t cs_pin, step_pin, dir_pin; - - // Status values - boolean started; // If the stepper has been started yet - int16_t microsteps; // The current number of micro steps - char constant_off_time; // We need to remember this value in order to enable and disable the motor - uint8_t cool_step_lower_threshold; // we need to remember the threshold to enable and disable the CoolStep feature - boolean cool_step_enabled; // We need to remember this to configure the coolstep if it si enabled - - // SPI sender - inline void send262(uint32_t datagram); -}; diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp deleted file mode 100644 index f7ded7454d..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && defined(STM32F7) - -#include "../../../inc/MarlinConfig.h" - -// ------------------------ -// Local defines -// ------------------------ - -#define NUM_HARDWARE_TIMERS 2 - -//#define PRESCALER 1 - -// ------------------------ -// Private Variables -// ------------------------ - -tTimerConfig timerConfig[NUM_HARDWARE_TIMERS]; - -// ------------------------ -// Public functions -// ------------------------ - -bool timers_initialized[NUM_HARDWARE_TIMERS] = { false }; - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - - if (!timers_initialized[timer_num]) { - switch (timer_num) { - case STEP_TIMER_NUM: - //STEPPER TIMER TIM5 //use a 32bit timer - __HAL_RCC_TIM5_CLK_ENABLE(); - timerConfig[0].timerdef.Instance = TIM5; - timerConfig[0].timerdef.Init.Prescaler = (STEPPER_TIMER_PRESCALE); - timerConfig[0].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; - timerConfig[0].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - timerConfig[0].IRQ_Id = TIM5_IRQn; - timerConfig[0].callback = (uint32_t)TC5_Handler; - HAL_NVIC_SetPriority(timerConfig[0].IRQ_Id, 1, 0); - #if PIN_EXISTS(STEPPER_ENABLE) - OUT_WRITE(STEPPER_ENABLE_PIN, HIGH); - #endif - break; - case TEMP_TIMER_NUM: - //TEMP TIMER TIM7 // any available 16bit Timer (1 already used for PWM) - __HAL_RCC_TIM7_CLK_ENABLE(); - timerConfig[1].timerdef.Instance = TIM7; - timerConfig[1].timerdef.Init.Prescaler = (TEMP_TIMER_PRESCALE); - timerConfig[1].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; - timerConfig[1].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - timerConfig[1].IRQ_Id = TIM7_IRQn; - timerConfig[1].callback = (uint32_t)TC7_Handler; - HAL_NVIC_SetPriority(timerConfig[1].IRQ_Id, 2, 0); - break; - } - timers_initialized[timer_num] = true; - } - - timerConfig[timer_num].timerdef.Init.Period = (((HAL_TIMER_RATE) / timerConfig[timer_num].timerdef.Init.Prescaler) / frequency) - 1; - - if (HAL_TIM_Base_Init(&timerConfig[timer_num].timerdef) == HAL_OK) - HAL_TIM_Base_Start_IT(&timerConfig[timer_num].timerdef); -} - -//forward the interrupt -extern "C" void TIM5_IRQHandler() { - ((void(*)())timerConfig[0].callback)(); -} -extern "C" void TIM7_IRQHandler() { - ((void(*)())timerConfig[1].callback)(); -} - -void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { - __HAL_TIM_SetAutoreload(&timerConfig[timer_num].timerdef, compare); -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - HAL_NVIC_EnableIRQ(timerConfig[timer_num].IRQ_Id); -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - HAL_NVIC_DisableIRQ(timerConfig[timer_num].IRQ_Id); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); -} - -hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - return __HAL_TIM_GetAutoreload(&timerConfig[timer_num].timerdef); -} - -uint32_t HAL_timer_get_count(const uint8_t timer_num) { - return __HAL_TIM_GetCounter(&timerConfig[timer_num].timerdef); -} - -void HAL_timer_isr_prologue(const uint8_t timer_num) { - if (__HAL_TIM_GET_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE) == SET) { - __HAL_TIM_CLEAR_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE); - } -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - const uint32_t IRQ_Id = uint32_t(timerConfig[timer_num].IRQ_Id); - return NVIC->ISER[IRQ_Id >> 5] & _BV32(IRQ_Id & 0x1F); -} - -#endif // STM32GENERIC && STM32F7 diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h deleted file mode 100644 index d2f78259d6..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? -#define HAL_TIMER_TYPE_MAX 0xFFFF - -#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif - -#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency -#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz - -#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz -#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) -#define TEMP_ISR_ENABLED() HAL_timer_interrupt_enabled(TEMP_TIMER_NUM) - -// TODO change this - -extern void TC5_Handler(); -extern void TC7_Handler(); -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() void TC5_Handler() -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() void TC7_Handler() -#endif - -// ------------------------ -// Types -// ------------------------ - -typedef struct { - TIM_HandleTypeDef timerdef; - IRQn_Type IRQ_Id; - uint32_t callback; -} tTimerConfig; - -// ------------------------ -// Public Variables -// ------------------------ - -//extern const tTimerConfig timerConfig[]; - -// ------------------------ -// Public functions -// ------------------------ - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare); -hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); -uint32_t HAL_timer_get_count(const uint8_t timer_num); -void HAL_timer_isr_prologue(const uint8_t timer_num); -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/STM32_F4_F7/Servo.cpp b/Marlin/src/HAL/STM32_F4_F7/Servo.cpp deleted file mode 100644 index 7185468f50..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/Servo.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include "Servo.h" - -int8_t libServo::attach(const int pin) { - if (servoIndex >= MAX_SERVOS) return -1; - return super::attach(pin); -} - -int8_t libServo::attach(const int pin, const int min, const int max) { - return super::attach(pin, min, max); -} - -void libServo::move(const int value) { - constexpr uint16_t servo_delay[] = SERVO_DELAY; - static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - if (attach(0) >= 0) { - write(value); - safe_delay(servo_delay[servoIndex]); - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); - } -} - -#endif // HAS_SERVOS -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/Servo.h b/Marlin/src/HAL/STM32_F4_F7/Servo.h deleted file mode 100644 index e42cc60840..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/Servo.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//#ifdef STM32F7 -// #include <../../libraries/Servo/src/Servo.h> -//#else - #include -//#endif - -// Inherit and expand on the official library -class libServo : public Servo { - public: - int8_t attach(const int pin); - int8_t attach(const int pin, const int min, const int max); - void move(const int value); - private: - typedef Servo super; - uint16_t min_ticks, max_ticks; - uint8_t servoIndex; // index into the channel data for this servo -}; diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp deleted file mode 100644 index e0726c7cd5..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp +++ /dev/null @@ -1,535 +0,0 @@ -/** - ****************************************************************************** - * @file eeprom_emul.cpp - * @author MCD Application Team - * @version V1.2.6 - * @date 04-November-2016 - * @brief This file provides all the EEPROM emulation firmware functions. - ****************************************************************************** - * @attention - * - * Copyright © 2016 STMicroelectronics International N.V. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted, provided that the following conditions are met: - * - * 1. Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific written permission. - * 4. This software, including modifications and/or derivative works of this - * software, must execute solely and exclusively on microcontroller or - * microprocessor devices manufactured by or for STMicroelectronics. - * 5. Redistribution and use of this software other than as permitted under - * this license is void and will automatically terminate your rights under - * this license. - * - * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY - * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT - * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/** @addtogroup EEPROM_Emulation - * @{ - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(FLASH_EEPROM_EMULATION) - -/* Includes ------------------------------------------------------------------*/ -#include "eeprom_emul.h" - -/* Private variables ---------------------------------------------------------*/ - -/* Global variable used to store variable value in read sequence */ -uint16_t DataVar = 0; - -/* Virtual address defined by the user: 0xFFFF value is prohibited */ -uint16_t VirtAddVarTab[NB_OF_VAR]; - -/* Private function prototypes -----------------------------------------------*/ - -static HAL_StatusTypeDef EE_Format(); -static uint16_t EE_FindValidPage(uint8_t Operation); -static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data); -static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data); -static uint16_t EE_VerifyPageFullyErased(uint32_t Address); - - /** - * @brief Restore the pages to a known good state in case of page's status - * corruption after a power loss. - * @param None. - * @retval - Flash error code: on write Flash error - * - FLASH_COMPLETE: on success - */ - -/* Private functions ---------------------------------------------------------*/ - -uint16_t EE_Initialize() { - /* Get Page0 and Page1 status */ - uint16_t PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS), - PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); - - FLASH_EraseInitTypeDef pEraseInit; - pEraseInit.TypeErase = TYPEERASE_SECTORS; - pEraseInit.Sector = PAGE0_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - - HAL_StatusTypeDef FlashStatus; // = HAL_OK - - /* Check for invalid header states and repair if necessary */ - uint32_t SectorError; - switch (PageStatus0) { - case ERASED: - if (PageStatus1 == VALID_PAGE) { /* Page0 erased, Page1 valid */ - /* Erase Page0 */ - if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { - /* As the last operation, simply return the result */ - return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - } - } - else if (PageStatus1 == RECEIVE_DATA) { /* Page0 erased, Page1 receive */ - /* Erase Page0 */ - if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { - HAL_StatusTypeDef fStat = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (fStat != HAL_OK) return fStat; - } - /* Mark Page1 as valid */ - /* As the last operation, simply return the result */ - return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); - } - else { /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */ - /* Erase both Page0 and Page1 and set Page0 as valid page */ - /* As the last operation, simply return the result */ - return EE_Format(); - } - break; - - case RECEIVE_DATA: - if (PageStatus1 == VALID_PAGE) { /* Page0 receive, Page1 valid */ - /* Transfer data from Page1 to Page0 */ - int16_t x = -1; - for (uint16_t VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { - if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) - x = VarIdx; - if (VarIdx != x) { - /* Read the last variables' updates */ - uint16_t ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); - /* In case variable corresponding to the virtual address was found */ - if (ReadStatus != 0x1) { - /* Transfer the variable to the Page0 */ - uint16_t EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); - /* If program operation was failed, a Flash error code is returned */ - if (EepromStatus != HAL_OK) return EepromStatus; - } - } - } - /* Mark Page0 as valid */ - FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - pEraseInit.Sector = PAGE1_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - /* Erase Page1 */ - if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { - /* As the last operation, simply return the result */ - return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - } - } - else if (PageStatus1 == ERASED) { /* Page0 receive, Page1 erased */ - pEraseInit.Sector = PAGE1_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - /* Erase Page1 */ - if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { - HAL_StatusTypeDef fStat = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (fStat != HAL_OK) return fStat; - } - /* Mark Page0 as valid */ - /* As the last operation, simply return the result */ - return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); - } - else { /* Invalid state -> format eeprom */ - /* Erase both Page0 and Page1 and set Page0 as valid page */ - /* As the last operation, simply return the result */ - return EE_Format(); - } - break; - - case VALID_PAGE: - if (PageStatus1 == VALID_PAGE) { /* Invalid state -> format eeprom */ - /* Erase both Page0 and Page1 and set Page0 as valid page */ - FlashStatus = EE_Format(); - /* If erase/program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - } - else if (PageStatus1 == ERASED) { /* Page0 valid, Page1 erased */ - pEraseInit.Sector = PAGE1_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - /* Erase Page1 */ - if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { - FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - } - } - else { /* Page0 valid, Page1 receive */ - /* Transfer data from Page0 to Page1 */ - int16_t x = -1; - for (uint16_t VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { - if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) - x = VarIdx; - - if (VarIdx != x) { - /* Read the last variables' updates */ - uint16_t ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); - /* In case variable corresponding to the virtual address was found */ - if (ReadStatus != 0x1) { - /* Transfer the variable to the Page1 */ - uint16_t EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); - /* If program operation was failed, a Flash error code is returned */ - if (EepromStatus != HAL_OK) return EepromStatus; - } - } - } - /* Mark Page1 as valid */ - FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - pEraseInit.Sector = PAGE0_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - /* Erase Page0 */ - if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { - /* As the last operation, simply return the result */ - return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - } - } - break; - - default: /* Any other state -> format eeprom */ - /* Erase both Page0 and Page1 and set Page0 as valid page */ - /* As the last operation, simply return the result */ - return EE_Format(); - } - - return HAL_OK; -} - -/** - * @brief Verify if specified page is fully erased. - * @param Address: page address - * This parameter can be one of the following values: - * @arg PAGE0_BASE_ADDRESS: Page0 base address - * @arg PAGE1_BASE_ADDRESS: Page1 base address - * @retval page fully erased status: - * - 0: if Page not erased - * - 1: if Page erased - */ -uint16_t EE_VerifyPageFullyErased(uint32_t Address) { - uint32_t ReadStatus = 1; - /* Check each active page address starting from end */ - while (Address <= PAGE0_END_ADDRESS) { - /* Get the current location content to be compared with virtual address */ - uint16_t AddressValue = (*(__IO uint16_t*)Address); - /* Compare the read address with the virtual address */ - if (AddressValue != ERASED) { - /* In case variable value is read, reset ReadStatus flag */ - ReadStatus = 0; - break; - } - /* Next address location */ - Address += 4; - } - /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */ - return ReadStatus; -} - -/** - * @brief Returns the last stored variable data, if found, which correspond to - * the passed virtual address - * @param VirtAddress: Variable virtual address - * @param Data: Global variable contains the read variable value - * @retval Success or error status: - * - 0: if variable was found - * - 1: if the variable was not found - * - NO_VALID_PAGE: if no valid page was found. - */ -uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) { - uint16_t ReadStatus = 1; - - /* Get active Page for read operation */ - uint16_t ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); - - /* Check if there is no valid page */ - if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; - - /* Get the valid Page start and end Addresses */ - uint32_t PageStartAddress = uint32_t(EEPROM_START_ADDRESS) + uint32_t(ValidPage * (PAGE_SIZE)), - Address = PageStartAddress + PAGE_SIZE - 2; - - /* Check each active page address starting from end */ - while (Address > PageStartAddress + 2) { - /* Get the current location content to be compared with virtual address */ - uint16_t AddressValue = (*(__IO uint16_t*)Address); - - /* Compare the read address with the virtual address */ - if (AddressValue == VirtAddress) { - /* Get content of Address-2 which is variable value */ - *Data = (*(__IO uint16_t*)(Address - 2)); - /* In case variable value is read, reset ReadStatus flag */ - ReadStatus = 0; - break; - } - else /* Next address location */ - Address -= 4; - } - /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */ - return ReadStatus; -} - -/** - * @brief Writes/upadtes variable data in EEPROM. - * @param VirtAddress: Variable virtual address - * @param Data: 16 bit data to be written - * @retval Success or error status: - * - FLASH_COMPLETE: on success - * - PAGE_FULL: if valid page is full - * - NO_VALID_PAGE: if no valid page was found - * - Flash error code: on write Flash error - */ -uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data) { - /* Write the variable virtual address and value in the EEPROM */ - uint16_t Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data); - - /* In case the EEPROM active page is full */ - if (Status == PAGE_FULL) /* Perform Page transfer */ - Status = EE_PageTransfer(VirtAddress, Data); - - /* Return last operation status */ - return Status; -} - -/** - * @brief Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE - * @param None - * @retval Status of the last operation (Flash write or erase) done during - * EEPROM formatting - */ -static HAL_StatusTypeDef EE_Format() { - FLASH_EraseInitTypeDef pEraseInit; - pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; - pEraseInit.Sector = PAGE0_ID; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - - HAL_StatusTypeDef FlashStatus; // = HAL_OK - - /* Erase Page0 */ - if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { - uint32_t SectorError; - FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - } - /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */ - FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - - pEraseInit.Sector = PAGE1_ID; - /* Erase Page1 */ - if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { - /* As the last operation, just return the result code */ - uint32_t SectorError; - return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - } - - return HAL_OK; -} - -/** - * @brief Find valid Page for write or read operation - * @param Operation: operation to achieve on the valid page. - * This parameter can be one of the following values: - * @arg READ_FROM_VALID_PAGE: read operation from valid page - * @arg WRITE_IN_VALID_PAGE: write operation from valid page - * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case - * of no valid page was found - */ -static uint16_t EE_FindValidPage(uint8_t Operation) { - /* Get Page0 and Page1 actual status */ - uint16_t PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS), - PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); - - /* Write or read operation */ - switch (Operation) { - case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */ - if (PageStatus1 == VALID_PAGE) { - /* Page0 receiving data */ - return (PageStatus0 == RECEIVE_DATA) ? PAGE0 : PAGE1; - } - else if (PageStatus0 == VALID_PAGE) { - /* Page1 receiving data */ - return (PageStatus1 == RECEIVE_DATA) ? PAGE1 : PAGE0; - } - else - return NO_VALID_PAGE; /* No valid Page */ - - case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */ - if (PageStatus0 == VALID_PAGE) - return PAGE0; /* Page0 valid */ - else if (PageStatus1 == VALID_PAGE) - return PAGE1; /* Page1 valid */ - else - return NO_VALID_PAGE; /* No valid Page */ - - default: - return PAGE0; /* Page0 valid */ - } -} - -/** - * @brief Verify if active page is full and Writes variable in EEPROM. - * @param VirtAddress: 16 bit virtual address of the variable - * @param Data: 16 bit data to be written as variable value - * @retval Success or error status: - * - FLASH_COMPLETE: on success - * - PAGE_FULL: if valid page is full - * - NO_VALID_PAGE: if no valid page was found - * - Flash error code: on write Flash error - */ -static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data) { - /* Get valid Page for write operation */ - uint16_t ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE); - - /* Check if there is no valid page */ - if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; - - /* Get the valid Page start and end Addresses */ - uint32_t Address = uint32_t(EEPROM_START_ADDRESS) + uint32_t(ValidPage * (PAGE_SIZE)), - PageEndAddress = Address + PAGE_SIZE - 1; - - /* Check each active page address starting from begining */ - while (Address < PageEndAddress) { - /* Verify if Address and Address+2 contents are 0xFFFFFFFF */ - if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF) { - /* Set variable data */ - HAL_StatusTypeDef FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address, Data); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - /* Set variable virtual address, return status */ - return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address + 2, VirtAddress); - } - else /* Next address location */ - Address += 4; - } - - /* Return PAGE_FULL in case the valid page is full */ - return PAGE_FULL; -} - -/** - * @brief Transfers last updated variables data from the full Page to - * an empty one. - * @param VirtAddress: 16 bit virtual address of the variable - * @param Data: 16 bit data to be written as variable value - * @retval Success or error status: - * - FLASH_COMPLETE: on success - * - PAGE_FULL: if valid page is full - * - NO_VALID_PAGE: if no valid page was found - * - Flash error code: on write Flash error - */ -static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) { - /* Get active Page for read operation */ - uint16_t ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); - uint32_t NewPageAddress = EEPROM_START_ADDRESS; - uint16_t OldPageId = 0; - - if (ValidPage == PAGE1) { /* Page1 valid */ - /* New page address where variable will be moved to */ - NewPageAddress = PAGE0_BASE_ADDRESS; - /* Old page ID where variable will be taken from */ - OldPageId = PAGE1_ID; - } - else if (ValidPage == PAGE0) { /* Page0 valid */ - /* New page address where variable will be moved to */ - NewPageAddress = PAGE1_BASE_ADDRESS; - /* Old page ID where variable will be taken from */ - OldPageId = PAGE0_ID; - } - else - return NO_VALID_PAGE; /* No valid Page */ - - /* Set the new Page status to RECEIVE_DATA status */ - HAL_StatusTypeDef FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, RECEIVE_DATA); - /* If program operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - - /* Write the variable passed as parameter in the new active page */ - uint16_t EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data); - /* If program operation was failed, a Flash error code is returned */ - if (EepromStatus != HAL_OK) return EepromStatus; - - /* Transfer process: transfer variables from old to the new active page */ - for (uint16_t VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { - if (VirtAddVarTab[VarIdx] != VirtAddress) { /* Check each variable except the one passed as parameter */ - /* Read the other last variable updates */ - uint16_t ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); - /* In case variable corresponding to the virtual address was found */ - if (ReadStatus != 0x1) { - /* Transfer the variable to the new active page */ - EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); - /* If program operation was failed, a Flash error code is returned */ - if (EepromStatus != HAL_OK) return EepromStatus; - } - } - } - - FLASH_EraseInitTypeDef pEraseInit; - pEraseInit.TypeErase = TYPEERASE_SECTORS; - pEraseInit.Sector = OldPageId; - pEraseInit.NbSectors = 1; - pEraseInit.VoltageRange = VOLTAGE_RANGE; - - /* Erase the old Page: Set old Page status to ERASED status */ - uint32_t SectorError; - FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); - /* If erase operation was failed, a Flash error code is returned */ - if (FlashStatus != HAL_OK) return FlashStatus; - - /* Set new Page status to VALID_PAGE status */ - /* As the last operation, just return the result code */ - return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, VALID_PAGE); -} - -#endif // FLASH_EEPROM_EMULATION -#endif // STM32GENERIC && (STM32F4 || STM32F7) - -/** - * @} - */ - -/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h deleted file mode 100644 index 84c4c6e3d2..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h +++ /dev/null @@ -1,114 +0,0 @@ -/****************************************************************************** - * @file eeprom_emul.h - * @author MCD Application Team - * @version V1.2.6 - * @date 04-November-2016 - * @brief This file contains all the functions prototypes for the EEPROM - * emulation firmware library. - ****************************************************************************** - * @attention - * - * Copyright © 2016 STMicroelectronics International N.V. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted, provided that the following conditions are met: - * - * 1. Redistribution of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific written permission. - * 4. This software, including modifications and/or derivative works of this - * software, must execute solely and exclusively on microcontroller or - * microprocessor devices manufactured by or for STMicroelectronics. - * 5. Redistribution and use of this software other than as permitted under - * this license is void and will automatically terminate your rights under - * this license. - * - * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY - * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT - * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ******************************************************************************/ -#pragma once - -// ------------------------ -// Includes -// ------------------------ - -#include "../../inc/MarlinConfig.h" - -/* Exported constants --------------------------------------------------------*/ -/* EEPROM emulation firmware error codes */ -#define EE_OK uint32_t(HAL_OK) -#define EE_ERROR uint32_t(HAL_ERROR) -#define EE_BUSY uint32_t(HAL_BUSY) -#define EE_TIMEOUT uint32_t(HAL_TIMEOUT) - -/* Define the size of the sectors to be used */ -#define PAGE_SIZE uint32_t(0x4000) /* Page size = 16KByte */ - -/* Device voltage range supposed to be [2.7V to 3.6V], the operation will - be done by word */ -#define VOLTAGE_RANGE uint8_t(VOLTAGE_RANGE_3) - -/* EEPROM start address in Flash */ -#ifdef STM32F7 - #define EEPROM_START_ADDRESS uint32_t(0x08100000) /* EEPROM emulation start address: - from sector2 : after 16KByte of used - Flash memory */ -#else - #define EEPROM_START_ADDRESS uint32_t(0x08078000) /* EEPROM emulation start address: - after 480KByte of used Flash memory */ -#endif - -/* Pages 0 and 1 base and end addresses */ -#define PAGE0_BASE_ADDRESS uint32_t(EEPROM_START_ADDRESS + 0x0000) -#define PAGE0_END_ADDRESS uint32_t(EEPROM_START_ADDRESS + PAGE_SIZE - 1) -#define PAGE0_ID FLASH_SECTOR_1 - -#define PAGE1_BASE_ADDRESS uint32_t(EEPROM_START_ADDRESS + 0x4000) -#define PAGE1_END_ADDRESS uint32_t(EEPROM_START_ADDRESS + 2 * (PAGE_SIZE) - 1) -#define PAGE1_ID FLASH_SECTOR_2 - -/* Used Flash pages for EEPROM emulation */ -#define PAGE0 uint16_t(0x0000) -#define PAGE1 uint16_t(0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/ - -/* No valid page define */ -#define NO_VALID_PAGE uint16_t(0x00AB) - -/* Page status definitions */ -#define ERASED uint16_t(0xFFFF) /* Page is empty */ -#define RECEIVE_DATA uint16_t(0xEEEE) /* Page is marked to receive data */ -#define VALID_PAGE uint16_t(0x0000) /* Page containing valid data */ - -/* Valid pages in read and write defines */ -#define READ_FROM_VALID_PAGE uint8_t(0x00) -#define WRITE_IN_VALID_PAGE uint8_t(0x01) - -/* Page full define */ -#define PAGE_FULL uint8_t(0x80) - -/* Variables' number */ -#define NB_OF_VAR uint16_t(4096) - -/* Exported functions ------------------------------------------------------- */ -uint16_t EE_Initialize(); -uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); -uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp deleted file mode 100644 index 00b808fd48..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(FLASH_EEPROM_EMULATION) - -#include "../shared/eeprom_api.h" -#include "eeprom_emul.h" - -// FLASH_FLAG_PGSERR (Programming Sequence Error) was renamed to -// FLASH_FLAG_ERSERR (Erasing Sequence Error) in STM32F4/7 - -#ifdef STM32F7 - #define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR -#else - //#define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR -#endif - -void ee_write_byte(uint8_t *pos, unsigned char value) { - HAL_FLASH_Unlock(); - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); - - const unsigned eeprom_address = (unsigned)pos; - if (EE_WriteVariable(eeprom_address, uint16_t(value)) != EE_OK) - for (;;) HAL_Delay(1); // Spin forever until watchdog reset - - HAL_FLASH_Lock(); -} - -uint8_t ee_read_byte(uint8_t *pos) { - uint16_t data = 0xFF; - const unsigned eeprom_address = (unsigned)pos; - (void)EE_ReadVariable(eeprom_address, &data); // Data unchanged on error - return uint8_t(data); -} - -#ifndef MARLIN_EEPROM_SIZE - #error "MARLIN_EEPROM_SIZE is required for Flash-based EEPROM." -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::access_start() { - static bool ee_initialized = false; - if (!ee_initialized) { - HAL_FLASH_Unlock(); - - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); - - /* EEPROM Init */ - if (EE_Initialize() != EE_OK) - for (;;) HAL_Delay(1); // Spin forever until watchdog reset - - HAL_FLASH_Lock(); - ee_initialized = true; - } - return true; -} - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != ee_read_byte(p)) { - ee_write_byte(p, v); - if (ee_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = ee_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // FLASH_EEPROM_EMULATION -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp deleted file mode 100644 index c0d82dbd07..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -/** - * PersistentStore for Arduino-style EEPROM interface - * with simple implementations supplied by Marlin. - */ - -#include "../shared/eeprom_if.h" -#include "../shared/eeprom_api.h" - -#ifndef MARLIN_EEPROM_SIZE - #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM." -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { eeprom_init(); return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h b/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h deleted file mode 100644 index fdff8cc644..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); -} diff --git a/Marlin/src/HAL/STM32_F4_F7/fastio.h b/Marlin/src/HAL/STM32_F4_F7/fastio.h deleted file mode 100644 index f42be58354..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/fastio.h +++ /dev/null @@ -1,310 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O interfaces for STM32F4/7 - * These use GPIO functions instead of Direct Port Manipulation, as on AVR. - */ - -#ifndef PWM - #define PWM OUTPUT -#endif - -#define READ(IO) digitalRead(IO) -#define WRITE(IO,V) digitalWrite(IO,V) - -#define _GET_MODE(IO) -#define _SET_MODE(IO,M) pinMode(IO, M) -#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ - -#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ -#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ -#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ -#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) -#define SET_PWM(IO) _SET_MODE(IO, PWM) - -#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) - -#define IS_INPUT(IO) -#define IS_OUTPUT(IO) - -#define PWM_PIN(P) true - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) - -// -// Pins Definitions -// -#define PORTA 0 -#define PORTB 1 -#define PORTC 2 -#define PORTD 3 -#define PORTE 4 -#define PORTF 5 -#define PORTG 6 - -#define _STM32_PIN(P,PN) ((PORT##P * 16) + PN) - -#undef PA0 -#define PA0 _STM32_PIN(A, 0) -#undef PA1 -#define PA1 _STM32_PIN(A, 1) -#undef PA2 -#define PA2 _STM32_PIN(A, 2) -#undef PA3 -#define PA3 _STM32_PIN(A, 3) -#undef PA4 -#define PA4 _STM32_PIN(A, 4) -#undef PA5 -#define PA5 _STM32_PIN(A, 5) -#undef PA6 -#define PA6 _STM32_PIN(A, 6) -#undef PA7 -#define PA7 _STM32_PIN(A, 7) -#undef PA8 -#define PA8 _STM32_PIN(A, 8) -#undef PA9 -#define PA9 _STM32_PIN(A, 9) -#undef PA10 -#define PA10 _STM32_PIN(A, 10) -#undef PA11 -#define PA11 _STM32_PIN(A, 11) -#undef PA12 -#define PA12 _STM32_PIN(A, 12) -#undef PA13 -#define PA13 _STM32_PIN(A, 13) -#undef PA14 -#define PA14 _STM32_PIN(A, 14) -#undef PA15 -#define PA15 _STM32_PIN(A, 15) - -#undef PB0 -#define PB0 _STM32_PIN(B, 0) -#undef PB1 -#define PB1 _STM32_PIN(B, 1) -#undef PB2 -#define PB2 _STM32_PIN(B, 2) -#undef PB3 -#define PB3 _STM32_PIN(B, 3) -#undef PB4 -#define PB4 _STM32_PIN(B, 4) -#undef PB5 -#define PB5 _STM32_PIN(B, 5) -#undef PB6 -#define PB6 _STM32_PIN(B, 6) -#undef PB7 -#define PB7 _STM32_PIN(B, 7) -#undef PB8 -#define PB8 _STM32_PIN(B, 8) -#undef PB9 -#define PB9 _STM32_PIN(B, 9) -#undef PB10 -#define PB10 _STM32_PIN(B, 10) -#undef PB11 -#define PB11 _STM32_PIN(B, 11) -#undef PB12 -#define PB12 _STM32_PIN(B, 12) -#undef PB13 -#define PB13 _STM32_PIN(B, 13) -#undef PB14 -#define PB14 _STM32_PIN(B, 14) -#undef PB15 -#define PB15 _STM32_PIN(B, 15) - -#undef PC0 -#define PC0 _STM32_PIN(C, 0) -#undef PC1 -#define PC1 _STM32_PIN(C, 1) -#undef PC2 -#define PC2 _STM32_PIN(C, 2) -#undef PC3 -#define PC3 _STM32_PIN(C, 3) -#undef PC4 -#define PC4 _STM32_PIN(C, 4) -#undef PC5 -#define PC5 _STM32_PIN(C, 5) -#undef PC6 -#define PC6 _STM32_PIN(C, 6) -#undef PC7 -#define PC7 _STM32_PIN(C, 7) -#undef PC8 -#define PC8 _STM32_PIN(C, 8) -#undef PC9 -#define PC9 _STM32_PIN(C, 9) -#undef PC10 -#define PC10 _STM32_PIN(C, 10) -#undef PC11 -#define PC11 _STM32_PIN(C, 11) -#undef PC12 -#define PC12 _STM32_PIN(C, 12) -#undef PC13 -#define PC13 _STM32_PIN(C, 13) -#undef PC14 -#define PC14 _STM32_PIN(C, 14) -#undef PC15 -#define PC15 _STM32_PIN(C, 15) - -#undef PD0 -#define PD0 _STM32_PIN(D, 0) -#undef PD1 -#define PD1 _STM32_PIN(D, 1) -#undef PD2 -#define PD2 _STM32_PIN(D, 2) -#undef PD3 -#define PD3 _STM32_PIN(D, 3) -#undef PD4 -#define PD4 _STM32_PIN(D, 4) -#undef PD5 -#define PD5 _STM32_PIN(D, 5) -#undef PD6 -#define PD6 _STM32_PIN(D, 6) -#undef PD7 -#define PD7 _STM32_PIN(D, 7) -#undef PD8 -#define PD8 _STM32_PIN(D, 8) -#undef PD9 -#define PD9 _STM32_PIN(D, 9) -#undef PD10 -#define PD10 _STM32_PIN(D, 10) -#undef PD11 -#define PD11 _STM32_PIN(D, 11) -#undef PD12 -#define PD12 _STM32_PIN(D, 12) -#undef PD13 -#define PD13 _STM32_PIN(D, 13) -#undef PD14 -#define PD14 _STM32_PIN(D, 14) -#undef PD15 -#define PD15 _STM32_PIN(D, 15) - -#undef PE0 -#define PE0 _STM32_PIN(E, 0) -#undef PE1 -#define PE1 _STM32_PIN(E, 1) -#undef PE2 -#define PE2 _STM32_PIN(E, 2) -#undef PE3 -#define PE3 _STM32_PIN(E, 3) -#undef PE4 -#define PE4 _STM32_PIN(E, 4) -#undef PE5 -#define PE5 _STM32_PIN(E, 5) -#undef PE6 -#define PE6 _STM32_PIN(E, 6) -#undef PE7 -#define PE7 _STM32_PIN(E, 7) -#undef PE8 -#define PE8 _STM32_PIN(E, 8) -#undef PE9 -#define PE9 _STM32_PIN(E, 9) -#undef PE10 -#define PE10 _STM32_PIN(E, 10) -#undef PE11 -#define PE11 _STM32_PIN(E, 11) -#undef PE12 -#define PE12 _STM32_PIN(E, 12) -#undef PE13 -#define PE13 _STM32_PIN(E, 13) -#undef PE14 -#define PE14 _STM32_PIN(E, 14) -#undef PE15 -#define PE15 _STM32_PIN(E, 15) - -#ifdef STM32F7 - - #undef PORTF - #define PORTF 5 - #undef PF0 - #define PF0 _STM32_PIN(F, 0) - #undef PF1 - #define PF1 _STM32_PIN(F, 1) - #undef PF2 - #define PF2 _STM32_PIN(F, 2) - #undef PF3 - #define PF3 _STM32_PIN(F, 3) - #undef PF4 - #define PF4 _STM32_PIN(F, 4) - #undef PF5 - #define PF5 _STM32_PIN(F, 5) - #undef PF6 - #define PF6 _STM32_PIN(F, 6) - #undef PF7 - #define PF7 _STM32_PIN(F, 7) - #undef PF8 - #define PF8 _STM32_PIN(F, 8) - #undef PF9 - #define PF9 _STM32_PIN(F, 9) - #undef PF10 - #define PF10 _STM32_PIN(F, 10) - #undef PF11 - #define PF11 _STM32_PIN(F, 11) - #undef PF12 - #define PF12 _STM32_PIN(F, 12) - #undef PF13 - #define PF13 _STM32_PIN(F, 13) - #undef PF14 - #define PF14 _STM32_PIN(F, 14) - #undef PF15 - #define PF15 _STM32_PIN(F, 15) - - #undef PORTG - #define PORTG 6 - #undef PG0 - #define PG0 _STM32_PIN(G, 0) - #undef PG1 - #define PG1 _STM32_PIN(G, 1) - #undef PG2 - #define PG2 _STM32_PIN(G, 2) - #undef PG3 - #define PG3 _STM32_PIN(G, 3) - #undef PG4 - #define PG4 _STM32_PIN(G, 4) - #undef PG5 - #define PG5 _STM32_PIN(G, 5) - #undef PG6 - #define PG6 _STM32_PIN(G, 6) - #undef PG7 - #define PG7 _STM32_PIN(G, 7) - #undef PG8 - #define PG8 _STM32_PIN(G, 8) - #undef PG9 - #define PG9 _STM32_PIN(G, 9) - #undef PG10 - #define PG10 _STM32_PIN(G, 10) - #undef PG11 - #define PG11 _STM32_PIN(G, 11) - #undef PG12 - #define PG12 _STM32_PIN(G, 12) - #undef PG13 - #define PG13 _STM32_PIN(G, 13) - #undef PG14 - #define PG14 _STM32_PIN(G, 14) - #undef PG15 - #define PG15 _STM32_PIN(G, 15) - -#endif // STM32GENERIC && STM32F7 diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h deleted file mode 100644 index a9f1b58222..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/STM32F4_F7." -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h deleted file mode 100644 index b5d808e21a..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if ENABLED(EEPROM_SETTINGS) && defined(STM32F7) - #undef USE_WIRED_EEPROM - #undef SRAM_EEPROM_EMULATION - #undef SDCARD_EEPROM_EMULATION - #define FLASH_EEPROM_EMULATION -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h deleted file mode 100644 index 9bb36f3bbb..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test STM32F4/7-specific configuration values for errors at compile-time. - */ -//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) -// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" -//#endif - -#if ENABLED(EMERGENCY_PARSER) - #error "EMERGENCY_PARSER is not yet implemented for STM32F4/7. Disable EMERGENCY_PARSER to continue." -#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on STM32F4/F7." -#endif - -#if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h b/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h deleted file mode 100644 index 973abb1b01..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) - #include "../STM32/pinsDebug_STM32duino.h" -#elif defined(BOARD_NR_GPIO_PINS) // Only in STM32GENERIC (Maple) - #include "../STM32/pinsDebug_STM32GENERIC.h" -#else - #error "M43 Pins Debugging not supported for this board." -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/spi_pins.h b/Marlin/src/HAL/STM32_F4_F7/spi_pins.h deleted file mode 100644 index 75a6a2b250..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/spi_pins.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Define SPI Pins: SCK, MISO, MOSI, SS - */ -#ifndef SCK_PIN - #define SCK_PIN PA5 -#endif -#ifndef MISO_PIN - #define MISO_PIN PA6 -#endif -#ifndef MOSI_PIN - #define MOSI_PIN PA7 -#endif -#ifndef SS_PIN - #define SS_PIN PA8 -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/timers.h b/Marlin/src/HAL/STM32_F4_F7/timers.h deleted file mode 100644 index 4e8c81783e..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/timers.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef STM32F4 - #include "STM32F4/timers.h" -#else - #include "STM32F7/timers.h" -#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp b/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp deleted file mode 100644 index cb12ec7aac..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - - #include "watchdog.h" - - IWDG_HandleTypeDef hiwdg; - - void watchdog_init() { - hiwdg.Instance = IWDG; - hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock - hiwdg.Init.Reload = 4095; //4095 counts = 4 seconds at 1024Hz - if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { - //Error_Handler(); - } - else { - #if PIN_EXISTS(LED) && DISABLED(PINS_DEBUGGING) - TOGGLE(LED_PIN); // heartbeat indicator - #endif - } - } - - void HAL_watchdog_refresh() { - /* Refresh IWDG: reload counter */ - if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { - /* Refresh Error */ - //Error_Handler(); - } - } - -#endif // USE_WATCHDOG -#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/watchdog.h b/Marlin/src/HAL/STM32_F4_F7/watchdog.h deleted file mode 100644 index 3dbc2d08c1..0000000000 --- a/Marlin/src/HAL/STM32_F4_F7/watchdog.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -extern IWDG_HandleTypeDef hiwdg; - -void watchdog_init(); -void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp deleted file mode 100644 index 8c3dd83377..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL for Teensy 3.2 (MK20DX256) - */ - -#ifdef __MK20DX256__ - -#include "HAL.h" -#include "../shared/Delay.h" - -#include - -uint16_t HAL_adc_result; - -static const uint8_t pin2sc1a[] = { - 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, 0, 19, 3, 31, // 0-13, we treat them as A0-A13 - 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, // 14-23 (A0-A9) - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, // 24-33 - 0+64, 19+64, 3+64, 31+64, // 34-37 (A10-A13) - 26, 22, 23, 27, 29, 30 // 38-43: temp. sensor, VREF_OUT, A14, bandgap, VREFH, VREFL. A14 isn't connected to anything in Teensy 3.0. -}; - -/* - // disable interrupts - void cli() { noInterrupts(); } - - // enable interrupts - void sei() { interrupts(); } -*/ - -void HAL_adc_init() { - analog_init(); - while (ADC0_SC3 & ADC_SC3_CAL) {}; // Wait for calibration to finish - NVIC_ENABLE_IRQ(IRQ_FTM1); -} - -void HAL_clear_reset_source() { } - -uint8_t HAL_get_reset_source() { - switch (RCM_SRS0) { - case 128: return RST_POWER_ON; break; - case 64: return RST_EXTERNAL; break; - case 32: return RST_WATCHDOG; break; - // case 8: return RST_LOSS_OF_LOCK; break; - // case 4: return RST_LOSS_OF_CLOCK; break; - // case 2: return RST_LOW_VOLTAGE; break; - } - return 0; -} - -extern "C" { - extern char __bss_end; - extern char __heap_start; - extern void* __brkval; - - int freeMemory() { - int free_memory; - if ((int)__brkval == 0) - free_memory = ((int)&free_memory) - ((int)&__bss_end); - else - free_memory = ((int)&free_memory) - ((int)__brkval); - return free_memory; - } -} - -void HAL_adc_start_conversion(const uint8_t adc_pin) { ADC0_SC1A = pin2sc1a[adc_pin]; } - -uint16_t HAL_adc_get_result() { return ADC0_RA; } - -#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h deleted file mode 100644 index 8ab358e9e1..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL for Teensy 3.2 (MK20DX256) - */ - -#define CPU_32_BIT - -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" - -#include "fastio.h" -#include "watchdog.h" - - -#include - -#define ST7920_DELAY_1 DELAY_NS(600) -#define ST7920_DELAY_2 DELAY_NS(750) -#define ST7920_DELAY_3 DELAY_NS(750) - -//#undef MOTHERBOARD -//#define MOTHERBOARD BOARD_TEENSY31_32 - -#define IS_32BIT_TEENSY 1 -#define IS_TEENSY_31_32 1 -#ifndef IS_TEENSY31 - #define IS_TEENSY32 1 -#endif - -#define _MSERIAL(X) Serial##X -#define MSERIAL(X) _MSERIAL(X) -#define Serial0 Serial - -#if SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB -#elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) -#endif - -#define HAL_SERVO_LIB libServo - -typedef int8_t pin_t; - -#ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) -#endif - -#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() -#define CRITICAL_SECTION_END() if (!primask) __enable_irq() -#define ISRS_ENABLED() (!__get_PRIMASK()) -#define ENABLE_ISRS() __enable_irq() -#define DISABLE_ISRS() __disable_irq() - -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*((void**)(addr))) -// Add type-checking to pgm_read_word -#undef pgm_read_word -#define pgm_read_word(addr) (*((uint16_t*)(addr))) - -inline void HAL_init() {} - -// Clear the reset reason -void HAL_clear_reset_source(); - -// Get the reason for the reset -uint8_t HAL_get_reset_source(); - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -extern "C" { - int freeMemory(); -} -#pragma GCC diagnostic pop - -// ADC - -void HAL_adc_init(); - -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 -#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) -#define HAL_READ_ADC() HAL_adc_get_result() -#define HAL_ADC_READY() true - -#define HAL_ANALOG_SELECT(pin) - -void HAL_adc_start_conversion(const uint8_t adc_pin); -uint16_t HAL_adc_get_result(); - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) diff --git a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp deleted file mode 100644 index cdb3f4701c..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __MK20DX256__ - -#include "HAL.h" -#include -#include -#include "spi_pins.h" -#include "../../core/macros.h" - -static SPISettings spiConfig; - -/** - * Standard SPI functions - */ - -// Initialize SPI bus -void spiBegin() { - #if !PIN_EXISTS(SS) - #error "SS_PIN not defined!" - #endif - OUT_WRITE(SS_PIN, HIGH); - SET_OUTPUT(SCK_PIN); - SET_INPUT(MISO_PIN); - SET_OUTPUT(MOSI_PIN); - - #if 0 && DISABLED(SOFTWARE_SPI) - // set SS high - may be chip select for another SPI device - #if SET_SPI_SS_HIGH - WRITE(SS_PIN, HIGH); - #endif - // set a default rate - spiInit(SPI_HALF_SPEED); // 1 - #endif -} - -// Configure SPI for specified SPI speed -void spiInit(uint8_t spiRate) { - // Use data rates Marlin uses - uint32_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = 10000000; break; - case SPI_HALF_SPEED: clock = 5000000; break; - case SPI_QUARTER_SPEED: clock = 2500000; break; - case SPI_EIGHTH_SPEED: clock = 1250000; break; - case SPI_SPEED_5: clock = 625000; break; - case SPI_SPEED_6: clock = 312500; break; - default: clock = 4000000; // Default from the SPI libarary - } - spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); - SPI.begin(); -} - -// SPI receive a byte -uint8_t spiRec() { - SPI.beginTransaction(spiConfig); - const uint8_t returnByte = SPI.transfer(0xFF); - SPI.endTransaction(); - return returnByte; - //SPDR = 0xFF; - //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - //return SPDR; -} - -// SPI read data -void spiRead(uint8_t* buf, uint16_t nbyte) { - SPI.beginTransaction(spiConfig); - SPI.transfer(buf, nbyte); - SPI.endTransaction(); - //if (nbyte-- == 0) return; - // SPDR = 0xFF; - //for (uint16_t i = 0; i < nbyte; i++) { - // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - // buf[i] = SPDR; - // SPDR = 0xFF; - //} - //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - //buf[nbyte] = SPDR; -} - -// SPI send a byte -void spiSend(uint8_t b) { - SPI.beginTransaction(spiConfig); - SPI.transfer(b); - SPI.endTransaction(); - //SPDR = b; - //while (!TEST(SPSR, SPIF)) { /* nada */ } -} - -// SPI send block -void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPI.beginTransaction(spiConfig); - SPDR = token; - for (uint16_t i = 0; i < 512; i += 2) { - while (!TEST(SPSR, SPIF)) { /* nada */ }; - SPDR = buf[i]; - while (!TEST(SPSR, SPIF)) { /* nada */ }; - SPDR = buf[i + 1]; - } - while (!TEST(SPSR, SPIF)) { /* nada */ }; - SPI.endTransaction(); -} - - -// Begin SPI transaction, set clock, bit order, data mode -void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - spiConfig = SPISettings(spiClock, bitOrder, dataMode); - SPI.beginTransaction(spiConfig); -} - -#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/Servo.cpp b/Marlin/src/HAL/TEENSY31_32/Servo.cpp deleted file mode 100644 index 19d57cf1b3..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/Servo.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __MK20DX256__ - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include "Servo.h" - -uint8_t servoPin[MAX_SERVOS] = { 0 }; - -int8_t libServo::attach(const int inPin) { - if (servoIndex >= MAX_SERVOS) return -1; - if (inPin > 0) servoPin[servoIndex] = inPin; - return super::attach(servoPin[servoIndex]); -} - -int8_t libServo::attach(const int inPin, const int inMin, const int inMax) { - if (inPin > 0) servoPin[servoIndex] = inPin; - return super::attach(servoPin[servoIndex], inMin, inMax); -} - -void libServo::move(const int value) { - constexpr uint16_t servo_delay[] = SERVO_DELAY; - static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - if (attach(0) >= 0) { - write(value); - safe_delay(servo_delay[servoIndex]); - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); - } -} - -#endif // HAS_SERVOS -#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/Servo.h b/Marlin/src/HAL/TEENSY31_32/Servo.h deleted file mode 100644 index 82b601d956..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/Servo.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// Inherit and expand on the official library -class libServo : public Servo { - public: - int8_t attach(const int pin); - int8_t attach(const int pin, const int min, const int max); - void move(const int value); - private: - typedef Servo super; - uint16_t min_ticks; - uint16_t max_ticks; - uint8_t servoIndex; // index into the channel data for this servo -}; diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp deleted file mode 100644 index cc5c56f7d5..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __MK20DX256__ - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -/** - * HAL PersistentStore for Teensy 3.2 (MK20DX256) - */ - -#include "../shared/eeprom_api.h" -#include - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(E2END + 1) -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h b/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h deleted file mode 100644 index 999ada5127..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Endstop Interrupts - * - * Without endstop interrupts the endstop pins must be polled continually in - * the temperature-ISR via endstops.update(), most of the time finding no change. - * With this feature endstops.update() is called only when we know that at - * least one endstop has changed state, saving valuable CPU cycles. - * - * This feature only works when all used endstop pins can generate an 'external interrupt'. - * - * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. - * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) - */ - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -/** - * Endstop interrupts for Due based targets. - * On Due, all pins support external interrupt capability. - */ - -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); -} diff --git a/Marlin/src/HAL/TEENSY31_32/fastio.h b/Marlin/src/HAL/TEENSY31_32/fastio.h deleted file mode 100644 index 9a299de9c7..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/fastio.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O Routines for Teensy 3.5 and Teensy 3.6 - * Use direct port manipulation to save scads of processor time. - * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. - */ - -#ifndef MASK - #define MASK(PIN) (1 << PIN) -#endif - -#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) -#define GPIO_BITBAND(reg, bit) (*(uint32_t *)GPIO_BITBAND_ADDR((reg), (bit))) - -/** - * Magic I/O routines - * - * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); - * - * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html - */ - -#define _READ(P) bool(CORE_PIN ## P ## _PINREG & CORE_PIN ## P ## _BITMASK) - -#define _WRITE(P,V) do{ \ - if (V) CORE_PIN ## P ## _PORTSET = CORE_PIN ## P ## _BITMASK; \ - else CORE_PIN ## P ## _PORTCLEAR = CORE_PIN ## P ## _BITMASK; \ -}while(0) - -#define _TOGGLE(P) (*(&(CORE_PIN ## P ## _PORTCLEAR)+1) = CORE_PIN ## P ## _BITMASK) - -#define _SET_INPUT(P) do{ \ - CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ -}while(0) - -#define _SET_OUTPUT(P) do{ \ - CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ -}while(0) - -#define _SET_INPUT_PULLUP(P) do{ \ - CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ -}while(0) - -#define _IS_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) -#define _IS_OUTPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) - -#define READ(IO) _READ(IO) - -#define WRITE(IO,V) _WRITE(IO,V) -#define TOGGLE(IO) _TOGGLE(IO) - -#define SET_INPUT(IO) _SET_INPUT(IO) -#define SET_INPUT_PULLUP(IO) _SET_INPUT_PULLUP(IO) -#define SET_INPUT_PULLDOWN SET_INPUT -#define SET_OUTPUT(IO) _SET_OUTPUT(IO) -#define SET_PWM SET_OUTPUT - -#define IS_INPUT(IO) _IS_INPUT(IO) -#define IS_OUTPUT(IO) _IS_OUTPUT(IO) - -#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) - -#define PWM_PIN(P) digitalPinHasPWM(P) - -/** - * Ports, functions, and pins - */ - -#define DIO0_PIN 8 diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h deleted file mode 100644 index 54ec166643..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/TEENSY31_32." -#endif diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_adv.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h deleted file mode 100644 index 998f1dcc0d..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if USE_FALLBACK_EEPROM - #define USE_WIRED_EEPROM 1 -#endif diff --git a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h deleted file mode 100644 index 3932ee6a76..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test TEENSY35_36 specific configuration values for errors at compile-time. - */ - -#if ENABLED(EMERGENCY_PARSER) - #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.1/3.2. Disable EMERGENCY_PARSER to continue." -#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on Teensy 3.1/3.2." -#endif - -#if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." -#endif diff --git a/Marlin/src/HAL/TEENSY31_32/pinsDebug.h b/Marlin/src/HAL/TEENSY31_32/pinsDebug.h deleted file mode 100644 index d4a91ce801..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/pinsDebug.h +++ /dev/null @@ -1 +0,0 @@ -#error "PINS_DEBUGGING is not yet supported for Teensy 3.1 / 3.2!" diff --git a/Marlin/src/HAL/TEENSY31_32/spi_pins.h b/Marlin/src/HAL/TEENSY31_32/spi_pins.h deleted file mode 100644 index 5754fbfeed..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/spi_pins.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define SCK_PIN 13 -#define MISO_PIN 12 -#define MOSI_PIN 11 -#define SS_PIN 20 //SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/TEENSY31_32/timers.cpp b/Marlin/src/HAL/TEENSY31_32/timers.cpp deleted file mode 100644 index 7e01a38f89..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/timers.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL Timers for Teensy 3.2 (MK20DX256) - */ - -#ifdef __MK20DX256__ - -#include "../../inc/MarlinConfig.h" - -/** \brief Instruction Synchronization Barrier - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. -*/ -FORCE_INLINE static void __ISB() { - __asm__ __volatile__("isb 0xF":::"memory"); -} - -/** \brief Data Synchronization Barrier - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. -*/ -FORCE_INLINE static void __DSB() { - __asm__ __volatile__("dsb 0xF":::"memory"); -} - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - switch (timer_num) { - case 0: - FTM0_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; - FTM0_SC = 0x00; // Set this to zero before changing the modulus - FTM0_CNT = 0x0000; // Reset the count to zero - FTM0_MOD = 0xFFFF; // max modulus = 65535 - FTM0_C0V = (FTM0_TIMER_RATE) / frequency; // Initial FTM Channel 0 compare value - FTM0_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM0_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 8 - FTM0_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; - break; - case 1: - FTM1_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; // Disable write protection, Enable FTM1 - FTM1_SC = 0x00; // Set this to zero before changing the modulus - FTM1_CNT = 0x0000; // Reset the count to zero - FTM1_MOD = 0xFFFF; // max modulus = 65535 - FTM1_C0V = (FTM1_TIMER_RATE) / frequency; // Initial FTM Channel 0 compare value 65535 - FTM1_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM1_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 4 - FTM1_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; - break; - } -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case 0: NVIC_ENABLE_IRQ(IRQ_FTM0); break; - case 1: NVIC_ENABLE_IRQ(IRQ_FTM1); break; - } -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case 0: NVIC_DISABLE_IRQ(IRQ_FTM0); break; - case 1: NVIC_DISABLE_IRQ(IRQ_FTM1); break; - } - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - switch (timer_num) { - case 0: return NVIC_IS_ENABLED(IRQ_FTM0); - case 1: return NVIC_IS_ENABLED(IRQ_FTM1); - } - return false; -} - -void HAL_timer_isr_prologue(const uint8_t timer_num) { - switch (timer_num) { - case 0: - FTM0_CNT = 0x0000; - FTM0_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag - FTM0_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag - break; - case 1: - FTM1_CNT = 0x0000; - FTM1_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag - FTM1_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag - break; - } -} - -#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/timers.h b/Marlin/src/HAL/TEENSY31_32/timers.h deleted file mode 100644 index 135b328830..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/timers.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Timers for Teensy 3.2 (MK20DX256) - */ - -#include - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -typedef uint32_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF - -#define FTM0_TIMER_PRESCALE 8 -#define FTM1_TIMER_PRESCALE 4 -#define FTM0_TIMER_PRESCALE_BITS 0b011 -#define FTM1_TIMER_PRESCALE_BITS 0b010 - -#define FTM0_TIMER_RATE (F_BUS / (FTM0_TIMER_PRESCALE)) // 60MHz / 8 = 7500kHz -#define FTM1_TIMER_RATE (F_BUS / (FTM1_TIMER_PRESCALE)) // 60MHz / 4 = 15MHz - -#define HAL_TIMER_RATE (FTM0_TIMER_RATE) - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif - -#define TEMP_TIMER_FREQUENCY 1000 - -#define STEPPER_TIMER_RATE HAL_TIMER_RATE -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) -#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() extern "C" void ftm0_isr() //void TC3_Handler() -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() extern "C" void ftm1_isr() //void TC4_Handler() -#endif - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); - -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { - switch (timer_num) { - case 0: FTM0_C0V = compare; break; - case 1: FTM1_C0V = compare; break; - } -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - switch (timer_num) { - case 0: return FTM0_C0V; - case 1: return FTM1_C0V; - } - return 0; -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - switch (timer_num) { - case 0: return FTM0_CNT; - case 1: return FTM1_CNT; - } - return 0; -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -void HAL_timer_isr_prologue(const uint8_t timer_num); -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/TEENSY31_32/watchdog.cpp b/Marlin/src/HAL/TEENSY31_32/watchdog.cpp deleted file mode 100644 index 9f7b70d9f9..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/watchdog.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __MK20DX256__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - -#include "watchdog.h" - -void watchdog_init() { - WDOG_TOVALH = 0; - WDOG_TOVALL = 4000; - WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; -} - -#endif // USE_WATCHDOG - -#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/watchdog.h b/Marlin/src/HAL/TEENSY31_32/watchdog.h deleted file mode 100644 index b8b46a4030..0000000000 --- a/Marlin/src/HAL/TEENSY31_32/watchdog.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "HAL.h" - -// Arduino Due core now has watchdog support - -void watchdog_init(); - -inline void HAL_watchdog_refresh() { - // Watchdog refresh sequence - WDOG_REFRESH = 0xA602; - WDOG_REFRESH = 0xB480; -} diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp deleted file mode 100644 index 92907353b8..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#if defined(__MK64FX512__) || defined(__MK66FX1M0__) - -#include "HAL.h" -#include "../shared/Delay.h" - -#include - -uint16_t HAL_adc_result, HAL_adc_select; - -static const uint8_t pin2sc1a[] = { - 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, 3, 19+128, 14+128, 15+128, // 0-13 -> A0-A13 - 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, // 14-23 are A0-A9 - 255, 255, 255, 255, 255, 255, 255, // 24-30 are digital only - 14+128, 15+128, 17, 18, 4+128, 5+128, 6+128, 7+128, 17+128, // 31-39 are A12-A20 - 255, 255, 255, 255, 255, 255, 255, 255, 255, // 40-48 are digital only - 10+128, 11+128, // 49-50 are A23-A24 - 255, 255, 255, 255, 255, 255, 255, // 51-57 are digital only - 255, 255, 255, 255, 255, 255, // 58-63 (sd card pins) are digital only - 3, 19+128, // 64-65 are A10-A11 - 23, 23+128,// 66-67 are A21-A22 (DAC pins) - 1, 1+128, // 68-69 are A25-A26 (unused USB host port on Teensy 3.5) - 26, // 70 is Temperature Sensor - 18+128 // 71 is Vref -}; - -/* - // disable interrupts - void cli() { noInterrupts(); } - - // enable interrupts - void sei() { interrupts(); } -*/ - -void HAL_adc_init() { - analog_init(); - while (ADC0_SC3 & ADC_SC3_CAL) {}; // Wait for calibration to finish - while (ADC1_SC3 & ADC_SC3_CAL) {}; // Wait for calibration to finish - NVIC_ENABLE_IRQ(IRQ_FTM1); -} - -void HAL_clear_reset_source() { } - -uint8_t HAL_get_reset_source() { - switch (RCM_SRS0) { - case 128: return RST_POWER_ON; break; - case 64: return RST_EXTERNAL; break; - case 32: return RST_WATCHDOG; break; - // case 8: return RST_LOSS_OF_LOCK; break; - // case 4: return RST_LOSS_OF_CLOCK; break; - // case 2: return RST_LOW_VOLTAGE; break; - } - return 0; -} - -extern "C" { - extern char __bss_end; - extern char __heap_start; - extern void* __brkval; - - int freeMemory() { - int free_memory; - if ((int)__brkval == 0) - free_memory = ((int)&free_memory) - ((int)&__bss_end); - else - free_memory = ((int)&free_memory) - ((int)__brkval); - return free_memory; - } -} - -void HAL_adc_start_conversion(const uint8_t adc_pin) { - const uint16_t pin = pin2sc1a[adc_pin]; - if (pin == 0xFF) { - // Digital only - HAL_adc_select = -1; - } - else if (pin & 0x80) { - HAL_adc_select = 1; - ADC1_SC1A = pin & 0x7F; - } - else { - HAL_adc_select = 0; - ADC0_SC1A = pin; - } -} - -uint16_t HAL_adc_get_result() { - switch (HAL_adc_select) { - case 0: return ADC0_RA; - case 1: return ADC1_RA; - } - return 0; -} - -#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h deleted file mode 100644 index 2b735d6224..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ /dev/null @@ -1,130 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#define CPU_32_BIT - -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" - -#include "fastio.h" -#include "watchdog.h" - -#include -#include - -#define ST7920_DELAY_1 DELAY_NS(600) -#define ST7920_DELAY_2 DELAY_NS(750) -#define ST7920_DELAY_3 DELAY_NS(750) - -// ------------------------ -// Defines -// ------------------------ - -#define IS_32BIT_TEENSY 1 -#define IS_TEENSY_35_36 1 -#ifdef __MK66FX1M0__ - #define IS_TEENSY36 1 -#else // __MK64FX512__ - #define IS_TEENSY35 1 -#endif - -#define _MSERIAL(X) Serial##X -#define MSERIAL(X) _MSERIAL(X) -#define Serial0 Serial - -#if SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB -#elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) -#endif - -#define HAL_SERVO_LIB libServo - -typedef int8_t pin_t; - -#ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) -#endif - -#define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); __disable_irq() -#define CRITICAL_SECTION_END() if (!primask) __enable_irq() -#define ISRS_ENABLED() (!__get_primask()) -#define ENABLE_ISRS() __enable_irq() -#define DISABLE_ISRS() __disable_irq() - -#undef sq -#define sq(x) ((x)*(x)) - -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*((void**)(addr))) -// Add type-checking to pgm_read_word -#undef pgm_read_word -#define pgm_read_word(addr) (*((uint16_t*)(addr))) - -inline void HAL_init() {} - -// Clear reset reason -void HAL_clear_reset_source(); - -// Reset reason -uint8_t HAL_get_reset_source(); - -inline void HAL_reboot() {} // reboot the board or restart the bootloader - -FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -extern "C" { - int freeMemory(); -} -#pragma GCC diagnostic pop - -// ADC - -void HAL_adc_init(); - -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 -#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) -#define HAL_READ_ADC() HAL_adc_get_result() -#define HAL_ADC_READY() true - -#define HAL_ANALOG_SELECT(pin) - -void HAL_adc_start_conversion(const uint8_t adc_pin); -uint16_t HAL_adc_get_result(); - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp deleted file mode 100644 index b36900a321..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL SPI for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#if defined(__MK64FX512__) || defined(__MK66FX1M0__) - -#include "HAL.h" -#include -#include -#include "spi_pins.h" -#include "../../core/macros.h" - -static SPISettings spiConfig; - -void spiBegin() { - #if !PIN_EXISTS(SS) - #error "SS_PIN not defined!" - #endif - OUT_WRITE(SS_PIN, HIGH); - SET_OUTPUT(SCK_PIN); - SET_INPUT(MISO_PIN); - SET_OUTPUT(MOSI_PIN); - - #if 0 && DISABLED(SOFTWARE_SPI) - // set SS high - may be chip select for another SPI device - #if SET_SPI_SS_HIGH - WRITE(SS_PIN, HIGH); - #endif - // set a default rate - spiInit(SPI_HALF_SPEED); // 1 - #endif -} - -void spiInit(uint8_t spiRate) { - // Use Marlin data-rates - uint32_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = 10000000; break; - case SPI_HALF_SPEED: clock = 5000000; break; - case SPI_QUARTER_SPEED: clock = 2500000; break; - case SPI_EIGHTH_SPEED: clock = 1250000; break; - case SPI_SPEED_5: clock = 625000; break; - case SPI_SPEED_6: clock = 312500; break; - default: - clock = 4000000; // Default from the SPI libarary - } - spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); - SPI.begin(); -} - -uint8_t spiRec() { - SPI.beginTransaction(spiConfig); - uint8_t returnByte = SPI.transfer(0xFF); - SPI.endTransaction(); - return returnByte; - //SPDR = 0xFF; - //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - //return SPDR; -} - -void spiRead(uint8_t* buf, uint16_t nbyte) { - SPI.beginTransaction(spiConfig); - SPI.transfer(buf, nbyte); - SPI.endTransaction(); - //if (nbyte-- == 0) return; - // SPDR = 0xFF; - //for (uint16_t i = 0; i < nbyte; i++) { - // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - // buf[i] = SPDR; - // SPDR = 0xFF; - //} - //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - //buf[nbyte] = SPDR; -} - -void spiSend(uint8_t b) { - SPI.beginTransaction(spiConfig); - SPI.transfer(b); - SPI.endTransaction(); - //SPDR = b; - //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } -} - -void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPI.beginTransaction(spiConfig); - SPDR = token; - for (uint16_t i = 0; i < 512; i += 2) { - while (!TEST(SPSR, SPIF)) { /* nada */ }; - SPDR = buf[i]; - while (!TEST(SPSR, SPIF)) { /* nada */ }; - SPDR = buf[i + 1]; - } - while (!TEST(SPSR, SPIF)) { /* nada */ }; - SPI.endTransaction(); -} - -// Begin SPI transaction, set clock, bit order, data mode -void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - spiConfig = SPISettings(spiClock, bitOrder, dataMode); - SPI.beginTransaction(spiConfig); -} - -#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.cpp b/Marlin/src/HAL/TEENSY35_36/Servo.cpp deleted file mode 100644 index 033858594f..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/Servo.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL Servo for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#if defined(__MK64FX512__) || defined(__MK66FX1M0__) - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include "Servo.h" - -uint8_t servoPin[MAX_SERVOS] = { 0 }; - -int8_t libServo::attach(const int inPin) { - if (servoIndex >= MAX_SERVOS) return -1; - if (inPin > 0) servoPin[servoIndex] = inPin; - return super::attach(servoPin[servoIndex]); -} - -int8_t libServo::attach(const int inPin, const int inMin, const int inMax) { - if (inPin > 0) servoPin[servoIndex] = inPin; - return super::attach(servoPin[servoIndex], inMin, inMax); -} - -void libServo::move(const int value) { - constexpr uint16_t servo_delay[] = SERVO_DELAY; - static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - if (attach(0) >= 0) { - write(value); - safe_delay(servo_delay[servoIndex]); - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); - } -} - -#endif // HAS_SERVOS -#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.h b/Marlin/src/HAL/TEENSY35_36/Servo.h deleted file mode 100644 index 719011f102..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/Servo.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Servo for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#include - -// Inherit and expand on core Servo library -class libServo : public Servo { - public: - int8_t attach(const int pin); - int8_t attach(const int pin, const int min, const int max); - void move(const int value); - private: - typedef Servo super; - uint16_t min_ticks; - uint16_t max_ticks; - uint8_t servoIndex; // Index into the channel data for this servo -}; diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp deleted file mode 100644 index ccbdc6b116..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(__MK64FX512__) || defined(__MK66FX1M0__) - -/** - * HAL PersistentStore for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -#include "../shared/eeprom_api.h" -#include - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(E2END + 1) -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h deleted file mode 100644 index 87e6a7507a..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Endstop Interrupts for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - * - * Without endstop interrupts the endstop pins must be polled continually in - * the temperature-ISR via endstops.update(), most of the time finding no change. - * With this feature endstops.update() is called only when we know that at - * least one endstop has changed state, saving valuable CPU cycles. - * - * This feature only works when all used endstop pins can generate an 'external interrupt'. - * - * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. - * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) - */ - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -/** - * Endstop interrupts for Due based targets. - * On Due, all pins support external interrupt capability. - */ -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); -} diff --git a/Marlin/src/HAL/TEENSY35_36/fastio.h b/Marlin/src/HAL/TEENSY35_36/fastio.h deleted file mode 100644 index 9a299de9c7..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/fastio.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O Routines for Teensy 3.5 and Teensy 3.6 - * Use direct port manipulation to save scads of processor time. - * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. - */ - -#ifndef MASK - #define MASK(PIN) (1 << PIN) -#endif - -#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) -#define GPIO_BITBAND(reg, bit) (*(uint32_t *)GPIO_BITBAND_ADDR((reg), (bit))) - -/** - * Magic I/O routines - * - * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); - * - * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html - */ - -#define _READ(P) bool(CORE_PIN ## P ## _PINREG & CORE_PIN ## P ## _BITMASK) - -#define _WRITE(P,V) do{ \ - if (V) CORE_PIN ## P ## _PORTSET = CORE_PIN ## P ## _BITMASK; \ - else CORE_PIN ## P ## _PORTCLEAR = CORE_PIN ## P ## _BITMASK; \ -}while(0) - -#define _TOGGLE(P) (*(&(CORE_PIN ## P ## _PORTCLEAR)+1) = CORE_PIN ## P ## _BITMASK) - -#define _SET_INPUT(P) do{ \ - CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ -}while(0) - -#define _SET_OUTPUT(P) do{ \ - CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ -}while(0) - -#define _SET_INPUT_PULLUP(P) do{ \ - CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ - GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ -}while(0) - -#define _IS_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) -#define _IS_OUTPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) - -#define READ(IO) _READ(IO) - -#define WRITE(IO,V) _WRITE(IO,V) -#define TOGGLE(IO) _TOGGLE(IO) - -#define SET_INPUT(IO) _SET_INPUT(IO) -#define SET_INPUT_PULLUP(IO) _SET_INPUT_PULLUP(IO) -#define SET_INPUT_PULLDOWN SET_INPUT -#define SET_OUTPUT(IO) _SET_OUTPUT(IO) -#define SET_PWM SET_OUTPUT - -#define IS_INPUT(IO) _IS_INPUT(IO) -#define IS_OUTPUT(IO) _IS_OUTPUT(IO) - -#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) - -#define PWM_PIN(P) digitalPinHasPWM(P) - -/** - * Ports, functions, and pins - */ - -#define DIO0_PIN 8 diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h deleted file mode 100644 index 632ee533ac..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/TEENSY35_36." -#endif diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h deleted file mode 100644 index 998f1dcc0d..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if USE_FALLBACK_EEPROM - #define USE_WIRED_EEPROM 1 -#endif diff --git a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h deleted file mode 100644 index ee80e42696..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test TEENSY35_36 specific configuration values for errors at compile-time. - */ - -#if ENABLED(EMERGENCY_PARSER) - #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.5/3.6. Disable EMERGENCY_PARSER to continue." -#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on Teensy 3.5/3.6." -#endif - -#if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." -#endif diff --git a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h deleted file mode 100644 index e529fa93be..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Pins Debugging for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin - -#define FTM0_CH0_PIN 22 -#define FTM0_CH1_PIN 23 -#define FTM0_CH2_PIN 9 -#define FTM0_CH3_PIN 10 -#define FTM0_CH4_PIN 6 -#define FTM0_CH5_PIN 20 -#define FTM0_CH6_PIN 21 -#define FTM0_CH7_PIN 5 -#define FTM1_CH0_PIN 3 -#define FTM1_CH1_PIN 4 -#define FTM2_CH0_PIN 29 -#define FTM2_CH1_PIN 30 -#define FTM3_CH0_PIN 2 -#define FTM3_CH1_PIN 14 -#define FTM3_CH2_PIN 7 -#define FTM3_CH3_PIN 8 -#define FTM3_CH4_PIN 35 -#define FTM3_CH5_PIN 36 -#define FTM3_CH6_PIN 37 -#define FTM3_CH7_PIN 38 -#ifdef __MK66FX1M0__ // Teensy3.6 - #define TPM1_CH0_PIN 16 - #define TPM1_CH1_PIN 17 -#endif - -#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && (P) <= analogInputToDigitalPin(9)) || ((P) >= analogInputToDigitalPin(12) && (P) <= analogInputToDigitalPin(20)) - -void HAL_print_analog_pin(char buffer[], int8_t pin) { - if (pin <= 23) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 14)); - else if (pin <= 39) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 19)); -} - -void HAL_analog_pin_state(char buffer[], int8_t pin) { - if (pin <= 23) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 14)); - else if (pin <= 39) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 19)); -} - -#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), 22); SERIAL_ECHO(buffer); }while(0) -#define FTM_CASE(N,Z) \ - case FTM##N##_CH##Z##_PIN: \ - if (FTM##N##_C##Z##V) { \ - PWM_PRINT(FTM##N##_C##Z##V); \ - return true; \ - } else return false - -/** - * Print a pin's PWM status. - * Return true if it's currently a PWM pin. - */ -bool HAL_pwm_status(int8_t pin) { - char buffer[20]; // for the sprintf statements - switch (pin) { - FTM_CASE(0,0); - FTM_CASE(0,1); - FTM_CASE(0,2); - FTM_CASE(0,3); - FTM_CASE(0,4); - FTM_CASE(0,5); - FTM_CASE(0,6); - FTM_CASE(0,7); - FTM_CASE(1,0); - FTM_CASE(1,1); - FTM_CASE(2,0); - FTM_CASE(2,1); - FTM_CASE(3,0); - FTM_CASE(3,1); - FTM_CASE(3,2); - FTM_CASE(3,3); - FTM_CASE(3,4); - FTM_CASE(3,5); - FTM_CASE(3,6); - FTM_CASE(3,7); - - case NOT_ON_TIMER: - default: - return false; - } - SERIAL_ECHOPGM(" "); -} - -static void HAL_pwm_details(uint8_t pin) { /* TODO */ } diff --git a/Marlin/src/HAL/TEENSY35_36/spi_pins.h b/Marlin/src/HAL/TEENSY35_36/spi_pins.h deleted file mode 100644 index c76344d075..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/spi_pins.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL SPI Pins for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#define SCK_PIN 13 -#define MISO_PIN 12 -#define MOSI_PIN 11 -#define SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/TEENSY35_36/timers.cpp b/Marlin/src/HAL/TEENSY35_36/timers.cpp deleted file mode 100644 index 8067d091dd..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/timers.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL Timers for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#if defined(__MK64FX512__) || defined(__MK66FX1M0__) - -#include "../../inc/MarlinConfig.h" - -/** \brief Instruction Synchronization Barrier - Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or - memory, after the instruction has been completed. -*/ -FORCE_INLINE static void __ISB() { - __asm__ __volatile__("isb 0xF":::"memory"); -} - -/** \brief Data Synchronization Barrier - This function acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. -*/ -FORCE_INLINE static void __DSB() { - __asm__ __volatile__("dsb 0xF":::"memory"); -} - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - switch (timer_num) { - case 0: - FTM0_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; - FTM0_SC = 0x00; // Set this to zero before changing the modulus - FTM0_CNT = 0x0000; // Reset the count to zero - FTM0_MOD = 0xFFFF; // max modulus = 65535 - FTM0_C0V = (FTM0_TIMER_RATE) / frequency; // Initial FTM Channel 0 compare value - FTM0_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM0_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 8 - FTM0_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; - break; - case 1: - FTM1_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; // Disable write protection, Enable FTM1 - FTM1_SC = 0x00; // Set this to zero before changing the modulus - FTM1_CNT = 0x0000; // Reset the count to zero - FTM1_MOD = 0xFFFF; // max modulus = 65535 - FTM1_C0V = (FTM1_TIMER_RATE) / frequency; // Initial FTM Channel 0 compare value 65535 - FTM1_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM1_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 4 - FTM1_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; - break; - } -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case 0: NVIC_ENABLE_IRQ(IRQ_FTM0); break; - case 1: NVIC_ENABLE_IRQ(IRQ_FTM1); break; - } -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case 0: NVIC_DISABLE_IRQ(IRQ_FTM0); break; - case 1: NVIC_DISABLE_IRQ(IRQ_FTM1); break; - } - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - switch (timer_num) { - case 0: return NVIC_IS_ENABLED(IRQ_FTM0); - case 1: return NVIC_IS_ENABLED(IRQ_FTM1); - } - return false; -} - -void HAL_timer_isr_prologue(const uint8_t timer_num) { - switch (timer_num) { - case 0: - FTM0_CNT = 0x0000; - FTM0_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag - FTM0_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag - break; - case 1: - FTM1_CNT = 0x0000; - FTM1_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag - FTM1_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag - break; - } -} - -#endif // Teensy3.5 or Teensy3.6 diff --git a/Marlin/src/HAL/TEENSY35_36/timers.h b/Marlin/src/HAL/TEENSY35_36/timers.h deleted file mode 100644 index 5c623cd801..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/timers.h +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Timers for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) - */ - -#include - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -typedef uint32_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF - -#define FTM0_TIMER_PRESCALE 8 -#define FTM1_TIMER_PRESCALE 4 -#define FTM0_TIMER_PRESCALE_BITS 0b011 -#define FTM1_TIMER_PRESCALE_BITS 0b010 - -#define FTM0_TIMER_RATE (F_BUS / FTM0_TIMER_PRESCALE) // 60MHz / 8 = 7500kHz -#define FTM1_TIMER_RATE (F_BUS / FTM1_TIMER_PRESCALE) // 60MHz / 4 = 15MHz - -#define HAL_TIMER_RATE (FTM0_TIMER_RATE) - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif - -#define TEMP_TIMER_FREQUENCY 1000 - -#define STEPPER_TIMER_RATE HAL_TIMER_RATE -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) -#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() extern "C" void ftm0_isr() //void TC3_Handler() -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() extern "C" void ftm1_isr() //void TC4_Handler() -#endif - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); - -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { - switch (timer_num) { - case 0: FTM0_C0V = compare; break; - case 1: FTM1_C0V = compare; break; - } -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - switch (timer_num) { - case 0: return FTM0_C0V; - case 1: return FTM1_C0V; - } - return 0; -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - switch (timer_num) { - case 0: return FTM0_CNT; - case 1: return FTM1_CNT; - } - return 0; -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -void HAL_timer_isr_prologue(const uint8_t timer_num); -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/TEENSY35_36/watchdog.cpp b/Marlin/src/HAL/TEENSY35_36/watchdog.cpp deleted file mode 100644 index e735ee7923..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/watchdog.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#if defined(__MK64FX512__) || defined(__MK66FX1M0__) - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - -#include "watchdog.h" - -void watchdog_init() { - WDOG_TOVALH = 0; - WDOG_TOVALL = 4000; - WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; -} - -#endif // USE_WATCHDOG - -#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/watchdog.h b/Marlin/src/HAL/TEENSY35_36/watchdog.h deleted file mode 100644 index 981b1f0bd2..0000000000 --- a/Marlin/src/HAL/TEENSY35_36/watchdog.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -void watchdog_init(); - -inline void HAL_watchdog_refresh() { - // Watchdog refresh sequence - WDOG_REFRESH = 0xA602; - WDOG_REFRESH = 0xB480; -} diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp deleted file mode 100644 index 5b1b4272f5..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL for Teensy 4.0 / 4.1 (IMXRT1062) - */ - -#ifdef __IMXRT1062__ - -#include "HAL.h" -#include "../shared/Delay.h" -#include "timers.h" - -#include - -uint16_t HAL_adc_result, HAL_adc_select; - -static const uint8_t pin2sc1a[] = { - 0x07, // 0/A0 AD_B1_02 - 0x08, // 1/A1 AD_B1_03 - 0x0C, // 2/A2 AD_B1_07 - 0x0B, // 3/A3 AD_B1_06 - 0x06, // 4/A4 AD_B1_01 - 0x05, // 5/A5 AD_B1_00 - 0x0F, // 6/A6 AD_B1_10 - 0x00, // 7/A7 AD_B1_11 - 0x0D, // 8/A8 AD_B1_08 - 0x0E, // 9/A9 AD_B1_09 - 0x01, // 24/A10 AD_B0_12 - 0x02, // 25/A11 AD_B0_13 - 0x83, // 26/A12 AD_B1_14 - only on ADC2, 3 - 0x84, // 27/A13 AD_B1_15 - only on ADC2, 4 - 0x07, // 14/A0 AD_B1_02 - 0x08, // 15/A1 AD_B1_03 - 0x0C, // 16/A2 AD_B1_07 - 0x0B, // 17/A3 AD_B1_06 - 0x06, // 18/A4 AD_B1_01 - 0x05, // 19/A5 AD_B1_00 - 0x0F, // 20/A6 AD_B1_10 - 0x00, // 21/A7 AD_B1_11 - 0x0D, // 22/A8 AD_B1_08 - 0x0E, // 23/A9 AD_B1_09 - 0x01, // 24/A10 AD_B0_12 - 0x02, // 25/A11 AD_B0_13 - 0x83, // 26/A12 AD_B1_14 - only on ADC2, 3 - 0x84, // 27/A13 AD_B1_15 - only on ADC2, 4 - #ifdef ARDUINO_TEENSY41 - 0xFF, // 28 - 0xFF, // 29 - 0xFF, // 30 - 0xFF, // 31 - 0xFF, // 32 - 0xFF, // 33 - 0xFF, // 34 - 0xFF, // 35 - 0xFF, // 36 - 0xFF, // 37 - 0x81, // 38/A14 AD_B1_12 - only on ADC2, 1 - 0x82, // 39/A15 AD_B1_13 - only on ADC2, 2 - 0x09, // 40/A16 AD_B1_04 - 0x0A, // 41/A17 AD_B1_05 - #endif -}; - -/* -// disable interrupts -void cli() { noInterrupts(); } - -// enable interrupts -void sei() { interrupts(); } -*/ - -void HAL_adc_init() { - analog_init(); - while (ADC1_GC & ADC_GC_CAL) ; - while (ADC2_GC & ADC_GC_CAL) ; -} - -void HAL_clear_reset_source() { - uint32_t reset_source = SRC_SRSR; - SRC_SRSR = reset_source; - } - -uint8_t HAL_get_reset_source() { - switch (SRC_SRSR & 0xFF) { - case 1: return RST_POWER_ON; break; - case 2: return RST_SOFTWARE; break; - case 4: return RST_EXTERNAL; break; - // case 8: return RST_BROWN_OUT; break; - case 16: return RST_WATCHDOG; break; - case 64: return RST_JTAG; break; - // case 128: return RST_OVERTEMP; break; - } - return 0; -} - -#define __bss_end _ebss - -extern "C" { - extern char __bss_end; - extern char __heap_start; - extern void* __brkval; - - // Doesn't work on Teensy 4.x - uint32_t freeMemory() { - uint32_t free_memory; - if ((uint32_t)__brkval == 0) - free_memory = ((uint32_t)&free_memory) - ((uint32_t)&__bss_end); - else - free_memory = ((uint32_t)&free_memory) - ((uint32_t)__brkval); - return free_memory; - } -} - -void HAL_adc_start_conversion(const uint8_t adc_pin) { - const uint16_t pin = pin2sc1a[adc_pin]; - if (pin == 0xFF) { - HAL_adc_select = -1; // Digital only - } - else if (pin & 0x80) { - HAL_adc_select = 1; - ADC2_HC0 = pin & 0x7F; - } - else { - HAL_adc_select = 0; - ADC1_HC0 = pin; - } -} - -uint16_t HAL_adc_get_result() { - switch (HAL_adc_select) { - case 0: - while (!(ADC1_HS & ADC_HS_COCO0)) ; // wait - return ADC1_R0; - case 1: - while (!(ADC2_HS & ADC_HS_COCO0)) ; // wait - return ADC2_R0; - } - return 0; -} - -bool is_output(uint8_t pin) { - const struct digital_pin_bitband_and_config_table_struct *p; - p = digital_pin_to_info_PGM + pin; - return (*(p->reg + 1) & p->mask); -} - -#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h deleted file mode 100644 index 75c10e9395..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#define CPU_32_BIT - -#include "../shared/Marduino.h" -#include "../shared/math_32bit.h" -#include "../shared/HAL_SPI.h" - -#include "fastio.h" -#include "watchdog.h" - -#include -#include - -//#define ST7920_DELAY_1 DELAY_NS(600) -//#define ST7920_DELAY_2 DELAY_NS(750) -//#define ST7920_DELAY_3 DELAY_NS(750) - -// ------------------------ -// Defines -// ------------------------ - -#define IS_32BIT_TEENSY 1 -#define IS_TEENSY_40_41 1 -#ifndef IS_TEENSY40 - #define IS_TEENSY41 1 -#endif - -#define _MSERIAL(X) Serial##X -#define MSERIAL(X) _MSERIAL(X) -#define Serial0 Serial - -#if SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB -#elif WITHIN(SERIAL_PORT, 0, 8) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) -#else - #error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." -#endif - -#ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 usbSerial - #elif WITHIN(SERIAL_PORT_2, 0, 8) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) - #else - #error "SERIAL_PORT_2 must be from -1 to 8. Please update your configuration." - #endif -#endif - -#define HAL_SERVO_LIB libServo - -typedef int8_t pin_t; - -#ifndef analogInputToDigitalPin - #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) -#endif - -#define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); __disable_irq() -#define CRITICAL_SECTION_END() if (!primask) __enable_irq() -#define ISRS_ENABLED() (!__get_primask()) -#define ENABLE_ISRS() __enable_irq() -#define DISABLE_ISRS() __disable_irq() - -#undef sq -#define sq(x) ((x)*(x)) - -#ifndef strncpy_P - #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) -#endif - -// Don't place string constants in PROGMEM -#undef PSTR -#define PSTR(str) ({static const char *data = (str); &data[0];}) - -// Fix bug in pgm_read_ptr -#undef pgm_read_ptr -#define pgm_read_ptr(addr) (*((void**)(addr))) -// Add type-checking to pgm_read_word -#undef pgm_read_word -#define pgm_read_word(addr) (*((uint16_t*)(addr))) - -// Enable hooks into idle and setup for HAL -#define HAL_IDLETASK 1 -FORCE_INLINE void HAL_idletask() {} -FORCE_INLINE void HAL_init() {} - -// Clear reset reason -void HAL_clear_reset_source(); - -// Reset reason -uint8_t HAL_get_reset_source(); - -FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -extern "C" { - uint32_t freeMemory(); -} -#pragma GCC diagnostic pop - -// ADC - -void HAL_adc_init(); - -#define HAL_ADC_VREF 3.3 -#define HAL_ADC_RESOLUTION 10 -#define HAL_ADC_FILTERED // turn off ADC oversampling -#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) -#define HAL_READ_ADC() HAL_adc_get_result() -#define HAL_ADC_READY() true - -#define HAL_ANALOG_SELECT(pin) - -void HAL_adc_start_conversion(const uint8_t adc_pin); -uint16_t HAL_adc_get_result(); - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -bool is_output(uint8_t pin); diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp deleted file mode 100644 index 20b472aa35..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL SPI for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#ifdef __IMXRT1062__ - -#include "HAL.h" -#include -#include -#include "spi_pins.h" -#include "../../core/macros.h" - -static SPISettings spiConfig; - -// ------------------------ -// Public functions -// ------------------------ - -#if ENABLED(SOFTWARE_SPI) - // ------------------------ - // Software SPI - // ------------------------ - #error "Software SPI not supported for Teensy 4. Use Hardware SPI." -#else - -// ------------------------ -// Hardware SPI -// ------------------------ - -void spiBegin() { - #ifndef SS_PIN - #error "SS_PIN is not defined!" - #endif - - OUT_WRITE(SS_PIN, HIGH); - - //SET_OUTPUT(SCK_PIN); - //SET_INPUT(MISO_PIN); - //SET_OUTPUT(MOSI_PIN); - - #if 0 && DISABLED(SOFTWARE_SPI) - // set SS high - may be chip select for another SPI device - #if SET_SPI_SS_HIGH - WRITE(SS_PIN, HIGH); - #endif - // set a default rate - spiInit(SPI_HALF_SPEED); // 1 - #endif -} - -void spiInit(uint8_t spiRate) { - // Use Marlin data-rates - uint32_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = 10000000; break; - case SPI_HALF_SPEED: clock = 5000000; break; - case SPI_QUARTER_SPEED: clock = 2500000; break; - case SPI_EIGHTH_SPEED: clock = 1250000; break; - case SPI_SPEED_5: clock = 625000; break; - case SPI_SPEED_6: clock = 312500; break; - default: - clock = 4000000; // Default from the SPI libarary - } - spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); - SPI.begin(); -} - -uint8_t spiRec() { - SPI.beginTransaction(spiConfig); - uint8_t returnByte = SPI.transfer(0xFF); - SPI.endTransaction(); - return returnByte; - //SPDR = 0xFF; - //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - //return SPDR; -} - -void spiRead(uint8_t* buf, uint16_t nbyte) { - SPI.beginTransaction(spiConfig); - SPI.transfer(buf, nbyte); - SPI.endTransaction(); - //if (nbyte-- == 0) return; - // SPDR = 0xFF; - //for (uint16_t i = 0; i < nbyte; i++) { - // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - // buf[i] = SPDR; - // SPDR = 0xFF; - //} - //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } - //buf[nbyte] = SPDR; -} - -void spiSend(uint8_t b) { - SPI.beginTransaction(spiConfig); - SPI.transfer(b); - SPI.endTransaction(); - //SPDR = b; - //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } -} - -void spiSendBlock(uint8_t token, const uint8_t* buf) { - SPI.beginTransaction(spiConfig); - SPDR = token; - for (uint16_t i = 0; i < 512; i += 2) { - while (!TEST(SPSR, SPIF)) { /* nada */ }; - SPDR = buf[i]; - while (!TEST(SPSR, SPIF)) { /* nada */ }; - SPDR = buf[i + 1]; - } - while (!TEST(SPSR, SPIF)) { /* nada */ }; - SPI.endTransaction(); -} - -// Begin SPI transaction, set clock, bit order, data mode -void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { - spiConfig = SPISettings(spiClock, bitOrder, dataMode); - SPI.beginTransaction(spiConfig); -} - -#endif // SOFTWARE_SPI -#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.cpp b/Marlin/src/HAL/TEENSY40_41/Servo.cpp deleted file mode 100644 index ffb1102b14..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/Servo.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL Servo for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#ifdef __IMXRT1062__ - -#include "../../inc/MarlinConfig.h" - -#if HAS_SERVOS - -#include "Servo.h" - -int8_t libServo::attach(const int inPin) { - if (inPin > 0) servoPin = inPin; - return super::attach(servoPin); -} - -int8_t libServo::attach(const int inPin, const int inMin, const int inMax) { - if (inPin > 0) servoPin = inPin; - return super::attach(servoPin, inMin, inMax); -} - -void libServo::move(const int value) { - constexpr uint16_t servo_delay[] = SERVO_DELAY; - static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - if (attach(0) >= 0) { - write(value); - safe_delay(servo_delay[servoIndex]); - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); - } -} - -void libServo::detach() { - // PWMServo library does not have detach() function - //super::detach(); -} - -#endif // HAS_SERVOS -#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.h b/Marlin/src/HAL/TEENSY40_41/Servo.h deleted file mode 100644 index 699fd700c9..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/Servo.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Servo for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#include - -// Inherit and expand on core Servo library -class libServo : public PWMServo { - public: - int8_t attach(const int pin); - int8_t attach(const int pin, const int min, const int max); - void move(const int value); - void detach(void); - private: - typedef PWMServo super; - uint8_t servoPin; - uint16_t min_ticks; - uint16_t max_ticks; - uint8_t servoIndex; // Index into the channel data for this servo -}; diff --git a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp deleted file mode 100644 index 030a8c38af..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifdef __IMXRT1062__ - -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - -/** - * HAL PersistentStore for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#include "../shared/eeprom_api.h" -#include - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(E2END + 1) -#endif -size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } - -bool PersistentStore::access_start() { return true; } -bool PersistentStore::access_finish() { return true; } - -bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - while (size--) { - uint8_t * const p = (uint8_t * const)pos; - uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { - eeprom_write_byte(p, v); - if (eeprom_read_byte(p) != v) { - SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); - return true; - } - } - crc16(crc, &v, 1); - pos++; - value++; - } - return false; -} - -bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { - do { - uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; - crc16(crc, &c, 1); - pos++; - value++; - } while (--size); - return false; -} - -#endif // USE_WIRED_EEPROM -#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h deleted file mode 100644 index a05e911668..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Endstop Interrupts for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - * - * Without endstop interrupts the endstop pins must be polled continually in - * the temperature-ISR via endstops.update(), most of the time finding no change. - * With this feature endstops.update() is called only when we know that at - * least one endstop has changed state, saving valuable CPU cycles. - * - * This feature only works when all used endstop pins can generate an 'external interrupt'. - * - * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. - * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) - */ - -#include "../../module/endstops.h" - -// One ISR for all EXT-Interrupts -void endstop_ISR() { endstops.update(); } - -/** - * Endstop interrupts for Due based targets. - * On Due, all pins support external interrupt capability. - */ -void setup_endstop_interrupts() { - #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); -} diff --git a/Marlin/src/HAL/TEENSY40_41/fastio.h b/Marlin/src/HAL/TEENSY40_41/fastio.h deleted file mode 100644 index 52f991dfb8..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/fastio.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * Copyright (c) 2017 Victor Perez - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Fast I/O interfaces for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - * These use GPIO functions instead of Direct Port Manipulation, as on AVR. - */ - -#ifndef PWM - #define PWM OUTPUT -#endif - -#define READ(IO) digitalRead(IO) -#define WRITE(IO,V) digitalWrite(IO,V) - -#define _GET_MODE(IO) !is_output(IO) -#define _SET_MODE(IO,M) pinMode(IO, M) -#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ - -#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) - -#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ -#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ -#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ -#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) -#define SET_PWM(IO) _SET_MODE(IO, PWM) - -#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) - -#define IS_INPUT(IO) !is_output(IO) -#define IS_OUTPUT(IO) is_output(IO) - -#define PWM_PIN(P) digitalPinHasPWM(P) - -// digitalRead/Write wrappers -#define extDigitalRead(IO) digitalRead(IO) -#define extDigitalWrite(IO,V) digitalWrite(IO,V) diff --git a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h deleted file mode 100644 index 6a8540927b..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for HAL/TEENSY40_41." -#endif diff --git a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h deleted file mode 100644 index 5f1c4b1601..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once diff --git a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h deleted file mode 100644 index 998f1dcc0d..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if USE_FALLBACK_EEPROM - #define USE_WIRED_EEPROM 1 -#endif diff --git a/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h deleted file mode 100644 index fbfe7b0fc3..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Test TEENSY41 specific configuration values for errors at compile-time. - */ - -#if ENABLED(EMERGENCY_PARSER) - #error "EMERGENCY_PARSER is not yet implemented for Teensy 4.0/4.1. Disable EMERGENCY_PARSER to continue." -#endif - -#if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY - #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on Teensy 4.0/4.1." -#endif - -#if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." -#endif diff --git a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h deleted file mode 100644 index 4ad62d00fe..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Pins Debugging for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#warning "PINS_DEBUGGING is not fully supported for Teensy 4.0 / 4.1 so 'M43' may cause hangs." - -#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS - -#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin -#define PRINT_PORT(p) -#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0) -#define GET_ARRAY_PIN(p) pin_array[p].pin -#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital -#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0) -#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) -#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && (P) <= analogInputToDigitalPin(13)) || ((P) >= analogInputToDigitalPin(14) && (P) <= analogInputToDigitalPin(17)) -#define pwm_status(pin) HAL_pwm_status(pin) -#define GET_PINMODE(PIN) (VALID_PIN(pin) && IS_OUTPUT(pin)) -#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin - -struct pwm_pin_info_struct { - uint8_t type; // 0=no pwm, 1=flexpwm, 2=quad - uint8_t module; // 0-3, 0-3 - uint8_t channel; // 0=X, 1=A, 2=B - uint8_t muxval; // -}; - -#define M(a, b) ((((a) - 1) << 4) | (b)) - -const struct pwm_pin_info_struct pwm_pin_info[] = { - {1, M(1, 1), 0, 4}, // FlexPWM1_1_X 0 // AD_B0_03 - {1, M(1, 0), 0, 4}, // FlexPWM1_0_X 1 // AD_B0_02 - {1, M(4, 2), 1, 1}, // FlexPWM4_2_A 2 // EMC_04 - {1, M(4, 2), 2, 1}, // FlexPWM4_2_B 3 // EMC_05 - {1, M(2, 0), 1, 1}, // FlexPWM2_0_A 4 // EMC_06 - {1, M(2, 1), 1, 1}, // FlexPWM2_1_A 5 // EMC_08 - {1, M(2, 2), 1, 2}, // FlexPWM2_2_A 6 // B0_10 - {1, M(1, 3), 2, 6}, // FlexPWM1_3_B 7 // B1_01 - {1, M(1, 3), 1, 6}, // FlexPWM1_3_A 8 // B1_00 - {1, M(2, 2), 2, 2}, // FlexPWM2_2_B 9 // B0_11 - {2, M(1, 0), 0, 1}, // QuadTimer1_0 10 // B0_00 - {2, M(1, 2), 0, 1}, // QuadTimer1_2 11 // B0_02 - {2, M(1, 1), 0, 1}, // QuadTimer1_1 12 // B0_01 - {2, M(2, 0), 0, 1}, // QuadTimer2_0 13 // B0_03 - {2, M(3, 2), 0, 1}, // QuadTimer3_2 14 // AD_B1_02 - {2, M(3, 3), 0, 1}, // QuadTimer3_3 15 // AD_B1_03 - {0, M(1, 0), 0, 0}, - {0, M(1, 0), 0, 0}, - {2, M(3, 1), 0, 1}, // QuadTimer3_1 18 // AD_B1_01 - {2, M(3, 0), 0, 1}, // QuadTimer3_0 19 // AD_B1_00 - {0, M(1, 0), 0, 0}, - {0, M(1, 0), 0, 0}, - {1, M(4, 0), 1, 1}, // FlexPWM4_0_A 22 // AD_B1_08 - {1, M(4, 1), 1, 1}, // FlexPWM4_1_A 23 // AD_B1_09 - {1, M(1, 2), 0, 4}, // FlexPWM1_2_X 24 // AD_B0_12 - {1, M(1, 3), 0, 4}, // FlexPWM1_3_X 25 // AD_B0_13 - {0, M(1, 0), 0, 0}, - {0, M(1, 0), 0, 0}, - {1, M(3, 1), 2, 1}, // FlexPWM3_1_B 28 // EMC_32 - {1, M(3, 1), 1, 1}, // FlexPWM3_1_A 29 // EMC_31 - {0, M(1, 0), 0, 0}, - {0, M(1, 0), 0, 0}, - {0, M(1, 0), 0, 0}, - {1, M(2, 0), 2, 1}, // FlexPWM2_0_B 33 // EMC_07 - #ifdef ARDUINO_TEENSY40 - {1, M(1, 1), 2, 1}, // FlexPWM1_1_B 34 // SD_B0_03 - {1, M(1, 1), 1, 1}, // FlexPWM1_1_A 35 // SD_B0_02 - {1, M(1, 0), 2, 1}, // FlexPWM1_0_B 36 // SD_B0_01 - {1, M(1, 0), 1, 1}, // FlexPWM1_0_A 37 // SD_B0_00 - {1, M(1, 2), 2, 1}, // FlexPWM1_2_B 38 // SD_B0_05 - {1, M(1, 2), 1, 1}, // FlexPWM1_2_A 39 // SD_B0_04 - #endif - #ifdef ARDUINO_TEENSY41 - {0, M(1, 0), 0, 0}, - {0, M(1, 0), 0, 0}, - {1, M(2, 3), 1, 6}, // FlexPWM2_3_A 36 // B1_00 - {1, M(2, 3), 2, 6}, // FlexPWM2_3_B 37 // B1_01 - {0, M(1, 0), 0, 0}, - {0, M(1, 0), 0, 0}, - {0, M(1, 0), 0, 0}, - {0, M(1, 0), 0, 0}, - {1, M(1, 1), 2, 1}, // FlexPWM1_1_B 42 // SD_B0_03 - {1, M(1, 1), 1, 1}, // FlexPWM1_1_A 43 // SD_B0_02 - {1, M(1, 0), 2, 1}, // FlexPWM1_0_B 44 // SD_B0_01 - {1, M(1, 0), 1, 1}, // FlexPWM1_0_A 45 // SD_B0_00 - {1, M(1, 2), 2, 1}, // FlexPWM1_2_B 46 // SD_B0_05 - {1, M(1, 2), 1, 1}, // FlexPWM1_2_A 47 // SD_B0_04 - {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_0_B - {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_2_A - {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_2_B - {1, M(3, 3), 2, 1}, // FlexPWM3_3_B 51 // EMC_22 - {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_1_B - {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_1_A - {1, M(3, 0), 1, 1}, // FlexPWM3_0_A 53 // EMC_29 - #endif -}; - -void HAL_print_analog_pin(char buffer[], int8_t pin) { - if (pin <= 23) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 14)); - else if (pin <= 41) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 24)); -} - -void HAL_analog_pin_state(char buffer[], int8_t pin) { - if (pin <= 23) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 14)); - else if (pin <= 41) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 24)); -} - -#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), V); SERIAL_ECHO(buffer); }while(0) - -/** - * Print a pin's PWM status. - * Return true if it's currently a PWM pin. - */ -bool HAL_pwm_status(int8_t pin) { - char buffer[20]; // for the sprintf statements - const struct pwm_pin_info_struct *info; - - if (pin >= CORE_NUM_DIGITAL) return 0; - info = pwm_pin_info + pin; - - if (info->type == 0) return 0; - - /* TODO decode pwm value from timers */ - // for now just indicate if output is set as pwm - PWM_PRINT(*(portConfigRegister(pin)) == info->muxval); - return (*(portConfigRegister(pin)) == info->muxval); -} - -static void pwm_details(uint8_t pin) { /* TODO */ } diff --git a/Marlin/src/HAL/TEENSY40_41/spi_pins.h b/Marlin/src/HAL/TEENSY40_41/spi_pins.h deleted file mode 100644 index d6f8d41bf6..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/spi_pins.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL SPI Pins for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#define SCK_PIN 13 -#define MISO_PIN 12 -#define MOSI_PIN 11 -#define SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/TEENSY40_41/timers.cpp b/Marlin/src/HAL/TEENSY40_41/timers.cpp deleted file mode 100644 index 81c9b08c17..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/timers.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL Timers for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#ifdef __IMXRT1062__ - -#include "../../inc/MarlinConfig.h" - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - switch (timer_num) { - case 0: - CCM_CSCMR1 &= ~CCM_CSCMR1_PERCLK_CLK_SEL; // turn off 24mhz mode - CCM_CCGR1 |= CCM_CCGR1_GPT1_BUS(CCM_CCGR_ON); - - GPT1_CR = 0; // disable timer - GPT1_SR = 0x3F; // clear all prior status - GPT1_PR = GPT1_TIMER_PRESCALE - 1; - GPT1_CR |= GPT_CR_CLKSRC(1); //clock selection #1 (peripheral clock = 150 MHz) - GPT1_CR |= GPT_CR_ENMOD; //reset count to zero before enabling - GPT1_CR |= GPT_CR_OM1(1); // toggle mode - GPT1_OCR1 = (GPT1_TIMER_RATE / frequency) -1; // Initial compare value - GPT1_IR = GPT_IR_OF1IE; // Compare3 value - GPT1_CR |= GPT_CR_EN; //enable GPT2 counting at 150 MHz - - OUT_WRITE(15, HIGH); - attachInterruptVector(IRQ_GPT1, &stepTC_Handler); - NVIC_SET_PRIORITY(IRQ_GPT1, 16); - break; - case 1: - CCM_CSCMR1 &= ~CCM_CSCMR1_PERCLK_CLK_SEL; // turn off 24mhz mode - CCM_CCGR0 |= CCM_CCGR0_GPT2_BUS(CCM_CCGR_ON); - - GPT2_CR = 0; // disable timer - GPT2_SR = 0x3F; // clear all prior status - GPT2_PR = GPT2_TIMER_PRESCALE - 1; - GPT2_CR |= GPT_CR_CLKSRC(1); //clock selection #1 (peripheral clock = 150 MHz) - GPT2_CR |= GPT_CR_ENMOD; //reset count to zero before enabling - GPT2_CR |= GPT_CR_OM1(1); // toggle mode - GPT2_OCR1 = (GPT2_TIMER_RATE / frequency) -1; // Initial compare value - GPT2_IR = GPT_IR_OF1IE; // Compare3 value - GPT2_CR |= GPT_CR_EN; //enable GPT2 counting at 150 MHz - - OUT_WRITE(14, HIGH); - attachInterruptVector(IRQ_GPT2, &tempTC_Handler); - NVIC_SET_PRIORITY(IRQ_GPT2, 32); - break; - } -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case 0: - NVIC_ENABLE_IRQ(IRQ_GPT1); - break; - case 1: - NVIC_ENABLE_IRQ(IRQ_GPT2); - break; - } -} - -void HAL_timer_disable_interrupt(const uint8_t timer_num) { - switch (timer_num) { - case 0: NVIC_DISABLE_IRQ(IRQ_GPT1); break; - case 1: NVIC_DISABLE_IRQ(IRQ_GPT2); break; - } - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - asm volatile("dsb"); -} - -bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { - switch (timer_num) { - case 0: return (NVIC_IS_ENABLED(IRQ_GPT1)); - case 1: return (NVIC_IS_ENABLED(IRQ_GPT2)); - } - return false; -} - -void HAL_timer_isr_prologue(const uint8_t timer_num) { - switch (timer_num) { - case 0: - GPT1_SR = GPT_IR_OF1IE; // clear OF3 bit - break; - case 1: - GPT2_SR = GPT_IR_OF1IE; // clear OF3 bit - break; - } - asm volatile("dsb"); -} - -#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/timers.h b/Marlin/src/HAL/TEENSY40_41/timers.h deleted file mode 100644 index 7e4cd080cb..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/timers.h +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Timers for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#include - -// ------------------------ -// Defines -// ------------------------ - -#define FORCE_INLINE __attribute__((always_inline)) inline - -typedef uint32_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFFFFFE - -#define GPT_TIMER_RATE F_BUS_ACTUAL // 150MHz - -#define GPT1_TIMER_PRESCALE 2 -#define GPT2_TIMER_PRESCALE 10 - -#define GPT1_TIMER_RATE (GPT_TIMER_RATE / GPT1_TIMER_PRESCALE) // 75MHz -#define GPT2_TIMER_RATE (GPT_TIMER_RATE / GPT2_TIMER_PRESCALE) // 15MHz - -#ifndef STEP_TIMER_NUM - #define STEP_TIMER_NUM 0 // Timer Index for Stepper -#endif -#ifndef PULSE_TIMER_NUM - #define PULSE_TIMER_NUM STEP_TIMER_NUM -#endif -#ifndef TEMP_TIMER_NUM - #define TEMP_TIMER_NUM 1 // Timer Index for Temperature -#endif - -#define TEMP_TIMER_RATE 1000000 -#define TEMP_TIMER_FREQUENCY 1000 - -#define STEPPER_TIMER_RATE GPT1_TIMER_RATE -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) -#define STEPPER_TIMER_PRESCALE ((GPT_TIMER_RATE / 1000000) / STEPPER_TIMER_TICKS_PER_US) - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) -#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) - -#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) -#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) - -#ifndef HAL_STEP_TIMER_ISR - #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() // GPT1_Handler() -#endif -#ifndef HAL_TEMP_TIMER_ISR - #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() // GPT2_Handler() -#endif - -extern "C" void stepTC_Handler(); -extern "C" void tempTC_Handler(); - -void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); - -FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { - switch (timer_num) { - case 0: - GPT1_OCR1 = compare - 1; - break; - case 1: - GPT2_OCR1 = compare - 1; - break; - } -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { - switch (timer_num) { - case 0: return GPT1_OCR1; - case 1: return GPT2_OCR1; - } - return 0; -} - -FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { - switch (timer_num) { - case 0: return GPT1_CNT; - case 1: return GPT2_CNT; - } - return 0; -} - -void HAL_timer_enable_interrupt(const uint8_t timer_num); -void HAL_timer_disable_interrupt(const uint8_t timer_num); -bool HAL_timer_interrupt_enabled(const uint8_t timer_num); - -void HAL_timer_isr_prologue(const uint8_t timer_num); -//void HAL_timer_isr_epilogue(const uint8_t timer_num) {} -#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp deleted file mode 100644 index 8b05ddb153..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -#ifdef __IMXRT1062__ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(USE_WATCHDOG) - -#include "watchdog.h" - -// 4 seconds timeout -#define WDTO 4 //seconds - -uint8_t timeoutval = (WDTO - 0.5f) / 0.5f; - -void watchdog_init() { - - CCM_CCGR3 |= CCM_CCGR3_WDOG1(3); // enable WDOG1 clocks - WDOG1_WMCR = 0; // disable power down PDE - WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval); - WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE; - -} - -void HAL_watchdog_refresh() { - // Watchdog refresh sequence - WDOG1_WSR = 0x5555; - WDOG1_WSR = 0xAAAA; -} - -#endif // USE_WATCHDOG -#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.h b/Marlin/src/HAL/TEENSY40_41/watchdog.h deleted file mode 100644 index 03ab151b07..0000000000 --- a/Marlin/src/HAL/TEENSY40_41/watchdog.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) - */ - -void watchdog_init(); - -void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h index ef17d19170..49efe490d7 100644 --- a/Marlin/src/HAL/platforms.h +++ b/Marlin/src/HAL/platforms.h @@ -1,52 +1,34 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once +#ifndef _HAL_PLATFORMS_H_ +#define _HAL_PLATFORMS_H_ -#define XSTR(V...) #V +#ifndef HAL_PLATFORM #ifdef __AVR__ - #define HAL_PATH(PATH, NAME) XSTR(PATH/AVR/NAME) + #define HAL_PLATFORM HAL_AVR #elif defined(ARDUINO_ARCH_SAM) - #define HAL_PATH(PATH, NAME) XSTR(PATH/DUE/NAME) + #define HAL_PLATFORM HAL_DUE #elif defined(__MK20DX256__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY31_32/NAME) + #define HAL_PLATFORM HAL_TEENSY31_32 #elif defined(__MK64FX512__) || defined(__MK66FX1M0__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY35_36/NAME) -#elif defined(__IMXRT1062__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY40_41/NAME) + #define HAL_PLATFORM HAL_TEENSY35_36 #elif defined(TARGET_LPC1768) - #define HAL_PATH(PATH, NAME) XSTR(PATH/LPC1768/NAME) + #define HAL_PLATFORM HAL_LPC1768 #elif defined(__STM32F1__) || defined(TARGET_STM32F1) - #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32F1/NAME) -#elif defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) - #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32_F4_F7/NAME) -#elif defined(ARDUINO_ARCH_STM32) - #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32/NAME) + #define HAL_PLATFORM HAL_STM32F1 +#elif defined(STM32F4) || defined(STM32F4xx) + #define HAL_PLATFORM HAL_STM32F4 +#elif defined(STM32F7) + #define HAL_PLATFORM HAL_STM32F7 #elif defined(ARDUINO_ARCH_ESP32) - #define HAL_PATH(PATH, NAME) XSTR(PATH/ESP32/NAME) -#elif defined(__PLAT_LINUX__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/LINUX/NAME) -#elif defined(__SAMD51__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/SAMD51/NAME) + #define HAL_PLATFORM HAL_ESP32 #else #error "Unsupported Platform!" #endif + +#endif // HAL_PLATFORM + +#define XSTR_(M) #M +#define XSTR(M) XSTR_(M) +#define HAL_PATH(PATH, NAME) XSTR(PATH/HAL_PLATFORM/NAME) + +#endif // _HAL_PLATFORMS_H_ diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h index d98e960848..04771a2e03 100644 --- a/Marlin/src/HAL/shared/Delay.h +++ b/Marlin/src/HAL/shared/Delay.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Busy wait delay cycles routines: @@ -29,81 +28,57 @@ * DELAY_US(count): Delay execution in microseconds */ +#ifndef MARLIN_DELAY_H +#define MARLIN_DELAY_H + #include "../../core/macros.h" #if defined(__arm__) || defined(__thumb__) - #if __CORTEX_M == 7 + // https://blueprints.launchpad.net/gcc-arm-embedded/+spec/delay-cycles - // Cortex-M3 through M7 can use the cycle counter of the DWT unit - // https://www.anthonyvh.com/2017/05/18/cortex_m-cycle_counter/ + #define nop() __asm__ __volatile__("nop;\n\t":::) - FORCE_INLINE static void enableCycleCounter() { - CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; + FORCE_INLINE static void __delay_4cycles(uint32_t cy) { // +1 cycle + #if ARCH_PIPELINE_RELOAD_CYCLES < 2 + #define EXTRA_NOP_CYCLES A("nop") + #else + #define EXTRA_NOP_CYCLES "" + #endif - #if __CORTEX_M == 7 - DWT->LAR = 0xC5ACCE55; // Unlock DWT on the M7 - #endif + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + L("1") + A("subs %[cnt],#1") + EXTRA_NOP_CYCLES + A("bne 1b") + : [cnt]"+r"(cy) // output: +r means input+output + : // input: + : "cc" // clobbers: + ); + } - DWT->CYCCNT = 0; - DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; - } + // Delay in cycles + FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { - FORCE_INLINE volatile uint32_t getCycleCount() { return DWT->CYCCNT; } + if (__builtin_constant_p(x)) { + #define MAXNOPS 4 - FORCE_INLINE static void DELAY_CYCLES(const uint32_t x) { - const uint32_t endCycles = getCycleCount() + x; - while (PENDING(getCycleCount(), endCycles)) {} - } - - #else - - // https://blueprints.launchpad.net/gcc-arm-embedded/+spec/delay-cycles - - #define nop() __asm__ __volatile__("nop;\n\t":::) - - FORCE_INLINE static void __delay_4cycles(uint32_t cy) { // +1 cycle - #if ARCH_PIPELINE_RELOAD_CYCLES < 2 - #define EXTRA_NOP_CYCLES A("nop") - #else - #define EXTRA_NOP_CYCLES "" - #endif - - __asm__ __volatile__( - A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax - L("1") - A("subs %[cnt],#1") - EXTRA_NOP_CYCLES - A("bne 1b") - : [cnt]"+r"(cy) // output: +r means input+output - : // input: - : "cc" // clobbers: - ); - } - - // Delay in cycles - FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { - - if (__builtin_constant_p(x)) { - #define MAXNOPS 4 - - if (x <= (MAXNOPS)) { - switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } - } - else { // because of +1 cycle inside delay_4cycles - const uint32_t rem = (x - 1) % (MAXNOPS); - switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } - if ((x = (x - 1) / (MAXNOPS))) - __delay_4cycles(x); // if need more then 4 nop loop is more optimal - } - #undef MAXNOPS + if (x <= (MAXNOPS)) { + switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } } - else if ((x >>= 2)) - __delay_4cycles(x); + else { // because of +1 cycle inside delay_4cycles + const uint32_t rem = (x - 1) % (MAXNOPS); + switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } + if ((x = (x - 1) / (MAXNOPS))) + __delay_4cycles(x); // if need more then 4 nop loop is more optimal + } + #undef MAXNOPS } - #undef nop - - #endif + else if ((x >>= 2)) + __delay_4cycles(x); + } + #undef nop #elif defined(__AVR__) @@ -144,9 +119,19 @@ } #undef nop -#elif defined(__PLAT_LINUX__) || defined(ESP32) +#elif defined(ESP32) - // specified inside platform + FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { + unsigned long ccount, stop; + + __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); + + stop = ccount + x; // This can overflow + + while (ccount < stop) { // This doesn't deal with overflows + __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); + } + } #else @@ -155,7 +140,9 @@ #endif // Delay in nanoseconds -#define DELAY_NS(x) DELAY_CYCLES( (x) * (F_CPU / 1000000UL) / 1000UL ) +#define DELAY_NS(x) DELAY_CYCLES( (x) * (F_CPU/1000000L) / 1000L ) // Delay in microseconds -#define DELAY_US(x) DELAY_CYCLES( (x) * (F_CPU / 1000000UL) ) +#define DELAY_US(x) DELAY_CYCLES( (x) * (F_CPU/1000000L) ) + +#endif // MARLIN_DELAY_H diff --git a/Marlin/src/HAL/shared/HAL_SPI.h b/Marlin/src/HAL/shared/HAL_SPI.h index 59af554806..388b9f9cfb 100644 --- a/Marlin/src/HAL/shared/HAL_SPI.h +++ b/Marlin/src/HAL/shared/HAL_SPI.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** - * HAL/shared/HAL_SPI.h + * HAL/HAL_SPI.h * Core Marlin definitions for SPI, implemented in the HALs */ -#include "Marduino.h" +#ifndef _HAL_SPI_H_ +#define _HAL_SPI_H_ + #include /** @@ -54,40 +55,28 @@ #define SPI_SPEED_5 5 // Set SCK rate to 1/32 of max rate #define SPI_SPEED_6 6 // Set SCK rate to 1/64 of max rate -// +#define SPI_LSBFIRST 0 +#define SPI_MSBFIRST 1 + +#define SPI_DATAMODE_0 0x00 +#define SPI_DATAMODE_1 0x04 +#define SPI_DATAMODE_2 0x08 +#define SPI_DATAMODE_3 0x0C + // Standard SPI functions -// - -// Initialize SPI bus -void spiBegin(); - -// Configure SPI for specified SPI speed +/** Initialize SPI bus */ +void spiBegin(void); +/** Configure SPI for specified SPI speed */ void spiInit(uint8_t spiRate); - -// Write single byte to SPI +/** Write single byte to SPI */ void spiSend(uint8_t b); - -// Read single byte from SPI -uint8_t spiRec(); - -// Read from SPI into buffer +/** Read single byte from SPI */ +uint8_t spiRec(void); +/** Read from SPI into buffer */ void spiRead(uint8_t* buf, uint16_t nbyte); - -// Write token and then write from 512 byte buffer to SPI (for SD card) +/** Write token and then write from 512 byte buffer to SPI (for SD card) */ void spiSendBlock(uint8_t token, const uint8_t* buf); - -// Begin SPI transaction, set clock, bit order, data mode +/** Begin SPI transaction, set clock, bit order, data mode */ void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode); -// -// Extended SPI functions taking a channel number (Hardware SPI only) -// - -// Write single byte to specified SPI channel -void spiSend(uint32_t chan, byte b); - -// Write buffer to specified SPI channel -void spiSend(uint32_t chan, const uint8_t* buf, size_t n); - -// Read single byte from specified SPI channel -uint8_t spiRec(uint32_t chan); +#endif // _HAL_SPI_H_ diff --git a/Marlin/src/HAL/shared/HAL_ST7920.h b/Marlin/src/HAL/shared/HAL_ST7920.h deleted file mode 100644 index 4e362f96ba..0000000000 --- a/Marlin/src/HAL/shared/HAL_ST7920.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL/ST7920.h - * For the HALs that provide direct access to the ST7920 display - * (bypassing U8G), it will allow the LIGHTWEIGHT_UI to operate. - */ - -#if BOTH(HAS_MARLINUI_U8GLIB, LIGHTWEIGHT_UI) - void ST7920_cs(); - void ST7920_ncs(); - void ST7920_set_cmd(); - void ST7920_set_dat(); - void ST7920_write_byte(const uint8_t data); -#endif diff --git a/Marlin/src/HAL/shared/HAL_spi_L6470.cpp b/Marlin/src/HAL/shared/HAL_spi_L6470.cpp deleted file mode 100644 index bd85dbe7bd..0000000000 --- a/Marlin/src/HAL/shared/HAL_spi_L6470.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Software L6470 SPI functions originally from Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_L64XX - -#include "Delay.h" - -#include "../../core/serial.h" -#include "../../libs/L64XX/L64XX_Marlin.h" - -// Make sure GCC optimizes this file. -// Note that this line triggers a bug in GCC which is fixed by casting. -// See the note below. -#pragma GCC optimize (3) - -// run at ~4Mhz -inline uint8_t L6470_SpiTransfer_Mode_0(uint8_t b) { // using Mode 0 - for (uint8_t bits = 8; bits--;) { - WRITE(L6470_CHAIN_MOSI_PIN, b & 0x80); - b <<= 1; // little setup time - - WRITE(L6470_CHAIN_SCK_PIN, HIGH); - DELAY_NS(125); // 10 cycles @ 84mhz - - b |= (READ(L6470_CHAIN_MISO_PIN) != 0); - - WRITE(L6470_CHAIN_SCK_PIN, LOW); - DELAY_NS(125); // 10 cycles @ 84mhz - } - return b; -} - -inline uint8_t L6470_SpiTransfer_Mode_3(uint8_t b) { // using Mode 3 - for (uint8_t bits = 8; bits--;) { - WRITE(L6470_CHAIN_SCK_PIN, LOW); - WRITE(L6470_CHAIN_MOSI_PIN, b & 0x80); - - DELAY_NS(125); // 10 cycles @ 84mhz - WRITE(L6470_CHAIN_SCK_PIN, HIGH); - DELAY_NS(125); // Need more delay for fast CPUs - - b <<= 1; // little setup time - b |= (READ(L6470_CHAIN_MISO_PIN) != 0); - } - DELAY_NS(125); // 10 cycles @ 84mhz - return b; -} - -/** - * L64XX methods for SPI init and transfer - */ -void L64XX_Marlin::spi_init() { - OUT_WRITE(L6470_CHAIN_SS_PIN, HIGH); - OUT_WRITE(L6470_CHAIN_SCK_PIN, HIGH); - OUT_WRITE(L6470_CHAIN_MOSI_PIN, HIGH); - SET_INPUT(L6470_CHAIN_MISO_PIN); - - #if PIN_EXISTS(L6470_BUSY) - SET_INPUT(L6470_BUSY_PIN); - #endif - - OUT_WRITE(L6470_CHAIN_MOSI_PIN, HIGH); -} - -uint8_t L64XX_Marlin::transfer_single(uint8_t data, int16_t ss_pin) { - // First device in chain has data sent last - extDigitalWrite(ss_pin, LOW); - - DISABLE_ISRS(); // Disable interrupts during SPI transfer (can't allow partial command to chips) - const uint8_t data_out = L6470_SpiTransfer_Mode_3(data); - ENABLE_ISRS(); // Enable interrupts - - extDigitalWrite(ss_pin, HIGH); - return data_out; -} - -uint8_t L64XX_Marlin::transfer_chain(uint8_t data, int16_t ss_pin, uint8_t chain_position) { - uint8_t data_out = 0; - - // first device in chain has data sent last - extDigitalWrite(ss_pin, LOW); - - for (uint8_t i = L64XX::chain[0]; !L64xxManager.spi_abort && i >= 1; i--) { // Send data unless aborted - DISABLE_ISRS(); // Disable interrupts during SPI transfer (can't allow partial command to chips) - const uint8_t temp = L6470_SpiTransfer_Mode_3(uint8_t(i == chain_position ? data : dSPIN_NOP)); - ENABLE_ISRS(); // Enable interrupts - if (i == chain_position) data_out = temp; - } - - extDigitalWrite(ss_pin, HIGH); - return data_out; -} - -/** - * Platform-supplied L6470 buffer transfer method - */ -void L64XX_Marlin::transfer(uint8_t L6470_buf[], const uint8_t length) { - // First device in chain has its data sent last - - if (spi_active) { // Interrupted SPI transfer so need to - WRITE(L6470_CHAIN_SS_PIN, HIGH); // guarantee min high of 650ns - DELAY_US(1); - } - - WRITE(L6470_CHAIN_SS_PIN, LOW); - for (uint8_t i = length; i >= 1; i--) - L6470_SpiTransfer_Mode_3(uint8_t(L6470_buf[i])); - WRITE(L6470_CHAIN_SS_PIN, HIGH); -} - -#pragma GCC reset_options - -#endif // HAS_L64XX diff --git a/Marlin/src/HAL/shared/I2cEeprom.cpp b/Marlin/src/HAL/shared/I2cEeprom.cpp new file mode 100644 index 0000000000..a73cefa2d3 --- /dev/null +++ b/Marlin/src/HAL/shared/I2cEeprom.cpp @@ -0,0 +1,159 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: functions for I2C connected external EEPROM. + * Not platform dependent. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(I2C_EEPROM) + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include HAL_PATH(.., HAL.h) +#include + +// -------------------------------------------------------------------------- +// Externals +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Function prototypes +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +static uint8_t eeprom_device_address = 0x50; + +static void eeprom_init(void) { + static bool eeprom_initialized = false; + if (!eeprom_initialized) { + Wire.begin(); + eeprom_initialized = true; + } +} + +void eeprom_write_byte(unsigned char *pos, unsigned char value) { + unsigned eeprom_address = (unsigned) pos; + + eeprom_init(); + + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)(eeprom_address >> 8)); // MSB + Wire.write((int)(eeprom_address & 0xFF)); // LSB + Wire.write(value); + Wire.endTransmission(); + + // wait for write cycle to complete + // this could be done more efficiently with "acknowledge polling" + delay(5); +} + +// WARNING: address is a page address, 6-bit end will wrap around +// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes +void eeprom_update_block(const void *pos, void* eeprom_address, size_t n) { + eeprom_init(); + + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)((unsigned)eeprom_address >> 8)); // MSB + Wire.write((int)((unsigned)eeprom_address & 0xFF)); // LSB + Wire.endTransmission(); + + uint8_t *ptr = (uint8_t*)pos; + uint8_t flag = 0; + Wire.requestFrom(eeprom_device_address, (byte)n); + for (byte c = 0; c < n && Wire.available(); c++) + flag |= Wire.read() ^ ptr[c]; + + if (flag) { + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)((unsigned)eeprom_address >> 8)); // MSB + Wire.write((int)((unsigned)eeprom_address & 0xFF)); // LSB + Wire.write((uint8_t*)pos, n); + Wire.endTransmission(); + + // wait for write cycle to complete + // this could be done more efficiently with "acknowledge polling" + delay(5); + } +} + + +unsigned char eeprom_read_byte(unsigned char *pos) { + byte data = 0xFF; + unsigned eeprom_address = (unsigned)pos; + + eeprom_init(); + + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)(eeprom_address >> 8)); // MSB + Wire.write((int)(eeprom_address & 0xFF)); // LSB + Wire.endTransmission(); + Wire.requestFrom(eeprom_device_address, (byte)1); + return Wire.available() ? Wire.read() : 0xFF; +} + +// maybe let's not read more than 30 or 32 bytes at a time! +void eeprom_read_block(void* pos, const void* eeprom_address, size_t n) { + eeprom_init(); + + Wire.beginTransmission(eeprom_device_address); + Wire.write((int)((unsigned)eeprom_address >> 8)); // MSB + Wire.write((int)((unsigned)eeprom_address & 0xFF)); // LSB + Wire.endTransmission(); + Wire.requestFrom(eeprom_device_address, (byte)n); + for (byte c = 0; c < n; c++ ) + if (Wire.available()) *((uint8_t*)pos + c) = Wire.read(); +} + + +#endif // ENABLED(I2C_EEPROM) diff --git a/Marlin/src/HAL/shared/Marduino.h b/Marlin/src/HAL/shared/Marduino.h deleted file mode 100644 index 3003f3cc28..0000000000 --- a/Marlin/src/HAL/shared/Marduino.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HAL/shared/Marduino.h - */ - -#undef DISABLED // Redefined by ESP32 -#undef M_PI // Redefined by all -#undef _BV // Redefined by some -#undef sq // Redefined by teensy3/wiring.h -#undef SBI // Redefined by arduino/const_functions.h -#undef CBI // Redefined by arduino/const_functions.h -#undef UNUSED // Redefined by stm32f4xx_hal_def.h - -#include // NOTE: If included earlier then this line is a NOOP - -#undef DISABLED -#define DISABLED(V...) DO(DIS,&&,V) - -#undef _BV -#define _BV(b) (1UL << (b)) - -#undef sq -#define sq(x) ((x)*(x)) - -#ifndef SBI - #define SBI(A,B) (A |= (1 << (B))) -#endif - -#ifndef CBI - #define CBI(A,B) (A &= ~(1 << (B))) -#endif - -#ifndef __AVR__ - #ifndef strchr_P // Some platforms define a macro (DUE, teensy35) - inline const char* strchr_P(const char *s, int c) { return strchr(s,c); } - //#define strchr_P(s,c) strchr(s,c) - #endif - - #ifndef snprintf_P - #define snprintf_P snprintf - #endif - #ifndef vsnprintf_P - #define vsnprintf_P vsnprintf - #endif -#endif - -// Restart causes -#define RST_POWER_ON 1 -#define RST_EXTERNAL 2 -#define RST_BROWN_OUT 4 -#define RST_WATCHDOG 8 -#define RST_JTAG 16 -#define RST_SOFTWARE 32 -#define RST_BACKUP 64 - -#ifndef M_PI - #define M_PI 3.14159265358979323846f -#endif - -// Remove compiler warning on an unused variable -#ifndef UNUSED - #define UNUSED(x) ((void)(x)) -#endif diff --git a/Marlin/src/HAL/shared/SpiEeprom.cpp b/Marlin/src/HAL/shared/SpiEeprom.cpp new file mode 100644 index 0000000000..d63f52fb38 --- /dev/null +++ b/Marlin/src/HAL/shared/SpiEeprom.cpp @@ -0,0 +1,119 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Description: functions for SPI connected external EEPROM. + * Not platform dependent. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SPI_EEPROM) + +#include HAL_PATH(.., HAL.h) + +#define CMD_WREN 6 // WREN +#define CMD_READ 2 // WRITE +#define CMD_WRITE 2 // WRITE + +uint8_t eeprom_read_byte(uint8_t* pos) { + uint8_t v; + uint8_t eeprom_temp[3]; + + // set read location + // begin transmission from device + eeprom_temp[0] = CMD_READ; + eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; // addr High + eeprom_temp[2] = (unsigned)pos& 0xFF; // addr Low + WRITE(SPI_EEPROM1_CS, HIGH); + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + v = spiRec(SPI_CHAN_EEPROM1); + WRITE(SPI_EEPROM1_CS, HIGH); + return v; +} + +void eeprom_read_block(void* dest, const void* eeprom_address, size_t n) { + uint8_t eeprom_temp[3]; + + // set read location + // begin transmission from device + eeprom_temp[0] = CMD_READ; + eeprom_temp[1] = ((unsigned)eeprom_address>>8) & 0xFF; // addr High + eeprom_temp[2] = (unsigned)eeprom_address& 0xFF; // addr Low + WRITE(SPI_EEPROM1_CS, HIGH); + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + uint8_t *p_dest = (uint8_t *)dest; + while (n--) + *p_dest++ = spiRec(SPI_CHAN_EEPROM1); + WRITE(SPI_EEPROM1_CS, HIGH); +} + +void eeprom_write_byte(uint8_t* pos, uint8_t value) { + uint8_t eeprom_temp[3]; + + /*write enable*/ + eeprom_temp[0] = CMD_WREN; + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 1); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(1); + + /*write addr*/ + eeprom_temp[0] = CMD_WRITE; + eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; //addr High + eeprom_temp[2] = (unsigned)pos & 0xFF; //addr Low + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + spiSend(SPI_CHAN_EEPROM1, value); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(7); // wait for page write to complete +} + +void eeprom_update_block(const void* src, void* eeprom_address, size_t n) { + uint8_t eeprom_temp[3]; + + /*write enable*/ + eeprom_temp[0] = CMD_WREN; + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 1); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(1); + + /*write addr*/ + eeprom_temp[0] = CMD_WRITE; + eeprom_temp[1] = ((unsigned)eeprom_address>>8) & 0xFF; //addr High + eeprom_temp[2] = (unsigned)eeprom_address & 0xFF; //addr Low + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + spiSend(SPI_CHAN_EEPROM1, (const uint8_t*)src, n); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(7); // wait for page write to complete +} + + +#endif // ENABLED(SPI_EEPROM) diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index 6cf5e055e1..95f1fc0b0f 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,14 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#if defined(__arm__) || defined(__thumb__) #include "backtrace.h" + +#if defined(__arm__) || defined(__thumb__) + #include "unwinder.h" #include "unwmemaccess.h" @@ -34,7 +36,7 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { (*p)++; - SERIAL_CHAR('#'); SERIAL_PRINT(*p, DEC); SERIAL_ECHOPGM(" : "); + SERIAL_CHAR('#'); SERIAL_PRINT(*p,DEC); SERIAL_ECHOPGM(" : "); SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, HEX); SERIAL_CHAR('+'); SERIAL_PRINT(bte->address - bte->function,DEC); SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address,HEX); SERIAL_CHAR('\n'); @@ -63,7 +65,7 @@ static const UnwindCallbacks UnwCallbacks = { #endif }; -void backtrace() { +void backtrace(void) { UnwindFrame btf; uint32_t sp = 0, lr = 0, pc = 0; @@ -86,13 +88,14 @@ void backtrace() { btf.pc = pc | 1; // Force Thumb, as CORTEX only support it // Perform a backtrace - SERIAL_ERROR_MSG("Backtrace:"); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Backtrace:"); int ctr = 0; UnwindStart(&btf, &UnwCallbacks, &ctr); } #else // !__arm__ && !__thumb__ -void backtrace() {} +void backtrace(void) {} #endif diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.h b/Marlin/src/HAL/shared/backtrace/backtrace.h index fccadedaa5..c2761b9f5a 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.h +++ b/Marlin/src/HAL/shared/backtrace/backtrace.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,14 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef _BACKTRACE_H_ +#define _BACKTRACE_H_ // Perform a backtrace to the serial port -void backtrace(); +void backtrace(void); + +#endif \ No newline at end of file diff --git a/Marlin/src/HAL/shared/backtrace/unwarm.cpp b/Marlin/src/HAL/shared/backtrace/unwarm.cpp index cdc9c06c61..13079817ba 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarm.cpp @@ -23,7 +23,7 @@ #include "unwarm.h" #include "unwarmmem.h" -#ifdef UNW_DEBUG +#if defined(UNW_DEBUG) /** * Printf wrapper. @@ -78,7 +78,7 @@ void UnwInitState(UnwState * const state, /**< Pointer to structure to fill. } // Detect if function names are available -static int __attribute__ ((noinline)) has_function_names() { +static int __attribute__ ((noinline)) has_function_names(void) { uint32_t flag_word = ((uint32_t*)(((uint32_t)(&has_function_names)) & (-4))) [-1]; return ((flag_word & 0xFF000000) == 0xFF000000) ? 1 : 0; } @@ -93,7 +93,7 @@ bool UnwReportRetAddr(UnwState * const state, uint32_t addr) { UnwReport entry; // We found two acceptable values. - entry.name = nullptr; + entry.name = NULL; entry.address = addr & 0xFFFFFFFE; // Remove Thumb bit entry.function = 0; diff --git a/Marlin/src/HAL/shared/backtrace/unwarm.h b/Marlin/src/HAL/shared/backtrace/unwarm.h index 3128e354cc..8ecdeba8a5 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm.h +++ b/Marlin/src/HAL/shared/backtrace/unwarm.h @@ -11,7 +11,8 @@ * File Description: Internal interface between the ARM unwinding sub-modules. **************************************************************************/ -#pragma once +#ifndef UNWARM_H +#define UNWARM_H #include "unwinder.h" @@ -103,10 +104,10 @@ typedef struct { * Macros **************************************************************************/ -#define M_IsOriginValid(v) !!((v) & 0x7F) +#define M_IsOriginValid(v) (((v) & 0x7F) ? true : false) #define M_Origin2Str(v) ((v) ? "VALID" : "INVALID") -#ifdef UNW_DEBUG +#if defined(UNW_DEBUG) #define UnwPrintd1(a) state->cb->printf(a) #define UnwPrintd2(a,b) state->cb->printf(a,b) #define UnwPrintd3(a,b,c) state->cb->printf(a,b,c) @@ -138,3 +139,5 @@ bool UnwReportRetAddr(UnwState * const state, uint32_t addr); bool UnwMemWriteRegister(UnwState * const state, const uint32_t addr, const RegData * const reg); bool UnwMemReadRegister(UnwState * const state, const uint32_t addr, RegData * const reg); void UnwMemHashGC(UnwState * const state); + +#endif // UNWARM_H diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp index 0ec9bd56af..09528885f7 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp @@ -32,17 +32,23 @@ * \retval false This is not a data-processing instruction, */ static bool isDataProc(uint32_t instr) { + uint8_t opcode = (instr & 0x01E00000) >> 21; - if ((instr & 0xFC000000) != 0xE0000000) return false; + bool S = (instr & 0x00100000) ? true : false; - /* TST, TEQ, CMP and CMN all require S to be set */ - bool S = !!(instr & 0x00100000); - if (!S && opcode >= 8 && opcode <= 11) return false; - - return true; + if ((instr & 0xFC000000) != 0xE0000000) { + return false; + } + else if (!S && opcode >= 8 && opcode <= 11) { + /* TST, TEQ, CMP and CMN all require S to be set */ + return false; + } + else + return true; } UnwResult UnwStartArm(UnwState * const state) { + bool found = false; uint16_t t = UNW_MAX_INSTR_COUNT; @@ -50,8 +56,9 @@ UnwResult UnwStartArm(UnwState * const state) { uint32_t instr; /* Attempt to read the instruction */ - if (!state->cb->readW(state->regData[15].v, &instr)) + if (!state->cb->readW(state->regData[15].v, &instr)) { return UNWIND_IREAD_W_FAIL; + } UnwPrintd4("A %x %x %08x:", state->regData[13].v, state->regData[15].v, instr); @@ -96,20 +103,31 @@ UnwResult UnwStartArm(UnwState * const state) { } /* Determine the return mode */ - if (state->regData[rn].v & 0x1) /* Branching to THUMB */ - return UnwStartThumb(state); + if (state->regData[rn].v & 0x1) { - /* Branch to ARM */ - /* Account for the auto-increment which isn't needed */ - state->regData[15].v -= 4; + /* Branching to THUMB */ + return UnwStartThumb(state); + } + else { + + /* Branch to ARM */ + + /* Account for the auto-increment which isn't needed */ + state->regData[15].v -= 4; + } } /* Branch */ else if ((instr & 0xFF000000) == 0xEA000000) { - int32_t offset = (instr & 0x00FFFFFF) << 2; + int32_t offset = (instr & 0x00FFFFFF); + + /* Shift value */ + offset = offset << 2; /* Sign extend if needed */ - if (offset & 0x02000000) offset |= 0xFC000000; + if (offset & 0x02000000) { + offset |= 0xFC000000; + } UnwPrintd2("B %d\n", offset); @@ -124,21 +142,23 @@ UnwResult UnwStartArm(UnwState * const state) { /* MRS */ else if ((instr & 0xFFBF0FFF) == 0xE10F0000) { +#if defined(UNW_DEBUG) + bool R = (instr & 0x00400000) ? true : false; +#endif uint8_t rd = (instr & 0x0000F000) >> 12; - #ifdef UNW_DEBUG - const bool R = !!(instr & 0x00400000); - UnwPrintd4("MRS r%d,%s\t; r%d invalidated", rd, R ? "SPSR" : "CPSR", rd); - #endif + + UnwPrintd4("MRS r%d,%s\t; r%d invalidated", rd, R ? "SPSR" : "CPSR", rd); /* Status registers untracked */ state->regData[rd].o = REG_VAL_INVALID; } /* MSR */ else if ((instr & 0xFFB0F000) == 0xE120F000) { - #ifdef UNW_DEBUG - UnwPrintd2("MSR %s_?, ???", (instr & 0x00400000) ? "SPSR" : "CPSR"); - #endif +#if defined(UNW_DEBUG) + bool R = (instr & 0x00400000) ? true : false; + UnwPrintd2("MSR %s_?, ???", R ? "SPSR" : "CPSR"); +#endif /* Status registers untracked. * Potentially this could change processor mode and switch * banked registers r8-r14. Most likely is that r13 (sp) will @@ -150,18 +170,18 @@ UnwResult UnwStartArm(UnwState * const state) { } /* Data processing */ else if (isDataProc(instr)) { - bool I = !!(instr & 0x02000000); + bool I = (instr & 0x02000000) ? true : false; uint8_t opcode = (instr & 0x01E00000) >> 21; - #ifdef UNW_DEBUG - bool S = !!(instr & 0x00100000); - #endif +#if defined(UNW_DEBUG) + bool S = (instr & 0x00100000) ? true : false; +#endif uint8_t rn = (instr & 0x000F0000) >> 16; uint8_t rd = (instr & 0x0000F000) >> 12; uint16_t operand2 = (instr & 0x00000FFF); uint32_t op2val; int op2origin; - switch (opcode) { + switch(opcode) { case 0: UnwPrintd4("AND%s r%d,r%d,", S ? "S" : "", rd, rn); break; case 1: UnwPrintd4("EOR%s r%d,r%d,", S ? "S" : "", rd, rn); break; case 2: UnwPrintd4("SUB%s r%d,r%d,", S ? "S" : "", rd, rn); break; @@ -197,23 +217,26 @@ UnwResult UnwStartArm(UnwState * const state) { /* Register and shift */ uint8_t rm = (operand2 & 0x000F); - uint8_t regShift = !!(operand2 & 0x0010); + uint8_t regShift = (operand2 & 0x0010) ? true : false; uint8_t shiftType = (operand2 & 0x0060) >> 5; uint32_t shiftDist; - #ifdef UNW_DEBUG - const char * const shiftMnu[4] = { "LSL", "LSR", "ASR", "ROR" }; - #endif +#if defined(UNW_DEBUG) + const char * const shiftMnu[4] = { "LSL", "LSR", "ASR", "ROR" }; +#endif UnwPrintd2("r%d ", rm); /* Get the shift distance */ if (regShift) { + uint8_t rs = (operand2 & 0x0F00) >> 8; if (operand2 & 0x00800) { + UnwPrintd1("\nError: Bit should be zero\n"); return UNWIND_ILLEGAL_INSTR; } else if (rs == 15) { + UnwPrintd1("\nError: Cannot use R15 with register shift\n"); return UNWIND_ILLEGAL_INSTR; } @@ -227,33 +250,46 @@ UnwResult UnwStartArm(UnwState * const state) { else { shiftDist = (operand2 & 0x0F80) >> 7; op2origin = REG_VAL_FROM_CONST; - if (shiftDist) UnwPrintd3("%s #%d", shiftMnu[shiftType], shiftDist); + + if (shiftDist) { + UnwPrintd3("%s #%d", shiftMnu[shiftType], shiftDist); + } UnwPrintd3("\t; r%d %s", rm, M_Origin2Str(state->regData[rm].o)); } /* Apply the shift type to the source register */ - switch (shiftType) { + switch(shiftType) { case 0: /* logical left */ op2val = state->regData[rm].v << shiftDist; break; case 1: /* logical right */ - if (!regShift && shiftDist == 0) shiftDist = 32; + if (!regShift && shiftDist == 0) { + shiftDist = 32; + } + op2val = state->regData[rm].v >> shiftDist; break; case 2: /* arithmetic right */ - if (!regShift && shiftDist == 0) shiftDist = 32; + if (!regShift && shiftDist == 0) { + shiftDist = 32; + } if (state->regData[rm].v & 0x80000000) { + /* Register shifts maybe greater than 32 */ - if (shiftDist >= 32) + if (shiftDist >= 32) { op2val = 0xFFFFFFFF; - else - op2val = (state->regData[rm].v >> shiftDist) | (0xFFFFFFFF << (32 - shiftDist)); + } + else { + op2val = state->regData[rm].v >> shiftDist; + op2val |= 0xFFFFFFFF << (32 - shiftDist); + } } - else + else { op2val = state->regData[rm].v >> shiftDist; + } break; case 3: /* rotate right */ @@ -281,14 +317,19 @@ UnwResult UnwStartArm(UnwState * const state) { } /* Decide the data origin */ - if (M_IsOriginValid(op2origin) && M_IsOriginValid(state->regData[rm].o)) - op2origin = REG_VAL_ARITHMETIC | state->regData[rm].o; - else + if (M_IsOriginValid(op2origin) && + M_IsOriginValid(state->regData[rm].o)) { + + op2origin = state->regData[rm].o; + op2origin |= REG_VAL_ARITHMETIC; + } + else { op2origin = REG_VAL_INVALID; + } } /* Propagate register validity */ - switch (opcode) { + switch(opcode) { case 0: /* AND: Rd := Op1 AND Op2 */ case 1: /* EOR: Rd := Op1 EOR Op2 */ case 2: /* SUB: Rd:= Op1 - Op2 */ @@ -333,11 +374,14 @@ UnwResult UnwStartArm(UnwState * const state) { * to specify the shift amount the PC will be 12 bytes * ahead. */ - state->regData[rn].v += ((!I && (operand2 & 0x0010)) ? 12 : 8); + if (!I && (operand2 & 0x0010)) + state->regData[rn].v += 12; + else + state->regData[rn].v += 8; } /* Compute values */ - switch (opcode) { + switch(opcode) { case 0: /* AND: Rd := Op1 AND Op2 */ state->regData[rd].v = state->regData[rn].v & op2val; break; @@ -385,8 +429,12 @@ UnwResult UnwStartArm(UnwState * const state) { } /* Remove the prefetch offset from the PC */ - if (rd != 15 && rn == 15) - state->regData[rn].v -= ((!I && (operand2 & 0x0010)) ? 12 : 8); + if (rd != 15 && rn == 15) { + if (!I && (operand2 & 0x0010)) + state->regData[rn].v -= 12; + else + state->regData[rn].v -= 8; + } } /* Block Data Transfer @@ -394,25 +442,26 @@ UnwResult UnwStartArm(UnwState * const state) { */ else if ((instr & 0xFE000000) == 0xE8000000) { - bool P = !!(instr & 0x01000000), - U = !!(instr & 0x00800000), - S = !!(instr & 0x00400000), - W = !!(instr & 0x00200000), - L = !!(instr & 0x00100000); + bool P = (instr & 0x01000000) ? true : false; + bool U = (instr & 0x00800000) ? true : false; + bool S = (instr & 0x00400000) ? true : false; + bool W = (instr & 0x00200000) ? true : false; + bool L = (instr & 0x00100000) ? true : false; uint16_t baseReg = (instr & 0x000F0000) >> 16; uint16_t regList = (instr & 0x0000FFFF); uint32_t addr = state->regData[baseReg].v; bool addrValid = M_IsOriginValid(state->regData[baseReg].o); int8_t r; - #ifdef UNW_DEBUG - /* Display the instruction */ - if (L) - UnwPrintd6("LDM%c%c r%d%s, {reglist}%s\n", P ? 'E' : 'F', U ? 'D' : 'A', baseReg, W ? "!" : "", S ? "^" : ""); - else - UnwPrintd6("STM%c%c r%d%s, {reglist}%s\n", !P ? 'E' : 'F', !U ? 'D' : 'A', baseReg, W ? "!" : "", S ? "^" : ""); - #endif - +#if defined(UNW_DEBUG) + /* Display the instruction */ + if (L) { + UnwPrintd6("LDM%c%c r%d%s, {reglist}%s\n", P ? 'E' : 'F', U ? 'D' : 'A', baseReg, W ? "!" : "", S ? "^" : ""); + } + else { + UnwPrintd6("STM%c%c r%d%s, {reglist}%s\n", !P ? 'E' : 'F', !U ? 'D' : 'A', baseReg, W ? "!" : "", S ? "^" : ""); + } +#endif /* S indicates that banked registers (untracked) are used, unless * this is a load including the PC when the S-bit indicates that * that CPSR is loaded from SPSR (also untracked, but ignored). @@ -440,35 +489,44 @@ UnwResult UnwStartArm(UnwState * const state) { /* Check if the register is to be transferred */ if (regList & (0x01 << r)) { - if (P) addr += U ? 4 : -4; + if (P) + addr += U ? 4 : -4; if (L) { if (addrValid) { - if (!UnwMemReadRegister(state, addr, &state->regData[r])) + if (!UnwMemReadRegister(state, addr, &state->regData[r])) { return UNWIND_DREAD_W_FAIL; + } /* Update the origin if read via the stack pointer */ - if (M_IsOriginValid(state->regData[r].o) && baseReg == 13) + if (M_IsOriginValid(state->regData[r].o) && baseReg == 13) { state->regData[r].o = REG_VAL_FROM_STACK; + } UnwPrintd5(" R%d = 0x%08x\t; r%d %s\n",r,state->regData[r].v,r, M_Origin2Str(state->regData[r].o)); } else { + /* Invalidate the register as the base reg was invalid */ state->regData[r].o = REG_VAL_INVALID; + UnwPrintd2(" R%d = ???\n", r); } } else { - if (addrValid && !UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) - return UNWIND_DWRITE_W_FAIL; + if (addrValid) { + if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) { + return UNWIND_DWRITE_W_FAIL; + } + } UnwPrintd2(" R%d = 0x%08x\n", r); } - if (!P) addr += U ? 4 : -4; + if (!P) + addr += U ? 4 : -4; } /* Check the next register */ @@ -477,7 +535,8 @@ UnwResult UnwStartArm(UnwState * const state) { } while (r >= 0 && r <= 15); /* Check the writeback bit */ - if (W) state->regData[baseReg].v = addr; + if (W) + state->regData[baseReg].v = addr; /* Check if the PC was loaded */ if (L && (regList & (0x01 << 15))) { @@ -488,8 +547,9 @@ UnwResult UnwStartArm(UnwState * const state) { } else { /* Store the return address */ - if (!UnwReportRetAddr(state, state->regData[15].v)) + if (!UnwReportRetAddr(state, state->regData[15].v)) { return UNWIND_TRUNCATED; + } UnwPrintd2(" Return PC=0x%x", state->regData[15].v); @@ -525,7 +585,9 @@ UnwResult UnwStartArm(UnwState * const state) { /* Garbage collect the memory hash (used only for the stack) */ UnwMemHashGC(state); - if (--t == 0) return UNWIND_EXHAUSTED; + t--; + if (t == 0) + return UNWIND_EXHAUSTED; } while (!found); diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp index 26ca8b2604..a4afbeaf8d 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp @@ -25,11 +25,17 @@ * \param value The value to sign extend. * \return The signed-11 bit value stored in a 16bit data type. */ -static int32_t signExtend11(const uint16_t value) { - return (value & 0x400) ? value | 0xFFFFF800 : value; +static int32_t signExtend11(uint16_t value) { + + if(value & 0x400) { + value |= 0xFFFFF800; + } + + return value; } UnwResult UnwStartThumb(UnwState * const state) { + bool found = false; uint16_t t = UNW_MAX_INSTR_COUNT; uint32_t lastJumpAddr = 0; // Last JUMP address, to try to detect infinite loops @@ -39,19 +45,20 @@ UnwResult UnwStartThumb(UnwState * const state) { uint16_t instr; /* Attempt to read the instruction */ - if (!state->cb->readH(state->regData[15].v & (~0x1), &instr)) + if(!state->cb->readH(state->regData[15].v & (~0x1), &instr)) { return UNWIND_IREAD_H_FAIL; + } UnwPrintd4("T %x %x %04x:", state->regData[13].v, state->regData[15].v, instr); /* Check that the PC is still on Thumb alignment */ - if (!(state->regData[15].v & 0x1)) { + if(!(state->regData[15].v & 0x1)) { UnwPrintd1("\nError: PC misalignment\n"); return UNWIND_INCONSISTENT; } /* Check that the SP and PC have not been invalidated */ - if (!M_IsOriginValid(state->regData[13].o) || !M_IsOriginValid(state->regData[15].o)) { + if(!M_IsOriginValid(state->regData[13].o) || !M_IsOriginValid(state->regData[15].o)) { UnwPrintd1("\nError: PC or SP invalidated\n"); return UNWIND_INCONSISTENT; } @@ -66,8 +73,9 @@ UnwResult UnwStartThumb(UnwState * const state) { state->regData[15].v += 2; /* Attempt to read the 2nd part of the instruction */ - if (!state->cb->readH(state->regData[15].v & (~0x1), &instr2)) + if(!state->cb->readH(state->regData[15].v & (~0x1), &instr2)) { return UNWIND_IREAD_H_FAIL; + } UnwPrintd3(" %x %04x:", state->regData[15].v, instr2); @@ -76,25 +84,26 @@ UnwResult UnwStartThumb(UnwState * const state) { * PUSH and POP */ if ((instr & 0xFE6F) == 0xE82D) { - bool L = !!(instr & 0x10); + bool L = (instr & 0x10) ? true : false; uint16_t rList = instr2; - if (L) { + if(L) { uint8_t r; /* Load from memory: POP */ UnwPrintd1("POP {Rlist}\n"); /* Load registers from stack */ - for (r = 0; r < 16; r++) { - if (rList & (0x1 << r)) { + for(r = 0; r < 16; r++) { + if(rList & (0x1 << r)) { /* Read the word */ - if (!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) + if(!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) { return UNWIND_DREAD_W_FAIL; + } /* Alter the origin to be from the stack if it was valid */ - if (M_IsOriginValid(state->regData[r].o)) { + if(M_IsOriginValid(state->regData[r].o)) { state->regData[r].o = REG_VAL_FROM_STACK; @@ -105,7 +114,7 @@ UnwResult UnwStartThumb(UnwState * const state) { * the caller was from Thumb. This would allow return * by BX for interworking APCS. */ - if ((state->regData[15].v & 0x1) == 0) { + if((state->regData[15].v & 0x1) == 0) { UnwPrintd2("Warning: Return address not to Thumb: 0x%08x\n", state->regData[15].v); /* Pop into the PC will not switch mode */ @@ -113,8 +122,9 @@ UnwResult UnwStartThumb(UnwState * const state) { } /* Store the return address */ - if (!UnwReportRetAddr(state, state->regData[15].v)) + if(!UnwReportRetAddr(state, state->regData[15].v)) { return UNWIND_TRUNCATED; + } /* Now have the return address */ UnwPrintd2(" Return PC=%x\n", state->regData[15].v); @@ -145,14 +155,15 @@ UnwResult UnwStartThumb(UnwState * const state) { /* Store to memory: PUSH */ UnwPrintd1("PUSH {Rlist}"); - for (r = 15; r >= 0; r--) { - if (rList & (0x1 << r)) { + for(r = 15; r >= 0; r--) { + if(rList & (0x1 << r)) { UnwPrintd4("\n r%d = 0x%08x\t; %s", r, state->regData[r].v, M_Origin2Str(state->regData[r].o)); state->regData[13].v -= 4; - if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) + if(!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) { return UNWIND_DWRITE_W_FAIL; + } } } } @@ -169,8 +180,9 @@ UnwResult UnwStartThumb(UnwState * const state) { state->regData[13].v -= 4; - if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) + if(!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) { return UNWIND_DWRITE_W_FAIL; + } } /* * POP register @@ -182,11 +194,12 @@ UnwResult UnwStartThumb(UnwState * const state) { UnwPrintd2("POP {R%d}\n", r); /* Read the word */ - if (!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) + if(!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) { return UNWIND_DREAD_W_FAIL; + } /* Alter the origin to be from the stack if it was valid */ - if (M_IsOriginValid(state->regData[r].o)) { + if(M_IsOriginValid(state->regData[r].o)) { state->regData[r].o = REG_VAL_FROM_STACK; @@ -197,7 +210,7 @@ UnwResult UnwStartThumb(UnwState * const state) { * the caller was from Thumb. This would allow return * by BX for interworking APCS. */ - if ((state->regData[15].v & 0x1) == 0) { + if((state->regData[15].v & 0x1) == 0) { UnwPrintd2("Warning: Return address not to Thumb: 0x%08x\n", state->regData[15].v); /* Pop into the PC will not switch mode */ @@ -205,8 +218,9 @@ UnwResult UnwStartThumb(UnwState * const state) { } /* Store the return address */ - if (!UnwReportRetAddr(state, state->regData[15].v)) + if(!UnwReportRetAddr(state, state->regData[15].v)) { return UNWIND_TRUNCATED; + } /* Now have the return address */ UnwPrintd2(" Return PC=%x\n", state->regData[15].v); @@ -241,7 +255,7 @@ UnwResult UnwStartThumb(UnwState * const state) { * the switch clauses */ uint8_t rn = instr & 0xF; - bool H = !!(instr2 & 0x10); + bool H = (instr2 & 0x10) ? true : false; UnwPrintd5("TB%c [r%d,r%d%s]\n", H ? 'H' : 'B', rn, (instr2 & 0xF), H ? ",LSL #1" : ""); @@ -249,14 +263,15 @@ UnwResult UnwStartThumb(UnwState * const state) { if (rn == 15) { if (H) { uint16_t rv; - if (!state->cb->readH((state->regData[15].v & (~1)) + 2, &rv)) + if(!state->cb->readH((state->regData[15].v & (~1)) + 2, &rv)) { return UNWIND_DREAD_H_FAIL; + } state->regData[15].v += rv * 2; - } - else { + } else { uint8_t rv; - if (!state->cb->readB((state->regData[15].v & (~1)) + 2, &rv)) + if(!state->cb->readB((state->regData[15].v & (~1)) + 2, &rv)) { return UNWIND_DREAD_B_FAIL; + } state->regData[15].v += rv * 2; } } @@ -340,11 +355,12 @@ UnwResult UnwStartThumb(UnwState * const state) { UnwPrintd2(" Return PC=%x", state->regData[15].v); /* Report the return address, including mode bit */ - if (!UnwReportRetAddr(state, state->regData[15].v)) + if(!UnwReportRetAddr(state, state->regData[15].v)) { return UNWIND_TRUNCATED; + } /* Determine the new mode */ - if (state->regData[15].v & 0x1) { + if(state->regData[15].v & 0x1) { /* Branching to THUMB */ /* Account for the auto-increment which isn't needed */ @@ -395,10 +411,10 @@ UnwResult UnwStartThumb(UnwState * const state) { * PC-relative load * LDR Rd,[PC, #+/-imm] */ - else if ((instr & 0xFF7F) == 0xF85F) { + else if((instr & 0xFF7F) == 0xF85F) { uint8_t rt = (instr2 & 0xF000) >> 12; uint8_t imm12 = (instr2 & 0x0FFF); - bool A = !!(instr & 0x80); + bool A = (instr & 0x80) ? true : false; uint32_t address; /* Compute load address, adding a word to account for prefetch */ @@ -408,8 +424,9 @@ UnwResult UnwStartThumb(UnwState * const state) { UnwPrintd4("LDR r%d,[PC #%c0x%08x]", rt, A?'+':'-', address); - if (!UnwMemReadRegister(state, address, &state->regData[rt])) + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { return UNWIND_DREAD_W_FAIL; + } } /* * LDR immediate. @@ -424,11 +441,11 @@ UnwResult UnwStartThumb(UnwState * const state) { /* If destination is PC and we don't know the source value, then fail */ if (!M_IsOriginValid(state->regData[rn].o)) { state->regData[rt].o = state->regData[rn].o; - } - else { + } else { uint32_t address = state->regData[rn].v + imm12; - if (!UnwMemReadRegister(state, address, &state->regData[rt])) + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { return UNWIND_DREAD_W_FAIL; + } } } /* @@ -442,20 +459,31 @@ UnwResult UnwStartThumb(UnwState * const state) { uint8_t rn = (instr & 0xF); uint8_t rt = (instr2 & 0xF000) >> 12; uint16_t imm8 = (instr2 & 0xFF); - bool P = !!(instr2 & 0x400); - bool U = !!(instr2 & 0x200); - bool W = !!(instr2 & 0x100); + bool P = (instr2 & 0x400) ? true : false; + bool U = (instr2 & 0x200) ? true : false; + bool W = (instr2 & 0x100) ? true : false; - if (!M_IsOriginValid(state->regData[rn].o)) + if (!M_IsOriginValid(state->regData[rn].o)) { state->regData[rt].o = state->regData[rn].o; - else { - uint32_t offaddress = state->regData[rn].v + (U ? imm8 + imm8 : 0), - address = P ? offaddress : state->regData[rn].v; + } else { + uint32_t offaddress = state->regData[rn].v + imm8; + if (U) offaddress += imm8; + else offaddress -= imm8; - if (!UnwMemReadRegister(state, address, &state->regData[rt])) + uint32_t address; + if (P) { + address = offaddress; + } else { + address = state->regData[rn].v; + } + + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { return UNWIND_DREAD_W_FAIL; + } - if (W) state->regData[rn].v = offaddress; + if (W) { + state->regData[rn].v = offaddress; + } } } /* @@ -465,28 +493,30 @@ UnwResult UnwStartThumb(UnwState * const state) { * Where Rt is PC, Rn value is known, Rm is not known or unknown */ else if ((instr & 0xFFF0) == 0xF850 && (instr2 & 0x0FC0) == 0x0000) { - const uint8_t rn = (instr & 0xF), - rt = (instr2 & 0xF000) >> 12, - rm = (instr2 & 0xF), - imm2 = (instr2 & 0x30) >> 4; + uint8_t rn = (instr & 0xF); + uint8_t rt = (instr2 & 0xF000) >> 12; + uint8_t rm = (instr2 & 0xF); + uint8_t imm2 = (instr2 & 0x30) >> 4; - if (!M_IsOriginValid(state->regData[rn].o) || !M_IsOriginValid(state->regData[rm].o)) { + if (!M_IsOriginValid(state->regData[rn].o) || + !M_IsOriginValid(state->regData[rm].o)) { /* If Rt is PC, and Rn is known, then do an exception and assume Rm equals 0 => This takes the first case in a switch() */ if (rt == 15 && M_IsOriginValid(state->regData[rn].o)) { uint32_t address = state->regData[rn].v; - if (!UnwMemReadRegister(state, address, &state->regData[rt])) + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { return UNWIND_DREAD_W_FAIL; - } - else /* Propagate unknown value */ + } + } else { + /* Propagate unknown value */ state->regData[rt].o = state->regData[rn].o; - - } - else { + } + } else { uint32_t address = state->regData[rn].v + (state->regData[rm].v << imm2); - if (!UnwMemReadRegister(state, address, &state->regData[rt])) + if(!UnwMemReadRegister(state, address, &state->regData[rt])) { return UNWIND_DREAD_W_FAIL; + } } } else { @@ -503,14 +533,14 @@ UnwResult UnwStartThumb(UnwState * const state) { * LSR Rd, Rs, #Offset5 * ASR Rd, Rs, #Offset5 */ - else if ((instr & 0xE000) == 0x0000 && (instr & 0x1800) != 0x1800) { + else if((instr & 0xE000) == 0x0000 && (instr & 0x1800) != 0x1800) { bool signExtend; - const uint8_t op = (instr & 0x1800) >> 11, - offset5 = (instr & 0x07C0) >> 6, - rs = (instr & 0x0038) >> 3, - rd = (instr & 0x0007); + uint8_t op = (instr & 0x1800) >> 11; + uint8_t offset5 = (instr & 0x07C0) >> 6; + uint8_t rs = (instr & 0x0038) >> 3; + uint8_t rd = (instr & 0x0007); - switch (op) { + switch(op) { case 0: /* LSL */ UnwPrintd6("LSL r%d, r%d, #%d\t; r%d %s", rd, rs, offset5, rs, M_Origin2Str(state->regData[rs].o)); state->regData[rd].v = state->regData[rs].v << offset5; @@ -528,9 +558,11 @@ UnwResult UnwStartThumb(UnwState * const state) { case 2: /* ASR */ UnwPrintd6("ASL r%d, r%d, #%d\t; r%d %s", rd, rs, offset5, rs, M_Origin2Str(state->regData[rs].o)); - signExtend = !!(state->regData[rs].v & 0x8000); + signExtend = (state->regData[rs].v & 0x8000) ? true : false; state->regData[rd].v = state->regData[rs].v >> offset5; - if (signExtend) state->regData[rd].v |= 0xFFFFFFFF << (32 - offset5); + if(signExtend) { + state->regData[rd].v |= 0xFFFFFFFF << (32 - offset5); + } state->regData[rd].o = state->regData[rs].o; state->regData[rd].o |= REG_VAL_ARITHMETIC; break; @@ -542,9 +574,9 @@ UnwResult UnwStartThumb(UnwState * const state) { * SUB Rd, Rs, Rn * SUB Rd, Rs, #Offset3 */ - else if ((instr & 0xF800) == 0x1800) { - bool I = !!(instr & 0x0400); - bool op = !!(instr & 0x0200); + else if((instr & 0xF800) == 0x1800) { + bool I = (instr & 0x0400) ? true : false; + bool op = (instr & 0x0200) ? true : false; uint8_t rn = (instr & 0x01C0) >> 6; uint8_t rs = (instr & 0x0038) >> 3; uint8_t rd = (instr & 0x0007); @@ -552,24 +584,36 @@ UnwResult UnwStartThumb(UnwState * const state) { /* Print decoding */ UnwPrintd6("%s r%d, r%d, %c%d\t;",op ? "SUB" : "ADD",rd, rs,I ? '#' : 'r',rn); UnwPrintd5("r%d %s, r%d %s",rd, M_Origin2Str(state->regData[rd].o),rs, M_Origin2Str(state->regData[rs].o)); - if (!I) { + if(!I) { UnwPrintd3(", r%d %s", rn, M_Origin2Str(state->regData[rn].o)); /* Perform calculation */ - state->regData[rd].v = state->regData[rs].v + (op ? -state->regData[rn].v : state->regData[rn].v); + if(op) { + state->regData[rd].v = state->regData[rs].v - state->regData[rn].v; + } + else { + state->regData[rd].v = state->regData[rs].v + state->regData[rn].v; + } /* Propagate the origin */ - if (M_IsOriginValid(state->regData[rs].o) && M_IsOriginValid(state->regData[rn].o)) { + if(M_IsOriginValid(state->regData[rs].o) && + M_IsOriginValid(state->regData[rn].o)) { state->regData[rd].o = state->regData[rs].o; state->regData[rd].o |= REG_VAL_ARITHMETIC; } - else + else { state->regData[rd].o = REG_VAL_INVALID; + } } else { /* Perform calculation */ - state->regData[rd].v = state->regData[rs].v + (op ? -rn : rn); + if(op) { + state->regData[rd].v = state->regData[rs].v - rn; + } + else { + state->regData[rd].v = state->regData[rs].v + rn; + } /* Propagate the origin */ state->regData[rd].o = state->regData[rs].o; @@ -582,13 +626,13 @@ UnwResult UnwStartThumb(UnwState * const state) { * ADD Rd, #Offset8 * SUB Rd, #Offset8 */ - else if ((instr & 0xE000) == 0x2000) { + else if((instr & 0xE000) == 0x2000) { uint8_t op = (instr & 0x1800) >> 11; uint8_t rd = (instr & 0x0700) >> 8; uint8_t offset8 = (instr & 0x00FF); - switch (op) { + switch(op) { case 0: /* MOV */ UnwPrintd3("MOV r%d, #0x%x", rd, offset8); state->regData[rd].v = offset8; @@ -631,12 +675,12 @@ UnwResult UnwStartThumb(UnwState * const state) { * BIC Rd, Rs * MVN Rd, Rs */ - else if ((instr & 0xFC00) == 0x4000) { + else if((instr & 0xFC00) == 0x4000) { uint8_t op = (instr & 0x03C0) >> 6; uint8_t rs = (instr & 0x0038) >> 3; uint8_t rd = (instr & 0x0007); -#ifdef UNW_DEBUG +#if defined(UNW_DEBUG) static const char * const mnu[16] = { "AND", "EOR", "LSL", "LSR", "ASR", "ADC", "SBC", "ROR", @@ -644,7 +688,7 @@ UnwResult UnwStartThumb(UnwState * const state) { "ORR", "MUL", "BIC", "MVN" }; #endif /* Print the mnemonic and registers */ - switch (op) { + switch(op) { case 0: /* AND */ case 1: /* EOR */ case 2: /* LSL */ @@ -676,7 +720,7 @@ UnwResult UnwStartThumb(UnwState * const state) { } /* Perform operation */ - switch (op) { + switch(op) { case 0: /* AND */ state->regData[rd].v &= state->regData[rs].v; break; @@ -694,7 +738,7 @@ UnwResult UnwStartThumb(UnwState * const state) { break; case 4: /* ASR */ - if (state->regData[rd].v & 0x80000000) { + if(state->regData[rd].v & 0x80000000) { state->regData[rd].v >>= state->regData[rs].v; state->regData[rd].v |= 0xFFFFFFFF << (32 - state->regData[rs].v); } @@ -738,7 +782,7 @@ UnwResult UnwStartThumb(UnwState * const state) { } /* Propagate data origins */ - switch (op) { + switch(op) { case 0: /* AND */ case 1: /* EOR */ case 2: /* LSL */ @@ -748,12 +792,13 @@ UnwResult UnwStartThumb(UnwState * const state) { case 12: /* ORR */ case 13: /* MUL */ case 14: /* BIC */ - if (M_IsOriginValid(state->regData[rd].o) && M_IsOriginValid(state->regData[rs].o)) { + if(M_IsOriginValid(state->regData[rd].o) && M_IsOriginValid(state->regData[rs].o)) { state->regData[rd].o = state->regData[rs].o; state->regData[rd].o |= REG_VAL_ARITHMETIC; } - else + else { state->regData[rd].o = REG_VAL_INVALID; + } break; case 5: /* ADC */ @@ -780,7 +825,7 @@ UnwResult UnwStartThumb(UnwState * const state) { * CMP Hd, Rs * MOV Hd, Hs */ - else if ((instr & 0xFC00) == 0x4400) { + else if((instr & 0xFC00) == 0x4400) { uint8_t op = (instr & 0x0300) >> 8; bool h1 = (instr & 0x0080) ? true: false; bool h2 = (instr & 0x0040) ? true: false; @@ -788,10 +833,12 @@ UnwResult UnwStartThumb(UnwState * const state) { uint8_t rhd = (instr & 0x0007); /* Adjust the register numbers */ - if (h2) rhs += 8; - if (h1) rhd += 8; + if(h2) + rhs += 8; + if(h1) + rhd += 8; - switch (op) { + switch(op) { case 0: /* ADD */ UnwPrintd5("ADD r%d, r%d\t; r%d %s", rhd, rhs, rhs, M_Origin2Str(state->regData[rhs].o)); state->regData[rhd].v += state->regData[rhs].v; @@ -807,32 +854,35 @@ UnwResult UnwStartThumb(UnwState * const state) { case 2: /* MOV */ UnwPrintd5("MOV r%d, r%d\t; r%d %s", rhd, rhs, rhd, M_Origin2Str(state->regData[rhs].o)); state->regData[rhd].v = state->regData[rhs].v; - state->regData[rhd].o = state->regData[rhs].o; + state->regData[rhd].o = state->regData[rhd].o; break; case 3: /* BX */ UnwPrintd4("BX r%d\t; r%d %s\n", rhs, rhs, M_Origin2Str(state->regData[rhs].o)); /* Only follow BX if the data was from the stack or BX LR */ - if (rhs == 14 || state->regData[rhs].o == REG_VAL_FROM_STACK) { + if(rhs == 14 || state->regData[rhs].o == REG_VAL_FROM_STACK) { UnwPrintd2(" Return PC=0x%x\n", state->regData[rhs].v & (~0x1)); /* Report the return address, including mode bit */ - if (!UnwReportRetAddr(state, state->regData[rhs].v)) + if(!UnwReportRetAddr(state, state->regData[rhs].v)) { return UNWIND_TRUNCATED; + } /* Update the PC */ state->regData[15].v = state->regData[rhs].v; /* Determine the new mode */ - if (state->regData[rhs].v & 0x1) { + if(state->regData[rhs].v & 0x1) { /* Branching to THUMB */ /* Account for the auto-increment which isn't needed */ state->regData[15].v -= 2; } - else /* Branch to ARM */ + else { + /* Branch to ARM */ return UnwStartArm(state); + } } else { UnwPrintd4("\nError: BX to invalid register: r%d = 0x%x (%s)\n", rhs, state->regData[rhs].o, M_Origin2Str(state->regData[rhs].o)); @@ -843,7 +893,7 @@ UnwResult UnwStartThumb(UnwState * const state) { /* Format 9: PC-relative load * LDR Rd,[PC, #imm] */ - else if ((instr & 0xF800) == 0x4800) { + else if((instr & 0xF800) == 0x4800) { uint8_t rd = (instr & 0x0700) >> 8; uint8_t word8 = (instr & 0x00FF); uint32_t address; @@ -853,18 +903,19 @@ UnwResult UnwStartThumb(UnwState * const state) { UnwPrintd3("LDR r%d, 0x%08x", rd, address); - if (!UnwMemReadRegister(state, address, &state->regData[rd])) + if(!UnwMemReadRegister(state, address, &state->regData[rd])) { return UNWIND_DREAD_W_FAIL; + } } /* Format 13: add offset to Stack Pointer * ADD sp,#+imm * ADD sp,#-imm */ - else if ((instr & 0xFF00) == 0xB000) { + else if((instr & 0xFF00) == 0xB000) { uint8_t value = (instr & 0x7F) * 4; /* Check the negative bit */ - if ((instr & 0x80) != 0) { + if((instr & 0x80) != 0) { UnwPrintd2("SUB sp,#0x%x", value); state->regData[13].v -= value; } @@ -879,27 +930,29 @@ UnwResult UnwStartThumb(UnwState * const state) { * POP {Rlist} * POP {Rlist, PC} */ - else if ((instr & 0xF600) == 0xB400) { - bool L = !!(instr & 0x0800); - bool R = !!(instr & 0x0100); + else if((instr & 0xF600) == 0xB400) { + bool L = (instr & 0x0800) ? true : false; + bool R = (instr & 0x0100) ? true : false; uint8_t rList = (instr & 0x00FF); - if (L) { + if(L) { uint8_t r; /* Load from memory: POP */ UnwPrintd2("POP {Rlist%s}\n", R ? ", PC" : ""); - for (r = 0; r < 8; r++) { - if (rList & (0x1 << r)) { + for(r = 0; r < 8; r++) { + if(rList & (0x1 << r)) { /* Read the word */ - if (!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) + if(!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) { return UNWIND_DREAD_W_FAIL; + } /* Alter the origin to be from the stack if it was valid */ - if (M_IsOriginValid(state->regData[r].o)) + if(M_IsOriginValid(state->regData[r].o)) { state->regData[r].o = REG_VAL_FROM_STACK; + } state->regData[13].v += 4; @@ -908,13 +961,14 @@ UnwResult UnwStartThumb(UnwState * const state) { } /* Check if the PC is to be popped */ - if (R) { + if(R) { /* Get the return address */ - if (!UnwMemReadRegister(state, state->regData[13].v, &state->regData[15])) + if(!UnwMemReadRegister(state, state->regData[13].v, &state->regData[15])) { return UNWIND_DREAD_W_FAIL; + } /* Alter the origin to be from the stack if it was valid */ - if (!M_IsOriginValid(state->regData[15].o)) { + if(!M_IsOriginValid(state->regData[15].o)) { /* Return address is not valid */ UnwPrintd1("PC popped with invalid address\n"); return UNWIND_FAILURE; @@ -924,7 +978,7 @@ UnwResult UnwStartThumb(UnwState * const state) { * the caller was from Thumb. This would allow return * by BX for interworking APCS. */ - if ((state->regData[15].v & 0x1) == 0) { + if((state->regData[15].v & 0x1) == 0) { UnwPrintd2("Warning: Return address not to Thumb: 0x%08x\n", state->regData[15].v); /* Pop into the PC will not switch mode */ @@ -932,8 +986,9 @@ UnwResult UnwStartThumb(UnwState * const state) { } /* Store the return address */ - if (!UnwReportRetAddr(state, state->regData[15].v)) + if(!UnwReportRetAddr(state, state->regData[15].v)) { return UNWIND_TRUNCATED; + } /* Now have the return address */ UnwPrintd2(" Return PC=%x\n", state->regData[15].v); @@ -953,24 +1008,26 @@ UnwResult UnwStartThumb(UnwState * const state) { UnwPrintd2("PUSH {Rlist%s}", R ? ", LR" : ""); /* Check if the LR is to be pushed */ - if (R) { + if(R) { UnwPrintd3("\n lr = 0x%08x\t; %s", state->regData[14].v, M_Origin2Str(state->regData[14].o)); state->regData[13].v -= 4; /* Write the register value to memory */ - if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[14])) + if(!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[14])) { return UNWIND_DWRITE_W_FAIL; + } } - for (r = 7; r >= 0; r--) { - if (rList & (0x1 << r)) { + for(r = 7; r >= 0; r--) { + if(rList & (0x1 << r)) { UnwPrintd4("\n r%d = 0x%08x\t; %s", r, state->regData[r].v, M_Origin2Str(state->regData[r].o)); state->regData[13].v -= 4; - if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) + if(!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) { return UNWIND_DWRITE_W_FAIL; + } } } } @@ -980,7 +1037,7 @@ UnwResult UnwStartThumb(UnwState * const state) { * Conditional branches * Bcond */ - else if ((instr & 0xF000) == 0xD000) { + else if((instr & 0xF000) == 0xD000) { int32_t branchValue = (instr & 0xFF); if (branchValue & 0x80) branchValue |= 0xFFFFFF00; @@ -1009,7 +1066,7 @@ UnwResult UnwStartThumb(UnwState * const state) { /* Format 18: unconditional branch * B label */ - else if ((instr & 0xF800) == 0xE000) { + else if((instr & 0xF800) == 0xE000) { uint32_t v; int32_t branchValue = signExtend11(instr & 0x07FF); @@ -1049,7 +1106,8 @@ UnwResult UnwStartThumb(UnwState * const state) { UnwPrintd1("\n"); /* Should never hit the reset vector */ - if (state->regData[15].v == 0) return UNWIND_RESET; + if(state->regData[15].v == 0) + return UNWIND_RESET; /* Check next address */ state->regData[15].v += 2; @@ -1057,9 +1115,11 @@ UnwResult UnwStartThumb(UnwState * const state) { /* Garbage collect the memory hash (used only for the stack) */ UnwMemHashGC(state); - if (--t == 0) return UNWIND_EXHAUSTED; + t--; + if(t == 0) + return UNWIND_EXHAUSTED; - } while (!found); + } while(!found); return UNWIND_SUCCESS; } diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp index bfc062af20..db49dcad7f 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp @@ -4,7 +4,7 @@ * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://www.mozilla.org/en-US/MPL/2.0/ + * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This library was modified, some bugs fixed, stack address validated * and adapted to be used in Marlin 3D printer firmware as backtracer @@ -23,9 +23,9 @@ extern "C" const UnwTabEntry __exidx_start[]; extern "C" const UnwTabEntry __exidx_end[]; /* This prevents the linking of libgcc unwinder code */ -void __aeabi_unwind_cpp_pr0() {}; -void __aeabi_unwind_cpp_pr1() {}; -void __aeabi_unwind_cpp_pr2() {}; +void __aeabi_unwind_cpp_pr0(void) {}; +void __aeabi_unwind_cpp_pr1(void) {}; +void __aeabi_unwind_cpp_pr2(void) {}; static inline __attribute__((always_inline)) uint32_t prel31_to_addr(const uint32_t *prel31) { uint32_t offset = (((uint32_t)(*prel31)) << 1) >> 1; @@ -47,17 +47,17 @@ static const UnwTabEntry *UnwTabSearchIndex(const UnwTabEntry *start, const UnwT } /* - * Get the function name or nullptr if not found + * Get the function name or NULL if not found */ static const char *UnwTabGetFunctionName(const UnwindCallbacks *cb, uint32_t address) { uint32_t flag_word = 0; if (!cb->readW(address-4,&flag_word)) - return nullptr; + return NULL; if ((flag_word & 0xFF000000) == 0xFF000000) { return (const char *)(address - 4 - (flag_word & 0x00FFFFFF)); } - return nullptr; + return NULL; } /** @@ -285,7 +285,7 @@ static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabStat return UNWIND_SUCCESS; } -static inline __attribute__((always_inline)) uint32_t read_psp() { +static inline __attribute__((always_inline)) uint32_t read_psp(void) { /* Read the current PSP and return its value as a pointer */ uint32_t psp; diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.h b/Marlin/src/HAL/shared/backtrace/unwarmbytab.h index 77a1c82dbd..527d3a6c72 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmbytab.h +++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.h @@ -12,7 +12,8 @@ * File Description: Interface to the memory tracking sub-system. **************************************************************************/ -#pragma once +#ifndef UNWARMBYTAB_H +#define UNWARMBYTAB_H #include "unwarm.h" @@ -29,3 +30,5 @@ typedef struct { } UnwTabEntry; UnwResult UnwindByTableStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data); + +#endif // UNWARMBYTAB_H diff --git a/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp b/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp index cf9ac414c4..7453fdb8db 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp @@ -19,7 +19,7 @@ #include "unwarmmem.h" #include "unwarm.h" -#define M_IsIdxUsed(a, v) !!((a)[v >> 3] & (1 << (v & 0x7))) +#define M_IsIdxUsed(a, v) (((a)[v >> 3] & (1 << (v & 0x7))) ? true : false) #define M_SetIdxUsed(a, v) ((a)[v >> 3] |= (1 << (v & 0x7))) #define M_ClrIdxUsed(a, v) ((a)[v >> 3] &= ~(1 << (v & 0x7))) @@ -34,9 +34,11 @@ static int16_t memHashIndex(MemData * const memData, const uint32_t addr) { do { /* Check if the element is occupied */ - if (M_IsIdxUsed(memData->used, s)) { + if(M_IsIdxUsed(memData->used, s)) { /* Check if it is occupied with the sought data */ - if (memData->a[s] == addr) return s; + if(memData->a[s] == addr) { + return s; + } } else { /* Item is free, this is where the item should be stored */ @@ -45,8 +47,10 @@ static int16_t memHashIndex(MemData * const memData, const uint32_t addr) { /* Search the next entry */ s++; - if (s > MEM_HASH_SIZE) s = 0; - } while (s != v); + if(s > MEM_HASH_SIZE) { + s = 0; + } + } while(s != v); /* Search failed, hash is full and the address not stored */ return -1; @@ -54,9 +58,9 @@ static int16_t memHashIndex(MemData * const memData, const uint32_t addr) { bool UnwMemHashRead(MemData * const memData, uint32_t addr,uint32_t * const data, bool * const tracked) { - const int16_t i = memHashIndex(memData, addr); + int16_t i = memHashIndex(memData, addr); - if (i >= 0 && M_IsIdxUsed(memData->used, i) && memData->a[i] == addr) { + if(i >= 0 && M_IsIdxUsed(memData->used, i) && memData->a[i] == addr) { *data = memData->v[i]; *tracked = M_IsIdxUsed(memData->tracked, i); return true; @@ -68,36 +72,44 @@ bool UnwMemHashRead(MemData * const memData, uint32_t addr,uint32_t * const data } bool UnwMemHashWrite(MemData * const memData, uint32_t addr, uint32_t val, bool valValid) { - const int16_t i = memHashIndex(memData, addr); - if (i < 0) return false; /* Hash full */ - /* Store the item */ - memData->a[i] = addr; - M_SetIdxUsed(memData->used, i); + int16_t i = memHashIndex(memData, addr); - if (valValid) { - memData->v[i] = val; - M_SetIdxUsed(memData->tracked, i); + if(i < 0){ + /* Hash full */ + return false; } else { - #ifdef UNW_DEBUG - memData->v[i] = 0xDEADBEEF; - #endif - M_ClrIdxUsed(memData->tracked, i); - } + /* Store the item */ + memData->a[i] = addr; + M_SetIdxUsed(memData->used, i); - return true; + if(valValid) + { + memData->v[i] = val; + M_SetIdxUsed(memData->tracked, i); + } + else { + #if defined(UNW_DEBUG) + memData->v[i] = 0xDEADBEEF; + #endif + M_ClrIdxUsed(memData->tracked, i); + } + + return true; + } } void UnwMemHashGC(UnwState * const state) { const uint32_t minValidAddr = state->regData[13].v; MemData * const memData = &state->memData; - uint16_t t; + uint16_t t; - for (t = 0; t < MEM_HASH_SIZE; t++) { - if (M_IsIdxUsed(memData->used, t) && (memData->a[t] < minValidAddr)) { + for(t = 0; t < MEM_HASH_SIZE; t++) { + if(M_IsIdxUsed(memData->used, t) && (memData->a[t] < minValidAddr)) { UnwPrintd3("MemHashGC: Free elem %d, addr 0x%08x\n", t, memData->a[t]); + M_ClrIdxUsed(memData->used, t); } } diff --git a/Marlin/src/HAL/shared/backtrace/unwarmmem.h b/Marlin/src/HAL/shared/backtrace/unwarmmem.h index 588618b34f..f30846b34c 100644 --- a/Marlin/src/HAL/shared/backtrace/unwarmmem.h +++ b/Marlin/src/HAL/shared/backtrace/unwarmmem.h @@ -12,10 +12,14 @@ * File Description: Interface to the memory tracking sub-system. **************************************************************************/ -#pragma once +#ifndef UNWARMMEM_H +#define UNWARMMEM_H #include "unwarm.h" bool UnwMemHashRead(MemData * const memData, uint32_t addr, uint32_t * const data, bool * const tracked); bool UnwMemHashWrite(MemData * const memData, uint32_t addr, uint32_t val, bool valValid); void UnwMemHashGC(UnwState * const state); + +#endif + diff --git a/Marlin/src/HAL/shared/backtrace/unwinder.cpp b/Marlin/src/HAL/shared/backtrace/unwinder.cpp index e63af1ed25..9c30016165 100644 --- a/Marlin/src/HAL/shared/backtrace/unwinder.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwinder.cpp @@ -27,17 +27,19 @@ extern "C" const UnwTabEntry __exidx_start[]; extern "C" const UnwTabEntry __exidx_end[]; // Detect if unwind information is present or not -static int HasUnwindTableInfo() { +static int HasUnwindTableInfo(void) { // > 16 because there are default entries we can't supress return ((char*)(&__exidx_end) - (char*)(&__exidx_start)) > 16 ? 1 : 0; } UnwResult UnwindStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data) { + if (HasUnwindTableInfo()) { + /* We have unwind information tables */ return UnwindByTableStart(frame, cb, data); - } - else { + + } else { /* We don't have unwind information tables */ UnwState state; @@ -46,7 +48,14 @@ UnwResult UnwindStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data) UnwInitState(&state, cb, data, frame->pc, frame->sp); /* Check the Thumb bit */ - return (frame->pc & 0x1) ? UnwStartThumb(&state) : UnwStartArm(&state); + if(frame->pc & 0x1) { + return UnwStartThumb(&state); + } + else { + return UnwStartArm(&state); + } } } #endif + + diff --git a/Marlin/src/HAL/shared/backtrace/unwinder.h b/Marlin/src/HAL/shared/backtrace/unwinder.h index cae1379513..29132d0b5b 100644 --- a/Marlin/src/HAL/shared/backtrace/unwinder.h +++ b/Marlin/src/HAL/shared/backtrace/unwinder.h @@ -13,7 +13,8 @@ * Interface to the ARM stack unwinding module. **************************************************************************/ -#pragma once +#ifndef UNWINDER_H +#define UNWINDER_H #include @@ -164,9 +165,11 @@ typedef struct { * link register (i.e. not a normal register) and the stack pointer value * supplied. * - * -If the program was compiled with -funwind-tables it will use them to + * -If the program was compiled with -funwind-tables , it will use them to * perform the traceback. Otherwise, brute force will be employed * -If the program was compiled with -mpoke-function-name, then you will * get function names in the traceback. Otherwise, you will not. */ UnwResult UnwindStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data); + +#endif /* UNWINDER_H */ diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index c93494d485..784987172e 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -15,144 +15,106 @@ #if defined(__arm__) || defined(__thumb__) #include "unwmemaccess.h" -#include "../../../inc/MarlinConfig.h" /* Validate address */ #ifdef ARDUINO_ARCH_SAM +// For DUE, valid address ranges are +// SRAM (0x20070000 - 0x20088000) (96kb) +// FLASH (0x00080000 - 0x00100000) (512kb) +// +#define START_SRAM_ADDR 0x20070000 +#define END_SRAM_ADDR 0x20088000 +#define START_FLASH_ADDR 0x00080000 +#define END_FLASH_ADDR 0x00100000 +#endif - // For DUE, valid address ranges are - // SRAM (0x20070000 - 0x20088000) (96kb) - // FLASH (0x00080000 - 0x00100000) (512kb) - // - #define START_SRAM_ADDR 0x20070000 - #define END_SRAM_ADDR 0x20088000 - #define START_FLASH_ADDR 0x00080000 - #define END_FLASH_ADDR 0x00100000 +#ifdef TARGET_LPC1768 +// For LPC1769: +// SRAM (0x10000000 - 0x10008000) (32kb) +// FLASH (0x00000000 - 0x00080000) (512kb) +// +#define START_SRAM_ADDR 0x10000000 +#define END_SRAM_ADDR 0x10008000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00080000 +#endif -#elif defined(TARGET_LPC1768) +#if 0 +// For STM32F103CBT6 +// SRAM (0x20000000 - 0x20005000) (20kb) +// FLASH (0x00000000 - 0x00020000) (128kb) +// +#define START_SRAM_ADDR 0x20000000 +#define END_SRAM_ADDR 0x20005000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00020000 +#endif - // For LPC1769: - // SRAM (0x10000000 - 0x10008000) (32kb) - // FLASH (0x00000000 - 0x00080000) (512kb) - // - #define START_SRAM_ADDR 0x10000000 - #define END_SRAM_ADDR 0x10008000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00080000 +#ifdef __STM32F1__ +// For STM32F103ZET6/STM32F103VET6 +// SRAM (0x20000000 - 0x20010000) (64kb) +// FLASH (0x00000000 - 0x00080000) (512kb) +// +#define START_SRAM_ADDR 0x20000000 +#define END_SRAM_ADDR 0x20010000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00080000 +#endif -#elif 0 +#if defined(STM32F4) || defined(STM32F4xx) +// For STM32F407VET +// SRAM (0x20000000 - 0x20030000) (192kb) +// FLASH (0x08000000 - 0x08080000) (512kb) +// +#define START_SRAM_ADDR 0x20000000 +#define END_SRAM_ADDR 0x20030000 +#define START_FLASH_ADDR 0x08000000 +#define END_FLASH_ADDR 0x08080000 +#endif - // For STM32F103CBT6 - // SRAM (0x20000000 - 0x20005000) (20kb) - // FLASH (0x00000000 - 0x00020000) (128kb) - // - #define START_SRAM_ADDR 0x20000000 - #define END_SRAM_ADDR 0x20005000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00020000 +#ifdef STM32F7 +// For STM32F765 in BORG +// SRAM (0x20000000 - 0x20080000) (512kb) +// FLASH (0x08000000 - 0x08100000) (1024kb) +// +#define START_SRAM_ADDR 0x20000000 +#define END_SRAM_ADDR 0x20080000 +#define START_FLASH_ADDR 0x08000000 +#define END_FLASH_ADDR 0x08100000 +#endif -#elif defined(__STM32F1__) || defined(STM32F1xx) || defined(STM32F0xx) +#ifdef __MK20DX256__ +// For MK20DX256 in TEENSY 3.1 or TEENSY 3.2 +// SRAM (0x1FFF8000 - 0x20008000) (64kb) +// FLASH (0x00000000 - 0x00040000) (256kb) +// +#define START_SRAM_ADDR 0x1FFF8000 +#define END_SRAM_ADDR 0x20008000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00040000 +#endif - // For STM32F103ZET6/STM32F103VET6/STM32F0xx - // SRAM (0x20000000 - 0x20010000) (64kb) - // FLASH (0x00000000 - 0x00080000) (512kb) - // - #define START_SRAM_ADDR 0x20000000 - #define END_SRAM_ADDR 0x20010000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00080000 - -#elif defined(STM32F4) || defined(STM32F4xx) - - // For STM32F407VET - // SRAM (0x20000000 - 0x20030000) (192kb) - // FLASH (0x08000000 - 0x08080000) (512kb) - // - #define START_SRAM_ADDR 0x20000000 - #define END_SRAM_ADDR 0x20030000 - #define START_FLASH_ADDR 0x08000000 - #define END_FLASH_ADDR 0x08080000 - -#elif MB(THE_BORG) - - // For STM32F765 in BORG - // SRAM (0x20000000 - 0x20080000) (512kb) - // FLASH (0x08000000 - 0x08100000) (1024kb) - // - #define START_SRAM_ADDR 0x20000000 - #define END_SRAM_ADDR 0x20080000 - #define START_FLASH_ADDR 0x08000000 - #define END_FLASH_ADDR 0x08100000 - -#elif MB(REMRAM_V1, NUCLEO_F767ZI) - - // For STM32F765VI in RemRam v1 - // SRAM (0x20000000 - 0x20080000) (512kb) - // FLASH (0x08000000 - 0x08200000) (2048kb) - // - #define START_SRAM_ADDR 0x20000000 - #define END_SRAM_ADDR 0x20080000 - #define START_FLASH_ADDR 0x08000000 - #define END_FLASH_ADDR 0x08200000 - -#elif defined(__MK20DX256__) - - // For MK20DX256 in TEENSY 3.1 or TEENSY 3.2 - // SRAM (0x1FFF8000 - 0x20008000) (64kb) - // FLASH (0x00000000 - 0x00040000) (256kb) - // - #define START_SRAM_ADDR 0x1FFF8000 - #define END_SRAM_ADDR 0x20008000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00040000 - -#elif defined(__MK64FX512__) - - // For MK64FX512 in TEENSY 3.5 - // SRAM (0x1FFF0000 - 0x20020000) (192kb) - // FLASH (0x00000000 - 0x00080000) (512kb) - // - #define START_SRAM_ADDR 0x1FFF0000 - #define END_SRAM_ADDR 0x20020000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00080000 - -#elif defined(__MK66FX1M0__) - - // For MK66FX1M0 in TEENSY 3.6 - // SRAM (0x1FFF0000 - 0x20030000) (256kb) - // FLASH (0x00000000 - 0x00140000) (1.25Mb) - // - #define START_SRAM_ADDR 0x1FFF0000 - #define END_SRAM_ADDR 0x20030000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00140000 - -#elif defined(__IMXRT1062__) - - // For IMXRT1062 in TEENSY 4.0/4/1 - // ITCM (rwx): ORIGIN = 0x00000000, LENGTH = 512K - // DTCM (rwx): ORIGIN = 0x20000000, LENGTH = 512K - // RAM (rwx): ORIGIN = 0x20200000, LENGTH = 512K - // FLASH (rwx): ORIGIN = 0x60000000, LENGTH = 1984K - // - #define START_SRAM_ADDR 0x00000000 - #define END_SRAM_ADDR 0x20280000 - #define START_FLASH_ADDR 0x60000000 - #define END_FLASH_ADDR 0x601F0000 - -#elif defined(__SAMD51P20A__) - - // For SAMD51x20, valid address ranges are - // SRAM (0x20000000 - 0x20040000) (256kb) - // FLASH (0x00000000 - 0x00100000) (1024kb) - // - #define START_SRAM_ADDR 0x20000000 - #define END_SRAM_ADDR 0x20040000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00100000 +#ifdef __MK64FX512__ +// For MK64FX512 in TEENSY 3.5 +// SRAM (0x1FFF0000 - 0x20020000) (192kb) +// FLASH (0x00000000 - 0x00080000) (512kb) +// +#define START_SRAM_ADDR 0x1FFF0000 +#define END_SRAM_ADDR 0x20020000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00080000 +#endif +#ifdef __MK66FX1M0__ +// For MK66FX1M0 in TEENSY 3.6 +// SRAM (0x1FFF0000 - 0x20030000) (256kb) +// FLASH (0x00000000 - 0x00140000) (1.25Mb) +// +#define START_SRAM_ADDR 0x1FFF0000 +#define END_SRAM_ADDR 0x20030000 +#define START_FLASH_ADDR 0x00000000 +#define END_FLASH_ADDR 0x00140000 #endif static bool validate_addr(uint32_t addr) { @@ -192,4 +154,5 @@ bool UnwReadB(const uint32_t a, uint8_t *v) { return true; } -#endif // __arm__ || __thumb__ +#endif + diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.h b/Marlin/src/HAL/shared/backtrace/unwmemaccess.h index fe42bd9485..5405f3a673 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.h +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.h @@ -12,7 +12,8 @@ * File Description: Utility functions to access memory **************************************************************************/ -#pragma once +#ifndef UNWMEMACCESS_H +#define UNWMEMACCESS_H #include "unwarm.h" #include @@ -20,3 +21,6 @@ bool UnwReadW(const uint32_t a, uint32_t *v); bool UnwReadH(const uint32_t a, uint16_t *v); bool UnwReadB(const uint32_t a, uint8_t *v); + +#endif + diff --git a/Marlin/src/HAL/shared/eeprom_api.cpp b/Marlin/src/HAL/shared/eeprom_api.cpp deleted file mode 100644 index 47cfa5a2db..0000000000 --- a/Marlin/src/HAL/shared/eeprom_api.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../inc/MarlinConfigPre.h" - -#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) - - #include "eeprom_api.h" - PersistentStore persistentStore; - -#endif diff --git a/Marlin/src/HAL/shared/eeprom_api.h b/Marlin/src/HAL/shared/eeprom_api.h deleted file mode 100644 index 6445f7a4aa..0000000000 --- a/Marlin/src/HAL/shared/eeprom_api.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include -#include - -#include "../../libs/crc16.h" - -class PersistentStore { -public: - - // Total available persistent storage space (in bytes) - static size_t capacity(); - - // Prepare to read or write - static bool access_start(); - - // Housecleaning after read or write - static bool access_finish(); - - // Write one or more bytes of data and update the CRC - // Return 'true' on write error - static bool write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc); - - // Read one or more bytes of data and update the CRC - // Return 'true' on read error - static bool read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing=true); - - // Write one or more bytes of data - // Return 'true' on write error - static inline bool write_data(const int pos, const uint8_t* value, const size_t size=sizeof(uint8_t)) { - int data_pos = pos; - uint16_t crc = 0; - return write_data(data_pos, value, size, &crc); - } - - // Write a single byte of data - // Return 'true' on write error - static inline bool write_data(const int pos, const uint8_t value) { return write_data(pos, &value); } - - // Read one or more bytes of data - // Return 'true' on read error - static inline bool read_data(const int pos, uint8_t* value, const size_t size=1) { - int data_pos = pos; - uint16_t crc = 0; - return read_data(data_pos, value, size, &crc); - } -}; - -extern PersistentStore persistentStore; diff --git a/Marlin/src/HAL/shared/eeprom_if.h b/Marlin/src/HAL/shared/eeprom_if.h deleted file mode 100644 index e44da801df..0000000000 --- a/Marlin/src/HAL/shared/eeprom_if.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// -// EEPROM -// -void eeprom_init(); -void eeprom_write_byte(uint8_t *pos, unsigned char value); -uint8_t eeprom_read_byte(uint8_t *pos); diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp deleted file mode 100644 index cc22bf7d98..0000000000 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Platform-independent Arduino functions for I2C EEPROM. - * Enable USE_SHARED_EEPROM if not supplied by the framework. - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(I2C_EEPROM) - -#include "eeprom_if.h" -#include - -void eeprom_init() { Wire.begin(); } - -#if ENABLED(USE_SHARED_EEPROM) - -#ifndef EEPROM_WRITE_DELAY - #define EEPROM_WRITE_DELAY 5 -#endif -#ifndef EEPROM_DEVICE_ADDRESS - #define EEPROM_DEVICE_ADDRESS 0x50 -#endif - -static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRESS); - -// ------------------------ -// Public functions -// ------------------------ - -void eeprom_write_byte(uint8_t *pos, unsigned char value) { - const unsigned eeprom_address = (unsigned)pos; - - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB - Wire.write(value); - Wire.endTransmission(); - - // wait for write cycle to complete - // this could be done more efficiently with "acknowledge polling" - delay(EEPROM_WRITE_DELAY); -} - -uint8_t eeprom_read_byte(uint8_t *pos) { - const unsigned eeprom_address = (unsigned)pos; - - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB - Wire.endTransmission(); - Wire.requestFrom(eeprom_device_address, (byte)1); - return Wire.available() ? Wire.read() : 0xFF; -} - -#endif // USE_SHARED_EEPROM -#endif // I2C_EEPROM diff --git a/Marlin/src/HAL/shared/eeprom_if_spi.cpp b/Marlin/src/HAL/shared/eeprom_if_spi.cpp deleted file mode 100644 index a341fef9de..0000000000 --- a/Marlin/src/HAL/shared/eeprom_if_spi.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Platform-independent Arduino functions for SPI EEPROM. - * Enable USE_SHARED_EEPROM if not supplied by the framework. - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SPI_EEPROM) - -#include "eeprom_if.h" - -void eeprom_init() {} - -#if ENABLED(USE_SHARED_EEPROM) - -#define CMD_WREN 6 // WREN -#define CMD_READ 2 // WRITE -#define CMD_WRITE 2 // WRITE - -#ifndef EEPROM_WRITE_DELAY - #define EEPROM_WRITE_DELAY 7 -#endif - -uint8_t eeprom_read_byte(uint8_t* pos) { - uint8_t v; - uint8_t eeprom_temp[3]; - - // set read location - // begin transmission from device - eeprom_temp[0] = CMD_READ; - eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; // addr High - eeprom_temp[2] = (unsigned)pos& 0xFF; // addr Low - WRITE(SPI_EEPROM1_CS, HIGH); - WRITE(SPI_EEPROM1_CS, LOW); - spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); - - v = spiRec(SPI_CHAN_EEPROM1); - WRITE(SPI_EEPROM1_CS, HIGH); - return v; -} - -void eeprom_write_byte(uint8_t* pos, uint8_t value) { - uint8_t eeprom_temp[3]; - - /*write enable*/ - eeprom_temp[0] = CMD_WREN; - WRITE(SPI_EEPROM1_CS, LOW); - spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 1); - WRITE(SPI_EEPROM1_CS, HIGH); - delay(1); - - /*write addr*/ - eeprom_temp[0] = CMD_WRITE; - eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; //addr High - eeprom_temp[2] = (unsigned)pos & 0xFF; //addr Low - WRITE(SPI_EEPROM1_CS, LOW); - spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); - - spiSend(SPI_CHAN_EEPROM1, value); - WRITE(SPI_EEPROM1_CS, HIGH); - delay(EEPROM_WRITE_DELAY); // wait for page write to complete -} - -#endif // USE_SHARED_EEPROM -#endif // I2C_EEPROM diff --git a/Marlin/src/HAL/shared/esp_wifi.cpp b/Marlin/src/HAL/shared/esp_wifi.cpp deleted file mode 100644 index a55f5ca39f..0000000000 --- a/Marlin/src/HAL/shared/esp_wifi.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" -#include "Delay.h" - -void esp_wifi_init(void) { // init ESP01 WIFI module pins - #if PIN_EXISTS(ESP_WIFI_MODULE_GPIO0) - OUT_WRITE(ESP_WIFI_MODULE_GPIO0_PIN, HIGH); - #endif - #if PIN_EXISTS(ESP_WIFI_MODULE_GPIO2) - OUT_WRITE(ESP_WIFI_MODULE_GPIO2_PIN, HIGH); - #endif - #if PIN_EXISTS(ESP_WIFI_MODULE_RESET) - delay(1); // power up delay (0.1mS minimum) - OUT_WRITE(ESP_WIFI_MODULE_RESET_PIN, LOW); - delay(1); - OUT_WRITE(ESP_WIFI_MODULE_RESET_PIN, HIGH); - #endif - #if PIN_EXISTS(ESP_WIFI_MODULE_ENABLE) - delay(1); // delay after reset released (0.1mS minimum) - OUT_WRITE(ESP_WIFI_MODULE_ENABLE_PIN, HIGH); - #endif -} diff --git a/Marlin/src/HAL/shared/esp_wifi.h b/Marlin/src/HAL/shared/esp_wifi.h deleted file mode 100644 index 84a50a941d..0000000000 --- a/Marlin/src/HAL/shared/esp_wifi.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -void esp_wifi_init(); diff --git a/Marlin/src/HAL/shared/math_32bit.h b/Marlin/src/HAL/shared/math_32bit.h index 87e9e6406e..472dfc3b56 100644 --- a/Marlin/src/HAL/shared/math_32bit.h +++ b/Marlin/src/HAL/shared/math_32bit.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef MATH_32BIT_H +#define MATH_32BIT_H #include "../../core/macros.h" @@ -29,3 +31,5 @@ static FORCE_INLINE uint32_t MultiU32X24toH32(uint32_t longIn1, uint32_t longIn2) { return ((uint64_t)longIn1 * longIn2 + 0x00800000) >> 24; } + +#endif // MATH_32BIT_H diff --git a/Marlin/src/HAL/shared/persistent_store_api.cpp b/Marlin/src/HAL/shared/persistent_store_api.cpp new file mode 100644 index 0000000000..50adc12631 --- /dev/null +++ b/Marlin/src/HAL/shared/persistent_store_api.cpp @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EEPROM_SETTINGS) + + #include "persistent_store_api.h" + PersistentStore persistentStore; + +#endif diff --git a/Marlin/src/HAL/shared/persistent_store_api.h b/Marlin/src/HAL/shared/persistent_store_api.h new file mode 100644 index 0000000000..09db6310e0 --- /dev/null +++ b/Marlin/src/HAL/shared/persistent_store_api.h @@ -0,0 +1,51 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include +#include + +class PersistentStore { +public: + static bool access_start(); + static bool access_finish(); + static bool write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc); + static bool read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing=true); + static size_t capacity(); + + static inline bool write_data(const int pos, const uint8_t* value, const size_t size=sizeof(uint8_t)) { + int data_pos = pos; + uint16_t crc = 0; + return write_data(data_pos, value, size, &crc); + } + + static inline bool write_data(const int pos, const uint8_t value) { return write_data(pos, &value); } + + static inline bool read_data(const int pos, uint8_t* value, const size_t size=1) { + int data_pos = pos; + uint16_t crc = 0; + return read_data(data_pos, value, size, &crc); + } +}; + +extern PersistentStore persistentStore; diff --git a/Marlin/src/HAL/shared/servo.cpp b/Marlin/src/HAL/shared/servo.cpp index cfec6f3017..82b7b9ade6 100644 --- a/Marlin/src/HAL/shared/servo.cpp +++ b/Marlin/src/HAL/shared/servo.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -48,26 +48,28 @@ * readMicroseconds() - Get the last-written servo pulse width in microseconds. * attached() - Return true if a servo is attached. * detach() - Stop an attached servo from pulsing its i/o pin. + * */ #include "../../inc/MarlinConfig.h" -#if SHARED_SERVOS +#if HAS_SERVOS && !(IS_32BIT_TEENSY || defined(TARGET_LPC1768) || defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) +//#include #include "servo.h" #include "servo_private.h" -ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures -uint8_t ServoCount = 0; // the total number of attached servos +ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures +uint8_t ServoCount = 0; // the total number of attached servos -#define SERVO_MIN(v) (MIN_PULSE_WIDTH - (v) * 4) // minimum value in uS for this servo -#define SERVO_MAX(v) (MAX_PULSE_WIDTH - (v) * 4) // maximum value in uS for this servo +#define SERVO_MIN() (MIN_PULSE_WIDTH - this->min * 4) // minimum value in uS for this servo +#define SERVO_MAX() (MAX_PULSE_WIDTH - this->max * 4) // maximum value in uS for this servo /************ static functions common to all instances ***********************/ static boolean isTimerActive(timer16_Sequence_t timer) { // returns true if any servo is active on this timer - LOOP_L_N(channel, SERVOS_PER_TIMER) { + for (uint8_t channel = 0; channel < SERVOS_PER_TIMER; channel++) { if (SERVO(timer, channel).Pin.isActive) return true; } @@ -78,79 +80,82 @@ static boolean isTimerActive(timer16_Sequence_t timer) { Servo::Servo() { if (ServoCount < MAX_SERVOS) { - servoIndex = ServoCount++; // assign a servo index to this instance - servo_info[servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009 + this->servoIndex = ServoCount++; // assign a servo index to this instance + servo_info[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009 } else - servoIndex = INVALID_SERVO; // too many servos + this->servoIndex = INVALID_SERVO; // too many servos } -int8_t Servo::attach(const int inPin) { - return attach(inPin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); +int8_t Servo::attach(const int pin) { + return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); } -int8_t Servo::attach(const int inPin, const int inMin, const int inMax) { +int8_t Servo::attach(const int pin, const int min, const int max) { - if (servoIndex >= MAX_SERVOS) return -1; + if (this->servoIndex >= MAX_SERVOS) return -1; - if (inPin > 0) servo_info[servoIndex].Pin.nbr = inPin; - pinMode(servo_info[servoIndex].Pin.nbr, OUTPUT); // set servo pin to output + if (pin > 0) servo_info[this->servoIndex].Pin.nbr = pin; + pinMode(servo_info[this->servoIndex].Pin.nbr, OUTPUT); // set servo pin to output - // TODO: min/max check: ABS(min - MIN_PULSE_WIDTH) / 4 < 128 - min = (MIN_PULSE_WIDTH - inMin) / 4; //resolution of min/max is 4 uS - max = (MAX_PULSE_WIDTH - inMax) / 4; + // todo min/max check: ABS(min - MIN_PULSE_WIDTH) /4 < 128 + this->min = (MIN_PULSE_WIDTH - min) / 4; //resolution of min/max is 4 uS + this->max = (MAX_PULSE_WIDTH - max) / 4; // initialize the timer if it has not already been initialized timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); if (!isTimerActive(timer)) initISR(timer); - servo_info[servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive + servo_info[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive - return servoIndex; + return this->servoIndex; } void Servo::detach() { - servo_info[servoIndex].Pin.isActive = false; + servo_info[this->servoIndex].Pin.isActive = false; timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); if (!isTimerActive(timer)) finISR(timer); } void Servo::write(int value) { - if (value < MIN_PULSE_WIDTH) // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) - value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(min), SERVO_MAX(max)); - writeMicroseconds(value); + if (value < MIN_PULSE_WIDTH) { // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) + value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(), SERVO_MAX()); + } + this->writeMicroseconds(value); } void Servo::writeMicroseconds(int value) { // calculate and store the values for the given channel - byte channel = servoIndex; + byte channel = this->servoIndex; if (channel < MAX_SERVOS) { // ensure channel is valid // ensure pulse width is valid - value = constrain(value, SERVO_MIN(min), SERVO_MAX(max)) - (TRIM_DURATION); + value = constrain(value, SERVO_MIN(), SERVO_MAX()) - (TRIM_DURATION); value = usToTicks(value); // convert to ticks after compensating for interrupt overhead - 12 Aug 2009 - CRITICAL_SECTION_START(); + CRITICAL_SECTION_START; servo_info[channel].ticks = value; - CRITICAL_SECTION_END(); + CRITICAL_SECTION_END; } } // return the value as degrees -int Servo::read() { return map(readMicroseconds() + 1, SERVO_MIN(min), SERVO_MAX(max), 0, 180); } +int Servo::read() { return map(this->readMicroseconds() + 1, SERVO_MIN(), SERVO_MAX(), 0, 180); } int Servo::readMicroseconds() { - return (servoIndex == INVALID_SERVO) ? 0 : ticksToUs(servo_info[servoIndex].ticks) + (TRIM_DURATION); + return (this->servoIndex == INVALID_SERVO) ? 0 : ticksToUs(servo_info[this->servoIndex].ticks) + TRIM_DURATION; } -bool Servo::attached() { return servo_info[servoIndex].Pin.isActive; } +bool Servo::attached() { return servo_info[this->servoIndex].Pin.isActive; } void Servo::move(const int value) { constexpr uint16_t servo_delay[] = SERVO_DELAY; static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); - if (attach(0) >= 0) { - write(value); - safe_delay(servo_delay[servoIndex]); - TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + if (this->attach(0) >= 0) { + this->write(value); + safe_delay(servo_delay[this->servoIndex]); + #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) + this->detach(); + #endif } } -#endif // SHARED_SERVOS +#endif // HAS_SERVOS diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h index 6d850da851..b838a99056 100644 --- a/Marlin/src/HAL/shared/servo.h +++ b/Marlin/src/HAL/shared/servo.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 @@ -41,6 +40,7 @@ */ /** + * * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. * The servos are pulsed in the background using the value most recently written using the write() method * @@ -66,29 +66,25 @@ * With DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY and detach. */ +#pragma once + #if IS_TEENSY32 - #include "../TEENSY31_32/Servo.h" + #include "../HAL_TEENSY31_32/HAL_Servo_Teensy.h" #elif IS_TEENSY35 || IS_TEENSY36 - #include "../TEENSY35_36/Servo.h" -#elif IS_TEENSY40 || IS_TEENSY41 - #include "../TEENSY40_41/Servo.h" + #include "../HAL_TEENSY35_36/HAL_Servo_Teensy.h" #elif defined(TARGET_LPC1768) - #include "../LPC1768/Servo.h" -#elif defined(__STM32F1__) || defined(TARGET_STM32F1) - #include "../STM32F1/Servo.h" -#elif defined(STM32GENERIC) && defined(STM32F4) - #include "../STM32_F4_F7/Servo.h" -#elif defined(ARDUINO_ARCH_STM32) - #include "../STM32/Servo.h" -#elif defined(ARDUINO_ARCH_ESP32) - #include "../ESP32/Servo.h" + #include "../HAL_LPC1768/LPC1768_Servo.h" +#elif defined(STM32F1) || defined(STM32F1xx) + #include "../HAL_STM32F1/HAL_Servo_STM32F1.h" +#elif defined(STM32F4) || defined(STM32F4xx) + #include "../HAL_STM32F4/HAL_Servo_STM32F4.h" #else #include - #if defined(__AVR__) || defined(ARDUINO_ARCH_SAM) || defined(__SAMD51__) + #if defined(__AVR__) || defined(ARDUINO_ARCH_SAM) // we're good to go #else - #error "This library only supports boards with an AVR, SAM3X or SAMD51 processor." + #error "This library only supports boards with an AVR or SAM3X processor." #endif #define Servo_VERSION 2 // software version of this library diff --git a/Marlin/src/HAL/shared/servo_private.h b/Marlin/src/HAL/shared/servo_private.h index d85d8da8ba..2dcc9eb98f 100644 --- a/Marlin/src/HAL/shared/servo_private.h +++ b/Marlin/src/HAL/shared/servo_private.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * servo_private.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 @@ -40,17 +39,18 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifndef SERVO_PRIVATE_H +#define SERVO_PRIVATE_H + #include // Architecture specific include #ifdef __AVR__ - #include "../AVR/ServoTimers.h" + #include "../HAL_AVR/ServoTimers.h" #elif defined(ARDUINO_ARCH_SAM) - #include "../DUE/ServoTimers.h" -#elif defined(__SAMD51__) - #include "../SAMD51/ServoTimers.h" + #include "../HAL_DUE/ServoTimers.h" #else - #error "This library only supports boards with an AVR, SAM3X or SAMD51 processor." + #error "This library only supports boards with an AVR or SAM3X processor." #endif // Macros @@ -65,9 +65,11 @@ #define INVALID_SERVO 255 // flag indicating an invalid servo index -// Convert microseconds to ticks and back (PRESCALER depends on architecture) -#define usToTicks(_us) (clockCyclesPerMicrosecond() * (_us) / (SERVO_TIMER_PRESCALER)) -#define ticksToUs(_ticks) (unsigned(_ticks) * (SERVO_TIMER_PRESCALER) / clockCyclesPerMicrosecond()) +// +#define usToTicks(_us) (( clockCyclesPerMicrosecond()* _us) / PRESCALER) // converts microseconds to tick (PRESCALER depends on architecture) +#define ticksToUs(_ticks) (( (unsigned)_ticks * PRESCALER)/ clockCyclesPerMicrosecond() ) // converts from ticks back to microseconds + +//#define NBR_TIMERS ((MAX_SERVOS) / (SERVOS_PER_TIMER)) // convenience macros #define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / (SERVOS_PER_TIMER))) // returns the timer controlling this servo @@ -78,7 +80,7 @@ // Types typedef struct { - uint8_t nbr : 7 ; // a pin number from 0 to 127 + uint8_t nbr : 6 ; // a pin number from 0 to 63 uint8_t isActive : 1 ; // true if this channel is enabled, pin not pulsed if false } ServoPin_t; @@ -96,3 +98,5 @@ extern ServoInfo_t servo_info[MAX_SERVOS]; extern void initISR(timer16_Sequence_t timer); extern void finISR(timer16_Sequence_t timer); + +#endif // SERVO_PRIVATE_H diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp new file mode 100644 index 0000000000..69f725f416 --- /dev/null +++ b/Marlin/src/Marlin.cpp @@ -0,0 +1,1048 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * About Marlin + * + * This firmware is a mashup between Sprinter and grbl. + * - https://github.com/kliment/Sprinter + * - https://github.com/grbl/grbl + */ + +#include "Marlin.h" +#include +#include +#include + +#include "lcd/ultralcd.h" +#include "module/motion.h" +#include "module/planner.h" +#include "module/stepper.h" +#include "module/endstops.h" +#include "module/probe.h" +#include "module/temperature.h" +#include "sd/cardreader.h" +#include "module/configuration_store.h" +#include "module/printcounter.h" // PrintCounter or Stopwatch +#include "feature/closedloop.h" + +#ifdef ARDUINO + #include +#endif +#include +#include "libs/nozzle.h" + +#include "gcode/gcode.h" +#include "gcode/parser.h" +#include "gcode/queue.h" + +#if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER) + #include "libs/buzzer.h" +#endif + +#if ENABLED(DIGIPOT_I2C) + #include "feature/digipot/digipot.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "feature/mixing.h" +#endif + +#if ENABLED(BEZIER_CURVE_SUPPORT) + #include "module/planner_bezier.h" +#endif + +#if ENABLED(MAX7219_DEBUG) + #include "feature/Max7219_Debug_LEDs.h" +#endif + +#if HAS_COLOR_LEDS + #include "feature/leds/leds.h" +#endif + +#if HAS_SERVOS + #include "module/servo.h" +#endif + +#if HAS_DIGIPOTSS + #include +#endif + +#if ENABLED(DAC_STEPPER_CURRENT) + #include "feature/dac/stepper_dac.h" +#endif + +#if ENABLED(EXPERIMENTAL_I2CBUS) + #include "feature/twibus.h" + TWIBus i2c; +#endif + +#if ENABLED(I2C_POSITION_ENCODERS) + #include "feature/I2CPositionEncoder.h" +#endif + +#if HAS_TRINAMIC + #include "feature/tmc_util.h" +#endif + +#if ENABLED(SDSUPPORT) + CardReader card; +#endif + +#if ENABLED(G38_PROBE_TARGET) + bool G38_move = false, + G38_endstop_hit = false; +#endif + +#if ENABLED(DELTA) + #include "module/delta.h" +#elif IS_SCARA + #include "module/scara.h" +#endif + +#if HAS_LEVELING + #include "feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) && ENABLED(PAUSE_PARK_NO_STEPPER_TIMEOUT) + #include "feature/pause.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "feature/power_loss_recovery.h" +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #include "feature/runout.h" +#endif + +#if ENABLED(TEMP_STAT_LEDS) + #include "feature/leds/tempstat.h" +#endif + +#if HAS_CASE_LIGHT + #include "feature/caselight.h" +#endif + +#if HAS_FANMUX + #include "feature/fanmux.h" +#endif + +#if DO_SWITCH_EXTRUDER || ENABLED(SWITCHING_NOZZLE) || ENABLED(PARKING_EXTRUDER) + #include "module/tool_change.h" +#endif + +#if ENABLED(USE_CONTROLLER_FAN) + #include "feature/controllerfan.h" +#endif + +bool Running = true; + +/** + * axis_homed + * Flags that each linear axis was homed. + * XYZ on cartesian, ABC on delta, ABZ on SCARA. + * + * axis_known_position + * Flags that the position is known in each linear axis. Set when homed. + * Cleared whenever a stepper powers off, potentially losing its position. + */ +uint8_t axis_homed, axis_known_position; // = 0 + +#if ENABLED(TEMPERATURE_UNITS_SUPPORT) + TempUnit input_temp_units = TEMPUNIT_C; +#endif + +#if FAN_COUNT > 0 + int16_t fanSpeeds[FAN_COUNT] = { 0 }; + #if ENABLED(EXTRA_FAN_SPEED) + int16_t old_fanSpeeds[FAN_COUNT], + new_fanSpeeds[FAN_COUNT]; + #endif + #if ENABLED(PROBING_FANS_OFF) + bool fans_paused; // = false; + int16_t paused_fanSpeeds[FAN_COUNT] = { 0 }; + #endif +#endif + +// For M109 and M190, this flag may be cleared (by M108) to exit the wait loop +volatile bool wait_for_heatup = true; + +// For M0/M1, this flag may be cleared (by M108) to exit the wait-for-user loop +#if HAS_RESUME_CONTINUE + volatile bool wait_for_user; // = false; +#endif + +#if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) + bool suspend_auto_report; // = false +#endif + +// Inactivity shutdown +millis_t max_inactive_time, // = 0 + stepper_inactive_time = (DEFAULT_STEPPER_DEACTIVE_TIME) * 1000UL; + +#ifdef CHDK + millis_t chdkHigh; // = 0; + bool chdkActive; // = false; +#endif + +#if ENABLED(I2C_POSITION_ENCODERS) + I2CPositionEncodersMgr I2CPEM; +#endif + +/** + * *************************************************************************** + * ******************************** FUNCTIONS ******************************** + * *************************************************************************** + */ + +void setup_killpin() { + #if HAS_KILL + SET_INPUT_PULLUP(KILL_PIN); + #endif +} + +void setup_powerhold() { + #if HAS_SUICIDE + OUT_WRITE(SUICIDE_PIN, HIGH); + #endif + #if HAS_POWER_SWITCH + #if ENABLED(PS_DEFAULT_OFF) + PSU_OFF(); + #else + PSU_ON(); + #endif + #endif +} + +/** + * Stepper Reset (RigidBoard, et.al.) + */ +#if HAS_STEPPER_RESET + void disableStepperDrivers() { + OUT_WRITE(STEPPER_RESET_PIN, LOW); // drive it down to hold in reset motor driver chips + } + void enableStepperDrivers() { SET_INPUT(STEPPER_RESET_PIN); } // set to input, which allows it to be pulled high by pullups +#endif + +#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 + + void i2c_on_receive(int bytes) { // just echo all bytes received to serial + i2c.receive(bytes); + } + + void i2c_on_request() { // just send dummy data for now + i2c.reply("Hello World!\n"); + } + +#endif + +/** + * Sensitive pin test for M42, M226 + */ +bool pin_is_protected(const pin_t pin) { + static const pin_t sensitive_pins[] PROGMEM = SENSITIVE_PINS; + for (uint8_t i = 0; i < COUNT(sensitive_pins); i++) { + pin_t sensitive_pin; + memcpy_P(&sensitive_pin, &sensitive_pins[i], sizeof(pin_t)); + if (pin == sensitive_pin) return true; + } + return false; +} + +void protected_pin_err() { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_PROTECTED_PIN); +} + +void quickstop_stepper() { + planner.quick_stop(); + planner.synchronize(); + set_current_from_steppers_for_axis(ALL_AXES); + SYNC_PLAN_POSITION_KINEMATIC(); +} + +void enable_all_steppers() { + #if ENABLED(AUTO_POWER_CONTROL) + powerManager.power_on(); + #endif + enable_X(); + enable_Y(); + enable_Z(); + enable_E0(); + enable_E1(); + enable_E2(); + enable_E3(); + enable_E4(); +} + +void disable_e_steppers() { + disable_E0(); + disable_E1(); + disable_E2(); + disable_E3(); + disable_E4(); +} + +void disable_e_stepper(const uint8_t e) { + switch (e) { + case 0: disable_E0(); break; + case 1: disable_E1(); break; + case 2: disable_E2(); break; + case 3: disable_E3(); break; + case 4: disable_E4(); break; + } +} + +void disable_all_steppers() { + disable_X(); + disable_Y(); + disable_Z(); + disable_e_steppers(); +} + +/** + * Manage several activities: + * - Check for Filament Runout + * - Keep the command buffer full + * - Check for maximum inactive time between commands + * - Check for maximum inactive time between stepper commands + * - Check if pin CHDK needs to go LOW + * - Check for KILL button held down + * - Check for HOME button held down + * - Check if cooling fan needs to be switched on + * - Check if an idle but hot extruder needs filament extruded (EXTRUDER_RUNOUT_PREVENT) + */ +void manage_inactivity(const bool ignore_stepper_queue/*=false*/) { + + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + runout.run(); + #endif + + if (commands_in_queue < BUFSIZE) get_available_commands(); + + const millis_t ms = millis(); + + if (max_inactive_time && ELAPSED(ms, gcode.previous_move_ms + max_inactive_time)) { + SERIAL_ERROR_START(); + SERIAL_ECHOLNPAIR(MSG_KILL_INACTIVE_TIME, parser.command_ptr); + kill(PSTR(MSG_KILLED)); + } + + // Prevent steppers timing-out in the middle of M600 + #if ENABLED(ADVANCED_PAUSE_FEATURE) && ENABLED(PAUSE_PARK_NO_STEPPER_TIMEOUT) + #define MOVE_AWAY_TEST !did_pause_print + #else + #define MOVE_AWAY_TEST true + #endif + + if (stepper_inactive_time) { + if (planner.has_blocks_queued()) + gcode.previous_move_ms = ms; // reset_stepper_timeout to keep steppers powered + else if (MOVE_AWAY_TEST && !ignore_stepper_queue && ELAPSED(ms, gcode.previous_move_ms + stepper_inactive_time)) { + #if ENABLED(DISABLE_INACTIVE_X) + disable_X(); + #endif + #if ENABLED(DISABLE_INACTIVE_Y) + disable_Y(); + #endif + #if ENABLED(DISABLE_INACTIVE_Z) + disable_Z(); + #endif + #if ENABLED(DISABLE_INACTIVE_E) + disable_e_steppers(); + #endif + #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTIPANEL) // Only needed with an LCD + if (ubl.lcd_map_control) ubl.lcd_map_control = defer_return_to_status = false; + #endif + } + } + + #ifdef CHDK // Check if pin should be set to LOW after M240 set it to HIGH + if (chdkActive && ELAPSED(ms, chdkHigh + CHDK_DELAY)) { + chdkActive = false; + WRITE(CHDK, LOW); + } + #endif + + #if HAS_KILL + + // Check if the kill button was pressed and wait just in case it was an accidental + // key kill key press + // ------------------------------------------------------------------------------- + static int killCount = 0; // make the inactivity button a bit less responsive + const int KILL_DELAY = 750; + if (!READ(KILL_PIN)) + killCount++; + else if (killCount > 0) + killCount--; + + // Exceeded threshold and we can confirm that it was not accidental + // KILL the machine + // ---------------------------------------------------------------- + if (killCount >= KILL_DELAY) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_KILL_BUTTON); + kill(PSTR(MSG_KILLED)); + } + #endif + + #if HAS_HOME + // Check to see if we have to home, use poor man's debouncer + // --------------------------------------------------------- + static int homeDebounceCount = 0; // poor man's debouncing count + const int HOME_DEBOUNCE_DELAY = 2500; + if (!IS_SD_PRINTING && !READ(HOME_PIN)) { + if (!homeDebounceCount) { + enqueue_and_echo_commands_P(PSTR("G28")); + LCD_MESSAGEPGM(MSG_AUTO_HOME); + } + if (homeDebounceCount < HOME_DEBOUNCE_DELAY) + homeDebounceCount++; + else + homeDebounceCount = 0; + } + #endif + + #if ENABLED(USE_CONTROLLER_FAN) + controllerfan_update(); // Check if fan should be turned on to cool stepper drivers down + #endif + + #if ENABLED(AUTO_POWER_CONTROL) + powerManager.check(); + #endif + + #if ENABLED(EXTRUDER_RUNOUT_PREVENT) + if (thermalManager.degHotend(active_extruder) > EXTRUDER_RUNOUT_MINTEMP + && ELAPSED(ms, gcode.previous_move_ms + (EXTRUDER_RUNOUT_SECONDS) * 1000UL) + && !planner.has_blocks_queued() + ) { + #if ENABLED(SWITCHING_EXTRUDER) + bool oldstatus; + switch (active_extruder) { + default: oldstatus = E0_ENABLE_READ; enable_E0(); break; + #if E_STEPPERS > 1 + case 2: case 3: oldstatus = E1_ENABLE_READ; enable_E1(); break; + #if E_STEPPERS > 2 + case 4: oldstatus = E2_ENABLE_READ; enable_E2(); break; + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #else // !SWITCHING_EXTRUDER + bool oldstatus; + switch (active_extruder) { + default: oldstatus = E0_ENABLE_READ; enable_E0(); break; + #if E_STEPPERS > 1 + case 1: oldstatus = E1_ENABLE_READ; enable_E1(); break; + #if E_STEPPERS > 2 + case 2: oldstatus = E2_ENABLE_READ; enable_E2(); break; + #if E_STEPPERS > 3 + case 3: oldstatus = E3_ENABLE_READ; enable_E3(); break; + #if E_STEPPERS > 4 + case 4: oldstatus = E4_ENABLE_READ; enable_E4(); break; + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #endif // !SWITCHING_EXTRUDER + + const float olde = current_position[E_AXIS]; + current_position[E_AXIS] += EXTRUDER_RUNOUT_EXTRUDE; + planner.buffer_line_kinematic(current_position, MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED), active_extruder); + current_position[E_AXIS] = olde; + planner.set_e_position_mm(olde); + planner.synchronize(); + + #if ENABLED(SWITCHING_EXTRUDER) + switch (active_extruder) { + default: oldstatus = E0_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 1 + case 2: case 3: oldstatus = E1_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 2 + case 4: oldstatus = E2_ENABLE_WRITE(oldstatus); break; + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #else // !SWITCHING_EXTRUDER + switch (active_extruder) { + case 0: E0_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 1 + case 1: E1_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 2 + case 2: E2_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 3 + case 3: E3_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 4 + case 4: E4_ENABLE_WRITE(oldstatus); break; + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #endif // !SWITCHING_EXTRUDER + + gcode.previous_move_ms = ms; // reset_stepper_timeout to keep steppers powered + } + #endif // EXTRUDER_RUNOUT_PREVENT + + #if ENABLED(DUAL_X_CARRIAGE) + // handle delayed move timeout + if (delayed_move_time && ELAPSED(ms, delayed_move_time + 1000UL) && IsRunning()) { + // travel moves have been received so enact them + delayed_move_time = 0xFFFFFFFFUL; // force moves to be done + set_destination_from_current(); + prepare_move_to_destination(); + } + #endif + + #if ENABLED(TEMP_STAT_LEDS) + handle_status_leds(); + #endif + + #if ENABLED(MONITOR_DRIVER_STATUS) + monitor_tmc_driver(); + #endif + + // Limit check_axes_activity frequency to 10Hz + static millis_t next_check_axes_ms = 0; + if (ELAPSED(ms, next_check_axes_ms)) { + planner.check_axes_activity(); + next_check_axes_ms = ms + 100UL; + } +} + +#if ENABLED(MAX7219_DEBUG) + unsigned long int zz = 0, // Temporary - will go away soon - used by loop() + zzz = 0, // Temporary - will go away soon - used by Marlin_idle() + zzzz = 0, // Temporary - will go away soon - used by Marlin_main_loop() + zzzzz = 0; // Temporary - will go away soon - used by idle() +#endif + +/** + * Standard idle routine keeps the machine alive + */ +void idle( + #if ENABLED(ADVANCED_PAUSE_FEATURE) + bool no_stepper_sleep/*=false*/ + #endif +) { + #if ENABLED(MAX7219_DEBUG) + zzzzz++; + max7219.do_command(LED_SET_ROW, 0, 5, uint8_t(zzzzz >> 5)); + #endif + + lcd_update(); + + #if ENABLED(HOST_KEEPALIVE_FEATURE) + gcode.host_keepalive(); + #endif + + manage_inactivity( + #if ENABLED(ADVANCED_PAUSE_FEATURE) + no_stepper_sleep + #endif + ); + + thermalManager.manage_heater(); + + #if ENABLED(PRINTCOUNTER) + print_job_timer.tick(); + #endif + + #if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER) + buzzer.tick(); + #endif + + #if ENABLED(I2C_POSITION_ENCODERS) + static millis_t i2cpem_next_update_ms; + if (planner.has_blocks_queued() && ELAPSED(millis(), i2cpem_next_update_ms)) { + I2CPEM.update(); + i2cpem_next_update_ms = millis() + I2CPE_MIN_UPD_TIME_MS; + } + #endif + + #ifdef HAL_IDLETASK + HAL_idletask(); + #endif + + #if HAS_AUTO_REPORTING + if (!suspend_auto_report) { + #if ENABLED(AUTO_REPORT_TEMPERATURES) + thermalManager.auto_report_temperatures(); + #endif + #if ENABLED(AUTO_REPORT_SD_STATUS) + card.auto_report_sd_status(); + #endif + } + #endif +} + +/** + * Kill all activity and lock the machine. + * After this the machine will need to be reset. + */ +void kill(const char* lcd_msg) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_KILLED); + + thermalManager.disable_all_heaters(); + disable_all_steppers(); + + #if ENABLED(ULTRA_LCD) + kill_screen(lcd_msg); + #else + UNUSED(lcd_msg); + #endif + + _delay_ms(600); // Wait a short time (allows messages to get out before shutting down. + cli(); // Stop interrupts + + _delay_ms(250); //Wait to ensure all interrupts routines stopped + thermalManager.disable_all_heaters(); //turn off heaters again + + #ifdef ACTION_ON_KILL + SERIAL_ECHOLNPGM("//action:" ACTION_ON_KILL); + #endif + + #if HAS_POWER_SWITCH + PSU_OFF(); + #endif + + #if HAS_SUICIDE + suicide(); + #endif + + while (1) { + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif + } // Wait for reset +} + +/** + * Turn off heaters and stop the print in progress + * After a stop the machine may be resumed with M999 + */ +void stop() { + thermalManager.disable_all_heaters(); // 'unpause' taken care of in here + + #if ENABLED(PROBING_FANS_OFF) + if (fans_paused) fans_pause(false); // put things back the way they were + #endif + + if (IsRunning()) { + Stopped_gcode_LastN = gcode_LastN; // Save last g_code for restart + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + safe_delay(350); // allow enough time for messages to get out before stopping + Running = false; + } +} + +TaskFunction_t Marlin_main_loop(); +TaskFunction_t Marlin_idle(); + +/** + * Marlin entry-point: Set up before the program loop + * - Set up the kill pin, filament runout, power hold + * - Start the serial port + * - Print startup messages and diagnostics + * - Get EEPROM or default settings + * - Initialize managers for: + * • temperature + * • planner + * • watchdog + * • stepper + * • photo pin + * • servos + * • LCD controller + * • Digipot I2C + * • Z probe sled + * • status LEDs + */ +void setup() { + unsigned short ss; + char *ptr; + + #ifdef HAL_INIT + HAL_init(); + #endif + + #if ENABLED(MAX7219_DEBUG) + max7219.init(); + #endif + + ptr = (char*)malloc(75); // reserve some memory for the RTOS to use later. It will be given + // back after the Marlin-loop task is started. + + xTaskCreate((TaskFunction_t) Marlin_idle, "Marlin_idle", 450 /* Stack size */, NULL, 4 /* priority */, NULL ); + + // Keep trying to start the Marlin_main_loop task until it succeeds. The Marlin_main_loop + // task needs to be the very last task started because we try to give it as much memory as possible. + // (it may make sense to reduce the 150 bytes of RTOS memory reservered up above!!! But for now, + // that gives developers some flexibility and debug capabilities.) + + for (ss = 10000; ss > 300; ss -= 100) + if (pdPASS == xTaskCreate((TaskFunction_t) Marlin_main_loop, "Marlin_loop", ss /* Stack size */, NULL, 5 /* priority */, NULL)) + break; + + if (ss < 350) for (;;) { /* nada */ } // Die if Marlin_main_loop didn't get enough memory. + + free(ptr); // give back the memory we reserved for generic RTOS usage + + #if ENABLED(DISABLE_JTAG) + // Disable JTAG on AT90USB chips to free up pins for IO + MCUCR = 0x80; + MCUCR = 0x80; + #endif + + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + runout.setup(); + #endif + + setup_killpin(); + + setup_powerhold(); + + #if HAS_STEPPER_RESET + disableStepperDrivers(); + #endif + + #if NUM_SERIAL > 0 + MYSERIAL0.begin(BAUDRATE); + #if NUM_SERIAL > 1 + MYSERIAL1.begin(BAUDRATE); + #endif + #endif + + #if NUM_SERIAL > 0 + uint32_t serial_connect_timeout = millis() + 1000UL; + while (!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #if NUM_SERIAL > 1 + serial_connect_timeout = millis() + 1000UL; + while (!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #endif + #endif + + SERIAL_PROTOCOLLNPGM("start"); + SERIAL_ECHO_START(); + + #if HAS_DRIVER(TMC2130) + tmc_init_cs_pins(); + #endif + #if HAS_DRIVER(TMC2208) + tmc2208_serial_begin(); + #endif + + #ifdef BOARD_INIT + BOARD_INIT(); + #endif + + // Check startup - does nothing if bootloader sets MCUSR to 0 + byte mcu = HAL_get_reset_source(); + if (mcu & 1) SERIAL_ECHOLNPGM(MSG_POWERUP); + if (mcu & 2) SERIAL_ECHOLNPGM(MSG_EXTERNAL_RESET); + if (mcu & 4) SERIAL_ECHOLNPGM(MSG_BROWNOUT_RESET); + if (mcu & 8) SERIAL_ECHOLNPGM(MSG_WATCHDOG_RESET); + if (mcu & 32) SERIAL_ECHOLNPGM(MSG_SOFTWARE_RESET); + HAL_clear_reset_source(); + + SERIAL_ECHOPGM(MSG_MARLIN); + SERIAL_CHAR(' '); + SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); + SERIAL_EOL(); + + #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_CONFIGURATION_VER); + SERIAL_ECHOPGM(STRING_DISTRIBUTION_DATE); + SERIAL_ECHOLNPGM(MSG_AUTHOR STRING_CONFIG_H_AUTHOR); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM("Compiled: " __DATE__); + #endif + + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(MSG_FREE_MEMORY, freeMemory()); + SERIAL_ECHOLNPAIR(MSG_PLANNER_BUFFER_BYTES, (int)sizeof(block_t)*BLOCK_BUFFER_SIZE); + + queue_setup(); + + // Load data from EEPROM if available (or use defaults) + // This also updates variables in the planner, elsewhere + +//(void)settings.load(); // For some unknow reason, the EEPROM settings can not be loaded in the setup() + // function. It acts like some flavor of a data corruption problem. The + // setup() routine finishes doing all its work, but the other tasks never start + // running. We need to figure out why this is!!!! + // + // In the mean time... settings.load() is run at the start of the Marlin_main_loop() + // task. This approach seems to work around what ever the problem is. + + #if HAS_M206_COMMAND + // Initialize current position based on home_offset + COPY(current_position, home_offset); + #else + ZERO(current_position); + #endif + + // Vital to init stepper/planner equivalent for current_position + SYNC_PLAN_POSITION_KINEMATIC(); + + thermalManager.init(); // Initialize temperature loop + + print_job_timer.init(); // Initial setup of print job timer + + endstops.init(); // Init endstops and pullups + + stepper.init(); // Init stepper. This enables interrupts! + + #if HAS_SERVOS + servo_init(); + #endif + + #if HAS_Z_SERVO_PROBE + servo_probe_init(); + #endif + + #if HAS_PHOTOGRAPH + OUT_WRITE(PHOTOGRAPH_PIN, LOW); + #endif + + #if HAS_CASE_LIGHT + update_case_light(); + #endif + + #if ENABLED(SPINDLE_LASER_ENABLE) + OUT_WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); // init spindle to off + #if SPINDLE_DIR_CHANGE + OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // init rotation to clockwise (M3) + #endif + #if ENABLED(SPINDLE_LASER_PWM) && defined(SPINDLE_LASER_PWM_PIN) && SPINDLE_LASER_PWM_PIN >= 0 + SET_OUTPUT(SPINDLE_LASER_PWM_PIN); + analogWrite(SPINDLE_LASER_PWM_PIN, SPINDLE_LASER_PWM_INVERT ? 255 : 0); // set to lowest speed + #endif + #endif + + #if HAS_BED_PROBE + endstops.enable_z_probe(false); + #endif + + #if ENABLED(USE_CONTROLLER_FAN) + SET_OUTPUT(CONTROLLER_FAN_PIN); //Set pin used for driver cooling fan + #endif + + #if HAS_STEPPER_RESET + enableStepperDrivers(); + #endif + + #if ENABLED(DIGIPOT_I2C) + digipot_i2c_init(); + #endif + + #if ENABLED(DAC_STEPPER_CURRENT) + dac_init(); + #endif + + #if (ENABLED(Z_PROBE_SLED) || ENABLED(SOLENOID_PROBE)) && HAS_SOLENOID_1 + OUT_WRITE(SOL1_PIN, LOW); // turn it off + #endif + + #if HAS_HOME + SET_INPUT_PULLUP(HOME_PIN); + #endif + + #if PIN_EXISTS(STAT_LED_RED) + OUT_WRITE(STAT_LED_RED_PIN, LOW); // turn it off + #endif + + #if PIN_EXISTS(STAT_LED_BLUE) + OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // turn it off + #endif + + #if HAS_COLOR_LEDS + leds.setup(); + #endif + + #if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + SET_OUTPUT(RGB_LED_R_PIN); + SET_OUTPUT(RGB_LED_G_PIN); + SET_OUTPUT(RGB_LED_B_PIN); + #if ENABLED(RGBW_LED) + SET_OUTPUT(RGB_LED_W_PIN); + #endif + #endif + + #if ENABLED(MK2_MULTIPLEXER) + SET_OUTPUT(E_MUX0_PIN); + SET_OUTPUT(E_MUX1_PIN); + SET_OUTPUT(E_MUX2_PIN); + #endif + + #if HAS_FANMUX + fanmux_init(); + #endif + + lcd_init(); + lcd_reset_status(); + + #if ENABLED(SHOW_BOOTSCREEN) + lcd_bootscreen(); + #endif + + #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 + mixing_tools_init(); + #endif + + #if ENABLED(BLTOUCH) + bltouch_init(); + #endif + + #if ENABLED(I2C_POSITION_ENCODERS) + I2CPEM.init(); + #endif + + #if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 + i2c.onReceive(i2c_on_receive); + i2c.onRequest(i2c_on_request); + #endif + + #if DO_SWITCH_EXTRUDER + move_extruder_servo(0); // Initialize extruder servo + #endif + + #if ENABLED(SWITCHING_NOZZLE) + move_nozzle_servo(0); // Initialize nozzle servo + #endif + + #if ENABLED(PARKING_EXTRUDER) + pe_magnet_init(); + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + check_print_job_recovery(); + #endif + + #if ENABLED(USE_WATCHDOG) // Reinit watchdog after HAL_get_reset_source call + watchdog_init(); + #endif + + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + init_closedloop(); + #endif +} + +/** + * The main Marlin program loop + * + * - Save or log commands to SD + * - Process available commands (if not saving) + * - Call endstop manager + * - Call inactivity manager + */ +TaskFunction_t Marlin_main_loop() { + + // Load data from EEPROM if available (or use defaults) + // This also updates variables in the planner, elsewhere + + (void)settings.load(); // For some unknow reason, the EEPROM settings can not be loaded in the setup() + // function. It acts like some flavor of a data corruption problem. The + // setup() routine finishes doing all its work, but the other tasks never start + // running. We need to figure out why this is!!!! + // + // In the mean time... settings.load() is run at the start of the Marlin_main_loop() + // task. This approach seems to work around what ever the problem is. + + #if ENABLED(MAX7219_DEBUG) + max7219.do_command(LED_CLEAR_MATRIX, 0, 0, 0); + #endif + + for (;;) { + + #if ENABLED(MAX7219_DEBUG) + zzzz++; + max7219.do_command(LED_SET_ROW, 0, 7, uint8_t(zzzz >> 4)); + if ((zzzz & 0x20) == 0x20) + max7219.do_command(LED_TOGGLE, 5, 1, 0); + #endif + + #if ENABLED(SDSUPPORT) + card.checkautostart(); + #endif + + #if ENABLED(SDSUPPORT) && ENABLED(ULTIPANEL) + if (abort_sd_printing) { + abort_sd_printing = false; + card.stopSDPrint( + #if SD_RESORT + true + #endif + ); + clear_command_queue(); + quickstop_stepper(); + print_job_timer.stop(); + thermalManager.disable_all_heaters(); + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; + #endif + wait_for_heatup = false; + #if ENABLED(POWER_LOSS_RECOVERY) + card.removeJobRecoveryFile(); + #endif + } + #endif // SDSUPPORT && ULTIPANEL + + if (commands_in_queue < BUFSIZE) get_available_commands(); + advance_command_queue(); + endstops.event_handler(); + idle(); + vTaskDelay(1); + } +} + +TaskFunction_t Marlin_idle() { + for (;;) { + + #if ENABLED(MAX7219_DEBUG) + max7219.do_command(LED_SET_ROW, 0, 6, (uint8_t) (zzz++ >> 3)); + #endif + + vTaskDelay(3); + } +} + +/** + * Very low priority, non-blocking logic can be called from loop() This represents + * a small shift from the past. FreeRTOS expects a setup() routine and loop() routine + * within an Arduino environment. loop() is called from the RTOS idle task and is of a + * very low priority. The FreeRTOS idle routine can not be any priority except zero. + * + * A loop() function must be available for FreeRTOS to call. But the main Marlin loop + * logic needs to be at a very high priority. That is the reason for the name shifts. + */ + +void loop() { + #if ENABLED(MAX7219_DEBUG) + max7219.led_toggle(7, 0); // max7219.do_command(LED_TOGGLE, 7, 0, 0); // can't be used because loop() is not allowed to block! + #endif +} diff --git a/Marlin/src/Marlin.h b/Marlin/src/Marlin.h new file mode 100644 index 0000000000..792bee8a4e --- /dev/null +++ b/Marlin/src/Marlin.h @@ -0,0 +1,230 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifndef __MARLIN_H__ +#define __MARLIN_H__ + +#include "inc/MarlinConfig.h" + +#ifdef DEBUG_GCODE_PARSER + #include "gcode/parser.h" +#endif + +#include +#include +#include + +void stop(); + +void idle( + #if ENABLED(ADVANCED_PAUSE_FEATURE) + bool no_stepper_sleep = false // pass true to keep steppers from disabling on timeout + #endif +); + +void manage_inactivity(const bool ignore_stepper_queue=false); + +#if HAS_X2_ENABLE + #define enable_X() do{ X_ENABLE_WRITE( X_ENABLE_ON); X2_ENABLE_WRITE( X_ENABLE_ON); }while(0) + #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); X2_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0) +#elif HAS_X_ENABLE + #define enable_X() X_ENABLE_WRITE( X_ENABLE_ON) + #define disable_X() do{ X_ENABLE_WRITE(!X_ENABLE_ON); CBI(axis_known_position, X_AXIS); }while(0) +#else + #define enable_X() NOOP + #define disable_X() NOOP +#endif + +#if HAS_Y2_ENABLE + #define enable_Y() do{ Y_ENABLE_WRITE( Y_ENABLE_ON); Y2_ENABLE_WRITE(Y_ENABLE_ON); }while(0) + #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); Y2_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0) +#elif HAS_Y_ENABLE + #define enable_Y() Y_ENABLE_WRITE( Y_ENABLE_ON) + #define disable_Y() do{ Y_ENABLE_WRITE(!Y_ENABLE_ON); CBI(axis_known_position, Y_AXIS); }while(0) +#else + #define enable_Y() NOOP + #define disable_Y() NOOP +#endif + +#if HAS_Z2_ENABLE + #define enable_Z() do{ Z_ENABLE_WRITE( Z_ENABLE_ON); Z2_ENABLE_WRITE(Z_ENABLE_ON); }while(0) + #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); Z2_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0) +#elif HAS_Z_ENABLE + #define enable_Z() Z_ENABLE_WRITE( Z_ENABLE_ON) + #define disable_Z() do{ Z_ENABLE_WRITE(!Z_ENABLE_ON); CBI(axis_known_position, Z_AXIS); }while(0) +#else + #define enable_Z() NOOP + #define disable_Z() NOOP +#endif + +#if ENABLED(MIXING_EXTRUDER) + + /** + * Mixing steppers synchronize their enable (and direction) together + */ + #if MIXING_STEPPERS > 4 + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); } + #elif MIXING_STEPPERS > 3 + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); } + #elif MIXING_STEPPERS > 2 + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); } + #else + #define enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); } + #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); } + #endif + #define enable_E1() NOOP + #define disable_E1() NOOP + #define enable_E2() NOOP + #define disable_E2() NOOP + #define enable_E3() NOOP + #define disable_E3() NOOP + #define enable_E4() NOOP + #define disable_E4() NOOP + +#else // !MIXING_EXTRUDER + + #if HAS_E0_ENABLE + #define enable_E0() E0_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E0() E0_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E0() NOOP + #define disable_E0() NOOP + #endif + + #if E_STEPPERS > 1 && HAS_E1_ENABLE + #define enable_E1() E1_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E1() E1_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E1() NOOP + #define disable_E1() NOOP + #endif + + #if E_STEPPERS > 2 && HAS_E2_ENABLE + #define enable_E2() E2_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E2() E2_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E2() NOOP + #define disable_E2() NOOP + #endif + + #if E_STEPPERS > 3 && HAS_E3_ENABLE + #define enable_E3() E3_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E3() E3_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E3() NOOP + #define disable_E3() NOOP + #endif + + #if E_STEPPERS > 4 && HAS_E4_ENABLE + #define enable_E4() E4_ENABLE_WRITE( E_ENABLE_ON) + #define disable_E4() E4_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define enable_E4() NOOP + #define disable_E4() NOOP + #endif + +#endif // !MIXING_EXTRUDER + +#if ENABLED(EXPERIMENTAL_I2CBUS) + #include "feature/twibus.h" + extern TWIBus i2c; +#endif + +#if ENABLED(G38_PROBE_TARGET) + extern bool G38_move, // flag to tell the interrupt handler that a G38 command is being run + G38_endstop_hit; // flag from the interrupt handler to indicate if the endstop went active +#endif + +/** + * The axis order in all axis related arrays is X, Y, Z, E + */ +void enable_all_steppers(); +void disable_e_stepper(const uint8_t e); +void disable_e_steppers(); +void disable_all_steppers(); + +void kill(const char*); + +void quickstop_stepper(); + +extern bool Running; +inline bool IsRunning() { return Running; } +inline bool IsStopped() { return !Running; } + +extern uint8_t axis_homed, axis_known_position; + +constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); +FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; } +FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; } + +extern volatile bool wait_for_heatup; + +#if HAS_RESUME_CONTINUE + extern volatile bool wait_for_user; +#endif + +#if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) + extern bool suspend_auto_report; +#endif + +// Inactivity shutdown timer +extern millis_t max_inactive_time, stepper_inactive_time; + +#if FAN_COUNT > 0 + extern int16_t fanSpeeds[FAN_COUNT]; + #if ENABLED(EXTRA_FAN_SPEED) + extern int16_t old_fanSpeeds[FAN_COUNT], + new_fanSpeeds[FAN_COUNT]; + #endif + #if ENABLED(PROBING_FANS_OFF) + extern bool fans_paused; + extern int16_t paused_fanSpeeds[FAN_COUNT]; + #endif +#endif + +#if ENABLED(USE_CONTROLLER_FAN) + extern uint8_t controllerFanSpeed; +#endif + +#if HAS_POWER_SWITCH + extern bool powersupply_on; + #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PS_ON_AWAKE); powersupply_on = true; }while(0) + #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, PS_ON_ASLEEP); powersupply_on = false; }while(0) + #if ENABLED(AUTO_POWER_CONTROL) + #define PSU_ON() powerManager.power_on() + #define PSU_OFF() powerManager.power_off() + #else + #define PSU_ON() PSU_PIN_ON() + #define PSU_OFF() PSU_PIN_OFF() + #endif +#endif + +bool pin_is_protected(const pin_t pin); +void protected_pin_err(); + +#if HAS_SUICIDE + inline void suicide() { OUT_WRITE(SUICIDE_PIN, LOW); } +#endif + +#endif // __MARLIN_H__ diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp deleted file mode 100644 index 3a20cf3ee3..0000000000 --- a/Marlin/src/MarlinCore.cpp +++ /dev/null @@ -1,1326 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * About Marlin - * - * This firmware is a mashup between Sprinter and grbl. - * - https://github.com/kliment/Sprinter - * - https://github.com/grbl/grbl - */ - -#include "MarlinCore.h" - -#if ENABLED(MARLIN_DEV_MODE) - #warning "WARNING! Disable MARLIN_DEV_MODE for the final build!" -#endif - -#include "HAL/shared/Delay.h" -#include "HAL/shared/esp_wifi.h" - -#ifdef ARDUINO - #include -#endif -#include - -#include "core/utility.h" -#include "module/motion.h" -#include "module/planner.h" -#include "module/endstops.h" -#include "module/temperature.h" -#include "module/settings.h" -#include "module/printcounter.h" // PrintCounter or Stopwatch - -#include "module/stepper.h" -#include "module/stepper/indirection.h" - -#include "gcode/gcode.h" -#include "gcode/parser.h" -#include "gcode/queue.h" - -#include "sd/cardreader.h" - -#include "lcd/ultralcd.h" -#if HAS_TOUCH_XPT2046 - #include "lcd/touch/touch_buttons.h" -#endif - -#if HAS_TFT_LVGL_UI - #include "lcd/extui/lib/mks_ui/tft_lvgl_configuration.h" - #include "lcd/extui/lib/mks_ui/draw_ui.h" - #include "lcd/extui/lib/mks_ui/mks_hardware_test.h" - #include -#endif - -#if ENABLED(DWIN_CREALITY_LCD) - #include "lcd/dwin/e3v2/dwin.h" - #include "lcd/dwin/dwin_lcd.h" - #include "lcd/dwin/e3v2/rotary_encoder.h" -#endif - -#if ENABLED(IIC_BL24CXX_EEPROM) - #include "libs/BL24CXX.h" -#endif - -#if ENABLED(DIRECT_STEPPING) - #include "feature/direct_stepping.h" -#endif - -#if ENABLED(HOST_ACTION_COMMANDS) - #include "feature/host_actions.h" -#endif - -#if USE_BEEPER - #include "libs/buzzer.h" -#endif - -#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) - #include "feature/closedloop.h" -#endif - -#if HAS_MOTOR_CURRENT_I2C - #include "feature/digipot/digipot.h" -#endif - -#if ENABLED(MIXING_EXTRUDER) - #include "feature/mixing.h" -#endif - -#if ENABLED(MAX7219_DEBUG) - #include "feature/max7219.h" -#endif - -#if HAS_COLOR_LEDS - #include "feature/leds/leds.h" -#endif - -#if ENABLED(BLTOUCH) - #include "feature/bltouch.h" -#endif - -#if ENABLED(POLL_JOG) - #include "feature/joystick.h" -#endif - -#if HAS_SERVOS - #include "module/servo.h" -#endif - -#if ENABLED(HAS_MOTOR_CURRENT_DAC) - #include "feature/dac/stepper_dac.h" -#endif - -#if ENABLED(EXPERIMENTAL_I2CBUS) - #include "feature/twibus.h" - TWIBus i2c; -#endif - -#if ENABLED(I2C_POSITION_ENCODERS) - #include "feature/encoder_i2c.h" -#endif - -#if HAS_TRINAMIC_CONFIG && DISABLED(PSU_DEFAULT_OFF) - #include "feature/tmc_util.h" -#endif - -#if HAS_CUTTER - #include "feature/spindle_laser.h" -#endif - -#if ENABLED(SDSUPPORT) - CardReader card; -#endif - -#if ENABLED(G38_PROBE_TARGET) - uint8_t G38_move; // = 0 - bool G38_did_trigger; // = false -#endif - -#if ENABLED(DELTA) - #include "module/delta.h" -#elif IS_SCARA - #include "module/scara.h" -#endif - -#if HAS_LEVELING - #include "feature/bedlevel/bedlevel.h" -#endif - -#if BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) - #include "feature/pause.h" -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "feature/powerloss.h" -#endif - -#if ENABLED(CANCEL_OBJECTS) - #include "feature/cancel_object.h" -#endif - -#if HAS_FILAMENT_SENSOR - #include "feature/runout.h" -#endif - -#if HAS_Z_SERVO_PROBE - #include "module/probe.h" -#endif - -#if ENABLED(HOTEND_IDLE_TIMEOUT) - #include "feature/hotend_idle.h" -#endif - -#if ENABLED(TEMP_STAT_LEDS) - #include "feature/leds/tempstat.h" -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) - #include "feature/caselight.h" -#endif - -#if HAS_FANMUX - #include "feature/fanmux.h" -#endif - -#if DO_SWITCH_EXTRUDER || ANY(SWITCHING_NOZZLE, PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER, ELECTROMAGNETIC_SWITCHING_TOOLHEAD, SWITCHING_TOOLHEAD) - #include "module/tool_change.h" -#endif - -#if ENABLED(USE_CONTROLLER_FAN) - #include "feature/controllerfan.h" -#endif - -#if ENABLED(PRUSA_MMU2) - #include "feature/mmu2/mmu2.h" -#endif - -#if HAS_L64XX - #include "libs/L64XX/L64XX_Marlin.h" -#endif - -#if ENABLED(PASSWORD_FEATURE) - #include "feature/password/password.h" -#endif - -PGMSTR(NUL_STR, ""); -PGMSTR(M112_KILL_STR, "M112 Shutdown"); -PGMSTR(G28_STR, "G28"); -PGMSTR(M21_STR, "M21"); -PGMSTR(M23_STR, "M23 %s"); -PGMSTR(M24_STR, "M24"); -PGMSTR(SP_P_STR, " P"); PGMSTR(SP_T_STR, " T"); -PGMSTR(X_STR, "X"); PGMSTR(Y_STR, "Y"); PGMSTR(Z_STR, "Z"); PGMSTR(E_STR, "E"); -PGMSTR(X_LBL, "X:"); PGMSTR(Y_LBL, "Y:"); PGMSTR(Z_LBL, "Z:"); PGMSTR(E_LBL, "E:"); -PGMSTR(SP_A_STR, " A"); PGMSTR(SP_B_STR, " B"); PGMSTR(SP_C_STR, " C"); -PGMSTR(SP_X_STR, " X"); PGMSTR(SP_Y_STR, " Y"); PGMSTR(SP_Z_STR, " Z"); PGMSTR(SP_E_STR, " E"); -PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMSTR(SP_E_LBL, " E:"); - -MarlinState marlin_state = MF_INITIALIZING; - -// For M109 and M190, this flag may be cleared (by M108) to exit the wait loop -bool wait_for_heatup = true; - -// For M0/M1, this flag may be cleared (by M108) to exit the wait-for-user loop -#if HAS_RESUME_CONTINUE - bool wait_for_user; // = false; - - void wait_for_user_response(millis_t ms/*=0*/, const bool no_sleep/*=false*/) { - TERN(ADVANCED_PAUSE_FEATURE,,UNUSED(no_sleep)); - KEEPALIVE_STATE(PAUSED_FOR_USER); - wait_for_user = true; - if (ms) ms += millis(); // expire time - while (wait_for_user && !(ms && ELAPSED(millis(), ms))) - idle(TERN_(ADVANCED_PAUSE_FEATURE, no_sleep)); - wait_for_user = false; - } - -#endif - -#if PIN_EXISTS(CHDK) - extern millis_t chdk_timeout; -#endif - -#if ENABLED(I2C_POSITION_ENCODERS) - I2CPositionEncodersMgr I2CPEM; -#endif - -/** - * *************************************************************************** - * ******************************** FUNCTIONS ******************************** - * *************************************************************************** - */ - -void setup_killpin() { - #if HAS_KILL - #if KILL_PIN_STATE - SET_INPUT_PULLDOWN(KILL_PIN); - #else - SET_INPUT_PULLUP(KILL_PIN); - #endif - #endif -} - -void setup_powerhold() { - #if HAS_SUICIDE - OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); - #endif - #if ENABLED(PSU_CONTROL) - powersupply_on = ENABLED(PSU_DEFAULT_OFF); - if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); - #endif -} - -/** - * Stepper Reset (RigidBoard, et.al.) - */ -#if HAS_STEPPER_RESET - void disableStepperDrivers() { OUT_WRITE(STEPPER_RESET_PIN, LOW); } // Drive down to keep motor driver chips in reset - void enableStepperDrivers() { SET_INPUT(STEPPER_RESET_PIN); } // Set to input, allowing pullups to pull the pin high -#endif - -#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 - - void i2c_on_receive(int bytes) { // just echo all bytes received to serial - i2c.receive(bytes); - } - - void i2c_on_request() { // just send dummy data for now - i2c.reply("Hello World!\n"); - } - -#endif - -/** - * Sensitive pin test for M42, M226 - */ - -#include "pins/sensitive_pins.h" - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wnarrowing" - -bool pin_is_protected(const pin_t pin) { - static const pin_t sensitive_pins[] PROGMEM = SENSITIVE_PINS; - LOOP_L_N(i, COUNT(sensitive_pins)) { - pin_t sensitive_pin; - memcpy_P(&sensitive_pin, &sensitive_pins[i], sizeof(pin_t)); - if (pin == sensitive_pin) return true; - } - return false; -} - -#pragma GCC diagnostic pop - -void protected_pin_err() { - SERIAL_ERROR_MSG(STR_ERR_PROTECTED_PIN); -} - -void quickstop_stepper() { - planner.quick_stop(); - planner.synchronize(); - set_current_from_steppers_for_axis(ALL_AXES); - sync_plan_position(); -} - -void enable_e_steppers() { - #define _ENA_E(N) ENABLE_AXIS_E##N(); - REPEAT(E_STEPPERS, _ENA_E) -} - -void enable_all_steppers() { - TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); - ENABLE_AXIS_X(); - ENABLE_AXIS_Y(); - ENABLE_AXIS_Z(); - enable_e_steppers(); -} - -void disable_e_steppers() { - #define _DIS_E(N) DISABLE_AXIS_E##N(); - REPEAT(E_STEPPERS, _DIS_E) -} - -void disable_e_stepper(const uint8_t e) { - #define _CASE_DIS_E(N) case N: DISABLE_AXIS_E##N(); break; - switch (e) { - REPEAT(EXTRUDERS, _CASE_DIS_E) - } -} - -void disable_all_steppers() { - DISABLE_AXIS_X(); - DISABLE_AXIS_Y(); - DISABLE_AXIS_Z(); - disable_e_steppers(); -} - -#if ENABLED(G29_RETRY_AND_RECOVER) - - void event_probe_failure() { - #ifdef ACTION_ON_G29_FAILURE - host_action(PSTR(ACTION_ON_G29_FAILURE)); - #endif - #ifdef G29_FAILURE_COMMANDS - gcode.process_subcommands_now_P(PSTR(G29_FAILURE_COMMANDS)); - #endif - #if ENABLED(G29_HALT_ON_FAILURE) - #ifdef ACTION_ON_CANCEL - host_action_cancel(); - #endif - kill(GET_TEXT(MSG_LCD_PROBING_FAILED)); - #endif - } - - void event_probe_recover() { - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, PSTR("G29 Retrying"), DISMISS_STR)); - #ifdef ACTION_ON_G29_RECOVER - host_action(PSTR(ACTION_ON_G29_RECOVER)); - #endif - #ifdef G29_RECOVER_COMMANDS - gcode.process_subcommands_now_P(PSTR(G29_RECOVER_COMMANDS)); - #endif - } - -#endif - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - #include "feature/pause.h" -#else - constexpr bool did_pause_print = false; -#endif - -/** - * A Print Job exists when the timer is running or SD printing - */ -bool printJobOngoing() { - return print_job_timer.isRunning() || IS_SD_PRINTING(); -} - -/** - * Printing is active when the print job timer is running - */ -bool printingIsActive() { - return !did_pause_print && (print_job_timer.isRunning() || IS_SD_PRINTING()); -} - -/** - * Printing is paused according to SD or host indicators - */ -bool printingIsPaused() { - return did_pause_print || print_job_timer.isPaused() || IS_SD_PAUSED(); -} - -void startOrResumeJob() { - if (!printingIsPaused()) { - TERN_(CANCEL_OBJECTS, cancelable.reset()); - TERN_(LCD_SHOW_E_TOTAL, e_move_accumulator = 0); - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - ui.reset_remaining_time(); - #endif - } - print_job_timer.start(); -} - -#if ENABLED(SDSUPPORT) - - inline void abortSDPrinting() { - card.endFilePrint(TERN_(SD_RESORT, true)); - queue.clear(); - quickstop_stepper(); - print_job_timer.stop(); - #if DISABLED(SD_ABORT_NO_COOLDOWN) - thermalManager.disable_all_heaters(); - #endif - #if !HAS_CUTTER - thermalManager.zero_fan_speeds(); - #else - cutter.kill(); // Full cutter shutdown including ISR control - #endif - wait_for_heatup = false; - TERN_(POWER_LOSS_RECOVERY, recovery.purge()); - #ifdef EVENT_GCODE_SD_ABORT - queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT)); - #endif - - TERN_(PASSWORD_AFTER_SD_PRINT_ABORT, password.lock_machine()); - } - - inline void finishSDPrinting() { - if (queue.enqueue_one_P(PSTR("M1001"))) { - marlin_state = MF_RUNNING; - TERN_(PASSWORD_AFTER_SD_PRINT_END, password.lock_machine()); - } - } - -#endif // SDSUPPORT - -/** - * Minimal management of Marlin's core activities: - * - Keep the command buffer full - * - Check for maximum inactive time between commands - * - Check for maximum inactive time between stepper commands - * - Check if CHDK_PIN needs to go LOW - * - Check for KILL button held down - * - Check for HOME button held down - * - Check if cooling fan needs to be switched on - * - Check if an idle but hot extruder needs filament extruded (EXTRUDER_RUNOUT_PREVENT) - * - Pulse FET_SAFETY_PIN if it exists - */ -inline void manage_inactivity(const bool ignore_stepper_queue=false) { - - if (queue.length < BUFSIZE) queue.get_available_commands(); - - const millis_t ms = millis(); - - // Prevent steppers timing-out in the middle of M600 - // unless PAUSE_PARK_NO_STEPPER_TIMEOUT is disabled - const bool parked_or_ignoring = ignore_stepper_queue || - (BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) && did_pause_print); - - // Reset both the M18/M84 activity timeout and the M85 max 'kill' timeout - if (parked_or_ignoring) gcode.reset_stepper_timeout(ms); - - if (gcode.stepper_max_timed_out(ms)) { - SERIAL_ERROR_START(); - SERIAL_ECHOLNPAIR(STR_KILL_INACTIVE_TIME, parser.command_ptr); - kill(); - } - - // M18 / M94 : Handle steppers inactive time timeout - if (gcode.stepper_inactive_time) { - - static bool already_shutdown_steppers; // = false - - // Any moves in the planner? Resets both the M18/M84 - // activity timeout and the M85 max 'kill' timeout - if (planner.has_blocks_queued()) - gcode.reset_stepper_timeout(ms); - else if (!parked_or_ignoring && gcode.stepper_inactive_timeout()) { - if (!already_shutdown_steppers) { - already_shutdown_steppers = true; // L6470 SPI will consume 99% of free time without this - - // Individual axes will be disabled if configured - if (ENABLED(DISABLE_INACTIVE_X)) DISABLE_AXIS_X(); - if (ENABLED(DISABLE_INACTIVE_Y)) DISABLE_AXIS_Y(); - if (ENABLED(DISABLE_INACTIVE_Z)) DISABLE_AXIS_Z(); - if (ENABLED(DISABLE_INACTIVE_E)) disable_e_steppers(); - - TERN_(AUTO_BED_LEVELING_UBL, ubl.steppers_were_disabled()); - } - } - else - already_shutdown_steppers = false; - } - - #if PIN_EXISTS(CHDK) // Check if pin should be set to LOW (after M240 set it HIGH) - if (chdk_timeout && ELAPSED(ms, chdk_timeout)) { - chdk_timeout = 0; - WRITE(CHDK_PIN, LOW); - } - #endif - - #if HAS_KILL - - // Check if the kill button was pressed and wait just in case it was an accidental - // key kill key press - // ------------------------------------------------------------------------------- - static int killCount = 0; // make the inactivity button a bit less responsive - const int KILL_DELAY = 750; - if (kill_state()) - killCount++; - else if (killCount > 0) - killCount--; - - // Exceeded threshold and we can confirm that it was not accidental - // KILL the machine - // ---------------------------------------------------------------- - if (killCount >= KILL_DELAY) { - SERIAL_ERROR_MSG(STR_KILL_BUTTON); - kill(); - } - #endif - - #if HAS_HOME - // Handle a standalone HOME button - constexpr millis_t HOME_DEBOUNCE_DELAY = 1000UL; - static millis_t next_home_key_ms; // = 0 - if (!IS_SD_PRINTING() && !READ(HOME_PIN)) { // HOME_PIN goes LOW when pressed - const millis_t ms = millis(); - if (ELAPSED(ms, next_home_key_ms)) { - next_home_key_ms = ms + HOME_DEBOUNCE_DELAY; - LCD_MESSAGEPGM(MSG_AUTO_HOME); - queue.enqueue_now_P(G28_STR); - } - } - #endif - - TERN_(USE_CONTROLLER_FAN, controllerFan.update()); // Check if fan should be turned on to cool stepper drivers down - - TERN_(AUTO_POWER_CONTROL, powerManager.check()); - - TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check()); - - #if ENABLED(EXTRUDER_RUNOUT_PREVENT) - if (thermalManager.degHotend(active_extruder) > EXTRUDER_RUNOUT_MINTEMP - && ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) - && !planner.has_blocks_queued() - ) { - #if ENABLED(SWITCHING_EXTRUDER) - bool oldstatus; - switch (active_extruder) { - default: oldstatus = E0_ENABLE_READ(); ENABLE_AXIS_E0(); break; - #if E_STEPPERS > 1 - case 2: case 3: oldstatus = E1_ENABLE_READ(); ENABLE_AXIS_E1(); break; - #if E_STEPPERS > 2 - case 4: case 5: oldstatus = E2_ENABLE_READ(); ENABLE_AXIS_E2(); break; - #if E_STEPPERS > 3 - case 6: case 7: oldstatus = E3_ENABLE_READ(); ENABLE_AXIS_E3(); break; - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - } - #else // !SWITCHING_EXTRUDER - bool oldstatus; - switch (active_extruder) { - default: - #define _CASE_EN(N) case N: oldstatus = E##N##_ENABLE_READ(); ENABLE_AXIS_E##N(); break; - REPEAT(E_STEPPERS, _CASE_EN); - } - #endif - - const float olde = current_position.e; - current_position.e += EXTRUDER_RUNOUT_EXTRUDE; - line_to_current_position(MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED)); - current_position.e = olde; - planner.set_e_position_mm(olde); - planner.synchronize(); - - #if ENABLED(SWITCHING_EXTRUDER) - switch (active_extruder) { - default: oldstatus = E0_ENABLE_WRITE(oldstatus); break; - #if E_STEPPERS > 1 - case 2: case 3: oldstatus = E1_ENABLE_WRITE(oldstatus); break; - #if E_STEPPERS > 2 - case 4: case 5: oldstatus = E2_ENABLE_WRITE(oldstatus); break; - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - } - #else // !SWITCHING_EXTRUDER - switch (active_extruder) { - #define _CASE_RESTORE(N) case N: E##N##_ENABLE_WRITE(oldstatus); break; - REPEAT(E_STEPPERS, _CASE_RESTORE); - } - #endif // !SWITCHING_EXTRUDER - - gcode.reset_stepper_timeout(ms); - } - #endif // EXTRUDER_RUNOUT_PREVENT - - #if ENABLED(DUAL_X_CARRIAGE) - // handle delayed move timeout - if (delayed_move_time && ELAPSED(ms, delayed_move_time + 1000UL) && IsRunning()) { - // travel moves have been received so enact them - delayed_move_time = 0xFFFFFFFFUL; // force moves to be done - destination = current_position; - prepare_line_to_destination(); - } - #endif - - TERN_(TEMP_STAT_LEDS, handle_status_leds()); - - TERN_(MONITOR_DRIVER_STATUS, monitor_tmc_drivers()); - - TERN_(MONITOR_L6470_DRIVER_STATUS, L64xxManager.monitor_driver()); - - // Limit check_axes_activity frequency to 10Hz - static millis_t next_check_axes_ms = 0; - if (ELAPSED(ms, next_check_axes_ms)) { - planner.check_axes_activity(); - next_check_axes_ms = ms + 100UL; - } - - #if PIN_EXISTS(FET_SAFETY) - static millis_t FET_next; - if (ELAPSED(ms, FET_next)) { - FET_next = ms + FET_SAFETY_DELAY; // 2µs pulse every FET_SAFETY_DELAY mS - OUT_WRITE(FET_SAFETY_PIN, !FET_SAFETY_INVERTED); - DELAY_US(2); - WRITE(FET_SAFETY_PIN, FET_SAFETY_INVERTED); - } - #endif -} - -/** - * Standard idle routine keeps the machine alive: - * - Core Marlin activities - * - Manage heaters (and Watchdog) - * - Max7219 heartbeat, animation, etc. - * - * Only after setup() is complete: - * - Handle filament runout sensors - * - Run HAL idle tasks - * - Handle Power-Loss Recovery - * - Run StallGuard endstop checks - * - Handle SD Card insert / remove - * - Handle USB Flash Drive insert / remove - * - Announce Host Keepalive state (if any) - * - Update the Print Job Timer state - * - Update the Beeper queue - * - Read Buttons and Update the LCD - * - Run i2c Position Encoders - * - Auto-report Temperatures / SD Status - * - Update the Průša MMU2 - * - Handle Joystick jogging - */ -void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { - - // Core Marlin activities - manage_inactivity(TERN_(ADVANCED_PAUSE_FEATURE, no_stepper_sleep)); - - // Manage Heaters (and Watchdog) - thermalManager.manage_heater(); - - // Max7219 heartbeat, animation, etc - TERN_(MAX7219_DEBUG, max7219.idle_tasks()); - - // Return if setup() isn't completed - if (marlin_state == MF_INITIALIZING) return; - - // Handle filament runout sensors - TERN_(HAS_FILAMENT_SENSOR, runout.run()); - - // Run HAL idle tasks - #ifdef HAL_IDLETASK - HAL_idletask(); - #endif - - // Handle Power-Loss Recovery - #if ENABLED(POWER_LOSS_RECOVERY) && PIN_EXISTS(POWER_LOSS) - if (printJobOngoing()) recovery.outage(); - #endif - - // Run StallGuard endstop checks - #if ENABLED(SPI_ENDSTOPS) - if (endstops.tmc_spi_homing.any - && TERN1(IMPROVE_HOMING_RELIABILITY, ELAPSED(millis(), sg_guard_period)) - ) LOOP_L_N(i, 4) // Read SGT 4 times per idle loop - if (endstops.tmc_spi_homing_check()) break; - #endif - - // Handle SD Card insert / remove - TERN_(SDSUPPORT, card.manage_media()); - - // Handle USB Flash Drive insert / remove - TERN_(USB_FLASH_DRIVE_SUPPORT, Sd2Card::idle()); - - // Announce Host Keepalive state (if any) - TERN_(HOST_KEEPALIVE_FEATURE, gcode.host_keepalive()); - - // Update the Print Job Timer state - TERN_(PRINTCOUNTER, print_job_timer.tick()); - - // Update the Beeper queue - TERN_(USE_BEEPER, buzzer.tick()); - - // Handle UI input / draw events - TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); - - // Run i2c Position Encoders - #if ENABLED(I2C_POSITION_ENCODERS) - static millis_t i2cpem_next_update_ms; - if (planner.has_blocks_queued()) { - const millis_t ms = millis(); - if (ELAPSED(ms, i2cpem_next_update_ms)) { - I2CPEM.update(); - i2cpem_next_update_ms = ms + I2CPE_MIN_UPD_TIME_MS; - } - } - #endif - - // Auto-report Temperatures / SD Status - #if HAS_AUTO_REPORTING - if (!gcode.autoreport_paused) { - TERN_(AUTO_REPORT_TEMPERATURES, thermalManager.auto_report_temperatures()); - TERN_(AUTO_REPORT_SD_STATUS, card.auto_report_sd_status()); - } - #endif - - // Update the Průša MMU2 - TERN_(PRUSA_MMU2, mmu2.mmu_loop()); - - // Handle Joystick jogging - TERN_(POLL_JOG, joystick.inject_jog_moves()); - - // Direct Stepping - TERN_(DIRECT_STEPPING, page_manager.write_responses()); - - #if HAS_TFT_LVGL_UI - LV_TASK_HANDLER(); - #endif -} - -/** - * Kill all activity and lock the machine. - * After this the machine will need to be reset. - */ -void kill(PGM_P const lcd_error/*=nullptr*/, PGM_P const lcd_component/*=nullptr*/, const bool steppers_off/*=false*/) { - thermalManager.disable_all_heaters(); - - TERN_(HAS_CUTTER, cutter.kill()); // Full cutter shutdown including ISR control - - SERIAL_ERROR_MSG(STR_ERR_KILLED); - - #if HAS_DISPLAY - ui.kill_screen(lcd_error ?: GET_TEXT(MSG_KILLED), lcd_component ?: NUL_STR); - #else - UNUSED(lcd_error); - UNUSED(lcd_component); - #endif - - #if HAS_TFT_LVGL_UI - lv_draw_error_message(lcd_error); - #endif - - #ifdef ACTION_ON_KILL - host_action_kill(); - #endif - - minkill(steppers_off); -} - -void minkill(const bool steppers_off/*=false*/) { - - // Wait a short time (allows messages to get out before shutting down. - for (int i = 1000; i--;) DELAY_US(600); - - cli(); // Stop interrupts - - // Wait to ensure all interrupts stopped - for (int i = 1000; i--;) DELAY_US(250); - - // Reiterate heaters off - thermalManager.disable_all_heaters(); - - TERN_(HAS_CUTTER, cutter.kill()); // Reiterate cutter shutdown - - // Power off all steppers (for M112) or just the E steppers - steppers_off ? disable_all_steppers() : disable_e_steppers(); - - TERN_(PSU_CONTROL, PSU_OFF()); - - TERN_(HAS_SUICIDE, suicide()); - - #if HAS_KILL - - // Wait for kill to be released - while (kill_state()) watchdog_refresh(); - - // Wait for kill to be pressed - while (!kill_state()) watchdog_refresh(); - - void (*resetFunc)() = 0; // Declare resetFunc() at address 0 - resetFunc(); // Jump to address 0 - - #else - - for (;;) watchdog_refresh(); // Wait for reset - - #endif -} - -/** - * Turn off heaters and stop the print in progress - * After a stop the machine may be resumed with M999 - */ -void stop() { - thermalManager.disable_all_heaters(); // 'unpause' taken care of in here - print_job_timer.stop(); - - #if ENABLED(PROBING_FANS_OFF) - if (thermalManager.fans_paused) thermalManager.set_fans_paused(false); // put things back the way they were - #endif - - if (IsRunning()) { - SERIAL_ERROR_MSG(STR_ERR_STOPPED); - LCD_MESSAGEPGM(MSG_STOPPED); - safe_delay(350); // allow enough time for messages to get out before stopping - marlin_state = MF_STOPPED; - } -} - -inline void tmc_standby_setup() { - #if PIN_EXISTS(X_STDBY) - SET_INPUT_PULLDOWN(X_STDBY_PIN); - #endif - #if PIN_EXISTS(X2_STDBY) - SET_INPUT_PULLDOWN(X2_STDBY_PIN); - #endif - #if PIN_EXISTS(Y_STDBY) - SET_INPUT_PULLDOWN(Y_STDBY_PIN); - #endif - #if PIN_EXISTS(Y2_STDBY) - SET_INPUT_PULLDOWN(Y2_STDBY_PIN); - #endif - #if PIN_EXISTS(Z_STDBY) - SET_INPUT_PULLDOWN(Z_STDBY_PIN); - #endif - #if PIN_EXISTS(Z2_STDBY) - SET_INPUT_PULLDOWN(Z2_STDBY_PIN); - #endif - #if PIN_EXISTS(Z3_STDBY) - SET_INPUT_PULLDOWN(Z3_STDBY_PIN); - #endif - #if PIN_EXISTS(Z4_STDBY) - SET_INPUT_PULLDOWN(Z4_STDBY_PIN); - #endif - #if PIN_EXISTS(E0_STDBY) - SET_INPUT_PULLDOWN(E0_STDBY_PIN); - #endif - #if PIN_EXISTS(E1_STDBY) - SET_INPUT_PULLDOWN(E1_STDBY_PIN); - #endif - #if PIN_EXISTS(E2_STDBY) - SET_INPUT_PULLDOWN(E2_STDBY_PIN); - #endif - #if PIN_EXISTS(E3_STDBY) - SET_INPUT_PULLDOWN(E3_STDBY_PIN); - #endif - #if PIN_EXISTS(E4_STDBY) - SET_INPUT_PULLDOWN(E4_STDBY_PIN); - #endif - #if PIN_EXISTS(E5_STDBY) - SET_INPUT_PULLDOWN(E5_STDBY_PIN); - #endif - #if PIN_EXISTS(E6_STDBY) - SET_INPUT_PULLDOWN(E6_STDBY_PIN); - #endif - #if PIN_EXISTS(E7_STDBY) - SET_INPUT_PULLDOWN(E7_STDBY_PIN); - #endif -} - -/** - * Marlin entry-point: Set up before the program loop - * - Set up the kill pin, filament runout, power hold - * - Start the serial port - * - Print startup messages and diagnostics - * - Get EEPROM or default settings - * - Initialize managers for: - * • temperature - * • planner - * • watchdog - * • stepper - * • photo pin - * • servos - * • LCD controller - * • Digipot I2C - * • Z probe sled - * • status LEDs - * • Max7219 - */ -void setup() { - - tmc_standby_setup(); // TMC Low Power Standby pins must be set early or they're not usable - - #if ENABLED(MARLIN_DEV_MODE) - auto log_current_ms = [&](PGM_P const msg) { - SERIAL_ECHO_START(); - SERIAL_CHAR('['); SERIAL_ECHO(millis()); SERIAL_ECHOPGM("] "); - serialprintPGM(msg); - SERIAL_EOL(); - }; - #define SETUP_LOG(M) log_current_ms(PSTR(M)) - #else - #define SETUP_LOG(...) NOOP - #endif - #define SETUP_RUN(C) do{ SETUP_LOG(STRINGIFY(C)); C; }while(0) - - #if EITHER(DISABLE_DEBUG, DISABLE_JTAG) - // Disable any hardware debug to free up pins for IO - #if ENABLED(DISABLE_DEBUG) && defined(JTAGSWD_DISABLE) - JTAGSWD_DISABLE(); - #elif defined(JTAG_DISABLE) - JTAG_DISABLE(); - #else - #error "DISABLE_(DEBUG|JTAG) is not supported for the selected MCU/Board." - #endif - #endif - - MYSERIAL0.begin(BAUDRATE); - uint32_t serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - #if HAS_MULTI_SERIAL - MYSERIAL1.begin(BAUDRATE); - serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - #endif - SERIAL_ECHO_MSG("start"); - - #if BOTH(HAS_TFT_LVGL_UI, USE_WIFI_FUNCTION) - mks_esp_wifi_init(); - WIFISERIAL.begin(WIFI_BAUDRATE); - serial_connect_timeout = millis() + 1000UL; - while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - #endif - - SETUP_RUN(HAL_init()); - - #if HAS_L64XX - SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers - #endif - - #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) - OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Put Smart Effector into NORMAL mode - #endif - - #if HAS_FILAMENT_SENSOR - SETUP_RUN(runout.setup()); - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - SETUP_RUN(recovery.setup()); - #endif - - SETUP_RUN(setup_killpin()); - - #if HAS_TMC220x - SETUP_RUN(tmc_serial_begin()); - #endif - - SETUP_RUN(setup_powerhold()); - - #if HAS_STEPPER_RESET - SETUP_RUN(disableStepperDrivers()); - #endif - - #if HAS_TMC_SPI - #if DISABLED(TMC_USE_SW_SPI) - SETUP_RUN(SPI.begin()); - #endif - SETUP_RUN(tmc_init_cs_pins()); - #endif - - #ifdef BOARD_INIT - SETUP_LOG("BOARD_INIT"); - BOARD_INIT(); - #endif - - SETUP_RUN(esp_wifi_init()); - - // Check startup - does nothing if bootloader sets MCUSR to 0 - const byte mcu = HAL_get_reset_source(); - if (mcu & RST_POWER_ON) SERIAL_ECHOLNPGM(STR_POWERUP); - if (mcu & RST_EXTERNAL) SERIAL_ECHOLNPGM(STR_EXTERNAL_RESET); - if (mcu & RST_BROWN_OUT) SERIAL_ECHOLNPGM(STR_BROWNOUT_RESET); - if (mcu & RST_WATCHDOG) SERIAL_ECHOLNPGM(STR_WATCHDOG_RESET); - if (mcu & RST_SOFTWARE) SERIAL_ECHOLNPGM(STR_SOFTWARE_RESET); - HAL_clear_reset_source(); - - serialprintPGM(GET_TEXT(MSG_MARLIN)); - SERIAL_CHAR(' '); - SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); - SERIAL_EOL(); - #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) - SERIAL_ECHO_MSG( - " Last Updated: " STRING_DISTRIBUTION_DATE - " | Author: " STRING_CONFIG_H_AUTHOR - ); - #endif - SERIAL_ECHO_MSG("Compiled: " __DATE__); - SERIAL_ECHO_MSG(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE)); - - // Init buzzer pin(s) - #if USE_BEEPER - SETUP_RUN(buzzer.init()); - #endif - - // Set up LEDs early - #if HAS_COLOR_LEDS - SETUP_RUN(leds.setup()); - #endif - - #if ENABLED(NEOPIXEL2_SEPARATE) - SETUP_RUN(leds2.setup()); - #endif - - #if ENABLED(USE_CONTROLLER_FAN) // Set up fan controller to initialize also the default configurations. - SETUP_RUN(controllerFan.setup()); - #endif - - // UI must be initialized before EEPROM - // (because EEPROM code calls the UI). - - #if ENABLED(DWIN_CREALITY_LCD) - delay(800); // Required delay (since boot?) - SERIAL_ECHOPGM("\nDWIN handshake "); - if (DWIN_Handshake()) SERIAL_ECHOLNPGM("ok."); else SERIAL_ECHOLNPGM("error."); - DWIN_Frame_SetDir(1); // Orientation 90° - DWIN_UpdateLCD(); // Show bootscreen (first image) - #else - SETUP_RUN(ui.init()); - #if HAS_WIRED_LCD && ENABLED(SHOW_BOOTSCREEN) - SETUP_RUN(ui.show_bootscreen()); - #endif - SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.) - #endif - - #if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION) - SETUP_RUN(card.mount()); // Mount media with settings before first_load - #endif - - SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults) - // This also updates variables in the planner, elsewhere - - #if HAS_TOUCH_XPT2046 - SETUP_RUN(touch.init()); - #endif - - TERN_(HAS_M206_COMMAND, current_position += home_offset); // Init current position based on home_offset - - sync_plan_position(); // Vital to init stepper/planner equivalent for current_position - - SETUP_RUN(thermalManager.init()); // Initialize temperature loop - - SETUP_RUN(print_job_timer.init()); // Initial setup of print job timer - - SETUP_RUN(endstops.init()); // Init endstops and pullups - - SETUP_RUN(stepper.init()); // Init stepper. This enables interrupts! - - #if HAS_SERVOS - SETUP_RUN(servo_init()); - #endif - - #if HAS_Z_SERVO_PROBE - SETUP_RUN(probe.servo_probe_init()); - #endif - - #if HAS_PHOTOGRAPH - OUT_WRITE(PHOTOGRAPH_PIN, LOW); - #endif - - #if HAS_CUTTER - SETUP_RUN(cutter.init()); - #endif - - #if ENABLED(COOLANT_MIST) - OUT_WRITE(COOLANT_MIST_PIN, COOLANT_MIST_INVERT); // Init Mist Coolant OFF - #endif - #if ENABLED(COOLANT_FLOOD) - OUT_WRITE(COOLANT_FLOOD_PIN, COOLANT_FLOOD_INVERT); // Init Flood Coolant OFF - #endif - - #if HAS_BED_PROBE - SETUP_RUN(endstops.enable_z_probe(false)); - #endif - - #if HAS_STEPPER_RESET - SETUP_RUN(enableStepperDrivers()); - #endif - - #if HAS_MOTOR_CURRENT_I2C - SETUP_RUN(digipot_i2c.init()); - #endif - - #if ENABLED(HAS_MOTOR_CURRENT_DAC) - SETUP_RUN(stepper_dac.init()); - #endif - - #if EITHER(Z_PROBE_SLED, SOLENOID_PROBE) && HAS_SOLENOID_1 - OUT_WRITE(SOL1_PIN, LOW); // OFF - #endif - - #if HAS_HOME - SET_INPUT_PULLUP(HOME_PIN); - #endif - - #if PIN_EXISTS(STAT_LED_RED) - OUT_WRITE(STAT_LED_RED_PIN, LOW); // OFF - #endif - - #if PIN_EXISTS(STAT_LED_BLUE) - OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // OFF - #endif - - #if ENABLED(CASE_LIGHT_ENABLE) - #if DISABLED(CASE_LIGHT_USE_NEOPIXEL) - if (PWM_PIN(CASE_LIGHT_PIN)) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN); - #endif - SETUP_RUN(caselight.update_brightness()); - #endif - - #if ENABLED(MK2_MULTIPLEXER) - SETUP_LOG("MK2_MULTIPLEXER"); - SET_OUTPUT(E_MUX0_PIN); - SET_OUTPUT(E_MUX1_PIN); - SET_OUTPUT(E_MUX2_PIN); - #endif - - #if HAS_FANMUX - SETUP_RUN(fanmux_init()); - #endif - - #if ENABLED(MIXING_EXTRUDER) - SETUP_RUN(mixer.init()); - #endif - - #if ENABLED(BLTOUCH) - SETUP_RUN(bltouch.init(/*set_voltage=*/true)); - #endif - - #if ENABLED(I2C_POSITION_ENCODERS) - SETUP_RUN(I2CPEM.init()); - #endif - - #if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 - SETUP_LOG("i2c..."); - i2c.onReceive(i2c_on_receive); - i2c.onRequest(i2c_on_request); - #endif - - #if DO_SWITCH_EXTRUDER - SETUP_RUN(move_extruder_servo(0)); // Initialize extruder servo - #endif - - #if ENABLED(SWITCHING_NOZZLE) - SETUP_LOG("SWITCHING_NOZZLE"); - // Initialize nozzle servo(s) - #if SWITCHING_NOZZLE_TWO_SERVOS - lower_nozzle(0); - raise_nozzle(1); - #else - move_nozzle_servo(0); - #endif - #endif - - #if ENABLED(MAGNETIC_PARKING_EXTRUDER) - SETUP_RUN(mpe_settings_init()); - #endif - - #if ENABLED(PARKING_EXTRUDER) - SETUP_RUN(pe_solenoid_init()); - #endif - - #if ENABLED(SWITCHING_TOOLHEAD) - SETUP_RUN(swt_init()); - #endif - - #if ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) - SETUP_RUN(est_init()); - #endif - - #if ENABLED(USE_WATCHDOG) - SETUP_RUN(watchdog_init()); // Reinit watchdog after HAL_get_reset_source call - #endif - - #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) - SETUP_RUN(closedloop.init()); - #endif - - #ifdef STARTUP_COMMANDS - SETUP_LOG("STARTUP_COMMANDS"); - queue.inject_P(PSTR(STARTUP_COMMANDS)); - #endif - - #if ENABLED(HOST_PROMPT_SUPPORT) - SETUP_RUN(host_action_prompt_end()); - #endif - - #if HAS_TRINAMIC_CONFIG && DISABLED(PSU_DEFAULT_OFF) - SETUP_RUN(test_tmc_connection(true, true, true, true)); - #endif - - #if ENABLED(PRUSA_MMU2) - SETUP_RUN(mmu2.init()); - #endif - - #if ENABLED(IIC_BL24CXX_EEPROM) - BL24CXX::init(); - const uint8_t err = BL24CXX::check(); - SERIAL_ECHO_TERNARY(err, "BL24CXX Check ", "failed", "succeeded", "!\n"); - #endif - - #if ENABLED(DWIN_CREALITY_LCD) - Encoder_Configuration(); - HMI_Init(); - HMI_StartFrame(true); - #endif - - #if HAS_SERVICE_INTERVALS && DISABLED(DWIN_CREALITY_LCD) - ui.reset_status(true); // Show service messages or keep current status - #endif - - #if ENABLED(MAX7219_DEBUG) - SETUP_RUN(max7219.init()); - #endif - - #if ENABLED(DIRECT_STEPPING) - SETUP_RUN(page_manager.init()); - #endif - - #if HAS_TFT_LVGL_UI - #if ENABLED(SDSUPPORT) - if (!card.isMounted()) SETUP_RUN(card.mount()); // Mount SD to load graphics and fonts - #endif - SETUP_RUN(tft_lvgl_init()); - #endif - - #if ENABLED(PASSWORD_ON_STARTUP) - SETUP_RUN(password.lock_machine()); // Will not proceed until correct password provided - #endif - - marlin_state = MF_RUNNING; - - SETUP_LOG("setup() completed."); -} - -/** - * The main Marlin program loop - * - * - Call idle() to handle all tasks between G-code commands - * Note that no G-codes from the queue can be executed during idle() - * but many G-codes can be called directly anytime like macros. - * - Check whether SD card auto-start is needed now. - * - Check whether SD print finishing is needed now. - * - Run one G-code command from the immediate or main command queue - * and open up one space. Commands in the main queue may come from sd - * card, host, or by direct injection. The queue will continue to fill - * as long as idle() or manage_inactivity() are being called. - */ -void loop() { - do { - idle(); - - #if ENABLED(SDSUPPORT) - card.checkautostart(); - if (card.flag.abort_sd_printing) abortSDPrinting(); - if (marlin_state == MF_SD_COMPLETE) finishSDPrinting(); - #endif - - queue.advance(); - - endstops.event_handler(); - - TERN_(HAS_TFT_LVGL_UI, printer_state_polling()); - - } while (ENABLED(__AVR__)); // Loop forever on slower (AVR) boards -} diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h deleted file mode 100644 index 69afc7f30e..0000000000 --- a/Marlin/src/MarlinCore.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "inc/MarlinConfig.h" - -#ifdef DEBUG_GCODE_PARSER - #include "gcode/parser.h" -#endif - -#include -#include -#include - -void stop(); - -// Pass true to keep steppers from timing out -void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep=false)); -inline void idle_no_sleep() { idle(TERN_(ADVANCED_PAUSE_FEATURE, true)); } - -#if ENABLED(EXPERIMENTAL_I2CBUS) - #include "feature/twibus.h" - extern TWIBus i2c; -#endif - -#if ENABLED(G38_PROBE_TARGET) - extern uint8_t G38_move; // Flag to tell the ISR that G38 is in progress, and the type - extern bool G38_did_trigger; // Flag from the ISR to indicate the endstop changed -#endif - -/** - * The axis order in all axis related arrays is X, Y, Z, E - */ -void enable_e_steppers(); -void enable_all_steppers(); -void disable_e_stepper(const uint8_t e); -void disable_e_steppers(); -void disable_all_steppers(); - -void kill(PGM_P const lcd_error=nullptr, PGM_P const lcd_component=nullptr, const bool steppers_off=false); -void minkill(const bool steppers_off=false); - -void quickstop_stepper(); - -// Global State of the firmware -enum MarlinState : uint8_t { - MF_INITIALIZING = 0, - MF_RUNNING = _BV(0), - MF_PAUSED = _BV(1), - MF_WAITING = _BV(2), - MF_STOPPED = _BV(3), - MF_SD_COMPLETE = _BV(4), - MF_KILLED = _BV(7) -}; - -extern MarlinState marlin_state; -inline bool IsRunning() { return marlin_state == MF_RUNNING; } -inline bool IsStopped() { return marlin_state != MF_RUNNING; } - -bool printingIsActive(); -bool printingIsPaused(); -void startOrResumeJob(); - -extern bool wait_for_heatup; - -#if HAS_RESUME_CONTINUE - extern bool wait_for_user; - void wait_for_user_response(millis_t ms=0, const bool no_sleep=false); -#endif - -#if ENABLED(PSU_CONTROL) - extern bool powersupply_on; - #define PSU_PIN_ON() do{ OUT_WRITE(PS_ON_PIN, PSU_ACTIVE_STATE); powersupply_on = true; }while(0) - #define PSU_PIN_OFF() do{ OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_STATE); powersupply_on = false; }while(0) - #if ENABLED(AUTO_POWER_CONTROL) - #define PSU_ON() powerManager.power_on() - #define PSU_OFF() powerManager.power_off() - #else - #define PSU_ON() PSU_PIN_ON() - #define PSU_OFF() PSU_PIN_OFF() - #endif -#endif - -bool pin_is_protected(const pin_t pin); -void protected_pin_err(); - -#if HAS_SUICIDE - inline void suicide() { OUT_WRITE(SUICIDE_PIN, SUICIDE_PIN_INVERTING); } -#endif - -#if HAS_KILL - #ifndef KILL_PIN_STATE - #define KILL_PIN_STATE LOW - #endif - inline bool kill_state() { return READ(KILL_PIN) == KILL_PIN_STATE; } -#endif - -#if ENABLED(G29_RETRY_AND_RECOVER) - void event_probe_recover(); - void event_probe_failure(); -#endif - -extern const char NUL_STR[], M112_KILL_STR[], G28_STR[], M21_STR[], M23_STR[], M24_STR[], - SP_A_STR[], SP_B_STR[], SP_C_STR[], - SP_P_STR[], SP_T_STR[], SP_X_STR[], SP_Y_STR[], SP_Z_STR[], SP_E_STR[], - X_LBL[], Y_LBL[], Z_LBL[], E_LBL[], SP_X_LBL[], SP_Y_LBL[], SP_Z_LBL[], SP_E_LBL[]; diff --git a/Marlin/src/config/default/Configuration.h b/Marlin/src/config/default/Configuration.h new file mode 100644 index 0000000000..bd63e6362b --- /dev/null +++ b/Marlin/src/config/default/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/default/Configuration_adv.h b/Marlin/src/config/default/Configuration_adv.h new file mode 100755 index 0000000000..f5e753882a --- /dev/null +++ b/Marlin/src/config/default/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h new file mode 100644 index 0000000000..2c0ca75c34 --- /dev/null +++ b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h @@ -0,0 +1,1992 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Aleph Objects Inc, TAZ)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMBO +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "TAZ" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 7 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 7 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 250 +#define HEATER_1_MAXTEMP 250 +#define HEATER_2_MAXTEMP 250 +#define HEATER_3_MAXTEMP 250 +#define HEATER_4_MAXTEMP 250 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 70 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX 74 // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 16 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + // Buda 2.0 on 24V + #define DEFAULT_Kp 6 + #define DEFAULT_Ki .3 + #define DEFAULT_Kd 125 + + // Buda 2.0 on 12V + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.01 + //#define DEFAULT_Kd 114 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 206 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //24V 360W silicone heater from NPH on 3mm borosilicate (TAZ 2.2+) + #define DEFAULT_bedKp 20 + #define DEFAULT_bedKi 5 + #define DEFAULT_bedKd 275 + + //12v 400W silicone heater from QUDB into 3mm borosilicate (TAZ 1.0+) + //from pidautotune + //#define DEFAULT_bedKp 650 + //#define DEFAULT_bedKi 60 + //#define DEFAULT_bedKd 1800 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100.5, 100.5, 400, 850 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 800, 800, 8, 50 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 8.0 +#define DEFAULT_YJERK 8.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 10.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR true +#define INVERT_E2_DIR true +#define INVERT_E3_DIR true +#define INVERT_E4_DIR true + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 298 +#define Y_BED_SIZE 275 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 250 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (8*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 230 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 2 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h new file mode 100644 index 0000000000..d1a3b68d5d --- /dev/null +++ b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + #define CONTROLLER_FAN_PIN 2 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 130 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 4 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 4, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h new file mode 100644 index 0000000000..00994d3aaa --- /dev/null +++ b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, CL-260)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CL-260" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 800 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 160.6 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR 1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 260 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/AliExpress/CL-260/README.txt b/Marlin/src/config/examples/AliExpress/CL-260/README.txt new file mode 100644 index 0000000000..b8d6856a65 --- /dev/null +++ b/Marlin/src/config/examples/AliExpress/CL-260/README.txt @@ -0,0 +1,15 @@ +This is an example configuration for the CL-260 Ultimaker 2 clone. +Change Z_MAX_POS to 300 for the CL-260MAX. + +(The printer is available on AliExpress; be aware that this is not a beginner's +printer -- it needs tweaking and some parts replaced before being decent.) + +The printer comes with a quite old Marlin, the sources are available here: +http://www.thingiverse.com/thing:1635830/ and I recommend replacing them. + +The setting "works" for my printer and the extruder using my calibration value. +You might want to tweak some settings, e.g enable EEPROM, increase default Z speed, adjust homing speeds,... + +Have fun! +-- +tobi diff --git a/Marlin/src/config/examples/Anet/A2/Configuration.h b/Marlin/src/config/examples/Anet/A2/Configuration.h new file mode 100644 index 0000000000..84b25c19a4 --- /dev/null +++ b/Marlin/src/config/examples/Anet/A2/Configuration.h @@ -0,0 +1,1957 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Modmike, Anet A2)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_ANET_10 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT {100, 100, 400, 95 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +//#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +//#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +//#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +//#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +//#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +//#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +//#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 230 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +// Note: Details on connecting to the Anet V1.0 controller are in the file pins_ANET_10.h +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Anet/A2/Configuration_adv.h b/Marlin/src/config/examples/Anet/A2/Configuration_adv.h new file mode 100644 index 0000000000..9f03da8335 --- /dev/null +++ b/Marlin/src/config/examples/Anet/A2/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Anet/A2plus/Configuration.h b/Marlin/src/config/examples/Anet/A2plus/Configuration.h new file mode 100644 index 0000000000..4a64fb7338 --- /dev/null +++ b/Marlin/src/config/examples/Anet/A2plus/Configuration.h @@ -0,0 +1,1957 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Modmike, Anet A2 Plus)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_ANET_10 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT {100, 100, 400, 95 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +//#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +//#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +//#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +//#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +//#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +//#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +//#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 270 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 230 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +// Note: Details on connecting to the Anet V1.0 controller are in the file pins_ANET_10.h +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h b/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h new file mode 100644 index 0000000000..9f03da8335 --- /dev/null +++ b/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Anet/A6/Configuration.h b/Marlin/src/config/examples/Anet/A6/Configuration.h new file mode 100644 index 0000000000..2486ab5025 --- /dev/null +++ b/Marlin/src/config/examples/Anet/A6/Configuration.h @@ -0,0 +1,2127 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Ralf_E, ANET A6 config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_ANET_10 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 11 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 11 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 130 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + // ANET A6 Firmware V2.0 Standard Extruder defaults: + // PID-P: +022.20, PID-I: +001.08, PID-D: +114.00, PID-C: 1 + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114.0 + + // Tuned by ralf-e. Always re-tune for your machine! + #define DEFAULT_Kp 16.83 + #define DEFAULT_Ki 1.02 + #define DEFAULT_Kd 69.29 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // ANET A6 + // original Bed + 0.3mm Heat conducting into 4mm borosilicate (PID-Autotune: M303 E-1 S60 C5): + //#define DEFAULT_bedKp 295.00 + //#define DEFAULT_bedKi 35.65 + //#define DEFAULT_bedKd 610.21 + #define DEFAULT_bedKp 295.00 + #define DEFAULT_bedKi 35.65 + #define DEFAULT_bedKd 610.21 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +// ANET A6 Firmwae V2.0 defaults: (steps/mm) +// Xsteps/mm: +100.0, Ysteps/mm: +100.0, Zsteps/mm: +0400.0, eSteps/mm: +0095.0 +#define DEFAULT_AXIS_STEPS_PER_UNIT {100, 100, 400, 95} +//#define DEFAULT_AXIS_STEPS_PER_UNIT {80, 80, 400, 95} + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +//#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +// ANET A6 Firmware V2.0 defaults (Vmax): +// Vmax x: 400, Vmax y: 400, Vmax z: 4, Vmax e: 25 +#define DEFAULT_MAX_FEEDRATE {400, 400, 4, 25} +//#define DEFAULT_MAX_FEEDRATE {400, 400, 20, 50} + + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +//#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +// ANET A6 Firmware V2.0 defaults (Amax): +// Amx x: 9000, Amax Y: 5000, Amax z: 50, Amax e: 10000 +#define DEFAULT_MAX_ACCELERATION { 9000, 5000, 50, 10000 } +//#define DEFAULT_MAX_ACCELERATION { 10000, 10000, 200, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +//#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +//#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +//#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +// ANET A6 Firmware V2.0 defaults: +// Accel: 1000 A-retract: 1000 +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves +//#define DEFAULT_ACCELERATION 2000 // X, Y, Z and E acceleration for printing moves +//#define DEFAULT_RETRACT_ACCELERATION 2000 // E acceleration for retracts +//#define DEFAULT_TRAVEL_ACCELERATION 4000 // X, Y, Z acceleration for travel (non printing) moves + + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +// ANET A6 Firmware V2.0 defaults (jerk): +// Vxy-jerk: 10, Vz-jerk: +000.30, Ve-jerk: 5 +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +//#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +//#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +//#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// ANET A8: FRONT-MOUNTED SENSOR WITH 3D PRINTED MOUNT +//#define X_PROBE_OFFSET_FROM_EXTRUDER -28 // X offset: -left +right [of the nozzle] +//#define Y_PROBE_OFFSET_FROM_EXTRUDER -45 // Y offset: -front +behind [the nozzle] +//#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// THESE ARE FOR THE OFFICIAL ANET REAR-MOUNTED SENSOR +//#define X_PROBE_OFFSET_FROM_EXTRUDER -1 // X offset: -left +right [of the nozzle] +//#define Y_PROBE_OFFSET_FROM_EXTRUDER 3 // Y offset: -front +behind [the nozzle] +//#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// ANET A6 with BLTouch/3D-Touch mounted right to the nozzle +#define X_PROBE_OFFSET_FROM_EXTRUDER 39 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +//ANET A6 with BLTouch/3D-Touch betwen Fan and Belt +// (mount: https://github.com/ralf-e/ANET_A6_modifications/tree/master/A6_X-Axis) +//#define X_PROBE_OFFSET_FROM_EXTRUDER -30 // X offset: -left +right [of the nozzle] +//#define Y_PROBE_OFFSET_FROM_EXTRUDER 15 // Y offset: -front +behind [the nozzle] +//#define Z_PROBE_OFFSET_FROM_EXTRUDER 0.75 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 +//#define XY_PROBE_SPEED 6000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 3) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#if 1 // 0 for less clearance + #define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow + #define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes + //#define Z_AFTER_PROBING 5 // Z position after probing is done +#else + #define Z_CLEARANCE_DEPLOY_PROBE 5 // Z Clearance for Deploy/Stow + #define Z_CLEARANCE_BETWEEN_PROBES 3 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes + //#define Z_AFTER_PROBING 3 // Z position after probing is done +#endif + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +//#define INVERT_Y_DIR true +//#define INVERT_Z_DIR false +//ANET A6: +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +//#define X_BED_SIZE 200 +//#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +//#define X_MIN_POS 0 +//#define Y_MIN_POS 0 +//#define X_MAX_POS X_BED_SIZE +//#define Y_MAX_POS Y_BED_SIZE +//#define Z_MIN_POS 0 +//#define Z_MAX_POS 200 + +// ANET A6 Firmware V2.0 defaults: +//#define X_BED_SIZE 220 +//#define Y_BED_SIZE 220 +//#define X_MIN_POS 0 +//#define Y_MIN_POS 0 +//#define Z_MIN_POS 0 +//#define Z_MAX_POS 250 + +// ANET A6, X0/Y0 0 front left bed edge : +#define X_BED_SIZE 222 +#define Y_BED_SIZE 222 +#define X_MIN_POS -3 +#define Y_MIN_POS -5 +#define Z_MIN_POS 0 +#define Z_MAX_POS 230 + +// ANET A6 with new X-Axis / modded Y-Axis: +//#define X_BED_SIZE 235 +//#define Y_BED_SIZE 230 +//#define X_MIN_POS 0 +//#define Y_MIN_POS 0 +//#define Z_MIN_POS 0 +//#define Z_MAX_POS 230 + +// ANET A6 with new X-Axis / modded Y-Axis, X0/Y0 0 front left bed edge : +//#define X_BED_SIZE 227 +//#define Y_BED_SIZE 224 +//#define X_MIN_POS -8 +//#define Y_MIN_POS -6 +//#define Z_MIN_POS 0 +//#define Z_MAX_POS 230 + +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 4 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION 15 + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - 15) + //#define FRONT_PROBE_BED_POSITION 15 + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - 15) + + // ANET A6 + //#define LEFT_PROBE_BED_POSITION 20 + //#define RIGHT_PROBE_BED_POSITION 190 + //#define FRONT_PROBE_BED_POSITION 20 + //#define BACK_PROBE_BED_POSITION 190 + + // ANET A6 BLTOUCH right (39mm) to the nozzle + //#define LEFT_PROBE_BED_POSITION 36 + //#define RIGHT_PROBE_BED_POSITION 190 + //#define FRONT_PROBE_BED_POSITION 20 + //#define BACK_PROBE_BED_POSITION 190 + + // ANET A6 with new X-Axis and modded Y-Axis + //#define LEFT_PROBE_BED_POSITION 20 + //#define RIGHT_PROBE_BED_POSITION 205 + //#define FRONT_PROBE_BED_POSITION 20 + //#define BACK_PROBE_BED_POSITION 205 + + // ANET A6 with new X-Axis and modded Y-Axis, X0/Y0 front left bed edge + //#define LEFT_PROBE_BED_POSITION 20 + //#define RIGHT_PROBE_BED_POSITION 194 + //#define FRONT_PROBE_BED_POSITION 20 + //#define BACK_PROBE_BED_POSITION 194 + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 5 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// ANET A6 with new X-Axis / modded Y-Axis: +//#define MANUAL_X_HOME_POS X_MIN_POS - 8 +//#define MANUAL_Y_HOME_POS Y_MIN_POS - 6 +//#define MANUAL_Z_HOME_POS Z_MIN_POS + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). + + //Anet A6 with new X-Axis + //#define Z_SAFE_HOMING_X_POINT 113 // X point for Z homing when homing all axes (G28). + //#define Z_SAFE_HOMING_Y_POINT 112 // Y point for Z homing when homing all axes (G28). + + //Anet A6 with new X-Axis and defined X_HOME_POS -7, Y_HOME_POS -6 + //#define Z_SAFE_HOMING_X_POINT 107 // X point for Z homing when homing all axes (G28). + //#define Z_SAFE_HOMING_Y_POINT 107 // Y point for Z homing when homing all axes (G28). + +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 50 +#define PREHEAT_1_FAN_SPEED 0 // ANET A6 Default is 255 + +#define PREHEAT_2_TEMP_HOTEND 230 +#define PREHEAT_2_TEMP_BED 70 +#define PREHEAT_2_FAN_SPEED 0 // ANET A6 Default is 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +// Note: Details on connecting to the Anet V1.0 controller are in the file pins_ANET_10.h +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Anet/A6/Configuration_adv.h b/Marlin/src/config/examples/Anet/A6/Configuration_adv.h new file mode 100644 index 0000000000..0aae0b459f --- /dev/null +++ b/Marlin/src/config/examples/Anet/A6/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 10 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 60 // Seconds + #define WATCH_TEMP_INCREASE 5 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 5 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 180 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +//#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + //#define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Anet/A8/Configuration.h b/Marlin/src/config/examples/Anet/A8/Configuration.h new file mode 100644 index 0000000000..ee85a150dd --- /dev/null +++ b/Marlin/src/config/examples/Anet/A8/Configuration.h @@ -0,0 +1,1981 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Bob Kuhn, Anet config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_ANET_10 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +// The Anet A8 original extruder is designed for 1.75mm +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 6 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 6 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 130 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 15 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 21.0 + //#define DEFAULT_Ki 1.25 + //#define DEFAULT_Kd 86.0 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + // ANET A8 Standard Extruder at 210 Degree Celsius and 100% Fan + //(measured after M106 S255 with M303 E0 S210 C8) + #define DEFAULT_Kp 21.0 + #define DEFAULT_Ki 1.25 + #define DEFAULT_Kd 86.0 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 160 // 160 guards against false tripping when the extruder fan kicks on. + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 100 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 8, 50 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 400 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 6000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -33 +#define Y_MIN_POS -10 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 240 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + #define PROBE_PT_1_X 20 + #define PROBE_PT_1_Y 160 + #define PROBE_PT_2_X 20 + #define PROBE_PT_2_Y 10 + #define PROBE_PT_3_X 180 + #define PROBE_PT_3_Y 10 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (100*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +//#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +//#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 190 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 90 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +// Note: Details on connecting to the Anet V1.0 controller are in the file pins_ANET_10.h +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Anet/A8/Configuration_adv.h b/Marlin/src/config/examples/Anet/A8/Configuration_adv.h new file mode 100644 index 0000000000..ae78b09d93 --- /dev/null +++ b/Marlin/src/config/examples/Anet/A8/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 10 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 5 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 180 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +//#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + //#define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h b/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h new file mode 100644 index 0000000000..5f06a780dd --- /dev/null +++ b/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_AZTEEG_X5_GT +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 2 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 1 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axis (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axis (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 CYRILLIC + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h b/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h new file mode 100644 index 0000000000..f5e753882a --- /dev/null +++ b/Marlin/src/config/examples/Azteeg/X5GT/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h new file mode 100644 index 0000000000..1bdcc04528 --- /dev/null +++ b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h @@ -0,0 +1,1946 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MKS_GEN_L +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "BIBO2 Touch X" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 2 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +#define HOTEND_OFFSET_X {0.0, -33.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 285 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 115 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 23.89 + #define DEFAULT_Ki 1.37 + #define DEFAULT_Kd 104.5 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 23.89 + #define DEFAULT_bedKi 1.37 + #define DEFAULT_bedKd 104.5 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +//#define PREVENT_COLD_EXTRUSION +//#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 400} + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 350, 350, 10, 50 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1100, 1100, 300, 2500 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1100 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1100 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1100 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 7.0 +#define DEFAULT_YJERK 7.0 +#define DEFAULT_ZJERK 0.65 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 9000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 10 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER false // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR true +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 8 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 186 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -13 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS 250 +#define Y_MAX_POS 186 +#define Z_MAX_POS 186 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION 15 + //#define RIGHT_PROBE_BED_POSITION 170 + //#define FRONT_PROBE_BED_POSITION 20 + //#define BACK_PROBE_BED_POSITION 170 + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (25*60) +#define HOMING_FEEDRATE_Z (6*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 190 +#define PREHEAT_1_TEMP_BED 65 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h new file mode 100644 index 0000000000..569de9106f --- /dev/null +++ b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 45 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 2 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 60 // Seconds + #define WATCH_TEMP_INCREASE 1 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 3 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 1 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h new file mode 100644 index 0000000000..9ac054cb15 --- /dev/null +++ b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h @@ -0,0 +1,1946 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MKS_GEN_L +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "BIBO2 Touch X" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 2 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +#define HOTEND_OFFSET_X {0.0, -33.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 5 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 60 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 115 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 23.89 + #define DEFAULT_Ki 1.37 + #define DEFAULT_Kd 104.5 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 23.89 + #define DEFAULT_bedKi 1.37 + #define DEFAULT_bedKd 104.5 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 93.6 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 350, 350, 10, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1100, 1100, 300, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1100 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1100 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1100 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 7.0 +#define DEFAULT_YJERK 7.0 +#define DEFAULT_ZJERK 0.65 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 10 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 10 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER false // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR true +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 10 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 +#define Y_HOME_DIR 1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 214 +#define Y_BED_SIZE 186 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -107 +#define Y_MIN_POS -93 +#define Z_MIN_POS 0 +#define X_MAX_POS 141 +#define Y_MAX_POS 93 +#define Z_MAX_POS 186 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION 15 + //#define RIGHT_PROBE_BED_POSITION 170 + //#define FRONT_PROBE_BED_POSITION 20 + //#define BACK_PROBE_BED_POSITION 170 + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (15*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 80 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h new file mode 100644 index 0000000000..55b288c6d8 --- /dev/null +++ b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 2 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 45 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/BQ/Hephestos/Configuration.h b/Marlin/src/config/examples/BQ/Hephestos/Configuration.h new file mode 100644 index 0000000000..979b8d375b --- /dev/null +++ b/Marlin/src/config/examples/BQ/Hephestos/Configuration.h @@ -0,0 +1,1960 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "HEPHESTOS" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 260 +#define HEATER_1_MAXTEMP 260 +#define HEATER_2_MAXTEMP 260 +#define HEATER_3_MAXTEMP 260 +#define HEATER_4_MAXTEMP 260 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Hephestos i3 + #define DEFAULT_Kp 23.05 + #define DEFAULT_Ki 2.00 + #define DEFAULT_Kd 66.47 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 100.47095761381482 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 200, 200, 3.3, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1100, 1100, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 650 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 215 +#define Y_BED_SIZE 210 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 180 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY 2000 +#define HOMING_FEEDRATE_Z 150 + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 0 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 220 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h b/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h new file mode 100644 index 0000000000..5d31d53404 --- /dev/null +++ b/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {120*60, 120*60, 18*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h new file mode 100644 index 0000000000..203fec7bcf --- /dev/null +++ b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * BQ Hephestos 2 Configuration + * + * This configuration supports the standard Hephestos 2 with or without the + * heated bed kit featured at https://store.bq.com/en/heated-bed-kit-hephestos2 + * + * Enable HEPHESTOS2_HEATED_BED_KIT in Configuration_adv.h for all functionality + * related to the heated bed. + * + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "@jbrazio" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "BQ Hephestos 2" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +#define MACHINE_UUID "8d083632-40c5-4649-85b8-43d9ae6c5d55" // BQ Hephestos 2 standard config + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 70 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 230 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 100 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Tuned PID values using M303 + #define DEFAULT_Kp 23.75 + #define DEFAULT_Ki 2.12 + #define DEFAULT_Kd 66.63 + + // BQ firmware stock PID values + //#define DEFAULT_Kp 10.7 + //#define DEFAULT_Ki 0.45 + //#define DEFAULT_Kd 3 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 160, 160, 8000, 218.77 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 3, 120 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 3000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 900 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1300 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 5.0 +#define DEFAULT_YJERK 5.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 10.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 34 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 15 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 0 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 2 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 3 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 210 +#define Y_BED_SIZE 297 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 210 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 185.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 50.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 5 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION X_MIN_POS + (X_PROBE_OFFSET_FROM_EXTRUDER) + //#define RIGHT_PROBE_BED_POSITION X_MAX_POS - (X_PROBE_OFFSET_FROM_EXTRUDER) + //#define FRONT_PROBE_BED_POSITION Y_MIN_POS + (Y_PROBE_OFFSET_FROM_EXTRUDER) + //#define BACK_PROBE_BED_POSITION Y_MAX_POS - (Y_PROBE_OFFSET_FROM_EXTRUDER) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + #define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +#define Z_PROBE_END_SCRIPT "G27 P0" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z ( 4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 5 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 50 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 210 +#define PREHEAT_2_TEMP_BED 60 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 10 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 1 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 5 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h new file mode 100644 index 0000000000..6d99f4eccf --- /dev/null +++ b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h @@ -0,0 +1,1705 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +#define FAN_KICKSTART_TIME 800 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +//#define E0_AUTO_FAN_PIN -1 +//#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 1 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 300 +#define DISABLE_INACTIVE_X false +#define DISABLE_INACTIVE_Y false +#define DISABLE_INACTIVE_Z false // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + //#define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps + +#define DIGIPOT_MOTOR_CURRENT { 170, 170, 180, 190, 180 } // Values 0-255 + // + // bq ZUM Mega 3D defaults: + // X = 150 [~1.17A] + // Y = 170 [~1.33A] + // Z = 180 [~1.41A] + // E0 = 190 [~1.49A] + +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 30 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 50 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +#define LCD_TIMEOUT_TO_STATUS 60000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE false // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "G27 P0" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + //#define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 2 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1500 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 64 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 32 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 0.25 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/BQ/Hephestos_2/README.md b/Marlin/src/config/examples/BQ/Hephestos_2/README.md new file mode 100644 index 0000000000..ab28487e2d --- /dev/null +++ b/Marlin/src/config/examples/BQ/Hephestos_2/README.md @@ -0,0 +1,29 @@ +# Example Configuration for BQ [Hephestos 2](http://www.bq.com/uk/hephestos-2) +Based on the original configuration file shipped with the heavily modified Marlin fork by BQ. +The forked firmware and configuration files can be found at the [BQ Github repository](https://github.com/bq/Marlin). + +NOTE: The look and feel of the LCD menu will change dramatically when using the original Marlin firmware. + +## Changelog + * 2018/05/30 - Configuration updated to the latest Marlin version (43a55a9af). + ABL Bilinear 5x5 is active by default. + + * 2017/07/06 - Configuration updated to the latest Marlin version and added support for the + official BQ heated bed upgrade kit. + + * 2016/12/13 - Configuration updated to the latest Marlin version. + + * 2016/07/13 - Configuration updated to the latest Marlin version. + + * 2016/06/21 - Disabled heated bed related options, activated software endstops and SD printing now + disables the heater when finishes printing. + + * 2016/03/21 - Activated 4-point auto leveling by default and updated miscellaneous z-probe values. + + * 2016/03/01 - The first release of Marlin's configuration file for the + BQ Hephestos 2 3D printer. + + +## Support +This configuration should work easily with the stock Hephestos 2, nevertheless if you encounter any +issues you may contact me on [Github](https://github.com/jbrazio), [Twitter](https://twitter.com/jbrazio) or by mail. diff --git a/Marlin/src/config/examples/BQ/Hephestos_2/_Bootscreen.h b/Marlin/src/config/examples/BQ/Hephestos_2/_Bootscreen.h new file mode 100644 index 0000000000..0e771c0c7f --- /dev/null +++ b/Marlin/src/config/examples/BQ/Hephestos_2/_Bootscreen.h @@ -0,0 +1,100 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_BMPWIDTH 64 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000011,B11110000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00001111,B11111100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00001111,B11111100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B11111000,B00000111,B11111000,B00000111,B11000000,B00000000, + B00000000,B00000001,B11111100,B00000011,B11110000,B00001111,B11100000,B00000000, + B00000000,B00000011,B11111110,B00000000,B11000000,B00011111,B11110000,B00000000, + B00000000,B00000011,B11111110,B00000000,B00000000,B00011111,B11110000,B00000000, + B00000000,B00000011,B11111110,B00000000,B00000000,B00011111,B11110000,B00000000, + B00000000,B00000011,B11111110,B00000000,B00000000,B00011111,B11110000,B00000000, + B00000000,B00000011,B11111100,B00000000,B00000000,B00001111,B11100000,B00000000, + B00000000,B00000001,B11111000,B00000000,B00000000,B00001111,B11100000,B00000000, + B00000000,B00000000,B01110000,B00000000,B00000000,B00000011,B10000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111100, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111100, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111100, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111100, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111100, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111100, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00001111,B10000000,B00000000,B00000000,B01110000,B00000000,B00000000,B00000000, + B00011111,B11000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000, + B00111111,B11000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000, + B00111111,B11100000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000, + B00111111,B11100000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000, + B00111111,B11100000,B00000000,B00000000,B01111011,B11000000,B00001111,B00000000, + B00111111,B11000000,B00000000,B00000000,B01111111,B11110000,B00111111,B11000000, + B00011111,B10000000,B00000000,B00000000,B01111111,B11111000,B01111111,B11100000, + B00001111,B00000000,B00000000,B00000000,B01111110,B11111100,B11111001,B11110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B11100000,B11110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00011101,B11100000,B01110000, + B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B11100000,B11110000, + B00000000,B00000000,B00000000,B00000000,B01111100,B01111100,B11111001,B11110000, + B00000000,B00000000,B00000000,B00000000,B00011111,B11111000,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00001111,B11110000,B01111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00011111,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 +}; diff --git a/Marlin/src/config/examples/BQ/WITBOX/Configuration.h b/Marlin/src/config/examples/BQ/WITBOX/Configuration.h new file mode 100644 index 0000000000..7a9702e7d7 --- /dev/null +++ b/Marlin/src/config/examples/BQ/WITBOX/Configuration.h @@ -0,0 +1,1960 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(bq Witbox)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "WITBOX" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 260 +#define HEATER_1_MAXTEMP 260 +#define HEATER_2_MAXTEMP 260 +#define HEATER_3_MAXTEMP 260 +#define HEATER_4_MAXTEMP 260 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Witbox + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 600.0*8/3, 102.073 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 350, 350, 7.2, 80 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1000, 1000, 10, 1000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z true +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 +#define Y_HOME_DIR 1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 297 +#define Y_BED_SIZE 210 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (120*60) +#define HOMING_FEEDRATE_Z 432 + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 0 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 220 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h b/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h new file mode 100644 index 0000000000..5d31d53404 --- /dev/null +++ b/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {120*60, 120*60, 18*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Cartesio/Configuration.h b/Marlin/src/config/examples/Cartesio/Configuration.h new file mode 100644 index 0000000000..21fc8377cc --- /dev/null +++ b/Marlin/src/config/examples/Cartesio/Configuration.h @@ -0,0 +1,1971 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(MaukCC, CartesioE)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + //#define MOTHERBOARD BOARD_CNCONTROLS_11 + #define MOTHERBOARD BOARD_CNCONTROLS_12 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CartesioE" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 3 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 -1 +#define TEMP_SENSOR_1 -1 +#define TEMP_SENSOR_2 1 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 4 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 1 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 415 +#define HEATER_1_MAXTEMP 415 +#define HEATER_2_MAXTEMP 415 +#define HEATER_3_MAXTEMP 415 +#define HEATER_4_MAXTEMP 415 +#define BED_MAXTEMP 165 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Cartesio extruderV6 40W Normal + #define DEFAULT_Kp 18 + #define DEFAULT_Ki 1 + #define DEFAULT_Kd 100 + + // Cartesio extruderV6 40W Volcano + //#define DEFAULT_Kp 50 + //#define DEFAULT_Ki 9 + //#define DEFAULT_Kd 70 + + // Cartesio extruderV6 40W Cyclops + //#define DEFAULT_Kp 18 + //#define DEFAULT_Ki 1 + //#define DEFAULT_Kd 100 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //24V 500W silicone heater on to 4mm glass CartesioW + #define DEFAULT_bedKp 390 + #define DEFAULT_bedKi 70 + #define DEFAULT_bedKd 546 + + //24V 250W silicone heater on to 4mm glass CartesioM + //#define DEFAULT_bedKp 303 + //#define DEFAULT_bedKi 42 + //#define DEFAULT_bedKd 539 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 71.128, 71.128, 640, 152 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 200, 200, 20, 20 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1000, 1000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 10000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 1 +#define Y_ENABLE_ON 1 +#define Z_ENABLE_ON 1 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 435 +#define Y_BED_SIZE 270 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 400 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (10*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 190 +#define PREHEAT_1_TEMP_BED 50 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 2 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 +#define LCD_FEEDBACK_FREQUENCY_HZ 1000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +#define REPRAPWORLD_KEYPAD +#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Cartesio/Configuration_adv.h b/Marlin/src/config/examples/Cartesio/Configuration_adv.h new file mode 100644 index 0000000000..b8b5283a93 --- /dev/null +++ b/Marlin/src/config/examples/Cartesio/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +//#define E0_AUTO_FAN_PIN -1 +//#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 35 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 1 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + //#define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Cartesio/_Bootscreen.h b/Marlin/src/config/examples/Cartesio/_Bootscreen.h new file mode 100644 index 0000000000..e0efd83767 --- /dev/null +++ b/Marlin/src/config/examples/Cartesio/_Bootscreen.h @@ -0,0 +1,100 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_BMPWIDTH 64 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00111111,B11111100,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000011,B11111111,B11111111,B11000000,B00000000,B00000000, + B00000000,B00000000,B00011111,B11111111,B11111111,B11110000,B00000000,B00000000, + B00000000,B00000000,B01111111,B11111111,B11111111,B11111100,B00000000,B00000000, + B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B00000000,B00000000, + B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B10000000,B00000000, + B00000000,B00000111,B11111111,B11111111,B11111111,B11111111,B11000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000, + B00000000,B00001111,B00000111,B10000111,B11111111,B11111111,B11100000,B00000000, + B00000000,B00011111,B10001111,B11000111,B11111111,B11111111,B11110001,B00000000, + B00000001,B00011111,B10001111,B11000111,B11111111,B11111111,B11110001,B10000000, + B00000011,B00011111,B10001111,B11000111,B11111111,B11111111,B11110001,B10000000, + B00000111,B00011111,B10001111,B11000111,B11111111,B11111111,B11100001,B11000000, + B00000111,B00011111,B10001111,B11000111,B11000000,B00000000,B00000001,B11100000, + B00001111,B00011111,B10001111,B11000111,B11000000,B00000000,B00000001,B11100000, + B00001111,B00011111,B10001111,B11000111,B11000000,B00000000,B00000001,B11110000, + B00011111,B00011111,B10001111,B11000111,B11000000,B00000000,B00000001,B11110000, + B00011111,B00011111,B10001111,B11000111,B11111111,B11111111,B11100001,B11110000, + B00111111,B00011111,B10001111,B11000111,B11111111,B11111111,B11110001,B11111000, + B00111111,B00011111,B10001111,B11000111,B11111111,B11111111,B11110001,B11111000, + B00111111,B00011111,B10001111,B11000111,B11111111,B11111111,B11110001,B11111000, + B00111111,B00011111,B10001111,B11000111,B11111111,B11111111,B11100001,B11111000, + B01111111,B00011111,B10001111,B11000111,B11000000,B00000000,B00000001,B11111100, + B01111111,B00011111,B10001111,B11000111,B11000000,B00000000,B00000001,B11111100, + B01111111,B00011111,B10001111,B11000111,B11000000,B00000000,B00000001,B11111100, + B01111111,B00011111,B10001111,B11000111,B11000000,B00000000,B00000001,B11111100, + B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100, + B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100, + B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100, + B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100, + B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100, + B01111111,B00000000,B00000000,B00000111,B11000111,B11100011,B11110001,B11111100, + B01111111,B00000000,B00000000,B00000111,B11000111,B11100011,B11110001,B11111100, + B01111111,B00000000,B00000000,B00000111,B11000111,B11100011,B11110001,B11111100, + B00111111,B00001111,B11111111,B11111111,B11000111,B11100011,B11110001,B11111000, + B00111111,B00011111,B11111111,B11111111,B11000111,B11100011,B11110001,B11111000, + B00111111,B00011111,B11111111,B11111111,B11000111,B11100011,B11110001,B11111000, + B00111111,B00011111,B11111111,B11111111,B11000111,B11100011,B11110001,B11111000, + B00011111,B00011111,B11111111,B11111111,B11000111,B11100011,B11110001,B11110000, + B00011111,B00001111,B11111111,B11111111,B11000111,B11100011,B11110001,B11110000, + B00011111,B00000000,B00000000,B00000111,B11000111,B11100011,B11110001,B11100000, + B00001111,B00000000,B00000000,B00000111,B11000111,B11100011,B11110001,B11100000, + B00001111,B00000000,B00000000,B00000111,B11000111,B11100011,B11110001,B11000000, + B00000111,B00001111,B11111111,B11111111,B11000111,B11100011,B11110001,B11000000, + B00000011,B00011111,B11111111,B11111111,B11000111,B11100011,B11110001,B10000000, + B00000011,B00011111,B11111111,B11111111,B11000111,B11100011,B11110001,B00000000, + B00000001,B00011111,B11111111,B11111111,B11000111,B11100011,B11110000,B00000000, + B00000000,B00011111,B11111111,B11111111,B11000111,B11100011,B11110000,B00000000, + B00000000,B00001111,B11111111,B11111111,B11000011,B11000001,B11100000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000, + B00000000,B00000111,B11111111,B11111111,B11111111,B11111111,B11000000,B00000000, + B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B10000000,B00000000, + B00000000,B00000001,B11111111,B11111111,B11111111,B11111110,B00000000,B00000000, + B00000000,B00000000,B01111111,B11111111,B11111111,B11111100,B00000000,B00000000, + B00000000,B00000000,B00011111,B11111111,B11111111,B11110000,B00000000,B00000000, + B00000000,B00000000,B00000111,B11111111,B11111111,B10000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B01111111,B11111000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 +}; diff --git a/Marlin/src/config/examples/Creality/CR-10/Configuration.h b/Marlin/src/config/examples/Creality/CR-10/Configuration.h new file mode 100755 index 0000000000..0425b9bcf9 --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10/Configuration.h @@ -0,0 +1,1982 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Creality CR-10)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI_CREALITY +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CR-10" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 120 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Stock CR-10 tuned for 70C + #define DEFAULT_Kp 22.57 + #define DEFAULT_Ki 1.72 + #define DEFAULT_Kd 73.96 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //Stock CR-10 Bed Tuned for 70C + #define DEFAULT_bedKp 426.68 + #define DEFAULT_bedKi 78.92 + #define DEFAULT_bedKd 576.71 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 1000 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +//#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 95 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 500 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 2.7 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 10 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 10 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 5 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 300 +#define Y_BED_SIZE 300 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE + 20 +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 400 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 190 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h new file mode 100755 index 0000000000..658c892c78 --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h @@ -0,0 +1,1700 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + #define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 256 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM true // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES true // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 10 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 4 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 420 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 8 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 120 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 6 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + #define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#define DEFAULT_STDDEV_FILAMENT_DIA 0.05 // Typical estimate for cheap filament +//#define DEFAULT_STDDEV_FILAMENT_DIA 0.02 // Typical advertised for higher quality filament + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN (DEFAULT_STDDEV_FILAMENT_DIA*4) // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Creality/CR-10/_Bootscreen.h b/Marlin/src/config/examples/Creality/CR-10/_Bootscreen.h new file mode 100644 index 0000000000..d74e7ae9f9 --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10/_Bootscreen.h @@ -0,0 +1,55 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_TIMEOUT 1000 +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111100,B00000000,B00000000, + B00001111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000001,B10000110,B00011111,B11000000, + B00011000,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00111100,B00001100,B00000000,B00000000,B00000001,B10000011,B00001100,B01100000, + B00010000,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00111100,B00001100,B00000000,B00000000,B00000001,B10000011,B00001100,B00110000, + B00110000,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00001100,B00000000,B00000000,B00000000,B00000011,B00001100,B00011000, + B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00111111,B00001111,B00111100,B00000000,B00000011,B00001100,B00001100, + B01100000,B00000001,B11011111,B00001111,B11100000,B11111110,B00000000,B01100000,B00011100,B00011100,B00000110,B00011000,B00000000,B00000110,B00001100,B00001100, + B01100000,B00000000,B11110011,B00011000,B00110001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000011,B00011000,B00000000,B00011110,B00001100,B00001100, + B01100000,B00000000,B11100000,B00110000,B00111001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000011,B00110000,B00000000,B00000011,B00001100,B00001100, + B01100000,B00000000,B11000000,B00110000,B00111000,B00001111,B00000000,B01100000,B00001100,B00001100,B00000011,B00110000,B00000000,B00000001,B10001100,B00001100, + B01100000,B00000000,B11000000,B00111111,B11111000,B11111011,B00000000,B01100000,B00001100,B00001100,B00000011,B00110000,B00000000,B00000001,B10001100,B00001100, + B01100000,B00110000,B11000000,B00110000,B00000001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000001,B11110000,B00000001,B10000001,B10001100,B00001100, + B01100000,B00110000,B11000000,B00110000,B00000001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000000,B11100000,B00000001,B10000001,B10001100,B00011000, + B00110000,B00110000,B11000000,B00011000,B00110001,B10000011,B00000000,B01100000,B00001100,B00001100,B01000000,B11100000,B00000001,B10000011,B10001100,B00110000, + B00011000,B01100000,B11000000,B00001100,B01100001,B10000111,B11000000,B11100000,B00011100,B00001100,B11000000,B01100000,B00000000,B11000011,B00001100,B01100000, + B00001111,B11000011,B11110000,B00000111,B11000000,B11111111,B11000111,B11111100,B01111111,B00000111,B10000001,B11000000,B00000000,B01111110,B00011111,B11000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000000,B00000000,B00000000,B00000000,B00000000 +}; \ No newline at end of file diff --git a/Marlin/src/config/examples/Creality/CR-10/_Statusscreen.h b/Marlin/src/config/examples/Creality/CR-10/_Statusscreen.h new file mode 100644 index 0000000000..a03bc992fa --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10/_Statusscreen.h @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define STATUS_SCREENWIDTH 128 +#define STATUS_SCREEN_HOTEND_TEXT_X(E) 38 +#define STATUS_SCREEN_BED_TEXT_X 73 + +//============================================ + +const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00111110,B00001111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B11000001,B10000110,B00011000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B11000001,B10000110,B00001100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00000000,B00000001,B10000110,B00000100,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B00000000,B00000011,B00000110,B00000100,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B00000000,B00011111,B00000110,B00000100,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B00000000,B00000011,B00000110,B00000100,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B00000000,B00000001,B10000110,B00000100,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101100,B00000000,B11010000, + B00000000,B11000001,B10000110,B00001100,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B11000001,B10000110,B00011000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00111110,B00001111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 +}; +const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B10000111,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00111110,B00001111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B11000001,B10000110,B00011000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B11000001,B10000110,B00001100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00000000,B00000001,B10000110,B00000100,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000011,B00000110,B00000100,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00011111,B00000110,B00000100,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000011,B00000110,B00000100,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000001,B10000110,B00000100,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101111,B00000011,B11010000, + B00000000,B11000001,B10000110,B00001100,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B11000001,B10000110,B00011000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00111110,B00001111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110011,B10000111,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 +}; diff --git a/Marlin/src/config/examples/Creality/CR-10S/Configuration.h b/Marlin/src/config/examples/Creality/CR-10S/Configuration.h new file mode 100644 index 0000000000..3fb5021657 --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10S/Configuration.h @@ -0,0 +1,1977 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(printedsolid.com, CR-10S)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB + #define PIN_EXP1 65 // A11 + #define PIN_EXP2 66 // A12 + #define PIN_EXP3 11 // SERVO0_PIN + #define PIN_EXP4 12 // PS_ON_PIN +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CR-10S" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 250 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 120 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 435 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 95 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 2500, 2500, 100, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 575 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 20.0 +#define DEFAULT_YJERK 20.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 300 +#define Y_BED_SIZE 300 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 400 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING true // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" + #define FIL_RUNOUT_PIN 2 // Creality CR10-S stock sensor +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION // Enable G26 mesh validation + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 205 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 250 +#define PREHEAT_2_TEMP_BED 80 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 3), (Y_MAX_POS - 3), 10 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h new file mode 100644 index 0000000000..3d9d5fe7f9 --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + #define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM true // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK true // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + #define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 5 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 4 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 41 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 430 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 41 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 430 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 20 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 4 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 0 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 6 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + #define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Creality/CR-10S/_Bootscreen.h b/Marlin/src/config/examples/Creality/CR-10S/_Bootscreen.h new file mode 100644 index 0000000000..38fb68f7da --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10S/_Bootscreen.h @@ -0,0 +1,55 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_TIMEOUT 1000 +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111100,B00000000,B00000000, + B00001111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000001,B10000110,B00011111,B11000000, + B00011000,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00111100,B00001100,B00000000,B00000000,B00000001,B10000011,B00001100,B01100000, + B00010000,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00111100,B00001100,B00000000,B00000000,B00000001,B10000011,B00001100,B00110000, + B00110000,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00001100,B00000000,B00000000,B00000000,B00000011,B00001100,B00011000, + B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00111111,B00001111,B00111100,B00000000,B00000011,B00001100,B00001100, + B01100000,B00000001,B11011111,B00001111,B11100000,B11111110,B00000000,B01100000,B00011100,B00011100,B00000110,B00011000,B00000000,B00000110,B00001100,B00001100, + B01100000,B00000000,B11110011,B00011000,B00110001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000011,B00011000,B00000000,B00011110,B00001100,B00001100, + B01100000,B00000000,B11100000,B00110000,B00111001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000011,B00110000,B00000000,B00000011,B00001100,B00001100, + B01100000,B00000000,B11000000,B00110000,B00111000,B00001111,B00000000,B01100000,B00001100,B00001100,B00000011,B00110000,B00000000,B00000001,B10001100,B00001100, + B01100000,B00000000,B11000000,B00111111,B11111000,B11111011,B00000000,B01100000,B00001100,B00001100,B00000011,B00110000,B00000000,B00000001,B10001100,B00001100, + B01100000,B00110000,B11000000,B00110000,B00000001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000001,B11110000,B00000001,B10000001,B10001100,B00001100, + B01100000,B00110000,B11000000,B00110000,B00000001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000000,B11100000,B00000001,B10000001,B10001100,B00011000, + B00110000,B00110000,B11000000,B00011000,B00110001,B10000011,B00000000,B01100000,B00001100,B00001100,B01000000,B11100000,B00000001,B10000011,B10001100,B00110000, + B00011000,B01100000,B11000000,B00001100,B01100001,B10000111,B11000000,B11100000,B00011100,B00001100,B11000000,B01100000,B00000000,B11000011,B00001100,B01100000, + B00001111,B11000011,B11110000,B00000111,B11000000,B11111111,B11000111,B11111100,B01111111,B00000111,B10000001,B11000000,B00000000,B01111110,B00011111,B11000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000000,B00000000,B00000000,B00000000,B00000000 +}; diff --git a/Marlin/src/config/examples/Creality/CR-10S/_Statusscreen.h b/Marlin/src/config/examples/Creality/CR-10S/_Statusscreen.h new file mode 100644 index 0000000000..30264c6def --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10S/_Statusscreen.h @@ -0,0 +1,452 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define STATUS_SCREENWIDTH 128 + +#define STATUS_SCREEN_HOTEND_TEXT_X(E) (38 + (E) * 20) + +#define STATUS_SCREEN_BED_TEXT_X (HOTENDS > 1 ? 81 : 73) + +// Can also be overridden in Configuration.h +#ifndef FAN_ANIM_FRAMES + #define FAN_ANIM_FRAMES 3 +#endif +#define STATUS_SCREEN_FAN_TEXT_X (FAN_ANIM_FRAMES == 3 ? 103 : 105) +#define STATUS_SCREEN_FAN_TEXT_Y (FAN_ANIM_FRAMES > 2 ? 28 : 27) + +//============================================ + +#if HOTENDS < 2 + + #if FAN_ANIM_FRAMES <= 2 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101100,B00000000,B11010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B10000111,B00110000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101111,B00000011,B11010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110011,B10000111,B00110000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 + }; + + #elif FAN_ANIM_FRAMES == 3 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000000,B00011111, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00100000,B00100111, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B11110000,B01111011, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B11110000,B01111011, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11111000,B11111101, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B11111000,B11111001, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00000100,B00111111,B11100001, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00000100,B00001111,B10000001, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00000100,B00001111,B10000001, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00000100,B00001111,B10000001, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00000100,B00111111,B11100001, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00000100,B11111000,B11111001, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00000101,B11111000,B11111101, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00000110,B11110000,B01111011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00000110,B11110000,B01111011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00100000,B00100111, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000111,B11000000,B00011111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000111,B11111111,B11111111 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000110,B00011111, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00111110,B00000111, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00111110,B00000011, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00011110,B00000011, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00011110,B00001101, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00000110,B00111101, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00000100,B00000111,B00111101, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00000100,B00001111,B11111111, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00000111,B11111111,B11111111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00000111,B11111111,B10000001, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00000101,B11100111,B00000001, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00000101,B11000011,B00000001, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00000101,B10000011,B11000001, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00000110,B00000011,B11000011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00000110,B00000011,B11100011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000011,B11100111, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000111,B11000011,B00011111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000111,B11111111,B11111111 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000011,B00011111, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000011,B11100111, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00000011,B11110011, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B10000011,B11100011, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11000011,B11000001, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11100011,B10000001, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00000101,B11110111,B00000001, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00000111,B11111111,B10000001, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00000111,B11111111,B11111111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00000100,B00001111,B11111111, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00000100,B00000111,B01111101, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00000100,B00001110,B00111101, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00000100,B00011110,B00011101, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00000110,B00111110,B00001011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00000110,B01111110,B00000011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00111110,B00000111, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000111,B11000110,B00011111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000111,B11111111,B11111111 + }; + + #elif FAN_ANIM_FRAMES == 4 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00111111,B00111000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111110,B00011000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111100,B00011000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101000,B01111100,B00001000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00111000,B00001000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B00111001,B11001000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11111111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11000111,B11101000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B11111111,B11101000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100111,B00111001,B11101000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B00111000,B01101000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B01111100,B00101000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110000,B01111100,B00011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B11111100,B00011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11111000,B00111000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00001111,B00111000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B11011000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110110,B00011111,B10011000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011111,B00001000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10011110,B00001000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B11111100,B00001000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B11011100,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100111,B11101111,B11001000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B01110111,B11101000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100000,B01111111,B11101000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B11110011,B11101000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100001,B11110001,B11101000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110011,B11110000,B11011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110111,B11110000,B01011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11100000,B00111000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B10000000,B11111000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B10000000,B00111000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000001,B11011000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B11000011,B11011000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11101000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B11000111,B11111000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100001,B11111111,B10001000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01101100,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01101100,B00001000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B01101100,B00001000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100011,B11111111,B00001000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00111111,B11000111,B10001000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B11000111,B11001000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110111,B10000111,B11011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110111,B00000011,B11011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000011,B00111000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000010,B11111000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen3_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11100000,B00011000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11100000,B00011000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100001,B11100001,B11101000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110011,B11101000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B01111111,B11101000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01110111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101000,B11101110,B00101000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101111,B11011100,B00001000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101111,B11111100,B00001000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10011110,B00001000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B00001111,B00001000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00110000,B00001111,B00011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B00001111,B00011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11111000 + }; + + #endif + +#else // HOTENDS >= 2 + + #if FAN_ANIM_FRAMES <= 2 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101110,B00110001,B11010000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B01111011,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00101111,B01111011,B11010000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00101110,B00110001,B11010000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00101100,B00000000,B11010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110000,B11111100,B00110000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B10000111,B00110000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00100000,B00110000,B00010000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100000,B01111000,B00010000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B00110000,B00010000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00101111,B00000011,B11010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00101111,B10000111,B11010000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110011,B10000111,B00110000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + + #elif FAN_ANIM_FRAMES == 3 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000000,B00011111, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00100000,B00100111, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B11110000,B01111011, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B11110000,B01111011, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11111000,B11111101, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B11111000,B11111001, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00000100,B00111111,B11100001, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00000100,B00001111,B10000001, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00000100,B00001111,B10000001, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00000100,B00001111,B10000001, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00000100,B00111111,B11100001, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00000100,B11111000,B11111001, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00000101,B11111000,B11111101, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00000110,B11110000,B01111011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00000110,B11110000,B01111011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000111,B00100000,B00100111, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00000111,B11000000,B00011111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00000111,B11111111,B11111111 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000110,B00011111, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00111110,B00000111, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00111110,B00000011, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00011110,B00000011, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00011110,B00001101, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00000110,B00111101, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00000100,B00000111,B00111101, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00000100,B00001111,B11111111, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00000111,B11111111,B11111111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00000111,B11111111,B10000001, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00000101,B11100111,B00000001, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00000101,B11000011,B00000001, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00000101,B10000011,B11000001, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00000110,B00000011,B11000011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00000110,B00000011,B11100011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000111,B00000011,B11100111, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00000111,B11000011,B00011111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00000111,B11111111,B11111111 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000011,B00011111, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000011,B11100111, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00000011,B11110011, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B10000011,B11100011, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11000011,B11000001, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11100011,B10000001, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00000101,B11110111,B00000001, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00000111,B11111111,B10000001, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00000111,B11111111,B11111111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00000100,B00001111,B11111111, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00000100,B00000111,B01111101, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00000100,B00001110,B00111101, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00000100,B00011110,B00011101, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00000110,B00111110,B00001011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00000110,B01111110,B00000011, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000111,B00111110,B00000111, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00000111,B11000110,B00011111, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00000111,B11111111,B11111111 + }; + + #elif FAN_ANIM_FRAMES == 4 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00111111,B00111000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111110,B00011000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B01111100,B00011000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101000,B01111100,B00001000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00111000,B00001000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101111,B00111001,B11001000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B11111111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00101111,B11000111,B11101000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00101111,B11111111,B11101000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100111,B00111001,B11101000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B00111000,B01101000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100000,B01111100,B00101000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110000,B01111100,B00011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110000,B11111100,B00011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111001,B11111000,B00111000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00001111,B00111000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B11011000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110110,B00011111,B10011000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011111,B00001000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10011110,B00001000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101111,B11111100,B00001000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B11011100,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100111,B11101111,B11001000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B01110111,B11101000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100000,B01111111,B11101000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B11110011,B11101000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100001,B11110001,B11101000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110011,B11110000,B11011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110111,B11110000,B01011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111001,B11100000,B00111000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B10000000,B11111000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B10000000,B00111000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000001,B11011000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B11000011,B11011000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11101000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B11000111,B11111000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00100001,B11111111,B10001000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00100000,B01101100,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100000,B01101100,B00001000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B01101100,B00001000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00100011,B11111111,B00001000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00111111,B11000111,B10001000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00101111,B11000111,B11001000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110111,B10000111,B11011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110111,B00000011,B11011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00000011,B00111000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000010,B11111000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen3_bmp[] PROGMEM = { + B00111101,B11110000,B00000010,B00111000,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01000100,B10001000,B00000110,B01000101,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B10000000,B10001000,B00000010,B01000101,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B10000000,B11110000,B00000010,B01000100,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11100000,B00011000, + B10000000,B10100011,B11110010,B01000100,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11100000,B00011000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100001,B11100001,B11101000, + B10000000,B10010000,B00000010,B01000100,B00010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110011,B11101000, + B01000100,B10001000,B00000010,B01000101,B00010000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00100000,B01111111,B11101000, + B00111001,B11001100,B00000111,B00111001,B11100000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00100000,B01110111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00101000,B11101110,B00101000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00101111,B11011100,B00001000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00101111,B11111100,B00001000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00101111,B10011110,B00001000, + B00000000,B00011000,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00101111,B00001111,B00001000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00110000,B00001111,B00011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110000,B00001111,B00011000, + B00000000,B00000100,B10001001,B00010000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B01000100,B10001001,B00010000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B00000000,B00111000,B01110000,B11100000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + + #endif + +#endif // HOTENDS >= 2 diff --git a/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h b/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h new file mode 100644 index 0000000000..e7d7702da7 --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h @@ -0,0 +1,1991 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ + +/** + * Creality CR-10 Mini + * X=300mm Y=220mm Z=300mm + * E3DV6 Hotend + * Titan Extruder + * CR10_STOCKDISPLAY (RAMPS-compatible with single 10-pin plug) + */ + +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI_CREALITY +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CR-10 Mini" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 120 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Stock CR-10 tuned for 70C + #define DEFAULT_Kp 22.57 + #define DEFAULT_Ki 1.72 + #define DEFAULT_Kd 73.96 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //Stock CR-10 Bed Tuned for 70C + #define DEFAULT_bedKp 426.68 + #define DEFAULT_bedKi 78.92 + #define DEFAULT_bedKd 576.71 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 1000 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +//#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 79.60, 80, 400, 229.4 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 600 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 5 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 300 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 300 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 WESTERN + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h new file mode 100644 index 0000000000..27d7764175 --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 4 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 420 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 8 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 120 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 6 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + #define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Creality/CR-10mini/_Bootscreen.h b/Marlin/src/config/examples/Creality/CR-10mini/_Bootscreen.h new file mode 100644 index 0000000000..38fb68f7da --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10mini/_Bootscreen.h @@ -0,0 +1,55 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_TIMEOUT 1000 +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111100,B00000000,B00000000, + B00001111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000001,B10000110,B00011111,B11000000, + B00011000,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00111100,B00001100,B00000000,B00000000,B00000001,B10000011,B00001100,B01100000, + B00010000,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00111100,B00001100,B00000000,B00000000,B00000001,B10000011,B00001100,B00110000, + B00110000,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00001100,B00000000,B00000000,B00000000,B00000011,B00001100,B00011000, + B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00111111,B00001111,B00111100,B00000000,B00000011,B00001100,B00001100, + B01100000,B00000001,B11011111,B00001111,B11100000,B11111110,B00000000,B01100000,B00011100,B00011100,B00000110,B00011000,B00000000,B00000110,B00001100,B00001100, + B01100000,B00000000,B11110011,B00011000,B00110001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000011,B00011000,B00000000,B00011110,B00001100,B00001100, + B01100000,B00000000,B11100000,B00110000,B00111001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000011,B00110000,B00000000,B00000011,B00001100,B00001100, + B01100000,B00000000,B11000000,B00110000,B00111000,B00001111,B00000000,B01100000,B00001100,B00001100,B00000011,B00110000,B00000000,B00000001,B10001100,B00001100, + B01100000,B00000000,B11000000,B00111111,B11111000,B11111011,B00000000,B01100000,B00001100,B00001100,B00000011,B00110000,B00000000,B00000001,B10001100,B00001100, + B01100000,B00110000,B11000000,B00110000,B00000001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000001,B11110000,B00000001,B10000001,B10001100,B00001100, + B01100000,B00110000,B11000000,B00110000,B00000001,B10000011,B00000000,B01100000,B00001100,B00001100,B00000000,B11100000,B00000001,B10000001,B10001100,B00011000, + B00110000,B00110000,B11000000,B00011000,B00110001,B10000011,B00000000,B01100000,B00001100,B00001100,B01000000,B11100000,B00000001,B10000011,B10001100,B00110000, + B00011000,B01100000,B11000000,B00001100,B01100001,B10000111,B11000000,B11100000,B00011100,B00001100,B11000000,B01100000,B00000000,B11000011,B00001100,B01100000, + B00001111,B11000011,B11110000,B00000111,B11000000,B11111111,B11000111,B11111100,B01111111,B00000111,B10000001,B11000000,B00000000,B01111110,B00011111,B11000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000000,B00000000,B00000000,B00000000,B00000000 +}; diff --git a/Marlin/src/config/examples/Creality/CR-10mini/_Statusscreen.h b/Marlin/src/config/examples/Creality/CR-10mini/_Statusscreen.h new file mode 100644 index 0000000000..f4fd17696a --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-10mini/_Statusscreen.h @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define STATUS_SCREENWIDTH 128 +#define STATUS_SCREEN_HOTEND_TEXT_X(E) 38 +#define STATUS_SCREEN_BED_TEXT_X 73 + +//============================================ + +const unsigned char status_screen0_bmp[] PROGMEM = { + B00000111,B11001111,B10000000,B00110001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00001111,B11001111,B11000000,B01110011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001100,B00001100,B01000000,B01110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00001100,B00001100,B11000000,B00110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00001100,B00001111,B11001111,B00110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00001100,B00001101,B10001111,B00110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00001100,B00001100,B11000000,B00110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00001111,B11001100,B11000000,B00110011,B11110000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B00000111,B11001100,B11000000,B00110001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B00000001,B10000011,B00110000,B00000011,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B00000001,B10000011,B00110010,B00000011,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101100,B00000000,B11010000, + B00000001,B11000111,B00000010,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000001,B11000111,B00110011,B11110011,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000001,B11101111,B00110011,B00110011,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000001,B10111011,B00110011,B00110011,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B11111100,B00110000, + B00000001,B10010011,B00110011,B00110011,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000001,B10010011,B00110011,B00110011,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000001,B10000011,B00110011,B00110011,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 +}; +const unsigned char status_screen1_bmp[] PROGMEM = { + B00000111,B11001111,B10000000,B00110001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00001111,B11001111,B11000000,B01110011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001100,B00001100,B01000000,B01110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B10000111,B00110000, + B00001100,B00001100,B11000000,B00110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00001100,B00001111,B11001111,B00110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00001100,B00001101,B10001111,B00110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00001100,B00001100,B11000000,B00110011,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00001111,B11001100,B11000000,B00110011,B11110000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B00000111,B11001100,B11000000,B00110001,B11100000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B00000001,B10000011,B00110000,B00000011,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B00000001,B10000011,B00110010,B00000011,B00000000,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101111,B00000011,B11010000, + B00000001,B11000111,B00000010,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000001,B11000111,B00110011,B11110011,B00000000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000001,B11101111,B00110011,B00110011,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000001,B10111011,B00110011,B00110011,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110011,B10000111,B00110000, + B00000001,B10010011,B00110011,B00110011,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000001,B10010011,B00110011,B00110011,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000001,B10000011,B00110011,B00110011,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 +}; diff --git a/Marlin/src/config/examples/Creality/CR-8/Configuration.h b/Marlin/src/config/examples/Creality/CR-8/Configuration.h new file mode 100644 index 0000000000..ec6cbcf52d --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-8/Configuration.h @@ -0,0 +1,1982 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(D-side, CR-8)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_ENDER_4 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CR-8" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ender-4 + #define DEFAULT_Kp 21.73 + #define DEFAULT_Ki 1.54 + #define DEFAULT_Kd 76.55 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + // Ender-4 + #define DEFAULT_bedKp 426.68 + #define DEFAULT_bedKi 78.92 + #define DEFAULT_bedKd 576.71 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 190 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 500 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 92.60 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 500 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 20.0 +#define DEFAULT_YJERK 20.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_ENDSTOP_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 310 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h new file mode 100644 index 0000000000..3380586f7f --- /dev/null +++ b/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z false // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 5 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Creality/Ender-2/Configuration.h b/Marlin/src/config/examples/Creality/Ender-2/Configuration.h new file mode 100644 index 0000000000..868f021747 --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-2/Configuration.h @@ -0,0 +1,1976 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(tommie, Ender 2/4)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI_CREALITY +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Ender 3D" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 125 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + // Creality Ender + #define DEFAULT_Kp 21.73 + #define DEFAULT_Ki 1.54 + #define DEFAULT_Kd 76.55 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 93 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 500 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER false // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 150 +#define Y_BED_SIZE 150 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 185 +#define PREHEAT_1_TEMP_BED 45 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 0 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h new file mode 100644 index 0000000000..c4b53e9c15 --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 1 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 0} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Creality/Ender-2/README.md b/Marlin/src/config/examples/Creality/Ender-2/README.md new file mode 100644 index 0000000000..e64f3ec3d2 --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-2/README.md @@ -0,0 +1,18 @@ +# Creality Ender Support + +This branch is a reverse-engineered version based on the unpublished firmware from Creality. It is **not** the authoritative source, but has been carefully re-built by looking at their firmware and inferring the base version and configuration they used. The basis is the firmware version from "Jul 31 2017 10:16:30". It is based on Marlin 1.0.1, because + +* 1.0.0 had very different serial output in `setup()` and overall code structure. +* 1.0.2 changed the `VERSION_STRING` to include a leading space, and `lcd_init` uses `SET_INPUT` instead of `pinMode`. + +Configurations were found by seeing what code was compiled into the firmware, and constants used there. + +For U8Glib, at least version 1.14 and at most 1.17 is used, because + +* 1.12 didn't have the extra speed argument to u8g_InitCom. +* 1.13 didn't have the soft reset instruction for UC1701 initialization. +* 1.18 has a new directory structure. + +## Bitmaps + +The bootscreen and custom status screens come from Creality's firmware. diff --git a/Marlin/src/config/examples/Creality/Ender-2/_Bootscreen.h b/Marlin/src/config/examples/Creality/Ender-2/_Bootscreen.h new file mode 100644 index 0000000000..11be930e9c --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-2/_Bootscreen.h @@ -0,0 +1,96 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_TIMEOUT 1000 +#define CUSTOM_BOOTSCREEN_BMPWIDTH 81 +#define CUSTOM_BOOTSCREEN_INVERTED + +const unsigned char custom_start_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B11111111,B11101111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11101111,B11101111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11100111,B11011111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11100111,B11011111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11100011,B11011111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11110011,B11001111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11100001,B11100001,B11001111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111110,B01111000,B00000000,B00000000,B00000011,B11011101,B11111111,B11111111,B11111111,B11111111, + B11111110,B11111111,B10000000,B01111110,B00000000,B00000001,B11101110,B11111111,B11111111,B11111111,B11111111, + B11111110,B01111101,B11001111,B11111100,B00000000,B00000000,B11110111,B01111111,B11111111,B11111111,B11111111, + B11111111,B10001110,B00000110,B00000000,B00000000,B00000000,B01111011,B10111111,B11111111,B11111111,B11111111, + B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111101,B11011111,B11111111,B11111111,B11111111, + B11111111,B11111100,B00000001,B11111110,B00000000,B00000000,B00111110,B11100111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111100,B00000000,B00000011,B00011111,B01110011,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111000,B00000000,B00000001,B10001111,B10000001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B10000011,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B00000000,B11111100,B00000000,B00000000,B11110000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11100000,B00001111,B11111111,B11000000,B00000000,B00000000,B11111111,B11111111,B11111111, + B11111111,B11111110,B00000011,B11111111,B11111111,B11000000,B00000000,B00000000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111001,B00000000,B00000000,B00000000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000111,B11000000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000111,B11100000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000111,B11110001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000111,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B00000011,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000011,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11000011,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100001,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000,B10111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111011,B11111000,B00111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111001,B11111000,B00111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B01111110,B11110000,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B10001110,B00000011,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00011111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B01111111,B11111111,B11111111,B11111111, + B11111111,B00000000,B00000000,B01111111,B11111111,B11111111,B11111000,B01111111,B11111111,B11111111,B11111111, + B11111111,B10000000,B00000000,B01111111,B11111111,B11111111,B11100000,B01111111,B11111111,B11111111,B11111111, + B11111111,B11000011,B11111100,B11111111,B11111111,B11111111,B11111000,B11111111,B11111111,B11111111,B11111111, + B11111111,B11000011,B11111100,B11111111,B11111111,B11111111,B11111000,B11111111,B11111111,B11111111,B11111111, + B11111111,B10000111,B11111101,B11111111,B11111111,B11111111,B11110001,B11111111,B11111111,B11111111,B11111111, + B11111111,B10000111,B11111111,B11111111,B11111111,B11111111,B11110001,B11111111,B11111111,B11111111,B11111111, + B11111111,B00001111,B11100111,B11110011,B00001111,B11111100,B00100011,B11111100,B00111111,B11111111,B11111111, + B11111111,B00001111,B11101111,B10000000,B00000111,B11110000,B00000011,B11110000,B00011110,B00000000,B01111111, + B11111110,B00011111,B11001111,B10000001,B10000111,B11000111,B10000111,B11000111,B00001100,B00000000,B01111111, + B11111110,B00000000,B00011111,B11000111,B11000111,B10001111,B11000111,B10011111,B00001111,B00001100,B11111111, + B11111110,B00000000,B00011111,B10000111,B10001111,B00011111,B10001111,B00011111,B00001111,B00011111,B11111111, + B11111100,B00111111,B10011111,B10001111,B10001111,B00011111,B10001110,B00000000,B00011110,B00111111,B11111111, + B11111100,B01111111,B00111111,B00001111,B00011110,B00111111,B00011110,B00111111,B11111110,B00111111,B11111111, + B11111000,B01111111,B11111111,B00011111,B00011100,B00111111,B00011100,B01111111,B11111100,B01111111,B11111111, + B11111000,B11111111,B11111111,B00011110,B00011100,B01111110,B00011100,B01111111,B11111100,B01111111,B11111111, + B11110000,B11111111,B11001110,B00111110,B00111100,B01111110,B00111100,B01111111,B10111000,B11111111,B11111111, + B11110000,B11111111,B10011110,B00111100,B00111000,B01111100,B00111000,B01111110,B01111000,B11111111,B11111111, + B11100001,B11111111,B00111100,B01111100,B01111000,B01111100,B01111000,B00111100,B11110001,B11111111,B11111111, + B11100001,B11111000,B00111000,B01111000,B01111000,B00010000,B00011000,B00000001,B11110001,B11111111,B11111111, + B00000000,B00000000,B01100000,B00100000,B00111100,B00000000,B01111100,B00000111,B10000000,B01111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111110,B00011111,B11111110,B00011111,B11111111,B11111111,B11111111 +}; diff --git a/Marlin/src/config/examples/Creality/Ender-2/_Statusscreen.h b/Marlin/src/config/examples/Creality/Ender-2/_Statusscreen.h new file mode 100644 index 0000000000..fd269c4b91 --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-2/_Statusscreen.h @@ -0,0 +1,130 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define STATUS_SCREENWIDTH 128 +#define STATUS_SCREEN_HOTEND_TEXT_X(E) (38 + (E) * 20) +#define STATUS_SCREEN_BED_TEXT_X (HOTENDS > 1 ? 81 : 73) +#define STATUS_SCREEN_FAN_TEXT_X 103 + +//============================================ + +#if HOTENDS < 2 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B11111110,B00000000,B00000010,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B01000010,B00000000,B00000010,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B01001000,B00000000,B00000010,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B01001000,B11011100,B00111110,B00111100,B11101110,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B01111000,B01100010,B01000010,B01000010,B00110010,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101100,B00000000,B11010000, + B01001000,B01000010,B01000010,B01000010,B00100000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B00110000,B00010000, + B01001000,B01000010,B01000010,B01111110,B00100000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B01111000,B00010000, + B01000000,B01000010,B01000010,B01000000,B00100000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100000,B11111100,B00010000, + B01000010,B01000010,B01000110,B01000010,B00100000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B11111100,B00110000, + B11111110,B11100111,B00111011,B00111100,B11111000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B10000111,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B11111110,B00000000,B00000010,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B01000010,B00000000,B00000010,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B01001000,B00000000,B00000010,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B01001000,B11011100,B00111110,B00111100,B11101110,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B01111000,B01100010,B01000010,B01000010,B00110010,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101111,B00000011,B11010000, + B01001000,B01000010,B01000010,B01000010,B00100000,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B01001000,B01000010,B01000010,B01111110,B00100000,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B01000000,B01000010,B01000010,B01000000,B00100000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100111,B10000111,B10010000, + B01000010,B01000010,B01000110,B01000010,B00100000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110011,B10000111,B00110000, + B11111110,B11100111,B00111011,B00111100,B11111000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 + }; + +#else // HOTENDS >= 2 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B11111110,B00000000,B00000010,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101110,B00110001,B11010000, + B01000010,B00000000,B00000010,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B01111011,B11010000, + B01001000,B00000000,B00000010,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00101111,B01111011,B11010000, + B01001000,B11011100,B00111110,B00111100,B11101110,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00101110,B00110001,B11010000, + B01111000,B01100010,B01000010,B01000010,B00110010,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00101100,B00000000,B11010000, + B01001000,B01000010,B01000010,B01000010,B00100000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B01001000,B01000010,B01000010,B01111110,B00100000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100000,B01111000,B00010000, + B01000000,B01000010,B01000010,B01000000,B00100000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00100000,B11111100,B00010000, + B01000010,B01000010,B01000110,B01000010,B00100000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110000,B11111100,B00110000, + B11111110,B11100111,B00111011,B00111100,B11111000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B10000111,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B11111110,B00000000,B00000010,B00000000,B00000000,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00100000,B00110000,B00010000, + B01000010,B00000000,B00000010,B00000000,B00000000,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00100000,B01111000,B00010000, + B01001000,B00000000,B00000010,B00000000,B00000000,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100000,B01111000,B00010000, + B01001000,B11011100,B00111110,B00111100,B11101110,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B00110000,B00010000, + B01111000,B01100010,B01000010,B01000010,B00110010,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00101111,B00000011,B11010000, + B01001000,B01000010,B01000010,B01000010,B00100000,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00101111,B10000111,B11010000, + B01001000,B01000010,B01000010,B01111110,B00100000,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00101111,B10000111,B11010000, + B01000000,B01000010,B01000010,B01000000,B00100000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00100111,B10000111,B10010000, + B01000010,B01000010,B01000110,B01000010,B00100000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110011,B10000111,B00110000, + B11111110,B11100111,B00111011,B00111100,B11111000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + +#endif // HOTENDS >= 2 diff --git a/Marlin/src/config/examples/Creality/Ender-3/Configuration.h b/Marlin/src/config/examples/Creality/Ender-3/Configuration.h new file mode 100644 index 0000000000..0b1a077d80 --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-3/Configuration.h @@ -0,0 +1,1976 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(thisiskeithb, Ender-3)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI_CREALITY +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Ender-3" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 125 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + // Creality Ender-3 + #define DEFAULT_Kp 21.73 + #define DEFAULT_Ki 1.54 + #define DEFAULT_Kd 76.55 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 93 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 500 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER false // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 250 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 185 +#define PREHEAT_1_TEMP_BED 45 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 0 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 WESTERN + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h new file mode 100644 index 0000000000..70181295c0 --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 0} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Creality/Ender-3/README.md b/Marlin/src/config/examples/Creality/Ender-3/README.md new file mode 100644 index 0000000000..e64f3ec3d2 --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-3/README.md @@ -0,0 +1,18 @@ +# Creality Ender Support + +This branch is a reverse-engineered version based on the unpublished firmware from Creality. It is **not** the authoritative source, but has been carefully re-built by looking at their firmware and inferring the base version and configuration they used. The basis is the firmware version from "Jul 31 2017 10:16:30". It is based on Marlin 1.0.1, because + +* 1.0.0 had very different serial output in `setup()` and overall code structure. +* 1.0.2 changed the `VERSION_STRING` to include a leading space, and `lcd_init` uses `SET_INPUT` instead of `pinMode`. + +Configurations were found by seeing what code was compiled into the firmware, and constants used there. + +For U8Glib, at least version 1.14 and at most 1.17 is used, because + +* 1.12 didn't have the extra speed argument to u8g_InitCom. +* 1.13 didn't have the soft reset instruction for UC1701 initialization. +* 1.18 has a new directory structure. + +## Bitmaps + +The bootscreen and custom status screens come from Creality's firmware. diff --git a/Marlin/src/config/examples/Creality/Ender-3/_Bootscreen.h b/Marlin/src/config/examples/Creality/Ender-3/_Bootscreen.h new file mode 100644 index 0000000000..11be930e9c --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-3/_Bootscreen.h @@ -0,0 +1,96 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_TIMEOUT 1000 +#define CUSTOM_BOOTSCREEN_BMPWIDTH 81 +#define CUSTOM_BOOTSCREEN_INVERTED + +const unsigned char custom_start_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B11111111,B11101111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11101111,B11101111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11100111,B11011111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11100111,B11011111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11100011,B11011111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11110011,B11001111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11100001,B11100001,B11001111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111110,B01111000,B00000000,B00000000,B00000011,B11011101,B11111111,B11111111,B11111111,B11111111, + B11111110,B11111111,B10000000,B01111110,B00000000,B00000001,B11101110,B11111111,B11111111,B11111111,B11111111, + B11111110,B01111101,B11001111,B11111100,B00000000,B00000000,B11110111,B01111111,B11111111,B11111111,B11111111, + B11111111,B10001110,B00000110,B00000000,B00000000,B00000000,B01111011,B10111111,B11111111,B11111111,B11111111, + B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111101,B11011111,B11111111,B11111111,B11111111, + B11111111,B11111100,B00000001,B11111110,B00000000,B00000000,B00111110,B11100111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111100,B00000000,B00000011,B00011111,B01110011,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111000,B00000000,B00000001,B10001111,B10000001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B10000011,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B00000000,B11111100,B00000000,B00000000,B11110000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11100000,B00001111,B11111111,B11000000,B00000000,B00000000,B11111111,B11111111,B11111111, + B11111111,B11111110,B00000011,B11111111,B11111111,B11000000,B00000000,B00000000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111001,B00000000,B00000000,B00000000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000111,B11000000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000111,B11100000,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000111,B11110001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000111,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B00000011,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000011,B11111001,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11000011,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11100001,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000,B10111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111011,B11111000,B00111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111001,B11111000,B00111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B01111110,B11110000,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B10001110,B00000011,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00011111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B01111111,B11111111,B11111111,B11111111, + B11111111,B00000000,B00000000,B01111111,B11111111,B11111111,B11111000,B01111111,B11111111,B11111111,B11111111, + B11111111,B10000000,B00000000,B01111111,B11111111,B11111111,B11100000,B01111111,B11111111,B11111111,B11111111, + B11111111,B11000011,B11111100,B11111111,B11111111,B11111111,B11111000,B11111111,B11111111,B11111111,B11111111, + B11111111,B11000011,B11111100,B11111111,B11111111,B11111111,B11111000,B11111111,B11111111,B11111111,B11111111, + B11111111,B10000111,B11111101,B11111111,B11111111,B11111111,B11110001,B11111111,B11111111,B11111111,B11111111, + B11111111,B10000111,B11111111,B11111111,B11111111,B11111111,B11110001,B11111111,B11111111,B11111111,B11111111, + B11111111,B00001111,B11100111,B11110011,B00001111,B11111100,B00100011,B11111100,B00111111,B11111111,B11111111, + B11111111,B00001111,B11101111,B10000000,B00000111,B11110000,B00000011,B11110000,B00011110,B00000000,B01111111, + B11111110,B00011111,B11001111,B10000001,B10000111,B11000111,B10000111,B11000111,B00001100,B00000000,B01111111, + B11111110,B00000000,B00011111,B11000111,B11000111,B10001111,B11000111,B10011111,B00001111,B00001100,B11111111, + B11111110,B00000000,B00011111,B10000111,B10001111,B00011111,B10001111,B00011111,B00001111,B00011111,B11111111, + B11111100,B00111111,B10011111,B10001111,B10001111,B00011111,B10001110,B00000000,B00011110,B00111111,B11111111, + B11111100,B01111111,B00111111,B00001111,B00011110,B00111111,B00011110,B00111111,B11111110,B00111111,B11111111, + B11111000,B01111111,B11111111,B00011111,B00011100,B00111111,B00011100,B01111111,B11111100,B01111111,B11111111, + B11111000,B11111111,B11111111,B00011110,B00011100,B01111110,B00011100,B01111111,B11111100,B01111111,B11111111, + B11110000,B11111111,B11001110,B00111110,B00111100,B01111110,B00111100,B01111111,B10111000,B11111111,B11111111, + B11110000,B11111111,B10011110,B00111100,B00111000,B01111100,B00111000,B01111110,B01111000,B11111111,B11111111, + B11100001,B11111111,B00111100,B01111100,B01111000,B01111100,B01111000,B00111100,B11110001,B11111111,B11111111, + B11100001,B11111000,B00111000,B01111000,B01111000,B00010000,B00011000,B00000001,B11110001,B11111111,B11111111, + B00000000,B00000000,B01100000,B00100000,B00111100,B00000000,B01111100,B00000111,B10000000,B01111111,B11111111, + B11111111,B11111111,B11111111,B11111111,B11111110,B00011111,B11111110,B00011111,B11111111,B11111111,B11111111 +}; diff --git a/Marlin/src/config/examples/Creality/Ender-3/_Statusscreen.h b/Marlin/src/config/examples/Creality/Ender-3/_Statusscreen.h new file mode 100644 index 0000000000..95e8298c3e --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-3/_Statusscreen.h @@ -0,0 +1,130 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define STATUS_SCREENWIDTH 128 +#define STATUS_SCREEN_HOTEND_TEXT_X(E) (38 + (E) * 20) +#define STATUS_SCREEN_BED_TEXT_X (HOTENDS > 1 ? 81 : 73) +#define STATUS_SCREEN_FAN_TEXT_X 103 + +//============================================ + +#if HOTENDS < 2 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B11111000,B00000001,B10000000,B00000000,B00001100,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B01001000,B00000000,B10000000,B00000000,B00010010,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B01000011,B11000011,B10001100,B11010000,B00000010,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00101111,B01111011,B11010000, + B01110001,B00100100,B10010010,B01100111,B11001100,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00101110,B00110001,B11010000, + B01000001,B00100100,B10011110,B01000000,B00000010,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101100,B00000000,B11010000, + B01001001,B00100100,B10010000,B01000000,B00010010,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B00110000,B00010000, + B11111011,B10110011,B11001110,B11100000,B00001100,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B10000111,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B11111000,B00000001,B10000000,B00000000,B00001100,B00011111,B11100000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B01001000,B00000000,B10000000,B00000000,B00010010,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B01000011,B11000011,B10001100,B11010000,B00000010,B00111111,B11110000,B00000000,B00000000,B00000100,B00010000,B01000000,B00000000,B00100000,B01111000,B00010000, + B01110001,B00100100,B10010010,B01100111,B11001100,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00100000,B00110000,B00010000, + B01000001,B00100100,B10011110,B01000000,B00000010,B00011111,B11100000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00101111,B00000011,B11010000, + B01001001,B00100100,B10010000,B01000000,B00010010,B00011111,B11100000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B11111011,B10110011,B11001110,B11100000,B00001100,B00111111,B11110000,B00000000,B00000000,B00100000,B10000010,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00010000,B01000001,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000000,B00000000,B00001000,B00100000,B10000000,B00000000,B00110011,B10000111,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000 + }; + +#else // HOTENDS >= 2 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B11111000,B00000001,B10000000,B00000000,B00001100,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00101110,B00110001,B11010000, + B01001000,B00000000,B10000000,B00000000,B00010010,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00101111,B01111011,B11010000, + B01000011,B11000011,B10001100,B11010000,B00000010,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00101111,B01111011,B11010000, + B01110001,B00100100,B10010010,B01100111,B11001100,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00101110,B00110001,B11010000, + B01000001,B00100100,B10011110,B01000000,B00000010,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00101100,B00000000,B11010000, + B01001001,B00100100,B10010000,B01000000,B00010010,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B11111011,B10110011,B11001110,B11100000,B00001100,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B10000111,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B11111000,B00000001,B10000000,B00000000,B00001100,B00011111,B11100000,B00000001,B11111110,B00000000,B00001000,B00100000,B10000000,B00100000,B00110000,B00010000, + B01001000,B00000000,B10000000,B00000000,B00010010,B00111110,B11110000,B00000011,B11001111,B00000000,B00000100,B00010000,B01000000,B00100000,B01111000,B00010000, + B01000011,B11000011,B10001100,B11010000,B00000010,B00111100,B11110000,B00000011,B10110111,B00000000,B00000100,B00010000,B01000000,B00100000,B01111000,B00010000, + B01110001,B00100100,B10010010,B01100111,B11001100,B00111010,B11110000,B00000011,B11110111,B00000000,B00001000,B00100000,B10000000,B00100000,B00110000,B00010000, + B01000001,B00100100,B10011110,B01000000,B00000010,B00011110,B11100000,B00000001,B11101110,B00000000,B00010000,B01000001,B00000000,B00101111,B00000011,B11010000, + B01001001,B00100100,B10010000,B01000000,B00010010,B00011110,B11100000,B00000001,B11011110,B00000000,B00100000,B10000010,B00000000,B00101111,B10000111,B11010000, + B11111011,B10110011,B11001110,B11100000,B00001100,B00111110,B11110000,B00000011,B10111111,B00000000,B00100000,B10000010,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B11110000,B00000011,B10000111,B00000000,B00010000,B01000001,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11110000,B00000011,B11111111,B00000000,B00001000,B00100000,B10000000,B00110011,B10000111,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11000000,B00000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B10000000,B00000000,B01111000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000000,B00000000,B00110000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + +#endif // HOTENDS >= 2 diff --git a/Marlin/src/config/examples/Creality/Ender-4/Configuration.h b/Marlin/src/config/examples/Creality/Ender-4/Configuration.h new file mode 100644 index 0000000000..b9e6c2246e --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-4/Configuration.h @@ -0,0 +1,1982 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "Skorpi, Creality Ender-4)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_ENDER_4 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Ender-4" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ender-4 + #define DEFAULT_Kp 22.57 + #define DEFAULT_Ki 1.72 + #define DEFAULT_Kd 73.96 + + // Ultimaker +// #define DEFAULT_Kp 22.2 +// #define DEFAULT_Ki 1.08 +// #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + // Ender-4 + #define DEFAULT_bedKp 426.68 + #define DEFAULT_bedKi 78.92 + #define DEFAULT_bedKd 576.71 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 190 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 500 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true//false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 110 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 10, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 500, 500, 100, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 20.0 +#define DEFAULT_YJERK 20.0 +#define DEFAULT_ZJERK 2.4 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 310 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION // Enable G26 mesh validation + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h new file mode 100644 index 0000000000..3380586f7f --- /dev/null +++ b/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z false // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 5 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Einstart-S/Configuration.h b/Marlin/src/config/examples/Einstart-S/Configuration.h new file mode 100644 index 0000000000..ab7dc49f57 --- /dev/null +++ b/Marlin/src/config/examples/Einstart-S/Configuration.h @@ -0,0 +1,1987 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "elsie tech corp" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_EINSTART_S +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "The Shining" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * 666 : Custom table generated for 200K thermistor with 10k pullup on Einstart S + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 666 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Einstart S + // Autotune M303 S180 C8 + #define DEFAULT_Kp 15.31 + #define DEFAULT_Ki 0.93 + #define DEFAULT_Kd 63.03 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +//#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +//#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +//#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +//#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +//#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +#define X_STOP_INVERTING true +#define Y_STOP_INVERTING true +#define Z_STOP_INVERTING true + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 80, 96.337120 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 2000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 2000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 2000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 1 +#define Y_ENABLE_ON 1 +#define Z_ENABLE_ON 1 +#define E_ENABLE_ON 1 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 160 +#define Y_BED_SIZE 160 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 165 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + #define U8GLIB_SSD1306 + //#define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +// +// Einstart S OLED SSD1306 +// +#define U8GLIB_SH1106_EINSTART + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Einstart-S/Configuration_adv.h b/Marlin/src/config/examples/Einstart-S/Configuration_adv.h new file mode 100644 index 0000000000..c7e0d1e6b6 --- /dev/null +++ b/Marlin/src/config/examples/Einstart-S/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +#define MINIMUM_STEPPER_DIR_DELAY 0 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Einstart-S/readme.md b/Marlin/src/config/examples/Einstart-S/readme.md new file mode 100644 index 0000000000..fbcb5f7668 --- /dev/null +++ b/Marlin/src/config/examples/Einstart-S/readme.md @@ -0,0 +1,152 @@ +## Einstart S Machine Notes + +The Einstart S is a commercial machine that ships with a proprietary firmware and "licensed" slicer program which requires the original SD card or license file (.lic/.reg) from support in order to function. The impetus for the port was that I acquired the machine on the weekend when tech support was closed. + +## Specifications: + + - Powder coated, formed steel enclosure + - Machined Aluminum internal axis support frame + - Genuine matched HIWIN rails on all axis + - Genuine Minebea NEMA17 motors (200 steps/rev) + - THC7128 3A Stepper Drivers (configured for 16 microsteps, loud) + - 160x160 magnetically coupled non-heated bed + - PLA Only Direct Drive extruder + - SH1106 OLED Display w/ Cardinal navigation + - 9533 I2C PWM RGB LED Chassis illumination + - Onboard SD-Card Support + +## Initial modifications + +### Bootloader/Marlin installation + +This machine probably doesn't ship with the arduino boot loader, so unless you reflow a 2560 on there to replace the atmega1280 like I did (to preserve the original firmware), you'll need to use ISP to do an initial firmware load and/or bootloader flash! + +It's not that bad though, you can just buy an ISP programmer with the appropriate header, or build an ISP programmer using the Arduino ISP sketch (wiring is easier if you use the "old style wiring" which utilizes the following pinout: (see the comments in the ArduinoISP sketch). + +I used an arduino Nano and a header I had lying around, but you could do the same with a nano and some dupont headers cut and soldered to the board, and taped/glued into a header. + +Triple check your pinouts, it shouldn't fry if connected backwards but if your pinout is wrong you're going to struggle for sure. + +#### ArduinoISP Sketch pinout for 10pin ISP header using "old style wiring": + +See the comments in the ArduinoISP sketch under File:Examples:ArduinoISP + +1 MOSI D11 +2 5v Vcc +3 N/C +4 GND +5 RES D10 +6 N/C +7 SCK D13 +8 N/C +9 MISO D12 +10 GND GND + +#### Einstart Motherboard ISP Header Pinout + +The 10 pin ISP Header is located to the right of the ATMEGA chip, just above the long LCD header. + +#### ISP Diagram + +<--- Face of chassis + +MOSI ( 1 ) ( 2 ) Vcc + N/C ( 3 ) ( 4 ) GND + RST ( 5 ) ( 6 ) GND + SCK ( 7 ) ( 8 ) GND +MISO ( 9 ) (10 ) GND + +Component Plugs ---> + +### Motherboard Diagram + + |1234|1234|1234|1234|12|12|12|12|12|12|12|12|12|12|123|12|1234| + --------------------------------------------------------------- +| XMOT YMOT ZMOT EMOT EF HB HE PF ZS YS XS PS BT ET PT1 TC VBRG | +| ===== ====== [DC| +|====== ====== ____ ISP IC1__ ___| +| |1280| ::::: | | |USB| +| |____| 1 |__| |___| +| BUTTON |SD | +| GDLRUO LCD |___| +|________________________[......][....................]_________| + +Legend: + +XMOT X-Motor +YMOT Y-Motor +ZMOT Z-Motor +EMOT E-Motor +EF Extruder Fan +HB Heated Bed (PWM) +HE Hot End (PWM) +PF Part Fan (PWM) +ZS Z-Endstop (Max) +YS Y-Endstop (Min) +XS X-Endstop (Min) +PS SPST Switch to enable DC 24v +BT Bed Thermistor (header not populated) +ET Extruder Thermistor +PT1 PT100 Thermocouple (not populated) +TC Thermocouple (not populated) +VBRG LED Output from PCA5933 +BUTTONS +G GND (buttons are pulled low on activation) +D DOWN +L LEFT +R RIGHT +U UP +O OK (MIDDLE) + +## Uploading Marlin firmware to a stock Einstart S + +### Summary: + +Make, buy or steal a 10 pin ISP programmer and select the appropriate programmer option via Tools:Programmer in Arduino IDE, use the Sketch:Upload Using Programmer command or Shift-Ctrl-U (vs Ctrl-U to upload via serial). + +### Detailed procedure: + +You can either load Marlin directly via ISP programmer (easiest, but requires opening the chassis every time you want to change/update firmware) or, just program the bootloader which will enable later uploads via USB. HOWEVER, to actually upload the sketch you will need one of the following: + + - ISP programming header (ArduinoISP sketch, pinout below) + - OR + - Install bootloader on atmega1280 to enable native USB uploads (also requires ISP). + - AND + - Connect button between RESET and GND on ISP header, release post compile just before upload starts. + - OR + - Install permanent modification described below, requires no button press during upload. + +### Permanent modification to enable USB uploads via Arduino IDE + +As a permanent modification to enable direct USB upload from the arduino IDE, you would need to flash the boot loader using ISP first; but then you can solder a wire or 100n capacaitor between the DTR line on the FTDI to the reset line, which is conveniently located in several places on the board. + +#### FTDI Chip Diagram (IC1) + + ______ + TXD --|1 28|--OSCO + DTR --|2 27|--OSCI + RTS --|3 26|--TEST + VCCIO--|4 25|--AGND + RXD --|5 24|--N/C + RI --|6 23|--CBUS0 + GND --|7 22|--CBUS1 + N/C --|8 21|--GND + DSR --|9 20|--Vcc + DCD --|10 19|--RES + CTS --|11 18|--GND + CBUS4--|12 17|--3V3 + CBUS2--|13 16|--USBDM + CBUS3--|14 15|--USBDP + |______| + +#### Arduino Reset Circuit + + DTR-----||----GND----/\/\/\/----Vcc + 100nf 10k + +With this modification you no longer need the reset button and you can program directly from the Arduino IDE. + +### Power notes during flashing. + +You do NOT need power connected when flashing via ISP. +You DO need power when flashing via USB Serial but you MUST time the release of the reset line to allow the upload unless you've performed the permanent modification. \ No newline at end of file diff --git a/Marlin/src/config/examples/Felix/Configuration.h b/Marlin/src/config/examples/Felix/Configuration.h new file mode 100644 index 0000000000..a680ebdf8c --- /dev/null +++ b/Marlin/src/config/examples/Felix/Configuration.h @@ -0,0 +1,1954 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, Felix)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_FELIX2 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Felix" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + #define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 15 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Felix 2.0+ electronics with v4 Hotend + #define DEFAULT_Kp 12 + #define DEFAULT_Ki 0.84 + #define DEFAULT_Kd 85 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + // Felix Foil Heater + #define DEFAULT_bedKp 103.37 + #define DEFAULT_bedKi 2.79 + #define DEFAULT_bedKd 956.94 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +// default steps per unit for Felix 2.0/3.0: 0.00249mm x/y rounding error with 3mm pitch HTD belt and 14 tooth pulleys. 0 z error. +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 76.190476, 76.190476, 1600, 164 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 5000, 5000, 100, 80000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1750 // X, Y, Z and E max acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 5000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 255 +#define Y_BED_SIZE 205 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 235 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Felix/Configuration_adv.h b/Marlin/src/config/examples/Felix/Configuration_adv.h new file mode 100644 index 0000000000..7efa557ddd --- /dev/null +++ b/Marlin/src/config/examples/Felix/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 3 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Felix/DUAL/Configuration.h b/Marlin/src/config/examples/Felix/DUAL/Configuration.h new file mode 100644 index 0000000000..edd8517c3a --- /dev/null +++ b/Marlin/src/config/examples/Felix/DUAL/Configuration.h @@ -0,0 +1,1954 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, Felix/DUAL)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_FELIX2 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Felix Dual" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 2 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + #define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 1 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 15 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Felix 2.0+ electronics with v4 Hotend + #define DEFAULT_Kp 12 + #define DEFAULT_Ki 0.84 + #define DEFAULT_Kd 85 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + // Felix Foil Heater + #define DEFAULT_bedKp 103.37 + #define DEFAULT_bedKi 2.79 + #define DEFAULT_bedKd 956.94 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +// default steps per unit for Felix 2.0/3.0: 0.00249mm x/y rounding error with 3mm pitch HTD belt and 14 tooth pulleys. 0 z error. +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 76.190476, 76.190476, 1600, 164 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 5000, 5000, 100, 80000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1750 // X, Y, Z and E max acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 5000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR true +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 255 +#define Y_BED_SIZE 205 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 235 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Felix/README.md b/Marlin/src/config/examples/Felix/README.md new file mode 100644 index 0000000000..48fe099151 --- /dev/null +++ b/Marlin/src/config/examples/Felix/README.md @@ -0,0 +1,60 @@ +# Felix 2.0/3.0 Configuration for Marlin Firmware + +Bringing silky smooth prints to Felix. + +## Build HOWTO + + - Install the latest non-beta Arduino software IDE/toolset: http://www.arduino.cc/en/Main/Software + - Download the Marlin firmware + - [Latest developement version](https://github.com/MarlinFirmware/Marlin/tree/Development) + - [Stable version](https://github.com/MarlinFirmware/Marlin/tree/Development) + - In both cases use the "Download Zip" button on the right. + +``` +cd Marlin/src +cp config/examples/Felix/Configuration_adv.h . +``` + +The next step depends on your setup: + +### Single Extruder Configuration + + cp config/examples/Felix/Configuration.h . + +### Dual Extruder Configuration + + cp config/examples/Felix/DUAL/Configuration.h Configuration.h + +### Compile Firmware + + - Start the Arduino IDE. + - Select Tools -> Board -> Arduino Mega 2560 + - Select the correct serial port in Tools -> Serial Port (usually /dev/ttyUSB0) + - Open Marlin.pde or .ino + - Click the Verify/Compile button + +### Flash Firmware + +#### Connected directly via USB + + - Click the Upload button. If all goes well the firmware is uploading + +#### Remote update + +Find the latest Arduino build: + + ls -altr /tmp/ + drwxr-xr-x 5 chrono users 12288 Mar 3 21:41 build6072035599686630843.tmp + +Copy the firmware to your printer host: + + scp /tmp/build6072035599686630843.tmp/Marlin.cpp.hex a.b.c.d:/tmp/ + +Connect to your printer host via ssh, stop Octoprint or any other service that may block your USB device and make sure you have avrdude installed, then run: + + avrdude -C/etc/avrdude.conf -v -v -v -patmega2560 -cwiring -P/dev/ttyUSB0 \ + -b115200 -D -Uflash:w:/tmp/Marlin.cpp.hex:i + +## Acknowledgements + +Mashed together and tested on https://apollo.open-resource.org/mission:resources:picoprint based on collaborative teamwork of @andrewsil1 and @thinkyhead. diff --git a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h new file mode 100644 index 0000000000..79ac59cb15 --- /dev/null +++ b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h @@ -0,0 +1,1978 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "FT-2020 v9" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 245 +#define HEATER_1_MAXTEMP 245 +#define HEATER_2_MAXTEMP 245 +#define HEATER_3_MAXTEMP 245 +#define HEATER_4_MAXTEMP 245 +#define BED_MAXTEMP 115 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // FolgerTech i3-2020 + #define DEFAULT_Kp 11.50 + #define DEFAULT_Ki 0.50 + #define DEFAULT_Kd 60.00 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 250.0 + #define DEFAULT_bedKi 18.0 + #define DEFAULT_bedKd 950.0 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 52.2 } // 52.4 is correct for printer as shipped +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 104.4 } // 104.4 with 32 micro steps enabled gives better results + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 250, 250, 2, 17 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1000, 1000, 4, 750 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 400 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 400 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 8.5 +#define DEFAULT_YJERK 8.5 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 4.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +#define Z_SERVO_ANGLES {40,85} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 38 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -7 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -10.75 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 0 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 7500 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 3 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 3 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 3 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 2 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE (X_MAX_POS-X_MIN_POS) +#define Y_BED_SIZE (Y_MAX_POS-Y_MIN_POS) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 6 +#define Y_MIN_POS 3 +#define Z_MIN_POS 0 +#define X_MAX_POS 207 +#define Y_MAX_POS 182 +#define Z_MAX_POS 175 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +//#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. +//#define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 0 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + #define UBL_Z_RAISE_WHEN_OFF_MESH 2.50// When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + #define PROBE_PT_1_X 45 + #define PROBE_PT_1_Y 170 + #define PROBE_PT_2_X 45 + #define PROBE_PT_2_Y 25 + #define PROBE_PT_3_X 180 + #define PROBE_PT_3_Y 25 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (40*60) +#define HOMING_FEEDRATE_Z (55) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +//#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +#define NUM_SERVOS 2 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 500, 500 } + +// Only power servos during movement, otherwise leave off to prevent jitter +#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h new file mode 100644 index 0000000000..1c439efa83 --- /dev/null +++ b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h @@ -0,0 +1,1705 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 2 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 40 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + #define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 2 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.5 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) +#define MAX7219_CLK_PIN 64 // on RAMPS // Configuration of the 3 pins to control the display +#define MAX7219_DIN_PIN 57 // on RAMPS +#define MAX7219_LOAD_PIN 44 // on RAMPS + +//#define MAX7219_CLK_PIN P1_04 // on Re-ARM ENET_TX_EN J12-10 +//#define MAX7219_DIN_PIN P1_00 // on Re-ARM ENET_TXD0 J12-11 +//#define MAX7219_LOAD_PIN P1_01 // on Re-ARM ENET_TXD1 J12-12 + +//#define MAX7219_CLK_PIN P4_29 // for RAMPS E1 on Re-ARM E1_ENABLE_PIN P4_29 +//#define MAX7219_DIN_PIN P2_13 // for RAMPS E1 on Re-ARM E1_DIR_PIN P2_13 +//#define MAX7219_LOAD_PIN P2_08 // for RAMPS E1 on Re-ARM E1_STEP_PIN P2_08 + + #define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 2 // Number of Max7219 units in chain. + #define MAX7219_ROTATE -90 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration.h b/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration.h new file mode 100644 index 0000000000..7f62a258c9 --- /dev/null +++ b/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration.h @@ -0,0 +1,2011 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +//#define TREX3 // Turn this on for T-Rex 3 features like dual filament run out sensors + +#define ROXYs_TRex // Turn this on to get customizations only available on Roxy's T-Rex 2+ + // Marlin controlled heat bed, Max7219 debug LED's, less bright LED light level + // More aggressive PID numbers for hotends (due to double fans) +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "Formbot-3D" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD +//#define MOTHERBOARD BOARD_RUMBA +#define MOTHERBOARD BOARD_FORMBOT +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message + #define CUSTOM_MACHINE_NAME "T-Rex 2+" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 2 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. + +#ifdef ROXYs_TRex + #define HOTEND_OFFSET_X {0.0, 0.00} // (in mm) for each extruder, offset of the hotend on the X axis + #define HOTEND_OFFSET_Y {0.0, 1.25} // (in mm) for each extruder, offset of the hotend on the Y axis +#endif + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 1 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 + +#if(ENABLED(ROXYs_TRex)) + #define TEMP_SENSOR_BED 11 +#else +#define TEMP_SENSOR_BED 0 +#endif + +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 410 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + #if(ENABLED(ROXYs_TRex)) + // Roxy's T-Rex 2+ + #define DEFAULT_Kp 15.17 + #define DEFAULT_Ki 0.88 + #define DEFAULT_Kd 65.24 + #else + // T-Rex 2+ + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + #endif + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + #if(ENABLED(ROXYs_TRex)) + // T-Rex 2+ + #define DEFAULT_bedKp 289.73 + #define DEFAULT_bedKi 51.26 + #define DEFAULT_bedKd 409.43 + #else + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + #endif + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 160, 1600, 93 } +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 800, 93 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +//#define DEFAULT_MAX_FEEDRATE { 250, 150, 5, 25 } +#define DEFAULT_MAX_FEEDRATE { 250, 100, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1500, 500, 400, 4000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ + +//#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +//#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +//#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1500 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +//#define DEFAULT_XJERK 20.0 +//#define DEFAULT_YJERK 10.0 +//#define DEFAULT_ZJERK 0.4 +//#define DEFAULT_EJERK 5.0 + +#define DEFAULT_XJERK 12.0 // More conservitive numbers. +#define DEFAULT_YJERK 8.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -3 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 31 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -1.25 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 0 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 7000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 7 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 7 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +#define Z_AFTER_PROBING 7 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false + +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER false // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR true +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 8 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR 1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 400 +#define Y_BED_SIZE 400 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -42 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS 450 +#define Y_MAX_POS Y_BED_SIZE +#if(ENABLED(tallVersion)) + #define Z_MAX_POS 700 +#else + #define Z_MAX_POS 500 +#endif + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ + +//#define FILAMENT_RUNOUT_SENSOR + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #ifndef NUM_RUNOUT_SENSORS + #define NUM_RUNOUT_SENSORS 1 + #endif + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. +//#define SEGMENT_LEVELED_MOVES +//#define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + #define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #ifdef ROXYs_TRex + #define MESH_INSET 25 // Set Mesh bounds as an inset region of the bed + #else + #define MESH_INSET 0 + #endif + + #define GRID_MAX_POINTS_X 11 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + #define UBL_Z_RAISE_WHEN_OFF_MESH 0.0 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + #define PROBE_PT_1_X 35 + #define PROBE_PT_1_Y 365 + #define PROBE_PT_2_X 35 + #define PROBE_PT_2_Y 35 + #define PROBE_PT_3_X 365 + #define PROBE_PT_3_Y 35 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +#define Z_PROBE_END_SCRIPT "M280 P0 S90" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +//#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 5 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { 50, (Y_MIN_POS + 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration_adv.h b/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration_adv.h new file mode 100644 index 0000000000..1b08edcdb3 --- /dev/null +++ b/Marlin/src/config/examples/Formbot/T-Rex_2+/Configuration_adv.h @@ -0,0 +1,1710 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 10 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 60 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 5 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + #define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +#define FAN_MIN_PWM 64 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + #define CASE_LIGHT_PIN 8 + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #ifdef ROXYs_TRex + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 25 // Set default power-up brightness (0-255, requires PWM pin) + #else + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 255 // Set default power-up brightness (0-255, requires PWM pin) + #endif + #define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS (X_BED_SIZE) // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 0 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS (442-4.0) // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 200 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 600 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 20 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE true // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + #define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + #define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 40 // Babysteps are very small. Increase for faster motion. +//#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. +//#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X 4 + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 4 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 41 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 50 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 30 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 50 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 20 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 4 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 0 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 1 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + #define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.5 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + //#define USER_SCRIPT_AUDIBLE_FEEDBACK + #define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "User cmd 1" + #define USER_GCODE_1 "G28 X \n" + + #define USER_DESC_2 "User cmd 2" + #define USER_GCODE_2 "G28 \nG1 X100 \n" + + #define USER_DESC_3 "User cmd 3" + #define USER_GCODE_3 "M48 \n" + + #define USER_DESC_4 "User cmd 4" + #define USER_GCODE_4 "M114 \n" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +#define ACTION_ON_PAUSE "pause" +#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ + +#ifdef ROXYs_TRex + #define MAX7219_DEBUG +#endif + +#if ENABLED(MAX7219_DEBUG) +/* +#define MAX7219_CLK_PIN 50 // Configuration of the 3 pins to control the display +#define MAX7219_DIN_PIN 51 // on RUMBA (or Formbot) using the ICSP port. +#define MAX7219_LOAD_PIN 52 // This will affect your use of the SD Memory card */ + +#define MAX7219_CLK_PIN 41 // Configuration of the 3 pins to control the display +#define MAX7219_DIN_PIN 13 // 41 is LCD_Kill_Button, 13 is Arduino_LED, 37 is LCD_Beeper +#define MAX7219_LOAD_PIN 37 + + + #define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 2 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 5 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 6 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 7 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Formbot/T-Rex_2+/_Bootscreen.h b/Marlin/src/config/examples/Formbot/T-Rex_2+/_Bootscreen.h new file mode 100644 index 0000000000..226e975e7f --- /dev/null +++ b/Marlin/src/config/examples/Formbot/T-Rex_2+/_Bootscreen.h @@ -0,0 +1,105 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Bitmap for splashscreen + * + * You may use one of the following tools to generate the C++ bitmap array from + * a black and white image: + * + * - http://www.marlinfw.org/tools/u8glib/converter.html + * - http://www.digole.com/tools/PicturetoC_Hex_converter.php + */ +#include + +#define CUSTOM_BOOTSCREEN_TIMEOUT 2500 + +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 +#define CUSTOM_BOOTSCREEN_BMPHEIGHT 64 + +const unsigned char custom_start_bmp[] PROGMEM = { + B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00011111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00011111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11100000,B00111111,B11111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11100000,B00111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11100000,B00111111,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00111111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B11111111,B11111111,B00000000,B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11100000,B00000000,B00000000, + B00000000,B11111111,B11111111,B00000000,B01111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11110000,B00000000,B00000000, + B00000000,B10000011,B11000001,B00000000,B01110000,B00111100,B00000000,B00111000,B00000011,B11000000,B01111000,B00000000,B00000111,B00111000,B00000000,B00000000, + B00000000,B00000011,B11000000,B00000000,B01110000,B00011110,B00000001,B11111110,B00000000,B11000000,B01100000,B00000000,B00001110,B00011100,B00000110,B00000000, + B00000000,B00000011,B11000000,B00000000,B01110000,B00111100,B00000011,B11000111,B00000000,B01100000,B11000000,B00000000,B00001100,B00001100,B00000110,B00000000, + B00000000,B00000011,B11000000,B00000000,B01111110,B01111000,B00000110,B00000001,B10000000,B00110001,B10000000,B00000000,B00000000,B00001100,B00000110,B00000000, + B00000000,B00000011,B11000000,B11111111,B01111111,B11100000,B00000110,B00000001,B11000000,B00011011,B00000000,B00000000,B00000000,B00011100,B00111111,B11000000, + B00000000,B00000011,B11000000,B11111111,B01110000,B11100000,B00001111,B11111111,B11000000,B00001111,B00000000,B00000000,B00000000,B00111000,B00111111,B11000000, + B00000000,B00000011,B11000000,B00000000,B01110000,B01111000,B00001100,B00000000,B00000000,B00001111,B00000000,B00000000,B00000000,B01110000,B00000110,B00000000, + B00000000,B00000011,B11000000,B00000000,B01110000,B00111100,B00000110,B00000000,B00000000,B00011001,B10000000,B00000000,B00000000,B01100000,B00000110,B00000000, + B00000000,B00000011,B11000000,B00000000,B01110000,B00011110,B00000110,B00000000,B11000000,B00110000,B11000000,B00000000,B00000001,B11000000,B00000110,B00000000, + B10000000,B00000011,B11000000,B00000000,B01110000,B00011110,B00000011,B10000001,B10000000,B01100000,B01100000,B00000000,B00000011,B10000000,B00000000,B00000001, + B10000000,B00000011,B11000000,B00000000,B01110000,B00001110,B10000001,B11111111,B10000000,B11000000,B00110000,B00000000,B00001111,B11111100,B00000000,B00000001, + B10000000,B00000011,B11000000,B00000000,B01110000,B00000111,B00000000,B01111100,B00000011,B10000000,B00011100,B00000000,B00011111,B11111100,B00000000,B00000001, + B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111 +}; + diff --git a/Marlin/src/config/examples/Formbot/T-Rex_2+/_Statusscreen.h b/Marlin/src/config/examples/Formbot/T-Rex_2+/_Statusscreen.h new file mode 100644 index 0000000000..487419892d --- /dev/null +++ b/Marlin/src/config/examples/Formbot/T-Rex_2+/_Statusscreen.h @@ -0,0 +1,130 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ +//#include "MarlinConfig.h" + +//============================================ + +#define STATUS_SCREENWIDTH 128 + +#define STATUS_SCREEN_HOTEND_TEXT_X(E) (27 + (E) * 25) + +#define STATUS_SCREEN_BED_TEXT_X 81 + +#define FAN_ANIM_FRAMES 3 +#define STATUS_SCREEN_FAN_TEXT_X 103 +#define STATUS_SCREEN_FAN_TEXT_Y 28 + +//============================================ + +#if HOTENDS < 2 + + #error "Single hotend bitmap not available." + +#else // HOTENDS >= 2 + + #if FAN_ANIM_FRAMES <= 2 + + #error "Under 3 FAN_ANIM_FRAMES not available." + + #elif FAN_ANIM_FRAMES == 3 + + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B00000000,B01111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000000,B00011111, + B00000000,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00100000,B00100111, + B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B11110000,B01111011, + B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B11110000,B01111011, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11111000,B11111101, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B11111000,B11111001, + B00001111,B10000111,B11111100,B00000000,B11111111,B00000000,B00000000,B01111111,B10000000,B00000000,B00001000,B00100000,B10000000,B00000100,B00111111,B11100001, + B00001111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11110011,B11000000,B00000000,B00000100,B00010000,B01000000,B00000100,B00001111,B10000001, + B00001111,B10000111,B11111100,B00000001,B11100111,B10000000,B00000000,B11101101,B11000000,B00000000,B00000100,B00010000,B01000000,B00000100,B00001111,B10000001, + B00001111,B10000111,B11111100,B00000001,B11010111,B10000000,B00000000,B11111101,B11000000,B00000000,B00001000,B00100000,B10000000,B00000100,B00001111,B10000001, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01111011,B10000000,B00000000,B00010000,B01000001,B00000000,B00000100,B00111111,B11100001, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01110111,B10000000,B00000000,B00100000,B10000010,B00000000,B00000100,B11111000,B11111001, + B00000111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11101111,B11000000,B00000000,B00100000,B10000010,B00000000,B00000101,B11111000,B11111101, + B00000011,B10000111,B11111000,B00000001,B11100011,B10000000,B00000000,B11100001,B11000000,B00000000,B00010000,B01000001,B00000000,B00000110,B11110000,B01111011, + B00000001,B10000111,B11100000,B00000001,B11111111,B10000000,B00000000,B11111111,B11000000,B00000000,B00001000,B00100000,B10000000,B00000110,B11110000,B01111011, + B00000000,B10000111,B10000000,B00000000,B01111110,B00000000,B00000000,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00100000,B00100111, + B00000000,B00000110,B00000000,B00000000,B00111100,B00000000,B00000000,B00011110,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11000000,B00011111, + B00000000,B00000000,B00000000,B00000000,B00011000,B00000000,B00000000,B00001100,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11111111,B11111111 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B00000000,B01111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000110,B00011111, + B00000000,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00111110,B00000111, + B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00111110,B00000011, + B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00011110,B00000011, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00011110,B00001101, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00000110,B00111101, + B00001111,B10000111,B11111100,B00000000,B11111111,B00000000,B00000000,B01111111,B10000000,B00000000,B00001000,B00100000,B10000000,B00000100,B00000111,B00111101, + B00001111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11110011,B11000000,B00000000,B00000100,B00010000,B01000000,B00000100,B00001111,B11111111, + B00001111,B10000111,B11111100,B00000001,B11100111,B10000000,B00000000,B11101101,B11000000,B00000000,B00000100,B00010000,B01000000,B00000111,B11111111,B11111111, + B00001111,B10000111,B11111100,B00000001,B11010111,B10000000,B00000000,B11111101,B11000000,B00000000,B00001000,B00100000,B10000000,B00000111,B11111111,B10000001, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01111011,B10000000,B00000000,B00010000,B01000001,B00000000,B00000101,B11100111,B00000001, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01110111,B10000000,B00000000,B00100000,B10000010,B00000000,B00000101,B11000011,B00000001, + B00000111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11101111,B11000000,B00000000,B00100000,B10000010,B00000000,B00000101,B10000011,B11000001, + B00000011,B10000111,B11111000,B00000001,B11100011,B10000000,B00000000,B11100001,B11000000,B00000000,B00010000,B01000001,B00000000,B00000110,B00000011,B11000011, + B00000001,B10000111,B11100000,B00000001,B11111111,B10000000,B00000000,B11111111,B11000000,B00000000,B00001000,B00100000,B10000000,B00000110,B00000011,B11100011, + B00000000,B10000111,B10000000,B00000000,B01111110,B00000000,B00000000,B01111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000011,B11100111, + B00000000,B00000110,B00000000,B00000000,B00111100,B00000000,B00000000,B00111110,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11000011,B00011111, + B00000000,B00000000,B00000000,B00000000,B00011000,B00000000,B00000000,B00001100,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11111111,B11111111 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00000000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B00000000,B01111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000011,B00011111, + B00000000,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000011,B11100111, + B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00000011,B11110011, + B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B10000011,B11100011, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11000011,B11000001, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11100011,B10000001, + B00001111,B10000111,B11111100,B00000000,B11111111,B00000000,B00000000,B01111111,B10000000,B00000000,B00001000,B00100000,B10000000,B00000101,B11110111,B00000001, + B00001111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11110011,B11000000,B00000000,B00000100,B00010000,B01000000,B00000111,B11111111,B10000001, + B00001111,B10000111,B11111100,B00000001,B11100111,B10000000,B00000000,B11101101,B11000000,B00000000,B00000100,B00010000,B01000000,B00000111,B11111111,B11111111, + B00001111,B10000111,B11111100,B00000001,B11010111,B10000000,B00000000,B11111101,B11000000,B00000000,B00001000,B00100000,B10000000,B00000100,B00001111,B11111111, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01111011,B10000000,B00000000,B00010000,B01000001,B00000000,B00000100,B00000111,B01111101, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01110111,B10000000,B00000000,B00100000,B10000010,B00000000,B00000100,B00001110,B00111101, + B00000111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11101111,B11000000,B00000000,B00100000,B10000010,B00000000,B00000100,B00011110,B00011101, + B00000011,B10000111,B11111000,B00000001,B11100011,B10000000,B00000000,B11100001,B11000000,B00000000,B00010000,B01000001,B00000000,B00000110,B00111110,B00001011, + B00000001,B10000111,B11100000,B00000001,B11111111,B10000000,B00000000,B11111111,B11000000,B00000000,B00001000,B00100000,B10000000,B00000110,B01111110,B00000011, + B00000000,B10000111,B10000000,B00000000,B01111110,B00000000,B00000000,B01111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00111110,B00000111, + B00000000,B00000110,B00000000,B00000000,B00111100,B00000000,B00000000,B00111110,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11000110,B00011111, + B00000000,B00000000,B00000000,B00000000,B00011000,B00000000,B00000000,B00001100,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11111111,B11111111 + }; + + #elif FAN_ANIM_FRAMES == 4 + + #error "4 FAN_ANIM_FRAMES not available." + + #endif + +#endif // HOTENDS >= 2 diff --git a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h new file mode 100644 index 0000000000..78a4f5dd49 --- /dev/null +++ b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h @@ -0,0 +1,2028 @@ + +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#define TREX3 // Turn this on to generate a T-Rex 3 firmware image + +// The next few options are for firmware development and probably should not be used by Formbot. +#define ICSP_PORT_SWITCHES // If ICSP_PORT_SWITCHES is defined, those pins become filament runout sensors + // (But the SD Memory card won't work and is turned off!!!) + +#define ROXYs_TRex // Turn this on to get customizations only available on Roxy's T-Rex 2+ + // Marlin controlled heat bed, Max7219 debug LED's, less bright LED light level + // More aggressive PID numbers for hotends (due to double fans) +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "Formbot-3D" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_FORMBOT_TREX3 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "T-Rex 3" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 2 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Pruša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 steppers + //#define E_MUX2_PIN 44 // Needed for 5 to 8 steppers +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 + //#define HOTEND_OFFSET_Z { 0.0, 0.0 } +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking + #define HOTEND_OFFSET_Z { 0.0, 1.3 } // Z-offsets of the two hotends. The first must be 0. +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. + +#ifdef ROXYs_TRex + #define HOTEND_OFFSET_X {0.0, 0.00} // (in mm) for each extruder, offset of the hotend on the X axis + #define HOTEND_OFFSET_Y {0.0, 1.25} // (in mm) for each extruder, offset of the hotend on the Y axis +#endif + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 1 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 + +#if(ENABLED(ROXYs_TRex)) + #define TEMP_SENSOR_BED 11 +#endif + +#if(ENABLED(TREX3)) + #define TEMP_SENSOR_BED 11 +#endif + +#ifndef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 0 +#endif + +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 410 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + #if(ENABLED(ROXYs_TRex)) + // Roxy's T-Rex 2+ + #define DEFAULT_Kp 15.17 + #define DEFAULT_Ki 0.88 + #define DEFAULT_Kd 65.24 + #else + // T-Rex 2+ + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + #endif + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + #if(ENABLED(ROXYs_TRex)) + // T-Rex 2+ + #define DEFAULT_bedKp 289.73 + #define DEFAULT_bedKi 51.26 + #define DEFAULT_bedKd 409.43 + #else + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + #endif + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 160, 1600, 93 } +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 800, 93 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +//#define DEFAULT_MAX_FEEDRATE { 250, 150, 5, 25 } +#define DEFAULT_MAX_FEEDRATE { 250, 100, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1500, 500, 400, 4000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ + +//#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +//#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +//#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1500 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +//#define DEFAULT_XJERK 20.0 +//#define DEFAULT_YJERK 10.0 +//#define DEFAULT_ZJERK 0.4 +//#define DEFAULT_EJERK 5.0 + +#define DEFAULT_XJERK 12.0 // More conservitive numbers. +#define DEFAULT_YJERK 8.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -3 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 31 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -1.25 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 0 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 7000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 7 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 7 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +#define Z_AFTER_PROBING 7 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false + +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER false // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR true +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 8 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR 1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 400 +#define Y_BED_SIZE 400 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -42 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS 450 +#define Y_MAX_POS Y_BED_SIZE +#if(ENABLED(tallVersion)) + #define Z_MAX_POS 700 +#else + #define Z_MAX_POS 500 +#endif + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ + +#ifdef TREX3 + #define FILAMENT_RUNOUT_SENSOR + #define NUM_RUNOUT_SENSORS 2 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. +#else + //#define FILAMENT_RUNOUT_SENSOR +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #ifndef NUM_RUNOUT_SENSORS + #define NUM_RUNOUT_SENSORS 1 + #endif + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. +//#define SEGMENT_LEVELED_MOVES +//#define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + #define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #ifdef ROXYs_TRex + #define MESH_INSET 25 // Set Mesh bounds as an inset region of the bed + #else + #define MESH_INSET 0 + #endif + + #define GRID_MAX_POINTS_X 11 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + #define UBL_Z_RAISE_WHEN_OFF_MESH 0.0 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + #define PROBE_PT_1_X 35 + #define PROBE_PT_1_Y 365 + #define PROBE_PT_2_X 35 + #define PROBE_PT_2_Y 35 + #define PROBE_PT_3_X 365 + #define PROBE_PT_3_Y 35 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +#define Z_PROBE_END_SCRIPT "M280 P0 S90" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +//#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 5 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { 100, (Y_MIN_POS + 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ + +#ifndef ICSP_PORT_SWITCHES // If ICSP_PORT is in use, those pins now are filament runout sensors + #define SDSUPPORT // instead of being used by the SD Memory card socket +#endif + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Servo deactivation +// +// With this option servos are powered only during movement, then turned off to prevent jitter. +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h new file mode 100644 index 0000000000..a801220737 --- /dev/null +++ b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h @@ -0,0 +1,1704 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 10 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 60 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 5 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + #define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +#define FAN_MIN_PWM 64 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) +//#define CASE_LIGHT_PIN 8 // Now set in appropriate pins file + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #ifdef ROXYs_TRex + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 25 // Set default power-up brightness (0-255, requires PWM pin) + #else + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 255 // Set default power-up brightness (0-255, requires PWM pin) + #endif + #define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +// Enable this for dual x-carriage printers. +// A dual x-carriage design has the advantage that the inactive extruder can be parked which +// prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage +// allowing faster printing speeds. Connect your X2 stepper to the first unused E plug. +#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + // Configuration for second X-carriage + // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; + // the second x-carriage always homes to the maximum endstop. + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS (X_BED_SIZE) // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 0 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS (442-4.0) // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + // Mode 3 (DXC_SYMMETRIC_DUPLICATION_MODE) : Symmetric Duplication mode. The firmware will perform similarly to DXC_DUPLICATION_MODE except in a mirror + // image of the first x-carriage. ie. If you are printing a right hand shoe on the 1st extruder, you will + // get a left hand shoe on the 2nd extruder. + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 200 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 600 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 20 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE true // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + #define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + #define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 40 // Babysteps are very small. Increase for faster motion. +//#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. +//#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X 4 + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 7 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 1 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 15 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 15 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 85 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 3 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 1 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 4 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 15 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 60 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 2 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 20 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 0 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 500 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 0 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT (3*60) // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 3 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + #define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + #define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + #define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.5 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + //#define USER_SCRIPT_AUDIBLE_FEEDBACK + #define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "User cmd 1" + #define USER_GCODE_1 "G28 X \n" + + #define USER_DESC_2 "User cmd 2" + #define USER_GCODE_2 "G28 \nG1 X100 \n" + + #define USER_DESC_3 "User cmd 3" + #define USER_GCODE_3 "M48 \n" + + #define USER_DESC_4 "User cmd 4" + #define USER_GCODE_4 "M114 \n" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +#define ACTION_ON_PAUSE "pause" +#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ + +#ifdef ROXYs_TRex + #define MAX7219_DEBUG +#endif + +#if ENABLED(MAX7219_DEBUG) +/* +#define MAX7219_CLK_PIN 50 // Configuration of the 3 pins to control the display +#define MAX7219_DIN_PIN 51 // on RUMBA (or Formbot) using the ICSP port is used +#define MAX7219_LOAD_PIN 52 // This will affect your use of the SD Memory card */ + +#define MAX7219_CLK_PIN 41 // Configuration of the 3 pins to control the display +#define MAX7219_DIN_PIN 13 // 41 is LCD_Kill_Button, 13 is Arduino_LED, 37 is LCD_Beeper +#define MAX7219_LOAD_PIN 37 + + #define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 2 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 5 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 6 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 7 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Formbot/T_Rex_3/_Bootscreen.h b/Marlin/src/config/examples/Formbot/T_Rex_3/_Bootscreen.h new file mode 100644 index 0000000000..89c0f43091 --- /dev/null +++ b/Marlin/src/config/examples/Formbot/T_Rex_3/_Bootscreen.h @@ -0,0 +1,104 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Bitmap for splashscreen + * + * You may use one of the following tools to generate the C++ bitmap array from + * a black and white image: + * + * - http://www.marlinfw.org/tools/u8glib/converter.html + * - http://www.digole.com/tools/PicturetoC_Hex_converter.php + */ +#include + +#define CUSTOM_BOOTSCREEN_TIMEOUT 2500 + +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 +#define CUSTOM_BOOTSCREEN_BMPHEIGHT 64 + +const unsigned char custom_start_bmp[] PROGMEM = { +B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, // 0 +B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, +B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, +B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, // 4 +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, // 8 +B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, // 12 +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00011111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, // 16 +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, // 20 +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, // 24 +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00011111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, // 28 +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, // 32 +B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11100000,B00111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11100000,B00111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11100000,B00111111,B11111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000, // 36 +B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11100000,B00111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11100000,B00111111,B11111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00111111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, // 40 +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, // 44 +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, // 48 +B00000000,B11111111,B11111111,B00000000,B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11100000,B00000000,B00000000, +B00000000,B11111111,B11111111,B00000000,B01111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11110000,B00000000,B00000000, +B00000000,B10000011,B11000001,B00000000,B01110000,B00111100,B00000000,B00111000,B00000011,B11000000,B01111000,B00000000,B00001100,B00011000,B00000000,B00000000, +B00000000,B00000011,B11000000,B00000000,B01110000,B00011110,B00000001,B11111110,B00000000,B11000000,B01100000,B00000000,B00000000,B00001100,B00000000,B00000000, // 52 +B00000000,B00000011,B11000000,B00000000,B01110000,B00111100,B00000011,B11000111,B00000000,B01100000,B11000000,B00000000,B00000000,B00001100,B00000000,B00000000, +B00000000,B00000011,B11000000,B00000000,B01111110,B01111000,B00000110,B00000001,B10000000,B00110001,B10000000,B00000000,B00000000,B00011100,B00000000,B00000000, +B00000000,B00000011,B11000000,B11111111,B01111111,B11100000,B00000110,B00000001,B11000000,B00011011,B00000000,B00000000,B00000011,B11111000,B00000000,B00000000, +B00000000,B00000011,B11000000,B11111111,B01110000,B11100000,B00001111,B11111111,B11000000,B00001111,B00000000,B00000000,B00000011,B11111000,B00000000,B00000000, // 56 +B00000000,B00000011,B11000000,B00000000,B01110000,B01111000,B00001100,B00000000,B00000000,B00001111,B00000000,B00000000,B00000000,B00011100,B00000000,B00000000, +B00000000,B00000011,B11000000,B00000000,B01110000,B00111100,B00000110,B00000000,B00000000,B00011001,B10000000,B00000000,B00000000,B00001100,B00000000,B00000000, +B00000000,B00000011,B11000000,B00000000,B01110000,B00011110,B00000110,B00000000,B11000000,B00110000,B11000000,B00000000,B00000000,B00001100,B00000000,B00000000, +B10000000,B00000011,B11000000,B00000000,B01110000,B00011110,B00000011,B10000001,B10000000,B01100000,B01100000,B00000000,B00001100,B00011000,B00000000,B00000001, // 60 +B10000000,B00000011,B11000000,B00000000,B01110000,B00001110,B10000001,B11111111,B10000000,B11000000,B00110000,B00000000,B00000111,B11110000,B00000000,B00000001, +B10000000,B00000011,B11000000,B00000000,B01110000,B00000111,B00000000,B01111100,B00000011,B10000000,B00011100,B00000000,B00000001,B11100000,B00000000,B00000001, +B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111 +}; diff --git a/Marlin/src/config/examples/Formbot/T_Rex_3/_statusscreen.h b/Marlin/src/config/examples/Formbot/T_Rex_3/_statusscreen.h new file mode 100644 index 0000000000..3575bbbc7d --- /dev/null +++ b/Marlin/src/config/examples/Formbot/T_Rex_3/_statusscreen.h @@ -0,0 +1,130 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Status Screen bitmap + * + * Place this file in the root with your configuration files + * and enable CUSTOM_STATUS_SCREEN_IMAGE in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ +//#include "MarlinConfig.h" + +//============================================ + +#define STATUS_SCREENWIDTH 128 + +#define STATUS_SCREEN_HOTEND_TEXT_X(E) (27 + (E) * 25) + +#define STATUS_SCREEN_BED_TEXT_X 81 + +#define FAN_ANIM_FRAMES 3 +#define STATUS_SCREEN_FAN_TEXT_X 103 +#define STATUS_SCREEN_FAN_TEXT_Y 28 + +//============================================ + +#if HOTENDS < 2 + #if FAN_ANIM_FRAMES <= 2 + #elif FAN_ANIM_FRAMES == 3 + #elif FAN_ANIM_FRAMES == 4 + #endif + +#else // HOTENDS >= 2 + + #if FAN_ANIM_FRAMES <= 2 + + #elif FAN_ANIM_FRAMES == 3 + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B00000000,B01111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000000,B00011111, + B00000000,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00100000,B00100111, + B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B11110000,B01111011, + B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B11110000,B01111011, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11111000,B11111101, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B11111000,B11111001, + B00001111,B10000111,B11111100,B00000000,B11111111,B00000000,B00000000,B01111111,B10000000,B00000000,B00001000,B00100000,B10000000,B00000100,B00111111,B11100001, + B00001111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11110011,B11000000,B00000000,B00000100,B00010000,B01000000,B00000100,B00001111,B10000001, + B00001111,B10000111,B11111100,B00000001,B11100111,B10000000,B00000000,B11101101,B11000000,B00000000,B00000100,B00010000,B01000000,B00000100,B00001111,B10000001, + B00001111,B10000111,B11111100,B00000001,B11010111,B10000000,B00000000,B11111101,B11000000,B00000000,B00001000,B00100000,B10000000,B00000100,B00001111,B10000001, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01111011,B10000000,B00000000,B00010000,B01000001,B00000000,B00000100,B00111111,B11100001, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01110111,B10000000,B00000000,B00100000,B10000010,B00000000,B00000100,B11111000,B11111001, + B00000111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11101111,B11000000,B00000000,B00100000,B10000010,B00000000,B00000101,B11111000,B11111101, + B00000011,B10000111,B11111000,B00000001,B11100011,B10000000,B00000000,B11100001,B11000000,B00000000,B00010000,B01000001,B00000000,B00000110,B11110000,B01111011, + B00000001,B10000111,B11100000,B00000001,B11111111,B10000000,B00000000,B11111111,B11000000,B00000000,B00001000,B00100000,B10000000,B00000110,B11110000,B01111011, + B00000000,B10000111,B10000000,B00000000,B01111110,B00000000,B00000000,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00100000,B00100111, + B00000000,B00000110,B00000000,B00000000,B00111100,B00000000,B00000000,B00011110,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11000000,B00011111, + B00000000,B00000000,B00000000,B00000000,B00011000,B00000000,B00000000,B00001100,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11111111,B11111111 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + + B00000000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B00000000,B01111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000110,B00011111, + B00000000,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00111110,B00000111, + B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00111110,B00000011, + B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00011110,B00000011, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00011110,B00001101, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00000110,B00111101, + B00001111,B10000111,B11111100,B00000000,B11111111,B00000000,B00000000,B01111111,B10000000,B00000000,B00001000,B00100000,B10000000,B00000100,B00000111,B00111101, + B00001111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11110011,B11000000,B00000000,B00000100,B00010000,B01000000,B00000100,B00001111,B11111111, + B00001111,B10000111,B11111100,B00000001,B11100111,B10000000,B00000000,B11101101,B11000000,B00000000,B00000100,B00010000,B01000000,B00000111,B11111111,B11111111, + B00001111,B10000111,B11111100,B00000001,B11010111,B10000000,B00000000,B11111101,B11000000,B00000000,B00001000,B00100000,B10000000,B00000111,B11111111,B10000001, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01111011,B10000000,B00000000,B00010000,B01000001,B00000000,B00000101,B11100111,B00000001, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01110111,B10000000,B00000000,B00100000,B10000010,B00000000,B00000101,B11000011,B00000001, + B00000111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11101111,B11000000,B00000000,B00100000,B10000010,B00000000,B00000101,B10000011,B11000001, + B00000011,B10000111,B11111000,B00000001,B11100011,B10000000,B00000000,B11100001,B11000000,B00000000,B00010000,B01000001,B00000000,B00000110,B00000011,B11000011, + B00000001,B10000111,B11100000,B00000001,B11111111,B10000000,B00000000,B11111111,B11000000,B00000000,B00001000,B00100000,B10000000,B00000110,B00000011,B11100011, + B00000000,B10000111,B10000000,B00000000,B01111110,B00000000,B00000000,B01111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000011,B11100111, + B00000000,B00000110,B00000000,B00000000,B00111100,B00000000,B00000000,B00111110,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11000011,B00011111, + B00000000,B00000000,B00000000,B00000000,B00011000,B00000000,B00000000,B00001100,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11111111,B11111111 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + + B00000000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B00000000,B01111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11000011,B00011111, + B00000000,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000011,B11100111, + B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B00000011,B11110011, + B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110,B10000011,B11100011, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11000011,B11000001, + B00001111,B10000111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000101,B11100011,B10000001, + B00001111,B10000111,B11111100,B00000000,B11111111,B00000000,B00000000,B01111111,B10000000,B00000000,B00001000,B00100000,B10000000,B00000101,B11110111,B00000001, + B00001111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11110011,B11000000,B00000000,B00000100,B00010000,B01000000,B00000111,B11111111,B10000001, + B00001111,B10000111,B11111100,B00000001,B11100111,B10000000,B00000000,B11101101,B11000000,B00000000,B00000100,B00010000,B01000000,B00000111,B11111111,B11111111, + B00001111,B10000111,B11111100,B00000001,B11010111,B10000000,B00000000,B11111101,B11000000,B00000000,B00001000,B00100000,B10000000,B00000100,B00001111,B11111111, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01111011,B10000000,B00000000,B00010000,B01000001,B00000000,B00000100,B00000111,B01111101, + B00001111,B10000000,B00000000,B00000000,B11110111,B00000000,B00000000,B01110111,B10000000,B00000000,B00100000,B10000010,B00000000,B00000100,B00001110,B00111101, + B00000111,B10000111,B11111100,B00000001,B11110111,B10000000,B00000000,B11101111,B11000000,B00000000,B00100000,B10000010,B00000000,B00000100,B00011110,B00011101, + B00000011,B10000111,B11111000,B00000001,B11100011,B10000000,B00000000,B11100001,B11000000,B00000000,B00010000,B01000001,B00000000,B00000110,B00111110,B00001011, + B00000001,B10000111,B11100000,B00000001,B11111111,B10000000,B00000000,B11111111,B11000000,B00000000,B00001000,B00100000,B10000000,B00000110,B01111110,B00000011, + B00000000,B10000111,B10000000,B00000000,B01111110,B00000000,B00000000,B01111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00111110,B00000111, + B00000000,B00000110,B00000000,B00000000,B00111100,B00000000,B00000000,B00111110,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11000110,B00011111, + B00000000,B00000000,B00000000,B00000000,B00011000,B00000000,B00000000,B00001100,B00000000,B00000000,B11111111,B11111111,B11000000,B00000111,B11111111,B11111111 + }; + + #elif FAN_ANIM_FRAMES == 4 +/* +*/ + #endif + +#endif // HOTENDS >= 2 diff --git a/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h b/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h new file mode 100644 index 0000000000..dc84de1f58 --- /dev/null +++ b/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h @@ -0,0 +1,1996 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_GT2560_REV_A +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Geeetech MK8 Extruder + #define DEFAULT_Kp 12.33 + #define DEFAULT_Ki 0.51 + #define DEFAULT_Kd 74.50 + + // CTC MK8 Extruder + //#define DEFAULT_Kp 19.86 + //#define DEFAULT_Ki 1.0 + //#define DEFAULT_Kd 98.83 + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //12v (120 watt?) MK2a PCB Heatbed into 4mm borosilicate (Geeetech Prusa i3 Pro, Pro/B/C/X) + #define DEFAULT_bedKp 234.88 + #define DEFAULT_bedKi 42.79 + #define DEFAULT_bedKd 322.28 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 5000, 5000, 50, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 2000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR true +#define INVERT_E2_DIR true +#define INVERT_E3_DIR true +#define INVERT_E4_DIR true + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +/** + * Customize common displays for GT2560 + */ +#if ENABLED(ULTIMAKERCONTROLLER) || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) || ENABLED(G3D_PANEL) || ENABLED(MKS_MINI_12864) + #define SDSUPPORT // Force SD Card support on for these displays +#else + #define LCD_WIDTH_OVERRIDE 20 // Default is 22. For this Geeetech use 20. +#endif + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h b/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h new file mode 100644 index 0000000000..4c647827a0 --- /dev/null +++ b/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(R. de Weerd, I3 Pro X)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_GT2560_REV_A_PLUS +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "RdW i3 Pro X" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 300 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 2560, 93 } // MXL, Z M8=1.25, MK8 + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 4000, 4000, 40, 4000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 2000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 5.0 +#define DEFAULT_YJERK 5.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 4.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 1 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {10,90} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + #define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 8 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 6 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 6 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 8 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 205 +#define Y_BED_SIZE 230 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 170 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 4 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 215 +#define PREHEAT_2_TEMP_BED 105 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 +#define LCD_FEEDBACK_FREQUENCY_HZ 1000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +#define NUM_SERVOS 1 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/README.md b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/README.md new file mode 100644 index 0000000000..ffb274caca --- /dev/null +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/README.md @@ -0,0 +1,39 @@ +These are example configurations for the low-cost [Acrylic Prusa I3 pro B 3D Printer DIY kit](http://www.geeetech.com/acrylic-geeetech-prusa-i3-pro-b-3d-printer-diy-kit-p-917.html) and the [3DTouch auto bed leveling sensor](http://www.geeetech.com/geeetech-3dtouch-auto-bed-leveling-sensor-for-3d-printer-p-1010.html) based on: + +- `../GT2560/` +- [Marlin 1.1.4 With 3DTouch / BLTouch for i3 Pro B](https://www.geeetech.com/forum/viewtopic.php?t=19846) + +The main characteristics of these configurations are: + +- The defined motherboard is `BOARD_GT2560_REV_A_PLUS`. +- Travel limits are adjusted to the printer bed size and position. +- An example `SKEW_CORRECTION` for a particular printer is enabled. See comments below about how to adjust it to a particular printer. +- Using the LCD controller for bed leveling is enabled. + - `PROBE_MANUALLY` is enabled, which *provides a means to do "Auto" Bed Leveling without a probe*. + - The `LEVEL_BED_CORNERS` option for manual bed adjustment is enabled. + - Bilinear bed leveling is enabled, the boundaries for probing are adjusted to the glass size, and extrapolation is enabled. +- `PRINTCOUNTER` is enabled, in order to track statistical data. +- `INDIVIDUAL_AXIS_HOMING_MENU` is enabled, which adds individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +- The speaker is enabled for the UI feedback. +- `bltouch` variant: + - `USE_ZMAX_PLUG` is enabled. See comments about connections below. + - Heaters and fans are turned off when probing. + - Multiple probing is set to 3. + +# First-time configuration + +## Skew factor + +The skew factor must be adjusted for each printer: + +- First, uncomment `#define XY_SKEW_FACTOR 0.0`, compile and upload the firmware. +- Then, print [YACS (Yet Another Calibration Square)](https://www.thingiverse.com/thing:2563185). Hint, scale it considering a margin for brim (if used). The larger, the better to make error measurements. +- Measure the printed part according to the comments in the example configuration file, and set `XY_DIAG_AC`, `XY_DIAG_BD` and `Y_SIDE_AD`. +- Last, comment `#define XY_SKEW_FACTOR 0.0` again, compile and upload. + +## 3DTouch auto leveling sensor + +- Print a suitable mount to attach the sensor to the printer. The example configuration file is adjusted to http://www.geeetech.com/wiki/images/6/61/3DTouch_auto_leveling_sensor-1.zip +- Unlike suggested in [geeetech.com/wiki/index.php/3DTouch_Auto_Leveling_Sensor](https://www.geeetech.com/wiki/index.php/3DTouch_Auto_Leveling_Sensor), the existing end stop switch is expected to be kept connected to Z_MIN. So, the sensor is to be connected to Z_MAX, according to Marlin's default settings. Furthermore, GT2560-A+ provides a connector for the servo next to thermistor connectors (see [GT2560](https://www.geeetech.com/wiki/images/thumb/4/45/GT2560_wiring.jpg/700px-GT2560_wiring.jpg) and [GT2560-A+](http://i.imgur.com/E0t34VU.png)). +- Be careful to respect the polarity of the sensor when connecting it to the GT2560-A+. Unlike end stops, reversing the connection will prevent the sensor from working properly. +- [Test](http://www.geeetech.com/wiki/index.php/3DTouch_Auto_Leveling_Sensor#Testing) and [calibrate](https://www.geeetech.com/wiki/index.php/3DTouch_Auto_Leveling_Sensor#Calibration) the sensor. \ No newline at end of file diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h new file mode 100644 index 0000000000..5129afb22f --- /dev/null +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h @@ -0,0 +1,1988 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(1138-4EB, Geeetech Prusa i3 Pro B BLTouch config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_GT2560_REV_A_PLUS +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "Pi3PB-BL" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 125 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Geeetech MK8 Extruder + #define DEFAULT_Kp 12.33 + #define DEFAULT_Ki 0.51 + #define DEFAULT_Kd 74.50 + + // CTC MK8 Extruder + //#define DEFAULT_Kp 19.86 + //#define DEFAULT_Ki 1.0 + //#define DEFAULT_Kd 98.83 + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //12v (120 watt?) MK2a PCB Heatbed into 4mm borosilicate (Geeetech Prusa i3 Pro, Pro/B/C/X) + #define DEFAULT_bedKp 234.88 + #define DEFAULT_bedKi 42.79 + #define DEFAULT_bedKd 322.28 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 5000, 5000, 75, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 2000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +#define Z_MIN_PROBE_ENDSTOP +#define Z_MIN_PROBE_PIN 32 + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +#define PROBING_FANS_OFF // Turn fans off when probing +#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 4 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -44 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -1.4 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST (20*60) + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +#define MULTIPLE_PROBING 3 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR true +#define INVERT_E2_DIR true +#define INVERT_E3_DIR true +#define INVERT_E4_DIR true + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -12 +#define Y_MIN_POS -8 +#define Z_MIN_POS 0 +#define X_MAX_POS (-X_MIN_POS+X_BED_SIZE) +#define Y_MAX_POS (-Y_MIN_POS+Y_BED_SIZE) +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 4 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION 10 + //#define RIGHT_PROBE_BED_POSITION (X_MAX_POS - X_PROBE_OFFSET_FROM_EXTRUDER - 14) + //#define FRONT_PROBE_BED_POSITION 15 + //#define BACK_PROBE_BED_POSITION (Y_MAX_POS + Y_PROBE_OFFSET_FROM_EXTRUDER - 25) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + #define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 281.8196945719 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + //#define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + #define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 170 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 170 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h new file mode 100644 index 0000000000..8d978fdfa0 --- /dev/null +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h @@ -0,0 +1,1987 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(1138-4EB, Geeetech Prusa i3 Pro B config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_GT2560_REV_A_PLUS +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "Pi3PB" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 125 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Geeetech MK8 Extruder + #define DEFAULT_Kp 12.33 + #define DEFAULT_Ki 0.51 + #define DEFAULT_Kd 74.50 + + // CTC MK8 Extruder + //#define DEFAULT_Kp 19.86 + //#define DEFAULT_Ki 1.0 + //#define DEFAULT_Kd 98.83 + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //12v (120 watt?) MK2a PCB Heatbed into 4mm borosilicate (Geeetech Prusa i3 Pro, Pro/B/C/X) + #define DEFAULT_bedKp 234.88 + #define DEFAULT_bedKi 42.79 + #define DEFAULT_bedKd 322.28 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 5000, 5000, 75, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 2000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST (20*60) + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR true +#define INVERT_E2_DIR true +#define INVERT_E3_DIR true +#define INVERT_E4_DIR true + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -12 +#define Y_MIN_POS -8 +#define Z_MIN_POS 0 +#define X_MAX_POS (-X_MIN_POS+X_BED_SIZE) +#define Y_MAX_POS (-Y_MIN_POS+Y_BED_SIZE) +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 4 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION 10 + //#define RIGHT_PROBE_BED_POSITION (X_MAX_POS - X_PROBE_OFFSET_FROM_EXTRUDER - 14) + //#define FRONT_PROBE_BED_POSITION 15 + //#define BACK_PROBE_BED_POSITION (Y_MAX_POS + Y_PROBE_OFFSET_FROM_EXTRUDER - 25) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + #define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 281.8196945719 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + //#define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + #define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 170 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 170 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h new file mode 100644 index 0000000000..819f46d9c6 --- /dev/null +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Phr3d13, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_GT2560_REV_A +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Pro C" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 2 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +#define HOTEND_OFFSET_X {0.0, 32.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 1 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 2560, 95, 95 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 180 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 65 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 235 +#define PREHEAT_2_TEMP_BED 95 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h new file mode 100644 index 0000000000..8db16bd2f3 --- /dev/null +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h new file mode 100644 index 0000000000..90f0a1fa87 --- /dev/null +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Phr3d13, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_GT2560_REV_A_PLUS +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Pro W" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 32.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 2560, 95 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 180 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 65 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 235 +#define PREHEAT_2_TEMP_BED 95 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h new file mode 100644 index 0000000000..8db16bd2f3 --- /dev/null +++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h new file mode 100644 index 0000000000..fc411be392 --- /dev/null +++ b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h @@ -0,0 +1,1976 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(tjclement, Infitary M508)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_13_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Infitary M508" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 125 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + #define DEFAULT_Kp 213.2 + #define DEFAULT_Ki 1.54 + #define DEFAULT_Kd 765 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 92.6 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 205 +#define Y_BED_SIZE 205 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 185 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 50 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 245 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h b/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h new file mode 100644 index 0000000000..261ab2b3c7 --- /dev/null +++ b/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 1 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +//#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +//#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/JGAurora/A5/Configuration.h b/Marlin/src/config/examples/JGAurora/A5/Configuration.h new file mode 100644 index 0000000000..e7dc56cf75 --- /dev/null +++ b/Marlin/src/config/examples/JGAurora/A5/Configuration.h @@ -0,0 +1,1983 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * JGAurora A5 configuration + * Authors: Telli Mantelli, Kris Waclawski, Michael Gilardi & Samuel Pinches + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Telli Mantelli, Kris Waclawski, Samuel Pinches & Michael Gilardi, 21 Jan 2018)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MKS_GEN_L +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "JGAurora A5" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 15 // manual calibration of thermistor in JGAurora A5 hotend +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 // measured to be satisfactorily accurate on center of bed within +/- 1 degC. +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 265 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 120 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + // JGAurora A5 (tuned at 210C) + #define DEFAULT_Kp 35.3//22.2 + #define DEFAULT_Ki 4.35//1.08 + #define DEFAULT_Kd 71.57//114 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + + // JGAurora A5 (tuned at 70C) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 1000 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 800, 100 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 15, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1000, 500, 100, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 800 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 800 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 8.0 +#define DEFAULT_YJERK 3.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 305 +#define Y_BED_SIZE 305 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -5 // thanks DaHai. +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 320 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION // Enable G26 mesh validation + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 5 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION 15 + //#define RIGHT_PROBE_BED_POSITION 170 + //#define FRONT_PROBE_BED_POSITION 20 + //#define BACK_PROBE_BED_POSITION 170 + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 5 // As suggested by DaHai, https://www.youtube.com/watch?v=CBlADPgQqL0 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + #define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (80*60) +#define HOMING_FEEDRATE_Z (12*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 205 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h b/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h new file mode 100644 index 0000000000..5203f496ac --- /dev/null +++ b/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 90 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 10, 10, 6 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {80*60, 80*60, 12*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 5 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 6 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + #define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/JGAurora/A5/README.md b/Marlin/src/config/examples/JGAurora/A5/README.md new file mode 100644 index 0000000000..861f276750 --- /dev/null +++ b/Marlin/src/config/examples/JGAurora/A5/README.md @@ -0,0 +1,39 @@ +# Configuration for JGAurora A5 printer + +## Firmware Installation Instructions + +To install custom firmware: + +- Download and install arduino IDE software from https://www.arduino.cc/en/Main/Software +- Plug in A5 to your computer via USB cable +- In arduino IDE, under the Tools menu, set: + – **Board** to "Arduino/Genuino Mega or Mega 2560" + – ***Processor*** to "Atmega 2560 (Mega 2560)" + – **Port** to your 3D printer’s serial port. To figure out the correct serial port unplug the printer and observe the "Port" menu. Connect the printer's USB cable, re-open the "Port" menu and see if a new ports has appeared. This new port is likely to be your printer. + - If you can’t find the right port or if your machine isn't detected, you may need to install a driver for the CH340 serial-to-USB interface chip in the printer. + - [macOS CH340 Serial Driver](http://sampin.ch/ch340-driver-mac) + - [Windows CH340 Serial Driver](https://sparks.gogo.co.nz/ch340.html) +- Install the u8glib library using the library manager in the menu "Sketch -> Include Library -> Manage Libraries." +- IMPORTANT: Unplug the 8-pin LCD panel header connector on your printer. The LCD should turn off completely. This is found underneath the LCD, and can be accessed from underneath the printer without removing any screws. Remember where it goes so you can put it back after flashing. +- Close all other programs (Cura, Repetier Host, JGCreat, etc.) that could connect to the serial port. +- Open the "Marlin.ino" file in Arduino IDE and wait for the new project window to appear. +- Select "Upload" from the "Sketch" menu or click the Upload button. +- Wait for the firmware to finish uploading and verifying. This may take a couple of minutes. +- Plug the LCD connector back in. +- In the Arduino IDE, select "Tools -> Serial monitor" to open up a simple console. In the popup menus, select "Newline" and a Baud Rate of "250000." +- In the input box, enter the following G-code commands: + - `M502` (press return) to reset settings (in RAM) to your configured defaults. + - `M500` (press return) to write settings and initialize the EEPROM. + +## Graphical Display + +The control panel included with the JGAurora interfaces only indirectly with Marlin, and this imposes some limitations. But you can use a RepRap Discount Full Graphic Smart Controller with the JGAurora A5 by applying the following additional settings in `Configuration.h`: + +```cpp +#define ENCODER_PULSES_PER_STEP 5 +#define ENCODER_STEPS_PER_MENU_ITEM 1 +#define REVERSE_ENCODER_DIRECTION +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +``` + +You may also be able to change `BEEPER_PIN` to use the piezo on the LCD controller instead of the one on the board. diff --git a/Marlin/src/config/examples/MakerParts/Configuration.h b/Marlin/src/config/examples/MakerParts/Configuration.h new file mode 100644 index 0000000000..371abf5e33 --- /dev/null +++ b/Marlin/src/config/examples/MakerParts/Configuration.h @@ -0,0 +1,1992 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//===== Pololus calibration ================================================= +//=========================================================================== + +// Voltage reference on potentiometer on Green Pololus in millivolts +#define Vref_mV 800UL + +// Rsc value used on PCB of the Green Pololus +#define Rsc_mOhms 100UL + +// Estimated maximum acceleration for X and Y axis +#define MAX_XYAXIS_ACCEL (3UL * (Vref_mV) * 100UL / (Rsc_mOhms)) + +// Notes: +// If we could use 1.65A as motor current, then 3000 mm/s^2 as acceleration +// if perfectly achievable. Using 1A as motor current, 2400 mm/s^2 acceleration +// is perfectly possible without losing any steps +// On A4988 drivers, maximum current can be calculated as I_TripMax= Vref/(8*Rs) +// + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "ejtagle" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT -1 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 0 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_DUO_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "MakerParts 3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +#define MACHINE_UUID "4250d842-4943-4601-acca-95ef77b8a4f1" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + #define ENDSTOPPULLUP_XMAX + #define ENDSTOPPULLUP_YMAX + #define ENDSTOPPULLUP_ZMAX + #define ENDSTOPPULLUP_XMIN + #define ENDSTOPPULLUP_YMIN + #define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 97 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 2, 30 } // For 300mm/s printing + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { MAX_XYAXIS_ACCEL, MAX_XYAXIS_ACCEL, 10, 200 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION MAX_XYAXIS_ACCEL // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 100 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION MAX_XYAXIS_ACCEL // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 2.0 +#define DEFAULT_YJERK 2.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 8.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/MakerParts/Configuration_adv.h b/Marlin/src/config/examples/MakerParts/Configuration_adv.h new file mode 100644 index 0000000000..928ce844eb --- /dev/null +++ b/Marlin/src/config/examples/MakerParts/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 180 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +#define LCD_TIMEOUT_TO_STATUS 30000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + #define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE true // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM true // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES true // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + #define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + #define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + #define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + #define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + #define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 32 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +#define RX_BUFFER_SIZE 4096 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + #define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + #define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + #define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/MakerParts/_Bootscreen.h b/Marlin/src/config/examples/MakerParts/_Bootscreen.h new file mode 100644 index 0000000000..5ddf5c7ff4 --- /dev/null +++ b/Marlin/src/config/examples/MakerParts/_Bootscreen.h @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00011111,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B11111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00011111,B11111111,B11111111,B11111111,B11000000,B00001111,B10000000,B01111100,B00000111,B11100000,B00111111,B00001111,B11011111,B11111111,B01111111,B11110000, + B00111111,B11111111,B11111111,B11111111,B11100000,B00001111,B11000000,B11111100,B00000111,B11100000,B00111111,B00011111,B10011111,B11111111,B01111111,B11111100, + B01111111,B10111111,B11111111,B11101111,B11110000,B00001111,B11000000,B11111100,B00001111,B11110000,B00111111,B00011111,B00011111,B11111111,B01111111,B11111110, + B01111110,B00001111,B11111111,B10000011,B11110000,B00001111,B11100001,B11111100,B00001111,B11110000,B00111111,B00111110,B00011111,B11111111,B01111111,B11111110, + B01111100,B00000111,B11111111,B00000001,B11110000,B00001111,B11100001,B11111100,B00011111,B11111000,B00111111,B01111110,B00011111,B10000000,B01111100,B00111110, + B01111100,B00000011,B11111110,B00000001,B11110000,B00001111,B11110011,B11111100,B00011111,B11111000,B00111111,B11111100,B00011111,B10000000,B01111100,B00011110, + B01111100,B00000001,B11111100,B00000001,B11110000,B00001111,B11110011,B11111100,B00011111,B11111000,B00111111,B11111000,B00011111,B11111100,B01111100,B00111110, + B01111100,B00000000,B11111000,B00000001,B11110000,B00001111,B11111111,B11111100,B00111110,B01111100,B00111111,B11111000,B00011111,B11111100,B01111111,B11111110, + B01111100,B00000000,B01110000,B00000001,B11110000,B00001111,B11111111,B11111100,B00111110,B01111100,B00111111,B11111100,B00011111,B11111100,B01111111,B11111110, + B01111100,B00000000,B00100000,B00000001,B11110000,B00001111,B11111111,B11111100,B00111110,B01111100,B00111111,B11111100,B00011111,B11111100,B01111111,B11111100, + B01111100,B00000000,B00000000,B00000001,B11110000,B00001111,B10111111,B01111100,B01111111,B11111110,B00111111,B11111110,B00011111,B11111100,B01111111,B11111000, + B01111100,B00000000,B00000000,B00000001,B11110000,B00001111,B10111111,B01111100,B01111111,B11111110,B00111111,B11111110,B00011111,B10000000,B01111111,B11111000, + B01111100,B00000000,B00000000,B00000001,B11110000,B00001111,B10011110,B01111100,B01111111,B11111110,B00111111,B00111111,B00011111,B10000000,B01111100,B11111000, + B01111100,B00000110,B00000011,B00000001,B11110000,B00001111,B10011110,B01111100,B11111111,B11111111,B00111111,B00111111,B00011111,B11111111,B01111100,B11111100, + B01111100,B00000111,B00000111,B00000001,B11110000,B00001111,B10001100,B01111100,B11111111,B11111111,B00111111,B00011111,B10011111,B11111111,B01111100,B11111100, + B01111100,B00000111,B10001111,B00000001,B11110000,B00001111,B10000000,B01111100,B11111000,B00011111,B00111111,B00011111,B10011111,B11111111,B01111100,B01111110, + B01111100,B00000111,B11011111,B00000001,B11110000,B00001111,B10000000,B01111101,B11111000,B00011111,B10111111,B00001111,B11011111,B11111111,B01111100,B00111111, + B01111100,B00000111,B11111111,B00000001,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B01111100,B00000111,B11111111,B00000001,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B01111100,B00000111,B11111111,B00000001,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B01111100,B00000111,B11111111,B00000001,B11110000,B00001111,B11111110,B00000011,B11110000,B00011111,B11111000,B00111111,B11111111,B10000111,B11111000,B00000000, + B01111100,B00000111,B11111111,B00000001,B11110000,B00001111,B11111111,B00000011,B11110000,B00011111,B11111110,B00111111,B11111111,B10011111,B11111110,B00000000, + B01111100,B00000111,B11111111,B00000001,B11100000,B00001111,B11111111,B10000111,B11111000,B00011111,B11111111,B00111111,B11111111,B10011111,B11111110,B00000000, + B00111100,B00001111,B11111111,B10000001,B11100000,B00001111,B11111111,B11000111,B11111000,B00011111,B11111111,B10111111,B11111111,B10111111,B11111110,B00000000, + B00111100,B00001111,B11111111,B10000001,B11100000,B00001111,B11111111,B11000111,B11111000,B00011111,B11111111,B10111111,B11111111,B10111111,B00111100,B00000000, + B00011110,B00001111,B11111111,B10000011,B11000000,B00001111,B10000111,B11001111,B11111100,B00011111,B00001111,B11000001,B11110000,B00111110,B00000000,B00000000, + B00011110,B00001111,B11111111,B10000011,B11000000,B00001111,B10000011,B11001111,B11111100,B00011111,B00000111,B11000001,B11110000,B00111111,B11000000,B00000000, + B00001111,B00001111,B11111111,B10000111,B10000000,B00001111,B10000111,B11001111,B00111100,B00011111,B00001111,B10000001,B11110000,B00111111,B11111000,B00000000, + B00001111,B00001111,B11111111,B10000111,B10000000,B00001111,B11111111,B11011111,B00111110,B00011111,B11111111,B10000001,B11110000,B00011111,B11111110,B00000000, + B00000111,B10001111,B11111111,B10001111,B00000000,B00001111,B11111111,B10011111,B00111110,B00011111,B11111111,B10000001,B11110000,B00011111,B11111110,B00000000, + B00000111,B11001111,B11111111,B10011111,B00000000,B00001111,B11111111,B00011111,B00111110,B00011111,B11111111,B00000001,B11110000,B00000111,B11111111,B00000000, + B00000011,B11101111,B11111111,B10111110,B00000000,B00001111,B11111100,B00111111,B11111111,B00011111,B11111110,B00000001,B11110000,B00000000,B01111111,B00000000, + B00000001,B11101111,B11111111,B10111100,B00000000,B00001111,B10000000,B00111111,B11111111,B00011111,B00111110,B00000001,B11110000,B00011000,B00011111,B00000000, + B00000000,B11101111,B11111111,B10111000,B00000000,B00001111,B10000000,B00111111,B11111111,B00011111,B00111111,B00000001,B11110000,B00011110,B00111111,B01111100, + B00000000,B01101111,B11111111,B10110000,B00000000,B00001111,B10000000,B01111111,B11111111,B10011111,B00111111,B00000001,B11110000,B00111111,B11111111,B01111100, + B00000000,B00101111,B11111111,B10100000,B00000000,B00001111,B10000000,B01111111,B11111111,B10011111,B00011111,B10000001,B11110000,B01111111,B11111110,B01111100, + B00000000,B00001111,B11111111,B10000000,B00000000,B00001111,B10000000,B01111100,B00001111,B10011111,B00011111,B10000001,B11110000,B00111111,B11111110,B01111100, + B00000000,B00001111,B11111111,B10000000,B00000000,B00001111,B10000000,B11111100,B00001111,B11011111,B00001111,B11000001,B11110000,B00001111,B11111000,B01111100, + B00000000,B00000111,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000011,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 +}; diff --git a/Marlin/src/config/examples/Malyan/M150/Configuration.h b/Marlin/src/config/examples/Malyan/M150/Configuration.h new file mode 100644 index 0000000000..5e3a3f44b8 --- /dev/null +++ b/Marlin/src/config/examples/Malyan/M150/Configuration.h @@ -0,0 +1,1974 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Maylan M150 Configuration + * Non-Automatic Bed Level config by default + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Gunther)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI_MALYAN +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Malyan M150" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 + +// For Malyan M150, some discussions around changing the TEMP_SENSOR_BED from 1 to 3 on a french discussion board. +// The reasons are inconclusive so I leave at 1 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Malyan M150 example + #define DEFAULT_Kp 29 + #define DEFAULT_Ki 2 + #define DEFAULT_Kd 97 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). + +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + * + * These defaults for the Malyan M150 are low values intended to + * give a baseline. With mods it is possible to raise jerk, etc. + * + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ + // Standard M150 17T MXL on X and Y +#define DEFAULT_AXIS_STEPS_PER_UNIT { 3200/34.544, 3200/34.544, 1600, 103.00 } + +// Other common M150 values: +// 16T MXL on X and Y +// #define DEFAULT_AXIS_STEPS_PER_UNIT {3200/32.512, 3200/32.512, 1600, 103.00} +// 16T GT2 on X and Y +// #define DEFAULT_AXIS_STEPS_PER_UNIT {100, 100, 1600, 103.00} + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 700, 700, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 700 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 700 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 8.0 +#define DEFAULT_YJERK 8.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ + +// Set for HoolyHoo's probe mount +// http://www.thingiverse.com/thing:1960419 +// Note: HoolyHoo mount is X=35, Y=-50. +//#define X_PROBE_OFFSET_FROM_EXTRUDER 35 // X offset: -left +right [of the nozzle] +//#define Y_PROBE_OFFSET_FROM_EXTRUDER -50 // Y offset: -front +behind [the nozzle] +//#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +//#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +//#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +//#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +//#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +//#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +//#define Z_PROBE_OFFSET_RANGE_MIN -20 +//#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 180 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ + +// - LINEAR - Not Available on Malyan M150 due to compile memory issues +// - Use MESH_BED_LEVELING, AUTO_BED_LEVELING_3POINT or AUTO_BED_LEVELING_BILINEAR + +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION 50 + //#define RIGHT_PROBE_BED_POSITION 150 + //#define FRONT_PROBE_BED_POSITION 50 + //#define BACK_PROBE_BED_POSITION 150 + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + #define PROBE_PT_1_X 50 + #define PROBE_PT_1_Y 150 + #define PROBE_PT_2_X 50 + #define PROBE_PT_2_Y 50 + #define PROBE_PT_3_X 150 + #define PROBE_PT_3_Y 50 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 205 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 128 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 230 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h b/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h new file mode 100644 index 0000000000..82231d679d --- /dev/null +++ b/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 120 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +//#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 300 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Malyan/M150/README.md b/Marlin/src/config/examples/Malyan/M150/README.md new file mode 100644 index 0000000000..44c308de22 --- /dev/null +++ b/Marlin/src/config/examples/Malyan/M150/README.md @@ -0,0 +1,55 @@ +# Configuration for Malyan M150 HobbyKing printer + +Config without automatic bed level sensor, or in other words, "as stock" + +## To install: + +1. Install [Arduino](https://www.arduino.cc/en/Main/Software) + +1. Install U8glib + * `Sketch` -> `Include Library` -> `Manage Libraries...` + * Search for and install `U8glib` by oliver + +1. Install Sanguino + * `File` -> `Preferences` + * Add + `https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json` + to `Additional Boards Manager URLs` + +1. Modify Sanguino `boards.txt` + * Close Arduino + * Locate Arduino15 folder + - `C:\Users\\AppData\Local\Arduino15` for Windows + - `~/.arduino15` for Linux + + * Locate `boards.txt` in `packages/Sanguino/hardware/avr/1.0.2` + (version number may change) + * Add the following to the end of `boards.txt` + (note that it is the same as sanguino.menu.cpu.atmega1284p but with + a different name and upload speed) + + ## Malyan M150 W/ ATmega1284P 16MHz + sanguino.menu.cpu.malyan_m150=Malyan M150 + sanguino.menu.cpu.malyan_m150.upload.maximum_size=130048 + sanguino.menu.cpu.malyan_m150.upload.maximum_data_size=16384 + sanguino.menu.cpu.malyan_m150.upload.speed=57600 + sanguino.menu.cpu.malyan_m150.bootloader.file=optiboot/optiboot_atmega1284p.hex + sanguino.menu.cpu.malyan_m150.build.mcu=atmega1284p + sanguino.menu.cpu.malyan_m150.build.f_cpu=16000000L + +1. Configure Marlin + * Copy `_Bootscreen.h`, `Configuration.h`, and `Configuration_adv.h` + from `Marlin/config/examples/Malyan/M150` to `Marlin` + (overwrite files) + * Read `Configuration.h` and make any necessary changes + +1. Flash Marlin + * Turn on printer while pressing scroll wheel button + * Plug printer in to computer with USB cable + * Open `Marlin/Marlin.ino` with Arduino + * Configure Arduino + - `Tools` -> `Board` -> `Sanguino` + - `Tools` -> `Processor` -> `Malyan M150` + - `Tools` -> `Port` -> Select your port + + * `Sketch` -> `Upload` or click arrow in top right corner diff --git a/Marlin/src/config/examples/Malyan/M150/_Bootscreen.h b/Marlin/src/config/examples/Malyan/M150/_Bootscreen.h new file mode 100644 index 0000000000..678a7a106f --- /dev/null +++ b/Marlin/src/config/examples/Malyan/M150/_Bootscreen.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_TIMEOUT 1000 +#define CUSTOM_BOOTSCREEN_BMPWIDTH 128 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B00000000,B00000000,B00000011,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00011111,B11000000,B00000000,B00001111,B11100000,B01111100,B00000011,B11100000,B01111000,B00011100,B00000111,B10000001,B11100000,B11110000,B00111110,B00001110, + B01111111,B11100000,B00000000,B00111111,B11110000,B01111110,B00000111,B11100000,B11111100,B00011100,B00000011,B10000001,B11000001,B11111000,B00111111,B00001110, + B01111111,B11111000,B00000000,B01111111,B11110000,B01111110,B00000111,B11100000,B11111100,B00011100,B00000011,B11000011,B11000001,B11111000,B00111111,B00001110, + B01111011,B11111110,B00000001,B11111110,B11110000,B01111111,B00001111,B11100001,B11111110,B00011100,B00000001,B11000011,B10000011,B11111100,B00111111,B10001110, + B01111100,B11111111,B10000111,B11111001,B11110000,B01110111,B00001110,B11100001,B11111110,B00011100,B00000001,B11100111,B10000011,B11111100,B00111011,B10001110, + B01111111,B01111111,B11001111,B11110111,B11110000,B01110111,B10011110,B11100001,B11001110,B00011100,B00000000,B11100111,B00000011,B10011100,B00111011,B11001110, + B01111111,B10011111,B11111111,B11001111,B11110000,B01110011,B10011100,B11100011,B11001111,B00011100,B00000000,B11111111,B00000111,B10011110,B00111001,B11001110, + B01111111,B11100111,B11111111,B00111111,B11110000,B01110011,B11111100,B11100011,B10000111,B00011100,B00000000,B01111110,B00000111,B00001110,B00111001,B11101110, + B01111111,B11111011,B11111110,B11111111,B11110000,B01110001,B11111000,B11100011,B10000111,B00011100,B00000000,B01111110,B00001111,B00001111,B00111000,B11101110, + B01111111,B11111100,B11111001,B11111111,B11110000,B01110001,B11111000,B11100111,B11111111,B10011100,B00000000,B00111100,B00001111,B11111111,B00111000,B11111110, + B01111111,B11111111,B00100111,B11111111,B11110000,B01110000,B11110000,B11100111,B11111111,B10011100,B00000000,B00111100,B00001111,B11111111,B00111000,B01111110, + B01111111,B11111111,B11011111,B11111111,B11110000,B01110000,B11110000,B11101111,B11111111,B11011100,B00000000,B00111100,B00011111,B11111111,B10111000,B01111110, + B01111111,B11011111,B11111111,B11011111,B11110000,B01110000,B01100000,B11101111,B00000011,B11011111,B11111000,B00111100,B00011110,B00000111,B10111000,B00111110, + B01111111,B11000111,B11111111,B00011111,B11110000,B01110000,B01100000,B11101110,B00000001,B11011111,B11111000,B00111100,B00011100,B00000011,B10111000,B00111110, + B01111111,B11000011,B11111110,B00011111,B11110000,B01110000,B00000000,B11101110,B00000001,B11011111,B11111000,B00111100,B00011100,B00000011,B10111000,B00011110, + B01111111,B11000011,B11111110,B00011111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B01111111,B11000011,B11011110,B00011111,B11110000,B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111110, + B01111111,B11000011,B11011110,B00011111,B11110000,B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111110, + B01111111,B11000011,B11011110,B00011111,B11110000,B01111100,B00111111,B11111010,B11111011,B11111111,B11111111,B11111111,B11111101,B01111010,B10111111,B11111110, + B01111111,B11000011,B11011110,B00011111,B11110000,B01111101,B10011111,B11111011,B11111111,B11111111,B11111111,B11111111,B11111111,B01111110,B11110111,B11111110, + B01111111,B11000011,B11011110,B00011111,B11110000,B01111101,B10010011,B00011010,B10001010,B00011000,B11100011,B10001100,B01000101,B00011010,B10100010,B11011110, + B00111111,B11000011,B11011110,B00001111,B11110000,B01111100,B00101101,B11001010,B11001010,B11010110,B11101001,B00100100,B11001101,B01101010,B10110110,B10111110, + B00011111,B10000011,B11011110,B00000111,B11100000,B01111101,B10100011,B01101010,B10011010,B11010110,B11101001,B00100110,B01100101,B01101010,B10110110,B00111110, + B00000110,B00000011,B11011110,B00000001,B10000000,B01111101,B10010001,B00001010,B10001010,B11011000,B11100011,B10001100,B01000101,B00011010,B10110011,B01111110, + B00000000,B00000011,B11011110,B00000000,B00000000,B01111111,B11111111,B11111111,B11111111,B11111110,B11101111,B11111111,B11111111,B11111111,B11111111,B01111110, + B00000000,B00000011,B11011110,B00000000,B00000000,B01111111,B11111111,B11111111,B11111111,B11110001,B11101111,B11111111,B11111111,B11111111,B11111110,B11111110, + B00000000,B00000011,B11011110,B00000000,B00000000,B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111110, + B00000000,B00000011,B11011110,B00000000,B00000000,B01111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111110, + B00000000,B00000011,B11011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000001,B11011100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B01010000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, +}; diff --git a/Marlin/src/config/examples/Malyan/M200/Configuration.h b/Marlin/src/config/examples/Malyan/M200/Configuration.h new file mode 100644 index 0000000000..d97387b4ff --- /dev/null +++ b/Marlin/src/config/examples/Malyan/M200/Configuration.h @@ -0,0 +1,1971 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(xC0000005, Malyan M200 build)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 500000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 11 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 11 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 250 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 100 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 26.15 + #define DEFAULT_Ki 2.74 + #define DEFAULT_Kd 62.35 + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 231.09 + #define DEFAULT_bedKi 45.21 + #define DEFAULT_bedKd 295.34 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 93, 93, 1097.5, 97 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X true +#define DISABLE_Y true +#define DISABLE_Z true +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h b/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h new file mode 100644 index 0000000000..e352661347 --- /dev/null +++ b/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 50 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +//#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Micromake/C1/README.md b/Marlin/src/config/examples/Micromake/C1/README.md new file mode 100644 index 0000000000..0111f6f00a --- /dev/null +++ b/Marlin/src/config/examples/Micromake/C1/README.md @@ -0,0 +1,15 @@ +# Micromake C1 + +### In the folder "basic" +Configuration files for Micromake C1 without mods + - English LCD 2X16 Characters + - Motors 16 STEPS + - No heated bed + - No probe, etc. + - Like a standard C1 as shipped by Micromake. + +### In the folder "enhanced" +Configuration files for Micromake C1 with… + - 128 STEPS configured with jumper on the motherboard (all open for 128 Steps). + - Capacitive Probe (Adjust offsets at your convenience) + - French language with no accents for Japanese LCD. diff --git a/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h b/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h new file mode 100644 index 0000000000..b7930bc1e1 --- /dev/null +++ b/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h @@ -0,0 +1,1976 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(MetalSearch, Micromake C1 factory settings)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MAKEBOARD_MINI +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Micromake C1" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// choose your micro step per step configuration ( 16 factory settings ) +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 100, 150 } // 16 steps per unit for Micromake C1 - Factory Settings - ( MS1 : closed ; MS2 : closed on MAKEBOARD Mini) +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 200, 200, 200, 300 } // 32 steps per unit for Micromake C1 - Custom Settings - ( MS1 : closed ; MS2 : open on MAKEBOARD Mini) +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 400, 400, 400, 600 } // 64 steps per unit for Micromake C1 - Custom Settings - ( MS1 : open ; MS2 : closed on MAKEBOARD Mini) +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 800, 800, 800, 1200 } // 128 steps per unit for Micromake C1 - Custom Settings - ( MS1 : open ; MS2 : open on MAKEBOARD Mini) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 30 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ + #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 3000, 4000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 240 +#define Y_BED_SIZE 240 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 260 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h new file mode 100644 index 0000000000..ef6dbdcdd4 --- /dev/null +++ b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h @@ -0,0 +1,1976 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(MetalSearch, Micromake C1 enhanced)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MAKEBOARD_MINI +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Micromake C1" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// choose your micro step per step configuration ( 16 factory settings ) +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 100, 150 } // 16 steps per unit for Micromake C1 - Factory Settings - ( MS1 : closed ; MS2 : closed on MAKEBOARD Mini) +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 200, 200, 200, 300 } // 32 steps per unit for Micromake C1 - Custom Settings - ( MS1 : closed ; MS2 : open on MAKEBOARD Mini) +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 400, 400, 400, 600 } // 64 steps per unit for Micromake C1 - Custom Settings - ( MS1 : open ; MS2 : closed on MAKEBOARD Mini) +#define DEFAULT_AXIS_STEPS_PER_UNIT { 800, 800, 800, 1200 } // 128 steps per unit for Micromake C1 - Custom Settings - ( MS1 : open ; MS2 : open on MAKEBOARD Mini) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ + #define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 30 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ + #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 3000, 4000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 240 +#define Y_BED_SIZE 240 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 260 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 +#define LCD_FEEDBACK_FREQUENCY_HZ 1000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h new file mode 100644 index 0000000000..111ebceebf --- /dev/null +++ b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Mks/Sbase/000-README_RepRap_Discount_Full_Graphic_Smart_Controller.txt b/Marlin/src/config/examples/Mks/Sbase/000-README_RepRap_Discount_Full_Graphic_Smart_Controller.txt new file mode 100644 index 0000000000..1ec5e7fd7a --- /dev/null +++ b/Marlin/src/config/examples/Mks/Sbase/000-README_RepRap_Discount_Full_Graphic_Smart_Controller.txt @@ -0,0 +1,38 @@ +The MKS products (all?) have the EXP1 & EXP2 LCD connectors rotated 180 degrees from the ones on the RepRap LCD controllers. + +In order to attach the RepRap Discount Full Graphic Smart Controller you'll need to do something like one of the following for both EXP1 & EXP2: + a. On one end only, shave the keying plug off the cables and plug the cables in backwards. + b. On one end only, carefully pry the housings off the board, rotate them 180 degrees and press them back onto the pins. + c. Make custom cables where one connector is rotated 180 degrees. + + MKS: 1 2 3 4 5 6 7 8 9 10 + RepRap: 10 9 8 7 6 5 4 3 2 1 + + +///////////////////////////////////////////////////////////////////// + +3 DEC 2017 + +The current Marlin 2.0.x firmware cannot properly access some of the pins on the EXP2 connector. In order to use the RepRap Discount Full Graphic Smart Controller you'll need a custom cable that gets three of the signals from a different connector. In that cable move the pin/wire that: + + used to go to P0.8 to J8-3 + " " " " P0.7 to J8-2 + " " " " P0.5 to J8-4 + +If pins different than the J8 ones above are used then the spi_pins.h file will need to be modified. + +An octopus cable something like the Adafruit 1199 will simply the construction of the custom cable. Just plug the Adafruit 1199 into one of the cables that came with the LCD and the individual pins into J8 and EXP2 as needed. + +Adafruit 10-pin IDC Socket Rainbow Breakout Cable [1199] + https://www.adafruit.com/product/1199 + + +///////////////////////////////////////////////////////////////////// + +27 APR 2018 + +If you also want a functional SD_DETECT_PIN then you'll need to also move the following pin: + + used to go to P0.27 to J8-5 + +if you decide to use a different pin then the pins_MKS_SBASE.h file will need to be modified. diff --git a/Marlin/src/config/examples/Mks/Sbase/Configuration.h b/Marlin/src/config/examples/Mks/Sbase/Configuration.h new file mode 100644 index 0000000000..8ebbfaed52 --- /dev/null +++ b/Marlin/src/config/examples/Mks/Sbase/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT -1 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 0 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MKS_SBASE +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. +#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 200, 200, 800, 280 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 32 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 5 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 213 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +//#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops curtail movement above maximum coordinate bounds +//#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +//#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h b/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h new file mode 100644 index 0000000000..4da0dd6fb2 --- /dev/null +++ b/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h @@ -0,0 +1,1705 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 50 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 6 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 40 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 110 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 4 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 100 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro +#define DIGIPOT_I2C + +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) // Default to settings in pins_XXXX.h files + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 5 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.2, 1.2, 1.2, 1.2, 1.2 } // MKS SBASE: 5 + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + + // VIKI2 and miniVIKI require DOGLCD_SCK and DOGLCD_MOSI to be defined. + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define DOGLCD_SCK SCK_PIN + #define DOGLCD_MOSI MOSI_PIN + #endif + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h b/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h new file mode 100644 index 0000000000..086cebfca0 --- /dev/null +++ b/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h @@ -0,0 +1,2021 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(indazoo, Huxley v1)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_SANGUINOLOLU_12 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Huxley" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 // Sanguinololu v1.3 with 4.7kOhm pullup +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +// +// Standard NEMA 17 with T2 belt and 20 tooth pulley +// +#define NEMA17_FULL_STEPS 200.0 +#define XY_MICROSTEPS 16.0 +#define E_MICROSTEPS 16.0 +#define Z_MICROSTEPS 16.0 + +/* RepRapPro belts +http://forums.reprap.org/read.php?1,391198 +White polyurethane belt(T2.5), 14 - tooth printed pulley : 91.4286 step per mm (Original Huxley, Legacy Mendel) +Black rubber belt(MXL), 17 - tooth printed pulley : 92.635 step per mm (Huxley, Mendel Mono and Tri since 1 / 4 / 2013) +Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley, Mendel Mono and Tri since 1 / 1 / 2014) +*/ +#define XY_PULLEY_PITCH 2.5 //RepRapPro Huxley has T2.5 belts +#define XY_PULLEY_TEETH 14.0 //RepRapPro Huxley has 14 teeth pulleys + +// +// Standard NEMA 17 with fancy 5mm lead screws +// +#define Z_RODS_PITCH 0.8 + +#define XY_MOTOR_STEPS (NEMA17_FULL_STEPS * XY_MICROSTEPS) +#define Z_MOTOR_STEPS (NEMA17_FULL_STEPS * Z_MICROSTEPS) +#define E_MOTOR_STEPS (NEMA17_FULL_STEPS * E_MICROSTEPS) + +// +// MK7 Direct Drive +// +#define E_MOTOR_GEAR_TEETH 11.0 //Num of teeth of gear on extruder motor +#define E_ROD_GEAR_TEETH 53.0 //Num of teeth of gear driving the extruder rod +#define E_ROD_DIAM 5.4 // ca value. M6 rod drives the filament. Manual calibration needed. +#define E_ROD_CIRC (M_PI * E_ROD_DIAM) +#define E_STEPS (E_MOTOR_STEPS / (E_MOTOR_GEAR_TEETH/E_ROD_GEAR_TEETH) / E_ROD_CIRC) + +// Get steps/mm from selected results above +#define XY_STEPS (XY_MOTOR_STEPS / (XY_PULLEY_PITCH * XY_PULLEY_TEETH)) +#define Z_STEPS (Z_MOTOR_STEPS / Z_RODS_PITCH) + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { XY_STEPS, XY_STEPS, Z_STEPS, E_STEPS } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_Z_FEEDRATE 3.3 // older Huxley has problem with speeds > 3.3 mm/s on z axis +#define DEFAULT_MAX_FEEDRATE { 200, 200, DEFAULT_MAX_Z_FEEDRATE, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1000, 1000, 50, 1000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +// http://reprap.org/wiki/Configuring_Marlin_Bed_Dimensions +// http://marlinfw.org/docs/configuration/configuration.html#movement-bounds +#define X_BED_SIZE 140 +#define Y_BED_SIZE 140 +// Huxley with 110x110 PEI board. +//#define X_BED_SIZE 108 +//#define Y_BED_SIZE 108 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -9 +#define Y_MIN_POS -5 +// Huxley with 110x110 PEI board. +//#define X_MIN_POS -25 +//#define Y_MIN_POS -21 +#define Z_MIN_POS 0 + +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 80 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (DEFAULT_MAX_Z_FEEDRATE*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE DEFAULT_MAX_Z_FEEDRATE // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h b/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h new file mode 100644 index 0000000000..24761129f7 --- /dev/null +++ b/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "RepRapWorld.com" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MEGATRONICS_3 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 78.7402*2, 78.7402*2, 5120.00, 760*1*1.5 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +#define REPRAPWORLD_KEYPAD +#define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/RigidBot/Configuration.h b/Marlin/src/config/examples/RigidBot/Configuration.h new file mode 100644 index 0000000000..3286b99083 --- /dev/null +++ b/Marlin/src/config/examples/RigidBot/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, RigidBot)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +// for Rigidbot version 1 : #define MOTHERBOARD BOARD_RIGIDBOARD +// for Rigidbot Version 2 : #define MOTHERBOARD BOARD_RIGIDBOARD_V2 + +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RIGIDBOARD_V2 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 // Single extruder. Set to 2 for dual extruders + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 // DGlass3D = 5; RigidBot = 1; 3DSv6 = 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +//#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Rigidbot hotend + #define DEFAULT_Kp 16.17 + #define DEFAULT_Ki 0.85 + #define DEFAULT_Kd 76.55 + + // Base DGlass3D/E3Dv6 hotend + //#define DEFAULT_Kp 10 + //#define DEFAULT_Ki 0.85 + //#define DEFAULT_Kd 245 + + // E3D w/ rigidbot cartridge + //#define DEFAULT_Kp 16.30 + //#define DEFAULT_Ki 0.95 + //#define DEFAULT_Kd 69.69 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //RigidBot, from pid autotune + #define DEFAULT_bedKp 355 + #define DEFAULT_bedKi 66.5 + #define DEFAULT_bedKd 480 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ + // default steps per unit for RigidBot with standard hardware +#define DEFAULT_AXIS_STEPS_PER_UNIT { 44.3090, 22.1545, 1600, 53.5 } +// default steps for 16-tooth pulleys { 100.06, 50.06, 1600, 76 } // HPX2-MAX E=504, RigidBot E=53.5, Peter Stoneham's=76 + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 800, 800, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 600 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 8.0 +#define DEFAULT_YJERK 8.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR true +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 254 // RigidBot regular is 254mm, RigitBot Big is 406mm +#define Y_BED_SIZE 248 // RigidBot regular is 248mm, RigitBot Big is 304mm + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 254 // RigidBot regular and Big are 254mm + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (15*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +// RigidBoard: To rewire this for a RigidBot see http://rigidtalk.com/wiki/index.php?title=LCD_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/RigidBot/Configuration_adv.h b/Marlin/src/config/examples/RigidBot/Configuration_adv.h new file mode 100644 index 0000000000..03532f37a1 --- /dev/null +++ b/Marlin/src/config/examples/RigidBot/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + #define CONTROLLER_FAN_PIN 4 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +//#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +//#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +//#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 8 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/SCARA/Configuration.h b/Marlin/src/config/examples/SCARA/Configuration.h new file mode 100644 index 0000000000..04b2cecf03 --- /dev/null +++ b/Marlin/src/config/examples/SCARA/Configuration.h @@ -0,0 +1,1985 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== + +/** + * MORGAN_SCARA was developed by QHARLEY in South Africa in 2012-2013. + * Implemented and slightly reworked by JCERNY in June, 2014. + * + * MAKERARM_SCARA is in development, included as an alternate example. + * Other SCARA models may be added, or SCARA may be unified in the future. + */ + +// Specify the specific SCARA model +#define MORGAN_SCARA +//#define MAKERARM_SCARA + +#if ENABLED(MORGAN_SCARA) || ENABLED(MAKERARM_SCARA) + + //#define DEBUG_SCARA_KINEMATICS + #define SCARA_FEEDRATE_SCALING // Convert XY feedrate from mm/s to degrees/s on the fly + + // If movement is choppy try lowering this value + #define SCARA_SEGMENTS_PER_SECOND 200 + + // Length of inner and outer support arms. Measure arm lengths precisely. + #define SCARA_LINKAGE_1 150 //mm + #define SCARA_LINKAGE_2 150 //mm + + // SCARA tower offset (position of Tower relative to bed zero position) + // This needs to be reasonably accurate as it defines the printbed position in the SCARA space. + #define SCARA_OFFSET_X 100 //mm + #define SCARA_OFFSET_Y -56 //mm + + // Radius around the center where the arm cannot reach + #define MIDDLE_DEAD_ZONE_R 0 //mm + + #define THETA_HOMING_OFFSET 0 //calculatated from Calibration Guide and command M360 / M114 see picture in http://reprap.harleystudio.co.za/?page_id=1073 + #define PSI_HOMING_OFFSET 0 //calculatated from Calibration Guide and command M364 / M114 see picture in http://reprap.harleystudio.co.za/?page_id=1073 + +#endif + +//=========================================================================== +//==================== END ==== SCARA Printer ==== END ====================== +//=========================================================================== + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 3 // (seconds) +#define TEMP_HYSTERESIS 2 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 20 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Merlin Hotend: From Autotune + #define DEFAULT_Kp 24.5 + #define DEFAULT_Ki 1.72 + #define DEFAULT_Kd 87.73 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //12v Heatbed Mk3 12V in parallel + //from pidautotune + #define DEFAULT_bedKp 630.14 + #define DEFAULT_bedKi 121.71 + #define DEFAULT_bedKd 815.64 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +//#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + #define ENDSTOPPULLUP_XMAX + #define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX // open pin, inverted + //#define ENDSTOPPULLUP_XMIN // open pin, inverted + //#define ENDSTOPPULLUP_YMIN // open pin, inverted + #define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 103.69, 106.65, 200/1.25, 1000 } // default steps per unit for SCARA + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 30, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 300, 300, 20, 1000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 400 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 2000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 400 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 5.0 +#define DEFAULT_YJERK 5.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 3.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 +#define Y_HOME_DIR 1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS MANUAL_Z_HOME_POS +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 225 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +#define MANUAL_X_HOME_POS -22 +#define MANUAL_Y_HOME_POS -52 +#define MANUAL_Z_HOME_POS 0.1 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (40*60) +#define HOMING_FEEDRATE_Z (10*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/SCARA/Configuration_adv.h b/Marlin/src/config/examples/SCARA/Configuration_adv.h new file mode 100644 index 0000000000..dc61216864 --- /dev/null +++ b/Marlin/src/config/examples/SCARA/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 3000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 180 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 3 +#define Y_HOME_BUMP_MM 3 +#define Z_HOME_BUMP_MM 3 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 240 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 10*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +//#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 35 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/STM32F10/Configuration.h b/Marlin/src/config/examples/STM32F10/Configuration.h new file mode 100644 index 0000000000..e44dd07f69 --- /dev/null +++ b/Marlin/src/config/examples/STM32F10/Configuration.h @@ -0,0 +1,1974 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "Victor Perez" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION "STM32F103RET6 board" // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_STM32F1R +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CTC i3 Pro B" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#warning temp_sensor set to 998/999 (fake) +#define TEMP_SENSOR_0 999 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 998 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 60 +#define DUMMY_THERMISTOR_999_VALUE 205 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 180 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#warning "disabled temperature protection" +//#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +//#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105.0 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1400, 1400, 100, 80000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1400 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 5000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 13.0 +#define DEFAULT_YJERK 13.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 180 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +//#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 220 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/STM32F4/Configuration.h b/Marlin/src/config/examples/STM32F4/Configuration.h new file mode 100644 index 0000000000..1f6dede411 --- /dev/null +++ b/Marlin/src/config/examples/STM32F4/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT -1 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +////#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_STM32F4 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Sanguinololu/Configuration.h b/Marlin/src/config/examples/Sanguinololu/Configuration.h new file mode 100644 index 0000000000..c8ad75ed92 --- /dev/null +++ b/Marlin/src/config/examples/Sanguinololu/Configuration.h @@ -0,0 +1,2003 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(thinkyhead, Sanguinololu)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_SANGUINOLOLU_12 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Sanguinololu" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +// +// Standard NEMA 17 with T2 belt and 20 tooth pulley +// +#define NEMA17_FULL_STEPS 200.0 +#define XY_MICROSTEPS 16.0 +#define E_MICROSTEPS 16.0 +#define Z_MICROSTEPS 16.0 + +#define XY_PULLEY_PITCH 2.0 +#define XY_PULLEY_TEETH 20.0 + +// +// Standard NEMA 17 with fancy 2mm lead screws +// +#define Z_RODS_PITCH 0.5 + +#define XY_MOTOR_STEPS (NEMA17_FULL_STEPS * XY_MICROSTEPS) +#define Z_MOTOR_STEPS (NEMA17_FULL_STEPS * Z_MICROSTEPS) +#define E_MOTOR_STEPS (NEMA17_FULL_STEPS * E_MICROSTEPS) + +// +// MK7 Direct Drive +// +#define MK7_GEAR_DIAM 10.56 +#define MK7_GEAR_CIRC (M_PI * MK7_GEAR_DIAM) +#define E_STEPS (E_MOTOR_STEPS / MK7_GEAR_CIRC) + +// Get steps/mm from selected results above +#define XY_STEPS (XY_MOTOR_STEPS / (XY_PULLEY_PITCH * XY_PULLEY_TEETH)) +#define Z_STEPS (Z_MOTOR_STEPS / Z_RODS_PITCH) + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { XY_STEPS, XY_STEPS, Z_STEPS, E_STEPS } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 8, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 170 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (6*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 11 + #define RGB_LED_G_PIN 10 + #define RGB_LED_B_PIN 17 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h b/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h new file mode 100644 index 0000000000..5b48aebf14 --- /dev/null +++ b/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/TheBorg/Configuration.h b/Marlin/src/config/examples/TheBorg/Configuration.h new file mode 100644 index 0000000000..98216cc61e --- /dev/null +++ b/Marlin/src/config/examples/TheBorg/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Spawn32, The_Borg)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT -1 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 5 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_THE_BORG +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 18.21 + #define DEFAULT_Ki 1.42 + #define DEFAULT_Kd 58.34 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 554.16 + #define DEFAULT_bedKi 64.07 + #define DEFAULT_bedKd 1198.25 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 200, 200, 800, 280 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 32 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 5 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -1.3 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 5 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 1 +#define Y_ENABLE_ON 1 +#define Z_ENABLE_ON 1 +#define E_ENABLE_ON 1 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 213 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/TheBorg/Configuration_adv.h b/Marlin/src/config/examples/TheBorg/Configuration_adv.h new file mode 100644 index 0000000000..186615ab56 --- /dev/null +++ b/Marlin/src/config/examples/TheBorg/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 50 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 6 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 40 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 100 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +//#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/TinyBoy2/Configuration.h b/Marlin/src/config/examples/TinyBoy2/Configuration.h new file mode 100644 index 0000000000..3abe23165d --- /dev/null +++ b/Marlin/src/config/examples/TinyBoy2/Configuration.h @@ -0,0 +1,2028 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +/** + * Sample configuration file for TinyBoy2 L10/L16 + * + * Compile from Arduino or using make: + * + * ARDUINO_INSTALL_DIR=/usr/share/java/Arduino-1.6.13/ \ + * HARDWARE_MOTHERBOARD=66 \ + * PATH=/usr/avr/bin/:$PATH make + * + * Please choose your hardware options for the TinyBoy2: + */ + +#define TB2_L10 +//#define TB2_L16 +#define TB2_HEATBED_MOD + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(StefanB, TinyBoy2)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#if ENABLED(TB2_L10) + #define CUSTOM_MACHINE_NAME "TinyBoy2 L10" +#elif ENABLED(TB2_L16) + #define CUSTOM_MACHINE_NAME "TinyBoy2 L16" +#else + #error "Please select TB2_L10 or TB2_L16" +#endif + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#if ENABLED(TB2_HEATBED_MOD) + // K8200 Heatbed 1206/100k/3950K spare part + #define TEMP_SENSOR_BED 7 +#else + #define TEMP_SENSOR_BED 0 +#endif +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 250 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 100 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + // TinyBoy2 Extruder - calculated with PID Autotune and tested + // "M303 E0 C8 S200" + //#define DEFAULT_Kp 25.63 + //#define DEFAULT_Ki 2.66 + //#define DEFAULT_Kd 61.73 + + // TinyBoy2 Extruder - same, but with fan @ 25% duty + #define DEFAULT_Kp 26.15 + #define DEFAULT_Ki 2.71 + #define DEFAULT_Kd 63.02 +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. + + // TinyBoy2 heatbed - calculated with PID Autotune and tested + // "M303 E-1 C8 S75" + //#define DEFAULT_bedKp 421.80 + //#define DEFAULT_bedKi 82.51 + //#define DEFAULT_bedKd 539.06 + + // TinyBoy2 heatbed - same, but with fan @ 25% duty + // "M303 E-1 C8 S75" + #define DEFAULT_bedKp 267.54 + #define DEFAULT_bedKi 52.34 + #define DEFAULT_bedKd 341.92 + +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +// TB2 has X endstop on max, see also INVERT_X_DIR and X_HOME_DIR +//#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 6400, 88.16 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 7, 35 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 34 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 15 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +// Tinyboy2: 100mm are marketed, actual length between endstop and end of rail is 98mm +#define X_BED_SIZE 98 +#define Y_BED_SIZE 98 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#if ENABLED(TB2_L10) + #define Z_MAX_POS 98 +#else + #define Z_MAX_POS 158 +#endif + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (40*60) +#define HOMING_FEEDRATE_Z (3*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 90 // TB2: ABS default 110, 90 is the maximum temp at 12V supply +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h b/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h new file mode 100644 index 0000000000..b6368c8703 --- /dev/null +++ b/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 64 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Tronxy/X1/Configuration.h b/Marlin/src/config/examples/Tronxy/X1/Configuration.h new file mode 100644 index 0000000000..9bcd7b6f1a --- /dev/null +++ b/Marlin/src/config/examples/Tronxy/X1/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Claus Naeveke, 0.1)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Tronxy X1" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 11 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 260 +#define HEATER_1_MAXTEMP 260 +#define HEATER_2_MAXTEMP 260 +#define HEATER_3_MAXTEMP 260 +#define HEATER_4_MAXTEMP 260 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Tronxy X1 + #define DEFAULT_Kp 16.20 + #define DEFAULT_Ki 1.11 + #define DEFAULT_Kd 59.06 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 1600, 90 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 50 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 400, 400, 40, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 20.0 +#define DEFAULT_YJERK 20.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 150 +#define Y_BED_SIZE 150 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS -10 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 150 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Tronxy/X3A/Configuration.h b/Marlin/src/config/examples/Tronxy/X3A/Configuration.h new file mode 100644 index 0000000000..a66ccb69bb --- /dev/null +++ b/Marlin/src/config/examples/Tronxy/X3A/Configuration.h @@ -0,0 +1,1976 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Schullebernd, Tronxy X3A)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI //63 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Tronxy X3A" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 6 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 501 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 130 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 210 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 400, 90 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 4, 50 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1000, 1000, 1500, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 15.0 +#define DEFAULT_YJERK 15.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -32 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -0.5 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 50 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 6000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 5 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 220 + +// Tronxy X3A specific offsets +#define TRONXY_X_BED_OFFSET -17 +#define TRONXY_Y_BED_OFFSET -25 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS TRONXY_X_BED_OFFSET +#define Y_MIN_POS TRONXY_Y_BED_OFFSET +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE - (2 * TRONXY_X_BED_OFFSET) +#define Y_MAX_POS Y_BED_SIZE - (TRONXY_Y_BED_OFFSET + 5) +#define Z_MAX_POS 316 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +#define MANUAL_X_HOME_POS TRONXY_X_BED_OFFSET // The X3A has a standard X offset (17mm) between the left endstop and bed left bed edge +#define MANUAL_Y_HOME_POS TRONXY_Y_BED_OFFSET // The X3A has a standard Y offset (25mm) between the y endstop and the front bet edge +#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (100*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +//#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 210 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 225 +#define PREHEAT_2_TEMP_BED 85 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h b/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h new file mode 100644 index 0000000000..45710cd5f4 --- /dev/null +++ b/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 40 // Seconds + #define WATCH_TEMP_INCREASE 10 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 10 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Tronxy/X5S/Configuration.h b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h new file mode 100644 index 0000000000..145a64507a --- /dev/null +++ b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI_TRONXY +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Tronxy X5S" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 600 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 90 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 4, 150 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1000, 1000, 1000, 1000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 18.0 +#define DEFAULT_YJERK 18.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -45 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -55 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 10 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 340 +#define Y_BED_SIZE 315 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 400 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION 15 + //#define RIGHT_PROBE_BED_POSITION 270 + //#define FRONT_PROBE_BED_POSITION 20 + //#define BACK_PROBE_BED_POSITION 260 + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 50 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Tronxy/XY100/Configuration.h b/Marlin/src/config/examples/Tronxy/XY100/Configuration.h new file mode 100644 index 0000000000..5271e38d19 --- /dev/null +++ b/Marlin/src/config/examples/Tronxy/XY100/Configuration.h @@ -0,0 +1,1983 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Rob Griffiths, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MELZI +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "TronXY XY100" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + // #define DEFAULT_Kp 22.2 + // #define DEFAULT_Ki 1.08 + // #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + // TronXY XY-100 Standard Extruder at 210 Degree Celsius and 100% Fan + // (measured after M106 S255 with M303 E0 S210 C8) + // #define DEFAULT_Kp 20.32 + // #define DEFAULT_Ki 1.18 + // #define DEFAULT_Kd 87.80 + + // TronXY XY-100 Standard Extruder, from original firmware + #define DEFAULT_Kp 7.0000 + #define DEFAULT_Ki 2.0000 + #define DEFAULT_Kd 40.0000 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 100, 100, 1600, 90 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 4, 50 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 1000, 5000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 20.0 +#define DEFAULT_YJERK 20.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 120 +#define Y_BED_SIZE 140 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -10 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 130 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h new file mode 100644 index 0000000000..7f77f1c473 --- /dev/null +++ b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h @@ -0,0 +1,1972 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_ARCHIM2 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +#define X_DRIVER_TYPE TMC2130 +#define Y_DRIVER_TYPE TMC2130 +#define Z_DRIVER_TYPE TMC2130 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +#define E0_DRIVER_TYPE TMC2130 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h new file mode 100644 index 0000000000..ad86e61d2e --- /dev/null +++ b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +//#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Velleman/K8200/Configuration.h b/Marlin/src/config/examples/Velleman/K8200/Configuration.h new file mode 100644 index 0000000000..9d484d5641 --- /dev/null +++ b/Marlin/src/config/examples/Velleman/K8200/Configuration.h @@ -0,0 +1,2007 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +/** + * Sample configuration file for Vellemann K8200 + * tested on K8200 with VM8201 (Display) + * and Arduino 1.6.12 (Mac OS X) by @CONSULitAS, 2016-11-18 + * https://github.com/CONSULitAS/Marlin-K8200/archive/K8200_stable_2016-11-18.zip + * + * Please choose your hardware options for the K8200: + */ + +// VM8201 Display unit +#define K8200_VM8201 +// K8204 Z axis upgrade rod and coupler -> TODO +// #define K8200_K8204 +// K8203 direct drive extruder -> TODO +// #define K8200_K8203 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(K8200, @CONSULitAS)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_K8200 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "K8200" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +#if ENABLED(K8200_VM8201) + #define MACHINE_UUID "2b7dea3b-844e-4ab1-aa96-bb6406607d6e" // K8200 standard config with VM8201 (Display) +#else + #define MACHINE_UUID "92f72de1-c211-452e-9f2b-61ef88a4751e" // K8200 standard config without VM8201 (Display) +#endif + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + // Vellemann K8200 Extruder - calculated with PID Autotune and tested + #define DEFAULT_Kp 24.29 + #define DEFAULT_Ki 1.58 + #define DEFAULT_Kd 93.51 +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. + + // Vellemann K8200 PCB heatbed with standard PCU at 60 degreesC - calculated with PID Autotune and tested + // from pidautotune + #define DEFAULT_bedKp 341.88 + #define DEFAULT_bedKi 25.32 + #define DEFAULT_bedKd 1153.89 +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + #define ENDSTOPPULLUP_XMIN + #define ENDSTOPPULLUP_YMIN + #define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 64.25, 64.25, 2560, 600 } +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false // K8200: false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true // K8200: true for geared default extruder! +#define INVERT_E1_DIR true +#define INVERT_E2_DIR true +#define INVERT_E3_DIR true +#define INVERT_E4_DIR true + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +// K8200: it is usual to have clamps for the glass plate on the heatbed +#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 50 // K8200: PLA / set back to 70 if you have an upgraded heatbed power supply +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 60 // K8200: ABS / set back to 110 if you have an upgraded heatbed power supply +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +// K8200: for Display VM8201 with SD slot +#if ENABLED(K8200_VM8201) + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE // K8200: for Display VM8201 // this is the most common hardware + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 4 // K8200_VM8201: four steps per encoder step + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 1 // K8200_VM8201: One step per menu item + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +#define REVERSE_MENU_DIRECTION // K8200: for Display VM8201 encoder on right side + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +#define ULTIMAKERCONTROLLER // K8200: for Display VM8201 + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +#endif // K8200_VM8201 + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h b/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h new file mode 100644 index 0000000000..0dd094abfc --- /dev/null +++ b/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h @@ -0,0 +1,1710 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ + + /** + * Sample configuration file for Vellemann K8200 + * tested on K8200 with VM8201 (Display) + * and Arduino 1.6.12 (Mac) by @CONSULitAS, 2016-11-18 + * https://github.com/CONSULitAS/Marlin-K8200/archive/K8200_stable_2016-11-18.zip + * + */ + +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + // K8200 has weak heaters/power supply by default, so you have to relax! + #define THERMAL_PROTECTION_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 8 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + // K8200 has weak heaters/power supply by default, so you have to relax! + #define WATCH_TEMP_PERIOD 30 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + // K8200 has weak heaters/power supply by default, so you have to relax! + // the default bed is so weak, that you can hardly go over 75°C + #define THERMAL_PROTECTION_BED_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 10 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +#define FAN_KICKSTART_TIME 500 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 4, 4, 8 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + #define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + #define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 32 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 128 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Velleman/K8200/README.md b/Marlin/src/config/examples/Velleman/K8200/README.md new file mode 100644 index 0000000000..42cc1846ed --- /dev/null +++ b/Marlin/src/config/examples/Velleman/K8200/README.md @@ -0,0 +1,20 @@ +# Example Configuration for Vellemann [K8200](http://www.k8200.eu/) +* Configuration files for **Vellemann K8200** (with [VM8201](http://www.vellemanprojects.eu/products/view/?id=416158) - LCD Option for K8200) +* K8200 is a 3Drag clone - configuration should work with 3Drag http://reprap.org/wiki/3drag, too. Please report. + +* updated manually with parameters from genuine Vellemann Firmware "firmware_k8200_marlinv2" based on the recent development branch + +* VM8201 uses "DISPLAY_CHARSET_HD44870 JAPANESE" and "ULTIMAKERCONTROLLER" +* german (de) translation with umlaut is supported now - thanks to @AnHardt for the great hardware based umlaut support + +I [@CONSULitAS](https://github.com/CONSULitAS) tested the changes on my K8200 with 20x4-LCD and Arduino 1.6.12 for Mac (SD library added to IDE manually), 2016-11-18 - everything works well. + +**Source for genuine [Vellemann Firmware](http://www.k8200.eu/support/downloads/)** +* V2.1.1 (for z axis upgrade, date branched: 2013-06-05): [firmware_k8200_v2.1.1.zip](http://www.k8200.eu/downloads/files/downloads/firmware_k8200_v2.1.1.zip) + * see also https://github.com/CONSULitAS/Marlin-K8200/tree/Vellemann_firmware_k8200_v2.1.1.zip + +* V2 (with LCD/SD-Support, date branched: 2013-06-05): [firmware_k8200_marlinv2.zip](http://www.k8200.eu/downloads/files/downloads/firmware_k8200_marlinv2.zip) + * see also https://github.com/CONSULitAS/Marlin-K8200/tree/Vellemann_firmware_k8200_marlinv2.zip + +* V1 (without LCD/SD-Support, date branched: 2012-10-02): [firmware_k8200_marlinv1.zip](http://www.k8200.eu/downloads/files/downloads/firmware_k8200_marlinv1.zip) + * see also https://github.com/CONSULitAS/Marlin-K8200/tree/Vellemann_firmware_k8200_marlinv1.zip diff --git a/Marlin/src/config/examples/Velleman/K8400/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Configuration.h new file mode 100644 index 0000000000..92755abe4a --- /dev/null +++ b/Marlin/src/config/examples/Velleman/K8400/Configuration.h @@ -0,0 +1,1973 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Anthony Birkett, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_K8400 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 2 // (seconds) +#define TEMP_HYSTERESIS 5 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + #define DEFAULT_Kp 63.0 + #define DEFAULT_Ki 2.25 + #define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 134.74, 134.74, 4266.66, 148.7 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 160, 160, 10, 10000 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 6000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 6000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.5 +#define DEFAULT_EJERK 20.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR true +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 180 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 190 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (8*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 210 +#define PREHEAT_1_TEMP_BED 0 +#define PREHEAT_1_FAN_SPEED 165 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 245 +#define PREHEAT_2_TEMP_BED 0 +#define PREHEAT_2_FAN_SPEED 165 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED // Enable for the Velleman RGB LED Add-on. https://www.velleman.eu/products/view/?id=430100 +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + // Pin defines for the RGB LED Add-on. + #define RGB_LED_R_PIN 41 + #define RGB_LED_G_PIN 40 + #define RGB_LED_B_PIN 12 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h b/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h new file mode 100644 index 0000000000..6ee6470a87 --- /dev/null +++ b/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 1000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 1 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + #define CONTROLLER_FAN_PIN 2 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 10 +#define Y_HOME_BUMP_MM 10 +#define Z_HOME_BUMP_MM 3 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 26 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 5 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 600 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 100 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h new file mode 100644 index 0000000000..2ee2507818 --- /dev/null +++ b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h @@ -0,0 +1,1973 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Anthony Birkett, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_K8400 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 2 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 5 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 2 // (seconds) +#define TEMP_HYSTERESIS 5 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + #define DEFAULT_Kp 63.0 + #define DEFAULT_Ki 2.25 + #define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 134.74, 134.74, 4266.66, 148.7 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 160, 160, 10, 10000 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 6000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 6000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.4 +#define DEFAULT_EJERK 20.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR true +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 180 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 190 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (8*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 210 +#define PREHEAT_1_TEMP_BED 0 +#define PREHEAT_1_FAN_SPEED 165 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 245 +#define PREHEAT_2_TEMP_BED 0 +#define PREHEAT_2_FAN_SPEED 165 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED // Enable for the Velleman RGB LED Add-on. https://www.velleman.eu/products/view/?id=430100 +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + // Pin defines for the RGB LED Add-on. + #define RGB_LED_R_PIN 41 + #define RGB_LED_G_PIN 40 + #define RGB_LED_B_PIN 12 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Velleman/K8400/README.md b/Marlin/src/config/examples/Velleman/K8400/README.md new file mode 100644 index 0000000000..1ebdd16ef2 --- /dev/null +++ b/Marlin/src/config/examples/Velleman/K8400/README.md @@ -0,0 +1,15 @@ +# Configuration for Velleman K8400 Vertex +http://www.k8400.eu/ + +Configuration files for the K8400, ported upstream from the official Velleman firmware. +Like its predecessor, (K8200), the K8400 is a 3Drag clone. There are some minor differences, documented in pins_K8400.h. + +Single and dual head configurations provided. Copy the correct Configuration.h and Configuration_adv.h to the /src/config directory. + +**NOTE: This configuration includes the community sourced feed rate fix. Use 100% feed rate in Repetier!** + +For implementation and updated K8400 firmware, see https://github.com/birkett/Velleman-K8400-Firmware + +### Original Sources +Credit to Velleman for the original 1.0.x based code:
+http://www.vertex3dprinter.eu/downloads/files/vertex/firmware/vertex-m1-v1.4-h2.zip diff --git a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h new file mode 100644 index 0000000000..8b43a077a6 --- /dev/null +++ b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h @@ -0,0 +1,1985 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Rob Mendon, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_ULTIMAIN_2 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Duplicator 6" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 20 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 260 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 120 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + // Duplicator 6 + #define DEFAULT_Kp 9.12 + #define DEFAULT_Ki 0.41 + #define DEFAULT_Kd 50.98 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) +// #define DEFAULT_bedKp 10.00 +// #define DEFAULT_bedKi .023 +// #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // Duplicator 6 + #define DEFAULT_bedKp 124.55 + #define DEFAULT_bedKi 23.46 + #define DEFAULT_bedKd 165.29 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80.0395, 80.0395, 400.48, 99.1 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 500 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1500 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 1.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 170 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 2 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 5 +#define LCD_FEEDBACK_FREQUENCY_HZ 1000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +#define U8GLIB_SSD1306 +#define LCD_WIDTH 22 +#define LCD_HEIGHT 5 +#define LCD_RESET_PIN 5 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h new file mode 100644 index 0000000000..554d5fd376 --- /dev/null +++ b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h @@ -0,0 +1,1699 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 60 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 40 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 40 // Seconds Changed to 90 seconds to help prevent false thermal runaway errors (may have to increase to 120) + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds Changed to 90 seconds to help prevent false heater failed errors + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + #define CASE_LIGHT_PIN 8 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 255 // Set default power-up brightness (0-255, requires PWM pin) + #define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {70*60, 70*60, 15*60, 6*60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range +#define MOTOR_CURRENT_PWM_RANGE 2782 +#define PWM_MOTOR_CURRENT { 1200, 1200, 1000 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +#define LCD_TIMEOUT_TO_STATUS 60000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + //#define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + //#define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + #define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/adafruit/ST7565/Configuration.h b/Marlin/src/config/examples/adafruit/ST7565/Configuration.h new file mode 100644 index 0000000000..06d255ed24 --- /dev/null +++ b/Marlin/src/config/examples/adafruit/ST7565/Configuration.h @@ -0,0 +1,1978 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h new file mode 100644 index 0000000000..44c57da833 --- /dev/null +++ b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h @@ -0,0 +1,2107 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(LVD, FLSUN-AC)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_13_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "FLSUN Kossel" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 5 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 1 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 250 +#define HEATER_1_MAXTEMP 250 +#define HEATER_2_MAXTEMP 250 +#define HEATER_3_MAXTEMP 250 +#define HEATER_4_MAXTEMP 250 +#define BED_MAXTEMP 115 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + //E3D with 30MM fan + #define DEFAULT_Kp 24.77 + #define DEFAULT_Ki 1.84 + #define DEFAULT_Kd 83.61 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + //D-force + #define DEFAULT_bedKp 22.97 + #define DEFAULT_bedKi 3.76 + #define DEFAULT_bedKd 29.2 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 300 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Delta Settings ============================= +//=========================================================================== +// Enable DELTA kinematics and most of the default configuration for Deltas +#define DELTA + +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DELTA_SEGMENTS_PER_SECOND 160 + + // Convert feedrates to apply to the Effector instead of the Carriages + #define DELTA_FEEDRATE_SCALING + + // After homing move down to a height where XY movement is unconstrained + //#define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // uncomment to add three points calibration menu option. + // See http://minow.blogspot.com/index.html#4918805519571907051 + //#define DELTA_CALIBRATION_MENU + + // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) + #define DELTA_AUTO_CALIBRATION + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // set the default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 4 + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) || ENABLED(DELTA_CALIBRATION_MENU) + // Set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS for non-eccentric probes + #define DELTA_CALIBRATION_RADIUS 73.5 // mm + // Set the steprate for papertest probing + #define PROBE_MANUALLY_STEP 0.05 // mm + #endif + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 85.0 // mm + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 218.0 // mm + + // height from z=0 to home position + #define DELTA_HEIGHT 295.00 // get this value from auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // get these from auto calibrate + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 101.0 //mm Get this value from auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // get these values from auto calibrate + + // delta radius and diaginal rod adjustments measured in mm + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } + +#endif + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +// delta speeds must be the same on xyz +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// variables to calculate steps +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 16 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 16 + +// delta speeds must be the same on xyz +#define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) +#define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 100 } // default steps per unit for Kossel (GT2, 20 tooth) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 4000, 4000, 4000, 4000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP // A3K leave disabled! + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0.10 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 20 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 5000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST) / 6 + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. + */ +//#define Z_PROBE_ALLEN_KEY + +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + // Kossel Mini + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X 30.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X 0.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_SPEED)/10 + + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X Z_PROBE_ALLEN_KEY_DEPLOY_2_X * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y Z_PROBE_ALLEN_KEY_DEPLOY_2_Y * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_DEPTH 20 + // Move the probe into position + #define Z_PROBE_ALLEN_KEY_STOW_1_X -64.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_Z 23.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_SPEED + // Move the nozzle down further to push the probe into retracted position. + #define Z_PROBE_ALLEN_KEY_STOW_2_X Z_PROBE_ALLEN_KEY_STOW_1_X + #define Z_PROBE_ALLEN_KEY_STOW_2_Y Z_PROBE_ALLEN_KEY_STOW_1_Y + #define Z_PROBE_ALLEN_KEY_STOW_2_Z (Z_PROBE_ALLEN_KEY_STOW_1_Z-Z_PROBE_ALLEN_KEY_STOW_DEPTH) + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_SPEED/10) + // Raise things back up slightly so we don't bump into anything + #define Z_PROBE_ALLEN_KEY_STOW_3_X Z_PROBE_ALLEN_KEY_STOW_2_X + #define Z_PROBE_ALLEN_KEY_STOW_3_Y Z_PROBE_ALLEN_KEY_STOW_2_Y + #define Z_PROBE_ALLEN_KEY_STOW_3_Z (Z_PROBE_ALLEN_KEY_STOW_1_Z+Z_PROBE_ALLEN_KEY_STOW_DEPTH) + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE (XY_PROBE_SPEED/2) + + #define Z_PROBE_ALLEN_KEY_STOW_4_X 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Y 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Z Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_SPEED + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 5 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 2 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 2 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true // DELTA does not invert +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 15 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 // deltas always home to max +#define Y_HOME_DIR 1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) +#define Y_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +//#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + //#define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + // Works best with 5 or more points in each dimension. + #define GRID_MAX_POINTS_X 7 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + //#define RIGHT_PROBE_BED_POSITION (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + //#define BACK_PROBE_BED_POSITION (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +#define MANUAL_Z_HOME_POS DELTA_HEIGHT // Distance between the nozzle to printbed after homing + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Delta only homes to Z +#define HOMING_FEEDRATE_Z (100*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 5 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 195 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 WESTERN + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h new file mode 100644 index 0000000000..827105953f --- /dev/null +++ b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h @@ -0,0 +1,1699 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 5 // deltas need the same for all three axes +#define HOMING_BUMP_DIVISOR { 10, 10, 10 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE_XYZ 50*60 + #define MANUAL_FEEDRATE { MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +// (don't use SLOWDOWN with DELTA because DELTA generates hundreds of segments per second) +//#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h new file mode 100644 index 0000000000..624034a2a7 --- /dev/null +++ b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h @@ -0,0 +1,2106 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(LVD, FLSUN-AC)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_13_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "FLSUN Kossel" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 5 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 1 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 250 +#define HEATER_1_MAXTEMP 250 +#define HEATER_2_MAXTEMP 250 +#define HEATER_3_MAXTEMP 250 +#define HEATER_4_MAXTEMP 250 +#define BED_MAXTEMP 115 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + //E3D with 30MM fan + #define DEFAULT_Kp 24.77 + #define DEFAULT_Ki 1.84 + #define DEFAULT_Kd 83.61 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + //D-force + #define DEFAULT_bedKp 22.97 + #define DEFAULT_bedKi 3.76 + #define DEFAULT_bedKd 29.2 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 300 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Delta Settings ============================= +//=========================================================================== +// Enable DELTA kinematics and most of the default configuration for Deltas +#define DELTA + +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DELTA_SEGMENTS_PER_SECOND 160 + + // Convert feedrates to apply to the Effector instead of the Carriages + #define DELTA_FEEDRATE_SCALING + + // After homing move down to a height where XY movement is unconstrained + //#define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // uncomment to add three points calibration menu option. + // See http://minow.blogspot.com/index.html#4918805519571907051 + #define DELTA_CALIBRATION_MENU + + // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) + #define DELTA_AUTO_CALIBRATION + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // set the default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 7 + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) || ENABLED(DELTA_CALIBRATION_MENU) + // Set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS for non-eccentric probes + #define DELTA_CALIBRATION_RADIUS 63 // mm + // Set the steprate for papertest probing + #define PROBE_MANUALLY_STEP 0.05 // mm + #endif + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 70.0 // mm + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 218.0 // mm + + // height from z=0 to home position + #define DELTA_HEIGHT 317.94 // get this value from auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // get these from auto calibrate + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 110.0 //mm Get this value from auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // get these values from auto calibrate + + // delta radius and diaginal rod adjustments measured in mm + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } + +#endif + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG // a Z probe +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +// delta speeds must be the same on xyz +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// variables to calculate steps +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 16 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 16 + +// delta speeds must be the same on xyz +#define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) +#define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 100 } // default steps per unit for Kossel (GT2, 20 tooth) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 4000, 4000, 4000, 4000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP // A3K leave disabled! + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0.10 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 20 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 5000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST) / 6 + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. + */ +//#define Z_PROBE_ALLEN_KEY + +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + // Kossel Mini + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X 30.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X 0.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_SPEED)/10 + + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X Z_PROBE_ALLEN_KEY_DEPLOY_2_X * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y Z_PROBE_ALLEN_KEY_DEPLOY_2_Y * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_DEPTH 20 + #define Z_PROBE_ALLEN_KEY_STOW_1_X -64.0 // Move the probe into position + #define Z_PROBE_ALLEN_KEY_STOW_1_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_Z 23.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_SPEED + // Move the nozzle down further to push the probe into retracted position. + #define Z_PROBE_ALLEN_KEY_STOW_2_X Z_PROBE_ALLEN_KEY_STOW_1_X + #define Z_PROBE_ALLEN_KEY_STOW_2_Y Z_PROBE_ALLEN_KEY_STOW_1_Y + #define Z_PROBE_ALLEN_KEY_STOW_2_Z (Z_PROBE_ALLEN_KEY_STOW_1_Z-Z_PROBE_ALLEN_KEY_STOW_DEPTH) + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_SPEED/10) + // Raise things back up slightly so we don't bump into anything + #define Z_PROBE_ALLEN_KEY_STOW_3_X Z_PROBE_ALLEN_KEY_STOW_2_X + #define Z_PROBE_ALLEN_KEY_STOW_3_Y Z_PROBE_ALLEN_KEY_STOW_2_Y + #define Z_PROBE_ALLEN_KEY_STOW_3_Z (Z_PROBE_ALLEN_KEY_STOW_1_Z+Z_PROBE_ALLEN_KEY_STOW_DEPTH) + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE (XY_PROBE_SPEED/2) + + #define Z_PROBE_ALLEN_KEY_STOW_4_X 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Y 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Z Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_SPEED + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 5 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 2 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 2 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true // DELTA does not invert +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 15 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 // deltas always home to max +#define Y_HOME_DIR 1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) +#define Y_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +//#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + //#define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + // Works best with 5 or more points in each dimension. + #define GRID_MAX_POINTS_X 7 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + //#define RIGHT_PROBE_BED_POSITION (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + //#define BACK_PROBE_BED_POSITION (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +#define MANUAL_Z_HOME_POS DELTA_HEIGHT // Distance between the nozzle to printbed after homing + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Delta only homes to Z +#define HOMING_FEEDRATE_Z (100*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 5 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 195 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 WESTERN + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h new file mode 100644 index 0000000000..827105953f --- /dev/null +++ b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h @@ -0,0 +1,1699 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 5 // deltas need the same for all three axes +#define HOMING_BUMP_DIVISOR { 10, 10, 10 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE_XYZ 50*60 + #define MANUAL_FEEDRATE { MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +// (don't use SLOWDOWN with DELTA because DELTA generates hundreds of segments per second) +//#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h new file mode 100644 index 0000000000..45b8e055a3 --- /dev/null +++ b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h @@ -0,0 +1,2106 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(Michael Henke, flsun Kossel Mini)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_13_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Mini Kossel" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 5 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 1 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + //E3D with 30MM fan + #define DEFAULT_Kp 24.77 + #define DEFAULT_Ki 1.84 + #define DEFAULT_Kd 83.61 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + //D-force + #define DEFAULT_bedKp 22.97 + #define DEFAULT_bedKi 3.76 + #define DEFAULT_bedKd 29.2 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 175 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 300 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Delta Settings ============================= +//=========================================================================== +// Enable DELTA kinematics and most of the default configuration for Deltas +#define DELTA + +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DELTA_SEGMENTS_PER_SECOND 160 + + // Convert feedrates to apply to the Effector instead of the Carriages + #define DELTA_FEEDRATE_SCALING + + // After homing move down to a height where XY movement is unconstrained + //#define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // uncomment to add three points calibration menu option. + // See http://minow.blogspot.com/index.html#4918805519571907051 + //#define DELTA_CALIBRATION_MENU + + // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) + //#define DELTA_AUTO_CALIBRATION + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // set the default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 4 + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) || ENABLED(DELTA_CALIBRATION_MENU) + // Set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS for non-eccentric probes + #define DELTA_CALIBRATION_RADIUS 73.5 // mm + // Set the steprate for papertest probing + #define PROBE_MANUALLY_STEP 0.05 // mm + #endif + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 85.0 // mm + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 218.0 // mm + + // height from z=0 to home position + #define DELTA_HEIGHT 280.00 // get this value from auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // get these from auto calibrate + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 101.0 //mm Get this value from auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // get these values from auto calibrate + + // delta radius and diaginal rod adjustments measured in mm + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } + +#endif + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +// delta speeds must be the same on xyz +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// variables to calculate steps +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 16 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 16 + +// delta speeds must be the same on xyz +#define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) +#define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 90 } // default steps per unit for Kossel (GT2, 20 tooth) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 200 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 4000, 4000, 4000, 4000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 2500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP // A3K leave disabled! + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0.25 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 2000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +#define MULTIPLE_PROBING 2 + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. + */ +//#define Z_PROBE_ALLEN_KEY + +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + // Kossel Mini + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X 30.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X 0.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_SPEED/10) + + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X Z_PROBE_ALLEN_KEY_DEPLOY_2_X * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y Z_PROBE_ALLEN_KEY_DEPLOY_2_Y * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_DEPTH 20 + #define Z_PROBE_ALLEN_KEY_STOW_1_X -64.0 // Move the probe into position + #define Z_PROBE_ALLEN_KEY_STOW_1_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_Z 23.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_SPEED + // Move the nozzle down further to push the probe into retracted position. + #define Z_PROBE_ALLEN_KEY_STOW_2_X Z_PROBE_ALLEN_KEY_STOW_1_X + #define Z_PROBE_ALLEN_KEY_STOW_2_Y Z_PROBE_ALLEN_KEY_STOW_1_Y + #define Z_PROBE_ALLEN_KEY_STOW_2_Z (Z_PROBE_ALLEN_KEY_STOW_1_Z-Z_PROBE_ALLEN_KEY_STOW_DEPTH) + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_SPEED/10) + // Raise things back up slightly so we don't bump into anything + #define Z_PROBE_ALLEN_KEY_STOW_3_X Z_PROBE_ALLEN_KEY_STOW_2_X + #define Z_PROBE_ALLEN_KEY_STOW_3_Y Z_PROBE_ALLEN_KEY_STOW_2_Y + #define Z_PROBE_ALLEN_KEY_STOW_3_Z (Z_PROBE_ALLEN_KEY_STOW_1_Z+Z_PROBE_ALLEN_KEY_STOW_DEPTH) + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE (XY_PROBE_SPEED/2) + + #define Z_PROBE_ALLEN_KEY_STOW_4_X 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Y 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Z Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_SPEED + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 50 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true // DELTA does not invert +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 15 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 // deltas always home to max +#define Y_HOME_DIR 1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) +#define Y_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + //#define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + // Works best with 5 or more points in each dimension. + #define GRID_MAX_POINTS_X 9 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + //#define RIGHT_PROBE_BED_POSITION (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + //#define BACK_PROBE_BED_POSITION (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +#define MANUAL_Z_HOME_POS DELTA_HEIGHT // Distance between the nozzle to printbed after homing + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_MIN_POS + X_MAX_POS) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_MIN_POS + Y_MAX_POS) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Delta only homes to Z +#define HOMING_FEEDRATE_Z (45*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 5 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 WESTERN + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h new file mode 100644 index 0000000000..9202223428 --- /dev/null +++ b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h @@ -0,0 +1,1699 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 5 // deltas need the same for all three axes +#define HOMING_BUMP_DIVISOR { 10, 10, 10 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE_XYZ 50*60 + #define MANUAL_FEEDRATE { MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +// (don't use SLOWDOWN with DELTA because DELTA generates hundreds of segments per second) +//#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h b/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h new file mode 100644 index 0000000000..05fa85ceab --- /dev/null +++ b/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h @@ -0,0 +1,2109 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration for Hatchbox Alpha with E3D v6 extruder + * http://hatchbox3d.com/Guides/HATCHBOX%20Alpha%203D%20Printer%20User%20Manual.pdf + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MKS_GEN_13 +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Hatchbox Alpha" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + + // E3D-v6 + #define DEFAULT_Kp 18.55 + #define DEFAULT_Ki 2.71 + #define DEFAULT_Kd 47.69 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + //HatchBox Alpha + #define DEFAULT_bedKp 72.11 + #define DEFAULT_bedKi 7.1 + #define DEFAULT_bedKd 488.31 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Delta Settings ============================= +//=========================================================================== +// Enable DELTA kinematics and most of the default configuration for Deltas +#define DELTA + +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DELTA_SEGMENTS_PER_SECOND 200 + + // Convert feedrates to apply to the Effector instead of the Carriages + #define DELTA_FEEDRATE_SCALING + + // After homing move down to a height where XY movement is unconstrained + //#define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // uncomment to add three points calibration menu option. + // See http://minow.blogspot.com/index.html#4918805519571907051 + #define DELTA_CALIBRATION_MENU + + // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) + #define DELTA_AUTO_CALIBRATION + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // set the default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 4 + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) || ENABLED(DELTA_CALIBRATION_MENU) + // Set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS for non-eccentric probes + #define DELTA_CALIBRATION_RADIUS 121.5 // mm + // Set the steprate for papertest probing + #define PROBE_MANUALLY_STEP 0.05 // mm + #endif + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 151.0 // mm + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 356.5 // mm + + // height from z=0 to home position + #define DELTA_HEIGHT 352.00 // get this value from auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // get these from auto calibrate + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 176.5 //mm Get this value from auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // get these values from auto calibrate + + // delta radius and diaginal rod adjustments measured in mm + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } + +#endif + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG // a Z probe +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +// delta speeds must be the same on xyz +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// variables to calculate steps +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 16 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 16 + +// delta speeds must be the same on xyz +#define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) +#define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 95 } // default steps per unit for Kossel (GT2, 20 tooth) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 200 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 20.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 4000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST (HOMING_FEEDRATE_Z / 4) + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 4) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +#define MULTIPLE_PROBING 2 + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. + */ +//#define Z_PROBE_ALLEN_KEY + +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X 30.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X 0.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_SPEED)/10 + + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X Z_PROBE_ALLEN_KEY_DEPLOY_2_X * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y Z_PROBE_ALLEN_KEY_DEPLOY_2_Y * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_1_X -64.0 // Move the probe into position + #define Z_PROBE_ALLEN_KEY_STOW_1_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_Z 23.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_2_X -64.0 // Push it down + #define Z_PROBE_ALLEN_KEY_STOW_2_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_2_Z 3.0 + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_SPEED)/10 + + #define Z_PROBE_ALLEN_KEY_STOW_3_X -64.0 // Move it up to clear + #define Z_PROBE_ALLEN_KEY_STOW_3_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_3_Z 50.0 + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_4_X 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Y 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Z Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_SPEED + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false // DELTA does not invert +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 // deltas always home to max +#define Y_HOME_DIR 1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) +#define Y_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + //#define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + // Works best with 5 or more points in each dimension. + #define GRID_MAX_POINTS_X 9 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + //#define RIGHT_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + //#define BACK_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + #define PROBE_PT_1_X -116 + #define PROBE_PT_1_Y -67.5 + #define PROBE_PT_2_X 116 + #define PROBE_PT_2_Y -67.5 + #define PROBE_PT_3_X 0 + #define PROBE_PT_3_Y 135 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +#define MANUAL_Z_HOME_POS DELTA_HEIGHT // Distance between the nozzle to printbed after homing + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Delta only homes to Z +#define HOMING_FEEDRATE_Z (200*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 210 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 230 +#define PREHEAT_2_TEMP_BED 105 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/generic/Configuration.h b/Marlin/src/config/examples/delta/generic/Configuration.h new file mode 100644 index 0000000000..79c7e2b98e --- /dev/null +++ b/Marlin/src/config/examples/delta/generic/Configuration.h @@ -0,0 +1,2094 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Deltabot" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 -1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Delta Settings ============================= +//=========================================================================== +// Enable DELTA kinematics and most of the default configuration for Deltas +#define DELTA + +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DELTA_SEGMENTS_PER_SECOND 200 + + // Convert feedrates to apply to the Effector instead of the Carriages + #define DELTA_FEEDRATE_SCALING + + // After homing move down to a height where XY movement is unconstrained + //#define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // uncomment to add three points calibration menu option. + // See http://minow.blogspot.com/index.html#4918805519571907051 + //#define DELTA_CALIBRATION_MENU + + // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) + //#define DELTA_AUTO_CALIBRATION + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // set the default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 4 + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) || ENABLED(DELTA_CALIBRATION_MENU) + // Set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS for non-eccentric probes + #define DELTA_CALIBRATION_RADIUS 121.5 // mm + // Set the steprate for papertest probing + #define PROBE_MANUALLY_STEP 0.05 // mm + #endif + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 140.0 // mm + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 250.0 // mm + + // height from z=0 to home position + #define DELTA_HEIGHT 250.00 // get this value from auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // get these from auto calibrate + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 124.0 //mm Get this value from auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // get these values from auto calibrate + + // delta radius and diaginal rod adjustments measured in mm + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } + +#endif + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG // a Z probe +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +// delta speeds must be the same on xyz +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// variables to calculate steps +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 16 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 20 + +// delta speeds must be the same on xyz +#define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) +#define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 760*1.1 } // default steps per unit for Kossel (GT2, 20 tooth) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -3.5 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 4000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. + */ +//#define Z_PROBE_ALLEN_KEY + +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X 30.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X 0.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_SPEED)/10 + + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X Z_PROBE_ALLEN_KEY_DEPLOY_2_X * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y Z_PROBE_ALLEN_KEY_DEPLOY_2_Y * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_1_X -64.0 // Move the probe into position + #define Z_PROBE_ALLEN_KEY_STOW_1_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_Z 23.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_2_X -64.0 // Push it down + #define Z_PROBE_ALLEN_KEY_STOW_2_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_2_Z 3.0 + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_SPEED)/10 + + #define Z_PROBE_ALLEN_KEY_STOW_3_X -64.0 // Move it up to clear + #define Z_PROBE_ALLEN_KEY_STOW_3_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_3_Z 50.0 + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_4_X 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Y 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Z Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_SPEED + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false // DELTA does not invert +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 // deltas always home to max +#define Y_HOME_DIR 1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) +#define Y_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + //#define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + // Works best with 5 or more points in each dimension. + #define GRID_MAX_POINTS_X 9 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + //#define RIGHT_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + //#define BACK_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +#define MANUAL_Z_HOME_POS DELTA_HEIGHT // Distance between the nozzle to printbed after homing + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Delta only homes to Z +#define HOMING_FEEDRATE_Z (200*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/generic/Configuration_adv.h b/Marlin/src/config/examples/delta/generic/Configuration_adv.h new file mode 100644 index 0000000000..9202223428 --- /dev/null +++ b/Marlin/src/config/examples/delta/generic/Configuration_adv.h @@ -0,0 +1,1699 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 5 // deltas need the same for all three axes +#define HOMING_BUMP_DIVISOR { 10, 10, 10 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE_XYZ 50*60 + #define MANUAL_FEEDRATE { MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +// (don't use SLOWDOWN with DELTA because DELTA generates hundreds of segments per second) +//#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/delta/kossel_mini/Configuration.h b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h new file mode 100644 index 0000000000..5da31daf3d --- /dev/null +++ b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h @@ -0,0 +1,2096 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Mini Kossel" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 7 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 11 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 5 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Delta Settings ============================= +//=========================================================================== +// Enable DELTA kinematics and most of the default configuration for Deltas +#define DELTA + +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DELTA_SEGMENTS_PER_SECOND 200 + + // Convert feedrates to apply to the Effector instead of the Carriages + #define DELTA_FEEDRATE_SCALING + + // After homing move down to a height where XY movement is unconstrained + //#define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // uncomment to add three points calibration menu option. + // See http://minow.blogspot.com/index.html#4918805519571907051 + //#define DELTA_CALIBRATION_MENU + + // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) + //#define DELTA_AUTO_CALIBRATION + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // set the default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 4 + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) || ENABLED(DELTA_CALIBRATION_MENU) + // Set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS for non-eccentric probes + #define DELTA_CALIBRATION_RADIUS 78.0 // mm + // Set the steprate for papertest probing + #define PROBE_MANUALLY_STEP 0.05 // mm + #endif + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 90.0 // mm + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 215.0 // mm + + // height from z=0 to home position + #define DELTA_HEIGHT 250.00 // get this value from auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // get these from auto calibrate + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 105.2 //mm Get this value from auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // get these values from auto calibrate + + // delta radius and diaginal rod adjustments measured in mm + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } + +#endif + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG // a Z probe +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +// delta speeds must be the same on xyz +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// variables to calculate steps +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 16 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 20 + +// delta speeds must be the same on xyz +#define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) +#define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 760*1.1 } // default steps per unit for Kossel (GT2, 20 tooth) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 500, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -3.5 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 4000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. + */ +#define Z_PROBE_ALLEN_KEY + +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + // Kossel Mini + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X 30.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X 0.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y DELTA_PRINTABLE_RADIUS + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_SPEED/10) + + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X Z_PROBE_ALLEN_KEY_DEPLOY_2_X * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y Z_PROBE_ALLEN_KEY_DEPLOY_2_Y * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_DEPTH 20 + #define Z_PROBE_ALLEN_KEY_STOW_1_X -64.0 // Move the probe into position + #define Z_PROBE_ALLEN_KEY_STOW_1_Y 56.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_Z 23.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_SPEED + // Move the nozzle down further to push the probe into retracted position. + #define Z_PROBE_ALLEN_KEY_STOW_2_X Z_PROBE_ALLEN_KEY_STOW_1_X + #define Z_PROBE_ALLEN_KEY_STOW_2_Y Z_PROBE_ALLEN_KEY_STOW_1_Y + #define Z_PROBE_ALLEN_KEY_STOW_2_Z (Z_PROBE_ALLEN_KEY_STOW_1_Z-Z_PROBE_ALLEN_KEY_STOW_DEPTH) + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_SPEED/10) + // Raise things back up slightly so we don't bump into anything + #define Z_PROBE_ALLEN_KEY_STOW_3_X Z_PROBE_ALLEN_KEY_STOW_2_X + #define Z_PROBE_ALLEN_KEY_STOW_3_Y Z_PROBE_ALLEN_KEY_STOW_2_Y + #define Z_PROBE_ALLEN_KEY_STOW_3_Z (Z_PROBE_ALLEN_KEY_STOW_1_Z+Z_PROBE_ALLEN_KEY_STOW_DEPTH) + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE (XY_PROBE_SPEED/2) + + #define Z_PROBE_ALLEN_KEY_STOW_4_X 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Y 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Z Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_SPEED + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 50 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false // DELTA does not invert +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 15 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 // deltas always home to max +#define Y_HOME_DIR 1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) +#define Y_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + //#define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + // Works best with 5 or more points in each dimension. + #define GRID_MAX_POINTS_X 9 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + //#define RIGHT_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + //#define BACK_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +#define MANUAL_Z_HOME_POS DELTA_HEIGHT // Distance between the nozzle to printbed after homing + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Delta only homes to Z +#define HOMING_FEEDRATE_Z (200*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h new file mode 100644 index 0000000000..9202223428 --- /dev/null +++ b/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h @@ -0,0 +1,1699 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 5 // deltas need the same for all three axes +#define HOMING_BUMP_DIVISOR { 10, 10, 10 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE_XYZ 50*60 + #define MANUAL_FEEDRATE { MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +// (don't use SLOWDOWN with DELTA because DELTA generates hundreds of segments per second) +//#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/delta/kossel_pro/Configuration.h b/Marlin/src/config/examples/delta/kossel_pro/Configuration.h new file mode 100644 index 0000000000..d294301ff4 --- /dev/null +++ b/Marlin/src/config/examples/delta/kossel_pro/Configuration.h @@ -0,0 +1,2097 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Example configuration file for OpenBeam Kossel Pro + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_BRAINWAVE_PRO +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Kossel Pro" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX 125 // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 50 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // Kossel Pro + #define DEFAULT_Kp 19.30 + #define DEFAULT_Ki 3.51 + #define DEFAULT_Kd 26.56 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //Kossel Pro heated bed plate with borosilicate glass + //from pidautotune (M303 E-1 S60 C8) + #define DEFAULT_bedKp 370.25 + #define DEFAULT_bedKi 62.77 + #define DEFAULT_bedKd 545.98 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Delta Settings ============================= +//=========================================================================== +// Enable DELTA kinematics and most of the default configuration for Deltas +#define DELTA + +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DELTA_SEGMENTS_PER_SECOND 160 + + // Convert feedrates to apply to the Effector instead of the Carriages + #define DELTA_FEEDRATE_SCALING + + // After homing move down to a height where XY movement is unconstrained + //#define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // uncomment to add three points calibration menu option. + // See http://minow.blogspot.com/index.html#4918805519571907051 + //#define DELTA_CALIBRATION_MENU + + // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) + //#define DELTA_AUTO_CALIBRATION + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // set the default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 4 + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) || ENABLED(DELTA_CALIBRATION_MENU) + // Set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS for non-eccentric probes + #define DELTA_CALIBRATION_RADIUS 110.0 // mm + // Set the steprate for papertest probing + #define PROBE_MANUALLY_STEP 0.05 // mm + #endif + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 127.0 // mm + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 301.0 // mm + + // height from z=0 to home position + #define DELTA_HEIGHT 277.00 // get this value from auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // get these from auto calibrate + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 152.357 //mm Get this value from auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // get these values from auto calibrate + + // delta radius and diaginal rod adjustments measured in mm + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } + +#endif + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG // a Z probe +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 32 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 20 + +// delta speeds must be the same on xyz +#define XYZ_STEPS ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// variables to calculate steps +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 32 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 20 + +// delta speeds must be the same on xyz +#define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) +#define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 184.8 } // default steps per unit for Kossel (GT2, 20 tooth) + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 200 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 9000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -23 // KosselPro actual: -22.919 +#define Y_PROBE_OFFSET_FROM_EXTRUDER -6 // KosselPro actual: -6.304 +/** + * Kossel Pro note: The correct value is likely -17.45 but I'd rather err on the side of + * not giving someone a head crash. Use something like G29 Z-0.2 to adjust as needed. + */ +#define Z_PROBE_OFFSET_FROM_EXTRUDER -17.25 // Increase this if the first layer is too thin (remember: it's a negative number so increase means closer to zero). +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. + */ +#define Z_PROBE_ALLEN_KEY + +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + // Kossel Pro + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X -105.00 // Move left but not quite so far that we'll bump the belt + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y 0.00 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z 100.0 + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X -110.00 // Move outward to position deploy pin to the left of the arm + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y -125.00 + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z Z_PROBE_ALLEN_KEY_DEPLOY_1_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X Z_PROBE_ALLEN_KEY_DEPLOY_2_X * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y Z_PROBE_ALLEN_KEY_DEPLOY_2_Y * 0.75 + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_X 45.00 // Move right to trigger deploy pin + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_Y -125.00 + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_Z Z_PROBE_ALLEN_KEY_DEPLOY_3_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE (XY_PROBE_SPEED)/2 + + #define Z_PROBE_ALLEN_KEY_STOW_1_X 36.00 // Line up with bed retaining clip + #define Z_PROBE_ALLEN_KEY_STOW_1_Y -125.00 + #define Z_PROBE_ALLEN_KEY_STOW_1_Z 75.0 + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_2_X Z_PROBE_ALLEN_KEY_STOW_1_X // move down to retract probe + #define Z_PROBE_ALLEN_KEY_STOW_2_Y Z_PROBE_ALLEN_KEY_STOW_1_Y + #define Z_PROBE_ALLEN_KEY_STOW_2_Z 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_SPEED)/2 + + #define Z_PROBE_ALLEN_KEY_STOW_3_X 0.0 // return to 0,0,100 + #define Z_PROBE_ALLEN_KEY_STOW_3_Y 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_3_Z 100.0 + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE XY_PROBE_SPEED + + #define Z_PROBE_ALLEN_KEY_STOW_4_X 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Y 0.0 + #define Z_PROBE_ALLEN_KEY_STOW_4_Z Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_SPEED + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 100 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset + +#define Z_PROBE_OFFSET_RANGE_MIN -15 +#define Z_PROBE_OFFSET_RANGE_MAX 5 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 // deltas always home to max +#define Y_HOME_DIR 1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) +#define Y_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + //#define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + // Works best with 5 or more points in each dimension. + #define GRID_MAX_POINTS_X 7 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + //#define RIGHT_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE)) + //#define BACK_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS -(MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +#define MANUAL_Z_HOME_POS DELTA_HEIGHT // Distance between the nozzle to printbed after homing + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Delta only homes to Z +#define HOMING_FEEDRATE_Z (200*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h new file mode 100644 index 0000000000..c9e93722fe --- /dev/null +++ b/Marlin/src/config/examples/delta/kossel_pro/Configuration_adv.h @@ -0,0 +1,1704 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +// Example configuration file for OpenBeam Kossel Pro +// tested on 2015-05-19 by @Wackerbarth +// using Arduino 1.6.5 (Mac) + + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 5 // deltas need the same for all three axes +#define HOMING_BUMP_DIVISOR { 10, 10, 10 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE_XYZ 50*60 + #define MANUAL_FEEDRATE { MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +// (don't use SLOWDOWN with DELTA because DELTA generates hundreds of segments per second) +//#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/delta/kossel_pro/README.md b/Marlin/src/config/examples/delta/kossel_pro/README.md new file mode 100644 index 0000000000..37b5ccf07f --- /dev/null +++ b/Marlin/src/config/examples/delta/kossel_pro/README.md @@ -0,0 +1,5 @@ +# Example Configuration for OpenBeam Kossel Pro [BRAINWAVE_PRO](http://www.openbeamusa.com/3d-printers/kossel/) +* Configuration files for the **Openbeam Kossel Pro** as delivered in their KickStarter distribution + +I [@Wackerbarth](https://github.com/Wackerbarth) tested this version on my Kossel Pro and Arduino 1.6.5 for Mac. +This configuration is a transition to merge Terence Tam's configuration with up-to-date Marlin source and a current Arduino IDE diff --git a/Marlin/src/config/examples/delta/kossel_xl/Configuration.h b/Marlin/src/config/examples/delta/kossel_xl/Configuration.h new file mode 100644 index 0000000000..a9234dae61 --- /dev/null +++ b/Marlin/src/config/examples/delta/kossel_xl/Configuration.h @@ -0,0 +1,2097 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(oxivanisher)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "Kossel k800XL" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 2 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + #define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + // oXis Kossel k800 XL + #define DEFAULT_Kp 22.04 + #define DEFAULT_Ki 1.65 + #define DEFAULT_Kd 73.67 + + // Kossel k800 XL + //#define DEFAULT_Kp 22.25 + //#define DEFAULT_Ki 1.45 + //#define DEFAULT_Kd 85.30 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 15.00 + #define DEFAULT_bedKi .04 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Delta Settings ============================= +//=========================================================================== +// Enable DELTA kinematics and most of the default configuration for Deltas +#define DELTA + +#if ENABLED(DELTA) + + // Make delta curves from many straight lines (linear interpolation). + // This is a trade-off between visible corners (not enough segments) + // and processor overload (too many expensive sqrt calls). + #define DELTA_SEGMENTS_PER_SECOND 160 + + // Convert feedrates to apply to the Effector instead of the Carriages + #define DELTA_FEEDRATE_SCALING + + // After homing move down to a height where XY movement is unconstrained + //#define DELTA_HOME_TO_SAFE_ZONE + + // Delta calibration menu + // uncomment to add three points calibration menu option. + // See http://minow.blogspot.com/index.html#4918805519571907051 + //#define DELTA_CALIBRATION_MENU + + // uncomment to add G33 Delta Auto-Calibration (Enable EEPROM_SETTINGS to store results) + //#define DELTA_AUTO_CALIBRATION + + // NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them + + #if ENABLED(DELTA_AUTO_CALIBRATION) + // set the default number of probe points : n*n (1 -> 7) + #define DELTA_CALIBRATION_DEFAULT_POINTS 4 + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) || ENABLED(DELTA_CALIBRATION_MENU) + // Set the radius for the calibration probe points - max DELTA_PRINTABLE_RADIUS for non-eccentric probes + #define DELTA_CALIBRATION_RADIUS 121.5 // mm + // Set the steprate for papertest probing + #define PROBE_MANUALLY_STEP 0.05 // mm + #endif + + // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). + #define DELTA_PRINTABLE_RADIUS 140.0 // mm + + // Center-to-center distance of the holes in the diagonal push rods. + #define DELTA_DIAGONAL_ROD 319.5 // mm + + // height from z=0 to home position + #define DELTA_HEIGHT 380.00 // get this value from auto calibrate + + #define DELTA_ENDSTOP_ADJ { 0.0, 0.0, 0.0 } // get these from auto calibrate + + // Horizontal distance bridged by diagonal push rods when effector is centered. + #define DELTA_RADIUS 174.1 //mm Get this value from auto calibrate + + // Trim adjustments for individual towers + // tower angle corrections for X and Y tower / rotate XYZ so Z tower angle = 0 + // measured in degrees anticlockwise looking from above the printer + #define DELTA_TOWER_ANGLE_TRIM { 0.0, 0.0, 0.0 } // get these values from auto calibrate + + // delta radius and diaginal rod adjustments measured in mm + //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } + //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } + +#endif + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG // a Z probe +#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +//#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + #define ENDSTOPPULLUP_XMAX + #define ENDSTOPPULLUP_YMAX + #define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + #define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +// variables to calculate steps +#define XYZ_FULL_STEPS_PER_ROTATION 200 +#define XYZ_MICROSTEPS 16 +#define XYZ_BELT_PITCH 2 +#define XYZ_PULLEY_TEETH 16 + +// delta speeds must be the same on xyz +#define DEFAULT_XYZ_STEPS_PER_UNIT ((XYZ_FULL_STEPS_PER_ROTATION) * (XYZ_MICROSTEPS) / double(XYZ_BELT_PITCH) / double(XYZ_PULLEY_TEETH)) +#define DEFAULT_AXIS_STEPS_PER_UNIT { DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, DEFAULT_XYZ_STEPS_PER_UNIT, 158 } // default steps per unit for PowerWasp + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 200, 200, 200, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 9000, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 2000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK DEFAULT_XJERK +#define DEFAULT_ZJERK DEFAULT_XJERK // Must be same as XY for delta +#define DEFAULT_EJERK 20.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 0.0 // Z probe to nozzle X offset: -left +right +#define Y_PROBE_OFFSET_FROM_EXTRUDER 0.0 // Z probe to nozzle Y offset: -front +behind +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0.3 // Z probe to nozzle Z offset: -below (always!) + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Allen key retractable z-probe as seen on many Kossel delta printers - http://reprap.org/wiki/Kossel#Automatic_bed_leveling_probe + * Deploys by touching z-axis belt. Retracts by pushing the probe down. Uses Z_MIN_PIN. + */ +//#define Z_PROBE_ALLEN_KEY + +#if ENABLED(Z_PROBE_ALLEN_KEY) + // 2 or 3 sets of coordinates for deploying and retracting the spring loaded touch probe on G29, + // if servo actuated touch probe is not defined. Uncomment as appropriate for your printer/probe. + + //#define Z_PROBE_ALLEN_KEY_DEPLOY_1_X 30.0 + //#define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y DELTA_PRINTABLE_RADIUS + //#define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z 100.0 + //#define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE XY_PROBE_SPEED + + //#define Z_PROBE_ALLEN_KEY_DEPLOY_2_X 0.0 + //#define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y DELTA_PRINTABLE_RADIUS + //#define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z 100.0 + //#define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE (XY_PROBE_SPEED)/10 + + //#define Z_PROBE_ALLEN_KEY_DEPLOY_3_X Z_PROBE_ALLEN_KEY_DEPLOY_2_X * 0.75 + //#define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y Z_PROBE_ALLEN_KEY_DEPLOY_2_Y * 0.75 + //#define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + //#define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE XY_PROBE_SPEED + + //#define Z_PROBE_ALLEN_KEY_STOW_1_X -64.0 // Move the probe into position + //#define Z_PROBE_ALLEN_KEY_STOW_1_Y 56.0 + //#define Z_PROBE_ALLEN_KEY_STOW_1_Z 23.0 + //#define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE XY_PROBE_SPEED + + //#define Z_PROBE_ALLEN_KEY_STOW_2_X -64.0 // Push it down + //#define Z_PROBE_ALLEN_KEY_STOW_2_Y 56.0 + //#define Z_PROBE_ALLEN_KEY_STOW_2_Z 3.0 + //#define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE (XY_PROBE_SPEED)/10 + + //#define Z_PROBE_ALLEN_KEY_STOW_3_X -64.0 // Move it up to clear + //#define Z_PROBE_ALLEN_KEY_STOW_3_Y 56.0 + //#define Z_PROBE_ALLEN_KEY_STOW_3_Z 50.0 + //#define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE XY_PROBE_SPEED + + //#define Z_PROBE_ALLEN_KEY_STOW_4_X 0.0 + //#define Z_PROBE_ALLEN_KEY_STOW_4_Y 0.0 + //#define Z_PROBE_ALLEN_KEY_STOW_4_Z Z_PROBE_ALLEN_KEY_STOW_3_Z + //#define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE XY_PROBE_SPEED + +#endif // Z_PROBE_ALLEN_KEY + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 20 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 10 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 10 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false // DELTA does not invert +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 // deltas always home to max +#define Y_HOME_DIR 1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) +#define Y_BED_SIZE ((DELTA_PRINTABLE_RADIUS) * 2) + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Y_MIN_POS -(DELTA_PRINTABLE_RADIUS) +#define Z_MIN_POS 0 +#define X_MAX_POS DELTA_PRINTABLE_RADIUS +#define Y_MAX_POS DELTA_PRINTABLE_RADIUS +#define Z_MAX_POS MANUAL_Z_HOME_POS + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +//#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + //#define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + // Works best with 5 or more points in each dimension. + #define GRID_MAX_POINTS_X 5 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS + MIN_PROBE_EDGE) + //#define RIGHT_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE) + //#define FRONT_PROBE_BED_POSITION -(DELTA_PRINTABLE_RADIUS + MIN_PROBE_EDGE) + //#define BACK_PROBE_BED_POSITION DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +#define MANUAL_Z_HOME_POS DELTA_HEIGHT // Distance between the nozzle to printbed after homing + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Delta only homes to Z +#define HOMING_FEEDRATE_Z (60*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), 0, 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h new file mode 100644 index 0000000000..4c78080b62 --- /dev/null +++ b/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h @@ -0,0 +1,1699 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 2 +#define Y_HOME_BUMP_MM 2 +#define Z_HOME_BUMP_MM 2 // deltas need the same for all three axes +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE_XYZ 50*60 + #define MANUAL_FEEDRATE { MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, MANUAL_FEEDRATE_XYZ, 60 } // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +// (don't use SLOWDOWN with DELTA because DELTA generates hundreds of segments per second) +//#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/delta/kossel_xl/README.md b/Marlin/src/config/examples/delta/kossel_xl/README.md new file mode 100644 index 0000000000..1cabcdb3fe --- /dev/null +++ b/Marlin/src/config/examples/delta/kossel_xl/README.md @@ -0,0 +1,21 @@ +# Configuration for Kossel k800 XL +This example configuration is for a Kossel XL with a printable bed diameter of 280mm and a height of 380mm. It also has the auto bed leveling probe (with an endstop switch) and the heated bed activated. + +## Configuration +You might need (or want) to edit at least the following settings in `Configuration.h`: +* `MANUAL_Z_HOME_POS` - The available height of your printing space. Auto Bed Leveling makes it less important to have the exact value. +* `DELTA_PRINTABLE_RADIUS` - The printable radius is how far from the center the nozzle can reach. +* `DEFAULT_AXIS_STEPS_PER_UNIT` - Steps-per-millimeter for the delta steppers, and for the extruder [to optimize the amount of filament flow](http://zennmaster.com/makingstuff/reprap-101-calibrating-your-extruder-part-1-e-steps). + +### Fine tuning +* Increase `DELTA_RADIUS` if the model comes out convex (with a bulge in the middle) +* Increase `DELTA_DIAGONAL_ROD` if the model comes out larger than expected + +### [http://reprap.org/wiki/PID_Tuning](PID Tuning) +* `DEFAULT_Kp` - The proportional term +* `DEFAULT_Ki` - The integral term +* `DEFAULT_Kd` - The derivative term + +### PSU Options +* The power supply is configured to 2 (to use a relay to switch 12V on and off) +* It is configured to be off by default diff --git a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h new file mode 100644 index 0000000000..9e8610c5e6 --- /dev/null +++ b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h @@ -0,0 +1,1986 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + //#define MOTHERBOARD BOARD_RAMPS_14_EEF + #define MOTHERBOARD BOARD_RAMPS_14_EFB // gMax users please note: This is a Roxy modification. I print on glass and + // I use Marlin to control the bed's temperature. So, if you have a single nozzle + // machine, this will work fine for you. You just set the + // #define TEMP_SENSOR_BED 75 to 0 down below so Marlin doesn't mess with the bed + // temp. +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "gMax" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 75 // gMax-1.5+ users please note: This is a Roxy modification to the printer. I want + // to print on glass. And I'm using a 400mm x 400mm silicon heat pad powered through + // a Fortek SSR to do it. If you are using an unaltered gCreate machine, this needs + // to be set to 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 16 // (seconds) +#define TEMP_HYSTERESIS 12 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 5 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 245 +#define HEATER_1_MAXTEMP 245 +#define HEATER_2_MAXTEMP 245 +#define HEATER_3_MAXTEMP 245 +#define HEATER_4_MAXTEMP 245 +#define BED_MAXTEMP 115 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // gMax J-Head + #define DEFAULT_Kp 15.35 + #define DEFAULT_Ki 0.85 + #define DEFAULT_Kd 69.45 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 135.44 + #define DEFAULT_bedKi 24.60 + #define DEFAULT_bedKd 186.40 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +//#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +//#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 96 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 25, 25 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 800, 800, 700, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 400 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 400 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 8.5 +#define DEFAULT_YJERK 8.5 +#define DEFAULT_ZJERK 0.7 +#define DEFAULT_EJERK 4.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +#define BLTOUCH +#if ENABLED(BLTOUCH) + #define BLTOUCH_DELAY 500 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -17 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -0.25 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 45 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 7500 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 6 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 6 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR true +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +#define Z_HOMING_HEIGHT 10 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR 1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 420 // These numbers are not accurate for an unaltered gMax 1.5+ printer. My print bed +#define Y_BED_SIZE 420 // is inset a noticable amount from the edge of the bed. Combined with the inset, + // the nozzle can reach all cordinates of the mesh. + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 500 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +//#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + #define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.5 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.3 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + #define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 45 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + #define PROBE_PT_1_X 53 + #define PROBE_PT_1_Y 323 + #define PROBE_PT_2_X 53 + #define PROBE_PT_2_Y 63 + #define PROBE_PT_3_X 348 + #define PROBE_PT_3_Y 211 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2 - 8) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2 - 4) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (60*60) +#define HOMING_FEEDRATE_Z (14*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +//#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +#define ENCODER_PULSES_PER_STEP 1 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +#define ENCODER_STEPS_PER_MENU_ITEM 5 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +#define NUM_SERVOS 2 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300, 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h new file mode 100644 index 0000000000..620c4b5171 --- /dev/null +++ b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 50 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 3 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 50 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 50 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 0 // usually set to 120 seconds +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + #define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 3 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + #define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 32 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.5 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/gCreate/gMax1.5+/_Bootscreen.h b/Marlin/src/config/examples/gCreate/gMax1.5+/_Bootscreen.h new file mode 100644 index 0000000000..9fa6b953af --- /dev/null +++ b/Marlin/src/config/examples/gCreate/gMax1.5+/_Bootscreen.h @@ -0,0 +1,100 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Custom Boot Screen bitmap + * + * Place this file in the root with your configuration files + * and enable SHOW_CUSTOM_BOOTSCREEN in Configuration.h. + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#define CUSTOM_BOOTSCREEN_BMPWIDTH 112 + +const unsigned char custom_start_bmp[] PROGMEM = { + B11111111,B11111111,B11111111,B11111111,B11111110,B00000000,B00111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00011000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00011000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000001,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00110001,B00000000,B00000000,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001,B11111001,B00000000,B00000000,B00000011,B11111000,B00000000,B00000000,B00000001,B11000000,B00000001, + B10000000,B00000000,B00000000,B00000110,B01001101,B00000000,B00000000,B00000111,B00111000,B00000000,B00000000,B00000001,B11000000,B00000001, + B10000000,B00000000,B00000000,B00001100,B00100110,B00000000,B00000111,B01100111,B00111001,B11010011,B11100001,B11110011,B11100111,B11000001, + B10000000,B00000000,B00000000,B00011001,B00010010,B00000000,B00001111,B11100111,B00111001,B11110111,B11110011,B11111011,B11101111,B11100001, + B10000000,B00000000,B00000000,B00110111,B11001110,B00000000,B00001110,B11100111,B00000001,B11110111,B01110011,B10111001,B11001110,B11100001, + B10000000,B00000000,B00000000,B01100100,B01100110,B00000000,B00001110,B11100111,B00000001,B11000111,B11110011,B10111001,B11001111,B11100001, + B10000000,B00000000,B00000000,B01001011,B10100110,B00000000,B00001110,B11100111,B00111001,B11000111,B11110000,B11111001,B11001111,B11100001, + B10000000,B00000000,B00000000,B11001010,B10110100,B00000000,B00001111,B11100111,B00111001,B11000111,B00000011,B11111001,B11001110,B00000001, + B10000000,B00000000,B00000000,B11001101,B10100100,B00000000,B00000110,B11100111,B00111001,B11000111,B01110011,B10111001,B11001110,B11100001, + B10000000,B00000000,B00000011,B10100110,B01101100,B00000000,B00000000,B11100111,B00111001,B11000111,B01110011,B10111001,B11001110,B11100001, + B10000000,B00000000,B11111111,B00010011,B11011000,B00000000,B00001110,B11100011,B11110001,B11000111,B11110011,B11111001,B11101111,B11100001, + B10000000,B00000001,B00100001,B10001000,B00011000,B00000000,B00001111,B11100001,B11100001,B11000011,B11100001,B10111001,B11100111,B11000001, + B10000000,B00000110,B01100001,B00010110,B00110000,B00000000,B00000111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000100,B01000001,B00100011,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000100,B11111110,B01000001,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00001011,B10000110,B10001111,B00000000,B00000000,B00000000,B00000000,B00111111,B00011111,B10000000,B00000000,B00000000,B00000001, + B10000000,B00011110,B00000001,B10011010,B00000000,B00000000,B00000000,B00000000,B00111111,B00011111,B10000000,B00000000,B00000000,B00000001, + B10000000,B00011100,B00000111,B00100010,B00000000,B00000000,B00000111,B10111100,B00111111,B10011111,B10000001,B11111000,B11110001,B11100001, + B10000000,B00001000,B00011111,B11100010,B00000000,B00000000,B00001111,B11111100,B00111111,B10111111,B10000111,B11111110,B01110001,B11000001, + B10000000,B00000000,B00110011,B01100010,B00000000,B00000000,B00001111,B00111100,B00111101,B10110111,B10000111,B10011110,B01111011,B11000001, + B10000000,B00000000,B11000010,B00100010,B00000000,B00000000,B00001111,B00111100,B00111101,B10110111,B10000111,B10011110,B01111011,B11000001, + B10000000,B00000000,B11000010,B00111110,B00000000,B00000000,B00001111,B00111100,B00111101,B11110111,B10000000,B01111110,B00111011,B10000001, + B10000000,B00000001,B11100110,B00011110,B00000000,B00000000,B00001111,B00111100,B00111101,B11110111,B10000011,B11111110,B00111111,B10000001, + B10000000,B00000001,B00111100,B00010010,B00000000,B00000000,B00001111,B00111100,B00111101,B11110111,B10000111,B10011110,B00111011,B10000001, + B10000000,B00000001,B00011100,B00100110,B00000000,B00000000,B00001111,B11111100,B00111101,B11110111,B10000111,B10011110,B01111011,B11000001, + B10000000,B00000001,B01110000,B01100100,B00000000,B00000000,B00000111,B10111100,B00111100,B11100111,B10000111,B10011110,B01111011,B11000001, + B10000000,B00000011,B11000000,B01011000,B00000000,B00000000,B00000000,B00111100,B00111100,B11100111,B10000111,B11111110,B01110001,B11000001, + B10000000,B00001101,B10000000,B11110000,B00000000,B00000000,B00001111,B00111100,B00111100,B11100111,B10000011,B11011110,B11110001,B11100001, + B10000000,B00011010,B00000000,B11100000,B00000000,B00000000,B00001111,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00100110,B00000000,B01000000,B00000000,B00000000,B00000011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B01001100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B10110010,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000001,B00000110,B00000000,B00000000,B00000000,B00000000,B00000111,B00011100,B00000011,B11000000,B00100000,B00010000,B00000000,B00000001, + B10000011,B00100100,B00000000,B00000000,B00000000,B00000000,B00001000,B10010010,B00000010,B00100000,B00000000,B00010000,B00000000,B00000001, + B00000010,B00100100,B00000000,B00000000,B00000000,B00000000,B00000000,B10010001,B00000010,B00100011,B00100111,B00111001,B10001100,B11100001, + B00000110,B00111000,B00000000,B00000000,B00000000,B00000000,B00000011,B00010001,B00000011,B11000010,B00100100,B10010010,B01001001,B00000001, + B00000100,B01010000,B00000000,B00000000,B00000000,B00000000,B00000000,B10010001,B00000010,B00000010,B00100100,B10010011,B11001000,B11000001, + B00001101,B10100000,B00000000,B00000000,B00000000,B00000000,B00001000,B10010010,B00000010,B00000010,B00100100,B10010010,B00001000,B00100001, + B00001000,B11100000,B00000000,B00000000,B00000000,B00000000,B00000111,B00011100,B00000010,B00000010,B00100100,B10011001,B11001001,B11000001, + B00011000,B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B00010000,B00110000,B00000000,B00011100,B00000000,B00000000,B00000000,B00001100,B00011000,B00001111,B11100000,B00001111,B00000000,B00000001, + B00110000,B00100000,B00000000,B00110111,B00000000,B00000000,B00000000,B00010010,B00100100,B00001000,B00010000,B00001001,B00000000,B00000001, + B00100000,B00110000,B00000000,B01101101,B10000000,B00000000,B00000000,B00010010,B00100100,B00001001,B10001000,B00001001,B00000000,B00000001, + B00010000,B00011000,B00011111,B01100000,B11000000,B00000000,B00000000,B00010010,B00100100,B00001001,B01001000,B00001001,B00000000,B00000001, + B00110000,B00001100,B00111001,B11100000,B01100000,B00000000,B00000000,B00010010,B00100100,B00001001,B10010000,B00001001,B00000000,B00000001, + B00110000,B00000111,B10010000,B01110000,B01100000,B00000000,B00000000,B00010010,B00100100,B00001000,B01100000,B00001001,B00000000,B00000001, + B00010000,B00010110,B11110000,B00011000,B00100000,B00000000,B00000000,B00010010,B00100100,B00001000,B00010000,B00001001,B00000000,B00000001, + B00011010,B00010000,B01100000,B00001000,B00110000,B00000000,B00000000,B00010010,B00100100,B00001001,B11001000,B00001001,B00000000,B00000001, + B00001011,B00001001,B10000000,B00000000,B00110000,B00000000,B00000000,B00010010,B00100100,B00001001,B00100100,B00001001,B00000000,B00000001, + B00001110,B00000111,B10000000,B00000000,B00010000,B00000000,B00000000,B00010011,B11100100,B10001001,B11000100,B10001001,B11111001,B00000001, + B00000110,B00011110,B01000000,B00010000,B00010000,B00000000,B00000000,B00010000,B00000101,B11001000,B00001001,B11001000,B00001011,B10000001, + B00000110,B00000000,B01000000,B00100000,B00010000,B00000000,B00000000,B00001111,B11111000,B10001111,B11110000,B10001111,B11111001,B00000001, + B00000011,B10000000,B00000000,B00100000,B00110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B00000001,B11111111,B11111111,B11111111,B11100000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111 +}; diff --git a/Marlin/src/config/examples/makibox/Configuration.h b/Marlin/src/config/examples/makibox/Configuration.h new file mode 100644 index 0000000000..1f6b8bacfd --- /dev/null +++ b/Marlin/src/config/examples/makibox/Configuration.h @@ -0,0 +1,1975 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_5DPRINT +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 12 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 175 // limits duty cycle to bed; 255=full current +// This limit is set to 175 by default in the Makibox configuration and it can be adjusted +// to increase the heatup rate. However, if changed, be aware of the safety concerns of +// drawing too much current from the power supply. + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 400, 400, 400, 163 } // default steps per unit for ***** MakiBox A6 ***** + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 60, 60, 20, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 2000, 2000, 30, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 110 +#define Y_BED_SIZE 150 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 86 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY 1500 +#define HOMING_FEEDRATE_Z (2*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/makibox/Configuration_adv.h b/Marlin/src/config/examples/makibox/Configuration_adv.h new file mode 100644 index 0000000000..9c2767b080 --- /dev/null +++ b/Marlin/src/config/examples/makibox/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 4 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.7, 1.7, 1.7, 1.7 } // 5DPRINT + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + //#define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/stm32f103ret6/Configuration.h b/Marlin/src/config/examples/stm32f103ret6/Configuration.h new file mode 100644 index 0000000000..f3783fb1e9 --- /dev/null +++ b/Marlin/src/config/examples/stm32f103ret6/Configuration.h @@ -0,0 +1,1974 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "Victor Perez" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION "STM32F103RET6 board" // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_STM32F1R +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +#define CUSTOM_MACHINE_NAME "CTC i3 Pro B" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 3 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#warning temp_sensor set to 998/999 (fake) +#define TEMP_SENSOR_0 999 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 998 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 60 +#define DUMMY_THERMISTOR_999_VALUE 205 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 180 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + #define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + // Ultimaker + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#warning "disabled temperature protection" +//#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +//#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 78.74, 78.74, 2560, 105.0 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 400, 400, 2, 45 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1400, 1400, 100, 80000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1400 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 5000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 13.0 +#define DEFAULT_YJERK 13.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 180 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +//#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 60 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 220 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/tvrrug/Round2/Configuration.h b/Marlin/src/config/examples/tvrrug/Round2/Configuration.h new file mode 100644 index 0000000000..40f23dda38 --- /dev/null +++ b/Marlin/src/config/examples/tvrrug/Round2/Configuration.h @@ -0,0 +1,1967 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_OMCA +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 1 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 5 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 0 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + // J-Head Mk V-B + #define DEFAULT_Kp 25.05 + #define DEFAULT_Ki 2.30 + #define DEFAULT_Kd 68.15 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 71.1, 71.1, 2560, 600 } // David TVRR + +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 79.87, 79.87, 2566, 563.78 } // Al's TVRR +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 81.26, 80.01, 2561, 599.14 } // Michel TVRR old +//#define DEFAULT_AXIS_STEPS_PER_UNIT { 71.1, 71.1, 2560, 739.65 } // Michel TVRR + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 500, 500, 5, 45 } // David TVRR + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 9000, 9000, 100, 10000 } + +/* MICHEL: This has an impact on the "ripples" in print walls */ + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 500 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 10.0 +#define DEFAULT_YJERK 10.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER -25 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER -29 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 15 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 1 +#define Y_ENABLE_ON 1 +#define Z_ENABLE_ON 1 +#define E_ENABLE_ON 1 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR true + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 205 +#define Y_BED_SIZE 205 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 120 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +//#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 255 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 100 +#define PREHEAT_2_FAN_SPEED 255 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +//#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h b/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h new file mode 100644 index 0000000000..e762501ba9 --- /dev/null +++ b/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h @@ -0,0 +1,1697 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + #define CONTROLLER_FAN_PIN 23 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 1 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 60 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro) +//#define DIGIPOT_I2C +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT + #define DIGIPOT_I2C_ADDRESS_B 0x2D // unshifted slave address for second DIGIPOT +#endif + +//#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +//#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + //#define USER_DESC_5 "Home & Info" + //#define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/config/examples/wt150/Configuration.h b/Marlin/src/config/examples/wt150/Configuration.h new file mode 100644 index 0000000000..1c69b77c25 --- /dev/null +++ b/Marlin/src/config/examples/wt150/Configuration.h @@ -0,0 +1,1977 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + * + */ +#ifndef CONFIGURATION_H +#define CONFIGURATION_H +#define CONFIGURATION_H_VERSION 020000 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * http://reprap.org/wiki/Calibration + * http://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * http://www.thingiverse.com/thing:5573 + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * http://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. +#define STRING_CONFIG_H_AUTHOR "(none, wt150)" // Who made the changes. +#define SHOW_BOOTSCREEN +#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 +#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Enable to show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Enable to show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 115200 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_MIGHTYBOARD_REVE +#endif + +// Optional custom name for your RepStrap or other custom machine +// Displayed in the LCD "Ready" message +//#define CUSTOM_MACHINE_NAME "Weistek WT150" + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +//#define MACHINE_UUID "5f0bb7a3-0e14-428c-812b-15ab0d3ecc71" + +// @section extruder + +// This defines the number of extruders +// :[1, 2, 3, 4, 5] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER +#if ENABLED(PARKING_EXTRUDER) + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // Delay (ms) for magnetic field. No delay if 0 or not defined. + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // mm to move beyond the parking point to grab the extruder + #define PARKING_EXTRUDER_SECURITY_RAISE 5 // Z-raise before parking +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD +#if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #define SWITCHING_TOOLHEAD_SECURITY_RAISE 5 // (mm) Z-raise before parking +#endif + +/** + * "Mixing Extruder" + * - Adds a new code, M165, to set the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware M163, M164, and virtual extruder. + * - This implementation supports only a single extruder. + * - Enable DIRECT_MIXING_IN_G1 for Pia Taubert's reference implementation + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X {0.0, 20.00} // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y {0.0, 5.00} // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z {0.0, 0.00} // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN + * + * 0 = No Power Switch + * 1 = ATX + * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + * + * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } + */ +#define POWER_SUPPLY 0 + +#if POWER_SUPPLY > 0 + // Enable this option to leave the PSU off at startup. + // Power to steppers and heaters will need to be turned on with M80. + //#define PS_DEFAULT_OFF + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define POWER_TIMEOUT 30 + #endif + +#endif + +// @section temperature + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -4 : thermocouple with AD8495 + * -3 : thermocouple with MAX31855 (only for sensor 0) + * -2 : thermocouple with MAX6675 (only for sensor 0) + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan & J-Head) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 20 : the PT100 circuit found in the Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + * + * :{ '0': "Not used", '1':"100k / 4.7k - EPCOS", '2':"200k / 4.7k - ATC Semitec 204GT-2", '3':"Mendel-parts / 4.7k", '4':"10k !! do not use for a hotend. Bad resolution at high temp. !!", '5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '501':"100K Zonestar (Tronxy X3A)", '6':"100k / 4.7k EPCOS - Not as accurate as Table 1", '7':"100k / 4.7k Honeywell 135-104LAG-J01", '8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT", '9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1", '10':"100k / 4.7k RS 198-961", '11':"100k / 4.7k beta 3950 1%", '12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)", '13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'", '20':"PT100 (Ultimainboard V2.x)", '51':"100k / 1k - EPCOS", '52':"200k / 1k - ATC Semitec 204GT-2", '55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)", '60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950", '66':"Dyze Design 4.7M High Temperature thermistor", '70':"the 100K thermistor found in the bq Hephestos 2", '71':"100k / 4.7k Honeywell 135-104LAF-J01", '147':"Pt100 / 4.7k", '1047':"Pt1000 / 4.7k", '110':"Pt100 / 1k (non-standard)", '1010':"Pt1000 / 1k (non standard)", '-4':"Thermocouple + AD8495", '-3':"Thermocouple + MAX31855 (only for sensor 0)", '-2':"Thermocouple + MAX6675 (only for sensor 0)", '-1':"Thermocouple + AD595",'998':"Dummy 1", '999':"Dummy 2" } + */ +#define TEMP_SENSOR_0 -2 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Extruder temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// Bed temperature must be close to target for this long before M190 returns success +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) +#define TEMP_BED_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_BED_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + +// The minimal temperature defines the temperature below which the heater will not be enabled It is used +// to check that the wiring to the thermistor is not broken. +// Otherwise this would lead to the heater being powered on all the time. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define BED_MINTEMP 5 + +// When temperature exceeds max temp, your heater will be switched off. +// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! +// You should use MINTEMP for thermistor short/failure protection. +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: http://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop +#if ENABLED(PIDTEMP) + //#define PID_AUTOTUNE_MENU // Add PID Autotune to the LCD "Temperature" menu to run M303 and apply the result. + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + + // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + + //WT150, based on: M303 E0 S220 C8 + #define DEFAULT_Kp 22.10 + #define DEFAULT_Ki 1.10 + #define DEFAULT_Kd 110.78 + + // Ultimaker + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 + + // MakerGear + //#define DEFAULT_Kp 7.0 + //#define DEFAULT_Ki 0.1 + //#define DEFAULT_Kd 12 + + // Mendel Parts V9 on 12V + //#define DEFAULT_Kp 63.0 + //#define DEFAULT_Ki 2.25 + //#define DEFAULT_Kd 440 + +#endif // PIDTEMP + +//=========================================================================== +//============================= PID > Bed Temperature Control =============== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from pidautotune + //#define DEFAULT_bedKp 97.1 + //#define DEFAULT_bedKi 1.41 + //#define DEFAULT_bedKd 1675.16 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +//#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +//#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2208, TMC2208_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE'] + */ +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Filter + * + * Enable this option if endstops falsely trigger due to noise. + * NOTE: Enabling this feature means adds an error of +/-0.2mm, so homing + * will end up at a slightly different position on each G28. This will also + * reduce accuracy of some bed probes. + * For mechanical switches, the better approach to reduce noise is to install + * a 100 nanofarads ceramic capacitor in parallel with the switch, making it + * essentially noise-proof without sacrificing accuracy. + * This option also increases MCU load when endstops or the probe are enabled. + * So this is not recommended. USE AT YOUR OWN RISK. + * (This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, since they already include the 100nF capacitor.) + */ +//#define ENDSTOP_NOISE_FILTER + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 71.699959, 71.699959, 71.699959, 100.470955 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_FEEDRATE { 83.333333, 83.333333, 19.5, 26.666666 } + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] + */ +#define DEFAULT_MAX_ACCELERATION { 1200, 1200, 100, 10000 } + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 1200 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 1200 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 1200 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +#define DEFAULT_XJERK 8.0 +#define DEFAULT_YJERK 8.0 +#define DEFAULT_ZJERK 0.3 +#define DEFAULT_EJERK 5.0 + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See http://marlinfw.org/docs/configuration/probes.html +// + +/** + * Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + * + * Enable this option for a probe connected to the Z Min endstop pin. + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +/** + * Z_MIN_PROBE_ENDSTOP + * + * Enable this option for a probe connected to any pin except Z-Min. + * (By default Marlin assumes the Z-Max endstop pin.) + * To use a custom Z Probe pin, set Z_MIN_PROBE_PIN below. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + * + * WARNING: Setting the wrong pin may have unexpected and potentially + * disastrous consequences. Use with caution and do your homework. + * + */ +//#define Z_MIN_PROBE_ENDSTOP + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES {70,0} // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH +#if ENABLED(BLTOUCH) + //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Z Probe to nozzle (X,Y) offset, relative to (0, 0). + * X and Y offsets must be integers. + * + * In the following example the X and Y offsets are both positive: + * #define X_PROBE_OFFSET_FROM_EXTRUDER 10 + * #define Y_PROBE_OFFSET_FROM_EXTRUDER 10 + * + * +-- BACK ---+ + * | | + * L | (+) P | R <-- probe (20,20) + * E | | I + * F | (-) N (+) | G <-- nozzle (10,10) + * T | | H + * | (-) | T + * | | + * O-- FRONT --+ + * (0,0) + */ +#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] +#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] +#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] + +// Certain types of probes need to stay away from edges +#define MIN_PROBE_EDGE 10 + +// X and Y axis travel speed (mm/m) between probes +#define XY_PROBE_SPEED 8000 + +// Feedrate (mm/m) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/m) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +// The number of probes to perform at each point. +// Set to 2 for a fast/slow probe, using the second probe result. +// Set to 3 or more for slow probes, averaging the results. +//#define MULTIPLE_PROBING 2 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with Z_PROBE_OFFSET_FROM_EXTRUDER, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis stepper immediately when it's not being used. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +// Warn on display about possibly reduced accuracy +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true // Keep only the active extruder enabled. + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR true +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (in mm) Minimal z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure you have this distance over your Z_MAX_POS in case. + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR 1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 150 +#define Y_BED_SIZE 150 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 143.0 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + * By default the firmware assumes HIGH=FILAMENT PRESENT. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + #define FILAMENT_RUNOUT_SCRIPT "M600" +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205.0 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60.0 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #endif + +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Set the boundaries for probing (where the probe can reach). + //#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE - (MIN_PROBE_EDGE)) + //#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE + //#define BACK_PROBE_BED_POSITION (Y_BED_SIZE - (MIN_PROBE_EDGE)) + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if ENABLED(AUTO_BED_LEVELING_3POINT) || ENABLED(AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // Z Range centered on Z_MIN_POS for LCD Z adjustment +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET 30 // (mm) An inset for corner leveling + //#define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing when homing all axes (G28). +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2) // X point for Z homing when homing all axes (G28). + #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2) // Y point for Z homing when homing all axes (G28). +#endif + +// Homing speeds (mm/m) +#define HOMING_FEEDRATE_XY (50*60) +#define HOMING_FEEDRATE_Z (4*60) + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +// +// EEPROM +// +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// +#define EEPROM_SETTINGS // Enable for M500 and M501 commands +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// M100 Free Memory Watcher +// +//#define M100_FREE_MEMORY_WATCHER // Add M100 (Free Memory Watcher) to debug memory usage + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +//#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + #define NOZZLE_PARK_XY_FEEDRATE 100 // X and Y axes feedrate in mm/s (also used for delta printers Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // Z axis feedrate in mm/s (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + * + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions as { X, Y, Z } + #define NOZZLE_CLEAN_START_POINT { 30, 30, (Z_MIN_POS + 1)} + #define NOZZLE_CLEAN_END_POINT {100, 60, (Z_MIN_POS + 1)} + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Moves the nozzle to the initial position + #define NOZZLE_CLEAN_GOBACK +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, de, el, el-gr, es, eu, fi, fr, gl, hr, it, + * jp-kana, nl, pl, pt, pt-br, ru, sk, tr, uk, zh_CN, zh_TW, test + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'jp-kana':'Japanese', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'ru':'Russian', 'sk':'Slovak', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)', 'test':'TEST' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See http://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + * + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// http://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/Micromake-Makeboard-3D-Printer-Parts-3D-Printer-Mini-Display-1602-Mini-Controller-Compatible-with-Ramps-1/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2 wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: http://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// http://panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - http://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// http://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + //#define U8GLIB_SSD1306 + #define U8GLIB_SH1106 +#endif + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS MINI12864 with graphic controller and SD support +// http://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/Universal-LCD-12864-3D-Printer-Display-Screen-With-Encoder-For-CR-10-CR-7-Model/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +//#define ANET_FULL_GRAPHICS_LCD // Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 + // A clone of the RepRapDiscount full graphics display but with + // different pins/wiring (see pins_ANET_10.h). + +// +// MKS OLED 1.3" 128 × 64 FULL GRAPHICS CONTROLLER +// http://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/store/product/3D-printer-smart-controller-SMART-RAMPS-OR-RAMPS-1-4-LCD-12864-LCD-control-panel-green/2179173_32213636460.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// http://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// CONTROLLER TYPE: Standalone / Serial +// + +// +// LCD for Malyan M200 printers. +// +//#define MALYAN_LCD + +// +// CONTROLLER TYPE: Keypad / Add-on +// + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +// +// REPRAPWORLD_KEYPAD_MOVE_STEP sets how much should the robot move when a key +// is pressed, a value of 10.0 means 10mm per click. +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +//#define PHOTOGRAPH_PIN 23 + +// SkeinForge sends the wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For Neopixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The Neopixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + * + */ +//#define RGB_LED +//#define RGBW_LED + +#if ENABLED(RGB_LED) || ENABLED(RGBW_LED) + #define RGB_LED_R_PIN 34 + #define RGB_LED_G_PIN 43 + #define RGB_LED_B_PIN 35 + #define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit Neopixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin on motherboard 4 => D4 (EXP2-5 on Printrboard) / 30 => PC7 (EXP3-13 on Rumba) + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * R/C SERVO support + * Sponsored by TrinityLabs, Reworked by codexmas + */ + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Leave undefined or set to 0 to entirely disable the servo subsystem. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// Delay (in milliseconds) before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Allow servo angle to be edited and saved to EEPROM +//#define EDITABLE_SERVO_ANGLES + +#endif // CONFIGURATION_H diff --git a/Marlin/src/config/examples/wt150/Configuration_adv.h b/Marlin/src/config/examples/wt150/Configuration_adv.h new file mode 100644 index 0000000000..567bd706ef --- /dev/null +++ b/Marlin/src/config/examples/wt150/Configuration_adv.h @@ -0,0 +1,1698 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + * + */ +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H_VERSION 020000 + +// @section temperature + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) //heating power=Kc*(e_speed) + #define LPQ_MAX_LEN 50 + #endif +#endif + +/** + * Automatic Temperature: + * The hotend target temperature is calculated by all the buffered lines of gcode. + * The maximum buffered steps/sec of the extruder motor is called "se". + * Start autotemp mode with M109 S B F + * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by + * mintemp and maxtemp. Turn this off by executing M109 without F* + * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp. + * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 +#endif + +// Show extra position information in M114 +//#define M114_DETAIL + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // mm/m + #define EXTRUDER_RUNOUT_EXTRUDE 5 // mm +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan will turn on automatically whenever any stepper is enabled + * and turn off after a set period after all steppers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + #define CONTROLLERFAN_SECS 60 // Duration in seconds for the fan to run after all motors are disabled + #define CONTROLLERFAN_SPEED 255 // 255 == full speed +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +//#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // == full speed + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +//=========================================================================== +//============================ Mechanical Settings ========================== +//=========================================================================== + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +//#define Z_DUAL_STEPPER_DRIVERS +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) + //#define Z_DUAL_ENDSTOPS + #if ENABLED(Z_DUAL_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z_DUAL_ENDSTOPS_ADJUSTMENT 0 + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // set minimum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X1_MAX_POS X_BED_SIZE // set maximum to ensure first x-carriage doesn't hit the parked second X-carriage + #define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage + #define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // There are a few selectable movement modes for dual x-carriages using M605 S + // Mode 0 (DXC_FULL_CONTROL_MODE): Full control. The slicer has full control over both x-carriages and can achieve optimal travel results + // as long as it supports dual x-carriages. (M605 S0) + // Mode 1 (DXC_AUTO_PARK_MODE) : Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so + // that additional slicer support is not required. (M605 S1) + // Mode 2 (DXC_DUPLICATION_MODE) : Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all + // actions of the first x-carriage. This allows the printer to print 2 arbitrary items at + // once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_FULL_CONTROL_MODE + + // Default settings in "Auto-park Mode" + #define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder + #define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif // DUAL_X_CARRIAGE + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +// Homing hits each endstop, retracts by these distances, then does a slower bump. +#define X_HOME_BUMP_MM 5 +#define Y_HOME_BUMP_MM 5 +#define Z_HOME_BUMP_MM 2 +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) +//#define QUICK_HOME // If homing includes X and Y, do a diagonal move initially + +// When G28 is called, this option will make Y home before X +//#define HOME_Y_BEFORE_X + +// Enable this if X or Y can't home without homing the other axis first. +//#define CODEPENDENT_XY_HOMING + +// @section machine + +#define AXIS_RELATIVE_MODES {false, false, false, false} + +// Allow duplication mode with a basic dual-nozzle extruder +//#define DUAL_NOZZLE_DUPLICATION_MODE + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +// Default stepper release if idle. Set to 0 to deactivate. +// Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true. +// Time can be set by M18 and M84. +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // set to false if the nozzle will fall down on your printed part when print has finished. +#define DISABLE_INACTIVE_E true + +#define DEFAULT_MINIMUMFEEDRATE 0.0 // minimum feedrate +#define DEFAULT_MINTRAVELFEEDRATE 0.0 + +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated + +// @section lcd + +#if ENABLED(ULTIPANEL) + #define MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60} // Feedrates for manual moves along X, Y, Z, E from panel + #define MANUAL_E_MOVES_RELATIVE // Show LCD extruder moves as relative rather than absolute positions + #define ULTIPANEL_FEEDMULTIPLY // Comment to disable setting feedrate multiplier via encoder +#endif + +// @section extras + +// minimum time in microseconds that a movement needs to take if the buffer is emptied. +#define DEFAULT_MINSEGMENTTIME 20000 + +// If defined the movements slow down when the look ahead buffer is only half full +#define SLOWDOWN + +// Frequency limit +// See nophead's blog for more info +// Not working O +//#define XY_FREQUENCY_LIMIT 15 + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/sec) + +// +// Use Junction Deviation instead of traditional Jerk Limiting +// +//#define JUNCTION_DEVIATION +#if ENABLED(JUNCTION_DEVIATION) + #define JUNCTION_DEVIATION_MM 0.02 // (mm) Distance from real junction edge +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +// Microstep setting (Only functional when stepper driver microstep pins are connected to MCU. +#define MICROSTEP_MODES { 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +// Uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro +#define DIGIPOT_I2C + +#if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A) // Default to settings in pins_XXXX.h files + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + #define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address for DIGIPOT (5E <- 2F << 1) + //#define DIGIPOT_I2C_ADDRESS_B 0x2D // one DIGIPOT on this board +#endif + +#define DIGIPOT_MCP4018 // Requires library from https://github.com/stawel/SlowSoftI2CMaster +#define DIGIPOT_I2C_NUM_CHANNELS 5 // 5DPRINT: 4 AZTEEG_X3_PRO: 8 MKS SBASE: 5 +// Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. +// These correspond to the physical drivers, so be mindful if the order is changed. +#define DIGIPOT_I2C_MOTOR_CURRENTS { 0.22, 0.22, 0.39, 0.42, 0.42 } // MIGHTYBOARD_REVE + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +#define ENCODER_RATE_MULTIPLIER // If defined, certain menu edit operations automatically multiply the steps when the encoder is moved quickly +#define ENCODER_10X_STEPS_PER_SEC 75 // If the encoder steps per sec exceeds this value, multiply steps moved x10 to quickly advance the value +#define ENCODER_100X_STEPS_PER_SEC 160 // If the encoder steps per sec exceeds this value, multiply steps moved x100 to really quickly advance the value + +//#define CHDK 4 //Pin for triggering CHDK to take a picture see how to use it here http://captain-slow.dk/2014/03/09/3d-printing-timelapses/ +#define CHDK_DELAY 50 //How long in ms the pin should stay HIGH before going LOW again + +// @section lcd + +// Include a page of printer information in the LCD Main Menu +#define LCD_INFO_MENU + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +//#define LCD_SET_PROGRESS_MANUALLY + +#if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif +#endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + +/** + * LED Control Menu + * Enable this feature to add LED Control to the LCD menu + */ +//#define LED_CONTROL_MENU +#if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif +#endif // LED_CONTROL_MENU + +#if ENABLED(SDSUPPORT) + + // Some RAMPS and other boards don't detect when an SD card is inserted. You can work + // around this by connecting a push button or single throw switch to the pin defined + // as SD_DETECT_PIN in your board's pins definitions. + // This setting should be disabled unless you are using a push button, pulling the pin to ground. + // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER). + #define SD_DETECT_INVERTED + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + // Add an option in the menu to run all auto#.g files + //#define MENU_ADDAUTOSTART + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + +#endif // SDSUPPORT + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if ENABLED(DOGLCD) + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Enable to save many cycles by drawing a hollow frame on the Info Screen + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2300 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + #if ENABLED(U8GLIB_ST7920) + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + +#endif // DOGLCD + +// @section safety + +// The hardware watchdog should reset the microcontroller disabling all outputs, +// in case the firmware gets stuck and doesn't do temperature regulation. +#define USE_WATCHDOG + +#if ENABLED(USE_WATCHDOG) + // If you have a watchdog reboot in an ArduinoMega2560 then the device will hang forever, as a watchdog reset will leave the watchdog on. + // The "WATCHDOG_RESET_MANUAL" goes around this by not using the hardware reset. + // However, THIS FEATURE IS UNSAFE!, as it will only work if interrupts are disabled. And the code could hang in an interrupt routine with interrupts disabled. + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + #define BABYSTEP_MULTIPLICATOR 1 // Babysteps are very small. Increase for faster motion. + //#define BABYSTEP_ZPROBE_OFFSET // Enable to combine M851 and Babystepping + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See http://marlinfw.org/docs/features/lin_advance.html for full instructions. + * Mention @Sebastianv650 on GitHub to alert the author of any issues. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. +#endif + +// @section leveling + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + /** + * Specify an action command to send to the host on a recovery attempt or failure. + * Will be sent in the form '//action:ACTION_ON_G29_FAILURE', e.g. '//action:probe_failed'. + * The host must be configured to handle the action command. + */ + #define G29_ACTION_ON_RECOVER "probe_rewipe" + #define G29_ACTION_ON_FAILURE "probe_failed" +#endif + +// @section extras + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // Length of each arc segment + #define N_ARC_CORRECTION 25 // Number of intertpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +// G38.2 and G38.3 Probe Target +// Set MULTIPLE_PROBING if you want G38 to double touch +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + #define G38_MINIMUM_MOVE 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move) +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 1 : Minimum for A4988, A5984, and LV8729 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 500000 : Maximum for A4988 stepper driver + * 400000 : Maximum for TMC2xxx stepper drivers + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 130000 : Maximum for LV8729 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section hidden + +// The number of linear motions that can be in the plan at any give time. +// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering. +#if ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller +#else + #define BLOCK_BUFFER_SIZE 16 // maximize block buffer +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// @section extras + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + * + */ +//#define FWRETRACT // ONLY PARTIALLY TESTED +#if ENABLED(FWRETRACT) + #define MIN_AUTORETRACT 0.1 // When auto-retract is on, convert E moves of this length and over + #define MAX_AUTORETRACT 10.0 // Upper limit for auto-retract conversion + #define RETRACT_LENGTH 3 // Default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 // Default swap retract length (positive mm), for extruder change + #define RETRACT_FEEDRATE 45 // Default feedrate for retracting (mm/s) + #define RETRACT_ZLIFT 0 // Default retract Z-lift + #define RETRACT_RECOVER_LENGTH 0 // Default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // Default additional swap recover length (mm, added to retract length when recovering from extruder change) + #define RETRACT_RECOVER_FEEDRATE 8 // Default feedrate for recovering from retraction (mm/s) + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // Default feedrate for recovering from swap retraction (mm/s) +#endif + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +//#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_RETRACT_LENGTH 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + + //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #define X_MAX_CURRENT 1000 // in mA + #define X_SENSE_RESISTOR 91 // in mOhms + #define X_MICROSTEPS 16 // number of microsteps + + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130 stepper drivers in SPI mode connect your SPI pins to + * the hardware SPI interface on your board and define the required CS pins + * in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * The TMC2130Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2130Stepper + * + * To use TMC2208 stepper UART-configurable stepper drivers + * connect #_SERIAL_TX_PIN to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN + * to PDN_UART without a resistor. + * The drivers can also be used with hardware serial. + * + * The TMC2208Stepper library is required for this stepper driver. + * https://github.com/teemuatlut/TMC2208Stepper + */ +#if HAS_TRINAMIC + + #define R_SENSE 0.11 // R_sense resistor for SilentStepStick2130 + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #define X_CURRENT 800 // rms current in mA. Multiply by 1.41 for peak current. + #define X_MICROSTEPS 16 // 0..256 + + #define Y_CURRENT 800 + #define Y_MICROSTEPS 16 + + #define Z_CURRENT 800 + #define Z_MICROSTEPS 16 + + #define X2_CURRENT 800 + #define X2_MICROSTEPS 16 + + #define Y2_CURRENT 800 + #define Y2_MICROSTEPS 16 + + #define Z2_CURRENT 800 + #define Z2_MICROSTEPS 16 + + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + + /** + * Use software SPI for TMC2130. + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP + + /** + * Monitor Trinamic TMC2130 and TMC2208 drivers for error conditions, + * like overtemperature and short to ground. TMC2208 requires hardware serial. + * In the case of overtemperature Marlin can decrease the driver current until error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant g-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 S0/1 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP needs to be enabled. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + + /** + * Use stallGuard2 to sense an obstacle and trigger an endstop. + * You need to place a wire from the driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_HOMING_SENSITIVITY is used for tuning the trigger sensitivity. + * Higher values make the system LESS sensitive. + * Lower value make the system MORE sensitive. + * Too low values can lead to false positives, while too high values will collide the axis without triggering. + * It is advised to set X/Y/Z_HOME_BUMP_MM to 0. + * M914 X/Y/Z to live tune the setting + */ + //#define SENSORLESS_HOMING // TMC2130 only + + #if ENABLED(SENSORLESS_HOMING) + #define X_HOMING_SENSITIVITY 8 + #define Y_HOMING_SENSITIVITY 8 + #define Z_HOMING_SENSITIVITY 8 + #endif + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * M915 Z Axis Calibration + * + * - Adjust Z stepper current, + * - Drive the Z axis to its physical maximum, and + * - Home Z to account for the lost steps. + * + * Use M915 Snn to specify the current. + * Use M925 Znn to add extra Z height to Z_MAX_POS. + */ + //#define TMC_Z_CALIBRATION + #if ENABLED(TMC_Z_CALIBRATION) + #define CALIBRATION_CURRENT 250 + #define CALIBRATION_EXTRA_HEIGHT 10 + #endif + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMC2130Stepper + * https://github.com/teemuatlut/TMC2208Stepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_temp_prewarn(1); \ + * stepperY.interpolate(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // TMC2130 || TMC2208 + +// @section L6470 + +/** + * L6470 Stepper Driver options + * + * The Arduino-L6470 library is required for this stepper driver. + * https://github.com/ameyer/Arduino-L6470 + */ +#if HAS_DRIVER(L6470) + + #define X_MICROSTEPS 16 // number of microsteps + #define X_OVERCURRENT 2000 // maxc current in mA. If the current goes over this value, the driver will switch off + #define X_STALLCURRENT 1500 // current in mA where the driver will detect a stall + + #define X2_MICROSTEPS 16 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + + #define Y_MICROSTEPS 16 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + + #define Y2_MICROSTEPS 16 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + + #define Z_MICROSTEPS 16 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + + #define Z2_MICROSTEPS 16 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + + #define E0_MICROSTEPS 16 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + + #define E1_MICROSTEPS 16 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + + #define E2_MICROSTEPS 16 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + + #define E3_MICROSTEPS 16 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + + #define E4_MICROSTEPS 16 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + +#endif // L6470 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +// @section i2cbus + +//#define EXPERIMENTAL_I2CBUS +#define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave + +// @section extras + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See http://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_LASER_ENABLE +#if ENABLED(SPINDLE_LASER_ENABLE) + + #define SPINDLE_LASER_ENABLE_INVERT false // set to "true" if the on/off function is reversed + #define SPINDLE_LASER_PWM true // set to true if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT true // set to "true" if the speed/power goes up when you want it to go slower + #define SPINDLE_LASER_POWERUP_DELAY 5000 // delay in milliseconds to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // delay in milliseconds to allow the spindle to stop + #define SPINDLE_DIR_CHANGE true // set to true if your spindle controller supports changing spindle direction + #define SPINDLE_INVERT_DIR false + #define SPINDLE_STOP_ON_DIR_CHANGE true // set to true if Marlin should stop the spindle before changing rotation direction + + /** + * The M3 & M4 commands use the following equation to convert PWM duty cycle to speed/power + * + * SPEED/POWER = PWM duty cycle * SPEED_POWER_SLOPE + SPEED_POWER_INTERCEPT + * where PWM duty cycle varies from 0 to 255 + * + * set the following for your controller (ALL MUST BE SET) + */ + + #define SPEED_POWER_SLOPE 118.4 + #define SPEED_POWER_INTERCEPT 0 + #define SPEED_POWER_MIN 5000 + #define SPEED_POWER_MAX 30000 // SuperPID router controller 0 - 30,000 RPM + + //#define SPEED_POWER_SLOPE 0.3922 + //#define SPEED_POWER_INTERCEPT 0 + //#define SPEED_POWER_MIN 10 + //#define SPEED_POWER_MAX 100 // 0-100% +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * M43 - display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + */ +//#define PINS_DEBUGGING + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter. + */ + //#define VOLUMETRIC_DEFAULT_ON +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for PLA" + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for ABS" + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Specify an action command to send to the host when the printer is killed. + * Will be sent in the form '//action:ACTION_ON_KILL', e.g. '//action:poweroff'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_KILL "poweroff" + +/** + * Specify an action command to send to the host on pause and resume. + * Will be sent in the form '//action:ACTION_ON_PAUSE', e.g. '//action:pause'. + * The host must be configured to handle the action command. + */ +//#define ACTION_ON_PAUSE "pause" +//#define ACTION_ON_RESUME "resume" + +//=========================================================================== +//====================== I2C Position Encoder Settings ====================== +//=========================================================================== + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: http://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: http://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: http://reliabuild3d.com/ + * + * Reilabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behaviour. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Do a test pattern at initialization (Set to 2 for spiral) + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behaviour is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT +#if ENABLED(WIFISUPPORT) + #define WIFI_SSID "Wifi SSID" + #define WIFI_PWD "Wifi Password" +#endif + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +#endif // CONFIGURATION_ADV_H diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index da7d15ec33..d52af3594f 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include "macros.h" +#ifndef BOARDS_H +#define BOARDS_H #define BOARD_UNKNOWN -1 @@ -29,370 +29,216 @@ // RAMPS 1.3 / 1.4 - ATmega1280, ATmega2560 // -#define BOARD_RAMPS_OLD 1000 // MEGA/RAMPS up to 1.2 +#define BOARD_RAMPS_OLD 3 // MEGA/RAMPS up to 1.2 -#define BOARD_RAMPS_13_EFB 1010 // RAMPS 1.3 (Power outputs: Hotend, Fan, Bed) -#define BOARD_RAMPS_13_EEB 1011 // RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Bed) -#define BOARD_RAMPS_13_EFF 1012 // RAMPS 1.3 (Power outputs: Hotend, Fan0, Fan1) -#define BOARD_RAMPS_13_EEF 1013 // RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Fan) -#define BOARD_RAMPS_13_SF 1014 // RAMPS 1.3 (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS_13_EFB 33 // RAMPS 1.3 (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_13_EEB 34 // RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_13_EFF 35 // RAMPS 1.3 (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_13_EEF 36 // RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_13_SF 38 // RAMPS 1.3 (Power outputs: Spindle, Controller Fan) -#define BOARD_RAMPS_14_EFB 1020 // RAMPS 1.4 (Power outputs: Hotend, Fan, Bed) -#define BOARD_RAMPS_14_EEB 1021 // RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Bed) -#define BOARD_RAMPS_14_EFF 1022 // RAMPS 1.4 (Power outputs: Hotend, Fan0, Fan1) -#define BOARD_RAMPS_14_EEF 1023 // RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Fan) -#define BOARD_RAMPS_14_SF 1024 // RAMPS 1.4 (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS_14_EFB 43 // RAMPS 1.4 (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_14_EEB 44 // RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_14_EFF 45 // RAMPS 1.4 (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_14_EEF 46 // RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_14_SF 48 // RAMPS 1.4 (Power outputs: Spindle, Controller Fan) -#define BOARD_RAMPS_PLUS_EFB 1030 // RAMPS Plus 3DYMY (Power outputs: Hotend, Fan, Bed) -#define BOARD_RAMPS_PLUS_EEB 1031 // RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Bed) -#define BOARD_RAMPS_PLUS_EFF 1032 // RAMPS Plus 3DYMY (Power outputs: Hotend, Fan0, Fan1) -#define BOARD_RAMPS_PLUS_EEF 1033 // RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Fan) -#define BOARD_RAMPS_PLUS_SF 1034 // RAMPS Plus 3DYMY (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS_PLUS_EFB 143 // RAMPS Plus 3DYMY (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_PLUS_EEB 144 // RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_PLUS_EFF 145 // RAMPS Plus 3DYMY (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_PLUS_EEF 146 // RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_PLUS_SF 148 // RAMPS Plus 3DYMY (Power outputs: Spindle, Controller Fan) // // RAMPS Derivatives - ATmega1280, ATmega2560 // -#define BOARD_3DRAG 1100 // 3Drag Controller -#define BOARD_K8200 1101 // Velleman K8200 Controller (derived from 3Drag Controller) -#define BOARD_K8400 1102 // Velleman K8400 Controller (derived from 3Drag Controller) -#define BOARD_K8600 1103 // Velleman K8600 Controller (Vertex Nano) -#define BOARD_K8800 1104 // Velleman K8800 Controller (Vertex Delta) -#define BOARD_BAM_DICE 1105 // 2PrintBeta BAM&DICE with STK drivers -#define BOARD_BAM_DICE_DUE 1106 // 2PrintBeta BAM&DICE Due with STK drivers -#define BOARD_MKS_BASE 1107 // MKS BASE v1.0 -#define BOARD_MKS_BASE_14 1108 // MKS BASE v1.4 with Allegro A4982 stepper drivers -#define BOARD_MKS_BASE_15 1109 // MKS BASE v1.5 with Allegro A4982 stepper drivers -#define BOARD_MKS_BASE_16 1110 // MKS BASE v1.6 with Allegro A4982 stepper drivers -#define BOARD_MKS_BASE_HEROIC 1111 // MKS BASE 1.0 with Heroic HR4982 stepper drivers -#define BOARD_MKS_GEN_13 1112 // MKS GEN v1.3 or 1.4 -#define BOARD_MKS_GEN_L 1113 // MKS GEN L -#define BOARD_KFB_2 1114 // BigTreeTech or BIQU KFB2.0 -#define BOARD_ZRIB_V20 1115 // zrib V2.0 control board (Chinese knock off RAMPS replica) -#define BOARD_FELIX2 1116 // Felix 2.0+ Electronics Board (RAMPS like) -#define BOARD_RIGIDBOARD 1117 // Invent-A-Part RigidBoard -#define BOARD_RIGIDBOARD_V2 1118 // Invent-A-Part RigidBoard V2 -#define BOARD_SAINSMART_2IN1 1119 // Sainsmart 2-in-1 board -#define BOARD_ULTIMAKER 1120 // Ultimaker -#define BOARD_ULTIMAKER_OLD 1121 // Ultimaker (Older electronics. Pre 1.5.4. This is rare) -#define BOARD_AZTEEG_X3 1122 // Azteeg X3 -#define BOARD_AZTEEG_X3_PRO 1123 // Azteeg X3 Pro -#define BOARD_ULTIMAIN_2 1124 // Ultimainboard 2.x (Uses TEMP_SENSOR 20) -#define BOARD_RUMBA 1125 // Rumba -#define BOARD_RUMBA_RAISE3D 1126 // Raise3D N series Rumba derivative -#define BOARD_RL200 1127 // Rapide Lite 200 (v1, low-cost RUMBA clone with drv) -#define BOARD_FORMBOT_TREX2PLUS 1128 // Formbot T-Rex 2 Plus -#define BOARD_FORMBOT_TREX3 1129 // Formbot T-Rex 3 -#define BOARD_FORMBOT_RAPTOR 1130 // Formbot Raptor -#define BOARD_FORMBOT_RAPTOR2 1131 // Formbot Raptor 2 -#define BOARD_BQ_ZUM_MEGA_3D 1132 // bq ZUM Mega 3D -#define BOARD_MAKEBOARD_MINI 1133 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake -#define BOARD_TRIGORILLA_13 1134 // TriGorilla Anycubic version 1.3-based on RAMPS EFB -#define BOARD_TRIGORILLA_14 1135 // ... Ver 1.4 -#define BOARD_TRIGORILLA_14_11 1136 // ... Rev 1.1 (new servo pin order) -#define BOARD_RAMPS_ENDER_4 1137 // Creality: Ender-4, CR-8 -#define BOARD_RAMPS_CREALITY 1138 // Creality: CR10S, CR20, CR-X -#define BOARD_RAMPS_DAGOMA 1139 // Dagoma F5 -#define BOARD_FYSETC_F6_13 1140 // FYSETC F6 1.3 -#define BOARD_FYSETC_F6_14 1141 // FYSETC F6 1.4 -#define BOARD_DUPLICATOR_I3_PLUS 1142 // Wanhao Duplicator i3 Plus -#define BOARD_VORON 1143 // VORON Design -#define BOARD_TRONXY_V3_1_0 1144 // Tronxy TRONXY-V3-1.0 -#define BOARD_Z_BOLT_X_SERIES 1145 // Z-Bolt X Series -#define BOARD_TT_OSCAR 1146 // TT OSCAR -#define BOARD_OVERLORD 1147 // Overlord/Overlord Pro -#define BOARD_HJC2560C_REV1 1148 // ADIMLab Gantry v1 -#define BOARD_HJC2560C_REV2 1149 // ADIMLab Gantry v2 -#define BOARD_TANGO 1150 // BIQU Tango V1 -#define BOARD_MKS_GEN_L_V2 1151 // MKS GEN L V2 -#define BOARD_MKS_GEN_L_V21 1152 // MKS GEN L V2.1 -#define BOARD_COPYMASTER_3D 1153 // Copymaster 3D -#define BOARD_ORTUR_4 1154 // Ortur 4 -#define BOARD_TENLOG_D3_HERO 1155 // Tenlog D3 Hero IDEX printer - -// -// RAMBo and derivatives -// - -#define BOARD_RAMBO 1200 // Rambo -#define BOARD_MINIRAMBO 1201 // Mini-Rambo -#define BOARD_MINIRAMBO_10A 1202 // Mini-Rambo 1.0a -#define BOARD_EINSY_RAMBO 1203 // Einsy Rambo -#define BOARD_EINSY_RETRO 1204 // Einsy Retro -#define BOARD_SCOOVO_X9H 1205 // abee Scoovo X9H +#define BOARD_3DRAG 77 // 3Drag Controller +#define BOARD_K8200 78 // Velleman K8200 Controller (derived from 3Drag Controller) +#define BOARD_K8400 79 // Velleman K8400 Controller (derived from 3Drag Controller) +#define BOARD_BAM_DICE 401 // 2PrintBeta BAM&DICE with STK drivers +#define BOARD_BAM_DICE_DUE 402 // 2PrintBeta BAM&DICE Due with STK drivers +#define BOARD_MKS_BASE 40 // MKS BASE v1.0 +#define BOARD_MKS_BASE_15 405 // MKS v1.5 with Allegro A4982 stepper drivers +#define BOARD_MKS_BASE_HEROIC 41 // MKS BASE 1.0 with Heroic HR4982 stepper drivers +#define BOARD_MKS_GEN_13 47 // MKS GEN v1.3 or 1.4 +#define BOARD_MKS_GEN_L 53 // MKS GEN L +#define BOARD_KFB_2 136 // Bigtreetech or BIQU KFB2.0 +#define BOARD_ZRIB_V20 504 // zrib V2.0 control board (Chinese knock off RAMPS replica) +#define BOARD_FELIX2 37 // Felix 2.0+ Electronics Board (RAMPS like) +#define BOARD_RIGIDBOARD 42 // Invent-A-Part RigidBoard +#define BOARD_RIGIDBOARD_V2 52 // Invent-A-Part RigidBoard V2 +#define BOARD_SAINSMART_2IN1 49 // Sainsmart 2-in-1 board +#define BOARD_ULTIMAKER 7 // Ultimaker +#define BOARD_ULTIMAKER_OLD 71 // Ultimaker (Older electronics. Pre 1.5.4. This is rare) +#define BOARD_AZTEEG_X3 67 // Azteeg X3 +#define BOARD_AZTEEG_X3_PRO 68 // Azteeg X3 Pro +#define BOARD_ULTIMAIN_2 72 // Ultimainboard 2.x (Uses TEMP_SENSOR 20) +#define BOARD_RUMBA 80 // Rumba +#define BOARD_FORMBOT_TREX2 81 // Formbot version 1 +#define BOARD_FORMBOT_TREX3 82 // Formbot T-Rex 3 revision +#define BOARD_BQ_ZUM_MEGA_3D 503 // bq ZUM Mega 3D +#define BOARD_MAKEBOARD_MINI 431 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake +#define BOARD_TRIGORILLA_13 343 // TriGorilla Anycubic version 1.3 based on RAMPS EFB +#define BOARD_TRIGORILLA_14 443 // TriGorilla Anycubic version 1.4 based on RAMPS EFB +#define BOARD_RAMPS_ENDER_4 243 // Creality: Ender-4, CR-8 // // Other ATmega1280, ATmega2560 // -#define BOARD_CNCONTROLS_11 1300 // Cartesio CN Controls V11 -#define BOARD_CNCONTROLS_12 1301 // Cartesio CN Controls V12 -#define BOARD_CNCONTROLS_15 1302 // Cartesio CN Controls V15 -#define BOARD_CHEAPTRONIC 1303 // Cheaptronic v1.0 -#define BOARD_CHEAPTRONIC_V2 1304 // Cheaptronic v2.0 -#define BOARD_MIGHTYBOARD_REVE 1305 // Makerbot Mightyboard Revision E -#define BOARD_MEGATRONICS 1306 // Megatronics -#define BOARD_MEGATRONICS_2 1307 // Megatronics v2.0 -#define BOARD_MEGATRONICS_3 1308 // Megatronics v3.0 -#define BOARD_MEGATRONICS_31 1309 // Megatronics v3.1 -#define BOARD_MEGATRONICS_32 1310 // Megatronics v3.2 -#define BOARD_ELEFU_3 1311 // Elefu Ra Board (v3) -#define BOARD_LEAPFROG 1312 // Leapfrog -#define BOARD_MEGACONTROLLER 1313 // Mega controller -#define BOARD_GT2560_REV_A 1314 // Geeetech GT2560 Rev. A -#define BOARD_GT2560_REV_A_PLUS 1315 // Geeetech GT2560 Rev. A+ (with auto level probe) -#define BOARD_GT2560_V3 1316 // Geeetech GT2560 Rev B for A10(M/D) -#define BOARD_GT2560_V3_MC2 1317 // Geeetech GT2560 Rev B for Mecreator2 -#define BOARD_GT2560_V3_A20 1318 // Geeetech GT2560 Rev B for A20(M/D) -#define BOARD_EINSTART_S 1319 // Einstart retrofit -#define BOARD_WANHAO_ONEPLUS 1320 // Wanhao 0ne+ i3 Mini -#define BOARD_LEAPFROG_XEED2015 1321 // Leapfrog Xeed 2015 -#define BOARD_PICA_REVB 1322 // PICA Shield (original version) -#define BOARD_PICA 1323 // PICA Shield (rev C or later) -#define BOARD_INTAMSYS40 1324 // Intamsys 4.0 (Funmat HT) +#define BOARD_CNCONTROLS_11 111 // Cartesio CN Controls V11 +#define BOARD_CNCONTROLS_12 112 // Cartesio CN Controls V12 +#define BOARD_CHEAPTRONIC 2 // Cheaptronic v1.0 +#define BOARD_CHEAPTRONIC_V2 21 // Cheaptronic v2.0 +#define BOARD_MIGHTYBOARD_REVE 200 // Makerbot Mightyboard Revision E +#define BOARD_MEGATRONICS 70 // Megatronics +#define BOARD_MEGATRONICS_2 701 // Megatronics v2.0 +#define BOARD_MEGATRONICS_3 703 // Megatronics v3.0 +#define BOARD_MEGATRONICS_31 704 // Megatronics v3.1 +#define BOARD_RAMBO 301 // Rambo +#define BOARD_MINIRAMBO 302 // Mini-Rambo +#define BOARD_MINIRAMBO_10A 303 // Mini-Rambo 1.0a +#define BOARD_EINSY_RAMBO 304 // Einsy Rambo +#define BOARD_EINSY_RETRO 305 // Einsy Retro +#define BOARD_ELEFU_3 21 // Elefu Ra Board (v3) +#define BOARD_LEAPFROG 999 // Leapfrog +#define BOARD_MEGACONTROLLER 310 // Mega controller +#define BOARD_SCOOVO_X9H 321 // abee Scoovo X9H +#define BOARD_GT2560_REV_A 74 // Geeetech GT2560 Rev. A +#define BOARD_GT2560_REV_A_PLUS 75 // Geeetech GT2560 Rev. A+ (with auto level probe) +#define BOARD_EINSTART_S 666 // Einstart retrofit // // ATmega1281, ATmega2561 // -#define BOARD_MINITRONICS 1400 // Minitronics v1.0/1.1 -#define BOARD_SILVER_GATE 1401 // Silvergate v1.0 +#define BOARD_MINITRONICS 702 // Minitronics v1.0/1.1 +#define BOARD_SILVER_GATE 25 // Silvergate v1.0 // // Sanguinololu and Derivatives - ATmega644P, ATmega1284P // -#define BOARD_SANGUINOLOLU_11 1500 // Sanguinololu < 1.2 -#define BOARD_SANGUINOLOLU_12 1501 // Sanguinololu 1.2 and above -#define BOARD_MELZI 1502 // Melzi -#define BOARD_MELZI_V2 1503 // Melzi V2 -#define BOARD_MELZI_MAKR3D 1504 // Melzi with ATmega1284 (MaKr3d version) -#define BOARD_MELZI_CREALITY 1505 // Melzi Creality3D board (for CR-10 etc) -#define BOARD_MELZI_MALYAN 1506 // Melzi Malyan M150 board -#define BOARD_MELZI_TRONXY 1507 // Tronxy X5S -#define BOARD_STB_11 1508 // STB V1.1 -#define BOARD_AZTEEG_X1 1509 // Azteeg X1 -#define BOARD_ANET_10 1510 // Anet 1.0 (Melzi clone) -#define BOARD_ZMIB_V2 1511 // ZoneStar ZMIB V2 +#define BOARD_SANGUINOLOLU_11 6 // Sanguinololu < 1.2 +#define BOARD_SANGUINOLOLU_12 62 // Sanguinololu 1.2 and above +#define BOARD_MELZI 63 // Melzi +#define BOARD_MELZI_MAKR3D 66 // Melzi with ATmega1284 (MaKr3d version) +#define BOARD_MELZI_CREALITY 89 // Melzi Creality3D board (for CR-10 etc) +#define BOARD_MELZI_MALYAN 92 // Melzi Malyan M150 board +#define BOARD_MELZI_TRONXY 505 // Tronxy X5S +#define BOARD_STB_11 64 // STB V1.1 +#define BOARD_AZTEEG_X1 65 // Azteeg X1 +#define BOARD_ANET_10 69 // Anet 1.0 (Melzi clone) // // Other ATmega644P, ATmega644, ATmega1284P // -#define BOARD_GEN3_MONOLITHIC 1600 // Gen3 Monolithic Electronics -#define BOARD_GEN3_PLUS 1601 // Gen3+ -#define BOARD_GEN6 1602 // Gen6 -#define BOARD_GEN6_DELUXE 1603 // Gen6 deluxe -#define BOARD_GEN7_CUSTOM 1604 // Gen7 custom (Alfons3 Version) "https://github.com/Alfons3/Generation_7_Electronics" -#define BOARD_GEN7_12 1605 // Gen7 v1.1, v1.2 -#define BOARD_GEN7_13 1606 // Gen7 v1.3 -#define BOARD_GEN7_14 1607 // Gen7 v1.4 -#define BOARD_OMCA_A 1608 // Alpha OMCA board -#define BOARD_OMCA 1609 // Final OMCA board -#define BOARD_SETHI 1610 // Sethi 3D_1 +#define BOARD_GEN3_MONOLITHIC 22 // Gen3 Monolithic Electronics +#define BOARD_GEN3_PLUS 9 // Gen3+ +#define BOARD_GEN6 5 // Gen6 +#define BOARD_GEN6_DELUXE 51 // Gen6 deluxe +#define BOARD_GEN7_CUSTOM 10 // Gen7 custom (Alfons3 Version) "https://github.com/Alfons3/Generation_7_Electronics" +#define BOARD_GEN7_12 11 // Gen7 v1.1, v1.2 +#define BOARD_GEN7_13 12 // Gen7 v1.3 +#define BOARD_GEN7_14 13 // Gen7 v1.4 +#define BOARD_OMCA_A 90 // Alpha OMCA board +#define BOARD_OMCA 91 // Final OMCA board +#define BOARD_SETHI 20 // Sethi 3D_1 // // Teensyduino - AT90USB1286, AT90USB1286P // -#define BOARD_TEENSYLU 1700 // Teensylu -#define BOARD_PRINTRBOARD 1701 // Printrboard (AT90USB1286) -#define BOARD_PRINTRBOARD_REVF 1702 // Printrboard Revision F (AT90USB1286) -#define BOARD_BRAINWAVE 1703 // Brainwave (AT90USB646) -#define BOARD_BRAINWAVE_PRO 1704 // Brainwave Pro (AT90USB1286) -#define BOARD_SAV_MKI 1705 // SAV Mk-I (AT90USB1286) -#define BOARD_TEENSY2 1706 // Teensy++2.0 (AT90USB1286) -#define BOARD_5DPRINT 1707 // 5DPrint D8 Driver Board +#define BOARD_TEENSYLU 8 // Teensylu +#define BOARD_PRINTRBOARD 81 // Printrboard (AT90USB1286) +#define BOARD_PRINTRBOARD_REVF 811 // Printrboard Revision F (AT90USB1286) +#define BOARD_BRAINWAVE 82 // Brainwave (AT90USB646) +#define BOARD_BRAINWAVE_PRO 85 // Brainwave Pro (AT90USB1286) +#define BOARD_SAV_MKI 83 // SAV Mk-I (AT90USB1286) +#define BOARD_TEENSY2 84 // Teensy++2.0 (AT90USB1286) +#define BOARD_5DPRINT 88 // 5DPrint D8 Driver Board // // LPC1768 ARM Cortex M3 // -#define BOARD_RAMPS_14_RE_ARM_EFB 2000 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend, Fan, Bed) -#define BOARD_RAMPS_14_RE_ARM_EEB 2001 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Bed) -#define BOARD_RAMPS_14_RE_ARM_EFF 2002 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend, Fan0, Fan1) -#define BOARD_RAMPS_14_RE_ARM_EEF 2003 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Fan) -#define BOARD_RAMPS_14_RE_ARM_SF 2004 // Re-ARM with RAMPS 1.4 (Power outputs: Spindle, Controller Fan) -#define BOARD_MKS_SBASE 2005 // MKS-Sbase (Power outputs: Hotend0, Hotend1, Bed, Fan) -#define BOARD_AZSMZ_MINI 2006 // AZSMZ Mini -#define BOARD_BIQU_BQ111_A4 2007 // BIQU BQ111-A4 (Power outputs: Hotend, Fan, Bed) -#define BOARD_SELENA_COMPACT 2008 // Selena Compact (Power outputs: Hotend0, Hotend1, Bed0, Bed1, Fan0, Fan1) -#define BOARD_BIQU_B300_V1_0 2009 // BIQU B300_V1.0 (Power outputs: Hotend0, Fan, Bed, SPI Driver) -#define BOARD_MKS_SGEN_L 2010 // MKS-SGen-L (Power outputs: Hotend0, Hotend1, Bed, Fan) -#define BOARD_GMARSH_X6_REV1 2011 // GMARSH X6 board, revision 1 prototype -#define BOARD_BTT_SKR_V1_1 2012 // BigTreeTech SKR v1.1 (Power outputs: Hotend0, Hotend1, Fan, Bed) -#define BOARD_BTT_SKR_V1_3 2013 // BigTreeTech SKR v1.3 (Power outputs: Hotend0, Hotend1, Fan, Bed) -#define BOARD_BTT_SKR_V1_4 2014 // BigTreeTech SKR v1.4 (Power outputs: Hotend0, Hotend1, Fan, Bed) - -// -// LPC1769 ARM Cortex M3 -// - -#define BOARD_MKS_SGEN 2500 // MKS-SGen (Power outputs: Hotend0, Hotend1, Bed, Fan) -#define BOARD_AZTEEG_X5_GT 2501 // Azteeg X5 GT (Power outputs: Hotend0, Hotend1, Bed, Fan) -#define BOARD_AZTEEG_X5_MINI 2502 // Azteeg X5 Mini (Power outputs: Hotend0, Bed, Fan) -#define BOARD_AZTEEG_X5_MINI_WIFI 2503 // Azteeg X5 Mini Wifi (Power outputs: Hotend0, Bed, Fan) -#define BOARD_COHESION3D_REMIX 2504 // Cohesion3D ReMix -#define BOARD_COHESION3D_MINI 2505 // Cohesion3D Mini -#define BOARD_SMOOTHIEBOARD 2506 // Smoothieboard -#define BOARD_TH3D_EZBOARD 2507 // TH3D EZBoard v1.0 -#define BOARD_BTT_SKR_V1_4_TURBO 2508 // BigTreeTech SKR v1.4 TURBO (Power outputs: Hotend0, Hotend1, Fan, Bed) -#define BOARD_MKS_SGEN_L_V2 2509 // MKS SGEN_L V2 (Power outputs: Hotend0, Hotend1, Bed, Fan) -#define BOARD_BTT_SKR_E3_TURBO 2510 // BigTreeTech SKR E3 Turbo (Power outputs: Hotend0, Hotend1, Bed, Fan0, Fan1) +#define BOARD_RAMPS_14_RE_ARM_EFB 1743 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_14_RE_ARM_EEB 1744 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_14_RE_ARM_EFF 1745 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_14_RE_ARM_EEF 1746 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_14_RE_ARM_SF 1748 // Re-ARM with RAMPS 1.4 (Power outputs: Spindle, Controller Fan) +#define BOARD_MKS_SBASE 1750 // MKS-Sbase (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_AZSMZ_MINI 1751 // AZSMZ Mini +#define BOARD_AZTEEG_X5_GT 1752 // Azteeg X5 GT (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_BIQU_BQ111_A4 1753 // BIQU BQ111-A4 (Power outputs: Hotend, Fan, Bed) +#define BOARD_SELENA_COMPACT 1754 // Selena Compact (Power outputs: Hotend0, Hotend1, Bed0, Bed1, Fan0, Fan1) +#define BOARD_COHESION3D_REMIX 1755 // Cohesion3D ReMix +#define BOARD_COHESION3D_MINI 1756 // Cohesion3D Mini +#define BOARD_SMOOTHIEBOARD 1757 // Smoothieboard +#define BOARD_AZTEEG_X5_MINI_WIFI 1758 // Azteeg X5 Mini (Power outputs: Hotend0, Bed, Fan) // // SAM3X8E ARM Cortex M3 // -#define BOARD_DUE3DOM 3000 // DUE3DOM for Arduino DUE -#define BOARD_DUE3DOM_MINI 3001 // DUE3DOM MINI for Arduino DUE -#define BOARD_RADDS 3002 // RADDS -#define BOARD_RAMPS_FD_V1 3003 // RAMPS-FD v1 -#define BOARD_RAMPS_FD_V2 3004 // RAMPS-FD v2 -#define BOARD_RAMPS_SMART_EFB 3005 // RAMPS-SMART (Power outputs: Hotend, Fan, Bed) -#define BOARD_RAMPS_SMART_EEB 3006 // RAMPS-SMART (Power outputs: Hotend0, Hotend1, Bed) -#define BOARD_RAMPS_SMART_EFF 3007 // RAMPS-SMART (Power outputs: Hotend, Fan0, Fan1) -#define BOARD_RAMPS_SMART_EEF 3008 // RAMPS-SMART (Power outputs: Hotend0, Hotend1, Fan) -#define BOARD_RAMPS_SMART_SF 3009 // RAMPS-SMART (Power outputs: Spindle, Controller Fan) -#define BOARD_RAMPS_DUO_EFB 3010 // RAMPS Duo (Power outputs: Hotend, Fan, Bed) -#define BOARD_RAMPS_DUO_EEB 3011 // RAMPS Duo (Power outputs: Hotend0, Hotend1, Bed) -#define BOARD_RAMPS_DUO_EFF 3012 // RAMPS Duo (Power outputs: Hotend, Fan0, Fan1) -#define BOARD_RAMPS_DUO_EEF 3013 // RAMPS Duo (Power outputs: Hotend0, Hotend1, Fan) -#define BOARD_RAMPS_DUO_SF 3014 // RAMPS Duo (Power outputs: Spindle, Controller Fan) -#define BOARD_RAMPS4DUE_EFB 3015 // RAMPS4DUE (Power outputs: Hotend, Fan, Bed) -#define BOARD_RAMPS4DUE_EEB 3016 // RAMPS4DUE (Power outputs: Hotend0, Hotend1, Bed) -#define BOARD_RAMPS4DUE_EFF 3017 // RAMPS4DUE (Power outputs: Hotend, Fan0, Fan1) -#define BOARD_RAMPS4DUE_EEF 3018 // RAMPS4DUE (Power outputs: Hotend0, Hotend1, Fan) -#define BOARD_RAMPS4DUE_SF 3019 // RAMPS4DUE (Power outputs: Spindle, Controller Fan) -#define BOARD_RURAMPS4D_11 3020 // RuRAMPS4Duo v1.1 (Power outputs: Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) -#define BOARD_RURAMPS4D_13 3021 // RuRAMPS4Duo v1.3 (Power outputs: Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) -#define BOARD_ULTRATRONICS_PRO 3022 // ReprapWorld Ultratronics Pro V1.0 -#define BOARD_ARCHIM1 3023 // UltiMachine Archim1 (with DRV8825 drivers) -#define BOARD_ARCHIM2 3024 // UltiMachine Archim2 (with TMC2130 drivers) -#define BOARD_ALLIGATOR 3025 // Alligator Board R2 -#define BOARD_CNCONTROLS_15D 3026 // Cartesio CN Controls V15 on DUE - -// -// SAM3X8C ARM Cortex M3 -// - -#define BOARD_PRINTRBOARD_G2 3100 // PRINTRBOARD G2 -#define BOARD_ADSK 3101 // Arduino DUE Shield Kit (ADSK) +#define BOARD_DUE3DOM 1411 // DUE3DOM for Arduino DUE +#define BOARD_DUE3DOM_MINI 1412 // DUE3DOM MINI for Arduino DUE +#define BOARD_RADDS 1502 // RADDS +#define BOARD_RAMPS_FD_V1 1503 // RAMPS-FD v1 +#define BOARD_RAMPS_FD_V2 1504 // RAMPS-FD v2 +#define BOARD_RAMPS_SMART_EFB 1523 // RAMPS-SMART (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_SMART_EEB 1524 // RAMPS-SMART (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_SMART_EFF 1525 // RAMPS-SMART (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_SMART_EEF 1526 // RAMPS-SMART (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_SMART_SF 1528 // RAMPS-SMART (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS_DUO_EFB 1533 // RAMPS Duo (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_DUO_EEB 1534 // RAMPS Duo (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_DUO_EFF 1535 // RAMPS Duo (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_DUO_EEF 1536 // RAMPS Duo (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_DUO_SF 1538 // RAMPS Duo (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS4DUE_EFB 1543 // RAMPS4DUE (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS4DUE_EEB 1544 // RAMPS4DUE (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS4DUE_EFF 1545 // RAMPS4DUE (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS4DUE_EEF 1546 // RAMPS4DUE (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS4DUE_SF 1548 // RAMPS4DUE (Power outputs: Spindle, Controller Fan) +#define BOARD_RURAMPS4D_11 1550 // RuRAMPS4Duo v1.1 (Power outputs: Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) +#define BOARD_RURAMPS4D_13 1551 // RuRAMPS4Duo v1.3 (Power outputs: Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) +#define BOARD_ULTRATRONICS_PRO 1560 // ReprapWorld Ultratronics Pro V1.0 +#define BOARD_ARCHIM2 1590 // UltiMachine Archim2 (with TMC2130 drivers) +#define BOARD_ALLIGATOR 1602 // Alligator Board R2 // // STM32 ARM Cortex-M3 // -#define BOARD_MALYAN_M200_V2 4000 // STM32F070CB STM32F0 controller -#define BOARD_MALYAN_M300 4001 // STM32F070-based delta -#define BOARD_STM32F103RE 4002 // STM32F103RE Libmaple-based STM32F1 controller -#define BOARD_MALYAN_M200 4003 // STM32C8T6 Libmaple-based STM32F1 controller -#define BOARD_STM3R_MINI 4004 // STM32F103RE Libmaple-based STM32F1 controller -#define BOARD_GTM32_PRO_VB 4005 // STM32F103VET6 controller -#define BOARD_GTM32_MINI 4006 // STM32F103VET6 controller -#define BOARD_GTM32_MINI_A30 4007 // STM32F103VET6 controller -#define BOARD_GTM32_REV_B 4008 // STM32F103VET6 controller -#define BOARD_MORPHEUS 4009 // STM32F103C8 / STM32F103CB Libmaple-based STM32F1 controller -#define BOARD_CHITU3D 4010 // Chitu3D (STM32F103RET6) -#define BOARD_MKS_ROBIN 4011 // MKS Robin (STM32F103ZET6) -#define BOARD_MKS_ROBIN_MINI 4012 // MKS Robin Mini (STM32F103VET6) -#define BOARD_MKS_ROBIN_NANO 4013 // MKS Robin Nano (STM32F103VET6) -#define BOARD_MKS_ROBIN_NANO_V2 4014 // MKS Robin Nano V2 (STM32F103VET6) -#define BOARD_MKS_ROBIN_LITE 4015 // MKS Robin Lite/Lite2 (STM32F103RCT6) -#define BOARD_MKS_ROBIN_LITE3 4016 // MKS Robin Lite3 (STM32F103RCT6) -#define BOARD_MKS_ROBIN_PRO 4017 // MKS Robin Pro (STM32F103ZET6) -#define BOARD_MKS_ROBIN_E3 4018 // MKS Robin E3 (STM32F103RCT6) -#define BOARD_MKS_ROBIN_E3D 4019 // MKS Robin E3D (STM32F103RCT6) -#define BOARD_MKS_ROBIN_E3P 4020 // MKS Robin E3p (STM32F103VET6) -#define BOARD_BTT_SKR_MINI_V1_1 4021 // BigTreeTech SKR Mini v1.1 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V1_0 4022 // BigTreeTech SKR Mini E3 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V1_2 4023 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) -#define BOARD_BTT_SKR_MINI_E3_V2_0 4024 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) -#define BOARD_BTT_SKR_E3_DIP 4025 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) -#define BOARD_JGAURORA_A5S_A1 4026 // JGAurora A5S A1 (STM32F103ZET6) -#define BOARD_FYSETC_AIO_II 4027 // FYSETC AIO_II -#define BOARD_FYSETC_CHEETAH 4028 // FYSETC Cheetah -#define BOARD_FYSETC_CHEETAH_V12 4029 // FYSETC Cheetah V1.2 -#define BOARD_LONGER3D_LK 4030 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 -#define BOARD_CCROBOT_MEEB_3DP 4031 // ccrobot-online.com MEEB_3DP (STM32F103RC) -#define BOARD_CHITU3D_V5 4032 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CHITU3D_V6 4033 // Chitu3D TronXY X5SA V5 Board -#define BOARD_CREALITY_V4 4034 // Creality v4.x (STM32F103RE) -#define BOARD_CREALITY_V427 4035 // Creality v4.2.7 (STM32F103RE) -#define BOARD_TRIGORILLA_PRO 4036 // Trigorilla Pro (STM32F103ZET6) -#define BOARD_FLY_MINI 4037 // FLY MINI (STM32F103RCT6) - -// -// ARM Cortex-M4F -// - -#define BOARD_TEENSY31_32 4100 // Teensy3.1 and Teensy3.2 -#define BOARD_TEENSY35_36 4101 // Teensy3.5 and Teensy3.6 +#define BOARD_STM32F1R 1800 // STM32R Libmaple based STM32F1 controller +#define BOARD_MALYAN_M200 1801 // STM32C8T6 Libmaple based stm32f1 controller +#define BOARD_STM3R_MINI 1803 // STM32 Libmaple based stm32f1 controller +#define BOARD_GTM32_PRO_VB 1805 // STM32f103VET6 controller +#define BOARD_MORPHEUS 1806 // STM32F103C8/STM32F103CB Libmaple based stm32f1 controller // // STM32 ARM Cortex-M4F // -#define BOARD_BEAST 4200 // STM32F4xxVxT6 Libmaple-based STM32F4 controller -#define BOARD_GENERIC_STM32F4 4201 // STM32 STM32GENERIC-based STM32F4 controller -#define BOARD_ARMED 4202 // Arm'ed STM32F4-based controller -#define BOARD_RUMBA32_V1_0 4203 // RUMBA32 STM32F446VET6 based controller from Aus3D -#define BOARD_RUMBA32_V1_1 4204 // RUMBA32 STM32F446VET6 based controller from Aus3D -#define BOARD_RUMBA32_MKS 4205 // RUMBA32 STM32F446VET6 based controller from Makerbase -#define BOARD_BLACK_STM32F407VE 4206 // BLACK_STM32F407VE -#define BOARD_BLACK_STM32F407ZE 4207 // BLACK_STM32F407ZE -#define BOARD_STEVAL_3DP001V1 4208 // STEVAL-3DP001V1 3D PRINTER BOARD -#define BOARD_BTT_SKR_PRO_V1_1 4209 // BigTreeTech SKR Pro v1.1 (STM32F407ZG) -#define BOARD_BTT_SKR_PRO_V1_2 4210 // BigTreeTech SKR Pro v1.2 (STM32F407ZG) -#define BOARD_BTT_BTT002_V1_0 4211 // BigTreeTech BTT002 v1.0 (STM32F407VG) -#define BOARD_BTT_GTR_V1_0 4212 // BigTreeTech GTR v1.0 (STM32F407IGT) -#define BOARD_LERDGE_K 4213 // Lerdge K (STM32F407ZG) -#define BOARD_LERDGE_S 4214 // Lerdge S (STM32F407VE) -#define BOARD_LERDGE_X 4215 // Lerdge X (STM32F407VE) -#define BOARD_VAKE403D 4216 // VAkE 403D (STM32F446VET6) -#define BOARD_FYSETC_S6 4217 // FYSETC S6 board -#define BOARD_FYSETC_S6_V2_0 4218 // FYSETC S6 v2.0 board -#define BOARD_FLYF407ZG 4219 // FLYF407ZG board (STM32F407ZG) -#define BOARD_MKS_ROBIN2 4220 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_TEENSY31_32 1552 // Teensy3.1 and Teensy3.2 +#define BOARD_TEENSY35_36 841 // Teensy3.5 and Teensy3.6 +#define BOARD_BEAST 1802 // STM32FxxxVxT6 Libmaple based stm32f4 controller +#define BOARD_STM32F4 1804 // STM32 STM32GENERIC based STM32F4 controller // // ARM Cortex M7 // -#define BOARD_THE_BORG 5000 // THE-BORG (Power outputs: Hotend0, Hotend1, Bed, Fan) -#define BOARD_REMRAM_V1 5001 // RemRam v1 -#define BOARD_TEENSY41 5002 // Teensy 4.1 -#define BOARD_T41U5XBB 5003 // T41U5XBB Teensy 4.1 breakout board -#define BOARD_NUCLEO_F767ZI 5004 // ST NUCLEO-F767ZI Dev Board +#define BOARD_THE_BORG 1860 // THE-BORG (Power outputs: Hotend0, Hotend1, Bed, Fan) // // Espressif ESP32 WiFi // +#define BOARD_ESP32 1900 -#define BOARD_ESPRESSIF_ESP32 6000 // Generic ESP32 -#define BOARD_MRR_ESPA 6001 // MRR ESPA board based on ESP32 (native pins only) -#define BOARD_MRR_ESPE 6002 // MRR ESPE board based on ESP32 (with I2S stepper stream) -#define BOARD_E4D_BOX 6003 // E4d@BOX +#define MB(board) (defined(BOARD_##board) && MOTHERBOARD==BOARD_##board) -// -// SAMD51 ARM Cortex M4 -// - -#define BOARD_AGCM4_RAMPS_144 6100 // RAMPS 1.4.4 - -// -// Custom board -// - -#define BOARD_CUSTOM 9998 // Custom pins definition for development and/or rare boards - -// -// Simulations -// - -#define BOARD_LINUX_RAMPS 9999 - -#define _MB_1(B) (defined(BOARD_##B) && MOTHERBOARD==BOARD_##B) -#define MB(V...) DO(MB,||,V) - -#define IS_MELZI MB(MELZI, MELZI_CREALITY, MELZI_MAKR3D, MELZI_MALYAN, MELZI_TRONXY, MELZI_V2) +#endif // __BOARDS_H diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h deleted file mode 100644 index 6ae1b9d8bb..0000000000 --- a/Marlin/src/core/debug_out.h +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Serial aliases for debugging. -// Include this header after defining DEBUG_OUT -// (or not) in a given .cpp file -// - -#undef DEBUG_SECTION -#undef DEBUG_PRINT_P -#undef DEBUG_ECHO_START -#undef DEBUG_ERROR_START -#undef DEBUG_CHAR -#undef DEBUG_ECHO -#undef DEBUG_DECIMAL -#undef DEBUG_ECHO_F -#undef DEBUG_ECHOLN -#undef DEBUG_ECHOPGM -#undef DEBUG_ECHOLNPGM -#undef DEBUG_ECHOPAIR -#undef DEBUG_ECHOPAIR_P -#undef DEBUG_ECHOPAIR_F -#undef DEBUG_ECHOPAIR_F_P -#undef DEBUG_ECHOLNPAIR -#undef DEBUG_ECHOLNPAIR_P -#undef DEBUG_ECHOLNPAIR_F -#undef DEBUG_ECHOLNPAIR_F_P -#undef DEBUG_ECHO_MSG -#undef DEBUG_ERROR_MSG -#undef DEBUG_EOL -#undef DEBUG_FLUSH -#undef DEBUG_POS -#undef DEBUG_XYZ -#undef DEBUG_DELAY -#undef DEBUG_SYNCHRONIZE - -#if DEBUG_OUT - - #include "debug_section.h" - #define DEBUG_SECTION(N,S,D) SectionLog N(PSTR(S),D) - - #define DEBUG_PRINT_P(P) serialprintPGM(P) - #define DEBUG_ECHO_START SERIAL_ECHO_START - #define DEBUG_ERROR_START SERIAL_ERROR_START - #define DEBUG_CHAR SERIAL_CHAR - #define DEBUG_ECHO SERIAL_ECHO - #define DEBUG_DECIMAL SERIAL_DECIMAL - #define DEBUG_ECHO_F SERIAL_ECHO_F - #define DEBUG_ECHOLN SERIAL_ECHOLN - #define DEBUG_ECHOPGM SERIAL_ECHOPGM - #define DEBUG_ECHOLNPGM SERIAL_ECHOLNPGM - #define DEBUG_ECHOPAIR SERIAL_ECHOPAIR - #define DEBUG_ECHOPAIR_P SERIAL_ECHOPAIR_P - #define DEBUG_ECHOPAIR_F SERIAL_ECHOPAIR_F - #define DEBUG_ECHOPAIR_F_P SERIAL_ECHOPAIR_F_P - #define DEBUG_ECHOLNPAIR SERIAL_ECHOLNPAIR - #define DEBUG_ECHOLNPAIR_P SERIAL_ECHOLNPAIR_P - #define DEBUG_ECHOLNPAIR_F SERIAL_ECHOLNPAIR_F - #define DEBUG_ECHOLNPAIR_F_P SERIAL_ECHOLNPAIR_F_P - #define DEBUG_ECHO_MSG SERIAL_ECHO_MSG - #define DEBUG_ERROR_MSG SERIAL_ERROR_MSG - #define DEBUG_EOL SERIAL_EOL - #define DEBUG_FLUSH SERIAL_FLUSH - #define DEBUG_POS SERIAL_POS - #define DEBUG_XYZ SERIAL_XYZ - #define DEBUG_DELAY(ms) serial_delay(ms) - #define DEBUG_SYNCHRONIZE() planner.synchronize() - -#else - - #define DEBUG_SECTION(...) NOOP - #define DEBUG_PRINT_P(P) NOOP - #define DEBUG_ECHO_START() NOOP - #define DEBUG_ERROR_START() NOOP - #define DEBUG_CHAR(...) NOOP - #define DEBUG_ECHO(...) NOOP - #define DEBUG_DECIMAL(...) NOOP - #define DEBUG_ECHO_F(...) NOOP - #define DEBUG_ECHOLN(...) NOOP - #define DEBUG_ECHOPGM(...) NOOP - #define DEBUG_ECHOLNPGM(...) NOOP - #define DEBUG_ECHOPAIR(...) NOOP - #define DEBUG_ECHOPAIR_P(...) NOOP - #define DEBUG_ECHOPAIR_F(...) NOOP - #define DEBUG_ECHOPAIR_F_P(...) NOOP - #define DEBUG_ECHOLNPAIR(...) NOOP - #define DEBUG_ECHOLNPAIR_P(...) NOOP - #define DEBUG_ECHOLNPAIR_F(...) NOOP - #define DEBUG_ECHOLNPAIR_F_P(...) NOOP - #define DEBUG_ECHO_MSG(...) NOOP - #define DEBUG_ERROR_MSG(...) NOOP - #define DEBUG_EOL() NOOP - #define DEBUG_FLUSH() NOOP - #define DEBUG_POS(...) NOOP - #define DEBUG_XYZ(...) NOOP - #define DEBUG_DELAY(...) NOOP - #define DEBUG_SYNCHRONIZE() NOOP - -#endif - -#undef DEBUG_OUT diff --git a/Marlin/src/core/debug_section.h b/Marlin/src/core/debug_section.h deleted file mode 100644 index 7f39bc7424..0000000000 --- a/Marlin/src/core/debug_section.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "serial.h" -#include "../module/motion.h" - -class SectionLog { -public: - SectionLog(PGM_P const msg=nullptr, bool inbug=true) { - the_msg = msg; - if ((debug = inbug)) echo_msg(PSTR(">>>")); - } - - ~SectionLog() { if (debug) echo_msg(PSTR("<<<")); } - -private: - PGM_P the_msg; - bool debug; - - void echo_msg(PGM_P const pre) { - serialprintPGM(pre); - if (the_msg) { - SERIAL_CHAR(' '); - serialprintPGM(the_msg); - } - SERIAL_CHAR(' '); - print_xyz(current_position); - } -}; diff --git a/Marlin/src/core/drivers.h b/Marlin/src/core/drivers.h index 3a0e620923..6ba0df7d49 100644 --- a/Marlin/src/core/drivers.h +++ b/Marlin/src/core/drivers.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,182 +16,56 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once -// -// Included by MarlinConfigPre.h ahead of Configuration_adv.h. -// Don't use #if in this file for anything not defined early! -// +#include "../inc/MarlinConfigPre.h" -#define _A4988 0x4988 -#define _A5984 0x5984 -#define _DRV8825 0x8825 -#define _LV8729 0x8729 -#define _L6470 0x6470 -#define _L6474 0x6474 -#define _L6480 0x6480 -#define _POWERSTEP01 0xF00D -#define _TB6560 0x6560 -#define _TB6600 0x6600 -#define _TMC2100 0x2100 -#define _TMC2130 0x2130A -#define _TMC2130_STANDALONE 0x2130B -#define _TMC2160 0x2160A -#define _TMC2160_STANDALONE 0x2160B -#define _TMC2208 0x2208A -#define _TMC2208_STANDALONE 0x2208B -#define _TMC2209 0x2209A -#define _TMC2209_STANDALONE 0x2209B -#define _TMC26X 0x2600A -#define _TMC26X_STANDALONE 0x2600B -#define _TMC2660 0x2660A -#define _TMC2660_STANDALONE 0x2660B -#define _TMC5130 0x5130A -#define _TMC5130_STANDALONE 0x5130B -#define _TMC5160 0x5160A -#define _TMC5160_STANDALONE 0x5160B +#define A4988 0x001 +#define A5984 0x002 +#define DRV8825 0x003 +#define LV8729 0x004 +#define L6470 0x105 +#define TB6560 0x006 +#define TB6600 0x007 +#define TMC2100 0x008 +#define TMC2130 0x109 +#define TMC2130_STANDALONE 0x009 +#define TMC2208 0x10A +#define TMC2208_STANDALONE 0x00A +#define TMC26X 0x10B +#define TMC26X_STANDALONE 0x00B +#define TMC2660 0x10C +#define TMC2660_STANDALONE 0x00C -#define _DRIVER_ID(V) _CAT(_, V) -#define _AXIS_DRIVER_TYPE(A,T) (_DRIVER_ID(A##_DRIVER_TYPE) == _DRIVER_ID(T)) +#define _AXIS_DRIVER_TYPE(A,T) ( defined(A##_DRIVER_TYPE) && (A##_DRIVER_TYPE == T) ) #define AXIS_DRIVER_TYPE_X(T) _AXIS_DRIVER_TYPE(X,T) #define AXIS_DRIVER_TYPE_Y(T) _AXIS_DRIVER_TYPE(Y,T) #define AXIS_DRIVER_TYPE_Z(T) _AXIS_DRIVER_TYPE(Z,T) - -#define AXIS_DRIVER_TYPE_X2(T) (EITHER(X_DUAL_STEPPER_DRIVERS, DUAL_X_CARRIAGE) && _AXIS_DRIVER_TYPE(X2,T)) +#define AXIS_DRIVER_TYPE_X2(T) (ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE)) && _AXIS_DRIVER_TYPE(X2,T) #define AXIS_DRIVER_TYPE_Y2(T) (ENABLED(Y_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Y2,T)) -#define AXIS_DRIVER_TYPE_Z2(T) (NUM_Z_STEPPER_DRIVERS >= 2 && _AXIS_DRIVER_TYPE(Z2,T)) -#define AXIS_DRIVER_TYPE_Z3(T) (NUM_Z_STEPPER_DRIVERS >= 3 && _AXIS_DRIVER_TYPE(Z3,T)) -#define AXIS_DRIVER_TYPE_Z4(T) (NUM_Z_STEPPER_DRIVERS >= 4 && _AXIS_DRIVER_TYPE(Z4,T)) - -#define AXIS_DRIVER_TYPE_E(N,T) (E_STEPPERS > N && _AXIS_DRIVER_TYPE(E##N,T)) -#define AXIS_DRIVER_TYPE_E0(T) AXIS_DRIVER_TYPE_E(0,T) -#define AXIS_DRIVER_TYPE_E1(T) AXIS_DRIVER_TYPE_E(1,T) -#define AXIS_DRIVER_TYPE_E2(T) AXIS_DRIVER_TYPE_E(2,T) -#define AXIS_DRIVER_TYPE_E3(T) AXIS_DRIVER_TYPE_E(3,T) -#define AXIS_DRIVER_TYPE_E4(T) AXIS_DRIVER_TYPE_E(4,T) -#define AXIS_DRIVER_TYPE_E5(T) AXIS_DRIVER_TYPE_E(5,T) -#define AXIS_DRIVER_TYPE_E6(T) AXIS_DRIVER_TYPE_E(6,T) -#define AXIS_DRIVER_TYPE_E7(T) AXIS_DRIVER_TYPE_E(7,T) +#define AXIS_DRIVER_TYPE_Z2(T) (ENABLED(Z_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Z2,T)) +#define AXIS_DRIVER_TYPE_E0(T) (E_STEPPERS > 0 && _AXIS_DRIVER_TYPE(E0,T)) +#define AXIS_DRIVER_TYPE_E1(T) (E_STEPPERS > 1 && _AXIS_DRIVER_TYPE(E1,T)) +#define AXIS_DRIVER_TYPE_E2(T) (E_STEPPERS > 2 && _AXIS_DRIVER_TYPE(E2,T)) +#define AXIS_DRIVER_TYPE_E3(T) (E_STEPPERS > 3 && _AXIS_DRIVER_TYPE(E3,T)) +#define AXIS_DRIVER_TYPE_E4(T) (E_STEPPERS > 4 && _AXIS_DRIVER_TYPE(E4,T)) #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T) -#define _OR_ADTE(N,T) || AXIS_DRIVER_TYPE_E(N,T) -#define HAS_E_DRIVER(T) (0 RREPEAT2(E_STEPPERS, _OR_ADTE, T)) - -#define HAS_DRIVER(T) ( AXIS_DRIVER_TYPE_X(T) || AXIS_DRIVER_TYPE_Y(T) || AXIS_DRIVER_TYPE_Z(T) \ - || AXIS_DRIVER_TYPE_X2(T) || AXIS_DRIVER_TYPE_Y2(T) || AXIS_DRIVER_TYPE_Z2(T) \ - || AXIS_DRIVER_TYPE_Z3(T) || AXIS_DRIVER_TYPE_Z4(T) || HAS_E_DRIVER(T) ) - -// -// Trinamic Stepper Drivers -// +#define HAS_DRIVER(T) (AXIS_DRIVER_TYPE_X(T) || AXIS_DRIVER_TYPE_X2(T) || \ + AXIS_DRIVER_TYPE_Y(T) || AXIS_DRIVER_TYPE_Y2(T) || \ + AXIS_DRIVER_TYPE_Z(T) || AXIS_DRIVER_TYPE_Z2(T) || \ + AXIS_DRIVER_TYPE_E0(T) || AXIS_DRIVER_TYPE_E1(T) || \ + AXIS_DRIVER_TYPE_E2(T) || AXIS_DRIVER_TYPE_E3(T) || \ + AXIS_DRIVER_TYPE_E4(T) ) // Test for supported TMC drivers that require advanced configuration // Does not match standalone configurations -#if ( HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) \ - || HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209) \ - || HAS_DRIVER(TMC2660) \ - || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) ) - #define HAS_TRINAMIC_CONFIG 1 -#endif +#define HAS_TRINAMIC (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208)) -#define HAS_TRINAMIC HAS_TRINAMIC_CONFIG - -#if ( HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_STANDALONE) \ - || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC2209_STANDALONE) \ - || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) \ - || HAS_DRIVER(TMC5130_STANDALONE) || HAS_DRIVER(TMC5160_STANDALONE) ) - #define HAS_TRINAMIC_STANDALONE 1 -#endif - -#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) - #define HAS_TMCX1X0 1 -#endif - -#if HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209) - #define HAS_TMC220x 1 -#endif - -#define AXIS_IS_TMC(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ - || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \ - || AXIS_DRIVER_TYPE(A,TMC2660) \ - || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) - -// Test for a driver that uses SPI - this allows checking whether a _CS_ pin -// is considered sensitive -#define AXIS_HAS_SPI(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ - || AXIS_DRIVER_TYPE(A,TMC2660) \ - || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) - -#define AXIS_HAS_UART(A) ( AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) ) - -#define AXIS_HAS_RXTX AXIS_HAS_UART - -#define AXIS_HAS_HW_SERIAL(A) ( AXIS_HAS_UART(A) && defined(A##_HARDWARE_SERIAL) ) -#define AXIS_HAS_SW_SERIAL(A) ( AXIS_HAS_UART(A) && !defined(A##_HARDWARE_SERIAL) ) - -#define AXIS_HAS_STALLGUARD(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ - || AXIS_DRIVER_TYPE(A,TMC2209) \ - || AXIS_DRIVER_TYPE(A,TMC2660) \ - || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) - -#define AXIS_HAS_STEALTHCHOP(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ - || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \ - || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) - -#define AXIS_HAS_SG_RESULT(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ - || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) ) - -#define AXIS_HAS_COOLSTEP(A) ( AXIS_DRIVER_TYPE(A,TMC2130) \ - || AXIS_DRIVER_TYPE(A,TMC2209) \ - || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) - -#define _OR_EAH(N,T) || AXIS_HAS_##T(E##N) -#define E_AXIS_HAS(T) (0 _OR_EAH(0,T) _OR_EAH(1,T) _OR_EAH(2,T) _OR_EAH(3,T) _OR_EAH(4,T) _OR_EAH(5,T) _OR_EAH(6,T) _OR_EAH(7,T)) - -#define ANY_AXIS_HAS(T) ( AXIS_HAS_##T(X) || AXIS_HAS_##T(Y) || AXIS_HAS_##T(Z) \ - || AXIS_HAS_##T(X2) || AXIS_HAS_##T(Y2) || AXIS_HAS_##T(Z2) \ - || AXIS_HAS_##T(Z3) || AXIS_HAS_##T(Z4) || E_AXIS_HAS(T) ) - -#if ANY_AXIS_HAS(STEALTHCHOP) - #define HAS_STEALTHCHOP 1 -#endif -#if ANY_AXIS_HAS(STALLGUARD) - #define HAS_STALLGUARD 1 -#endif -#if ANY_AXIS_HAS(SG_RESULT) - #define HAS_SG_RESULT 1 -#endif -#if ANY_AXIS_HAS(COOLSTEP) - #define HAS_COOLSTEP 1 -#endif -#if ANY_AXIS_HAS(RXTX) - #define HAS_TMC_UART 1 -#endif -#if ANY_AXIS_HAS(SPI) - #define HAS_TMC_SPI 1 -#endif - -// -// TMC26XX Stepper Drivers -// -#if HAS_DRIVER(TMC26X) - #define HAS_TMC26X 1 -#endif - -// -// L64XX Stepper Drivers -// - -#if HAS_DRIVER(L6470) || HAS_DRIVER(L6474) || HAS_DRIVER(L6480) || HAS_DRIVER(POWERSTEP01) - #define HAS_L64XX 1 -#endif -#if HAS_L64XX && !HAS_DRIVER(L6474) - #define HAS_L64XX_NOT_L6474 1 -#endif - -#define AXIS_IS_L64XX(A) (AXIS_DRIVER_TYPE_##A(L6470) || AXIS_DRIVER_TYPE_##A(L6474) || AXIS_DRIVER_TYPE_##A(L6480) || AXIS_DRIVER_TYPE_##A(POWERSTEP01)) +#define AXIS_IS_TMC(A) ( AXIS_DRIVER_TYPE_##A(TMC2130) || \ + AXIS_DRIVER_TYPE_##A(TMC2208) ) diff --git a/Marlin/src/core/enum.h b/Marlin/src/core/enum.h new file mode 100644 index 0000000000..d9a3cd18c2 --- /dev/null +++ b/Marlin/src/core/enum.h @@ -0,0 +1,88 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef __ENUM_H__ +#define __ENUM_H__ + +/** + * Axis indices as enumerated constants + * + * - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space + * - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians + * - X_HEAD, Y_HEAD, and Z_HEAD should be used for Steppers on Core kinematics + */ +enum AxisEnum : unsigned char { + X_AXIS = 0, + A_AXIS = 0, + Y_AXIS = 1, + B_AXIS = 1, + Z_AXIS = 2, + C_AXIS = 2, + E_AXIS = 3, + X_HEAD = 4, + Y_HEAD = 5, + Z_HEAD = 6, + ALL_AXES = 0xFE, + NO_AXIS = 0xFF +}; + +#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++) +#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++) +#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N) +#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N) + +#define LOOP_NA(VAR) LOOP_L_N(VAR, NUM_AXIS) +#define LOOP_XYZ(VAR) LOOP_S_LE_N(VAR, X_AXIS, Z_AXIS) +#define LOOP_XYZE(VAR) LOOP_S_LE_N(VAR, X_AXIS, E_AXIS) +#define LOOP_XYZE_N(VAR) LOOP_S_L_N(VAR, X_AXIS, XYZE_N) +#define LOOP_ABC(VAR) LOOP_S_LE_N(VAR, A_AXIS, C_AXIS) +#define LOOP_ABCE(VAR) LOOP_S_LE_N(VAR, A_AXIS, E_AXIS) +#define LOOP_ABCE_N(VAR) LOOP_S_L_N(VAR, A_AXIS, XYZE_N) + +typedef enum { + LINEARUNIT_MM, + LINEARUNIT_INCH +} LinearUnit; + +typedef enum { + TEMPUNIT_C, + TEMPUNIT_K, + TEMPUNIT_F +} TempUnit; + +/** + * SD Card + */ +enum LsAction : char { LS_SerialPrint, LS_Count, LS_GetFilename }; + +/** + * Ultra LCD + */ +enum LCDViewAction : char { + LCDVIEW_NONE, + LCDVIEW_REDRAW_NOW, + LCDVIEW_CALL_REDRAW_NEXT, + LCDVIEW_CLEAR_CALL_REDRAW, + LCDVIEW_CALL_NO_REDRAW +}; + +#endif // __ENUM_H__ diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 60d9aa6b72..359cc3e4fe 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef LANGUAGE_H +#define LANGUAGE_H #include "../inc/MarlinConfig.h" @@ -37,19 +39,18 @@ // NOTE: IF YOU CHANGE LANGUAGE FILES OR MERGE A FILE WITH CHANGES // -// ==> ALWAYS TRY TO COMPILE MARLIN WITH/WITHOUT "ULTIPANEL" / "ULTRA_LCD" / "SDSUPPORT" #define IN "Configuration.h" +// ==> ALWAYS TRY TO COMPILE MARLIN WITH/WITHOUT "ULTIPANEL" / "ULTRALCD" / "SDSUPPORT" #define IN "Configuration.h" // ==> ALSO TRY ALL AVAILABLE LANGUAGE OPTIONS -// See also https://marlinfw.org/docs/development/lcd_language.html +// See also http://marlinfw.org/docs/development/lcd_language.html // Languages // an Aragonese // bg Bulgarian // ca Catalan // cz Czech -// da Danish // de German // el Greek -// el_gr Greek (Greece) +// el-gr Greek (Greece) // en English // es Spanish // eu Basque-Euskera @@ -57,20 +58,16 @@ // fr French // gl Galician // hr Croatian -// hu Hungarian // it Italian -// jp_kana Japanese -// ko_KR Korean (South Korea) +// jp-kana Japanese // nl Dutch // pl Polish // pt Portuguese -// pt_br Portuguese (Brazilian) -// ro Romanian +// pt-br Portuguese (Brazilian) // ru Russian // sk Slovak // tr Turkish // uk Ukrainian -// vi Vietnamese // zh_CN Chinese (Simplified) // zh_TW Chinese (Traditional) @@ -82,321 +79,249 @@ #ifdef CUSTOM_MACHINE_NAME #undef MACHINE_NAME #define MACHINE_NAME CUSTOM_MACHINE_NAME -#elif defined(DEFAULT_MACHINE_NAME) - #undef MACHINE_NAME - #define MACHINE_NAME DEFAULT_MACHINE_NAME +#else + #ifdef DEFAULT_MACHINE_NAME + #undef MACHINE_NAME + #define MACHINE_NAME DEFAULT_MACHINE_NAME + #endif #endif #ifndef MACHINE_UUID #define MACHINE_UUID DEFAULT_MACHINE_UUID #endif -#define MARLIN_WEBSITE_URL "https://marlinfw.org" +#ifdef DEFAULT_WEBSITE_URL + #undef WEBSITE_URL + #define WEBSITE_URL DEFAULT_WEBSITE_URL +#endif -//#if !defined(STRING_SPLASH_LINE3) && defined(WEBSITE_URL) -// #define STRING_SPLASH_LINE3 WEBSITE_URL -//#endif +// Common LCD messages -// -// Common Serial Console Messages -// Don't change these strings because serial hosts look for them. -// + /* nothing here yet */ -#define STR_ENQUEUEING "enqueueing \"" -#define STR_POWERUP "PowerUp" -#define STR_EXTERNAL_RESET " External Reset" -#define STR_BROWNOUT_RESET " Brown out Reset" -#define STR_WATCHDOG_RESET " Watchdog Reset" -#define STR_SOFTWARE_RESET " Software Reset" -#define STR_FREE_MEMORY " Free Memory: " -#define STR_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " -#define STR_OK "ok" -#define STR_WAIT "wait" -#define STR_STATS "Stats: " -#define STR_FILE_SAVED "Done saving file." -#define STR_ERR_LINE_NO "Line Number is not Last Line Number+1, Last Line: " -#define STR_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " -#define STR_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " -#define STR_FILE_PRINTED "Done printing file" -#define STR_NO_MEDIA "No media" -#define STR_BEGIN_FILE_LIST "Begin file list" -#define STR_END_FILE_LIST "End file list" -#define STR_INVALID_EXTRUDER "Invalid extruder" -#define STR_INVALID_E_STEPPER "Invalid E stepper" -#define STR_E_STEPPER_NOT_SPECIFIED "E stepper not specified" -#define STR_INVALID_SOLENOID "Invalid solenoid" -#define STR_COUNT_X " Count X:" -#define STR_COUNT_A " Count A:" -#define STR_WATCHDOG_FIRED "Watchdog timeout. Reset required." -#define STR_ERR_KILLED "Printer halted. kill() called!" -#define STR_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" -#define STR_BUSY_PROCESSING "busy: processing" -#define STR_BUSY_PAUSED_FOR_USER "busy: paused for user" -#define STR_BUSY_PAUSED_FOR_INPUT "busy: paused for input" -#define STR_Z_MOVE_COMP "Z_move_comp" -#define STR_RESEND "Resend: " -#define STR_UNKNOWN_COMMAND "Unknown command: \"" -#define STR_ACTIVE_EXTRUDER "Active Extruder: " -#define STR_X_MIN "x_min" -#define STR_X_MAX "x_max" -#define STR_X2_MIN "x2_min" -#define STR_X2_MAX "x2_max" -#define STR_Y_MIN "y_min" -#define STR_Y_MAX "y_max" -#define STR_Y2_MIN "y2_min" -#define STR_Y2_MAX "y2_max" -#define STR_Z_MIN "z_min" -#define STR_Z_MAX "z_max" -#define STR_Z2_MIN "z2_min" -#define STR_Z2_MAX "z2_max" -#define STR_Z3_MIN "z3_min" -#define STR_Z3_MAX "z3_max" -#define STR_Z4_MIN "z4_min" -#define STR_Z4_MAX "z4_max" -#define STR_Z_PROBE "z_probe" -#define STR_FILAMENT_RUNOUT_SENSOR "filament" -#define STR_PROBE_OFFSET "Probe Offset" -#define STR_SKEW_MIN "min_skew_factor: " -#define STR_SKEW_MAX "max_skew_factor: " -#define STR_ERR_MATERIAL_INDEX "M145 S out of range (0-1)" -#define STR_ERR_M421_PARAMETERS "M421 incorrect parameter usage" -#define STR_ERR_BAD_PLANE_MODE "G5 requires XY plane mode" -#define STR_ERR_MESH_XY "Mesh point out of range" -#define STR_ERR_ARC_ARGS "G2/G3 bad parameters" -#define STR_ERR_PROTECTED_PIN "Protected Pin" -#define STR_ERR_M420_FAILED "Failed to enable Bed Leveling" -#define STR_ERR_M428_TOO_FAR "Too far from reference point" -#define STR_ERR_M303_DISABLED "PIDTEMP disabled" -#define STR_M119_REPORT "Reporting endstop status" -#define STR_ON "ON" -#define STR_OFF "OFF" -#define STR_ENDSTOP_HIT "TRIGGERED" -#define STR_ENDSTOP_OPEN "open" -#define STR_HOTEND_OFFSET "Hotend offsets:" -#define STR_DUPLICATION_MODE "Duplication mode: " -#define STR_SOFT_ENDSTOPS "Soft endstops: " -#define STR_SOFT_MIN " Min: " -#define STR_SOFT_MAX " Max: " +// Common serial messages +#define MSG_MARLIN "Marlin" -#define STR_SAVED_POS "Position saved" -#define STR_RESTORING_POS "Restoring position" -#define STR_INVALID_POS_SLOT "Invalid slot. Total: " +// Serial Console Messages (do not translate those!) -#define STR_SD_CANT_OPEN_SUBDIR "Cannot open subdir " -#define STR_SD_INIT_FAIL "No SD card" -#define STR_SD_VOL_INIT_FAIL "volume.init failed" -#define STR_SD_OPENROOT_FAIL "openRoot failed" -#define STR_SD_CARD_OK "SD card ok" -#define STR_SD_WORKDIR_FAIL "workDir open failed" -#define STR_SD_OPEN_FILE_FAIL "open failed, File: " -#define STR_SD_FILE_OPENED "File opened: " -#define STR_SD_SIZE " Size: " -#define STR_SD_FILE_SELECTED "File selected" -#define STR_SD_WRITE_TO_FILE "Writing to file: " -#define STR_SD_PRINTING_BYTE "SD printing byte " -#define STR_SD_NOT_PRINTING "Not SD printing" -#define STR_SD_ERR_WRITE_TO_FILE "error writing to file" -#define STR_SD_ERR_READ "SD read error" -#define STR_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " +#define MSG_ENQUEUEING "enqueueing \"" +#define MSG_POWERUP "PowerUp" +#define MSG_EXTERNAL_RESET " External Reset" +#define MSG_BROWNOUT_RESET " Brown out Reset" +#define MSG_WATCHDOG_RESET " Watchdog Reset" +#define MSG_SOFTWARE_RESET " Software Reset" +#define MSG_AUTHOR " | Author: " +#define MSG_CONFIGURATION_VER " Last Updated: " +#define MSG_FREE_MEMORY " Free Memory: " +#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " +#define MSG_OK "ok" +#define MSG_WAIT "wait" +#define MSG_STATS "Stats: " +#define MSG_FILE_SAVED "Done saving file." +#define MSG_ERR_LINE_NO "Line Number is not Last Line Number+1, Last Line: " +#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " +#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " +#define MSG_FILE_PRINTED "Done printing file" +#define MSG_BEGIN_FILE_LIST "Begin file list" +#define MSG_END_FILE_LIST "End file list" +#define MSG_INVALID_EXTRUDER "Invalid extruder" +#define MSG_INVALID_SOLENOID "Invalid solenoid" +#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" +#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID +#define MSG_COUNT_X " Count X:" +#define MSG_COUNT_A " Count A:" +#define MSG_ERR_KILLED "Printer halted. kill() called!" +#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" +#define MSG_BUSY_PROCESSING "busy: processing" +#define MSG_BUSY_PAUSED_FOR_USER "busy: paused for user" +#define MSG_BUSY_PAUSED_FOR_INPUT "busy: paused for input" +#define MSG_Z_MOVE_COMP "Z_move_comp" +#define MSG_RESEND "Resend: " +#define MSG_UNKNOWN_COMMAND "Unknown command: \"" +#define MSG_ACTIVE_EXTRUDER "Active Extruder: " +#define MSG_X_MIN "x_min: " +#define MSG_X_MAX "x_max: " +#define MSG_X2_MIN "x2_min: " +#define MSG_X2_MAX "x2_max: " +#define MSG_Y_MIN "y_min: " +#define MSG_Y_MAX "y_max: " +#define MSG_Y2_MIN "y2_min: " +#define MSG_Y2_MAX "y2_max: " +#define MSG_Z_MIN "z_min: " +#define MSG_Z_MAX "z_max: " +#define MSG_Z2_MIN "z2_min: " +#define MSG_Z2_MAX "z2_max: " +#define MSG_Z_PROBE "z_probe: " +#define MSG_PROBE_Z_OFFSET "Probe Z Offset" +#define MSG_SKEW_MIN "min_skew_factor: " +#define MSG_SKEW_MAX "max_skew_factor: " +#define MSG_FILAMENT_RUNOUT_SENSOR "filament: " +#define MSG_ERR_MATERIAL_INDEX "M145 S out of range (0-1)" +#define MSG_ERR_M355_NONE "No case light" +#define MSG_ERR_M421_PARAMETERS "M421 incorrect parameter usage" +#define MSG_ERR_BAD_PLANE_MODE "G5 requires XY plane mode" +#define MSG_ERR_MESH_XY "Mesh point cannot be resolved" +#define MSG_ERR_ARC_ARGS "G2/G3 bad parameters" +#define MSG_ERR_PROTECTED_PIN "Protected Pin" +#define MSG_ERR_M420_FAILED "Failed to enable Bed Leveling" +#define MSG_ERR_M428_TOO_FAR "Too far from reference point" +#define MSG_ERR_M303_DISABLED "PIDTEMP disabled" +#define MSG_M119_REPORT "Reporting endstop status" +#define MSG_ENDSTOP_HIT "TRIGGERED" +#define MSG_ENDSTOP_OPEN "open" +#define MSG_HOTEND_OFFSET "Hotend offsets:" +#define MSG_DUPLICATION_MODE "Duplication mode: " +#define MSG_SOFT_ENDSTOPS "Soft endstops: " +#define MSG_SOFT_MIN " Min: " +#define MSG_SOFT_MAX " Max: " -#define STR_ENDSTOPS_HIT "endstops hit: " -#define STR_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" -#define STR_ERR_LONG_EXTRUDE_STOP " too long extrusion prevented" -#define STR_ERR_HOTEND_TOO_COLD "Hotend too cold" -#define STR_ERR_EEPROM_WRITE "Error writing to EEPROM!" +#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir " +#define MSG_SD_INIT_FAIL "SD init fail" +#define MSG_SD_VOL_INIT_FAIL "volume.init failed" +#define MSG_SD_OPENROOT_FAIL "openRoot failed" +#define MSG_SD_CARD_OK "SD card ok" +#define MSG_SD_WORKDIR_FAIL "workDir open failed" +#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " +#define MSG_SD_FILE_OPENED "File opened: " +#define MSG_SD_SIZE " Size: " +#define MSG_SD_FILE_SELECTED "File selected" +#define MSG_SD_WRITE_TO_FILE "Writing to file: " +#define MSG_SD_PRINTING_BYTE "SD printing byte " +#define MSG_SD_NOT_PRINTING "Not SD printing" +#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" +#define MSG_SD_ERR_READ "SD read error" +#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " -#define STR_FILAMENT_CHANGE_HEAT_LCD "Press button to heat nozzle" -#define STR_FILAMENT_CHANGE_INSERT_LCD "Insert filament and press button" -#define STR_FILAMENT_CHANGE_WAIT_LCD "Press button to resume" -#define STR_FILAMENT_CHANGE_HEAT_M108 "Send M108 to heat nozzle" -#define STR_FILAMENT_CHANGE_INSERT_M108 "Insert filament and send M108" -#define STR_FILAMENT_CHANGE_WAIT_M108 "Send M108 to resume" +#define MSG_STEPPER_TOO_HIGH "Steprate too high: " +#define MSG_ENDSTOPS_HIT "endstops hit: " +#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" +#define MSG_ERR_LONG_EXTRUDE_STOP " too long extrusion prevented" +#define MSG_HOTEND_TOO_COLD "Hotend too cold" -#define STR_STOP_BLTOUCH "!! STOP called because of BLTouch error - restart with M999" -#define STR_STOP_UNHOMED "!! STOP called because of unhomed error - restart with M999" -#define STR_KILL_INACTIVE_TIME "!! KILL caused by too much inactive time - current command: " -#define STR_KILL_BUTTON "!! KILL caused by KILL button/pin" +#define MSG_FILAMENT_CHANGE_HEAT "Press button (or M108) to heat nozzle" +#define MSG_FILAMENT_CHANGE_INSERT "Insert filament and press button (or M108)" +#define MSG_FILAMENT_CHANGE_HEAT_LCD "Press button to heat nozzle" +#define MSG_FILAMENT_CHANGE_INSERT_LCD "Insert filament and press button" +#define MSG_FILAMENT_CHANGE_HEAT_M108 "Send M108 to heat nozzle" +#define MSG_FILAMENT_CHANGE_INSERT_M108 "Insert filament and send M108" + +#define MSG_ERR_EEPROM_WRITE "Error writing to EEPROM!" + +#define MSG_STOP_BLTOUCH "STOP called because of BLTouch error - restart with M999" +#define MSG_STOP_UNHOMED "STOP called because of unhomed error - restart with M999" +#define MSG_KILL_INACTIVE_TIME "KILL caused by too much inactive time - current command: " +#define MSG_KILL_BUTTON "KILL caused by KILL button/pin" // temperature.cpp strings -#define STR_PID_AUTOTUNE_START "PID Autotune start" -#define STR_PID_BAD_EXTRUDER_NUM "PID Autotune failed! Bad extruder number" -#define STR_PID_TEMP_TOO_HIGH "PID Autotune failed! Temperature too high" -#define STR_PID_TIMEOUT "PID Autotune failed! timeout" -#define STR_BIAS " bias: " -#define STR_D_COLON " d: " -#define STR_T_MIN " min: " -#define STR_T_MAX " max: " -#define STR_KU " Ku: " -#define STR_TU " Tu: " -#define STR_CLASSIC_PID " Classic PID " -#define STR_KP " Kp: " -#define STR_KI " Ki: " -#define STR_KD " Kd: " -#define STR_PID_AUTOTUNE_FINISHED "PID Autotune finished! Put the last Kp, Ki and Kd constants from below into Configuration.h" -#define STR_PID_DEBUG " PID_DEBUG " -#define STR_PID_DEBUG_INPUT ": Input " -#define STR_PID_DEBUG_OUTPUT " Output " -#define STR_PID_DEBUG_PTERM " pTerm " -#define STR_PID_DEBUG_ITERM " iTerm " -#define STR_PID_DEBUG_DTERM " dTerm " -#define STR_PID_DEBUG_CTERM " cTerm " -#define STR_INVALID_EXTRUDER_NUM " - Invalid extruder number !" +#define MSG_PID_AUTOTUNE "PID Autotune" +#define MSG_PID_AUTOTUNE_START MSG_PID_AUTOTUNE " start" +#define MSG_PID_AUTOTUNE_FAILED MSG_PID_AUTOTUNE " failed!" +#define MSG_PID_BAD_EXTRUDER_NUM MSG_PID_AUTOTUNE_FAILED " Bad extruder number" +#define MSG_PID_TEMP_TOO_HIGH MSG_PID_AUTOTUNE_FAILED " Temperature too high" +#define MSG_PID_TIMEOUT MSG_PID_AUTOTUNE_FAILED " timeout" +#define MSG_BIAS " bias: " +#define MSG_D " d: " +#define MSG_T_MIN " min: " +#define MSG_T_MAX " max: " +#define MSG_KU " Ku: " +#define MSG_TU " Tu: " +#define MSG_CLASSIC_PID " Classic PID " +#define MSG_KP " Kp: " +#define MSG_KI " Ki: " +#define MSG_KD " Kd: " +#define MSG_AT " @:" +#define MSG_PID_AUTOTUNE_FINISHED MSG_PID_AUTOTUNE " finished! Put the last Kp, Ki and Kd constants from below into Configuration.h" +#define MSG_PID_DEBUG " PID_DEBUG " +#define MSG_PID_DEBUG_INPUT ": Input " +#define MSG_PID_DEBUG_OUTPUT " Output " +#define MSG_PID_DEBUG_PTERM " pTerm " +#define MSG_PID_DEBUG_ITERM " iTerm " +#define MSG_PID_DEBUG_DTERM " dTerm " +#define MSG_PID_DEBUG_CTERM " cTerm " +#define MSG_INVALID_EXTRUDER_NUM " - Invalid extruder number !" -#define STR_HEATER_BED "bed" -#define STR_HEATER_CHAMBER "chamber" - -#define STR_STOPPED_HEATER ", system stopped! Heater_ID: " -#define STR_REDUNDANCY "Heater switched off. Temperature difference between temp sensors is too high !" -#define STR_T_HEATING_FAILED "Heating failed" -#define STR_T_THERMAL_RUNAWAY "Thermal Runaway" -#define STR_T_MAXTEMP "MAXTEMP triggered" -#define STR_T_MINTEMP "MINTEMP triggered" -#define STR_ERR_PROBING_FAILED "Probing Failed" -#define STR_ZPROBE_OUT_SER "Z Probe Past Bed" +#define MSG_HEATER_BED "bed" +#define MSG_STOPPED_HEATER ", system stopped! Heater_ID: " +#define MSG_REDUNDANCY "Heater switched off. Temperature difference between temp sensors is too high !" +#define MSG_T_HEATING_FAILED "Heating failed" +#define MSG_T_THERMAL_RUNAWAY "Thermal Runaway" +#define MSG_T_MAXTEMP "MAXTEMP triggered" +#define MSG_T_MINTEMP "MINTEMP triggered" // Debug -#define STR_DEBUG_PREFIX "DEBUG:" -#define STR_DEBUG_OFF "off" -#define STR_DEBUG_ECHO "ECHO" -#define STR_DEBUG_INFO "INFO" -#define STR_DEBUG_ERRORS "ERRORS" -#define STR_DEBUG_DRYRUN "DRYRUN" -#define STR_DEBUG_COMMUNICATION "COMMUNICATION" -#define STR_DEBUG_LEVELING "LEVELING" - -#define STR_PRINTER_LOCKED "Printer locked! (Unlock with M511 or LCD)" -#define STR_WRONG_PASSWORD "Incorrect Password" -#define STR_PASSWORD_TOO_LONG "Password too long" -#define STR_PASSWORD_REMOVED "Password removed" -#define STR_REMINDER_SAVE_SETTINGS "Remember to save!" -#define STR_PASSWORD_SET "Password is " +#define MSG_DEBUG_PREFIX "DEBUG:" +#define MSG_DEBUG_OFF "off" +#define MSG_DEBUG_ECHO "ECHO" +#define MSG_DEBUG_INFO "INFO" +#define MSG_DEBUG_ERRORS "ERRORS" +#define MSG_DEBUG_DRYRUN "DRYRUN" +#define MSG_DEBUG_COMMUNICATION "COMMUNICATION" +#define MSG_DEBUG_LEVELING "LEVELING" // LCD Menu Messages -#define LANGUAGE_DATA_INCL_(M) STRINGIFY_(fontdata/langdata_##M.h) +#define LANGUAGE_DATA_INCL_(M) STRINGIFY_(../lcd/dogm/language_data_##M.h) #define LANGUAGE_DATA_INCL(M) LANGUAGE_DATA_INCL_(M) +#define INCLUDE_LANGUAGE_DATA LANGUAGE_DATA_INCL(LCD_LANGUAGE) #define LANGUAGE_INCL_(M) STRINGIFY_(../lcd/language/language_##M.h) #define LANGUAGE_INCL(M) LANGUAGE_INCL_(M) +#define INCLUDE_LANGUAGE LANGUAGE_INCL(LCD_LANGUAGE) -#define STR_X "X" -#define STR_Y "Y" -#define STR_Z "Z" -#define STR_E "E" +// Never translate these strings +#define MSG_X "X" +#define MSG_Y "Y" +#define MSG_Z "Z" +#define MSG_E "E" #if IS_KINEMATIC - #define STR_A "A" - #define STR_B "B" - #define STR_C "C" + #define MSG_A "A" + #define MSG_B "B" + #define MSG_C "C" #else - #define STR_A "X" - #define STR_B "Y" - #define STR_C "Z" + #define MSG_A "X" + #define MSG_B "Y" + #define MSG_C "Z" #endif -#define STR_X2 "X2" -#define STR_Y2 "Y2" -#define STR_Z2 "Z2" -#define STR_Z3 "Z3" -#define STR_Z4 "Z4" +#define MSG_H1 "1" +#define MSG_H2 "2" +#define MSG_H3 "3" +#define MSG_H4 "4" +#define MSG_H5 "5" +#define MSG_N1 " 1" +#define MSG_N2 " 2" +#define MSG_N3 " 3" +#define MSG_N4 " 4" +#define MSG_N5 " 5" +#define MSG_E1 "E1" +#define MSG_E2 "E2" +#define MSG_E3 "E3" +#define MSG_E4 "E4" +#define MSG_E5 "E5" +#define MSG_MOVE_E1 "1" +#define MSG_MOVE_E2 "2" +#define MSG_MOVE_E3 "3" +#define MSG_MOVE_E4 "4" +#define MSG_MOVE_E5 "5" +#define MSG_DIAM_E1 " 1" +#define MSG_DIAM_E2 " 2" +#define MSG_DIAM_E3 " 3" +#define MSG_DIAM_E4 " 4" +#define MSG_DIAM_E5 " 5" -#define LCD_STR_A STR_A -#define LCD_STR_B STR_B -#define LCD_STR_C STR_C -#define LCD_STR_E STR_E +#include INCLUDE_LANGUAGE -#if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) - - // Custom characters defined in the first 8 characters of the LCD - #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string! - #define LCD_STR_DEGREE "\x01" - #define LCD_STR_THERMOMETER "\x02" // Still used with string concatenation - #define LCD_STR_UPLEVEL "\x03" - #define LCD_STR_REFRESH "\x04" - #define LCD_STR_FOLDER "\x05" - #define LCD_STR_FEEDRATE "\x06" - #define LCD_STR_CLOCK "\x07" - #define LCD_STR_ARROW_RIGHT ">" /* from the default character set */ - -#else - // - // Custom characters from Marlin_symbols.fon which was merged into ISO10646-0-3.bdf - // \x00 intentionally skipped to avoid problems in strings - // - #define LCD_STR_REFRESH "\x01" - #define LCD_STR_FOLDER "\x02" - #define LCD_STR_ARROW_RIGHT "\x03" - #define LCD_STR_UPLEVEL "\x04" - #define LCD_STR_CLOCK "\x05" - #define LCD_STR_FEEDRATE "\x06" - #define LCD_STR_BEDTEMP "\x07" - #define LCD_STR_THERMOMETER "\x08" - #define LCD_STR_DEGREE "\x09" - - #define LCD_STR_SPECIAL_MAX '\x09' - // Maximum here is 0x1F because 0x20 is ' ' (space) and the normal charsets begin. - // Better stay below 0x10 because DISPLAY_CHARSET_HD44780_WESTERN begins here. - - // Symbol characters - #define LCD_STR_FILAM_DIA "\xF8" - #define LCD_STR_FILAM_MUL "\xA4" - -#endif - -/** - * Tool indexes for LCD display only - * - * By convention the LCD shows "E1" for the first extruder. - * However, internal to Marlin E0/T0 is the first tool, and - * most board silkscreens say "E0." Zero-based labels will - * make these indexes consistent but this defies expectation. - */ -#if ENABLED(NUMBER_TOOLS_FROM_0) - #define LCD_FIRST_TOOL 0 - #define LCD_STR_N0 "0" - #define LCD_STR_N1 "1" - #define LCD_STR_N2 "2" - #define LCD_STR_N3 "3" - #define LCD_STR_N4 "4" - #define LCD_STR_N5 "5" - #define LCD_STR_N6 "6" - #define LCD_STR_N7 "7" -#else - #define LCD_FIRST_TOOL 1 - #define LCD_STR_N0 "1" - #define LCD_STR_N1 "2" - #define LCD_STR_N2 "3" - #define LCD_STR_N3 "4" - #define LCD_STR_N4 "5" - #define LCD_STR_N5 "6" - #define LCD_STR_N6 "7" - #define LCD_STR_N7 "8" -#endif - -#define LCD_STR_E0 "E" LCD_STR_N0 -#define LCD_STR_E1 "E" LCD_STR_N1 -#define LCD_STR_E2 "E" LCD_STR_N2 -#define LCD_STR_E3 "E" LCD_STR_N3 -#define LCD_STR_E4 "E" LCD_STR_N4 -#define LCD_STR_E5 "E" LCD_STR_N5 -#define LCD_STR_E6 "E" LCD_STR_N6 -#define LCD_STR_E7 "E" LCD_STR_N7 - -#include "multi_language.h" // Allow multiple languages - -#include "../lcd/language/language_en.h" -#include LANGUAGE_INCL(LCD_LANGUAGE) -#include LANGUAGE_INCL(LCD_LANGUAGE_2) -#include LANGUAGE_INCL(LCD_LANGUAGE_3) -#include LANGUAGE_INCL(LCD_LANGUAGE_4) -#include LANGUAGE_INCL(LCD_LANGUAGE_5) - -#if NONE(DISPLAY_CHARSET_ISO10646_1, \ - DISPLAY_CHARSET_ISO10646_5, \ - DISPLAY_CHARSET_ISO10646_KANA, \ - DISPLAY_CHARSET_ISO10646_GREEK, \ - DISPLAY_CHARSET_ISO10646_CN, \ - DISPLAY_CHARSET_ISO10646_TR, \ - DISPLAY_CHARSET_ISO10646_PL, \ - DISPLAY_CHARSET_ISO10646_CZ, \ - DISPLAY_CHARSET_ISO10646_SK) +#if DISABLED(DISPLAY_CHARSET_ISO10646_1) \ + && DISABLED(DISPLAY_CHARSET_ISO10646_5) \ + && DISABLED(DISPLAY_CHARSET_ISO10646_KANA) \ + && DISABLED(DISPLAY_CHARSET_ISO10646_GREEK) \ + && DISABLED(DISPLAY_CHARSET_ISO10646_CN) \ + && DISABLED(DISPLAY_CHARSET_ISO10646_TR) \ + && DISABLED(DISPLAY_CHARSET_ISO10646_PL) \ + && DISABLED(DISPLAY_CHARSET_ISO10646_CZ) \ + && DISABLED(DISPLAY_CHARSET_ISO10646_SK) #define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays. #endif + +#include "../lcd/language/language_en.h" + +#endif // __LANGUAGE_H diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 21bb32c4cf..fc551b8e16 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,40 +16,27 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#if !defined(__has_include) - #define __has_include(...) 1 -#endif +#ifndef _CORE_MACROS_H_ +#define _CORE_MACROS_H_ +#define NUM_AXIS 4 #define ABCE 4 #define XYZE 4 #define ABC 3 #define XYZ 3 -#define XY 2 #define _AXIS(A) (A##_AXIS) -#define _XMIN_ 100 -#define _YMIN_ 200 -#define _ZMIN_ 300 -#define _XMAX_ 101 -#define _YMAX_ 201 -#define _ZMAX_ 301 -#define _XDIAG_ 102 -#define _YDIAG_ 202 -#define _ZDIAG_ 302 -#define _E0DIAG_ 400 -#define _E1DIAG_ 401 -#define _E2DIAG_ 402 -#define _E3DIAG_ 403 -#define _E4DIAG_ 404 -#define _E5DIAG_ 405 -#define _E6DIAG_ 406 -#define _E7DIAG_ 407 +#define _XMIN_ 100 +#define _YMIN_ 200 +#define _ZMIN_ 300 +#define _XMAX_ 101 +#define _YMAX_ 201 +#define _ZMAX_ 301 #define _FORCE_INLINE_ __attribute__((__always_inline__)) __inline__ #define FORCE_INLINE __attribute__((always_inline)) inline @@ -60,22 +47,17 @@ #define _O2 __attribute__((optimize("O2"))) #define _O3 __attribute__((optimize("O3"))) -#ifndef UNUSED - #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - #define UNUSED(X) (void)X - #else - #define UNUSED(x) ((void)(x)) - #endif -#endif - // Clock speed factors #if !defined(CYCLES_PER_MICROSECOND) && !defined(__STM32F1__) - #define CYCLES_PER_MICROSECOND (F_CPU / 1000000UL) // 16 or 20 on AVR + #define CYCLES_PER_MICROSECOND (F_CPU / 1000000L) // 16 or 20 on AVR #endif // Nanoseconds per cycle #define NANOSECONDS_PER_CYCLE (1000000000.0 / F_CPU) +// Remove compiler warning on an unused variable +#define UNUSED(x) (void) (x) + // Macros to make a string from a macro #define STRINGIFY_(M) #M #define STRINGIFY(M) STRINGIFY_(M) @@ -86,26 +68,20 @@ // Macros for bit masks #undef _BV #define _BV(n) (1<<(n)) -#define TEST(n,b) (!!((n)&_BV(b))) +#define TEST(n,b) !!((n)&_BV(b)) +#define SBI(n,b) (n |= _BV(b)) +#define CBI(n,b) (n &= ~_BV(b)) #define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0) -#ifndef SBI - #define SBI(A,B) (A |= (1 << (B))) -#endif - -#ifndef CBI - #define CBI(A,B) (A &= ~(1 << (B))) -#endif - -#define TBI(N,B) (N ^= _BV(B)) - #define _BV32(b) (1UL << (b)) #define TEST32(n,b) !!((n)&_BV32(b)) #define SBI32(n,b) (n |= _BV32(b)) #define CBI32(n,b) (n &= ~_BV32(b)) -#define TBI32(N,B) (N ^= _BV32(B)) -#define cu(x) ({__typeof__(x) _x = (x); (_x)*(_x)*(_x);}) +// Macros for maths shortcuts +#undef M_PI +#define M_PI 3.14159265358979323846f + #define RADIANS(d) ((d)*float(M_PI)/180.0f) #define DEGREES(r) ((r)*180.0f/float(M_PI)) #define HYPOT2(x,y) (sq(x)+sq(y)) @@ -113,404 +89,185 @@ #define CIRCLE_AREA(R) (float(M_PI) * sq(float(R))) #define CIRCLE_CIRC(R) (2 * float(M_PI) * float(R)) -#define SIGN(a) ({__typeof__(a) _a = (a); (_a>0)-(_a<0);}) +#define SIGN(a) ((a>0)-(a<0)) #define IS_POWER_OF_2(x) ((x) && !((x) & ((x) - 1))) // Macros to constrain values +// Avoid double evaluation of arguments to NOMORE/NOLESS/LIMIT +#undef NOMORE +#undef NOLESS +#undef LIMIT #ifdef __cplusplus // C++11 solution that is standards compliant. template static inline constexpr void NOLESS(V& v, const N n) { - if (n > v) v = n; + if (v < n) v = n; } template static inline constexpr void NOMORE(V& v, const N n) { - if (n < v) v = n; + if (v > n) v = n; } template static inline constexpr void LIMIT(V& v, const N1 n1, const N2 n2) { - if (n1 > v) v = n1; - else if (n2 < v) v = n2; + if (v < n1) v = n1; + else if (v > n2) v = n2; } #else + // Using GCC extensions, but Travis GCC version does not like it and gives + // "error: statement-expressions are not allowed outside functions nor in template-argument lists" #define NOLESS(v, n) \ - do{ \ + do { \ __typeof__(n) _n = (n); \ - if (_n > v) v = _n; \ - }while(0) + if (v < _n) v = _n; \ + } while(0) #define NOMORE(v, n) \ - do{ \ + do { \ __typeof__(n) _n = (n); \ - if (_n < v) v = _n; \ - }while(0) + if (v > _n) v = _n; \ + } while(0) #define LIMIT(v, n1, n2) \ - do{ \ + do { \ __typeof__(n1) _n1 = (n1); \ __typeof__(n2) _n2 = (n2); \ - if (_n1 > v) v = _n1; \ - else if (_n2 < v) v = _n2; \ - }while(0) + if (v < _n1) v = _n1; \ + else if (v > _n2) v = _n2; \ + } while(0) #endif -// Macros to chain up to 12 conditions -#define _DO_1(W,C,A) (_##W##_1(A)) -#define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B)) -#define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V)) -#define _DO_4(W,C,A,V...) (_##W##_1(A) C _DO_3(W,C,V)) -#define _DO_5(W,C,A,V...) (_##W##_1(A) C _DO_4(W,C,V)) -#define _DO_6(W,C,A,V...) (_##W##_1(A) C _DO_5(W,C,V)) -#define _DO_7(W,C,A,V...) (_##W##_1(A) C _DO_6(W,C,V)) -#define _DO_8(W,C,A,V...) (_##W##_1(A) C _DO_7(W,C,V)) -#define _DO_9(W,C,A,V...) (_##W##_1(A) C _DO_8(W,C,V)) -#define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V)) -#define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V)) -#define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V)) -#define __DO_N(W,C,N,V...) _DO_##N(W,C,V) -#define _DO_N(W,C,N,V...) __DO_N(W,C,N,V) -#define DO(W,C,V...) _DO_N(W,C,NUM_ARGS(V),V) - // Macros to support option testing -#define _CAT(a,V...) a##V -#define CAT(a,V...) _CAT(a,V) +#define _CAT(a, ...) a ## __VA_ARGS__ +#define SWITCH_ENABLED_false 0 +#define SWITCH_ENABLED_true 1 +#define SWITCH_ENABLED_0 0 +#define SWITCH_ENABLED_1 1 +#define SWITCH_ENABLED_0x0 0 +#define SWITCH_ENABLED_0x1 1 +#define SWITCH_ENABLED_ 1 +#define ENABLED(b) _CAT(SWITCH_ENABLED_, b) +#define DISABLED(b) !ENABLED(b) -#define _ISENA_ ~,1 -#define _ISENA_1 ~,1 -#define _ISENA_0x1 ~,1 -#define _ISENA_true ~,1 -#define _ISENA(V...) IS_PROBE(V) - -#define _ENA_1(O) _ISENA(CAT(_IS,CAT(ENA_, O))) -#define _DIS_1(O) NOT(_ENA_1(O)) -#define ENABLED(V...) DO(ENA,&&,V) -#define DISABLED(V...) DO(DIS,&&,V) - -#define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION converted to '0' or '1' -#define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION converted to A or '0' -#define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION converted to A or '1' -#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION converted to A or '' -#define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1' -#define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' -#define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. - -#define ANY(V...) !DISABLED(V) -#define NONE(V...) DISABLED(V) -#define ALL(V...) ENABLED(V) -#define BOTH(V1,V2) ALL(V1,V2) -#define EITHER(V1,V2) ANY(V1,V2) - -// Macros to support pins/buttons exist testing -#define PIN_EXISTS(PN) (defined(PN##_PIN) && PN##_PIN >= 0) -#define _PINEX_1 PIN_EXISTS -#define PINS_EXIST(V...) DO(PINEX,&&,V) -#define ANY_PIN(V...) DO(PINEX,||,V) - -#define BUTTON_EXISTS(BN) (defined(BTN_##BN) && BTN_##BN >= 0) -#define _BTNEX_1 BUTTON_EXISTS -#define BUTTONS_EXIST(V...) DO(BTNEX,&&,V) -#define ANY_BUTTON(V...) DO(BTNEX,||,V) - -#define WITHIN(N,L,H) ((N) >= (L) && (N) <= (H)) -#define NUMERIC(a) WITHIN(a, '0', '9') -#define DECIMAL(a) (NUMERIC(a) || a == '.') -#define HEXCHR(a) (NUMERIC(a) ? (a) - '0' : WITHIN(a, 'a', 'f') ? ((a) - 'a' + 10) : WITHIN(a, 'A', 'F') ? ((a) - 'A' + 10) : -1) -#define NUMERIC_SIGNED(a) (NUMERIC(a) || (a) == '-' || (a) == '+') -#define DECIMAL_SIGNED(a) (DECIMAL(a) || (a) == '-' || (a) == '+') -#define COUNT(a) (sizeof(a)/sizeof(*a)) -#define ZERO(a) memset(a,0,sizeof(a)) -#define COPY(a,b) do{ \ - static_assert(sizeof(a[0]) == sizeof(b[0]), "COPY: '" STRINGIFY(a) "' and '" STRINGIFY(b) "' types (sizes) don't match!"); \ - memcpy(&a[0],&b[0],_MIN(sizeof(a),sizeof(b))); \ - }while(0) +#define WITHIN(V,L,H) ((V) >= (L) && (V) <= (H)) +#define NUMERIC(a) WITHIN(a, '0', '9') +#define DECIMAL(a) (NUMERIC(a) || a == '.') +#define NUMERIC_SIGNED(a) (NUMERIC(a) || (a) == '-' || (a) == '+') +#define DECIMAL_SIGNED(a) (DECIMAL(a) || (a) == '-' || (a) == '+') +#define COUNT(a) (sizeof(a)/sizeof(*a)) +#define ZERO(a) memset(a,0,sizeof(a)) +#define COPY(a,b) memcpy(a,b,MIN(sizeof(a),sizeof(b))) // Macros for initializing arrays -#define LIST_16(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P -#define LIST_15(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O -#define LIST_14(A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N -#define LIST_13(A,B,C,D,E,F,G,H,I,J,K,L,M,...) A,B,C,D,E,F,G,H,I,J,K,L,M -#define LIST_12(A,B,C,D,E,F,G,H,I,J,K,L,...) A,B,C,D,E,F,G,H,I,J,K,L -#define LIST_11(A,B,C,D,E,F,G,H,I,J,K,...) A,B,C,D,E,F,G,H,I,J,K -#define LIST_10(A,B,C,D,E,F,G,H,I,J,...) A,B,C,D,E,F,G,H,I,J -#define LIST_9( A,B,C,D,E,F,G,H,I,...) A,B,C,D,E,F,G,H,I -#define LIST_8( A,B,C,D,E,F,G,H,...) A,B,C,D,E,F,G,H -#define LIST_7( A,B,C,D,E,F,G,...) A,B,C,D,E,F,G -#define LIST_6( A,B,C,D,E,F,...) A,B,C,D,E,F -#define LIST_5( A,B,C,D,E,...) A,B,C,D,E -#define LIST_4( A,B,C,D,...) A,B,C,D -#define LIST_3( A,B,C,...) A,B,C -#define LIST_2( A,B,...) A,B -#define LIST_1( A,...) A +#define ARRAY_6(v1, v2, v3, v4, v5, v6, ...) { v1, v2, v3, v4, v5, v6 } +#define ARRAY_5(v1, v2, v3, v4, v5, ...) { v1, v2, v3, v4, v5 } +#define ARRAY_4(v1, v2, v3, v4, ...) { v1, v2, v3, v4 } +#define ARRAY_3(v1, v2, v3, ...) { v1, v2, v3 } +#define ARRAY_2(v1, v2, ...) { v1, v2 } +#define ARRAY_1(v1, ...) { v1 } -#define _LIST_N(N,V...) LIST_##N(V) -#define LIST_N(N,V...) _LIST_N(N,V) -#define ARRAY_N(N,V...) { _LIST_N(N,V) } +#define _ARRAY_N(N, ...) ARRAY_ ##N(__VA_ARGS__) +#define ARRAY_N(N, ...) _ARRAY_N(N, __VA_ARGS__) -#define _JOIN_1(O) (O) -#define JOIN_N(N,C,V...) (DO(JOIN,C,LIST_N(N,V))) +// Macros for adding +#define INC_0 1 +#define INC_1 2 +#define INC_2 3 +#define INC_3 4 +#define INC_4 5 +#define INC_5 6 +#define INC_6 7 +#define INC_7 8 +#define INC_8 9 +#define INCREMENT_(n) INC_ ##n +#define INCREMENT(n) INCREMENT_(n) -#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++) -#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++) -#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N) -#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N) +// Macros for subtracting +#define DEC_1 0 +#define DEC_2 1 +#define DEC_3 2 +#define DEC_4 3 +#define DEC_5 4 +#define DEC_6 5 +#define DEC_7 6 +#define DEC_8 7 +#define DEC_9 8 +#define DECREMENT_(n) DEC_ ##n +#define DECREMENT(n) DECREMENT_(n) -#define NOOP (void(0)) +#define PIN_EXISTS(PN) (defined(PN ##_PIN) && PN ##_PIN >= 0) + +#define PENDING(NOW,SOON) ((long)(NOW-(SOON))<0) +#define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON)) + +#define MMM_TO_MMS(MM_M) ((MM_M)/60.0f) +#define MMS_TO_MMM(MM_S) ((MM_S)*60.0f) + +#define NOOP do{} while(0) #define CEILING(x,y) (((x) + (y) - 1) / (y)) +// Avoid double evaluation of arguments on MIN/MAX/ABS +#undef MIN +#undef MAX #undef ABS #ifdef __cplusplus - template static inline constexpr const T ABS(const T v) { return v >= 0 ? v : -v; } + + // C++11 solution that is standards compliant. Return type is deduced automatically + template static inline constexpr auto MIN(const L lhs, const R rhs) -> decltype(lhs + rhs) { + return lhs < rhs ? lhs : rhs; + } + template static inline constexpr auto MAX(const L lhs, const R rhs) -> decltype(lhs + rhs){ + return lhs > rhs ? lhs : rhs; + } + template static inline constexpr const T ABS(const T v) { + return v >= 0 ? v : -v; + } #else - #define ABS(a) ({__typeof__(a) _a = (a); _a >= 0 ? _a : -_a;}) + + // Using GCC extensions, but Travis GCC version does not like it and gives + // "error: statement-expressions are not allowed outside functions nor in template-argument lists" + #define MIN(a, b) \ + ({__typeof__(a) _a = (a); \ + __typeof__(b) _b = (b); \ + _a < _b ? _a : _b;}) + + #define MAX(a, b) \ + ({__typeof__(a) _a = (a); \ + __typeof__(b) _b = (b); \ + _a > _b ? _a : _b;}) + + #define ABS(a) \ + ({__typeof__(a) _a = (a); \ + _a >= 0 ? _a : -_a;}) + #endif +#define MIN3(a, b, c) MIN(MIN(a, b), c) +#define MIN4(a, b, c, d) MIN(MIN3(a, b, c), d) +#define MIN5(a, b, c, d, e) MIN(MIN4(a, b, c, d), e) +#define MAX3(a, b, c) MAX(MAX(a, b), c) +#define MAX4(a, b, c, d) MAX(MAX3(a, b, c), d) +#define MAX5(a, b, c, d, e) MAX(MAX4(a, b, c, d), e) + #define UNEAR_ZERO(x) ((x) < 0.000001f) #define NEAR_ZERO(x) WITHIN(x, -0.000001f, 0.000001f) #define NEAR(x,y) NEAR_ZERO((x)-(y)) #define RECIPROCAL(x) (NEAR_ZERO(x) ? 0 : (1 / float(x))) -#define FIXFLOAT(f) ({__typeof__(f) _f = (f); _f + (_f < 0 ? -0.0000005f : 0.0000005f);}) +#define FIXFLOAT(f) (f + (f < 0 ? -0.00005f : 0.00005f)) // // Maths macros that can be overridden by HAL // -#define ACOS(x) acosf(x) #define ATAN2(y, x) atan2f(y, x) #define POW(x, y) powf(x, y) #define SQRT(x) sqrtf(x) -#define RSQRT(x) (1.0f / sqrtf(x)) +#define RSQRT(x) (1 / sqrtf(x)) #define CEIL(x) ceilf(x) #define FLOOR(x) floorf(x) #define LROUND(x) lroundf(x) #define FMOD(x, y) fmodf(x, y) #define HYPOT(x,y) SQRT(HYPOT2(x,y)) -// Use NUM_ARGS(__VA_ARGS__) to get the number of variadic arguments -#define _NUM_ARGS(_,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A,OUT,...) OUT -#define NUM_ARGS(V...) _NUM_ARGS(0,V,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) - -#ifdef __cplusplus - - #ifndef _MINMAX_H_ - #define _MINMAX_H_ - - extern "C++" { - - // C++11 solution that is standards compliant. Return type is deduced automatically - template static inline constexpr auto _MIN(const L lhs, const R rhs) -> decltype(lhs + rhs) { - return lhs < rhs ? lhs : rhs; - } - template static inline constexpr auto _MAX(const L lhs, const R rhs) -> decltype(lhs + rhs) { - return lhs > rhs ? lhs : rhs; - } - template static inline constexpr const T _MIN(T V, Ts... Vs) { return _MIN(V, _MIN(Vs...)); } - template static inline constexpr const T _MAX(T V, Ts... Vs) { return _MAX(V, _MAX(Vs...)); } - - } - - #endif - -#else - - #define MIN_2(a,b) ((a)<(b)?(a):(b)) - #define MIN_3(a,V...) MIN_2(a,MIN_2(V)) - #define MIN_4(a,V...) MIN_2(a,MIN_3(V)) - #define MIN_5(a,V...) MIN_2(a,MIN_4(V)) - #define MIN_6(a,V...) MIN_2(a,MIN_5(V)) - #define MIN_7(a,V...) MIN_2(a,MIN_6(V)) - #define MIN_8(a,V...) MIN_2(a,MIN_7(V)) - #define MIN_9(a,V...) MIN_2(a,MIN_8(V)) - #define MIN_10(a,V...) MIN_2(a,MIN_9(V)) - #define __MIN_N(N,V...) MIN_##N(V) - #define _MIN_N(N,V...) __MIN_N(N,V) - #define _MIN(V...) _MIN_N(NUM_ARGS(V), V) - - #define MAX_2(a,b) ((a)>(b)?(a):(b)) - #define MAX_3(a,V...) MAX_2(a,MAX_2(V)) - #define MAX_4(a,V...) MAX_2(a,MAX_3(V)) - #define MAX_5(a,V...) MAX_2(a,MAX_4(V)) - #define MAX_6(a,V...) MAX_2(a,MAX_5(V)) - #define MAX_7(a,V...) MAX_2(a,MAX_6(V)) - #define MAX_8(a,V...) MAX_2(a,MAX_7(V)) - #define MAX_9(a,V...) MAX_2(a,MAX_8(V)) - #define MAX_10(a,V...) MAX_2(a,MAX_9(V)) - #define __MAX_N(N,V...) MAX_##N(V) - #define _MAX_N(N,V...) __MAX_N(N,V) - #define _MAX(V...) _MAX_N(NUM_ARGS(V), V) - -#endif - -// Macros for adding -#define INC_0 1 -#define INC_1 2 -#define INC_2 3 -#define INC_3 4 -#define INC_4 5 -#define INC_5 6 -#define INC_6 7 -#define INC_7 8 -#define INC_8 9 -#define INC_9 10 -#define INC_10 11 -#define INC_11 12 -#define INC_12 13 -#define INC_13 14 -#define INC_14 15 -#define INC_15 16 -#define INCREMENT_(n) INC_##n -#define INCREMENT(n) INCREMENT_(n) - -#define ADD0(N) N -#define ADD1(N) INCREMENT_(N) -#define ADD2(N) ADD1(ADD1(N)) -#define ADD3(N) ADD1(ADD2(N)) -#define ADD4(N) ADD2(ADD2(N)) -#define ADD5(N) ADD2(ADD3(N)) -#define ADD6(N) ADD3(ADD3(N)) -#define ADD7(N) ADD3(ADD4(N)) -#define ADD8(N) ADD4(ADD4(N)) -#define ADD9(N) ADD4(ADD5(N)) -#define ADD10(N) ADD5(ADD5(N)) - -// Macros for subtracting -#define DEC_0 0 -#define DEC_1 0 -#define DEC_2 1 -#define DEC_3 2 -#define DEC_4 3 -#define DEC_5 4 -#define DEC_6 5 -#define DEC_7 6 -#define DEC_8 7 -#define DEC_9 8 -#define DEC_10 9 -#define DEC_11 10 -#define DEC_12 11 -#define DEC_13 12 -#define DEC_14 13 -#define DEC_15 14 -#define DECREMENT_(n) DEC_##n -#define DECREMENT(n) DECREMENT_(n) - -#define SUB0(N) N -#define SUB1(N) DECREMENT_(N) -#define SUB2(N) SUB1(SUB1(N)) -#define SUB3(N) SUB1(SUB2(N)) -#define SUB4(N) SUB2(SUB2(N)) -#define SUB5(N) SUB2(SUB3(N)) -#define SUB6(N) SUB3(SUB3(N)) -#define SUB7(N) SUB3(SUB4(N)) -#define SUB8(N) SUB4(SUB4(N)) -#define SUB9(N) SUB4(SUB5(N)) -#define SUB10(N) SUB5(SUB5(N)) - -// -// Primitives supporting precompiler REPEAT -// -#define FIRST(a,...) a -#define SECOND(a,b,...) b -#define THIRD(a,b,c,...) c - -// Defer expansion -#define EMPTY() -#define DEFER(M) M EMPTY() -#define DEFER2(M) M EMPTY EMPTY()() -#define DEFER3(M) M EMPTY EMPTY EMPTY()()() -#define DEFER4(M) M EMPTY EMPTY EMPTY EMPTY()()()() - -// Force define expansion -#define EVAL(V...) EVAL16(V) -#define EVAL1024(V...) EVAL512(EVAL512(V)) -#define EVAL512(V...) EVAL256(EVAL256(V)) -#define EVAL256(V...) EVAL128(EVAL128(V)) -#define EVAL128(V...) EVAL64(EVAL64(V)) -#define EVAL64(V...) EVAL32(EVAL32(V)) -#define EVAL32(V...) EVAL16(EVAL16(V)) -#define EVAL16(V...) EVAL8(EVAL8(V)) -#define EVAL8(V...) EVAL4(EVAL4(V)) -#define EVAL4(V...) EVAL2(EVAL2(V)) -#define EVAL2(V...) EVAL1(EVAL1(V)) -#define EVAL1(V...) V - -#define IS_PROBE(V...) SECOND(V, 0) // Get the second item passed, or 0 -#define PROBE() ~, 1 // Second item will be 1 if this is passed -#define _NOT_0 PROBE() -#define NOT(x) IS_PROBE(_CAT(_NOT_, x)) // NOT('0') gets '1'. Anything else gets '0'. -#define _BOOL(x) NOT(NOT(x)) // NOT('0') gets '0'. Anything else gets '1'. - -#define IF_ELSE(TF) _IF_ELSE(_BOOL(TF)) -#define _IF_ELSE(TF) _CAT(_IF_, TF) - -#define _IF_1(V...) V _IF_1_ELSE -#define _IF_0(...) _IF_0_ELSE - -#define _IF_1_ELSE(...) -#define _IF_0_ELSE(V...) V - -#define HAS_ARGS(V...) _BOOL(FIRST(_END_OF_ARGUMENTS_ V)()) -#define _END_OF_ARGUMENTS_() 0 - - -// Simple Inline IF Macros, friendly to use in other macro definitions -#define IF(O, A, B) ((O) ? (A) : (B)) -#define IF_0(O, A) IF(O, A, 0) -#define IF_1(O, A) IF(O, A, 1) - -// -// REPEAT core macros. Recurse N times with ascending I. -// - -// Call OP(I) N times with ascending counter. -#define _REPEAT(_RPT_I,_RPT_N,_RPT_OP) \ - _RPT_OP(_RPT_I) \ - IF_ELSE(SUB1(_RPT_N)) \ - ( DEFER2(__REPEAT)()(ADD1(_RPT_I),SUB1(_RPT_N),_RPT_OP) ) \ - ( /* Do nothing */ ) -#define __REPEAT() _REPEAT - -// Call OP(I, ...) N times with ascending counter. -#define _REPEAT2(_RPT_I,_RPT_N,_RPT_OP,V...) \ - _RPT_OP(_RPT_I,V) \ - IF_ELSE(SUB1(_RPT_N)) \ - ( DEFER2(__REPEAT2)()(ADD1(_RPT_I),SUB1(_RPT_N),_RPT_OP,V) ) \ - ( /* Do nothing */ ) -#define __REPEAT2() _REPEAT2 - -// Repeat a macro passing S...N-1. -#define REPEAT_S(S,N,OP) EVAL(_REPEAT(S,SUB##S(N),OP)) -#define REPEAT(N,OP) REPEAT_S(0,N,OP) - -// Repeat a macro passing 0...N-1 plus additional arguments. -#define REPEAT2_S(S,N,OP,V...) EVAL(_REPEAT2(S,SUB##S(N),OP,V)) -#define REPEAT2(N,OP,V...) REPEAT2_S(0,N,OP,V) - -// Use RREPEAT macros with REPEAT macros for nesting -#define _RREPEAT(_RPT_I,_RPT_N,_RPT_OP) \ - _RPT_OP(_RPT_I) \ - IF_ELSE(SUB1(_RPT_N)) \ - ( DEFER2(__RREPEAT)()(ADD1(_RPT_I),SUB1(_RPT_N),_RPT_OP) ) \ - ( /* Do nothing */ ) -#define __RREPEAT() _RREPEAT -#define _RREPEAT2(_RPT_I,_RPT_N,_RPT_OP,V...) \ - _RPT_OP(_RPT_I,V) \ - IF_ELSE(SUB1(_RPT_N)) \ - ( DEFER2(__RREPEAT2)()(ADD1(_RPT_I),SUB1(_RPT_N),_RPT_OP,V) ) \ - ( /* Do nothing */ ) -#define __RREPEAT2() _RREPEAT2 -#define RREPEAT_S(S,N,OP) EVAL1024(_RREPEAT(S,SUB##S(N),OP)) -#define RREPEAT(N,OP) RREPEAT_S(0,N,OP) -#define RREPEAT2_S(S,N,OP,V...) EVAL1024(_RREPEAT2(S,SUB##S(N),OP,V)) -#define RREPEAT2(N,OP,V...) RREPEAT2_S(0,N,OP,V) - -// See https://github.com/swansontec/map-macro -#define MAP_OUT -#define MAP_END(...) -#define MAP_GET_END() 0, MAP_END -#define MAP_NEXT0(test, next, ...) next MAP_OUT -#define MAP_NEXT1(test, next) MAP_NEXT0 (test, next, 0) -#define MAP_NEXT(test, next) MAP_NEXT1 (MAP_GET_END test, next) -#define MAP0(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP1) (f, peek, __VA_ARGS__) -#define MAP1(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP0) (f, peek, __VA_ARGS__) -#define MAP(f, ...) EVAL512 (MAP1 (f, __VA_ARGS__, (), 0)) +#endif // _CORE_MACROS_H_ diff --git a/Marlin/src/core/millis_t.h b/Marlin/src/core/millis_t.h deleted file mode 100644 index 95bc40e1ec..0000000000 --- a/Marlin/src/core/millis_t.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -typedef uint32_t millis_t; - -#define SEC_TO_MS(N) millis_t((N)*1000UL) -#define MIN_TO_MS(N) SEC_TO_MS((N)*60UL) -#define MS_TO_SEC(N) millis_t((N)/1000UL) - -#define PENDING(NOW,SOON) ((int32_t)(NOW-(SOON))<0) -#define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON)) diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h deleted file mode 100644 index 5852c439a8..0000000000 --- a/Marlin/src/core/multi_language.h +++ /dev/null @@ -1,83 +0,0 @@ -/******************** - * multi_language.h * - ********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ -#pragma once - -typedef const char Language_Str[]; - -#ifdef LCD_LANGUAGE_5 - #define NUM_LANGUAGES 5 -#elif defined(LCD_LANGUAGE_4) - #define NUM_LANGUAGES 4 -#elif defined(LCD_LANGUAGE_3) - #define NUM_LANGUAGES 3 -#elif defined(LCD_LANGUAGE_2) - #define NUM_LANGUAGES 2 -#else - #define NUM_LANGUAGES 1 -#endif - -// Setting the unused languages equal to each other allows -// the compiler to optimize away the conditionals - -#ifndef LCD_LANGUAGE_2 - #define LCD_LANGUAGE_2 LCD_LANGUAGE -#endif - -#ifndef LCD_LANGUAGE_3 - #define LCD_LANGUAGE_3 LCD_LANGUAGE_2 -#endif - -#ifndef LCD_LANGUAGE_4 - #define LCD_LANGUAGE_4 LCD_LANGUAGE_3 -#endif - -#ifndef LCD_LANGUAGE_5 - #define LCD_LANGUAGE_5 LCD_LANGUAGE_4 -#endif - -#define _GET_LANG(LANG) Language_##LANG -#define GET_LANG(LANG) _GET_LANG(LANG) - -#if NUM_LANGUAGES > 1 - extern uint8_t lang; - #define GET_TEXT(MSG) ( \ - lang == 0 ? GET_LANG(LCD_LANGUAGE)::MSG : \ - lang == 1 ? GET_LANG(LCD_LANGUAGE_2)::MSG : \ - lang == 2 ? GET_LANG(LCD_LANGUAGE_3)::MSG : \ - lang == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \ - GET_LANG(LCD_LANGUAGE_5)::MSG \ - ) - #define MAX_LANG_CHARSIZE _MAX(GET_LANG(LCD_LANGUAGE)::CHARSIZE, \ - GET_LANG(LCD_LANGUAGE_2)::CHARSIZE, \ - GET_LANG(LCD_LANGUAGE_3)::CHARSIZE, \ - GET_LANG(LCD_LANGUAGE_4)::CHARSIZE, \ - GET_LANG(LCD_LANGUAGE_5)::CHARSIZE) -#else - #define GET_TEXT(MSG) GET_LANG(LCD_LANGUAGE)::MSG - #define MAX_LANG_CHARSIZE GET_LANG(LCD_LANGUAGE)::CHARSIZE -#endif -#define GET_TEXT_F(MSG) (const __FlashStringHelper*)GET_TEXT(MSG) - -#define GET_LANGUAGE_NAME(INDEX) GET_LANG(LCD_LANGUAGE_##INDEX)::LANGUAGE - -#define MSG_1_LINE(A) A "\0" "\0" -#define MSG_2_LINE(A,B) A "\0" B "\0" -#define MSG_3_LINE(A,B,C) A "\0" B "\0" C diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 0d22f7bfc0..d53d730c6e 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,59 +16,65 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "serial.h" -#include "../inc/MarlinConfig.h" -uint8_t marlin_debug_flags = MARLIN_DEBUG_NONE; +uint8_t marlin_debug_flags = DEBUG_NONE; -static PGMSTR(errormagic, "Error:"); -static PGMSTR(echomagic, "echo:"); +const char errormagic[] PROGMEM = "Error:"; +const char echomagic[] PROGMEM = "echo:"; -#if HAS_MULTI_SERIAL - int8_t serial_port_index = 0; +#if NUM_SERIAL > 1 + void serialprintPGM_P(const int8_t p, const char * str) { + while (char ch = pgm_read_byte(str++)) SERIAL_CHAR_P(p, ch); + } + + void serial_echopair_PGM_P(const int8_t p, const char* s_P, const char *v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, char v) { serialprintPGM_P(p, s_P); SERIAL_CHAR_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, int v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, long v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, float v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, double v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, unsigned int v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + void serial_echopair_PGM_P(const int8_t p, const char* s_P, unsigned long v) { serialprintPGM_P(p, s_P); SERIAL_ECHO_P(p, v); } + + void serial_spaces_P(const int8_t p, uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR_P(p, ' '); } #endif -void serialprintPGM(PGM_P str) { - while (const char c = pgm_read_byte(str++)) SERIAL_CHAR(c); +void serialprintPGM(const char * str) { + while (char ch = pgm_read_byte(str++)) SERIAL_CHAR(ch); } -void serial_echo_start() { serialprintPGM(echomagic); } -void serial_error_start() { serialprintPGM(errormagic); } -void serial_echopair_PGM(PGM_P const s_P, const char *v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(PGM_P const s_P, char v) { serialprintPGM(s_P); SERIAL_CHAR(v); } -void serial_echopair_PGM(PGM_P const s_P, int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(PGM_P const s_P, long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(PGM_P const s_P, float v) { serialprintPGM(s_P); SERIAL_DECIMAL(v); } -void serial_echopair_PGM(PGM_P const s_P, double v) { serialprintPGM(s_P); SERIAL_DECIMAL(v); } -void serial_echopair_PGM(PGM_P const s_P, unsigned int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } -void serial_echopair_PGM(PGM_P const s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, const char *v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, char v) { serialprintPGM(s_P); SERIAL_CHAR(v); } +void serial_echopair_PGM(const char* s_P, int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, float v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, double v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, unsigned int v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +void serial_echopair_PGM(const char* s_P, unsigned long v) { serialprintPGM(s_P); SERIAL_ECHO(v); } void serial_spaces(uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR(' '); } -void serial_ternary(const bool onoff, PGM_P const pre, PGM_P const on, PGM_P const off, PGM_P const post/*=nullptr*/) { - if (pre) serialprintPGM(pre); - serialprintPGM(onoff ? on : off); - if (post) serialprintPGM(post); -} -void serialprint_onoff(const bool onoff) { serialprintPGM(onoff ? PSTR(STR_ON) : PSTR(STR_OFF)); } -void serialprintln_onoff(const bool onoff) { serialprint_onoff(onoff); SERIAL_EOL(); } -void serialprint_truefalse(const bool tf) { serialprintPGM(tf ? PSTR("true") : PSTR("false")); } +#if ENABLED(DEBUG_LEVELING_FEATURE) -void print_bin(uint16_t val) { - for (uint8_t i = 16; i--;) { - SERIAL_CHAR('0' + TEST(val, i)); - if (!(i & 0x3) && i) SERIAL_CHAR(' '); + #include "enum.h" + + void print_xyz(const char* prefix, const char* suffix, const float x, const float y, const float z) { + serialprintPGM(prefix); + SERIAL_CHAR('('); + SERIAL_ECHO(x); + SERIAL_ECHOPAIR(", ", y); + SERIAL_ECHOPAIR(", ", z); + SERIAL_CHAR(')'); + if (suffix) serialprintPGM(suffix); else SERIAL_EOL(); } -} -extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; + void print_xyz(const char* prefix, const char* suffix, const float xyz[]) { + print_xyz(prefix, suffix, xyz[X_AXIS], xyz[Y_AXIS], xyz[Z_AXIS]); + } -void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) { - if (prefix) serialprintPGM(prefix); - SERIAL_ECHOPAIR_P(SP_X_STR, x, SP_Y_STR, y, SP_Z_STR, z); - if (suffix) serialprintPGM(suffix); else SERIAL_EOL(); -} +#endif diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index fc830736a5..bbabdb70e3 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,312 +16,231 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include "../inc/MarlinConfig.h" +#ifndef __SERIAL_H__ +#define __SERIAL_H__ + +#include "../inc/MarlinConfigPre.h" +#include HAL_PATH(../HAL, HAL.h) /** * Define debug bit-masks */ -enum MarlinDebugFlags : uint8_t { - MARLIN_DEBUG_NONE = 0, - MARLIN_DEBUG_ECHO = _BV(0), ///< Echo commands in order as they are processed - MARLIN_DEBUG_INFO = _BV(1), ///< Print messages for code that has debug output - MARLIN_DEBUG_ERRORS = _BV(2), ///< Not implemented - MARLIN_DEBUG_DRYRUN = _BV(3), ///< Ignore temperature setting and E movement commands - MARLIN_DEBUG_COMMUNICATION = _BV(4), ///< Not implemented - #if ENABLED(DEBUG_LEVELING_FEATURE) - MARLIN_DEBUG_LEVELING = _BV(5), ///< Print detailed output for homing and leveling - MARLIN_DEBUG_MESH_ADJUST = _BV(6), ///< UBL bed leveling - #else - MARLIN_DEBUG_LEVELING = 0, - MARLIN_DEBUG_MESH_ADJUST = 0, - #endif - MARLIN_DEBUG_ALL = 0xFF +enum DebugFlags : unsigned char { + DEBUG_NONE = 0, + DEBUG_ECHO = _BV(0), ///< Echo commands in order as they are processed + DEBUG_INFO = _BV(1), ///< Print messages for code that has debug output + DEBUG_ERRORS = _BV(2), ///< Not implemented + DEBUG_DRYRUN = _BV(3), ///< Ignore temperature setting and E movement commands + DEBUG_COMMUNICATION = _BV(4), ///< Not implemented + DEBUG_LEVELING = _BV(5), ///< Print detailed output for homing and leveling + DEBUG_MESH_ADJUST = _BV(6), ///< UBL bed leveling + DEBUG_ALL = 0xFF }; extern uint8_t marlin_debug_flags; -#define DEBUGGING(F) (marlin_debug_flags & (MARLIN_DEBUG_## F)) +#define DEBUGGING(F) (marlin_debug_flags & (DEBUG_## F)) -#define SERIAL_BOTH 0x7F -#if HAS_MULTI_SERIAL - extern int8_t serial_port_index; - #define _PORT_REDIRECT(n,p) REMEMBER(n,serial_port_index,p) - #define _PORT_RESTORE(n) RESTORE(n) +extern const char echomagic[] PROGMEM; +extern const char errormagic[] PROGMEM; - #ifdef SERIAL_CATCHALL - #define SERIAL_OUT(WHAT, V...) (void)CAT(MYSERIAL,SERIAL_CATCHALL).WHAT(V) - #else - #define SERIAL_OUT(WHAT, V...) do{ \ - if (!serial_port_index || serial_port_index == SERIAL_BOTH) (void)MYSERIAL0.WHAT(V); \ - if ( serial_port_index) (void)MYSERIAL1.WHAT(V); \ - }while(0) - #endif - - #define SERIAL_ASSERT(P) if(serial_port_index!=(P)){ debugger(); } -#else - #define _PORT_REDIRECT(n,p) NOOP - #define _PORT_RESTORE(n) NOOP - #define SERIAL_OUT(WHAT, V...) (void)MYSERIAL0.WHAT(V) - #define SERIAL_ASSERT(P) NOOP -#endif - -#define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) -#define PORT_RESTORE() _PORT_RESTORE(1) - -#define SERIAL_ECHO(x) SERIAL_OUT(print, x) -#define SERIAL_ECHO_F(V...) SERIAL_OUT(print, V) -#define SERIAL_ECHOLN(x) SERIAL_OUT(println, x) -#define SERIAL_PRINT(x,b) SERIAL_OUT(print, x, b) -#define SERIAL_PRINTLN(x,b) SERIAL_OUT(println, x, b) -#define SERIAL_PRINTF(V...) SERIAL_OUT(printf, V) -#define SERIAL_FLUSH() SERIAL_OUT(flush) - -#ifdef ARDUINO_ARCH_STM32 - #define SERIAL_FLUSHTX() SERIAL_OUT(flush) -#elif TX_BUFFER_SIZE > 0 - #define SERIAL_FLUSHTX() SERIAL_OUT(flushTX) -#else +#if TX_BUFFER_SIZE < 1 + #define SERIAL_FLUSHTX_P(p) #define SERIAL_FLUSHTX() #endif -// Print up to 10 chars from a list -#define __CHAR_N(N,V...) _CHAR_##N(V) -#define _CHAR_N(N,V...) __CHAR_N(N,V) -#define _CHAR_1(c) SERIAL_OUT(write, c) -#define _CHAR_2(a,b) do{ _CHAR_1(a); _CHAR_1(b); }while(0) -#define _CHAR_3(a,V...) do{ _CHAR_1(a); _CHAR_2(V); }while(0) -#define _CHAR_4(a,V...) do{ _CHAR_1(a); _CHAR_3(V); }while(0) -#define _CHAR_5(a,V...) do{ _CHAR_1(a); _CHAR_4(V); }while(0) -#define _CHAR_6(a,V...) do{ _CHAR_1(a); _CHAR_5(V); }while(0) -#define _CHAR_7(a,V...) do{ _CHAR_1(a); _CHAR_6(V); }while(0) -#define _CHAR_8(a,V...) do{ _CHAR_1(a); _CHAR_7(V); }while(0) -#define _CHAR_9(a,V...) do{ _CHAR_1(a); _CHAR_8(V); }while(0) -#define _CHAR_10(a,V...) do{ _CHAR_1(a); _CHAR_9(V); }while(0) +#if NUM_SERIAL > 1 + #define SERIAL_CHAR_P(p,x) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.write(x) : MYSERIAL1.write(x)) : SERIAL_CHAR(x)) + #define SERIAL_PROTOCOL_P(p,x) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.print(x) : MYSERIAL1.print(x)) : SERIAL_PROTOCOL(x)) + #define SERIAL_PROTOCOL_F_P(p,x,y) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.print(x,y) : MYSERIAL1.print(x,y)) : SERIAL_PROTOCOL_F(x,y)) + #define SERIAL_PROTOCOLLN_P(p,x) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.println(x) : MYSERIAL1.println(x)) : SERIAL_PROTOCOLLN(x)) + #define SERIAL_PRINT_P(p,x,b) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.print(x,b) : MYSERIAL1.print(x,b)) : SERIAL_PRINT(x,b)) + #define SERIAL_PRINTLN_P(p,x,b) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.println(x,b) : MYSERIAL1.println(x,b)) : SERIAL_PRINTLN(x,b)) + #define SERIAL_PRINTF_P(p,args...) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.printf(args) : MYSERIAL1.printf(args)) : SERIAL_PRINTF(args)) -#define SERIAL_CHAR(V...) _CHAR_N(NUM_ARGS(V),V) + #define SERIAL_CHAR(x) (MYSERIAL0.write(x), MYSERIAL1.write(x)) + #define SERIAL_PROTOCOL(x) (MYSERIAL0.print(x), MYSERIAL1.print(x)) + #define SERIAL_PROTOCOL_F(x,y) (MYSERIAL0.print(x,y), MYSERIAL1.print(x,y)) + #define SERIAL_PROTOCOLLN(x) (MYSERIAL0.println(x), MYSERIAL1.println(x)) + #define SERIAL_PRINT(x,b) (MYSERIAL0.print(x,b), MYSERIAL1.print(x,b)) + #define SERIAL_PRINTLN(x,b) (MYSERIAL0.println(x,b), MYSERIAL1.println(x,b)) + #define SERIAL_PRINTF(args...) (MYSERIAL0.printf(args), MYSERIAL1.printf(args)) -// Print up to 12 pairs of values. Odd elements auto-wrapped in PSTR(). -#define __SEP_N(N,V...) _SEP_##N(V) -#define _SEP_N(N,V...) __SEP_N(N,V) -#define _SEP_1(PRE) SERIAL_ECHOPGM(PRE) -#define _SEP_2(PRE,V) serial_echopair_PGM(PSTR(PRE),V) -#define _SEP_3(a,b,c) do{ _SEP_2(a,b); SERIAL_ECHOPGM(c); }while(0) -#define _SEP_4(a,b,V...) do{ _SEP_2(a,b); _SEP_2(V); }while(0) -#define _SEP_5(a,b,V...) do{ _SEP_2(a,b); _SEP_3(V); }while(0) -#define _SEP_6(a,b,V...) do{ _SEP_2(a,b); _SEP_4(V); }while(0) -#define _SEP_7(a,b,V...) do{ _SEP_2(a,b); _SEP_5(V); }while(0) -#define _SEP_8(a,b,V...) do{ _SEP_2(a,b); _SEP_6(V); }while(0) -#define _SEP_9(a,b,V...) do{ _SEP_2(a,b); _SEP_7(V); }while(0) -#define _SEP_10(a,b,V...) do{ _SEP_2(a,b); _SEP_8(V); }while(0) -#define _SEP_11(a,b,V...) do{ _SEP_2(a,b); _SEP_9(V); }while(0) -#define _SEP_12(a,b,V...) do{ _SEP_2(a,b); _SEP_10(V); }while(0) -#define _SEP_13(a,b,V...) do{ _SEP_2(a,b); _SEP_11(V); }while(0) -#define _SEP_14(a,b,V...) do{ _SEP_2(a,b); _SEP_12(V); }while(0) -#define _SEP_15(a,b,V...) do{ _SEP_2(a,b); _SEP_13(V); }while(0) -#define _SEP_16(a,b,V...) do{ _SEP_2(a,b); _SEP_14(V); }while(0) -#define _SEP_17(a,b,V...) do{ _SEP_2(a,b); _SEP_15(V); }while(0) -#define _SEP_18(a,b,V...) do{ _SEP_2(a,b); _SEP_16(V); }while(0) -#define _SEP_19(a,b,V...) do{ _SEP_2(a,b); _SEP_17(V); }while(0) -#define _SEP_20(a,b,V...) do{ _SEP_2(a,b); _SEP_18(V); }while(0) -#define _SEP_21(a,b,V...) do{ _SEP_2(a,b); _SEP_19(V); }while(0) -#define _SEP_22(a,b,V...) do{ _SEP_2(a,b); _SEP_20(V); }while(0) -#define _SEP_23(a,b,V...) do{ _SEP_2(a,b); _SEP_21(V); }while(0) -#define _SEP_24(a,b,V...) do{ _SEP_2(a,b); _SEP_22(V); }while(0) + #define SERIAL_FLUSH_P(p) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.flush() : MYSERIAL1.flush()) : SERIAL_FLUSH()) + #define SERIAL_FLUSH() (MYSERIAL0.flush(), MYSERIAL1.flush()) + #if TX_BUFFER_SIZE > 0 + #define SERIAL_FLUSHTX_P(p) (WITHIN(p, 0, NUM_SERIAL-1) ? (p == 0 ? MYSERIAL0.flushTX() : MYSERIAL1.flushTX()) : SERIAL_FLUSHTX()) + #define SERIAL_FLUSHTX() (MYSERIAL0.flushTX(), MYSERIAL1.flushTX()) + #endif -#define SERIAL_ECHOPAIR(V...) _SEP_N(NUM_ARGS(V),V) + #define SERIAL_EOL_P(p) SERIAL_CHAR_P(p,'\n') -// Print up to 12 pairs of values. Odd elements must be PSTR pointers. -#define __SEP_N_P(N,V...) _SEP_##N##_P(V) -#define _SEP_N_P(N,V...) __SEP_N_P(N,V) -#define _SEP_1_P(PRE) serialprintPGM(PRE) -#define _SEP_2_P(PRE,V) serial_echopair_PGM(PRE,V) -#define _SEP_3_P(a,b,c) do{ _SEP_2_P(a,b); serialprintPGM(c); }while(0) -#define _SEP_4_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_2_P(V); }while(0) -#define _SEP_5_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_3_P(V); }while(0) -#define _SEP_6_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_4_P(V); }while(0) -#define _SEP_7_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_5_P(V); }while(0) -#define _SEP_8_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_6_P(V); }while(0) -#define _SEP_9_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_7_P(V); }while(0) -#define _SEP_10_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_8_P(V); }while(0) -#define _SEP_11_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_9_P(V); }while(0) -#define _SEP_12_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_10_P(V); }while(0) -#define _SEP_13_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_11_P(V); }while(0) -#define _SEP_14_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_12_P(V); }while(0) -#define _SEP_15_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_13_P(V); }while(0) -#define _SEP_16_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_14_P(V); }while(0) -#define _SEP_17_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_15_P(V); }while(0) -#define _SEP_18_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_16_P(V); }while(0) -#define _SEP_19_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_17_P(V); }while(0) -#define _SEP_20_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_18_P(V); }while(0) -#define _SEP_21_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_19_P(V); }while(0) -#define _SEP_22_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_20_P(V); }while(0) -#define _SEP_23_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_21_P(V); }while(0) -#define _SEP_24_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_22_P(V); }while(0) + #define SERIAL_PROTOCOLCHAR_P(p,x) SERIAL_CHAR_P(p,x) + #define SERIAL_PROTOCOLPGM_P(p,x) (serialprintPGM_P(p,PSTR(x))) + #define SERIAL_PROTOCOLLNPGM_P(p,x) (serialprintPGM_P(p,PSTR(x "\n"))) + #define SERIAL_PROTOCOLPAIR_P(p, pre, value) (serial_echopair_PGM_P(p,PSTR(pre),(value))) + #define SERIAL_PROTOCOLLNPAIR_P(p, pre, value) do { SERIAL_PROTOCOLPAIR_P(p, pre, value); SERIAL_EOL_P(p); } while(0) -#define SERIAL_ECHOPAIR_P(V...) _SEP_N_P(NUM_ARGS(V),V) + #define SERIAL_ECHO_START_P(p) (serialprintPGM_P(p,echomagic)) + #define SERIAL_ECHO_P(p,x) SERIAL_PROTOCOL_P(p,x) + #define SERIAL_ECHOPGM_P(p,x) SERIAL_PROTOCOLPGM_P(p,x) + #define SERIAL_ECHOLN_P(p,x) SERIAL_PROTOCOLLN_P(p,x) + #define SERIAL_ECHOLNPGM_P(p,x) SERIAL_PROTOCOLLNPGM_P(p,x) + #define SERIAL_ECHOPAIR_P(p,pre,value) SERIAL_PROTOCOLPAIR_P(p, pre, value) + #define SERIAL_ECHOLNPAIR_P(p,pre, value) SERIAL_PROTOCOLLNPAIR_P(p, pre, value) + #define SERIAL_ECHO_F_P(p,x,y) SERIAL_PROTOCOL_F_P(p,x,y) -// Print up to 12 pairs of values followed by newline -#define __SELP_N(N,V...) _SELP_##N(V) -#define _SELP_N(N,V...) __SELP_N(N,V) -#define _SELP_1(PRE) SERIAL_ECHOLNPGM(PRE) -#define _SELP_2(PRE,V) do{ serial_echopair_PGM(PSTR(PRE),V); SERIAL_EOL(); }while(0) -#define _SELP_3(a,b,c) do{ _SEP_2(a,b); SERIAL_ECHOLNPGM(c); }while(0) -#define _SELP_4(a,b,V...) do{ _SEP_2(a,b); _SELP_2(V); }while(0) -#define _SELP_5(a,b,V...) do{ _SEP_2(a,b); _SELP_3(V); }while(0) -#define _SELP_6(a,b,V...) do{ _SEP_2(a,b); _SELP_4(V); }while(0) -#define _SELP_7(a,b,V...) do{ _SEP_2(a,b); _SELP_5(V); }while(0) -#define _SELP_8(a,b,V...) do{ _SEP_2(a,b); _SELP_6(V); }while(0) -#define _SELP_9(a,b,V...) do{ _SEP_2(a,b); _SELP_7(V); }while(0) -#define _SELP_10(a,b,V...) do{ _SEP_2(a,b); _SELP_8(V); }while(0) -#define _SELP_11(a,b,V...) do{ _SEP_2(a,b); _SELP_9(V); }while(0) -#define _SELP_12(a,b,V...) do{ _SEP_2(a,b); _SELP_10(V); }while(0) -#define _SELP_13(a,b,V...) do{ _SEP_2(a,b); _SELP_11(V); }while(0) -#define _SELP_14(a,b,V...) do{ _SEP_2(a,b); _SELP_12(V); }while(0) -#define _SELP_15(a,b,V...) do{ _SEP_2(a,b); _SELP_13(V); }while(0) -#define _SELP_16(a,b,V...) do{ _SEP_2(a,b); _SELP_14(V); }while(0) -#define _SELP_17(a,b,V...) do{ _SEP_2(a,b); _SELP_15(V); }while(0) -#define _SELP_18(a,b,V...) do{ _SEP_2(a,b); _SELP_16(V); }while(0) -#define _SELP_19(a,b,V...) do{ _SEP_2(a,b); _SELP_17(V); }while(0) -#define _SELP_20(a,b,V...) do{ _SEP_2(a,b); _SELP_18(V); }while(0) -#define _SELP_21(a,b,V...) do{ _SEP_2(a,b); _SELP_19(V); }while(0) -#define _SELP_22(a,b,V...) do{ _SEP_2(a,b); _SELP_20(V); }while(0) -#define _SELP_23(a,b,V...) do{ _SEP_2(a,b); _SELP_21(V); }while(0) -#define _SELP_24(a,b,V...) do{ _SEP_2(a,b); _SELP_22(V); }while(0) -#define _SELP_25(a,b,V...) do{ _SEP_2(a,b); _SELP_23(V); }while(0) -#define _SELP_26(a,b,V...) do{ _SEP_2(a,b); _SELP_24(V); }while(0) -#define _SELP_27(a,b,V...) do{ _SEP_2(a,b); _SELP_25(V); }while(0) -#define _SELP_28(a,b,V...) do{ _SEP_2(a,b); _SELP_26(V); }while(0) -#define _SELP_29(a,b,V...) do{ _SEP_2(a,b); _SELP_27(V); }while(0) -#define _SELP_30(a,b,V...) do{ _SEP_2(a,b); _SELP_28(V); }while(0) // Eat two args, pass the rest up + #define SERIAL_ERROR_START_P(p) (serialprintPGM_P(p,errormagic)) + #define SERIAL_ERROR_P(p,x) SERIAL_PROTOCOL_P(p,x) + #define SERIAL_ERRORPGM_P(p,x) SERIAL_PROTOCOLPGM_P(p,x) + #define SERIAL_ERRORLN_P(p,x) SERIAL_PROTOCOLLN_P(p,x) + #define SERIAL_ERRORLNPGM_P(p,x) SERIAL_PROTOCOLLNPGM_P(p,x) -#define SERIAL_ECHOLNPAIR(V...) _SELP_N(NUM_ARGS(V),V) + // These macros compensate for float imprecision + #define SERIAL_PROTOCOLPAIR_F_P(p, pre, value) SERIAL_PROTOCOLPAIR_P(p, pre, FIXFLOAT(value)) + #define SERIAL_PROTOCOLLNPAIR_F_P(p, pre, value) SERIAL_PROTOCOLLNPAIR_P(p, pre, FIXFLOAT(value)) + #define SERIAL_ECHOPAIR_F_P(p,pre,value) SERIAL_ECHOPAIR_P(p, pre, FIXFLOAT(value)) + #define SERIAL_ECHOLNPAIR_F_P(p,pre, value) SERIAL_ECHOLNPAIR_P(p, pre, FIXFLOAT(value)) -// Print up to 12 pairs of values followed by newline -#define __SELP_N_P(N,V...) _SELP_##N##_P(V) -#define _SELP_N_P(N,V...) __SELP_N_P(N,V) -#define _SELP_1_P(PRE) serialprintPGM(PRE) -#define _SELP_2_P(PRE,V) do{ serial_echopair_PGM(PRE,V); SERIAL_EOL(); }while(0) -#define _SELP_3_P(a,b,c) do{ _SEP_2_P(a,b); serialprintPGM(c); }while(0) -#define _SELP_4_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_2_P(V); }while(0) -#define _SELP_5_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_3_P(V); }while(0) -#define _SELP_6_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_4_P(V); }while(0) -#define _SELP_7_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_5_P(V); }while(0) -#define _SELP_8_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_6_P(V); }while(0) -#define _SELP_9_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_7_P(V); }while(0) -#define _SELP_10_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_8_P(V); }while(0) -#define _SELP_11_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_9_P(V); }while(0) -#define _SELP_12_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_10_P(V); }while(0) -#define _SELP_13_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_11_P(V); }while(0) -#define _SELP_14_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_12_P(V); }while(0) -#define _SELP_15_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_13_P(V); }while(0) -#define _SELP_16_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_14_P(V); }while(0) -#define _SELP_17_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_15_P(V); }while(0) -#define _SELP_18_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_16_P(V); }while(0) -#define _SELP_19_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_17_P(V); }while(0) -#define _SELP_20_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_18_P(V); }while(0) -#define _SELP_21_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_19_P(V); }while(0) -#define _SELP_22_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_20_P(V); }while(0) -#define _SELP_23_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_21_P(V); }while(0) -#define _SELP_24_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_22_P(V); }while(0) -#define _SELP_25_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_23_P(V); }while(0) -#define _SELP_26_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_24_P(V); }while(0) -#define _SELP_27_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_25_P(V); }while(0) -#define _SELP_28_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_26_P(V); }while(0) -#define _SELP_29_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_27_P(V); }while(0) -#define _SELP_30_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_28_P(V); }while(0) // Eat two args, pass the rest up + void serial_echopair_PGM_P(const int8_t p, const char* s_P, const char *v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, char v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, int v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, long v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, float v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, double v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, unsigned int v); + void serial_echopair_PGM_P(const int8_t p, const char* s_P, unsigned long v); + FORCE_INLINE void serial_echopair_PGM_P(const int8_t p, const char* s_P, uint8_t v) { serial_echopair_PGM_P(p, s_P, (int)v); } + FORCE_INLINE void serial_echopair_PGM_P(const int8_t p, const char* s_P, bool v) { serial_echopair_PGM_P(p, s_P, (int)v); } + FORCE_INLINE void serial_echopair_PGM_P(const int8_t p, const char* s_P, void *v) { serial_echopair_PGM_P(p, s_P, (unsigned long)v); } -#define SERIAL_ECHOLNPAIR_P(V...) _SELP_N_P(NUM_ARGS(V),V) + void serial_spaces_P(const int8_t p, uint8_t count); + #define SERIAL_ECHO_SP_P(p,C) serial_spaces_P(p,C) + #define SERIAL_ERROR_SP_P(p,C) serial_spaces_P(p,C) + #define SERIAL_PROTOCOL_SP_P(p,C) serial_spaces_P(p,C) -// Print up to 20 comma-separated pairs of values -#define __SLST_N(N,V...) _SLST_##N(V) -#define _SLST_N(N,V...) __SLST_N(N,V) -#define _SLST_1(a) SERIAL_ECHO(a) -#define _SLST_2(a,b) do{ SERIAL_ECHO(a); SERIAL_ECHOPAIR(", ",b); }while(0) -#define _SLST_3(a,b,c) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_1(c); }while(0) -#define _SLST_4(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_2(V); }while(0) -#define _SLST_5(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_3(V); }while(0) -#define _SLST_6(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_4(V); }while(0) -#define _SLST_7(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_5(V); }while(0) -#define _SLST_8(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_6(V); }while(0) -#define _SLST_9(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_7(V); }while(0) -#define _SLST_10(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_8(V); }while(0) -#define _SLST_11(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_9(V); }while(0) -#define _SLST_12(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_10(V); }while(0) -#define _SLST_13(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_11(V); }while(0) -#define _SLST_14(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_12(V); }while(0) -#define _SLST_15(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_13(V); }while(0) -#define _SLST_16(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_14(V); }while(0) -#define _SLST_17(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_15(V); }while(0) -#define _SLST_18(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_16(V); }while(0) -#define _SLST_19(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_17(V); }while(0) -#define _SLST_20(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_18(V); }while(0) // Eat two args, pass the rest up - -#define SERIAL_ECHOLIST(pre,V...) do{ SERIAL_ECHOPGM(pre); _SLST_N(NUM_ARGS(V),V); }while(0) -#define SERIAL_ECHOLIST_N(N,V...) _SLST_N(N,LIST_N(N,V)) - -#define SERIAL_ECHOPGM_P(P) (serialprintPGM(P)) -#define SERIAL_ECHOLNPGM_P(P) (serialprintPGM(P "\n")) - -#define SERIAL_ECHOPGM(S) (serialprintPGM(PSTR(S))) -#define SERIAL_ECHOLNPGM(S) (serialprintPGM(PSTR(S "\n"))) - -#define SERIAL_ECHOPAIR_F_P(P,V...) do{ serialprintPGM(P); SERIAL_ECHO_F(V); }while(0) -#define SERIAL_ECHOLNPAIR_F_P(V...) do{ SERIAL_ECHOPAIR_F_P(V); SERIAL_EOL(); }while(0) - -#define SERIAL_ECHOPAIR_F(S,V...) SERIAL_ECHOPAIR_F_P(PSTR(S),V) -#define SERIAL_ECHOLNPAIR_F(V...) do{ SERIAL_ECHOPAIR_F(V); SERIAL_EOL(); }while(0) - -#define SERIAL_ECHO_START() serial_echo_start() -#define SERIAL_ERROR_START() serial_error_start() -#define SERIAL_EOL() SERIAL_CHAR('\n') - -#define SERIAL_ECHO_MSG(V...) do{ SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(V); }while(0) -#define SERIAL_ERROR_MSG(V...) do{ SERIAL_ERROR_START(); SERIAL_ECHOLNPAIR(V); }while(0) - -#define SERIAL_ECHO_SP(C) serial_spaces(C) - -#define SERIAL_ECHO_TERNARY(TF, PRE, ON, OFF, POST) serial_ternary(TF, PSTR(PRE), PSTR(ON), PSTR(OFF), PSTR(POST)) - -#if SERIAL_FLOAT_PRECISION - #define SERIAL_DECIMAL(V) SERIAL_PRINT(V, SERIAL_FLOAT_PRECISION) + void serialprintPGM_P(const int8_t p, const char* str); #else - #define SERIAL_DECIMAL(V) SERIAL_ECHO(V) + #define SERIAL_CHAR_P(p,x) SERIAL_CHAR(x) + #define SERIAL_PROTOCOL_P(p,x) SERIAL_PROTOCOL(x) + #define SERIAL_PROTOCOL_F_P(p,x,y) SERIAL_PROTOCOL_F(x,y) + #define SERIAL_PROTOCOLLN_P(p,x) SERIAL_PROTOCOLLN(x) + #define SERIAL_PRINT_P(p,x,b) SERIAL_PRINT(x,b) + #define SERIAL_PRINTLN_P(p,x,b) SERIAL_PRINTLN(x,b) + #define SERIAL_PRINTF_P(p,args...) SERIAL_PRINTF(args) + + #define SERIAL_CHAR(x) MYSERIAL0.write(x) + #define SERIAL_PROTOCOL(x) MYSERIAL0.print(x) + #define SERIAL_PROTOCOL_F(x,y) MYSERIAL0.print(x,y) + #define SERIAL_PROTOCOLLN(x) MYSERIAL0.println(x) + #define SERIAL_PRINT(x,b) MYSERIAL0.print(x,b) + #define SERIAL_PRINTLN(x,b) MYSERIAL0.println(x,b) + #define SERIAL_PRINTF(args...) MYSERIAL0.printf(args) + + #define SERIAL_FLUSH_P(p) SERIAL_FLUSH() + #define SERIAL_FLUSH() MYSERIAL0.flush() + #if TX_BUFFER_SIZE > 0 + #define SERIAL_FLUSHTX_P(p) SERIAL_FLUSHTX() + #define SERIAL_FLUSHTX() MYSERIAL0.flushTX() + #endif + + #define SERIAL_EOL_P(p) SERIAL_EOL() + + #define SERIAL_PROTOCOLCHAR_P(p,x) SERIAL_PROTOCOLCHAR(x) + #define SERIAL_PROTOCOLPGM_P(p,x) SERIAL_PROTOCOLPGM(x) + #define SERIAL_PROTOCOLLNPGM_P(p,x) SERIAL_PROTOCOLLNPGM(x) + #define SERIAL_PROTOCOLPAIR_P(p, pre, value) SERIAL_PROTOCOLPAIR(pre, value) + #define SERIAL_PROTOCOLLNPAIR_P(p, pre, value) SERIAL_PROTOCOLLNPAIR(pre, value) + + #define SERIAL_ECHO_START_P(p) SERIAL_ECHO_START() + #define SERIAL_ECHO_P(p,x) SERIAL_ECHO(x) + #define SERIAL_ECHOPGM_P(p,x) SERIAL_ECHOPGM(x) + #define SERIAL_ECHOLN_P(p,x) SERIAL_ECHOLN(x) + #define SERIAL_ECHOLNPGM_P(p,x) SERIAL_ECHOLNPGM(x) + #define SERIAL_ECHOPAIR_P(p,pre,value) SERIAL_ECHOPAIR(pre, value) + #define SERIAL_ECHOLNPAIR_P(p,pre, value) SERIAL_ECHOLNPAIR(pre, value) + #define SERIAL_ECHO_F_P(p,x,y) SERIAL_ECHO_F(x,y) + + #define SERIAL_ERROR_START_P(p) SERIAL_ERROR_START() + #define SERIAL_ERROR_P(p,x) SERIAL_ERROR(x) + #define SERIAL_ERRORPGM_P(p,x) SERIAL_ERRORPGM(x) + #define SERIAL_ERRORLN_P(p,x) SERIAL_ERRORLN(x) + #define SERIAL_ERRORLNPGM_P(p,x) SERIAL_ERRORLNPGM(x) + + // These macros compensate for float imprecision + #define SERIAL_PROTOCOLPAIR_F_P(p, pre, value) SERIAL_PROTOCOLPAIR_F(pre, value) + #define SERIAL_PROTOCOLLNPAIR_F_P(p, pre, value) SERIAL_PROTOCOLLNPAIR_F(pre, value) + #define SERIAL_ECHOPAIR_F_P(p,pre,value) SERIAL_ECHOPAIR_F(pre, value) + #define SERIAL_ECHOLNPAIR_F_P(p,pre, value) SERIAL_ECHOLNPAIR_F(pre, value) + + #define serial_echopair_PGM_P(p,s_P,v) serial_echopair_PGM(s_P, v) + + #define serial_spaces_P(p,c) serial_spaces(c) + #define SERIAL_ECHO_SP_P(p,C) SERIAL_ECHO_SP(C) + #define SERIAL_ERROR_SP_P(p,C) SERIAL_ERROR_SP(C) + #define SERIAL_PROTOCOL_SP_P(p,C) SERIAL_PROTOCOL_SP(C) + + #define serialprintPGM_P(p,s) serialprintPGM(s) #endif +#define SERIAL_EOL() SERIAL_CHAR('\n') + +#define SERIAL_PROTOCOLCHAR(x) SERIAL_CHAR(x) +#define SERIAL_PROTOCOLPGM(x) (serialprintPGM(PSTR(x))) +#define SERIAL_PROTOCOLLNPGM(x) (serialprintPGM(PSTR(x "\n"))) +#define SERIAL_PROTOCOLPAIR(pre, value) (serial_echopair_PGM(PSTR(pre), value)) +#define SERIAL_PROTOCOLLNPAIR(pre, value) do { SERIAL_PROTOCOLPAIR(pre, value); SERIAL_EOL(); } while(0) + +#define SERIAL_ECHO_START() (serialprintPGM(echomagic)) +#define SERIAL_ECHO(x) SERIAL_PROTOCOL(x) +#define SERIAL_ECHOPGM(x) SERIAL_PROTOCOLPGM(x) +#define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x) +#define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x) +#define SERIAL_ECHOPAIR(pre,value) SERIAL_PROTOCOLPAIR(pre, value) +#define SERIAL_ECHOLNPAIR(pre, value) SERIAL_PROTOCOLLNPAIR(pre, value) +#define SERIAL_ECHO_F(x,y) SERIAL_PROTOCOL_F(x, y) + +#define SERIAL_ERROR_START() (serialprintPGM(errormagic)) +#define SERIAL_ERROR(x) SERIAL_PROTOCOL(x) +#define SERIAL_ERRORPGM(x) SERIAL_PROTOCOLPGM(x) +#define SERIAL_ERRORLN(x) SERIAL_PROTOCOLLN(x) +#define SERIAL_ERRORLNPGM(x) SERIAL_PROTOCOLLNPGM(x) + +// These macros compensate for float imprecision +#define SERIAL_PROTOCOLPAIR_F(pre, value) SERIAL_PROTOCOLPAIR(pre, FIXFLOAT(value)) +#define SERIAL_PROTOCOLLNPAIR_F(pre, value) SERIAL_PROTOCOLLNPAIR(pre, FIXFLOAT(value)) +#define SERIAL_ECHOPAIR_F(pre,value) SERIAL_ECHOPAIR(pre, FIXFLOAT(value)) +#define SERIAL_ECHOLNPAIR_F(pre, value) SERIAL_ECHOLNPAIR(pre, FIXFLOAT(value)) + +void serial_echopair_PGM(const char* s_P, const char *v); +void serial_echopair_PGM(const char* s_P, char v); +void serial_echopair_PGM(const char* s_P, int v); +void serial_echopair_PGM(const char* s_P, long v); +void serial_echopair_PGM(const char* s_P, float v); +void serial_echopair_PGM(const char* s_P, double v); +void serial_echopair_PGM(const char* s_P, unsigned int v); +void serial_echopair_PGM(const char* s_P, unsigned long v); +FORCE_INLINE void serial_echopair_PGM(const char* s_P, uint8_t v) { serial_echopair_PGM(s_P, (int)v); } +FORCE_INLINE void serial_echopair_PGM(const char* s_P, bool v) { serial_echopair_PGM(s_P, (int)v); } +FORCE_INLINE void serial_echopair_PGM(const char* s_P, void *v) { serial_echopair_PGM(s_P, (unsigned long)v); } + +void serial_spaces(uint8_t count); +#define SERIAL_ECHO_SP(C) serial_spaces(C) +#define SERIAL_ERROR_SP(C) serial_spaces(C) +#define SERIAL_PROTOCOL_SP(C) serial_spaces(C) + // // Functions for serial printing from PROGMEM. (Saves loads of SRAM.) // -void serial_echopair_PGM(PGM_P const s_P, const char *v); -void serial_echopair_PGM(PGM_P const s_P, char v); -void serial_echopair_PGM(PGM_P const s_P, int v); -void serial_echopair_PGM(PGM_P const s_P, long v); -void serial_echopair_PGM(PGM_P const s_P, float v); -void serial_echopair_PGM(PGM_P const s_P, double v); -void serial_echopair_PGM(PGM_P const s_P, unsigned int v); -void serial_echopair_PGM(PGM_P const s_P, unsigned long v); -inline void serial_echopair_PGM(PGM_P const s_P, uint8_t v) { serial_echopair_PGM(s_P, (int)v); } -inline void serial_echopair_PGM(PGM_P const s_P, bool v) { serial_echopair_PGM(s_P, (int)v); } -inline void serial_echopair_PGM(PGM_P const s_P, void *v) { serial_echopair_PGM(s_P, (unsigned long)v); } +void serialprintPGM(const char* str); -void serialprintPGM(PGM_P str); -void serial_echo_start(); -void serial_error_start(); -void serial_ternary(const bool onoff, PGM_P const pre, PGM_P const on, PGM_P const off, PGM_P const post=nullptr); -void serialprint_onoff(const bool onoff); -void serialprintln_onoff(const bool onoff); -void serialprint_truefalse(const bool tf); -void serial_spaces(uint8_t count); +#if ENABLED(DEBUG_LEVELING_FEATURE) + void print_xyz(const char* prefix, const char* suffix, const float x, const float y, const float z); + void print_xyz(const char* prefix, const char* suffix, const float xyz[]); + #define DEBUG_POS(SUFFIX,VAR) do { print_xyz(PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n"), VAR); } while(0) +#endif -void print_bin(const uint16_t val); -void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr); - -inline void print_xyz(const xyz_pos_t &xyz, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr) { - print_xyz(xyz.x, xyz.y, xyz.z, prefix, suffix); -} - -#define SERIAL_POS(SUFFIX,VAR) do { print_xyz(VAR, PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n")); }while(0) -#define SERIAL_XYZ(PREFIX,V...) do { print_xyz(V, PSTR(PREFIX), nullptr); }while(0) +#endif // __SERIAL_H__ diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index a5b78caabb..db6587a08c 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,489 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include -#include +#ifndef __TYPES_H__ +#define __TYPES_H__ -#include "../inc/MarlinConfigPre.h" +#include +#include -class __FlashStringHelper; -typedef const __FlashStringHelper *progmem_str; +typedef uint32_t millis_t; -// -// Enumerated axis indices -// -// - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space -// - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians -// - X_HEAD, Y_HEAD, and Z_HEAD should be used for Steppers on Core kinematics -// -enum AxisEnum : uint8_t { - X_AXIS = 0, A_AXIS = 0, - Y_AXIS = 1, B_AXIS = 1, - Z_AXIS = 2, C_AXIS = 2, - E_AXIS = 3, - X_HEAD = 4, Y_HEAD = 5, Z_HEAD = 6, - E0_AXIS = 3, - E1_AXIS, E2_AXIS, E3_AXIS, E4_AXIS, E5_AXIS, E6_AXIS, E7_AXIS, - ALL_AXES = 0xFE, NO_AXIS = 0xFF -}; - -// -// Loop over XYZE axes -// -#define LOOP_XYZ(VAR) LOOP_S_LE_N(VAR, X_AXIS, Z_AXIS) -#define LOOP_XYZE(VAR) LOOP_S_LE_N(VAR, X_AXIS, E_AXIS) -#define LOOP_XYZE_N(VAR) LOOP_S_L_N(VAR, X_AXIS, XYZE_N) -#define LOOP_ABC(VAR) LOOP_S_LE_N(VAR, A_AXIS, C_AXIS) -#define LOOP_ABCE(VAR) LOOP_S_LE_N(VAR, A_AXIS, E_AXIS) -#define LOOP_ABCE_N(VAR) LOOP_S_L_N(VAR, A_AXIS, XYZE_N) - -// -// Conditional type assignment magic. For example... -// -// typename IF<(MYOPT==12), int, float>::type myvar; -// -template -struct IF { typedef R type; }; -template -struct IF { typedef L type; }; - -// -// feedRate_t is just a humble float -// -typedef float feedRate_t; - -// Conversion macros -#define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f) -#define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f) -#define MMS_SCALED(V) ((V) * 0.01f * feedrate_percentage) - -// -// Coordinates structures for XY, XYZ, XYZE... -// - -// Helpers -#define _RECIP(N) ((N) ? 1.0f / float(N) : 0.0f) -#define _ABS(N) ((N) < 0 ? -(N) : (N)) -#define _LS(N) (N = (T)(uint32_t(N) << v)) -#define _RS(N) (N = (T)(uint32_t(N) >> v)) -#define FI FORCE_INLINE - -// Forward declarations -template struct XYval; -template struct XYZval; -template struct XYZEval; - -typedef struct XYval xy_bool_t; -typedef struct XYZval xyz_bool_t; -typedef struct XYZEval xyze_bool_t; - -typedef struct XYval xy_char_t; -typedef struct XYZval xyz_char_t; -typedef struct XYZEval xyze_char_t; - -typedef struct XYval xy_uchar_t; -typedef struct XYZval xyz_uchar_t; -typedef struct XYZEval xyze_uchar_t; - -typedef struct XYval xy_int8_t; -typedef struct XYZval xyz_int8_t; -typedef struct XYZEval xyze_int8_t; - -typedef struct XYval xy_uint8_t; -typedef struct XYZval xyz_uint8_t; -typedef struct XYZEval xyze_uint8_t; - -typedef struct XYval xy_int_t; -typedef struct XYZval xyz_int_t; -typedef struct XYZEval xyze_int_t; - -typedef struct XYval xy_uint_t; -typedef struct XYZval xyz_uint_t; -typedef struct XYZEval xyze_uint_t; - -typedef struct XYval xy_long_t; -typedef struct XYZval xyz_long_t; -typedef struct XYZEval xyze_long_t; - -typedef struct XYval xy_ulong_t; -typedef struct XYZval xyz_ulong_t; -typedef struct XYZEval xyze_ulong_t; - -typedef struct XYZval xyz_vlong_t; -typedef struct XYZEval xyze_vlong_t; - -typedef struct XYval xy_float_t; -typedef struct XYZval xyz_float_t; -typedef struct XYZEval xyze_float_t; - -typedef struct XYval xy_feedrate_t; -typedef struct XYZval xyz_feedrate_t; -typedef struct XYZEval xyze_feedrate_t; - -typedef xy_uint8_t xy_byte_t; -typedef xyz_uint8_t xyz_byte_t; -typedef xyze_uint8_t xyze_byte_t; - -typedef xyz_long_t abc_long_t; -typedef xyze_long_t abce_long_t; -typedef xyz_ulong_t abc_ulong_t; -typedef xyze_ulong_t abce_ulong_t; - -typedef xy_float_t xy_pos_t; -typedef xyz_float_t xyz_pos_t; -typedef xyze_float_t xyze_pos_t; - -typedef xy_float_t ab_float_t; -typedef xyz_float_t abc_float_t; -typedef xyze_float_t abce_float_t; - -typedef ab_float_t ab_pos_t; -typedef abc_float_t abc_pos_t; -typedef abce_float_t abce_pos_t; - -// External conversion methods -void toLogical(xy_pos_t &raw); -void toLogical(xyz_pos_t &raw); -void toLogical(xyze_pos_t &raw); -void toNative(xy_pos_t &raw); -void toNative(xyz_pos_t &raw); -void toNative(xyze_pos_t &raw); - -// -// XY coordinates, counters, etc. -// -template -struct XYval { - union { - struct { T x, y; }; - struct { T a, b; }; - T pos[2]; - }; - FI void set(const T px) { x = px; } - FI void set(const T px, const T py) { x = px; y = py; } - FI void set(const T (&arr)[XY]) { x = arr[0]; y = arr[1]; } - FI void set(const T (&arr)[XYZ]) { x = arr[0]; y = arr[1]; } - FI void set(const T (&arr)[XYZE]) { x = arr[0]; y = arr[1]; } - #if XYZE_N > XYZE - FI void set(const T (&arr)[XYZE_N]) { x = arr[0]; y = arr[1]; } - #endif - FI void reset() { x = y = 0; } - FI T magnitude() const { return (T)sqrtf(x*x + y*y); } - FI operator T* () { return pos; } - FI operator bool() { return x || y; } - FI XYval copy() const { return *this; } - FI XYval ABS() const { return { T(_ABS(x)), T(_ABS(y)) }; } - FI XYval asInt() { return { int16_t(x), int16_t(y) }; } - FI XYval asInt() const { return { int16_t(x), int16_t(y) }; } - FI XYval asLong() { return { int32_t(x), int32_t(y) }; } - FI XYval asLong() const { return { int32_t(x), int32_t(y) }; } - FI XYval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)) }; } - FI XYval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)) }; } - FI XYval asFloat() { return { float(x), float(y) }; } - FI XYval asFloat() const { return { float(x), float(y) }; } - FI XYval reciprocal() const { return { _RECIP(x), _RECIP(y) }; } - FI XYval asLogical() const { XYval o = asFloat(); toLogical(o); return o; } - FI XYval asNative() const { XYval o = asFloat(); toNative(o); return o; } - FI operator XYZval() { return { x, y }; } - FI operator XYZval() const { return { x, y }; } - FI operator XYZEval() { return { x, y }; } - FI operator XYZEval() const { return { x, y }; } - FI T& operator[](const int i) { return pos[i]; } - FI const T& operator[](const int i) const { return pos[i]; } - FI XYval& operator= (const T v) { set(v, v ); return *this; } - FI XYval& operator= (const XYZval &rs) { set(rs.x, rs.y); return *this; } - FI XYval& operator= (const XYZEval &rs) { set(rs.x, rs.y); return *this; } - FI XYval operator+ (const XYval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator+ (const XYval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator- (const XYval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator- (const XYval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator* (const XYval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator* (const XYval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator/ (const XYval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator/ (const XYval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator+ (const XYZval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator+ (const XYZval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator- (const XYZval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator- (const XYZval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator* (const XYZval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator* (const XYZval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator/ (const XYZval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator/ (const XYZval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator+ (const XYZEval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator+ (const XYZEval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator- (const XYZEval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator- (const XYZEval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator* (const XYZEval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator* (const XYZEval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator/ (const XYZEval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator/ (const XYZEval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator* (const float &v) const { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } - FI XYval operator* (const float &v) { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } - FI XYval operator* (const int &v) const { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } - FI XYval operator* (const int &v) { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } - FI XYval operator/ (const float &v) const { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } - FI XYval operator/ (const float &v) { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } - FI XYval operator/ (const int &v) const { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } - FI XYval operator/ (const int &v) { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } - FI XYval operator>>(const int &v) const { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; } - FI XYval operator>>(const int &v) { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; } - FI XYval operator<<(const int &v) const { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; } - FI XYval operator<<(const int &v) { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; } - FI XYval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } - FI XYval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } - FI XYval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } - FI XYval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; return *this; } - FI XYval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; return *this; } - FI XYval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; return *this; } - FI XYval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; return *this; } - FI XYval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; return *this; } - FI XYval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; return *this; } - FI XYval& operator*=(const float &v) { x *= v; y *= v; return *this; } - FI XYval& operator*=(const int &v) { x *= v; y *= v; return *this; } - FI XYval& operator>>=(const int &v) { _RS(x); _RS(y); return *this; } - FI XYval& operator<<=(const int &v) { _LS(x); _LS(y); return *this; } - FI bool operator==(const XYval &rs) { return x == rs.x && y == rs.y; } - FI bool operator==(const XYZval &rs) { return x == rs.x && y == rs.y; } - FI bool operator==(const XYZEval &rs) { return x == rs.x && y == rs.y; } - FI bool operator==(const XYval &rs) const { return x == rs.x && y == rs.y; } - FI bool operator==(const XYZval &rs) const { return x == rs.x && y == rs.y; } - FI bool operator==(const XYZEval &rs) const { return x == rs.x && y == rs.y; } - FI bool operator!=(const XYval &rs) { return !operator==(rs); } - FI bool operator!=(const XYZval &rs) { return !operator==(rs); } - FI bool operator!=(const XYZEval &rs) { return !operator==(rs); } - FI bool operator!=(const XYval &rs) const { return !operator==(rs); } - FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } - FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } - FI XYval operator-() { XYval o = *this; o.x = -x; o.y = -y; return o; } - FI const XYval operator-() const { XYval o = *this; o.x = -x; o.y = -y; return o; } -}; - -// -// XYZ coordinates, counters, etc. -// -template -struct XYZval { - union { - struct { T x, y, z; }; - struct { T a, b, c; }; - T pos[3]; - }; - FI void set(const T px) { x = px; } - FI void set(const T px, const T py) { x = px; y = py; } - FI void set(const T px, const T py, const T pz) { x = px; y = py; z = pz; } - FI void set(const XYval pxy, const T pz) { x = pxy.x; y = pxy.y; z = pz; } - FI void set(const T (&arr)[XY]) { x = arr[0]; y = arr[1]; } - FI void set(const T (&arr)[XYZ]) { x = arr[0]; y = arr[1]; z = arr[2]; } - FI void set(const T (&arr)[XYZE]) { x = arr[0]; y = arr[1]; z = arr[2]; } - #if XYZE_N > XYZE - FI void set(const T (&arr)[XYZE_N]) { x = arr[0]; y = arr[1]; z = arr[2]; } - #endif - FI void reset() { x = y = z = 0; } - FI T magnitude() const { return (T)sqrtf(x*x + y*y + z*z); } - FI operator T* () { return pos; } - FI operator bool() { return z || x || y; } - FI XYZval copy() const { XYZval o = *this; return o; } - FI XYZval ABS() const { return { T(_ABS(x)), T(_ABS(y)), T(_ABS(z)) }; } - FI XYZval asInt() { return { int16_t(x), int16_t(y), int16_t(z) }; } - FI XYZval asInt() const { return { int16_t(x), int16_t(y), int16_t(z) }; } - FI XYZval asLong() { return { int32_t(x), int32_t(y), int32_t(z) }; } - FI XYZval asLong() const { return { int32_t(x), int32_t(y), int32_t(z) }; } - FI XYZval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)) }; } - FI XYZval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)) }; } - FI XYZval asFloat() { return { float(x), float(y), float(z) }; } - FI XYZval asFloat() const { return { float(x), float(y), float(z) }; } - FI XYZval reciprocal() const { return { _RECIP(x), _RECIP(y), _RECIP(z) }; } - FI XYZval asLogical() const { XYZval o = asFloat(); toLogical(o); return o; } - FI XYZval asNative() const { XYZval o = asFloat(); toNative(o); return o; } - FI operator XYval&() { return *(XYval*)this; } - FI operator const XYval&() const { return *(const XYval*)this; } - FI operator XYZEval() const { return { x, y, z }; } - FI T& operator[](const int i) { return pos[i]; } - FI const T& operator[](const int i) const { return pos[i]; } - FI XYZval& operator= (const T v) { set(v, v, v ); return *this; } - FI XYZval& operator= (const XYval &rs) { set(rs.x, rs.y ); return *this; } - FI XYZval& operator= (const XYZEval &rs) { set(rs.x, rs.y, rs.z); return *this; } - FI XYZval operator+ (const XYval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYZval operator+ (const XYval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYZval operator- (const XYval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYZval operator- (const XYval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYZval operator* (const XYval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYZval operator* (const XYval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYZval operator/ (const XYval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYZval operator/ (const XYval &rs) { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYZval operator+ (const XYZval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } - FI XYZval operator+ (const XYZval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } - FI XYZval operator- (const XYZval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } - FI XYZval operator- (const XYZval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } - FI XYZval operator* (const XYZval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } - FI XYZval operator* (const XYZval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } - FI XYZval operator/ (const XYZval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } - FI XYZval operator/ (const XYZval &rs) { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } - FI XYZval operator+ (const XYZEval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } - FI XYZval operator+ (const XYZEval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } - FI XYZval operator- (const XYZEval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } - FI XYZval operator- (const XYZEval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } - FI XYZval operator* (const XYZEval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } - FI XYZval operator* (const XYZEval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } - FI XYZval operator/ (const XYZEval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } - FI XYZval operator/ (const XYZEval &rs) { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } - FI XYZval operator* (const float &v) const { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; return ls; } - FI XYZval operator* (const float &v) { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; return ls; } - FI XYZval operator* (const int &v) const { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; return ls; } - FI XYZval operator* (const int &v) { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; return ls; } - FI XYZval operator/ (const float &v) const { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; return ls; } - FI XYZval operator/ (const float &v) { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; return ls; } - FI XYZval operator/ (const int &v) const { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; return ls; } - FI XYZval operator/ (const int &v) { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; return ls; } - FI XYZval operator>>(const int &v) const { XYZval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); return ls; } - FI XYZval operator>>(const int &v) { XYZval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); return ls; } - FI XYZval operator<<(const int &v) const { XYZval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); return ls; } - FI XYZval operator<<(const int &v) { XYZval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); return ls; } - FI XYZval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } - FI XYZval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } - FI XYZval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } - FI XYZval& operator/=(const XYval &rs) { x /= rs.x; y /= rs.y; return *this; } - FI XYZval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; z += rs.z; return *this; } - FI XYZval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; return *this; } - FI XYZval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; return *this; } - FI XYZval& operator/=(const XYZval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; return *this; } - FI XYZval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; z += rs.z; return *this; } - FI XYZval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; return *this; } - FI XYZval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; return *this; } - FI XYZval& operator/=(const XYZEval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; return *this; } - FI XYZval& operator*=(const float &v) { x *= v; y *= v; z *= v; return *this; } - FI XYZval& operator*=(const int &v) { x *= v; y *= v; z *= v; return *this; } - FI XYZval& operator>>=(const int &v) { _RS(x); _RS(y); _RS(z); return *this; } - FI XYZval& operator<<=(const int &v) { _LS(x); _LS(y); _LS(z); return *this; } - FI bool operator==(const XYZEval &rs) { return x == rs.x && y == rs.y && z == rs.z; } - FI bool operator!=(const XYZEval &rs) { return !operator==(rs); } - FI bool operator==(const XYZEval &rs) const { return x == rs.x && y == rs.y && z == rs.z; } - FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } - FI XYZval operator-() { XYZval o = *this; o.x = -x; o.y = -y; o.z = -z; return o; } - FI const XYZval operator-() const { XYZval o = *this; o.x = -x; o.y = -y; o.z = -z; return o; } -}; - -// -// XYZE coordinates, counters, etc. -// -template -struct XYZEval { - union { - struct{ T x, y, z, e; }; - struct{ T a, b, c; }; - T pos[4]; - }; - FI void reset() { x = y = z = e = 0; } - FI T magnitude() const { return (T)sqrtf(x*x + y*y + z*z + e*e); } - FI operator T* () { return pos; } - FI operator bool() { return e || z || x || y; } - FI void set(const T px) { x = px; } - FI void set(const T px, const T py) { x = px; y = py; } - FI void set(const T px, const T py, const T pz) { x = px; y = py; z = pz; } - FI void set(const T px, const T py, const T pz, const T pe) { x = px; y = py; z = pz; e = pe; } - FI void set(const XYval pxy) { x = pxy.x; y = pxy.y; } - FI void set(const XYval pxy, const T pz) { x = pxy.x; y = pxy.y; z = pz; } - FI void set(const XYZval pxyz) { x = pxyz.x; y = pxyz.y; z = pxyz.z; } - FI void set(const XYval pxy, const T pz, const T pe) { x = pxy.x; y = pxy.y; z = pz; e = pe; } - FI void set(const XYval pxy, const XYval pze) { x = pxy.x; y = pxy.y; z = pze.z; e = pze.e; } - FI void set(const XYZval pxyz, const T pe) { x = pxyz.x; y = pxyz.y; z = pxyz.z; e = pe; } - FI void set(const T (&arr)[XY]) { x = arr[0]; y = arr[1]; } - FI void set(const T (&arr)[XYZ]) { x = arr[0]; y = arr[1]; z = arr[2]; } - FI void set(const T (&arr)[XYZE]) { x = arr[0]; y = arr[1]; z = arr[2]; e = arr[3]; } - #if XYZE_N > XYZE - FI void set(const T (&arr)[XYZE_N]) { x = arr[0]; y = arr[1]; z = arr[2]; e = arr[3]; } - #endif - FI XYZEval copy() const { return *this; } - FI XYZEval ABS() const { return { T(_ABS(x)), T(_ABS(y)), T(_ABS(z)), T(_ABS(e)) }; } - FI XYZEval asInt() { return { int16_t(x), int16_t(y), int16_t(z), int16_t(e) }; } - FI XYZEval asInt() const { return { int16_t(x), int16_t(y), int16_t(z), int16_t(e) }; } - FI XYZEval asLong() { return { int32_t(x), int32_t(y), int32_t(z), int32_t(e) }; } - FI XYZEval asLong() const { return { int32_t(x), int32_t(y), int32_t(z), int32_t(e) }; } - FI XYZEval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(e)) }; } - FI XYZEval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(e)) }; } - FI XYZEval asFloat() { return { float(x), float(y), float(z), float(e) }; } - FI XYZEval asFloat() const { return { float(x), float(y), float(z), float(e) }; } - FI XYZEval reciprocal() const { return { _RECIP(x), _RECIP(y), _RECIP(z), _RECIP(e) }; } - FI XYZEval asLogical() const { XYZEval o = asFloat(); toLogical(o); return o; } - FI XYZEval asNative() const { XYZEval o = asFloat(); toNative(o); return o; } - FI operator XYval&() { return *(XYval*)this; } - FI operator const XYval&() const { return *(const XYval*)this; } - FI operator XYZval&() { return *(XYZval*)this; } - FI operator const XYZval&() const { return *(const XYZval*)this; } - FI T& operator[](const int i) { return pos[i]; } - FI const T& operator[](const int i) const { return pos[i]; } - FI XYZEval& operator= (const T v) { set(v, v, v, v); return *this; } - FI XYZEval& operator= (const XYval &rs) { set(rs.x, rs.y); return *this; } - FI XYZEval& operator= (const XYZval &rs) { set(rs.x, rs.y, rs.z); return *this; } - FI XYZEval operator+ (const XYval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYZEval operator+ (const XYval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYZEval operator- (const XYval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYZEval operator- (const XYval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYZEval operator* (const XYval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYZEval operator* (const XYval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYZEval operator/ (const XYval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYZEval operator/ (const XYval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYZEval operator+ (const XYZval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } - FI XYZEval operator+ (const XYZval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } - FI XYZEval operator- (const XYZval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } - FI XYZEval operator- (const XYZval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } - FI XYZEval operator* (const XYZval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } - FI XYZEval operator* (const XYZval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } - FI XYZEval operator/ (const XYZval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } - FI XYZEval operator/ (const XYZval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } - FI XYZEval operator+ (const XYZEval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; ls.e += rs.e; return ls; } - FI XYZEval operator+ (const XYZEval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; ls.e += rs.e; return ls; } - FI XYZEval operator- (const XYZEval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; ls.e -= rs.e; return ls; } - FI XYZEval operator- (const XYZEval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; ls.e -= rs.e; return ls; } - FI XYZEval operator* (const XYZEval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; ls.e *= rs.e; return ls; } - FI XYZEval operator* (const XYZEval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; ls.e *= rs.e; return ls; } - FI XYZEval operator/ (const XYZEval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; ls.e /= rs.e; return ls; } - FI XYZEval operator/ (const XYZEval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; ls.e /= rs.e; return ls; } - FI XYZEval operator* (const float &v) const { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } - FI XYZEval operator* (const float &v) { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } - FI XYZEval operator* (const int &v) const { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } - FI XYZEval operator* (const int &v) { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } - FI XYZEval operator/ (const float &v) const { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } - FI XYZEval operator/ (const float &v) { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } - FI XYZEval operator/ (const int &v) const { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } - FI XYZEval operator/ (const int &v) { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } - FI XYZEval operator>>(const int &v) const { XYZEval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); _RS(ls.e); return ls; } - FI XYZEval operator>>(const int &v) { XYZEval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); _RS(ls.e); return ls; } - FI XYZEval operator<<(const int &v) const { XYZEval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); _LS(ls.e); return ls; } - FI XYZEval operator<<(const int &v) { XYZEval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); _LS(ls.e); return ls; } - FI XYZEval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } - FI XYZEval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } - FI XYZEval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } - FI XYZEval& operator/=(const XYval &rs) { x /= rs.x; y /= rs.y; return *this; } - FI XYZEval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; z += rs.z; return *this; } - FI XYZEval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; return *this; } - FI XYZEval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; return *this; } - FI XYZEval& operator/=(const XYZval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; return *this; } - FI XYZEval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; z += rs.z; e += rs.e; return *this; } - FI XYZEval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; e -= rs.e; return *this; } - FI XYZEval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; e *= rs.e; return *this; } - FI XYZEval& operator/=(const XYZEval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; e /= rs.e; return *this; } - FI XYZEval& operator*=(const T &v) { x *= v; y *= v; z *= v; e *= v; return *this; } - FI XYZEval& operator>>=(const int &v) { _RS(x); _RS(y); _RS(z); _RS(e); return *this; } - FI XYZEval& operator<<=(const int &v) { _LS(x); _LS(y); _LS(z); _LS(e); return *this; } - FI bool operator==(const XYZval &rs) { return x == rs.x && y == rs.y && z == rs.z; } - FI bool operator!=(const XYZval &rs) { return !operator==(rs); } - FI bool operator==(const XYZval &rs) const { return x == rs.x && y == rs.y && z == rs.z; } - FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } - FI XYZEval operator-() { return { -x, -y, -z, -e }; } - FI const XYZEval operator-() const { return { -x, -y, -z, -e }; } -}; - -#undef _RECIP -#undef _ABS -#undef _LS -#undef _RS -#undef FI - -const xyze_char_t axis_codes { 'X', 'Y', 'Z', 'E' }; -#define XYZ_CHAR(A) ((char)('X' + A)) +#endif diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index f999568167..ba374f7593 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "utility.h" -#include "../MarlinCore.h" +#include "../Marlin.h" #include "../module/temperature.h" void safe_delay(millis_t ms) { @@ -35,86 +35,311 @@ void safe_delay(millis_t ms) { thermalManager.manage_heater(); // This keeps us safe if too many small safe_delay() calls are made } -// A delay to provide brittle hosts time to receive bytes -#if ENABLED(SERIAL_OVERRUN_PROTECTION) +#if ENABLED(EEPROM_SETTINGS) - #include "../gcode/gcode.h" // for set_autoreport_paused - - void serial_delay(const millis_t ms) { - const bool was = gcode.set_autoreport_paused(true); - safe_delay(ms); - gcode.set_autoreport_paused(was); + void crc16(uint16_t *crc, const void * const data, uint16_t cnt) { + uint8_t *ptr = (uint8_t *)data; + while (cnt--) { + *crc = (uint16_t)(*crc ^ (uint16_t)(((uint16_t)*ptr++) << 8)); + for (uint8_t i = 0; i < 8; i++) + *crc = (uint16_t)((*crc & 0x8000) ? ((uint16_t)(*crc << 1) ^ 0x1021) : (*crc << 1)); + } } -#endif + +#endif // EEPROM_SETTINGS + +#if ENABLED(ULTRA_LCD) || ENABLED(DEBUG_LEVELING_FEATURE) + + char conv[8] = { 0 }; + + #define DIGIT(n) ('0' + (n)) + #define DIGIMOD(n, f) DIGIT((n)/(f) % 10) + #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') + #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) + + // Convert unsigned int to string 123 format + char* i8tostr3(const uint8_t i) { + conv[4] = RJDIGIT(i, 100); + conv[5] = RJDIGIT(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[4]; + } + + // Convert signed int to rj string with 123 or -12 format + char* itostr3(int i) { + conv[4] = MINUSOR(i, RJDIGIT(i, 100)); + conv[5] = RJDIGIT(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[4]; + } + + // Convert unsigned int to lj string with 123 format + char* itostr3left(const int i) { + char *str = &conv[6]; + *str = DIGIMOD(i, 1); + if (i >= 10) { + *(--str) = DIGIMOD(i, 10); + if (i >= 100) + *(--str) = DIGIMOD(i, 100); + } + return str; + } + + // Convert signed int to rj string with 1234, _123, -123, _-12, or __-1 format + char* itostr4sign(const int i) { + const bool neg = i < 0; + const int ii = neg ? -i : i; + if (i >= 1000) { + conv[3] = DIGIMOD(ii, 1000); + conv[4] = DIGIMOD(ii, 100); + conv[5] = DIGIMOD(ii, 10); + } + else if (ii >= 100) { + conv[3] = neg ? '-' : ' '; + conv[4] = DIGIMOD(ii, 100); + conv[5] = DIGIMOD(ii, 10); + } + else { + conv[3] = ' '; + conv[4] = ' '; + if (ii >= 10) { + conv[4] = neg ? '-' : ' '; + conv[5] = DIGIMOD(ii, 10); + } + else { + conv[5] = neg ? '-' : ' '; + } + } + conv[6] = DIGIMOD(ii, 1); + return &conv[3]; + } + + // Convert unsigned float to string with 1.23 format + char* ftostr12ns(const float &f) { + const long i = ((f < 0 ? -f : f) * 1000 + 5) / 10; + conv[3] = DIGIMOD(i, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[3]; + } + + // Convert signed float to fixed-length string with 023.45 / -23.45 format + char* ftostr52(const float &f) { + long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; + conv[1] = MINUSOR(i, DIGIMOD(i, 10000)); + conv[2] = DIGIMOD(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[1]; + } + + #if ENABLED(LCD_DECIMAL_SMALL_XY) + + // Convert float to rj string with 1234, _123, -123, _-12, 12.3, _1.2, or -1.2 format + char* ftostr4sign(const float &f) { + const int i = (f * 100 + (f < 0 ? -5: 5)) / 10; + if (!WITHIN(i, -99, 999)) return itostr4sign((int)f); + const bool neg = i < 0; + const int ii = neg ? -i : i; + conv[3] = neg ? '-' : (ii >= 100 ? DIGIMOD(ii, 100) : ' '); + conv[4] = DIGIMOD(ii, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(ii, 1); + return &conv[3]; + } + + #endif // LCD_DECIMAL_SMALL_XY + + // Convert float to fixed-length string with +123.4 / -123.4 format + char* ftostr41sign(const float &f) { + int i = (f * 100 + (f < 0 ? -5: 5)) / 10; + conv[1] = MINUSOR(i, '+'); + conv[2] = DIGIMOD(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return &conv[1]; + } + + // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format + char* ftostr43sign(const float &f, char plus/*=' '*/) { + long i = (f * 10000 + (f < 0 ? -5: 5)) / 10; + conv[1] = i ? MINUSOR(i, plus) : ' '; + conv[2] = DIGIMOD(i, 1000); + conv[3] = '.'; + conv[4] = DIGIMOD(i, 100); + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[1]; + } + + // Convert unsigned float to rj string with 12345 format + char* ftostr5rj(const float &f) { + const long i = ((f < 0 ? -f : f) * 10 + 5) / 10; + conv[2] = RJDIGIT(i, 10000); + conv[3] = RJDIGIT(i, 1000); + conv[4] = RJDIGIT(i, 100); + conv[5] = RJDIGIT(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[2]; + } + + // Convert signed float to string with +1234.5 format + char* ftostr51sign(const float &f) { + long i = (f * 100 + (f < 0 ? -5: 5)) / 10; + conv[0] = MINUSOR(i, '+'); + conv[1] = DIGIMOD(i, 10000); + conv[2] = DIGIMOD(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return conv; + } + + // Convert signed float to string with +123.45 format + char* ftostr52sign(const float &f) { + long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; + conv[0] = MINUSOR(i, '+'); + conv[1] = DIGIMOD(i, 10000); + conv[2] = DIGIMOD(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return conv; + } + + // Convert unsigned float to string with 1234.56 format omitting trailing zeros + char* ftostr62rj(const float &f) { + const long i = ((f < 0 ? -f : f) * 1000 + 5) / 10; + conv[0] = RJDIGIT(i, 100000); + conv[1] = RJDIGIT(i, 10000); + conv[2] = RJDIGIT(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return conv; + } + + // Convert signed float to space-padded string with -_23.4_ format + char* ftostr52sp(const float &f) { + long i = (f * 1000 + (f < 0 ? -5: 5)) / 10; + uint8_t dig; + conv[1] = MINUSOR(i, RJDIGIT(i, 10000)); + conv[2] = RJDIGIT(i, 1000); + conv[3] = DIGIMOD(i, 100); + + if ((dig = i % 10)) { // second digit after decimal point? + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIT(dig); + } + else { + if ((dig = (i / 10) % 10)) { // first digit after decimal point? + conv[4] = '.'; + conv[5] = DIGIT(dig); + } + else // nothing after decimal point + conv[4] = conv[5] = ' '; + conv[6] = ' '; + } + return &conv[1]; + } + +#endif // ULTRA_LCD #if ENABLED(DEBUG_LEVELING_FEATURE) #include "../module/probe.h" #include "../module/motion.h" #include "../module/stepper.h" - #include "../libs/numtostr.h" #include "../feature/bedlevel/bedlevel.h" void log_machine_info() { SERIAL_ECHOLNPGM("Machine Type: " - TERN_(DELTA, "Delta") - TERN_(IS_SCARA, "SCARA") - TERN_(IS_CORE, "Core") - TERN_(MARKFORGED_XY, "MarkForged") - TERN_(IS_CARTESIAN, "Cartesian") + #if ENABLED(DELTA) + "Delta" + #elif IS_SCARA + "SCARA" + #elif IS_CORE + "Core" + #else + "Cartesian" + #endif ); SERIAL_ECHOLNPGM("Probe: " - TERN_(PROBE_MANUALLY, "PROBE_MANUALLY") - TERN_(NOZZLE_AS_PROBE, "NOZZLE_AS_PROBE") - TERN_(FIX_MOUNTED_PROBE, "FIX_MOUNTED_PROBE") - TERN_(HAS_Z_SERVO_PROBE, TERN(BLTOUCH, "BLTOUCH", "SERVO PROBE")) - TERN_(TOUCH_MI_PROBE, "TOUCH_MI_PROBE") - TERN_(Z_PROBE_SLED, "Z_PROBE_SLED") - TERN_(Z_PROBE_ALLEN_KEY, "Z_PROBE_ALLEN_KEY") - TERN_(SOLENOID_PROBE, "SOLENOID_PROBE") - TERN(PROBE_SELECTED, "", "NONE") + #if ENABLED(PROBE_MANUALLY) + "PROBE_MANUALLY" + #elif ENABLED(FIX_MOUNTED_PROBE) + "FIX_MOUNTED_PROBE" + #elif ENABLED(BLTOUCH) + "BLTOUCH" + #elif HAS_Z_SERVO_PROBE + "SERVO PROBE" + #elif ENABLED(Z_PROBE_SLED) + "Z_PROBE_SLED" + #elif ENABLED(Z_PROBE_ALLEN_KEY) + "Z_PROBE_ALLEN_KEY" + #else + "NONE" + #endif ); #if HAS_BED_PROBE - - #if !HAS_PROBE_XY_OFFSET - SERIAL_ECHOPAIR("Probe Offset X0 Y0 Z", probe.offset.z, " ("); + SERIAL_ECHOPGM("Probe Offset X:" STRINGIFY(X_PROBE_OFFSET_FROM_EXTRUDER) " Y:" STRINGIFY(Y_PROBE_OFFSET_FROM_EXTRUDER)); + SERIAL_ECHOPAIR(" Z:", zprobe_zoffset); + #if X_PROBE_OFFSET_FROM_EXTRUDER > 0 + SERIAL_ECHOPGM(" (Right"); + #elif X_PROBE_OFFSET_FROM_EXTRUDER < 0 + SERIAL_ECHOPGM(" (Left"); + #elif Y_PROBE_OFFSET_FROM_EXTRUDER != 0 + SERIAL_ECHOPGM(" (Middle"); #else - SERIAL_ECHOPAIR_P(PSTR("Probe Offset X"), probe.offset_xy.x, SP_Y_STR, probe.offset_xy.y, SP_Z_STR, probe.offset.z); - if (probe.offset_xy.x > 0) - SERIAL_ECHOPGM(" (Right"); - else if (probe.offset_xy.x < 0) - SERIAL_ECHOPGM(" (Left"); - else if (probe.offset_xy.y != 0) - SERIAL_ECHOPGM(" (Middle"); - else - SERIAL_ECHOPGM(" (Aligned With"); - - if (probe.offset_xy.y > 0) - serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Distal") : PSTR("-Back")); - else if (probe.offset_xy.y < 0) - serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Proximal") : PSTR("-Front")); - else if (probe.offset_xy.x != 0) - SERIAL_ECHOPGM("-Center"); - - SERIAL_ECHOPGM(" & "); - + SERIAL_ECHOPGM(" (Aligned With"); #endif - - serialprintPGM(probe.offset.z < 0 ? PSTR("Below") : probe.offset.z > 0 ? PSTR("Above") : PSTR("Same Z as")); + #if Y_PROBE_OFFSET_FROM_EXTRUDER > 0 + #if IS_SCARA + SERIAL_ECHOPGM("-Distal"); + #else + SERIAL_ECHOPGM("-Back"); + #endif + #elif Y_PROBE_OFFSET_FROM_EXTRUDER < 0 + #if IS_SCARA + SERIAL_ECHOPGM("-Proximal"); + #else + SERIAL_ECHOPGM("-Front"); + #endif + #elif X_PROBE_OFFSET_FROM_EXTRUDER != 0 + SERIAL_ECHOPGM("-Center"); + #endif + if (zprobe_zoffset < 0) + SERIAL_ECHOPGM(" & Below"); + else if (zprobe_zoffset > 0) + SERIAL_ECHOPGM(" & Above"); + else + SERIAL_ECHOPGM(" & Same Z as"); SERIAL_ECHOLNPGM(" Nozzle)"); - #endif - #if HAS_ABL_OR_UBL - SERIAL_ECHOPGM("Auto Bed Leveling: " - TERN_(AUTO_BED_LEVELING_LINEAR, "LINEAR") - TERN_(AUTO_BED_LEVELING_BILINEAR, "BILINEAR") - TERN_(AUTO_BED_LEVELING_3POINT, "3POINT") - TERN_(AUTO_BED_LEVELING_UBL, "UBL") + #if HAS_ABL + SERIAL_ECHOLNPGM("Auto Bed Leveling: " + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + "LINEAR" + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + "BILINEAR" + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + "3POINT" + #elif ENABLED(AUTO_BED_LEVELING_UBL) + "UBL" + #endif ); - if (planner.leveling_active) { SERIAL_ECHOLNPGM(" (enabled)"); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) @@ -122,17 +347,24 @@ void safe_delay(millis_t ms) { SERIAL_ECHOLNPAIR("Z Fade: ", planner.z_fade_height); #endif #if ABL_PLANAR + const float diff[XYZ] = { + planner.get_axis_position_mm(X_AXIS) - current_position[X_AXIS], + planner.get_axis_position_mm(Y_AXIS) - current_position[Y_AXIS], + planner.get_axis_position_mm(Z_AXIS) - current_position[Z_AXIS] + }; SERIAL_ECHOPGM("ABL Adjustment X"); - LOOP_XYZ(a) { - const float v = planner.get_axis_position_mm(AxisEnum(a)) - current_position[a]; - SERIAL_CHAR(' ', XYZ_CHAR(a)); - if (v > 0) SERIAL_CHAR('+'); - SERIAL_DECIMAL(v); - } + if (diff[X_AXIS] > 0) SERIAL_CHAR('+'); + SERIAL_ECHO(diff[X_AXIS]); + SERIAL_ECHOPGM(" Y"); + if (diff[Y_AXIS] > 0) SERIAL_CHAR('+'); + SERIAL_ECHO(diff[Y_AXIS]); + SERIAL_ECHOPGM(" Z"); + if (diff[Z_AXIS] > 0) SERIAL_CHAR('+'); + SERIAL_ECHO(diff[Z_AXIS]); #else #if ENABLED(AUTO_BED_LEVELING_UBL) SERIAL_ECHOPGM("UBL Adjustment Z"); - const float rz = ubl.get_z_correction(current_position); + const float rz = ubl.get_z_correction(current_position[X_AXIS], current_position[Y_AXIS]); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) SERIAL_ECHOPGM("ABL Adjustment Z"); const float rz = bilinear_z_offset(current_position); @@ -140,7 +372,7 @@ void safe_delay(millis_t ms) { SERIAL_ECHO(ftostr43sign(rz, '+')); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) if (planner.z_fade_height) { - SERIAL_ECHOPAIR(" (", ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position.z), '+')); + SERIAL_ECHOPAIR(" (", ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position[Z_AXIS]), '+')); SERIAL_CHAR(')'); } #endif @@ -156,11 +388,15 @@ void safe_delay(millis_t ms) { SERIAL_ECHOPGM("Mesh Bed Leveling"); if (planner.leveling_active) { SERIAL_ECHOLNPGM(" (enabled)"); - SERIAL_ECHOPAIR("MBL Adjustment Z", ftostr43sign(mbl.get_z(current_position), '+')); + SERIAL_ECHOPAIR("MBL Adjustment Z", ftostr43sign(mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS] + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + , 1.0 + #endif + ), '+')); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) if (planner.z_fade_height) { SERIAL_ECHOPAIR(" (", ftostr43sign( - mbl.get_z(current_position, planner.fade_scaling_factor_for_z(current_position.z)), '+' + mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS], planner.fade_scaling_factor_for_z(current_position[Z_AXIS])), '+' )); SERIAL_CHAR(')'); } diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index 645a4be807..f4f2e7cf80 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,64 +16,91 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __UTILITY_H__ +#define __UTILITY_H__ #include "../inc/MarlinConfigPre.h" -#include "../core/types.h" -#include "../core/millis_t.h" -// Delay that ensures heaters and watchdog are kept alive +constexpr char axis_codes[XYZE] = { 'X', 'Y', 'Z', 'E' }; + void safe_delay(millis_t ms); -#if ENABLED(SERIAL_OVERRUN_PROTECTION) - void serial_delay(const millis_t ms); -#else - inline void serial_delay(const millis_t) {} +#if ENABLED(EEPROM_SETTINGS) + void crc16(uint16_t *crc, const void * const data, uint16_t cnt); #endif -#if GRID_MAX_POINTS_X && GRID_MAX_POINTS_Y - - // 16x16 bit arrays - template - struct FlagBits { - typename IF<(W>8), uint16_t, uint8_t>::type bits[H]; - void fill() { memset(bits, 0xFF, sizeof(bits)); } - void reset() { memset(bits, 0x00, sizeof(bits)); } - void unmark(const uint8_t x, const uint8_t y) { CBI(bits[y], x); } - void mark(const uint8_t x, const uint8_t y) { SBI(bits[y], x); } - bool marked(const uint8_t x, const uint8_t y) { return TEST(bits[y], x); } - inline void unmark(const xy_int8_t &xy) { unmark(xy.x, xy.y); } - inline void mark(const xy_int8_t &xy) { mark(xy.x, xy.y); } - inline bool marked(const xy_int8_t &xy) { return marked(xy.x, xy.y); } - }; - - typedef FlagBits MeshFlags; - +#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION) + /** + * These support functions allow the use of large bit arrays of flags that take very + * little RAM. Currently they are limited to being 16x16 in size. Changing the declaration + * to unsigned long will allow us to go to 32x32 if higher resolution Mesh's are needed + * in the future. + */ + FORCE_INLINE void bitmap_clear(uint16_t bits[16], const uint8_t x, const uint8_t y) { CBI(bits[y], x); } + FORCE_INLINE void bitmap_set(uint16_t bits[16], const uint8_t x, const uint8_t y) { SBI(bits[y], x); } + FORCE_INLINE bool is_bitmap_set(uint16_t bits[16], const uint8_t x, const uint8_t y) { return TEST(bits[y], x); } #endif +#if ENABLED(ULTRA_LCD) || ENABLED(DEBUG_LEVELING_FEATURE) + + // Convert uint8_t to string with 123 format + char* i8tostr3(const uint8_t x); + + // Convert signed int to rj string with 123 or -12 format + char* itostr3(const int x); + + // Convert unsigned int to lj string with 123 format + char* itostr3left(const int xx); + + // Convert signed int to rj string with _123, -123, _-12, or __-1 format + char* itostr4sign(const int x); + + // Convert unsigned float to string with 1.23 format + char* ftostr12ns(const float &x); + + // Convert signed float to fixed-length string with 023.45 / -23.45 format + char* ftostr52(const float &x); + + // Convert float to fixed-length string with +123.4 / -123.4 format + char* ftostr41sign(const float &x); + + // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format + char* ftostr43sign(const float &x, char plus=' '); + + // Convert unsigned float to rj string with 12345 format + char* ftostr5rj(const float &x); + + // Convert signed float to string with +1234.5 format + char* ftostr51sign(const float &x); + + // Convert signed float to space-padded string with -_23.4_ format + char* ftostr52sp(const float &x); + + // Convert signed float to string with +123.45 format + char* ftostr52sign(const float &x); + + // Convert unsigned float to string with 1234.56 format omitting trailing zeros + char* ftostr62rj(const float &x); + + // Convert float to rj string with 123 or -12 format + FORCE_INLINE char* ftostr3(const float &x) { return itostr3(int(x + (x < 0 ? -0.5f : 0.5f))); } + + #if ENABLED(LCD_DECIMAL_SMALL_XY) + // Convert float to rj string with 1234, _123, 12.3, _1.2, -123, _-12, or -1.2 format + char* ftostr4sign(const float &fx); + #else + // Convert float to rj string with 1234, _123, -123, __12, _-12, ___1, or __-1 format + FORCE_INLINE char* ftostr4sign(const float &x) { return itostr4sign(int(x + (x < 0 ? -0.5f : 0.5f))); } + #endif + +#endif // ULTRA_LCD + #if ENABLED(DEBUG_LEVELING_FEATURE) void log_machine_info(); -#else - #define log_machine_info() NOOP #endif -template -class restorer { - T& ref_; - T val_; -public: - restorer(T& perm) : ref_(perm), val_(perm) {} - restorer(T& perm, T temp_val) : ref_(perm), val_(perm) { perm = temp_val; } - ~restorer() { restore(); } - inline void restore() { ref_ = val_; } -}; - -#define REMEMBER(N,X,V...) restorer<__typeof__(X)> restorer_##N(X, ##V) -#define RESTORE(N) restorer_##N.restore() - -// Converts from an uint8_t in the range of 0-255 to an uint8_t -// in the range 0-100 while avoiding rounding artifacts -constexpr uint8_t ui8_to_percent(const uint8_t i) { return (int(i) * 100 + 127) / 255; } +#endif // __UTILITY_H__ diff --git a/Marlin/src/feature/I2CPositionEncoder.cpp b/Marlin/src/feature/I2CPositionEncoder.cpp new file mode 100644 index 0000000000..f5bec8885c --- /dev/null +++ b/Marlin/src/feature/I2CPositionEncoder.cpp @@ -0,0 +1,1140 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +//todo: add support for multiple encoders on a single axis +//todo: add z axis auto-leveling +//todo: consolidate some of the related M codes? +//todo: add endstop-replacement mode? +//todo: try faster I2C speed; tweak TWI_FREQ (400000L, or faster?); or just TWBR = ((CPU_FREQ / 400000L) - 16) / 2; +//todo: consider Marlin-optimized Wire library; i.e. MarlinWire, like MarlinSerial + + +#include "../inc/MarlinConfig.h" + +#if ENABLED(I2C_POSITION_ENCODERS) + +#include "I2CPositionEncoder.h" + +#include "../module/temperature.h" +#include "../module/stepper.h" +#include "../gcode/parser.h" +#include + +#include + +void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) { + encoderAxis = axis; + i2cAddress = address; + + initialized++; + + SERIAL_ECHOPAIR("Setting up encoder on ", axis_codes[encoderAxis]); + SERIAL_ECHOLNPAIR(" axis, addr = ", address); + + position = get_position(); +} + +void I2CPositionEncoder::update() { + if (!initialized || !homed || !active) return; //check encoder is set up and active + + position = get_position(); + + //we don't want to stop things just because the encoder missed a message, + //so we only care about responses that indicate bad magnetic strength + + if (!passes_test(false)) { //check encoder data is good + lastErrorTime = millis(); + /* + if (trusted) { //commented out as part of the note below + trusted = false; + SERIAL_ECHOPGM("Fault detected on "); + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPGM(" axis encoder. Disengaging error correction until module is trusted again."); + } + */ + return; + } + + if (!trusted) { + /** + * This is commented out because it introduces error and can cause bad print quality. + * + * This code is intended to manage situations where the encoder has reported bad magnetic strength. + * This indicates that the magnetic strip was too far away from the sensor to reliably track position. + * When this happens, this code resets the offset based on where the printer thinks it is. This has been + * shown to introduce errors in actual position which result in drifting prints and poor print quality. + * Perhaps a better method would be to disable correction on the axis with a problem, report it to the + * user via the status leds on the encoder module and prompt the user to re-home the axis at which point + * the encoder would be re-enabled. + */ + + /* + // If the magnetic strength has been good for a certain time, start trusting the module again + + if (millis() - lastErrorTime > I2CPE_TIME_TRUSTED) { + trusted = true; + + SERIAL_ECHOPGM("Untrusted encoder module on "); + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPGM(" axis has been fault-free for set duration, reinstating error correction."); + + //the encoder likely lost its place when the error occured, so we'll reset and use the printer's + //idea of where it the axis is to re-initialize + const float pos = planner.get_axis_position_mm(encoderAxis); + int32_t positionInTicks = pos * get_ticks_unit(); + + //shift position from previous to current position + zeroOffset -= (positionInTicks - get_position()); + + #ifdef I2CPE_DEBUG + SERIAL_ECHOPGM("Current position is "); + SERIAL_ECHOLN(pos); + + SERIAL_ECHOPGM("Position in encoder ticks is "); + SERIAL_ECHOLN(positionInTicks); + + SERIAL_ECHOPGM("New zero-offset of "); + SERIAL_ECHOLN(zeroOffset); + + SERIAL_ECHOPGM("New position reads as "); + SERIAL_ECHO(get_position()); + SERIAL_CHAR('('); + SERIAL_ECHO(mm_from_count(get_position())); + SERIAL_ECHOLNPGM(")"); + #endif + } + */ + return; + } + + lastPosition = position; + const millis_t positionTime = millis(); + + //only do error correction if setup and enabled + if (ec && ecMethod != I2CPE_ECM_NONE) { + + #ifdef I2CPE_EC_THRESH_PROPORTIONAL + const millis_t deltaTime = positionTime - lastPositionTime; + const uint32_t distance = ABS(position - lastPosition), + speed = distance / deltaTime; + const float threshold = constrain((speed / 50), 1, 50) * ecThreshold; + #else + const float threshold = get_error_correct_threshold(); + #endif + + //check error + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + float sum = 0, diffSum = 0; + + errIdx = (errIdx >= I2CPE_ERR_ARRAY_SIZE - 1) ? 0 : errIdx + 1; + err[errIdx] = get_axis_error_steps(false); + + LOOP_L_N(i, I2CPE_ERR_ARRAY_SIZE) { + sum += err[i]; + if (i) diffSum += ABS(err[i-1] - err[i]); + } + + const int32_t error = int32_t(sum / (I2CPE_ERR_ARRAY_SIZE + 1)); //calculate average for error + + #else + const int32_t error = get_axis_error_steps(false); + #endif + + //SERIAL_ECHOPGM("Axis error steps: "); + //SERIAL_ECHOLN(error); + + #ifdef I2CPE_ERR_THRESH_ABORT + if (ABS(error) > I2CPE_ERR_THRESH_ABORT * planner.axis_steps_per_mm[encoderAxis]) { + //kill("Significant Error"); + SERIAL_ECHOPGM("Axis error greater than set threshold, aborting!"); + SERIAL_ECHOLN(error); + safe_delay(5000); + } + #endif + + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + if (errIdx == 0) { + // In order to correct for "error" but avoid correcting for noise and non-skips + // it must be > threshold and have a difference average of < 10 and be < 2000 steps + if (ABS(error) > threshold * planner.axis_steps_per_mm[encoderAxis] && + diffSum < 10 * (I2CPE_ERR_ARRAY_SIZE - 1) && ABS(error) < 2000) { // Check for persistent error (skip) + errPrst[errPrstIdx++] = error; // Error must persist for I2CPE_ERR_PRST_ARRAY_SIZE error cycles. This also serves to improve the average accuracy + if (errPrstIdx >= I2CPE_ERR_PRST_ARRAY_SIZE) { + float sumP = 0; + LOOP_L_N(i, I2CPE_ERR_PRST_ARRAY_SIZE) sumP += errPrst[i]; + const int32_t errorP = int32_t(sumP * (1.0f / (I2CPE_ERR_PRST_ARRAY_SIZE))); + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" - err detected: ", errorP * planner.steps_to_mm[encoderAxis]); + SERIAL_ECHOLNPGM("mm; correcting!"); + thermalManager.babystepsTodo[encoderAxis] = -LROUND(errorP); + errPrstIdx = 0; + } + } + else + errPrstIdx = 0; + } + #else + if (ABS(error) > threshold * planner.axis_steps_per_mm[encoderAxis]) { + //SERIAL_ECHOLN(error); + //SERIAL_ECHOLN(position); + thermalManager.babystepsTodo[encoderAxis] = -LROUND(error / 2); + } + #endif + + if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.axis_steps_per_mm[encoderAxis]) { + const millis_t ms = millis(); + if (ELAPSED(ms, nextErrorCountTime)) { + SERIAL_ECHOPAIR("Large error on ", axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" axis. error: ", (int)error); + SERIAL_ECHOLNPAIR("; diffSum: ", diffSum); + errorCount++; + nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS; + } + } + } + + lastPositionTime = positionTime; +} + +void I2CPositionEncoder::set_homed() { + if (active) { + reset(); // Reset module's offset to zero (so current position is homed / zero) + delay(10); + + zeroOffset = get_raw_count(); + homed++; + trusted++; + + #ifdef I2CPE_DEBUG + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" axis encoder homed, offset of ", zeroOffset); + SERIAL_ECHOLNPGM(" ticks."); + #endif + } +} + +bool I2CPositionEncoder::passes_test(const bool report) { + if (report) { + if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. "); + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPGM(" axis "); + serialprintPGM(H == I2CPE_MAG_SIG_BAD ? PSTR("magnetic strip ") : PSTR("encoder ")); + switch (H) { + case I2CPE_MAG_SIG_GOOD: + case I2CPE_MAG_SIG_MID: + SERIAL_ECHOLNPGM("passes test; field strength "); + serialprintPGM(H == I2CPE_MAG_SIG_GOOD ? PSTR("good.\n") : PSTR("fair.\n")); + break; + default: + SERIAL_ECHOLNPGM("not detected!"); + } + } + return (H == I2CPE_MAG_SIG_GOOD || H == I2CPE_MAG_SIG_MID); +} + +float I2CPositionEncoder::get_axis_error_mm(const bool report) { + float target, actual, error; + + target = planner.get_axis_position_mm(encoderAxis); + actual = mm_from_count(position); + error = actual - target; + + if (ABS(error) > 10000) error = 0; // ? + + if (report) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" axis target: ", target); + SERIAL_ECHOPAIR(", actual: ", actual); + SERIAL_ECHOLNPAIR(", error : ",error); + } + + return error; +} + +int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) { + if (!active) { + if (report) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPGM(" axis encoder not active!"); + } + return 0; + } + + float stepperTicksPerUnit; + int32_t encoderTicks = position, encoderCountInStepperTicksScaled; + //int32_t stepperTicks = stepper.position(encoderAxis); + + // With a rotary encoder we're concerned with ticks/rev; whereas with a linear we're concerned with ticks/mm + stepperTicksPerUnit = (type == I2CPE_ENC_TYPE_ROTARY) ? stepperTicks : planner.axis_steps_per_mm[encoderAxis]; + + //convert both 'ticks' into same units / base + encoderCountInStepperTicksScaled = LROUND((stepperTicksPerUnit * encoderTicks) / encoderTicksPerUnit); + + int32_t target = stepper.position(encoderAxis), + error = (encoderCountInStepperTicksScaled - target); + + //suppress discontinuities (might be caused by bad I2C readings...?) + const bool suppressOutput = (ABS(error - errorPrev) > 100); + + if (report) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOPAIR(" axis target: ", target); + SERIAL_ECHOPAIR(", actual: ", encoderCountInStepperTicksScaled); + SERIAL_ECHOLNPAIR(", error : ", error); + + if (suppressOutput) SERIAL_ECHOLNPGM("Discontinuity detected, suppressing error."); + } + + errorPrev = error; + + return (suppressOutput ? 0 : error); +} + +int32_t I2CPositionEncoder::get_raw_count() { + uint8_t index = 0; + i2cLong encoderCount; + + encoderCount.val = 0x00; + + if (Wire.requestFrom((int)i2cAddress, 3) != 3) { + //houston, we have a problem... + H = I2CPE_MAG_SIG_NF; + return 0; + } + + while (Wire.available()) + encoderCount.bval[index++] = (uint8_t)Wire.read(); + + //extract the magnetic strength + H = (B00000011 & (encoderCount.bval[2] >> 6)); + + //extract sign bit; sign = (encoderCount.bval[2] & B00100000); + //set all upper bits to the sign value to overwrite H + encoderCount.val = (encoderCount.bval[2] & B00100000) ? (encoderCount.val | 0xFFC00000) : (encoderCount.val & 0x003FFFFF); + + if (invert) encoderCount.val *= -1; + + return encoderCount.val; +} + +bool I2CPositionEncoder::test_axis() { + //only works on XYZ cartesian machines for the time being + if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) return false; + + float startCoord[NUM_AXIS] = { 0 }, endCoord[NUM_AXIS] = { 0 }; + + const float startPosition = soft_endstop_min[encoderAxis] + 10, + endPosition = soft_endstop_max[encoderAxis] - 10, + feedrate = FLOOR(MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY)); + + ec = false; + + LOOP_NA(i) { + startCoord[i] = planner.get_axis_position_mm((AxisEnum)i); + endCoord[i] = planner.get_axis_position_mm((AxisEnum)i); + } + + startCoord[encoderAxis] = startPosition; + endCoord[encoderAxis] = endPosition; + + planner.synchronize(); + + planner.buffer_line(startCoord[X_AXIS], startCoord[Y_AXIS], startCoord[Z_AXIS], + planner.get_axis_position_mm(E_AXIS), feedrate, 0); + planner.synchronize(); + + // if the module isn't currently trusted, wait until it is (or until it should be if things are working) + if (!trusted) { + int32_t startWaitingTime = millis(); + while (!trusted && millis() - startWaitingTime < I2CPE_TIME_TRUSTED) + safe_delay(500); + } + + if (trusted) { // if trusted, commence test + planner.buffer_line(endCoord[X_AXIS], endCoord[Y_AXIS], endCoord[Z_AXIS], + planner.get_axis_position_mm(E_AXIS), feedrate, 0); + planner.synchronize(); + } + + return trusted; +} + +void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) { + if (type != I2CPE_ENC_TYPE_LINEAR) { + SERIAL_ECHOLNPGM("Steps per mm calibration is only available using linear encoders."); + return; + } + + if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) { + SERIAL_ECHOLNPGM("Automatic steps / mm calibration not supported for this axis."); + return; + } + + float old_steps_mm, new_steps_mm, + startDistance, endDistance, + travelDistance, travelledDistance, total = 0, + startCoord[NUM_AXIS] = { 0 }, endCoord[NUM_AXIS] = { 0 }; + + float feedrate; + + int32_t startCount, stopCount; + + feedrate = MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY); + + bool oldec = ec; + ec = false; + + startDistance = 20; + endDistance = soft_endstop_max[encoderAxis] - 20; + travelDistance = endDistance - startDistance; + + LOOP_NA(i) { + startCoord[i] = planner.get_axis_position_mm((AxisEnum)i); + endCoord[i] = planner.get_axis_position_mm((AxisEnum)i); + } + + startCoord[encoderAxis] = startDistance; + endCoord[encoderAxis] = endDistance; + + planner.synchronize(); + + LOOP_L_N(i, iter) { + planner.buffer_line(startCoord[X_AXIS], startCoord[Y_AXIS], startCoord[Z_AXIS], + planner.get_axis_position_mm(E_AXIS), feedrate, 0); + planner.synchronize(); + + delay(250); + startCount = get_position(); + + //do_blocking_move_to(endCoord[X_AXIS],endCoord[Y_AXIS],endCoord[Z_AXIS]); + + planner.buffer_line(endCoord[X_AXIS], endCoord[Y_AXIS], endCoord[Z_AXIS], + planner.get_axis_position_mm(E_AXIS), feedrate, 0); + planner.synchronize(); + + //Read encoder distance + delay(250); + stopCount = get_position(); + + travelledDistance = mm_from_count(ABS(stopCount - startCount)); + + SERIAL_ECHOPAIR("Attempted to travel: ", travelDistance); + SERIAL_ECHOLNPGM("mm."); + + SERIAL_ECHOPAIR("Actually travelled: ", travelledDistance); + SERIAL_ECHOLNPGM("mm."); + + //Calculate new axis steps per unit + old_steps_mm = planner.axis_steps_per_mm[encoderAxis]; + new_steps_mm = (old_steps_mm * travelDistance) / travelledDistance; + + SERIAL_ECHOLNPAIR("Old steps per mm: ", old_steps_mm); + SERIAL_ECHOLNPAIR("New steps per mm: ", new_steps_mm); + + //Save new value + planner.axis_steps_per_mm[encoderAxis] = new_steps_mm; + + if (iter > 1) { + total += new_steps_mm; + + // swap start and end points so next loop runs from current position + float tempCoord = startCoord[encoderAxis]; + startCoord[encoderAxis] = endCoord[encoderAxis]; + endCoord[encoderAxis] = tempCoord; + } + } + + if (iter > 1) { + total /= (float)iter; + SERIAL_ECHOLNPAIR("Average steps per mm: ", total); + } + + ec = oldec; + + SERIAL_ECHOLNPGM("Calculated steps per mm has been set. Please save to EEPROM (M500) if you wish to keep these values."); +} + +void I2CPositionEncoder::reset() { + Wire.beginTransmission(i2cAddress); + Wire.write(I2CPE_RESET_COUNT); + Wire.endTransmission(); + + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + ZERO(err); + #endif +} + + +bool I2CPositionEncodersMgr::I2CPE_anyaxis; +uint8_t I2CPositionEncodersMgr::I2CPE_addr, + I2CPositionEncodersMgr::I2CPE_idx; +I2CPositionEncoder I2CPositionEncodersMgr::encoders[I2CPE_ENCODER_CNT]; + +void I2CPositionEncodersMgr::init() { + Wire.begin(); + + #if I2CPE_ENCODER_CNT > 0 + uint8_t i = 0; + + encoders[i].init(I2CPE_ENC_1_ADDR, I2CPE_ENC_1_AXIS); + + #ifdef I2CPE_ENC_1_TYPE + encoders[i].set_type(I2CPE_ENC_1_TYPE); + #endif + #ifdef I2CPE_ENC_1_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_1_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_1_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_1_TICKS_REV); + #endif + #ifdef I2CPE_ENC_1_INVERT + encoders[i].set_inverted(I2CPE_ENC_1_INVERT); + #endif + #ifdef I2CPE_ENC_1_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_1_EC_METHOD); + #endif + #ifdef I2CPE_ENC_1_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_1_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_1_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 1 + i++; + + encoders[i].init(I2CPE_ENC_2_ADDR, I2CPE_ENC_2_AXIS); + + #ifdef I2CPE_ENC_2_TYPE + encoders[i].set_type(I2CPE_ENC_2_TYPE); + #endif + #ifdef I2CPE_ENC_2_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_2_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_2_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_2_TICKS_REV); + #endif + #ifdef I2CPE_ENC_2_INVERT + encoders[i].set_inverted(I2CPE_ENC_2_INVERT); + #endif + #ifdef I2CPE_ENC_2_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_2_EC_METHOD); + #endif + #ifdef I2CPE_ENC_2_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_2_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_2_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 2 + i++; + + encoders[i].init(I2CPE_ENC_3_ADDR, I2CPE_ENC_3_AXIS); + + #ifdef I2CPE_ENC_3_TYPE + encoders[i].set_type(I2CPE_ENC_3_TYPE); + #endif + #ifdef I2CPE_ENC_3_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_3_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_3_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_3_TICKS_REV); + #endif + #ifdef I2CPE_ENC_3_INVERT + encoders[i].set_inverted(I2CPE_ENC_3_INVERT); + #endif + #ifdef I2CPE_ENC_3_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_3_EC_METHOD); + #endif + #ifdef I2CPE_ENC_3_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_3_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_3_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 3 + i++; + + encoders[i].init(I2CPE_ENC_4_ADDR, I2CPE_ENC_4_AXIS); + + #ifdef I2CPE_ENC_4_TYPE + encoders[i].set_type(I2CPE_ENC_4_TYPE); + #endif + #ifdef I2CPE_ENC_4_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_4_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_4_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_4_TICKS_REV); + #endif + #ifdef I2CPE_ENC_4_INVERT + encoders[i].set_inverted(I2CPE_ENC_4_INVERT); + #endif + #ifdef I2CPE_ENC_4_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_4_EC_METHOD); + #endif + #ifdef I2CPE_ENC_4_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_4_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_4_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 4 + i++; + + encoders[i].init(I2CPE_ENC_5_ADDR, I2CPE_ENC_5_AXIS); + + #ifdef I2CPE_ENC_5_TYPE + encoders[i].set_type(I2CPE_ENC_5_TYPE); + #endif + #ifdef I2CPE_ENC_5_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_5_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_5_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_5_TICKS_REV); + #endif + #ifdef I2CPE_ENC_5_INVERT + encoders[i].set_inverted(I2CPE_ENC_5_INVERT); + #endif + #ifdef I2CPE_ENC_5_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_5_EC_METHOD); + #endif + #ifdef I2CPE_ENC_5_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_5_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_5_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif +} + +void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) { + CHECK_IDX(); + + if (units) + SERIAL_ECHOLN(noOffset ? encoders[idx].mm_from_count(encoders[idx].get_raw_count()) : encoders[idx].get_position_mm()); + else { + if (noOffset) { + const int32_t raw_count = encoders[idx].get_raw_count(); + SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); + SERIAL_CHAR(' '); + + for (uint8_t j = 31; j > 0; j--) + SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j))); + + SERIAL_ECHO((bool)(0x00000001 & raw_count)); + SERIAL_CHAR(' '); + SERIAL_ECHOLN(raw_count); + } + else + SERIAL_ECHOLN(encoders[idx].get_position()); + } +} + +void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const uint8_t newaddr) { + // First check 'new' address is not in use + Wire.beginTransmission(newaddr); + if (!Wire.endTransmission()) { + SERIAL_ECHOPAIR("?There is already a device with that address on the I2C bus! (", newaddr); + SERIAL_ECHOLNPGM(")"); + return; + } + + // Now check that we can find the module on the oldaddr address + Wire.beginTransmission(oldaddr); + if (Wire.endTransmission()) { + SERIAL_ECHOPAIR("?No module detected at this address! (", oldaddr); + SERIAL_ECHOLNPGM(")"); + return; + } + + SERIAL_ECHOPAIR("Module found at ", oldaddr); + SERIAL_ECHOLNPAIR(", changing address to ", newaddr); + + // Change the modules address + Wire.beginTransmission(oldaddr); + Wire.write(I2CPE_SET_ADDR); + Wire.write(newaddr); + Wire.endTransmission(); + + SERIAL_ECHOLNPGM("Address changed, resetting and waiting for confirmation.."); + + // Wait for the module to reset (can probably be improved by polling address with a timeout). + safe_delay(I2CPE_REBOOT_TIME); + + // Look for the module at the new address. + Wire.beginTransmission(newaddr); + if (Wire.endTransmission()) { + SERIAL_ECHOLNPGM("Address change failed! Check encoder module."); + return; + } + + SERIAL_ECHOLNPGM("Address change successful!"); + + // Now, if this module is configured, find which encoder instance it's supposed to correspond to + // and enable it (it will likely have failed initialization on power-up, before the address change). + const int8_t idx = idx_from_addr(newaddr); + if (idx >= 0 && !encoders[idx].get_active()) { + SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); + SERIAL_ECHOLNPGM(" axis encoder was not detected on printer startup. Trying again."); + encoders[idx].set_active(encoders[idx].passes_test(true)); + } +} + +void I2CPositionEncodersMgr::report_module_firmware(const uint8_t address) { + // First check there is a module + Wire.beginTransmission(address); + if (Wire.endTransmission()) { + SERIAL_ECHOPAIR("?No module detected at this address! (", address); + SERIAL_ECHOLNPGM(")"); + return; + } + + SERIAL_ECHOPAIR("Requesting version info from module at address ", address); + SERIAL_ECHOLNPGM(":"); + + Wire.beginTransmission(address); + Wire.write(I2CPE_SET_REPORT_MODE); + Wire.write(I2CPE_REPORT_VERSION); + Wire.endTransmission(); + + // Read value + if (Wire.requestFrom((int)address, 32)) { + char c; + while (Wire.available() > 0 && (c = (char)Wire.read()) > 0) + SERIAL_ECHO(c); + SERIAL_EOL(); + } + + // Set module back to normal (distance) mode + Wire.beginTransmission(address); + Wire.write(I2CPE_SET_REPORT_MODE); + Wire.write(I2CPE_REPORT_DISTANCE); + Wire.endTransmission(); +} + +int8_t I2CPositionEncodersMgr::parse() { + I2CPE_addr = 0; + + if (parser.seen('A')) { + + if (!parser.has_value()) { + SERIAL_PROTOCOLLNPGM("?A seen, but no address specified! [30-200]"); + return I2CPE_PARSE_ERR; + }; + + I2CPE_addr = parser.value_byte(); + if (!WITHIN(I2CPE_addr, 30, 200)) { // reserve the first 30 and last 55 + SERIAL_PROTOCOLLNPGM("?Address out of range. [30-200]"); + return I2CPE_PARSE_ERR; + } + + I2CPE_idx = idx_from_addr(I2CPE_addr); + if (I2CPE_idx >= I2CPE_ENCODER_CNT) { + SERIAL_PROTOCOLLNPGM("?No device with this address!"); + return I2CPE_PARSE_ERR; + } + } + else if (parser.seenval('I')) { + + if (!parser.has_value()) { + SERIAL_PROTOCOLLNPAIR("?I seen, but no index specified! [0-", I2CPE_ENCODER_CNT - 1); + SERIAL_PROTOCOLLNPGM("]"); + return I2CPE_PARSE_ERR; + }; + + I2CPE_idx = parser.value_byte(); + if (I2CPE_idx >= I2CPE_ENCODER_CNT) { + SERIAL_PROTOCOLLNPAIR("?Index out of range. [0-", I2CPE_ENCODER_CNT - 1); + SERIAL_ECHOLNPGM("]"); + return I2CPE_PARSE_ERR; + } + + I2CPE_addr = encoders[I2CPE_idx].get_address(); + } + else + I2CPE_idx = 0xFF; + + I2CPE_anyaxis = parser.seen_axis(); + + return I2CPE_PARSE_OK; +}; + +/** + * M860: Report the position(s) of position encoder module(s). + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * O Include homed zero-offset in returned position. + * U Units in mm or raw step count. + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + * + */ +void I2CPositionEncodersMgr::M860() { + if (parse()) return; + + const bool hasU = parser.seen('U'), hasO = parser.seen('O'); + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_position(idx, hasU, hasO); + } + } + } + else + report_position(I2CPE_idx, hasU, hasO); +} + +/** + * M861: Report the status of position encoder modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + * + */ +void I2CPositionEncodersMgr::M861() { + if (parse()) return; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_status(idx); + } + } + } + else + report_status(I2CPE_idx); +} + +/** + * M862: Perform an axis continuity test for position encoder + * modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + * + */ +void I2CPositionEncodersMgr::M862() { + if (parse()) return; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) test_axis(idx); + } + } + } + else + test_axis(I2CPE_idx); +} + +/** + * M863: Perform steps-per-mm calibration for + * position encoder modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * P Number of rePeats/iterations. + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + * + */ +void I2CPositionEncodersMgr::M863() { + if (parse()) return; + + const uint8_t iterations = constrain(parser.byteval('P', 1), 1, 10); + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) calibrate_steps_mm(idx, iterations); + } + } + } + else + calibrate_steps_mm(I2CPE_idx, iterations); +} + +/** + * M864: Change position encoder module I2C address. + * + * A Module current/old I2C address. If not present, + * assumes default address (030). [30, 200]. + * S Module new I2C address. [30, 200]. + * + * If S is not specified: + * X Use I2CPE_PRESET_ADDR_X (030). + * Y Use I2CPE_PRESET_ADDR_Y (031). + * Z Use I2CPE_PRESET_ADDR_Z (032). + * E Use I2CPE_PRESET_ADDR_E (033). + */ +void I2CPositionEncodersMgr::M864() { + uint8_t newAddress; + + if (parse()) return; + + if (!I2CPE_addr) I2CPE_addr = I2CPE_PRESET_ADDR_X; + + if (parser.seen('S')) { + if (!parser.has_value()) { + SERIAL_PROTOCOLLNPGM("?S seen, but no address specified! [30-200]"); + return; + }; + + newAddress = parser.value_byte(); + if (!WITHIN(newAddress, 30, 200)) { + SERIAL_PROTOCOLLNPGM("?New address out of range. [30-200]"); + return; + } + } + else if (!I2CPE_anyaxis) { + SERIAL_PROTOCOLLNPGM("?You must specify S or [XYZE]."); + return; + } + else { + if (parser.seen('X')) newAddress = I2CPE_PRESET_ADDR_X; + else if (parser.seen('Y')) newAddress = I2CPE_PRESET_ADDR_Y; + else if (parser.seen('Z')) newAddress = I2CPE_PRESET_ADDR_Z; + else if (parser.seen('E')) newAddress = I2CPE_PRESET_ADDR_E; + else return; + } + + SERIAL_ECHOPAIR("Changing module at address ", I2CPE_addr); + SERIAL_ECHOLNPAIR(" to address ", newAddress); + + change_module_address(I2CPE_addr, newAddress); +} + +/** + * M865: Check position encoder module firmware version. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * + * If A or I not specified: + * X Check X axis encoder, if present. + * Y Check Y axis encoder, if present. + * Z Check Z axis encoder, if present. + * E Check E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M865() { + if (parse()) return; + + if (!I2CPE_addr) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_module_firmware(encoders[idx].get_address()); + } + } + } + else + report_module_firmware(I2CPE_addr); +} + +/** + * M866: Report or reset position encoder module error + * count. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * R Reset error counter. + * + * If A or I not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M866() { + if (parse()) return; + + const bool hasR = parser.seen('R'); + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) { + if (hasR) + reset_error_count(idx, AxisEnum(i)); + else + report_error_count(idx, AxisEnum(i)); + } + } + } + } + else if (hasR) + reset_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); + else + report_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); +} + +/** + * M867: Enable/disable or toggle error correction for position encoder modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * S<1|0> Enable/disable error correction. 1 enables, 0 disables. If not + * supplied, toggle. + * + * If A or I not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M867() { + if (parse()) return; + + const int8_t onoff = parser.seenval('S') ? parser.value_int() : -1; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) { + const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; + enable_ec(idx, ena, AxisEnum(i)); + } + } + } + } + else { + const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; + enable_ec(I2CPE_idx, ena, encoders[I2CPE_idx].get_axis()); + } +} + +/** + * M868: Report or set position encoder module error correction + * threshold. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * T New error correction threshold. + * + * If A not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M868() { + if (parse()) return; + + const float newThreshold = parser.seenval('T') ? parser.value_float() : -9999; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) { + if (newThreshold != -9999) + set_ec_threshold(idx, newThreshold, encoders[idx].get_axis()); + else + get_ec_threshold(idx, encoders[idx].get_axis()); + } + } + } + } + else if (newThreshold != -9999) + set_ec_threshold(I2CPE_idx, newThreshold, encoders[I2CPE_idx].get_axis()); + else + get_ec_threshold(I2CPE_idx, encoders[I2CPE_idx].get_axis()); +} + +/** + * M869: Report position encoder module error. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * + * If A not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M869() { + if (parse()) return; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_error(idx); + } + } + } + else + report_error(I2CPE_idx); +} + +#endif // I2C_POSITION_ENCODERS diff --git a/Marlin/src/feature/I2CPositionEncoder.h b/Marlin/src/feature/I2CPositionEncoder.h new file mode 100644 index 0000000000..f5fe8bced8 --- /dev/null +++ b/Marlin/src/feature/I2CPositionEncoder.h @@ -0,0 +1,329 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef I2CPOSENC_H +#define I2CPOSENC_H + +#include "../inc/MarlinConfig.h" + +#include "../module/planner.h" + +#include + +//=========== Advanced / Less-Common Encoder Configuration Settings ========== + +#define I2CPE_EC_THRESH_PROPORTIONAL // if enabled adjusts the error correction threshold + // proportional to the current speed of the axis allows + // for very small error margin at low speeds without + // stuttering due to reading latency at high speeds + +#define I2CPE_DEBUG // enable encoder-related debug serial echos + +#define I2CPE_REBOOT_TIME 5000 // time we wait for an encoder module to reboot + // after changing address. + +#define I2CPE_MAG_SIG_GOOD 0 +#define I2CPE_MAG_SIG_MID 1 +#define I2CPE_MAG_SIG_BAD 2 +#define I2CPE_MAG_SIG_NF 255 + +#define I2CPE_REQ_REPORT 0 +#define I2CPE_RESET_COUNT 1 +#define I2CPE_SET_ADDR 2 +#define I2CPE_SET_REPORT_MODE 3 +#define I2CPE_CLEAR_EEPROM 4 + +#define I2CPE_LED_PAR_MODE 10 +#define I2CPE_LED_PAR_BRT 11 +#define I2CPE_LED_PAR_RATE 14 + +#define I2CPE_REPORT_DISTANCE 0 +#define I2CPE_REPORT_STRENGTH 1 +#define I2CPE_REPORT_VERSION 2 + +// Default I2C addresses +#define I2CPE_PRESET_ADDR_X 30 +#define I2CPE_PRESET_ADDR_Y 31 +#define I2CPE_PRESET_ADDR_Z 32 +#define I2CPE_PRESET_ADDR_E 33 + +#define I2CPE_DEF_AXIS X_AXIS +#define I2CPE_DEF_ADDR I2CPE_PRESET_ADDR_X + +// Error event counter; tracks how many times there is an error exceeding a certain threshold +#define I2CPE_ERR_CNT_THRESH 3.00 +#define I2CPE_ERR_CNT_DEBOUNCE_MS 2000 + +#if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + #define I2CPE_ERR_ARRAY_SIZE 32 + #define I2CPE_ERR_PRST_ARRAY_SIZE 10 +#endif + +// Error Correction Methods +#define I2CPE_ECM_NONE 0 +#define I2CPE_ECM_MICROSTEP 1 +#define I2CPE_ECM_PLANNER 2 +#define I2CPE_ECM_STALLDETECT 3 + +// Encoder types +#define I2CPE_ENC_TYPE_ROTARY 0 +#define I2CPE_ENC_TYPE_LINEAR 1 + +// Parser +#define I2CPE_PARSE_ERR 1 +#define I2CPE_PARSE_OK 0 + +#define LOOP_PE(VAR) LOOP_L_N(VAR, I2CPE_ENCODER_CNT) +#define CHECK_IDX() do{ if (!WITHIN(idx, 0, I2CPE_ENCODER_CNT - 1)) return; }while(0) + +extern const char axis_codes[XYZE]; + +typedef union { + volatile int32_t val = 0; + uint8_t bval[4]; +} i2cLong; + +class I2CPositionEncoder { + private: + AxisEnum encoderAxis = I2CPE_DEF_AXIS; + + uint8_t i2cAddress = I2CPE_DEF_ADDR, + ecMethod = I2CPE_DEF_EC_METHOD, + type = I2CPE_DEF_TYPE, + H = I2CPE_MAG_SIG_NF; // Magnetic field strength + + int encoderTicksPerUnit = I2CPE_DEF_ENC_TICKS_UNIT, + stepperTicks = I2CPE_DEF_TICKS_REV, + errorCount = 0, + errorPrev = 0; + + float ecThreshold = I2CPE_DEF_EC_THRESH; + + bool homed = false, + trusted = false, + initialized = false, + active = false, + invert = false, + ec = true; + + int32_t zeroOffset = 0, + lastPosition = 0, + position; + + millis_t lastPositionTime = 0, + nextErrorCountTime = 0, + lastErrorTime; + + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + uint8_t errIdx = 0, errPrstIdx = 0; + int err[I2CPE_ERR_ARRAY_SIZE] = { 0 }, + errPrst[I2CPE_ERR_PRST_ARRAY_SIZE] = { 0 }; + #endif + + public: + void init(const uint8_t address, const AxisEnum axis); + void reset(); + + void update(); + + void set_homed(); + + int32_t get_raw_count(); + + FORCE_INLINE float mm_from_count(const int32_t count) { + switch (type) { + default: return -1; + case I2CPE_ENC_TYPE_LINEAR: + return count / encoderTicksPerUnit; + case I2CPE_ENC_TYPE_ROTARY: + return (count * stepperTicks) / (encoderTicksPerUnit * planner.axis_steps_per_mm[encoderAxis]); + } + } + + FORCE_INLINE float get_position_mm() { return mm_from_count(get_position()); } + FORCE_INLINE int32_t get_position() { return get_raw_count() - zeroOffset; } + + int32_t get_axis_error_steps(const bool report); + float get_axis_error_mm(const bool report); + + void calibrate_steps_mm(const uint8_t iter); + + bool passes_test(const bool report); + + bool test_axis(void); + + FORCE_INLINE int get_error_count(void) { return errorCount; } + FORCE_INLINE void set_error_count(const int newCount) { errorCount = newCount; } + + FORCE_INLINE uint8_t get_address() { return i2cAddress; } + FORCE_INLINE void set_address(const uint8_t addr) { i2cAddress = addr; } + + FORCE_INLINE bool get_active(void) { return active; } + FORCE_INLINE void set_active(const bool a) { active = a; } + + FORCE_INLINE void set_inverted(const bool i) { invert = i; } + + FORCE_INLINE AxisEnum get_axis() { return encoderAxis; } + + FORCE_INLINE bool get_ec_enabled() { return ec; } + FORCE_INLINE void set_ec_enabled(const bool enabled) { ec = enabled; } + + FORCE_INLINE uint8_t get_ec_method() { return ecMethod; } + FORCE_INLINE void set_ec_method(const byte method) { ecMethod = method; } + + FORCE_INLINE float get_ec_threshold() { return ecThreshold; } + FORCE_INLINE void set_ec_threshold(const float newThreshold) { ecThreshold = newThreshold; } + + FORCE_INLINE int get_encoder_ticks_mm() { + switch (type) { + default: return 0; + case I2CPE_ENC_TYPE_LINEAR: + return encoderTicksPerUnit; + case I2CPE_ENC_TYPE_ROTARY: + return (int)((encoderTicksPerUnit / stepperTicks) * planner.axis_steps_per_mm[encoderAxis]); + } + } + + FORCE_INLINE int get_ticks_unit() { return encoderTicksPerUnit; } + FORCE_INLINE void set_ticks_unit(const int ticks) { encoderTicksPerUnit = ticks; } + + FORCE_INLINE uint8_t get_type() { return type; } + FORCE_INLINE void set_type(const byte newType) { type = newType; } + + FORCE_INLINE int get_stepper_ticks() { return stepperTicks; } + FORCE_INLINE void set_stepper_ticks(const int ticks) { stepperTicks = ticks; } +}; + +class I2CPositionEncodersMgr { + private: + static bool I2CPE_anyaxis; + static uint8_t I2CPE_addr, I2CPE_idx; + + public: + + static void init(void); + + // consider only updating one endoder per call / tick if encoders become too time intensive + static void update(void) { LOOP_PE(i) encoders[i].update(); } + + static void homed(const AxisEnum axis) { + LOOP_PE(i) + if (encoders[i].get_axis() == axis) encoders[i].set_homed(); + } + + static void report_position(const int8_t idx, const bool units, const bool noOffset); + + static void report_status(const int8_t idx) { + CHECK_IDX(); + SERIAL_ECHOPAIR("Encoder ", idx); + SERIAL_ECHOPGM(": "); + encoders[idx].get_raw_count(); + encoders[idx].passes_test(true); + } + + static void report_error(const int8_t idx) { + CHECK_IDX(); + encoders[idx].get_axis_error_steps(true); + } + + static void test_axis(const int8_t idx) { + CHECK_IDX(); + encoders[idx].test_axis(); + } + + static void calibrate_steps_mm(const int8_t idx, const int iterations) { + CHECK_IDX(); + encoders[idx].calibrate_steps_mm(iterations); + } + + static void change_module_address(const uint8_t oldaddr, const uint8_t newaddr); + static void report_module_firmware(const uint8_t address); + + static void report_error_count(const int8_t idx, const AxisEnum axis) { + CHECK_IDX(); + SERIAL_ECHOPAIR("Error count on ", axis_codes[axis]); + SERIAL_ECHOLNPAIR(" axis is ", encoders[idx].get_error_count()); + } + + static void reset_error_count(const int8_t idx, const AxisEnum axis) { + CHECK_IDX(); + encoders[idx].set_error_count(0); + SERIAL_ECHOPAIR("Error count on ", axis_codes[axis]); + SERIAL_ECHOLNPGM(" axis has been reset."); + } + + static void enable_ec(const int8_t idx, const bool enabled, const AxisEnum axis) { + CHECK_IDX(); + encoders[idx].set_ec_enabled(enabled); + SERIAL_ECHOPAIR("Error correction on ", axis_codes[axis]); + SERIAL_ECHOPGM(" axis is "); + serialprintPGM(encoders[idx].get_ec_enabled() ? PSTR("en") : PSTR("dis")); + SERIAL_ECHOLNPGM("abled."); + } + + static void set_ec_threshold(const int8_t idx, const float newThreshold, const AxisEnum axis) { + CHECK_IDX(); + encoders[idx].set_ec_threshold(newThreshold); + SERIAL_ECHOPAIR("Error correct threshold for ", axis_codes[axis]); + SERIAL_ECHOPAIR_F(" axis set to ", newThreshold); + SERIAL_ECHOLNPGM("mm."); + } + + static void get_ec_threshold(const int8_t idx, const AxisEnum axis) { + CHECK_IDX(); + const float threshold = encoders[idx].get_ec_threshold(); + SERIAL_ECHOPAIR("Error correct threshold for ", axis_codes[axis]); + SERIAL_ECHOPAIR_F(" axis is ", threshold); + SERIAL_ECHOLNPGM("mm."); + } + + static int8_t idx_from_axis(const AxisEnum axis) { + LOOP_PE(i) + if (encoders[i].get_axis() == axis) return i; + return -1; + } + + static int8_t idx_from_addr(const uint8_t addr) { + LOOP_PE(i) + if (encoders[i].get_address() == addr) return i; + return -1; + } + + static int8_t parse(); + + static void M860(); + static void M861(); + static void M862(); + static void M863(); + static void M864(); + static void M865(); + static void M866(); + static void M867(); + static void M868(); + static void M869(); + + static I2CPositionEncoder encoders[I2CPE_ENCODER_CNT]; +}; + +extern I2CPositionEncodersMgr I2CPEM; + +#endif //I2CPOSENC_H diff --git a/Marlin/src/feature/Max7219_Debug_LEDs.cpp b/Marlin/src/feature/Max7219_Debug_LEDs.cpp new file mode 100644 index 0000000000..39ae5a16b4 --- /dev/null +++ b/Marlin/src/feature/Max7219_Debug_LEDs.cpp @@ -0,0 +1,663 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * This module is off by default, but can be enabled to facilitate the display of + * extra debug information during code development. + * + * Just connect up 5V and GND to give it power, then connect up the pins assigned + * in Configuration_adv.h. For example, on the Re-ARM you could use: + * + * #define MAX7219_CLK_PIN 77 + * #define MAX7219_DIN_PIN 78 + * #define MAX7219_LOAD_PIN 79 + * + * send() is called automatically at startup, and then there are a number of + * support functions available to control the LEDs in the 8x8 grid. + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(MAX7219_DEBUG) + +#define MAX7219_ERRORS // Disable to save 406 bytes of Program Memory + +#include "Max7219_Debug_LEDs.h" + +#include "../module/planner.h" +#include "../module/stepper.h" +#include "../Marlin.h" +#include "../HAL/shared/Delay.h" + +#include +#include + +Max7219 max7219; + +uint8_t Max7219::led_line[MAX7219_LINES]; // = { 0 }; + +QueueHandle_t Max7219::queue; // = NULL + +#define LINE_REG(Q) (max7219_reg_digit0 + ((Q) & 0x7)) +#if _ROT == 0 || _ROT == 270 + #define _LED_BIT(Q) (7 - ((Q) & 0x7)) + #define _LED_UNIT(Q) ((Q) & ~0x7) +#else + #define _LED_BIT(Q) ((Q) & 0x7) + #define _LED_UNIT(Q) ((MAX7219_NUMBER_UNITS - 1 - ((Q) >> 3)) << 3) +#endif +#if _ROT < 180 + #define _LED_IND(P,Q) (_LED_UNIT(P) + (Q)) +#else + #define _LED_IND(P,Q) (_LED_UNIT(P) + (7 - ((Q) & 0x7))) +#endif +#if _ROT == 0 || _ROT == 180 + #define LED_IND(X,Y) _LED_IND(X,Y) + #define LED_BIT(X,Y) _LED_BIT(X) +#elif _ROT == 90 || _ROT == 270 + #define LED_IND(X,Y) _LED_IND(Y,X) + #define LED_BIT(X,Y) _LED_BIT(Y) +#endif +#define XOR_7219(X,Y) do{ led_line[LED_IND(X,Y)] ^= _BV(LED_BIT(X,Y)); }while(0) +#define SET_7219(X,Y) do{ led_line[LED_IND(X,Y)] |= _BV(LED_BIT(X,Y)); }while(0) +#define CLR_7219(X,Y) do{ led_line[LED_IND(X,Y)] &= ~_BV(LED_BIT(X,Y)); }while(0) +#define BIT_7219(X,Y) TEST(led_line[LED_IND(X,Y)], LED_BIT(X,Y)) + +#ifdef CPU_32_BIT + #define SIG_DELAY() DELAY_US(1) // Approximate a 1µs delay on 32-bit ARM + #undef CRITICAL_SECTION_START + #undef CRITICAL_SECTION_END + #define CRITICAL_SECTION_START NOOP + #define CRITICAL_SECTION_END NOOP +#else + #define SIG_DELAY() DELAY_NS(188) // Delay for 0.1875µs (16MHz AVR) or 0.15µs (20MHz AVR) +#endif + +void Max7219::error(const char * const func, const int32_t v1, const int32_t v2/*=-1*/) { + #if ENABLED(MAX7219_ERRORS) + SERIAL_ECHOPGM("??? Max7219::"); + serialprintPGM(func); + SERIAL_CHAR('('); + SERIAL_ECHO(v1); + if (v2 > 0) SERIAL_ECHOPAIR(", ", v2); + SERIAL_CHAR(')'); + SERIAL_EOL(); + #else + UNUSED(func); UNUSED(v1); UNUSED(v2); + #endif +} + +void Max7219::do_command(uint8_t msg, uint8_t col, uint8_t row, uint32_t val ) { + led_msg_t out_led_msg; + + out_led_msg.operation = msg; + out_led_msg.col = col; + out_led_msg.row = row; + out_led_msg.val = val; + + while (pdPASS != xQueueSendToBack(queue, &out_led_msg, 100)) { /* nada */ } +} + +TaskFunction_t Max7219::command_processor(void *ptr) { + + static led_msg_t in_led_msg; + + while (queue == NULL) vTaskDelay(50); // wait until the message queue is set up before processing + + for (;;) { + + while (pdPASS != xQueueReceive(queue, &in_led_msg, 2000)) { /* nada */ } + + switch (in_led_msg.operation) { + case LED_NOP: break; + case LED_INIT: max7219.reinit(); break; + case LED_LOAD_REGS: max7219.register_setup(); break; + case LED_ON: max7219.led_on(in_led_msg.col, in_led_msg.row); break; + case LED_OFF: max7219.led_off(in_led_msg.col, in_led_msg.row); break; + case LED_TOGGLE: max7219.led_toggle(in_led_msg.col, in_led_msg.row); break; + case LED_CLEAR_MATRIX: max7219.clear(); break; + case LED_CLEAR_ROW: max7219.clear_row(in_led_msg.row); break; + case LED_CLEAR_COLUMN: max7219.clear_column(in_led_msg.col); break; + case LED_SET_ROW: max7219.set_row(in_led_msg.row, (uint8_t)in_led_msg.val); break; + case LED_SET_2_ROWS: max7219.set_rows_16bits(in_led_msg.row, (uint16_t)in_led_msg.val); break; + case LED_SET_4_ROWS: max7219.set_rows_32bits(in_led_msg.row, in_led_msg.val); break; + case LED_SET_COLUMN: max7219.set_column(in_led_msg.col, (uint8_t)in_led_msg.val); break; + case LED_IDLE_TASK: max7219.idle_tasks(); break; + } + } +} + +void Max7219_PutByte(uint8_t data) { + #ifndef CPU_32_BIT + CRITICAL_SECTION_START; + #endif +} + +/** + * Flip the lowest n_bytes of the supplied bits: + * flipped(x, 1) flips the low 8 bits of x. + * flipped(x, 2) flips the low 16 bits of x. + * flipped(x, 3) flips the low 24 bits of x. + * flipped(x, 4) flips the low 32 bits of x. + */ +inline uint32_t flipped(const uint32_t bits, const uint8_t n_bytes) { + uint32_t mask = 1, outbits = 0; + for (uint8_t b = 0; b < n_bytes * 8; b++) { + outbits <<= 1; + if (bits & mask) outbits |= 1; + mask <<= 1; + } + return outbits; +} + +void Max7219::noop() { + CRITICAL_SECTION_START; + SIG_DELAY(); + WRITE(MAX7219_DIN_PIN, LOW); + for (uint8_t i = 16; i--;) { + SIG_DELAY(); + WRITE(MAX7219_CLK_PIN, LOW); + SIG_DELAY(); + SIG_DELAY(); + WRITE(MAX7219_CLK_PIN, HIGH); + SIG_DELAY(); + } + CRITICAL_SECTION_END; +} + +void Max7219::putbyte(uint8_t data) { + CRITICAL_SECTION_START; + for (uint8_t i = 8; i--;) { + SIG_DELAY(); + WRITE(MAX7219_CLK_PIN, LOW); // tick + SIG_DELAY(); + WRITE(MAX7219_DIN_PIN, (data & 0x80) ? HIGH : LOW); // send 1 or 0 based on data bit + SIG_DELAY(); + WRITE(MAX7219_CLK_PIN, HIGH); // tock + SIG_DELAY(); + data <<= 1; + } + CRITICAL_SECTION_END; +} + +void Max7219::pulse_load() { + SIG_DELAY(); + WRITE(MAX7219_LOAD_PIN, LOW); // tell the chip to load the data + SIG_DELAY(); + WRITE(MAX7219_LOAD_PIN, HIGH); + SIG_DELAY(); +} + +void Max7219::send(const uint8_t reg, const uint8_t data) { + SIG_DELAY(); + CRITICAL_SECTION_START; + SIG_DELAY(); + putbyte(reg); // specify register + SIG_DELAY(); + putbyte(data); // put data + CRITICAL_SECTION_END; +} + +// Send out a single native row of bits to all units +void Max7219::refresh_line(const uint8_t line) { + for (uint8_t u = MAX7219_NUMBER_UNITS; u--;) + send(LINE_REG(line), led_line[(u << 3) | (line & 0x7)]); + pulse_load(); +} + +// Send out a single native row of bits to just one unit +void Max7219::refresh_unit_line(const uint8_t line) { + for (uint8_t u = MAX7219_NUMBER_UNITS; u--;) + if (u == (line >> 3)) send(LINE_REG(line), led_line[line]); else noop(); + pulse_load(); +} + +void Max7219::set(const uint8_t line, const uint8_t bits) { + led_line[line] = bits; + refresh_line(line); +} + +#if ENABLED(MAX7219_NUMERIC) + + // Draw an integer with optional leading zeros and optional decimal point + void Max7219::print(const uint8_t start, int16_t value, uint8_t size, const bool leadzero=false, bool dec=false) { + constexpr uint8_t led_numeral[10] = { 0x7E, 0x60, 0x6D, 0x79, 0x63, 0x5B, 0x5F, 0x70, 0x7F, 0x7A }, + led_decimal = 0x80, led_minus = 0x01; + + bool blank = false, neg = value < 0; + if (neg) value *= -1; + while (size--) { + const bool minus = neg && blank; + if (minus) neg = false; + send( + max7219_reg_digit0 + start + size, + minus ? led_minus : blank ? 0x00 : led_numeral[value % 10] | (dec ? led_decimal : 0x00) + ); + pulse_load(); // tell the chips to load the clocked out data + value /= 10; + if (!value && !leadzero) blank = true; + dec = false; + } + } + + // Draw a float with a decimal point and optional digits + void Max7219::print(const uint8_t start, const float value, const uint8_t pre_size, const uint8_t post_size, const bool leadzero=false) { + if (pre_size) print(start, value, pre_size, leadzero, !!post_size); + if (post_size) { + const int16_t after = ABS(value) * (10 ^ post_size); + print(start + pre_size, after, post_size, true); + } + } + +#endif // MAX7219_NUMERIC + +// Modify a single LED bit and send the changed line +void Max7219::led_set(const uint8_t x, const uint8_t y, const bool on) { + if (x > MAX7219_X_LEDS - 1 || y > MAX7219_Y_LEDS - 1) return error(PSTR("led_set"), x, y); + if (BIT_7219(x, y) == on) return; + XOR_7219(x, y); + refresh_line(LED_IND(x, y)); +} + +void Max7219::led_on(const uint8_t x, const uint8_t y) { + if (x > MAX7219_X_LEDS - 1 || y > MAX7219_Y_LEDS - 1) return error(PSTR("led_on"), x, y); + led_set(x, y, true); +} + +void Max7219::led_off(const uint8_t x, const uint8_t y) { + if (x > MAX7219_X_LEDS - 1 || y > MAX7219_Y_LEDS - 1) return error(PSTR("led_off"), x, y); + led_set(x, y, false); +} + +void Max7219::led_toggle(const uint8_t x, const uint8_t y) { + if (x > MAX7219_X_LEDS - 1 || y > MAX7219_Y_LEDS - 1) return error(PSTR("led_toggle"), x, y); + led_set(x, y, !BIT_7219(x, y)); +} + +void Max7219::send_row(const uint8_t row) { + #if _ROT == 0 || _ROT == 180 + refresh_line(LED_IND(0, row)); + #else + UNUSED(row); + refresh(); + #endif +} + +void Max7219::send_column(const uint8_t col) { + #if _ROT == 90 || _ROT == 270 + refresh_line(LED_IND(col, 0)); + #else + UNUSED(col); + refresh(); + #endif +} + +void Max7219::clear() { + ZERO(led_line); + refresh(); +} + +void Max7219::fill() { + memset(led_line, 0xFF, sizeof(led_line)); + refresh(); +} + +void Max7219::clear_row(const uint8_t row) { + if (row >= MAX7219_Y_LEDS) return error(PSTR("clear_row"), row); + for (uint8_t x = 0; x < MAX7219_X_LEDS; x++) CLR_7219(x, row); + send_row(row); +} + +void Max7219::clear_column(const uint8_t col) { + if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col); + for (uint8_t y = 0; y < MAX7219_Y_LEDS; y++) CLR_7219(col, y); + send_column(col); +} + +/** + * Plot the low order bits of val to the specified row of the matrix. + * With 4 Max7219 units in the chain, it's possible to set 32 bits at once with + * one call to the function (if rotated 90° or 180°). + */ +void Max7219::set_row(const uint8_t row, const uint32_t val) { + if (row >= MAX7219_Y_LEDS) return error(PSTR("set_row"), row); + uint32_t mask = _BV32(MAX7219_X_LEDS - 1); + for (uint8_t x = 0; x < MAX7219_X_LEDS; x++) { + if (val & mask) SET_7219(x, row); else CLR_7219(x, row); + mask >>= 1; + } + send_row(row); +} + +/** + * Plot the low order bits of val to the specified column of the matrix. + * With 4 Max7219 units in the chain, it's possible to set 32 bits at once with + * one call to the function (if rotated 90° or 180°). + */ +void Max7219::set_column(const uint8_t col, const uint32_t val) { + if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col); + uint32_t mask = _BV32(MAX7219_Y_LEDS - 1); + for (uint8_t y = 0; y < MAX7219_Y_LEDS; y++) { + if (val & mask) SET_7219(col, y); else CLR_7219(col, y); + mask >>= 1; + } + send_column(col); +} + +void Max7219::set_rows_16bits(const uint8_t y, uint32_t val) { + #if MAX7219_X_LEDS == 8 + if (y > MAX7219_Y_LEDS - 2) return error(PSTR("set_rows_16bits"), y, val); + set_row(y + 1, val); val >>= 8; + set_row(y + 0, val); + #else // at least 16 bits on each row + if (y > MAX7219_Y_LEDS - 1) return error(PSTR("set_rows_16bits"), y, val); + set_row(y, val); + #endif +} + +void Max7219::set_rows_32bits(const uint8_t y, uint32_t val) { + #if MAX7219_X_LEDS == 8 + if (y > MAX7219_Y_LEDS - 4) return error(PSTR("set_rows_32bits"), y, val); + set_row(y + 3, val); val >>= 8; + set_row(y + 2, val); val >>= 8; + set_row(y + 1, val); val >>= 8; + set_row(y + 0, val); + #elif MAX7219_X_LEDS == 16 + if (y > MAX7219_Y_LEDS - 2) return error(PSTR("set_rows_32bits"), y, val); + set_row(y + 1, val); val >>= 16; + set_row(y + 0, val); + #else // at least 24 bits on each row. In the 3 matrix case, just display the low 24 bits + if (y > MAX7219_Y_LEDS - 1) return error(PSTR("set_rows_32bits"), y, val); + set_row(y, val); + #endif +} + +void Max7219::set_columns_16bits(const uint8_t x, uint32_t val) { + #if MAX7219_Y_LEDS == 8 + if (x > MAX7219_X_LEDS - 2) return error(PSTR("set_columns_16bits"), x, val); + set_column(x + 0, val); val >>= 8; + set_column(x + 1, val); + #else // at least 16 bits in each column + if (x > MAX7219_X_LEDS - 1) return error(PSTR("set_columns_16bits"), x, val); + set_column(x, val); + #endif +} + +void Max7219::set_columns_32bits(const uint8_t x, uint32_t val) { + #if MAX7219_Y_LEDS == 8 + if (x > MAX7219_X_LEDS - 4) return error(PSTR("set_rows_32bits"), x, val); + set_column(x + 3, val); val >>= 8; + set_column(x + 2, val); val >>= 8; + set_column(x + 1, val); val >>= 8; + set_column(x + 0, val); + #elif MAX7219_Y_LEDS == 16 + if (x > MAX7219_X_LEDS - 2) return error(PSTR("set_rows_32bits"), x, val); + set_column(x + 1, val); val >>= 16; + set_column(x + 0, val); + #else // at least 24 bits on each row. In the 3 matrix case, just display the low 24 bits + if (x > MAX7219_X_LEDS - 1) return error(PSTR("set_rows_32bits"), x, val); + set_column(x, val); + #endif +} + +// Initialize the Max7219 +void Max7219::register_setup() { + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) + send(max7219_reg_scanLimit, 0x07); + pulse_load(); // tell the chips to load the clocked out data + + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) + send(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits) + pulse_load(); // tell the chips to load the clocked out data + + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) + send(max7219_reg_shutdown, 0x01); // not in shutdown mode + pulse_load(); // tell the chips to load the clocked out data + + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) + send(max7219_reg_displayTest, 0x00); // no display test + pulse_load(); // tell the chips to load the clocked out data + + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; i++) + send(max7219_reg_intensity, 0x01 & 0x0F); // the first 0x0F is the value you can set + // range: 0x00 to 0x0F + pulse_load(); // tell the chips to load the clocked out data +} + +#ifdef MAX7219_INIT_TEST +#if MAX7219_INIT_TEST == 2 + + void Max7219::spiral(const bool on, const uint16_t del) { + constexpr int8_t way[] = { 1, 0, 0, 1, -1, 0, 0, -1 }; + int8_t px = 0, py = 0, dir = 0; + for (uint8_t i = MAX7219_X_LEDS * MAX7219_Y_LEDS; i--;) { + led_set(px, py, on); + delay(del); + const int8_t x = px + way[dir], y = py + way[dir + 1]; + if (!WITHIN(x, 0, MAX7219_X_LEDS-1) || !WITHIN(y, 0, MAX7219_Y_LEDS-1) || BIT_7219(x, y) == on) dir = (dir + 2) & 0x7; + px += way[dir]; py += way[dir + 1]; + } + } + +#else + + void Max7219::sweep(const int8_t dir, const uint16_t ms, const bool on) { + uint8_t x = dir > 0 ? 0 : MAX7219_X_LEDS-1; + for (uint8_t i = MAX7219_X_LEDS; i--; x += dir) { + set_column(x, on ? 0xFFFFFFFF : 0x00000000); + delay(ms); + } + } + +#endif +#endif // MAX7219_INIT_TEST + +void Max7219::reinit() { + SET_OUTPUT(MAX7219_DIN_PIN); + SET_OUTPUT(MAX7219_CLK_PIN); + OUT_WRITE(MAX7219_LOAD_PIN, HIGH); + delay(1); + + register_setup(); + + for (uint8_t i = 0; i <= 7; i++) { // Empty registers to turn all LEDs off + led_line[i] = 0x00; + send(max7219_reg_digit0 + i, 0); + pulse_load(); // tell the chips to load the clocked out data + } + + #ifdef MAX7219_INIT_TEST + #if MAX7219_INIT_TEST == 2 + spiral(true, 8); + delay(150); + spiral(false, 8); + #else + // Do an aesthetically-pleasing pattern to fully test the Max7219 module and LEDs. + // Light up and turn off columns, both forward and backward. + sweep(1, 20, true); + sweep(1, 20, false); + delay(150); + sweep(-1, 20, true); + sweep(-1, 20, false); + #endif + #endif +} + +void Max7219::init() { + reinit(); + + queue = xQueueCreate(3 /* # of queue items */, sizeof(led_msg_t)); + if (!queue) { + max7219.set_row(0, 0xE5); + for (;;) { /* nada */ } + } + + // Create the Max7219 debug task. It is very low priority in an attempt to not affect the + // normal timing of Marlin. But if too many messages are sent too quickly to the task, + // the command queue will fill up and the sender will block until a message has been drained + // to make room for the next message. + xTaskCreate((TaskFunction_t)max7219.command_processor, "Max7219::LEDs", 200 /* Stack size */, NULL, 2 /* priority */, NULL); +} + +/** + * This code demonstrates some simple debugging using a single 8x8 LED Matrix. If your feature could + * benefit from matrix display, add its code here. Very little processing is required, so the 7219 is + * ideal for debugging when realtime feedback is important but serial output can't be used. + */ + +// Apply changes to update a marker +void Max7219::mark16(const uint8_t y, const uint8_t v1, const uint8_t v2) { + #if MAX7219_X_LEDS == 8 + #if MAX7219_Y_LEDS == 8 + led_off(v1 & 0x7, y + (v1 >= 8)); + led_on(v2 & 0x7, y + (v2 >= 8)); + #else + led_off(y, v1 & 0xF); // At least 16 LEDs down. Use a single column. + led_on(y, v2 & 0xF); + #endif + #else + led_off(v1 & 0xF, y); // At least 16 LEDs across. Use a single row. + led_on(v2 & 0xF, y); + #endif +} + +// Apply changes to update a tail-to-head range +void Max7219::range16(const uint8_t y, const uint8_t ot, const uint8_t nt, const uint8_t oh, const uint8_t nh) { + #if MAX7219_X_LEDS == 8 + #if MAX7219_Y_LEDS == 8 + if (ot != nt) for (uint8_t n = ot & 0xF; n != (nt & 0xF) && n != (nh & 0xF); n = (n + 1) & 0xF) + led_off(n & 0x7, y + (n >= 8)); + if (oh != nh) for (uint8_t n = (oh + 1) & 0xF; n != ((nh + 1) & 0xF); n = (n + 1) & 0xF) + led_on(n & 0x7, y + (n >= 8)); + #else // The Max7219 Y-Axis has at least 16 LED's. So use a single column + if (ot != nt) for (uint8_t n = ot & 0xF; n != (nt & 0xF) && n != (nh & 0xF); n = (n + 1) & 0xF) + led_off(y, n & 0xF); + if (oh != nh) for (uint8_t n = (oh + 1) & 0xF; n != ((nh + 1) & 0xF); n = (n + 1) & 0xF) + led_on(y, n & 0xF); + #endif + #else // LED matrix has at least 16 LED's on the X-Axis. Use single line of LED's + if (ot != nt) for (uint8_t n = ot & 0xF; n != (nt & 0xF) && n != (nh & 0xF); n = (n + 1) & 0xF) + led_off(n & 0xF, y); + if (oh != nh) for (uint8_t n = (oh + 1) & 0xF; n != ((nh + 1) & 0xF); n = (n + 1) & 0xF) + led_on(n & 0xF, y); + #endif +} + +// Apply changes to update a quantity +void Max7219::quantity16(const uint8_t y, const uint8_t ov, const uint8_t nv) { + for (uint8_t i = MIN(nv, ov); i < MAX(nv, ov); i++) + #if MAX7219_X_LEDS == 8 + #if MAX7219_Y_LEDS == 8 + led_set(i >> 1, y + (i & 1), nv >= ov); // single 8x8 LED matrix. Use two lines to get 16 LED's + #else + led_set(y, i, nv >= ov); // The Max7219 Y-Axis has at least 16 LED's. So use a single column + #endif + #else + led_set(i, y, nv >= ov); // LED matrix has at least 16 LED's on the X-Axis. Use single line of LED's + #endif +} + +void Max7219::idle_tasks() { + + return; // Temporary!!! + + #define MAX7219_USE_HEAD (defined(MAX7219_DEBUG_PLANNER_HEAD) || defined(MAX7219_DEBUG_PLANNER_QUEUE)) + #define MAX7219_USE_TAIL (defined(MAX7219_DEBUG_PLANNER_TAIL) || defined(MAX7219_DEBUG_PLANNER_QUEUE)) + #if MAX7219_USE_HEAD || MAX7219_USE_TAIL + CRITICAL_SECTION_START; + #if MAX7219_USE_HEAD + const uint8_t head = planner.block_buffer_head; + #endif + #if MAX7219_USE_TAIL + const uint8_t tail = planner.block_buffer_tail; + #endif + CRITICAL_SECTION_END; + #endif + + #if ENABLED(MAX7219_DEBUG_PRINTER_ALIVE) + static uint8_t refresh_cnt; // = 0 + constexpr uint16_t refresh_limit = 5; + static millis_t next_blink = 0; + const millis_t ms = millis(); + const bool do_blink = ELAPSED(ms, next_blink); + #else + static uint16_t refresh_cnt; // = 0 + constexpr bool do_blink = true; + constexpr uint16_t refresh_limit = 50000; + #endif + + // Some Max7219 units are vulnerable to electrical noise, especially + // with long wires next to high current wires. If the display becomes + // corrupted, this will fix it within a couple seconds. + if (do_blink && ++refresh_cnt >= refresh_limit) { + refresh_cnt = 0; + register_setup(); + } + + #if ENABLED(MAX7219_DEBUG_PRINTER_ALIVE) + if (do_blink) { + led_toggle(MAX7219_X_LEDS - 1, MAX7219_Y_LEDS - 1); + next_blink = ms + 1000; + } + #endif + + #if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL + + static int16_t last_head_cnt = 0xF, last_tail_cnt = 0xF; + + if (last_head_cnt != head || last_tail_cnt != tail) { + range16(MAX7219_DEBUG_PLANNER_HEAD, last_tail_cnt, tail, last_head_cnt, head); + last_head_cnt = head; + last_tail_cnt = tail; + } + + #else + + #ifdef MAX7219_DEBUG_PLANNER_HEAD + static int16_t last_head_cnt = 0x1; + if (last_head_cnt != head) { + mark16(MAX7219_DEBUG_PLANNER_HEAD, last_head_cnt, head); + last_head_cnt = head; + } + #endif + + #ifdef MAX7219_DEBUG_PLANNER_TAIL + static int16_t last_tail_cnt = 0x1; + if (last_tail_cnt != tail) { + mark16(MAX7219_DEBUG_PLANNER_TAIL, last_tail_cnt, tail); + last_tail_cnt = tail; + } + #endif + + #endif + + #ifdef MAX7219_DEBUG_PLANNER_QUEUE + static int16_t last_depth = 0; + const int16_t current_depth = (head - tail + BLOCK_BUFFER_SIZE) & (BLOCK_BUFFER_SIZE - 1) & 0xF; + if (current_depth != last_depth) { + quantity16(MAX7219_DEBUG_PLANNER_QUEUE, last_depth, current_depth); + last_depth = current_depth; + } + #endif +} + +#endif // MAX7219_DEBUG diff --git a/Marlin/src/feature/Max7219_Debug_LEDs.h b/Marlin/src/feature/Max7219_Debug_LEDs.h new file mode 100644 index 0000000000..1f0b497f0e --- /dev/null +++ b/Marlin/src/feature/Max7219_Debug_LEDs.h @@ -0,0 +1,191 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * This module is off by default, but can be enabled to facilitate the display of + * extra debug information during code development. + * + * Just connect up 5V and GND to give it power, then connect up the pins assigned + * in Configuration_adv.h. For example, on the Re-ARM you could use: + * + * #define MAX7219_CLK_PIN 77 + * #define MAX7219_DIN_PIN 78 + * #define MAX7219_LOAD_PIN 79 + * + * max7219.init() is called automatically at startup, and then there are a number of + * support functions available to control the LEDs in the 8x8 grid. + * + * If you are using the Max7219 matrix for firmware debug purposes in time sensitive + * areas of the code, please be aware that the orientation (rotation) of the display can + * affect the speed. The Max7219 can update a single column fairly fast. It is much + * faster to do a max7219.set_column() with a rotation of 90 or 270 degrees than to do + * a max7219.set_row(). The opposite is true for rotations of 0 or 180 degrees. + */ +#pragma once + +#include + +#ifndef MAX7219_ROTATE + #define MAX7219_ROTATE 0 +#endif +#define _ROT ((MAX7219_ROTATE + 360) % 360) + +#ifndef MAX7219_NUMBER_UNITS + #define MAX7219_NUMBER_UNITS 1 +#endif +#define MAX7219_LINES (8 * (MAX7219_NUMBER_UNITS)) + +#if _ROT == 0 || _ROT == 180 + #define MAX7219_Y_LEDS 8 + #define MAX7219_X_LEDS MAX7219_LINES +#elif _ROT == 90 || _ROT == 270 + #define MAX7219_X_LEDS 8 + #define MAX7219_Y_LEDS MAX7219_LINES +#else + #error "MAX7219_ROTATE must be a multiple of +/- 90°." +#endif + +// +// MAX7219 registers +// +#define max7219_reg_noop 0x00 +#define max7219_reg_digit0 0x01 +#define max7219_reg_digit1 0x02 +#define max7219_reg_digit2 0x03 +#define max7219_reg_digit3 0x04 +#define max7219_reg_digit4 0x05 +#define max7219_reg_digit5 0x06 +#define max7219_reg_digit6 0x07 +#define max7219_reg_digit7 0x08 + +#define max7219_reg_decodeMode 0x09 +#define max7219_reg_intensity 0x0A +#define max7219_reg_scanLimit 0x0B +#define max7219_reg_shutdown 0x0C +#define max7219_reg_displayTest 0x0F + +class Max7219 { +public: + + typedef struct { + uint8_t operation; + uint8_t row, col; + uint32_t val; + } led_msg_t; + + static led_msg_t led_msg; + QueueHandle_t queue; + + static uint8_t led_line[MAX7219_LINES]; + + Max7219() { } + + static void init(); + static void reinit(); + static void register_setup(); + static void putbyte(uint8_t data); + static void pulse_load(); + + // Set a single register (e.g., a whole native row) + static void send(const uint8_t reg, const uint8_t data); + + // Refresh all units + inline static void refresh() { for (uint8_t i = 0; i < 8; i++) refresh_line(i); } + + // Update a single native line on all units + static void refresh_line(const uint8_t line); + + // Update a single native line on just one unit + static void refresh_unit_line(const uint8_t line); + + // Set a single LED by XY coordinate + static void led_set(const uint8_t x, const uint8_t y, const bool on); + static void led_on(const uint8_t x, const uint8_t y); + static void led_off(const uint8_t x, const uint8_t y); + static void led_toggle(const uint8_t x, const uint8_t y); + + // Set all LEDs in a single column + static void set_column(const uint8_t col, const uint32_t val); + static void clear_column(const uint8_t col); + + // Set all LEDs in a single row + static void set_row(const uint8_t row, const uint32_t val); + static void clear_row(const uint8_t row); + + // 16 and 32 bit versions of Row and Column functions + // Multiple rows and columns will be used to display the value if + // the array of matrix LED's is too narrow to accomplish the goal + static void set_rows_16bits(const uint8_t y, uint32_t val); + static void set_rows_32bits(const uint8_t y, uint32_t val); + static void set_columns_16bits(const uint8_t x, uint32_t val); + static void set_columns_32bits(const uint8_t x, uint32_t val); + + // Quickly clear the whole matrix + static void clear(); + + // Quickly fill the whole matrix + static void fill(); + + // Apply custom code to update the matrix + static void idle_tasks(); + + // RTOS hooks + static void do_command(uint8_t msg, uint8_t row, uint8_t col, uint32_t val); + TaskFunction_t command_processor(void*); + +private: + static void error(const char * const func, const int32_t v1, const int32_t v2=-1); + static void noop(); + static void set(const uint8_t line, const uint8_t bits); + static void send_row(const uint8_t row); + static void send_column(const uint8_t col); + static void mark16(const uint8_t y, const uint8_t v1, const uint8_t v2); + static void range16(const uint8_t y, const uint8_t ot, const uint8_t nt, const uint8_t oh, const uint8_t nh); + static void quantity16(const uint8_t y, const uint8_t ov, const uint8_t nv); + + #ifdef MAX7219_INIT_TEST + #if MAX7219_INIT_TEST == 2 + static void spiral(const bool on, const uint16_t del); + #else + static void sweep(const int8_t dir, const uint16_t ms, const bool on); + #endif + #endif +}; + +extern Max7219 max7219; + +#define LED_NOP 0x00 +#define LED_LOAD_REGS 0x01 +#define LED_REINIT 0x02 +#define LED_ON 0x03 +#define LED_OFF 0x04 +#define LED_TOGGLE 0x05 +#define LED_CLEAR_MATRIX 0x06 +#define LED_CLEAR_ROW 0x07 +#define LED_CLEAR_COLUMN 0x08 +#define LED_SET_ROW 0x09 +#define LED_SET_2_ROWS 0x0a +#define LED_SET_4_ROWS 0x0b +#define LED_SET_COLUMN 0x0c +#define LED_IDLE_TASK 0x0d + +#endif // __MAX7219_DEBUG_LEDS_H__ diff --git a/Marlin/src/feature/babystep.cpp b/Marlin/src/feature/babystep.cpp deleted file mode 100644 index b076881461..0000000000 --- a/Marlin/src/feature/babystep.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfig.h" - -#if ENABLED(BABYSTEPPING) - -#include "babystep.h" -#include "../MarlinCore.h" -#include "../module/motion.h" // for axes_should_home() -#include "../module/planner.h" // for axis_steps_per_mm[] -#include "../module/stepper.h" - -#if ENABLED(BABYSTEP_ALWAYS_AVAILABLE) - #include "../gcode/gcode.h" -#endif - -Babystep babystep; - -volatile int16_t Babystep::steps[BS_AXIS_IND(Z_AXIS) + 1]; -#if ENABLED(BABYSTEP_DISPLAY_TOTAL) - int16_t Babystep::axis_total[BS_TOTAL_IND(Z_AXIS) + 1]; -#endif -int16_t Babystep::accum; - -void Babystep::step_axis(const AxisEnum axis) { - const int16_t curTodo = steps[BS_AXIS_IND(axis)]; // get rid of volatile for performance - if (curTodo) { - stepper.do_babystep((AxisEnum)axis, curTodo > 0); - if (curTodo > 0) steps[BS_AXIS_IND(axis)]--; else steps[BS_AXIS_IND(axis)]++; - } -} - -void Babystep::add_mm(const AxisEnum axis, const float &mm) { - add_steps(axis, mm * planner.settings.axis_steps_per_mm[axis]); -} - -void Babystep::add_steps(const AxisEnum axis, const int16_t distance) { - if (DISABLED(BABYSTEP_WITHOUT_HOMING) && axes_should_home(_BV(axis))) return; - - accum += distance; // Count up babysteps for the UI - steps[BS_AXIS_IND(axis)] += distance; - TERN_(BABYSTEP_DISPLAY_TOTAL, axis_total[BS_TOTAL_IND(axis)] += distance); - TERN_(BABYSTEP_ALWAYS_AVAILABLE, gcode.reset_stepper_timeout()); - TERN_(INTEGRATED_BABYSTEPPING, if (has_steps()) stepper.initiateBabystepping()); -} - -#endif // BABYSTEPPING diff --git a/Marlin/src/feature/babystep.h b/Marlin/src/feature/babystep.h deleted file mode 100644 index f85e5909ca..0000000000 --- a/Marlin/src/feature/babystep.h +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(INTEGRATED_BABYSTEPPING) - #define BABYSTEPS_PER_SEC 1000UL - #define BABYSTEP_TICKS ((STEPPER_TIMER_RATE) / (BABYSTEPS_PER_SEC)) -#else - #define BABYSTEPS_PER_SEC 976UL - #define BABYSTEP_TICKS ((TEMP_TIMER_RATE) / (BABYSTEPS_PER_SEC)) -#endif - -#if IS_CORE || EITHER(BABYSTEP_XY, I2C_POSITION_ENCODERS) - #define BS_AXIS_IND(A) A - #define BS_AXIS(I) AxisEnum(I) -#else - #define BS_AXIS_IND(A) 0 - #define BS_AXIS(I) Z_AXIS -#endif - -#if ENABLED(BABYSTEP_DISPLAY_TOTAL) - #if ENABLED(BABYSTEP_XY) - #define BS_TOTAL_IND(A) A - #else - #define BS_TOTAL_IND(A) 0 - #endif -#endif - -class Babystep { -public: - static volatile int16_t steps[BS_AXIS_IND(Z_AXIS) + 1]; - static int16_t accum; // Total babysteps in current edit - - #if ENABLED(BABYSTEP_DISPLAY_TOTAL) - static int16_t axis_total[BS_TOTAL_IND(Z_AXIS) + 1]; // Total babysteps since G28 - static inline void reset_total(const AxisEnum axis) { - if (TERN1(BABYSTEP_XY, axis == Z_AXIS)) - axis_total[BS_TOTAL_IND(axis)] = 0; - } - #endif - - static void add_steps(const AxisEnum axis, const int16_t distance); - static void add_mm(const AxisEnum axis, const float &mm); - - static inline bool has_steps() { - return steps[BS_AXIS_IND(X_AXIS)] || steps[BS_AXIS_IND(Y_AXIS)] || steps[BS_AXIS_IND(Z_AXIS)]; - } - - // - // Called by the Temperature or Stepper ISR to - // apply accumulated babysteps to the axes. - // - static inline void task() { - LOOP_LE_N(i, BS_AXIS_IND(Z_AXIS)) step_axis(BS_AXIS(i)); - } - -private: - static void step_axis(const AxisEnum axis); -}; - -extern Babystep babystep; diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp deleted file mode 100644 index 867e9cdd21..0000000000 --- a/Marlin/src/feature/backlash.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(BACKLASH_COMPENSATION) - -#include "backlash.h" - -#include "../module/motion.h" -#include "../module/planner.h" - -#ifdef BACKLASH_DISTANCE_MM - #if ENABLED(BACKLASH_GCODE) - xyz_float_t Backlash::distance_mm = BACKLASH_DISTANCE_MM; - #else - const xyz_float_t Backlash::distance_mm = BACKLASH_DISTANCE_MM; - #endif -#endif - -#if ENABLED(BACKLASH_GCODE) - uint8_t Backlash::correction = (BACKLASH_CORRECTION) * 0xFF; - #ifdef BACKLASH_SMOOTHING_MM - float Backlash::smoothing_mm = BACKLASH_SMOOTHING_MM; - #endif -#endif - -#if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) - xyz_float_t Backlash::measured_mm{0}; - xyz_uint8_t Backlash::measured_count{0}; -#endif - -Backlash backlash; - -/** - * To minimize seams in the printed part, backlash correction only adds - * steps to the current segment (instead of creating a new segment, which - * causes discontinuities and print artifacts). - * - * With a non-zero BACKLASH_SMOOTHING_MM value the backlash correction is - * spread over multiple segments, smoothing out artifacts even more. - */ - -void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const uint8_t dm, block_t * const block) { - static uint8_t last_direction_bits; - uint8_t changed_dir = last_direction_bits ^ dm; - // Ignore direction change if no steps are taken in that direction - if (da == 0) CBI(changed_dir, X_AXIS); - if (db == 0) CBI(changed_dir, Y_AXIS); - if (dc == 0) CBI(changed_dir, Z_AXIS); - last_direction_bits ^= changed_dir; - - if (correction == 0) return; - - #ifdef BACKLASH_SMOOTHING_MM - // The segment proportion is a value greater than 0.0 indicating how much residual_error - // is corrected for in this segment. The contribution is based on segment length and the - // smoothing distance. Since the computation of this proportion involves a floating point - // division, defer computation until needed. - float segment_proportion = 0; - - // Residual error carried forward across multiple segments, so correction can be applied - // to segments where there is no direction change. - static xyz_long_t residual_error{0}; - #else - // No direction change, no correction. - if (!changed_dir) return; - // No leftover residual error from segment to segment - xyz_long_t residual_error{0}; - #endif - - const float f_corr = float(correction) / 255.0f; - - LOOP_XYZ(axis) { - if (distance_mm[axis]) { - const bool reversing = TEST(dm,axis); - - // When an axis changes direction, add axis backlash to the residual error - if (TEST(changed_dir, axis)) - residual_error[axis] += (reversing ? -f_corr : f_corr) * distance_mm[axis] * planner.settings.axis_steps_per_mm[axis]; - - // Decide how much of the residual error to correct in this segment - int32_t error_correction = residual_error[axis]; - #ifdef BACKLASH_SMOOTHING_MM - if (error_correction && smoothing_mm != 0) { - // Take up a portion of the residual_error in this segment, but only when - // the current segment travels in the same direction as the correction - if (reversing == (error_correction < 0)) { - if (segment_proportion == 0) - segment_proportion = _MIN(1.0f, block->millimeters / smoothing_mm); - error_correction = CEIL(segment_proportion * error_correction); - } - else - error_correction = 0; // Don't take up any backlash in this segment, as it would subtract steps - } - #endif - // Making a correction reduces the residual error and adds block steps - if (error_correction) { - block->steps[axis] += ABS(error_correction); - residual_error[axis] -= error_correction; - } - } - } -} - -#if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) - #if HAS_CUSTOM_PROBE_PIN - #define TEST_PROBE_PIN (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) - #else - #define TEST_PROBE_PIN (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) - #endif - - // Measure Z backlash by raising nozzle in increments until probe deactivates - void Backlash::measure_with_probe() { - if (measured_count.z == 255) return; - - const float start_height = current_position.z; - while (current_position.z < (start_height + BACKLASH_MEASUREMENT_LIMIT) && TEST_PROBE_PIN) - do_blocking_move_to_z(current_position.z + BACKLASH_MEASUREMENT_RESOLUTION, MMM_TO_MMS(BACKLASH_MEASUREMENT_FEEDRATE)); - - // The backlash from all probe points is averaged, so count the number of measurements - measured_mm.z += current_position.z - start_height; - measured_count.z++; - } -#endif - -#endif // BACKLASH_COMPENSATION diff --git a/Marlin/src/feature/backlash.h b/Marlin/src/feature/backlash.h deleted file mode 100644 index 8d00570f99..0000000000 --- a/Marlin/src/feature/backlash.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfigPre.h" -#include "../module/planner.h" - -constexpr uint8_t all_on = 0xFF, all_off = 0x00; - -class Backlash { -public: - #if ENABLED(BACKLASH_GCODE) - static xyz_float_t distance_mm; - static uint8_t correction; - #ifdef BACKLASH_SMOOTHING_MM - static float smoothing_mm; - #endif - - static inline void set_correction(const float &v) { correction = _MAX(0, _MIN(1.0, v)) * all_on; } - static inline float get_correction() { return float(ui8_to_percent(correction)) / 100.0f; } - #else - static constexpr uint8_t correction = (BACKLASH_CORRECTION) * 0xFF; - static const xyz_float_t distance_mm; - #ifdef BACKLASH_SMOOTHING_MM - static constexpr float smoothing_mm = BACKLASH_SMOOTHING_MM; - #endif - #endif - - #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) - private: - static xyz_float_t measured_mm; - static xyz_uint8_t measured_count; - public: - static void measure_with_probe(); - #endif - - static inline float get_measurement(const AxisEnum a) { - // Return the measurement averaged over all readings - return TERN(MEASURE_BACKLASH_WHEN_PROBING - , measured_count[a] > 0 ? measured_mm[a] / measured_count[a] : 0 - , 0 - ); - TERN(MEASURE_BACKLASH_WHEN_PROBING,,UNUSED(a)); - } - - static inline bool has_measurement(const AxisEnum a) { - return TERN0(MEASURE_BACKLASH_WHEN_PROBING, measured_count[a] > 0); - TERN(MEASURE_BACKLASH_WHEN_PROBING,,UNUSED(a)); - } - - static inline bool has_any_measurement() { - return has_measurement(X_AXIS) || has_measurement(Y_AXIS) || has_measurement(Z_AXIS); - } - - void add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const uint8_t dm, block_t * const block); -}; - -extern Backlash backlash; diff --git a/Marlin/src/feature/baricuda.cpp b/Marlin/src/feature/baricuda.cpp index 596891707e..c74e4b60bd 100644 --- a/Marlin/src/feature/baricuda.cpp +++ b/Marlin/src/feature/baricuda.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,11 +16,11 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#include "../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfig.h" #if ENABLED(BARICUDA) diff --git a/Marlin/src/feature/baricuda.h b/Marlin/src/feature/baricuda.h index f28d07d642..7ed23925b8 100644 --- a/Marlin/src/feature/baricuda.h +++ b/Marlin/src/feature/baricuda.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,14 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __BARICUDA_H__ +#define __BARICUDA_H__ extern uint8_t baricuda_valve_pressure, baricuda_e_to_p_pressure; + +#endif // __BARICUDA_H__ diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index 39d8815fad..044adc5d36 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,37 +24,38 @@ #if ENABLED(AUTO_BED_LEVELING_BILINEAR) -#include "../bedlevel.h" +#include "abl.h" #include "../../../module/motion.h" -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../../../core/debug_out.h" - -#if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" -#endif - -xy_pos_t bilinear_grid_spacing, bilinear_start; -xy_float_t bilinear_grid_factor; -bed_mesh_t z_values; +int bilinear_grid_spacing[2], bilinear_start[2]; +float bilinear_grid_factor[2], + z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; /** * Extrapolate a single point from its neighbors */ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { - if (!isnan(z_values[x][y])) return; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPGM("Extrapolate ["); - if (x < 10) DEBUG_CHAR(' '); - DEBUG_ECHO((int)x); - DEBUG_CHAR(xdir ? (xdir > 0 ? '+' : '-') : ' '); - DEBUG_CHAR(' '); - if (y < 10) DEBUG_CHAR(' '); - DEBUG_ECHO((int)y); - DEBUG_CHAR(ydir ? (ydir > 0 ? '+' : '-') : ' '); - DEBUG_ECHOLNPGM("]"); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPGM("Extrapolate ["); + if (x < 10) SERIAL_CHAR(' '); + SERIAL_ECHO((int)x); + SERIAL_CHAR(xdir ? (xdir > 0 ? '+' : '-') : ' '); + SERIAL_CHAR(' '); + if (y < 10) SERIAL_CHAR(' '); + SERIAL_ECHO((int)y); + SERIAL_CHAR(ydir ? (ydir > 0 ? '+' : '-') : ' '); + SERIAL_CHAR(']'); + } + #endif + if (!isnan(z_values[x][y])) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM(" (done)"); + #endif + return; // Don't overwrite good values. } + SERIAL_EOL(); // Get X neighbors, Y neighbors, and XY neighbors const uint8_t x1 = x + xdir, y1 = y + ydir, x2 = x1 + xdir, y2 = y1 + ydir; @@ -74,7 +75,6 @@ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t // Take the average instead of the median z_values[x][y] = (a + b + c) / 3.0; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); // Median is robust (ignores outliers). // z_values[x][y] = (a < b) ? ((b < c) ? b : (c < a) ? a : c) @@ -113,8 +113,8 @@ void extrapolate_unprobed_bed_level() { ylen = ctry1; #endif - LOOP_LE_N(xo, xlen) - LOOP_LE_N(yo, ylen) { + for (uint8_t xo = 0; xo <= xlen; xo++) + for (uint8_t yo = 0; yo <= ylen; yo++) { uint8_t x2 = ctrx2 + xo, y2 = ctry2 + yo; #ifndef HALF_IN_X const uint8_t x1 = ctrx1 - xo; @@ -148,8 +148,8 @@ void print_bilinear_leveling_grid() { #define ABL_TEMP_POINTS_X (GRID_MAX_POINTS_X + 2) #define ABL_TEMP_POINTS_Y (GRID_MAX_POINTS_Y + 2) float z_values_virt[ABL_GRID_POINTS_VIRT_X][ABL_GRID_POINTS_VIRT_Y]; - xy_pos_t bilinear_grid_spacing_virt; - xy_float_t bilinear_grid_factor_virt; + int bilinear_grid_spacing_virt[2] = { 0 }; + float bilinear_grid_factor_virt[2] = { 0 }; void print_bilinear_leveling_grid_virt() { SERIAL_ECHOLNPGM("Subdivided with CATMULL ROM Leveling Grid:"); @@ -202,13 +202,13 @@ void print_bilinear_leveling_grid() { + p[i] * (2 - 5 * sq(t) + 3 * t * sq(t)) + p[i+1] * t * (1 + 4 * t - 3 * sq(t)) - p[i+2] * sq(t) * (1 - t) - ) * 0.5f; + ) * 0.5; } static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) { float row[4], column[4]; - LOOP_L_N(i, 4) { - LOOP_L_N(j, 4) { + for (uint8_t i = 0; i < 4; i++) { + for (uint8_t j = 0; j < 4; j++) { column[j] = bed_level_virt_coord(i + x - 1, j + y - 1); } row[i] = bed_level_virt_cmr(column, 1, ty); @@ -217,13 +217,15 @@ void print_bilinear_leveling_grid() { } void bed_level_virt_interpolate() { - bilinear_grid_spacing_virt = bilinear_grid_spacing / (BILINEAR_SUBDIVISIONS); - bilinear_grid_factor_virt = bilinear_grid_spacing_virt.reciprocal(); - LOOP_L_N(y, GRID_MAX_POINTS_Y) - LOOP_L_N(x, GRID_MAX_POINTS_X) - LOOP_L_N(ty, BILINEAR_SUBDIVISIONS) - LOOP_L_N(tx, BILINEAR_SUBDIVISIONS) { - if ((ty && y == (GRID_MAX_POINTS_Y) - 1) || (tx && x == (GRID_MAX_POINTS_X) - 1)) + bilinear_grid_spacing_virt[X_AXIS] = bilinear_grid_spacing[X_AXIS] / (BILINEAR_SUBDIVISIONS); + bilinear_grid_spacing_virt[Y_AXIS] = bilinear_grid_spacing[Y_AXIS] / (BILINEAR_SUBDIVISIONS); + bilinear_grid_factor_virt[X_AXIS] = RECIPROCAL(bilinear_grid_spacing_virt[X_AXIS]); + bilinear_grid_factor_virt[Y_AXIS] = RECIPROCAL(bilinear_grid_spacing_virt[Y_AXIS]); + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t ty = 0; ty < BILINEAR_SUBDIVISIONS; ty++) + for (uint8_t tx = 0; tx < BILINEAR_SUBDIVISIONS; tx++) { + if ((ty && y == GRID_MAX_POINTS_Y - 1) || (tx && x == GRID_MAX_POINTS_X - 1)) continue; z_values_virt[x * (BILINEAR_SUBDIVISIONS) + tx][y * (BILINEAR_SUBDIVISIONS) + ty] = bed_level_virt_2cmr( @@ -238,101 +240,119 @@ void print_bilinear_leveling_grid() { // Refresh after other values have been updated void refresh_bed_level() { - bilinear_grid_factor = bilinear_grid_spacing.reciprocal(); - TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); + bilinear_grid_factor[X_AXIS] = RECIPROCAL(bilinear_grid_spacing[X_AXIS]); + bilinear_grid_factor[Y_AXIS] = RECIPROCAL(bilinear_grid_spacing[Y_AXIS]); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + bed_level_virt_interpolate(); + #endif } #if ENABLED(ABL_BILINEAR_SUBDIVISION) - #define ABL_BG_SPACING(A) bilinear_grid_spacing_virt.A - #define ABL_BG_FACTOR(A) bilinear_grid_factor_virt.A + #define ABL_BG_SPACING(A) bilinear_grid_spacing_virt[A] + #define ABL_BG_FACTOR(A) bilinear_grid_factor_virt[A] #define ABL_BG_POINTS_X ABL_GRID_POINTS_VIRT_X #define ABL_BG_POINTS_Y ABL_GRID_POINTS_VIRT_Y #define ABL_BG_GRID(X,Y) z_values_virt[X][Y] #else - #define ABL_BG_SPACING(A) bilinear_grid_spacing.A - #define ABL_BG_FACTOR(A) bilinear_grid_factor.A + #define ABL_BG_SPACING(A) bilinear_grid_spacing[A] + #define ABL_BG_FACTOR(A) bilinear_grid_factor[A] #define ABL_BG_POINTS_X GRID_MAX_POINTS_X #define ABL_BG_POINTS_Y GRID_MAX_POINTS_Y #define ABL_BG_GRID(X,Y) z_values[X][Y] #endif // Get the Z adjustment for non-linear bed leveling -float bilinear_z_offset(const xy_pos_t &raw) { +float bilinear_z_offset(const float raw[XYZ]) { - static float z1, d2, z3, d4, L, D; - - static xy_pos_t prev { -999.999, -999.999 }, ratio; + static float z1, d2, z3, d4, L, D, ratio_x, ratio_y, + last_x = -999.999, last_y = -999.999; // Whole units for the grid line indices. Constrained within bounds. - static xy_int8_t thisg, nextg, lastg { -99, -99 }; + static int8_t gridx, gridy, nextx, nexty, + last_gridx = -99, last_gridy = -99; // XY relative to the probed area - xy_pos_t rel = raw - bilinear_start.asFloat(); + const float rx = raw[X_AXIS] - bilinear_start[X_AXIS], + ry = raw[Y_AXIS] - bilinear_start[Y_AXIS]; #if ENABLED(EXTRAPOLATE_BEYOND_GRID) - #define FAR_EDGE_OR_BOX 2 // Keep using the last grid box + // Keep using the last grid box + #define FAR_EDGE_OR_BOX 2 #else - #define FAR_EDGE_OR_BOX 1 // Just use the grid far edge + // Just use the grid far edge + #define FAR_EDGE_OR_BOX 1 #endif - if (prev.x != rel.x) { - prev.x = rel.x; - ratio.x = rel.x * ABL_BG_FACTOR(x); - const float gx = constrain(FLOOR(ratio.x), 0, ABL_BG_POINTS_X - (FAR_EDGE_OR_BOX)); - ratio.x -= gx; // Subtract whole to get the ratio within the grid box + if (last_x != rx) { + last_x = rx; + ratio_x = rx * ABL_BG_FACTOR(X_AXIS); + const float gx = constrain(FLOOR(ratio_x), 0, ABL_BG_POINTS_X - (FAR_EDGE_OR_BOX)); + ratio_x -= gx; // Subtract whole to get the ratio within the grid box #if DISABLED(EXTRAPOLATE_BEYOND_GRID) // Beyond the grid maintain height at grid edges - NOLESS(ratio.x, 0); // Never <0 (>1 is ok when nextg.x==thisg.x) + NOLESS(ratio_x, 0); // Never < 0.0. (> 1.0 is ok when nextx==gridx.) #endif - thisg.x = gx; - nextg.x = _MIN(thisg.x + 1, ABL_BG_POINTS_X - 1); + gridx = gx; + nextx = MIN(gridx + 1, ABL_BG_POINTS_X - 1); } - if (prev.y != rel.y || lastg.x != thisg.x) { + if (last_y != ry || last_gridx != gridx) { - if (prev.y != rel.y) { - prev.y = rel.y; - ratio.y = rel.y * ABL_BG_FACTOR(y); - const float gy = constrain(FLOOR(ratio.y), 0, ABL_BG_POINTS_Y - (FAR_EDGE_OR_BOX)); - ratio.y -= gy; + if (last_y != ry) { + last_y = ry; + ratio_y = ry * ABL_BG_FACTOR(Y_AXIS); + const float gy = constrain(FLOOR(ratio_y), 0, ABL_BG_POINTS_Y - (FAR_EDGE_OR_BOX)); + ratio_y -= gy; #if DISABLED(EXTRAPOLATE_BEYOND_GRID) // Beyond the grid maintain height at grid edges - NOLESS(ratio.y, 0); // Never < 0.0. (> 1.0 is ok when nextg.y==thisg.y.) + NOLESS(ratio_y, 0); // Never < 0.0. (> 1.0 is ok when nexty==gridy.) #endif - thisg.y = gy; - nextg.y = _MIN(thisg.y + 1, ABL_BG_POINTS_Y - 1); + gridy = gy; + nexty = MIN(gridy + 1, ABL_BG_POINTS_Y - 1); } - if (lastg != thisg) { - lastg = thisg; + if (last_gridx != gridx || last_gridy != gridy) { + last_gridx = gridx; + last_gridy = gridy; // Z at the box corners - z1 = ABL_BG_GRID(thisg.x, thisg.y); // left-front - d2 = ABL_BG_GRID(thisg.x, nextg.y) - z1; // left-back (delta) - z3 = ABL_BG_GRID(nextg.x, thisg.y); // right-front - d4 = ABL_BG_GRID(nextg.x, nextg.y) - z3; // right-back (delta) + z1 = ABL_BG_GRID(gridx, gridy); // left-front + d2 = ABL_BG_GRID(gridx, nexty) - z1; // left-back (delta) + z3 = ABL_BG_GRID(nextx, gridy); // right-front + d4 = ABL_BG_GRID(nextx, nexty) - z3; // right-back (delta) } - // Bilinear interpolate. Needed since rel.y or thisg.x has changed. - L = z1 + d2 * ratio.y; // Linear interp. LF -> LB - const float R = z3 + d4 * ratio.y; // Linear interp. RF -> RB + // Bilinear interpolate. Needed since ry or gridx has changed. + L = z1 + d2 * ratio_y; // Linear interp. LF -> LB + const float R = z3 + d4 * ratio_y; // Linear interp. RF -> RB D = R - L; } - const float offset = L + ratio.x * D; // the offset almost always changes + const float offset = L + ratio_x * D; // the offset almost always changes /* static float last_offset = 0; if (ABS(last_offset - offset) > 0.2) { - SERIAL_ECHOLNPAIR("Sudden Shift at x=", rel.x, " / ", bilinear_grid_spacing.x, " -> thisg.x=", thisg.x); - SERIAL_ECHOLNPAIR(" y=", rel.y, " / ", bilinear_grid_spacing.y, " -> thisg.y=", thisg.y); - SERIAL_ECHOLNPAIR(" ratio.x=", ratio.x, " ratio.y=", ratio.y); - SERIAL_ECHOLNPAIR(" z1=", z1, " z2=", z2, " z3=", z3, " z4=", z4); - SERIAL_ECHOLNPAIR(" L=", L, " R=", R, " offset=", offset); + SERIAL_ECHOPGM("Sudden Shift at "); + SERIAL_ECHOPAIR("x=", rx); + SERIAL_ECHOPAIR(" / ", bilinear_grid_spacing[X_AXIS]); + SERIAL_ECHOLNPAIR(" -> gridx=", gridx); + SERIAL_ECHOPAIR(" y=", ry); + SERIAL_ECHOPAIR(" / ", bilinear_grid_spacing[Y_AXIS]); + SERIAL_ECHOLNPAIR(" -> gridy=", gridy); + SERIAL_ECHOPAIR(" ratio_x=", ratio_x); + SERIAL_ECHOLNPAIR(" ratio_y=", ratio_y); + SERIAL_ECHOPAIR(" z1=", z1); + SERIAL_ECHOPAIR(" z2=", z2); + SERIAL_ECHOPAIR(" z3=", z3); + SERIAL_ECHOLNPAIR(" z4=", z4); + SERIAL_ECHOPAIR(" L=", L); + SERIAL_ECHOPAIR(" R=", R); + SERIAL_ECHOLNPAIR(" offset=", offset); } last_offset = offset; //*/ @@ -342,70 +362,71 @@ float bilinear_z_offset(const xy_pos_t &raw) { #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) - #define CELL_INDEX(A,V) ((V - bilinear_start.A) * ABL_BG_FACTOR(A)) + #define CELL_INDEX(A,V) ((V - bilinear_start[_AXIS(A)]) * ABL_BG_FACTOR(_AXIS(A))) /** * Prepare a bilinear-leveled linear move on Cartesian, * splitting the move where it crosses grid borders. */ - void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits, uint16_t y_splits) { + void bilinear_line_to_destination(const float fr_mm_s, uint16_t x_splits, uint16_t y_splits) { // Get current and destination cells for this line - xy_int_t c1 { CELL_INDEX(x, current_position.x), CELL_INDEX(y, current_position.y) }, - c2 { CELL_INDEX(x, destination.x), CELL_INDEX(y, destination.y) }; - LIMIT(c1.x, 0, ABL_BG_POINTS_X - 2); - LIMIT(c1.y, 0, ABL_BG_POINTS_Y - 2); - LIMIT(c2.x, 0, ABL_BG_POINTS_X - 2); - LIMIT(c2.y, 0, ABL_BG_POINTS_Y - 2); + int cx1 = CELL_INDEX(X, current_position[X_AXIS]), + cy1 = CELL_INDEX(Y, current_position[Y_AXIS]), + cx2 = CELL_INDEX(X, destination[X_AXIS]), + cy2 = CELL_INDEX(Y, destination[Y_AXIS]); + cx1 = constrain(cx1, 0, ABL_BG_POINTS_X - 2); + cy1 = constrain(cy1, 0, ABL_BG_POINTS_Y - 2); + cx2 = constrain(cx2, 0, ABL_BG_POINTS_X - 2); + cy2 = constrain(cy2, 0, ABL_BG_POINTS_Y - 2); // Start and end in the same cell? No split needed. - if (c1 == c2) { - current_position = destination; - line_to_current_position(scaled_fr_mm_s); + if (cx1 == cx2 && cy1 == cy2) { + buffer_line_to_destination(fr_mm_s); + set_current_from_destination(); return; } - #define LINE_SEGMENT_END(A) (current_position.A + (destination.A - current_position.A) * normalized_dist) + #define LINE_SEGMENT_END(A) (current_position[_AXIS(A)] + (destination[_AXIS(A)] - current_position[_AXIS(A)]) * normalized_dist) - float normalized_dist; - xyze_pos_t end; - const xy_int8_t gc { _MAX(c1.x, c2.x), _MAX(c1.y, c2.y) }; + float normalized_dist, end[XYZE]; + const int8_t gcx = MAX(cx1, cx2), gcy = MAX(cy1, cy2); // Crosses on the X and not already split on this X? // The x_splits flags are insurance against rounding errors. - if (c2.x != c1.x && TEST(x_splits, gc.x)) { + if (cx2 != cx1 && TEST(x_splits, gcx)) { // Split on the X grid line - CBI(x_splits, gc.x); - end = destination; - destination.x = bilinear_start.x + ABL_BG_SPACING(x) * gc.x; - normalized_dist = (destination.x - current_position.x) / (end.x - current_position.x); - destination.y = LINE_SEGMENT_END(y); + CBI(x_splits, gcx); + COPY(end, destination); + destination[X_AXIS] = bilinear_start[X_AXIS] + ABL_BG_SPACING(X_AXIS) * gcx; + normalized_dist = (destination[X_AXIS] - current_position[X_AXIS]) / (end[X_AXIS] - current_position[X_AXIS]); + destination[Y_AXIS] = LINE_SEGMENT_END(Y); } // Crosses on the Y and not already split on this Y? - else if (c2.y != c1.y && TEST(y_splits, gc.y)) { + else if (cy2 != cy1 && TEST(y_splits, gcy)) { // Split on the Y grid line - CBI(y_splits, gc.y); - end = destination; - destination.y = bilinear_start.y + ABL_BG_SPACING(y) * gc.y; - normalized_dist = (destination.y - current_position.y) / (end.y - current_position.y); - destination.x = LINE_SEGMENT_END(x); + CBI(y_splits, gcy); + COPY(end, destination); + destination[Y_AXIS] = bilinear_start[Y_AXIS] + ABL_BG_SPACING(Y_AXIS) * gcy; + normalized_dist = (destination[Y_AXIS] - current_position[Y_AXIS]) / (end[Y_AXIS] - current_position[Y_AXIS]); + destination[X_AXIS] = LINE_SEGMENT_END(X); } else { // Must already have been split on these border(s) // This should be a rare case. - current_position = destination; - line_to_current_position(scaled_fr_mm_s); + buffer_line_to_destination(fr_mm_s); + set_current_from_destination(); return; } - destination.z = LINE_SEGMENT_END(z); - destination.e = LINE_SEGMENT_END(e); + destination[Z_AXIS] = LINE_SEGMENT_END(Z); + destination[E_AXIS] = LINE_SEGMENT_END(E); // Do the split and look for more borders - bilinear_line_to_destination(scaled_fr_mm_s, x_splits, y_splits); + bilinear_line_to_destination(fr_mm_s, x_splits, y_splits); // Restore destination from stack - destination = end; - bilinear_line_to_destination(scaled_fr_mm_s, x_splits, y_splits); + COPY(destination, end); + bilinear_line_to_destination(fr_mm_s, x_splits, y_splits); } #endif // IS_CARTESIAN && !SEGMENT_LEVELED_MOVES diff --git a/Marlin/src/feature/bedlevel/abl/abl.h b/Marlin/src/feature/bedlevel/abl/abl.h index bbe2411dc3..0ac1f424bb 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.h +++ b/Marlin/src/feature/bedlevel/abl/abl.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,30 +16,36 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include "../../../inc/MarlinConfigPre.h" +#ifndef __ABL_H__ +#define __ABL_H__ -extern xy_pos_t bilinear_grid_spacing, bilinear_start; -extern xy_float_t bilinear_grid_factor; -extern bed_mesh_t z_values; -float bilinear_z_offset(const xy_pos_t &raw); +#include "../../../inc/MarlinConfig.h" -void extrapolate_unprobed_bed_level(); -void print_bilinear_leveling_grid(); -void refresh_bed_level(); -#if ENABLED(ABL_BILINEAR_SUBDIVISION) - void print_bilinear_leveling_grid_virt(); - void bed_level_virt_interpolate(); -#endif +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) -#if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) - void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF); -#endif + #include "../bedlevel.h" -#define _GET_MESH_X(I) float(bilinear_start.x + (I) * bilinear_grid_spacing.x) -#define _GET_MESH_Y(J) float(bilinear_start.y + (J) * bilinear_grid_spacing.y) -#define Z_VALUES_ARR z_values + extern int bilinear_grid_spacing[2], bilinear_start[2]; + extern float bilinear_grid_factor[2], + z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + float bilinear_z_offset(const float raw[XYZ]); + + void extrapolate_unprobed_bed_level(); + void print_bilinear_leveling_grid(); + void refresh_bed_level(); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + void print_bilinear_leveling_grid_virt(); + void bed_level_virt_interpolate(); + #endif + + #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) + void bilinear_line_to_destination(const float fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF); + #endif + +#endif // AUTO_BED_LEVELING_BILINEAR + +#endif // __ABL_H__ diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 3e9225b7f9..90bbfe600e 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,12 +25,15 @@ #if HAS_LEVELING #include "bedlevel.h" -#include "../../module/planner.h" -#if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) +#if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY) #include "../../module/motion.h" #endif +#if PLANNER_LEVELING + #include "../../module/planner.h" +#endif + #if ENABLED(PROBE_MANUALLY) bool g29_in_progress = false; #endif @@ -39,17 +42,22 @@ #include "../../lcd/ultralcd.h" #endif -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../../core/debug_out.h" - -#if ENABLED(EXTENSIBLE_UI) - #include "../../lcd/extui/ui_api.h" +#if ENABLED(G26_MESH_VALIDATION) + bool g26_debug_flag; // = false #endif bool leveling_is_valid() { - return TERN1(MESH_BED_LEVELING, mbl.has_mesh()) - && TERN1(AUTO_BED_LEVELING_BILINEAR, !!bilinear_grid_spacing.x) - && TERN1(AUTO_BED_LEVELING_UBL, ubl.mesh_is_valid()); + return + #if ENABLED(MESH_BED_LEVELING) + mbl.has_mesh() + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + !!bilinear_grid_spacing[X_AXIS] + #elif ENABLED(AUTO_BED_LEVELING_UBL) + ubl.mesh_is_valid() + #else // 3POINT, LINEAR + true + #endif + ; } /** @@ -61,41 +69,87 @@ bool leveling_is_valid() { */ void set_bed_leveling_enabled(const bool enable/*=true*/) { - const bool can_change = TERN1(AUTO_BED_LEVELING_BILINEAR, !enable || leveling_is_valid()); + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + const bool can_change = (!enable || leveling_is_valid()); + #else + constexpr bool can_change = true; + #endif if (can_change && enable != planner.leveling_active) { planner.synchronize(); - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - // Force bilinear_z_offset to re-calculate next time - const xyz_pos_t reset { -9999.999, -9999.999, 0 }; - (void)bilinear_z_offset(reset); - #endif + #if ENABLED(MESH_BED_LEVELING) - if (planner.leveling_active) { // leveling from on to off - if (DEBUGGING(LEVELING)) DEBUG_POS("Leveling ON", current_position); - // change unleveled current_position to physical current_position without moving steppers. - planner.apply_leveling(current_position); - planner.leveling_active = false; // disable only AFTER calling apply_leveling - if (DEBUGGING(LEVELING)) DEBUG_POS("...Now OFF", current_position); - } - else { // leveling from off to on - if (DEBUGGING(LEVELING)) DEBUG_POS("Leveling OFF", current_position); - planner.leveling_active = true; // enable BEFORE calling unapply_leveling, otherwise ignored - // change physical current_position to unleveled current_position without moving steppers. - planner.unapply_leveling(current_position); - if (DEBUGGING(LEVELING)) DEBUG_POS("...Now ON", current_position); - } + if (!enable) + planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); - sync_plan_position(); + const bool enabling = enable && leveling_is_valid(); + planner.leveling_active = enabling; + if (enabling) planner.unapply_leveling(current_position); + + #elif ENABLED(AUTO_BED_LEVELING_UBL) + #if PLANNER_LEVELING + if (planner.leveling_active) { // leveling from on to off + // change unleveled current_position to physical current_position without moving steppers. + planner.apply_leveling(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]); + planner.leveling_active = false; // disable only AFTER calling apply_leveling + } + else { // leveling from off to on + planner.leveling_active = true; // enable BEFORE calling unapply_leveling, otherwise ignored + // change physical current_position to unleveled current_position without moving steppers. + planner.unapply_leveling(current_position); + } + #else + // UBL equivalents for apply/unapply_leveling + #if ENABLED(SKEW_CORRECTION) + float pos[XYZ] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + planner.skew(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS]); + #else + const float (&pos)[XYZE] = current_position; + #endif + if (planner.leveling_active) { + current_position[Z_AXIS] += ubl.get_z_correction(pos[X_AXIS], pos[Y_AXIS]); + planner.leveling_active = false; + } + else { + planner.leveling_active = true; + current_position[Z_AXIS] -= ubl.get_z_correction(pos[X_AXIS], pos[Y_AXIS]); + } + #endif + + #else // OLDSCHOOL_ABL + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + // Force bilinear_z_offset to re-calculate next time + const float reset[XYZ] = { -9999.999, -9999.999, 0 }; + (void)bilinear_z_offset(reset); + #endif + + // Enable or disable leveling compensation in the planner + planner.leveling_active = enable; + + if (!enable) + // When disabling just get the current position from the steppers. + // This will yield the smallest error when first converted back to steps. + set_current_from_steppers_for_axis( + #if ABL_PLANAR + ALL_AXES + #else + Z_AXIS + #endif + ); + else + // When enabling, remove compensation from the current position, + // so compensation will give the right stepper counts. + planner.unapply_leveling(current_position); + + SYNC_PLAN_POSITION_KINEMATIC(); + + #endif // OLDSCHOOL_ABL } } -TemporaryBedLevelingState::TemporaryBedLevelingState(const bool enable) : saved(planner.leveling_active) { - set_bed_leveling_enabled(enable); -} - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) void set_z_fade_height(const float zfh, const bool do_report/*=true*/) { @@ -108,9 +162,9 @@ TemporaryBedLevelingState::TemporaryBedLevelingState(const bool enable) : saved( planner.set_z_fade_height(zfh); if (leveling_was_active) { - const xyz_pos_t oldpos = current_position; + const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; set_bed_leveling_enabled(true); - if (do_report && oldpos != current_position) + if (do_report && memcmp(oldpos, current_position, sizeof(oldpos))) report_current_position(); } } @@ -121,27 +175,26 @@ TemporaryBedLevelingState::TemporaryBedLevelingState(const bool enable) : saved( * Reset calibration results to zero. */ void reset_bed_level() { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("reset_bed_level"); - #if ENABLED(AUTO_BED_LEVELING_UBL) + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("reset_bed_level"); + #endif + set_bed_leveling_enabled(false); + #if ENABLED(MESH_BED_LEVELING) + mbl.reset(); + #elif ENABLED(AUTO_BED_LEVELING_UBL) ubl.reset(); - #else - set_bed_leveling_enabled(false); - #if ENABLED(MESH_BED_LEVELING) - mbl.reset(); - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - bilinear_start.reset(); - bilinear_grid_spacing.reset(); - GRID_LOOP(x, y) { + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + bilinear_start[X_AXIS] = bilinear_start[Y_AXIS] = + bilinear_grid_spacing[X_AXIS] = bilinear_grid_spacing[Y_AXIS] = 0; + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) z_values[x][y] = NAN; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, 0)); - } - #elif ABL_PLANAR - planner.bed_level_matrix.set_to_identity(); - #endif + #elif ABL_PLANAR + planner.bed_level_matrix.set_to_identity(); #endif } -#if EITHER(AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(MESH_BED_LEVELING) /** * Enable to produce output in JSON format suitable @@ -158,80 +211,84 @@ void reset_bed_level() { */ void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, element_2d_fn fn) { #ifndef SCAD_MESH_OUTPUT - LOOP_L_N(x, sx) { - serial_spaces(precision + (x < 10 ? 3 : 2)); - SERIAL_ECHO(int(x)); + for (uint8_t x = 0; x < sx; x++) { + for (uint8_t i = 0; i < precision + 2 + (x < 10 ? 1 : 0); i++) + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOL(int(x)); } SERIAL_EOL(); #endif #ifdef SCAD_MESH_OUTPUT - SERIAL_ECHOLNPGM("measured_z = ["); // open 2D array + SERIAL_PROTOCOLLNPGM("measured_z = ["); // open 2D array #endif - LOOP_L_N(y, sy) { + for (uint8_t y = 0; y < sy; y++) { #ifdef SCAD_MESH_OUTPUT - SERIAL_ECHOPGM(" ["); // open sub-array + SERIAL_PROTOCOLPGM(" ["); // open sub-array #else - if (y < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(int(y)); + if (y < 10) SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOL(int(y)); #endif - LOOP_L_N(x, sx) { - SERIAL_CHAR(' '); + for (uint8_t x = 0; x < sx; x++) { + SERIAL_PROTOCOLCHAR(' '); const float offset = fn(x, y); if (!isnan(offset)) { - if (offset >= 0) SERIAL_CHAR('+'); - SERIAL_ECHO_F(offset, int(precision)); + if (offset >= 0) SERIAL_PROTOCOLCHAR('+'); + SERIAL_PROTOCOL_F(offset, int(precision)); } else { #ifdef SCAD_MESH_OUTPUT for (uint8_t i = 3; i < precision + 3; i++) - SERIAL_CHAR(' '); - SERIAL_ECHOPGM("NAN"); + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOLPGM("NAN"); #else - LOOP_L_N(i, precision + 3) - SERIAL_CHAR(i ? '=' : ' '); + for (uint8_t i = 0; i < precision + 3; i++) + SERIAL_PROTOCOLCHAR(i ? '=' : ' '); #endif } #ifdef SCAD_MESH_OUTPUT - if (x < sx - 1) SERIAL_CHAR(','); + if (x < sx - 1) SERIAL_PROTOCOLCHAR(','); #endif } #ifdef SCAD_MESH_OUTPUT - SERIAL_CHAR(' ', ']'); // close sub-array - if (y < sy - 1) SERIAL_CHAR(','); + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOLCHAR(']'); // close sub-array + if (y < sy - 1) SERIAL_PROTOCOLCHAR(','); #endif SERIAL_EOL(); } #ifdef SCAD_MESH_OUTPUT - SERIAL_ECHOPGM("];"); // close 2D array + SERIAL_PROTOCOLPGM("];"); // close 2D array #endif SERIAL_EOL(); } #endif // AUTO_BED_LEVELING_BILINEAR || MESH_BED_LEVELING -#if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) +#if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY) - void _manual_goto_xy(const xy_pos_t &pos) { + void _manual_goto_xy(const float &rx, const float &ry) { #ifdef MANUAL_PROBE_START_Z - constexpr float startz = _MAX(0, MANUAL_PROBE_START_Z); #if MANUAL_PROBE_HEIGHT > 0 - do_blocking_move_to_xy_z(pos, MANUAL_PROBE_HEIGHT); - do_blocking_move_to_z(startz); + do_blocking_move_to(rx, ry, MANUAL_PROBE_HEIGHT); + do_blocking_move_to_z(MAX(0,MANUAL_PROBE_START_Z)); #else - do_blocking_move_to_xy_z(pos, startz); + do_blocking_move_to(rx, ry, MAX(0,MANUAL_PROBE_START_Z)); #endif #elif MANUAL_PROBE_HEIGHT > 0 - const float prev_z = current_position.z; - do_blocking_move_to_xy_z(pos, MANUAL_PROBE_HEIGHT); + const float prev_z = current_position[Z_AXIS]; + do_blocking_move_to(rx, ry, MANUAL_PROBE_HEIGHT); do_blocking_move_to_z(prev_z); #else - do_blocking_move_to_xy(pos); + do_blocking_move_to_xy(rx, ry); #endif - current_position = pos; + current_position[X_AXIS] = rx; + current_position[Y_AXIS] = ry; - TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); + #if ENABLED(LCD_BED_LEVELING) + lcd_wait_for_move = false; + #endif } #endif diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h index 995e9d0dbc..3db5aabd68 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.h +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,26 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __BEDLEVEL_H__ +#define __BEDLEVEL_H__ #include "../../inc/MarlinConfigPre.h" +typedef struct { + int8_t x_index, y_index; + float distance; // When populated, the distance from the search location +} mesh_index_pair; + +#if ENABLED(G26_MESH_VALIDATION) + extern bool g26_debug_flag; +#else + constexpr bool g26_debug_flag = false; +#endif + #if ENABLED(PROBE_MANUALLY) extern bool g29_in_progress; #else @@ -37,62 +50,40 @@ void reset_bed_level(); void set_z_fade_height(const float zfh, const bool do_report=true); #endif -#if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) - void _manual_goto_xy(const xy_pos_t &pos); -#endif +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(MESH_BED_LEVELING) -/** - * A class to save and change the bed leveling state, - * then restore it when it goes out of scope. - */ -class TemporaryBedLevelingState { - bool saved; - public: - TemporaryBedLevelingState(const bool enable); - ~TemporaryBedLevelingState() { set_bed_leveling_enabled(saved); } -}; -#define TEMPORARY_BED_LEVELING_STATE(enable) const TemporaryBedLevelingState tbls(enable) + #include -#if HAS_MESH + typedef float (*element_2d_fn)(const uint8_t, const uint8_t); - typedef float bed_mesh_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - #include "abl/abl.h" - #elif ENABLED(AUTO_BED_LEVELING_UBL) - #include "ubl/ubl.h" - #elif ENABLED(MESH_BED_LEVELING) - #include "mbl/mesh_bed_leveling.h" - #endif - - #define Z_VALUES(X,Y) Z_VALUES_ARR[X][Y] - #define _GET_MESH_POS(M) { _GET_MESH_X(M.a), _GET_MESH_Y(M.b) } - - #if EITHER(AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) - - #include - - typedef float (*element_2d_fn)(const uint8_t, const uint8_t); - - /** - * Print calibration results for plotting or manual frame adjustment. - */ - void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, element_2d_fn fn); - - #endif - - struct mesh_index_pair { - xy_int8_t pos; - float distance; // When populated, the distance from the search location - void invalidate() { pos = -1; } - bool valid() const { return pos.x >= 0 && pos.y >= 0; } - #if ENABLED(AUTO_BED_LEVELING_UBL) - xy_pos_t meshpos() { - return { ubl.mesh_index_to_xpos(pos.x), ubl.mesh_index_to_ypos(pos.y) }; - } - #endif - operator xy_int8_t&() { return pos; } - operator const xy_int8_t&() const { return pos; } - }; + /** + * Print calibration results for plotting or manual frame adjustment. + */ + void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, element_2d_fn fn); #endif + +#if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY) + void _manual_goto_xy(const float &x, const float &y); +#endif + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + #define _GET_MESH_X(I) (bilinear_start[X_AXIS] + (I) * bilinear_grid_spacing[X_AXIS]) + #define _GET_MESH_Y(J) (bilinear_start[Y_AXIS] + (J) * bilinear_grid_spacing[Y_AXIS]) +#elif ENABLED(AUTO_BED_LEVELING_UBL) + #define _GET_MESH_X(I) ubl.mesh_index_to_xpos(I) + #define _GET_MESH_Y(J) ubl.mesh_index_to_ypos(J) +#elif ENABLED(MESH_BED_LEVELING) + #define _GET_MESH_X(I) mbl.index_to_xpos[I] + #define _GET_MESH_Y(J) mbl.index_to_ypos[J] +#endif + +#if ENABLED(MESH_BED_LEVELING) + #include "mbl/mesh_bed_leveling.h" +#elif ENABLED(AUTO_BED_LEVELING_UBL) + #include "ubl/ubl.h" +#elif HAS_ABL + #include "abl/abl.h" +#endif + +#endif // __BEDLEVEL_H__ diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index 1200c2a1b3..36812b6355 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,13 +24,10 @@ #if ENABLED(MESH_BED_LEVELING) - #include "../bedlevel.h" + #include "mesh_bed_leveling.h" #include "../../../module/motion.h" - - #if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" - #endif + #include "../../../feature/bedlevel/bedlevel.h" mesh_bed_leveling mbl; @@ -40,9 +37,9 @@ mesh_bed_leveling::index_to_ypos[GRID_MAX_POINTS_Y]; mesh_bed_leveling::mesh_bed_leveling() { - LOOP_L_N(i, GRID_MAX_POINTS_X) + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; ++i) index_to_xpos[i] = MESH_MIN_X + i * (MESH_X_DIST); - LOOP_L_N(i, GRID_MAX_POINTS_Y) + for (uint8_t i = 0; i < GRID_MAX_POINTS_Y; ++i) index_to_ypos[i] = MESH_MIN_Y + i * (MESH_Y_DIST); reset(); } @@ -50,9 +47,6 @@ void mesh_bed_leveling::reset() { z_offset = 0; ZERO(z_values); - #if ENABLED(EXTENSIBLE_UI) - GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0); - #endif } #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) @@ -61,70 +55,73 @@ * Prepare a mesh-leveled linear move in a Cartesian setup, * splitting the move where it crosses mesh borders. */ - void mesh_bed_leveling::line_to_destination(const feedRate_t &scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { + void mesh_bed_leveling::line_to_destination(const float fr_mm_s, uint8_t x_splits, uint8_t y_splits) { // Get current and destination cells for this line - xy_int8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination); - NOMORE(scel.x, GRID_MAX_POINTS_X - 2); - NOMORE(scel.y, GRID_MAX_POINTS_Y - 2); - NOMORE(ecel.x, GRID_MAX_POINTS_X - 2); - NOMORE(ecel.y, GRID_MAX_POINTS_Y - 2); + int cx1 = cell_index_x(current_position[X_AXIS]), + cy1 = cell_index_y(current_position[Y_AXIS]), + cx2 = cell_index_x(destination[X_AXIS]), + cy2 = cell_index_y(destination[Y_AXIS]); + NOMORE(cx1, GRID_MAX_POINTS_X - 2); + NOMORE(cy1, GRID_MAX_POINTS_Y - 2); + NOMORE(cx2, GRID_MAX_POINTS_X - 2); + NOMORE(cy2, GRID_MAX_POINTS_Y - 2); // Start and end in the same cell? No split needed. - if (scel == ecel) { - line_to_destination(scaled_fr_mm_s); - current_position = destination; + if (cx1 == cx2 && cy1 == cy2) { + line_to_destination(fr_mm_s); + set_current_from_destination(); return; } - #define MBL_SEGMENT_END(A) (current_position.A + (destination.A - current_position.A) * normalized_dist) + #define MBL_SEGMENT_END(A) (current_position[_AXIS(A)] + (destination[_AXIS(A)] - current_position[_AXIS(A)]) * normalized_dist) - float normalized_dist; - xyze_pos_t dest; - const int8_t gcx = _MAX(scel.x, ecel.x), gcy = _MAX(scel.y, ecel.y); + float normalized_dist, end[XYZE]; + const int8_t gcx = MAX(cx1, cx2), gcy = MAX(cy1, cy2); // Crosses on the X and not already split on this X? // The x_splits flags are insurance against rounding errors. - if (ecel.x != scel.x && TEST(x_splits, gcx)) { + if (cx2 != cx1 && TEST(x_splits, gcx)) { // Split on the X grid line CBI(x_splits, gcx); - dest = destination; - destination.x = index_to_xpos[gcx]; - normalized_dist = (destination.x - current_position.x) / (dest.x - current_position.x); - destination.y = MBL_SEGMENT_END(y); + COPY(end, destination); + destination[X_AXIS] = index_to_xpos[gcx]; + normalized_dist = (destination[X_AXIS] - current_position[X_AXIS]) / (end[X_AXIS] - current_position[X_AXIS]); + destination[Y_AXIS] = MBL_SEGMENT_END(Y); } // Crosses on the Y and not already split on this Y? - else if (ecel.y != scel.y && TEST(y_splits, gcy)) { + else if (cy2 != cy1 && TEST(y_splits, gcy)) { // Split on the Y grid line CBI(y_splits, gcy); - dest = destination; - destination.y = index_to_ypos[gcy]; - normalized_dist = (destination.y - current_position.y) / (dest.y - current_position.y); - destination.x = MBL_SEGMENT_END(x); + COPY(end, destination); + destination[Y_AXIS] = index_to_ypos[gcy]; + normalized_dist = (destination[Y_AXIS] - current_position[Y_AXIS]) / (end[Y_AXIS] - current_position[Y_AXIS]); + destination[X_AXIS] = MBL_SEGMENT_END(X); } else { // Must already have been split on these border(s) // This should be a rare case. - line_to_destination(scaled_fr_mm_s); - current_position = destination; + line_to_destination(fr_mm_s); + set_current_from_destination(); return; } - destination.z = MBL_SEGMENT_END(z); - destination.e = MBL_SEGMENT_END(e); + destination[Z_AXIS] = MBL_SEGMENT_END(Z); + destination[E_AXIS] = MBL_SEGMENT_END(E); // Do the split and look for more borders - line_to_destination(scaled_fr_mm_s, x_splits, y_splits); + line_to_destination(fr_mm_s, x_splits, y_splits); // Restore destination from stack - destination = dest; - line_to_destination(scaled_fr_mm_s, x_splits, y_splits); + COPY(destination, end); + line_to_destination(fr_mm_s, x_splits, y_splits); } #endif // IS_CARTESIAN && !SEGMENT_LEVELED_MOVES void mesh_bed_leveling::report_mesh() { - SERIAL_ECHOPAIR_F(STRINGIFY(GRID_MAX_POINTS_X) "x" STRINGIFY(GRID_MAX_POINTS_Y) " mesh. Z offset: ", z_offset, 5); - SERIAL_ECHOLNPGM("\nMeasured points:"); + SERIAL_PROTOCOLLNPGM("Num X,Y: " STRINGIFY(GRID_MAX_POINTS_X) "," STRINGIFY(GRID_MAX_POINTS_Y)); + SERIAL_PROTOCOLPGM("Z offset: "); SERIAL_PROTOCOL_F(z_offset, 5); + SERIAL_PROTOCOLLNPGM("\nMeasured points:"); print_2d_array(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y, 5, [](const uint8_t ix, const uint8_t iy) { return z_values[ix][iy]; } ); diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index ade7a93140..5b68edefe5 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,27 +16,26 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef _MESH_BED_LEVELING_H_ +#define _MESH_BED_LEVELING_H_ #include "../../../inc/MarlinConfig.h" enum MeshLevelingState : char { - MeshReport, // G29 S0 - MeshStart, // G29 S1 - MeshNext, // G29 S2 - MeshSet, // G29 S3 - MeshSetZOffset, // G29 S4 - MeshReset // G29 S5 + MeshReport, + MeshStart, + MeshNext, + MeshSet, + MeshSetZOffset, + MeshReset }; -#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) -#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) -#define _GET_MESH_X(I) mbl.index_to_xpos[I] -#define _GET_MESH_Y(J) mbl.index_to_ypos[J] -#define Z_VALUES_ARR mbl.z_values +#define MESH_X_DIST ((MESH_MAX_X - (MESH_MIN_X)) / (GRID_MAX_POINTS_X - 1)) +#define MESH_Y_DIST ((MESH_MAX_Y - (MESH_MIN_Y)) / (GRID_MAX_POINTS_Y - 1)) class mesh_bed_leveling { public: @@ -52,7 +51,9 @@ public: static void reset(); FORCE_INLINE static bool has_mesh() { - GRID_LOOP(x, y) if (z_values[x][y]) return true; + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + if (z_values[x][y]) return true; return false; } @@ -71,30 +72,24 @@ public: } static int8_t cell_index_x(const float &x) { - int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); + int8_t cx = (x - (MESH_MIN_X)) * (1.0f / (MESH_X_DIST)); return constrain(cx, 0, (GRID_MAX_POINTS_X) - 2); } + static int8_t cell_index_y(const float &y) { - int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); + int8_t cy = (y - (MESH_MIN_Y)) * (1.0f / (MESH_Y_DIST)); return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 2); } - static inline xy_int8_t cell_indexes(const float &x, const float &y) { - return { cell_index_x(x), cell_index_y(y) }; - } - static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } static int8_t probe_index_x(const float &x) { - int8_t px = (x - (MESH_MIN_X) + 0.5f * (MESH_X_DIST)) * RECIPROCAL(MESH_X_DIST); + int8_t px = (x - (MESH_MIN_X) + 0.5f * (MESH_X_DIST)) * (1.0f / (MESH_X_DIST)); return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; } + static int8_t probe_index_y(const float &y) { - int8_t py = (y - (MESH_MIN_Y) + 0.5f * (MESH_Y_DIST)) * RECIPROCAL(MESH_Y_DIST); + int8_t py = (y - (MESH_MIN_Y) + 0.5f * (MESH_Y_DIST)) * (1.0f / (MESH_Y_DIST)); return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; } - static inline xy_int8_t probe_indexes(const float &x, const float &y) { - return { probe_index_x(x), probe_index_y(y) }; - } - static inline xy_int8_t probe_indexes(const xy_pos_t &xy) { return probe_indexes(xy.x, xy.y); } static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { const float delta_z = (z2 - z1) / (a2 - a1), @@ -102,26 +97,28 @@ public: return z1 + delta_a * delta_z; } - static float get_z(const xy_pos_t &pos + static float get_z(const float &x0, const float &y0 #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - , const float &factor=1.0f + , const float &factor #endif ) { - #if DISABLED(ENABLE_LEVELING_FADE_HEIGHT) - constexpr float factor = 1.0f; - #endif - const xy_int8_t ind = cell_indexes(pos); - const float x1 = index_to_xpos[ind.x], x2 = index_to_xpos[ind.x+1], - y1 = index_to_xpos[ind.y], y2 = index_to_xpos[ind.y+1], - z1 = calc_z0(pos.x, x1, z_values[ind.x][ind.y ], x2, z_values[ind.x+1][ind.y ]), - z2 = calc_z0(pos.x, x1, z_values[ind.x][ind.y+1], x2, z_values[ind.x+1][ind.y+1]); + const int8_t cx = cell_index_x(x0), cy = cell_index_y(y0); + const float z1 = calc_z0(x0, index_to_xpos[cx], z_values[cx][cy], index_to_xpos[cx + 1], z_values[cx + 1][cy]), + z2 = calc_z0(x0, index_to_xpos[cx], z_values[cx][cy + 1], index_to_xpos[cx + 1], z_values[cx + 1][cy + 1]), + z0 = calc_z0(y0, index_to_ypos[cy], z1, index_to_ypos[cy + 1], z2); - return z_offset + calc_z0(pos.y, y1, z1, y2, z2) * factor; + return z_offset + z0 + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + * factor + #endif + ; } #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) - static void line_to_destination(const feedRate_t &scaled_fr_mm_s, uint8_t x_splits=0xFF, uint8_t y_splits=0xFF); + static void line_to_destination(const float fr_mm_s, uint8_t x_splits=0xFF, uint8_t y_splits=0xFF); #endif }; extern mesh_bed_leveling mbl; + +#endif // _MESH_BED_LEVELING_H_ diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 087fdf42b2..143d7a0fcc 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,69 +24,133 @@ #if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../bedlevel.h" - + #include "ubl.h" unified_bed_leveling ubl; - #include "../../../MarlinCore.h" - #include "../../../gcode/gcode.h" - - #include "../../../module/settings.h" + #include "../../../module/configuration_store.h" #include "../../../module/planner.h" #include "../../../module/motion.h" - #include "../../../module/probe.h" - - #if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" - #endif + #include "../../bedlevel/bedlevel.h" #include "math.h" - void unified_bed_leveling::echo_name() { - SERIAL_ECHOPGM("Unified Bed Leveling"); + uint8_t ubl_cnt = 0; + + void unified_bed_leveling::echo_name( + #if NUM_SERIAL > 1 + const int8_t port/*= -1*/ + #endif + ) { + SERIAL_PROTOCOLPGM_P(port, "Unified Bed Leveling"); } - void unified_bed_leveling::report_current_mesh() { + void unified_bed_leveling::report_current_mesh( + #if NUM_SERIAL > 1 + const int8_t port/*= -1*/ + #endif + ) { if (!leveling_is_valid()) return; - SERIAL_ECHO_MSG(" G29 I999"); - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(" M421 I", int(x), " J", int(y)); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); - serial_delay(75); // Prevent Printrun from exploding - } + SERIAL_ECHO_START_P(port); + SERIAL_ECHOLNPGM_P(port, " G29 I99"); + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + if (!isnan(z_values[x][y])) { + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPAIR_P(port, " M421 I", x); + SERIAL_ECHOPAIR_P(port, " J", y); + SERIAL_ECHOPGM_P(port, " Z"); + SERIAL_ECHO_F_P(port, z_values[x][y], 2); + SERIAL_EOL_P(port); + safe_delay(75); // Prevent Printrun from exploding + } } - void unified_bed_leveling::report_state() { - echo_name(); - SERIAL_ECHO_TERNARY(planner.leveling_active, " System v" UBL_VERSION " ", "", "in", "active\n"); - serial_delay(50); + void unified_bed_leveling::report_state( + #if NUM_SERIAL > 1 + const int8_t port/*= -1*/ + #endif + ) { + echo_name( + #if NUM_SERIAL > 1 + port + #endif + ); + SERIAL_PROTOCOLPGM_P(port, " System v" UBL_VERSION " "); + if (!planner.leveling_active) SERIAL_PROTOCOLPGM_P(port, "in"); + SERIAL_PROTOCOLLNPGM_P(port, "active."); + safe_delay(50); } + #if ENABLED(UBL_DEVEL_DEBUGGING) + + static void debug_echo_axis(const AxisEnum axis) { + if (current_position[axis] == destination[axis]) + SERIAL_ECHOPGM("-------------"); + else + SERIAL_ECHO_F(destination[X_AXIS], 6); + } + + void debug_current_and_destination(const char *title) { + + // if the title message starts with a '!' it is so important, we are going to + // ignore the status of the g26_debug_flag + if (*title != '!' && !g26_debug_flag) return; + + const float de = destination[E_AXIS] - current_position[E_AXIS]; + + if (de == 0.0) return; // Printing moves only + + const float dx = destination[X_AXIS] - current_position[X_AXIS], + dy = destination[Y_AXIS] - current_position[Y_AXIS], + xy_dist = HYPOT(dx, dy); + + if (xy_dist == 0.0) return; + + SERIAL_ECHOPGM(" fpmm="); + const float fpmm = de / xy_dist; + SERIAL_ECHO_F(fpmm, 6); + + SERIAL_ECHOPGM(" current=( "); + SERIAL_ECHO_F(current_position[X_AXIS], 6); + SERIAL_ECHOPGM(", "); + SERIAL_ECHO_F(current_position[Y_AXIS], 6); + SERIAL_ECHOPGM(", "); + SERIAL_ECHO_F(current_position[Z_AXIS], 6); + SERIAL_ECHOPGM(", "); + SERIAL_ECHO_F(current_position[E_AXIS], 6); + SERIAL_ECHOPGM(" ) destination=( "); + debug_echo_axis(X_AXIS); + SERIAL_ECHOPGM(", "); + debug_echo_axis(Y_AXIS); + SERIAL_ECHOPGM(", "); + debug_echo_axis(Z_AXIS); + SERIAL_ECHOPGM(", "); + debug_echo_axis(E_AXIS); + SERIAL_ECHOPGM(" ) "); + SERIAL_ECHO(title); + SERIAL_EOL(); + + } + + #endif // UBL_DEVEL_DEBUGGING + int8_t unified_bed_leveling::storage_slot; float unified_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - #define _GRIDPOS(A,N) (MESH_MIN_##A + N * (MESH_##A##_DIST)) + // 15 is the maximum nubmer of grid points supported + 1 safety margin for now, + // until determinism prevails + constexpr float unified_bed_leveling::_mesh_index_to_xpos[16], + unified_bed_leveling::_mesh_index_to_ypos[16]; - const float - unified_bed_leveling::_mesh_index_to_xpos[GRID_MAX_POINTS_X] PROGMEM = ARRAY_N(GRID_MAX_POINTS_X, - _GRIDPOS(X, 0), _GRIDPOS(X, 1), _GRIDPOS(X, 2), _GRIDPOS(X, 3), - _GRIDPOS(X, 4), _GRIDPOS(X, 5), _GRIDPOS(X, 6), _GRIDPOS(X, 7), - _GRIDPOS(X, 8), _GRIDPOS(X, 9), _GRIDPOS(X, 10), _GRIDPOS(X, 11), - _GRIDPOS(X, 12), _GRIDPOS(X, 13), _GRIDPOS(X, 14), _GRIDPOS(X, 15) - ), - unified_bed_leveling::_mesh_index_to_ypos[GRID_MAX_POINTS_Y] PROGMEM = ARRAY_N(GRID_MAX_POINTS_Y, - _GRIDPOS(Y, 0), _GRIDPOS(Y, 1), _GRIDPOS(Y, 2), _GRIDPOS(Y, 3), - _GRIDPOS(Y, 4), _GRIDPOS(Y, 5), _GRIDPOS(Y, 6), _GRIDPOS(Y, 7), - _GRIDPOS(Y, 8), _GRIDPOS(Y, 9), _GRIDPOS(Y, 10), _GRIDPOS(Y, 11), - _GRIDPOS(Y, 12), _GRIDPOS(Y, 13), _GRIDPOS(Y, 14), _GRIDPOS(Y, 15) - ); + #if ENABLED(ULTIPANEL) + bool unified_bed_leveling::lcd_map_control = false; + #endif - volatile int16_t unified_bed_leveling::encoder_diff; + volatile int unified_bed_leveling::encoder_diff; unified_bed_leveling::unified_bed_leveling() { + ubl_cnt++; // Debug counter to ensure we only have one UBL object present in memory. We can eliminate this (and all references to ubl_cnt) very soon. reset(); } @@ -94,10 +158,10 @@ const bool was_enabled = planner.leveling_active; set_bed_leveling_enabled(false); storage_slot = -1; - ZERO(z_values); - #if ENABLED(EXTENSIBLE_UI) - GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + planner.set_z_fade_height(10.0); #endif + ZERO(z_values); if (was_enabled) report_current_position(); } @@ -107,9 +171,10 @@ } void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { - GRID_LOOP(x, y) { - z_values[x][y] = value; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, value)); + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) { + z_values[x][y] = value; + } } } @@ -122,7 +187,7 @@ if (y < 100) { SERIAL_CHAR(' '); if (y < 10) SERIAL_CHAR(' '); } SERIAL_ECHO(y); SERIAL_CHAR(')'); - serial_delay(5); + safe_delay(5); } static void serial_echo_column_labels(const uint8_t sp) { @@ -132,7 +197,7 @@ SERIAL_ECHO(i); SERIAL_ECHO_SP(sp); } - serial_delay(10); + safe_delay(10); } /** @@ -143,7 +208,9 @@ * 4: Compact Human-Readable */ void unified_bed_leveling::display_map(const int map_type) { - const bool was = gcode.set_autoreport_paused(true); + #if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) + suspend_auto_report = true; + #endif constexpr uint8_t eachsp = 1 + 6 + 1, // [-3.567] twixt = eachsp * (GRID_MAX_POINTS_X) - 9 * 2; // Leading 4sp, Coordinates 9sp each @@ -152,7 +219,7 @@ SERIAL_ECHOPGM("\nBed Topography Report"); if (human) { - SERIAL_ECHOLNPGM(":\n"); + SERIAL_ECHOPGM(":\n\n"); serial_echo_xy(4, MESH_MIN_X, MESH_MAX_Y); serial_echo_xy(twixt, MESH_MAX_X, MESH_MAX_Y); SERIAL_EOL(); @@ -163,10 +230,8 @@ serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); } - // Add XY probe offset from extruder because probe.probe_at_point() subtracts them when - // moving to the XY position to be measured. This ensures better agreement between - // the current Z position after G28 and the mesh values. - const xy_int8_t curr = closest_indexes(xy_pos_t(current_position) + probe.offset_xy); + const float current_xi = get_cell_index_x(current_position[X_AXIS] + (MESH_X_DIST) / 2.0), + current_yi = get_cell_index_y(current_position[Y_AXIS] + (MESH_Y_DIST) / 2.0); if (!lcd) SERIAL_EOL(); for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { @@ -179,10 +244,10 @@ } // Row Values (I indexes) - LOOP_L_N(i, GRID_MAX_POINTS_X) { + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { // Opening Brace or Space - const bool is_current = i == curr.x && j == curr.y; + const bool is_current = i == current_xi && j == current_yi; if (human) SERIAL_CHAR(is_current ? '[' : ' '); // Z Value at current I, J @@ -202,7 +267,7 @@ if (human) SERIAL_CHAR(is_current ? ']' : ' '); SERIAL_FLUSHTX(); - idle_no_sleep(); + idle(); } if (!lcd) SERIAL_EOL(); @@ -219,14 +284,16 @@ SERIAL_EOL(); } - gcode.set_autoreport_paused(was); + #if HAS_AUTO_REPORTING || ENABLED(HOST_KEEPALIVE_FEATURE) + suspend_auto_report = false; + #endif } bool unified_bed_leveling::sanity_check() { uint8_t error_flag = 0; if (settings.calc_num_meshes() < 1) { - SERIAL_ECHOLNPGM("?Mesh too big for EEPROM."); + SERIAL_PROTOCOLLNPGM("?Mesh too big for EEPROM."); error_flag++; } diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 9ac9de1806..2db2b4dd7a 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,27 +16,48 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef UNIFIED_BED_LEVELING_H +#define UNIFIED_BED_LEVELING_H //#define UBL_DEVEL_DEBUGGING +#include "../bedlevel.h" +#include "../../../module/planner.h" #include "../../../module/motion.h" - -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../../../core/debug_out.h" +#include "../../../Marlin.h" #define UBL_VERSION "1.01" #define UBL_OK false #define UBL_ERR true +#define USE_NOZZLE_AS_REFERENCE 0 +#define USE_PROBE_AS_REFERENCE 1 + +// ubl_motion.cpp + +#if ENABLED(UBL_DEVEL_DEBUGGING) + void debug_current_and_destination(const char * const title); +#else + FORCE_INLINE void debug_current_and_destination(const char * const title) { UNUSED(title); } +#endif + +// ubl_G29.cpp + enum MeshPointType : char { INVALID, REAL, SET_IN_BITMAP }; // External references -struct mesh_index_pair; +extern uint8_t ubl_cnt; + +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#if ENABLED(ULTRA_LCD) + void lcd_quick_feedback(const bool clear_buttons); +#endif #define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) #define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) @@ -49,11 +70,10 @@ class unified_bed_leveling { g29_repetition_cnt, g29_storage_slot, g29_map_type; - static bool g29_c_flag; - static float g29_card_thickness, + static bool g29_c_flag, g29_x_flag, g29_y_flag; + static float g29_x_pos, g29_y_pos, + g29_card_thickness, g29_constant; - static xy_pos_t g29_pos; - static xy_bool_t xy_seen; #if HAS_BED_PROBE static int g29_grid_size; @@ -63,36 +83,42 @@ class unified_bed_leveling { static void move_z_with_encoder(const float &multiplier); static float measure_point_with_encoder(); static float measure_business_card_thickness(float in_height); - static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; - static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; + static void manually_probe_remaining_mesh(const float&, const float&, const float&, const float&, const bool) _O0; + static void fine_tune_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map) _O0; #endif static bool g29_parameter_parsing() _O0; static void shift_mesh_height(); - static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; + static void probe_entire_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); + static void g29_what_command(); + static void g29_eeprom_dump(); + static void g29_compare_current_mesh_to_stored_mesh(); static bool smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir); - static inline bool smart_fill_one(const xy_uint8_t &pos, const xy_uint8_t &dir) { - return smart_fill_one(pos.x, pos.y, dir.x, dir.y); - } static void smart_fill_mesh(); - #if ENABLED(UBL_DEVEL_DEBUGGING) - static void g29_what_command(); - static void g29_eeprom_dump(); - static void g29_compare_current_mesh_to_stored_mesh(); - #endif - public: - static void echo_name(); - static void report_current_mesh(); - static void report_state(); + static void echo_name( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); + static void report_current_mesh( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); + static void report_state( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); static void save_ubl_active_state_and_disable(); static void restore_ubl_active_state_and_leave(); static void display_map(const int) _O0; - static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; + static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const float&, const float&, const bool, uint16_t[16]) _O0; static mesh_index_pair find_furthest_invalid_mesh_point() _O0; static void reset(); static void invalidate(); @@ -105,54 +131,66 @@ class unified_bed_leveling { static int8_t storage_slot; - static bed_mesh_t z_values; - static const float _mesh_index_to_xpos[GRID_MAX_POINTS_X], - _mesh_index_to_ypos[GRID_MAX_POINTS_Y]; + static float z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - #if HAS_LCD_MENU + // 15 is the maximum nubmer of grid points supported + 1 safety margin for now, + // until determinism prevails + static constexpr float _mesh_index_to_xpos[16] PROGMEM = { + MESH_MIN_X + 0 * (MESH_X_DIST), MESH_MIN_X + 1 * (MESH_X_DIST), + MESH_MIN_X + 2 * (MESH_X_DIST), MESH_MIN_X + 3 * (MESH_X_DIST), + MESH_MIN_X + 4 * (MESH_X_DIST), MESH_MIN_X + 5 * (MESH_X_DIST), + MESH_MIN_X + 6 * (MESH_X_DIST), MESH_MIN_X + 7 * (MESH_X_DIST), + MESH_MIN_X + 8 * (MESH_X_DIST), MESH_MIN_X + 9 * (MESH_X_DIST), + MESH_MIN_X + 10 * (MESH_X_DIST), MESH_MIN_X + 11 * (MESH_X_DIST), + MESH_MIN_X + 12 * (MESH_X_DIST), MESH_MIN_X + 13 * (MESH_X_DIST), + MESH_MIN_X + 14 * (MESH_X_DIST), MESH_MIN_X + 15 * (MESH_X_DIST) + }; + + static constexpr float _mesh_index_to_ypos[16] PROGMEM = { + MESH_MIN_Y + 0 * (MESH_Y_DIST), MESH_MIN_Y + 1 * (MESH_Y_DIST), + MESH_MIN_Y + 2 * (MESH_Y_DIST), MESH_MIN_Y + 3 * (MESH_Y_DIST), + MESH_MIN_Y + 4 * (MESH_Y_DIST), MESH_MIN_Y + 5 * (MESH_Y_DIST), + MESH_MIN_Y + 6 * (MESH_Y_DIST), MESH_MIN_Y + 7 * (MESH_Y_DIST), + MESH_MIN_Y + 8 * (MESH_Y_DIST), MESH_MIN_Y + 9 * (MESH_Y_DIST), + MESH_MIN_Y + 10 * (MESH_Y_DIST), MESH_MIN_Y + 11 * (MESH_Y_DIST), + MESH_MIN_Y + 12 * (MESH_Y_DIST), MESH_MIN_Y + 13 * (MESH_Y_DIST), + MESH_MIN_Y + 14 * (MESH_Y_DIST), MESH_MIN_Y + 15 * (MESH_Y_DIST) + }; + + #if ENABLED(ULTIPANEL) static bool lcd_map_control; - static void steppers_were_disabled(); - #else - static inline void steppers_were_disabled() {} #endif - static volatile int16_t encoder_diff; // Volatile because buttons may changed it at interrupt time + static volatile int encoder_diff; // Volatile because it's changed at interrupt time. unified_bed_leveling(); FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } - static int8_t cell_index_x(const float &x) { - const int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); + static int8_t get_cell_index_x(const float &x) { + const int8_t cx = (x - (MESH_MIN_X)) * (1.0f / (MESH_X_DIST)); return constrain(cx, 0, (GRID_MAX_POINTS_X) - 1); // -1 is appropriate if we want all movement to the X_MAX } // position. But with this defined this way, it is possible // to extrapolate off of this point even further out. Probably // that is OK because something else should be keeping that from // happening and should not be worried about at this level. - static int8_t cell_index_y(const float &y) { - const int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); + static int8_t get_cell_index_y(const float &y) { + const int8_t cy = (y - (MESH_MIN_Y)) * (1.0f / (MESH_Y_DIST)); return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 1); // -1 is appropriate if we want all movement to the Y_MAX } // position. But with this defined this way, it is possible // to extrapolate off of this point even further out. Probably // that is OK because something else should be keeping that from // happening and should not be worried about at this level. - static inline xy_int8_t cell_indexes(const float &x, const float &y) { - return { cell_index_x(x), cell_index_y(y) }; - } - static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } - - static int8_t closest_x_index(const float &x) { - const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); + static int8_t find_closest_x_index(const float &x) { + const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * (1.0f / (MESH_X_DIST)); return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; } - static int8_t closest_y_index(const float &y) { - const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); + + static int8_t find_closest_y_index(const float &y) { + const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * (1.0f / (MESH_Y_DIST)); return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; } - static inline xy_int8_t closest_indexes(const xy_pos_t &xy) { - return { closest_x_index(xy.x), closest_y_index(xy.y) }; - } /** * z2 --| @@ -179,11 +217,16 @@ class unified_bed_leveling { */ static inline float z_correction_for_x_on_horizontal_mesh_line(const float &rx0, const int x1_i, const int yi) { if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { - - if (DEBUGGING(LEVELING)) { - if (WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); - DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_x_on_horizontal_mesh_line(rx0=", rx0, ",x1_i=", x1_i, ",yi=", yi, ")"); - } + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + serialprintPGM( !WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) ? PSTR("x1_i") : PSTR("yi") ); + SERIAL_ECHOPAIR(" out of bounds in z_correction_for_x_on_horizontal_mesh_line(rx0=", rx0); + SERIAL_ECHOPAIR(",x1_i=", x1_i); + SERIAL_ECHOPAIR(",yi=", yi); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. return ( @@ -195,10 +238,10 @@ class unified_bed_leveling { ); } - const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST), + const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * (1.0f / (MESH_X_DIST)), z1 = z_values[x1_i][yi]; - return z1 + xratio * (z_values[_MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array + return z1 + xratio * (z_values[MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array // If it is, it is clamped to the last element of the // z_values[][] array and no correction is applied. } @@ -208,11 +251,16 @@ class unified_bed_leveling { // static inline float z_correction_for_y_on_vertical_mesh_line(const float &ry0, const int xi, const int y1_i) { if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { - - if (DEBUGGING(LEVELING)) { - if (WITHIN(xi, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); - DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_y_on_vertical_mesh_line(ry0=", ry0, ", xi=", xi, ", y1_i=", y1_i, ")"); - } + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + serialprintPGM( !WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) ? PSTR("xi") : PSTR("y1_i") ); + SERIAL_ECHOPAIR(" out of bounds in z_correction_for_y_on_vertical_mesh_line(ry0=", ry0); + SERIAL_ECHOPAIR(", xi=", xi); + SERIAL_ECHOPAIR(", y1_i=", y1_i); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. return ( @@ -224,10 +272,10 @@ class unified_bed_leveling { ); } - const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST), + const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * (1.0f / (MESH_Y_DIST)), z1 = z_values[xi][y1_i]; - return z1 + yratio * (z_values[xi][_MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array + return z1 + yratio * (z_values[xi][MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array // If it is, it is clamped to the last element of the // z_values[][] array and no correction is applied. } @@ -239,7 +287,8 @@ class unified_bed_leveling { * on the Y position within the cell. */ static float get_z_correction(const float &rx0, const float &ry0) { - const int8_t cx = cell_index_x(rx0), cy = cell_index_y(ry0); // return values are clamped + const int8_t cx = get_cell_index_x(rx0), + cy = get_cell_index_y(ry0); // return values are clamped /** * Check if the requested location is off the mesh. If so, and @@ -252,22 +301,33 @@ class unified_bed_leveling { const float z1 = calc_z0(rx0, mesh_index_to_xpos(cx), z_values[cx][cy], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); + mesh_index_to_xpos(cx + 1), z_values[MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); const float z2 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); + mesh_index_to_xpos(cx), z_values[cx][MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], + mesh_index_to_xpos(cx + 1), z_values[MIN(cx, GRID_MAX_POINTS_X - 2) + 1][MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); float z0 = calc_z0(ry0, mesh_index_to_ypos(cy), z1, mesh_index_to_ypos(cy + 1), z2); - if (DEBUGGING(MESH_ADJUST)) { - DEBUG_ECHOPAIR(" raw get_z_correction(", rx0); - DEBUG_CHAR(','); DEBUG_ECHO(ry0); - DEBUG_ECHOPAIR_F(") = ", z0, 6); - DEBUG_ECHOLNPAIR_F(" >>>---> ", z0, 6); - } + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(MESH_ADJUST)) { + SERIAL_ECHOPAIR(" raw get_z_correction(", rx0); + SERIAL_CHAR(','); + SERIAL_ECHO(ry0); + SERIAL_ECHOPGM(") = "); + SERIAL_ECHO_F(z0, 6); + } + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(MESH_ADJUST)) { + SERIAL_ECHOPGM(" >>>---> "); + SERIAL_ECHO_F(z0, 6); + SERIAL_EOL(); + } + #endif if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN z0 = 0.0; // in ubl.z_values[][] and propagate through the @@ -275,33 +335,37 @@ class unified_bed_leveling { // because part of the Mesh is undefined and we don't have the // information we need to complete the height correction. - if (DEBUGGING(MESH_ADJUST)) { - DEBUG_ECHOPAIR("??? Yikes! NAN in get_z_correction(", rx0); - DEBUG_CHAR(','); - DEBUG_ECHO(ry0); - DEBUG_CHAR(')'); - DEBUG_EOL(); - } + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(MESH_ADJUST)) { + SERIAL_ECHOPAIR("??? Yikes! NAN in get_z_correction(", rx0); + SERIAL_CHAR(','); + SERIAL_ECHO(ry0); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif } return z0; } - static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } - static inline float mesh_index_to_xpos(const uint8_t i) { + FORCE_INLINE static float mesh_index_to_xpos(const uint8_t i) { return i < GRID_MAX_POINTS_X ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); } - static inline float mesh_index_to_ypos(const uint8_t i) { + + FORCE_INLINE static float mesh_index_to_ypos(const uint8_t i) { return i < GRID_MAX_POINTS_Y ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); } #if UBL_SEGMENTED - static bool line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s); + static bool prepare_segmented_line_to(const float (&rtarget)[XYZE], const float &feedrate); #else - static void line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t e); + static void line_to_destination_cartesian(const float &fr, const uint8_t e); #endif static inline bool mesh_is_valid() { - GRID_LOOP(x, y) if (isnan(z_values[x][y])) return false; + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + if (isnan(z_values[x][y])) return false; return true; } @@ -309,9 +373,4 @@ class unified_bed_leveling { extern unified_bed_leveling ubl; -#define _GET_MESH_X(I) ubl.mesh_index_to_xpos(I) -#define _GET_MESH_Y(J) ubl.mesh_index_to_ypos(J) -#define Z_VALUES_ARR ubl.z_values - -// Prevent debugging propagating to other files -#include "../../../core/debug_out.h" +#endif // UNIFIED_BED_LEVELING_H diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index e41af9f3cd..8f5bc95d76 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,48 +24,39 @@ #if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../bedlevel.h" + //#define UBL_DEVEL_DEBUGGING - #include "../../../MarlinCore.h" - #include "../../../HAL/shared/eeprom_api.h" - #include "../../../libs/hex_print.h" - #include "../../../module/settings.h" + #include "ubl.h" + + #include "../../../Marlin.h" + #include "../../../HAL/shared/persistent_store_api.h" + #include "../../../libs/hex_print_routines.h" + #include "../../../module/configuration_store.h" #include "../../../lcd/ultralcd.h" #include "../../../module/stepper.h" #include "../../../module/planner.h" - #include "../../../module/motion.h" #include "../../../module/probe.h" #include "../../../gcode/gcode.h" + #include "../../../core/serial.h" + #include "../../../gcode/parser.h" + #include "../../../feature/bedlevel/bedlevel.h" #include "../../../libs/least_squares_fit.h" - #if HAS_MULTI_HOTEND + #if ENABLED(DUAL_X_CARRIAGE) #include "../../../module/tool_change.h" #endif - #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) - #include "../../../core/debug_out.h" - - #if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" - #endif + #include #include #define UBL_G29_P31 - #if HAS_LCD_MENU - - bool unified_bed_leveling::lcd_map_control = false; - - void unified_bed_leveling::steppers_were_disabled() { - if (lcd_map_control) { - lcd_map_control = false; - ui.defer_status_screen(false); - } - } - - void ubl_map_screen(); + extern float destination[XYZE], current_position[XYZE]; + #if ENABLED(NEWPANEL) + void lcd_return_to_status(); + void _lcd_ubl_output_map_lcd(); #endif #define SIZE_OF_LITTLE_RAISE 1 @@ -76,11 +67,13 @@ unified_bed_leveling::g29_repetition_cnt, unified_bed_leveling::g29_storage_slot = 0, unified_bed_leveling::g29_map_type; - bool unified_bed_leveling::g29_c_flag; - float unified_bed_leveling::g29_card_thickness = 0, + bool unified_bed_leveling::g29_c_flag, + unified_bed_leveling::g29_x_flag, + unified_bed_leveling::g29_y_flag; + float unified_bed_leveling::g29_x_pos, + unified_bed_leveling::g29_y_pos, + unified_bed_leveling::g29_card_thickness = 0, unified_bed_leveling::g29_constant = 0; - xy_bool_t unified_bed_leveling::xy_seen; - xy_pos_t unified_bed_leveling::g29_pos; #if HAS_BED_PROBE int unified_bed_leveling::g29_grid_size; @@ -137,6 +130,9 @@ * J # Grid Perform a Grid Based Leveling of the current Mesh using a grid with n points on a side. * Not specifying a grid size will invoke the 3-Point leveling function. * + * K # Kompare Kompare current Mesh with stored Mesh # replacing current Mesh with the result. This + * command literally performs a diff between two Meshes. + * * L Load Load Mesh from the previously activated location in the EEPROM. * * L # Load Load Mesh from the specified location in the EEPROM. Set this location as activated @@ -263,7 +259,7 @@ * T Topology Display the Mesh Map Topology. * 'T' can be used alone (e.g., G29 T) or in combination with most of the other commands. * This option works with all Phase commands (e.g., G29 P4 R 5 T X 50 Y100 C -.1 O) - * This parameter can also specify a Map Type. T0 (the default) is user-readable. T1 + * This parameter can also specify a Map Type. T0 (the default) is user-readable. T1 can * is suitable to paste into a spreadsheet for a 3D graph of the mesh. * * U Unlevel Perform a probe of the outer perimeter to assist in physically leveling unlevel beds. @@ -272,20 +268,12 @@ * * V # Verbosity Set the verbosity level (0-4) for extra details. (Default 0) * + * W What? Display valuable Unified Bed Leveling System data. + * * X # X Location for this command * * Y # Y Location for this command * - * With UBL_DEVEL_DEBUGGING: - * - * K # Kompare Kompare current Mesh with stored Mesh #, replacing current Mesh with the result. - * This command literally performs a diff between two Meshes. - * - * Q-1 Dump EEPROM Dump the UBL contents stored in EEPROM as HEX format. Useful for developers to help - * verify correct operation of the UBL. - * - * W What? Display valuable UBL data. - * * * Release Notes: * You MUST do M502, M500 to initialize the storage. Failure to do this will cause all @@ -297,7 +285,7 @@ * especially better for Delta printers, since it populates the center of the mesh first, allowing for * a quicker test print to verify settings. You don't need to populate the entire mesh to use it. * After all, you don't want to spend a lot of time generating a mesh only to realize the resolution - * or probe offsets are incorrect. Mesh-generation gathers points starting closest to the nozzle unless + * or zprobe_zoffset are incorrect. Mesh-generation gathers points starting closest to the nozzle unless * an (X,Y) coordinate pair is given. * * Unified Bed Leveling uses a lot of EEPROM storage to hold its data, and it takes some effort to get @@ -311,18 +299,17 @@ void unified_bed_leveling::G29() { - bool probe_deployed = false; if (g29_parameter_parsing()) return; // Abort on parameter error const int8_t p_val = parser.intval('P', -1); const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); - TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); // Check for commands that require the printer to be homed if (may_move) { - planner.synchronize(); - if (axes_should_home()) gcode.home_all_axes(); - TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); + if (axis_unhomed_error()) gcode.home_all_axes(); + #if ENABLED(DUAL_X_CARRIAGE) + if (active_extruder != 0) tool_change(0); + #endif } // Invalidate Mesh Points. This command is a little bit asymmetrical because @@ -336,67 +323,53 @@ else { while (g29_repetition_cnt--) { if (cnt > 20) { cnt = 0; idle(); } - const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, g29_pos); - const xy_int8_t &cpos = closest.pos; - if (cpos.x < 0) { - // No more REAL mesh points to invalidate, so we ASSUME the user + const mesh_index_pair location = find_closest_mesh_point_of_type(REAL, g29_x_pos, g29_y_pos, USE_NOZZLE_AS_REFERENCE, NULL); + if (location.x_index < 0) { + // No more REACHABLE mesh points to invalidate, so we ASSUME the user // meant to invalidate the ENTIRE mesh, which cannot be done with - // find_closest_mesh_point loop which only returns REAL points. + // find_closest_mesh_point loop which only returns REACHABLE points. set_all_mesh_points_to_value(NAN); - SERIAL_ECHOLNPGM("Entire Mesh invalidated.\n"); + SERIAL_PROTOCOLLNPGM("Entire Mesh invalidated.\n"); break; // No more invalid Mesh Points to populate } - z_values[cpos.x][cpos.y] = NAN; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, 0.0f)); + z_values[location.x_index][location.y_index] = NAN; cnt++; } } - SERIAL_ECHOLNPGM("Locations invalidated.\n"); + SERIAL_PROTOCOLLNPGM("Locations invalidated.\n"); } if (parser.seen('Q')) { const int test_pattern = parser.has_value() ? parser.value_int() : -99; if (!WITHIN(test_pattern, -1, 2)) { - SERIAL_ECHOLNPGM("Invalid test_pattern value. (-1 to 2)\n"); + SERIAL_PROTOCOLLNPGM("Invalid test_pattern value. (-1 to 2)\n"); return; } - SERIAL_ECHOLNPGM("Loading test_pattern values.\n"); + SERIAL_PROTOCOLLNPGM("Loading test_pattern values.\n"); switch (test_pattern) { - - #if ENABLED(UBL_DEVEL_DEBUGGING) - case -1: - g29_eeprom_dump(); - break; - #endif - + case -1: + g29_eeprom_dump(); + break; case 0: - GRID_LOOP(x, y) { // Create a bowl shape similar to a poorly-calibrated Delta - const float p1 = 0.5f * (GRID_MAX_POINTS_X) - x, - p2 = 0.5f * (GRID_MAX_POINTS_Y) - y; - z_values[x][y] += 2.0f * HYPOT(p1, p2); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { // Create a bowl shape - similar to + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) { // a poorly calibrated Delta. + const float p1 = 0.5f * (GRID_MAX_POINTS_X) - x, + p2 = 0.5f * (GRID_MAX_POINTS_Y) - y; + z_values[x][y] += 2.0f * HYPOT(p1, p2); + } } break; - case 1: - LOOP_L_N(x, GRID_MAX_POINTS_X) { // Create a diagonal line several Mesh cells thick that is raised + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { // Create a diagonal line several Mesh cells thick that is raised z_values[x][x] += 9.999f; - z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick - #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(x, x, z_values[x][x]); - ExtUI::onMeshUpdate(x, (x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1), z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1]); - #endif - + z_values[x][x + (x < GRID_MAX_POINTS_Y - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick } break; - case 2: // Allow the user to specify the height because 10mm is a little extreme in some cases. - for (uint8_t x = (GRID_MAX_POINTS_X) / 3; x < 2 * (GRID_MAX_POINTS_X) / 3; x++) // Create a rectangular raised area in - for (uint8_t y = (GRID_MAX_POINTS_Y) / 3; y < 2 * (GRID_MAX_POINTS_Y) / 3; y++) { // the center of the bed + for (uint8_t x = (GRID_MAX_POINTS_X) / 3; x < 2 * (GRID_MAX_POINTS_X) / 3; x++) // Create a rectangular raised area in + for (uint8_t y = (GRID_MAX_POINTS_Y) / 3; y < 2 * (GRID_MAX_POINTS_Y) / 3; y++) // the center of the bed z_values[x][y] += parser.seen('C') ? g29_constant : 9.99f; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } break; } } @@ -404,14 +377,19 @@ #if HAS_BED_PROBE if (parser.seen('J')) { - save_ubl_active_state_and_disable(); - tilt_mesh_based_on_probed_grid(g29_grid_size == 0); // Zero size does 3-Point - restore_ubl_active_state_and_leave(); - #if ENABLED(UBL_G29_J_RECENTER) - do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); - #endif + if (g29_grid_size) { // if not 0 it is a normal n x n grid being probed + save_ubl_active_state_and_disable(); + tilt_mesh_based_on_probed_grid(false /* false says to do normal grid probing */ ); + restore_ubl_active_state_and_leave(); + } + else { // grid_size == 0 : A 3-Point leveling has been requested + + save_ubl_active_state_and_disable(); + tilt_mesh_based_on_probed_grid(true /* true says to do 3-Point leveling */ ); + restore_ubl_active_state_and_leave(); + } + do_blocking_move_to_xy(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y))); report_current_position(); - probe_deployed = true; } #endif // HAS_BED_PROBE @@ -419,7 +397,7 @@ if (parser.seen('P')) { if (WITHIN(g29_phase_value, 0, 1) && storage_slot == -1) { storage_slot = 0; - SERIAL_ECHOLNPGM("Default storage slot 0 selected."); + SERIAL_PROTOCOLLNPGM("Default storage slot 0 selected."); } switch (g29_phase_value) { @@ -428,44 +406,42 @@ // Zero Mesh Data // reset(); - SERIAL_ECHOLNPGM("Mesh zeroed."); + SERIAL_PROTOCOLLNPGM("Mesh zeroed."); break; #if HAS_BED_PROBE - case 1: { + case 1: // // Invalidate Entire Mesh and Automatically Probe Mesh in areas that can be reached by the probe // if (!parser.seen('C')) { invalidate(); - SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); + SERIAL_PROTOCOLLNPGM("Mesh invalidated. Probing mesh."); } if (g29_verbose_level > 1) { - SERIAL_ECHOPAIR("Probing around (", g29_pos.x); - SERIAL_CHAR(','); - SERIAL_DECIMAL(g29_pos.y); - SERIAL_ECHOLNPGM(").\n"); + SERIAL_PROTOCOLPAIR("Probing Mesh Points Closest to (", g29_x_pos); + SERIAL_PROTOCOLCHAR(','); + SERIAL_PROTOCOL(g29_y_pos); + SERIAL_PROTOCOLLNPGM(").\n"); } - const xy_pos_t near_probe_xy = g29_pos + probe.offset_xy; - probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); + probe_entire_mesh(g29_x_pos + X_PROBE_OFFSET_FROM_EXTRUDER, g29_y_pos + Y_PROBE_OFFSET_FROM_EXTRUDER, + parser.seen('T'), parser.seen('E'), parser.seen('U')); report_current_position(); - probe_deployed = true; - } break; + break; #endif // HAS_BED_PROBE case 2: { - #if HAS_LCD_MENU + #if ENABLED(NEWPANEL) // // Manually Probe Mesh in areas that can't be reached by the probe // - SERIAL_ECHOLNPGM("Manually probing unreachable points."); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - - if (parser.seen('C') && !xy_seen) { + SERIAL_PROTOCOLLNPGM("Manually probing unreachable mesh locations."); + do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); + if (parser.seen('C') && !g29_x_flag && !g29_y_flag) { /** * Use a good default location for the path. * The flipped > and < operators in these comparisons is intentional. @@ -473,40 +449,38 @@ * It may make sense to have Delta printers default to the center of the bed. * Until that is decided, this can be forced with the X and Y parameters. */ - g29_pos.set( - #if IS_KINEMATIC - X_HOME_POS, Y_HOME_POS - #else - probe.offset_xy.x > 0 ? X_BED_SIZE : 0, - probe.offset_xy.y < 0 ? Y_BED_SIZE : 0 - #endif - ); + #if IS_KINEMATIC + g29_x_pos = X_HOME_POS; + g29_y_pos = Y_HOME_POS; + #else // cartesian + g29_x_pos = X_PROBE_OFFSET_FROM_EXTRUDER > 0 ? X_BED_SIZE : 0; + g29_y_pos = Y_PROBE_OFFSET_FROM_EXTRUDER < 0 ? Y_BED_SIZE : 0; + #endif } if (parser.seen('B')) { - g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(float(Z_CLEARANCE_BETWEEN_PROBES)); + g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness((float) Z_CLEARANCE_BETWEEN_PROBES); if (ABS(g29_card_thickness) > 1.5f) { - SERIAL_ECHOLNPGM("?Error in Business Card measurement."); + SERIAL_PROTOCOLLNPGM("?Error in Business Card measurement."); return; } - probe_deployed = true; } - if (!position_is_reachable(g29_pos)) { - SERIAL_ECHOLNPGM("XY outside printable radius."); + if (!position_is_reachable(g29_x_pos, g29_y_pos)) { + SERIAL_PROTOCOLLNPGM("XY outside printable radius."); return; } const float height = parser.floatval('H', Z_CLEARANCE_BETWEEN_PROBES); - manually_probe_remaining_mesh(g29_pos, height, g29_card_thickness, parser.seen('T')); + manually_probe_remaining_mesh(g29_x_pos, g29_y_pos, height, g29_card_thickness, parser.seen('T')); - SERIAL_ECHOLNPGM("G29 P2 finished."); + SERIAL_PROTOCOLLNPGM("G29 P2 finished."); report_current_position(); #else - SERIAL_ECHOLNPGM("?P2 is only available when an LCD is present."); + SERIAL_PROTOCOLLNPGM("?P2 is only available when an LCD is present."); return; #endif @@ -526,18 +500,17 @@ } else { while (g29_repetition_cnt--) { // this only populates reachable mesh points near - const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, g29_pos); - const xy_int8_t &cpos = closest.pos; - if (cpos.x < 0) { - // No more REAL INVALID mesh points to populate, so we ASSUME + const mesh_index_pair location = find_closest_mesh_point_of_type(INVALID, g29_x_pos, g29_y_pos, USE_NOZZLE_AS_REFERENCE, NULL); + if (location.x_index < 0) { + // No more REACHABLE INVALID mesh points to populate, so we ASSUME // user meant to populate ALL INVALID mesh points to value - GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = g29_constant; + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + if (isnan(z_values[x][y])) + z_values[x][y] = g29_constant; break; // No more invalid Mesh Points to populate } - else { - z_values[cpos.x][cpos.y] = g29_constant; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, g29_constant)); - } + z_values[location.x_index][location.y_index] = g29_constant; } } } @@ -569,10 +542,10 @@ } case 4: // Fine Tune (i.e., Edit) the Mesh - #if HAS_LCD_MENU - fine_tune_mesh(g29_pos, parser.seen('T')); + #if ENABLED(NEWPANEL) + fine_tune_mesh(g29_x_pos, g29_y_pos, parser.seen('T')); #else - SERIAL_ECHOLNPGM("?P4 is only available when an LCD is present."); + SERIAL_PROTOCOLLNPGM("?P4 is only available when an LCD is present."); return; #endif break; @@ -583,24 +556,19 @@ } } - #if ENABLED(UBL_DEVEL_DEBUGGING) + // + // Much of the 'What?' command can be eliminated. But until we are fully debugged, it is + // good to have the extra information. Soon... we prune this to just a few items + // + if (parser.seen('W')) g29_what_command(); - // - // Much of the 'What?' command can be eliminated. But until we are fully debugged, it is - // good to have the extra information. Soon... we prune this to just a few items - // - if (parser.seen('W')) g29_what_command(); - - // - // When we are fully debugged, this may go away. But there are some valid - // use cases for the users. So we can wait and see what to do with it. - // - - if (parser.seen('K')) // Kompare Current Mesh Data to Specified Stored Mesh - g29_compare_current_mesh_to_stored_mesh(); - - #endif // UBL_DEVEL_DEBUGGING + // + // When we are fully debugged, this may go away. But there are some valid + // use cases for the users. So we can wait and see what to do with it. + // + if (parser.seen('K')) // Kompare Current Mesh Data to Specified Stored Mesh + g29_compare_current_mesh_to_stored_mesh(); // // Load a Mesh from the EEPROM @@ -612,19 +580,20 @@ int16_t a = settings.calc_num_meshes(); if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); + SERIAL_PROTOCOLLNPGM("?EEPROM storage not available."); return; } if (!WITHIN(g29_storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + SERIAL_PROTOCOLLNPGM("?Invalid storage slot."); + SERIAL_PROTOCOLLNPAIR("?Use 0 to ", a - 1); return; } settings.load_mesh(g29_storage_slot); storage_slot = g29_storage_slot; - SERIAL_ECHOLNPGM("Done."); + SERIAL_PROTOCOLLNPGM("Done."); } // @@ -640,19 +609,20 @@ int16_t a = settings.calc_num_meshes(); if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); + SERIAL_PROTOCOLLNPGM("?EEPROM storage not available."); goto LEAVE; } if (!WITHIN(g29_storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + SERIAL_PROTOCOLLNPGM("?Invalid storage slot."); + SERIAL_PROTOCOLLNPAIR("?Use 0 to ", a - 1); goto LEAVE; } settings.store_mesh(g29_storage_slot); storage_slot = g29_storage_slot; - SERIAL_ECHOLNPGM("Done."); + SERIAL_PROTOCOLLNPGM("Done."); } if (parser.seen('T')) @@ -660,35 +630,25 @@ LEAVE: - #if HAS_LCD_MENU - ui.reset_alert_level(); - ui.quick_feedback(); - ui.reset_status(); - ui.release(); + #if ENABLED(NEWPANEL) + lcd_reset_alert_level(); + lcd_quick_feedback(true); + lcd_reset_status(); + lcd_external_control = false; #endif - #ifdef Z_PROBE_END_SCRIPT - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); - if (probe_deployed) { - planner.synchronize(); - gcode.process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT)); - } - #else - UNUSED(probe_deployed); - #endif - - TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index)); return; } void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) { float sum = 0; int n = 0; - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - sum += z_values[x][y]; - n++; - } + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + if (!isnan(z_values[x][y])) { + sum += z_values[x][y]; + n++; + } const float mean = sum / n; @@ -696,134 +656,136 @@ // Sum the squares of difference from mean // float sum_of_diff_squared = 0; - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) - sum_of_diff_squared += sq(z_values[x][y] - mean); + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + if (!isnan(z_values[x][y])) + sum_of_diff_squared += sq(z_values[x][y] - mean); SERIAL_ECHOLNPAIR("# of samples: ", n); - SERIAL_ECHOLNPAIR_F("Mean Mesh Height: ", mean, 6); + SERIAL_ECHOPGM("Mean Mesh Height: "); + SERIAL_ECHO_F(mean, 6); + SERIAL_EOL(); const float sigma = SQRT(sum_of_diff_squared / (n + 1)); - SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); + SERIAL_ECHOPGM("Standard Deviation: "); + SERIAL_ECHO_F(sigma, 6); + SERIAL_EOL(); if (cflag) - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - z_values[x][y] -= mean + value; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + if (!isnan(z_values[x][y])) + z_values[x][y] -= mean + value; } void unified_bed_leveling::shift_mesh_height() { - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - z_values[x][y] += g29_constant; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + if (!isnan(z_values[x][y])) + z_values[x][y] += g29_constant; } + #if ENABLED(NEWPANEL) + + typedef void (*clickFunc_t)(); + + bool click_and_hold(const clickFunc_t func=NULL) { + if (is_lcd_clicked()) { + lcd_quick_feedback(false); // Do NOT clear button status! If cleared, the code + // code can not look for a 'click and hold' + const millis_t nxt = millis() + 1500UL; + while (is_lcd_clicked()) { // Loop while the encoder is pressed. Uses hardware flag! + idle(); // idle, of course + if (ELAPSED(millis(), nxt)) { // After 1.5 seconds + lcd_quick_feedback(true); + if (func) (*func)(); + wait_for_release(); + safe_delay(50); // Debounce the Encoder wheel + return true; + } + } + } + safe_delay(15); + return false; + } + + #endif // NEWPANEL + #if HAS_BED_PROBE /** * Probe all invalidated locations of the mesh that can be reached by the probe. * This attempts to fill in locations closest to the nozzle's start location first. */ - void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { - probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW + void unified_bed_leveling::probe_entire_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { + mesh_index_pair location; - TERN_(HAS_LCD_MENU, ui.capture()); + #if ENABLED(NEWPANEL) + lcd_external_control = true; + #endif - save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained - uint8_t count = GRID_MAX_POINTS; + save_ubl_active_state_and_disable(); // we don't do bed level correction because we want the raw data when we probe + DEPLOY_PROBE(); + + uint16_t count = GRID_MAX_POINTS; - mesh_index_pair best; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); do { if (do_ubl_mesh_map) display_map(g29_map_type); - const int point_num = (GRID_MAX_POINTS) - count + 1; - SERIAL_ECHOLNPAIR("\nProbing mesh point ", point_num, "/", int(GRID_MAX_POINTS), ".\n"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); - - #if HAS_LCD_MENU - if (ui.button_pressed()) { - ui.quick_feedback(false); // Preserve button state for click-and-hold - SERIAL_ECHOLNPGM("\nMesh only partially populated.\n"); - ui.wait_for_release(); - ui.quick_feedback(); - ui.release(); - probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW - return restore_ubl_active_state_and_leave(); + #if ENABLED(NEWPANEL) + if (is_lcd_clicked()) { + SERIAL_PROTOCOLLNPGM("\nMesh only partially populated.\n"); + lcd_quick_feedback(false); + STOW_PROBE(); + while (is_lcd_clicked()) idle(); + lcd_external_control = false; + restore_ubl_active_state_and_leave(); + lcd_quick_feedback(true); + safe_delay(50); // Debounce the Encoder wheel + return; } #endif - best = do_furthest - ? find_furthest_invalid_mesh_point() - : find_closest_mesh_point_of_type(INVALID, near, true); + if (do_furthest) + location = find_furthest_invalid_mesh_point(); + else + location = find_closest_mesh_point_of_type(INVALID, rx, ry, USE_PROBE_AS_REFERENCE, NULL); - if (best.pos.x >= 0) { // mesh point found and is reachable by probe - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); - const float measured_z = probe.probe_at_point( - best.meshpos(), - stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level - ); - z_values[best.pos.x][best.pos.y] = measured_z; - #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_FINISH); - ExtUI::onMeshUpdate(best.pos, measured_z); - #endif + if (location.x_index >= 0) { // mesh point found and is reachable by probe + const float rawx = mesh_index_to_xpos(location.x_index), + rawy = mesh_index_to_ypos(location.y_index); + + const float measured_z = probe_pt(rawx, rawy, stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling + z_values[location.x_index][location.y_index] = measured_z; } SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } while (location.x_index >= 0 && --count); - } while (best.pos.x >= 0 && --count); + STOW_PROBE(); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_FINISH)); - - // Release UI during stow to allow for PAUSE_BEFORE_DEPLOY_STOW - TERN_(HAS_LCD_MENU, ui.release()); - probe.stow(); - TERN_(HAS_LCD_MENU, ui.capture()); - - probe.move_z_after_probing(); + #ifdef Z_AFTER_PROBING + move_z_after_probing(); + #endif restore_ubl_active_state_and_leave(); do_blocking_move_to_xy( - constrain(near.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), - constrain(near.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) + constrain(rx - (X_PROBE_OFFSET_FROM_EXTRUDER), MESH_MIN_X, MESH_MAX_X), + constrain(ry - (Y_PROBE_OFFSET_FROM_EXTRUDER), MESH_MIN_Y, MESH_MAX_Y) ); } + #endif // HAS_BED_PROBE - #if HAS_LCD_MENU - - typedef void (*clickFunc_t)(); - - bool click_and_hold(const clickFunc_t func=nullptr) { - if (ui.button_pressed()) { - ui.quick_feedback(false); // Preserve button state for click-and-hold - const millis_t nxt = millis() + 1500UL; - while (ui.button_pressed()) { // Loop while the encoder is pressed. Uses hardware flag! - idle(); // idle, of course - if (ELAPSED(millis(), nxt)) { // After 1.5 seconds - ui.quick_feedback(); - if (func) (*func)(); - ui.wait_for_release(); - return true; - } - } - } - serial_delay(15); - return false; - } + #if ENABLED(NEWPANEL) void unified_bed_leveling::move_z_with_encoder(const float &multiplier) { - ui.wait_for_release(); - while (!ui.button_pressed()) { + wait_for_release(); + while (!is_lcd_clicked()) { idle(); gcode.reset_stepper_timeout(); // Keep steppers powered if (encoder_diff) { - do_blocking_move_to_z(current_position.z + float(encoder_diff) * multiplier); + do_blocking_move_to_z(current_position[Z_AXIS] + float(encoder_diff) * multiplier); encoder_diff = 0; } } @@ -832,81 +794,92 @@ float unified_bed_leveling::measure_point_with_encoder() { KEEPALIVE_STATE(PAUSED_FOR_USER); move_z_with_encoder(0.01f); - return current_position.z; + KEEPALIVE_STATE(IN_HANDLER); + return current_position[Z_AXIS]; } - static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); } + static void echo_and_take_a_measurement() { SERIAL_PROTOCOLLNPGM(" and take a measurement."); } float unified_bed_leveling::measure_business_card_thickness(float in_height) { - ui.capture(); + lcd_external_control = true; save_ubl_active_state_and_disable(); // Disable bed level correction for probing do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), in_height); - //, _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) * 0.5f); + //, MIN(planner.max_feedrate_mm_s[X_AXIS], planner.max_feedrate_mm_s[Y_AXIS]) * 0.5f); planner.synchronize(); - SERIAL_ECHOPGM("Place shim under nozzle"); + SERIAL_PROTOCOLPGM("Place shim under nozzle"); LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); - ui.return_to_status(); + lcd_return_to_status(); echo_and_take_a_measurement(); const float z1 = measure_point_with_encoder(); - do_blocking_move_to_z(current_position.z + SIZE_OF_LITTLE_RAISE); + do_blocking_move_to_z(current_position[Z_AXIS] + SIZE_OF_LITTLE_RAISE); planner.synchronize(); - SERIAL_ECHOPGM("Remove shim"); + SERIAL_PROTOCOLPGM("Remove shim"); LCD_MESSAGEPGM(MSG_UBL_BC_REMOVE); echo_and_take_a_measurement(); const float z2 = measure_point_with_encoder(); - do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES); + + do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES); const float thickness = ABS(z1 - z2); if (g29_verbose_level > 1) { - SERIAL_ECHOPAIR_F("Business Card is ", thickness, 4); - SERIAL_ECHOLNPGM("mm thick."); + SERIAL_PROTOCOLPGM("Business Card is "); + SERIAL_PROTOCOL_F(thickness, 4); + SERIAL_PROTOCOLLNPGM("mm thick."); } + lcd_external_control = false; + restore_ubl_active_state_and_leave(); return thickness; } - void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { - ui.capture(); + void abort_manual_probe_remaining_mesh() { + SERIAL_PROTOCOLLNPGM("\nMesh only partially populated."); + do_blocking_move_to_z(Z_CLEARANCE_DEPLOY_PROBE); + lcd_external_control = false; + KEEPALIVE_STATE(IN_HANDLER); + lcd_quick_feedback(true); + ubl.restore_ubl_active_state_and_leave(); + } - save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained - do_blocking_move_to_xy_z(current_position, z_clearance); + void unified_bed_leveling::manually_probe_remaining_mesh(const float &rx, const float &ry, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { - ui.return_to_status(); + lcd_external_control = true; + + save_ubl_active_state_and_disable(); // we don't do bed level correction because we want the raw data when we probe + do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], z_clearance); + + lcd_return_to_status(); mesh_index_pair location; - const xy_int8_t &lpos = location.pos; do { - location = find_closest_mesh_point_of_type(INVALID, pos); + location = find_closest_mesh_point_of_type(INVALID, rx, ry, USE_NOZZLE_AS_REFERENCE, NULL); // It doesn't matter if the probe can't reach the NAN location. This is a manual probe. - if (!location.valid()) continue; + if (location.x_index < 0 && location.y_index < 0) continue; - const xyz_pos_t ppos = { - mesh_index_to_xpos(lpos.x), - mesh_index_to_ypos(lpos.y), - Z_CLEARANCE_BETWEEN_PROBES - }; + const float xProbe = mesh_index_to_xpos(location.x_index), + yProbe = mesh_index_to_ypos(location.y_index); - if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) + if (!position_is_reachable(xProbe, yProbe)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) LCD_MESSAGEPGM(MSG_UBL_MOVING_TO_NEXT); - do_blocking_move_to(ppos); - do_z_clearance(z_clearance); + do_blocking_move_to(xProbe, yProbe, Z_CLEARANCE_BETWEEN_PROBES); + do_blocking_move_to_z(z_clearance); KEEPALIVE_STATE(PAUSED_FOR_USER); - ui.capture(); + lcd_external_control = true; if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing - serialprintPGM(parser.seen('B') ? GET_TEXT(MSG_UBL_BC_INSERT) : GET_TEXT(MSG_UBL_BC_INSERT2)); + serialprintPGM(parser.seen('B') ? PSTR(MSG_UBL_BC_INSERT) : PSTR(MSG_UBL_BC_INSERT2)); const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click @@ -914,160 +887,59 @@ move_z_with_encoder(z_step); if (click_and_hold()) { - SERIAL_ECHOLNPGM("\nMesh only partially populated."); - do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); - return restore_ubl_active_state_and_leave(); + SERIAL_PROTOCOLLNPGM("\nMesh only partially populated."); + do_blocking_move_to_z(Z_CLEARANCE_DEPLOY_PROBE); + lcd_external_control = false; + KEEPALIVE_STATE(IN_HANDLER); + restore_ubl_active_state_and_leave(); + return; } - z_values[lpos.x][lpos.y] = current_position.z - thick; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y])); - - if (g29_verbose_level > 2) - SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); + z_values[location.x_index][location.y_index] = current_position[Z_AXIS] - thick; + if (g29_verbose_level > 2) { + SERIAL_PROTOCOLPGM("Mesh Point Measured at: "); + SERIAL_PROTOCOL_F(z_values[location.x_index][location.y_index], 6); + SERIAL_EOL(); + } SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (location.valid()); + } while (location.x_index >= 0 && location.y_index >= 0); if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing restore_ubl_active_state_and_leave(); - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); + KEEPALIVE_STATE(IN_HANDLER); + do_blocking_move_to(rx, ry, Z_CLEARANCE_DEPLOY_PROBE); } - - inline void set_message_with_feedback(PGM_P const msg_P) { - ui.set_status_P(msg_P); - ui.quick_feedback(); - } - - void abort_fine_tune() { - ui.return_to_status(); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); - } - - void unified_bed_leveling::fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) { - if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified - g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. - - #if ENABLED(UBL_MESH_EDIT_MOVES_Z) - const float h_offset = parser.seenval('H') ? parser.value_linear_units() : 0; - if (!WITHIN(h_offset, 0, 10)) { - SERIAL_ECHOLNPGM("Offset out of bounds. (0 to 10mm)\n"); - return; - } - #endif - - mesh_index_pair location; - - if (!position_is_reachable(pos)) { - SERIAL_ECHOLNPGM("(X,Y) outside printable radius."); - return; - } - - save_ubl_active_state_and_disable(); - - LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH); - ui.capture(); // Take over control of the LCD encoder - - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance - - TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset - - MeshFlags done_flags{0}; - const xy_int8_t &lpos = location.pos; - do { - location = find_closest_mesh_point_of_type(SET_IN_BITMAP, pos, false, &done_flags); - - if (lpos.x < 0) break; // Stop when there are no more reachable points - - done_flags.mark(lpos); // Mark this location as 'adjusted' so a new - // location is used on the next loop - const xyz_pos_t raw = { - mesh_index_to_xpos(lpos.x), - mesh_index_to_ypos(lpos.y), - Z_CLEARANCE_BETWEEN_PROBES - }; - - if (!position_is_reachable(raw)) break; // SHOULD NOT OCCUR (find_closest_mesh_point_of_type only returns reachable) - - do_blocking_move_to(raw); // Move the nozzle to the edit point with probe clearance - - TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset before editing - - KEEPALIVE_STATE(PAUSED_FOR_USER); - - if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point - - #if IS_TFTGLCD_PANEL - ui.ubl_plot(lpos.x, lpos.y); // update plot screen - #endif - - ui.refresh(); - - float new_z = z_values[lpos.x][lpos.y]; - if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 - new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place - - lcd_mesh_edit_setup(new_z); - - SET_SOFT_ENDSTOP_LOOSE(true); - - do { - idle(); - new_z = lcd_mesh_edit(); - TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset + new_z)); // Move the nozzle as the point is edited - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (!ui.button_pressed()); - - SET_SOFT_ENDSTOP_LOOSE(false); - - if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status - - if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing - - z_values[lpos.x][lpos.y] = new_z; // Save the updated Z value - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, new_z)); - - serial_delay(20); // No switch noise - ui.refresh(); - - } while (lpos.x >= 0 && --g29_repetition_cnt > 0); - - if (do_ubl_mesh_map) display_map(g29_map_type); - restore_ubl_active_state_and_leave(); - - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); - - LCD_MESSAGEPGM(MSG_UBL_DONE_EDITING_MESH); - SERIAL_ECHOLNPGM("Done Editing Mesh"); - - if (lcd_map_control) - ui.goto_screen(ubl_map_screen); - else - ui.return_to_status(); - } - - #endif // HAS_LCD_MENU + #endif // NEWPANEL bool unified_bed_leveling::g29_parameter_parsing() { bool err_flag = false; - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29))); + #if ENABLED(NEWPANEL) + LCD_MESSAGEPGM(MSG_UBL_DOING_G29); + lcd_quick_feedback(true); + #endif g29_constant = 0; g29_repetition_cnt = 0; + g29_x_flag = parser.seenval('X'); + g29_x_pos = g29_x_flag ? parser.value_float() : current_position[X_AXIS]; + g29_y_flag = parser.seenval('Y'); + g29_y_pos = g29_y_flag ? parser.value_float() : current_position[Y_AXIS]; + if (parser.seen('R')) { g29_repetition_cnt = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; NOMORE(g29_repetition_cnt, GRID_MAX_POINTS); if (g29_repetition_cnt < 1) { - SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n"); + SERIAL_PROTOCOLLNPGM("?(R)epetition count invalid (1+).\n"); return UBL_ERR; } } g29_verbose_level = parser.seen('V') ? parser.value_int() : 0; if (!WITHIN(g29_verbose_level, 0, 4)) { - SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4).\n"); + SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0-4).\n"); err_flag = true; } @@ -1075,7 +947,7 @@ const int pv = parser.value_int(); #if !HAS_BED_PROBE if (pv == 1) { - SERIAL_ECHOLNPGM("G29 P1 requires a probe.\n"); + SERIAL_PROTOCOLLNPGM("G29 P1 requires a probe.\n"); err_flag = true; } else @@ -1083,7 +955,7 @@ { g29_phase_value = pv; if (!WITHIN(g29_phase_value, 0, 6)) { - SERIAL_ECHOLNPGM("?(P)hase value invalid (0-6).\n"); + SERIAL_PROTOCOLLNPGM("?(P)hase value invalid (0-6).\n"); err_flag = true; } } @@ -1093,33 +965,26 @@ #if HAS_BED_PROBE g29_grid_size = parser.has_value() ? parser.value_int() : 0; if (g29_grid_size && !WITHIN(g29_grid_size, 2, 9)) { - SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); + SERIAL_PROTOCOLLNPGM("?Invalid grid size (J) specified (2-9).\n"); err_flag = true; } #else - SERIAL_ECHOLNPGM("G29 J action requires a probe.\n"); + SERIAL_PROTOCOLLNPGM("G29 J action requires a probe.\n"); err_flag = true; #endif } - xy_seen.x = parser.seenval('X'); - float sx = xy_seen.x ? parser.value_float() : current_position.x; - xy_seen.y = parser.seenval('Y'); - float sy = xy_seen.y ? parser.value_float() : current_position.y; - - if (xy_seen.x != xy_seen.y) { - SERIAL_ECHOLNPGM("Both X & Y locations must be specified.\n"); + if (g29_x_flag != g29_y_flag) { + SERIAL_PROTOCOLLNPGM("Both X & Y locations must be specified.\n"); err_flag = true; } // If X or Y are not valid, use center of the bed values - if (!WITHIN(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; - if (!WITHIN(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; + if (!WITHIN(g29_x_pos, X_MIN_BED, X_MAX_BED)) g29_x_pos = X_CENTER; + if (!WITHIN(g29_y_pos, Y_MIN_BED, Y_MAX_BED)) g29_y_pos = Y_CENTER; if (err_flag) return UBL_ERR; - g29_pos.set(sx, sy); - /** * Activate or deactivate UBL * Note: UBL's G29 restores the state set here when done. @@ -1128,7 +993,7 @@ */ if (parser.seen('A')) { if (parser.seen('D')) { - SERIAL_ECHOLNPGM("?Can't activate and deactivate at the same time.\n"); + SERIAL_PROTOCOLLNPGM("?Can't activate and deactivate at the same time.\n"); return UBL_ERR; } set_bed_leveling_enabled(true); @@ -1147,7 +1012,7 @@ if (parser.seenval('F')) { const float fh = parser.value_float(); if (!WITHIN(fh, 0, 100)) { - SERIAL_ECHOLNPGM("?(F)ade height for Bed Level Correction not plausible.\n"); + SERIAL_PROTOCOLLNPGM("?(F)ade height for Bed Level Correction not plausible.\n"); return UBL_ERR; } set_z_fade_height(fh); @@ -1156,7 +1021,7 @@ g29_map_type = parser.intval('T'); if (!WITHIN(g29_map_type, 0, 2)) { - SERIAL_ECHOLNPGM("Invalid map type.\n"); + SERIAL_PROTOCOLLNPGM("Invalid map type.\n"); return UBL_ERR; } return UBL_OK; @@ -1164,16 +1029,19 @@ static uint8_t ubl_state_at_invocation = 0; - #if ENABLED(UBL_DEVEL_DEBUGGING) + #ifdef UBL_DEVEL_DEBUGGING static uint8_t ubl_state_recursion_chk = 0; #endif void unified_bed_leveling::save_ubl_active_state_and_disable() { - #if ENABLED(UBL_DEVEL_DEBUGGING) + #ifdef UBL_DEVEL_DEBUGGING ubl_state_recursion_chk++; if (ubl_state_recursion_chk != 1) { SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR))); + #if ENABLED(NEWPANEL) + LCD_MESSAGEPGM(MSG_UBL_SAVE_ERROR); + lcd_quick_feedback(true); + #endif return; } #endif @@ -1182,110 +1050,410 @@ } void unified_bed_leveling::restore_ubl_active_state_and_leave() { - TERN_(HAS_LCD_MENU, ui.release()); - #if ENABLED(UBL_DEVEL_DEBUGGING) + #ifdef UBL_DEVEL_DEBUGGING if (--ubl_state_recursion_chk) { SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR))); + #if ENABLED(NEWPANEL) + LCD_MESSAGEPGM(MSG_UBL_RESTORE_ERROR); + lcd_quick_feedback(true); + #endif return; } #endif set_bed_leveling_enabled(ubl_state_at_invocation); } - mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { + /** + * Much of the 'What?' command can be eliminated. But until we are fully debugged, it is + * good to have the extra information. Soon... we prune this to just a few items + */ + void unified_bed_leveling::g29_what_command() { + report_state(); - bool found_a_NAN = false, found_a_real = false; - - mesh_index_pair farthest { -1, -1, -99999.99 }; - - GRID_LOOP(i, j) { - if (!isnan(z_values[i][j])) continue; // Skip valid mesh points - - // Skip unreachable points - if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) - continue; - - found_a_NAN = true; - - xy_int8_t near { -1, -1 }; - float d1, d2 = 99999.9f; - GRID_LOOP(k, l) { - if (isnan(z_values[k][l])) continue; - - found_a_real = true; - - // Add in a random weighting factor that scrambles the probing of the - // last half of the mesh (when every unprobed mesh point is one index - // from a probed location). - - d1 = HYPOT(i - k, j - l) + (1.0f / ((millis() % 47) + 13)); - - if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l) - d2 = d1; - near.set(i, j); - } - } - - // - // At this point d2 should have the near defined mesh point to invalid mesh point (i,j) - // - - if (found_a_real && near.x >= 0 && d2 > farthest.distance) { - farthest.pos = near; // Found an invalid location farther from the defined mesh point - farthest.distance = d2; - } - } // GRID_LOOP - - if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing - farthest.pos.set((GRID_MAX_POINTS_X) / 2, (GRID_MAX_POINTS_Y) / 2); - farthest.distance = 1; + if (storage_slot == -1) + SERIAL_PROTOCOLPGM("No Mesh Loaded."); + else { + SERIAL_PROTOCOLPAIR("Mesh ", storage_slot); + SERIAL_PROTOCOLPGM(" Loaded."); + } + SERIAL_EOL(); + safe_delay(50); + + SERIAL_PROTOCOLLNPAIR("UBL object count: ", (int)ubl_cnt); + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + SERIAL_PROTOCOLPGM("planner.z_fade_height : "); + SERIAL_PROTOCOL_F(planner.z_fade_height, 4); + SERIAL_EOL(); + #endif + + adjust_mesh_to_mean(g29_c_flag, g29_constant); + + #if HAS_BED_PROBE + SERIAL_PROTOCOLPGM("zprobe_zoffset: "); + SERIAL_PROTOCOL_F(zprobe_zoffset, 7); + SERIAL_EOL(); + #endif + + SERIAL_ECHOLNPAIR("MESH_MIN_X " STRINGIFY(MESH_MIN_X) "=", MESH_MIN_X); + safe_delay(50); + SERIAL_ECHOLNPAIR("MESH_MIN_Y " STRINGIFY(MESH_MIN_Y) "=", MESH_MIN_Y); + safe_delay(50); + SERIAL_ECHOLNPAIR("MESH_MAX_X " STRINGIFY(MESH_MAX_X) "=", MESH_MAX_X); + safe_delay(50); + SERIAL_ECHOLNPAIR("MESH_MAX_Y " STRINGIFY(MESH_MAX_Y) "=", MESH_MAX_Y); + safe_delay(50); + SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_X ", GRID_MAX_POINTS_X); + safe_delay(50); + SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_Y ", GRID_MAX_POINTS_Y); + safe_delay(50); + SERIAL_ECHOLNPAIR("MESH_X_DIST ", MESH_X_DIST); + SERIAL_ECHOLNPAIR("MESH_Y_DIST ", MESH_Y_DIST); + safe_delay(50); + + SERIAL_PROTOCOLPGM("X-Axis Mesh Points at: "); + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + SERIAL_PROTOCOL_F(LOGICAL_X_POSITION(mesh_index_to_xpos(i)), 3); + SERIAL_PROTOCOLPGM(" "); + safe_delay(25); + } + SERIAL_EOL(); + + SERIAL_PROTOCOLPGM("Y-Axis Mesh Points at: "); + for (uint8_t i = 0; i < GRID_MAX_POINTS_Y; i++) { + SERIAL_PROTOCOL_F(LOGICAL_Y_POSITION(mesh_index_to_ypos(i)), 3); + SERIAL_PROTOCOLPGM(" "); + safe_delay(25); + } + SERIAL_EOL(); + + #if HAS_KILL + SERIAL_PROTOCOLPAIR("Kill pin on :", KILL_PIN); + SERIAL_PROTOCOLLNPAIR(" state:", READ(KILL_PIN)); + #endif + SERIAL_EOL(); + safe_delay(50); + + #ifdef UBL_DEVEL_DEBUGGING + SERIAL_PROTOCOLLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation); + SERIAL_EOL(); + SERIAL_PROTOCOLLNPAIR("ubl_state_recursion_chk :", ubl_state_recursion_chk); + SERIAL_EOL(); + safe_delay(50); + + SERIAL_PROTOCOLPAIR("Meshes go from ", hex_address((void*)settings.meshes_start_index())); + SERIAL_PROTOCOLLNPAIR(" to ", hex_address((void*)settings.meshes_end_index())); + safe_delay(50); + + SERIAL_PROTOCOLLNPAIR("sizeof(ubl) : ", (int)sizeof(ubl)); + SERIAL_EOL(); + SERIAL_PROTOCOLLNPAIR("z_value[][] size: ", (int)sizeof(z_values)); + SERIAL_EOL(); + safe_delay(25); + + SERIAL_PROTOCOLLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); + safe_delay(50); + + SERIAL_PROTOCOLPAIR("EEPROM can hold ", settings.calc_num_meshes()); + SERIAL_PROTOCOLLNPGM(" meshes.\n"); + safe_delay(25); + #endif // UBL_DEVEL_DEBUGGING + + if (!sanity_check()) { + echo_name(); + SERIAL_PROTOCOLLNPGM(" sanity checks passed."); } - return farthest; } - mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { - mesh_index_pair closest; - closest.invalidate(); - closest.distance = -99999.9f; + /** + * When we are fully debugged, the EEPROM dump command will get deleted also. But + * right now, it is good to have the extra information. Soon... we prune this. + */ + void unified_bed_leveling::g29_eeprom_dump() { + uint8_t cccc; - // Get the reference position, either nozzle or probe - const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM("EEPROM Dump:"); + persistentStore.access_start(); + for (uint16_t i = 0; i < persistentStore.capacity(); i += 16) { + if (!(i & 0x3)) idle(); + print_hex_word(i); + SERIAL_ECHOPGM(": "); + for (uint16_t j = 0; j < 16; j++) { + persistentStore.read_data(i + j, &cccc, sizeof(uint8_t)); + print_hex_byte(cccc); + SERIAL_ECHO(' '); + } + SERIAL_EOL(); + } + SERIAL_EOL(); + persistentStore.access_finish(); + } + + /** + * When we are fully debugged, this may go away. But there are some valid + * use cases for the users. So we can wait and see what to do with it. + */ + void unified_bed_leveling::g29_compare_current_mesh_to_stored_mesh() { + int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_PROTOCOLLNPGM("?EEPROM storage not available."); + return; + } + + if (!parser.has_value()) { + SERIAL_PROTOCOLLNPGM("?Storage slot # required."); + SERIAL_PROTOCOLLNPAIR("?Use 0 to ", a - 1); + return; + } + + g29_storage_slot = parser.value_int(); + + if (!WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_PROTOCOLLNPGM("?Invalid storage slot."); + SERIAL_PROTOCOLLNPAIR("?Use 0 to ", a - 1); + return; + } + + float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + settings.load_mesh(g29_storage_slot, &tmp_z_values); + + SERIAL_PROTOCOLPAIR("Subtracting mesh in slot ", g29_storage_slot); + SERIAL_PROTOCOLLNPGM(" from current mesh."); + + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) + z_values[x][y] -= tmp_z_values[x][y]; + } + + mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { + + bool found_a_NAN = false, found_a_real = false; + + mesh_index_pair out_mesh; + out_mesh.x_index = out_mesh.y_index = -1; + out_mesh.distance = -99999.99f; + + for (int8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + for (int8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { + + if (isnan(z_values[i][j])) { // Check to see if this location holds an invalid mesh point + + const float mx = mesh_index_to_xpos(i), + my = mesh_index_to_ypos(j); + + if (!position_is_reachable_by_probe(mx, my)) // make sure the probe can get to the mesh point + continue; + + found_a_NAN = true; + + int8_t closest_x = -1, closest_y = -1; + float d1, d2 = 99999.9f; + for (int8_t k = 0; k < GRID_MAX_POINTS_X; k++) { + for (int8_t l = 0; l < GRID_MAX_POINTS_Y; l++) { + if (!isnan(z_values[k][l])) { + found_a_real = true; + + // Add in a random weighting factor that scrambles the probing of the + // last half of the mesh (when every unprobed mesh point is one index + // from a probed location). + + d1 = HYPOT(i - k, j - l) + (1.0f / ((millis() % 47) + 13)); + + if (d1 < d2) { // found a closer distance from invalid mesh point at (i,j) to defined mesh point at (k,l) + d2 = d1; // found a closer location with + closest_x = i; // an assigned mesh point value + closest_y = j; + } + } + } + } + + // + // At this point d2 should have the closest defined mesh point to invalid mesh point (i,j) + // + + if (found_a_real && (closest_x >= 0) && (d2 > out_mesh.distance)) { + out_mesh.distance = d2; // found an invalid location with a greater distance + out_mesh.x_index = closest_x; // to a defined mesh point + out_mesh.y_index = closest_y; + } + } + } // for j + } // for i + + if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing + out_mesh.x_index = GRID_MAX_POINTS_X / 2; + out_mesh.y_index = GRID_MAX_POINTS_Y / 2; + out_mesh.distance = 1; + } + return out_mesh; + } + + mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const float &rx, const float &ry, const bool probe_as_reference, uint16_t bits[16]) { + mesh_index_pair out_mesh; + out_mesh.x_index = out_mesh.y_index = -1; + out_mesh.distance = -99999.9f; + + // Get our reference position. Either the nozzle or probe location. + const float px = rx - (probe_as_reference == USE_PROBE_AS_REFERENCE ? X_PROBE_OFFSET_FROM_EXTRUDER : 0), + py = ry - (probe_as_reference == USE_PROBE_AS_REFERENCE ? Y_PROBE_OFFSET_FROM_EXTRUDER : 0); float best_so_far = 99999.99f; - GRID_LOOP(i, j) { - if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) - || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) - ) { - // Found a Mesh Point of the specified type! - const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + for (int8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + for (int8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { - // If using the probe as the reference there are some unreachable locations. - // Also for round beds, there are grid points outside the bed the nozzle can't reach. - // Prune them from the list and ignore them till the next Phase (manual nozzle probing). + if ( (type == INVALID && isnan(z_values[i][j])) // Check to see if this location holds the right thing + || (type == REAL && !isnan(z_values[i][j])) + || (type == SET_IN_BITMAP && is_bitmap_set(bits, i, j)) + ) { + // We only get here if we found a Mesh Point of the specified type - if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) - continue; + const float mx = mesh_index_to_xpos(i), + my = mesh_index_to_ypos(j); - // Reachable. Check if it's the best_so_far location to the nozzle. + // If using the probe as the reference there are some unreachable locations. + // Also for round beds, there are grid points outside the bed the nozzle can't reach. + // Prune them from the list and ignore them till the next Phase (manual nozzle probing). - const xy_pos_t diff = current_position - mpos; - const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; + if (probe_as_reference ? !position_is_reachable_by_probe(mx, my) : !position_is_reachable(mx, my)) + continue; - // factor in the distance from the current location for the normal case - // so the nozzle isn't running all over the bed. - if (distance < best_so_far) { - best_so_far = distance; // Found a closer location with the desired value type. - closest.pos.set(i, j); - closest.distance = best_so_far; + // Reachable. Check if it's the best_so_far location to the nozzle. + + float distance = HYPOT(px - mx, py - my); + + // factor in the distance from the current location for the normal case + // so the nozzle isn't running all over the bed. + distance += HYPOT(current_position[X_AXIS] - mx, current_position[Y_AXIS] - my) * 0.1f; + if (distance < best_so_far) { + best_so_far = distance; // We found a closer location with + out_mesh.x_index = i; // the specified type of mesh value. + out_mesh.y_index = j; + out_mesh.distance = best_so_far; + } } - } - } // GRID_LOOP + } // for j + } // for i - return closest; + return out_mesh; } + #if ENABLED(NEWPANEL) + + void abort_fine_tune() { + lcd_return_to_status(); + do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); + LCD_MESSAGEPGM(MSG_EDITING_STOPPED); + lcd_quick_feedback(true); + } + + void unified_bed_leveling::fine_tune_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map) { + if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified + g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. + + #if ENABLED(UBL_MESH_EDIT_MOVES_Z) + const float h_offset = parser.seenval('H') ? parser.value_linear_units() : 0; + if (!WITHIN(h_offset, 0, 10)) { + SERIAL_PROTOCOLLNPGM("Offset out of bounds. (0 to 10mm)\n"); + return; + } + #endif + + mesh_index_pair location; + + if (!position_is_reachable(rx, ry)) { + SERIAL_PROTOCOLLNPGM("(X,Y) outside printable radius."); + return; + } + + save_ubl_active_state_and_disable(); + + LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH); + lcd_external_control = true; // Take over control of the LCD encoder + + do_blocking_move_to(rx, ry, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance + + #if ENABLED(UBL_MESH_EDIT_MOVES_Z) + do_blocking_move_to_z(h_offset); // Move Z to the given 'H' offset + #endif + + uint16_t not_done[16]; + memset(not_done, 0xFF, sizeof(not_done)); + do { + location = find_closest_mesh_point_of_type(SET_IN_BITMAP, rx, ry, USE_NOZZLE_AS_REFERENCE, not_done); + + if (location.x_index < 0) break; // Stop when there are no more reachable points + + bitmap_clear(not_done, location.x_index, location.y_index); // Mark this location as 'adjusted' so a new + // location is used on the next loop + + const float rawx = mesh_index_to_xpos(location.x_index), + rawy = mesh_index_to_ypos(location.y_index); + + if (!position_is_reachable(rawx, rawy)) break; // SHOULD NOT OCCUR because find_closest_mesh_point_of_type will only return reachable + + do_blocking_move_to(rawx, rawy, Z_CLEARANCE_BETWEEN_PROBES); // Move the nozzle to the edit point with probe clearance + + #if ENABLED(UBL_MESH_EDIT_MOVES_Z) + do_blocking_move_to_z(h_offset); // Move Z to the given 'H' offset before editing + #endif + + KEEPALIVE_STATE(PAUSED_FOR_USER); + + if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point + + lcd_refresh(); + + float new_z = z_values[location.x_index][location.y_index]; + if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 + new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place + + lcd_mesh_edit_setup(new_z); + + do { + new_z = lcd_mesh_edit(); + #if ENABLED(UBL_MESH_EDIT_MOVES_Z) + do_blocking_move_to_z(h_offset + new_z); // Move the nozzle as the point is edited + #endif + idle(); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } while (!is_lcd_clicked()); + + if (!lcd_map_control) lcd_return_to_status(); // Just editing a single point? Return to status + + if (click_and_hold(abort_fine_tune)) goto FINE_TUNE_EXIT; // If the click is held down, abort editing + + z_values[location.x_index][location.y_index] = new_z; // Save the updated Z value + + safe_delay(20); // No switch noise + lcd_refresh(); + + } while (location.x_index >= 0 && --g29_repetition_cnt > 0); + + FINE_TUNE_EXIT: + + lcd_external_control = false; + KEEPALIVE_STATE(IN_HANDLER); + + if (do_ubl_mesh_map) display_map(g29_map_type); + restore_ubl_active_state_and_leave(); + + do_blocking_move_to(rx, ry, Z_CLEARANCE_BETWEEN_PROBES); + + LCD_MESSAGEPGM(MSG_UBL_DONE_EDITING_MESH); + SERIAL_ECHOLNPGM("Done Editing Mesh"); + + if (lcd_map_control) + lcd_goto_screen(_lcd_ubl_output_map_lcd); + else + lcd_return_to_status(); + } + + #endif // NEWPANEL + /** * 'Smart Fill': Scan from the outward edges of the mesh towards the center. * If an invalid location is found, use the next two points (if valid) to @@ -1293,18 +1461,15 @@ */ bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { - const float v = z_values[x][y]; - if (isnan(v)) { // A NAN... - const int8_t dx = x + xdir, dy = y + ydir; - const float v1 = z_values[dx][dy]; - if (!isnan(v1)) { // ...next to a pair of real values? - const float v2 = z_values[dx + xdir][dy + ydir]; - if (!isnan(v2)) { - z_values[x][y] = v1 < v2 ? v1 : v1 + v1 - v2; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - return true; - } - } + const int8_t x1 = x + xdir, x2 = x1 + xdir, + y1 = y + ydir, y2 = y1 + ydir; + // A NAN next to a pair of real values? + if (isnan(z_values[x][y]) && !isnan(z_values[x1][y1]) && !isnan(z_values[x2][y2])) { + if (z_values[x1][y1] < z_values[x2][y2]) // Angled downward? + z_values[x][y] = z_values[x1][y1]; // Use nearest (maybe a little too high.) + else + z_values[x][y] = 2.0f * z_values[x1][y1] - z_values[x2][y2]; // Angled upward... + return true; } return false; } @@ -1319,7 +1484,7 @@ info3 PROGMEM = { GRID_MAX_POINTS_X - 1, 0, 0, GRID_MAX_POINTS_Y, true }; // Right side of the mesh looking left static const smart_fill_info * const info[] PROGMEM = { &info0, &info1, &info2, &info3 }; - LOOP_L_N(i, COUNT(info)) { + for (uint8_t i = 0; i < COUNT(info); ++i) { const smart_fill_info *f = (smart_fill_info*)pgm_read_ptr(&info[i]); const int8_t sx = pgm_read_byte(&f->sx), sy = pgm_read_byte(&f->sy), ex = pgm_read_byte(&f->ex), ey = pgm_read_byte(&f->ey); @@ -1340,151 +1505,136 @@ #if HAS_BED_PROBE - //#define VALIDATE_MESH_TILT - #include "../../../libs/vector_3.h" void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { - const float x_min = probe.min_x(), x_max = probe.max_x(), - y_min = probe.min_y(), y_max = probe.max_y(), - dx = (x_max - x_min) / (g29_grid_size - 1), - dy = (y_max - y_min) / (g29_grid_size - 1); + constexpr int16_t x_min = MAX(MIN_PROBE_X, MESH_MIN_X), + x_max = MIN(MAX_PROBE_X, MESH_MAX_X), + y_min = MAX(MIN_PROBE_Y, MESH_MIN_Y), + y_max = MIN(MAX_PROBE_Y, MESH_MAX_Y); - xy_float_t points[3]; - probe.get_three_points(points); - - float measured_z; bool abort_flag = false; - #ifdef VALIDATE_MESH_TILT - float z1, z2, z3; // Needed for algorithm validation below - #endif + float measured_z; + + const float dx = float(x_max - x_min) / (g29_grid_size - 1), + dy = float(y_max - y_min) / (g29_grid_size - 1); struct linear_fit_data lsf_results; + + //float z1, z2, z3; // Needed for algorithm validation down below. + incremental_LSF_reset(&lsf_results); if (do_3_pt_leveling) { - SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - - measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, g29_verbose_level); + measured_z = probe_pt(PROBE_PT_1_X, PROBE_PT_1_Y, PROBE_PT_RAISE, g29_verbose_level); if (isnan(measured_z)) abort_flag = true; else { - measured_z -= get_z_correction(points[0]); - #ifdef VALIDATE_MESH_TILT - z1 = measured_z; - #endif + measured_z -= get_z_correction(PROBE_PT_1_X, PROBE_PT_1_Y); + //z1 = measured_z; if (g29_verbose_level > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, points[0], measured_z); + incremental_LSF(&lsf_results, PROBE_PT_1_X, PROBE_PT_1_Y, measured_z); } if (!abort_flag) { - SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - - measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, g29_verbose_level); - #ifdef VALIDATE_MESH_TILT - z2 = measured_z; - #endif + measured_z = probe_pt(PROBE_PT_2_X, PROBE_PT_2_Y, PROBE_PT_RAISE, g29_verbose_level); + //z2 = measured_z; if (isnan(measured_z)) abort_flag = true; else { - measured_z -= get_z_correction(points[1]); + measured_z -= get_z_correction(PROBE_PT_2_X, PROBE_PT_2_Y); if (g29_verbose_level > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, points[1], measured_z); + incremental_LSF(&lsf_results, PROBE_PT_2_X, PROBE_PT_2_Y, measured_z); } } if (!abort_flag) { - SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - - measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, g29_verbose_level); - #ifdef VALIDATE_MESH_TILT - z3 = measured_z; - #endif + measured_z = probe_pt(PROBE_PT_3_X, PROBE_PT_3_Y, PROBE_PT_STOW, g29_verbose_level); + //z3 = measured_z; if (isnan(measured_z)) abort_flag = true; else { - measured_z -= get_z_correction(points[2]); + measured_z -= get_z_correction(PROBE_PT_3_X, PROBE_PT_3_Y); if (g29_verbose_level > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, points[2], measured_z); + incremental_LSF(&lsf_results, PROBE_PT_3_X, PROBE_PT_3_Y, measured_z); } } - probe.stow(); - probe.move_z_after_probing(); + STOW_PROBE(); + #ifdef Z_AFTER_PROBING + move_z_after_probing(); + #endif if (abort_flag) { - SERIAL_ECHOLNPGM("?Error probing point. Aborting operation."); + SERIAL_ECHOPGM("?Error probing point. Aborting operation.\n"); return; } } else { // !do_3_pt_leveling bool zig_zag = false; - - const uint16_t total_points = sq(g29_grid_size); - uint16_t point_num = 1; - - xy_pos_t rpos; - LOOP_L_N(ix, g29_grid_size) { - rpos.x = x_min + ix * dx; - LOOP_L_N(iy, g29_grid_size) { - rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); + for (uint8_t ix = 0; ix < g29_grid_size; ix++) { + const float rx = float(x_min) + ix * dx; + for (int8_t iy = 0; iy < g29_grid_size; iy++) { + const float ry = float(y_min) + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); if (!abort_flag) { - SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); - - measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling + measured_z = probe_pt(rx, ry, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling abort_flag = isnan(measured_z); #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) { - const xy_pos_t lpos = rpos.asLogical(); - DEBUG_CHAR('('); - DEBUG_ECHO_F(rpos.x, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(rpos.y, 7); - DEBUG_ECHOPAIR_F(") logical: (", lpos.x, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(lpos.y, 7); - DEBUG_ECHOPAIR_F(") measured: ", measured_z, 7); - DEBUG_ECHOPAIR_F(" correction: ", get_z_correction(rpos), 7); + SERIAL_CHAR('('); + SERIAL_PROTOCOL_F(rx, 7); + SERIAL_CHAR(','); + SERIAL_PROTOCOL_F(ry, 7); + SERIAL_ECHOPGM(") logical: "); + SERIAL_CHAR('('); + SERIAL_PROTOCOL_F(LOGICAL_X_POSITION(rx), 7); + SERIAL_CHAR(','); + SERIAL_PROTOCOL_F(LOGICAL_Y_POSITION(ry), 7); + SERIAL_ECHOPGM(") measured: "); + SERIAL_PROTOCOL_F(measured_z, 7); + SERIAL_ECHOPGM(" correction: "); + SERIAL_PROTOCOL_F(get_z_correction(rx, ry), 7); } #endif - measured_z -= get_z_correction(rpos) /* + probe.offset.z */ ; - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); + measured_z -= get_z_correction(rx, ry) /* + zprobe_zoffset */ ; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPGM(" final >>>---> "); + SERIAL_PROTOCOL_F(measured_z, 7); + SERIAL_EOL(); + } + #endif if (g29_verbose_level > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, rpos, measured_z); + incremental_LSF(&lsf_results, rx, ry, measured_z); } - - point_num++; } zig_zag ^= true; } } - probe.stow(); - probe.move_z_after_probing(); + STOW_PROBE(); + #ifdef Z_AFTER_PROBING + move_z_after_probing(); + #endif if (abort_flag || finish_incremental_LSF(&lsf_results)) { SERIAL_ECHOPGM("Could not complete LSF!"); @@ -1494,91 +1644,130 @@ vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1).get_normal(); if (g29_verbose_level > 2) { - SERIAL_ECHOPAIR_F("bed plane normal = [", normal.x, 7); - SERIAL_CHAR(','); - SERIAL_ECHO_F(normal.y, 7); - SERIAL_CHAR(','); - SERIAL_ECHO_F(normal.z, 7); + SERIAL_ECHOPGM("bed plane normal = ["); + SERIAL_PROTOCOL_F(normal.x, 7); + SERIAL_PROTOCOLCHAR(','); + SERIAL_PROTOCOL_F(normal.y, 7); + SERIAL_PROTOCOLCHAR(','); + SERIAL_PROTOCOL_F(normal.z, 7); SERIAL_ECHOLNPGM("]"); } matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); - GRID_LOOP(i, j) { - float mx = mesh_index_to_xpos(i), - my = mesh_index_to_ypos(j), - mz = z_values[i][j]; + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { + float x_tmp = mesh_index_to_xpos(i), + y_tmp = mesh_index_to_ypos(j), + z_tmp = z_values[i][j]; - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR_F("before rotation = [", mx, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(my, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(mz, 7); - DEBUG_ECHOPGM("] ---> "); - DEBUG_DELAY(20); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPGM("before rotation = ["); + SERIAL_PROTOCOL_F(x_tmp, 7); + SERIAL_PROTOCOLCHAR(','); + SERIAL_PROTOCOL_F(y_tmp, 7); + SERIAL_PROTOCOLCHAR(','); + SERIAL_PROTOCOL_F(z_tmp, 7); + SERIAL_ECHOPGM("] ---> "); + safe_delay(20); + } + #endif + + apply_rotation_xyz(rotation, x_tmp, y_tmp, z_tmp); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPGM("after rotation = ["); + SERIAL_PROTOCOL_F(x_tmp, 7); + SERIAL_PROTOCOLCHAR(','); + SERIAL_PROTOCOL_F(y_tmp, 7); + SERIAL_PROTOCOLCHAR(','); + SERIAL_PROTOCOL_F(z_tmp, 7); + SERIAL_ECHOLNPGM("]"); + safe_delay(55); + } + #endif + + z_values[i][j] = z_tmp - lsf_results.D; } - - apply_rotation_xyz(rotation, mx, my, mz); - - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR_F("after rotation = [", mx, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(my, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(mz, 7); - DEBUG_ECHOLNPGM("]"); - DEBUG_DELAY(20); - } - - z_values[i][j] = mz - lsf_results.D; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, z_values[i][j])); } - if (DEBUGGING(LEVELING)) { - rotation.debug(PSTR("rotation matrix:\n")); - DEBUG_ECHOPAIR_F("LSF Results A=", lsf_results.A, 7); - DEBUG_ECHOPAIR_F(" B=", lsf_results.B, 7); - DEBUG_ECHOLNPAIR_F(" D=", lsf_results.D, 7); - DEBUG_DELAY(55); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + rotation.debug(PSTR("rotation matrix:\n")); + SERIAL_ECHOPGM("LSF Results A="); + SERIAL_PROTOCOL_F(lsf_results.A, 7); + SERIAL_ECHOPGM(" B="); + SERIAL_PROTOCOL_F(lsf_results.B, 7); + SERIAL_ECHOPGM(" D="); + SERIAL_PROTOCOL_F(lsf_results.D, 7); + SERIAL_EOL(); + safe_delay(55); - DEBUG_ECHOPAIR_F("bed plane normal = [", normal.x, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(normal.y, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(normal.z, 7); - DEBUG_ECHOLNPGM("]"); - DEBUG_EOL(); + SERIAL_ECHOPGM("bed plane normal = ["); + SERIAL_PROTOCOL_F(normal.x, 7); + SERIAL_PROTOCOLCHAR(','); + SERIAL_PROTOCOL_F(normal.y, 7); + SERIAL_PROTOCOLCHAR(','); + SERIAL_PROTOCOL_F(normal.z, 7); + SERIAL_ECHOPGM("]\n"); + SERIAL_EOL(); - /** - * Use the code below to check the validity of the mesh tilting algorithm. - * 3-Point Mesh Tilt uses the same algorithm as grid-based tilting, but only - * three points are used in the calculation. This guarantees that each probed point - * has an exact match when get_z_correction() for that location is calculated. - * The Z error between the probed point locations and the get_z_correction() - * numbers for those locations should be 0. - */ - #ifdef VALIDATE_MESH_TILT - auto d_from = []{ DEBUG_ECHOPGM("D from "); }; - auto normed = [&](const xy_pos_t &pos, const float &zadd) { - return normal.x * pos.x + normal.y * pos.y + zadd; - }; - auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { - d_from(); serialprintPGM(pre); - DEBUG_ECHO_F(normed(pos, zadd), 6); - DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); - }; - debug_pt(PSTR("1st point: "), probe_pt[0], normal.z * z1); - debug_pt(PSTR("2nd point: "), probe_pt[1], normal.z * z2); - debug_pt(PSTR("3rd point: "), probe_pt[2], normal.z * z3); - d_from(); DEBUG_ECHOPGM("safe home with Z="); - DEBUG_ECHOLNPAIR_F("0 : ", normed(safe_homing_xy, 0), 6); - d_from(); DEBUG_ECHOPGM("safe home with Z="); - DEBUG_ECHOLNPAIR_F("mesh value ", normed(safe_homing_xy, get_z_correction(safe_homing_xy)), 6); - DEBUG_ECHOPAIR(" Z error = (", Z_SAFE_HOMING_X_POINT, ",", Z_SAFE_HOMING_Y_POINT); - DEBUG_ECHOLNPAIR_F(") = ", get_z_correction(safe_homing_xy), 6); - #endif - } // DEBUGGING(LEVELING) + /** + * The following code can be used to check the validity of the mesh tilting algorithm. + * When a 3-Point Mesh Tilt is done, the same algorithm is used as the grid based tilting. + * The only difference is just 3 points are used in the calculations. That fact guarantees + * each probed point should have an exact match when a get_z_correction() for that location + * is calculated. The Z error between the probed point locations and the get_z_correction() + * numbers for those locations should be 0. + */ + #if 0 + float t, t1, d; + t = normal.x * (PROBE_PT_1_X) + normal.y * (PROBE_PT_1_Y); + d = t + normal.z * z1; + SERIAL_ECHOPGM("D from 1st point: "); + SERIAL_ECHO_F(d, 6); + SERIAL_ECHOPGM(" Z error: "); + SERIAL_ECHO_F(normal.z*z1-get_z_correction(PROBE_PT_1_X, PROBE_PT_1_Y), 6); + SERIAL_EOL(); + + t = normal.x * (PROBE_PT_2_X) + normal.y * (PROBE_PT_2_Y); + d = t + normal.z * z2; + SERIAL_EOL(); + SERIAL_ECHOPGM("D from 2nd point: "); + SERIAL_ECHO_F(d, 6); + SERIAL_ECHOPGM(" Z error: "); + SERIAL_ECHO_F(normal.z*z2-get_z_correction(PROBE_PT_2_X, PROBE_PT_2_Y), 6); + SERIAL_EOL(); + + t = normal.x * (PROBE_PT_3_X) + normal.y * (PROBE_PT_3_Y); + d = t + normal.z * z3; + SERIAL_ECHOPGM("D from 3rd point: "); + SERIAL_ECHO_F(d, 6); + SERIAL_ECHOPGM(" Z error: "); + SERIAL_ECHO_F(normal.z*z3-get_z_correction(PROBE_PT_3_X, PROBE_PT_3_Y), 6); + SERIAL_EOL(); + + t = normal.x * (Z_SAFE_HOMING_X_POINT) + normal.y * (Z_SAFE_HOMING_Y_POINT); + d = t + normal.z * 0; + SERIAL_ECHOPGM("D from home location with Z=0 : "); + SERIAL_ECHO_F(d, 6); + SERIAL_EOL(); + + t = normal.x * (Z_SAFE_HOMING_X_POINT) + normal.y * (Z_SAFE_HOMING_Y_POINT); + d = t + get_z_correction(Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT); // normal.z * 0; + SERIAL_ECHOPGM("D from home location using mesh value for Z: "); + SERIAL_ECHO_F(d, 6); + + SERIAL_ECHOPAIR(" Z error: (", Z_SAFE_HOMING_X_POINT); + SERIAL_ECHOPAIR(",", Z_SAFE_HOMING_Y_POINT ); + SERIAL_ECHOPGM(") = "); + SERIAL_ECHO_F(get_z_correction(Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT), 6); + SERIAL_EOL(); + #endif + } // DEBUGGING(LEVELING) + #endif } @@ -1592,33 +1781,34 @@ // being extrapolated so that nearby points will have greater influence on // the point being extrapolated. Then extrapolate the mesh point from WLSF. - static_assert((GRID_MAX_POINTS_Y) <= 16, "GRID_MAX_POINTS_Y too big"); + static_assert(GRID_MAX_POINTS_Y <= 16, "GRID_MAX_POINTS_Y too big"); uint16_t bitmap[GRID_MAX_POINTS_X] = { 0 }; struct linear_fit_data lsf_results; SERIAL_ECHOPGM("Extrapolating mesh..."); - const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST); + const float weight_scaled = weight_factor * MAX(MESH_X_DIST, MESH_Y_DIST); - GRID_LOOP(jx, jy) if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy); + for (uint8_t jx = 0; jx < GRID_MAX_POINTS_X; jx++) + for (uint8_t jy = 0; jy < GRID_MAX_POINTS_Y; jy++) + if (!isnan(z_values[jx][jy])) + SBI(bitmap[jx], jy); - xy_pos_t ppos; - LOOP_L_N(ix, GRID_MAX_POINTS_X) { - ppos.x = mesh_index_to_xpos(ix); - LOOP_L_N(iy, GRID_MAX_POINTS_Y) { - ppos.y = mesh_index_to_ypos(iy); + for (uint8_t ix = 0; ix < GRID_MAX_POINTS_X; ix++) { + const float px = mesh_index_to_xpos(ix); + for (uint8_t iy = 0; iy < GRID_MAX_POINTS_Y; iy++) { + const float py = mesh_index_to_ypos(iy); if (isnan(z_values[ix][iy])) { - // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. + // undefined mesh point at (px,py), compute weighted LSF from original valid mesh points. incremental_LSF_reset(&lsf_results); - xy_pos_t rpos; - LOOP_L_N(jx, GRID_MAX_POINTS_X) { - rpos.x = mesh_index_to_xpos(jx); - LOOP_L_N(jy, GRID_MAX_POINTS_Y) { + for (uint8_t jx = 0; jx < GRID_MAX_POINTS_X; jx++) { + const float rx = mesh_index_to_xpos(jx); + for (uint8_t jy = 0; jy < GRID_MAX_POINTS_Y; jy++) { if (TEST(bitmap[jx], jy)) { - rpos.y = mesh_index_to_ypos(jy); - const float rz = z_values[jx][jy], - w = 1.0f + weight_scaled / (rpos - ppos).magnitude(); - incremental_WLSF(&lsf_results, rpos, rz, w); + const float ry = mesh_index_to_ypos(jy), + rz = z_values[jx][jy], + w = 1 + weight_scaled / HYPOT((rx - px), (ry - py)); + incremental_WLSF(&lsf_results, rx, ry, rz, w); } } } @@ -1626,10 +1816,9 @@ SERIAL_ECHOLNPGM("Insufficient data"); return; } - const float ez = -lsf_results.D - lsf_results.A * ppos.x - lsf_results.B * ppos.y; + const float ez = -lsf_results.D - lsf_results.A * px - lsf_results.B * py; z_values[ix][iy] = ez; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, z_values[ix][iy])); - idle(); // housekeeping + idle(); // housekeeping } } } @@ -1638,141 +1827,4 @@ } #endif // UBL_G29_P31 - #if ENABLED(UBL_DEVEL_DEBUGGING) - /** - * Much of the 'What?' command can be eliminated. But until we are fully debugged, it is - * good to have the extra information. Soon... we prune this to just a few items - */ - void unified_bed_leveling::g29_what_command() { - report_state(); - - if (storage_slot == -1) - SERIAL_ECHOPGM("No Mesh Loaded."); - else - SERIAL_ECHOPAIR("Mesh ", storage_slot, " Loaded."); - SERIAL_EOL(); - serial_delay(50); - - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - SERIAL_ECHOLNPAIR_F("Fade Height M420 Z", planner.z_fade_height, 4); - #endif - - adjust_mesh_to_mean(g29_c_flag, g29_constant); - - #if HAS_BED_PROBE - SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe.offset.z, 7); - #endif - - SERIAL_ECHOLNPAIR("MESH_MIN_X " STRINGIFY(MESH_MIN_X) "=", MESH_MIN_X); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_MIN_Y " STRINGIFY(MESH_MIN_Y) "=", MESH_MIN_Y); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_MAX_X " STRINGIFY(MESH_MAX_X) "=", MESH_MAX_X); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_MAX_Y " STRINGIFY(MESH_MAX_Y) "=", MESH_MAX_Y); serial_delay(50); - SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_X ", GRID_MAX_POINTS_X); serial_delay(50); - SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_Y ", GRID_MAX_POINTS_Y); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_X_DIST ", MESH_X_DIST); - SERIAL_ECHOLNPAIR("MESH_Y_DIST ", MESH_Y_DIST); serial_delay(50); - - SERIAL_ECHOPGM("X-Axis Mesh Points at: "); - LOOP_L_N(i, GRID_MAX_POINTS_X) { - SERIAL_ECHO_F(LOGICAL_X_POSITION(mesh_index_to_xpos(i)), 3); - SERIAL_ECHOPGM(" "); - serial_delay(25); - } - SERIAL_EOL(); - - SERIAL_ECHOPGM("Y-Axis Mesh Points at: "); - LOOP_L_N(i, GRID_MAX_POINTS_Y) { - SERIAL_ECHO_F(LOGICAL_Y_POSITION(mesh_index_to_ypos(i)), 3); - SERIAL_ECHOPGM(" "); - serial_delay(25); - } - SERIAL_EOL(); - - #if HAS_KILL - SERIAL_ECHOLNPAIR("Kill pin on :", int(KILL_PIN), " state:", int(kill_state())); - #endif - - SERIAL_EOL(); - serial_delay(50); - - #if ENABLED(UBL_DEVEL_DEBUGGING) - SERIAL_ECHOLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation, "\nubl_state_recursion_chk :", ubl_state_recursion_chk); - serial_delay(50); - - SERIAL_ECHOLNPAIR("Meshes go from ", hex_address((void*)settings.meshes_start_index()), " to ", hex_address((void*)settings.meshes_end_index())); - serial_delay(50); - - SERIAL_ECHOLNPAIR("sizeof(ubl) : ", (int)sizeof(ubl)); SERIAL_EOL(); - SERIAL_ECHOLNPAIR("z_value[][] size: ", (int)sizeof(z_values)); SERIAL_EOL(); - serial_delay(25); - - SERIAL_ECHOLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); - serial_delay(50); - - SERIAL_ECHOLNPAIR("EEPROM can hold ", settings.calc_num_meshes(), " meshes.\n"); - serial_delay(25); - #endif // UBL_DEVEL_DEBUGGING - - if (!sanity_check()) { - echo_name(); - SERIAL_ECHOLNPGM(" sanity checks passed."); - } - } - - /** - * When we are fully debugged, the EEPROM dump command will get deleted also. But - * right now, it is good to have the extra information. Soon... we prune this. - */ - void unified_bed_leveling::g29_eeprom_dump() { - uint8_t cccc; - - SERIAL_ECHO_MSG("EEPROM Dump:"); - persistentStore.access_start(); - for (uint16_t i = 0; i < persistentStore.capacity(); i += 16) { - if (!(i & 0x3)) idle(); - print_hex_word(i); - SERIAL_ECHOPGM(": "); - for (uint16_t j = 0; j < 16; j++) { - persistentStore.read_data(i + j, &cccc, sizeof(uint8_t)); - print_hex_byte(cccc); - SERIAL_CHAR(' '); - } - SERIAL_EOL(); - } - SERIAL_EOL(); - persistentStore.access_finish(); - } - - /** - * When we are fully debugged, this may go away. But there are some valid - * use cases for the users. So we can wait and see what to do with it. - */ - void unified_bed_leveling::g29_compare_current_mesh_to_stored_mesh() { - const int16_t a = settings.calc_num_meshes(); - - if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); - return; - } - - if (!parser.has_value() || !WITHIN(g29_storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); - return; - } - - g29_storage_slot = parser.value_int(); - - float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - settings.load_mesh(g29_storage_slot, &tmp_z_values); - - SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh."); - - GRID_LOOP(x, y) { - z_values[x][y] -= tmp_z_values[x][y]; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } - } - - #endif // UBL_DEVEL_DEBUGGING - #endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 010b5951be..85ed86838e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../inc/MarlinConfig.h" @@ -32,69 +32,97 @@ #include "../../../module/delta.h" #endif -#include "../../../MarlinCore.h" +#include "../../../Marlin.h" #include +#if AVR_AT90USB1286_FAMILY // Teensyduino & Printrboard IDE extensions have compile errors without this + inline void set_current_from_destination() { COPY(current_position, destination); } +#else + extern void set_current_from_destination(); +#endif + #if !UBL_SEGMENTED - void unified_bed_leveling::line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t extruder) { + void unified_bed_leveling::line_to_destination_cartesian(const float &feed_rate, const uint8_t extruder) { /** * Much of the nozzle movement will be within the same cell. So we will do as little computation * as possible to determine if this is the case. If this move is within the same cell, we will * just do the required Z-Height correction, call the Planner's buffer_line() routine, and leave */ - #if HAS_POSITION_MODIFIERS - xyze_pos_t start = current_position, end = destination; - planner.apply_modifiers(start); - planner.apply_modifiers(end); + #if ENABLED(SKEW_CORRECTION) + // For skew correction just adjust the destination point and we're done + float start[XYZE] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS] }, + end[XYZE] = { destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS] }; + planner.skew(start[X_AXIS], start[Y_AXIS], start[Z_AXIS]); + planner.skew(end[X_AXIS], end[Y_AXIS], end[Z_AXIS]); #else - const xyze_pos_t &start = current_position, &end = destination; + const float (&start)[XYZE] = current_position, + (&end)[XYZE] = destination; #endif - const xy_int8_t istart = cell_indexes(start), iend = cell_indexes(end); + const int cell_start_xi = get_cell_index_x(start[X_AXIS]), + cell_start_yi = get_cell_index_y(start[Y_AXIS]), + cell_dest_xi = get_cell_index_x(end[X_AXIS]), + cell_dest_yi = get_cell_index_y(end[Y_AXIS]); + + if (g26_debug_flag) { + SERIAL_ECHOPAIR(" ubl.line_to_destination_cartesian(xe=", destination[X_AXIS]); + SERIAL_ECHOPAIR(", ye=", destination[Y_AXIS]); + SERIAL_ECHOPAIR(", ze=", destination[Z_AXIS]); + SERIAL_ECHOPAIR(", ee=", destination[E_AXIS]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + debug_current_and_destination(PSTR("Start of ubl.line_to_destination_cartesian()")); + } // A move within the same cell needs no splitting - if (istart == iend) { + if (cell_start_xi == cell_dest_xi && cell_start_yi == cell_dest_yi) { // For a move off the bed, use a constant Z raise - if (!WITHIN(iend.x, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iend.y, 0, GRID_MAX_POINTS_Y - 1)) { + if (!WITHIN(cell_dest_xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(cell_dest_yi, 0, GRID_MAX_POINTS_Y - 1)) { // Note: There is no Z Correction in this case. We are off the grid and don't know what // a reasonable correction would be. If the user has specified a UBL_Z_RAISE_WHEN_OFF_MESH // value, that will be used instead of a calculated (Bi-Linear interpolation) correction. - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - end.z += UBL_Z_RAISE_WHEN_OFF_MESH; - #endif - planner.buffer_segment(end, scaled_fr_mm_s, extruder); - current_position = destination; + const float z_raise = 0.0 + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + + UBL_Z_RAISE_WHEN_OFF_MESH + #endif + ; + planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + z_raise, end[E_AXIS], feed_rate, extruder); + set_current_from_destination(); + + if (g26_debug_flag) + debug_current_and_destination(PSTR("out of bounds in ubl.line_to_destination_cartesian()")); + return; } FINAL_MOVE: // The distance is always MESH_X_DIST so multiply by the constant reciprocal. - const float xratio = (end.x - mesh_index_to_xpos(iend.x)) * RECIPROCAL(MESH_X_DIST); + const float xratio = (end[X_AXIS] - mesh_index_to_xpos(cell_dest_xi)) * (1.0f / (MESH_X_DIST)); - float z1, z2; - if (iend.x >= GRID_MAX_POINTS_X - 1) - z1 = z2 = 0.0; - else { - z1 = z_values[iend.x ][iend.y ] + xratio * - (z_values[iend.x + 1][iend.y ] - z_values[iend.x][iend.y ]), - z2 = z_values[iend.x ][iend.y + 1] + xratio * - (z_values[iend.x + 1][iend.y + 1] - z_values[iend.x][iend.y + 1]); - } + float z1 = z_values[cell_dest_xi ][cell_dest_yi ] + xratio * + (z_values[cell_dest_xi + 1][cell_dest_yi ] - z_values[cell_dest_xi][cell_dest_yi ]), + z2 = z_values[cell_dest_xi ][cell_dest_yi + 1] + xratio * + (z_values[cell_dest_xi + 1][cell_dest_yi + 1] - z_values[cell_dest_xi][cell_dest_yi + 1]); + + if (cell_dest_xi >= GRID_MAX_POINTS_X - 1) z1 = z2 = 0.0; // X cell-fraction done. Interpolate the two Z offsets with the Y fraction for the final Z offset. - const float yratio = (end.y - mesh_index_to_ypos(iend.y)) * RECIPROCAL(MESH_Y_DIST), - z0 = iend.y < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end.z) : 0.0; + const float yratio = (end[Y_AXIS] - mesh_index_to_ypos(cell_dest_yi)) * (1.0f / (MESH_Y_DIST)), + z0 = cell_dest_yi < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end[Z_AXIS]) : 0.0; // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. - if (!isnan(z0)) end.z += z0; - planner.buffer_segment(end, scaled_fr_mm_s, extruder); - current_position = destination; + planner.buffer_segment(end[X_AXIS], end[Y_AXIS], end[Z_AXIS] + (isnan(z0) ? 0.0 : z0), end[E_AXIS], feed_rate, extruder); + + if (g26_debug_flag) + debug_current_and_destination(PSTR("FINAL_MOVE in ubl.line_to_destination_cartesian()")); + + set_current_from_destination(); return; } @@ -103,11 +131,17 @@ * case - crossing only one X or Y line - after details are worked out to reduce computation. */ - const xy_float_t dist = end - start; - const xy_bool_t neg { dist.x < 0, dist.y < 0 }; - const xy_int8_t ineg { int8_t(neg.x), int8_t(neg.y) }; - const xy_float_t sign { neg.x ? -1.0f : 1.0f, neg.y ? -1.0f : 1.0f }; - const xy_int8_t iadd { int8_t(iend.x == istart.x ? 0 : sign.x), int8_t(iend.y == istart.y ? 0 : sign.y) }; + const float dx = end[X_AXIS] - start[X_AXIS], + dy = end[Y_AXIS] - start[Y_AXIS]; + + const int left_flag = dx < 0.0 ? 1 : 0, + down_flag = dy < 0.0 ? 1 : 0; + + const float adx = left_flag ? -dx : dx, + ady = down_flag ? -dy : dy; + + const int dxi = cell_start_xi == cell_dest_xi ? 0 : left_flag ? -1 : 1, + dyi = cell_start_yi == cell_dest_yi ? 0 : down_flag ? -1 : 1; /** * Compute the extruder scaling factor for each partial move, checking for @@ -117,75 +151,78 @@ * components. The larger of the two is used to preserve precision. */ - const xy_float_t ad = sign * dist; - const bool use_x_dist = ad.x > ad.y; + const bool use_x_dist = adx > ady; - float on_axis_distance = use_x_dist ? dist.x : dist.y, - e_position = end.e - start.e, - z_position = end.z - start.z; + float on_axis_distance = use_x_dist ? dx : dy, + e_position = end[E_AXIS] - start[E_AXIS], + z_position = end[Z_AXIS] - start[Z_AXIS]; - const float e_normalized_dist = e_position / on_axis_distance, // Allow divide by zero + const float e_normalized_dist = e_position / on_axis_distance, z_normalized_dist = z_position / on_axis_distance; - xy_int8_t icell = istart; + int current_xi = cell_start_xi, + current_yi = cell_start_yi; - const float ratio = dist.y / dist.x, // Allow divide by zero - c = start.y - ratio * start.x; + const float m = dy / dx, + c = start[Y_AXIS] - m * start[X_AXIS]; - const bool inf_normalized_flag = isinf(e_normalized_dist), - inf_ratio_flag = isinf(ratio); + const bool inf_normalized_flag = (isinf(e_normalized_dist) != 0), + inf_m_flag = (isinf(m) != 0); /** * Handle vertical lines that stay within one column. * These need not be perfectly vertical. */ - if (iadd.x == 0) { // Vertical line? - icell.y += ineg.y; // Line going down? Just go to the bottom. - while (icell.y != iend.y + ineg.y) { - icell.y += iadd.y; - const float next_mesh_line_y = mesh_index_to_ypos(icell.y); + if (dxi == 0) { // Vertical line? + current_yi += down_flag; // Line going down? Just go to the bottom. + while (current_yi != cell_dest_yi + down_flag) { + current_yi += dyi; + const float next_mesh_line_y = mesh_index_to_ypos(current_yi); /** * Skip the calculations for an infinite slope. * For others the next X is the same so this can continue. * Calculate X at the next Y mesh line. */ - const float rx = inf_ratio_flag ? start.x : (next_mesh_line_y - c) / ratio; + const float rx = inf_m_flag ? start[X_AXIS] : (next_mesh_line_y - c) / m; - float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, icell.x, icell.y) - * planner.fade_scaling_factor_for_z(end.z); + float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, current_xi, current_yi) + * planner.fade_scaling_factor_for_z(end[Z_AXIS]); // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. if (isnan(z0)) z0 = 0.0; - const float ry = mesh_index_to_ypos(icell.y); + const float ry = mesh_index_to_ypos(current_yi); /** * Without this check, it's possible to generate a zero length move, as in the case where * the line is heading down, starting exactly on a mesh line boundary. Since this is rare * it might be fine to remove this check and let planner.buffer_segment() filter it out. */ - if (ry != start.y) { - if (!inf_normalized_flag) { // fall-through faster than branch - on_axis_distance = use_x_dist ? rx - start.x : ry - start.y; - e_position = start.e + on_axis_distance * e_normalized_dist; - z_position = start.z + on_axis_distance * z_normalized_dist; + if (ry != start[Y_AXIS]) { + if (!inf_normalized_flag) { + on_axis_distance = use_x_dist ? rx - start[X_AXIS] : ry - start[Y_AXIS]; + e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; + z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; } else { - e_position = end.e; - z_position = end.z; + e_position = end[E_AXIS]; + z_position = end[Z_AXIS]; } - planner.buffer_segment(rx, ry, z_position + z0, e_position, scaled_fr_mm_s, extruder); + planner.buffer_segment(rx, ry, z_position + z0, e_position, feed_rate, extruder); } //else printf("FIRST MOVE PRUNED "); } + if (g26_debug_flag) + debug_current_and_destination(PSTR("vertical move done in ubl.line_to_destination_cartesian()")); + // At the final destination? Usually not, but when on a Y Mesh Line it's completed. - if (xy_pos_t(current_position) != xy_pos_t(end)) + if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) goto FINAL_MOVE; - current_position = destination; + set_current_from_destination(); return; } @@ -193,125 +230,181 @@ * Handle horizontal lines that stay within one row. * These need not be perfectly horizontal. */ - if (iadd.y == 0) { // Horizontal line? - icell.x += ineg.x; // Heading left? Just go to the left edge of the cell for the first move. - while (icell.x != iend.x + ineg.x) { - icell.x += iadd.x; - const float rx = mesh_index_to_xpos(icell.x); - const float ry = ratio * rx + c; // Calculate Y at the next X mesh line + if (dyi == 0) { // Horizontal line? + current_xi += left_flag; // Heading left? Just go to the left edge of the cell for the first move. + while (current_xi != cell_dest_xi + left_flag) { + current_xi += dxi; + const float next_mesh_line_x = mesh_index_to_xpos(current_xi), + ry = m * next_mesh_line_x + c; // Calculate Y at the next X mesh line - float z0 = z_correction_for_y_on_vertical_mesh_line(ry, icell.x, icell.y) - * planner.fade_scaling_factor_for_z(end.z); + float z0 = z_correction_for_y_on_vertical_mesh_line(ry, current_xi, current_yi) + * planner.fade_scaling_factor_for_z(end[Z_AXIS]); // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. if (isnan(z0)) z0 = 0.0; + const float rx = mesh_index_to_xpos(current_xi); + /** * Without this check, it's possible to generate a zero length move, as in the case where * the line is heading left, starting exactly on a mesh line boundary. Since this is rare * it might be fine to remove this check and let planner.buffer_segment() filter it out. */ - if (rx != start.x) { + if (rx != start[X_AXIS]) { if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? rx - start.x : ry - start.y; - e_position = start.e + on_axis_distance * e_normalized_dist; // is based on X or Y because this is a horizontal move - z_position = start.z + on_axis_distance * z_normalized_dist; + on_axis_distance = use_x_dist ? rx - start[X_AXIS] : ry - start[Y_AXIS]; + e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; // is based on X or Y because this is a horizontal move + z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; } else { - e_position = end.e; - z_position = end.z; + e_position = end[E_AXIS]; + z_position = end[Z_AXIS]; } - if (!planner.buffer_segment(rx, ry, z_position + z0, e_position, scaled_fr_mm_s, extruder)) + if (!planner.buffer_segment(rx, ry, z_position + z0, e_position, feed_rate, extruder)) break; } //else printf("FIRST MOVE PRUNED "); } - if (xy_pos_t(current_position) != xy_pos_t(end)) + if (g26_debug_flag) + debug_current_and_destination(PSTR("horizontal move done in ubl.line_to_destination_cartesian()")); + + if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) goto FINAL_MOVE; - current_position = destination; + set_current_from_destination(); return; } /** - * Generic case of a line crossing both X and Y Mesh lines. + * + * Handle the generic case of a line crossing both X and Y Mesh lines. + * */ - xy_int8_t cnt = (istart - iend).ABS(); + int xi_cnt = cell_start_xi - cell_dest_xi, + yi_cnt = cell_start_yi - cell_dest_yi; - icell += ineg; + if (xi_cnt < 0) xi_cnt = -xi_cnt; + if (yi_cnt < 0) yi_cnt = -yi_cnt; - while (cnt) { + current_xi += left_flag; + current_yi += down_flag; - const float next_mesh_line_x = mesh_index_to_xpos(icell.x + iadd.x), - next_mesh_line_y = mesh_index_to_ypos(icell.y + iadd.y), - ry = ratio * next_mesh_line_x + c, // Calculate Y at the next X mesh line - rx = (next_mesh_line_y - c) / ratio; // Calculate X at the next Y mesh line - // (No need to worry about ratio == 0. - // In that case, it was already detected - // as a vertical line move above.) + while (xi_cnt || yi_cnt) { - if (neg.x == (rx > next_mesh_line_x)) { // Check if we hit the Y line first + const float next_mesh_line_x = mesh_index_to_xpos(current_xi + dxi), + next_mesh_line_y = mesh_index_to_ypos(current_yi + dyi), + ry = m * next_mesh_line_x + c, // Calculate Y at the next X mesh line + rx = (next_mesh_line_y - c) / m; // Calculate X at the next Y mesh line + // (No need to worry about m being zero. + // If that was the case, it was already detected + // as a vertical line move above.) + + if (left_flag == (rx > next_mesh_line_x)) { // Check if we hit the Y line first // Yes! Crossing a Y Mesh Line next - float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, icell.x - ineg.x, icell.y + iadd.y) - * planner.fade_scaling_factor_for_z(end.z); + float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, current_xi - left_flag, current_yi + dyi) + * planner.fade_scaling_factor_for_z(end[Z_AXIS]); // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. if (isnan(z0)) z0 = 0.0; if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? rx - start.x : next_mesh_line_y - start.y; - e_position = start.e + on_axis_distance * e_normalized_dist; - z_position = start.z + on_axis_distance * z_normalized_dist; + on_axis_distance = use_x_dist ? rx - start[X_AXIS] : next_mesh_line_y - start[Y_AXIS]; + e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; + z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; } else { - e_position = end.e; - z_position = end.z; + e_position = end[E_AXIS]; + z_position = end[Z_AXIS]; } - if (!planner.buffer_segment(rx, next_mesh_line_y, z_position + z0, e_position, scaled_fr_mm_s, extruder)) + if (!planner.buffer_segment(rx, next_mesh_line_y, z_position + z0, e_position, feed_rate, extruder)) break; - icell.y += iadd.y; - cnt.y--; + current_yi += dyi; + yi_cnt--; } else { // Yes! Crossing a X Mesh Line next - float z0 = z_correction_for_y_on_vertical_mesh_line(ry, icell.x + iadd.x, icell.y - ineg.y) - * planner.fade_scaling_factor_for_z(end.z); + float z0 = z_correction_for_y_on_vertical_mesh_line(ry, current_xi + dxi, current_yi - down_flag) + * planner.fade_scaling_factor_for_z(end[Z_AXIS]); // Undefined parts of the Mesh in z_values[][] are NAN. // Replace NAN corrections with 0.0 to prevent NAN propagation. if (isnan(z0)) z0 = 0.0; if (!inf_normalized_flag) { - on_axis_distance = use_x_dist ? next_mesh_line_x - start.x : ry - start.y; - e_position = start.e + on_axis_distance * e_normalized_dist; - z_position = start.z + on_axis_distance * z_normalized_dist; + on_axis_distance = use_x_dist ? next_mesh_line_x - start[X_AXIS] : ry - start[Y_AXIS]; + e_position = start[E_AXIS] + on_axis_distance * e_normalized_dist; + z_position = start[Z_AXIS] + on_axis_distance * z_normalized_dist; } else { - e_position = end.e; - z_position = end.z; + e_position = end[E_AXIS]; + z_position = end[Z_AXIS]; } - if (!planner.buffer_segment(next_mesh_line_x, ry, z_position + z0, e_position, scaled_fr_mm_s, extruder)) + if (!planner.buffer_segment(next_mesh_line_x, ry, z_position + z0, e_position, feed_rate, extruder)) break; - icell.x += iadd.x; - cnt.x--; + current_xi += dxi; + xi_cnt--; } - if (cnt.x < 0 || cnt.y < 0) break; // Too far! Exit the loop and go to FINAL_MOVE + if (xi_cnt < 0 || yi_cnt < 0) break; // Too far! Exit the loop and go to FINAL_MOVE } - if (xy_pos_t(current_position) != xy_pos_t(end)) + if (g26_debug_flag) + debug_current_and_destination(PSTR("generic move done in ubl.line_to_destination_cartesian()")); + + if (current_position[X_AXIS] != end[X_AXIS] || current_position[Y_AXIS] != end[Y_AXIS]) goto FINAL_MOVE; - current_position = destination; + set_current_from_destination(); } #else // UBL_SEGMENTED + #if IS_SCARA // scale the feed rate from mm/s to degrees/s + static float scara_feed_factor, scara_oldA, scara_oldB; + #endif + + // We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic, + // so we call buffer_segment directly here. Per-segmented leveling and kinematics performed first. + + inline void _O2 ubl_buffer_segment_raw(const float (&in_raw)[XYZE], const float &fr) { + + #if ENABLED(SKEW_CORRECTION) + float raw[XYZE] = { in_raw[X_AXIS], in_raw[Y_AXIS], in_raw[Z_AXIS] }; + planner.skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); + #else + const float (&raw)[XYZE] = in_raw; + #endif + + #if ENABLED(DELTA) // apply delta inverse_kinematics + + DELTA_IK(raw); + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], fr, active_extruder); + + #elif IS_SCARA // apply scara inverse_kinematics (should be changed to save raw->logical->raw) + + inverse_kinematics(raw); // this writes delta[ABC] from raw[XYZE] + // should move the feedrate scaling to scara inverse_kinematics + + const float adiff = ABS(delta[A_AXIS] - scara_oldA), + bdiff = ABS(delta[B_AXIS] - scara_oldB); + scara_oldA = delta[A_AXIS]; + scara_oldB = delta[B_AXIS]; + float s_feedrate = MAX(adiff, bdiff) * scara_feed_factor; + + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], in_raw[E_AXIS], s_feedrate, active_extruder); + + #else // CARTESIAN + + planner.buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], in_raw[E_AXIS], fr, active_extruder); + + #endif + } + #if IS_SCARA #define DELTA_SEGMENT_MIN_LENGTH 0.25 // SCARA minimum segment size is 0.25mm #elif ENABLED(DELTA) @@ -330,66 +423,73 @@ * Returns true if did NOT move, false if moved (requires current_position update). */ - bool _O2 unified_bed_leveling::line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s) { + bool _O2 unified_bed_leveling::prepare_segmented_line_to(const float (&rtarget)[XYZE], const float &feedrate) { - if (!position_is_reachable(destination)) // fail if moving outside reachable boundary - return true; // did not move, so current_position still accurate + if (!position_is_reachable(rtarget[X_AXIS], rtarget[Y_AXIS])) // fail if moving outside reachable boundary + return true; // did not move, so current_position still accurate - const xyze_pos_t total = destination - current_position; + const float total[XYZE] = { + rtarget[X_AXIS] - current_position[X_AXIS], + rtarget[Y_AXIS] - current_position[Y_AXIS], + rtarget[Z_AXIS] - current_position[Z_AXIS], + rtarget[E_AXIS] - current_position[E_AXIS] + }; - const float cart_xy_mm_2 = HYPOT2(total.x, total.y), - cart_xy_mm = SQRT(cart_xy_mm_2); // Total XY distance + const float cartesian_xy_mm = HYPOT(total[X_AXIS], total[Y_AXIS]); // total horizontal xy distance #if IS_KINEMATIC - const float seconds = cart_xy_mm / scaled_fr_mm_s; // Duration of XY move at requested rate - uint16_t segments = LROUND(delta_segments_per_second * seconds), // Preferred number of segments for distance @ feedrate - seglimit = LROUND(cart_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // Number of segments at minimum segment length - NOMORE(segments, seglimit); // Limit to minimum segment length (fewer segments) + const float seconds = cartesian_xy_mm / feedrate; // seconds to move xy distance at requested rate + uint16_t segments = lroundf(delta_segments_per_second * seconds), // preferred number of segments for distance @ feedrate + seglimit = lroundf(cartesian_xy_mm * (1.0f / (DELTA_SEGMENT_MIN_LENGTH))); // number of segments at minimum segment length + NOMORE(segments, seglimit); // limit to minimum segment length (fewer segments) #else - uint16_t segments = LROUND(cart_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // Cartesian fixed segment length + uint16_t segments = lroundf(cartesian_xy_mm * (1.0f / (DELTA_SEGMENT_MIN_LENGTH))); // cartesian fixed segment length #endif - NOLESS(segments, 1U); // Must have at least one segment - const float inv_segments = 1.0f / segments, // Reciprocal to save calculation - segment_xyz_mm = SQRT(cart_xy_mm_2 + sq(total.z)) * inv_segments; // Length of each segment + NOLESS(segments, 1U); // must have at least one segment + const float inv_segments = 1.0f / segments; // divide once, multiply thereafter - #if ENABLED(SCARA_FEEDRATE_SCALING) - const float inv_duration = scaled_fr_mm_s / segment_xyz_mm; + #if IS_SCARA // scale the feed rate from mm/s to degrees/s + scara_feed_factor = cartesian_xy_mm * inv_segments * feedrate; + scara_oldA = planner.get_axis_position_degrees(A_AXIS); + scara_oldB = planner.get_axis_position_degrees(B_AXIS); #endif - xyze_float_t diff = total * inv_segments; + const float diff[XYZE] = { + total[X_AXIS] * inv_segments, + total[Y_AXIS] * inv_segments, + total[Z_AXIS] * inv_segments, + total[E_AXIS] * inv_segments + }; // Note that E segment distance could vary slightly as z mesh height // changes for each segment, but small enough to ignore. - xyze_pos_t raw = current_position; + float raw[XYZE] = { + current_position[X_AXIS], + current_position[Y_AXIS], + current_position[Z_AXIS], + current_position[E_AXIS] + }; - // Just do plain segmentation if UBL is inactive or the target is above the fade height - if (!planner.leveling_active || !planner.leveling_active_at_z(destination.z)) { + // Only compute leveling per segment if ubl active and target below z_fade_height. + if (!planner.leveling_active || !planner.leveling_active_at_z(rtarget[Z_AXIS])) { // no mesh leveling while (--segments) { - raw += diff; - planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, segment_xyz_mm - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - ); + LOOP_XYZE(i) raw[i] += diff[i]; + ubl_buffer_segment_raw(raw, feedrate); } - planner.buffer_line(destination, scaled_fr_mm_s, active_extruder, segment_xyz_mm - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - ); - return false; // Did not set current from destination + ubl_buffer_segment_raw(rtarget, feedrate); + return false; // moved but did not set_current_from_destination(); } // Otherwise perform per-segment leveling #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - const float fade_scaling_factor = planner.fade_scaling_factor_for_z(destination.z); + const float fade_scaling_factor = planner.fade_scaling_factor_for_z(rtarget[Z_AXIS]); #endif - // Move to first segment destination - raw += diff; + // increment to first segment destination + LOOP_XYZE(i) raw[i] += diff[i]; for (;;) { // for each mesh cell encountered during the move @@ -400,68 +500,72 @@ // in top of loop and again re-find same adjacent cell and use it, just less efficient // for mesh inset area. - xy_int8_t icell = { - int8_t((raw.x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)), - int8_t((raw.y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)) - }; - LIMIT(icell.x, 0, (GRID_MAX_POINTS_X) - 1); - LIMIT(icell.y, 0, (GRID_MAX_POINTS_Y) - 1); + int8_t cell_xi = (raw[X_AXIS] - (MESH_MIN_X)) * (1.0f / (MESH_X_DIST)), + cell_yi = (raw[Y_AXIS] - (MESH_MIN_Y)) * (1.0f / (MESH_Y_DIST)); - float z_x0y0 = z_values[icell.x ][icell.y ], // z at lower left corner - z_x1y0 = z_values[icell.x+1][icell.y ], // z at upper left corner - z_x0y1 = z_values[icell.x ][icell.y+1], // z at lower right corner - z_x1y1 = z_values[icell.x+1][icell.y+1]; // z at upper right corner + cell_xi = constrain(cell_xi, 0, (GRID_MAX_POINTS_X) - 1); + cell_yi = constrain(cell_yi, 0, (GRID_MAX_POINTS_Y) - 1); + + const float x0 = mesh_index_to_xpos(cell_xi), // 64 byte table lookup avoids mul+add + y0 = mesh_index_to_ypos(cell_yi); + + float z_x0y0 = z_values[cell_xi ][cell_yi ], // z at lower left corner + z_x1y0 = z_values[cell_xi+1][cell_yi ], // z at upper left corner + z_x0y1 = z_values[cell_xi ][cell_yi+1], // z at lower right corner + z_x1y1 = z_values[cell_xi+1][cell_yi+1]; // z at upper right corner if (isnan(z_x0y0)) z_x0y0 = 0; // ideally activating planner.leveling_active (G29 A) if (isnan(z_x1y0)) z_x1y0 = 0; // should refuse if any invalid mesh points if (isnan(z_x0y1)) z_x0y1 = 0; // in order to avoid isnan tests per cell, if (isnan(z_x1y1)) z_x1y1 = 0; // thus guessing zero for undefined points - const xy_pos_t pos = { mesh_index_to_xpos(icell.x), mesh_index_to_ypos(icell.y) }; - xy_pos_t cell = raw - pos; + float cx = raw[X_AXIS] - x0, // cell-relative x and y + cy = raw[Y_AXIS] - y0; - const float z_xmy0 = (z_x1y0 - z_x0y0) * RECIPROCAL(MESH_X_DIST), // z slope per x along y0 (lower left to lower right) - z_xmy1 = (z_x1y1 - z_x0y1) * RECIPROCAL(MESH_X_DIST); // z slope per x along y1 (upper left to upper right) + const float z_xmy0 = (z_x1y0 - z_x0y0) * (1.0f / (MESH_X_DIST)), // z slope per x along y0 (lower left to lower right) + z_xmy1 = (z_x1y1 - z_x0y1) * (1.0f / (MESH_X_DIST)); // z slope per x along y1 (upper left to upper right) - float z_cxy0 = z_x0y0 + z_xmy0 * cell.x; // z height along y0 at cell.x (changes for each cell.x in cell) + float z_cxy0 = z_x0y0 + z_xmy0 * cx; // z height along y0 at cx (changes for each cx in cell) - const float z_cxy1 = z_x0y1 + z_xmy1 * cell.x, // z height along y1 at cell.x - z_cxyd = z_cxy1 - z_cxy0; // z height difference along cell.x from y0 to y1 + const float z_cxy1 = z_x0y1 + z_xmy1 * cx, // z height along y1 at cx + z_cxyd = z_cxy1 - z_cxy0; // z height difference along cx from y0 to y1 - float z_cxym = z_cxyd * RECIPROCAL(MESH_Y_DIST); // z slope per y along cell.x from pos.y to y1 (changes for each cell.x in cell) + float z_cxym = z_cxyd * (1.0f / (MESH_Y_DIST)); // z slope per y along cx from y0 to y1 (changes for each cx in cell) - // float z_cxcy = z_cxy0 + z_cxym * cell.y; // interpolated mesh z height along cell.x at cell.y (do inside the segment loop) + // float z_cxcy = z_cxy0 + z_cxym * cy; // interpolated mesh z height along cx at cy (do inside the segment loop) // As subsequent segments step through this cell, the z_cxy0 intercept will change - // and the z_cxym slope will change, both as a function of cell.x within the cell, and + // and the z_cxym slope will change, both as a function of cx within the cell, and // each change by a constant for fixed segment lengths. - const float z_sxy0 = z_xmy0 * diff.x, // per-segment adjustment to z_cxy0 - z_sxym = (z_xmy1 - z_xmy0) * RECIPROCAL(MESH_Y_DIST) * diff.x; // per-segment adjustment to z_cxym + const float z_sxy0 = z_xmy0 * diff[X_AXIS], // per-segment adjustment to z_cxy0 + z_sxym = (z_xmy1 - z_xmy0) * (1.0f / (MESH_Y_DIST)) * diff[X_AXIS]; // per-segment adjustment to z_cxym for (;;) { // for all segments within this mesh cell - if (--segments == 0) raw = destination; // if this is last segment, use destination for exact + if (--segments == 0) // if this is last segment, use rtarget for exact + COPY(raw, rtarget); - const float z_cxcy = (z_cxy0 + z_cxym * cell.y) // interpolated mesh z height along cell.x at cell.y + const float z_cxcy = (z_cxy0 + z_cxym * cy) // interpolated mesh z height along cx at cy #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) * fade_scaling_factor // apply fade factor to interpolated mesh height #endif ; - planner.buffer_line(raw.x, raw.y, raw.z + z_cxcy, raw.e, scaled_fr_mm_s, active_extruder, segment_xyz_mm - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - ); + const float z = raw[Z_AXIS]; + raw[Z_AXIS] += z_cxcy; + ubl_buffer_segment_raw(raw, feedrate); + raw[Z_AXIS] = z; if (segments == 0) // done with last segment - return false; // didn't set current from destination + return false; // did not set_current_from_destination() - raw += diff; - cell += diff; + LOOP_XYZE(i) raw[i] += diff[i]; - if (!WITHIN(cell.x, 0, MESH_X_DIST) || !WITHIN(cell.y, 0, MESH_Y_DIST)) // done within this cell, break to next + cx += diff[X_AXIS]; + cy += diff[Y_AXIS]; + + if (!WITHIN(cx, 0, MESH_X_DIST) || !WITHIN(cy, 0, MESH_Y_DIST)) // done within this cell, break to next break; // Next segment still within same mesh cell, adjust the per-segment diff --git a/Marlin/src/feature/binary_stream.cpp b/Marlin/src/feature/binary_stream.cpp deleted file mode 100644 index 81e110339b..0000000000 --- a/Marlin/src/feature/binary_stream.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(BINARY_FILE_TRANSFER) - -#include "../sd/cardreader.h" -#include "binary_stream.h" - -char* SDFileTransferProtocol::Packet::Open::data = nullptr; -size_t SDFileTransferProtocol::data_waiting, SDFileTransferProtocol::transfer_timeout, SDFileTransferProtocol::idle_timeout; -bool SDFileTransferProtocol::transfer_active, SDFileTransferProtocol::dummy_transfer, SDFileTransferProtocol::compression; - -BinaryStream binaryStream[NUM_SERIAL]; - -#endif diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h deleted file mode 100644 index 32ebcce2f6..0000000000 --- a/Marlin/src/feature/binary_stream.h +++ /dev/null @@ -1,474 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfig.h" - -#define BINARY_STREAM_COMPRESSION - -#if ENABLED(BINARY_STREAM_COMPRESSION) - #include "../libs/heatshrink/heatshrink_decoder.h" -#endif - -inline bool bs_serial_data_available(const uint8_t index) { - switch (index) { - case 0: return MYSERIAL0.available(); - #if HAS_MULTI_SERIAL - case 1: return MYSERIAL1.available(); - #endif - } - return false; -} - -inline int bs_read_serial(const uint8_t index) { - switch (index) { - case 0: return MYSERIAL0.read(); - #if HAS_MULTI_SERIAL - case 1: return MYSERIAL1.read(); - #endif - } - return -1; -} - -#if ENABLED(BINARY_STREAM_COMPRESSION) - static heatshrink_decoder hsd; - static uint8_t decode_buffer[512] = {}; -#endif - -class SDFileTransferProtocol { -private: - struct Packet { - struct [[gnu::packed]] Open { - static bool validate(char* buffer, size_t length) { - return (length > sizeof(Open) && buffer[length - 1] == '\0'); - } - static Open& decode(char* buffer) { - data = &buffer[2]; - return *reinterpret_cast(buffer); - } - bool compression_enabled() { return compression & 0x1; } - bool dummy_transfer() { return dummy & 0x1; } - static char* filename() { return data; } - private: - uint8_t dummy, compression; - static char* data; // variable length strings complicate things - }; - }; - - static bool file_open(char* filename) { - if (!dummy_transfer) { - card.mount(); - card.openFileWrite(filename); - if (!card.isFileOpen()) return false; - } - transfer_active = true; - data_waiting = 0; - TERN_(BINARY_STREAM_COMPRESSION, heatshrink_decoder_reset(&hsd)); - return true; - } - - static bool file_write(char* buffer, const size_t length) { - #if ENABLED(BINARY_STREAM_COMPRESSION) - if (compression) { - size_t total_processed = 0, processed_count = 0; - HSD_poll_res presult; - - while (total_processed < length) { - heatshrink_decoder_sink(&hsd, reinterpret_cast(&buffer[total_processed]), length - total_processed, &processed_count); - total_processed += processed_count; - do { - presult = heatshrink_decoder_poll(&hsd, &decode_buffer[data_waiting], sizeof(decode_buffer) - data_waiting, &processed_count); - data_waiting += processed_count; - if (data_waiting == sizeof(decode_buffer)) { - if (!dummy_transfer) - if (card.write(decode_buffer, data_waiting) < 0) { - return false; - } - data_waiting = 0; - } - } while (presult == HSDR_POLL_MORE); - } - return true; - } - #endif - return (dummy_transfer || card.write(buffer, length) >= 0); - } - - static bool file_close() { - if (!dummy_transfer) { - #if ENABLED(BINARY_STREAM_COMPRESSION) - // flush any buffered data - if (data_waiting) { - if (card.write(decode_buffer, data_waiting) < 0) return false; - data_waiting = 0; - } - #endif - card.closefile(); - card.release(); - } - TERN_(BINARY_STREAM_COMPRESSION, heatshrink_decoder_finish(&hsd)); - transfer_active = false; - return true; - } - - static void transfer_abort() { - if (!dummy_transfer) { - card.closefile(); - card.removeFile(card.filename); - card.release(); - TERN_(BINARY_STREAM_COMPRESSION, heatshrink_decoder_finish(&hsd)); - } - transfer_active = false; - return; - } - - enum class FileTransfer : uint8_t { QUERY, OPEN, CLOSE, WRITE, ABORT }; - - static size_t data_waiting, transfer_timeout, idle_timeout; - static bool transfer_active, dummy_transfer, compression; - -public: - - static void idle() { - // If a transfer is interrupted and a file is left open, abort it after TIMEOUT ms - const millis_t ms = millis(); - if (transfer_active && ELAPSED(ms, idle_timeout)) { - idle_timeout = ms + IDLE_PERIOD; - if (ELAPSED(ms, transfer_timeout)) transfer_abort(); - } - } - - static void process(uint8_t packet_type, char* buffer, const uint16_t length) { - transfer_timeout = millis() + TIMEOUT; - switch (static_cast(packet_type)) { - case FileTransfer::QUERY: - SERIAL_ECHOPAIR("PFT:version:", VERSION_MAJOR, ".", VERSION_MINOR, ".", VERSION_PATCH); - #if ENABLED(BINARY_STREAM_COMPRESSION) - SERIAL_ECHOLNPAIR(":compresion:heatshrink,", HEATSHRINK_STATIC_WINDOW_BITS, ",", HEATSHRINK_STATIC_LOOKAHEAD_BITS); - #else - SERIAL_ECHOLNPGM(":compresion:none"); - #endif - break; - case FileTransfer::OPEN: - if (transfer_active) - SERIAL_ECHOLNPGM("PFT:busy"); - else { - if (Packet::Open::validate(buffer, length)) { - auto packet = Packet::Open::decode(buffer); - compression = packet.compression_enabled(); - dummy_transfer = packet.dummy_transfer(); - if (file_open(packet.filename())) { - SERIAL_ECHOLNPGM("PFT:success"); - break; - } - } - SERIAL_ECHOLNPGM("PFT:fail"); - } - break; - case FileTransfer::CLOSE: - if (transfer_active) { - if (file_close()) - SERIAL_ECHOLNPGM("PFT:success"); - else - SERIAL_ECHOLNPGM("PFT:ioerror"); - } - else SERIAL_ECHOLNPGM("PFT:invalid"); - break; - case FileTransfer::WRITE: - if (!transfer_active) - SERIAL_ECHOLNPGM("PFT:invalid"); - else if (!file_write(buffer, length)) - SERIAL_ECHOLNPGM("PFT:ioerror"); - break; - case FileTransfer::ABORT: - transfer_abort(); - SERIAL_ECHOLNPGM("PFT:success"); - break; - default: - SERIAL_ECHOLNPGM("PTF:invalid"); - break; - } - } - - static const uint16_t VERSION_MAJOR = 0, VERSION_MINOR = 1, VERSION_PATCH = 0, TIMEOUT = 10000, IDLE_PERIOD = 1000; -}; - -class BinaryStream { -public: - enum class Protocol : uint8_t { CONTROL, FILE_TRANSFER }; - - enum class ProtocolControl : uint8_t { SYNC = 1, CLOSE }; - - enum class StreamState : uint8_t { PACKET_RESET, PACKET_WAIT, PACKET_HEADER, PACKET_DATA, PACKET_FOOTER, - PACKET_PROCESS, PACKET_RESEND, PACKET_TIMEOUT, PACKET_ERROR }; - - struct Packet { // 10 byte protocol overhead, ascii with checksum and line number has a minimum of 7 increasing with line - - union Header { - static constexpr uint16_t HEADER_TOKEN = 0xB5AD; - struct [[gnu::packed]] { - uint16_t token; // packet start token - uint8_t sync; // stream sync, resend id and packet loss detection - uint8_t meta; // 4 bit protocol, - // 4 bit packet type - uint16_t size; // data length - uint16_t checksum; // header checksum - }; - uint8_t protocol() { return (meta >> 4) & 0xF; } - uint8_t type() { return meta & 0xF; } - void reset() { token = 0; sync = 0; meta = 0; size = 0; checksum = 0; } - uint8_t data[2]; - }; - - union Footer { - struct [[gnu::packed]] { - uint16_t checksum; // full packet checksum - }; - void reset() { checksum = 0; } - uint8_t data[1]; - }; - - Header header; - Footer footer; - uint32_t bytes_received; - uint16_t checksum, header_checksum; - millis_t timeout; - char* buffer; - - void reset() { - header.reset(); - footer.reset(); - bytes_received = 0; - checksum = 0; - header_checksum = 0; - timeout = millis() + PACKET_MAX_WAIT; - buffer = nullptr; - } - } packet{}; - - void reset() { - sync = 0; - packet_retries = 0; - buffer_next_index = 0; - } - - // fletchers 16 checksum - uint32_t checksum(uint32_t cs, uint8_t value) { - uint16_t cs_low = (((cs & 0xFF) + value) % 255); - return ((((cs >> 8) + cs_low) % 255) << 8) | cs_low; - } - - // read the next byte from the data stream keeping track of - // whether the stream times out from data starvation - // takes the data variable by reference in order to return status - bool stream_read(uint8_t& data) { - if (stream_state != StreamState::PACKET_WAIT && ELAPSED(millis(), packet.timeout)) { - stream_state = StreamState::PACKET_TIMEOUT; - return false; - } - if (!bs_serial_data_available(card.transfer_port_index)) return false; - data = bs_read_serial(card.transfer_port_index); - packet.timeout = millis() + PACKET_MAX_WAIT; - return true; - } - - template - void receive(char (&buffer)[buffer_size]) { - uint8_t data = 0; - millis_t transfer_window = millis() + RX_TIMESLICE; - - #if ENABLED(SDSUPPORT) - PORT_REDIRECT(card.transfer_port_index); - #endif - - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Warray-bounds" - - while (PENDING(millis(), transfer_window)) { - switch (stream_state) { - /** - * Data stream packet handling - */ - case StreamState::PACKET_RESET: - packet.reset(); - stream_state = StreamState::PACKET_WAIT; - case StreamState::PACKET_WAIT: - if (!stream_read(data)) { idle(); return; } // no active packet so don't wait - packet.header.data[1] = data; - if (packet.header.token == packet.header.HEADER_TOKEN) { - packet.bytes_received = 2; - stream_state = StreamState::PACKET_HEADER; - } - else { - // stream corruption drop data - packet.header.data[0] = data; - } - break; - case StreamState::PACKET_HEADER: - if (!stream_read(data)) break; - - packet.header.data[packet.bytes_received++] = data; - packet.checksum = checksum(packet.checksum, data); - - // header checksum calculation can't contain the checksum - if (packet.bytes_received == sizeof(Packet::header) - 2) - packet.header_checksum = packet.checksum; - - if (packet.bytes_received == sizeof(Packet::header)) { - if (packet.header.checksum == packet.header_checksum) { - // The SYNC control packet is a special case in that it doesn't require the stream sync to be correct - if (static_cast(packet.header.protocol()) == Protocol::CONTROL && static_cast(packet.header.type()) == ProtocolControl::SYNC) { - SERIAL_ECHOLNPAIR("ss", sync, ",", buffer_size, ",", VERSION_MAJOR, ".", VERSION_MINOR, ".", VERSION_PATCH); - stream_state = StreamState::PACKET_RESET; - break; - } - if (packet.header.sync == sync) { - buffer_next_index = 0; - packet.bytes_received = 0; - if (packet.header.size) { - stream_state = StreamState::PACKET_DATA; - packet.buffer = static_cast(&buffer[0]); // multipacket buffering not implemented, always allocate whole buffer to packet - } - else - stream_state = StreamState::PACKET_PROCESS; - } - else if (packet.header.sync == sync - 1) { // ok response must have been lost - SERIAL_ECHOLNPAIR("ok", packet.header.sync); // transmit valid packet received and drop the payload - stream_state = StreamState::PACKET_RESET; - } - else if (packet_retries) { - stream_state = StreamState::PACKET_RESET; // could be packets already buffered on flow controlled connections, drop them without ack - } - else { - SERIAL_ECHO_MSG("Datastream packet out of order"); - stream_state = StreamState::PACKET_RESEND; - } - } - else { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Packet header(", packet.header.sync, "?) corrupt"); - stream_state = StreamState::PACKET_RESEND; - } - } - break; - case StreamState::PACKET_DATA: - if (!stream_read(data)) break; - - if (buffer_next_index < buffer_size) - packet.buffer[buffer_next_index] = data; - else { - SERIAL_ECHO_MSG("Datastream packet data buffer overrun"); - stream_state = StreamState::PACKET_ERROR; - break; - } - - packet.checksum = checksum(packet.checksum, data); - packet.bytes_received++; - buffer_next_index++; - - if (packet.bytes_received == packet.header.size) { - stream_state = StreamState::PACKET_FOOTER; - packet.bytes_received = 0; - } - break; - case StreamState::PACKET_FOOTER: - if (!stream_read(data)) break; - - packet.footer.data[packet.bytes_received++] = data; - if (packet.bytes_received == sizeof(Packet::footer)) { - if (packet.footer.checksum == packet.checksum) { - stream_state = StreamState::PACKET_PROCESS; - } - else { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Packet(", packet.header.sync, ") payload corrupt"); - stream_state = StreamState::PACKET_RESEND; - } - } - break; - case StreamState::PACKET_PROCESS: - sync++; - packet_retries = 0; - bytes_received += packet.header.size; - - SERIAL_ECHOLNPAIR("ok", packet.header.sync); // transmit valid packet received - dispatch(); - stream_state = StreamState::PACKET_RESET; - break; - case StreamState::PACKET_RESEND: - if (packet_retries < MAX_RETRIES || MAX_RETRIES == 0) { - packet_retries++; - stream_state = StreamState::PACKET_RESET; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Resend request ", int(packet_retries)); - SERIAL_ECHOLNPAIR("rs", sync); - } - else - stream_state = StreamState::PACKET_ERROR; - break; - case StreamState::PACKET_TIMEOUT: - SERIAL_ECHO_MSG("Datastream timeout"); - stream_state = StreamState::PACKET_RESEND; - break; - case StreamState::PACKET_ERROR: - SERIAL_ECHOLNPAIR("fe", packet.header.sync); - reset(); // reset everything, resync required - stream_state = StreamState::PACKET_RESET; - break; - } - } - - #pragma GCC diagnostic pop - } - - void dispatch() { - switch (static_cast(packet.header.protocol())) { - case Protocol::CONTROL: - switch (static_cast(packet.header.type())) { - case ProtocolControl::CLOSE: // revert back to ASCII mode - card.flag.binary_mode = false; - break; - default: - SERIAL_ECHO_MSG("Unknown BinaryProtocolControl Packet"); - } - break; - case Protocol::FILE_TRANSFER: - SDFileTransferProtocol::process(packet.header.type(), packet.buffer, packet.header.size); // send user data to be processed - break; - default: - SERIAL_ECHO_MSG("Unsupported Binary Protocol"); - } - } - - void idle() { - // Some Protocols may need periodic updates without new data - SDFileTransferProtocol::idle(); - } - - static const uint16_t PACKET_MAX_WAIT = 500, RX_TIMESLICE = 20, MAX_RETRIES = 0, VERSION_MAJOR = 0, VERSION_MINOR = 1, VERSION_PATCH = 0; - uint8_t packet_retries, sync; - uint16_t buffer_next_index; - uint32_t bytes_received; - StreamState stream_state = StreamState::PACKET_RESET; -}; - -extern BinaryStream binaryStream[NUM_SERIAL]; diff --git a/Marlin/src/feature/bltouch.cpp b/Marlin/src/feature/bltouch.cpp deleted file mode 100644 index d6b1f99c16..0000000000 --- a/Marlin/src/feature/bltouch.cpp +++ /dev/null @@ -1,206 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfig.h" - -#if ENABLED(BLTOUCH) - -#include "bltouch.h" - -BLTouch bltouch; - -bool BLTouch::last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain - -#include "../module/servo.h" - -void stop(); - -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../core/debug_out.h" - -bool BLTouch::command(const BLTCommand cmd, const millis_t &ms) { - if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("BLTouch Command :", cmd); - MOVE_SERVO(Z_PROBE_SERVO_NR, cmd); - safe_delay(_MAX(ms, (uint32_t)BLTOUCH_DELAY)); // BLTOUCH_DELAY is also the *minimum* delay - return triggered(); -} - -// Init the class and device. Call from setup(). -void BLTouch::init(const bool set_voltage/*=false*/) { - // Voltage Setting (if enabled). At every Marlin initialization: - // BLTOUCH < V3.0 and clones: This will be ignored by the probe - // BLTOUCH V3.0: SET_5V_MODE or SET_OD_MODE (if enabled). - // OD_MODE is the default on power on, but setting it does not hurt - // This mode will stay active until manual SET_OD_MODE or power cycle - // BLTOUCH V3.1: SET_5V_MODE or SET_OD_MODE (if enabled). - // At power on, the probe will default to the eeprom settings configured by the user - _reset(); - _stow(); - - #if ENABLED(BLTOUCH_FORCE_MODE_SET) - - constexpr bool should_set = true; - - #else - - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR("last_written_mode - ", (int)last_written_mode); - DEBUG_ECHOLNPGM("config mode - " - #if ENABLED(BLTOUCH_SET_5V_MODE) - "BLTOUCH_SET_5V_MODE" - #else - "OD" - #endif - ); - } - - const bool should_set = last_written_mode != ENABLED(BLTOUCH_SET_5V_MODE); - - #endif - - if (should_set && set_voltage) - mode_conv_proc(ENABLED(BLTOUCH_SET_5V_MODE)); -} - -void BLTouch::clear() { - _reset(); // RESET or RESET_SW will clear an alarm condition but... - // ...it will not clear a triggered condition in SW mode when the pin is currently up - // ANTClabs <-- CODE ERROR - _stow(); // STOW will pull up the pin and clear any triggered condition unless it fails, don't care - _deploy(); // DEPLOY to test the probe. Could fail, don't care - _stow(); // STOW to be ready for meaningful work. Could fail, don't care -} - -bool BLTouch::triggered() { - return ( - #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING - #else - READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING - #endif - ); -} - -bool BLTouch::deploy_proc() { - // Do a DEPLOY - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch DEPLOY requested"); - - // Attempt to DEPLOY, wait for DEPLOY_DELAY or ALARM - if (_deploy_query_alarm()) { - // The deploy might have failed or the probe is already triggered (nozzle too low?) - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch ALARM or TRIGGER after DEPLOY, recovering"); - - clear(); // Get the probe into start condition - - // Last attempt to DEPLOY - if (_deploy_query_alarm()) { - // The deploy might have failed or the probe is actually triggered (nozzle too low?) again - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Recovery Failed"); - - SERIAL_ERROR_MSG(STR_STOP_BLTOUCH); // Tell the user something is wrong, needs action - stop(); // but it's not too bad, no need to kill, allow restart - - return true; // Tell our caller we goofed in case he cares to know - } - } - - // One of the recommended ANTClabs ways to probe, using SW MODE - TERN_(BLTOUCH_FORCE_SW_MODE, _set_SW_mode()); - - // Now the probe is ready to issue a 10ms pulse when the pin goes up. - // The trigger STOW (see motion.cpp for example) will pull up the probes pin as soon as the pulse - // is registered. - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("bltouch.deploy_proc() end"); - - return false; // report success to caller -} - -bool BLTouch::stow_proc() { - // Do a STOW - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch STOW requested"); - - // A STOW will clear a triggered condition in the probe (10ms pulse). - // At the moment that we come in here, we might (pulse) or will (SW mode) see the trigger on the pin. - // So even though we know a STOW will be ignored if an ALARM condition is active, we will STOW. - // Note: If the probe is deployed AND in an ALARM condition, this STOW will not pull up the pin - // and the ALARM condition will still be there. --> ANTClabs should change this behavior maybe - - // Attempt to STOW, wait for STOW_DELAY or ALARM - if (_stow_query_alarm()) { - // The stow might have failed - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch ALARM or TRIGGER after STOW, recovering"); - - _reset(); // This RESET will then also pull up the pin. If it doesn't - // work and the pin is still down, there will no longer be - // an ALARM condition though. - // But one more STOW will catch that - // Last attempt to STOW - if (_stow_query_alarm()) { // so if there is now STILL an ALARM condition: - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Recovery Failed"); - - SERIAL_ERROR_MSG(STR_STOP_BLTOUCH); // Tell the user something is wrong, needs action - stop(); // but it's not too bad, no need to kill, allow restart - - return true; // Tell our caller we goofed in case he cares to know - } - } - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("bltouch.stow_proc() end"); - - return false; // report success to caller -} - -bool BLTouch::status_proc() { - /** - * Return a TRUE for "YES, it is DEPLOYED" - * This function will ensure switch state is reset after execution - */ - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch STATUS requested"); - - _set_SW_mode(); // Incidentally, _set_SW_mode() will also RESET any active alarm - const bool tr = triggered(); // If triggered in SW mode, the pin is up, it is STOWED - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("BLTouch is ", (int)tr); - - if (tr) _stow(); else _deploy(); // Turn off SW mode, reset any trigger, honor pin state - return !tr; -} - -void BLTouch::mode_conv_proc(const bool M5V) { - /** - * BLTOUCH pre V3.0 and clones: No reaction at all to this sequence apart from a DEPLOY -> STOW - * BLTOUCH V3.0: This will set the mode (twice) and sadly, a STOW is needed at the end, because of the deploy - * BLTOUCH V3.1: This will set the mode and store it in the eeprom. The STOW is not needed but does not hurt - */ - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("BLTouch Set Mode - ", (int)M5V); - _deploy(); - if (M5V) _set_5V_mode(); else _set_OD_mode(); - _mode_store(); - if (M5V) _set_5V_mode(); else _set_OD_mode(); - _stow(); - last_written_mode = M5V; -} - -#endif // BLTOUCH diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h deleted file mode 100644 index 40685af1b3..0000000000 --- a/Marlin/src/feature/bltouch.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfigPre.h" - -// BLTouch commands are sent as servo angles -typedef unsigned char BLTCommand; - -#if ENABLED(CREALITY_TOUCH) - #define STOW_ALARM false - #define BLTOUCH_DEPLOY 170 - #define BLTOUCH_STOW 20 -#else - #define STOW_ALARM true - #define BLTOUCH_DEPLOY 10 - #define BLTOUCH_STOW 90 -#endif - -#define BLTOUCH_SW_MODE 60 -#define BLTOUCH_SELFTEST 120 -#define BLTOUCH_MODE_STORE 130 -#define BLTOUCH_5V_MODE 140 -#define BLTOUCH_OD_MODE 150 -#define BLTOUCH_RESET 160 - -/** - * The following commands require different minimum delays. - * - * 500ms required for a reliable Reset. - * - * 750ms required for Deploy/Stow, otherwise the alarm state - * will not be seen until the following move command. - */ - -#ifndef BLTOUCH_SET5V_DELAY - #define BLTOUCH_SET5V_DELAY 150 -#endif -#ifndef BLTOUCH_SETOD_DELAY - #define BLTOUCH_SETOD_DELAY 150 -#endif -#ifndef BLTOUCH_MODE_STORE_DELAY - #define BLTOUCH_MODE_STORE_DELAY 150 -#endif -#ifndef BLTOUCH_DEPLOY_DELAY - #define BLTOUCH_DEPLOY_DELAY 750 -#endif -#ifndef BLTOUCH_STOW_DELAY - #define BLTOUCH_STOW_DELAY 750 -#endif -#ifndef BLTOUCH_RESET_DELAY - #define BLTOUCH_RESET_DELAY 500 -#endif - -class BLTouch { -public: - static void init(const bool set_voltage=false); - static bool last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain - - // DEPLOY and STOW are wrapped for error handling - these are used by homing and by probing - FORCE_INLINE static bool deploy() { return deploy_proc(); } - FORCE_INLINE static bool stow() { return stow_proc(); } - FORCE_INLINE static bool status() { return status_proc(); } - - // Native BLTouch commands ("Underscore"...), used in lcd menus and internally - FORCE_INLINE static void _reset() { command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); } - - FORCE_INLINE static void _selftest() { command(BLTOUCH_SELFTEST, BLTOUCH_DELAY); } - - FORCE_INLINE static void _set_SW_mode() { command(BLTOUCH_SW_MODE, BLTOUCH_DELAY); } - FORCE_INLINE static void _reset_SW_mode() { if (triggered()) _stow(); else _deploy(); } - - FORCE_INLINE static void _set_5V_mode() { command(BLTOUCH_5V_MODE, BLTOUCH_SET5V_DELAY); } - FORCE_INLINE static void _set_OD_mode() { command(BLTOUCH_OD_MODE, BLTOUCH_SETOD_DELAY); } - FORCE_INLINE static void _mode_store() { command(BLTOUCH_MODE_STORE, BLTOUCH_MODE_STORE_DELAY); } - - FORCE_INLINE static void _deploy() { command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } - FORCE_INLINE static void _stow() { command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY); } - - FORCE_INLINE static void mode_conv_5V() { mode_conv_proc(true); } - FORCE_INLINE static void mode_conv_OD() { mode_conv_proc(false); } - - static bool triggered(); - -private: - FORCE_INLINE static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } - FORCE_INLINE static bool _stow_query_alarm() { return command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY) == STOW_ALARM; } - - static void clear(); - static bool command(const BLTCommand cmd, const millis_t &ms); - static bool deploy_proc(); - static bool stow_proc(); - static bool status_proc(); - static void mode_conv_proc(const bool M5V); -}; - -extern BLTouch bltouch; diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp deleted file mode 100644 index 16f876f136..0000000000 --- a/Marlin/src/feature/cancel_object.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../inc/MarlinConfig.h" - -#if ENABLED(CANCEL_OBJECTS) - -#include "cancel_object.h" -#include "../gcode/gcode.h" -#include "../lcd/ultralcd.h" - -CancelObject cancelable; - -int8_t CancelObject::object_count, // = 0 - CancelObject::active_object = -1; -uint32_t CancelObject::canceled; // = 0x0000 -bool CancelObject::skipping; // = false - -void CancelObject::set_active_object(const int8_t obj) { - active_object = obj; - if (WITHIN(obj, 0, 31)) { - if (obj >= object_count) object_count = obj + 1; - skipping = TEST(canceled, obj); - } - else - skipping = false; - - #if HAS_DISPLAY - if (active_object >= 0) - ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object)); - else - ui.reset_status(); - #endif -} - -void CancelObject::cancel_object(const int8_t obj) { - if (WITHIN(obj, 0, 31)) { - SBI(canceled, obj); - if (obj == active_object) skipping = true; - } -} - -void CancelObject::uncancel_object(const int8_t obj) { - if (WITHIN(obj, 0, 31)) { - CBI(canceled, obj); - if (obj == active_object) skipping = false; - } -} - -void CancelObject::report() { - if (active_object >= 0) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Active Object: ", int(active_object)); - } - - if (canceled) { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Canceled:"); - for (int i = 0; i < object_count; i++) - if (TEST(canceled, i)) { SERIAL_CHAR(' '); SERIAL_ECHO(i); } - SERIAL_EOL(); - } -} - -#endif // CANCEL_OBJECTS diff --git a/Marlin/src/feature/cancel_object.h b/Marlin/src/feature/cancel_object.h deleted file mode 100644 index 1d2d77f203..0000000000 --- a/Marlin/src/feature/cancel_object.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -class CancelObject { -public: - static bool skipping; - static int8_t object_count, active_object; - static uint32_t canceled; - static void set_active_object(const int8_t obj); - static void cancel_object(const int8_t obj); - static void uncancel_object(const int8_t obj); - static void report(); - static inline bool is_canceled(const int8_t obj) { return TEST(canceled, obj); } - static inline void clear_active_object() { set_active_object(-1); } - static inline void cancel_active_object() { cancel_object(active_object); } - static inline void reset() { canceled = 0x0000; object_count = 0; clear_active_object(); } -}; - -extern CancelObject cancelable; diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp index 8a128bb12d..e2cc23368a 100644 --- a/Marlin/src/feature/caselight.cpp +++ b/Marlin/src/feature/caselight.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,23 +16,20 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../inc/MarlinConfig.h" -#if ENABLED(CASE_LIGHT_ENABLE) +#if HAS_CASE_LIGHT -#include "caselight.h" - -CaseLight caselight; - -uint8_t CaseLight::brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; -bool CaseLight::on = CASE_LIGHT_DEFAULT_ON; +uint8_t case_light_brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS; +bool case_light_on = CASE_LIGHT_DEFAULT_ON; #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - LEDColor CaseLight::color = + #include "leds/leds.h" + LEDColor case_light_color = #ifdef CASE_LIGHT_NEOPIXEL_COLOR CASE_LIGHT_NEOPIXEL_COLOR #else @@ -41,55 +38,46 @@ bool CaseLight::on = CASE_LIGHT_DEFAULT_ON; ; #endif +/** + * The following are needed because ARM chips ignore a "WRITE(CASE_LIGHT_PIN,x)" command to the pins that + * are directly controlled by the PWM module. In order to turn them off the brightness level needs to be + * set to off. Since we can't use the pwm register to save the last brightness level we need a variable + * to save it. + */ +uint8_t case_light_brightness_sav; // saves brighness info so can restore when "M355 S1" received +bool case_light_arg_flag; // flag to notify if S or P argument type + #ifndef INVERT_CASE_LIGHT #define INVERT_CASE_LIGHT false #endif -void CaseLight::update(const bool sflag) { - /** - * The brightness_sav (and sflag) is needed because ARM chips ignore - * a "WRITE(CASE_LIGHT_PIN,x)" command to the pins that are directly - * controlled by the PWM module. In order to turn them off the brightness - * level needs to be set to OFF. Since we can't use the PWM register to - * save the last brightness level we need a variable to save it. - */ - static uint8_t brightness_sav; // Save brightness info for restore on "M355 S1" +void update_case_light() { - if (on || !sflag) - brightness_sav = brightness; // Save brightness except for M355 S0 - if (sflag && on) - brightness = brightness_sav; // Restore last brightness for M355 S1 + if (!(case_light_arg_flag && !case_light_on)) + case_light_brightness_sav = case_light_brightness; // save brightness except if this is an S0 argument + if (case_light_arg_flag && case_light_on) + case_light_brightness = case_light_brightness_sav; // restore last brightens if this is an S1 argument - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) || DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - const uint8_t i = on ? brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; - #endif + const uint8_t i = case_light_on ? case_light_brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) leds.set_color( - MakeLEDColor(color.r, color.g, color.b, color.w, n10ct), + MakeLEDColor(case_light_color.r, case_light_color.g, case_light_color.b, case_light_color.w, n10ct), false ); #else // !CASE_LIGHT_USE_NEOPIXEL - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - if (PWM_PIN(CASE_LIGHT_PIN)) - analogWrite(pin_t(CASE_LIGHT_PIN), ( - #if CASE_LIGHT_MAX_PWM == 255 - n10ct - #else - map(n10ct, 0, 255, 0, CASE_LIGHT_MAX_PWM) - #endif - )); - else - #endif - { - const bool s = on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; - WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); - } + SET_OUTPUT(CASE_LIGHT_PIN); + if (USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN)) + analogWrite(CASE_LIGHT_PIN, n10ct); + else { + const bool s = case_light_on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; + WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); + } #endif // !CASE_LIGHT_USE_NEOPIXEL } -#endif // CASE_LIGHT_ENABLE +#endif // HAS_CASE_LIGHT diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h index 9d1e76da26..3e16819eb5 100644 --- a/Marlin/src/feature/caselight.h +++ b/Marlin/src/feature/caselight.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,30 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include "../inc/MarlinConfigPre.h" +#ifndef __CASELIGHT_H__ +#define __CASELIGHT_H__ -#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - #include "leds/leds.h" -#endif +extern uint8_t case_light_brightness; +extern bool case_light_on; +extern uint8_t case_light_brightness_sav; // saves brighness info when case_light_on is false +extern bool case_light_arg_flag; // flag to notify if S or P argument type -class CaseLight { -public: - static uint8_t brightness; - static bool on; +void update_case_light(); - static void update(const bool sflag); - static inline void update_brightness() { update(false); } - static inline void update_enabled() { update(true); } - -private: - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - static LEDColor color; - #endif -}; - -extern CaseLight caselight; +#endif // __CASELIGHT_H__ diff --git a/Marlin/src/feature/closedloop.cpp b/Marlin/src/feature/closedloop.cpp index 8a97f0c0cd..2fe60fcf9c 100644 --- a/Marlin/src/feature/closedloop.cpp +++ b/Marlin/src/feature/closedloop.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../inc/MarlinConfig.h" @@ -29,14 +29,12 @@ #include "closedloop.h" -ClosedLoop closedloop; - -void ClosedLoop::init() { +void init_closedloop() { OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, LOW); SET_INPUT_PULLUP(CLOSED_LOOP_MOVE_COMPLETE_PIN); } -void ClosedLoop::set(const byte val) { +void set_closedloop(const byte val) { OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, val); } diff --git a/Marlin/src/feature/closedloop.h b/Marlin/src/feature/closedloop.h index e03400c35c..84cec36fe6 100644 --- a/Marlin/src/feature/closedloop.h +++ b/Marlin/src/feature/closedloop.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,10 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #pragma once -class ClosedLoop { -public: - static void init(); - static void set(const byte val); -}; - -extern ClosedLoop closedloop; - -#define CLOSED_LOOP_WAITING() (READ(CLOSED_LOOP_ENABLE_PIN) && !READ(CLOSED_LOOP_MOVE_COMPLETE_PIN)) +void init_closedloop(); +void set_closedloop(const byte val); diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index fa5a86b019..b98bb80a0f 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,71 +24,56 @@ #if ENABLED(USE_CONTROLLER_FAN) -#include "controllerfan.h" -#include "../module/stepper/indirection.h" +#include "../module/stepper_indirection.h" #include "../module/temperature.h" -ControllerFan controllerFan; +uint8_t controllerFanSpeed; -uint8_t ControllerFan::speed; - -#if ENABLED(CONTROLLER_FAN_EDITABLE) - controllerFan_settings_t ControllerFan::settings; // {0} -#endif - -void ControllerFan::setup() { - SET_OUTPUT(CONTROLLER_FAN_PIN); - init(); -} - -void ControllerFan::set_fan_speed(const uint8_t s) { - speed = s < (CONTROLLERFAN_SPEED_MIN) ? 0 : s; // Fan OFF below minimum -} - -void ControllerFan::update() { - static millis_t lastMotorOn = 0, // Last time a motor was turned on +void controllerfan_update() { + static millis_t lastMotorOn = 0, // Last time a motor was turned on nextMotorCheck = 0; // Last time the state was checked const millis_t ms = millis(); if (ELAPSED(ms, nextMotorCheck)) { nextMotorCheck = ms + 2500UL; // Not a time critical function, so only check every 2.5s - #define MOTOR_IS_ON(A,B) (A##_ENABLE_READ() == bool(B##_ENABLE_ON)) - #define _OR_ENABLED_E(N) || MOTOR_IS_ON(E##N,E) - - const bool motor_on = ( - ( DISABLED(CONTROLLER_FAN_IGNORE_Z) && - ( MOTOR_IS_ON(Z,Z) - || TERN0(HAS_Z2_ENABLE, MOTOR_IS_ON(Z2,Z)) - || TERN0(HAS_Z3_ENABLE, MOTOR_IS_ON(Z3,Z)) - || TERN0(HAS_Z4_ENABLE, MOTOR_IS_ON(Z4,Z)) - ) - ) || ( - DISABLED(CONTROLLER_FAN_USE_Z_ONLY) && - ( MOTOR_IS_ON(X,X) || MOTOR_IS_ON(Y,Y) - || TERN0(HAS_X2_ENABLE, MOTOR_IS_ON(X2,X)) - || TERN0(HAS_Y2_ENABLE, MOTOR_IS_ON(Y2,Y)) - #if E_STEPPERS - REPEAT(E_STEPPERS, _OR_ENABLED_E) + // If any of the drivers or the bed are enabled... + if (X_ENABLE_READ == X_ENABLE_ON || Y_ENABLE_READ == Y_ENABLE_ON || Z_ENABLE_READ == Z_ENABLE_ON + #if HAS_HEATED_BED + || thermalManager.soft_pwm_amount_bed > 0 + #endif + #if HAS_X2_ENABLE + || X2_ENABLE_READ == X_ENABLE_ON + #endif + #if HAS_Y2_ENABLE + || Y2_ENABLE_READ == Y_ENABLE_ON + #endif + #if HAS_Z2_ENABLE + || Z2_ENABLE_READ == Z_ENABLE_ON + #endif + || E0_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 1 + || E1_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 2 + || E2_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 3 + || E3_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 4 + || E4_ENABLE_READ == E_ENABLE_ON + #endif + #endif #endif - ) - ) - ); - - // If any of the drivers or the heated bed are enabled... - if (motor_on || TERN0(HAS_HEATED_BED, thermalManager.temp_bed.soft_pwm_amount > 0)) + #endif + ) { lastMotorOn = ms; //... set time to NOW so the fan will turn on + } - // Fan Settings. Set fan > 0: - // - If AutoMode is on and steppers have been enabled for CONTROLLERFAN_IDLE_TIME seconds. - // - If System is on idle and idle fan speed settings is activated. - set_fan_speed( - settings.auto_mode && lastMotorOn && PENDING(ms, lastMotorOn + SEC_TO_MS(settings.duration)) - ? settings.active_speed : settings.idle_speed - ); + // Fan off if no steppers have been enabled for CONTROLLERFAN_SECS seconds + uint8_t speed = (!lastMotorOn || ELAPSED(ms, lastMotorOn + (CONTROLLERFAN_SECS) * 1000UL)) ? 0 : CONTROLLERFAN_SPEED; + controllerFanSpeed = speed; - // Allow digital or PWM fan output (see M42 handling) + // allows digital or PWM fan output to be used (see M42 handling) WRITE(CONTROLLER_FAN_PIN, speed); - analogWrite(pin_t(CONTROLLER_FAN_PIN), speed); + analogWrite(CONTROLLER_FAN_PIN, speed); } } diff --git a/Marlin/src/feature/controllerfan.h b/Marlin/src/feature/controllerfan.h index d1d39f21f3..8a7b393c33 100644 --- a/Marlin/src/feature/controllerfan.h +++ b/Marlin/src/feature/controllerfan.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,57 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include "../inc/MarlinConfigPre.h" +#ifndef __CONTROLLERFAN_H__ +#define __CONTROLLERFAN_H__ -typedef struct { - uint8_t active_speed, // 0-255 (fullspeed); Speed with enabled stepper motors - idle_speed; // 0-255 (fullspeed); Speed after idle period with all motors are disabled - uint16_t duration; // Duration in seconds for the fan to run after all motors are disabled - bool auto_mode; // Default true -} controllerFan_settings_t; +void controllerfan_update(); -#ifndef CONTROLLERFAN_SPEED_ACTIVE - #define CONTROLLERFAN_SPEED_ACTIVE 255 -#endif -#ifndef CONTROLLERFAN_SPEED_IDLE - #define CONTROLLERFAN_SPEED_IDLE 0 -#endif -#ifndef CONTROLLERFAN_IDLE_TIME - #define CONTROLLERFAN_IDLE_TIME 60 -#endif - -static constexpr controllerFan_settings_t controllerFan_defaults = { - CONTROLLERFAN_SPEED_ACTIVE, - CONTROLLERFAN_SPEED_IDLE, - CONTROLLERFAN_IDLE_TIME, - true -}; - -#if ENABLED(USE_CONTROLLER_FAN) - -class ControllerFan { - private: - static uint8_t speed; - static void set_fan_speed(const uint8_t s); - - public: - #if ENABLED(CONTROLLER_FAN_EDITABLE) - static controllerFan_settings_t settings; - #else - static const controllerFan_settings_t constexpr &settings = controllerFan_defaults; - #endif - static inline bool state() { return speed > 0; } - static inline void init() { reset(); } - static inline void reset() { TERN_(CONTROLLER_FAN_EDITABLE, settings = controllerFan_defaults); } - static void setup(); - static void update(); -}; - -extern ControllerFan controllerFan; - -#endif +#endif // __CONTROLLERFAN_H__ diff --git a/Marlin/src/feature/dac/dac_dac084s085.cpp b/Marlin/src/feature/dac/dac_dac084s085.cpp index 82d17fa28f..eb3a67de2a 100644 --- a/Marlin/src/feature/dac/dac_dac084s085.cpp +++ b/Marlin/src/feature/dac/dac_dac084s085.cpp @@ -10,7 +10,7 @@ #include "dac_dac084s085.h" -#include "../../MarlinCore.h" +#include "../../Marlin.h" #include "../../module/stepper.h" #include "../../HAL/shared/Delay.h" @@ -21,7 +21,7 @@ void dac084s085::begin() { // All SPI chip-select HIGH SET_OUTPUT(DAC0_SYNC); - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 SET_OUTPUT(DAC1_SYNC); #endif cshigh(); @@ -38,7 +38,7 @@ void dac084s085::begin() { spiSend(SPI_CHAN_DAC, externalDac_buf, COUNT(externalDac_buf)); WRITE(DAC0_SYNC, HIGH); - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 //init Piggy DAC DELAY_US(2); WRITE(DAC1_SYNC, LOW); @@ -86,7 +86,7 @@ void dac084s085::setValue(const uint8_t channel, const uint8_t value) { void dac084s085::cshigh() { WRITE(DAC0_SYNC, HIGH); - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 WRITE(DAC1_SYNC, HIGH); #endif WRITE(SPI_EEPROM1_CS, HIGH); diff --git a/Marlin/src/feature/dac/dac_dac084s085.h b/Marlin/src/feature/dac/dac_dac084s085.h index 5be0129fc9..af98c16776 100644 --- a/Marlin/src/feature/dac/dac_dac084s085.h +++ b/Marlin/src/feature/dac/dac_dac084s085.h @@ -1,31 +1,13 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once +#ifndef DAC084S085_H +#define DAC084S085_H class dac084s085 { public: dac084s085(); - static void begin(); + static void begin(void); static void setValue(const uint8_t channel, const uint8_t value); private: static void cshigh(); }; + +#endif // DAC084S085_H diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp index 81c465cf29..01568fb5c6 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.cpp +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,35 +24,33 @@ * mcp4728.cpp - Arduino library for MicroChip MCP4728 I2C D/A converter * * For implementation details, please take a look at the datasheet: - * https://ww1.microchip.com/downloads/en/DeviceDoc/22187a.pdf + * http://ww1.microchip.com/downloads/en/DeviceDoc/22187a.pdf * * For discussion and feedback, please go to: - * https://forum.arduino.cc/index.php/topic,51842.0.html + * http://arduino.cc/forum/index.php/topic,51842.0.html */ #include "../../inc/MarlinConfig.h" -#if ENABLED(HAS_MOTOR_CURRENT_DAC) +#if ENABLED(DAC_STEPPER_CURRENT) #include "dac_mcp4728.h" -MCP4728 mcp4728; - -xyze_uint_t dac_values; +uint16_t mcp4728_values[XYZE]; /** * Begin I2C, get current values (input register and eeprom) of mcp4728 */ -void MCP4728::init() { +void mcp4728_init() { Wire.begin(); - Wire.requestFrom(I2C_ADDRESS(DAC_DEV_ADDRESS), uint8_t(24)); + Wire.requestFrom(int(DAC_DEV_ADDRESS), 24); while (Wire.available()) { char deviceID = Wire.read(), hiByte = Wire.read(), loByte = Wire.read(); if (!(deviceID & 0x08)) - dac_values[(deviceID & 0x30) >> 4] = word((hiByte & 0x0F), loByte); + mcp4728_values[(deviceID & 0x30) >> 4] = word((hiByte & 0x0F), loByte); } } @@ -60,9 +58,9 @@ void MCP4728::init() { * Write input resister value to specified channel using fastwrite method. * Channel : 0-3, Values : 0-4095 */ -uint8_t MCP4728::analogWrite(const uint8_t channel, const uint16_t value) { - dac_values[channel] = value; - return fastWrite(); +uint8_t mcp4728_analogWrite(uint8_t channel, uint16_t value) { + mcp4728_values[channel] = value; + return mcp4728_fastWrite(); } /** @@ -70,12 +68,12 @@ uint8_t MCP4728::analogWrite(const uint8_t channel, const uint16_t value) { * This will update both input register and EEPROM value * This will also write current Vref, PowerDown, Gain settings to EEPROM */ -uint8_t MCP4728::eepromWrite() { - Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); +uint8_t mcp4728_eepromWrite() { + Wire.beginTransmission(DAC_DEV_ADDRESS); Wire.write(SEQWRITE); LOOP_XYZE(i) { - Wire.write(DAC_STEPPER_VREF << 7 | DAC_STEPPER_GAIN << 4 | highByte(dac_values[i])); - Wire.write(lowByte(dac_values[i])); + Wire.write(DAC_STEPPER_VREF << 7 | DAC_STEPPER_GAIN << 4 | highByte(mcp4728_values[i])); + Wire.write(lowByte(mcp4728_values[i])); } return Wire.endTransmission(); } @@ -83,16 +81,16 @@ uint8_t MCP4728::eepromWrite() { /** * Write Voltage reference setting to all input regiters */ -uint8_t MCP4728::setVref_all(const uint8_t value) { - Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); +uint8_t mcp4728_setVref_all(uint8_t value) { + Wire.beginTransmission(DAC_DEV_ADDRESS); Wire.write(VREFWRITE | (value ? 0x0F : 0x00)); return Wire.endTransmission(); } /** * Write Gain setting to all input regiters */ -uint8_t MCP4728::setGain_all(const uint8_t value) { - Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); +uint8_t mcp4728_setGain_all(uint8_t value) { + Wire.beginTransmission(DAC_DEV_ADDRESS); Wire.write(GAINWRITE | (value ? 0x0F : 0x00)); return Wire.endTransmission(); } @@ -100,32 +98,33 @@ uint8_t MCP4728::setGain_all(const uint8_t value) { /** * Return Input Register value */ -uint16_t MCP4728::getValue(const uint8_t channel) { return dac_values[channel]; } +uint16_t mcp4728_getValue(uint8_t channel) { return mcp4728_values[channel]; } #if 0 /** * Steph: Might be useful in the future * Return Vout */ -uint16_t MCP4728::getVout(const uint8_t channel) { - const uint32_t vref = 2048, - vOut = (vref * dac_values[channel] * (_DAC_STEPPER_GAIN + 1)) / 4096; - return _MIN(vOut, defaultVDD); +uint16_t mcp4728_getVout(uint8_t channel) { + uint32_t vref = 2048, + vOut = (vref * mcp4728_values[channel] * (_DAC_STEPPER_GAIN + 1)) / 4096; + if (vOut > defaultVDD) vOut = defaultVDD; + return vOut; } #endif /** * Returns DAC values as a 0-100 percentage of drive strength */ -uint8_t MCP4728::getDrvPct(const uint8_t channel) { return uint8_t(100.0 * dac_values[channel] / (DAC_STEPPER_MAX) + 0.5); } +uint8_t mcp4728_getDrvPct(uint8_t channel) { return uint8_t(100.0 * mcp4728_values[channel] / (DAC_STEPPER_MAX) + 0.5); } /** * Receives all Drive strengths as 0-100 percent values, updates * DAC Values array and calls fastwrite to update the DAC. */ -void MCP4728::setDrvPct(xyze_uint8_t &pct) { - dac_values *= 0.01 * pct * (DAC_STEPPER_MAX); - fastWrite(); +void mcp4728_setDrvPct(uint8_t pct[XYZE]) { + LOOP_XYZE(i) mcp4728_values[i] = 0.01 * pct[i] * (DAC_STEPPER_MAX); + mcp4728_fastWrite(); } /** @@ -133,11 +132,11 @@ void MCP4728::setDrvPct(xyze_uint8_t &pct) { * DAC Input and PowerDown bits update. * No EEPROM update */ -uint8_t MCP4728::fastWrite() { - Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); +uint8_t mcp4728_fastWrite() { + Wire.beginTransmission(DAC_DEV_ADDRESS); LOOP_XYZE(i) { - Wire.write(highByte(dac_values[i])); - Wire.write(lowByte(dac_values[i])); + Wire.write(highByte(mcp4728_values[i])); + Wire.write(lowByte(mcp4728_values[i])); } return Wire.endTransmission(); } @@ -145,10 +144,10 @@ uint8_t MCP4728::fastWrite() { /** * Common function for simple general commands */ -uint8_t MCP4728::simpleCommand(const byte simpleCommand) { - Wire.beginTransmission(I2C_ADDRESS(GENERALCALL)); +uint8_t mcp4728_simpleCommand(byte simpleCommand) { + Wire.beginTransmission(GENERALCALL); Wire.write(simpleCommand); return Wire.endTransmission(); } -#endif // HAS_MOTOR_CURRENT_DAC +#endif // DAC_STEPPER_CURRENT diff --git a/Marlin/src/feature/dac/dac_mcp4728.h b/Marlin/src/feature/dac/dac_mcp4728.h index 571716d483..aeacaaa0bc 100644 --- a/Marlin/src/feature/dac/dac_mcp4728.h +++ b/Marlin/src/feature/dac/dac_mcp4728.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,37 +16,19 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Arduino library for MicroChip MCP4728 I2C D/A converter. */ -#include "../../core/types.h" +#ifndef DAC_MCP4728_H +#define DAC_MCP4728_H #include -/** - * The following three macros are only used in this piece of code related to mcp4728. - * They are defined in the standard Arduino framework but could be undefined in 32 bits Arduino frameworks. - * (For instance not defined in Arduino lpc176x framework) - * So we have to define them if needed. - */ -#ifndef word - #define word(h, l) ((uint8_t) ((h << 8) | l)) -#endif - -#ifndef lowByte - #define lowByte(w) ((uint8_t) ((w) & 0xFF)) -#endif - -#ifndef highByte - #define highByte(w) ((uint8_t) ((w) >> 8)) -#endif - #define defaultVDD DAC_STEPPER_MAX //was 5000 but differs with internal Vref #define BASE_ADDR 0x60 #define RESET 0b00000110 @@ -65,18 +47,15 @@ // DAC_OR_ADDRESS defined in pins_BOARD.h file #define DAC_DEV_ADDRESS (BASE_ADDR | DAC_OR_ADDRESS) -class MCP4728 { -public: - static void init(); - static uint8_t analogWrite(const uint8_t channel, const uint16_t value); - static uint8_t eepromWrite(); - static uint8_t setVref_all(const uint8_t value); - static uint8_t setGain_all(const uint8_t value); - static uint16_t getValue(const uint8_t channel); - static uint8_t fastWrite(); - static uint8_t simpleCommand(const byte simpleCommand); - static uint8_t getDrvPct(const uint8_t channel); - static void setDrvPct(xyze_uint8_t &pct); -}; +void mcp4728_init(); +uint8_t mcp4728_analogWrite(uint8_t channel, uint16_t value); +uint8_t mcp4728_eepromWrite(); +uint8_t mcp4728_setVref_all(uint8_t value); +uint8_t mcp4728_setGain_all(uint8_t value); +uint16_t mcp4728_getValue(uint8_t channel); +uint8_t mcp4728_fastWrite(); +uint8_t mcp4728_simpleCommand(byte simpleCommand); +uint8_t mcp4728_getDrvPct(uint8_t channel); +void mcp4728_setDrvPct(uint8_t pct[XYZE]); -extern MCP4728 mcp4728; +#endif // DAC_MCP4728_H diff --git a/Marlin/src/feature/dac/stepper_dac.cpp b/Marlin/src/feature/dac/stepper_dac.cpp index 5f10b4ccfb..b5ea77a029 100644 --- a/Marlin/src/feature/dac/stepper_dac.cpp +++ b/Marlin/src/feature/dac/stepper_dac.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,84 +16,110 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ /** * stepper_dac.cpp - To set stepper current via DAC + * + * Part of Marlin + * + * Copyright (c) 2016 MarlinFirmware + * + * Marlin is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Marlin is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Marlin. If not, see . */ #include "../../inc/MarlinConfig.h" -#if ENABLED(HAS_MOTOR_CURRENT_DAC) +#if ENABLED(DAC_STEPPER_CURRENT) #include "stepper_dac.h" -#include "../../MarlinCore.h" // for SP_X_LBL... bool dac_present = false; -constexpr xyze_uint8_t dac_order = DAC_STEPPER_ORDER; -xyze_uint8_t dac_channel_pct = DAC_MOTOR_CURRENT_DEFAULT; +const uint8_t dac_order[NUM_AXIS] = DAC_STEPPER_ORDER; +uint8_t dac_channel_pct[XYZE] = DAC_MOTOR_CURRENT_DEFAULT; -StepperDAC stepper_dac; - -int StepperDAC::init() { +int dac_init() { #if PIN_EXISTS(DAC_DISABLE) OUT_WRITE(DAC_DISABLE_PIN, LOW); // set pin low to enable DAC #endif - mcp4728.init(); + mcp4728_init(); - if (mcp4728.simpleCommand(RESET)) return -1; + if (mcp4728_simpleCommand(RESET)) return -1; dac_present = true; - mcp4728.setVref_all(DAC_STEPPER_VREF); - mcp4728.setGain_all(DAC_STEPPER_GAIN); + mcp4728_setVref_all(DAC_STEPPER_VREF); + mcp4728_setGain_all(DAC_STEPPER_GAIN); - if (mcp4728.getDrvPct(0) < 1 || mcp4728.getDrvPct(1) < 1 || mcp4728.getDrvPct(2) < 1 || mcp4728.getDrvPct(3) < 1 ) { - mcp4728.setDrvPct(dac_channel_pct); - mcp4728.eepromWrite(); + if (mcp4728_getDrvPct(0) < 1 || mcp4728_getDrvPct(1) < 1 || mcp4728_getDrvPct(2) < 1 || mcp4728_getDrvPct(3) < 1 ) { + mcp4728_setDrvPct(dac_channel_pct); + mcp4728_eepromWrite(); } return 0; } -void StepperDAC::set_current_value(const uint8_t channel, uint16_t val) { +void dac_current_percent(uint8_t channel, float val) { if (!dac_present) return; - NOMORE(val, uint16_t(DAC_STEPPER_MAX)); + NOMORE(val, 100); - mcp4728.analogWrite(dac_order[channel], val); - mcp4728.simpleCommand(UPDATE); + mcp4728_analogWrite(dac_order[channel], val * 0.01 * (DAC_STEPPER_MAX)); + mcp4728_simpleCommand(UPDATE); } -void StepperDAC::set_current_percent(const uint8_t channel, float val) { - set_current_value(channel, _MIN(val, 100.0f) * (DAC_STEPPER_MAX) / 100.0f); +void dac_current_raw(uint8_t channel, uint16_t val) { + if (!dac_present) return; + + NOMORE(val, DAC_STEPPER_MAX); + + mcp4728_analogWrite(dac_order[channel], val); + mcp4728_simpleCommand(UPDATE); } -static float dac_perc(int8_t n) { return 100.0 * mcp4728.getValue(dac_order[n]) * RECIPROCAL(DAC_STEPPER_MAX); } -static float dac_amps(int8_t n) { return mcp4728.getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * RECIPROCAL(DAC_STEPPER_SENSE); } +static float dac_perc(int8_t n) { return 100.0 * mcp4728_getValue(dac_order[n]) * (1.0f / (DAC_STEPPER_MAX)); } +static float dac_amps(int8_t n) { return mcp4728_getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * (1.0f / (DAC_STEPPER_SENSE)); } -uint8_t StepperDAC::get_current_percent(const AxisEnum axis) { return mcp4728.getDrvPct(dac_order[axis]); } -void StepperDAC::set_current_percents(xyze_uint8_t &pct) { +uint8_t dac_current_get_percent(AxisEnum axis) { return mcp4728_getDrvPct(dac_order[axis]); } +void dac_current_set_percents(const uint8_t pct[XYZE]) { LOOP_XYZE(i) dac_channel_pct[i] = pct[dac_order[i]]; - mcp4728.setDrvPct(dac_channel_pct); + mcp4728_setDrvPct(dac_channel_pct); } -void StepperDAC::print_values() { +void dac_print_values() { if (!dac_present) return; - SERIAL_ECHO_MSG("Stepper current values in % (Amps):"); + SERIAL_ECHO_START(); - SERIAL_ECHOPAIR_P( SP_X_LBL, dac_perc(X_AXIS), PSTR(" ("), dac_amps(X_AXIS), PSTR(")")); - SERIAL_ECHOPAIR_P( SP_Y_LBL, dac_perc(Y_AXIS), PSTR(" ("), dac_amps(Y_AXIS), PSTR(")")); - SERIAL_ECHOPAIR_P( SP_Z_LBL, dac_perc(Z_AXIS), PSTR(" ("), dac_amps(Z_AXIS), PSTR(")")); - SERIAL_ECHOLNPAIR_P(SP_E_LBL, dac_perc(E_AXIS), PSTR(" ("), dac_amps(E_AXIS), PSTR(")")); + SERIAL_ECHOLNPGM("Stepper current values in % (Amps):"); + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(" X:", dac_perc(X_AXIS)); + SERIAL_ECHOPAIR(" (", dac_amps(X_AXIS)); + SERIAL_ECHOPAIR(") Y:", dac_perc(Y_AXIS)); + SERIAL_ECHOPAIR(" (", dac_amps(Y_AXIS)); + SERIAL_ECHOPAIR(") Z:", dac_perc(Z_AXIS)); + SERIAL_ECHOPAIR(" (", dac_amps(Z_AXIS)); + SERIAL_ECHOPAIR(") E:", dac_perc(E_AXIS)); + SERIAL_ECHOPAIR(" (", dac_amps(E_AXIS)); + SERIAL_ECHOLNPGM(")"); } -void StepperDAC::commit_eeprom() { +void dac_commit_eeprom() { if (!dac_present) return; - mcp4728.eepromWrite(); + mcp4728_eepromWrite(); } -#endif // HAS_MOTOR_CURRENT_DAC +#endif // DAC_STEPPER_CURRENT diff --git a/Marlin/src/feature/dac/stepper_dac.h b/Marlin/src/feature/dac/stepper_dac.h index 6836335e98..e74bac5f15 100644 --- a/Marlin/src/feature/dac/stepper_dac.h +++ b/Marlin/src/feature/dac/stepper_dac.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,26 +16,42 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * stepper_dac.h - To set stepper current via DAC + * + * Part of Marlin + * + * Copyright (c) 2016 MarlinFirmware + * + * Marlin is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Marlin is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Marlin. If not, see . */ +#ifndef STEPPER_DAC_H +#define STEPPER_DAC_H + #include "dac_mcp4728.h" -class StepperDAC { -public: - static int init(); - static void set_current_percent(const uint8_t channel, float val); - static void set_current_value(const uint8_t channel, uint16_t val); - static void print_values(); - static void commit_eeprom(); - static uint8_t get_current_percent(AxisEnum axis); - static void set_current_percents(xyze_uint8_t &pct); -}; +int dac_init(); +void dac_current_percent(uint8_t channel, float val); +void dac_current_raw(uint8_t channel, uint16_t val); +void dac_print_values(); +void dac_commit_eeprom(); +uint8_t dac_current_get_percent(AxisEnum axis); +void dac_current_set_percents(const uint8_t pct[XYZE]); -extern StepperDAC stepper_dac; +#endif // STEPPER_DAC_H diff --git a/Marlin/src/feature/digipot/digipot.h b/Marlin/src/feature/digipot/digipot.h index c53f8093dd..f2cd00ba6e 100644 --- a/Marlin/src/feature/digipot/digipot.h +++ b/Marlin/src/feature/digipot/digipot.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,18 +16,14 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -// -// Header for MCP4018 and MCP4451 current control i2c devices -// -class DigipotI2C { -public: - static void init(); - static void set_current(const uint8_t channel, const float current); -}; +#ifndef __DIGIPOT_H__ +#define __DIGIPOT_H__ -DigipotI2C digipot_i2c; +void digipot_i2c_set_current(const uint8_t channel, const float current); +void digipot_i2c_init(); + +#endif // __DIGIPOT_H__ diff --git a/Marlin/src/feature/digipot/digipot_mcp4018.cpp b/Marlin/src/feature/digipot/digipot_mcp4018.cpp index 6260185fc3..e59c3d5269 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4018.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4018.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,61 +16,68 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if ENABLED(DIGIPOT_MCP4018) +#if ENABLED(DIGIPOT_I2C) && ENABLED(DIGIPOT_MCP4018) -#include "digipot.h" - -#include -#include // https://github.com/stawel/SlowSoftI2CMaster +#include "../../core/enum.h" +#include "Stream.h" +#include "utility/twi.h" +#include //https://github.com/stawel/SlowSoftI2CMaster // Settings for the I2C based DIGIPOT (MCP4018) based on WT150 #define DIGIPOT_A4988_Rsx 0.250 #define DIGIPOT_A4988_Vrefmax 1.666 -#define DIGIPOT_MCP4018_MAX_VALUE 127 +#define DIGIPOT_A4988_MAX_VALUE 127 -#define DIGIPOT_A4988_Itripmax(Vref) ((Vref) / (8.0 * DIGIPOT_A4988_Rsx)) +#define DIGIPOT_A4988_Itripmax(Vref) ((Vref)/(8.0*DIGIPOT_A4988_Rsx)) -#define DIGIPOT_A4988_FACTOR ((DIGIPOT_MCP4018_MAX_VALUE) / DIGIPOT_A4988_Itripmax(DIGIPOT_A4988_Vrefmax)) +#define DIGIPOT_A4988_FACTOR ((DIGIPOT_A4988_MAX_VALUE)/DIGIPOT_A4988_Itripmax(DIGIPOT_A4988_Vrefmax)) #define DIGIPOT_A4988_MAX_CURRENT 2.0 static byte current_to_wiper(const float current) { - const int16_t value = TERN(DIGIPOT_USE_RAW_VALUES, current, CEIL(current * DIGIPOT_A4988_FACTOR)); - return byte(constrain(value, 0, DIGIPOT_MCP4018_MAX_VALUE)); + const int16_t value = ceil(float(DIGIPOT_A4988_FACTOR) * current); + return byte(constrain(value, 0, DIGIPOT_A4988_MAX_VALUE)); } -static SlowSoftI2CMaster pots[DIGIPOT_I2C_NUM_CHANNELS] = { - SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_X, DIGIPOTS_I2C_SCL) +const uint8_t sda_pins[DIGIPOT_I2C_NUM_CHANNELS] = { + DIGIPOTS_I2C_SDA_X #if DIGIPOT_I2C_NUM_CHANNELS > 1 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Y, DIGIPOTS_I2C_SCL) + , DIGIPOTS_I2C_SDA_Y #if DIGIPOT_I2C_NUM_CHANNELS > 2 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Z, DIGIPOTS_I2C_SCL) + , DIGIPOTS_I2C_SDA_Z #if DIGIPOT_I2C_NUM_CHANNELS > 3 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E0, DIGIPOTS_I2C_SCL) + , DIGIPOTS_I2C_SDA_E0 #if DIGIPOT_I2C_NUM_CHANNELS > 4 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E1, DIGIPOTS_I2C_SCL) - #if DIGIPOT_I2C_NUM_CHANNELS > 5 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E2, DIGIPOTS_I2C_SCL) - #if DIGIPOT_I2C_NUM_CHANNELS > 6 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E3, DIGIPOTS_I2C_SCL) - #if DIGIPOT_I2C_NUM_CHANNELS > 7 - , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E4, DIGIPOTS_I2C_SCL) - #endif - #endif - #endif + , DIGIPOTS_I2C_SDA_E1 #endif #endif #endif #endif }; -static void digipot_i2c_send(const uint8_t channel, const byte v) { +static SlowSoftI2CMaster pots[DIGIPOT_I2C_NUM_CHANNELS] = { + SlowSoftI2CMaster { sda_pins[X_AXIS], DIGIPOTS_I2C_SCL } + #if DIGIPOT_I2C_NUM_CHANNELS > 1 + , SlowSoftI2CMaster { sda_pins[Y_AXIS], DIGIPOTS_I2C_SCL } + #if DIGIPOT_I2C_NUM_CHANNELS > 2 + , SlowSoftI2CMaster { sda_pins[Z_AXIS], DIGIPOTS_I2C_SCL } + #if DIGIPOT_I2C_NUM_CHANNELS > 3 + , SlowSoftI2CMaster { sda_pins[E_AXIS], DIGIPOTS_I2C_SCL } + #if DIGIPOT_I2C_NUM_CHANNELS > 4 + , SlowSoftI2CMaster { sda_pins[E_AXIS + 1], DIGIPOTS_I2C_SCL } + #endif + #endif + #endif + #endif +}; + +static void i2c_send(const uint8_t channel, const byte v) { if (WITHIN(channel, 0, DIGIPOT_I2C_NUM_CHANNELS - 1)) { pots[channel].i2c_start(((DIGIPOT_I2C_ADDRESS_A) << 1) | I2C_WRITE); pots[channel].i2c_write(v); @@ -79,24 +86,19 @@ static void digipot_i2c_send(const uint8_t channel, const byte v) { } // This is for the MCP4018 I2C based digipot -void DigipotI2C::set_current(const uint8_t channel, const float current) { - const float ival = _MIN(_MAX(current, 0), float(DIGIPOT_MCP4018_MAX_VALUE)); - digipot_i2c_send(channel, current_to_wiper(ival)); +void digipot_i2c_set_current(const uint8_t channel, const float current) { + i2c_send(channel, current_to_wiper(MIN(MAX(current, 0), float(DIGIPOT_A4988_MAX_CURRENT)))); } -void DigipotI2C::init() { - LOOP_L_N(i, DIGIPOT_I2C_NUM_CHANNELS) pots[i].i2c_init(); +void digipot_i2c_init() { + static const float digipot_motor_current[] PROGMEM = DIGIPOT_I2C_MOTOR_CURRENTS; - // Init currents according to Configuration_adv.h - static const float digipot_motor_current[] PROGMEM = - #if ENABLED(DIGIPOT_USE_RAW_VALUES) - DIGIPOT_MOTOR_CURRENT - #else - DIGIPOT_I2C_MOTOR_CURRENTS - #endif - ; - LOOP_L_N(i, COUNT(digipot_motor_current)) - set_current(i, pgm_read_float(&digipot_motor_current[i])); + for (uint8_t i = 0; i < DIGIPOT_I2C_NUM_CHANNELS; i++) + pots[i].i2c_init(); + + // setup initial currents as defined in Configuration_adv.h + for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) + digipot_i2c_set_current(i, pgm_read_float(&digipot_motor_current[i])); } -#endif // DIGIPOT_MCP4018 +#endif // DIGIPOT_I2C && DIGIPOT_MCP4018 diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index 7e6ace49a0..4609a2c217 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,15 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if ENABLED(DIGIPOT_MCP4451) +#if ENABLED(DIGIPOT_I2C) && DISABLED(DIGIPOT_MCP4018) -#include "digipot.h" - -#include +#include "Stream.h" #include #if MB(MKS_SBASE) @@ -35,27 +33,24 @@ // Settings for the I2C based DIGIPOT (MCP4451) on Azteeg X3 Pro #if MB(5DPRINT) - #define DIGIPOT_I2C_FACTOR 117.96f - #define DIGIPOT_I2C_MAX_CURRENT 1.736f -#elif MB(AZTEEG_X5_MINI, AZTEEG_X5_MINI_WIFI) - #define DIGIPOT_I2C_FACTOR 113.5f - #define DIGIPOT_I2C_MAX_CURRENT 2.0f + #define DIGIPOT_I2C_FACTOR 117.96 + #define DIGIPOT_I2C_MAX_CURRENT 1.736 #else - #define DIGIPOT_I2C_FACTOR 106.7f - #define DIGIPOT_I2C_MAX_CURRENT 2.5f + #define DIGIPOT_I2C_FACTOR 106.7 + #define DIGIPOT_I2C_MAX_CURRENT 2.5 #endif static byte current_to_wiper(const float current) { - return byte(TERN(DIGIPOT_USE_RAW_VALUES, current, CEIL(DIGIPOT_I2C_FACTOR * current))); + return byte(CEIL(float((DIGIPOT_I2C_FACTOR * current)))); } -static void digipot_i2c_send(const byte addr, const byte a, const byte b) { +static void i2c_send(const byte addr, const byte a, const byte b) { #if MB(MKS_SBASE) digipot_mcp4451_start(addr); digipot_mcp4451_send_byte(a); digipot_mcp4451_send_byte(b); #else - Wire.beginTransmission(I2C_ADDRESS(addr)); + Wire.beginTransmission(addr); Wire.write(a); Wire.write(b); Wire.endTransmission(); @@ -63,36 +58,30 @@ static void digipot_i2c_send(const byte addr, const byte a, const byte b) { } // This is for the MCP4451 I2C based digipot -void DigipotI2C::set_current(const uint8_t channel, const float current) { - // These addresses are specific to Azteeg X3 Pro, can be set to others. - // In this case first digipot is at address A0=0, A1=0, second one is at A0=0, A1=1 +void digipot_i2c_set_current(const uint8_t channel, const float current) { + // these addresses are specific to Azteeg X3 Pro, can be set to others, + // In this case first digipot is at address A0=0, A1= 0, second one is at A0=0, A1= 1 const byte addr = channel < 4 ? DIGIPOT_I2C_ADDRESS_A : DIGIPOT_I2C_ADDRESS_B; // channel 0-3 vs 4-7 // Initial setup - digipot_i2c_send(addr, 0x40, 0xFF); - digipot_i2c_send(addr, 0xA0, 0xFF); + i2c_send(addr, 0x40, 0xFF); + i2c_send(addr, 0xA0, 0xFF); // Set actual wiper value byte addresses[4] = { 0x00, 0x10, 0x60, 0x70 }; - digipot_i2c_send(addr, addresses[channel & 0x3], current_to_wiper(_MIN(float(_MAX(current, 0)), DIGIPOT_I2C_MAX_CURRENT))); + i2c_send(addr, addresses[channel & 0x3], current_to_wiper(MIN((float) MAX(current, 0), DIGIPOT_I2C_MAX_CURRENT))); } -void DigipotI2C::init() { +void digipot_i2c_init() { #if MB(MKS_SBASE) - configure_i2c(16); // Set clock_option to 16 ensure I2C is initialized at 400kHz + digipot_mcp4451_init(); #else Wire.begin(); #endif - // Set up initial currents as defined in Configuration_adv.h - static const float digipot_motor_current[] PROGMEM = - #if ENABLED(DIGIPOT_USE_RAW_VALUES) - DIGIPOT_MOTOR_CURRENT - #else - DIGIPOT_I2C_MOTOR_CURRENTS - #endif - ; - LOOP_L_N(i, COUNT(digipot_motor_current)) - set_current(i, pgm_read_float(&digipot_motor_current[i])); + // setup initial currents as defined in Configuration_adv.h + static const float digipot_motor_current[] PROGMEM = DIGIPOT_I2C_MOTOR_CURRENTS; + for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) + digipot_i2c_set_current(i, pgm_read_float(&digipot_motor_current[i])); } -#endif // DIGIPOT_MCP4451 +#endif // DIGIPOT_I2C diff --git a/Marlin/src/feature/direct_stepping.cpp b/Marlin/src/feature/direct_stepping.cpp deleted file mode 100644 index 9766d14640..0000000000 --- a/Marlin/src/feature/direct_stepping.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(DIRECT_STEPPING) - -#include "direct_stepping.h" - -#include "../MarlinCore.h" - -#define CHECK_PAGE(I, R) do{ \ - if (I >= sizeof(page_states) / sizeof(page_states[0])) { \ - fatal_error = true; \ - return R; \ - } \ -}while(0) - -#define CHECK_PAGE_STATE(I, R, S) do { \ - CHECK_PAGE(I, R); \ - if (page_states[I] != S) { \ - fatal_error = true; \ - return R; \ - } \ -}while(0) - -namespace DirectStepping { - - template - State SerialPageManager::state; - - template - volatile bool SerialPageManager::fatal_error; - - template - volatile PageState SerialPageManager::page_states[Cfg::NUM_PAGES]; - - template - volatile bool SerialPageManager::page_states_dirty; - - template - uint8_t SerialPageManager::pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; - - template - uint8_t SerialPageManager::checksum; - - template - typename Cfg::write_byte_idx_t SerialPageManager::write_byte_idx; - - template - typename Cfg::page_idx_t SerialPageManager::write_page_idx; - - template - typename Cfg::write_byte_idx_t SerialPageManager::write_page_size; - - template - void SerialPageManager::init() { - for (int i = 0 ; i < Cfg::NUM_PAGES ; i++) - page_states[i] = PageState::FREE; - - fatal_error = false; - state = State::NEWLINE; - - page_states_dirty = false; - - SERIAL_ECHOLNPGM("pages_ready"); - } - - template - FORCE_INLINE bool SerialPageManager::maybe_store_rxd_char(uint8_t c) { - switch (state) { - default: - case State::MONITOR: - switch (c) { - case '\n': - case '\r': - state = State::NEWLINE; - default: - return false; - } - case State::NEWLINE: - switch (c) { - case Cfg::CONTROL_CHAR: - state = State::ADDRESS; - return true; - case '\n': - case '\r': - state = State::NEWLINE; - return false; - default: - state = State::MONITOR; - return false; - } - case State::ADDRESS: - //TODO: 16 bit address, State::ADDRESS2 - write_page_idx = c; - write_byte_idx = 0; - checksum = 0; - - CHECK_PAGE(write_page_idx, true); - - if (page_states[write_page_idx] == PageState::FAIL) { - // Special case for fail - state = State::UNFAIL; - return true; - } - - set_page_state(write_page_idx, PageState::WRITING); - - state = Cfg::DIRECTIONAL ? State::COLLECT : State::SIZE; - - return true; - case State::SIZE: - // Zero means full page size - write_page_size = c; - state = State::COLLECT; - return true; - case State::COLLECT: - pages[write_page_idx][write_byte_idx++] = c; - checksum ^= c; - - // check if still collecting - if (Cfg::PAGE_SIZE == 256) { - // special case for 8-bit, check if rolled back to 0 - if (Cfg::DIRECTIONAL || !write_page_size) { // full 256 bytes - if (write_byte_idx) return true; - } else { - if (write_byte_idx < write_page_size) return true; - } - } else if (Cfg::DIRECTIONAL) { - if (write_byte_idx != Cfg::PAGE_SIZE) return true; - } else { - if (write_byte_idx < write_page_size) return true; - } - - state = State::CHECKSUM; - return true; - case State::CHECKSUM: { - const PageState page_state = (checksum == c) ? PageState::OK : PageState::FAIL; - set_page_state(write_page_idx, page_state); - state = State::MONITOR; - return true; - } - case State::UNFAIL: - if (c == 0) { - set_page_state(write_page_idx, PageState::FREE); - } else { - fatal_error = true; - } - state = State::MONITOR; - return true; - } - } - - template - void SerialPageManager::write_responses() { - if (fatal_error) { - kill(GET_TEXT(MSG_BAD_PAGE)); - return; - } - - if (!page_states_dirty) return; - page_states_dirty = false; - - SERIAL_ECHO(Cfg::CONTROL_CHAR); - constexpr int state_bits = 2; - constexpr int n_bytes = Cfg::NUM_PAGES >> state_bits; - volatile uint8_t bits_b[n_bytes] = { 0 }; - - for (page_idx_t i = 0 ; i < Cfg::NUM_PAGES ; i++) { - bits_b[i >> state_bits] |= page_states[i] << ((i * state_bits) & 0x7); - } - - uint8_t crc = 0; - for (uint8_t i = 0 ; i < n_bytes ; i++) { - crc ^= bits_b[i]; - SERIAL_ECHO(bits_b[i]); - } - - SERIAL_ECHO(crc); - SERIAL_EOL(); - } - - template - FORCE_INLINE void SerialPageManager::set_page_state(const page_idx_t page_idx, const PageState page_state) { - CHECK_PAGE(page_idx,); - - page_states[page_idx] = page_state; - page_states_dirty = true; - } - - template <> - FORCE_INLINE uint8_t *PageManager::get_page(const page_idx_t page_idx) { - CHECK_PAGE(page_idx, nullptr); - - return pages[page_idx]; - } - - template <> - FORCE_INLINE void PageManager::free_page(const page_idx_t page_idx) { - set_page_state(page_idx, PageState::FREE); - } - -}; - -DirectStepping::PageManager page_manager; - -const uint8_t segment_table[DirectStepping::Config::NUM_SEGMENTS][DirectStepping::Config::SEGMENT_STEPS] PROGMEM = { - - #if STEPPER_PAGE_FORMAT == SP_4x4D_128 - - { 1, 1, 1, 1, 1, 1, 1 }, // 0 = -7 - { 1, 1, 1, 0, 1, 1, 1 }, // 1 = -6 - { 1, 1, 1, 0, 1, 0, 1 }, // 2 = -5 - { 1, 1, 0, 1, 0, 1, 0 }, // 3 = -4 - { 1, 1, 0, 0, 1, 0, 0 }, // 4 = -3 - { 0, 0, 1, 0, 0, 0, 1 }, // 5 = -2 - { 0, 0, 0, 1, 0, 0, 0 }, // 6 = -1 - { 0, 0, 0, 0, 0, 0, 0 }, // 7 = 0 - { 0, 0, 0, 1, 0, 0, 0 }, // 8 = 1 - { 0, 0, 1, 0, 0, 0, 1 }, // 9 = 2 - { 1, 1, 0, 0, 1, 0, 0 }, // 10 = 3 - { 1, 1, 0, 1, 0, 1, 0 }, // 11 = 4 - { 1, 1, 1, 0, 1, 0, 1 }, // 12 = 5 - { 1, 1, 1, 0, 1, 1, 1 }, // 13 = 6 - { 1, 1, 1, 1, 1, 1, 1 }, // 14 = 7 - { 0 } - - #elif STEPPER_PAGE_FORMAT == SP_4x2_256 - - { 0, 0, 0 }, // 0 - { 0, 1, 0 }, // 1 - { 1, 0, 1 }, // 2 - { 1, 1, 1 }, // 3 - - #elif STEPPER_PAGE_FORMAT == SP_4x1_512 - - {0} // Uncompressed format, table not used - - #endif - -}; - -#endif // DIRECT_STEPPING diff --git a/Marlin/src/feature/direct_stepping.h b/Marlin/src/feature/direct_stepping.h deleted file mode 100644 index cde9d1a0b4..0000000000 --- a/Marlin/src/feature/direct_stepping.h +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfig.h" - -namespace DirectStepping { - - enum State : char { - MONITOR, NEWLINE, ADDRESS, SIZE, COLLECT, CHECKSUM, UNFAIL - }; - - enum PageState : uint8_t { - FREE, WRITING, OK, FAIL - }; - - // Static state used for stepping through direct stepping pages - struct page_step_state_t { - // Current page - uint8_t *page; - // Current segment - uint16_t segment_idx; - // Current steps within segment - uint8_t segment_steps; - // Segment delta - xyze_uint8_t sd; - // Block delta - xyze_int_t bd; - }; - - template - class SerialPageManager { - public: - - typedef typename Cfg::page_idx_t page_idx_t; - - static bool maybe_store_rxd_char(uint8_t c); - static void write_responses(); - - // common methods for page managers - static void init(); - static uint8_t *get_page(const page_idx_t page_idx); - static void free_page(const page_idx_t page_idx); - - protected: - - typedef typename Cfg::write_byte_idx_t write_byte_idx_t; - - static State state; - static volatile bool fatal_error; - - static volatile PageState page_states[Cfg::NUM_PAGES]; - static volatile bool page_states_dirty; - - static uint8_t pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; - static uint8_t checksum; - static write_byte_idx_t write_byte_idx; - static page_idx_t write_page_idx; - static write_byte_idx_t write_page_size; - - static void set_page_state(const page_idx_t page_idx, const PageState page_state); - }; - - template struct TypeSelector { typedef T type;} ; - template struct TypeSelector { typedef F type; }; - - template - struct config_t { - static constexpr char CONTROL_CHAR = '!'; - - static constexpr int NUM_PAGES = num_pages; - static constexpr int NUM_AXES = num_axes; - static constexpr int BITS_SEGMENT = bits_segment; - static constexpr int DIRECTIONAL = dir ? 1 : 0; - static constexpr int SEGMENTS = segments; - - static constexpr int NUM_SEGMENTS = 1 << BITS_SEGMENT; - static constexpr int SEGMENT_STEPS = (1 << (BITS_SEGMENT - DIRECTIONAL)) - 1; - static constexpr int TOTAL_STEPS = SEGMENT_STEPS * SEGMENTS; - static constexpr int PAGE_SIZE = (NUM_AXES * BITS_SEGMENT * SEGMENTS) / 8; - - typedef typename TypeSelector<(PAGE_SIZE>256), uint16_t, uint8_t>::type write_byte_idx_t; - typedef typename TypeSelector<(NUM_PAGES>256), uint16_t, uint8_t>::type page_idx_t; - }; - - template - using SP_4x4D_128 = config_t; - - template - using SP_4x2_256 = config_t; - - template - using SP_4x1_512 = config_t; - - // configured types - typedef STEPPER_PAGE_FORMAT Config; - - template class PAGE_MANAGER; - typedef PAGE_MANAGER PageManager; -}; - -#define SP_4x4D_128 1 -//#define SP_4x4_128 2 -//#define SP_4x2D_256 3 -#define SP_4x2_256 4 -#define SP_4x1_512 5 - -typedef typename DirectStepping::Config::page_idx_t page_idx_t; - -// TODO: use config -typedef DirectStepping::page_step_state_t page_step_state_t; - -extern const uint8_t segment_table[DirectStepping::Config::NUM_SEGMENTS][DirectStepping::Config::SEGMENT_STEPS]; -extern DirectStepping::PageManager page_manager; diff --git a/Marlin/src/feature/e_parser.cpp b/Marlin/src/feature/e_parser.cpp deleted file mode 100644 index a4c2d0dac9..0000000000 --- a/Marlin/src/feature/e_parser.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * e_parser.cpp - Intercept special commands directly in the serial stream - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(EMERGENCY_PARSER) - -#include "e_parser.h" - -// Static data members -bool EmergencyParser::killed_by_M112, // = false - EmergencyParser::enabled; - -#if ENABLED(HOST_PROMPT_SUPPORT) - uint8_t EmergencyParser::M876_reason; // = 0 -#endif - -// Global instance -EmergencyParser emergency_parser; - -#endif // EMERGENCY_PARSER diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h deleted file mode 100644 index 085cbd4eab..0000000000 --- a/Marlin/src/feature/e_parser.h +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * e_parser.h - Intercept special commands directly in the serial stream - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(HOST_PROMPT_SUPPORT) - #include "host_actions.h" -#endif - -// External references -extern bool wait_for_user, wait_for_heatup; -void quickstop_stepper(); - -class EmergencyParser { - -public: - - // Currently looking for: M108, M112, M410, M876 - enum State : char { - EP_RESET, - EP_N, - EP_M, - EP_M1, - EP_M10, - EP_M108, - EP_M11, - EP_M112, - EP_M4, - EP_M41, - EP_M410, - #if ENABLED(HOST_PROMPT_SUPPORT) - EP_M8, - EP_M87, - EP_M876, - EP_M876S, - EP_M876SN, - #endif - EP_IGNORE // to '\n' - }; - - static bool killed_by_M112; - - #if ENABLED(HOST_PROMPT_SUPPORT) - static uint8_t M876_reason; - #endif - - EmergencyParser() { enable(); } - - FORCE_INLINE static void enable() { enabled = true; } - - FORCE_INLINE static void disable() { enabled = false; } - - FORCE_INLINE static void update(State &state, const uint8_t c) { - #define ISEOL(C) ((C) == '\n' || (C) == '\r') - switch (state) { - case EP_RESET: - switch (c) { - case ' ': case '\n': case '\r': break; - case 'N': state = EP_N; break; - case 'M': state = EP_M; break; - default: state = EP_IGNORE; - } - break; - - case EP_N: - switch (c) { - case '0' ... '9': - case '-': case ' ': break; - case 'M': state = EP_M; break; - default: state = EP_IGNORE; - } - break; - - case EP_M: - switch (c) { - case ' ': break; - case '1': state = EP_M1; break; - case '4': state = EP_M4; break; - #if ENABLED(HOST_PROMPT_SUPPORT) - case '8': state = EP_M8; break; - #endif - default: state = EP_IGNORE; - } - break; - - case EP_M1: - switch (c) { - case '0': state = EP_M10; break; - case '1': state = EP_M11; break; - default: state = EP_IGNORE; - } - break; - - case EP_M10: - state = (c == '8') ? EP_M108 : EP_IGNORE; - break; - - case EP_M11: - state = (c == '2') ? EP_M112 : EP_IGNORE; - break; - - case EP_M4: - state = (c == '1') ? EP_M41 : EP_IGNORE; - break; - - case EP_M41: - state = (c == '0') ? EP_M410 : EP_IGNORE; - break; - - #if ENABLED(HOST_PROMPT_SUPPORT) - case EP_M8: - state = (c == '7') ? EP_M87 : EP_IGNORE; - break; - - case EP_M87: - state = (c == '6') ? EP_M876 : EP_IGNORE; - break; - - case EP_M876: - switch (c) { - case ' ': break; - case 'S': state = EP_M876S; break; - default: state = EP_IGNORE; break; - } - break; - - case EP_M876S: - switch (c) { - case ' ': break; - case '0' ... '9': - state = EP_M876SN; - M876_reason = (uint8_t)(c - '0'); - break; - } - break; - #endif - - case EP_IGNORE: - if (ISEOL(c)) state = EP_RESET; - break; - - default: - if (ISEOL(c)) { - if (enabled) switch (state) { - case EP_M108: wait_for_user = wait_for_heatup = false; break; - case EP_M112: killed_by_M112 = true; break; - case EP_M410: quickstop_stepper(); break; - #if ENABLED(HOST_PROMPT_SUPPORT) - case EP_M876SN: host_response_handler(M876_reason); break; - #endif - default: break; - } - state = EP_RESET; - } - } - } - -private: - static bool enabled; -}; - -extern EmergencyParser emergency_parser; diff --git a/Marlin/src/feature/emergency_parser.cpp b/Marlin/src/feature/emergency_parser.cpp new file mode 100644 index 0000000000..3c9cbf12e5 --- /dev/null +++ b/Marlin/src/feature/emergency_parser.cpp @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * emergency_parser.cpp - Intercept special commands directly in the serial stream + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(EMERGENCY_PARSER) + +#include "emergency_parser.h" + +// Static data members +bool EmergencyParser::killed_by_M112; // = false + +// Global instance +EmergencyParser emergency_parser; + +#endif // EMERGENCY_PARSER diff --git a/Marlin/src/feature/emergency_parser.h b/Marlin/src/feature/emergency_parser.h new file mode 100644 index 0000000000..127b5c20da --- /dev/null +++ b/Marlin/src/feature/emergency_parser.h @@ -0,0 +1,143 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * emergency_parser.h - Intercept special commands directly in the serial stream + */ + +#ifndef _EMERGENCY_PARSER_H_ +#define _EMERGENCY_PARSER_H_ + +// External references +extern volatile bool wait_for_user, wait_for_heatup; +void quickstop_stepper(); + +class EmergencyParser { + +public: + + // Currently looking for: M108, M112, M410 + enum State : char { + EP_RESET, + EP_N, + EP_M, + EP_M1, + EP_M10, + EP_M108, + EP_M11, + EP_M112, + EP_M4, + EP_M41, + EP_M410, + EP_IGNORE // to '\n' + }; + + static bool killed_by_M112; + + EmergencyParser() {} + + __attribute__((always_inline)) inline + static void update(State &state, const uint8_t c) { + + switch (state) { + case EP_RESET: + switch (c) { + case ' ': break; + case 'N': state = EP_N; break; + case 'M': state = EP_M; break; + default: state = EP_IGNORE; + } + break; + + case EP_N: + switch (c) { + case '0': case '1': case '2': + case '3': case '4': case '5': + case '6': case '7': case '8': + case '9': case '-': case ' ': break; + case 'M': state = EP_M; break; + default: state = EP_IGNORE; + } + break; + + case EP_M: + switch (c) { + case ' ': break; + case '1': state = EP_M1; break; + case '4': state = EP_M4; break; + default: state = EP_IGNORE; + } + break; + + case EP_M1: + switch (c) { + case '0': state = EP_M10; break; + case '1': state = EP_M11; break; + default: state = EP_IGNORE; + } + break; + + case EP_M10: + state = (c == '8') ? EP_M108 : EP_IGNORE; + break; + + case EP_M11: + state = (c == '2') ? EP_M112 : EP_IGNORE; + break; + + case EP_M4: + state = (c == '1') ? EP_M41 : EP_IGNORE; + break; + + case EP_M41: + state = (c == '0') ? EP_M410 : EP_IGNORE; + break; + + case EP_IGNORE: + if (c == '\n') state = EP_RESET; + break; + + default: + if (c == '\n') { + switch (state) { + case EP_M108: + wait_for_user = wait_for_heatup = false; + break; + case EP_M112: + killed_by_M112 = true; + break; + case EP_M410: + quickstop_stepper(); + break; + default: + break; + } + state = EP_RESET; + } + } + } + +}; + +extern EmergencyParser emergency_parser; + +#endif // _EMERGENCY_PARSER_H_ diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp deleted file mode 100644 index 8a3e959e07..0000000000 --- a/Marlin/src/feature/encoder_i2c.cpp +++ /dev/null @@ -1,1138 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -//todo: add support for multiple encoders on a single axis -//todo: add z axis auto-leveling -//todo: consolidate some of the related M codes? -//todo: add endstop-replacement mode? -//todo: try faster I2C speed; tweak TWI_FREQ (400000L, or faster?); or just TWBR = ((CPU_FREQ / 400000L) - 16) / 2; -//todo: consider Marlin-optimized Wire library; i.e. MarlinWire, like MarlinSerial - - -#include "../inc/MarlinConfig.h" - -#if ENABLED(I2C_POSITION_ENCODERS) - -#include "encoder_i2c.h" - -#include "../module/temperature.h" -#include "../module/stepper.h" -#include "../gcode/parser.h" - -#include "../feature/babystep.h" - -#include - -void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) { - encoderAxis = axis; - i2cAddress = address; - - initialized++; - - SERIAL_ECHOLNPAIR("Setting up encoder on ", axis_codes[encoderAxis], " axis, addr = ", address); - - position = get_position(); -} - -void I2CPositionEncoder::update() { - if (!initialized || !homed || !active) return; //check encoder is set up and active - - position = get_position(); - - //we don't want to stop things just because the encoder missed a message, - //so we only care about responses that indicate bad magnetic strength - - if (!passes_test(false)) { //check encoder data is good - lastErrorTime = millis(); - /* - if (trusted) { //commented out as part of the note below - trusted = false; - SERIAL_ECHOLMPAIR("Fault detected on ", axis_codes[encoderAxis], " axis encoder. Disengaging error correction until module is trusted again."); - } - */ - return; - } - - if (!trusted) { - /** - * This is commented out because it introduces error and can cause bad print quality. - * - * This code is intended to manage situations where the encoder has reported bad magnetic strength. - * This indicates that the magnetic strip was too far away from the sensor to reliably track position. - * When this happens, this code resets the offset based on where the printer thinks it is. This has been - * shown to introduce errors in actual position which result in drifting prints and poor print quality. - * Perhaps a better method would be to disable correction on the axis with a problem, report it to the - * user via the status leds on the encoder module and prompt the user to re-home the axis at which point - * the encoder would be re-enabled. - */ - - /* - // If the magnetic strength has been good for a certain time, start trusting the module again - - if (millis() - lastErrorTime > I2CPE_TIME_TRUSTED) { - trusted = true; - - SERIAL_ECHOLNPAIR("Untrusted encoder module on ", axis_codes[encoderAxis], " axis has been fault-free for set duration, reinstating error correction."); - - //the encoder likely lost its place when the error occured, so we'll reset and use the printer's - //idea of where it the axis is to re-initialize - const float pos = planner.get_axis_position_mm(encoderAxis); - int32_t positionInTicks = pos * get_ticks_unit(); - - //shift position from previous to current position - zeroOffset -= (positionInTicks - get_position()); - - #ifdef I2CPE_DEBUG - SERIAL_ECHOLNPAIR("Current position is ", pos); - SERIAL_ECHOLNPAIR("Position in encoder ticks is ", positionInTicks); - SERIAL_ECHOLNPAIR("New zero-offset of ", zeroOffset); - SERIAL_ECHOPAIR("New position reads as ", get_position()); - SERIAL_CHAR('('); - SERIAL_DECIMAL(mm_from_count(get_position())); - SERIAL_ECHOLNPGM(")"); - #endif - } - */ - return; - } - - lastPosition = position; - const millis_t positionTime = millis(); - - //only do error correction if setup and enabled - if (ec && ecMethod != I2CPE_ECM_NONE) { - - #ifdef I2CPE_EC_THRESH_PROPORTIONAL - const millis_t deltaTime = positionTime - lastPositionTime; - const uint32_t distance = ABS(position - lastPosition), - speed = distance / deltaTime; - const float threshold = constrain((speed / 50), 1, 50) * ecThreshold; - #else - const float threshold = get_error_correct_threshold(); - #endif - - //check error - #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) - float sum = 0, diffSum = 0; - - errIdx = (errIdx >= I2CPE_ERR_ARRAY_SIZE - 1) ? 0 : errIdx + 1; - err[errIdx] = get_axis_error_steps(false); - - LOOP_L_N(i, I2CPE_ERR_ARRAY_SIZE) { - sum += err[i]; - if (i) diffSum += ABS(err[i-1] - err[i]); - } - - const int32_t error = int32_t(sum / (I2CPE_ERR_ARRAY_SIZE + 1)); //calculate average for error - - #else - const int32_t error = get_axis_error_steps(false); - #endif - - //SERIAL_ECHOLNPAIR("Axis error steps: ", error); - - #ifdef I2CPE_ERR_THRESH_ABORT - if (ABS(error) > I2CPE_ERR_THRESH_ABORT * planner.settings.axis_steps_per_mm[encoderAxis]) { - //kill(PSTR("Significant Error")); - SERIAL_ECHOLNPAIR("Axis error over threshold, aborting!", error); - safe_delay(5000); - } - #endif - - #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) - if (errIdx == 0) { - // In order to correct for "error" but avoid correcting for noise and non-skips - // it must be > threshold and have a difference average of < 10 and be < 2000 steps - if (ABS(error) > threshold * planner.settings.axis_steps_per_mm[encoderAxis] - && diffSum < 10 * (I2CPE_ERR_ARRAY_SIZE - 1) - && ABS(error) < 2000 - ) { // Check for persistent error (skip) - errPrst[errPrstIdx++] = error; // Error must persist for I2CPE_ERR_PRST_ARRAY_SIZE error cycles. This also serves to improve the average accuracy - if (errPrstIdx >= I2CPE_ERR_PRST_ARRAY_SIZE) { - float sumP = 0; - LOOP_L_N(i, I2CPE_ERR_PRST_ARRAY_SIZE) sumP += errPrst[i]; - const int32_t errorP = int32_t(sumP * RECIPROCAL(I2CPE_ERR_PRST_ARRAY_SIZE)); - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPAIR(" : CORRECT ERR ", errorP * planner.steps_to_mm[encoderAxis], "mm"); - babystep.add_steps(encoderAxis, -LROUND(errorP)); - errPrstIdx = 0; - } - } - else - errPrstIdx = 0; - } - #else - if (ABS(error) > threshold * planner.settings.axis_steps_per_mm[encoderAxis]) { - //SERIAL_ECHOLN(error); - //SERIAL_ECHOLN(position); - babystep.add_steps(encoderAxis, -LROUND(error / 2)); - } - #endif - - if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.settings.axis_steps_per_mm[encoderAxis]) { - const millis_t ms = millis(); - if (ELAPSED(ms, nextErrorCountTime)) { - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPAIR(" : LARGE ERR ", int(error), "; diffSum=", diffSum); - errorCount++; - nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS; - } - } - } - - lastPositionTime = positionTime; -} - -void I2CPositionEncoder::set_homed() { - if (active) { - reset(); // Reset module's offset to zero (so current position is homed / zero) - delay(10); - - zeroOffset = get_raw_count(); - homed++; - trusted++; - - #ifdef I2CPE_DEBUG - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPAIR(" axis encoder homed, offset of ", zeroOffset, " ticks."); - #endif - } -} - -void I2CPositionEncoder::set_unhomed() { - zeroOffset = 0; - homed = trusted = false; - - #ifdef I2CPE_DEBUG - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPGM(" axis encoder unhomed."); - #endif -} - -bool I2CPositionEncoder::passes_test(const bool report) { - if (report) { - if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. "); - SERIAL_ECHO(axis_codes[encoderAxis]); - serial_ternary(H == I2CPE_MAG_SIG_BAD, PSTR(" axis "), PSTR("magnetic strip "), PSTR("encoder ")); - switch (H) { - case I2CPE_MAG_SIG_GOOD: - case I2CPE_MAG_SIG_MID: - SERIAL_ECHO_TERNARY(H == I2CPE_MAG_SIG_GOOD, "passes test; field strength ", "good", "fair", ".\n"); - break; - default: - SERIAL_ECHOLNPGM("not detected!"); - } - } - return (H == I2CPE_MAG_SIG_GOOD || H == I2CPE_MAG_SIG_MID); -} - -float I2CPositionEncoder::get_axis_error_mm(const bool report) { - const float target = planner.get_axis_position_mm(encoderAxis), - actual = mm_from_count(position), - diff = actual - target, - error = ABS(diff) > 10000 ? 0 : diff; // Huge error is a bad reading - - if (report) { - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPAIR(" axis target=", target, "mm; actual=", actual, "mm; err=", error, "mm"); - } - - return error; -} - -int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) { - if (!active) { - if (report) { - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPGM(" axis encoder not active!"); - } - return 0; - } - - float stepperTicksPerUnit; - int32_t encoderTicks = position, encoderCountInStepperTicksScaled; - //int32_t stepperTicks = stepper.position(encoderAxis); - - // With a rotary encoder we're concerned with ticks/rev; whereas with a linear we're concerned with ticks/mm - stepperTicksPerUnit = (type == I2CPE_ENC_TYPE_ROTARY) ? stepperTicks : planner.settings.axis_steps_per_mm[encoderAxis]; - - //convert both 'ticks' into same units / base - encoderCountInStepperTicksScaled = LROUND((stepperTicksPerUnit * encoderTicks) / encoderTicksPerUnit); - - const int32_t target = stepper.position(encoderAxis); - int32_t error = encoderCountInStepperTicksScaled - target; - - //suppress discontinuities (might be caused by bad I2C readings...?) - const bool suppressOutput = (ABS(error - errorPrev) > 100); - - errorPrev = error; - - if (report) { - SERIAL_ECHO(axis_codes[encoderAxis]); - SERIAL_ECHOLNPAIR(" axis target=", target, "; actual=", encoderCountInStepperTicksScaled, "; err=", error); - } - - if (suppressOutput) { - if (report) SERIAL_ECHOLNPGM("!Discontinuity. Suppressing error."); - error = 0; - } - - return error; -} - -int32_t I2CPositionEncoder::get_raw_count() { - uint8_t index = 0; - i2cLong encoderCount; - - encoderCount.val = 0x00; - - if (Wire.requestFrom(I2C_ADDRESS(i2cAddress), uint8_t(3)) != 3) { - //houston, we have a problem... - H = I2CPE_MAG_SIG_NF; - return 0; - } - - while (Wire.available()) - encoderCount.bval[index++] = (uint8_t)Wire.read(); - - //extract the magnetic strength - H = (B00000011 & (encoderCount.bval[2] >> 6)); - - //extract sign bit; sign = (encoderCount.bval[2] & B00100000); - //set all upper bits to the sign value to overwrite H - encoderCount.val = (encoderCount.bval[2] & B00100000) ? (encoderCount.val | 0xFFC00000) : (encoderCount.val & 0x003FFFFF); - - if (invert) encoderCount.val *= -1; - - return encoderCount.val; -} - -bool I2CPositionEncoder::test_axis() { - //only works on XYZ cartesian machines for the time being - if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) return false; - - const float startPosition = soft_endstop.min[encoderAxis] + 10, - endPosition = soft_endstop.max[encoderAxis] - 10; - const feedRate_t fr_mm_s = FLOOR(MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY)); - - ec = false; - - xyze_pos_t startCoord, endCoord; - LOOP_XYZ(a) { - startCoord[a] = planner.get_axis_position_mm((AxisEnum)a); - endCoord[a] = planner.get_axis_position_mm((AxisEnum)a); - } - startCoord[encoderAxis] = startPosition; - endCoord[encoderAxis] = endPosition; - - planner.synchronize(); - startCoord.e = planner.get_axis_position_mm(E_AXIS); - planner.buffer_line(startCoord, fr_mm_s, 0); - planner.synchronize(); - - // if the module isn't currently trusted, wait until it is (or until it should be if things are working) - if (!trusted) { - int32_t startWaitingTime = millis(); - while (!trusted && millis() - startWaitingTime < I2CPE_TIME_TRUSTED) - safe_delay(500); - } - - if (trusted) { // if trusted, commence test - endCoord.e = planner.get_axis_position_mm(E_AXIS); - planner.buffer_line(endCoord, fr_mm_s, 0); - planner.synchronize(); - } - - return trusted; -} - -void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) { - if (type != I2CPE_ENC_TYPE_LINEAR) { - SERIAL_ECHOLNPGM("Steps/mm calibration requires linear encoder."); - return; - } - - if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) { - SERIAL_ECHOLNPGM("Steps/mm calibration not supported for this axis."); - return; - } - - float old_steps_mm, new_steps_mm, - startDistance, endDistance, - travelDistance, travelledDistance, total = 0; - - int32_t startCount, stopCount; - - const feedRate_t fr_mm_s = MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY); - - bool oldec = ec; - ec = false; - - startDistance = 20; - endDistance = soft_endstop.max[encoderAxis] - 20; - travelDistance = endDistance - startDistance; - - xyze_pos_t startCoord, endCoord; - LOOP_XYZ(a) { - startCoord[a] = planner.get_axis_position_mm((AxisEnum)a); - endCoord[a] = planner.get_axis_position_mm((AxisEnum)a); - } - startCoord[encoderAxis] = startDistance; - endCoord[encoderAxis] = endDistance; - - planner.synchronize(); - - LOOP_L_N(i, iter) { - startCoord.e = planner.get_axis_position_mm(E_AXIS); - planner.buffer_line(startCoord, fr_mm_s, 0); - planner.synchronize(); - - delay(250); - startCount = get_position(); - - //do_blocking_move_to(endCoord); - - endCoord.e = planner.get_axis_position_mm(E_AXIS); - planner.buffer_line(endCoord, fr_mm_s, 0); - planner.synchronize(); - - //Read encoder distance - delay(250); - stopCount = get_position(); - - travelledDistance = mm_from_count(ABS(stopCount - startCount)); - - SERIAL_ECHOLNPAIR("Attempted travel: ", travelDistance, "mm"); - SERIAL_ECHOLNPAIR(" Actual travel: ", travelledDistance, "mm"); - - //Calculate new axis steps per unit - old_steps_mm = planner.settings.axis_steps_per_mm[encoderAxis]; - new_steps_mm = (old_steps_mm * travelDistance) / travelledDistance; - - SERIAL_ECHOLNPAIR("Old steps/mm: ", old_steps_mm); - SERIAL_ECHOLNPAIR("New steps/mm: ", new_steps_mm); - - //Save new value - planner.settings.axis_steps_per_mm[encoderAxis] = new_steps_mm; - - if (iter > 1) { - total += new_steps_mm; - - // swap start and end points so next loop runs from current position - const float tempCoord = startCoord[encoderAxis]; - startCoord[encoderAxis] = endCoord[encoderAxis]; - endCoord[encoderAxis] = tempCoord; - } - } - - if (iter > 1) { - total /= (float)iter; - SERIAL_ECHOLNPAIR("Average steps/mm: ", total); - } - - ec = oldec; - - SERIAL_ECHOLNPGM("Calculated steps/mm set. Use M500 to save to EEPROM."); -} - -void I2CPositionEncoder::reset() { - Wire.beginTransmission(I2C_ADDRESS(i2cAddress)); - Wire.write(I2CPE_RESET_COUNT); - Wire.endTransmission(); - - TERN_(I2CPE_ERR_ROLLING_AVERAGE, ZERO(err)); -} - - -bool I2CPositionEncodersMgr::I2CPE_anyaxis; -uint8_t I2CPositionEncodersMgr::I2CPE_addr, - I2CPositionEncodersMgr::I2CPE_idx; -I2CPositionEncoder I2CPositionEncodersMgr::encoders[I2CPE_ENCODER_CNT]; - -void I2CPositionEncodersMgr::init() { - Wire.begin(); - - #if I2CPE_ENCODER_CNT > 0 - uint8_t i = 0; - - encoders[i].init(I2CPE_ENC_1_ADDR, I2CPE_ENC_1_AXIS); - - #ifdef I2CPE_ENC_1_TYPE - encoders[i].set_type(I2CPE_ENC_1_TYPE); - #endif - #ifdef I2CPE_ENC_1_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_1_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_1_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_1_TICKS_REV); - #endif - #ifdef I2CPE_ENC_1_INVERT - encoders[i].set_inverted(I2CPE_ENC_1_INVERT); - #endif - #ifdef I2CPE_ENC_1_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_1_EC_METHOD); - #endif - #ifdef I2CPE_ENC_1_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_1_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_1_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - - #if I2CPE_ENCODER_CNT > 1 - i++; - - encoders[i].init(I2CPE_ENC_2_ADDR, I2CPE_ENC_2_AXIS); - - #ifdef I2CPE_ENC_2_TYPE - encoders[i].set_type(I2CPE_ENC_2_TYPE); - #endif - #ifdef I2CPE_ENC_2_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_2_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_2_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_2_TICKS_REV); - #endif - #ifdef I2CPE_ENC_2_INVERT - encoders[i].set_inverted(I2CPE_ENC_2_INVERT); - #endif - #ifdef I2CPE_ENC_2_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_2_EC_METHOD); - #endif - #ifdef I2CPE_ENC_2_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_2_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_2_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - - #if I2CPE_ENCODER_CNT > 2 - i++; - - encoders[i].init(I2CPE_ENC_3_ADDR, I2CPE_ENC_3_AXIS); - - #ifdef I2CPE_ENC_3_TYPE - encoders[i].set_type(I2CPE_ENC_3_TYPE); - #endif - #ifdef I2CPE_ENC_3_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_3_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_3_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_3_TICKS_REV); - #endif - #ifdef I2CPE_ENC_3_INVERT - encoders[i].set_inverted(I2CPE_ENC_3_INVERT); - #endif - #ifdef I2CPE_ENC_3_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_3_EC_METHOD); - #endif - #ifdef I2CPE_ENC_3_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_3_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_3_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - - #if I2CPE_ENCODER_CNT > 3 - i++; - - encoders[i].init(I2CPE_ENC_4_ADDR, I2CPE_ENC_4_AXIS); - - #ifdef I2CPE_ENC_4_TYPE - encoders[i].set_type(I2CPE_ENC_4_TYPE); - #endif - #ifdef I2CPE_ENC_4_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_4_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_4_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_4_TICKS_REV); - #endif - #ifdef I2CPE_ENC_4_INVERT - encoders[i].set_inverted(I2CPE_ENC_4_INVERT); - #endif - #ifdef I2CPE_ENC_4_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_4_EC_METHOD); - #endif - #ifdef I2CPE_ENC_4_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_4_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_4_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - - #if I2CPE_ENCODER_CNT > 4 - i++; - - encoders[i].init(I2CPE_ENC_5_ADDR, I2CPE_ENC_5_AXIS); - - #ifdef I2CPE_ENC_5_TYPE - encoders[i].set_type(I2CPE_ENC_5_TYPE); - #endif - #ifdef I2CPE_ENC_5_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_5_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_5_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_5_TICKS_REV); - #endif - #ifdef I2CPE_ENC_5_INVERT - encoders[i].set_inverted(I2CPE_ENC_5_INVERT); - #endif - #ifdef I2CPE_ENC_5_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_5_EC_METHOD); - #endif - #ifdef I2CPE_ENC_5_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_5_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_5_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif - - #if I2CPE_ENCODER_CNT > 5 - i++; - - encoders[i].init(I2CPE_ENC_6_ADDR, I2CPE_ENC_6_AXIS); - - #ifdef I2CPE_ENC_6_TYPE - encoders[i].set_type(I2CPE_ENC_6_TYPE); - #endif - #ifdef I2CPE_ENC_6_TICKS_UNIT - encoders[i].set_ticks_unit(I2CPE_ENC_6_TICKS_UNIT); - #endif - #ifdef I2CPE_ENC_6_TICKS_REV - encoders[i].set_stepper_ticks(I2CPE_ENC_6_TICKS_REV); - #endif - #ifdef I2CPE_ENC_6_INVERT - encoders[i].set_inverted(I2CPE_ENC_6_INVERT); - #endif - #ifdef I2CPE_ENC_6_EC_METHOD - encoders[i].set_ec_method(I2CPE_ENC_6_EC_METHOD); - #endif - #ifdef I2CPE_ENC_6_EC_THRESH - encoders[i].set_ec_threshold(I2CPE_ENC_6_EC_THRESH); - #endif - - encoders[i].set_active(encoders[i].passes_test(true)); - - #if I2CPE_ENC_6_AXIS == E_AXIS - encoders[i].set_homed(); - #endif - #endif -} - -void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) { - CHECK_IDX(); - - if (units) - SERIAL_ECHOLN(noOffset ? encoders[idx].mm_from_count(encoders[idx].get_raw_count()) : encoders[idx].get_position_mm()); - else { - if (noOffset) { - const int32_t raw_count = encoders[idx].get_raw_count(); - SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); - SERIAL_CHAR(' '); - - for (uint8_t j = 31; j > 0; j--) - SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j))); - - SERIAL_ECHO((bool)(0x00000001 & raw_count)); - SERIAL_CHAR(' '); - SERIAL_ECHOLN(raw_count); - } - else - SERIAL_ECHOLN(encoders[idx].get_position()); - } -} - -void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const uint8_t newaddr) { - // First check 'new' address is not in use - Wire.beginTransmission(I2C_ADDRESS(newaddr)); - if (!Wire.endTransmission()) { - SERIAL_ECHOLNPAIR("?There is already a device with that address on the I2C bus! (", newaddr, ")"); - return; - } - - // Now check that we can find the module on the oldaddr address - Wire.beginTransmission(I2C_ADDRESS(oldaddr)); - if (Wire.endTransmission()) { - SERIAL_ECHOLNPAIR("?No module detected at this address! (", oldaddr, ")"); - return; - } - - SERIAL_ECHOLNPAIR("Module found at ", oldaddr, ", changing address to ", newaddr); - - // Change the modules address - Wire.beginTransmission(I2C_ADDRESS(oldaddr)); - Wire.write(I2CPE_SET_ADDR); - Wire.write(newaddr); - Wire.endTransmission(); - - SERIAL_ECHOLNPGM("Address changed, resetting and waiting for confirmation.."); - - // Wait for the module to reset (can probably be improved by polling address with a timeout). - safe_delay(I2CPE_REBOOT_TIME); - - // Look for the module at the new address. - Wire.beginTransmission(I2C_ADDRESS(newaddr)); - if (Wire.endTransmission()) { - SERIAL_ECHOLNPGM("Address change failed! Check encoder module."); - return; - } - - SERIAL_ECHOLNPGM("Address change successful!"); - - // Now, if this module is configured, find which encoder instance it's supposed to correspond to - // and enable it (it will likely have failed initialization on power-up, before the address change). - const int8_t idx = idx_from_addr(newaddr); - if (idx >= 0 && !encoders[idx].get_active()) { - SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); - SERIAL_ECHOLNPGM(" axis encoder was not detected on printer startup. Trying again."); - encoders[idx].set_active(encoders[idx].passes_test(true)); - } -} - -void I2CPositionEncodersMgr::report_module_firmware(const uint8_t address) { - // First check there is a module - Wire.beginTransmission(I2C_ADDRESS(address)); - if (Wire.endTransmission()) { - SERIAL_ECHOLNPAIR("?No module detected at this address! (", address, ")"); - return; - } - - SERIAL_ECHOLNPAIR("Requesting version info from module at address ", address, ":"); - - Wire.beginTransmission(I2C_ADDRESS(address)); - Wire.write(I2CPE_SET_REPORT_MODE); - Wire.write(I2CPE_REPORT_VERSION); - Wire.endTransmission(); - - // Read value - if (Wire.requestFrom(I2C_ADDRESS(address), uint8_t(32))) { - char c; - while (Wire.available() > 0 && (c = (char)Wire.read()) > 0) - SERIAL_ECHO(c); - SERIAL_EOL(); - } - - // Set module back to normal (distance) mode - Wire.beginTransmission(I2C_ADDRESS(address)); - Wire.write(I2CPE_SET_REPORT_MODE); - Wire.write(I2CPE_REPORT_DISTANCE); - Wire.endTransmission(); -} - -int8_t I2CPositionEncodersMgr::parse() { - I2CPE_addr = 0; - - if (parser.seen('A')) { - - if (!parser.has_value()) { - SERIAL_ECHOLNPGM("?A seen, but no address specified! [30-200]"); - return I2CPE_PARSE_ERR; - }; - - I2CPE_addr = parser.value_byte(); - if (!WITHIN(I2CPE_addr, 30, 200)) { // reserve the first 30 and last 55 - SERIAL_ECHOLNPGM("?Address out of range. [30-200]"); - return I2CPE_PARSE_ERR; - } - - I2CPE_idx = idx_from_addr(I2CPE_addr); - if (I2CPE_idx >= I2CPE_ENCODER_CNT) { - SERIAL_ECHOLNPGM("?No device with this address!"); - return I2CPE_PARSE_ERR; - } - } - else if (parser.seenval('I')) { - - if (!parser.has_value()) { - SERIAL_ECHOLNPAIR("?I seen, but no index specified! [0-", I2CPE_ENCODER_CNT - 1, "]"); - return I2CPE_PARSE_ERR; - }; - - I2CPE_idx = parser.value_byte(); - if (I2CPE_idx >= I2CPE_ENCODER_CNT) { - SERIAL_ECHOLNPAIR("?Index out of range. [0-", I2CPE_ENCODER_CNT - 1, "]"); - return I2CPE_PARSE_ERR; - } - - I2CPE_addr = encoders[I2CPE_idx].get_address(); - } - else - I2CPE_idx = 0xFF; - - I2CPE_anyaxis = parser.seen_axis(); - - return I2CPE_PARSE_OK; -}; - -/** - * M860: Report the position(s) of position encoder module(s). - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1] - * O Include homed zero-offset in returned position. - * U Units in mm or raw step count. - * - * If A or I not specified: - * X Report on X axis encoder, if present. - * Y Report on Y axis encoder, if present. - * Z Report on Z axis encoder, if present. - * E Report on E axis encoder, if present. - */ -void I2CPositionEncodersMgr::M860() { - if (parse()) return; - - const bool hasU = parser.seen('U'), hasO = parser.seen('O'); - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) report_position(idx, hasU, hasO); - } - } - } - else - report_position(I2CPE_idx, hasU, hasO); -} - -/** - * M861: Report the status of position encoder modules. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1] - * - * If A or I not specified: - * X Report on X axis encoder, if present. - * Y Report on Y axis encoder, if present. - * Z Report on Z axis encoder, if present. - * E Report on E axis encoder, if present. - */ -void I2CPositionEncodersMgr::M861() { - if (parse()) return; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) report_status(idx); - } - } - } - else - report_status(I2CPE_idx); -} - -/** - * M862: Perform an axis continuity test for position encoder - * modules. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1] - * - * If A or I not specified: - * X Report on X axis encoder, if present. - * Y Report on Y axis encoder, if present. - * Z Report on Z axis encoder, if present. - * E Report on E axis encoder, if present. - */ -void I2CPositionEncodersMgr::M862() { - if (parse()) return; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) test_axis(idx); - } - } - } - else - test_axis(I2CPE_idx); -} - -/** - * M863: Perform steps-per-mm calibration for - * position encoder modules. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1] - * P Number of rePeats/iterations. - * - * If A or I not specified: - * X Report on X axis encoder, if present. - * Y Report on Y axis encoder, if present. - * Z Report on Z axis encoder, if present. - * E Report on E axis encoder, if present. - */ -void I2CPositionEncodersMgr::M863() { - if (parse()) return; - - const uint8_t iterations = constrain(parser.byteval('P', 1), 1, 10); - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) calibrate_steps_mm(idx, iterations); - } - } - } - else - calibrate_steps_mm(I2CPE_idx, iterations); -} - -/** - * M864: Change position encoder module I2C address. - * - * A Module current/old I2C address. If not present, - * assumes default address (030). [30, 200]. - * S Module new I2C address. [30, 200]. - * - * If S is not specified: - * X Use I2CPE_PRESET_ADDR_X (030). - * Y Use I2CPE_PRESET_ADDR_Y (031). - * Z Use I2CPE_PRESET_ADDR_Z (032). - * E Use I2CPE_PRESET_ADDR_E (033). - */ -void I2CPositionEncodersMgr::M864() { - uint8_t newAddress; - - if (parse()) return; - - if (!I2CPE_addr) I2CPE_addr = I2CPE_PRESET_ADDR_X; - - if (parser.seen('S')) { - if (!parser.has_value()) { - SERIAL_ECHOLNPGM("?S seen, but no address specified! [30-200]"); - return; - }; - - newAddress = parser.value_byte(); - if (!WITHIN(newAddress, 30, 200)) { - SERIAL_ECHOLNPGM("?New address out of range. [30-200]"); - return; - } - } - else if (!I2CPE_anyaxis) { - SERIAL_ECHOLNPGM("?You must specify S or [XYZE]."); - return; - } - else { - if (parser.seen('X')) newAddress = I2CPE_PRESET_ADDR_X; - else if (parser.seen('Y')) newAddress = I2CPE_PRESET_ADDR_Y; - else if (parser.seen('Z')) newAddress = I2CPE_PRESET_ADDR_Z; - else if (parser.seen('E')) newAddress = I2CPE_PRESET_ADDR_E; - else return; - } - - SERIAL_ECHOLNPAIR("Changing module at address ", I2CPE_addr, " to address ", newAddress); - - change_module_address(I2CPE_addr, newAddress); -} - -/** - * M865: Check position encoder module firmware version. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * - * If A or I not specified: - * X Check X axis encoder, if present. - * Y Check Y axis encoder, if present. - * Z Check Z axis encoder, if present. - * E Check E axis encoder, if present. - */ -void I2CPositionEncodersMgr::M865() { - if (parse()) return; - - if (!I2CPE_addr) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) report_module_firmware(encoders[idx].get_address()); - } - } - } - else - report_module_firmware(I2CPE_addr); -} - -/** - * M866: Report or reset position encoder module error - * count. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * R Reset error counter. - * - * If A or I not specified: - * X Act on X axis encoder, if present. - * Y Act on Y axis encoder, if present. - * Z Act on Z axis encoder, if present. - * E Act on E axis encoder, if present. - */ -void I2CPositionEncodersMgr::M866() { - if (parse()) return; - - const bool hasR = parser.seen('R'); - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) { - if (hasR) - reset_error_count(idx, AxisEnum(i)); - else - report_error_count(idx, AxisEnum(i)); - } - } - } - } - else if (hasR) - reset_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); - else - report_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); -} - -/** - * M867: Enable/disable or toggle error correction for position encoder modules. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * S<1|0> Enable/disable error correction. 1 enables, 0 disables. If not - * supplied, toggle. - * - * If A or I not specified: - * X Act on X axis encoder, if present. - * Y Act on Y axis encoder, if present. - * Z Act on Z axis encoder, if present. - * E Act on E axis encoder, if present. - */ -void I2CPositionEncodersMgr::M867() { - if (parse()) return; - - const int8_t onoff = parser.seenval('S') ? parser.value_int() : -1; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) { - const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; - enable_ec(idx, ena, AxisEnum(i)); - } - } - } - } - else { - const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; - enable_ec(I2CPE_idx, ena, encoders[I2CPE_idx].get_axis()); - } -} - -/** - * M868: Report or set position encoder module error correction - * threshold. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * T New error correction threshold. - * - * If A not specified: - * X Act on X axis encoder, if present. - * Y Act on Y axis encoder, if present. - * Z Act on Z axis encoder, if present. - * E Act on E axis encoder, if present. - */ -void I2CPositionEncodersMgr::M868() { - if (parse()) return; - - const float newThreshold = parser.seenval('T') ? parser.value_float() : -9999; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) { - if (newThreshold != -9999) - set_ec_threshold(idx, newThreshold, encoders[idx].get_axis()); - else - get_ec_threshold(idx, encoders[idx].get_axis()); - } - } - } - } - else if (newThreshold != -9999) - set_ec_threshold(I2CPE_idx, newThreshold, encoders[I2CPE_idx].get_axis()); - else - get_ec_threshold(I2CPE_idx, encoders[I2CPE_idx].get_axis()); -} - -/** - * M869: Report position encoder module error. - * - * A Module I2C address. [30, 200]. - * I Module index. [0, I2CPE_ENCODER_CNT - 1]. - * - * If A not specified: - * X Act on X axis encoder, if present. - * Y Act on Y axis encoder, if present. - * Z Act on Z axis encoder, if present. - * E Act on E axis encoder, if present. - */ -void I2CPositionEncodersMgr::M869() { - if (parse()) return; - - if (I2CPE_idx == 0xFF) { - LOOP_XYZE(i) { - if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { - const uint8_t idx = idx_from_axis(AxisEnum(i)); - if ((int8_t)idx >= 0) report_error(idx); - } - } - } - else - report_error(I2CPE_idx); -} - -#endif // I2C_POSITION_ENCODERS diff --git a/Marlin/src/feature/encoder_i2c.h b/Marlin/src/feature/encoder_i2c.h deleted file mode 100644 index 511e560ba0..0000000000 --- a/Marlin/src/feature/encoder_i2c.h +++ /dev/null @@ -1,320 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfig.h" - -#include "../module/planner.h" - -#include - -//=========== Advanced / Less-Common Encoder Configuration Settings ========== - -#define I2CPE_EC_THRESH_PROPORTIONAL // if enabled adjusts the error correction threshold - // proportional to the current speed of the axis allows - // for very small error margin at low speeds without - // stuttering due to reading latency at high speeds - -#define I2CPE_DEBUG // enable encoder-related debug serial echos - -#define I2CPE_REBOOT_TIME 5000 // time we wait for an encoder module to reboot - // after changing address. - -#define I2CPE_MAG_SIG_GOOD 0 -#define I2CPE_MAG_SIG_MID 1 -#define I2CPE_MAG_SIG_BAD 2 -#define I2CPE_MAG_SIG_NF 255 - -#define I2CPE_REQ_REPORT 0 -#define I2CPE_RESET_COUNT 1 -#define I2CPE_SET_ADDR 2 -#define I2CPE_SET_REPORT_MODE 3 -#define I2CPE_CLEAR_EEPROM 4 - -#define I2CPE_LED_PAR_MODE 10 -#define I2CPE_LED_PAR_BRT 11 -#define I2CPE_LED_PAR_RATE 14 - -#define I2CPE_REPORT_DISTANCE 0 -#define I2CPE_REPORT_STRENGTH 1 -#define I2CPE_REPORT_VERSION 2 - -// Default I2C addresses -#define I2CPE_PRESET_ADDR_X 30 -#define I2CPE_PRESET_ADDR_Y 31 -#define I2CPE_PRESET_ADDR_Z 32 -#define I2CPE_PRESET_ADDR_E 33 - -#define I2CPE_DEF_AXIS X_AXIS -#define I2CPE_DEF_ADDR I2CPE_PRESET_ADDR_X - -// Error event counter; tracks how many times there is an error exceeding a certain threshold -#define I2CPE_ERR_CNT_THRESH 3.00 -#define I2CPE_ERR_CNT_DEBOUNCE_MS 2000 - -#if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) - #define I2CPE_ERR_ARRAY_SIZE 32 - #define I2CPE_ERR_PRST_ARRAY_SIZE 10 -#endif - -// Error Correction Methods -#define I2CPE_ECM_NONE 0 -#define I2CPE_ECM_MICROSTEP 1 -#define I2CPE_ECM_PLANNER 2 -#define I2CPE_ECM_STALLDETECT 3 - -// Encoder types -#define I2CPE_ENC_TYPE_ROTARY 0 -#define I2CPE_ENC_TYPE_LINEAR 1 - -// Parser -#define I2CPE_PARSE_ERR 1 -#define I2CPE_PARSE_OK 0 - -#define LOOP_PE(VAR) LOOP_L_N(VAR, I2CPE_ENCODER_CNT) -#define CHECK_IDX() do{ if (!WITHIN(idx, 0, I2CPE_ENCODER_CNT - 1)) return; }while(0) - -typedef union { - volatile int32_t val = 0; - uint8_t bval[4]; -} i2cLong; - -class I2CPositionEncoder { - private: - AxisEnum encoderAxis = I2CPE_DEF_AXIS; - - uint8_t i2cAddress = I2CPE_DEF_ADDR, - ecMethod = I2CPE_DEF_EC_METHOD, - type = I2CPE_DEF_TYPE, - H = I2CPE_MAG_SIG_NF; // Magnetic field strength - - int encoderTicksPerUnit = I2CPE_DEF_ENC_TICKS_UNIT, - stepperTicks = I2CPE_DEF_TICKS_REV, - errorCount = 0, - errorPrev = 0; - - float ecThreshold = I2CPE_DEF_EC_THRESH; - - bool homed = false, - trusted = false, - initialized = false, - active = false, - invert = false, - ec = true; - - int32_t zeroOffset = 0, - lastPosition = 0, - position; - - millis_t lastPositionTime = 0, - nextErrorCountTime = 0, - lastErrorTime; - - #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) - uint8_t errIdx = 0, errPrstIdx = 0; - int err[I2CPE_ERR_ARRAY_SIZE] = { 0 }, - errPrst[I2CPE_ERR_PRST_ARRAY_SIZE] = { 0 }; - #endif - - public: - void init(const uint8_t address, const AxisEnum axis); - void reset(); - - void update(); - - void set_homed(); - void set_unhomed(); - - int32_t get_raw_count(); - - FORCE_INLINE float mm_from_count(const int32_t count) { - switch (type) { - default: return -1; - case I2CPE_ENC_TYPE_LINEAR: - return count / encoderTicksPerUnit; - case I2CPE_ENC_TYPE_ROTARY: - return (count * stepperTicks) / (encoderTicksPerUnit * planner.settings.axis_steps_per_mm[encoderAxis]); - } - } - - FORCE_INLINE float get_position_mm() { return mm_from_count(get_position()); } - FORCE_INLINE int32_t get_position() { return get_raw_count() - zeroOffset; } - - int32_t get_axis_error_steps(const bool report); - float get_axis_error_mm(const bool report); - - void calibrate_steps_mm(const uint8_t iter); - - bool passes_test(const bool report); - - bool test_axis(); - - FORCE_INLINE int get_error_count() { return errorCount; } - FORCE_INLINE void set_error_count(const int newCount) { errorCount = newCount; } - - FORCE_INLINE uint8_t get_address() { return i2cAddress; } - FORCE_INLINE void set_address(const uint8_t addr) { i2cAddress = addr; } - - FORCE_INLINE bool get_active() { return active; } - FORCE_INLINE void set_active(const bool a) { active = a; } - - FORCE_INLINE void set_inverted(const bool i) { invert = i; } - - FORCE_INLINE AxisEnum get_axis() { return encoderAxis; } - - FORCE_INLINE bool get_ec_enabled() { return ec; } - FORCE_INLINE void set_ec_enabled(const bool enabled) { ec = enabled; } - - FORCE_INLINE uint8_t get_ec_method() { return ecMethod; } - FORCE_INLINE void set_ec_method(const byte method) { ecMethod = method; } - - FORCE_INLINE float get_ec_threshold() { return ecThreshold; } - FORCE_INLINE void set_ec_threshold(const float newThreshold) { ecThreshold = newThreshold; } - - FORCE_INLINE int get_encoder_ticks_mm() { - switch (type) { - default: return 0; - case I2CPE_ENC_TYPE_LINEAR: - return encoderTicksPerUnit; - case I2CPE_ENC_TYPE_ROTARY: - return (int)((encoderTicksPerUnit / stepperTicks) * planner.settings.axis_steps_per_mm[encoderAxis]); - } - } - - FORCE_INLINE int get_ticks_unit() { return encoderTicksPerUnit; } - FORCE_INLINE void set_ticks_unit(const int ticks) { encoderTicksPerUnit = ticks; } - - FORCE_INLINE uint8_t get_type() { return type; } - FORCE_INLINE void set_type(const byte newType) { type = newType; } - - FORCE_INLINE int get_stepper_ticks() { return stepperTicks; } - FORCE_INLINE void set_stepper_ticks(const int ticks) { stepperTicks = ticks; } -}; - -class I2CPositionEncodersMgr { - private: - static bool I2CPE_anyaxis; - static uint8_t I2CPE_addr, I2CPE_idx; - - public: - - static void init(); - - // consider only updating one endoder per call / tick if encoders become too time intensive - static void update() { LOOP_PE(i) encoders[i].update(); } - - static void homed(const AxisEnum axis) { - LOOP_PE(i) - if (encoders[i].get_axis() == axis) encoders[i].set_homed(); - } - - static void unhomed(const AxisEnum axis) { - LOOP_PE(i) - if (encoders[i].get_axis() == axis) encoders[i].set_unhomed(); - } - - static void report_position(const int8_t idx, const bool units, const bool noOffset); - - static void report_status(const int8_t idx) { - CHECK_IDX(); - SERIAL_ECHOLNPAIR("Encoder ", idx, ": "); - encoders[idx].get_raw_count(); - encoders[idx].passes_test(true); - } - - static void report_error(const int8_t idx) { - CHECK_IDX(); - encoders[idx].get_axis_error_steps(true); - } - - static void test_axis(const int8_t idx) { - CHECK_IDX(); - encoders[idx].test_axis(); - } - - static void calibrate_steps_mm(const int8_t idx, const int iterations) { - CHECK_IDX(); - encoders[idx].calibrate_steps_mm(iterations); - } - - static void change_module_address(const uint8_t oldaddr, const uint8_t newaddr); - static void report_module_firmware(const uint8_t address); - - static void report_error_count(const int8_t idx, const AxisEnum axis) { - CHECK_IDX(); - SERIAL_ECHOLNPAIR("Error count on ", axis_codes[axis], " axis is ", encoders[idx].get_error_count()); - } - - static void reset_error_count(const int8_t idx, const AxisEnum axis) { - CHECK_IDX(); - encoders[idx].set_error_count(0); - SERIAL_ECHOLNPAIR("Error count on ", axis_codes[axis], " axis has been reset."); - } - - static void enable_ec(const int8_t idx, const bool enabled, const AxisEnum axis) { - CHECK_IDX(); - encoders[idx].set_ec_enabled(enabled); - SERIAL_ECHOPAIR("Error correction on ", axis_codes[axis]); - SERIAL_ECHO_TERNARY(encoders[idx].get_ec_enabled(), " axis is ", "en", "dis", "abled.\n"); - } - - static void set_ec_threshold(const int8_t idx, const float newThreshold, const AxisEnum axis) { - CHECK_IDX(); - encoders[idx].set_ec_threshold(newThreshold); - SERIAL_ECHOLNPAIR("Error correct threshold for ", axis_codes[axis], " axis set to ", newThreshold, "mm."); - } - - static void get_ec_threshold(const int8_t idx, const AxisEnum axis) { - CHECK_IDX(); - const float threshold = encoders[idx].get_ec_threshold(); - SERIAL_ECHOLNPAIR("Error correct threshold for ", axis_codes[axis], " axis is ", threshold, "mm."); - } - - static int8_t idx_from_axis(const AxisEnum axis) { - LOOP_PE(i) - if (encoders[i].get_axis() == axis) return i; - return -1; - } - - static int8_t idx_from_addr(const uint8_t addr) { - LOOP_PE(i) - if (encoders[i].get_address() == addr) return i; - return -1; - } - - static int8_t parse(); - - static void M860(); - static void M861(); - static void M862(); - static void M863(); - static void M864(); - static void M865(); - static void M866(); - static void M867(); - static void M868(); - static void M869(); - - static I2CPositionEncoder encoders[I2CPE_ENCODER_CNT]; -}; - -extern I2CPositionEncodersMgr I2CPEM; diff --git a/Marlin/src/feature/fanmux.cpp b/Marlin/src/feature/fanmux.cpp index 43952ca8ee..3457fe49b4 100644 --- a/Marlin/src/feature/fanmux.cpp +++ b/Marlin/src/feature/fanmux.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -36,12 +36,12 @@ void fanmux_switch(const uint8_t e) { #if PIN_EXISTS(FANMUX1) WRITE(FANMUX1_PIN, TEST(e, 1) ? HIGH : LOW); #if PIN_EXISTS(FANMUX2) - WRITE(FANMUX2_PIN, TEST(e, 2) ? HIGH : LOW); + WRITE(FANMUX2, TEST(e, 2) ? HIGH : LOW); #endif #endif } -void fanmux_init() { +void fanmux_init(void) { SET_OUTPUT(FANMUX0_PIN); #if PIN_EXISTS(FANMUX1) SET_OUTPUT(FANMUX1_PIN); diff --git a/Marlin/src/feature/fanmux.h b/Marlin/src/feature/fanmux.h index b1b0c67a55..2524876146 100644 --- a/Marlin/src/feature/fanmux.h +++ b/Marlin/src/feature/fanmux.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,14 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * feature/fanmux.h - Cooling Fan Multiplexer support functions */ +#ifndef _FANMUX_H_ +#define _FANMUX_H_ + extern void fanmux_switch(const uint8_t e); -extern void fanmux_init(); +extern void fanmux_init(void); + +#endif // _FANMUX_H_ diff --git a/Marlin/src/feature/filwidth.cpp b/Marlin/src/feature/filwidth.cpp index 2bd9c78980..98743713c8 100644 --- a/Marlin/src/feature/filwidth.cpp +++ b/Marlin/src/feature/filwidth.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -26,24 +26,11 @@ #include "filwidth.h" -FilamentWidthSensor filwidth; - -bool FilamentWidthSensor::enabled; // = false; // (M405-M406) Filament Width Sensor ON/OFF. -uint32_t FilamentWidthSensor::accum; // = 0 // ADC accumulator -uint16_t FilamentWidthSensor::raw; // = 0 // Measured filament diameter - one extruder only -float FilamentWidthSensor::nominal_mm = DEFAULT_NOMINAL_FILAMENT_DIA, // (M104) Nominal filament width - FilamentWidthSensor::measured_mm = DEFAULT_MEASURED_FILAMENT_DIA, // Measured filament diameter - FilamentWidthSensor::e_count = 0, - FilamentWidthSensor::delay_dist = 0; -uint8_t FilamentWidthSensor::meas_delay_cm = MEASUREMENT_DELAY_CM; // Distance delay setting -int8_t FilamentWidthSensor::ratios[MAX_MEASUREMENT_DELAY + 1], // Ring buffer to delay measurement. (Extruder factor minus 100) - FilamentWidthSensor::index_r, // Indexes into ring buffer - FilamentWidthSensor::index_w; - -void FilamentWidthSensor::init() { - const int8_t ratio = sample_to_size_ratio(); - LOOP_L_N(i, COUNT(ratios)) ratios[i] = ratio; - index_r = index_w = 0; -} +bool filament_sensor; // = false; // M405/M406 turns filament sensor control ON/OFF. +float filament_width_nominal = DEFAULT_NOMINAL_FILAMENT_DIA, // Nominal filament width. Change with M404. + filament_width_meas = DEFAULT_MEASURED_FILAMENT_DIA; // Measured filament diameter +uint8_t meas_delay_cm = MEASUREMENT_DELAY_CM; // Distance delay setting +int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1], // Ring buffer to delayed measurement. Store extruder factor after subtracting 100 + filwidth_delay_index[2] = { 0, -1 }; // Indexes into ring buffer #endif // FILAMENT_WIDTH_SENSOR diff --git a/Marlin/src/feature/filwidth.h b/Marlin/src/feature/filwidth.h index ef3859df71..1f0dfc6f04 100644 --- a/Marlin/src/feature/filwidth.h +++ b/Marlin/src/feature/filwidth.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,105 +16,20 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __FILWIDTH_H__ +#define __FILWIDTH_H__ #include "../inc/MarlinConfig.h" -#include "../module/planner.h" -#include "../module/thermistor/thermistors.h" -class FilamentWidthSensor { -public: - static constexpr int MMD_CM = MAX_MEASUREMENT_DELAY + 1, MMD_MM = MMD_CM * 10; - static bool enabled; // (M405-M406) Filament Width Sensor ON/OFF. - static uint32_t accum; // ADC accumulator - static uint16_t raw; // Measured filament diameter - one extruder only - static float nominal_mm, // (M104) Nominal filament width - measured_mm, // Measured filament diameter - e_count, delay_dist; - static uint8_t meas_delay_cm; // Distance delay setting - static int8_t ratios[MMD_CM], // Ring buffer to delay measurement. (Extruder factor minus 100) - index_r, index_w; // Indexes into ring buffer +extern bool filament_sensor; // M405/M406 turns filament sensor control ON/OFF. +extern float filament_width_nominal, // Nominal filament width. Change with M404. + filament_width_meas; // Measured filament diameter +extern uint8_t meas_delay_cm; // Distance delay setting +extern int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1], // Ring buffer to delayed measurement. Store extruder factor after subtracting 100 + filwidth_delay_index[2]; // Indexes into ring buffer - FilamentWidthSensor() { init(); } - static void init(); - - static inline void enable(const bool ena) { enabled = ena; } - - static inline void set_delay_cm(const uint8_t cm) { - meas_delay_cm = _MIN(cm, MAX_MEASUREMENT_DELAY); - } - - /** - * Convert Filament Width (mm) to an extrusion ratio - * and reduce to an 8 bit value. - * - * A nominal width of 1.75 and measured width of 1.73 - * gives (100 * 1.75 / 1.73) for a ratio of 101 and - * a return value of 1. - */ - static int8_t sample_to_size_ratio() { - return ABS(nominal_mm - measured_mm) <= FILWIDTH_ERROR_MARGIN - ? int(100.0f * nominal_mm / measured_mm) - 100 : 0; - } - - // Apply a single ADC reading to the raw value - static void accumulate(const uint16_t adc) { - if (adc > 102) // Ignore ADC under 0.5 volts - accum += (uint32_t(adc) << 7) - (accum >> 7); - } - - // Convert raw measurement to mm - static inline float raw_to_mm(const uint16_t v) { return v * 5.0f * RECIPROCAL(float(MAX_RAW_THERMISTOR_VALUE)); } - static inline float raw_to_mm() { return raw_to_mm(raw); } - - // A scaled reading is ready - // Divide to get to 0-16384 range since we used 1/128 IIR filter approach - static inline void reading_ready() { raw = accum >> 10; } - - // Update mm from the raw measurement - static inline void update_measured_mm() { measured_mm = raw_to_mm(); } - - // Update ring buffer used to delay filament measurements - static inline void advance_e(const float &e_move) { - - // Increment counters with the E distance - e_count += e_move; - delay_dist += e_move; - - // Only get new measurements on forward E movement - if (!UNEAR_ZERO(e_count)) { - - // Loop the delay distance counter (modulus by the mm length) - while (delay_dist >= MMD_MM) delay_dist -= MMD_MM; - - // Convert into an index (cm) into the measurement array - index_r = int8_t(delay_dist * 0.1f); - - // If the ring buffer is not full... - if (index_r != index_w) { - e_count = 0; // Reset the E movement counter - const int8_t meas_sample = sample_to_size_ratio(); - do { - if (++index_w >= MMD_CM) index_w = 0; // The next unused slot - ratios[index_w] = meas_sample; // Store the measurement - } while (index_r != index_w); // More slots to fill? - } - } - } - - // Dynamically set the volumetric multiplier based on the delayed width measurement. - static inline void update_volumetric() { - if (enabled) { - int8_t read_index = index_r - meas_delay_cm; - if (read_index < 0) read_index += MMD_CM; // Loop around buffer if needed - LIMIT(read_index, 0, MAX_MEASUREMENT_DELAY); - planner.apply_filament_width_sensor(ratios[read_index]); - } - } - -}; - -extern FilamentWidthSensor filwidth; +#endif // __FILWIDTH_H__ diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index e5c52562a9..a034c0f7af 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -36,45 +36,43 @@ FWRetract fwretract; // Single instance - this calls the constructor #include "../module/planner.h" #include "../module/stepper.h" -#if ENABLED(RETRACT_SYNC_MIXING) - #include "mixing.h" -#endif - // private: -#if HAS_MULTI_EXTRUDER - bool FWRetract::retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted +#if EXTRUDERS > 1 + bool FWRetract::retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted #endif // public: -fwretract_settings_t FWRetract::settings; // M207 S F Z W, M208 S F W R - -#if ENABLED(FWRETRACT_AUTORETRACT) - bool FWRetract::autoretract_enabled; // M209 S - Autoretract switch -#endif - -bool FWRetract::retracted[EXTRUDERS]; // Which extruders are currently retracted - -float FWRetract::current_retract[EXTRUDERS], // Retract value used by planner +bool FWRetract::autoretract_enabled, // M209 S - Autoretract switch + FWRetract::retracted[EXTRUDERS]; // Which extruders are currently retracted +float FWRetract::retract_length, // M207 S - G10 Retract length + FWRetract::retract_feedrate_mm_s, // M207 F - G10 Retract feedrate + FWRetract::retract_zlift, // M207 Z - G10 Retract hop size + FWRetract::retract_recover_length, // M208 S - G11 Recover length + FWRetract::retract_recover_feedrate_mm_s, // M208 F - G11 Recover feedrate + FWRetract::swap_retract_length, // M207 W - G10 Swap Retract length + FWRetract::swap_retract_recover_length, // M208 W - G11 Swap Recover length + FWRetract::swap_retract_recover_feedrate_mm_s, // M208 R - G11 Swap Recover feedrate FWRetract::current_hop; void FWRetract::reset() { - TERN_(FWRETRACT_AUTORETRACT, autoretract_enabled = false); - settings.retract_length = RETRACT_LENGTH; - settings.retract_feedrate_mm_s = RETRACT_FEEDRATE; - settings.retract_zraise = RETRACT_ZRAISE; - settings.retract_recover_extra = RETRACT_RECOVER_LENGTH; - settings.retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE; - settings.swap_retract_length = RETRACT_LENGTH_SWAP; - settings.swap_retract_recover_extra = RETRACT_RECOVER_LENGTH_SWAP; - settings.swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP; + autoretract_enabled = false; + retract_length = RETRACT_LENGTH; + retract_feedrate_mm_s = RETRACT_FEEDRATE; + retract_zlift = RETRACT_ZLIFT; + retract_recover_length = RETRACT_RECOVER_LENGTH; + retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE; + swap_retract_length = RETRACT_LENGTH_SWAP; + swap_retract_recover_length = RETRACT_RECOVER_LENGTH_SWAP; + swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP; current_hop = 0.0; - LOOP_L_N(i, EXTRUDERS) { + for (uint8_t i = 0; i < EXTRUDERS; ++i) { retracted[i] = false; - TERN_(HAS_MULTI_EXTRUDER, retracted_swap[i] = false); - current_retract[i] = 0.0; + #if EXTRUDERS > 1 + retracted_swap[i] = false; + #endif } } @@ -86,20 +84,26 @@ void FWRetract::reset() { * * To simplify the logic, doubled retract/recover moves are ignored. * + * Note: Z lift is done transparently to the planner. Aborting + * a print between G10 and G11 may corrupt the Z position. + * * Note: Auto-retract will apply the set Z hop in addition to any Z hop * included in the G-code. Use M207 Z0 to to prevent double hop. */ void FWRetract::retract(const bool retracting - #if HAS_MULTI_EXTRUDER - , bool swapping/*=false*/ + #if EXTRUDERS > 1 + , bool swapping /* =false */ #endif ) { + + static float current_hop = 0.0; // Total amount lifted, for use in recover + // Prevent two retracts or recovers in a row if (retracted[active_extruder] == retracting) return; // Prevent two swap-retract or recovers in a row - #if HAS_MULTI_EXTRUDER - // Allow G10 S1 only after G11 + #if EXTRUDERS > 1 + // Allow G10 S1 only after G10 if (swapping && retracted_swap[active_extruder] == retracting) return; // G11 priority to recover the long retract if activated if (!retracting) swapping = retracted_swap[active_extruder]; @@ -108,77 +112,69 @@ void FWRetract::retract(const bool retracting #endif /* // debugging - SERIAL_ECHOLNPAIR( - "retracting ", retracting, - " swapping ", swapping, - " active extruder ", active_extruder - ); - LOOP_L_N(i, EXTRUDERS) { - SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); - #if HAS_MULTI_EXTRUDER - SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); + SERIAL_ECHOLNPAIR("retracting ", retracting); + SERIAL_ECHOLNPAIR("swapping ", swapping); + SERIAL_ECHOLNPAIR("active extruder ", active_extruder); + for (uint8_t i = 0; i < EXTRUDERS; ++i) { + SERIAL_ECHOPAIR("retracted[", i); + SERIAL_ECHOLNPAIR("] ", retracted[i]); + #if EXTRUDERS > 1 + SERIAL_ECHOPAIR("retracted_swap[", i); + SERIAL_ECHOLNPAIR("] ", retracted_swap[i]); #endif } - SERIAL_ECHOLNPAIR("current_position.z ", current_position.z); - SERIAL_ECHOLNPAIR("current_position.e ", current_position.e); + SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); + SERIAL_ECHOLNPAIR("current_position[e] ", current_position[E_AXIS]); SERIAL_ECHOLNPAIR("current_hop ", current_hop); //*/ - const float base_retract = TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS)) - * (swapping ? settings.swap_retract_length : settings.retract_length); + const float old_feedrate_mm_s = feedrate_mm_s, + renormalize = RECIPROCAL(planner.e_factor[active_extruder]), + base_retract = swapping ? swap_retract_length : retract_length, + old_z = current_position[Z_AXIS], + old_e = current_position[E_AXIS]; // The current position will be the destination for E and Z moves - destination = current_position; + set_destination_from_current(); - #if ENABLED(RETRACT_SYNC_MIXING) - const uint8_t old_mixing_tool = mixer.get_current_vtool(); - mixer.T(MIXER_AUTORETRACT_TOOL); - #endif - - const feedRate_t fr_max_z = planner.settings.max_feedrate_mm_s[Z_AXIS]; if (retracting) { // Retract by moving from a faux E position back to the current E position - current_retract[active_extruder] = base_retract; - prepare_internal_move_to_destination( // set current to destination - settings.retract_feedrate_mm_s * TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS)) - ); + feedrate_mm_s = retract_feedrate_mm_s; + destination[E_AXIS] -= base_retract * renormalize; + prepare_move_to_destination(); // set_current_to_destination // Is a Z hop set, and has the hop not yet been done? - if (!current_hop && settings.retract_zraise > 0.01f) { // Apply hop only once - current_hop += settings.retract_zraise; // Add to the hop total (again, only once) - // Raise up, set_current_to_destination. Maximum Z feedrate - prepare_internal_move_to_destination(fr_max_z); + if (retract_zlift > 0.01 && !current_hop) { // Apply hop only once + current_hop += retract_zlift; // Add to the hop total (again, only once) + destination[Z_AXIS] += retract_zlift; // Raise Z by the zlift (M207 Z) amount + feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS]; // Maximum Z feedrate + prepare_move_to_destination(); // Raise up, set_current_to_destination } } else { // If a hop was done and Z hasn't changed, undo the Z hop if (current_hop) { - current_hop = 0; - // Lower Z, set_current_to_destination. Maximum Z feedrate - prepare_internal_move_to_destination(fr_max_z); + current_position[Z_AXIS] += current_hop; // Restore the actual Z position + SYNC_PLAN_POSITION_KINEMATIC(); // Unspoof the position planner + feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS]; // Z feedrate to max + prepare_move_to_destination(); // Lower Z, set_current_to_destination + current_hop = 0.0; // Clear the hop amount } - const float extra_recover = swapping ? settings.swap_retract_recover_extra : settings.retract_recover_extra; - if (extra_recover) { - current_position.e -= extra_recover; // Adjust the current E position by the extra amount to recover - sync_plan_position_e(); // Sync the planner position so the extra amount is recovered - } - - current_retract[active_extruder] = 0; - - // Recover E, set_current_to_destination - prepare_internal_move_to_destination( - (swapping ? settings.swap_retract_recover_feedrate_mm_s : settings.retract_recover_feedrate_mm_s) - * TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS)) - ); + destination[E_AXIS] += (base_retract + (swapping ? swap_retract_recover_length : retract_recover_length)) * renormalize; + feedrate_mm_s = swapping ? swap_retract_recover_feedrate_mm_s : retract_recover_feedrate_mm_s; + prepare_move_to_destination(); // Recover E, set_current_to_destination } - TERN_(RETRACT_SYNC_MIXING, mixer.T(old_mixing_tool)); // Restore original mixing tool + feedrate_mm_s = old_feedrate_mm_s; // Restore original feedrate + current_position[Z_AXIS] = old_z; // Restore Z and E positions + current_position[E_AXIS] = old_e; + SYNC_PLAN_POSITION_KINEMATIC(); // As if the move never took place retracted[active_extruder] = retracting; // Active extruder now retracted / recovered // If swap retract/recover update the retracted_swap flag too - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 if (swapping) retracted_swap[active_extruder] = retracting; #endif @@ -186,16 +182,19 @@ void FWRetract::retract(const bool retracting SERIAL_ECHOLNPAIR("retracting ", retracting); SERIAL_ECHOLNPAIR("swapping ", swapping); SERIAL_ECHOLNPAIR("active_extruder ", active_extruder); - LOOP_L_N(i, EXTRUDERS) { - SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); - #if HAS_MULTI_EXTRUDER - SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); + for (uint8_t i = 0; i < EXTRUDERS; ++i) { + SERIAL_ECHOPAIR("retracted[", i); + SERIAL_ECHOLNPAIR("] ", retracted[i]); + #if EXTRUDERS > 1 + SERIAL_ECHOPAIR("retracted_swap[", i); + SERIAL_ECHOLNPAIR("] ", retracted_swap[i]); #endif } - SERIAL_ECHOLNPAIR("current_position.z ", current_position.z); - SERIAL_ECHOLNPAIR("current_position.e ", current_position.e); + SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); + SERIAL_ECHOLNPAIR("current_position[e] ", current_position[E_AXIS]); SERIAL_ECHOLNPAIR("current_hop ", current_hop); //*/ + } #endif // FWRETRACT diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h index 134851965d..c99109130e 100644 --- a/Marlin/src/feature/fwretract.h +++ b/Marlin/src/feature/fwretract.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,66 +16,53 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * fwretract.h - Define firmware-based retraction interface */ -#include "../inc/MarlinConfigPre.h" +#ifndef FWRETRACT_H +#define FWRETRACT_H -typedef struct { - float retract_length; // M207 S - G10 Retract length - feedRate_t retract_feedrate_mm_s; // M207 F - G10 Retract feedrate - float retract_zraise, // M207 Z - G10 Retract hop size - retract_recover_extra; // M208 S - G11 Recover length - feedRate_t retract_recover_feedrate_mm_s; // M208 F - G11 Recover feedrate - float swap_retract_length, // M207 W - G10 Swap Retract length - swap_retract_recover_extra; // M208 W - G11 Swap Recover length - feedRate_t swap_retract_recover_feedrate_mm_s; // M208 R - G11 Swap Recover feedrate -} fwretract_settings_t; - -#if ENABLED(FWRETRACT) +#include "../inc/MarlinConfig.h" class FWRetract { private: - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 static bool retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted #endif public: - static fwretract_settings_t settings; - - #if ENABLED(FWRETRACT_AUTORETRACT) - static bool autoretract_enabled; // M209 S - Autoretract switch - #else - static constexpr bool autoretract_enabled = false; - #endif - - static bool retracted[EXTRUDERS]; // Which extruders are currently retracted - static float current_retract[EXTRUDERS], // Retract value used by planner - current_hop; // Hop value used by planner + static bool autoretract_enabled, // M209 S - Autoretract switch + retracted[EXTRUDERS]; // Which extruders are currently retracted + static float retract_length, // M207 S - G10 Retract length + retract_feedrate_mm_s, // M207 F - G10 Retract feedrate + retract_zlift, // M207 Z - G10 Retract hop size + retract_recover_length, // M208 S - G11 Recover length + retract_recover_feedrate_mm_s, // M208 F - G11 Recover feedrate + swap_retract_length, // M207 W - G10 Swap Retract length + swap_retract_recover_length, // M208 W - G11 Swap Recover length + swap_retract_recover_feedrate_mm_s, // M208 R - G11 Swap Recover feedrate + current_hop; FWRetract() { reset(); } static void reset(); static void refresh_autoretract() { - LOOP_L_N(i, EXTRUDERS) retracted[i] = false; + for (uint8_t i = 0; i < EXTRUDERS; i++) retracted[i] = false; } static void enable_autoretract(const bool enable) { - #if ENABLED(FWRETRACT_AUTORETRACT) - autoretract_enabled = enable; - refresh_autoretract(); - #endif + autoretract_enabled = enable; + refresh_autoretract(); } static void retract(const bool retracting - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 , bool swapping = false #endif ); @@ -83,4 +70,4 @@ public: extern FWRetract fwretract; -#endif // FWRETRACT +#endif // FWRETRACT_H diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp deleted file mode 100644 index 3012639220..0000000000 --- a/Marlin/src/feature/host_actions.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfig.h" - -#if ENABLED(HOST_ACTION_COMMANDS) - -#include "host_actions.h" - -//#define DEBUG_HOST_ACTIONS - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - #include "pause.h" - #include "../gcode/queue.h" -#endif - -#if HAS_FILAMENT_SENSOR - #include "runout.h" -#endif - -void host_action(PGM_P const pstr, const bool eol) { - PORT_REDIRECT(SERIAL_BOTH); - SERIAL_ECHOPGM("//action:"); - serialprintPGM(pstr); - if (eol) SERIAL_EOL(); -} - -#ifdef ACTION_ON_KILL - void host_action_kill() { host_action(PSTR(ACTION_ON_KILL)); } -#endif -#ifdef ACTION_ON_PAUSE - void host_action_pause(const bool eol/*=true*/) { host_action(PSTR(ACTION_ON_PAUSE), eol); } -#endif -#ifdef ACTION_ON_PAUSED - void host_action_paused(const bool eol/*=true*/) { host_action(PSTR(ACTION_ON_PAUSED), eol); } -#endif -#ifdef ACTION_ON_RESUME - void host_action_resume() { host_action(PSTR(ACTION_ON_RESUME)); } -#endif -#ifdef ACTION_ON_RESUMED - void host_action_resumed() { host_action(PSTR(ACTION_ON_RESUMED)); } -#endif -#ifdef ACTION_ON_CANCEL - void host_action_cancel() { host_action(PSTR(ACTION_ON_CANCEL)); } -#endif -#ifdef ACTION_ON_START - void host_action_start() { host_action(PSTR(ACTION_ON_START)); } -#endif - -#if ENABLED(HOST_PROMPT_SUPPORT) - - PGMSTR(CONTINUE_STR, "Continue"); - PGMSTR(DISMISS_STR, "Dismiss"); - - #if HAS_RESUME_CONTINUE - extern bool wait_for_user; - #endif - - PromptReason host_prompt_reason = PROMPT_NOT_DEFINED; - - void host_action_notify(const char * const message) { - PORT_REDIRECT(SERIAL_BOTH); - host_action(PSTR("notification "), false); - SERIAL_ECHOLN(message); - } - - void host_action_notify_P(PGM_P const message) { - PORT_REDIRECT(SERIAL_BOTH); - host_action(PSTR("notification "), false); - serialprintPGM(message); - SERIAL_EOL(); - } - - void host_action_prompt(PGM_P const ptype, const bool eol=true) { - PORT_REDIRECT(SERIAL_BOTH); - host_action(PSTR("prompt_"), false); - serialprintPGM(ptype); - if (eol) SERIAL_EOL(); - } - - void host_action_prompt_plus(PGM_P const ptype, PGM_P const pstr, const char extra_char='\0') { - host_action_prompt(ptype, false); - PORT_REDIRECT(SERIAL_BOTH); - SERIAL_CHAR(' '); - serialprintPGM(pstr); - if (extra_char != '\0') SERIAL_CHAR(extra_char); - SERIAL_EOL(); - } - void host_action_prompt_begin(const PromptReason reason, PGM_P const pstr, const char extra_char/*='\0'*/) { - host_action_prompt_end(); - host_prompt_reason = reason; - host_action_prompt_plus(PSTR("begin"), pstr, extra_char); - } - void host_action_prompt_button(PGM_P const pstr) { host_action_prompt_plus(PSTR("button"), pstr); } - void host_action_prompt_end() { host_action_prompt(PSTR("end")); } - void host_action_prompt_show() { host_action_prompt(PSTR("show")); } - void host_prompt_do(const PromptReason reason, PGM_P const pstr, PGM_P const btn1/*=nullptr*/, PGM_P const btn2/*=nullptr*/) { - host_action_prompt_begin(reason, pstr); - if (btn1) host_action_prompt_button(btn1); - if (btn2) host_action_prompt_button(btn2); - host_action_prompt_show(); - } - - void filament_load_host_prompt() { - const bool disable_to_continue = TERN0(HAS_FILAMENT_SENSOR, runout.filament_ran_out); - host_prompt_do(PROMPT_FILAMENT_RUNOUT, PSTR("Paused"), PSTR("PurgeMore"), - disable_to_continue ? PSTR("DisableRunout") : CONTINUE_STR - ); - } - - // - // Handle responses from the host, such as: - // - Filament runout responses: Purge More, Continue - // - General "Continue" response - // - Resume Print response - // - Dismissal of info - // - void host_response_handler(const uint8_t response) { - #ifdef DEBUG_HOST_ACTIONS - static PGMSTR(m876_prefix, "M876 Handle Re"); - serialprintPGM(m876_prefix); SERIAL_ECHOLNPAIR("ason: ", host_prompt_reason); - serialprintPGM(m876_prefix); SERIAL_ECHOLNPAIR("sponse: ", response); - #endif - PGM_P msg = PSTR("UNKNOWN STATE"); - const PromptReason hpr = host_prompt_reason; - host_prompt_reason = PROMPT_NOT_DEFINED; // Reset now ahead of logic - switch (hpr) { - case PROMPT_FILAMENT_RUNOUT: - msg = PSTR("FILAMENT_RUNOUT"); - switch (response) { - - case 0: // "Purge More" button - #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) - pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more) - #endif - filament_load_host_prompt(); // Initiate another host prompt. (NOTE: The loop in load_filament may also do this!) - break; - - case 1: // "Continue" / "Disable Runout" button - #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) - pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; // Simulate menu selection - #endif - #if HAS_FILAMENT_SENSOR - if (runout.filament_ran_out) { // Disable a triggered sensor - runout.enabled = false; - runout.reset(); - } - #endif - break; - } - break; - case PROMPT_USER_CONTINUE: - TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); - msg = PSTR("FILAMENT_RUNOUT_CONTINUE"); - break; - case PROMPT_PAUSE_RESUME: - msg = PSTR("LCD_PAUSE_RESUME"); - #if ENABLED(ADVANCED_PAUSE_FEATURE) - extern const char M24_STR[]; - queue.inject_P(M24_STR); - #endif - break; - case PROMPT_INFO: - msg = PSTR("GCODE_INFO"); - break; - default: break; - } - SERIAL_ECHOPGM("M876 Responding PROMPT_"); - serialprintPGM(msg); - SERIAL_EOL(); - } - -#endif // HOST_PROMPT_SUPPORT - -#endif // HOST_ACTION_COMMANDS diff --git a/Marlin/src/feature/host_actions.h b/Marlin/src/feature/host_actions.h deleted file mode 100644 index 09eeed23e2..0000000000 --- a/Marlin/src/feature/host_actions.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfigPre.h" -#include "../HAL/shared/Marduino.h" - -void host_action(PGM_P const pstr, const bool eol=true); - -#ifdef ACTION_ON_KILL - void host_action_kill(); -#endif -#ifdef ACTION_ON_PAUSE - void host_action_pause(const bool eol=true); -#endif -#ifdef ACTION_ON_PAUSED - void host_action_paused(const bool eol=true); -#endif -#ifdef ACTION_ON_RESUME - void host_action_resume(); -#endif -#ifdef ACTION_ON_RESUMED - void host_action_resumed(); -#endif -#ifdef ACTION_ON_CANCEL - void host_action_cancel(); -#endif -#ifdef ACTION_ON_START - void host_action_start(); -#endif - -#if ENABLED(HOST_PROMPT_SUPPORT) - - extern const char CONTINUE_STR[], DISMISS_STR[]; - - enum PromptReason : uint8_t { - PROMPT_NOT_DEFINED, - PROMPT_FILAMENT_RUNOUT, - PROMPT_USER_CONTINUE, - PROMPT_FILAMENT_RUNOUT_REHEAT, - PROMPT_PAUSE_RESUME, - PROMPT_INFO - }; - - extern PromptReason host_prompt_reason; - - void host_response_handler(const uint8_t response); - void host_action_notify(const char * const message); - void host_action_notify_P(PGM_P const message); - void host_action_prompt_begin(const PromptReason reason, PGM_P const pstr, const char extra_char='\0'); - void host_action_prompt_button(PGM_P const pstr); - void host_action_prompt_end(); - void host_action_prompt_show(); - void host_prompt_do(const PromptReason reason, PGM_P const pstr, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr); - inline void host_prompt_open(const PromptReason reason, PGM_P const pstr, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr) { - if (host_prompt_reason == PROMPT_NOT_DEFINED) host_prompt_do(reason, pstr, btn1, btn2); - } - - void filament_load_host_prompt(); - -#endif diff --git a/Marlin/src/feature/hotend_idle.cpp b/Marlin/src/feature/hotend_idle.cpp deleted file mode 100644 index 9d5594c2f1..0000000000 --- a/Marlin/src/feature/hotend_idle.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Hotend Idle Timeout - * Prevent filament in the nozzle from charring and causing a critical jam. - */ - -#include "../inc/MarlinConfig.h" - -#if ENABLED(HOTEND_IDLE_TIMEOUT) - -#include "hotend_idle.h" -#include "../gcode/gcode.h" - -#include "../module/temperature.h" -#include "../module/motion.h" -#include "../lcd/ultralcd.h" - -extern HotendIdleProtection hotend_idle; - -millis_t HotendIdleProtection::next_protect_ms = 0; - -void HotendIdleProtection::check_hotends(const millis_t &ms) { - bool do_prot = false; - HOTEND_LOOP() { - if (thermalManager.degHotend(e) >= HOTEND_IDLE_MIN_TRIGGER) { - do_prot = true; break; - } - } - if (bool(next_protect_ms) != do_prot) - next_protect_ms = do_prot ? ms + hp_interval : 0; -} - -void HotendIdleProtection::check_e_motion(const millis_t &ms) { - static float old_e_position = 0; - if (old_e_position != current_position.e) { - old_e_position = current_position.e; // Track filament motion - if (next_protect_ms) // If some heater is on then... - next_protect_ms = ms + hp_interval; // ...delay the timeout till later - } -} - -void HotendIdleProtection::check() { - const millis_t ms = millis(); // Shared millis - - check_hotends(ms); // Any hotends need protection? - check_e_motion(ms); // Motion will protect them - - // Hot and not moving for too long... - if (next_protect_ms && ELAPSED(ms, next_protect_ms)) - timed_out(); -} - -// Lower (but don't raise) hotend / bed temperatures -void HotendIdleProtection::timed_out() { - next_protect_ms = 0; - SERIAL_ECHOLNPGM("Hotend Idle Timeout"); - LCD_MESSAGEPGM(MSG_HOTEND_IDLE_TIMEOUT); - HOTEND_LOOP() { - if ((HOTEND_IDLE_NOZZLE_TARGET) < thermalManager.degTargetHotend(e)) - thermalManager.setTargetHotend(HOTEND_IDLE_NOZZLE_TARGET, e); - } - #if HAS_HEATED_BED - if ((HOTEND_IDLE_BED_TARGET) < thermalManager.degTargetBed()) - thermalManager.setTargetBed(HOTEND_IDLE_BED_TARGET); - #endif -} - -#endif // HOTEND_IDLE_TIMEOUT diff --git a/Marlin/src/feature/hotend_idle.h b/Marlin/src/feature/hotend_idle.h deleted file mode 100644 index 40f557d5ed..0000000000 --- a/Marlin/src/feature/hotend_idle.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../core/millis_t.h" - -class HotendIdleProtection { -public: - static void check(); -private: - static constexpr millis_t hp_interval = SEC_TO_MS(HOTEND_IDLE_TIMEOUT_SEC); - static millis_t next_protect_ms; - static void check_hotends(const millis_t &ms); - static void check_e_motion(const millis_t &ms); - static void timed_out(); -}; - -extern HotendIdleProtection hotend_idle; diff --git a/Marlin/src/feature/joystick.cpp b/Marlin/src/feature/joystick.cpp deleted file mode 100644 index d9c5ae7c1b..0000000000 --- a/Marlin/src/feature/joystick.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * joystick.cpp - joystick input / jogging - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(JOYSTICK) - -#include "joystick.h" - -#include "../inc/MarlinConfig.h" // for pins -#include "../module/planner.h" -#include "../module/temperature.h" - -Joystick joystick; - -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif - -#if HAS_JOY_ADC_X - temp_info_t Joystick::x; // = { 0 } - #if ENABLED(INVERT_JOY_X) - #define JOY_X(N) (16383 - (N)) - #else - #define JOY_X(N) (N) - #endif -#endif -#if HAS_JOY_ADC_Y - temp_info_t Joystick::y; // = { 0 } - #if ENABLED(INVERT_JOY_Y) - #define JOY_Y(N) (16383 - (N)) - #else - #define JOY_Y(N) (N) - #endif -#endif -#if HAS_JOY_ADC_Z - temp_info_t Joystick::z; // = { 0 } - #if ENABLED(INVERT_JOY_Z) - #define JOY_Z(N) (16383 - (N)) - #else - #define JOY_Z(N) (N) - #endif -#endif - -#if ENABLED(JOYSTICK_DEBUG) - void Joystick::report() { - SERIAL_ECHOPGM("Joystick"); - #if HAS_JOY_ADC_X - SERIAL_ECHOPAIR_P(SP_X_STR, JOY_X(x.raw)); - #endif - #if HAS_JOY_ADC_Y - SERIAL_ECHOPAIR_P(SP_Y_STR, JOY_Y(y.raw)); - #endif - #if HAS_JOY_ADC_Z - SERIAL_ECHOPAIR_P(SP_Z_STR, JOY_Z(z.raw)); - #endif - #if HAS_JOY_ADC_EN - SERIAL_ECHO_TERNARY(READ(JOY_EN_PIN), " EN=", "HIGH (dis", "LOW (en", "abled)"); - #endif - SERIAL_EOL(); - } -#endif - -#if HAS_JOY_ADC_X || HAS_JOY_ADC_Y || HAS_JOY_ADC_Z - - void Joystick::calculate(xyz_float_t &norm_jog) { - // Do nothing if enable pin (active-low) is not LOW - #if HAS_JOY_ADC_EN - if (READ(JOY_EN_PIN)) return; - #endif - - auto _normalize_joy = [](float &axis_jog, const int16_t raw, const int16_t (&joy_limits)[4]) { - if (WITHIN(raw, joy_limits[0], joy_limits[3])) { - // within limits, check deadzone - if (raw > joy_limits[2]) - axis_jog = (raw - joy_limits[2]) / float(joy_limits[3] - joy_limits[2]); - else if (raw < joy_limits[1]) - axis_jog = (raw - joy_limits[1]) / float(joy_limits[1] - joy_limits[0]); // negative value - // Map normal to jog value via quadratic relationship - axis_jog = SIGN(axis_jog) * sq(axis_jog); - } - }; - - #if HAS_JOY_ADC_X - static constexpr int16_t joy_x_limits[4] = JOY_X_LIMITS; - _normalize_joy(norm_jog.x, JOY_X(x.raw), joy_x_limits); - #endif - #if HAS_JOY_ADC_Y - static constexpr int16_t joy_y_limits[4] = JOY_Y_LIMITS; - _normalize_joy(norm_jog.y, JOY_Y(y.raw), joy_y_limits); - #endif - #if HAS_JOY_ADC_Z - static constexpr int16_t joy_z_limits[4] = JOY_Z_LIMITS; - _normalize_joy(norm_jog.z, JOY_Z(z.raw), joy_z_limits); - #endif - } - -#endif - -#if ENABLED(POLL_JOG) - - void Joystick::inject_jog_moves() { - // Recursion barrier - static bool injecting_now; // = false; - if (injecting_now) return; - - static constexpr int QUEUE_DEPTH = 5; // Insert up to this many movements - static constexpr float target_lag = 0.25f, // Aim for 1/4 second lag - seg_time = target_lag / QUEUE_DEPTH; // 0.05 seconds, short segments inserted every 1/20th of a second - static constexpr millis_t timer_limit_ms = millis_t(seg_time * 500); // 25 ms minimum delay between insertions - - // The planner can merge/collapse small moves, so the movement queue is unreliable to control the lag - static millis_t next_run = 0; - if (PENDING(millis(), next_run)) return; - next_run = millis() + timer_limit_ms; - - // Only inject a command if the planner has fewer than 5 moves and there are no unparsed commands - if (planner.movesplanned() >= QUEUE_DEPTH || queue.has_commands_queued()) - return; - - // Normalized jog values are 0 for no movement and -1 or +1 for as max feedrate (nonlinear relationship) - // Jog are initialized to zero and handling input can update values but doesn't have to - // You could use a two-axis joystick and a one-axis keypad and they might work together - xyz_float_t norm_jog{0}; - - // Use ADC values and defined limits. The active zone is normalized: -1..0 (dead) 0..1 - #if HAS_JOY_ADC_X || HAS_JOY_ADC_Y || HAS_JOY_ADC_Z - joystick.calculate(norm_jog); - #endif - - // Other non-joystick poll-based jogging could be implemented here - // with "jogging" encapsulated as a more general class. - - TERN_(EXTENSIBLE_UI, ExtUI::_joystick_update(norm_jog)); - - // norm_jog values of [-1 .. 1] maps linearly to [-feedrate .. feedrate] - xyz_float_t move_dist{0}; - float hypot2 = 0; - LOOP_XYZ(i) if (norm_jog[i]) { - move_dist[i] = seg_time * norm_jog[i] * - #if ENABLED(EXTENSIBLE_UI) - manual_feedrate_mm_s[i]; - #else - planner.settings.max_feedrate_mm_s[i]; - #endif - hypot2 += sq(move_dist[i]); - } - - if (!UNEAR_ZERO(hypot2)) { - current_position += move_dist; - apply_motion_limits(current_position); - const float length = sqrt(hypot2); - injecting_now = true; - planner.buffer_line(current_position, length / seg_time, active_extruder, length); - injecting_now = false; - } - } - -#endif // POLL_JOG - -#endif // JOYSTICK diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h deleted file mode 100644 index 1d25a30cc2..0000000000 --- a/Marlin/src/feature/joystick.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * joystick.h - joystick input / jogging - */ - -#include "../inc/MarlinConfigPre.h" -#include "../core/types.h" -#include "../core/macros.h" -#include "../module/temperature.h" - -class Joystick { - friend class Temperature; - private: - TERN_(HAS_JOY_ADC_X, static temp_info_t x); - TERN_(HAS_JOY_ADC_Y, static temp_info_t y); - TERN_(HAS_JOY_ADC_Z, static temp_info_t z); - public: - TERN_(JOYSTICK_DEBUG, static void report()); - static void calculate(xyz_float_t &norm_jog); - static void inject_jog_moves(); -}; - -extern Joystick joystick; diff --git a/Marlin/src/feature/leds/blinkm.cpp b/Marlin/src/feature/leds/blinkm.cpp index 868eb4b3d9..ff5bb71a95 100644 --- a/Marlin/src/feature/leds/blinkm.cpp +++ b/Marlin/src/feature/leds/blinkm.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -34,7 +34,7 @@ void blinkm_set_led_color(const LEDColor &color) { Wire.begin(); - Wire.beginTransmission(I2C_ADDRESS(0x09)); + Wire.beginTransmission(0x09); Wire.write('o'); //to disable ongoing script, only needs to be used once Wire.write('n'); Wire.write(color.r); diff --git a/Marlin/src/feature/leds/blinkm.h b/Marlin/src/feature/leds/blinkm.h index 29a9e78412..20e84d9a95 100644 --- a/Marlin/src/feature/leds/blinkm.h +++ b/Marlin/src/feature/leds/blinkm.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,16 +16,20 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * blinkm.h - Control a BlinkM over i2c */ +#ifndef _BLINKM_H_ +#define _BLINKM_H_ + struct LEDColor; typedef LEDColor LEDColor; void blinkm_set_led_color(const LEDColor &color); + +#endif // _BLINKM_H_ diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index ef9099fb20..d3175a0314 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -38,18 +38,17 @@ #include "pca9632.h" #endif -#if ENABLED(PCA9533) - #include "pca9533.h" -#endif - #if ENABLED(LED_COLOR_PRESETS) const LEDColor LEDLights::defaultLEDColor = MakeLEDColor( - LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, - LED_USER_PRESET_WHITE, LED_USER_PRESET_BRIGHTNESS + LED_USER_PRESET_RED, + LED_USER_PRESET_GREEN, + LED_USER_PRESET_BLUE, + LED_USER_PRESET_WHITE, + LED_USER_PRESET_BRIGHTNESS ); #endif -#if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS) +#if ENABLED(LED_CONTROL_MENU) LEDColor LEDLights::color; bool LEDLights::lights_on; #endif @@ -57,17 +56,12 @@ LEDLights leds; void LEDLights::setup() { - #if EITHER(RGB_LED, RGBW_LED) - if (PWM_PIN(RGB_LED_R_PIN)) SET_PWM(RGB_LED_R_PIN); else SET_OUTPUT(RGB_LED_R_PIN); - if (PWM_PIN(RGB_LED_G_PIN)) SET_PWM(RGB_LED_G_PIN); else SET_OUTPUT(RGB_LED_G_PIN); - if (PWM_PIN(RGB_LED_B_PIN)) SET_PWM(RGB_LED_B_PIN); else SET_OUTPUT(RGB_LED_B_PIN); - #if ENABLED(RGBW_LED) - if (PWM_PIN(RGB_LED_W_PIN)) SET_PWM(RGB_LED_W_PIN); else SET_OUTPUT(RGB_LED_W_PIN); - #endif + #if ENABLED(NEOPIXEL_LED) + setup_neopixel(); + #endif + #if ENABLED(LED_USER_PRESET_STARTUP) + set_default(); #endif - TERN_(NEOPIXEL_LED, neo.init()); - TERN_(PCA9533, PCA9533_init()); - TERN_(LED_USER_PRESET_STARTUP, set_default()); } void LEDLights::set_color(const LEDColor &incol @@ -78,29 +72,19 @@ void LEDLights::set_color(const LEDColor &incol #if ENABLED(NEOPIXEL_LED) - const uint32_t neocolor = LEDColorWhite() == incol - ? neo.Color(NEO_WHITE) - : neo.Color(incol.r, incol.g, incol.b, incol.w); + const uint32_t neocolor = pixels.Color(incol.r, incol.g, incol.b, incol.w); static uint16_t nextLed = 0; - #ifdef NEOPIXEL_BKGD_LED_INDEX - if (NEOPIXEL_BKGD_LED_INDEX == nextLed) { - if (++nextLed >= neo.pixels()) nextLed = 0; - return; - } - #endif - - neo.set_brightness(incol.i); - - if (isSequence) { - neo.set_pixel_color(nextLed, neocolor); - neo.show(); - if (++nextLed >= neo.pixels()) nextLed = 0; + pixels.setBrightness(incol.i); + if (!isSequence) + set_neopixel_color(neocolor); + else { + pixels.setPixelColor(nextLed, neocolor); + pixels.show(); + if (++nextLed >= pixels.numPixels()) nextLed = 0; return; } - neo.set_color(neocolor); - #endif #if ENABLED(BLINKM) @@ -110,91 +94,47 @@ void LEDLights::set_color(const LEDColor &incol #endif - #if EITHER(RGB_LED, RGBW_LED) + #if ENABLED(RGB_LED) || ENABLED(RGBW_LED) // This variant uses 3-4 separate pins for the RGB(W) components. // If the pins can do PWM then their intensity will be set. - #define UPDATE_RGBW(C,c) do { \ - if (PWM_PIN(RGB_LED_##C##_PIN)) \ - analogWrite(pin_t(RGB_LED_##C##_PIN), incol.c); \ - else \ - WRITE(RGB_LED_##C##_PIN, incol.c ? HIGH : LOW); \ - }while(0) - UPDATE_RGBW(R,r); UPDATE_RGBW(G,g); UPDATE_RGBW(B,b); + WRITE(RGB_LED_R_PIN, incol.r ? HIGH : LOW); + WRITE(RGB_LED_G_PIN, incol.g ? HIGH : LOW); + WRITE(RGB_LED_B_PIN, incol.b ? HIGH : LOW); + analogWrite(RGB_LED_R_PIN, incol.r); + analogWrite(RGB_LED_G_PIN, incol.g); + analogWrite(RGB_LED_B_PIN, incol.b); + #if ENABLED(RGBW_LED) - UPDATE_RGBW(W,w); + WRITE(RGB_LED_W_PIN, incol.w ? HIGH : LOW); + analogWrite(RGB_LED_W_PIN, incol.w); #endif #endif - // Update I2C LED driver - TERN_(PCA9632, PCA9632_set_led_color(incol)); - TERN_(PCA9533, PCA9533_set_rgb(incol.r, incol.g, incol.b)); + #if ENABLED(PCA9632) + // Update I2C LED driver + pca9632_set_led_color(incol); + #endif - #if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS) + #if ENABLED(LED_CONTROL_MENU) // Don't update the color when OFF lights_on = !incol.is_off(); if (lights_on) color = incol; #endif } +void LEDLights::set_white() { + #if ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(BLINKM) || ENABLED(PCA9632) + set_color(LEDColorWhite()); + #endif + #if ENABLED(NEOPIXEL_LED) + set_neopixel_color(pixels.Color(NEO_WHITE)); + #endif +} + #if ENABLED(LED_CONTROL_MENU) void LEDLights::toggle() { if (lights_on) set_off(); else update(); } #endif -#ifdef LED_BACKLIGHT_TIMEOUT - - millis_t LEDLights::led_off_time; // = 0 - - void LEDLights::update_timeout(const bool power_on) { - const millis_t ms = millis(); - if (power_on) - reset_timeout(ms); - else if (ELAPSED(ms, led_off_time)) - set_off(); - } - -#endif - -#if ENABLED(NEOPIXEL2_SEPARATE) - - #if ENABLED(NEO2_COLOR_PRESETS) - const LEDColor LEDLights2::defaultLEDColor = MakeLEDColor( - NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE, - NEO2_USER_PRESET_WHITE, NEO2_USER_PRESET_BRIGHTNESS - ); - #endif - - #if ENABLED(LED_CONTROL_MENU) - LEDColor LEDLights2::color; - bool LEDLights2::lights_on; - #endif - - LEDLights2 leds2; - - void LEDLights2::setup() { - neo2.init(); - TERN_(NEO2_USER_PRESET_STARTUP, set_default()); - } - - void LEDLights2::set_color(const LEDColor &incol) { - const uint32_t neocolor = LEDColorWhite() == incol - ? neo2.Color(NEO2_WHITE) - : neo2.Color(incol.r, incol.g, incol.b, incol.w); - neo2.set_brightness(incol.i); - neo2.set_color(neocolor); - - #if ENABLED(LED_CONTROL_MENU) - // Don't update the color when OFF - lights_on = !incol.is_off(); - if (lights_on) color = incol; - #endif - } - - #if ENABLED(LED_CONTROL_MENU) - void LEDLights2::toggle() { if (lights_on) set_off(); else update(); } - #endif - -#endif // NEOPIXEL2_SEPARATE - -#endif // HAS_COLOR_LEDS +#endif // HAS_COLOR_LEDS diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index 055ea0df37..fe00cd3c48 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,27 +16,24 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * leds.h - Marlin general RGB LED support */ -#include "../../inc/MarlinConfigPre.h" +#ifndef __LEDS_H__ +#define __LEDS_H__ -#include +#include "../../inc/MarlinConfig.h" #if ENABLED(NEOPIXEL_LED) #include "neopixel.h" #endif -// A white component can be passed -#if EITHER(RGBW_LED, NEOPIXEL_LED) - #define HAS_WHITE_LED 1 -#endif +#define HAS_WHITE_LED (ENABLED(RGBW_LED) || ENABLED(NEOPIXEL_LED)) /** * LEDcolor type for use with leds.set_color @@ -50,7 +47,6 @@ typedef struct LEDColor { #endif #endif ; - LEDColor() : r(255), g(255), b(255) #if HAS_WHITE_LED , w(255) @@ -59,7 +55,6 @@ typedef struct LEDColor { #endif #endif {} - LEDColor(uint8_t r, uint8_t g, uint8_t b #if HAS_WHITE_LED , uint8_t w=0 @@ -75,7 +70,6 @@ typedef struct LEDColor { #endif #endif {} - LEDColor(const uint8_t (&rgbw)[4]) : r(rgbw[0]), g(rgbw[1]), b(rgbw[2]) #if HAS_WHITE_LED , w(rgbw[3]) @@ -84,27 +78,28 @@ typedef struct LEDColor { #endif #endif {} - LEDColor& operator=(const uint8_t (&rgbw)[4]) { r = rgbw[0]; g = rgbw[1]; b = rgbw[2]; - TERN_(HAS_WHITE_LED, w = rgbw[3]); + #if HAS_WHITE_LED + w = rgbw[3]; + #endif return *this; } - LEDColor& operator=(const LEDColor &right) { if (this != &right) memcpy(this, &right, sizeof(LEDColor)); return *this; } - bool operator==(const LEDColor &right) { if (this == &right) return true; return 0 == memcmp(this, &right, sizeof(LEDColor)); } - bool operator!=(const LEDColor &right) { return !operator==(right); } - bool is_off() const { - return 3 > r + g + b + TERN0(HAS_WHITE_LED, w); + return 3 > r + g + b + #if HAS_WHITE_LED + + w + #endif + ; } } LEDColor; @@ -112,33 +107,24 @@ typedef struct LEDColor { * Color helpers and presets */ #if HAS_WHITE_LED + #define LEDColorWhite() LEDColor(0, 0, 0, 255) #if ENABLED(NEOPIXEL_LED) #define MakeLEDColor(R,G,B,W,I) LEDColor(R, G, B, W, I) #else #define MakeLEDColor(R,G,B,W,I) LEDColor(R, G, B, W) #endif #else - #define MakeLEDColor(R,G,B,W,I) LEDColor(R, G, B) -#endif - -#define LEDColorOff() LEDColor( 0, 0, 0) -#define LEDColorRed() LEDColor(255, 0, 0) -#if ENABLED(LED_COLORS_REDUCE_GREEN) - #define LEDColorOrange() LEDColor(255, 25, 0) - #define LEDColorYellow() LEDColor(255, 75, 0) -#else - #define LEDColorOrange() LEDColor(255, 80, 0) - #define LEDColorYellow() LEDColor(255, 255, 0) -#endif -#define LEDColorGreen() LEDColor( 0, 255, 0) -#define LEDColorBlue() LEDColor( 0, 0, 255) -#define LEDColorIndigo() LEDColor( 0, 255, 255) -#define LEDColorViolet() LEDColor(255, 0, 255) -#if HAS_WHITE_LED && DISABLED(RGB_LED) - #define LEDColorWhite() LEDColor( 0, 0, 0, 255) -#else - #define LEDColorWhite() LEDColor(255, 255, 255) + #define MakeLEDColor(R,G,B,W,I) LEDColor(R, G, B) + #define LEDColorWhite() LEDColor(255, 255, 255) #endif +#define LEDColorOff() LEDColor( 0, 0, 0) +#define LEDColorRed() LEDColor(255, 0, 0) +#define LEDColorOrange() LEDColor(255, 80, 0) +#define LEDColorYellow() LEDColor(255, 255, 0) +#define LEDColorGreen() LEDColor( 0, 255, 0) +#define LEDColorBlue() LEDColor( 0, 0, 255) +#define LEDColorIndigo() LEDColor( 0, 255, 255) +#define LEDColorViolet() LEDColor(255, 0, 255) class LEDLights { public: @@ -152,12 +138,14 @@ public: #endif ); - static inline void set_color(uint8_t r, uint8_t g, uint8_t b + FORCE_INLINE void set_color(uint8_t r, uint8_t g, uint8_t b #if HAS_WHITE_LED , uint8_t w=0 + #if ENABLED(NEOPIXEL_LED) + , uint8_t i=NEOPIXEL_BRIGHTNESS + #endif #endif #if ENABLED(NEOPIXEL_LED) - , uint8_t i=NEOPIXEL_BRIGHTNESS , bool isSequence=false #endif ) { @@ -168,86 +156,29 @@ public: ); } - static inline void set_off() { set_color(LEDColorOff()); } - static inline void set_green() { set_color(LEDColorGreen()); } - static inline void set_white() { set_color(LEDColorWhite()); } + static void set_white(); + FORCE_INLINE static void set_off() { set_color(LEDColorOff()); } + FORCE_INLINE static void set_green() { set_color(LEDColorGreen()); } #if ENABLED(LED_COLOR_PRESETS) static const LEDColor defaultLEDColor; - static inline void set_default() { set_color(defaultLEDColor); } - static inline void set_red() { set_color(LEDColorRed()); } - static inline void set_orange() { set_color(LEDColorOrange()); } - static inline void set_yellow() { set_color(LEDColorYellow()); } - static inline void set_blue() { set_color(LEDColorBlue()); } - static inline void set_indigo() { set_color(LEDColorIndigo()); } - static inline void set_violet() { set_color(LEDColorViolet()); } - #endif - - #if ENABLED(PRINTER_EVENT_LEDS) - static inline LEDColor get_color() { return lights_on ? color : LEDColorOff(); } - #endif - - #if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS) - static LEDColor color; // last non-off color - static bool lights_on; // the last set color was "on" + FORCE_INLINE static void set_default() { set_color(defaultLEDColor); } + FORCE_INLINE static void set_red() { set_color(LEDColorRed()); } + FORCE_INLINE static void set_orange() { set_color(LEDColorOrange()); } + FORCE_INLINE static void set_yellow() { set_color(LEDColorYellow()); } + FORCE_INLINE static void set_blue() { set_color(LEDColorBlue()); } + FORCE_INLINE static void set_indigo() { set_color(LEDColorIndigo()); } + FORCE_INLINE static void set_violet() { set_color(LEDColorViolet()); } #endif #if ENABLED(LED_CONTROL_MENU) + static LEDColor color; // last non-off color + static bool lights_on; // the last set color was "on" static void toggle(); // swap "off" with color - static inline void update() { set_color(color); } - #endif - - #ifdef LED_BACKLIGHT_TIMEOUT - private: - static millis_t led_off_time; - public: - static inline void reset_timeout(const millis_t &ms) { - led_off_time = ms + LED_BACKLIGHT_TIMEOUT; - if (!lights_on) set_default(); - } - static void update_timeout(const bool power_on); + FORCE_INLINE static void update() { set_color(color); } #endif }; extern LEDLights leds; -#if ENABLED(NEOPIXEL2_SEPARATE) - - class LEDLights2 { - public: - LEDLights2() {} - - static void setup(); // init() - - static void set_color(const LEDColor &color); - - inline void set_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w=0, uint8_t i=NEOPIXEL2_BRIGHTNESS) { - set_color(MakeLEDColor(r, g, b, w, i)); - } - - static inline void set_off() { set_color(LEDColorOff()); } - static inline void set_green() { set_color(LEDColorGreen()); } - static inline void set_white() { set_color(LEDColorWhite()); } - - #if ENABLED(NEO2_COLOR_PRESETS) - static const LEDColor defaultLEDColor; - static inline void set_default() { set_color(defaultLEDColor); } - static inline void set_red() { set_color(LEDColorRed()); } - static inline void set_orange() { set_color(LEDColorOrange()); } - static inline void set_yellow() { set_color(LEDColorYellow()); } - static inline void set_blue() { set_color(LEDColorBlue()); } - static inline void set_indigo() { set_color(LEDColorIndigo()); } - static inline void set_violet() { set_color(LEDColorViolet()); } - #endif - - #if ENABLED(NEOPIXEL2_SEPARATE) - static LEDColor color; // last non-off color - static bool lights_on; // the last set color was "on" - static void toggle(); // swap "off" with color - static inline void update() { set_color(color); } - #endif - }; - - extern LEDLights2 leds2; - -#endif // NEOPIXEL2_SEPARATE +#endif // __LEDS_H__ diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 27bbeb348c..729b4b190a 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -30,143 +30,56 @@ #include "neopixel.h" -#if EITHER(NEOPIXEL_STARTUP_TEST, NEOPIXEL2_STARTUP_TEST) +#if ENABLED(NEOPIXEL_STARTUP_TEST) #include "../../core/utility.h" #endif -Marlin_NeoPixel neo; -int8_t Marlin_NeoPixel::neoindex; +Adafruit_NeoPixel pixels(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800); -Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800) - #if CONJOINED_NEOPIXEL - , Marlin_NeoPixel::adaneo2(NEOPIXEL_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE + NEO_KHZ800) - #endif -; - -#ifdef NEOPIXEL_BKGD_LED_INDEX - - void Marlin_NeoPixel::set_color_background() { - uint8_t background_color[4] = NEOPIXEL_BKGD_COLOR; - set_pixel_color(NEOPIXEL_BKGD_LED_INDEX, adaneo1.Color(background_color[0], background_color[1], background_color[2], background_color[3])); - } - -#endif - -void Marlin_NeoPixel::set_color(const uint32_t color) { - if (neoindex >= 0) { - set_pixel_color(neoindex, color); - neoindex = -1; - } - else { - for (uint16_t i = 0; i < pixels(); ++i) { - #ifdef NEOPIXEL_BKGD_LED_INDEX - if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) { - set_color_background(); - continue; - } - #endif - set_pixel_color(i, color); - } - } - show(); +void set_neopixel_color(const uint32_t color) { + for (uint16_t i = 0; i < pixels.numPixels(); ++i) + pixels.setPixelColor(i, color); + pixels.show(); } -void Marlin_NeoPixel::set_color_startup(const uint32_t color) { - for (uint16_t i = 0; i < pixels(); ++i) - set_pixel_color(i, color); - show(); -} - -void Marlin_NeoPixel::init() { - neoindex = -1; // -1 .. NEOPIXEL_PIXELS-1 range - set_brightness(NEOPIXEL_BRIGHTNESS); // 0 .. 255 range - begin(); - show(); // initialize to all off +void setup_neopixel() { + SET_OUTPUT(NEOPIXEL_PIN); + pixels.setBrightness(NEOPIXEL_BRIGHTNESS); // 0 - 255 range + pixels.begin(); + pixels.show(); // initialize to all off #if ENABLED(NEOPIXEL_STARTUP_TEST) - set_color_startup(adaneo1.Color(255, 0, 0, 0)); // red - safe_delay(500); - set_color_startup(adaneo1.Color(0, 255, 0, 0)); // green - safe_delay(500); - set_color_startup(adaneo1.Color(0, 0, 255, 0)); // blue - safe_delay(500); - #endif - - #ifdef NEOPIXEL_BKGD_LED_INDEX - set_color_background(); + safe_delay(1000); + set_neopixel_color(pixels.Color(255, 0, 0, 0)); // red + safe_delay(1000); + set_neopixel_color(pixels.Color(0, 255, 0, 0)); // green + safe_delay(1000); + set_neopixel_color(pixels.Color(0, 0, 255, 0)); // blue + safe_delay(1000); #endif #if ENABLED(LED_USER_PRESET_STARTUP) - set_color(adaneo1.Color(LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, LED_USER_PRESET_WHITE)); + set_neopixel_color(pixels.Color(LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, LED_USER_PRESET_WHITE)); #else - set_color(adaneo1.Color(0, 0, 0, 0)); + set_neopixel_color(pixels.Color(0, 0, 0, 0)); #endif } #if 0 -bool Marlin_NeoPixel::set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p) { - const uint32_t color = adaneo1.Color(r, g, b, w); - set_brightness(p); +bool neopixel_set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p) { + const uint32_t color = pixels.Color(r, g, b, w); + pixels.setBrightness(p); #if DISABLED(NEOPIXEL_IS_SEQUENTIAL) - set_color(color); + set_neopixel_color(color); return false; #else static uint16_t nextLed = 0; - set_pixel_color(nextLed, color); - show(); - if (++nextLed >= pixels()) nextLed = 0; + pixels.setPixelColor(nextLed, color); + pixels.show(); + if (++nextLed >= pixels.numPixels()) nextLed = 0; return true; #endif } #endif -#if ENABLED(NEOPIXEL2_SEPARATE) - - Marlin_NeoPixel2 neo2; - - int8_t Marlin_NeoPixel2::neoindex; - Adafruit_NeoPixel Marlin_NeoPixel2::adaneo(NEOPIXEL2_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE); - - void Marlin_NeoPixel2::set_color(const uint32_t color) { - if (neoindex >= 0) { - set_pixel_color(neoindex, color); - neoindex = -1; - } - else { - for (uint16_t i = 0; i < pixels(); ++i) - set_pixel_color(i, color); - } - show(); - } - - void Marlin_NeoPixel2::set_color_startup(const uint32_t color) { - for (uint16_t i = 0; i < pixels(); ++i) - set_pixel_color(i, color); - show(); - } - - void Marlin_NeoPixel2::init() { - neoindex = -1; // -1 .. NEOPIXEL2_PIXELS-1 range - set_brightness(NEOPIXEL2_BRIGHTNESS); // 0 .. 255 range - begin(); - show(); // initialize to all off - - #if ENABLED(NEOPIXEL2_STARTUP_TEST) - set_color_startup(adaneo.Color(255, 0, 0, 0)); // red - safe_delay(500); - set_color_startup(adaneo.Color(0, 255, 0, 0)); // green - safe_delay(500); - set_color_startup(adaneo.Color(0, 0, 255, 0)); // blue - safe_delay(500); - #endif - - #if ENABLED(NEO2_USER_PRESET_STARTUP) - set_color(adaneo.Color(NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE, NEO2_USER_PRESET_WHITE)); - #else - set_color(adaneo.Color(0, 0, 0, 0)); - #endif - } - -#endif // NEOPIXEL2_SEPARATE - #endif // NEOPIXEL_LED diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 42046fa563..9f24b0287a 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,41 +16,24 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** - * NeoPixel support + * Neopixel support */ -// ------------------------ -// Includes -// ------------------------ +#ifndef __NEOPIXEL_H__ +#define __NEOPIXEL_H__ #include "../../inc/MarlinConfig.h" #include #include -// ------------------------ -// Defines -// ------------------------ - -#if defined(NEOPIXEL2_TYPE) && NEOPIXEL2_TYPE != NEOPIXEL_TYPE && DISABLED(NEOPIXEL2_SEPARATE) - #define MULTIPLE_NEOPIXEL_TYPES 1 -#endif - -#if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) - #define CONJOINED_NEOPIXEL 1 -#endif - -#if NEOPIXEL_TYPE == NEO_RGB || NEOPIXEL_TYPE == NEO_RBG || NEOPIXEL_TYPE == NEO_GRB || NEOPIXEL_TYPE == NEO_GBR || NEOPIXEL_TYPE == NEO_BRG || NEOPIXEL_TYPE == NEO_BGR - #define NEOPIXEL_IS_RGB 1 -#else - #define NEOPIXEL_IS_RGBW 1 -#endif +#define NEOPIXEL_IS_RGB (NEOPIXEL_TYPE == NEO_RGB || NEOPIXEL_TYPE == NEO_RBG || NEOPIXEL_TYPE == NEO_GRB || NEOPIXEL_TYPE == NEO_GBR || NEOPIXEL_TYPE == NEO_BRG || NEOPIXEL_TYPE == NEO_BGR) +#define NEOPIXEL_IS_RGBW !NEOPIXEL_IS_RGB #if NEOPIXEL_IS_RGB #define NEO_WHITE 255, 255, 255, 0 @@ -58,122 +41,10 @@ #define NEO_WHITE 0, 0, 0, 255 #endif -// ------------------------ -// Function prototypes -// ------------------------ +void setup_neopixel(); +void set_neopixel_color(const uint32_t color); +//bool neopixel_set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p); -class Marlin_NeoPixel { -private: - static Adafruit_NeoPixel adaneo1 - #if CONJOINED_NEOPIXEL - , adaneo2 - #endif - ; +extern Adafruit_NeoPixel pixels; -public: - static int8_t neoindex; - - static void init(); - static void set_color_startup(const uint32_t c); - - static void set_color(const uint32_t c); - - #ifdef NEOPIXEL_BKGD_LED_INDEX - static void set_color_background(); - #endif - - static inline void begin() { - adaneo1.begin(); - TERN_(CONJOINED_NEOPIXEL, adaneo2.begin()); - } - - static inline void set_pixel_color(const uint16_t n, const uint32_t c) { - #if ENABLED(NEOPIXEL2_INSERIES) - if (n >= NEOPIXEL_PIXELS) adaneo2.setPixelColor(n - (NEOPIXEL_PIXELS), c); - else adaneo1.setPixelColor(n, c); - #else - adaneo1.setPixelColor(n, c); - #if MULTIPLE_NEOPIXEL_TYPES - adaneo2.setPixelColor(n, c); - #endif - #endif - } - - static inline void set_brightness(const uint8_t b) { - adaneo1.setBrightness(b); - TERN_(CONJOINED_NEOPIXEL, adaneo2.setBrightness(b)); - } - - static inline void show() { - adaneo1.show(); - #if PIN_EXISTS(NEOPIXEL2) - #if CONJOINED_NEOPIXEL - adaneo2.show(); - #else - TERN(NEOPIXEL2_SEPARATE,,adaneo1.setPin(NEOPIXEL2_PIN)); - adaneo1.show(); - adaneo1.setPin(NEOPIXEL_PIN); - #endif - #endif - } - - #if 0 - bool set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p); - #endif - - // Accessors - static inline uint16_t pixels() { TERN(NEOPIXEL2_INSERIES, return adaneo1.numPixels() * 2, return adaneo1.numPixels()); } - static inline uint8_t brightness() { return adaneo1.getBrightness(); } - static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { - return adaneo1.Color(r, g, b, w); - } -}; - -extern Marlin_NeoPixel neo; - -// Neo pixel channel 2 -#if ENABLED(NEOPIXEL2_SEPARATE) - - #if NEOPIXEL2_TYPE == NEO_RGB || NEOPIXEL2_TYPE == NEO_RBG || NEOPIXEL2_TYPE == NEO_GRB || NEOPIXEL2_TYPE == NEO_GBR || NEOPIXEL2_TYPE == NEO_BRG || NEOPIXEL2_TYPE == NEO_BGR - #define NEOPIXEL2_IS_RGB 1 - #else - #define NEOPIXEL2_IS_RGBW 1 - #endif - - #if NEOPIXEL2_IS_RGB - #define NEO2_WHITE 255, 255, 255, 0 - #else - #define NEO2_WHITE 0, 0, 0, 255 - #endif - - class Marlin_NeoPixel2 { - private: - static Adafruit_NeoPixel adaneo; - - public: - static int8_t neoindex; - - static void init(); - static void set_color_startup(const uint32_t c); - - static void set_color(const uint32_t c); - - static inline void begin() { adaneo.begin(); } - static inline void set_pixel_color(const uint16_t n, const uint32_t c) { adaneo.setPixelColor(n, c); } - static inline void set_brightness(const uint8_t b) { adaneo.setBrightness(b); } - static inline void show() { - adaneo.show(); - adaneo.setPin(NEOPIXEL2_PIN); - } - - // Accessors - static inline uint16_t pixels() { return adaneo.numPixels();} - static inline uint8_t brightness() { return adaneo.getBrightness(); } - static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { - return adaneo.Color(r, g, b, w); - } - }; - - extern Marlin_NeoPixel2 neo2; - -#endif // NEOPIXEL2_SEPARATE +#endif // __NEOPIXEL_H__ diff --git a/Marlin/src/feature/leds/pca9533.cpp b/Marlin/src/feature/leds/pca9533.cpp deleted file mode 100644 index 0fd4d66757..0000000000 --- a/Marlin/src/feature/leds/pca9533.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * PCA9533 LED controller driver (MightyBoard, FlashForge Creator Pro, etc.) - * by @grauerfuchs - 1 Apr 2020 - */ -#include "../../inc/MarlinConfig.h" - -#if ENABLED(PCA9533) - -#include "pca9533.h" -#include - -void PCA9533_init() { - Wire.begin(); - PCA9533_reset(); -} - -static void PCA9533_writeAllRegisters(uint8_t psc0, uint8_t pwm0, uint8_t psc1, uint8_t pwm1, uint8_t ls0){ - uint8_t data[6] = { PCA9533_REG_PSC0 | PCA9533_REGM_AI, psc0, pwm0, psc1, pwm1, ls0 }; - Wire.beginTransmission(PCA9533_Addr >> 1); - Wire.write(data, 6); - Wire.endTransmission(); - delayMicroseconds(1); -} - -static void PCA9533_writeRegister(uint8_t reg, uint8_t val){ - uint8_t data[2] = { reg, val }; - Wire.beginTransmission(PCA9533_Addr >> 1); - Wire.write(data, 2); - Wire.endTransmission(); - delayMicroseconds(1); -} - -// Reset (clear) all registers -void PCA9533_reset() { - PCA9533_writeAllRegisters(0, 0, 0, 0, 0); -} - -// Turn all LEDs off -void PCA9533_setOff() { - PCA9533_writeRegister(PCA9533_REG_SEL, 0); -} - -void PCA9533_set_rgb(uint8_t red, uint8_t green, uint8_t blue) { - uint8_t r_pwm0 = 0; // Register data - PWM value - uint8_t r_pwm1 = 0; // Register data - PWM value - - uint8_t op_g = 0, op_r = 0, op_b = 0; // Opcodes - Green, Red, Blue - - // Light theory! GREEN takes priority because - // it's the most visible to the human eye. - if (green == 0) op_g = PCA9533_LED_OP_OFF; - else if (green == 255) op_g = PCA9533_LED_OP_ON; - else { r_pwm0 = green; op_g = PCA9533_LED_OP_PWM0; } - - // RED - if (red == 0) op_r = PCA9533_LED_OP_OFF; - else if (red == 255) op_r = PCA9533_LED_OP_ON; - else if (r_pwm0 == 0 || r_pwm0 == red) { - r_pwm0 = red; op_r = PCA9533_LED_OP_PWM0; - } - else { - r_pwm1 = red; op_r = PCA9533_LED_OP_PWM1; - } - - // BLUE - if (blue == 0) op_b = PCA9533_LED_OP_OFF; - else if (blue == 255) op_b = PCA9533_LED_OP_ON; - else if (r_pwm0 == 0 || r_pwm0 == blue) { - r_pwm0 = blue; op_b = PCA9533_LED_OP_PWM0; - } - else if (r_pwm1 == 0 || r_pwm1 == blue) { - r_pwm1 = blue; op_b = PCA9533_LED_OP_PWM1; - } - else { - /** - * Conflict. 3 values are requested but only 2 channels exist. - * G is on channel 0 and R is on channel 1, so work from there. - * Find the closest match, average the values, then use the free channel. - */ - uint8_t dgb = ABS(green - blue), - dgr = ABS(green - red), - dbr = ABS(blue - red); - if (dgb < dgr && dgb < dbr) { // Mix with G on channel 0. - op_b = PCA9533_LED_OP_PWM0; - r_pwm0 = uint8_t(((uint16_t)green + (uint16_t)blue) / 2); - } - else if (dbr <= dgr && dbr <= dgb) { // Mix with R on channel 1. - op_b = PCA9533_LED_OP_PWM1; - r_pwm1 = uint8_t(((uint16_t)red + (uint16_t)blue) / 2); - } - else { // Mix R+G on 0 and put B on 1. - op_r = PCA9533_LED_OP_PWM0; - r_pwm0 = uint8_t(((uint16_t)green + (uint16_t)red) / 2); - op_b = PCA9533_LED_OP_PWM1; - r_pwm1 = blue; - } - } - - // Write the changes to the hardware - PCA9533_writeAllRegisters(0, r_pwm0, 0, r_pwm1, - (op_g << PCA9533_LED_OFS_GRN) | (op_r << PCA9533_LED_OFS_RED) | (op_b << PCA9533_LED_OFS_BLU) - ); -} - -#endif // PCA9533 diff --git a/Marlin/src/feature/leds/pca9533.h b/Marlin/src/feature/leds/pca9533.h deleted file mode 100644 index 431058c491..0000000000 --- a/Marlin/src/feature/leds/pca9533.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/* - * Driver for the PCA9533 LED controller found on the MightyBoard - * used by FlashForge Creator Pro, MakerBot, etc. - * Written 2020 APR 01 by grauerfuchs - */ -#include - -#define ENABLE_I2C_PULLUPS - -// Chip address (for Wire) -#define PCA9533_Addr 0xC4 - -// Control registers -#define PCA9533_REG_READ 0x00 -#define PCA9533_REG_PSC0 0x01 -#define PCA9533_REG_PWM0 0x02 -#define PCA9533_REG_PSC1 0x03 -#define PCA9533_REG_PWM1 0x04 -#define PCA9533_REG_SEL 0x05 -#define PCA9533_REGM_AI 0x10 - -// LED selector operation -#define PCA9533_LED_OP_OFF 0B00 -#define PCA9533_LED_OP_ON 0B01 -#define PCA9533_LED_OP_PWM0 0B10 -#define PCA9533_LED_OP_PWM1 0B11 - -// Select register bit offsets for LED colors -#define PCA9533_LED_OFS_RED 0 -#define PCA9533_LED_OFS_GRN 2 -#define PCA9533_LED_OFS_BLU 4 - -void PCA9533_init(); -void PCA9533_reset(); -void PCA9533_set_rgb(uint8_t red, uint8_t green, uint8_t blue); -void PCA9533_setOff(); diff --git a/Marlin/src/feature/leds/pca9632.cpp b/Marlin/src/feature/leds/pca9632.cpp index d8af31cb6c..11298f4efe 100644 --- a/Marlin/src/feature/leds/pca9632.cpp +++ b/Marlin/src/feature/leds/pca9632.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -58,21 +58,12 @@ #define PCA9632_AUTOGLO 0xC0 #define PCA9632_AUTOGI 0xE0 -// Red=LED0 Green=LED1 Blue=LED2 -#ifndef PCA9632_RED - #define PCA9632_RED 0x00 -#endif -#ifndef PCA9632_GRN - #define PCA9632_GRN 0x02 -#endif -#ifndef PCA9632_BLU - #define PCA9632_BLU 0x04 -#endif - -// If any of the color indexes are greater than 0x04 they can't use auto increment -#if !defined(PCA9632_NO_AUTO_INC) && (PCA9632_RED > 0x04 || PCA9632_GRN > 0x04 || PCA9632_BLU > 0x04) - #define PCA9632_NO_AUTO_INC -#endif +// Red LED0 +// Green LED1 +// Blue LED2 +#define PCA9632_RED 0x00 +#define PCA9632_GRN 0x02 +#define PCA9632_BLU 0x04 #define LED_OFF 0x00 #define LED_ON 0x01 @@ -83,36 +74,24 @@ byte PCA_init = 0; static void PCA9632_WriteRegister(const byte addr, const byte regadd, const byte value) { - Wire.beginTransmission(I2C_ADDRESS(addr)); + Wire.beginTransmission(addr); Wire.write(regadd); Wire.write(value); Wire.endTransmission(); } -static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const byte vr, const byte vg, const byte vb) { - #if DISABLED(PCA9632_NO_AUTO_INC) - uint8_t data[4], len = 4; - data[0] = PCA9632_AUTO_IND | regadd; - data[1 + (PCA9632_RED >> 1)] = vr; - data[1 + (PCA9632_GRN >> 1)] = vg; - data[1 + (PCA9632_BLU >> 1)] = vb; - #else - uint8_t data[6], len = 6; - data[0] = regadd + (PCA9632_RED >> 1); - data[1] = vr; - data[2] = regadd + (PCA9632_GRN >> 1); - data[3] = vg; - data[4] = regadd + (PCA9632_BLU >> 1); - data[5] = vb; - #endif - Wire.beginTransmission(I2C_ADDRESS(addr)); - Wire.write(data, len); +static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const byte value1, const byte value2, const byte value3) { + Wire.beginTransmission(addr); + Wire.write(PCA9632_AUTO_IND | regadd); + Wire.write(value1); + Wire.write(value2); + Wire.write(value3); Wire.endTransmission(); } #if 0 static byte PCA9632_ReadRegister(const byte addr, const byte regadd) { - Wire.beginTransmission(I2C_ADDRESS(addr)); + Wire.beginTransmission(addr); Wire.write(regadd); const byte value = Wire.read(); Wire.endTransmission(); @@ -120,7 +99,7 @@ static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const } #endif -void PCA9632_set_led_color(const LEDColor &color) { +void pca9632_set_led_color(const LEDColor &color) { Wire.begin(); if (!PCA_init) { PCA_init = 1; @@ -136,15 +115,4 @@ void PCA9632_set_led_color(const LEDColor &color) { PCA9632_WriteRegister(PCA9632_ADDRESS,PCA9632_LEDOUT, LEDOUT); } -#if ENABLED(PCA9632_BUZZER) - - void PCA9632_buzz(const long, const uint16_t) { - uint8_t data[] = PCA9632_BUZZER_DATA; - Wire.beginTransmission(I2C_ADDRESS(PCA9632_ADDRESS)); - Wire.write(data, sizeof(data)); - Wire.endTransmission(); - } - -#endif // PCA9632_BUZZER - #endif // PCA9632 diff --git a/Marlin/src/feature/leds/pca9632.h b/Marlin/src/feature/leds/pca9632.h index fb59a8c184..4d98267beb 100644 --- a/Marlin/src/feature/leds/pca9632.h +++ b/Marlin/src/feature/leds/pca9632.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,22 +16,21 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Driver for the Philips PCA9632 LED driver. * Written by Robert Mendon Feb 2017. */ +#ifndef __PCA9632_H__ +#define __PCA9632_H__ + struct LEDColor; typedef LEDColor LEDColor; -void PCA9632_set_led_color(const LEDColor &color); +void pca9632_set_led_color(const LEDColor &color); -#if ENABLED(PCA9632_BUZZER) - #include - void PCA9632_buzz(const long, const uint16_t); -#endif +#endif // __PCA9632_H__ diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp deleted file mode 100644 index 31c628c281..0000000000 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * feature/leds/printer_event_leds.cpp - LED color changing based on printer status - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(PRINTER_EVENT_LEDS) - -#include "printer_event_leds.h" - -PrinterEventLEDs printerEventLEDs; - -#if HAS_LEDS_OFF_FLAG - bool PrinterEventLEDs::leds_off_after_print; // = false -#endif - -#if HAS_TEMP_HOTEND || HAS_HEATED_BED - - uint8_t PrinterEventLEDs::old_intensity = 0; - - inline uint8_t pel_intensity(const float &start, const float ¤t, const float &target) { - return (uint8_t)map(constrain(current, start, target), start, target, 0.f, 255.f); - } - - inline void pel_set_rgb(const uint8_t r, const uint8_t g, const uint8_t b) { - leds.set_color( - MakeLEDColor(r, g, b, 0, neo.brightness()) - #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) - , true - #endif - ); - } - -#endif - -#if HAS_TEMP_HOTEND - - void PrinterEventLEDs::onHotendHeating(const float &start, const float ¤t, const float &target) { - const uint8_t blue = pel_intensity(start, current, target); - if (blue != old_intensity) { - old_intensity = blue; - pel_set_rgb(255, 0, 255 - blue); - } - } - -#endif - -#if HAS_HEATED_BED - - void PrinterEventLEDs::onBedHeating(const float &start, const float ¤t, const float &target) { - const uint8_t red = pel_intensity(start, current, target); - if (red != old_intensity) { - old_intensity = red; - pel_set_rgb(red, 0, 255); - } - } -#endif - -#endif // PRINTER_EVENT_LEDS diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h deleted file mode 100644 index 86ec292aa3..0000000000 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * feature/leds/printer_event_leds.h - LED color changing based on printer status - */ - -#include "leds.h" -#include "../../inc/MarlinConfig.h" - -class PrinterEventLEDs { -private: - static uint8_t old_intensity; - - #if HAS_LEDS_OFF_FLAG - static bool leds_off_after_print; - #endif - - static inline void set_done() { - #if ENABLED(LED_COLOR_PRESETS) - leds.set_default(); - #else - leds.set_off(); - #endif - } - -public: - #if HAS_TEMP_HOTEND - static inline LEDColor onHotendHeatingStart() { old_intensity = 0; return leds.get_color(); } - static void onHotendHeating(const float &start, const float ¤t, const float &target); - #endif - - #if HAS_HEATED_BED - static inline LEDColor onBedHeatingStart() { old_intensity = 127; return leds.get_color(); } - static void onBedHeating(const float &start, const float ¤t, const float &target); - #endif - - #if HAS_TEMP_HOTEND || HAS_HEATED_BED - static inline void onHeatingDone() { leds.set_white(); } - static inline void onPidTuningDone(LEDColor c) { leds.set_color(c); } - #endif - - #if ENABLED(SDSUPPORT) - - static inline void onPrintCompleted() { - leds.set_green(); - #if HAS_LEDS_OFF_FLAG - leds_off_after_print = true; - #else - safe_delay(2000); - set_done(); - #endif - } - - static inline void onResumeAfterWait() { - #if HAS_LEDS_OFF_FLAG - if (leds_off_after_print) { - set_done(); - leds_off_after_print = false; - } - #endif - } - - #endif // SDSUPPORT -}; - -extern PrinterEventLEDs printerEventLEDs; diff --git a/Marlin/src/feature/leds/tempstat.cpp b/Marlin/src/feature/leds/tempstat.cpp index 880258f852..5ab0d2efab 100644 --- a/Marlin/src/feature/leds/tempstat.cpp +++ b/Marlin/src/feature/leds/tempstat.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -31,22 +31,27 @@ #include "tempstat.h" #include "../../module/temperature.h" -void handle_status_leds() { - static int8_t old_red = -1; // Invalid value to force LED initialization +void handle_status_leds(void) { + static bool red_led = false; static millis_t next_status_led_update_ms = 0; if (ELAPSED(millis(), next_status_led_update_ms)) { next_status_led_update_ms += 500; // Update every 0.5s - float max_temp = TERN0(HAS_HEATED_BED, _MAX(thermalManager.degTargetBed(), thermalManager.degBed())); + float max_temp = 0.0; + #if HAS_HEATED_BED + max_temp = MAX3(max_temp, thermalManager.degTargetBed(), thermalManager.degBed()); + #endif HOTEND_LOOP() - max_temp = _MAX(max_temp, thermalManager.degHotend(e), thermalManager.degTargetHotend(e)); - const int8_t new_red = (max_temp > 55.0) ? HIGH : (max_temp < 54.0 || old_red < 0) ? LOW : old_red; - if (new_red != old_red) { - old_red = new_red; + max_temp = MAX3(max_temp, thermalManager.degHotend(e), thermalManager.degTargetHotend(e)); + const bool new_led = (max_temp > 55.0) ? true : (max_temp < 54.0) ? false : red_led; + if (new_led != red_led) { + red_led = new_led; #if PIN_EXISTS(STAT_LED_RED) - WRITE(STAT_LED_RED_PIN, new_red); - #endif - #if PIN_EXISTS(STAT_LED_BLUE) - WRITE(STAT_LED_BLUE_PIN, !new_red); + WRITE(STAT_LED_RED_PIN, new_led ? HIGH : LOW); + #if PIN_EXISTS(STAT_LED_BLUE) + WRITE(STAT_LED_BLUE_PIN, new_led ? LOW : HIGH); + #endif + #else + WRITE(STAT_LED_BLUE_PIN, new_led ? HIGH : LOW); #endif } } diff --git a/Marlin/src/feature/leds/tempstat.h b/Marlin/src/feature/leds/tempstat.h index a8b919bd8c..290e73f1c0 100644 --- a/Marlin/src/feature/leds/tempstat.h +++ b/Marlin/src/feature/leds/tempstat.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,17 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Marlin general RGB LED support */ -void handle_status_leds(); +#ifndef __TEMPSTAT_H__ +#define __TEMPSTAT_H__ + +void handle_status_leds(void); + +#endif // __TEMPSTAT_H__ diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp deleted file mode 100644 index ebcb56490d..0000000000 --- a/Marlin/src/feature/max7219.cpp +++ /dev/null @@ -1,700 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * This module is off by default, but can be enabled to facilitate the display of - * extra debug information during code development. - * - * Just connect up 5V and GND to give it power, then connect up the pins assigned - * in Configuration_adv.h. For example, on the Re-ARM you could use: - * - * #define MAX7219_CLK_PIN 77 - * #define MAX7219_DIN_PIN 78 - * #define MAX7219_LOAD_PIN 79 - * - * send() is called automatically at startup, and then there are a number of - * support functions available to control the LEDs in the 8x8 grid. - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(MAX7219_DEBUG) - -#define MAX7219_ERRORS // Disable to save 406 bytes of Program Memory - -#include "max7219.h" - -#include "../module/planner.h" -#include "../module/stepper.h" -#include "../MarlinCore.h" -#include "../HAL/shared/Delay.h" - -#if ENABLED(MAX7219_SIDE_BY_SIDE) && MAX7219_NUMBER_UNITS > 1 - #define HAS_SIDE_BY_SIDE 1 -#endif - -#if _ROT == 0 || _ROT == 180 - #define MAX7219_X_LEDS TERN(HAS_SIDE_BY_SIDE, 8, MAX7219_LINES) - #define MAX7219_Y_LEDS TERN(HAS_SIDE_BY_SIDE, MAX7219_LINES, 8) -#elif _ROT == 90 || _ROT == 270 - #define MAX7219_X_LEDS TERN(HAS_SIDE_BY_SIDE, MAX7219_LINES, 8) - #define MAX7219_Y_LEDS TERN(HAS_SIDE_BY_SIDE, 8, MAX7219_LINES) -#else - #error "MAX7219_ROTATE must be a multiple of +/- 90°." -#endif - -Max7219 max7219; - -uint8_t Max7219::led_line[MAX7219_LINES]; // = { 0 }; -uint8_t Max7219::suspended; // = 0; - -#define LINE_REG(Q) (max7219_reg_digit0 + ((Q) & 0x7)) - -#if _ROT == 0 || _ROT == 270 - #define _LED_BIT(Q) (7 - ((Q) & 0x7)) -#else - #define _LED_BIT(Q) ((Q) & 0x7) -#endif -#if _ROT == 0 || _ROT == 180 - #define LED_BIT(X,Y) _LED_BIT(X) -#else - #define LED_BIT(X,Y) _LED_BIT(Y) -#endif -#if _ROT == 0 || _ROT == 90 - #define _LED_IND(P,Q) (_LED_TOP(P) + ((Q) & 0x7)) -#else - #define _LED_IND(P,Q) (_LED_TOP(P) + (7 - ((Q) & 0x7))) -#endif - -#if HAS_SIDE_BY_SIDE - #if (_ROT == 0 || _ROT == 90) == DISABLED(MAX7219_REVERSE_ORDER) - #define _LED_TOP(Q) ((MAX7219_NUMBER_UNITS - 1 - ((Q) >> 3)) << 3) - #else - #define _LED_TOP(Q) ((Q) & ~0x7) - #endif - #if _ROT == 0 || _ROT == 180 - #define LED_IND(X,Y) _LED_IND(Y,Y) - #elif _ROT == 90 || _ROT == 270 - #define LED_IND(X,Y) _LED_IND(X,X) - #endif -#else - #if (_ROT == 0 || _ROT == 270) == DISABLED(MAX7219_REVERSE_ORDER) - #define _LED_TOP(Q) ((Q) & ~0x7) - #else - #define _LED_TOP(Q) ((MAX7219_NUMBER_UNITS - 1 - ((Q) >> 3)) << 3) - #endif - #if _ROT == 0 || _ROT == 180 - #define LED_IND(X,Y) _LED_IND(X,Y) - #elif _ROT == 90 || _ROT == 270 - #define LED_IND(X,Y) _LED_IND(Y,X) - #endif -#endif - -#define XOR_7219(X,Y) do{ led_line[LED_IND(X,Y)] ^= _BV(LED_BIT(X,Y)); }while(0) -#define SET_7219(X,Y) do{ led_line[LED_IND(X,Y)] |= _BV(LED_BIT(X,Y)); }while(0) -#define CLR_7219(X,Y) do{ led_line[LED_IND(X,Y)] &= ~_BV(LED_BIT(X,Y)); }while(0) -#define BIT_7219(X,Y) TEST(led_line[LED_IND(X,Y)], LED_BIT(X,Y)) - -#ifdef CPU_32_BIT - #define SIG_DELAY() DELAY_US(1) // Approximate a 1µs delay on 32-bit ARM - #undef CRITICAL_SECTION_START - #undef CRITICAL_SECTION_END - #define CRITICAL_SECTION_START() NOOP - #define CRITICAL_SECTION_END() NOOP -#else - #define SIG_DELAY() DELAY_NS(250) -#endif - -void Max7219::error(const char * const func, const int32_t v1, const int32_t v2/*=-1*/) { - #if ENABLED(MAX7219_ERRORS) - SERIAL_ECHOPGM("??? Max7219::"); - serialprintPGM(func); - SERIAL_CHAR('('); - SERIAL_ECHO(v1); - if (v2 > 0) SERIAL_ECHOPAIR(", ", v2); - SERIAL_CHAR(')'); - SERIAL_EOL(); - #else - UNUSED(func); UNUSED(v1); UNUSED(v2); - #endif -} - -/** - * Flip the lowest n_bytes of the supplied bits: - * flipped(x, 1) flips the low 8 bits of x. - * flipped(x, 2) flips the low 16 bits of x. - * flipped(x, 3) flips the low 24 bits of x. - * flipped(x, 4) flips the low 32 bits of x. - */ -inline uint32_t flipped(const uint32_t bits, const uint8_t n_bytes) { - uint32_t mask = 1, outbits = 0; - LOOP_L_N(b, n_bytes * 8) { - outbits <<= 1; - if (bits & mask) outbits |= 1; - mask <<= 1; - } - return outbits; -} - -void Max7219::noop() { - CRITICAL_SECTION_START(); - SIG_DELAY(); - WRITE(MAX7219_DIN_PIN, LOW); - for (uint8_t i = 16; i--;) { - SIG_DELAY(); - WRITE(MAX7219_CLK_PIN, LOW); - SIG_DELAY(); - SIG_DELAY(); - WRITE(MAX7219_CLK_PIN, HIGH); - SIG_DELAY(); - } - CRITICAL_SECTION_END(); -} - -void Max7219::putbyte(uint8_t data) { - CRITICAL_SECTION_START(); - for (uint8_t i = 8; i--;) { - SIG_DELAY(); - WRITE(MAX7219_CLK_PIN, LOW); // tick - SIG_DELAY(); - WRITE(MAX7219_DIN_PIN, (data & 0x80) ? HIGH : LOW); // send 1 or 0 based on data bit - SIG_DELAY(); - WRITE(MAX7219_CLK_PIN, HIGH); // tock - SIG_DELAY(); - data <<= 1; - } - CRITICAL_SECTION_END(); -} - -void Max7219::pulse_load() { - SIG_DELAY(); - WRITE(MAX7219_LOAD_PIN, LOW); // tell the chip to load the data - SIG_DELAY(); - WRITE(MAX7219_LOAD_PIN, HIGH); - SIG_DELAY(); -} - -void Max7219::send(const uint8_t reg, const uint8_t data) { - SIG_DELAY(); - CRITICAL_SECTION_START(); - SIG_DELAY(); - putbyte(reg); // specify register - SIG_DELAY(); - putbyte(data); // put data - CRITICAL_SECTION_END(); -} - -// Send out a single native row of bits to just one unit -void Max7219::refresh_unit_line(const uint8_t line) { - if (suspended) return; - #if MAX7219_NUMBER_UNITS == 1 - send(LINE_REG(line), led_line[line]); - #else - for (uint8_t u = MAX7219_NUMBER_UNITS; u--;) - if (u == (line >> 3)) send(LINE_REG(line), led_line[line]); else noop(); - #endif - pulse_load(); -} - -// Send out a single native row of bits to all units -void Max7219::refresh_line(const uint8_t line) { - if (suspended) return; - #if MAX7219_NUMBER_UNITS == 1 - refresh_unit_line(line); - #else - for (uint8_t u = MAX7219_NUMBER_UNITS; u--;) - send(LINE_REG(line), led_line[(u << 3) | (line & 0x7)]); - #endif - pulse_load(); -} - -void Max7219::set(const uint8_t line, const uint8_t bits) { - led_line[line] = bits; - refresh_unit_line(line); -} - -#if ENABLED(MAX7219_NUMERIC) - - // Draw an integer with optional leading zeros and optional decimal point - void Max7219::print(const uint8_t start, int16_t value, uint8_t size, const bool leadzero=false, bool dec=false) { - if (suspended) return; - constexpr uint8_t led_numeral[10] = { 0x7E, 0x60, 0x6D, 0x79, 0x63, 0x5B, 0x5F, 0x70, 0x7F, 0x7A }, - led_decimal = 0x80, led_minus = 0x01; - bool blank = false, neg = value < 0; - if (neg) value *= -1; - while (size--) { - const bool minus = neg && blank; - if (minus) neg = false; - send( - max7219_reg_digit0 + start + size, - minus ? led_minus : blank ? 0x00 : led_numeral[value % 10] | (dec ? led_decimal : 0x00) - ); - pulse_load(); // tell the chips to load the clocked out data - value /= 10; - if (!value && !leadzero) blank = true; - dec = false; - } - } - - // Draw a float with a decimal point and optional digits - void Max7219::print(const uint8_t start, const float value, const uint8_t pre_size, const uint8_t post_size, const bool leadzero=false) { - if (pre_size) print(start, value, pre_size, leadzero, !!post_size); - if (post_size) { - const int16_t after = ABS(value) * (10 ^ post_size); - print(start + pre_size, after, post_size, true); - } - } - -#endif // MAX7219_NUMERIC - -// Modify a single LED bit and send the changed line -void Max7219::led_set(const uint8_t x, const uint8_t y, const bool on) { - if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_set"), x, y); - if (BIT_7219(x, y) == on) return; - XOR_7219(x, y); - refresh_unit_line(LED_IND(x, y)); -} - -void Max7219::led_on(const uint8_t x, const uint8_t y) { - if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_on"), x, y); - led_set(x, y, true); -} - -void Max7219::led_off(const uint8_t x, const uint8_t y) { - if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_off"), x, y); - led_set(x, y, false); -} - -void Max7219::led_toggle(const uint8_t x, const uint8_t y) { - if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_toggle"), x, y); - led_set(x, y, !BIT_7219(x, y)); -} - -void Max7219::send_row(const uint8_t row) { - if (suspended) return; - #if _ROT == 0 || _ROT == 180 // Native Lines are horizontal too - #if MAX7219_X_LEDS <= 8 - refresh_unit_line(LED_IND(0, row)); // A single unit line - #else - refresh_line(LED_IND(0, row)); // Same line, all units - #endif - #else // Native lines are vertical - UNUSED(row); - refresh(); // Actually a column - #endif -} - -void Max7219::send_column(const uint8_t col) { - if (suspended) return; - #if _ROT == 90 || _ROT == 270 // Native Lines are vertical too - #if MAX7219_Y_LEDS <= 8 - refresh_unit_line(LED_IND(col, 0)); // A single unit line - #else - refresh_line(LED_IND(col, 0)); // Same line, all units - #endif - #else // Native lines are horizontal - UNUSED(col); - refresh(); // Actually a row - #endif -} - -void Max7219::clear() { - ZERO(led_line); - refresh(); -} - -void Max7219::fill() { - memset(led_line, 0xFF, sizeof(led_line)); - refresh(); -} - -void Max7219::clear_row(const uint8_t row) { - if (row >= MAX7219_Y_LEDS) return error(PSTR("clear_row"), row); - LOOP_L_N(x, MAX7219_X_LEDS) CLR_7219(x, row); - send_row(row); -} - -void Max7219::clear_column(const uint8_t col) { - if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col); - LOOP_L_N(y, MAX7219_Y_LEDS) CLR_7219(col, y); - send_column(col); -} - -/** - * Plot the low order bits of val to the specified row of the matrix. - * With 4 Max7219 units in the chain, it's possible to set 32 bits at - * once with a single call to the function (if rotated 90° or 270°). - */ -void Max7219::set_row(const uint8_t row, const uint32_t val) { - if (row >= MAX7219_Y_LEDS) return error(PSTR("set_row"), row); - uint32_t mask = _BV32(MAX7219_X_LEDS - 1); - LOOP_L_N(x, MAX7219_X_LEDS) { - if (val & mask) SET_7219(x, row); else CLR_7219(x, row); - mask >>= 1; - } - send_row(row); -} - -/** - * Plot the low order bits of val to the specified column of the matrix. - * With 4 Max7219 units in the chain, it's possible to set 32 bits at - * once with a single call to the function (if rotated 0° or 180°). - */ -void Max7219::set_column(const uint8_t col, const uint32_t val) { - if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col); - uint32_t mask = _BV32(MAX7219_Y_LEDS - 1); - LOOP_L_N(y, MAX7219_Y_LEDS) { - if (val & mask) SET_7219(col, y); else CLR_7219(col, y); - mask >>= 1; - } - send_column(col); -} - -void Max7219::set_rows_16bits(const uint8_t y, uint32_t val) { - #if MAX7219_X_LEDS == 8 - if (y > MAX7219_Y_LEDS - 2) return error(PSTR("set_rows_16bits"), y, val); - set_row(y + 1, val); val >>= 8; - set_row(y + 0, val); - #else // at least 16 bits on each row - if (y > MAX7219_Y_LEDS - 1) return error(PSTR("set_rows_16bits"), y, val); - set_row(y, val); - #endif -} - -void Max7219::set_rows_32bits(const uint8_t y, uint32_t val) { - #if MAX7219_X_LEDS == 8 - if (y > MAX7219_Y_LEDS - 4) return error(PSTR("set_rows_32bits"), y, val); - set_row(y + 3, val); val >>= 8; - set_row(y + 2, val); val >>= 8; - set_row(y + 1, val); val >>= 8; - set_row(y + 0, val); - #elif MAX7219_X_LEDS == 16 - if (y > MAX7219_Y_LEDS - 2) return error(PSTR("set_rows_32bits"), y, val); - set_row(y + 1, val); val >>= 16; - set_row(y + 0, val); - #else // at least 24 bits on each row. In the 3 matrix case, just display the low 24 bits - if (y > MAX7219_Y_LEDS - 1) return error(PSTR("set_rows_32bits"), y, val); - set_row(y, val); - #endif -} - -void Max7219::set_columns_16bits(const uint8_t x, uint32_t val) { - #if MAX7219_Y_LEDS == 8 - if (x > MAX7219_X_LEDS - 2) return error(PSTR("set_columns_16bits"), x, val); - set_column(x + 0, val); val >>= 8; - set_column(x + 1, val); - #else // at least 16 bits in each column - if (x > MAX7219_X_LEDS - 1) return error(PSTR("set_columns_16bits"), x, val); - set_column(x, val); - #endif -} - -void Max7219::set_columns_32bits(const uint8_t x, uint32_t val) { - #if MAX7219_Y_LEDS == 8 - if (x > MAX7219_X_LEDS - 4) return error(PSTR("set_rows_32bits"), x, val); - set_column(x + 3, val); val >>= 8; - set_column(x + 2, val); val >>= 8; - set_column(x + 1, val); val >>= 8; - set_column(x + 0, val); - #elif MAX7219_Y_LEDS == 16 - if (x > MAX7219_X_LEDS - 2) return error(PSTR("set_rows_32bits"), x, val); - set_column(x + 1, val); val >>= 16; - set_column(x + 0, val); - #else // at least 24 bits on each row. In the 3 matrix case, just display the low 24 bits - if (x > MAX7219_X_LEDS - 1) return error(PSTR("set_rows_32bits"), x, val); - set_column(x, val); - #endif -} - -// Initialize the Max7219 -void Max7219::register_setup() { - LOOP_L_N(i, MAX7219_NUMBER_UNITS) - send(max7219_reg_scanLimit, 0x07); - pulse_load(); // Tell the chips to load the clocked out data - - LOOP_L_N(i, MAX7219_NUMBER_UNITS) - send(max7219_reg_decodeMode, 0x00); // Using an led matrix (not digits) - pulse_load(); // Tell the chips to load the clocked out data - - LOOP_L_N(i, MAX7219_NUMBER_UNITS) - send(max7219_reg_shutdown, 0x01); // Not in shutdown mode - pulse_load(); // Tell the chips to load the clocked out data - - LOOP_L_N(i, MAX7219_NUMBER_UNITS) - send(max7219_reg_displayTest, 0x00); // No display test - pulse_load(); // Tell the chips to load the clocked out data - - LOOP_L_N(i, MAX7219_NUMBER_UNITS) - send(max7219_reg_intensity, 0x01 & 0x0F); // The first 0x0F is the value you can set - // Range: 0x00 to 0x0F - pulse_load(); // Tell the chips to load the clocked out data -} - -#ifdef MAX7219_INIT_TEST - - uint8_t test_mode = 0; - millis_t next_patt_ms; - bool patt_on; - - #if MAX7219_INIT_TEST == 2 - - #define MAX7219_LEDS (MAX7219_X_LEDS * MAX7219_Y_LEDS) - - constexpr millis_t pattern_delay = 4; - - int8_t spiralx, spiraly, spiral_dir; - IF<(MAX7219_LEDS > 255), uint16_t, uint8_t>::type spiral_count; - - void Max7219::test_pattern() { - constexpr int8_t way[][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; - led_set(spiralx, spiraly, patt_on); - const int8_t x = spiralx + way[spiral_dir][0], y = spiraly + way[spiral_dir][1]; - if (!WITHIN(x, 0, MAX7219_X_LEDS - 1) || !WITHIN(y, 0, MAX7219_Y_LEDS - 1) || BIT_7219(x, y) == patt_on) - spiral_dir = (spiral_dir + 1) & 0x3; - spiralx += way[spiral_dir][0]; - spiraly += way[spiral_dir][1]; - if (!spiral_count--) { - if (!patt_on) - test_mode = 0; - else { - spiral_count = MAX7219_LEDS; - spiralx = spiraly = spiral_dir = 0; - patt_on = false; - } - } - } - - #else - - constexpr millis_t pattern_delay = 20; - int8_t sweep_count, sweepx, sweep_dir; - - void Max7219::test_pattern() { - set_column(sweepx, patt_on ? 0xFFFFFFFF : 0x00000000); - sweepx += sweep_dir; - if (!WITHIN(sweepx, 0, MAX7219_X_LEDS - 1)) { - if (!patt_on) { - sweep_dir *= -1; - sweepx += sweep_dir; - } - else - sweepx -= MAX7219_X_LEDS * sweep_dir; - patt_on ^= true; - next_patt_ms += 100; - if (++test_mode > 4) test_mode = 0; - } - } - - #endif - - void Max7219::run_test_pattern() { - const millis_t ms = millis(); - if (PENDING(ms, next_patt_ms)) return; - next_patt_ms = ms + pattern_delay; - test_pattern(); - } - - void Max7219::start_test_pattern() { - clear(); - test_mode = 1; - patt_on = true; - #if MAX7219_INIT_TEST == 2 - spiralx = spiraly = spiral_dir = 0; - spiral_count = MAX7219_LEDS; - #else - sweep_dir = 1; - sweepx = 0; - sweep_count = MAX7219_X_LEDS; - #endif - } - -#endif // MAX7219_INIT_TEST - -void Max7219::init() { - SET_OUTPUT(MAX7219_DIN_PIN); - SET_OUTPUT(MAX7219_CLK_PIN); - OUT_WRITE(MAX7219_LOAD_PIN, HIGH); - delay(1); - - register_setup(); - - LOOP_LE_N(i, 7) { // Empty registers to turn all LEDs off - led_line[i] = 0x00; - send(max7219_reg_digit0 + i, 0); - pulse_load(); // Tell the chips to load the clocked out data - } - - #ifdef MAX7219_INIT_TEST - start_test_pattern(); - #endif -} - -/** - * This code demonstrates some simple debugging using a single 8x8 LED Matrix. If your feature could - * benefit from matrix display, add its code here. Very little processing is required, so the 7219 is - * ideal for debugging when realtime feedback is important but serial output can't be used. - */ - -// Apply changes to update a marker -void Max7219::mark16(const uint8_t pos, const uint8_t v1, const uint8_t v2) { - #if MAX7219_X_LEDS > 8 // At least 16 LEDs on the X-Axis. Use single line. - led_off(v1 & 0xF, pos); - led_on(v2 & 0xF, pos); - #elif MAX7219_Y_LEDS > 8 // At least 16 LEDs on the Y-Axis. Use a single column. - led_off(pos, v1 & 0xF); - led_on(pos, v2 & 0xF); - #else // Single 8x8 LED matrix. Use two lines to get 16 LEDs. - led_off(v1 & 0x7, pos + (v1 >= 8)); - led_on(v2 & 0x7, pos + (v2 >= 8)); - #endif -} - -// Apply changes to update a tail-to-head range -void Max7219::range16(const uint8_t y, const uint8_t ot, const uint8_t nt, const uint8_t oh, const uint8_t nh) { - #if MAX7219_X_LEDS > 8 // At least 16 LEDs on the X-Axis. Use single line. - if (ot != nt) for (uint8_t n = ot & 0xF; n != (nt & 0xF) && n != (nh & 0xF); n = (n + 1) & 0xF) - led_off(n & 0xF, y); - if (oh != nh) for (uint8_t n = (oh + 1) & 0xF; n != ((nh + 1) & 0xF); n = (n + 1) & 0xF) - led_on(n & 0xF, y); - #elif MAX7219_Y_LEDS > 8 // At least 16 LEDs on the Y-Axis. Use a single column. - if (ot != nt) for (uint8_t n = ot & 0xF; n != (nt & 0xF) && n != (nh & 0xF); n = (n + 1) & 0xF) - led_off(y, n & 0xF); - if (oh != nh) for (uint8_t n = (oh + 1) & 0xF; n != ((nh + 1) & 0xF); n = (n + 1) & 0xF) - led_on(y, n & 0xF); - #else // Single 8x8 LED matrix. Use two lines to get 16 LEDs. - if (ot != nt) for (uint8_t n = ot & 0xF; n != (nt & 0xF) && n != (nh & 0xF); n = (n + 1) & 0xF) - led_off(n & 0x7, y + (n >= 8)); - if (oh != nh) for (uint8_t n = (oh + 1) & 0xF; n != ((nh + 1) & 0xF); n = (n + 1) & 0xF) - led_on(n & 0x7, y + (n >= 8)); - #endif -} - -// Apply changes to update a quantity -void Max7219::quantity16(const uint8_t pos, const uint8_t ov, const uint8_t nv) { - for (uint8_t i = _MIN(nv, ov); i < _MAX(nv, ov); i++) - led_set( - #if MAX7219_X_LEDS > 8 // At least 16 LEDs on the X-Axis. Use single line. - i, pos - #elif MAX7219_Y_LEDS > 8 // At least 16 LEDs on the Y-Axis. Use a single column. - pos, i - #else // Single 8x8 LED matrix. Use two lines to get 16 LEDs. - i >> 1, pos + (i & 1) - #endif - , nv >= ov - ); -} - -void Max7219::idle_tasks() { - #define MAX7219_USE_HEAD (defined(MAX7219_DEBUG_PLANNER_HEAD) || defined(MAX7219_DEBUG_PLANNER_QUEUE)) - #define MAX7219_USE_TAIL (defined(MAX7219_DEBUG_PLANNER_TAIL) || defined(MAX7219_DEBUG_PLANNER_QUEUE)) - #if MAX7219_USE_HEAD || MAX7219_USE_TAIL - CRITICAL_SECTION_START(); - #if MAX7219_USE_HEAD - const uint8_t head = planner.block_buffer_head; - #endif - #if MAX7219_USE_TAIL - const uint8_t tail = planner.block_buffer_tail; - #endif - CRITICAL_SECTION_END(); - #endif - - #if ENABLED(MAX7219_DEBUG_PRINTER_ALIVE) - static uint8_t refresh_cnt; // = 0 - constexpr uint16_t refresh_limit = 5; - static millis_t next_blink = 0; - const millis_t ms = millis(); - const bool do_blink = ELAPSED(ms, next_blink); - #else - static uint16_t refresh_cnt; // = 0 - constexpr bool do_blink = true; - constexpr uint16_t refresh_limit = 50000; - #endif - - // Some Max7219 units are vulnerable to electrical noise, especially - // with long wires next to high current wires. If the display becomes - // corrupted, this will fix it within a couple seconds. - if (do_blink && ++refresh_cnt >= refresh_limit) { - refresh_cnt = 0; - register_setup(); - } - - #ifdef MAX7219_INIT_TEST - if (test_mode) { - run_test_pattern(); - return; - } - #endif - - #if ENABLED(MAX7219_DEBUG_PRINTER_ALIVE) - if (do_blink) { - led_toggle(MAX7219_X_LEDS - 1, MAX7219_Y_LEDS - 1); - next_blink = ms + 1000; - } - #endif - - #if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL - - static int16_t last_head_cnt = 0xF, last_tail_cnt = 0xF; - - if (last_head_cnt != head || last_tail_cnt != tail) { - range16(MAX7219_DEBUG_PLANNER_HEAD, last_tail_cnt, tail, last_head_cnt, head); - last_head_cnt = head; - last_tail_cnt = tail; - } - - #else - - #ifdef MAX7219_DEBUG_PLANNER_HEAD - static int16_t last_head_cnt = 0x1; - if (last_head_cnt != head) { - mark16(MAX7219_DEBUG_PLANNER_HEAD, last_head_cnt, head); - last_head_cnt = head; - } - #endif - - #ifdef MAX7219_DEBUG_PLANNER_TAIL - static int16_t last_tail_cnt = 0x1; - if (last_tail_cnt != tail) { - mark16(MAX7219_DEBUG_PLANNER_TAIL, last_tail_cnt, tail); - last_tail_cnt = tail; - } - #endif - - #endif - - #ifdef MAX7219_DEBUG_PLANNER_QUEUE - static int16_t last_depth = 0; - const int16_t current_depth = (head - tail + BLOCK_BUFFER_SIZE) & (BLOCK_BUFFER_SIZE - 1) & 0xF; - if (current_depth != last_depth) { - quantity16(MAX7219_DEBUG_PLANNER_QUEUE, last_depth, current_depth); - last_depth = current_depth; - } - #endif - - // After resume() automatically do a refresh() - if (suspended == 0x80) { - suspended = 0; - refresh(); - } -} - -#endif // MAX7219_DEBUG diff --git a/Marlin/src/feature/max7219.h b/Marlin/src/feature/max7219.h deleted file mode 100644 index 8e98c9456c..0000000000 --- a/Marlin/src/feature/max7219.h +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * This module is off by default, but can be enabled to facilitate the display of - * extra debug information during code development. - * - * Just connect up 5V and GND to give it power, then connect up the pins assigned - * in Configuration_adv.h. For example, on the Re-ARM you could use: - * - * #define MAX7219_CLK_PIN 77 - * #define MAX7219_DIN_PIN 78 - * #define MAX7219_LOAD_PIN 79 - * - * max7219.init() is called automatically at startup, and then there are a number of - * support functions available to control the LEDs in the 8x8 grid. - * - * If you are using the Max7219 matrix for firmware debug purposes in time sensitive - * areas of the code, please be aware that the orientation (rotation) of the display can - * affect the speed. The Max7219 can update a single column fairly fast. It is much - * faster to do a Max7219_Set_Column() with a rotation of 90 or 270 degrees than to do - * a Max7219_Set_Row(). The opposite is true for rotations of 0 or 180 degrees. - */ - -#ifndef MAX7219_ROTATE - #define MAX7219_ROTATE 0 -#endif -#define _ROT ((MAX7219_ROTATE + 360) % 360) - -#ifndef MAX7219_NUMBER_UNITS - #define MAX7219_NUMBER_UNITS 1 -#endif -#define MAX7219_LINES (8 * (MAX7219_NUMBER_UNITS)) - -// -// MAX7219 registers -// -#define max7219_reg_noop 0x00 -#define max7219_reg_digit0 0x01 -#define max7219_reg_digit1 0x02 -#define max7219_reg_digit2 0x03 -#define max7219_reg_digit3 0x04 -#define max7219_reg_digit4 0x05 -#define max7219_reg_digit5 0x06 -#define max7219_reg_digit6 0x07 -#define max7219_reg_digit7 0x08 - -#define max7219_reg_decodeMode 0x09 -#define max7219_reg_intensity 0x0A -#define max7219_reg_scanLimit 0x0B -#define max7219_reg_shutdown 0x0C -#define max7219_reg_displayTest 0x0F - -class Max7219 { -public: - static uint8_t led_line[MAX7219_LINES]; - - Max7219() {} - - static void init(); - static void register_setup(); - static void putbyte(uint8_t data); - static void pulse_load(); - - // Set a single register (e.g., a whole native row) - static void send(const uint8_t reg, const uint8_t data); - - // Refresh all units - static inline void refresh() { for (uint8_t i = 0; i < 8; i++) refresh_line(i); } - - // Suspend / resume updates to the LED unit - // Use these methods to speed up multiple changes - // or to apply updates from interrupt context. - static inline void suspend() { suspended++; } - static inline void resume() { suspended--; suspended |= 0x80; } - - // Update a single native line on all units - static void refresh_line(const uint8_t line); - - // Update a single native line on just one unit - static void refresh_unit_line(const uint8_t line); - - // Set a single LED by XY coordinate - static void led_set(const uint8_t x, const uint8_t y, const bool on); - static void led_on(const uint8_t x, const uint8_t y); - static void led_off(const uint8_t x, const uint8_t y); - static void led_toggle(const uint8_t x, const uint8_t y); - - // Set all LEDs in a single column - static void set_column(const uint8_t col, const uint32_t val); - static void clear_column(const uint8_t col); - - // Set all LEDs in a single row - static void set_row(const uint8_t row, const uint32_t val); - static void clear_row(const uint8_t row); - - // 16 and 32 bit versions of Row and Column functions - // Multiple rows and columns will be used to display the value if - // the array of matrix LED's is too narrow to accomplish the goal - static void set_rows_16bits(const uint8_t y, uint32_t val); - static void set_rows_32bits(const uint8_t y, uint32_t val); - static void set_columns_16bits(const uint8_t x, uint32_t val); - static void set_columns_32bits(const uint8_t x, uint32_t val); - - // Quickly clear the whole matrix - static void clear(); - - // Quickly fill the whole matrix - static void fill(); - - // Apply custom code to update the matrix - static void idle_tasks(); - -private: - static uint8_t suspended; - static void error(const char * const func, const int32_t v1, const int32_t v2=-1); - static void noop(); - static void set(const uint8_t line, const uint8_t bits); - static void send_row(const uint8_t row); - static void send_column(const uint8_t col); - static void mark16(const uint8_t y, const uint8_t v1, const uint8_t v2); - static void range16(const uint8_t y, const uint8_t ot, const uint8_t nt, const uint8_t oh, const uint8_t nh); - static void quantity16(const uint8_t y, const uint8_t ov, const uint8_t nv); - - #ifdef MAX7219_INIT_TEST - static void test_pattern(); - static void run_test_pattern(); - static void start_test_pattern(); - #endif -}; - -extern Max7219 max7219; diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp index b002e9808a..b1054c2946 100644 --- a/Marlin/src/feature/mixing.cpp +++ b/Marlin/src/feature/mixing.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,170 +24,69 @@ #if ENABLED(MIXING_EXTRUDER) -//#define MIXER_NORMALIZER_DEBUG - -#include "mixing.h" - -Mixer mixer; - -#ifdef MIXER_NORMALIZER_DEBUG - #include "../core/serial.h" +#if ENABLED(DIRECT_MIXING_IN_G1) + #include "../gcode/parser.h" #endif -// Used up to Planner level -uint_fast8_t Mixer::selected_vtool = 0; -float Mixer::collector[MIXING_STEPPERS]; // mix proportion. 0.0 = off, otherwise <= COLOR_A_MASK. -mixer_comp_t Mixer::color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; +float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0. -// Used in Stepper -int_fast8_t Mixer::runner = 0; -mixer_comp_t Mixer::s_color[MIXING_STEPPERS]; -mixer_accu_t Mixer::accu[MIXING_STEPPERS] = { 0 }; +#if MIXING_VIRTUAL_TOOLS > 1 -#if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX) - mixer_perc_t Mixer::mix[MIXING_STEPPERS]; + float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; + + void mixing_tools_init() { + // Virtual Tools 0, 1, 2, 3 = Filament 1, 2, 3, 4, etc. + for (uint8_t t = 0; t < MIXING_VIRTUAL_TOOLS && t < MIXING_STEPPERS; t++) + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + mixing_virtual_tool_mix[t][i] = (t == i) ? 1.0 : 0.0; + + // Remaining virtual tools are 100% filament 1 + #if MIXING_STEPPERS < MIXING_VIRTUAL_TOOLS + for (uint8_t t = MIXING_STEPPERS; t < MIXING_VIRTUAL_TOOLS; t++) + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + mixing_virtual_tool_mix[t][i] = (i == 0) ? 1.0 : 0.0; + #endif + + // Initialize mixing to tool 0 color + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + mixing_factor[i] = mixing_virtual_tool_mix[0][i]; + } + +#endif // MIXING_VIRTUAL_TOOLS > 1 + +void normalize_mix() { + float mix_total = 0.0; + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mix_total += RECIPROCAL(mixing_factor[i]); + // Scale all values if they don't add up to ~1.0 + if (!NEAR(mix_total, 1.0)) { + SERIAL_PROTOCOLLNPGM("Warning: Mix factors must add up to 1.0. Scaling."); + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) mixing_factor[i] *= mix_total; + } +} + +#if ENABLED(DIRECT_MIXING_IN_G1) + // Get mixing parameters from the GCode + // The total "must" be 1.0 (but it will be normalized) + // If no mix factors are given, the old mix is preserved + void gcode_get_mix() { + const char mixing_codes[] = { 'A', 'B', 'C', 'D', 'H', 'I' }; + byte mix_bits = 0; + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) { + if (parser.seenval(mixing_codes[i])) { + SBI(mix_bits, i); + float v = parser.value_float(); + NOLESS(v, 0.0); + mixing_factor[i] = RECIPROCAL(v); + } + } + // If any mixing factors were included, clear the rest + // If none were included, preserve the last mix + if (mix_bits) { + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + if (!TEST(mix_bits, i)) mixing_factor[i] = 0.0; + normalize_mix(); + } + } #endif -void Mixer::normalize(const uint8_t tool_index) { - float cmax = 0; - #ifdef MIXER_NORMALIZER_DEBUG - float csum = 0; - #endif - MIXER_STEPPER_LOOP(i) { - const float v = collector[i]; - NOLESS(cmax, v); - #ifdef MIXER_NORMALIZER_DEBUG - csum += v; - #endif - } - #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOPGM("Mixer: Old relation : [ "); - MIXER_STEPPER_LOOP(i) { - SERIAL_ECHO_F(collector[i] / csum, 3); - SERIAL_CHAR(' '); - } - SERIAL_ECHOLNPGM("]"); - #endif - - // Scale all values so their maximum is COLOR_A_MASK - const float scale = float(COLOR_A_MASK) / cmax; - MIXER_STEPPER_LOOP(i) color[tool_index][i] = collector[i] * scale; - - #ifdef MIXER_NORMALIZER_DEBUG - csum = 0; - SERIAL_ECHOPGM("Mixer: Normalize to : [ "); - MIXER_STEPPER_LOOP(i) { - SERIAL_ECHO(uint16_t(color[tool_index][i])); - SERIAL_CHAR(' '); - csum += color[tool_index][i]; - } - SERIAL_ECHOLNPGM("]"); - SERIAL_ECHOPGM("Mixer: New relation : [ "); - MIXER_STEPPER_LOOP(i) { - SERIAL_ECHO_F(uint16_t(color[tool_index][i]) / csum, 3); - SERIAL_CHAR(' '); - } - SERIAL_ECHOLNPGM("]"); - #endif - - TERN_(GRADIENT_MIX, refresh_gradient()); -} - -void Mixer::reset_vtools() { - // Virtual Tools 0, 1, 2, 3 = Filament 1, 2, 3, 4, etc. - // Every virtual tool gets a pure filament - LOOP_L_N(t, _MIN(MIXING_VIRTUAL_TOOLS, MIXING_STEPPERS)) - MIXER_STEPPER_LOOP(i) - color[t][i] = (t == i) ? COLOR_A_MASK : 0; - - // Remaining virtual tools are 100% filament 1 - #if MIXING_VIRTUAL_TOOLS > MIXING_STEPPERS - LOOP_S_L_N(t, MIXING_STEPPERS, MIXING_VIRTUAL_TOOLS) - MIXER_STEPPER_LOOP(i) - color[t][i] = (i == 0) ? COLOR_A_MASK : 0; - #endif -} - -// called at boot -void Mixer::init() { - - reset_vtools(); - - #if HAS_MIXER_SYNC_CHANNEL - // AUTORETRACT_TOOL gets the same amount of all filaments - MIXER_STEPPER_LOOP(i) - color[MIXER_AUTORETRACT_TOOL][i] = COLOR_A_MASK; - #endif - - ZERO(collector); - - #if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX) - update_mix_from_vtool(); - #endif - - TERN_(GRADIENT_MIX, update_gradient_for_planner_z()); -} - -void Mixer::refresh_collector(const float proportion/*=1.0*/, const uint8_t t/*=selected_vtool*/, float (&c)[MIXING_STEPPERS]/*=collector*/) { - float csum = 0, cmax = 0; - MIXER_STEPPER_LOOP(i) { - const float v = color[t][i]; - cmax = _MAX(cmax, v); - csum += v; - } - //SERIAL_ECHOPAIR("Mixer::refresh_collector(", proportion, ", ", int(t), ") cmax=", cmax, " csum=", csum, " color"); - const float inv_prop = proportion / csum; - MIXER_STEPPER_LOOP(i) { - c[i] = color[t][i] * inv_prop; - //SERIAL_ECHOPAIR(" [", int(t), "][", int(i), "] = ", int(color[t][i]), " (", c[i], ") "); - } - //SERIAL_EOL(); -} - -#if ENABLED(GRADIENT_MIX) - - #include "../module/motion.h" - #include "../module/planner.h" - - gradient_t Mixer::gradient = { - false, // enabled - {0}, // color (array) - 0, 0, // start_z, end_z - 0, 1, // start_vtool, end_vtool - {0}, {0} // start_mix[], end_mix[] - #if ENABLED(GRADIENT_VTOOL) - , -1 // vtool_index - #endif - }; - - float Mixer::prev_z; // = 0 - - void Mixer::update_gradient_for_z(const float z) { - if (z == prev_z) return; - prev_z = z; - - const float slice = gradient.end_z - gradient.start_z; - - float pct = (z - gradient.start_z) / slice; - NOLESS(pct, 0.0f); NOMORE(pct, 1.0f); - - MIXER_STEPPER_LOOP(i) { - const mixer_perc_t sm = gradient.start_mix[i]; - mix[i] = sm + (gradient.end_mix[i] - sm) * pct; - } - - copy_mix_to_color(gradient.color); - } - - void Mixer::update_gradient_for_planner_z() { - #if ENABLED(DELTA) - get_cartesian_from_steppers(); - update_gradient_for_z(cartes.z); - #else - update_gradient_for_z(planner.get_axis_position_mm(Z_AXIS)); - #endif - } - -#endif // GRADIENT_MIX - #endif // MIXING_EXTRUDER diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h index 7fe7062a7a..fff240c0e0 100644 --- a/Marlin/src/feature/mixing.h +++ b/Marlin/src/feature/mixing.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,248 +16,26 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __MIXING_H__ +#define __MIXING_H__ #include "../inc/MarlinConfig.h" -//#define MIXER_NORMALIZER_DEBUG +extern float mixing_factor[MIXING_STEPPERS]; // Reciprocal of mix proportion. 0.0 = off, otherwise >= 1.0. -#ifndef __AVR__ // || HAS_DUAL_MIXING - // Use 16-bit (or fastest) data for the integer mix factors - typedef uint_fast16_t mixer_comp_t; - typedef uint_fast16_t mixer_accu_t; - #define COLOR_A_MASK 0x8000 - #define COLOR_MASK 0x7FFF -#else - // Use 8-bit data for the integer mix factors - // Exactness is sacrificed for speed - #define MIXER_ACCU_SIGNED - typedef uint8_t mixer_comp_t; - typedef int8_t mixer_accu_t; - #define COLOR_A_MASK 0x80 - #define COLOR_MASK 0x7F +#if MIXING_VIRTUAL_TOOLS > 1 + extern float mixing_virtual_tool_mix[MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; + void mixing_tools_init(); #endif -typedef int8_t mixer_perc_t; +void normalize_mix(); -#ifndef MIXING_VIRTUAL_TOOLS - #define MIXING_VIRTUAL_TOOLS 1 +#if ENABLED(DIRECT_MIXING_IN_G1) + void gcode_get_mix(); #endif -enum MixTool { - FIRST_USER_VIRTUAL_TOOL = 0 - , LAST_USER_VIRTUAL_TOOL = MIXING_VIRTUAL_TOOLS - 1 - , NR_USER_VIRTUAL_TOOLS - , MIXER_DIRECT_SET_TOOL = NR_USER_VIRTUAL_TOOLS - #if HAS_MIXER_SYNC_CHANNEL - , MIXER_AUTORETRACT_TOOL - #endif - , NR_MIXING_VIRTUAL_TOOLS -}; - -#define MAX_VTOOLS TERN(HAS_MIXER_SYNC_CHANNEL, 254, 255) -static_assert(NR_MIXING_VIRTUAL_TOOLS <= MAX_VTOOLS, "MIXING_VIRTUAL_TOOLS must be <= " STRINGIFY(MAX_VTOOLS) "!"); - -#define MIXER_BLOCK_FIELD mixer_comp_t b_color[MIXING_STEPPERS] -#define MIXER_POPULATE_BLOCK() mixer.populate_block(block->b_color) -#define MIXER_STEPPER_SETUP() mixer.stepper_setup(current_block->b_color) -#define MIXER_STEPPER_LOOP(VAR) for (uint_fast8_t VAR = 0; VAR < MIXING_STEPPERS; VAR++) - -#if ENABLED(GRADIENT_MIX) - - typedef struct { - bool enabled; // This gradient is enabled - mixer_comp_t color[MIXING_STEPPERS]; // The current gradient color - float start_z, end_z; // Region for gradient - int8_t start_vtool, end_vtool; // Start and end virtual tools - mixer_perc_t start_mix[MIXING_STEPPERS], // Start and end mixes from those tools - end_mix[MIXING_STEPPERS]; - TERN_(GRADIENT_VTOOL, int8_t vtool_index); // Use this virtual tool number as index - } gradient_t; - -#endif - -/** - * @brief Mixer class - * @details Contains data and behaviors for a Mixing Extruder - */ -class Mixer { - public: - - static float collector[MIXING_STEPPERS]; // M163 components, also editable from LCD - - static void init(); // Populate colors at boot time - - static void reset_vtools(); - static void refresh_collector(const float proportion=1.0, const uint8_t t=selected_vtool, float (&c)[MIXING_STEPPERS]=collector); - - // Used up to Planner level - FORCE_INLINE static void set_collector(const uint8_t c, const float f) { collector[c] = _MAX(f, 0.0f); } - - static void normalize(const uint8_t tool_index); - FORCE_INLINE static void normalize() { normalize(selected_vtool); } - - FORCE_INLINE static uint8_t get_current_vtool() { return selected_vtool; } - - FORCE_INLINE static void T(const uint_fast8_t c) { - selected_vtool = c; - TERN_(GRADIENT_VTOOL, refresh_gradient()); - TERN_(HAS_DUAL_MIXING, update_mix_from_vtool()); - } - - // Used when dealing with blocks - FORCE_INLINE static void populate_block(mixer_comp_t b_color[MIXING_STEPPERS]) { - #if ENABLED(GRADIENT_MIX) - if (gradient.enabled) { - MIXER_STEPPER_LOOP(i) b_color[i] = gradient.color[i]; - return; - } - #endif - MIXER_STEPPER_LOOP(i) b_color[i] = color[selected_vtool][i]; - } - - FORCE_INLINE static void stepper_setup(mixer_comp_t b_color[MIXING_STEPPERS]) { - MIXER_STEPPER_LOOP(i) s_color[i] = b_color[i]; - } - - #if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX) - - static mixer_perc_t mix[MIXING_STEPPERS]; // Scratch array for the Mix in proportion to 100 - - static inline void copy_mix_to_color(mixer_comp_t (&tcolor)[MIXING_STEPPERS]) { - // Scale each component to the largest one in terms of COLOR_A_MASK - // So the largest component will be COLOR_A_MASK and the other will be in proportion to it - const float scale = (COLOR_A_MASK) * RECIPROCAL(_MAX( - LIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]) - )); - - // Scale all values so their maximum is COLOR_A_MASK - MIXER_STEPPER_LOOP(i) tcolor[i] = mix[i] * scale; - - #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOPGM("Mix [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); - SERIAL_ECHOPGM(" ] to Color [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(tcolor[0]), int(tcolor[1]), int(tcolor[2]), int(tcolor[3]), int(tcolor[4]), int(tcolor[5])); - SERIAL_ECHOLNPGM(" ]"); - #endif - } - - static inline void update_mix_from_vtool(const uint8_t j=selected_vtool) { - float ctot = 0; - MIXER_STEPPER_LOOP(i) ctot += color[j][i]; - //MIXER_STEPPER_LOOP(i) mix[i] = 100.0f * color[j][i] / ctot; - MIXER_STEPPER_LOOP(i) mix[i] = mixer_perc_t(100.0f * color[j][i] / ctot); - - #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOPAIR("V-tool ", int(j), " [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(color[j][0]), int(color[j][1]), int(color[j][2]), int(color[j][3]), int(color[j][4]), int(color[j][5])); - SERIAL_ECHOPGM(" ] to Mix [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); - SERIAL_ECHOLNPGM(" ]"); - #endif - } - - #endif // HAS_DUAL_MIXING || GRADIENT_MIX - - #if HAS_DUAL_MIXING - - // Update the virtual tool from an edited mix - static inline void update_vtool_from_mix() { - copy_mix_to_color(color[selected_vtool]); - TERN_(GRADIENT_MIX, refresh_gradient()); - // MIXER_STEPPER_LOOP(i) collector[i] = mix[i]; - // normalize(); - } - - #endif // HAS_DUAL_MIXING - - #if ENABLED(GRADIENT_MIX) - - static gradient_t gradient; - static float prev_z; - - // Update the current mix from the gradient for a given Z - static void update_gradient_for_z(const float z); - static void update_gradient_for_planner_z(); - static inline void gradient_control(const float z) { - if (gradient.enabled) { - if (z >= gradient.end_z) - T(gradient.end_vtool); - else - update_gradient_for_z(z); - } - } - - static inline void update_mix_from_gradient() { - float ctot = 0; - MIXER_STEPPER_LOOP(i) ctot += gradient.color[i]; - MIXER_STEPPER_LOOP(i) mix[i] = (mixer_perc_t)CEIL(100.0f * gradient.color[i] / ctot); - - #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOPGM("Gradient [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(gradient.color[0]), int(gradient.color[1]), int(gradient.color[2]), int(gradient.color[3]), int(gradient.color[4]), int(gradient.color[5])); - SERIAL_ECHOPGM(" ] to Mix [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); - SERIAL_ECHOLNPGM(" ]"); - #endif - } - - // Refresh the gradient after a change - static void refresh_gradient() { - #if ENABLED(GRADIENT_VTOOL) - const bool is_grd = (gradient.vtool_index == -1 || selected_vtool == (uint8_t)gradient.vtool_index); - #else - constexpr bool is_grd = true; - #endif - gradient.enabled = is_grd && gradient.start_vtool != gradient.end_vtool && gradient.start_z < gradient.end_z; - if (gradient.enabled) { - mixer_perc_t mix_bak[MIXING_STEPPERS]; - COPY(mix_bak, mix); - update_mix_from_vtool(gradient.start_vtool); - COPY(gradient.start_mix, mix); - update_mix_from_vtool(gradient.end_vtool); - COPY(gradient.end_mix, mix); - update_gradient_for_planner_z(); - COPY(mix, mix_bak); - prev_z = -1; - } - } - - #endif // GRADIENT_MIX - - // Used in Stepper - FORCE_INLINE static uint8_t get_stepper() { return runner; } - FORCE_INLINE static uint8_t get_next_stepper() { - for (;;) { - if (--runner < 0) runner = MIXING_STEPPERS - 1; - accu[runner] += s_color[runner]; - if ( - #ifdef MIXER_ACCU_SIGNED - accu[runner] < 0 - #else - accu[runner] & COLOR_A_MASK - #endif - ) { - accu[runner] &= COLOR_MASK; - return runner; - } - } - } - - private: - - // Used up to Planner level - static uint_fast8_t selected_vtool; - static mixer_comp_t color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; - - // Used in Stepper - static int_fast8_t runner; - static mixer_comp_t s_color[MIXING_STEPPERS]; - static mixer_accu_t accu[MIXING_STEPPERS]; -}; - -extern Mixer mixer; +#endif // __MIXING_H__ diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp deleted file mode 100644 index 3d635369e4..0000000000 --- a/Marlin/src/feature/mmu2/mmu2.cpp +++ /dev/null @@ -1,1068 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(PRUSA_MMU2) - -#include "mmu2.h" -#include "../../lcd/menu/menu_mmu2.h" - -MMU2 mmu2; - -#include "../../gcode/gcode.h" -#include "../../lcd/ultralcd.h" -#include "../../libs/buzzer.h" -#include "../../libs/nozzle.h" -#include "../../module/temperature.h" -#include "../../module/planner.h" -#include "../../module/stepper/indirection.h" -#include "../../MarlinCore.h" - -#if ENABLED(HOST_PROMPT_SUPPORT) - #include "../../feature/host_actions.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../../lcd/extui/ui_api.h" -#endif - -#define DEBUG_OUT ENABLED(MMU2_DEBUG) -#include "../../core/debug_out.h" - -#define MMU_TODELAY 100 -#define MMU_TIMEOUT 10 -#define MMU_CMD_TIMEOUT 45000UL // 45s timeout for mmu commands (except P0) -#define MMU_P0_TIMEOUT 3000UL // Timeout for P0 command: 3seconds - -#define MMU2_COMMAND(S) tx_str_P(PSTR(S "\n")) - -#if ENABLED(MMU_EXTRUDER_SENSOR) - uint8_t mmu_idl_sens = 0; - static bool mmu_loading_flag = false; -#endif - -#define MMU_CMD_NONE 0 -#define MMU_CMD_T0 0x10 -#define MMU_CMD_T1 0x11 -#define MMU_CMD_T2 0x12 -#define MMU_CMD_T3 0x13 -#define MMU_CMD_T4 0x14 -#define MMU_CMD_L0 0x20 -#define MMU_CMD_L1 0x21 -#define MMU_CMD_L2 0x22 -#define MMU_CMD_L3 0x23 -#define MMU_CMD_L4 0x24 -#define MMU_CMD_C0 0x30 -#define MMU_CMD_U0 0x40 -#define MMU_CMD_E0 0x50 -#define MMU_CMD_E1 0x51 -#define MMU_CMD_E2 0x52 -#define MMU_CMD_E3 0x53 -#define MMU_CMD_E4 0x54 -#define MMU_CMD_R0 0x60 -#define MMU_CMD_F0 0x70 -#define MMU_CMD_F1 0x71 -#define MMU_CMD_F2 0x72 -#define MMU_CMD_F3 0x73 -#define MMU_CMD_F4 0x74 - -#define MMU_REQUIRED_FW_BUILDNR TERN(MMU2_MODE_12V, 132, 126) - -#define MMU2_NO_TOOL 99 -#define MMU_BAUD 115200 - -#define mmuSerial MMU2_SERIAL - -bool MMU2::enabled, MMU2::ready, MMU2::mmu_print_saved; -#if ENABLED(PRUSA_MMU2_S_MODE) - bool MMU2::mmu2s_triggered; -#endif -uint8_t MMU2::cmd, MMU2::cmd_arg, MMU2::last_cmd, MMU2::extruder; -int8_t MMU2::state = 0; -volatile int8_t MMU2::finda = 1; -volatile bool MMU2::finda_runout_valid; -int16_t MMU2::version = -1, MMU2::buildnr = -1; -millis_t MMU2::prev_request, MMU2::prev_P0_request; -char MMU2::rx_buffer[MMU_RX_SIZE], MMU2::tx_buffer[MMU_TX_SIZE]; - -#if BOTH(HAS_LCD_MENU, MMU2_MENUS) - - struct E_Step { - float extrude; //!< extrude distance in mm - feedRate_t feedRate; //!< feed rate in mm/s - }; - - static constexpr E_Step - ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE } - , load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE } - #if ENABLED(PRUSA_MMU2_S_MODE) - , can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE } - , can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE } - #endif - ; - -#endif // MMU2_MENUS - -MMU2::MMU2() { - rx_buffer[0] = '\0'; -} - -void MMU2::init() { - - set_runout_valid(false); - - #if PIN_EXISTS(MMU2_RST) - // TODO use macros for this - WRITE(MMU2_RST_PIN, HIGH); - SET_OUTPUT(MMU2_RST_PIN); - #endif - - mmuSerial.begin(MMU_BAUD); - extruder = MMU2_NO_TOOL; - - safe_delay(10); - reset(); - rx_buffer[0] = '\0'; - state = -1; -} - -void MMU2::reset() { - DEBUG_ECHOLNPGM("MMU <= reset"); - - #if PIN_EXISTS(MMU2_RST) - WRITE(MMU2_RST_PIN, LOW); - safe_delay(20); - WRITE(MMU2_RST_PIN, HIGH); - #else - MMU2_COMMAND("X0"); // Send soft reset - #endif -} - -uint8_t MMU2::get_current_tool() { - return extruder == MMU2_NO_TOOL ? -1 : extruder; -} - -#if EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) - #define FILAMENT_PRESENT() (READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE) -#endif - -void MMU2::mmu_loop() { - - switch (state) { - - case 0: break; - - case -1: - if (rx_start()) { - DEBUG_ECHOLNPGM("MMU => 'start'"); - DEBUG_ECHOLNPGM("MMU <= 'S1'"); - - MMU2_COMMAND("S1"); // Read Version - state = -2; - } - else if (millis() > 3000000) { - SERIAL_ECHOLNPGM("MMU not responding - DISABLED"); - state = 0; - } - break; - - case -2: - if (rx_ok()) { - sscanf(rx_buffer, "%uok\n", &version); - - DEBUG_ECHOLNPAIR("MMU => ", version, "\nMMU <= 'S2'"); - - MMU2_COMMAND("S2"); // Read Build Number - state = -3; - } - break; - - case -3: - if (rx_ok()) { - sscanf(rx_buffer, "%uok\n", &buildnr); - - DEBUG_ECHOLNPAIR("MMU => ", buildnr); - - check_version(); - - #if ENABLED(MMU2_MODE_12V) - DEBUG_ECHOLNPGM("MMU <= 'M1'"); - - MMU2_COMMAND("M1"); // Stealth Mode - state = -5; - - #else - DEBUG_ECHOLNPGM("MMU <= 'P0'"); - - MMU2_COMMAND("P0"); // Read FINDA - state = -4; - #endif - } - break; - - #if ENABLED(MMU2_MODE_12V) - case -5: - // response to M1 - if (rx_ok()) { - DEBUG_ECHOLNPGM("MMU => ok"); - - DEBUG_ECHOLNPGM("MMU <= 'P0'"); - - MMU2_COMMAND("P0"); // Read FINDA - state = -4; - } - break; - #endif - - case -4: - if (rx_ok()) { - sscanf(rx_buffer, "%hhuok\n", &finda); - - DEBUG_ECHOLNPAIR("MMU => ", finda, "\nMMU - ENABLED"); - - enabled = true; - state = 1; - TERN_(PRUSA_MMU2_S_MODE, mmu2s_triggered = false); - } - break; - - case 1: - if (cmd) { - if (WITHIN(cmd, MMU_CMD_T0, MMU_CMD_T4)) { - // tool change - int filament = cmd - MMU_CMD_T0; - DEBUG_ECHOLNPAIR("MMU <= T", filament); - tx_printf_P(PSTR("T%d\n"), filament); - TERN_(MMU_EXTRUDER_SENSOR, mmu_idl_sens = 1); // enable idler sensor, if any - state = 3; // wait for response - } - else if (WITHIN(cmd, MMU_CMD_L0, MMU_CMD_L4)) { - // load - int filament = cmd - MMU_CMD_L0; - DEBUG_ECHOLNPAIR("MMU <= L", filament); - tx_printf_P(PSTR("L%d\n"), filament); - state = 3; // wait for response - } - else if (cmd == MMU_CMD_C0) { - // continue loading - DEBUG_ECHOLNPGM("MMU <= 'C0'"); - MMU2_COMMAND("C0"); - state = 3; // wait for response - } - else if (cmd == MMU_CMD_U0) { - // unload current - DEBUG_ECHOLNPGM("MMU <= 'U0'"); - - MMU2_COMMAND("U0"); - state = 3; // wait for response - } - else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E4)) { - // eject filament - int filament = cmd - MMU_CMD_E0; - DEBUG_ECHOLNPAIR("MMU <= E", filament); - tx_printf_P(PSTR("E%d\n"), filament); - state = 3; // wait for response - } - else if (cmd == MMU_CMD_R0) { - // recover after eject - DEBUG_ECHOLNPGM("MMU <= 'R0'"); - MMU2_COMMAND("R0"); - state = 3; // wait for response - } - else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) { - // filament type - int filament = cmd - MMU_CMD_F0; - DEBUG_ECHOPAIR("MMU <= F", filament, " "); - DEBUG_ECHO_F(cmd_arg, DEC); - DEBUG_EOL(); - tx_printf_P(PSTR("F%d %d\n"), filament, cmd_arg); - state = 3; // wait for response - } - - last_cmd = cmd; - cmd = MMU_CMD_NONE; - } - else if (ELAPSED(millis(), prev_P0_request + 300)) { - MMU2_COMMAND("P0"); // Read FINDA - state = 2; // wait for response - } - - TERN_(PRUSA_MMU2_S_MODE, check_filament()); - break; - - case 2: // response to command P0 - if (rx_ok()) { - sscanf(rx_buffer, "%hhuok\n", &finda); - - // This is super annoying. Only activate if necessary - // if (finda_runout_valid) DEBUG_ECHOLNPAIR_F("MMU <= 'P0'\nMMU => ", finda, 6); - - if (!finda && finda_runout_valid) filament_runout(); - if (cmd == 0) ready = true; - state = 1; - } - else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s) - state = 1; - - TERN_(PRUSA_MMU2_S_MODE, check_filament()); - break; - - case 3: // response to mmu commands - #if ENABLED(MMU_EXTRUDER_SENSOR) - if (mmu_idl_sens) { - if (FILAMENT_PRESENT() && mmu_loading_flag) { - DEBUG_ECHOLNPGM("MMU <= 'A'"); - MMU2_COMMAND("A"); // send 'abort' request - mmu_idl_sens = 0; - DEBUG_ECHOLNPGM("MMU IDLER_SENSOR = 0 - ABORT"); - } - } - #endif - - if (rx_ok()) { - // Response to C0 mmu command in PRUSA_MMU2_S_MODE - bool can_reset = true; - #if ENABLED(PRUSA_MMU2_S_MODE) - if (!mmu2s_triggered && last_cmd == MMU_CMD_C0) { - can_reset = false; - // MMU ok received but filament sensor not triggered, retrying... - DEBUG_ECHOLNPGM("MMU => 'ok' (filament not present in gears)"); - DEBUG_ECHOLNPGM("MMU <= 'C0' (keep trying)"); - MMU2_COMMAND("C0"); - } - #endif - if (can_reset) { - DEBUG_ECHOLNPGM("MMU => 'ok'"); - ready = true; - state = 1; - last_cmd = MMU_CMD_NONE; - } - } - else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) { - // resend request after timeout - if (last_cmd) { - DEBUG_ECHOLNPGM("MMU retry"); - cmd = last_cmd; - last_cmd = MMU_CMD_NONE; - } - state = 1; - } - TERN_(PRUSA_MMU2_S_MODE, check_filament()); - break; - } -} - -/** - * Check if MMU was started - */ -bool MMU2::rx_start() { - // check for start message - if (rx_str_P(PSTR("start\n"))) { - prev_P0_request = millis(); - return true; - } - return false; -} - -/** - * Check if the data received ends with the given string. - */ -bool MMU2::rx_str_P(const char* str) { - uint8_t i = strlen(rx_buffer); - - while (mmuSerial.available()) { - rx_buffer[i++] = mmuSerial.read(); - rx_buffer[i] = '\0'; - - if (i == sizeof(rx_buffer) - 1) { - DEBUG_ECHOLNPGM("rx buffer overrun"); - break; - } - } - - uint8_t len = strlen_P(str); - - if (i < len) return false; - - str += len; - - while (len--) { - char c0 = pgm_read_byte(str--), c1 = rx_buffer[i--]; - if (c0 == c1) continue; - if (c0 == '\r' && c1 == '\n') continue; // match cr as lf - if (c0 == '\n' && c1 == '\r') continue; // match lf as cr - return false; - } - return true; -} - -/** - * Transfer data to MMU, no argument - */ -void MMU2::tx_str_P(const char* str) { - clear_rx_buffer(); - uint8_t len = strlen_P(str); - LOOP_L_N(i, len) mmuSerial.write(pgm_read_byte(str++)); - rx_buffer[0] = '\0'; - prev_request = millis(); -} - -/** - * Transfer data to MMU, single argument - */ -void MMU2::tx_printf_P(const char* format, int argument = -1) { - clear_rx_buffer(); - uint8_t len = sprintf_P(tx_buffer, format, argument); - LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]); - rx_buffer[0] = '\0'; - prev_request = millis(); -} - -/** - * Transfer data to MMU, two arguments - */ -void MMU2::tx_printf_P(const char* format, int argument1, int argument2) { - clear_rx_buffer(); - uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2); - LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]); - rx_buffer[0] = '\0'; - prev_request = millis(); -} - -/** - * Empty the rx buffer - */ -void MMU2::clear_rx_buffer() { - while (mmuSerial.available()) mmuSerial.read(); - rx_buffer[0] = '\0'; -} - -/** - * Check if we received 'ok' from MMU - */ -bool MMU2::rx_ok() { - if (rx_str_P(PSTR("ok\n"))) { - prev_P0_request = millis(); - return true; - } - return false; -} - -/** - * Check if MMU has compatible firmware - */ -void MMU2::check_version() { - if (buildnr < MMU_REQUIRED_FW_BUILDNR) { - SERIAL_ERROR_MSG("Invalid MMU2 firmware. Version >= " STRINGIFY(MMU_REQUIRED_FW_BUILDNR) " required."); - kill(GET_TEXT(MSG_KILL_MMU2_FIRMWARE)); - } -} - -static void mmu2_not_responding() { - LCD_MESSAGEPGM(MSG_MMU2_NOT_RESPONDING); - BUZZ(100, 659); - BUZZ(200, 698); - BUZZ(100, 659); - BUZZ(300, 440); - BUZZ(100, 659); -} - -#if ENABLED(PRUSA_MMU2_S_MODE) - - bool MMU2::load_to_gears() { - command(MMU_CMD_C0); - manage_response(true, true); - LOOP_L_N(i, MMU2_C0_RETRY) { // Keep loading until filament reaches gears - if (mmu2s_triggered) break; - command(MMU_CMD_C0); - manage_response(true, true); - check_filament(); - } - const bool success = mmu2s_triggered && can_load(); - if (!success) mmu2_not_responding(); - return success; - } - - /** - * Handle tool change - */ - void MMU2::tool_change(const uint8_t index) { - - if (!enabled) return; - - set_runout_valid(false); - - if (index != extruder) { - - DISABLE_AXIS_E0(); - ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); - - command(MMU_CMD_T0 + index); - manage_response(true, true); - - if (load_to_gears()) { - extruder = index; // filament change is finished - active_extruder = 0; - ENABLE_AXIS_E0(); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); - } - ui.reset_status(); - } - - set_runout_valid(true); - } - - /** - * Handle special T?/Tx/Tc commands - * - * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically - * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. - * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. - */ - void MMU2::tool_change(const char* special) { - - if (!enabled) return; - - #if ENABLED(MMU2_MENUS) - - set_runout_valid(false); - - switch (*special) { - case '?': { - uint8_t index = mmu2_choose_filament(); - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - load_filament_to_nozzle(index); - } break; - - case 'x': { - planner.synchronize(); - uint8_t index = mmu2_choose_filament(); - DISABLE_AXIS_E0(); - command(MMU_CMD_T0 + index); - manage_response(true, true); - - if (load_to_gears()) { - mmu_loop(); - ENABLE_AXIS_E0(); - extruder = index; - active_extruder = 0; - } - } break; - - case 'c': { - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); - } break; - } - - set_runout_valid(true); - - #endif // MMU2_MENUS - } - -#elif ENABLED(MMU_EXTRUDER_SENSOR) - - /** - * Handle tool change - */ - void MMU2::tool_change(const uint8_t index) { - if (!enabled) return; - - set_runout_valid(false); - - if (index != extruder) { - DISABLE_AXIS_E0(); - if (FILAMENT_PRESENT()) { - DEBUG_ECHOLNPGM("Unloading\n"); - mmu_loading_flag = false; - command(MMU_CMD_U0); - manage_response(true, true); - } - ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); - mmu_loading_flag = true; - command(MMU_CMD_T0 + index); - manage_response(true, true); - mmu_continue_loading(); - command(MMU_CMD_C0); - extruder = index; - active_extruder = 0; - - ENABLE_AXIS_E0(); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); - - ui.reset_status(); - } - - set_runout_valid(true); - } - - /** - * Handle special T?/Tx/Tc commands - * - * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically - * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. - * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. - */ - void MMU2::tool_change(const char* special) { - if (!enabled) return; - - #if ENABLED(MMU2_MENUS) - - set_runout_valid(false); - - switch (*special) { - case '?': { - DEBUG_ECHOLNPGM("case ?\n"); - uint8_t index = mmu2_choose_filament(); - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - load_filament_to_nozzle(index); - } break; - - case 'x': { - DEBUG_ECHOLNPGM("case x\n"); - planner.synchronize(); - uint8_t index = mmu2_choose_filament(); - DISABLE_AXIS_E0(); - command(MMU_CMD_T0 + index); - manage_response(true, true); - mmu_continue_loading(); - command(MMU_CMD_C0); - mmu_loop(); - - ENABLE_AXIS_E0(); - extruder = index; - active_extruder = 0; - } break; - - case 'c': { - DEBUG_ECHOLNPGM("case c\n"); - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); - } break; - } - - set_runout_valid(true); - - #endif // MMU2_MENUS - } - - void MMU2::mmu_continue_loading() { - for (uint8_t i = 0; i < MMU_LOADING_ATTEMPTS_NR; i++) { - DEBUG_ECHOLNPAIR("Additional load attempt #", i); - if (FILAMENT_PRESENT()) break; - command(MMU_CMD_C0); - manage_response(true, true); - } - if (!FILAMENT_PRESENT()) { - DEBUG_ECHOLNPGM("Filament never reached sensor, runout"); - filament_runout(); - } - mmu_idl_sens = 0; - } - -#elif DISABLED(MMU_EXTRUDER_SENSOR) && DISABLED(PRUSA_MMU2_S_MODE) - -/** - * Handle tool change - */ -void MMU2::tool_change(const uint8_t index) { - if (!enabled) return; - - set_runout_valid(false); - - if (index != extruder) { - DISABLE_AXIS_E0(); - ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); - command(MMU_CMD_T0 + index); - manage_response(true, true); - command(MMU_CMD_C0); - extruder = index; //filament change is finished - active_extruder = 0; - ENABLE_AXIS_E0(); - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); - ui.reset_status(); - } - - set_runout_valid(true); -} - -/** - * Handle special T?/Tx/Tc commands - * - * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically - * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. - * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. - */ -void MMU2::tool_change(const char* special) { - if (!enabled) return; - - #if ENABLED(MMU2_MENUS) - - set_runout_valid(false); - - switch (*special) { - case '?': { - DEBUG_ECHOLNPGM("case ?\n"); - uint8_t index = mmu2_choose_filament(); - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - load_filament_to_nozzle(index); - } break; - - case 'x': { - DEBUG_ECHOLNPGM("case x\n"); - planner.synchronize(); - uint8_t index = mmu2_choose_filament(); - DISABLE_AXIS_E0(); - command(MMU_CMD_T0 + index); - manage_response(true, true); - command(MMU_CMD_C0); - mmu_loop(); - - ENABLE_AXIS_E0(); - extruder = index; - active_extruder = 0; - } break; - - case 'c': { - DEBUG_ECHOLNPGM("case c\n"); - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); - } break; - } - - set_runout_valid(true); - - #endif - } - -#endif // MMU_EXTRUDER_SENSOR - -/** - * Set next command - */ -void MMU2::command(const uint8_t mmu_cmd) { - if (!enabled) return; - cmd = mmu_cmd; - ready = false; -} - -/** - * Wait for response from MMU - */ -bool MMU2::get_response() { - while (cmd != MMU_CMD_NONE) idle(); - - while (!ready) { - idle(); - if (state != 3) break; - } - - const bool ret = ready; - ready = false; - - return ret; -} - -/** - * Wait for response and deal with timeout if nexcessary - */ -void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { - - constexpr xyz_pos_t park_point = NOZZLE_PARK_POINT; - bool response = false; - mmu_print_saved = false; - xyz_pos_t resume_position; - int16_t resume_hotend_temp = thermalManager.degTargetHotend(active_extruder); - - KEEPALIVE_STATE(PAUSED_FOR_USER); - - while (!response) { - - response = get_response(); // wait for "ok" from mmu - - if (!response) { // No "ok" was received in reserved time frame, user will fix the issue on mmu unit - if (!mmu_print_saved) { // First occurrence. Save current position, park print head, disable nozzle heater. - - planner.synchronize(); - - mmu_print_saved = true; - - SERIAL_ECHOLNPGM("MMU not responding"); - - resume_hotend_temp = thermalManager.degTargetHotend(active_extruder); - resume_position = current_position; - - if (move_axes && all_axes_homed()) - nozzle.park(0, park_point /*= NOZZLE_PARK_POINT*/); - - if (turn_off_nozzle) thermalManager.setTargetHotend(0, active_extruder); - - mmu2_not_responding(); - } - } - else if (mmu_print_saved) { - SERIAL_ECHOLNPGM("MMU starts responding\n"); - - if (turn_off_nozzle && resume_hotend_temp) { - thermalManager.setTargetHotend(resume_hotend_temp, active_extruder); - LCD_MESSAGEPGM(MSG_HEATING); - BUZZ(200, 40); - - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(1000); - } - - if (move_axes && all_axes_homed()) { - LCD_MESSAGEPGM(MSG_MMU2_RESUMING); - BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404); - - // Move XY to starting position, then Z - do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); - - // Move Z_AXIS to saved position - do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); - } - else { - BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404); - LCD_MESSAGEPGM(MSG_MMU2_RESUMING); - } - } - } -} - -void MMU2::set_filament_type(const uint8_t index, const uint8_t filamentType) { - if (!enabled) return; - - cmd_arg = filamentType; - command(MMU_CMD_F0 + index); - - manage_response(true, true); -} - -void MMU2::filament_runout() { - queue.inject_P(PSTR(MMU2_FILAMENT_RUNOUT_SCRIPT)); - planner.synchronize(); -} - -#if ENABLED(PRUSA_MMU2_S_MODE) - - void MMU2::check_filament() { - const bool present = FILAMENT_PRESENT(); - if (cmd == MMU_CMD_NONE && last_cmd == MMU_CMD_C0) { - if (present && !mmu2s_triggered) { - DEBUG_ECHOLNPGM("MMU <= 'A'"); - tx_str_P(PSTR("A\n")); - } - // Slowly spin the extruder during C0 - else { - while (planner.movesplanned() < 3) { - current_position.e += 0.25; - line_to_current_position(MMM_TO_MMS(120)); - } - } - } - mmu2s_triggered = present; - } - - bool MMU2::can_load() { - execute_extruder_sequence((const E_Step *)can_load_sequence, COUNT(can_load_sequence)); - - int filament_detected_count = 0; - const int steps = (MMU2_CAN_LOAD_RETRACT) / (MMU2_CAN_LOAD_INCREMENT); - DEBUG_ECHOLNPGM("MMU can_load:"); - LOOP_L_N(i, steps) { - execute_extruder_sequence((const E_Step *)can_load_increment_sequence, COUNT(can_load_increment_sequence)); - check_filament(); // Don't trust the idle function - DEBUG_CHAR(mmu2s_triggered ? 'O' : 'o'); - if (mmu2s_triggered) ++filament_detected_count; - } - - if (filament_detected_count <= steps - (MMU2_CAN_LOAD_DEVIATION) / (MMU2_CAN_LOAD_INCREMENT)) { - DEBUG_ECHOLNPGM(" failed."); - return false; - } - - DEBUG_ECHOLNPGM(" succeeded."); - return true; - } -#endif - -#if BOTH(HAS_LCD_MENU, MMU2_MENUS) - - // Load filament into MMU2 - void MMU2::load_filament(const uint8_t index) { - if (!enabled) return; - command(MMU_CMD_L0 + index); - manage_response(false, false); - BUZZ(200, 404); - } - - /** - * Switch material and load to nozzle - */ - bool MMU2::load_filament_to_nozzle(const uint8_t index) { - - if (!enabled) return false; - - if (thermalManager.tooColdToExtrude(active_extruder)) { - BUZZ(200, 404); - LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); - return false; - } - - command(MMU_CMD_T0 + index); - manage_response(true, true); - - const bool success = load_to_gears(); - if (success) { - mmu_loop(); - extruder = index; - active_extruder = 0; - load_to_nozzle(); - BUZZ(200, 404); - } - return success; - } - - /** - * Load filament to nozzle of multimaterial printer - * - * This function is used only only after T? (user select filament) and M600 (change filament). - * It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading - * filament to nozzle. - */ - void MMU2::load_to_nozzle() { - if (!enabled) return; - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); - } - - bool MMU2::eject_filament(const uint8_t index, const bool recover) { - - if (!enabled) return false; - - if (thermalManager.tooColdToExtrude(active_extruder)) { - BUZZ(200, 404); - LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); - return false; - } - - LCD_MESSAGEPGM(MSG_MMU2_EJECTING_FILAMENT); - - ENABLE_AXIS_E0(); - current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED; - line_to_current_position(2500 / 60); - planner.synchronize(); - command(MMU_CMD_E0 + index); - manage_response(false, false); - - if (recover) { - LCD_MESSAGEPGM(MSG_MMU2_EJECT_RECOVER); - BUZZ(200, 404); - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("MMU2 Eject Recover"), CONTINUE_STR)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("MMU2 Eject Recover"))); - wait_for_user_response(); - BUZZ(200, 404); - BUZZ(200, 404); - - command(MMU_CMD_R0); - manage_response(false, false); - } - - ui.reset_status(); - - // no active tool - extruder = MMU2_NO_TOOL; - - set_runout_valid(false); - - BUZZ(200, 404); - - DISABLE_AXIS_E0(); - - return true; - } - - /** - * Unload from hotend and retract to MMU - */ - bool MMU2::unload() { - - if (!enabled) return false; - - if (thermalManager.tooColdToExtrude(active_extruder)) { - BUZZ(200, 404); - LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); - return false; - } - - filament_ramming(); - - command(MMU_CMD_U0); - manage_response(false, true); - - BUZZ(200, 404); - - // no active tool - extruder = MMU2_NO_TOOL; - - set_runout_valid(false); - - return true; - } - - /** - * Unload sequence to optimize shape of the tip of the unloaded filament - */ - void MMU2::filament_ramming() { - execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); - } - - void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) { - - planner.synchronize(); - ENABLE_AXIS_E0(); - - const E_Step* step = sequence; - - LOOP_L_N(i, steps) { - const float es = pgm_read_float(&(step->extrude)); - const feedRate_t fr_mm_m = pgm_read_float(&(step->feedRate)); - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("E step ", es, "/", fr_mm_m); - - current_position.e += es; - line_to_current_position(MMM_TO_MMS(fr_mm_m)); - planner.synchronize(); - - step++; - } - - DISABLE_AXIS_E0(); - } - -#endif // HAS_LCD_MENU && MMU2_MENUS - -#endif // PRUSA_MMU2 diff --git a/Marlin/src/feature/mmu2/mmu2.h b/Marlin/src/feature/mmu2/mmu2.h deleted file mode 100644 index 678f65d072..0000000000 --- a/Marlin/src/feature/mmu2/mmu2.h +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfig.h" - -#if HAS_FILAMENT_SENSOR - #include "../runout.h" -#endif - -#if SERIAL_USB - #define MMU_RX_SIZE 256 - #define MMU_TX_SIZE 256 -#else - #define MMU_RX_SIZE 16 - #define MMU_TX_SIZE 16 -#endif - -struct E_Step; - -class MMU2 { -public: - MMU2(); - - static void init(); - static void reset(); - static void mmu_loop(); - static void tool_change(const uint8_t index); - static void tool_change(const char* special); - static uint8_t get_current_tool(); - static void set_filament_type(const uint8_t index, const uint8_t type); - - #if BOTH(HAS_LCD_MENU, MMU2_MENUS) - static bool unload(); - static void load_filament(uint8_t); - static void load_all(); - static bool load_filament_to_nozzle(const uint8_t index); - static bool eject_filament(const uint8_t index, const bool recover); - #endif - -private: - static bool rx_str_P(const char* str); - static void tx_str_P(const char* str); - static void tx_printf_P(const char* format, const int argument); - static void tx_printf_P(const char* format, const int argument1, const int argument2); - static void clear_rx_buffer(); - - static bool rx_ok(); - static bool rx_start(); - static void check_version(); - - static void command(const uint8_t cmd); - static bool get_response(); - static void manage_response(const bool move_axes, const bool turn_off_nozzle); - - #if BOTH(HAS_LCD_MENU, MMU2_MENUS) - static void load_to_nozzle(); - static void filament_ramming(); - static void execute_extruder_sequence(const E_Step * sequence, int steps); - #endif - - static void filament_runout(); - - #if ENABLED(PRUSA_MMU2_S_MODE) - static bool mmu2s_triggered; - static void check_filament(); - static bool can_load(); - static bool load_to_gears(); - #else - FORCE_INLINE static bool load_to_gears() { return true; } - #endif - - #if ENABLED(MMU_EXTRUDER_SENSOR) - static void mmu_continue_loading(); - #endif - - static bool enabled, ready, mmu_print_saved; - - static uint8_t cmd, cmd_arg, last_cmd, extruder; - static int8_t state; - static volatile int8_t finda; - static volatile bool finda_runout_valid; - static int16_t version, buildnr; - static millis_t prev_request, prev_P0_request; - static char rx_buffer[MMU_RX_SIZE], tx_buffer[MMU_TX_SIZE]; - - static inline void set_runout_valid(const bool valid) { - finda_runout_valid = valid; - #if HAS_FILAMENT_SENSOR - if (valid) runout.reset(); - #endif - } - -}; - -extern MMU2 mmu2; diff --git a/Marlin/src/feature/mmu2/serial-protocol.md b/Marlin/src/feature/mmu2/serial-protocol.md deleted file mode 100644 index 936830e1dc..0000000000 --- a/Marlin/src/feature/mmu2/serial-protocol.md +++ /dev/null @@ -1,94 +0,0 @@ -Startup sequence -================ - -When initialized, MMU sends - -- MMU => 'start\n' - -We follow with - -- MMU <= 'S1\n' -- MMU => 'ok*Firmware version*\n' -- MMU <= 'S2\n' -- MMU => 'ok*Build number*\n' - -#if (12V_mode) - -- MMU <= 'M1\n' -- MMU => 'ok\n' - -#endif - -- MMU <= 'P0\n' -- MMU => '*FINDA status*\n' - -Now we are sure MMU is available and ready. If there was a timeout or other communication problem somewhere, printer will be killed. - -- *Firmware version* is an integer value, but we don't care about it -- *Build number* is an integer value and has to be >=126, or =>132 if 12V mode is enabled -- *FINDA status* is 1 if the is filament loaded to the extruder, 0 otherwise - - -*Build number* is checked against the required value, if it does not match, printer is halted. - - - -Toolchange -========== - -- MMU <= 'T*Filament index*\n' - -MMU sends - -- MMU => 'ok\n' - -as soon as the filament is fed down to the extruder. We follow with - -- MMU <= 'C0\n' - -MMU will feed a few more millimeters of filament for the extruder gears to grab. -When done, the MMU sends - -- MMU => 'ok\n' - -We don't wait for a response here but immediately continue with the next gcode which should -be one or more extruder moves to feed the filament into the hotend. - - -FINDA status -============ - -- MMU <= 'P0\n' -- MMU => '*FINDA status*\n' - -*FINDA status* is 1 if the is filament loaded to the extruder, 0 otherwise. This could be used as filament runout sensor if probed regularly. - - - -Load filament -============= - -- MMU <= 'L*Filament index*\n' - -MMU will feed filament down to the extruder, when done - -- MMU => 'ok\n' - - -Unload filament -============= - -- MMU <= 'U0\n' - -MMU will retract current filament from the extruder, when done - -- MMU => 'ok\n' - - - -Eject filament -============== - -- MMU <= 'E*Filament index*\n' -- MMU => 'ok\n' - diff --git a/Marlin/src/feature/password/password.cpp b/Marlin/src/feature/password/password.cpp deleted file mode 100644 index 90bb647118..0000000000 --- a/Marlin/src/feature/password/password.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(PASSWORD_FEATURE) - -#include "password.h" -#include "../../gcode/gcode.h" -#include "../../core/serial.h" - -Password password; - -// public: -bool Password::is_set, Password::is_locked; -uint32_t Password::value, Password::value_entry; - -// -// Authenticate user with password. -// Called from Setup, after SD Prinitng Stops/Aborts, and M510 -// -void Password::lock_machine() { - is_locked = true; - TERN_(HAS_LCD_MENU, authenticate_user(ui.status_screen, screen_password_entry)); -} - -// -// Authentication check -// -void Password::authentication_check() { - if (value_entry == value) - is_locked = false; - else - SERIAL_ECHOLNPGM(STR_WRONG_PASSWORD); - - TERN_(HAS_LCD_MENU, authentication_done()); -} - -#endif // PASSWORD_FEATURE diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h deleted file mode 100644 index 3ed584b29d..0000000000 --- a/Marlin/src/feature/password/password.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../lcd/ultralcd.h" - -class Password { -public: - static bool is_set, is_locked; - static uint32_t value, value_entry; - - Password() { is_locked = false; } - - static void lock_machine(); - - #if HAS_LCD_MENU - static void access_menu_password(); - static void authentication_check(); - static void authentication_done(); - static void media_gatekeeper(); - - private: - static void authenticate_user(const screenFunc_t, const screenFunc_t); - static void menu_password(); - static void menu_password_entry(); - static void screen_password_entry(); - static void screen_set_password(); - static void start_over(); - - static void digit_entered(); - static void set_password_done(); - static void menu_password_report(); - - static void remove_password(); - #endif -}; - -extern Password password; diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 0ab6594021..62e66122ef 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,13 +25,11 @@ * This may be combined with related G-codes if features are consolidated. */ -#include "../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfig.h" #if ENABLED(ADVANCED_PAUSE_FEATURE) -//#define DEBUG_PAUSE_RESUME - -#include "../MarlinCore.h" +#include "../Marlin.h" #include "../gcode/gcode.h" #include "../module/motion.h" #include "../module/planner.h" @@ -40,83 +38,50 @@ #include "../module/temperature.h" #if ENABLED(FWRETRACT) - #include "fwretract.h" + #include "../feature/fwretract.h" #endif -#if HAS_FILAMENT_SENSOR - #include "runout.h" +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #include "../feature/runout.h" #endif -#if ENABLED(HOST_ACTION_COMMANDS) - #include "host_actions.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif - -#include "../lcd/ultralcd.h" - -#if HAS_BUZZER - #include "../libs/buzzer.h" -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "powerloss.h" +#if ENABLED(ULTIPANEL) + #include "../lcd/ultralcd.h" #endif +#include "../libs/buzzer.h" #include "../libs/nozzle.h" #include "pause.h" -#define DEBUG_OUT ENABLED(DEBUG_PAUSE_RESUME) -#include "../core/debug_out.h" - // private: -static xyze_pos_t resume_position; +static float resume_position[XYZE]; -#if HAS_LCD_MENU - PauseMenuResponse pause_menu_response; - PauseMode pause_mode = PAUSE_MODE_PAUSE_PRINT; -#endif +AdvancedPauseMenuResponse advanced_pause_menu_response; -fil_change_settings_t fc_settings[EXTRUDERS]; +float filament_change_unload_length[EXTRUDERS], + filament_change_load_length[EXTRUDERS]; #if ENABLED(SDSUPPORT) #include "../sd/cardreader.h" #endif -#if ENABLED(EMERGENCY_PARSER) - #define _PMSG(L) L##_M108 -#else - #define _PMSG(L) L##_LCD -#endif - #if HAS_BUZZER - static void impatient_beep(const int8_t max_beep_count, const bool restart=false) { - - if (TERN0(HAS_LCD_MENU, pause_mode == PAUSE_MODE_PAUSE_PRINT)) return; - + static void filament_change_beep(const int8_t max_beep_count, const bool init=false) { static millis_t next_buzz = 0; static int8_t runout_beep = 0; - if (restart) next_buzz = runout_beep = 0; - - const bool always = max_beep_count < 0; + if (init) next_buzz = runout_beep = 0; const millis_t ms = millis(); if (ELAPSED(ms, next_buzz)) { - if (always || runout_beep < max_beep_count + 5) { // Only beep as long as we're supposed to - next_buzz = ms + ((always || runout_beep < max_beep_count) ? 1000 : 500); + if (max_beep_count < 0 || runout_beep < max_beep_count + 5) { // Only beep as long as we're supposed to + next_buzz = ms + ((max_beep_count < 0 || runout_beep < max_beep_count) ? 1000 : 500); BUZZ(50, 880 - (runout_beep & 1) * 220); runout_beep++; } } } - inline void first_impatient_beep(const int8_t max_beep_count) { impatient_beep(max_beep_count, true); } -#else - inline void impatient_beep(const int8_t, const bool=false) {} - inline void first_impatient_beep(const int8_t) {} #endif /** @@ -128,35 +93,36 @@ fil_change_settings_t fc_settings[EXTRUDERS]; * * Returns 'true' if heating was completed, 'false' for abort */ -static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=PAUSE_MODE_SAME) { - DEBUG_SECTION(est, "ensure_safe_temperature", true); - DEBUG_ECHOLNPAIR("... wait:", int(wait), " mode:", int(mode)); - - if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder); - - #if HAS_LCD_MENU - lcd_pause_show_message(PAUSE_MESSAGE_HEATING, mode); - #endif - UNUSED(mode); - - if (wait) - return thermalManager.wait_for_hotend(active_extruder); - - wait_for_heatup = true; // Allow interruption by Emergency Parser M108 - while (wait_for_heatup && ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW) - idle(); - wait_for_heatup = false; +static bool ensure_safe_temperature(const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT) { #if ENABLED(PREVENT_COLD_EXTRUSION) - // A user can cancel wait-for-heating with M108 if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) { - SERIAL_ECHO_MSG(STR_ERR_HOTEND_TOO_COLD); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_HOTEND_TOO_COLD); return false; } #endif - return true; + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_WAIT_FOR_NOZZLES_TO_HEAT, mode); + #else + UNUSED(mode); + #endif + + wait_for_heatup = true; // M108 will clear this + while (wait_for_heatup && thermalManager.wait_for_heating(active_extruder)) idle(); + const bool status = wait_for_heatup; + wait_for_heatup = false; + + return status; +} + +static void do_pause_e_move(const float &length, const float &fr) { + set_destination_from_current(); + destination[E_AXIS] += length / planner.e_factor[active_extruder]; + planner.buffer_line_kinematic(destination, fr, active_extruder); + set_current_from_destination(); + planner.synchronize(); } /** @@ -173,92 +139,78 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P */ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=0*/, const int8_t max_beep_count/*=0*/, const bool show_lcd/*=false*/, const bool pause_for_user/*=false*/, - const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ - DXC_ARGS + const AdvancedPauseMode mode/*=ADVANCED_PAUSE_MODE_PAUSE_PRINT*/ ) { - DEBUG_SECTION(lf, "load_filament", true); - DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " showlcd:", int(show_lcd), " pauseforuser:", int(pause_for_user), " pausemode:", int(mode) DXC_SAY); + #if DISABLED(ULTIPANEL) + UNUSED(show_lcd); + #endif - UNUSED(show_lcd); - - if (!ensure_safe_temperature(false, mode)) { - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS, mode); + if (!ensure_safe_temperature(mode)) { + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show status screen + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); #endif + return false; } if (pause_for_user) { - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_INSERT, mode); + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show "insert filament" + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT, mode); #endif - SERIAL_ECHO_MSG(_PMSG(STR_FILAMENT_CHANGE_INSERT)); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_FILAMENT_CHANGE_INSERT); - first_impatient_beep(max_beep_count); + #if HAS_BUZZER + filament_change_beep(max_beep_count, true); + #else + UNUSED(max_beep_count); + #endif KEEPALIVE_STATE(PAUSED_FOR_USER); - #if ENABLED(HOST_PROMPT_SUPPORT) - const char tool = '0' - #if NUM_RUNOUT_SENSORS > 1 - + active_extruder - #endif - ; - host_action_prompt_begin(PROMPT_USER_CONTINUE, PSTR("Load Filament T"), tool); - host_action_prompt_button(CONTINUE_STR); - host_action_prompt_show(); - #endif - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Load Filament"))); + wait_for_user = true; // LCD click or M108 will clear this while (wait_for_user) { - impatient_beep(max_beep_count); - idle_no_sleep(); + #if HAS_BUZZER + filament_change_beep(max_beep_count); + #endif + idle(true); } + KEEPALIVE_STATE(IN_HANDLER); } - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_LOAD, mode); - #endif - - #if ENABLED(DUAL_X_CARRIAGE) - const int8_t saved_ext = active_extruder; - const bool saved_ext_dup_mode = extruder_duplication_enabled; - active_extruder = DXC_ext; - extruder_duplication_enabled = false; + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show "wait for load" message + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_LOAD, mode); #endif // Slow Load filament - if (slow_load_length) unscaled_e_move(slow_load_length, FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE); + if (slow_load_length) do_pause_e_move(slow_load_length, FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE); // Fast Load Filament if (fast_load_length) { #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 - const float saved_acceleration = planner.settings.retract_acceleration; - planner.settings.retract_acceleration = FILAMENT_CHANGE_FAST_LOAD_ACCEL; + const float saved_acceleration = planner.retract_acceleration; + planner.retract_acceleration = FILAMENT_CHANGE_FAST_LOAD_ACCEL; #endif - unscaled_e_move(fast_load_length, FILAMENT_CHANGE_FAST_LOAD_FEEDRATE); + do_pause_e_move(fast_load_length, FILAMENT_CHANGE_FAST_LOAD_FEEDRATE); #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 - planner.settings.retract_acceleration = saved_acceleration; + planner.retract_acceleration = saved_acceleration; #endif } - #if ENABLED(DUAL_X_CARRIAGE) // Tie the two extruders movement back together. - active_extruder = saved_ext; - extruder_duplication_enabled = saved_ext_dup_mode; - stepper.set_directions(); - #endif - #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_PURGE); + #if ENABLED(ULTIPANEL) + if (show_lcd) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE); #endif - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Filament Purging..."), CONTINUE_STR)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Filament Purging..."))); - wait_for_user = true; // A click or M108 breaks the purge_length loop + wait_for_user = true; for (float purge_count = purge_length; purge_count > 0 && wait_for_user; --purge_count) - unscaled_e_move(1, ADVANCED_PAUSE_PURGE_FEEDRATE); + do_pause_e_move(1, ADVANCED_PAUSE_PURGE_FEEDRATE); wait_for_user = false; #else @@ -266,31 +218,36 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l do { if (purge_length > 0) { // "Wait for filament purge" - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_PURGE); + #if ENABLED(ULTIPANEL) + if (show_lcd) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_PURGE, mode); #endif // Extrude filament to get into hotend - unscaled_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE); + do_pause_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE); } - TERN_(HOST_PROMPT_SUPPORT, filament_load_host_prompt()); // Initiate another host prompt. (NOTE: host_response_handler may also do this!) - - #if HAS_LCD_MENU + // Show "Purge More" / "Resume" menu and wait for reply + #if ENABLED(ULTIPANEL) if (show_lcd) { - // Show "Purge More" / "Resume" menu and wait for reply KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = false; - lcd_pause_show_message(PAUSE_MESSAGE_OPTION); - while (pause_menu_response == PAUSE_RESPONSE_WAIT_FOR) idle_no_sleep(); + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_OPTION, mode); + while (advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_WAIT_FOR) idle(true); + KEEPALIVE_STATE(IN_HANDLER); } #endif // Keep looping if "Purge More" was selected - } while (TERN0(HAS_LCD_MENU, show_lcd && pause_menu_response == PAUSE_RESPONSE_EXTRUDE_MORE)); + } while ( + #if ENABLED(ULTIPANEL) + show_lcd && advanced_pause_menu_response == ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE + #else + 0 + #endif + ); #endif - TERN_(HOST_PROMPT_SUPPORT, host_action_prompt_end()); return true; } @@ -306,59 +263,47 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l * Returns 'true' if unload was completed, 'false' for abort */ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, - const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ - #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) - , const float &mix_multiplier/*=1.0*/ - #endif + const AdvancedPauseMode mode/*=ADVANCED_PAUSE_MODE_PAUSE_PRINT*/ ) { - DEBUG_SECTION(uf, "unload_filament", true); - DEBUG_ECHOLNPAIR("... unloadlen:", unload_length, " showlcd:", int(show_lcd), " mode:", int(mode) - #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) - , " mixmult:", mix_multiplier + if (!ensure_safe_temperature(mode)) { + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show status screen + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); #endif - ); - UNUSED(show_lcd); - - #if !BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) - constexpr float mix_multiplier = 1.0; - #endif - - if (!ensure_safe_temperature(false, mode)) { - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS); - #endif return false; } - #if HAS_LCD_MENU - if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, mode); + #if DISABLED(ULTIPANEL) + UNUSED(show_lcd); + #else + if (show_lcd) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_UNLOAD, mode); #endif // Retract filament - unscaled_e_move(-(FILAMENT_UNLOAD_PURGE_RETRACT) * mix_multiplier, (PAUSE_PARK_RETRACT_FEEDRATE) * mix_multiplier); + do_pause_e_move(-FILAMENT_UNLOAD_RETRACT_LENGTH, PAUSE_PARK_RETRACT_FEEDRATE); // Wait for filament to cool - safe_delay(FILAMENT_UNLOAD_PURGE_DELAY); + safe_delay(FILAMENT_UNLOAD_DELAY); // Quickly purge - unscaled_e_move((FILAMENT_UNLOAD_PURGE_RETRACT + FILAMENT_UNLOAD_PURGE_LENGTH) * mix_multiplier, - (FILAMENT_UNLOAD_PURGE_FEEDRATE) * mix_multiplier); + do_pause_e_move(FILAMENT_UNLOAD_RETRACT_LENGTH + FILAMENT_UNLOAD_PURGE_LENGTH, planner.max_feedrate_mm_s[E_AXIS]); // Unload filament #if FILAMENT_CHANGE_UNLOAD_ACCEL > 0 - const float saved_acceleration = planner.settings.retract_acceleration; - planner.settings.retract_acceleration = FILAMENT_CHANGE_UNLOAD_ACCEL; + const float saved_acceleration = planner.retract_acceleration; + planner.retract_acceleration = FILAMENT_CHANGE_UNLOAD_ACCEL; #endif - unscaled_e_move(unload_length * mix_multiplier, (FILAMENT_CHANGE_UNLOAD_FEEDRATE) * mix_multiplier); + do_pause_e_move(unload_length, FILAMENT_CHANGE_UNLOAD_FEEDRATE); #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 - planner.settings.retract_acceleration = saved_acceleration; + planner.retract_acceleration = saved_acceleration; #endif - // Disable E steppers for manual change - #if HAS_E_STEPPER_ENABLE + // Disable extruders steppers for manual filament changing (only on boards that have separate ENABLE_PINS) + #if E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN disable_e_stepper(active_extruder); safe_delay(100); #endif @@ -379,301 +324,241 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, * - Park the nozzle at the given position * - Call unload_filament (if a length was specified) * - * Return 'true' if pause was completed, 'false' for abort + * Returns 'true' if pause was completed, 'false' for abort */ uint8_t did_pause_print = 0; -bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { - DEBUG_SECTION(pp, "pause_print", true); - DEBUG_ECHOLNPAIR("... park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", int(show_lcd) DXC_SAY); - - UNUSED(show_lcd); - +bool pause_print(const float &retract, const point_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/) { if (did_pause_print) return false; // already paused - #if ENABLED(HOST_ACTION_COMMANDS) - #ifdef ACTION_ON_PAUSED - host_action_paused(); - #elif defined(ACTION_ON_PAUSE) - host_action_pause(); - #endif + #ifdef ACTION_ON_PAUSE + SERIAL_ECHOLNPGM("//action:" ACTION_ON_PAUSE); #endif - TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("Pause"), DISMISS_STR)); + #if ENABLED(ULTIPANEL) + if (show_lcd) // Show initial message + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INIT); + #endif + + if (!DEBUGGING(DRYRUN) && unload_length && thermalManager.targetTooColdToExtrude(active_extruder)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_HOTEND_TOO_COLD); + + #if ENABLED(ULTIPANEL) + if (show_lcd) { // Show status screen + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + LCD_MESSAGEPGM(MSG_M600_TOO_COLD); + } + #endif + + return false; // unable to reach safe temperature + } // Indicate that the printer is paused ++did_pause_print; // Pause the print job and timer #if ENABLED(SDSUPPORT) - if (IS_SD_PRINTING()) { + if (card.sdprinting) { card.pauseSDPrint(); ++did_pause_print; // Indicate SD pause also } #endif - print_job_timer.pause(); // Save current position - resume_position = current_position; + COPY(resume_position, current_position); // Wait for buffered blocks to complete planner.synchronize(); - #if ENABLED(ADVANCED_PAUSE_FANS_PAUSE) && HAS_FAN - thermalManager.set_fans_paused(true); - #endif - // Initial retract before move to filament change position - if (retract && thermalManager.hotEnoughToExtrude(active_extruder)) { - DEBUG_ECHOLNPAIR("... retract:", retract); - unscaled_e_move(retract, PAUSE_PARK_RETRACT_FEEDRATE); - } + if (retract && thermalManager.hotEnoughToExtrude(active_extruder)) + do_pause_e_move(retract, PAUSE_PARK_RETRACT_FEEDRATE); // Park the nozzle by moving up by z_lift and then moving to (x_pos, y_pos) - if (!axes_should_home()) - nozzle.park(0, park_point); + if (!axis_unhomed_error()) + Nozzle::park(2, park_point); - #if ENABLED(DUAL_X_CARRIAGE) - const int8_t saved_ext = active_extruder; - const bool saved_ext_dup_mode = extruder_duplication_enabled; - active_extruder = DXC_ext; - extruder_duplication_enabled = false; - #endif - - if (unload_length) // Unload the filament - unload_filament(unload_length, show_lcd, PAUSE_MODE_CHANGE_FILAMENT); - - #if ENABLED(DUAL_X_CARRIAGE) - active_extruder = saved_ext; - extruder_duplication_enabled = saved_ext_dup_mode; - stepper.set_directions(); - #endif + // Unload the filament + if (unload_length) + unload_filament(unload_length, show_lcd); return true; } /** - * For Paused Print: - * - Show "Press button (or M108) to resume" - * - * For Filament Change: * - Show "Insert filament and press button to continue" - * * - Wait for a click before returning - * - Heaters can time out and must reheat before continuing + * - Heaters can time out, reheated before accepting a click * * Used by M125 and M600 */ - -void show_continue_prompt(const bool is_reload) { - DEBUG_SECTION(scp, "pause_print", true); - DEBUG_ECHOLNPAIR("... is_reload:", int(is_reload)); - - TERN_(HAS_LCD_MENU, lcd_pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING)); - SERIAL_ECHO_START(); - serialprintPGM(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n")); -} - -void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep_count/*=0*/ DXC_ARGS) { - DEBUG_SECTION(wfc, "wait_for_confirmation", true); - DEBUG_ECHOLNPAIR("... is_reload:", is_reload, " maxbeep:", int(max_beep_count) DXC_SAY); - +void wait_for_filament_reload(const int8_t max_beep_count/*=0*/) { bool nozzle_timed_out = false; - show_continue_prompt(is_reload); + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT); + #endif + SERIAL_ECHO_START(); + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT); - first_impatient_beep(max_beep_count); + #if HAS_BUZZER + filament_change_beep(max_beep_count, true); + #endif // Start the heater idle timers - const millis_t nozzle_timeout = SEC_TO_MS(PAUSE_PARK_NOZZLE_TIMEOUT); + const millis_t nozzle_timeout = (millis_t)(PAUSE_PARK_NOZZLE_TIMEOUT) * 1000UL; - HOTEND_LOOP() thermalManager.heater_idle[e].start(nozzle_timeout); - - #if ENABLED(DUAL_X_CARRIAGE) - const int8_t saved_ext = active_extruder; - const bool saved_ext_dup_mode = extruder_duplication_enabled; - active_extruder = DXC_ext; - extruder_duplication_enabled = false; - #endif + HOTEND_LOOP() + thermalManager.start_heater_idle_timer(e, nozzle_timeout); // Wait for filament insert by user and press button KEEPALIVE_STATE(PAUSED_FOR_USER); - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_NOZZLE_PARKED), CONTINUE_STR)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_NOZZLE_PARKED))); wait_for_user = true; // LCD click or M108 will clear this while (wait_for_user) { - impatient_beep(max_beep_count); + #if HAS_BUZZER + filament_change_beep(max_beep_count); + #endif - // If the nozzle has timed out... + // If the nozzle has timed out, wait for the user to press the button to re-heat the nozzle, then + // re-heat the nozzle, re-show the insert screen, restart the idle timers, and start over if (!nozzle_timed_out) - HOTEND_LOOP() nozzle_timed_out |= thermalManager.heater_idle[e].timed_out; + HOTEND_LOOP() + nozzle_timed_out |= thermalManager.is_heater_idle(e); - // Wait for the user to press the button to re-heat the nozzle, then - // re-heat the nozzle, re-show the continue prompt, restart idle timers, start over if (nozzle_timed_out) { - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_HEAT)); - SERIAL_ECHO_MSG(_PMSG(STR_FILAMENT_CHANGE_HEAT)); + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_CLICK_TO_HEAT_NOZZLE); + #endif + SERIAL_ECHO_START(); + #if ENABLED(ULTIPANEL) && ENABLED(EMERGENCY_PARSER) + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_HEAT); + #elif ENABLED(EMERGENCY_PARSER) + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_HEAT_M108); + #else + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_HEAT_LCD); + #endif - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_HEATER_TIMEOUT), GET_TEXT(MSG_REHEAT))); - - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_HEATER_TIMEOUT))); - - wait_for_user_response(0, true); // Wait for LCD click or M108 - - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, GET_TEXT(MSG_REHEATING))); - - TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged_P(GET_TEXT(MSG_REHEATING))); + // Wait for LCD click or M108 + while (wait_for_user) idle(true); // Re-enable the heaters if they timed out - HOTEND_LOOP() thermalManager.reset_hotend_idle_timer(e); + HOTEND_LOOP() thermalManager.reset_heater_idle_timer(e); // Wait for the heaters to reach the target temperatures - ensure_safe_temperature(false); + ensure_safe_temperature(); - // Show the prompt to continue - show_continue_prompt(is_reload); + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT); + #endif + SERIAL_ECHO_START(); + #if ENABLED(ULTIPANEL) && ENABLED(EMERGENCY_PARSER) + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT); + #elif ENABLED(EMERGENCY_PARSER) + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT_M108); + #else + SERIAL_ERRORLNPGM(MSG_FILAMENT_CHANGE_INSERT_LCD); + #endif // Start the heater idle timers - const millis_t nozzle_timeout = SEC_TO_MS(PAUSE_PARK_NOZZLE_TIMEOUT); + const millis_t nozzle_timeout = (millis_t)(PAUSE_PARK_NOZZLE_TIMEOUT) * 1000UL; - HOTEND_LOOP() thermalManager.heater_idle[e].start(nozzle_timeout); - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Reheat Done"), CONTINUE_STR)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Reheat finished."))); - wait_for_user = true; + HOTEND_LOOP() + thermalManager.start_heater_idle_timer(e, nozzle_timeout); + + wait_for_user = true; // Wait for user to load filament nozzle_timed_out = false; - first_impatient_beep(max_beep_count); + #if HAS_BUZZER + filament_change_beep(max_beep_count, true); + #endif } - idle_no_sleep(); + + idle(true); } - #if ENABLED(DUAL_X_CARRIAGE) - active_extruder = saved_ext; - extruder_duplication_enabled = saved_ext_dup_mode; - stepper.set_directions(); - #endif + KEEPALIVE_STATE(IN_HANDLER); } /** * Resume or Start print procedure * - * - If not paused, do nothing and return + * - Abort if not paused * - Reset heater idle timers * - Load filament if specified, but only if: * - a nozzle timed out, or * - the nozzle is already heated. * - Display "wait for print to resume" - * - Retract to prevent oozing - * - Move the nozzle back to resume_position - * - Unretract * - Re-prime the nozzle... * - FWRETRACT: Recover/prime from the prior G10. - * - !FWRETRACT: Retract by resume_position.e, if negative. + * - !FWRETRACT: Retract by resume_position[E], if negative. * Not sure how this logic comes into use. - * - Sync the planner E to resume_position.e + * - Move the nozzle back to resume_position + * - Sync the planner E to resume_position[E] * - Send host action for resume, if configured * - Resume the current SD print job, if any */ -void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, int16_t targetTemp/*=0*/ DXC_ARGS) { - DEBUG_SECTION(rp, "resume_print", true); - DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " targetTemp:", targetTemp DXC_SAY); - - /* - SERIAL_ECHOLNPAIR( - "start of resume_print()\ndual_x_carriage_mode:", dual_x_carriage_mode, - "\nextruder_duplication_enabled:", extruder_duplication_enabled, - "\nactive_extruder:", active_extruder, - "\n" - ); - //*/ - +void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/) { if (!did_pause_print) return; // Re-enable the heaters if they timed out bool nozzle_timed_out = false; HOTEND_LOOP() { - nozzle_timed_out |= thermalManager.heater_idle[e].timed_out; - thermalManager.reset_hotend_idle_timer(e); + nozzle_timed_out |= thermalManager.is_heater_idle(e); + thermalManager.reset_heater_idle_timer(e); } - if (targetTemp > thermalManager.degTargetHotend(active_extruder)) { - thermalManager.setTargetHotend(targetTemp, active_extruder); + if (nozzle_timed_out || thermalManager.hotEnoughToExtrude(active_extruder)) { + // Load the new filament + load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out); } - // Load the new filament - load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out, PAUSE_MODE_SAME DXC_PASS); - - if (targetTemp > 0) { - thermalManager.setTargetHotend(targetTemp, active_extruder); - thermalManager.wait_for_hotend(active_extruder, false); - } - - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_RESUME)); - - // Check Temperature before moving hotend - ensure_safe_temperature(); - - // Retract to prevent oozing - unscaled_e_move(-(PAUSE_PARK_RETRACT_LENGTH), feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); - - if (!axes_should_home()) { - // Move XY to starting position, then Z - do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); - - // Move Z_AXIS to saved position - do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); - } - - // Unretract - unscaled_e_move(PAUSE_PARK_RETRACT_LENGTH, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); + #if ENABLED(ULTIPANEL) + // "Wait for print to resume" + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_RESUME); + #endif // Intelligent resuming #if ENABLED(FWRETRACT) // If retracted before goto pause if (fwretract.retracted[active_extruder]) - unscaled_e_move(-fwretract.settings.retract_length, fwretract.settings.retract_feedrate_mm_s); + do_pause_e_move(-fwretract.retract_length, fwretract.retract_feedrate_mm_s); #endif // If resume_position is negative - if (resume_position.e < 0) unscaled_e_move(resume_position.e, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); - #if ADVANCED_PAUSE_RESUME_PRIME != 0 - unscaled_e_move(ADVANCED_PAUSE_RESUME_PRIME, feedRate_t(ADVANCED_PAUSE_PURGE_FEEDRATE)); - #endif + if (resume_position[E_AXIS] < 0) do_pause_e_move(resume_position[E_AXIS], PAUSE_PARK_RETRACT_FEEDRATE); + + // Move XY to starting position, then Z + do_blocking_move_to_xy(resume_position[X_AXIS], resume_position[Y_AXIS], NOZZLE_PARK_XY_FEEDRATE); + + // Move Z_AXIS to saved position + do_blocking_move_to_z(resume_position[Z_AXIS], NOZZLE_PARK_Z_FEEDRATE); // Now all extrusion positions are resumed and ready to be confirmed // Set extruder to saved position - planner.set_e_position_mm((destination.e = current_position.e = resume_position.e)); + planner.set_e_position_mm((destination[E_AXIS] = current_position[E_AXIS] = resume_position[E_AXIS])); - // Write PLR now to update the z axis value - TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + runout.reset(); + #endif - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); + #if ENABLED(ULTIPANEL) + // Show status screen + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + #endif - #ifdef ACTION_ON_RESUMED - host_action_resumed(); - #elif defined(ACTION_ON_RESUME) - host_action_resume(); + #ifdef ACTION_ON_RESUME + SERIAL_ECHOLNPGM("//action:" ACTION_ON_RESUME); #endif --did_pause_print; - TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("Resuming"), DISMISS_STR)); - #if ENABLED(SDSUPPORT) - if (did_pause_print) { card.startFileprint(); --did_pause_print; } + if (did_pause_print) { + card.startFileprint(); + --did_pause_print; + } #endif - - #if ENABLED(ADVANCED_PAUSE_FANS_PAUSE) && HAS_FAN - thermalManager.set_fans_paused(false); - #endif - - TERN_(HAS_FILAMENT_SENSOR, runout.reset()); - - // Resume the print job timer if it was running - if (print_job_timer.isPaused()) print_job_timer.start(); - - TERN_(HAS_DISPLAY, ui.reset_status()); - TERN_(HAS_LCD_MENU, ui.return_to_status()); } #endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 016b0ce3f7..c920fd599f 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,88 +16,66 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * feature/pause.h - Pause feature support functions * This may be combined with related G-codes if features are consolidated. */ -typedef struct { - float unload_length, load_length; -} fil_change_settings_t; - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(ADVANCED_PAUSE_FEATURE) +#ifndef _PAUSE_H_ +#define _PAUSE_H_ #include "../libs/nozzle.h" -enum PauseMode : char { - PAUSE_MODE_SAME, - PAUSE_MODE_PAUSE_PRINT, - PAUSE_MODE_CHANGE_FILAMENT, - PAUSE_MODE_LOAD_FILAMENT, - PAUSE_MODE_UNLOAD_FILAMENT +#include "../inc/MarlinConfigPre.h" + +enum AdvancedPauseMode : char { + ADVANCED_PAUSE_MODE_PAUSE_PRINT, + ADVANCED_PAUSE_MODE_LOAD_FILAMENT, + ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT }; -enum PauseMessage : char { - PAUSE_MESSAGE_PARKING, - PAUSE_MESSAGE_CHANGING, - PAUSE_MESSAGE_WAITING, - PAUSE_MESSAGE_UNLOAD, - PAUSE_MESSAGE_INSERT, - PAUSE_MESSAGE_LOAD, - PAUSE_MESSAGE_PURGE, - PAUSE_MESSAGE_OPTION, - PAUSE_MESSAGE_RESUME, - PAUSE_MESSAGE_STATUS, - PAUSE_MESSAGE_HEAT, - PAUSE_MESSAGE_HEATING +enum AdvancedPauseMessage : char { + ADVANCED_PAUSE_MESSAGE_INIT, + ADVANCED_PAUSE_MESSAGE_UNLOAD, + ADVANCED_PAUSE_MESSAGE_INSERT, + ADVANCED_PAUSE_MESSAGE_LOAD, + ADVANCED_PAUSE_MESSAGE_PURGE, + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE, + #endif + ADVANCED_PAUSE_MESSAGE_OPTION, + ADVANCED_PAUSE_MESSAGE_RESUME, + ADVANCED_PAUSE_MESSAGE_STATUS, + ADVANCED_PAUSE_MESSAGE_CLICK_TO_HEAT_NOZZLE, + ADVANCED_PAUSE_MESSAGE_WAIT_FOR_NOZZLES_TO_HEAT }; -#if HAS_LCD_MENU - enum PauseMenuResponse : char { - PAUSE_RESPONSE_WAIT_FOR, - PAUSE_RESPONSE_EXTRUDE_MORE, - PAUSE_RESPONSE_RESUME_PRINT - }; - extern PauseMenuResponse pause_menu_response; - extern PauseMode pause_mode; -#endif +enum AdvancedPauseMenuResponse : char { + ADVANCED_PAUSE_RESPONSE_WAIT_FOR, + ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE, + ADVANCED_PAUSE_RESPONSE_RESUME_PRINT +}; -extern fil_change_settings_t fc_settings[EXTRUDERS]; +extern AdvancedPauseMenuResponse advanced_pause_menu_response; + +extern float filament_change_unload_length[EXTRUDERS], + filament_change_load_length[EXTRUDERS]; extern uint8_t did_pause_print; -#if ENABLED(DUAL_X_CARRIAGE) - #define DXC_PARAMS , const int8_t DXC_ext=-1 - #define DXC_ARGS , const int8_t DXC_ext - #define DXC_PASS , DXC_ext - #define DXC_SAY , " dxc:", int(DXC_ext) -#else - #define DXC_PARAMS - #define DXC_ARGS - #define DXC_PASS - #define DXC_SAY -#endif +bool pause_print(const float &retract, const point_t &park_point, const float &unload_length=0, const bool show_lcd=false); -bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length=0, const bool show_lcd=false DXC_PARAMS); +void wait_for_filament_reload(const int8_t max_beep_count=0); -void wait_for_confirmation(const bool is_reload=false, const int8_t max_beep_count=0 DXC_PARAMS); - -void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0, int16_t targetTemp=0 DXC_PARAMS); +void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0); bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, const bool show_lcd=false, - const bool pause_for_user=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT DXC_PARAMS); + const bool pause_for_user=false, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT); -bool unload_filament(const float &unload_length, const bool show_lcd=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT - #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) - , const float &mix_multiplier=1.0 - #endif -); +bool unload_filament(const float &unload_length, const bool show_lcd=false, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT); -#endif // ADVANCED_PAUSE_FEATURE +#endif // _PAUSE_H_ diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 5be554e5e4..53fcd142bb 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -30,12 +30,8 @@ #include "power.h" #include "../module/temperature.h" -#include "../module/stepper/indirection.h" -#include "../MarlinCore.h" - -#if BOTH(USE_CONTROLLER_FAN, AUTO_POWER_CONTROLLERFAN) - #include "controllerfan.h" -#endif +#include "../module/stepper_indirection.h" +#include "../Marlin.h" Power powerManager; @@ -43,46 +39,50 @@ millis_t Power::lastPowerOn; bool Power::is_power_needed() { #if ENABLED(AUTO_POWER_FANS) - FANS_LOOP(i) if (thermalManager.fan_speed[i]) return true; + for (uint8_t i = 0; i < FAN_COUNT; i++) if (fanSpeeds[i] > 0) return true; #endif #if ENABLED(AUTO_POWER_E_FANS) - HOTEND_LOOP() if (thermalManager.autofan_speed[e]) return true; + HOTEND_LOOP() if (thermalManager.autofan_speed[e] > 0) return true; #endif - #if BOTH(USE_CONTROLLER_FAN, AUTO_POWER_CONTROLLERFAN) - if (controllerFan.state()) return true; + #if ENABLED(AUTO_POWER_CONTROLLERFAN) && HAS_CONTROLLER_FAN && ENABLED(USE_CONTROLLER_FAN) + if (controllerFanSpeed > 0) return true; #endif - if (TERN0(AUTO_POWER_CHAMBER_FAN, thermalManager.chamberfan_speed)) - return true; - // If any of the drivers or the bed are enabled... - if (X_ENABLE_READ() == X_ENABLE_ON || Y_ENABLE_READ() == Y_ENABLE_ON || Z_ENABLE_READ() == Z_ENABLE_ON - #if HAS_X2_ENABLE - || X2_ENABLE_READ() == X_ENABLE_ON - #endif - #if HAS_Y2_ENABLE - || Y2_ENABLE_READ() == Y_ENABLE_ON - #endif - #if HAS_Z2_ENABLE - || Z2_ENABLE_READ() == Z_ENABLE_ON - #endif - #if E_STEPPERS - #define _OR_ENABLED_E(N) || E##N##_ENABLE_READ() == E_ENABLE_ON - REPEAT(E_STEPPERS, _OR_ENABLED_E) + if (X_ENABLE_READ == X_ENABLE_ON || Y_ENABLE_READ == Y_ENABLE_ON || Z_ENABLE_READ == Z_ENABLE_ON + #if HAS_HEATED_BED + || thermalManager.soft_pwm_amount_bed > 0 #endif + #if HAS_X2_ENABLE + || X2_ENABLE_READ == X_ENABLE_ON + #endif + #if HAS_Y2_ENABLE + || Y2_ENABLE_READ == Y_ENABLE_ON + #endif + #if HAS_Z2_ENABLE + || Z2_ENABLE_READ == Z_ENABLE_ON + #endif + || E0_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 1 + || E1_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 2 + || E2_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 3 + || E3_ENABLE_READ == E_ENABLE_ON + #if E_STEPPERS > 4 + || E4_ENABLE_READ == E_ENABLE_ON + #endif + #endif + #endif + #endif ) return true; - HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0 || thermalManager.temp_hotend[e].soft_pwm_amount > 0) return true; - if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed() > 0 || thermalManager.temp_bed.soft_pwm_amount > 0)) return true; + HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0) return true; - #if HAS_HOTEND && AUTO_POWER_E_TEMP - HOTEND_LOOP() if (thermalManager.degHotend(e) >= AUTO_POWER_E_TEMP) return true; - #endif - - #if HAS_HEATED_CHAMBER && AUTO_POWER_CHAMBER_TEMP - if (thermalManager.degChamber() >= AUTO_POWER_CHAMBER_TEMP) return true; + #if HAS_HEATED_BED + if (thermalManager.degTargetBed() > 0) return true; #endif return false; @@ -95,7 +95,7 @@ void Power::check() { nextPowerCheck = ms + 2500UL; if (is_power_needed()) power_on(); - else if (!lastPowerOn || ELAPSED(ms, lastPowerOn + SEC_TO_MS(POWER_TIMEOUT))) + else if (!lastPowerOn || ELAPSED(ms, lastPowerOn + (POWER_TIMEOUT) * 1000UL)) power_off(); } } @@ -104,9 +104,11 @@ void Power::power_on() { lastPowerOn = millis(); if (!powersupply_on) { PSU_PIN_ON(); - safe_delay(PSU_POWERUP_DELAY); - restore_stepper_drivers(); - TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY)); + + #if HAS_TRINAMIC + delay(100); // Wait for power to settle + restore_stepper_drivers(); + #endif } } diff --git a/Marlin/src/feature/power.h b/Marlin/src/feature/power.h index 8b988907e6..225e4dc6f3 100644 --- a/Marlin/src/feature/power.h +++ b/Marlin/src/feature/power.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,16 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * power.h - power control */ -#include "../core/millis_t.h" +#ifndef POWER_H +#define POWER_H + +#include "../core/types.h" class Power { public: @@ -38,3 +40,5 @@ class Power { }; extern Power powerManager; + +#endif // POWER_H diff --git a/Marlin/src/feature/power_loss_recovery.cpp b/Marlin/src/feature/power_loss_recovery.cpp new file mode 100644 index 0000000000..0958588373 --- /dev/null +++ b/Marlin/src/feature/power_loss_recovery.cpp @@ -0,0 +1,285 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * power_loss_recovery.cpp - Resume an SD print after power-loss + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + +#include "power_loss_recovery.h" + +#include "../lcd/ultralcd.h" +#include "../gcode/queue.h" +#include "../module/planner.h" +#include "../module/printcounter.h" +#include "../module/temperature.h" +#include "../sd/cardreader.h" +#include "../core/serial.h" + +// Recovery data +job_recovery_info_t job_recovery_info; +JobRecoveryPhase job_recovery_phase = JOB_RECOVERY_IDLE; +uint8_t job_recovery_commands_count; //=0 +char job_recovery_commands[BUFSIZE + APPEND_CMD_COUNT][MAX_CMD_SIZE]; +// Extern +extern uint8_t active_extruder, commands_in_queue, cmd_queue_index_r; + +#if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + void debug_print_job_recovery(const bool recovery) { + SERIAL_PROTOCOLLNPGM("---- Job Recovery Info ----"); + SERIAL_PROTOCOLPAIR("valid_head:", int(job_recovery_info.valid_head)); + SERIAL_PROTOCOLLNPAIR(" valid_foot:", int(job_recovery_info.valid_foot)); + if (job_recovery_info.valid_head) { + if (job_recovery_info.valid_head == job_recovery_info.valid_foot) { + SERIAL_PROTOCOLPGM("current_position: "); + LOOP_XYZE(i) { + SERIAL_PROTOCOL(job_recovery_info.current_position[i]); + if (i < E_AXIS) SERIAL_CHAR(','); + } + SERIAL_EOL(); + SERIAL_PROTOCOLLNPAIR("feedrate: ", job_recovery_info.feedrate); + + #if HOTENDS > 1 + SERIAL_PROTOCOLLNPAIR("active_hotend: ", int(job_recovery_info.active_hotend)); + #endif + + SERIAL_PROTOCOLPGM("target_temperature: "); + HOTEND_LOOP() { + SERIAL_PROTOCOL(job_recovery_info.target_temperature[e]); + if (e < HOTENDS - 1) SERIAL_CHAR(','); + } + SERIAL_EOL(); + + #if HAS_HEATED_BED + SERIAL_PROTOCOLLNPAIR("target_temperature_bed: ", job_recovery_info.target_temperature_bed); + #endif + + #if FAN_COUNT + SERIAL_PROTOCOLPGM("fanSpeeds: "); + for (int8_t i = 0; i < FAN_COUNT; i++) { + SERIAL_PROTOCOL(job_recovery_info.fanSpeeds[i]); + if (i < FAN_COUNT - 1) SERIAL_CHAR(','); + } + SERIAL_EOL(); + #endif + + #if HAS_LEVELING + SERIAL_PROTOCOLPAIR("leveling: ", int(job_recovery_info.leveling)); + SERIAL_PROTOCOLLNPAIR(" fade: ", int(job_recovery_info.fade)); + #endif + SERIAL_PROTOCOLLNPAIR("cmd_queue_index_r: ", int(job_recovery_info.cmd_queue_index_r)); + SERIAL_PROTOCOLLNPAIR("commands_in_queue: ", int(job_recovery_info.commands_in_queue)); + if (recovery) + for (uint8_t i = 0; i < job_recovery_commands_count; i++) SERIAL_PROTOCOLLNPAIR("> ", job_recovery_commands[i]); + else + for (uint8_t i = 0; i < job_recovery_info.commands_in_queue; i++) SERIAL_PROTOCOLLNPAIR("> ", job_recovery_info.command_queue[i]); + SERIAL_PROTOCOLLNPAIR("sd_filename: ", job_recovery_info.sd_filename); + SERIAL_PROTOCOLLNPAIR("sdpos: ", job_recovery_info.sdpos); + SERIAL_PROTOCOLLNPAIR("print_job_elapsed: ", job_recovery_info.print_job_elapsed); + } + else + SERIAL_PROTOCOLLNPGM("INVALID DATA"); + } + SERIAL_PROTOCOLLNPGM("---------------------------"); + } +#endif // DEBUG_POWER_LOSS_RECOVERY + +/** + * Check for Print Job Recovery during setup() + * + * If a saved state exists, populate job_recovery_commands with + * commands to restore the machine state and continue the file. + */ +void check_print_job_recovery() { + memset(&job_recovery_info, 0, sizeof(job_recovery_info)); + ZERO(job_recovery_commands); + + if (!card.cardOK) card.initsd(); + + if (card.cardOK) { + + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + SERIAL_PROTOCOLLNPAIR("Init job recovery info. Size: ", int(sizeof(job_recovery_info))); + #endif + + if (card.jobRecoverFileExists()) { + card.openJobRecoveryFile(true); + card.loadJobRecoveryInfo(); + card.closeJobRecoveryFile(); + //card.removeJobRecoveryFile(); + + if (job_recovery_info.valid_head && job_recovery_info.valid_head == job_recovery_info.valid_foot) { + + uint8_t ind = 0; + + #if HAS_LEVELING + strcpy_P(job_recovery_commands[ind++], PSTR("M420 S0 Z0")); // Leveling off before G92 or G28 + #endif + + strcpy_P(job_recovery_commands[ind++], PSTR("G92.0 Z0")); // Ensure Z is equal to 0 + strcpy_P(job_recovery_commands[ind++], PSTR("G1 Z2")); // Raise Z by 2mm (we hope!) + strcpy_P(job_recovery_commands[ind++], PSTR("G28 R0" + #if ENABLED(MARLIN_DEV_MODE) + " S" + #elif !IS_KINEMATIC + " X Y" // Home X and Y for Cartesian + #endif + )); + + char str_1[16], str_2[16]; + + #if HAS_LEVELING + if (job_recovery_info.fade || job_recovery_info.leveling) { + // Restore leveling state before G92 sets Z + // This ensures the steppers correspond to the native Z + dtostrf(job_recovery_info.fade, 1, 1, str_1); + sprintf_P(job_recovery_commands[ind++], PSTR("M420 S%i Z%s"), int(job_recovery_info.leveling), str_1); + } + #endif + + dtostrf(job_recovery_info.current_position[Z_AXIS] + 2, 1, 3, str_1); + dtostrf(job_recovery_info.current_position[E_AXIS] + #if ENABLED(SAVE_EACH_CMD_MODE) + - 5 + #endif + , 1, 3, str_2 + ); + sprintf_P(job_recovery_commands[ind++], PSTR("G92.0 Z%s E%s"), str_1, str_2); // Current Z + 2 and E + + uint8_t r = job_recovery_info.cmd_queue_index_r, c = job_recovery_info.commands_in_queue; + while (c--) { + strcpy(job_recovery_commands[ind++], job_recovery_info.command_queue[r]); + r = (r + 1) % BUFSIZE; + } + + if (job_recovery_info.sd_filename[0] == '/') job_recovery_info.sd_filename[0] = ' '; + sprintf_P(job_recovery_commands[ind++], PSTR("M23 %s"), job_recovery_info.sd_filename); + sprintf_P(job_recovery_commands[ind++], PSTR("M24 S%ld T%ld"), job_recovery_info.sdpos, job_recovery_info.print_job_elapsed); + + job_recovery_commands_count = ind; + + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + debug_print_job_recovery(true); + #endif + } + else { + if (job_recovery_info.valid_head != job_recovery_info.valid_foot) + LCD_ALERTMESSAGEPGM("INVALID DATA"); + memset(&job_recovery_info, 0, sizeof(job_recovery_info)); + } + } + } +} + +/** + * Save the current machine state to the power-loss recovery file + */ +void save_job_recovery_info() { + #if SAVE_INFO_INTERVAL_MS > 0 + static millis_t next_save_ms; // = 0; // Init on reset + millis_t ms = millis(); + #endif + if ( + // Save on every command + #if ENABLED(SAVE_EACH_CMD_MODE) + true + #else + // Save if power loss pin is triggered + #if PIN_EXISTS(POWER_LOSS) + READ(POWER_LOSS_PIN) == POWER_LOSS_STATE || + #endif + // Save if interval is elapsed + #if SAVE_INFO_INTERVAL_MS > 0 + ELAPSED(ms, next_save_ms) || + #endif + // Save on every new Z height + (current_position[Z_AXIS] > 0 && current_position[Z_AXIS] > job_recovery_info.current_position[Z_AXIS]) + #endif + ) { + #if SAVE_INFO_INTERVAL_MS > 0 + next_save_ms = ms + SAVE_INFO_INTERVAL_MS; + #endif + + // Head and foot will match if valid data was saved + if (!++job_recovery_info.valid_head) ++job_recovery_info.valid_head; // non-zero in sequence + job_recovery_info.valid_foot = job_recovery_info.valid_head; + + // Machine state + COPY(job_recovery_info.current_position, current_position); + job_recovery_info.feedrate = feedrate_mm_s; + + #if HOTENDS > 1 + job_recovery_info.active_hotend = active_extruder; + #endif + + COPY(job_recovery_info.target_temperature, thermalManager.target_temperature); + + #if HAS_HEATED_BED + job_recovery_info.target_temperature_bed = thermalManager.target_temperature_bed; + #endif + + #if FAN_COUNT + COPY(job_recovery_info.fanSpeeds, fanSpeeds); + #endif + + #if HAS_LEVELING + job_recovery_info.leveling = planner.leveling_active; + job_recovery_info.fade = ( + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + planner.z_fade_height + #else + 0 + #endif + ); + #endif + + // Commands in the queue + job_recovery_info.cmd_queue_index_r = cmd_queue_index_r; + job_recovery_info.commands_in_queue = commands_in_queue; + COPY(job_recovery_info.command_queue, command_queue); + + // Elapsed print job time + job_recovery_info.print_job_elapsed = print_job_timer.duration(); + + // SD file position + card.getAbsFilename(job_recovery_info.sd_filename); + job_recovery_info.sdpos = card.getIndex(); + + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + SERIAL_PROTOCOLLNPGM("Saving..."); + debug_print_job_recovery(false); + #endif + + card.openJobRecoveryFile(false); + (void)card.saveJobRecoveryInfo(); + + // If power-loss pin was triggered, write just once then kill + #if PIN_EXISTS(POWER_LOSS) + if (READ(POWER_LOSS_PIN) == POWER_LOSS_STATE) kill(MSG_POWER_LOSS_RECOVERY); + #endif + } +} + +#endif // POWER_LOSS_RECOVERY diff --git a/Marlin/src/feature/power_loss_recovery.h b/Marlin/src/feature/power_loss_recovery.h new file mode 100644 index 0000000000..46a8fd52de --- /dev/null +++ b/Marlin/src/feature/power_loss_recovery.h @@ -0,0 +1,99 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * power_loss_recovery.h - Resume an SD print after power-loss + */ + +#ifndef _POWER_LOSS_RECOVERY_H_ +#define _POWER_LOSS_RECOVERY_H_ + +#include "../sd/cardreader.h" +#include "../core/types.h" +#include "../inc/MarlinConfigPre.h" + +#define SAVE_INFO_INTERVAL_MS 0 +//#define SAVE_EACH_CMD_MODE +//#define DEBUG_POWER_LOSS_RECOVERY + +typedef struct { + uint8_t valid_head; + + // Machine state + float current_position[NUM_AXIS], feedrate; + + #if HOTENDS > 1 + uint8_t active_hotend; + #endif + + int16_t target_temperature[HOTENDS]; + + #if HAS_HEATED_BED + int16_t target_temperature_bed; + #endif + + #if FAN_COUNT + int16_t fanSpeeds[FAN_COUNT]; + #endif + + #if HAS_LEVELING + bool leveling; + float fade; + #endif + + // Command queue + uint8_t cmd_queue_index_r, commands_in_queue; + char command_queue[BUFSIZE][MAX_CMD_SIZE]; + + // SD Filename and position + char sd_filename[MAXPATHNAMELENGTH]; + uint32_t sdpos; + + // Job elapsed time + millis_t print_job_elapsed; + + uint8_t valid_foot; +} job_recovery_info_t; + +extern job_recovery_info_t job_recovery_info; + +enum JobRecoveryPhase : unsigned char { + JOB_RECOVERY_IDLE, + JOB_RECOVERY_MAYBE, + JOB_RECOVERY_YES, + JOB_RECOVERY_DONE +}; +extern JobRecoveryPhase job_recovery_phase; + +#if HAS_LEVELING + #define APPEND_CMD_COUNT 9 +#else + #define APPEND_CMD_COUNT 7 +#endif + +extern char job_recovery_commands[BUFSIZE + APPEND_CMD_COUNT][MAX_CMD_SIZE]; +extern uint8_t job_recovery_commands_count; + +void check_print_job_recovery(); +void save_job_recovery_info(); + +#endif // _POWER_LOSS_RECOVERY_H_ diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp deleted file mode 100644 index af31d156fc..0000000000 --- a/Marlin/src/feature/power_monitor.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfigPre.h" - -#if HAS_POWER_MONITOR - -#include "power_monitor.h" - -#include "../lcd/ultralcd.h" -#include "../lcd/lcdprint.h" -#include "../libs/numtostr.h" - -uint8_t PowerMonitor::flags; // = 0 - -#if ENABLED(POWER_MONITOR_CURRENT) - pm_lpf_t PowerMonitor::amps; -#endif -#if ENABLED(POWER_MONITOR_VOLTAGE) - pm_lpf_t PowerMonitor::volts; -#endif - -millis_t PowerMonitor::display_item_ms; -uint8_t PowerMonitor::display_item; - -PowerMonitor power_monitor; // Single instance - this calls the constructor - -#if HAS_MARLINUI_U8GLIB - - #if ENABLED(POWER_MONITOR_CURRENT) - void PowerMonitor::draw_current() { - const float amps = getAmps(); - lcd_put_u8str(amps < 100 ? ftostr31ns(amps) : ui16tostr4rj((uint16_t)amps)); - lcd_put_wchar('A'); - } - #endif - - #if HAS_POWER_MONITOR_VREF - void PowerMonitor::draw_voltage() { - const float volts = getVolts(); - lcd_put_u8str(volts < 100 ? ftostr31ns(volts) : ui16tostr4rj((uint16_t)volts)); - lcd_put_wchar('V'); - } - #endif - - #if HAS_POWER_MONITOR_WATTS - void PowerMonitor::draw_power() { - const float power = getPower(); - lcd_put_u8str(power < 100 ? ftostr31ns(power) : ui16tostr4rj((uint16_t)power)); - lcd_put_wchar('W'); - } - #endif - -#endif // HAS_MARLINUI_U8GLIB - -#endif // HAS_POWER_MONITOR diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h deleted file mode 100644 index a0eaf353f4..0000000000 --- a/Marlin/src/feature/power_monitor.h +++ /dev/null @@ -1,142 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfig.h" - -#define PM_SAMPLE_RANGE 1024 -#define PM_K_VALUE 6 -#define PM_K_SCALE 6 - -template -struct pm_lpf_t { - uint32_t filter_buf; - float value; - void add_sample(const uint16_t sample) { - filter_buf = filter_buf - (filter_buf >> K_VALUE) + (uint32_t(sample) << K_SCALE); - } - void capture() { - value = filter_buf * (SCALE * (1.0f / (1UL << (PM_K_VALUE + PM_K_SCALE)))) + (POWER_MONITOR_CURRENT_OFFSET); - } - void reset(uint16_t reset_value = 0) { - filter_buf = uint32_t(reset_value) << (K_VALUE + K_SCALE); - capture(); - } -}; - -class PowerMonitor { -private: - #if ENABLED(POWER_MONITOR_CURRENT) - static constexpr float amps_adc_scale = float(ADC_VREF) / (POWER_MONITOR_VOLTS_PER_AMP * PM_SAMPLE_RANGE); - static pm_lpf_t amps; - #endif - #if ENABLED(POWER_MONITOR_VOLTAGE) - static constexpr float volts_adc_scale = float(ADC_VREF) / (POWER_MONITOR_VOLTS_PER_VOLT * PM_SAMPLE_RANGE); - static pm_lpf_t volts; - #endif - -public: - static uint8_t flags; // M430 flags to display current - - static millis_t display_item_ms; - static uint8_t display_item; - - PowerMonitor() { reset(); } - - enum PM_Display_Bit : uint8_t { - PM_DISP_BIT_I, // Current display enable bit - PM_DISP_BIT_V, // Voltage display enable bit - PM_DISP_BIT_P // Power display enable bit - }; - - #if ENABLED(POWER_MONITOR_CURRENT) - FORCE_INLINE static float getAmps() { return amps.value; } - void add_current_sample(const uint16_t value) { amps.add_sample(value); } - #endif - - #if HAS_POWER_MONITOR_VREF - #if ENABLED(POWER_MONITOR_VOLTAGE) - FORCE_INLINE static float getVolts() { return volts.value; } - #else - FORCE_INLINE static float getVolts() { return POWER_MONITOR_FIXED_VOLTAGE; } // using a specified fixed valtage as the voltage measurement - #endif - #if ENABLED(POWER_MONITOR_VOLTAGE) - void add_voltage_sample(const uint16_t value) { volts.add_sample(value); } - #endif - #endif - - #if HAS_POWER_MONITOR_WATTS - FORCE_INLINE static float getPower() { return getAmps() * getVolts(); } - #endif - - #if HAS_WIRED_LCD - #if HAS_MARLINUI_U8GLIB && DISABLED(LIGHTWEIGHT_UI) - FORCE_INLINE static bool display_enabled() { return flags != 0x00; } - #endif - #if ENABLED(POWER_MONITOR_CURRENT) - static void draw_current(); - FORCE_INLINE static bool current_display_enabled() { return TEST(flags, PM_DISP_BIT_I); } - FORCE_INLINE static void set_current_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_I, b); } - FORCE_INLINE static void toggle_current_display() { TBI(flags, PM_DISP_BIT_I); } - #endif - #if HAS_POWER_MONITOR_VREF - static void draw_voltage(); - FORCE_INLINE static bool voltage_display_enabled() { return TEST(flags, PM_DISP_BIT_V); } - FORCE_INLINE static void set_voltage_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_V, b); } - FORCE_INLINE static void toggle_voltage_display() { TBI(flags, PM_DISP_BIT_V); } - #endif - #if HAS_POWER_MONITOR_WATTS - static void draw_power(); - FORCE_INLINE static bool power_display_enabled() { return TEST(flags, PM_DISP_BIT_P); } - FORCE_INLINE static void set_power_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_P, b); } - FORCE_INLINE static void toggle_power_display() { TBI(flags, PM_DISP_BIT_P); } - #endif - #endif - - static void reset() { - flags = 0x00; - - #if ENABLED(POWER_MONITOR_CURRENT) - amps.reset(); - #endif - - #if ENABLED(POWER_MONITOR_VOLTAGE) - volts.reset(); - #endif - - #if ENABLED(SDSUPPORT) - display_item_ms = 0; - display_item = 0; - #endif - } - - static void capture_values() { - #if ENABLED(POWER_MONITOR_CURRENT) - amps.capture(); - #endif - #if ENABLED(POWER_MONITOR_VOLTAGE) - volts.capture(); - #endif - } -}; - -extern PowerMonitor power_monitor; diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp deleted file mode 100644 index e4bc605bb5..0000000000 --- a/Marlin/src/feature/powerloss.cpp +++ /dev/null @@ -1,624 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * feature/powerloss.cpp - Resume an SD print after power-loss - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - -#include "powerloss.h" -#include "../core/macros.h" - -bool PrintJobRecovery::enabled; // Initialized by settings.load() - -SdFile PrintJobRecovery::file; -job_recovery_info_t PrintJobRecovery::info; -const char PrintJobRecovery::filename[5] = "/PLR"; -uint8_t PrintJobRecovery::queue_index_r; -uint32_t PrintJobRecovery::cmd_sdpos, // = 0 - PrintJobRecovery::sdpos[BUFSIZE]; - -#if ENABLED(DWIN_CREALITY_LCD) - bool PrintJobRecovery::dwin_flag; // = false -#endif - -#include "../sd/cardreader.h" -#include "../lcd/ultralcd.h" -#include "../gcode/queue.h" -#include "../gcode/gcode.h" -#include "../module/motion.h" -#include "../module/planner.h" -#include "../module/printcounter.h" -#include "../module/temperature.h" -#include "../core/serial.h" - -#if ENABLED(FWRETRACT) - #include "fwretract.h" -#endif - -#define DEBUG_OUT ENABLED(DEBUG_POWER_LOSS_RECOVERY) -#include "../core/debug_out.h" - -PrintJobRecovery recovery; - -#ifndef POWER_LOSS_PURGE_LEN - #define POWER_LOSS_PURGE_LEN 0 -#endif -#ifndef POWER_LOSS_ZRAISE - #define POWER_LOSS_ZRAISE 2 // Move on loss with backup power, or on resume without it -#endif - -#if DISABLED(BACKUP_POWER_SUPPLY) - #undef POWER_LOSS_RETRACT_LEN // No retract at outage without backup power -#endif -#ifndef POWER_LOSS_RETRACT_LEN - #define POWER_LOSS_RETRACT_LEN 0 -#endif - -/** - * Clear the recovery info - */ -void PrintJobRecovery::init() { memset(&info, 0, sizeof(info)); } - -/** - * Enable or disable then call changed() - */ -void PrintJobRecovery::enable(const bool onoff) { - enabled = onoff; - changed(); -} - -/** - * The enabled state was changed: - * - Enabled: Purge the job recovery file - * - Disabled: Write the job recovery file - */ -void PrintJobRecovery::changed() { - if (!enabled) - purge(); - else if (IS_SD_PRINTING()) - save(true); -} - -/** - * Check for Print Job Recovery during setup() - * - * If a saved state exists send 'M1000 S' to initiate job recovery. - */ -void PrintJobRecovery::check() { - //if (!card.isMounted()) card.mount(); - if (card.isMounted()) { - load(); - if (!valid()) return cancel(); - queue.inject_P(PSTR("M1000S")); - } -} - -/** - * Delete the recovery file and clear the recovery data - */ -void PrintJobRecovery::purge() { - init(); - card.removeJobRecoveryFile(); -} - -/** - * Load the recovery data, if it exists - */ -void PrintJobRecovery::load() { - if (exists()) { - open(true); - (void)file.read(&info, sizeof(info)); - close(); - } - debug(PSTR("Load")); -} - -/** - * Set info fields that won't change - */ -void PrintJobRecovery::prepare() { - card.getAbsFilename(info.sd_filename); // SD filename - cmd_sdpos = 0; -} - -/** - * Save the current machine state to the power-loss recovery file - */ -void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/) { - - #if SAVE_INFO_INTERVAL_MS > 0 - static millis_t next_save_ms; // = 0 - millis_t ms = millis(); - #endif - - #ifndef POWER_LOSS_MIN_Z_CHANGE - #define POWER_LOSS_MIN_Z_CHANGE 0.05 // Vase-mode-friendly out of the box - #endif - - // Did Z change since the last call? - if (force - #if DISABLED(SAVE_EACH_CMD_MODE) // Always save state when enabled - #if SAVE_INFO_INTERVAL_MS > 0 // Save if interval is elapsed - || ELAPSED(ms, next_save_ms) - #endif - // Save if Z is above the last-saved position by some minimum height - || current_position.z > info.current_position.z + POWER_LOSS_MIN_Z_CHANGE - #endif - ) { - - #if SAVE_INFO_INTERVAL_MS > 0 - next_save_ms = ms + SAVE_INFO_INTERVAL_MS; - #endif - - // Set Head and Foot to matching non-zero values - if (!++info.valid_head) ++info.valid_head; // non-zero in sequence - //if (!IS_SD_PRINTING()) info.valid_head = 0; - info.valid_foot = info.valid_head; - - // Machine state - info.current_position = current_position; - info.zraise = zraise; - TERN_(HAS_HOME_OFFSET, info.home_offset = home_offset); - TERN_(HAS_POSITION_SHIFT, info.position_shift = position_shift); - info.feedrate = uint16_t(feedrate_mm_s * 60.0f); - - #if HAS_MULTI_EXTRUDER - info.active_extruder = active_extruder; - #endif - - #if DISABLED(NO_VOLUMETRICS) - info.volumetric_enabled = parser.volumetric_enabled; - #if HAS_MULTI_EXTRUDER - for (int8_t e = 0; e < EXTRUDERS; e++) info.filament_size[e] = planner.filament_size[e]; - #else - if (parser.volumetric_enabled) info.filament_size[0] = planner.filament_size[active_extruder]; - #endif - #endif - - #if EXTRUDERS - HOTEND_LOOP() info.target_temperature[e] = thermalManager.temp_hotend[e].target; - #endif - - TERN_(HAS_HEATED_BED, info.target_temperature_bed = thermalManager.temp_bed.target); - - #if HAS_FAN - COPY(info.fan_speed, thermalManager.fan_speed); - #endif - - #if HAS_LEVELING - info.leveling = planner.leveling_active; - info.fade = TERN0(ENABLE_LEVELING_FADE_HEIGHT, planner.z_fade_height); - #endif - - TERN_(GRADIENT_MIX, memcpy(&info.gradient, &mixer.gradient, sizeof(info.gradient))); - - #if ENABLED(FWRETRACT) - COPY(info.retract, fwretract.current_retract); - info.retract_hop = fwretract.current_hop; - #endif - - // Relative axis modes - info.axis_relative = gcode.axis_relative; - - // Elapsed print job time - info.print_job_elapsed = print_job_timer.duration(); - - // Misc. Marlin flags - info.flag.dryrun = !!(marlin_debug_flags & MARLIN_DEBUG_DRYRUN); - info.flag.allow_cold_extrusion = TERN0(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude); - - write(); - } -} - -#if PIN_EXISTS(POWER_LOSS) - - #if ENABLED(BACKUP_POWER_SUPPLY) - - void PrintJobRecovery::retract_and_lift(const float &zraise) { - #if POWER_LOSS_RETRACT_LEN || POWER_LOSS_ZRAISE - - gcode.set_relative_mode(true); // Use relative coordinates - - #if POWER_LOSS_RETRACT_LEN - // Retract filament now - gcode.process_subcommands_now_P(PSTR("G1 F3000 E-" STRINGIFY(POWER_LOSS_RETRACT_LEN))); - #endif - - #if POWER_LOSS_ZRAISE - // Raise the Z axis now - if (zraise) { - char cmd[20], str_1[16]; - sprintf_P(cmd, PSTR("G0 Z%s"), dtostrf(zraise, 1, 3, str_1)); - gcode.process_subcommands_now(cmd); - } - #else - UNUSED(zraise); - #endif - - //gcode.axis_relative = info.axis_relative; - planner.synchronize(); - #endif - } - - #endif - - /** - * An outage was detected by a sensor pin. - * - If not SD printing, let the machine turn off on its own with no "KILL" screen - * - Disable all heaters first to save energy - * - Save the recovery data for the current instant - * - If backup power is available Retract E and Raise Z - * - Go to the KILL screen - */ - void PrintJobRecovery::_outage() { - #if ENABLED(BACKUP_POWER_SUPPLY) - static bool lock = false; - if (lock) return; // No re-entrance from idle() during retract_and_lift() - lock = true; - #endif - - #if POWER_LOSS_ZRAISE - // Get the limited Z-raise to do now or on resume - const float zraise = _MAX(0, _MIN(current_position.z + POWER_LOSS_ZRAISE, Z_MAX_POS - 1) - current_position.z); - #else - constexpr float zraise = 0; - #endif - - // Save, including the limited Z raise - if (IS_SD_PRINTING()) save(true, zraise); - - // Disable all heaters to reduce power loss - thermalManager.disable_all_heaters(); - - #if ENABLED(BACKUP_POWER_SUPPLY) - // Do a hard-stop of the steppers (with possibly a loud thud) - quickstop_stepper(); - // With backup power a retract and raise can be done now - retract_and_lift(zraise); - #endif - - kill(GET_TEXT(MSG_OUTAGE_RECOVERY)); - } - -#endif - -/** - * Save the recovery info the recovery file - */ -void PrintJobRecovery::write() { - - debug(PSTR("Write")); - - open(false); - file.seekSet(0); - const int16_t ret = file.write(&info, sizeof(info)); - if (ret == -1) DEBUG_ECHOLNPGM("Power-loss file write failed."); - if (!file.close()) DEBUG_ECHOLNPGM("Power-loss file close failed."); -} - -/** - * Resume the saved print job - */ -void PrintJobRecovery::resume() { - - char cmd[MAX_CMD_SIZE+16], str_1[16], str_2[16]; - - const uint32_t resume_sdpos = info.sdpos; // Get here before the stepper ISR overwrites it - - // Apply the dry-run flag if enabled - if (info.flag.dryrun) marlin_debug_flags |= MARLIN_DEBUG_DRYRUN; - - // Restore cold extrusion permission - TERN_(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude = info.flag.allow_cold_extrusion); - - #if HAS_LEVELING - // Make sure leveling is off before any G92 and G28 - gcode.process_subcommands_now_P(PSTR("M420 S0 Z0")); - #endif - - // Reset E, raise Z, home XY... - #if Z_HOME_DIR > 0 - - // If Z homing goes to max, just reset E and home all - gcode.process_subcommands_now_P(PSTR( - "G92.9 E0\n" - "G28R0" - )); - - #else // "G92.9 E0 ..." - - // Set Z to 0, raise Z by info.zraise, and Home (XY only for Cartesian) - // with no raise. (Only do simulated homing in Marlin Dev Mode.) - - sprintf_P(cmd, PSTR("G92.9 E0 " - #if ENABLED(BACKUP_POWER_SUPPLY) - "Z%s" // Z was already raised at outage - #else - "Z0\nG1Z%s" // Set Z=0 and Raise Z now - #endif - ), - dtostrf(info.zraise, 1, 3, str_1) - ); - gcode.process_subcommands_now(cmd); - - gcode.process_subcommands_now_P(PSTR( - "G28R0" // No raise during G28 - #if IS_CARTESIAN && DISABLED(POWER_LOSS_RECOVER_ZHOME) - "XY" // Don't home Z on Cartesian unless overridden - #endif - )); - - #endif - - // Pretend that all axes are homed - set_all_homed(); - - #if ENABLED(POWER_LOSS_RECOVER_ZHOME) - // Z has been homed so restore Z to ZsavedPos + POWER_LOSS_ZRAISE - sprintf_P(cmd, PSTR("G1 F500 Z%s"), dtostrf(info.current_position.z + POWER_LOSS_ZRAISE, 1, 3, str_1)); - gcode.process_subcommands_now(cmd); - #endif - - // Recover volumetric extrusion state - #if DISABLED(NO_VOLUMETRICS) - #if HAS_MULTI_EXTRUDER - for (int8_t e = 0; e < EXTRUDERS; e++) { - sprintf_P(cmd, PSTR("M200 T%i D%s"), e, dtostrf(info.filament_size[e], 1, 3, str_1)); - gcode.process_subcommands_now(cmd); - } - if (!info.volumetric_enabled) { - sprintf_P(cmd, PSTR("M200 T%i D0"), info.active_extruder); - gcode.process_subcommands_now(cmd); - } - #else - if (info.volumetric_enabled) { - sprintf_P(cmd, PSTR("M200 D%s"), dtostrf(info.filament_size[0], 1, 3, str_1)); - gcode.process_subcommands_now(cmd); - } - #endif - #endif - - #if HAS_HEATED_BED - const int16_t bt = info.target_temperature_bed; - if (bt) { - // Restore the bed temperature - sprintf_P(cmd, PSTR("M190 S%i"), bt); - gcode.process_subcommands_now(cmd); - } - #endif - - // Restore all hotend temperatures - #if HAS_HOTEND - HOTEND_LOOP() { - const int16_t et = info.target_temperature[e]; - if (et) { - #if HAS_MULTI_HOTEND - sprintf_P(cmd, PSTR("T%i S"), e); - gcode.process_subcommands_now(cmd); - #endif - sprintf_P(cmd, PSTR("M109 S%i"), et); - gcode.process_subcommands_now(cmd); - } - } - #endif - - // Select the previously active tool (with no_move) - #if HAS_MULTI_EXTRUDER - sprintf_P(cmd, PSTR("T%i S"), info.active_extruder); - gcode.process_subcommands_now(cmd); - #endif - - // Restore print cooling fan speeds - FANS_LOOP(i) { - uint8_t f = info.fan_speed[i]; - if (f) { - sprintf_P(cmd, PSTR("M106 P%i S%i"), i, f); - gcode.process_subcommands_now(cmd); - } - } - - // Restore retract and hop state - #if ENABLED(FWRETRACT) - LOOP_L_N(e, EXTRUDERS) { - if (info.retract[e] != 0.0) { - fwretract.current_retract[e] = info.retract[e]; - fwretract.retracted[e] = true; - } - } - fwretract.current_hop = info.retract_hop; - #endif - - #if HAS_LEVELING - // Restore leveling state before 'G92 Z' to ensure - // the Z stepper count corresponds to the native Z. - if (info.fade || info.leveling) { - sprintf_P(cmd, PSTR("M420 S%i Z%s"), int(info.leveling), dtostrf(info.fade, 1, 1, str_1)); - gcode.process_subcommands_now(cmd); - } - #endif - - #if ENABLED(GRADIENT_MIX) - memcpy(&mixer.gradient, &info.gradient, sizeof(info.gradient)); - #endif - - // Un-retract if there was a retract at outage - #if POWER_LOSS_RETRACT_LEN - gcode.process_subcommands_now_P(PSTR("G1 E" STRINGIFY(POWER_LOSS_RETRACT_LEN) " F3000")); - #endif - - // Additional purge if configured - #if POWER_LOSS_PURGE_LEN - sprintf_P(cmd, PSTR("G1 E%d F200"), (POWER_LOSS_PURGE_LEN) + (POWER_LOSS_RETRACT_LEN)); - gcode.process_subcommands_now(cmd); - #endif - - #if ENABLED(NOZZLE_CLEAN_FEATURE) - gcode.process_subcommands_now_P(PSTR("G12")); - #endif - - // Move back to the saved XY - sprintf_P(cmd, PSTR("G1 X%s Y%s F3000"), - dtostrf(info.current_position.x, 1, 3, str_1), - dtostrf(info.current_position.y, 1, 3, str_2) - ); - gcode.process_subcommands_now(cmd); - - // Move back to the saved Z - dtostrf(info.current_position.z, 1, 3, str_1); - #if Z_HOME_DIR > 0 || ENABLED(POWER_LOSS_RECOVER_ZHOME) - sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1); - #else - gcode.process_subcommands_now_P(PSTR("G1 Z0 F200")); - sprintf_P(cmd, PSTR("G92.9 Z%s"), str_1); - #endif - gcode.process_subcommands_now(cmd); - - // Restore the feedrate - sprintf_P(cmd, PSTR("G1 F%d"), info.feedrate); - gcode.process_subcommands_now(cmd); - - // Restore E position with G92.9 - sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position.e, 1, 3, str_1)); - gcode.process_subcommands_now(cmd); - - // Relative axis modes - gcode.axis_relative = info.axis_relative; - - TERN_(HAS_HOME_OFFSET, home_offset = info.home_offset); - TERN_(HAS_POSITION_SHIFT, position_shift = info.position_shift); - #if HAS_HOME_OFFSET || HAS_POSITION_SHIFT - LOOP_XYZ(i) update_workspace_offset((AxisEnum)i); - #endif - - #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - const uint8_t old_flags = marlin_debug_flags; - marlin_debug_flags |= MARLIN_DEBUG_ECHO; - #endif - - // Continue to apply PLR when a file is resumed! - enable(true); - - // Resume the SD file from the last position - char *fn = info.sd_filename; - extern const char M23_STR[]; - sprintf_P(cmd, M23_STR, fn); - gcode.process_subcommands_now(cmd); - sprintf_P(cmd, PSTR("M24 S%ld T%ld"), resume_sdpos, info.print_job_elapsed); - gcode.process_subcommands_now(cmd); - - TERN_(DEBUG_POWER_LOSS_RECOVERY, marlin_debug_flags = old_flags); -} - -#if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - - void PrintJobRecovery::debug(PGM_P const prefix) { - DEBUG_PRINT_P(prefix); - DEBUG_ECHOLNPAIR(" Job Recovery Info...\nvalid_head:", int(info.valid_head), " valid_foot:", int(info.valid_foot)); - if (info.valid_head) { - if (info.valid_head == info.valid_foot) { - DEBUG_ECHOPGM("current_position: "); - LOOP_XYZE(i) { - if (i) DEBUG_CHAR(','); - DEBUG_DECIMAL(info.current_position[i]); - } - DEBUG_EOL(); - - DEBUG_ECHOLNPAIR("zraise: ", info.zraise); - - #if HAS_HOME_OFFSET - DEBUG_ECHOPGM("home_offset: "); - LOOP_XYZ(i) { - if (i) DEBUG_CHAR(','); - DEBUG_DECIMAL(info.home_offset[i]); - } - DEBUG_EOL(); - #endif - - #if HAS_POSITION_SHIFT - DEBUG_ECHOPGM("position_shift: "); - LOOP_XYZ(i) { - if (i) DEBUG_CHAR(','); - DEBUG_DECIMAL(info.position_shift[i]); - } - DEBUG_EOL(); - #endif - - DEBUG_ECHOLNPAIR("feedrate: ", info.feedrate); - - #if HAS_MULTI_EXTRUDER - DEBUG_ECHOLNPAIR("active_extruder: ", int(info.active_extruder)); - #endif - - #if HAS_HOTEND - DEBUG_ECHOPGM("target_temperature: "); - HOTEND_LOOP() { - DEBUG_ECHO(info.target_temperature[e]); - if (e < HOTENDS - 1) DEBUG_CHAR(','); - } - DEBUG_EOL(); - #endif - - #if HAS_HEATED_BED - DEBUG_ECHOLNPAIR("target_temperature_bed: ", info.target_temperature_bed); - #endif - - #if HAS_FAN - DEBUG_ECHOPGM("fan_speed: "); - FANS_LOOP(i) { - DEBUG_ECHO(int(info.fan_speed[i])); - if (i < FAN_COUNT - 1) DEBUG_CHAR(','); - } - DEBUG_EOL(); - #endif - - #if HAS_LEVELING - DEBUG_ECHOLNPAIR("leveling: ", int(info.leveling), " fade: ", info.fade); - #endif - #if ENABLED(FWRETRACT) - DEBUG_ECHOPGM("retract: "); - for (int8_t e = 0; e < EXTRUDERS; e++) { - DEBUG_ECHO(info.retract[e]); - if (e < EXTRUDERS - 1) DEBUG_CHAR(','); - } - DEBUG_EOL(); - DEBUG_ECHOLNPAIR("retract_hop: ", info.retract_hop); - #endif - DEBUG_ECHOLNPAIR("sd_filename: ", info.sd_filename); - DEBUG_ECHOLNPAIR("sdpos: ", info.sdpos); - DEBUG_ECHOLNPAIR("print_job_elapsed: ", info.print_job_elapsed); - DEBUG_ECHOLNPAIR("dryrun: ", int(info.flag.dryrun)); - DEBUG_ECHOLNPAIR("allow_cold_extrusion: ", int(info.flag.allow_cold_extrusion)); - } - else - DEBUG_ECHOLNPGM("INVALID DATA"); - } - DEBUG_ECHOLNPGM("---"); - } - -#endif // DEBUG_POWER_LOSS_RECOVERY - -#endif // POWER_LOSS_RECOVERY diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h deleted file mode 100644 index e31b2ec915..0000000000 --- a/Marlin/src/feature/powerloss.h +++ /dev/null @@ -1,206 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * feature/powerloss.h - Resume an SD print after power-loss - */ - -#include "../sd/cardreader.h" -#include "../gcode/gcode.h" - -#include "../inc/MarlinConfig.h" - -#if ENABLED(MIXING_EXTRUDER) - #include "../feature/mixing.h" -#endif - -#if !defined(POWER_LOSS_STATE) && PIN_EXISTS(POWER_LOSS) - #define POWER_LOSS_STATE HIGH -#endif - -//#define DEBUG_POWER_LOSS_RECOVERY -//#define SAVE_EACH_CMD_MODE -//#define SAVE_INFO_INTERVAL_MS 0 - -typedef struct { - uint8_t valid_head; - - // Machine state - xyze_pos_t current_position; - float zraise; - - #if HAS_HOME_OFFSET - xyz_pos_t home_offset; - #endif - #if HAS_POSITION_SHIFT - xyz_pos_t position_shift; - #endif - - uint16_t feedrate; - - #if HAS_MULTI_EXTRUDER - uint8_t active_extruder; - #endif - - #if DISABLED(NO_VOLUMETRICS) - bool volumetric_enabled; - float filament_size[EXTRUDERS]; - #endif - - #if HAS_HOTEND - int16_t target_temperature[HOTENDS]; - #endif - - #if HAS_HEATED_BED - int16_t target_temperature_bed; - #endif - - #if HAS_FAN - uint8_t fan_speed[FAN_COUNT]; - #endif - - #if HAS_LEVELING - bool leveling; - float fade; - #endif - - #if ENABLED(FWRETRACT) - float retract[EXTRUDERS], retract_hop; - #endif - - // Mixing extruder and gradient - #if ENABLED(MIXING_EXTRUDER) - //uint_fast8_t selected_vtool; - //mixer_comp_t color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; - #if ENABLED(GRADIENT_MIX) - gradient_t gradient; - #endif - #endif - - // Relative axis modes - uint8_t axis_relative; - - // SD Filename and position - char sd_filename[MAXPATHNAMELENGTH]; - volatile uint32_t sdpos; - - // Job elapsed time - millis_t print_job_elapsed; - - // Misc. Marlin flags - struct { - bool dryrun:1; // M111 S8 - bool allow_cold_extrusion:1; // M302 P1 - } flag; - - uint8_t valid_foot; - - bool valid() { return valid_head && valid_head == valid_foot; } - -} job_recovery_info_t; - -class PrintJobRecovery { - public: - static const char filename[5]; - - static SdFile file; - static job_recovery_info_t info; - - static uint8_t queue_index_r; //!< Queue index of the active command - static uint32_t cmd_sdpos, //!< SD position of the next command - sdpos[BUFSIZE]; //!< SD positions of queued commands - - #if ENABLED(DWIN_CREALITY_LCD) - static bool dwin_flag; - #endif - - static void init(); - static void prepare(); - - static inline void setup() { - #if PIN_EXISTS(POWER_LOSS) - #if ENABLED(POWER_LOSS_PULL) - #if POWER_LOSS_STATE == LOW - SET_INPUT_PULLUP(POWER_LOSS_PIN); - #else - SET_INPUT_PULLDOWN(POWER_LOSS_PIN); - #endif - #else - SET_INPUT(POWER_LOSS_PIN); - #endif - #endif - } - - // Track each command's file offsets - static inline uint32_t command_sdpos() { return sdpos[queue_index_r]; } - static inline void commit_sdpos(const uint8_t index_w) { sdpos[index_w] = cmd_sdpos; } - - static bool enabled; - static void enable(const bool onoff); - static void changed(); - - static inline bool exists() { return card.jobRecoverFileExists(); } - static inline void open(const bool read) { card.openJobRecoveryFile(read); } - static inline void close() { file.close(); } - - static void check(); - static void resume(); - static void purge(); - - static inline void cancel() { purge(); card.autostart_index = 0; } - - static void load(); - static void save(const bool force=ENABLED(SAVE_EACH_CMD_MODE), const float zraise=0); - - #if PIN_EXISTS(POWER_LOSS) - static inline void outage() { - if (enabled && READ(POWER_LOSS_PIN) == POWER_LOSS_STATE) - _outage(); - } - #endif - - // The referenced file exists - static inline bool interrupted_file_exists() { return card.fileExists(info.sd_filename); } - - static inline bool valid() { return info.valid() && interrupted_file_exists(); } - - #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - static void debug(PGM_P const prefix); - #else - static inline void debug(PGM_P const) {} - #endif - - private: - static void write(); - - #if ENABLED(BACKUP_POWER_SUPPLY) - static void retract_and_lift(const float &zraise); - #endif - - #if PIN_EXISTS(POWER_LOSS) - friend class GcodeSuite; - static void _outage(); - #endif -}; - -extern PrintJobRecovery recovery; diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp deleted file mode 100644 index af8039d8b1..0000000000 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(PROBE_TEMP_COMPENSATION) - -#include "probe_temp_comp.h" -#include - -ProbeTempComp temp_comp; - -int16_t ProbeTempComp::z_offsets_probe[cali_info_init[TSI_PROBE].measurements], // = {0} - ProbeTempComp::z_offsets_bed[cali_info_init[TSI_BED].measurements]; // = {0} - -#if ENABLED(USE_TEMP_EXT_COMPENSATION) - int16_t ProbeTempComp::z_offsets_ext[cali_info_init[TSI_EXT].measurements]; // = {0} -#endif - -int16_t *ProbeTempComp::sensor_z_offsets[TSI_COUNT] = { - ProbeTempComp::z_offsets_probe, ProbeTempComp::z_offsets_bed - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - , ProbeTempComp::z_offsets_ext - #endif -}; - -const temp_calib_t ProbeTempComp::cali_info[TSI_COUNT] = { - cali_info_init[TSI_PROBE], cali_info_init[TSI_BED] - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - , cali_info_init[TSI_EXT] - #endif -}; - -constexpr xyz_pos_t ProbeTempComp::park_point; -constexpr xy_pos_t ProbeTempComp::measure_point; -constexpr int ProbeTempComp::probe_calib_bed_temp; - -uint8_t ProbeTempComp::calib_idx; // = 0 -float ProbeTempComp::init_measurement; // = 0.0 - -void ProbeTempComp::clear_offsets(const TempSensorID tsi) { - LOOP_L_N(i, cali_info[tsi].measurements) - sensor_z_offsets[tsi][i] = 0; - calib_idx = 0; -} - -bool ProbeTempComp::set_offset(const TempSensorID tsi, const uint8_t idx, const int16_t offset) { - if (idx >= cali_info[tsi].measurements) return false; - sensor_z_offsets[tsi][idx] = offset; - return true; -} - -void ProbeTempComp::print_offsets() { - LOOP_L_N(s, TSI_COUNT) { - float temp = cali_info[s].start_temp; - for (int16_t i = -1; i < cali_info[s].measurements; ++i) { - serialprintPGM(s == TSI_BED ? PSTR("Bed") : - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - s == TSI_EXT ? PSTR("Extruder") : - #endif - PSTR("Probe") - ); - SERIAL_ECHOLNPAIR( - " temp: ", temp, - "C; Offset: ", i < 0 ? 0.0f : sensor_z_offsets[s][i], " um" - ); - temp += cali_info[s].temp_res; - } - } -} - -void ProbeTempComp::prepare_new_calibration(const float &init_meas_z) { - calib_idx = 0; - init_measurement = init_meas_z; -} - -void ProbeTempComp::push_back_new_measurement(const TempSensorID tsi, const float &meas_z) { - switch (tsi) { - case TSI_PROBE: - case TSI_BED: - //case TSI_EXT: - if (calib_idx >= cali_info[tsi].measurements) return; - sensor_z_offsets[tsi][calib_idx++] = static_cast(meas_z * 1000.0f - init_measurement * 1000.0f); - default: break; - } -} - -bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { - if (tsi != TSI_PROBE && tsi != TSI_BED) return false; - - if (calib_idx < 3) { - SERIAL_ECHOLNPGM("!Insufficient measurements (min. 3)."); - clear_offsets(tsi); - return false; - } - - const uint8_t measurements = cali_info[tsi].measurements; - const float start_temp = cali_info[tsi].start_temp, - res_temp = cali_info[tsi].temp_res; - int16_t * const data = sensor_z_offsets[tsi]; - - // Extrapolate - float k, d; - if (calib_idx < measurements) { - SERIAL_ECHOLNPAIR("Got ", calib_idx, " measurements. "); - if (linear_regression(tsi, k, d)) { - SERIAL_ECHOPGM("Applying linear extrapolation"); - calib_idx--; - for (; calib_idx < measurements; ++calib_idx) { - const float temp = start_temp + float(calib_idx) * res_temp; - data[calib_idx] = static_cast(k * temp + d); - } - } - else { - // Simply use the last measured value for higher temperatures - SERIAL_ECHOPGM("Failed to extrapolate"); - const int16_t last_val = data[calib_idx]; - for (; calib_idx < measurements; ++calib_idx) - data[calib_idx] = last_val; - } - SERIAL_ECHOLNPGM(" for higher temperatures."); - } - - // Sanity check - for (calib_idx = 0; calib_idx < measurements; ++calib_idx) { - // Restrict the max. offset - if (abs(data[calib_idx]) > 2000) { - SERIAL_ECHOLNPGM("!Invalid Z-offset detected (0-2)."); - clear_offsets(tsi); - return false; - } - // Restrict the max. offset difference between two probings - if (calib_idx > 0 && abs(data[calib_idx - 1] - data[calib_idx]) > 800) { - SERIAL_ECHOLNPGM("!Invalid Z-offset between two probings detected (0-0.8)."); - clear_offsets(TSI_PROBE); - return false; - } - } - - return true; -} - -void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const float &temp, float &meas_z) { - if (WITHIN(temp, cali_info[tsi].start_temp, cali_info[tsi].end_temp)) - meas_z -= get_offset_for_temperature(tsi, temp); -} - -float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const float &temp) { - const uint8_t measurements = cali_info[tsi].measurements; - const float start_temp = cali_info[tsi].start_temp, - res_temp = cali_info[tsi].temp_res; - const int16_t * const data = sensor_z_offsets[tsi]; - - auto point = [&](uint8_t i) { - return xy_float_t({start_temp + i*res_temp, static_cast(data[i])}); - }; - - auto linear_interp = [](float x, xy_float_t p1, xy_float_t p2) { - return (p2.y - p1.y) / (p2.x - p2.y) * (x - p1.x) + p1.y; - }; - - // Linear interpolation - uint8_t idx = static_cast((temp - start_temp) / res_temp); - - // offset in um - float offset = 0.0f; - - #if !defined(PTC_LINEAR_EXTRAPOLATION) || PTC_LINEAR_EXTRAPOLATION <= 0 - if (idx < 0) - offset = 0.0f; - else if (idx > measurements - 2) - offset = static_cast(data[measurements - 1]); - #else - if (idx < 0) - offset = linear_interp(temp, point(0), point(PTC_LINEAR_EXTRAPOLATION)); - else if (idx > measurements - 2) - offset = linear_interp(temp, point(measurements - PTC_LINEAR_EXTRAPOLATION - 1), point(measurements - 1)); - #endif - else - offset = linear_interp(temp, point(idx), point(idx + 1)); - - // return offset in mm - return offset / 1000.0f; -} - -bool ProbeTempComp::linear_regression(const TempSensorID tsi, float &k, float &d) { - if (tsi != TSI_PROBE && tsi != TSI_BED) return false; - - if (!WITHIN(calib_idx, 2, cali_info[tsi].measurements)) return false; - - const float start_temp = cali_info[tsi].start_temp, - res_temp = cali_info[tsi].temp_res; - const int16_t * const data = sensor_z_offsets[tsi]; - - float sum_x = start_temp, - sum_x2 = sq(start_temp), - sum_xy = 0, sum_y = 0; - - LOOP_L_N(i, calib_idx) { - const float xi = start_temp + (i + 1) * res_temp, - yi = static_cast(data[i]); - sum_x += xi; - sum_x2 += sq(xi); - sum_xy += xi * yi; - sum_y += yi; - } - - const float denom = static_cast(calib_idx + 1) * sum_x2 - sq(sum_x); - if (fabs(denom) <= 10e-5) { - // Singularity - unable to solve - k = d = 0.0; - return false; - } - - k = (static_cast(calib_idx + 1) * sum_xy - sum_x * sum_y) / denom; - d = (sum_y - k * sum_x) / static_cast(calib_idx + 1); - - return true; -} - -#endif // PROBE_TEMP_COMPENSATION diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h deleted file mode 100644 index 626dd87f94..0000000000 --- a/Marlin/src/feature/probe_temp_comp.h +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfig.h" - -enum TempSensorID : uint8_t { - TSI_PROBE, - TSI_BED, - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - TSI_EXT, - #endif - TSI_COUNT -}; - -typedef struct { - uint8_t measurements; // Max. number of measurements to be stored (35 - 80°C) - float temp_res, // Resolution in °C between measurements - start_temp, // Base measurement; z-offset == 0 - end_temp; -} temp_calib_t; - -/** - * Probe temperature compensation implementation. - * Z-probes like the P.I.N.D.A V2 allow for compensation of - * measurement errors/shifts due to changed temperature. - */ - -// Probe temperature calibration constants -#ifndef PTC_SAMPLE_COUNT - #define PTC_SAMPLE_COUNT 10U -#endif -#ifndef PTC_SAMPLE_RES - #define PTC_SAMPLE_RES 5.0f -#endif -#ifndef PTC_SAMPLE_START - #define PTC_SAMPLE_START 30.0f -#endif -#define PTC_SAMPLE_END ((PTC_SAMPLE_START) + (PTC_SAMPLE_COUNT) * (PTC_SAMPLE_RES)) - -// Bed temperature calibration constants -#ifndef BTC_PROBE_TEMP - #define BTC_PROBE_TEMP 30.0f -#endif -#ifndef BTC_SAMPLE_COUNT - #define BTC_SAMPLE_COUNT 10U -#endif -#ifndef BTC_SAMPLE_STEP - #define BTC_SAMPLE_RES 5.0f -#endif -#ifndef BTC_SAMPLE_START - #define BTC_SAMPLE_START 60.0f -#endif -#define BTC_SAMPLE_END ((BTC_SAMPLE_START) + (BTC_SAMPLE_COUNT) * (BTC_SAMPLE_RES)) - -#ifndef PTC_PROBE_HEATING_OFFSET - #define PTC_PROBE_HEATING_OFFSET 0.5f -#endif - -#ifndef PTC_PROBE_RAISE - #define PTC_PROBE_RAISE 10.0f -#endif - -static constexpr temp_calib_t cali_info_init[TSI_COUNT] = { - { PTC_SAMPLE_COUNT, PTC_SAMPLE_RES, PTC_SAMPLE_START, PTC_SAMPLE_END }, // Probe - { BTC_SAMPLE_COUNT, BTC_SAMPLE_RES, BTC_SAMPLE_START, BTC_SAMPLE_END }, // Bed - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - { 20, 5, 180, 180 + 5 * 20 } // Extruder - #endif -}; - -class ProbeTempComp { - public: - - static const temp_calib_t cali_info[TSI_COUNT]; - - // Where to park nozzle to wait for probe cooldown - static constexpr xyz_pos_t park_point = PTC_PARK_POS; - - // XY coordinates of nozzle for probing the bed - static constexpr xy_pos_t measure_point = PTC_PROBE_POS; // Coordinates to probe - //measure_point = { 12.0f, 7.3f }; // Coordinates for the MK52 magnetic heatbed - - static constexpr int probe_calib_bed_temp = BED_MAX_TARGET, // Bed temperature while calibrating probe - bed_calib_probe_temp = BTC_PROBE_TEMP; // Probe temperature while calibrating bed - - static int16_t *sensor_z_offsets[TSI_COUNT], - z_offsets_probe[cali_info_init[TSI_PROBE].measurements], // (µm) - z_offsets_bed[cali_info_init[TSI_BED].measurements]; // (µm) - - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - static int16_t z_offsets_ext[cali_info_init[TSI_EXT].measurements]; // (µm) - #endif - - static inline void reset_index() { calib_idx = 0; }; - static inline uint8_t get_index() { return calib_idx; } - static void clear_offsets(const TempSensorID tsi); - static inline void clear_all_offsets() { - clear_offsets(TSI_BED); - clear_offsets(TSI_PROBE); - TERN_(USE_TEMP_EXT_COMPENSATION, clear_offsets(TSI_EXT)); - } - static bool set_offset(const TempSensorID tsi, const uint8_t idx, const int16_t offset); - static void print_offsets(); - static void prepare_new_calibration(const float &init_meas_z); - static void push_back_new_measurement(const TempSensorID tsi, const float &meas_z); - static bool finish_calibration(const TempSensorID tsi); - static void compensate_measurement(const TempSensorID tsi, const float &temp, float &meas_z); - - private: - static uint8_t calib_idx; - - /** - * Base value. Temperature compensation values will be deltas - * to this value, set at first probe. - */ - static float init_measurement; - - static float get_offset_for_temperature(const TempSensorID tsi, const float &temp); - - /** - * Fit a linear function in measured temperature offsets - * to allow generating values of higher temperatures. - */ - static bool linear_regression(const TempSensorID tsi, float &k, float &d); -}; - -extern ProbeTempComp temp_comp; diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 71f31f2145..fde93e7f7a 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -26,114 +26,38 @@ #include "../inc/MarlinConfigPre.h" -#if HAS_FILAMENT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) #include "runout.h" -FilamentMonitor runout; +FilamentRunoutSensor runout; -bool FilamentMonitorBase::enabled = true, - FilamentMonitorBase::filament_ran_out; // = false +bool FilamentRunoutSensor::filament_ran_out; // = false +uint8_t FilamentRunoutSensor::runout_count; // = 0 -#if ENABLED(HOST_ACTION_COMMANDS) - bool FilamentMonitorBase::host_handling; // = false -#endif +void FilamentRunoutSensor::setup() { -#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - //#define DEBUG_TOOLCHANGE_MIGRATION_FEATURE - #include "../module/tool_change.h" -#endif - -#if HAS_FILAMENT_RUNOUT_DISTANCE - float RunoutResponseDelayed::runout_distance_mm = FILAMENT_RUNOUT_DISTANCE_MM; - volatile float RunoutResponseDelayed::runout_mm_countdown[EXTRUDERS]; - #if ENABLED(FILAMENT_MOTION_SENSOR) - uint8_t FilamentSensorEncoder::motion_detected; - #endif -#else - int8_t RunoutResponseDebounced::runout_count; // = 0 -#endif - -// -// Filament Runout event handler -// -#include "../MarlinCore.h" -#include "../gcode/queue.h" - -#if ENABLED(HOST_ACTION_COMMANDS) - #include "host_actions.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif - -void event_filament_runout() { - - if (TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print)) return; // Action already in progress. Purge triggered repeated runout. - - #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - if (migration.in_progress) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration Already In Progress"); - #endif - return; // Action already in progress. Purge triggered repeated runout. - } - if (migration.automode) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration Starting"); - #endif - if (extruder_migration()) return; - } + #if ENABLED(FIL_RUNOUT_PULLUP) + #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLUP(P) + #elif ENABLED(FIL_RUNOUT_PULLDOWN) + #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLDOWN(P) + #else + #define INIT_RUNOUT_PIN(P) SET_INPUT(P) #endif - TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getActiveTool())); - - #if EITHER(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS) - const char tool = '0' - #if NUM_RUNOUT_SENSORS > 1 - + active_extruder - #endif - ; - #endif - - //action:out_of_filament - #if ENABLED(HOST_PROMPT_SUPPORT) - host_action_prompt_begin(PROMPT_FILAMENT_RUNOUT, PSTR("FilamentRunout T"), tool); - host_action_prompt_show(); - #endif - - const bool run_runout_script = !runout.host_handling; - - #if ENABLED(HOST_ACTION_COMMANDS) - if (run_runout_script - && ( strstr(FILAMENT_RUNOUT_SCRIPT, "M600") - || strstr(FILAMENT_RUNOUT_SCRIPT, "M125") - #if ENABLED(ADVANCED_PAUSE_FEATURE) - || strstr(FILAMENT_RUNOUT_SCRIPT, "M25") + INIT_RUNOUT_PIN(FIL_RUNOUT_PIN); + #if NUM_RUNOUT_SENSORS > 1 + INIT_RUNOUT_PIN(FIL_RUNOUT2_PIN); + #if NUM_RUNOUT_SENSORS > 2 + INIT_RUNOUT_PIN(FIL_RUNOUT3_PIN); + #if NUM_RUNOUT_SENSORS > 3 + INIT_RUNOUT_PIN(FIL_RUNOUT4_PIN); + #if NUM_RUNOUT_SENSORS > 4 + INIT_RUNOUT_PIN(FIL_RUNOUT5_PIN); #endif - ) - ) { - host_action_paused(false); - } - else { - // Legacy Repetier command for use until newer version supports standard dialog - // To be removed later when pause command also triggers dialog - #ifdef ACTION_ON_FILAMENT_RUNOUT - host_action(PSTR(ACTION_ON_FILAMENT_RUNOUT " T"), false); - SERIAL_CHAR(tool); - SERIAL_EOL(); #endif - - host_action_pause(false); - } - SERIAL_ECHOPGM(" " ACTION_REASON_ON_FILAMENT_RUNOUT " "); - SERIAL_CHAR(tool); - SERIAL_EOL(); - #endif // HOST_ACTION_COMMANDS - - if (run_runout_script) - queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); + #endif + #endif } -#endif // HAS_FILAMENT_SENSOR +#endif // FILAMENT_RUNOUT_SENSOR diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index a7f8366849..47bd2cf7b8 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,322 +16,70 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * feature/runout.h - Runout sensor support */ +#ifndef _RUNOUT_H_ +#define _RUNOUT_H_ + #include "../sd/cardreader.h" #include "../module/printcounter.h" -#include "../module/planner.h" -#include "../module/stepper.h" // for block_t +#include "../module/stepper.h" #include "../gcode/queue.h" #include "../inc/MarlinConfig.h" -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif +#define FIL_RUNOUT_THRESHOLD 5 -#if ENABLED(ADVANCED_PAUSE_FEATURE) - #include "pause.h" -#endif - -//#define FILAMENT_RUNOUT_SENSOR_DEBUG -#ifndef FILAMENT_RUNOUT_THRESHOLD - #define FILAMENT_RUNOUT_THRESHOLD 5 -#endif - -void event_filament_runout(); - -template -class TFilamentMonitor; -class FilamentSensorEncoder; -class FilamentSensorSwitch; -class RunoutResponseDelayed; -class RunoutResponseDebounced; - -/********************************* TEMPLATE SPECIALIZATION *********************************/ - -typedef TFilamentMonitor< - TERN(HAS_FILAMENT_RUNOUT_DISTANCE, RunoutResponseDelayed, RunoutResponseDebounced), - TERN(FILAMENT_MOTION_SENSOR, FilamentSensorEncoder, FilamentSensorSwitch) - > FilamentMonitor; - -extern FilamentMonitor runout; - -/*******************************************************************************************/ - -class FilamentMonitorBase { +class FilamentRunoutSensor { public: - static bool enabled, filament_ran_out; + FilamentRunoutSensor() {} - #if ENABLED(HOST_ACTION_COMMANDS) - static bool host_handling; - #else - static constexpr bool host_handling = false; - #endif -}; + static void setup(); -template -class TFilamentMonitor : public FilamentMonitorBase { + FORCE_INLINE static void reset() { runout_count = 0; filament_ran_out = false; } + + FORCE_INLINE static void run() { + if ((IS_SD_PRINTING || print_job_timer.isRunning()) && check() && !filament_ran_out) { + filament_ran_out = true; + enqueue_and_echo_commands_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); + planner.synchronize(); + } + } private: - typedef RESPONSE_T response_t; - typedef SENSOR_T sensor_t; - static response_t response; - static sensor_t sensor; + static bool filament_ran_out; + static uint8_t runout_count; - public: - static inline void setup() { - sensor.setup(); - reset(); - } - - static inline void reset() { - filament_ran_out = false; - response.reset(); - } - - // Call this method when filament is present, - // so the response can reset its counter. - static inline void filament_present(const uint8_t extruder) { - response.filament_present(extruder); - } - - #if HAS_FILAMENT_RUNOUT_DISTANCE - static inline float& runout_distance() { return response.runout_distance_mm; } - static inline void set_runout_distance(const float &mm) { response.runout_distance_mm = mm; } - #endif - - // Handle a block completion. RunoutResponseDelayed uses this to - // add up the length of filament moved while the filament is out. - static inline void block_completed(const block_t* const b) { - if (enabled) { - response.block_completed(b); - sensor.block_completed(b); - } - } - - // Give the response a chance to update its counter. - static inline void run() { - if ( enabled && !filament_ran_out - && (printingIsActive() || TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print)) - ) { - TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, cli()); // Prevent RunoutResponseDelayed::block_completed from accumulating here - response.run(); - sensor.run(); - const bool ran_out = response.has_run_out(); - TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, sei()); - if (ran_out) { - filament_ran_out = true; - event_filament_runout(); - planner.synchronize(); - } - } - } -}; - -/*************************** FILAMENT PRESENCE SENSORS ***************************/ - -class FilamentSensorBase { - protected: - /** - * Called by FilamentSensorSwitch::run when filament is detected. - * Called by FilamentSensorEncoder::block_completed when motion is detected. - */ - static inline void filament_present(const uint8_t extruder) { - runout.filament_present(extruder); // ...which calls response.filament_present(extruder) - } - - public: - static inline void setup() { - #if ENABLED(FIL_RUNOUT_PULLUP) - #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLUP(P) - #elif ENABLED(FIL_RUNOUT_PULLDOWN) - #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLDOWN(P) + FORCE_INLINE static bool check() { + #if NUM_RUNOUT_SENSORS < 2 + // A single sensor applying to all extruders + const bool is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; #else - #define INIT_RUNOUT_PIN(P) SET_INPUT(P) + // Read the sensor for the active extruder + bool is_out; + switch (active_extruder) { + case 0: is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; break; + case 1: is_out = READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING; break; + #if NUM_RUNOUT_SENSORS > 2 + case 2: is_out = READ(FIL_RUNOUT3_PIN) == FIL_RUNOUT_INVERTING; break; + #if NUM_RUNOUT_SENSORS > 3 + case 3: is_out = READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING; break; + #if NUM_RUNOUT_SENSORS > 4 + case 4: is_out = READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING; break; + #endif + #endif + #endif + } #endif - - #define _INIT_RUNOUT(N) INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN); - REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _INIT_RUNOUT) - #undef _INIT_RUNOUT - #undef INIT_RUNOUT_PIN - } - - // Return a bitmask of runout pin states - static inline uint8_t poll_runout_pins() { - #define _OR_RUNOUT(N) | (READ(FIL_RUNOUT##N##_PIN) ? _BV((N) - 1) : 0) - return (0 REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _OR_RUNOUT)); - #undef _OR_RUNOUT - } - - // Return a bitmask of runout flag states (1 bits always indicates runout) - static inline uint8_t poll_runout_states() { - return poll_runout_pins() - #if FIL_RUNOUT_STATE == LOW - ^ uint8_t(_BV(NUM_RUNOUT_SENSORS) - 1) - #endif - ; + return (is_out ? ++runout_count : (runout_count = 0)) > FIL_RUNOUT_THRESHOLD; } }; -#if ENABLED(FILAMENT_MOTION_SENSOR) +extern FilamentRunoutSensor runout; - /** - * This sensor uses a magnetic encoder disc and a Hall effect - * sensor (or a slotted disc and optical sensor). The state - * will toggle between 0 and 1 on filament movement. It can detect - * filament runout and stripouts or jams. - */ - class FilamentSensorEncoder : public FilamentSensorBase { - private: - static uint8_t motion_detected; - - static inline void poll_motion_sensor() { - static uint8_t old_state; - const uint8_t new_state = poll_runout_pins(), - change = old_state ^ new_state; - old_state = new_state; - - #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG - if (change) { - SERIAL_ECHOPGM("Motion detected:"); - LOOP_L_N(e, NUM_RUNOUT_SENSORS) - if (TEST(change, e)) SERIAL_CHAR(' ', '0' + e); - SERIAL_EOL(); - } - #endif - - motion_detected |= change; - } - - public: - static inline void block_completed(const block_t* const b) { - // If the sensor wheel has moved since the last call to - // this method reset the runout counter for the extruder. - if (TEST(motion_detected, b->extruder)) - filament_present(b->extruder); - - // Clear motion triggers for next block - motion_detected = 0; - } - - static inline void run() { poll_motion_sensor(); } - }; - -#else - - /** - * This is a simple endstop switch in the path of the filament. - * It can detect filament runout, but not stripouts or jams. - */ - class FilamentSensorSwitch : public FilamentSensorBase { - private: - static inline bool poll_runout_state(const uint8_t extruder) { - const uint8_t runout_states = poll_runout_states(); - #if NUM_RUNOUT_SENSORS == 1 - UNUSED(extruder); - #else - if ( !TERN0(DUAL_X_CARRIAGE, dxc_is_duplicating()) - && !TERN0(MULTI_NOZZLE_DUPLICATION, extruder_duplication_enabled) - ) return TEST(runout_states, extruder); // A specific extruder ran out - #endif - return !!runout_states; // Any extruder ran out - } - - public: - static inline void block_completed(const block_t* const) {} - - static inline void run() { - const bool out = poll_runout_state(active_extruder); - if (!out) filament_present(active_extruder); - #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG - static bool was_out = false; - if (out != was_out) { - was_out = out; - SERIAL_ECHOPGM("Filament "); - serialprintPGM(out ? PSTR("OUT\n") : PSTR("IN\n")); - } - #endif - } - }; - - -#endif // !FILAMENT_MOTION_SENSOR - -/********************************* RESPONSE TYPE *********************************/ - -#if HAS_FILAMENT_RUNOUT_DISTANCE - - // RunoutResponseDelayed triggers a runout event only if the length - // of filament specified by FILAMENT_RUNOUT_DISTANCE_MM has been fed - // during a runout condition. - class RunoutResponseDelayed { - private: - static volatile float runout_mm_countdown[EXTRUDERS]; - - public: - static float runout_distance_mm; - - static inline void reset() { - LOOP_L_N(i, EXTRUDERS) filament_present(i); - } - - static inline void run() { - #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG - static millis_t t = 0; - const millis_t ms = millis(); - if (ELAPSED(ms, t)) { - t = millis() + 1000UL; - LOOP_L_N(i, EXTRUDERS) { - serialprintPGM(i ? PSTR(", ") : PSTR("Remaining mm: ")); - SERIAL_ECHO(runout_mm_countdown[i]); - } - SERIAL_EOL(); - } - #endif - } - - static inline bool has_run_out() { - return runout_mm_countdown[active_extruder] < 0; - } - - static inline void filament_present(const uint8_t extruder) { - runout_mm_countdown[extruder] = runout_distance_mm; - } - - static inline void block_completed(const block_t* const b) { - if (b->steps.x || b->steps.y || b->steps.z - || TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print) // Allow pause purge move to re-trigger runout state - ) { - // Only trigger on extrusion with XYZ movement to allow filament change and retract/recover. - const uint8_t e = b->extruder; - const int32_t steps = b->steps.e; - runout_mm_countdown[e] -= (TEST(b->direction_bits, E_AXIS) ? -steps : steps) * planner.steps_to_mm[E_AXIS_N(e)]; - } - } - }; - -#else // !HAS_FILAMENT_RUNOUT_DISTANCE - - // RunoutResponseDebounced triggers a runout event after a runout - // condition has been detected runout_threshold times in a row. - - class RunoutResponseDebounced { - private: - static constexpr int8_t runout_threshold = FILAMENT_RUNOUT_THRESHOLD; - static int8_t runout_count; - public: - static inline void reset() { runout_count = runout_threshold; } - static inline void run() { if (runout_count >= 0) runout_count--; } - static inline bool has_run_out() { return runout_count < 0; } - static inline void block_completed(const block_t* const) { } - static inline void filament_present(const uint8_t) { runout_count = runout_threshold; } - }; - -#endif // !HAS_FILAMENT_RUNOUT_DISTANCE +#endif // _RUNOUT_H_ diff --git a/Marlin/src/feature/snmm.cpp b/Marlin/src/feature/snmm.cpp index 25723f7b38..e8c04f2197 100644 --- a/Marlin/src/feature/snmm.cpp +++ b/Marlin/src/feature/snmm.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/feature/snmm.h b/Marlin/src/feature/snmm.h index 10805c8e26..b15f9147a6 100644 --- a/Marlin/src/feature/snmm.h +++ b/Marlin/src/feature/snmm.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,9 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __SNMM_H__ +#define __SNMM_H__ void select_multiplexed_stepper(const uint8_t e); + +#endif // __SNMM_H__ diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp index 8646ec872f..dcb63cd866 100644 --- a/Marlin/src/feature/solenoid.cpp +++ b/Marlin/src/feature/solenoid.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,83 +16,66 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../inc/MarlinConfig.h" -#if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) +#if ENABLED(EXT_SOLENOID) #include "solenoid.h" #include "../module/motion.h" // for active_extruder -#if ENABLED(MANUAL_SOLENOID_CONTROL) - #define HAS_SOLENOID(N) HAS_SOLENOID_##N -#else - #define HAS_SOLENOID(N) (HAS_SOLENOID_##N && EXTRUDERS > N) -#endif - -// Used primarily with MANUAL_SOLENOID_CONTROL -static void set_solenoid(const uint8_t num, const bool active) { - const uint8_t value = active ? HIGH : LOW; +inline void enable_solenoid(const uint8_t num) { switch (num) { case 0: - OUT_WRITE(SOL0_PIN, value); + OUT_WRITE(SOL0_PIN, HIGH); break; - #if HAS_SOLENOID(1) - case 1: - OUT_WRITE(SOL1_PIN, value); - break; - #endif - #if HAS_SOLENOID(2) - case 2: - OUT_WRITE(SOL2_PIN, value); - break; - #endif - #if HAS_SOLENOID(3) - case 3: - OUT_WRITE(SOL3_PIN, value); - break; - #endif - #if HAS_SOLENOID(4) - case 4: - OUT_WRITE(SOL4_PIN, value); - break; - #endif - #if HAS_SOLENOID(5) - case 5: - OUT_WRITE(SOL5_PIN, value); - break; - #endif + #if HAS_SOLENOID_1 && EXTRUDERS > 1 + case 1: + OUT_WRITE(SOL1_PIN, HIGH); + break; + #endif + #if HAS_SOLENOID_2 && EXTRUDERS > 2 + case 2: + OUT_WRITE(SOL2_PIN, HIGH); + break; + #endif + #if HAS_SOLENOID_3 && EXTRUDERS > 3 + case 3: + OUT_WRITE(SOL3_PIN, HIGH); + break; + #endif + #if HAS_SOLENOID_4 && EXTRUDERS > 4 + case 4: + OUT_WRITE(SOL4_PIN, HIGH); + break; + #endif default: - SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_INVALID_SOLENOID); break; } } -void enable_solenoid(const uint8_t num) { set_solenoid(num, true); } -void disable_solenoid(const uint8_t num) { set_solenoid(num, false); } void enable_solenoid_on_active_extruder() { enable_solenoid(active_extruder); } void disable_all_solenoids() { - disable_solenoid(0); - #if HAS_SOLENOID(1) - disable_solenoid(1); + OUT_WRITE(SOL0_PIN, LOW); + #if HAS_SOLENOID_1 && EXTRUDERS > 1 + OUT_WRITE(SOL1_PIN, LOW); #endif - #if HAS_SOLENOID(2) - disable_solenoid(2); + #if HAS_SOLENOID_2 && EXTRUDERS > 2 + OUT_WRITE(SOL2_PIN, LOW); #endif - #if HAS_SOLENOID(3) - disable_solenoid(3); + #if HAS_SOLENOID_3 && EXTRUDERS > 3 + OUT_WRITE(SOL3_PIN, LOW); #endif - #if HAS_SOLENOID(4) - disable_solenoid(4); - #endif - #if HAS_SOLENOID(5) - disable_solenoid(5); + #if HAS_SOLENOID_4 && EXTRUDERS > 4 + OUT_WRITE(SOL4_PIN, LOW); #endif } -#endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL +#endif // EXT_SOLENOID diff --git a/Marlin/src/feature/solenoid.h b/Marlin/src/feature/solenoid.h index 2ba4983fb0..5959b99a4e 100644 --- a/Marlin/src/feature/solenoid.h +++ b/Marlin/src/feature/solenoid.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,14 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __SOLENOID_H__ +#define __SOLENOID_H__ void enable_solenoid_on_active_extruder(); void disable_all_solenoids(); -void enable_solenoid(const uint8_t num); -void disable_solenoid(const uint8_t num); + +#endif // __SOLENOID_H__ diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp deleted file mode 100644 index bc387a9334..0000000000 --- a/Marlin/src/feature/spindle_laser.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * feature/spindle_laser.cpp - */ - -#include "../inc/MarlinConfig.h" - -#if HAS_CUTTER - -#include "spindle_laser.h" - -SpindleLaser cutter; -uint8_t SpindleLaser::power; -bool SpindleLaser::isReady; // Ready to apply power setting from the UI to OCR -cutter_power_t SpindleLaser::menuPower, // Power set via LCD menu in PWM, PERCENT, or RPM - SpindleLaser::unitPower; // LCD status power in PWM, PERCENT, or RPM - -#if ENABLED(MARLIN_DEV_MODE) - cutter_frequency_t SpindleLaser::frequency; // PWM frequency setting; range: 2K - 50K -#endif -#define SPINDLE_LASER_PWM_OFF ((SPINDLE_LASER_PWM_INVERT) ? 255 : 0) - -// -// Init the cutter to a safe OFF state -// -void SpindleLaser::init() { - OUT_WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Init spindle to off - #if ENABLED(SPINDLE_CHANGE_DIR) - OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // Init rotation to clockwise (M3) - #endif - #if ENABLED(SPINDLE_LASER_PWM) - SET_PWM(SPINDLE_LASER_PWM_PIN); - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed - #endif - #if ENABLED(HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) - set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_FREQUENCY); - TERN_(MARLIN_DEV_MODE, frequency = SPINDLE_LASER_FREQUENCY); - #endif -} - -#if ENABLED(SPINDLE_LASER_PWM) - /** - * Set the cutter PWM directly to the given ocr value - */ - void SpindleLaser::set_ocr(const uint8_t ocr) { - WRITE(SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_ACTIVE_STATE); // Turn spindle on - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); - #if NEEDS_HARDWARE_PWM && SPINDLE_LASER_FREQUENCY - set_pwm_duty(pin_t(SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF); - #endif - } - void SpindleLaser::ocr_off() { - WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Turn spindle off - analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Only write low byte - } -#endif - -// -// Set cutter ON/OFF state (and PWM) to the given cutter power value -// -void SpindleLaser::apply_power(const uint8_t opwr) { - static uint8_t last_power_applied = 0; - if (opwr == last_power_applied) return; - last_power_applied = opwr; - power = opwr; - #if ENABLED(SPINDLE_LASER_PWM) - if (cutter.unitPower == 0 && CUTTER_UNIT_IS(RPM)) { - ocr_off(); - isReady = false; - } - else if (enabled() || ENABLED(CUTTER_POWER_RELATIVE)) { - set_ocr(power); - isReady = true; - } - else { - ocr_off(); - isReady = false; - } - #else - WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE); - isReady = true; - #endif -} - -#if ENABLED(SPINDLE_CHANGE_DIR) - // - // Set the spindle direction and apply immediately - // Stop on direction change if SPINDLE_STOP_ON_DIR_CHANGE is enabled - // - void SpindleLaser::set_direction(const bool reverse) { - const bool dir_state = (reverse == SPINDLE_INVERT_DIR); // Forward (M3) HIGH when not inverted - if (TERN0(SPINDLE_STOP_ON_DIR_CHANGE, enabled()) && READ(SPINDLE_DIR_PIN) != dir_state) disable(); - WRITE(SPINDLE_DIR_PIN, dir_state); - } -#endif - -#endif // HAS_CUTTER diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h deleted file mode 100644 index 15ff661c73..0000000000 --- a/Marlin/src/feature/spindle_laser.h +++ /dev/null @@ -1,282 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * feature/spindle_laser.h - * Support for Laser Power or Spindle Power & Direction - */ - -#include "../inc/MarlinConfig.h" - -#include "spindle_laser_types.h" - -#if ENABLED(LASER_POWER_INLINE) - #include "../module/planner.h" -#endif - -#define PCT_TO_PWM(X) ((X) * 255 / 100) - -#ifndef SPEED_POWER_INTERCEPT - #define SPEED_POWER_INTERCEPT 0 -#endif -#define SPEED_POWER_FLOOR TERN(CUTTER_POWER_RELATIVE, SPEED_POWER_MIN, 0) - -// #define _MAP(N,S1,S2,D1,D2) ((N)*_MAX((D2)-(D1),0)/_MAX((S2)-(S1),1)+(D1)) - -class SpindleLaser { -public: - static constexpr float - min_pct = round(TERN(CUTTER_POWER_RELATIVE, 0, (100 * float(SPEED_POWER_MIN) / TERN(SPINDLE_FEATURE, float(SPEED_POWER_MAX), 100)))), - max_pct = round(TERN(SPINDLE_FEATURE, 100, float(SPEED_POWER_MAX))); - - static const inline uint8_t pct_to_ocr(const float pct) { return uint8_t(PCT_TO_PWM(pct)); } - - // cpower = configured values (ie SPEED_POWER_MAX) - static const inline uint8_t cpwr_to_pct(const cutter_cpower_t cpwr) { // configured value to pct - return unitPower ? round(100 * (cpwr - SPEED_POWER_FLOOR) / (SPEED_POWER_MAX - SPEED_POWER_FLOOR)) : 0; - } - - // Convert a configured value (cpower)(ie SPEED_POWER_STARTUP) to unit power (upwr, upower), - // which can be PWM, Percent, or RPM (rel/abs). - static const inline cutter_power_t cpwr_to_upwr(const cutter_cpower_t cpwr) { // STARTUP power to Unit power - const cutter_power_t upwr = ( - #if ENABLED(SPINDLE_FEATURE) - // Spindle configured values are in RPM - #if CUTTER_UNIT_IS(RPM) - cpwr // to RPM - #elif CUTTER_UNIT_IS(PERCENT) // to PCT - cpwr_to_pct(cpwr) - #else // to PWM - PCT_TO_PWM(cpwr_to_pct(cpwr)) - #endif - #else - // Laser configured values are in PCT - #if CUTTER_UNIT_IS(PWM255) - PCT_TO_PWM(cpwr) - #else - cpwr // to RPM/PCT - #endif - #endif - ); - return upwr; - } - - static const cutter_power_t mpower_min() { return cpwr_to_upwr(SPEED_POWER_MIN); } - static const cutter_power_t mpower_max() { return cpwr_to_upwr(SPEED_POWER_MAX); } - - static bool isReady; // Ready to apply power setting from the UI to OCR - static uint8_t power; - - #if ENABLED(MARLIN_DEV_MODE) - static cutter_frequency_t frequency; // Set PWM frequency; range: 2K-50K - #endif - - static cutter_power_t menuPower, // Power as set via LCD menu in PWM, Percentage or RPM - unitPower; // Power as displayed status in PWM, Percentage or RPM - - static void init(); - - #if ENABLED(MARLIN_DEV_MODE) - static inline void refresh_frequency() { set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), frequency); } - #endif - - // Modifying this function should update everywhere - static inline bool enabled(const cutter_power_t opwr) { return opwr > 0; } - static inline bool enabled() { return enabled(power); } - - static void apply_power(const uint8_t inpow); - - FORCE_INLINE static void refresh() { apply_power(power); } - FORCE_INLINE static void set_power(const uint8_t upwr) { power = upwr; refresh(); } - - #if ENABLED(SPINDLE_LASER_PWM) - - static void set_ocr(const uint8_t ocr); - static inline void set_ocr_power(const uint8_t ocr) { power = ocr; set_ocr(ocr); } - static void ocr_off(); - // Used to update output for power->OCR translation - static inline uint8_t upower_to_ocr(const cutter_power_t upwr) { - return ( - #if CUTTER_UNIT_IS(PWM255) - uint8_t(upwr) - #elif CUTTER_UNIT_IS(PERCENT) - pct_to_ocr(upwr) - #else - uint8_t(pct_to_ocr(cpwr_to_pct(upwr))) - #endif - ); - } - - // Correct power to configured range - static inline cutter_power_t power_to_range(const cutter_power_t pwr) { - return power_to_range(pwr, ( - #if CUTTER_UNIT_IS(PWM255) - 0 - #elif CUTTER_UNIT_IS(PERCENT) - 1 - #elif CUTTER_UNIT_IS(RPM) - 2 - #else - #error "???" - #endif - )); - } - static inline cutter_power_t power_to_range(const cutter_power_t pwr, const uint8_t pwrUnit) { - if (pwr <= 0) return 0; - cutter_power_t upwr; - switch (pwrUnit) { - case 0: // PWM - upwr = cutter_power_t( - (pwr < pct_to_ocr(min_pct)) ? pct_to_ocr(min_pct) // Use minimum if set below - : (pwr > pct_to_ocr(max_pct)) ? pct_to_ocr(max_pct) // Use maximum if set above - : pwr - ); - break; - case 1: // PERCENT - upwr = cutter_power_t( - (pwr < min_pct) ? min_pct // Use minimum if set below - : (pwr > max_pct) ? max_pct // Use maximum if set above - : pwr // PCT - ); - break; - case 2: // RPM - upwr = cutter_power_t( - (pwr < SPEED_POWER_MIN) ? SPEED_POWER_MIN // Use minimum if set below - : (pwr > SPEED_POWER_MAX) ? SPEED_POWER_MAX // Use maximum if set above - : pwr // Calculate OCR value - ); - break; - default: break; - } - return upwr; - } - - #endif // SPINDLE_LASER_PWM - - static inline void set_enabled(const bool enable) { - set_power(enable ? TERN(SPINDLE_LASER_PWM, (power ?: (unitPower ? upower_to_ocr(cpwr_to_upwr(SPEED_POWER_STARTUP)) : 0)), 255) : 0); - } - - // Wait for spindle to spin up or spin down - static inline void power_delay(const bool on) { - #if DISABLED(LASER_POWER_INLINE) - safe_delay(on ? SPINDLE_LASER_POWERUP_DELAY : SPINDLE_LASER_POWERDOWN_DELAY); - #endif - } - - #if ENABLED(SPINDLE_CHANGE_DIR) - static void set_direction(const bool reverse); - #else - static inline void set_direction(const bool) {} - #endif - - static inline void disable() { isReady = false; set_enabled(false); } - - #if HAS_LCD_MENU - - static inline void enable_with_dir(const bool reverse) { - isReady = true; - const uint8_t ocr = TERN(SPINDLE_LASER_PWM, upower_to_ocr(menuPower), 255); - if (menuPower) - power = ocr; - else - menuPower = cpwr_to_upwr(SPEED_POWER_STARTUP); - unitPower = menuPower; - set_direction(reverse); - set_enabled(true); - } - FORCE_INLINE static void enable_forward() { enable_with_dir(false); } - FORCE_INLINE static void enable_reverse() { enable_with_dir(true); } - - #if ENABLED(SPINDLE_LASER_PWM) - static inline void update_from_mpower() { - if (isReady) power = upower_to_ocr(menuPower); - unitPower = menuPower; - } - #endif - - #endif - - #if ENABLED(LASER_POWER_INLINE) - /** - * Inline power adds extra fields to the planner block - * to handle laser power and scale to movement speed. - */ - - // Force disengage planner power control - static inline void inline_disable() { - isReady = false; - unitPower = 0; - planner.laser_inline.status.isPlanned = false; - planner.laser_inline.status.isEnabled = false; - planner.laser_inline.power = 0; - } - - // Inline modes of all other functions; all enable planner inline power control - static inline void set_inline_enabled(const bool enable) { - if (enable) - inline_power(cpwr_to_upwr(SPEED_POWER_STARTUP)); - else { - isReady = false; - unitPower = menuPower = 0; - planner.laser_inline.status.isPlanned = false; - TERN(SPINDLE_LASER_PWM, inline_ocr_power, inline_power)(0); - } - } - - // Set the power for subsequent movement blocks - static void inline_power(const cutter_power_t upwr) { - unitPower = menuPower = upwr; - #if ENABLED(SPINDLE_LASER_PWM) - #if ENABLED(SPEED_POWER_RELATIVE) && !CUTTER_UNIT_IS(RPM) // relative mode does not turn laser off at 0, except for RPM - planner.laser_inline.status.isEnabled = true; - planner.laser_inline.power = upower_to_ocr(upwr); - isReady = true; - #else - inline_ocr_power(upower_to_ocr(upwr)); - #endif - #else - planner.laser_inline.status.isEnabled = enabled(upwr); - planner.laser_inline.power = upwr; - isReady = enabled(upwr); - #endif - } - - static inline void inline_direction(const bool) { /* never */ } - - #if ENABLED(SPINDLE_LASER_PWM) - static inline void inline_ocr_power(const uint8_t ocrpwr) { - isReady = ocrpwr > 0; - planner.laser_inline.status.isEnabled = ocrpwr > 0; - planner.laser_inline.power = ocrpwr; - } - #endif - #endif // LASER_POWER_INLINE - - static inline void kill() { - TERN_(LASER_POWER_INLINE, inline_disable()); - disable(); - } -}; - -extern SpindleLaser cutter; diff --git a/Marlin/src/feature/spindle_laser_types.h b/Marlin/src/feature/spindle_laser_types.h deleted file mode 100644 index 181c4d73ac..0000000000 --- a/Marlin/src/feature/spindle_laser_types.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * feature/spindle_laser_types.h - * Support for Laser Power or Spindle Power & Direction - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(SPINDLE_FEATURE) - #define _MSG_CUTTER(M) MSG_SPINDLE_##M -#else - #define _MSG_CUTTER(M) MSG_LASER_##M -#endif -#define MSG_CUTTER(M) _MSG_CUTTER(M) - -typedef IF<(SPEED_POWER_MAX > 255), uint16_t, uint8_t>::type cutter_cpower_t; - -#if CUTTER_UNIT_IS(RPM) && SPEED_POWER_MAX > 255 - typedef uint16_t cutter_power_t; - #define CUTTER_MENU_POWER_TYPE uint16_5 - #define cutter_power2str ui16tostr5rj -#else - typedef uint8_t cutter_power_t; - #define CUTTER_MENU_POWER_TYPE uint8 - #define cutter_power2str ui8tostr3rj -#endif - -#if ENABLED(MARLIN_DEV_MODE) - typedef uint16_t cutter_frequency_t; - #define CUTTER_MENU_FREQUENCY_TYPE uint16_5 -#endif diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 781253079e..1995201922 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,33 +16,27 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../inc/MarlinConfig.h" -#if HAS_TRINAMIC_CONFIG +#if HAS_TRINAMIC #include "tmc_util.h" -#include "../MarlinCore.h" +#include "../Marlin.h" -#include "../module/stepper/indirection.h" +#include "../module/stepper_indirection.h" #include "../module/printcounter.h" #include "../libs/duration_t.h" #include "../gcode/gcode.h" #if ENABLED(TMC_DEBUG) #include "../module/planner.h" - #include "../libs/hex_print.h" - #if ENABLED(MONITOR_DRIVER_STATUS) - static uint16_t report_tmc_status_interval; // = 0 - #endif #endif -#if HAS_LCD_MENU - #include "../module/stepper.h" -#endif +bool report_tmc_status = false; /** * Check for over temperature or short to ground error flags. @@ -52,438 +46,222 @@ * and so we don't repeatedly report warning before the condition is cleared. */ #if ENABLED(MONITOR_DRIVER_STATUS) - struct TMC_driver_data { uint32_t drv_status; - bool is_otpw:1, - is_ot:1, - is_s2g:1, - is_error:1 - #if ENABLED(TMC_DEBUG) - , is_stall:1 - , is_stealth:1 - , is_standstill:1 - #if HAS_STALLGUARD - , sg_result_reasonable:1 - #endif - #endif - ; - #if ENABLED(TMC_DEBUG) - #if HAS_TMCX1X0 || HAS_TMC220x - uint8_t cs_actual; - #endif - #if HAS_STALLGUARD - uint16_t sg_result; - #endif - #endif + bool is_otpw; + bool is_ot; + bool is_error; }; - - #if HAS_TMCX1X0 - - #if ENABLED(TMC_DEBUG) - static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); } - #endif - + #if HAS_DRIVER(TMC2130) + static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); } + static uint8_t get_status_response(TMC2130Stepper &st) { return st.status_response & 0xF; } static TMC_driver_data get_driver_data(TMC2130Stepper &st) { - constexpr uint8_t OT_bp = 25, OTPW_bp = 26; - constexpr uint32_t S2G_bm = 0x18000000; - #if ENABLED(TMC_DEBUG) - constexpr uint16_t SG_RESULT_bm = 0x3FF; // 0:9 - constexpr uint8_t STEALTH_bp = 14; - constexpr uint32_t CS_ACTUAL_bm = 0x1F0000; // 16:20 - constexpr uint8_t STALL_GUARD_bp = 24; - constexpr uint8_t STST_bp = 31; - #endif + constexpr uint32_t OTPW_bm = 0x4000000UL; + constexpr uint8_t OTPW_bp = 26; + constexpr uint32_t OT_bm = 0x2000000UL; + constexpr uint8_t OT_bp = 25; + constexpr uint8_t DRIVER_ERROR_bm = 0x2UL; + constexpr uint8_t DRIVER_ERROR_bp = 1; TMC_driver_data data; - const auto ds = data.drv_status = st.DRV_STATUS(); - #ifdef __AVR__ - - // 8-bit optimization saves up to 70 bytes of PROGMEM per axis - uint8_t spart; - #if ENABLED(TMC_DEBUG) - data.sg_result = ds & SG_RESULT_bm; - spart = ds >> 8; - data.is_stealth = TEST(spart, STEALTH_bp - 8); - spart = ds >> 16; - data.cs_actual = spart & (CS_ACTUAL_bm >> 16); - #endif - spart = ds >> 24; - data.is_ot = TEST(spart, OT_bp - 24); - data.is_otpw = TEST(spart, OTPW_bp - 24); - data.is_s2g = !!(spart & (S2G_bm >> 24)); - #if ENABLED(TMC_DEBUG) - data.is_stall = TEST(spart, STALL_GUARD_bp - 24); - data.is_standstill = TEST(spart, STST_bp - 24); - data.sg_result_reasonable = !data.is_standstill; // sg_result has no reasonable meaning while standstill - #endif - - #else // !__AVR__ - - data.is_ot = TEST(ds, OT_bp); - data.is_otpw = TEST(ds, OTPW_bp); - data.is_s2g = !!(ds & S2G_bm); - #if ENABLED(TMC_DEBUG) - constexpr uint8_t CS_ACTUAL_sb = 16; - data.sg_result = ds & SG_RESULT_bm; - data.is_stealth = TEST(ds, STEALTH_bp); - data.cs_actual = (ds & CS_ACTUAL_bm) >> CS_ACTUAL_sb; - data.is_stall = TEST(ds, STALL_GUARD_bp); - data.is_standstill = TEST(ds, STST_bp); - data.sg_result_reasonable = !data.is_standstill; // sg_result has no reasonable meaning while standstill - #endif - - #endif // !__AVR__ - + data.drv_status = st.DRV_STATUS(); + data.is_otpw = (data.drv_status & OTPW_bm) >> OTPW_bp; + data.is_ot = (data.drv_status & OT_bm) >> OT_bp; + data.is_error = (st.status_response & DRIVER_ERROR_bm) >> DRIVER_ERROR_bp; return data; } - - #endif // HAS_TMCX1X0 - - #if HAS_TMC220x - - #if ENABLED(TMC_DEBUG) - static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); } - #endif - + #endif + #if HAS_DRIVER(TMC2208) + static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); } + static uint8_t get_status_response(TMC2208Stepper &st) { + uint32_t drv_status = st.DRV_STATUS(); + uint8_t gstat = st.GSTAT(); + uint8_t response = 0; + response |= (drv_status >> (31-3)) & 0b1000; + response |= gstat & 0b11; + return response; + } static TMC_driver_data get_driver_data(TMC2208Stepper &st) { - constexpr uint8_t OTPW_bp = 0, OT_bp = 1; - constexpr uint8_t S2G_bm = 0b11110; // 2..5 + constexpr uint32_t OTPW_bm = 0b1ul; + constexpr uint8_t OTPW_bp = 0; + constexpr uint32_t OT_bm = 0b10ul; + constexpr uint8_t OT_bp = 1; TMC_driver_data data; - const auto ds = data.drv_status = st.DRV_STATUS(); - data.is_otpw = TEST(ds, OTPW_bp); - data.is_ot = TEST(ds, OT_bp); - data.is_s2g = !!(ds & S2G_bm); - #if ENABLED(TMC_DEBUG) - constexpr uint32_t CS_ACTUAL_bm = 0x1F0000; // 16:20 - constexpr uint8_t STEALTH_bp = 30, STST_bp = 31; - #ifdef __AVR__ - // 8-bit optimization saves up to 12 bytes of PROGMEM per axis - uint8_t spart = ds >> 16; - data.cs_actual = spart & (CS_ACTUAL_bm >> 16); - spart = ds >> 24; - data.is_stealth = TEST(spart, STEALTH_bp - 24); - data.is_standstill = TEST(spart, STST_bp - 24); - #else - constexpr uint8_t CS_ACTUAL_sb = 16; - data.cs_actual = (ds & CS_ACTUAL_bm) >> CS_ACTUAL_sb; - data.is_stealth = TEST(ds, STEALTH_bp); - data.is_standstill = TEST(ds, STST_bp); - #endif - TERN_(HAS_STALLGUARD, data.sg_result_reasonable = false); - #endif + data.drv_status = st.DRV_STATUS(); + data.is_otpw = (data.drv_status & OTPW_bm) >> OTPW_bp; + data.is_ot = (data.drv_status & OT_bm) >> OT_bp; + data.is_error = st.drv_err(); return data; } - - #endif // TMC2208 || TMC2209 - - #if HAS_DRIVER(TMC2660) - - #if ENABLED(TMC_DEBUG) - static uint32_t get_pwm_scale(TMC2660Stepper) { return 0; } - #endif - - static TMC_driver_data get_driver_data(TMC2660Stepper &st) { - constexpr uint8_t OT_bp = 1, OTPW_bp = 2; - constexpr uint8_t S2G_bm = 0b11000; - TMC_driver_data data; - const auto ds = data.drv_status = st.DRVSTATUS(); - uint8_t spart = ds & 0xFF; - data.is_otpw = TEST(spart, OTPW_bp); - data.is_ot = TEST(spart, OT_bp); - data.is_s2g = !!(ds & S2G_bm); - #if ENABLED(TMC_DEBUG) - constexpr uint8_t STALL_GUARD_bp = 0; - constexpr uint8_t STST_bp = 7, SG_RESULT_sp = 10; - constexpr uint32_t SG_RESULT_bm = 0xFFC00; // 10:19 - data.is_stall = TEST(spart, STALL_GUARD_bp); - data.is_standstill = TEST(spart, STST_bp); - data.sg_result = (ds & SG_RESULT_bm) >> SG_RESULT_sp; - data.sg_result_reasonable = true; - #endif - return data; - } - - #endif // TMC2660 - - #if ENABLED(STOP_ON_ERROR) - void report_driver_error(const TMC_driver_data &data) { - SERIAL_ECHOPGM(" driver error detected: 0x"); - SERIAL_PRINTLN(data.drv_status, HEX); - if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature"); - if (data.is_s2g) SERIAL_ECHOLNPGM("coil short circuit"); - TERN_(TMC_DEBUG, tmc_report_all(true, true, true, true)); - kill(PSTR("Driver error")); - } #endif template - void report_driver_otpw(TMC &st) { - char timestamp[14]; - duration_t elapsed = print_job_timer.duration(); - const bool has_days = (elapsed.value > 60*60*24L); - (void)elapsed.toDigital(timestamp, has_days); - SERIAL_EOL(); - SERIAL_ECHO(timestamp); - SERIAL_ECHOPGM(": "); - st.printLabel(); - SERIAL_ECHOLNPAIR(" driver overtemperature warning! (", st.getMilliamps(), "mA)"); - } - - template - void report_polled_driver_data(TMC &st, const TMC_driver_data &data) { - const uint32_t pwm_scale = get_pwm_scale(st); - st.printLabel(); - SERIAL_CHAR(':'); SERIAL_PRINT(pwm_scale, DEC); - #if ENABLED(TMC_DEBUG) - #if HAS_TMCX1X0 || HAS_TMC220x - SERIAL_CHAR('/'); SERIAL_PRINT(data.cs_actual, DEC); - #endif - #if HAS_STALLGUARD - SERIAL_CHAR('/'); - if (data.sg_result_reasonable) - SERIAL_ECHO(data.sg_result); - else - SERIAL_CHAR('-'); - #endif - #endif - SERIAL_CHAR('|'); - if (st.error_count) SERIAL_CHAR('E'); // Error - if (data.is_ot) SERIAL_CHAR('O'); // Over-temperature - if (data.is_otpw) SERIAL_CHAR('W'); // over-temperature pre-Warning - #if ENABLED(TMC_DEBUG) - if (data.is_stall) SERIAL_CHAR('G'); // stallGuard - if (data.is_stealth) SERIAL_CHAR('T'); // stealthChop - if (data.is_standstill) SERIAL_CHAR('I'); // standstIll - #endif - if (st.flag_otpw) SERIAL_CHAR('F'); // otpw Flag - SERIAL_CHAR('|'); - if (st.otpw_count > 0) SERIAL_PRINT(st.otpw_count, DEC); - SERIAL_CHAR('\t'); - } - - #if CURRENT_STEP_DOWN > 0 - - template - void step_current_down(TMC &st) { - if (st.isEnabled()) { - const uint16_t I_rms = st.getMilliamps() - (CURRENT_STEP_DOWN); - if (I_rms > 50) { - st.rms_current(I_rms); - #if ENABLED(REPORT_CURRENT_CHANGE) - st.printLabel(); - SERIAL_ECHOLNPAIR(" current decreased to ", I_rms); - #endif - } - } - } - - #else - - #define step_current_down(...) - - #endif - - template - bool monitor_tmc_driver(TMC &st, const bool need_update_error_counters, const bool need_debug_reporting) { + void monitor_tmc_driver(TMC &st, const TMC_AxisEnum axis, uint8_t &otpw_cnt) { TMC_driver_data data = get_driver_data(st); - if (data.drv_status == 0xFFFFFFFF || data.drv_status == 0x0) return false; - bool should_step_down = false; - - if (need_update_error_counters) { - if (data.is_ot /* | data.s2ga | data.s2gb*/) st.error_count++; - else if (st.error_count > 0) st.error_count--; - - #if ENABLED(STOP_ON_ERROR) - if (st.error_count >= 10) { - SERIAL_EOL(); - st.printLabel(); - report_driver_error(data); - } - #endif - - // Report if a warning was triggered - if (data.is_otpw && st.otpw_count == 0) - report_driver_otpw(st); - - #if CURRENT_STEP_DOWN > 0 - // Decrease current if is_otpw is true and driver is enabled and there's been more than 4 warnings - if (data.is_otpw && st.otpw_count > 4 && st.isEnabled()) - should_step_down = true; - #endif - - if (data.is_otpw) { - st.otpw_count++; - st.flag_otpw = true; + #if ENABLED(STOP_ON_ERROR) + if (data.is_error) { + SERIAL_EOL(); + _tmc_say_axis(axis); + SERIAL_ECHOLNPGM(" driver error detected:"); + if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature"); + if (st.s2ga()) SERIAL_ECHOLNPGM("short to ground (coil A)"); + if (st.s2gb()) SERIAL_ECHOLNPGM("short to ground (coil B)"); + #if ENABLED(TMC_DEBUG) + tmc_report_all(); + #endif + kill(PSTR("Driver error")); } - else if (st.otpw_count > 0) st.otpw_count = 0; - } - - #if ENABLED(TMC_DEBUG) - if (need_debug_reporting) report_polled_driver_data(st, data); #endif - return should_step_down; + // Report if a warning was triggered + if (data.is_otpw && otpw_cnt == 0) { + char timestamp[10]; + duration_t elapsed = print_job_timer.duration(); + const bool has_days = (elapsed.value > 60*60*24L); + (void)elapsed.toDigital(timestamp, has_days); + SERIAL_EOL(); + SERIAL_ECHO(timestamp); + SERIAL_ECHOPGM(": "); + _tmc_say_axis(axis); + SERIAL_ECHOPGM(" driver overtemperature warning! ("); + SERIAL_ECHO(st.getCurrent()); + SERIAL_ECHOLNPGM("mA)"); + } + #if CURRENT_STEP_DOWN > 0 + // Decrease current if is_otpw is true and driver is enabled and there's been more than 4 warnings + if (data.is_otpw && st.isEnabled() && otpw_cnt > 4) { + st.setCurrent(st.getCurrent() - (CURRENT_STEP_DOWN), R_SENSE, HOLD_MULTIPLIER); + #if ENABLED(REPORT_CURRENT_CHANGE) + _tmc_say_axis(axis); + SERIAL_ECHOLNPAIR(" current decreased to ", st.getCurrent()); + #endif + } + #endif + + if (data.is_otpw) { + otpw_cnt++; + st.flag_otpw = true; + } + else if (otpw_cnt > 0) otpw_cnt = 0; + + if (report_tmc_status) { + const uint32_t pwm_scale = get_pwm_scale(st); + _tmc_say_axis(axis); + SERIAL_ECHOPAIR(":", pwm_scale); + SERIAL_ECHOPGM(" |0b"); SERIAL_PRINT(get_status_response(st), BIN); + SERIAL_ECHOPGM("| "); + if (data.is_error) SERIAL_CHAR('E'); + else if (data.is_ot) SERIAL_CHAR('O'); + else if (data.is_otpw) SERIAL_CHAR('W'); + else if (otpw_cnt > 0) SERIAL_PRINT(otpw_cnt, DEC); + else if (st.flag_otpw) SERIAL_CHAR('F'); + SERIAL_CHAR('\t'); + } } - void monitor_tmc_drivers() { - const millis_t ms = millis(); + #define HAS_HW_COMMS(ST) AXIS_DRIVER_TYPE(ST, TMC2130) || (AXIS_DRIVER_TYPE(ST, TMC2208) && defined(ST##_HARDWARE_SERIAL)) - // Poll TMC drivers at the configured interval - static millis_t next_poll = 0; - const bool need_update_error_counters = ELAPSED(ms, next_poll); - if (need_update_error_counters) next_poll = ms + MONITOR_DRIVER_STATUS_INTERVAL_MS; - - // Also poll at intervals for debugging - #if ENABLED(TMC_DEBUG) - static millis_t next_debug_reporting = 0; - const bool need_debug_reporting = report_tmc_status_interval && ELAPSED(ms, next_debug_reporting); - if (need_debug_reporting) next_debug_reporting = ms + report_tmc_status_interval; - #else - constexpr bool need_debug_reporting = false; - #endif - - if (need_update_error_counters || need_debug_reporting) { - - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) - { - bool result = false; - #if AXIS_IS_TMC(X) - if (monitor_tmc_driver(stepperX, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(X2) - if (monitor_tmc_driver(stepperX2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(X) - step_current_down(stepperX); - #endif - #if AXIS_IS_TMC(X2) - step_current_down(stepperX2); - #endif - } - } + void monitor_tmc_driver() { + static millis_t next_cOT = 0; + if (ELAPSED(millis(), next_cOT)) { + next_cOT = millis() + 500; + #if HAS_HW_COMMS(X) + static uint8_t x_otpw_cnt = 0; + monitor_tmc_driver(stepperX, TMC_X, x_otpw_cnt); + #endif + #if HAS_HW_COMMS(Y) + static uint8_t y_otpw_cnt = 0; + monitor_tmc_driver(stepperY, TMC_Y, y_otpw_cnt); + #endif + #if HAS_HW_COMMS(Z) + static uint8_t z_otpw_cnt = 0; + monitor_tmc_driver(stepperZ, TMC_Z, z_otpw_cnt); + #endif + #if HAS_HW_COMMS(X2) + static uint8_t x2_otpw_cnt = 0; + monitor_tmc_driver(stepperX2, TMC_X, x2_otpw_cnt); + #endif + #if HAS_HW_COMMS(Y2) + static uint8_t y2_otpw_cnt = 0; + monitor_tmc_driver(stepperY2, TMC_Y, y2_otpw_cnt); + #endif + #if HAS_HW_COMMS(Z2) + static uint8_t z2_otpw_cnt = 0; + monitor_tmc_driver(stepperZ2, TMC_Z, z2_otpw_cnt); + #endif + #if HAS_HW_COMMS(E0) + static uint8_t e0_otpw_cnt = 0; + monitor_tmc_driver(stepperE0, TMC_E0, e0_otpw_cnt); + #endif + #if HAS_HW_COMMS(E1) + static uint8_t e1_otpw_cnt = 0; + monitor_tmc_driver(stepperE1, TMC_E1, e1_otpw_cnt); + #endif + #if HAS_HW_COMMS(E2) + static uint8_t e2_otpw_cnt = 0; + monitor_tmc_driver(stepperE2, TMC_E2, e2_otpw_cnt); + #endif + #if HAS_HW_COMMS(E3) + static uint8_t e3_otpw_cnt = 0; + monitor_tmc_driver(stepperE3, TMC_E3, e3_otpw_cnt); + #endif + #if HAS_HW_COMMS(E4) + static uint8_t e4_otpw_cnt = 0; + monitor_tmc_driver(stepperE4, TMC_E4, e4_otpw_cnt); #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) - { - bool result = false; - #if AXIS_IS_TMC(Y) - if (monitor_tmc_driver(stepperY, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Y2) - if (monitor_tmc_driver(stepperY2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(Y) - step_current_down(stepperY); - #endif - #if AXIS_IS_TMC(Y2) - step_current_down(stepperY2); - #endif - } - } - #endif - - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) - { - bool result = false; - #if AXIS_IS_TMC(Z) - if (monitor_tmc_driver(stepperZ, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z2) - if (monitor_tmc_driver(stepperZ2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z3) - if (monitor_tmc_driver(stepperZ3, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z4) - if (monitor_tmc_driver(stepperZ4, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(Z) - step_current_down(stepperZ); - #endif - #if AXIS_IS_TMC(Z2) - step_current_down(stepperZ2); - #endif - #if AXIS_IS_TMC(Z3) - step_current_down(stepperZ3); - #endif - #if AXIS_IS_TMC(Z4) - step_current_down(stepperZ4); - #endif - } - } - #endif - - #if AXIS_IS_TMC(E0) - (void)monitor_tmc_driver(stepperE0, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E1) - (void)monitor_tmc_driver(stepperE1, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E2) - (void)monitor_tmc_driver(stepperE2, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E3) - (void)monitor_tmc_driver(stepperE3, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E4) - (void)monitor_tmc_driver(stepperE4, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E5) - (void)monitor_tmc_driver(stepperE5, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E6) - (void)monitor_tmc_driver(stepperE6, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E7) - (void)monitor_tmc_driver(stepperE7, need_update_error_counters, need_debug_reporting); - #endif - - if (TERN0(TMC_DEBUG, need_debug_reporting)) SERIAL_EOL(); + if (report_tmc_status) SERIAL_EOL(); } } #endif // MONITOR_DRIVER_STATUS -#if ENABLED(TMC_DEBUG) +void _tmc_say_axis(const TMC_AxisEnum axis) { + static const char ext_X[] PROGMEM = "X", ext_Y[] PROGMEM = "Y", ext_Z[] PROGMEM = "Z", + ext_X2[] PROGMEM = "X2", ext_Y2[] PROGMEM = "Y2", ext_Z2[] PROGMEM = "Z2", + ext_E0[] PROGMEM = "E0", ext_E1[] PROGMEM = "E1", + ext_E2[] PROGMEM = "E2", ext_E3[] PROGMEM = "E3", + ext_E4[] PROGMEM = "E4"; + static const char* const tmc_axes[] PROGMEM = { ext_X, ext_Y, ext_Z, ext_X2, ext_Y2, ext_Z2, ext_E0, ext_E1, ext_E2, ext_E3, ext_E4 }; + serialprintPGM((char*)pgm_read_ptr(&tmc_axes[axis])); +} - /** - * M122 [S<0|1>] [Pnnn] Enable periodic status reports - */ - #if ENABLED(MONITOR_DRIVER_STATUS) - void tmc_set_report_interval(const uint16_t update_interval) { - if ((report_tmc_status_interval = update_interval)) - SERIAL_ECHOLNPGM("axis:pwm_scale" - #if HAS_STEALTHCHOP - "/curr_scale" - #endif - #if HAS_STALLGUARD - "/mech_load" - #endif - "|flags|warncount" - ); - } - #endif +void _tmc_say_current(const TMC_AxisEnum axis, const uint16_t curr) { + _tmc_say_axis(axis); + SERIAL_ECHOLNPAIR(" driver current: ", curr); +} +void _tmc_say_otpw(const TMC_AxisEnum axis, const bool otpw) { + _tmc_say_axis(axis); + SERIAL_ECHOPGM(" temperature prewarn triggered: "); + serialprintPGM(otpw ? PSTR("true") : PSTR("false")); + SERIAL_EOL(); +} +void _tmc_say_otpw_cleared(const TMC_AxisEnum axis) { + _tmc_say_axis(axis); + SERIAL_ECHOLNPGM(" prewarn flag cleared"); +} +void _tmc_say_pwmthrs(const TMC_AxisEnum axis, const uint32_t thrs) { + _tmc_say_axis(axis); + SERIAL_ECHOLNPAIR(" stealthChop max speed: ", thrs); +} +void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { + _tmc_say_axis(axis); + SERIAL_ECHOPGM(" homing sensitivity: "); + SERIAL_PRINTLN(sgt, DEC); +} + +#if ENABLED(TMC_DEBUG) enum TMC_debug_enum : char { TMC_CODES, - TMC_UART_ADDR, TMC_ENABLED, TMC_CURRENT, TMC_RMS_CURRENT, TMC_MAX_CURRENT, TMC_IRUN, TMC_IHOLD, - TMC_GLOBAL_SCALER, TMC_CS_ACTUAL, TMC_PWM_SCALE, - TMC_PWM_SCALE_SUM, - TMC_PWM_SCALE_AUTO, - TMC_PWM_OFS_AUTO, - TMC_PWM_GRAD_AUTO, TMC_VSENSE, TMC_STEALTHCHOP, TMC_MICROSTEPS, @@ -496,8 +274,7 @@ TMC_TBL, TMC_HEND, TMC_HSTRT, - TMC_SGT, - TMC_MSCNT + TMC_SGT }; enum TMC_drv_status_enum : char { TMC_DRV_CODES, @@ -521,139 +298,69 @@ TMC_S2VSB, TMC_S2VSA }; - enum TMC_get_registers_enum : char { - TMC_AXIS_CODES, - TMC_GET_GCONF, - TMC_GET_IHOLD_IRUN, - TMC_GET_GSTAT, - TMC_GET_IOIN, - TMC_GET_TPOWERDOWN, - TMC_GET_TSTEP, - TMC_GET_TPWMTHRS, - TMC_GET_TCOOLTHRS, - TMC_GET_THIGH, - TMC_GET_CHOPCONF, - TMC_GET_COOLCONF, - TMC_GET_PWMCONF, - TMC_GET_PWM_SCALE, - TMC_GET_DRV_STATUS, - TMC_GET_DRVCONF, - TMC_GET_DRVCTRL, - TMC_GET_DRVSTATUS, - TMC_GET_SGCSCONF, - TMC_GET_SMARTEN - }; + static void drv_status_print_hex(const TMC_AxisEnum axis, const uint32_t drv_status) { + _tmc_say_axis(axis); + SERIAL_ECHOPGM(" = 0x"); + for (int B = 24; B >= 8; B -= 8){ + SERIAL_PRINT((drv_status >> (B + 4)) & 0xF, HEX); + SERIAL_PRINT((drv_status >> B) & 0xF, HEX); + SERIAL_CHAR(':'); + } + SERIAL_PRINT((drv_status >> 4) & 0xF, HEX); + SERIAL_PRINT((drv_status) & 0xF, HEX); + SERIAL_EOL(); + } - template - static void print_vsense(TMC &st) { serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); } - - #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130) - static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { + #if HAS_DRIVER(TMC2130) + static void tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { switch (i) { case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break; + case TMC_TSTEP: SERIAL_ECHO(st.TSTEP()); break; case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; - case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break; + case TMC_STEALTHCHOP: serialprintPGM(st.stealthChop() ? PSTR("true") : PSTR("false")); break; default: break; } } - #endif - #if HAS_TMCX1X0 - static void _tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) { + static void tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) { switch (i) { - case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break; - case TMC_SG_RESULT: SERIAL_PRINT(st.sg_result(), DEC); break; - case TMC_FSACTIVE: if (st.fsactive()) SERIAL_CHAR('*'); break; - case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; + case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('X'); break; + case TMC_SG_RESULT: SERIAL_PRINT(st.sg_result(), DEC); break; + case TMC_FSACTIVE: if (st.fsactive()) SERIAL_CHAR('X'); break; default: break; } } #endif - #if HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5160) - template - void print_vsense(TMCMarlin &) { } - - template - void print_vsense(TMCMarlin &) { } - - static void _tmc_status(TMC2160Stepper &st, const TMC_debug_enum i) { + #if HAS_DRIVER(TMC2208) + static void tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) { switch (i) { - case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break; - case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; - case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break; - case TMC_GLOBAL_SCALER: - { - uint16_t value = st.GLOBAL_SCALER(); - SERIAL_PRINT(value ?: 256, DEC); - SERIAL_ECHOPGM("/256"); - } - break; + case TMC_TSTEP: { uint32_t data = 0; st.TSTEP(&data); SERIAL_PROTOCOL(data); break; } + case TMC_PWM_SCALE: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break; + case TMC_STEALTHCHOP: serialprintPGM(st.stealth() ? PSTR("true") : PSTR("false")); break; + case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('X'); break; + case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('X'); break; default: break; } } - #endif - - #if HAS_TMC220x - static void _tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) { + static void tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) { switch (i) { - case TMC_PWM_SCALE_SUM: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break; - case TMC_PWM_SCALE_AUTO: SERIAL_PRINT(st.pwm_scale_auto(), DEC); break; - case TMC_PWM_OFS_AUTO: SERIAL_PRINT(st.pwm_ofs_auto(), DEC); break; - case TMC_PWM_GRAD_AUTO: SERIAL_PRINT(st.pwm_grad_auto(), DEC); break; - case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break; - case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('*'); break; - case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('*'); break; + case TMC_T157: if (st.t157()) SERIAL_CHAR('X'); break; + case TMC_T150: if (st.t150()) SERIAL_CHAR('X'); break; + case TMC_T143: if (st.t143()) SERIAL_CHAR('X'); break; + case TMC_T120: if (st.t120()) SERIAL_CHAR('X'); break; default: break; } } - - #if HAS_DRIVER(TMC2209) - template - static void _tmc_status(TMCMarlin &st, const TMC_debug_enum i) { - switch (i) { - case TMC_SGT: SERIAL_PRINT(st.SGTHRS(), DEC); break; - case TMC_UART_ADDR: SERIAL_PRINT(st.get_address(), DEC); break; - default: - TMC2208Stepper *parent = &st; - _tmc_status(*parent, i); - break; - } - } - #endif - - static void _tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) { - switch (i) { - case TMC_T157: if (st.t157()) SERIAL_CHAR('*'); break; - case TMC_T150: if (st.t150()) SERIAL_CHAR('*'); break; - case TMC_T143: if (st.t143()) SERIAL_CHAR('*'); break; - case TMC_T120: if (st.t120()) SERIAL_CHAR('*'); break; - case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; - default: break; - } - } - - #if HAS_DRIVER(TMC2209) - static void _tmc_parse_drv_status(TMC2209Stepper &st, const TMC_drv_status_enum i) { - switch (i) { - case TMC_SG_RESULT: SERIAL_PRINT(st.SG_RESULT(), DEC); break; - default: _tmc_parse_drv_status(static_cast(st), i); break; - } - } - #endif - #endif - - #if HAS_DRIVER(TMC2660) - static void _tmc_parse_drv_status(TMC2660Stepper, const TMC_drv_status_enum) { } #endif template - static void tmc_status(TMC &st, const TMC_debug_enum i) { - SERIAL_CHAR('\t'); + static void tmc_status(TMC &st, const TMC_AxisEnum axis, const TMC_debug_enum i, const float spmm) { + SERIAL_ECHO('\t'); switch (i) { - case TMC_CODES: st.printLabel(); break; - case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break; - case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break; - case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; + case TMC_CODES: _tmc_say_axis(axis); break; + case TMC_ENABLED: serialprintPGM(st.isEnabled() ? PSTR("true") : PSTR("false")); break; + case TMC_CURRENT: SERIAL_ECHO(st.getCurrent()); break; + case TMC_RMS_CURRENT: SERIAL_PROTOCOL(st.rms_current()); break; case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; case TMC_IRUN: SERIAL_PRINT(st.irun(), DEC); @@ -667,210 +374,145 @@ SERIAL_PRINT(st.cs_actual(), DEC); SERIAL_ECHOPGM("/31"); break; - case TMC_VSENSE: print_vsense(st); break; + + case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); break; + case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; - case TMC_TSTEP: { - const uint32_t tstep_value = st.TSTEP(); - if (tstep_value != 0xFFFFF) SERIAL_ECHO(tstep_value); else SERIAL_ECHOPGM("max"); - } break; - #if ENABLED(HYBRID_THRESHOLD) - case TMC_TPWMTHRS: SERIAL_ECHO(uint32_t(st.TPWMTHRS())); break; - case TMC_TPWMTHRS_MMS: { - const uint32_t tpwmthrs_val = st.get_pwm_thrs(); - if (tpwmthrs_val) SERIAL_ECHO(tpwmthrs_val); else SERIAL_CHAR('-'); - } break; - #endif - case TMC_OTPW: serialprint_truefalse(st.otpw()); break; - #if ENABLED(MONITOR_DRIVER_STATUS) - case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break; - #endif + case TMC_TPWMTHRS: { + uint32_t tpwmthrs_val = st.TPWMTHRS(); + SERIAL_ECHO(tpwmthrs_val); + } + break; + case TMC_TPWMTHRS_MMS: { + uint32_t tpwmthrs_val = st.TPWMTHRS(); + if (tpwmthrs_val) + SERIAL_ECHO(12650000UL * st.microsteps() / (256 * tpwmthrs_val * spmm)); + else + SERIAL_CHAR('-'); + } + break; + case TMC_OTPW: serialprintPGM(st.otpw() ? PSTR("true") : PSTR("false")); break; + case TMC_OTPW_TRIGGERED: serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false")); break; case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break; case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break; case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break; case TMC_HSTRT: SERIAL_PRINT(st.hysteresis_start(), DEC); break; - case TMC_MSCNT: SERIAL_PRINT(st.get_microstep_counter(), DEC); break; - default: _tmc_status(st, i); break; + default: tmc_status(st, i); break; } } - #if HAS_DRIVER(TMC2660) - template - void tmc_status(TMCMarlin &st, const TMC_debug_enum i) { - SERIAL_CHAR('\t'); - switch (i) { - case TMC_CODES: st.printLabel(); break; - case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break; - case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break; - case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; - case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; - case TMC_IRUN: - SERIAL_PRINT(st.cs(), DEC); - SERIAL_ECHOPGM("/31"); - break; - case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break; - case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; - //case TMC_OTPW: serialprint_truefalse(st.otpw()); break; - //case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break; - case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; - case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break; - case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break; - case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break; - case TMC_HSTRT: SERIAL_PRINT(st.hysteresis_start(), DEC); break; - default: break; - } - } - #endif - template - static void tmc_parse_drv_status(TMC &st, const TMC_drv_status_enum i) { + static void tmc_parse_drv_status(TMC &st, const TMC_AxisEnum axis, const TMC_drv_status_enum i) { SERIAL_CHAR('\t'); switch (i) { - case TMC_DRV_CODES: st.printLabel(); break; - case TMC_STST: if (!st.stst()) SERIAL_CHAR('*'); break; - case TMC_OLB: if (st.olb()) SERIAL_CHAR('*'); break; - case TMC_OLA: if (st.ola()) SERIAL_CHAR('*'); break; - case TMC_S2GB: if (st.s2gb()) SERIAL_CHAR('*'); break; - case TMC_S2GA: if (st.s2ga()) SERIAL_CHAR('*'); break; - case TMC_DRV_OTPW: if (st.otpw()) SERIAL_CHAR('*'); break; - case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break; - case TMC_DRV_STATUS_HEX: { - const uint32_t drv_status = st.DRV_STATUS(); - SERIAL_CHAR('\t'); - st.printLabel(); - SERIAL_CHAR('\t'); - print_hex_long(drv_status, ':'); - if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!"); - SERIAL_EOL(); - break; - } - default: _tmc_parse_drv_status(st, i); break; + case TMC_DRV_CODES: _tmc_say_axis(axis); break; + case TMC_STST: if (st.stst()) SERIAL_CHAR('X'); break; + case TMC_OLB: if (st.olb()) SERIAL_CHAR('X'); break; + case TMC_OLA: if (st.ola()) SERIAL_CHAR('X'); break; + case TMC_S2GB: if (st.s2gb()) SERIAL_CHAR('X'); break; + case TMC_S2GA: if (st.s2ga()) SERIAL_CHAR('X'); break; + case TMC_DRV_OTPW: if (st.otpw()) SERIAL_CHAR('X'); break; + case TMC_OT: if (st.ot()) SERIAL_CHAR('X'); break; + case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; + case TMC_DRV_STATUS_HEX:drv_status_print_hex(axis, st.DRV_STATUS()); break; + default: tmc_parse_drv_status(st, i); break; } } - static void tmc_debug_loop(const TMC_debug_enum i, const bool print_x, const bool print_y, const bool print_z, const bool print_e) { - if (print_x) { - #if AXIS_IS_TMC(X) - tmc_status(stepperX, i); - #endif - #if AXIS_IS_TMC(X2) - tmc_status(stepperX2, i); - #endif - } + static void tmc_debug_loop(const TMC_debug_enum i) { + #if AXIS_IS_TMC(X) + tmc_status(stepperX, TMC_X, i, planner.axis_steps_per_mm[X_AXIS]); + #endif + #if AXIS_IS_TMC(X2) + tmc_status(stepperX2, TMC_X2, i, planner.axis_steps_per_mm[X_AXIS]); + #endif - if (print_y) { - #if AXIS_IS_TMC(Y) - tmc_status(stepperY, i); - #endif - #if AXIS_IS_TMC(Y2) - tmc_status(stepperY2, i); - #endif - } + #if AXIS_IS_TMC(Y) + tmc_status(stepperY, TMC_Y, i, planner.axis_steps_per_mm[Y_AXIS]); + #endif + #if AXIS_IS_TMC(Y2) + tmc_status(stepperY2, TMC_Y2, i, planner.axis_steps_per_mm[Y_AXIS]); + #endif - if (print_z) { - #if AXIS_IS_TMC(Z) - tmc_status(stepperZ, i); - #endif - #if AXIS_IS_TMC(Z2) - tmc_status(stepperZ2, i); - #endif - #if AXIS_IS_TMC(Z3) - tmc_status(stepperZ3, i); - #endif - #if AXIS_IS_TMC(Z4) - tmc_status(stepperZ4, i); - #endif - } + #if AXIS_IS_TMC(Z) + tmc_status(stepperZ, TMC_Z, i, planner.axis_steps_per_mm[Z_AXIS]); + #endif + #if AXIS_IS_TMC(Z2) + tmc_status(stepperZ2, TMC_Z2, i, planner.axis_steps_per_mm[Z_AXIS]); + #endif - if (print_e) { - #if AXIS_IS_TMC(E0) - tmc_status(stepperE0, i); - #endif - #if AXIS_IS_TMC(E1) - tmc_status(stepperE1, i); - #endif - #if AXIS_IS_TMC(E2) - tmc_status(stepperE2, i); - #endif - #if AXIS_IS_TMC(E3) - tmc_status(stepperE3, i); - #endif - #if AXIS_IS_TMC(E4) - tmc_status(stepperE4, i); - #endif - #if AXIS_IS_TMC(E5) - tmc_status(stepperE5, i); - #endif - #if AXIS_IS_TMC(E6) - tmc_status(stepperE6, i); - #endif - #if AXIS_IS_TMC(E7) - tmc_status(stepperE7, i); - #endif - } + #if AXIS_IS_TMC(E0) + tmc_status(stepperE0, TMC_E0, i, planner.axis_steps_per_mm[E_AXIS]); + #endif + #if AXIS_IS_TMC(E1) + tmc_status(stepperE1, TMC_E1, i, planner.axis_steps_per_mm[E_AXIS + #if ENABLED(DISTINCT_E_FACTORS) + + 1 + #endif + ]); + #endif + #if AXIS_IS_TMC(E2) + tmc_status(stepperE2, TMC_E2, i, planner.axis_steps_per_mm[E_AXIS + #if ENABLED(DISTINCT_E_FACTORS) + + 2 + #endif + ]); + #endif + #if AXIS_IS_TMC(E3) + tmc_status(stepperE3, TMC_E3, i, planner.axis_steps_per_mm[E_AXIS + #if ENABLED(DISTINCT_E_FACTORS) + + 3 + #endif + ]); + #endif + #if AXIS_IS_TMC(E4) + tmc_status(stepperE4, TMC_E4, i, planner.axis_steps_per_mm[E_AXIS + #if ENABLED(DISTINCT_E_FACTORS) + + 4 + #endif + ]); + #endif SERIAL_EOL(); } - static void drv_status_loop(const TMC_drv_status_enum i, const bool print_x, const bool print_y, const bool print_z, const bool print_e) { - if (print_x) { - #if AXIS_IS_TMC(X) - tmc_parse_drv_status(stepperX, i); - #endif - #if AXIS_IS_TMC(X2) - tmc_parse_drv_status(stepperX2, i); - #endif - } + static void drv_status_loop(const TMC_drv_status_enum i) { + #if AXIS_IS_TMC(X) + tmc_parse_drv_status(stepperX, TMC_X, i); + #endif + #if AXIS_IS_TMC(X2) + tmc_parse_drv_status(stepperX2, TMC_X2, i); + #endif - if (print_y) { - #if AXIS_IS_TMC(Y) - tmc_parse_drv_status(stepperY, i); - #endif - #if AXIS_IS_TMC(Y2) - tmc_parse_drv_status(stepperY2, i); - #endif - } + #if AXIS_IS_TMC(Y) + tmc_parse_drv_status(stepperY, TMC_Y, i); + #endif + #if AXIS_IS_TMC(Y2) + tmc_parse_drv_status(stepperY2, TMC_Y2, i); + #endif - if (print_z) { - #if AXIS_IS_TMC(Z) - tmc_parse_drv_status(stepperZ, i); - #endif - #if AXIS_IS_TMC(Z2) - tmc_parse_drv_status(stepperZ2, i); - #endif - #if AXIS_IS_TMC(Z3) - tmc_parse_drv_status(stepperZ3, i); - #endif - #if AXIS_IS_TMC(Z4) - tmc_parse_drv_status(stepperZ4, i); - #endif - } + #if AXIS_IS_TMC(Z) + tmc_parse_drv_status(stepperZ, TMC_Z, i); + #endif + #if AXIS_IS_TMC(Z2) + tmc_parse_drv_status(stepperZ2, TMC_Z2, i); + #endif - if (print_e) { - #if AXIS_IS_TMC(E0) - tmc_parse_drv_status(stepperE0, i); - #endif - #if AXIS_IS_TMC(E1) - tmc_parse_drv_status(stepperE1, i); - #endif - #if AXIS_IS_TMC(E2) - tmc_parse_drv_status(stepperE2, i); - #endif - #if AXIS_IS_TMC(E3) - tmc_parse_drv_status(stepperE3, i); - #endif - #if AXIS_IS_TMC(E4) - tmc_parse_drv_status(stepperE4, i); - #endif - #if AXIS_IS_TMC(E5) - tmc_parse_drv_status(stepperE5, i); - #endif - #if AXIS_IS_TMC(E6) - tmc_parse_drv_status(stepperE6, i); - #endif - #if AXIS_IS_TMC(E7) - tmc_parse_drv_status(stepperE7, i); - #endif - } + #if AXIS_IS_TMC(E0) + tmc_parse_drv_status(stepperE0, TMC_E0, i); + #endif + #if AXIS_IS_TMC(E1) + tmc_parse_drv_status(stepperE1, TMC_E1, i); + #endif + #if AXIS_IS_TMC(E2) + tmc_parse_drv_status(stepperE2, TMC_E2, i); + #endif + #if AXIS_IS_TMC(E3) + tmc_parse_drv_status(stepperE3, TMC_E3, i); + #endif + #if AXIS_IS_TMC(E4) + tmc_parse_drv_status(stepperE4, TMC_E4, i); + #endif SERIAL_EOL(); } @@ -878,58 +520,43 @@ /** * M122 report functions */ + void tmc_set_report_status(const bool status) { + if ((report_tmc_status = status)) + SERIAL_ECHOLNPGM("axis:pwm_scale |status_response|"); + } - void tmc_report_all(bool print_x, const bool print_y, const bool print_z, const bool print_e) { - #define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM, print_x, print_y, print_z, print_e); }while(0) - #define DRV_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); drv_status_loop(ITEM, print_x, print_y, print_z, print_e); }while(0) + void tmc_report_all() { + #define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM); }while(0) + #define DRV_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); drv_status_loop(ITEM); }while(0) TMC_REPORT("\t", TMC_CODES); - #if HAS_DRIVER(TMC2209) - TMC_REPORT("Address\t", TMC_UART_ADDR); - #endif TMC_REPORT("Enabled\t", TMC_ENABLED); TMC_REPORT("Set current", TMC_CURRENT); TMC_REPORT("RMS current", TMC_RMS_CURRENT); TMC_REPORT("MAX current", TMC_MAX_CURRENT); TMC_REPORT("Run current", TMC_IRUN); TMC_REPORT("Hold current", TMC_IHOLD); - #if HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5160) - TMC_REPORT("Global scaler", TMC_GLOBAL_SCALER); - #endif - TMC_REPORT("CS actual", TMC_CS_ACTUAL); - TMC_REPORT("PWM scale", TMC_PWM_SCALE); - #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2224) || HAS_DRIVER(TMC2660) || HAS_TMC220x - TMC_REPORT("vsense\t", TMC_VSENSE); - #endif + TMC_REPORT("CS actual\t", TMC_CS_ACTUAL); + TMC_REPORT("PWM scale\t", TMC_PWM_SCALE); + TMC_REPORT("vsense\t", TMC_VSENSE); TMC_REPORT("stealthChop", TMC_STEALTHCHOP); TMC_REPORT("msteps\t", TMC_MICROSTEPS); TMC_REPORT("tstep\t", TMC_TSTEP); - TMC_REPORT("PWM thresh.", TMC_TPWMTHRS); + TMC_REPORT("pwm\nthreshold\t", TMC_TPWMTHRS); TMC_REPORT("[mm/s]\t", TMC_TPWMTHRS_MMS); TMC_REPORT("OT prewarn", TMC_OTPW); - #if ENABLED(MONITOR_DRIVER_STATUS) - TMC_REPORT("triggered\n OTP\t", TMC_OTPW_TRIGGERED); - #endif - - #if HAS_TMC220x - TMC_REPORT("pwm scale sum", TMC_PWM_SCALE_SUM); - TMC_REPORT("pwm scale auto", TMC_PWM_SCALE_AUTO); - TMC_REPORT("pwm offset auto", TMC_PWM_OFS_AUTO); - TMC_REPORT("pwm grad auto", TMC_PWM_GRAD_AUTO); - #endif - - TMC_REPORT("off time", TMC_TOFF); + TMC_REPORT("OT prewarn has\n" + "been triggered", TMC_OTPW_TRIGGERED); + TMC_REPORT("off time\t", TMC_TOFF); TMC_REPORT("blank time", TMC_TBL); - TMC_REPORT("hysteresis\n -end\t", TMC_HEND); - TMC_REPORT(" -start\t", TMC_HSTRT); + TMC_REPORT("hysteresis\n-end\t", TMC_HEND); + TMC_REPORT("-start\t", TMC_HSTRT); TMC_REPORT("Stallguard thrs", TMC_SGT); - TMC_REPORT("uStep count", TMC_MSCNT); + DRV_REPORT("DRVSTATUS", TMC_DRV_CODES); - #if HAS_TMCX1X0 || HAS_TMC220x - DRV_REPORT("sg_result", TMC_SG_RESULT); - #endif - #if HAS_TMCX1X0 - DRV_REPORT("stallguard", TMC_STALLGUARD); - DRV_REPORT("fsactive", TMC_FSACTIVE); + #if HAS_DRIVER(TMC2130) + DRV_REPORT("stallguard\t", TMC_STALLGUARD); + DRV_REPORT("sg_result\t", TMC_SG_RESULT); + DRV_REPORT("fsactive\t", TMC_FSACTIVE); #endif DRV_REPORT("stst\t", TMC_STST); DRV_REPORT("olb\t", TMC_OLB); @@ -938,7 +565,7 @@ DRV_REPORT("s2ga\t", TMC_S2GA); DRV_REPORT("otpw\t", TMC_DRV_OTPW); DRV_REPORT("ot\t", TMC_OT); - #if HAS_TMC220x + #if HAS_DRIVER(TMC2208) DRV_REPORT("157C\t", TMC_T157); DRV_REPORT("150C\t", TMC_T150); DRV_REPORT("143C\t", TMC_T143); @@ -946,327 +573,61 @@ DRV_REPORT("s2vsa\t", TMC_S2VSA); DRV_REPORT("s2vsb\t", TMC_S2VSB); #endif - DRV_REPORT("Driver registers:\n",TMC_DRV_STATUS_HEX); + DRV_REPORT("Driver registers:", TMC_DRV_STATUS_HEX); SERIAL_EOL(); } - #define PRINT_TMC_REGISTER(REG_CASE) case TMC_GET_##REG_CASE: print_hex_long(st.REG_CASE(), ':'); break - - #if HAS_TMCX1X0 - static void tmc_get_ic_registers(TMC2130Stepper &st, const TMC_get_registers_enum i) { - switch (i) { - PRINT_TMC_REGISTER(TCOOLTHRS); - PRINT_TMC_REGISTER(THIGH); - PRINT_TMC_REGISTER(COOLCONF); - default: SERIAL_CHAR('\t'); break; - } - } - #endif - #if HAS_TMC220x - static void tmc_get_ic_registers(TMC2208Stepper, const TMC_get_registers_enum) { SERIAL_CHAR('\t'); } - #endif - - #if HAS_TRINAMIC_CONFIG - template - static void tmc_get_registers(TMC &st, const TMC_get_registers_enum i) { - switch (i) { - case TMC_AXIS_CODES: SERIAL_CHAR('\t'); st.printLabel(); break; - PRINT_TMC_REGISTER(GCONF); - PRINT_TMC_REGISTER(IHOLD_IRUN); - PRINT_TMC_REGISTER(GSTAT); - PRINT_TMC_REGISTER(IOIN); - PRINT_TMC_REGISTER(TPOWERDOWN); - PRINT_TMC_REGISTER(TSTEP); - PRINT_TMC_REGISTER(TPWMTHRS); - PRINT_TMC_REGISTER(CHOPCONF); - PRINT_TMC_REGISTER(PWMCONF); - PRINT_TMC_REGISTER(PWM_SCALE); - PRINT_TMC_REGISTER(DRV_STATUS); - default: tmc_get_ic_registers(st, i); break; - } - SERIAL_CHAR('\t'); - } - #endif - #if HAS_DRIVER(TMC2660) - template - static void tmc_get_registers(TMCMarlin &st, const TMC_get_registers_enum i) { - switch (i) { - case TMC_AXIS_CODES: SERIAL_CHAR('\t'); st.printLabel(); break; - PRINT_TMC_REGISTER(DRVCONF); - PRINT_TMC_REGISTER(DRVCTRL); - PRINT_TMC_REGISTER(CHOPCONF); - PRINT_TMC_REGISTER(DRVSTATUS); - PRINT_TMC_REGISTER(SGCSCONF); - PRINT_TMC_REGISTER(SMARTEN); - default: SERIAL_CHAR('\t'); break; - } - SERIAL_CHAR('\t'); - } - #endif - - static void tmc_get_registers(TMC_get_registers_enum i, const bool print_x, const bool print_y, const bool print_z, const bool print_e) { - if (print_x) { - #if AXIS_IS_TMC(X) - tmc_get_registers(stepperX, i); - #endif - #if AXIS_IS_TMC(X2) - tmc_get_registers(stepperX2, i); - #endif - } - - if (print_y) { - #if AXIS_IS_TMC(Y) - tmc_get_registers(stepperY, i); - #endif - #if AXIS_IS_TMC(Y2) - tmc_get_registers(stepperY2, i); - #endif - } - - if (print_z) { - #if AXIS_IS_TMC(Z) - tmc_get_registers(stepperZ, i); - #endif - #if AXIS_IS_TMC(Z2) - tmc_get_registers(stepperZ2, i); - #endif - #if AXIS_IS_TMC(Z3) - tmc_get_registers(stepperZ3, i); - #endif - #if AXIS_IS_TMC(Z4) - tmc_get_registers(stepperZ4, i); - #endif - } - - if (print_e) { - #if AXIS_IS_TMC(E0) - tmc_get_registers(stepperE0, i); - #endif - #if AXIS_IS_TMC(E1) - tmc_get_registers(stepperE1, i); - #endif - #if AXIS_IS_TMC(E2) - tmc_get_registers(stepperE2, i); - #endif - #if AXIS_IS_TMC(E3) - tmc_get_registers(stepperE3, i); - #endif - #if AXIS_IS_TMC(E4) - tmc_get_registers(stepperE4, i); - #endif - #if AXIS_IS_TMC(E5) - tmc_get_registers(stepperE5, i); - #endif - #if AXIS_IS_TMC(E6) - tmc_get_registers(stepperE6, i); - #endif - #if AXIS_IS_TMC(E7) - tmc_get_registers(stepperE7, i); - #endif - } - - SERIAL_EOL(); - } - - void tmc_get_registers(bool print_x, bool print_y, bool print_z, bool print_e) { - #define _TMC_GET_REG(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_get_registers(ITEM, print_x, print_y, print_z, print_e); }while(0) - #define TMC_GET_REG(NAME, TABS) _TMC_GET_REG(STRINGIFY(NAME) TABS, TMC_GET_##NAME) - _TMC_GET_REG("\t", TMC_AXIS_CODES); - TMC_GET_REG(GCONF, "\t\t"); - TMC_GET_REG(IHOLD_IRUN, "\t"); - TMC_GET_REG(GSTAT, "\t\t"); - TMC_GET_REG(IOIN, "\t\t"); - TMC_GET_REG(TPOWERDOWN, "\t"); - TMC_GET_REG(TSTEP, "\t\t"); - TMC_GET_REG(TPWMTHRS, "\t"); - TMC_GET_REG(TCOOLTHRS, "\t"); - TMC_GET_REG(THIGH, "\t\t"); - TMC_GET_REG(CHOPCONF, "\t"); - TMC_GET_REG(COOLCONF, "\t"); - TMC_GET_REG(PWMCONF, "\t"); - TMC_GET_REG(PWM_SCALE, "\t"); - TMC_GET_REG(DRV_STATUS, "\t"); - } - #endif // TMC_DEBUG -#if USE_SENSORLESS +#if ENABLED(SENSORLESS_HOMING) - bool tmc_enable_stallguard(TMC2130Stepper &st) { - const bool stealthchop_was_enabled = st.en_pwm_mode(); - - st.TCOOLTHRS(0xFFFFF); - st.en_pwm_mode(false); - st.diag1_stall(true); - - return stealthchop_was_enabled; - } - void tmc_disable_stallguard(TMC2130Stepper &st, const bool restore_stealth) { - st.TCOOLTHRS(0); - st.en_pwm_mode(restore_stealth); - st.diag1_stall(false); + void tmc_sensorless_homing(TMC2130Stepper &st, const bool enable/*=true*/) { + st.coolstep_min_speed(enable ? 1024UL * 1024UL - 1UL : 0); + #if ENABLED(STEALTHCHOP) + st.stealthChop(!enable); + #endif + st.diag1_stall(enable ? 1 : 0); } - bool tmc_enable_stallguard(TMC2209Stepper &st) { - const bool stealthchop_was_enabled = !st.en_spreadCycle(); +#endif // SENSORLESS_HOMING - st.TCOOLTHRS(0xFFFFF); - st.en_spreadCycle(false); - return stealthchop_was_enabled; - } - void tmc_disable_stallguard(TMC2209Stepper &st, const bool restore_stealth) { - st.en_spreadCycle(!restore_stealth); - st.TCOOLTHRS(0); - } - - bool tmc_enable_stallguard(TMC2660Stepper) { - // TODO - return false; - } - void tmc_disable_stallguard(TMC2660Stepper, const bool) {}; - -#endif // USE_SENSORLESS - -#if HAS_TMC_SPI +#if HAS_DRIVER(TMC2130) #define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH) void tmc_init_cs_pins() { - #if AXIS_HAS_SPI(X) + #if AXIS_DRIVER_TYPE(X, TMC2130) SET_CS_PIN(X); #endif - #if AXIS_HAS_SPI(Y) + #if AXIS_DRIVER_TYPE(Y, TMC2130) SET_CS_PIN(Y); #endif - #if AXIS_HAS_SPI(Z) + #if AXIS_DRIVER_TYPE(Z, TMC2130) SET_CS_PIN(Z); #endif - #if AXIS_HAS_SPI(X2) + #if AXIS_DRIVER_TYPE(X2, TMC2130) SET_CS_PIN(X2); #endif - #if AXIS_HAS_SPI(Y2) + #if AXIS_DRIVER_TYPE(Y2, TMC2130) SET_CS_PIN(Y2); #endif - #if AXIS_HAS_SPI(Z2) + #if AXIS_DRIVER_TYPE(Z2, TMC2130) SET_CS_PIN(Z2); #endif - #if AXIS_HAS_SPI(Z3) - SET_CS_PIN(Z3); - #endif - #if AXIS_HAS_SPI(Z4) - SET_CS_PIN(Z4); - #endif - #if AXIS_HAS_SPI(E0) + #if AXIS_DRIVER_TYPE(E0, TMC2130) SET_CS_PIN(E0); #endif - #if AXIS_HAS_SPI(E1) + #if AXIS_DRIVER_TYPE(E1, TMC2130) SET_CS_PIN(E1); #endif - #if AXIS_HAS_SPI(E2) + #if AXIS_DRIVER_TYPE(E2, TMC2130) SET_CS_PIN(E2); #endif - #if AXIS_HAS_SPI(E3) + #if AXIS_DRIVER_TYPE(E3, TMC2130) SET_CS_PIN(E3); #endif - #if AXIS_HAS_SPI(E4) + #if AXIS_DRIVER_TYPE(E4, TMC2130) SET_CS_PIN(E4); #endif - #if AXIS_HAS_SPI(E5) - SET_CS_PIN(E5); - #endif - #if AXIS_HAS_SPI(E6) - SET_CS_PIN(E6); - #endif - #if AXIS_HAS_SPI(E7) - SET_CS_PIN(E7); - #endif } -#endif // HAS_TMC_SPI +#endif // TMC2130 -template -static bool test_connection(TMC &st) { - SERIAL_ECHOPGM("Testing "); - st.printLabel(); - SERIAL_ECHOPGM(" connection... "); - const uint8_t test_result = st.test_connection(); - - if (test_result > 0) SERIAL_ECHOPGM("Error: All "); - - const char *stat; - switch (test_result) { - default: - case 0: stat = PSTR("OK"); break; - case 1: stat = PSTR("HIGH"); break; - case 2: stat = PSTR("LOW"); break; - } - serialprintPGM(stat); - SERIAL_EOL(); - - return test_result; -} - -void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z, const bool test_e) { - uint8_t axis_connection = 0; - - if (test_x) { - #if AXIS_IS_TMC(X) - axis_connection += test_connection(stepperX); - #endif - #if AXIS_IS_TMC(X2) - axis_connection += test_connection(stepperX2); - #endif - } - - if (test_y) { - #if AXIS_IS_TMC(Y) - axis_connection += test_connection(stepperY); - #endif - #if AXIS_IS_TMC(Y2) - axis_connection += test_connection(stepperY2); - #endif - } - - if (test_z) { - #if AXIS_IS_TMC(Z) - axis_connection += test_connection(stepperZ); - #endif - #if AXIS_IS_TMC(Z2) - axis_connection += test_connection(stepperZ2); - #endif - #if AXIS_IS_TMC(Z3) - axis_connection += test_connection(stepperZ3); - #endif - #if AXIS_IS_TMC(Z4) - axis_connection += test_connection(stepperZ4); - #endif - } - - if (test_e) { - #if AXIS_IS_TMC(E0) - axis_connection += test_connection(stepperE0); - #endif - #if AXIS_IS_TMC(E1) - axis_connection += test_connection(stepperE1); - #endif - #if AXIS_IS_TMC(E2) - axis_connection += test_connection(stepperE2); - #endif - #if AXIS_IS_TMC(E3) - axis_connection += test_connection(stepperE3); - #endif - #if AXIS_IS_TMC(E4) - axis_connection += test_connection(stepperE4); - #endif - #if AXIS_IS_TMC(E5) - axis_connection += test_connection(stepperE5); - #endif - #if AXIS_IS_TMC(E6) - axis_connection += test_connection(stepperE6); - #endif - #if AXIS_IS_TMC(E7) - axis_connection += test_connection(stepperE7); - #endif - } - - if (axis_connection) LCD_MESSAGEPGM(MSG_ERROR_TMC); -} - -#endif // HAS_TRINAMIC_CONFIG +#endif // HAS_TRINAMIC diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index b65a1254c6..6f11955ac5 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,380 +16,92 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include "../inc/MarlinConfig.h" -#include "../lcd/ultralcd.h" +#ifndef _TMC_UTIL_H_ +#define _TMC_UTIL_H_ -#if HAS_TRINAMIC_CONFIG +#include "../inc/MarlinConfigPre.h" -#include -#include "../module/planner.h" - -#define CHOPPER_DEFAULT_12V { 3, -1, 1 } -#define CHOPPER_DEFAULT_19V { 4, 1, 1 } -#define CHOPPER_DEFAULT_24V { 4, 2, 1 } -#define CHOPPER_DEFAULT_36V { 5, 2, 4 } -#define CHOPPER_PRUSAMK3_24V { 3, -2, 6 } -#define CHOPPER_MARLIN_119 { 5, 2, 3 } -#define CHOPPER_09STEP_24V { 3, -1, 5 } - -#if ENABLED(MONITOR_DRIVER_STATUS) && !defined(MONITOR_DRIVER_STATUS_INTERVAL_MS) - #define MONITOR_DRIVER_STATUS_INTERVAL_MS 500U +#if HAS_DRIVER(TMC2130) + #include #endif -constexpr uint16_t _tmc_thrs(const uint16_t msteps, const uint32_t thrs, const uint32_t spmm) { +#if HAS_DRIVER(TMC2208) + #include +#endif + +extern bool report_tmc_status; + +enum TMC_AxisEnum : char { TMC_X, TMC_Y, TMC_Z, TMC_X2, TMC_Y2, TMC_Z2, TMC_E0, TMC_E1, TMC_E2, TMC_E3, TMC_E4 }; + +constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) { return 12650000UL * msteps / (256 * thrs * spmm); } -template -class TMCStorage { - protected: - // Only a child class has access to constructor => Don't create on its own! "Poor man's abstract class" - TMCStorage() {} - - public: - uint16_t val_mA = 0; - - #if ENABLED(MONITOR_DRIVER_STATUS) - uint8_t otpw_count = 0, - error_count = 0; - bool flag_otpw = false; - inline bool getOTPW() { return flag_otpw; } - inline void clear_otpw() { flag_otpw = 0; } - #endif - - inline uint16_t getMilliamps() { return val_mA; } - - inline void printLabel() { - SERIAL_CHAR(AXIS_LETTER); - if (DRIVER_ID > '0') SERIAL_CHAR(DRIVER_ID); - } - - struct { - TERN_(HAS_STEALTHCHOP, bool stealthChop_enabled = false); - TERN_(HYBRID_THRESHOLD, uint8_t hybrid_thrs = 0); - TERN_(USE_SENSORLESS, int16_t homing_thrs = 0); - } stored; -}; - -template -class TMCMarlin : public TMC, public TMCStorage { - public: - TMCMarlin(const uint16_t cs_pin, const float RS) : - TMC(cs_pin, RS) - {} - TMCMarlin(const uint16_t cs_pin, const float RS, const uint8_t axis_chain_index) : - TMC(cs_pin, RS, axis_chain_index) - {} - TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK) : - TMC(CS, RS, pinMOSI, pinMISO, pinSCK) - {} - TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t axis_chain_index) : - TMC(CS, RS, pinMOSI, pinMISO, pinSCK, axis_chain_index) - {} - inline uint16_t rms_current() { return TMC::rms_current(); } - inline void rms_current(uint16_t mA) { - this->val_mA = mA; - TMC::rms_current(mA); - } - inline void rms_current(const uint16_t mA, const float mult) { - this->val_mA = mA; - TMC::rms_current(mA, mult); - } - inline uint16_t get_microstep_counter() { return TMC::MSCNT(); } - - #if HAS_STEALTHCHOP - inline void refresh_stepping_mode() { this->en_pwm_mode(this->stored.stealthChop_enabled); } - inline bool get_stealthChop_status() { return this->en_pwm_mode(); } - inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } - #endif - - #if ENABLED(HYBRID_THRESHOLD) - uint32_t get_pwm_thrs() { - return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); - } - void set_pwm_thrs(const uint32_t thrs) { - TMC::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); - TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); - } - #endif - - #if USE_SENSORLESS - inline int16_t homing_threshold() { return TMC::sgt(); } - void homing_threshold(int16_t sgt_val) { - sgt_val = (int16_t)constrain(sgt_val, sgt_min, sgt_max); - TMC::sgt(sgt_val); - TERN_(HAS_LCD_MENU, this->stored.homing_thrs = sgt_val); - } - #if ENABLED(SPI_ENDSTOPS) - bool test_stall_status(); - #endif - #endif - - #if HAS_LCD_MENU - inline void refresh_stepper_current() { rms_current(this->val_mA); } - - #if ENABLED(HYBRID_THRESHOLD) - inline void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } - #endif - #if USE_SENSORLESS - inline void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } - #endif - #endif - - static constexpr int8_t sgt_min = -64, - sgt_max = 63; -}; - -template -class TMCMarlin : public TMC2208Stepper, public TMCStorage { - public: - TMCMarlin(Stream * SerialPort, const float RS, const uint8_t) : - TMC2208Stepper(SerialPort, RS) - {} - TMCMarlin(Stream * SerialPort, const float RS, uint8_t addr, const uint16_t mul_pin1, const uint16_t mul_pin2) : - TMC2208Stepper(SerialPort, RS, addr, mul_pin1, mul_pin2) - {} - TMCMarlin(const uint16_t RX, const uint16_t TX, const float RS, const uint8_t) : - TMC2208Stepper(RX, TX, RS) - {} - - uint16_t rms_current() { return TMC2208Stepper::rms_current(); } - inline void rms_current(const uint16_t mA) { - this->val_mA = mA; - TMC2208Stepper::rms_current(mA); - } - inline void rms_current(const uint16_t mA, const float mult) { - this->val_mA = mA; - TMC2208Stepper::rms_current(mA, mult); - } - inline uint16_t get_microstep_counter() { return TMC2208Stepper::MSCNT(); } - - #if HAS_STEALTHCHOP - inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } - inline bool get_stealthChop_status() { return !this->en_spreadCycle(); } - inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } - #endif - - #if ENABLED(HYBRID_THRESHOLD) - uint32_t get_pwm_thrs() { - return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); - } - void set_pwm_thrs(const uint32_t thrs) { - TMC2208Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); - TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); - } - #endif - - #if HAS_LCD_MENU - inline void refresh_stepper_current() { rms_current(this->val_mA); } - - #if ENABLED(HYBRID_THRESHOLD) - inline void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } - #endif - #endif -}; - -template -class TMCMarlin : public TMC2209Stepper, public TMCStorage { - public: - TMCMarlin(Stream * SerialPort, const float RS, const uint8_t addr) : - TMC2209Stepper(SerialPort, RS, addr) - {} - TMCMarlin(const uint16_t RX, const uint16_t TX, const float RS, const uint8_t addr) : - TMC2209Stepper(RX, TX, RS, addr) - {} - uint8_t get_address() { return slave_address; } - uint16_t rms_current() { return TMC2209Stepper::rms_current(); } - inline void rms_current(const uint16_t mA) { - this->val_mA = mA; - TMC2209Stepper::rms_current(mA); - } - inline void rms_current(const uint16_t mA, const float mult) { - this->val_mA = mA; - TMC2209Stepper::rms_current(mA, mult); - } - inline uint16_t get_microstep_counter() { return TMC2209Stepper::MSCNT(); } - - #if HAS_STEALTHCHOP - inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } - inline bool get_stealthChop_status() { return !this->en_spreadCycle(); } - inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } - #endif - - #if ENABLED(HYBRID_THRESHOLD) - uint32_t get_pwm_thrs() { - return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); - } - void set_pwm_thrs(const uint32_t thrs) { - TMC2209Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); - TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); - } - #endif - #if USE_SENSORLESS - inline int16_t homing_threshold() { return TMC2209Stepper::SGTHRS(); } - void homing_threshold(int16_t sgt_val) { - sgt_val = (int16_t)constrain(sgt_val, sgt_min, sgt_max); - TMC2209Stepper::SGTHRS(sgt_val); - TERN_(HAS_LCD_MENU, this->stored.homing_thrs = sgt_val); - } - #endif - - #if HAS_LCD_MENU - inline void refresh_stepper_current() { rms_current(this->val_mA); } - - #if ENABLED(HYBRID_THRESHOLD) - inline void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } - #endif - #if USE_SENSORLESS - inline void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } - #endif - #endif - - static constexpr uint8_t sgt_min = 0, - sgt_max = 255; -}; - -template -class TMCMarlin : public TMC2660Stepper, public TMCStorage { - public: - TMCMarlin(const uint16_t cs_pin, const float RS, const uint8_t) : - TMC2660Stepper(cs_pin, RS) - {} - TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t) : - TMC2660Stepper(CS, RS, pinMOSI, pinMISO, pinSCK) - {} - inline uint16_t rms_current() { return TMC2660Stepper::rms_current(); } - inline void rms_current(const uint16_t mA) { - this->val_mA = mA; - TMC2660Stepper::rms_current(mA); - } - inline uint16_t get_microstep_counter() { return TMC2660Stepper::mstep(); } - - #if USE_SENSORLESS - inline int16_t homing_threshold() { return TMC2660Stepper::sgt(); } - void homing_threshold(int16_t sgt_val) { - sgt_val = (int16_t)constrain(sgt_val, sgt_min, sgt_max); - TMC2660Stepper::sgt(sgt_val); - TERN_(HAS_LCD_MENU, this->stored.homing_thrs = sgt_val); - } - #endif - - #if HAS_LCD_MENU - inline void refresh_stepper_current() { rms_current(this->val_mA); } - - #if USE_SENSORLESS - inline void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } - #endif - #endif - - static constexpr int8_t sgt_min = -64, - sgt_max = 63; -}; +void _tmc_say_axis(const TMC_AxisEnum axis); +void _tmc_say_current(const TMC_AxisEnum axis, const uint16_t curr); +void _tmc_say_otpw(const TMC_AxisEnum axis, const bool otpw); +void _tmc_say_otpw_cleared(const TMC_AxisEnum axis); +void _tmc_say_pwmthrs(const TMC_AxisEnum axis, const uint32_t thrs); +void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt); template -void tmc_print_current(TMC &st) { - st.printLabel(); - SERIAL_ECHOLNPAIR(" driver current: ", st.getMilliamps()); +void tmc_get_current(TMC &st, const TMC_AxisEnum axis) { + _tmc_say_current(axis, st.getCurrent()); +} +template +void tmc_set_current(TMC &st, const int mA) { + st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER); +} +template +void tmc_report_otpw(TMC &st, const TMC_AxisEnum axis) { + _tmc_say_otpw(axis, st.getOTPW()); +} +template +void tmc_clear_otpw(TMC &st, const TMC_AxisEnum axis) { + st.clear_otpw(); + _tmc_say_otpw_cleared(axis); +} +template +void tmc_get_pwmthrs(TMC &st, const TMC_AxisEnum axis, const uint16_t spmm) { + _tmc_say_pwmthrs(axis, _tmc_thrs(st.microsteps(), st.TPWMTHRS(), spmm)); +} +template +void tmc_set_pwmthrs(TMC &st, const int32_t thrs, const uint32_t spmm) { + st.TPWMTHRS(_tmc_thrs(st.microsteps(), thrs, spmm)); +} +template +void tmc_get_sgt(TMC &st, const TMC_AxisEnum axis) { + _tmc_say_sgt(axis, st.sgt()); +} +template +void tmc_set_sgt(TMC &st, const int8_t sgt_val) { + st.sgt(sgt_val); } -#if ENABLED(MONITOR_DRIVER_STATUS) - template - void tmc_report_otpw(TMC &st) { - st.printLabel(); - SERIAL_ECHOPGM(" temperature prewarn triggered: "); - serialprint_truefalse(st.getOTPW()); - SERIAL_EOL(); - } - template - void tmc_clear_otpw(TMC &st) { - st.clear_otpw(); - st.printLabel(); - SERIAL_ECHOLNPGM(" prewarn flag cleared"); - } -#endif -#if ENABLED(HYBRID_THRESHOLD) - template - void tmc_print_pwmthrs(TMC &st) { - st.printLabel(); - SERIAL_ECHOLNPAIR(" stealthChop max speed: ", st.get_pwm_thrs()); - } -#endif -#if USE_SENSORLESS - template - void tmc_print_sgt(TMC &st) { - st.printLabel(); - SERIAL_ECHOPGM(" homing sensitivity: "); - SERIAL_PRINTLN(st.homing_threshold(), DEC); - } -#endif - -void monitor_tmc_drivers(); -void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z, const bool test_e); +void monitor_tmc_driver(); #if ENABLED(TMC_DEBUG) - #if ENABLED(MONITOR_DRIVER_STATUS) - void tmc_set_report_interval(const uint16_t update_interval); - #endif - void tmc_report_all(const bool print_x, const bool print_y, const bool print_z, const bool print_e); - void tmc_get_registers(const bool print_x, const bool print_y, const bool print_z, const bool print_e); + void tmc_set_report_status(const bool status); + void tmc_report_all(); #endif /** - * TMC2130-specific sensorless homing using stallGuard2. + * TMC2130 specific sensorless homing using stallGuard2. * stallGuard2 only works when in spreadCycle mode. - * spreadCycle and stealthChop are mutually-exclusive. + * spreadCycle and stealthChop are mutually exclusive. * * Defined here because of limitations with templates and headers. */ -#if USE_SENSORLESS +#if ENABLED(SENSORLESS_HOMING) + void tmc_sensorless_homing(TMC2130Stepper &st, const bool enable=true); +#endif - // Track enabled status of stealthChop and only re-enable where applicable - struct sensorless_t { bool x, y, z, x2, y2, z2, z3, z4; }; - - #if ENABLED(IMPROVE_HOMING_RELIABILITY) - extern millis_t sg_guard_period; - constexpr uint16_t default_sg_guard_duration = 400; - - struct slow_homing_t { - xy_ulong_t acceleration; - TERN_(HAS_CLASSIC_JERK, xy_float_t jerk_xy); - }; - #endif - - bool tmc_enable_stallguard(TMC2130Stepper &st); - void tmc_disable_stallguard(TMC2130Stepper &st, const bool restore_stealth); - - bool tmc_enable_stallguard(TMC2209Stepper &st); - void tmc_disable_stallguard(TMC2209Stepper &st, const bool restore_stealth); - - bool tmc_enable_stallguard(TMC2660Stepper); - void tmc_disable_stallguard(TMC2660Stepper, const bool); - - #if ENABLED(SPI_ENDSTOPS) - - template - bool TMCMarlin::test_stall_status() { - this->switchCSpin(LOW); - - // read stallGuard flag from TMC library, will handle HW and SW SPI - TMC2130_n::DRV_STATUS_t drv_status{0}; - drv_status.sr = this->DRV_STATUS(); - - this->switchCSpin(HIGH); - - return drv_status.stallGuard; - } - #endif // SPI_ENDSTOPS - -#endif // USE_SENSORLESS - -#if HAS_TMC_SPI +#if HAS_DRIVER(TMC2130) void tmc_init_cs_pins(); #endif -#endif // HAS_TRINAMIC_CONFIG +#endif // _TMC_UTIL_H_ diff --git a/Marlin/src/feature/twibus.cpp b/Marlin/src/feature/twibus.cpp index 3cc20579ac..ef1fa742a0 100644 --- a/Marlin/src/feature/twibus.cpp +++ b/Marlin/src/feature/twibus.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -34,78 +34,95 @@ TWIBus::TWIBus() { #else Wire.begin(I2C_SLAVE_ADDRESS); // Join the bus as a slave #endif - reset(); + this->reset(); } void TWIBus::reset() { - buffer_s = 0; - buffer[0] = 0x00; + this->buffer_s = 0; + this->buffer[0] = 0x00; } void TWIBus::address(const uint8_t adr) { if (!WITHIN(adr, 8, 127)) { - SERIAL_ECHO_MSG("Bad I2C address (8-127)"); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM("Bad I2C address (8-127)"); } - addr = adr; + this->addr = adr; - debug(PSTR("address"), adr); + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("address"), adr); + #endif } void TWIBus::addbyte(const char c) { - if (buffer_s >= COUNT(buffer)) return; - buffer[buffer_s++] = c; - debug(PSTR("addbyte"), c); + if (this->buffer_s >= COUNT(this->buffer)) return; + this->buffer[this->buffer_s++] = c; + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("addbyte"), c); + #endif } void TWIBus::addbytes(char src[], uint8_t bytes) { - debug(PSTR("addbytes"), bytes); - while (bytes--) addbyte(*src++); + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("addbytes"), bytes); + #endif + while (bytes--) this->addbyte(*src++); } void TWIBus::addstring(char str[]) { - debug(PSTR("addstring"), str); - while (char c = *str++) addbyte(c); + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("addstring"), str); + #endif + while (char c = *str++) this->addbyte(c); } void TWIBus::send() { - debug(PSTR("send"), addr); + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("send"), this->addr); + #endif - Wire.beginTransmission(I2C_ADDRESS(addr)); - Wire.write(buffer, buffer_s); + Wire.beginTransmission(this->addr); + Wire.write(this->buffer, this->buffer_s); Wire.endTransmission(); - reset(); + this->reset(); } // static -void TWIBus::echoprefix(uint8_t bytes, const char pref[], uint8_t adr) { +void TWIBus::echoprefix(uint8_t bytes, const char prefix[], uint8_t adr) { SERIAL_ECHO_START(); - serialprintPGM(pref); - SERIAL_ECHOPAIR(": from:", adr, " bytes:", bytes, " data:"); + serialprintPGM(prefix); + SERIAL_ECHOPAIR(": from:", adr); + SERIAL_ECHOPAIR(" bytes:", bytes); + SERIAL_ECHOPGM(" data:"); } // static -void TWIBus::echodata(uint8_t bytes, const char pref[], uint8_t adr) { - echoprefix(bytes, pref, adr); +void TWIBus::echodata(uint8_t bytes, const char prefix[], uint8_t adr) { + echoprefix(bytes, prefix, adr); while (bytes-- && Wire.available()) SERIAL_CHAR(Wire.read()); SERIAL_EOL(); } -void TWIBus::echobuffer(const char pref[], uint8_t adr) { - echoprefix(buffer_s, pref, adr); - LOOP_L_N(i, buffer_s) SERIAL_CHAR(buffer[i]); +void TWIBus::echobuffer(const char prefix[], uint8_t adr) { + echoprefix(this->buffer_s, prefix, adr); + for (uint8_t i = 0; i < this->buffer_s; i++) SERIAL_CHAR(this->buffer[i]); SERIAL_EOL(); } bool TWIBus::request(const uint8_t bytes) { - if (!addr) return false; + if (!this->addr) return false; - debug(PSTR("request"), bytes); + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("request"), bytes); + #endif // requestFrom() is a blocking function - if (Wire.requestFrom(I2C_ADDRESS(addr), bytes) == 0) { - debug("request fail", I2C_ADDRESS(addr)); + if (Wire.requestFrom(this->addr, bytes) == 0) { + #if ENABLED(DEBUG_TWIBUS) + debug("request fail", this->addr); + #endif return false; } @@ -113,19 +130,23 @@ bool TWIBus::request(const uint8_t bytes) { } void TWIBus::relay(const uint8_t bytes) { - debug(PSTR("relay"), bytes); + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("relay"), bytes); + #endif - if (request(bytes)) - echodata(bytes, PSTR("i2c-reply"), addr); + if (this->request(bytes)) + echodata(bytes, PSTR("i2c-reply"), this->addr); } uint8_t TWIBus::capture(char *dst, const uint8_t bytes) { - reset(); + this->reset(); uint8_t count = 0; while (count < bytes && Wire.available()) dst[count++] = Wire.read(); - debug(PSTR("capture"), count); + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("capture"), count); + #endif return count; } @@ -138,21 +159,25 @@ void TWIBus::flush() { #if I2C_SLAVE_ADDRESS > 0 void TWIBus::receive(uint8_t bytes) { - debug(PSTR("receive"), bytes); + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("receive"), bytes); + #endif echodata(bytes, PSTR("i2c-receive"), 0); } - void TWIBus::reply(char str[]/*=nullptr*/) { - debug(PSTR("reply"), str); + void TWIBus::reply(char str[]/*=NULL*/) { + #if ENABLED(DEBUG_TWIBUS) + debug(PSTR("reply"), str); + #endif if (str) { - reset(); - addstring(str); + this->reset(); + this->addstring(str); } - Wire.write(buffer, buffer_s); + Wire.write(this->buffer, this->buffer_s); - reset(); + this->reset(); } #endif diff --git a/Marlin/src/feature/twibus.h b/Marlin/src/feature/twibus.h index 82aa9aa16a..7a17e2d53a 100644 --- a/Marlin/src/feature/twibus.h +++ b/Marlin/src/feature/twibus.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef TWIBUS_H +#define TWIBUS_H #include "../core/macros.h" @@ -46,8 +48,9 @@ typedef void (*twiRequestFunc_t)(); * for the host to interpret. * * For more information see - * - https://marlinfw.org/docs/gcode/M260.html - * - https://marlinfw.org/docs/gcode/M261.html + * - http://marlinfw.org/docs/gcode/M260.html + * - http://marlinfw.org/docs/gcode/M261.html + * */ class TWIBus { private: @@ -61,7 +64,7 @@ class TWIBus { * @brief Internal buffer * @details A fixed buffer. TWI commands can be no longer than this. */ - uint8_t buffer[TWIBUS_BUFFER_SIZE]; + char buffer[TWIBUS_BUFFER_SIZE]; public: @@ -216,12 +219,13 @@ class TWIBus { * @details Send the buffer and clear it. * If a string is passed, write it into the buffer first. */ - void reply(char str[]=nullptr); - inline void reply(const char str[]) { reply((char*)str); } + void reply(char str[]=NULL); + inline void reply(const char str[]) { this->reply((char*)str); } #endif #if ENABLED(DEBUG_TWIBUS) + /** * @brief Prints a debug message * @details Prints a simple debug message "TWIBus::function: value" @@ -231,10 +235,8 @@ class TWIBus { static void debug(const char func[], char c); static void debug(const char func[], char adr[]); static inline void debug(const char func[], uint8_t v) { debug(func, (uint32_t)v); } - #else - static inline void debug(const char[], uint32_t) {} - static inline void debug(const char[], char) {} - static inline void debug(const char[], char[]) {} - static inline void debug(const char[], uint8_t) {} + #endif }; + +#endif // TWIBUS_H diff --git a/Marlin/src/feature/z_stepper_align.cpp b/Marlin/src/feature/z_stepper_align.cpp deleted file mode 100644 index 87b1f6f251..0000000000 --- a/Marlin/src/feature/z_stepper_align.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * feature/z_stepper_align.cpp - */ - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(Z_STEPPER_AUTO_ALIGN) - -#include "z_stepper_align.h" -#include "../module/probe.h" - -ZStepperAlign z_stepper_align; - -xy_pos_t ZStepperAlign::xy[NUM_Z_STEPPER_DRIVERS]; - -#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - xy_pos_t ZStepperAlign::stepper_xy[NUM_Z_STEPPER_DRIVERS]; -#endif - -void ZStepperAlign::reset_to_default() { - #ifdef Z_STEPPER_ALIGN_XY - - constexpr xy_pos_t xy_init[] = Z_STEPPER_ALIGN_XY; - static_assert(COUNT(xy_init) == NUM_Z_STEPPER_DRIVERS, - "Z_STEPPER_ALIGN_XY requires " - #if NUM_Z_STEPPER_DRIVERS == 4 - "four {X,Y} entries (Z, Z2, Z3, and Z4)." - #elif NUM_Z_STEPPER_DRIVERS == 3 - "three {X,Y} entries (Z, Z2, and Z3)." - #else - "two {X,Y} entries (Z and Z2)." - #endif - ); - - constexpr xyz_pos_t dpo = NOZZLE_TO_PROBE_OFFSET; - - #define LTEST(N) (xy_init[N].x >= _MAX(X_MIN_BED + PROBING_MARGIN_LEFT, X_MIN_POS + dpo.x) - 0.00001f) - #define RTEST(N) (xy_init[N].x <= _MIN(X_MAX_BED - PROBING_MARGIN_RIGHT, X_MAX_POS + dpo.x) + 0.00001f) - #define FTEST(N) (xy_init[N].y >= _MAX(Y_MIN_BED + PROBING_MARGIN_FRONT, Y_MIN_POS + dpo.y) - 0.00001f) - #define BTEST(N) (xy_init[N].y <= _MIN(Y_MAX_BED - PROBING_MARGIN_BACK, Y_MAX_POS + dpo.y) + 0.00001f) - - static_assert(LTEST(0) && RTEST(0), "The 1st Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); - static_assert(FTEST(0) && BTEST(0), "The 1st Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); - static_assert(LTEST(1) && RTEST(1), "The 2nd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); - static_assert(FTEST(1) && BTEST(1), "The 2nd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); - #if NUM_Z_STEPPER_DRIVERS >= 3 - static_assert(LTEST(2) && RTEST(2), "The 3rd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); - static_assert(FTEST(2) && BTEST(2), "The 3rd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); - #if NUM_Z_STEPPER_DRIVERS >= 4 - static_assert(LTEST(3) && RTEST(3), "The 4th Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); - static_assert(FTEST(3) && BTEST(3), "The 4th Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); - #endif - #endif - - #else // !defined(Z_STEPPER_ALIGN_XY) - - const xy_pos_t xy_init[] = { - #if NUM_Z_STEPPER_DRIVERS >= 3 // First probe point... - #if !Z_STEPPERS_ORIENTATION - { probe.min_x(), probe.min_y() }, // SW - #elif Z_STEPPERS_ORIENTATION == 1 - { probe.min_x(), probe.max_y() }, // NW - #elif Z_STEPPERS_ORIENTATION == 2 - { probe.max_x(), probe.max_y() }, // NE - #elif Z_STEPPERS_ORIENTATION == 3 - { probe.max_x(), probe.min_y() }, // SE - #else - #error "Z_STEPPERS_ORIENTATION must be from 0 to 3 (first point SW, NW, NE, SE)." - #endif - #if NUM_Z_STEPPER_DRIVERS == 4 // 3 more points... - #if !Z_STEPPERS_ORIENTATION - { probe.min_x(), probe.max_y() }, { probe.max_x(), probe.max_y() }, { probe.max_x(), probe.min_y() } // SW - #elif Z_STEPPERS_ORIENTATION == 1 - { probe.max_x(), probe.max_y() }, { probe.max_x(), probe.min_y() }, { probe.min_x(), probe.min_y() } // NW - #elif Z_STEPPERS_ORIENTATION == 2 - { probe.max_x(), probe.min_y() }, { probe.min_x(), probe.min_y() }, { probe.min_x(), probe.max_y() } // NE - #elif Z_STEPPERS_ORIENTATION == 3 - { probe.min_x(), probe.min_y() }, { probe.min_x(), probe.max_y() }, { probe.max_x(), probe.max_y() } // SE - #endif - #elif !Z_STEPPERS_ORIENTATION // or 2 more points... - { probe.max_x(), probe.min_y() }, { X_CENTER, probe.max_y() } // SW - #elif Z_STEPPERS_ORIENTATION == 1 - { probe.min_x(), probe.min_y() }, { probe.max_x(), Y_CENTER } // NW - #elif Z_STEPPERS_ORIENTATION == 2 - { probe.min_x(), probe.max_y() }, { X_CENTER, probe.min_y() } // NE - #elif Z_STEPPERS_ORIENTATION == 3 - { probe.max_x(), probe.max_y() }, { probe.min_x(), Y_CENTER } // SE - #endif - #elif Z_STEPPERS_ORIENTATION - { X_CENTER, probe.min_y() }, { X_CENTER, probe.max_y() } - #else - { probe.min_x(), Y_CENTER }, { probe.max_x(), Y_CENTER } - #endif - }; - - #endif // !defined(Z_STEPPER_ALIGN_XY) - - COPY(xy, xy_init); - - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - constexpr xy_pos_t stepper_xy_init[] = Z_STEPPER_ALIGN_STEPPER_XY; - static_assert( - COUNT(stepper_xy_init) == NUM_Z_STEPPER_DRIVERS, - "Z_STEPPER_ALIGN_STEPPER_XY requires " - #if NUM_Z_STEPPER_DRIVERS == 4 - "four {X,Y} entries (Z, Z2, Z3, and Z4)." - #elif NUM_Z_STEPPER_DRIVERS == 3 - "three {X,Y} entries (Z, Z2, and Z3)." - #endif - ); - COPY(stepper_xy, stepper_xy_init); - #endif -} - -#endif // Z_STEPPER_AUTO_ALIGN diff --git a/Marlin/src/feature/z_stepper_align.h b/Marlin/src/feature/z_stepper_align.h deleted file mode 100644 index e1b235b52c..0000000000 --- a/Marlin/src/feature/z_stepper_align.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * feature/z_stepper_align.h - */ - -#include "../inc/MarlinConfig.h" - -class ZStepperAlign { - public: - static xy_pos_t xy[NUM_Z_STEPPER_DRIVERS]; - - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - static xy_pos_t stepper_xy[NUM_Z_STEPPER_DRIVERS]; - #endif - - static void reset_to_default(); -}; - -extern ZStepperAlign z_stepper_align; diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 661128b04e..e94fdcda71 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,50 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ +/** + * Marlin Firmware -- G26 - Mesh Validation Tool + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(G26_MESH_VALIDATION) + +#define G26_OK false +#define G26_ERR true + +#include "../../gcode/gcode.h" +#include "../../feature/bedlevel/bedlevel.h" + +#include "../../Marlin.h" +#include "../../module/planner.h" +#include "../../module/stepper.h" +#include "../../module/motion.h" +#include "../../module/temperature.h" +#include "../../lcd/ultralcd.h" + +#define EXTRUSION_MULTIPLIER 1.0 +#define RETRACTION_MULTIPLIER 1.0 +#define PRIME_LENGTH 10.0 +#define OOZE_AMOUNT 0.3 + +#define INTERSECTION_CIRCLE_RADIUS 5 +#define CROSSHAIRS_SIZE 3 + +#if CROSSHAIRS_SIZE >= INTERSECTION_CIRCLE_RADIUS + #error "CROSSHAIRS_SIZE must be less than INTERSECTION_CIRCLE_RADIUS." +#endif + +#define G26_OK false +#define G26_ERR true + +#if ENABLED(ARC_SUPPORT) + void plan_arc(const float (&cart)[XYZE], const float (&offset)[2], const uint8_t clockwise); +#endif + /** * G26 Mesh Validation Tool * @@ -42,13 +82,11 @@ * D Disable Disable the Unified Bed Leveling System. In the normal case the user is invoking this * command to see how well a Mesh as been adjusted to match a print surface. In order to do * this the Unified Bed Leveling System is turned on by the G26 command. The D parameter - * alters the command's normal behavior and disables the Unified Bed Leveling System even if + * alters the command's normal behaviour and disables the Unified Bed Leveling System even if * it is on. * * H # Hotend Set the Nozzle Temperature. If not specified, a default of 205 C. will be assumed. * - * I # Preset Heat the Nozzle and Bed based on a Material Preset (if material presets are defined). - * * F # Filament Used to specify the diameter of the filament being used. If not specified * 1.75mm filament is assumed. If you are not getting acceptable results by using the * 'correct' numbers, you can scale this number up or down a little bit to change the amount @@ -86,63 +124,22 @@ * S # Nozzle Used to control the size of nozzle diameter. If not specified, a .4mm nozzle is assumed. * * U # Random Randomize the order that the circles are drawn on the bed. The search for the closest - * un-drawn circle is still done. But the distance to the location for each circle has a - * random number of the specified size added to it. Specifying S50 will give an interesting - * deviation from the normal behavior on a 10 x 10 Mesh. + * undrawn cicle is still done. But the distance to the location for each circle has a + * random number of the size specified added to it. Specifying S50 will give an interesting + * deviation from the normal behaviour on a 10 x 10 Mesh. * * X # X Coord. Specify the starting location of the drawing activity. * * Y # Y Coord. Specify the starting location of the drawing activity. */ -#include "../../inc/MarlinConfig.h" +// External references -#if ENABLED(G26_MESH_VALIDATION) +// Private functions -#define G26_OK false -#define G26_ERR true - -#include "../../gcode/gcode.h" -#include "../../feature/bedlevel/bedlevel.h" - -#include "../../MarlinCore.h" -#include "../../module/planner.h" -#include "../../module/stepper.h" -#include "../../module/motion.h" -#include "../../module/tool_change.h" -#include "../../module/temperature.h" -#include "../../lcd/ultralcd.h" - -#define EXTRUSION_MULTIPLIER 1.0 -#define PRIME_LENGTH 10.0 -#define OOZE_AMOUNT 0.3 - -#define INTERSECTION_CIRCLE_RADIUS 5 -#define CROSSHAIRS_SIZE 3 - -#ifndef G26_RETRACT_MULTIPLIER - #define G26_RETRACT_MULTIPLIER 1.0 // x 1mm -#endif - -#ifndef G26_XY_FEEDRATE - #define G26_XY_FEEDRATE (PLANNER_XY_FEEDRATE() / 3.0) -#endif - -#if CROSSHAIRS_SIZE >= INTERSECTION_CIRCLE_RADIUS - #error "CROSSHAIRS_SIZE must be less than INTERSECTION_CIRCLE_RADIUS." -#endif - -#define G26_OK false -#define G26_ERR true - -#if ENABLED(ARC_SUPPORT) - void plan_arc(const xyze_pos_t &cart, const ab_float_t &offset, const uint8_t clockwise); -#endif - -constexpr float g26_e_axis_feedrate = 0.025; - -static MeshFlags circle_flags, horizontal_mesh_line_flags, vertical_mesh_line_flags; -float g26_random_deviation = 0.0; +static uint16_t circle_flags[16], horizontal_mesh_line_flags[16], vertical_mesh_line_flags[16]; +float g26_e_axis_feedrate = 0.025, + random_deviation = 0.0; static bool g26_retracted = false; // Track the retracted state of the nozzle so mismatched // retracts/recovers won't result in a bad state. @@ -152,105 +149,126 @@ float g26_extrusion_multiplier, g26_layer_height, g26_prime_length; -xy_pos_t g26_xy_pos; // = { 0, 0 } +float g26_x_pos = 0, g26_y_pos = 0; int16_t g26_bed_temp, g26_hotend_temp; int8_t g26_prime_flag; -#if HAS_LCD_MENU +#if ENABLED(ULTIPANEL) /** * If the LCD is clicked, cancel, wait for release, return true */ bool user_canceled() { - if (!ui.button_pressed()) return false; // Return if the button isn't pressed - ui.set_status_P(GET_TEXT(MSG_G26_CANCELED), 99); - TERN_(HAS_LCD_MENU, ui.quick_feedback()); - ui.wait_for_release(); + if (!is_lcd_clicked()) return false; // Return if the button isn't pressed + lcd_setstatusPGM(PSTR("Mesh Validation Stopped."), 99); + #if ENABLED(ULTIPANEL) + lcd_quick_feedback(true); + #endif + wait_for_release(); return true; } + bool exit_from_g26() { + lcd_setstatusPGM(PSTR("Leaving G26"), -1); + wait_for_release(); + return G26_ERR; + } + #endif -mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { +mesh_index_pair find_closest_circle_to_print(const float &X, const float &Y) { float closest = 99999.99; - mesh_index_pair out_point; + mesh_index_pair return_val; - out_point.pos = -1; + return_val.x_index = return_val.y_index = -1; - GRID_LOOP(i, j) { - if (!circle_flags.marked(i, j)) { - // We found a circle that needs to be printed - const xy_pos_t m = { _GET_MESH_X(i), _GET_MESH_Y(j) }; + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { + if (!is_bitmap_set(circle_flags, i, j)) { + const float mx = _GET_MESH_X(i), // We found a circle that needs to be printed + my = _GET_MESH_Y(j); - // Get the distance to this intersection - float f = (pos - m).magnitude(); + // Get the distance to this intersection + float f = HYPOT(X - mx, Y - my); - // It is possible that we are being called with the values - // to let us find the closest circle to the start position. - // But if this is not the case, add a small weighting to the - // distance calculation to help it choose a better place to continue. - f += (g26_xy_pos - m).magnitude() / 15.0f; + // It is possible that we are being called with the values + // to let us find the closest circle to the start position. + // But if this is not the case, add a small weighting to the + // distance calculation to help it choose a better place to continue. + f += HYPOT(g26_x_pos - mx, g26_y_pos - my) / 15.0; - // Add the specified amount of Random Noise to our search - if (g26_random_deviation > 1.0) f += random(0.0, g26_random_deviation); + // Add in the specified amount of Random Noise to our search + if (random_deviation > 1.0) + f += random(0.0, random_deviation); - if (f < closest) { - closest = f; // Found a closer un-printed location - out_point.pos.set(i, j); // Save its data - out_point.distance = closest; + if (f < closest) { + closest = f; // We found a closer location that is still + return_val.x_index = i; // un-printed --- save the data for it + return_val.y_index = j; + return_val.distance = closest; + } } } } - circle_flags.mark(out_point); // Mark this location as done. - return out_point; + bitmap_set(circle_flags, return_val.x_index, return_val.y_index); // Mark this location as done. + return return_val; +} + +void G26_line_to_destination(const float &feed_rate) { + const float save_feedrate = feedrate_mm_s; + feedrate_mm_s = feed_rate; + prepare_move_to_destination(); // will ultimately call ubl.line_to_destination_cartesian or ubl.prepare_linear_move_to for UBL_SEGMENTED + feedrate_mm_s = save_feedrate; } void move_to(const float &rx, const float &ry, const float &z, const float &e_delta) { + float feed_value; static float last_z = -999.99; - const xy_pos_t dest = { rx, ry }; - - const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. - - destination = current_position; + bool has_xy_component = (rx != current_position[X_AXIS] || ry != current_position[Y_AXIS]); // Check if X or Y is involved in the movement. if (z != last_z) { - last_z = destination.z = z; - const feedRate_t feed_value = planner.settings.max_feedrate_mm_s[Z_AXIS] * 0.5f; // Use half of the Z_AXIS max feed rate - prepare_internal_move_to_destination(feed_value); - destination = current_position; + last_z = z; + feed_value = planner.max_feedrate_mm_s[Z_AXIS]/(3.0); // Base the feed rate off of the configured Z_AXIS feed rate + + destination[X_AXIS] = current_position[X_AXIS]; + destination[Y_AXIS] = current_position[Y_AXIS]; + destination[Z_AXIS] = z; // We know the last_z==z or we wouldn't be in this block of code. + destination[E_AXIS] = current_position[E_AXIS]; + + G26_line_to_destination(feed_value); + set_destination_from_current(); } - // If X or Y is involved do a 'normal' move. Otherwise retract/recover/hop. - destination = dest; - destination.e += e_delta; - const feedRate_t feed_value = has_xy_component ? feedRate_t(G26_XY_FEEDRATE) : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; - prepare_internal_move_to_destination(feed_value); - destination = current_position; + // Check if X or Y is involved in the movement. + // Yes: a 'normal' movement. No: a retract() or recover() + feed_value = has_xy_component ? PLANNER_XY_FEEDRATE() / 10.0 : planner.max_feedrate_mm_s[E_AXIS] / 1.5; + + if (g26_debug_flag) SERIAL_ECHOLNPAIR("in move_to() feed_value for XY:", feed_value); + + destination[X_AXIS] = rx; + destination[Y_AXIS] = ry; + destination[E_AXIS] += e_delta; + + G26_line_to_destination(feed_value); + set_destination_from_current(); } -FORCE_INLINE void move_to(const xyz_pos_t &where, const float &de) { move_to(where.x, where.y, where.z, de); } +FORCE_INLINE void move_to(const float (&where)[XYZE], const float &de) { move_to(where[X_AXIS], where[Y_AXIS], where[Z_AXIS], de); } -void retract_filament(const xyz_pos_t &where) { +void retract_filament(const float (&where)[XYZE]) { if (!g26_retracted) { // Only retract if we are not already retracted! g26_retracted = true; - move_to(where, -1.0f * g26_retraction_multiplier); + move_to(where, -1.0 * g26_retraction_multiplier); } } -// TODO: Parameterize the Z lift with a define -void retract_lift_move(const xyz_pos_t &s) { - retract_filament(destination); - move_to(current_position.x, current_position.y, current_position.z + 0.5f, 0.0); // Z lift to minimize scraping - move_to(s.x, s.y, s.z + 0.5f, 0.0); // Get to the starting point with no extrusion while lifted -} - -void recover_filament(const xyz_pos_t &where) { +void recover_filament(const float (&where)[XYZE]) { if (g26_retracted) { // Only un-retract if we are retracted. - move_to(where, 1.2f * g26_retraction_multiplier); + move_to(where, 1.2 * g26_retraction_multiplier); g26_retracted = false; } } @@ -270,76 +288,117 @@ void recover_filament(const xyz_pos_t &where) { * segment of a 'circle'. The time this requires is very short and is easily saved by the other * cases where the optimization comes into play. */ -void print_line_from_here_to_there(const xyz_pos_t &s, const xyz_pos_t &e) { +void print_line_from_here_to_there(const float &sx, const float &sy, const float &sz, const float &ex, const float &ey, const float &ez) { + const float dx_s = current_position[X_AXIS] - sx, // find our distance from the start of the actual line segment + dy_s = current_position[Y_AXIS] - sy, + dist_start = HYPOT2(dx_s, dy_s), // We don't need to do a sqrt(), we can compare the distance^2 + // to save computation time + dx_e = current_position[X_AXIS] - ex, // find our distance from the end of the actual line segment + dy_e = current_position[Y_AXIS] - ey, + dist_end = HYPOT2(dx_e, dy_e), - // Distances to the start / end of the line - xy_float_t svec = current_position - s, evec = current_position - e; - - const float dist_start = HYPOT2(svec.x, svec.y), - dist_end = HYPOT2(evec.x, evec.y), - line_length = HYPOT(e.x - s.x, e.y - s.y); + line_length = HYPOT(ex - sx, ey - sy); // If the end point of the line is closer to the nozzle, flip the direction, // moving from the end to the start. On very small lines the optimization isn't worth it. if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) - return print_line_from_here_to_there(e, s); + return print_line_from_here_to_there(ex, ey, ez, sx, sy, sz); - // Decide whether to retract & lift - if (dist_start > 2.0) retract_lift_move(s); + // Decide whether to retract & bump - move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift + if (dist_start > 2.0) { + retract_filament(destination); + //todo: parameterize the bump height with a define + move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + 0.500, 0.0); // Z bump to minimize scraping + move_to(sx, sy, sz + 0.500, 0.0); // Get to the starting point with no extrusion while bumped + } + + move_to(sx, sy, sz, 0.0); // Get to the starting point with no extrusion / un-Z bump const float e_pos_delta = line_length * g26_e_axis_feedrate * g26_extrusion_multiplier; recover_filament(destination); - move_to(e, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion + move_to(ex, ey, ez, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion } inline bool look_for_lines_to_connect() { - xyz_pos_t s, e; - s.z = e.z = g26_layer_height; + float sx, sy, ex, ey; - GRID_LOOP(i, j) { + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++) { - if (TERN0(HAS_LCD_MENU, user_canceled())) return true; + #if ENABLED(ULTIPANEL) + if (user_canceled()) return true; // Check if the user wants to stop the Mesh Validation + #endif - if (i < (GRID_MAX_POINTS_X)) { // Can't connect to anything farther to the right than GRID_MAX_POINTS_X. - // Already a half circle at the edge of the bed. + if (i < GRID_MAX_POINTS_X) { // We can't connect to anything to the right than GRID_MAX_POINTS_X. + // This is already a half circle because we are at the edge of the bed. - if (circle_flags.marked(i, j) && circle_flags.marked(i + 1, j)) { // Test whether a leftward line can be done - if (!horizontal_mesh_line_flags.marked(i, j)) { - // Two circles need a horizontal line to connect them - s.x = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge - e.x = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge + if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i + 1, j)) { // check if we can do a line to the left + if (!is_bitmap_set(horizontal_mesh_line_flags, i, j)) { - LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); - s.y = e.y = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); + // + // We found two circles that need a horizontal line to connect them + // Print it! + // + sx = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge + ex = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge - if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) - print_line_from_here_to_there(s, e); + sx = constrain(sx, X_MIN_POS + 1, X_MAX_POS - 1); + sy = ey = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); + ex = constrain(ex, X_MIN_POS + 1, X_MAX_POS - 1); - horizontal_mesh_line_flags.mark(i, j); // Mark done, even if skipped + if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) { + + if (g26_debug_flag) { + SERIAL_ECHOPAIR(" Connecting with horizontal line (sx=", sx); + SERIAL_ECHOPAIR(", sy=", sy); + SERIAL_ECHOPAIR(") -> (ex=", ex); + SERIAL_ECHOPAIR(", ey=", ey); + SERIAL_CHAR(')'); + SERIAL_EOL(); + //debug_current_and_destination(PSTR("Connecting horizontal line.")); + } + print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height); + } + bitmap_set(horizontal_mesh_line_flags, i, j); // Mark it as done so we don't do it again, even if we skipped it + } } - } - if (j < (GRID_MAX_POINTS_Y)) { // Can't connect to anything further back than GRID_MAX_POINTS_Y. - // Already a half circle at the edge of the bed. + if (j < GRID_MAX_POINTS_Y) { // We can't connect to anything further back than GRID_MAX_POINTS_Y. + // This is already a half circle because we are at the edge of the bed. - if (circle_flags.marked(i, j) && circle_flags.marked(i, j + 1)) { // Test whether a downward line can be done - if (!vertical_mesh_line_flags.marked(i, j)) { - // Two circles that need a vertical line to connect them - s.y = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge - e.y = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge + if (is_bitmap_set(circle_flags, i, j) && is_bitmap_set(circle_flags, i, j + 1)) { // check if we can do a line straight down + if (!is_bitmap_set( vertical_mesh_line_flags, i, j)) { + // + // We found two circles that need a vertical line to connect them + // Print it! + // + sy = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge + ey = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge - s.x = e.x = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); - LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + sx = ex = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); + sy = constrain(sy, Y_MIN_POS + 1, Y_MAX_POS - 1); + ey = constrain(ey, Y_MIN_POS + 1, Y_MAX_POS - 1); - if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) - print_line_from_here_to_there(s, e); + if (position_is_reachable(sx, sy) && position_is_reachable(ex, ey)) { - vertical_mesh_line_flags.mark(i, j); // Mark done, even if skipped + if (g26_debug_flag) { + SERIAL_ECHOPAIR(" Connecting with vertical line (sx=", sx); + SERIAL_ECHOPAIR(", sy=", sy); + SERIAL_ECHOPAIR(") -> (ex=", ex); + SERIAL_ECHOPAIR(", ey=", ey); + SERIAL_CHAR(')'); + SERIAL_EOL(); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + debug_current_and_destination(PSTR("Connecting vertical line.")); + #endif + } + print_line_from_here_to_there(sx, sy, g26_layer_height, ex, ey, g26_layer_height); + } + bitmap_set(vertical_mesh_line_flags, i, j); // Mark it as done so we don't do it again, even if skipped + } } } } @@ -353,47 +412,58 @@ inline bool look_for_lines_to_connect() { * wait for them to get up to temperature. */ inline bool turn_on_heaters() { - - SERIAL_ECHOLNPGM("Waiting for heatup."); - + millis_t next = millis() + 5000UL; #if HAS_HEATED_BED - - if (g26_bed_temp > 25) { - #if HAS_WIRED_LCD - ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99); - ui.quick_feedback(); - TERN_(HAS_LCD_MENU, ui.capture()); - #endif - thermalManager.setTargetBed(g26_bed_temp); - - // Wait for the temperature to stabilize - if (!thermalManager.wait_for_bed(true - #if G26_CLICK_CAN_CANCEL - , true - #endif - ) - ) return G26_ERR; - } - - #endif // HAS_HEATED_BED - - // Start heating the active nozzle - #if HAS_WIRED_LCD - ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99); - ui.quick_feedback(); - #endif - thermalManager.setTargetHotend(g26_hotend_temp, active_extruder); - - // Wait for the temperature to stabilize - if (!thermalManager.wait_for_hotend(active_extruder, true - #if G26_CLICK_CAN_CANCEL - , true + #if ENABLED(ULTRA_LCD) + if (g26_bed_temp > 25) { + lcd_setstatusPGM(PSTR("G26 Heating Bed."), 99); + lcd_quick_feedback(true); + #if ENABLED(ULTIPANEL) + lcd_external_control = true; + #endif #endif - )) return G26_ERR; + thermalManager.setTargetBed(g26_bed_temp); + while (ABS(thermalManager.degBed() - g26_bed_temp) > 3) { - #if HAS_WIRED_LCD - ui.reset_status(); - ui.quick_feedback(); + #if ENABLED(ULTIPANEL) + if (is_lcd_clicked()) return exit_from_g26(); + #endif + + if (ELAPSED(millis(), next)) { + next = millis() + 5000UL; + thermalManager.print_heaterstates(); + SERIAL_EOL(); + } + idle(); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } + #if ENABLED(ULTRA_LCD) + } + lcd_setstatusPGM(PSTR("G26 Heating Nozzle."), 99); + lcd_quick_feedback(true); + #endif + #endif + + // Start heating the nozzle and wait for it to reach temperature. + thermalManager.setTargetHotend(g26_hotend_temp, 0); + while (ABS(thermalManager.degHotend(0) - g26_hotend_temp) > 3) { + + #if ENABLED(ULTIPANEL) + if (is_lcd_clicked()) return exit_from_g26(); + #endif + + if (ELAPSED(millis(), next)) { + next = millis() + 5000UL; + thermalManager.print_heaterstates(); + SERIAL_EOL(); + } + idle(); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } + + #if ENABLED(ULTRA_LCD) + lcd_reset_status(); + lcd_quick_feedback(true); #endif return G26_OK; @@ -404,62 +474,63 @@ inline bool turn_on_heaters() { */ inline bool prime_nozzle() { - const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f; - #if HAS_LCD_MENU && !HAS_TOUCH_XPT2046 // ui.button_pressed issue with touchscreen - #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - float Total_Prime = 0.0; - #endif + #if ENABLED(ULTIPANEL) + float Total_Prime = 0.0; if (g26_prime_flag == -1) { // The user wants to control how much filament gets purged - ui.capture(); - ui.set_status_P(GET_TEXT(MSG_G26_MANUAL_PRIME), 99); - ui.chirp(); - destination = current_position; + lcd_external_control = true; + lcd_setstatusPGM(PSTR("User-Controlled Prime"), 99); + lcd_chirp(); + + set_destination_from_current(); recover_filament(destination); // Make sure G26 doesn't think the filament is retracted(). - while (!ui.button_pressed()) { - ui.chirp(); - destination.e += 0.25; - #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + while (!is_lcd_clicked()) { + lcd_chirp(); + destination[E_AXIS] += 0.25; + #ifdef PREVENT_LENGTHY_EXTRUDE Total_Prime += 0.25; - if (Total_Prime >= EXTRUDE_MAXLENGTH) { - ui.release(); - return G26_ERR; - } + if (Total_Prime >= EXTRUDE_MAXLENGTH) return G26_ERR; #endif - prepare_internal_move_to_destination(fr_slow_e); - destination = current_position; + G26_line_to_destination(planner.max_feedrate_mm_s[E_AXIS] / 15.0); + set_destination_from_current(); planner.synchronize(); // Without this synchronize, the purge is more consistent, // but because the planner has a buffer, we won't be able // to stop as quickly. So we put up with the less smooth // action to give the user a more responsive 'Stop'. } - ui.wait_for_release(); + wait_for_release(); - ui.set_status_P(GET_TEXT(MSG_G26_PRIME_DONE), 99); - ui.quick_feedback(); - ui.release(); + lcd_setstatusPGM(PSTR("Done Priming"), 99); + lcd_quick_feedback(true); + lcd_external_control = false; } else #endif { - #if HAS_WIRED_LCD - ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99); - ui.quick_feedback(); + #if ENABLED(ULTRA_LCD) + lcd_setstatusPGM(PSTR("Fixed Length Prime."), 99); + lcd_quick_feedback(true); #endif - destination = current_position; - destination.e += g26_prime_length; - prepare_internal_move_to_destination(fr_slow_e); - destination.e -= g26_prime_length; + set_destination_from_current(); + destination[E_AXIS] += g26_prime_length; + G26_line_to_destination(planner.max_feedrate_mm_s[E_AXIS] / 15.0); + set_destination_from_current(); retract_filament(destination); } return G26_OK; } +float valid_trig_angle(float d) { + while (d > 360.0) d -= 360.0; + while (d < 0.0) d += 360.0; + return d; +} + /** * G26: Mesh Validation Pattern generation. * @@ -480,23 +551,19 @@ inline bool prime_nozzle() { * Q Retraction multiplier * R Repetitions (number of grid points) * S Nozzle Size (diameter) in mm - * T Tool index to change to, if included * U Random deviation (50 if no value given) * X X position * Y Y position */ void GcodeSuite::G26() { - SERIAL_ECHOLNPGM("G26 starting..."); + SERIAL_ECHOLNPGM("G26 command started. Waiting for heater(s)."); // Don't allow Mesh Validation without homing first, // or if the parameter parsing did not go OK, abort - if (homing_needed_error()) return; - - // Change the tool first, if specified - if (parser.seenval('T')) tool_change(parser.value_int()); + if (axis_unhomed_error()) return; g26_extrusion_multiplier = EXTRUSION_MULTIPLIER; - g26_retraction_multiplier = G26_RETRACT_MULTIPLIER; + g26_retraction_multiplier = RETRACTION_MULTIPLIER; g26_layer_height = MESH_TEST_LAYER_HEIGHT; g26_prime_length = PRIME_LENGTH; g26_bed_temp = MESH_TEST_BED_TEMP; @@ -510,38 +577,18 @@ void GcodeSuite::G26() { bool g26_continue_with_closest = parser.boolval('C'), g26_keep_heaters_on = parser.boolval('K'); - // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT - const uint8_t preset_index = parser.seenval('I') ? _MIN(parser.value_byte(), PREHEAT_COUNT - 1) + 1 : 0; - #endif - - #if HAS_HEATED_BED - - // Get a temperature from 'I' or 'B' - int16_t bedtemp = 0; - - // Use the 'I' index if temperature presets are defined - #if PREHEAT_COUNT - if (preset_index) bedtemp = ui.material_preset[preset_index - 1].bed_temp; - #endif - - // Look for 'B' Bed Temperature - if (parser.seenval('B')) bedtemp = parser.value_celsius(); - - if (bedtemp) { - if (!WITHIN(bedtemp, 40, BED_MAX_TARGET)) { - SERIAL_ECHOLNPAIR("?Specified bed temperature not plausible (40-", int(BED_MAX_TARGET), "C)."); - return; - } - g26_bed_temp = bedtemp; + if (parser.seenval('B')) { + g26_bed_temp = parser.value_celsius(); + if (g26_bed_temp && !WITHIN(g26_bed_temp, 40, 140)) { + SERIAL_PROTOCOLLNPGM("?Specified bed temperature not plausible (40-140C)."); + return; } - - #endif // HAS_HEATED_BED + } if (parser.seenval('L')) { g26_layer_height = parser.value_linear_units(); if (!WITHIN(g26_layer_height, 0.0, 2.0)) { - SERIAL_ECHOLNPGM("?Specified layer height not plausible."); + SERIAL_PROTOCOLLNPGM("?Specified layer height not plausible."); return; } } @@ -550,30 +597,30 @@ void GcodeSuite::G26() { if (parser.has_value()) { g26_retraction_multiplier = parser.value_float(); if (!WITHIN(g26_retraction_multiplier, 0.05, 15.0)) { - SERIAL_ECHOLNPGM("?Specified Retraction Multiplier not plausible."); + SERIAL_PROTOCOLLNPGM("?Specified Retraction Multiplier not plausible."); return; } } else { - SERIAL_ECHOLNPGM("?Retraction Multiplier must be specified."); + SERIAL_PROTOCOLLNPGM("?Retraction Multiplier must be specified."); return; } } if (parser.seenval('S')) { g26_nozzle = parser.value_float(); - if (!WITHIN(g26_nozzle, 0.1, 2.0)) { - SERIAL_ECHOLNPGM("?Specified nozzle size not plausible."); + if (!WITHIN(g26_nozzle, 0.1, 1.0)) { + SERIAL_PROTOCOLLNPGM("?Specified nozzle size not plausible."); return; } } if (parser.seen('P')) { if (!parser.has_value()) { - #if HAS_LCD_MENU + #if ENABLED(ULTIPANEL) g26_prime_flag = -1; #else - SERIAL_ECHOLNPGM("?Prime length must be specified when not using an LCD."); + SERIAL_PROTOCOLLNPGM("?Prime length must be specified when not using an LCD."); return; #endif } @@ -581,7 +628,7 @@ void GcodeSuite::G26() { g26_prime_flag++; g26_prime_length = parser.value_linear_units(); if (!WITHIN(g26_prime_length, 0.0, 25.0)) { - SERIAL_ECHOLNPGM("?Specified prime length not plausible."); + SERIAL_PROTOCOLLNPGM("?Specified prime length not plausible."); return; } } @@ -590,7 +637,7 @@ void GcodeSuite::G26() { if (parser.seenval('F')) { g26_filament_diameter = parser.value_linear_units(); if (!WITHIN(g26_filament_diameter, 1.0, 4.0)) { - SERIAL_ECHOLNPGM("?Specified filament size not plausible."); + SERIAL_PROTOCOLLNPGM("?Specified filament size not plausible."); return; } } @@ -600,55 +647,40 @@ void GcodeSuite::G26() { g26_extrusion_multiplier *= g26_filament_diameter * sq(g26_nozzle) / sq(0.3); // Scale up by nozzle size - // Get a temperature from 'I' or 'H' - int16_t noztemp = 0; - - // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT - if (preset_index) noztemp = ui.material_preset[preset_index - 1].hotend_temp; - #endif - - // Look for 'H' Hotend Temperature - if (parser.seenval('H')) noztemp = parser.value_celsius(); - - // If any preset or temperature was specified - if (noztemp) { - if (!WITHIN(noztemp, 165, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT))) { - SERIAL_ECHOLNPGM("?Specified nozzle temperature not plausible."); + if (parser.seenval('H')) { + g26_hotend_temp = parser.value_celsius(); + if (!WITHIN(g26_hotend_temp, 165, 280)) { + SERIAL_PROTOCOLLNPGM("?Specified nozzle temperature not plausible."); return; } - g26_hotend_temp = noztemp; } - // 'U' to Randomize and optionally set circle deviation if (parser.seen('U')) { randomSeed(millis()); // This setting will persist for the next G26 - g26_random_deviation = parser.has_value() ? parser.value_float() : 50.0; + random_deviation = parser.has_value() ? parser.value_float() : 50.0; } - // Get repeat from 'R', otherwise do one full circuit int16_t g26_repeats; - #if HAS_LCD_MENU + #if ENABLED(ULTIPANEL) g26_repeats = parser.intval('R', GRID_MAX_POINTS + 1); #else if (!parser.seen('R')) { - SERIAL_ECHOLNPGM("?(R)epeat must be specified when not using an LCD."); + SERIAL_PROTOCOLLNPGM("?(R)epeat must be specified when not using an LCD."); return; } else g26_repeats = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS + 1; #endif if (g26_repeats < 1) { - SERIAL_ECHOLNPGM("?(R)epeat value not plausible; must be at least 1."); + SERIAL_PROTOCOLLNPGM("?(R)epeat value not plausible; must be at least 1."); return; } - // Set a position with 'X' and/or 'Y'. Default: current_position - g26_xy_pos.set(parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position.x, - parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position.y); - if (!position_is_reachable(g26_xy_pos)) { - SERIAL_ECHOLNPGM("?Specified X,Y coordinate out of bounds."); + g26_x_pos = parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position[X_AXIS]; + g26_y_pos = parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position[Y_AXIS]; + if (!position_is_reachable(g26_x_pos, g26_y_pos)) { + SERIAL_PROTOCOLLNPGM("?Specified X,Y coordinate out of bounds."); return; } @@ -657,17 +689,14 @@ void GcodeSuite::G26() { */ set_bed_leveling_enabled(!parser.seen('D')); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - - #if DISABLED(NO_VOLUMETRICS) - bool volumetric_was_enabled = parser.volumetric_enabled; - parser.volumetric_enabled = false; - planner.calculate_volumetric_multipliers(); - #endif + if (current_position[Z_AXIS] < Z_CLEARANCE_BETWEEN_PROBES) { + do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); + set_current_from_destination(); + } if (turn_on_heaters() != G26_OK) goto LEAVE; - current_position.e = 0.0; + current_position[E_AXIS] = 0.0; sync_plan_position_e(); if (g26_prime_flag && prime_nozzle() != G26_OK) goto LEAVE; @@ -682,17 +711,21 @@ void GcodeSuite::G26() { * It's "Show Time" !!! */ - circle_flags.reset(); - horizontal_mesh_line_flags.reset(); - vertical_mesh_line_flags.reset(); + ZERO(circle_flags); + ZERO(horizontal_mesh_line_flags); + ZERO(vertical_mesh_line_flags); // Move nozzle to the specified height for the first layer - destination = current_position; - destination.z = g26_layer_height; + set_destination_from_current(); + destination[Z_AXIS] = g26_layer_height; move_to(destination, 0.0); move_to(destination, g26_ooze_amount); - TERN_(HAS_LCD_MENU, ui.capture()); + #if ENABLED(ULTIPANEL) + lcd_external_control = true; + #endif + + //debug_current_and_destination(PSTR("Starting G26 Mesh Validation Pattern.")); #if DISABLED(ARC_SUPPORT) @@ -709,90 +742,101 @@ void GcodeSuite::G26() { #error "A_CNT must be a positive value. Please change A_INT." #endif float trig_table[A_CNT]; - LOOP_L_N(i, A_CNT) + for (uint8_t i = 0; i < A_CNT; i++) trig_table[i] = INTERSECTION_CIRCLE_RADIUS * cos(RADIANS(i * A_INT)); #endif // !ARC_SUPPORT mesh_index_pair location; do { - // Find the nearest confluence - location = find_closest_circle_to_print(g26_continue_with_closest ? xy_pos_t(current_position) : g26_xy_pos); + location = g26_continue_with_closest + ? find_closest_circle_to_print(current_position[X_AXIS], current_position[Y_AXIS]) + : find_closest_circle_to_print(g26_x_pos, g26_y_pos); // Find the closest Mesh Intersection to where we are now. - if (location.valid()) { - const xy_pos_t circle = _GET_MESH_POS(location.pos); + if (location.x_index >= 0 && location.y_index >= 0) { + const float circle_x = _GET_MESH_X(location.x_index), + circle_y = _GET_MESH_Y(location.y_index); - // If this mesh location is outside the printable radius, skip it. - if (!position_is_reachable(circle)) continue; + // If this mesh location is outside the printable_radius, skip it. + if (!position_is_reachable(circle_x, circle_y)) continue; // Determine where to start and end the circle, // which is always drawn counter-clockwise. - const xy_int8_t st = location; - const bool f = st.y == 0, - r = st.x >= GRID_MAX_POINTS_X - 1, - b = st.y >= GRID_MAX_POINTS_Y - 1; + const uint8_t xi = location.x_index, yi = location.y_index; + const bool f = yi == 0, r = xi >= GRID_MAX_POINTS_X - 1, b = yi >= GRID_MAX_POINTS_Y - 1; #if ENABLED(ARC_SUPPORT) #define ARC_LENGTH(quarters) (INTERSECTION_CIRCLE_RADIUS * M_PI * (quarters) / 2) - #define INTERSECTION_CIRCLE_DIAM ((INTERSECTION_CIRCLE_RADIUS) * 2) - - xy_float_t e = { circle.x + INTERSECTION_CIRCLE_RADIUS, circle.y }; - xyz_float_t s = e; + float sx = circle_x + INTERSECTION_CIRCLE_RADIUS, // default to full circle + ex = circle_x + INTERSECTION_CIRCLE_RADIUS, + sy = circle_y, ey = circle_y, + arc_length = ARC_LENGTH(4); // Figure out where to start and end the arc - we always print counterclockwise - float arc_length = ARC_LENGTH(4); - if (st.x == 0) { // left edge - if (!f) { s.x = circle.x; s.y -= INTERSECTION_CIRCLE_RADIUS; } - if (!b) { e.x = circle.x; e.y += INTERSECTION_CIRCLE_RADIUS; } + if (xi == 0) { // left edge + sx = f ? circle_x + INTERSECTION_CIRCLE_RADIUS : circle_x; + ex = b ? circle_x + INTERSECTION_CIRCLE_RADIUS : circle_x; + sy = f ? circle_y : circle_y - (INTERSECTION_CIRCLE_RADIUS); + ey = b ? circle_y : circle_y + INTERSECTION_CIRCLE_RADIUS; arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); } else if (r) { // right edge - if (b) s.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); - else s.set(circle.x, circle.y + INTERSECTION_CIRCLE_RADIUS); - if (f) e.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); - else e.set(circle.x, circle.y - (INTERSECTION_CIRCLE_RADIUS)); + sx = b ? circle_x - (INTERSECTION_CIRCLE_RADIUS) : circle_x; + ex = f ? circle_x - (INTERSECTION_CIRCLE_RADIUS) : circle_x; + sy = b ? circle_y : circle_y + INTERSECTION_CIRCLE_RADIUS; + ey = f ? circle_y : circle_y - (INTERSECTION_CIRCLE_RADIUS); arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); } else if (f) { - e.x -= INTERSECTION_CIRCLE_DIAM; + sx = circle_x + INTERSECTION_CIRCLE_RADIUS; + ex = circle_x - (INTERSECTION_CIRCLE_RADIUS); + sy = ey = circle_y; arc_length = ARC_LENGTH(2); } else if (b) { - s.x -= INTERSECTION_CIRCLE_DIAM; + sx = circle_x - (INTERSECTION_CIRCLE_RADIUS); + ex = circle_x + INTERSECTION_CIRCLE_RADIUS; + sy = ey = circle_y; arc_length = ARC_LENGTH(2); } + const float arc_offset[2] = { + circle_x - sx, + circle_y - sy + }; - const ab_float_t arc_offset = circle - s; - const xy_float_t dist = current_position - s; // Distance from the start of the actual circle - const float dist_start = HYPOT2(dist.x, dist.y); - const xyze_pos_t endpoint = { - e.x, e.y, g26_layer_height, - current_position.e + (arc_length * g26_e_axis_feedrate * g26_extrusion_multiplier) + const float dx_s = current_position[X_AXIS] - sx, // find our distance from the start of the actual circle + dy_s = current_position[Y_AXIS] - sy, + dist_start = HYPOT2(dx_s, dy_s); + const float endpoint[XYZE] = { + ex, ey, + g26_layer_height, + current_position[E_AXIS] + (arc_length * g26_e_axis_feedrate * g26_extrusion_multiplier) }; if (dist_start > 2.0) { - s.z = g26_layer_height + 0.5f; - retract_lift_move(s); + retract_filament(destination); + //todo: parameterize the bump height with a define + move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + 0.500, 0.0); // Z bump to minimize scraping + move_to(sx, sy, g26_layer_height + 0.500, 0.0); // Get to the starting point with no extrusion while bumped } - s.z = g26_layer_height; - move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift + move_to(sx, sy, g26_layer_height, 0.0); // Get to the starting point with no extrusion / un-Z bump recover_filament(destination); - - const feedRate_t old_feedrate = feedrate_mm_s; - feedrate_mm_s = PLANNER_XY_FEEDRATE() * 0.1f; + const float save_feedrate = feedrate_mm_s; + feedrate_mm_s = PLANNER_XY_FEEDRATE() / 10.0; plan_arc(endpoint, arc_offset, false); // Draw a counter-clockwise arc - feedrate_mm_s = old_feedrate; - destination = current_position; - - if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; // Check if the user wants to stop the Mesh Validation + feedrate_mm_s = save_feedrate; + set_destination_from_current(); + #if ENABLED(ULTIPANEL) + if (user_canceled()) goto LEAVE; // Check if the user wants to stop the Mesh Validation + #endif #else // !ARC_SUPPORT int8_t start_ind = -2, end_ind = 9; // Assume a full circle (from 5:00 to 5:00) - if (st.x == 0) { // Left edge? Just right half. + if (xi == 0) { // Left edge? Just right half. start_ind = f ? 0 : -3; // 03:00 to 12:00 for front-left end_ind = b ? 0 : 2; // 06:00 to 03:00 for back-left } @@ -811,23 +855,27 @@ void GcodeSuite::G26() { for (int8_t ind = start_ind; ind <= end_ind; ind++) { - if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; // Check if the user wants to stop the Mesh Validation + #if ENABLED(ULTIPANEL) + if (user_canceled()) goto LEAVE; // Check if the user wants to stop the Mesh Validation + #endif - xyz_float_t p = { circle.x + _COS(ind ), circle.y + _SIN(ind ), g26_layer_height }, - q = { circle.x + _COS(ind + 1), circle.y + _SIN(ind + 1), g26_layer_height }; + float rx = circle_x + _COS(ind), // For speed, these are now a lookup table entry + ry = circle_y + _SIN(ind), + xe = circle_x + _COS(ind + 1), + ye = circle_y + _SIN(ind + 1); #if IS_KINEMATIC // Check to make sure this segment is entirely on the bed, skip if not. - if (!position_is_reachable(p) || !position_is_reachable(q)) continue; - #else - LIMIT(p.x, X_MIN_POS + 1, X_MAX_POS - 1); // Prevent hitting the endstops - LIMIT(p.y, Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(q.x, X_MIN_POS + 1, X_MAX_POS - 1); - LIMIT(q.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + if (!position_is_reachable(rx, ry) || !position_is_reachable(xe, ye)) continue; + #else // not, we need to skip + rx = constrain(rx, X_MIN_POS + 1, X_MAX_POS - 1); // This keeps us from bumping the endstops + ry = constrain(ry, Y_MIN_POS + 1, Y_MAX_POS - 1); + xe = constrain(xe, X_MIN_POS + 1, X_MAX_POS - 1); + ye = constrain(ye, Y_MIN_POS + 1, Y_MAX_POS - 1); #endif - print_line_from_here_to_there(p, q); - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + print_line_from_here_to_there(rx, ry, g26_layer_height, xe, ye, g26_layer_height); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } #endif // !ARC_SUPPORT @@ -837,28 +885,34 @@ void GcodeSuite::G26() { SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (--g26_repeats && location.valid()); + } while (--g26_repeats && location.x_index >= 0 && location.y_index >= 0); LEAVE: - ui.set_status_P(GET_TEXT(MSG_G26_LEAVING), -1); + lcd_setstatusPGM(PSTR("Leaving G26"), -1); retract_filament(destination); - destination.z = Z_CLEARANCE_BETWEEN_PROBES; - move_to(destination, 0); // Raise the nozzle + destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES; - destination = g26_xy_pos; // Move back to the starting XY position - move_to(destination, 0); // Move back to the starting position + //debug_current_and_destination(PSTR("ready to do Z-Raise.")); + move_to(destination, 0); // Raise the nozzle + //debug_current_and_destination(PSTR("done doing Z-Raise.")); - #if DISABLED(NO_VOLUMETRICS) - parser.volumetric_enabled = volumetric_was_enabled; - planner.calculate_volumetric_multipliers(); + destination[X_AXIS] = g26_x_pos; // Move back to the starting position + destination[Y_AXIS] = g26_y_pos; + //destination[Z_AXIS] = Z_CLEARANCE_BETWEEN_PROBES; // Keep the nozzle where it is + + move_to(destination, 0); // Move back to the starting position + //debug_current_and_destination(PSTR("done doing X/Y move.")); + + #if ENABLED(ULTIPANEL) + lcd_external_control = false; // Give back control of the LCD Panel! #endif - TERN_(HAS_LCD_MENU, ui.release()); // Give back control of the LCD - if (!g26_keep_heaters_on) { - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(0)); - thermalManager.setTargetHotend(active_extruder, 0); + #if HAS_HEATED_BED + thermalManager.setTargetBed(0); + #endif + thermalManager.setTargetHotend(0, 0); } } diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp deleted file mode 100755 index 0ede4e79c6..0000000000 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(ASSISTED_TRAMMING) - -#include "../gcode.h" -#include "../../module/planner.h" -#include "../../module/probe.h" -#include "../../feature/bedlevel/bedlevel.h" - -#if HAS_MULTI_HOTEND - #include "../../module/tool_change.h" -#endif - -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../../core/debug_out.h" - -constexpr xy_pos_t screws_tilt_adjust_pos[] = TRAMMING_POINT_XY; - -static PGMSTR(point_name_1, TRAMMING_POINT_NAME_1); -static PGMSTR(point_name_2, TRAMMING_POINT_NAME_2); -static PGMSTR(point_name_3, TRAMMING_POINT_NAME_3); -#ifdef TRAMMING_POINT_NAME_4 - static PGMSTR(point_name_4, TRAMMING_POINT_NAME_4); - #ifdef TRAMMING_POINT_NAME_5 - static PGMSTR(point_name_5, TRAMMING_POINT_NAME_5); - #endif -#endif - -static PGM_P const tramming_point_name[] PROGMEM = { - point_name_1, point_name_2, point_name_3 - #ifdef TRAMMING_POINT_NAME_4 - , point_name_4 - #ifdef TRAMMING_POINT_NAME_5 - , point_name_5 - #endif - #endif -}; - -#define G35_PROBE_COUNT COUNT(screws_tilt_adjust_pos) - -#if !WITHIN(TRAMMING_SCREW_THREAD, 30, 51) || TRAMMING_SCREW_THREAD % 10 > 1 - #error "TRAMMING_SCREW_THREAD must be equal to 30, 31, 40, 41, 50, or 51." -#endif - -static_assert(G35_PROBE_COUNT > 2, "TRAMMING_POINT_XY requires at least 3 XY positions."); - -/** - * G35: Read bed corners to help adjust bed screws - * - * S - * - * Screw thread: 30 - Clockwise M3 - * 31 - Counter-Clockwise M3 - * 40 - Clockwise M4 - * 41 - Counter-Clockwise M4 - * 50 - Clockwise M5 - * 51 - Counter-Clockwise M5 - **/ -void GcodeSuite::G35() { - DEBUG_SECTION(log_G35, "G35", DEBUGGING(LEVELING)); - - if (DEBUGGING(LEVELING)) log_machine_info(); - - float z_measured[G35_PROBE_COUNT] = { 0 }; - - const uint8_t screw_thread = parser.byteval('S', TRAMMING_SCREW_THREAD); - if (!WITHIN(screw_thread, 30, 51) || screw_thread % 10 > 1) { - SERIAL_ECHOLNPGM("?(S)crew thread must be 30, 31, 40, 41, 50, or 51."); - return; - } - - // Wait for planner moves to finish! - planner.synchronize(); - - // Disable the leveling matrix before auto-aligning - #if HAS_LEVELING - TERN_(RESTORE_LEVELING_AFTER_G35, const bool leveling_was_active = planner.leveling_active); - set_bed_leveling_enabled(false); - #endif - - #if ENABLED(CNC_WORKSPACE_PLANES) - workspace_plane = PLANE_XY; - #endif - - // Always home with tool 0 active - #if HAS_MULTI_HOTEND - const uint8_t old_tool_index = active_extruder; - tool_change(0, true); - #endif - - #if HAS_DUPLICATION_MODE - extruder_duplication_enabled = false; - #endif - - // Home all before this procedure - home_all_axes(); - - bool err_break = false; - - // Probe all positions - LOOP_L_N(i, G35_PROBE_COUNT) { - - // In BLTOUCH HS mode, the probe travels in a deployed state. - // Users of G35 might have a badly misaligned bed, so raise Z by the - // length of the deployed pin (BLTOUCH stroke < 7mm) - current_position.z = (Z_CLEARANCE_BETWEEN_PROBES) + (7 * ENABLED(BLTOUCH_HS_MODE)); - - const float z_probed_height = probe.probe_at_point(screws_tilt_adjust_pos[i], PROBE_PT_RAISE, 0, true); - - if (isnan(z_probed_height)) { - SERIAL_ECHOPAIR("G35 failed at point ", int(i), " (", tramming_point_name[i], ")"); - SERIAL_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y); - err_break = true; - break; - } - - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("Probing point ", int(i), " (", tramming_point_name[i], ")"); - SERIAL_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y, SP_Z_STR, z_probed_height); - } - - z_measured[i] = z_probed_height; - } - - if (!err_break) { - const float threads_factor[] = { 0.5, 0.7, 0.8 }; - - // Calculate adjusts - LOOP_S_L_N(i, 1, G35_PROBE_COUNT) { - const float diff = z_measured[0] - z_measured[i], - adjust = abs(diff) < 0.001f ? 0 : diff / threads_factor[(screw_thread - 30) / 10]; - - const int full_turns = trunc(adjust); - const float decimal_part = adjust - float(full_turns); - const int minutes = trunc(decimal_part * 60.0f); - - SERIAL_ECHOPAIR("Turn ", tramming_point_name[i], - " ", (screw_thread & 1) == (adjust > 0) ? "CCW" : "CW", - " by ", abs(full_turns), " turns"); - if (minutes) SERIAL_ECHOPAIR(" and ", abs(minutes), " minutes"); - if (ENABLED(REPORT_TRAMMING_MM)) SERIAL_ECHOPAIR(" (", -diff, "mm)"); - SERIAL_EOL(); - } - } - else - SERIAL_ECHOLNPGM("G35 aborted."); - - // Restore the active tool after homing - #if HAS_MULTI_HOTEND - tool_change(old_tool_index, DISABLED(PARKING_EXTRUDER)); // Fetch previous toolhead if not PARKING_EXTRUDER - #endif - - #if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G35) - set_bed_leveling_enabled(leveling_was_active); - #endif - - // Stow the probe, as the last call to probe.probe_at_point(...) left - // the probe deployed if it was successful. - probe.stow(); - - // After this operation the Z position needs correction - set_axis_never_homed(Z_AXIS); - - // Home Z after the alignment procedure - process_subcommands_now_P(PSTR("G28Z")); -} - -#endif // ASSISTED_TRAMMING diff --git a/Marlin/src/gcode/bedlevel/G42.cpp b/Marlin/src/gcode/bedlevel/G42.cpp index a2896ed6c7..727e4cf1da 100644 --- a/Marlin/src/gcode/bedlevel/G42.cpp +++ b/Marlin/src/gcode/bedlevel/G42.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,9 +25,8 @@ #if HAS_MESH #include "../gcode.h" -#include "../../MarlinCore.h" // for IsRunning() +#include "../../Marlin.h" // for IsRunning() #include "../../module/motion.h" -#include "../../module/probe.h" // for probe.offset #include "../../feature/bedlevel/bedlevel.h" /** @@ -41,31 +40,26 @@ void GcodeSuite::G42() { const int8_t iy = hasJ ? parser.value_int() : 0; if ((hasI && !WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) || (hasJ && !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1))) { - SERIAL_ECHOLNPGM(STR_ERR_MESH_XY); + SERIAL_ECHOLNPGM(MSG_ERR_MESH_XY); return; } - // Move to current_position, as modified by I, J, P parameters - destination = current_position; + set_destination_from_current(); + if (hasI) destination[X_AXIS] = _GET_MESH_X(ix); + if (hasJ) destination[Y_AXIS] = _GET_MESH_Y(iy); + if (parser.boolval('P')) { + if (hasI) destination[X_AXIS] -= X_PROBE_OFFSET_FROM_EXTRUDER; + if (hasJ) destination[Y_AXIS] -= Y_PROBE_OFFSET_FROM_EXTRUDER; + } - if (hasI) destination.x = _GET_MESH_X(ix); - if (hasJ) destination.y = _GET_MESH_Y(iy); - - #if HAS_PROBE_XY_OFFSET - if (parser.boolval('P')) { - if (hasI) destination.x -= probe.offset_xy.x; - if (hasJ) destination.y -= probe.offset_xy.y; - } - #endif - - const feedRate_t fval = parser.linearval('F'), - fr_mm_s = MMM_TO_MMS(fval > 0 ? fval : 0.0f); + const float fval = parser.linearval('F'); + if (fval > 0.0) feedrate_mm_s = MMM_TO_MMS(fval); // SCARA kinematic has "safe" XY raw moves #if IS_SCARA - prepare_internal_fast_move_to_destination(fr_mm_s); + prepare_uninterpolated_move_to_destination(); #else - prepare_internal_move_to_destination(fr_mm_s); + prepare_move_to_destination(); #endif } } diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index 96122c18f8..bdf33a0a28 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,14 +27,9 @@ #include "../gcode.h" #include "../../feature/bedlevel/bedlevel.h" #include "../../module/planner.h" -#include "../../module/probe.h" #if ENABLED(EEPROM_SETTINGS) - #include "../../module/settings.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../../lcd/extui/ui_api.h" + #include "../../module/configuration_store.h" #endif //#define M420_C_USE_MEAN @@ -54,42 +49,17 @@ * With mesh-based leveling only: * * C Center mesh on the mean of the lowest and highest - * - * With MARLIN_DEV_MODE: - * S2 Create a simple random mesh and enable */ void GcodeSuite::M420() { - const bool seen_S = parser.seen('S'), - to_enable = seen_S ? parser.value_bool() : planner.leveling_active; - - #if ENABLED(MARLIN_DEV_MODE) - if (parser.intval('S') == 2) { - const float x_min = probe.min_x(), x_max = probe.max_x(), - y_min = probe.min_y(), y_max = probe.max_y(); - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - bilinear_start.set(x_min, y_min); - bilinear_grid_spacing.set((x_max - x_min) / (GRID_MAX_POINTS_X - 1), - (y_max - y_min) / (GRID_MAX_POINTS_Y - 1)); - #endif - GRID_LOOP(x, y) { - Z_VALUES(x, y) = 0.001 * random(-200, 200); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, Z_VALUES(x, y))); - } - SERIAL_ECHOPGM("Simulated " STRINGIFY(GRID_MAX_POINTS_X) "x" STRINGIFY(GRID_MAX_POINTS_Y) " mesh "); - SERIAL_ECHOPAIR(" (", x_min); - SERIAL_CHAR(','); SERIAL_ECHO(y_min); - SERIAL_ECHOPAIR(")-(", x_max); - SERIAL_CHAR(','); SERIAL_ECHO(y_max); - SERIAL_ECHOLNPGM(")"); - } - #endif - - xyz_pos_t oldpos = current_position; + const bool seen_S = parser.seen('S'); + bool to_enable = seen_S ? parser.value_bool() : planner.leveling_active; // If disabling leveling do it right away // (Don't disable for just M420 or M420 V) if (seen_S && !to_enable) set_bed_leveling_enabled(false); + const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + #if ENABLED(AUTO_BED_LEVELING_UBL) // L to load a mesh from the EEPROM @@ -102,13 +72,13 @@ void GcodeSuite::M420() { const int16_t a = settings.calc_num_meshes(); if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); + SERIAL_PROTOCOLLNPGM("?EEPROM storage not available."); return; } if (!WITHIN(storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPGM("?Invalid storage slot."); - SERIAL_ECHOLNPAIR("?Use 0 to ", a - 1); + SERIAL_PROTOCOLLNPGM("?Invalid storage slot."); + SERIAL_PROTOCOLLNPAIR("?Use 0 to ", a - 1); return; } @@ -117,14 +87,14 @@ void GcodeSuite::M420() { #else - SERIAL_ECHOLNPGM("?EEPROM storage not available."); + SERIAL_PROTOCOLLNPGM("?EEPROM storage not available."); return; #endif } // L or V display the map info - if (parser.seen("LV")) { + if (parser.seen('L') || parser.seen('V')) { ubl.display_map(parser.byteval('T')); SERIAL_ECHOPGM("Mesh is "); if (!ubl.mesh_is_valid()) SERIAL_ECHOPGM("in"); @@ -133,74 +103,76 @@ void GcodeSuite::M420() { #endif // AUTO_BED_LEVELING_UBL - const bool seenV = parser.seen('V'); - #if HAS_MESH - if (leveling_is_valid()) { + #if ENABLED(MESH_BED_LEVELING) + #define Z_VALUES(X,Y) mbl.z_values[X][Y] + #else + #define Z_VALUES(X,Y) z_values[X][Y] + #endif - // Subtract the given value or the mean from all mesh values - if (parser.seen('C')) { - const float cval = parser.value_float(); - #if ENABLED(AUTO_BED_LEVELING_UBL) + // Subtract the given value or the mean from all mesh values + if (leveling_is_valid() && parser.seen('C')) { + const float cval = parser.value_float(); + #if ENABLED(AUTO_BED_LEVELING_UBL) - set_bed_leveling_enabled(false); - ubl.adjust_mesh_to_mean(true, cval); + set_bed_leveling_enabled(false); + ubl.adjust_mesh_to_mean(true, cval); + + #else + + #if ENABLED(M420_C_USE_MEAN) + + // Get the sum and average of all mesh values + float mesh_sum = 0; + for (uint8_t x = GRID_MAX_POINTS_X; x--;) + for (uint8_t y = GRID_MAX_POINTS_Y; y--;) + mesh_sum += Z_VALUES(x, y); + const float zmean = mesh_sum / float(GRID_MAX_POINTS); #else - #if ENABLED(M420_C_USE_MEAN) - - // Get the sum and average of all mesh values - float mesh_sum = 0; - GRID_LOOP(x, y) mesh_sum += Z_VALUES(x, y); - const float zmean = mesh_sum / float(GRID_MAX_POINTS); - - #else - - // Find the low and high mesh values - float lo_val = 100, hi_val = -100; - GRID_LOOP(x, y) { + // Find the low and high mesh values + float lo_val = 100, hi_val = -100; + for (uint8_t x = GRID_MAX_POINTS_X; x--;) + for (uint8_t y = GRID_MAX_POINTS_Y; y--;) { const float z = Z_VALUES(x, y); NOMORE(lo_val, z); NOLESS(hi_val, z); } - // Take the mean of the lowest and highest - const float zmean = (lo_val + hi_val) / 2.0 + cval; - - #endif - - // If not very close to 0, adjust the mesh - if (!NEAR_ZERO(zmean)) { - set_bed_leveling_enabled(false); - // Subtract the mean from all values - GRID_LOOP(x, y) { - Z_VALUES(x, y) -= zmean; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, Z_VALUES(x, y))); - } - TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); - } + // Take the mean of the lowest and highest + const float zmean = (lo_val + hi_val) / 2.0 + cval; #endif - } - } - else if (to_enable || seenV) { - SERIAL_ECHO_MSG("Invalid mesh."); - goto EXIT_M420; + // If not very close to 0, adjust the mesh + if (!NEAR_ZERO(zmean)) { + set_bed_leveling_enabled(false); + // Subtract the mean from all values + for (uint8_t x = GRID_MAX_POINTS_X; x--;) + for (uint8_t y = GRID_MAX_POINTS_Y; y--;) + Z_VALUES(x, y) -= zmean; + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + bed_level_virt_interpolate(); + #endif + } + + #endif } #endif // HAS_MESH // V to print the matrix or mesh - if (seenV) { + if (parser.seen('V')) { #if ABL_PLANAR planner.bed_level_matrix.debug(PSTR("Bed Level Correction Matrix:")); #else if (leveling_is_valid()) { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) print_bilinear_leveling_grid(); - TERN_(ABL_BILINEAR_SUBDIVISION, print_bilinear_leveling_grid_virt()); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + print_bilinear_leveling_grid_virt(); + #endif #elif ENABLED(MESH_BED_LEVELING) SERIAL_ECHOLNPGM("Mesh Bed Level data:"); mbl.report_mesh(); @@ -216,17 +188,14 @@ void GcodeSuite::M420() { // Enable leveling if specified, or if previously active set_bed_leveling_enabled(to_enable); - #if HAS_MESH - EXIT_M420: - #endif - // Error if leveling failed to enable or reenable - if (to_enable && !planner.leveling_active) - SERIAL_ERROR_MSG(STR_ERR_M420_FAILED); + if (to_enable && !planner.leveling_active) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M420_FAILED); + } SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Bed Leveling "); - serialprintln_onoff(planner.leveling_active); + SERIAL_ECHOLNPAIR("Bed Leveling ", planner.leveling_active ? MSG_ON : MSG_OFF); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) SERIAL_ECHO_START(); @@ -234,11 +203,11 @@ void GcodeSuite::M420() { if (planner.z_fade_height > 0.0) SERIAL_ECHOLN(planner.z_fade_height); else - SERIAL_ECHOLNPGM(STR_OFF); + SERIAL_ECHOLNPGM(MSG_OFF); #endif // Report change in position - if (oldpos != current_position) + if (memcmp(oldpos, current_position, sizeof(oldpos))) report_current_position(); } diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index f7de6c8cee..c711b9deed 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -26,7 +26,7 @@ #include "../../../inc/MarlinConfig.h" -#if HAS_ABL_NOT_UBL +#if OLDSCHOOL_ABL #include "../../gcode.h" #include "../../../feature/bedlevel/bedlevel.h" @@ -36,12 +36,7 @@ #include "../../../module/probe.h" #include "../../queue.h" -#if ENABLED(PROBE_TEMP_COMPENSATION) - #include "../../../feature/probe_temp_comp.h" - #include "../../../module/temperature.h" -#endif - -#if HAS_DISPLAY +#if ENABLED(LCD_BED_LEVELING) && ENABLED(PROBE_MANUALLY) #include "../../../lcd/ultralcd.h" #endif @@ -53,36 +48,25 @@ #include "../../../libs/vector_3.h" #endif -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../../../core/debug_out.h" - -#if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" -#endif - -#if ENABLED(DWIN_CREALITY_LCD) - #include "../../../lcd/dwin/e3v2/dwin.h" -#endif - -#if HAS_MULTI_HOTEND - #include "../../../module/tool_change.h" -#endif - #if ABL_GRID #if ENABLED(PROBE_Y_FIRST) - #define PR_OUTER_VAR meshCount.x - #define PR_OUTER_END abl_grid_points.x - #define PR_INNER_VAR meshCount.y - #define PR_INNER_END abl_grid_points.y + #define PR_OUTER_VAR xCount + #define PR_OUTER_END abl_grid_points_x + #define PR_INNER_VAR yCount + #define PR_INNER_END abl_grid_points_y #else - #define PR_OUTER_VAR meshCount.y - #define PR_OUTER_END abl_grid_points.y - #define PR_INNER_VAR meshCount.x - #define PR_INNER_END abl_grid_points.x + #define PR_OUTER_VAR yCount + #define PR_OUTER_END abl_grid_points_y + #define PR_INNER_VAR xCount + #define PR_INNER_END abl_grid_points_x #endif #endif -#define G29_RETURN(b) return TERN_(G29_RETRY_AND_RECOVER, b) +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_RETURN(b) return b; +#else + #define G29_RETURN(b) return; +#endif /** * G29: Detailed Z probe, probes the bed at 3 or more points. @@ -119,10 +103,6 @@ * * S Set the XY travel speed between probe points (in units/min) * - * H Set bounds to a centered square H x H units in size - * - * -or- - * * F Set the Front limit of the probing grid * B Set the Back limit of the probing grid * L Set the Left limit of the probing grid @@ -160,66 +140,99 @@ * E By default G29 will engage the Z probe, test the bed, then disengage. * Include "E" to engage/disengage the Z probe for each sample. * There's no extra effect if you have a fixed Z probe. + * */ G29_TYPE GcodeSuite::G29() { - reset_stepper_timeout(); - - const bool seenQ = EITHER(DEBUG_LEVELING_FEATURE, PROBE_MANUALLY) && parser.seen('Q'); + #if ENABLED(DEBUG_LEVELING_FEATURE) || ENABLED(PROBE_MANUALLY) + const bool seenQ = parser.seen('Q'); + #else + constexpr bool seenQ = false; + #endif // G29 Q is also available if debugging #if ENABLED(DEBUG_LEVELING_FEATURE) const uint8_t old_debug_flags = marlin_debug_flags; - if (seenQ) marlin_debug_flags |= MARLIN_DEBUG_LEVELING; - DEBUG_SECTION(log_G29, "G29", DEBUGGING(LEVELING)); - if (DEBUGGING(LEVELING)) log_machine_info(); + if (seenQ) marlin_debug_flags |= DEBUG_LEVELING; + if (DEBUGGING(LEVELING)) { + DEBUG_POS(">>> G29", current_position); + log_machine_info(); + } marlin_debug_flags = old_debug_flags; - if (DISABLED(PROBE_MANUALLY) && seenQ) G29_RETURN(false); + #if DISABLED(PROBE_MANUALLY) + if (seenQ) G29_RETURN(false); + #endif #endif - const bool seenA = TERN0(PROBE_MANUALLY, parser.seen('A')), - no_action = seenA || seenQ, - faux = ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) ? parser.boolval('C') : no_action; + #if ENABLED(PROBE_MANUALLY) + const bool seenA = parser.seen('A'); + #else + constexpr bool seenA = false; + #endif + + const bool no_action = seenA || seenQ, + faux = + #if ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) + parser.boolval('C') + #else + no_action + #endif + ; // Don't allow auto-leveling without homing first - if (homing_needed_error()) G29_RETURN(false); + if (axis_unhomed_error()) G29_RETURN(false); if (!no_action && planner.leveling_active && parser.boolval('O')) { // Auto-level only if needed - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> Auto-level not needed, skip"); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("> Auto-level not needed, skip"); + SERIAL_ECHOLNPGM("<<< G29"); + } + #endif G29_RETURN(false); } // Define local vars 'static' for manual probing, 'auto' otherwise - #define ABL_VAR TERN_(PROBE_MANUALLY, static) + #if ENABLED(PROBE_MANUALLY) + #define ABL_VAR static + #else + #define ABL_VAR + #endif ABL_VAR int verbose_level; - ABL_VAR xy_pos_t probePos; - ABL_VAR float measured_z; + ABL_VAR float xProbe, yProbe, measured_z; ABL_VAR bool dryrun, abl_should_enable; - #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) + #if ENABLED(PROBE_MANUALLY) || ENABLED(AUTO_BED_LEVELING_LINEAR) ABL_VAR int abl_probe_index; #endif + #if HAS_SOFTWARE_ENDSTOPS && ENABLED(PROBE_MANUALLY) + ABL_VAR bool enable_soft_endstops = true; + #endif + #if ABL_GRID #if ENABLED(PROBE_MANUALLY) - ABL_VAR xy_int8_t meshCount; + ABL_VAR uint8_t PR_OUTER_VAR; + ABL_VAR int8_t PR_INNER_VAR; #endif - ABL_VAR xy_pos_t probe_position_lf, probe_position_rb; - ABL_VAR xy_float_t gridSpacing = { 0, 0 }; + ABL_VAR int left_probe_bed_position, right_probe_bed_position, front_probe_bed_position, back_probe_bed_position; + ABL_VAR float xGridSpacing = 0, yGridSpacing = 0; #if ENABLED(AUTO_BED_LEVELING_LINEAR) + ABL_VAR uint8_t abl_grid_points_x = GRID_MAX_POINTS_X, + abl_grid_points_y = GRID_MAX_POINTS_Y; ABL_VAR bool do_topography_map; - ABL_VAR xy_uint8_t abl_grid_points; #else // Bilinear - constexpr xy_uint8_t abl_grid_points = { GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y }; + uint8_t constexpr abl_grid_points_x = GRID_MAX_POINTS_X, + abl_grid_points_y = GRID_MAX_POINTS_Y; #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) ABL_VAR int abl_points; - #else + #elif ENABLED(PROBE_MANUALLY) // Bilinear int constexpr abl_points = GRID_MAX_POINTS; #endif @@ -231,8 +244,8 @@ G29_TYPE GcodeSuite::G29() { ABL_VAR int indexIntoAB[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - ABL_VAR float eqnAMatrix[(GRID_MAX_POINTS) * 3], // "A" matrix of the linear system of equations - eqnBVector[GRID_MAX_POINTS], // "B" vector of Z points + ABL_VAR float eqnAMatrix[GRID_MAX_POINTS * 3], // "A" matrix of the linear system of equations + eqnBVector[GRID_MAX_POINTS], // "B" vector of Z points mean; #endif @@ -242,8 +255,12 @@ G29_TYPE GcodeSuite::G29() { int constexpr abl_points = 3; // used to show total points #endif - vector_3 points[3]; - probe.get_three_points(points); + // Probe at 3 arbitrary points + ABL_VAR vector_3 points[3] = { + vector_3(PROBE_PT_1_X, PROBE_PT_1_Y, 0), + vector_3(PROBE_PT_2_X, PROBE_PT_2_Y, 0), + vector_3(PROBE_PT_3_X, PROBE_PT_3_Y, 0) + }; #endif // AUTO_BED_LEVELING_3POINT @@ -257,9 +274,11 @@ G29_TYPE GcodeSuite::G29() { */ if (!g29_in_progress) { - TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); + #if ENABLED(DUAL_X_CARRIAGE) + if (active_extruder != 0) tool_change(0); + #endif - #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) + #if ENABLED(PROBE_MANUALLY) || ENABLED(AUTO_BED_LEVELING_LINEAR) abl_probe_index = -1; #endif @@ -270,32 +289,36 @@ G29_TYPE GcodeSuite::G29() { const bool seen_w = parser.seen('W'); if (seen_w) { if (!leveling_is_valid()) { - SERIAL_ERROR_MSG("No bilinear grid"); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("No bilinear grid"); G29_RETURN(false); } - const float rz = parser.seenval('Z') ? RAW_Z_POSITION(parser.value_linear_units()) : current_position.z; + const float rz = parser.seenval('Z') ? RAW_Z_POSITION(parser.value_linear_units()) : current_position[Z_AXIS]; if (!WITHIN(rz, -10, 10)) { - SERIAL_ERROR_MSG("Bad Z value"); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Bad Z value"); G29_RETURN(false); } const float rx = RAW_X_POSITION(parser.linearval('X', NAN)), ry = RAW_Y_POSITION(parser.linearval('Y', NAN)); - int8_t i = parser.byteval('I', -1), j = parser.byteval('J', -1); + int8_t i = parser.byteval('I', -1), + j = parser.byteval('J', -1); if (!isnan(rx) && !isnan(ry)) { // Get nearest i / j from rx / ry - i = (rx - bilinear_start.x + 0.5 * gridSpacing.x) / gridSpacing.x; - j = (ry - bilinear_start.y + 0.5 * gridSpacing.y) / gridSpacing.y; - LIMIT(i, 0, GRID_MAX_POINTS_X - 1); - LIMIT(j, 0, GRID_MAX_POINTS_Y - 1); + i = (rx - bilinear_start[X_AXIS] + 0.5 * xGridSpacing) / xGridSpacing; + j = (ry - bilinear_start[Y_AXIS] + 0.5 * yGridSpacing) / yGridSpacing; + i = constrain(i, 0, GRID_MAX_POINTS_X - 1); + j = constrain(j, 0, GRID_MAX_POINTS_Y - 1); } if (WITHIN(i, 0, GRID_MAX_POINTS_X - 1) && WITHIN(j, 0, GRID_MAX_POINTS_Y)) { set_bed_leveling_enabled(false); z_values[i][j] = rz; - TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, rz)); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + bed_level_virt_interpolate(); + #endif set_bed_leveling_enabled(abl_should_enable); if (abl_should_enable) report_current_position(); } @@ -316,11 +339,15 @@ G29_TYPE GcodeSuite::G29() { verbose_level = parser.intval('V'); if (!WITHIN(verbose_level, 0, 4)) { - SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4)."); + SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0-4)."); G29_RETURN(false); } - dryrun = parser.boolval('D') || TERN0(PROBE_MANUALLY, no_action); + dryrun = parser.boolval('D') + #if ENABLED(PROBE_MANUALLY) + || no_action + #endif + ; #if ENABLED(AUTO_BED_LEVELING_LINEAR) @@ -328,22 +355,20 @@ G29_TYPE GcodeSuite::G29() { // X and Y specify points in each direction, overriding the default // These values may be saved with the completed mesh - abl_grid_points.set( - parser.byteval('X', GRID_MAX_POINTS_X), - parser.byteval('Y', GRID_MAX_POINTS_Y) - ); - if (parser.seenval('P')) abl_grid_points.x = abl_grid_points.y = parser.value_int(); + abl_grid_points_x = parser.intval('X', GRID_MAX_POINTS_X); + abl_grid_points_y = parser.intval('Y', GRID_MAX_POINTS_Y); + if (parser.seenval('P')) abl_grid_points_x = abl_grid_points_y = parser.value_int(); - if (!WITHIN(abl_grid_points.x, 2, GRID_MAX_POINTS_X)) { - SERIAL_ECHOLNPGM("?Probe points (X) implausible (2-" STRINGIFY(GRID_MAX_POINTS_X) ")."); + if (!WITHIN(abl_grid_points_x, 2, GRID_MAX_POINTS_X)) { + SERIAL_PROTOCOLLNPGM("?Probe points (X) is implausible (2-" STRINGIFY(GRID_MAX_POINTS_X) ")."); G29_RETURN(false); } - if (!WITHIN(abl_grid_points.y, 2, GRID_MAX_POINTS_Y)) { - SERIAL_ECHOLNPGM("?Probe points (Y) implausible (2-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); + if (!WITHIN(abl_grid_points_y, 2, GRID_MAX_POINTS_Y)) { + SERIAL_PROTOCOLLNPGM("?Probe points (Y) is implausible (2-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); G29_RETURN(false); } - abl_points = abl_grid_points.x * abl_grid_points.y; + abl_points = abl_grid_points_x * abl_grid_points_y; mean = 0; #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -356,77 +381,72 @@ G29_TYPE GcodeSuite::G29() { xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_SPEED)); - const float x_min = probe.min_x(), x_max = probe.max_x(), - y_min = probe.min_y(), y_max = probe.max_y(); + left_probe_bed_position = parser.seenval('L') ? (int)RAW_X_POSITION(parser.value_linear_units()) : LEFT_PROBE_BED_POSITION; + right_probe_bed_position = parser.seenval('R') ? (int)RAW_X_POSITION(parser.value_linear_units()) : RIGHT_PROBE_BED_POSITION; + front_probe_bed_position = parser.seenval('F') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : FRONT_PROBE_BED_POSITION; + back_probe_bed_position = parser.seenval('B') ? (int)RAW_Y_POSITION(parser.value_linear_units()) : BACK_PROBE_BED_POSITION; - if (parser.seen('H')) { - const int16_t size = (int16_t)parser.value_linear_units(); - probe_position_lf.set( - _MAX(X_CENTER - size / 2, x_min), - _MAX(Y_CENTER - size / 2, y_min) - ); - probe_position_rb.set( - _MIN(probe_position_lf.x + size, x_max), - _MIN(probe_position_lf.y + size, y_max) - ); - } - else { - probe_position_lf.set( - parser.seenval('L') ? RAW_X_POSITION(parser.value_linear_units()) : x_min, - parser.seenval('F') ? RAW_Y_POSITION(parser.value_linear_units()) : y_min - ); - probe_position_rb.set( - parser.seenval('R') ? RAW_X_POSITION(parser.value_linear_units()) : x_max, - parser.seenval('B') ? RAW_Y_POSITION(parser.value_linear_units()) : y_max - ); - } - - if (!probe.good_bounds(probe_position_lf, probe_position_rb)) { - SERIAL_ECHOLNPGM("? (L,R,F,B) out of bounds."); + if ( + #if IS_SCARA || ENABLED(DELTA) + !position_is_reachable_by_probe(left_probe_bed_position, 0) + || !position_is_reachable_by_probe(right_probe_bed_position, 0) + || !position_is_reachable_by_probe(0, front_probe_bed_position) + || !position_is_reachable_by_probe(0, back_probe_bed_position) + #else + !position_is_reachable_by_probe(left_probe_bed_position, front_probe_bed_position) + || !position_is_reachable_by_probe(right_probe_bed_position, back_probe_bed_position) + #endif + ) { + SERIAL_PROTOCOLLNPGM("? (L,R,F,B) out of bounds."); G29_RETURN(false); } // probe at the points of a lattice grid - gridSpacing.set((probe_position_rb.x - probe_position_lf.x) / (abl_grid_points.x - 1), - (probe_position_rb.y - probe_position_lf.y) / (abl_grid_points.y - 1)); + xGridSpacing = (right_probe_bed_position - left_probe_bed_position) / (abl_grid_points_x - 1); + yGridSpacing = (back_probe_bed_position - front_probe_bed_position) / (abl_grid_points_y - 1); #endif // ABL_GRID if (verbose_level > 0) { - SERIAL_ECHOPGM("G29 Auto Bed Leveling"); - if (dryrun) SERIAL_ECHOPGM(" (DRYRUN)"); + SERIAL_PROTOCOLPGM("G29 Auto Bed Leveling"); + if (dryrun) SERIAL_PROTOCOLPGM(" (DRYRUN)"); SERIAL_EOL(); } planner.synchronize(); - if (!faux) remember_feedrate_scaling_off(); - // Disable auto bed leveling during G29. // Be formal so G29 can be done successively without G28. if (!no_action) set_bed_leveling_enabled(false); - // Deploy certain probes before starting probing #if HAS_BED_PROBE - if (ENABLED(BLTOUCH)) - do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); - else if (probe.deploy()) { + // Deploy the probe. Probe will raise if needed. + if (DEPLOY_PROBE()) { set_bed_leveling_enabled(abl_should_enable); G29_RETURN(false); } #endif + if (!faux) setup_for_endstop_or_probe_move(); + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - if (TERN1(PROBE_MANUALLY, !no_action) - && (gridSpacing != bilinear_grid_spacing || probe_position_lf != bilinear_start) + #if ENABLED(PROBE_MANUALLY) + if (!no_action) + #endif + if ( xGridSpacing != bilinear_grid_spacing[X_AXIS] + || yGridSpacing != bilinear_grid_spacing[Y_AXIS] + || left_probe_bed_position != bilinear_start[X_AXIS] + || front_probe_bed_position != bilinear_start[Y_AXIS] ) { // Reset grid to 0.0 or "not probed". (Also disables ABL) reset_bed_level(); // Initialize a grid with the given dimensions - bilinear_grid_spacing = gridSpacing; - bilinear_start = probe_position_lf; + bilinear_grid_spacing[X_AXIS] = xGridSpacing; + bilinear_grid_spacing[Y_AXIS] = yGridSpacing; + bilinear_start[X_AXIS] = left_probe_bed_position; + bilinear_start[Y_AXIS] = front_probe_bed_position; // Can't re-enable (on error) until the new grid is written abl_should_enable = false; @@ -436,7 +456,9 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(AUTO_BED_LEVELING_3POINT) - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> 3-point Leveling"); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> 3-point Leveling"); + #endif // Probe at 3 arbitrary points points[0].z = points[1].z = points[2].z = 0; @@ -456,51 +478,57 @@ G29_TYPE GcodeSuite::G29() { // Abort current G29 procedure, go back to idle state if (seenA && g29_in_progress) { - SERIAL_ECHOLNPGM("Manual G29 aborted"); - SET_SOFT_ENDSTOP_LOOSE(false); + SERIAL_PROTOCOLLNPGM("Manual G29 aborted"); + #if HAS_SOFTWARE_ENDSTOPS + soft_endstops_enabled = enable_soft_endstops; + #endif set_bed_leveling_enabled(abl_should_enable); g29_in_progress = false; - TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); + #if ENABLED(LCD_BED_LEVELING) + lcd_wait_for_move = false; + #endif } // Query G29 status if (verbose_level || seenQ) { - SERIAL_ECHOPGM("Manual G29 "); + SERIAL_PROTOCOLPGM("Manual G29 "); if (g29_in_progress) { - SERIAL_ECHOPAIR("point ", _MIN(abl_probe_index + 1, abl_points)); - SERIAL_ECHOLNPAIR(" of ", abl_points); + SERIAL_PROTOCOLPAIR("point ", MIN(abl_probe_index + 1, abl_points)); + SERIAL_PROTOCOLLNPAIR(" of ", abl_points); } else - SERIAL_ECHOLNPGM("idle"); + SERIAL_PROTOCOLLNPGM("idle"); } if (no_action) G29_RETURN(false); if (abl_probe_index == 0) { // For the initial G29 S2 save software endstop state - SET_SOFT_ENDSTOP_LOOSE(true); + #if HAS_SOFTWARE_ENDSTOPS + enable_soft_endstops = soft_endstops_enabled; + #endif // Move close to the bed before the first point do_blocking_move_to_z(0); } else { - #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) + #if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT) const uint16_t index = abl_probe_index - 1; #endif // For G29 after adjusting Z. // Save the previous Z before going to the next point - measured_z = current_position.z; + measured_z = current_position[Z_AXIS]; #if ENABLED(AUTO_BED_LEVELING_LINEAR) mean += measured_z; eqnBVector[index] = measured_z; - eqnAMatrix[index + 0 * abl_points] = probePos.x; - eqnAMatrix[index + 1 * abl_points] = probePos.y; + eqnAMatrix[index + 0 * abl_points] = xProbe; + eqnAMatrix[index + 1 * abl_points] = yProbe; eqnAMatrix[index + 2 * abl_points] = 1; - incremental_LSF(&lsf_results, probePos, measured_z); + incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); #elif ENABLED(AUTO_BED_LEVELING_3POINT) @@ -508,11 +536,15 @@ G29_TYPE GcodeSuite::G29() { #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - const float newz = measured_z + zoffset; - z_values[meshCount.x][meshCount.y] = newz; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, newz)); + z_values[xCount][yCount] = measured_z + zoffset; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_P(PSTR("Save X"), meshCount.x, SP_Y_STR, meshCount.y, SP_Z_STR, measured_z + zoffset); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_PROTOCOLPAIR("Save X", xCount); + SERIAL_PROTOCOLPAIR(" Y", yCount); + SERIAL_PROTOCOLLNPAIR(" Z", measured_z + zoffset); + } + #endif #endif } @@ -526,59 +558,82 @@ G29_TYPE GcodeSuite::G29() { // Skip any unreachable points while (abl_probe_index < abl_points) { - // Set meshCount.x, meshCount.y based on abl_probe_index, with zig-zag + // Set xCount, yCount based on abl_probe_index, with zig-zag PR_OUTER_VAR = abl_probe_index / PR_INNER_END; PR_INNER_VAR = abl_probe_index - (PR_OUTER_VAR * PR_INNER_END); // Probe in reverse order for every other row/column - const bool zig = (PR_OUTER_VAR & 1); // != ((PR_OUTER_END) & 1); + bool zig = (PR_OUTER_VAR & 1); // != ((PR_OUTER_END) & 1); + if (zig) PR_INNER_VAR = (PR_INNER_END - 1) - PR_INNER_VAR; - probePos = probe_position_lf + gridSpacing * meshCount.asFloat(); + const float xBase = xCount * xGridSpacing + left_probe_bed_position, + yBase = yCount * yGridSpacing + front_probe_bed_position; - TERN_(AUTO_BED_LEVELING_LINEAR, indexIntoAB[meshCount.x][meshCount.y] = abl_probe_index); + xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5)); + yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5)); + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + indexIntoAB[xCount][yCount] = abl_probe_index; + #endif // Keep looping till a reachable point is found - if (position_is_reachable(probePos)) break; + if (position_is_reachable(xProbe, yProbe)) break; ++abl_probe_index; } // Is there a next point to move to? if (abl_probe_index < abl_points) { - _manual_goto_xy(probePos); // Can be used here too! - // Disable software endstops to allow manual adjustment - // If G29 is not completed, they will not be re-enabled - SET_SOFT_ENDSTOP_LOOSE(true); + _manual_goto_xy(xProbe, yProbe); // Can be used here too! + #if HAS_SOFTWARE_ENDSTOPS + // Disable software endstops to allow manual adjustment + // If G29 is not completed, they will not be re-enabled + soft_endstops_enabled = false; + #endif G29_RETURN(false); } else { + // Leveling done! Fall through to G29 finishing code below - SERIAL_ECHOLNPGM("Grid probing done."); + + SERIAL_PROTOCOLLNPGM("Grid probing done."); + // Re-enable software endstops, if needed - SET_SOFT_ENDSTOP_LOOSE(false); + #if HAS_SOFTWARE_ENDSTOPS + soft_endstops_enabled = enable_soft_endstops; + #endif } #elif ENABLED(AUTO_BED_LEVELING_3POINT) // Probe at 3 arbitrary points if (abl_probe_index < abl_points) { - probePos = points[abl_probe_index]; - _manual_goto_xy(probePos); - // Disable software endstops to allow manual adjustment - // If G29 is not completed, they will not be re-enabled - SET_SOFT_ENDSTOP_LOOSE(true); + xProbe = points[abl_probe_index].x; + yProbe = points[abl_probe_index].y; + _manual_goto_xy(xProbe, yProbe); + #if HAS_SOFTWARE_ENDSTOPS + // Disable software endstops to allow manual adjustment + // If G29 is not completed, they will not be re-enabled + soft_endstops_enabled = false; + #endif G29_RETURN(false); } else { - SERIAL_ECHOLNPGM("3-point probing done."); + SERIAL_PROTOCOLLNPGM("3-point probing done."); // Re-enable software endstops, if needed - SET_SOFT_ENDSTOP_LOOSE(false); + #if HAS_SOFTWARE_ENDSTOPS + soft_endstops_enabled = enable_soft_endstops; + #endif if (!dryrun) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); - if (planeNormal.z < 0) planeNormal *= -1; + if (planeNormal.z < 0) { + planeNormal.x *= -1; + planeNormal.y *= -1; + planeNormal.z *= -1; + } planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); // Can't re-enable (on error) until the new grid is written @@ -601,76 +656,67 @@ G29_TYPE GcodeSuite::G29() { measured_z = 0; - xy_int8_t meshCount; - - // Outer loop is X with PROBE_Y_FIRST enabled // Outer loop is Y with PROBE_Y_FIRST disabled - for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_END && !isnan(measured_z); PR_OUTER_VAR++) { + for (uint8_t PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_END && !isnan(measured_z); PR_OUTER_VAR++) { int8_t inStart, inStop, inInc; - if (zig) { // Zig away from origin - inStart = 0; // Left or front - inStop = PR_INNER_END; // Right or back - inInc = 1; // Zig right + if (zig) { // away from origin + inStart = 0; + inStop = PR_INNER_END; + inInc = 1; } - else { // Zag towards origin - inStart = PR_INNER_END - 1; // Right or back - inStop = -1; // Left or front - inInc = -1; // Zag left + else { // towards origin + inStart = PR_INNER_END - 1; + inStop = -1; + inInc = -1; } zig ^= true; // zag - // An index to print current state - uint8_t pt_index = (PR_OUTER_VAR) * (PR_INNER_END) + 1; - // Inner loop is Y with PROBE_Y_FIRST enabled - // Inner loop is X with PROBE_Y_FIRST disabled - for (PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; pt_index++, PR_INNER_VAR += inInc) { + for (int8_t PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; PR_INNER_VAR += inInc) { - probePos = probe_position_lf + gridSpacing * meshCount.asFloat(); + float xBase = left_probe_bed_position + xGridSpacing * xCount, + yBase = front_probe_bed_position + yGridSpacing * yCount; - TERN_(AUTO_BED_LEVELING_LINEAR, indexIntoAB[meshCount.x][meshCount.y] = ++abl_probe_index); // 0... + xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5)); + yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5)); - // Avoid probing outside the round or hexagonal area - if (TERN0(IS_KINEMATIC, !probe.can_reach(probePos))) continue; + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + indexIntoAB[xCount][yCount] = ++abl_probe_index; // 0... + #endif - if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", int(pt_index), "/", abl_points, "."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl_points))); + #if IS_KINEMATIC + // Avoid probing outside the round or hexagonal area + if (!position_is_reachable_by_probe(xProbe, yProbe)) continue; + #endif - measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); + measured_z = faux ? 0.001 * random(-100, 101) : probe_pt(xProbe, yProbe, raise_after, verbose_level); if (isnan(measured_z)) { set_bed_leveling_enabled(abl_should_enable); - break; // Breaks out of both loops + break; } - #if ENABLED(PROBE_TEMP_COMPENSATION) - temp_comp.compensate_measurement(TSI_BED, thermalManager.degBed(), measured_z); - temp_comp.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), measured_z); - TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(), measured_z)); - #endif - #if ENABLED(AUTO_BED_LEVELING_LINEAR) mean += measured_z; eqnBVector[abl_probe_index] = measured_z; - eqnAMatrix[abl_probe_index + 0 * abl_points] = probePos.x; - eqnAMatrix[abl_probe_index + 1 * abl_points] = probePos.y; + eqnAMatrix[abl_probe_index + 0 * abl_points] = xProbe; + eqnAMatrix[abl_probe_index + 1 * abl_points] = yProbe; eqnAMatrix[abl_probe_index + 2 * abl_points] = 1; - incremental_LSF(&lsf_results, probePos, measured_z); + incremental_LSF(&lsf_results, xProbe, yProbe, measured_z); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - z_values[meshCount.x][meshCount.y] = measured_z + zoffset; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, z_values[meshCount.x][meshCount.y])); + z_values[xCount][yCount] = measured_z + zoffset; #endif abl_should_enable = false; - idle_no_sleep(); + idle(); } // inner } // outer @@ -679,13 +725,11 @@ G29_TYPE GcodeSuite::G29() { // Probe at 3 arbitrary points - LOOP_L_N(i, 3) { - if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", int(i + 1), "/3."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i + 1))); - + for (uint8_t i = 0; i < 3; ++i) { // Retain the last probe position - probePos = points[i]; - measured_z = faux ? 0.001 * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); + xProbe = points[i].x; + yProbe = points[i].y; + measured_z = faux ? 0.001 * random(-100, 101) : probe_pt(xProbe, yProbe, raise_after, verbose_level); if (isnan(measured_z)) { set_bed_leveling_enabled(abl_should_enable); break; @@ -695,7 +739,11 @@ G29_TYPE GcodeSuite::G29() { if (!dryrun && !isnan(measured_z)) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); - if (planeNormal.z < 0) planeNormal *= -1; + if (planeNormal.z < 0) { + planeNormal.x *= -1; + planeNormal.y *= -1; + planeNormal.z *= -1; + } planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); // Can't re-enable (on error) until the new grid is written @@ -704,10 +752,8 @@ G29_TYPE GcodeSuite::G29() { #endif // AUTO_BED_LEVELING_3POINT - TERN_(HAS_DISPLAY, ui.reset_status()); - // Stow the probe. No raise for FIX_MOUNTED_PROBE. - if (probe.stow()) { + if (STOW_PROBE()) { set_bed_leveling_enabled(abl_should_enable); measured_z = NAN; } @@ -724,11 +770,15 @@ G29_TYPE GcodeSuite::G29() { // return or loop before this point. // - if (DEBUGGING(LEVELING)) DEBUG_POS("> probing complete", current_position); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("> probing complete", current_position); + #endif #if ENABLED(PROBE_MANUALLY) g29_in_progress = false; - TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); + #if ENABLED(LCD_BED_LEVELING) + lcd_wait_for_move = false; + #endif #endif // Calculate leveling, print reports, correct the position @@ -740,7 +790,9 @@ G29_TYPE GcodeSuite::G29() { refresh_bed_level(); - TERN_(ABL_BILINEAR_SUBDIVISION, print_bilinear_leveling_grid_virt()); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + print_bilinear_leveling_grid_virt(); + #endif #elif ENABLED(AUTO_BED_LEVELING_LINEAR) @@ -754,55 +806,40 @@ G29_TYPE GcodeSuite::G29() { * plane equation in the standard form, which is Vx*x+Vy*y+Vz*z+d = 0 * so Vx = -a Vy = -b Vz = 1 (we want the vector facing towards positive Z */ - struct { float a, b, d; } plane_equation_coefficients; + float plane_equation_coefficients[3]; finish_incremental_LSF(&lsf_results); - plane_equation_coefficients.a = -lsf_results.A; // We should be able to eliminate the '-' on these three lines and down below - plane_equation_coefficients.b = -lsf_results.B; // but that is not yet tested. - plane_equation_coefficients.d = -lsf_results.D; + plane_equation_coefficients[0] = -lsf_results.A; // We should be able to eliminate the '-' on these three lines and down below + plane_equation_coefficients[1] = -lsf_results.B; // but that is not yet tested. + plane_equation_coefficients[2] = -lsf_results.D; mean /= abl_points; if (verbose_level) { - SERIAL_ECHOPAIR_F("Eqn coefficients: a: ", plane_equation_coefficients.a, 8); - SERIAL_ECHOPAIR_F(" b: ", plane_equation_coefficients.b, 8); - SERIAL_ECHOPAIR_F(" d: ", plane_equation_coefficients.d, 8); - if (verbose_level > 2) - SERIAL_ECHOPAIR_F("\nMean of sampled points: ", mean, 8); + SERIAL_PROTOCOLPGM("Eqn coefficients: a: "); + SERIAL_PROTOCOL_F(plane_equation_coefficients[0], 8); + SERIAL_PROTOCOLPGM(" b: "); + SERIAL_PROTOCOL_F(plane_equation_coefficients[1], 8); + SERIAL_PROTOCOLPGM(" d: "); + SERIAL_PROTOCOL_F(plane_equation_coefficients[2], 8); SERIAL_EOL(); + if (verbose_level > 2) { + SERIAL_PROTOCOLPGM("Mean of sampled points: "); + SERIAL_PROTOCOL_F(mean, 8); + SERIAL_EOL(); + } } // Create the matrix but don't correct the position yet if (!dryrun) planner.bed_level_matrix = matrix_3x3::create_look_at( - vector_3(-plane_equation_coefficients.a, -plane_equation_coefficients.b, 1) // We can eliminate the '-' here and up above + vector_3(-plane_equation_coefficients[0], -plane_equation_coefficients[1], 1) // We can eliminate the '-' here and up above ); // Show the Topography map if enabled if (do_topography_map) { - float min_diff = 999; - - auto print_topo_map = [&](PGM_P const title, const bool get_min) { - serialprintPGM(title); - for (int8_t yy = abl_grid_points.y - 1; yy >= 0; yy--) { - LOOP_L_N(xx, abl_grid_points.x) { - const int ind = indexIntoAB[xx][yy]; - xyz_float_t tmp = { eqnAMatrix[ind + 0 * abl_points], - eqnAMatrix[ind + 1 * abl_points], 0 }; - apply_rotation_xyz(planner.bed_level_matrix, tmp); - if (get_min) NOMORE(min_diff, eqnBVector[ind] - tmp.z); - const float subval = get_min ? mean : tmp.z + min_diff, - diff = eqnBVector[ind] - subval; - SERIAL_CHAR(' '); if (diff >= 0.0) SERIAL_CHAR('+'); // Include + for column alignment - SERIAL_ECHO_F(diff, 5); - } // xx - SERIAL_EOL(); - } // yy - SERIAL_EOL(); - }; - - print_topo_map(PSTR("\nBed Height Topography:\n" + SERIAL_PROTOCOLLNPGM("\nBed Height Topography:\n" " +--- BACK --+\n" " | |\n" " L | (+) | R\n" @@ -812,10 +849,56 @@ G29_TYPE GcodeSuite::G29() { " | (-) | T\n" " | |\n" " O-- FRONT --+\n" - " (0,0)\n"), true); - if (verbose_level > 3) - print_topo_map(PSTR("\nCorrected Bed Height vs. Bed Topology:\n"), false); + " (0,0)"); + float min_diff = 999; + + for (int8_t yy = abl_grid_points_y - 1; yy >= 0; yy--) { + for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { + int ind = indexIntoAB[xx][yy]; + float diff = eqnBVector[ind] - mean, + x_tmp = eqnAMatrix[ind + 0 * abl_points], + y_tmp = eqnAMatrix[ind + 1 * abl_points], + z_tmp = 0; + + apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); + + NOMORE(min_diff, eqnBVector[ind] - z_tmp); + + if (diff >= 0.0) + SERIAL_PROTOCOLPGM(" +"); // Include + for column alignment + else + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOL_F(diff, 5); + } // xx + SERIAL_EOL(); + } // yy + SERIAL_EOL(); + + if (verbose_level > 3) { + SERIAL_PROTOCOLLNPGM("\nCorrected Bed Height vs. Bed Topology:"); + + for (int8_t yy = abl_grid_points_y - 1; yy >= 0; yy--) { + for (uint8_t xx = 0; xx < abl_grid_points_x; xx++) { + int ind = indexIntoAB[xx][yy]; + float x_tmp = eqnAMatrix[ind + 0 * abl_points], + y_tmp = eqnAMatrix[ind + 1 * abl_points], + z_tmp = 0; + + apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); + + float diff = eqnBVector[ind] - z_tmp - min_diff; + if (diff >= 0.0) + SERIAL_PROTOCOLPGM(" +"); + // Include + for column alignment + else + SERIAL_PROTOCOLCHAR(' '); + SERIAL_PROTOCOL_F(diff, 5); + } // xx + SERIAL_EOL(); + } // yy + SERIAL_EOL(); + } } //do_topography_map #endif // AUTO_BED_LEVELING_LINEAR @@ -832,63 +915,84 @@ G29_TYPE GcodeSuite::G29() { // Correct the current XYZ position based on the tilted plane. // - if (DEBUGGING(LEVELING)) DEBUG_POS("G29 uncorrected XYZ", current_position); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("G29 uncorrected XYZ", current_position); + #endif - xyze_pos_t converted = current_position; - planner.force_unapply_leveling(converted); // use conversion machinery + float converted[XYZ]; + COPY(converted, current_position); + + planner.leveling_active = true; + planner.unapply_leveling(converted); // use conversion machinery + planner.leveling_active = false; // Use the last measured distance to the bed, if possible - if ( NEAR(current_position.x, probePos.x - probe.offset_xy.x) - && NEAR(current_position.y, probePos.y - probe.offset_xy.y) + if ( NEAR(current_position[X_AXIS], xProbe - (X_PROBE_OFFSET_FROM_EXTRUDER)) + && NEAR(current_position[Y_AXIS], yProbe - (Y_PROBE_OFFSET_FROM_EXTRUDER)) ) { - const float simple_z = current_position.z - measured_z; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Probed Z", simple_z, " Matrix Z", converted.z, " Discrepancy ", simple_z - converted.z); - converted.z = simple_z; + const float simple_z = current_position[Z_AXIS] - measured_z; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("Z from Probe:", simple_z); + SERIAL_ECHOPAIR(" Matrix:", converted[Z_AXIS]); + SERIAL_ECHOLNPAIR(" Discrepancy:", simple_z - converted[Z_AXIS]); + } + #endif + converted[Z_AXIS] = simple_z; } // The rotated XY and corrected Z are now current_position - current_position = converted; + COPY(current_position, converted); - if (DEBUGGING(LEVELING)) DEBUG_POS("G29 corrected XYZ", current_position); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("G29 corrected XYZ", current_position); + #endif } #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) if (!dryrun) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("G29 uncorrected Z:", current_position.z); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("G29 uncorrected Z:", current_position[Z_AXIS]); + #endif // Unapply the offset because it is going to be immediately applied // and cause compensation movement in Z - const float fade_scaling_factor = TERN(ENABLE_LEVELING_FADE_HEIGHT, planner.fade_scaling_factor_for_z(current_position.z), 1); - current_position.z -= fade_scaling_factor * bilinear_z_offset(current_position); + current_position[Z_AXIS] -= bilinear_z_offset(current_position); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(" corrected Z:", current_position.z); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR(" corrected Z:", current_position[Z_AXIS]); + #endif } #endif // ABL_PLANAR + #ifdef Z_PROBE_END_SCRIPT + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); + #endif + planner.synchronize(); + enqueue_and_echo_commands_P(PSTR(Z_PROBE_END_SCRIPT)); + #endif + // Auto Bed Leveling is complete! Enable if possible. planner.leveling_active = dryrun ? abl_should_enable : true; } // !isnan(measured_z) // Restore state after probing - if (!faux) restore_feedrate_and_scaling(); + if (!faux) clean_up_after_endstop_or_probe_move(); - // Sync the planner from the current_position - if (planner.leveling_active) sync_plan_position(); - - #if HAS_BED_PROBE - probe.move_z_after_probing(); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< G29"); #endif - #ifdef Z_PROBE_END_SCRIPT - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); - planner.synchronize(); - process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT)); - #endif + KEEPALIVE_STATE(IN_HANDLER); - #if ENABLED(DWIN_CREALITY_LCD) - DWIN_CompletedLeveling(); + if (planner.leveling_active) + SYNC_PLAN_POSITION_KINEMATIC(); + + #if HAS_BED_PROBE && defined(Z_AFTER_PROBING) + move_z_after_probing(); #endif report_current_position(); @@ -896,4 +1000,4 @@ G29_TYPE GcodeSuite::G29() { G29_RETURN(isnan(measured_z)); } -#endif // HAS_ABL_NOT_UBL +#endif // OLDSCHOOL_ABL diff --git a/Marlin/src/gcode/bedlevel/abl/M421.cpp b/Marlin/src/gcode/bedlevel/abl/M421.cpp index 182dc32515..8f3683af8c 100644 --- a/Marlin/src/gcode/bedlevel/abl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/abl/M421.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -29,46 +29,36 @@ #if ENABLED(AUTO_BED_LEVELING_BILINEAR) #include "../../gcode.h" -#include "../../../feature/bedlevel/bedlevel.h" - -#if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" -#endif +#include "../../../feature/bedlevel/abl/abl.h" /** - * M421: Set one or more Mesh Bed Leveling Z coordinates + * M421: Set a single Mesh Bed Leveling Z coordinate * * Usage: * M421 I J Z * M421 I J Q - * - * - If I is omitted, set the entire row - * - If J is omitted, set the entire column - * - If both I and J are omitted, set all */ void GcodeSuite::M421() { int8_t ix = parser.intval('I', -1), iy = parser.intval('J', -1); - const bool hasZ = parser.seenval('Z'), - hasQ = !hasZ && parser.seenval('Q'); + const bool hasI = ix >= 0, + hasJ = iy >= 0, + hasZ = parser.seen('Z'), + hasQ = !hasZ && parser.seen('Q'); - if (hasZ || hasQ) { - if (WITHIN(ix, -1, GRID_MAX_POINTS_X - 1) && WITHIN(iy, -1, GRID_MAX_POINTS_Y - 1)) { - const float zval = parser.value_linear_units(); - uint8_t sx = ix >= 0 ? ix : 0, ex = ix >= 0 ? ix : GRID_MAX_POINTS_X - 1, - sy = iy >= 0 ? iy : 0, ey = iy >= 0 ? iy : GRID_MAX_POINTS_Y - 1; - LOOP_S_LE_N(x, sx, ex) { - LOOP_S_LE_N(y, sy, ey) { - z_values[x][y] = zval + (hasQ ? z_values[x][y] : 0); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } - } - TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); - } - else - SERIAL_ERROR_MSG(STR_ERR_MESH_XY); + if (!hasI || !hasJ || !(hasZ || hasQ)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M421_PARAMETERS); + } + else if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY); + } + else { + z_values[ix][iy] = parser.value_linear_units() + (hasQ ? z_values[ix][iy] : 0); + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + bed_level_virt_interpolate(); + #endif } - else - SERIAL_ERROR_MSG(STR_ERR_M421_PARAMETERS); } #endif // AUTO_BED_LEVELING_BILINEAR diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index d94c16052b..8c970e89b0 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -38,12 +38,8 @@ #include "../../../module/motion.h" #include "../../../module/stepper.h" -#if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" -#endif - // Save 130 bytes with non-duplication of PSTR -inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM(" not entered."); } +void echo_not_entered() { SERIAL_PROTOCOLLNPGM(" not entered."); } /** * G29: Mesh-based Z probe, probes a grid and produces a @@ -51,129 +47,155 @@ inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM(" * * Parameters With MESH_BED_LEVELING: * - * S0 Report the current mesh values + * S0 Produce a mesh report * S1 Start probing mesh points * S2 Probe the next mesh point - * S3 In Jn Zn.nn Manually modify a single point + * S3 Xn Yn Zn.nn Manually modify a single point * S4 Zn.nn Set z offset. Positive away from bed, negative closer to bed. * S5 Reset and disable mesh + * + * The S0 report the points as below + * + * +----> X-axis 1-n + * | + * | + * v Y-axis 1-n + * */ void GcodeSuite::G29() { static int mbl_probe_index = -1; + #if HAS_SOFTWARE_ENDSTOPS + static bool enable_soft_endstops; + #endif MeshLevelingState state = (MeshLevelingState)parser.byteval('S', (int8_t)MeshReport); if (!WITHIN(state, 0, 5)) { - SERIAL_ECHOLNPGM("S out of range (0-5)."); + SERIAL_PROTOCOLLNPGM("S out of range (0-5)."); return; } - int8_t ix, iy; + int8_t px, py; switch (state) { case MeshReport: - SERIAL_ECHOPGM("Mesh Bed Leveling "); if (leveling_is_valid()) { - serialprintln_onoff(planner.leveling_active); + SERIAL_PROTOCOLLNPAIR("State: ", planner.leveling_active ? MSG_ON : MSG_OFF); mbl.report_mesh(); } else - SERIAL_ECHOLNPGM("has no data."); + SERIAL_PROTOCOLLNPGM("Mesh bed leveling has no data."); break; case MeshStart: mbl.reset(); mbl_probe_index = 0; - if (!ui.wait_for_move) { - queue.inject_P(PSTR("G28\nG29 S2")); + if (!lcd_wait_for_move) { + enqueue_and_echo_commands_P(PSTR("G28\nG29 S2")); return; } state = MeshNext; case MeshNext: if (mbl_probe_index < 0) { - SERIAL_ECHOLNPGM("Start mesh probing with \"G29 S1\" first."); + SERIAL_PROTOCOLLNPGM("Start mesh probing with \"G29 S1\" first."); return; } // For each G29 S2... if (mbl_probe_index == 0) { + #if HAS_SOFTWARE_ENDSTOPS + // For the initial G29 S2 save software endstop state + enable_soft_endstops = soft_endstops_enabled; + #endif // Move close to the bed before the first point do_blocking_move_to_z(0); } else { // Save Z for the previous mesh position - mbl.set_zigzag_z(mbl_probe_index - 1, current_position.z); - SET_SOFT_ENDSTOP_LOOSE(false); + mbl.set_zigzag_z(mbl_probe_index - 1, current_position[Z_AXIS]); + #if HAS_SOFTWARE_ENDSTOPS + soft_endstops_enabled = enable_soft_endstops; + #endif } // If there's another point to sample, move there with optional lift. if (mbl_probe_index < GRID_MAX_POINTS) { - // Disable software endstops to allow manual adjustment - // If G29 is left hanging without completion they won't be re-enabled! - SET_SOFT_ENDSTOP_LOOSE(true); - mbl.zigzag(mbl_probe_index++, ix, iy); - _manual_goto_xy({ mbl.index_to_xpos[ix], mbl.index_to_ypos[iy] }); + #if HAS_SOFTWARE_ENDSTOPS + // Disable software endstops to allow manual adjustment + // If G29 is not completed, they will not be re-enabled + soft_endstops_enabled = false; + #endif + + mbl.zigzag(mbl_probe_index++, px, py); + _manual_goto_xy(mbl.index_to_xpos[px], mbl.index_to_ypos[py]); } else { // One last "return to the bed" (as originally coded) at completion - current_position.z = MANUAL_PROBE_HEIGHT; + current_position[Z_AXIS] = MANUAL_PROBE_HEIGHT; line_to_current_position(); planner.synchronize(); // After recording the last point, activate home and activate mbl_probe_index = -1; - SERIAL_ECHOLNPGM("Mesh probing done."); + SERIAL_PROTOCOLLNPGM("Mesh probing done."); BUZZ(100, 659); BUZZ(100, 698); - home_all_axes(); + gcode.home_all_axes(); set_bed_leveling_enabled(true); #if ENABLED(MESH_G28_REST_ORIGIN) - current_position.z = 0; - line_to_current_position(homing_feedrate(Z_AXIS)); + current_position[Z_AXIS] = 0; + set_destination_from_current(); + buffer_line_to_destination(homing_feedrate(Z_AXIS)); planner.synchronize(); #endif - TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); + #if ENABLED(LCD_BED_LEVELING) + lcd_wait_for_move = false; + #endif } break; case MeshSet: - if (parser.seenval('I')) { - ix = parser.value_int(); - if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) { - SERIAL_ECHOPAIR("I out of range (0-", int(GRID_MAX_POINTS_X - 1)); - SERIAL_ECHOLNPGM(")"); + if (parser.seenval('X')) { + px = parser.value_int() - 1; + if (!WITHIN(px, 0, GRID_MAX_POINTS_X - 1)) { + SERIAL_PROTOCOLLNPGM("X out of range (1-" STRINGIFY(GRID_MAX_POINTS_X) ")."); return; } } - else - return echo_not_entered('J'); + else { + SERIAL_CHAR('X'); echo_not_entered(); + return; + } - if (parser.seenval('J')) { - iy = parser.value_int(); - if (!WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { - SERIAL_ECHOPAIR("J out of range (0-", int(GRID_MAX_POINTS_Y - 1)); - SERIAL_ECHOLNPGM(")"); + if (parser.seenval('Y')) { + py = parser.value_int() - 1; + if (!WITHIN(py, 0, GRID_MAX_POINTS_Y - 1)) { + SERIAL_PROTOCOLLNPGM("Y out of range (1-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); return; } } - else - return echo_not_entered('J'); - - if (parser.seenval('Z')) { - mbl.z_values[ix][iy] = parser.value_linear_units(); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, mbl.z_values[ix][iy])); + else { + SERIAL_CHAR('Y'); echo_not_entered(); + return; + } + + if (parser.seenval('Z')) + mbl.z_values[px][py] = parser.value_linear_units(); + else { + SERIAL_CHAR('Z'); echo_not_entered(); + return; } - else - return echo_not_entered('Z'); break; case MeshSetZOffset: if (parser.seenval('Z')) mbl.z_offset = parser.value_linear_units(); - else - return echo_not_entered('Z'); + else { + SERIAL_CHAR('Z'); echo_not_entered(); + return; + } break; case MeshReset: @@ -183,8 +205,8 @@ void GcodeSuite::G29() { } // switch(state) if (state == MeshNext) { - SERIAL_ECHOPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS)); - SERIAL_ECHOLNPAIR(" of ", int(GRID_MAX_POINTS)); + SERIAL_PROTOCOLPAIR("MBL G29 point ", MIN(mbl_probe_index, GRID_MAX_POINTS)); + SERIAL_PROTOCOLLNPAIR(" of ", int(GRID_MAX_POINTS)); } report_current_position(); diff --git a/Marlin/src/gcode/bedlevel/mbl/M421.cpp b/Marlin/src/gcode/bedlevel/mbl/M421.cpp index 1368ab0bef..3e0cd7f016 100644 --- a/Marlin/src/gcode/bedlevel/mbl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/M421.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -48,10 +48,14 @@ void GcodeSuite::M421() { const int8_t iy = hasJ ? parser.value_int() : hasY ? mbl.probe_index_y(RAW_Y_POSITION(parser.value_linear_units())) : -1; const bool hasZ = parser.seen('Z'), hasQ = !hasZ && parser.seen('Q'); - if (int(hasI && hasJ) + int(hasX && hasY) != 1 || !(hasZ || hasQ)) - SERIAL_ERROR_MSG(STR_ERR_M421_PARAMETERS); - else if (ix < 0 || iy < 0) - SERIAL_ERROR_MSG(STR_ERR_MESH_XY); + if (int(hasI && hasJ) + int(hasX && hasY) != 1 || !(hasZ || hasQ)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M421_PARAMETERS); + } + else if (ix < 0 || iy < 0) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY); + } else mbl.set_z(ix, iy, parser.value_linear_units() + (hasQ ? mbl.z_values[ix][iy] : 0)); } diff --git a/Marlin/src/gcode/bedlevel/ubl/G29.cpp b/Marlin/src/gcode/bedlevel/ubl/G29.cpp index 2ef3ab4cec..1dbf2dfe41 100644 --- a/Marlin/src/gcode/bedlevel/ubl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/G29.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -29,7 +29,7 @@ #if ENABLED(AUTO_BED_LEVELING_UBL) #include "../../gcode.h" -#include "../../../feature/bedlevel/bedlevel.h" +#include "../../../feature/bedlevel/ubl/ubl.h" void GcodeSuite::G29() { ubl.G29(); } diff --git a/Marlin/src/gcode/bedlevel/ubl/M421.cpp b/Marlin/src/gcode/bedlevel/ubl/M421.cpp index 600c1fc8ba..e8597eee22 100644 --- a/Marlin/src/gcode/bedlevel/ubl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/ubl/M421.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -31,10 +31,6 @@ #include "../../gcode.h" #include "../../../feature/bedlevel/bedlevel.h" -#if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" -#endif - /** * M421: Set a single Mesh Bed Leveling Z coordinate * @@ -46,25 +42,30 @@ * M421 C Q */ void GcodeSuite::M421() { - xy_int8_t ij = { int8_t(parser.intval('I', -1)), int8_t(parser.intval('J', -1)) }; - const bool hasI = ij.x >= 0, - hasJ = ij.y >= 0, + int8_t ix = parser.intval('I', -1), iy = parser.intval('J', -1); + const bool hasI = ix >= 0, + hasJ = iy >= 0, hasC = parser.seen('C'), hasN = parser.seen('N'), hasZ = parser.seen('Z'), hasQ = !hasZ && parser.seen('Q'); - if (hasC) ij = ubl.find_closest_mesh_point_of_type(REAL, current_position); - - if (int(hasC) + int(hasI && hasJ) != 1 || !(hasZ || hasQ || hasN)) - SERIAL_ERROR_MSG(STR_ERR_M421_PARAMETERS); - else if (!WITHIN(ij.x, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(ij.y, 0, GRID_MAX_POINTS_Y - 1)) - SERIAL_ERROR_MSG(STR_ERR_MESH_XY); - else { - float &zval = ubl.z_values[ij.x][ij.y]; - zval = hasN ? NAN : parser.value_linear_units() + (hasQ ? zval : 0); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ij.x, ij.y, zval)); + if (hasC) { + const mesh_index_pair location = ubl.find_closest_mesh_point_of_type(REAL, current_position[X_AXIS], current_position[Y_AXIS], USE_NOZZLE_AS_REFERENCE, NULL); + ix = location.x_index; + iy = location.y_index; } + + if (int(hasC) + int(hasI && hasJ) != 1 || !(hasZ || hasQ || hasN)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M421_PARAMETERS); + } + else if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY); + } + else + ubl.z_values[ix][iy] = hasN ? NAN : parser.value_linear_units() + (hasQ ? ubl.z_values[ix][iy] : 0); } #endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/gcode/bedlevel/ubl/M49.cpp b/Marlin/src/gcode/bedlevel/ubl/M49.cpp new file mode 100644 index 0000000000..b83ffad61b --- /dev/null +++ b/Marlin/src/gcode/bedlevel/ubl/M49.cpp @@ -0,0 +1,40 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * M49.cpp - Toggle the G26 debug flag + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(G26_MESH_VALIDATION) + +#include "../../gcode.h" +#include "../../../feature/bedlevel/bedlevel.h" + +void GcodeSuite::M49() { + g26_debug_flag ^= true; + SERIAL_PROTOCOLPGM("G26 Debug: "); + serialprintPGM(g26_debug_flag ? PSTR("On\n") : PSTR("Off\n")); +} + +#endif // G26_MESH_VALIDATION diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 3420956803..b8cfe9b78d 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,7 +27,7 @@ #include "../../module/stepper.h" #include "../../module/endstops.h" -#if HAS_MULTI_HOTEND +#if HOTENDS > 1 #include "../../module/tool_change.h" #endif @@ -39,74 +39,47 @@ #include "../../feature/tmc_util.h" #endif -#include "../../module/probe.h" - -#if ENABLED(BLTOUCH) - #include "../../feature/bltouch.h" +#if HOMING_Z_WITH_PROBE || ENABLED(BLTOUCH) + #include "../../module/probe.h" #endif #include "../../lcd/ultralcd.h" -#if ENABLED(DWIN_CREALITY_LCD) - #include "../../lcd/dwin/e3v2/dwin.h" -#endif - -#if HAS_L64XX // set L6470 absolute position registers to counts - #include "../../libs/L64XX/L64XX_Marlin.h" -#endif - -#if ENABLED(LASER_MOVE_G28_OFF) - #include "../../feature/spindle_laser.h" -#endif - -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../../core/debug_out.h" #if ENABLED(QUICK_HOME) static void quick_home_xy() { // Pretend the current position is 0,0 - current_position.set(0.0, 0.0); + current_position[X_AXIS] = current_position[Y_AXIS] = 0.0; sync_plan_position(); - const int x_axis_home_dir = x_home_dir(active_extruder); + const int x_axis_home_dir = + #if ENABLED(DUAL_X_CARRIAGE) + x_home_dir(active_extruder) + #else + home_dir(X_AXIS) + #endif + ; const float mlx = max_length(X_AXIS), mly = max_length(Y_AXIS), mlratio = mlx > mly ? mly / mlx : mlx / mly, - fr_mm_s = _MIN(homing_feedrate(X_AXIS), homing_feedrate(Y_AXIS)) * SQRT(sq(mlratio) + 1.0); + fr_mm_s = MIN(homing_feedrate(X_AXIS), homing_feedrate(Y_AXIS)) * SQRT(sq(mlratio) + 1.0); #if ENABLED(SENSORLESS_HOMING) - sensorless_t stealth_states { - tmc_enable_stallguard(stepperX) - , tmc_enable_stallguard(stepperY) - , false - , false - #if AXIS_HAS_STALLGUARD(X2) - || tmc_enable_stallguard(stepperX2) - #endif - , false - #if AXIS_HAS_STALLGUARD(Y2) - || tmc_enable_stallguard(stepperY2) - #endif - }; + sensorless_homing_per_axis(X_AXIS); + sensorless_homing_per_axis(Y_AXIS); #endif do_blocking_move_to_xy(1.5 * mlx * x_axis_home_dir, 1.5 * mly * home_dir(Y_AXIS), fr_mm_s); endstops.validate_homing_move(); - current_position.set(0.0, 0.0); + current_position[X_AXIS] = current_position[Y_AXIS] = 0.0; #if ENABLED(SENSORLESS_HOMING) - tmc_disable_stallguard(stepperX, stealth_states.x); - tmc_disable_stallguard(stepperY, stealth_states.y); - #if AXIS_HAS_STALLGUARD(X2) - tmc_disable_stallguard(stepperX2, stealth_states.x2); - #endif - #if AXIS_HAS_STALLGUARD(Y2) - tmc_disable_stallguard(stepperY2, stealth_states.y2); - #endif + sensorless_homing_per_axis(X_AXIS, false); + sensorless_homing_per_axis(Y_AXIS, false); #endif } @@ -115,66 +88,64 @@ #if ENABLED(Z_SAFE_HOMING) inline void home_z_safely() { - DEBUG_SECTION(log_G28, "home_z_safely", DEBUGGING(LEVELING)); - // Disallow Z homing if X or Y homing is needed - if (homing_needed_error(_BV(X_AXIS) | _BV(Y_AXIS))) return; + // Disallow Z homing if X or Y are unknown + if (!TEST(axis_known_position, X_AXIS) || !TEST(axis_known_position, Y_AXIS)) { + LCD_MESSAGEPGM(MSG_ERR_Z_HOMING); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_Z_HOMING); + return; + } - sync_plan_position(); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Z_SAFE_HOMING >>>"); + #endif + + SYNC_PLAN_POSITION_KINEMATIC(); /** * Move the Z probe (or just the nozzle) to the safe homing point - * (Z is already at the right height) */ - destination.set(safe_homing_xy, current_position.z); + destination[X_AXIS] = Z_SAFE_HOMING_X_POINT; + destination[Y_AXIS] = Z_SAFE_HOMING_Y_POINT; + destination[Z_AXIS] = current_position[Z_AXIS]; // Z is already at the right height - TERN_(HOMING_Z_WITH_PROBE, destination -= probe.offset_xy); + #if HOMING_Z_WITH_PROBE + destination[X_AXIS] -= X_PROBE_OFFSET_FROM_EXTRUDER; + destination[Y_AXIS] -= Y_PROBE_OFFSET_FROM_EXTRUDER; + #endif - if (position_is_reachable(destination)) { + if (position_is_reachable(destination[X_AXIS], destination[Y_AXIS])) { - if (DEBUGGING(LEVELING)) DEBUG_POS("home_z_safely", destination); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Z_SAFE_HOMING", destination); + #endif // This causes the carriage on Dual X to unpark - TERN_(DUAL_X_CARRIAGE, active_extruder_parked = false); + #if ENABLED(DUAL_X_CARRIAGE) + active_extruder_parked = false; + #endif - TERN_(SENSORLESS_HOMING, safe_delay(500)); // Short delay needed to settle + #if ENABLED(SENSORLESS_HOMING) + safe_delay(500); // Short delay needed to settle + #endif - do_blocking_move_to_xy(destination); + do_blocking_move_to_xy(destination[X_AXIS], destination[Y_AXIS]); homeaxis(Z_AXIS); } else { LCD_MESSAGEPGM(MSG_ZPROBE_OUT); - SERIAL_ECHO_MSG(STR_ZPROBE_OUT_SER); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ZPROBE_OUT); } + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< Z_SAFE_HOMING"); + #endif } #endif // Z_SAFE_HOMING -#if ENABLED(IMPROVE_HOMING_RELIABILITY) - - slow_homing_t begin_slow_homing() { - slow_homing_t slow_homing{0}; - slow_homing.acceleration.set(planner.settings.max_acceleration_mm_per_s2[X_AXIS], - planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); - planner.settings.max_acceleration_mm_per_s2[X_AXIS] = 100; - planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = 100; - #if HAS_CLASSIC_JERK - slow_homing.jerk_xy = planner.max_jerk; - planner.max_jerk.set(0, 0); - #endif - planner.reset_acceleration_rates(); - return slow_homing; - } - - void end_slow_homing(const slow_homing_t &slow_homing) { - planner.settings.max_acceleration_mm_per_s2[X_AXIS] = slow_homing.acceleration.x; - planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = slow_homing.acceleration.y; - TERN_(HAS_CLASSIC_JERK, planner.max_jerk = slow_homing.jerk_xy); - planner.reset_acceleration_rates(); - } - -#endif // IMPROVE_HOMING_RELIABILITY - /** * G28: Home all axes according to settings * @@ -192,14 +163,16 @@ * X Home to the X endstop * Y Home to the Y endstop * Z Home to the Z endstop + * */ -void GcodeSuite::G28() { - DEBUG_SECTION(log_G28, "G28", DEBUGGING(LEVELING)); - if (DEBUGGING(LEVELING)) log_machine_info(); +void GcodeSuite::G28(const bool always_home_all) { - TERN_(LASER_MOVE_G28_OFF, cutter.set_inline_enabled(false)); // turn off laser - - TERN_(DWIN_CREALITY_LCD, HMI_flag.home_flag = true); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM(">>> G28"); + log_machine_info(); + } + #endif #if ENABLED(DUAL_X_CARRIAGE) bool IDEX_saved_duplication_state = extruder_duplication_enabled; @@ -209,131 +182,134 @@ void GcodeSuite::G28() { #if ENABLED(MARLIN_DEV_MODE) if (parser.seen('S')) { LOOP_XYZ(a) set_axis_is_at_home((AxisEnum)a); - sync_plan_position(); + SYNC_PLAN_POSITION_KINEMATIC(); SERIAL_ECHOLNPGM("Simulated Homing"); report_current_position(); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< G28"); + #endif return; } #endif - // Home (O)nly if position is unknown - if (!homing_needed() && parser.boolval('O')) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> homing not needed, skip"); + if (all_axes_known() && parser.boolval('O')) { // home only if needed + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("> homing not needed, skip"); + SERIAL_ECHOLNPGM("<<< G28"); + } + #endif return; } - planner.synchronize(); // Wait for planner moves to finish! - - SET_SOFT_ENDSTOP_LOOSE(false); // Reset a leftover 'loose' motion state + // Wait for planner moves to finish! + planner.synchronize(); // Disable the leveling matrix before homing #if HAS_LEVELING // Cancel the active G29 session - TERN_(PROBE_MANUALLY, g29_in_progress = false); + #if ENABLED(PROBE_MANUALLY) + extern bool g29_in_progress; + g29_in_progress = false; + #endif - TERN_(RESTORE_LEVELING_AFTER_G28, const bool leveling_was_active = planner.leveling_active); + #if ENABLED(RESTORE_LEVELING_AFTER_G28) + const bool leveling_was_active = planner.leveling_active; + #endif set_bed_leveling_enabled(false); #endif - TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY); - - // Count this command as movement / activity - reset_stepper_timeout(); - - #define HAS_CURRENT_HOME(N) (defined(N##_CURRENT_HOME) && N##_CURRENT_HOME != N##_CURRENT) - #if HAS_CURRENT_HOME(X) || HAS_CURRENT_HOME(X2) || HAS_CURRENT_HOME(Y) || HAS_CURRENT_HOME(Y2) - #define HAS_HOMING_CURRENT 1 + #if ENABLED(CNC_WORKSPACE_PLANES) + workspace_plane = PLANE_XY; #endif - #if HAS_HOMING_CURRENT - auto debug_current = [](PGM_P const s, const int16_t a, const int16_t b){ - serialprintPGM(s); DEBUG_ECHOLNPAIR(" current: ", a, " -> ", b); - }; - #if HAS_CURRENT_HOME(X) - const int16_t tmc_save_current_X = stepperX.getMilliamps(); - stepperX.rms_current(X_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(PSTR("X"), tmc_save_current_X, X_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(X2) - const int16_t tmc_save_current_X2 = stepperX2.getMilliamps(); - stepperX2.rms_current(X2_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(PSTR("X2"), tmc_save_current_X2, X2_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(Y) - const int16_t tmc_save_current_Y = stepperY.getMilliamps(); - stepperY.rms_current(Y_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(PSTR("Y"), tmc_save_current_Y, Y_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(Y2) - const int16_t tmc_save_current_Y2 = stepperY2.getMilliamps(); - stepperY2.rms_current(Y2_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(PSTR("Y2"), tmc_save_current_Y2, Y2_CURRENT_HOME); - #endif + #if ENABLED(BLTOUCH) + bltouch_init(); #endif - TERN_(IMPROVE_HOMING_RELIABILITY, slow_homing_t slow_homing = begin_slow_homing()); - // Always home with tool 0 active - #if HAS_MULTI_HOTEND + #if HOTENDS > 1 #if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE) const uint8_t old_tool_index = active_extruder; #endif - tool_change(0, true); + tool_change(0, 0, true); #endif - TERN_(HAS_DUPLICATION_MODE, extruder_duplication_enabled = false); - - remember_feedrate_scaling_off(); + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + extruder_duplication_enabled = false; + #endif + setup_for_endstop_or_probe_move(); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> endstops.enable(true)"); + #endif endstops.enable(true); // Enable endstops for next homing move #if ENABLED(DELTA) - constexpr bool doZ = true; // for NANODLP_Z_SYNC if your DLP is on a DELTA - home_delta(); - - TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); + UNUSED(always_home_all); #else // NOT DELTA - const bool homeZ = parser.seen('Z'), - needX = homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(X_AXIS))), - needY = homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(Y_AXIS))), - homeX = needX || parser.seen('X'), homeY = needY || parser.seen('Y'), - home_all = homeX == homeY && homeX == homeZ, // All or None - doX = home_all || homeX, doY = home_all || homeY, doZ = home_all || homeZ; + const bool homeX = always_home_all || parser.seen('X'), + homeY = always_home_all || parser.seen('Y'), + homeZ = always_home_all || parser.seen('Z'), + home_all = (!homeX && !homeY && !homeZ) || (homeX && homeY && homeZ); + + set_destination_from_current(); #if Z_HOME_DIR > 0 // If homing away from BED do Z first - if (doZ) homeaxis(Z_AXIS); + if (home_all || homeZ) homeaxis(Z_AXIS); #endif - const float z_homing_height = - ENABLED(UNKNOWN_Z_NO_RAISE) && !TEST(axis_known_position, Z_AXIS) - ? 0 - : (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT); + const float z_homing_height = ( + #if ENABLED(UNKNOWN_Z_NO_RAISE) + !TEST(axis_known_position, Z_AXIS) ? 0 : + #endif + (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT) + ); - if (z_homing_height && (doX || doY || (ENABLED(Z_SAFE_HOMING) && doZ))) { + if (z_homing_height && (home_all || homeX || homeY)) { // Raise Z before homing any other axes and z is not already high enough (never lower z) - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); - do_z_clearance(z_homing_height, true, DISABLED(UNKNOWN_Z_NO_RAISE)); + destination[Z_AXIS] = z_homing_height; + if (destination[Z_AXIS] > current_position[Z_AXIS]) { + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) + SERIAL_ECHOLNPAIR("Raise Z (before homing) to ", destination[Z_AXIS]); + #endif + + do_blocking_move_to_z(destination[Z_AXIS]); + } } #if ENABLED(QUICK_HOME) - if (doX && doY) quick_home_xy(); + if (home_all || (homeX && homeY)) quick_home_xy(); #endif // Home Y (before X) - if (ENABLED(HOME_Y_BEFORE_X) && (doY || (ENABLED(CODEPENDENT_XY_HOMING) && doX))) - homeaxis(Y_AXIS); + #if ENABLED(HOME_Y_BEFORE_X) + + if (home_all || homeY + #if ENABLED(CODEPENDENT_XY_HOMING) + || homeX + #endif + ) homeaxis(Y_AXIS); + + #endif // Home X - if (doX || (doY && ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X))) { + if (home_all || homeX + #if ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X) + || homeY + #endif + ) { #if ENABLED(DUAL_X_CARRIAGE) @@ -342,14 +318,14 @@ void GcodeSuite::G28() { homeaxis(X_AXIS); // Remember this extruder's position for later tool change - inactive_extruder_x_pos = current_position.x; + inactive_extruder_x_pos = current_position[X_AXIS]; // Home the 1st (left) extruder active_extruder = 0; homeaxis(X_AXIS); // Consider the active extruder to be parked - raised_parked_position = current_position; + COPY(raised_parked_position, current_position); delayed_move_time = 0; active_extruder_parked = true; @@ -361,26 +337,27 @@ void GcodeSuite::G28() { } // Home Y (after X) - if (DISABLED(HOME_Y_BEFORE_X) && doY) - homeaxis(Y_AXIS); - - TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); + #if DISABLED(HOME_Y_BEFORE_X) + if (home_all || homeY) homeaxis(Y_AXIS); + #endif // Home Z last if homing towards the bed #if Z_HOME_DIR < 0 + if (home_all || homeZ) { + #if ENABLED(Z_SAFE_HOMING) + home_z_safely(); + #else + homeaxis(Z_AXIS); + #endif - if (doZ) { - TERN_(BLTOUCH, bltouch.init()); - - TERN(Z_SAFE_HOMING, home_z_safely(), homeaxis(Z_AXIS)); - - probe.move_z_after_homing(); - - } // doZ + #if HOMING_Z_WITH_PROBE && defined(Z_AFTER_PROBING) + move_z_after_probing(); + #endif + } // home_all || homeZ #endif // Z_HOME_DIR < 0 - sync_plan_position(); + SYNC_PLAN_POSITION_KINEMATIC(); #endif // !DELTA (G28) @@ -392,90 +369,66 @@ void GcodeSuite::G28() { */ #if ENABLED(DUAL_X_CARRIAGE) - if (dxc_is_duplicating()) { - - TERN_(IMPROVE_HOMING_RELIABILITY, slow_homing = begin_slow_homing()); + if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) { // Always home the 2nd (right) extruder first active_extruder = 1; homeaxis(X_AXIS); // Remember this extruder's position for later tool change - inactive_extruder_x_pos = current_position.x; + inactive_extruder_x_pos = current_position[X_AXIS]; // Home the 1st (left) extruder active_extruder = 0; homeaxis(X_AXIS); // Consider the active extruder to be parked - raised_parked_position = current_position; + COPY(raised_parked_position, current_position); delayed_move_time = 0; active_extruder_parked = true; extruder_duplication_enabled = IDEX_saved_duplication_state; dual_x_carriage_mode = IDEX_saved_mode; - stepper.set_directions(); - - TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); } #endif // DUAL_X_CARRIAGE endstops.not_homing(); - // Clear endstop state for polled stallGuard endstops - TERN_(SPI_ENDSTOPS, endstops.clear_endstop_state()); - - #if BOTH(DELTA, DELTA_HOME_TO_SAFE_ZONE) + #if ENABLED(DELTA) && ENABLED(DELTA_HOME_TO_SAFE_ZONE) // move to a height where we can use the full xy-area do_blocking_move_to_z(delta_clip_start_height); #endif - TERN_(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_was_active)); + #if HAS_LEVELING && ENABLED(RESTORE_LEVELING_AFTER_G28) + set_bed_leveling_enabled(leveling_was_active); + #endif - restore_feedrate_and_scaling(); + clean_up_after_endstop_or_probe_move(); // Restore the active tool after homing - #if HAS_MULTI_HOTEND && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)) - tool_change(old_tool_index, NONE(PARKING_EXTRUDER, DUAL_X_CARRIAGE)); // Do move if one of these + #if HOTENDS > 1 && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)) + #if ENABLED(PARKING_EXTRUDER) + #define NO_FETCH false // fetch the previous toolhead + #else + #define NO_FETCH true + #endif + tool_change(old_tool_index, 0, NO_FETCH); #endif - #if HAS_HOMING_CURRENT - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore driver current..."); - #if HAS_CURRENT_HOME(X) - stepperX.rms_current(tmc_save_current_X); - #endif - #if HAS_CURRENT_HOME(X2) - stepperX2.rms_current(tmc_save_current_X2); - #endif - #if HAS_CURRENT_HOME(Y) - stepperY.rms_current(tmc_save_current_Y); - #endif - #if HAS_CURRENT_HOME(Y2) - stepperY2.rms_current(tmc_save_current_Y2); - #endif - #endif - - ui.refresh(); - - TERN_(DWIN_CREALITY_LCD, DWIN_CompletedHoming()); + lcd_refresh(); report_current_position(); + #if ENABLED(NANODLP_Z_SYNC) + #if ENABLED(NANODLP_ALL_AXIS) + #define _HOME_SYNC true // For any axis, output sync text. + #else + #define _HOME_SYNC (home_all || homeZ) // Only for Z-axis + #endif + if (_HOME_SYNC) + SERIAL_ECHOLNPGM(MSG_Z_MOVE_COMP); + #endif - if (ENABLED(NANODLP_Z_SYNC) && (doZ || ENABLED(NANODLP_ALL_AXIS))) - SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); - - #if HAS_L64XX - // Set L6470 absolute position registers to counts - // constexpr *might* move this to PROGMEM. - // If not, this will need a PROGMEM directive and an accessor. - static constexpr AxisEnum L64XX_axis_xref[MAX_L64XX] = { - X_AXIS, Y_AXIS, Z_AXIS, - X_AXIS, Y_AXIS, Z_AXIS, Z_AXIS, - E_AXIS, E_AXIS, E_AXIS, E_AXIS, E_AXIS, E_AXIS - }; - for (uint8_t j = 1; j <= L64XX::chain[0]; j++) { - const uint8_t cv = L64XX::chain[j]; - L64xxManager.set_param((L64XX_axis_t)cv, L6470_ABS_POS, stepper.position(L64XX_axis_xref[cv])); - } + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< G28"); #endif } diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 53af04d528..e9ae4eca44 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -35,7 +35,7 @@ #include "../../module/probe.h" #endif -#if HAS_MULTI_HOTEND +#if HOTENDS > 1 #include "../../module/tool_change.h" #endif @@ -63,9 +63,14 @@ enum CalEnum : char { // the 7 main calibration points - #define LOOP_CAL_RAD(VAR) LOOP_CAL_PT(VAR, __A, _7P_STEP) #define LOOP_CAL_ACT(VAR, _4P, _OP) LOOP_CAL_PT(VAR, _OP ? _AB : __A, _4P ? _4P_STEP : _7P_STEP) -TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); +#if HOTENDS > 1 + const uint8_t old_tool_index = active_extruder; + #define AC_CLEANUP() ac_cleanup(old_tool_index) +#else + #define AC_CLEANUP() ac_cleanup() +#endif -float lcd_probe_pt(const xy_pos_t &xy); +float lcd_probe_pt(const float &rx, const float &ry); void ac_home() { endstops.enable(true); @@ -74,55 +79,73 @@ void ac_home() { } void ac_setup(const bool reset_bed) { - TERN_(HAS_MULTI_HOTEND, tool_change(0, true)); + #if HOTENDS > 1 + tool_change(0, 0, true); + #endif planner.synchronize(); - remember_feedrate_scaling_off(); + setup_for_endstop_or_probe_move(); #if HAS_LEVELING if (reset_bed) reset_bed_level(); // After full calibration bed-level data is no longer valid #endif } -void ac_cleanup(TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index)) { - TERN_(DELTA_HOME_TO_SAFE_ZONE, do_blocking_move_to_z(delta_clip_start_height)); - TERN_(HAS_BED_PROBE, probe.stow()); - restore_feedrate_and_scaling(); - TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, true)); +void ac_cleanup( + #if HOTENDS > 1 + const uint8_t old_tool_index + #endif +) { + #if ENABLED(DELTA_HOME_TO_SAFE_ZONE) + do_blocking_move_to_z(delta_clip_start_height); + #endif + #if HAS_BED_PROBE + STOW_PROBE(); + #endif + clean_up_after_endstop_or_probe_move(); + #if HOTENDS > 1 + tool_change(old_tool_index, 0, true); + #endif } -void print_signed_float(PGM_P const prefix, const float &f) { - SERIAL_ECHOPGM(" "); +void print_signed_float(const char * const prefix, const float &f) { + SERIAL_PROTOCOLPGM(" "); serialprintPGM(prefix); - SERIAL_CHAR(':'); + SERIAL_PROTOCOLCHAR(':'); if (f >= 0) SERIAL_CHAR('+'); - SERIAL_ECHO_F(f, 2); + SERIAL_PROTOCOL_F(f, 2); } /** * - Print the delta settings */ static void print_calibration_settings(const bool end_stops, const bool tower_angles) { - SERIAL_ECHOPAIR(".Height:", delta_height); + SERIAL_PROTOCOLPAIR(".Height:", delta_height); if (end_stops) { - print_signed_float(PSTR("Ex"), delta_endstop_adj.a); - print_signed_float(PSTR("Ey"), delta_endstop_adj.b); - print_signed_float(PSTR("Ez"), delta_endstop_adj.c); + print_signed_float(PSTR("Ex"), delta_endstop_adj[A_AXIS]); + print_signed_float(PSTR("Ey"), delta_endstop_adj[B_AXIS]); + print_signed_float(PSTR("Ez"), delta_endstop_adj[C_AXIS]); } if (end_stops && tower_angles) { - SERIAL_ECHOPAIR(" Radius:", delta_radius); + SERIAL_PROTOCOLPAIR(" Radius:", delta_radius); SERIAL_EOL(); SERIAL_CHAR('.'); - SERIAL_ECHO_SP(13); + SERIAL_PROTOCOL_SP(13); } if (tower_angles) { - print_signed_float(PSTR("Tx"), delta_tower_angle_trim.a); - print_signed_float(PSTR("Ty"), delta_tower_angle_trim.b); - print_signed_float(PSTR("Tz"), delta_tower_angle_trim.c); + print_signed_float(PSTR("Tx"), delta_tower_angle_trim[A_AXIS]); + print_signed_float(PSTR("Ty"), delta_tower_angle_trim[B_AXIS]); + print_signed_float(PSTR("Tz"), delta_tower_angle_trim[C_AXIS]); } if ((!end_stops && tower_angles) || (end_stops && !tower_angles)) { // XOR - SERIAL_ECHOPAIR(" Radius:", delta_radius); + SERIAL_PROTOCOLPAIR(" Radius:", delta_radius); } + #if HAS_BED_PROBE + if (!end_stops && !tower_angles) { + SERIAL_PROTOCOL_SP(30); + print_signed_float(PSTR("Offset"), zprobe_zoffset); + } + #endif SERIAL_EOL(); } @@ -130,7 +153,7 @@ static void print_calibration_settings(const bool end_stops, const bool tower_an * - Print the probe results */ static void print_calibration_results(const float z_pt[NPP + 1], const bool tower_points, const bool opposite_points) { - SERIAL_ECHOPGM(". "); + SERIAL_PROTOCOLPGM(". "); print_signed_float(PSTR("c"), z_pt[CEN]); if (tower_points) { print_signed_float(PSTR(" x"), z_pt[__A]); @@ -140,7 +163,7 @@ static void print_calibration_results(const float z_pt[NPP + 1], const bool towe if (tower_points && opposite_points) { SERIAL_EOL(); SERIAL_CHAR('.'); - SERIAL_ECHO_SP(13); + SERIAL_PROTOCOL_SP(13); } if (opposite_points) { print_signed_float(PSTR("yz"), z_pt[_BC]); @@ -162,28 +185,39 @@ static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool S2 += sq(z_pt[rad]); N++; } - return LROUND(SQRT(S2 / N) * 1000.0f) / 1000.0f + 0.00001f; + return LROUND(SQRT(S2 / N) * 1000.0) / 1000.0 + 0.00001; } } - return 0.00001f; + return 0.00001; } /** * - Probe a point */ -static float calibration_probe(const xy_pos_t &xy, const bool stow) { +static float calibration_probe(const float &nx, const float &ny, const bool stow, const bool set_up) { #if HAS_BED_PROBE - return probe.probe_at_point(xy, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, true, false); + return probe_pt(nx, ny, set_up ? PROBE_PT_BIG_RAISE : stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, false); #else UNUSED(stow); - return lcd_probe_pt(xy); + UNUSED(set_up); + return lcd_probe_pt(nx, ny); #endif } +#if HAS_BED_PROBE && ENABLED(ULTIPANEL) + static float probe_z_shift(const float center) { + STOW_PROBE(); + endstops.enable_z_probe(false); + float z_shift = lcd_probe_pt(0, 0) - center; + endstops.enable_z_probe(true); + return z_shift; + } +#endif + /** * - Probe a grid */ -static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each) { +static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each, const bool set_up) { const bool _0p_calibration = probe_points == 0, _1p_calibration = probe_points == 1 || probe_points == -1, _4p_calibration = probe_points == 2, @@ -201,26 +235,22 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi _7p_6_center = probe_points >= 5 && probe_points <= 7, _7p_9_center = probe_points >= 8; - LOOP_CAL_ALL(rad) z_pt[rad] = 0.0f; + LOOP_CAL_ALL(rad) z_pt[rad] = 0.0; if (!_0p_calibration) { - const float dcr = delta_calibration_radius(); - if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center - const xy_pos_t center{0}; - z_pt[CEN] += calibration_probe(center, stow_after_each); + z_pt[CEN] += calibration_probe(0, 0, stow_after_each, set_up); if (isnan(z_pt[CEN])) return false; } if (_7p_calibration) { // probe extra center points - const float start = _7p_9_center ? float(_CA) + _7P_STEP / 3.0f : _7p_6_center ? float(_CA) : float(__C), - steps = _7p_9_center ? _4P_STEP / 3.0f : _7p_6_center ? _7P_STEP : _4P_STEP; + const float start = _7p_9_center ? float(_CA) + _7P_STEP / 3.0 : _7p_6_center ? float(_CA) : float(__C), + steps = _7p_9_center ? _4P_STEP / 3.0 : _7p_6_center ? _7P_STEP : _4P_STEP; I_LOOP_CAL_PT(rad, start, steps) { const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), - r = dcr * 0.1; - const xy_pos_t vec = { cos(a), sin(a) }; - z_pt[CEN] += calibration_probe(vec * r, stow_after_each); + r = delta_calibration_radius * 0.1; + z_pt[CEN] += calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up); if (isnan(z_pt[CEN])) return false; } z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points); @@ -228,13 +258,13 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi if (!_1p_calibration) { // probe the radius const CalEnum start = _4p_opposite_points ? _AB : __A; - const float steps = _7p_14_intermediates ? _7P_STEP / 15.0f : // 15r * 6 + 10c = 100 - _7p_11_intermediates ? _7P_STEP / 12.0f : // 12r * 6 + 9c = 81 - _7p_8_intermediates ? _7P_STEP / 9.0f : // 9r * 6 + 10c = 64 - _7p_6_intermediates ? _7P_STEP / 7.0f : // 7r * 6 + 7c = 49 - _7p_4_intermediates ? _7P_STEP / 5.0f : // 5r * 6 + 6c = 36 - _7p_2_intermediates ? _7P_STEP / 3.0f : // 3r * 6 + 7c = 25 - _7p_1_intermediates ? _7P_STEP / 2.0f : // 2r * 6 + 4c = 16 + const float steps = _7p_14_intermediates ? _7P_STEP / 15.0 : // 15r * 6 + 10c = 100 + _7p_11_intermediates ? _7P_STEP / 12.0 : // 12r * 6 + 9c = 81 + _7p_8_intermediates ? _7P_STEP / 9.0 : // 9r * 6 + 10c = 64 + _7p_6_intermediates ? _7P_STEP / 7.0 : // 7r * 6 + 7c = 49 + _7p_4_intermediates ? _7P_STEP / 5.0 : // 5r * 6 + 6c = 36 + _7p_2_intermediates ? _7P_STEP / 3.0 : // 3r * 6 + 7c = 25 + _7p_1_intermediates ? _7P_STEP / 2.0 : // 2r * 6 + 4c = 16 _7p_no_intermediates ? _7P_STEP : // 1r * 6 + 3c = 9 _4P_STEP; // .5r * 6 + 1c = 4 bool zig_zag = true; @@ -242,10 +272,9 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi const int8_t offset = _7p_9_center ? 2 : 0; for (int8_t circle = 0; circle <= offset; circle++) { const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), - r = dcr * (1 - 0.1 * (zig_zag ? offset - circle : circle)), - interpol = FMOD(rad, 1); - const xy_pos_t vec = { cos(a), sin(a) }; - const float z_temp = calibration_probe(vec * r, stow_after_each); + r = delta_calibration_radius * (1 - 0.1 * (zig_zag ? offset - circle : circle)), + interpol = fmod(rad, 1); + const float z_temp = calibration_probe(cos(a) * r, sin(a) * r, stow_after_each, set_up); if (isnan(z_temp)) return false; // split probe point to neighbouring calibration points z_pt[uint8_t(LROUND(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90))); @@ -257,7 +286,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi LOOP_CAL_RAD(rad) z_pt[rad] /= _7P_STEP / steps; - do_blocking_move_to_xy(0.0f, 0.0f); + do_blocking_move_to_xy(0.0, 0.0); } } return true; @@ -269,90 +298,102 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi * - formulae for approximative forward kinematics in the end-stop displacement matrix * - definition of the matrix scaling parameters */ -static void reverse_kinematics_probe_points(float z_pt[NPP + 1], abc_float_t mm_at_pt_axis[NPP + 1]) { - xyz_pos_t pos{0}; +static void reverse_kinematics_probe_points(float z_pt[NPP + 1], float mm_at_pt_axis[NPP + 1][ABC]) { + float pos[XYZ] = { 0.0 }; - const float dcr = delta_calibration_radius(); LOOP_CAL_ALL(rad) { const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), - r = (rad == CEN ? 0.0f : dcr); - pos.set(cos(a) * r, sin(a) * r, z_pt[rad]); + r = (rad == CEN ? 0.0 : delta_calibration_radius); + pos[X_AXIS] = cos(a) * r; + pos[Y_AXIS] = sin(a) * r; + pos[Z_AXIS] = z_pt[rad]; inverse_kinematics(pos); - mm_at_pt_axis[rad] = delta; + LOOP_XYZ(axis) mm_at_pt_axis[rad][axis] = delta[axis]; } } -static void forward_kinematics_probe_points(abc_float_t mm_at_pt_axis[NPP + 1], float z_pt[NPP + 1]) { - const float r_quot = delta_calibration_radius() / delta_radius; +static void forward_kinematics_probe_points(float mm_at_pt_axis[NPP + 1][ABC], float z_pt[NPP + 1]) { + const float r_quot = delta_calibration_radius / delta_radius; - #define ZPP(N,I,A) (((1.0f + r_quot * (N)) / 3.0f) * mm_at_pt_axis[I].A) + #define ZPP(N,I,A) ((1 / 3.0 + r_quot * (N) / 3.0 ) * mm_at_pt_axis[I][A]) #define Z00(I, A) ZPP( 0, I, A) #define Zp1(I, A) ZPP(+1, I, A) #define Zm1(I, A) ZPP(-1, I, A) #define Zp2(I, A) ZPP(+2, I, A) #define Zm2(I, A) ZPP(-2, I, A) - z_pt[CEN] = Z00(CEN, a) + Z00(CEN, b) + Z00(CEN, c); - z_pt[__A] = Zp2(__A, a) + Zm1(__A, b) + Zm1(__A, c); - z_pt[__B] = Zm1(__B, a) + Zp2(__B, b) + Zm1(__B, c); - z_pt[__C] = Zm1(__C, a) + Zm1(__C, b) + Zp2(__C, c); - z_pt[_BC] = Zm2(_BC, a) + Zp1(_BC, b) + Zp1(_BC, c); - z_pt[_CA] = Zp1(_CA, a) + Zm2(_CA, b) + Zp1(_CA, c); - z_pt[_AB] = Zp1(_AB, a) + Zp1(_AB, b) + Zm2(_AB, c); + z_pt[CEN] = Z00(CEN, A_AXIS) + Z00(CEN, B_AXIS) + Z00(CEN, C_AXIS); + z_pt[__A] = Zp2(__A, A_AXIS) + Zm1(__A, B_AXIS) + Zm1(__A, C_AXIS); + z_pt[__B] = Zm1(__B, A_AXIS) + Zp2(__B, B_AXIS) + Zm1(__B, C_AXIS); + z_pt[__C] = Zm1(__C, A_AXIS) + Zm1(__C, B_AXIS) + Zp2(__C, C_AXIS); + z_pt[_BC] = Zm2(_BC, A_AXIS) + Zp1(_BC, B_AXIS) + Zp1(_BC, C_AXIS); + z_pt[_CA] = Zp1(_CA, A_AXIS) + Zm2(_CA, B_AXIS) + Zp1(_CA, C_AXIS); + z_pt[_AB] = Zp1(_AB, A_AXIS) + Zp1(_AB, B_AXIS) + Zm2(_AB, C_AXIS); } -static void calc_kinematics_diff_probe_points(float z_pt[NPP + 1], abc_float_t delta_e, const float delta_r, abc_float_t delta_t) { +static void calc_kinematics_diff_probe_points(float z_pt[NPP + 1], float delta_e[ABC], float delta_r, float delta_t[ABC]) { const float z_center = z_pt[CEN]; - abc_float_t diff_mm_at_pt_axis[NPP + 1], new_mm_at_pt_axis[NPP + 1]; + float diff_mm_at_pt_axis[NPP + 1][ABC], + new_mm_at_pt_axis[NPP + 1][ABC]; reverse_kinematics_probe_points(z_pt, diff_mm_at_pt_axis); delta_radius += delta_r; - delta_tower_angle_trim += delta_t; + LOOP_XYZ(axis) delta_tower_angle_trim[axis] += delta_t[axis]; recalc_delta_settings(); reverse_kinematics_probe_points(z_pt, new_mm_at_pt_axis); - LOOP_CAL_ALL(rad) diff_mm_at_pt_axis[rad] -= new_mm_at_pt_axis[rad] + delta_e; + LOOP_XYZ(axis) LOOP_CAL_ALL(rad) diff_mm_at_pt_axis[rad][axis] -= new_mm_at_pt_axis[rad][axis] + delta_e[axis]; forward_kinematics_probe_points(diff_mm_at_pt_axis, z_pt); LOOP_CAL_RAD(rad) z_pt[rad] -= z_pt[CEN] - z_center; z_pt[CEN] = z_center; delta_radius -= delta_r; - delta_tower_angle_trim -= delta_t; + LOOP_XYZ(axis) delta_tower_angle_trim[axis] -= delta_t[axis]; recalc_delta_settings(); } static float auto_tune_h() { - const float r_quot = delta_calibration_radius() / delta_radius; - return RECIPROCAL(r_quot / (2.0f / 3.0f)); // (2/3)/CR + const float r_quot = delta_calibration_radius / delta_radius; + float h_fac = 0.0; + + h_fac = r_quot / (2.0 / 3.0); + h_fac = 1.0f / h_fac; // (2/3)/CR + return h_fac; } static float auto_tune_r() { - constexpr float diff = 0.01f, delta_r = diff; - float r_fac = 0.0f, z_pt[NPP + 1] = { 0.0f }; - abc_float_t delta_e = { 0.0f }, delta_t = { 0.0f }; + const float diff = 0.01; + float r_fac = 0.0, + z_pt[NPP + 1] = { 0.0 }, + delta_e[ABC] = {0.0}, + delta_r = {0.0}, + delta_t[ABC] = {0.0}; + delta_r = diff; calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); - r_fac = -(z_pt[__A] + z_pt[__B] + z_pt[__C] + z_pt[_BC] + z_pt[_CA] + z_pt[_AB]) / 6.0f; - r_fac = diff / r_fac / 3.0f; // 1/(3*delta_Z) + r_fac = -(z_pt[__A] + z_pt[__B] + z_pt[__C] + z_pt[_BC] + z_pt[_CA] + z_pt[_AB]) / 6.0; + r_fac = diff / r_fac / 3.0; // 1/(3*delta_Z) return r_fac; } static float auto_tune_a() { - constexpr float diff = 0.01f, delta_r = 0.0f; - float a_fac = 0.0f, z_pt[NPP + 1] = { 0.0f }; - abc_float_t delta_e = { 0.0f }, delta_t = { 0.0f }; + const float diff = 0.01; + float a_fac = 0.0, + z_pt[NPP + 1] = { 0.0 }, + delta_e[ABC] = {0.0}, + delta_r = {0.0}, + delta_t[ABC] = {0.0}; - delta_t.reset(); LOOP_XYZ(axis) { + LOOP_XYZ(axis_2) delta_t[axis_2] = 0.0; delta_t[axis] = diff; calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); - delta_t[axis] = 0; - a_fac += z_pt[uint8_t((axis * _4P_STEP) - _7P_STEP + NPP) % NPP + 1] / 6.0f; - a_fac -= z_pt[uint8_t((axis * _4P_STEP) + 1 + _7P_STEP)] / 6.0f; + a_fac += z_pt[uint8_t((axis * _4P_STEP) - _7P_STEP + NPP) % NPP + 1] / 6.0; + a_fac -= z_pt[uint8_t((axis * _4P_STEP) + 1 + _7P_STEP)] / 6.0; } - a_fac = diff / a_fac / 3.0f; // 1/(3*delta_Z) + a_fac = diff / a_fac / 3.0; // 1/(3*delta_Z) return a_fac; } @@ -362,7 +403,10 @@ static float auto_tune_a() { * * Parameters: * + * S Setup mode; disables probe protection + * * Pn Number of probe points: + * P-1 Checks the z_offset with a center probe and paper test. * P0 Normalizes calibration. * P1 Calibrates height only with center probe. * P2 Probe center and towers. Calibrate height, endstops and delta radius. @@ -385,34 +429,49 @@ static float auto_tune_a() { */ void GcodeSuite::G33() { - const int8_t probe_points = parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS); - if (!WITHIN(probe_points, 0, 10)) { - SERIAL_ECHOLNPGM("?(P)oints implausible (0-10)."); + const bool set_up = + #if HAS_BED_PROBE + parser.seen('S'); + #else + false; + #endif + + const int8_t probe_points = set_up ? 2 : parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS); + if (!WITHIN(probe_points, -1, 10)) { + SERIAL_PROTOCOLLNPGM("?(P)oints is implausible (-1 - 10)."); return; } const bool towers_set = !parser.seen('T'); - const float calibration_precision = parser.floatval('C', 0.0f); + const float calibration_precision = set_up ? Z_CLEARANCE_BETWEEN_PROBES / 5.0 : parser.floatval('C', 0.0); if (calibration_precision < 0) { - SERIAL_ECHOLNPGM("?(C)alibration precision implausible (>=0)."); + SERIAL_PROTOCOLLNPGM("?(C)alibration precision is implausible (>=0)."); return; } const int8_t force_iterations = parser.intval('F', 0); if (!WITHIN(force_iterations, 0, 30)) { - SERIAL_ECHOLNPGM("?(F)orce iteration implausible (0-30)."); + SERIAL_PROTOCOLLNPGM("?(F)orce iteration is implausible (0 - 30)."); return; } const int8_t verbose_level = parser.byteval('V', 1); if (!WITHIN(verbose_level, 0, 3)) { - SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-3)."); + SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0 - 3)."); return; } const bool stow_after_each = parser.seen('E'); + if (set_up) { + delta_height = 999.99; + delta_radius = DELTA_PRINTABLE_RADIUS; + ZERO(delta_endstop_adj); + ZERO(delta_tower_angle_trim); + recalc_delta_settings(); + } + const bool _0p_calibration = probe_points == 0, _1p_calibration = probe_points == 1 || probe_points == -1, _4p_calibration = probe_points == 2, @@ -421,38 +480,49 @@ void GcodeSuite::G33() { _tower_results = (_4p_calibration && towers_set) || probe_points >= 3, _opposite_results = (_4p_calibration && !towers_set) || probe_points >= 3, _endstop_results = probe_points != 1 && probe_points != -1 && probe_points != 0, - _angle_results = probe_points >= 3 && towers_set; + _angle_results = probe_points >= 3 && towers_set; + static const char save_message[] PROGMEM = "Save with M500 and/or copy to Configuration.h"; int8_t iterations = 0; float test_precision, - zero_std_dev = (verbose_level ? 999.0f : 0.0f), // 0.0 in dry-run mode : forced end + zero_std_dev = (verbose_level ? 999.0 : 0.0), // 0.0 in dry-run mode : forced end zero_std_dev_min = zero_std_dev, zero_std_dev_old = zero_std_dev, - h_factor, r_factor, a_factor, + h_factor, + r_factor, + a_factor, + e_old[ABC] = { + delta_endstop_adj[A_AXIS], + delta_endstop_adj[B_AXIS], + delta_endstop_adj[C_AXIS] + }, r_old = delta_radius, - h_old = delta_height; + h_old = delta_height, + a_old[ABC] = { + delta_tower_angle_trim[A_AXIS], + delta_tower_angle_trim[B_AXIS], + delta_tower_angle_trim[C_AXIS] + }; - abc_pos_t e_old = delta_endstop_adj, a_old = delta_tower_angle_trim; - - SERIAL_ECHOLNPGM("G33 Auto Calibrate"); - - const float dcr = delta_calibration_radius(); + SERIAL_PROTOCOLLNPGM("G33 Auto Calibrate"); if (!_1p_calibration && !_0p_calibration) { // test if the outer radius is reachable LOOP_CAL_RAD(axis) { - const float a = RADIANS(210 + (360 / NPP) * (axis - 1)); - if (!position_is_reachable(cos(a) * dcr, sin(a) * dcr)) { - SERIAL_ECHOLNPGM("?Bed calibration radius implausible."); + const float a = RADIANS(210 + (360 / NPP) * (axis - 1)), + r = delta_calibration_radius; + if (!position_is_reachable(cos(a) * r, sin(a) * r)) { + SERIAL_PROTOCOLLNPGM("?(M665 B)ed radius is implausible."); return; } } } // Report settings - PGM_P const checkingac = PSTR("Checking... AC"); + const char* checkingac = PSTR("Checking... AC"); serialprintPGM(checkingac); - if (verbose_level == 0) SERIAL_ECHOPGM(" (DRY-RUN)"); + if (verbose_level == 0) SERIAL_PROTOCOLPGM(" (DRY-RUN)"); + if (set_up) SERIAL_PROTOCOLPGM(" (SET-UP)"); SERIAL_EOL(); - ui.set_status_P(checkingac); + lcd_setstatusPGM(checkingac); print_calibration_settings(_endstop_results, _angle_results); @@ -462,16 +532,16 @@ void GcodeSuite::G33() { do { // start iterations - float z_at_pt[NPP + 1] = { 0.0f }; + float z_at_pt[NPP + 1] = { 0.0 }; - test_precision = zero_std_dev_old != 999.0f ? (zero_std_dev + zero_std_dev_old) / 2.0f : zero_std_dev; + test_precision = zero_std_dev_old != 999.0 ? (zero_std_dev + zero_std_dev_old) / 2 : zero_std_dev; iterations++; // Probe the points zero_std_dev_old = zero_std_dev; - if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each)) { - SERIAL_ECHOLNPGM("Correct delta settings with M665 and M666"); - return ac_cleanup(TERN_(HAS_MULTI_HOTEND, old_tool_index)); + if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each, set_up)) { + SERIAL_PROTOCOLLNPGM("Correct delta settings with M665 and M666"); + return AC_CLEANUP(); } zero_std_dev = std_dev_points(z_at_pt, _0p_calibration, _1p_calibration, _4p_calibration, _4p_opposite_points); @@ -480,19 +550,20 @@ void GcodeSuite::G33() { if ((zero_std_dev < test_precision || iterations <= force_iterations) && zero_std_dev > calibration_precision) { #if !HAS_BED_PROBE - test_precision = 0.0f; // forced end + test_precision = 0.00; // forced end #endif if (zero_std_dev < zero_std_dev_min) { // set roll-back point - e_old = delta_endstop_adj; + COPY(e_old, delta_endstop_adj); r_old = delta_radius; h_old = delta_height; - a_old = delta_tower_angle_trim; + COPY(a_old, delta_tower_angle_trim); } - abc_float_t e_delta = { 0.0f }, t_delta = { 0.0f }; - float r_delta = 0.0f; + float e_delta[ABC] = { 0.0 }, + r_delta = 0.0, + t_delta[ABC] = { 0.0 }; /** * convergence matrices: @@ -500,7 +571,7 @@ void GcodeSuite::G33() { * - definition of the matrix scaling parameters * - matrices for 4 and 7 point calibration */ - #define ZP(N,I) ((N) * z_at_pt[I] / 4.0f) // 4.0 = divider to normalize to integers + #define ZP(N,I) ((N) * z_at_pt[I] / 4.0) // 4.0 = divider to normalize to integers #define Z12(I) ZP(12, I) #define Z4(I) ZP(4, I) #define Z2(I) ZP(2, I) @@ -508,73 +579,79 @@ void GcodeSuite::G33() { #define Z0(I) ZP(0, I) // calculate factors - if (_7p_9_center) calibration_radius_factor = 0.9f; + const float cr_old = delta_calibration_radius; + if (_7p_9_center) delta_calibration_radius *= 0.9; h_factor = auto_tune_h(); r_factor = auto_tune_r(); a_factor = auto_tune_a(); - calibration_radius_factor = 1.0f; + delta_calibration_radius = cr_old; switch (probe_points) { + case -1: + #if HAS_BED_PROBE && ENABLED(ULTIPANEL) + zprobe_zoffset += probe_z_shift(z_at_pt[CEN]); + #endif + case 0: - test_precision = 0.0f; // forced end + test_precision = 0.00; // forced end break; case 1: - test_precision = 0.0f; // forced end + test_precision = 0.00; // forced end LOOP_XYZ(axis) e_delta[axis] = +Z4(CEN); break; case 2: if (towers_set) { // see 4 point calibration (towers) matrix - e_delta.set((+Z4(__A) -Z2(__B) -Z2(__C)) * h_factor +Z4(CEN), - (-Z2(__A) +Z4(__B) -Z2(__C)) * h_factor +Z4(CEN), - (-Z2(__A) -Z2(__B) +Z4(__C)) * h_factor +Z4(CEN)); - r_delta = (+Z4(__A) +Z4(__B) +Z4(__C) -Z12(CEN)) * r_factor; + e_delta[A_AXIS] = (+Z4(__A) -Z2(__B) -Z2(__C)) * h_factor +Z4(CEN); + e_delta[B_AXIS] = (-Z2(__A) +Z4(__B) -Z2(__C)) * h_factor +Z4(CEN); + e_delta[C_AXIS] = (-Z2(__A) -Z2(__B) +Z4(__C)) * h_factor +Z4(CEN); + r_delta = (+Z4(__A) +Z4(__B) +Z4(__C) -Z12(CEN)) * r_factor; } else { // see 4 point calibration (opposites) matrix - e_delta.set((-Z4(_BC) +Z2(_CA) +Z2(_AB)) * h_factor +Z4(CEN), - (+Z2(_BC) -Z4(_CA) +Z2(_AB)) * h_factor +Z4(CEN), - (+Z2(_BC) +Z2(_CA) -Z4(_AB)) * h_factor +Z4(CEN)); - r_delta = (+Z4(_BC) +Z4(_CA) +Z4(_AB) -Z12(CEN)) * r_factor; + e_delta[A_AXIS] = (-Z4(_BC) +Z2(_CA) +Z2(_AB)) * h_factor +Z4(CEN); + e_delta[B_AXIS] = (+Z2(_BC) -Z4(_CA) +Z2(_AB)) * h_factor +Z4(CEN); + e_delta[C_AXIS] = (+Z2(_BC) +Z2(_CA) -Z4(_AB)) * h_factor +Z4(CEN); + r_delta = (+Z4(_BC) +Z4(_CA) +Z4(_AB) -Z12(CEN)) * r_factor; } break; default: // see 7 point calibration (towers & opposites) matrix - e_delta.set((+Z2(__A) -Z1(__B) -Z1(__C) -Z2(_BC) +Z1(_CA) +Z1(_AB)) * h_factor +Z4(CEN), - (-Z1(__A) +Z2(__B) -Z1(__C) +Z1(_BC) -Z2(_CA) +Z1(_AB)) * h_factor +Z4(CEN), - (-Z1(__A) -Z1(__B) +Z2(__C) +Z1(_BC) +Z1(_CA) -Z2(_AB)) * h_factor +Z4(CEN)); - r_delta = (+Z2(__A) +Z2(__B) +Z2(__C) +Z2(_BC) +Z2(_CA) +Z2(_AB) -Z12(CEN)) * r_factor; + e_delta[A_AXIS] = (+Z2(__A) -Z1(__B) -Z1(__C) -Z2(_BC) +Z1(_CA) +Z1(_AB)) * h_factor +Z4(CEN); + e_delta[B_AXIS] = (-Z1(__A) +Z2(__B) -Z1(__C) +Z1(_BC) -Z2(_CA) +Z1(_AB)) * h_factor +Z4(CEN); + e_delta[C_AXIS] = (-Z1(__A) -Z1(__B) +Z2(__C) +Z1(_BC) +Z1(_CA) -Z2(_AB)) * h_factor +Z4(CEN); + r_delta = (+Z2(__A) +Z2(__B) +Z2(__C) +Z2(_BC) +Z2(_CA) +Z2(_AB) -Z12(CEN)) * r_factor; if (towers_set) { // see 7 point tower angle calibration (towers & opposites) matrix - t_delta.set((+Z0(__A) -Z4(__B) +Z4(__C) +Z0(_BC) -Z4(_CA) +Z4(_AB) +Z0(CEN)) * a_factor, - (+Z4(__A) +Z0(__B) -Z4(__C) +Z4(_BC) +Z0(_CA) -Z4(_AB) +Z0(CEN)) * a_factor, - (-Z4(__A) +Z4(__B) +Z0(__C) -Z4(_BC) +Z4(_CA) +Z0(_AB) +Z0(CEN)) * a_factor); + t_delta[A_AXIS] = (+Z0(__A) -Z4(__B) +Z4(__C) +Z0(_BC) -Z4(_CA) +Z4(_AB) +Z0(CEN)) * a_factor; + t_delta[B_AXIS] = (+Z4(__A) +Z0(__B) -Z4(__C) +Z4(_BC) +Z0(_CA) -Z4(_AB) +Z0(CEN)) * a_factor; + t_delta[C_AXIS] = (-Z4(__A) +Z4(__B) +Z0(__C) -Z4(_BC) +Z4(_CA) +Z0(_AB) +Z0(CEN)) * a_factor; } break; } - delta_endstop_adj += e_delta; + LOOP_XYZ(axis) delta_endstop_adj[axis] += e_delta[axis]; delta_radius += r_delta; - delta_tower_angle_trim += t_delta; + LOOP_XYZ(axis) delta_tower_angle_trim[axis] += t_delta[axis]; } else if (zero_std_dev >= test_precision) { // roll back - delta_endstop_adj = e_old; + COPY(delta_endstop_adj, e_old); delta_radius = r_old; delta_height = h_old; - delta_tower_angle_trim = a_old; + COPY(delta_tower_angle_trim, a_old); } if (verbose_level != 0) { // !dry run - // Normalize angles to least-squares + // normalise angles to least squares if (_angle_results) { - float a_sum = 0.0f; + float a_sum = 0.0; LOOP_XYZ(axis) a_sum += delta_tower_angle_trim[axis]; - LOOP_XYZ(axis) delta_tower_angle_trim[axis] -= a_sum / 3.0f; + LOOP_XYZ(axis) delta_tower_angle_trim[axis] -= a_sum / 3.0; } // adjust delta_height and endstops by the max amount - const float z_temp = _MAX(delta_endstop_adj.a, delta_endstop_adj.b, delta_endstop_adj.c); + const float z_temp = MAX3(delta_endstop_adj[A_AXIS], delta_endstop_adj[B_AXIS], delta_endstop_adj[C_AXIS]); delta_height -= z_temp; LOOP_XYZ(axis) delta_endstop_adj[axis] -= z_temp; } @@ -588,61 +665,67 @@ void GcodeSuite::G33() { if (verbose_level != 0) { // !dry run if ((zero_std_dev >= test_precision && iterations > force_iterations) || zero_std_dev <= calibration_precision) { // end iterations - SERIAL_ECHOPGM("Calibration OK"); - SERIAL_ECHO_SP(32); + SERIAL_PROTOCOLPGM("Calibration OK"); + SERIAL_PROTOCOL_SP(32); #if HAS_BED_PROBE if (zero_std_dev >= test_precision && !_1p_calibration && !_0p_calibration) - SERIAL_ECHOPGM("rolling back."); + SERIAL_PROTOCOLPGM("rolling back."); else #endif { - SERIAL_ECHOPAIR_F("std dev:", zero_std_dev_min, 3); + SERIAL_PROTOCOLPGM("std dev:"); + SERIAL_PROTOCOL_F(zero_std_dev_min, 3); } SERIAL_EOL(); char mess[21]; strcpy_P(mess, PSTR("Calibration sd:")); if (zero_std_dev_min < 1) - sprintf_P(&mess[15], PSTR("0.%03i"), (int)LROUND(zero_std_dev_min * 1000.0f)); + sprintf_P(&mess[15], PSTR("0.%03i"), (int)LROUND(zero_std_dev_min * 1000.0)); else sprintf_P(&mess[15], PSTR("%03i.x"), (int)LROUND(zero_std_dev_min)); - ui.set_status(mess); + lcd_setstatus(mess); print_calibration_settings(_endstop_results, _angle_results); - SERIAL_ECHOLNPGM("Save with M500 and/or copy to Configuration.h"); + serialprintPGM(save_message); + SERIAL_EOL(); } else { // !end iterations char mess[15]; if (iterations < 31) - sprintf_P(mess, PSTR("Iteration : %02i"), (unsigned int)iterations); + sprintf_P(mess, PSTR("Iteration : %02i"), (int)iterations); else strcpy_P(mess, PSTR("No convergence")); - SERIAL_ECHO(mess); - SERIAL_ECHO_SP(32); - SERIAL_ECHOLNPAIR_F("std dev:", zero_std_dev, 3); - ui.set_status(mess); + SERIAL_PROTOCOL(mess); + SERIAL_PROTOCOL_SP(32); + SERIAL_PROTOCOLPGM("std dev:"); + SERIAL_PROTOCOL_F(zero_std_dev, 3); + SERIAL_EOL(); + lcd_setstatus(mess); if (verbose_level > 1) print_calibration_settings(_endstop_results, _angle_results); } } else { // dry run - PGM_P const enddryrun = PSTR("End DRY-RUN"); + const char *enddryrun = PSTR("End DRY-RUN"); serialprintPGM(enddryrun); - SERIAL_ECHO_SP(35); - SERIAL_ECHOLNPAIR_F("std dev:", zero_std_dev, 3); + SERIAL_PROTOCOL_SP(35); + SERIAL_PROTOCOLPGM("std dev:"); + SERIAL_PROTOCOL_F(zero_std_dev, 3); + SERIAL_EOL(); char mess[21]; strcpy_P(mess, enddryrun); strcpy_P(&mess[11], PSTR(" sd:")); if (zero_std_dev < 1) - sprintf_P(&mess[15], PSTR("0.%03i"), (int)LROUND(zero_std_dev * 1000.0f)); + sprintf_P(&mess[15], PSTR("0.%03i"), (int)LROUND(zero_std_dev * 1000.0)); else sprintf_P(&mess[15], PSTR("%03i.x"), (int)LROUND(zero_std_dev)); - ui.set_status(mess); + lcd_setstatus(mess); } ac_home(); } while (((zero_std_dev < test_precision && iterations < 31) || iterations <= force_iterations) && zero_std_dev > calibration_precision); - ac_cleanup(TERN_(HAS_MULTI_HOTEND, old_tool_index)); + AC_CLEANUP(); } #endif // DELTA_AUTO_CALIBRATION diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp deleted file mode 100644 index 0ca4490eb6..0000000000 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) - -#include "../gcode.h" -#include "../../module/motion.h" -#include "../../module/stepper.h" -#include "../../module/endstops.h" - -#if HAS_LEVELING - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../../core/debug_out.h" - -void GcodeSuite::G34() { - - // Home before the alignment procedure - if (!all_axes_known()) home_all_axes(); - - SET_SOFT_ENDSTOP_LOOSE(true); - TEMPORARY_BED_LEVELING_STATE(false); - TemporaryGlobalEndstopsState unlock_z(false); - - #ifdef GANTRY_CALIBRATION_COMMANDS_PRE - gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_PRE)); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Sub Commands Processed"); - #endif - - #ifdef GANTRY_CALIBRATION_SAFE_POSITION - // Move XY to safe position - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Parking XY"); - const xy_pos_t safe_pos = GANTRY_CALIBRATION_SAFE_POSITION; - do_blocking_move_to(safe_pos, MMM_TO_MMS(GANTRY_CALIBRATION_XY_PARK_FEEDRATE)); - #endif - - const float move_distance = parser.intval('Z', GANTRY_CALIBRATION_EXTRA_HEIGHT), - zbase = ENABLED(GANTRY_CALIBRATION_TO_MIN) ? Z_MIN_POS : Z_MAX_POS, - zpounce = zbase - move_distance, zgrind = zbase + move_distance; - - // Move Z to pounce position - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Setting Z Pounce"); - do_blocking_move_to_z(zpounce, MMM_TO_MMS(HOMING_FEEDRATE_Z)); - - // Store current motor settings, then apply reduced value - - #define _REDUCE_CURRENT ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_DAC, HAS_MOTOR_CURRENT_I2C, HAS_TRINAMIC_CONFIG) - #if _REDUCE_CURRENT - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Reducing Current"); - #endif - - #if HAS_MOTOR_CURRENT_SPI - const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; - stepper.set_digipot_current(Z_AXIS, target_current); - #elif HAS_MOTOR_CURRENT_PWM - const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; - stepper.set_digipot_current(1, target_current); - #elif HAS_MOTOR_CURRENT_DAC - const float target_current = parser.floatval('S', GANTRY_CALIBRATION_CURRENT); - const float previous_current = dac_amps(Z_AXIS, target_current); - stepper_dac.set_current_value(Z_AXIS, target_current); - #elif ENABLED(HAS_MOTOR_CURRENT_I2C) - const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - previous_current = dac_amps(Z_AXIS); - digipot_i2c.set_current(Z_AXIS, target_current) - #elif HAS_TRINAMIC_CONFIG - const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - static uint16_t previous_current_arr[NUM_Z_STEPPER_DRIVERS]; - #if AXIS_IS_TMC(Z) - previous_current_arr[0] = stepperZ.getMilliamps(); - stepperZ.rms_current(target_current); - #endif - #if AXIS_IS_TMC(Z2) - previous_current_arr[1] = stepperZ2.getMilliamps(); - stepperZ2.rms_current(target_current); - #endif - #if AXIS_IS_TMC(Z3) - previous_current_arr[2] = stepperZ3.getMilliamps(); - stepperZ3.rms_current(target_current); - #endif - #if AXIS_IS_TMC(Z4) - previous_current_arr[3] = stepperZ4.getMilliamps(); - stepperZ4.rms_current(target_current); - #endif - #endif - - // Do Final Z move to adjust - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Final Z Move"); - do_blocking_move_to_z(zgrind, MMM_TO_MMS(GANTRY_CALIBRATION_FEEDRATE)); - - // Back off end plate, back to normal motion range - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Z Backoff"); - do_blocking_move_to_z(zpounce, MMM_TO_MMS(GANTRY_CALIBRATION_FEEDRATE)); - - #if _REDUCE_CURRENT - // Reset current to original values - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore Current"); - #endif - - #if HAS_MOTOR_CURRENT_SPI - stepper.set_digipot_current(Z_AXIS, previous_current); - #elif HAS_MOTOR_CURRENT_PWM - stepper.set_digipot_current(1, previous_current); - #elif HAS_MOTOR_CURRENT_DAC - stepper_dac.set_current_value(Z_AXIS, previous_current); - #elif ENABLED(HAS_MOTOR_CURRENT_I2C) - digipot_i2c.set_current(Z_AXIS, previous_current) - #elif HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(Z) - stepperZ.rms_current(previous_current_arr[0]); - #endif - #if AXIS_IS_TMC(Z2) - stepperZ2.rms_current(previous_current_arr[1]); - #endif - #if AXIS_IS_TMC(Z3) - stepperZ3.rms_current(previous_current_arr[2]); - #endif - #if AXIS_IS_TMC(Z4) - stepperZ4.rms_current(previous_current_arr[3]); - #endif - #endif - - #ifdef GANTRY_CALIBRATION_COMMANDS_POST - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Running Post Commands"); - gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_POST)); - #endif - - SET_SOFT_ENDSTOP_LOOSE(false); -} - -#endif // MECHANICAL_GANTRY_CALIBRATION diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp deleted file mode 100644 index 24292477f9..0000000000 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ /dev/null @@ -1,514 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(Z_STEPPER_AUTO_ALIGN) - -#include "../../feature/z_stepper_align.h" - -#include "../gcode.h" -#include "../../module/motion.h" -#include "../../module/stepper.h" -#include "../../module/planner.h" -#include "../../module/probe.h" -#include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM - -#if HAS_LEVELING - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#if HAS_MULTI_HOTEND - #include "../../module/tool_change.h" -#endif - -#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - #include "../../libs/least_squares_fit.h" -#endif - -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../../core/debug_out.h" - -/** - * G34: Z-Stepper automatic alignment - * - * I - * T - * A - * R points based on current probe offsets - */ -void GcodeSuite::G34() { - DEBUG_SECTION(log_G34, "G34", DEBUGGING(LEVELING)); - if (DEBUGGING(LEVELING)) log_machine_info(); - - do { // break out on error - - #if NUM_Z_STEPPER_DRIVERS == 4 - SERIAL_ECHOLNPGM("Alignment for 4 steppers is Experimental!"); - #elif NUM_Z_STEPPER_DRIVERS > 4 - SERIAL_ECHOLNPGM("Alignment not supported for over 4 steppers"); - break; - #endif - - const int8_t z_auto_align_iterations = parser.intval('I', Z_STEPPER_ALIGN_ITERATIONS); - if (!WITHIN(z_auto_align_iterations, 1, 30)) { - SERIAL_ECHOLNPGM("?(I)teration out of bounds (1-30)."); - break; - } - - const float z_auto_align_accuracy = parser.floatval('T', Z_STEPPER_ALIGN_ACC); - if (!WITHIN(z_auto_align_accuracy, 0.01f, 1.0f)) { - SERIAL_ECHOLNPGM("?(T)arget accuracy out of bounds (0.01-1.0)."); - break; - } - - const float z_auto_align_amplification = - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - Z_STEPPER_ALIGN_AMP; - #else - parser.floatval('A', Z_STEPPER_ALIGN_AMP); - if (!WITHIN(ABS(z_auto_align_amplification), 0.5f, 2.0f)) { - SERIAL_ECHOLNPGM("?(A)mplification out of bounds (0.5-2.0)."); - break; - } - #endif - - if (parser.seen('R')) z_stepper_align.reset_to_default(); - - const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - - // Wait for planner moves to finish! - planner.synchronize(); - - // Disable the leveling matrix before auto-aligning - #if HAS_LEVELING - TERN_(RESTORE_LEVELING_AFTER_G34, const bool leveling_was_active = planner.leveling_active); - set_bed_leveling_enabled(false); - #endif - - TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY); - - // Always home with tool 0 active - #if HAS_MULTI_HOTEND - const uint8_t old_tool_index = active_extruder; - tool_change(0, true); - #endif - - TERN_(HAS_DUPLICATION_MODE, extruder_duplication_enabled = false); - - // In BLTOUCH HS mode, the probe travels in a deployed state. - // Users of G34 might have a badly misaligned bed, so raise Z by the - // length of the deployed pin (BLTOUCH stroke < 7mm) - #define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE)) - - // Compute a worst-case clearance height to probe from. After the first - // iteration this will be re-calculated based on the actual bed position - auto magnitude2 = [&](const uint8_t i, const uint8_t j) { - const xy_pos_t diff = z_stepper_align.xy[i] - z_stepper_align.xy[j]; - return HYPOT2(diff.x, diff.y); - }; - float z_probe = Z_BASIC_CLEARANCE + (G34_MAX_GRADE) * 0.01f * SQRT( - #if NUM_Z_STEPPER_DRIVERS == 3 - _MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 0)) - #elif NUM_Z_STEPPER_DRIVERS == 4 - _MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 3), - magnitude2(3, 0), magnitude2(0, 2), magnitude2(1, 3)) - #else - magnitude2(0, 1) - #endif - ); - - // Home before the alignment procedure - if (!all_axes_known()) home_all_axes(); - - // Move the Z coordinate realm towards the positive - dirty trick - current_position.z += z_probe * 0.5f; - sync_plan_position(); - // Now, the Z origin lies below the build plate. That allows to probe deeper, before run_z_probe throws an error. - // This hack is un-done at the end of G34 - either by re-homing, or by using the probed heights of the last iteration. - - #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - float last_z_align_move[NUM_Z_STEPPER_DRIVERS] = ARRAY_N(NUM_Z_STEPPER_DRIVERS, 10000.0f, 10000.0f, 10000.0f, 10000.0f); - #else - float last_z_align_level_indicator = 10000.0f; - #endif - float z_measured[NUM_Z_STEPPER_DRIVERS] = { 0 }, - z_maxdiff = 0.0f, - amplification = z_auto_align_amplification; - - #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - bool adjustment_reverse = false; - #endif - - #if HAS_DISPLAY - PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION); - const uint8_t iter_str_len = strlen_P(msg_iteration); - #endif - - // Final z and iteration values will be used after breaking the loop - float z_measured_min; - uint8_t iteration = 0; - bool err_break = false; // To break out of nested loops - while (iteration < z_auto_align_iterations) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> probing all positions."); - - const int iter = iteration + 1; - SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter); - #if HAS_DISPLAY - char str[iter_str_len + 2 + 1]; - sprintf_P(str, msg_iteration, iter); - ui.set_status(str); - #endif - - // Initialize minimum value - z_measured_min = 100000.0f; - float z_measured_max = -100000.0f; - - // Probe all positions (one per Z-Stepper) - LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { - // iteration odd/even --> downward / upward stepper sequence - const uint8_t iprobe = (iteration & 1) ? NUM_Z_STEPPER_DRIVERS - 1 - i : i; - - // Safe clearance even on an incline - if ((iteration == 0 || i > 0) && z_probe > current_position.z) do_blocking_move_to_z(z_probe); - - if (DEBUGGING(LEVELING)) - DEBUG_ECHOLNPAIR_P(PSTR("Probing X"), z_stepper_align.xy[iprobe].x, SP_Y_STR, z_stepper_align.xy[iprobe].y); - - // Probe a Z height for each stepper. - // Probing sanity check is disabled, as it would trigger even in normal cases because - // current_position.z has been manually altered in the "dirty trick" above. - const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false); - if (isnan(z_probed_height)) { - SERIAL_ECHOLNPGM("Probing failed"); - LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); - err_break = true; - break; - } - - // Add height to each value, to provide a more useful target height for - // the next iteration of probing. This allows adjustments to be made away from the bed. - z_measured[iprobe] = z_probed_height + Z_CLEARANCE_BETWEEN_PROBES; - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(iprobe + 1), " measured position is ", z_measured[iprobe]); - - // Remember the minimum measurement to calculate the correction later on - z_measured_min = _MIN(z_measured_min, z_measured[iprobe]); - z_measured_max = _MAX(z_measured_max, z_measured[iprobe]); - } // for (i) - - if (err_break) break; - - // Adapt the next probe clearance height based on the new measurements. - // Safe_height = lowest distance to bed (= highest measurement) plus highest measured misalignment. - z_maxdiff = z_measured_max - z_measured_min; - z_probe = Z_BASIC_CLEARANCE + z_measured_max + z_maxdiff; - - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - // Replace the initial values in z_measured with calculated heights at - // each stepper position. This allows the adjustment algorithm to be - // shared between both possible probing mechanisms. - - // This must be done after the next z_probe height is calculated, so that - // the height is calculated from actual print area positions, and not - // extrapolated motor movements. - - // Compute the least-squares fit for all probed points. - // Calculate the Z position of each stepper and store it in z_measured. - // This allows the actual adjustment logic to be shared by both algorithms. - linear_fit_data lfd; - incremental_LSF_reset(&lfd); - LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { - SERIAL_ECHOLNPAIR("PROBEPT_", int(i), ": ", z_measured[i]); - incremental_LSF(&lfd, z_stepper_align.xy[i], z_measured[i]); - } - finish_incremental_LSF(&lfd); - - z_measured_min = 100000.0f; - LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { - z_measured[i] = -(lfd.A * z_stepper_align.stepper_xy[i].x + lfd.B * z_stepper_align.stepper_xy[i].y + lfd.D); - z_measured_min = _MIN(z_measured_min, z_measured[i]); - } - - SERIAL_ECHOLNPAIR("CALCULATED STEPPER POSITIONS: Z1=", z_measured[0], " Z2=", z_measured[1], " Z3=", z_measured[2]); - #endif - - SERIAL_ECHOLNPAIR("\n" - "DIFFERENCE Z1-Z2=", ABS(z_measured[0] - z_measured[1]) - #if NUM_Z_STEPPER_DRIVERS == 3 - , " Z2-Z3=", ABS(z_measured[1] - z_measured[2]) - , " Z3-Z1=", ABS(z_measured[2] - z_measured[0]) - #endif - ); - #if HAS_DISPLAY - char fstr1[10]; - #if NUM_Z_STEPPER_DRIVERS == 2 - char msg[6 + (6 + 5) * 1 + 1]; - #else - char msg[6 + (6 + 5) * 3 + 1], fstr2[10], fstr3[10]; - #endif - sprintf_P(msg, - PSTR("Diffs Z1-Z2=%s" - #if NUM_Z_STEPPER_DRIVERS == 3 - " Z2-Z3=%s" - " Z3-Z1=%s" - #endif - ), dtostrf(ABS(z_measured[0] - z_measured[1]), 1, 3, fstr1) - #if NUM_Z_STEPPER_DRIVERS == 3 - , dtostrf(ABS(z_measured[1] - z_measured[2]), 1, 3, fstr2) - , dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3) - #endif - ); - ui.set_status(msg); - #endif - - auto decreasing_accuracy = [](const float &v1, const float &v2){ - if (v1 < v2 * 0.7f) { - SERIAL_ECHOLNPGM("Decreasing Accuracy Detected."); - LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY); - return true; - } - return false; - }; - - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - - // Check if the applied corrections go in the correct direction. - // Calculate the sum of the absolute deviations from the mean of the probe measurements. - // Compare to the last iteration to ensure it's getting better. - - // Calculate mean value as a reference - float z_measured_mean = 0.0f; - LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) z_measured_mean += z_measured[zstepper]; - z_measured_mean /= NUM_Z_STEPPER_DRIVERS; - - // Calculate the sum of the absolute deviations from the mean value - float z_align_level_indicator = 0.0f; - LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) - z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean); - - // If it's getting worse, stop and throw an error - err_break = decreasing_accuracy(last_z_align_level_indicator, z_align_level_indicator); - if (err_break) break; - - last_z_align_level_indicator = z_align_level_indicator; - #endif - - // The following correction actions are to be enabled for select Z-steppers only - stepper.set_separate_multi_axis(true); - - bool success_break = true; - // Correct the individual stepper offsets - LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) { - // Calculate current stepper move - float z_align_move = z_measured[zstepper] - z_measured_min; - const float z_align_abs = ABS(z_align_move); - - #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - // Optimize one iteration's correction based on the first measurements - if (z_align_abs) amplification = (iteration == 1) ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification; - - // Check for less accuracy compared to last move - if (decreasing_accuracy(last_z_align_move[zstepper], z_align_abs)) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs); - adjustment_reverse = !adjustment_reverse; - } - - // Remember the alignment for the next iteration, but only if steppers move, - // otherwise it would be just zero (in case this stepper was at z_measured_min already) - if (z_align_abs > 0) last_z_align_move[zstepper] = z_align_abs; - #endif - - // Stop early if all measured points achieve accuracy target - if (z_align_abs > z_auto_align_accuracy) success_break = false; - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " corrected by ", z_align_move); - - // Lock all steppers except one - stepper.set_all_z_lock(true, zstepper); - - #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - // Decreasing accuracy was detected so move was inverted. - // Will match reversed Z steppers on dual steppers. Triple will need more work to map. - if (adjustment_reverse) { - z_align_move = -z_align_move; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " correction reversed to ", z_align_move); - } - #endif - - // Do a move to correct part of the misalignment for the current stepper - do_blocking_move_to_z(amplification * z_align_move + current_position.z); - } // for (zstepper) - - // Back to normal stepper operations - stepper.set_all_z_lock(false); - stepper.set_separate_multi_axis(false); - - if (err_break) break; - - if (success_break) { - SERIAL_ECHOLNPGM("Target accuracy achieved."); - LCD_MESSAGEPGM(MSG_ACCURACY_ACHIEVED); - break; - } - - iteration++; - } // while (iteration < z_auto_align_iterations) - - if (err_break) - SERIAL_ECHOLNPGM("G34 aborted."); - else { - SERIAL_ECHOLNPAIR("Did ", int(iteration + (iteration != z_auto_align_iterations)), " of ", int(z_auto_align_iterations)); - SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff); - } - - // Stow the probe, as the last call to probe.probe_at_point(...) left - // the probe deployed if it was successful. - probe.stow(); - - #if ENABLED(HOME_AFTER_G34) - // After this operation the z position needs correction - set_axis_never_homed(Z_AXIS); - // Home Z after the alignment procedure - process_subcommands_now_P(PSTR("G28Z")); - #else - // Use the probed height from the last iteration to determine the Z height. - // z_measured_min is used, because all steppers are aligned to z_measured_min. - // Ideally, this would be equal to the 'z_probe * 0.5f' which was added earlier. - current_position.z -= z_measured_min - (float)Z_CLEARANCE_BETWEEN_PROBES; - sync_plan_position(); - #endif - - // Restore the active tool after homing - TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, DISABLED(PARKING_EXTRUDER))); // Fetch previous tool for parking extruder - - #if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34) - set_bed_leveling_enabled(leveling_was_active); - #endif - - }while(0); -} - -/** - * M422: Set a Z-Stepper automatic alignment XY point. - * Use repeatedly to set multiple points. - * - * S : Index of the probe point to set - * - * With Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS: - * W : Index of the Z stepper position to set - * The W and S parameters may not be combined. - * - * S and W require an X and/or Y parameter - * X : X position to set (Unchanged if omitted) - * Y : Y position to set (Unchanged if omitted) - * - * R : Recalculate points based on current probe offsets - */ -void GcodeSuite::M422() { - - if (parser.seen('R')) { - z_stepper_align.reset_to_default(); - return; - } - - if (!parser.seen_any()) { - LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) - SERIAL_ECHOLNPAIR_P(PSTR("M422 S"), int(i + 1), SP_X_STR, z_stepper_align.xy[i].x, SP_Y_STR, z_stepper_align.xy[i].y); - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) - SERIAL_ECHOLNPAIR_P(PSTR("M422 W"), int(i + 1), SP_X_STR, z_stepper_align.stepper_xy[i].x, SP_Y_STR, z_stepper_align.stepper_xy[i].y); - #endif - return; - } - - const bool is_probe_point = parser.seen('S'); - - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - if (is_probe_point && parser.seen('W')) { - SERIAL_ECHOLNPGM("?(S) and (W) may not be combined."); - return; - } - #endif - - xy_pos_t *pos_dest = ( - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - !is_probe_point ? z_stepper_align.stepper_xy : - #endif - z_stepper_align.xy - ); - - if (!is_probe_point - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - && !parser.seen('W') - #endif - ) { - SERIAL_ECHOLNPGM( - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - "?(S) or (W) is required." - #else - "?(S) is required." - #endif - ); - return; - } - - // Get the Probe Position Index or Z Stepper Index - int8_t position_index; - if (is_probe_point) { - position_index = parser.intval('S') - 1; - if (!WITHIN(position_index, 0, int8_t(NUM_Z_STEPPER_DRIVERS) - 1)) { - SERIAL_ECHOLNPGM("?(S) Z-ProbePosition index invalid."); - return; - } - } - else { - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - position_index = parser.intval('W') - 1; - if (!WITHIN(position_index, 0, NUM_Z_STEPPER_DRIVERS - 1)) { - SERIAL_ECHOLNPGM("?(W) Z-Stepper index invalid."); - return; - } - #endif - } - - const xy_pos_t pos = { - parser.floatval('X', pos_dest[position_index].x), - parser.floatval('Y', pos_dest[position_index].y) - }; - - if (is_probe_point) { - if (!probe.can_reach(pos.x, Y_CENTER)) { - SERIAL_ECHOLNPGM("?(X) out of bounds."); - return; - } - if (!probe.can_reach(pos)) { - SERIAL_ECHOLNPGM("?(Y) out of bounds."); - return; - } - } - - pos_dest[position_index] = pos; -} - -#endif // Z_STEPPER_AUTO_ALIGN diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp deleted file mode 100644 index 8968f78999..0000000000 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ /dev/null @@ -1,621 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../MarlinCore.h" - -#if ENABLED(CALIBRATION_GCODE) - -#include "../gcode.h" - -#if ENABLED(BACKLASH_GCODE) - #include "../../feature/backlash.h" -#endif - -#include "../../lcd/ultralcd.h" -#include "../../module/motion.h" -#include "../../module/planner.h" -#include "../../module/tool_change.h" -#include "../../module/endstops.h" -#include "../../feature/bedlevel/bedlevel.h" - -#if !AXIS_CAN_CALIBRATE(X) - #undef CALIBRATION_MEASURE_LEFT - #undef CALIBRATION_MEASURE_RIGHT -#endif - -#if !AXIS_CAN_CALIBRATE(Y) - #undef CALIBRATION_MEASURE_FRONT - #undef CALIBRATION_MEASURE_BACK -#endif - -#if !AXIS_CAN_CALIBRATE(Z) - #undef CALIBRATION_MEASURE_AT_TOP_EDGES -#endif - -/** - * G425 backs away from the calibration object by various distances - * depending on the confidence level: - * - * UNKNOWN - No real notion on where the calibration object is on the bed - * UNCERTAIN - Measurement may be uncertain due to backlash - * CERTAIN - Measurement obtained with backlash compensation - */ - -#ifndef CALIBRATION_MEASUREMENT_UNKNOWN - #define CALIBRATION_MEASUREMENT_UNKNOWN 5.0 // mm -#endif -#ifndef CALIBRATION_MEASUREMENT_UNCERTAIN - #define CALIBRATION_MEASUREMENT_UNCERTAIN 1.0 // mm -#endif -#ifndef CALIBRATION_MEASUREMENT_CERTAIN - #define CALIBRATION_MEASUREMENT_CERTAIN 0.5 // mm -#endif - -#if BOTH(CALIBRATION_MEASURE_LEFT, CALIBRATION_MEASURE_RIGHT) - #define HAS_X_CENTER 1 -#endif -#if BOTH(CALIBRATION_MEASURE_FRONT, CALIBRATION_MEASURE_BACK) - #define HAS_Y_CENTER 1 -#endif - -enum side_t : uint8_t { TOP, RIGHT, FRONT, LEFT, BACK, NUM_SIDES }; - -static constexpr xyz_pos_t true_center CALIBRATION_OBJECT_CENTER; -static constexpr xyz_float_t dimensions CALIBRATION_OBJECT_DIMENSIONS; -static constexpr xy_float_t nod = { CALIBRATION_NOZZLE_OUTER_DIAMETER, CALIBRATION_NOZZLE_OUTER_DIAMETER }; - -struct measurements_t { - xyz_pos_t obj_center = true_center; // Non-static must be assigned from xyz_pos_t - - float obj_side[NUM_SIDES], backlash[NUM_SIDES]; - xyz_float_t pos_error; - - xy_float_t nozzle_outer_dimension = nod; -}; - -#if ENABLED(BACKLASH_GCODE) - #define TEMPORARY_BACKLASH_CORRECTION(value) REMEMBER(tbst, backlash.correction, value) -#else - #define TEMPORARY_BACKLASH_CORRECTION(value) -#endif - -#if ENABLED(BACKLASH_GCODE) && defined(BACKLASH_SMOOTHING_MM) - #define TEMPORARY_BACKLASH_SMOOTHING(value) REMEMBER(tbsm, backlash.smoothing_mm, value) -#else - #define TEMPORARY_BACKLASH_SMOOTHING(value) -#endif - -inline void calibration_move() { - do_blocking_move_to(current_position, MMM_TO_MMS(CALIBRATION_FEEDRATE_TRAVEL)); -} - -/** - * Move to the exact center above the calibration object - * - * m in - Measurement record - * uncertainty in - How far away from the object top to park - */ -inline void park_above_object(measurements_t &m, const float uncertainty) { - // Move to safe distance above calibration object - current_position.z = m.obj_center.z + dimensions.z / 2 + uncertainty; - calibration_move(); - - // Move to center of calibration object in XY - current_position = xy_pos_t(m.obj_center); - calibration_move(); -} - -#if HAS_MULTI_HOTEND - inline void set_nozzle(measurements_t &m, const uint8_t extruder) { - if (extruder != active_extruder) { - park_above_object(m, CALIBRATION_MEASUREMENT_UNKNOWN); - tool_change(extruder); - } - } -#endif - -#if HAS_HOTEND_OFFSET - - inline void normalize_hotend_offsets() { - LOOP_S_L_N(e, 1, HOTENDS) - hotend_offset[e] -= hotend_offset[0]; - hotend_offset[0].reset(); - } - -#endif - -inline bool read_calibration_pin() { - return ( - #if PIN_EXISTS(CALIBRATION) - READ(CALIBRATION_PIN) != CALIBRATION_PIN_INVERTING - #elif HAS_CUSTOM_PROBE_PIN - READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING - #else - READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING - #endif - ); -} - -/** - * Move along axis in the specified dir until the probe value becomes stop_state, - * then return the axis value. - * - * axis in - Axis along which the measurement will take place - * dir in - Direction along that axis (-1 or 1) - * stop_state in - Move until probe pin becomes this value - * fast in - Fast vs. precise measurement - */ -float measuring_movement(const AxisEnum axis, const int dir, const bool stop_state, const bool fast) { - const float step = fast ? 0.25 : CALIBRATION_MEASUREMENT_RESOLUTION; - const feedRate_t mms = fast ? MMM_TO_MMS(CALIBRATION_FEEDRATE_FAST) : MMM_TO_MMS(CALIBRATION_FEEDRATE_SLOW); - const float limit = fast ? 50 : 5; - - destination = current_position; - for (float travel = 0; travel < limit; travel += step) { - destination[axis] += dir * step; - do_blocking_move_to(destination, mms); - planner.synchronize(); - if (read_calibration_pin() == stop_state) break; - } - return destination[axis]; -} - -/** - * Move along axis until the probe is triggered. Move toolhead to its starting - * point and return the measured value. - * - * axis in - Axis along which the measurement will take place - * dir in - Direction along that axis (-1 or 1) - * stop_state in - Move until probe pin becomes this value - * backlash_ptr in/out - When not nullptr, measure and record axis backlash - * uncertainty in - If uncertainty is CALIBRATION_MEASUREMENT_UNKNOWN, do a fast probe. - */ -inline float measure(const AxisEnum axis, const int dir, const bool stop_state, float * const backlash_ptr, const float uncertainty) { - const bool fast = uncertainty == CALIBRATION_MEASUREMENT_UNKNOWN; - - // Save position - destination = current_position; - const float start_pos = destination[axis]; - const float measured_pos = measuring_movement(axis, dir, stop_state, fast); - // Measure backlash - if (backlash_ptr && !fast) { - const float release_pos = measuring_movement(axis, -dir, !stop_state, fast); - *backlash_ptr = ABS(release_pos - measured_pos); - } - // Return to starting position - destination[axis] = start_pos; - do_blocking_move_to(destination, MMM_TO_MMS(CALIBRATION_FEEDRATE_TRAVEL)); - return measured_pos; -} - -/** - * Probe one side of the calibration object - * - * m in/out - Measurement record, m.obj_center and m.obj_side will be updated. - * uncertainty in - How far away from the calibration object to begin probing - * side in - Side of probe where probe will occur - * probe_top_at_edge in - When probing sides, probe top of calibration object nearest edge - * to find out height of edge - */ -inline void probe_side(measurements_t &m, const float uncertainty, const side_t side, const bool probe_top_at_edge=false) { - const xyz_float_t dimensions = CALIBRATION_OBJECT_DIMENSIONS; - AxisEnum axis; - float dir = 1; - - park_above_object(m, uncertainty); - - switch (side) { - #if AXIS_CAN_CALIBRATE(Z) - case TOP: { - const float measurement = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty); - m.obj_center.z = measurement - dimensions.z / 2; - m.obj_side[TOP] = measurement; - return; - } - #endif - #if AXIS_CAN_CALIBRATE(X) - case LEFT: axis = X_AXIS; break; - case RIGHT: axis = X_AXIS; dir = -1; break; - #endif - #if AXIS_CAN_CALIBRATE(Y) - case FRONT: axis = Y_AXIS; break; - case BACK: axis = Y_AXIS; dir = -1; break; - #endif - default: return; - } - - if (probe_top_at_edge) { - #if AXIS_CAN_CALIBRATE(Z) - // Probe top nearest the side we are probing - current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 - m.nozzle_outer_dimension[axis]); - calibration_move(); - m.obj_side[TOP] = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty); - m.obj_center.z = m.obj_side[TOP] - dimensions.z / 2; - #endif - } - - if ((AXIS_CAN_CALIBRATE(X) && axis == X_AXIS) || (AXIS_CAN_CALIBRATE(Y) && axis == Y_AXIS)) { - // Move to safe distance to the side of the calibration object - current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2 + uncertainty); - calibration_move(); - - // Plunge below the side of the calibration object and measure - current_position.z = m.obj_side[TOP] - (CALIBRATION_NOZZLE_TIP_HEIGHT) * 0.7f; - calibration_move(); - const float measurement = measure(axis, dir, true, &m.backlash[side], uncertainty); - m.obj_center[axis] = measurement + dir * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2); - m.obj_side[side] = measurement; - } -} - -/** - * Probe all sides of the calibration calibration object - * - * m in/out - Measurement record: center, backlash and error values be updated. - * uncertainty in - How far away from the calibration object to begin probing - */ -inline void probe_sides(measurements_t &m, const float uncertainty) { - #if ENABLED(CALIBRATION_MEASURE_AT_TOP_EDGES) - constexpr bool probe_top_at_edge = true; - #else - // Probing at the exact center only works if the center is flat. Probing on a washer - // or bolt will require probing the top near the side edges, away from the center. - constexpr bool probe_top_at_edge = false; - probe_side(m, uncertainty, TOP); - #endif - - TERN_(CALIBRATION_MEASURE_RIGHT, probe_side(m, uncertainty, RIGHT, probe_top_at_edge)); - TERN_(CALIBRATION_MEASURE_FRONT, probe_side(m, uncertainty, FRONT, probe_top_at_edge)); - TERN_(CALIBRATION_MEASURE_LEFT, probe_side(m, uncertainty, LEFT, probe_top_at_edge)); - TERN_(CALIBRATION_MEASURE_BACK, probe_side(m, uncertainty, BACK, probe_top_at_edge)); - - // Compute the measured center of the calibration object. - TERN_(HAS_X_CENTER, m.obj_center.x = (m.obj_side[LEFT] + m.obj_side[RIGHT]) / 2); - TERN_(HAS_Y_CENTER, m.obj_center.y = (m.obj_side[FRONT] + m.obj_side[BACK]) / 2); - - // Compute the outside diameter of the nozzle at the height - // at which it makes contact with the calibration object - TERN_(HAS_X_CENTER, m.nozzle_outer_dimension.x = m.obj_side[RIGHT] - m.obj_side[LEFT] - dimensions.x); - TERN_(HAS_Y_CENTER, m.nozzle_outer_dimension.y = m.obj_side[BACK] - m.obj_side[FRONT] - dimensions.y); - - park_above_object(m, uncertainty); - - // The difference between the known and the measured location - // of the calibration object is the positional error - m.pos_error.x = (0 - #if HAS_X_CENTER - + true_center.x - m.obj_center.x - #endif - ); - m.pos_error.y = (0 - #if HAS_Y_CENTER - + true_center.y - m.obj_center.y - #endif - ); - m.pos_error.z = true_center.z - m.obj_center.z; -} - -#if ENABLED(CALIBRATION_REPORTING) - inline void report_measured_faces(const measurements_t &m) { - SERIAL_ECHOLNPGM("Sides:"); - #if AXIS_CAN_CALIBRATE(Z) - SERIAL_ECHOLNPAIR(" Top: ", m.obj_side[TOP]); - #endif - #if ENABLED(CALIBRATION_MEASURE_LEFT) - SERIAL_ECHOLNPAIR(" Left: ", m.obj_side[LEFT]); - #endif - #if ENABLED(CALIBRATION_MEASURE_RIGHT) - SERIAL_ECHOLNPAIR(" Right: ", m.obj_side[RIGHT]); - #endif - #if ENABLED(CALIBRATION_MEASURE_FRONT) - SERIAL_ECHOLNPAIR(" Front: ", m.obj_side[FRONT]); - #endif - #if ENABLED(CALIBRATION_MEASURE_BACK) - SERIAL_ECHOLNPAIR(" Back: ", m.obj_side[BACK]); - #endif - SERIAL_EOL(); - } - - inline void report_measured_center(const measurements_t &m) { - SERIAL_ECHOLNPGM("Center:"); - #if HAS_X_CENTER - SERIAL_ECHOLNPAIR_P(SP_X_STR, m.obj_center.x); - #endif - #if HAS_Y_CENTER - SERIAL_ECHOLNPAIR_P(SP_Y_STR, m.obj_center.y); - #endif - SERIAL_ECHOLNPAIR_P(SP_Z_STR, m.obj_center.z); - SERIAL_EOL(); - } - - inline void report_measured_backlash(const measurements_t &m) { - SERIAL_ECHOLNPGM("Backlash:"); - #if AXIS_CAN_CALIBRATE(X) - #if ENABLED(CALIBRATION_MEASURE_LEFT) - SERIAL_ECHOLNPAIR(" Left: ", m.backlash[LEFT]); - #endif - #if ENABLED(CALIBRATION_MEASURE_RIGHT) - SERIAL_ECHOLNPAIR(" Right: ", m.backlash[RIGHT]); - #endif - #endif - #if AXIS_CAN_CALIBRATE(Y) - #if ENABLED(CALIBRATION_MEASURE_FRONT) - SERIAL_ECHOLNPAIR(" Front: ", m.backlash[FRONT]); - #endif - #if ENABLED(CALIBRATION_MEASURE_BACK) - SERIAL_ECHOLNPAIR(" Back: ", m.backlash[BACK]); - #endif - #endif - #if AXIS_CAN_CALIBRATE(Z) - SERIAL_ECHOLNPAIR(" Top: ", m.backlash[TOP]); - #endif - SERIAL_EOL(); - } - - inline void report_measured_positional_error(const measurements_t &m) { - SERIAL_CHAR('T'); - SERIAL_ECHO(int(active_extruder)); - SERIAL_ECHOLNPGM(" Positional Error:"); - #if HAS_X_CENTER - SERIAL_ECHOLNPAIR_P(SP_X_STR, m.pos_error.x); - #endif - #if HAS_Y_CENTER - SERIAL_ECHOLNPAIR_P(SP_Y_STR, m.pos_error.y); - #endif - if (AXIS_CAN_CALIBRATE(Z)) SERIAL_ECHOLNPAIR_P(SP_Z_STR, m.pos_error.z); - SERIAL_EOL(); - } - - inline void report_measured_nozzle_dimensions(const measurements_t &m) { - SERIAL_ECHOLNPGM("Nozzle Tip Outer Dimensions:"); - #if HAS_X_CENTER || HAS_Y_CENTER - #if HAS_X_CENTER - SERIAL_ECHOLNPAIR_P(SP_X_STR, m.nozzle_outer_dimension.x); - #endif - #if HAS_Y_CENTER - SERIAL_ECHOLNPAIR_P(SP_Y_STR, m.nozzle_outer_dimension.y); - #endif - #else - UNUSED(m); - #endif - SERIAL_EOL(); - } - - #if HAS_HOTEND_OFFSET - // - // This function requires normalize_hotend_offsets() to be called - // - inline void report_hotend_offsets() { - LOOP_S_L_N(e, 1, HOTENDS) - SERIAL_ECHOLNPAIR_P(PSTR("T"), int(e), PSTR(" Hotend Offset X"), hotend_offset[e].x, SP_Y_STR, hotend_offset[e].y, SP_Z_STR, hotend_offset[e].z); - } - #endif - -#endif // CALIBRATION_REPORTING - -/** - * Probe around the calibration object to measure backlash - * - * m in/out - Measurement record, updated with new readings - * uncertainty in - How far away from the object to begin probing - */ -inline void calibrate_backlash(measurements_t &m, const float uncertainty) { - // Backlash compensation should be off while measuring backlash - - { - // New scope for TEMPORARY_BACKLASH_CORRECTION - TEMPORARY_BACKLASH_CORRECTION(all_off); - TEMPORARY_BACKLASH_SMOOTHING(0.0f); - - probe_sides(m, uncertainty); - - #if ENABLED(BACKLASH_GCODE) - - #if HAS_X_CENTER - backlash.distance_mm.x = (m.backlash[LEFT] + m.backlash[RIGHT]) / 2; - #elif ENABLED(CALIBRATION_MEASURE_LEFT) - backlash.distance_mm.x = m.backlash[LEFT]; - #elif ENABLED(CALIBRATION_MEASURE_RIGHT) - backlash.distance_mm.x = m.backlash[RIGHT]; - #endif - - #if HAS_Y_CENTER - backlash.distance_mm.y = (m.backlash[FRONT] + m.backlash[BACK]) / 2; - #elif ENABLED(CALIBRATION_MEASURE_FRONT) - backlash.distance_mm.y = m.backlash[FRONT]; - #elif ENABLED(CALIBRATION_MEASURE_BACK) - backlash.distance_mm.y = m.backlash[BACK]; - #endif - - if (AXIS_CAN_CALIBRATE(Z)) backlash.distance_mm.z = m.backlash[TOP]; - #endif - } - - #if ENABLED(BACKLASH_GCODE) - // Turn on backlash compensation and move in all - // allowed directions to take up any backlash - { - // New scope for TEMPORARY_BACKLASH_CORRECTION - TEMPORARY_BACKLASH_CORRECTION(all_on); - TEMPORARY_BACKLASH_SMOOTHING(0.0f); - const xyz_float_t move = { AXIS_CAN_CALIBRATE(X) * 3, AXIS_CAN_CALIBRATE(Y) * 3, AXIS_CAN_CALIBRATE(Z) * 3 }; - current_position += move; calibration_move(); - current_position -= move; calibration_move(); - } - #endif -} - -inline void update_measurements(measurements_t &m, const AxisEnum axis) { - current_position[axis] += m.pos_error[axis]; - m.obj_center[axis] = true_center[axis]; - m.pos_error[axis] = 0; -} - -/** - * Probe around the calibration object. Adjust the position and toolhead offset - * using the deviation from the known position of the calibration object. - * - * m in/out - Measurement record, updated with new readings - * uncertainty in - How far away from the object to begin probing - * extruder in - What extruder to probe - * - * Prerequisites: - * - Call calibrate_backlash() beforehand for best accuracy - */ -inline void calibrate_toolhead(measurements_t &m, const float uncertainty, const uint8_t extruder) { - TEMPORARY_BACKLASH_CORRECTION(all_on); - TEMPORARY_BACKLASH_SMOOTHING(0.0f); - - #if HAS_MULTI_HOTEND - set_nozzle(m, extruder); - #else - UNUSED(extruder); - #endif - - probe_sides(m, uncertainty); - - // Adjust the hotend offset - #if HAS_HOTEND_OFFSET - if (ENABLED(HAS_X_CENTER) && AXIS_CAN_CALIBRATE(X)) hotend_offset[extruder].x += m.pos_error.x; - if (ENABLED(HAS_Y_CENTER) && AXIS_CAN_CALIBRATE(Y)) hotend_offset[extruder].y += m.pos_error.y; - if (AXIS_CAN_CALIBRATE(Z)) hotend_offset[extruder].z += m.pos_error.z; - normalize_hotend_offsets(); - #endif - - // Correct for positional error, so the object - // is at the known actual spot - planner.synchronize(); - if (ENABLED(HAS_X_CENTER) && AXIS_CAN_CALIBRATE(X)) update_measurements(m, X_AXIS); - if (ENABLED(HAS_Y_CENTER) && AXIS_CAN_CALIBRATE(Y)) update_measurements(m, Y_AXIS); - if (AXIS_CAN_CALIBRATE(Z)) update_measurements(m, Z_AXIS); - - sync_plan_position(); -} - -/** - * Probe around the calibration object for all toolheads, adjusting the coordinate - * system for the first nozzle and the nozzle offset for subsequent nozzles. - * - * m in/out - Measurement record, updated with new readings - * uncertainty in - How far away from the object to begin probing - */ -inline void calibrate_all_toolheads(measurements_t &m, const float uncertainty) { - TEMPORARY_BACKLASH_CORRECTION(all_on); - TEMPORARY_BACKLASH_SMOOTHING(0.0f); - - HOTEND_LOOP() calibrate_toolhead(m, uncertainty, e); - - TERN_(HAS_HOTEND_OFFSET, normalize_hotend_offsets()); - - TERN_(HAS_MULTI_HOTEND, set_nozzle(m, 0)); -} - -/** - * Perform a full auto-calibration routine: - * - * 1) For each nozzle, touch top and sides of object to determine object position and - * nozzle offsets. Do a fast but rough search over a wider area. - * 2) With the first nozzle, touch top and sides of object to determine backlash values - * for all axis (if BACKLASH_GCODE is enabled) - * 3) For each nozzle, touch top and sides of object slowly to determine precise - * position of object. Adjust coordinate system and nozzle offsets so probed object - * location corresponds to known object location with a high degree of precision. - */ -inline void calibrate_all() { - measurements_t m; - - TERN_(HAS_HOTEND_OFFSET, reset_hotend_offsets()); - - TEMPORARY_BACKLASH_CORRECTION(all_on); - TEMPORARY_BACKLASH_SMOOTHING(0.0f); - - // Do a fast and rough calibration of the toolheads - calibrate_all_toolheads(m, CALIBRATION_MEASUREMENT_UNKNOWN); - - TERN_(BACKLASH_GCODE, calibrate_backlash(m, CALIBRATION_MEASUREMENT_UNCERTAIN)); - - // Cycle the toolheads so the servos settle into their "natural" positions - #if HAS_MULTI_HOTEND - HOTEND_LOOP() set_nozzle(m, e); - #endif - - // Do a slow and precise calibration of the toolheads - calibrate_all_toolheads(m, CALIBRATION_MEASUREMENT_UNCERTAIN); - - current_position.x = X_CENTER; - calibration_move(); // Park nozzle away from calibration object -} - -/** - * G425: Perform calibration with calibration object. - * - * B - Perform calibration of backlash only. - * T - Perform calibration of toolhead only. - * V - Probe object and print position, error, backlash and hotend offset. - * U - Uncertainty, how far to start probe away from the object (mm) - * - * no args - Perform entire calibration sequence (backlash + position on all toolheads) - */ -void GcodeSuite::G425() { - - #ifdef CALIBRATION_SCRIPT_PRE - GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_PRE)); - #endif - - if (homing_needed_error()) return; - - TEMPORARY_BED_LEVELING_STATE(false); - SET_SOFT_ENDSTOP_LOOSE(true); - - measurements_t m; - float uncertainty = parser.seenval('U') ? parser.value_float() : CALIBRATION_MEASUREMENT_UNCERTAIN; - - if (parser.seen('B')) - calibrate_backlash(m, uncertainty); - else if (parser.seen('T')) - calibrate_toolhead(m, uncertainty, parser.has_value() ? parser.value_int() : active_extruder); - #if ENABLED(CALIBRATION_REPORTING) - else if (parser.seen('V')) { - probe_sides(m, uncertainty); - SERIAL_EOL(); - report_measured_faces(m); - report_measured_center(m); - report_measured_backlash(m); - report_measured_nozzle_dimensions(m); - report_measured_positional_error(m); - #if HAS_HOTEND_OFFSET - normalize_hotend_offsets(); - report_hotend_offsets(); - #endif - } - #endif - else - calibrate_all(); - - SET_SOFT_ENDSTOP_LOOSE(false); - - #ifdef CALIBRATION_SCRIPT_POST - GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_POST)); - #endif -} - -#endif // CALIBRATION_GCODE diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp deleted file mode 100644 index 89393b4582..0000000000 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * G76_M871.cpp - Temperature calibration/compensation for z-probing - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(PROBE_TEMP_COMPENSATION) - -#include "../gcode.h" -#include "../../module/motion.h" -#include "../../module/planner.h" -#include "../../module/probe.h" -#include "../../feature/bedlevel/bedlevel.h" -#include "../../module/temperature.h" -#include "../../module/probe.h" -#include "../../feature/probe_temp_comp.h" - -#include "../../lcd/ultralcd.h" -#include "../../MarlinCore.h" // for wait_for_heatup and idle() - -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" -#endif - -#if ENABLED(PRINTER_EVENTS_LEDS) - #include "../../feature/leds/leds.h" -#endif - -/** - * G76: calibrate probe and/or bed temperature offsets - * Notes: - * - When calibrating probe, bed temperature is held constant. - * Compensation values are deltas to first probe measurement at probe temp. = 30°C. - * - When calibrating bed, probe temperature is held constant. - * Compensation values are deltas to first probe measurement at bed temp. = 60°C. - * - The hotend will not be heated at any time. - * - On my Průša MK3S clone I put a piece of paper between the probe and the hotend - * so the hotend fan would not cool my probe constantly. Alternativly you could just - * make sure the fan is not running while running the calibration process. - * - * Probe calibration: - * - Moves probe to cooldown point. - * - Heats up bed to 100°C. - * - Moves probe to probing point (1mm above heatbed). - * - Waits until probe reaches target temperature (30°C). - * - Does a z-probing (=base value) and increases target temperature by 5°C. - * - Waits until probe reaches increased target temperature. - * - Does a z-probing (delta to base value will be a compensation value) and increases target temperature by 5°C. - * - Repeats last two steps until max. temperature reached or timeout (i.e. probe does not heat up any further). - * - Compensation values of higher temperatures will be extrapolated (using linear regression first). - * While this is not exact by any means it is still better than simply using the last compensation value. - * - * Bed calibration: - * - Moves probe to cooldown point. - * - Heats up bed to 60°C. - * - Moves probe to probing point (1mm above heatbed). - * - Waits until probe reaches target temperature (30°C). - * - Does a z-probing (=base value) and increases bed temperature by 5°C. - * - Moves probe to cooldown point. - * - Waits until probe is below 30°C and bed has reached target temperature. - * - Moves probe to probing point and waits until it reaches target temperature (30°C). - * - Does a z-probing (delta to base value will be a compensation value) and increases bed temperature by 5°C. - * - Repeats last four points until max. bed temperature reached (110°C) or timeout. - * - Compensation values of higher temperatures will be extrapolated (using linear regression first). - * While this is not exact by any means it is still better than simply using the last compensation value. - * - * G76 [B | P] - * - no flag - Both calibration procedures will be run. - * - `B` - Run bed temperature calibration. - * - `P` - Run probe temperature calibration. - */ -void GcodeSuite::G76() { - // Check if heated bed is available and z-homing is done with probe - #if TEMP_SENSOR_BED == 0 || !(HOMING_Z_WITH_PROBE) - return; - #endif - - auto report_temps = [](millis_t &ntr, millis_t timeout=0) { - idle_no_sleep(); - const millis_t ms = millis(); - if (ELAPSED(ms, ntr)) { - ntr = ms + 1000; - thermalManager.print_heater_states(active_extruder); - } - return (timeout && ELAPSED(ms, timeout)); - }; - - auto wait_for_temps = [&](const float tb, const float tp, millis_t &ntr, const millis_t timeout=0) { - SERIAL_ECHOLNPGM("Waiting for bed and probe temperature."); - while (fabs(thermalManager.degBed() - tb) > 0.1f || thermalManager.degProbe() > tp) - if (report_temps(ntr, timeout)) return true; - return false; - }; - - auto g76_probe = [](const TempSensorID sid, uint16_t &targ, const xy_pos_t &nozpos) { - do_z_clearance(5.0); // Raise nozzle before probing - const float measured_z = probe.probe_at_point(nozpos, PROBE_PT_STOW, 0, false); // verbose=0, probe_relative=false - if (isnan(measured_z)) - SERIAL_ECHOLNPGM("!Received NAN. Aborting."); - else { - SERIAL_ECHOLNPAIR_F("Measured: ", measured_z); - if (targ == cali_info_init[sid].start_temp) - temp_comp.prepare_new_calibration(measured_z); - else - temp_comp.push_back_new_measurement(sid, measured_z); - targ += cali_info_init[sid].temp_res; - } - return measured_z; - }; - - #if ENABLED(BLTOUCH) - // Make sure any BLTouch error condition is cleared - bltouch_command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); - set_bltouch_deployed(false); - #endif - - bool do_bed_cal = parser.boolval('B'), do_probe_cal = parser.boolval('P'); - if (!do_bed_cal && !do_probe_cal) do_bed_cal = do_probe_cal = true; - - // Synchronize with planner - planner.synchronize(); - - const xyz_pos_t parkpos = temp_comp.park_point, - probe_pos_xyz = xyz_pos_t(temp_comp.measure_point) + xyz_pos_t({ 0.0f, 0.0f, PTC_PROBE_HEATING_OFFSET }), - noz_pos_xyz = probe_pos_xyz - xy_pos_t(probe.offset_xy); // Nozzle position based on probe position - - if (do_bed_cal || do_probe_cal) { - // Ensure park position is reachable - bool reachable = position_is_reachable(parkpos) || WITHIN(parkpos.z, Z_MIN_POS - fslop, Z_MAX_POS + fslop); - if (!reachable) - SERIAL_ECHOLNPGM("!Park"); - else { - // Ensure probe position is reachable - reachable = probe.can_reach(probe_pos_xyz); - if (!reachable) SERIAL_ECHOLNPGM("!Probe"); - } - - if (!reachable) { - SERIAL_ECHOLNPGM(" position unreachable - aborting."); - return; - } - - process_subcommands_now_P(PSTR("G28")); - } - - remember_feedrate_scaling_off(); - - - /****************************************** - * Calibrate bed temperature offsets - ******************************************/ - - // Report temperatures every second and handle heating timeouts - millis_t next_temp_report = millis() + 1000; - - auto report_targets = [&](const uint16_t tb, const uint16_t tp) { - SERIAL_ECHOLNPAIR("Target Bed:", tb, " Probe:", tp); - }; - - if (do_bed_cal) { - - uint16_t target_bed = cali_info_init[TSI_BED].start_temp, - target_probe = temp_comp.bed_calib_probe_temp; - - SERIAL_ECHOLNPGM("Waiting for cooling."); - while (thermalManager.degBed() > target_bed || thermalManager.degProbe() > target_probe) - report_temps(next_temp_report); - - // Disable leveling so it won't mess with us - TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); - - for (;;) { - thermalManager.setTargetBed(target_bed); - - report_targets(target_bed, target_probe); - - // Park nozzle - do_blocking_move_to(parkpos); - - // Wait for heatbed to reach target temp and probe to cool below target temp - if (wait_for_temps(target_bed, target_probe, next_temp_report, millis() + MIN_TO_MS(15))) { - SERIAL_ECHOLNPGM("!Bed heating timeout."); - break; - } - - // Move the nozzle to the probing point and wait for the probe to reach target temp - do_blocking_move_to(noz_pos_xyz); - SERIAL_ECHOLNPGM("Waiting for probe heating."); - while (thermalManager.degProbe() < target_probe) - report_temps(next_temp_report); - - const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz); - if (isnan(measured_z) || target_bed > BED_MAX_TARGET) break; - } - - SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); - if (temp_comp.finish_calibration(TSI_BED)) - SERIAL_ECHOLNPGM("Successfully calibrated bed."); - else - SERIAL_ECHOLNPGM("!Failed to calibrate bed. Values reset."); - - // Cleanup - thermalManager.setTargetBed(0); - TERN_(HAS_LEVELING, set_bed_leveling_enabled(true)); - } // do_bed_cal - - /******************************************** - * Calibrate probe temperature offsets - ********************************************/ - - if (do_probe_cal) { - - // Park nozzle - do_blocking_move_to(parkpos); - - // Initialize temperatures - const uint16_t target_bed = temp_comp.probe_calib_bed_temp; - thermalManager.setTargetBed(target_bed); - - uint16_t target_probe = cali_info_init[TSI_PROBE].start_temp; - - report_targets(target_bed, target_probe); - - // Wait for heatbed to reach target temp and probe to cool below target temp - wait_for_temps(target_bed, target_probe, next_temp_report); - - // Disable leveling so it won't mess with us - TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); - - bool timeout = false; - for (;;) { - // Move probe to probing point and wait for it to reach target temperature - do_blocking_move_to(noz_pos_xyz); - - SERIAL_ECHOLNPAIR("Waiting for probe heating. Bed:", target_bed, " Probe:", target_probe); - const millis_t probe_timeout_ms = millis() + 900UL * 1000UL; - while (thermalManager.degProbe() < target_probe) { - if (report_temps(next_temp_report, probe_timeout_ms)) { - SERIAL_ECHOLNPGM("!Probe heating timed out."); - timeout = true; - break; - } - } - if (timeout) break; - - const float measured_z = g76_probe(TSI_PROBE, target_probe, noz_pos_xyz); - if (isnan(measured_z) || target_probe > cali_info_init[TSI_PROBE].end_temp) break; - } - - SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); - if (temp_comp.finish_calibration(TSI_PROBE)) - SERIAL_ECHOPGM("Successfully calibrated"); - else - SERIAL_ECHOPGM("!Failed to calibrate"); - SERIAL_ECHOLNPGM(" probe."); - - // Cleanup - thermalManager.setTargetBed(0); - TERN_(HAS_LEVELING, set_bed_leveling_enabled(true)); - - SERIAL_ECHOLNPGM("Final compensation values:"); - temp_comp.print_offsets(); - } // do_probe_cal - - restore_feedrate_and_scaling(); -} - -/** - * M871: Report / reset temperature compensation offsets. - * Note: This does not affect values in EEPROM until M500. - * - * M871 [ R | B | P | E ] - * - * No Parameters - Print current offset values. - * - * Select only one of these flags: - * R - Reset all offsets to zero (i.e., disable compensation). - * B - Manually set offset for bed - * P - Manually set offset for probe - * E - Manually set offset for extruder - * - * With B, P, or E: - * I[index] - Index in the array - * V[value] - Adjustment in µm - */ -void GcodeSuite::M871() { - - if (parser.seen('R')) { - // Reset z-probe offsets to factory defaults - temp_comp.clear_all_offsets(); - SERIAL_ECHOLNPGM("Offsets reset to default."); - } - else if (parser.seen("BPE")) { - if (!parser.seenval('V')) return; - const int16_t offset_val = parser.value_int(); - if (!parser.seenval('I')) return; - const int16_t idx = parser.value_int(); - const TempSensorID mod = (parser.seen('B') ? TSI_BED : - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - parser.seen('E') ? TSI_EXT : - #endif - TSI_PROBE - ); - if (idx > 0 && temp_comp.set_offset(mod, idx - 1, offset_val)) - SERIAL_ECHOLNPAIR("Set value: ", offset_val); - else - SERIAL_ECHOLNPGM("!Invalid index. Failed to set value (note: value at index 0 is constant)."); - - } - else // Print current Z-probe adjustments. Note: Values in EEPROM might differ. - temp_comp.print_offsets(); -} - -/** - * M192: Wait for probe temperature sensor to reach a target - * - * Select only one of these flags: - * R - Wait for heating or cooling - * S - Wait only for heating - */ -void GcodeSuite::M192() { - if (DEBUGGING(DRYRUN)) return; - - const bool no_wait_for_cooling = parser.seenval('S'); - if (!no_wait_for_cooling && ! parser.seenval('R')) { - SERIAL_ERROR_MSG("No target temperature set."); - return; - } - - const float target_temp = parser.value_celsius(); - ui.set_status_P(thermalManager.isProbeBelowTemp(target_temp) ? GET_TEXT(MSG_PROBE_HEATING) : GET_TEXT(MSG_PROBE_COOLING)); - thermalManager.wait_for_probe(target_temp, no_wait_for_cooling); -} - -#endif // PROBE_TEMP_COMPENSATION diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index 9ac2380e79..fe6e586897 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -26,9 +26,9 @@ #include "../gcode.h" #include "../queue.h" -#include "../../libs/hex_print.h" +#include "../../libs/hex_print_routines.h" -#include "../../MarlinCore.h" // for idle() +#include "../../Marlin.h" // for idle() /** * M100 Free Memory Watcher @@ -50,8 +50,8 @@ * * Also, there are two support functions that can be called from a developer's C code. * - * uint16_t check_for_free_memory_corruption(PGM_P const free_memory_start); - * void M100_dump_routine(PGM_P const title, const char * const start, const char * const end); + * uint16_t check_for_free_memory_corruption(const char * const ptr); + * void M100_dump_routine(const char * const title, const char *start, const char *end); * * Initial version by Roxy-3D */ @@ -60,78 +60,27 @@ #define TEST_BYTE ((char) 0xE5) -#if EITHER(__AVR__, IS_32BIT_TEENSY) - - extern char __bss_end; - char *end_bss = &__bss_end, - *free_memory_start = end_bss, *free_memory_end = 0, - *stacklimit = 0, *heaplimit = 0; - - #define MEMORY_END_CORRECTION 0 - -#elif defined(TARGET_LPC1768) - - extern char __bss_end__, __StackLimit, __HeapLimit; - - char *end_bss = &__bss_end__, - *stacklimit = &__StackLimit, - *heaplimit = &__HeapLimit; - - #define MEMORY_END_CORRECTION 0x200 - - char *free_memory_start = heaplimit, - *free_memory_end = stacklimit - MEMORY_END_CORRECTION; - -#elif defined(__SAM3X8E__) - - extern char _ebss; - - char *end_bss = &_ebss, - *free_memory_start = end_bss, - *free_memory_end = 0, - *stacklimit = 0, - *heaplimit = 0; - - #define MEMORY_END_CORRECTION 0x10000 // need to stay well below 0x20080000 or M100 F crashes - -#elif defined(__SAMD51__) - - extern unsigned int __bss_end__, __StackLimit, __HeapLimit; - extern "C" void * _sbrk(int incr); - - void *end_bss = &__bss_end__, - *stacklimit = &__StackLimit, - *heaplimit = &__HeapLimit; - - #define MEMORY_END_CORRECTION 0x400 - - char *free_memory_start = (char *)_sbrk(0) + 0x200, // Leave some heap space - *free_memory_end = (char *)stacklimit - MEMORY_END_CORRECTION; - -#else - #error "M100 - unsupported CPU" -#endif +extern char* __brkval; +extern size_t __heap_start, __heap_end, __flp; +extern char __bss_end; // // Utility functions // -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wreturn-local-addr" +#define END_OF_HEAP() (__brkval ? __brkval : &__bss_end) -// Location of a variable in its stack frame. -// The returned address will be above the stack (after it returns). -char *top_of_stack() { +// Location of a variable on its stack frame. Returns a value above +// the stack (once the function returns to the caller). +char* top_of_stack() { char x; return &x + 1; // x is pulled on return; } -#pragma GCC diagnostic pop - // Count the number of test bytes at the specified location. -inline int32_t count_test_bytes(const char * const start_free_memory) { +inline int32_t count_test_bytes(const char * const ptr) { for (uint32_t i = 0; i < 32000; i++) - if (char(start_free_memory[i]) != TEST_BYTE) + if (((char) ptr[i]) != TEST_BYTE) return i - 1; return -1; @@ -144,70 +93,75 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { #if ENABLED(M100_FREE_MEMORY_DUMPER) /** * M100 D - * Dump the free memory block from brkval to the stack pointer. + * Dump the free memory block from __brkval to the stack pointer. * malloc() eats memory from the start of the block and the stack grows * up from the bottom of the block. Solid test bytes indicate nothing has * used that memory yet. There should not be anything but test bytes within * the block. If so, it may indicate memory corruption due to a bad pointer. * Unexpected bytes are flagged in the right column. */ - inline void dump_free_memory(char *start_free_memory, char *end_free_memory) { + inline void dump_free_memory(const char *ptr, const char *sp) { // // Start and end the dump on a nice 16 byte boundary // (even though the values are not 16-byte aligned). // - start_free_memory = (char*)(uintptr_t(uint32_t(start_free_memory) & ~0xFUL)); // Align to 16-byte boundary - end_free_memory = (char*)(uintptr_t(uint32_t(end_free_memory) | 0xFUL)); // Align end_free_memory to the 15th byte (at or above end_free_memory) + ptr = (char*)((ptr_int_t)((uint32_t)ptr & 0xFFFFFFF0)); // Align to 16-byte boundary + sp = (char*)((ptr_int_t)((uint32_t)sp | 0x0000000F)); // Align sp to the 15th byte (at or above sp) // Dump command main loop - while (start_free_memory < end_free_memory) { - print_hex_address(start_free_memory); // Print the address + while (ptr < sp) { + print_hex_address(ptr); // Print the address SERIAL_CHAR(':'); - LOOP_L_N(i, 16) { // and 16 data bytes + for (uint8_t i = 0; i < 16; i++) { // and 16 data bytes if (i == 8) SERIAL_CHAR('-'); - print_hex_byte(start_free_memory[i]); + print_hex_byte(ptr[i]); SERIAL_CHAR(' '); } - serial_delay(25); + safe_delay(25); SERIAL_CHAR('|'); // Point out non test bytes - LOOP_L_N(i, 16) { - char ccc = (char)start_free_memory[i]; // cast to char before automatically casting to char on assignment, in case the compiler is broken - ccc = (ccc == TEST_BYTE) ? ' ' : '?'; + for (uint8_t i = 0; i < 16; i++) { + char ccc = (char)ptr[i]; // cast to char before automatically casting to char on assignment, in case the compiler is broken + if (&ptr[i] >= (const char*)command_queue && &ptr[i] < (const char*)(command_queue + sizeof(command_queue))) { // Print out ASCII in the command buffer area + if (!WITHIN(ccc, ' ', 0x7E)) ccc = ' '; + } + else { // If not in the command buffer area, flag bytes that don't match the test byte + ccc = (ccc == TEST_BYTE) ? ' ' : '?'; + } SERIAL_CHAR(ccc); } SERIAL_EOL(); - start_free_memory += 16; - serial_delay(25); + ptr += 16; + safe_delay(25); idle(); } } - void M100_dump_routine(PGM_P const title, const char * const start, const char * const end) { - serialprintPGM(title); - SERIAL_EOL(); + void M100_dump_routine(const char * const title, const char *start, const char *end) { + SERIAL_ECHOLN(title); // // Round the start and end locations to produce full lines of output // - dump_free_memory( - (char*)(uintptr_t(uint32_t(start) & ~0xFUL)), // Align to 16-byte boundary - (char*)(uintptr_t(uint32_t(end) | 0xFUL)) // Align end_free_memory to the 15th byte (at or above end_free_memory) - ); + start = (char*)((ptr_int_t)((uint32_t)start & 0xFFFFFFF0)); // Align to 16-byte boundary + end = (char*)((ptr_int_t)((uint32_t)end | 0x0000000F)); // Align sp to the 15th byte (at or above sp) + dump_free_memory(start, end); } #endif // M100_FREE_MEMORY_DUMPER -inline int check_for_free_memory_corruption(PGM_P const title) { - serialprintPGM(title); +inline int check_for_free_memory_corruption(const char * const title) { + SERIAL_ECHO(title); - char *start_free_memory = free_memory_start, *end_free_memory = free_memory_end; - int n = end_free_memory - start_free_memory; + char *ptr = END_OF_HEAP(), *sp = top_of_stack(); + int n = sp - ptr; SERIAL_ECHOPAIR("\nfmc() n=", n); - SERIAL_ECHOPAIR("\nfree_memory_start=", hex_address(free_memory_start)); - SERIAL_ECHOLNPAIR(" end_free_memory=", hex_address(end_free_memory)); + SERIAL_ECHOPAIR("\n&__brkval: ", hex_address(&__brkval)); + SERIAL_ECHOPAIR("=", hex_address(__brkval)); + SERIAL_ECHOPAIR("\n__bss_end: ", hex_address(&__bss_end)); + SERIAL_ECHOPAIR(" sp=", hex_address(sp)); - if (end_free_memory < start_free_memory) { - SERIAL_ECHOPGM(" end_free_memory < Heap "); + if (sp < ptr) { + SERIAL_ECHOPGM(" sp < Heap "); // SET_INPUT_PULLUP(63); // if the developer has a switch wired up to their controller board // safe_delay(5); // this code can be enabled to pause the display as soon as the // while ( READ(63)) // malfunction is detected. It is currently defaulting to a switch @@ -215,40 +169,40 @@ inline int check_for_free_memory_corruption(PGM_P const title) { // safe_delay(20); // boards. // while ( !READ(63)) // idle(); - serial_delay(20); + safe_delay(20); #if ENABLED(M100_FREE_MEMORY_DUMPER) - M100_dump_routine(PSTR(" Memory corruption detected with end_free_memory 8) { // SERIAL_ECHOPAIR("Found ", j); - // SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(start_free_memory + i)); + // SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(ptr + i)); i += j; block_cnt++; SERIAL_ECHOPAIR(" (", block_cnt); SERIAL_ECHOPAIR(") found=", j); - SERIAL_ECHOLNPGM(" "); + SERIAL_ECHOPGM(" "); } } } SERIAL_ECHOPAIR(" block_found=", block_cnt); - if (block_cnt != 1) + if (block_cnt != 1 || __brkval != NULL) SERIAL_ECHOLNPGM("\nMemory Corruption detected in free memory area."); if (block_cnt == 0) // Make sure the special case of no free blocks shows up as an - block_cnt = -1; // error to the calling code! + block_cnt = -1; // error to the calling code! SERIAL_ECHOPGM(" return="); if (block_cnt == 1) { - SERIAL_CHAR('0'); // If the block_cnt is 1, nothing has broken up the free memory - SERIAL_EOL(); // area and it is appropriate to say 'no corruption'. + SERIAL_CHAR('0'); // if the block_cnt is 1, nothing has broken up the free memory + SERIAL_EOL(); // area and it is appropriate to say 'no corruption'. return 0; } SERIAL_ECHOLNPGM("true"); @@ -260,12 +214,12 @@ inline int check_for_free_memory_corruption(PGM_P const title) { * Return the number of free bytes in the memory pool, * with other vital statistics defining the pool. */ -inline void free_memory_pool_report(char * const start_free_memory, const int32_t size) { +inline void free_memory_pool_report(char * const ptr, const int32_t size) { int32_t max_cnt = -1, block_cnt = 0; - char *max_addr = nullptr; + char *max_addr = NULL; // Find the longest block of test bytes in the buffer for (int32_t i = 0; i < size; i++) { - char *addr = start_free_memory + i; + char *addr = ptr + i; if (*addr == TEST_BYTE) { const int32_t j = count_test_bytes(addr); if (j > 8) { @@ -285,7 +239,7 @@ inline void free_memory_pool_report(char * const start_free_memory, const int32_ SERIAL_ECHOPAIR("\nLargest free block is ", max_cnt); SERIAL_ECHOLNPAIR(" bytes at ", hex_address(max_addr)); } - SERIAL_ECHOLNPAIR("check_for_free_memory_corruption() = ", check_for_free_memory_corruption(PSTR("M100 F "))); + SERIAL_ECHOLNPAIR("check_for_free_memory_corruption() = ", check_for_free_memory_corruption("M100 F ")); } #if ENABLED(M100_FREE_MEMORY_CORRUPTOR) @@ -294,14 +248,14 @@ inline void free_memory_pool_report(char * const start_free_memory, const int32_ * Corrupt locations in the free memory pool and report the corrupt addresses. * This is useful to check the correctness of the M100 D and the M100 F commands. */ - inline void corrupt_free_memory(char *start_free_memory, const uint32_t size) { - start_free_memory += 8; - const uint32_t near_top = top_of_stack() - start_free_memory - 250, // -250 to avoid interrupt activity that's altered the stack. + inline void corrupt_free_memory(char *ptr, const uint32_t size) { + ptr += 8; + const uint32_t near_top = top_of_stack() - ptr - 250, // -250 to avoid interrupt activity that's altered the stack. j = near_top / (size + 1); SERIAL_ECHOLNPGM("Corrupting free memory block.\n"); for (uint32_t i = 1; i <= size; i++) { - char * const addr = start_free_memory + i * j; + char * const addr = ptr + i * j; *addr = i; SERIAL_ECHOPAIR("\nCorrupting address: ", hex_address(addr)); } @@ -313,7 +267,7 @@ inline void free_memory_pool_report(char * const start_free_memory, const int32_ * M100 I * Init memory for the M100 tests. (Automatically applied on the first M100.) */ -inline void init_free_memory(char *start_free_memory, int32_t size) { +inline void init_free_memory(char *ptr, int32_t size) { SERIAL_ECHOLNPGM("Initializing free memory block.\n\n"); size -= 250; // -250 to avoid interrupt activity that's altered the stack. @@ -322,17 +276,17 @@ inline void init_free_memory(char *start_free_memory, int32_t size) { return; } - start_free_memory += 8; // move a few bytes away from the heap just because we don't want + ptr += 8; // move a few bytes away from the heap just because we don't want // to be altering memory that close to it. - memset(start_free_memory, TEST_BYTE, size); + memset(ptr, TEST_BYTE, size); SERIAL_ECHO(size); SERIAL_ECHOLNPGM(" bytes of memory initialized.\n"); for (int32_t i = 0; i < size; i++) { - if (start_free_memory[i] != TEST_BYTE) { - SERIAL_ECHOPAIR("? address : ", hex_address(start_free_memory + i)); - SERIAL_ECHOLNPAIR("=", hex_byte(start_free_memory[i])); + if (ptr[i] != TEST_BYTE) { + SERIAL_ECHOPAIR("? address : ", hex_address(ptr + i)); + SERIAL_ECHOLNPAIR("=", hex_byte(ptr[i])); SERIAL_EOL(); } } @@ -342,36 +296,33 @@ inline void init_free_memory(char *start_free_memory, int32_t size) { * M100: Free Memory Check */ void GcodeSuite::M100() { + SERIAL_ECHOPAIR("\n__brkval : ", hex_address(__brkval)); + SERIAL_ECHOPAIR("\n__bss_end : ", hex_address(&__bss_end)); - char *sp = top_of_stack(); - if (!free_memory_end) free_memory_end = sp - MEMORY_END_CORRECTION; - SERIAL_ECHOPAIR("\nbss_end : ", hex_address(end_bss)); - if (heaplimit) SERIAL_ECHOPAIR("\n__heaplimit : ", hex_address(heaplimit)); - SERIAL_ECHOPAIR("\nfree_memory_start : ", hex_address(free_memory_start)); - if (stacklimit) SERIAL_ECHOPAIR("\n__stacklimit : ", hex_address(stacklimit)); - SERIAL_ECHOPAIR("\nfree_memory_end : ", hex_address(free_memory_end)); - if (MEMORY_END_CORRECTION) SERIAL_ECHOPAIR("\nMEMORY_END_CORRECTION: ", MEMORY_END_CORRECTION); - SERIAL_ECHOLNPAIR("\nStack Pointer : ", hex_address(sp)); + char *ptr = END_OF_HEAP(), *sp = top_of_stack(); + + SERIAL_ECHOPAIR("\nstart of free space : ", hex_address(ptr)); + SERIAL_ECHOLNPAIR("\nStack Pointer : ", hex_address(sp)); // Always init on the first invocation of M100 static bool m100_not_initialized = true; if (m100_not_initialized || parser.seen('I')) { m100_not_initialized = false; - init_free_memory(free_memory_start, free_memory_end - free_memory_start); + init_free_memory(ptr, sp - ptr); } #if ENABLED(M100_FREE_MEMORY_DUMPER) if (parser.seen('D')) - return dump_free_memory(free_memory_start, free_memory_end); + return dump_free_memory(ptr, sp); #endif if (parser.seen('F')) - return free_memory_pool_report(free_memory_start, free_memory_end - free_memory_start); + return free_memory_pool_report(ptr, sp - ptr); #if ENABLED(M100_FREE_MEMORY_CORRUPTOR) if (parser.seen('C')) - return corrupt_free_memory(free_memory_start, parser.value_int()); + return corrupt_free_memory(ptr, parser.value_int()); #endif } diff --git a/Marlin/src/gcode/calibrate/M101_Task_Free_Mem_Chk.cpp b/Marlin/src/gcode/calibrate/M101_Task_Free_Mem_Chk.cpp new file mode 100644 index 0000000000..3ffe8f98e7 --- /dev/null +++ b/Marlin/src/gcode/calibrate/M101_Task_Free_Mem_Chk.cpp @@ -0,0 +1,84 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * M101 Task Free Memory Watcher + * + * This code watches the free memory defined for each task in the FreeRTOS environment + * It is useful to determine how much memory each task has available. + * + * Initial version... More Marlin-specific information to be added. + */ + +#include "../../inc/MarlinConfig.h" +#include "../gcode.h" +#include "../../Marlin.h" +#include +#include "../../libs/hex_print_routines.h" + +#define MAX_TASKS 10 + +void GcodeSuite::M101() { + TaskStatus_t TaskStatArray[MAX_TASKS]; + + unsigned n_tasks = uxTaskGetNumberOfTasks(); + if (n_tasks > MAX_TASKS) { + SERIAL_PROTOCOLLNPAIR("?Too many tasks: ", n_tasks); + SERIAL_EOL(); + return; + } + + SERIAL_PROTOCOLLNPGM("M101 RTOS Task Info:"); + /* Generate raw status information about each task. */ + n_tasks = uxTaskGetSystemState( TaskStatArray, MAX_TASKS, NULL); + + SERIAL_PROTOCOLLNPAIR("n_tasks: ", n_tasks); + + /* For each populated position in the TaskStatArray array, + format the raw data as human readable ASCII data. */ + for (unsigned x = 0; x < n_tasks; x++) { + char t_name[configMAX_TASK_NAME_LEN + 1]; // Pad out the task name so everything lines up nicely + strcpy(t_name, TaskStatArray[x].pcTaskName); + while (strlen(t_name) < configMAX_TASK_NAME_LEN) + strcat(t_name, "_"); + + SERIAL_PROTOCOL(x); + SERIAL_PROTOCOLPAIR(":", t_name); + SERIAL_PROTOCOLPAIR(" Task #: ", TaskStatArray[x].xTaskNumber); + SERIAL_PROTOCOLPAIR(" Current_Priority: ", TaskStatArray[x].uxCurrentPriority); + SERIAL_PROTOCOLPAIR(" Base_Priority: ", TaskStatArray[x].uxBasePriority); + + SERIAL_PROTOCOLPGM(" Stack: "); + print_hex_address((const void * const) TaskStatArray[x].pxStackBase); + SERIAL_PROTOCOLPAIR(" Free_Mem: ", (unsigned int) TaskStatArray[x].usStackHighWaterMark); + SERIAL_PROTOCOLPGM(" State: "); + switch( TaskStatArray[x].eCurrentState ) { + case eRunning: SERIAL_PROTOCOLLNPGM("Running"); break; + case eReady: SERIAL_PROTOCOLLNPGM("Ready"); break; + case eBlocked: SERIAL_PROTOCOLLNPGM("Blocked"); break; + case eSuspended: SERIAL_PROTOCOLLNPGM("Suspended"); break; + case eDeleted: SERIAL_PROTOCOLLNPGM("Deleted"); break; + default: SERIAL_PROTOCOLLNPAIR("Corrupted:", TaskStatArray[x].eCurrentState); + break; + } + } +} diff --git a/Marlin/src/gcode/calibrate/M12.cpp b/Marlin/src/gcode/calibrate/M12.cpp index da24454375..a4b75e71bd 100644 --- a/Marlin/src/gcode/calibrate/M12.cpp +++ b/Marlin/src/gcode/calibrate/M12.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfigPre.h" @@ -28,12 +28,9 @@ #include "../../feature/closedloop.h" void GcodeSuite::M12() { - planner.synchronize(); - if (parser.seenval('S')) - closedloop.set(parser.value_int()); // Force a CLC set - + set_closedloop(parser.value_int()); // Force a CLC set } #endif diff --git a/Marlin/src/gcode/calibrate/M425.cpp b/Marlin/src/gcode/calibrate/M425.cpp deleted file mode 100644 index 40441ac08d..0000000000 --- a/Marlin/src/gcode/calibrate/M425.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(BACKLASH_GCODE) - -#include "../../feature/backlash.h" -#include "../../module/planner.h" - -#include "../gcode.h" - -/** - * M425: Enable and tune backlash correction. - * - * F Enable/disable/fade-out backlash correction (0.0 to 1.0) - * S Distance over which backlash correction is spread - * X Set the backlash distance on X (0 to disable) - * Y ... on Y - * Z ... on Z - * X If a backlash measurement was done on X, copy that value - * Y ... on Y - * Z ... on Z - * - * Type M425 without any arguments to show active values. - */ -void GcodeSuite::M425() { - bool noArgs = true; - - auto axis_can_calibrate = [](const uint8_t a) { - switch (a) { - default: - case X_AXIS: return AXIS_CAN_CALIBRATE(X); - case Y_AXIS: return AXIS_CAN_CALIBRATE(Y); - case Z_AXIS: return AXIS_CAN_CALIBRATE(Z); - } - }; - - LOOP_XYZ(a) { - if (axis_can_calibrate(a) && parser.seen(XYZ_CHAR(a))) { - planner.synchronize(); - backlash.distance_mm[a] = parser.has_value() ? parser.value_linear_units() : backlash.get_measurement(AxisEnum(a)); - noArgs = false; - } - } - - if (parser.seen('F')) { - planner.synchronize(); - backlash.set_correction(parser.value_float()); - noArgs = false; - } - - #ifdef BACKLASH_SMOOTHING_MM - if (parser.seen('S')) { - planner.synchronize(); - backlash.smoothing_mm = parser.value_linear_units(); - noArgs = false; - } - #endif - - if (noArgs) { - SERIAL_ECHOPGM("Backlash Correction "); - if (!backlash.correction) SERIAL_ECHOPGM("in"); - SERIAL_ECHOLNPGM("active:"); - SERIAL_ECHOLNPAIR(" Correction Amount/Fade-out: F", backlash.get_correction(), " (F1.0 = full, F0.0 = none)"); - SERIAL_ECHOPGM(" Backlash Distance (mm): "); - LOOP_XYZ(a) if (axis_can_calibrate(a)) { - SERIAL_CHAR(' ', XYZ_CHAR(a)); - SERIAL_ECHO(backlash.distance_mm[a]); - SERIAL_EOL(); - } - - #ifdef BACKLASH_SMOOTHING_MM - SERIAL_ECHOLNPAIR(" Smoothing (mm): S", backlash.smoothing_mm); - #endif - - #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) - SERIAL_ECHOPGM(" Average measured backlash (mm):"); - if (backlash.has_any_measurement()) { - LOOP_XYZ(a) if (axis_can_calibrate(a) && backlash.has_measurement(AxisEnum(a))) { - SERIAL_CHAR(' ', XYZ_CHAR(a)); - SERIAL_ECHO(backlash.get_measurement(AxisEnum(a))); - } - } - else - SERIAL_ECHOPGM(" (Not yet measured)"); - SERIAL_EOL(); - #endif - } -} - -#endif // BACKLASH_GCODE diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 8640dfa391..dd646961f7 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,10 +27,11 @@ #include "../gcode.h" #include "../../module/motion.h" #include "../../module/probe.h" -#include "../../lcd/ultralcd.h" + #include "../../feature/bedlevel/bedlevel.h" + #if HAS_LEVELING #include "../../module/planner.h" #endif @@ -50,225 +51,225 @@ * * This function requires the machine to be homed before invocation. */ - -extern const char SP_Y_STR[]; - void GcodeSuite::M48() { - if (homing_needed_error()) return; + if (axis_unhomed_error()) return; const int8_t verbose_level = parser.byteval('V', 1); if (!WITHIN(verbose_level, 0, 4)) { - SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4)."); + SERIAL_PROTOCOLLNPGM("?(V)erbose level is implausible (0-4)."); return; } if (verbose_level > 0) - SERIAL_ECHOLNPGM("M48 Z-Probe Repeatability Test"); + SERIAL_PROTOCOLLNPGM("M48 Z-Probe Repeatability Test"); const int8_t n_samples = parser.byteval('P', 10); if (!WITHIN(n_samples, 4, 50)) { - SERIAL_ECHOLNPGM("?Sample size not plausible (4-50)."); + SERIAL_PROTOCOLLNPGM("?Sample size not plausible (4-50)."); return; } const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - // Test at the current position by default, overridden by X and Y - const xy_pos_t test_position = { - parser.linearval('X', current_position.x + probe.offset_xy.x), // If no X use the probe's current X position - parser.linearval('Y', current_position.y + probe.offset_xy.y) // If no Y, ditto - }; + float X_current = current_position[X_AXIS], + Y_current = current_position[Y_AXIS]; - if (!probe.can_reach(test_position)) { - ui.set_status_P(GET_TEXT(MSG_M48_OUT_OF_BOUNDS), 99); - SERIAL_ECHOLNPGM("? (X,Y) out of bounds."); + const float X_probe_location = parser.linearval('X', X_current + X_PROBE_OFFSET_FROM_EXTRUDER), + Y_probe_location = parser.linearval('Y', Y_current + Y_PROBE_OFFSET_FROM_EXTRUDER); + + if (!position_is_reachable_by_probe(X_probe_location, Y_probe_location)) { + SERIAL_PROTOCOLLNPGM("? (X,Y) out of bounds."); return; } - // Get the number of leg moves per test-point bool seen_L = parser.seen('L'); uint8_t n_legs = seen_L ? parser.value_byte() : 0; if (n_legs > 15) { - SERIAL_ECHOLNPGM("?Legs of movement implausible (0-15)."); + SERIAL_PROTOCOLLNPGM("?Number of legs in movement not plausible (0-15)."); return; } if (n_legs == 1) n_legs = 2; - // Schizoid motion as an optional stress-test const bool schizoid_flag = parser.boolval('S'); if (schizoid_flag && !seen_L) n_legs = 7; + /** + * Now get everything to the specified probe point So we can safely do a + * probe to get us close to the bed. If the Z-Axis is far from the bed, + * we don't want to use that as a starting point for each probe. + */ if (verbose_level > 2) - SERIAL_ECHOLNPGM("Positioning the probe..."); + SERIAL_PROTOCOLLNPGM("Positioning the probe..."); - // Always disable Bed Level correction before probing... + // Disable bed level correction in M48 because we want the raw data when we probe #if HAS_LEVELING const bool was_enabled = planner.leveling_active; set_bed_leveling_enabled(false); #endif - // Work with reasonable feedrates - remember_feedrate_scaling_off(); + setup_for_endstop_or_probe_move(); - // Working variables - float mean = 0.0, // The average of all points so far, used to calculate deviation - sigma = 0.0, // Standard deviation of all points so far - min = 99999.9, // Smallest value sampled so far - max = -99999.9, // Largest value sampled so far - sample_set[n_samples]; // Storage for sampled values - - auto dev_report = [](const bool verbose, const float &mean, const float &sigma, const float &min, const float &max, const bool final=false) { - if (verbose) { - SERIAL_ECHOPAIR_F("Mean: ", mean, 6); - if (!final) SERIAL_ECHOPAIR_F(" Sigma: ", sigma, 6); - SERIAL_ECHOPAIR_F(" Min: ", min, 3); - SERIAL_ECHOPAIR_F(" Max: ", max, 3); - SERIAL_ECHOPAIR_F(" Range: ", max-min, 3); - if (final) SERIAL_EOL(); - } - if (final) { - SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); - SERIAL_EOL(); - } - }; + float mean = 0.0, sigma = 0.0, min = 99999.9, max = -99999.9, sample_set[n_samples]; // Move to the first point, deploy, and probe - const float t = probe.probe_at_point(test_position, raise_after, verbose_level); + const float t = probe_pt(X_probe_location, Y_probe_location, raise_after, verbose_level); bool probing_good = !isnan(t); if (probing_good) { randomSeed(millis()); - float sample_sum = 0.0; - - LOOP_L_N(n, n_samples) { - #if HAS_WIRED_LCD - // Display M48 progress in the status bar - ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples)); - #endif - - // When there are "legs" of movement move around the point before probing + for (uint8_t n = 0; n < n_samples; n++) { if (n_legs) { - - // Pick a random direction, starting angle, and radius const int dir = (random(0, 10) > 5.0) ? -1 : 1; // clockwise or counter clockwise float angle = random(0, 360); const float radius = random( #if ENABLED(DELTA) - int(0.1250000000 * (DELTA_PRINTABLE_RADIUS)), - int(0.3333333333 * (DELTA_PRINTABLE_RADIUS)) + (int) (0.1250000000 * (DELTA_PRINTABLE_RADIUS)), + (int) (0.3333333333 * (DELTA_PRINTABLE_RADIUS)) #else - int(5), int(0.125 * _MIN(X_BED_SIZE, Y_BED_SIZE)) + (int) 5.0, (int) (0.125 * MIN(X_BED_SIZE, Y_BED_SIZE)) #endif ); + if (verbose_level > 3) { - SERIAL_ECHOPAIR("Start radius:", radius, " angle:", angle, " dir:"); - if (dir > 0) SERIAL_CHAR('C'); - SERIAL_ECHOLNPGM("CW"); + SERIAL_ECHOPAIR("Starting radius: ", radius); + SERIAL_ECHOPAIR(" angle: ", angle); + SERIAL_ECHOPGM(" Direction: "); + if (dir > 0) SERIAL_ECHOPGM("Counter-"); + SERIAL_ECHOLNPGM("Clockwise"); } - // Move from leg to leg in rapid succession - LOOP_L_N(l, n_legs - 1) { - - // Move some distance around the perimeter + for (uint8_t l = 0; l < n_legs - 1; l++) { float delta_angle; - if (schizoid_flag) { - // The points of a 5 point star are 72 degrees apart. - // Skip a point and go to the next one on the star. + + if (schizoid_flag) + // The points of a 5 point star are 72 degrees apart. We need to + // skip a point and go to the next one on the star. delta_angle = dir * 2.0 * 72.0; - } - else { - // Just move further along the perimeter. - delta_angle = dir * (float)random(25, 45); - } + + else + // If we do this line, we are just trying to move further + // around the circle. + delta_angle = dir * (float) random(25, 45); + angle += delta_angle; - // Trig functions work without clamping, but just to be safe... - while (angle > 360.0) angle -= 360.0; - while (angle < 0.0) angle += 360.0; + while (angle > 360.0) // We probably do not need to keep the angle between 0 and 2*PI, but the + angle -= 360.0; // Arduino documentation says the trig functions should not be given values + while (angle < 0.0) // outside of this range. It looks like they behave correctly with + angle += 360.0; // numbers outside of the range, but just to be safe we clamp them. - // Choose the next position as an offset to chosen test position - const xy_pos_t noz_pos = test_position - probe.offset_xy; - xy_pos_t next_pos = { - noz_pos.x + float(cos(RADIANS(angle))) * radius, - noz_pos.y + float(sin(RADIANS(angle))) * radius - }; + X_current = X_probe_location - (X_PROBE_OFFSET_FROM_EXTRUDER) + cos(RADIANS(angle)) * radius; + Y_current = Y_probe_location - (Y_PROBE_OFFSET_FROM_EXTRUDER) + sin(RADIANS(angle)) * radius; - #if ENABLED(DELTA) - // If the probe can't reach the point on a round bed... - // Simply scale the numbers to bring them closer to origin. - while (!probe.can_reach(next_pos)) { - next_pos *= 0.8f; - if (verbose_level > 3) - SERIAL_ECHOLNPAIR_P(PSTR("Moving inward: X"), next_pos.x, SP_Y_STR, next_pos.y); - } + #if DISABLED(DELTA) + X_current = constrain(X_current, X_MIN_POS, X_MAX_POS); + Y_current = constrain(Y_current, Y_MIN_POS, Y_MAX_POS); #else - // For a rectangular bed just keep the probe in bounds - LIMIT(next_pos.x, X_MIN_POS, X_MAX_POS); - LIMIT(next_pos.y, Y_MIN_POS, Y_MAX_POS); + // If we have gone out too far, we can do a simple fix and scale the numbers + // back in closer to the origin. + while (!position_is_reachable_by_probe(X_current, Y_current)) { + X_current *= 0.8; + Y_current *= 0.8; + if (verbose_level > 3) { + SERIAL_ECHOPAIR("Pulling point towards center:", X_current); + SERIAL_ECHOLNPAIR(", ", Y_current); + } + } #endif - - if (verbose_level > 3) - SERIAL_ECHOLNPAIR_P(PSTR("Going to: X"), next_pos.x, SP_Y_STR, next_pos.y); - - do_blocking_move_to_xy(next_pos); + if (verbose_level > 3) { + SERIAL_PROTOCOLPGM("Going to:"); + SERIAL_ECHOPAIR(" X", X_current); + SERIAL_ECHOPAIR(" Y", Y_current); + SERIAL_ECHOLNPAIR(" Z", current_position[Z_AXIS]); + } + do_blocking_move_to_xy(X_current, Y_current); } // n_legs loop } // n_legs // Probe a single point - const float pz = probe.probe_at_point(test_position, raise_after, 0); + sample_set[n] = probe_pt(X_probe_location, Y_probe_location, raise_after, 0); // Break the loop if the probe fails - probing_good = !isnan(pz); + probing_good = !isnan(sample_set[n]); if (!probing_good) break; - // Store the new sample - sample_set[n] = pz; + /** + * Get the current mean for the data points we have so far + */ + float sum = 0.0; + for (uint8_t j = 0; j <= n; j++) sum += sample_set[j]; + mean = sum / (n + 1); - // Keep track of the largest and smallest samples - NOMORE(min, pz); - NOLESS(max, pz); + NOMORE(min, sample_set[n]); + NOLESS(max, sample_set[n]); - // Get the mean value of all samples thus far - sample_sum += pz; - mean = sample_sum / (n + 1); + /** + * Now, use that mean to calculate the standard deviation for the + * data points we have so far + */ + sum = 0.0; + for (uint8_t j = 0; j <= n; j++) + sum += sq(sample_set[j] - mean); - // Calculate the standard deviation so far. - // The value after the last sample will be the final output. - float dev_sum = 0.0; - LOOP_LE_N(j, n) dev_sum += sq(sample_set[j] - mean); - sigma = SQRT(dev_sum / (n + 1)); - - if (verbose_level > 1) { - SERIAL_ECHO(n + 1); - SERIAL_ECHOPAIR(" of ", int(n_samples)); - SERIAL_ECHOPAIR_F(": z: ", pz, 3); - dev_report(verbose_level > 2, mean, sigma, min, max); - SERIAL_EOL(); + sigma = SQRT(sum / (n + 1)); + if (verbose_level > 0) { + if (verbose_level > 1) { + SERIAL_PROTOCOL(n + 1); + SERIAL_PROTOCOLPGM(" of "); + SERIAL_PROTOCOL((int)n_samples); + SERIAL_PROTOCOLPGM(": z: "); + SERIAL_PROTOCOL_F(sample_set[n], 3); + if (verbose_level > 2) { + SERIAL_PROTOCOLPGM(" mean: "); + SERIAL_PROTOCOL_F(mean, 4); + SERIAL_PROTOCOLPGM(" sigma: "); + SERIAL_PROTOCOL_F(sigma, 6); + SERIAL_PROTOCOLPGM(" min: "); + SERIAL_PROTOCOL_F(min, 3); + SERIAL_PROTOCOLPGM(" max: "); + SERIAL_PROTOCOL_F(max, 3); + SERIAL_PROTOCOLPGM(" range: "); + SERIAL_PROTOCOL_F(max-min, 3); + } + SERIAL_EOL(); + } } } // n_samples loop } - probe.stow(); + STOW_PROBE(); if (probing_good) { - SERIAL_ECHOLNPGM("Finished!"); - dev_report(verbose_level > 0, mean, sigma, min, max, true); + SERIAL_PROTOCOLLNPGM("Finished!"); - #if HAS_WIRED_LCD - // Display M48 results in the status bar - char sigma_str[8]; - ui.status_printf_P(0, PSTR(S_FMT ": %s"), GET_TEXT(MSG_M48_DEVIATION), dtostrf(sigma, 2, 6, sigma_str)); - #endif + if (verbose_level > 0) { + SERIAL_PROTOCOLPGM("Mean: "); + SERIAL_PROTOCOL_F(mean, 6); + SERIAL_PROTOCOLPGM(" Min: "); + SERIAL_PROTOCOL_F(min, 3); + SERIAL_PROTOCOLPGM(" Max: "); + SERIAL_PROTOCOL_F(max, 3); + SERIAL_PROTOCOLPGM(" Range: "); + SERIAL_PROTOCOL_F(max-min, 3); + SERIAL_EOL(); + } + + SERIAL_PROTOCOLPGM("Standard Deviation: "); + SERIAL_PROTOCOL_F(sigma, 6); + SERIAL_EOL(); + SERIAL_EOL(); } - restore_feedrate_and_scaling(); + clean_up_after_endstop_or_probe_move(); // Re-enable bed level correction if it had been on - TERN_(HAS_LEVELING, set_bed_leveling_enabled(was_enabled)); + #if HAS_LEVELING + set_bed_leveling_enabled(was_enabled); + #endif report_current_position(); } diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp index 557204cc11..75d01b849a 100644 --- a/Marlin/src/gcode/calibrate/M665.cpp +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -37,24 +37,20 @@ * L = diagonal rod * R = delta radius * S = segments per second + * B = delta calibration radius * X = Alpha (Tower 1) angle trim - * Y = Beta (Tower 2) angle trim + * Y = Beta (Tower 2) angle trim * Z = Gamma (Tower 3) angle trim - * A = Alpha (Tower 1) digonal rod trim - * B = Beta (Tower 2) digonal rod trim - * C = Gamma (Tower 3) digonal rod trim */ void GcodeSuite::M665() { - if (parser.seen('H')) delta_height = parser.value_linear_units(); - if (parser.seen('L')) delta_diagonal_rod = parser.value_linear_units(); - if (parser.seen('R')) delta_radius = parser.value_linear_units(); - if (parser.seen('S')) delta_segments_per_second = parser.value_float(); - if (parser.seen('X')) delta_tower_angle_trim.a = parser.value_float(); - if (parser.seen('Y')) delta_tower_angle_trim.b = parser.value_float(); - if (parser.seen('Z')) delta_tower_angle_trim.c = parser.value_float(); - if (parser.seen('A')) delta_diagonal_rod_trim.a = parser.value_float(); - if (parser.seen('B')) delta_diagonal_rod_trim.b = parser.value_float(); - if (parser.seen('C')) delta_diagonal_rod_trim.c = parser.value_float(); + if (parser.seen('H')) delta_height = parser.value_linear_units(); + if (parser.seen('L')) delta_diagonal_rod = parser.value_linear_units(); + if (parser.seen('R')) delta_radius = parser.value_linear_units(); + if (parser.seen('S')) delta_segments_per_second = parser.value_float(); + if (parser.seen('B')) delta_calibration_radius = parser.value_float(); + if (parser.seen('X')) delta_tower_angle_trim[A_AXIS] = parser.value_float(); + if (parser.seen('Y')) delta_tower_angle_trim[B_AXIS] = parser.value_float(); + if (parser.seen('Z')) delta_tower_angle_trim[C_AXIS] = parser.value_float(); recalc_delta_settings(); } @@ -70,41 +66,32 @@ * S[segments-per-second] - Segments-per-second * P[theta-psi-offset] - Theta-Psi offset, added to the shoulder (A/X) angle * T[theta-offset] - Theta offset, added to the elbow (B/Y) angle - * Z[z-offset] - Z offset, added to Z * * A, P, and X are all aliases for the shoulder angle * B, T, and Y are all aliases for the elbow angle */ void GcodeSuite::M665() { - if (parser.seenval('S')) delta_segments_per_second = parser.value_float(); + if (parser.seen('S')) delta_segments_per_second = parser.value_float(); - #if HAS_SCARA_OFFSET + const bool hasA = parser.seen('A'), hasP = parser.seen('P'), hasX = parser.seen('X'); + const uint8_t sumAPX = hasA + hasP + hasX; + if (sumAPX == 1) + home_offset[A_AXIS] = parser.value_float(); + else if (sumAPX > 1) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Only one of A, P, or X is allowed."); + return; + } - if (parser.seenval('Z')) scara_home_offset.z = parser.value_linear_units(); - - const bool hasA = parser.seenval('A'), hasP = parser.seenval('P'), hasX = parser.seenval('X'); - const uint8_t sumAPX = hasA + hasP + hasX; - if (sumAPX) { - if (sumAPX == 1) - scara_home_offset.a = parser.value_float(); - else { - SERIAL_ERROR_MSG("Only one of A, P, or X is allowed."); - return; - } - } - - const bool hasB = parser.seenval('B'), hasT = parser.seenval('T'), hasY = parser.seenval('Y'); - const uint8_t sumBTY = hasB + hasT + hasY; - if (sumBTY) { - if (sumBTY == 1) - scara_home_offset.b = parser.value_float(); - else { - SERIAL_ERROR_MSG("Only one of B, T, or Y is allowed."); - return; - } - } - - #endif // HAS_SCARA_OFFSET + const bool hasB = parser.seen('B'), hasT = parser.seen('T'), hasY = parser.seen('Y'); + const uint8_t sumBTY = hasB + hasT + hasY; + if (sumBTY == 1) + home_offset[B_AXIS] = parser.value_float(); + else if (sumBTY > 1) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Only one of B, T, or Y is allowed."); + return; + } } #endif diff --git a/Marlin/src/gcode/calibrate/M666.cpp b/Marlin/src/gcode/calibrate/M666.cpp index e915aa8ff7..1cad2d0181 100644 --- a/Marlin/src/gcode/calibrate/M666.cpp +++ b/Marlin/src/gcode/calibrate/M666.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if ENABLED(DELTA) || HAS_EXTRA_ENDSTOPS +#if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) #include "../gcode.h" @@ -31,75 +31,77 @@ #include "../../module/delta.h" #include "../../module/motion.h" - #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) - #include "../../core/debug_out.h" - /** * M666: Set delta endstop adjustment */ void GcodeSuite::M666() { - DEBUG_SECTION(log_M666, "M666", DEBUGGING(LEVELING)); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM(">>> M666"); + } + #endif LOOP_XYZ(i) { - if (parser.seen(XYZ_CHAR(i))) { + if (parser.seen(axis_codes[i])) { const float v = parser.value_linear_units(); if (v * Z_HOME_DIR <= 0) delta_endstop_adj[i] = v; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("delta_endstop_adj[", XYZ_CHAR(i), "] = ", delta_endstop_adj[i]); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("delta_endstop_adj[", axis_codes[i]); + SERIAL_ECHOLNPAIR("] = ", delta_endstop_adj[i]); + } + #endif } } + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("<<< M666"); + } + #endif } -#elif HAS_EXTRA_ENDSTOPS +#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) #include "../../module/endstops.h" /** * M666: Set Dual Endstops offsets for X, Y, and/or Z. * With no parameters report current offsets. - * - * For Triple / Quad Z Endstops: - * Set Z2 Only: M666 S2 Z - * Set Z3 Only: M666 S3 Z - * Set Z4 Only: M666 S4 Z - * Set All: M666 Z */ void GcodeSuite::M666() { + bool report = true; #if ENABLED(X_DUAL_ENDSTOPS) - if (parser.seenval('X')) endstops.x2_endstop_adj = parser.value_linear_units(); - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - if (parser.seenval('Y')) endstops.y2_endstop_adj = parser.value_linear_units(); - #endif - #if ENABLED(Z_MULTI_ENDSTOPS) - if (parser.seenval('Z')) { - #if NUM_Z_STEPPER_DRIVERS >= 3 - const float z_adj = parser.value_linear_units(); - const int ind = parser.intval('S'); - if (!ind || ind == 2) endstops.z2_endstop_adj = z_adj; - if (!ind || ind == 3) endstops.z3_endstop_adj = z_adj; - #if NUM_Z_STEPPER_DRIVERS >= 4 - if (!ind || ind == 4) endstops.z4_endstop_adj = z_adj; - #endif - #else - endstops.z2_endstop_adj = parser.value_linear_units(); - #endif + if (parser.seen('X')) { + endstops.x_endstop_adj = parser.value_linear_units(); + report = false; } #endif - if (!parser.seen("XYZ")) { + #if ENABLED(Y_DUAL_ENDSTOPS) + if (parser.seen('Y')) { + endstops.y_endstop_adj = parser.value_linear_units(); + report = false; + } + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + if (parser.seen('Z')) { + endstops.z_endstop_adj = parser.value_linear_units(); + report = false; + } + #endif + if (report) { SERIAL_ECHOPGM("Dual Endstop Adjustment (mm): "); #if ENABLED(X_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" X2:", endstops.x2_endstop_adj); + SERIAL_ECHOPAIR(" X", endstops.x_endstop_adj); #endif #if ENABLED(Y_DUAL_ENDSTOPS) - SERIAL_ECHOPAIR(" Y2:", endstops.y2_endstop_adj); + SERIAL_ECHOPAIR(" Y", endstops.y_endstop_adj); #endif - #if ENABLED(Z_MULTI_ENDSTOPS) - #define _ECHO_ZADJ(N) SERIAL_ECHOPAIR(" Z" STRINGIFY(N) ":", endstops.z##N##_endstop_adj); - REPEAT_S(2, INCREMENT(NUM_Z_STEPPER_DRIVERS), _ECHO_ZADJ) + #if ENABLED(Z_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR(" Z", endstops.z_endstop_adj); #endif SERIAL_EOL(); } } -#endif // HAS_EXTRA_ENDSTOPS +#endif // X_DUAL_ENDSTOPS || Y_DUAL_ENDSTOPS || Z_DUAL_ENDSTOPS -#endif // DELTA || HAS_EXTRA_ENDSTOPS +#endif // DELTA || X_DUAL_ENDSTOPS || Y_DUAL_ENDSTOPS || Z_DUAL_ENDSTOPS diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp index b60f41748f..4841cecbc0 100644 --- a/Marlin/src/gcode/calibrate/M852.cpp +++ b/Marlin/src/gcode/calibrate/M852.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -42,8 +42,8 @@ void GcodeSuite::M852() { ++ijk; const float value = parser.value_linear_units(); if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { - if (planner.skew_factor.xy != value) { - planner.skew_factor.xy = value; + if (planner.xy_skew_factor != value) { + planner.xy_skew_factor = value; ++setval; } } @@ -57,8 +57,8 @@ void GcodeSuite::M852() { ++ijk; const float value = parser.value_linear_units(); if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { - if (planner.skew_factor.xz != value) { - planner.skew_factor.xz = value; + if (planner.xz_skew_factor != value) { + planner.xz_skew_factor = value; ++setval; } } @@ -70,8 +70,8 @@ void GcodeSuite::M852() { ++ijk; const float value = parser.value_linear_units(); if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { - if (planner.skew_factor.yz != value) { - planner.skew_factor.yz = value; + if (planner.yz_skew_factor != value) { + planner.yz_skew_factor = value; ++setval; } } @@ -82,24 +82,26 @@ void GcodeSuite::M852() { #endif if (badval) - SERIAL_ECHOLNPGM(STR_SKEW_MIN " " STRINGIFY(SKEW_FACTOR_MIN) " " STR_SKEW_MAX " " STRINGIFY(SKEW_FACTOR_MAX)); + SERIAL_ECHOLNPGM(MSG_SKEW_MIN " " STRINGIFY(SKEW_FACTOR_MIN) " " MSG_SKEW_MAX " " STRINGIFY(SKEW_FACTOR_MAX)); // When skew is changed the current position changes if (setval) { set_current_from_steppers_for_axis(ALL_AXES); - sync_plan_position(); + SYNC_PLAN_POSITION_KINEMATIC(); report_current_position(); } if (!ijk) { SERIAL_ECHO_START(); - serialprintPGM(GET_TEXT(MSG_SKEW_FACTOR)); - SERIAL_ECHOPAIR_F(" XY: ", planner.skew_factor.xy, 6); - #if ENABLED(SKEW_CORRECTION_FOR_Z) - SERIAL_ECHOPAIR_F(" XZ: ", planner.skew_factor.xz, 6); - SERIAL_ECHOPAIR_F(" YZ: ", planner.skew_factor.yz, 6); - #endif + SERIAL_ECHOPGM(MSG_SKEW_FACTOR " XY: "); + SERIAL_ECHO_F(planner.xy_skew_factor, 6); SERIAL_EOL(); + #if ENABLED(SKEW_CORRECTION_FOR_Z) + SERIAL_ECHOPAIR(" XZ: ", planner.xz_skew_factor); + SERIAL_ECHOLNPAIR(" YZ: ", planner.yz_skew_factor); + #else + SERIAL_EOL(); + #endif } } diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp index cb17fc45a6..cd45047be6 100644 --- a/Marlin/src/gcode/config/M200-M205.cpp +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" -#include "../../MarlinCore.h" +#include "../../Marlin.h" #include "../../module/planner.h" #if DISABLED(NO_VOLUMETRICS) @@ -30,42 +30,19 @@ * M200: Set filament diameter and set E axis units to cubic units * * T - Optional extruder number. Current extruder if omitted. - * D - Set filament diameter and enable. D0 disables volumetric. - * S - Turn volumetric ON or OFF. - * L - Volumetric extruder limit (in mm^3/sec). L0 disables the limit. + * D - Diameter of the filament. Use "D0" to switch back to linear units on the E axis. */ void GcodeSuite::M200() { - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; + if (get_target_extruder_from_command()) return; - bool vol_enable = parser.volumetric_enabled, - can_enable = true; - - if (parser.seenval('D')) { - const float dval = parser.value_linear_units(); - if (dval) { // Set filament size for volumetric calculation - planner.set_filament_size(target_extruder, dval); - vol_enable = true; // Dn = enable for compatibility - } - else - can_enable = false; // D0 = disable for compatibility + if (parser.seen('D')) { + // setting any extruder filament size disables volumetric on the assumption that + // slicers either generate in extruder values as cubic mm or as as filament feeds + // for all extruders + if ( (parser.volumetric_enabled = (parser.value_linear_units() != 0)) ) + planner.set_filament_size(target_extruder, parser.value_linear_units()); } - - // Enable or disable with S1 / S0 - parser.volumetric_enabled = can_enable && parser.boolval('S', vol_enable); - - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - if (parser.seenval('L')) { - // Set volumetric limit (in mm^3/sec) - const float lval = parser.value_float(); - if (WITHIN(lval, 0, 20)) - planner.set_volumetric_extruder_limit(target_extruder, lval); - else - SERIAL_ECHOLNPGM("?L value out of range (0-20)."); - } - #endif - planner.calculate_volumetric_multipliers(); } @@ -78,20 +55,16 @@ */ void GcodeSuite::M201() { - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - - #ifdef XY_FREQUENCY_LIMIT - if (parser.seenval('F')) planner.set_frequency_limit(parser.value_byte()); - if (parser.seenval('G')) planner.xy_freq_min_speed_factor = constrain(parser.value_float(), 1, 100) / 100; - #endif + GET_TARGET_EXTRUDER(); LOOP_XYZE(i) { if (parser.seen(axis_codes[i])) { - const uint8_t a = (i == E_AXIS ? uint8_t(E_AXIS_N(target_extruder)) : i); - planner.set_max_acceleration(a, parser.value_axis_units((AxisEnum)a)); + const uint8_t a = i + (i == E_AXIS ? TARGET_EXTRUDER : 0); + planner.max_acceleration_mm_per_s2[a] = parser.value_axis_units((AxisEnum)a); } } + // steps per sq second need to be updated to agree with the units per sq second (as they are what is used in the planner) + planner.reset_acceleration_rates(); } /** @@ -101,13 +74,12 @@ void GcodeSuite::M201() { */ void GcodeSuite::M203() { - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; + GET_TARGET_EXTRUDER(); LOOP_XYZE(i) if (parser.seen(axis_codes[i])) { - const uint8_t a = (i == E_AXIS ? uint8_t(E_AXIS_N(target_extruder)) : i); - planner.set_max_feedrate(a, parser.value_axis_units((AxisEnum)a)); + const uint8_t a = i + (i == E_AXIS ? TARGET_EXTRUDER : 0); + planner.max_feedrate_mm_s[a] = parser.value_axis_units((AxisEnum)a); } } @@ -119,18 +91,27 @@ void GcodeSuite::M203() { * T = Travel (non printing) moves */ void GcodeSuite::M204() { - if (!parser.seen("PRST")) { - SERIAL_ECHOPAIR("Acceleration: P", planner.settings.acceleration); - SERIAL_ECHOPAIR(" R", planner.settings.retract_acceleration); - SERIAL_ECHOLNPAIR_P(SP_T_STR, planner.settings.travel_acceleration); + bool report = true; + if (parser.seenval('S')) { // Kept for legacy compatibility. Should NOT BE USED for new developments. + planner.travel_acceleration = planner.acceleration = parser.value_linear_units(); + report = false; } - else { - //planner.synchronize(); - // 'S' for legacy compatibility. Should NOT BE USED for new development - if (parser.seenval('S')) planner.settings.travel_acceleration = planner.settings.acceleration = parser.value_linear_units(); - if (parser.seenval('P')) planner.settings.acceleration = parser.value_linear_units(); - if (parser.seenval('R')) planner.settings.retract_acceleration = parser.value_linear_units(); - if (parser.seenval('T')) planner.settings.travel_acceleration = parser.value_linear_units(); + if (parser.seenval('P')) { + planner.acceleration = parser.value_linear_units(); + report = false; + } + if (parser.seenval('R')) { + planner.retract_acceleration = parser.value_linear_units(); + report = false; + } + if (parser.seenval('T')) { + planner.travel_acceleration = parser.value_linear_units(); + report = false; + } + if (report) { + SERIAL_ECHOPAIR("Acceleration: P", planner.acceleration); + SERIAL_ECHOPAIR(" R", planner.retract_acceleration); + SERIAL_ECHOLNPAIR(" T", planner.travel_acceleration); } } @@ -144,48 +125,34 @@ void GcodeSuite::M204() { * Y = Max Y Jerk (units/sec^2) * Z = Max Z Jerk (units/sec^2) * E = Max E Jerk (units/sec^2) - * J = Junction Deviation (mm) (If not using CLASSIC_JERK) + * J = Junction Deviation (mm) (Requires JUNCTION_DEVIATION) */ void GcodeSuite::M205() { - #if HAS_JUNCTION_DEVIATION - #define J_PARAM "J" - #else - #define J_PARAM - #endif - #if HAS_CLASSIC_JERK - #define XYZE_PARAM "XYZE" - #else - #define XYZE_PARAM - #endif - if (!parser.seen("BST" J_PARAM XYZE_PARAM)) return; - - //planner.synchronize(); - if (parser.seen('B')) planner.settings.min_segment_time_us = parser.value_ulong(); - if (parser.seen('S')) planner.settings.min_feedrate_mm_s = parser.value_linear_units(); - if (parser.seen('T')) planner.settings.min_travel_feedrate_mm_s = parser.value_linear_units(); - #if HAS_JUNCTION_DEVIATION + if (parser.seen('B')) planner.min_segment_time_us = parser.value_ulong(); + if (parser.seen('S')) planner.min_feedrate_mm_s = parser.value_linear_units(); + if (parser.seen('T')) planner.min_travel_feedrate_mm_s = parser.value_linear_units(); + #if ENABLED(JUNCTION_DEVIATION) if (parser.seen('J')) { const float junc_dev = parser.value_linear_units(); if (WITHIN(junc_dev, 0.01f, 0.3f)) { planner.junction_deviation_mm = junc_dev; - TERN_(LIN_ADVANCE, planner.recalculate_max_e_jerk()); + planner.recalculate_max_e_jerk(); + } + else { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("?J out of range (0.01 to 0.3)"); } - else - SERIAL_ERROR_MSG("?J out of range (0.01 to 0.3)"); } - #endif - #if HAS_CLASSIC_JERK - if (parser.seen('X')) planner.set_max_jerk(X_AXIS, parser.value_linear_units()); - if (parser.seen('Y')) planner.set_max_jerk(Y_AXIS, parser.value_linear_units()); + #else + if (parser.seen('X')) planner.max_jerk[X_AXIS] = parser.value_linear_units(); + if (parser.seen('Y')) planner.max_jerk[Y_AXIS] = parser.value_linear_units(); if (parser.seen('Z')) { - planner.set_max_jerk(Z_AXIS, parser.value_linear_units()); - #if HAS_MESH && DISABLED(LIMITED_JERK_EDITING) - if (planner.max_jerk.z <= 0.1f) + planner.max_jerk[Z_AXIS] = parser.value_linear_units(); + #if HAS_MESH + if (planner.max_jerk[Z_AXIS] <= 0.1f) SERIAL_ECHOLNPGM("WARNING! Low Z Jerk may lead to unwanted pauses."); #endif } - #if HAS_CLASSIC_E_JERK - if (parser.seen('E')) planner.set_max_jerk(E_AXIS, parser.value_linear_units()); - #endif + if (parser.seen('E')) planner.max_jerk[E_AXIS] = parser.value_linear_units(); #endif } diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp deleted file mode 100644 index b57dec31f3..0000000000 --- a/Marlin/src/gcode/config/M217.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_MULTI_EXTRUDER - -#include "../gcode.h" -#include "../../module/tool_change.h" - -#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - #include "../../module/motion.h" -#endif - -#include "../../MarlinCore.h" // for SP_X_STR, etc. - -extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; - -void M217_report(const bool eeprom=false) { - - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - serialprintPGM(eeprom ? PSTR(" M217") : PSTR("Toolchange:")); - SERIAL_ECHOPAIR(" S", LINEAR_UNIT(toolchange_settings.swap_length)); - SERIAL_ECHOPAIR_P(SP_B_STR, LINEAR_UNIT(toolchange_settings.extra_resume), - SP_E_STR, LINEAR_UNIT(toolchange_settings.extra_prime), - SP_P_STR, LINEAR_UNIT(toolchange_settings.prime_speed)); - SERIAL_ECHOPAIR(" R", LINEAR_UNIT(toolchange_settings.retract_speed), - " U", LINEAR_UNIT(toolchange_settings.unretract_speed), - " F", toolchange_settings.fan_speed, - " G", toolchange_settings.fan_time); - - #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOPAIR(" A", int(migration.automode)); - SERIAL_ECHOPAIR(" L", LINEAR_UNIT(migration.last)); - #endif - - #if ENABLED(TOOLCHANGE_PARK) - SERIAL_ECHOPAIR(" W", LINEAR_UNIT(toolchange_settings.enable_park)); - SERIAL_ECHOPAIR_P(SP_X_STR, LINEAR_UNIT(toolchange_settings.change_point.x)); - SERIAL_ECHOPAIR_P(SP_Y_STR, LINEAR_UNIT(toolchange_settings.change_point.y)); - #endif - - #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) - SERIAL_ECHOPAIR(" V", LINEAR_UNIT(enable_first_prime)); - #endif - - #else - - UNUSED(eeprom); - - #endif - - SERIAL_ECHOPAIR_P(SP_Z_STR, LINEAR_UNIT(toolchange_settings.z_raise)); - SERIAL_EOL(); -} - -/** - * M217 - Set SINGLENOZZLE toolchange parameters - * - * // Tool change command - * Q Prime active tool and exit - * - * // Tool change settings - * S[linear] Swap length - * B[linear] Extra Swap length - * E[linear] Prime length - * P[linear/m] Prime speed - * R[linear/m] Retract speed - * U[linear/m] UnRetract speed - * V[linear] 0/1 Enable auto prime first extruder used - * W[linear] 0/1 Enable park & Z Raise - * X[linear] Park X (Requires TOOLCHANGE_PARK) - * Y[linear] Park Y (Requires TOOLCHANGE_PARK) - * Z[linear] Z Raise - * F[linear] Fan Speed 0-255 - * G[linear/s] Fan time - * - * Tool migration settings - * A[0|1] Enable auto-migration on runout - * L[index] Last extruder to use for auto-migration - * - * Tool migration command - * T[index] Migrate to next extruder or the given extruder - */ -void GcodeSuite::M217() { - - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - - static constexpr float max_extrude = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 500); - - if (parser.seen('Q')) { tool_change_prime(); return; } - - if (parser.seenval('S')) { const float v = parser.value_linear_units(); toolchange_settings.swap_length = constrain(v, 0, max_extrude); } - if (parser.seenval('B')) { const float v = parser.value_linear_units(); toolchange_settings.extra_resume = constrain(v, -10, 10); } - if (parser.seenval('E')) { const float v = parser.value_linear_units(); toolchange_settings.extra_prime = constrain(v, 0, max_extrude); } - if (parser.seenval('P')) { const int16_t v = parser.value_linear_units(); toolchange_settings.prime_speed = constrain(v, 10, 5400); } - if (parser.seenval('R')) { const int16_t v = parser.value_linear_units(); toolchange_settings.retract_speed = constrain(v, 10, 5400); } - if (parser.seenval('U')) { const int16_t v = parser.value_linear_units(); toolchange_settings.unretract_speed = constrain(v, 10, 5400); } - #if TOOLCHANGE_FS_FAN >= 0 && HAS_FAN - if (parser.seenval('F')) { const int16_t v = parser.value_linear_units(); toolchange_settings.fan_speed = constrain(v, 0, 255); } - if (parser.seenval('G')) { const int16_t v = parser.value_linear_units(); toolchange_settings.fan_time = constrain(v, 1, 30); } - #endif - #endif - - #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) - if (parser.seenval('V')) { enable_first_prime = parser.value_linear_units(); } - #endif - - #if ENABLED(TOOLCHANGE_PARK) - if (parser.seenval('W')) { toolchange_settings.enable_park = parser.value_linear_units(); } - if (parser.seenval('X')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.x = constrain(v, X_MIN_POS, X_MAX_POS); } - if (parser.seenval('Y')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.y = constrain(v, Y_MIN_POS, Y_MAX_POS); } - #endif - - if (parser.seenval('Z')) { toolchange_settings.z_raise = parser.value_linear_units(); } - - #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - migration.target = 0; // 0 = disabled - - if (parser.seenval('L')) { // Last - const int16_t lval = parser.value_int(); - if (WITHIN(lval, 0, EXTRUDERS - 1)) { - migration.last = lval; - migration.automode = (active_extruder < migration.last); - } - } - - if (parser.seen('A')) // Auto on/off - migration.automode = parser.value_bool(); - - if (parser.seen('T')) { // Migrate now - if (parser.has_value()) { - const int16_t tval = parser.value_int(); - if (WITHIN(tval, 0, EXTRUDERS - 1) && tval != active_extruder) { - migration.target = tval + 1; - extruder_migration(); - migration.target = 0; // disable - return; - } - else - migration.target = 0; // disable - } - else { - extruder_migration(); - return; - } - } - - #endif - - M217_report(); -} - -#endif // HAS_MULTI_EXTRUDER diff --git a/Marlin/src/gcode/config/M218.cpp b/Marlin/src/gcode/config/M218.cpp index 7701320e9e..6093c19c81 100644 --- a/Marlin/src/gcode/config/M218.cpp +++ b/Marlin/src/gcode/config/M218.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -40,31 +40,39 @@ * Z */ void GcodeSuite::M218() { + if (get_target_extruder_from_command() || target_extruder == 0) return; - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; + bool report = true; + if (parser.seenval('X')) { + hotend_offset[X_AXIS][target_extruder] = parser.value_linear_units(); + report = false; + } + if (parser.seenval('Y')) { + hotend_offset[Y_AXIS][target_extruder] = parser.value_linear_units(); + report = false; + } + if (parser.seenval('Z')) { + hotend_offset[Z_AXIS][target_extruder] = parser.value_linear_units(); + report = false; + } - if (parser.seenval('X')) hotend_offset[target_extruder].x = parser.value_linear_units(); - if (parser.seenval('Y')) hotend_offset[target_extruder].y = parser.value_linear_units(); - if (parser.seenval('Z')) hotend_offset[target_extruder].z = parser.value_linear_units(); - - if (!parser.seen("XYZ")) { + if (report) { SERIAL_ECHO_START(); - SERIAL_ECHOPGM(STR_HOTEND_OFFSET); + SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); HOTEND_LOOP() { SERIAL_CHAR(' '); - SERIAL_ECHO(hotend_offset[e].x); + SERIAL_ECHO(hotend_offset[X_AXIS][e]); SERIAL_CHAR(','); - SERIAL_ECHO(hotend_offset[e].y); + SERIAL_ECHO(hotend_offset[Y_AXIS][e]); SERIAL_CHAR(','); - SERIAL_ECHO_F(hotend_offset[e].z, 3); + SERIAL_ECHO_F(hotend_offset[Z_AXIS][e], 3); } SERIAL_EOL(); } #if ENABLED(DELTA) if (target_extruder == active_extruder) - do_blocking_move_to_xy(current_position, planner.settings.max_feedrate_mm_s[X_AXIS]); + do_blocking_move_to_xy(current_position[X_AXIS], current_position[Y_AXIS], planner.max_feedrate_mm_s[X_AXIS]); #endif } diff --git a/Marlin/src/gcode/config/M220.cpp b/Marlin/src/gcode/config/M220.cpp index 1bec6a7782..82fa9c0ba3 100644 --- a/Marlin/src/gcode/config/M220.cpp +++ b/Marlin/src/gcode/config/M220.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,30 +24,11 @@ #include "../../module/motion.h" /** - * M220: Set speed percentage factor, aka "Feed Rate" - * - * Parameters - * S : Set the feed rate percentage factor - * - * Report the current speed percentage factor if no parameter is specified - * - * With PRUSA_MMU2... - * B : Flag to back up the current factor - * R : Flag to restore the last-saved factor + * M220: Set speed percentage factor, aka "Feed Rate" (M220 S95) */ void GcodeSuite::M220() { - #if ENABLED(PRUSA_MMU2) - static int16_t backup_feedrate_percentage = 100; - if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage; - if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage; - #endif + if (parser.seenval('S')) + feedrate_percentage = parser.value_int(); - if (parser.seenval('S')) feedrate_percentage = parser.value_int(); - - if (!parser.seen_any()) { - SERIAL_ECHOPAIR("FR:", feedrate_percentage); - SERIAL_CHAR('%'); - SERIAL_EOL(); - } } diff --git a/Marlin/src/gcode/config/M221.cpp b/Marlin/src/gcode/config/M221.cpp index 7ba22d1901..e5d4204f5e 100644 --- a/Marlin/src/gcode/config/M221.cpp +++ b/Marlin/src/gcode/config/M221.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,32 +16,28 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" #include "../../module/planner.h" -#if EXTRUDERS - /** * M221: Set extrusion percentage (M221 T0 S95) */ void GcodeSuite::M221() { - - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - - if (parser.seenval('S')) - planner.set_flow(target_extruder, parser.value_int()); + if (get_target_extruder_from_command()) return; + if (parser.seenval('S')) { + planner.flow_percentage[target_extruder] = parser.value_int(); + planner.refresh_e_factor(target_extruder); + } else { SERIAL_ECHO_START(); - SERIAL_CHAR('E', '0' + target_extruder); + SERIAL_CHAR('E'); + SERIAL_CHAR('0' + target_extruder); SERIAL_ECHOPAIR(" Flow: ", planner.flow_percentage[target_extruder]); SERIAL_CHAR('%'); SERIAL_EOL(); } } - -#endif // EXTRUDERS diff --git a/Marlin/src/gcode/config/M281.cpp b/Marlin/src/gcode/config/M281.cpp index 018ca1c092..08e6f56334 100644 --- a/Marlin/src/gcode/config/M281.cpp +++ b/Marlin/src/gcode/config/M281.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,33 +16,20 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if ENABLED(EDITABLE_SERVO_ANGLES) +#if HAS_SERVOS && ENABLED(EDITABLE_SERVO_ANGLES) #include "../gcode.h" #include "../../module/servo.h" -/** - * M281 - Edit / Report Servo Angles - * - * P - Servo to update - * L - Deploy Angle - * U - Stowed Angle - */ void GcodeSuite::M281() { if (!parser.seenval('P')) return; const int servo_index = parser.value_int(); if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) { - #if ENABLED(BLTOUCH) - if (servo_index == Z_PROBE_SERVO_NR) { - SERIAL_ERROR_MSG("BLTouch angles can't be changed."); - return; - } - #endif bool angle_change = false; if (parser.seen('L')) { servo_angles[servo_index][0] = parser.value_int(); @@ -54,15 +41,16 @@ void GcodeSuite::M281() { } if (!angle_change) { SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(" Servo ", servo_index, - " L", servo_angles[servo_index][0], - " U", servo_angles[servo_index][1]); + SERIAL_ECHOPAIR(" Servo ", servo_index); + SERIAL_ECHOPAIR(" L", servo_angles[servo_index][0]); + SERIAL_ECHOLNPAIR(" U", servo_angles[servo_index][1]); } } else { SERIAL_ERROR_START(); - SERIAL_ECHOLNPAIR("Servo ", servo_index, " out of range"); + SERIAL_ECHOPAIR("Servo ", servo_index); + SERIAL_ECHOLNPGM(" out of range"); } } -#endif // EDITABLE_SERVO_ANGLES +#endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES diff --git a/Marlin/src/gcode/config/M301.cpp b/Marlin/src/gcode/config/M301.cpp index 7b3f57608b..f61896ac73 100644 --- a/Marlin/src/gcode/config/M301.cpp +++ b/Marlin/src/gcode/config/M301.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -30,8 +30,6 @@ /** * M301: Set PID parameters P I D (and optionally C, L) * - * E[extruder] Default: 0 - * * P[float] Kp term * I[float] Ki term (unscaled) * D[float] Kd term (unscaled) @@ -40,15 +38,11 @@ * * C[float] Kc term * L[int] LPQ length - * - * With PID_FAN_SCALING: - * - * F[float] Kf term */ void GcodeSuite::M301() { // multi-extruder PID patch: M301 updates or prints a single extruder's PID values - // default behavior (omitting E parameter) is to update for extruder 0 only + // default behaviour (omitting E parameter) is to update for extruder 0 only const uint8_t e = parser.byteval('E'); // extruder being updated if (e < HOTENDS) { // catch bad input value @@ -62,30 +56,24 @@ void GcodeSuite::M301() { NOLESS(thermalManager.lpq_len, 0); #endif - #if ENABLED(PID_FAN_SCALING) - if (parser.seen('F')) PID_PARAM(Kf, e) = parser.value_float(); - #endif - thermalManager.updatePID(); - SERIAL_ECHO_START(); #if ENABLED(PID_PARAMS_PER_HOTEND) SERIAL_ECHOPAIR(" e:", e); // specify extruder in serial output - #endif - SERIAL_ECHOPAIR(" p:", PID_PARAM(Kp, e), - " i:", unscalePID_i(PID_PARAM(Ki, e)), - " d:", unscalePID_d(PID_PARAM(Kd, e))); + #endif // PID_PARAMS_PER_HOTEND + SERIAL_ECHOPAIR(" p:", PID_PARAM(Kp, e)); + SERIAL_ECHOPAIR(" i:", unscalePID_i(PID_PARAM(Ki, e))); + SERIAL_ECHOPAIR(" d:", unscalePID_d(PID_PARAM(Kd, e))); #if ENABLED(PID_EXTRUSION_SCALING) + //Kc does not have scaling applied above, or in resetting defaults SERIAL_ECHOPAIR(" c:", PID_PARAM(Kc, e)); #endif - #if ENABLED(PID_FAN_SCALING) - SERIAL_ECHOPAIR(" f:", PID_PARAM(Kf, e)); - #endif - SERIAL_EOL(); } - else - SERIAL_ERROR_MSG(STR_INVALID_EXTRUDER); + else { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_INVALID_EXTRUDER); + } } #endif // PIDTEMP diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp index afdc6c9e85..5097c5493a 100644 --- a/Marlin/src/gcode/config/M302.cpp +++ b/Marlin/src/gcode/config/M302.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -37,7 +37,7 @@ * * M302 ; report current cold extrusion state * M302 P0 ; enable cold extrusion checking - * M302 P1 ; disable cold extrusion checking + * M302 P1 ; disables cold extrusion checking * M302 S0 ; always allow extrusion (disables checking) * M302 S170 ; only allow extrusion above 170 * M302 S170 P1 ; set min extrude temp to 170 but leave disabled @@ -54,9 +54,9 @@ void GcodeSuite::M302() { else if (!seen_S) { // Report current state SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Cold extrudes are "); - serialprintPGM(thermalManager.allow_cold_extrude ? PSTR("en") : PSTR("dis")); - SERIAL_ECHOLNPAIR("abled (min temp ", thermalManager.extrude_min_temp, "C)"); + SERIAL_ECHOPAIR("Cold extrudes are ", (thermalManager.allow_cold_extrude ? "en" : "dis")); + SERIAL_ECHOPAIR("abled (min temp ", thermalManager.extrude_min_temp); + SERIAL_ECHOLNPGM("C)"); } } diff --git a/Marlin/src/gcode/config/M304.cpp b/Marlin/src/gcode/config/M304.cpp index 10739be3f8..3bc645903f 100644 --- a/Marlin/src/gcode/config/M304.cpp +++ b/Marlin/src/gcode/config/M304.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,22 +27,15 @@ #include "../gcode.h" #include "../../module/temperature.h" -/** - * M304 - Set and/or Report the current Bed PID values - * - * P - Set the P value - * I - Set the I value - * D - Set the D value - */ void GcodeSuite::M304() { - if (parser.seen('P')) thermalManager.temp_bed.pid.Kp = parser.value_float(); - if (parser.seen('I')) thermalManager.temp_bed.pid.Ki = scalePID_i(parser.value_float()); - if (parser.seen('D')) thermalManager.temp_bed.pid.Kd = scalePID_d(parser.value_float()); + if (parser.seen('P')) thermalManager.bedKp = parser.value_float(); + if (parser.seen('I')) thermalManager.bedKi = scalePID_i(parser.value_float()); + if (parser.seen('D')) thermalManager.bedKd = scalePID_d(parser.value_float()); SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(" p:", thermalManager.temp_bed.pid.Kp, - " i:", unscalePID_i(thermalManager.temp_bed.pid.Ki), - " d:", unscalePID_d(thermalManager.temp_bed.pid.Kd)); + SERIAL_ECHOPAIR(" p:", thermalManager.bedKp); + SERIAL_ECHOPAIR(" i:", unscalePID_i(thermalManager.bedKi)); + SERIAL_ECHOLNPAIR(" d:", unscalePID_d(thermalManager.bedKd)); } #endif // PIDTEMPBED diff --git a/Marlin/src/gcode/config/M305.cpp b/Marlin/src/gcode/config/M305.cpp deleted file mode 100644 index 3e7206aee4..0000000000 --- a/Marlin/src/gcode/config/M305.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_USER_THERMISTORS - -#include "../gcode.h" -#include "../../module/temperature.h" - -/** - * M305: Set (or report) custom thermistor parameters - * - * P[index] Thermistor table index - * R[ohms] Pullup resistor value - * T[ohms] Resistance at 25C - * B[beta] Thermistor "beta" value - * C[coeff] Steinhart-Hart Coefficient 'C' - * - * Format: M305 P[tbl_index] R[pullup_resistor_val] T[therm_25C_resistance] B[therm_beta] C[Steinhart_Hart_C_coeff] - * - * Examples: M305 P0 R4700 T100000 B3950 C0.0 - * M305 P0 R4700 - * M305 P0 T100000 - * M305 P0 B3950 - * M305 P0 C0.0 - */ -void GcodeSuite::M305() { - const int8_t t_index = parser.intval('P', -1); - const bool do_set = parser.seen("BCRT"); - - // A valid P index is required - if (t_index >= (USER_THERMISTORS) || (do_set && t_index < 0)) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("!Invalid index. (0 <= P <= ", int(USER_THERMISTORS - 1), ")"); - } - else if (do_set) { - if (parser.seen('R')) // Pullup resistor value - if (!thermalManager.set_pull_up_res(t_index, parser.value_float())) - SERIAL_ECHO_MSG("!Invalid series resistance. (0 < R < 1000000)"); - - if (parser.seen('T')) // Resistance at 25C - if (!thermalManager.set_res25(t_index, parser.value_float())) - SERIAL_ECHO_MSG("!Invalid 25C resistance. (0 < T < 10000000)"); - - if (parser.seen('B')) // Beta value - if (!thermalManager.set_beta(t_index, parser.value_float())) - SERIAL_ECHO_MSG("!Invalid beta. (0 < B < 1000000)"); - - if (parser.seen('C')) // Steinhart-Hart C coefficient - if (!thermalManager.set_sh_coeff(t_index, parser.value_float())) - SERIAL_ECHO_MSG("!Invalid Steinhart-Hart C coeff. (-0.01 < C < +0.01)"); - } // If not setting then report parameters - else if (t_index < 0) { // ...all user thermistors - LOOP_L_N(i, USER_THERMISTORS) - thermalManager.log_user_thermistor(i); - } - else // ...one user thermistor - thermalManager.log_user_thermistor(t_index); -} - -#endif // HAS_USER_THERMISTORS diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index 1e780ca05a..62863e0028 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,7 +25,7 @@ #if ENABLED(PINS_DEBUGGING) #include "../gcode.h" -#include "../../MarlinCore.h" // for pin_is_protected +#include "../../Marlin.h" // for pin_is_protected #include "../../pins/pinsDebug.h" #include "../../module/endstops.h" @@ -34,48 +34,23 @@ #include "../../module/servo.h" #endif -#if ENABLED(BLTOUCH) - #include "../../feature/bltouch.h" -#endif - -#if ENABLED(HOST_PROMPT_SUPPORT) - #include "../../feature/host_actions.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../../lcd/extui/ui_api.h" -#endif - -#if HAS_RESUME_CONTINUE - #include "../../lcd/ultralcd.h" -#endif - -#ifndef GET_PIN_MAP_PIN_M43 - #define GET_PIN_MAP_PIN_M43(Q) GET_PIN_MAP_PIN(Q) -#endif - inline void toggle_pins() { const bool ignore_protection = parser.boolval('I'); const int repeat = parser.intval('R', 1), start = PARSED_PIN_INDEX('S', 0), - end = PARSED_PIN_INDEX('L', NUM_DIGITAL_PINS - 1), + end = PARSED_PIN_INDEX('E', NUM_DIGITAL_PINS - 1), wait = parser.intval('W', 500); - LOOP_S_LE_N(i, start, end) { - pin_t pin = GET_PIN_MAP_PIN_M43(i); + for (uint8_t i = start; i <= end; i++) { + pin_t pin = GET_PIN_MAP_PIN(i); + //report_pin_state_extended(pin, ignore_protection, false); if (!VALID_PIN(pin)) continue; - if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) { - report_pin_state_extended(pin, ignore_protection, true, PSTR("Untouched ")); + if (!ignore_protection && pin_is_protected(pin)) { + report_pin_state_extended(pin, ignore_protection, true, "Untouched "); SERIAL_EOL(); } else { - watchdog_refresh(); - report_pin_state_extended(pin, ignore_protection, true, PSTR("Pulsing ")); - #ifdef __STM32F1__ - const auto prior_mode = _GET_MODE(i); - #else - const bool prior_mode = GET_PINMODE(pin); - #endif + report_pin_state_extended(pin, ignore_protection, true, "Pulsing "); #if AVR_AT90USB1286_FAMILY // Teensy IDEs don't know about these pins so must use FASTIO if (pin == TEENSY_E2) { SET_OUTPUT(TEENSY_E2); @@ -98,17 +73,12 @@ inline void toggle_pins() { { pinMode(pin, OUTPUT); for (int16_t j = 0; j < repeat; j++) { - watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); - watchdog_refresh(); extDigitalWrite(pin, 1); safe_delay(wait); - watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); - watchdog_refresh(); + digitalWrite(pin, 0); safe_delay(wait); + digitalWrite(pin, 1); safe_delay(wait); + digitalWrite(pin, 0); safe_delay(wait); } } - #ifdef __STM32F1__ - _SET_MODE(i, prior_mode); - #else - pinMode(pin, prior_mode); - #endif + } SERIAL_EOL(); } @@ -117,153 +87,124 @@ inline void toggle_pins() { } // toggle_pins inline void servo_probe_test() { - #if !(NUM_SERVOS > 0 && HAS_SERVO_0) - SERIAL_ERROR_MSG("SERVO not set up."); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("SERVO not setup"); #elif !HAS_Z_SERVO_PROBE - SERIAL_ERROR_MSG("Z_PROBE_SERVO_NR not set up."); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Z_PROBE_SERVO_NR not setup"); #else // HAS_Z_SERVO_PROBE const uint8_t probe_index = parser.byteval('P', Z_PROBE_SERVO_NR); - SERIAL_ECHOLNPAIR("Servo probe test\n" - ". using index: ", int(probe_index), - ", deploy angle: ", servo_angles[probe_index][0], - ", stow angle: ", servo_angles[probe_index][1] - ); + SERIAL_PROTOCOLLNPGM("Servo probe test"); + SERIAL_PROTOCOLLNPAIR(". using index: ", probe_index); + SERIAL_PROTOCOLLNPAIR(". deploy angle: ", servo_angles[probe_index][0]); + SERIAL_PROTOCOLLNPAIR(". stow angle: ", servo_angles[probe_index][1]); - bool deploy_state = false, stow_state; + bool probe_inverting; #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) #define PROBE_TEST_PIN Z_MIN_PIN - constexpr bool probe_inverting = Z_MIN_ENDSTOP_INVERTING; - SERIAL_ECHOLNPAIR(". Probe Z_MIN_PIN: ", int(PROBE_TEST_PIN)); - SERIAL_ECHOPGM(". Z_MIN_ENDSTOP_INVERTING: "); + SERIAL_PROTOCOLLNPAIR(". probe uses Z_MIN pin: ", PROBE_TEST_PIN); + SERIAL_PROTOCOLLNPGM(". uses Z_MIN_ENDSTOP_INVERTING (ignores Z_MIN_PROBE_ENDSTOP_INVERTING)"); + SERIAL_PROTOCOLPGM(". Z_MIN_ENDSTOP_INVERTING: "); - #else + #if Z_MIN_ENDSTOP_INVERTING + SERIAL_PROTOCOLLNPGM("true"); + #else + SERIAL_PROTOCOLLNPGM("false"); + #endif + + probe_inverting = Z_MIN_ENDSTOP_INVERTING; + + #elif ENABLED(Z_MIN_PROBE_ENDSTOP) #define PROBE_TEST_PIN Z_MIN_PROBE_PIN - constexpr bool probe_inverting = Z_MIN_PROBE_ENDSTOP_INVERTING; + SERIAL_PROTOCOLLNPAIR(". probe uses Z_MIN_PROBE_PIN: ", PROBE_TEST_PIN); + SERIAL_PROTOCOLLNPGM(". uses Z_MIN_PROBE_ENDSTOP_INVERTING (ignores Z_MIN_ENDSTOP_INVERTING)"); + SERIAL_PROTOCOLPGM(". Z_MIN_PROBE_ENDSTOP_INVERTING: "); - SERIAL_ECHOLNPAIR(". Probe Z_MIN_PROBE_PIN: ", int(PROBE_TEST_PIN)); - SERIAL_ECHOPGM( ". Z_MIN_PROBE_ENDSTOP_INVERTING: "); + #if Z_MIN_PROBE_ENDSTOP_INVERTING + SERIAL_PROTOCOLLNPGM("true"); + #else + SERIAL_PROTOCOLLNPGM("false"); + #endif + + probe_inverting = Z_MIN_PROBE_ENDSTOP_INVERTING; #endif - serialprint_truefalse(probe_inverting); - SERIAL_EOL(); - + SERIAL_PROTOCOLLNPGM(". deploy & stow 4 times"); SET_INPUT_PULLUP(PROBE_TEST_PIN); + uint8_t i = 0; + bool deploy_state, stow_state; + do { + MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); // Deploy + safe_delay(500); + deploy_state = READ(PROBE_TEST_PIN); + MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); // Stow + safe_delay(500); + stow_state = READ(PROBE_TEST_PIN); + } while (++i < 4); + if (probe_inverting != deploy_state) SERIAL_PROTOCOLLNPGM("WARNING - INVERTING setting probably backwards"); - // First, check for a probe that recognizes an advanced BLTouch sequence. - // In addition to STOW and DEPLOY, it uses SW MODE (and RESET in the beginning) - // to see if this is one of the following: BLTOUCH Classic 1.2, 1.3, or - // BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1. But only if the user has actually - // configured a BLTouch as being present. If the user has not configured this, - // the BLTouch will be detected in the last phase of these tests (see further on). - bool blt = false; - // This code will try to detect a BLTouch probe or clone - #if ENABLED(BLTOUCH) - SERIAL_ECHOLNPGM(". Check for BLTOUCH"); - bltouch._reset(); - bltouch._stow(); - if (probe_inverting == READ(PROBE_TEST_PIN)) { - bltouch._set_SW_mode(); - if (probe_inverting != READ(PROBE_TEST_PIN)) { - bltouch._deploy(); - if (probe_inverting == READ(PROBE_TEST_PIN)) { - bltouch._stow(); - SERIAL_ECHOLNPGM("= BLTouch Classic 1.2, 1.3, Smart 1.0, 2.0, 2.2, 3.0, 3.1 detected."); - // Check for a 3.1 by letting the user trigger it, later - blt = true; - } + if (deploy_state != stow_state) { + SERIAL_PROTOCOLLNPGM("BLTouch clone detected"); + if (deploy_state) { + SERIAL_PROTOCOLLNPGM(". DEPLOYED state: HIGH (logic 1)"); + SERIAL_PROTOCOLLNPGM(". STOWED (triggered) state: LOW (logic 0)"); } - } - #endif - - // The following code is common to all kinds of servo probes. - // Since it could be a real servo or a BLTouch (any kind) or a clone, - // use only "common" functions - i.e. SERVO_MOVE. No bltouch.xxxx stuff. - - // If it is already recognised as a being a BLTouch, no need for this test - if (!blt) { - // DEPLOY and STOW 4 times and see if the signal follows - // Then it is a mechanical switch - uint8_t i = 0; - SERIAL_ECHOLNPGM(". Deploy & stow 4 times"); - do { - MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); // Deploy - safe_delay(500); - deploy_state = READ(PROBE_TEST_PIN); - MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); // Stow - safe_delay(500); - stow_state = READ(PROBE_TEST_PIN); - } while (++i < 4); - - if (probe_inverting != deploy_state) SERIAL_ECHOLNPGM("WARNING: INVERTING setting probably backwards."); - - if (deploy_state != stow_state) { - SERIAL_ECHOLNPGM("= Mechanical Switch detected"); - if (deploy_state) { - SERIAL_ECHOLNPAIR(" DEPLOYED state: HIGH (logic 1)", - " STOWED (triggered) state: LOW (logic 0)"); - } - else { - SERIAL_ECHOLNPAIR(" DEPLOYED state: LOW (logic 0)", - " STOWED (triggered) state: HIGH (logic 1)"); - } - #if ENABLED(BLTOUCH) - SERIAL_ECHOLNPGM("FAIL: BLTOUCH enabled - Set up this device as a Servo Probe with INVERTING set to 'true'."); - #endif - return; + else { + SERIAL_PROTOCOLLNPGM(". DEPLOYED state: LOW (logic 0)"); + SERIAL_PROTOCOLLNPGM(". STOWED (triggered) state: HIGH (logic 1)"); } + #if ENABLED(BLTOUCH) + SERIAL_PROTOCOLLNPGM("ERROR: BLTOUCH enabled - set this device up as a Z Servo Probe with inverting as true."); + #endif } + else { // measure active signal length + MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); // Deploy + safe_delay(500); + SERIAL_PROTOCOLLNPGM("please trigger probe"); + uint16_t probe_counter = 0; - // Ask the user for a trigger event and measure the pulse width. - MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); // Deploy - safe_delay(500); - SERIAL_ECHOLNPGM("** Please trigger probe within 30 sec **"); - uint16_t probe_counter = 0; + // Allow 30 seconds max for operator to trigger probe + for (uint16_t j = 0; j < 500 * 30 && probe_counter == 0 ; j++) { - // Wait 30 seconds for user to trigger probe - for (uint16_t j = 0; j < 500 * 30 && probe_counter == 0 ; j++) { - safe_delay(2); + safe_delay(2); - if (0 == j % (500 * 1)) gcode.reset_stepper_timeout(); // Keep steppers powered + if (0 == j % (500 * 1)) gcode.reset_stepper_timeout(); // Keep steppers powered - if (deploy_state != READ(PROBE_TEST_PIN)) { // probe triggered - for (probe_counter = 0; probe_counter < 15 && deploy_state != READ(PROBE_TEST_PIN); ++probe_counter) safe_delay(2); + if (deploy_state != READ(PROBE_TEST_PIN)) { // probe triggered - SERIAL_ECHOPGM(". Pulse width"); - if (probe_counter == 15) - SERIAL_ECHOLNPGM(": 30ms or more"); - else - SERIAL_ECHOLNPAIR(" (+/- 4ms): ", probe_counter * 2); + for (probe_counter = 1; probe_counter < 50 && deploy_state != READ(PROBE_TEST_PIN); ++probe_counter) + safe_delay(2); - if (probe_counter >= 4) { - if (probe_counter == 15) { - if (blt) SERIAL_ECHOPGM("= BLTouch V3.1"); - else SERIAL_ECHOPGM("= Z Servo Probe"); - } - else SERIAL_ECHOPGM("= BLTouch pre V3.1 (or compatible)"); - SERIAL_ECHOLNPGM(" detected."); - } - else SERIAL_ECHOLNPGM("FAIL: Noise detected - please re-run test"); + if (probe_counter == 50) + SERIAL_PROTOCOLLNPGM("Z Servo Probe detected"); // >= 100mS active time + else if (probe_counter >= 2) + SERIAL_PROTOCOLLNPAIR("BLTouch compatible probe detected - pulse width (+/- 4mS): ", probe_counter * 2); // allow 4 - 100mS pulse + else + SERIAL_PROTOCOLLNPGM("noise detected - please re-run test"); // less than 2mS pulse - MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); // Stow - return; - } - } + MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); // Stow - if (!probe_counter) SERIAL_ECHOLNPGM("FAIL: No trigger detected"); + } // pulse detected - #endif // HAS_Z_SERVO_PROBE + } // for loop waiting for trigger + + if (probe_counter == 0) SERIAL_PROTOCOLLNPGM("trigger not detected"); + + } // measure active signal length + + #endif } // servo_probe_test @@ -296,70 +237,72 @@ inline void servo_probe_test() { */ void GcodeSuite::M43() { - // 'T' must be first. It uses 'S' and 'E' differently. - if (parser.seen('T')) return toggle_pins(); - - // 'E' Enable or disable endstop monitoring and return - if (parser.seen('E')) { - endstops.monitor_flag = parser.value_bool(); - SERIAL_ECHOPGM("endstop monitor "); - serialprintPGM(endstops.monitor_flag ? PSTR("en") : PSTR("dis")); - SERIAL_ECHOLNPGM("abled"); + if (parser.seen('T')) { // must be first or else its "S" and "E" parameters will execute endstop or servo test + toggle_pins(); return; } - // 'S' Run servo probe test and return - if (parser.seen('S')) return servo_probe_test(); + // Enable or disable endstop monitoring + if (parser.seen('E')) { + endstops.monitor_flag = parser.value_bool(); + SERIAL_PROTOCOLPGM("endstop monitor "); + serialprintPGM(endstops.monitor_flag ? PSTR("en") : PSTR("dis")); + SERIAL_PROTOCOLLNPGM("abled"); + return; + } - // 'P' Get the range of pins to test or watch + if (parser.seen('S')) { + servo_probe_test(); + return; + } + + // Get the range of pins to test or watch uint8_t first_pin = PARSED_PIN_INDEX('P', 0), last_pin = parser.seenval('P') ? first_pin : NUMBER_PINS_TOTAL - 1; if (first_pin > last_pin) return; - // 'I' to ignore protected pins const bool ignore_protection = parser.boolval('I'); - // 'W' Watch until click, M108, or reset + // Watch until click, M108, or reset if (parser.boolval('W')) { - SERIAL_ECHOLNPGM("Watching pins"); + SERIAL_PROTOCOLLNPGM("Watching pins"); + #ifdef ARDUINO_ARCH_SAM - NOLESS(first_pin, 2); // Don't hijack the UART pins + NOLESS(first_pin, 2); // don't hijack the UART pins #endif uint8_t pin_state[last_pin - first_pin + 1]; - LOOP_S_LE_N(i, first_pin, last_pin) { - pin_t pin = GET_PIN_MAP_PIN_M43(i); + for (uint8_t i = first_pin; i <= last_pin; i++) { + pin_t pin = GET_PIN_MAP_PIN(i); if (!VALID_PIN(pin)) continue; - if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue; + if (!ignore_protection && pin_is_protected(pin)) continue; pinMode(pin, INPUT_PULLUP); delay(1); - /* + /* if (IS_ANALOG(pin)) pin_state[pin - first_pin] = analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin)); // int16_t pin_state[...] else - //*/ - pin_state[i - first_pin] = extDigitalRead(pin); + //*/ + pin_state[i - first_pin] = digitalRead(pin); } #if HAS_RESUME_CONTINUE - KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = true; - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("M43 Wait Called"), CONTINUE_STR)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("M43 Wait Called"))); + KEEPALIVE_STATE(PAUSED_FOR_USER); #endif for (;;) { - LOOP_S_LE_N(i, first_pin, last_pin) { - pin_t pin = GET_PIN_MAP_PIN_M43(i); + for (uint8_t i = first_pin; i <= last_pin; i++) { + pin_t pin = GET_PIN_MAP_PIN(i); if (!VALID_PIN(pin)) continue; - if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue; + if (!ignore_protection && pin_is_protected(pin)) continue; const byte val = /* - IS_ANALOG(pin) - ? analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin)) : // int16_t val - : + IS_ANALOG(pin) + ? analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin)) : // int16_t val + : //*/ - extDigitalRead(pin); + digitalRead(pin); if (val != pin_state[i - first_pin]) { report_pin_state_extended(pin, ignore_protection, false); pin_state[i - first_pin] = val; @@ -367,19 +310,21 @@ void GcodeSuite::M43() { } #if HAS_RESUME_CONTINUE - ui.update(); - if (!wait_for_user) break; + if (!wait_for_user) { + KEEPALIVE_STATE(IN_HANDLER); + break; + } #endif safe_delay(200); } + return; } - else { - // Report current state of selected pin(s) - LOOP_S_LE_N(i, first_pin, last_pin) { - pin_t pin = GET_PIN_MAP_PIN_M43(i); - if (VALID_PIN(pin)) report_pin_state_extended(pin, ignore_protection, true); - } + + // Report current state of selected pin(s) + for (uint8_t i = first_pin; i <= last_pin; i++) { + pin_t pin = GET_PIN_MAP_PIN(i); + if (VALID_PIN(pin)) report_pin_state_extended(pin, ignore_protection, true); } } diff --git a/Marlin/src/gcode/config/M540.cpp b/Marlin/src/gcode/config/M540.cpp index 54d52f3a31..d554258030 100644 --- a/Marlin/src/gcode/config/M540.cpp +++ b/Marlin/src/gcode/config/M540.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) +#if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) #include "../gcode.h" #include "../../module/stepper.h" @@ -37,4 +37,4 @@ void GcodeSuite::M540() { } -#endif // SD_ABORT_ON_ENDSTOP_HIT +#endif // ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED diff --git a/Marlin/src/gcode/config/M575.cpp b/Marlin/src/gcode/config/M575.cpp deleted file mode 100644 index 44723b7f2f..0000000000 --- a/Marlin/src/gcode/config/M575.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(BAUD_RATE_GCODE) - -#include "../gcode.h" - -/** - * M575 - Change serial baud rate - * - * P - Serial port index. Omit for all. - * B - Baud rate (bits per second) - */ -void GcodeSuite::M575() { - int32_t baud = parser.ulongval('B'); - switch (baud) { - case 24: - case 96: - case 192: - case 384: - case 576: - case 1152: baud *= 100; break; - case 250: - case 500: baud *= 1000; break; - case 19: baud = 19200; break; - case 38: baud = 38400; break; - case 57: baud = 57600; break; - case 115: baud = 115200; break; - } - switch (baud) { - case 2400: case 9600: case 19200: case 38400: case 57600: - case 115200: case 250000: case 500000: case 1000000: { - const int8_t port = parser.intval('P', -99); - const bool set0 = (port == -99 || port == 0); - if (set0) SERIAL_ECHO_MSG(" Serial ", '0', " baud rate set to ", baud); - #if HAS_MULTI_SERIAL - const bool set1 = (port == -99 || port == 1); - if (set1) SERIAL_ECHO_MSG(" Serial ", '1', " baud rate set to ", baud); - #endif - - SERIAL_FLUSH(); - - if (set0) { MYSERIAL0.end(); MYSERIAL0.begin(baud); } - - #if HAS_MULTI_SERIAL - if (set1) { MYSERIAL1.end(); MYSERIAL1.begin(baud); } - #endif - - } break; - default: SERIAL_ECHO_MSG("?(B)aud rate implausible."); - } -} - -#endif // BAUD_RATE_GCODE diff --git a/Marlin/src/gcode/config/M672.cpp b/Marlin/src/gcode/config/M672.cpp deleted file mode 100644 index af74230516..0000000000 --- a/Marlin/src/gcode/config/M672.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) - -#include "../gcode.h" -#include "../../HAL/shared/Delay.h" -#include "../parser.h" - -/** - * The Marlin format for the M672 command is different than shown in the Duet Smart Effector - * documentation https://duet3d.dozuki.com/Wiki/Smart_effector_and_carriage_adapters_for_delta_printer - * - * To set custom sensitivity: - * Duet: M672 S105:aaa:bbb - * Marlin: M672 Saaa - * - * (where aaa is the desired sensitivity and bbb is 255 - aaa). - * - * Revert sensitivity to factory settings: - * Duet: M672 S105:131:131 - * Marlin: M672 R - */ - -#define M672_PROGBYTE 105 // magic byte to start programming custom sensitivity -#define M672_ERASEBYTE 131 // magic byte to clear custom sensitivity - -// -// Smart Effector byte send protocol: -// -// 0 0 1 0 ... always 0010 -// b7 b6 b5 b4 ~b4 ... hi bits, NOT last bit -// b3 b2 b1 b0 ~b0 ... lo bits, NOT last bit -// -void M672_send(uint8_t b) { // bit rate requirement: 1KHz +/- 30% - LOOP_L_N(bits, 14) { - switch (bits) { - default: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, !!(b & 0x80)); b <<= 1; break; } // send bit, shift next into place - case 7: - case 12: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, !!(b & 0x80)); break; } // send bit. no shift - case 8: - case 13: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, !(b & 0x80)); b <<= 1; break; } // send inverted previous bit - case 0: case 1: // 00 - case 3: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); break; } // 0010 - case 2: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, HIGH); break; } // 001 - } - DELAY_US(1000); - } -} - -/** - * M672 - Set/reset Duet Smart Effector sensitivity - * - * One of these is required: - * S - 0-255 - * R - Flag to reset sensitivity to default - */ -void GcodeSuite::M672() { - if (parser.seen('R')) { - M672_send(M672_ERASEBYTE); - M672_send(M672_ERASEBYTE); - } - else if (parser.seenval('S')) { - const int8_t M672_sensitivity = parser.value_byte(); - M672_send(M672_PROGBYTE); - M672_send(M672_sensitivity); - M672_send(255 - M672_sensitivity); - } - else { - SERIAL_ECHO_MSG("!'S' or 'R' parameter required."); - return; - } - - OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Keep Smart Effector in NORMAL mode -} - -#endif // DUET_SMART_EFFECTOR && SMART_EFFECTOR_MOD_PIN diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp index 0a7d52b633..310b754aa3 100644 --- a/Marlin/src/gcode/config/M92.cpp +++ b/Marlin/src/gcode/config/M92.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,99 +16,41 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" #include "../../module/planner.h" -void report_M92(const bool echo=true, const int8_t e=-1) { - if (echo) SERIAL_ECHO_START(); else SERIAL_CHAR(' '); - SERIAL_ECHOPAIR_P(PSTR(" M92 X"), LINEAR_UNIT(planner.settings.axis_steps_per_mm[X_AXIS]), - SP_Y_STR, LINEAR_UNIT(planner.settings.axis_steps_per_mm[Y_AXIS]), - SP_Z_STR, LINEAR_UNIT(planner.settings.axis_steps_per_mm[Z_AXIS])); - #if DISABLED(DISTINCT_E_FACTORS) - SERIAL_ECHOPAIR_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.axis_steps_per_mm[E_AXIS])); - #endif - SERIAL_EOL(); - - #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(i, E_STEPPERS) { - if (e >= 0 && i != e) continue; - if (echo) SERIAL_ECHO_START(); else SERIAL_CHAR(' '); - SERIAL_ECHOLNPAIR_P(PSTR(" M92 T"), (int)i, - SP_E_STR, VOLUMETRIC_UNIT(planner.settings.axis_steps_per_mm[E_AXIS_N(i)])); - } - #endif - - UNUSED_E(e); -} - /** * M92: Set axis steps-per-unit for one or more axes, X, Y, Z, and E. * (Follows the same syntax as G92) * * With multiple extruders use T to specify which one. - * - * If no argument is given print the current values. - * - * With MAGIC_NUMBERS_GCODE: - * Use 'H' and/or 'L' to get ideal layer-height information. - * 'H' specifies micro-steps to use. We guess if it's not supplied. - * 'L' specifies a desired layer height. Nearest good heights are shown. */ void GcodeSuite::M92() { - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - - // No arguments? Show M92 report. - if (!parser.seen("XYZE" - #if ENABLED(MAGIC_NUMBERS_GCODE) - "HL" - #endif - )) return report_M92(true, target_extruder); + GET_TARGET_EXTRUDER(); LOOP_XYZE(i) { - if (parser.seenval(axis_codes[i])) { + if (parser.seen(axis_codes[i])) { if (i == E_AXIS) { - const float value = parser.value_per_axis_units((AxisEnum)(E_AXIS_N(target_extruder))); + const float value = parser.value_per_axis_unit((AxisEnum)(E_AXIS + TARGET_EXTRUDER)); if (value < 20) { - float factor = planner.settings.axis_steps_per_mm[E_AXIS_N(target_extruder)] / value; // increase e constants if M92 E14 is given for netfab. - #if HAS_CLASSIC_JERK && HAS_CLASSIC_E_JERK - planner.max_jerk.e *= factor; + float factor = planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] / value; // increase e constants if M92 E14 is given for netfab. + #if DISABLED(JUNCTION_DEVIATION) + planner.max_jerk[E_AXIS] *= factor; #endif - planner.settings.max_feedrate_mm_s[E_AXIS_N(target_extruder)] *= factor; - planner.max_acceleration_steps_per_s2[E_AXIS_N(target_extruder)] *= factor; + planner.max_feedrate_mm_s[E_AXIS + TARGET_EXTRUDER] *= factor; + planner.max_acceleration_steps_per_s2[E_AXIS + TARGET_EXTRUDER] *= factor; } - planner.settings.axis_steps_per_mm[E_AXIS_N(target_extruder)] = value; + planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] = value; } else { - planner.settings.axis_steps_per_mm[i] = parser.value_per_axis_units((AxisEnum)i); + planner.axis_steps_per_mm[i] = parser.value_per_axis_unit((AxisEnum)i); } } } planner.refresh_positioning(); - - #if ENABLED(MAGIC_NUMBERS_GCODE) - #ifndef Z_MICROSTEPS - #define Z_MICROSTEPS 16 - #endif - const float wanted = parser.floatval('L'); - if (parser.seen('H') || wanted) { - const uint16_t argH = parser.ushortval('H'), - micro_steps = argH ?: Z_MICROSTEPS; - const float z_full_step_mm = micro_steps * planner.steps_to_mm[Z_AXIS]; - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR("{ micro_steps:", micro_steps, ", z_full_step_mm:", z_full_step_mm); - if (wanted) { - const float best = uint16_t(wanted / z_full_step_mm) * z_full_step_mm; - SERIAL_ECHOPAIR(", best:[", best); - if (best != wanted) { SERIAL_CHAR(','); SERIAL_DECIMAL(best + z_full_step_mm); } - SERIAL_CHAR(']'); - } - SERIAL_ECHOLNPGM(" }"); - } - #endif } diff --git a/Marlin/src/gcode/control/M108_M112_M410.cpp b/Marlin/src/gcode/control/M108_M112_M410.cpp index df145d5d11..7b49951266 100644 --- a/Marlin/src/gcode/control/M108_M112_M410.cpp +++ b/Marlin/src/gcode/control/M108_M112_M410.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,21 +25,20 @@ #if DISABLED(EMERGENCY_PARSER) #include "../gcode.h" -#include "../../MarlinCore.h" // for wait_for_heatup, kill, quickstop_stepper +#include "../../Marlin.h" // for wait_for_heatup, kill, quickstop_stepper /** * M108: Stop the waiting for heaters in M109, M190, M303. Does not affect the target temperature. */ void GcodeSuite::M108() { - TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); wait_for_heatup = false; } /** - * M112: Full Shutdown + * M112: Emergency Stop */ void GcodeSuite::M112() { - kill(M112_KILL_STR, nullptr, true); + kill(PSTR(MSG_KILLED)); } /** diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp index cc871bf38b..96587a1fc1 100644 --- a/Marlin/src/gcode/control/M111.cpp +++ b/Marlin/src/gcode/control/M111.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -28,25 +28,28 @@ void GcodeSuite::M111() { if (parser.seen('S')) marlin_debug_flags = parser.byteval('S'); - static PGMSTR(str_debug_1, STR_DEBUG_ECHO); - static PGMSTR(str_debug_2, STR_DEBUG_INFO); - static PGMSTR(str_debug_4, STR_DEBUG_ERRORS); - static PGMSTR(str_debug_8, STR_DEBUG_DRYRUN); - static PGMSTR(str_debug_16, STR_DEBUG_COMMUNICATION); - #if ENABLED(DEBUG_LEVELING_FEATURE) - static PGMSTR(str_debug_lvl, STR_DEBUG_LEVELING); - #endif + static const char str_debug_1[] PROGMEM = MSG_DEBUG_ECHO, + str_debug_2[] PROGMEM = MSG_DEBUG_INFO, + str_debug_4[] PROGMEM = MSG_DEBUG_ERRORS, + str_debug_8[] PROGMEM = MSG_DEBUG_DRYRUN, + str_debug_16[] PROGMEM = MSG_DEBUG_COMMUNICATION + #if ENABLED(DEBUG_LEVELING_FEATURE) + , str_debug_32[] PROGMEM = MSG_DEBUG_LEVELING + #endif + ; - static PGM_P const debug_strings[] PROGMEM = { - str_debug_1, str_debug_2, str_debug_4, str_debug_8, str_debug_16, - TERN_(DEBUG_LEVELING_FEATURE, str_debug_lvl) + static const char* const debug_strings[] PROGMEM = { + str_debug_1, str_debug_2, str_debug_4, str_debug_8, str_debug_16 + #if ENABLED(DEBUG_LEVELING_FEATURE) + , str_debug_32 + #endif }; SERIAL_ECHO_START(); - SERIAL_ECHOPGM(STR_DEBUG_PREFIX); + SERIAL_ECHOPGM(MSG_DEBUG_PREFIX); if (marlin_debug_flags) { uint8_t comma = 0; - LOOP_L_N(i, COUNT(debug_strings)) { + for (uint8_t i = 0; i < COUNT(debug_strings); i++) { if (TEST(marlin_debug_flags, i)) { if (comma++) SERIAL_CHAR(','); serialprintPGM((char*)pgm_read_ptr(&debug_strings[i])); @@ -54,24 +57,24 @@ void GcodeSuite::M111() { } } else { - SERIAL_ECHOPGM(STR_DEBUG_OFF); - #if !IS_AT90USB + SERIAL_ECHOPGM(MSG_DEBUG_OFF); + #if !defined(__AVR__) || !defined(USBCON) #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) - SERIAL_ECHOPAIR("\nBuffer Overruns: ", MYSERIAL0.buffer_overruns()); + SERIAL_ECHOPAIR("\nBuffer Overruns: ", customizedSerial.buffer_overruns()); #endif #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) - SERIAL_ECHOPAIR("\nFraming Errors: ", MYSERIAL0.framing_errors()); + SERIAL_ECHOPAIR("\nFraming Errors: ", customizedSerial.framing_errors()); #endif #if ENABLED(SERIAL_STATS_DROPPED_RX) - SERIAL_ECHOPAIR("\nDropped bytes: ", MYSERIAL0.dropped()); + SERIAL_ECHOPAIR("\nDropped bytes: ", customizedSerial.dropped()); #endif #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - SERIAL_ECHOPAIR("\nMax RX Queue Size: ", MYSERIAL0.rxMaxEnqueued()); + SERIAL_ECHOPAIR("\nMax RX Queue Size: ", customizedSerial.rxMaxEnqueued()); #endif - #endif // !IS_AT90USB + #endif // !defined(__AVR__) || !defined(USBCON) } SERIAL_EOL(); } diff --git a/Marlin/src/gcode/control/M120_M121.cpp b/Marlin/src/gcode/control/M120_M121.cpp index 570f2e935b..3425fc9477 100644 --- a/Marlin/src/gcode/control/M120_M121.cpp +++ b/Marlin/src/gcode/control/M120_M121.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp index 499feef715..c428a87877 100644 --- a/Marlin/src/gcode/control/M17_M18_M84.cpp +++ b/Marlin/src/gcode/control/M17_M18_M84.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,33 +16,25 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" -#include "../../MarlinCore.h" // for stepper_inactive_time, disable_e_steppers +#include "../../Marlin.h" // for stepper_inactive_time #include "../../lcd/ultralcd.h" #include "../../module/stepper.h" -#if ENABLED(AUTO_BED_LEVELING_UBL) +#if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTRA_LCD) #include "../../feature/bedlevel/bedlevel.h" #endif /** - * M17: Enable stepper motors + * M17: Enable power on all stepper motors */ void GcodeSuite::M17() { - if (parser.seen("XYZE")) { - if (parser.seen('X')) ENABLE_AXIS_X(); - if (parser.seen('Y')) ENABLE_AXIS_Y(); - if (parser.seen('Z')) ENABLE_AXIS_Z(); - if (TERN0(HAS_E_STEPPER_ENABLE, parser.seen('E'))) enable_e_steppers(); - } - else { - LCD_MESSAGEPGM(MSG_NO_MOVE); - enable_all_steppers(); - } + LCD_MESSAGEPGM(MSG_NO_MOVE); + enable_all_steppers(); } /** @@ -50,20 +42,25 @@ void GcodeSuite::M17() { */ void GcodeSuite::M18_M84() { if (parser.seenval('S')) { - reset_stepper_timeout(); stepper_inactive_time = parser.value_millis_from_seconds(); } else { - if (parser.seen("XYZE")) { - planner.synchronize(); - if (parser.seen('X')) DISABLE_AXIS_X(); - if (parser.seen('Y')) DISABLE_AXIS_Y(); - if (parser.seen('Z')) DISABLE_AXIS_Z(); - if (TERN0(HAS_E_STEPPER_ENABLE, parser.seen('E'))) disable_e_steppers(); - } - else + bool all_axis = !(parser.seen('X') || parser.seen('Y') || parser.seen('Z') || parser.seen('E')); + if (all_axis) { planner.finish_and_disable(); + } + else { + planner.synchronize(); + if (parser.seen('X')) disable_X(); + if (parser.seen('Y')) disable_Y(); + if (parser.seen('Z')) disable_Z(); + #if E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN // Only disable on boards that have separate ENABLE_PINS + if (parser.seen('E')) disable_e_steppers(); + #endif + } - TERN_(AUTO_BED_LEVELING_UBL, ubl.steppers_were_disabled()); + #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTIPANEL) // Only needed with an LCD + if (ubl.lcd_map_control) ubl.lcd_map_control = defer_return_to_status = false; + #endif } } diff --git a/Marlin/src/gcode/control/M211.cpp b/Marlin/src/gcode/control/M211.cpp index 2049f1eb69..1f3be868a7 100644 --- a/Marlin/src/gcode/control/M211.cpp +++ b/Marlin/src/gcode/control/M211.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,14 +16,10 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#include "../../inc/MarlinConfigPre.h" - -#if HAS_SOFTWARE_ENDSTOPS - #include "../gcode.h" #include "../../module/motion.h" @@ -33,14 +29,20 @@ * Usage: M211 S1 to enable, M211 S0 to disable, M211 alone for report */ void GcodeSuite::M211() { - const xyz_pos_t l_soft_min = soft_endstop.min.asLogical(), - l_soft_max = soft_endstop.max.asLogical(); SERIAL_ECHO_START(); - SERIAL_ECHOPGM(STR_SOFT_ENDSTOPS); - if (parser.seen('S')) soft_endstop._enabled = parser.value_bool(); - serialprint_onoff(soft_endstop._enabled); - print_xyz(l_soft_min, PSTR(STR_SOFT_MIN), PSTR(" ")); - print_xyz(l_soft_max, PSTR(STR_SOFT_MAX)); + SERIAL_ECHOPGM(MSG_SOFT_ENDSTOPS); + #if HAS_SOFTWARE_ENDSTOPS + if (parser.seen('S')) soft_endstops_enabled = parser.value_bool(); + serialprintPGM(soft_endstops_enabled ? PSTR(MSG_ON) : PSTR(MSG_OFF)); + #else + SERIAL_ECHOPGM(MSG_OFF); + #endif + SERIAL_ECHOPGM(MSG_SOFT_MIN); + SERIAL_ECHOPAIR( MSG_X, LOGICAL_X_POSITION(soft_endstop_min[X_AXIS])); + SERIAL_ECHOPAIR(" " MSG_Y, LOGICAL_Y_POSITION(soft_endstop_min[Y_AXIS])); + SERIAL_ECHOPAIR(" " MSG_Z, LOGICAL_Z_POSITION(soft_endstop_min[Z_AXIS])); + SERIAL_ECHOPGM(MSG_SOFT_MAX); + SERIAL_ECHOPAIR( MSG_X, LOGICAL_X_POSITION(soft_endstop_max[X_AXIS])); + SERIAL_ECHOPAIR(" " MSG_Y, LOGICAL_Y_POSITION(soft_endstop_max[Y_AXIS])); + SERIAL_ECHOLNPAIR(" " MSG_Z, LOGICAL_Z_POSITION(soft_endstop_max[Z_AXIS])); } - -#endif diff --git a/Marlin/src/gcode/control/M226.cpp b/Marlin/src/gcode/control/M226.cpp index ad717e614d..59071aadf3 100644 --- a/Marlin/src/gcode/control/M226.cpp +++ b/Marlin/src/gcode/control/M226.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,16 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#include "../../inc/MarlinConfig.h" - -#if ENABLED(DIRECT_PIN_CONTROL) - #include "../gcode.h" -#include "../../MarlinCore.h" // for pin_is_protected and idle() +#include "../../Marlin.h" // for pin_is_protected and idle() #include "../../module/stepper.h" /** @@ -47,12 +43,10 @@ void GcodeSuite::M226() { switch (pin_state) { case 1: target = HIGH; break; case 0: target = LOW; break; - case -1: target = !extDigitalRead(pin); break; + case -1: target = !digitalRead(pin); break; } - while (int(extDigitalRead(pin)) != target) idle(); + while (digitalRead(pin) != target) idle(); } } // pin_state -1 0 1 && pin > -1 } // parser.seen('P') } - -#endif // DIRECT_PIN_CONTROL diff --git a/Marlin/src/gcode/control/M280.cpp b/Marlin/src/gcode/control/M280.cpp index 6ccbb7becc..1cfb6c89fd 100644 --- a/Marlin/src/gcode/control/M280.cpp +++ b/Marlin/src/gcode/control/M280.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -34,21 +34,18 @@ void GcodeSuite::M280() { if (!parser.seen('P')) return; const int servo_index = parser.value_int(); if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) { - if (parser.seen('S')) { - const int a = parser.value_int(); - if (a == -1) - servo[servo_index].detach(); - else - MOVE_SERVO(servo_index, a); - } + if (parser.seen('S')) + MOVE_SERVO(servo_index, parser.value_int()); else { SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(" Servo ", servo_index, ": ", servo[servo_index].read()); + SERIAL_ECHOPAIR(" Servo ", servo_index); + SERIAL_ECHOLNPAIR(": ", servo[servo_index].read()); } } else { SERIAL_ERROR_START(); - SERIAL_ECHOLNPAIR("Servo ", servo_index, " out of range"); + SERIAL_ECHOPAIR("Servo ", servo_index); + SERIAL_ECHOLNPGM(" out of range"); } } diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp index 1326c30669..213d17450a 100644 --- a/Marlin/src/gcode/control/M3-M5.cpp +++ b/Marlin/src/gcode/control/M3-M5.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,35 +16,27 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if HAS_CUTTER +#if ENABLED(SPINDLE_LASER_ENABLE) #include "../gcode.h" -#include "../../feature/spindle_laser.h" #include "../../module/stepper.h" /** - * Laser: - * M3 - Laser ON/Power (Ramped power) - * M4 - Laser ON/Power (Continuous power) + * M3: Spindle Clockwise + * M4: Spindle Counter-clockwise * - * Spindle: - * M3 - Spindle ON (Clockwise) - * M4 - Spindle ON (Counter-clockwise) + * S0 turns off spindle. * - * Parameters: - * S - Set power. S0 will turn the spindle/laser off, except in relative mode. - * O - Set power and OCR (oscillator count register) + * If no speed PWM output is defined then M3/M4 just turns it on. * - * If no PWM pin is defined then M3/M4 just turns it on. - * - * At least 12.8KHz (50Hz * 256) is needed for Spindle PWM. - * Hardware PWM is required on AVR. ISRs are too slow. + * At least 12.8KHz (50Hz * 256) is needed for spindle PWM. + * Hardware PWM is required. ISRs are too slow. * * NOTE: WGM for timers 3, 4, and 5 must be either Mode 1 or Mode 5. * No other settings give a PWM signal that goes from 0 to 5 volts. @@ -59,76 +51,90 @@ * NOTE: A minimum PWM frequency of 50 Hz is needed. All prescaler * factors for timers 2, 3, 4, and 5 are acceptable. * - * SPINDLE_LASER_ENA_PIN needs an external pullup or it may power on + * SPINDLE_LASER_ENABLE_PIN needs an external pullup or it may power on * the spindle/laser during power-up or when connecting to the host * (usually goes through a reset which sets all I/O pins to tri-state) * * PWM duty cycle goes from 0 (off) to 255 (always on). */ -void GcodeSuite::M3_M4(const bool is_M4) { - auto get_s_power = [] { - if (parser.seenval('S')) { - const float spwr = parser.value_float(); - cutter.unitPower = TERN(SPINDLE_LASER_PWM, - cutter.power_to_range(cutter_power_t(round(spwr))), - spwr > 0 ? 255 : 0); - } - else - cutter.unitPower = cutter.cpwr_to_upwr(SPEED_POWER_STARTUP); - return cutter.unitPower; - }; - #if ENABLED(LASER_POWER_INLINE) - if (parser.seen('I') == DISABLED(LASER_POWER_INLINE_INVERT)) { - // Laser power in inline mode - cutter.inline_direction(is_M4); // Should always be unused - #if ENABLED(SPINDLE_LASER_PWM) - if (parser.seen('O')) { - cutter.unitPower = cutter.power_to_range(parser.value_byte(), 0); - cutter.inline_ocr_power(cutter.unitPower); // The OCR is a value from 0 to 255 (uint8_t) - } - else - cutter.inline_power(cutter.upower_to_ocr(get_s_power())); - #else - cutter.set_inline_enabled(true); - #endif - return; +// Wait for spindle to come up to speed +inline void delay_for_power_up() { gcode.dwell(SPINDLE_LASER_POWERUP_DELAY); } + +// Wait for spindle to stop turning +inline void delay_for_power_down() { gcode.dwell(SPINDLE_LASER_POWERDOWN_DELAY); } + +/** + * ocr_val_mode() is used for debugging and to get the points needed to compute the RPM vs ocr_val line + * + * it accepts inputs of 0-255 + */ + +inline void ocr_val_mode() { + uint8_t spindle_laser_power = parser.value_byte(); + WRITE(SPINDLE_LASER_ENABLE_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low) + if (SPINDLE_LASER_PWM_INVERT) spindle_laser_power = 255 - spindle_laser_power; + analogWrite(SPINDLE_LASER_PWM_PIN, spindle_laser_power); +} + +void GcodeSuite::M3_M4(bool is_M3) { + + planner.synchronize(); // wait until previous movement commands (G0/G0/G2/G3) have completed before playing with the spindle + #if SPINDLE_DIR_CHANGE + const bool rotation_dir = (is_M3 != SPINDLE_INVERT_DIR); + if (SPINDLE_STOP_ON_DIR_CHANGE \ + && READ(SPINDLE_LASER_ENABLE_PIN) == SPINDLE_LASER_ENABLE_INVERT \ + && READ(SPINDLE_DIR_PIN) != rotation_dir + ) { + WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); // turn spindle off + delay_for_power_down(); } - // Non-inline, standard case - cutter.inline_disable(); // Prevent future blocks re-setting the power + WRITE(SPINDLE_DIR_PIN, rotation_dir); #endif - planner.synchronize(); // Wait for previous movement commands (G0/G0/G2/G3) to complete before changing power - cutter.set_direction(is_M4); - + /** + * Our final value for ocr_val is an unsigned 8 bit value between 0 and 255 which usually means uint8_t. + * Went to uint16_t because some of the uint8_t calculations would sometimes give 1000 0000 rather than 1111 1111. + * Then needed to AND the uint16_t result with 0x00FF to make sure we only wrote the byte of interest. + */ #if ENABLED(SPINDLE_LASER_PWM) - if (parser.seenval('O')) { - cutter.unitPower = cutter.power_to_range(parser.value_byte(), 0); - cutter.set_ocr_power(cutter.unitPower); // The OCR is a value from 0 to 255 (uint8_t) + if (parser.seen('O')) ocr_val_mode(); + else { + const float spindle_laser_power = parser.floatval('S'); + if (spindle_laser_power == 0) { + WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); // turn spindle off (active low) + analogWrite(SPINDLE_LASER_PWM_PIN, SPINDLE_LASER_PWM_INVERT ? 255 : 0); // only write low byte + delay_for_power_down(); + } + else { + int16_t ocr_val = (spindle_laser_power - (SPEED_POWER_INTERCEPT)) * (1.0f / (SPEED_POWER_SLOPE)); // convert RPM to PWM duty cycle + NOMORE(ocr_val, 255); // limit to max the Atmel PWM will support + if (spindle_laser_power <= SPEED_POWER_MIN) + ocr_val = (SPEED_POWER_MIN - (SPEED_POWER_INTERCEPT)) * (1.0f / (SPEED_POWER_SLOPE)); // minimum setting + if (spindle_laser_power >= SPEED_POWER_MAX) + ocr_val = (SPEED_POWER_MAX - (SPEED_POWER_INTERCEPT)) * (1.0f / (SPEED_POWER_SLOPE)); // limit to max RPM + if (SPINDLE_LASER_PWM_INVERT) ocr_val = 255 - ocr_val; + WRITE(SPINDLE_LASER_ENABLE_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low) + analogWrite(SPINDLE_LASER_PWM_PIN, ocr_val & 0xFF); // only write low byte + delay_for_power_up(); + } } - else - cutter.set_power(cutter.upower_to_ocr(get_s_power())); #else - cutter.set_enabled(true); + WRITE(SPINDLE_LASER_ENABLE_PIN, SPINDLE_LASER_ENABLE_INVERT); // turn spindle on (active low) if spindle speed option not enabled + delay_for_power_up(); #endif - cutter.menuPower = cutter.unitPower; } /** - * M5 - Cutter OFF (when moves are complete) + * M5 turn off spindle */ void GcodeSuite::M5() { - #if ENABLED(LASER_POWER_INLINE) - if (parser.seen('I') == DISABLED(LASER_POWER_INLINE_INVERT)) { - cutter.set_inline_enabled(false); // Laser power in inline mode - return; - } - // Non-inline, standard case - cutter.inline_disable(); // Prevent future blocks re-setting the power - #endif planner.synchronize(); - cutter.set_enabled(false); - cutter.menuPower = cutter.unitPower; + WRITE(SPINDLE_LASER_ENABLE_PIN, !SPINDLE_LASER_ENABLE_INVERT); + #if ENABLED(SPINDLE_LASER_PWM) + analogWrite(SPINDLE_LASER_PWM_PIN, SPINDLE_LASER_PWM_INVERT ? 255 : 0); + #endif + delay_for_power_down(); } -#endif // HAS_CUTTER +#endif // SPINDLE_LASER_ENABLE diff --git a/Marlin/src/gcode/control/M350_M351.cpp b/Marlin/src/gcode/control/M350_M351.cpp index 463bd2ad58..cd75e7b2b1 100644 --- a/Marlin/src/gcode/control/M350_M351.cpp +++ b/Marlin/src/gcode/control/M350_M351.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -33,7 +33,7 @@ * Warning: Steps-per-unit remains unchanged. */ void GcodeSuite::M350() { - if (parser.seen('S')) LOOP_LE_N(i, 4) stepper.microstep_mode(i, parser.value_byte()); + if (parser.seen('S')) for (uint8_t i = 0; i <= 4; i++) stepper.microstep_mode(i, parser.value_byte()); LOOP_XYZE(i) if (parser.seen(axis_codes[i])) stepper.microstep_mode(i, parser.value_byte()); if (parser.seen('B')) stepper.microstep_mode(4, parser.value_byte()); stepper.microstep_readings(); @@ -41,21 +41,17 @@ void GcodeSuite::M350() { /** * M351: Toggle MS1 MS2 pins directly with axis codes X Y Z E B - * S# determines MS1, MS2 or MS3, X# sets the pin high/low. + * S# determines MS1 or MS2, X# sets the pin high/low. */ void GcodeSuite::M351() { if (parser.seenval('S')) switch (parser.value_byte()) { case 1: - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, parser.value_byte(), -1, -1); - if (parser.seenval('B')) stepper.microstep_ms(4, parser.value_byte(), -1, -1); + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, parser.value_byte(), -1); + if (parser.seenval('B')) stepper.microstep_ms(4, parser.value_byte(), -1); break; case 2: - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, parser.value_byte(), -1); - if (parser.seenval('B')) stepper.microstep_ms(4, -1, parser.value_byte(), -1); - break; - case 3: - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, -1, parser.value_byte()); - if (parser.seenval('B')) stepper.microstep_ms(4, -1, -1, parser.value_byte()); + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, parser.value_byte()); + if (parser.seenval('B')) stepper.microstep_ms(4, -1, parser.value_byte()); break; } stepper.microstep_readings(); diff --git a/Marlin/src/gcode/control/M380_M381.cpp b/Marlin/src/gcode/control/M380_M381.cpp index 3f5b252465..5ebca12657 100644 --- a/Marlin/src/gcode/control/M380_M381.cpp +++ b/Marlin/src/gcode/control/M380_M381.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,41 +16,25 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) +#if ENABLED(EXT_SOLENOID) #include "../gcode.h" #include "../../feature/solenoid.h" -#include "../../module/motion.h" /** * M380: Enable solenoid on the active extruder - * - * S to specify a solenoid (Requires MANUAL_SOLENOID_CONTROL) */ -void GcodeSuite::M380() { - #if ENABLED(MANUAL_SOLENOID_CONTROL) - enable_solenoid(parser.intval('S', active_extruder)); - #else - enable_solenoid_on_active_extruder(); - #endif -} +void GcodeSuite::M380() { enable_solenoid_on_active_extruder(); } /** - * M381: Disable all solenoids if EXT_SOLENOID - * Disable selected/active solenoid if MANUAL_SOLENOID_CONTROL + * M381: Disable all solenoids */ -void GcodeSuite::M381() { - #if ENABLED(MANUAL_SOLENOID_CONTROL) - disable_solenoid(parser.intval('S', active_extruder)); - #else - disable_all_solenoids(); - #endif -} +void GcodeSuite::M381() { disable_all_solenoids(); } -#endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL +#endif // EXT_SOLENOID diff --git a/Marlin/src/gcode/control/M400.cpp b/Marlin/src/gcode/control/M400.cpp index 9a5ad4e9df..f55f626d09 100644 --- a/Marlin/src/gcode/control/M400.cpp +++ b/Marlin/src/gcode/control/M400.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp index c635c06ec6..6e84dc475f 100644 --- a/Marlin/src/gcode/control/M42.cpp +++ b/Marlin/src/gcode/control/M42.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,20 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#include "../../inc/MarlinConfig.h" - -#if ENABLED(DIRECT_PIN_CONTROL) - #include "../gcode.h" -#include "../../MarlinCore.h" // for pin_is_protected - -#if HAS_FAN - #include "../../module/temperature.h" -#endif +#include "../../Marlin.h" // for pin_is_protected +#include "../../inc/MarlinConfig.h" /** * M42: Change pin status via GCode @@ -40,10 +33,11 @@ * * S Pin status from 0 - 255 * I Flag to ignore Marlin's pin protection - * - * M Pin mode: 0=INPUT 1=OUTPUT 2=INPUT_PULLUP 3=INPUT_PULLDOWN */ void GcodeSuite::M42() { + if (!parser.seenval('S')) return; + const byte pin_status = parser.value_byte(); + const int pin_index = PARSED_PIN_INDEX('P', GET_PIN_MAP_INDEX(LED_PIN)); if (pin_index < 0) return; @@ -51,53 +45,21 @@ void GcodeSuite::M42() { if (!parser.boolval('I') && pin_is_protected(pin)) return protected_pin_err(); - if (parser.seenval('M')) { - switch (parser.value_byte()) { - case 0: pinMode(pin, INPUT); break; - case 1: pinMode(pin, OUTPUT); break; - case 2: pinMode(pin, INPUT_PULLUP); break; - #ifdef INPUT_PULLDOWN - case 3: pinMode(pin, INPUT_PULLDOWN); break; - #endif - default: SERIAL_ECHOLNPGM("Invalid Pin Mode"); return; - } - } + pinMode(pin, OUTPUT); + digitalWrite(pin, pin_status); + analogWrite(pin, pin_status); - if (!parser.seenval('S')) return; - const byte pin_status = parser.value_byte(); - - #if HAS_FAN + #if FAN_COUNT > 0 switch (pin) { #if HAS_FAN0 - case FAN0_PIN: thermalManager.fan_speed[0] = pin_status; return; + case FAN_PIN: fanSpeeds[0] = pin_status; break; #endif #if HAS_FAN1 - case FAN1_PIN: thermalManager.fan_speed[1] = pin_status; return; + case FAN1_PIN: fanSpeeds[1] = pin_status; break; #endif #if HAS_FAN2 - case FAN2_PIN: thermalManager.fan_speed[2] = pin_status; return; - #endif - #if HAS_FAN3 - case FAN3_PIN: thermalManager.fan_speed[3] = pin_status; return; - #endif - #if HAS_FAN4 - case FAN4_PIN: thermalManager.fan_speed[4] = pin_status; return; - #endif - #if HAS_FAN5 - case FAN5_PIN: thermalManager.fan_speed[5] = pin_status; return; - #endif - #if HAS_FAN6 - case FAN6_PIN: thermalManager.fan_speed[6] = pin_status; return; - #endif - #if HAS_FAN7 - case FAN7_PIN: thermalManager.fan_speed[7] = pin_status; return; + case FAN2_PIN: fanSpeeds[2] = pin_status; break; #endif } #endif - - pinMode(pin, OUTPUT); - extDigitalWrite(pin, pin_status); - analogWrite(pin, pin_status); } - -#endif // DIRECT_PIN_CONTROL diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index 5dc36428b5..80b39ef301 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,15 +16,15 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if HAS_DUPLICATION_MODE +#define DEBUG_DXC_MODE -//#define DEBUG_DXC_MODE +#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) #include "../gcode.h" #include "../../module/motion.h" @@ -32,70 +32,39 @@ #include "../../module/tool_change.h" #include "../../module/planner.h" -#define DEBUG_OUT ENABLED(DEBUG_DXC_MODE) -#include "../../core/debug_out.h" - #if ENABLED(DUAL_X_CARRIAGE) /** * M605: Set dual x-carriage movement mode * - * M605 S0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel - * results as long as it supports dual X-carriages. - * - * M605 S1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so that - * additional slicer support is not required. - * - * M605 S2 X R : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with - * the first X-carriage and extruder, to print 2 copies of the same object at the same time. - * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and - * follow with "M605 S2" to initiate duplicated movement. For example, use "M605 S2 X100 R2" to - * make a copy 100mm to the right with E1 2° hotter than E0. - * - * M605 S3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates - * the movement of the first except the second extruder is reversed in the X axis. - * The temperature differential and initial X offset must be set with "M605 S2 X[offs] R[deg]", - * then followed by "M605 S3" to initiate mirrored movement. - * + * M605 : Restore user specified DEFAULT_DUAL_X_CARRIAGE_MODE + * M605 S0: Full control mode. The slicer has full control over x-carriage movement + * M605 S1: Auto-park mode. The inactive head will auto park/unpark without slicer involvement + * M605 S2 [Xnnn] [Rmmm]: Duplication mode. The second extruder will duplicate the first with nnn + * units x-offset and an optional differential hotend temperature of + * mmm degrees. E.g., with "M605 S2 X100 R2" the second extruder will duplicate + * the first with a spacing of 100mm in the x direction and 2 degrees hotter. + * M605 S3 : Enable Symmetric Duplication mode. The second extruder will duplicate the first extruder's + * movement similar to the M605 S2 mode. However, the second extruder will be producing + * a mirror image of the first extruder. The initial x-offset and temperature differential are + * set with M605 S2 [Xnnn] [Rmmm] and then followed with a M605 S3 to start the mirrored movement. * M605 W : IDEX What? command. * - * Note: the X axis should be homed after changing Dual X-carriage mode. + * Note: the X axis should be homed after changing dual x-carriage mode. */ void GcodeSuite::M605() { planner.synchronize(); if (parser.seen('S')) { - const DualXMode previous_mode = dual_x_carriage_mode; - dual_x_carriage_mode = (DualXMode)parser.value_byte(); - mirrored_duplication_mode = false; - - if (dual_x_carriage_mode == DXC_MIRRORED_MODE) { - if (previous_mode != DXC_DUPLICATION_MODE) { - SERIAL_ECHOLNPGM("Printer must be in DXC_DUPLICATION_MODE prior to "); - SERIAL_ECHOLNPGM("specifying DXC_MIRRORED_MODE."); - dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; - return; - } - mirrored_duplication_mode = true; - stepper.set_directions(); - float x_jog = current_position.x - .1; - for (uint8_t i = 2; --i;) { - planner.buffer_line(x_jog, current_position.y, current_position.z, current_position.e, feedrate_mm_s, 0); - x_jog += .1; - } - return; - } switch (dual_x_carriage_mode) { case DXC_FULL_CONTROL_MODE: case DXC_AUTO_PARK_MODE: break; case DXC_DUPLICATION_MODE: - // Set the X offset, but no less than the safety gap - if (parser.seen('X')) duplicate_extruder_x_offset = _MAX(parser.value_linear_units(), (X2_MIN_POS) - (X1_MIN_POS)); + if (parser.seen('X')) duplicate_extruder_x_offset = MAX(parser.value_linear_units(), X2_MIN_POS - x_home_pos(0)); if (parser.seen('R')) duplicate_extruder_temp_offset = parser.value_celsius_diff(); - // Always switch back to tool 0 if (active_extruder != 0) tool_change(0); break; default: @@ -104,81 +73,42 @@ } active_extruder_parked = false; extruder_duplication_enabled = false; - stepper.set_directions(); delayed_move_time = 0; } else if (!parser.seen('W')) // if no S or W parameter, the DXC mode gets reset to the user's default dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; - #ifdef DEBUG_DXC_MODE - - if (parser.seen('W')) { - DEBUG_ECHO_START(); - DEBUG_ECHOPGM("Dual X Carriage Mode "); - switch (dual_x_carriage_mode) { - case DXC_FULL_CONTROL_MODE: DEBUG_ECHOPGM("FULL_CONTROL"); break; - case DXC_AUTO_PARK_MODE: DEBUG_ECHOPGM("AUTO_PARK"); break; - case DXC_DUPLICATION_MODE: DEBUG_ECHOPGM("DUPLICATION"); break; - case DXC_MIRRORED_MODE: DEBUG_ECHOPGM("MIRRORED"); break; - } - DEBUG_ECHOPAIR("\nActive Ext: ", int(active_extruder)); - if (!active_extruder_parked) DEBUG_ECHOPGM(" NOT "); - DEBUG_ECHOPGM(" parked."); - DEBUG_ECHOPAIR("\nactive_extruder_x_pos: ", current_position.x); - DEBUG_ECHOPAIR("\ninactive_extruder_x_pos: ", inactive_extruder_x_pos); - DEBUG_ECHOPAIR("\nextruder_duplication_enabled: ", int(extruder_duplication_enabled)); - DEBUG_ECHOPAIR("\nduplicate_extruder_x_offset: ", duplicate_extruder_x_offset); - DEBUG_ECHOPAIR("\nduplicate_extruder_temp_offset: ", duplicate_extruder_temp_offset); - DEBUG_ECHOPAIR("\ndelayed_move_time: ", delayed_move_time); - DEBUG_ECHOPAIR("\nX1 Home X: ", x_home_pos(0), "\nX1_MIN_POS=", int(X1_MIN_POS), "\nX1_MAX_POS=", int(X1_MAX_POS)); - DEBUG_ECHOPAIR("\nX2 Home X: ", x_home_pos(1), "\nX2_MIN_POS=", int(X2_MIN_POS), "\nX2_MAX_POS=", int(X2_MAX_POS)); - DEBUG_ECHOPAIR("\nX2_HOME_DIR=", int(X2_HOME_DIR), "\nX2_HOME_POS=", int(X2_HOME_POS)); - DEBUG_ECHOPAIR("\nDEFAULT_DUAL_X_CARRIAGE_MODE=", STRINGIFY(DEFAULT_DUAL_X_CARRIAGE_MODE)); - DEBUG_ECHOPAIR("\toolchange_settings.z_raise=", toolchange_settings.z_raise); - DEBUG_ECHOPAIR("\nDEFAULT_DUPLICATION_X_OFFSET=", int(DEFAULT_DUPLICATION_X_OFFSET)); - DEBUG_EOL(); - - HOTEND_LOOP() { - DEBUG_ECHOPAIR_P(SP_T_STR, int(e)); - LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", int(e), "].", XYZ_CHAR(a) | 0x20, "=", hotend_offset[e][a]); - DEBUG_EOL(); - } - DEBUG_EOL(); + if (parser.seen('W')) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("IDEX mode: "); + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: SERIAL_ECHOPGM("DXC_FULL_CONTROL_MODE"); break; + case DXC_AUTO_PARK_MODE: SERIAL_ECHOPGM("DXC_AUTO_PARK_MODE"); break; + case DXC_DUPLICATION_MODE: SERIAL_ECHOPGM("DXC_DUPLICATION_MODE"); break; } - #endif // DEBUG_DXC_MODE + SERIAL_ECHOPAIR("\nActive Ext: ", int(active_extruder)); + if (!active_extruder_parked) SERIAL_ECHOPGM(" NOT "); + SERIAL_ECHOLNPGM(" parked."); + SERIAL_ECHOPAIR("active_extruder_x_pos: ", current_position[X_AXIS]); + SERIAL_ECHOPAIR(" inactive_extruder_x_pos: ", inactive_extruder_x_pos); + SERIAL_ECHOPAIR("\nT0 Home X: ", x_home_pos(0)); + SERIAL_ECHOPAIR("\nT1 Home X: ", x_home_pos(1)); + SERIAL_ECHOPAIR("\nextruder_duplication_enabled: ", int(extruder_duplication_enabled)); + SERIAL_ECHOPAIR("\nduplicate_extruder_x_offset: ", duplicate_extruder_x_offset); + SERIAL_ECHOPAIR("\nduplicate_extruder_temp_offset: ", duplicate_extruder_temp_offset); + SERIAL_ECHOPAIR("\ndelayed_move_time: ", delayed_move_time); + } } -#elif ENABLED(MULTI_NOZZLE_DUPLICATION) +#elif ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - /** - * M605: Set multi-nozzle duplication mode - * - * S2 - Enable duplication mode - * P[mask] - Bit-mask of nozzles to include in the duplication set. - * A value of 0 disables duplication. - * E[index] - Last nozzle index to include in the duplication set. - * A value of 0 disables duplication. - */ void GcodeSuite::M605() { - bool ena = false; - if (parser.seen("EPS")) { - planner.synchronize(); - if (parser.seenval('P')) duplication_e_mask = parser.value_int(); // Set the mask directly - else if (parser.seenval('E')) duplication_e_mask = pow(2, parser.value_int() + 1) - 1; // Set the mask by E index - ena = (2 == parser.intval('S', extruder_duplication_enabled ? 2 : 0)); - extruder_duplication_enabled = ena && (duplication_e_mask >= 3); - } + planner.synchronize(); + extruder_duplication_enabled = parser.intval('S') == (int)DXC_DUPLICATION_MODE; SERIAL_ECHO_START(); - SERIAL_ECHOPGM(STR_DUPLICATION_MODE); - serialprint_onoff(extruder_duplication_enabled); - if (ena) { - SERIAL_ECHOPGM(" ( "); - HOTEND_LOOP() if (TEST(duplication_e_mask, e)) { SERIAL_ECHO(e); SERIAL_CHAR(' '); } - SERIAL_CHAR(')'); - } - SERIAL_EOL(); + SERIAL_ECHOLNPAIR(MSG_DUPLICATION_MODE, extruder_duplication_enabled ? MSG_ON : MSG_OFF); } -#endif // MULTI_NOZZLE_DUPLICATION +#endif // DUAL_NOZZLE_DUPLICATION_MODE -#endif // HAS_DUPICATION_MODE +#endif // DUAL_X_CARRIAGE || DUAL_NOZZLE_DUPLICATION_MODE diff --git a/Marlin/src/gcode/control/M7-M9.cpp b/Marlin/src/gcode/control/M7-M9.cpp deleted file mode 100644 index a33e43288b..0000000000 --- a/Marlin/src/gcode/control/M7-M9.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(COOLANT_CONTROL) - -#include "../gcode.h" -#include "../../module/planner.h" - -#if ENABLED(COOLANT_MIST) - /** - * M7: Mist Coolant On - */ - void GcodeSuite::M7() { - planner.synchronize(); // Wait for move to arrive - WRITE(COOLANT_MIST_PIN, !(COOLANT_MIST_INVERT)); // Turn on Mist coolant - } -#endif - -#if ENABLED(COOLANT_FLOOD) - /** - * M8: Flood Coolant On - */ - void GcodeSuite::M8() { - planner.synchronize(); // Wait for move to arrive - WRITE(COOLANT_FLOOD_PIN, !(COOLANT_FLOOD_INVERT)); // Turn on Flood coolant - } -#endif - -/** - * M9: Coolant OFF - */ -void GcodeSuite::M9() { - planner.synchronize(); // Wait for move to arrive - #if ENABLED(COOLANT_MIST) - WRITE(COOLANT_MIST_PIN, COOLANT_MIST_INVERT); // Turn off Mist coolant - #endif - #if ENABLED(COOLANT_FLOOD) - WRITE(COOLANT_FLOOD_PIN, COOLANT_FLOOD_INVERT); // Turn off Flood coolant - #endif -} - -#endif // COOLANT_CONTROL diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 6302bb5c67..4047049f54 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,35 +16,40 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" - #include "../../module/temperature.h" -#include "../../module/planner.h" // for planner.finish_and_disable -#include "../../module/printcounter.h" // for print_job_timer.stop -#include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM_P +#include "../../module/stepper.h" #include "../../inc/MarlinConfig.h" -#if HAS_SUICIDE - #include "../../MarlinCore.h" +#if ENABLED(ULTIPANEL) + #include "../../lcd/ultralcd.h" #endif -#if ENABLED(PSU_CONTROL) +#if HAS_SUICIDE + #include "../../Marlin.h" +#endif + +#if HAS_POWER_SWITCH #if ENABLED(AUTO_POWER_CONTROL) #include "../../feature/power.h" - #else - void restore_stepper_drivers(); #endif // Could be moved to a feature, but this is all the data - bool powersupply_on; + bool powersupply_on = ( + #if ENABLED(PS_DEFAULT_OFF) + false + #else + true + #endif + ); - #if HAS_TRINAMIC_CONFIG + #if HAS_TRINAMIC #include "../../feature/tmc_util.h" #endif @@ -68,35 +73,35 @@ * a print without suicide... */ #if HAS_SUICIDE - OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); + OUT_WRITE(SUICIDE_PIN, HIGH); #endif #if DISABLED(AUTO_POWER_CONTROL) - safe_delay(PSU_POWERUP_DELAY); + delay(100); // Wait for power to settle restore_stepper_drivers(); - TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY)); #endif - TERN_(HAS_LCD_MENU, ui.reset_status()); + #if ENABLED(ULTIPANEL) + lcd_reset_status(); + #endif } -#endif // PSU_CONTROL +#endif // HAS_POWER_SWITCH /** * M81: Turn off Power, including Power Supply, if there is one. * - * This code should ALWAYS be available for FULL SHUTDOWN! + * This code should ALWAYS be available for EMERGENCY SHUTDOWN! */ void GcodeSuite::M81() { thermalManager.disable_all_heaters(); - print_job_timer.stop(); planner.finish_and_disable(); - #if HAS_FAN - thermalManager.zero_fan_speeds(); + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; #if ENABLED(PROBING_FANS_OFF) - thermalManager.fans_paused = false; - ZERO(thermalManager.saved_fan_speed); + fans_paused = false; + ZERO(paused_fanSpeeds); #endif #endif @@ -104,9 +109,11 @@ void GcodeSuite::M81() { #if HAS_SUICIDE suicide(); - #elif ENABLED(PSU_CONTROL) + #elif HAS_POWER_SWITCH PSU_OFF(); #endif - LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " STR_OFF ".")); + #if ENABLED(ULTIPANEL) + LCD_MESSAGEPGM(MACHINE_NAME " " MSG_OFF "."); + #endif } diff --git a/Marlin/src/gcode/control/M85.cpp b/Marlin/src/gcode/control/M85.cpp index 9c8c02c59a..2d8ab08b99 100644 --- a/Marlin/src/gcode/control/M85.cpp +++ b/Marlin/src/gcode/control/M85.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,20 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" +#include "../../Marlin.h" // for max_inactive_time /** * M85: Set inactivity shutdown timer with parameter S. To disable set zero (default) */ void GcodeSuite::M85() { - if (parser.seen('S')) { - reset_stepper_timeout(); - max_inactive_time = parser.value_millis_from_seconds(); - } + if (parser.seen('S')) max_inactive_time = parser.value_millis_from_seconds(); } diff --git a/Marlin/src/gcode/control/M993_M994.cpp b/Marlin/src/gcode/control/M993_M994.cpp deleted file mode 100644 index ff9ff85bf5..0000000000 --- a/Marlin/src/gcode/control/M993_M994.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ALL(HAS_SPI_FLASH, SDSUPPORT, MARLIN_DEV_MODE) - -#include "../gcode.h" -#include "../../sd/cardreader.h" -#include "../../libs/W25Qxx.h" - -/** - * M993: Backup SPI Flash to SD - */ -void GcodeSuite::M993() { - if (!card.isMounted()) card.mount(); - - char fname[] = "spiflash.bin"; - card.openFileWrite(fname); - if (!card.isFileOpen()) { - SERIAL_ECHOLNPAIR("Failed to open ", fname, " to write."); - return; - } - - uint8_t buf[1024]; - uint32_t addr = 0; - W25QXX.init(SPI_QUARTER_SPEED); - SERIAL_ECHOPGM("Save SPI Flash"); - while (addr < SPI_FLASH_SIZE) { - W25QXX.SPI_FLASH_BufferRead(buf, addr, COUNT(buf)); - addr += COUNT(buf); - card.write(buf, COUNT(buf)); - if (addr % (COUNT(buf) * 10) == 0) SERIAL_CHAR('.'); - } - SERIAL_ECHOLNPGM(" done"); - - card.closefile(); -} - -/** - * M994: Load a backup from SD to SPI Flash - */ -void GcodeSuite::M994() { - if (!card.isMounted()) card.mount(); - - char fname[] = "spiflash.bin"; - card.openFileRead(fname); - if (!card.isFileOpen()) { - SERIAL_ECHOLNPAIR("Failed to open ", fname, " to read."); - return; - } - - uint8_t buf[1024]; - uint32_t addr = 0; - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BulkErase(); - SERIAL_ECHOPGM("Load SPI Flash"); - while (addr < SPI_FLASH_SIZE) { - card.read(buf, COUNT(buf)); - W25QXX.SPI_FLASH_BufferWrite(buf, addr, COUNT(buf)); - addr += COUNT(buf); - if (addr % (COUNT(buf) * 10) == 0) SERIAL_CHAR('.'); - } - SERIAL_ECHOLNPGM(" done"); - - card.closefile(); -} - -#endif // HAS_SPI_FLASH && SDSUPPORT && MARLIN_DEV_MODE diff --git a/Marlin/src/gcode/control/M997.cpp b/Marlin/src/gcode/control/M997.cpp deleted file mode 100644 index cdff96f1ac..0000000000 --- a/Marlin/src/gcode/control/M997.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../gcode.h" - -#if ENABLED(PLATFORM_M997_SUPPORT) - -/** - * M997: Perform in-application firmware update - */ -void GcodeSuite::M997() { - - flashFirmware(parser.intval('S')); - -} - -#endif diff --git a/Marlin/src/gcode/control/M999.cpp b/Marlin/src/gcode/control/M999.cpp index 3bd908cad6..12c2cfdc59 100644 --- a/Marlin/src/gcode/control/M999.cpp +++ b/Marlin/src/gcode/control/M999.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,30 +16,32 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" #include "../../lcd/ultralcd.h" // for lcd_reset_alert_level -#include "../../MarlinCore.h" // for marlin_state +#include "../../Marlin.h" // for Running #include "../queue.h" // for flush_and_request_resend /** * M999: Restart after being stopped * - * Default behavior is to flush the serial buffer and request + * Default behaviour is to flush the serial buffer and request * a resend to the host starting on the last N line received. * * Sending "M999 S1" will resume printing without flushing the * existing command buffer. + * */ void GcodeSuite::M999() { - marlin_state = MF_RUNNING; - ui.reset_alert_level(); + Running = true; + lcd_reset_alert_level(); if (parser.boolval('S')) return; - queue.flush_and_request_resend(); + // gcode_LastN = Stopped_gcode_LastN; + flush_and_request_resend(); } diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index d95e60ff8d..3911b8fbc4 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,61 +16,52 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" #include "../../module/tool_change.h" -#if EITHER(HAS_MULTI_EXTRUDER, DEBUG_LEVELING_FEATURE) +#if ENABLED(DEBUG_LEVELING_FEATURE) || HOTENDS > 1 #include "../../module/motion.h" #endif -#if ENABLED(PRUSA_MMU2) - #include "../../feature/mmu2/mmu2.h" -#endif - -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../../core/debug_out.h" - /** - * T0-T: Switch tool, usually switching extruders + * T0-T3: Switch tool, usually switching extruders * * F[units/min] Set the movement feedrate * S1 Don't move the tool in XY after change - * - * For PRUSA_MMU2: - * T[n] Gcode to extrude at least 38.10 mm at feedrate 19.02 mm/s must follow immediately to load to extruder wheels. - * T? Gcode to extrude shouldn't have to follow. Load to extruder wheels is done automatically. - * Tx Same as T?, but nozzle doesn't have to be preheated. Tc requires a preheated nozzle to finish filament load. - * Tc Load to nozzle after filament was prepared by Tc and nozzle is already heated. */ -void GcodeSuite::T(const int8_t tool_index) { +void GcodeSuite::T(const uint8_t tmp_extruder) { - DEBUG_SECTION(log_T, "T", DEBUGGING(LEVELING)); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("...(", tool_index, ")"); - - // Count this command as movement / activity - reset_stepper_timeout(); - - #if ENABLED(PRUSA_MMU2) - if (parser.string_arg) { - mmu2.tool_change(parser.string_arg); // Special commands T?/Tx/Tc - return; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> T(", tmp_extruder); + SERIAL_CHAR(')'); + SERIAL_EOL(); + DEBUG_POS("BEFORE", current_position); } #endif - #if EXTRUDERS < 2 + #if HOTENDS == 1 || (ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1) - tool_change(tool_index); + tool_change(tmp_extruder); - #else + #elif HOTENDS > 1 tool_change( - tool_index, - (tool_index == active_extruder) || parser.boolval('S') + tmp_extruder, + MMM_TO_MMS(parser.linearval('F')), + (tmp_extruder == active_extruder) || parser.boolval('S') ); #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + DEBUG_POS("AFTER", current_position); + SERIAL_ECHOLNPGM("<<< T()"); + } + #endif } diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp index 26c50a6129..8c5e3af9df 100644 --- a/Marlin/src/gcode/eeprom/M500-M504.cpp +++ b/Marlin/src/gcode/eeprom/M500-M504.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,34 +16,48 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" -#include "../../module/settings.h" +#include "../../module/configuration_store.h" #include "../../core/serial.h" #include "../../inc/MarlinConfig.h" +#if NUM_SERIAL > 1 + #include "../../gcode/queue.h" +#endif + +#if ADD_PORT_ARG + #define CHAT_PORT command_queue_port[cmd_queue_index_r] +#else + #define CHAT_PORT +#endif + /** * M500: Store settings in EEPROM */ void GcodeSuite::M500() { - (void)settings.save(); + (void)settings.save(CHAT_PORT); } /** * M501: Read settings from EEPROM */ void GcodeSuite::M501() { - (void)settings.load(); + (void)settings.load( + #if ENABLED(EEPROM_SETTINGS) + CHAT_PORT + #endif + ); } /** * M502: Revert to default settings */ void GcodeSuite::M502() { - (void)settings.reset(); + (void)settings.reset(CHAT_PORT); } #if DISABLED(DISABLE_M503) @@ -52,53 +66,24 @@ void GcodeSuite::M502() { * M503: print settings currently in memory */ void GcodeSuite::M503() { - (void)settings.report(!parser.boolval('S', true)); + (void)settings.report( + parser.seen('S') && !parser.value_bool() + #if NUM_SERIAL > 1 + , command_queue_port[cmd_queue_index_r] + #endif + ); } #endif // !DISABLE_M503 #if ENABLED(EEPROM_SETTINGS) - - #if ENABLED(MARLIN_DEV_MODE) - #include "../../libs/hex_print.h" - #endif - /** * M504: Validate EEPROM Contents */ void GcodeSuite::M504() { - #if ENABLED(MARLIN_DEV_MODE) - const bool dowrite = parser.seenval('W'); - if (dowrite || parser.seenval('R')) { - uint8_t val = 0; - int addr = parser.value_ushort(); - if (dowrite) { - val = parser.byteval('V'); - persistentStore.write_data(addr, &val); - SERIAL_ECHOLNPAIR("Wrote address ", addr, " with ", int(val)); - } - else { - if (parser.seenval('T')) { - const int endaddr = parser.value_ushort(); - while (addr <= endaddr) { - persistentStore.read_data(addr, &val); - SERIAL_ECHOLNPAIR("0x", hex_word(addr), ":", hex_byte(val)); - addr++; - safe_delay(10); - } - SERIAL_EOL(); - } - else { - persistentStore.read_data(addr, &val); - SERIAL_ECHOLNPAIR("Read address ", addr, " and got ", int(val)); - } - } - return; - } - #endif - - if (settings.validate()) - SERIAL_ECHO_MSG("EEPROM OK"); + if (settings.validate(CHAT_PORT)) { + SERIAL_ECHO_START_P(command_queue_port[cmd_queue_index_r]); + SERIAL_ECHOLNPGM_P(command_queue_port[cmd_queue_index_r], "EEPROM OK"); + } } - #endif diff --git a/Marlin/src/gcode/feature/L6470/M122.cpp b/Marlin/src/gcode/feature/L6470/M122.cpp deleted file mode 100644 index d2b7f73997..0000000000 --- a/Marlin/src/gcode/feature/L6470/M122.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_L64XX - -#include "../../gcode.h" -#include "../../../libs/L64XX/L64XX_Marlin.h" -#include "../../../module/stepper/indirection.h" - -void echo_yes_no(const bool yes); - -inline void L6470_say_status(const L64XX_axis_t axis) { - if (L64xxManager.spi_abort) return; - const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; - L64xxManager.get_status(axis); - L64xxManager.say_axis(axis); - #if ENABLED(L6470_CHITCHAT) - char temp_buf[20]; - sprintf_P(temp_buf, PSTR(" status: %4x "), sh.STATUS_AXIS_RAW); - SERIAL_ECHO(temp_buf); - print_bin(sh.STATUS_AXIS_RAW); - switch (sh.STATUS_AXIS_LAYOUT) { - case L6470_STATUS_LAYOUT: serialprintPGM(PSTR(" L6470")); break; - case L6474_STATUS_LAYOUT: serialprintPGM(PSTR(" L6474")); break; - case L6480_STATUS_LAYOUT: serialprintPGM(PSTR(" L6480/powerSTEP01")); break; - } - #endif - SERIAL_ECHOPGM("\n...OUTPUT: "); - serialprintPGM(sh.STATUS_AXIS & STATUS_HIZ ? PSTR("OFF") : PSTR("ON ")); - SERIAL_ECHOPGM(" BUSY: "); echo_yes_no((sh.STATUS_AXIS & STATUS_BUSY) == 0); - SERIAL_ECHOPGM(" DIR: "); - serialprintPGM((((sh.STATUS_AXIS & STATUS_DIR) >> 4) ^ L64xxManager.index_to_dir[axis]) ? PSTR("FORWARD") : PSTR("REVERSE")); - if (sh.STATUS_AXIS_LAYOUT == L6480_STATUS_LAYOUT) { - SERIAL_ECHOPGM(" Last Command: "); - if (sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD) SERIAL_ECHOPGM("VALID"); - else SERIAL_ECHOPGM("ERROR"); - SERIAL_ECHOPGM("\n...THERMAL: "); - switch ((sh.STATUS_AXIS & (sh.STATUS_AXIS_TH_SD | sh.STATUS_AXIS_TH_WRN)) >> 11) { - case 0: SERIAL_ECHOPGM("DEVICE SHUTDOWN"); break; - case 1: SERIAL_ECHOPGM("BRIDGE SHUTDOWN"); break; - case 2: SERIAL_ECHOPGM("WARNING "); break; - case 3: SERIAL_ECHOPGM("OK "); break; - } - } - else { - SERIAL_ECHOPGM(" Last Command: "); - if (!(sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD)) SERIAL_ECHOPGM("IN"); - SERIAL_ECHOPGM("VALID "); - serialprintPGM(sh.STATUS_AXIS & sh.STATUS_AXIS_NOTPERF_CMD ? PSTR("COMPLETED ") : PSTR("Not PERFORMED")); - SERIAL_ECHOPAIR("\n...THERMAL: ", !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_SD) ? "SHUTDOWN " : !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_WRN) ? "WARNING " : "OK "); - } - SERIAL_ECHOPGM(" OVERCURRENT:"); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_OCD) == 0); - if (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT) { - SERIAL_ECHOPGM(" STALL:"); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_STEP_LOSS_A) == 0 || (sh.STATUS_AXIS & sh.STATUS_AXIS_STEP_LOSS_B) == 0); - SERIAL_ECHOPGM(" STEP-CLOCK MODE:"); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_SCK_MOD) != 0); - } - else { - SERIAL_ECHOPGM(" STALL: NA " - " STEP-CLOCK MODE: NA" - " UNDER VOLTAGE LOCKOUT: "); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_UVLO) == 0); - } - SERIAL_EOL(); -} - -/** - * M122: Debug L6470 drivers - */ -void GcodeSuite::M122() { - L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status - L64xxManager.spi_active = true; // Tell set_directions() a series of SPI transfers is underway - - //if (parser.seen('S')) - // tmc_set_report_interval(parser.value_bool()); - //else - - #if AXIS_IS_L64XX(X) - L6470_say_status(X); - #endif - #if AXIS_IS_L64XX(X2) - L6470_say_status(X2); - #endif - #if AXIS_IS_L64XX(Y) - L6470_say_status(Y); - #endif - #if AXIS_IS_L64XX(Y2) - L6470_say_status(Y2); - #endif - #if AXIS_IS_L64XX(Z) - L6470_say_status(Z); - #endif - #if AXIS_IS_L64XX(Z2) - L6470_say_status(Z2); - #endif - #if AXIS_IS_L64XX(Z3) - L6470_say_status(Z3); - #endif - #if AXIS_IS_L64XX(Z4) - L6470_say_status(Z4); - #endif - #if AXIS_IS_L64XX(E0) - L6470_say_status(E0); - #endif - #if AXIS_IS_L64XX(E1) - L6470_say_status(E1); - #endif - #if AXIS_IS_L64XX(E2) - L6470_say_status(E2); - #endif - #if AXIS_IS_L64XX(E3) - L6470_say_status(E3); - #endif - #if AXIS_IS_L64XX(E4) - L6470_say_status(E4); - #endif - #if AXIS_IS_L64XX(E5) - L6470_say_status(E5); - #endif - #if AXIS_IS_L64XX(E6) - L6470_say_status(E6); - #endif - #if AXIS_IS_L64XX(E7) - L6470_say_status(E7); - #endif - - L64xxManager.spi_active = false; // done with all SPI transfers - clear handshake flags - L64xxManager.spi_abort = false; - L64xxManager.pause_monitor(false); -} - -#endif // HAS_L64XX diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp deleted file mode 100644 index 7bd446a1ab..0000000000 --- a/Marlin/src/gcode/feature/L6470/M906.cpp +++ /dev/null @@ -1,370 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_L64XX - -#include "../../gcode.h" -#include "../../../libs/L64XX/L64XX_Marlin.h" -#include "../../../module/stepper/indirection.h" -#include "../../../module/planner.h" - -#define DEBUG_OUT ENABLED(L6470_CHITCHAT) -#include "../../../core/debug_out.h" - -/** - * M906: report or set KVAL_HOLD which sets the maximum effective voltage provided by the - * PWMs to the steppers - * - * On L6474 this sets the TVAL register (same address). - * - * I - select which driver(s) to change on multi-driver axis - * 0 - (default) all drivers on the axis or E0 - * 1 - monitor only X, Y, Z or E1 - * 2 - monitor only X2, Y2, Z2 or E2 - * 3 - monitor only Z3 or E3 - * 4 - monitor only Z4 or E4 - * 5 - monitor only E5 - * Xxxx, Yxxx, Zxxx, Exxx - axis to change (optional) - * L6474 - current in mA (4A max) - * All others - 0-255 - */ - -/** - * Sets KVAL_HOLD wich affects the current being driven through the stepper. - * - * L6470 is used in the STEP-CLOCK mode. KVAL_HOLD is the only KVAL_xxx - * that affects the effective voltage seen by the stepper. - */ - -/** - * MACRO to fetch information on the items associated with current limiting - * and maximum voltage output. - * - * L6470 can be setup to shutdown if either current threshold is exceeded. - * - * L6470 output current can not be set directly. It is set indirectly by - * setting the maximum effective output voltage. - * - * Effective output voltage is set by PWM duty cycle. - * - * Maximum effective output voltage is affected by MANY variables. The main ones are: - * KVAL_HOLD - * KVAL_RUN - * KVAL_ACC - * KVAL_DEC - * Vs compensation (if enabled) - */ -void L64XX_report_current(L64XX &motor, const L64XX_axis_t axis) { - - if (L64xxManager.spi_abort) return; // don't do anything if set_directions() has occurred - - const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; - const uint16_t status = L64xxManager.get_status(axis); //also populates shadow structure - const uint8_t OverCurrent_Threshold = uint8_t(motor.GetParam(L6470_OCD_TH)); - - auto say_axis_status = [](const L64XX_axis_t axis, const uint16_t status) { - L64xxManager.say_axis(axis); - #if ENABLED(L6470_CHITCHAT) - char tmp[10]; - sprintf_P(tmp, PSTR("%4x "), status); - DEBUG_ECHOPAIR(" status: ", tmp); - print_bin(status); - #else - UNUSED(status); - #endif - SERIAL_EOL(); - }; - - char temp_buf[10]; - - switch (sh.STATUS_AXIS_LAYOUT) { - case L6470_STATUS_LAYOUT: // L6470 - case L6480_STATUS_LAYOUT: { // L6480 & powerstep01 - const uint16_t Stall_Threshold = (uint8_t)motor.GetParam(L6470_STALL_TH), - motor_status = (status & (STATUS_MOT_STATUS)) >> 5, - L6470_ADC_out = motor.GetParam(L6470_ADC_OUT), - L6470_ADC_out_limited = constrain(L6470_ADC_out, 8, 24); - const float comp_coef = 1600.0f / L6470_ADC_out_limited; - const uint16_t MicroSteps = _BV(motor.GetParam(L6470_STEP_MODE) & 0x07); - - say_axis_status(axis, sh.STATUS_AXIS_RAW); - - SERIAL_ECHOPGM("...OverCurrent Threshold: "); - sprintf_P(temp_buf, PSTR("%2d ("), OverCurrent_Threshold); - SERIAL_ECHO(temp_buf); - SERIAL_ECHO((OverCurrent_Threshold + 1) * motor.OCD_CURRENT_CONSTANT_INV); - SERIAL_ECHOPGM(" mA)"); - SERIAL_ECHOPGM(" Stall Threshold: "); - sprintf_P(temp_buf, PSTR("%2d ("), Stall_Threshold); - SERIAL_ECHO(temp_buf); - SERIAL_ECHO((Stall_Threshold + 1) * motor.STALL_CURRENT_CONSTANT_INV); - SERIAL_ECHOPGM(" mA)"); - SERIAL_ECHOPGM(" Motor Status: "); - switch (motor_status) { - case 0: SERIAL_ECHOPGM("stopped"); break; - case 1: SERIAL_ECHOPGM("accelerating"); break; - case 2: SERIAL_ECHOPGM("decelerating"); break; - case 3: SERIAL_ECHOPGM("at constant speed"); break; - } - SERIAL_EOL(); - - SERIAL_ECHOPAIR("...MicroSteps: ", MicroSteps, - " ADC_OUT: ", L6470_ADC_out); - SERIAL_ECHOPGM(" Vs_compensation: "); - serialprintPGM((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_EN_VSCOMP) ? PSTR("ENABLED ") : PSTR("DISABLED")); - SERIAL_ECHOLNPAIR(" Compensation coefficient: ~", comp_coef * 0.01f); - - SERIAL_ECHOPAIR("...KVAL_HOLD: ", motor.GetParam(L6470_KVAL_HOLD), - " KVAL_RUN : ", motor.GetParam(L6470_KVAL_RUN), - " KVAL_ACC: ", motor.GetParam(L6470_KVAL_ACC), - " KVAL_DEC: ", motor.GetParam(L6470_KVAL_DEC), - " V motor max = "); - switch (motor_status) { - case 0: SERIAL_ECHO(motor.GetParam(L6470_KVAL_HOLD) * 100 / 256); SERIAL_ECHOPGM("% (KVAL_HOLD)"); break; - case 1: SERIAL_ECHO(motor.GetParam(L6470_KVAL_RUN) * 100 / 256); SERIAL_ECHOPGM("% (KVAL_RUN)"); break; - case 2: SERIAL_ECHO(motor.GetParam(L6470_KVAL_ACC) * 100 / 256); SERIAL_ECHOPGM("% (KVAL_ACC)"); break; - case 3: SERIAL_ECHO(motor.GetParam(L6470_KVAL_DEC) * 100 / 256); SERIAL_ECHOPGM("% (KVAL_HOLD)"); break; - } - SERIAL_EOL(); - - #if ENABLED(L6470_CHITCHAT) - DEBUG_ECHOPGM("...SLEW RATE: "); - switch (sh.STATUS_AXIS_LAYOUT) { - case L6470_STATUS_LAYOUT: { - switch ((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_POW_SR) >> CONFIG_POW_SR_BIT) { - case 0: { DEBUG_ECHOLNPGM("320V/uS") ; break; } - case 1: { DEBUG_ECHOLNPGM("75V/uS") ; break; } - case 2: { DEBUG_ECHOLNPGM("110V/uS") ; break; } - case 3: { DEBUG_ECHOLNPGM("260V/uS") ; break; } - } - break; - } - case L6480_STATUS_LAYOUT: { - switch (motor.GetParam(L6470_GATECFG1) & CONFIG1_SR ) { - case CONFIG1_SR_220V_us: { DEBUG_ECHOLNPGM("220V/uS") ; break; } - case CONFIG1_SR_400V_us: { DEBUG_ECHOLNPGM("400V/uS") ; break; } - case CONFIG1_SR_520V_us: { DEBUG_ECHOLNPGM("520V/uS") ; break; } - case CONFIG1_SR_980V_us: { DEBUG_ECHOLNPGM("980V/uS") ; break; } - default: { DEBUG_ECHOLNPGM("unknown") ; break; } - } - } - } - #endif - SERIAL_EOL(); - break; - } - - case L6474_STATUS_LAYOUT: { // L6474 - const uint16_t L6470_ADC_out = motor.GetParam(L6470_ADC_OUT) & 0x1F, - L6474_TVAL_val = motor.GetParam(L6474_TVAL) & 0x7F; - - say_axis_status(axis, sh.STATUS_AXIS_RAW); - - SERIAL_ECHOPGM("...OverCurrent Threshold: "); - sprintf_P(temp_buf, PSTR("%2d ("), OverCurrent_Threshold); - SERIAL_ECHO(temp_buf); - SERIAL_ECHO((OverCurrent_Threshold + 1) * motor.OCD_CURRENT_CONSTANT_INV); - SERIAL_ECHOPGM(" mA)"); - SERIAL_ECHOPGM(" TVAL: "); - sprintf_P(temp_buf, PSTR("%2d ("), L6474_TVAL_val); - SERIAL_ECHO(temp_buf); - SERIAL_ECHO((L6474_TVAL_val + 1) * motor.STALL_CURRENT_CONSTANT_INV); - SERIAL_ECHOLNPGM(" mA) Motor Status: NA"); - - const uint16_t MicroSteps = _BV(motor.GetParam(L6470_STEP_MODE) & 0x07); //NOMORE(MicroSteps, 16); - SERIAL_ECHOPAIR("...MicroSteps: ", MicroSteps, - " ADC_OUT: ", L6470_ADC_out); - - SERIAL_ECHOLNPGM(" Vs_compensation: NA\n"); - SERIAL_ECHOLNPGM("...KVAL_HOLD: NA" - " KVAL_RUN : NA" - " KVAL_ACC: NA" - " KVAL_DEC: NA" - " V motor max = NA"); - - #if ENABLED(L6470_CHITCHAT) - DEBUG_ECHOPGM("...SLEW RATE: "); - switch ((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_POW_SR) >> CONFIG_POW_SR_BIT) { - case 0: DEBUG_ECHOLNPGM("320V/uS") ; break; - case 1: DEBUG_ECHOLNPGM("75V/uS") ; break; - case 2: DEBUG_ECHOLNPGM("110V/uS") ; break; - case 3: DEBUG_ECHOLNPGM("260V/uS") ; break; - default: DEBUG_ECHOLNPAIR("slew rate: ", (motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_POW_SR) >> CONFIG_POW_SR_BIT); break; - } - #endif - SERIAL_EOL(); - SERIAL_EOL(); - break; - } - } -} - -void GcodeSuite::M906() { - - L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status - - #define L6470_SET_KVAL_HOLD(Q) (AXIS_IS_L64XX(Q) ? stepper##Q.setTVALCurrent(value) : stepper##Q.SetParam(L6470_KVAL_HOLD, uint8_t(value))) - - DEBUG_ECHOLNPGM("M906"); - - uint8_t report_current = true; - - #if HAS_L64XX - const uint8_t index = parser.byteval('I'); - #endif - - LOOP_XYZE(i) if (uint16_t value = parser.intval(axis_codes[i])) { - - report_current = false; - - if (planner.has_blocks_queued() || planner.cleaning_buffer_counter) { - SERIAL_ECHOLNPGM("Test aborted. Can't set KVAL_HOLD while steppers are moving."); - return; - } - - switch (i) { - case X_AXIS: - #if AXIS_IS_L64XX(X) - if (index == 0) L6470_SET_KVAL_HOLD(X); - #endif - #if AXIS_IS_L64XX(X2) - if (index == 1) L6470_SET_KVAL_HOLD(X2); - #endif - break; - case Y_AXIS: - #if AXIS_IS_L64XX(Y) - if (index == 0) L6470_SET_KVAL_HOLD(Y); - #endif - #if AXIS_IS_L64XX(Y2) - if (index == 1) L6470_SET_KVAL_HOLD(Y2); - #endif - break; - case Z_AXIS: - #if AXIS_IS_L64XX(Z) - if (index == 0) L6470_SET_KVAL_HOLD(Z); - #endif - #if AXIS_IS_L64XX(Z2) - if (index == 1) L6470_SET_KVAL_HOLD(Z2); - #endif - #if AXIS_IS_L64XX(Z3) - if (index == 2) L6470_SET_KVAL_HOLD(Z3); - #endif - #if AXIS_DRIVER_TYPE_Z4(L6470) - if (index == 3) L6470_SET_KVAL_HOLD(Z4); - #endif - break; - case E_AXIS: { - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - switch (target_extruder) { - #if AXIS_IS_L64XX(E0) - case 0: L6470_SET_KVAL_HOLD(E0); break; - #endif - #if AXIS_IS_L64XX(E1) - case 1: L6470_SET_KVAL_HOLD(E1); break; - #endif - #if AXIS_IS_L64XX(E2) - case 2: L6470_SET_KVAL_HOLD(E2); break; - #endif - #if AXIS_IS_L64XX(E3) - case 3: L6470_SET_KVAL_HOLD(E3); break; - #endif - #if AXIS_IS_L64XX(E4) - case 4: L6470_SET_KVAL_HOLD(E4); break; - #endif - #if AXIS_IS_L64XX(E5) - case 5: L6470_SET_KVAL_HOLD(E5); break; - #endif - #if AXIS_IS_L64XX(E6) - case 6: L6470_SET_KVAL_HOLD(E6); break; - #endif - #if AXIS_IS_L64XX(E7) - case 7: L6470_SET_KVAL_HOLD(E7); break; - #endif - } - } break; - } - } - - if (report_current) { - #define L64XX_REPORT_CURRENT(Q) L64XX_report_current(stepper##Q, Q) - - L64xxManager.spi_active = true; // Tell set_directions() a series of SPI transfers is underway - - #if AXIS_IS_L64XX(X) - L64XX_REPORT_CURRENT(X); - #endif - #if AXIS_IS_L64XX(X2) - L64XX_REPORT_CURRENT(X2); - #endif - #if AXIS_IS_L64XX(Y) - L64XX_REPORT_CURRENT(Y); - #endif - #if AXIS_IS_L64XX(Y2) - L64XX_REPORT_CURRENT(Y2); - #endif - #if AXIS_IS_L64XX(Z) - L64XX_REPORT_CURRENT(Z); - #endif - #if AXIS_IS_L64XX(Z2) - L64XX_REPORT_CURRENT(Z2); - #endif - #if AXIS_IS_L64XX(Z3) - L64XX_REPORT_CURRENT(Z3); - #endif - #if AXIS_IS_L64XX(Z4) - L64XX_REPORT_CURRENT(Z4); - #endif - #if AXIS_IS_L64XX(E0) - L64XX_REPORT_CURRENT(E0); - #endif - #if AXIS_IS_L64XX(E1) - L64XX_REPORT_CURRENT(E1); - #endif - #if AXIS_IS_L64XX(E2) - L64XX_REPORT_CURRENT(E2); - #endif - #if AXIS_IS_L64XX(E3) - L64XX_REPORT_CURRENT(E3); - #endif - #if AXIS_IS_L64XX(E4) - L64XX_REPORT_CURRENT(E4); - #endif - #if AXIS_IS_L64XX(E5) - L64XX_REPORT_CURRENT(E5); - #endif - #if AXIS_IS_L64XX(E6) - L64XX_REPORT_CURRENT(E6); - #endif - #if AXIS_IS_L64XX(E7) - L64XX_REPORT_CURRENT(E7); - #endif - - L64xxManager.spi_active = false; // done with all SPI transfers - clear handshake flags - L64xxManager.spi_abort = false; - L64xxManager.pause_monitor(false); - } -} - -#endif // HAS_L64XX diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp deleted file mode 100644 index 8165b71e44..0000000000 --- a/Marlin/src/gcode/feature/L6470/M916-918.cpp +++ /dev/null @@ -1,651 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// NOTE: All tests assume each axis uses matching driver chips. -// - -#include "../../../inc/MarlinConfig.h" - -#if HAS_L64XX - -#include "../../gcode.h" -#include "../../../module/stepper/indirection.h" -#include "../../../module/planner.h" -#include "../../../libs/L64XX/L64XX_Marlin.h" - -#define DEBUG_OUT ENABLED(L6470_CHITCHAT) -#include "../../../core/debug_out.h" - -/** - * M916: increase KVAL_HOLD until get thermal warning - * NOTE - on L6474 it is TVAL that is used - * - * J - select which driver(s) to monitor on multi-driver axis - * 0 - (default) monitor all drivers on the axis or E0 - * 1 - monitor only X, Y, Z, E1 - * 2 - monitor only X2, Y2, Z2, E2 - * 3 - monitor only Z3, E3 - * 4 - monitor only Z4, E4 - * - * Xxxx, Yxxx, Zxxx, Exxx - axis to be monitored with displacement - * xxx (1-255) is distance moved on either side of current position - * - * F - feedrate - * optional - will use default max feedrate from configuration.h if not specified - * - * T - current (mA) setting for TVAL (0 - 4A in 31.25mA increments, rounds down) - L6474 only - * optional - will report current value from driver if not specified - * - * K - value for KVAL_HOLD (0 - 255) (ignored for L6474) - * optional - will report current value from driver if not specified - * - * D - time (in seconds) to run each setting of KVAL_HOLD/TVAL - * optional - defaults to zero (runs each setting once) - */ - -/** - * This routine is also useful for determining the approximate KVAL_HOLD - * where the stepper stops losing steps. The sound will get noticeably quieter - * as it stops losing steps. - */ - -void GcodeSuite::M916() { - - DEBUG_ECHOLNPGM("M916"); - - L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status - - // Variables used by L64xxManager.get_user_input function - some may not be used - char axis_mon[3][3] = { {" "}, {" "}, {" "} }; // list of Axes to be monitored - L64XX_axis_t axis_index[3]; - uint16_t axis_status[3]; - uint8_t driver_count = 1; - float position_max; - float position_min; - float final_feedrate; - uint8_t kval_hold; - uint8_t OCD_TH_val = 0; - uint8_t STALL_TH_val = 0; - uint16_t over_current_threshold; - constexpr uint8_t over_current_flag = false; // M916 doesn't play with the overcurrent thresholds - - #define DRIVER_TYPE_L6474(Q) AXIS_DRIVER_TYPE_##Q(L6474) - - uint8_t j; // general purpose counter - - if (L64xxManager.get_user_input(driver_count, axis_index, axis_mon, position_max, position_min, final_feedrate, kval_hold, over_current_flag, OCD_TH_val, STALL_TH_val, over_current_threshold)) - return; // quit if invalid user input - - DEBUG_ECHOLNPAIR("feedrate = ", final_feedrate); - - planner.synchronize(); // wait for all current movement commands to complete - - const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; - for (j = 0; j < driver_count; j++) - L64xxManager.get_status(axis_index[j]); // clear out any pre-existing error flags - - char temp_axis_string[] = " "; - temp_axis_string[0] = axis_mon[0][0]; // need to have a string for use within sprintf format section - char gcode_string[80]; - uint16_t status_composite = 0; - - uint16_t M91x_counter = kval_hold; - uint16_t M91x_counter_max; - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { - M91x_counter_max = 128; // TVAL is 7 bits - LIMIT(M91x_counter, 0U, 127U); - } - else - M91x_counter_max = 256; // KVAL_HOLD is 8 bits - - uint8_t M91x_delay_s = parser.byteval('D'); // get delay in seconds - millis_t M91x_delay_ms = M91x_delay_s * 60 * 1000; - millis_t M91x_delay_end; - - DEBUG_ECHOLNPGM(".\n."); - - do { - - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) - DEBUG_ECHOLNPAIR("TVAL current (mA) = ", (M91x_counter + 1) * sh.AXIS_STALL_CURRENT_CONSTANT_INV); // report TVAL current for this run - else - DEBUG_ECHOLNPAIR("kval_hold = ", M91x_counter); // report KVAL_HOLD for this run - - for (j = 0; j < driver_count; j++) - L64xxManager.set_param(axis_index[j], L6470_KVAL_HOLD, M91x_counter); //set KVAL_HOLD or TVAL (same register address) - - M91x_delay_end = millis() + M91x_delay_ms; - do { - // turn the motor(s) both directions - sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_min), uint16_t(final_feedrate)); - gcode.process_subcommands_now_P(gcode_string); - - sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_max), uint16_t(final_feedrate)); - gcode.process_subcommands_now_P(gcode_string); - - // get the status after the motors have stopped - planner.synchronize(); - - status_composite = 0; // clear out the old bits - - for (j = 0; j < driver_count; j++) { - axis_status[j] = (~L64xxManager.get_status(axis_index[j])) & sh.L6470_ERROR_MASK; // bits of interest are all active low - status_composite |= axis_status[j] ; - } - - if (status_composite) break; - } while (millis() < M91x_delay_end); - - if (status_composite) break; - - M91x_counter++; - - } while (!(status_composite & (sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD)) && (M91x_counter < M91x_counter_max)); - - DEBUG_ECHOLNPGM("."); - - #if ENABLED(L6470_CHITCHAT) - if (status_composite) { - L64xxManager.error_status_decode(status_composite, axis_index[0], - sh.STATUS_AXIS_TH_SD, sh.STATUS_AXIS_TH_WRN, - sh.STATUS_AXIS_STEP_LOSS_A, sh.STATUS_AXIS_STEP_LOSS_B, - sh.STATUS_AXIS_OCD, sh.STATUS_AXIS_LAYOUT); - DEBUG_ECHOLNPGM("."); - } - #endif - - if ((status_composite & (sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD))) - DEBUG_ECHOLNPGM(".\n.\nTest completed normally - Thermal warning/shutdown has occurred"); - else if (status_composite) - DEBUG_ECHOLNPGM(".\n.\nTest completed abnormally - non-thermal error has occured"); - else - DEBUG_ECHOLNPGM(".\n.\nTest completed normally - Unable to get to thermal warning/shutdown"); - - L64xxManager.pause_monitor(false); -} - -/** - * M917: Find minimum current thresholds - * - * Decrease OCD current until overcurrent error - * Increase OCD until overcurrent error goes away - * Decrease stall threshold until stall (not done on L6474) - * Increase stall until stall error goes away (not done on L6474) - * - * J - select which driver(s) to monitor on multi-driver axis - * 0 - (default) monitor all drivers on the axis or E0 - * 1 - monitor only X, Y, Z, E1 - * 2 - monitor only X2, Y2, Z2, E2 - * Xxxx, Yxxx, Zxxx, Exxx - axis to be monitored with displacement - * xxx (1-255) is distance moved on either side of current position - * - * F - feedrate - * optional - will use default max feedrate from Configuration.h if not specified - * - * I - starting over-current threshold - * optional - will report current value from driver if not specified - * if there are multiple drivers on the axis then all will be set the same - * - * T - current (mA) setting for TVAL (0 - 4A in 31.25mA increments, rounds down) - L6474 only - * optional - will report current value from driver if not specified - * - * K - value for KVAL_HOLD (0 - 255) (ignored for L6474) - * optional - will report current value from driver if not specified - */ -void GcodeSuite::M917() { - - DEBUG_ECHOLNPGM("M917"); - - L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status - - char axis_mon[3][3] = { {" "}, {" "}, {" "} }; // list of Axes to be monitored - L64XX_axis_t axis_index[3]; - uint16_t axis_status[3]; - uint8_t driver_count = 1; - float position_max; - float position_min; - float final_feedrate; - uint8_t kval_hold; - uint8_t OCD_TH_val = 0; - uint8_t STALL_TH_val = 0; - uint16_t over_current_threshold; - constexpr uint8_t over_current_flag = true; - - uint8_t j; // general purpose counter - - if (L64xxManager.get_user_input(driver_count, axis_index, axis_mon, position_max, position_min, final_feedrate, kval_hold, over_current_flag, OCD_TH_val, STALL_TH_val, over_current_threshold)) - return; // quit if invalid user input - - DEBUG_ECHOLNPAIR("feedrate = ", final_feedrate); - - planner.synchronize(); // wait for all current movement commands to complete - - const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; - for (j = 0; j < driver_count; j++) - L64xxManager.get_status(axis_index[j]); // clear error flags - char temp_axis_string[] = " "; - temp_axis_string[0] = axis_mon[0][0]; // need a sprintf format string - char gcode_string[80]; - uint16_t status_composite = 0; - uint8_t test_phase = 0; // 0 - decreasing OCD - exit when OCD warning occurs (ignore STALL) - // 1 - increasing OCD - exit when OCD warning stops (ignore STALL) - // 2 - OCD finalized - decreasing STALL - exit when STALL warning happens - // 3 - OCD finalized - increasing STALL - exit when STALL warning stop - // 4 - all testing completed - DEBUG_ECHOPAIR(".\n.\n.\nover_current threshold : ", (OCD_TH_val + 1) * 375); // first status display - DEBUG_ECHOPAIR(" (OCD_TH: : ", OCD_TH_val); - if (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT) { - DEBUG_ECHOPAIR(") Stall threshold: ", (STALL_TH_val + 1) * 31.25); - DEBUG_ECHOPAIR(" (STALL_TH: ", STALL_TH_val); - } - DEBUG_ECHOLNPGM(")"); - - do { - - if (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT) DEBUG_ECHOPAIR("STALL threshold : ", (STALL_TH_val + 1) * 31.25); - DEBUG_ECHOLNPAIR(" OCD threshold : ", (OCD_TH_val + 1) * 375); - - sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_min), uint16_t(final_feedrate)); - gcode.process_subcommands_now_P(gcode_string); - - sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_max), uint16_t(final_feedrate)); - gcode.process_subcommands_now_P(gcode_string); - - planner.synchronize(); - - status_composite = 0; // clear out the old bits - - for (j = 0; j < driver_count; j++) { - axis_status[j] = (~L64xxManager.get_status(axis_index[j])) & sh.L6470_ERROR_MASK; // bits of interest are all active low - status_composite |= axis_status[j]; - } - - if (status_composite && (status_composite & sh.STATUS_AXIS_UVLO)) { - DEBUG_ECHOLNPGM("Test aborted (Undervoltage lockout active)"); - #if ENABLED(L6470_CHITCHAT) - for (j = 0; j < driver_count; j++) { - if (j) DEBUG_ECHOPGM("..."); - L64xxManager.error_status_decode(axis_status[j], axis_index[j], - sh.STATUS_AXIS_TH_SD, sh.STATUS_AXIS_TH_WRN, - sh.STATUS_AXIS_STEP_LOSS_A, sh.STATUS_AXIS_STEP_LOSS_B, - sh.STATUS_AXIS_OCD, sh.STATUS_AXIS_LAYOUT); - } - #endif - return; - } - - if (status_composite & (sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD)) { - DEBUG_ECHOLNPGM("thermal problem - waiting for chip(s) to cool down "); - uint16_t status_composite_temp = 0; - uint8_t k = 0; - do { - k++; - if (!(k % 4)) { - kval_hold *= 0.95; - DEBUG_EOL(); - DEBUG_ECHOLNPAIR("Lowering KVAL_HOLD by about 5% to ", kval_hold); - for (j = 0; j < driver_count; j++) - L64xxManager.set_param(axis_index[j], L6470_KVAL_HOLD, kval_hold); - } - DEBUG_ECHOLNPGM("."); - gcode.reset_stepper_timeout(); // reset_stepper_timeout to keep steppers powered - watchdog_refresh();; // beat the dog - safe_delay(5000); - status_composite_temp = 0; - for (j = 0; j < driver_count; j++) { - axis_status[j] = (~L64xxManager.get_status(axis_index[j])) & sh.L6470_ERROR_MASK; // bits of interest are all active low - status_composite_temp |= axis_status[j]; - } - } - while (status_composite_temp & (sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD)); - DEBUG_EOL(); - } - if (status_composite & (sh.STATUS_AXIS_STEP_LOSS_A | sh.STATUS_AXIS_STEP_LOSS_B | sh.STATUS_AXIS_OCD)) { - switch (test_phase) { - - case 0: { - if (status_composite & sh.STATUS_AXIS_OCD) { - // phase 0 with OCD warning - time to go to next phase - if (OCD_TH_val >= sh.AXIS_OCD_TH_MAX) { - OCD_TH_val = sh.AXIS_OCD_TH_MAX; // limit to max - test_phase = 2; // at highest value so skip phase 1 - //DEBUG_ECHOLNPGM("LOGIC E0A OCD at highest - skip to 2"); - DEBUG_ECHOLNPGM("OCD at highest - OCD finalized"); - } - else { - OCD_TH_val++; // normal exit to next phase - test_phase = 1; // setup for first pass of phase 1 - //DEBUG_ECHOLNPGM("LOGIC E0B - inc OCD & go to 1"); - DEBUG_ECHOLNPGM("inc OCD"); - } - } - else { // phase 0 without OCD warning - keep on decrementing if can - if (OCD_TH_val) { - OCD_TH_val--; // try lower value - //DEBUG_ECHOLNPGM("LOGIC E0C - dec OCD"); - DEBUG_ECHOLNPGM("dec OCD"); - } - else { - test_phase = 2; // at lowest value without warning so skip phase 1 - //DEBUG_ECHOLNPGM("LOGIC E0D - OCD at latest - go to 2"); - DEBUG_ECHOLNPGM("OCD finalized"); - } - } - } break; - - case 1: { - if (status_composite & sh.STATUS_AXIS_OCD) { - // phase 1 with OCD warning - increment if can - if (OCD_TH_val >= sh.AXIS_OCD_TH_MAX) { - OCD_TH_val = sh.AXIS_OCD_TH_MAX; // limit to max - test_phase = 2; // at highest value so go to next phase - //DEBUG_ECHOLNPGM("LOGIC E1A - OCD at max - go to 2"); - DEBUG_ECHOLNPGM("OCD finalized"); - } - else { - OCD_TH_val++; // try a higher value - //DEBUG_ECHOLNPGM("LOGIC E1B - inc OCD"); - DEBUG_ECHOLNPGM("inc OCD"); - } - } - else { // phase 1 without OCD warning - normal exit to phase 2 - test_phase = 2; - //DEBUG_ECHOLNPGM("LOGIC E1C - no OCD warning - go to 1"); - DEBUG_ECHOLNPGM("OCD finalized"); - } - } break; - - case 2: { - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // skip all STALL_TH steps if L6474 - test_phase = 4; - break; - } - if (status_composite & (sh.STATUS_AXIS_STEP_LOSS_A | sh.STATUS_AXIS_STEP_LOSS_B)) { - // phase 2 with stall warning - time to go to next phase - if (STALL_TH_val >= 127) { - STALL_TH_val = 127; // limit to max - //DEBUG_ECHOLNPGM("LOGIC E2A - STALL warning, STALL at max, quit"); - DEBUG_ECHOLNPGM("finished - STALL at maximum value but still have stall warning"); - test_phase = 4; - } - else { - test_phase = 3; // normal exit to next phase (found failing value of STALL) - STALL_TH_val++; // setup for first pass of phase 3 - //DEBUG_ECHOLNPGM("LOGIC E2B - INC - STALL warning, inc Stall, go to 3"); - DEBUG_ECHOLNPGM("inc Stall"); - } - } - else { // phase 2 without stall warning - decrement if can - if (STALL_TH_val) { - STALL_TH_val--; // try a lower value - //DEBUG_ECHOLNPGM("LOGIC E2C - no STALL, dec STALL"); - DEBUG_ECHOLNPGM("dec STALL"); - } - else { - DEBUG_ECHOLNPGM("finished - STALL at lowest value but still do NOT have stall warning"); - test_phase = 4; - //DEBUG_ECHOLNPGM("LOGIC E2D - no STALL, at lowest so quit"); - } - } - } break; - - case 3: { - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // skip all STALL_TH steps if L6474 - test_phase = 4; - break; - } - if (status_composite & (sh.STATUS_AXIS_STEP_LOSS_A | sh.STATUS_AXIS_STEP_LOSS_B)) { - // phase 3 with stall warning - increment if can - if (STALL_TH_val >= 127) { - STALL_TH_val = 127; // limit to max - DEBUG_ECHOLNPGM("finished - STALL at maximum value but still have stall warning"); - test_phase = 4; - //DEBUG_ECHOLNPGM("LOGIC E3A - STALL, at max so quit"); - } - else { - STALL_TH_val++; // still looking for passing value - //DEBUG_ECHOLNPGM("LOGIC E3B - STALL, inc stall"); - DEBUG_ECHOLNPGM("inc stall"); - } - } - else { //phase 3 without stall warning but have OCD warning - DEBUG_ECHOLNPGM("Hardware problem - OCD warning without STALL warning"); - test_phase = 4; - //DEBUG_ECHOLNPGM("LOGIC E3C - not STALLED, hardware problem (quit)"); - } - } break; - - } - - } - else { - switch (test_phase) { - case 0: { // phase 0 without OCD warning - keep on decrementing if can - if (OCD_TH_val) { - OCD_TH_val--; // try lower value - //DEBUG_ECHOLNPGM("LOGIC N0A - DEC OCD"); - DEBUG_ECHOLNPGM("DEC OCD"); - } - else { - test_phase = 2; // at lowest value without warning so skip phase 1 - //DEBUG_ECHOLNPGM("LOGIC N0B - OCD at lowest (go to phase 2)"); - DEBUG_ECHOLNPGM("OCD finalized"); - } - } break; - - case 1: //DEBUG_ECHOLNPGM("LOGIC N1 (go directly to 2)"); // phase 1 without OCD warning - drop directly to phase 2 - DEBUG_ECHOLNPGM("OCD finalized"); - - case 2: { // phase 2 without stall warning - keep on decrementing if can - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // skip all STALL_TH steps if L6474 - test_phase = 4; - break; - } - if (STALL_TH_val) { - STALL_TH_val--; // try a lower value (stay in phase 2) - //DEBUG_ECHOLNPGM("LOGIC N2B - dec STALL"); - DEBUG_ECHOLNPGM("dec STALL"); - } - else { - DEBUG_ECHOLNPGM("finished - STALL at lowest value but still no stall warning"); - test_phase = 4; - //DEBUG_ECHOLNPGM("LOGIC N2C - STALL at lowest (quit)"); - } - } break; - - case 3: { - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // skip all STALL_TH steps if L6474 - test_phase = 4; - break; - } - test_phase = 4; - //DEBUG_ECHOLNPGM("LOGIC N3 - finished!"); - DEBUG_ECHOLNPGM("finished!"); - } break; // phase 3 without any warnings - desired exit - } // - } // end of status checks - - if (test_phase != 4) { - for (j = 0; j < driver_count; j++) { // update threshold(s) - L64xxManager.set_param(axis_index[j], L6470_OCD_TH, OCD_TH_val); - if (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT) L64xxManager.set_param(axis_index[j], L6470_STALL_TH, STALL_TH_val); - if (L64xxManager.get_param(axis_index[j], L6470_OCD_TH) != OCD_TH_val) DEBUG_ECHOLNPGM("OCD mismatch"); - if ((L64xxManager.get_param(axis_index[j], L6470_STALL_TH) != STALL_TH_val) && (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT)) DEBUG_ECHOLNPGM("STALL mismatch"); - } - } - - } while (test_phase != 4); - - DEBUG_ECHOLNPGM("."); - if (status_composite) { - #if ENABLED(L6470_CHITCHAT) - for (j = 0; j < driver_count; j++) { - if (j) DEBUG_ECHOPGM("..."); - L64xxManager.error_status_decode(axis_status[j], axis_index[j], - sh.STATUS_AXIS_TH_SD, sh.STATUS_AXIS_TH_WRN, - sh.STATUS_AXIS_STEP_LOSS_A, sh.STATUS_AXIS_STEP_LOSS_B, - sh.STATUS_AXIS_OCD, sh.STATUS_AXIS_LAYOUT); - } - DEBUG_ECHOLNPGM("."); - #endif - DEBUG_ECHOLNPGM("Completed with errors"); - } - else - DEBUG_ECHOLNPGM("Completed with no errors"); - DEBUG_ECHOLNPGM("."); - - L64xxManager.pause_monitor(false); -} - -/** - * M918: increase speed until error or max feedrate achieved (as shown in configuration.h)) - * - * J - select which driver(s) to monitor on multi-driver axis - * 0 - (default) monitor all drivers on the axis or E0 - * 1 - monitor only X, Y, Z, E1 - * 2 - monitor only X2, Y2, Z2, E2 - * Xxxx, Yxxx, Zxxx, Exxx - axis to be monitored with displacement - * xxx (1-255) is distance moved on either side of current position - * - * I - over current threshold - * optional - will report current value from driver if not specified - * - * T - current (mA) setting for TVAL (0 - 4A in 31.25mA increments, rounds down) - L6474 only - * optional - will report current value from driver if not specified - * - * K - value for KVAL_HOLD (0 - 255) (ignored for L6474) - * optional - will report current value from driver if not specified - * - * M - value for microsteps (1 - 128) (optional) - * optional - will report current value from driver if not specified - */ -void GcodeSuite::M918() { - - DEBUG_ECHOLNPGM("M918"); - - L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status - - char axis_mon[3][3] = { {" "}, {" "}, {" "} }; // list of Axes to be monitored - L64XX_axis_t axis_index[3]; - uint16_t axis_status[3]; - uint8_t driver_count = 1; - float position_max, position_min; - float final_feedrate; - uint8_t kval_hold; - uint8_t OCD_TH_val = 0; - uint8_t STALL_TH_val = 0; - uint16_t over_current_threshold; - constexpr uint8_t over_current_flag = true; - - const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; - - uint8_t j; // general purpose counter - - if (L64xxManager.get_user_input(driver_count, axis_index, axis_mon, position_max, position_min, final_feedrate, kval_hold, over_current_flag, OCD_TH_val, STALL_TH_val, over_current_threshold)) - return; // quit if invalid user input - - L64xxManager.get_status(axis_index[0]); // populate shadow array - - uint8_t m_steps = parser.byteval('M'); - - if (m_steps != 0) { - LIMIT(m_steps, 1, sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT ? 16 : 128); // L6474 - - uint8_t stepVal; - for (stepVal = 0; stepVal < 8; stepVal++) { // convert to L64xx register value - if (m_steps == 1) break; - m_steps >>= 1; - } - - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) - stepVal |= 0x98; // NO SYNC - else - stepVal |= (!SYNC_EN) | SYNC_SEL_1 | stepVal; - - for (j = 0; j < driver_count; j++) { - L64xxManager.set_param(axis_index[j], dSPIN_HARD_HIZ, 0); // can't write STEP register if stepper being powered - // results in an extra NOOP being sent (data 00) - L64xxManager.set_param(axis_index[j], L6470_STEP_MODE, stepVal); // set microsteps - } - } - m_steps = L64xxManager.get_param(axis_index[0], L6470_STEP_MODE) & 0x07; // get microsteps - - DEBUG_ECHOLNPAIR("Microsteps = ", _BV(m_steps)); - DEBUG_ECHOLNPAIR("target (maximum) feedrate = ", final_feedrate); - - const float feedrate_inc = final_feedrate / 10, // Start at 1/10 of max & go up by 1/10 per step - fr_limit = final_feedrate * 0.99f; // Rounding-safe comparison value - float current_feedrate = 0; - - planner.synchronize(); // Wait for moves to complete - - for (j = 0; j < driver_count; j++) - L64xxManager.get_status(axis_index[j]); // Clear error flags - - char temp_axis_string[2] = " "; - temp_axis_string[0] = axis_mon[0][0]; // Need a sprintf format string - //temp_axis_string[1] = '\n'; - - char gcode_string[80]; - uint16_t status_composite = 0; - DEBUG_ECHOLNPGM(".\n.\n."); // Make feedrate outputs easier to read - - do { - current_feedrate += feedrate_inc; - DEBUG_ECHOLNPAIR("...feedrate = ", current_feedrate); - - sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_min), uint16_t(current_feedrate)); - gcode.process_subcommands_now_P(gcode_string); - - sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_max), uint16_t(current_feedrate)); - gcode.process_subcommands_now_P(gcode_string); - - planner.synchronize(); - - for (j = 0; j < driver_count; j++) { - axis_status[j] = (~L64xxManager.get_status(axis_index[j])) & 0x0800; // Bits of interest are all active LOW - status_composite |= axis_status[j]; - } - if (status_composite) break; // Break on any error - } while (current_feedrate < fr_limit); - - DEBUG_ECHOPGM("Completed with "); - if (status_composite) { - DEBUG_ECHOLNPGM("errors"); - #if ENABLED(L6470_CHITCHAT) - for (j = 0; j < driver_count; j++) { - if (j) DEBUG_ECHOPGM("..."); - L64xxManager.error_status_decode(axis_status[j], axis_index[j], - sh.STATUS_AXIS_TH_SD, sh.STATUS_AXIS_TH_WRN, - sh.STATUS_AXIS_STEP_LOSS_A, sh.STATUS_AXIS_STEP_LOSS_B, - sh.STATUS_AXIS_OCD, sh.STATUS_AXIS_LAYOUT); - } - #endif - } - else - DEBUG_ECHOLNPGM("no errors"); - - L64xxManager.pause_monitor(false); -} - -#endif // HAS_L64XX diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp index 5c7155d7c9..3627869a06 100644 --- a/Marlin/src/gcode/feature/advance/M900.cpp +++ b/Marlin/src/gcode/feature/advance/M900.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -28,120 +28,25 @@ #include "../../../module/planner.h" #include "../../../module/stepper.h" -#if ENABLED(EXTRA_LIN_ADVANCE_K) - float other_extruder_advance_K[EXTRUDERS]; - uint8_t lin_adv_slot = 0; -#endif - /** * M900: Get or Set Linear Advance K-factor - * T Which tool to address - * K Set current advance K factor (Slot 0). - * L Set secondary advance K factor (Slot 1). Requires EXTRA_LIN_ADVANCE_K. - * S<0/1> Activate slot 0 or 1. Requires EXTRA_LIN_ADVANCE_K. + * + * K Set advance K factor */ void GcodeSuite::M900() { - - auto echo_value_oor = [](const char ltr, const bool ten=true) { - SERIAL_CHAR('?'); SERIAL_CHAR(ltr); - SERIAL_ECHOPGM(" value out of range"); - if (ten) SERIAL_ECHOPGM(" (0-10)"); - SERIAL_ECHOLNPGM("."); - }; - - #if EXTRUDERS < 2 - constexpr uint8_t tool_index = 0; - #else - const uint8_t tool_index = parser.intval('T', active_extruder); - if (tool_index >= EXTRUDERS) { - echo_value_oor('T', false); - return; + if (parser.seenval('K')) { + const float newK = parser.floatval('K'); + if (WITHIN(newK, 0, 10)) { + planner.synchronize(); + planner.extruder_advance_K = newK; } - #endif - - float &kref = planner.extruder_advance_K[tool_index], newK = kref; - const float oldK = newK; - - #if ENABLED(EXTRA_LIN_ADVANCE_K) - - float &lref = other_extruder_advance_K[tool_index]; - - const bool old_slot = TEST(lin_adv_slot, tool_index), // The tool's current slot (0 or 1) - new_slot = parser.boolval('S', old_slot); // The passed slot (default = current) - - // If a new slot is being selected swap the current and - // saved K values. Do here so K/L will apply correctly. - if (new_slot != old_slot) { // Not the same slot? - SET_BIT_TO(lin_adv_slot, tool_index, new_slot); // Update the slot for the tool - newK = lref; // Get new K value from backup - lref = oldK; // Save K to backup - } - - // Set the main K value. Apply if the main slot is active. - if (parser.seenval('K')) { - const float K = parser.value_float(); - if (!WITHIN(K, 0, 10)) echo_value_oor('K'); - else if (new_slot) lref = K; // S1 Knn - else newK = K; // S0 Knn - } - - // Set the extra K value. Apply if the extra slot is active. - if (parser.seenval('L')) { - const float L = parser.value_float(); - if (!WITHIN(L, 0, 10)) echo_value_oor('L'); - else if (!new_slot) lref = L; // S0 Lnn - else newK = L; // S1 Lnn - } - - #else - - if (parser.seenval('K')) { - const float K = parser.value_float(); - if (WITHIN(K, 0, 10)) - newK = K; - else - echo_value_oor('K'); - } - - #endif - - if (newK != oldK) { - planner.synchronize(); - kref = newK; + else + SERIAL_PROTOCOLLNPGM("?K value out of range (0-10)."); } - - if (!parser.seen_any()) { - - #if ENABLED(EXTRA_LIN_ADVANCE_K) - - #if EXTRUDERS < 2 - SERIAL_ECHOLNPAIR("Advance S", int(new_slot), " K", kref, "(S", int(!new_slot), " K", lref, ")"); - #else - LOOP_L_N(i, EXTRUDERS) { - const bool slot = TEST(lin_adv_slot, i); - SERIAL_ECHOLNPAIR("Advance T", int(i), " S", int(slot), " K", planner.extruder_advance_K[i], - "(S", int(!slot), " K", other_extruder_advance_K[i], ")"); - SERIAL_EOL(); - } - #endif - - #else - - SERIAL_ECHO_START(); - #if EXTRUDERS < 2 - SERIAL_ECHOLNPAIR("Advance K=", planner.extruder_advance_K[0]); - #else - SERIAL_ECHOPGM("Advance K"); - LOOP_L_N(i, EXTRUDERS) { - SERIAL_CHAR(' ', '0' + i, ':'); - SERIAL_DECIMAL(planner.extruder_advance_K[i]); - } - SERIAL_EOL(); - #endif - - #endif + else { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Advance K=", planner.extruder_advance_K); } - } #endif // LIN_ADVANCE diff --git a/Marlin/src/gcode/feature/baricuda/M126-M129.cpp b/Marlin/src/gcode/feature/baricuda/M126-M129.cpp index edeba0d270..aaad59f465 100644 --- a/Marlin/src/gcode/feature/baricuda/M126-M129.cpp +++ b/Marlin/src/gcode/feature/baricuda/M126-M129.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp index fc350d8a55..9d729acf33 100644 --- a/Marlin/src/gcode/feature/camera/M240.cpp +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,189 +16,46 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../inc/MarlinConfig.h" -#if ENABLED(PHOTO_GCODE) +#if defined(CHDK) || HAS_PHOTOGRAPH #include "../../gcode.h" -#include "../../../module/motion.h" // for active_extruder and current_position - -#if PIN_EXISTS(CHDK) - millis_t chdk_timeout; // = 0 -#endif - -#if defined(PHOTO_POSITION) && PHOTO_DELAY_MS > 0 - #include "../../../MarlinCore.h" // for idle() -#endif - -#ifdef PHOTO_RETRACT_MM - - #define _PHOTO_RETRACT_MM (PHOTO_RETRACT_MM + 0) - - #include "../../../module/planner.h" - #include "../../../module/temperature.h" - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - #include "../../../feature/pause.h" - #endif - - #ifdef PHOTO_RETRACT_MM - inline void e_move_m240(const float length, const feedRate_t &fr_mm_s) { - if (length && thermalManager.hotEnoughToExtrude(active_extruder)) - unscaled_e_move(length, fr_mm_s); - } - #endif - -#endif - -#if PIN_EXISTS(PHOTOGRAPH) - - FORCE_INLINE void set_photo_pin(const uint8_t state) { - constexpr uint32_t pulse_length = ( - #ifdef PHOTO_PULSES_US - PHOTO_PULSE_DELAY_US - #else - 15 // 15.24 from _delay_ms(0.01524) - #endif - ); - WRITE(PHOTOGRAPH_PIN, state); - delayMicroseconds(pulse_length); - } - - FORCE_INLINE void tweak_photo_pin() { set_photo_pin(HIGH); set_photo_pin(LOW); } - - #ifdef PHOTO_PULSES_US - - inline void pulse_photo_pin(const uint32_t duration, const uint8_t state) { - if (state) { - for (const uint32_t stop = micros() + duration; micros() < stop;) - tweak_photo_pin(); - } - else - delayMicroseconds(duration); - } - - inline void spin_photo_pin() { - static constexpr uint32_t sequence[] = PHOTO_PULSES_US; - LOOP_L_N(i, COUNT(sequence)) - pulse_photo_pin(sequence[i], !(i & 1)); - } - - #else - - constexpr uint8_t NUM_PULSES = 16; - inline void spin_photo_pin() { for (uint8_t i = NUM_PULSES; i--;) tweak_photo_pin(); } - - #endif -#endif /** - * M240: Trigger a camera by... - * - * - CHDK : Emulate a Canon RC-1 with a configurable ON duration. - * https://captain-slow.dk/2014/03/09/3d-printing-timelapses/ - * - PHOTOGRAPH_PIN : Pulse a digital pin 16 times. - * See https://www.doc-diy.net/photo/rc-1_hacked/ - * - PHOTO_SWITCH_POSITION : Bump a physical switch with the X-carriage using a - * configured position, delay, and retract length. - * - * PHOTO_POSITION parameters: - * A - X offset to the return position - * B - Y offset to the return position - * F - Override the XY movement feedrate - * R - Retract/recover length (current units) - * S - Retract/recover feedrate (mm/m) - * X - Move to X before triggering the shutter - * Y - Move to Y before triggering the shutter - * Z - Raise Z by a distance before triggering the shutter - * - * PHOTO_SWITCH_POSITION parameters: - * D - Duration (ms) to hold down switch (Requires PHOTO_SWITCH_MS) - * P - Delay (ms) after triggering the shutter (Requires PHOTO_SWITCH_MS) - * I - Switch trigger position override X - * J - Switch trigger position override Y + * M240: Trigger a camera by emulating a Canon RC-1 + * See http://www.doc-diy.net/photo/rc-1_hacked/ */ void GcodeSuite::M240() { + #ifdef CHDK - #ifdef PHOTO_POSITION - - if (homing_needed_error()) return; - - const xyz_pos_t old_pos = { - current_position.x + parser.linearval('A'), - current_position.y + parser.linearval('B'), - current_position.z - }; - - #ifdef PHOTO_RETRACT_MM - const float rval = parser.seenval('R') ? parser.value_linear_units() : _PHOTO_RETRACT_MM; - feedRate_t sval = ( - #if ENABLED(ADVANCED_PAUSE_FEATURE) - PAUSE_PARK_RETRACT_FEEDRATE - #elif ENABLED(FWRETRACT) - RETRACT_FEEDRATE - #else - 45 - #endif - ); - if (parser.seenval('S')) sval = parser.value_feedrate(); - e_move_m240(-rval, sval); - #endif - - feedRate_t fr_mm_s = MMM_TO_MMS(parser.linearval('F')); - if (fr_mm_s) NOLESS(fr_mm_s, 10.0f); - - constexpr xyz_pos_t photo_position = PHOTO_POSITION; - xyz_pos_t raw = { - parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : photo_position.x, - parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : photo_position.y, - (parser.seenval('Z') ? parser.value_linear_units() : photo_position.z) + current_position.z - }; - apply_motion_limits(raw); - do_blocking_move_to(raw, fr_mm_s); - - #ifdef PHOTO_SWITCH_POSITION - constexpr xy_pos_t photo_switch_position = PHOTO_SWITCH_POSITION; - const xy_pos_t sraw = { - parser.seenval('I') ? RAW_X_POSITION(parser.value_linear_units()) : photo_switch_position.x, - parser.seenval('J') ? RAW_Y_POSITION(parser.value_linear_units()) : photo_switch_position.y - }; - do_blocking_move_to_xy(sraw, get_homing_bump_feedrate(X_AXIS)); - #if PHOTO_SWITCH_MS > 0 - safe_delay(parser.intval('D', PHOTO_SWITCH_MS)); - #endif - do_blocking_move_to(raw); - #endif - - #endif - - #if PIN_EXISTS(CHDK) - - OUT_WRITE(CHDK_PIN, HIGH); - chdk_timeout = millis() + parser.intval('D', PHOTO_SWITCH_MS); + OUT_WRITE(CHDK, HIGH); + chdkHigh = millis(); + chdkActive = true; #elif HAS_PHOTOGRAPH - spin_photo_pin(); + const uint8_t NUM_PULSES = 16; + const float PULSE_LENGTH = 0.01524; + for (int i = 0; i < NUM_PULSES; i++) { + WRITE(PHOTOGRAPH_PIN, HIGH); + _delay_ms(PULSE_LENGTH); + WRITE(PHOTOGRAPH_PIN, LOW); + _delay_ms(PULSE_LENGTH); + } delay(7.33); - spin_photo_pin(); + for (int i = 0; i < NUM_PULSES; i++) { + WRITE(PHOTOGRAPH_PIN, HIGH); + _delay_ms(PULSE_LENGTH); + WRITE(PHOTOGRAPH_PIN, LOW); + _delay_ms(PULSE_LENGTH); + } #endif - - #ifdef PHOTO_POSITION - #if PHOTO_DELAY_MS > 0 - const millis_t timeout = millis() + parser.intval('P', PHOTO_DELAY_MS); - while (PENDING(millis(), timeout)) idle(); - #endif - do_blocking_move_to(old_pos, fr_mm_s); - #ifdef PHOTO_RETRACT_MM - e_move_m240(rval, sval); - #endif - #endif } -#endif // PHOTO_GCODE +#endif // CHDK || HAS_PHOTOGRAPH diff --git a/Marlin/src/gcode/feature/cancel/M486.cpp b/Marlin/src/gcode/feature/cancel/M486.cpp deleted file mode 100644 index 1f14ae0fd2..0000000000 --- a/Marlin/src/gcode/feature/cancel/M486.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(CANCEL_OBJECTS) - -#include "../../gcode.h" -#include "../../../feature/cancel_object.h" - -/** - * M486: A simple interface to cancel objects - * - * T[count] : Reset objects and/or set the count - * S : Start an object with the given index - * P : Cancel the object with the given index - * U : Un-cancel object with the given index - * C : Cancel the current object (the last index given by S) - * S-1 : Start a non-object like a brim or purge tower that should always print - */ -void GcodeSuite::M486() { - - if (parser.seen('T')) { - cancelable.reset(); - cancelable.object_count = parser.intval('T', 1); - } - - if (parser.seen('S')) - cancelable.set_active_object(parser.value_int()); - - if (parser.seen('C')) cancelable.cancel_active_object(); - - if (parser.seen('P')) cancelable.cancel_object(parser.value_int()); - - if (parser.seen('U')) cancelable.uncancel_object(parser.value_int()); -} - -#endif // CANCEL_OBJECTS diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp index bb6b57f666..f22936d13c 100644 --- a/Marlin/src/gcode/feature/caselight/M355.cpp +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,16 +16,17 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ +#include "../../gcode.h" + #include "../../../inc/MarlinConfig.h" -#if ENABLED(CASE_LIGHT_ENABLE) - -#include "../../../feature/caselight.h" -#include "../../gcode.h" +#if HAS_CASE_LIGHT + #include "../../../feature/caselight.h" +#endif /** * M355: Turn case light on/off and set brightness @@ -40,27 +41,29 @@ * M355 S1 turns on the light with a brightness of 200 (assuming a PWM pin) */ void GcodeSuite::M355() { - bool didset = false; - if (parser.seenval('P')) { - didset = true; - caselight.brightness = parser.value_byte(); - } - const bool sflag = parser.seenval('S'); - if (sflag) { - didset = true; - caselight.on = parser.value_bool(); - } - if (didset) caselight.update(sflag); + #if HAS_CASE_LIGHT + uint8_t args = 0; + if (parser.seenval('P')) { + ++args, case_light_brightness = parser.value_byte(); + case_light_arg_flag = false; + } + if (parser.seenval('S')) { + ++args, case_light_on = parser.value_bool(); + case_light_arg_flag = true; + } + if (args) update_case_light(); - // Always report case light status - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Case light: "); - if (!caselight.on) - SERIAL_ECHOLNPGM(STR_OFF); - else { - if (!PWM_PIN(CASE_LIGHT_PIN)) SERIAL_ECHOLNPGM(STR_ON); - else SERIAL_ECHOLN(int(caselight.brightness)); - } + // always report case light status + SERIAL_ECHO_START(); + if (!case_light_on) { + SERIAL_ECHOLNPGM("Case light: off"); + } + else { + if (!USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN)) SERIAL_ECHOLNPGM("Case light: on"); + else SERIAL_ECHOLNPAIR("Case light: ", case_light_brightness); + } + #else + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M355_NONE); + #endif } - -#endif // CASE_LIGHT_ENABLE diff --git a/Marlin/src/gcode/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp index 216db5bae3..dbd9dd3ce3 100644 --- a/Marlin/src/gcode/feature/clean/G12.cpp +++ b/Marlin/src/gcode/feature/clean/G12.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -30,51 +30,19 @@ #include "../../parser.h" #include "../../../module/motion.h" -#if HAS_LEVELING - #include "../../../module/planner.h" - #include "../../../feature/bedlevel/bedlevel.h" -#endif - /** * G12: Clean the nozzle - * - * E : 0=Never or 1=Always apply the "software endstop" limits - * P0 S : Stroke cleaning with S strokes - * P1 Sn T : Zigzag cleaning with S repeats and T zigzags - * P2 Sn R : Circle cleaning with S repeats and R radius */ void GcodeSuite::G12() { // Don't allow nozzle cleaning without homing first - if (homing_needed_error()) return; - - #ifdef WIPE_SEQUENCE_COMMANDS - if (!parser.seen_any()) { - gcode.process_subcommands_now_P(PSTR(WIPE_SEQUENCE_COMMANDS)); - return; - } - #endif + if (axis_unhomed_error()) return; const uint8_t pattern = parser.ushortval('P', 0), strokes = parser.ushortval('S', NOZZLE_CLEAN_STROKES), objects = parser.ushortval('T', NOZZLE_CLEAN_TRIANGLES); - const float radius = parser.linearval('R', NOZZLE_CLEAN_CIRCLE_RADIUS); + const float radius = parser.floatval('R', NOZZLE_CLEAN_CIRCLE_RADIUS); - const bool seenxyz = parser.seen("XYZ"); - const uint8_t cleans = (!seenxyz || parser.boolval('X') ? _BV(X_AXIS) : 0) - | (!seenxyz || parser.boolval('Y') ? _BV(Y_AXIS) : 0) - | TERN(NOZZLE_CLEAN_NO_Z, 0, (!seenxyz || parser.boolval('Z') ? _BV(Z_AXIS) : 0)) - ; - - #if HAS_LEVELING - // Disable bed leveling if cleaning Z - TEMPORARY_BED_LEVELING_STATE(!TEST(cleans, Z_AXIS) && planner.leveling_active); - #endif - - SET_SOFT_ENDSTOP_LOOSE(!parser.boolval('E')); - - nozzle.clean(pattern, strokes, radius, objects, cleans); - - SET_SOFT_ENDSTOP_LOOSE(false); + Nozzle::clean(pattern, strokes, radius, objects); } #endif // NOZZLE_CLEAN_FEATURE diff --git a/Marlin/src/gcode/feature/controllerfan/M710.cpp b/Marlin/src/gcode/feature/controllerfan/M710.cpp deleted file mode 100644 index 67d4ad8abf..0000000000 --- a/Marlin/src/gcode/feature/controllerfan/M710.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(CONTROLLER_FAN_EDITABLE) - -#include "../../gcode.h" -#include "../../../feature/controllerfan.h" - -void M710_report(const bool forReplay) { - if (!forReplay) { SERIAL_ECHOLNPGM("; Controller Fan"); SERIAL_ECHO_START(); } - SERIAL_ECHOLNPAIR(" M710" - " S", int(controllerFan.settings.active_speed), - " I", int(controllerFan.settings.idle_speed), - " A", int(controllerFan.settings.auto_mode), - " D", controllerFan.settings.duration, - " ; (", (int(controllerFan.settings.active_speed) * 100) / 255, "%" - " ", (int(controllerFan.settings.idle_speed) * 100) / 255, "%)" - ); -} - -/** - * M710: Set controller fan settings - * - * R : Reset to defaults - * S[0-255] : Fan speed when motors are active - * I[0-255] : Fan speed when motors are idle - * A[0|1] : Turn auto mode on or off - * D : Set auto mode idle duration - * - * Examples: - * M710 ; Report current Settings - * M710 R ; Reset SIAD to defaults - * M710 I64 ; Set controller fan Idle Speed to 25% - * M710 S255 ; Set controller fan Active Speed to 100% - * M710 S0 ; Set controller fan Active Speed to OFF - * M710 I255 A0 ; Set controller fan Idle Speed to 100% with Auto Mode OFF - * M710 I127 A1 S255 D160 ; Set controller fan idle speed 50%, AutoMode On, Fan speed 100%, duration to 160 Secs - */ -void GcodeSuite::M710() { - - const bool seenR = parser.seen('R'); - if (seenR) controllerFan.reset(); - - const bool seenS = parser.seenval('S'); - if (seenS) controllerFan.settings.active_speed = parser.value_byte(); - - const bool seenI = parser.seenval('I'); - if (seenI) controllerFan.settings.idle_speed = parser.value_byte(); - - const bool seenA = parser.seenval('A'); - if (seenA) controllerFan.settings.auto_mode = parser.value_bool(); - - const bool seenD = parser.seenval('D'); - if (seenD) controllerFan.settings.duration = parser.value_ushort(); - - if (!(seenR || seenS || seenI || seenA || seenD)) - M710_report(false); -} - -#endif // CONTROLLER_FAN_EDITABLE diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index e463666207..10849f2eb8 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,25 +16,25 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../inc/MarlinConfig.h" -#if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) +#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM || ENABLED(DIGIPOT_I2C) || ENABLED(DAC_STEPPER_CURRENT) #include "../../gcode.h" -#if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM +#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM #include "../../../module/stepper.h" #endif -#if HAS_MOTOR_CURRENT_I2C +#if ENABLED(DIGIPOT_I2C) #include "../../../feature/digipot/digipot.h" #endif -#if ENABLED(HAS_MOTOR_CURRENT_DAC) +#if ENABLED(DAC_STEPPER_CURRENT) #include "../../../feature/dac/stepper_dac.h" #endif @@ -42,61 +42,69 @@ * M907: Set digital trimpot motor current using axis codes X, Y, Z, E, B, S */ void GcodeSuite::M907() { - #if HAS_MOTOR_CURRENT_SPI + #if HAS_DIGIPOTSS - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.set_digipot_current(i, parser.value_int()); - if (parser.seenval('B')) stepper.set_digipot_current(4, parser.value_int()); - if (parser.seenval('S')) LOOP_LE_N(i, 4) stepper.set_digipot_current(i, parser.value_int()); + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) stepper.digipot_current(i, parser.value_int()); + if (parser.seen('B')) stepper.digipot_current(4, parser.value_int()); + if (parser.seen('S')) for (uint8_t i = 0; i <= 4; i++) stepper.digipot_current(i, parser.value_int()); #elif HAS_MOTOR_CURRENT_PWM - #if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY) - if (parser.seenval('X') || parser.seenval('Y')) stepper.set_digipot_current(0, parser.value_int()); + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + if (parser.seen('X')) stepper.digipot_current(0, parser.value_int()); #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - if (parser.seenval('Z')) stepper.set_digipot_current(1, parser.value_int()); + if (parser.seen('Z')) stepper.digipot_current(1, parser.value_int()); #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - if (parser.seenval('E')) stepper.set_digipot_current(2, parser.value_int()); + if (parser.seen('E')) stepper.digipot_current(2, parser.value_int()); #endif #endif - #if HAS_MOTOR_CURRENT_I2C + #if ENABLED(DIGIPOT_I2C) // this one uses actual amps in floating point - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) digipot_i2c.set_current(i, parser.value_float()); - // Additional extruders use B,C,D for channels 4,5,6. - // TODO: Change these parameters because 'E' is used. B? - for (uint8_t i = E_AXIS + 1; i < DIGIPOT_I2C_NUM_CHANNELS; i++) - if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c.set_current(i, parser.value_float()); + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) digipot_i2c_set_current(i, parser.value_float()); + // for each additional extruder (named B,C,D,E..., channels 4,5,6,7...) + for (uint8_t i = NUM_AXIS; i < DIGIPOT_I2C_NUM_CHANNELS; i++) if (parser.seen('B' + i - (NUM_AXIS))) digipot_i2c_set_current(i, parser.value_float()); #endif - #if ENABLED(HAS_MOTOR_CURRENT_DAC) - if (parser.seenval('S')) { + #if ENABLED(DAC_STEPPER_CURRENT) + if (parser.seen('S')) { const float dac_percent = parser.value_float(); - LOOP_LE_N(i, 4) stepper_dac.set_current_percent(i, dac_percent); + for (uint8_t i = 0; i <= 4; i++) dac_current_percent(i, dac_percent); } - LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper_dac.set_current_percent(i, parser.value_float()); + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) dac_current_percent(i, parser.value_float()); #endif } -#if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) +#if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) /** * M908: Control digital trimpot directly (M908 P S) */ void GcodeSuite::M908() { - TERN_(HAS_MOTOR_CURRENT_SPI, stepper.set_digipot_value_spi(parser.intval('P'), parser.intval('S'))); - TERN_(HAS_MOTOR_CURRENT_DAC, stepper_dac.set_current_value(parser.byteval('P', -1), parser.ushortval('S', 0))); + #if HAS_DIGIPOTSS + stepper.digitalPotWrite( + parser.intval('P'), + parser.intval('S') + ); + #endif + #if ENABLED(DAC_STEPPER_CURRENT) + dac_current_raw( + parser.byteval('P', -1), + parser.ushortval('S', 0) + ); + #endif } - #if ENABLED(HAS_MOTOR_CURRENT_DAC) +#endif // HAS_DIGIPOTSS || DAC_STEPPER_CURRENT - void GcodeSuite::M909() { stepper_dac.print_values(); } - void GcodeSuite::M910() { stepper_dac.commit_eeprom(); } +#if ENABLED(DAC_STEPPER_CURRENT) - #endif // HAS_MOTOR_CURRENT_DAC + void GcodeSuite::M909() { dac_print_values(); } + void GcodeSuite::M910() { dac_commit_eeprom(); } -#endif // HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_DAC +#endif // DAC_STEPPER_CURRENT -#endif // HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM || HAS_MOTOR_CURRENT_I2C || HAS_MOTOR_CURRENT_DAC +#endif // HAS_DIGIPOTSS || DAC_STEPPER_CURRENT || HAS_MOTOR_CURRENT_PWM || DIGIPOT_I2C diff --git a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp index 516289fe27..a096feef17 100644 --- a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp +++ b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,19 +27,21 @@ #include "../../../feature/filwidth.h" #include "../../../module/planner.h" #include "../../../module/temperature.h" -#include "../../../MarlinCore.h" +#include "../../../Marlin.h" #include "../../gcode.h" /** * M404: Display or set (in current units) the nominal filament width (3mm, 1.75mm ) W<3.0> */ void GcodeSuite::M404() { - if (parser.seenval('W')) { - filwidth.nominal_mm = parser.value_linear_units(); - planner.volumetric_area_nominal = CIRCLE_AREA(filwidth.nominal_mm * 0.5); + if (parser.seen('W')) { + filament_width_nominal = parser.value_linear_units(); + planner.volumetric_area_nominal = CIRCLE_AREA(filament_width_nominal * 0.5); + } + else { + SERIAL_PROTOCOLPGM("Filament dia (nominal mm):"); + SERIAL_PROTOCOLLN(filament_width_nominal); } - else - SERIAL_ECHOLNPAIR("Filament dia (nominal mm):", filwidth.nominal_mm); } /** @@ -48,17 +50,28 @@ void GcodeSuite::M404() { void GcodeSuite::M405() { // This is technically a linear measurement, but since it's quantized to centimeters and is a different // unit than everything else, it uses parser.value_byte() instead of parser.value_linear_units(). - if (parser.seenval('D')) - filwidth.set_delay_cm(parser.value_byte()); + if (parser.seen('D')) { + meas_delay_cm = parser.value_byte(); + NOMORE(meas_delay_cm, MAX_MEASUREMENT_DELAY); + } - filwidth.enable(true); + if (filwidth_delay_index[1] == -1) { // Initialize the ring buffer if not done since startup + const int8_t temp_ratio = thermalManager.widthFil_to_size_ratio(); + + for (uint8_t i = 0; i < COUNT(measurement_delay); ++i) + measurement_delay[i] = temp_ratio; + + filwidth_delay_index[0] = filwidth_delay_index[1] = 0; + } + + filament_sensor = true; } /** * M406: Turn off filament sensor for control */ void GcodeSuite::M406() { - filwidth.enable(false); + filament_sensor = false; planner.calculate_volumetric_multipliers(); // Restore correct 'volumetric_multiplier' value } @@ -66,7 +79,8 @@ void GcodeSuite::M406() { * M407: Get measured filament diameter on serial output */ void GcodeSuite::M407() { - SERIAL_ECHOLNPAIR("Filament dia (measured mm):", filwidth.measured_mm); + SERIAL_PROTOCOLPGM("Filament dia (measured mm):"); + SERIAL_PROTOCOLLN(filament_width_meas); } #endif // FILAMENT_WIDTH_SENSOR diff --git a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp index 219502f28a..9231386d35 100644 --- a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp +++ b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -30,14 +30,13 @@ /** * G10 - Retract filament according to settings of M207 - * TODO: Handle 'G10 P' for tool settings and 'G10 L' for workspace settings */ void GcodeSuite::G10() { - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 const bool rs = parser.boolval('S'); #endif fwretract.retract(true - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 , rs #endif ); diff --git a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp index 538f16cde6..827f03ebb0 100644 --- a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp +++ b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -33,42 +33,41 @@ * S[+units] retract_length * W[+units] swap_retract_length (multi-extruder) * F[units/min] retract_feedrate_mm_s - * Z[units] retract_zraise + * Z[units] retract_zlift */ void GcodeSuite::M207() { - if (parser.seen('S')) fwretract.settings.retract_length = parser.value_axis_units(E_AXIS); - if (parser.seen('F')) fwretract.settings.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); - if (parser.seen('Z')) fwretract.settings.retract_zraise = parser.value_linear_units(); - if (parser.seen('W')) fwretract.settings.swap_retract_length = parser.value_axis_units(E_AXIS); + if (parser.seen('S')) fwretract.retract_length = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) fwretract.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('Z')) fwretract.retract_zlift = parser.value_linear_units(); + if (parser.seen('W')) fwretract.swap_retract_length = parser.value_axis_units(E_AXIS); } /** * M208: Set firmware un-retraction values * - * S[+units] retract_recover_extra (in addition to M207 S*) - * W[+units] swap_retract_recover_extra (multi-extruder) + * S[+units] retract_recover_length (in addition to M207 S*) + * W[+units] swap_retract_recover_length (multi-extruder) * F[units/min] retract_recover_feedrate_mm_s * R[units/min] swap_retract_recover_feedrate_mm_s */ void GcodeSuite::M208() { - if (parser.seen('S')) fwretract.settings.retract_recover_extra = parser.value_axis_units(E_AXIS); - if (parser.seen('F')) fwretract.settings.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); - if (parser.seen('R')) fwretract.settings.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); - if (parser.seen('W')) fwretract.settings.swap_retract_recover_extra = parser.value_axis_units(E_AXIS); + if (parser.seen('S')) fwretract.retract_recover_length = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) fwretract.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('R')) fwretract.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('W')) fwretract.swap_retract_recover_length = parser.value_axis_units(E_AXIS); } -#if ENABLED(FWRETRACT_AUTORETRACT) - - /** - * M209: Enable automatic retract (M209 S1) - * For slicers that don't support G10/11, reversed extrude-only - * moves will be classified as retraction. - */ - void GcodeSuite::M209() { - if (MIN_AUTORETRACT <= MAX_AUTORETRACT && parser.seen('S')) +/** + * M209: Enable automatic retract (M209 S1) + * For slicers that don't support G10/11, reversed extrude-only + * moves will be classified as retraction. + */ +void GcodeSuite::M209() { + if (MIN_AUTORETRACT <= MAX_AUTORETRACT) { + if (parser.seen('S')) { fwretract.enable_autoretract(parser.value_bool()); + } } - -#endif // FWRETRACT_AUTORETRACT +} #endif // FWRETRACT diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp index 526d9101e1..918e764c40 100644 --- a/Marlin/src/gcode/feature/i2c/M260_M261.cpp +++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -26,12 +26,12 @@ #include "../../gcode.h" -#include "../../../MarlinCore.h" // for i2c +#include "../../../Marlin.h" // for i2c /** * M260: Send data to a I2C slave device * - * This is a PoC, the formatting and arguments for the GCODE will + * This is a PoC, the formating and arguments for the GCODE will * change to be more compatible, the current proposal is: * * M260 A ; Sets the I2C slave address the data will be sent to @@ -42,6 +42,7 @@ * * M260 S1 ; Send the buffered data and reset the buffer * M260 R1 ; Reset the buffer without sending data + * */ void GcodeSuite::M260() { // Set the target address @@ -67,10 +68,13 @@ void GcodeSuite::M261() { uint8_t bytes = parser.byteval('B', 1); - if (i2c.addr && bytes && bytes <= TWIBUS_BUFFER_SIZE) + if (i2c.addr && bytes && bytes <= TWIBUS_BUFFER_SIZE) { i2c.relay(bytes); - else - SERIAL_ERROR_MSG("Bad i2c request"); + } + else { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Bad i2c request"); + } } #endif diff --git a/Marlin/src/gcode/feature/leds/M102.cpp b/Marlin/src/gcode/feature/leds/M102.cpp new file mode 100644 index 0000000000..e84affb726 --- /dev/null +++ b/Marlin/src/gcode/feature/leds/M102.cpp @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(MAX7219_DEBUG) + +#include "../../gcode.h" +#include "../../../feature/Max7219_Debug_LEDs.h" + +/** + * M102: Directly re-initialize Max7219 debug LEDs + */ +void GcodeSuite::M102() { + Max7219_register_setup(); +} + +#endif // MAX7219_DEBUG diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp index cf09bf14ea..7eb8eb70de 100644 --- a/Marlin/src/gcode/feature/leds/M150.cpp +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -34,12 +34,6 @@ * Always sets all 3 or 4 components. If a component is left out, set to 0. * If brightness is left out, no value changed * - * With NEOPIXEL_LED: - * I Set the NeoPixel index to affect. Default: All - * - * With NEOPIXEL2_SEPARATE: - * S The NeoPixel strip to set. Default is index 0. - * * Examples: * * M150 R255 ; Turn LED red @@ -49,36 +43,15 @@ * M150 W ; Turn LED white using a white LED * M150 P127 ; Set LED 50% brightness * M150 P ; Set LED full brightness - * M150 I1 R ; Set NEOPIXEL index 1 to red - * M150 S1 I1 R ; Set SEPARATE index 1 to red */ - void GcodeSuite::M150() { - #if ENABLED(NEOPIXEL_LED) - const uint8_t index = parser.intval('I', -1); - #if ENABLED(NEOPIXEL2_SEPARATE) - const uint8_t unit = parser.intval('S'), - brightness = unit ? neo2.brightness() : neo.brightness(); - *(unit ? &neo2.neoindex : &neo.neoindex) = index; - #else - const uint8_t brightness = neo.brightness(); - neo.neoindex = index; - #endif - #endif - - const LEDColor color = MakeLEDColor( + leds.set_color(MakeLEDColor( parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('U') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('B') ? (parser.has_value() ? parser.value_byte() : 255) : 0, parser.seen('W') ? (parser.has_value() ? parser.value_byte() : 255) : 0, - parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : brightness - ); - - #if ENABLED(NEOPIXEL2_SEPARATE) - if (unit == 1) { leds2.set_color(color); return; } - #endif - - leds.set_color(color); + parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : pixels.getBrightness() + )); } #endif // HAS_COLOR_LEDS diff --git a/Marlin/src/gcode/feature/leds/M7219.cpp b/Marlin/src/gcode/feature/leds/M7219.cpp index a6ee71174b..3621c4ac02 100644 --- a/Marlin/src/gcode/feature/leds/M7219.cpp +++ b/Marlin/src/gcode/feature/leds/M7219.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,7 +25,7 @@ #if ENABLED(MAX7219_GCODE) #include "../../gcode.h" -#include "../../../feature/max7219.h" +#include "../../../feature/Max7219_Debug_LEDs.h" /** * M7219: Control the Max7219 LED matrix @@ -33,16 +33,13 @@ * I - Initialize (clear) the matrix * F - Fill the matrix (set all bits) * P - Dump the led_line[] array values - * C - Set a column to the bitmask given by 'V' (Units 0-3 in portrait layout) - * R - Set a row to the bitmask given by 'V' (Units 0-3 in landscape layout) - * X - X index of an LED to set or toggle - * Y - Y index of an LED to set or toggle - * V - LED on/off state or row/column bitmask (8, 16, 24, or 32-bits) - * ('C' / 'R' can be used to update up to 4 units at once) - * - * Directly set a native matrix row to the 8-bit value 'V': - * D - Display line (0..7) - * U - Unit index (0..MAX7219_NUMBER_UNITS-1) + * C - Set a column to the 8-bit value V + * R - Set a row to the 8-bit value V + * X - X position of an LED to set or toggle + * Y - Y position of an LED to set or toggle + * V - The potentially 32-bit value or on/off state to set + * (for example: a chain of 4 Max7219 devices can have 32 bit + * rows or columns depending upon rotation) */ void GcodeSuite::M7219() { if (parser.seen('I')) { @@ -65,13 +62,12 @@ void GcodeSuite::M7219() { else if (parser.seenval('X') || parser.seenval('Y')) { const uint8_t x = parser.byteval('X'), y = parser.byteval('Y'); if (parser.seenval('V')) - max7219.led_set(x, y, v > 0); + max7219.led_set(x, y, parser.boolval('V')); else max7219.led_toggle(x, y); } else if (parser.seen('D')) { - const uint8_t uline = parser.value_byte() & 0x7, - line = uline + (parser.byteval('U') << 3); + const uint8_t line = parser.byteval('D') + (parser.byteval('U') << 3); if (line < MAX7219_LINES) { max7219.led_line[line] = v; return max7219.refresh_line(line); @@ -79,11 +75,11 @@ void GcodeSuite::M7219() { } if (parser.seen('P')) { - LOOP_L_N(r, MAX7219_LINES) { + for (uint8_t r = 0; r < MAX7219_LINES; r++) { SERIAL_ECHOPGM("led_line["); if (r < 10) SERIAL_CHAR(' '); SERIAL_ECHO(int(r)); - SERIAL_ECHOPGM("]="); + SERIAL_ECHO("]="); for (uint8_t b = 8; b--;) SERIAL_CHAR('0' + TEST(max7219.led_line[r], b)); SERIAL_EOL(); } diff --git a/Marlin/src/gcode/feature/macro/M810-M819.cpp b/Marlin/src/gcode/feature/macro/M810-M819.cpp deleted file mode 100644 index 7b9e1a13f1..0000000000 --- a/Marlin/src/gcode/feature/macro/M810-M819.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(GCODE_MACROS) - -#include "../../gcode.h" -#include "../../queue.h" -#include "../../parser.h" - -char gcode_macros[GCODE_MACROS_SLOTS][GCODE_MACROS_SLOT_SIZE + 1] = {{ 0 }}; - -/** - * M810_819: Set/execute a G-code macro. - * - * Usage: - * M810 |... Set Macro 0 to the given commands, separated by the pipe character - * M810 Execute Macro 0 - */ -void GcodeSuite::M810_819() { - const uint8_t index = parser.codenum - 810; - if (index >= GCODE_MACROS_SLOTS) return; - - const size_t len = strlen(parser.string_arg); - - if (len) { - // Set a macro - if (len > GCODE_MACROS_SLOT_SIZE) - SERIAL_ERROR_MSG("Macro too long."); - else { - char c, *s = parser.string_arg, *d = gcode_macros[index]; - do { - c = *s++; - *d++ = c == '|' ? '\n' : c; - } while (c); - } - } - else { - // Execute a macro - char * const cmd = gcode_macros[index]; - if (strlen(cmd)) process_subcommands_now(cmd); - } -} - -#endif // GCODE_MACROS diff --git a/Marlin/src/gcode/feature/mixing/M163-M165.cpp b/Marlin/src/gcode/feature/mixing/M163-M165.cpp index a4cb64e7d6..34d84163ea 100644 --- a/Marlin/src/gcode/feature/mixing/M163-M165.cpp +++ b/Marlin/src/gcode/feature/mixing/M163-M165.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -30,43 +30,45 @@ /** * M163: Set a single mix factor for a mixing extruder * This is called "weight" by some systems. - * Must be followed by M164 to normalize and commit them. * * S[index] The channel index to set * P[float] The mix value + * */ void GcodeSuite::M163() { const int mix_index = parser.intval('S'); - if (mix_index < MIXING_STEPPERS) - mixer.set_collector(mix_index, parser.floatval('P')); + if (mix_index < MIXING_STEPPERS) { + float mix_value = parser.floatval('P'); + NOLESS(mix_value, 0.0); + mixing_factor[mix_index] = RECIPROCAL(mix_value); + } } -/** - * M164: Normalize and commit the mix. - * - * S[index] The virtual tool to store - * If 'S' is omitted update the active virtual tool. - */ -void GcodeSuite::M164() { - #if MIXING_VIRTUAL_TOOLS > 1 - const int tool_index = parser.intval('S', -1); - #else - constexpr int tool_index = 0; - #endif - if (tool_index >= 0) { - if (tool_index < MIXING_VIRTUAL_TOOLS) - mixer.normalize(tool_index); +#if MIXING_VIRTUAL_TOOLS > 1 + + /** + * M164: Store the current mix factors as a virtual tool. + * + * S[index] The virtual tool to store + * + */ + void GcodeSuite::M164() { + const int tool_index = parser.intval('S'); + if (tool_index < MIXING_VIRTUAL_TOOLS) { + normalize_mix(); + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + mixing_virtual_tool_mix[tool_index][i] = mixing_factor[i]; + } } - else - mixer.normalize(); -} + +#endif // MIXING_VIRTUAL_TOOLS > 1 #if ENABLED(DIRECT_MIXING_IN_G1) /** * M165: Set multiple mix factors for a mixing extruder. - * Omitted factors will be set to 0. - * The mix is normalized and stored in the current virtual tool. + * Factors that are left out will be set to 0. + * All factors together must add up to 1.0. * * A[factor] Mix factor for extruder stepper 1 * B[factor] Mix factor for extruder stepper 2 @@ -74,27 +76,9 @@ void GcodeSuite::M164() { * D[factor] Mix factor for extruder stepper 4 * H[factor] Mix factor for extruder stepper 5 * I[factor] Mix factor for extruder stepper 6 + * */ - void GcodeSuite::M165() { - // Get mixing parameters from the GCode - // The total "must" be 1.0 (but it will be normalized) - // If no mix factors are given, the old mix is preserved - const char mixing_codes[] = { LIST_N(MIXING_STEPPERS, 'A', 'B', 'C', 'D', 'H', 'I') }; - uint8_t mix_bits = 0; - MIXER_STEPPER_LOOP(i) { - if (parser.seenval(mixing_codes[i])) { - SBI(mix_bits, i); - mixer.set_collector(i, parser.value_float()); - } - } - // If any mixing factors were included, clear the rest - // If none were included, preserve the last mix - if (mix_bits) { - MIXER_STEPPER_LOOP(i) - if (!TEST(mix_bits, i)) mixer.set_collector(i, 0.0f); - mixer.normalize(); - } - } + void GcodeSuite::M165() { gcode_get_mix(); } #endif // DIRECT_MIXING_IN_G1 diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp deleted file mode 100644 index 9e071a47ec..0000000000 --- a/Marlin/src/gcode/feature/mixing/M166.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(GRADIENT_MIX) - -#include "../../gcode.h" -#include "../../../module/motion.h" -#include "../../../module/planner.h" -#include "../../../feature/mixing.h" - -inline void echo_mix() { - SERIAL_ECHOPAIR(" (", int(mixer.mix[0]), "%|", int(mixer.mix[1]), "%)"); -} - -inline void echo_zt(const int t, const float &z) { - mixer.update_mix_from_vtool(t); - SERIAL_ECHOPAIR_P(SP_Z_STR, z, SP_T_STR, t); - echo_mix(); -} - -/** - * M166: Set a simple gradient mix for a two-component mixer - * based on the Geeetech A10M implementation by Jone Liu. - * - * S[bool] - Enable / disable gradients - * A[float] - Starting Z for the gradient - * Z[float] - Ending Z for the gradient. (Must be greater than the starting Z.) - * I[index] - V-Tool to use as the starting mix. - * J[index] - V-Tool to use as the ending mix. - * - * T[index] - A V-Tool index to use as an alias for the Gradient (Requires GRADIENT_VTOOL) - * T with no index clears the setting. Note: This can match the I or J value. - * - * Example: M166 S1 A0 Z20 I0 J1 - */ -void GcodeSuite::M166() { - if (parser.seenval('A')) mixer.gradient.start_z = parser.value_float(); - if (parser.seenval('Z')) mixer.gradient.end_z = parser.value_float(); - if (parser.seenval('I')) mixer.gradient.start_vtool = (uint8_t)constrain(parser.value_int(), 0, MIXING_VIRTUAL_TOOLS); - if (parser.seenval('J')) mixer.gradient.end_vtool = (uint8_t)constrain(parser.value_int(), 0, MIXING_VIRTUAL_TOOLS); - - #if ENABLED(GRADIENT_VTOOL) - if (parser.seen('T')) mixer.gradient.vtool_index = parser.byteval('T', -1); - #endif - - if (parser.seen('S')) mixer.gradient.enabled = parser.value_bool(); - - mixer.refresh_gradient(); - - SERIAL_ECHOPGM("Gradient Mix "); - serialprint_onoff(mixer.gradient.enabled); - if (mixer.gradient.enabled) { - - #if ENABLED(GRADIENT_VTOOL) - if (mixer.gradient.vtool_index >= 0) { - SERIAL_ECHOPAIR(" (T", int(mixer.gradient.vtool_index)); - SERIAL_CHAR(')'); - } - #endif - - SERIAL_ECHOPGM(" ; Start"); - echo_zt(mixer.gradient.start_vtool, mixer.gradient.start_z); - - SERIAL_ECHOPGM(" ; End"); - echo_zt(mixer.gradient.end_vtool, mixer.gradient.end_z); - - mixer.update_mix_from_gradient(); - - SERIAL_ECHOPGM(" ; Current Z"); - #if ENABLED(DELTA) - get_cartesian_from_steppers(); - SERIAL_ECHO(cartes.z); - #else - SERIAL_ECHO(planner.get_axis_position_mm(Z_AXIS)); - #endif - echo_mix(); - } - - SERIAL_EOL(); -} - -#endif // GRADIENT_MIX diff --git a/Marlin/src/gcode/feature/password/M510-M512.cpp b/Marlin/src/gcode/feature/password/M510-M512.cpp deleted file mode 100644 index 79f1da065b..0000000000 --- a/Marlin/src/gcode/feature/password/M510-M512.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(PASSWORD_FEATURE) - -#include "../../../feature/password/password.h" -#include "../../../core/serial.h" -#include "../../gcode.h" - -// -// M510: Lock Printer -// -void GcodeSuite::M510() { - password.lock_machine(); -} - -// -// M511: Unlock Printer -// -#if ENABLED(PASSWORD_UNLOCK_GCODE) - - void GcodeSuite::M511() { - if (password.is_locked) { - password.value_entry = parser.ulongval('P'); - password.authentication_check(); - } - } - -#endif // PASSWORD_UNLOCK_GCODE - -// -// M512: Set/Change/Remove Password -// -#if ENABLED(PASSWORD_CHANGE_GCODE) - - void GcodeSuite::M512() { - if (password.is_set && parser.ulongval('P') != password.value) { - SERIAL_ECHOLNPGM(STR_WRONG_PASSWORD); - return; - } - - if (parser.seenval('S')) { - password.value_entry = parser.ulongval('S'); - - if (password.value_entry < CAT(1e, PASSWORD_LENGTH)) { - password.is_set = true; - password.value = password.value_entry; - SERIAL_ECHOLNPAIR(STR_PASSWORD_SET, password.value); // TODO: Update password.string - } - else - SERIAL_ECHOLNPGM(STR_PASSWORD_TOO_LONG); - } - else { - password.is_set = false; - SERIAL_ECHOLNPGM(STR_PASSWORD_REMOVED); - } - SERIAL_ECHOLNPGM(STR_REMINDER_SAVE_SETTINGS); - } - -#endif // PASSWORD_CHANGE_GCODE - -#endif // PASSWORD_FEATURE diff --git a/Marlin/src/gcode/feature/pause/G27.cpp b/Marlin/src/gcode/feature/pause/G27.cpp index 3ce618d675..b7e77928a2 100644 --- a/Marlin/src/gcode/feature/pause/G27.cpp +++ b/Marlin/src/gcode/feature/pause/G27.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -34,8 +34,8 @@ */ void GcodeSuite::G27() { // Don't allow nozzle parking without homing first - if (homing_needed_error()) return; - nozzle.park(parser.ushortval('P')); + if (axis_unhomed_error()) return; + Nozzle::park(parser.ushortval('P')); } #endif // NOZZLE_PARK_FEATURE diff --git a/Marlin/src/gcode/feature/pause/G60.cpp b/Marlin/src/gcode/feature/pause/G60.cpp deleted file mode 100644 index 6f695b99a9..0000000000 --- a/Marlin/src/gcode/feature/pause/G60.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if SAVED_POSITIONS - -#include "../../gcode.h" -#include "../../../module/motion.h" - -#define DEBUG_OUT ENABLED(SAVED_POSITIONS_DEBUG) -#include "../../../core/debug_out.h" - -/** - * G60: Save current position - * - * S - Memory slot # (0-based) to save into (default 0) - */ -void GcodeSuite::G60() { - const uint8_t slot = parser.byteval('S'); - - if (slot >= SAVED_POSITIONS) { - SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS)); - return; - } - - stored_position[slot] = current_position; - SBI(saved_slots[slot >> 3], slot & 0x07); - - #if ENABLED(SAVED_POSITIONS_DEBUG) - const xyze_pos_t &pos = stored_position[slot]; - DEBUG_ECHOPAIR_F(STR_SAVED_POS " S", slot); - DEBUG_ECHOPAIR_F(" : X", pos.x); - DEBUG_ECHOPAIR_F_P(SP_Y_STR, pos.y); - DEBUG_ECHOLNPAIR_F_P(SP_Z_STR, pos.z); - #endif -} - -#endif // SAVED_POSITIONS diff --git a/Marlin/src/gcode/feature/pause/G61.cpp b/Marlin/src/gcode/feature/pause/G61.cpp deleted file mode 100644 index d8049f02bc..0000000000 --- a/Marlin/src/gcode/feature/pause/G61.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if SAVED_POSITIONS - -#include "../../../module/planner.h" -#include "../../gcode.h" -#include "../../../module/motion.h" - -/** - * G61: Return to saved position - * - * F - Feedrate (optional) for the move back. - * S - Slot # (0-based) to restore from (default 0). - * X Y Z - Axes to restore. At least one is required. - */ -void GcodeSuite::G61(void) { - - const uint8_t slot = parser.byteval('S'); - - #if SAVED_POSITIONS < 256 - if (slot >= SAVED_POSITIONS) { - SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS)); - return; - } - #endif - - // No saved position? No axes being restored? - if (!TEST(saved_slots[slot >> 3], slot & 0x07) || !parser.seen("XYZ")) return; - - // Apply any given feedrate over 0.0 - const float fr = parser.linearval('F'); - if (fr > 0.0) feedrate_mm_s = MMM_TO_MMS(fr); - - SERIAL_ECHOPAIR(STR_RESTORING_POS " S", int(slot)); - LOOP_XYZ(i) { - destination[i] = parser.seen(XYZ_CHAR(i)) - ? stored_position[slot][i] + parser.value_axis_units((AxisEnum)i) - : current_position[i]; - SERIAL_CHAR(' ', XYZ_CHAR(i)); - SERIAL_ECHO_F(destination[i]); - } - SERIAL_EOL(); - - // Move to the saved position - prepare_line_to_destination(); -} - -#endif // SAVED_POSITIONS diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index db78e870d7..7143392465 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -28,26 +28,20 @@ #include "../../parser.h" #include "../../../feature/pause.h" #include "../../../module/motion.h" -#include "../../../sd/cardreader.h" -#include "../../../module/printcounter.h" -#if HAS_LCD_MENU - #include "../../../lcd/ultralcd.h" -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../feature/powerloss.h" +#if DISABLED(SDSUPPORT) + #include "../../../module/printcounter.h" #endif /** - * M125: Store current position and move to parking position. + * M125: Store current position and move to filament change position. * Called on pause (by M25) to prevent material leaking onto the * object. On resume (M24) the head will be moved back and the * print will resume. * - * When not actively SD printing, M125 simply moves to the park - * position and waits, resuming with a button click or M108. - * Without PARK_HEAD_ON_PAUSE the M125 command does nothing. + * If Marlin is compiled without SD Card support, M125 can be + * used directly to pause the print and move to park position, + * resuming with a button click or M108. * * L = override retract length * X = override X @@ -56,33 +50,40 @@ */ void GcodeSuite::M125() { // Initial retract before move to filament change position - const float retract = -ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) : (PAUSE_PARK_RETRACT_LENGTH)); + const float retract = -ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) : 0 + #ifdef PAUSE_PARK_RETRACT_LENGTH + + (PAUSE_PARK_RETRACT_LENGTH) + #endif + ); - xyz_pos_t park_point = NOZZLE_PARK_POINT; + point_t park_point = NOZZLE_PARK_POINT; // Move XY axes to filament change position or given position - if (parser.seenval('X')) park_point.x = RAW_X_POSITION(parser.linearval('X')); - if (parser.seenval('Y')) park_point.y = RAW_X_POSITION(parser.linearval('Y')); + if (parser.seenval('X')) park_point.x = parser.linearval('X'); + if (parser.seenval('Y')) park_point.y = parser.linearval('Y'); // Lift Z axis if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); - #if HAS_HOTEND_OFFSET && NONE(DUAL_X_CARRIAGE, DELTA) - park_point += hotend_offset[active_extruder]; + #if HAS_HOTEND_OFFSET && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA) + park_point.x += (active_extruder ? hotend_offset[X_AXIS][active_extruder] : 0); + park_point.y += (active_extruder ? hotend_offset[Y_AXIS][active_extruder] : 0); #endif - const bool sd_printing = TERN0(SDSUPPORT, IS_SD_PRINTING()); + #if DISABLED(SDSUPPORT) + const bool job_running = print_job_timer.isRunning(); + #endif - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); + if (pause_print(retract, park_point)) { + #if DISABLED(SDSUPPORT) + // Wait for lcd click or M108 + wait_for_filament_reload(); - const bool show_lcd = TERN0(HAS_LCD_MENU, parser.seenval('P')); + // Return to print position and continue + resume_print(); - if (pause_print(retract, park_point, 0, show_lcd)) { - TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); - if (ENABLED(EXTENSIBLE_UI) || !sd_printing || show_lcd) { - wait_for_confirmation(false, 0); - resume_print(0, 0, -retract, 0); - } + if (job_running) print_job_timer.start(); + #endif } } diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 7c9be54b29..42ed74dbe1 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -29,26 +29,14 @@ #include "../../../module/motion.h" #include "../../../module/printcounter.h" -#if HAS_MULTI_EXTRUDER +#if EXTRUDERS > 1 #include "../../../module/tool_change.h" #endif -#if HAS_LCD_MENU +#if ENABLED(ULTIPANEL) #include "../../../lcd/ultralcd.h" #endif -#if ENABLED(MMU2_MENUS) - #include "../../../lcd/menu/menu_mmu2.h" -#endif - -#if ENABLED(MIXING_EXTRUDER) - #include "../../../feature/mixing.h" -#endif - -#if HAS_FILAMENT_SENSOR - #include "../../../feature/runout.h" -#endif - /** * M600: Pause for filament change * @@ -60,62 +48,37 @@ * L[distance] - Extrude distance for insertion (manual reload) * B[count] - Number of times to beep, -1 for indefinite (if equipped with a buzzer) * T[toolhead] - Select extruder for filament change - * R[temp] - Resume temperature (in current units) * * Default values are used for omitted arguments. */ void GcodeSuite::M600() { + point_t park_point = NOZZLE_PARK_POINT; - #if ENABLED(MIXING_EXTRUDER) - const int8_t target_e_stepper = get_target_e_stepper_from_command(); - if (target_e_stepper < 0) return; - - const uint8_t old_mixing_tool = mixer.get_current_vtool(); - mixer.T(MIXER_DIRECT_SET_TOOL); - - MIXER_STEPPER_LOOP(i) mixer.set_collector(i, i == uint8_t(target_e_stepper) ? 1.0 : 0.0); - mixer.normalize(); - - const int8_t target_extruder = active_extruder; - #else - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - #endif - - #if ENABLED(DUAL_X_CARRIAGE) - int8_t DXC_ext = target_extruder; - if (!parser.seen('T')) { // If no tool index is specified, M600 was (probably) sent in response to filament runout. - // In this case, for duplicating modes set DXC_ext to the extruder that ran out. - #if HAS_FILAMENT_SENSOR && NUM_RUNOUT_SENSORS > 1 - if (dxc_is_duplicating()) - DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_STATE) ? 1 : 0; - #else - DXC_ext = active_extruder; - #endif - } - #endif + if (get_target_extruder_from_command()) return; // Show initial "wait for start" message - #if HAS_LCD_MENU && DISABLED(MMU2_MENUS) - lcd_pause_show_message(PAUSE_MESSAGE_CHANGING, PAUSE_MODE_PAUSE_PRINT, target_extruder); + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INIT, ADVANCED_PAUSE_MODE_PAUSE_PRINT, target_extruder); #endif #if ENABLED(HOME_BEFORE_FILAMENT_CHANGE) - // If needed, home before parking for filament change - if (!all_axes_known()) home_all_axes(); + // Don't allow filament change without homing first + if (axis_unhomed_error()) home_all_axes(); #endif - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 // Change toolhead if specified - const uint8_t active_extruder_before_filament_change = active_extruder; - if (active_extruder != target_extruder && TERN1(DUAL_X_CARRIAGE, !dxc_is_duplicating())) - tool_change(target_extruder, false); + uint8_t active_extruder_before_filament_change = active_extruder; + if (active_extruder != target_extruder) + tool_change(target_extruder, 0, true); #endif // Initial retract before move to filament change position - const float retract = -ABS(parser.seen('E') ? parser.value_axis_units(E_AXIS) : (PAUSE_PARK_RETRACT_LENGTH)); - - xyz_pos_t park_point NOZZLE_PARK_POINT; + const float retract = -ABS(parser.seen('E') ? parser.value_axis_units(E_AXIS) : 0 + #ifdef PAUSE_PARK_RETRACT_LENGTH + + (PAUSE_PARK_RETRACT_LENGTH) + #endif + ); // Lift Z axis if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); @@ -124,52 +87,45 @@ void GcodeSuite::M600() { if (parser.seenval('X')) park_point.x = parser.linearval('X'); if (parser.seenval('Y')) park_point.y = parser.linearval('Y'); - #if HAS_HOTEND_OFFSET && NONE(DUAL_X_CARRIAGE, DELTA) - park_point += hotend_offset[active_extruder]; + #if HAS_HOTEND_OFFSET && DISABLED(DUAL_X_CARRIAGE) && DISABLED(DELTA) + park_point.x += (active_extruder ? hotend_offset[X_AXIS][active_extruder] : 0); + park_point.y += (active_extruder ? hotend_offset[Y_AXIS][active_extruder] : 0); #endif - #if ENABLED(MMU2_MENUS) - // For MMU2 reset retract and load/unload values so they don't mess with MMU filament handling - constexpr float unload_length = 0.5f, - slow_load_length = 0.0f, - fast_load_length = 0.0f; - #else - // Unload filament - const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) - : fc_settings[active_extruder].unload_length); + // Unload filament + const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) + : filament_change_unload_length[active_extruder]); - // Slow load filament - constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; + // Slow load filament + constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; - // Fast load filament - const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) - : fc_settings[active_extruder].load_length); - #endif + // Fast load filament + const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) + : filament_change_load_length[active_extruder]); - const int beep_count = parser.intval('B', -1 + const int beep_count = parser.intval('B', #ifdef FILAMENT_CHANGE_ALERT_BEEPS - + 1 + FILAMENT_CHANGE_ALERT_BEEPS + FILAMENT_CHANGE_ALERT_BEEPS + #else + -1 #endif ); - if (pause_print(retract, park_point, unload_length, true DXC_PASS)) { - #if ENABLED(MMU2_MENUS) - mmu2_M600(); - resume_print(slow_load_length, fast_load_length, 0, beep_count DXC_PASS); - #else - wait_for_confirmation(true, beep_count DXC_PASS); - resume_print(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, - beep_count, (parser.seenval('R') ? parser.value_celsius() : 0) DXC_PASS); - #endif + const bool job_running = print_job_timer.isRunning(); + + if (pause_print(retract, park_point, unload_length, true)) { + wait_for_filament_reload(beep_count); + resume_print(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, beep_count); } - #if HAS_MULTI_EXTRUDER + #if EXTRUDERS > 1 // Restore toolhead if it was changed if (active_extruder_before_filament_change != active_extruder) - tool_change(active_extruder_before_filament_change, false); + tool_change(active_extruder_before_filament_change, 0, true); #endif - TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool + // Resume the print job timer if it was running + if (job_running) print_job_timer.start(); } #endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp index 9c3b774bd2..a6231c3169 100644 --- a/Marlin/src/gcode/feature/pause/M603.cpp +++ b/Marlin/src/gcode/feature/pause/M603.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -29,7 +29,7 @@ #include "../../../module/motion.h" #include "../../../module/printcounter.h" -#if HAS_MULTI_EXTRUDER +#if EXTRUDERS > 1 #include "../../../module/tool_change.h" #endif @@ -39,25 +39,25 @@ * T[toolhead] - Select extruder to configure, active extruder if not specified * U[distance] - Retract distance for removal, for the specified extruder * L[distance] - Extrude distance for insertion, for the specified extruder + * */ void GcodeSuite::M603() { - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; + if (get_target_extruder_from_command()) return; // Unload length if (parser.seen('U')) { - fc_settings[target_extruder].unload_length = ABS(parser.value_axis_units(E_AXIS)); + filament_change_unload_length[target_extruder] = ABS(parser.value_axis_units(E_AXIS)); #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - NOMORE(fc_settings[target_extruder].unload_length, EXTRUDE_MAXLENGTH); + NOMORE(filament_change_unload_length[target_extruder], EXTRUDE_MAXLENGTH); #endif } // Load length if (parser.seen('L')) { - fc_settings[target_extruder].load_length = ABS(parser.value_axis_units(E_AXIS)); + filament_change_load_length[target_extruder] = ABS(parser.value_axis_units(E_AXIS)); #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - NOMORE(fc_settings[target_extruder].load_length, EXTRUDE_MAXLENGTH); + NOMORE(filament_change_load_length[target_extruder], EXTRUDE_MAXLENGTH); #endif } } diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index c1f7223142..d9b4175cea 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,119 +25,84 @@ #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) #include "../../gcode.h" -#include "../../../MarlinCore.h" +#include "../../../Marlin.h" #include "../../../module/motion.h" #include "../../../module/temperature.h" -#include "../../../feature/pause.h" +#include "../../../libs/point_t.h" -#if HAS_MULTI_EXTRUDER +#if EXTRUDERS > 1 #include "../../../module/tool_change.h" #endif -#if HAS_LCD_MENU +#if ENABLED(ULTIPANEL) #include "../../../lcd/ultralcd.h" #endif -#if ENABLED(PRUSA_MMU2) - #include "../../../feature/mmu2/mmu2.h" -#endif - -#if ENABLED(MIXING_EXTRUDER) - #include "../../../feature/mixing.h" -#endif - /** * M701: Load filament * - * T - Extruder number. Required for mixing extruder. - * For non-mixing, current extruder if omitted. + * T - Optional extruder number. Current extruder if omitted. * Z - Move the Z axis by this distance * L - Extrude distance for insertion (positive value) (manual reload) * * Default values are used for omitted arguments. */ void GcodeSuite::M701() { - xyz_pos_t park_point = NOZZLE_PARK_POINT; + point_t park_point = NOZZLE_PARK_POINT; #if ENABLED(NO_MOTION_BEFORE_HOMING) - // Don't raise Z if the machine isn't homed - if (axes_should_home()) park_point.z = 0; + // Only raise Z if the machine is homed + if (axis_unhomed_error()) park_point.z = 0; #endif - #if ENABLED(MIXING_EXTRUDER) - const int8_t target_e_stepper = get_target_e_stepper_from_command(); - if (target_e_stepper < 0) return; - - const uint8_t old_mixing_tool = mixer.get_current_vtool(); - mixer.T(MIXER_DIRECT_SET_TOOL); - - MIXER_STEPPER_LOOP(i) mixer.set_collector(i, (i == (uint8_t)target_e_stepper) ? 1.0 : 0.0); - mixer.normalize(); - - const int8_t target_extruder = active_extruder; - #else - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - #endif + if (get_target_extruder_from_command()) return; // Z axis lift if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); // Show initial "wait for load" message - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder)); + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_LOAD, ADVANCED_PAUSE_MODE_LOAD_FILAMENT, target_extruder); + #endif - #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + #if EXTRUDERS > 1 // Change toolhead if specified uint8_t active_extruder_before_filament_change = active_extruder; if (active_extruder != target_extruder) - tool_change(target_extruder, false); + tool_change(target_extruder, 0, true); #endif // Lift Z axis if (park_point.z > 0) - do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(MIN(current_position[Z_AXIS] + park_point.z, Z_MAX_POS), NOZZLE_PARK_Z_FEEDRATE); // Load filament - #if ENABLED(PRUSA_MMU2) - mmu2.load_filament_to_nozzle(target_extruder); - #else - constexpr float purge_length = ADVANCED_PAUSE_PURGE_LENGTH, - slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; - const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) - : fc_settings[active_extruder].load_length); - load_filament( - slow_load_length, fast_load_length, purge_length, - FILAMENT_CHANGE_ALERT_BEEPS, - true, // show_lcd - thermalManager.still_heating(target_extruder), // pause_for_user - PAUSE_MODE_LOAD_FILAMENT // pause_mode - #if ENABLED(DUAL_X_CARRIAGE) - , target_extruder // Dual X target - #endif - ); - #endif + constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; + const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) + : filament_change_load_length[active_extruder]); + load_filament(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, FILAMENT_CHANGE_ALERT_BEEPS, + true, thermalManager.wait_for_heating(target_extruder), ADVANCED_PAUSE_MODE_LOAD_FILAMENT); // Restore Z axis if (park_point.z > 0) - do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(MAX(current_position[Z_AXIS] - park_point.z, 0), NOZZLE_PARK_Z_FEEDRATE); - #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + #if EXTRUDERS > 1 // Restore toolhead if it was changed if (active_extruder_before_filament_change != active_extruder) - tool_change(active_extruder_before_filament_change, false); + tool_change(active_extruder_before_filament_change, 0, true); #endif - TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool - // Show status screen - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + #endif } /** * M702: Unload filament * - * T - Extruder number. Required for mixing extruder. - * For non-mixing, if omitted, current extruder + * T - Optional extruder number. If omitted, current extruder * (or ALL extruders with FILAMENT_UNLOAD_ALL_EXTRUDERS). * Z - Move the Z axis by this distance * U - Retract distance for removal (manual reload) @@ -145,98 +110,66 @@ void GcodeSuite::M701() { * Default values are used for omitted arguments. */ void GcodeSuite::M702() { - xyz_pos_t park_point = NOZZLE_PARK_POINT; + point_t park_point = NOZZLE_PARK_POINT; #if ENABLED(NO_MOTION_BEFORE_HOMING) - // Don't raise Z if the machine isn't homed - if (axes_should_home()) park_point.z = 0; + // Only raise Z if the machine is homed + if (axis_unhomed_error()) park_point.z = 0; #endif - #if ENABLED(MIXING_EXTRUDER) - const uint8_t old_mixing_tool = mixer.get_current_vtool(); - - #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) - float mix_multiplier = 1.0; - const bool seenT = parser.seenval('T'); - if (!seenT) { - mixer.T(MIXER_AUTORETRACT_TOOL); - mix_multiplier = MIXING_STEPPERS; - } - #else - constexpr bool seenT = true; - #endif - - if (seenT) { - const int8_t target_e_stepper = get_target_e_stepper_from_command(); - if (target_e_stepper < 0) return; - mixer.T(MIXER_DIRECT_SET_TOOL); - MIXER_STEPPER_LOOP(i) mixer.set_collector(i, (i == (uint8_t)target_e_stepper) ? 1.0 : 0.0); - mixer.normalize(); - } - - const int8_t target_extruder = active_extruder; - #else - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - #endif + if (get_target_extruder_from_command()) return; // Z axis lift if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); // Show initial "wait for unload" message - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder)); + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_UNLOAD, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, target_extruder); + #endif - #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + #if EXTRUDERS > 1 // Change toolhead if specified uint8_t active_extruder_before_filament_change = active_extruder; if (active_extruder != target_extruder) - tool_change(target_extruder, false); + tool_change(target_extruder, 0, true); #endif // Lift Z axis if (park_point.z > 0) - do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(MIN(current_position[Z_AXIS] + park_point.z, Z_MAX_POS), NOZZLE_PARK_Z_FEEDRATE); // Unload filament - #if ENABLED(PRUSA_MMU2) - mmu2.unload(); - #else - #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_UNLOAD_ALL_EXTRUDERS) - if (!parser.seenval('T')) { - HOTEND_LOOP() { - if (e != active_extruder) tool_change(e, false); - unload_filament(-fc_settings[e].unload_length, true, PAUSE_MODE_UNLOAD_FILAMENT); - } + #if EXTRUDERS > 1 && ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) + if (!parser.seenval('T')) { + HOTEND_LOOP() { + if (e != active_extruder) tool_change(e, 0, true); + unload_filament(-filament_change_unload_length[e], true, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT); } - else - #endif - { - // Unload length - const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) - : fc_settings[target_extruder].unload_length); - - unload_filament(unload_length, true, PAUSE_MODE_UNLOAD_FILAMENT - #if ALL(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) - , mix_multiplier - #endif - ); } + else #endif + { + // Unload length + const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) : + filament_change_unload_length[target_extruder]); + + unload_filament(unload_length, true, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT); + } // Restore Z axis if (park_point.z > 0) - do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + do_blocking_move_to_z(MAX(current_position[Z_AXIS] - park_point.z, 0), NOZZLE_PARK_Z_FEEDRATE); - #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + #if EXTRUDERS > 1 // Restore toolhead if it was changed if (active_extruder_before_filament_change != active_extruder) - tool_change(active_extruder_before_filament_change, false); + tool_change(active_extruder_before_filament_change, 0, true); #endif - TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool - // Show status screen - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); + #if ENABLED(ULTIPANEL) + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_STATUS); + #endif } #endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp deleted file mode 100644 index 7639ea962d..0000000000 --- a/Marlin/src/gcode/feature/power_monitor/M430.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_POWER_MONITOR - -#include "../../../feature/power_monitor.h" -#include "../../../MarlinCore.h" -#include "../../gcode.h" - -/** - * M430: Enable/disable current LCD display - * With no parameters report the system current draw (in Amps) - * - * I[bool] - Set Display of current on the LCD - * V[bool] - Set Display of voltage on the LCD - * W[bool] - Set Display of power on the LCD - */ -void GcodeSuite::M430() { - bool do_report = true; - #if HAS_WIRED_LCD - #if ENABLED(POWER_MONITOR_CURRENT) - if (parser.seen('I')) { power_monitor.set_current_display(parser.value_bool()); do_report = false; } - #endif - #if HAS_POWER_MONITOR_VREF - if (parser.seen('V')) { power_monitor.set_voltage_display(parser.value_bool()); do_report = false; } - #endif - #if HAS_POWER_MONITOR_WATTS - if (parser.seen('W')) { power_monitor.set_power_display(parser.value_bool()); do_report = false; } - #endif - #endif - if (do_report) { - SERIAL_ECHOLNPAIR( - #if ENABLED(POWER_MONITOR_CURRENT) - "Current: ", power_monitor.getAmps(), "A" - #if HAS_POWER_MONITOR_VREF - " " - #endif - #endif - #if HAS_POWER_MONITOR_VREF - "Voltage: ", power_monitor.getVolts(), "V" - #endif - #if HAS_POWER_MONITOR_WATTS - " Power: ", power_monitor.getPower(), "W" - #endif - ); - } -} - -#endif // HAS_POWER_MONITOR diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp deleted file mode 100644 index e9477dd2fb..0000000000 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - -#include "../../gcode.h" -#include "../../../feature/powerloss.h" -#include "../../../module/motion.h" -#include "../../../lcd/ultralcd.h" -#if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" -#endif - -#define DEBUG_OUT ENABLED(DEBUG_POWER_LOSS_RECOVERY) -#include "../../../core/debug_out.h" - -void menu_job_recovery(); - -inline void plr_error(PGM_P const prefix) { - #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - DEBUG_ECHO_START(); - serialprintPGM(prefix); - DEBUG_ECHOLNPGM(" Job Recovery Data"); - #else - UNUSED(prefix); - #endif -} - -#if HAS_LCD_MENU - void lcd_power_loss_recovery_cancel(); -#endif - -/** - * M1000: Resume from power-loss (undocumented) - * - With 'S' go to the Resume/Cancel menu - * - With no parameters, run recovery commands - */ -void GcodeSuite::M1000() { - - if (recovery.valid()) { - if (parser.seen('S')) { - #if HAS_LCD_MENU - ui.goto_screen(menu_job_recovery); - #elif ENABLED(DWIN_CREALITY_LCD) - recovery.dwin_flag = true; - #elif ENABLED(EXTENSIBLE_UI) - ExtUI::onPowerLossResume(); - #else - SERIAL_ECHO_MSG("Resume requires LCD."); - #endif - } - else if (parser.seen('C')) { - #if HAS_LCD_MENU - lcd_power_loss_recovery_cancel(); - #else - recovery.cancel(); - #endif - TERN_(EXTENSIBLE_UI, ExtUI::onPrintTimerStopped()); - } - else - recovery.resume(); - } - else - plr_error(recovery.info.valid_head ? PSTR("No") : PSTR("Invalid")); - -} - -#endif // POWER_LOSS_RECOVERY diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp deleted file mode 100644 index 3538ccaa6e..0000000000 --- a/Marlin/src/gcode/feature/powerloss/M413.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - -#include "../../gcode.h" -#include "../../../feature/powerloss.h" -#include "../../../module/motion.h" -#include "../../../lcd/ultralcd.h" - -/** - * M413: Enable / Disable power-loss recovery - * - * Parameters - * S[bool] - Flag to enable / disable. - * If omitted, report current state. - */ -void GcodeSuite::M413() { - - if (parser.seen('S')) - recovery.enable(parser.value_bool()); - else { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Power-loss recovery "); - serialprintln_onoff(recovery.enabled); - } - - #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - if (parser.seen("RL")) recovery.load(); - if (parser.seen('W')) recovery.save(true); - if (parser.seen('P')) recovery.purge(); - if (parser.seen('D')) recovery.debug(PSTR("M413")); - #if PIN_EXISTS(POWER_LOSS) - if (parser.seen('O')) recovery._outage(); - #endif - if (parser.seen('E')) serialprintPGM(recovery.exists() ? PSTR("PLR Exists\n") : PSTR("No PLR\n")); - if (parser.seen('V')) serialprintPGM(recovery.valid() ? PSTR("Valid\n") : PSTR("Invalid\n")); - #endif -} - -#endif // POWER_LOSS_RECOVERY diff --git a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp deleted file mode 100644 index 91e35dbf65..0000000000 --- a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(PRUSA_MMU2) - -#include "../../gcode.h" -#include "../../../feature/mmu2/mmu2.h" - -/** - * M403: Set filament type for MMU2 - * - * Valid filament type values: - * - * 0 Default - * 1 Flexible - * 2 PVA - */ -void GcodeSuite::M403() { - int8_t index = parser.intval('E', -1), - type = parser.intval('F', -1); - - if (WITHIN(index, 0, 4) && WITHIN(type, 0, 2)) - mmu2.set_filament_type(index, type); - else - SERIAL_ECHO_MSG("M403 - bad arguments."); -} - -#endif // PRUSA_MMU2 diff --git a/Marlin/src/gcode/feature/runout/M412.cpp b/Marlin/src/gcode/feature/runout/M412.cpp deleted file mode 100644 index 130f9c83e3..0000000000 --- a/Marlin/src/gcode/feature/runout/M412.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_FILAMENT_SENSOR - -#include "../../gcode.h" -#include "../../../feature/runout.h" - -/** - * M412: Enable / Disable filament runout detection - * - * Parameters - * R : Reset the runout sensor - * S : Reset and enable/disable the runout sensor - * H : Enable/disable host handling of filament runout - * D : Extra distance to continue after runout is triggered - */ -void GcodeSuite::M412() { - if (parser.seen("RS" - TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, "D") - TERN_(HOST_ACTION_COMMANDS, "H") - )) { - #if ENABLED(HOST_ACTION_COMMANDS) - if (parser.seen('H')) runout.host_handling = parser.value_bool(); - #endif - const bool seenR = parser.seen('R'), seenS = parser.seen('S'); - if (seenR || seenS) runout.reset(); - if (seenS) runout.enabled = parser.value_bool(); - #if HAS_FILAMENT_RUNOUT_DISTANCE - if (parser.seen('D')) runout.set_runout_distance(parser.value_linear_units()); - #endif - } - else { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Filament runout "); - serialprintln_onoff(runout.enabled); - #if HAS_FILAMENT_RUNOUT_DISTANCE - SERIAL_ECHOLNPAIR("Filament runout distance (mm): ", runout.runout_distance()); - #endif - } -} - -#endif // HAS_FILAMENT_SENSOR diff --git a/Marlin/src/gcode/feature/trinamic/M122.cpp b/Marlin/src/gcode/feature/trinamic/M122.cpp index 46e4365f38..42899613d3 100644 --- a/Marlin/src/gcode/feature/trinamic/M122.cpp +++ b/Marlin/src/gcode/feature/trinamic/M122.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,45 +16,25 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../inc/MarlinConfig.h" -#if HAS_TRINAMIC_CONFIG +#if ENABLED(TMC_DEBUG) #include "../../gcode.h" #include "../../../feature/tmc_util.h" -#include "../../../module/stepper/indirection.h" /** * M122: Debug TMC drivers */ void GcodeSuite::M122() { - xyze_bool_t print_axis = { false, false, false, false }; - bool print_all = true; - LOOP_XYZE(i) if (parser.seen(axis_codes[i])) { print_axis[i] = true; print_all = false; } - - if (print_all) LOOP_XYZE(i) print_axis[i] = true; - - if (parser.boolval('I')) restore_stepper_drivers(); - - #if ENABLED(TMC_DEBUG) - #if ENABLED(MONITOR_DRIVER_STATUS) - uint16_t interval = MONITOR_DRIVER_STATUS_INTERVAL_MS; - if (parser.seen('S') && !parser.value_bool()) interval = 0; - if (parser.seenval('P')) NOMORE(interval, parser.value_ushort()); - tmc_set_report_interval(interval); - #endif - - if (parser.seen('V')) - tmc_get_registers(print_axis.x, print_axis.y, print_axis.z, print_axis.e); - else - tmc_report_all(print_axis.x, print_axis.y, print_axis.z, print_axis.e); - #endif - - test_tmc_connection(print_axis.x, print_axis.y, print_axis.z, print_axis.e); + if (parser.seen('S')) + tmc_set_report_status(parser.value_bool()); + else + tmc_report_all(); } -#endif // HAS_TRINAMIC_CONFIG +#endif // TMC_DEBUG diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp deleted file mode 100644 index e72d03e767..0000000000 --- a/Marlin/src/gcode/feature/trinamic/M569.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_STEALTHCHOP - -#include "../../gcode.h" -#include "../../../feature/tmc_util.h" -#include "../../../module/stepper/indirection.h" - -template -void tmc_say_stealth_status(TMC &st) { - st.printLabel(); - SERIAL_ECHOPGM(" driver mode:\t"); - serialprintPGM(st.get_stealthChop_status() ? PSTR("stealthChop") : PSTR("spreadCycle")); - SERIAL_EOL(); -} -template -void tmc_set_stealthChop(TMC &st, const bool enable) { - st.stored.stealthChop_enabled = enable; - st.refresh_stepping_mode(); -} - -static void set_stealth_status(const bool enable, const int8_t target_extruder) { - #define TMC_SET_STEALTH(Q) tmc_set_stealthChop(stepper##Q, enable) - - #if AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(X2) \ - || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Y2) \ - || AXIS_HAS_STEALTHCHOP(Z) || AXIS_HAS_STEALTHCHOP(Z2) \ - || AXIS_HAS_STEALTHCHOP(Z3) || AXIS_HAS_STEALTHCHOP(Z4) - const uint8_t index = parser.byteval('I'); - #endif - - LOOP_XYZE(i) if (parser.seen(axis_codes[i])) { - switch (i) { - case X_AXIS: - #if AXIS_HAS_STEALTHCHOP(X) - if (index == 0) TMC_SET_STEALTH(X); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - if (index == 1) TMC_SET_STEALTH(X2); - #endif - break; - case Y_AXIS: - #if AXIS_HAS_STEALTHCHOP(Y) - if (index == 0) TMC_SET_STEALTH(Y); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - if (index == 1) TMC_SET_STEALTH(Y2); - #endif - break; - case Z_AXIS: - #if AXIS_HAS_STEALTHCHOP(Z) - if (index == 0) TMC_SET_STEALTH(Z); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - if (index == 1) TMC_SET_STEALTH(Z2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - if (index == 2) TMC_SET_STEALTH(Z3); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - if (index == 3) TMC_SET_STEALTH(Z4); - #endif - break; - case E_AXIS: { - if (target_extruder < 0) return; - switch (target_extruder) { - #if AXIS_HAS_STEALTHCHOP(E0) - case 0: TMC_SET_STEALTH(E0); break; - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - case 1: TMC_SET_STEALTH(E1); break; - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - case 2: TMC_SET_STEALTH(E2); break; - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - case 3: TMC_SET_STEALTH(E3); break; - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - case 4: TMC_SET_STEALTH(E4); break; - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - case 5: TMC_SET_STEALTH(E5); break; - #endif - #if AXIS_HAS_STEALTHCHOP(E6) - case 6: TMC_SET_STEALTH(E6); break; - #endif - #if AXIS_HAS_STEALTHCHOP(E7) - case 7: TMC_SET_STEALTH(E7); break; - #endif - } - } break; - } - } -} - -static void say_stealth_status() { - #define TMC_SAY_STEALTH_STATUS(Q) tmc_say_stealth_status(stepper##Q) - - #if AXIS_HAS_STEALTHCHOP(X) - TMC_SAY_STEALTH_STATUS(X); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - TMC_SAY_STEALTH_STATUS(X2); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - TMC_SAY_STEALTH_STATUS(Y); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - TMC_SAY_STEALTH_STATUS(Y2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - TMC_SAY_STEALTH_STATUS(Z); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - TMC_SAY_STEALTH_STATUS(Z2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - TMC_SAY_STEALTH_STATUS(Z3); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - TMC_SAY_STEALTH_STATUS(Z4); - #endif - #if AXIS_HAS_STEALTHCHOP(E0) - TMC_SAY_STEALTH_STATUS(E0); - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - TMC_SAY_STEALTH_STATUS(E1); - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - TMC_SAY_STEALTH_STATUS(E2); - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - TMC_SAY_STEALTH_STATUS(E3); - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - TMC_SAY_STEALTH_STATUS(E4); - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - TMC_SAY_STEALTH_STATUS(E5); - #endif - #if AXIS_HAS_STEALTHCHOP(E6) - TMC_SAY_STEALTH_STATUS(E6); - #endif - #if AXIS_HAS_STEALTHCHOP(E7) - TMC_SAY_STEALTH_STATUS(E7); - #endif -} - -/** - * M569: Enable stealthChop on an axis - * - * S[1|0] to enable or disable - * XYZE to target an axis - * No arguments reports the stealthChop status of all capable drivers. - */ -void GcodeSuite::M569() { - if (parser.seen('S')) - set_stealth_status(parser.value_bool(), get_target_extruder_from_command()); - else - say_stealth_status(); -} - -#endif // HAS_STEALTHCHOP diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index e834ebd67d..22d9a3f90a 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,42 +16,28 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../../inc/MarlinConfig.h" -#if HAS_TRINAMIC_CONFIG +#if HAS_TRINAMIC #include "../../gcode.h" #include "../../../feature/tmc_util.h" -#include "../../../module/stepper/indirection.h" +#include "../../../module/stepper_indirection.h" /** - * M906: Set motor current in milliamps. - * - * Parameters: - * X[current] - Set mA current for X driver(s) - * Y[current] - Set mA current for Y driver(s) - * Z[current] - Set mA current for Z driver(s) - * E[current] - Set mA current for E driver(s) - * - * I[index] - Axis sub-index (Omit or 0 for X, Y, Z; 1 for X2, Y2, Z2; 2 for Z3; 3 for Z4.) - * T[index] - Extruder index (Zero-based. Omit for E0 only.) - * - * With no parameters report driver currents. + * M906: Set motor current in milliamps using axis codes X, Y, Z, E + * Report driver currents when no axis specified */ void GcodeSuite::M906() { - #define TMC_SAY_CURRENT(Q) tmc_print_current(stepper##Q) - #define TMC_SET_CURRENT(Q) stepper##Q.rms_current(value) + #define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q, TMC_##Q) + #define TMC_SET_CURRENT(Q) tmc_set_current(stepper##Q, value) bool report = true; - - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) - const uint8_t index = parser.byteval('I'); - #endif - + const uint8_t index = parser.byteval('I'); LOOP_XYZE(i) if (uint16_t value = parser.intval(axis_codes[i])) { report = false; switch (i) { @@ -78,16 +64,9 @@ void GcodeSuite::M906() { #if AXIS_IS_TMC(Z2) if (index == 1) TMC_SET_CURRENT(Z2); #endif - #if AXIS_IS_TMC(Z3) - if (index == 2) TMC_SET_CURRENT(Z3); - #endif - #if AXIS_IS_TMC(Z4) - if (index == 3) TMC_SET_CURRENT(Z4); - #endif break; case E_AXIS: { - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; + if (get_target_extruder_from_command()) return; switch (target_extruder) { #if AXIS_IS_TMC(E0) case 0: TMC_SET_CURRENT(E0); break; @@ -104,15 +83,6 @@ void GcodeSuite::M906() { #if AXIS_IS_TMC(E4) case 4: TMC_SET_CURRENT(E4); break; #endif - #if AXIS_IS_TMC(E5) - case 5: TMC_SET_CURRENT(E5); break; - #endif - #if AXIS_IS_TMC(E6) - case 6: TMC_SET_CURRENT(E6); break; - #endif - #if AXIS_IS_TMC(E7) - case 7: TMC_SET_CURRENT(E7); break; - #endif } } break; } @@ -137,12 +107,6 @@ void GcodeSuite::M906() { #if AXIS_IS_TMC(Z2) TMC_SAY_CURRENT(Z2); #endif - #if AXIS_IS_TMC(Z3) - TMC_SAY_CURRENT(Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_SAY_CURRENT(Z4); - #endif #if AXIS_IS_TMC(E0) TMC_SAY_CURRENT(E0); #endif @@ -158,16 +122,7 @@ void GcodeSuite::M906() { #if AXIS_IS_TMC(E4) TMC_SAY_CURRENT(E4); #endif - #if AXIS_IS_TMC(E5) - TMC_SAY_CURRENT(E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_SAY_CURRENT(E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_SAY_CURRENT(E7); - #endif } } -#endif // HAS_TRINAMIC_CONFIG +#endif // HAS_TRINAMIC diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp deleted file mode 100644 index 8c840db5bf..0000000000 --- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp +++ /dev/null @@ -1,429 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfig.h" - -#if HAS_TRINAMIC_CONFIG - -#include "../../gcode.h" -#include "../../../feature/tmc_util.h" -#include "../../../module/stepper/indirection.h" -#include "../../../module/planner.h" -#include "../../queue.h" - -#if ENABLED(MONITOR_DRIVER_STATUS) - - #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2160) || AXIS_DRIVER_TYPE(ST, TMC2208) || AXIS_DRIVER_TYPE(ST, TMC2209) || AXIS_DRIVER_TYPE(ST, TMC2660) || AXIS_DRIVER_TYPE(ST, TMC5130) || AXIS_DRIVER_TYPE(ST, TMC5160)) - #define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N)) - - #define M91x_SOME_X (M91x_USE(X) || M91x_USE(X2)) - #define M91x_SOME_Y (M91x_USE(Y) || M91x_USE(Y2)) - #define M91x_SOME_Z (M91x_USE(Z) || M91x_USE(Z2) || M91x_USE(Z3) || M91x_USE(Z4)) - #define M91x_SOME_E (M91x_USE_E(0) || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4) || M91x_USE_E(5) || M91x_USE_E(6) || M91x_USE_E(7)) - - #if !M91x_SOME_X && !M91x_SOME_Y && !M91x_SOME_Z && !M91x_SOME_E - #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2660, 5130, or 5160." - #endif - - /** - * M911: Report TMC stepper driver overtemperature pre-warn flag - * This flag is held by the library, persisting until cleared by M912 - */ - void GcodeSuite::M911() { - #if M91x_USE(X) - tmc_report_otpw(stepperX); - #endif - #if M91x_USE(X2) - tmc_report_otpw(stepperX2); - #endif - #if M91x_USE(Y) - tmc_report_otpw(stepperY); - #endif - #if M91x_USE(Y2) - tmc_report_otpw(stepperY2); - #endif - #if M91x_USE(Z) - tmc_report_otpw(stepperZ); - #endif - #if M91x_USE(Z2) - tmc_report_otpw(stepperZ2); - #endif - #if M91x_USE(Z3) - tmc_report_otpw(stepperZ3); - #endif - #if M91x_USE(Z4) - tmc_report_otpw(stepperZ4); - #endif - #if M91x_USE_E(0) - tmc_report_otpw(stepperE0); - #endif - #if M91x_USE_E(1) - tmc_report_otpw(stepperE1); - #endif - #if M91x_USE_E(2) - tmc_report_otpw(stepperE2); - #endif - #if M91x_USE_E(3) - tmc_report_otpw(stepperE3); - #endif - #if M91x_USE_E(4) - tmc_report_otpw(stepperE4); - #endif - #if M91x_USE_E(5) - tmc_report_otpw(stepperE5); - #endif - #if M91x_USE_E(6) - tmc_report_otpw(stepperE6); - #endif - #if M91x_USE_E(7) - tmc_report_otpw(stepperE7); - #endif - } - - /** - * M912: Clear TMC stepper driver overtemperature pre-warn flag held by the library - * Specify one or more axes with X, Y, Z, X1, Y1, Z1, X2, Y2, Z2, Z3, Z4 and E[index]. - * If no axes are given, clear all. - * - * Examples: - * M912 X ; clear X and X2 - * M912 X1 ; clear X1 only - * M912 X2 ; clear X2 only - * M912 X E ; clear X, X2, and all E - * M912 E1 ; clear E1 only - */ - void GcodeSuite::M912() { - #if M91x_SOME_X - const bool hasX = parser.seen(axis_codes.x); - #else - constexpr bool hasX = false; - #endif - - #if M91x_SOME_Y - const bool hasY = parser.seen(axis_codes.y); - #else - constexpr bool hasY = false; - #endif - - #if M91x_SOME_Z - const bool hasZ = parser.seen(axis_codes.z); - #else - constexpr bool hasZ = false; - #endif - - #if M91x_SOME_E - const bool hasE = parser.seen(axis_codes.e); - #else - constexpr bool hasE = false; - #endif - - const bool hasNone = !hasX && !hasY && !hasZ && !hasE; - - #if M91x_SOME_X - const int8_t xval = int8_t(parser.byteval(axis_codes.x, 0xFF)); - #if M91x_USE(X) - if (hasNone || xval == 1 || (hasX && xval < 0)) tmc_clear_otpw(stepperX); - #endif - #if M91x_USE(X2) - if (hasNone || xval == 2 || (hasX && xval < 0)) tmc_clear_otpw(stepperX2); - #endif - #endif - - #if M91x_SOME_Y - const int8_t yval = int8_t(parser.byteval(axis_codes.y, 0xFF)); - #if M91x_USE(Y) - if (hasNone || yval == 1 || (hasY && yval < 0)) tmc_clear_otpw(stepperY); - #endif - #if M91x_USE(Y2) - if (hasNone || yval == 2 || (hasY && yval < 0)) tmc_clear_otpw(stepperY2); - #endif - #endif - - #if M91x_SOME_Z - const int8_t zval = int8_t(parser.byteval(axis_codes.z, 0xFF)); - #if M91x_USE(Z) - if (hasNone || zval == 1 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ); - #endif - #if M91x_USE(Z2) - if (hasNone || zval == 2 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ2); - #endif - #if M91x_USE(Z3) - if (hasNone || zval == 3 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ3); - #endif - #if M91x_USE(Z4) - if (hasNone || zval == 4 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ4); - #endif - #endif - - #if M91x_SOME_E - const int8_t eval = int8_t(parser.byteval(axis_codes.e, 0xFF)); - #if M91x_USE_E(0) - if (hasNone || eval == 0 || (hasE && eval < 0)) tmc_clear_otpw(stepperE0); - #endif - #if M91x_USE_E(1) - if (hasNone || eval == 1 || (hasE && eval < 0)) tmc_clear_otpw(stepperE1); - #endif - #if M91x_USE_E(2) - if (hasNone || eval == 2 || (hasE && eval < 0)) tmc_clear_otpw(stepperE2); - #endif - #if M91x_USE_E(3) - if (hasNone || eval == 3 || (hasE && eval < 0)) tmc_clear_otpw(stepperE3); - #endif - #if M91x_USE_E(4) - if (hasNone || eval == 4 || (hasE && eval < 0)) tmc_clear_otpw(stepperE4); - #endif - #if M91x_USE_E(5) - if (hasNone || eval == 5 || (hasE && eval < 0)) tmc_clear_otpw(stepperE5); - #endif - #if M91x_USE_E(6) - if (hasNone || eval == 6 || (hasE && eval < 0)) tmc_clear_otpw(stepperE6); - #endif - #if M91x_USE_E(7) - if (hasNone || eval == 7 || (hasE && eval < 0)) tmc_clear_otpw(stepperE7); - #endif - #endif - } - -#endif // MONITOR_DRIVER_STATUS - -/** - * M913: Set HYBRID_THRESHOLD speed. - */ -#if ENABLED(HYBRID_THRESHOLD) - void GcodeSuite::M913() { - #define TMC_SAY_PWMTHRS(A,Q) tmc_print_pwmthrs(stepper##Q) - #define TMC_SET_PWMTHRS(A,Q) stepper##Q.set_pwm_thrs(value) - #define TMC_SAY_PWMTHRS_E(E) tmc_print_pwmthrs(stepperE##E) - #define TMC_SET_PWMTHRS_E(E) stepperE##E.set_pwm_thrs(value) - - bool report = true; - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) - const uint8_t index = parser.byteval('I'); - #endif - LOOP_XYZE(i) if (int32_t value = parser.longval(axis_codes[i])) { - report = false; - switch (i) { - case X_AXIS: - #if AXIS_HAS_STEALTHCHOP(X) - if (index < 2) TMC_SET_PWMTHRS(X,X); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - if (!(index & 1)) TMC_SET_PWMTHRS(X,X2); - #endif - break; - case Y_AXIS: - #if AXIS_HAS_STEALTHCHOP(Y) - if (index < 2) TMC_SET_PWMTHRS(Y,Y); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - if (!(index & 1)) TMC_SET_PWMTHRS(Y,Y2); - #endif - break; - case Z_AXIS: - #if AXIS_HAS_STEALTHCHOP(Z) - if (index < 2) TMC_SET_PWMTHRS(Z,Z); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - if (index == 0 || index == 2) TMC_SET_PWMTHRS(Z,Z2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - if (index == 0 || index == 3) TMC_SET_PWMTHRS(Z,Z3); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - if (index == 0 || index == 4) TMC_SET_PWMTHRS(Z,Z4); - #endif - break; - case E_AXIS: { - #if E_STEPPERS - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - switch (target_extruder) { - #if AXIS_HAS_STEALTHCHOP(E0) - case 0: TMC_SET_PWMTHRS_E(0); break; - #endif - #if E_STEPPERS > 1 && AXIS_HAS_STEALTHCHOP(E1) - case 1: TMC_SET_PWMTHRS_E(1); break; - #endif - #if E_STEPPERS > 2 && AXIS_HAS_STEALTHCHOP(E2) - case 2: TMC_SET_PWMTHRS_E(2); break; - #endif - #if E_STEPPERS > 3 && AXIS_HAS_STEALTHCHOP(E3) - case 3: TMC_SET_PWMTHRS_E(3); break; - #endif - #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4) - case 4: TMC_SET_PWMTHRS_E(4); break; - #endif - #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5) - case 5: TMC_SET_PWMTHRS_E(5); break; - #endif - #if E_STEPPERS > 6 && AXIS_HAS_STEALTHCHOP(E6) - case 6: TMC_SET_PWMTHRS_E(6); break; - #endif - #if E_STEPPERS > 7 && AXIS_HAS_STEALTHCHOP(E7) - case 7: TMC_SET_PWMTHRS_E(7); break; - #endif - } - #endif // E_STEPPERS - } break; - } - } - - if (report) { - #if AXIS_HAS_STEALTHCHOP(X) - TMC_SAY_PWMTHRS(X,X); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - TMC_SAY_PWMTHRS(X,X2); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - TMC_SAY_PWMTHRS(Y,Y); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - TMC_SAY_PWMTHRS(Y,Y2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - TMC_SAY_PWMTHRS(Z,Z); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - TMC_SAY_PWMTHRS(Z,Z2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - TMC_SAY_PWMTHRS(Z,Z3); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - TMC_SAY_PWMTHRS(Z,Z4); - #endif - #if E_STEPPERS && AXIS_HAS_STEALTHCHOP(E0) - TMC_SAY_PWMTHRS_E(0); - #endif - #if E_STEPPERS > 1 && AXIS_HAS_STEALTHCHOP(E1) - TMC_SAY_PWMTHRS_E(1); - #endif - #if E_STEPPERS > 2 && AXIS_HAS_STEALTHCHOP(E2) - TMC_SAY_PWMTHRS_E(2); - #endif - #if E_STEPPERS > 3 && AXIS_HAS_STEALTHCHOP(E3) - TMC_SAY_PWMTHRS_E(3); - #endif - #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4) - TMC_SAY_PWMTHRS_E(4); - #endif - #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5) - TMC_SAY_PWMTHRS_E(5); - #endif - #if E_STEPPERS > 6 && AXIS_HAS_STEALTHCHOP(E6) - TMC_SAY_PWMTHRS_E(6); - #endif - #if E_STEPPERS > 7 && AXIS_HAS_STEALTHCHOP(E7) - TMC_SAY_PWMTHRS_E(7); - #endif - } - } -#endif // HYBRID_THRESHOLD - -/** - * M914: Set StallGuard sensitivity. - */ -#if USE_SENSORLESS - void GcodeSuite::M914() { - - bool report = true; - const uint8_t index = parser.byteval('I'); - LOOP_XYZ(i) if (parser.seen(XYZ_CHAR(i))) { - const int16_t value = parser.value_int(); - report = false; - switch (i) { - #if X_SENSORLESS - case X_AXIS: - #if AXIS_HAS_STALLGUARD(X) - if (index < 2) stepperX.homing_threshold(value); - #endif - #if AXIS_HAS_STALLGUARD(X2) - if (!(index & 1)) stepperX2.homing_threshold(value); - #endif - break; - #endif - #if Y_SENSORLESS - case Y_AXIS: - #if AXIS_HAS_STALLGUARD(Y) - if (index < 2) stepperY.homing_threshold(value); - #endif - #if AXIS_HAS_STALLGUARD(Y2) - if (!(index & 1)) stepperY2.homing_threshold(value); - #endif - break; - #endif - #if Z_SENSORLESS - case Z_AXIS: - #if AXIS_HAS_STALLGUARD(Z) - if (index < 2) stepperZ.homing_threshold(value); - #endif - #if AXIS_HAS_STALLGUARD(Z2) - if (index == 0 || index == 2) stepperZ2.homing_threshold(value); - #endif - #if AXIS_HAS_STALLGUARD(Z3) - if (index == 0 || index == 3) stepperZ3.homing_threshold(value); - #endif - #if AXIS_HAS_STALLGUARD(Z4) - if (index == 0 || index == 4) stepperZ4.homing_threshold(value); - #endif - break; - #endif - } - } - - if (report) { - #if X_SENSORLESS - #if AXIS_HAS_STALLGUARD(X) - tmc_print_sgt(stepperX); - #endif - #if AXIS_HAS_STALLGUARD(X2) - tmc_print_sgt(stepperX2); - #endif - #endif - #if Y_SENSORLESS - #if AXIS_HAS_STALLGUARD(Y) - tmc_print_sgt(stepperY); - #endif - #if AXIS_HAS_STALLGUARD(Y2) - tmc_print_sgt(stepperY2); - #endif - #endif - #if Z_SENSORLESS - #if AXIS_HAS_STALLGUARD(Z) - tmc_print_sgt(stepperZ); - #endif - #if AXIS_HAS_STALLGUARD(Z2) - tmc_print_sgt(stepperZ2); - #endif - #if AXIS_HAS_STALLGUARD(Z3) - tmc_print_sgt(stepperZ3); - #endif - #if AXIS_HAS_STALLGUARD(Z4) - tmc_print_sgt(stepperZ4); - #endif - #endif - } - } -#endif // USE_SENSORLESS - -#endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/gcode/feature/trinamic/M911-M915.cpp b/Marlin/src/gcode/feature/trinamic/M911-M915.cpp new file mode 100644 index 0000000000..6ba9ee5e99 --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M911-M915.cpp @@ -0,0 +1,364 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_TRINAMIC + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" +#include "../../../module/stepper_indirection.h" +#include "../../../module/planner.h" +#include "../../queue.h" + +#define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || (AXIS_DRIVER_TYPE(ST, TMC2208) && PIN_EXISTS(ST##_SERIAL_RX))) +#define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N)) + +/** + * M911: Report TMC stepper driver overtemperature pre-warn flag + * This flag is held by the library, persisting until cleared by M912 + */ +void GcodeSuite::M911() { + #if M91x_USE(X) + tmc_report_otpw(stepperX, TMC_X); + #endif + #if M91x_USE(X2) + tmc_report_otpw(stepperX2, TMC_X2); + #endif + #if M91x_USE(Y) + tmc_report_otpw(stepperY, TMC_Y); + #endif + #if M91x_USE(Y2) + tmc_report_otpw(stepperY2, TMC_Y2); + #endif + #if M91x_USE(Z) + tmc_report_otpw(stepperZ, TMC_Z); + #endif + #if M91x_USE(Z2) + tmc_report_otpw(stepperZ2, TMC_Z2); + #endif + #if M91x_USE_E(0) + tmc_report_otpw(stepperE0, TMC_E0); + #endif + #if M91x_USE_E(1) + tmc_report_otpw(stepperE1, TMC_E1); + #endif + #if M91x_USE_E(2) + tmc_report_otpw(stepperE2, TMC_E2); + #endif + #if M91x_USE_E(3) + tmc_report_otpw(stepperE3, TMC_E3); + #endif + #if M91x_USE_E(4) + tmc_report_otpw(stepperE4, TMC_E4); + #endif +} + +/** + * M912: Clear TMC stepper driver overtemperature pre-warn flag held by the library + * Specify one or more axes with X, Y, Z, X1, Y1, Z1, X2, Y2, Z2, and E[index]. + * If no axes are given, clear all. + * + * Examples: + * M912 X ; clear X and X2 + * M912 X1 ; clear X1 only + * M912 X2 ; clear X2 only + * M912 X E ; clear X, X2, and all E + * M912 E1 ; clear E1 only + */ +void GcodeSuite::M912() { + const bool hasX = parser.seen(axis_codes[X_AXIS]), + hasY = parser.seen(axis_codes[Y_AXIS]), + hasZ = parser.seen(axis_codes[Z_AXIS]), + hasE = parser.seen(axis_codes[E_AXIS]), + hasNone = !hasX && !hasY && !hasZ && !hasE; + + #if M91x_USE(X) || M91x_USE(X2) + const uint8_t xval = parser.byteval(axis_codes[X_AXIS], 10); + #if M91x_USE(X) + if (hasNone || xval == 1 || (hasX && xval == 10)) tmc_clear_otpw(stepperX, TMC_X); + #endif + #if M91x_USE(X2) + if (hasNone || xval == 2 || (hasX && xval == 10)) tmc_clear_otpw(stepperX2, TMC_X2); + #endif + #endif + + #if M91x_USE(Y) || M91x_USE(Y2) + const uint8_t yval = parser.byteval(axis_codes[Y_AXIS], 10); + #if M91x_USE(Y) + if (hasNone || yval == 1 || (hasY && yval == 10)) tmc_clear_otpw(stepperY, TMC_Y); + #endif + #if M91x_USE(Y2) + if (hasNone || yval == 2 || (hasY && yval == 10)) tmc_clear_otpw(stepperY2, TMC_Y2); + #endif + #endif + + #if M91x_USE(Z) || M91x_USE(Z2) + const uint8_t zval = parser.byteval(axis_codes[Z_AXIS], 10); + #if M91x_USE(Z) + if (hasNone || zval == 1 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ, TMC_Z); + #endif + #if M91x_USE(Z2) + if (hasNone || zval == 2 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ2, TMC_Z2); + #endif + #endif + + #if M91x_USE_E(0) || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4) + const uint8_t eval = parser.byteval(axis_codes[E_AXIS], 10); + #if M91x_USE_E(0) + if (hasNone || eval == 0 || (hasE && eval == 10)) tmc_clear_otpw(stepperE0, TMC_E0); + #endif + #if M91x_USE_E(1) + if (hasNone || eval == 1 || (hasE && eval == 10)) tmc_clear_otpw(stepperE1, TMC_E1); + #endif + #if M91x_USE_E(2) + if (hasNone || eval == 2 || (hasE && eval == 10)) tmc_clear_otpw(stepperE2, TMC_E2); + #endif + #if M91x_USE_E(3) + if (hasNone || eval == 3 || (hasE && eval == 10)) tmc_clear_otpw(stepperE3, TMC_E3); + #endif + #if M91x_USE_E(4) + if (hasNone || eval == 4 || (hasE && eval == 10)) tmc_clear_otpw(stepperE4, TMC_E4); + #endif + #endif +} + +/** + * M913: Set HYBRID_THRESHOLD speed. + */ +#if ENABLED(HYBRID_THRESHOLD) + void GcodeSuite::M913() { + #define TMC_SAY_PWMTHRS(A,Q) tmc_get_pwmthrs(stepper##Q, TMC_##Q, planner.axis_steps_per_mm[_AXIS(A)]) + #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, value, planner.axis_steps_per_mm[_AXIS(A)]) + #define TMC_SAY_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_get_pwmthrs(stepperE##E, TMC_E##E, planner.axis_steps_per_mm[E_AXIS_N]); }while(0) + #define TMC_SET_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_set_pwmthrs(stepperE##E, value, planner.axis_steps_per_mm[E_AXIS_N]); }while(0) + + bool report = true; + const uint8_t index = parser.byteval('I'); + LOOP_XYZE(i) if (int32_t value = parser.longval(axis_codes[i])) { + report = false; + switch (i) { + case X_AXIS: + #if AXIS_HAS_STEALTHCHOP(X) + if (index < 2) TMC_SET_PWMTHRS(X,X); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + if (!(index & 1)) TMC_SET_PWMTHRS(X,X2); + #endif + break; + case Y_AXIS: + #if AXIS_HAS_STEALTHCHOP(Y) + if (index < 2) TMC_SET_PWMTHRS(Y,Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + if (!(index & 1)) TMC_SET_PWMTHRS(Y,Y2); + #endif + break; + case Z_AXIS: + #if AXIS_HAS_STEALTHCHOP(Z) + if (index < 2) TMC_SET_PWMTHRS(Z,Z); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + if (!(index & 1)) TMC_SET_PWMTHRS(Z,Z2); + #endif + break; + case E_AXIS: { + if (get_target_extruder_from_command()) return; + switch (target_extruder) { + #if AXIS_HAS_STEALTHCHOP(E0) + case 0: TMC_SET_PWMTHRS_E(0); break; + #endif + #if E_STEPPERS > 1 && AXIS_HAS_STEALTHCHOP(E1) + case 1: TMC_SET_PWMTHRS_E(1); break; + #endif + #if E_STEPPERS > 2 && AXIS_HAS_STEALTHCHOP(E2) + case 2: TMC_SET_PWMTHRS_E(2); break; + #endif + #if E_STEPPERS > 3 && AXIS_HAS_STEALTHCHOP(E3) + case 3: TMC_SET_PWMTHRS_E(3); break; + #endif + #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4) + case 4: TMC_SET_PWMTHRS_E(4); break; + #endif + } + } break; + } + } + + if (report) { + #if AXIS_HAS_STEALTHCHOP(X) + TMC_SAY_PWMTHRS(X,X); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + TMC_SAY_PWMTHRS(X,X2); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + TMC_SAY_PWMTHRS(Y,Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + TMC_SAY_PWMTHRS(Y,Y2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + TMC_SAY_PWMTHRS(Z,Z); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + TMC_SAY_PWMTHRS(Z,Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + TMC_SAY_PWMTHRS_E(0); + #endif + #if E_STEPPERS > 1 && AXIS_HAS_STEALTHCHOP(E1) + TMC_SAY_PWMTHRS_E(1); + #endif + #if E_STEPPERS > 2 && AXIS_HAS_STEALTHCHOP(E2) + TMC_SAY_PWMTHRS_E(2); + #endif + #if E_STEPPERS > 3 && AXIS_HAS_STEALTHCHOP(E3) + TMC_SAY_PWMTHRS_E(3); + #endif + #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4) + TMC_SAY_PWMTHRS_E(4); + #endif + } + } +#endif // HYBRID_THRESHOLD + +/** + * M914: Set SENSORLESS_HOMING sensitivity. + */ +#if ENABLED(SENSORLESS_HOMING) + void GcodeSuite::M914() { + #define TMC_SAY_SGT(Q) tmc_get_sgt(stepper##Q, TMC_##Q) + #define TMC_SET_SGT(Q) tmc_set_sgt(stepper##Q, value) + + bool report = true; + const uint8_t index = parser.byteval('I'); + LOOP_XYZ(i) if (parser.seen(axis_codes[i])) { + const int8_t value = (int8_t)constrain(parser.value_int(), -64, 63); + report = false; + switch (i) { + #if X_SENSORLESS + case X_AXIS: + #if AXIS_HAS_STALLGUARD(X) + if (index < 2) TMC_SET_SGT(X); + #endif + #if AXIS_HAS_STALLGUARD(X2) + if (!(index & 1)) TMC_SET_SGT(X2); + #endif + break; + #endif + #if Y_SENSORLESS + case Y_AXIS: + #if AXIS_HAS_STALLGUARD(Y) + if (index < 2) TMC_SET_SGT(Y); + #endif + #if AXIS_HAS_STALLGUARD(Y2) + if (!(index & 1)) TMC_SET_SGT(Y2); + #endif + break; + #endif + #if Z_SENSORLESS + case Z_AXIS: + #if AXIS_HAS_STALLGUARD(Z) + if (index < 2) TMC_SET_SGT(Z); + #endif + #if AXIS_HAS_STALLGUARD(Z2) + if (!(index & 1)) TMC_SET_SGT(Z2); + #endif + break; + #endif + } + } + + if (report) { + #if X_SENSORLESS + #if AXIS_HAS_STALLGUARD(X) + TMC_SAY_SGT(X); + #endif + #if AXIS_HAS_STALLGUARD(X2) + TMC_SAY_SGT(X2); + #endif + #endif + #if Y_SENSORLESS + #if AXIS_HAS_STALLGUARD(Y) + TMC_SAY_SGT(Y); + #endif + #if AXIS_HAS_STALLGUARD(Y2) + TMC_SAY_SGT(Y2); + #endif + #endif + #if Z_SENSORLESS + #if AXIS_HAS_STALLGUARD(Z) + TMC_SAY_SGT(Z); + #endif + #if AXIS_HAS_STALLGUARD(Z2) + TMC_SAY_SGT(Z2); + #endif + #endif + } + } +#endif // SENSORLESS_HOMING + +/** + * TMC Z axis calibration routine + */ +#if ENABLED(TMC_Z_CALIBRATION) + void GcodeSuite::M915() { + const uint16_t _rms = parser.seenval('S') ? parser.value_int() : CALIBRATION_CURRENT, + _z = parser.seenval('Z') ? parser.value_linear_units() : CALIBRATION_EXTRA_HEIGHT; + + if (!TEST(axis_known_position, Z_AXIS)) { + SERIAL_ECHOLNPGM("\nPlease home Z axis first"); + return; + } + + #if AXIS_IS_TMC(Z) + const uint16_t Z_current_1 = stepperZ.getCurrent(); + stepperZ.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER); + #endif + #if AXIS_IS_TMC(Z2) + const uint16_t Z2_current_1 = stepperZ2.getCurrent(); + stepperZ2.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER); + #endif + + SERIAL_ECHOPAIR("\nCalibration current: Z", _rms); + + soft_endstops_enabled = false; + + do_blocking_move_to_z(Z_MAX_POS+_z); + + #if AXIS_IS_TMC(Z) + stepperZ.setCurrent(Z_current_1, R_SENSE, HOLD_MULTIPLIER); + #endif + #if AXIS_IS_TMC(Z2) + stepperZ2.setCurrent(Z2_current_1, R_SENSE, HOLD_MULTIPLIER); + #endif + + do_blocking_move_to_z(Z_MAX_POS); + soft_endstops_enabled = true; + + SERIAL_ECHOLNPGM("\nHoming Z because we lost steps"); + enqueue_and_echo_commands_P(PSTR("G28 Z")); + } +#endif + +#endif // HAS_TRINAMIC diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index f2bd81e670..7755a84b5f 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -28,10 +28,6 @@ #include "gcode.h" GcodeSuite gcode; -#if ENABLED(WIFI_CUSTOM_COMMAND) - extern bool wifi_custom_command(char * const command_ptr); -#endif - #include "parser.h" #include "queue.h" #include "../module/motion.h" @@ -40,46 +36,16 @@ GcodeSuite gcode; #include "../module/printcounter.h" #endif -#if ENABLED(HOST_PROMPT_SUPPORT) - #include "../feature/host_actions.h" +#if ENABLED(DIRECT_MIXING_IN_G1) + #include "../feature/mixing.h" #endif -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../sd/cardreader.h" - #include "../feature/powerloss.h" -#endif +#include "../Marlin.h" // for idle() and suspend_auto_report -#if ENABLED(CANCEL_OBJECTS) - #include "../feature/cancel_object.h" -#endif +uint8_t GcodeSuite::target_extruder; +millis_t GcodeSuite::previous_move_ms; -#if ENABLED(LASER_MOVE_POWER) - #include "../feature/spindle_laser.h" -#endif - -#if ENABLED(PASSWORD_FEATURE) - #include "../feature/password/password.h" -#endif - -#include "../MarlinCore.h" // for idle() - -// Inactivity shutdown -millis_t GcodeSuite::previous_move_ms = 0, - GcodeSuite::max_inactive_time = 0, - GcodeSuite::stepper_inactive_time = SEC_TO_MS(DEFAULT_STEPPER_DEACTIVE_TIME); - -// Relative motion mode for each logical axis -static constexpr xyze_bool_t ar_init = AXIS_RELATIVE_MODES; -uint8_t GcodeSuite::axis_relative = ( - (ar_init.x ? _BV(REL_X) : 0) - | (ar_init.y ? _BV(REL_Y) : 0) - | (ar_init.z ? _BV(REL_Z) : 0) - | (ar_init.e ? _BV(REL_E) : 0) -); - -#if EITHER(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE) - bool GcodeSuite::autoreport_paused; // = false -#endif +bool GcodeSuite::axis_relative_modes[] = AXIS_RELATIVE_MODES; #if ENABLED(HOST_KEEPALIVE_FEATURE) GcodeSuite::MarlinBusyState GcodeSuite::busy_state = NOT_BUSY; @@ -92,40 +58,30 @@ uint8_t GcodeSuite::axis_relative = ( #if ENABLED(CNC_COORDINATE_SYSTEMS) int8_t GcodeSuite::active_coordinate_system = -1; // machine space - xyz_pos_t GcodeSuite::coordinate_system[MAX_COORDINATE_SYSTEMS]; + float GcodeSuite::coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; #endif /** - * Get the target extruder from the T parameter or the active_extruder - * Return -1 if the T parameter is out of range + * Set target_extruder from the T parameter or the active_extruder + * + * Returns TRUE if the target is invalid */ -int8_t GcodeSuite::get_target_extruder_from_command() { +bool GcodeSuite::get_target_extruder_from_command() { if (parser.seenval('T')) { const int8_t e = parser.value_byte(); - if (e < EXTRUDERS) return e; - SERIAL_ECHO_START(); - SERIAL_CHAR('M'); SERIAL_ECHO(parser.codenum); - SERIAL_ECHOLNPAIR(" " STR_INVALID_EXTRUDER " ", int(e)); - return -1; + if (e >= EXTRUDERS) { + SERIAL_ECHO_START(); + SERIAL_CHAR('M'); + SERIAL_ECHO(parser.codenum); + SERIAL_ECHOLNPAIR(" " MSG_INVALID_EXTRUDER " ", e); + return true; + } + target_extruder = e; } - return active_extruder; -} - -/** - * Get the target e stepper from the T parameter - * Return -1 if the T parameter is out of range or unspecified - */ -int8_t GcodeSuite::get_target_e_stepper_from_command() { - const int8_t e = parser.intval('T', -1); - if (WITHIN(e, 0, E_STEPPERS - 1)) return e; - - SERIAL_ECHO_START(); - SERIAL_CHAR('M'); SERIAL_ECHO(parser.codenum); - if (e == -1) - SERIAL_ECHOLNPGM(" " STR_E_STEPPER_NOT_SPECIFIED); else - SERIAL_ECHOLNPAIR(" " STR_INVALID_E_STEPPER " ", int(e)); - return -1; + target_extruder = active_extruder; + + return false; } /** @@ -136,62 +92,28 @@ int8_t GcodeSuite::get_target_e_stepper_from_command() { * - Set the feedrate, if included */ void GcodeSuite::get_destination_from_command() { - xyze_bool_t seen = { false, false, false, false }; - - #if ENABLED(CANCEL_OBJECTS) - const bool &skip_move = cancelable.skipping; - #else - constexpr bool skip_move = false; - #endif - - // Get new XYZ position, whether absolute or relative - LOOP_XYZ(i) { - if ( (seen[i] = parser.seenval(XYZ_CHAR(i))) ) { + LOOP_XYZE(i) { + if (parser.seen(axis_codes[i])) { const float v = parser.value_axis_units((AxisEnum)i); - if (skip_move) - destination[i] = current_position[i]; - else - destination[i] = axis_is_relative(AxisEnum(i)) ? current_position[i] + v : LOGICAL_TO_NATIVE(v, i); + destination[i] = (axis_relative_modes[i] || relative_mode) + ? current_position[i] + v + : (i == E_AXIS) ? v : LOGICAL_TO_NATIVE(v, i); } else destination[i] = current_position[i]; } - // Get new E position, whether absolute or relative - if ( (seen.e = parser.seenval('E')) ) { - const float v = parser.value_axis_units(E_AXIS); - destination.e = axis_is_relative(E_AXIS) ? current_position.e + v : v; - } - else - destination.e = current_position.e; - - #if ENABLED(POWER_LOSS_RECOVERY) && !PIN_EXISTS(POWER_LOSS) - // Only update power loss recovery on moves with E - if (recovery.enabled && IS_SD_PRINTING() && seen.e && (seen.x || seen.y)) - recovery.save(); - #endif - if (parser.linearval('F') > 0) - feedrate_mm_s = parser.value_feedrate(); + feedrate_mm_s = MMM_TO_MMS(parser.value_feedrate()); #if ENABLED(PRINTCOUNTER) - if (!DEBUGGING(DRYRUN) && !skip_move) - print_job_timer.incFilamentUsed(destination.e - current_position.e); + if (!DEBUGGING(DRYRUN)) + print_job_timer.incFilamentUsed(destination[E_AXIS] - current_position[E_AXIS]); #endif // Get ABCDHI mixing factors - #if BOTH(MIXING_EXTRUDER, DIRECT_MIXING_IN_G1) - M165(); - #endif - - #if ENABLED(LASER_MOVE_POWER) - // Set the laser power in the planner to configure this move - if (parser.seen('S')) { - const float spwr = parser.value_float(); - cutter.inline_power(TERN(SPINDLE_LASER_PWM, cutter.power_to_range(cutter_power_t(round(spwr))), spwr > 0 ? 255 : 0)); - } - else if (ENABLED(LASER_MOVE_G0_OFF) && parser.codenum == 0) // G0 - cutter.set_inline_enabled(false); + #if ENABLED(MIXING_EXTRUDER) && ENABLED(DIRECT_MIXING_IN_G1) + gcode_get_mix(); #endif } @@ -207,7 +129,7 @@ void GcodeSuite::dwell(millis_t time) { * When G29_RETRY_AND_RECOVER is enabled, call G29() in * a loop with recovery and retry handling. */ -#if BOTH(HAS_LEVELING, G29_RETRY_AND_RECOVER) +#if HAS_LEVELING && ENABLED(G29_RETRY_AND_RECOVER) #ifndef G29_MAX_RETRIES #define G29_MAX_RETRIES 0 @@ -216,15 +138,27 @@ void GcodeSuite::dwell(millis_t time) { void GcodeSuite::G29_with_retry() { uint8_t retries = G29_MAX_RETRIES; while (G29()) { // G29 should return true for failed probes ONLY - if (retries--) event_probe_recover(); + if (retries--) { + #ifdef G29_ACTION_ON_RECOVER + SERIAL_ECHOLNPGM("//action:" G29_ACTION_ON_RECOVER); + #endif + #ifdef G29_RECOVER_COMMANDS + process_subcommands_now_P(PSTR(G29_RECOVER_COMMANDS)); + #endif + } else { - event_probe_failure(); + #ifdef G29_FAILURE_COMMANDS + process_subcommands_now_P(PSTR(G29_FAILURE_COMMANDS)); + #endif + #ifdef G29_ACTION_ON_FAILURE + SERIAL_ECHOLNPGM("//action:" G29_ACTION_ON_FAILURE); + #endif + #if ENABLED(G29_HALT_ON_FAILURE) + kill(PSTR(MSG_ERR_PROBING_FAILED)); + #endif return; } } - - TERN_(HOST_PROMPT_SUPPORT, host_action_prompt_end()); - #ifdef G29_SUCCESS_COMMANDS process_subcommands_now_P(PSTR(G29_SUCCESS_COMMANDS)); #endif @@ -236,32 +170,29 @@ void GcodeSuite::dwell(millis_t time) { // Placeholders for non-migrated codes // #if ENABLED(M100_FREE_MEMORY_WATCHER) - extern void M100_dump_routine(PGM_P const title, const char * const start, const char * const end); + extern void M100_dump_routine(const char * const title, const char *start, const char *end); #endif /** * Process the parsed command and dispatch it to its handler */ -void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { - KEEPALIVE_STATE(IN_HANDLER); - - /** - * Block all Gcodes except M511 Unlock Printer, if printer is locked - * Will still block Gcodes if M511 is disabled, in which case the printer should be unlocked via LCD Menu - */ - #if ENABLED(PASSWORD_FEATURE) - if (password.is_locked && !(parser.command_letter == 'M' && parser.codenum == 511)) { - SERIAL_ECHO_MSG(STR_PRINTER_LOCKED); - return; - } +void GcodeSuite::process_parsed_command( + #if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + const bool no_ok #endif +) { + KEEPALIVE_STATE(IN_HANDLER); // Handle a known G, M, or T switch (parser.command_letter) { case 'G': switch (parser.codenum) { - case 0: case 1: // G0: Fast Move, G1: Linear Move - G0_G1(TERN_(HAS_FAST_MOVES, parser.codenum == 0)); break; + case 0: case 1: G0_G1( // G0: Fast Move, G1: Linear Move + #if IS_SCARA + parser.codenum == 0 + #endif + ); + break; #if ENABLED(ARC_SUPPORT) && DISABLED(SCARA) case 2: case 3: G2_G3(parser.codenum == 2); break; // G2: CW ARC, G3: CCW ARC @@ -273,10 +204,6 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 5: G5(); break; // G5: Cubic B_spline #endif - #if ENABLED(DIRECT_STEPPING) - case 6: G6(); break; // G6: Direct Stepper Move - #endif - #if ENABLED(FWRETRACT) case 10: G10(); break; // G10: Retract / Swap Retract case 11: G11(); break; // G11: Recover / Swap Recover @@ -295,8 +222,6 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ENABLED(INCH_MODE_SUPPORT) case 20: G20(); break; // G20: Inch Mode case 21: G21(); break; // G21: MM Mode - #else - case 21: NOOP; break; // No error on unknown G21 #endif #if ENABLED(G26_MESH_VALIDATION) @@ -307,13 +232,17 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 27: G27(); break; // G27: Nozzle Park #endif - case 28: G28(); break; // G28: Home one or more axes + case 28: G28(false); break; // G28: Home all axes, one at a time #if HAS_LEVELING case 29: // G29: Bed leveling calibration - TERN(G29_RETRY_AND_RECOVER, G29_with_retry, G29)(); + #if ENABLED(G29_RETRY_AND_RECOVER) + G29_with_retry(); + #else + G29(); + #endif break; - #endif + #endif // HAS_LEVELING #if HAS_BED_PROBE case 30: G30(); break; // G30: Single Z probe @@ -327,46 +256,15 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 33: G33(); break; // G33: Delta Auto-Calibration #endif - #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) - case 34: G34(); break; // G34: Z Stepper automatic alignment using probe - #endif - - #if ENABLED(ASSISTED_TRAMMING) - case 35: G35(); break; // G35: Read four bed corners to help adjust bed screws - #endif - #if ENABLED(G38_PROBE_TARGET) - case 38: // G38.2, G38.3: Probe towards target - if (WITHIN(parser.subcode, 2, TERN(G38_PROBE_AWAY, 5, 3))) - G38(parser.subcode); // G38.4, G38.5: Probe away from target + case 38: // G38.2 & G38.3 + if (parser.subcode == 2 || parser.subcode == 3) + G38(parser.subcode == 2); break; #endif - #if ENABLED(CNC_COORDINATE_SYSTEMS) - case 53: G53(); break; // G53: (prefix) Apply native workspace - case 54: G54(); break; // G54: Switch to Workspace 1 - case 55: G55(); break; // G55: Switch to Workspace 2 - case 56: G56(); break; // G56: Switch to Workspace 3 - case 57: G57(); break; // G57: Switch to Workspace 4 - case 58: G58(); break; // G58: Switch to Workspace 5 - case 59: G59(); break; // G59.0 - G59.3: Switch to Workspace 6-9 - #endif - - #if SAVED_POSITIONS - case 60: G60(); break; // G60: save current position - case 61: G61(); break; // G61: Apply/restore saved coordinates. - #endif - - #if ENABLED(PROBE_TEMP_COMPENSATION) - case 76: G76(); break; // G76: Calibrate first layer compensation values - #endif - - #if ENABLED(GCODE_MOTION_MODES) - case 80: G80(); break; // G80: Reset the current motion mode - #endif - - case 90: set_relative_mode(false); break; // G90: Absolute Mode - case 91: set_relative_mode(true); break; // G91: Relative Mode + case 90: relative_mode = false; break; // G90: Relative Mode + case 91: relative_mode = true; break; // G91: Absolute Mode case 92: G92(); break; // G92: Set current axis position(s) @@ -374,55 +272,36 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 42: G42(); break; // G42: Coordinated move to a mesh point #endif - #if ENABLED(CALIBRATION_GCODE) - case 425: G425(); break; // G425: Perform calibration with calibration cube - #endif - #if ENABLED(DEBUG_GCODE_PARSER) case 800: parser.debug(); break; // G800: GCode Parser Test for G #endif - default: parser.unknown_command_warning(); break; + default: parser.unknown_command_error(); break; } break; case 'M': switch (parser.codenum) { - #if HAS_RESUME_CONTINUE case 0: // M0: Unconditional stop - Wait for user button press on LCD case 1: M0_M1(); break; // M1: Conditional stop - Wait for user button press on LCD #endif - #if HAS_CUTTER - case 3: M3_M4(false); break; // M3: Turn ON Laser | Spindle (clockwise), set Power | Speed - case 4: M3_M4(true ); break; // M4: Turn ON Laser | Spindle (counter-clockwise), set Power | Speed - case 5: M5(); break; // M5: Turn OFF Laser | Spindle - #endif - - #if ENABLED(COOLANT_CONTROL) - #if ENABLED(COOLANT_MIST) - case 7: M7(); break; // M7: Mist coolant ON - #endif - #if ENABLED(COOLANT_FLOOD) - case 8: M8(); break; // M8: Flood coolant ON - #endif - case 9: M9(); break; // M9: Coolant OFF + #if ENABLED(SPINDLE_LASER_ENABLE) + case 3: M3_M4(true ); break; // M3: turn spindle/laser on, set laser/spindle power/speed, set rotation direction CW + case 4: M3_M4(false); break; // M4: turn spindle/laser on, set laser/spindle power/speed, set rotation direction CCW + case 5: M5(); break; // M5 - turn spindle/laser off #endif #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) case 12: M12(); break; // M12: Synchronize and optionally force a CLC set #endif - #if ENABLED(EXPECTED_PRINTER_CHECK) - case 16: M16(); break; // M16: Expected printer check - #endif - case 17: M17(); break; // M17: Enable all stepper motors #if ENABLED(SDSUPPORT) - case 20: M20(); break; // M20: List SD card - case 21: M21(); break; // M21: Init SD card - case 22: M22(); break; // M22: Release SD card + case 20: M20(); break; // M20: list SD card + case 21: M21(); break; // M21: init SD card + case 22: M22(); break; // M22: release SD card case 23: M23(); break; // M23: Select file case 24: M24(); break; // M24: Start SD print case 25: M25(); break; // M25: Pause SD print @@ -437,7 +316,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 33: M33(); break; // M33: Get the long full path to a file or folder #endif - #if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) + #if ENABLED(SDCARD_SORT_ALPHA) && ENABLED(SDSORT_GCODE) case 34: M34(); break; // M34: Set SD card sorting options #endif @@ -445,10 +324,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #endif // SDSUPPORT case 31: M31(); break; // M31: Report time since the start of SD print or last M109 - - #if ENABLED(DIRECT_PIN_CONTROL) - case 42: M42(); break; // M42: Change pin state - #endif + case 42: M42(); break; // M42: Change pin state #if ENABLED(PINS_DEBUGGING) case 43: M43(); break; // M43: Read pin state @@ -458,7 +334,11 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 48: M48(); break; // M48: Z probe repeatability test #endif - #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + #if ENABLED(G26_MESH_VALIDATION) + case 49: M49(); break; // M49: Turn on or off G26 debug flag for verbose output + #endif + + #if ENABLED(ULTRA_LCD) && ENABLED(LCD_SET_PROGRESS_MANUALLY) case 73: M73(); break; // M73: Set progress percentage (for display on LCD) #endif @@ -473,31 +353,23 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ENABLED(M100_FREE_MEMORY_WATCHER) case 100: M100(); break; // M100: Free Memory Report #endif + case 101: M101(); break; // M101: RTOS Task Free Memory Report - #if EXTRUDERS - case 104: M104(); break; // M104: Set hot end temperature - case 109: M109(); break; // M109: Wait for hotend temperature to reach target - #endif - - case 105: M105(); return; // M105: Report Temperatures (and say "ok") - - #if HAS_FAN - case 106: M106(); break; // M106: Fan On - case 107: M107(); break; // M107: Fan Off + #if ENABLED(MAX7219_DEBUG) + case 102: M102(); break; // M102: Max7219 register re-initialization (for debugging) #endif + case 104: M104(); break; // M104: Set hot end temperature + case 109: M109(); break; // M109: Wait for hotend temperature to reach target case 110: M110(); break; // M110: Set Current Line Number case 111: M111(); break; // M111: Set debug level #if DISABLED(EMERGENCY_PARSER) case 108: M108(); break; // M108: Cancel Waiting - case 112: M112(); break; // M112: Full Shutdown + case 112: M112(); break; // M112: Emergency Stop case 410: M410(); break; // M410: Quickstop - Abort all the planned moves. - TERN_(HOST_PROMPT_SUPPORT, case 876:) // M876: Handle Host prompt responses #else - case 108: case 112: case 410: - TERN_(HOST_PROMPT_SUPPORT, case 876:) - break; + case 108: case 112: case 410: break; #endif #if ENABLED(HOST_KEEPALIVE_FEATURE) @@ -509,13 +381,15 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 190: M190(); break; // M190: Wait for bed temperature to reach target #endif - #if HAS_HEATED_CHAMBER - case 141: M141(); break; // M141: Set chamber temperature - case 191: M191(); break; // M191: Wait for chamber temperature to reach target + case 105: M105(); KEEPALIVE_STATE(NOT_BUSY); return; // M105: Report Temperatures (and say "ok") + + #if ENABLED(AUTO_REPORT_TEMPERATURES) && HAS_TEMP_SENSOR + case 155: M155(); break; // M155: Set temperature auto-report interval #endif - #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) - case 155: M155(); break; // M155: Set temperature auto-report interval + #if FAN_COUNT > 0 + case 106: M106(); break; // M106: Fan On + case 107: M107(); break; // M107: Fan Off #endif #if ENABLED(PARK_HEAD_ON_PAUSE) @@ -536,7 +410,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #endif #endif // BARICUDA - #if ENABLED(PSU_CONTROL) + #if HAS_POWER_SWITCH case 80: M80(); break; // M80: Turn on Power Supply #endif case 81: M81(); break; // M81: Turn off Power, including Power Supply, if possible @@ -554,7 +428,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 120: M120(); break; // M120: Enable endstops case 121: M121(); break; // M121: Disable endstops - #if PREHEAT_COUNT + #if ENABLED(ULTIPANEL) case 145: M145(); break; // M145: Set material heatup parameters #endif @@ -568,13 +442,12 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ENABLED(MIXING_EXTRUDER) case 163: M163(); break; // M163: Set a component weight for mixing extruder - case 164: M164(); break; // M164: Save current mix as a virtual extruder + #if MIXING_VIRTUAL_TOOLS > 1 + case 164: M164(); break; // M164: Save current mix as a virtual extruder + #endif #if ENABLED(DIRECT_MIXING_IN_G1) case 165: M165(); break; // M165: Set multiple mix weights #endif - #if ENABLED(GRADIENT_MIX) - case 166: M166(); break; // M166: Set Gradient Mix - #endif #endif #if DISABLED(NO_VOLUMETRICS) @@ -595,37 +468,31 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 206: M206(); break; // M206: Set home offsets #endif + #if ENABLED(DELTA) + case 665: M665(); break; // M665: Set delta configurations + #endif + + #if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + case 666: M666(); break; // M666: Set delta or dual endstop adjustment + #endif + #if ENABLED(FWRETRACT) case 207: M207(); break; // M207: Set Retract Length, Feedrate, and Z lift case 208: M208(); break; // M208: Set Recover (unretract) Additional Length and Feedrate - #if ENABLED(FWRETRACT_AUTORETRACT) - case 209: - if (MIN_AUTORETRACT <= MAX_AUTORETRACT) M209(); // M209: Turn Automatic Retract Detection on/off - break; - #endif + case 209: + if (MIN_AUTORETRACT <= MAX_AUTORETRACT) M209(); // M209: Turn Automatic Retract Detection on/off + break; #endif - #if HAS_SOFTWARE_ENDSTOPS - case 211: M211(); break; // M211: Enable, Disable, and/or Report software endstops - #endif + case 211: M211(); break; // M211: Enable, Disable, and/or Report software endstops - #if HAS_MULTI_EXTRUDER - case 217: M217(); break; // M217: Set filament swap parameters - #endif - - #if HAS_HOTEND_OFFSET + #if HOTENDS > 1 case 218: M218(); break; // M218: Set a tool offset #endif case 220: M220(); break; // M220: Set Feedrate Percentage: S ("FR" on your LCD) - - #if EXTRUDERS - case 221: M221(); break; // M221: Set Flow Percentage - #endif - - #if ENABLED(DIRECT_PIN_CONTROL) - case 226: M226(); break; // M226: Wait until a pin reaches a state - #endif + case 221: M221(); break; // M221: Set Flow Percentage + case 226: M226(); break; // M226: Wait until a pin reaches a state #if HAS_SERVOS case 280: M280(); break; // M280: Set servo position absolute @@ -650,8 +517,8 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 304: M304(); break; // M304: Set bed PID parameters #endif - #if ENABLED(PHOTO_GCODE) - case 240: M240(); break; // M240: Trigger a camera + #if defined(CHDK) || HAS_PHOTOGRAPH + case 240: M240(); break; // M240: Trigger a camera by emulating a Canon RC-1 : http://www.doc-diy.net/photo/rc-1_hacked/ #endif #if HAS_LCD_CONTRAST @@ -667,17 +534,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 302: M302(); break; // M302: Allow cold extrudes (set the minimum extrude temperature) #endif - #if HAS_PID_HEATING - case 303: M303(); break; // M303: PID autotune - #endif - - #if HAS_USER_THERMISTORS - case 305: M305(); break; // M305: Set user thermistor parameters - #endif - - #if ENABLED(REPETIER_GCODE_M360) - case 360: M360(); break; // M360: Firmware settings - #endif + case 303: M303(); break; // M303: PID autotune #if ENABLED(MORGAN_SCARA) case 360: if (M360()) return; break; // M360: SCARA Theta pos1 @@ -687,9 +544,9 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 364: if (M364()) return; break; // M364: SCARA Psi pos3 (90 deg to Theta) #endif - #if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) - case 380: M380(); break; // M380: Activate solenoid on active (or specified) extruder - case 381: M381(); break; // M381: Disable all solenoids or, if MANUAL_SOLENOID_CONTROL, active (or specified) solenoid + #if ENABLED(EXT_SOLENOID) + case 380: M380(); break; // M380: Activate solenoid on active extruder + case 381: M381(); break; // M381: Disable all solenoids #endif case 400: M400(); break; // M400: Finish all moves @@ -699,10 +556,6 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 402: M402(); break; // M402: Stow probe #endif - #if ENABLED(PRUSA_MMU2) - case 403: M403(); break; - #endif - #if ENABLED(FILAMENT_WIDTH_SENSOR) case 404: M404(); break; // M404: Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or display nominal filament width case 405: M405(); break; // M405: Turn on filament sensor for control @@ -710,10 +563,6 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 407: M407(); break; // M407: Display measured filament diameter #endif - #if HAS_FILAMENT_SENSOR - case 412: M412(); break; // M412: Enable/Disable filament runout detection - #endif - #if HAS_LEVELING case 420: M420(); break; // M420: Enable/Disable Bed Leveling #endif @@ -722,22 +571,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 421: M421(); break; // M421: Set a Mesh Bed Leveling Z coordinate #endif - #if ENABLED(BACKLASH_GCODE) - case 425: M425(); break; // M425: Tune backlash compensation - #endif - #if HAS_M206_COMMAND case 428: M428(); break; // M428: Apply current_position to home_offset #endif - #if HAS_POWER_MONITOR - case 430: M430(); break; // M430: Read the system current (A), voltage (V), and power (W) - #endif - - #if ENABLED(CANCEL_OBJECTS) - case 486: M486(); break; // M486: Identify and cancel objects - #endif - case 500: M500(); break; // M500: Store settings in EEPROM case 501: M501(); break; // M501: Read settings from EEPROM case 502: M502(); break; // M502: Revert to default settings @@ -748,64 +585,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 504: M504(); break; // M504: Validate EEPROM contents #endif - #if ENABLED(PASSWORD_FEATURE) - case 510: M510(); break; // M510: Lock Printer - #if ENABLED(PASSWORD_UNLOCK_GCODE) - case 511: M511(); break; // M511: Unlock Printer - #endif - #if ENABLED(PASSWORD_CHANGE_GCODE) - case 512: M512(); break; - #endif // M512: Set/Change/Remove Password - #endif - - #if ENABLED(SDSUPPORT) - case 524: M524(); break; // M524: Abort the current SD print job - #endif - - #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) + #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) case 540: M540(); break; // M540: Set abort on endstop hit for SD printing #endif - #if ENABLED(BAUD_RATE_GCODE) - case 575: M575(); break; // M575: Set serial baudrate - #endif - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - case 600: M600(); break; // M600: Pause for Filament Change - case 603: M603(); break; // M603: Configure Filament Change - #endif - - #if HAS_DUPLICATION_MODE - case 605: M605(); break; // M605: Set Dual X Carriage movement mode - #endif - - #if ENABLED(DELTA) - case 665: M665(); break; // M665: Set delta configurations - #endif - - #if ENABLED(DELTA) || HAS_EXTRA_ENDSTOPS - case 666: M666(); break; // M666: Set delta or multiple endstop adjustment - #endif - - #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) - case 672: M672(); break; // M672: Set/clear Duet Smart Effector sensitivity - #endif - - #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) - case 701: M701(); break; // M701: Load Filament - case 702: M702(); break; // M702: Unload Filament - #endif - - #if ENABLED(CONTROLLER_FAN_EDITABLE) - case 710: M710(); break; // M710: Set Controller Fan settings - #endif - - #if ENABLED(GCODE_MACROS) - case 810: case 811: case 812: case 813: case 814: - case 815: case 816: case 817: case 818: case 819: - M810_819(); break; // M810-M819: Define/execute G-code macro - #endif - #if HAS_BED_PROBE case 851: M851(); break; // M851: Set Z Probe Z Offset #endif @@ -814,50 +597,55 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 852: M852(); break; // M852: Set Skew factors #endif - #if ENABLED(PROBE_TEMP_COMPENSATION) - case 192: M192(); break; // M192: Wait for probe temp - case 871: M871(); break; // M871: Print/reset/clear first layer temperature offset values + #if ENABLED(ADVANCED_PAUSE_FEATURE) + case 600: M600(); break; // M600: Pause for Filament Change + case 603: M603(); break; // M603: Configure Filament Change + #endif + + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + case 605: M605(); break; // M605: Set Dual X Carriage movement mode + #endif + + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + case 701: M701(); break; // M701: Load Filament + case 702: M702(); break; // M702: Unload Filament + #endif + + #if ENABLED(MAX7219_GCODE) + case 7219: M7219(); break; // M7219: Set LEDs, columns, and rows #endif #if ENABLED(LIN_ADVANCE) case 900: M900(); break; // M900: Set advance K factor. #endif - #if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM || ENABLED(DIGIPOT_I2C) || ENABLED(DAC_STEPPER_CURRENT) case 907: M907(); break; // M907: Set digital trimpot motor current using axis codes. - #if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) + #if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) case 908: M908(); break; // M908: Control digital trimpot directly. - #if ENABLED(HAS_MOTOR_CURRENT_DAC) + #if ENABLED(DAC_STEPPER_CURRENT) case 909: M909(); break; // M909: Print digipot/DAC current value case 910: M910(); break; // M910: Commit digipot/DAC value to external EEPROM #endif #endif #endif - #if HAS_TRINAMIC_CONFIG - case 122: M122(); break; // M122: Report driver configuration and status + #if HAS_TRINAMIC + #if ENABLED(TMC_DEBUG) + case 122: M122(); break; + #endif case 906: M906(); break; // M906: Set motor current in milliamps using axis codes X, Y, Z, E - #if HAS_STEALTHCHOP - case 569: M569(); break; // M569: Enable stealthChop on an axis. - #endif - #if ENABLED(MONITOR_DRIVER_STATUS) - case 911: M911(); break; // M911: Report TMC2130 prewarn triggered flags - case 912: M912(); break; // M912: Clear TMC2130 prewarn triggered flags - #endif + case 911: M911(); break; // M911: Report TMC2130 prewarn triggered flags + case 912: M912(); break; // M912: Clear TMC2130 prewarn triggered flags #if ENABLED(HYBRID_THRESHOLD) case 913: M913(); break; // M913: Set HYBRID_THRESHOLD speed. #endif - #if USE_SENSORLESS - case 914: M914(); break; // M914: Set StallGuard sensitivity. + #if ENABLED(SENSORLESS_HOMING) + case 914: M914(); break; // M914: Set SENSORLESS_HOMING sensitivity. + #endif + #if ENABLED(TMC_Z_CALIBRATION) + case 915: M915(); break; // M915: TMC Z axis calibration. #endif - #endif - - #if HAS_L64XX - case 122: M122(); break; // M122: Report status - case 906: M906(); break; // M906: Set or get motor drive level - case 916: M916(); break; // M916: L6470 tuning: Increase drive level until thermal warning - case 917: M917(); break; // M917: L6470 tuning: Find minimum current thresholds - case 918: M918(); break; // M918: L6470 tuning: Increase speed until max or error #endif #if HAS_MICROSTEPS @@ -865,9 +653,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 351: M351(); break; // M351: Toggle MS1 MS2 pins directly, S# determines MS1 or MS2, X# sets the pin high/low. #endif - #if ENABLED(CASE_LIGHT_ENABLE) - case 355: M355(); break; // M355: Set case light brightness - #endif + case 355: M355(); break; // M355: Set case light brightness #if ENABLED(DEBUG_GCODE_PARSER) case 800: parser.debug(); break; // M800: GCode Parser Test for M @@ -886,60 +672,23 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 869: M869(); break; // M869: Report axis error #endif - #if ENABLED(MAGNETIC_PARKING_EXTRUDER) - case 951: M951(); break; // M951: Set Magnetic Parking Extruder parameters - #endif - - #if ENABLED(Z_STEPPER_AUTO_ALIGN) - case 422: M422(); break; // M422: Set Z Stepper automatic alignment position using probe - #endif - - #if ALL(HAS_SPI_FLASH, SDSUPPORT, MARLIN_DEV_MODE) - case 993: M993(); break; // M993: Backup SPI Flash to SD - case 994: M994(); break; // M994: Load a Backup from SD to SPI Flash - #endif - - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - case 995: M995(); break; // M995: Touch screen calibration for TFT display - #endif - - #if ENABLED(PLATFORM_M997_SUPPORT) - case 997: M997(); break; // M997: Perform in-application firmware update - #endif - case 999: M999(); break; // M999: Restart after being Stopped - #if ENABLED(POWER_LOSS_RECOVERY) - case 413: M413(); break; // M413: Enable/disable/query Power-Loss Recovery - case 1000: M1000(); break; // M1000: [INTERNAL] Resume from power-loss - #endif - - #if ENABLED(SDSUPPORT) - case 1001: M1001(); break; // M1001: [INTERNAL] Handle SD completion - #endif - - #if ENABLED(MAX7219_GCODE) - case 7219: M7219(); break; // M7219: Set LEDs, columns, and rows - #endif - - default: parser.unknown_command_warning(); break; + default: parser.unknown_command_error(); break; } break; case 'T': T(parser.codenum); break; // Tn: Tool Change - #if ENABLED(MARLIN_DEV_MODE) - case 'D': D(parser.codenum); break; // Dn: Debug codes - #endif - - default: - #if ENABLED(WIFI_CUSTOM_COMMAND) - if (wifi_custom_command(parser.command_ptr)) break; - #endif - parser.unknown_command_warning(); + default: parser.unknown_command_error(); } - if (!no_ok) queue.ok_to_send(); + KEEPALIVE_STATE(NOT_BUSY); + + #if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + if (!no_ok) + #endif + ok_to_send(); } /** @@ -947,20 +696,14 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { * This is called from the main loop() */ void GcodeSuite::process_next_command() { - char * const current_command = queue.command_buffer[queue.index_r]; - - PORT_REDIRECT(queue.port[queue.index_r]); - - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.queue_index_r = queue.index_r; - #endif + char * const current_command = command_queue[cmd_queue_index_r]; if (DEBUGGING(ECHO)) { SERIAL_ECHO_START(); SERIAL_ECHOLN(current_command); - #if ENABLED(M100_FREE_MEMORY_DUMPER) - SERIAL_ECHOPAIR("slot:", queue.index_r); - M100_dump_routine(PSTR(" Command Queue:"), &queue.command_buffer[0][0], &queue.command_buffer[BUFSIZE - 1][MAX_CMD_SIZE - 1]); + #if ENABLED(M100_FREE_MEMORY_WATCHER) + SERIAL_ECHOPAIR("slot:", cmd_queue_index_r); + M100_dump_routine(" Command Queue:", (const char*)command_queue, (const char*)(command_queue + sizeof(command_queue))); #endif } @@ -969,40 +712,35 @@ void GcodeSuite::process_next_command() { process_parsed_command(); } -/** - * Run a series of commands, bypassing the command queue to allow - * G-code "macros" to be called from within other G-code handlers. - */ +#if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + /** + * Run a series of commands, bypassing the command queue to allow + * G-code "macros" to be called from within other G-code handlers. + */ + void GcodeSuite::process_subcommands_now_P(const char *pgcode) { + // Save the parser state + char * const saved_cmd = parser.command_ptr; -void GcodeSuite::process_subcommands_now_P(PGM_P pgcode) { - char * const saved_cmd = parser.command_ptr; // Save the parser state - for (;;) { - PGM_P const delim = strchr_P(pgcode, '\n'); // Get address of next newline - const size_t len = delim ? delim - pgcode : strlen_P(pgcode); // Get the command length - char cmd[len + 1]; // Allocate a stack buffer - strncpy_P(cmd, pgcode, len); // Copy the command to the stack - cmd[len] = '\0'; // End with a nul - parser.parse(cmd); // Parse the command - process_parsed_command(true); // Process it - if (!delim) break; // Last command? - pgcode = delim + 1; // Get the next command - } - parser.parse(saved_cmd); // Restore the parser state -} + // Process individual commands in string + while (pgm_read_byte_near(pgcode)) { + // Break up string at '\n' delimiters + const char *delim = strchr_P(pgcode, '\n'); + size_t len = delim ? delim - pgcode : strlen_P(pgcode); + char cmd[len + 1]; + strncpy_P(cmd, pgcode, len); + cmd[len] = '\0'; + pgcode += len; + if (delim) pgcode++; -void GcodeSuite::process_subcommands_now(char * gcode) { - char * const saved_cmd = parser.command_ptr; // Save the parser state - for (;;) { - char * const delim = strchr(gcode, '\n'); // Get address of next newline - if (delim) *delim = '\0'; // Replace with nul - parser.parse(gcode); // Parse the current command - if (delim) *delim = '\n'; // Put back the newline - process_parsed_command(true); // Process it - if (!delim) break; // Last command? - gcode = delim + 1; // Get the next command + // Parse the next command in the string + parser.parse(cmd); + process_parsed_command(true); + } + + // Restore the parser state + parser.parse(saved_cmd); } - parser.parse(saved_cmd); // Restore the parser state -} +#endif #if ENABLED(HOST_KEEPALIVE_FEATURE) @@ -1013,24 +751,27 @@ void GcodeSuite::process_subcommands_now(char * gcode) { void GcodeSuite::host_keepalive() { const millis_t ms = millis(); static millis_t next_busy_signal_ms = 0; - if (!autoreport_paused && host_keepalive_interval && busy_state != NOT_BUSY) { + if (!suspend_auto_report && host_keepalive_interval && busy_state != NOT_BUSY) { if (PENDING(ms, next_busy_signal_ms)) return; switch (busy_state) { case IN_HANDLER: case IN_PROCESS: - SERIAL_ECHO_MSG(STR_BUSY_PROCESSING); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_BUSY_PROCESSING); break; case PAUSED_FOR_USER: - SERIAL_ECHO_MSG(STR_BUSY_PAUSED_FOR_USER); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_BUSY_PAUSED_FOR_USER); break; case PAUSED_FOR_INPUT: - SERIAL_ECHO_MSG(STR_BUSY_PAUSED_FOR_INPUT); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_BUSY_PAUSED_FOR_INPUT); break; default: break; } } - next_busy_signal_ms = ms + SEC_TO_MS(host_keepalive_interval); + next_busy_signal_ms = ms + host_keepalive_interval * 1000UL; } #endif // HOST_KEEPALIVE_FEATURE diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 3d745eff89..b050ec0348 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * gcode.h - Temporary container for all gcode handlers @@ -31,11 +30,11 @@ * ----------------- * * Helpful G-code references: - * - https://marlinfw.org/meta/gcode - * - https://reprap.org/wiki/G-code - * - https://linuxcnc.org/docs/html/gcode.html + * - http://linuxcnc.org/handbook/gcode/g-code.html + * - http://objects.reprap.org/wiki/Mendel_User_Manual:_RepRapGCodes * * Help to document Marlin's G-codes online: + * - http://reprap.org/wiki/G-code * - https://github.com/MarlinFirmware/MarlinDocumentation * * ----------------- @@ -64,14 +63,8 @@ * G31 - Dock sled (Z_PROBE_SLED only) * G32 - Undock sled (Z_PROBE_SLED only) * G33 - Delta Auto-Calibration (Requires DELTA_AUTO_CALIBRATION) - * G34 - Z Stepper automatic alignment using probe: I T A (Requires Z_STEPPER_AUTO_ALIGN) - * G35 - Read bed corners to help adjust bed screws: T (Requires ASSISTED_TRAMMING) * G38 - Probe in any direction using the Z_MIN_PROBE (Requires G38_PROBE_TARGET) * G42 - Coordinated move to a mesh point (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BLINEAR, or AUTO_BED_LEVELING_UBL) - * G60 - Save current position. (Requires SAVED_POSITIONS) - * G61 - Apply/restore saved coordinates. (Requires SAVED_POSITIONS) - * G76 - Calibrate first layer temperature offsets. (Requires PROBE_TEMP_COMPENSATION) - * G80 - Cancel current motion mode (Requires GCODE_MOTION_MODES) * G90 - Use Absolute Coordinates * G91 - Use Relative Coordinates * G92 - Set current position to coordinates given @@ -80,14 +73,10 @@ * * M0 - Unconditional stop - Wait for user to press a button on the LCD (Only if ULTRA_LCD is enabled) * M1 -> M0 - * M3 - Turn ON Laser | Spindle (clockwise), set Power | Speed. (Requires SPINDLE_FEATURE or LASER_FEATURE) - * M4 - Turn ON Laser | Spindle (counter-clockwise), set Power | Speed. (Requires SPINDLE_FEATURE or LASER_FEATURE) - * M5 - Turn OFF Laser | Spindle. (Requires SPINDLE_FEATURE or LASER_FEATURE) - * M7 - Turn mist coolant ON. (Requires COOLANT_CONTROL) - * M8 - Turn flood coolant ON. (Requires COOLANT_CONTROL) - * M9 - Turn coolant OFF. (Requires COOLANT_CONTROL) - * M12 - Set up closed loop control system. (Requires EXTERNAL_CLOSED_LOOP_CONTROLLER) - * M16 - Expected printer check. (Requires EXPECTED_PRINTER_CHECK) + * M3 - Turn laser/spindle on, set spindle/laser speed/power, set rotation to clockwise + * M4 - Turn laser/spindle on, set spindle/laser speed/power, set rotation to counter-clockwise + * M5 - Turn laser/spindle off + * M12 - Set up closed loop control system. More features coming soon. (Requires EXTERNAL_CLOSED_LOOP_CONTROLLER) * M17 - Enable/Power all stepper motors * M18 - Disable all stepper motors; same as M84 * M20 - List SD card. (Requires SDSUPPORT) @@ -109,34 +98,35 @@ * The '#' is necessary when calling from within sd files, as it stops buffer prereading * M33 - Get the longname version of a path. (Requires LONG_FILENAME_HOST_SUPPORT) * M34 - Set SD Card sorting options. (Requires SDCARD_SORT_ALPHA) - * M42 - Change pin status via gcode: M42 P S. LED pin assumed if P is omitted. (Requires DIRECT_PIN_CONTROL) + * M42 - Change pin status via gcode: M42 P S. LED pin assumed if P is omitted. * M43 - Display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins * M48 - Measure Z Probe repeatability: M48 P X Y V E L S. (Requires Z_MIN_PROBE_REPEATABILITY_TEST) - * M73 - Set the progress percentage. (Requires LCD_SET_PROGRESS_MANUALLY) * M75 - Start the print job timer. * M76 - Pause the print job timer. * M77 - Stop the print job timer. * M78 - Show statistical information about the print jobs. (Requires PRINTCOUNTER) - * M80 - Turn on Power Supply. (Requires PSU_CONTROL) - * M81 - Turn off Power Supply. (Requires PSU_CONTROL) + * M80 - Turn on Power Supply. (Requires POWER_SUPPLY > 0) + * M81 - Turn off Power Supply. (Requires POWER_SUPPLY > 0) * M82 - Set E codes absolute (default). * M83 - Set E codes relative while in Absolute (G90) mode. * M84 - Disable steppers until next move, or use S to specify an idle * duration after which steppers should turn off. S0 disables the timeout. * M85 - Set inactivity shutdown timer with parameter S. To disable set zero (default) - * M92 - Set planner.settings.axis_steps_per_mm for one or more axes. + * M92 - Set planner.axis_steps_per_mm for one or more axes. * M100 - Watch Free Memory (for debugging) (Requires M100_FREE_MEMORY_WATCHER) + * M101 - RTOS Task Free Memory report (for debugging) + * M102 - Max7219 re-initialization of setup registers (for debugging) * M104 - Set extruder target temp. * M105 - Report current temperatures. * M106 - Set print fan speed. * M107 - Print fan off. * M108 - Break out of heating loops (M109, M190, M303). With no controller, breaks out of M0/M1. (Requires EMERGENCY_PARSER) - * M109 - S Wait for extruder current temp to reach target temp. ** Wait only when heating! ** - * R Wait for extruder current temp to reach target temp. ** Wait for heating or cooling. ** + * M109 - Sxxx Wait for extruder current temp to reach target temp. Waits only when heating + * Rxxx Wait for extruder current temp to reach target temp. Waits when heating and cooling * If AUTOTEMP is enabled, S B F. Exit autotemp by any M109 without F * M110 - Set the current line number. (Used by host printing) * M111 - Set debug flags: "M111 S". See flag bits defined in enum.h. - * M112 - Full Shutdown. + * M112 - Emergency stop. * M113 - Get or set the timeout interval for Host Keepalive "busy" messages. (Requires HOST_KEEPALIVE_FEATURE) * M114 - Report current position. * M115 - Report capabilities. (Extended capabilities requires EXTENDED_CAPABILITIES_REPORT) @@ -145,24 +135,22 @@ * M119 - Report endstops status. * M120 - Enable endstops detection. * M121 - Disable endstops detection. - * M122 - Debug stepper (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) + * M122 - Debug stepper (Requires at least one _DRIVER_TYPE defined as TMC2130/TMC2208/TMC2660) * M125 - Save current position and move to filament change position. (Requires PARK_HEAD_ON_PAUSE) * M126 - Solenoid Air Valve Open. (Requires BARICUDA) * M127 - Solenoid Air Valve Closed. (Requires BARICUDA) * M128 - EtoP Open. (Requires BARICUDA) * M129 - EtoP Closed. (Requires BARICUDA) * M140 - Set bed target temp. S - * M141 - Set heated chamber target temp. S (Requires a chamber heater) * M145 - Set heatup values for materials on the LCD. H B F for S (0=PLA, 1=ABS) * M149 - Set temperature units. (Requires TEMPERATURE_UNITS_SUPPORT) - * M150 - Set Status LED Color as R U B W P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, PCA9533, or PCA9632). + * M150 - Set Status LED Color as R U B P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, or PCA9632). * M155 - Auto-report temperatures with interval of S. (Requires AUTO_REPORT_TEMPERATURES) * M163 - Set a single proportion for a mixing extruder. (Requires MIXING_EXTRUDER) - * M164 - Commit the mix and save to a virtual tool (current, or as specified by 'S'). (Requires MIXING_EXTRUDER) - * M165 - Set the mix for the mixing extruder (and current virtual tool) with parameters ABCDHI. (Requires MIXING_EXTRUDER and DIRECT_MIXING_IN_G1) - * M166 - Set the Gradient Mix for the mixing extruder. (Requires GRADIENT_MIX) - * M190 - S Wait for bed current temp to reach target temp. ** Wait only when heating! ** - * R Wait for bed current temp to reach target temp. ** Wait for heating or cooling. ** + * M164 - Save the mix as a virtual extruder. (Requires MIXING_EXTRUDER and MIXING_VIRTUAL_TOOLS) + * M165 - Set the proportions for a mixing extruder. Use parameters ABCDHI to set the mixing factors. (Requires MIXING_EXTRUDER) + * M190 - Sxxx Wait for bed current temp to reach target temp. ** Waits only when heating! ** + * Rxxx Wait for bed current temp to reach target temp. ** Waits for heating or cooling. ** * M200 - Set filament diameter, D, setting E axis units to cubic. (Use S0 to revert to linear units.) * M201 - Set max acceleration in units/s^2 for print moves: "M201 X Y Z E" * M202 - Set max acceleration in units/s^2 for travel moves: "M202 X Y Z E" ** UNUSED IN MARLIN! ** @@ -175,16 +163,14 @@ * M206 - Set additional homing offset. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) * M207 - Set Retract Length: S, Feedrate: F, and Z lift: Z. (Requires FWRETRACT) * M208 - Set Recover (unretract) Additional (!) Length: S and Feedrate: F. (Requires FWRETRACT) - * M209 - Turn Automatic Retract Detection on/off: S<0|1> (For slicers that don't support G10/11). (Requires FWRETRACT_AUTORETRACT) + * M209 - Turn Automatic Retract Detection on/off: S<0|1> (For slicers that don't support G10/11). (Requires FWRETRACT) Every normal extrude-only move will be classified as retract depending on the direction. * M211 - Enable, Disable, and/or Report software endstops: S<0|1> (Requires MIN_SOFTWARE_ENDSTOPS or MAX_SOFTWARE_ENDSTOPS) - * M217 - Set filament swap parameters: "M217 S P R". (Requires SINGLENOZZLE) * M218 - Set/get a tool offset: "M218 T X Y". (Requires 2 or more extruders) * M220 - Set Feedrate Percentage: "M220 S" (i.e., "FR" on the LCD) - * Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires PRUSA_MMU2) * M221 - Set Flow Percentage: "M221 S" - * M226 - Wait until a pin is in a given state: "M226 P S" (Requires DIRECT_PIN_CONTROL) - * M240 - Trigger a camera to take a photograph. (Requires PHOTO_GCODE) + * M226 - Wait until a pin is in a given state: "M226 P S" + * M240 - Trigger a camera to take a photograph. (Requires CHDK or PHOTOGRAPH_PIN) * M250 - Set LCD contrast: "M250 C" (0-63). (Requires LCD support) * M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS) * M261 - i2c Request Data (Requires EXPERIMENTAL_I2CBUS) @@ -196,7 +182,6 @@ * M302 - Allow cold extrudes, or set the minimum extrude S. (Requires PREVENT_COLD_EXTRUSION) * M303 - PID relay autotune S sets the target temperature. Default 150C. (Requires PIDTEMP) * M304 - Set bed PID parameters P I and D. (Requires PIDTEMPBED) - * M305 - Set user thermistor parameters R T and P. (Requires TEMP_SENSOR_x 1000) * M350 - Set microstepping mode. (Requires digital microstepping pins.) * M351 - Toggle MS1 MS2 pins directly. (Requires digital microstepping pins.) * M355 - Set Case Light on/off and set brightness. (Requires CASE_LIGHT_PIN) @@ -205,42 +190,27 @@ * M400 - Finish all moves. * M401 - Deploy and activate Z probe. (Requires a probe) * M402 - Deactivate and stow Z probe. (Requires a probe) - * M403 - Set filament type for PRUSA MMU2 * M404 - Display or set the Nominal Filament Width: "W". (Requires FILAMENT_WIDTH_SENSOR) * M405 - Enable Filament Sensor flow control. "M405 D". (Requires FILAMENT_WIDTH_SENSOR) * M406 - Disable Filament Sensor flow control. (Requires FILAMENT_WIDTH_SENSOR) * M407 - Display measured filament diameter in millimeters. (Requires FILAMENT_WIDTH_SENSOR) * M410 - Quickstop. Abort all planned moves. - * M412 - Enable / Disable Filament Runout Detection. (Requires FILAMENT_RUNOUT_SENSOR) - * M413 - Enable / Disable Power-Loss Recovery. (Requires POWER_LOSS_RECOVERY) * M420 - Enable/Disable Leveling (with current values) S1=enable S0=disable (Requires MESH_BED_LEVELING or ABL) * M421 - Set a single Z coordinate in the Mesh Leveling grid. X Y Z (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL) - * M422 - Set Z Stepper automatic alignment position using probe. X Y A (Requires Z_STEPPER_AUTO_ALIGN) - * M425 - Enable/Disable and tune backlash correction. (Requires BACKLASH_COMPENSATION and BACKLASH_GCODE) * M428 - Set the home_offset based on the current_position. Nearest edge applies. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) - * M430 - Read the system current, voltage, and power (Requires POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE, or POWER_MONITOR_FIXED_VOLTAGE) - * M486 - Identify and cancel objects. (Requires CANCEL_OBJECTS) * M500 - Store parameters in EEPROM. (Requires EEPROM_SETTINGS) * M501 - Restore parameters from EEPROM. (Requires EEPROM_SETTINGS) * M502 - Revert to the default "factory settings". ** Does not write them to EEPROM! ** * M503 - Print the current settings (in memory): "M503 S". S0 specifies compact output. - * M504 - Validate EEPROM contents. (Requires EEPROM_SETTINGS) - * M510 - Lock Printer - * M511 - Unlock Printer - * M512 - Set/Change/Remove Password - * M524 - Abort the current SD print job started with M24. (Requires SDSUPPORT) - * M540 - Enable/disable SD card abort on endstop hit: "M540 S". (Requires SD_ABORT_ON_ENDSTOP_HIT) - * M569 - Enable stealthChop on an axis. (Requires at least one _DRIVER_TYPE to be TMC2130/2160/2208/2209/5130/5160) + * M540 - Enable/disable SD card abort on endstop hit: "M540 S". (Requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) * M600 - Pause for filament change: "M600 X Y Z E L". (Requires ADVANCED_PAUSE_FEATURE) * M603 - Configure filament change: "M603 T U L". (Requires ADVANCED_PAUSE_FEATURE) * M605 - Set Dual X-Carriage movement mode: "M605 S [X] [R]". (Requires DUAL_X_CARRIAGE) * M665 - Set delta configurations: "M665 H L R S B X Y Z (Requires DELTA) - * M666 - Set/get offsets for delta (Requires DELTA) or dual endstops. (Requires [XYZ]_DUAL_ENDSTOPS) - * M672 - Set/Reset Duet Smart Effector's sensitivity. (Requires DUET_SMART_EFFECTOR and SMART_EFFECTOR_MOD_PIN) - * M701 - Load filament (Requires FILAMENT_LOAD_UNLOAD_GCODES) - * M702 - Unload filament (Requires FILAMENT_LOAD_UNLOAD_GCODES) - * M810-M819 - Define/execute a G-code macro (Requires GCODE_MACROS) - * M851 - Set Z probe's XYZ offsets in current units. (Negative values: X=left, Y=front, Z=below) + * M666 - Set/get offsets for delta (Requires DELTA) or dual endstops (Requires [XYZ]_DUAL_ENDSTOPS). + * M701 - Load filament (requires FILAMENT_LOAD_UNLOAD_GCODES) + * M702 - Unload filament (requires FILAMENT_LOAD_UNLOAD_GCODES) + * M851 - Set Z probe's Z offset in current units. (Negative = below the nozzle.) * M852 - Set skew factors: "M852 [I] [J] [K]". (Requires SKEW_CORRECTION_GCODE, and SKEW_CORRECTION_FOR_Z for IJ) * M860 - Report the position of position encoder modules. * M861 - Report the status of position encoder modules. @@ -252,24 +222,16 @@ * M867 - Enable/disable or toggle error correction for position encoder modules. * M868 - Report or set position encoder module error correction threshold. * M869 - Report position encoder module error. - * M871 - Print/reset/clear first layer temperature offset values. (Requires PROBE_TEMP_COMPENSATION) - * M192 - Wait for probe temp (Requires PROBE_TEMP_COMPENSATION) - * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER) * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) - * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/TMC2208/TMC2660) * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots) - * M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN) - * M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC) - * M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires HAS_MOTOR_CURRENT_DAC) - * M911 - Report stepper driver overtemperature pre-warn condition. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) - * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M908 - Control digital trimpot directly. (Requires DAC_STEPPER_CURRENT or DIGIPOTSS_PIN) + * M909 - Print digipot/DAC current value. (Requires DAC_STEPPER_CURRENT) + * M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires DAC_STEPPER_CURRENT) + * M911 - Report stepper driver overtemperature pre-warn condition. (Requires at least one _DRIVER_TYPE defined as TMC2130/TMC2208/TMC2660) + * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires at least one _DRIVER_TYPE defined as TMC2130/TMC2208/TMC2660) * M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD) - * M914 - Set StallGuard sensitivity. (Requires SENSORLESS_HOMING or SENSORLESS_PROBING) - * M916 - L6470 tuning: Increase KVAL_HOLD until thermal warning. (Requires at least one _DRIVER_TYPE L6470) - * M917 - L6470 tuning: Find minimum current thresholds. (Requires at least one _DRIVER_TYPE L6470) - * M918 - L6470 tuning: Increase speed until max or error. (Requires at least one _DRIVER_TYPE L6470) - * M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER) - * M7219 - Control Max7219 Matrix LEDs. (Requires MAX7219_GCODE) + * M914 - Set SENSORLESS_HOMING sensitivity. (Requires SENSORLESS_HOMING) * * M360 - SCARA calibration: Move to cal-position ThetaA (0 deg calibration) * M361 - SCARA calibration: Move to cal-position ThetaB (90 deg calibration - steps per degree) @@ -278,56 +240,33 @@ * M364 - SCARA calibration: Move to cal-position PSIC (90 deg to Theta calibration position) * * ************ Custom codes - This can change to suit future G-code regulations - * G425 - Calibrate using a conductive object. (Requires CALIBRATION_GCODE) * M928 - Start SD logging: "M928 filename.gco". Stop with M29. (Requires SDSUPPORT) - * M993 - Backup SPI Flash to SD - * M994 - Load a Backup from SD to SPI Flash - * M995 - Touch screen calibration for TFT display - * M997 - Perform in-application firmware update * M999 - Restart after being stopped by error - * D... - Custom Development G-code. Add hooks to 'gcode_D.cpp' for developers to test features. (Requires MARLIN_DEV_MODE) * * "T" Codes * * T0-T3 - Select an extruder (tool) by index: "T F" + * */ +#ifndef _GCODE_H_ +#define _GCODE_H_ + #include "../inc/MarlinConfig.h" #include "parser.h" #if ENABLED(I2C_POSITION_ENCODERS) - #include "../feature/encoder_i2c.h" + #include "../feature/I2CPositionEncoder.h" #endif -#if IS_SCARA || defined(G0_FEEDRATE) - #define HAS_FAST_MOVES 1 -#endif - -enum AxisRelative : uint8_t { REL_X, REL_Y, REL_Z, REL_E, E_MODE_ABS, E_MODE_REL }; - class GcodeSuite { public: - static uint8_t axis_relative; + GcodeSuite() {} - static inline bool axis_is_relative(const AxisEnum a) { - if (a == E_AXIS) { - if (TEST(axis_relative, E_MODE_REL)) return true; - if (TEST(axis_relative, E_MODE_ABS)) return false; - } - return TEST(axis_relative, a); - } - static inline void set_relative_mode(const bool rel) { - axis_relative = rel ? _BV(REL_X) | _BV(REL_Y) | _BV(REL_Z) | _BV(REL_E) : 0; - } - static inline void set_e_relative() { - CBI(axis_relative, E_MODE_ABS); - SBI(axis_relative, E_MODE_REL); - } - static inline void set_e_absolute() { - CBI(axis_relative, E_MODE_REL); - SBI(axis_relative, E_MODE_ABS); - } + static uint8_t target_extruder; + + static bool axis_relative_modes[]; #if ENABLED(CNC_WORKSPACE_PLANES) /** @@ -341,45 +280,37 @@ public: #define MAX_COORDINATE_SYSTEMS 9 #if ENABLED(CNC_COORDINATE_SYSTEMS) static int8_t active_coordinate_system; - static xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; + static float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; static bool select_coordinate_system(const int8_t _new); #endif - static millis_t previous_move_ms, max_inactive_time, stepper_inactive_time; - FORCE_INLINE static void reset_stepper_timeout(const millis_t ms=millis()) { previous_move_ms = ms; } - FORCE_INLINE static bool stepper_max_timed_out(const millis_t ms=millis()) { - return max_inactive_time && ELAPSED(ms, previous_move_ms + max_inactive_time); - } - FORCE_INLINE static bool stepper_inactive_timeout(const millis_t ms=millis()) { - return ELAPSED(ms, previous_move_ms + stepper_inactive_time); - } + static millis_t previous_move_ms; + FORCE_INLINE static void reset_stepper_timeout() { previous_move_ms = millis(); } - static int8_t get_target_extruder_from_command(); - static int8_t get_target_e_stepper_from_command(); + static bool get_target_extruder_from_command(); static void get_destination_from_command(); - - static void process_parsed_command(const bool no_ok=false); + static void process_parsed_command( + #if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + const bool no_ok = false + #endif + ); static void process_next_command(); - // Execute G-code in-place, preserving current G-code parameters - static void process_subcommands_now_P(PGM_P pgcode); - static void process_subcommands_now(char * gcode); + #if ENABLED(USE_EXECUTE_COMMANDS_IMMEDIATE) + static void process_subcommands_now_P(const char *pgcode); + #endif - static inline void home_all_axes() { - extern const char G28_STR[]; - process_subcommands_now_P(G28_STR); - } + FORCE_INLINE static void home_all_axes() { G28(true); } - #if EITHER(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE) - static bool autoreport_paused; - static inline bool set_autoreport_paused(const bool p) { - const bool was = autoreport_paused; - autoreport_paused = p; - return was; - } + /** + * Multi-stepper support for M92, M201, M203 + */ + #if ENABLED(DISTINCT_E_FACTORS) + #define GET_TARGET_EXTRUDER() if (gcode.get_target_extruder_from_command()) return + #define TARGET_EXTRUDER gcode.target_extruder #else - static constexpr bool autoreport_paused = false; - static inline bool set_autoreport_paused(const bool) { return false; } + #define GET_TARGET_EXTRUDER() NOOP + #define TARGET_EXTRUDER 0 #endif #if ENABLED(HOST_KEEPALIVE_FEATURE) @@ -400,33 +331,43 @@ public: static void host_keepalive(); - #define KEEPALIVE_STATE(N) REMEMBER(_KA_, gcode.busy_state, gcode.N) + #define KEEPALIVE_STATE(n) gcode.busy_state = gcode.n #else - #define KEEPALIVE_STATE(N) NOOP + #define KEEPALIVE_STATE(n) NOOP + #endif + + #if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT) && HAS_RESUME_CONTINUE + static bool lights_off_after_print; #endif static void dwell(millis_t time); private: - TERN_(MARLIN_DEV_MODE, static void D(const int16_t dcode)); + static void G0_G1( + #if IS_SCARA + bool fast_move=false + #endif + ); - static void G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move=false)); - - TERN_(ARC_SUPPORT, static void G2_G3(const bool clockwise)); + #if ENABLED(ARC_SUPPORT) + static void G2_G3(const bool clockwise); + #endif static void G4(); - TERN_(BEZIER_CURVE_SUPPORT, static void G5()); - - TERN_(DIRECT_STEPPING, static void G6()); + #if ENABLED(BEZIER_CURVE_SUPPORT) + static void G5(); + #endif #if ENABLED(FWRETRACT) static void G10(); static void G11(); #endif - TERN_(NOZZLE_CLEAN_FEATURE, static void G12()); + #if ENABLED(NOZZLE_CLEAN_FEATURE) + static void G12(); + #endif #if ENABLED(CNC_WORKSPACE_PLANES) static void G17(); @@ -439,11 +380,15 @@ private: static void G21(); #endif - TERN_(G26_MESH_VALIDATION, static void G26()); + #if ENABLED(G26_MESH_VALIDATION) + static void G26(); + #endif - TERN_(NOZZLE_PARK_FEATURE, static void G27()); + #if ENABLED(NOZZLE_PARK_FEATURE) + static void G27(); + #endif - static void G28(); + static void G28(const bool always_home_all); #if HAS_LEVELING #if ENABLED(G29_RETRY_AND_RECOVER) @@ -463,19 +408,17 @@ private: #endif #endif - TERN_(DELTA_AUTO_CALIBRATION, static void G33()); - - #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) - static void G34(); + #if ENABLED(DELTA_AUTO_CALIBRATION) + static void G33(); #endif - TERN_(Z_STEPPER_AUTO_ALIGN, static void M422()); + #if ENABLED(G38_PROBE_TARGET) + static void G38(const bool is_38_2); + #endif - TERN_(ASSISTED_TRAMMING, static void G35()); - - TERN_(G38_PROBE_TARGET, static void G38(const int8_t subcode)); - - TERN_(HAS_MESH, static void G42()); + #if HAS_MESH + static void G42(); + #endif #if ENABLED(CNC_COORDINATE_SYSTEMS) static void G53(); @@ -487,36 +430,21 @@ private: static void G59(); #endif - TERN_(PROBE_TEMP_COMPENSATION, static void G76()); - - #if SAVED_POSITIONS - static void G60(); - static void G61(); - #endif - - TERN_(GCODE_MOTION_MODES, static void G80()); - static void G92(); - TERN_(CALIBRATION_GCODE, static void G425()); + #if HAS_RESUME_CONTINUE + static void M0_M1(); + #endif - TERN_(HAS_RESUME_CONTINUE, static void M0_M1()); - - #if HAS_CUTTER - static void M3_M4(const bool is_M4); + #if ENABLED(SPINDLE_LASER_ENABLE) + static void M3_M4(bool is_M3); static void M5(); #endif - #if ENABLED(COOLANT_CONTROL) - TERN_(COOLANT_MIST, static void M7()); - TERN_(COOLANT_FLOOD, static void M8()); - static void M9(); + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + static void M12(); #endif - TERN_(EXTERNAL_CLOSED_LOOP_CONTROLLER, static void M12()); - - TERN_(EXPECTED_PRINTER_CHECK, static void M16()); - static void M17(); static void M18_M84(); @@ -539,26 +467,43 @@ private: #if ENABLED(SDSUPPORT) static void M32(); - TERN_(LONG_FILENAME_HOST_SUPPORT, static void M33()); - #if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + static void M33(); + #endif + #if ENABLED(SDCARD_SORT_ALPHA) && ENABLED(SDSORT_GCODE) static void M34(); #endif #endif - TERN_(DIRECT_PIN_CONTROL, static void M42()); - TERN_(PINS_DEBUGGING, static void M43()); + static void M42(); - TERN_(Z_MIN_PROBE_REPEATABILITY_TEST, static void M48()); + #if ENABLED(PINS_DEBUGGING) + static void M43(); + #endif - TERN_(LCD_SET_PROGRESS_MANUALLY, static void M73()); + #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) + static void M48(); + #endif + + #if ENABLED(G26_MESH_VALIDATION) + static void M49(); + #endif + + #if ENABLED(ULTRA_LCD) && ENABLED(LCD_SET_PROGRESS_MANUALLY) + static void M73(); + #endif static void M75(); static void M76(); static void M77(); - TERN_(PRINTCOUNTER, static void M78()); + #if ENABLED(PRINTCOUNTER) + static void M78(); + #endif - TERN_(PSU_CONTROL, static void M80()); + #if HAS_POWER_SWITCH + static void M80(); + #endif static void M81(); static void M82(); @@ -566,31 +511,35 @@ private: static void M85(); static void M92(); - TERN_(M100_FREE_MEMORY_WATCHER, static void M100()); - - #if EXTRUDERS - static void M104(); - static void M109(); + #if ENABLED(M100_FREE_MEMORY_WATCHER) + static void M100(); #endif + static void M101(); + + #if ENABLED(MAX7219_DEBUG) + static void M102(); + #endif + + static void M104(); static void M105(); - - #if HAS_FAN - static void M106(); - static void M107(); - #endif + static void M106(); + static void M107(); #if DISABLED(EMERGENCY_PARSER) static void M108(); static void M112(); static void M410(); - TERN_(HOST_PROMPT_SUPPORT, static void M876()); #endif + static void M109(); + static void M110(); static void M111(); - TERN_(HOST_KEEPALIVE_FEATURE, static void M113()); + #if ENABLED(HOST_KEEPALIVE_FEATURE) + static void M113(); + #endif static void M114(); static void M115(); @@ -600,7 +549,9 @@ private: static void M120(); static void M121(); - TERN_(PARK_HEAD_ON_PAUSE, static void M125()); + #if ENABLED(PARK_HEAD_ON_PAUSE) + static void M125(); + #endif #if ENABLED(BARICUDA) #if HAS_HEATER_1 @@ -618,28 +569,30 @@ private: static void M190(); #endif - #if HAS_HEATED_CHAMBER - static void M141(); - static void M191(); - #endif - - #if PREHEAT_COUNT + #if ENABLED(ULTIPANEL) static void M145(); #endif - TERN_(TEMPERATURE_UNITS_SUPPORT, static void M149()); + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + static void M149(); + #endif - TERN_(HAS_COLOR_LEDS, static void M150()); + #if HAS_COLOR_LEDS + static void M150(); + #endif - #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) + #if ENABLED(AUTO_REPORT_TEMPERATURES) && HAS_TEMP_SENSOR static void M155(); #endif #if ENABLED(MIXING_EXTRUDER) static void M163(); - static void M164(); - TERN_(DIRECT_MIXING_IN_G1, static void M165()); - TERN_(GRADIENT_MIX, static void M166()); + #if MIXING_VIRTUAL_TOOLS > 1 + static void M164(); + #endif + #if ENABLED(DIRECT_MIXING_IN_G1) + static void M165(); + #endif #endif static void M200(); @@ -653,31 +606,33 @@ private: static void M204(); static void M205(); - TERN_(HAS_M206_COMMAND, static void M206()); + #if HAS_M206_COMMAND + static void M206(); + #endif #if ENABLED(FWRETRACT) static void M207(); static void M208(); - TERN_(FWRETRACT_AUTORETRACT, static void M209()); + static void M209(); #endif static void M211(); - TERN_(HAS_MULTI_EXTRUDER, static void M217()); - - TERN_(HAS_HOTEND_OFFSET, static void M218()); - - static void M220(); - - #if EXTRUDERS - static void M221(); + #if HOTENDS > 1 + static void M218(); #endif - TERN_(DIRECT_PIN_CONTROL, static void M226()); + static void M220(); + static void M221(); + static void M226(); - TERN_(PHOTO_GCODE, static void M240()); + #if defined(CHDK) || HAS_PHOTOGRAPH + static void M240(); + #endif - TERN_(HAS_LCD_CONTRAST, static void M250()); + #if HAS_LCD_CONTRAST + static void M250(); + #endif #if ENABLED(EXPERIMENTAL_I2CBUS) static void M260(); @@ -686,31 +641,39 @@ private: #if HAS_SERVOS static void M280(); - TERN_(EDITABLE_SERVO_ANGLES, static void M281()); + #if ENABLED(EDITABLE_SERVO_ANGLES) + static void M281(); + #endif #endif - TERN_(BABYSTEPPING, static void M290()); + #if ENABLED(BABYSTEPPING) + static void M290(); + #endif - TERN_(HAS_BUZZER, static void M300()); + #if HAS_BUZZER + static void M300(); + #endif - TERN_(PIDTEMP, static void M301()); + #if ENABLED(PIDTEMP) + static void M301(); + #endif - TERN_(PREVENT_COLD_EXTRUSION, static void M302()); + #if ENABLED(PREVENT_COLD_EXTRUSION) + static void M302(); + #endif - TERN_(HAS_PID_HEATING, static void M303()); + static void M303(); - TERN_(PIDTEMPBED, static void M304()); - - TERN_(HAS_USER_THERMISTORS, static void M305()); + #if ENABLED(PIDTEMPBED) + static void M304(); + #endif #if HAS_MICROSTEPS static void M350(); static void M351(); #endif - TERN_(CASE_LIGHT_ENABLE, static void M355()); - - TERN_(REPETIER_GCODE_M360, static void M360()); + static void M355(); #if ENABLED(MORGAN_SCARA) static bool M360(); @@ -720,7 +683,7 @@ private: static bool M364(); #endif - #if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) + #if ENABLED(EXT_SOLENOID) static void M380(); static void M381(); #endif @@ -732,8 +695,6 @@ private: static void M402(); #endif - TERN_(PRUSA_MMU2, static void M403()); - #if ENABLED(FILAMENT_WIDTH_SENSOR) static void M404(); static void M405(); @@ -741,20 +702,14 @@ private: static void M407(); #endif - TERN_(HAS_FILAMENT_SENSOR, static void M412()); - #if HAS_LEVELING static void M420(); static void M421(); #endif - TERN_(BACKLASH_GCODE, static void M425()); - - TERN_(HAS_M206_COMMAND, static void M428()); - - TERN_(HAS_POWER_MONITOR, static void M430()); - - TERN_(CANCEL_OBJECTS, static void M486()); + #if HAS_M206_COMMAND + static void M428(); + #endif static void M500(); static void M501(); @@ -762,39 +717,29 @@ private: #if DISABLED(DISABLE_M503) static void M503(); #endif - TERN_(EEPROM_SETTINGS, static void M504()); - - #if ENABLED(PASSWORD_FEATURE) - static void M510(); - #if ENABLED(PASSWORD_UNLOCK_GCODE) - static void M511(); - #endif - #if ENABLED(PASSWORD_CHANGE_GCODE) - static void M512(); - #endif + #if ENABLED(EEPROM_SETTINGS) + static void M504(); #endif - TERN_(SDSUPPORT, static void M524()); - - TERN_(SD_ABORT_ON_ENDSTOP_HIT, static void M540()); - - TERN_(BAUD_RATE_GCODE, static void M575()); + #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + static void M540(); + #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) static void M600(); static void M603(); #endif - TERN_(HAS_DUPLICATION_MODE, static void M605()); - - TERN_(IS_KINEMATIC, static void M665()); - - #if ENABLED(DELTA) || HAS_EXTRA_ENDSTOPS - static void M666(); + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + static void M605(); #endif - #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) - static void M672(); + #if IS_KINEMATIC + static void M665(); + #endif + + #if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + static void M666(); #endif #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) @@ -802,11 +747,17 @@ private: static void M702(); #endif - TERN_(GCODE_MACROS, static void M810_819()); + #if ENABLED(MAX7219_GCODE) + static void M7219(); + #endif - TERN_(HAS_BED_PROBE, static void M851()); + #if HAS_BED_PROBE + static void M851(); + #endif - TERN_(SKEW_CORRECTION_GCODE, static void M852()); + #if ENABLED(SKEW_CORRECTION_GCODE) + static void M852(); + #endif #if ENABLED(I2C_POSITION_ENCODERS) FORCE_INLINE static void M860() { I2CPEM.M860(); } @@ -821,72 +772,49 @@ private: FORCE_INLINE static void M869() { I2CPEM.M869(); } #endif - #if ENABLED(PROBE_TEMP_COMPENSATION) - static void M192(); - static void M871(); + #if ENABLED(LIN_ADVANCE) + static void M900(); #endif - TERN_(LIN_ADVANCE, static void M900()); - - #if HAS_TRINAMIC_CONFIG - static void M122(); - static void M906(); - TERN_(HAS_STEALTHCHOP, static void M569()); - #if ENABLED(MONITOR_DRIVER_STATUS) - static void M911(); - static void M912(); + #if HAS_TRINAMIC + #if ENABLED(TMC_DEBUG) + static void M122(); #endif - TERN_(HYBRID_THRESHOLD, static void M913()); - TERN_(USE_SENSORLESS, static void M914()); - #endif - - #if HAS_L64XX - static void M122(); static void M906(); - static void M916(); - static void M917(); - static void M918(); + static void M911(); + static void M912(); + #if ENABLED(HYBRID_THRESHOLD) + static void M913(); + #endif + #if ENABLED(SENSORLESS_HOMING) + static void M914(); + #endif + #if ENABLED(TMC_Z_CALIBRATION) + static void M915(); + #endif #endif - #if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM || ENABLED(DIGIPOT_I2C) || ENABLED(DAC_STEPPER_CURRENT) static void M907(); - #if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) + #if HAS_DIGIPOTSS || ENABLED(DAC_STEPPER_CURRENT) static void M908(); - #if ENABLED(HAS_MOTOR_CURRENT_DAC) + #if ENABLED(DAC_STEPPER_CURRENT) static void M909(); static void M910(); #endif #endif #endif - TERN_(SDSUPPORT, static void M928()); - - TERN_(MAGNETIC_PARKING_EXTRUDER, static void M951()); - - TERN_(TOUCH_SCREEN_CALIBRATION, static void M995()); - - #if BOTH(HAS_SPI_FLASH, SDSUPPORT) - static void M993(); - static void M994(); + #if ENABLED(SDSUPPORT) + static void M928(); #endif - TERN_(PLATFORM_M997_SUPPORT, static void M997()); - static void M999(); - #if ENABLED(POWER_LOSS_RECOVERY) - static void M413(); - static void M1000(); - #endif - - TERN_(SDSUPPORT, static void M1001()); - - TERN_(MAX7219_GCODE, static void M7219()); - - TERN_(CONTROLLER_FAN_EDITABLE, static void M710()); - - static void T(const int8_t tool_index); + static void T(const uint8_t tmp_extruder); }; extern GcodeSuite gcode; + +#endif // _GCODE_H_ diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp deleted file mode 100644 index 1f38a85b91..0000000000 --- a/Marlin/src/gcode/gcode_d.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(MARLIN_DEV_MODE) - - #include "gcode.h" - #include "../module/settings.h" - #include "../module/temperature.h" - #include "../libs/hex_print.h" - #include "../HAL/shared/eeprom_if.h" - #include "../HAL/shared/Delay.h" - - /** - * Dn: G-code for development and testing - * - * See https://reprap.org/wiki/G-code#D:_Debug_codes - * - * Put whatever else you need here to test ongoing development. - */ - void GcodeSuite::D(const int16_t dcode) { - switch (dcode) { - - case -1: - for (;;); // forever - - case 0: - HAL_reboot(); - break; - - case 1: { - // Zero or pattern-fill the EEPROM data - #if ENABLED(EEPROM_SETTINGS) - persistentStore.access_start(); - size_t total = persistentStore.capacity(); - int pos = 0; - const uint8_t value = 0x0; - while(total--) { - persistentStore.write_data(pos, &value, 1); - } - persistentStore.access_finish(); - #else - settings.reset(); - settings.save(); - #endif - HAL_reboot(); - } break; - - case 2: { // D2 Read / Write SRAM - #define SRAM_SIZE 8192 - uint8_t *pointer = parser.hex_adr_val('A'); - uint16_t len = parser.ushortval('C', 1); - uintptr_t addr = (uintptr_t)pointer; - NOMORE(addr, (size_t)(SRAM_SIZE - 1)); - NOMORE(len, SRAM_SIZE - addr); - if (parser.seenval('X')) { - // Write the hex bytes after the X - uint16_t val = parser.hex_val('X'); - while (len--) { - *pointer = val; - pointer++; - } - } - else { - while (len--) print_hex_byte(*(pointer++)); - SERIAL_EOL(); - } - } break; - - #if ENABLED(EEPROM_SETTINGS) - case 3: { // D3 Read / Write EEPROM - uint8_t *pointer = parser.hex_adr_val('A'); - uint16_t len = parser.ushortval('C', 1); - uintptr_t addr = (uintptr_t)pointer; - #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE size_t(E2END + 1) - #endif - NOMORE(addr, (size_t)(MARLIN_EEPROM_SIZE - 1)); - NOMORE(len, MARLIN_EEPROM_SIZE - addr); - if (parser.seenval('X')) { - uint16_t val = parser.hex_val('X'); - #if ENABLED(EEPROM_SETTINGS) - persistentStore.access_start(); - while(len--) { - int pos = 0; - persistentStore.write_data(pos, (uint8_t *)&val, sizeof(val)); - } - SERIAL_EOL(); - persistentStore.access_finish(); - #else - SERIAL_ECHOLN("NO EEPROM"); - #endif - } - else { - while (len--) { - // Read bytes from EEPROM - #if ENABLED(EEPROM_SETTINGS) - persistentStore.access_start(); - uint8_t val; - while(len--) { - int pos = 0; - if (!persistentStore.read_data(pos, (uint8_t *)&val, sizeof(val))) { - print_hex_byte(val); - } - } - SERIAL_EOL(); - persistentStore.access_finish(); - #else - SERIAL_ECHOLN("NO EEPROM"); - #endif - } - SERIAL_EOL(); - } - } break; - #endif - - case 4: { // D4 Read / Write PIN - // const uint8_t pin = parser.byteval('P'); - // const bool is_out = parser.boolval('F'), - // val = parser.byteval('V', LOW); - if (parser.seenval('X')) { - // TODO: Write the hex bytes after the X - //while (len--) { - //} - } - else { - // while (len--) { - // TODO: Read bytes from EEPROM - // print_hex_byte(eeprom_read_byte(*(adr++)); - // } - SERIAL_EOL(); - } - } break; - - case 5: { // D4 Read / Write onboard Flash - #define FLASH_SIZE 1024 - uint8_t *pointer = parser.hex_adr_val('A'); - uint16_t len = parser.ushortval('C', 1); - uintptr_t addr = (uintptr_t)pointer; - NOMORE(addr, (size_t)(FLASH_SIZE - 1)); - NOMORE(len, FLASH_SIZE - addr); - if (parser.seenval('X')) { - // TODO: Write the hex bytes after the X - //while (len--) { - //} - } - else { - // while (len--) { - // TODO: Read bytes from EEPROM - // print_hex_byte(eeprom_read_byte(adr++)); - // } - SERIAL_EOL(); - } - } break; - - case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test) - SERIAL_ECHOLN("Disabling heaters and attempting to trigger Watchdog"); - SERIAL_ECHOLN("(USE_WATCHDOG " TERN(USE_WATCHDOG, "ENABLED", "DISABLED") ")"); - thermalManager.disable_all_heaters(); - delay(1000); // Allow time to print - DISABLE_ISRS(); - // Use a low-level delay that does not rely on interrupts to function - // Do not spin forever, to avoid thermal risks if heaters are enabled and - // watchdog does not work. - DELAY_US(10000000); - ENABLE_ISRS(); - SERIAL_ECHOLN("FAILURE: Watchdog did not trigger board reset."); - } - } - } - -#endif diff --git a/Marlin/src/gcode/geometry/G17-G19.cpp b/Marlin/src/gcode/geometry/G17-G19.cpp index 7510eaba8c..d386e2eed2 100644 --- a/Marlin/src/gcode/geometry/G17-G19.cpp +++ b/Marlin/src/gcode/geometry/G17-G19.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/geometry/G53-G59.cpp b/Marlin/src/gcode/geometry/G53-G59.cpp index 05bc522768..09708c03ea 100644 --- a/Marlin/src/gcode/geometry/G53-G59.cpp +++ b/Marlin/src/gcode/geometry/G53-G59.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,22 +27,24 @@ #include "../../module/stepper.h" -//#define DEBUG_M53 - /** * Select a coordinate system and update the workspace offset. * System index -1 is used to specify machine-native. */ bool GcodeSuite::select_coordinate_system(const int8_t _new) { if (active_coordinate_system == _new) return false; - active_coordinate_system = _new; - xyz_float_t new_offset{0}; + planner.synchronize(); + float old_offset[XYZ] = { 0 }, new_offset[XYZ] = { 0 }; + if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) + COPY(old_offset, coordinate_system[active_coordinate_system]); if (WITHIN(_new, 0, MAX_COORDINATE_SYSTEMS - 1)) - new_offset = coordinate_system[_new]; + COPY(new_offset, coordinate_system[_new]); + active_coordinate_system = _new; LOOP_XYZ(i) { - if (position_shift[i] != new_offset[i]) { - position_shift[i] = new_offset[i]; - update_workspace_offset((AxisEnum)i); + const float diff = new_offset[i] - old_offset[i]; + if (diff) { + position_shift[i] += diff; + update_software_endstops((AxisEnum)i); } } return true; @@ -57,21 +59,12 @@ bool GcodeSuite::select_coordinate_system(const int8_t _new) { * * Marlin also uses G53 on a line by itself to go back to native space. */ -void GcodeSuite::G53() { - const int8_t old_system = active_coordinate_system; - select_coordinate_system(-1); // Always remove workspace offsets - #ifdef DEBUG_M53 - SERIAL_ECHOLNPGM("Go to native space"); - report_current_position(); - #endif - - if (parser.chain()) { // Command to chain? - process_parsed_command(); // ...process the chained command - select_coordinate_system(old_system); - #ifdef DEBUG_M53 - SERIAL_ECHOLNPAIR("Go back to workspace ", old_system); - report_current_position(); - #endif +inline void GcodeSuite::G53() { + const int8_t _system = active_coordinate_system; + active_coordinate_system = -1; + if (parser.chain()) { // If this command has more following... + process_parsed_command(); + active_coordinate_system = _system; } } @@ -87,7 +80,7 @@ void GcodeSuite::G53() { void G54_59(uint8_t subcode=0) { const int8_t _space = parser.codenum - 54 + subcode; if (gcode.select_coordinate_system(_space)) { - SERIAL_ECHOLNPAIR("Select workspace ", _space); + SERIAL_PROTOCOLLNPAIR("Select workspace ", _space); report_current_position(); } } diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp index 1a0382ed7c..933a6e1cdb 100644 --- a/Marlin/src/gcode/geometry/G92.cpp +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,7 +25,7 @@ #include "../../module/stepper.h" #if ENABLED(I2C_POSITION_ENCODERS) - #include "../../feature/encoder_i2c.h" + #include "../../feature/I2CPositionEncoder.h" #endif /** @@ -33,73 +33,67 @@ */ void GcodeSuite::G92() { - bool sync_E = false, sync_XYZ = false; - - #if ENABLED(USE_GCODE_SUBCODES) - const uint8_t subcode_G92 = parser.subcode; - #else - constexpr uint8_t subcode_G92 = 0; - #endif - - switch (subcode_G92) { - default: break; - #if ENABLED(CNC_COORDINATE_SYSTEMS) - case 1: { + #if ENABLED(CNC_COORDINATE_SYSTEMS) + switch (parser.subcode) { + case 1: // Zero the G92 values and restore current position #if !IS_SCARA - LOOP_XYZ(i) if (position_shift[i]) { - position_shift[i] = 0; - update_workspace_offset((AxisEnum)i); + LOOP_XYZ(i) { + const float v = position_shift[i]; + if (v) { + position_shift[i] = 0; + update_software_endstops((AxisEnum)i); + } } #endif // Not SCARA - } return; - #endif - #if ENABLED(POWER_LOSS_RECOVERY) - case 9: { - LOOP_XYZE(i) { - if (parser.seenval(axis_codes[i])) { - current_position[i] = parser.value_axis_units((AxisEnum)i); - if (i == E_AXIS) sync_E = true; else sync_XYZ = true; + return; + } + #endif + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + #define IS_G92_0 (parser.subcode == 0) + #else + #define IS_G92_0 true + #endif + + bool didE = false; + #if IS_SCARA || !HAS_POSITION_SHIFT + bool didXYZ = false; + #else + constexpr bool didXYZ = false; + #endif + + if (IS_G92_0) LOOP_XYZE(i) { + if (parser.seenval(axis_codes[i])) { + const float l = parser.value_axis_units((AxisEnum)i), + v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i), + d = v - current_position[i]; + if (!NEAR_ZERO(d)) { + #if IS_SCARA || !HAS_POSITION_SHIFT + if (i == E_AXIS) didE = true; else didXYZ = true; + current_position[i] = v; // Without workspaces revert to Marlin 1.0 behavior + #elif HAS_POSITION_SHIFT + if (i == E_AXIS) { + didE = true; + current_position[E_AXIS] = v; // When using coordinate spaces, only E is set directly } - } - } break; - #endif - case 0: { - LOOP_XYZE(i) { - if (parser.seenval(axis_codes[i])) { - const float l = parser.value_axis_units((AxisEnum)i), - v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i), - d = v - current_position[i]; - if (!NEAR_ZERO(d)) { - #if IS_SCARA || !HAS_POSITION_SHIFT - if (i == E_AXIS) sync_E = true; else sync_XYZ = true; - current_position[i] = v; // Without workspaces revert to Marlin 1.0 behavior - #elif HAS_POSITION_SHIFT - if (i == E_AXIS) { - sync_E = true; - current_position.e = v; // When using coordinate spaces, only E is set directly - } - else { - position_shift[i] += d; // Other axes simply offset the coordinate space - update_workspace_offset((AxisEnum)i); - } - #endif + else { + position_shift[i] += d; // Other axes simply offset the coordinate space + update_software_endstops((AxisEnum)i); } - } + #endif } - } break; + } } #if ENABLED(CNC_COORDINATE_SYSTEMS) // Apply workspace offset to the active coordinate system if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) - coordinate_system[active_coordinate_system] = position_shift; + COPY(coordinate_system[active_coordinate_system], position_shift); #endif - if (sync_XYZ) sync_plan_position(); - else if (sync_E) sync_plan_position_e(); + if (didXYZ) SYNC_PLAN_POSITION_KINEMATIC(); + else if (didE) sync_plan_position_e(); - #if DISABLED(DIRECT_STEPPING) - report_current_position(); - #endif + report_current_position(); } diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index a477a1a526..88a60d545b 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -28,6 +28,7 @@ #include "../../module/motion.h" #include "../../lcd/ultralcd.h" #include "../../libs/buzzer.h" +#include "../../Marlin.h" // for axis_homed /** * M206: Set Additional Homing Offset (X Y Z). SCARA aliases T=X, P=Y @@ -38,7 +39,7 @@ */ void GcodeSuite::M206() { LOOP_XYZ(i) - if (parser.seen(XYZ_CHAR(i))) + if (parser.seen(axis_codes[i])) set_home_offset((AxisEnum)i, parser.value_linear_units()); #if ENABLED(MORGAN_SCARA) @@ -61,16 +62,17 @@ void GcodeSuite::M206() { * Use M206 to set these values directly. */ void GcodeSuite::M428() { - if (homing_needed_error()) return; + if (axis_unhomed_error()) return; - xyz_float_t diff; + float diff[XYZ]; LOOP_XYZ(i) { diff[i] = base_home_pos((AxisEnum)i) - current_position[i]; if (!WITHIN(diff[i], -20, 20) && home_dir((AxisEnum)i) > 0) diff[i] = -current_position[i]; if (!WITHIN(diff[i], -20, 20)) { - SERIAL_ERROR_MSG(STR_ERR_M428_TOO_FAR); - LCD_ALERTMESSAGEPGM_P(PSTR("Err: Too far!")); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M428_TOO_FAR); + LCD_ALERTMESSAGEPGM("Err: Too far!"); BUZZ(200, 40); return; } diff --git a/Marlin/src/gcode/host/M110.cpp b/Marlin/src/gcode/host/M110.cpp index b12b38ea0f..fc53611d90 100644 --- a/Marlin/src/gcode/host/M110.cpp +++ b/Marlin/src/gcode/host/M110.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,19 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" -#include "../queue.h" // for last_N +#include "../queue.h" // for gcode_LastN /** * M110: Set Current Line Number */ void GcodeSuite::M110() { - - if (parser.seenval('N')) - queue.last_N[queue.command_port()] = parser.value_long(); - + if (parser.seenval('N')) gcode_LastN = parser.value_long(); } diff --git a/Marlin/src/gcode/host/M113.cpp b/Marlin/src/gcode/host/M113.cpp index ce826d6acd..97a827de0e 100644 --- a/Marlin/src/gcode/host/M113.cpp +++ b/Marlin/src/gcode/host/M113.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp index 85a38f6462..e273c4e101 100644 --- a/Marlin/src/gcode/host/M114.cpp +++ b/Marlin/src/gcode/host/M114.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -28,63 +28,50 @@ #if ENABLED(M114_DETAIL) - #if HAS_L64XX - #include "../../libs/L64XX/L64XX_Marlin.h" - #define DEBUG_OUT ENABLED(L6470_CHITCHAT) - #include "../../core/debug_out.h" - #endif - - void report_xyze(const xyze_pos_t &pos, const uint8_t n=XYZE, const uint8_t precision=3) { + void report_xyze(const float pos[], const uint8_t n = 4, const uint8_t precision = 3) { char str[12]; - LOOP_L_N(a, n) { - SERIAL_CHAR(' ', axis_codes[a], ':'); - if (pos[a] >= 0) SERIAL_CHAR(' '); - SERIAL_ECHO(dtostrf(pos[a], 1, precision, str)); + for (uint8_t i = 0; i < n; i++) { + SERIAL_CHAR(' '); + SERIAL_CHAR(axis_codes[i]); + SERIAL_CHAR(':'); + SERIAL_PROTOCOL(dtostrf(pos[i], 8, precision, str)); } SERIAL_EOL(); } - inline void report_xyz(const xyze_pos_t &pos) { report_xyze(pos, XYZ); } - void report_xyz(const xyz_pos_t &pos, const uint8_t precision=3) { - char str[12]; - LOOP_XYZ(a) { - SERIAL_CHAR(' ', XYZ_CHAR(a), ':'); - SERIAL_ECHO(dtostrf(pos[a], 1, precision, str)); - } - SERIAL_EOL(); - } + inline void report_xyz(const float pos[]) { report_xyze(pos, 3); } void report_current_position_detail() { - // Position as sent by G-code - SERIAL_ECHOPGM("\nLogical:"); - report_xyz(current_position.asLogical()); + SERIAL_PROTOCOLPGM("\nLogical:"); + const float logical[XYZ] = { + LOGICAL_X_POSITION(current_position[X_AXIS]), + LOGICAL_Y_POSITION(current_position[Y_AXIS]), + LOGICAL_Z_POSITION(current_position[Z_AXIS]) + }; + report_xyz(logical); - // Cartesian position in native machine space - SERIAL_ECHOPGM("Raw: "); + SERIAL_PROTOCOLPGM("Raw: "); report_xyz(current_position); - xyze_pos_t leveled = current_position; + float leveled[XYZ] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; - #if HAS_LEVELING - // Current position with leveling applied - SERIAL_ECHOPGM("Leveled:"); + #if PLANNER_LEVELING + SERIAL_PROTOCOLPGM("Leveled:"); planner.apply_leveling(leveled); report_xyz(leveled); - // Test planner un-leveling. This should match the Raw result. - SERIAL_ECHOPGM("UnLevel:"); - xyze_pos_t unleveled = leveled; + SERIAL_PROTOCOLPGM("UnLevel:"); + float unleveled[XYZ] = { leveled[X_AXIS], leveled[Y_AXIS], leveled[Z_AXIS] }; planner.unapply_leveling(unleveled); report_xyz(unleveled); #endif #if IS_KINEMATIC - // Kinematics applied to the leveled position #if IS_SCARA - SERIAL_ECHOPGM("ScaraK: "); + SERIAL_PROTOCOLPGM("ScaraK: "); #else - SERIAL_ECHOPGM("DeltaK: "); + SERIAL_PROTOCOLPGM("DeltaK: "); #endif inverse_kinematics(leveled); // writes delta[] report_xyz(delta); @@ -92,128 +79,53 @@ planner.synchronize(); - #if HAS_L64XX - char temp_buf[80]; - int32_t temp; - //#define ABS_POS_SIGN_MASK 0b1111 1111 1110 0000 0000 0000 0000 0000 - #define ABS_POS_SIGN_MASK 0b11111111111000000000000000000000 - #define REPORT_ABSOLUTE_POS(Q) do{ \ - L64xxManager.say_axis(Q, false); \ - temp = L6470_GETPARAM(L6470_ABS_POS,Q); \ - if (temp & ABS_POS_SIGN_MASK) temp |= ABS_POS_SIGN_MASK; \ - sprintf_P(temp_buf, PSTR(":%8ld "), temp); \ - DEBUG_ECHO(temp_buf); \ - }while(0) - - DEBUG_ECHOPGM("\nL6470:"); - #if AXIS_IS_L64XX(X) - REPORT_ABSOLUTE_POS(X); - #endif - #if AXIS_IS_L64XX(X2) - REPORT_ABSOLUTE_POS(X2); - #endif - #if AXIS_IS_L64XX(Y) - REPORT_ABSOLUTE_POS(Y); - #endif - #if AXIS_IS_L64XX(Y2) - REPORT_ABSOLUTE_POS(Y2); - #endif - #if AXIS_IS_L64XX(Z) - REPORT_ABSOLUTE_POS(Z); - #endif - #if AXIS_IS_L64XX(Z2) - REPORT_ABSOLUTE_POS(Z2); - #endif - #if AXIS_IS_L64XX(Z3) - REPORT_ABSOLUTE_POS(Z3); - #endif - #if AXIS_IS_L64XX(Z4) - REPORT_ABSOLUTE_POS(Z4); - #endif - #if AXIS_IS_L64XX(E0) - REPORT_ABSOLUTE_POS(E0); - #endif - #if AXIS_IS_L64XX(E1) - REPORT_ABSOLUTE_POS(E1); - #endif - #if AXIS_IS_L64XX(E2) - REPORT_ABSOLUTE_POS(E2); - #endif - #if AXIS_IS_L64XX(E3) - REPORT_ABSOLUTE_POS(E3); - #endif - #if AXIS_IS_L64XX(E4) - REPORT_ABSOLUTE_POS(E4); - #endif - #if AXIS_IS_L64XX(E5) - REPORT_ABSOLUTE_POS(E5); - #endif - #if AXIS_IS_L64XX(E6) - REPORT_ABSOLUTE_POS(E6); - #endif - #if AXIS_IS_L64XX(E7) - REPORT_ABSOLUTE_POS(E7); - #endif - SERIAL_EOL(); - #endif // HAS_L64XX - - SERIAL_ECHOPGM("Stepper:"); + SERIAL_PROTOCOLPGM("Stepper:"); LOOP_XYZE(i) { - SERIAL_CHAR(' ', axis_codes[i], ':'); - SERIAL_ECHO(stepper.position((AxisEnum)i)); + SERIAL_CHAR(' '); + SERIAL_CHAR(axis_codes[i]); + SERIAL_CHAR(':'); + SERIAL_PROTOCOL(stepper.position((AxisEnum)i)); } SERIAL_EOL(); #if IS_SCARA - const xy_float_t deg = { + const float deg[XYZ] = { planner.get_axis_position_degrees(A_AXIS), planner.get_axis_position_degrees(B_AXIS) }; - SERIAL_ECHOPGM("Degrees:"); + SERIAL_PROTOCOLPGM("Degrees:"); report_xyze(deg, 2); #endif - SERIAL_ECHOPGM("FromStp:"); - get_cartesian_from_steppers(); // writes 'cartes' (with forward kinematics) - xyze_pos_t from_steppers = { cartes.x, cartes.y, cartes.z, planner.get_axis_position_mm(E_AXIS) }; + SERIAL_PROTOCOLPGM("FromStp:"); + get_cartesian_from_steppers(); // writes cartes[XYZ] (with forward kinematics) + const float from_steppers[XYZE] = { cartes[X_AXIS], cartes[Y_AXIS], cartes[Z_AXIS], planner.get_axis_position_mm(E_AXIS) }; report_xyze(from_steppers); - const xyze_float_t diff = from_steppers - leveled; - SERIAL_ECHOPGM("Diff: "); + const float diff[XYZE] = { + from_steppers[X_AXIS] - leveled[X_AXIS], + from_steppers[Y_AXIS] - leveled[Y_AXIS], + from_steppers[Z_AXIS] - leveled[Z_AXIS], + from_steppers[E_AXIS] - current_position[E_AXIS] + }; + SERIAL_PROTOCOLPGM("Differ: "); report_xyze(diff); } #endif // M114_DETAIL /** - * M114: Report the current position to host. - * Since steppers are moving, the count positions are - * projected by using planner calculations. - * D - Report more detail. This syncs the planner. (Requires M114_DETAIL) - * E - Report E stepper position (Requires M114_DETAIL) - * R - Report the realtime position instead of projected. + * M114: Report current position to host */ void GcodeSuite::M114() { #if ENABLED(M114_DETAIL) if (parser.seen('D')) { - #if DISABLED(M114_LEGACY) - planner.synchronize(); - #endif - report_current_position(); report_current_position_detail(); return; } - if (parser.seen('E')) { - SERIAL_ECHOLNPAIR("Count E:", stepper.position(E_AXIS)); - return; - } #endif - #if ENABLED(M114_REALTIME) - if (parser.seen('R')) { report_real_position(); return; } - #endif - - TERN_(M114_LEGACY, planner.synchronize()); - report_current_position_projected(); + planner.synchronize(); + report_current_position(); } diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 53c5163bba..c828e519e0 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,65 +16,68 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" #include "../../inc/MarlinConfig.h" -#if ENABLED(M115_GEOMETRY_REPORT) - #include "../../module/motion.h" +#if NUM_SERIAL > 1 + #include "../../gcode/queue.h" #endif #if ENABLED(EXTENDED_CAPABILITIES_REPORT) - static void cap_line(PGM_P const name, bool ena=false) { - SERIAL_ECHOPGM("Cap:"); + static void cap_line(const char * const name, bool ena=false) { + SERIAL_PROTOCOLPGM("Cap:"); serialprintPGM(name); SERIAL_CHAR(':'); - SERIAL_ECHOLN(int(ena ? 1 : 0)); + SERIAL_PROTOCOLLN(int(ena ? 1 : 0)); } #endif /** - * M115: Capabilities string and extended capabilities report - * If a capability is not reported, hosts should assume - * the capability is not present. + * M115: Capabilities string */ void GcodeSuite::M115() { - SERIAL_ECHOLNPGM( - "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " (" __DATE__ " " __TIME__ ") " - "SOURCE_CODE_URL:" SOURCE_CODE_URL " " - "PROTOCOL_VERSION:" PROTOCOL_VERSION " " - "MACHINE_TYPE:" MACHINE_NAME " " - "EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " " - #ifdef MACHINE_UUID - "UUID:" MACHINE_UUID - #endif - ); + #if NUM_SERIAL > 1 + const int8_t port = command_queue_port[cmd_queue_index_r]; + #define CAPLINE(STR,...) cap_line(PSTR(STR), port, __VA_ARGS__) + #else + #define CAPLINE(STR,...) cap_line(PSTR(STR), __VA_ARGS__) + #endif + + SERIAL_PROTOCOLLNPGM_P(port, MSG_M115_REPORT); #if ENABLED(EXTENDED_CAPABILITIES_REPORT) - // PAREN_COMMENTS - TERN_(PAREN_COMMENTS, cap_line(PSTR("PAREN_COMMENTS"), true)); - - // QUOTED_STRINGS - TERN_(GCODE_QUOTED_STRINGS, cap_line(PSTR("QUOTED_STRINGS"), true)); - // SERIAL_XON_XOFF - cap_line(PSTR("SERIAL_XON_XOFF"), ENABLED(SERIAL_XON_XOFF)); - - // BINARY_FILE_TRANSFER (M28 B1) - cap_line(PSTR("BINARY_FILE_TRANSFER"), ENABLED(BINARY_FILE_TRANSFER)); + cap_line(PSTR("SERIAL_XON_XOFF") + #if ENABLED(SERIAL_XON_XOFF) + , true + #endif + ); // EEPROM (M500, M501) - cap_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS)); + cap_line(PSTR("EEPROM") + #if ENABLED(EEPROM_SETTINGS) + , true + #endif + ); // Volumetric Extrusion (M200) - cap_line(PSTR("VOLUMETRIC"), DISABLED(NO_VOLUMETRICS)); + cap_line(PSTR("VOLUMETRIC") + #if DISABLED(NO_VOLUMETRICS) + , true + #endif + ); // AUTOREPORT_TEMP (M155) - cap_line(PSTR("AUTOREPORT_TEMP"), ENABLED(AUTO_REPORT_TEMPERATURES)); + cap_line(PSTR("AUTOREPORT_TEMP") + #if ENABLED(AUTO_REPORT_TEMPERATURES) + , true + #endif + ); // PROGRESS (M530 S L, M531 , M532 X L) cap_line(PSTR("PROGRESS")); @@ -83,79 +86,72 @@ void GcodeSuite::M115() { cap_line(PSTR("PRINT_JOB"), true); // AUTOLEVEL (G29) - cap_line(PSTR("AUTOLEVEL"), ENABLED(HAS_AUTOLEVEL)); - - // RUNOUT (M412, M600) - cap_line(PSTR("RUNOUT"), ENABLED(FILAMENT_RUNOUT_SENSOR)); + cap_line(PSTR("AUTOLEVEL") + #if HAS_AUTOLEVEL + , true + #endif + ); // Z_PROBE (G30) - cap_line(PSTR("Z_PROBE"), ENABLED(HAS_BED_PROBE)); + cap_line(PSTR("Z_PROBE") + #if HAS_BED_PROBE + , true + #endif + ); // MESH_REPORT (M420 V) - cap_line(PSTR("LEVELING_DATA"), ENABLED(HAS_LEVELING)); + cap_line(PSTR("LEVELING_DATA") + #if HAS_LEVELING + , true + #endif + ); // BUILD_PERCENT (M73) - cap_line(PSTR("BUILD_PERCENT"), ENABLED(LCD_SET_PROGRESS_MANUALLY)); + cap_line(PSTR("BUILD_PERCENT") + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + , true + #endif + ); // SOFTWARE_POWER (M80, M81) - cap_line(PSTR("SOFTWARE_POWER"), ENABLED(PSU_CONTROL)); + cap_line(PSTR("SOFTWARE_POWER") + #if HAS_POWER_SWITCH + , true + #endif + ); - // TOGGLE_LIGHTS (M355) - cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(CASE_LIGHT_ENABLE)); - cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, PWM_PIN(CASE_LIGHT_PIN))); + // CASE LIGHTS (M355) + cap_line(PSTR("TOGGLE_LIGHTS") + #if HAS_CASE_LIGHT + , true + #endif + ); + cap_line(PSTR("CASE_LIGHT_BRIGHTNESS") + #if HAS_CASE_LIGHT + , USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN) + #endif + ); - // EMERGENCY_PARSER (M108, M112, M410, M876) - cap_line(PSTR("EMERGENCY_PARSER"), ENABLED(EMERGENCY_PARSER)); - - // PROMPT SUPPORT (M876) - cap_line(PSTR("PROMPT_SUPPORT"), ENABLED(HOST_PROMPT_SUPPORT)); - - // SDCARD (M20, M23, M24, etc.) - cap_line(PSTR("SDCARD"), ENABLED(SDSUPPORT)); + // EMERGENCY_PARSER (M108, M112, M410) + cap_line(PSTR("EMERGENCY_PARSER") + #if ENABLED(EMERGENCY_PARSER) + , true + #endif + ); // AUTOREPORT_SD_STATUS (M27 extension) - cap_line(PSTR("AUTOREPORT_SD_STATUS"), ENABLED(AUTO_REPORT_SD_STATUS)); - - // LONG_FILENAME_HOST_SUPPORT (M33) - cap_line(PSTR("LONG_FILENAME"), ENABLED(LONG_FILENAME_HOST_SUPPORT)); + cap_line(PSTR("AUTOREPORT_SD_STATUS") + #if ENABLED(AUTO_REPORT_SD_STATUS) + , true + #endif + ); // THERMAL_PROTECTION - cap_line(PSTR("THERMAL_PROTECTION"), ENABLED(THERMALLY_SAFE)); - - // MOTION_MODES (M80-M89) - cap_line(PSTR("MOTION_MODES"), ENABLED(GCODE_MOTION_MODES)); - - // ARC_SUPPORT (G2-G3) - cap_line(PSTR("ARCS"), ENABLED(ARC_SUPPORT)); - - // BABYSTEPPING (M290) - cap_line(PSTR("BABYSTEPPING"), ENABLED(BABYSTEPPING)); - - // CHAMBER_TEMPERATURE (M141, M191) - cap_line(PSTR("CHAMBER_TEMPERATURE"), ENABLED(HAS_HEATED_CHAMBER)); - - // Machine Geometry - #if ENABLED(M115_GEOMETRY_REPORT) - const xyz_pos_t dmin = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, - dmax = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }; - xyz_pos_t cmin = dmin, cmax = dmax; - apply_motion_limits(cmin); - apply_motion_limits(cmax); - const xyz_pos_t lmin = dmin.asLogical(), lmax = dmax.asLogical(), - wmin = cmin.asLogical(), wmax = cmax.asLogical(); - SERIAL_ECHOLNPAIR( - "area:{" - "full:{" - "min:{x:", lmin.x, ",y:", lmin.y, ",z:", lmin.z, "}," - "max:{x:", lmax.x, ",y:", lmax.y, ",z:", lmax.z, "}" - "}," - "work:{" - "min:{x:", wmin.x, ",y:", wmin.y, ",z:", wmin.z, "}," - "max:{x:", wmax.x, ",y:", wmax.y, ",z:", wmax.z, "}", - "}" - "}" - ); - #endif + cap_line(PSTR("THERMAL_PROTECTION") + #if ENABLED(THERMAL_PROTECTION_HOTENDS) && ENABLED(THERMAL_PROTECTION_BED) + , true + #endif + ); #endif // EXTENDED_CAPABILITIES_REPORT } diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index 3be2902541..1bd132a3a6 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,58 +16,29 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" -#include "../../core/serial.h" /** * M118: Display a message in the host console. * * A1 Prepend '// ' for an action command, as in OctoPrint * E1 Have the host 'echo:' the text - * Pn Redirect to another serial port - * 0 : Announce to all ports - * 1-9 : Serial ports 1 to 9 */ void GcodeSuite::M118() { bool hasE = false, hasA = false; - #if HAS_MULTI_SERIAL - int8_t port = -1; // Assume no redirect - #endif char *p = parser.string_arg; - for (uint8_t i = 3; i--;) { - // A1, E1, and Pn are always parsed out - if (!( ((p[0] == 'A' || p[0] == 'E') && p[1] == '1') || (p[0] == 'P' && NUMERIC(p[1])) )) break; - switch (p[0]) { - case 'A': hasA = true; break; - case 'E': hasE = true; break; - #if HAS_MULTI_SERIAL - case 'P': port = p[1] - '0'; break; - #endif + for (uint8_t i = 2; i--;) + if ((p[0] == 'A' || p[0] == 'E') && p[1] == '1') { + if (p[0] == 'A') hasA = true; + if (p[0] == 'E') hasE = true; + p += 2; + while (*p == ' ') ++p; } - p += 2; - while (*p == ' ') ++p; - } - - #if HAS_MULTI_SERIAL - const int8_t old_serial = serial_port_index; - if (WITHIN(port, 0, NUM_SERIAL)) - serial_port_index = ( - port == 0 ? SERIAL_BOTH - : port == 1 ? SERIAL_PORT - #ifdef SERIAL_PORT_2 - : port == 2 ? SERIAL_PORT_2 - #endif - : SERIAL_PORT - ); - #endif - if (hasE) SERIAL_ECHO_START(); if (hasA) SERIAL_ECHOPGM("// "); SERIAL_ECHOLN(p); - - TERN_(HAS_MULTI_SERIAL, serial_port_index = old_serial); } diff --git a/Marlin/src/gcode/host/M119.cpp b/Marlin/src/gcode/host/M119.cpp index f0066bddff..7e2399e169 100644 --- a/Marlin/src/gcode/host/M119.cpp +++ b/Marlin/src/gcode/host/M119.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -28,6 +28,6 @@ */ void GcodeSuite::M119() { - endstops.report_states(); + endstops.M119(); } diff --git a/Marlin/src/gcode/host/M16.cpp b/Marlin/src/gcode/host/M16.cpp deleted file mode 100644 index 1ac8580396..0000000000 --- a/Marlin/src/gcode/host/M16.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(EXPECTED_PRINTER_CHECK) - -#include "../gcode.h" -#include "../../MarlinCore.h" - -/** - * M16: Expected Printer Check - */ -void GcodeSuite::M16() { - - if (strcmp_P(parser.string_arg, PSTR(MACHINE_NAME))) - kill(GET_TEXT(MSG_KILL_EXPECTED_PRINTER)); - -} - -#endif diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp deleted file mode 100644 index 9970dc4df9..0000000000 --- a/Marlin/src/gcode/host/M360.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../inc/MarlinConfig.h" - -#if ENABLED(REPETIER_GCODE_M360) - -#include "../gcode.h" - -#include "../../module/motion.h" -#include "../../module/planner.h" - -static void config_prefix(PGM_P const name, PGM_P const pref=nullptr) { - SERIAL_ECHOPGM("Config:"); - if (pref) serialprintPGM(pref); - serialprintPGM(name); - SERIAL_CHAR(':'); -} -static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr) { - config_prefix(name, pref); - SERIAL_ECHOLN(val); -} - -/** - * M360: Report Firmware configuration - * in RepRapFirmware-compatible format - */ -void GcodeSuite::M360() { - PGMSTR(X_STR, "X"); - PGMSTR(Y_STR, "Y"); - PGMSTR(Z_STR, "Z"); - PGMSTR(JERK_STR, "Jerk"); - - // - // Basics and Enabled items - // - config_line(PSTR("Baudrate"), BAUDRATE); - config_line(PSTR("InputBuffer"), MAX_CMD_SIZE); - config_line(PSTR("PrintlineCache"), BUFSIZE); - config_line(PSTR("MixingExtruder"), ENABLED(MIXING_EXTRUDER)); - config_line(PSTR("SDCard"), ENABLED(SDSUPPORT)); - config_line(PSTR("Fan"), ENABLED(HAS_FAN)); - config_line(PSTR("LCD"), ENABLED(HAS_DISPLAY)); - config_line(PSTR("SoftwarePowerSwitch"), 1); - config_line(PSTR("SupportLocalFilamentchange"), ENABLED(ADVANCED_PAUSE_FEATURE)); - config_line(PSTR("CaseLights"), ENABLED(CASE_LIGHT_ENABLE)); - config_line(PSTR("ZProbe"), ENABLED(HAS_BED_PROBE)); - config_line(PSTR("Autolevel"), ENABLED(HAS_LEVELING)); - config_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS)); - - // - // Homing Directions - // - PGMSTR(H_DIR_STR, "HomeDir"); - config_line(H_DIR_STR, X_HOME_DIR, X_STR); - config_line(H_DIR_STR, Y_HOME_DIR, Y_STR); - config_line(H_DIR_STR, Z_HOME_DIR, Z_STR); - - // - // XYZ Axis Jerk - // - #if HAS_CLASSIC_JERK - if (planner.max_jerk.x == planner.max_jerk.y) - config_line(PSTR("XY"), planner.max_jerk.x, JERK_STR); - else { - config_line(X_STR, planner.max_jerk.x, JERK_STR); - config_line(Y_STR, planner.max_jerk.y, JERK_STR); - } - config_line(Z_STR, planner.max_jerk.z, JERK_STR); - #endif - - // - // Firmware Retraction - // - config_line(PSTR("SupportG10G11"), ENABLED(FWRETRACT)); - #if ENABLED(FWRETRACT) - PGMSTR(RET_STR, "Retraction"); - PGMSTR(UNRET_STR, "RetractionUndo"); - PGMSTR(SPEED_STR, "Speed"); - // M10 Retract with swap (long) moves - config_line(PSTR("Length"), fwretract.settings.retract_length, RET_STR); - config_line(SPEED_STR, fwretract.settings.retract_feedrate_mm_s, RET_STR); - config_line(PSTR("ZLift"), fwretract.settings.retract_zraise, RET_STR); - config_line(PSTR("LongLength"), fwretract.settings.swap_retract_length, RET_STR); - // M11 Recover (undo) with swap (long) moves - config_line(SPEED_STR, fwretract.settings.retract_recover_feedrate_mm_s, UNRET_STR); - config_line(PSTR("ExtraLength"), fwretract.settings.retract_recover_extra, UNRET_STR); - config_line(PSTR("ExtraLongLength"), fwretract.settings.swap_retract_recover_extra, UNRET_STR); - config_line(PSTR("LongSpeed"), fwretract.settings.swap_retract_recover_feedrate_mm_s, UNRET_STR); - #endif - - // - // Workspace boundaries - // - const xyz_pos_t dmin = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, - dmax = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }; - xyz_pos_t cmin = dmin, cmax = dmax; - apply_motion_limits(cmin); - apply_motion_limits(cmax); - const xyz_pos_t wmin = cmin.asLogical(), wmax = cmax.asLogical(); - - PGMSTR(MIN_STR, "Min"); - PGMSTR(MAX_STR, "Max"); - PGMSTR(SIZE_STR, "Size"); - config_line(MIN_STR, wmin.x, X_STR); - config_line(MIN_STR, wmin.y, Y_STR); - config_line(MIN_STR, wmin.z, Z_STR); - config_line(MAX_STR, wmax.x, X_STR); - config_line(MAX_STR, wmax.y, Y_STR); - config_line(MAX_STR, wmax.z, Z_STR); - config_line(SIZE_STR, wmax.x - wmin.x, X_STR); - config_line(SIZE_STR, wmax.y - wmin.y, Y_STR); - config_line(SIZE_STR, wmax.z - wmin.z, Z_STR); - - // - // Print and Travel Acceleration - // - #define _ACCEL(A,B) _MIN(planner.settings.max_acceleration_mm_per_s2[A##_AXIS], planner.settings.B) - PGMSTR(P_ACC_STR, "PrintAccel"); - PGMSTR(T_ACC_STR, "TravelAccel"); - config_line(P_ACC_STR, _ACCEL(X, acceleration), X_STR); - config_line(P_ACC_STR, _ACCEL(Y, acceleration), Y_STR); - config_line(P_ACC_STR, _ACCEL(Z, acceleration), Z_STR); - config_line(T_ACC_STR, _ACCEL(X, travel_acceleration), X_STR); - config_line(T_ACC_STR, _ACCEL(Y, travel_acceleration), Y_STR); - config_line(T_ACC_STR, _ACCEL(Z, travel_acceleration), Z_STR); - - config_prefix(PSTR("PrinterType")); - SERIAL_ECHOLNPGM( - TERN_(DELTA, "Delta") - TERN_(IS_SCARA, "SCARA") - TERN_(IS_CORE, "Core") - TERN_(MARKFORGED_XY, "MarkForged") - TERN_(IS_CARTESIAN, "Cartesian") - ); - - // - // Heated Bed - // - config_line(PSTR("HeatedBed"), ENABLED(HAS_HEATED_BED)); - #if HAS_HEATED_BED - config_line(PSTR("MaxBedTemp"), BED_MAX_TARGET); - #endif - - // - // Per-Extruder settings - // - config_line(PSTR("NumExtruder"), EXTRUDERS); - #if EXTRUDERS - #define DIAM_VALUE(N) TERN(NO_VOLUMETRICS, DEFAULT_NOMINAL_FILAMENT_DIA, planner.filament_size[N]) - #if HAS_LINEAR_E_JERK - #define E_JERK_VAL(N) planner.max_e_jerk[E_INDEX_N(N)] - #elif HAS_CLASSIC_JERK - #define E_JERK_VAL(N) planner.max_jerk.e - #else - #define E_JERK_VAL(N) DEFAULT_EJERK - #endif - #define _EXTR_ITEM(N) do{ \ - PGMSTR(EXTR_STR, "Extr." STRINGIFY(INCREMENT(N)) ":"); \ - config_line(JERK_STR, E_JERK_VAL(N), EXTR_STR); \ - config_line(PSTR("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(N)], EXTR_STR); \ - config_line(PSTR("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(N)], EXTR_STR); \ - config_line(PSTR("Diameter"), DIAM_VALUE(N), EXTR_STR); \ - config_line(PSTR("MaxTemp"), (HEATER_##N##_MAXTEMP) - (HOTEND_OVERSHOOT), EXTR_STR); \ - }while(0) - - REPEAT(EXTRUDERS, _EXTR_ITEM); - #endif -} - -#endif diff --git a/Marlin/src/gcode/host/M876.cpp b/Marlin/src/gcode/host/M876.cpp deleted file mode 100644 index 0d8256cf08..0000000000 --- a/Marlin/src/gcode/host/M876.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../inc/MarlinConfig.h" - -#if ENABLED(HOST_PROMPT_SUPPORT) && DISABLED(EMERGENCY_PARSER) - -#include "../../feature/host_actions.h" -#include "../gcode.h" -#include "../../MarlinCore.h" - -/** - * M876: Handle Prompt Response - */ -void GcodeSuite::M876() { - - if (parser.seenval('S')) host_response_handler((uint8_t)parser.value_int()); - -} - -#endif // HOST_PROMPT_SUPPORT && !EMERGENCY_PARSER diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp index 1d18b70602..7563f85ff6 100644 --- a/Marlin/src/gcode/lcd/M0_M1.cpp +++ b/Marlin/src/gcode/lcd/M0_M1.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,29 +16,26 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#include "../../inc/MarlinConfigPre.h" +#include "../../inc/MarlinConfig.h" #if HAS_RESUME_CONTINUE -#include "../../inc/MarlinConfig.h" - #include "../gcode.h" +#include "../../module/stepper.h" -#include "../../module/planner.h" // for synchronize() -#include "../../MarlinCore.h" // for wait_for_user_response() - -#if HAS_LCD_MENU +#if ENABLED(ULTIPANEL) #include "../../lcd/ultralcd.h" -#elif ENABLED(EXTENSIBLE_UI) - #include "../../lcd/extui/ui_api.h" #endif -#if ENABLED(HOST_PROMPT_SUPPORT) - #include "../../feature/host_actions.h" +#include "../../sd/cardreader.h" + +#if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT) + bool GcodeSuite::lights_off_after_print; + #include "../../feature/leds/leds.h" #endif /** @@ -46,42 +43,66 @@ * M1: Conditional stop - Wait for user button press on LCD */ void GcodeSuite::M0_M1() { + const char * const args = parser.string_arg; + millis_t ms = 0; - if (parser.seenval('P')) ms = parser.value_millis(); // Milliseconds to wait - if (parser.seenval('S')) ms = parser.value_millis_from_seconds(); // Seconds to wait + bool hasP = false, hasS = false; + if (parser.seenval('P')) { + ms = parser.value_millis(); // milliseconds to wait + hasP = ms > 0; + } + if (parser.seenval('S')) { + ms = parser.value_millis_from_seconds(); // seconds to wait + hasS = ms > 0; + } + + const bool has_message = !hasP && !hasS && args && *args; planner.synchronize(); - #if HAS_LCD_MENU + #if ENABLED(ULTIPANEL) - if (parser.string_arg) - ui.set_status(parser.string_arg, true); + if (has_message) + lcd_setstatus(args, true); else { LCD_MESSAGEPGM(MSG_USERWAIT); #if ENABLED(LCD_PROGRESS_BAR) && PROGRESS_MSG_EXPIRE > 0 - ui.reset_progress_bar_timeout(); + dontExpireStatus(); #endif } - #elif ENABLED(EXTENSIBLE_UI) - if (parser.string_arg) - ExtUI::onUserConfirmRequired(parser.string_arg); // Can this take an SRAM string?? - else - ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_USERWAIT)); #else - if (parser.string_arg) { + if (has_message) { SERIAL_ECHO_START(); - SERIAL_ECHOLN(parser.string_arg); + SERIAL_ECHOLN(args); } #endif - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, parser.codenum ? PSTR("M1 Stop") : PSTR("M0 Stop"), CONTINUE_STR)); + KEEPALIVE_STATE(PAUSED_FOR_USER); + wait_for_user = true; - wait_for_user_response(ms); + if (ms > 0) { + ms += millis(); // wait until this time for a click + while (PENDING(millis(), ms) && wait_for_user) idle(); + } + else + while (wait_for_user) idle(); - TERN_(HAS_LCD_MENU, ui.reset_status()); + #if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT) + if (lights_off_after_print) { + leds.set_off(); + lights_off_after_print = false; + } + #endif + + #if ENABLED(ULTIPANEL) + lcd_reset_status(); + #endif + + wait_for_user = false; + KEEPALIVE_STATE(IN_HANDLER); } #endif // HAS_RESUME_CONTINUE diff --git a/Marlin/src/gcode/lcd/M117.cpp b/Marlin/src/gcode/lcd/M117.cpp index 8459135f30..0f508d8eb9 100644 --- a/Marlin/src/gcode/lcd/M117.cpp +++ b/Marlin/src/gcode/lcd/M117.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -28,9 +28,6 @@ */ void GcodeSuite::M117() { - if (parser.string_arg && parser.string_arg[0]) - ui.set_status(parser.string_arg); - else - ui.reset_status(); + lcd_setstatus(parser.string_arg); } diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index abd4dcc743..3fda5bb047 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if PREHEAT_COUNT +#if ENABLED(ULTIPANEL) #include "../gcode.h" #include "../../lcd/ultralcd.h" @@ -30,30 +30,34 @@ /** * M145: Set the heatup state for a material in the LCD menu * - * S + * S (0=PLA, 1=ABS) * H * B * F */ void GcodeSuite::M145() { const uint8_t material = (uint8_t)parser.intval('S'); - if (material >= PREHEAT_COUNT) - SERIAL_ERROR_MSG(STR_ERR_MATERIAL_INDEX); + if (material >= COUNT(lcd_preheat_hotend_temp)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_MATERIAL_INDEX); + } else { - preheat_t &mat = ui.material_preset[material]; - #if HAS_HOTEND - if (parser.seenval('H')) - mat.hotend_temp = constrain(parser.value_int(), EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT)); - #endif - #if HAS_HEATED_BED - if (parser.seenval('B')) - mat.bed_temp = constrain(parser.value_int(), BED_MINTEMP, BED_MAX_TARGET); - #endif - #if HAS_FAN - if (parser.seenval('F')) - mat.fan_speed = constrain(parser.value_int(), 0, 255); + int v; + if (parser.seenval('H')) { + v = parser.value_int(); + lcd_preheat_hotend_temp[material] = constrain(v, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - 15); + } + if (parser.seenval('F')) { + v = parser.value_int(); + lcd_preheat_fan_speed[material] = constrain(v, 0, 255); + } + #if TEMP_SENSOR_BED != 0 + if (parser.seenval('B')) { + v = parser.value_int(); + lcd_preheat_bed_temp[material] = constrain(v, BED_MINTEMP, BED_MAXTEMP - 15); + } #endif } } -#endif // PREHEAT_COUNT +#endif // ULTIPANEL diff --git a/Marlin/src/gcode/lcd/M250.cpp b/Marlin/src/gcode/lcd/M250.cpp index f42daaeac4..bede88126a 100644 --- a/Marlin/src/gcode/lcd/M250.cpp +++ b/Marlin/src/gcode/lcd/M250.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -31,8 +31,10 @@ * M250: Read and optionally set the LCD contrast */ void GcodeSuite::M250() { - if (parser.seen('C')) ui.set_contrast(parser.value_int()); - SERIAL_ECHOLNPAIR("LCD Contrast: ", ui.contrast); + if (parser.seen('C')) set_lcd_contrast(parser.value_int()); + SERIAL_PROTOCOLPGM("lcd contrast value: "); + SERIAL_PROTOCOL(lcd_contrast); + SERIAL_EOL(); } #endif // HAS_LCD_CONTRAST diff --git a/Marlin/src/gcode/lcd/M300.cpp b/Marlin/src/gcode/lcd/M300.cpp index 56d9ee5d73..0e56587934 100644 --- a/Marlin/src/gcode/lcd/M300.cpp +++ b/Marlin/src/gcode/lcd/M300.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/lcd/M73.cpp b/Marlin/src/gcode/lcd/M73.cpp index 7a5454419d..1c1deee9f9 100644 --- a/Marlin/src/gcode/lcd/M73.cpp +++ b/Marlin/src/gcode/lcd/M73.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if ENABLED(LCD_SET_PROGRESS_MANUALLY) +#if ENABLED(ULTRA_LCD) && ENABLED(LCD_SET_PROGRESS_MANUALLY) #include "../gcode.h" #include "../../lcd/ultralcd.h" @@ -33,16 +33,15 @@ * * Example: * M73 P25 ; Set progress to 25% + * + * Notes: + * This has no effect during an SD print job */ void GcodeSuite::M73() { - if (parser.seen('P')) - ui.set_progress((PROGRESS_SCALE) > 1 - ? parser.value_float() * (PROGRESS_SCALE) - : parser.value_byte() - ); - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - if (parser.seen('R')) ui.set_remaining_time(60 * parser.value_ulong()); - #endif + if (!IS_SD_PRINTING && parser.seen('P')) { + progress_bar_percent = parser.value_byte(); + NOMORE(progress_bar_percent, 100); + } } -#endif // LCD_SET_PROGRESS_MANUALLY +#endif // ULTRA_LCD && LCD_SET_PROGRESS_MANUALLY diff --git a/Marlin/src/gcode/lcd/M995.cpp b/Marlin/src/gcode/lcd/M995.cpp deleted file mode 100644 index 72d0d29f76..0000000000 --- a/Marlin/src/gcode/lcd/M995.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - -#include "../gcode.h" -#include "../../lcd/menu/menu.h" - -/** - * M995: Touch screen calibration for TFT display - */ -void GcodeSuite::M995() { - - ui.goto_screen(touch_screen_calibration); - -} - -#endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp index 9ac49bd93c..b0e088b821 100644 --- a/Marlin/src/gcode/motion/G0_G1.cpp +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,16 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" #include "../../module/motion.h" -#include "../../MarlinCore.h" +#include "../../Marlin.h" -#if BOTH(FWRETRACT, FWRETRACT_AUTORETRACT) +#if ENABLED(FWRETRACT) #include "../../feature/fwretract.h" #endif @@ -35,60 +35,36 @@ #include "../../module/stepper.h" #endif -extern xyze_pos_t destination; +extern float destination[XYZE]; -#if ENABLED(VARIABLE_G0_FEEDRATE) - feedRate_t fast_move_feedrate = MMM_TO_MMS(G0_FEEDRATE); +#if ENABLED(NO_MOTION_BEFORE_HOMING) + #define G0_G1_CONDITION !axis_unhomed_error(parser.seen('X'), parser.seen('Y'), parser.seen('Z')) +#else + #define G0_G1_CONDITION true #endif /** * G0, G1: Coordinated movement of X Y Z E axes */ -void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) { +void GcodeSuite::G0_G1( + #if IS_SCARA + bool fast_move/*=false*/ + #endif +) { + if (IsRunning() && G0_G1_CONDITION) { + get_destination_from_command(); // For X Y Z E F - if (IsRunning() - #if ENABLED(NO_MOTION_BEFORE_HOMING) - && !homing_needed_error( - (parser.seen('X') ? _BV(X_AXIS) : 0) - | (parser.seen('Y') ? _BV(Y_AXIS) : 0) - | (parser.seen('Z') ? _BV(Z_AXIS) : 0) ) - #endif - ) { - - #ifdef G0_FEEDRATE - feedRate_t old_feedrate; - #if ENABLED(VARIABLE_G0_FEEDRATE) - if (fast_move) { - old_feedrate = feedrate_mm_s; // Back up the (old) motion mode feedrate - feedrate_mm_s = fast_move_feedrate; // Get G0 feedrate from last usage - } - #endif - #endif - - get_destination_from_command(); // Get X Y Z E F (and set cutter power) - - #ifdef G0_FEEDRATE - if (fast_move) { - #if ENABLED(VARIABLE_G0_FEEDRATE) - fast_move_feedrate = feedrate_mm_s; // Save feedrate for the next G0 - #else - old_feedrate = feedrate_mm_s; // Back up the (new) motion mode feedrate - feedrate_mm_s = MMM_TO_MMS(G0_FEEDRATE); // Get the fixed G0 feedrate - #endif - } - #endif - - #if BOTH(FWRETRACT, FWRETRACT_AUTORETRACT) + #if ENABLED(FWRETRACT) if (MIN_AUTORETRACT <= MAX_AUTORETRACT) { // When M209 Autoretract is enabled, convert E-only moves to firmware retract/recover moves if (fwretract.autoretract_enabled && parser.seen('E') && !(parser.seen('X') || parser.seen('Y') || parser.seen('Z'))) { - const float echange = destination.e - current_position.e; + const float echange = destination[E_AXIS] - current_position[E_AXIS]; // Is this a retract or recover move? if (WITHIN(ABS(echange), MIN_AUTORETRACT, MAX_AUTORETRACT) && fwretract.retracted[active_extruder] == (echange > 0.0)) { - current_position.e = destination.e; // Hide a G1-based retract/recover from calculations - sync_plan_position_e(); // AND from the planner - return fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored) + current_position[E_AXIS] = destination[E_AXIS]; // Hide a G1-based retract/recover from calculations + sync_plan_position_e(); // AND from the planner + return fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored) } } } @@ -96,14 +72,9 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) { #endif // FWRETRACT #if IS_SCARA - fast_move ? prepare_fast_move_to_destination() : prepare_line_to_destination(); + fast_move ? prepare_uninterpolated_move_to_destination() : prepare_move_to_destination(); #else - prepare_line_to_destination(); - #endif - - #ifdef G0_FEEDRATE - // Restore the motion mode feedrate - if (fast_move) feedrate_mm_s = old_feedrate; + prepare_move_to_destination(); #endif #if ENABLED(NANODLP_Z_SYNC) @@ -114,7 +85,7 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) { #endif if (_MOVE_SYNC) { planner.synchronize(); - SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); + SERIAL_ECHOLNPGM(MSG_Z_MOVE_COMP); } #endif } diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 61d9f1d3a6..5e52d54c9b 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -35,6 +35,10 @@ #include "../../module/scara.h" #endif +#if HAS_FEEDRATE_SCALING && ENABLED(AUTO_BED_LEVELING_BILINEAR) + #include "../../feature/bedlevel/abl/abl.h" +#endif + #if N_ARC_CORRECTION < 1 #undef N_ARC_CORRECTION #define N_ARC_CORRECTION 1 @@ -50,73 +54,48 @@ * options for G2/G3 arc generation. In future these options may be GCode tunable. */ void plan_arc( - const xyze_pos_t &cart, // Destination position - const ab_float_t &offset, // Center of rotation relative to current_position - const uint8_t clockwise // Clockwise? + const float (&cart)[XYZE], // Destination position + const float (&offset)[2], // Center of rotation relative to current_position + const uint8_t clockwise // Clockwise? ) { #if ENABLED(CNC_WORKSPACE_PLANES) AxisEnum p_axis, q_axis, l_axis; switch (gcode.workspace_plane) { default: case GcodeSuite::PLANE_XY: p_axis = X_AXIS; q_axis = Y_AXIS; l_axis = Z_AXIS; break; - case GcodeSuite::PLANE_YZ: p_axis = Y_AXIS; q_axis = Z_AXIS; l_axis = X_AXIS; break; case GcodeSuite::PLANE_ZX: p_axis = Z_AXIS; q_axis = X_AXIS; l_axis = Y_AXIS; break; + case GcodeSuite::PLANE_YZ: p_axis = Y_AXIS; q_axis = Z_AXIS; l_axis = X_AXIS; break; } #else constexpr AxisEnum p_axis = X_AXIS, q_axis = Y_AXIS, l_axis = Z_AXIS; #endif // Radius vector from center to current location - ab_float_t rvec = -offset; + float r_P = -offset[0], r_Q = -offset[1]; - const float radius = HYPOT(rvec.a, rvec.b), - center_P = current_position[p_axis] - rvec.a, - center_Q = current_position[q_axis] - rvec.b, + const float radius = HYPOT(r_P, r_Q), + center_P = current_position[p_axis] - r_P, + center_Q = current_position[q_axis] - r_Q, rt_X = cart[p_axis] - center_P, rt_Y = cart[q_axis] - center_Q, - start_L = current_position[l_axis], - linear_travel = cart[l_axis] - start_L, - extruder_travel = cart.e - current_position.e; + linear_travel = cart[l_axis] - current_position[l_axis], + extruder_travel = cart[E_AXIS] - current_position[E_AXIS]; // CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required. - float angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y); + float angular_travel = ATAN2(r_P * rt_Y - r_Q * rt_X, r_P * rt_X + r_Q * rt_Y); if (angular_travel < 0) angular_travel += RADIANS(360); - #ifdef MIN_ARC_SEGMENTS - uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * (angular_travel / RADIANS(360))); - NOLESS(min_segments, 1U); - #else - constexpr uint16_t min_segments = 1; - #endif if (clockwise) angular_travel -= RADIANS(360); // Make a circle if the angular rotation is 0 and the target is current position - if (angular_travel == 0 && current_position[p_axis] == cart[p_axis] && current_position[q_axis] == cart[q_axis]) { + if (angular_travel == 0 && current_position[p_axis] == cart[p_axis] && current_position[q_axis] == cart[q_axis]) angular_travel = RADIANS(360); - #ifdef MIN_ARC_SEGMENTS - min_segments = MIN_ARC_SEGMENTS; - #endif - } const float flat_mm = radius * angular_travel, mm_of_travel = linear_travel ? HYPOT(flat_mm, linear_travel) : ABS(flat_mm); if (mm_of_travel < 0.001f) return; - const feedRate_t scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); - - // Start with a nominal segment length - float seg_length = ( - #ifdef ARC_SEGMENTS_PER_R - constrain(MM_PER_ARC_SEGMENT * radius, MM_PER_ARC_SEGMENT, ARC_SEGMENTS_PER_R) - #elif ARC_SEGMENTS_PER_SEC - _MAX(scaled_fr_mm_s * RECIPROCAL(ARC_SEGMENTS_PER_SEC), MM_PER_ARC_SEGMENT) - #else - MM_PER_ARC_SEGMENT - #endif - ); - // Divide total travel by nominal segment length - uint16_t segments = FLOOR(mm_of_travel / seg_length); - NOLESS(segments, min_segments); // At least some segments - seg_length = mm_of_travel / segments; + uint16_t segments = FLOOR(mm_of_travel / (MM_PER_ARC_SEGMENT)); + if (segments == 0) segments = 1; /** * Vector rotation by transformation matrix: r is the original vector, r_T is the rotated vector, @@ -145,26 +124,35 @@ void plan_arc( * This is important when there are successive arc motions. */ // Vector rotation matrix values - xyze_pos_t raw; + float raw[XYZE]; const float theta_per_segment = angular_travel / segments, linear_per_segment = linear_travel / segments, extruder_per_segment = extruder_travel / segments, - sq_theta_per_segment = sq(theta_per_segment), - sin_T = theta_per_segment - sq_theta_per_segment*theta_per_segment/6, - cos_T = 1 - 0.5f * sq_theta_per_segment; // Small angle approximation + sin_T = theta_per_segment, + cos_T = 1 - 0.5f * sq(theta_per_segment); // Small angle approximation // Initialize the linear axis raw[l_axis] = current_position[l_axis]; // Initialize the extruder axis - raw.e = current_position.e; + raw[E_AXIS] = current_position[E_AXIS]; - #if ENABLED(SCARA_FEEDRATE_SCALING) - const float inv_duration = scaled_fr_mm_s / seg_length; - #endif + const float fr_mm_s = MMS_SCALED(feedrate_mm_s); millis_t next_idle_ms = millis() + 200UL; + #if HAS_FEEDRATE_SCALING + // SCARA needs to scale the feed rate from mm/s to degrees/s + const float inv_segment_length = 1.0f / float(MM_PER_ARC_SEGMENT), + inverse_secs = inv_segment_length * fr_mm_s; + float oldA = planner.position_float[A_AXIS], + oldB = planner.position_float[B_AXIS] + #if ENABLED(DELTA_FEEDRATE_SCALING) + , oldC = planner.position_float[C_AXIS] + #endif + ; + #endif + #if N_ARC_CORRECTION > 1 int8_t arc_recalc_count = N_ARC_CORRECTION; #endif @@ -179,10 +167,10 @@ void plan_arc( #if N_ARC_CORRECTION > 1 if (--arc_recalc_count) { - // Apply vector rotation matrix to previous rvec.a / 1 - const float r_new_Y = rvec.a * sin_T + rvec.b * cos_T; - rvec.a = rvec.a * cos_T - rvec.b * sin_T; - rvec.b = r_new_Y; + // Apply vector rotation matrix to previous r_P / 1 + const float r_new_Y = r_P * sin_T + r_Q * cos_T; + r_P = r_P * cos_T - r_Q * sin_T; + r_Q = r_new_Y; } else #endif @@ -196,73 +184,88 @@ void plan_arc( // To reduce stuttering, the sin and cos could be computed at different times. // For now, compute both at the same time. const float cos_Ti = cos(i * theta_per_segment), sin_Ti = sin(i * theta_per_segment); - rvec.a = -offset[0] * cos_Ti + offset[1] * sin_Ti; - rvec.b = -offset[0] * sin_Ti - offset[1] * cos_Ti; + r_P = -offset[0] * cos_Ti + offset[1] * sin_Ti; + r_Q = -offset[0] * sin_Ti - offset[1] * cos_Ti; } // Update raw location - raw[p_axis] = center_P + rvec.a; - raw[q_axis] = center_Q + rvec.b; - #if ENABLED(AUTO_BED_LEVELING_UBL) - raw[l_axis] = start_L; - UNUSED(linear_per_segment); + raw[p_axis] = center_P + r_P; + raw[q_axis] = center_Q + r_Q; + raw[l_axis] += linear_per_segment; + raw[E_AXIS] += extruder_per_segment; + + clamp_to_software_endstops(raw); + + #if HAS_FEEDRATE_SCALING + inverse_kinematics(raw); + ADJUST_DELTA(raw); + #endif + + #if ENABLED(SCARA_FEEDRATE_SCALING) + // For SCARA scale the feed rate from mm/s to degrees/s + // i.e., Complete the angular vector in the given time. + if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], raw[Z_AXIS], raw[E_AXIS], HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs, active_extruder, MM_PER_ARC_SEGMENT)) + break; + oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; + #elif ENABLED(DELTA_FEEDRATE_SCALING) + // For DELTA scale the feed rate from Effector mm/s to Carriage mm/s + // i.e., Complete the linear vector in the given time. + if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs, active_extruder, MM_PER_ARC_SEGMENT)) + break; + oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; oldC = delta[C_AXIS]; + #elif HAS_UBL_AND_CURVES + float pos[XYZ] = { raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS] }; + planner.apply_leveling(pos); + if (!planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], raw[E_AXIS], fr_mm_s, active_extruder, MM_PER_ARC_SEGMENT)) + break; #else - raw[l_axis] += linear_per_segment; + if (!planner.buffer_line_kinematic(raw, fr_mm_s, active_extruder)) + break; #endif - raw.e += extruder_per_segment; - - apply_motion_limits(raw); - - #if HAS_LEVELING && !PLANNER_LEVELING - planner.apply_leveling(raw); - #endif - - if (!planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, 0 - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - )) break; } // Ensure last segment arrives at target location. - raw = cart; - TERN_(AUTO_BED_LEVELING_UBL, raw[l_axis] = start_L); - - apply_motion_limits(raw); - - #if HAS_LEVELING && !PLANNER_LEVELING - planner.apply_leveling(raw); + #if HAS_FEEDRATE_SCALING + inverse_kinematics(cart); + ADJUST_DELTA(cart); #endif - planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, 0 - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - ); - - TERN_(AUTO_BED_LEVELING_UBL, raw[l_axis] = start_L); - current_position = raw; + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB); + if (diff2) + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], cart[Z_AXIS], cart[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder, MM_PER_ARC_SEGMENT); + #elif ENABLED(DELTA_FEEDRATE_SCALING) + const float diff2 = sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC); + if (diff2) + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], cart[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder, MM_PER_ARC_SEGMENT); + #elif HAS_UBL_AND_CURVES + float pos[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] }; + planner.apply_leveling(pos); + planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], cart[E_AXIS], fr_mm_s, active_extruder, MM_PER_ARC_SEGMENT); + #else + planner.buffer_line_kinematic(cart, fr_mm_s, active_extruder); + #endif + COPY(current_position, cart); } // plan_arc /** * G2: Clockwise Arc * G3: Counterclockwise Arc * - * This command has two forms: IJ-form (JK, KI) and R-form. + * This command has two forms: IJ-form and R-form. * - * - Depending on the current Workspace Plane orientation, - * use parameters IJ/JK/KI to specify the XY/YZ/ZX offsets. - * At least one of the IJ/JK/KI parameters is required. - * XY/YZ/ZX can be omitted to do a complete circle. - * The given XY/YZ/ZX is not error-checked. The arc ends - * based on the angle of the destination. - * Mixing IJ/JK/KI with R will throw an error. + * - I specifies an X offset. J specifies a Y offset. + * At least one of the IJ parameters is required. + * X and Y can be omitted to do a complete circle. + * The given XY is not error-checked. The arc ends + * based on the angle of the destination. + * Mixing I or J with R will throw an error. * - * - R specifies the radius. X or Y (Y or Z / Z or X) is required. - * Omitting both XY/YZ/ZX will throw an error. - * XY/YZ/ZX must differ from the current XY/YZ/ZX. - * Mixing R with IJ/JK/KI will throw an error. + * - R specifies the radius. X or Y is required. + * Omitting both X and Y will throw an error. + * X or Y must differ from the current XY. + * Mixing R with I or J will throw an error. * * - P specifies the number of full circles to do * before the specified arc move. @@ -280,50 +283,44 @@ void GcodeSuite::G2_G3(const bool clockwise) { relative_mode = true; #endif - get_destination_from_command(); // Get X Y Z E F (and set cutter power) + get_destination_from_command(); - TERN_(SF_ARC_FIX, relative_mode = relative_mode_backup); + #if ENABLED(SF_ARC_FIX) + relative_mode = relative_mode_backup; + #endif - ab_float_t arc_offset = { 0, 0 }; + float arc_offset[2] = { 0, 0 }; if (parser.seenval('R')) { - const float r = parser.value_linear_units(); - if (r) { - const xy_pos_t p1 = current_position, p2 = destination; - if (p1 != p2) { - const xy_pos_t d2 = (p2 - p1) * 0.5f; // XY vector to midpoint of move from current - const float e = clockwise ^ (r < 0) ? -1 : 1, // clockwise -1/1, counterclockwise 1/-1 - len = d2.magnitude(), // Distance to mid-point of move from current - h2 = (r - len) * (r + len), // factored to reduce rounding error - h = (h2 >= 0) ? SQRT(h2) : 0.0f; // Distance to the arc pivot-point from midpoint - const xy_pos_t s = { -d2.y, d2.x }; // Perpendicular bisector. (Divide by len for unit vector.) - arc_offset = d2 + s / len * e * h; // The calculated offset (mid-point if |r| <= len) - } + const float r = parser.value_linear_units(), + p1 = current_position[X_AXIS], q1 = current_position[Y_AXIS], + p2 = destination[X_AXIS], q2 = destination[Y_AXIS]; + if (r && (p2 != p1 || q2 != q1)) { + const float e = clockwise ^ (r < 0) ? -1 : 1, // clockwise -1/1, counterclockwise 1/-1 + dx = p2 - p1, dy = q2 - q1, // X and Y differences + d = HYPOT(dx, dy), // Linear distance between the points + dinv = 1/d, // Inverse of d + h = SQRT(sq(r) - sq(d * 0.5f)), // Distance to the arc pivot-point + mx = (p1 + p2) * 0.5f, my = (q1 + q2) * 0.5f,// Point between the two points + sx = -dy * dinv, sy = dx * dinv, // Slope of the perpendicular bisector + cx = mx + e * h * sx, cy = my + e * h * sy; // Pivot-point of the arc + arc_offset[0] = cx - p1; + arc_offset[1] = cy - q1; } } else { - #if ENABLED(CNC_WORKSPACE_PLANES) - char achar, bchar; - switch (gcode.workspace_plane) { - default: - case GcodeSuite::PLANE_XY: achar = 'I'; bchar = 'J'; break; - case GcodeSuite::PLANE_YZ: achar = 'J'; bchar = 'K'; break; - case GcodeSuite::PLANE_ZX: achar = 'K'; bchar = 'I'; break; - } - #else - constexpr char achar = 'I', bchar = 'J'; - #endif - if (parser.seenval(achar)) arc_offset.a = parser.value_linear_units(); - if (parser.seenval(bchar)) arc_offset.b = parser.value_linear_units(); + if (parser.seenval('I')) arc_offset[0] = parser.value_linear_units(); + if (parser.seenval('J')) arc_offset[1] = parser.value_linear_units(); } - if (arc_offset) { + if (arc_offset[0] || arc_offset[1]) { #if ENABLED(ARC_P_CIRCLES) // P indicates number of circles to do int8_t circles_to_do = parser.byteval('P'); - if (!WITHIN(circles_to_do, 0, 100)) - SERIAL_ERROR_MSG(STR_ERR_ARC_ARGS); - + if (!WITHIN(circles_to_do, 0, 100)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_ARC_ARGS); + } while (circles_to_do--) plan_arc(current_position, arc_offset, clockwise); #endif @@ -332,8 +329,11 @@ void GcodeSuite::G2_G3(const bool clockwise) { plan_arc(destination, arc_offset, clockwise); reset_stepper_timeout(); } - else - SERIAL_ERROR_MSG(STR_ERR_ARC_ARGS); + else { + // Bad arguments + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_ARC_ARGS); + } } } diff --git a/Marlin/src/gcode/motion/G4.cpp b/Marlin/src/gcode/motion/G4.cpp index 3a37fe5b2c..7d53cb0304 100644 --- a/Marlin/src/gcode/motion/G4.cpp +++ b/Marlin/src/gcode/motion/G4.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -35,10 +35,10 @@ void GcodeSuite::G4() { planner.synchronize(); #if ENABLED(NANODLP_Z_SYNC) - SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); + SERIAL_ECHOLNPGM(MSG_Z_MOVE_COMP); #endif - if (!ui.has_status()) LCD_MESSAGEPGM(MSG_DWELL); + if (!lcd_hasstatus()) LCD_MESSAGEPGM(MSG_DWELL); dwell(dwell_ms); } diff --git a/Marlin/src/gcode/motion/G5.cpp b/Marlin/src/gcode/motion/G5.cpp index 2c98fae845..8cd70da15d 100644 --- a/Marlin/src/gcode/motion/G5.cpp +++ b/Marlin/src/gcode/motion/G5.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,15 +27,20 @@ #include "../../module/motion.h" #include "../../module/planner_bezier.h" +void plan_cubic_move(const float (&cart)[XYZE], const float (&offset)[4]) { + cubic_b_spline(current_position, cart, offset, MMS_SCALED(feedrate_mm_s), active_extruder); + COPY(current_position, cart); +} + /** * Parameters interpreted according to: - * https://linuxcnc.org/docs/2.7/html/gcode/g-code.html#gcode:g5 + * http://linuxcnc.org/docs/2.6/html/gcode/parser.html#sec:G5-Cubic-Spline * However I, J omission is not supported at this point; all * parameters can be omitted and default to zero. */ #include "../gcode.h" -#include "../../MarlinCore.h" // for IsRunning() +#include "../../Marlin.h" // for IsRunning() /** * G5: Cubic B-spline @@ -45,20 +50,22 @@ void GcodeSuite::G5() { #if ENABLED(CNC_WORKSPACE_PLANES) if (workspace_plane != PLANE_XY) { - SERIAL_ERROR_MSG(STR_ERR_BAD_PLANE_MODE); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_BAD_PLANE_MODE); return; } #endif get_destination_from_command(); - const xy_pos_t offsets[2] = { - { parser.linearval('I'), parser.linearval('J') }, - { parser.linearval('P'), parser.linearval('Q') } + const float offset[4] = { + parser.linearval('I'), + parser.linearval('J'), + parser.linearval('P'), + parser.linearval('Q') }; - cubic_b_spline(current_position, destination, offsets, MMS_SCALED(feedrate_mm_s), active_extruder); - current_position = destination; + plan_cubic_move(destination, offset); } } diff --git a/Marlin/src/gcode/motion/G6.cpp b/Marlin/src/gcode/motion/G6.cpp deleted file mode 100644 index 168dc28abd..0000000000 --- a/Marlin/src/gcode/motion/G6.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../inc/MarlinConfig.h" - -#if ENABLED(DIRECT_STEPPING) - -#include "../../feature/direct_stepping.h" - -#include "../gcode.h" -#include "../../module/planner.h" - -/** - * G6: Direct Stepper Move - */ -void GcodeSuite::G6() { - // TODO: feedrate support? - if (parser.seen('R')) - planner.last_page_step_rate = parser.value_ulong(); - - if (!DirectStepping::Config::DIRECTIONAL) { - if (parser.seen('X')) planner.last_page_dir.x = !!parser.value_byte(); - if (parser.seen('Y')) planner.last_page_dir.y = !!parser.value_byte(); - if (parser.seen('Z')) planner.last_page_dir.z = !!parser.value_byte(); - if (parser.seen('E')) planner.last_page_dir.e = !!parser.value_byte(); - } - - // No index means we just set the state - if (!parser.seen('I')) return; - - // No speed is set, can't schedule the move - if (!planner.last_page_step_rate) return; - - const page_idx_t page_idx = (page_idx_t) parser.value_ulong(); - - uint16_t num_steps = DirectStepping::Config::TOTAL_STEPS; - if (parser.seen('S')) num_steps = parser.value_ushort(); - - planner.buffer_page(page_idx, 0, num_steps); - reset_stepper_timeout(); -} - -#endif // DIRECT_STEPPING diff --git a/Marlin/src/gcode/motion/G80.cpp b/Marlin/src/gcode/motion/G80.cpp deleted file mode 100644 index f674596ddd..0000000000 --- a/Marlin/src/gcode/motion/G80.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(GCODE_MOTION_MODES) - -#include "../gcode.h" - -/** - * G80: Cancel current motion mode - */ -void GcodeSuite::G80() { - - parser.cancel_motion_mode(); - -} - -#endif // GCODE_MOTION_MODES diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index 18cc161fce..00426ad231 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,7 +25,6 @@ #if ENABLED(BABYSTEPPING) #include "../gcode.h" -#include "../../feature/babystep.h" #include "../../module/probe.h" #include "../../module/temperature.h" #include "../../module/planner.h" @@ -34,104 +33,37 @@ #include "../../core/serial.h" #endif -#if ENABLED(MESH_BED_LEVELING) - #include "../../feature/bedlevel/bedlevel.h" -#endif #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - - FORCE_INLINE void mod_probe_offset(const float &offs) { - if (TERN1(BABYSTEP_HOTEND_Z_OFFSET, active_extruder == 0)) { - probe.offset.z += offs; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET " " STR_Z, probe.offset.z); - } - else { - #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) - hotend_offset[active_extruder].z -= offs; - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET STR_Z ": ", hotend_offset[active_extruder].z); - #endif - } + FORCE_INLINE void mod_zprobe_zoffset(const float &offs) { + zprobe_zoffset += offs; + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(MSG_PROBE_Z_OFFSET ": ", zprobe_zoffset); } - #endif /** * M290: Babystepping - * - * Send 'R' or no parameters for a report. - * - * X - Distance to step X - * Y - Distance to step Y - * Z - Distance to step Z - * S - Distance to step Z (alias for Z) - * - * With BABYSTEP_ZPROBE_OFFSET: - * P0 - Don't adjust the Z probe offset */ void GcodeSuite::M290() { #if ENABLED(BABYSTEP_XY) - LOOP_XYZ(a) - if (parser.seenval(XYZ_CHAR(a)) || (a == Z_AXIS && parser.seenval('S'))) { + for (uint8_t a = X_AXIS; a <= Z_AXIS; a++) + if (parser.seenval(axis_codes[a]) || (a == Z_AXIS && parser.seenval('S'))) { const float offs = constrain(parser.value_axis_units((AxisEnum)a), -2, 2); - babystep.add_mm((AxisEnum)a, offs); + thermalManager.babystep_axis((AxisEnum)a, offs * planner.axis_steps_per_mm[a]); #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - if (a == Z_AXIS && (!parser.seen('P') || parser.value_bool())) mod_probe_offset(offs); + if (a == Z_AXIS && (!parser.seen('P') || parser.value_bool())) mod_zprobe_zoffset(offs); #endif } #else if (parser.seenval('Z') || parser.seenval('S')) { const float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2); - babystep.add_mm(Z_AXIS, offs); + thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]); #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - if (!parser.seen('P') || parser.value_bool()) mod_probe_offset(offs); + if (!parser.seen('P') || parser.value_bool()) mod_zprobe_zoffset(offs); #endif } #endif - - if (!parser.seen("XYZ") || parser.seen('R')) { - SERIAL_ECHO_START(); - - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET " " STR_Z, probe.offset.z); - #endif - - #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) - { - SERIAL_ECHOLNPAIR_P( - PSTR("Hotend "), int(active_extruder) - #if ENABLED(BABYSTEP_XY) - , PSTR("Offset X"), hotend_offset[active_extruder].x - , SP_Y_STR, hotend_offset[active_extruder].y - , SP_Z_STR - #else - , PSTR("Offset Z") - #endif - , hotend_offset[active_extruder].z - ); - } - #endif - - #if ENABLED(MESH_BED_LEVELING) - SERIAL_ECHOLNPAIR("MBL Adjust Z", mbl.z_offset); - #endif - - #if ENABLED(BABYSTEP_DISPLAY_TOTAL) - { - SERIAL_ECHOLNPAIR_P( - #if ENABLED(BABYSTEP_XY) - PSTR("Babystep X"), babystep.axis_total[X_AXIS] - , SP_Y_STR, babystep.axis_total[Y_AXIS] - , SP_Z_STR - #else - PSTR("Babystep Z") - #endif - , babystep.axis_total[BS_TOTAL_IND(Z_AXIS)] - ); - } - #endif - } } #endif // BABYSTEPPING diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 9c5085b97e..392532646c 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -26,9 +26,9 @@ #include "parser.h" -#include "../MarlinCore.h" +#include "../Marlin.h" -#if HAS_MULTI_SERIAL +#if NUM_SERIAL > 1 #include "queue.h" #endif @@ -42,7 +42,7 @@ bool GCodeParser::volumetric_enabled; #endif #if ENABLED(TEMPERATURE_UNITS_SUPPORT) - TempUnit GCodeParser::input_temp_units = TEMPUNIT_C; + TempUnit GCodeParser::input_temp_units; #endif char *GCodeParser::command_ptr, @@ -50,18 +50,10 @@ char *GCodeParser::command_ptr, *GCodeParser::value_ptr; char GCodeParser::command_letter; int GCodeParser::codenum; - -#if ENABLED(USE_GCODE_SUBCODES) +#if USE_GCODE_SUBCODES uint8_t GCodeParser::subcode; #endif -#if ENABLED(GCODE_MOTION_MODES) - int16_t GCodeParser::motion_mode_codenum = -1; - #if ENABLED(USE_GCODE_SUBCODES) - uint8_t GCodeParser::motion_mode_subcode; - #endif -#endif - #if ENABLED(FASTER_GCODE_PARSER) // Optimized Parameters uint32_t GCodeParser::codebits; // found bits @@ -80,54 +72,32 @@ GCodeParser parser; * this may be optimized by commenting out ZERO(param) */ void GCodeParser::reset() { - string_arg = nullptr; // No whole line argument + string_arg = NULL; // No whole line argument command_letter = '?'; // No command letter codenum = 0; // No command code - TERN_(USE_GCODE_SUBCODES, subcode = 0); // No command sub-code + #if USE_GCODE_SUBCODES + subcode = 0; // No command sub-code + #endif #if ENABLED(FASTER_GCODE_PARSER) codebits = 0; // No codes yet //ZERO(param); // No parameters (should be safe to comment out this line) #endif } -#if ENABLED(GCODE_QUOTED_STRINGS) - - // Pass the address after the first quote (if any) - char* GCodeParser::unescape_string(char* &src) { - if (*src == '"') ++src; // Skip the leading quote - char * const out = src; // Start of the string - char *dst = src; // Prepare to unescape and terminate - for (;;) { - char c = *src++; // Get the next char - switch (c) { - case '\\': c = *src++; break; // Get the escaped char - case '"' : c = '\0'; break; // Convert bare quote to nul - } - if (!(*dst++ = c)) break; // Copy and break on nul - } - return out; - } - -#endif - // Populate all fields by parsing a single line of GCode // 58 bytes of SRAM are used to speed up seen/value void GCodeParser::parse(char *p) { reset(); // No codes to report - auto uppercase = [](char c) { - if (TERN0(GCODE_CASE_INSENSITIVE, WITHIN(c, 'a', 'z'))) - c += 'A' - 'a'; - return c; - }; - // Skip spaces while (*p == ' ') ++p; // Skip N[-0-9] if included in the command line - if (uppercase(*p) == 'N' && NUMERIC_SIGNED(p[1])) { - //TERN_(FASTER_GCODE_PARSER, set('N', p + 1)); // (optional) Set the 'N' parameter value + if (*p == 'N' && NUMERIC_SIGNED(p[1])) { + #if ENABLED(FASTER_GCODE_PARSER) + //set('N', p + 1); // (optional) Set the 'N' parameter value + #endif p += 2; // skip N[-0-9] while (NUMERIC(*p)) ++p; // skip [0-9]* while (*p == ' ') ++p; // skip [ ]* @@ -137,7 +107,7 @@ void GCodeParser::parse(char *p) { command_ptr = p; // Get the command letter, which must be G, M, or T - const char letter = uppercase(*p++); + const char letter = *p++; // Nullify asterisk and trailing whitespace char *starpos = strchr(p, '*'); @@ -147,92 +117,36 @@ void GCodeParser::parse(char *p) { starpos[1] = '\0'; } - #if ANY(MARLIN_DEV_MODE, SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) - #define SIGNED_CODENUM 1 + // Bail if the letter is not G, M, or T + switch (letter) { case 'G': case 'M': case 'T': break; default: return; } + + // Skip spaces to get the numeric part + while (*p == ' ') p++; + + // Bail if there's no command code number + if (!NUMERIC(*p)) return; + + // Save the command letter at this point + // A '?' signifies an unknown command + command_letter = letter; + + // Get the code number - integer digits only + codenum = 0; + do { + codenum *= 10, codenum += *p++ - '0'; + } while (NUMERIC(*p)); + + // Allow for decimal point in command + #if USE_GCODE_SUBCODES + if (*p == '.') { + p++; + while (NUMERIC(*p)) + subcode *= 10, subcode += *p++ - '0'; + } #endif - // Bail if the letter is not G, M, or T - // (or a valid parameter for the current motion mode) - switch (letter) { - - case 'G': case 'M': case 'T': TERN_(MARLIN_DEV_MODE, case 'D':) - // Skip spaces to get the numeric part - while (*p == ' ') p++; - - #if ENABLED(PRUSA_MMU2) - if (letter == 'T') { - // check for special MMU2 T?/Tx/Tc commands - if (*p == '?' || *p == 'x' || *p == 'c') { - command_letter = letter; - string_arg = p; - return; - } - } - #endif - - // Bail if there's no command code number - if (!TERN(SIGNED_CODENUM, NUMERIC_SIGNED(*p), NUMERIC(*p))) return; - - // Save the command letter at this point - // A '?' signifies an unknown command - command_letter = letter; - - { - #if ENABLED(SIGNED_CODENUM) - int sign = 1; // Allow for a negative code like D-1 or T-1 - if (*p == '-') { sign = -1; ++p; } - #endif - - // Get the code number - integer digits only - codenum = 0; - - do { codenum = codenum * 10 + *p++ - '0'; } while (NUMERIC(*p)); - - // Apply the sign, if any - TERN_(SIGNED_CODENUM, codenum *= sign); - } - - // Allow for decimal point in command - #if ENABLED(USE_GCODE_SUBCODES) - if (*p == '.') { - p++; - while (NUMERIC(*p)) - subcode = subcode * 10 + *p++ - '0'; - } - #endif - - // Skip all spaces to get to the first argument, or nul - while (*p == ' ') p++; - - #if ENABLED(GCODE_MOTION_MODES) - if (letter == 'G' - && (codenum <= TERN(ARC_SUPPORT, 3, 1) || codenum == 5 || TERN0(G38_PROBE_TARGET, codenum == 38)) - ) { - motion_mode_codenum = codenum; - TERN_(USE_GCODE_SUBCODES, motion_mode_subcode = subcode); - } - #endif - - break; - - #if ENABLED(GCODE_MOTION_MODES) - #if ENABLED(ARC_SUPPORT) - case 'I' ... 'J': case 'R': - if (motion_mode_codenum != 2 && motion_mode_codenum != 3) return; - #endif - case 'P' ... 'Q': - if (motion_mode_codenum != 5) return; - case 'X' ... 'Z': case 'E' ... 'F': - if (motion_mode_codenum < 0) return; - command_letter = 'G'; - codenum = motion_mode_codenum; - TERN_(USE_GCODE_SUBCODES, subcode = motion_mode_subcode); - p--; // Back up one character to use the current parameter - break; - #endif // GCODE_MOTION_MODES - - default: return; - } + // Skip all spaces to get to the first argument, or nul + while (*p == ' ') p++; // The command parameters (if any) start here, for sure! @@ -241,18 +155,7 @@ void GCodeParser::parse(char *p) { #endif // Only use string_arg for these M codes - if (letter == 'M') switch (codenum) { - #if ENABLED(GCODE_MACROS) - case 810 ... 819: - #endif - #if ENABLED(EXPECTED_PRINTER_CHECK) - case 16: - #endif - case 23: case 28: case 30: case 117 ... 118: case 928: - string_arg = unescape_string(p); - return; - default: break; - } + if (letter == 'M') switch (codenum) { case 23: case 28: case 30: case 117: case 118: case 928: string_arg = p; return; default: break; } #if ENABLED(DEBUG_GCODE_PARSER) const bool debug = codenum == 800; @@ -266,66 +169,53 @@ void GCodeParser::parse(char *p) { * This allows M0/M1 with expire time to work: "M0 S5 You Win!" * For 'M118' you must use 'E1' and 'A1' rather than just 'E' or 'A' */ - #if ENABLED(GCODE_QUOTED_STRINGS) - bool quoted_string_arg = false; - #endif - string_arg = nullptr; - while (const char param = uppercase(*p++)) { // Get the next parameter. A NUL ends the loop + string_arg = NULL; + while (const char code = *p++) { // Get the next parameter. A NUL ends the loop // Special handling for M32 [P] !/path/to/file.g# // The path must be the last parameter - if (param == '!' && letter == 'M' && codenum == 32) { + if (code == '!' && letter == 'M' && codenum == 32) { string_arg = p; // Name starts after '!' char * const lb = strchr(p, '#'); // Already seen '#' as SD char (to pause buffering) if (lb) *lb = '\0'; // Safe to mark the end of the filename return; } - #if ENABLED(GCODE_QUOTED_STRINGS) - if (!quoted_string_arg && param == '"') { - quoted_string_arg = true; - string_arg = unescape_string(p); - } - #endif - + // Arguments MUST be uppercase for fast GCode parsing #if ENABLED(FASTER_GCODE_PARSER) - // Arguments MUST be uppercase for fast GCode parsing - #define PARAM_OK(P) WITHIN((P), 'A', 'Z') + #define PARAM_TEST WITHIN(code, 'A', 'Z') #else - #define PARAM_OK(P) true + #define PARAM_TEST true #endif - if (PARAM_OK(param)) { + if (PARAM_TEST) { while (*p == ' ') p++; // Skip spaces between parameters & values - #if ENABLED(GCODE_QUOTED_STRINGS) - const bool is_str = (*p == '"'), has_val = is_str || valid_float(p); - char * const valptr = has_val ? is_str ? unescape_string(p) : p : nullptr; - #else - const bool has_val = valid_float(p); - #if ENABLED(FASTER_GCODE_PARSER) - char * const valptr = has_val ? p : nullptr; - #endif - #endif + const bool has_num = valid_float(p); #if ENABLED(DEBUG_GCODE_PARSER) if (debug) { - SERIAL_ECHOPAIR("Got param ", param, " at index ", (int)(p - command_ptr - 1)); - if (has_val) SERIAL_ECHOPGM(" (has_val)"); + SERIAL_ECHOPAIR("Got letter ", code); + SERIAL_ECHOPAIR(" at index ", (int)(p - command_ptr - 1)); + if (has_num) SERIAL_ECHOPGM(" (has_num)"); } #endif - if (!has_val && !string_arg) { // No value? First time, keep as string_arg + if (!has_num && !string_arg) { // No value? First time, keep as string_arg string_arg = p - 1; #if ENABLED(DEBUG_GCODE_PARSER) if (debug) SERIAL_ECHOPAIR(" string_arg: ", hex_address((void*)string_arg)); // DEBUG #endif } - if (TERN0(DEBUG_GCODE_PARSER, debug)) SERIAL_EOL(); + #if ENABLED(DEBUG_GCODE_PARSER) + if (debug) SERIAL_EOL(); + #endif - TERN_(FASTER_GCODE_PARSER, set(param, valptr)); // Set parameter exists and pointer (nullptr for no value) + #if ENABLED(FASTER_GCODE_PARSER) + set(code, has_num ? p : NULL); // Set parameter exists and pointer (NULL for no number) + #endif } else if (!string_arg) { // Not A-Z? First time, keep as the string_arg string_arg = p - 1; @@ -350,7 +240,7 @@ void GCodeParser::parse(char *p) { if (next_command) { while (*next_command && *next_command != ' ') ++next_command; while (*next_command == ' ') ++next_command; - if (!*next_command) next_command = nullptr; + if (!*next_command) next_command = NULL; } #else const char *next_command = command_args; @@ -361,48 +251,56 @@ void GCodeParser::parse(char *p) { #endif // CNC_COORDINATE_SYSTEMS -void GCodeParser::unknown_command_warning() { - SERIAL_ECHO_MSG(STR_UNKNOWN_COMMAND, command_ptr, "\""); +void GCodeParser::unknown_command_error() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPAIR_P(port, MSG_UNKNOWN_COMMAND, command_ptr); + SERIAL_CHAR_P(port, '"'); + SERIAL_EOL_P(port); } #if ENABLED(DEBUG_GCODE_PARSER) void GCodeParser::debug() { - SERIAL_ECHOPAIR("Command: ", command_ptr, " (", command_letter); + SERIAL_ECHOPAIR("Command: ", command_ptr); + SERIAL_ECHOPAIR(" (", command_letter); SERIAL_ECHO(codenum); SERIAL_ECHOLNPGM(")"); #if ENABLED(FASTER_GCODE_PARSER) - SERIAL_ECHOPGM(" args: { "); - for (char c = 'A'; c <= 'Z'; ++c) if (seen(c)) SERIAL_CHAR(c, ' '); - SERIAL_CHAR('}'); + SERIAL_ECHOPGM(" args: \""); + for (char c = 'A'; c <= 'Z'; ++c) + if (seen(c)) { SERIAL_CHAR(c); SERIAL_CHAR(' '); } #else - SERIAL_ECHOPAIR(" args: { ", command_args, " }"); + SERIAL_ECHOPAIR(" args: \"", command_args); #endif + SERIAL_CHAR('"'); if (string_arg) { - SERIAL_ECHOPAIR(" string: \"", string_arg); + SERIAL_ECHOPGM(" string: \""); + SERIAL_ECHO(string_arg); SERIAL_CHAR('"'); } - SERIAL_ECHOLNPGM("\n"); + SERIAL_ECHOPGM("\n\n"); for (char c = 'A'; c <= 'Z'; ++c) { if (seen(c)) { SERIAL_ECHOPAIR("Code '", c); SERIAL_ECHOPGM("':"); if (has_value()) { - SERIAL_ECHOLNPAIR( - "\n float: ", value_float(), - "\n long: ", value_long(), - "\n ulong: ", value_ulong(), - "\n millis: ", value_millis(), - "\n sec-ms: ", value_millis_from_seconds(), - "\n int: ", value_int(), - "\n ushort: ", value_ushort(), - "\n byte: ", (int)value_byte(), - "\n bool: ", (int)value_bool(), - "\n linear: ", value_linear_units(), - "\n celsius: ", value_celsius() - ); + SERIAL_ECHOPAIR("\n float: ", value_float()); + SERIAL_ECHOPAIR("\n long: ", value_long()); + SERIAL_ECHOPAIR("\n ulong: ", value_ulong()); + SERIAL_ECHOPAIR("\n millis: ", value_millis()); + SERIAL_ECHOPAIR("\n sec-ms: ", value_millis_from_seconds()); + SERIAL_ECHOPAIR("\n int: ", value_int()); + SERIAL_ECHOPAIR("\n ushort: ", value_ushort()); + SERIAL_ECHOPAIR("\n byte: ", (int)value_byte()); + SERIAL_ECHOPAIR("\n bool: ", (int)value_bool()); + SERIAL_ECHOPAIR("\n linear: ", value_linear_units()); + SERIAL_ECHOPAIR("\n celsius: ", value_celsius()); } else - SERIAL_ECHOLNPGM(" (no value)"); + SERIAL_ECHOPGM(" (no value)"); + SERIAL_ECHOPGM("\n\n"); } } } diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 42b85ca271..1665304f77 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * parser.h - Parser for a GCode line, providing a parameter interface. @@ -27,19 +26,14 @@ * so settings for these codes are located in this class. */ +#ifndef _PARSER_H_ +#define _PARSER_H_ + #include "../inc/MarlinConfig.h" //#define DEBUG_GCODE_PARSER #if ENABLED(DEBUG_GCODE_PARSER) - #include "../libs/hex_print.h" -#endif - -#if ENABLED(TEMPERATURE_UNITS_SUPPORT) - typedef enum : uint8_t { TEMPUNIT_C, TEMPUNIT_K, TEMPUNIT_F } TempUnit; -#endif - -#if ENABLED(INCH_MODE_SUPPORT) - typedef enum : uint8_t { LINEARUNIT_MM, LINEARUNIT_INCH } LinearUnit; + #include "../libs/hex_print_routines.h" #endif /** @@ -82,19 +76,12 @@ public: // Command line state static char *command_ptr, // The command, so it can be echoed - *string_arg, // string of command line - command_letter; // G, M, or T - static int codenum; // 123 - #if ENABLED(USE_GCODE_SUBCODES) - static uint8_t subcode; // .1 - #endif + *string_arg; // string of command line - #if ENABLED(GCODE_MOTION_MODES) - static int16_t motion_mode_codenum; - #if ENABLED(USE_GCODE_SUBCODES) - static uint8_t motion_mode_subcode; - #endif - FORCE_INLINE static void cancel_motion_mode() { motion_mode_codenum = -1; } + static char command_letter; // G, M, or T + static int codenum; // 123 + #if USE_GCODE_SUBCODES + static uint8_t subcode; // .1 #endif #if ENABLED(DEBUG_GCODE_PARSER) @@ -114,11 +101,6 @@ public: return valid_signless(p) || ((p[0] == '-' || p[0] == '+') && valid_signless(&p[1])); // [-+]?.?[0-9] } - FORCE_INLINE static bool valid_number(const char * const p) { - // TODO: With MARLIN_DEV_MODE allow HEX values starting with "x" - return valid_float(p); - } - #if ENABLED(FASTER_GCODE_PARSER) FORCE_INLINE static bool valid_int(const char * const p) { @@ -126,14 +108,15 @@ public: } // Set the flag and pointer for a parameter - static inline void set(const char c, char * const ptr) { + static void set(const char c, char * const ptr) { const uint8_t ind = LETTER_BIT(c); if (ind >= COUNT(param)) return; // Only A-Z SBI32(codebits, ind); // parameter exists param[ind] = ptr ? ptr - command_ptr : 0; // parameter offset or 0 #if ENABLED(DEBUG_GCODE_PARSER) if (codenum == 800) { - SERIAL_ECHOPAIR("Set bit ", (int)ind, " of codebits (", hex_address((void*)(codebits >> 16))); + SERIAL_ECHOPAIR("Set bit ", (int)ind); + SERIAL_ECHOPAIR(" of codebits (", hex_address((void*)(codebits >> 16))); print_hex_word((uint16_t)(codebits & 0xFFFF)); SERIAL_ECHOLNPAIR(") | param = ", (int)param[ind]); } @@ -142,99 +125,43 @@ public: // Code seen bit was set. If not found, value_ptr is unchanged. // This allows "if (seen('A')||seen('B'))" to use the last-found value. - static inline bool seen(const char c) { + static bool seen(const char c) { const uint8_t ind = LETTER_BIT(c); if (ind >= COUNT(param)) return false; // Only A-Z const bool b = TEST32(codebits, ind); if (b) { - if (param[ind]) { - char * const ptr = command_ptr + param[ind]; - value_ptr = valid_number(ptr) ? ptr : nullptr; - } - else - value_ptr = nullptr; + char * const ptr = command_ptr + param[ind]; + value_ptr = param[ind] && valid_float(ptr) ? ptr : (char*)NULL; } return b; } - FORCE_INLINE static constexpr uint32_t letter_bits(const char * const str) { - return (str[0] ? _BV32(LETTER_BIT(str[0])) | - (str[1] ? _BV32(LETTER_BIT(str[1])) | - (str[2] ? _BV32(LETTER_BIT(str[2])) | - (str[3] ? _BV32(LETTER_BIT(str[3])) | - (str[4] ? _BV32(LETTER_BIT(str[4])) | - (str[5] ? _BV32(LETTER_BIT(str[5])) | - (str[6] ? _BV32(LETTER_BIT(str[6])) | - (str[7] ? _BV32(LETTER_BIT(str[7])) | - (str[8] ? _BV32(LETTER_BIT(str[8])) | - (str[9] ? _BV32(LETTER_BIT(str[9])) - : 0) : 0) : 0) : 0) : 0) : 0) : 0) : 0) : 0) : 0); - } + static bool seen_any() { return !!codebits; } - // At least one of a list of code letters was seen - #ifdef CPU_32_BIT - FORCE_INLINE static bool seen(const char * const str) { return !!(codebits & letter_bits(str)); } - #else - FORCE_INLINE static bool seen(const char * const str) { - const uint32_t letrbits = letter_bits(str); - const uint8_t * const cb = (uint8_t*)&codebits; - const uint8_t * const lb = (uint8_t*)&letrbits; - return (cb[0] & lb[0]) || (cb[1] & lb[1]) || (cb[2] & lb[2]) || (cb[3] & lb[3]); - } - #endif - - static inline bool seen_any() { return !!codebits; } - - FORCE_INLINE static bool seen_test(const char c) { return TEST32(codebits, LETTER_BIT(c)); } + #define SEEN_TEST(L) TEST32(codebits, LETTER_BIT(L)) #else // !FASTER_GCODE_PARSER - #if ENABLED(GCODE_CASE_INSENSITIVE) - FORCE_INLINE static char* strgchr(char *p, char g) { - auto uppercase = [](char c) { - return c + (WITHIN(c, 'a', 'z') ? 'A' - 'a' : 0); - }; - const char d = uppercase(g); - for (char cc; (cc = uppercase(*p)); p++) if (cc == d) return p; - return nullptr; - } - #else - #define strgchr strchr - #endif - // Code is found in the string. If not found, value_ptr is unchanged. // This allows "if (seen('A')||seen('B'))" to use the last-found value. - static inline bool seen(const char c) { - char *p = strgchr(command_args, c); + static bool seen(const char c) { + char *p = strchr(command_args, c); const bool b = !!p; - if (b) value_ptr = valid_number(&p[1]) ? &p[1] : nullptr; + if (b) value_ptr = valid_float(&p[1]) ? &p[1] : (char*)NULL; return b; } - static inline bool seen_any() { return *command_args == '\0'; } + static bool seen_any() { return *command_args == '\0'; } - FORCE_INLINE static bool seen_test(const char c) { return (bool)strgchr(command_args, c); } - - // At least one of a list of code letters was seen - static inline bool seen(const char * const str) { - for (uint8_t i = 0; const char c = str[i]; i++) - if (seen_test(c)) return true; - return false; - } + #define SEEN_TEST(L) !!strchr(command_args, L) #endif // !FASTER_GCODE_PARSER // Seen any axis parameter - static inline bool seen_axis() { - return seen_test('X') || seen_test('Y') || seen_test('Z') || seen_test('E'); + static bool seen_axis() { + return SEEN_TEST('X') || SEEN_TEST('Y') || SEEN_TEST('Z') || SEEN_TEST('E'); } - #if ENABLED(GCODE_QUOTED_STRINGS) - static char* unescape_string(char* &src); - #else - FORCE_INLINE static char* unescape_string(char* &src) { return src; } - #endif - // Populate all fields by parsing a single line of GCode // This uses 54 bytes of SRAM to speed up seen/value static void parse(char * p); @@ -245,14 +172,11 @@ public: #endif // The code value pointer was set - FORCE_INLINE static bool has_value() { return value_ptr != nullptr; } + FORCE_INLINE static bool has_value() { return value_ptr != NULL; } // Seen a parameter with a value static inline bool seenval(const char c) { return seen(c) && has_value(); } - // The value as a string - static inline char* value_string() { return value_ptr; } - // Float removes 'E' to prevent scientific notation interpretation static inline float value_float() { if (value_ptr) { @@ -262,28 +186,28 @@ public: if (c == '\0' || c == ' ') break; if (c == 'E' || c == 'e') { *e = '\0'; - const float ret = strtof(value_ptr, nullptr); + const float ret = strtof(value_ptr, NULL); *e = c; return ret; } ++e; } - return strtof(value_ptr, nullptr); + return strtof(value_ptr, NULL); } return 0; } // Code value as a long or ulong - static inline int32_t value_long() { return value_ptr ? strtol(value_ptr, nullptr, 10) : 0L; } - static inline uint32_t value_ulong() { return value_ptr ? strtoul(value_ptr, nullptr, 10) : 0UL; } + static inline int32_t value_long() { return value_ptr ? strtol(value_ptr, NULL, 10) : 0L; } + static inline uint32_t value_ulong() { return value_ptr ? strtoul(value_ptr, NULL, 10) : 0UL; } // Code value for use as time - static inline millis_t value_millis() { return value_ulong(); } - static inline millis_t value_millis_from_seconds() { return (millis_t)(value_float() * 1000); } + FORCE_INLINE static millis_t value_millis() { return value_ulong(); } + FORCE_INLINE static millis_t value_millis_from_seconds() { return (millis_t)(value_float() * 1000); } // Reduce to fewer bits - static inline int16_t value_int() { return (int16_t)value_long(); } - static inline uint16_t value_ushort() { return (uint16_t)value_long(); } + FORCE_INLINE static int16_t value_int() { return (int16_t)value_long(); } + FORCE_INLINE static uint16_t value_ushort() { return (uint16_t)value_long(); } static inline uint8_t value_byte() { return (uint8_t)constrain(value_long(), 0, 255); } // Bool is true with no value or non-zero @@ -292,17 +216,19 @@ public: // Units modes: Inches, Fahrenheit, Kelvin #if ENABLED(INCH_MODE_SUPPORT) - static inline float mm_to_linear_unit(const float mm) { return mm / linear_unit_factor; } - static inline float mm_to_volumetric_unit(const float mm) { return mm / (volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); } // Init linear units by constructor GCodeParser() { set_input_linear_units(LINEARUNIT_MM); } static inline void set_input_linear_units(const LinearUnit units) { switch (units) { + case LINEARUNIT_INCH: + linear_unit_factor = 25.4f; + break; + case LINEARUNIT_MM: default: - case LINEARUNIT_MM: linear_unit_factor = 1.0f; break; - case LINEARUNIT_INCH: linear_unit_factor = 25.4f; break; + linear_unit_factor = 1; + break; } volumetric_unit_factor = POW(linear_unit_factor, 3); } @@ -311,38 +237,28 @@ public: return (axis >= E_AXIS && volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); } - static inline float linear_value_to_mm(const float v) { return v * linear_unit_factor; } - static inline float axis_value_to_mm(const AxisEnum axis, const float v) { return v * axis_unit_factor(axis); } - static inline float per_axis_value(const AxisEnum axis, const float v) { return v / axis_unit_factor(axis); } + static inline float value_linear_units() { return value_float() * linear_unit_factor; } + static inline float value_axis_units(const AxisEnum axis) { return value_float() * axis_unit_factor(axis); } + static inline float value_per_axis_unit(const AxisEnum axis) { return value_float() / axis_unit_factor(axis); } #else - static inline float mm_to_linear_unit(const float mm) { return mm; } - static inline float mm_to_volumetric_unit(const float mm) { return mm; } - - static inline float linear_value_to_mm(const float v) { return v; } - static inline float axis_value_to_mm(const AxisEnum, const float v) { return v; } - static inline float per_axis_value(const AxisEnum, const float v) { return v; } + FORCE_INLINE static float value_linear_units() { return value_float(); } + FORCE_INLINE static float value_axis_units(const AxisEnum a) { UNUSED(a); return value_float(); } + FORCE_INLINE static float value_per_axis_unit(const AxisEnum a) { UNUSED(a); return value_float(); } #endif - #define LINEAR_UNIT(V) parser.mm_to_linear_unit(V) - #define VOLUMETRIC_UNIT(V) parser.mm_to_volumetric_unit(V) - - static inline float value_linear_units() { return linear_value_to_mm(value_float()); } - static inline float value_axis_units(const AxisEnum axis) { return axis_value_to_mm(axis, value_float()); } - static inline float value_per_axis_units(const AxisEnum axis) { return per_axis_value(axis, value_float()); } - #if ENABLED(TEMPERATURE_UNITS_SUPPORT) - static inline void set_input_temp_units(const TempUnit units) { input_temp_units = units; } + static inline void set_input_temp_units(TempUnit units) { input_temp_units = units; } - #if HAS_LCD_MENU && DISABLED(DISABLE_M503) + #if ENABLED(ULTIPANEL) && DISABLED(DISABLE_M503) - static inline char temp_units_code() { + FORCE_INLINE static char temp_units_code() { return input_temp_units == TEMPUNIT_K ? 'K' : input_temp_units == TEMPUNIT_F ? 'F' : 'C'; } - static inline PGM_P temp_units_name() { + FORCE_INLINE static const char* temp_units_name() { return input_temp_units == TEMPUNIT_K ? PSTR("Kelvin") : input_temp_units == TEMPUNIT_F ? PSTR("Fahrenheit") : PSTR("Celsius"); } static inline float to_temp_units(const float &f) { @@ -357,7 +273,7 @@ public: } } - #endif // HAS_LCD_MENU && !DISABLE_M503 + #endif // ULTIPANEL && !DISABLE_M503 static inline float value_celsius() { const float f = value_float(); @@ -383,52 +299,30 @@ public: } } - #define TEMP_UNIT(N) parser.to_temp_units(N) - #else // !TEMPERATURE_UNITS_SUPPORT - static inline float value_celsius() { return value_float(); } - static inline float value_celsius_diff() { return value_float(); } - - #define TEMP_UNIT(N) (N) + FORCE_INLINE static float value_celsius() { return value_float(); } + FORCE_INLINE static float value_celsius_diff() { return value_float(); } #endif // !TEMPERATURE_UNITS_SUPPORT - static inline feedRate_t value_feedrate() { return MMM_TO_MMS(value_linear_units()); } + FORCE_INLINE static float value_feedrate() { return value_linear_units(); } - void unknown_command_warning(); + void unknown_command_error(); // Provide simple value accessors with default option - static inline char* stringval(const char c, char * const dval=nullptr) { return seenval(c) ? value_string() : dval; } - static inline float floatval(const char c, const float dval=0.0) { return seenval(c) ? value_float() : dval; } - static inline bool boolval(const char c, const bool dval=false) { return seenval(c) ? value_bool() : (seen(c) ? true : dval); } - static inline uint8_t byteval(const char c, const uint8_t dval=0) { return seenval(c) ? value_byte() : dval; } - static inline int16_t intval(const char c, const int16_t dval=0) { return seenval(c) ? value_int() : dval; } - static inline uint16_t ushortval(const char c, const uint16_t dval=0) { return seenval(c) ? value_ushort() : dval; } - static inline int32_t longval(const char c, const int32_t dval=0) { return seenval(c) ? value_long() : dval; } - static inline uint32_t ulongval(const char c, const uint32_t dval=0) { return seenval(c) ? value_ulong() : dval; } - static inline float linearval(const char c, const float dval=0) { return seenval(c) ? value_linear_units() : dval; } - static inline float celsiusval(const char c, const float dval=0) { return seenval(c) ? value_celsius() : dval; } + FORCE_INLINE static float floatval(const char c, const float dval=0.0) { return seenval(c) ? value_float() : dval; } + FORCE_INLINE static bool boolval(const char c, const bool dval=false) { return seenval(c) ? value_bool() : (seen(c) ? true : dval); } + FORCE_INLINE static uint8_t byteval(const char c, const uint8_t dval=0) { return seenval(c) ? value_byte() : dval; } + FORCE_INLINE static int16_t intval(const char c, const int16_t dval=0) { return seenval(c) ? value_int() : dval; } + FORCE_INLINE static uint16_t ushortval(const char c, const uint16_t dval=0) { return seenval(c) ? value_ushort() : dval; } + FORCE_INLINE static int32_t longval(const char c, const int32_t dval=0) { return seenval(c) ? value_long() : dval; } + FORCE_INLINE static uint32_t ulongval(const char c, const uint32_t dval=0) { return seenval(c) ? value_ulong() : dval; } + FORCE_INLINE static float linearval(const char c, const float dval=0) { return seenval(c) ? value_linear_units() : dval; } + FORCE_INLINE static float celsiusval(const char c, const float dval=0){ return seenval(c) ? value_celsius() : dval; } - #if ENABLED(MARLIN_DEV_MODE) - - static inline uint8_t* hex_adr_val(const char c, uint8_t * const dval=nullptr) { - if (!seen(c) || *value_ptr != 'x') return dval; - uint8_t *out = nullptr; - for (char *vp = value_ptr + 1; HEXCHR(*vp) >= 0; vp++) - out = (uint8_t*)((uintptr_t(out) << 8) | HEXCHR(*vp)); - return out; - } - - static inline uint16_t hex_val(const char c, uint16_t const dval=0) { - if (!seen(c) || *value_ptr != 'x') return dval; - uint16_t out = 0; - for (char *vp = value_ptr + 1; HEXCHR(*vp) >= 0; vp++) - out = ((out) << 8) | HEXCHR(*vp); - return out; - } - - #endif }; extern GCodeParser parser; + +#endif // _PARSER_H_ diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index 4347f55aa8..0c8472e05c 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -39,26 +39,32 @@ * E Engage the probe for each probe (default 1) */ void GcodeSuite::G30() { + const float xpos = parser.linearval('X', current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER), + ypos = parser.linearval('Y', current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER); - const xy_pos_t pos = { parser.linearval('X', current_position.x + probe.offset_xy.x), - parser.linearval('Y', current_position.y + probe.offset_xy.y) }; - - if (!probe.can_reach(pos)) return; + if (!position_is_reachable_by_probe(xpos, ypos)) return; // Disable leveling so the planner won't mess with us - TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); + #if HAS_LEVELING + set_bed_leveling_enabled(false); + #endif - remember_feedrate_scaling_off(); + setup_for_endstop_or_probe_move(); const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE; - const float measured_z = probe.probe_at_point(pos, raise_after, 1); - if (!isnan(measured_z)) - SERIAL_ECHOLNPAIR("Bed X: ", pos.x, " Y: ", pos.y, " Z: ", measured_z); + const float measured_z = probe_pt(xpos, ypos, raise_after, 1); - restore_feedrate_and_scaling(); + if (!isnan(measured_z)) { + SERIAL_PROTOCOLPAIR_F("Bed X: ", xpos); + SERIAL_PROTOCOLPAIR_F(" Y: ", ypos); + SERIAL_PROTOCOLLNPAIR_F(" Z: ", measured_z); + } - if (raise_after == PROBE_PT_STOW) - probe.move_z_after_probing(); + clean_up_after_endstop_or_probe_move(); + + #ifdef Z_AFTER_PROBING + if (raise_after == PROBE_PT_STOW) move_z_after_probing(); + #endif report_current_position(); } diff --git a/Marlin/src/gcode/probe/G31_G32.cpp b/Marlin/src/gcode/probe/G31_G32.cpp index af44257d61..751efca5b3 100644 --- a/Marlin/src/gcode/probe/G31_G32.cpp +++ b/Marlin/src/gcode/probe/G31_G32.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -30,11 +30,11 @@ /** * G31: Deploy the Z probe */ -void GcodeSuite::G31() { probe.deploy(); } +void GcodeSuite::G31() { DEPLOY_PROBE(); } /** * G32: Stow the Z probe */ -void GcodeSuite::G32() { probe.stow(); } +void GcodeSuite::G32() { STOW_PROBE(); } #endif // Z_PROBE_SLED diff --git a/Marlin/src/gcode/probe/G38.cpp b/Marlin/src/gcode/probe/G38.cpp index b06cd47359..bdbb635ef3 100644 --- a/Marlin/src/gcode/probe/G38.cpp +++ b/Marlin/src/gcode/probe/G38.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -31,24 +31,13 @@ #include "../../module/stepper.h" #include "../../module/probe.h" -inline void G38_single_probe(const uint8_t move_value) { - endstops.enable(true); - G38_move = move_value; - prepare_line_to_destination(); - planner.synchronize(); - G38_move = 0; - endstops.hit_on_purpose(); - set_current_from_steppers_for_axis(ALL_AXES); - sync_plan_position(); -} - -inline bool G38_run_probe() { +static bool G38_run_probe() { bool G38_pass_fail = false; #if MULTIPLE_PROBING > 1 // Get direction of move and retract - xyz_float_t retract_mm; + float retract_mm[XYZ]; LOOP_XYZ(i) { const float dist = destination[i] - current_position[i]; retract_mm[i] = ABS(dist) < G38_MINIMUM_MOVE ? 0 : home_bump_mm((AxisEnum)i) * (dist > 0 ? -1 : 1); @@ -57,77 +46,76 @@ inline bool G38_run_probe() { planner.synchronize(); // wait until the machine is idle - // Move flag value - #if ENABLED(G38_PROBE_AWAY) - const uint8_t move_value = parser.subcode; - #else - constexpr uint8_t move_value = 1; - #endif - - G38_did_trigger = false; - // Move until destination reached or target hit - G38_single_probe(move_value); + endstops.enable(true); + G38_move = true; + G38_endstop_hit = false; + prepare_move_to_destination(); + planner.synchronize(); + G38_move = false; - if (G38_did_trigger) { + endstops.hit_on_purpose(); + set_current_from_steppers_for_axis(ALL_AXES); + SYNC_PLAN_POSITION_KINEMATIC(); + + if (G38_endstop_hit) { G38_pass_fail = true; #if MULTIPLE_PROBING > 1 // Move away by the retract distance - destination = current_position + retract_mm; + set_destination_from_current(); + LOOP_XYZ(i) destination[i] += retract_mm[i]; endstops.enable(false); - prepare_line_to_destination(); + prepare_move_to_destination(); planner.synchronize(); - REMEMBER(fr, feedrate_mm_s, feedrate_mm_s * 0.25); + feedrate_mm_s /= 4; // Bump the target more slowly - destination -= retract_mm * 2; + LOOP_XYZ(i) destination[i] -= retract_mm[i] * 2; - G38_single_probe(move_value); + endstops.enable(true); + G38_move = true; + prepare_move_to_destination(); + planner.synchronize(); + G38_move = false; + + set_current_from_steppers_for_axis(ALL_AXES); + SYNC_PLAN_POSITION_KINEMATIC(); #endif } + endstops.hit_on_purpose(); endstops.not_homing(); return G38_pass_fail; } /** - * G38 Probe Target + * G38.2 - probe toward workpiece, stop on contact, signal error if failure + * G38.3 - probe toward workpiece, stop on contact * - * G38.2 - Probe toward workpiece, stop on contact, signal error if failure - * G38.3 - Probe toward workpiece, stop on contact - * - * With G38_PROBE_AWAY: - * - * G38.4 - Probe away from workpiece, stop on contact break, signal error if failure - * G38.5 - Probe away from workpiece, stop on contact break + * Like G28 except uses Z min probe for all axes */ -void GcodeSuite::G38(const int8_t subcode) { +void GcodeSuite::G38(const bool is_38_2) { // Get X Y Z E F get_destination_from_command(); - remember_feedrate_scaling_off(); - - const bool error_on_fail = - #if ENABLED(G38_PROBE_AWAY) - !TEST(subcode, 0) - #else - (subcode == 2) - #endif - ; + setup_for_endstop_or_probe_move(); // If any axis has enough movement, do the move LOOP_XYZ(i) if (ABS(destination[i] - current_position[i]) >= G38_MINIMUM_MOVE) { if (!parser.seenval('F')) feedrate_mm_s = homing_feedrate((AxisEnum)i); // If G38.2 fails throw an error - if (!G38_run_probe() && error_on_fail) SERIAL_ERROR_MSG("Failed to reach target"); + if (!G38_run_probe() && is_38_2) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Failed to reach target"); + } break; } - restore_feedrate_and_scaling(); + clean_up_after_endstop_or_probe_move(); } #endif // G38_PROBE_TARGET diff --git a/Marlin/src/gcode/probe/M401_M402.cpp b/Marlin/src/gcode/probe/M401_M402.cpp index 8e9bd11b81..1e81e6b4a7 100644 --- a/Marlin/src/gcode/probe/M401_M402.cpp +++ b/Marlin/src/gcode/probe/M401_M402.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -32,7 +32,7 @@ * M401: Deploy and activate the Z probe */ void GcodeSuite::M401() { - probe.deploy(); + DEPLOY_PROBE(); report_current_position(); } @@ -40,8 +40,10 @@ void GcodeSuite::M401() { * M402: Deactivate and stow the Z probe */ void GcodeSuite::M402() { - probe.stow(); - probe.move_z_after_probing(); + STOW_PROBE(); + #ifdef Z_AFTER_PROBING + move_z_after_probing(); + #endif report_current_position(); } diff --git a/Marlin/src/gcode/probe/M851.cpp b/Marlin/src/gcode/probe/M851.cpp index ee60e9ebc0..36f7162371 100644 --- a/Marlin/src/gcode/probe/M851.cpp +++ b/Marlin/src/gcode/probe/M851.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -28,72 +28,20 @@ #include "../../feature/bedlevel/bedlevel.h" #include "../../module/probe.h" -extern const char SP_Y_STR[], SP_Z_STR[]; - -/** - * M851: Set the nozzle-to-probe offsets in current units - */ void GcodeSuite::M851() { - - // Show usage with no parameters - if (!parser.seen("XYZ")) { - SERIAL_ECHOLNPAIR_P( - #if HAS_PROBE_XY_OFFSET - PSTR(STR_PROBE_OFFSET " X"), probe.offset_xy.x, SP_Y_STR, probe.offset_xy.y, SP_Z_STR - #else - PSTR(STR_PROBE_OFFSET " X0 Y0 Z") - #endif - , probe.offset.z - ); + if (parser.seenval('Z')) { + const float value = parser.value_linear_units(); + if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) + zprobe_zoffset = value; + else { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("?Z out of range (" STRINGIFY(Z_PROBE_OFFSET_RANGE_MIN) " to " STRINGIFY(Z_PROBE_OFFSET_RANGE_MAX) ")"); + } return; } - - // Start with current offsets and modify - xyz_pos_t offs = probe.offset; - - // Assume no errors - bool ok = true; - - if (parser.seenval('X')) { - const float x = parser.value_float(); - #if HAS_PROBE_XY_OFFSET - if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE)) - offs.x = x; - else { - SERIAL_ECHOLNPAIR("?X out of range (-", int(X_BED_SIZE), " to ", int(X_BED_SIZE), ")"); - ok = false; - } - #else - if (x) SERIAL_ECHOLNPAIR("?X must be 0 (NOZZLE_AS_PROBE)."); // ...but let 'ok' stay true - #endif - } - - if (parser.seenval('Y')) { - const float y = parser.value_float(); - #if HAS_PROBE_XY_OFFSET - if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE)) - offs.y = y; - else { - SERIAL_ECHOLNPAIR("?Y out of range (-", int(Y_BED_SIZE), " to ", int(Y_BED_SIZE), ")"); - ok = false; - } - #else - if (y) SERIAL_ECHOLNPAIR("?Y must be 0 (NOZZLE_AS_PROBE)."); // ...but let 'ok' stay true - #endif - } - - if (parser.seenval('Z')) { - const float z = parser.value_float(); - if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) - offs.z = z; - else { - SERIAL_ECHOLNPAIR("?Z out of range (", int(Z_PROBE_OFFSET_RANGE_MIN), " to ", int(Z_PROBE_OFFSET_RANGE_MAX), ")"); - ok = false; - } - } - - // Save the new offsets - if (ok) probe.offset = offs; + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_PROBE_Z_OFFSET); + SERIAL_ECHOLNPAIR(": ", zprobe_zoffset); } #endif // HAS_BED_PROBE diff --git a/Marlin/src/gcode/probe/M951.cpp b/Marlin/src/gcode/probe/M951.cpp deleted file mode 100644 index f461fc2b07..0000000000 --- a/Marlin/src/gcode/probe/M951.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(MAGNETIC_PARKING_EXTRUDER) - -#include "../gcode.h" -#include "../../module/tool_change.h" -#include "../../module/motion.h" - -mpe_settings_t mpe_settings; - -inline void mpe_settings_report() { - SERIAL_ECHO_MSG("Magnetic Parking Extruder"); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("L: Left parking :", mpe_settings.parking_xpos[0]); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("R: Right parking :", mpe_settings.parking_xpos[1]); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("I: Grab Offset :", mpe_settings.grab_distance); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("J: Normal speed :", long(MMS_TO_MMM(mpe_settings.slow_feedrate))); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("H: High speed :", long(MMS_TO_MMM(mpe_settings.fast_feedrate))); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("D: Distance trav.:", mpe_settings.travel_distance); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("C: Compenstion :", mpe_settings.compensation_factor); -} - -void mpe_settings_init() { - constexpr float pex[2] = PARKING_EXTRUDER_PARKING_X; - mpe_settings.parking_xpos[0] = pex[0]; // M951 L - mpe_settings.parking_xpos[1] = pex[1]; // M951 R - mpe_settings.grab_distance = PARKING_EXTRUDER_GRAB_DISTANCE; // M951 I - TERN_(HAS_HOME_OFFSET, set_home_offset(X_AXIS, mpe_settings.grab_distance * -1)); - mpe_settings.slow_feedrate = MMM_TO_MMS(MPE_SLOW_SPEED); // M951 J - mpe_settings.fast_feedrate = MMM_TO_MMS(MPE_FAST_SPEED); // M951 H - mpe_settings.travel_distance = MPE_TRAVEL_DISTANCE; // M951 D - mpe_settings.compensation_factor = MPE_COMPENSATION; // M951 C - mpe_settings_report(); -} - -void GcodeSuite::M951() { - if (parser.seenval('L')) mpe_settings.parking_xpos[0] = parser.value_linear_units(); - if (parser.seenval('R')) mpe_settings.parking_xpos[1] = parser.value_linear_units(); - if (parser.seenval('I')) { - mpe_settings.grab_distance = parser.value_linear_units(); - TERN_(HAS_HOME_OFFSET, set_home_offset(X_AXIS, mpe_settings.grab_distance * -1)); - } - if (parser.seenval('J')) mpe_settings.slow_feedrate = MMM_TO_MMS(parser.value_linear_units()); - if (parser.seenval('H')) mpe_settings.fast_feedrate = MMM_TO_MMS(parser.value_linear_units()); - if (parser.seenval('D')) mpe_settings.travel_distance = parser.value_linear_units(); - if (parser.seenval('C')) mpe_settings.compensation_factor = parser.value_float(); - if (!parser.seen("CDHIJLR")) mpe_settings_report(); -} - -#endif // MAGNETIC_PARKING_EXTRUDER diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index a02d2c0160..7951e5904f 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,26 +25,20 @@ */ #include "queue.h" -GCodeQueue queue; - #include "gcode.h" #include "../lcd/ultralcd.h" #include "../sd/cardreader.h" #include "../module/planner.h" #include "../module/temperature.h" -#include "../MarlinCore.h" +#include "../Marlin.h" -#if ENABLED(PRINTER_EVENT_LEDS) - #include "../feature/leds/printer_event_leds.h" -#endif - -#if ENABLED(BINARY_FILE_TRANSFER) - #include "../feature/binary_stream.h" +#if HAS_COLOR_LEDS + #include "../feature/leds/leds.h" #endif #if ENABLED(POWER_LOSS_RECOVERY) - #include "../feature/powerloss.h" + #include "../feature/power_loss_recovery.h" #endif /** @@ -52,7 +46,7 @@ GCodeQueue queue; * sending commands to Marlin, and lines will be checked for sequentiality. * M110 N sets the current line number. */ -long GCodeQueue::last_N[NUM_SERIAL]; +long gcode_N, gcode_LastN, Stopped_gcode_LastN = 0; /** * GCode Command Queue @@ -63,17 +57,17 @@ long GCodeQueue::last_N[NUM_SERIAL]; * the main loop. The gcode.process_next_command method parses the next * command and hands off execution to individual handler functions. */ -uint8_t GCodeQueue::length = 0, // Count of commands in the queue - GCodeQueue::index_r = 0, // Ring buffer read position - GCodeQueue::index_w = 0; // Ring buffer write position +uint8_t commands_in_queue = 0, // Count of commands in the queue + cmd_queue_index_r = 0, // Ring buffer read position + cmd_queue_index_w = 0; // Ring buffer write position -char GCodeQueue::command_buffer[BUFSIZE][MAX_CMD_SIZE]; +char command_queue[BUFSIZE][MAX_CMD_SIZE]; /* * The port that the command was received on */ -#if HAS_MULTI_SERIAL - int16_t GCodeQueue::port[BUFSIZE]; +#if NUM_SERIAL > 1 + int16_t command_queue_port[BUFSIZE]; #endif /** @@ -86,48 +80,38 @@ static int serial_count[NUM_SERIAL] = { 0 }; bool send_ok[BUFSIZE]; /** - * Next Injected PROGMEM Command pointer. (nullptr == empty) - * Internal commands are enqueued ahead of serial / SD commands. + * Next Injected Command pointer. NULL if no commands are being injected. + * Used by Marlin internally to ensure that commands initiated from within + * are enqueued ahead of any pending serial or sd card commands. */ -PGM_P GCodeQueue::injected_commands_P; // = nullptr +static const char *injected_commands_P = NULL; -/** - * Injected SRAM Commands - */ -char GCodeQueue::injected_commands[64]; // = { 0 } - -GCodeQueue::GCodeQueue() { +void queue_setup() { // Send "ok" after commands by default - LOOP_L_N(i, COUNT(send_ok)) send_ok[i] = true; -} - -/** - * Check whether there are any commands yet to be executed - */ -bool GCodeQueue::has_commands_queued() { - return queue.length || injected_commands_P || injected_commands[0]; + for (uint8_t i = 0; i < COUNT(send_ok); i++) send_ok[i] = true; } /** * Clear the Marlin command queue */ -void GCodeQueue::clear() { - index_r = index_w = length = 0; +void clear_command_queue() { + cmd_queue_index_r = cmd_queue_index_w = commands_in_queue = 0; } /** * Once a new command is in the ring buffer, call this to commit it */ -void GCodeQueue::_commit_command(bool say_ok - #if HAS_MULTI_SERIAL - , int16_t p/*=-1*/ +inline void _commit_command(bool say_ok + #if NUM_SERIAL > 1 + , int16_t port = -1 #endif ) { - send_ok[index_w] = say_ok; - TERN_(HAS_MULTI_SERIAL, port[index_w] = p); - TERN_(POWER_LOSS_RECOVERY, recovery.commit_sdpos(index_w)); - if (++index_w >= BUFSIZE) index_w = 0; - length++; + send_ok[cmd_queue_index_w] = say_ok; + #if NUM_SERIAL > 1 + command_queue_port[cmd_queue_index_w] = port; + #endif + if (++cmd_queue_index_w >= BUFSIZE) cmd_queue_index_w = 0; + commands_in_queue++; } /** @@ -135,135 +119,91 @@ void GCodeQueue::_commit_command(bool say_ok * Return true if the command was successfully added. * Return false for a full buffer, or if the 'command' is a comment. */ -bool GCodeQueue::_enqueue(const char* cmd, bool say_ok/*=false*/ - #if HAS_MULTI_SERIAL - , int16_t pn/*=-1*/ +inline bool _enqueuecommand(const char* cmd, bool say_ok=false + #if NUM_SERIAL > 1 + , int16_t port = -1 #endif ) { - if (*cmd == ';' || length >= BUFSIZE) return false; - strcpy(command_buffer[index_w], cmd); + if (*cmd == ';' || commands_in_queue >= BUFSIZE) return false; + strcpy(command_queue[cmd_queue_index_w], cmd); _commit_command(say_ok - #if HAS_MULTI_SERIAL - , pn + #if NUM_SERIAL > 1 + , port #endif ); return true; } -#define ISEOL(C) ((C) == '\n' || (C) == '\r') - /** * Enqueue with Serial Echo - * Return true if the command was consumed */ -bool GCodeQueue::enqueue_one(const char* cmd) { +bool enqueue_and_echo_command(const char* cmd) { - //SERIAL_ECHOPGM("enqueue_one(\""); + //SERIAL_ECHO("enqueue_and_echo_command(\""); //SERIAL_ECHO(cmd); - //SERIAL_ECHOPGM("\") \n"); + //SERIAL_ECHO("\") \n"); - if (*cmd == 0 || ISEOL(*cmd)) return true; + if (*cmd == 0 || *cmd == '\n' || *cmd == '\r') { + //SERIAL_ECHO("Null command found... Did not queue!\n"); + return true; + } - if (_enqueue(cmd)) { - SERIAL_ECHO_MSG(STR_ENQUEUEING, cmd, "\""); + if (_enqueuecommand(cmd)) { + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(MSG_ENQUEUEING, cmd); + SERIAL_CHAR('"'); + SERIAL_EOL(); return true; } return false; } /** - * Process the next "immediate" command from PROGMEM. - * Return 'true' if any commands were processed. + * Inject the next "immediate" command, when possible, onto the front of the queue. + * Return true if any immediate commands remain to inject. */ -bool GCodeQueue::process_injected_command_P() { - if (injected_commands_P == nullptr) return false; - - char c; - size_t i = 0; - while ((c = pgm_read_byte(&injected_commands_P[i])) && c != '\n') i++; - - // Extract current command and move pointer to next command - char cmd[i + 1]; - memcpy_P(cmd, injected_commands_P, i); - cmd[i] = '\0'; - injected_commands_P = c ? injected_commands_P + i + 1 : nullptr; - - // Execute command if non-blank - if (i) { - parser.parse(cmd); - gcode.process_parsed_command(); - } - return true; -} - -/** - * Process the next "immediate" command from SRAM. - * Return 'true' if any commands were processed. - */ -bool GCodeQueue::process_injected_command() { - if (injected_commands[0] == '\0') return false; - - char c; - size_t i = 0; - while ((c = injected_commands[i]) && c != '\n') i++; - - // Execute a non-blank command - if (i) { - injected_commands[i] = '\0'; - parser.parse(injected_commands); - gcode.process_parsed_command(); - } - - // Copy the next command into place - for ( - uint8_t d = 0, s = i + !!c; // dst, src - (injected_commands[d] = injected_commands[s]); // copy, exit if 0 - d++, s++ // next dst, src - ); - - return true; -} - -/** - * Enqueue and return only when commands are actually enqueued. - * Never call this from a G-code handler! - */ -void GCodeQueue::enqueue_one_now(const char* cmd) { while (!enqueue_one(cmd)) idle(); } - -/** - * Attempt to enqueue a single G-code command - * and return 'true' if successful. - */ -bool GCodeQueue::enqueue_one_P(PGM_P const pgcode) { - size_t i = 0; - PGM_P p = pgcode; - char c; - while ((c = pgm_read_byte(&p[i])) && c != '\n') i++; - char cmd[i + 1]; - memcpy_P(cmd, p, i); - cmd[i] = '\0'; - return _enqueue(cmd); -} - -/** - * Enqueue from program memory and return only when commands are actually enqueued - * Never call this from a G-code handler! - */ -void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { - size_t i = 0; - PGM_P p = pgcode; - for (;;) { - char c; - while ((c = pgm_read_byte(&p[i])) && c != '\n') i++; - char cmd[i + 1]; - memcpy_P(cmd, p, i); +static bool drain_injected_commands_P() { + if (injected_commands_P != NULL) { + size_t i = 0; + char c, cmd[60]; + strncpy_P(cmd, injected_commands_P, sizeof(cmd) - 1); + cmd[sizeof(cmd) - 1] = '\0'; + while ((c = cmd[i]) && c != '\n') i++; // find the end of this gcode command cmd[i] = '\0'; - enqueue_one_now(cmd); - if (!c) break; - p += i + 1; + if (enqueue_and_echo_command(cmd)) // success? + injected_commands_P = c ? injected_commands_P + i + 1 : NULL; // next command or done } + return (injected_commands_P != NULL); // return whether any more remain } +/** + * Record one or many commands to run from program memory. + * Aborts the current queue, if any. + * Note: drain_injected_commands_P() must be called repeatedly to drain the commands afterwards + */ +void enqueue_and_echo_commands_P(const char * const pgcode) { + injected_commands_P = pgcode; + (void)drain_injected_commands_P(); // first command executed asap (when possible) +} + +#if HAS_QUEUE_NOW + /** + * Enqueue and return only when commands are actually enqueued + */ + void enqueue_and_echo_command_now(const char* cmd) { + while (!enqueue_and_echo_command(cmd)) idle(); + } + #if HAS_LCD_QUEUE_NOW + /** + * Enqueue from program memory and return only when commands are actually enqueued + */ + void enqueue_and_echo_commands_now_P(const char * const pgcode) { + enqueue_and_echo_commands_P(pgcode); + while (drain_injected_commands_P()) idle(); + } + #endif +#endif + /** * Send an "ok" message to the host, indicating * that a command was successfully processed. @@ -273,172 +213,84 @@ void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { * P Planner space remaining * B Block queue space remaining */ -void GCodeQueue::ok_to_send() { - #if HAS_MULTI_SERIAL - const int16_t pn = command_port(); - if (pn < 0) return; - PORT_REDIRECT(pn); // Reply to the serial port that sent the command +void ok_to_send() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + if (port < 0) return; #endif - if (!send_ok[index_r]) return; - SERIAL_ECHOPGM(STR_OK); + if (!send_ok[cmd_queue_index_r]) return; + SERIAL_PROTOCOLPGM_P(port, MSG_OK); #if ENABLED(ADVANCED_OK) - char* p = command_buffer[index_r]; + char* p = command_queue[cmd_queue_index_r]; if (*p == 'N') { - SERIAL_ECHO(' '); - SERIAL_ECHO(*p++); + SERIAL_PROTOCOL_P(port, ' '); + SERIAL_ECHO_P(port, *p++); while (NUMERIC_SIGNED(*p)) - SERIAL_ECHO(*p++); + SERIAL_ECHO_P(port, *p++); } - SERIAL_ECHOPAIR_P(SP_P_STR, int(planner.moves_free()), - SP_B_STR, int(BUFSIZE - length)); + SERIAL_PROTOCOLPGM_P(port, " P"); SERIAL_PROTOCOL_P(port, int(BLOCK_BUFFER_SIZE - planner.movesplanned() - 1)); + SERIAL_PROTOCOLPGM_P(port, " B"); SERIAL_PROTOCOL_P(port, BUFSIZE - commands_in_queue); #endif - SERIAL_EOL(); + SERIAL_EOL_P(port); } /** * Send a "Resend: nnn" message to the host to * indicate that a command needs to be re-sent. */ -void GCodeQueue::flush_and_request_resend() { - const int16_t pn = command_port(); - #if HAS_MULTI_SERIAL - if (pn < 0) return; - PORT_REDIRECT(pn); // Reply to the serial port that sent the command +void flush_and_request_resend() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + if (port < 0) return; #endif - SERIAL_FLUSH(); - SERIAL_ECHOPGM(STR_RESEND); - SERIAL_ECHOLN(last_N[pn] + 1); + SERIAL_FLUSH_P(port); + SERIAL_PROTOCOLPGM_P(port, MSG_RESEND); + SERIAL_PROTOCOLLN_P(port, gcode_LastN + 1); ok_to_send(); } -inline bool serial_data_available() { - return MYSERIAL0.available() || TERN0(HAS_MULTI_SERIAL, MYSERIAL1.available()); +void gcode_line_error(const char* err, uint8_t port) { + SERIAL_ERROR_START_P(port); + serialprintPGM_P(port, err); + SERIAL_ERRORLN_P(port, gcode_LastN); + flush_and_request_resend(); + serial_count[port] = 0; } -inline int read_serial(const uint8_t index) { +static bool serial_data_available() { + return (MYSERIAL0.available() ? true : + #if NUM_SERIAL > 1 + MYSERIAL1.available() ? true : + #endif + false); +} + +static int read_serial(const int index) { switch (index) { case 0: return MYSERIAL0.read(); - #if HAS_MULTI_SERIAL + #if NUM_SERIAL > 1 case 1: return MYSERIAL1.read(); #endif default: return -1; } } -void GCodeQueue::gcode_line_error(PGM_P const err, const int8_t pn) { - PORT_REDIRECT(pn); // Reply to the serial port that sent the command - SERIAL_ERROR_START(); - serialprintPGM(err); - SERIAL_ECHOLN(last_N[pn]); - while (read_serial(pn) != -1); // Clear out the RX buffer - flush_and_request_resend(); - serial_count[pn] = 0; -} - -FORCE_INLINE bool is_M29(const char * const cmd) { // matches "M29" & "M29 ", but not "M290", etc - const char * const m29 = strstr_P(cmd, PSTR("M29")); - return m29 && !NUMERIC(m29[3]); -} - -#define PS_NORMAL 0 -#define PS_EOL 1 -#define PS_QUOTED 2 -#define PS_PAREN 3 -#define PS_ESC 4 - -inline void process_stream_char(const char c, uint8_t &sis, char (&buff)[MAX_CMD_SIZE], int &ind) { - - if (sis == PS_EOL) return; // EOL comment or overflow - - #if ENABLED(PAREN_COMMENTS) - else if (sis == PS_PAREN) { // Inline comment - if (c == ')') sis = PS_NORMAL; - return; - } - #endif - - else if (sis >= PS_ESC) // End escaped char - sis -= PS_ESC; - - else if (c == '\\') { // Start escaped char - sis += PS_ESC; - if (sis == PS_ESC) return; // Keep if quoting - } - - #if ENABLED(GCODE_QUOTED_STRINGS) - - else if (sis == PS_QUOTED) { - if (c == '"') sis = PS_NORMAL; // End quoted string - } - else if (c == '"') // Start quoted string - sis = PS_QUOTED; - - #endif - - else if (c == ';') { // Start end-of-line comment - sis = PS_EOL; - return; - } - - #if ENABLED(PAREN_COMMENTS) - else if (c == '(') { // Start inline comment - sis = PS_PAREN; - return; - } - #endif - - // Backspace erases previous characters - if (c == 0x08) { - if (ind) buff[--ind] = '\0'; - } - else { - buff[ind++] = c; - if (ind >= MAX_CMD_SIZE - 1) - sis = PS_EOL; // Skip the rest on overflow - } -} - -/** - * Handle a line being completed. For an empty line - * keep sensor readings going and watchdog alive. - */ -inline bool process_line_done(uint8_t &sis, char (&buff)[MAX_CMD_SIZE], int &ind) { - sis = PS_NORMAL; - buff[ind] = 0; - if (ind) { ind = 0; return false; } - thermalManager.manage_heater(); - return true; -} - /** * Get all commands waiting on the serial port and queue them. * Exit when the buffer is full or when no more characters are * left on the serial port. */ -void GCodeQueue::get_serial_commands() { +inline void get_serial_commands() { static char serial_line_buffer[NUM_SERIAL][MAX_CMD_SIZE]; - - static uint8_t serial_input_state[NUM_SERIAL] = { PS_NORMAL }; - - #if ENABLED(BINARY_FILE_TRANSFER) - if (card.flag.binary_mode) { - /** - * For binary stream file transfer, use serial_line_buffer as the working - * receive buffer (which limits the packet size to MAX_CMD_SIZE). - * The receive buffer also limits the packet size for reliable transmission. - */ - binaryStream[card.transfer_port_index].receive(serial_line_buffer[card.transfer_port_index]); - return; - } - #endif + static bool serial_comment_mode[NUM_SERIAL] = { false }; // If the command buffer is empty for too long, // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 static millis_t last_command_time = 0; const millis_t ms = millis(); - if (length == 0 && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { - SERIAL_ECHOLNPGM(STR_WAIT); + if (commands_in_queue == 0 && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + SERIAL_ECHOLNPGM(MSG_WAIT); last_command_time = ms; } #endif @@ -446,74 +298,73 @@ void GCodeQueue::get_serial_commands() { /** * Loop while serial characters are incoming and the queue is not full */ - while (length < BUFSIZE && serial_data_available()) { - LOOP_L_N(i, NUM_SERIAL) { + while (commands_in_queue < BUFSIZE && serial_data_available()) { + for (uint8_t i = 0; i < NUM_SERIAL; ++i) { + int c; + if ((c = read_serial(i)) < 0) continue; - const int c = read_serial(i); - if (c < 0) continue; + char serial_char = c; - const char serial_char = c; + /** + * If the character ends the line + */ + if (serial_char == '\n' || serial_char == '\r') { - if (ISEOL(serial_char)) { + serial_comment_mode[i] = false; // end of line == end of comment - // Reset our state, continue if the line was empty - if (process_line_done(serial_input_state[i], serial_line_buffer[i], serial_count[i])) - continue; + // Skip empty lines and comments + if (!serial_count[i]) { thermalManager.manage_heater(); continue; } + + serial_line_buffer[i][serial_count[i]] = 0; // Terminate string + serial_count[i] = 0; // Reset buffer char* command = serial_line_buffer[i]; - while (*command == ' ') command++; // Skip leading spaces - char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line + while (*command == ' ') command++; // Skip leading spaces + char *npos = (*command == 'N') ? command : NULL; // Require the N parameter to start the line if (npos) { - bool M110 = strstr_P(command, PSTR("M110")) != nullptr; + bool M110 = strstr_P(command, PSTR("M110")) != NULL; if (M110) { char* n2pos = strchr(command + 4, 'N'); if (n2pos) npos = n2pos; } - const long gcode_N = strtol(npos + 1, nullptr, 10); + gcode_N = strtol(npos + 1, NULL, 10); - if (gcode_N != last_N[i] + 1 && !M110) - return gcode_line_error(PSTR(STR_ERR_LINE_NO), i); + if (gcode_N != gcode_LastN + 1 && !M110) + return gcode_line_error(PSTR(MSG_ERR_LINE_NO), i); char *apos = strrchr(command, '*'); if (apos) { uint8_t checksum = 0, count = uint8_t(apos - command); while (count) checksum ^= command[--count]; - if (strtol(apos + 1, nullptr, 10) != checksum) - return gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), i); + if (strtol(apos + 1, NULL, 10) != checksum) + return gcode_line_error(PSTR(MSG_ERR_CHECKSUM_MISMATCH), i); } else - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); + return gcode_line_error(PSTR(MSG_ERR_NO_CHECKSUM), i); - last_N[i] = gcode_N; + gcode_LastN = gcode_N; } #if ENABLED(SDSUPPORT) - // Pronterface "M29" and "M29 " has no line number - else if (card.flag.saving && !is_M29(command)) - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); + else if (card.saving) + return gcode_line_error(PSTR(MSG_ERR_NO_CHECKSUM), i); #endif - // - // Movement commands give an alert when the machine is stopped - // - + // Movement commands alert when stopped if (IsStopped()) { char* gpos = strchr(command, 'G'); if (gpos) { - switch (strtol(gpos + 1, nullptr, 10)) { - case 0: case 1: - #if ENABLED(ARC_SUPPORT) - case 2: case 3: - #endif - #if ENABLED(BEZIER_CURVE_SUPPORT) - case 5: - #endif - PORT_REDIRECT(i); // Reply to the serial port that sent the command - SERIAL_ECHOLNPGM(STR_ERR_STOPPED); + const int codenum = strtol(gpos + 1, NULL, 10); + switch (codenum) { + case 0: + case 1: + case 2: + case 3: + SERIAL_ERRORLNPGM_P(i, MSG_ERR_STOPPED); LCD_MESSAGEPGM(MSG_STOPPED); break; } @@ -522,12 +373,14 @@ void GCodeQueue::get_serial_commands() { #if DISABLED(EMERGENCY_PARSER) // Process critical commands early - if (strcmp_P(command, PSTR("M108")) == 0) { + if (strcmp(command, "M108") == 0) { wait_for_heatup = false; - TERN_(HAS_LCD_MENU, wait_for_user = false); + #if ENABLED(ULTIPANEL) + wait_for_user = false; + #endif } - if (strcmp_P(command, PSTR("M112")) == 0) kill(M112_KILL_STR, nullptr, true); - if (strcmp_P(command, PSTR("M410")) == 0) quickstop_stepper(); + if (strcmp(command, "M112") == 0) kill(PSTR(MSG_KILLED)); + if (strcmp(command, "M410") == 0) quickstop_stepper(); #endif #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 @@ -535,15 +388,25 @@ void GCodeQueue::get_serial_commands() { #endif // Add the command to the queue - _enqueue(serial_line_buffer[i], true - #if HAS_MULTI_SERIAL + _enqueuecommand(serial_line_buffer[i], true + #if NUM_SERIAL > 1 , i #endif ); } - else - process_stream_char(serial_char, serial_input_state[i], serial_line_buffer[i], serial_count[i]); - + else if (serial_count[i] >= MAX_CMD_SIZE - 1) { + // Keep fetching, but ignore normal characters beyond the max length + // The command will be injected when EOL is reached + } + else if (serial_char == '\\') { // Handle escapes + // if we have one more character, copy it over + if ((c = read_serial(i)) >= 0 && !serial_comment_mode[i]) + serial_line_buffer[i][serial_count[i]++] = (char)c; + } + else { // it's not a newline, carriage return or escape char + if (serial_char == ';') serial_comment_mode[i] = true; + if (!serial_comment_mode[i]) serial_line_buffer[i][serial_count[i]++] = serial_char; + } } // for NUM_SERIAL } // queue has space, serial has data } @@ -551,101 +414,175 @@ void GCodeQueue::get_serial_commands() { #if ENABLED(SDSUPPORT) /** - * Get lines from the SD Card until the command buffer is full - * or until the end of the file is reached. Because this method - * always receives complete command-lines, they can go directly - * into the main command queue. + * Get commands from the SD Card until the command buffer is full + * or until the end of the file is reached. The special character '#' + * can also interrupt buffering. */ - inline void GCodeQueue::get_sdcard_commands() { - static uint8_t sd_input_state = PS_NORMAL; + inline void get_sdcard_commands() { + static bool stop_buffering = false, + sd_comment_mode = false; - if (!IS_SD_PRINTING()) return; + if (!IS_SD_PRINTING) return; - int sd_count = 0; + /** + * '#' stops reading from SD to the buffer prematurely, so procedural + * macro calls are possible. If it occurs, stop_buffering is triggered + * and the buffer is run dry; this character _can_ occur in serial com + * due to checksums, however, no checksums are used in SD printing. + */ + + if (commands_in_queue == 0) stop_buffering = false; + + uint16_t sd_count = 0; bool card_eof = card.eof(); - while (length < BUFSIZE && !card_eof) { + while (commands_in_queue < BUFSIZE && !card_eof && !stop_buffering) { const int16_t n = card.get(); + char sd_char = (char)n; card_eof = card.eof(); - if (n < 0 && !card_eof) { SERIAL_ERROR_MSG(STR_SD_ERR_READ); continue; } + if (card_eof || n == -1 + || sd_char == '\n' || sd_char == '\r' + || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode) + ) { + if (card_eof) { - const char sd_char = (char)n; - const bool is_eol = ISEOL(sd_char); - if (is_eol || card_eof) { + card.printingHasFinished(); - // Reset stream state, terminate the buffer, and commit a non-empty command - if (!is_eol && sd_count) ++sd_count; // End of file with no newline - if (!process_line_done(sd_input_state, command_buffer[index_w], sd_count)) { - _commit_command(false); - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.cmd_sdpos = card.getIndex(); // Prime for the NEXT _commit_command - #endif + if (card.sdprinting) + sd_count = 0; // If a sub-file was printing, continue from call point + else { + SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED); + #if ENABLED(PRINTER_EVENT_LEDS) + LCD_MESSAGEPGM(MSG_INFO_COMPLETED_PRINTS); + leds.set_green(); + #if HAS_RESUME_CONTINUE + gcode.lights_off_after_print = true; + enqueue_and_echo_commands_P(PSTR("M0 S" + #if ENABLED(NEWPANEL) + "1800" + #else + "60" + #endif + )); + #else + safe_delay(2000); + leds.set_off(); + #endif + #endif // PRINTER_EVENT_LEDS + } } + else if (n == -1) { + SERIAL_ERROR_START(); + SERIAL_ECHOLNPGM(MSG_SD_ERR_READ); + } + if (sd_char == '#') stop_buffering = true; - if (card_eof) card.fileHasFinished(); // Handle end of file reached + sd_comment_mode = false; // for new command + + // Skip empty lines and comments + if (!sd_count) { thermalManager.manage_heater(); continue; } + + command_queue[cmd_queue_index_w][sd_count] = '\0'; // terminate string + sd_count = 0; // clear sd line buffer + + _commit_command(false); + } + else if (sd_count >= MAX_CMD_SIZE - 1) { + /** + * Keep fetching, but ignore normal characters beyond the max length + * The command will be injected when EOL is reached + */ + } + else { + if (sd_char == ';') sd_comment_mode = true; + if (!sd_comment_mode) command_queue[cmd_queue_index_w][sd_count++] = sd_char; } - else - process_stream_char(sd_char, sd_input_state, command_buffer[index_w], sd_count); - } } + #if ENABLED(POWER_LOSS_RECOVERY) + + inline bool drain_job_recovery_commands() { + static uint8_t job_recovery_commands_index = 0; // Resets on reboot + if (job_recovery_commands_count) { + if (_enqueuecommand(job_recovery_commands[job_recovery_commands_index])) { + ++job_recovery_commands_index; + if (!--job_recovery_commands_count) job_recovery_phase = JOB_RECOVERY_DONE; + } + return true; + } + return false; + } + + #endif + #endif // SDSUPPORT /** * Add to the circular command queue the next command from: - * - The command-injection queues (injected_commands_P, injected_commands) + * - The command-injection queue (injected_commands_P) * - The active serial input (usually USB) * - The SD card file being actively printed */ -void GCodeQueue::get_available_commands() { +void get_available_commands() { + + // if any immediate commands remain, don't get other commands yet + if (drain_injected_commands_P()) return; get_serial_commands(); - TERN_(SDSUPPORT, get_sdcard_commands()); + #if ENABLED(POWER_LOSS_RECOVERY) + // Commands for power-loss recovery take precedence + if (job_recovery_phase == JOB_RECOVERY_YES && drain_job_recovery_commands()) return; + #endif + + #if ENABLED(SDSUPPORT) + get_sdcard_commands(); + #endif } /** * Get the next command in the queue, optionally log it to SD, then dispatch it */ -void GCodeQueue::advance() { +void advance_command_queue() { - // Process immediate commands - if (process_injected_command_P() || process_injected_command()) return; - - // Return if the G-code buffer is empty - if (!length) return; + if (!commands_in_queue) return; #if ENABLED(SDSUPPORT) - if (card.flag.saving) { - char* command = command_buffer[index_r]; - if (is_M29(command)) { + if (card.saving) { + char* command = command_queue[cmd_queue_index_r]; + if (strstr_P(command, PSTR("M29"))) { // M29 closes the file card.closefile(); - SERIAL_ECHOLNPGM(STR_FILE_SAVED); + SERIAL_PROTOCOLLNPGM(MSG_FILE_SAVED); - #if !IS_AT90USB + #if !defined(__AVR__) || !defined(USBCON) #if ENABLED(SERIAL_STATS_DROPPED_RX) - SERIAL_ECHOLNPAIR("Dropped bytes: ", MYSERIAL0.dropped()); + SERIAL_ECHOLNPAIR("Dropped bytes: ", customizedSerial.dropped()); #endif + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - SERIAL_ECHOLNPAIR("Max RX Queue Size: ", MYSERIAL0.rxMaxEnqueued()); + SERIAL_ECHOLNPAIR("Max RX Queue Size: ", customizedSerial.rxMaxEnqueued()); #endif - #endif + #endif // !defined(__AVR__) || !defined(USBCON) ok_to_send(); } else { // Write the string from the read buffer to SD card.write_command(command); - if (card.flag.logging) + if (card.logging) gcode.process_next_command(); // The card is saving because it's logging else ok_to_send(); } } - else + else { gcode.process_next_command(); + #if ENABLED(POWER_LOSS_RECOVERY) + if (card.cardOK && card.sdprinting) save_job_recovery_info(); + #endif + } #else @@ -654,7 +591,9 @@ void GCodeQueue::advance() { #endif // SDSUPPORT // The queue may be reset by a command handler or by code invoked by idle() within a handler - --length; - if (++index_r >= BUFSIZE) index_r = 0; + if (commands_in_queue) { + --commands_in_queue; + if (++cmd_queue_index_r >= BUFSIZE) cmd_queue_index_r = 0; + } } diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 966af2871f..5b37f14ae0 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,173 +16,114 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * queue.h - The G-code command queue, which holds commands before they * go to the parser and dispatcher. */ +#ifndef GCODE_QUEUE_H +#define GCODE_QUEUE_H + #include "../inc/MarlinConfig.h" -class GCodeQueue { -public: - /** - * GCode line number handling. Hosts may include line numbers when sending - * commands to Marlin, and lines will be checked for sequentiality. - * M110 N sets the current line number. - */ +/** + * GCode line number handling. Hosts may include line numbers when sending + * commands to Marlin, and lines will be checked for sequentiality. + * M110 N sets the current line number. + */ +extern long gcode_LastN, Stopped_gcode_LastN; - static long last_N[NUM_SERIAL]; +/** + * GCode Command Queue + * A simple ring buffer of BUFSIZE command strings. + * + * Commands are copied into this buffer by the command injectors + * (immediate, serial, sd card) and they are processed sequentially by + * the main loop. The gcode.process_next_command method parses the next + * command and hands off execution to individual handler functions. + */ +extern uint8_t commands_in_queue, // Count of commands in the queue + cmd_queue_index_r; // Ring buffer read position - /** - * GCode Command Queue - * A simple ring buffer of BUFSIZE command strings. - * - * Commands are copied into this buffer by the command injectors - * (immediate, serial, sd card) and they are processed sequentially by - * the main loop. The gcode.process_next_command method parses the next - * command and hands off execution to individual handler functions. - */ - static uint8_t length, // Count of commands in the queue - index_r; // Ring buffer read position +extern char command_queue[BUFSIZE][MAX_CMD_SIZE]; - static char command_buffer[BUFSIZE][MAX_CMD_SIZE]; +/* + * The port that the command was received on + */ +#if NUM_SERIAL > 1 + extern int16_t command_queue_port[BUFSIZE]; +#endif - /** - * The port that the command was received on - */ - #if HAS_MULTI_SERIAL - static int16_t port[BUFSIZE]; - #endif +/** + * Initialization of queue for setup() + */ +void queue_setup(); - static int16_t command_port() { - return TERN0(HAS_MULTI_SERIAL, port[index_r]); - } +/** + * Clear the Marlin command queue + */ +void clear_command_queue(); - GCodeQueue(); +/** + * Clear the serial line and request a resend of + * the next expected line number. + */ +void flush_and_request_resend(); - /** - * Clear the Marlin command queue - */ - static void clear(); +/** + * Send an "ok" message to the host, indicating + * that a command was successfully processed. + * + * If ADVANCED_OK is enabled also include: + * N Line number of the command, if any + * P Planner space remaining + * B Block queue space remaining + */ +void ok_to_send(); - /** - * Next Injected Command (PROGMEM) pointer. (nullptr == empty) - * Internal commands are enqueued ahead of serial / SD commands. - */ - static PGM_P injected_commands_P; +/** + * Record one or many commands to run from program memory. + * Aborts the current queue, if any. + * Note: drain_injected_commands_P() must be called repeatedly to drain the commands afterwards + */ +void enqueue_and_echo_commands_P(const char * const pgcode); - /** - * Injected Commands (SRAM) - */ - static char injected_commands[64]; +/** + * Enqueue with Serial Echo + */ +bool enqueue_and_echo_command(const char* cmd); - /** - * Enqueue command(s) to run from PROGMEM. Drained by process_injected_command_P(). - * Don't inject comments or use leading spaces! - * Aborts the current PROGMEM queue so only use for one or two commands. - */ - static inline void inject_P(PGM_P const pgcode) { injected_commands_P = pgcode; } - - /** - * Enqueue command(s) to run from SRAM. Drained by process_injected_command(). - * Aborts the current SRAM queue so only use for one or two commands. - */ - static inline void inject(char * const gcode) { - strncpy(injected_commands, gcode, sizeof(injected_commands) - 1); - } +#define HAS_LCD_QUEUE_NOW (ENABLED(MALYAN_LCD) || (ENABLED(ULTIPANEL) && (ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(PID_AUTOTUNE_MENU) || ENABLED(ADVANCED_PAUSE_FEATURE)))) +#define HAS_QUEUE_NOW (ENABLED(SDSUPPORT) || HAS_LCD_QUEUE_NOW) +#if HAS_QUEUE_NOW /** * Enqueue and return only when commands are actually enqueued */ - static void enqueue_one_now(const char* cmd); - - /** - * Attempt to enqueue a single G-code command - * and return 'true' if successful. - */ - static bool enqueue_one_P(PGM_P const pgcode); - - /** - * Enqueue from program memory and return only when commands are actually enqueued - */ - static void enqueue_now_P(PGM_P const cmd); - - /** - * Check whether there are any commands yet to be executed - */ - static bool has_commands_queued(); - - /** - * Get the next command in the queue, optionally log it to SD, then dispatch it - */ - static void advance(); - - /** - * Add to the circular command queue the next command from: - * - The command-injection queue (injected_commands_P) - * - The active serial input (usually USB) - * - The SD card file being actively printed - */ - static void get_available_commands(); - - /** - * Send an "ok" message to the host, indicating - * that a command was successfully processed. - * - * If ADVANCED_OK is enabled also include: - * N Line number of the command, if any - * P Planner space remaining - * B Block queue space remaining - */ - static void ok_to_send(); - - /** - * Clear the serial line and request a resend of - * the next expected line number. - */ - static void flush_and_request_resend(); - -private: - - static uint8_t index_w; // Ring buffer write position - - static void get_serial_commands(); - - #if ENABLED(SDSUPPORT) - static void get_sdcard_commands(); + void enqueue_and_echo_command_now(const char* cmd); + #if HAS_LCD_QUEUE_NOW + /** + * Enqueue from program memory and return only when commands are actually enqueued + */ + void enqueue_and_echo_commands_now_P(const char * const cmd); #endif +#endif - static void _commit_command(bool say_ok - #if HAS_MULTI_SERIAL - , int16_t p=-1 - #endif - ); +/** + * Add to the circular command queue the next command from: + * - The command-injection queue (injected_commands_P) + * - The active serial input (usually USB) + * - The SD card file being actively printed + */ +void get_available_commands(); - static bool _enqueue(const char* cmd, bool say_ok=false - #if HAS_MULTI_SERIAL - , int16_t p=-1 - #endif - ); +/** + * Get the next command in the queue, optionally log it to SD, then dispatch it + */ +void advance_command_queue(); - // Process the next "immediate" command (PROGMEM) - static bool process_injected_command_P(); - - // Process the next "immediate" command (SRAM) - static bool process_injected_command(); - - /** - * Enqueue with Serial Echo - * Return true on success - */ - static bool enqueue_one(const char* cmd); - - static void gcode_line_error(PGM_P const err, const int8_t pn); - -}; - -extern GCodeQueue queue; +#endif // GCODE_QUEUE_H diff --git a/Marlin/src/gcode/scara/M360-M364.cpp b/Marlin/src/gcode/scara/M360-M364.cpp index 562beee4f9..471fdf871d 100644 --- a/Marlin/src/gcode/scara/M360-M364.cpp +++ b/Marlin/src/gcode/scara/M360-M364.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,12 +27,15 @@ #include "../gcode.h" #include "../../module/scara.h" #include "../../module/motion.h" -#include "../../MarlinCore.h" // for IsRunning() +#include "../../Marlin.h" // for IsRunning() inline bool SCARA_move_to_cal(const uint8_t delta_a, const uint8_t delta_b) { if (IsRunning()) { forward_kinematics_SCARA(delta_a, delta_b); - do_blocking_move_to_xy(cartes); + destination[X_AXIS] = cartes[X_AXIS]; + destination[Y_AXIS] = cartes[Y_AXIS]; + destination[Z_AXIS] = current_position[Z_AXIS]; + prepare_move_to_destination(); return true; } return false; diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp deleted file mode 100644 index b28429f631..0000000000 --- a/Marlin/src/gcode/sd/M1001.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../module/printcounter.h" - -#ifdef SD_FINISHED_RELEASECOMMAND - #include "../queue.h" -#endif - -#if EITHER(LCD_SET_PROGRESS_MANUALLY, SD_REPRINT_LAST_SELECTED_FILE) - #include "../../lcd/ultralcd.h" -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../feature/powerloss.h" -#endif - -#if HAS_LEDS_OFF_FLAG - #include "../../MarlinCore.h" // for wait_for_user_response - #include "../../feature/leds/printer_event_leds.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../../lcd/extui/ui_api.h" -#endif - -#if ENABLED(HOST_ACTION_COMMANDS) - #include "../../feature/host_actions.h" -#endif - -#ifndef PE_LEDS_COMPLETED_TIME - #define PE_LEDS_COMPLETED_TIME (30*60) -#endif - -/** - * M1001: Execute actions for SD print completion - */ -void GcodeSuite::M1001() { - - // Report total print time - const bool long_print = print_job_timer.duration() > 60; - if (long_print) gcode.process_subcommands_now_P(PSTR("M31")); - - // Stop the print job timer - gcode.process_subcommands_now_P(PSTR("M77")); - - // Set the progress bar "done" state - TERN_(LCD_SET_PROGRESS_MANUALLY, ui.set_progress_done()); - - // Purge the recovery file - TERN_(POWER_LOSS_RECOVERY, recovery.purge()); - - // Announce SD file completion - { - PORT_REDIRECT(SERIAL_BOTH); - SERIAL_ECHOLNPGM(STR_FILE_PRINTED); - } - - // Update the status LED color - #if HAS_LEDS_OFF_FLAG - if (long_print) { - printerEventLEDs.onPrintCompleted(); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_PRINT_DONE))); - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_PRINT_DONE), CONTINUE_STR)); - wait_for_user_response(1000UL * TERN(HAS_LCD_MENU, PE_LEDS_COMPLETED_TIME, 30)); - printerEventLEDs.onResumeAfterWait(); - } - #endif - - // Inject SD_FINISHED_RELEASECOMMAND, if any - #ifdef SD_FINISHED_RELEASECOMMAND - queue.inject_P(PSTR(SD_FINISHED_RELEASECOMMAND)); - #endif - - // Re-select the last printed file in the UI - TERN_(SD_REPRINT_LAST_SELECTED_FILE, ui.reselect_last_file()); -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M20.cpp b/Marlin/src/gcode/sd/M20.cpp deleted file mode 100644 index 7ac4affdae..0000000000 --- a/Marlin/src/gcode/sd/M20.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -/** - * M20: List SD card to serial output - */ -void GcodeSuite::M20() { - if (card.flag.mounted) { - SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST); - card.ls(); - SERIAL_ECHOLNPGM(STR_END_FILE_LIST); - } - else - SERIAL_ECHO_MSG(STR_NO_MEDIA); -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M21_M22.cpp b/Marlin/src/gcode/sd/M21_M22.cpp deleted file mode 100644 index 77df751fc7..0000000000 --- a/Marlin/src/gcode/sd/M21_M22.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -/** - * M21: Init SD Card - */ -void GcodeSuite::M21() { card.mount(); } - -/** - * M22: Release SD Card - */ -void GcodeSuite::M22() { card.release(); } - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M23.cpp b/Marlin/src/gcode/sd/M23.cpp deleted file mode 100644 index b88f66b591..0000000000 --- a/Marlin/src/gcode/sd/M23.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" -#include "../../lcd/ultralcd.h" - -/** - * M23: Open a file - * - * The path is relative to the root directory - */ -void GcodeSuite::M23() { - // Simplify3D includes the size, so zero out all spaces (#7227) - for (char *fn = parser.string_arg; *fn; ++fn) if (*fn == ' ') *fn = '\0'; - card.openFileRead(parser.string_arg); - - TERN_(LCD_SET_PROGRESS_MANUALLY, ui.set_progress(0)); -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M24_M25.cpp b/Marlin/src/gcode/sd/M24_M25.cpp deleted file mode 100644 index bdb37f605c..0000000000 --- a/Marlin/src/gcode/sd/M24_M25.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" -#include "../../module/printcounter.h" -#include "../../lcd/ultralcd.h" - -#if ENABLED(PARK_HEAD_ON_PAUSE) - #include "../../feature/pause.h" -#endif - -#if ENABLED(HOST_ACTION_COMMANDS) - #include "../../feature/host_actions.h" -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../feature/powerloss.h" -#endif - -#include "../../MarlinCore.h" // for startOrResumeJob - -/** - * M24: Start or Resume SD Print - */ -void GcodeSuite::M24() { - - #if ENABLED(POWER_LOSS_RECOVERY) - if (parser.seenval('S')) card.setIndex(parser.value_long()); - if (parser.seenval('T')) print_job_timer.resume(parser.value_long()); - #endif - - #if ENABLED(PARK_HEAD_ON_PAUSE) - if (did_pause_print) { - resume_print(); // will call print_job_timer.start() - return; - } - #endif - - if (card.isFileOpen()) { - card.startFileprint(); // SD card will now be read for commands - startOrResumeJob(); // Start (or resume) the print job timer - TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - } - - #if ENABLED(HOST_ACTION_COMMANDS) - #ifdef ACTION_ON_RESUME - host_action_resume(); - #endif - TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("Resuming SD"), DISMISS_STR)); - #endif - - ui.reset_status(); -} - -/** - * M25: Pause SD Print - */ -void GcodeSuite::M25() { - - #if ENABLED(PARK_HEAD_ON_PAUSE) - - M125(); - - #else - - // Set initial pause flag to prevent more commands from landing in the queue while we try to pause - #if ENABLED(SDSUPPORT) - if (IS_SD_PRINTING()) card.pauseSDPrint(); - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - if (recovery.enabled) recovery.save(true); - #endif - - print_job_timer.pause(); - - #if DISABLED(DWIN_CREALITY_LCD) - ui.reset_status(); - #endif - - #if ENABLED(HOST_ACTION_COMMANDS) - TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("Pause SD"), PSTR("Resume"))); - #ifdef ACTION_ON_PAUSE - host_action_pause(); - #endif - #endif - - #endif -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M26.cpp b/Marlin/src/gcode/sd/M26.cpp deleted file mode 100644 index e0557bfa14..0000000000 --- a/Marlin/src/gcode/sd/M26.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -/** - * M26: Set SD Card file index - */ -void GcodeSuite::M26() { - if (card.isMounted() && parser.seenval('S')) - card.setIndex(parser.value_long()); -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M27.cpp b/Marlin/src/gcode/sd/M27.cpp deleted file mode 100644 index 8592b8af25..0000000000 --- a/Marlin/src/gcode/sd/M27.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -/** - * M27: Get SD Card status - * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) - * OR, with 'C' get the current filename. - */ -void GcodeSuite::M27() { - if (parser.seen('C')) { - SERIAL_ECHOPGM("Current file: "); - card.printFilename(); - } - - #if ENABLED(AUTO_REPORT_SD_STATUS) - else if (parser.seenval('S')) - card.set_auto_report_interval(parser.value_byte()); - #endif - - else - card.report_status(); -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M28_M29.cpp b/Marlin/src/gcode/sd/M28_M29.cpp deleted file mode 100644 index 6f3f2450a1..0000000000 --- a/Marlin/src/gcode/sd/M28_M29.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -#if HAS_MULTI_SERIAL - #include "../queue.h" -#endif - -/** - * M28: Start SD Write - */ -void GcodeSuite::M28() { - - #if ENABLED(BINARY_FILE_TRANSFER) - - bool binary_mode = false; - char *p = parser.string_arg; - if (p[0] == 'B' && NUMERIC(p[1])) { - binary_mode = p[1] > '0'; - p += 2; - while (*p == ' ') ++p; - } - - // Binary transfer mode - if ((card.flag.binary_mode = binary_mode)) { - SERIAL_ECHO_MSG("Switching to Binary Protocol"); - TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.port[queue.index_r]); - } - else - card.openFileWrite(p); - - #else - - card.openFileWrite(parser.string_arg); - - #endif -} - -/** - * M29: Stop SD Write - * (Processed in write-to-file routine) - */ -void GcodeSuite::M29() { - card.flag.saving = false; -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M30.cpp b/Marlin/src/gcode/sd/M30.cpp deleted file mode 100644 index b95a895f1e..0000000000 --- a/Marlin/src/gcode/sd/M30.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -/** - * M30 : Delete SD Card file - */ -void GcodeSuite::M30() { - if (card.isMounted()) { - card.closefile(); - card.removeFile(parser.string_arg); - } -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M32.cpp b/Marlin/src/gcode/sd/M32.cpp deleted file mode 100644 index 55ec6ea497..0000000000 --- a/Marlin/src/gcode/sd/M32.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" -#include "../../module/planner.h" // for synchronize() - -#include "../../MarlinCore.h" // for startOrResumeJob - -/** - * M32: Select file and start SD Print - * - * Examples: - * - * M32 !PATH/TO/FILE.GCO# ; Start FILE.GCO - * M32 P !PATH/TO/FILE.GCO# ; Start FILE.GCO as a procedure - * M32 S60 !PATH/TO/FILE.GCO# ; Start FILE.GCO at byte 60 - */ -void GcodeSuite::M32() { - if (IS_SD_PRINTING()) planner.synchronize(); - - if (card.isMounted()) { - const uint8_t call_procedure = parser.boolval('P'); - - card.openFileRead(parser.string_arg, call_procedure); - - if (parser.seenval('S')) card.setIndex(parser.value_long()); - - card.startFileprint(); - - // Procedure calls count as normal print time. - if (!call_procedure) startOrResumeJob(); - } -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M33.cpp b/Marlin/src/gcode/sd/M33.cpp deleted file mode 100644 index b611c8bc08..0000000000 --- a/Marlin/src/gcode/sd/M33.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(LONG_FILENAME_HOST_SUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -/** - * M33: Get the long full path of a file or folder - * - * Parameters: - * Case-insensitive DOS-style path to a file or folder - * - * Example: - * M33 miscel~1/armchair/armcha~1.gco - * - * Output: - * /Miscellaneous/Armchair/Armchair.gcode - */ -void GcodeSuite::M33() { - - card.printLongPath(parser.string_arg); - -} - -#endif // LONG_FILENAME_HOST_SUPPORT diff --git a/Marlin/src/gcode/sd/M34.cpp b/Marlin/src/gcode/sd/M34.cpp deleted file mode 100644 index 2dd7dc580c..0000000000 --- a/Marlin/src/gcode/sd/M34.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -/** - * M34: Set SD Card Sorting Options - */ -void GcodeSuite::M34() { - if (parser.seen('S')) card.setSortOn(parser.value_bool()); - if (parser.seenval('F')) { - const int v = parser.value_long(); - card.setSortFolders(v < 0 ? -1 : v > 0 ? 1 : 0); - } - //if (parser.seen('R')) card.setSortReverse(parser.value_bool()); -} - -#endif // SDCARD_SORT_ALPHA && SDSORT_GCODE diff --git a/Marlin/src/gcode/sd/M524.cpp b/Marlin/src/gcode/sd/M524.cpp deleted file mode 100644 index 089d2e2f0c..0000000000 --- a/Marlin/src/gcode/sd/M524.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -/** - * M524: Abort the current SD print job (started with M24) - */ -void GcodeSuite::M524() { - - if (IS_SD_PRINTING()) - card.flag.abort_sd_printing = true; - else if (card.isMounted()) - card.closefile(); - -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M928.cpp b/Marlin/src/gcode/sd/M928.cpp deleted file mode 100644 index 03a7877a90..0000000000 --- a/Marlin/src/gcode/sd/M928.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SDSUPPORT) - -#include "../gcode.h" -#include "../../sd/cardreader.h" - -/** - * M928: Start SD Logging - */ -void GcodeSuite::M928() { - - card.openLogFile(parser.string_arg); - -} - -#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp b/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp new file mode 100644 index 0000000000..6a982b74b0 --- /dev/null +++ b/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp @@ -0,0 +1,254 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" +#include "../../module/printcounter.h" +#include "../../module/stepper.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../feature/power_loss_recovery.h" +#endif + +#if ENABLED(PARK_HEAD_ON_PAUSE) + #include "../../feature/pause.h" +#endif + +#if ENABLED(PARK_HEAD_ON_PAUSE) || NUM_SERIAL > 1 + #include "../queue.h" +#endif + +/** + * M20: List SD card to serial output + */ +void GcodeSuite::M20() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif + + SERIAL_PROTOCOLLNPGM_P(port, MSG_BEGIN_FILE_LIST); + card.ls( + #if NUM_SERIAL > 1 + port + #endif + ); + SERIAL_PROTOCOLLNPGM_P(port, MSG_END_FILE_LIST); +} + +/** + * M21: Init SD Card + */ +void GcodeSuite::M21() { card.initsd(); } + +/** + * M22: Release SD Card + */ +void GcodeSuite::M22() { card.release(); } + +/** + * M23: Open a file + */ +void GcodeSuite::M23() { + #if ENABLED(POWER_LOSS_RECOVERY) + card.removeJobRecoveryFile(); + #endif + // Simplify3D includes the size, so zero out all spaces (#7227) + for (char *fn = parser.string_arg; *fn; ++fn) if (*fn == ' ') *fn = '\0'; + card.openFile(parser.string_arg, true); +} + +/** + * M24: Start or Resume SD Print + */ +void GcodeSuite::M24() { + #if ENABLED(PARK_HEAD_ON_PAUSE) + resume_print(); + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + if (parser.seenval('S')) card.setIndex(parser.value_long()); + #endif + + card.startFileprint(); + + #if ENABLED(POWER_LOSS_RECOVERY) + if (parser.seenval('T')) + print_job_timer.resume(parser.value_long()); + else + #endif + print_job_timer.start(); +} + +/** + * M25: Pause SD Print + */ +void GcodeSuite::M25() { + card.pauseSDPrint(); + print_job_timer.pause(); + + #if ENABLED(PARK_HEAD_ON_PAUSE) + enqueue_and_echo_commands_P(PSTR("M125")); // Must be enqueued with pauseSDPrint set to be last in the buffer + #endif +} + +/** + * M26: Set SD Card file index + */ +void GcodeSuite::M26() { + if (card.cardOK && parser.seenval('S')) + card.setIndex(parser.value_long()); +} + +/** + * M27: Get SD Card status + * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) + * OR, with 'C' get the current filename. + */ +void GcodeSuite::M27() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif + + if (parser.seen('C')) { + SERIAL_ECHOPGM_P(port, "Current file: "); + card.printFilename(); + } + + #if ENABLED(AUTO_REPORT_SD_STATUS) + else if (parser.seenval('S')) + card.set_auto_report_interval(parser.value_byte() + #if NUM_SERIAL > 1 + , port + #endif + ); + #endif + + else + card.getStatus( + #if NUM_SERIAL > 1 + port + #endif + ); +} + +/** + * M28: Start SD Write + */ +void GcodeSuite::M28() { card.openFile(parser.string_arg, false); } + +/** + * M29: Stop SD Write + * Processed in write to file routine + */ +void GcodeSuite::M29() { + // card.saving = false; +} + +/** + * M30 : Delete SD Card file + */ +void GcodeSuite::M30() { + if (card.cardOK) { + card.closefile(); + card.removeFile(parser.string_arg); + } +} + +/** + * M32: Select file and start SD Print + * + * Examples: + * + * M32 !PATH/TO/FILE.GCO# ; Start FILE.GCO + * M32 P !PATH/TO/FILE.GCO# ; Start FILE.GCO as a procedure + * M32 S60 !PATH/TO/FILE.GCO# ; Start FILE.GCO at byte 60 + * + */ +void GcodeSuite::M32() { + if (card.sdprinting) planner.synchronize(); + + if (card.cardOK) { + const bool call_procedure = parser.boolval('P'); + + card.openFile(parser.string_arg, true, call_procedure); + + if (parser.seenval('S')) card.setIndex(parser.value_long()); + + card.startFileprint(); + + // Procedure calls count as normal print time. + if (!call_procedure) print_job_timer.start(); + } +} + +#if ENABLED(LONG_FILENAME_HOST_SUPPORT) + + /** + * M33: Get the long full path of a file or folder + * + * Parameters: + * Case-insensitive DOS-style path to a file or folder + * + * Example: + * M33 miscel~1/armchair/armcha~1.gco + * + * Output: + * /Miscellaneous/Armchair/Armchair.gcode + */ + void GcodeSuite::M33() { + card.printLongPath(parser.string_arg + #if NUM_SERIAL > 1 + , command_queue_port[cmd_queue_index_r] + #endif + ); + } + +#endif // LONG_FILENAME_HOST_SUPPORT + +#if ENABLED(SDCARD_SORT_ALPHA) && ENABLED(SDSORT_GCODE) + + /** + * M34: Set SD Card Sorting Options + */ + void GcodeSuite::M34() { + if (parser.seen('S')) card.setSortOn(parser.value_bool()); + if (parser.seenval('F')) { + const int v = parser.value_long(); + card.setSortFolders(v < 0 ? -1 : v > 0 ? 1 : 0); + } + //if (parser.seen('R')) card.setSortReverse(parser.value_bool()); + } + +#endif // SDCARD_SORT_ALPHA && SDSORT_GCODE + +/** + * M928: Start SD Write + */ +void GcodeSuite::M928() { + card.openLogFile(parser.string_arg); +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/stats/M31.cpp b/Marlin/src/gcode/stats/M31.cpp index b39108bb90..958556e544 100644 --- a/Marlin/src/gcode/stats/M31.cpp +++ b/Marlin/src/gcode/stats/M31.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -26,15 +26,22 @@ #include "../../libs/duration_t.h" #include "../../lcd/ultralcd.h" +#if NUM_SERIAL > 1 + #include "../../gcode/queue.h" +#endif + /** * M31: Get the time since the start of SD Print (or last M109) */ void GcodeSuite::M31() { + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif char buffer[21]; - duration_t(print_job_timer.duration()).toString(buffer); + duration_t elapsed = print_job_timer.duration(); + elapsed.toString(buffer); + lcd_setstatus(buffer); - ui.set_status(buffer); - - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Print time: ", buffer); + SERIAL_ECHO_START_P(port); + SERIAL_ECHOLNPAIR_P(port, "Print time: ", buffer); } diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp index 908e6e5a31..351efd10c7 100644 --- a/Marlin/src/gcode/stats/M75-M78.cpp +++ b/Marlin/src/gcode/stats/M75-M78.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,36 +16,27 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../gcode.h" #include "../../module/printcounter.h" -#include "../../lcd/ultralcd.h" - -#include "../../MarlinCore.h" // for startOrResumeJob /** * M75: Start print timer */ -void GcodeSuite::M75() { - startOrResumeJob(); -} +void GcodeSuite::M75() { print_job_timer.start(); } /** * M76: Pause print timer */ -void GcodeSuite::M76() { - print_job_timer.pause(); -} +void GcodeSuite::M76() { print_job_timer.pause(); } /** * M77: Stop print timer */ -void GcodeSuite::M77() { - print_job_timer.stop(); -} +void GcodeSuite::M77() { print_job_timer.stop(); } #if ENABLED(PRINTCOUNTER) @@ -53,21 +44,10 @@ void GcodeSuite::M77() { * M78: Show print statistics */ void GcodeSuite::M78() { - if (parser.intval('S') == 78) { // "M78 S78" will reset the statistics + if (parser.intval('S') == 78) // "M78 S78" will reset the statistics print_job_timer.initStats(); - ui.reset_status(); - return; - } - - #if HAS_SERVICE_INTERVALS - if (parser.seenval('R')) { - print_job_timer.resetServiceInterval(parser.value_int()); - ui.reset_status(); - return; - } - #endif - - print_job_timer.showStats(); + else + print_job_timer.showStats(); } #endif // PRINTCOUNTER diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp deleted file mode 100644 index a289983b92..0000000000 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * gcode/temp/M104_M109.cpp - * - * Hotend target temperature control - */ - -#include "../../inc/MarlinConfigPre.h" - -#if EXTRUDERS - -#include "../gcode.h" -#include "../../module/temperature.h" -#include "../../module/motion.h" -#include "../../module/planner.h" -#include "../../lcd/ultralcd.h" - -#include "../../MarlinCore.h" // for startOrResumeJob, etc. - -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" - #if ENABLED(CANCEL_OBJECTS) - #include "../../feature/cancel_object.h" - #endif -#endif - -#if ENABLED(SINGLENOZZLE) - #include "../../module/tool_change.h" -#endif - -/** - * M104: Set Hotend Temperature target and return immediately - * - * Parameters: - * I : Material Preset index (if material presets are defined) - * T : Tool index. If omitted, applies to the active tool - * S : The target temperature in current units - */ -void GcodeSuite::M104() { - - if (DEBUGGING(DRYRUN)) return; - - #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 - constexpr int8_t target_extruder = 0; - #else - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - #endif - - bool got_temp = false; - int16_t temp = 0; - - // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT - got_temp = parser.seenval('I'); - if (got_temp) { - const uint8_t index = parser.value_byte(); - temp = ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].hotend_temp; - } - #endif - - // If no 'I' get the temperature from 'S' - if (!got_temp) { - got_temp = parser.seenval('S'); - if (got_temp) temp = parser.value_celsius(); - } - - if (got_temp) { - #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - singlenozzle_temp[target_extruder] = temp; - if (target_extruder != active_extruder) return; - #endif - thermalManager.setTargetHotend(temp, target_extruder); - - #if ENABLED(DUAL_X_CARRIAGE) - if (dxc_is_duplicating() && target_extruder == 0) - thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); - #endif - - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) - /** - * Stop the timer at the end of print. Start is managed by 'heat and wait' M109. - * Hotends use EXTRUDE_MINTEMP / 2 to allow nozzles to be put into hot standby - * mode, for instance in a dual extruder setup, without affecting the running - * print timer. - */ - thermalManager.check_timer_autostart(false, true); - #endif - } - - TERN_(AUTOTEMP, planner.autotemp_M104_M109()); -} - -/** - * M109: Set Hotend Temperature target and wait - * - * Parameters - * I : Material Preset index (if material presets are defined) - * T : Tool index. If omitted, applies to the active tool - * S : The target temperature in current units. Wait for heating only. - * R : The target temperature in current units. Wait for heating and cooling. - * - * With AUTOTEMP... - * F : Autotemp Scaling Factor. Set non-zero to enable Auto-temp. - * S : Minimum temperature, in current units. - * B : Maximum temperature, in current units. - * - * Examples - * M109 S100 : Set target to 100°. Wait until the hotend is at or above 100°. - * M109 R150 : Set target to 150°. Wait until the hotend gets close to 150°. - * - * With PRINTJOB_TIMER_AUTOSTART turning on heaters will start the print job timer - * (used by printingIsActive, etc.) and turning off heaters will stop the timer. - */ -void GcodeSuite::M109() { - - if (DEBUGGING(DRYRUN)) return; - - #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 - constexpr int8_t target_extruder = 0; - #else - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - #endif - - bool got_temp = false; - int16_t temp = 0; - - // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT - got_temp = parser.seenval('I'); - if (got_temp) { - const uint8_t index = parser.value_byte(); - temp = ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].hotend_temp; - } - #endif - - // Get the temperature from 'S' or 'R' - bool no_wait_for_cooling = false; - if (!got_temp) { - no_wait_for_cooling = parser.seenval('S'); - got_temp = no_wait_for_cooling || parser.seenval('R'); - if (got_temp) temp = int16_t(parser.value_celsius()); - } - - if (got_temp) { - #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - singlenozzle_temp[target_extruder] = temp; - if (target_extruder != active_extruder) return; - #endif - thermalManager.setTargetHotend(temp, target_extruder); - - #if ENABLED(DUAL_X_CARRIAGE) - if (dxc_is_duplicating() && target_extruder == 0) - thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); - #endif - - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) - /** - * Use half EXTRUDE_MINTEMP to allow nozzles to be put into hot - * standby mode, (e.g., in a dual extruder setup) without affecting - * the running print timer. - */ - thermalManager.check_timer_autostart(true, true); - #endif - - #if HAS_DISPLAY - if (thermalManager.isHeatingHotend(target_extruder) || !no_wait_for_cooling) - thermalManager.set_heating_message(target_extruder); - #endif - } - - TERN_(AUTOTEMP, planner.autotemp_M104_M109()); - - if (got_temp) - (void)thermalManager.wait_for_hotend(target_extruder, no_wait_for_cooling); -} - -#endif // EXTRUDERS diff --git a/Marlin/src/gcode/temp/M105.cpp b/Marlin/src/gcode/temp/M105.cpp deleted file mode 100644 index eefc3ae9f1..0000000000 --- a/Marlin/src/gcode/temp/M105.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../gcode.h" -#include "../../module/temperature.h" - -/** - * M105: Read hot end and bed temperature - */ -void GcodeSuite::M105() { - - const int8_t target_extruder = get_target_extruder_from_command(); - if (target_extruder < 0) return; - - SERIAL_ECHOPGM(STR_OK); - - #if HAS_TEMP_SENSOR - - thermalManager.print_heater_states(target_extruder - #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - , parser.boolval('R') - #endif - ); - - SERIAL_EOL(); - - #else - - SERIAL_ECHOLNPGM(" T:0"); // Some hosts send M105 to test the serial connection - - #endif -} diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp deleted file mode 100644 index 17ff8c3c8f..0000000000 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_FAN - -#include "../gcode.h" -#include "../../module/motion.h" -#include "../../module/temperature.h" - -#if PREHEAT_COUNT - #include "../../lcd/ultralcd.h" -#endif - -#if ENABLED(SINGLENOZZLE) - #define _ALT_P active_extruder - #define _CNT_P EXTRUDERS -#else - #define _ALT_P _MIN(active_extruder, FAN_COUNT - 1) - #define _CNT_P FAN_COUNT -#endif - -/** - * M106: Set Fan Speed - * - * I Material Preset index (if material presets are defined) - * S Speed between 0-255 - * P Fan index, if more than one fan - * - * With EXTRA_FAN_SPEED enabled: - * - * T Restore/Use/Set Temporary Speed: - * 1 = Restore previous speed after T2 - * 2 = Use temporary speed set with T3-255 - * 3-255 = Set the speed for use with T2 - */ -void GcodeSuite::M106() { - const uint8_t pfan = parser.byteval('P', _ALT_P); - - if (pfan < _CNT_P) { - - #if ENABLED(EXTRA_FAN_SPEED) - const uint16_t t = parser.intval('T'); - if (t > 0) return thermalManager.set_temp_fan_speed(pfan, t); - #endif - - const uint16_t dspeed = parser.seen('A') ? thermalManager.fan_speed[active_extruder] : 255; - - uint16_t speed = dspeed; - - // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT - const bool got_preset = parser.seenval('I'); - if (got_preset) speed = ui.material_preset[_MIN(parser.value_byte(), PREHEAT_COUNT - 1)].fan_speed; - #else - constexpr bool got_preset = false; - #endif - - if (!got_preset && parser.seenval('S')) - speed = parser.value_ushort(); - - // Set speed, with constraint - thermalManager.set_fan_speed(pfan, speed); - } -} - -/** - * M107: Fan Off - */ -void GcodeSuite::M107() { - const uint8_t p = parser.byteval('P', _ALT_P); - thermalManager.set_fan_speed(p, 0); -} - -#endif // HAS_FAN diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp deleted file mode 100644 index 9438b9e0c2..0000000000 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * gcode/temp/M140_M190.cpp - * - * Bed target temperature control - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_HEATED_BED - -#include "../gcode.h" -#include "../../module/temperature.h" -#include "../../module/motion.h" -#include "../../lcd/ultralcd.h" - -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" -#endif - -#if ENABLED(PRINTER_EVENT_LEDS) - #include "../../feature/leds/leds.h" -#endif - -#include "../../MarlinCore.h" // for wait_for_heatup, idle, startOrResumeJob - -/** - * M140: Set bed temperature - * - * I : Preset index (if material presets are defined) - * S : The target temperature in current units - */ -void GcodeSuite::M140() { - if (DEBUGGING(DRYRUN)) return; - - bool got_temp = false; - int16_t temp = 0; - - // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT - got_temp = parser.seenval('I'); - if (got_temp) { - const uint8_t index = parser.value_byte(); - temp = ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].bed_temp; - } - #endif - - // If no 'I' get the temperature from 'S' - if (!got_temp) { - got_temp = parser.seenval('S'); - if (got_temp) temp = parser.value_celsius(); - } - - if (got_temp) { - thermalManager.setTargetBed(temp); - - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) - /** - * Stop the timer at the end of print. Hotend, bed target, and chamber - * temperatures need to be set below mintemp. Order of M140, M104, and M141 - * at the end of the print does not matter. - */ - thermalManager.check_timer_autostart(false, true); - #endif - } -} - -/** - * M190 - Set Bed Temperature target and wait - * - * Parameters: - * I : Preset index (if material presets are defined) - * S : The target temperature in current units. Wait for heating only. - * R : The target temperature in current units. Wait for heating and cooling. - * - * Examples: - * M190 S60 : Set target to 60°. Wait until the bed is at or above 60°. - * M190 R40 : Set target to 40°. Wait until the bed gets close to 40°. - * - * With PRINTJOB_TIMER_AUTOSTART turning on heaters will start the print job timer - * (used by printingIsActive, etc.) and turning off heaters will stop the timer. - */ -void GcodeSuite::M190() { - if (DEBUGGING(DRYRUN)) return; - - bool got_temp = false; - int16_t temp = 0; - - // Accept 'I' if temperature presets are defined - #if PREHEAT_COUNT - got_temp = parser.seenval('I'); - if (got_temp) { - const uint8_t index = parser.value_byte(); - temp = ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].bed_temp; - } - #endif - - // Get the temperature from 'S' or 'R' - bool no_wait_for_cooling = false; - if (!got_temp) { - no_wait_for_cooling = parser.seenval('S'); - got_temp = no_wait_for_cooling || parser.seenval('R'); - if (got_temp) temp = int16_t(parser.value_celsius()); - } - - if (!got_temp) return; - - thermalManager.setTargetBed(temp); - - TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.check_timer_autostart(true, false)); - - ui.set_status_P(thermalManager.isHeatingBed() ? GET_TEXT(MSG_BED_HEATING) : GET_TEXT(MSG_BED_COOLING)); - - thermalManager.wait_for_bed(no_wait_for_cooling); -} - -#endif // HAS_HEATED_BED diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp deleted file mode 100644 index 41a79825aa..0000000000 --- a/Marlin/src/gcode/temp/M141_M191.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * gcode/temp/M141_M191.cpp - * - * Chamber target temperature control - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_HEATED_CHAMBER - -#include "../gcode.h" -#include "../../module/temperature.h" - -#include "../../module/motion.h" -#include "../../lcd/ultralcd.h" - -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" -#endif - -#if ENABLED(PRINTER_EVENT_LEDS) - #include "../../feature/leds/leds.h" -#endif - -#include "../../MarlinCore.h" // for wait_for_heatup, idle, startOrResumeJob - -/** - * M141: Set chamber temperature - */ -void GcodeSuite::M141() { - if (DEBUGGING(DRYRUN)) return; - if (parser.seenval('S')) { - thermalManager.setTargetChamber(parser.value_celsius()); - - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) - /** - * Stop the timer at the end of print. Hotend, bed target, and chamber - * temperatures need to be set below mintemp. Order of M140, M104, and M141 - * at the end of the print does not matter. - */ - thermalManager.check_timer_autostart(false, true); - #endif - } -} - -/** - * M191: Sxxx Wait for chamber current temp to reach target temp. Waits only when heating - * Rxxx Wait for chamber current temp to reach target temp. Waits when heating and cooling - */ -void GcodeSuite::M191() { - if (DEBUGGING(DRYRUN)) return; - - const bool no_wait_for_cooling = parser.seenval('S'); - if (no_wait_for_cooling || parser.seenval('R')) { - thermalManager.setTargetChamber(parser.value_celsius()); - TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.check_timer_autostart(true, false)); - } - else return; - - const bool is_heating = thermalManager.isHeatingChamber(); - if (is_heating || !no_wait_for_cooling) { - ui.set_status_P(is_heating ? GET_TEXT(MSG_CHAMBER_HEATING) : GET_TEXT(MSG_CHAMBER_COOLING)); - thermalManager.wait_for_chamber(false); - } -} - -#endif // HAS_HEATED_CHAMBER diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp deleted file mode 100644 index ccce09b4f1..0000000000 --- a/Marlin/src/gcode/temp/M303.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_PID_HEATING - -#include "../gcode.h" -#include "../../lcd/ultralcd.h" -#include "../../module/temperature.h" - -#if ENABLED(EXTENSIBLE_UI) - #include "../../lcd/extui/ui_api.h" -#endif - -/** - * M303: PID relay autotune - * - * S Set the target temperature. (Default: 150C / 70C) - * E Extruder number to tune, or -1 for the bed. (Default: E0) - * C Number of times to repeat the procedure. (Minimum: 3, Default: 5) - * U Flag to apply the result to the current PID values - * - * With PID_DEBUG: - * D Toggle PID debugging and EXIT without further action. - */ - -#if ENABLED(PID_DEBUG) - bool pid_debug_flag = 0; -#endif - -void GcodeSuite::M303() { - - #if ENABLED(PID_DEBUG) - if (parser.seen('D')) { - pid_debug_flag = !pid_debug_flag; - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("PID Debug "); - serialprintln_onoff(pid_debug_flag); - return; - } - #endif - - #define SI TERN(PIDTEMPBED, H_BED, H_E0) - #define EI TERN(PIDTEMP, HOTENDS - 1, H_BED) - const heater_id_t e = (heater_id_t)parser.intval('E'); - if (!WITHIN(e, SI, EI)) { - SERIAL_ECHOLNPGM(STR_PID_BAD_EXTRUDER_NUM); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_BAD_EXTRUDER_NUM)); - return; - } - - const int c = parser.intval('C', 5); - const bool u = parser.boolval('U'); - const int16_t temp = parser.celsiusval('S', e < 0 ? PREHEAT_1_TEMP_BED : PREHEAT_1_TEMP_HOTEND); - - #if DISABLED(BUSY_WHILE_HEATING) - KEEPALIVE_STATE(NOT_BUSY); - #endif - - ui.set_status(GET_TEXT(MSG_PID_AUTOTUNE)); - thermalManager.PID_autotune(temp, e, c, u); - ui.reset_status(); -} - -#endif // HAS_PID_HEATING diff --git a/Marlin/src/gcode/temperature/M104_M109.cpp b/Marlin/src/gcode/temperature/M104_M109.cpp new file mode 100644 index 0000000000..61099aa208 --- /dev/null +++ b/Marlin/src/gcode/temperature/M104_M109.cpp @@ -0,0 +1,246 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../lcd/ultralcd.h" +#include "../../Marlin.h" + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "../../module/printcounter.h" +#endif + +#if ENABLED(PRINTER_EVENT_LEDS) + #include "../../feature/leds/leds.h" +#endif + +/** + * M104: Set hot end temperature + */ +void GcodeSuite::M104() { + if (get_target_extruder_from_command()) return; + if (DEBUGGING(DRYRUN)) return; + + const uint8_t e = target_extruder; + + #if ENABLED(SINGLENOZZLE) + if (e != active_extruder) return; + #endif + + if (parser.seenval('S')) { + const int16_t temp = parser.value_celsius(); + thermalManager.setTargetHotend(temp, e); + + #if ENABLED(DUAL_X_CARRIAGE) + if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && e == 0) + thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); + #endif + + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + /** + * Stop the timer at the end of print. Start is managed by 'heat and wait' M109. + * We use half EXTRUDE_MINTEMP here to allow nozzles to be put into hot + * standby mode, for instance in a dual extruder setup, without affecting + * the running print timer. + */ + if (temp <= (EXTRUDE_MINTEMP) / 2) { + print_job_timer.stop(); + lcd_reset_status(); + } + #endif + } + + #if ENABLED(AUTOTEMP) + planner.autotemp_M104_M109(); + #endif +} + +/** + * M109: Sxxx Wait for extruder(s) to reach temperature. Waits only when heating. + * Rxxx Wait for extruder(s) to reach temperature. Waits when heating and cooling. + */ + +#ifndef MIN_COOLING_SLOPE_DEG + #define MIN_COOLING_SLOPE_DEG 1.50 +#endif +#ifndef MIN_COOLING_SLOPE_TIME + #define MIN_COOLING_SLOPE_TIME 60 +#endif + +void GcodeSuite::M109() { + + if (get_target_extruder_from_command()) return; + if (DEBUGGING(DRYRUN)) return; + + #if ENABLED(SINGLENOZZLE) + if (target_extruder != active_extruder) return; + #endif + + const bool no_wait_for_cooling = parser.seenval('S'); + if (no_wait_for_cooling || parser.seenval('R')) { + const int16_t temp = parser.value_celsius(); + thermalManager.setTargetHotend(temp, target_extruder); + + #if ENABLED(DUAL_X_CARRIAGE) + if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) + thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); + #endif + + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + /** + * Use half EXTRUDE_MINTEMP to allow nozzles to be put into hot + * standby mode, (e.g., in a dual extruder setup) without affecting + * the running print timer. + */ + if (parser.value_celsius() <= (EXTRUDE_MINTEMP) / 2) { + print_job_timer.stop(); + lcd_reset_status(); + } + else + print_job_timer.start(); + #endif + + #if ENABLED(ULTRA_LCD) + const bool heating = thermalManager.isHeatingHotend(target_extruder); + if (heating || !no_wait_for_cooling) + #if HOTENDS > 1 + lcd_status_printf_P(0, heating ? PSTR("E%i " MSG_HEATING) : PSTR("E%i " MSG_COOLING), target_extruder + 1); + #else + lcd_setstatusPGM(heating ? PSTR("E " MSG_HEATING) : PSTR("E " MSG_COOLING)); + #endif + #endif + } + else return; + + #if ENABLED(AUTOTEMP) + planner.autotemp_M104_M109(); + #endif + + #if TEMP_RESIDENCY_TIME > 0 + millis_t residency_start_ms = 0; + // Loop until the temperature has stabilized + #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + (TEMP_RESIDENCY_TIME) * 1000UL)) + #else + // Loop until the temperature is very close target + #define TEMP_CONDITIONS (wants_to_cool ? thermalManager.isCoolingHotend(target_extruder) : thermalManager.isHeatingHotend(target_extruder)) + #endif + + float target_temp = -1.0, old_temp = 9999.0; + bool wants_to_cool = false; + wait_for_heatup = true; + millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + #if ENABLED(PRINTER_EVENT_LEDS) + const float start_temp = thermalManager.degHotend(target_extruder); + uint8_t old_blue = 0; + #endif + + do { + // Target temperature might be changed during the loop + if (target_temp != thermalManager.degTargetHotend(target_extruder)) { + wants_to_cool = thermalManager.isCoolingHotend(target_extruder); + target_temp = thermalManager.degTargetHotend(target_extruder); + + // Exit if S, continue if S, R, or R + if (no_wait_for_cooling && wants_to_cool) break; + } + + now = millis(); + if (ELAPSED(now, next_temp_ms)) { //Print temp & remaining time every 1s while waiting + next_temp_ms = now + 1000UL; + thermalManager.print_heaterstates(); + #if TEMP_RESIDENCY_TIME > 0 + SERIAL_PROTOCOLPGM(" W:"); + if (residency_start_ms) + SERIAL_PROTOCOL(long((((TEMP_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL)); + else + SERIAL_PROTOCOLCHAR('?'); + #endif + SERIAL_EOL(); + } + + idle(); + reset_stepper_timeout(); // Keep steppers powered + + const float temp = thermalManager.degHotend(target_extruder); + + #if ENABLED(PRINTER_EVENT_LEDS) + // Gradually change LED strip from violet to red as nozzle heats up + if (!wants_to_cool) { + const uint8_t blue = map(constrain(temp, start_temp, target_temp), start_temp, target_temp, 255, 0); + if (blue != old_blue) { + old_blue = blue; + leds.set_color( + MakeLEDColor(255, 0, blue, 0, pixels.getBrightness()) + #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) + , true + #endif + ); + } + } + #endif + + #if TEMP_RESIDENCY_TIME > 0 + + const float temp_diff = ABS(target_temp - temp); + + if (!residency_start_ms) { + // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time. + if (temp_diff < TEMP_WINDOW) residency_start_ms = now; + } + else if (temp_diff > TEMP_HYSTERESIS) { + // Restart the timer whenever the temperature falls outside the hysteresis. + residency_start_ms = now; + } + + #endif + + // Prevent a wait-forever situation if R is misused i.e. M109 R0 + if (wants_to_cool) { + // break after MIN_COOLING_SLOPE_TIME seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG + if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG)) break; + next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME; + old_temp = temp; + } + } + + } while (wait_for_heatup && TEMP_CONDITIONS); + + if (wait_for_heatup) { + lcd_reset_status(); + #if ENABLED(PRINTER_EVENT_LEDS) + leds.set_white(); + #endif + } + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(IN_HANDLER); + #endif +} diff --git a/Marlin/src/gcode/temperature/M105.cpp b/Marlin/src/gcode/temperature/M105.cpp new file mode 100644 index 0000000000..4216c417e7 --- /dev/null +++ b/Marlin/src/gcode/temperature/M105.cpp @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../gcode.h" +#include "../../module/temperature.h" + +#if NUM_SERIAL > 1 + #include "../../gcode/queue.h" +#endif + +/** + * M105: Read hot end and bed temperature + */ +void GcodeSuite::M105() { + if (get_target_extruder_from_command()) return; + + #if NUM_SERIAL > 1 + const int16_t port = command_queue_port[cmd_queue_index_r]; + #endif + + #if HAS_TEMP_SENSOR + SERIAL_PROTOCOLPGM_P(port, MSG_OK); + thermalManager.print_heaterstates( + #if NUM_SERIAL > 1 + port + #endif + ); + #else // !HAS_TEMP_SENSOR + SERIAL_ERROR_START_P(port); + SERIAL_ERRORLNPGM_P(port, MSG_ERR_NO_THERMISTORS); + #endif + + SERIAL_EOL_P(port); +} diff --git a/Marlin/src/gcode/temperature/M106_M107.cpp b/Marlin/src/gcode/temperature/M106_M107.cpp new file mode 100644 index 0000000000..b8bdc03d61 --- /dev/null +++ b/Marlin/src/gcode/temperature/M106_M107.cpp @@ -0,0 +1,77 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if FAN_COUNT > 0 + +#include "../gcode.h" +#include "../../Marlin.h" // for fanSpeeds — should move those to Planner + +/** + * M106: Set Fan Speed + * + * S Speed between 0-255 + * P Fan index, if more than one fan + * + * With EXTRA_FAN_SPEED enabled: + * + * T Restore/Use/Set Temporary Speed: + * 1 = Restore previous speed after T2 + * 2 = Use temporary speed set with T3-255 + * 3-255 = Set the speed for use with T2 + */ +void GcodeSuite::M106() { + const uint8_t p = parser.byteval('P'); + if (p < FAN_COUNT) { + #if ENABLED(EXTRA_FAN_SPEED) + const int16_t t = parser.intval('T'); + if (t > 0) { + switch (t) { + case 1: + fanSpeeds[p] = old_fanSpeeds[p]; + break; + case 2: + old_fanSpeeds[p] = fanSpeeds[p]; + fanSpeeds[p] = new_fanSpeeds[p]; + break; + default: + new_fanSpeeds[p] = MIN(t, 255); + break; + } + return; + } + #endif // EXTRA_FAN_SPEED + const uint16_t s = parser.ushortval('S', 255); + fanSpeeds[p] = MIN(s, 255U); + } +} + +/** + * M107: Fan Off + */ +void GcodeSuite::M107() { + const uint16_t p = parser.ushortval('P'); + if (p < FAN_COUNT) fanSpeeds[p] = 0; +} + +#endif // FAN_COUNT > 0 diff --git a/Marlin/src/gcode/temperature/M140_M190.cpp b/Marlin/src/gcode/temperature/M140_M190.cpp new file mode 100644 index 0000000000..c51c643288 --- /dev/null +++ b/Marlin/src/gcode/temperature/M140_M190.cpp @@ -0,0 +1,180 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_HEATED_BED + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../module/motion.h" +#include "../../lcd/ultralcd.h" + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "../../module/printcounter.h" +#endif + +#if ENABLED(PRINTER_EVENT_LEDS) + #include "../../feature/leds/leds.h" +#endif + +#include "../../Marlin.h" // for wait_for_heatup and idle() + +/** + * M140: Set bed temperature + */ +void GcodeSuite::M140() { + if (DEBUGGING(DRYRUN)) return; + if (parser.seenval('S')) thermalManager.setTargetBed(parser.value_celsius()); +} + +#ifndef MIN_COOLING_SLOPE_DEG_BED + #define MIN_COOLING_SLOPE_DEG_BED 1.50 +#endif +#ifndef MIN_COOLING_SLOPE_TIME_BED + #define MIN_COOLING_SLOPE_TIME_BED 60 +#endif + +/** + * M190: Sxxx Wait for bed current temp to reach target temp. Waits only when heating + * Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling + */ +void GcodeSuite::M190() { + if (DEBUGGING(DRYRUN)) return; + + const bool no_wait_for_cooling = parser.seenval('S'); + if (no_wait_for_cooling || parser.seenval('R')) { + thermalManager.setTargetBed(parser.value_celsius()); + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + if (parser.value_celsius() > BED_MINTEMP) + print_job_timer.start(); + #endif + } + else return; + + lcd_setstatusPGM(thermalManager.isHeatingBed() ? PSTR(MSG_BED_HEATING) : PSTR(MSG_BED_COOLING)); + + #if TEMP_BED_RESIDENCY_TIME > 0 + millis_t residency_start_ms = 0; + // Loop until the temperature has stabilized + #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + (TEMP_BED_RESIDENCY_TIME) * 1000UL)) + #else + // Loop until the temperature is very close target + #define TEMP_BED_CONDITIONS (wants_to_cool ? thermalManager.isCoolingBed() : thermalManager.isHeatingBed()) + #endif + + float target_temp = -1, old_temp = 9999; + bool wants_to_cool = false; + wait_for_heatup = true; + millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + target_extruder = active_extruder; // for print_heaterstates + + #if ENABLED(PRINTER_EVENT_LEDS) + const float start_temp = thermalManager.degBed(); + uint8_t old_red = 127; + #endif + + do { + // Target temperature might be changed during the loop + if (target_temp != thermalManager.degTargetBed()) { + wants_to_cool = thermalManager.isCoolingBed(); + target_temp = thermalManager.degTargetBed(); + + // Exit if S, continue if S, R, or R + if (no_wait_for_cooling && wants_to_cool) break; + } + + now = millis(); + if (ELAPSED(now, next_temp_ms)) { //Print Temp Reading every 1 second while heating up. + next_temp_ms = now + 1000UL; + thermalManager.print_heaterstates(); + #if TEMP_BED_RESIDENCY_TIME > 0 + SERIAL_PROTOCOLPGM(" W:"); + if (residency_start_ms) + SERIAL_PROTOCOL(long((((TEMP_BED_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL)); + else + SERIAL_PROTOCOLCHAR('?'); + #endif + SERIAL_EOL(); + } + + idle(); + reset_stepper_timeout(); // Keep steppers powered + + const float temp = thermalManager.degBed(); + + #if ENABLED(PRINTER_EVENT_LEDS) + // Gradually change LED strip from blue to violet as bed heats up + if (!wants_to_cool) { + const uint8_t red = map(constrain(temp, start_temp, target_temp), start_temp, target_temp, 0, 255); + if (red != old_red) { + old_red = red; + leds.set_color( + MakeLEDColor(red, 0, 255, 0, pixels.getBrightness()) + #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) + , true + #endif + ); + } + } + #endif + + #if TEMP_BED_RESIDENCY_TIME > 0 + + const float temp_diff = ABS(target_temp - temp); + + if (!residency_start_ms) { + // Start the TEMP_BED_RESIDENCY_TIME timer when we reach target temp for the first time. + if (temp_diff < TEMP_BED_WINDOW) residency_start_ms = now; + } + else if (temp_diff > TEMP_BED_HYSTERESIS) { + // Restart the timer whenever the temperature falls outside the hysteresis. + residency_start_ms = now; + } + + #endif // TEMP_BED_RESIDENCY_TIME > 0 + + // Prevent a wait-forever situation if R is misused i.e. M190 R0 + if (wants_to_cool) { + // Break after MIN_COOLING_SLOPE_TIME_BED seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_BED + if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG_BED)) break; + next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME_BED; + old_temp = temp; + } + } + + } while (wait_for_heatup && TEMP_BED_CONDITIONS); + + if (wait_for_heatup) lcd_reset_status(); + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(IN_HANDLER); + #endif +} + +#endif // HAS_HEATED_BED diff --git a/Marlin/src/gcode/temp/M155.cpp b/Marlin/src/gcode/temperature/M155.cpp similarity index 80% rename from Marlin/src/gcode/temp/M155.cpp rename to Marlin/src/gcode/temperature/M155.cpp index 30129a0e6f..611676a672 100644 --- a/Marlin/src/gcode/temp/M155.cpp +++ b/Marlin/src/gcode/temperature/M155.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../../inc/MarlinConfig.h" -#if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) +#if ENABLED(AUTO_REPORT_TEMPERATURES) && HAS_TEMP_SENSOR #include "../gcode.h" #include "../../module/temperature.h" diff --git a/Marlin/src/gcode/temperature/M303.cpp b/Marlin/src/gcode/temperature/M303.cpp new file mode 100644 index 0000000000..583ea9d7e4 --- /dev/null +++ b/Marlin/src/gcode/temperature/M303.cpp @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M303: PID relay autotune + * + * S sets the target temperature. (default 150C / 70C) + * E (-1 for the bed) (default 0) + * C + * U with a non-zero value will apply the result to current settings + */ +void GcodeSuite::M303() { + #if HAS_PID_HEATING + const int e = parser.intval('E'), c = parser.intval('C', 5); + const bool u = parser.boolval('U'); + + int16_t temp = parser.celsiusval('S', e < 0 ? 70 : 150); + + if (WITHIN(e, 0, HOTENDS - 1)) + target_extruder = e; + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + thermalManager.PID_autotune(temp, e, c, u); + + #if DISABLED(BUSY_WHILE_HEATING) + KEEPALIVE_STATE(IN_HANDLER); + #endif + #else + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_M303_DISABLED); + #endif +} diff --git a/Marlin/src/gcode/units/G20_G21.cpp b/Marlin/src/gcode/units/G20_G21.cpp index 6f1d5adbcc..74ff343af5 100644 --- a/Marlin/src/gcode/units/G20_G21.cpp +++ b/Marlin/src/gcode/units/G20_G21.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/units/M149.cpp b/Marlin/src/gcode/units/M149.cpp index 5d9f832069..307258816f 100644 --- a/Marlin/src/gcode/units/M149.cpp +++ b/Marlin/src/gcode/units/M149.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ diff --git a/Marlin/src/gcode/units/M82_M83.cpp b/Marlin/src/gcode/units/M82_M83.cpp index d93f0ea5ad..b68d6a28ee 100644 --- a/Marlin/src/gcode/units/M82_M83.cpp +++ b/Marlin/src/gcode/units/M82_M83.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -25,9 +25,9 @@ /** * M82: Set E codes absolute (default) */ -void GcodeSuite::M82() { set_e_absolute(); } +void GcodeSuite::M82() { axis_relative_modes[E_AXIS] = false; } /** * M83: Set E codes relative while in Absolute Coordinates (G90) mode */ -void GcodeSuite::M83() { set_e_relative(); } +void GcodeSuite::M83() { axis_relative_modes[E_AXIS] = true; } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 45921f7be3..11d4a3ce65 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,357 +16,208 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Conditionals_LCD.h * Conditionals that need to be set before Configuration_adv.h or pins.h */ -// Kinematics -#if ENABLED(MORGAN_SCARA) - #define IS_SCARA 1 - #define IS_KINEMATIC 1 -#elif ENABLED(DELTA) - #define IS_KINEMATIC 1 -#else - #define IS_CARTESIAN 1 -#endif +#ifndef CONDITIONALS_LCD_H // Get the LCD defines which are needed first +#define CONDITIONALS_LCD_H -// MKS_LCD12864 is a variant of MKS_MINI_12864 -#if ENABLED(MKS_LCD12864) - #define MKS_MINI_12864 -#endif +#define LCD_HAS_DIRECTIONAL_BUTTONS (BUTTON_EXISTS(UP) || BUTTON_EXISTS(DWN) || BUTTON_EXISTS(LFT) || BUTTON_EXISTS(RT)) -/** - * General Flags that may be set below by specific LCDs - * - * DOGLCD : Run a Graphical LCD through U8GLib (with MarlinUI) - * IS_ULTIPANEL : Define LCD_PINS_D5/6/7 for direct-connected "Ultipanel" LCDs - * IS_ULTRA_LCD : Ultra LCD, not necessarily Ultipanel. Used most often with NEWPANEL. - * IS_RRD_SC : Common RRD Smart Controller digital interface pins - * IS_RRD_FG_SC : Common RRD Full Graphical Smart Controller digital interface pins - * U8GLIB_ST7920 : Most common DOGM display SPI interface, supporting a "lightweight" display mode. - * U8GLIB_SH1106 : SH1106 OLED with I2C interface via U8GLib - * IS_U8GLIB_SSD1306 : SSD1306 OLED with I2C interface via U8GLib - * U8GLIB_SSD1309 : SSD1309 OLED with I2C interface via U8GLib - * U8GLIB_ST7565_64128N : ST7565 128x64 LCD with SPI interface via U8GLib - * U8GLIB_LM6059_AF : LM6059 with Hardware SPI via U8GLib - */ -#if EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) - - #define MINIPANEL - -#elif ENABLED(CARTESIO_UI) +#if ENABLED(CARTESIO_UI) #define DOGLCD - #define IS_ULTIPANEL 1 + #define ULTIPANEL + #define DEFAULT_LCD_CONTRAST 90 + #define LCD_CONTRAST_MIN 60 + #define LCD_CONTRAST_MAX 140 -#elif EITHER(DWIN_MARLINUI_PORTRAIT, DWIN_MARLINUI_LANDSCAPE) +#elif ENABLED(MAKRPANEL) - #define IS_DWIN_MARLINUI 1 - #define IS_ULTIPANEL 1 + #define U8GLIB_ST7565_64128N #elif ENABLED(ZONESTAR_LCD) - #define ADC_KEYPAD - #define IS_RRW_KEYPAD + #define REPRAPWORLD_KEYPAD #define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + #define ADC_KEYPAD #define ADC_KEY_NUM 8 - #define IS_ULTIPANEL 1 + #define ULTIPANEL - // This helps to implement ADC_KEYPAD menus - #define REVERSE_MENU_DIRECTION + // this helps to implement ADC_KEYPAD menus #define ENCODER_PULSES_PER_STEP 1 #define ENCODER_STEPS_PER_MENU_ITEM 1 #define ENCODER_FEEDRATE_DEADZONE 2 - -#elif ENABLED(ZONESTAR_12864LCD) - #define DOGLCD - #define IS_RRD_SC - #define U8GLIB_ST7920 - -#elif ENABLED(ZONESTAR_12864OLED) - #define IS_RRD_SC - #define U8GLIB_SH1106 - -#elif ENABLED(ZONESTAR_12864OLED_SSD1306) - #define IS_RRD_SC - #define IS_U8GLIB_SSD1306 + #define REVERSE_MENU_DIRECTION #elif ENABLED(RADDS_DISPLAY) - #define IS_ULTIPANEL 1 + #define ULTIPANEL #define ENCODER_PULSES_PER_STEP 2 -#elif EITHER(ANET_FULL_GRAPHICS_LCD, BQ_LCD_SMART_CONTROLLER) +#elif ENABLED(ANET_FULL_GRAPHICS_LCD) - #define IS_RRD_FG_SC + #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -#elif ANY(miniVIKI, VIKI2, ELB_FULL_GRAPHIC_CONTROLLER, AZSMZ_12864) +#elif ENABLED(BQ_LCD_SMART_CONTROLLER) - #define DOGLCD - #define IS_ULTIPANEL 1 + #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +#elif ENABLED(miniVIKI) || ENABLED(VIKI2) || ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) || ENABLED(AZSMZ_12864) + + #define ULTRA_LCD //general LCD support, also 16x2 + #define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) + #define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. #if ENABLED(miniVIKI) + #define LCD_CONTRAST_MIN 75 + #define LCD_CONTRAST_MAX 115 + #define DEFAULT_LCD_CONTRAST 95 #define U8GLIB_ST7565_64128N #elif ENABLED(VIKI2) + #define LCD_CONTRAST_MIN 0 + #define LCD_CONTRAST_MAX 255 + #define DEFAULT_LCD_CONTRAST 140 #define U8GLIB_ST7565_64128N #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define LCD_CONTRAST_MIN 90 + #define LCD_CONTRAST_MAX 130 + #define DEFAULT_LCD_CONTRAST 110 #define U8GLIB_LM6059_AF + #define SD_DETECT_INVERTED #elif ENABLED(AZSMZ_12864) + #define LCD_CONTRAST_MIN 120 + #define LCD_CONTRAST_MAX 255 + #define DEFAULT_LCD_CONTRAST 190 #define U8GLIB_ST7565_64128N #endif #elif ENABLED(OLED_PANEL_TINYBOY2) - #define IS_U8GLIB_SSD1306 - #define IS_ULTIPANEL 1 + #define U8GLIB_SSD1306 + #define ULTIPANEL + #define REVERSE_ENCODER_DIRECTION + #define REVERSE_MENU_DIRECTION #elif ENABLED(RA_CONTROL_PANEL) #define LCD_I2C_TYPE_PCA8574 #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander - #define IS_ULTIPANEL 1 + #define ULTIPANEL #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) #define DOGLCD #define U8GLIB_ST7920 - #define IS_ULTIPANEL 1 + #define ULTIPANEL #elif ENABLED(CR10_STOCKDISPLAY) - #define IS_RRD_FG_SC - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + #ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(125) + #endif + #ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(125) + #endif + #ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(125) + #endif #elif ENABLED(MKS_12864OLED) - #define IS_RRD_SC + #define REPRAP_DISCOUNT_SMART_CONTROLLER #define U8GLIB_SH1106 #elif ENABLED(MKS_12864OLED_SSD1306) - #define IS_RRD_SC - #define IS_U8GLIB_SSD1306 + #define REPRAP_DISCOUNT_SMART_CONTROLLER + #define U8GLIB_SSD1306 -#elif ENABLED(FYSETC_242_OLED_12864) +#elif ENABLED(MKS_MINI_12864) - #define IS_RRD_SC - #define U8GLIB_SH1106 + #define MINIPANEL - #define LED_CONTROL_MENU - #define NEOPIXEL_LED - #undef NEOPIXEL_TYPE - #define NEOPIXEL_TYPE NEO_RGB - #if NEOPIXEL_PIXELS < 3 - #undef NEOPIXELS_PIXELS - #define NEOPIXEL_PIXELS 3 - #endif - #ifndef NEOPIXEL_BRIGHTNESS - #define NEOPIXEL_BRIGHTNESS 127 - #endif +#endif - #if ENABLED(PSU_CONTROL) - #define LED_BACKLIGHT_TIMEOUT 10000 - #endif - -#elif ANY(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_GENERIC_12864_1_1) - - #define FYSETC_MINI_12864 +#if ENABLED(MAKRPANEL) || ENABLED(MINIPANEL) #define DOGLCD - #define IS_ULTIPANEL 1 - #define LED_COLORS_REDUCE_GREEN - #if ENABLED(PSU_CONTROL) && EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1) - #define LED_BACKLIGHT_TIMEOUT 10000 - #endif + #define ULTIPANEL + #define DEFAULT_LCD_CONTRAST 17 +#endif - // Require LED backlighting enabled - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #define RGB_LED - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define LED_CONTROL_MENU - #define NEOPIXEL_LED - #undef NEOPIXEL_TYPE - #define NEOPIXEL_TYPE NEO_RGB - #if NEOPIXEL_PIXELS < 3 - #undef NEOPIXELS_PIXELS - #define NEOPIXEL_PIXELS 3 - #endif - #ifndef NEOPIXEL_BRIGHTNESS - #define NEOPIXEL_BRIGHTNESS 127 - #endif - //#define NEOPIXEL_STARTUP_TEST - #endif - -#elif ENABLED(ULTI_CONTROLLER) - - #define IS_ULTIPANEL 1 +#if ENABLED(ULTI_CONTROLLER) #define U8GLIB_SSD1309 + #define REVERSE_ENCODER_DIRECTION #define LCD_RESET_PIN LCD_PINS_D6 // This controller need a reset pin + #define LCD_CONTRAST_MIN 0 + #define LCD_CONTRAST_MAX 254 + #define DEFAULT_LCD_CONTRAST 127 #define ENCODER_PULSES_PER_STEP 2 #define ENCODER_STEPS_PER_MENU_ITEM 2 +#endif + +// Generic support for SSD1306 / SSD1309 / SH1106 OLED based LCDs. +#if ENABLED(U8GLIB_SSD1306) || ENABLED(U8GLIB_SSD1309) || ENABLED(U8GLIB_SH1106) + #define ULTRA_LCD //general LCD support, also 16x2 + #define DOGLCD // Support for I2C LCD 128x64 (Controller SSD1306 / SSD1309 / SH1106 graphic Display Family) +#endif + +#if ENABLED(PANEL_ONE) || ENABLED(U8GLIB_SH1106) + + #define ULTIMAKERCONTROLLER #elif ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) - #define IS_RRD_SC + #define REPRAP_DISCOUNT_SMART_CONTROLLER #define LCD_WIDTH 16 #define LCD_HEIGHT 2 -#elif EITHER(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) - - #define IS_TFTGLCD_PANEL 1 - #define IS_ULTIPANEL 1 // Note that IS_ULTIPANEL leads to HAS_WIRED_LCD - - #if ENABLED(SDSUPPORT) && DISABLED(LCD_PROGRESS_BAR) - #define LCD_PROGRESS_BAR - #endif - #if ENABLED(TFTGLCD_PANEL_I2C) - #define LCD_I2C_ADDRESS 0x27 // Must be equal to panel's I2C slave addres - #endif - #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD, used for both I2C and SPI buses (LiquidTWI2 not required) - #define STD_ENCODER_PULSES_PER_STEP 2 - #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 - #define LCD_WIDTH 20 // 20 or 24 chars in line - #define LCD_HEIGHT 10 // Character lines - #define LCD_CONTRAST_MIN 127 - #define LCD_CONTRAST_MAX 255 - #define DEFAULT_LCD_CONTRAST 250 - #define CONVERT_TO_EXT_ASCII // Use extended 128-255 symbols from ASCII table. - // At this time present conversion only for cyrillic - bg, ru and uk languages. - // First 7 ASCII symbols in panel font must be replaced with Marlin's special symbols. #endif -#if ENABLED(IS_RRD_FG_SC) - #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -#endif - -#if EITHER(MAKRPANEL, MINIPANEL) - #define IS_ULTIPANEL 1 - #define DOGLCD - #if ENABLED(MAKRPANEL) - #define U8GLIB_ST7565_64128N - #endif -#endif - -#if ENABLED(IS_U8GLIB_SSD1306) - #define U8GLIB_SSD1306 -#endif - -#if ENABLED(OVERLORD_OLED) - #define IS_ULTIPANEL 1 - #define U8GLIB_SH1106 - /** - * PCA9632 for buzzer and LEDs via i2c - * No auto-inc, red and green leds switched, buzzer - */ - #define PCA9632 - #define PCA9632_NO_AUTO_INC - #define PCA9632_GRN 0x00 - #define PCA9632_RED 0x02 - #define PCA9632_BUZZER - #define PCA9632_BUZZER_DATA { 0x09, 0x02 } - - #define ENCODER_PULSES_PER_STEP 1 // Overlord uses buttons - #define ENCODER_STEPS_PER_MENU_ITEM 1 -#endif - -// 128x64 I2C OLED LCDs - SSD1306/SSD1309/SH1106 -#if ANY(U8GLIB_SSD1306, U8GLIB_SSD1309, U8GLIB_SH1106) - #define HAS_U8GLIB_I2C_OLED 1 -#endif -#if HAS_U8GLIB_I2C_OLED - #define IS_ULTRA_LCD - #define DOGLCD -#endif - -// ST7920-based graphical displays -#if ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, LCD_FOR_MELZI, SILVER_GATE_GLCD_CONTROLLER) +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) || ENABLED(LCD_FOR_MELZI) || ENABLED(SILVER_GATE_GLCD_CONTROLLER) #define DOGLCD #define U8GLIB_ST7920 - #define IS_RRD_SC -#endif - -// RepRapDiscount LCD or Graphical LCD with rotary click encoder -#if ENABLED(IS_RRD_SC) #define REPRAP_DISCOUNT_SMART_CONTROLLER #endif -/** - * SPI Ultipanels - */ - -// Basic Ultipanel-like displays -#if ANY(ULTIMAKERCONTROLLER, REPRAP_DISCOUNT_SMART_CONTROLLER, G3D_PANEL, RIGIDBOT_PANEL, PANEL_ONE, U8GLIB_SH1106) - #define IS_ULTIPANEL 1 +#if ENABLED(ULTIMAKERCONTROLLER) \ + || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) \ + || ENABLED(G3D_PANEL) \ + || ENABLED(RIGIDBOT_PANEL) \ + || ENABLED(ULTI_CONTROLLER) + #define ULTIPANEL #endif -// Einstart OLED has Cardinal nav via pins defined in pins_EINSTART-S.h -#if ENABLED(U8GLIB_SH1106_EINSTART) - #define DOGLCD - #define IS_ULTIPANEL 1 -#endif - -// Compatibility -#if ENABLED(FSMC_GRAPHICAL_TFT) - #define TFT_CLASSIC_UI - #define TFT_INTERFACE_FSMC - #define TFT_GENERIC -#elif ENABLED(SPI_GRAPHICAL_TFT) - #define TFT_CLASSIC_UI - #define TFT_INTERFACE_SPI - #define TFT_GENERIC -#elif EITHER(TFT_320x240, TFT_480x320) - #define TFT_COLOR_UI - #define TFT_INTERFACE_FSMC - #define TFT_GENERIC -#elif EITHER(TFT_320x240_SPI, TFT_480x320_SPI) - #define TFT_COLOR_UI - #define TFT_INTERFACE_SPI - #define TFT_GENERIC -#elif ENABLED(TFT_LVGL_UI_FSMC) - #define TFT_LVGL_UI - #define TFT_INTERFACE_FSMC - #define TFT_GENERIC -#elif ENABLED(TFT_LVGL_UI_SPI) - #define TFT_LVGL_UI - #define TFT_INTERFACE_SPI - #define TFT_GENERIC -#endif - -// FSMC/SPI TFT Panels (LVGL) -#if ENABLED(TFT_LVGL_UI) - #define HAS_TFT_LVGL_UI 1 -#endif - -// FSMC/SPI TFT Panels -#if ENABLED(TFT_CLASSIC_UI) - #define TFT_SCALED_DOGLCD 1 -#endif - -#if TFT_SCALED_DOGLCD - #define DOGLCD - #define IS_ULTIPANEL 1 - #define DELAYED_BACKLIGHT_INIT -#elif ENABLED(TFT_LVGL_UI) - #define DELAYED_BACKLIGHT_INIT -#endif - -// Color UI -#if ENABLED(TFT_COLOR_UI) - #define HAS_GRAPHICAL_TFT 1 - #define IS_ULTIPANEL 1 +#if ENABLED(REPRAPWORLD_KEYPAD) + #define NEWPANEL + #if ENABLED(ULTIPANEL) && !defined(REPRAPWORLD_KEYPAD_MOVE_STEP) + #define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 + #endif #endif /** - * I2C Panels + * SPI PANELS */ -#if EITHER(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) + // Einstart OLED has Cardinal nav via pins defined in pins_EINSTART-S.h + #if ENABLED(U8GLIB_SH1106_EINSTART) + #define ULTRA_LCD + #define DOGLCD + #define ULTIPANEL + #define NEWPANEL + #endif + +/** + * I2C PANELS + */ + +#if ENABLED(LCD_SAINSMART_I2C_1602) || ENABLED(LCD_SAINSMART_I2C_2004) #define LCD_I2C_TYPE_PCF8575 #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander @@ -383,7 +234,7 @@ #define LCD_I2C_TYPE_MCP23017 #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (optional) - #define IS_ULTIPANEL 1 + #define ULTIPANEL #elif ENABLED(LCD_I2C_VIKI) @@ -398,7 +249,7 @@ #define LCD_I2C_TYPE_MCP23017 #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (requires LiquidTWI2 v1.2.3 or later) - #define IS_ULTIPANEL 1 + #define ULTIPANEL #define ENCODER_FEEDRATE_DEADZONE 4 @@ -410,19 +261,19 @@ #define STD_ENCODER_PULSES_PER_STEP 2 #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 -#elif ANY(REPRAP_DISCOUNT_SMART_CONTROLLER, miniVIKI, VIKI2, ELB_FULL_GRAPHIC_CONTROLLER, AZSMZ_12864, OLED_PANEL_TINYBOY2, BQ_LCD_SMART_CONTROLLER, LCD_I2C_PANELOLU2) - +#elif ENABLED(miniVIKI) || ENABLED(VIKI2) \ + || ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + || ENABLED(AZSMZ_12864) \ + || ENABLED(OLED_PANEL_TINYBOY2) \ + || ENABLED(BQ_LCD_SMART_CONTROLLER) \ + || ENABLED(LCD_I2C_PANELOLU2) \ + || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) #define STD_ENCODER_PULSES_PER_STEP 4 #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 - #endif #ifndef STD_ENCODER_PULSES_PER_STEP - #if ENABLED(TOUCH_SCREEN) - #define STD_ENCODER_PULSES_PER_STEP 2 - #else - #define STD_ENCODER_PULSES_PER_STEP 5 - #endif + #define STD_ENCODER_PULSES_PER_STEP 5 #endif #ifndef STD_ENCODER_STEPS_PER_MENU_ITEM #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 @@ -441,79 +292,115 @@ // --------------------- // 2 wire Non-latching LCD SR from: // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection -#if ENABLED(FF_INTERFACEBOARD) - #define SR_LCD_3W_NL // Non latching 3 wire shift register - #define IS_ULTIPANEL 1 -#elif ENABLED(SAV_3DLCD) - #define SR_LCD_2W_NL // Non latching 2 wire shift register - #define IS_ULTIPANEL 1 -#endif -#if ENABLED(IS_ULTIPANEL) +#if ENABLED(SAV_3DLCD) + #define SR_LCD_2W_NL // Non latching 2 wire shift register #define ULTIPANEL #endif + +#if ENABLED(DOGLCD) // Change number of lines to match the DOG graphic display + #ifndef LCD_WIDTH + #ifdef LCD_WIDTH_OVERRIDE + #define LCD_WIDTH LCD_WIDTH_OVERRIDE + #else + #define LCD_WIDTH 22 + #endif + #endif + #ifndef LCD_HEIGHT + #define LCD_HEIGHT 5 + #endif +#endif + +#if ENABLED(NO_LCD_MENUS) + #undef ULTIPANEL +#endif + #if ENABLED(ULTIPANEL) - #define IS_ULTRA_LCD - #define NEWPANEL -#endif -#if ENABLED(IS_ULTRA_LCD) + #define NEWPANEL // Disable this if you actually have no click-encoder panel #define ULTRA_LCD -#endif - -#if ENABLED(IS_RRW_KEYPAD) - #define REPRAPWORLD_KEYPAD -#endif - -// Keypad needs a move step -#if ENABLED(REPRAPWORLD_KEYPAD) - #define NEWPANEL - #ifndef REPRAPWORLD_KEYPAD_MOVE_STEP - #define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 + #ifndef LCD_WIDTH + #define LCD_WIDTH 20 + #endif + #ifndef LCD_HEIGHT + #define LCD_HEIGHT 4 + #endif +#elif ENABLED(ULTRA_LCD) // no panel but just LCD + #ifndef LCD_WIDTH + #define LCD_WIDTH 16 + #endif + #ifndef LCD_HEIGHT + #define LCD_HEIGHT 2 #endif #endif -// Aliases for LCD features -#if ANY(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) - #define HAS_DGUS_LCD 1 +#if ENABLED(DOGLCD) + /* Custom characters defined in font Marlin_symbols.fon which was merged to ISO10646-0-3.bdf */ + // \x00 intentionally skipped to avoid problems in strings + #define LCD_STR_REFRESH "\x01" + #define LCD_STR_FOLDER "\x02" + #define LCD_STR_ARROW_RIGHT "\x03" + #define LCD_STR_UPLEVEL "\x04" + #define LCD_STR_CLOCK "\x05" + #define LCD_STR_FEEDRATE "\x06" + #define LCD_STR_BEDTEMP "\x07" + #define LCD_STR_THERMOMETER "\x08" + #define LCD_STR_DEGREE "\x09" + + #define LCD_STR_SPECIAL_MAX '\x09' + // Maximum here is 0x1F because 0x20 is ' ' (space) and the normal charsets begin. + // Better stay below 0x10 because DISPLAY_CHARSET_HD44780_WESTERN begins here. + + // Symbol characters + #define LCD_STR_FILAM_DIA "\xf8" + #define LCD_STR_FILAM_MUL "\xa4" +#else + // Custom characters defined in the first 8 characters of the LCD + #define LCD_BEDTEMP_CHAR 0x00 // Print only as a char. This will have 'unexpected' results when used in a string! + #define LCD_DEGREE_CHAR 0x01 + #define LCD_STR_THERMOMETER "\x02" // Still used with string concatenation + #define LCD_UPLEVEL_CHAR 0x03 + #define LCD_STR_REFRESH "\x04" + #define LCD_STR_FOLDER "\x05" + #define LCD_FEEDRATE_CHAR 0x06 + #define LCD_CLOCK_CHAR 0x07 + #define LCD_STR_ARROW_RIGHT ">" /* from the default character set */ #endif -// Extensible UI serial touch screens. (See src/lcd/extui) -#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - #define IS_EXTUI - #define EXTENSIBLE_UI -#endif +/** + * Default LCD contrast for dogm-like LCD displays + */ +#if ENABLED(DOGLCD) -// Aliases for LCD features -#if EITHER(ULTRA_LCD, EXTENSIBLE_UI) - #define HAS_DISPLAY 1 -#endif + #define HAS_LCD_CONTRAST ( \ + ENABLED(MAKRPANEL) \ + || ENABLED(CARTESIO_UI) \ + || ENABLED(VIKI2) \ + || ENABLED(AZSMZ_12864) \ + || ENABLED(miniVIKI) \ + || ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + ) -#if ENABLED(ULTRA_LCD) - #define HAS_WIRED_LCD 1 - #if ENABLED(DOGLCD) - #define HAS_MARLINUI_U8GLIB 1 - #elif IS_TFTGLCD_PANEL - // Neither DOGM nor HD44780. Fully customized interface. - #elif DISABLED(HAS_GRAPHICAL_TFT) - #define HAS_MARLINUI_HD44780 1 + #if HAS_LCD_CONTRAST + #ifndef LCD_CONTRAST_MIN + #define LCD_CONTRAST_MIN 0 + #endif + #ifndef LCD_CONTRAST_MAX + #define LCD_CONTRAST_MAX 63 + #endif + #ifndef DEFAULT_LCD_CONTRAST + #define DEFAULT_LCD_CONTRAST 32 + #endif #endif #endif -#if ENABLED(ULTIPANEL) && DISABLED(NO_LCD_MENUS) - #define HAS_LCD_MENU 1 -#endif -#if ENABLED(ADC_KEYPAD) - #define HAS_ADC_BUTTONS 1 +// Boot screens +#if DISABLED(ULTRA_LCD) + #undef SHOW_BOOTSCREEN +#elif !defined(BOOTSCREEN_TIMEOUT) + #define BOOTSCREEN_TIMEOUT 2500 #endif -#if HAS_MARLINUI_U8GLIB - #ifndef LCD_PIXEL_WIDTH - #define LCD_PIXEL_WIDTH 128 - #endif - #ifndef LCD_PIXEL_HEIGHT - #define LCD_PIXEL_HEIGHT 64 - #endif -#endif +#define HAS_DEBUG_MENU (ENABLED(ULTIPANEL) && ENABLED(LCD_PROGRESS_BAR_TEST)) /** * Extruders have some combination of stepper motors and hotends @@ -523,23 +410,9 @@ * HOTENDS - Number of hotends, whether connected or separate * E_STEPPERS - Number of actual E stepper motors * E_MANUAL - Number of E steppers for LCD move options + * */ - -#if EXTRUDERS == 0 - #undef EXTRUDERS - #define EXTRUDERS 0 - #undef SINGLENOZZLE - #undef SWITCHING_EXTRUDER - #undef SWITCHING_NOZZLE - #undef MIXING_EXTRUDER - #undef MK2_MULTIPLEXER - #undef PRUSA_MMU2 - #undef HOTEND_IDLE_TIMEOUT -#elif EXTRUDERS > 1 - #define HAS_MULTI_EXTRUDER 1 -#endif - -#if ENABLED(SWITCHING_EXTRUDER) // One stepper for every two EXTRUDERS +#if ENABLED(SWITCHING_EXTRUDER) // One stepper for every two EXTRUDERS #if EXTRUDERS > 4 #define E_STEPPERS 3 #elif EXTRUDERS > 2 @@ -553,29 +426,25 @@ #elif ENABLED(MIXING_EXTRUDER) #define E_STEPPERS MIXING_STEPPERS #define E_MANUAL 1 - #if MIXING_STEPPERS == 2 - #define HAS_DUAL_MIXING 1 - #endif #elif ENABLED(SWITCHING_TOOLHEAD) #define E_STEPPERS EXTRUDERS #define E_MANUAL EXTRUDERS -#elif ENABLED(PRUSA_MMU2) - #define E_STEPPERS 1 #endif // No inactive extruders with MK2_MULTIPLEXER or SWITCHING_NOZZLE -#if EITHER(MK2_MULTIPLEXER, SWITCHING_NOZZLE) +#if ENABLED(MK2_MULTIPLEXER) || ENABLED(SWITCHING_NOZZLE) #undef DISABLE_INACTIVE_EXTRUDER #endif -// Průša MK2 Multiplexer and MMU 2.0 force SINGLENOZZLE -#if EITHER(MK2_MULTIPLEXER, PRUSA_MMU2) +// MK2 Multiplexer forces SINGLENOZZLE +#if ENABLED(MK2_MULTIPLEXER) #define SINGLENOZZLE #endif -#if EITHER(SINGLENOZZLE, MIXING_EXTRUDER) // One hotend, one thermistor, no XY offset +#if ENABLED(SINGLENOZZLE) || ENABLED(MIXING_EXTRUDER) // One hotend, one thermistor, no XY offset #undef HOTENDS #define HOTENDS 1 + #undef TEMP_SENSOR_1_AS_REDUNDANT #undef HOTEND_OFFSET_X #undef HOTEND_OFFSET_Y #endif @@ -583,77 +452,31 @@ #ifndef HOTENDS #define HOTENDS EXTRUDERS #endif + #ifndef E_STEPPERS #define E_STEPPERS EXTRUDERS #endif + #ifndef E_MANUAL #define E_MANUAL EXTRUDERS #endif -#if HOTENDS - #define HAS_HOTEND 1 - #ifndef HOTEND_OVERSHOOT - #define HOTEND_OVERSHOOT 15 - #endif - #if HOTENDS > 1 - #define HAS_MULTI_HOTEND 1 - #define HAS_HOTEND_OFFSET 1 - #endif -#else - #undef PID_PARAMS_PER_HOTEND -#endif - -// Helper macros for extruder and hotend arrays #define HOTEND_LOOP() for (int8_t e = 0; e < HOTENDS; e++) -#define ARRAY_BY_EXTRUDERS(V...) ARRAY_N(EXTRUDERS, V) -#define ARRAY_BY_EXTRUDERS1(v1) ARRAY_BY_EXTRUDERS(v1, v1, v1, v1, v1, v1, v1, v1) -#define ARRAY_BY_HOTENDS(V...) ARRAY_N(HOTENDS, V) -#define ARRAY_BY_HOTENDS1(v1) ARRAY_BY_HOTENDS(v1, v1, v1, v1, v1, v1, v1, v1) -#if ENABLED(SWITCHING_EXTRUDER) && (DISABLED(SWITCHING_NOZZLE) || SWITCHING_EXTRUDER_SERVO_NR != SWITCHING_NOZZLE_SERVO_NR) - #define DO_SWITCH_EXTRUDER 1 -#endif +#define DO_SWITCH_EXTRUDER (ENABLED(SWITCHING_EXTRUDER) && (DISABLED(SWITCHING_NOZZLE) || SWITCHING_EXTRUDER_SERVO_NR != SWITCHING_NOZZLE_SERVO_NR)) -/** - * Default hotend offsets, if not defined - */ -#if HAS_HOTEND_OFFSET - #ifndef HOTEND_OFFSET_X - #define HOTEND_OFFSET_X { 0 } // X offsets for each extruder - #endif - #ifndef HOTEND_OFFSET_Y - #define HOTEND_OFFSET_Y { 0 } // Y offsets for each extruder - #endif - #ifndef HOTEND_OFFSET_Z - #define HOTEND_OFFSET_Z { 0 } // Z offsets for each extruder - #endif -#endif +#define HAS_HOTEND_OFFSET (HOTENDS > 1) /** * DISTINCT_E_FACTORS affects how some E factors are accessed */ #if ENABLED(DISTINCT_E_FACTORS) && E_STEPPERS > 1 - #define DISTINCT_E E_STEPPERS #define XYZE_N (XYZ + E_STEPPERS) - #define E_INDEX_N(E) (E) - #define E_AXIS_N(E) AxisEnum(E_AXIS + E) - #define UNUSED_E(E) NOOP + #define E_AXIS_N (E_AXIS + extruder) #else #undef DISTINCT_E_FACTORS - #define DISTINCT_E 1 #define XYZE_N XYZE - #define E_INDEX_N(E) 0 - #define E_AXIS_N(E) E_AXIS - #define UNUSED_E(E) UNUSED(E) -#endif - -#if ENABLED(DWIN_CREALITY_LCD) - #define SERIAL_CATCHALL 0 -#endif - -// Pressure sensor with a BLTouch-like interface -#if ENABLED(CREALITY_TOUCH) - #define BLTOUCH + #define E_AXIS_N E_AXIS #endif /** @@ -664,285 +487,63 @@ #ifndef Z_PROBE_SERVO_NR #define Z_PROBE_SERVO_NR 0 #endif + #ifndef NUM_SERVOS + #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1) + #endif #undef DEACTIVATE_SERVOS_AFTER_MOVE + #if NUM_SERVOS == 1 + #undef SERVO_DELAY + #define SERVO_DELAY { 50 } + #endif + #ifndef BLTOUCH_DELAY + #define BLTOUCH_DELAY 375 + #endif + #undef Z_SERVO_ANGLES + #define Z_SERVO_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW } + + #define BLTOUCH_DEPLOY 10 + #define BLTOUCH_STOW 90 + #define BLTOUCH_SELFTEST 120 + #define BLTOUCH_RESET 160 + #define _TEST_BLTOUCH(P) (READ(P##_PIN) != P##_ENDSTOP_INVERTING) // Always disable probe pin inverting for BLTouch #undef Z_MIN_PROBE_ENDSTOP_INVERTING #define Z_MIN_PROBE_ENDSTOP_INVERTING false + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) #undef Z_MIN_ENDSTOP_INVERTING - #define Z_MIN_ENDSTOP_INVERTING false + #define Z_MIN_ENDSTOP_INVERTING Z_MIN_PROBE_ENDSTOP_INVERTING + #define TEST_BLTOUCH() _TEST_BLTOUCH(Z_MIN) + #else + #define TEST_BLTOUCH() _TEST_BLTOUCH(Z_MIN_PROBE) #endif #endif /** - * Set a flag for a servo probe (or BLTouch) + * Set a flag for a servo probe */ -#ifdef Z_PROBE_SERVO_NR - #define HAS_Z_SERVO_PROBE 1 -#endif -#if ANY(HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) - #define HAS_SERVO_ANGLES 1 -#endif -#if !HAS_SERVO_ANGLES - #undef EDITABLE_SERVO_ANGLES -#endif +#define HAS_Z_SERVO_PROBE (defined(Z_PROBE_SERVO_NR) && Z_PROBE_SERVO_NR >= 0) /** * Set flags for enabled probes */ -#if ANY(HAS_Z_SERVO_PROBE, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, SOLENOID_PROBE, SENSORLESS_PROBING, RACK_AND_PINION_PROBE) - #define HAS_BED_PROBE 1 -#endif +#define HAS_BED_PROBE (ENABLED(FIX_MOUNTED_PROBE) || ENABLED(Z_PROBE_ALLEN_KEY) || HAS_Z_SERVO_PROBE || ENABLED(Z_PROBE_SLED) || ENABLED(SOLENOID_PROBE)) +#define PROBE_SELECTED (HAS_BED_PROBE || ENABLED(PROBE_MANUALLY) || ENABLED(MESH_BED_LEVELING)) -#if ANY(HAS_BED_PROBE, PROBE_MANUALLY, MESH_BED_LEVELING) - #define PROBE_SELECTED 1 -#endif - -#if HAS_BED_PROBE - #if DISABLED(NOZZLE_AS_PROBE) - #define HAS_PROBE_XY_OFFSET 1 - #endif - #if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - #define HAS_CUSTOM_PROBE_PIN 1 - #endif - #if Z_HOME_DIR < 0 && (!HAS_CUSTOM_PROBE_PIN || ENABLED(USE_PROBE_FOR_Z_HOMING)) - #define HOMING_Z_WITH_PROBE 1 - #endif - #ifndef Z_PROBE_LOW_POINT - #define Z_PROBE_LOW_POINT -5 - #endif - #if ENABLED(Z_PROBE_ALLEN_KEY) - #define PROBE_TRIGGERED_WHEN_STOWED_TEST 1 // Extra test for Allen Key Probe - #endif - #if MULTIPLE_PROBING > 1 - #if EXTRA_PROBING > 0 - #define TOTAL_PROBING (MULTIPLE_PROBING + EXTRA_PROBING) - #else - #define TOTAL_PROBING MULTIPLE_PROBING - #endif - #endif -#else +#if !HAS_BED_PROBE // Clear probe pin settings when no probe is selected #undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + #undef Z_MIN_PROBE_ENDSTOP +#elif ENABLED(Z_PROBE_ALLEN_KEY) + // Extra test for Allen Key Probe + #define PROBE_IS_TRIGGERED_WHEN_STOWED_TEST #endif -/** - * Set granular options based on the specific type of leveling - */ -#if ENABLED(AUTO_BED_LEVELING_UBL) - #undef LCD_BED_LEVELING - #if ENABLED(DELTA) - #define UBL_SEGMENTED 1 - #endif -#endif -#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) - #define ABL_PLANAR 1 -#endif -#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) - #define ABL_GRID 1 -#endif -#if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_3POINT) - #define HAS_ABL_NOT_UBL 1 -#endif -#if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL, MESH_BED_LEVELING) - #define HAS_MESH 1 -#endif -#if EITHER(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_3POINT) - #define NEEDS_THREE_PROBE_POINTS 1 -#endif -#if EITHER(HAS_ABL_NOT_UBL, AUTO_BED_LEVELING_UBL) - #define HAS_ABL_OR_UBL 1 - #if DISABLED(PROBE_MANUALLY) - #define HAS_AUTOLEVEL 1 - #endif -#endif -#if EITHER(HAS_ABL_OR_UBL, MESH_BED_LEVELING) - #define HAS_LEVELING 1 - #if DISABLED(AUTO_BED_LEVELING_UBL) - #define PLANNER_LEVELING 1 - #endif -#endif -#if EITHER(HAS_ABL_OR_UBL, Z_MIN_PROBE_REPEATABILITY_TEST) - #define HAS_PROBING_PROCEDURE 1 -#endif -#if !HAS_LEVELING - #undef RESTORE_LEVELING_AFTER_G28 -#endif +#define HOMING_Z_WITH_PROBE (HAS_BED_PROBE && Z_HOME_DIR < 0 && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)) -#ifdef GRID_MAX_POINTS_X - #define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) - #define GRID_LOOP(A,B) LOOP_L_N(A, GRID_MAX_POINTS_X) LOOP_L_N(B, GRID_MAX_POINTS_Y) -#endif +#define HAS_SOFTWARE_ENDSTOPS (ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS)) +#define HAS_RESUME_CONTINUE (ENABLED(NEWPANEL) || ENABLED(EMERGENCY_PARSER)) +#define HAS_COLOR_LEDS (ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED)) -#ifndef INVERT_X_DIR - #define INVERT_X_DIR false -#endif -#ifndef INVERT_Y_DIR - #define INVERT_Y_DIR false -#endif -#ifndef INVERT_Z_DIR - #define INVERT_Z_DIR false -#endif -#ifndef INVERT_E_DIR - #define INVERT_E_DIR false -#endif - -#if ENABLED(SLIM_LCD_MENUS) - #define BOOT_MARLIN_LOGO_SMALL -#endif - -// This flag indicates some kind of jerk storage is needed -#if EITHER(CLASSIC_JERK, IS_KINEMATIC) - #define HAS_CLASSIC_JERK 1 -#endif - -#if DISABLED(CLASSIC_JERK) - #define HAS_JUNCTION_DEVIATION 1 -#endif - -// E jerk exists with JD disabled (of course) but also when Linear Advance is disabled on Delta/SCARA -#if ENABLED(CLASSIC_JERK) || (IS_KINEMATIC && DISABLED(LIN_ADVANCE)) - #define HAS_CLASSIC_E_JERK 1 -#endif - -#ifndef SPI_SPEED - #define SPI_SPEED SPI_FULL_SPEED -#endif - -#if SERIAL_PORT == -1 || SERIAL_PORT_2 == -1 - #define HAS_USB_SERIAL 1 -#endif - -/** - * This setting is also used by M109 when trying to calculate - * a ballpark safe margin to prevent wait-forever situation. - */ -#ifndef EXTRUDE_MINTEMP - #define EXTRUDE_MINTEMP 170 -#endif - -/** - * TFT Displays - * - * Configure parameters for TFT displays: - * - TFT_DEFAULT_ORIENTATION - * - TFT_DRIVER - * - TFT_WIDTH - * - TFT_HEIGHT - * - TFT_INTERFACE_(SPI|FSMC) - * - TFT_COLOR - * - GRAPHICAL_TFT_UPSCALE - */ -#if ENABLED(MKS_TS35_V2_0) - // Most common: ST7796 - #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY) - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 - #define TFT_INTERFACE_SPI - #define GRAPHICAL_TFT_UPSCALE 3 -#elif ENABLED(MKS_ROBIN_TFT24) - // Most common: ST7789 - #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 - #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 -#elif ENABLED(MKS_ROBIN_TFT28) - // Most common: ST7789 - #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 - #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 -#elif ENABLED(MKS_ROBIN_TFT32) - // Most common: ST7789 - #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 - #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 -#elif ENABLED(MKS_ROBIN_TFT35) - // Most common: ILI9488 - #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 - #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 3 -#elif ENABLED(MKS_ROBIN_TFT43) - #define TFT_DEFAULT_ORIENTATION 0 - #define TFT_DRIVER SSD1963 - #define TFT_WIDTH 480 - #define TFT_HEIGHT 272 - #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 -#elif ENABLED(MKS_ROBIN_TFT_V1_1R) - // ILI9328 or R61505 - #define TFT_DEFAULT_ORIENTATION (TFT_INVERT_X | TFT_INVERT_Y | TFT_EXCHANGE_XY) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 - #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 -#elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35) - #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) - #define TFT_DRIVER ILI9488 - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 - #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 3 -#elif ENABLED(LONGER_LK_TFT28) - #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 - #define TFT_INTERFACE_FSMC - #define GRAPHICAL_TFT_UPSCALE 2 -#elif ENABLED(TFT_GENERIC) - #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) -#endif - -// FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi).h -#if ENABLED(TFT_INTERFACE_FSMC) - #define HAS_FSMC_TFT 1 - #if ENABLED(TFT_CLASSIC_UI) - #define FSMC_GRAPHICAL_TFT - #elif ENABLED(TFT_LVGL_UI) - #define TFT_LVGL_UI_FSMC - #endif -#elif ENABLED(TFT_INTERFACE_SPI) - #define HAS_SPI_TFT 1 - #if ENABLED(TFT_CLASSIC_UI) - #define SPI_GRAPHICAL_TFT - #elif ENABLED(TFT_LVGL_UI) - #define TFT_LVGL_UI_SPI - #endif -#endif - -#if ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 240 - #if ENABLED(TFT_INTERFACE_SPI) - #define TFT_320x240_SPI - #elif ENABLED(TFT_INTERFACE_FSMC) - #define TFT_320x240 - #endif -#elif ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 320 - #if ENABLED(TFT_INTERFACE_SPI) - #define TFT_480x320_SPI - #elif ENABLED(TFT_INTERFACE_FSMC) - #define TFT_480x320 - #endif -#endif - -// Fewer lines with touch buttons on-screen -#if EITHER(TFT_320x240, TFT_320x240_SPI) - #define HAS_UI_320x240 1 - #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) -#elif EITHER(TFT_480x320, TFT_480x320_SPI) - #define HAS_UI_480x320 1 - #define LCD_HEIGHT TERN(TOUCH_SCREEN, 6, 7) -#endif - -// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046' -#if ENABLED(TOUCH_SCREEN) && !HAS_GRAPHICAL_TFT - #undef TOUCH_SCREEN - #undef TOUCH_SCREEN_CALIBRATION - #define HAS_TOUCH_XPT2046 1 -#endif +#endif // CONDITIONALS_LCD_H diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index bab05e5ff6..289f174373 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,488 +16,33 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Conditionals_adv.h * Defines that depend on advanced configuration. */ -#ifdef SWITCHING_NOZZLE_E1_SERVO_NR - #define SWITCHING_NOZZLE_TWO_SERVOS 1 -#endif +#ifndef CONDITIONALS_ADV_H +#define CONDITIONALS_ADV_H -// Determine NUM_SERVOS if none was supplied -#ifndef NUM_SERVOS - #define NUM_SERVOS 0 - #if ANY(CHAMBER_VENT, HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) - #if NUM_SERVOS <= Z_PROBE_SERVO_NR - #undef NUM_SERVOS - #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1) + #if !defined(__AVR__) || !defined(USBCON) + // Define constants and variables for buffering serial data. + // Use only 0 or powers of 2 greater than 1 + // : [0, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...] + #ifndef RX_BUFFER_SIZE + #define RX_BUFFER_SIZE 128 #endif - #if NUM_SERVOS <= CHAMBER_VENT_SERVO_NR - #undef NUM_SERVOS - #define NUM_SERVOS (CHAMBER_VENT_SERVO_NR + 1) + // 256 is the max TX buffer limit due to uint8_t head and tail + // : [0, 4, 8, 16, 32, 64, 128, 256] + #ifndef TX_BUFFER_SIZE + #define TX_BUFFER_SIZE 32 #endif - #if NUM_SERVOS <= SWITCHING_TOOLHEAD_SERVO_NR - #undef NUM_SERVOS - #define NUM_SERVOS (SWITCHING_TOOLHEAD_SERVO_NR + 1) - #endif - #if NUM_SERVOS <= SWITCHING_NOZZLE_SERVO_NR - #undef NUM_SERVOS - #define NUM_SERVOS (SWITCHING_NOZZLE_SERVO_NR + 1) - #endif - #if NUM_SERVOS <= SWITCHING_NOZZLE_E1_SERVO_NR - #undef NUM_SERVOS - #define NUM_SERVOS (SWITCHING_NOZZLE_E1_SERVO_NR + 1) - #endif - #if NUM_SERVOS <= SWITCHING_EXTRUDER_SERVO_NR - #undef NUM_SERVOS - #define NUM_SERVOS (SWITCHING_EXTRUDER_SERVO_NR + 1) - #endif - #if NUM_SERVOS <= SWITCHING_EXTRUDER_E23_SERVO_NR - #undef NUM_SERVOS - #define NUM_SERVOS (SWITCHING_EXTRUDER_E23_SERVO_NR + 1) - #endif - #endif -#endif - -// Convenience override for a BLTouch alone -#if ENABLED(BLTOUCH) && NUM_SERVOS == 1 - #undef SERVO_DELAY - #define SERVO_DELAY { 50 } -#endif - -#if EXTRUDERS == 0 - #define NO_VOLUMETRICS - #undef TEMP_SENSOR_0 - #undef TEMP_SENSOR_1 - #undef TEMP_SENSOR_2 - #undef TEMP_SENSOR_3 - #undef TEMP_SENSOR_4 - #undef TEMP_SENSOR_5 - #undef TEMP_SENSOR_6 - #undef TEMP_SENSOR_7 - #undef FWRETRACT - #undef PIDTEMP - #undef AUTOTEMP - #undef PID_EXTRUSION_SCALING - #undef LIN_ADVANCE - #undef FILAMENT_RUNOUT_SENSOR - #undef ADVANCED_PAUSE_FEATURE - #undef FILAMENT_RUNOUT_DISTANCE_MM - #undef FILAMENT_LOAD_UNLOAD_GCODES - #undef DISABLE_INACTIVE_EXTRUDER - #undef FILAMENT_LOAD_UNLOAD_GCODES - #undef EXTRUDER_RUNOUT_PREVENT - #undef PREVENT_COLD_EXTRUSION - #undef PREVENT_LENGTHY_EXTRUDE - #undef THERMAL_PROTECTION_HOTENDS - #undef THERMAL_PROTECTION_PERIOD - #undef WATCH_TEMP_PERIOD - #undef SHOW_TEMP_ADC_VALUES -#endif - -#if TEMP_SENSOR_BED == 0 - #undef THERMAL_PROTECTION_BED - #undef THERMAL_PROTECTION_BED_PERIOD -#endif - -#if TEMP_SENSOR_CHAMBER == 0 - #undef THERMAL_PROTECTION_CHAMBER -#endif - -#if ENABLED(MIXING_EXTRUDER) && (ENABLED(RETRACT_SYNC_MIXING) || BOTH(FILAMENT_LOAD_UNLOAD_GCODES, FILAMENT_UNLOAD_ALL_EXTRUDERS)) - #define HAS_MIXER_SYNC_CHANNEL 1 -#endif - -#if EITHER(DUAL_X_CARRIAGE, MULTI_NOZZLE_DUPLICATION) - #define HAS_DUPLICATION_MODE 1 -#endif - -#if ENABLED(PRINTCOUNTER) && (SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0) - #define HAS_SERVICE_INTERVALS 1 -#endif - -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - #define HAS_FILAMENT_SENSOR 1 - #ifdef FILAMENT_RUNOUT_DISTANCE_MM - #define HAS_FILAMENT_RUNOUT_DISTANCE 1 - #endif -#endif - -// Let SD_FINISHED_RELEASECOMMAND stand in for SD_FINISHED_STEPPERRELEASE -#if ENABLED(SD_FINISHED_STEPPERRELEASE) - #ifndef SD_FINISHED_RELEASECOMMAND - #define SD_FINISHED_RELEASECOMMAND "M84" // planner.finish_and_disable() - #endif -#else - #undef SD_FINISHED_RELEASECOMMAND -#endif - -#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) - #define HAS_PRINT_PROGRESS 1 -#endif - -#if HAS_PRINT_PROGRESS && EITHER(PRINT_PROGRESS_SHOW_DECIMALS, SHOW_REMAINING_TIME) - #define HAS_PRINT_PROGRESS_PERMYRIAD 1 -#endif - -#if ANY(MARLIN_BRICKOUT, MARLIN_INVADERS, MARLIN_SNAKE, MARLIN_MAZE) - #define HAS_GAMES 1 - #if (1 < ENABLED(MARLIN_BRICKOUT) + ENABLED(MARLIN_INVADERS) + ENABLED(MARLIN_SNAKE) + ENABLED(MARLIN_MAZE)) - #define HAS_GAME_MENU 1 - #endif -#endif - -#if ANY(FWRETRACT, HAS_LEVELING, SKEW_CORRECTION) - #define HAS_POSITION_MODIFIERS 1 -#endif - -#if ANY(X_DUAL_ENDSTOPS, Y_DUAL_ENDSTOPS, Z_MULTI_ENDSTOPS) - #define HAS_EXTRA_ENDSTOPS 1 -#endif -#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) - #define HAS_SOFTWARE_ENDSTOPS 1 -#endif -#if ANY(EXTENSIBLE_UI, NEWPANEL, EMERGENCY_PARSER, HAS_ADC_BUTTONS, DWIN_CREALITY_LCD) - #define HAS_RESUME_CONTINUE 1 -#endif - -#if ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) - #define HAS_COLOR_LEDS 1 -#endif -#if ALL(HAS_RESUME_CONTINUE, PRINTER_EVENT_LEDS, SDSUPPORT) - #define HAS_LEDS_OFF_FLAG 1 -#endif - -#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) - #define HAS_MOTOR_CURRENT_I2C 1 -#endif - -// Multiple Z steppers -#ifndef NUM_Z_STEPPER_DRIVERS - #define NUM_Z_STEPPER_DRIVERS 1 -#endif - -#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - #undef Z_STEPPER_ALIGN_AMP -#endif -#ifndef Z_STEPPER_ALIGN_AMP - #define Z_STEPPER_ALIGN_AMP 1.0 -#endif - -// -// Spindle/Laser power display types -// Defined here so sanity checks can use them -// -#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) - #define HAS_CUTTER 1 - #define _CUTTER_POWER_PWM255 1 - #define _CUTTER_POWER_PERCENT 2 - #define _CUTTER_POWER_RPM 3 - #define _CUTTER_POWER(V) _CAT(_CUTTER_POWER_, V) - #define CUTTER_UNIT_IS(V) (_CUTTER_POWER(CUTTER_POWER_UNIT) == _CUTTER_POWER(V)) -#endif - -// Add features that need hardware PWM here -#if ANY(FAST_PWM_FAN, SPINDLE_LASER_PWM) - #define NEEDS_HARDWARE_PWM 1 -#endif - -#if defined(__AVR__) && defined(USBCON) - #define IS_AT90USB 1 - #undef SERIAL_XON_XOFF // Not supported on USB-native devices -#else - // Define constants and variables for buffering serial data. - // Use only 0 or powers of 2 greater than 1 - // : [0, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...] - #ifndef RX_BUFFER_SIZE - #define RX_BUFFER_SIZE 128 - #endif - // 256 is the max TX buffer limit due to uint8_t head and tail - // : [0, 4, 8, 16, 32, 64, 128, 256] - #ifndef TX_BUFFER_SIZE - #define TX_BUFFER_SIZE 32 - #endif -#endif - -#if ENABLED(HOST_ACTION_COMMANDS) - #ifndef ACTION_ON_PAUSE - #define ACTION_ON_PAUSE "pause" - #endif - #ifndef ACTION_ON_PAUSED - #define ACTION_ON_PAUSED "paused" - #endif - #ifndef ACTION_ON_RESUME - #define ACTION_ON_RESUME "resume" - #endif - #ifndef ACTION_ON_RESUMED - #define ACTION_ON_RESUMED "resumed" - #endif - #ifndef ACTION_ON_CANCEL - #define ACTION_ON_CANCEL "cancel" - #endif - #ifndef ACTION_ON_START - #define ACTION_ON_START "start" - #endif - #ifndef ACTION_ON_KILL - #define ACTION_ON_KILL "poweroff" - #endif - #if HAS_FILAMENT_SENSOR - #ifndef ACTION_ON_FILAMENT_RUNOUT - #define ACTION_ON_FILAMENT_RUNOUT "filament_runout" - #endif - #ifndef ACTION_REASON_ON_FILAMENT_RUNOUT - #define ACTION_REASON_ON_FILAMENT_RUNOUT "filament_runout" - #endif - #endif - #if ENABLED(G29_RETRY_AND_RECOVER) - #ifndef ACTION_ON_G29_RECOVER - #define ACTION_ON_G29_RECOVER "probe_rewipe" - #endif - #ifndef ACTION_ON_G29_FAILURE - #define ACTION_ON_G29_FAILURE "probe_failed" - #endif - #endif -#endif - -#if EITHER(FYSETC_MINI_12864_2_1, FYSETC_242_OLED_12864) - #define LED_CONTROL_MENU - #define LED_USER_PRESET_STARTUP - #define LED_COLOR_PRESETS - #ifndef LED_USER_PRESET_GREEN - #define LED_USER_PRESET_GREEN 128 - #endif - #ifndef LED_USER_PRESET_BLUE - #define LED_USER_PRESET_BLUE 0 - #endif - #ifndef LED_USER_PRESET_BRIGHTNESS - #define LED_USER_PRESET_BRIGHTNESS 255 - #endif -#endif - -// Set defaults for unspecified LED user colors -#if ENABLED(LED_CONTROL_MENU) - #ifndef LED_USER_PRESET_RED - #define LED_USER_PRESET_RED 255 - #endif - #ifndef LED_USER_PRESET_GREEN - #define LED_USER_PRESET_GREEN 255 - #endif - #ifndef LED_USER_PRESET_BLUE - #define LED_USER_PRESET_BLUE 255 - #endif - #ifndef LED_USER_PRESET_WHITE - #define LED_USER_PRESET_WHITE 0 - #endif - #ifndef LED_USER_PRESET_BRIGHTNESS - #ifdef NEOPIXEL_BRIGHTNESS - #define LED_USER_PRESET_BRIGHTNESS NEOPIXEL_BRIGHTNESS - #else - #define LED_USER_PRESET_BRIGHTNESS 255 - #endif - #endif -#endif - -#if BOTH(LED_CONTROL_MENU, NEOPIXEL2_SEPARATE) - #ifndef LED2_USER_PRESET_RED - #define LED2_USER_PRESET_RED 255 - #endif - #ifndef LED2_USER_PRESET_GREEN - #define LED2_USER_PRESET_GREEN 255 - #endif - #ifndef LED2_USER_PRESET_BLUE - #define LED2_USER_PRESET_BLUE 255 - #endif - #ifndef LED2_USER_PRESET_WHITE - #define LED2_USER_PRESET_WHITE 0 - #endif - #ifndef LED2_USER_PRESET_BRIGHTNESS - #ifdef NEOPIXEL2_BRIGHTNESS - #define LED2_USER_PRESET_BRIGHTNESS NEOPIXEL2_BRIGHTNESS - #else - #define LED2_USER_PRESET_BRIGHTNESS 255 - #endif - #endif -#endif - -// If platform requires early initialization of watchdog to properly boot -#if ENABLED(USE_WATCHDOG) && defined(ARDUINO_ARCH_SAM) - #define EARLY_WATCHDOG 1 -#endif - -// Full Touch Screen needs 'tft/xpt2046' -#if EITHER(TOUCH_SCREEN, HAS_TFT_LVGL_UI) - #define HAS_TFT_XPT2046 1 -#endif - -// Touch Screen or "Touch Buttons" need XPT2046 pins -// but they use different components -#if EITHER(HAS_TFT_XPT2046, HAS_TOUCH_XPT2046) - #define NEED_TOUCH_PINS 1 -#endif - -// Extensible UI pin mapping for RepRapDiscount -#if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(AO_EXP1_PINMAP, AO_EXP2_PINMAP, CR10_TFT_PINMAP) - #define TOUCH_UI_ULTIPANEL 1 -#endif - -// Poll-based jogging for joystick and other devices -#if ENABLED(JOYSTICK) - #define POLL_JOG -#endif - -/** - * Driver Timings (in nanoseconds) - * NOTE: Driver timing order is longest-to-shortest duration. - * Preserve this ordering when adding new drivers. - */ -#ifndef MINIMUM_STEPPER_POST_DIR_DELAY - #if HAS_DRIVER(TB6560) - #define MINIMUM_STEPPER_POST_DIR_DELAY 15000 - #elif HAS_DRIVER(TB6600) - #define MINIMUM_STEPPER_POST_DIR_DELAY 1500 - #elif HAS_DRIVER(DRV8825) - #define MINIMUM_STEPPER_POST_DIR_DELAY 650 - #elif HAS_DRIVER(LV8729) - #define MINIMUM_STEPPER_POST_DIR_DELAY 500 - #elif HAS_DRIVER(A5984) - #define MINIMUM_STEPPER_POST_DIR_DELAY 400 - #elif HAS_DRIVER(A4988) - #define MINIMUM_STEPPER_POST_DIR_DELAY 200 - #elif HAS_TRINAMIC_CONFIG || HAS_TRINAMIC_STANDALONE - #define MINIMUM_STEPPER_POST_DIR_DELAY 60 #else - #define MINIMUM_STEPPER_POST_DIR_DELAY 0 // Expect at least 10µS since one Stepper ISR must transpire + // SERIAL_XON_XOFF not supported on USB-native devices + #undef SERIAL_XON_XOFF #endif -#endif -#ifndef MINIMUM_STEPPER_PRE_DIR_DELAY - #define MINIMUM_STEPPER_PRE_DIR_DELAY MINIMUM_STEPPER_POST_DIR_DELAY -#endif - -#ifndef MINIMUM_STEPPER_PULSE - #if HAS_DRIVER(TB6560) - #define MINIMUM_STEPPER_PULSE 30 - #elif HAS_DRIVER(TB6600) - #define MINIMUM_STEPPER_PULSE 3 - #elif HAS_DRIVER(DRV8825) - #define MINIMUM_STEPPER_PULSE 2 - #elif HAS_DRIVER(A4988) || HAS_DRIVER(A5984) - #define MINIMUM_STEPPER_PULSE 1 - #elif HAS_TRINAMIC_CONFIG || HAS_TRINAMIC_STANDALONE - #define MINIMUM_STEPPER_PULSE 0 - #elif HAS_DRIVER(LV8729) - #define MINIMUM_STEPPER_PULSE 0 - #else - #define MINIMUM_STEPPER_PULSE 2 - #endif -#endif - -#ifndef MAXIMUM_STEPPER_RATE - #if HAS_DRIVER(TB6560) - #define MAXIMUM_STEPPER_RATE 15000 - #elif HAS_DRIVER(TB6600) - #define MAXIMUM_STEPPER_RATE 150000 - #elif HAS_DRIVER(DRV8825) - #define MAXIMUM_STEPPER_RATE 250000 - #elif HAS_DRIVER(A4988) - #define MAXIMUM_STEPPER_RATE 500000 - #elif HAS_DRIVER(LV8729) - #define MAXIMUM_STEPPER_RATE 1000000 - #elif HAS_TRINAMIC_CONFIG || HAS_TRINAMIC_STANDALONE - #define MAXIMUM_STEPPER_RATE 5000000 - #else - #define MAXIMUM_STEPPER_RATE 250000 - #endif -#endif - -#if ENABLED(DIRECT_STEPPING) - #ifndef STEPPER_PAGES - #define STEPPER_PAGES 16 - #endif - #ifndef STEPPER_PAGE_FORMAT - #define STEPPER_PAGE_FORMAT SP_4x2_256 - #endif - #ifndef PAGE_MANAGER - #define PAGE_MANAGER SerialPageManager - #endif -#endif - -// -// SD Card connection methods -// Defined here so pins and sanity checks can use them -// -#if ENABLED(SDSUPPORT) - #define _SDCARD_LCD 1 - #define _SDCARD_ONBOARD 2 - #define _SDCARD_CUSTOM_CABLE 3 - #define _SDCARD_ID(V) _CAT(_SDCARD_, V) - #define SD_CONNECTION_IS(V) (_SDCARD_ID(SDCARD_CONNECTION) == _SDCARD_ID(V)) -#else - #define SD_CONNECTION_IS(...) 0 -#endif - -// Power Monitor sensors -#if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) - #define HAS_POWER_MONITOR 1 -#endif -#if ENABLED(POWER_MONITOR_CURRENT) && defined(POWER_MONITOR_FIXED_VOLTAGE) - #define HAS_POWER_MONITOR_VREF 1 -#endif -#if BOTH(HAS_POWER_MONITOR_VREF, POWER_MONITOR_CURRENT) - #define HAS_POWER_MONITOR_WATTS 1 -#endif - -// Flag if an EEPROM type is pre-selected -#if ENABLED(EEPROM_SETTINGS) && NONE(I2C_EEPROM, SPI_EEPROM, QSPI_EEPROM, FLASH_EEPROM_EMULATION, SRAM_EEPROM_EMULATION, SDCARD_EEPROM_EMULATION) - #define NO_EEPROM_SELECTED 1 -#endif - -// Flag whether hex_print.cpp is used -#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE) - #define NEED_HEX_PRINT 1 -#endif - -// Flag whether least_squares_fit.cpp is used -#if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - #define NEED_LSF 1 -#endif - -// Flag the indexed serial ports that are in use -#define ANY_SERIAL_IS(N) (defined(SERIAL_PORT) && SERIAL_PORT == (N)) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) -#if ANY_SERIAL_IS(-1) - #define USING_SERIAL_DEFAULT -#endif -#if ANY_SERIAL_IS(0) - #define USING_SERIAL_0 1 -#endif -#if ANY_SERIAL_IS(1) - #define USING_SERIAL_1 1 -#endif -#if ANY_SERIAL_IS(2) - #define USING_SERIAL_2 1 -#endif -#if ANY_SERIAL_IS(3) - #define USING_SERIAL_3 1 -#endif -#if ANY_SERIAL_IS(4) - #define USING_SERIAL_4 1 -#endif -#if ANY_SERIAL_IS(5) - #define USING_SERIAL_5 1 -#endif -#if ANY_SERIAL_IS(6) - #define USING_SERIAL_6 1 -#endif -#if ANY_SERIAL_IS(7) - #define USING_SERIAL_7 1 -#endif -#if ANY_SERIAL_IS(8) - #define USING_SERIAL_8 1 -#endif -#undef ANY_SERIAL_IS +#endif // CONDITIONALS_ADV_H diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 798bf009c6..f6345f3ecc 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,54 +16,24 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Conditionals_post.h * Defines that depend on configuration but are not editable. */ -#ifdef GITHUB_ACTIONS - // Extras for CI testing -#endif +#ifndef CONDITIONALS_POST_H +#define CONDITIONALS_POST_H -// ADC -#ifdef BOARD_ADC_VREF - #define ADC_VREF BOARD_ADC_VREF -#else - #define ADC_VREF HAL_ADC_VREF -#endif - -// Linear advance uses Jerk since E is an isolated axis -#if BOTH(HAS_JUNCTION_DEVIATION, LIN_ADVANCE) - #define HAS_LINEAR_E_JERK 1 -#endif - -// Determine which type of 'EEPROM' is in use -#if ENABLED(EEPROM_SETTINGS) - // EEPROM type may be defined by compile flags, configs, HALs, or pins - // Set additional flags to let HALs choose in their Conditionals_post.h - #if ANY(FLASH_EEPROM_EMULATION, SRAM_EEPROM_EMULATION, SDCARD_EEPROM_EMULATION, QSPI_EEPROM) - #define USE_EMULATED_EEPROM 1 - #elif ANY(I2C_EEPROM, SPI_EEPROM) - #define USE_WIRED_EEPROM 1 - #elif ENABLED(IIC_BL24CXX_EEPROM) - // nothing - #else - #define USE_FALLBACK_EEPROM 1 - #endif -#else - #undef I2C_EEPROM - #undef SPI_EEPROM - #undef QSPI_EEPROM - #undef SDCARD_EEPROM_EMULATION - #undef SRAM_EEPROM_EMULATION - #undef FLASH_EEPROM_EMULATION - #undef IIC_BL24CXX_EEPROM -#endif +#define AVR_ATmega2560_FAMILY_PLUS_70 ( \ + MB(BQ_ZUM_MEGA_3D) \ + || MB(MIGHTYBOARD_REVE) \ + || MB(MINIRAMBO) \ + || MB(SCOOVO_X9H) \ +) #ifdef TEENSYDUINO #undef max @@ -75,6 +45,10 @@ #define NOT_A_PIN 0 // For PINS_DEBUGGING #endif +#define IS_SCARA (ENABLED(MORGAN_SCARA) || ENABLED(MAKERARM_SCARA)) +#define IS_KINEMATIC (ENABLED(DELTA) || IS_SCARA) +#define IS_CARTESIAN !IS_KINEMATIC + /** * Axis lengths and center */ @@ -96,16 +70,20 @@ #endif // Define center values for future use -#define _X_HALF_BED ((X_BED_SIZE) / 2) -#define _Y_HALF_BED ((Y_BED_SIZE) / 2) -#define X_CENTER TERN(BED_CENTER_AT_0_0, 0, _X_HALF_BED) -#define Y_CENTER TERN(BED_CENTER_AT_0_0, 0, _Y_HALF_BED) +#if ENABLED(BED_CENTER_AT_0_0) + #define X_CENTER 0 + #define Y_CENTER 0 +#else + #define X_CENTER ((X_BED_SIZE) / 2) + #define Y_CENTER ((Y_BED_SIZE) / 2) +#endif +#define Z_CENTER ((Z_MIN_POS + Z_MAX_POS) / 2) // Get the linear boundaries of the bed -#define X_MIN_BED (X_CENTER - _X_HALF_BED) -#define X_MAX_BED (X_MIN_BED + X_BED_SIZE) -#define Y_MIN_BED (Y_CENTER - _Y_HALF_BED) -#define Y_MAX_BED (Y_MIN_BED + Y_BED_SIZE) +#define X_MIN_BED (X_CENTER - (X_BED_SIZE) / 2) +#define X_MAX_BED (X_CENTER + (X_BED_SIZE) / 2) +#define Y_MIN_BED (Y_CENTER - (Y_BED_SIZE) / 2) +#define Y_MAX_BED (Y_CENTER + (Y_BED_SIZE) / 2) /** * Dual X Carriage @@ -122,18 +100,10 @@ /** * CoreXY, CoreXZ, and CoreYZ - and their reverse */ -#if EITHER(COREXY, COREYX) - #define CORE_IS_XY 1 -#endif -#if EITHER(COREXZ, COREZX) - #define CORE_IS_XZ 1 -#endif -#if EITHER(COREYZ, COREZY) - #define CORE_IS_YZ 1 -#endif -#if CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ - #define IS_CORE 1 -#endif +#define CORE_IS_XY (ENABLED(COREXY) || ENABLED(COREYX)) +#define CORE_IS_XZ (ENABLED(COREXZ) || ENABLED(COREZX)) +#define CORE_IS_YZ (ENABLED(COREYZ) || ENABLED(COREZY)) +#define IS_CORE (CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ) #if IS_CORE #if CORE_IS_XY #define CORE_AXIS_1 A_AXIS @@ -148,23 +118,12 @@ #define CORE_AXIS_1 B_AXIS #define CORE_AXIS_2 C_AXIS #endif - #define CORESIGN(n) (ANY(COREYX, COREZX, COREZY) ? (-(n)) : (n)) -#elif ENABLED(MARKFORGED_XY) - // Markforged kinematics - #define CORE_AXIS_1 A_AXIS - #define CORE_AXIS_2 B_AXIS - #define NORMAL_AXIS Z_AXIS -#endif - -// Calibration codes only for non-core axes -#if EITHER(BACKLASH_GCODE, CALIBRATION_GCODE) - #if EITHER(IS_CORE, MARKFORGED_XY) - #define CAN_CALIBRATE(A,B) (_AXIS(A) == B) + #if ENABLED(COREYX) || ENABLED(COREZX) || ENABLED(COREZY) + #define CORESIGN(n) (-(n)) #else - #define CAN_CALIBRATE(A,B) 1 + #define CORESIGN(n) (n) #endif #endif -#define AXIS_CAN_CALIBRATE(A) CAN_CALIBRATE(A,NORMAL_AXIS) /** * No adjustable bed on non-cartesians @@ -175,12 +134,10 @@ /** * SCARA cannot use SLOWDOWN and requires QUICKHOME - * Printable radius assumes joints can fully extend */ #if IS_SCARA #undef SLOWDOWN #define QUICK_HOME - #define SCARA_PRINTABLE_RADIUS (SCARA_LINKAGE_1 + SCARA_LINKAGE_2) #endif /** @@ -188,23 +145,33 @@ */ #ifdef MANUAL_X_HOME_POS #define X_HOME_POS MANUAL_X_HOME_POS -#else - #define X_END_POS (X_HOME_DIR < 0 ? X_MIN_POS : X_MAX_POS) - #if ENABLED(BED_CENTER_AT_0_0) - #define X_HOME_POS TERN(DELTA, 0, X_END_POS) +#elif ENABLED(BED_CENTER_AT_0_0) + #if ENABLED(DELTA) + #define X_HOME_POS 0 #else - #define X_HOME_POS TERN(DELTA, X_MIN_POS + (X_BED_SIZE) * 0.5, X_END_POS) + #define X_HOME_POS ((X_BED_SIZE) * (X_HOME_DIR) * 0.5) + #endif +#else + #if ENABLED(DELTA) + #define X_HOME_POS (X_MIN_POS + (X_BED_SIZE) * 0.5) + #else + #define X_HOME_POS (X_HOME_DIR < 0 ? X_MIN_POS : X_MAX_POS) #endif #endif #ifdef MANUAL_Y_HOME_POS #define Y_HOME_POS MANUAL_Y_HOME_POS -#else - #define Y_END_POS (Y_HOME_DIR < 0 ? Y_MIN_POS : Y_MAX_POS) - #if ENABLED(BED_CENTER_AT_0_0) - #define Y_HOME_POS TERN(DELTA, 0, Y_END_POS) +#elif ENABLED(BED_CENTER_AT_0_0) + #if ENABLED(DELTA) + #define Y_HOME_POS 0 #else - #define Y_HOME_POS TERN(DELTA, Y_MIN_POS + (Y_BED_SIZE) * 0.5, Y_END_POS) + #define Y_HOME_POS ((Y_BED_SIZE) * (Y_HOME_DIR) * 0.5) + #endif +#else + #if ENABLED(DELTA) + #define Y_HOME_POS (Y_MIN_POS + (Y_BED_SIZE) * 0.5) + #else + #define Y_HOME_POS (Y_HOME_DIR < 0 ? Y_MIN_POS : Y_MAX_POS) #endif #endif @@ -236,26 +203,21 @@ #undef SLOWDOWN #endif -#ifndef MESH_INSET - #define MESH_INSET 0 -#endif - /** * Safe Homing Options */ #if ENABLED(Z_SAFE_HOMING) - #if ENABLED(AUTO_BED_LEVELING_UBL) - // Home close to center so grid points have z heights very close to 0 - #define _SAFE_POINT(A) (((GRID_MAX_POINTS_##A) / 2) * (A##_BED_SIZE - 2 * (MESH_INSET)) / (GRID_MAX_POINTS_##A - 1) + MESH_INSET) - #else - #define _SAFE_POINT(A) A##_CENTER - #endif #ifndef Z_SAFE_HOMING_X_POINT - #define Z_SAFE_HOMING_X_POINT _SAFE_POINT(X) + #define Z_SAFE_HOMING_X_POINT X_CENTER #endif #ifndef Z_SAFE_HOMING_Y_POINT - #define Z_SAFE_HOMING_Y_POINT _SAFE_POINT(Y) + #define Z_SAFE_HOMING_Y_POINT Y_CENTER #endif + #define X_TILT_FULCRUM Z_SAFE_HOMING_X_POINT + #define Y_TILT_FULCRUM Z_SAFE_HOMING_Y_POINT +#else + #define X_TILT_FULCRUM X_HOME_POS + #define Y_TILT_FULCRUM Y_HOME_POS #endif /** @@ -272,119 +234,31 @@ #define MAX_AUTORETRACT 99 #endif -/** - * Provide a DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT in case NO_VOLUMETRICS is enabled - */ -#ifndef DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT - #define DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT 0.00 +// MS1 MS2 Stepper Driver Microstepping mode table +#define MICROSTEP1 LOW,LOW +#if ENABLED(HEROIC_STEPPER_DRIVERS) + #define MICROSTEP128 LOW,HIGH +#else + #define MICROSTEP2 HIGH,LOW + #define MICROSTEP4 LOW,HIGH +#endif +#define MICROSTEP8 HIGH,HIGH +#ifdef __SAM3X8E__ + #if MB(ALLIGATOR) + #define MICROSTEP16 LOW,LOW + #define MICROSTEP32 HIGH,HIGH + #else + #define MICROSTEP16 HIGH,HIGH + #endif +#else + #define MICROSTEP16 HIGH,HIGH #endif /** - * LCD Contrast for Graphical Displays + * Override here because this is set in Configuration_adv.h */ -#if ENABLED(CARTESIO_UI) - #define _LCD_CONTRAST_MIN 60 - #define _LCD_CONTRAST_INIT 90 - #define _LCD_CONTRAST_MAX 140 -#elif ENABLED(miniVIKI) - #define _LCD_CONTRAST_MIN 75 - #define _LCD_CONTRAST_INIT 95 - #define _LCD_CONTRAST_MAX 115 -#elif ENABLED(VIKI2) - #define _LCD_CONTRAST_INIT 140 -#elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define _LCD_CONTRAST_MIN 90 - #define _LCD_CONTRAST_INIT 110 - #define _LCD_CONTRAST_MAX 130 -#elif ENABLED(AZSMZ_12864) - #define _LCD_CONTRAST_MIN 120 - #define _LCD_CONTRAST_INIT 190 -#elif ENABLED(MKS_LCD12864) - #define _LCD_CONTRAST_MIN 120 - #define _LCD_CONTRAST_INIT 205 -#elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) - #define _LCD_CONTRAST_MIN 120 - #define _LCD_CONTRAST_INIT 195 -#elif ENABLED(FYSETC_MINI_12864) - #define _LCD_CONTRAST_INIT 220 -#elif ENABLED(ULTI_CONTROLLER) - #define _LCD_CONTRAST_INIT 127 - #define _LCD_CONTRAST_MAX 254 -#elif ENABLED(MAKRPANEL) - #define _LCD_CONTRAST_INIT 17 -#elif ENABLED(MINIPANEL) - #define _LCD_CONTRAST_INIT 150 -#elif ENABLED(ZONESTAR_12864OLED) - #define _LCD_CONTRAST_MIN 64 - #define _LCD_CONTRAST_INIT 128 - #define _LCD_CONTRAST_MAX 255 -#elif IS_TFTGLCD_PANEL - #define _LCD_CONTRAST_MIN 0 - #define _LCD_CONTRAST_INIT 250 - #define _LCD_CONTRAST_MAX 255 -#endif - -#ifdef _LCD_CONTRAST_INIT - #define HAS_LCD_CONTRAST 1 -#endif - -#if HAS_LCD_CONTRAST - #ifndef LCD_CONTRAST_MIN - #ifdef _LCD_CONTRAST_MIN - #define LCD_CONTRAST_MIN _LCD_CONTRAST_MIN - #else - #define LCD_CONTRAST_MIN 0 - #endif - #endif - #ifndef LCD_CONTRAST_INIT - #define LCD_CONTRAST_INIT _LCD_CONTRAST_INIT - #endif - #ifndef LCD_CONTRAST_MAX - #ifdef _LCD_CONTRAST_MAX - #define LCD_CONTRAST_MAX _LCD_CONTRAST_MAX - #elif _LCD_CONTRAST_INIT > 63 - #define LCD_CONTRAST_MAX 255 - #else - #define LCD_CONTRAST_MAX 63 // ST7567 6-bits contrast - #endif - #endif - #ifndef DEFAULT_LCD_CONTRAST - #define DEFAULT_LCD_CONTRAST LCD_CONTRAST_INIT - #endif -#endif - -/** - * Override the SD_DETECT_STATE set in Configuration_adv.h - * and enable sharing of onboard SD host drives (all platforms but AGCM4) - */ -#if ENABLED(SDSUPPORT) - - #if SD_CONNECTION_IS(ONBOARD) && DISABLED(NO_SD_HOST_DRIVE) && !defined(ARDUINO_GRAND_CENTRAL_M4) - // - // The external SD card is not used. Hardware SPI is used to access the card. - // When sharing the SD card with a PC we want the menu options to - // mount/unmount the card and refresh it. So we disable card detect. - // - #undef SD_DETECT_PIN - #define HAS_SHARED_MEDIA 1 - #endif - - #if PIN_EXISTS(SD_DETECT) - #if HAS_LCD_MENU && (SD_CONNECTION_IS(LCD) || !defined(SDCARD_CONNECTION)) - #undef SD_DETECT_STATE - #if ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define SD_DETECT_STATE HIGH - #endif - #endif - #ifndef SD_DETECT_STATE - #define SD_DETECT_STATE LOW - #endif - #endif - -#endif - -#if ANY(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) || !PIN_EXISTS(SD_DETECT) - #define NO_LCD_REINIT 1 // Suppress LCD re-initialization +#if ENABLED(ULTIPANEL) && DISABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #undef SD_DETECT_INVERTED #endif /** @@ -403,93 +277,58 @@ #define DISABLE_INACTIVE_E DISABLE_E #endif -/** - * Power Supply - */ -#ifndef PSU_NAME - #if DISABLED(PSU_CONTROL) - #define PSU_NAME "Generic" // No control - #elif PSU_ACTIVE_STATE - #define PSU_NAME "XBox" // X-Box 360 (203W) - #else - #define PSU_NAME "ATX" // ATX style - #endif +// Power Signal Control Definitions +// By default use ATX definition +#ifndef POWER_SUPPLY + #define POWER_SUPPLY 1 #endif - -#if !defined(PSU_POWERUP_DELAY) && ENABLED(PSU_CONTROL) - #define PSU_POWERUP_DELAY 250 +#if (POWER_SUPPLY == 1) // 1 = ATX + #define PS_ON_AWAKE LOW + #define PS_ON_ASLEEP HIGH +#elif (POWER_SUPPLY == 2) // 2 = X-Box 360 203W + #define PS_ON_AWAKE HIGH + #define PS_ON_ASLEEP LOW #endif +#define HAS_POWER_SWITCH (POWER_SUPPLY > 0 && PIN_EXISTS(PS_ON)) /** * Temp Sensor defines */ - -#define ANY_TEMP_SENSOR_IS(n) (TEMP_SENSOR_0 == (n) || TEMP_SENSOR_1 == (n) || TEMP_SENSOR_2 == (n) || TEMP_SENSOR_3 == (n) || TEMP_SENSOR_4 == (n) || TEMP_SENSOR_5 == (n) || TEMP_SENSOR_6 == (n) || TEMP_SENSOR_7 == (n) || TEMP_SENSOR_BED == (n) || TEMP_SENSOR_PROBE == (n) || TEMP_SENSOR_CHAMBER == (n)) - -#if ANY_TEMP_SENSOR_IS(1000) - #define HAS_USER_THERMISTORS 1 -#endif - -#if TEMP_SENSOR_0 == -5 || TEMP_SENSOR_0 == -3 || TEMP_SENSOR_0 == -2 - #define HEATER_0_USES_MAX6675 - #if TEMP_SENSOR_0 == -3 - #define HEATER_0_MAX6675_TMIN -270 - #define HEATER_0_MAX6675_TMAX 1800 - #else - #define HEATER_0_MAX6675_TMIN 0 - #define HEATER_0_MAX6675_TMAX 1024 - #endif - #if TEMP_SENSOR_0 == -5 - #define MAX6675_IS_MAX31865 - #elif TEMP_SENSOR_0 == -3 - #define MAX6675_IS_MAX31855 - #endif -#elif TEMP_SENSOR_0 == -4 +#if TEMP_SENSOR_0 == -4 #define HEATER_0_USES_AD8495 +#elif TEMP_SENSOR_0 == -3 + #define HEATER_0_USES_MAX6675 + #define MAX6675_IS_MAX31855 + #define MAX6675_TMIN -270 + #define MAX6675_TMAX 1800 +#elif TEMP_SENSOR_0 == -2 + #define HEATER_0_USES_MAX6675 + #define MAX6675_TMIN 0 + #define MAX6675_TMAX 1024 #elif TEMP_SENSOR_0 == -1 #define HEATER_0_USES_AD595 -#elif TEMP_SENSOR_0 > 0 - #define THERMISTOR_HEATER_0 TEMP_SENSOR_0 - #define HEATER_0_USES_THERMISTOR - #if TEMP_SENSOR_0 == 1000 - #define HEATER_0_USER_THERMISTOR - #endif -#else +#elif TEMP_SENSOR_0 == 0 #undef HEATER_0_MINTEMP #undef HEATER_0_MAXTEMP +#elif TEMP_SENSOR_0 > 0 + #define THERMISTORHEATER_0 TEMP_SENSOR_0 + #define HEATER_0_USES_THERMISTOR #endif -#if TEMP_SENSOR_1 == -5 || TEMP_SENSOR_1 == -3 || TEMP_SENSOR_1 == -2 - #define HEATER_1_USES_MAX6675 - #if TEMP_SENSOR_1 == -3 - #define HEATER_1_MAX6675_TMIN -270 - #define HEATER_1_MAX6675_TMAX 1800 - #else - #define HEATER_1_MAX6675_TMIN 0 - #define HEATER_1_MAX6675_TMAX 1024 - #endif - #if TEMP_SENSOR_1 != TEMP_SENSOR_0 - #if TEMP_SENSOR_1 == -5 - #error "If MAX31865 Thermocouple (-5) is used for TEMP_SENSOR_1 then TEMP_SENSOR_0 must match." - #elif TEMP_SENSOR_1 == -3 - #error "If MAX31855 Thermocouple (-3) is used for TEMP_SENSOR_1 then TEMP_SENSOR_0 must match." - #elif TEMP_SENSOR_1 == -2 - #error "If MAX6675 Thermocouple (-2) is used for TEMP_SENSOR_1 then TEMP_SENSOR_0 must match." - #endif - #endif -#elif TEMP_SENSOR_1 == -4 +#if TEMP_SENSOR_1 == -4 #define HEATER_1_USES_AD8495 +#elif TEMP_SENSOR_1 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_1." +#elif TEMP_SENSOR_1 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_1." #elif TEMP_SENSOR_1 == -1 #define HEATER_1_USES_AD595 -#elif TEMP_SENSOR_1 > 0 - #define THERMISTOR_HEATER_1 TEMP_SENSOR_1 - #define HEATER_1_USES_THERMISTOR - #if TEMP_SENSOR_1 == 1000 - #define HEATER_1_USER_THERMISTOR - #endif -#else +#elif TEMP_SENSOR_1 == 0 #undef HEATER_1_MINTEMP #undef HEATER_1_MAXTEMP +#elif TEMP_SENSOR_1 > 0 + #define THERMISTORHEATER_1 TEMP_SENSOR_1 + #define HEATER_1_USES_THERMISTOR #endif #if TEMP_SENSOR_2 == -4 @@ -500,15 +339,12 @@ #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_2." #elif TEMP_SENSOR_2 == -1 #define HEATER_2_USES_AD595 -#elif TEMP_SENSOR_2 > 0 - #define THERMISTOR_HEATER_2 TEMP_SENSOR_2 - #define HEATER_2_USES_THERMISTOR - #if TEMP_SENSOR_2 == 1000 - #define HEATER_2_USER_THERMISTOR - #endif -#else +#elif TEMP_SENSOR_2 == 0 #undef HEATER_2_MINTEMP #undef HEATER_2_MAXTEMP +#elif TEMP_SENSOR_2 > 0 + #define THERMISTORHEATER_2 TEMP_SENSOR_2 + #define HEATER_2_USES_THERMISTOR #endif #if TEMP_SENSOR_3 == -4 @@ -519,15 +355,12 @@ #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_3." #elif TEMP_SENSOR_3 == -1 #define HEATER_3_USES_AD595 -#elif TEMP_SENSOR_3 > 0 - #define THERMISTOR_HEATER_3 TEMP_SENSOR_3 - #define HEATER_3_USES_THERMISTOR - #if TEMP_SENSOR_3 == 1000 - #define HEATER_3_USER_THERMISTOR - #endif -#else +#elif TEMP_SENSOR_3 == 0 #undef HEATER_3_MINTEMP #undef HEATER_3_MAXTEMP +#elif TEMP_SENSOR_3 > 0 + #define THERMISTORHEATER_3 TEMP_SENSOR_3 + #define HEATER_3_USES_THERMISTOR #endif #if TEMP_SENSOR_4 == -4 @@ -538,72 +371,12 @@ #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_4." #elif TEMP_SENSOR_4 == -1 #define HEATER_4_USES_AD595 -#elif TEMP_SENSOR_4 > 0 - #define THERMISTOR_HEATER_4 TEMP_SENSOR_4 - #define HEATER_4_USES_THERMISTOR - #if TEMP_SENSOR_4 == 1000 - #define HEATER_4_USER_THERMISTOR - #endif -#else +#elif TEMP_SENSOR_4 == 0 #undef HEATER_4_MINTEMP #undef HEATER_4_MAXTEMP -#endif - -#if TEMP_SENSOR_5 == -4 - #define HEATER_5_USES_AD8495 -#elif TEMP_SENSOR_5 == -3 - #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_5." -#elif TEMP_SENSOR_5 == -2 - #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_5." -#elif TEMP_SENSOR_5 == -1 - #define HEATER_5_USES_AD595 -#elif TEMP_SENSOR_5 > 0 - #define THERMISTOR_HEATER_5 TEMP_SENSOR_5 - #define HEATER_5_USES_THERMISTOR - #if TEMP_SENSOR_5 == 1000 - #define HEATER_5_USER_THERMISTOR - #endif -#else - #undef HEATER_5_MINTEMP - #undef HEATER_5_MAXTEMP -#endif - -#if TEMP_SENSOR_6 == -4 - #define HEATER_6_USES_AD8495 -#elif TEMP_SENSOR_6 == -3 - #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_6." -#elif TEMP_SENSOR_6 == -2 - #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_6." -#elif TEMP_SENSOR_6 == -1 - #define HEATER_6_USES_AD595 -#elif TEMP_SENSOR_6 > 0 - #define THERMISTOR_HEATER_6 TEMP_SENSOR_6 - #define HEATER_6_USES_THERMISTOR - #if TEMP_SENSOR_6 == 1000 - #define HEATER_6_USER_THERMISTOR - #endif -#else - #undef HEATER_6_MINTEMP - #undef HEATER_6_MAXTEMP -#endif - -#if TEMP_SENSOR_7 == -4 - #define HEATER_7_USES_AD8495 -#elif TEMP_SENSOR_7 == -3 - #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_7." -#elif TEMP_SENSOR_7 == -2 - #error "MAX7775 Thermocouples (-2) not supported for TEMP_SENSOR_7." -#elif TEMP_SENSOR_7 == -1 - #define HEATER_7_USES_AD595 -#elif TEMP_SENSOR_7 > 0 - #define THERMISTOR_HEATER_7 TEMP_SENSOR_7 - #define HEATER_7_USES_THERMISTOR - #if TEMP_SENSOR_7 == 1000 - #define HEATER_7_USER_THERMISTOR - #endif -#else - #undef HEATER_7_MINTEMP - #undef HEATER_7_MAXTEMP +#elif TEMP_SENSOR_4 > 0 + #define THERMISTORHEATER_4 TEMP_SENSOR_4 + #define HEATER_4_USES_THERMISTOR #endif #if TEMP_SENSOR_BED == -4 @@ -614,15 +387,12 @@ #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_BED." #elif TEMP_SENSOR_BED == -1 #define HEATER_BED_USES_AD595 +#elif TEMP_SENSOR_BED == 0 + #undef BED_MINTEMP + #undef BED_MAXTEMP #elif TEMP_SENSOR_BED > 0 #define THERMISTORBED TEMP_SENSOR_BED #define HEATER_BED_USES_THERMISTOR - #if TEMP_SENSOR_BED == 1000 - #define HEATER_BED_USER_THERMISTOR - #endif -#else - #undef BED_MINTEMP - #undef BED_MAXTEMP #endif #if TEMP_SENSOR_CHAMBER == -4 @@ -636,644 +406,265 @@ #elif TEMP_SENSOR_CHAMBER > 0 #define THERMISTORCHAMBER TEMP_SENSOR_CHAMBER #define HEATER_CHAMBER_USES_THERMISTOR - #if TEMP_SENSOR_CHAMBER == 1000 - #define HEATER_CHAMBER_USER_THERMISTOR - #endif -#else - #undef CHAMBER_MINTEMP - #undef CHAMBER_MAXTEMP #endif -#if TEMP_SENSOR_PROBE == -4 - #define HEATER_PROBE_USES_AD8495 -#elif TEMP_SENSOR_PROBE == -3 - #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_PROBE." -#elif TEMP_SENSOR_PROBE == -2 - #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_PROBE." -#elif TEMP_SENSOR_PROBE == -1 - #define HEATER_PROBE_USES_AD595 -#elif TEMP_SENSOR_PROBE > 0 - #define THERMISTORPROBE TEMP_SENSOR_PROBE - #define PROBE_USES_THERMISTOR - #if TEMP_SENSOR_PROBE == 1000 - #define PROBE_USER_THERMISTOR +#define HOTEND_USES_THERMISTOR (ENABLED(HEATER_0_USES_THERMISTOR) || ENABLED(HEATER_1_USES_THERMISTOR) || ENABLED(HEATER_2_USES_THERMISTOR) || ENABLED(HEATER_3_USES_THERMISTOR) || ENABLED(HEATER_4_USES_THERMISTOR)) + +/** + * Default hotend offsets, if not defined + */ +#if HOTENDS > 1 + #ifndef HOTEND_OFFSET_X + #define HOTEND_OFFSET_X { 0 } // X offsets for each extruder + #endif + #ifndef HOTEND_OFFSET_Y + #define HOTEND_OFFSET_Y { 0 } // Y offsets for each extruder + #endif + #ifndef HOTEND_OFFSET_Z + #define HOTEND_OFFSET_Z { 0 } // Z offsets for each extruder #endif #endif -#define HOTEND_USES_THERMISTOR ANY( \ - HEATER_0_USES_THERMISTOR, HEATER_1_USES_THERMISTOR, HEATER_2_USES_THERMISTOR, HEATER_3_USES_THERMISTOR, \ - HEATER_4_USES_THERMISTOR, HEATER_5_USES_THERMISTOR, HEATER_6_USES_THERMISTOR, HEATER_7_USES_THERMISTOR ) +/** + * ARRAY_BY_EXTRUDERS based on EXTRUDERS + */ +#define ARRAY_BY_EXTRUDERS(...) ARRAY_N(EXTRUDERS, __VA_ARGS__) +#define ARRAY_BY_EXTRUDERS1(v1) ARRAY_BY_EXTRUDERS(v1, v1, v1, v1, v1, v1) + +/** + * ARRAY_BY_HOTENDS based on HOTENDS + */ +#define ARRAY_BY_HOTENDS(...) ARRAY_N(HOTENDS, __VA_ARGS__) +#define ARRAY_BY_HOTENDS1(v1) ARRAY_BY_HOTENDS(v1, v1, v1, v1, v1, v1) + +/** + * Driver Timings + * NOTE: Driver timing order is longest-to-shortest duration. + * Preserve this ordering when adding new drivers. + */ +#ifndef MINIMUM_STEPPER_DIR_DELAY + #if HAS_DRIVER(TB6560) + #define MINIMUM_STEPPER_DIR_DELAY 15000 + #elif HAS_DRIVER(TB6600) + #define MINIMUM_STEPPER_DIR_DELAY 1500 + #elif HAS_DRIVER(DRV8825) + #define MINIMUM_STEPPER_DIR_DELAY 650 + #elif HAS_DRIVER(LV8729) + #define MINIMUM_STEPPER_DIR_DELAY 500 + #elif HAS_DRIVER(A5984) + #define MINIMUM_STEPPER_DIR_DELAY 400 + #elif HAS_DRIVER(A4988) + #define MINIMUM_STEPPER_DIR_DELAY 200 + #elif HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) + #define MINIMUM_STEPPER_DIR_DELAY 20 + #else + #define MINIMUM_STEPPER_DIR_DELAY 0 // Expect at least 10µS since one Stepper ISR must transpire + #endif +#endif + +#ifndef MINIMUM_STEPPER_PULSE + #if HAS_DRIVER(TB6560) + #define MINIMUM_STEPPER_PULSE 30 + #elif HAS_DRIVER(TB6600) + #define MINIMUM_STEPPER_PULSE 3 + #elif HAS_DRIVER(DRV8825) + #define MINIMUM_STEPPER_PULSE 2 + #elif HAS_DRIVER(A4988) || HAS_DRIVER(LV8729) || HAS_DRIVER(A5984) + #define MINIMUM_STEPPER_PULSE 1 + #elif HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) + #define MINIMUM_STEPPER_PULSE 0 + #else + #define MINIMUM_STEPPER_PULSE 2 + #endif +#endif + +#ifndef MAXIMUM_STEPPER_RATE + #if HAS_DRIVER(TB6560) + #define MAXIMUM_STEPPER_RATE 15000 + #elif HAS_DRIVER(LV8729) + #define MAXIMUM_STEPPER_RATE 130000 + #elif HAS_DRIVER(TB6600) + #define MAXIMUM_STEPPER_RATE 150000 + #elif HAS_DRIVER(DRV8825) + #define MAXIMUM_STEPPER_RATE 250000 + #elif HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) + #define MAXIMUM_STEPPER_RATE 400000 + #elif HAS_DRIVER(A4988) + #define MAXIMUM_STEPPER_RATE 500000 + #else + #define MAXIMUM_STEPPER_RATE 250000 + #endif +#endif /** * X_DUAL_ENDSTOPS endstop reassignment */ #if ENABLED(X_DUAL_ENDSTOPS) #if X_HOME_DIR > 0 - #ifndef X2_MAX_ENDSTOP_INVERTING - #if X2_USE_ENDSTOP == _XMIN_ - #define X2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define X2_MAX_ENDSTOP_INVERTING false - #endif - #endif - #ifndef X2_MAX_PIN - #if X2_USE_ENDSTOP == _XMIN_ - #define X2_MAX_PIN X_MIN_PIN - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MAX_PIN X_MAX_PIN - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MAX_PIN Y_MIN_PIN - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MAX_PIN Y_MAX_PIN - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MAX_PIN Z_MIN_PIN - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MAX_PIN Z_MAX_PIN - #elif X2_USE_ENDSTOP == _XDIAG_ - #define X2_MAX_PIN X_DIAG_PIN - #elif X2_USE_ENDSTOP == _YDIAG_ - #define X2_MAX_PIN Y_DIAG_PIN - #elif X2_USE_ENDSTOP == _ZDIAG_ - #define X2_MAX_PIN Z_DIAG_PIN - #elif X2_USE_ENDSTOP == _E0DIAG_ - #define X2_MAX_PIN E0_DIAG_PIN - #elif X2_USE_ENDSTOP == _E1DIAG_ - #define X2_MAX_PIN E1_DIAG_PIN - #elif X2_USE_ENDSTOP == _E2DIAG_ - #define X2_MAX_PIN E2_DIAG_PIN - #elif X2_USE_ENDSTOP == _E3DIAG_ - #define X2_MAX_PIN E3_DIAG_PIN - #elif X2_USE_ENDSTOP == _E4DIAG_ - #define X2_MAX_PIN E4_DIAG_PIN - #elif X2_USE_ENDSTOP == _E5DIAG_ - #define X2_MAX_PIN E5_DIAG_PIN - #elif X2_USE_ENDSTOP == _E6DIAG_ - #define X2_MAX_PIN E6_DIAG_PIN - #elif X2_USE_ENDSTOP == _E7DIAG_ - #define X2_MAX_PIN E7_DIAG_PIN - #endif - #endif - #ifndef X2_MIN_ENDSTOP_INVERTING - #define X2_MIN_ENDSTOP_INVERTING false - #endif - #else - #ifndef X2_MIN_ENDSTOP_INVERTING - #if X2_USE_ENDSTOP == _XMIN_ - #define X2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define X2_MIN_ENDSTOP_INVERTING false - #endif - #endif - #ifndef X2_MIN_PIN - #if X2_USE_ENDSTOP == _XMIN_ - #define X2_MIN_PIN X_MIN_PIN - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MIN_PIN X_MAX_PIN - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MIN_PIN Y_MIN_PIN - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MIN_PIN Y_MAX_PIN - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MIN_PIN Z_MIN_PIN - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MIN_PIN Z_MAX_PIN - #elif X2_USE_ENDSTOP == _XDIAG_ - #define X2_MIN_PIN X_DIAG_PIN - #elif X2_USE_ENDSTOP == _YDIAG_ - #define X2_MIN_PIN Y_DIAG_PIN - #elif X2_USE_ENDSTOP == _ZDIAG_ - #define X2_MIN_PIN Z_DIAG_PIN - #elif X2_USE_ENDSTOP == _E0DIAG_ - #define X2_MIN_PIN E0_DIAG_PIN - #elif X2_USE_ENDSTOP == _E1DIAG_ - #define X2_MIN_PIN E1_DIAG_PIN - #elif X2_USE_ENDSTOP == _E2DIAG_ - #define X2_MIN_PIN E2_DIAG_PIN - #elif X2_USE_ENDSTOP == _E3DIAG_ - #define X2_MIN_PIN E3_DIAG_PIN - #elif X2_USE_ENDSTOP == _E4DIAG_ - #define X2_MIN_PIN E4_DIAG_PIN - #elif X2_USE_ENDSTOP == _E5DIAG_ - #define X2_MIN_PIN E5_DIAG_PIN - #elif X2_USE_ENDSTOP == _E6DIAG_ - #define X2_MIN_PIN E6_DIAG_PIN - #elif X2_USE_ENDSTOP == _E7DIAG_ - #define X2_MIN_PIN E7_DIAG_PIN - #endif - #endif - #ifndef X2_MAX_ENDSTOP_INVERTING + #if X2_USE_ENDSTOP == _XMIN_ + #define X2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define X2_MAX_PIN X_MIN_PIN + #elif X2_USE_ENDSTOP == _XMAX_ + #define X2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define X2_MAX_PIN X_MAX_PIN + #elif X2_USE_ENDSTOP == _YMIN_ + #define X2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define X2_MAX_PIN Y_MIN_PIN + #elif X2_USE_ENDSTOP == _YMAX_ + #define X2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define X2_MAX_PIN Y_MAX_PIN + #elif X2_USE_ENDSTOP == _ZMIN_ + #define X2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define X2_MAX_PIN Z_MIN_PIN + #elif X2_USE_ENDSTOP == _ZMAX_ + #define X2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define X2_MAX_PIN Z_MAX_PIN + #else #define X2_MAX_ENDSTOP_INVERTING false #endif + #define X2_MIN_ENDSTOP_INVERTING false + #else + #if X2_USE_ENDSTOP == _XMIN_ + #define X2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define X2_MIN_PIN X_MIN_PIN + #elif X2_USE_ENDSTOP == _XMAX_ + #define X2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define X2_MIN_PIN X_MAX_PIN + #elif X2_USE_ENDSTOP == _YMIN_ + #define X2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define X2_MIN_PIN Y_MIN_PIN + #elif X2_USE_ENDSTOP == _YMAX_ + #define X2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define X2_MIN_PIN Y_MAX_PIN + #elif X2_USE_ENDSTOP == _ZMIN_ + #define X2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define X2_MIN_PIN Z_MIN_PIN + #elif X2_USE_ENDSTOP == _ZMAX_ + #define X2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define X2_MIN_PIN Z_MAX_PIN + #else + #define X2_MIN_ENDSTOP_INVERTING false + #endif + #define X2_MAX_ENDSTOP_INVERTING false #endif #endif +// Is an endstop plug used for the X2 endstop? +#define IS_X2_ENDSTOP(A,M) (ENABLED(X_DUAL_ENDSTOPS) && X2_USE_ENDSTOP == _##A##M##_) + /** * Y_DUAL_ENDSTOPS endstop reassignment */ #if ENABLED(Y_DUAL_ENDSTOPS) #if Y_HOME_DIR > 0 - #ifndef Y2_MAX_ENDSTOP_INVERTING - #if Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Y2_MAX_ENDSTOP_INVERTING false - #endif - #endif - #ifndef Y2_MAX_PIN - #if Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MAX_PIN X_MIN_PIN - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MAX_PIN X_MAX_PIN - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MAX_PIN Y_MIN_PIN - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MAX_PIN Y_MAX_PIN - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MAX_PIN Z_MIN_PIN - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MAX_PIN Z_MAX_PIN - #elif Y2_USE_ENDSTOP == _XDIAG_ - #define Y2_MAX_PIN X_DIAG_PIN - #elif Y2_USE_ENDSTOP == _YDIAG_ - #define Y2_MAX_PIN Y_DIAG_PIN - #elif Y2_USE_ENDSTOP == _ZDIAG_ - #define Y2_MAX_PIN Z_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E0DIAG_ - #define Y2_MAX_PIN E0_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E1DIAG_ - #define Y2_MAX_PIN E1_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E2DIAG_ - #define Y2_MAX_PIN E2_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E3DIAG_ - #define Y2_MAX_PIN E3_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E4DIAG_ - #define Y2_MAX_PIN E4_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E5DIAG_ - #define Y2_MAX_PIN E5_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E6DIAG_ - #define Y2_MAX_PIN E6_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E7DIAG_ - #define Y2_MAX_PIN E7_DIAG_PIN - #endif - #endif - #ifndef Y2_MIN_ENDSTOP_INVERTING - #define Y2_MIN_ENDSTOP_INVERTING false - #endif - #else - #ifndef Y2_MIN_ENDSTOP_INVERTING - #if Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Y2_MIN_ENDSTOP_INVERTING false - #endif - #endif - #ifndef Y2_MIN_PIN - #if Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MIN_PIN X_MIN_PIN - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MIN_PIN X_MAX_PIN - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MIN_PIN Y_MIN_PIN - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MIN_PIN Y_MAX_PIN - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MIN_PIN Z_MIN_PIN - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MIN_PIN Z_MAX_PIN - #elif Y2_USE_ENDSTOP == _XDIAG_ - #define Y2_MIN_PIN X_DIAG_PIN - #elif Y2_USE_ENDSTOP == _YDIAG_ - #define Y2_MIN_PIN Y_DIAG_PIN - #elif Y2_USE_ENDSTOP == _ZDIAG_ - #define Y2_MIN_PIN Z_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E0DIAG_ - #define Y2_MIN_PIN E0_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E1DIAG_ - #define Y2_MIN_PIN E1_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E2DIAG_ - #define Y2_MIN_PIN E2_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E3DIAG_ - #define Y2_MIN_PIN E3_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E4DIAG_ - #define Y2_MIN_PIN E4_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E5DIAG_ - #define Y2_MIN_PIN E5_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E6DIAG_ - #define Y2_MIN_PIN E6_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E7DIAG_ - #define Y2_MIN_PIN E7_DIAG_PIN - #endif - #endif - #ifndef Y2_MAX_ENDSTOP_INVERTING + #if Y2_USE_ENDSTOP == _XMIN_ + #define Y2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Y2_MAX_PIN X_MIN_PIN + #elif Y2_USE_ENDSTOP == _XMAX_ + #define Y2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Y2_MAX_PIN X_MAX_PIN + #elif Y2_USE_ENDSTOP == _YMIN_ + #define Y2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Y2_MAX_PIN Y_MIN_PIN + #elif Y2_USE_ENDSTOP == _YMAX_ + #define Y2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Y2_MAX_PIN Y_MAX_PIN + #elif Y2_USE_ENDSTOP == _ZMIN_ + #define Y2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Y2_MAX_PIN Z_MIN_PIN + #elif Y2_USE_ENDSTOP == _ZMAX_ + #define Y2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Y2_MAX_PIN Z_MAX_PIN + #else #define Y2_MAX_ENDSTOP_INVERTING false #endif + #define Y2_MIN_ENDSTOP_INVERTING false + #else + #if Y2_USE_ENDSTOP == _XMIN_ + #define Y2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Y2_MIN_PIN X_MIN_PIN + #elif Y2_USE_ENDSTOP == _XMAX_ + #define Y2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Y2_MIN_PIN X_MAX_PIN + #elif Y2_USE_ENDSTOP == _YMIN_ + #define Y2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Y2_MIN_PIN Y_MIN_PIN + #elif Y2_USE_ENDSTOP == _YMAX_ + #define Y2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Y2_MIN_PIN Y_MAX_PIN + #elif Y2_USE_ENDSTOP == _ZMIN_ + #define Y2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Y2_MIN_PIN Z_MIN_PIN + #elif Y2_USE_ENDSTOP == _ZMAX_ + #define Y2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Y2_MIN_PIN Z_MAX_PIN + #else + #define Y2_MIN_ENDSTOP_INVERTING false + #endif + #define Y2_MAX_ENDSTOP_INVERTING false #endif #endif -/** - * Z_MULTI_ENDSTOPS endstop reassignment - */ -#if ENABLED(Z_MULTI_ENDSTOPS) +// Is an endstop plug used for the Y2 endstop or the bed probe? +#define IS_Y2_ENDSTOP(A,M) (ENABLED(Y_DUAL_ENDSTOPS) && Y2_USE_ENDSTOP == _##A##M##_) +/** + * Z_DUAL_ENDSTOPS endstop reassignment + */ +#if ENABLED(Z_DUAL_ENDSTOPS) #if Z_HOME_DIR > 0 - #ifndef Z2_MAX_ENDSTOP_INVERTING - #if Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Z2_MAX_ENDSTOP_INVERTING false - #endif - #endif - #ifndef Z2_MAX_PIN - #if Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MAX_PIN X_MIN_PIN - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MAX_PIN X_MAX_PIN - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MAX_PIN Y_MIN_PIN - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MAX_PIN Y_MAX_PIN - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MAX_PIN Z_MIN_PIN - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MAX_PIN Z_MAX_PIN - #elif Z2_USE_ENDSTOP == _XDIAG_ - #define Z2_MAX_PIN X_DIAG_PIN - #elif Z2_USE_ENDSTOP == _YDIAG_ - #define Z2_MAX_PIN Y_DIAG_PIN - #elif Z2_USE_ENDSTOP == _ZDIAG_ - #define Z2_MAX_PIN Z_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E0DIAG_ - #define Z2_MAX_PIN E0_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E1DIAG_ - #define Z2_MAX_PIN E1_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E2DIAG_ - #define Z2_MAX_PIN E2_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E3DIAG_ - #define Z2_MAX_PIN E3_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E4DIAG_ - #define Z2_MAX_PIN E4_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E5DIAG_ - #define Z2_MAX_PIN E5_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E6DIAG_ - #define Z2_MAX_PIN E6_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E7DIAG_ - #define Z2_MAX_PIN E7_DIAG_PIN - #endif - #endif - #ifndef Z2_MIN_ENDSTOP_INVERTING - #define Z2_MIN_ENDSTOP_INVERTING false - #endif - #else - #ifndef Z2_MIN_ENDSTOP_INVERTING - #if Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Z2_MIN_ENDSTOP_INVERTING false - #endif - #endif - #ifndef Z2_MIN_PIN - #if Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MIN_PIN X_MIN_PIN - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MIN_PIN X_MAX_PIN - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MIN_PIN Y_MIN_PIN - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MIN_PIN Y_MAX_PIN - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MIN_PIN Z_MIN_PIN - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MIN_PIN Z_MAX_PIN - #elif Z2_USE_ENDSTOP == _XDIAG_ - #define Z2_MIN_PIN X_DIAG_PIN - #elif Z2_USE_ENDSTOP == _YDIAG_ - #define Z2_MIN_PIN Y_DIAG_PIN - #elif Z2_USE_ENDSTOP == _ZDIAG_ - #define Z2_MIN_PIN Z_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E0DIAG_ - #define Z2_MIN_PIN E0_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E1DIAG_ - #define Z2_MIN_PIN E1_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E2DIAG_ - #define Z2_MIN_PIN E2_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E3DIAG_ - #define Z2_MIN_PIN E3_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E4DIAG_ - #define Z2_MIN_PIN E4_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E5DIAG_ - #define Z2_MIN_PIN E5_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E6DIAG_ - #define Z2_MIN_PIN E6_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E7DIAG_ - #define Z2_MIN_PIN E7_DIAG_PIN - #endif - #endif - #ifndef Z2_MAX_ENDSTOP_INVERTING + #if Z2_USE_ENDSTOP == _XMIN_ + #define Z2_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Z2_MAX_PIN X_MIN_PIN + #elif Z2_USE_ENDSTOP == _XMAX_ + #define Z2_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Z2_MAX_PIN X_MAX_PIN + #elif Z2_USE_ENDSTOP == _YMIN_ + #define Z2_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Z2_MAX_PIN Y_MIN_PIN + #elif Z2_USE_ENDSTOP == _YMAX_ + #define Z2_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Z2_MAX_PIN Y_MAX_PIN + #elif Z2_USE_ENDSTOP == _ZMIN_ + #define Z2_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Z2_MAX_PIN Z_MIN_PIN + #elif Z2_USE_ENDSTOP == _ZMAX_ + #define Z2_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Z2_MAX_PIN Z_MAX_PIN + #else #define Z2_MAX_ENDSTOP_INVERTING false #endif - #endif - - #if NUM_Z_STEPPER_DRIVERS >= 3 - #if Z_HOME_DIR > 0 - #ifndef Z3_MAX_ENDSTOP_INVERTING - #if Z3_USE_ENDSTOP == _XMIN_ - #define Z3_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _XMAX_ - #define Z3_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _YMIN_ - #define Z3_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _YMAX_ - #define Z3_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _ZMIN_ - #define Z3_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _ZMAX_ - #define Z3_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Z3_MAX_ENDSTOP_INVERTING false - #endif - #endif - #ifndef Z3_MAX_PIN - #if Z3_USE_ENDSTOP == _XMIN_ - #define Z3_MAX_PIN X_MIN_PIN - #elif Z3_USE_ENDSTOP == _XMAX_ - #define Z3_MAX_PIN X_MAX_PIN - #elif Z3_USE_ENDSTOP == _YMIN_ - #define Z3_MAX_PIN Y_MIN_PIN - #elif Z3_USE_ENDSTOP == _YMAX_ - #define Z3_MAX_PIN Y_MAX_PIN - #elif Z3_USE_ENDSTOP == _ZMIN_ - #define Z3_MAX_PIN Z_MIN_PIN - #elif Z3_USE_ENDSTOP == _ZMAX_ - #define Z3_MAX_PIN Z_MAX_PIN - #elif Z3_USE_ENDSTOP == _XDIAG_ - #define Z3_MAX_PIN X_DIAG_PIN - #elif Z3_USE_ENDSTOP == _YDIAG_ - #define Z3_MAX_PIN Y_DIAG_PIN - #elif Z3_USE_ENDSTOP == _ZDIAG_ - #define Z3_MAX_PIN Z_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E0DIAG_ - #define Z3_MAX_PIN E0_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E1DIAG_ - #define Z3_MAX_PIN E1_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E2DIAG_ - #define Z3_MAX_PIN E2_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E3DIAG_ - #define Z3_MAX_PIN E3_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E4DIAG_ - #define Z3_MAX_PIN E4_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E5DIAG_ - #define Z3_MAX_PIN E5_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E6DIAG_ - #define Z3_MAX_PIN E6_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E7DIAG_ - #define Z3_MAX_PIN E7_DIAG_PIN - #endif - #endif - #ifndef Z3_MIN_ENDSTOP_INVERTING - #define Z3_MIN_ENDSTOP_INVERTING false - #endif + #define Z2_MIN_ENDSTOP_INVERTING false + #else + #if Z2_USE_ENDSTOP == _XMIN_ + #define Z2_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING + #define Z2_MIN_PIN X_MIN_PIN + #elif Z2_USE_ENDSTOP == _XMAX_ + #define Z2_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING + #define Z2_MIN_PIN X_MAX_PIN + #elif Z2_USE_ENDSTOP == _YMIN_ + #define Z2_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING + #define Z2_MIN_PIN Y_MIN_PIN + #elif Z2_USE_ENDSTOP == _YMAX_ + #define Z2_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING + #define Z2_MIN_PIN Y_MAX_PIN + #elif Z2_USE_ENDSTOP == _ZMIN_ + #define Z2_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING + #define Z2_MIN_PIN Z_MIN_PIN + #elif Z2_USE_ENDSTOP == _ZMAX_ + #define Z2_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING + #define Z2_MIN_PIN Z_MAX_PIN #else - #ifndef Z3_MIN_ENDSTOP_INVERTING - #if Z3_USE_ENDSTOP == _XMIN_ - #define Z3_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _XMAX_ - #define Z3_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _YMIN_ - #define Z3_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _YMAX_ - #define Z3_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _ZMIN_ - #define Z3_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z3_USE_ENDSTOP == _ZMAX_ - #define Z3_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Z3_MIN_ENDSTOP_INVERTING false - #endif - #endif - #ifndef Z3_MIN_PIN - #if Z3_USE_ENDSTOP == _XMIN_ - #define Z3_MIN_PIN X_MIN_PIN - #elif Z3_USE_ENDSTOP == _XMAX_ - #define Z3_MIN_PIN X_MAX_PIN - #elif Z3_USE_ENDSTOP == _YMIN_ - #define Z3_MIN_PIN Y_MIN_PIN - #elif Z3_USE_ENDSTOP == _YMAX_ - #define Z3_MIN_PIN Y_MAX_PIN - #elif Z3_USE_ENDSTOP == _ZMIN_ - #define Z3_MIN_PIN Z_MIN_PIN - #elif Z3_USE_ENDSTOP == _ZMAX_ - #define Z3_MIN_PIN Z_MAX_PIN - #elif Z3_USE_ENDSTOP == _XDIAG_ - #define Z3_MIN_PIN X_DIAG_PIN - #elif Z3_USE_ENDSTOP == _YDIAG_ - #define Z3_MIN_PIN Y_DIAG_PIN - #elif Z3_USE_ENDSTOP == _ZDIAG_ - #define Z3_MIN_PIN Z_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E0DIAG_ - #define Z3_MIN_PIN E0_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E1DIAG_ - #define Z3_MIN_PIN E1_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E2DIAG_ - #define Z3_MIN_PIN E2_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E3DIAG_ - #define Z3_MIN_PIN E3_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E4DIAG_ - #define Z3_MIN_PIN E4_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E5DIAG_ - #define Z3_MIN_PIN E5_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E6DIAG_ - #define Z3_MIN_PIN E6_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E7DIAG_ - #define Z3_MIN_PIN E7_DIAG_PIN - #endif - #endif - #ifndef Z3_MAX_ENDSTOP_INVERTING - #define Z3_MAX_ENDSTOP_INVERTING false - #endif + #define Z2_MIN_ENDSTOP_INVERTING false #endif + #define Z2_MAX_ENDSTOP_INVERTING false #endif +#endif - #if NUM_Z_STEPPER_DRIVERS >= 4 - #if Z_HOME_DIR > 0 - #ifndef Z4_MAX_ENDSTOP_INVERTING - #if Z4_USE_ENDSTOP == _XMIN_ - #define Z4_MAX_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _XMAX_ - #define Z4_MAX_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _YMIN_ - #define Z4_MAX_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _YMAX_ - #define Z4_MAX_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _ZMIN_ - #define Z4_MAX_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _ZMAX_ - #define Z4_MAX_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Z4_MAX_ENDSTOP_INVERTING false - #endif - #endif - #ifndef Z4_MAX_PIN - #if Z4_USE_ENDSTOP == _XMIN_ - #define Z4_MAX_PIN X_MIN_PIN - #elif Z4_USE_ENDSTOP == _XMAX_ - #define Z4_MAX_PIN X_MAX_PIN - #elif Z4_USE_ENDSTOP == _YMIN_ - #define Z4_MAX_PIN Y_MIN_PIN - #elif Z4_USE_ENDSTOP == _YMAX_ - #define Z4_MAX_PIN Y_MAX_PIN - #elif Z4_USE_ENDSTOP == _ZMIN_ - #define Z4_MAX_PIN Z_MIN_PIN - #elif Z4_USE_ENDSTOP == _ZMAX_ - #define Z4_MAX_PIN Z_MAX_PIN - #elif Z4_USE_ENDSTOP == _XDIAG_ - #define Z4_MAX_PIN X_DIAG_PIN - #elif Z4_USE_ENDSTOP == _YDIAG_ - #define Z4_MAX_PIN Y_DIAG_PIN - #elif Z4_USE_ENDSTOP == _ZDIAG_ - #define Z4_MAX_PIN Z_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E0DIAG_ - #define Z4_MAX_PIN E0_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E1DIAG_ - #define Z4_MAX_PIN E1_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E2DIAG_ - #define Z4_MAX_PIN E2_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E3DIAG_ - #define Z4_MAX_PIN E3_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E4DIAG_ - #define Z4_MAX_PIN E4_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E5DIAG_ - #define Z4_MAX_PIN E5_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E6DIAG_ - #define Z4_MAX_PIN E6_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E7DIAG_ - #define Z4_MAX_PIN E7_DIAG_PIN - #endif - #endif - #ifndef Z4_MIN_ENDSTOP_INVERTING - #define Z4_MIN_ENDSTOP_INVERTING false - #endif - #else - #ifndef Z4_MIN_ENDSTOP_INVERTING - #if Z4_USE_ENDSTOP == _XMIN_ - #define Z4_MIN_ENDSTOP_INVERTING X_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _XMAX_ - #define Z4_MIN_ENDSTOP_INVERTING X_MAX_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _YMIN_ - #define Z4_MIN_ENDSTOP_INVERTING Y_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _YMAX_ - #define Z4_MIN_ENDSTOP_INVERTING Y_MAX_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _ZMIN_ - #define Z4_MIN_ENDSTOP_INVERTING Z_MIN_ENDSTOP_INVERTING - #elif Z4_USE_ENDSTOP == _ZMAX_ - #define Z4_MIN_ENDSTOP_INVERTING Z_MAX_ENDSTOP_INVERTING - #else - #define Z4_MIN_ENDSTOP_INVERTING false - #endif - #endif - #ifndef Z4_MIN_PIN - #if Z4_USE_ENDSTOP == _XMIN_ - #define Z4_MIN_PIN X_MIN_PIN - #elif Z4_USE_ENDSTOP == _XMAX_ - #define Z4_MIN_PIN X_MAX_PIN - #elif Z4_USE_ENDSTOP == _YMIN_ - #define Z4_MIN_PIN Y_MIN_PIN - #elif Z4_USE_ENDSTOP == _YMAX_ - #define Z4_MIN_PIN Y_MAX_PIN - #elif Z4_USE_ENDSTOP == _ZMIN_ - #define Z4_MIN_PIN Z_MIN_PIN - #elif Z4_USE_ENDSTOP == _ZMAX_ - #define Z4_MIN_PIN Z_MAX_PIN - #elif Z4_USE_ENDSTOP == _XDIAG_ - #define Z4_MIN_PIN X_DIAG_PIN - #elif Z4_USE_ENDSTOP == _YDIAG_ - #define Z4_MIN_PIN Y_DIAG_PIN - #elif Z4_USE_ENDSTOP == _ZDIAG_ - #define Z4_MIN_PIN Z_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E0DIAG_ - #define Z4_MIN_PIN E0_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E1DIAG_ - #define Z4_MIN_PIN E1_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E2DIAG_ - #define Z4_MIN_PIN E2_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E3DIAG_ - #define Z4_MIN_PIN E3_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E4DIAG_ - #define Z4_MIN_PIN E4_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E5DIAG_ - #define Z4_MIN_PIN E5_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E6DIAG_ - #define Z4_MIN_PIN E6_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E7DIAG_ - #define Z4_MIN_PIN E7_DIAG_PIN - #endif - #endif - #ifndef Z4_MAX_ENDSTOP_INVERTING - #define Z4_MAX_ENDSTOP_INVERTING false - #endif - #endif - #endif - -#endif // Z_MULTI_ENDSTOPS +// Is an endstop plug used for the Z2 endstop or the bed probe? +#define IS_Z2_OR_PROBE(A,M) ( \ + (ENABLED(Z_DUAL_ENDSTOPS) && Z2_USE_ENDSTOP == _##A##M##_) \ + || (ENABLED(Z_MIN_PROBE_ENDSTOP) && Z_MIN_PROBE_PIN == A##_##M##_PIN ) ) /** * Set ENDSTOPPULLUPS for active endstop switches @@ -1328,737 +719,209 @@ */ // Steppers -#if PIN_EXISTS(X_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X)) - #define HAS_X_ENABLE 1 -#endif -#if PIN_EXISTS(X_DIR) - #define HAS_X_DIR 1 -#endif -#if PIN_EXISTS(X_STEP) - #define HAS_X_STEP 1 -#endif -#if PIN_EXISTS(X_MS1) - #define HAS_X_MS_PINS 1 -#endif +#define HAS_X_ENABLE (PIN_EXISTS(X_ENABLE)) +#define HAS_X_DIR (PIN_EXISTS(X_DIR)) +#define HAS_X_STEP (PIN_EXISTS(X_STEP)) +#define HAS_X_MICROSTEPS (PIN_EXISTS(X_MS1)) -#if PIN_EXISTS(X2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X2)) - #define HAS_X2_ENABLE 1 -#endif -#if PIN_EXISTS(X2_DIR) - #define HAS_X2_DIR 1 -#endif -#if PIN_EXISTS(X2_STEP) - #define HAS_X2_STEP 1 -#endif -#if PIN_EXISTS(X2_MS1) - #define HAS_X2_MS_PINS 1 -#endif +#define HAS_X2_ENABLE (PIN_EXISTS(X2_ENABLE)) +#define HAS_X2_DIR (PIN_EXISTS(X2_DIR)) +#define HAS_X2_STEP (PIN_EXISTS(X2_STEP)) +#define HAS_X2_MICROSTEPS (PIN_EXISTS(X2_MS1)) -#if PIN_EXISTS(Y_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y)) - #define HAS_Y_ENABLE 1 -#endif -#if PIN_EXISTS(Y_DIR) - #define HAS_Y_DIR 1 -#endif -#if PIN_EXISTS(Y_STEP) - #define HAS_Y_STEP 1 -#endif -#if PIN_EXISTS(Y_MS1) - #define HAS_Y_MS_PINS 1 -#endif +#define HAS_Y_ENABLE (PIN_EXISTS(Y_ENABLE)) +#define HAS_Y_DIR (PIN_EXISTS(Y_DIR)) +#define HAS_Y_STEP (PIN_EXISTS(Y_STEP)) +#define HAS_Y_MICROSTEPS (PIN_EXISTS(Y_MS1)) -#if PIN_EXISTS(Y2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y2)) - #define HAS_Y2_ENABLE 1 -#endif -#if PIN_EXISTS(Y2_DIR) - #define HAS_Y2_DIR 1 -#endif -#if PIN_EXISTS(Y2_STEP) - #define HAS_Y2_STEP 1 -#endif -#if PIN_EXISTS(Y2_MS1) - #define HAS_Y2_MS_PINS 1 -#endif +#define HAS_Y2_ENABLE (PIN_EXISTS(Y2_ENABLE)) +#define HAS_Y2_DIR (PIN_EXISTS(Y2_DIR)) +#define HAS_Y2_STEP (PIN_EXISTS(Y2_STEP)) +#define HAS_Y2_MICROSTEPS (PIN_EXISTS(Y2_MS1)) -#if PIN_EXISTS(Z_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z)) - #define HAS_Z_ENABLE 1 -#endif -#if PIN_EXISTS(Z_DIR) - #define HAS_Z_DIR 1 -#endif -#if PIN_EXISTS(Z_STEP) - #define HAS_Z_STEP 1 -#endif -#if PIN_EXISTS(Z_MS1) - #define HAS_Z_MS_PINS 1 -#endif +#define HAS_Z_ENABLE (PIN_EXISTS(Z_ENABLE)) +#define HAS_Z_DIR (PIN_EXISTS(Z_DIR)) +#define HAS_Z_STEP (PIN_EXISTS(Z_STEP)) +#define HAS_Z_MICROSTEPS (PIN_EXISTS(Z_MS1)) -#if PIN_EXISTS(Z2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2)) - #define HAS_Z2_ENABLE 1 -#endif -#if PIN_EXISTS(Z2_DIR) - #define HAS_Z2_DIR 1 -#endif -#if PIN_EXISTS(Z2_STEP) - #define HAS_Z2_STEP 1 -#endif -#if PIN_EXISTS(Z2_MS1) - #define HAS_Z2_MS_PINS 1 -#endif - -#if PIN_EXISTS(Z3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z3)) - #define HAS_Z3_ENABLE 1 -#endif -#if PIN_EXISTS(Z3_DIR) - #define HAS_Z3_DIR 1 -#endif -#if PIN_EXISTS(Z3_STEP) - #define HAS_Z3_STEP 1 -#endif -#if PIN_EXISTS(Z3_MS1) - #define HAS_Z3_MS_PINS 1 -#endif - -#if PIN_EXISTS(Z4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z4)) - #define HAS_Z4_ENABLE 1 -#endif -#if PIN_EXISTS(Z4_DIR) - #define HAS_Z4_DIR 1 -#endif -#if PIN_EXISTS(Z4_STEP) - #define HAS_Z4_STEP 1 -#endif -#if PIN_EXISTS(Z4_MS1) - #define HAS_Z4_MS_PINS 1 -#endif +#define HAS_Z2_ENABLE (PIN_EXISTS(Z2_ENABLE)) +#define HAS_Z2_DIR (PIN_EXISTS(Z2_DIR)) +#define HAS_Z2_STEP (PIN_EXISTS(Z2_STEP)) +#define HAS_Z2_MICROSTEPS (PIN_EXISTS(Z2_MS1)) // Extruder steppers and solenoids -#if PIN_EXISTS(E0_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0)) - #define HAS_E0_ENABLE 1 -#endif -#if PIN_EXISTS(E0_DIR) - #define HAS_E0_DIR 1 -#endif -#if PIN_EXISTS(E0_STEP) - #define HAS_E0_STEP 1 -#endif -#if PIN_EXISTS(E0_MS1) - #define HAS_E0_MS_PINS 1 -#endif -#if PIN_EXISTS(SOL0) - #define HAS_SOLENOID_0 1 -#endif +#define HAS_E0_ENABLE (PIN_EXISTS(E0_ENABLE)) +#define HAS_E0_DIR (PIN_EXISTS(E0_DIR)) +#define HAS_E0_STEP (PIN_EXISTS(E0_STEP)) +#define HAS_E0_MICROSTEPS (PIN_EXISTS(E0_MS1)) +#define HAS_SOLENOID_0 (PIN_EXISTS(SOL0)) -#if PIN_EXISTS(E1_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)) - #define HAS_E1_ENABLE 1 -#endif -#if PIN_EXISTS(E1_DIR) - #define HAS_E1_DIR 1 -#endif -#if PIN_EXISTS(E1_STEP) - #define HAS_E1_STEP 1 -#endif -#if PIN_EXISTS(E1_MS1) - #define HAS_E1_MS_PINS 1 -#endif -#if PIN_EXISTS(SOL1) - #define HAS_SOLENOID_1 1 -#endif +#define HAS_E1_ENABLE (PIN_EXISTS(E1_ENABLE)) +#define HAS_E1_DIR (PIN_EXISTS(E1_DIR)) +#define HAS_E1_STEP (PIN_EXISTS(E1_STEP)) +#define HAS_E1_MICROSTEPS (PIN_EXISTS(E1_MS1)) +#define HAS_SOLENOID_1 (PIN_EXISTS(SOL1)) -#if PIN_EXISTS(E2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2)) - #define HAS_E2_ENABLE 1 -#endif -#if PIN_EXISTS(E2_DIR) - #define HAS_E2_DIR 1 -#endif -#if PIN_EXISTS(E2_STEP) - #define HAS_E2_STEP 1 -#endif -#if PIN_EXISTS(E2_MS1) - #define HAS_E2_MS_PINS 1 -#endif -#if PIN_EXISTS(SOL2) - #define HAS_SOLENOID_2 1 -#endif +#define HAS_E2_ENABLE (PIN_EXISTS(E2_ENABLE)) +#define HAS_E2_DIR (PIN_EXISTS(E2_DIR)) +#define HAS_E2_STEP (PIN_EXISTS(E2_STEP)) +#define HAS_E2_MICROSTEPS (PIN_EXISTS(E2_MS1)) +#define HAS_SOLENOID_2 (PIN_EXISTS(SOL2)) -#if PIN_EXISTS(E3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3)) - #define HAS_E3_ENABLE 1 -#endif -#if PIN_EXISTS(E3_DIR) - #define HAS_E3_DIR 1 -#endif -#if PIN_EXISTS(E3_STEP) - #define HAS_E3_STEP 1 -#endif -#if PIN_EXISTS(E3_MS1) - #define HAS_E3_MS_PINS 1 -#endif -#if PIN_EXISTS(SOL3) - #define HAS_SOLENOID_3 1 -#endif +#define HAS_E3_ENABLE (PIN_EXISTS(E3_ENABLE)) +#define HAS_E3_DIR (PIN_EXISTS(E3_DIR)) +#define HAS_E3_STEP (PIN_EXISTS(E3_STEP)) +#define HAS_E3_MICROSTEPS (PIN_EXISTS(E3_MS1)) +#define HAS_SOLENOID_3 (PIN_EXISTS(SOL3)) -#if PIN_EXISTS(E4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4)) - #define HAS_E4_ENABLE 1 -#endif -#if PIN_EXISTS(E4_DIR) - #define HAS_E4_DIR 1 -#endif -#if PIN_EXISTS(E4_STEP) - #define HAS_E4_STEP 1 -#endif -#if PIN_EXISTS(E4_MS1) - #define HAS_E4_MS_PINS 1 -#endif -#if PIN_EXISTS(SOL4) - #define HAS_SOLENOID_4 1 -#endif +#define HAS_E4_ENABLE (PIN_EXISTS(E4_ENABLE)) +#define HAS_E4_DIR (PIN_EXISTS(E4_DIR)) +#define HAS_E4_STEP (PIN_EXISTS(E4_STEP)) +#define HAS_E4_MICROSTEPS (PIN_EXISTS(E4_MS1)) +#define HAS_SOLENOID_4 (PIN_EXISTS(SOL4)) -#if PIN_EXISTS(E5_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5)) - #define HAS_E5_ENABLE 1 -#endif -#if PIN_EXISTS(E5_DIR) - #define HAS_E5_DIR 1 -#endif -#if PIN_EXISTS(E5_STEP) - #define HAS_E5_STEP 1 -#endif -#if PIN_EXISTS(E5_MS1) - #define HAS_E5_MS_PINS 1 -#endif -#if PIN_EXISTS(SOL5) - #define HAS_SOLENOID_5 1 -#endif - -#if PIN_EXISTS(E6_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E6)) - #define HAS_E6_ENABLE 1 -#endif -#if PIN_EXISTS(E6_DIR) - #define HAS_E6_DIR 1 -#endif -#if PIN_EXISTS(E6_STEP) - #define HAS_E6_STEP 1 -#endif -#if PIN_EXISTS(E6_MS1) - #define HAS_E6_MS_PINS 1 -#endif -#if PIN_EXISTS(SOL6) - #define HAS_SOLENOID_6 1 -#endif - -#if PIN_EXISTS(E7_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E7)) - #define HAS_E7_ENABLE 1 -#endif -#if PIN_EXISTS(E7_DIR) - #define HAS_E7_DIR 1 -#endif -#if PIN_EXISTS(E7_STEP) - #define HAS_E7_STEP 1 -#endif -#if PIN_EXISTS(E7_MS1) - #define HAS_E7_MS_PINS 1 -#endif -#if PIN_EXISTS(SOL7) - #define HAS_SOLENOID_7 1 -#endif - -// // Trinamic Stepper Drivers -// +#define HAS_STEALTHCHOP (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208)) +#define HAS_STALLGUARD HAS_DRIVER(TMC2130) +#define AXIS_HAS_STEALTHCHOP(ST) ( AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2208) ) +#define AXIS_HAS_STALLGUARD(ST) AXIS_DRIVER_TYPE(ST, TMC2130) -#if HAS_TRINAMIC_CONFIG - #if ANY(STEALTHCHOP_XY, STEALTHCHOP_Z, STEALTHCHOP_E) - #define STEALTHCHOP_ENABLED 1 - #endif - #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) - #define USE_SENSORLESS 1 - #endif +#if ENABLED(SENSORLESS_HOMING) // Disable Z axis sensorless homing if a probe is used to home the Z axis #if HOMING_Z_WITH_PROBE - #undef Z_STALL_SENSITIVITY - #undef Z2_STALL_SENSITIVITY - #undef Z3_STALL_SENSITIVITY - #undef Z4_STALL_SENSITIVITY - #endif - #if defined(X_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X) - #define X_SENSORLESS 1 - #endif - #if defined(X2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2) - #define X2_SENSORLESS 1 - #endif - #if defined(Y_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y) - #define Y_SENSORLESS 1 - #endif - #if defined(Y2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2) - #define Y2_SENSORLESS 1 - #endif - #if defined(Z_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z) - #define Z_SENSORLESS 1 - #endif - #if defined(Z2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2) - #define Z2_SENSORLESS 1 - #endif - #if defined(Z3_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3) - #define Z3_SENSORLESS 1 - #endif - #if defined(Z4_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z4) - #define Z4_SENSORLESS 1 - #endif - #if ENABLED(SPI_ENDSTOPS) - #define X_SPI_SENSORLESS X_SENSORLESS - #define Y_SPI_SENSORLESS Y_SENSORLESS - #define Z_SPI_SENSORLESS Z_SENSORLESS + #undef Z_HOMING_SENSITIVITY #endif + #define X_SENSORLESS (AXIS_HAS_STALLGUARD(X) && defined(X_HOMING_SENSITIVITY)) + #define Y_SENSORLESS (AXIS_HAS_STALLGUARD(Y) && defined(Y_HOMING_SENSITIVITY)) + #define Z_SENSORLESS (AXIS_HAS_STALLGUARD(Z) && defined(Z_HOMING_SENSITIVITY)) #endif -#if (HAS_E_DRIVER(TMC2660) \ - || ( E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != X_ENABLE_PIN \ - && E0_ENABLE_PIN != Y_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN ) ) - #define HAS_E_STEPPER_ENABLE 1 -#endif - -#if ANY_AXIS_HAS(HW_SERIAL) - #define HAS_TMC_HW_SERIAL 1 -#endif -#if ANY_AXIS_HAS(SW_SERIAL) - #define HAS_TMC_SW_SERIAL 1 -#endif - -// // Endstops and bed probe -// +#define HAS_STOP_TEST(A,M) (PIN_EXISTS(A##_##M) && !IS_X2_ENDSTOP(A,M) && !IS_Y2_ENDSTOP(A,M) && !IS_Z2_OR_PROBE(A,M)) +#define HAS_X_MIN HAS_STOP_TEST(X,MIN) +#define HAS_X_MAX HAS_STOP_TEST(X,MAX) +#define HAS_Y_MIN HAS_STOP_TEST(Y,MIN) +#define HAS_Y_MAX HAS_STOP_TEST(Y,MAX) +#define HAS_Z_MIN HAS_STOP_TEST(Z,MIN) +#define HAS_Z_MAX HAS_STOP_TEST(Z,MAX) +#define HAS_X2_MIN (PIN_EXISTS(X2_MIN)) +#define HAS_X2_MAX (PIN_EXISTS(X2_MAX)) +#define HAS_Y2_MIN (PIN_EXISTS(Y2_MIN)) +#define HAS_Y2_MAX (PIN_EXISTS(Y2_MAX)) +#define HAS_Z2_MIN (PIN_EXISTS(Z2_MIN)) +#define HAS_Z2_MAX (PIN_EXISTS(Z2_MAX)) +#define HAS_Z_MIN_PROBE_PIN (PIN_EXISTS(Z_MIN_PROBE)) -// Is an endstop plug used for extra Z endstops or the probe? -#define IS_PROBE_PIN(A,M) (HAS_CUSTOM_PROBE_PIN && Z_MIN_PROBE_PIN == A##_##M##_PIN) -#define IS_X2_ENDSTOP(A,M) (ENABLED(X_DUAL_ENDSTOPS) && X2_USE_ENDSTOP == _##A##M##_) -#define IS_Y2_ENDSTOP(A,M) (ENABLED(Y_DUAL_ENDSTOPS) && Y2_USE_ENDSTOP == _##A##M##_) -#define IS_Z2_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && Z2_USE_ENDSTOP == _##A##M##_) -#define IS_Z3_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 && Z3_USE_ENDSTOP == _##A##M##_) -#define IS_Z4_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 && Z4_USE_ENDSTOP == _##A##M##_) - -#define _HAS_STOP(A,M) (PIN_EXISTS(A##_##M) && !IS_PROBE_PIN(A,M) && !IS_X2_ENDSTOP(A,M) && !IS_Y2_ENDSTOP(A,M) && !IS_Z2_ENDSTOP(A,M) && !IS_Z3_ENDSTOP(A,M) && !IS_Z4_ENDSTOP(A,M)) -#if _HAS_STOP(X,MIN) - #define HAS_X_MIN 1 -#endif -#if _HAS_STOP(X,MAX) - #define HAS_X_MAX 1 -#endif -#if _HAS_STOP(Y,MIN) - #define HAS_Y_MIN 1 -#endif -#if _HAS_STOP(Y,MAX) - #define HAS_Y_MAX 1 -#endif -#if _HAS_STOP(Z,MIN) - #define HAS_Z_MIN 1 -#endif -#if _HAS_STOP(Z,MAX) - #define HAS_Z_MAX 1 -#endif -#if _HAS_STOP(X,STOP) - #define HAS_X_STOP 1 -#endif -#if _HAS_STOP(Y,STOP) - #define HAS_Y_STOP 1 -#endif -#if _HAS_STOP(Z,STOP) - #define HAS_Z_STOP 1 -#endif -#if PIN_EXISTS(X2_MIN) - #define HAS_X2_MIN 1 -#endif -#if PIN_EXISTS(X2_MAX) - #define HAS_X2_MAX 1 -#endif -#if PIN_EXISTS(Y2_MIN) - #define HAS_Y2_MIN 1 -#endif -#if PIN_EXISTS(Y2_MAX) - #define HAS_Y2_MAX 1 -#endif -#if PIN_EXISTS(Z2_MIN) - #define HAS_Z2_MIN 1 -#endif -#if PIN_EXISTS(Z2_MAX) - #define HAS_Z2_MAX 1 -#endif -#if PIN_EXISTS(Z3_MIN) - #define HAS_Z3_MIN 1 -#endif -#if PIN_EXISTS(Z3_MAX) - #define HAS_Z3_MAX 1 -#endif -#if PIN_EXISTS(Z4_MIN) - #define HAS_Z4_MIN 1 -#endif -#if PIN_EXISTS(Z4_MAX) - #define HAS_Z4_MAX 1 -#endif -#if HAS_CUSTOM_PROBE_PIN && PIN_EXISTS(Z_MIN_PROBE) - #define HAS_Z_MIN_PROBE_PIN 1 -#endif - -// // ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface) -// #define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && DISABLED(HEATER_##P##_USES_MAX6675)) -#if HAS_ADC_TEST(0) - #define HAS_TEMP_ADC_0 1 -#endif -#if HAS_ADC_TEST(1) - #define HAS_TEMP_ADC_1 1 -#endif -#if HAS_ADC_TEST(2) - #define HAS_TEMP_ADC_2 1 -#endif -#if HAS_ADC_TEST(3) - #define HAS_TEMP_ADC_3 1 -#endif -#if HAS_ADC_TEST(4) - #define HAS_TEMP_ADC_4 1 -#endif -#if HAS_ADC_TEST(5) - #define HAS_TEMP_ADC_5 1 -#endif -#if HAS_ADC_TEST(6) - #define HAS_TEMP_ADC_6 1 -#endif -#if HAS_ADC_TEST(7) - #define HAS_TEMP_ADC_7 1 -#endif -#if HAS_ADC_TEST(BED) - #define HAS_TEMP_ADC_BED 1 -#endif -#if HAS_ADC_TEST(PROBE) - #define HAS_TEMP_ADC_PROBE 1 -#endif -#if HAS_ADC_TEST(CHAMBER) - #define HAS_TEMP_ADC_CHAMBER 1 -#endif +#define HAS_TEMP_ADC_0 HAS_ADC_TEST(0) +#define HAS_TEMP_ADC_1 HAS_ADC_TEST(1) +#define HAS_TEMP_ADC_2 HAS_ADC_TEST(2) +#define HAS_TEMP_ADC_3 HAS_ADC_TEST(3) +#define HAS_TEMP_ADC_4 HAS_ADC_TEST(4) +#define HAS_TEMP_ADC_BED HAS_ADC_TEST(BED) +#define HAS_TEMP_ADC_CHAMBER HAS_ADC_TEST(CHAMBER) -#if HAS_HOTEND && EITHER(HAS_TEMP_ADC_0, HEATER_0_USES_MAX6675) - #define HAS_TEMP_HOTEND 1 -#endif -#define HAS_TEMP_BED HAS_TEMP_ADC_BED -#define HAS_TEMP_PROBE HAS_TEMP_ADC_PROBE -#define HAS_TEMP_CHAMBER HAS_TEMP_ADC_CHAMBER - -#if ENABLED(JOYSTICK) - #if PIN_EXISTS(JOY_X) - #define HAS_JOY_ADC_X 1 - #endif - #if PIN_EXISTS(JOY_Y) - #define HAS_JOY_ADC_Y 1 - #endif - #if PIN_EXISTS(JOY_Z) - #define HAS_JOY_ADC_Z 1 - #endif - #if PIN_EXISTS(JOY_EN) - #define HAS_JOY_ADC_EN 1 - #endif -#endif +#define HAS_TEMP_HOTEND (HAS_TEMP_ADC_0 || ENABLED(HEATER_0_USES_MAX6675)) +#define HAS_TEMP_BED HAS_TEMP_ADC_BED +#define HAS_TEMP_CHAMBER HAS_TEMP_ADC_CHAMBER // Heaters -#if PIN_EXISTS(HEATER_0) - #define HAS_HEATER_0 1 -#endif -#if PIN_EXISTS(HEATER_1) - #define HAS_HEATER_1 1 -#endif -#if PIN_EXISTS(HEATER_2) - #define HAS_HEATER_2 1 -#endif -#if PIN_EXISTS(HEATER_3) - #define HAS_HEATER_3 1 -#endif -#if PIN_EXISTS(HEATER_4) - #define HAS_HEATER_4 1 -#endif -#if PIN_EXISTS(HEATER_5) - #define HAS_HEATER_5 1 -#endif -#if PIN_EXISTS(HEATER_6) - #define HAS_HEATER_6 1 -#endif -#if PIN_EXISTS(HEATER_7) - #define HAS_HEATER_7 1 -#endif -#if PIN_EXISTS(HEATER_BED) - #define HAS_HEATER_BED 1 -#endif +#define HAS_HEATER_0 (PIN_EXISTS(HEATER_0)) +#define HAS_HEATER_1 (PIN_EXISTS(HEATER_1)) +#define HAS_HEATER_2 (PIN_EXISTS(HEATER_2)) +#define HAS_HEATER_3 (PIN_EXISTS(HEATER_3)) +#define HAS_HEATER_4 (PIN_EXISTS(HEATER_4)) +#define HAS_HEATER_BED (PIN_EXISTS(HEATER_BED)) // Shorthand for common combinations -#if HAS_TEMP_BED && HAS_HEATER_BED - #define HAS_HEATED_BED 1 - #ifndef BED_OVERSHOOT - #define BED_OVERSHOOT 10 - #endif - #define BED_MAX_TARGET (BED_MAXTEMP - (BED_OVERSHOOT)) -#endif -#if HAS_HEATED_BED || HAS_TEMP_CHAMBER - #define BED_OR_CHAMBER 1 -#endif -#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE - #define HAS_TEMP_SENSOR 1 -#endif -#if HAS_TEMP_CHAMBER && PIN_EXISTS(HEATER_CHAMBER) - #define HAS_HEATED_CHAMBER 1 -#endif +#define HAS_HEATED_BED (HAS_TEMP_BED && HAS_HEATER_BED) +#define HAS_TEMP_SENSOR (HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_TEMP_CHAMBER) // PID heating #if !HAS_HEATED_BED #undef PIDTEMPBED #endif -#if EITHER(PIDTEMP, PIDTEMPBED) - #define HAS_PID_HEATING 1 -#endif -#if BOTH(PIDTEMP, PIDTEMPBED) - #define HAS_PID_FOR_BOTH 1 -#endif +#define HAS_PID_HEATING (ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED)) +#define HAS_PID_FOR_BOTH (ENABLED(PIDTEMP) && ENABLED(PIDTEMPBED)) // Thermal protection -#if BOTH(HAS_HEATED_BED, THERMAL_PROTECTION_BED) - #define HAS_THERMALLY_PROTECTED_BED 1 -#endif -#if ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0 - #define WATCH_HOTENDS 1 -#endif -#if HAS_THERMALLY_PROTECTED_BED && WATCH_BED_TEMP_PERIOD > 0 - #define WATCH_BED 1 -#endif -#if BOTH(HAS_HEATED_CHAMBER, THERMAL_PROTECTION_CHAMBER) && WATCH_CHAMBER_TEMP_PERIOD > 0 - #define WATCH_CHAMBER 1 -#endif -#if (ENABLED(THERMAL_PROTECTION_HOTENDS) || !EXTRUDERS) \ - && (ENABLED(THERMAL_PROTECTION_BED) || !HAS_HEATED_BED) \ - && (ENABLED(THERMAL_PROTECTION_CHAMBER) || !HAS_HEATED_CHAMBER) - #define THERMALLY_SAFE 1 -#endif +#define HAS_THERMALLY_PROTECTED_BED (HAS_HEATED_BED && ENABLED(THERMAL_PROTECTION_BED)) +#define WATCH_HOTENDS (ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0) +#define WATCH_THE_BED (HAS_THERMALLY_PROTECTED_BED && WATCH_BED_TEMP_PERIOD > 0) // Auto fans -#if HAS_HOTEND && PIN_EXISTS(E0_AUTO_FAN) - #define HAS_AUTO_FAN_0 1 -#endif -#if HAS_MULTI_HOTEND && PIN_EXISTS(E1_AUTO_FAN) - #define HAS_AUTO_FAN_1 1 -#endif -#if HOTENDS > 2 && PIN_EXISTS(E2_AUTO_FAN) - #define HAS_AUTO_FAN_2 1 -#endif -#if HOTENDS > 3 && PIN_EXISTS(E3_AUTO_FAN) - #define HAS_AUTO_FAN_3 1 -#endif -#if HOTENDS > 4 && PIN_EXISTS(E4_AUTO_FAN) - #define HAS_AUTO_FAN_4 1 -#endif -#if HOTENDS > 5 && PIN_EXISTS(E5_AUTO_FAN) - #define HAS_AUTO_FAN_5 1 -#endif -#if HOTENDS > 6 && PIN_EXISTS(E6_AUTO_FAN) - #define HAS_AUTO_FAN_6 1 -#endif -#if HOTENDS > 7 && PIN_EXISTS(E7_AUTO_FAN) - #define HAS_AUTO_FAN_7 1 -#endif -#if HAS_TEMP_CHAMBER && PIN_EXISTS(CHAMBER_AUTO_FAN) - #define HAS_AUTO_CHAMBER_FAN 1 +#define HAS_AUTO_FAN_0 (PIN_EXISTS(E0_AUTO_FAN)) +#define HAS_AUTO_FAN_1 (HOTENDS > 1 && PIN_EXISTS(E1_AUTO_FAN)) +#define HAS_AUTO_FAN_2 (HOTENDS > 2 && PIN_EXISTS(E2_AUTO_FAN)) +#define HAS_AUTO_FAN_3 (HOTENDS > 3 && PIN_EXISTS(E3_AUTO_FAN)) +#define HAS_AUTO_FAN_4 (HOTENDS > 4 && PIN_EXISTS(E4_AUTO_FAN)) +#define HAS_AUTO_CHAMBER_FAN (PIN_EXISTS(CHAMBER_AUTO_FAN)) +#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_CHAMBER_FAN) +#define AUTO_1_IS_0 (E1_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_2_IS_0 (E2_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_2_IS_1 (E2_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) +#define AUTO_3_IS_0 (E3_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_3_IS_1 (E3_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) +#define AUTO_3_IS_2 (E3_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) +#define AUTO_4_IS_0 (E4_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_4_IS_1 (E4_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) +#define AUTO_4_IS_2 (E4_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) +#define AUTO_4_IS_3 (E4_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_0 (CHAMBER_AUTO_FAN_PIN == E0_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_1 (CHAMBER_AUTO_FAN_PIN == E1_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_2 (CHAMBER_AUTO_FAN_PIN == E2_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_3 (CHAMBER_AUTO_FAN_PIN == E3_AUTO_FAN_PIN) +#define AUTO_CHAMBER_IS_4 (CHAMBER_AUTO_FAN_PIN == E4_AUTO_FAN_PIN) + +// Other fans +#define HAS_FAN0 (PIN_EXISTS(FAN)) +#define HAS_FAN1 (PIN_EXISTS(FAN1) && CONTROLLER_FAN_PIN != FAN1_PIN && E0_AUTO_FAN_PIN != FAN1_PIN && E1_AUTO_FAN_PIN != FAN1_PIN && E2_AUTO_FAN_PIN != FAN1_PIN && E3_AUTO_FAN_PIN != FAN1_PIN) +#define HAS_FAN2 (PIN_EXISTS(FAN2) && CONTROLLER_FAN_PIN != FAN2_PIN && E0_AUTO_FAN_PIN != FAN2_PIN && E1_AUTO_FAN_PIN != FAN2_PIN && E2_AUTO_FAN_PIN != FAN2_PIN && E3_AUTO_FAN_PIN != FAN2_PIN) +#define HAS_CONTROLLER_FAN (PIN_EXISTS(CONTROLLER_FAN)) + +// Servos +#define HAS_SERVO_0 (PIN_EXISTS(SERVO0)) +#define HAS_SERVO_1 (PIN_EXISTS(SERVO1)) +#define HAS_SERVO_2 (PIN_EXISTS(SERVO2)) +#define HAS_SERVO_3 (PIN_EXISTS(SERVO3)) +#define HAS_SERVOS (defined(NUM_SERVOS) && NUM_SERVOS > 0) + +#if HAS_SERVOS && !defined(Z_PROBE_SERVO_NR) + #define Z_PROBE_SERVO_NR -1 #endif -#if ANY(HAS_AUTO_FAN_0, HAS_AUTO_FAN_1, HAS_AUTO_FAN_2, HAS_AUTO_FAN_3, HAS_AUTO_FAN_4, HAS_AUTO_FAN_5, HAS_AUTO_FAN_6, HAS_AUTO_FAN_7, HAS_AUTO_CHAMBER_FAN) - #define HAS_AUTO_FAN 1 -#endif -#define _FANOVERLAP(A,B) (A##_AUTO_FAN_PIN == E##B##_AUTO_FAN_PIN) -#if HAS_AUTO_FAN && (_FANOVERLAP(CHAMBER,0) || _FANOVERLAP(CHAMBER,1) || _FANOVERLAP(CHAMBER,2) || _FANOVERLAP(CHAMBER,3) || _FANOVERLAP(CHAMBER,4) || _FANOVERLAP(CHAMBER,5) || _FANOVERLAP(CHAMBER,6) || _FANOVERLAP(CHAMBER,7)) - #define AUTO_CHAMBER_IS_E 1 -#endif +// Sensors +#define HAS_FILAMENT_WIDTH_SENSOR (PIN_EXISTS(FILWIDTH)) + +// User Interface +#define HAS_HOME (PIN_EXISTS(HOME)) +#define HAS_KILL (PIN_EXISTS(KILL)) +#define HAS_SUICIDE (PIN_EXISTS(SUICIDE)) +#define HAS_PHOTOGRAPH (PIN_EXISTS(PHOTOGRAPH)) +#define HAS_BUZZER (PIN_EXISTS(BEEPER) || ENABLED(LCD_USE_I2C_BUZZER)) +#define HAS_CASE_LIGHT (PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE)) + +// Digital control +#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS) +#define HAS_STEPPER_RESET (PIN_EXISTS(STEPPER_RESET)) +#define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS)) +#define HAS_MOTOR_CURRENT_PWM (PIN_EXISTS(MOTOR_CURRENT_PWM_XY) || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) || PIN_EXISTS(MOTOR_CURRENT_PWM_E)) #if !HAS_TEMP_SENSOR #undef AUTO_REPORT_TEMPERATURES #endif -#if EITHER(AUTO_REPORT_TEMPERATURES, AUTO_REPORT_SD_STATUS) - #define HAS_AUTO_REPORTING 1 -#endif -#if !HAS_AUTO_CHAMBER_FAN || AUTO_CHAMBER_IS_E - #undef AUTO_POWER_CHAMBER_FAN -#endif +#define HAS_AUTO_REPORTING (ENABLED(AUTO_REPORT_TEMPERATURES) || ENABLED(AUTO_REPORT_SD_STATUS)) -// Print Cooling fans (limit) -#ifdef NUM_M106_FANS - #define MAX_FANS NUM_M106_FANS -#else - #define MAX_FANS 8 // Max supported fans +/** + * This setting is also used by M109 when trying to calculate + * a ballpark safe margin to prevent wait-forever situation. + */ +#ifndef EXTRUDE_MINTEMP + #define EXTRUDE_MINTEMP 170 #endif -#define _NOT_E_AUTO(N,F) (E##N##_AUTO_FAN_PIN != FAN##F##_PIN) -#define _HAS_FAN(F) (PIN_EXISTS(FAN##F) \ - && CONTROLLER_FAN_PIN != FAN##F##_PIN \ - && _NOT_E_AUTO(0,F) \ - && _NOT_E_AUTO(1,F) \ - && _NOT_E_AUTO(2,F) \ - && _NOT_E_AUTO(3,F) \ - && _NOT_E_AUTO(4,F) \ - && _NOT_E_AUTO(5,F) \ - && _NOT_E_AUTO(6,F) \ - && _NOT_E_AUTO(7,F) \ - && F < MAX_FANS) -#if PIN_EXISTS(FAN) - #define HAS_FAN0 1 -#endif -#if _HAS_FAN(1) - #define HAS_FAN1 1 -#endif -#if _HAS_FAN(2) - #define HAS_FAN2 1 -#endif -#if _HAS_FAN(3) - #define HAS_FAN3 1 -#endif -#if _HAS_FAN(4) - #define HAS_FAN4 1 -#endif -#if _HAS_FAN(5) - #define HAS_FAN5 1 -#endif -#if _HAS_FAN(6) - #define HAS_FAN6 1 -#endif -#if _HAS_FAN(7) - #define HAS_FAN7 1 -#endif -#undef _NOT_E_AUTO -#undef _HAS_FAN -#if PIN_EXISTS(CONTROLLER_FAN) - #define HAS_CONTROLLER_FAN 1 -#endif - -#if BED_OR_CHAMBER || HAS_FAN0 - #define BED_OR_CHAMBER_OR_FAN 1 -#endif - -// Servos -#if PIN_EXISTS(SERVO0) && NUM_SERVOS > 0 - #define HAS_SERVO_0 1 -#endif -#if PIN_EXISTS(SERVO1) && NUM_SERVOS > 1 - #define HAS_SERVO_1 1 -#endif -#if PIN_EXISTS(SERVO2) && NUM_SERVOS > 2 - #define HAS_SERVO_2 1 -#endif -#if PIN_EXISTS(SERVO3) && NUM_SERVOS > 3 - #define HAS_SERVO_3 1 -#endif -#if NUM_SERVOS > 0 - #define HAS_SERVOS 1 -#endif - -// Sensors -#if PIN_EXISTS(FILWIDTH) - #define HAS_FILAMENT_WIDTH_SENSOR 1 -#endif - -// User Interface -#if PIN_EXISTS(HOME) - #define HAS_HOME 1 -#endif -#if PIN_EXISTS(KILL) - #define HAS_KILL 1 -#endif -#if PIN_EXISTS(SUICIDE) - #define HAS_SUICIDE 1 -#endif -#if PIN_EXISTS(PHOTOGRAPH) - #define HAS_PHOTOGRAPH 1 -#endif - -// Digital control -#if PIN_EXISTS(STEPPER_RESET) - #define HAS_STEPPER_RESET 1 -#endif -#if PIN_EXISTS(DIGIPOTSS) - #define HAS_MOTOR_CURRENT_SPI 1 -#endif -#if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_E) - #define HAS_MOTOR_CURRENT_PWM 1 -#endif - -#if ANY(HAS_Z_MS_PINS, HAS_Z2_MS_PINS, HAS_Z3_MS_PINS, HAS_Z4_MS_PINS) - #define HAS_SOME_Z_MS_PINS 1 -#endif -#if ANY(HAS_E0_MS_PINS, HAS_E1_MS_PINS, HAS_E2_MS_PINS, HAS_E3_MS_PINS, HAS_E4_MS_PINS, HAS_E5_MS_PINS, HAS_E6_MS_PINS, HAS_E7_MS_PINS) - #define HAS_SOME_E_MS_PINS 1 -#endif -#if ANY(HAS_X_MS_PINS, HAS_X2_MS_PINS, HAS_Y_MS_PINS, HAS_Y2_MS_PINS, HAS_SOME_Z_MS_PINS, HAS_SOME_E_MS_PINS) - #define HAS_MICROSTEPS 1 -#endif - -#if HAS_MICROSTEPS - - // MS1 MS2 MS3 Stepper Driver Microstepping mode table - #ifndef MICROSTEP1 - #define MICROSTEP1 LOW,LOW,LOW - #endif - #if ENABLED(HEROIC_STEPPER_DRIVERS) - #ifndef MICROSTEP128 - #define MICROSTEP128 LOW,HIGH,LOW - #endif - #else - #ifndef MICROSTEP2 - #define MICROSTEP2 HIGH,LOW,LOW - #endif - #ifndef MICROSTEP4 - #define MICROSTEP4 LOW,HIGH,LOW - #endif - #endif - #ifndef MICROSTEP8 - #define MICROSTEP8 HIGH,HIGH,LOW - #endif - #ifdef __SAM3X8E__ - #if MB(ALLIGATOR) - #ifndef MICROSTEP16 - #define MICROSTEP16 LOW,LOW,LOW - #endif - #ifndef MICROSTEP32 - #define MICROSTEP32 HIGH,HIGH,LOW - #endif - #else - #ifndef MICROSTEP16 - #define MICROSTEP16 HIGH,HIGH,LOW - #endif - #endif - #else - #ifndef MICROSTEP16 - #define MICROSTEP16 HIGH,HIGH,LOW - #endif - #endif - - #ifdef MICROSTEP1 - #define HAS_MICROSTEP1 1 - #endif - #ifdef MICROSTEP2 - #define HAS_MICROSTEP2 1 - #endif - #ifdef MICROSTEP4 - #define HAS_MICROSTEP4 1 - #endif - #ifdef MICROSTEP8 - #define HAS_MICROSTEP8 1 - #endif - #ifdef MICROSTEP16 - #define HAS_MICROSTEP16 1 - #endif - #ifdef MICROSTEP32 - #define HAS_MICROSTEP32 1 - #endif - #ifdef MICROSTEP64 - #define HAS_MICROSTEP64 1 - #endif - #ifdef MICROSTEP128 - #define HAS_MICROSTEP128 1 - #endif - -#endif // HAS_MICROSTEPS - /** * Heater signal inversion defaults */ @@ -2066,34 +929,29 @@ #if HAS_HEATER_0 && !defined(HEATER_0_INVERTING) #define HEATER_0_INVERTING false #endif + #if HAS_HEATER_1 && !defined(HEATER_1_INVERTING) #define HEATER_1_INVERTING false #endif + #if HAS_HEATER_2 && !defined(HEATER_2_INVERTING) #define HEATER_2_INVERTING false #endif + #if HAS_HEATER_3 && !defined(HEATER_3_INVERTING) #define HEATER_3_INVERTING false #endif + #if HAS_HEATER_4 && !defined(HEATER_4_INVERTING) #define HEATER_4_INVERTING false #endif -#if HAS_HEATER_5 && !defined(HEATER_5_INVERTING) - #define HEATER_5_INVERTING false -#endif -#if HAS_HEATER_6 && !defined(HEATER_6_INVERTING) - #define HEATER_6_INVERTING false -#endif -#if HAS_HEATER_7 && !defined(HEATER_7_INVERTING) - #define HEATER_7_INVERTING false -#endif /** * Helper Macros for heaters and extruder fan */ #define WRITE_HEATER_0P(v) WRITE(HEATER_0_PIN, (v) ^ HEATER_0_INVERTING) -#if EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) +#if HOTENDS > 1 || ENABLED(HEATERS_PARALLEL) #define WRITE_HEATER_1(v) WRITE(HEATER_1_PIN, (v) ^ HEATER_1_INVERTING) #if HOTENDS > 2 #define WRITE_HEATER_2(v) WRITE(HEATER_2_PIN, (v) ^ HEATER_2_INVERTING) @@ -2101,36 +959,20 @@ #define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, (v) ^ HEATER_3_INVERTING) #if HOTENDS > 4 #define WRITE_HEATER_4(v) WRITE(HEATER_4_PIN, (v) ^ HEATER_4_INVERTING) - #if HOTENDS > 5 - #define WRITE_HEATER_5(v) WRITE(HEATER_5_PIN, (v) ^ HEATER_5_INVERTING) - #if HOTENDS > 6 - #define WRITE_HEATER_6(v) WRITE(HEATER_6_PIN, (v) ^ HEATER_6_INVERTING) - #if HOTENDS > 7 - #define WRITE_HEATER_7(v) WRITE(HEATER_7_PIN, (v) ^ HEATER_7_INVERTING) - #endif // HOTENDS > 7 - #endif // HOTENDS > 6 - #endif // HOTENDS > 5 #endif // HOTENDS > 4 #endif // HOTENDS > 3 #endif // HOTENDS > 2 -#endif // HAS_MULTI_HOTEND || HEATERS_PARALLEL +#endif // HOTENDS > 1 #if ENABLED(HEATERS_PARALLEL) #define WRITE_HEATER_0(v) { WRITE_HEATER_0P(v); WRITE_HEATER_1(v); } #else #define WRITE_HEATER_0(v) WRITE_HEATER_0P(v) #endif -#ifndef MIN_POWER - #define MIN_POWER 0 -#endif - /** * Heated bed requires settings */ #if HAS_HEATED_BED - #ifndef MIN_BED_POWER - #define MIN_BED_POWER 0 - #endif #ifndef MAX_BED_POWER #define MAX_BED_POWER 255 #endif @@ -2140,55 +982,10 @@ #define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, (v) ^ HEATER_BED_INVERTING) #endif -/** - * Heated chamber requires settings - */ -#if HAS_HEATED_CHAMBER - #ifndef MAX_CHAMBER_POWER - #define MAX_CHAMBER_POWER 255 - #endif - #ifndef HEATER_CHAMBER_INVERTING - #define HEATER_CHAMBER_INVERTING false - #endif - #define WRITE_HEATER_CHAMBER(v) WRITE(HEATER_CHAMBER_PIN, (v) ^ HEATER_CHAMBER_INVERTING) -#endif - -#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER - #define HAS_TEMPERATURE 1 -#endif - -#if HAS_TEMPERATURE && EITHER(HAS_LCD_MENU, DWIN_CREALITY_LCD) - #ifdef PREHEAT_5_LABEL - #define PREHEAT_COUNT 5 - #elif defined(PREHEAT_4_LABEL) - #define PREHEAT_COUNT 4 - #elif defined(PREHEAT_3_LABEL) - #define PREHEAT_COUNT 3 - #elif defined(PREHEAT_2_LABEL) - #define PREHEAT_COUNT 2 - #elif defined(PREHEAT_1_LABEL) - #define PREHEAT_COUNT 1 - #endif -#endif - /** * Up to 3 PWM fans */ -#ifndef FAN_INVERTING - #define FAN_INVERTING false -#endif - -#if HAS_FAN7 - #define FAN_COUNT 8 -#elif HAS_FAN6 - #define FAN_COUNT 7 -#elif HAS_FAN5 - #define FAN_COUNT 6 -#elif HAS_FAN4 - #define FAN_COUNT 5 -#elif HAS_FAN3 - #define FAN_COUNT 4 -#elif HAS_FAN2 +#if HAS_FAN2 #define FAN_COUNT 3 #elif HAS_FAN1 #define FAN_COUNT 2 @@ -2198,30 +995,28 @@ #define FAN_COUNT 0 #endif -#if FAN_COUNT > 0 - #define HAS_FAN 1 - #define WRITE_FAN(n, v) WRITE(FAN##n##_PIN, (v) ^ FAN_INVERTING) +#if HAS_FAN0 + #define WRITE_FAN(v) WRITE(FAN_PIN, v) + #define WRITE_FAN0(v) WRITE_FAN(v) #endif +#if HAS_FAN1 + #define WRITE_FAN1(v) WRITE(FAN1_PIN, v) +#endif +#if HAS_FAN2 + #define WRITE_FAN2(v) WRITE(FAN2_PIN, v) +#endif +#define WRITE_FAN_N(n, v) WRITE_FAN##n(v) /** * Part Cooling fan multipliexer */ -#if PIN_EXISTS(FANMUX0) - #define HAS_FANMUX 1 -#endif +#define HAS_FANMUX PIN_EXISTS(FANMUX0) /** * MIN/MAX fan PWM scaling */ -#ifndef FAN_OFF_PWM - #define FAN_OFF_PWM 0 -#endif #ifndef FAN_MIN_PWM - #if FAN_OFF_PWM > 0 - #define FAN_MIN_PWM (FAN_OFF_PWM + 1) - #else - #define FAN_MIN_PWM 0 - #endif + #define FAN_MIN_PWM 0 #endif #ifndef FAN_MAX_PWM #define FAN_MAX_PWM 255 @@ -2232,33 +1027,13 @@ #error "FAN_MAX_PWM must be a value from 0 to 255." #elif FAN_MIN_PWM > FAN_MAX_PWM #error "FAN_MIN_PWM must be less than or equal to FAN_MAX_PWM." -#elif FAN_OFF_PWM > FAN_MIN_PWM - #error "FAN_OFF_PWM must be less than or equal to FAN_MIN_PWM." -#endif - -/** - * FAST PWM FAN Settings - */ -#if ENABLED(FAST_PWM_FAN) && !defined(FAST_PWM_FAN_FREQUENCY) - #define FAST_PWM_FAN_FREQUENCY ((F_CPU) / (2 * 255 * 1)) // Fan frequency default -#endif - -/** - * MIN/MAX case light PWM scaling - */ -#if ENABLED(CASE_LIGHT_ENABLE) - #ifndef CASE_LIGHT_MAX_PWM - #define CASE_LIGHT_MAX_PWM 255 - #elif !WITHIN(CASE_LIGHT_MAX_PWM, 1, 255) - #error "CASE_LIGHT_MAX_PWM must be a value from 1 to 255." - #endif #endif /** * Bed Probe dependencies */ #if HAS_BED_PROBE - #if BOTH(ENDSTOPPULLUPS, HAS_Z_MIN_PROBE_PIN) + #if ENABLED(ENDSTOPPULLUPS) && HAS_Z_MIN_PROBE_PIN #define ENDSTOPPULLUP_ZMIN_PROBE #endif #ifndef Z_PROBE_OFFSET_RANGE_MIN @@ -2274,11 +1049,13 @@ #define XY_PROBE_SPEED 4000 #endif #endif - #ifndef NOZZLE_TO_PROBE_OFFSET - #define NOZZLE_TO_PROBE_OFFSET { 0, 0, 0 } - #endif #else - #undef NOZZLE_TO_PROBE_OFFSET + #undef X_PROBE_OFFSET_FROM_EXTRUDER + #undef Y_PROBE_OFFSET_FROM_EXTRUDER + #undef Z_PROBE_OFFSET_FROM_EXTRUDER + #define X_PROBE_OFFSET_FROM_EXTRUDER 0 + #define Y_PROBE_OFFSET_FROM_EXTRUDER 0 + #define Z_PROBE_OFFSET_FROM_EXTRUDER 0 #endif /** @@ -2293,55 +1070,70 @@ #define _SKEW_FACTOR(a,b,c) _SKEW_SIDE(float(a),_GET_SIDE(float(a),float(b),float(c)),float(c)) #ifndef XY_SKEW_FACTOR - #if defined(XY_DIAG_AC) && defined(XY_DIAG_BD) && defined(XY_SIDE_AD) - #define XY_SKEW_FACTOR _SKEW_FACTOR(XY_DIAG_AC, XY_DIAG_BD, XY_SIDE_AD) - #else - #define XY_SKEW_FACTOR 0.0 - #endif + constexpr float XY_SKEW_FACTOR = ( + #if defined(XY_DIAG_AC) && defined(XY_DIAG_BD) && defined(XY_SIDE_AD) + _SKEW_FACTOR(XY_DIAG_AC, XY_DIAG_BD, XY_SIDE_AD) + #else + 0.0 + #endif + ); #endif #ifndef XZ_SKEW_FACTOR #if defined(XY_SIDE_AD) && !defined(XZ_SIDE_AD) #define XZ_SIDE_AD XY_SIDE_AD #endif - #if defined(XZ_DIAG_AC) && defined(XZ_DIAG_BD) && defined(XZ_SIDE_AD) - #define XZ_SKEW_FACTOR _SKEW_FACTOR(XZ_DIAG_AC, XZ_DIAG_BD, XZ_SIDE_AD) - #else - #define XZ_SKEW_FACTOR 0.0 - #endif + constexpr float XZ_SKEW_FACTOR = ( + #if defined(XZ_DIAG_AC) && defined(XZ_DIAG_BD) && defined(XZ_SIDE_AD) + _SKEW_FACTOR(XZ_DIAG_AC, XZ_DIAG_BD, XZ_SIDE_AD) + #else + 0.0 + #endif + ); #endif #ifndef YZ_SKEW_FACTOR - #if defined(YZ_DIAG_AC) && defined(YZ_DIAG_BD) && defined(YZ_SIDE_AD) - #define YZ_SKEW_FACTOR _SKEW_FACTOR(YZ_DIAG_AC, YZ_DIAG_BD, YZ_SIDE_AD) - #else - #define YZ_SKEW_FACTOR 0.0 - #endif + constexpr float YZ_SKEW_FACTOR = ( + #if defined(YZ_DIAG_AC) && defined(YZ_DIAG_BD) && defined(YZ_SIDE_AD) + _SKEW_FACTOR(YZ_DIAG_AC, YZ_DIAG_BD, YZ_SIDE_AD) + #else + 0.0 + #endif + ); #endif #endif // SKEW_CORRECTION /** - * Heater, Fan, and Probe interactions + * Set granular options based on the specific type of leveling + */ +#define UBL_SEGMENTED (ENABLED(AUTO_BED_LEVELING_UBL) && (ENABLED(DELTA))) +#define ABL_PLANAR (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_3POINT)) +#define ABL_GRID (ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR)) +#define OLDSCHOOL_ABL (ABL_PLANAR || ABL_GRID) +#define HAS_ABL (OLDSCHOOL_ABL || ENABLED(AUTO_BED_LEVELING_UBL)) +#define HAS_LEVELING (HAS_ABL || ENABLED(MESH_BED_LEVELING)) +#define HAS_AUTOLEVEL (HAS_ABL && DISABLED(PROBE_MANUALLY)) +#define HAS_MESH (ENABLED(AUTO_BED_LEVELING_BILINEAR) || ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(MESH_BED_LEVELING)) +#define PLANNER_LEVELING (OLDSCHOOL_ABL || ENABLED(MESH_BED_LEVELING) || UBL_SEGMENTED || ENABLED(SKEW_CORRECTION)) +#define HAS_PROBING_PROCEDURE (HAS_ABL || ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST)) +#define HAS_UBL_AND_CURVES (ENABLED(AUTO_BED_LEVELING_UBL) && !PLANNER_LEVELING && (ENABLED(ARC_SUPPORT) || ENABLED(BEZIER_CURVE_SUPPORT))) +#define HAS_FEEDRATE_SCALING (ENABLED(SCARA_FEEDRATE_SCALING) || ENABLED(DELTA_FEEDRATE_SCALING)) + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #undef LCD_BED_LEVELING +#endif + +/** + * Heater & Fan Pausing */ #if FAN_COUNT == 0 #undef PROBING_FANS_OFF - #undef ADAPTIVE_FAN_SLOWING - #undef NO_FAN_SLOWING_IN_PID_TUNING -#endif - -#if HAS_BED_PROBE && (EITHER(PROBING_HEATERS_OFF, PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0) - #define QUIET_PROBING 1 -#endif -#if EITHER(ADVANCED_PAUSE_FEATURE, PROBING_HEATERS_OFF) - #define HEATER_IDLE_HANDLER 1 #endif +#define QUIET_PROBING (HAS_BED_PROBE && (ENABLED(PROBING_HEATERS_OFF) || ENABLED(PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0)) +#define HEATER_IDLE_HANDLER (ENABLED(ADVANCED_PAUSE_FEATURE) || ENABLED(PROBING_HEATERS_OFF)) #if ENABLED(ADVANCED_PAUSE_FEATURE) && !defined(FILAMENT_CHANGE_SLOW_LOAD_LENGTH) #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 #endif -#if HAS_MULTI_EXTRUDER && !defined(TOOLCHANGE_FS_EXTRA_PRIME) - #define TOOLCHANGE_FS_EXTRA_PRIME 0 -#endif - /** * Only constrain Z on DELTA / SCARA machines */ @@ -2353,63 +1145,88 @@ #endif /** - * Bed Probing bounds + * Bed Probing rectangular bounds + * These can be further constrained in code for Delta and SCARA */ -#ifndef PROBING_MARGIN - #define PROBING_MARGIN 0 -#endif - -#if IS_KINEMATIC - #undef PROBING_MARGIN_LEFT - #undef PROBING_MARGIN_RIGHT - #undef PROBING_MARGIN_FRONT - #undef PROBING_MARGIN_BACK - #define PROBING_MARGIN_LEFT 0 - #define PROBING_MARGIN_RIGHT 0 - #define PROBING_MARGIN_FRONT 0 - #define PROBING_MARGIN_BACK 0 -#else - #ifndef PROBING_MARGIN_LEFT - #define PROBING_MARGIN_LEFT PROBING_MARGIN - #endif - #ifndef PROBING_MARGIN_RIGHT - #define PROBING_MARGIN_RIGHT PROBING_MARGIN - #endif - #ifndef PROBING_MARGIN_FRONT - #define PROBING_MARGIN_FRONT PROBING_MARGIN - #endif - #ifndef PROBING_MARGIN_BACK - #define PROBING_MARGIN_BACK PROBING_MARGIN - #endif +#ifndef MIN_PROBE_EDGE + #define MIN_PROBE_EDGE 0 #endif #if ENABLED(DELTA) /** * Delta radius/rod trimmers/angle trimmers */ + #define _PROBE_RADIUS (DELTA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + #ifndef DELTA_CALIBRATION_RADIUS + #ifdef X_PROBE_OFFSET_FROM_EXTRUDER + #define DELTA_CALIBRATION_RADIUS (DELTA_PRINTABLE_RADIUS - MAX3(abs(X_PROBE_OFFSET_FROM_EXTRUDER), abs(Y_PROBE_OFFSET_FROM_EXTRUDER), abs(MIN_PROBE_EDGE))) + #else + #define DELTA_CALIBRATION_RADIUS _PROBE_RADIUS + #endif + #endif #ifndef DELTA_ENDSTOP_ADJ #define DELTA_ENDSTOP_ADJ { 0, 0, 0 } #endif #ifndef DELTA_TOWER_ANGLE_TRIM - #define DELTA_TOWER_ANGLE_TRIM { 0, 0, 0 } + #define DELTA_TOWER_ANGLE_TRIM {0, 0, 0} #endif #ifndef DELTA_RADIUS_TRIM_TOWER - #define DELTA_RADIUS_TRIM_TOWER { 0, 0, 0 } + #define DELTA_RADIUS_TRIM_TOWER {0, 0, 0} #endif #ifndef DELTA_DIAGONAL_ROD_TRIM_TOWER - #define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0, 0, 0 } + #define DELTA_DIAGONAL_ROD_TRIM_TOWER {0, 0, 0} #endif + + // Probing points may be verified at compile time within the radius + // using static_assert(HYPOT2(X2-X1,Y2-Y1)<=sq(DELTA_PRINTABLE_RADIUS),"bad probe point!") + // so that may be added to SanityCheck.h in the future. + #define _MIN_PROBE_X (X_CENTER - (_PROBE_RADIUS)) + #define _MIN_PROBE_Y (Y_CENTER - (_PROBE_RADIUS)) + #define _MAX_PROBE_X (X_CENTER + _PROBE_RADIUS) + #define _MAX_PROBE_Y (Y_CENTER + _PROBE_RADIUS) + +#elif IS_SCARA + + #define SCARA_PRINTABLE_RADIUS (SCARA_LINKAGE_1 + SCARA_LINKAGE_2) + #define _PROBE_RADIUS (SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + #define _MIN_PROBE_X (X_CENTER - (SCARA_PRINTABLE_RADIUS) + MIN_PROBE_EDGE) + #define _MIN_PROBE_Y (Y_CENTER - (SCARA_PRINTABLE_RADIUS) + MIN_PROBE_EDGE) + #define _MAX_PROBE_X (X_CENTER + SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + #define _MAX_PROBE_Y (Y_CENTER + SCARA_PRINTABLE_RADIUS - (MIN_PROBE_EDGE)) + +#else + + // Boundaries for Cartesian probing based on bed limits + #define _MIN_PROBE_X (MAX(X_MIN_BED + MIN_PROBE_EDGE, X_MIN_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MIN_PROBE_Y (MAX(Y_MIN_BED + MIN_PROBE_EDGE, Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MAX_PROBE_X (MIN(X_MAX_BED - (MIN_PROBE_EDGE), X_MAX_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MAX_PROBE_Y (MIN(Y_MAX_BED - (MIN_PROBE_EDGE), Y_MAX_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) + #endif #if ENABLED(SEGMENT_LEVELED_MOVES) && !defined(LEVELED_SEGMENT_LENGTH) #define LEVELED_SEGMENT_LENGTH 5 #endif +// These may be overridden in Configuration.h if a smaller area is desired +#ifndef MIN_PROBE_X + #define MIN_PROBE_X _MIN_PROBE_X +#endif +#ifndef MIN_PROBE_Y + #define MIN_PROBE_Y _MIN_PROBE_Y +#endif +#ifndef MAX_PROBE_X + #define MAX_PROBE_X _MAX_PROBE_X +#endif +#ifndef MAX_PROBE_Y + #define MAX_PROBE_Y _MAX_PROBE_Y +#endif + /** * Default mesh area is an area with an inset margin on the print area. */ -#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) +#if ENABLED(MESH_BED_LEVELING) || ENABLED(AUTO_BED_LEVELING_UBL) #if IS_KINEMATIC // Probing points may be verified at compile time within the radius // using static_assert(HYPOT2(X2-X1,Y2-Y1)<=sq(DELTA_PRINTABLE_RADIUS),"bad probe point!") @@ -2420,10 +1237,17 @@ #define _MESH_MAX_Y (Y_MAX_BED - (MESH_INSET)) #else // Boundaries for Cartesian probing based on set limits - #define _MESH_MIN_X (_MAX(X_MIN_BED + MESH_INSET, X_MIN_POS)) // UBL is careful not to probe off the bed. It does not - #define _MESH_MIN_Y (_MAX(Y_MIN_BED + MESH_INSET, Y_MIN_POS)) // need NOZZLE_TO_PROBE_OFFSET in the mesh dimensions - #define _MESH_MAX_X (_MIN(X_MAX_BED - (MESH_INSET), X_MAX_POS)) - #define _MESH_MAX_Y (_MIN(Y_MAX_BED - (MESH_INSET), Y_MAX_POS)) + #if ENABLED(AUTO_BED_LEVELING_UBL) + #define _MESH_MIN_X (MAX(X_MIN_BED + MESH_INSET, X_MIN_POS)) // UBL is careful not to probe off the bed. It does not + #define _MESH_MIN_Y (MAX(Y_MIN_BED + MESH_INSET, Y_MIN_POS)) // need *_PROBE_OFFSET_FROM_EXTRUDER in the mesh dimensions + #define _MESH_MAX_X (MIN(X_MAX_BED - (MESH_INSET), X_MAX_POS)) + #define _MESH_MAX_Y (MIN(Y_MAX_BED - (MESH_INSET), Y_MAX_POS)) + #else + #define _MESH_MIN_X (MAX(X_MIN_BED + MESH_INSET, X_MIN_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MESH_MIN_Y (MAX(Y_MIN_BED + MESH_INSET, Y_MIN_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MESH_MAX_X (MIN(X_MAX_BED - (MESH_INSET), X_MAX_POS + X_PROBE_OFFSET_FROM_EXTRUDER)) + #define _MESH_MAX_Y (MIN(Y_MAX_BED - (MESH_INSET), Y_MAX_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) + #endif #endif // These may be overridden in Configuration.h if a smaller area is desired @@ -2439,31 +1263,75 @@ #ifndef MESH_MAX_Y #define MESH_MAX_Y _MESH_MAX_Y #endif -#else - #undef MESH_MIN_X - #undef MESH_MIN_Y - #undef MESH_MAX_X - #undef MESH_MAX_Y + +#endif // MESH_BED_LEVELING || AUTO_BED_LEVELING_UBL + +#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(AUTO_BED_LEVELING_3POINT) + #if IS_KINEMATIC + #define SIN0 0.0 + #define SIN120 0.866025 + #define SIN240 -0.866025 + #define COS0 1.0 + #define COS120 -0.5 + #define COS240 -0.5 + #ifndef PROBE_PT_1_X + #define PROBE_PT_1_X (X_CENTER + (_PROBE_RADIUS) * COS0) + #endif + #ifndef PROBE_PT_1_Y + #define PROBE_PT_1_Y (Y_CENTER + (_PROBE_RADIUS) * SIN0) + #endif + #ifndef PROBE_PT_2_X + #define PROBE_PT_2_X (X_CENTER + (_PROBE_RADIUS) * COS120) + #endif + #ifndef PROBE_PT_2_Y + #define PROBE_PT_2_Y (Y_CENTER + (_PROBE_RADIUS) * SIN120) + #endif + #ifndef PROBE_PT_3_X + #define PROBE_PT_3_X (X_CENTER + (_PROBE_RADIUS) * COS240) + #endif + #ifndef PROBE_PT_3_Y + #define PROBE_PT_3_Y (Y_CENTER + (_PROBE_RADIUS) * SIN240) + #endif + #else + #ifndef PROBE_PT_1_X + #define PROBE_PT_1_X MIN_PROBE_X + #endif + #ifndef PROBE_PT_1_Y + #define PROBE_PT_1_Y MIN_PROBE_Y + #endif + #ifndef PROBE_PT_2_X + #define PROBE_PT_2_X MAX_PROBE_X + #endif + #ifndef PROBE_PT_2_Y + #define PROBE_PT_2_Y MIN_PROBE_Y + #endif + #ifndef PROBE_PT_3_X + #define PROBE_PT_3_X X_CENTER + #endif + #ifndef PROBE_PT_3_Y + #define PROBE_PT_3_Y MAX_PROBE_Y + #endif + #endif #endif -#define _POINT_COUNT (defined(PROBE_PT_1_X) + defined(PROBE_PT_2_X) + defined(PROBE_PT_3_X) + defined(PROBE_PT_1_Y) + defined(PROBE_PT_2_Y) + defined(PROBE_PT_3_Y)) -#if _POINT_COUNT == 6 - #define HAS_FIXED_3POINT 1 -#elif _POINT_COUNT > 0 - #error "For 3-Point Leveling all XY points must be defined (or none for the defaults)." +#if ENABLED(AUTO_BED_LEVELING_LINEAR) || ENABLED(AUTO_BED_LEVELING_BILINEAR) + #ifndef LEFT_PROBE_BED_POSITION + #define LEFT_PROBE_BED_POSITION MIN_PROBE_X + #endif + #ifndef RIGHT_PROBE_BED_POSITION + #define RIGHT_PROBE_BED_POSITION MAX_PROBE_X + #endif + #ifndef FRONT_PROBE_BED_POSITION + #define FRONT_PROBE_BED_POSITION MIN_PROBE_Y + #endif + #ifndef BACK_PROBE_BED_POSITION + #define BACK_PROBE_BED_POSITION MAX_PROBE_Y + #endif #endif -#undef _POINT_COUNT /** * Buzzer/Speaker */ -#if PIN_EXISTS(BEEPER) || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) - #define HAS_BUZZER 1 - #if PIN_EXISTS(BEEPER) - #define USE_BEEPER 1 - #endif -#endif - #if ENABLED(LCD_USE_I2C_BUZZER) #ifndef LCD_FEEDBACK_FREQUENCY_HZ #define LCD_FEEDBACK_FREQUENCY_HZ 1000 @@ -2471,7 +1339,7 @@ #ifndef LCD_FEEDBACK_FREQUENCY_DURATION_MS #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 #endif -#elif HAS_BUZZER +#else #ifndef LCD_FEEDBACK_FREQUENCY_HZ #define LCD_FEEDBACK_FREQUENCY_HZ 5000 #endif @@ -2480,14 +1348,10 @@ #endif #endif -#if HAS_BUZZER && LCD_FEEDBACK_FREQUENCY_DURATION_MS && LCD_FEEDBACK_FREQUENCY_HZ - #define HAS_CHIRP 1 -#endif - /** - * Make sure DOGLCD_SCK and DOGLCD_MOSI are defined. + * VIKI2, miniVIKI, AZSMZ_12864, and MKS_12864OLED_SSD1306 require DOGLCD_SCK and DOGLCD_MOSI to be defined. */ -#if HAS_MARLINUI_U8GLIB +#if ENABLED(VIKI2) || ENABLED(miniVIKI) || ENABLED(AZSMZ_12864) || ENABLED(MKS_12864OLED_SSD1306) #ifndef DOGLCD_SCK #define DOGLCD_SCK SCK_PIN #endif @@ -2500,10 +1364,10 @@ * Z_HOMING_HEIGHT / Z_CLEARANCE_BETWEEN_PROBES */ #ifndef Z_HOMING_HEIGHT - #ifdef Z_CLEARANCE_BETWEEN_PROBES - #define Z_HOMING_HEIGHT Z_CLEARANCE_BETWEEN_PROBES - #else + #ifndef Z_CLEARANCE_BETWEEN_PROBES #define Z_HOMING_HEIGHT 0 + #else + #define Z_HOMING_HEIGHT Z_CLEARANCE_BETWEEN_PROBES #endif #endif @@ -2519,9 +1383,6 @@ #ifndef Z_CLEARANCE_MULTI_PROBE #define Z_CLEARANCE_MULTI_PROBE Z_CLEARANCE_BETWEEN_PROBES #endif - #if ENABLED(BLTOUCH) && !defined(BLTOUCH_DELAY) - #define BLTOUCH_DELAY 500 - #endif #endif #ifndef __SAM3X8E__ //todo: hal: broken hal encapsulation @@ -2531,26 +1392,24 @@ #endif // Updated G92 behavior shifts the workspace -#if DISABLED(NO_WORKSPACE_OFFSETS) - #define HAS_POSITION_SHIFT 1 - #if IS_CARTESIAN - #define HAS_HOME_OFFSET 1 // The home offset also shifts the coordinate space - #define HAS_WORKSPACE_OFFSET 1 // Cumulative offset to workspace to save some calculation - #define HAS_M206_COMMAND 1 // M206 sets the home offset for Cartesian machines - #elif IS_SCARA - #define HAS_SCARA_OFFSET 1 // The SCARA home offset applies only on G28 - #endif -#endif +#define HAS_POSITION_SHIFT DISABLED(NO_WORKSPACE_OFFSETS) +// The home offset also shifts the coordinate space +#define HAS_HOME_OFFSET (DISABLED(NO_WORKSPACE_OFFSETS) && DISABLED(DELTA)) +// Either offset yields extra calculations on all moves +#define HAS_WORKSPACE_OFFSET (HAS_POSITION_SHIFT || HAS_HOME_OFFSET) +// M206 doesn't apply to DELTA +#define HAS_M206_COMMAND (HAS_HOME_OFFSET && DISABLED(DELTA)) // LCD timeout to status screen default is 15s #ifndef LCD_TIMEOUT_TO_STATUS #define LCD_TIMEOUT_TO_STATUS 15000 #endif +// Shorthand +#define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) + // Add commands that need sub-codes to this list -#if ANY(G38_PROBE_TARGET, CNC_COORDINATE_SYSTEMS, POWER_LOSS_RECOVERY) - #define USE_GCODE_SUBCODES -#endif +#define USE_GCODE_SUBCODES ENABLED(G38_PROBE_TARGET) || ENABLED(CNC_COORDINATE_SYSTEMS) || ENABLED(POWER_LOSS_RECOVERY) // Parking Extruder #if ENABLED(PARKING_EXTRUDER) @@ -2563,24 +1422,47 @@ #endif // Number of VFAT entries used. Each entry has 13 UTF-16 characters -#if EITHER(SCROLL_LONG_FILENAMES, DWIN_CREALITY_LCD) +#if ENABLED(SCROLL_LONG_FILENAMES) #define MAX_VFAT_ENTRIES (5) #else #define MAX_VFAT_ENTRIES (2) #endif -// Nozzle park for Delta -#if BOTH(NOZZLE_PARK_FEATURE, DELTA) +// Set defaults for unspecified LED user colors +#if ENABLED(LED_CONTROL_MENU) + #ifndef LED_USER_PRESET_RED + #define LED_USER_PRESET_RED 255 + #endif + #ifndef LED_USER_PRESET_GREEN + #define LED_USER_PRESET_GREEN 255 + #endif + #ifndef LED_USER_PRESET_BLUE + #define LED_USER_PRESET_BLUE 255 + #endif + #ifndef LED_USER_PRESET_WHITE + #define LED_USER_PRESET_WHITE 0 + #endif + #ifndef LED_USER_PRESET_BRIGHTNESS + #ifdef NEOPIXEL_BRIGHTNESS + #define LED_USER_PRESET_BRIGHTNESS NEOPIXEL_BRIGHTNESS + #else + #define LED_USER_PRESET_BRIGHTNESS 255 + #endif + #endif +#endif + +// Nozzle park +#if ENABLED(NOZZLE_PARK_FEATURE) && ENABLED(DELTA) #undef NOZZLE_PARK_Z_FEEDRATE #define NOZZLE_PARK_Z_FEEDRATE NOZZLE_PARK_XY_FEEDRATE #endif // Force SDCARD_SORT_ALPHA to be enabled for Graphical LCD on LPC1768 -// on boards where SD card and LCD display share the same SPI bus // because of a bug in the shared SPI implementation. (See #8122) -#if defined(TARGET_LPC1768) && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && (SCK_PIN == LCD_PINS_D4) - #define SDCARD_SORT_ALPHA // Keep one directory level in RAM. Changing directory levels - // may still glitch the screen, but LCD updates clean it up. +#if defined(TARGET_LPC1768) && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define SDCARD_SORT_ALPHA // Keeps one directory level in RAM. Changing + // directory levels still glitches the screen, + // but the following LCD update cleans it up. #undef SDSORT_LIMIT #undef SDSORT_USES_RAM #undef SDSORT_USES_STACK @@ -2603,35 +1485,16 @@ #endif #endif -// Defined here to catch the above defines -#if ENABLED(SDCARD_SORT_ALPHA) && (FOLDER_SORTING || ENABLED(SDSORT_GCODE)) - #define HAS_FOLDER_SORTING 1 +// needs to be here so that we catch the above changes to our defines +#if ENABLED(SDCARD_SORT_ALPHA) + #define HAS_FOLDER_SORTING (FOLDER_SORTING || ENABLED(SDSORT_GCODE)) #endif -#if HAS_WIRED_LCD - // Get LCD character width/height, which may be overridden by pins, configs, etc. - #ifndef LCD_WIDTH - #if HAS_MARLINUI_U8GLIB - #define LCD_WIDTH 21 - #else - #define LCD_WIDTH TERN(ULTIPANEL, 20, 16) - #endif - #endif - #ifndef LCD_HEIGHT - #if HAS_MARLINUI_U8GLIB - #define LCD_HEIGHT 5 - #else - #define LCD_HEIGHT TERN(ULTIPANEL, 4, 2) - #endif - #endif +// If platform requires early initialization of watchdog to properly boot +#define EARLY_WATCHDOG (ENABLED(USE_WATCHDOG) && defined(ARDUINO_ARCH_SAM)) + +#if ENABLED(G29_RETRY_AND_RECOVER) + #define USE_EXECUTE_COMMANDS_IMMEDIATE #endif -#if BUTTONS_EXIST(EN1, EN2, ENC) - #define HAS_ROTARY_ENCODER 1 -#endif - -#if !NUM_SERIAL - #undef BAUD_RATE_GCODE -#elif NUM_SERIAL > 1 - #define HAS_MULTI_SERIAL 1 -#endif +#endif // CONDITIONALS_POST_H diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h index 2eafa2b417..539726e405 100644 --- a/Marlin/src/inc/MarlinConfig.h +++ b/Marlin/src/inc/MarlinConfig.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,42 +16,32 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -// -// Prefix header for all Marlin sources -// +#ifndef _MARLIN_CONFIG_H_ +#define _MARLIN_CONFIG_H_ #include "MarlinConfigPre.h" -#ifndef __MARLIN_DEPS__ - #include "../HAL/HAL.h" -#endif +#include HAL_PATH(../HAL, HAL.h) #include "../pins/pins.h" -#ifndef __MARLIN_DEPS__ - #include HAL_PATH(../HAL, timers.h) - #include HAL_PATH(../HAL, spi_pins.h) +#if defined(__AVR__) && !defined(USBCON) + #define HardwareSerial_h // trick to disable the standard HWserial #endif #include "Conditionals_post.h" +#include "SanityCheck.h" -#ifndef __MARLIN_DEPS__ +#include HAL_PATH(../HAL, SanityCheck.h) - #include HAL_PATH(../HAL, inc/Conditionals_post.h) +// Include all core headers +#include "../core/enum.h" +#include "../core/language.h" +#include "../core/utility.h" +#include "../core/serial.h" - #include "../core/types.h" // Ahead of sanity-checks - - #include "SanityCheck.h" - #include HAL_PATH(../HAL, inc/SanityCheck.h) - - // Include all core headers - #include "../core/language.h" - #include "../core/utility.h" - #include "../core/serial.h" - -#endif +#endif // _MARLIN_CONFIG_H_ diff --git a/Marlin/src/inc/MarlinConfigPre.h b/Marlin/src/inc/MarlinConfigPre.h index dfa0adba1b..7f9b50eb01 100644 --- a/Marlin/src/inc/MarlinConfigPre.h +++ b/Marlin/src/inc/MarlinConfigPre.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,47 +16,22 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#ifndef __MARLIN_FIRMWARE__ -#define __MARLIN_FIRMWARE__ -#endif - -// -// Prefix header to acquire configurations -// -#include - -#ifndef __MARLIN_DEPS__ - #include "../HAL/platforms.h" -#endif +#ifndef _MARLIN_CONFIGPRE_H_ +#define _MARLIN_CONFIGPRE_H_ +#include "../HAL/platforms.h" #include "../core/boards.h" #include "../core/macros.h" -#include "../../Configuration.h" - -#ifdef CUSTOM_VERSION_FILE - #if __has_include(STRINGIFY(../../CUSTOM_VERSION_FILE)) - #include STRINGIFY(../../CUSTOM_VERSION_FILE) - #endif -#endif - +#include "../core/types.h" #include "Version.h" - +#include "../../Configuration.h" #include "Conditionals_LCD.h" - -#ifndef __MARLIN_DEPS__ - #include HAL_PATH(../HAL, inc/Conditionals_LCD.h) -#endif - #include "../core/drivers.h" #include "../../Configuration_adv.h" - #include "Conditionals_adv.h" -#ifndef __MARLIN_DEPS__ - #include HAL_PATH(../HAL, inc/Conditionals_adv.h) -#endif +#endif // _MARLIN_CONFIGPRE_H_ diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2cffde0907..6f2a674f22 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * SanityCheck.h @@ -27,6 +26,9 @@ * Test configuration values for errors at compile-time. */ +#ifndef _SANITYCHECK_H_ +#define _SANITYCHECK_H_ + /** * Require gcc 4.7 or newer (first included with Arduino 1.6.8) for C++11 features. */ @@ -34,31 +36,6 @@ #error "Marlin requires C++11 support (gcc >= 4.7, Arduino IDE >= 1.6.8). Please upgrade your toolchain." #endif -// Make sure macros aren't borked -#define TEST1 -#define TEST2 1 -#define TEST3 0 -#define TEST4 true -#if ENABLED(TEST0) || !ENABLED(TEST2) || ENABLED(TEST3) - #error "ENABLED is borked!" -#endif -#if BOTH(TEST0, TEST1) - #error "BOTH is borked!" -#endif -#if DISABLED(TEST1) || !DISABLED(TEST3) || DISABLED(TEST4) || DISABLED(TEST0, TEST1, TEST2, TEST4) || !DISABLED(TEST0, TEST3) - #error "DISABLED is borked!" -#endif -#if !ANY(TEST1, TEST2, TEST3, TEST4) || ANY(TEST0, TEST3) - #error "ANY is borked!" -#endif -#if NONE(TEST0, TEST1, TEST2, TEST4) || !NONE(TEST0, TEST3) - #error "NONE is borked!" -#endif -#undef TEST1 -#undef TEST2 -#undef TEST3 -#undef TEST4 - /** * We try our best to include sanity checks for all changed configuration * directives because users have a tendency to use outdated config files with @@ -73,7 +50,6 @@ #if !defined(CONFIGURATION_ADV_H_VERSION) || HEXIFY(CONFIGURATION_ADV_H_VERSION) < HEXIFY(REQUIRED_CONFIGURATION_ADV_H_VERSION) #error "You are using an old Configuration_adv.h file, update it before building Marlin." #endif -#undef HEXIFY /** * Warnings for old configurations @@ -93,17 +69,13 @@ #elif defined(X_HOME_RETRACT_MM) #error "[XYZ]_HOME_RETRACT_MM settings have been renamed [XYZ]_HOME_BUMP_MM." #elif defined(SDCARDDETECTINVERTED) - #error "SDCARDDETECTINVERTED is now SD_DETECT_STATE (HIGH). Please update your configuration." -#elif defined(SD_DETECT_INVERTED) - #error "SD_DETECT_INVERTED is now SD_DETECT_STATE (HIGH). Please update your configuration." + #error "SDCARDDETECTINVERTED is now SD_DETECT_INVERTED. Please update your configuration." #elif defined(BTENABLED) #error "BTENABLED is now BLUETOOTH. Please update your configuration." #elif defined(CUSTOM_MENDEL_NAME) #error "CUSTOM_MENDEL_NAME is now CUSTOM_MACHINE_NAME. Please update your configuration." #elif defined(HAS_AUTOMATIC_VERSIONING) - #error "HAS_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE. Please update your configuration." -#elif defined(USE_AUTOMATIC_VERSIONING) - #error "USE_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE. Please update your configuration." + #error "HAS_AUTOMATIC_VERSIONING is now USE_AUTOMATIC_VERSIONING. Please update your configuration." #elif defined(SDSLOW) #error "SDSLOW deprecated. Set SPI_SPEED to SPI_HALF_SPEED instead." #elif defined(SDEXTRASLOW) @@ -172,7 +144,7 @@ #error "FILAMENT_CHANGE_NOZZLE_TIMEOUT is now PAUSE_PARK_NOZZLE_TIMEOUT. Please update your configuration." #elif defined(FILAMENT_CHANGE_NUMBER_OF_ALERT_BEEPS) #error "FILAMENT_CHANGE_NUMBER_OF_ALERT_BEEPS is now FILAMENT_CHANGE_ALERT_BEEPS. Please update your configuration." -#elif defined(FILAMENT_CHANGE_NO_STEPPER_TIMEOUT) +#elif ENABLED(FILAMENT_CHANGE_NO_STEPPER_TIMEOUT) #error "FILAMENT_CHANGE_NO_STEPPER_TIMEOUT is now PAUSE_PARK_NO_STEPPER_TIMEOUT. Please update your configuration." #elif defined(PLA_PREHEAT_HOTEND_TEMP) #error "PLA_PREHEAT_HOTEND_TEMP is now PREHEAT_1_TEMP_HOTEND. Please update your configuration." @@ -240,10 +212,6 @@ #error "UBL_MESH_EDITING is now G26_MESH_VALIDATION. Please update your configuration." #elif defined(BLTOUCH_HEATERS_OFF) #error "BLTOUCH_HEATERS_OFF is now PROBING_HEATERS_OFF. Please update your configuration." -#elif defined(BLTOUCH_V3) - #error "BLTOUCH_V3 is obsolete. Please update your configuration." -#elif defined(BLTOUCH_FORCE_OPEN_DRAIN_MODE) - #error "BLTOUCH_FORCE_OPEN_DRAIN_MODE is obsolete. Please update your configuration." #elif defined(BEEPER) #error "BEEPER is now BEEPER_PIN. Please update your pins definitions." #elif defined(SDCARDDETECT) @@ -256,18 +224,12 @@ #error "LCD_PIN_RESET is now LCD_RESET_PIN. Please update your pins definitions." #elif defined(EXTRUDER_0_AUTO_FAN_PIN) || defined(EXTRUDER_1_AUTO_FAN_PIN) || defined(EXTRUDER_2_AUTO_FAN_PIN) || defined(EXTRUDER_3_AUTO_FAN_PIN) #error "EXTRUDER_[0123]_AUTO_FAN_PIN is now E[0123]_AUTO_FAN_PIN. Please update your Configuration_adv.h." -#elif defined(PID_FAN_SCALING) && !HAS_FAN - #error "PID_FAN_SCALING needs at least one fan enabled." #elif defined(min_software_endstops) || defined(max_software_endstops) #error "(min|max)_software_endstops are now (MIN|MAX)_SOFTWARE_ENDSTOPS. Please update your configuration." #elif ENABLED(Z_PROBE_SLED) && defined(SLED_PIN) #error "Replace SLED_PIN with SOL1_PIN (applies to both Z_PROBE_SLED and SOLENOID_PROBE)." #elif defined(CONTROLLERFAN_PIN) #error "CONTROLLERFAN_PIN is now CONTROLLER_FAN_PIN, enabled with USE_CONTROLLER_FAN. Please update your Configuration_adv.h." -#elif defined(CONTROLLERFAN_SPEED) - #error "CONTROLLERFAN_SPEED is now CONTROLLERFAN_SPEED_ACTIVE. Please update your Configuration_adv.h." -#elif defined(CONTROLLERFAN_SECS) - #error "CONTROLLERFAN_SECS is now CONTROLLERFAN_IDLE_TIME. Please update your Configuration_adv.h." #elif defined(MIN_RETRACT) #error "MIN_RETRACT is now MIN_AUTORETRACT and MAX_AUTORETRACT. Please update your Configuration_adv.h." #elif defined(ADVANCE) @@ -277,35 +239,15 @@ #elif defined(NEOPIXEL_RGBW_LED) #error "NEOPIXEL_RGBW_LED is now NEOPIXEL_LED. Please update your configuration." #elif ENABLED(DELTA) && defined(DELTA_PROBEABLE_RADIUS) - #error "Remove DELTA_PROBEABLE_RADIUS and use PROBING_MARGIN to inset the probe area instead." -#elif ENABLED(DELTA) && defined(DELTA_CALIBRATION_RADIUS) - #error "Remove DELTA_CALIBRATION_RADIUS and use PROBING_MARGIN to inset the probe area instead." + #error "Remove DELTA_PROBEABLE_RADIUS and use MIN_PROBE_EDGE to inset the probe area instead." #elif defined(UBL_MESH_INSET) #error "UBL_MESH_INSET is now just MESH_INSET. Please update your configuration." -#elif defined(UBL_MESH_MIN_X) || defined(UBL_MESH_MIN_Y) || defined(UBL_MESH_MAX_X) || defined(UBL_MESH_MAX_Y) +#elif defined(UBL_MESH_MIN_X) || defined(UBL_MESH_MIN_Y) || defined(UBL_MESH_MAX_X) || defined(UBL_MESH_MAX_Y) #error "UBL_MESH_(MIN|MAX)_[XY] is now just MESH_(MIN|MAX)_[XY]. Please update your configuration." #elif defined(ABL_PROBE_PT_1_X) || defined(ABL_PROBE_PT_1_Y) || defined(ABL_PROBE_PT_2_X) || defined(ABL_PROBE_PT_2_Y) || defined(ABL_PROBE_PT_3_X) || defined(ABL_PROBE_PT_3_Y) - #error "ABL_PROBE_PT_[123]_[XY] is no longer required. Please remove it from Configuration.h." + #error "ABL_PROBE_PT_[123]_[XY] is now PROBE_PT_[123]_[XY]. Please update your configuration." #elif defined(UBL_PROBE_PT_1_X) || defined(UBL_PROBE_PT_1_Y) || defined(UBL_PROBE_PT_2_X) || defined(UBL_PROBE_PT_2_Y) || defined(UBL_PROBE_PT_3_X) || defined(UBL_PROBE_PT_3_Y) - #error "UBL_PROBE_PT_[123]_[XY] is no longer required. Please remove it from Configuration.h." -#elif defined(MIN_PROBE_EDGE) - #error "MIN_PROBE_EDGE is now called PROBING_MARGIN. Please update your configuration." -#elif defined(MIN_PROBE_EDGE_LEFT) - #error "MIN_PROBE_EDGE_LEFT is now called PROBING_MARGIN_LEFT. Please update your configuration." -#elif defined(MIN_PROBE_EDGE_RIGHT) - #error "MIN_PROBE_EDGE_RIGHT is now called PROBING_MARGIN_RIGHT. Please update your configuration." -#elif defined(MIN_PROBE_EDGE_FRONT) - #error "MIN_PROBE_EDGE_FRONT is now called PROBING_MARGIN_FRONT. Please update your configuration." -#elif defined(MIN_PROBE_EDGE_BACK) - #error "MIN_PROBE_EDGE_BACK is now called PROBING_MARGIN_BACK. Please update your configuration." -#elif defined(LEFT_PROBE_BED_POSITION) - #error "LEFT_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_LEFT instead." -#elif defined(RIGHT_PROBE_BED_POSITION) - #error "RIGHT_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_RIGHT instead." -#elif defined(FRONT_PROBE_BED_POSITION) - #error "FRONT_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_FRONT instead." -#elif defined(BACK_PROBE_BED_POSITION) - #error "BACK_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_BACK instead." + #error "UBL_PROBE_PT_[123]_[XY] is now PROBE_PT_[123]_[XY]. Please update your configuration." #elif defined(ENABLE_MESH_EDIT_GFX_OVERLAY) #error "ENABLE_MESH_EDIT_GFX_OVERLAY is now MESH_EDIT_GFX_OVERLAY. Please update your configuration." #elif defined(BABYSTEP_ZPROBE_GFX_REVERSE) @@ -324,42 +266,36 @@ #error "MEASURED_(UPPER|LOWER)_LIMIT is now FILWIDTH_ERROR_MARGIN. Please update your configuration." #elif defined(HAVE_TMCDRIVER) #error "HAVE_TMCDRIVER is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." -#elif defined(STEALTHCHOP) - #error "STEALTHCHOP is now STEALTHCHOP_(XY|Z|E). Please update your Configuration_adv.h." #elif defined(HAVE_TMC26X) #error "HAVE_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." #elif defined(HAVE_TMC2130) #error "HAVE_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h." -#elif defined(HAVE_TMC2208) - #error "HAVE_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h." #elif defined(HAVE_L6470DRIVER) #error "HAVE_L6470DRIVER is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h." -#elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) || defined(Z3_IS_TMC) \ - || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC) || defined(E5_IS_TMC) || defined(E6_IS_TMC) || defined(E7_IS_TMC) +#elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) \ + || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC) #error "[AXIS]_IS_TMC is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." -#elif defined(X_IS_TMC26X) || defined(X2_IS_TMC26X) || defined(Y_IS_TMC26X) || defined(Y2_IS_TMC26X) || defined(Z_IS_TMC26X) || defined(Z2_IS_TMC26X) || defined(Z3_IS_TMC26X) \ - || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X) || defined(E5_IS_TMC26X) || defined(E6_IS_TMC26X) || defined(E7_IS_TMC26X) +#elif defined(X_IS_TMC26X) || defined(X2_IS_TMC26X) || defined(Y_IS_TMC26X) || defined(Y2_IS_TMC26X) || defined(Z_IS_TMC26X) || defined(Z2_IS_TMC26X) \ + || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X) #error "[AXIS]_IS_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." -#elif defined(X_IS_TMC2130) || defined(X2_IS_TMC2130) || defined(Y_IS_TMC2130) || defined(Y2_IS_TMC2130) || defined(Z_IS_TMC2130) || defined(Z2_IS_TMC2130) || defined(Z3_IS_TMC2130) \ - || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130) || defined(E5_IS_TMC2130) || defined(E6_IS_TMC2130) || defined(E7_IS_TMC2130) +#elif defined(X_IS_TMC2130) || defined(X2_IS_TMC2130) || defined(Y_IS_TMC2130) || defined(Y2_IS_TMC2130) || defined(Z_IS_TMC2130) || defined(Z2_IS_TMC2130) \ + || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130) #error "[AXIS]_IS_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h." -#elif defined(X_IS_TMC2208) || defined(X2_IS_TMC2208) || defined(Y_IS_TMC2208) || defined(Y2_IS_TMC2208) || defined(Z_IS_TMC2208) || defined(Z2_IS_TMC2208) || defined(Z3_IS_TMC2208) \ - || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208) || defined(E5_IS_TMC2208) || defined(E6_IS_TMC2208) || defined(E7_IS_TMC2208) +#elif defined(X_IS_TMC2208) || defined(X2_IS_TMC2208) || defined(Y_IS_TMC2208) || defined(Y2_IS_TMC2208) || defined(Z_IS_TMC2208) || defined(Z2_IS_TMC2208) \ + || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208) #error "[AXIS]_IS_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h." -#elif defined(X_IS_L6470) || defined(X2_IS_L6470) || defined(Y_IS_L6470) || defined(Y2_IS_L6470) || defined(Z_IS_L6470) || defined(Z2_IS_L6470) || defined(Z3_IS_L6470) \ - || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470) || defined(E5_IS_L6470) || defined(E6_IS_L6470) || defined(E7_IS_L6470) +#elif defined(X_IS_L6470) || defined(X2_IS_L6470) || defined(Y_IS_L6470) || defined(Y2_IS_L6470) || defined(Z_IS_L6470) || defined(Z2_IS_L6470) \ + || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470) #error "[AXIS]_IS_L6470 is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h." #elif defined(AUTOMATIC_CURRENT_CONTROL) #error "AUTOMATIC_CURRENT_CONTROL is now MONITOR_DRIVER_STATUS. Please update your configuration." #elif defined(FILAMENT_CHANGE_LOAD_LENGTH) #error "FILAMENT_CHANGE_LOAD_LENGTH is now FILAMENT_CHANGE_FAST_LOAD_LENGTH. Please update your configuration." -#elif defined(LEVEL_CORNERS_INSET) - #error "LEVEL_CORNERS_INSET is now LEVEL_CORNERS_INSET_LFRB . Please update your Configuration.h." -#elif ENABLED(LEVEL_BED_CORNERS) && !defined(LEVEL_CORNERS_INSET_LFRB) - #error "LEVEL_BED_CORNERS requires LEVEL_CORNERS_INSET_LFRB values. Please update your Configuration.h." +#elif ENABLED(LEVEL_BED_CORNERS) && !defined(LEVEL_CORNERS_INSET) + #error "LEVEL_BED_CORNERS requires a LEVEL_CORNERS_INSET value. Please update your Configuration.h." #elif defined(BEZIER_JERK_CONTROL) #error "BEZIER_JERK_CONTROL is now S_CURVE_ACCELERATION. Please update your configuration." -#elif HAS_JUNCTION_DEVIATION && defined(JUNCTION_DEVIATION_FACTOR) +#elif defined(JUNCTION_DEVIATION_FACTOR) #error "JUNCTION_DEVIATION_FACTOR is now JUNCTION_DEVIATION_MM. Please update your configuration." #elif defined(JUNCTION_ACCELERATION_FACTOR) #error "JUNCTION_ACCELERATION_FACTOR is obsolete. Delete it from Configuration_adv.h." @@ -371,191 +307,17 @@ #error "MAX7219_DEBUG_STEPPER_TAIL is now MAX7219_DEBUG_PLANNER_TAIL. Please update your configuration." #elif defined(MAX7219_DEBUG_STEPPER_QUEUE) #error "MAX7219_DEBUG_STEPPER_QUEUE is now MAX7219_DEBUG_PLANNER_QUEUE. Please update your configuration." -#elif defined(ENDSTOP_NOISE_FILTER) - #error "ENDSTOP_NOISE_FILTER is now ENDSTOP_NOISE_THRESHOLD [2-7]. Please update your configuration." -#elif defined(RETRACT_ZLIFT) - #error "RETRACT_ZLIFT is now RETRACT_ZRAISE. Please update your Configuration_adv.h." -#elif defined(TOOLCHANGE_PARK_ZLIFT) || defined(TOOLCHANGE_UNPARK_ZLIFT) - #error "TOOLCHANGE_PARK_ZLIFT and TOOLCHANGE_UNPARK_ZLIFT are now TOOLCHANGE_ZRAISE. Please update your configuration." -#elif defined(SINGLENOZZLE_TOOLCHANGE_ZRAISE) - #error "SINGLENOZZLE_TOOLCHANGE_ZRAISE is now TOOLCHANGE_ZRAISE. Please update your configuration." -#elif defined(SINGLENOZZLE_SWAP_LENGTH) - #error "SINGLENOZZLE_SWAP_LENGTH is now TOOLCHANGE_FIL_SWAP_LENGTH. Please update your configuration." -#elif defined(SINGLENOZZLE_SWAP_RETRACT_SPEED) - #error "SINGLENOZZLE_SWAP_RETRACT_SPEED is now TOOLCHANGE_FIL_SWAP_RETRACT_SPEED. Please update your configuration." -#elif defined(SINGLENOZZLE_SWAP_PRIME_SPEED) - #error "SINGLENOZZLE_SWAP_PRIME_SPEED is now TOOLCHANGE_FIL_SWAP_PRIME_SPEED. Please update your configuration." -#elif defined(SINGLENOZZLE_SWAP_PARK) - #error "SINGLENOZZLE_SWAP_PARK is now TOOLCHANGE_PARK. Please update your configuration." -#elif defined(SINGLENOZZLE_TOOLCHANGE_XY) - #error "SINGLENOZZLE_TOOLCHANGE_XY is now TOOLCHANGE_PARK_XY. Please update your configuration." -#elif defined(SINGLENOZZLE_PARK_XY_FEEDRATE) - #error "SINGLENOZZLE_PARK_XY_FEEDRATE is now TOOLCHANGE_PARK_XY_FEEDRATE. Please update your configuration." -#elif defined(PARKING_EXTRUDER_SECURITY_RAISE) - #error "PARKING_EXTRUDER_SECURITY_RAISE is now TOOLCHANGE_ZRAISE. Please update your configuration." -#elif defined(SWITCHING_TOOLHEAD_SECURITY_RAISE) - #error "SWITCHING_TOOLHEAD_SECURITY_RAISE is now TOOLCHANGE_ZRAISE. Please update your configuration." -#elif defined(G0_FEEDRATE) && G0_FEEDRATE == 0 - #error "G0_FEEDRATE is now used to set the G0 feedrate. Please update your configuration." -#elif defined(MBL_Z_STEP) - #error "MBL_Z_STEP is now MESH_EDIT_Z_STEP. Please update your configuration." -#elif defined(CHDK) - #error "CHDK is now CHDK_PIN. Please update your Configuration_adv.h." -#elif defined(MAX6675_SS) - #error "MAX6675_SS is now MAX6675_SS_PIN. Please update your configuration and/or pins." -#elif defined(MAX6675_SS2) - #error "MAX6675_SS2 is now MAX6675_SS2_PIN. Please update your configuration and/or pins." -#elif defined(SPINDLE_LASER_ENABLE) - #error "SPINDLE_LASER_ENABLE is now SPINDLE_FEATURE or LASER_FEATURE. Please update your Configuration_adv.h." -#elif defined(SPINDLE_LASER_ENABLE_PIN) - #error "SPINDLE_LASER_ENABLE_PIN is now SPINDLE_LASER_ENA_PIN. Please update your Configuration_adv.h and/or pins." -#elif defined(SPINDLE_DIR_CHANGE) - #error "SPINDLE_DIR_CHANGE is now SPINDLE_CHANGE_DIR. Please update your Configuration_adv.h." -#elif defined(SPINDLE_STOP_ON_DIR_CHANGE) - #error "SPINDLE_STOP_ON_DIR_CHANGE is now SPINDLE_CHANGE_DIR_STOP. Please update your Configuration_adv.h." -#elif defined(SPINDLE_LASER_ACTIVE_HIGH) - #error "SPINDLE_LASER_ACTIVE_HIGH is now SPINDLE_LASER_ACTIVE_STATE. Please update your Configuration_adv.h." -#elif defined(SPINDLE_LASER_ENABLE_INVERT) - #error "SPINDLE_LASER_ENABLE_INVERT is now SPINDLE_LASER_ACTIVE_STATE. Please update your Configuration_adv.h." -#elif defined(CUTTER_POWER_DISPLAY) - #error "CUTTER_POWER_DISPLAY is now CUTTER_POWER_UNIT. Please update your Configuration_adv.h." -#elif defined(CHAMBER_HEATER_PIN) - #error "CHAMBER_HEATER_PIN is now HEATER_CHAMBER_PIN. Please update your configuration and/or pins." -#elif defined(TMC_Z_CALIBRATION) - #error "TMC_Z_CALIBRATION has been deprecated in favor of MECHANICAL_GANTRY_CALIBRATION. Please update your configuration." -#elif defined(Z_MIN_PROBE_ENDSTOP) - #error "Z_MIN_PROBE_ENDSTOP is no longer required. Please remove it from Configuration.h." -#elif defined(DUAL_NOZZLE_DUPLICATION_MODE) - #error "DUAL_NOZZLE_DUPLICATION_MODE is now MULTI_NOZZLE_DUPLICATION. Please update your configuration." -#elif defined(MENU_ITEM_CASE_LIGHT) - #error "MENU_ITEM_CASE_LIGHT is now CASE_LIGHT_MENU. Please update your configuration." -#elif defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) - #error "ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED is now SD_ABORT_ON_ENDSTOP_HIT. Please update your Configuration_adv.h." -#elif defined(LPC_SD_LCD) || defined(LPC_SD_ONBOARD) || defined(LPC_SD_CUSTOM_CABLE) - #error "LPC_SD_(LCD|ONBOARD|CUSTOM_CABLE) are now SDCARD_CONNECTION. Please update your Configuration_adv.h." -#elif defined(USB_SD_DISABLED) - #error "USB_SD_DISABLED is now NO_SD_HOST_DRIVE. Please update your Configuration_adv.h." -#elif defined(USB_SD_ONBOARD) - #error "USB_SD_ONBOARD is obsolete. Disable NO_SD_HOST_DRIVE instead." -#elif defined(PSU_ACTIVE_HIGH) - #error "PSU_ACTIVE_HIGH is now PSU_ACTIVE_STATE. Please update your configuration." -#elif POWER_SUPPLY == 1 - #error "Replace POWER_SUPPLY 1 by enabling PSU_CONTROL and setting PSU_ACTIVE_STATE to 'LOW'." -#elif POWER_SUPPLY == 2 - #error "Replace POWER_SUPPLY 2 by enabling PSU_CONTROL and setting PSU_ACTIVE_STATE to 'HIGH'." -#elif defined(POWER_SUPPLY) - #error "POWER_SUPPLY is now obsolete. Please remove it from Configuration.h." -#elif defined(MKS_ROBIN_TFT) - #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT. Please update your configuration." -#elif defined(SDPOWER) - #error "SDPOWER is now SDPOWER_PIN. Please update your configuration and/or pins." -#elif defined(STRING_SPLASH_LINE1) || defined(STRING_SPLASH_LINE2) - #error "STRING_SPLASH_LINE[12] are now obsolete. Please remove them from Configuration.h." -#elif defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_X) || defined(Z_PROBE_ALLEN_KEY_STOW_1_X) - #error "Z_PROBE_ALLEN_KEY_(DEPLOY|STOW) coordinates are now a single setting. Please update your configuration." -#elif defined(X_PROBE_OFFSET_FROM_EXTRUDER) || defined(Y_PROBE_OFFSET_FROM_EXTRUDER) || defined(Z_PROBE_OFFSET_FROM_EXTRUDER) - #error "[XYZ]_PROBE_OFFSET_FROM_EXTRUDER is now NOZZLE_TO_PROBE_OFFSET. Please update your configuration." -#elif defined(MIN_PROBE_X) || defined(MIN_PROBE_Y) || defined(MAX_PROBE_X) || defined(MAX_PROBE_Y) - #error "(MIN|MAX)_PROBE_[XY] are now calculated at runtime. Please remove them from Configuration.h." -#elif defined(Z_STEPPER_ALIGN_X) || defined(Z_STEPPER_ALIGN_X) - #error "Z_STEPPER_ALIGN_X and Z_STEPPER_ALIGN_Y are now combined as Z_STEPPER_ALIGN_XY. Please update your Configuration_adv.h." -#elif defined(JUNCTION_DEVIATION) - #error "JUNCTION_DEVIATION is no longer required. (See CLASSIC_JERK). Please remove it from Configuration.h." -#elif defined(BABYSTEP_MULTIPLICATOR) - #error "BABYSTEP_MULTIPLICATOR is now BABYSTEP_MULTIPLICATOR_[XY|Z]. Please update Configuration_adv.h." -#elif defined(LULZBOT_TOUCH_UI) - #error "LULZBOT_TOUCH_UI is now TOUCH_UI_FTDI_EVE. Please update your configuration." -#elif defined(PS_DEFAULT_OFF) - #error "PS_DEFAULT_OFF is now PSU_DEFAULT_OFF. Please update your configuration." -#elif defined(FILAMENT_UNLOAD_RETRACT_LENGTH) - #error "FILAMENT_UNLOAD_RETRACT_LENGTH is now FILAMENT_UNLOAD_PURGE_RETRACT. Please update Configuration_adv.h." -#elif defined(FILAMENT_UNLOAD_DELAY) - #error "FILAMENT_UNLOAD_DELAY is now FILAMENT_UNLOAD_PURGE_DELAY. Please update Configuration_adv.h." -#elif defined(HOME_USING_SPREADCYCLE) - #error "HOME_USING_SPREADCYCLE is now obsolete. Please remove it from Configuration_adv.h." -#elif defined(DGUS_LCD) - #error "DGUS_LCD is now DGUS_LCD_UI_(ORIGIN|FYSETC|HIPRECY). Please update your configuration." -#elif defined(DGUS_SERIAL_PORT) - #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." -#elif defined(DGUS_BAUDRATE) - #error "DGUS_BAUDRATE is now LCD_BAUDRATE. Please update your configuration." -#elif defined(DGUS_STATS_RX_BUFFER_OVERRUNS) - #error "DGUS_STATS_RX_BUFFER_OVERRUNS is now STATS_RX_BUFFER_OVERRUNS. Please update your configuration." -#elif defined(DGUS_SERIAL_PORT) - #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." -#elif defined(ANYCUBIC_LCD_SERIAL_PORT) - #error "ANYCUBIC_LCD_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." -#elif defined(INTERNAL_SERIAL_PORT) - #error "INTERNAL_SERIAL_PORT is now MMU2_SERIAL_PORT. Please update your configuration." -#elif defined(X_DUAL_ENDSTOPS_ADJUSTMENT) - #error "X_DUAL_ENDSTOPS_ADJUSTMENT is now X2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." -#elif defined(Y_DUAL_ENDSTOPS_ADJUSTMENT) - #error "Y_DUAL_ENDSTOPS_ADJUSTMENT is now Y2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." -#elif defined(Z_DUAL_ENDSTOPS_ADJUSTMENT) - #error "Z_DUAL_ENDSTOPS_ADJUSTMENT is now Z2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." -#elif defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT2) || defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT3) - #error "Z_TRIPLE_ENDSTOPS_ADJUSTMENT[23] is now Z[23]_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." -#elif defined(Z_QUAD_ENDSTOPS_ADJUSTMENT2) || defined(Z_QUAD_ENDSTOPS_ADJUSTMENT3) || defined(Z_QUAD_ENDSTOPS_ADJUSTMENT4) - #error "Z_QUAD_ENDSTOPS_ADJUSTMENT[234] is now Z[234]_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." -#elif defined(Z_DUAL_STEPPER_DRIVERS) - #error "Z_DUAL_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 2. Please update Configuration_adv.h." -#elif defined(Z_TRIPLE_STEPPER_DRIVERS) - #error "Z_TRIPLE_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 3. Please update Configuration_adv.h." -#elif defined(Z_QUAD_STEPPER_DRIVERS) - #error "Z_QUAD_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 4. Please update Configuration_adv.h." -#elif defined(Z_DUAL_ENDSTOPS) - #error "Z_DUAL_ENDSTOPS is now Z_MULTI_ENDSTOPS. Please update Configuration_adv.h." -#elif defined(Z_TRIPLE_ENDSTOPS) - #error "Z_TRIPLE_ENDSTOPS is now Z_MULTI_ENDSTOPS. Please update Configuration_adv.h." -#elif defined(Z_QUAD_ENDSTOPS) - #error "Z_QUAD_ENDSTOPS is now Z_MULTI_ENDSTOPS. Please update Configuration_adv.h." -#elif defined(DUGS_UI_MOVE_DIS_OPTION) - #error "DUGS_UI_MOVE_DIS_OPTION is spelled DGUS_UI_MOVE_DIS_OPTION. Please update Configuration_adv.h." -#elif defined(ORIG_E0_AUTO_FAN_PIN) || defined(ORIG_E1_AUTO_FAN_PIN) || defined(ORIG_E2_AUTO_FAN_PIN) || defined(ORIG_E3_AUTO_FAN_PIN) || defined(ORIG_E4_AUTO_FAN_PIN) || defined(ORIG_E5_AUTO_FAN_PIN) || defined(ORIG_E6_AUTO_FAN_PIN) || defined(ORIG_E7_AUTO_FAN_PIN) - #error "ORIG_Ex_AUTO_FAN_PIN is now just Ex_AUTO_FAN_PIN. Make sure your pins are up to date." -#elif defined(ORIG_CHAMBER_AUTO_FAN_PIN) - #error "ORIG_CHAMBER_AUTO_FAN_PIN is now just CHAMBER_AUTO_FAN_PIN. Make sure your pins are up to date." -#elif defined(HOMING_BACKOFF_MM) - #error "HOMING_BACKOFF_MM is now HOMING_BACKOFF_POST_MM. Please update Configuration_adv.h." -#elif defined(X_HOME_BUMP_MM) || defined(Y_HOME_BUMP_MM) || defined(Z_HOME_BUMP_MM) - #error "[XYZ]_HOME_BUMP_MM is now HOMING_BUMP_MM. Please update Configuration_adv.h." -#elif defined(DIGIPOT_I2C) - #error "DIGIPOT_I2C is now DIGIPOT_MCP4451 (or DIGIPOT_MCP4018). Please update Configuration_adv.h." -#elif defined(TOUCH_BUTTONS) - #error "TOUCH_BUTTONS is now TOUCH_SCREEN. Please update your Configuration.h." -#elif defined(LCD_FULL_PIXEL_HEIGHT) - #error "LCD_FULL_PIXEL_HEIGHT is deprecated and should be removed. Please update your Configuration.h." -#elif defined(LCD_FULL_PIXEL_WIDTH) - #error "LCD_FULL_PIXEL_WIDTH is deprecated and should be removed. Please update your Configuration.h." -#elif defined(FSMC_UPSCALE) - #error "FSMC_UPSCALE is now GRAPHICAL_TFT_UPSCALE. Please update your Configuration.h." -#elif defined(ANYCUBIC_TFT_MODEL) - #error "ANYCUBIC_TFT_MODEL is now ANYCUBIC_LCD_I3MEGA. Please update your Configuration.h." -#elif defined(EVENT_GCODE_SD_STOP) - #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT. Please update your Configuration.h." -#elif defined(GRAPHICAL_TFT_ROTATE_180) - #error "GRAPHICAL_TFT_ROTATE_180 is now TFT_ROTATION set to TFT_ROTATE_180. Please update your Configuration.h." -#elif defined(FIL_RUNOUT_INVERTING) - #if FIL_RUNOUT_INVERTING - #error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH. Please update your Configuration.h." - #else - #error "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW. Please update your Configuration.h." - #endif #endif -/** - * Probe temp compensation requirements - */ -#if ENABLED(PROBE_TEMP_COMPENSATION) - #if defined(PTC_PARK_POS_X) || defined(PTC_PARK_POS_Y) || defined(PTC_PARK_POS_Z) - #error "PTC_PARK_POS_[XYZ] is now PTC_PARK_POS (array). Please update Configuration_adv.h." - #elif !defined(PTC_PARK_POS) - #error "PROBE_TEMP_COMPENSATION requires PTC_PARK_POS." - #elif defined(PTC_PROBE_POS_X) || defined(PTC_PROBE_POS_Y) - #error "PTC_PROBE_POS_[XY] is now PTC_PROBE_POS (array). Please update Configuration_adv.h." - #elif !defined(PTC_PROBE_POS) - #error "PROBE_TEMP_COMPENSATION requires PTC_PROBE_POS." - #endif +#define BOARD_MKS_13 -47 +#define BOARD_TRIGORILLA -343 +#define BOARD_RURAMPS4D -1550 +#if MB(MKS_13) + #error "BOARD_MKS_13 has been renamed BOARD_MKS_GEN_13. Please update your configuration." +#elif MB(BOARD_TRIGORILLA) + #error "BOARD_TRIGORILLA has been renamed BOARD_TRIGORILLA_13. Please update your configuration." +#elif MB(BOARD_RURAMPS4D) + #error "BOARD_RURAMPS4D has been renamed BOARD_RURAMPS4D_11. Please update your configuration." #endif /** @@ -582,53 +344,44 @@ /** * Serial */ -#if !IS_AT90USB +#if !(defined(__AVR__) && defined(USBCON)) #if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops." #elif RX_BUFFER_SIZE && (RX_BUFFER_SIZE < 2 || !IS_POWER_OF_2(RX_BUFFER_SIZE)) #error "RX_BUFFER_SIZE must be a power of 2 greater than 1." #elif TX_BUFFER_SIZE && (TX_BUFFER_SIZE < 2 || TX_BUFFER_SIZE > 256 || !IS_POWER_OF_2(TX_BUFFER_SIZE)) - #error "TX_BUFFER_SIZE must be 0 or a power of 2 between 1 and 256." + #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256." #endif -#elif ANY(SERIAL_XON_XOFF, SERIAL_STATS_MAX_RX_QUEUED, SERIAL_STATS_DROPPED_RX) +#elif ENABLED(SERIAL_XON_XOFF) || ENABLED(SERIAL_STATS_MAX_RX_QUEUED) || ENABLED(SERIAL_STATS_DROPPED_RX) #error "SERIAL_XON_XOFF and SERIAL_STATS_* features not supported on USB-native AVR devices." #endif -#ifndef SERIAL_PORT - #error "SERIAL_PORT must be defined in Configuration.h" -#elif defined(SERIAL_PORT_2) && SERIAL_PORT_2 == SERIAL_PORT - #error "SERIAL_PORT_2 cannot be the same as SERIAL_PORT. Please update your configuration." +#if SERIAL_PORT > 7 + #error "Set SERIAL_PORT to the port on your board. Usually this is 0." +#endif + +#if SERIAL_PORT_2 && NUM_SERIAL < 2 + #error "SERIAL_PORT_2 is not supported for your MOTHERBOARD. Disable it to continue." #endif /** - * Multiple Stepper Drivers Per Axis + * Dual Stepper Drivers */ -#define GOOD_AXIS_PINS(A) (HAS_##A##_ENABLE && HAS_##A##_STEP && HAS_##A##_DIR) -#if ENABLED(X_DUAL_STEPPER_DRIVERS) - #if ENABLED(DUAL_X_CARRIAGE) - #error "DUAL_X_CARRIAGE is not compatible with X_DUAL_STEPPER_DRIVERS." - #elif !GOOD_AXIS_PINS(X) - #error "X_DUAL_STEPPER_DRIVERS requires X2 pins to be defined." - #endif -#endif - -#if ENABLED(Y_DUAL_STEPPER_DRIVERS) && !GOOD_AXIS_PINS(Y) - #error "Y_DUAL_STEPPER_DRIVERS requires Y2 pins to be defined." -#elif !WITHIN(NUM_Z_STEPPER_DRIVERS, 1, 4) - #error "NUM_Z_STEPPER_DRIVERS must be an integer from 1 to 4." -#elif NUM_Z_STEPPER_DRIVERS == 2 && !GOOD_AXIS_PINS(Z2) - #error "If NUM_Z_STEPPER_DRIVERS is 2, you must define stepper pins for Z2." -#elif NUM_Z_STEPPER_DRIVERS == 3 && !(GOOD_AXIS_PINS(Z2) && GOOD_AXIS_PINS(Z3)) - #error "If NUM_Z_STEPPER_DRIVERS is 3, you must define stepper pins for Z2 and Z3." -#elif NUM_Z_STEPPER_DRIVERS == 4 && !(GOOD_AXIS_PINS(Z2) && GOOD_AXIS_PINS(Z3) && GOOD_AXIS_PINS(Z4)) - #error "If NUM_Z_STEPPER_DRIVERS is 4, you must define stepper pins for Z2, Z3, and Z4." +#if ENABLED(X_DUAL_STEPPER_DRIVERS) && ENABLED(DUAL_X_CARRIAGE) + #error "DUAL_X_CARRIAGE is not compatible with X_DUAL_STEPPER_DRIVERS." +#elif ENABLED(X_DUAL_STEPPER_DRIVERS) && (!HAS_X2_ENABLE || !HAS_X2_STEP || !HAS_X2_DIR) + #error "X_DUAL_STEPPER_DRIVERS requires X2 pins (and an extra E plug)." +#elif ENABLED(Y_DUAL_STEPPER_DRIVERS) && (!HAS_Y2_ENABLE || !HAS_Y2_STEP || !HAS_Y2_DIR) + #error "Y_DUAL_STEPPER_DRIVERS requires Y2 pins (and an extra E plug)." +#elif ENABLED(Z_DUAL_STEPPER_DRIVERS) && (!HAS_Z2_ENABLE || !HAS_Z2_STEP || !HAS_Z2_DIR) + #error "Z_DUAL_STEPPER_DRIVERS requires Z2 pins (and an extra E plug)." #endif /** * Validate that the bed size fits */ -static_assert(X_MAX_LENGTH >= X_BED_SIZE, "Movement bounds (X_MIN_POS, X_MAX_POS) are too narrow to contain X_BED_SIZE."); -static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS) are too narrow to contain Y_BED_SIZE."); +static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE, + "Movement bounds ([XY]_MIN_POS, [XY]_MAX_POS) are too narrow to contain [XY]_BED_SIZE."); /** * Granular software endstops (Marlin >= 1.1.7) @@ -636,7 +389,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(MIN_SOFTWARE_ENDSTOPS) && DISABLED(MIN_SOFTWARE_ENDSTOP_Z) #if IS_KINEMATIC #error "MIN_SOFTWARE_ENDSTOPS on DELTA/SCARA also requires MIN_SOFTWARE_ENDSTOP_Z." - #elif NONE(MIN_SOFTWARE_ENDSTOP_X, MIN_SOFTWARE_ENDSTOP_Y) + #elif DISABLED(MIN_SOFTWARE_ENDSTOP_X) && DISABLED(MIN_SOFTWARE_ENDSTOP_Y) #error "MIN_SOFTWARE_ENDSTOPS requires at least one of the MIN_SOFTWARE_ENDSTOP_[XYZ] options." #endif #endif @@ -644,86 +397,62 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(MAX_SOFTWARE_ENDSTOPS) && DISABLED(MAX_SOFTWARE_ENDSTOP_Z) #if IS_KINEMATIC #error "MAX_SOFTWARE_ENDSTOPS on DELTA/SCARA also requires MAX_SOFTWARE_ENDSTOP_Z." - #elif NONE(MAX_SOFTWARE_ENDSTOP_X, MAX_SOFTWARE_ENDSTOP_Y) + #elif DISABLED(MAX_SOFTWARE_ENDSTOP_X) && DISABLED(MAX_SOFTWARE_ENDSTOP_Y) #error "MAX_SOFTWARE_ENDSTOPS requires at least one of the MAX_SOFTWARE_ENDSTOP_[XYZ] options." #endif #endif -#if !defined(TARGET_LPC1768) && ANY( \ - ENDSTOPPULLDOWNS, \ - ENDSTOPPULLDOWN_XMAX, ENDSTOPPULLDOWN_YMAX, \ - ENDSTOPPULLDOWN_ZMAX, ENDSTOPPULLDOWN_XMIN, \ - ENDSTOPPULLDOWN_YMIN, ENDSTOPPULLDOWN_ZMIN \ - ) +#if !defined(TARGET_LPC1768) && ( \ + ENABLED(ENDSTOPPULLDOWNS) \ + || ENABLED(ENDSTOPPULLDOWN_XMAX) \ + || ENABLED(ENDSTOPPULLDOWN_YMAX) \ + || ENABLED(ENDSTOPPULLDOWN_ZMAX) \ + || ENABLED(ENDSTOPPULLDOWN_XMIN) \ + || ENABLED(ENDSTOPPULLDOWN_YMIN) \ + || ENABLED(ENDSTOPPULLDOWN_ZMIN) ) #error "PULLDOWN pin mode is not available on the selected board." #endif -#if BOTH(ENDSTOPPULLUPS, ENDSTOPPULLDOWNS) +#if ENABLED(ENDSTOPPULLUPS) && ENABLED(ENDSTOPPULLDOWNS) #error "Enable only one of ENDSTOPPULLUPS or ENDSTOPPULLDOWNS." -#elif BOTH(FIL_RUNOUT_PULLUP, FIL_RUNOUT_PULLDOWN) +#elif ENABLED(FIL_RUNOUT_PULLUP) && ENABLED(FIL_RUNOUT_PULLDOWN) #error "Enable only one of FIL_RUNOUT_PULLUP or FIL_RUNOUT_PULLDOWN." -#elif BOTH(ENDSTOPPULLUP_XMAX, ENDSTOPPULLDOWN_XMAX) +#elif ENABLED(ENDSTOPPULLUP_XMAX) && ENABLED(ENDSTOPPULLDOWN_XMAX) #error "Enable only one of ENDSTOPPULLUP_X_MAX or ENDSTOPPULLDOWN_X_MAX." -#elif BOTH(ENDSTOPPULLUP_YMAX, ENDSTOPPULLDOWN_YMAX) +#elif ENABLED(ENDSTOPPULLUP_YMAX) && ENABLED(ENDSTOPPULLDOWN_YMAX) #error "Enable only one of ENDSTOPPULLUP_Y_MAX or ENDSTOPPULLDOWN_Y_MAX." -#elif BOTH(ENDSTOPPULLUP_ZMAX, ENDSTOPPULLDOWN_ZMAX) +#elif ENABLED(ENDSTOPPULLUP_ZMAX) && ENABLED(ENDSTOPPULLDOWN_ZMAX) #error "Enable only one of ENDSTOPPULLUP_Z_MAX or ENDSTOPPULLDOWN_Z_MAX." -#elif BOTH(ENDSTOPPULLUP_XMIN, ENDSTOPPULLDOWN_XMIN) +#elif ENABLED(ENDSTOPPULLUP_XMIN) && ENABLED(ENDSTOPPULLDOWN_XMIN) #error "Enable only one of ENDSTOPPULLUP_X_MIN or ENDSTOPPULLDOWN_X_MIN." -#elif BOTH(ENDSTOPPULLUP_YMIN, ENDSTOPPULLDOWN_YMIN) +#elif ENABLED(ENDSTOPPULLUP_YMIN) && ENABLED(ENDSTOPPULLDOWN_YMIN) #error "Enable only one of ENDSTOPPULLUP_Y_MIN or ENDSTOPPULLDOWN_Y_MIN." -#elif BOTH(ENDSTOPPULLUP_ZMIN, ENDSTOPPULLDOWN_ZMIN) +#elif ENABLED(ENDSTOPPULLUP_ZMIN) && ENABLED(ENDSTOPPULLDOWN_ZMIN) #error "Enable only one of ENDSTOPPULLUP_Z_MIN or ENDSTOPPULLDOWN_Z_MIN." #endif -/** - * LCD Info Screen Style - */ -#if LCD_INFO_SCREEN_STYLE > 0 - #if HAS_MARLINUI_U8GLIB || LCD_WIDTH < 20 || LCD_HEIGHT < 4 - #error "Alternative LCD_INFO_SCREEN_STYLE requires 20x4 Character LCD." - #elif LCD_INFO_SCREEN_STYLE > 1 - #error "LCD_INFO_SCREEN_STYLE only has options 0 and 1 at this time." - #endif -#endif - /** * Progress Bar */ #if ENABLED(LCD_PROGRESS_BAR) - #if NONE(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) + #if DISABLED(SDSUPPORT) && DISABLED(LCD_SET_PROGRESS_MANUALLY) #error "LCD_PROGRESS_BAR requires SDSUPPORT or LCD_SET_PROGRESS_MANUALLY." - #elif NONE(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) - #error "LCD_PROGRESS_BAR only applies to HD44780 character LCD and TFTGLCD_PANEL_(SPI|I2C)." - #elif HAS_MARLINUI_U8GLIB + #elif DISABLED(ULTRA_LCD) + #error "LCD_PROGRESS_BAR requires a character LCD." + #elif ENABLED(DOGLCD) #error "LCD_PROGRESS_BAR does not apply to graphical displays." #elif ENABLED(FILAMENT_LCD_DISPLAY) #error "LCD_PROGRESS_BAR and FILAMENT_LCD_DISPLAY are not fully compatible. Comment out this line to use both." - #elif PROGRESS_MSG_EXPIRE < 0 - #error "PROGRESS_MSG_EXPIRE must be greater than or equal to 0." #endif -#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_MARLINUI_U8GLIB, HAS_GRAPHICAL_TFT, HAS_MARLINUI_HD44780, EXTENSIBLE_UI) - #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Character LCD, Graphical LCD, TFT, or EXTENSIBLE_UI." -#endif - -#if !HAS_LCD_MENU && ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - #error "SD_REPRINT_LAST_SELECTED_FILE currently requires a Marlin-native LCD menu." +#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && DISABLED(DOGLCD) + #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR or Graphical LCD." #endif /** * Custom Boot and Status screens */ -#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE) - #error "SHOW_CUSTOM_BOOTSCREEN requires Graphical LCD or TOUCH_UI_FTDI_EVE." -#elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_MARLINUI_U8GLIB - #error "CUSTOM_STATUS_SCREEN_IMAGE requires a Graphical LCD." -#endif - -/** - * LCD Lightweight Screen Style - */ -#if ENABLED(LIGHTWEIGHT_UI) && DISABLED(U8GLIB_ST7920) - #error "LIGHTWEIGHT_UI requires a U8GLIB_ST7920-based display." +#if DISABLED(DOGLCD) && (ENABLED(SHOW_CUSTOM_BOOTSCREEN) || ENABLED(CUSTOM_STATUS_SCREEN_IMAGE)) + #error "Graphical LCD is required for SHOW_CUSTOM_BOOTSCREEN and CUSTOM_STATUS_SCREEN_IMAGE." #endif /** @@ -753,15 +482,11 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif #endif -#if defined(EVENT_GCODE_SD_ABORT) && DISABLED(NOZZLE_PARK_FEATURE) - static_assert(nullptr == strstr(EVENT_GCODE_SD_ABORT, "G27"), "NOZZLE_PARK_FEATURE is required to use G27 in EVENT_GCODE_SD_ABORT."); -#endif - /** * I2C Position Encoders */ #if ENABLED(I2C_POSITION_ENCODERS) - #if !BOTH(BABYSTEPPING, BABYSTEP_XY) + #if DISABLED(BABYSTEPPING) || DISABLED(BABYSTEP_XY) #error "I2C_POSITION_ENCODERS requires BABYSTEPPING and BABYSTEP_XY." #elif !WITHIN(I2CPE_ENCODER_CNT, 1, 5) #error "I2CPE_ENCODER_CNT must be between 1 and 5." @@ -774,40 +499,23 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(BABYSTEPPING) #if ENABLED(SCARA) #error "BABYSTEPPING is not implemented for SCARA yet." - #elif BOTH(MARKFORGED_XY, BABYSTEP_XY) - #error "BABYSTEPPING only implemented for Z axis on MarkForged." - #elif BOTH(DELTA, BABYSTEP_XY) + #elif ENABLED(DELTA) && ENABLED(BABYSTEP_XY) #error "BABYSTEPPING only implemented for Z axis on deltabots." - #elif BOTH(BABYSTEP_ZPROBE_OFFSET, MESH_BED_LEVELING) + #elif ENABLED(BABYSTEP_ZPROBE_OFFSET) && ENABLED(MESH_BED_LEVELING) #error "MESH_BED_LEVELING and BABYSTEP_ZPROBE_OFFSET is not a valid combination" #elif ENABLED(BABYSTEP_ZPROBE_OFFSET) && !HAS_BED_PROBE #error "BABYSTEP_ZPROBE_OFFSET requires a probe." - #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && !HAS_MARLINUI_U8GLIB + #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && DISABLED(DOGLCD) #error "BABYSTEP_ZPROBE_GFX_OVERLAY requires a Graphical LCD." #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && DISABLED(BABYSTEP_ZPROBE_OFFSET) #error "BABYSTEP_ZPROBE_GFX_OVERLAY requires a BABYSTEP_ZPROBE_OFFSET." - #elif ENABLED(BABYSTEP_HOTEND_Z_OFFSET) && !HAS_HOTEND_OFFSET - #error "BABYSTEP_HOTEND_Z_OFFSET requires 2 or more HOTENDS." - #elif BOTH(BABYSTEP_ALWAYS_AVAILABLE, MOVE_Z_WHEN_IDLE) - #error "BABYSTEP_ALWAYS_AVAILABLE and MOVE_Z_WHEN_IDLE are incompatible." - #elif !defined(BABYSTEP_MULTIPLICATOR_Z) - #error "BABYSTEPPING requires BABYSTEP_MULTIPLICATOR_Z." - #elif ENABLED(BABYSTEP_XY) && !defined(BABYSTEP_MULTIPLICATOR_XY) - #error "BABYSTEP_XY requires BABYSTEP_MULTIPLICATOR_XY." - #elif ENABLED(BABYSTEP_MILLIMETER_UNITS) - static_assert(BABYSTEP_MULTIPLICATOR_Z <= 0.1f, "BABYSTEP_MULTIPLICATOR_Z must be less or equal to 0.1mm."); - #if ENABLED(BABYSTEP_XY) - static_assert(BABYSTEP_MULTIPLICATOR_XY <= 0.25f, "BABYSTEP_MULTIPLICATOR_XY must be less than or equal to 0.25mm."); - #endif - #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) && ANY(TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI) - #error "New Color UI (TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI) does not support BABYSTEP_DISPLAY_TOTAL yet." #endif #endif /** * Filament Runout needs one or more pins and either SD Support or Auto print start detection */ -#if HAS_FILAMENT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) #if !PIN_EXISTS(FIL_RUNOUT) #error "FILAMENT_RUNOUT_SENSOR requires FIL_RUNOUT_PIN." #elif NUM_RUNOUT_SENSORS > E_STEPPERS @@ -820,14 +528,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 3 requires FIL_RUNOUT4_PIN." #elif NUM_RUNOUT_SENSORS > 4 && !PIN_EXISTS(FIL_RUNOUT5) #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 4 requires FIL_RUNOUT5_PIN." - #elif NUM_RUNOUT_SENSORS > 5 && !PIN_EXISTS(FIL_RUNOUT6) - #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 5 requires FIL_RUNOUT6_PIN." - #elif NONE(SDSUPPORT, PRINTJOB_TIMER_AUTOSTART) + #elif DISABLED(SDSUPPORT) && DISABLED(PRINTJOB_TIMER_AUTOSTART) #error "FILAMENT_RUNOUT_SENSOR requires SDSUPPORT or PRINTJOB_TIMER_AUTOSTART." - #elif FILAMENT_RUNOUT_DISTANCE_MM < 0 - #error "FILAMENT_RUNOUT_DISTANCE_MM must be greater than or equal to zero." #elif DISABLED(ADVANCED_PAUSE_FEATURE) - static_assert(nullptr == strstr(FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with FILAMENT_RUNOUT_SENSOR."); + static_assert(NULL == strstr(FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with FILAMENT_RUNOUT_SENSOR."); #endif #endif @@ -836,17 +540,15 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS */ #if ENABLED(ADVANCED_PAUSE_FEATURE) #if !HAS_RESUME_CONTINUE - #error "ADVANCED_PAUSE_FEATURE requires a supported LCD controller (or EMERGENCY_PARSER)." - #elif DISABLED(NOZZLE_PARK_FEATURE) - #error "ADVANCED_PAUSE_FEATURE requires NOZZLE_PARK_FEATURE." - #elif !defined(FILAMENT_UNLOAD_PURGE_FEEDRATE) - #error "ADVANCED_PAUSE_FEATURE requires FILAMENT_UNLOAD_PURGE_FEEDRATE. Please add it to Configuration_adv.h." + #error "ADVANCED_PAUSE_FEATURE currently requires an LCD controller or EMERGENCY_PARSER." #elif ENABLED(EXTRUDER_RUNOUT_PREVENT) #error "EXTRUDER_RUNOUT_PREVENT is incompatible with ADVANCED_PAUSE_FEATURE." - #elif ENABLED(PARK_HEAD_ON_PAUSE) && NONE(SDSUPPORT, NEWPANEL, EMERGENCY_PARSER) + #elif ENABLED(PARK_HEAD_ON_PAUSE) && DISABLED(SDSUPPORT) && DISABLED(NEWPANEL) && DISABLED(EMERGENCY_PARSER) #error "PARK_HEAD_ON_PAUSE requires SDSUPPORT, EMERGENCY_PARSER, or an LCD controller." #elif ENABLED(HOME_BEFORE_FILAMENT_CHANGE) && DISABLED(PAUSE_PARK_NO_STEPPER_TIMEOUT) #error "HOME_BEFORE_FILAMENT_CHANGE requires PAUSE_PARK_NO_STEPPER_TIMEOUT." + #elif DISABLED(NOZZLE_PARK_FEATURE) + #error "ADVANCED_PAUSE_FEATURE requires NOZZLE_PARK_FEATURE." #elif ENABLED(PREVENT_LENGTHY_EXTRUDE) && FILAMENT_CHANGE_UNLOAD_LENGTH > EXTRUDE_MAXLENGTH #error "FILAMENT_CHANGE_UNLOAD_LENGTH must be less than or equal to EXTRUDE_MAXLENGTH." #elif ENABLED(PREVENT_LENGTHY_EXTRUDE) && FILAMENT_CHANGE_SLOW_LOAD_LENGTH > EXTRUDE_MAXLENGTH @@ -859,54 +561,32 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if ENABLED(NOZZLE_PARK_FEATURE) constexpr float npp[] = NOZZLE_PARK_POINT; static_assert(COUNT(npp) == XYZ, "NOZZLE_PARK_POINT requires X, Y, and Z values."); - constexpr xyz_pos_t npp_xyz = NOZZLE_PARK_POINT; - static_assert(WITHIN(npp_xyz.x, X_MIN_POS, X_MAX_POS), "NOZZLE_PARK_POINT.X is out of bounds (X_MIN_POS, X_MAX_POS)."); - static_assert(WITHIN(npp_xyz.y, Y_MIN_POS, Y_MAX_POS), "NOZZLE_PARK_POINT.Y is out of bounds (Y_MIN_POS, Y_MAX_POS)."); - static_assert(WITHIN(npp_xyz.z, Z_MIN_POS, Z_MAX_POS), "NOZZLE_PARK_POINT.Z is out of bounds (Z_MIN_POS, Z_MAX_POS)."); #endif /** * Individual axis homing is useless for DELTAS */ -#if BOTH(INDIVIDUAL_AXIS_HOMING_MENU, DELTA) +#if ENABLED(INDIVIDUAL_AXIS_HOMING_MENU) && ENABLED(DELTA) #error "INDIVIDUAL_AXIS_HOMING_MENU is incompatible with DELTA kinematics." #endif /** * Options only for EXTRUDERS > 1 */ -#if HAS_MULTI_EXTRUDER +#if EXTRUDERS > 1 - #if EXTRUDERS > 8 - #error "Marlin supports a maximum of 8 EXTRUDERS." + #if EXTRUDERS > 5 + #error "Marlin supports a maximum of 5 EXTRUDERS." + #endif + + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + #error "EXTRUDERS must be 1 with TEMP_SENSOR_1_AS_REDUNDANT." #endif #if ENABLED(HEATERS_PARALLEL) #error "EXTRUDERS must be 1 with HEATERS_PARALLEL." #endif - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - #ifndef TOOLCHANGE_FS_LENGTH - #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_LENGTH. Please update your Configuration_adv.h." - #elif !defined(TOOLCHANGE_FS_RETRACT_SPEED) - #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_RETRACT_SPEED. Please update your Configuration_adv.h." - #elif !defined(TOOLCHANGE_FS_PRIME_SPEED) - #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_PRIME_SPEED. Please update your Configuration_adv.h." - #endif - #endif - - #if ENABLED(TOOLCHANGE_PARK) - #ifndef TOOLCHANGE_PARK_XY - #error "TOOLCHANGE_PARK requires TOOLCHANGE_PARK_XY. Please update your Configuration." - #elif !defined(TOOLCHANGE_PARK_XY_FEEDRATE) - #error "TOOLCHANGE_PARK requires TOOLCHANGE_PARK_XY_FEEDRATE. Please update your Configuration." - #endif - #endif - - #ifndef TOOLCHANGE_ZRAISE - #error "TOOLCHANGE_ZRAISE required for EXTRUDERS > 1. Please update your Configuration_adv.h." - #endif - #elif ENABLED(MK2_MULTIPLEXER) #error "MK2_MULTIPLEXER requires 2 or more EXTRUDERS." #elif ENABLED(SINGLENOZZLE) @@ -932,10 +612,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "SWITCHING_NOZZLE requires exactly 2 EXTRUDERS." #elif NUM_SERVOS < 1 #error "SWITCHING_NOZZLE requires NUM_SERVOS >= 1." - #endif - - #ifndef SWITCHING_NOZZLE_SERVO_NR - #error "SWITCHING_NOZZLE requires SWITCHING_NOZZLE_SERVO_NR." #elif SWITCHING_NOZZLE_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) #error "SERVO0_PIN must be defined for your SWITCHING_NOZZLE." #elif SWITCHING_NOZZLE_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) @@ -945,20 +621,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif SWITCHING_NOZZLE_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) #error "SERVO3_PIN must be defined for your SWITCHING_NOZZLE." #endif - - #ifdef SWITCHING_NOZZLE_E1_SERVO_NR - #if SWITCHING_NOZZLE_E1_SERVO_NR == SWITCHING_NOZZLE_SERVO_NR - #error "SWITCHING_NOZZLE_E1_SERVO_NR must be different from SWITCHING_NOZZLE_SERVO_NR." - #elif SWITCHING_NOZZLE_E1_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) - #error "SERVO0_PIN must be defined for your SWITCHING_NOZZLE." - #elif SWITCHING_NOZZLE_E1_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) - #error "SERVO1_PIN must be defined for your SWITCHING_NOZZLE." - #elif SWITCHING_NOZZLE_E1_SERVO_NR == 2 && !PIN_EXISTS(SERVO2) - #error "SERVO2_PIN must be defined for your SWITCHING_NOZZLE." - #elif SWITCHING_NOZZLE_E1_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) - #error "SERVO3_PIN must be defined for your SWITCHING_NOZZLE." - #endif - #endif #endif /** @@ -997,8 +659,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * Mixing Extruder requirements */ #if ENABLED(MIXING_EXTRUDER) - #if HAS_MULTI_EXTRUDER - #error "For MIXING_EXTRUDER set MIXING_STEPPERS > 1 instead of EXTRUDERS > 1." + #if EXTRUDERS > 1 + #error "MIXING_EXTRUDER currently only supports one extruder." #elif MIXING_STEPPERS < 2 #error "You must set MIXING_STEPPERS >= 2 for a mixing extruder." #elif ENABLED(FILAMENT_SENSOR) @@ -1007,6 +669,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "Please select either MIXING_EXTRUDER or SWITCHING_EXTRUDER, not both." #elif ENABLED(SINGLENOZZLE) #error "MIXING_EXTRUDER is incompatible with SINGLENOZZLE." + #elif ENABLED(LIN_ADVANCE) + #error "MIXING_EXTRUDER is incompatible with LIN_ADVANCE." #endif #endif @@ -1018,47 +682,32 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS WITHIN(LIN_ADVANCE_K, 0, 10), "LIN_ADVANCE_K must be a value from 0 to 10 (Changed in LIN_ADVANCE v1.5, Marlin 1.1.9)." ); - #if ENABLED(S_CURVE_ACCELERATION) && DISABLED(EXPERIMENTAL_SCURVE) - #error "LIN_ADVANCE and S_CURVE_ACCELERATION may not play well together! Enable EXPERIMENTAL_SCURVE to continue." - #endif #endif /** - * Special tool-changing options + * Parking Extruder requirements */ -#if 1 < 0 \ - + ENABLED(SINGLENOZZLE) \ - + ENABLED(DUAL_X_CARRIAGE) \ - + ENABLED(PARKING_EXTRUDER) \ - + ENABLED(MAGNETIC_PARKING_EXTRUDER) \ - + ENABLED(SWITCHING_TOOLHEAD) \ - + ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) \ - + ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) - #error "Please select only one of SINGLENOZZLE, DUAL_X_CARRIAGE, PARKING_EXTRUDER, SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, or ELECTROMAGNETIC_SWITCHING_TOOLHEAD." -#endif - -/** - * (Magnetic) Parking Extruder requirements - */ -#if ANY(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) - #if ENABLED(EXT_SOLENOID) - #error "(MAGNETIC_)PARKING_EXTRUDER and EXT_SOLENOID are incompatible. (Pins are used twice.)" +#if ENABLED(PARKING_EXTRUDER) + #if ENABLED(DUAL_X_CARRIAGE) + #error "PARKING_EXTRUDER and DUAL_X_CARRIAGE are incompatible." + #elif ENABLED(SINGLENOZZLE) + #error "PARKING_EXTRUDER and SINGLENOZZLE are incompatible." + #elif ENABLED(EXT_SOLENOID) + #error "PARKING_EXTRUDER and EXT_SOLENOID are incompatible. (Pins are used twice.)" #elif EXTRUDERS != 2 - #error "(MAGNETIC_)PARKING_EXTRUDER requires exactly 2 EXTRUDERS." + #error "PARKING_EXTRUDER requires exactly 2 EXTRUDERS." + #elif !PIN_EXISTS(SOL0) || !PIN_EXISTS(SOL1) + #error "PARKING_EXTRUDER requires SOL0_PIN and SOL1_PIN." #elif !defined(PARKING_EXTRUDER_PARKING_X) - #error "(MAGNETIC_)PARKING_EXTRUDER requires PARKING_EXTRUDER_PARKING_X." - #elif !defined(TOOLCHANGE_ZRAISE) - #error "(MAGNETIC_)PARKING_EXTRUDER requires TOOLCHANGE_ZRAISE." - #elif TOOLCHANGE_ZRAISE < 0 - #error "TOOLCHANGE_ZRAISE must be 0 or higher." - #elif ENABLED(PARKING_EXTRUDER) - #if !PINS_EXIST(SOL0, SOL1) - #error "PARKING_EXTRUDER requires SOL0_PIN and SOL1_PIN." - #elif !defined(PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE) || !WITHIN(PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE, LOW, HIGH) - #error "PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE must be defined as HIGH or LOW." - #elif !defined(PARKING_EXTRUDER_SOLENOIDS_DELAY) || !WITHIN(PARKING_EXTRUDER_SOLENOIDS_DELAY, 0, 2000) - #error "PARKING_EXTRUDER_SOLENOIDS_DELAY must be between 0 and 2000 (ms)." - #endif + #error "PARKING_EXTRUDER requires PARKING_EXTRUDER_PARKING_X." + #elif !defined(PARKING_EXTRUDER_SECURITY_RAISE) + #error "PARKING_EXTRUDER requires PARKING_EXTRUDER_SECURITY_RAISE." + #elif PARKING_EXTRUDER_SECURITY_RAISE < 0 + #error "PARKING_EXTRUDER_SECURITY_RAISE must be 0 or higher." + #elif !defined(PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE) || !WITHIN(PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE, LOW, HIGH) + #error "PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE must be defined as HIGH or LOW." + #elif !defined(PARKING_EXTRUDER_SOLENOIDS_DELAY) || !WITHIN(PARKING_EXTRUDER_SOLENOIDS_DELAY, 0, 2000) + #error "PARKING_EXTRUDER_SOLENOIDS_DELAY must be between 0 and 2000 (ms)." #endif #endif @@ -1066,7 +715,13 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * Switching Toolhead requirements */ #if ENABLED(SWITCHING_TOOLHEAD) - #ifndef SWITCHING_TOOLHEAD_SERVO_NR + #if ENABLED(DUAL_X_CARRIAGE) + #error "SWITCHING_TOOLHEAD and DUAL_X_CARRIAGE are incompatible." + #elif ENABLED(SINGLENOZZLE) + #error "SWITCHING_TOOLHEAD and SINGLENOZZLE are incompatible." + #elif ENABLED(PARKING_EXTRUDER) + #error "SWITCHING_TOOLHEAD and PARKING_EXTRUDER are incompatible." + #elif !defined(SWITCHING_TOOLHEAD_SERVO_NR) #error "SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_SERVO_NR." #elif EXTRUDERS < 2 #error "SWITCHING_TOOLHEAD requires at least 2 EXTRUDERS." @@ -1080,31 +735,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif SWITCHING_TOOLHEAD_SERVO_NR == 3 #error "A SWITCHING_TOOLHEAD_SERVO_NR of 3 requires NUM_SERVOS >= 4." #endif - #elif !defined(TOOLCHANGE_ZRAISE) - #error "SWITCHING_TOOLHEAD requires TOOLCHANGE_ZRAISE." - #elif TOOLCHANGE_ZRAISE < 0 - #error "TOOLCHANGE_ZRAISE must be 0 or higher." - #endif -#endif - -/** - * (Electro)magnetic Switching Toolhead requirements - */ -#if EITHER(MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) - #ifndef SWITCHING_TOOLHEAD_Y_POS - #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Y_POS" - #elif !defined(SWITCHING_TOOLHEAD_X_POS) - #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_X_POS" - #elif !defined(SWITCHING_TOOLHEAD_Z_HOP) - #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Z_HOP." - #elif !defined(SWITCHING_TOOLHEAD_Y_CLEAR) - #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Y_CLEAR." - #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) - #if ENABLED(EXT_SOLENOID) - #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD and EXT_SOLENOID are incompatible. (Pins are used twice.)" - #elif !PIN_EXISTS(SOL0) - #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SOL0_PIN." - #endif + #elif !defined(SWITCHING_TOOLHEAD_SECURITY_RAISE) + #error "SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_SECURITY_RAISE." + #elif SWITCHING_TOOLHEAD_SECURITY_RAISE < 0 + #error "SWITCHING_TOOLHEAD _SECURITY_RAISE must be 0 or higher." #endif #endif @@ -1119,17 +753,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "FANMUX0_PIN and FANMUX1_PIN must be set before FANMUX2_PIN can be set." #endif -/** - * Limited user-controlled fans - */ -#if NUM_M106_FANS > FAN_COUNT - #error "The selected board doesn't support enough user-controlled fans. Reduce NUM_M106_FANS." -#endif - /** * Limited number of servos */ -#if NUM_SERVOS > NUM_SERVO_PLUGS +#if NUM_SERVOS > MAX_SERVOS #error "The selected board doesn't support enough servos for your configuration. Reduce NUM_SERVOS." #endif @@ -1143,14 +770,14 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Required LCD language */ -#if HAS_MARLINUI_HD44780 && !defined(DISPLAY_CHARSET_HD44780) +#if DISABLED(DOGLCD) && ENABLED(ULTRA_LCD) && !defined(DISPLAY_CHARSET_HD44780) #error "You must set DISPLAY_CHARSET_HD44780 to JAPANESE, WESTERN or CYRILLIC for your LCD controller." #endif /** * Bed Heating Options - PID vs Limit Switching */ -#if BOTH(PIDTEMPBED, BED_LIMIT_SWITCHING) +#if ENABLED(PIDTEMPBED) && ENABLED(BED_LIMIT_SWITCHING) #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED." #endif @@ -1164,28 +791,26 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if 1 < 0 \ + ENABLED(DELTA) \ + ENABLED(MORGAN_SCARA) \ + + ENABLED(MAKERARM_SCARA) \ + ENABLED(COREXY) \ + ENABLED(COREXZ) \ + ENABLED(COREYZ) \ + ENABLED(COREYX) \ + ENABLED(COREZX) \ - + ENABLED(COREZY) \ - + ENABLED(MARKFORGED_XY) - #error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." + + ENABLED(COREZY) + #error "Please enable only one of DELTA, MORGAN_SCARA, MAKERARM_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, or COREZY." #endif /** * Delta requirements */ #if ENABLED(DELTA) - #if NONE(USE_XMAX_PLUG, USE_YMAX_PLUG, USE_ZMAX_PLUG) + #if DISABLED(USE_XMAX_PLUG) && DISABLED(USE_YMAX_PLUG) && DISABLED(USE_ZMAX_PLUG) #error "You probably want to use Max Endstops for DELTA!" #elif ENABLED(ENABLE_LEVELING_FADE_HEIGHT) && DISABLED(AUTO_BED_LEVELING_BILINEAR) && !UBL_SEGMENTED #error "ENABLE_LEVELING_FADE_HEIGHT on DELTA requires AUTO_BED_LEVELING_BILINEAR or AUTO_BED_LEVELING_UBL." - #elif ENABLED(DELTA_AUTO_CALIBRATION) && !(HAS_BED_PROBE || HAS_LCD_MENU) + #elif ENABLED(DELTA_AUTO_CALIBRATION) && !(HAS_BED_PROBE || ENABLED(ULTIPANEL)) #error "DELTA_AUTO_CALIBRATION requires a probe or LCD Controller." - #elif ENABLED(DELTA_CALIBRATION_MENU) && !HAS_LCD_MENU - #error "DELTA_CALIBRATION_MENU requires an LCD Controller." #elif ABL_GRID #if (GRID_MAX_POINTS_X & 1) == 0 || (GRID_MAX_POINTS_Y & 1) == 0 #error "DELTA requires GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y to be odd numbers." @@ -1195,13 +820,6 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif #endif -/** - * Junction deviation is incompatible with kinematic systems. - */ -#if HAS_JUNCTION_DEVIATION && IS_KINEMATIC - #error "CLASSIC_JERK is required for DELTA and SCARA." -#endif - /** * Probes */ @@ -1212,17 +830,12 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if 1 < 0 \ + ENABLED(PROBE_MANUALLY) \ + ENABLED(FIX_MOUNTED_PROBE) \ - + ENABLED(NOZZLE_AS_PROBE) \ + (HAS_Z_SERVO_PROBE && DISABLED(BLTOUCH)) \ - + ENABLED(BLTOUCH) && DISABLED(CREALITY_TOUCH) \ - + ENABLED(CREALITY_TOUCH) \ - + ENABLED(TOUCH_MI_PROBE) \ + + ENABLED(BLTOUCH) \ + ENABLED(SOLENOID_PROBE) \ + ENABLED(Z_PROBE_ALLEN_KEY) \ - + ENABLED(Z_PROBE_SLED) \ - + ENABLED(RACK_AND_PINION_PROBE) \ - + ENABLED(SENSORLESS_PROBING) - #error "Please enable only one probe option: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo." + + ENABLED(Z_PROBE_SLED) + #error "Please enable only one probe option: PROBE_MANUALLY, FIX_MOUNTED_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo." #endif #if HAS_BED_PROBE @@ -1230,7 +843,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Z_PROBE_SLED is incompatible with DELTA */ - #if BOTH(Z_PROBE_SLED, DELTA) + #if ENABLED(Z_PROBE_SLED) && ENABLED(DELTA) #error "You cannot use Z_PROBE_SLED with DELTA." #endif @@ -1249,10 +862,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * NUM_SERVOS is required for a Z servo probe */ #if HAS_Z_SERVO_PROBE - #if !NUM_SERVOS - #error "NUM_SERVOS is required for a Z servo probe (Z_PROBE_SERVO_NR)." - #elif Z_PROBE_SERVO_NR >= NUM_SERVOS - #error "Z_PROBE_SERVO_NR must be smaller than NUM_SERVOS." + #ifndef NUM_SERVOS + #error "You must set NUM_SERVOS for a Z servo probe (Z_PROBE_SERVO_NR)." #elif Z_PROBE_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) #error "SERVO0_PIN must be defined for your servo or BLTOUCH probe." #elif Z_PROBE_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) @@ -1261,85 +872,32 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "SERVO2_PIN must be defined for your servo or BLTOUCH probe." #elif Z_PROBE_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) #error "SERVO3_PIN must be defined for your servo or BLTOUCH probe." - #endif - #endif - - #if ENABLED(BLTOUCH) - #if BLTOUCH_DELAY < 200 - #error "BLTOUCH_DELAY less than 200 is unsafe and is not supported." - #elif DISABLED(BLTOUCH_SET_5V_MODE) && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN, ENDSTOPPULLUP_ZMIN_PROBE) - #error "BLTOUCH without BLTOUCH_SET_5V_MODE requires ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN or ENDSTOPPULLUP_ZMIN_PROBE." - #endif - #endif - - #if ENABLED(RACK_AND_PINION_PROBE) && !(defined(Z_PROBE_DEPLOY_X) && defined(Z_PROBE_RETRACT_X)) - #error "RACK_AND_PINION_PROBE requires Z_PROBE_DEPLOY_X and Z_PROBE_RETRACT_X." - #endif - - /** - * Touch-MI probe requirements - */ - #if ENABLED(TOUCH_MI_PROBE) - #if DISABLED(Z_SAFE_HOMING) - #error "TOUCH_MI_PROBE requires Z_SAFE_HOMING." - #elif !defined(TOUCH_MI_RETRACT_Z) - #error "TOUCH_MI_PROBE requires TOUCH_MI_RETRACT_Z." - #elif defined(Z_AFTER_PROBING) - #error "TOUCH_MI_PROBE requires Z_AFTER_PROBING to be disabled." - #elif Z_HOMING_HEIGHT < 10 - #error "TOUCH_MI_PROBE requires Z_HOMING_HEIGHT >= 10." - #elif Z_MIN_PROBE_ENDSTOP_INVERTING - #error "TOUCH_MI_PROBE requires Z_MIN_PROBE_ENDSTOP_INVERTING to be set to false." - #elif DISABLED(BABYSTEP_ZPROBE_OFFSET) - #error "TOUCH_MI_PROBE requires BABYSTEPPING with BABYSTEP_ZPROBE_OFFSET." - #elif !HAS_RESUME_CONTINUE - #error "TOUCH_MI_PROBE currently requires an LCD controller or EMERGENCY_PARSER." + #elif Z_PROBE_SERVO_NR >= NUM_SERVOS + #error "Z_PROBE_SERVO_NR must be smaller than NUM_SERVOS." #endif #endif /** * Require pin options and pins to be defined */ - #if ENABLED(SENSORLESS_PROBING) - #if ENABLED(DELTA) && !(AXIS_HAS_STALLGUARD(X) && AXIS_HAS_STALLGUARD(Y) && AXIS_HAS_STALLGUARD(Z)) - #error "SENSORLESS_PROBING requires TMC2130/2160/2209/5130/5160 drivers on X, Y, and Z." - #elif !AXIS_HAS_STALLGUARD(Z) - #error "SENSORLESS_PROBING requires a TMC2130/2160/2209/5130/5160 driver on Z." - #endif - #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - #if DISABLED(USE_ZMIN_PLUG) + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #if ENABLED(Z_MIN_PROBE_ENDSTOP) + #error "Enable only one option: Z_MIN_PROBE_ENDSTOP or Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN." + #elif DISABLED(USE_ZMIN_PLUG) #error "Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN requires USE_ZMIN_PLUG to be enabled." #elif !HAS_Z_MIN #error "Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN requires the Z_MIN_PIN to be defined." - #elif Z_MIN_PROBE_ENDSTOP_INVERTING != Z_MIN_ENDSTOP_INVERTING + #elif ENABLED(Z_MIN_PROBE_ENDSTOP_INVERTING) != ENABLED(Z_MIN_ENDSTOP_INVERTING) #error "Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN requires Z_MIN_ENDSTOP_INVERTING to match Z_MIN_PROBE_ENDSTOP_INVERTING." #endif - #elif !HAS_Z_MIN_PROBE_PIN - #error "Z_MIN_PROBE_PIN must be defined if Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN is not enabled." + #elif ENABLED(Z_MIN_PROBE_ENDSTOP) + #if !HAS_Z_MIN_PROBE_PIN + #error "Z_MIN_PROBE_ENDSTOP requires the Z_MIN_PROBE_PIN to be defined." + #endif + #else + #error "You must enable either Z_MIN_PROBE_ENDSTOP or Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN to use a probe." #endif - #if ENABLED(NOZZLE_AS_PROBE) - constexpr float sanity_nozzle_to_probe_offset[] = NOZZLE_TO_PROBE_OFFSET; - static_assert(sanity_nozzle_to_probe_offset[0] == 0.0 && sanity_nozzle_to_probe_offset[1] == 0.0, - "NOZZLE_AS_PROBE requires the X,Y offsets in NOZZLE_TO_PROBE_OFFSET to be 0,0."); - #endif - - #if DISABLED(NOZZLE_AS_PROBE) - static_assert(PROBING_MARGIN >= 0, "PROBING_MARGIN must be >= 0."); - static_assert(PROBING_MARGIN_BACK >= 0, "PROBING_MARGIN_BACK must be >= 0."); - static_assert(PROBING_MARGIN_FRONT >= 0, "PROBING_MARGIN_FRONT must be >= 0."); - static_assert(PROBING_MARGIN_LEFT >= 0, "PROBING_MARGIN_LEFT must be >= 0."); - static_assert(PROBING_MARGIN_RIGHT >= 0, "PROBING_MARGIN_RIGHT must be >= 0."); - #endif - - #define _MARGIN(A) TERN(IS_SCARA, SCARA_PRINTABLE_RADIUS, TERN(DELTA, DELTA_PRINTABLE_RADIUS, ((A##_BED_SIZE) / 2))) - static_assert(PROBING_MARGIN < _MARGIN(X), "PROBING_MARGIN is too large."); - static_assert(PROBING_MARGIN_BACK < _MARGIN(Y), "PROBING_MARGIN_BACK is too large."); - static_assert(PROBING_MARGIN_FRONT < _MARGIN(Y), "PROBING_MARGIN_FRONT is too large."); - static_assert(PROBING_MARGIN_LEFT < _MARGIN(X), "PROBING_MARGIN_LEFT is too large."); - static_assert(PROBING_MARGIN_RIGHT < _MARGIN(X), "PROBING_MARGIN_RIGHT is too large."); - #undef _MARGIN - /** * Make sure Z raise values are set */ @@ -1355,35 +913,28 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "Probes need Z_AFTER_PROBING >= 0." #endif - #if MULTIPLE_PROBING > 0 || EXTRA_PROBING > 0 - #if MULTIPLE_PROBING == 0 - #error "EXTRA_PROBING requires MULTIPLE_PROBING." - #elif MULTIPLE_PROBING < 2 - #error "MULTIPLE_PROBING must be 2 or more." - #elif MULTIPLE_PROBING <= EXTRA_PROBING - #error "EXTRA_PROBING must be less than MULTIPLE_PROBING." - #endif + #if MULTIPLE_PROBING && MULTIPLE_PROBING < 2 + #error "MULTIPLE_PROBING must be >= 2." #endif #if Z_PROBE_LOW_POINT > 0 #error "Z_PROBE_LOW_POINT must be less than or equal to 0." #endif - #if HOMING_Z_WITH_PROBE && IS_CARTESIAN && DISABLED(Z_SAFE_HOMING) - #error "Z_SAFE_HOMING is recommended when homing with a probe. Enable it or comment out this line to continue." - #endif + static_assert(int(X_PROBE_OFFSET_FROM_EXTRUDER) == (X_PROBE_OFFSET_FROM_EXTRUDER), "X_PROBE_OFFSET_FROM_EXTRUDER must be an integer value."); + static_assert(int(Y_PROBE_OFFSET_FROM_EXTRUDER) == (Y_PROBE_OFFSET_FROM_EXTRUDER), "Y_PROBE_OFFSET_FROM_EXTRUDER must be an integer value."); #else /** * Require some kind of probe for bed leveling and probe testing */ - #if HAS_ABL_NOT_UBL && !PROBE_SELECTED - #error "Auto Bed Leveling requires one of these: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or a Z Servo." + #if OLDSCHOOL_ABL && !PROBE_SELECTED + #error "Auto Bed Leveling requires one of these: PROBE_MANUALLY, FIX_MOUNTED_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or a Z Servo." #endif #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) - #error "Z_MIN_PROBE_REPEATABILITY_TEST requires a probe: FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo." + #error "Z_MIN_PROBE_REPEATABILITY_TEST requires a probe: FIX_MOUNTED_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo." #endif #endif @@ -1404,6 +955,15 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS * Bed Leveling Requirements */ +#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(AUTO_BED_LEVELING_3POINT) + static_assert(WITHIN(PROBE_PT_1_X, MIN_PROBE_X, MAX_PROBE_X), "PROBE_PT_1_X is outside the probe region."); + static_assert(WITHIN(PROBE_PT_2_X, MIN_PROBE_X, MAX_PROBE_X), "PROBE_PT_2_X is outside the probe region."); + static_assert(WITHIN(PROBE_PT_3_X, MIN_PROBE_X, MAX_PROBE_X), "PROBE_PT_3_X is outside the probe region."); + static_assert(WITHIN(PROBE_PT_1_Y, MIN_PROBE_Y, MAX_PROBE_Y), "PROBE_PT_1_Y is outside the probe region."); + static_assert(WITHIN(PROBE_PT_2_Y, MIN_PROBE_Y, MAX_PROBE_Y), "PROBE_PT_2_Y is outside the probe region."); + static_assert(WITHIN(PROBE_PT_3_Y, MIN_PROBE_Y, MAX_PROBE_Y), "PROBE_PT_3_Y is outside the probe region."); +#endif + #if ENABLED(AUTO_BED_LEVELING_UBL) /** @@ -1423,7 +983,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "AUTO_BED_LEVELING_UBL used to enable RESTORE_LEVELING_AFTER_G28. To keep this behavior enable RESTORE_LEVELING_AFTER_G28. Otherwise define it as 'false'." #endif -#elif HAS_ABL_NOT_UBL +#elif OLDSCHOOL_ABL /** * Auto Bed Leveling @@ -1436,6 +996,20 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "SCARA machines can only use the AUTO_BED_LEVELING_BILINEAR leveling option." #endif + /** + * Check auto bed leveling probe points + */ + #if ABL_GRID + + static_assert(LEFT_PROBE_BED_POSITION < RIGHT_PROBE_BED_POSITION, "LEFT_PROBE_BED_POSITION must be less than RIGHT_PROBE_BED_POSITION."); + static_assert(FRONT_PROBE_BED_POSITION < BACK_PROBE_BED_POSITION, "FRONT_PROBE_BED_POSITION must be less than BACK_PROBE_BED_POSITION."); + static_assert(LEFT_PROBE_BED_POSITION >= MIN_PROBE_X, "LEFT_PROBE_BED_POSITION is outside the probe region."); + static_assert(RIGHT_PROBE_BED_POSITION <= MAX_PROBE_X, "RIGHT_PROBE_BED_POSITION is outside the probe region."); + static_assert(FRONT_PROBE_BED_POSITION >= MIN_PROBE_Y, "FRONT_PROBE_BED_POSITION is outside the probe region."); + static_assert(BACK_PROBE_BED_POSITION <= MAX_PROBE_Y, "BACK_PROBE_BED_POSITION is outside the probe region."); + + #endif // AUTO_BED_LEVELING_3POINT + #elif ENABLED(MESH_BED_LEVELING) // Hide PROBE_MANUALLY from the rest of the code @@ -1453,37 +1027,27 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif -#if HAS_MESH && HAS_CLASSIC_JERK +#if HAS_MESH static_assert(DEFAULT_ZJERK > 0.1, "Low DEFAULT_ZJERK values are incompatible with mesh-based leveling."); +#elif ENABLED(G26_MESH_VALIDATION) + #error "G26_MESH_VALIDATION requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL." #endif -#if ENABLED(G26_MESH_VALIDATION) - #if !EXTRUDERS - #error "G26_MESH_VALIDATION requires at least one extruder." - #elif !HAS_MESH - #error "G26_MESH_VALIDATION requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL." - #endif -#endif - -#if ENABLED(MESH_EDIT_GFX_OVERLAY) && !BOTH(AUTO_BED_LEVELING_UBL, HAS_MARLINUI_U8GLIB) +#if ENABLED(MESH_EDIT_GFX_OVERLAY) && (DISABLED(AUTO_BED_LEVELING_UBL) || DISABLED(DOGLCD)) #error "MESH_EDIT_GFX_OVERLAY requires AUTO_BED_LEVELING_UBL and a Graphical LCD." #endif -#if ENABLED(G29_RETRY_AND_RECOVER) - #if ENABLED(AUTO_BED_LEVELING_UBL) - #error "G29_RETRY_AND_RECOVER is not compatible with UBL." - #elif ENABLED(MESH_BED_LEVELING) - #error "G29_RETRY_AND_RECOVER is not compatible with MESH_BED_LEVELING." - #endif +#if ENABLED(G29_RETRY_AND_RECOVER) && HAS_LEVELING && !OLDSCHOOL_ABL + #error "G29_RETRY_AND_RECOVER currently only supports ABL" #endif /** * LCD_BED_LEVELING requirements */ #if ENABLED(LCD_BED_LEVELING) - #if !HAS_LCD_MENU - #error "LCD_BED_LEVELING requires a programmable LCD controller." - #elif !(ENABLED(MESH_BED_LEVELING) || HAS_ABL_NOT_UBL) + #if DISABLED(ULTIPANEL) + #error "LCD_BED_LEVELING requires an LCD controller." + #elif !(ENABLED(MESH_BED_LEVELING) || OLDSCHOOL_ABL) #error "LCD_BED_LEVELING requires MESH_BED_LEVELING or AUTO_BED_LEVELING." #endif #endif @@ -1491,11 +1055,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Homing */ -constexpr float hbm[] = HOMING_BUMP_MM; -static_assert(COUNT(hbm) == XYZ, "HOMING_BUMP_MM requires X, Y, and Z elements."); -static_assert(hbm[X_AXIS] >= 0, "HOMING_BUMP_MM.X must be greater than or equal to 0."); -static_assert(hbm[Y_AXIS] >= 0, "HOMING_BUMP_MM.Y must be greater than or equal to 0."); -static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal to 0."); +#if X_HOME_BUMP_MM < 0 || Y_HOME_BUMP_MM < 0 || Z_HOME_BUMP_MM < 0 + #error "[XYZ]_HOME_BUMP_MM must be greater than or equal to 0." +#endif #if ENABLED(CODEPENDENT_XY_HOMING) #if ENABLED(QUICK_HOME) @@ -1509,18 +1071,23 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * Make sure Z_SAFE_HOMING point is reachable */ #if ENABLED(Z_SAFE_HOMING) - static_assert(WITHIN(Z_SAFE_HOMING_X_POINT, X_MIN_POS, X_MAX_POS), "Z_SAFE_HOMING_X_POINT can't be reached by the nozzle."); - static_assert(WITHIN(Z_SAFE_HOMING_Y_POINT, Y_MIN_POS, Y_MAX_POS), "Z_SAFE_HOMING_Y_POINT can't be reached by the nozzle."); -#endif + #if HAS_BED_PROBE + static_assert(WITHIN(Z_SAFE_HOMING_X_POINT, MIN_PROBE_X, MAX_PROBE_X), "Z_SAFE_HOMING_X_POINT is outside the probe region."); + static_assert(WITHIN(Z_SAFE_HOMING_Y_POINT, MIN_PROBE_Y, MAX_PROBE_Y), "Z_SAFE_HOMING_Y_POINT is outside the probe region."); + #else + static_assert(WITHIN(Z_SAFE_HOMING_X_POINT, X_MIN_POS, X_MAX_POS), "Z_SAFE_HOMING_X_POINT can't be reached by the nozzle."); + static_assert(WITHIN(Z_SAFE_HOMING_Y_POINT, Y_MIN_POS, Y_MAX_POS), "Z_SAFE_HOMING_Y_POINT can't be reached by the nozzle."); + #endif +#endif // Z_SAFE_HOMING /** * Make sure DISABLE_[XYZ] compatible with selected homing options */ -#if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z) - #if EITHER(HOME_AFTER_DEACTIVATE, Z_SAFE_HOMING) +#if ENABLED(DISABLE_X) || ENABLED(DISABLE_Y) || ENABLED(DISABLE_Z) + #if ENABLED(HOME_AFTER_DEACTIVATE) || ENABLED(Z_SAFE_HOMING) #error "DISABLE_[XYZ] is not compatible with HOME_AFTER_DEACTIVATE or Z_SAFE_HOMING." #endif -#endif +#endif // DISABLE_[XYZ] /** * Filament Width Sensor @@ -1533,32 +1100,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif #endif -/** - * System Power Sensor - */ -#if ENABLED(POWER_MONITOR_CURRENT) && !PIN_EXISTS(POWER_MONITOR_CURRENT) - #error "POWER_MONITOR_CURRENT requires a valid POWER_MONITOR_CURRENT_PIN." -#elif ENABLED(POWER_MONITOR_VOLTAGE) && !PIN_EXISTS(POWER_MONITOR_VOLTAGE) - #error "POWER_MONITOR_VOLTAGE requires POWER_MONITOR_VOLTAGE_PIN to be defined." -#elif BOTH(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) && POWER_MONITOR_CURRENT_PIN == POWER_MONITOR_VOLTAGE_PIN - #error "POWER_MONITOR_CURRENT_PIN and POWER_MONITOR_VOLTAGE_PIN must be different." -#endif - -/** - * Volumetric Extruder Limit - */ -#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - #if ENABLED(NO_VOLUMETRICS) - #error "VOLUMETRIC_EXTRUDER_LIMIT requires NO_VOLUMETRICS to be disabled." - #elif MIN_STEPS_PER_SEGMENT > 1 - #error "VOLUMETRIC_EXTRUDER_LIMIT is not compatible with MIN_STEPS_PER_SEGMENT greater than 1." - #endif -#endif - /** * ULTIPANEL encoder */ -#if ENABLED(ULTIPANEL) && NONE(NEWPANEL, SR_LCD_2W_NL) && !defined(SHIFT_CLK) +#if ENABLED(ULTIPANEL) && DISABLED(NEWPANEL) && DISABLED(SR_LCD_2W_NL) && !defined(SHIFT_CLK) #error "ULTIPANEL requires some kind of encoder." #endif @@ -1570,9 +1115,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * SAV_3DGLCD display options */ #if ENABLED(SAV_3DGLCD) - #if NONE(U8GLIB_SSD1306, U8GLIB_SH1106) + #if DISABLED(U8GLIB_SSD1306) && DISABLED(U8GLIB_SH1106) #error "Enable a SAV_3DGLCD display type: U8GLIB_SSD1306 or U8GLIB_SH1106." - #elif BOTH(U8GLIB_SSD1306, U8GLIB_SH1106) + #elif ENABLED(U8GLIB_SSD1306) && ENABLED(U8GLIB_SH1106) #error "Only enable one SAV_3DGLCD display type: U8GLIB_SSD1306 or U8GLIB_SH1106." #endif #endif @@ -1582,18 +1127,18 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * Deploying the Allen Key probe uses big moves in z direction. Too dangerous for an unhomed z-axis. */ #if ENABLED(Z_PROBE_ALLEN_KEY) && (Z_HOME_DIR < 0) && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - #error "You can't home to a z min endstop with a Z_PROBE_ALLEN_KEY." + #error "You can't home to a z min endstop with a Z_PROBE_ALLEN_KEY" #endif /** * Dual X Carriage requirements */ #if ENABLED(DUAL_X_CARRIAGE) - #if EXTRUDERS < 2 + #if EXTRUDERS == 1 #error "DUAL_X_CARRIAGE requires 2 (or more) extruders." - #elif ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) - #error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, COREZX, or MARKFORGED_XY." - #elif !GOOD_AXIS_PINS(X2) + #elif CORE_IS_XY || CORE_IS_XZ + #error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, or COREZX." + #elif !HAS_X2_ENABLE || !HAS_X2_STEP || !HAS_X2_DIR #error "DUAL_X_CARRIAGE requires X2 stepper pins to be defined." #elif !HAS_X_MAX #error "DUAL_X_CARRIAGE requires USE_XMAX_PLUG and an X Max Endstop." @@ -1602,9 +1147,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #elif X_HOME_DIR != -1 || X2_HOME_DIR != 1 #error "DUAL_X_CARRIAGE requires X_HOME_DIR -1 and X2_HOME_DIR 1." #endif -#endif - -#undef GOOD_AXIS_PINS +#endif // DUAL_X_CARRIAGE /** * Make sure auto fan pins don't conflict with the fan pin @@ -1642,54 +1185,32 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif /** - * Case Light requirements + * Test Heater, Temp Sensor, and Extruder Pins; Sensor Type must also be set. */ -#if ENABLED(CASE_LIGHT_ENABLE) - #if !PIN_EXISTS(CASE_LIGHT) - #error "CASE_LIGHT_ENABLE requires CASE_LIGHT_PIN to be defined." - #elif CASE_LIGHT_PIN == FAN_PIN - #error "CASE_LIGHT_PIN conflicts with FAN_PIN. Resolve before continuing." - #endif +#if !HAS_HEATER_0 + #error "HEATER_0_PIN not defined for this board." +#elif !PIN_EXISTS(TEMP_0) && !(defined(MAX6675_SS) && MAX6675_SS >= 0) + #error "TEMP_0_PIN not defined for this board." +#elif ((defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PIN_EXISTS(E0_STEP) || !PIN_EXISTS(E0_DIR))) + #error "E0_STEP_PIN or E0_DIR_PIN not defined for this board." +#elif ( !(defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PIN_EXISTS(E0_STEP) || !PIN_EXISTS(E0_DIR) || !PIN_EXISTS(E0_ENABLE))) + #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." +#elif TEMP_SENSOR_0 == 0 + #error "TEMP_SENSOR_0 is required." #endif -/** - * Required custom thermistor settings - */ -#if ENABLED(HEATER_0_USER_THERMISTOR) && !(defined(HOTEND0_PULLUP_RESISTOR_OHMS) && defined(HOTEND0_RESISTANCE_25C_OHMS) && defined(HOTEND0_BETA)) - #error "TEMP_SENSOR_0 1000 requires HOTEND0_PULLUP_RESISTOR_OHMS, HOTEND0_RESISTANCE_25C_OHMS and HOTEND0_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_1_USER_THERMISTOR) && !(defined(HOTEND1_PULLUP_RESISTOR_OHMS) && defined(HOTEND1_RESISTANCE_25C_OHMS) && defined(HOTEND1_BETA)) - #error "TEMP_SENSOR_1 1000 requires HOTEND1_PULLUP_RESISTOR_OHMS, HOTEND1_RESISTANCE_25C_OHMS and HOTEND1_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_2_USER_THERMISTOR) && !(defined(HOTEND2_PULLUP_RESISTOR_OHMS) && defined(HOTEND2_RESISTANCE_25C_OHMS) && defined(HOTEND2_BETA)) - #error "TEMP_SENSOR_2 1000 requires HOTEND2_PULLUP_RESISTOR_OHMS, HOTEND2_RESISTANCE_25C_OHMS and HOTEND2_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_3_USER_THERMISTOR) && !(defined(HOTEND3_PULLUP_RESISTOR_OHMS) && defined(HOTEND3_RESISTANCE_25C_OHMS) && defined(HOTEND3_BETA)) - #error "TEMP_SENSOR_3 1000 requires HOTEND3_PULLUP_RESISTOR_OHMS, HOTEND3_RESISTANCE_25C_OHMS and HOTEND3_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_4_USER_THERMISTOR) && !(defined(HOTEND4_PULLUP_RESISTOR_OHMS) && defined(HOTEND4_RESISTANCE_25C_OHMS) && defined(HOTEND4_BETA)) - #error "TEMP_SENSOR_4 1000 requires HOTEND4_PULLUP_RESISTOR_OHMS, HOTEND4_RESISTANCE_25C_OHMS and HOTEND4_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_5_USER_THERMISTOR) && !(defined(HOTEND5_PULLUP_RESISTOR_OHMS) && defined(HOTEND5_RESISTANCE_25C_OHMS) && defined(HOTEND5_BETA)) - #error "TEMP_SENSOR_5 1000 requires HOTEND5_PULLUP_RESISTOR_OHMS, HOTEND5_RESISTANCE_25C_OHMS and HOTEND5_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_6_USER_THERMISTOR) && !(defined(HOTEND6_PULLUP_RESISTOR_OHMS) && defined(HOTEND6_RESISTANCE_25C_OHMS) && defined(HOTEND6_BETA)) - #error "TEMP_SENSOR_6 1000 requires HOTEND6_PULLUP_RESISTOR_OHMS, HOTEND6_RESISTANCE_25C_OHMS and HOTEND6_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_7_USER_THERMISTOR) && !(defined(HOTEND7_PULLUP_RESISTOR_OHMS) && defined(HOTEND7_RESISTANCE_25C_OHMS) && defined(HOTEND7_BETA)) - #error "TEMP_SENSOR_7 1000 requires HOTEND7_PULLUP_RESISTOR_OHMS, HOTEND7_RESISTANCE_25C_OHMS and HOTEND7_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_BED_USER_THERMISTOR) && !(defined(BED_PULLUP_RESISTOR_OHMS) && defined(BED_RESISTANCE_25C_OHMS) && defined(BED_BETA)) - #error "TEMP_SENSOR_BED 1000 requires BED_PULLUP_RESISTOR_OHMS, BED_RESISTANCE_25C_OHMS and BED_BETA in Configuration_adv.h." -#elif ENABLED(HEATER_CHAMBER_USER_THERMISTOR) && !(defined(CHAMBER_PULLUP_RESISTOR_OHMS) && defined(CHAMBER_RESISTANCE_25C_OHMS) && defined(CHAMBER_BETA)) - #error "TEMP_SENSOR_CHAMBER 1000 requires CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS and CHAMBER_BETA in Configuration_adv.h." +// Pins are required for heaters +#if ENABLED(HEATER_0_USES_MAX6675) && !(defined(MAX6675_SS) && MAX6675_SS >= 0) + #error "MAX6675_SS (required for TEMP_SENSOR_0) not defined for this board." +#elif (HOTENDS > 1 || ENABLED(HEATERS_PARALLEL)) && !HAS_HEATER_1 + #error "HEATER_1_PIN not defined for this board." #endif -/** - * A Sensor ID has to be set for each heater - */ - -#if HAS_MULTI_HOTEND - #if ENABLED(HEATER_1_USES_MAX6675) && !PIN_EXISTS(MAX6675_SS2) - #error "MAX6675_SS2_PIN (required for TEMP_SENSOR_1) not defined for this board." - #elif TEMP_SENSOR_1 == 0 +#if HOTENDS > 1 + #if TEMP_SENSOR_1 == 0 #error "TEMP_SENSOR_1 is required with 2 or more HOTENDS." - #elif !ANY_PIN(TEMP_1, MAX6675_SS2) + #elif !PIN_EXISTS(TEMP_1) #error "TEMP_1_PIN not defined for this board." - #elif ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - #error "HOTENDS must be 1 with TEMP_SENSOR_1_AS_REDUNDANT." #endif #if HOTENDS > 2 #if TEMP_SENSOR_2 == 0 @@ -1709,70 +1230,19 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif #if HOTENDS > 4 #if TEMP_SENSOR_4 == 0 - #error "TEMP_SENSOR_4 is required with 5 or more HOTENDS." + #error "TEMP_SENSOR_4 is required with 5 HOTENDS." #elif !HAS_HEATER_4 #error "HEATER_4_PIN not defined for this board." #elif !PIN_EXISTS(TEMP_4) #error "TEMP_4_PIN not defined for this board." #endif - #if HOTENDS > 5 - #if TEMP_SENSOR_5 == 0 - #error "TEMP_SENSOR_5 is required with 6 HOTENDS." - #elif !HAS_HEATER_5 - #error "HEATER_5_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_5) - #error "TEMP_5_PIN not defined for this board." - #endif - #if HOTENDS > 6 - #if TEMP_SENSOR_6 == 0 - #error "TEMP_SENSOR_6 is required with 6 HOTENDS." - #elif !HAS_HEATER_6 - #error "HEATER_6_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_6) - #error "TEMP_6_PIN not defined for this board." - #endif - #if HOTENDS > 7 - #if TEMP_SENSOR_7 == 0 - #error "TEMP_SENSOR_7 is required with 7 HOTENDS." - #elif !HAS_HEATER_7 - #error "HEATER_7_PIN not defined for this board." - #elif !PIN_EXISTS(TEMP_7) - #error "TEMP_7_PIN not defined for this board." - #endif - #elif TEMP_SENSOR_7 != 0 - #error "TEMP_SENSOR_7 shouldn't be set with only 7 HOTENDS." - #endif - #elif TEMP_SENSOR_6 != 0 - #error "TEMP_SENSOR_6 shouldn't be set with only 6 HOTENDS." - #elif TEMP_SENSOR_7 != 0 - #error "TEMP_SENSOR_7 shouldn't be set with only 6 HOTENDS." - #endif - #elif TEMP_SENSOR_5 != 0 - #error "TEMP_SENSOR_5 shouldn't be set with only 5 HOTENDS." - #elif TEMP_SENSOR_6 != 0 - #error "TEMP_SENSOR_6 shouldn't be set with only 5 HOTENDS." - #elif TEMP_SENSOR_7 != 0 - #error "TEMP_SENSOR_7 shouldn't be set with only 5 HOTENDS." - #endif #elif TEMP_SENSOR_4 != 0 #error "TEMP_SENSOR_4 shouldn't be set with only 4 HOTENDS." - #elif TEMP_SENSOR_5 != 0 - #error "TEMP_SENSOR_5 shouldn't be set with only 4 HOTENDS." - #elif TEMP_SENSOR_6 != 0 - #error "TEMP_SENSOR_6 shouldn't be set with only 4 HOTENDS." - #elif TEMP_SENSOR_7 != 0 - #error "TEMP_SENSOR_7 shouldn't be set with only 4 HOTENDS." #endif #elif TEMP_SENSOR_3 != 0 #error "TEMP_SENSOR_3 shouldn't be set with only 3 HOTENDS." #elif TEMP_SENSOR_4 != 0 #error "TEMP_SENSOR_4 shouldn't be set with only 3 HOTENDS." - #elif TEMP_SENSOR_5 != 0 - #error "TEMP_SENSOR_5 shouldn't be set with only 3 HOTENDS." - #elif TEMP_SENSOR_6 != 0 - #error "TEMP_SENSOR_6 shouldn't be set with only 3 HOTENDS." - #elif TEMP_SENSOR_7 != 0 - #error "TEMP_SENSOR_7 shouldn't be set with only 3 HOTENDS." #endif #elif TEMP_SENSOR_2 != 0 #error "TEMP_SENSOR_2 shouldn't be set with only 2 HOTENDS." @@ -1780,12 +1250,6 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_3 shouldn't be set with only 2 HOTENDS." #elif TEMP_SENSOR_4 != 0 #error "TEMP_SENSOR_4 shouldn't be set with only 2 HOTENDS." - #elif TEMP_SENSOR_5 != 0 - #error "TEMP_SENSOR_5 shouldn't be set with only 2 HOTENDS." - #elif TEMP_SENSOR_6 != 0 - #error "TEMP_SENSOR_6 shouldn't be set with only 2 HOTENDS." - #elif TEMP_SENSOR_7 != 0 - #error "TEMP_SENSOR_7 shouldn't be set with only 2 HOTENDS." #endif #elif TEMP_SENSOR_1 != 0 && DISABLED(TEMP_SENSOR_1_AS_REDUNDANT) #error "TEMP_SENSOR_1 shouldn't be set with only 1 HOTEND." @@ -1795,88 +1259,16 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_3 shouldn't be set with only 1 HOTEND." #elif TEMP_SENSOR_4 != 0 #error "TEMP_SENSOR_4 shouldn't be set with only 1 HOTEND." -#elif TEMP_SENSOR_5 != 0 - #error "TEMP_SENSOR_5 shouldn't be set with only 1 HOTEND." -#elif TEMP_SENSOR_6 != 0 - #error "TEMP_SENSOR_6 shouldn't be set with only 1 HOTEND." -#elif TEMP_SENSOR_7 != 0 - #error "TEMP_SENSOR_7 shouldn't be set with only 1 HOTEND." -#endif - -#if TEMP_SENSOR_CHAMBER && !PIN_EXISTS(TEMP_CHAMBER) - #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN. Please add it to your configuration." -#endif - -#if ENABLED(CHAMBER_FAN) && !(defined(CHAMBER_FAN_MODE) && WITHIN(CHAMBER_FAN_MODE, 0, 2)) - #error "CHAMBER_FAN_MODE must be between 0 and 2. Please update your Configuration_adv.h." -#endif - -#if ENABLED(CHAMBER_VENT) - #ifndef CHAMBER_VENT_SERVO_NR - #error "CHAMBER_VENT_SERVO_NR is required for CHAMBER SERVO. Update your Configuration_adv.h." - #elif !NUM_SERVOS - #error "NUM_SERVOS is required for a Heated Chamber vent servo (CHAMBER_VENT_SERVO_NR)." - #elif CHAMBER_VENT_SERVO_NR >= NUM_SERVOS - #error "CHAMBER_VENT_SERVO_NR must be smaller than NUM_SERVOS." - #elif HAS_Z_SERVO_PROBE && CHAMBER_VENT_SERVO_NR == Z_PROBE_SERVO_NR - #error "CHAMBER SERVO is already used by BLTOUCH. Please change." - #elif CHAMBER_VENT_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) - #error "SERVO0_PIN must be defined for your Heated Chamber vent servo." - #elif CHAMBER_VENT_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) - #error "SERVO1_PIN must be defined for your Heated Chamber vent servo." - #elif CHAMBER_VENT_SERVO_NR == 2 && !PIN_EXISTS(SERVO2) - #error "SERVO2_PIN must be defined for your Heated Chamber vent servo." - #elif CHAMBER_VENT_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) - #error "SERVO3_PIN must be defined for your Heated Chamber vent servo." - #endif -#endif - -#if TEMP_SENSOR_PROBE - #if !PIN_EXISTS(TEMP_PROBE) - #error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN. Please add it to your configuration." - #elif !HAS_TEMP_ADC_PROBE - #error "TEMP_PROBE_PIN must be an ADC pin." - #elif !ENABLED(FIX_MOUNTED_PROBE) - #error "TEMP_SENSOR_PROBE shouldn't be set without FIX_MOUNTED_PROBE." - #endif #endif #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) && TEMP_SENSOR_1 == 0 #error "TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT." #endif -#if ENABLED(MAX6675_IS_MAX31865) && (!defined(MAX31865_SENSOR_OHMS) || !defined(MAX31865_CALIBRATION_OHMS)) - #error "MAX31865_SENSOR_OHMS and MAX31865_CALIBRATION_OHMS must be set in Configuration.h when using a MAX31865 temperature sensor." -#endif - -/** - * Test Heater, Temp Sensor, and Extruder Pins - */ -#if !HAS_HEATER_0 && EXTRUDERS - #error "HEATER_0_PIN not defined for this board." -#elif !ANY_PIN(TEMP_0, MAX6675_SS) - #error "TEMP_0_PIN not defined for this board." -#elif ((defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && !PINS_EXIST(E0_STEP, E0_DIR)) - #error "E0_STEP_PIN or E0_DIR_PIN not defined for this board." -#elif ( !(defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)) && (!PINS_EXIST(E0_STEP, E0_DIR) || !HAS_E0_ENABLE)) - #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." -#elif EXTRUDERS && TEMP_SENSOR_0 == 0 - #error "TEMP_SENSOR_0 is required if there are any extruders." -#endif - -// Pins are required for heaters -#if ENABLED(HEATER_0_USES_MAX6675) && !PIN_EXISTS(MAX6675_SS) - #error "MAX6675_SS_PIN (required for TEMP_SENSOR_0) not defined for this board." -#elif HAS_HOTEND && !HAS_TEMP_HOTEND - #error "TEMP_0_PIN (required for TEMP_SENSOR_0) not defined for this board." -#elif EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 - #error "HEATER_1_PIN is not defined. TEMP_SENSOR_1 might not be set, or the board (not EEB / EEF?) doesn't define a pin." -#endif - /** * Temperature status LEDs */ -#if ENABLED(TEMP_STAT_LEDS) && !ANY_PIN(STAT_LED_RED, STAT_LED_BLUE) +#if ENABLED(TEMP_STAT_LEDS) && !PIN_EXISTS(STAT_LED_RED) && !PIN_EXISTS(STAT_LED_BLUE) #error "TEMP_STAT_LEDS requires STAT_LED_RED_PIN or STAT_LED_BLUE_PIN, preferably both." #endif @@ -1884,30 +1276,23 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * LED Control Menu */ #if ENABLED(LED_CONTROL_MENU) && !HAS_COLOR_LEDS - #error "LED_CONTROL_MENU requires BLINKM, RGB_LED, RGBW_LED, PCA9533, PCA9632, or NEOPIXEL_LED." + #error "LED_CONTROL_MENU requires BLINKM, RGB_LED, RGBW_LED, PCA9632, or NEOPIXEL_LED." #endif /** - * LED Backlight Timeout + * Basic 2-nozzle duplication mode */ -#if defined(LED_BACKLIGHT_TIMEOUT) && !(ENABLED(PSU_CONTROL) && EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1)) - #error "LED_BACKLIGHT_TIMEOUT requires a FYSETC Mini Panel and a Power Switch." -#endif - -/** - * Basic multi hotend duplication mode - */ -#if ENABLED(MULTI_NOZZLE_DUPLICATION) - #if HOTENDS < 2 - #error "MULTI_NOZZLE_DUPLICATION requires 2 or more hotends." +#if ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + #if HOTENDS != 2 + #error "DUAL_NOZZLE_DUPLICATION_MODE requires exactly 2 hotends." #elif ENABLED(DUAL_X_CARRIAGE) - #error "MULTI_NOZZLE_DUPLICATION is incompatible with DUAL_X_CARRIAGE." + #error "DUAL_NOZZLE_DUPLICATION_MODE is incompatible with DUAL_X_CARRIAGE." #elif ENABLED(SINGLENOZZLE) - #error "MULTI_NOZZLE_DUPLICATION is incompatible with SINGLENOZZLE." + #error "DUAL_NOZZLE_DUPLICATION_MODE is incompatible with SINGLENOZZLE." #elif ENABLED(MIXING_EXTRUDER) - #error "MULTI_NOZZLE_DUPLICATION is incompatible with MIXING_EXTRUDER." + #error "DUAL_NOZZLE_DUPLICATION_MODE is incompatible with MIXING_EXTRUDER." #elif ENABLED(SWITCHING_EXTRUDER) - #error "MULTI_NOZZLE_DUPLICATION is incompatible with SWITCHING_EXTRUDER." + #error "DUAL_NOZZLE_DUPLICATION_MODE is incompatible with SWITCHING_EXTRUDER." #endif #endif @@ -1915,56 +1300,30 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * Test Extruder Stepper Pins */ #if DISABLED(MK2_MULTIPLEXER) // MK2_MULTIPLEXER uses E0 stepper only - #if E_STEPPERS - #if !(PINS_EXIST(E0_STEP, E0_DIR) && HAS_E0_ENABLE) - #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." + #if E_STEPPERS > 4 + #if !PIN_EXISTS(E4_STEP) || !PIN_EXISTS(E4_DIR) || !PIN_EXISTS(E4_ENABLE) + #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." #endif - #if E_STEPPERS > 1 - #if !(PINS_EXIST(E1_STEP, E1_DIR) && HAS_E1_ENABLE) - #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." - #endif - #if E_STEPPERS > 2 - #if !(PINS_EXIST(E2_STEP, E2_DIR) && HAS_E2_ENABLE) - #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." - #endif - #if E_STEPPERS > 3 - #if !(PINS_EXIST(E3_STEP, E3_DIR) && HAS_E3_ENABLE) - #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." - #endif - #if E_STEPPERS > 4 - #if !(PINS_EXIST(E4_STEP, E4_DIR) && HAS_E4_ENABLE) - #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." - #endif - #if E_STEPPERS > 5 - #if !(PINS_EXIST(E5_STEP, E5_DIR) && HAS_E5_ENABLE) - #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board." - #endif - #if E_STEPPERS > 6 - #if !(PINS_EXIST(E6_STEP, E6_DIR) && HAS_E6_ENABLE) - #error "E6_STEP_PIN, E6_DIR_PIN, or E6_ENABLE_PIN not defined for this board." - #endif - #if E_STEPPERS > 7 - #if !(PINS_EXIST(E7_STEP, E7_DIR) && HAS_E7_ENABLE) - #error "E7_STEP_PIN, E7_DIR_PIN, or E7_ENABLE_PIN not defined for this board." - #endif - #endif // E_STEPPERS > 7 - #endif // E_STEPPERS > 6 - #endif // E_STEPPERS > 5 - #endif // E_STEPPERS > 4 - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - #endif // E_STEPPERS + #elif E_STEPPERS > 3 + #if !PIN_EXISTS(E3_STEP) || !PIN_EXISTS(E3_DIR) || !PIN_EXISTS(E3_ENABLE) + #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." + #endif + #elif E_STEPPERS > 2 + #if !PIN_EXISTS(E2_STEP) || !PIN_EXISTS(E2_DIR) || !PIN_EXISTS(E2_ENABLE) + #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." + #endif + #elif E_STEPPERS > 1 + #if !PIN_EXISTS(E1_STEP) || !PIN_EXISTS(E1_DIR) || !PIN_EXISTS(E1_ENABLE) + #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." + #endif + #endif #endif - /** * Endstop Tests */ -#define _PLUG_UNUSED_TEST(A,P) (DISABLED(USE_##P##MIN_PLUG, USE_##P##MAX_PLUG) \ - && !(ENABLED(A##_DUAL_ENDSTOPS) && WITHIN(A##2_USE_ENDSTOP, _##P##MAX_, _##P##MIN_)) \ - && !(ENABLED(A##_MULTI_ENDSTOPS) && WITHIN(A##2_USE_ENDSTOP, _##P##MAX_, _##P##MIN_)) ) -#define _AXIS_PLUG_UNUSED_TEST(A) (_PLUG_UNUSED_TEST(A,X) && _PLUG_UNUSED_TEST(A,Y) && _PLUG_UNUSED_TEST(A,Z)) +#define _PLUG_UNUSED_TEST(AXIS,PLUG) (DISABLED(USE_##PLUG##MIN_PLUG) && DISABLED(USE_##PLUG##MAX_PLUG) && !(ENABLED(AXIS##_DUAL_ENDSTOPS) && WITHIN(AXIS##2_USE_ENDSTOP, _##PLUG##MAX_, _##PLUG##MIN_))) +#define _AXIS_PLUG_UNUSED_TEST(AXIS) (_PLUG_UNUSED_TEST(AXIS,X) && _PLUG_UNUSED_TEST(AXIS,Y) && _PLUG_UNUSED_TEST(AXIS,Z)) // At least 3 endstop plugs must be used #if _AXIS_PLUG_UNUSED_TEST(X) @@ -1989,17 +1348,13 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "Enable USE_YMAX_PLUG when homing Y to MAX." #endif #endif - -// Z homing direction and plug usage flags -#if Z_HOME_DIR < 0 && NONE(USE_ZMIN_PLUG, HOMING_Z_WITH_PROBE) +#if Z_HOME_DIR < 0 && DISABLED(USE_ZMIN_PLUG) #error "Enable USE_ZMIN_PLUG when homing Z to MIN." -#elif Z_HOME_DIR > 0 && ENABLED(USE_PROBE_FOR_Z_HOMING) - #error "Z_HOME_DIR must be -1 when homing Z with the probe." #elif Z_HOME_DIR > 0 && DISABLED(USE_ZMAX_PLUG) #error "Enable USE_ZMAX_PLUG when homing Z to MAX." #endif -// Dual/multiple endstops requirements +// Dual endstops requirements #if ENABLED(X_DUAL_ENDSTOPS) #if !X2_USE_ENDSTOP #error "You must set X2_USE_ENDSTOP with X_DUAL_ENDSTOPS." @@ -2042,10 +1397,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "Y_DUAL_ENDSTOPS is not compatible with DELTA." #endif #endif - -#if ENABLED(Z_MULTI_ENDSTOPS) +#if ENABLED(Z_DUAL_ENDSTOPS) #if !Z2_USE_ENDSTOP - #error "You must set Z2_USE_ENDSTOP with Z_MULTI_ENDSTOPS when NUM_Z_STEPPER_DRIVERS >= 2." + #error "You must set Z2_USE_ENDSTOP with Z_DUAL_ENDSTOPS." #elif Z2_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) #error "USE_XMIN_PLUG is required when Z2_USE_ENDSTOP is _XMIN_." #elif Z2_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) @@ -2061,56 +1415,14 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #elif !HAS_Z2_MIN && !HAS_Z2_MAX #error "Z2_USE_ENDSTOP has been assigned to a nonexistent endstop!" #elif ENABLED(DELTA) - #error "Z_MULTI_ENDSTOPS is not compatible with DELTA." + #error "Z_DUAL_ENDSTOPS is not compatible with DELTA." #endif - #if NUM_Z_STEPPER_DRIVERS >= 3 - #if !Z3_USE_ENDSTOP - #error "You must set Z3_USE_ENDSTOP with Z_MULTI_ENDSTOPS when NUM_Z_STEPPER_DRIVERS >= 3." - #elif Z3_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) - #error "USE_XMIN_PLUG is required when Z3_USE_ENDSTOP is _XMIN_." - #elif Z3_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) - #error "USE_XMAX_PLUG is required when Z3_USE_ENDSTOP is _XMAX_." - #elif Z3_USE_ENDSTOP == _YMIN_ && DISABLED(USE_YMIN_PLUG) - #error "USE_YMIN_PLUG is required when Z3_USE_ENDSTOP is _YMIN_." - #elif Z3_USE_ENDSTOP == _YMAX_ && DISABLED(USE_YMAX_PLUG) - #error "USE_YMAX_PLUG is required when Z3_USE_ENDSTOP is _YMAX_." - #elif Z3_USE_ENDSTOP == _ZMIN_ && DISABLED(USE_ZMIN_PLUG) - #error "USE_ZMIN_PLUG is required when Z3_USE_ENDSTOP is _ZMIN_." - #elif Z3_USE_ENDSTOP == _ZMAX_ && DISABLED(USE_ZMAX_PLUG) - #error "USE_ZMAX_PLUG is required when Z3_USE_ENDSTOP is _ZMAX_." - #elif !HAS_Z3_MIN && !HAS_Z3_MAX - #error "Z3_USE_ENDSTOP has been assigned to a nonexistent endstop!" - #endif - #endif - #if NUM_Z_STEPPER_DRIVERS >= 4 - #if !Z4_USE_ENDSTOP - #error "You must set Z4_USE_ENDSTOP with Z_MULTI_ENDSTOPS when NUM_Z_STEPPER_DRIVERS >= 4." - #elif Z4_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) - #error "USE_XMIN_PLUG is required when Z4_USE_ENDSTOP is _XMIN_." - #elif Z4_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) - #error "USE_XMAX_PLUG is required when Z4_USE_ENDSTOP is _XMAX_." - #elif Z4_USE_ENDSTOP == _YMIN_ && DISABLED(USE_YMIN_PLUG) - #error "USE_YMIN_PLUG is required when Z4_USE_ENDSTOP is _YMIN_." - #elif Z4_USE_ENDSTOP == _YMAX_ && DISABLED(USE_YMAX_PLUG) - #error "USE_YMAX_PLUG is required when Z4_USE_ENDSTOP is _YMAX_." - #elif Z4_USE_ENDSTOP == _ZMIN_ && DISABLED(USE_ZMIN_PLUG) - #error "USE_ZMIN_PLUG is required when Z4_USE_ENDSTOP is _ZMIN_." - #elif Z4_USE_ENDSTOP == _ZMAX_ && DISABLED(USE_ZMAX_PLUG) - #error "USE_ZMAX_PLUG is required when Z4_USE_ENDSTOP is _ZMAX_." - #elif !HAS_Z4_MIN && !HAS_Z4_MAX - #error "Z4_USE_ENDSTOP has been assigned to a nonexistent endstop!" - #endif - #endif -#endif - -#if defined(ENDSTOP_NOISE_THRESHOLD) && !WITHIN(ENDSTOP_NOISE_THRESHOLD, 2, 7) - #error "ENDSTOP_NOISE_THRESHOLD must be an integer from 2 to 7." #endif /** - * Emergency Command Parser + * emergency-command parser */ -#if BOTH(IS_AT90USB, EMERGENCY_PARSER) +#if ENABLED(EMERGENCY_PARSER) && defined(__AVR__) && defined(USBCON) #error "EMERGENCY_PARSER does not work on boards with AT90USB processors (USBCON)." #endif @@ -2125,13 +1437,6 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #endif #endif -/** - * G35 Assisted Tramming - */ -#if ENABLED(ASSISTED_TRAMMING) && !HAS_BED_PROBE - #error "ASSISTED_TRAMMING requires a bed probe." -#endif - /** * G38 Probe Target */ @@ -2146,10 +1451,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * RGB_LED Requirements */ -#define _RGB_TEST (PINS_EXIST(RGB_LED_R, RGB_LED_G, RGB_LED_B)) -#if ENABLED(PRINTER_EVENT_LEDS) && !HAS_COLOR_LEDS - #error "PRINTER_EVENT_LEDS requires BLINKM, PCA9533, PCA9632, RGB_LED, RGBW_LED or NEOPIXEL_LED." -#elif ENABLED(RGB_LED) +#define _RGB_TEST (PIN_EXISTS(RGB_LED_R) && PIN_EXISTS(RGB_LED_G) && PIN_EXISTS(RGB_LED_B)) +#if ENABLED(RGB_LED) #if !_RGB_TEST #error "RGB_LED requires RGB_LED_R_PIN, RGB_LED_G_PIN, and RGB_LED_B_PIN." #elif ENABLED(RGBW_LED) @@ -2159,24 +1462,12 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if !(_RGB_TEST && PIN_EXISTS(RGB_LED_W)) #error "RGBW_LED requires RGB_LED_R_PIN, RGB_LED_G_PIN, RGB_LED_B_PIN, and RGB_LED_W_PIN." #endif -#endif -#undef _RGB_TEST - -// NeoPixel requirements -#if ENABLED(NEOPIXEL_LED) - #if !PIN_EXISTS(NEOPIXEL) || NEOPIXEL_PIXELS == 0 +#elif ENABLED(NEOPIXEL_LED) + #if !(PIN_EXISTS(NEOPIXEL) && NEOPIXEL_PIXELS > 0) #error "NEOPIXEL_LED requires NEOPIXEL_PIN and NEOPIXEL_PIXELS." - #elif ENABLED(NEOPIXEL2_SEPARATE) && !(defined(NEOPIXEL2_TYPE) && PIN_EXISTS(NEOPIXEL2) && NEOPIXEL2_PIXELS > 0) - #error "NEOPIXEL2_SEPARATE requires NEOPIXEL2_TYPE, NEOPIXEL2_PIN and NEOPIXEL2_PIXELS." - #elif ENABLED(NEO2_COLOR_PRESETS) && DISABLED(NEOPIXEL2_SEPARATE) - #error "NEO2_COLOR_PRESETS requires NEOPIXEL2_SEPARATE to be enabled." #endif -#endif - -#if DISABLED(NO_COMPILE_TIME_PWM) - #define _TEST_PWM(P) PWM_PIN(P) -#else - #define _TEST_PWM(P) 1 // pass +#elif ENABLED(PRINTER_EVENT_LEDS) && DISABLED(BLINKM) && DISABLED(PCA9632) && DISABLED(NEOPIXEL_LED) + #error "PRINTER_EVENT_LEDS requires BLINKM, PCA9632, RGB_LED, RGBW_LED or NEOPIXEL_LED." #endif /** @@ -2185,329 +1476,142 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #if HAS_AUTO_FAN && EXTRUDER_AUTO_FAN_SPEED != 255 #define AF_ERR_SUFF "_AUTO_FAN_PIN is not a PWM pin. Set EXTRUDER_AUTO_FAN_SPEED to 255." #if HAS_AUTO_FAN_0 - static_assert(_TEST_PWM(E0_AUTO_FAN_PIN), "E0" AF_ERR_SUFF); + static_assert(GET_TIMER(E0_AUTO_FAN_PIN), "E0" AF_ERR_SUFF); #elif HAS_AUTO_FAN_1 - static_assert(_TEST_PWM(E1_AUTO_FAN_PIN), "E1" AF_ERR_SUFF); + static_assert(GET_TIMER(E1_AUTO_FAN_PIN), "E1" AF_ERR_SUFF); #elif HAS_AUTO_FAN_2 - static_assert(_TEST_PWM(E2_AUTO_FAN_PIN), "E2" AF_ERR_SUFF); + static_assert(GET_TIMER(E2_AUTO_FAN_PIN), "E2" AF_ERR_SUFF); #elif HAS_AUTO_FAN_3 - static_assert(_TEST_PWM(E3_AUTO_FAN_PIN), "E3" AF_ERR_SUFF); - #elif HAS_AUTO_FAN_4 - static_assert(_TEST_PWM(E4_AUTO_FAN_PIN), "E4" AF_ERR_SUFF); - #elif HAS_AUTO_FAN_5 - static_assert(_TEST_PWM(E5_AUTO_FAN_PIN), "E5" AF_ERR_SUFF); - #elif HAS_AUTO_FAN_6 - static_assert(_TEST_PWM(E6_AUTO_FAN_PIN), "E6" AF_ERR_SUFF); - #elif HAS_AUTO_FAN_7 - static_assert(_TEST_PWM(E7_AUTO_FAN_PIN), "E7" AF_ERR_SUFF); - #endif -#endif - -/** - * Make sure only one EEPROM type is enabled - */ -#if ENABLED(EEPROM_SETTINGS) - #if 1 < 0 \ - + ENABLED(I2C_EEPROM) \ - + ENABLED(SPI_EEPROM) \ - + ENABLED(QSPI_EEPROM) \ - + ENABLED(SDCARD_EEPROM_EMULATION) \ - + ENABLED(FLASH_EEPROM_EMULATION) \ - + ENABLED(SRAM_EEPROM_EMULATION) \ - + ENABLED(IIC_BL24CXX_EEPROM) - #error "Please select only one method of EEPROM Persistent Storage." - #endif -#endif - -/** - * Make sure features that need to write to the SD card can - */ -#if ENABLED(SDCARD_READONLY) && ANY(POWER_LOSS_RECOVERY, BINARY_FILE_TRANSFER, SDCARD_EEPROM_EMULATION) - #undef SDCARD_READONLY - #if ENABLED(POWER_LOSS_RECOVERY) - #warning "Either disable SDCARD_READONLY or disable POWER_LOSS_RECOVERY." - #elif ENABLED(BINARY_FILE_TRANSFER) - #warning "Either disable SDCARD_READONLY or disable BINARY_FILE_TRANSFER." - #elif ENABLED(SDCARD_EEPROM_EMULATION) - #warning "Either disable SDCARD_READONLY or disable SDCARD_EEPROM_EMULATION." + static_assert(GET_TIMER(E3_AUTO_FAN_PIN), "E3" AF_ERR_SUFF); #endif #endif /** * Make sure only one display is enabled + * + * Note: BQ_LCD_SMART_CONTROLLER => REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER => REPRAP_DISCOUNT_SMART_CONTROLLER + * SAV_3DGLCD => U8GLIB_SH1106 => ULTIMAKERCONTROLLER + * MKS_12864OLED => U8GLIB_SH1106 => ULTIMAKERCONTROLLER + * MKS_12864OLED_SSD1306 => U8GLIB_SSD1306 => ULTIMAKERCONTROLLER + * MKS_MINI_12864 => MINIPANEL + * miniVIKI => ULTIMAKERCONTROLLER + * VIKI2 => ULTIMAKERCONTROLLER + * ELB_FULL_GRAPHIC_CONTROLLER => ULTIMAKERCONTROLLER + * AZSMZ_12864 => ULTIMAKERCONTROLLER + * PANEL_ONE => ULTIMAKERCONTROLLER */ #if 1 < 0 \ - + (ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) && DISABLED(IS_RRD_SC)) \ - + (ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && DISABLED(IS_RRD_FG_SC)) \ - + (ENABLED(ULTRA_LCD) && DISABLED(IS_ULTRA_LCD)) \ - + (ENABLED(U8GLIB_SSD1306) && DISABLED(IS_U8GLIB_SSD1306)) \ - + (ENABLED(MINIPANEL) && NONE(MKS_MINI_12864, ENDER2_STOCKDISPLAY)) \ - + (ENABLED(MKS_MINI_12864) && DISABLED(MKS_LCD12864)) \ - + (ENABLED(EXTENSIBLE_UI) && DISABLED(IS_EXTUI)) \ - + (ENABLED(ULTIPANEL) && DISABLED(IS_ULTIPANEL)) \ - + ENABLED(RADDS_DISPLAY) \ - + ENABLED(ULTIMAKERCONTROLLER) \ - + ENABLED(PANEL_ONE) \ - + ENABLED(G3D_PANEL) \ - + ENABLED(RIGIDBOT_PANEL) \ + + ( ENABLED(ULTIMAKERCONTROLLER) \ + && DISABLED(SAV_3DGLCD) \ + && DISABLED(miniVIKI) \ + && DISABLED(VIKI2) \ + && DISABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + && DISABLED(AZSMZ_12864) \ + && DISABLED(PANEL_ONE) \ + && DISABLED(MKS_12864OLED) \ + && DISABLED(MKS_12864OLED_SSD1306) ) \ + + ( ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) \ + && DISABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) \ + && DISABLED(LCD_FOR_MELZI) \ + && DISABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) \ + && DISABLED(MKS_12864OLED) \ + && DISABLED(MKS_12864OLED_SSD1306) ) \ + + (ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && DISABLED(BQ_LCD_SMART_CONTROLLER)) \ + + ENABLED(LCD_FOR_MELZI) \ + + ENABLED(MKS_12864OLED) \ + + ENABLED(MKS_12864OLED_SSD1306) \ + ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) \ - + ENABLED(ZONESTAR_LCD) \ + + ENABLED(CARTESIO_UI) \ + + ENABLED(PANEL_ONE) \ + + ENABLED(MAKRPANEL) \ + + ENABLED(REPRAPWORLD_GRAPHICAL_LCD) \ + + ENABLED(VIKI2) \ + + ENABLED(miniVIKI) \ + + ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + + ENABLED(AZSMZ_12864) \ + + ENABLED(G3D_PANEL) \ + + (ENABLED(MINIPANEL) && DISABLED(MKS_MINI_12864)) \ + + ENABLED(MKS_MINI_12864) \ + + (ENABLED(REPRAPWORLD_KEYPAD) && DISABLED(CARTESIO_UI) && DISABLED(ZONESTAR_LCD)) \ + + ENABLED(RIGIDBOT_PANEL) \ + ENABLED(RA_CONTROL_PANEL) \ + ENABLED(LCD_SAINSMART_I2C_1602) \ + ENABLED(LCD_SAINSMART_I2C_2004) \ + ENABLED(LCM1602) \ + ENABLED(LCD_I2C_PANELOLU2) \ + ENABLED(LCD_I2C_VIKI) \ + + (ENABLED(U8GLIB_SSD1306) && DISABLED(OLED_PANEL_TINYBOY2) && DISABLED(MKS_12864OLED_SSD1306)) \ + ENABLED(SAV_3DLCD) \ - + ENABLED(FF_INTERFACEBOARD) \ - + ENABLED(REPRAPWORLD_GRAPHICAL_LCD) \ - + ENABLED(VIKI2) \ - + ENABLED(miniVIKI) \ - + ENABLED(MAKRPANEL) \ - + ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + ENABLED(BQ_LCD_SMART_CONTROLLER) \ - + ENABLED(CARTESIO_UI) \ - + ENABLED(LCD_FOR_MELZI) \ - + ENABLED(ULTI_CONTROLLER) \ - + ENABLED(MKS_LCD12864) \ - + ENABLED(ENDER2_STOCKDISPLAY) \ - + ENABLED(FYSETC_MINI_12864_X_X) \ - + ENABLED(FYSETC_MINI_12864_1_2) \ - + ENABLED(FYSETC_MINI_12864_2_0) \ - + ENABLED(FYSETC_MINI_12864_2_1) \ - + ENABLED(FYSETC_GENERIC_12864_1_1) \ - + ENABLED(CR10_STOCKDISPLAY) \ - + ENABLED(DWIN_CREALITY_LCD) \ - + ENABLED(ANET_FULL_GRAPHICS_LCD) \ - + ENABLED(AZSMZ_12864) \ - + ENABLED(SILVER_GATE_GLCD_CONTROLLER) \ + ENABLED(SAV_3DGLCD) \ + ENABLED(OLED_PANEL_TINYBOY2) \ - + ENABLED(MKS_12864OLED) \ - + ENABLED(MKS_12864OLED_SSD1306) \ - + ENABLED(ZONESTAR_12864LCD) \ - + ENABLED(ZONESTAR_12864OLED) \ - + ENABLED(ZONESTAR_12864OLED_SSD1306) \ - + ENABLED(U8GLIB_SH1106_EINSTART) \ - + ENABLED(OVERLORD_OLED) \ - + ENABLED(FYSETC_242_OLED_12864) \ - + ENABLED(DGUS_LCD_UI_ORIGIN) \ - + ENABLED(DGUS_LCD_UI_FYSETC) \ - + ENABLED(DGUS_LCD_UI_HIPRECY) \ - + ENABLED(MALYAN_LCD) \ - + ENABLED(TOUCH_UI_FTDI_EVE) \ - + ENABLED(TFT_320x240) \ - + ENABLED(TFT_320x240_SPI) \ - + ENABLED(FSMC_GRAPHICAL_TFT) \ - + ENABLED(TFT_LVGL_UI_FSMC) \ - + ENABLED(TFT_LVGL_UI_SPI) \ - + ENABLED(ANYCUBIC_LCD_I3MEGA) \ - + ENABLED(ANYCUBIC_LCD_CHIRON) \ - + ENABLED(TFTGLCD_PANEL_SPI) \ - + ENABLED(TFTGLCD_PANEL_I2C) - #error "Please select only one LCD controller option." -#endif - -#undef IS_RRD_SC -#undef IS_RRD_FG_SC -#undef IS_ULTRA_LCD -#undef IS_U8GLIB_SSD1306 -#undef IS_RRW_KEYPAD -#undef IS_EXTUI -#undef IS_ULTIPANEL - -#if 1 < ENABLED(LCD_SCREEN_ROT_0) + ENABLED(LCD_SCREEN_ROT_90) + ENABLED(LCD_SCREEN_ROT_180) + ENABLED(LCD_SCREEN_ROT_270) - #error "Please enable only one LCD_SCREEN_ROT_* option: 0, 90, 180, or 270." -#endif - -/** - * Serial displays require a dedicated serial port - */ -#ifdef LCD_SERIAL_PORT - #if LCD_SERIAL_PORT == SERIAL_PORT - #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT. Please update your configuration." - #elif defined(SERIAL_PORT_2) && LCD_SERIAL_PORT == SERIAL_PORT_2 - #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2. Please update your configuration." - #endif -#else - #if HAS_DGUS_LCD - #error "The DGUS LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" - #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - #error "The ANYCUBIC LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" - #elif ENABLED(MALYAN_LCD) - #error "MALYAN_LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" - #endif -#endif - -/** - * FYSETC Mini 12864 RGB backlighting required - */ -#if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) && DISABLED(RGB_LED) - #error "RGB_LED is required for FYSETC_MINI_12864 1.2 and 2.0." -#elif EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1) && DISABLED(LED_USER_PRESET_STARTUP) - #error "LED_USER_PRESET_STARTUP is required for FYSETC_MINI_12864 2.x displays." + + ENABLED(ZONESTAR_LCD) \ + + ENABLED(ULTI_CONTROLLER) + #error "Please select no more than one LCD controller option." #endif /** * Check existing CS pins against enabled TMC SPI drivers. */ -#define INVALID_TMC_SPI(ST) (AXIS_HAS_SPI(ST) && !PIN_EXISTS(ST##_CS)) -#if INVALID_TMC_SPI(X) - #error "An SPI driven TMC driver on X requires X_CS_PIN." -#elif INVALID_TMC_SPI(X2) - #error "An SPI driven TMC driver on X2 requires X2_CS_PIN." -#elif INVALID_TMC_SPI(Y) - #error "An SPI driven TMC driver on Y requires Y_CS_PIN." -#elif INVALID_TMC_SPI(Y2) - #error "An SPI driven TMC driver on Y2 requires Y2_CS_PIN." -#elif INVALID_TMC_SPI(Z) - #error "An SPI driven TMC driver on Z requires Z_CS_PIN." -#elif INVALID_TMC_SPI(Z2) - #error "An SPI driven TMC driver on Z2 requires Z2_CS_PIN." -#elif INVALID_TMC_SPI(Z3) - #error "An SPI driven TMC driver on Z3 requires Z3_CS_PIN." -#elif INVALID_TMC_SPI(Z4) - #error "An SPI driven TMC driver on Z4 requires Z4_CS_PIN." -#elif INVALID_TMC_SPI(E0) - #error "An SPI driven TMC driver on E0 requires E0_CS_PIN." -#elif INVALID_TMC_SPI(E1) - #error "An SPI driven TMC driver on E1 requires E1_CS_PIN." -#elif INVALID_TMC_SPI(E2) - #error "An SPI driven TMC driver on E2 requires E2_CS_PIN." -#elif INVALID_TMC_SPI(E3) - #error "An SPI driven TMC driver on E3 requires E3_CS_PIN." -#elif INVALID_TMC_SPI(E4) - #error "An SPI driven TMC driver on E4 requires E4_CS_PIN." -#elif INVALID_TMC_SPI(E5) - #error "An SPI driven TMC driver on E5 requires E5_CS_PIN." -#elif INVALID_TMC_SPI(E6) - #error "An SPI driven TMC driver on E6 requires E6_CS_PIN." -#elif INVALID_TMC_SPI(E7) - #error "An SPI driven TMC driver on E7 requires E7_CS_PIN." +#if AXIS_DRIVER_TYPE(X, TMC2130) && !PIN_EXISTS(X_CS) + #error "X_CS_PIN is required for TMC2130. Define X_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(X2, TMC2130) && !PIN_EXISTS(X2_CS) + #error "X2_CS_PIN is required for X2. Define X2_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(Y, TMC2130) && !PIN_EXISTS(Y_CS) + #error "Y_CS_PIN is required for TMC2130. Define Y_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(Y2, TMC2130) && !PIN_EXISTS(Y2_CS) + #error "Y2_CS_PIN is required for TMC2130. Define Y2_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(Z, TMC2130) && !PIN_EXISTS(Z_CS) + #error "Z_CS_PIN is required for TMC2130. Define Z_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(Z2, TMC2130) && !PIN_EXISTS(Z2_CS) + #error "Z2_CS_PIN is required for TMC2130. Define Z2_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(E0, TMC2130) && !PIN_EXISTS(E0_CS) + #error "E0_CS_PIN is required for TMC2130. Define E0_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(E1, TMC2130) && !PIN_EXISTS(E1_CS) + #error "E1_CS_PIN is required for TMC2130. Define E1_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(E2, TMC2130) && !PIN_EXISTS(E2_CS) + #error "E2_CS_PIN is required for TMC2130. Define E2_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(E3, TMC2130) && !PIN_EXISTS(E3_CS) + #error "E3_CS_PIN is required for TMC2130. Define E3_CS_PIN in Configuration_adv.h." +#elif AXIS_DRIVER_TYPE(E4, TMC2130) && !PIN_EXISTS(E4_CS) + #error "E4_CS_PIN is required for TMC2130. Define E4_CS_PIN in Configuration_adv.h." #endif -#undef INVALID_TMC_SPI /** - * Check existing RX/TX pins against enable TMC UART drivers. + * TMC2208 software UART and ENDSTOP_INTERRUPTS both use pin change interrupts (PCI) */ -#define INVALID_TMC_UART(ST) (AXIS_HAS_UART(ST) && !(defined(ST##_HARDWARE_SERIAL) || (PINS_EXIST(ST##_SERIAL_RX, ST##_SERIAL_TX)))) -#if INVALID_TMC_UART(X) - #error "TMC2208 or TMC2209 on X requires X_HARDWARE_SERIAL or X_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(X2) - #error "TMC2208 or TMC2209 on X2 requires X2_HARDWARE_SERIAL or X2_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(Y) - #error "TMC2208 or TMC2209 on Y requires Y_HARDWARE_SERIAL or Y_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(Y2) - #error "TMC2208 or TMC2209 on Y2 requires Y2_HARDWARE_SERIAL or Y2_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(Z) - #error "TMC2208 or TMC2209 on Z requires Z_HARDWARE_SERIAL or Z_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(Z2) - #error "TMC2208 or TMC2209 on Z2 requires Z2_HARDWARE_SERIAL or Z2_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(Z3) - #error "TMC2208 or TMC2209 on Z3 requires Z3_HARDWARE_SERIAL or Z3_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(Z4) - #error "TMC2208 or TMC2209 on Z4 requires Z4_HARDWARE_SERIAL or Z4_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(E0) - #error "TMC2208 or TMC2209 on E0 requires E0_HARDWARE_SERIAL or E0_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(E1) - #error "TMC2208 or TMC2209 on E1 requires E1_HARDWARE_SERIAL or E1_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(E2) - #error "TMC2208 or TMC2209 on E2 requires E2_HARDWARE_SERIAL or E2_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(E3) - #error "TMC2208 or TMC2209 on E3 requires E3_HARDWARE_SERIAL or E3_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(E4) - #error "TMC2208 or TMC2209 on E4 requires E4_HARDWARE_SERIAL or E4_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(E5) - #error "TMC2208 or TMC2209 on E5 requires E5_HARDWARE_SERIAL or E5_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(E6) - #error "TMC2208 or TMC2209 on E6 requires E6_HARDWARE_SERIAL or E6_SERIAL_(RX|TX)_PIN." -#elif INVALID_TMC_UART(E7) - #error "TMC2208 or TMC2209 on E7 requires E7_HARDWARE_SERIAL or E7_SERIAL_(RX|TX)_PIN." +#if HAS_DRIVER(TMC2208) && ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && !( \ + defined(X_HARDWARE_SERIAL ) \ + || defined(X2_HARDWARE_SERIAL) \ + || defined(Y_HARDWARE_SERIAL ) \ + || defined(Y2_HARDWARE_SERIAL) \ + || defined(Z_HARDWARE_SERIAL ) \ + || defined(Z2_HARDWARE_SERIAL) \ + || defined(E0_HARDWARE_SERIAL) \ + || defined(E1_HARDWARE_SERIAL) \ + || defined(E2_HARDWARE_SERIAL) \ + || defined(E3_HARDWARE_SERIAL) \ + || defined(E4_HARDWARE_SERIAL) ) + #error "select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE." #endif -#undef INVALID_TMC_UART /** - * TMC2209 slave address values + * TMC2208 software UART is only supported on AVR */ -#define INVALID_TMC_ADDRESS(ST) static_assert(0 <= ST##_SLAVE_ADDRESS && ST##_SLAVE_ADDRESS <= 3, "TMC2209 slave address must be 0, 1, 2 or 3") -#if AXIS_DRIVER_TYPE_X(TMC2209) - INVALID_TMC_ADDRESS(X); -#elif AXIS_DRIVER_TYPE_X2(TMC2209) - INVALID_TMC_ADDRESS(X2); -#elif AXIS_DRIVER_TYPE_Y(TMC2209) - INVALID_TMC_ADDRESS(Y); -#elif AXIS_DRIVER_TYPE_Y2(TMC2209) - INVALID_TMC_ADDRESS(Y2); -#elif AXIS_DRIVER_TYPE_Z(TMC2209) - INVALID_TMC_ADDRESS(Z); -#elif AXIS_DRIVER_TYPE_Z2(TMC2209) - INVALID_TMC_ADDRESS(Z2); -#elif AXIS_DRIVER_TYPE_Z3(TMC2209) - INVALID_TMC_ADDRESS(Z3); -#elif AXIS_DRIVER_TYPE_Z4(TMC2209) - INVALID_TMC_ADDRESS(Z4); -#elif AXIS_DRIVER_TYPE_E0(TMC2209) - INVALID_TMC_ADDRESS(E0); -#elif AXIS_DRIVER_TYPE_E1(TMC2209) - INVALID_TMC_ADDRESS(E1); -#elif AXIS_DRIVER_TYPE_E2(TMC2209) - INVALID_TMC_ADDRESS(E2); -#elif AXIS_DRIVER_TYPE_E3(TMC2209) - INVALID_TMC_ADDRESS(E3); -#elif AXIS_DRIVER_TYPE_E4(TMC2209) - INVALID_TMC_ADDRESS(E4); -#elif AXIS_DRIVER_TYPE_E5(TMC2209) - INVALID_TMC_ADDRESS(E5); -#elif AXIS_DRIVER_TYPE_E6(TMC2209) - INVALID_TMC_ADDRESS(E6); -#elif AXIS_DRIVER_TYPE_E7(TMC2209) - INVALID_TMC_ADDRESS(E7); -#endif -#undef INVALID_TMC_ADDRESS - -#define _TMC_MICROSTEP_IS_VALID(MS) (MS == 0 || MS == 2 || MS == 4 || MS == 8 || MS == 16 || MS == 32 || MS == 64 || MS == 128 || MS == 256) -#define TMC_MICROSTEP_IS_VALID(M) (!AXIS_IS_TMC(M) || _TMC_MICROSTEP_IS_VALID(M##_MICROSTEPS)) -#define INVALID_TMC_MS(ST) static_assert(0, "Invalid " STRINGIFY(ST) "_MICROSTEPS. Valid values are 0, 2, 4, 8, 16, 32, 64, 128, and 256.") - -#if !TMC_MICROSTEP_IS_VALID(X) - INVALID_TMC_MS(X); -#elif !TMC_MICROSTEP_IS_VALID(Y) - INVALID_TMC_MS(Y) -#elif !TMC_MICROSTEP_IS_VALID(Z) - INVALID_TMC_MS(Z) -#elif !TMC_MICROSTEP_IS_VALID(X2) - INVALID_TMC_MS(X2); -#elif !TMC_MICROSTEP_IS_VALID(Y2) - INVALID_TMC_MS(Y2) -#elif !TMC_MICROSTEP_IS_VALID(Z2) - INVALID_TMC_MS(Z2) -#elif !TMC_MICROSTEP_IS_VALID(Z3) - INVALID_TMC_MS(Z3) -#elif !TMC_MICROSTEP_IS_VALID(Z4) - INVALID_TMC_MS(Z4) -#elif !TMC_MICROSTEP_IS_VALID(E0) - INVALID_TMC_MS(E0) -#elif !TMC_MICROSTEP_IS_VALID(E1) - INVALID_TMC_MS(E1) -#elif !TMC_MICROSTEP_IS_VALID(E2) - INVALID_TMC_MS(E2) -#elif !TMC_MICROSTEP_IS_VALID(E3) - INVALID_TMC_MS(E3) -#elif !TMC_MICROSTEP_IS_VALID(E4) - INVALID_TMC_MS(E4) -#elif !TMC_MICROSTEP_IS_VALID(E5) - INVALID_TMC_MS(E5) -#elif !TMC_MICROSTEP_IS_VALID(E6) - INVALID_TMC_MS(E6) -#elif !TMC_MICROSTEP_IS_VALID(E7) - INVALID_TMC_MS(E7) -#endif -#undef INVALID_TMC_MS -#undef TMC_MICROSTEP_IS_VALID -#undef _TMC_MICROSTEP_IS_VALID - -#if ENABLED(DELTA) && (ENABLED(STEALTHCHOP_XY) != ENABLED(STEALTHCHOP_Z)) - #error "STEALTHCHOP_XY and STEALTHCHOP_Z must be the same on DELTA." +#if HAS_DRIVER(TMC2208) && !defined(__AVR__) && !defined(TARGET_LPC1768) && !( \ + defined(X_HARDWARE_SERIAL ) \ + || defined(X2_HARDWARE_SERIAL) \ + || defined(Y_HARDWARE_SERIAL ) \ + || defined(Y2_HARDWARE_SERIAL) \ + || defined(Z_HARDWARE_SERIAL ) \ + || defined(Z2_HARDWARE_SERIAL) \ + || defined(E0_HARDWARE_SERIAL) \ + || defined(E1_HARDWARE_SERIAL) \ + || defined(E2_HARDWARE_SERIAL) \ + || defined(E3_HARDWARE_SERIAL) \ + || defined(E4_HARDWARE_SERIAL) ) + #error "TMC2208 Software Serial is supported only on AVR and LPC1768 platforms." #endif #if ENABLED(SENSORLESS_HOMING) @@ -2515,240 +1619,72 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal // is necessary in order to reset the stallGuard indication between the initial movement of all three // towers to +Z and the individual homing of each tower. This restriction can be removed once a means of // clearing the stallGuard activated status is found. - - // Stall detection DIAG = HIGH : TMC2209 - // Stall detection DIAG = LOW : TMC2130/TMC2160/TMC2660/TMC5130/TMC5160 - #define X_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(X,TMC2209) - #define Y_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Y,TMC2209) - #define Z_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Z,TMC2209) - - #if ENABLED(DELTA) && !BOTH(STEALTHCHOP_XY, STEALTHCHOP_Z) - #error "SENSORLESS_HOMING on DELTA currently requires STEALTHCHOP_XY and STEALTHCHOP_Z." - #elif X_SENSORLESS && X_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_XMIN) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMIN (or ENDSTOPPULLUPS) when homing to X_MIN." - #elif X_SENSORLESS && X_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_XMAX) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMAX (or ENDSTOPPULLUPS) when homing to X_MAX." - #elif Y_SENSORLESS && Y_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_YMIN) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMIN (or ENDSTOPPULLUPS) when homing to Y_MIN." - #elif Y_SENSORLESS && Y_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_YMAX) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMAX (or ENDSTOPPULLUPS) when homing to Y_MAX." - #elif Z_SENSORLESS && Z_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMIN (or ENDSTOPPULLUPS) when homing to Z_MIN." - #elif Z_SENSORLESS && Z_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMAX) - #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMAX (or ENDSTOPPULLUPS) when homing to Z_MAX." - #elif X_SENSORLESS && X_HOME_DIR < 0 && X_MIN_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING - #if X_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING = true when homing to X_MIN." - #else - #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to X_MIN." - #endif - #elif X_SENSORLESS && X_HOME_DIR > 0 && X_MAX_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING - #if X_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING = true when homing to X_MAX." - #else - #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to X_MAX." - #endif - #elif Y_SENSORLESS && Y_HOME_DIR < 0 && Y_MIN_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING - #if Y_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING = true when homing to Y_MIN." - #else - #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to Y_MIN." - #endif - #elif Y_SENSORLESS && Y_HOME_DIR > 0 && Y_MAX_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING - #if Y_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING = true when homing to Y_MAX." - #else - #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to Y_MAX." - #endif - #elif Z_SENSORLESS && Z_HOME_DIR < 0 && Z_MIN_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING - #if Z_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING = true when homing to Z_MIN." - #else - #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to Z_MIN." - #endif - #elif Z_SENSORLESS && Z_HOME_DIR > 0 && Z_MAX_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING - #if Z_ENDSTOP_INVERTING - #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING = true when homing to Z_MAX." - #else - #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to Z_MAX." - #endif - #elif ENDSTOP_NOISE_THRESHOLD - #error "SENSORLESS_HOMING is incompatible with ENDSTOP_NOISE_THRESHOLD." - #elif !(X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS) - #error "SENSORLESS_HOMING requires a TMC stepper driver with StallGuard on X, Y, or Z axes." - #endif - - #undef X_ENDSTOP_INVERTING - #undef Y_ENDSTOP_INVERTING - #undef Z_ENDSTOP_INVERTING -#endif - -// Sensorless probing requirements -#if ENABLED(SENSORLESS_PROBING) - #if ENABLED(DELTA) && !(X_SENSORLESS && Y_SENSORLESS && Z_SENSORLESS) - #error "SENSORLESS_PROBING for DELTA requires TMC stepper drivers with StallGuard on X, Y, and Z axes." - #elif !Z_SENSORLESS - #error "SENSORLESS_PROBING requires a TMC stepper driver with StallGuard on Z." + #if ENABLED(DELTA) && DISABLED(STEALTHCHOP) + #error "SENSORLESS_HOMING on DELTA currently requires STEALTHCHOP." + #elif X_SENSORLESS && X_HOME_DIR == -1 && (DISABLED(X_MIN_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_XMIN)) + #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_XMIN when homing to X_MIN." + #elif X_SENSORLESS && X_HOME_DIR == 1 && (DISABLED(X_MAX_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_XMAX)) + #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_XMAX when homing to X_MAX." + #elif Y_SENSORLESS && Y_HOME_DIR == -1 && (DISABLED(Y_MIN_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_YMIN)) + #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_YMIN when homing to Y_MIN." + #elif Y_SENSORLESS && Y_HOME_DIR == 1 && (DISABLED(Y_MAX_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_YMAX)) + #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_YMAX when homing to Y_MAX." + #elif Z_SENSORLESS && Z_HOME_DIR == -1 && (DISABLED(Z_MIN_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_ZMIN)) + #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING and ENDSTOPPULLUP_ZMIN when homing to Z_MIN." + #elif Z_SENSORLESS && Z_HOME_DIR == 1 && (DISABLED(Z_MAX_ENDSTOP_INVERTING) || DISABLED(ENDSTOPPULLUP_ZMAX)) + #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING and ENDSTOPPULLUP_ZMAX when homing to Z_MAX." + #elif ENABLED(ENDSTOP_NOISE_FILTER) + #error "SENSORLESS_HOMING is incompatible with ENDSTOP_NOISE_FILTER." #endif #endif // Sensorless homing is required for both combined steppers in an H-bot #if CORE_IS_XY && X_SENSORLESS != Y_SENSORLESS - #error "CoreXY requires both X and Y to use sensorless homing if either one does." -#elif CORE_IS_XZ && X_SENSORLESS != Z_SENSORLESS && !HOMING_Z_WITH_PROBE - #error "CoreXZ requires both X and Z to use sensorless homing if either one does." -#elif CORE_IS_YZ && Y_SENSORLESS != Z_SENSORLESS && !HOMING_Z_WITH_PROBE - #error "CoreYZ requires both Y and Z to use sensorless homing if either one does." -#elif ENABLED(MARKFORGED_XY) && X_SENSORLESS != Y_SENSORLESS - #error "MARKFORGED_XY requires both X and Y to use sensorless homing if either one does." + #error "CoreXY requires both X and Y to use sensorless homing if either does." +#elif CORE_IS_XZ && X_SENSORLESS != Z_SENSORLESS + #error "CoreXZ requires both X and Z to use sensorless homing if either does." +#elif CORE_IS_YZ && Y_SENSORLESS != Z_SENSORLESS + #error "CoreYZ requires both Y and Z to use sensorless homing if either does." #endif -// Other TMC feature requirements -#if ENABLED(HYBRID_THRESHOLD) && !STEALTHCHOP_ENABLED - #error "Enable STEALTHCHOP_(XY|Z|E) to use HYBRID_THRESHOLD." -#elif ENABLED(SENSORLESS_HOMING) && !HAS_STALLGUARD - #error "SENSORLESS_HOMING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers." -#elif ENABLED(SENSORLESS_PROBING) && !HAS_STALLGUARD - #error "SENSORLESS_PROBING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers." -#elif STEALTHCHOP_ENABLED && !HAS_STEALTHCHOP - #error "STEALTHCHOP requires TMC2130, TMC2160, TMC2208, TMC2209, or TMC5160 stepper drivers." +#if ENABLED(HYBRID_THRESHOLD) && DISABLED(STEALTHCHOP) + #error "Enable STEALTHCHOP to use HYBRID_THRESHOLD." +#endif +#if ENABLED(TMC_Z_CALIBRATION) && !AXIS_IS_TMC(Z) && !AXIS_IS_TMC(Z2) + #error "TMC_Z_CALIBRATION requires at least one TMC driver on Z axis" #endif -/** - * TMC SPI Chaining - */ -#define IN_CHAIN(A) ((A##_CHAIN_POS > 0) && !HAS_L64XX) -#if IN_CHAIN(X ) || IN_CHAIN(Y ) || IN_CHAIN(Z ) || IN_CHAIN(X2) || IN_CHAIN(Y2) || IN_CHAIN(Z2) || IN_CHAIN(Z3) || IN_CHAIN(Z4) \ - || IN_CHAIN(E0) || IN_CHAIN(E1) || IN_CHAIN(E2) || IN_CHAIN(E3) || IN_CHAIN(E4) || IN_CHAIN(E5) || IN_CHAIN(E6) || IN_CHAIN(E7) - #define BAD_CHAIN(A) (IN_CHAIN(A) && !PIN_EXISTS(A##_CS)) - #if BAD_CHAIN(X ) || BAD_CHAIN(Y ) || BAD_CHAIN(Z ) || BAD_CHAIN(X2) || BAD_CHAIN(Y2) || BAD_CHAIN(Z2) || BAD_CHAIN(Z3) || BAD_CHAIN(Z4) \ - || BAD_CHAIN(E0) || BAD_CHAIN(E1) || BAD_CHAIN(E2) || BAD_CHAIN(E3) || BAD_CHAIN(E4) || BAD_CHAIN(E5) || BAD_CHAIN(E6) || BAD_CHAIN(E7) - #error "All chained TMC drivers need a CS pin." - #else - #if IN_CHAIN(X) - #define CS_COMPARE X_CS_PIN - #elif IN_CHAIN(Y) - #define CS_COMPARE Y_CS_PIN - #elif IN_CHAIN(Z) - #define CS_COMPARE Z_CS_PIN - #elif IN_CHAIN(X2) - #define CS_COMPARE X2_CS_PIN - #elif IN_CHAIN(Y2) - #define CS_COMPARE Y2_CS_PIN - #elif IN_CHAIN(Z2) - #define CS_COMPARE Z2_CS_PIN - #elif IN_CHAIN(Z3) - #define CS_COMPARE Z3_CS_PIN - #elif IN_CHAIN(E0) - #define CS_COMPARE E0_CS_PIN - #elif IN_CHAIN(E1) - #define CS_COMPARE E1_CS_PIN - #elif IN_CHAIN(E2) - #define CS_COMPARE E2_CS_PIN - #elif IN_CHAIN(E3) - #define CS_COMPARE E3_CS_PIN - #elif IN_CHAIN(E4) - #define CS_COMPARE E4_CS_PIN - #elif IN_CHAIN(E5) - #define CS_COMPARE E5_CS_PIN - #elif IN_CHAIN(E6) - #define CS_COMPARE E6_CS_PIN - #elif IN_CHAIN(E7) - #define CS_COMPARE E7_CS_PIN - #endif - #define BAD_CS_PIN(A) (IN_CHAIN(A) && A##_CS_PIN != CS_COMPARE) - #if BAD_CS_PIN(X ) || BAD_CS_PIN(Y ) || BAD_CS_PIN(Z ) || BAD_CS_PIN(X2) || BAD_CS_PIN(Y2) || BAD_CS_PIN(Z2) || BAD_CS_PIN(Z3) || BAD_CS_PIN(Z4) \ - || BAD_CS_PIN(E0) || BAD_CS_PIN(E1) || BAD_CS_PIN(E2) || BAD_CS_PIN(E3) || BAD_CS_PIN(E4) || BAD_CS_PIN(E5) || BAD_CS_PIN(E6) || BAD_CS_PIN(E7) - #error "All chained TMC drivers must use the same CS pin." - #endif - #undef BAD_CS_PIN - #undef CS_COMPARE - #endif - #undef BAD_CHAIN +#if ENABLED(SENSORLESS_HOMING) && !HAS_STALLGUARD + #error "SENSORLESS_HOMING requires TMC2130 or TMC2660 stepper drivers." #endif -#undef IN_CHAIN +#if ENABLED(STEALTHCHOP) && !HAS_STEALTHCHOP + #error "STEALTHCHOP requires TMC2130 or TMC2208 stepper drivers." + #endif /** * Digipot requirement */ -#if HAS_MOTOR_CURRENT_I2C - #if BOTH(DIGIPOT_MCP4018, DIGIPOT_MCP4451) - #error "Enable only one of DIGIPOT_MCP4018 or DIGIPOT_MCP4451." - #elif !MB(MKS_SBASE) \ - && (!defined(DIGIPOTS_I2C_SDA_X) || !defined(DIGIPOTS_I2C_SDA_Y) || !defined(DIGIPOTS_I2C_SDA_Z) || !defined(DIGIPOTS_I2C_SDA_E0) || !defined(DIGIPOTS_I2C_SDA_E1)) - #error "DIGIPOT_MCP4018/4451 requires DIGIPOTS_I2C_SDA_* pins to be defined." +#if ENABLED(DIGIPOT_MCP4018) + #if !defined(DIGIPOTS_I2C_SDA_X) || !defined(DIGIPOTS_I2C_SDA_Y) || !defined(DIGIPOTS_I2C_SDA_Z) \ + || !defined(DIGIPOTS_I2C_SDA_E0) || !defined(DIGIPOTS_I2C_SDA_E1) + #error "DIGIPOT_MCP4018 requires DIGIPOTS_I2C_SDA_* pins to be defined." #endif #endif /** - * Check per-axis initializers for errors + * Require 4 or more elements in per-axis initializers */ constexpr float sanity_arr_1[] = DEFAULT_AXIS_STEPS_PER_UNIT, sanity_arr_2[] = DEFAULT_MAX_FEEDRATE, sanity_arr_3[] = DEFAULT_MAX_ACCELERATION; +static_assert(COUNT(sanity_arr_1) >= XYZE, "DEFAULT_AXIS_STEPS_PER_UNIT requires 4 (or more) elements."); +static_assert(COUNT(sanity_arr_2) >= XYZE, "DEFAULT_MAX_FEEDRATE requires 4 (or more) elements."); +static_assert(COUNT(sanity_arr_3) >= XYZE, "DEFAULT_MAX_ACCELERATION requires 4 (or more) elements."); +static_assert(COUNT(sanity_arr_1) <= XYZE_N, "DEFAULT_AXIS_STEPS_PER_UNIT has too many elements."); +static_assert(COUNT(sanity_arr_2) <= XYZE_N, "DEFAULT_MAX_FEEDRATE has too many elements."); +static_assert(COUNT(sanity_arr_3) <= XYZE_N, "DEFAULT_MAX_ACCELERATION has too many elements."); -#define _ARR_TEST(N,I) (sanity_arr_##N[_MIN(I,int(COUNT(sanity_arr_##N))-1)] > 0) - -static_assert(COUNT(sanity_arr_1) >= XYZE, "DEFAULT_AXIS_STEPS_PER_UNIT requires X, Y, Z and E elements."); -static_assert(COUNT(sanity_arr_1) <= XYZE_N, "DEFAULT_AXIS_STEPS_PER_UNIT has too many elements. (Did you forget to enable DISTINCT_E_FACTORS?)"); -static_assert( _ARR_TEST(1,0) && _ARR_TEST(1,1) && _ARR_TEST(1,2) - && _ARR_TEST(1,3) && _ARR_TEST(1,4) && _ARR_TEST(1,5) - && _ARR_TEST(1,6) && _ARR_TEST(1,7) && _ARR_TEST(1,8), - "DEFAULT_AXIS_STEPS_PER_UNIT values must be positive."); - -static_assert(COUNT(sanity_arr_2) >= XYZE, "DEFAULT_MAX_FEEDRATE requires X, Y, Z and E elements."); -static_assert(COUNT(sanity_arr_2) <= XYZE_N, "DEFAULT_MAX_FEEDRATE has too many elements. (Did you forget to enable DISTINCT_E_FACTORS?)"); -static_assert( _ARR_TEST(2,0) && _ARR_TEST(2,1) && _ARR_TEST(2,2) - && _ARR_TEST(2,3) && _ARR_TEST(2,4) && _ARR_TEST(2,5) - && _ARR_TEST(2,6) && _ARR_TEST(2,7) && _ARR_TEST(2,8), - "DEFAULT_MAX_FEEDRATE values must be positive."); - -static_assert(COUNT(sanity_arr_3) >= XYZE, "DEFAULT_MAX_ACCELERATION requires X, Y, Z and E elements."); -static_assert(COUNT(sanity_arr_3) <= XYZE_N, "DEFAULT_MAX_ACCELERATION has too many elements. (Did you forget to enable DISTINCT_E_FACTORS?)"); -static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) - && _ARR_TEST(3,3) && _ARR_TEST(3,4) && _ARR_TEST(3,5) - && _ARR_TEST(3,6) && _ARR_TEST(3,7) && _ARR_TEST(3,8), - "DEFAULT_MAX_ACCELERATION values must be positive."); - -#if ENABLED(LIMITED_MAX_ACCEL_EDITING) - #ifdef MAX_ACCEL_EDIT_VALUES - constexpr float sanity_arr_4[] = MAX_ACCEL_EDIT_VALUES; - static_assert(COUNT(sanity_arr_4) >= XYZE, "MAX_ACCEL_EDIT_VALUES requires X, Y, Z and E elements."); - static_assert(COUNT(sanity_arr_4) <= XYZE, "MAX_ACCEL_EDIT_VALUES has too many elements. X, Y, Z and E elements only."); - static_assert( _ARR_TEST(4,0) && _ARR_TEST(4,1) && _ARR_TEST(4,2) - && _ARR_TEST(4,3) && _ARR_TEST(4,4) && _ARR_TEST(4,5) - && _ARR_TEST(4,6) && _ARR_TEST(4,7) && _ARR_TEST(4,8), - "MAX_ACCEL_EDIT_VALUES values must be positive."); - #endif -#endif - -#if ENABLED(LIMITED_MAX_FR_EDITING) - #ifdef MAX_FEEDRATE_EDIT_VALUES - constexpr float sanity_arr_5[] = MAX_FEEDRATE_EDIT_VALUES; - static_assert(COUNT(sanity_arr_5) >= XYZE, "MAX_FEEDRATE_EDIT_VALUES requires X, Y, Z and E elements."); - static_assert(COUNT(sanity_arr_5) <= XYZE, "MAX_FEEDRATE_EDIT_VALUES has too many elements. X, Y, Z and E elements only."); - static_assert( _ARR_TEST(5,0) && _ARR_TEST(5,1) && _ARR_TEST(5,2) - && _ARR_TEST(5,3) && _ARR_TEST(5,4) && _ARR_TEST(5,5) - && _ARR_TEST(5,6) && _ARR_TEST(5,7) && _ARR_TEST(5,8), - "MAX_FEEDRATE_EDIT_VALUES values must be positive."); - #endif -#endif - -#if ENABLED(LIMITED_JERK_EDITING) - #ifdef MAX_JERK_EDIT_VALUES - constexpr float sanity_arr_6[] = MAX_JERK_EDIT_VALUES; - static_assert(COUNT(sanity_arr_6) >= XYZE, "MAX_JERK_EDIT_VALUES requires X, Y, Z and E elements."); - static_assert(COUNT(sanity_arr_6) <= XYZE, "MAX_JERK_EDIT_VALUES has too many elements. X, Y, Z and E elements only."); - static_assert( _ARR_TEST(6,0) && _ARR_TEST(6,1) && _ARR_TEST(6,2) - && _ARR_TEST(6,3) && _ARR_TEST(6,4) && _ARR_TEST(6,5) - && _ARR_TEST(6,6) && _ARR_TEST(6,7) && _ARR_TEST(6,8), - "MAX_JERK_EDIT_VALUES values must be positive."); - #endif -#endif - -#undef _ARR_TEST - -#if BOTH(CNC_COORDINATE_SYSTEMS, NO_WORKSPACE_OFFSETS) +#if ENABLED(CNC_COORDINATE_SYSTEMS) && ENABLED(NO_WORKSPACE_OFFSETS) #error "CNC_COORDINATE_SYSTEMS is incompatible with NO_WORKSPACE_OFFSETS." #endif @@ -2778,423 +1714,16 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif -#if ENABLED(BACKUP_POWER_SUPPLY) && !PIN_EXISTS(POWER_LOSS) - #error "BACKUP_POWER_SUPPLY requires a POWER_LOSS_PIN." +#if ENABLED(POWER_LOSS_RECOVERY) && DISABLED(ULTIPANEL) + #error "POWER_LOSS_RECOVERY currently requires an LCD Controller." #endif -#if ENABLED(Z_STEPPER_AUTO_ALIGN) - #if NUM_Z_STEPPER_DRIVERS <= 1 - #error "Z_STEPPER_AUTO_ALIGN requires NUM_Z_STEPPER_DRIVERS greater than 1." - #elif !HAS_BED_PROBE - #error "Z_STEPPER_AUTO_ALIGN requires a Z-bed probe." - #elif ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) && NUM_Z_STEPPER_DRIVERS < 3 - #error "Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS requires NUM_Z_STEPPER_DRIVERS to be 3 or 4." - #endif -#endif - -#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) - #if NONE(HAS_MOTOR_CURRENT_DAC, HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC, HAS_TRINAMIC_CONFIG, HAS_MOTOR_CURRENT_PWM) - #error "It is highly recommended to have adjustable current drivers to prevent damage. Disable this line to continue anyway." - #elif !defined(GANTRY_CALIBRATION_CURRENT) - #error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_CURRENT to be set." - #elif !defined(GANTRY_CALIBRATION_EXTRA_HEIGHT) - #error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_EXTRA_HEIGHT to be set." - #elif !defined(GANTRY_CALIBRATION_FEEDRATE) - #error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_FEEDRATE to be set." - #endif - #if defined(GANTRY_CALIBRATION_SAFE_POSITION) && !defined(GANTRY_CALIBRATION_XY_PARK_FEEDRATE) - #error "GANTRY_CALIBRATION_SAFE_POSITION Requires GANTRY_CALIBRATION_XY_PARK_FEEDRATE to be set." - #endif -#endif - -#if BOTH(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) - #error "You cannot use Z_STEPPER_AUTO_ALIGN and MECHANICAL_GANTRY_CALIBRATION at the same time." +#if ENABLED(FAST_PWM_FAN) && !(defined(ARDUINO) && !defined(ARDUINO_ARCH_SAM)) + #error "FAST_PWM_FAN only supported by 8 bit CPUs." #endif #if ENABLED(PRINTCOUNTER) && DISABLED(EEPROM_SETTINGS) #error "PRINTCOUNTER requires EEPROM_SETTINGS. Please update your Configuration." #endif -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && !PINS_EXIST(USB_CS, USB_INTR) - #error "USB_CS_PIN and USB_INTR_PIN are required for USB_FLASH_DRIVE_SUPPORT." -#endif - -#if ENABLED(SD_FIRMWARE_UPDATE) && !defined(__AVR_ATmega2560__) - #error "SD_FIRMWARE_UPDATE requires an ATmega2560-based (Arduino Mega) board." -#endif - -#if ENABLED(GCODE_MACROS) && !WITHIN(GCODE_MACROS_SLOTS, 1, 10) - #error "GCODE_MACROS_SLOTS must be a number from 1 to 10." -#endif - -#if ENABLED(CUSTOM_USER_MENUS) - #ifdef USER_GCODE_1 - constexpr char _chr1 = USER_GCODE_1[strlen(USER_GCODE_1) - 1]; - static_assert(_chr1 != '\n' && _chr1 != '\r', "USER_GCODE_1 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_2 - constexpr char _chr2 = USER_GCODE_2[strlen(USER_GCODE_2) - 1]; - static_assert(_chr2 != '\n' && _chr2 != '\r', "USER_GCODE_2 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_3 - constexpr char _chr3 = USER_GCODE_3[strlen(USER_GCODE_3) - 1]; - static_assert(_chr3 != '\n' && _chr3 != '\r', "USER_GCODE_3 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_4 - constexpr char _chr4 = USER_GCODE_4[strlen(USER_GCODE_4) - 1]; - static_assert(_chr4 != '\n' && _chr4 != '\r', "USER_GCODE_4 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_5 - constexpr char _chr5 = USER_GCODE_5[strlen(USER_GCODE_5) - 1]; - static_assert(_chr5 != '\n' && _chr5 != '\r', "USER_GCODE_5 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_6 - constexpr char _chr6 = USER_GCODE_6[strlen(USER_GCODE_6) - 1]; - static_assert(_chr6 != '\n' && _chr6 != '\r', "USER_GCODE_6 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_7 - constexpr char _chr7 = USER_GCODE_7[strlen(USER_GCODE_7) - 1]; - static_assert(_chr7 != '\n' && _chr7 != '\r', "USER_GCODE_7 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_8 - constexpr char _chr8 = USER_GCODE_8[strlen(USER_GCODE_8) - 1]; - static_assert(_chr8 != '\n' && _chr8 != '\r', "USER_GCODE_8 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_9 - constexpr char _chr9 = USER_GCODE_9[strlen(USER_GCODE_9) - 1]; - static_assert(_chr9 != '\n' && _chr9 != '\r', "USER_GCODE_9 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_10 - constexpr char _chr10 = USER_GCODE_10[strlen(USER_GCODE_10) - 1]; - static_assert(_chr10 != '\n' && _chr10 != '\r', "USER_GCODE_10 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_11 - constexpr char _chr11 = USER_GCODE_11[strlen(USER_GCODE_11) - 1]; - static_assert(_chr11 != '\n' && _chr11 != '\r', "USER_GCODE_11 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_12 - constexpr char _chr12 = USER_GCODE_12[strlen(USER_GCODE_12) - 1]; - static_assert(_chr12 != '\n' && _chr12 != '\r', "USER_GCODE_12 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_13 - constexpr char _chr13 = USER_GCODE_13[strlen(USER_GCODE_13) - 1]; - static_assert(_chr13 != '\n' && _chr13 != '\r', "USER_GCODE_13 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_14 - constexpr char _chr14 = USER_GCODE_14[strlen(USER_GCODE_14) - 1]; - static_assert(_chr14 != '\n' && _chr14 != '\r', "USER_GCODE_14 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_15 - constexpr char _chr15 = USER_GCODE_15[strlen(USER_GCODE_15) - 1]; - static_assert(_chr15 != '\n' && _chr15 != '\r', "USER_GCODE_15 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_16 - constexpr char _chr16 = USER_GCODE_16[strlen(USER_GCODE_16) - 1]; - static_assert(_chr16 != '\n' && _chr16 != '\r', "USER_GCODE_16 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_17 - constexpr char _chr17 = USER_GCODE_17[strlen(USER_GCODE_17) - 1]; - static_assert(_chr17 != '\n' && _chr17 != '\r', "USER_GCODE_17 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_18 - constexpr char _chr18 = USER_GCODE_18[strlen(USER_GCODE_18) - 1]; - static_assert(_chr18 != '\n' && _chr18 != '\r', "USER_GCODE_18 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_19 - constexpr char _chr19 = USER_GCODE_19[strlen(USER_GCODE_19) - 1]; - static_assert(_chr19 != '\n' && _chr19 != '\r', "USER_GCODE_19 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_20 - constexpr char _chr20 = USER_GCODE_20[strlen(USER_GCODE_20) - 1]; - static_assert(_chr20 != '\n' && _chr20 != '\r', "USER_GCODE_20 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_21 - constexpr char _chr21 = USER_GCODE_21[strlen(USER_GCODE_21) - 1]; - static_assert(_chr21 != '\n' && _chr21 != '\r', "USER_GCODE_21 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_22 - constexpr char _chr22 = USER_GCODE_22[strlen(USER_GCODE_22) - 1]; - static_assert(_chr22 != '\n' && _chr22 != '\r', "USER_GCODE_22 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_23 - constexpr char _chr23 = USER_GCODE_23[strlen(USER_GCODE_23) - 1]; - static_assert(_chr23 != '\n' && _chr23 != '\r', "USER_GCODE_23 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_24 - constexpr char _chr24 = USER_GCODE_24[strlen(USER_GCODE_24) - 1]; - static_assert(_chr24 != '\n' && _chr24 != '\r', "USER_GCODE_24 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_25 - constexpr char _chr25 = USER_GCODE_25[strlen(USER_GCODE_25) - 1]; - static_assert(_chr25 != '\n' && _chr25 != '\r', "USER_GCODE_25 cannot have a newline at the end. Please remove it."); - #endif -#endif - -#if ENABLED(BACKLASH_COMPENSATION) - #ifndef BACKLASH_DISTANCE_MM - #error "BACKLASH_COMPENSATION requires BACKLASH_DISTANCE_MM." - #elif !defined(BACKLASH_CORRECTION) - #error "BACKLASH_COMPENSATION requires BACKLASH_CORRECTION." - #elif ENABLED(MARKFORGED_XY) - constexpr float backlash_arr[] = BACKLASH_DISTANCE_MM; - static_assert(!backlash_arr[CORE_AXIS_1] && !backlash_arr[CORE_AXIS_2], - "BACKLASH_COMPENSATION can only apply to " STRINGIFY(NORMAL_AXIS) " on a MarkForged system."); - #elif IS_CORE - constexpr float backlash_arr[] = BACKLASH_DISTANCE_MM; - static_assert(!backlash_arr[CORE_AXIS_1] && !backlash_arr[CORE_AXIS_2], - "BACKLASH_COMPENSATION can only apply to " STRINGIFY(NORMAL_AXIS) " with your CORE system."); - #endif -#endif - -#if ENABLED(GRADIENT_MIX) && MIXING_VIRTUAL_TOOLS < 2 - #error "GRADIENT_MIX requires 2 or more MIXING_VIRTUAL_TOOLS." -#endif - -/** - * Photo G-code requirements - */ -#if ENABLED(PHOTO_GCODE) - #if (PIN_EXISTS(CHDK) + PIN_EXISTS(PHOTOGRAPH) + defined(PHOTO_SWITCH_POSITION)) > 1 - #error "Please define only one of CHDK_PIN, PHOTOGRAPH_PIN, or PHOTO_SWITCH_POSITION." - #elif defined(PHOTO_SWITCH_POSITION) && !defined(PHOTO_POSITION) - #error "PHOTO_SWITCH_POSITION requires PHOTO_POSITION. Please update your Configuration_adv.h." - #elif PIN_EXISTS(CHDK) && defined(CHDK_DELAY) - #error "CHDK_DELAY has been replaced by PHOTO_SWITCH_MS. Please update your Configuration_adv.h." - #elif PIN_EXISTS(CHDK) && !defined(PHOTO_SWITCH_MS) - #error "PHOTO_SWITCH_MS is required with CHDK_PIN. Please update your Configuration_adv.h." - #elif defined(PHOTO_RETRACT_MM) - static_assert(PHOTO_RETRACT_MM + 0 >= 0, "PHOTO_RETRACT_MM must be >= 0."); - #endif -#endif - -/** - * Průša MMU2 requirements - */ -#if ENABLED(PRUSA_MMU2) - #if EXTRUDERS != 5 - #error "PRUSA_MMU2 requires EXTRUDERS = 5." - #elif DISABLED(NOZZLE_PARK_FEATURE) - #error "PRUSA_MMU2 requires NOZZLE_PARK_FEATURE. Enable it to continue." - #elif EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR) - #error "PRUSA_MMU2_S_MODE or MMU_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue." - #elif BOTH(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) - #error "Enable only one of PRUSA_MMU2_S_MODE or MMU_EXTRUDER_SENSOR." - #elif DISABLED(ADVANCED_PAUSE_FEATURE) - static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2."); - #endif -#endif - -/** - * Advanced PRINTCOUNTER settings - */ -#if ENABLED(PRINTCOUNTER) - #if defined(SERVICE_INTERVAL_1) != defined(SERVICE_NAME_1) - #error "Both SERVICE_NAME_1 and SERVICE_INTERVAL_1 are required." - #elif defined(SERVICE_INTERVAL_2) != defined(SERVICE_NAME_2) - #error "Both SERVICE_NAME_2 and SERVICE_INTERVAL_2 are required." - #elif defined(SERVICE_INTERVAL_3) != defined(SERVICE_NAME_3) - #error "Both SERVICE_NAME_3 and SERVICE_INTERVAL_3 are required." - #endif -#endif - -/** - * Require soft endstops for certain setups - */ -#if !BOTH(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) - #if ENABLED(DUAL_X_CARRIAGE) - #error "DUAL_X_CARRIAGE requires both MIN_ and MAX_SOFTWARE_ENDSTOPS." - #elif HAS_HOTEND_OFFSET - #error "MIN_ and MAX_SOFTWARE_ENDSTOPS are both required with offset hotends." - #endif -#endif - -/** - * Ensure this option is set intentionally - */ -#if ENABLED(PSU_CONTROL) - #ifndef PSU_ACTIVE_STATE - #error "PSU_CONTROL requires PSU_ACTIVE_STATE to be defined as 'HIGH' or 'LOW'." - #elif !PIN_EXISTS(PS_ON) - #error "PSU_CONTROL requires PS_ON_PIN." - #endif -#elif ENABLED(AUTO_POWER_CONTROL) - #error "AUTO_POWER_CONTROL requires PSU_CONTROL." -#endif - -#if HAS_CUTTER - #ifndef CUTTER_POWER_UNIT - #error "CUTTER_POWER_UNIT is required with a spindle or laser. Please update your Configuration_adv.h." - #elif !CUTTER_UNIT_IS(PWM255) && !CUTTER_UNIT_IS(PERCENT) && !CUTTER_UNIT_IS(RPM) - #error "CUTTER_POWER_UNIT must be PWM255, PERCENT, or RPM. Please update your Configuration_adv.h." - #endif - - #if ENABLED(LASER_POWER_INLINE) - #if ENABLED(SPINDLE_CHANGE_DIR) - #error "SPINDLE_CHANGE_DIR and LASER_POWER_INLINE are incompatible." - #elif ENABLED(LASER_MOVE_G0_OFF) && DISABLED(LASER_MOVE_POWER) - #error "LASER_MOVE_G0_OFF requires LASER_MOVE_POWER. Please update your Configuration_adv.h." - #endif - #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) - #if DISABLED(SPINDLE_LASER_PWM) - #error "LASER_POWER_INLINE_TRAPEZOID requires SPINDLE_LASER_PWM to function." - #elif ENABLED(S_CURVE_ACCELERATION) - //#ifndef LASER_POWER_INLINE_S_CURVE_ACCELERATION_WARN - // #define LASER_POWER_INLINE_S_CURVE_ACCELERATION_WARN - // #warning "Combining LASER_POWER_INLINE_TRAPEZOID with S_CURVE_ACCELERATION may result in unintended behavior." - //#endif - #endif - #endif - #if ENABLED(LASER_POWER_INLINE_INVERT) - //#ifndef LASER_POWER_INLINE_INVERT_WARN - // #define LASER_POWER_INLINE_INVERT_WARN - // #warning "Enabling LASER_POWER_INLINE_INVERT means that `M5` won't kill the laser immediately; use `M5 I` instead." - //#endif - #endif - #else - #if SPINDLE_LASER_POWERUP_DELAY < 1 - #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." - #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 - #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." - #elif ENABLED(LASER_MOVE_POWER) - #error "LASER_MOVE_POWER requires LASER_POWER_INLINE." - #elif ANY(LASER_POWER_INLINE_TRAPEZOID, LASER_POWER_INLINE_INVERT, LASER_MOVE_G0_OFF, LASER_MOVE_POWER) - #error "Enabled an inline laser feature without inline laser power being enabled." - #endif - #endif - #define _PIN_CONFLICT(P) (PIN_EXISTS(P) && P##_PIN == SPINDLE_LASER_PWM_PIN) - #if BOTH(SPINDLE_FEATURE, LASER_FEATURE) - #error "Enable only one of SPINDLE_FEATURE or LASER_FEATURE." - #elif !PIN_EXISTS(SPINDLE_LASER_ENA) - #error "(SPINDLE|LASER)_FEATURE requires SPINDLE_LASER_ENA_PIN." - #elif ENABLED(SPINDLE_CHANGE_DIR) && !PIN_EXISTS(SPINDLE_DIR) - #error "SPINDLE_DIR_PIN is required for SPINDLE_CHANGE_DIR." - #elif ENABLED(SPINDLE_LASER_PWM) - #if !defined(SPINDLE_LASER_PWM_PIN) || SPINDLE_LASER_PWM_PIN < 0 - #error "SPINDLE_LASER_PWM_PIN is required for SPINDLE_LASER_PWM." - #elif !_TEST_PWM(SPINDLE_LASER_PWM_PIN) - #error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin." - #elif !defined(SPINDLE_LASER_PWM_INVERT) - #error "SPINDLE_LASER_PWM_INVERT is required for (SPINDLE|LASER)_FEATURE." - #elif !(defined(SPEED_POWER_INTERCEPT) && defined(SPEED_POWER_MIN) && defined(SPEED_POWER_MAX) && defined(SPEED_POWER_STARTUP)) - #error "SPINDLE_LASER_PWM equation constant(s) missing." - #elif _PIN_CONFLICT(X_MIN) - #error "SPINDLE_LASER_PWM pin conflicts with X_MIN_PIN." - #elif _PIN_CONFLICT(X_MAX) - #error "SPINDLE_LASER_PWM pin conflicts with X_MAX_PIN." - #elif _PIN_CONFLICT(Z_STEP) - #error "SPINDLE_LASER_PWM pin conflicts with Z_STEP_PIN." - #elif _PIN_CONFLICT(CASE_LIGHT) - #error "SPINDLE_LASER_PWM_PIN conflicts with CASE_LIGHT_PIN." - #elif _PIN_CONFLICT(E0_AUTO_FAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with E0_AUTO_FAN_PIN." - #elif _PIN_CONFLICT(E1_AUTO_FAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with E1_AUTO_FAN_PIN." - #elif _PIN_CONFLICT(E2_AUTO_FAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with E2_AUTO_FAN_PIN." - #elif _PIN_CONFLICT(E3_AUTO_FAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with E3_AUTO_FAN_PIN." - #elif _PIN_CONFLICT(E4_AUTO_FAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with E4_AUTO_FAN_PIN." - #elif _PIN_CONFLICT(E5_AUTO_FAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with E5_AUTO_FAN_PIN." - #elif _PIN_CONFLICT(E6_AUTO_FAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with E6_AUTO_FAN_PIN." - #elif _PIN_CONFLICT(E7_AUTO_FAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with E7_AUTO_FAN_PIN." - #elif _PIN_CONFLICT(FAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with FAN_PIN." - #elif _PIN_CONFLICT(FAN1) - #error "SPINDLE_LASER_PWM_PIN conflicts with FAN1_PIN." - #elif _PIN_CONFLICT(FAN2) - #error "SPINDLE_LASER_PWM_PIN conflicts with FAN2_PIN." - #elif _PIN_CONFLICT(FAN3) - #error "SPINDLE_LASER_PWM_PIN conflicts with FAN3_PIN." - #elif _PIN_CONFLICT(FAN4) - #error "SPINDLE_LASER_PWM_PIN conflicts with FAN4_PIN." - #elif _PIN_CONFLICT(FAN5) - #error "SPINDLE_LASER_PWM_PIN conflicts with FAN5_PIN." - #elif _PIN_CONFLICT(FAN6) - #error "SPINDLE_LASER_PWM_PIN conflicts with FAN6_PIN." - #elif _PIN_CONFLICT(FAN7) - #error "SPINDLE_LASER_PWM_PIN conflicts with FAN7_PIN." - #elif _PIN_CONFLICT(CONTROLLERFAN) - #error "SPINDLE_LASER_PWM_PIN conflicts with CONTROLLERFAN_PIN." - #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_XY) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY." - #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_Z) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z." - #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_E) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E." - #endif - #endif - #undef _PIN_CONFLICT -#endif - -#if !HAS_MARLINUI_U8GLIB - #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) - #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD." - #endif -#endif - -#if HAS_ADC_BUTTONS && defined(ADC_BUTTON_DEBOUNCE_DELAY) && ADC_BUTTON_DEBOUNCE_DELAY < 16 - #error "ADC_BUTTON_DEBOUNCE_DELAY must be greater than 16." -#endif - -/** - * Check to make sure MONITOR_DRIVER_STATUS isn't enabled - * on boards where TMC drivers share the SPI bus with SD. - */ -#if HAS_TMC_SPI && ALL(MONITOR_DRIVER_STATUS, SDSUPPORT, USES_SHARED_SPI) - #error "MONITOR_DRIVER_STATUS and SDSUPPORT cannot be used together on boards with shared SPI." -#endif - -// G60/G61 Position Save -#if SAVED_POSITIONS > 256 - #error "SAVED_POSITIONS must be an integer from 0 to 256." -#endif - -/** - * Stepper Chunk support - */ -#if BOTH(DIRECT_STEPPING, LIN_ADVANCE) - #error "DIRECT_STEPPING is incompatible with LIN_ADVANCE. Enable in external planner if possible." -#endif - -/** - * Touch Buttons - */ -#if ENABLED(TOUCH_SCREEN) - #ifndef XPT2046_X_CALIBRATION - #error "XPT2046_X_CALIBRATION must be defined with TOUCH_SCREEN." - #endif - #ifndef XPT2046_Y_CALIBRATION - #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_SCREEN." - #endif - #ifndef XPT2046_X_OFFSET - #error "XPT2046_X_OFFSET must be defined with TOUCH_SCREEN." - #endif - #ifndef XPT2046_Y_OFFSET - #error "XPT2046_Y_OFFSET must be defined with TOUCH_SCREEN." - #endif -#endif - -/** - * Sanity check for WIFI - */ -#if EITHER(ESP3D_WIFISUPPORT, WIFISUPPORT) && DISABLED(ARDUINO_ARCH_ESP32) - #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 MOTHERBOARD." -#endif - -/** - * Sanity Check for Password Feature - */ -#if ENABLED(PASSWORD_FEATURE) - #if NONE(HAS_LCD_MENU, PASSWORD_UNLOCK_GCODE, PASSWORD_CHANGE_GCODE) - #error "Without PASSWORD_UNLOCK_GCODE, PASSWORD_CHANGE_GCODE, or a supported LCD there's no way to unlock the printer or set a password." - #elif DISABLED(EEPROM_SETTINGS) - #warning "PASSWORD_FEATURE settings will be lost on power-off without EEPROM_SETTINGS." - #endif -#endif - -// Misc. Cleanup -#undef _TEST_PWM +#endif // _SANITYCHECK_H_ diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 00ca940662..161411774a 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,107 +16,86 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef _VERSION_H_ +#define _VERSION_H_ + +#include "../core/macros.h" // for ENABLED /** - * Release version. Leave the Marlin version or apply a custom scheme. - */ -#ifndef SHORT_BUILD_VERSION - #define SHORT_BUILD_VERSION "2.0.7.2" -#endif - -/** - * Verbose version identifier containing a unique identifier, such as the - * vendor name, download location, GitHub account, etc. - */ -#ifndef DETAILED_BUILD_VERSION - #define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION -#endif - -/** - * The STRING_DISTRIBUTION_DATE represents when the binary file was built, - * here we define this default string as the date where the latest release - * version was tagged. - */ -#ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2020-10-15" -#endif - -/** - * Minimum Configuration.h and Configuration_adv.h file versions. - * Set based on the release version number. Used to catch an attempt to use - * older configurations. Override these if using a custom versioning scheme - * to alert users to major changes. + * This file is the standard Marlin version identifier file. + * Use -DUSE_AUTOMATIC_VERSIONING=1 and a custom _Version.h + * to override these values. */ -#define MARLIN_HEX_VERSION 020007 -#ifndef REQUIRED_CONFIGURATION_H_VERSION - #define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION -#endif -#ifndef REQUIRED_CONFIGURATION_ADV_H_VERSION - #define REQUIRED_CONFIGURATION_ADV_H_VERSION MARLIN_HEX_VERSION -#endif +#if ENABLED(USE_AUTOMATIC_VERSIONING) -/** - * The protocol for communication to the host. Protocol indicates communication - * standards such as the use of ASCII, "echo:" and "error:" line prefixes, etc. - * (Other behaviors are given by the firmware version and capabilities report.) - */ -#ifndef PROTOCOL_VERSION + #include "_Version.h" + +#else + + /** + * Marlin release version identifier + */ + #define SHORT_BUILD_VERSION "bugfix-2.0.x" + + /** + * Verbose version identifier which should contain a reference to the location + * from where the binary was downloaded or the source code was compiled. + */ + #define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION " (Github)" + + /** + * The STRING_DISTRIBUTION_DATE represents when the binary file was built, + * here we define this default string as the date where the latest release + * version was tagged. + */ + #define STRING_DISTRIBUTION_DATE "2018-01-20" + + /** + * Required minimum Configuration.h and Configuration_adv.h file versions. + * + * You must increment this version number for every significant change such as, + * but not limited to: ADD, DELETE RENAME OR REPURPOSE any directive/option on + * the configuration files. + */ + #define REQUIRED_CONFIGURATION_H_VERSION 020000 + #define REQUIRED_CONFIGURATION_ADV_H_VERSION 020000 + + /** + * The protocol for communication to the host. Protocol indicates communication + * standards such as the use of ASCII, "echo:" and "error:" line prefixes, etc. + * (Other behaviors are given by the firmware version and capabilities report.) + */ #define PROTOCOL_VERSION "1.0" -#endif -/** - * Define a generic printer name to be output to the LCD after booting Marlin. - */ -#ifndef MACHINE_NAME + /** + * Defines a generic printer name to be output to the LCD after booting Marlin. + */ #define MACHINE_NAME "3D Printer" -#endif -/** - * Website where users can find Marlin source code for the binary installed on the - * device. Override this if you provide public source code download. (GPLv3 requires - * providing the source code to your customers.) - */ -#ifndef SOURCE_CODE_URL + /** + * The SOURCE_CODE_URL is the location where users will find the Marlin Source + * Code which is installed on the device. In most cases —unless the manufacturer + * has a distinct Github fork— the Source Code URL should just be the main + * Marlin repository. + */ #define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin" -#endif -/** - * Default generic printer UUID. - */ -#ifndef DEFAULT_MACHINE_UUID + /** + * Default generic printer UUID. + */ #define DEFAULT_MACHINE_UUID "cede2a2f-41a2-4748-9b12-c55c62f367ff" -#endif /** * The WEBSITE_URL is the location where users can get more information such as - * documentation about a specific Marlin release. Displayed in the Info Menu. + * documentation about a specific Marlin release. */ -#ifndef WEBSITE_URL - #define WEBSITE_URL "https://marlinfw.org" -#endif + #define WEBSITE_URL "http://marlinfw.org" -/** - * Set the vendor info the serial USB interface, if changable - * Currently only supported by DUE platform - */ -#ifndef USB_DEVICE_VENDOR_ID - #define USB_DEVICE_VENDOR_ID 0x03EB /* ATMEL VID */ -#endif -#ifndef USB_DEVICE_PRODUCT_ID - #define USB_DEVICE_PRODUCT_ID 0x2424 /* MSC / CDC */ -#endif -//! USB Device string definitions (Optional) -#ifndef USB_DEVICE_MANUFACTURE_NAME - #define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL -#endif -#ifdef CUSTOM_MACHINE_NAME - #define USB_DEVICE_PRODUCT_NAME CUSTOM_MACHINE_NAME -#else - #define USB_DEVICE_PRODUCT_NAME MACHINE_NAME -#endif -#define USB_DEVICE_SERIAL_NAME "123985739853" +#endif // USE_AUTOMATIC_VERSIONING + +#endif // _VERSION_H_ diff --git a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp deleted file mode 100644 index aa3c3c04a1..0000000000 --- a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp +++ /dev/null @@ -1,1122 +0,0 @@ -/** - * @file lcdprint_hd44780.cpp - * @brief LCD print api for HD44780 - * @author Yunhui Fu (yhfudev@gmail.com) - * @version 1.0 - * @date 2016-08-19 - * @copyright GPL/BSD - */ - -/** - * Due to the limitation of the HD44780 hardware, the current available LCD modules can only support - * Western(English), Cyrillic(Russian), Kana(Japanese) charsets. - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_HD44780 - -#include "../ultralcd.h" -#include "../../MarlinCore.h" - -#include "ultralcd_HD44780.h" - -#include - -extern LCD_CLASS lcd; - -int lcd_glyph_height() { return 1; } - -typedef struct _hd44780_charmap_t { - wchar_t uchar; // the unicode char - uint8_t idx; // the glyph of the char in the ROM - uint8_t idx2; // the char used to be combined with the idx to simulate a single char -} hd44780_charmap_t; - -#ifdef __AVR__ - #define IV(a) U##a -#else - #define IV(a) L##a -#endif - -static const hd44780_charmap_t g_hd44780_charmap_device[] PROGMEM = { - // sorted by uchar: - #if DISPLAY_CHARSET_HD44780 == JAPANESE - - {IV('¢'), 0xEC, 0}, // A2 - {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09) - {IV('ä'), 0xE1, 0}, // E4 - {IV('ö'), 0xEF, 0}, // F6 - {IV('÷'), 0xFD, 0}, // 00F7 - {IV('ü'), 0xF5, 0}, // 00FC - {IV('ˣ'), 0xEB, 0}, // 02E3 - - {IV('·'), 0xA5, 0}, // 0387 - {IV('Ώ'), 0xF4, 0}, // 038F - {IV('Θ'), 0xF2, 0}, // 0398, Theta - {IV('Ξ'), 0xE3, 0}, // 039E, Xi - {IV('Σ'), 0xF6, 0}, // 03A3, Sigma - {IV('Ω'), 0xF4, 0}, // 03A9, Omega - {IV('ά'), 0xE0, 0}, // 03AC - {IV('έ'), 0xE3, 0}, // 03AD - {IV('α'), 0xE0, 0}, // 03B1, alpha - {IV('β'), 0xE2, 0}, // 03B2, beta - {IV('ε'), 0xE3, 0}, // 03B5, epsilon - {IV('θ'), 0xF2, 0}, // 03B8, theta - {IV('μ'), 0xE4, 0}, // 03BC, mu - {IV('ξ'), 0xE3, 0}, // 03BE, xi - {IV('π'), 0xF7, 0}, // 03C0, pi - {IV('ρ'), 0xE6, 0}, // 03C1, rho - {IV('σ'), 0xE5, 0}, // 03C3, sigma - - {IV('←'), 0x7F, 0}, // 2190 - {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03) - {IV('√'), 0xE8, 0}, // 221A - {IV('∞'), 0xF3, 0}, // 221E - {IV('█'), 0xFF, 0}, // 2588 - - //{IV(''), 0xA0, 0}, - {IV('。'), 0xA1, 0}, - {IV('「'), 0xA2, 0}, - {IV('」'), 0xA3, 0}, - {IV('゛'), 0xDE, 0}, // ‶ - {IV('゜'), 0xDF, 0}, // '〫' - {IV('゠'), '=', 0}, - {IV('ァ'), 0xA7, 0}, - {IV('ア'), 0xB1, 0}, - {IV('ィ'), 0xA8, 0}, - {IV('イ'), 0xB2, 0}, - {IV('ゥ'), 0xA9, 0}, - {IV('ウ'), 0xB3, 0}, - {IV('ェ'), 0xAA, 0}, - {IV('エ'), 0xB4, 0}, - {IV('ォ'), 0xAB, 0}, - - {IV('オ'), 0xB5, 0}, - {IV('カ'), 0xB6, 0}, - {IV('ガ'), 0xB6, 0xDE}, - {IV('キ'), 0xB7, 0}, - {IV('ギ'), 0xB7, 0xDE}, - {IV('ク'), 0xB8, 0}, - {IV('グ'), 0xB8, 0xDE}, - {IV('ケ'), 0xB9, 0}, - {IV('ゲ'), 0xB9, 0xDE}, - {IV('コ'), 0xBA, 0}, - {IV('ゴ'), 0xBA, 0xDE}, - {IV('サ'), 0xBB, 0}, - {IV('ザ'), 0xBB, 0xDE}, - {IV('シ'), 0xBC, 0}, - {IV('ジ'), 0xBC, 0xDE}, - {IV('ス'), 0xBD, 0}, - {IV('ズ'), 0xBD, 0xDE}, - {IV('セ'), 0xBE, 0}, - {IV('ゼ'), 0xBE, 0xDE}, - {IV('ソ'), 0xBF, 0}, - {IV('ゾ'), 0xBF, 0xDE}, - - {IV('タ'), 0xC0, 0}, - {IV('ダ'), 0xC0, 0xDE}, - {IV('チ'), 0xC1, 0}, - {IV('ヂ'), 0xC1, 0xDE}, - {IV('ッ'), 0xAF, 0}, - {IV('ツ'), 0xC2, 0}, - {IV('ヅ'), 0xC2, 0xDE}, - {IV('テ'), 0xC3, 0}, - {IV('デ'), 0xC3, 0xDE}, - {IV('ト'), 0xC4, 0}, - {IV('ド'), 0xC4, 0xDE}, - {IV('ナ'), 0xC5, 0}, - {IV('ニ'), 0xC6, 0}, - {IV('ヌ'), 0xC7, 0}, - {IV('ネ'), 0xC8, 0}, - {IV('ノ'), 0xC9, 0}, - {IV('ハ'), 0xCA, 0}, - {IV('バ'), 0xCA, 0xDE}, - {IV('パ'), 0xCA, 0xDF}, - {IV('ヒ'), 0xCB, 0}, - {IV('ビ'), 0xCB, 0xDE}, - {IV('ピ'), 0xCB, 0xDF}, - {IV('フ'), 0xCC, 0}, - {IV('ブ'), 0xCC, 0xDE}, - {IV('プ'), 0xCC, 0xDF}, - {IV('ヘ'), 0xCD, 0}, - {IV('ベ'), 0xCD, 0xDE}, - {IV('ペ'), 0xCD, 0xDF}, - {IV('ホ'), 0xCE, 0}, - {IV('ボ'), 0xCE, 0xDE}, - {IV('ポ'), 0xCE, 0xDF}, - {IV('マ'), 0xCF, 0}, - - {IV('ミ'), 0xD0, 0}, - {IV('ム'), 0xD1, 0}, - {IV('メ'), 0xD2, 0}, - {IV('モ'), 0xD3, 0}, - {IV('ャ'), 0xAC, 0}, - {IV('ヤ'), 0xD4, 0}, - {IV('ュ'), 0xAD, 0}, - {IV('ユ'), 0xD5, 0}, - {IV('ョ'), 0xAE, 0}, - {IV('ヨ'), 0xD6, 0}, - {IV('ラ'), 0xD7, 0}, - {IV('リ'), 0xD8, 0}, - {IV('ル'), 0xD9, 0}, - {IV('レ'), 0xDA, 0}, - {IV('ロ'), 0xDB, 0}, - {IV('ワ'), 0xDC, 0}, - {IV('ヲ'), 0xA6, 0}, - {IV('ン'), 0xDD, 0}, - {IV('ヴ'), 0xB3, 0xDE}, - {IV('ヷ'), 0xDC, 0xDE}, - {IV('ヺ'), 0xA6, 0xDE}, - {IV('・'), 0xA5, 0}, - {IV('ー'), 0xB0, 0}, - {IV('ヽ'), 0xA4, 0}, - - //{IV('g'), 0xE7, 0}, // error - //{IV(''), 0xE9, 0}, - //{IV('j'), 0xEA, 0}, // error - //{IV(''), 0xED, 0}, - //{IV(''), 0xEE, 0}, - - //{IV('p'), 0xF0, 0}, // error - //{IV('q'), 0xF1, 0}, // error - //{IV(''), 0xF8, 0}, - //{IV('y'), 0xF9, 0}, // error - {IV('万'), 0xFB, 0}, - {IV('円'), 0xFC, 0}, - {IV('千'), 0xFA, 0}, - //{IV(''), 0xFE, 0}, - - //、・ヲァィゥェォャュョッー - {IV('、'), 0xA4, 0}, //ヽ - {IV('・'), 0xA5, 0}, //・ - {IV('ヲ'), 0xA6, 0}, //ヲ - {IV('ァ'), 0xA7, 0}, //ァ - {IV('ィ'), 0xA8, 0}, //ィ - {IV('ゥ'), 0xA9, 0}, //ゥ - {IV('ェ'), 0xAA, 0}, //ェ - {IV('ォ'), 0xAB, 0}, //ォ - {IV('ャ'), 0xAC, 0}, //ャ - {IV('ュ'), 0xAD, 0}, //ュ - {IV('ョ'), 0xAE, 0}, //ョ - {IV('ッ'), 0xAF, 0}, //ッ - {IV('ー'), 0xB0, 0}, //ー - - //アイウエオカキクケコサシスセ - {IV('ア'), 0xB1, 0}, //ア - {IV('イ'), 0xB2, 0}, //イ - {IV('ウ'), 0xB3, 0}, //ウ - {IV('エ'), 0xB4, 0}, //エ - {IV('オ'), 0xB5, 0}, //オ - {IV('カ'), 0xB6, 0}, //カ - {IV('キ'), 0xB7, 0}, //キ - {IV('ク'), 0xB8, 0}, //ク - {IV('ケ'), 0xB9, 0}, //ケ - {IV('コ'), 0xBA, 0}, //コ - {IV('サ'), 0xBB, 0}, //サ - {IV('シ'), 0xBC, 0}, //シ - {IV('ス'), 0xBD, 0}, //ス - {IV('セ'), 0xBE, 0}, //セ - - //ソタチツテトナニヌネノハヒフ - {IV('ソ'), 0xBF, 0}, //ソ - {IV('タ'), 0xC0, 0}, //タ - {IV('チ'), 0xC1, 0}, //チ - {IV('ツ'), 0xC2, 0}, //ツ - {IV('テ'), 0xC3, 0}, //テ - {IV('ト'), 0xC4, 0}, //ト - {IV('ナ'), 0xC5, 0}, //ナ - {IV('ニ'), 0xC6, 0}, //ニ - {IV('ヌ'), 0xC7, 0}, //ヌ - {IV('ネ'), 0xC8, 0}, //ネ - {IV('ノ'), 0xC9, 0}, //ノ - {IV('ハ'), 0xCA, 0}, //ハ - {IV('ヒ'), 0xCB, 0}, //ヒ - {IV('フ'), 0xCC, 0}, //フ - - //ヘホマミムメモヤユヨラリルレロワン゙゚ - {IV('ヘ'), 0xCD, 0}, //ヘ - {IV('ホ'), 0xCE, 0}, //ホ - {IV('マ'), 0xCF, 0}, //マ - {IV('ミ'), 0xD0, 0}, //ミ - {IV('ム'), 0xD1, 0}, //ム - {IV('メ'), 0xD2, 0}, //メ - {IV('モ'), 0xD3, 0}, //モ - {IV('ヤ'), 0xD4, 0}, //ヤ - {IV('ユ'), 0xD5, 0}, //ユ - {IV('ヨ'), 0xD6, 0}, //ヨ - {IV('ラ'), 0xD7, 0}, //ラ - {IV('リ'), 0xD8, 0}, //リ - {IV('ル'), 0xD9, 0}, //ル - {IV('レ'), 0xDA, 0}, //レ - {IV('ロ'), 0xDB, 0}, //ロ - {IV('ワ'), 0xDC, 0}, //ワ - {IV('ン'), 0xDD, 0}, //ン - {IV('゙'), 0xDE, 0}, // ゛ - {IV('゚'), 0xDF, 0}, // ゜ - - {IV('¥'), 0x5C, 0}, - - #elif DISPLAY_CHARSET_HD44780 == WESTERN - // 0x10 -- 0x1F (except 0x1C) - // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF) - - {IV('¡'), 0xA9, 0}, - {IV('¢'), 0xA4, 0}, - {IV('£'), 0xA5, 0}, - {IV('¥'), 0xA6, 0}, - {IV('§'), 0xD2, 0}, // section sign - {IV('©'), 0xCF, 0}, - - {IV('ª'), 0x9D, 0}, - {IV('«'), 0xBB, 0}, - {IV('®'), 0xCE, 0}, - - {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09) - //{IV(''), 0xD1, 0}, - {IV('±'), 0x10, 0}, //∓± - //{'='), 0x1C, 0}, // error - {IV('²'), 0x1E, 0}, - {IV('³'), 0x1F, 0}, - {IV('¶'), 0xD3, 0}, // pilcrow sign - {IV('º'), 0x9E, 0}, - {IV('»'), 0xBC, 0}, // 00BB - //{IV(''), 0xB3, 0}, // error - //{IV(''), 0xB4, 0}, // error - {IV('¼'), 0xB6, 0}, // 00BC - {IV('½'), 0xB5, 0}, // 00BD - //{IV('¾'), '3', 0}, // 00BE - {IV('¿'), 0x9F, 0}, // 00BF - - {IV('Â'), 0x8F, 0}, - {IV('Ã'), 0xAA, 0}, - {IV('Ä'), 0x8E, 0}, - {IV('Æ'), 0x92, 0}, - {IV('Ç'), 0x80, 0}, - {IV('É'), 0x90, 0}, - {IV('Ñ'), 0x9C, 0}, - {IV('Õ'), 0xAC, 0}, - {IV('Ö'), 0x99, 0}, - {IV('×'), 0xB7, 0}, - {IV('Ø'), 0xAE, 0}, - {IV('Ü'), 0x9A, 0}, - {IV('à'), 0x85, 0}, - {IV('á'), 0xA0, 0}, - {IV('â'), 0x83, 0}, - {IV('ã'), 0xAB, 0}, - {IV('ä'), 0x84, 0}, - {IV('å'), 0x86, 0}, - {IV('æ'), 0x91, 0}, - {IV('ç'), 0x87, 0}, - {IV('è'), 0x8A, 0}, - {IV('é'), 0x82, 0}, - {IV('ê'), 0x88, 0}, - {IV('ë'), 0x89, 0}, - {IV('ì'), 0x8D, 0}, - {IV('í'), 0xA1, 0}, - {IV('î'), 0x8C, 0}, - {IV('ï'), 0x8B, 0}, - - {IV('ñ'), 0x9B, 0}, - {IV('ò'), 0x95, 0}, - {IV('ó'), 0xA2, 0}, - {IV('ô'), 0x93, 0}, - {IV('õ'), 0xAD, 0}, - {IV('ö'), 0x94, 0}, - {IV('÷'), 0xB8, 0}, - {IV('ø'), 0xAF, 0}, - {IV('ù'), 0x97, 0}, - {IV('ú'), 0xA3, 0}, - {IV('û'), 0x96, 0}, - {IV('ü'), 0x81, 0}, - {IV('ÿ'), 0x98, 0}, - - //{IV(''), 0xB0, 0}, // error - //{IV(''), 0xB1, 0}, // error - {IV('ƒ'), 0xA8, 0}, // 0192 - - {IV('Ύ'), 0xDB, 0}, // 038E - {IV('Ώ'), 0xDE, 0}, // 038F - {IV('ΐ'), 0xE7, 0}, // 0390 - - {IV('Γ'), 0xD4, 0}, // 0393, Gamma - {IV('Δ'), 0xD5, 0}, // 0394, Delta, ◿ - {IV('Θ'), 0xD6, 0}, // 0398, Theta - {IV('Λ'), 0xD7, 0}, // 039B, Lambda - {IV('Ξ'), 0xD8, 0}, // 039E, Xi - {IV('Π'), 0xD9, 0}, // Pi - {IV('Σ'), 0xDA, 0}, // Sigma - {IV('Υ'), 0xDB, 0}, // Upsilon - {IV('Φ'), 0xDC, 0}, // Phi - {IV('Ψ'), 0xDD, 0}, // Psi - {IV('Ω'), 0xDE, 0}, // Omega - - {IV('ά'), 0xDF, 0}, // 03AC - {IV('έ'), 0xE3, 0}, // 03AD - {IV('ή'), 0xE5, 0}, // 03AE - {IV('ί'), 0xE7, 0}, // 03AF - {IV('ΰ'), 0xF1, 0}, // 03B0 - - {IV('α'), 0xDF, 0}, // alpha - {IV('β'), 0xE0, 0}, // beta - {IV('γ'), 0xE1, 0}, // gamma - {IV('δ'), 0xE2, 0}, // delta - {IV('ε'), 0xE3, 0}, // epsilon - {IV('ζ'), 0xE4, 0}, // zeta - {IV('η'), 0xE5, 0}, // eta - {IV('θ'), 0xE6, 0}, // theta - {IV('ι'), 0xE7, 0}, // lota - {IV('κ'), 0xE8, 0}, // kappa - {IV('λ'), 0xE9, 0}, // lambda - {IV('μ'), 0xEA, 0}, // mu - {IV('ν'), 0xEB, 0}, // nu - {IV('ξ'), 0xEC, 0}, // xi - {IV('π'), 0xED, 0}, // pi - {IV('ρ'), 0xEE, 0}, // rho - {IV('σ'), 0xEF, 0}, // sigma - - {IV('τ'), 0xF0, 0}, // tau - {IV('υ'), 0xF1, 0}, // upsilon - {IV('χ'), 0xF2, 0}, // chi - {IV('ψ'), 0xF3, 0}, // psi - {IV('ω'), 0xF4, 0}, // 03C9, omega - {IV('ϊ'), 0xE7, 0}, // 03CA - {IV('ϋ'), 0xF1, 0}, // 03CB - {IV('ύ'), 0xF1, 0}, // 03CD - {IV('ώ'), 0xF4, 0}, // 03CE - - {IV('•'), 0xCD, 0}, // · - {IV('℞'), 0xA7, 0}, // ℞ Pt ASCII 158 - {IV('™'), 0xD0, 0}, - {IV('↤'), 0xF9, 0}, // ⟻ - {IV('↵'), 0xC4, 0}, - {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) - {IV('⇥'), 0xFB, 0}, - {IV('√'), 0xBE, 0}, // √ - {IV('∞'), 0xC2, 0}, // infinity - {IV('∫'), 0x1B, 0}, - {IV('∼'), 0x1D, 0}, - {IV('≈'), 0x1A, 0}, - {IV('≠'), 0xBD, 0}, - {IV('≡'), 0x11, 0}, - {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾ - {IV('≥'), 0xBA, 0}, - //{IV(''), 0xBF, 0}, // error - - {IV('⌠'), 0xC0, 0}, - {IV('⌡'), 0xC1, 0}, - - {IV('⎧'), 0x14, 0}, - {IV('⎩'), 0x15, 0}, - {IV('⎫'), 0x16, 0}, - {IV('⎭'), 0x17, 0}, - {IV('⎰'), 0x18, 0}, - {IV('⎱'), 0x19, 0}, - - {IV('⎲'), 0x12, 0}, - {IV('⎳'), 0x13, 0}, - - {IV('⏱'), 0x07, 0}, // Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) - {IV('┌'), 0xC9, 0}, - {IV('┐'), 0xCA, 0}, - {IV('└'), 0xCB, 0}, - {IV('┘'), 0xCC, 0}, - {IV('◸'), 0xC3, 0}, // ◿ - {IV('⭠'), 0xC8, 0}, - {IV('⭡'), 0xC5, 0}, - {IV('⭢'), 0xC7, 0}, - {IV('⭣'), 0xC6, 0}, - - - {IV('⯆'), 0xF5, 0}, - {IV('⯇'), 0xF7, 0}, // ⯅ - {IV('⯈'), 0xF6, 0}, - //{IV(''), 0xF8, 0}, // error - //{IV(''), 0xFA, 0}, // error - //{IV(''), 0xFC, 0}, // error - //{IV(''), 0xFD, 0}, // error - //{IV(''), 0xFE, 0}, // error - //{IV(''), 0xFF, 0}, // error - - #elif DISPLAY_CHARSET_HD44780 == CYRILLIC - - {IV('¢'), 0x5C, 0}, // 00A2 - {IV('£'), 0xCF, 0}, // 00A3 - {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) - - //{IV(''), 0x80, 0}, - //{IV(''), 0x81, 0}, - //{IV(''), 0x82, 0}, - //{IV(''), 0x83, 0}, - //{IV(''), 0x84, 0}, - //{IV(''), 0x85, 0}, - //{IV(''), 0x86, 0}, - //{IV(''), 0x87, 0}, - //{IV(''), 0x88, 0}, - //{IV(''), 0x89, 0}, - //{IV(''), 0x8A, 0}, - //{IV(''), 0x8B, 0}, - //{IV(''), 0x8C, 0}, - //{IV(''), 0x8D, 0}, - //{IV(''), 0x8E, 0}, - //{IV(''), 0x8F, 0}, - - //{IV(''), 0x90, 0}, - //{IV(''), 0x91, 0}, - //{IV(''), 0x92, 0}, - //{IV(''), 0x93, 0}, - //{IV(''), 0x94, 0}, - //{IV(''), 0x95, 0}, - //{IV(''), 0x96, 0}, - //{IV(''), 0x97, 0}, - //{IV(''), 0x98, 0}, - //{IV(''), 0x99, 0}, - //{IV(''), 0x9A, 0}, - //{IV(''), 0x9B, 0}, - //{IV(''), 0x9C, 0}, - //{IV(''), 0x9D, 0}, - //{IV(''), 0x9E, 0}, - //{IV(''), 0x9F, 0}, - - - {IV('¼'), 0xF0, 0}, // 00BC - {IV('⅓'), 0xF1, 0}, - {IV('½'), 0xF2, 0}, // 00BD - {IV('¾'), 0xF3, 0}, // 00BE - {IV('¿'), 0xCD, 0}, // 00BF - - #if ENABLED(DISPLAY_CHARSET_ISO10646_5) - - // Map Cyrillic to HD44780 extended CYRILLIC where possible - {IV('Ё'), 0xA2, 0}, // 0401 - {IV('А'), 'A', 0}, // 0410 - {IV('Б'), 0xA0, 0}, - {IV('В'), 'B', 0}, - {IV('Г'), 0xA1, 0}, - {IV('Д'), 0xE0, 0}, - {IV('Е'), 'E', 0}, - {IV('Ж'), 0xA3, 0}, - {IV('З'), 0xA4, 0}, - {IV('И'), 0xA5, 0}, - {IV('Й'), 0xA6, 0}, - {IV('К'), 'K', 0}, - {IV('Л'), 0xA7, 0}, - {IV('М'), 'M', 0}, - {IV('Н'), 'H', 0}, - {IV('О'), 'O', 0}, - {IV('П'), 0xA8, 0}, - {IV('Р'), 'P', 0}, - {IV('С'), 'C', 0}, - {IV('Т'), 'T', 0}, - {IV('У'), 0xA9, 0}, - {IV('Ф'), 0xAA, 0}, - {IV('Х'), 'X', 0}, - {IV('Ц'), 0xE1, 0}, - {IV('Ч'), 0xAB, 0}, - {IV('Ш'), 0xAC, 0}, - {IV('Щ'), 0xE2, 0}, - {IV('Ъ'), 0xAD, 0}, - {IV('Ы'), 0xAE, 0}, - {IV('Ь'), 'b', 0}, - {IV('Э'), 0xAF, 0}, - {IV('Ю'), 0xB0, 0}, - {IV('Я'), 0xB1, 0}, - {IV('а'), 'a', 0}, - - {IV('б'), 0xB2, 0}, - {IV('в'), 0xB3, 0}, - {IV('г'), 0xB4, 0}, - {IV('д'), 0xE3, 0}, - {IV('е'), 'e', 0}, - {IV('ж'), 0xB6, 0}, - {IV('з'), 0xB7, 0}, - {IV('и'), 0xB8, 0}, - {IV('й'), 0xB9, 0}, - {IV('к'), 0xBA, 0}, //клмноп - {IV('л'), 0xBB, 0}, - {IV('м'), 0xBC, 0}, - {IV('н'), 0xBD, 0}, - {IV('о'), 'o', 0}, - {IV('п'), 0xBE, 0}, - {IV('р'), 'p', 0}, - {IV('с'), 'c', 0}, - {IV('т'), 0xBF, 0}, - - {IV('у'), 'y', 0}, - {IV('ф'), 0xE4, 0}, - {IV('х'), 'x', 0}, - {IV('ц'), 0xE5, 0}, - {IV('ч'), 0xC0, 0}, - {IV('ш'), 0xC1, 0}, - {IV('щ'), 0xE6, 0}, - {IV('ъ'), 0xC2, 0}, - {IV('ы'), 0xC3, 0}, - {IV('ь'), 0xC4, 0}, - {IV('э'), 0xC5, 0}, - {IV('ю'), 0xC6, 0}, - {IV('я'), 0xC7, 0}, // 044F - {IV('ё'), 0xB5, 0}, // 0451 - //{IV(''), 0xC8, 0}, - //{IV(''), 0xC9, 0}, - //{IV(''), 0xCA, 0}, - //{IV(''), 0xCB, 0}, - //{IV(''), 0xCC, 0}, - //{IV(''), 0xCD, 0}, - //{IV(''), 0xCE, 0}, - - //{IV(''), 0xD0, 0}, - //{IV(''), 0xD1, 0}, - //{IV(''), 0xD2, 0}, - //{IV(''), 0xD3, 0}, - //{IV(''), 0xD4, 0}, - //{IV(''), 0xD5, 0}, - //{IV(''), 0xD6, 0}, - //{IV(''), 0xD7, 0}, - //{IV(''), 0xD8, 0}, - //{IV(''), 0xDB, 0}, - //{IV(''), 0xDC, 0}, - //{IV(''), 0xDD, 0}, - //{IV(''), 0xDE, 0}, - //{IV(''), 0xDF, 0}, - - //{IV(''), 0xE7, 0}, - //{IV(''), 0xE8, 0}, - //{IV(''), 0xE9, 0}, - //{IV(''), 0xEA, 0}, - //{IV(''), 0xEB, 0}, - //{IV(''), 0xEC, 0}, - //{IV(''), 0xED, 0}, - //{IV(''), 0xEE, 0}, - //{IV(''), 0xEF, 0}, - - //{IV(''), 0xF4, 0}, - //{IV(''), 0xF5, 0}, - //{IV(''), 0xF6, 0}, - //{IV(''), 0xF7, 0}, - //{IV(''), 0xF8, 0}, - //{IV(''), 0xF9, 0}, - //{IV(''), 0xFA, 0}, - //{IV(''), 0xFB, 0}, - //{IV(''), 0xFC, 0}, - //{IV(''), 0xFD, 0}, - //{IV(''), 0xFE, 0}, - //{IV(''), 0xFF, 0}, - - #endif - - {IV('↑'), 0xD9, 0}, // 2191 ←↑→↓ - {IV('↓'), 0xDA, 0}, // 2193 - #endif -}; - -// the plain ASCII replacement for various char -static const hd44780_charmap_t g_hd44780_charmap_common[] PROGMEM = { - {IV('¡'), 'i', 0}, // A1 - {IV('¢'), 'c', 0}, // A2 - {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09) - - // Map WESTERN code to plain ASCII - {IV('Á'), 'A', 0}, // C1 - {IV('Â'), 'A', 0}, // C2 - {IV('Ã'), 'A', 0}, // C3 - {IV('Ä'), 'A', 0}, // C4 - {IV('Å'), 'A', 0}, // C5 - {IV('Æ'), 'A', 'E'}, // C6 - {IV('Ç'), 'C', 0}, // C7 - {IV('È'), 'E', 0}, // C8 - {IV('É'), 'E', 0}, // C9 - {IV('Í'), 'I', 0}, // CD - {IV('Ñ'), 'N', 0}, // D1 - {IV('Õ'), 'O', 0}, // D5 - {IV('Ö'), 'O', 0}, // D6 - {IV('×'), 'x', 0}, // D7 - {IV('Ü'), 'U', 0}, // DC - {IV('Ý'), 'Y', 0}, // DD - {IV('à'), 'a', 0}, // E0 - {IV('á'), 'a', 0}, - {IV('â'), 'a', 0}, - {IV('ã'), 'a', 0}, - {IV('ä'), 'a', 0}, - {IV('å'), 'a', 0}, - {IV('æ'), 'a', 'e'}, - {IV('ç'), 'c', 0}, - {IV('è'), 'e', 0}, // 00E8 - {IV('é'), 'e', 0}, - {IV('ê'), 'e', 0}, - {IV('ë'), 'e', 0}, - {IV('ì'), 'i', 0}, // 00EC - {IV('í'), 'i', 0}, - {IV('î'), 'i', 0}, - {IV('ï'), 'i', 0}, // 00EF - - {IV('ñ'), 'n', 0}, // 00F1 - {IV('ò'), 'o', 0}, - {IV('ó'), 'o', 0}, - {IV('ô'), 'o', 0}, - {IV('õ'), 'o', 0}, - {IV('ö'), 'o', 0}, - //{IV('÷'), 0xB8, 0}, - {IV('ø'), 'o', 0}, - {IV('ù'), 'u', 0}, - {IV('ú'), 'u', 0}, - {IV('û'), 'u', 0}, - {IV('ü'), 'u', 0}, // FC - {IV('ý'), 'y', 0}, // FD - {IV('ÿ'), 'y', 0}, // FF - - {IV('Ą'), 'A', 0}, // 0104 - {IV('ą'), 'a', 0}, // 0105 - {IV('Ć'), 'C', 0}, // 0106 - {IV('ć'), 'c', 0}, // 0107 - {IV('Č'), 'C', 0}, // 010C - {IV('č'), 'c', 0}, // 010D - {IV('Ď'), 'D', 0}, // 010E - {IV('ď'), 'd', 0}, // 010F - {IV('đ'), 'd', 0}, // 0111 - {IV('ę'), 'e', 0}, // 0119 - {IV('Ě'), 'E', 0}, // 011A - {IV('ě'), 'e', 0}, // 011B - {IV('ğ'), 'g', 0}, // 011F - {IV('İ'), 'I', 0}, // 0130 - {IV('ı'), 'i', 0}, // 0131 - - {IV('Ł'), 'L', 0}, // 0141 - {IV('ł'), 'l', 0}, // 0142 - {IV('Ń'), 'N', 0}, // 0143 - {IV('ń'), 'n', 0}, // 0144 - {IV('ň'), 'n', 0}, // 0148 - - {IV('Ř'), 'R', 0}, // 0158 - {IV('ř'), 'r', 0}, // 0159 - {IV('Ś'), 'S', 0}, // 015A - {IV('ś'), 's', 0}, // 015B - {IV('ş'), 's', 0}, // 015F - {IV('Š'), 'S', 0}, // 0160 - {IV('š'), 's', 0}, // 0161 - {IV('ť'), 't', 0}, // 0165 - {IV('ů'), 'u', 0}, // 016F - {IV('ż'), 'z', 0}, // 017C - {IV('Ž'), 'Z', 0}, // 017D - {IV('ž'), 'z', 0}, // 017E - {IV('ƒ'), 'f', 0}, // 0192 - - {IV('ˣ'), 'x', 0}, // 02E3 - - #if ENABLED(DISPLAY_CHARSET_ISO10646_VI) - - // Map Vietnamese phonetics - - //{IV('à'), 'a', 0}, {IV('À'), 'A', 0}, - {IV('ạ'), 'a', 0}, {IV('Ạ'), 'A', 0}, - {IV('ả'), 'a', 0}, {IV('Ả'), 'A', 0}, - //{IV('ã'), 'a', 0}, {IV('Ã'), 'A', 0}, - //{IV('á'), 'á', 0}, {IV('Á'), 'A', 0}, - {IV('Ạ'), 'A', 0}, - {IV('ă'), 'a', 0}, {IV('Ă'), 'A', 0}, - {IV('ằ'), 'a', 0}, {IV('Ằ'), 'A', 0}, - {IV('ẳ'), 'a', 0}, {IV('Ẳ'), 'A', 0}, - {IV('ẵ'), 'a', 0}, {IV('Ẵ'), 'A', 0}, - {IV('ắ'), 'a', 0}, {IV('Ắ'), 'A', 0}, - {IV('ặ'), 'a', 0}, {IV('Ặ'), 'A', 0}, - {IV('â'), 'a', 0}, {IV('Â'), 'A', 0}, - {IV('ầ'), 'a', 0}, {IV('Ầ'), 'A', 0}, - {IV('ẩ'), 'a', 0}, {IV('Ẩ'), 'A', 0}, - {IV('ẫ'), 'a', 0}, {IV('Ẫ'), 'A', 0}, - {IV('ấ'), 'a', 0}, {IV('Ấ'), 'A', 0}, - {IV('ậ'), 'a', 0}, {IV('Ậ'), 'A', 0}, - //{IV('đ'), 'd', 0}, - {IV('Đ'), 'D', 0}, - {IV('e'), 'e', 0}, {IV('E'), 'E', 0}, - {IV('è'), 'e', 0}, {IV('È'), 'E', 0}, - {IV('ẻ'), 'e', 0}, {IV('Ẻ'), 'E', 0}, - {IV('ẽ'), 'e', 0}, {IV('Ẽ'), 'E', 0}, - {IV('é'), 'e', 0}, {IV('É'), 'E', 0}, - {IV('ẹ'), 'e', 0}, {IV('Ẹ'), 'E', 0}, - {IV('ê'), 'e', 0}, {IV('Ê'), 'E', 0}, - {IV('ề'), 'e', 0}, {IV('Ề'), 'E', 0}, - {IV('ể'), 'e', 0}, {IV('Ể'), 'E', 0}, - {IV('ễ'), 'e', 0}, {IV('Ễ'), 'E', 0}, - {IV('ế'), 'e', 0}, {IV('Ế'), 'E', 0}, - {IV('ệ'), 'e', 0}, {IV('Ệ'), 'E', 0}, - {IV('i'), 'i', 0}, {IV('I'), 'I', 0}, - //{IV('ì'), 'ì', 0}, {IV('Ì'), 'Ì', 0}, - {IV('ỉ'), 'ỉ', 0}, {IV('Ỉ'), 'Ỉ', 0}, - {IV('ĩ'), 'ĩ', 0}, {IV('Ĩ'), 'Ĩ', 0}, - {IV('í'), 'í', 0}, {IV('Í'), 'Í', 0}, - {IV('ị'), 'ị', 0}, {IV('Ị'), 'Ị', 0}, - {IV('o'), 'o', 0}, {IV('O'), 'O', 0}, - {IV('ò'), 'o', 0}, {IV('Ò'), 'O', 0}, - {IV('ỏ'), 'o', 0}, {IV('Ỏ'), 'O', 0}, - {IV('õ'), 'o', 0}, {IV('Õ'), 'O', 0}, - {IV('ó'), 'o', 0}, {IV('Ó'), 'O', 0}, - {IV('ọ'), 'o', 0}, {IV('Ọ'), 'O', 0}, - {IV('ô'), 'o', 0}, {IV('Ô'), 'O', 0}, - {IV('ồ'), 'o', 0}, {IV('Ồ'), 'O', 0}, - {IV('ổ'), 'o', 0}, {IV('Ổ'), 'O', 0}, - {IV('ỗ'), 'o', 0}, {IV('Ỗ'), 'O', 0}, - {IV('ố'), 'o', 0}, {IV('Ố'), 'O', 0}, - {IV('ộ'), 'o', 0}, {IV('Ộ'), 'O', 0}, - {IV('ơ'), 'o', 0}, {IV('Ơ'), 'O', 0}, - {IV('ờ'), 'o', 0}, {IV('Ờ'), 'O', 0}, - {IV('ở'), 'o', 0}, {IV('Ở'), 'O', 0}, - {IV('ỡ'), 'o', 0}, {IV('Ỡ'), 'O', 0}, - {IV('ớ'), 'o', 0}, {IV('Ớ'), 'O', 0}, - {IV('ợ'), 'o', 0}, {IV('Ợ'), 'O', 0}, - {IV('ù'), 'u', 0}, {IV('Ù'), 'U', 0}, - {IV('ủ'), 'u', 0}, {IV('Ủ'), 'U', 0}, - {IV('ũ'), 'u', 0}, {IV('Ũ'), 'U', 0}, - //{IV('ú'), 'u', 0}, {IV('Ú'), 'U', 0}, - {IV('ụ'), 'u', 0}, {IV('Ụ'), 'U', 0}, - {IV('ư'), 'u', 0}, {IV('Ư'), 'U', 0}, - {IV('ừ'), 'u', 0}, {IV('Ừ'), 'U', 0}, - {IV('ử'), 'u', 0}, {IV('Ử'), 'U', 0}, - {IV('ữ'), 'u', 0}, {IV('Ữ'), 'U', 0}, - {IV('ứ'), 'u', 0}, {IV('Ứ'), 'U', 0}, - {IV('ự'), 'u', 0}, {IV('Ự'), 'U', 0}, - {IV('y'), 'y', 0}, {IV('Y'), 'Y', 0}, - - #endif - - #if ENABLED(DISPLAY_CHARSET_ISO10646_GREEK) - - {IV('΄'), '\'', 0}, // 0384 - {IV('΅'), '\'', 0}, // 0385 - {IV('Ά'), 'A', 0}, // 0386 - {IV('·'), '.', 0}, // 0387 - {IV('Έ'), 'E', 0}, // 0388 - {IV('Ή'), 'H', 0}, // 0389 - {IV('Ί'), 'I', 0}, // 038A - {IV('Ό'), 'O', 0}, // 038C - {IV('Ύ'), 'Y', 0}, // 038E - {IV('Ώ'), 'O', 0}, // 038F - {IV('ΐ'), 'i', 0}, // 0390 - {IV('Α'), 'A', 0}, // 0391 - {IV('Β'), 'B', 0}, // 0392 - {IV('Γ'), 'T', 0}, // 0393, Gamma - {IV('Δ'), '4', 0}, // 0394, Delta, ◿ - {IV('Ε'), 'E', 0}, // 0395 - {IV('Ζ'), 'Z', 0}, // 0396 - {IV('Η'), 'H', 0}, // 0397 - {IV('Θ'), '0', 0}, // 0398, Theta - {IV('Ι'), 'I', 0}, // 0399 - {IV('Κ'), 'K', 0}, // 039A - {IV('Λ'), '^', 0}, // 039B, Lambda - {IV('Μ'), 'M', 0}, // 039C - {IV('Ν'), 'N', 0}, // 039D - {IV('Ξ'), '3', 0}, // 039E, Xi - {IV('Ο'), 'O', 0}, // 039F - {IV('Π'), 'n', 0}, // 03A0, Pi - {IV('Ρ'), 'P', 0}, // 03A1 - {IV('Σ'), 'E', 0}, // 03A3, Sigma - {IV('Τ'), 'T', 0}, // 03A4 - {IV('Υ'), 'Y', 0}, // 03A5, Upsilon - {IV('Φ'), 'p', 0}, // 03A6, Phi - {IV('Χ'), 'X', 0}, // 03A7 - {IV('Ψ'), 'P', 0}, // 03A8, Psi - {IV('Ω'), 'O', 0}, // 03A9, Omega - {IV('Ϊ'), 'I', 0}, // 03AA - {IV('Ϋ'), 'Y', 0}, // 03AB - {IV('ά'), 'a', 0}, // 03AC - {IV('έ'), 'e', 0}, // 03AD - {IV('ή'), 'n', 0}, // 03AE - {IV('ί'), 'i', 0}, // 03AF - {IV('ΰ'), 'v', 0}, // 03B0 - {IV('α'), 'a', 0}, // 03B1, alpha - {IV('β'), 'B', 0}, // 03B2, beta - {IV('γ'), 'v', 0}, // 03B3, gamma - {IV('δ'), 'd', 0}, // 03B4, delta - {IV('ε'), 'e', 0}, // 03B5, epsilon - {IV('ζ'), 'Z', 0}, // 03B6, zeta - {IV('η'), 'n', 0}, // 03B7, eta - {IV('θ'), '0', 0}, // 03B8, theta - {IV('ι'), 'i', 0}, // 03B9, lota - {IV('κ'), 'k', 0}, // 03BA, kappa - {IV('λ'), 'L', 0}, // 03BB, lambda - {IV('μ'), 'u', 0}, // 03BC, mu - {IV('ν'), 'v', 0}, // 03BD, nu - {IV('ξ'), 'e', 0}, // 03BE, xi - {IV('ο'), 'o', 0}, // 03BF - {IV('π'), 'n', 0}, // 03C0, pi - {IV('ρ'), 'p', 0}, // 03C1, rho - {IV('ς'), 'c', 0}, // 03C2 - {IV('σ'), 'o', 0}, // 03C3, sigma - {IV('τ'), 't', 0}, // 03C4, tau - {IV('υ'), 'v', 0}, // 03C5, upsilon - {IV('φ'), 'p', 0}, // 03C6 - {IV('χ'), 'X', 0}, // 03C7, chi - {IV('ψ'), 'W', 0}, // 03C8, psi - {IV('ω'), 'w', 0}, // 03C9, omega - {IV('ϊ'), 'i', 0}, // 03CA - {IV('ϋ'), 'v', 0}, // 03CB - {IV('ό'), 'o', 0}, // 03CC - {IV('ύ'), 'v', 0}, // 03CD - {IV('ώ'), 'w', 0}, // 03CE - - #endif - - #if ENABLED(DISPLAY_CHARSET_ISO10646_5) - // Map CYRILLIC code to plain ASCII - {IV('Ё'), 'E', 0}, // 0401 - {IV('А'), 'A', 0}, // 0410 - {IV('Б'), 'b', 0}, // 0411 - {IV('В'), 'B', 0}, // 0412 - {IV('Г'), 'T', 0}, // 0413 - {IV('Д'), 'Q', 0}, // 0414 - {IV('Е'), 'E', 0}, // 0415 - {IV('Ж'), '*', 0}, // 0416 - {IV('З'), 'E', 0}, // 0417 - {IV('И'), 'N', 0}, // 0418 - {IV('Й'), 'N', 0}, // 0419 - {IV('К'), 'K', 0}, // 041A - {IV('Л'), 'T', 0}, // 041B - {IV('М'), 'M', 0}, // 041C - {IV('Н'), 'H', 0}, // 041D - {IV('О'), 'O', 0}, // 041E - {IV('П'), 'n', 0}, // 041F - {IV('Р'), 'P', 0}, // 0420 - {IV('С'), 'C', 0}, // 0421 - {IV('Т'), 'T', 0}, // 0422 - {IV('У'), 'Y', 0}, - {IV('Ф'), 'o', 0}, - {IV('Х'), 'X', 0}, - {IV('Ц'), 'U', 0}, - {IV('Ч'), 'y', 0}, - {IV('Ш'), 'W', 0}, - {IV('Щ'), 'W', 0}, - {IV('Ъ'), 'b', 0}, - {IV('Ы'), 'b', '|'}, - {IV('Ь'), 'b'}, - {IV('Э'), 'e'}, - {IV('Ю'), '|', 'O'}, - {IV('Я'), '9', '|'}, // 042F - - {IV('а'), 'a', 0}, // 0430 - {IV('б'), '6', 0}, // 0431 - {IV('в'), 'B', 0}, // 0432, - {IV('г'), 'r', 0}, // 0433 - {IV('д'), 'a', 0}, // 0434, - {IV('е'), 'e', 0}, // 0435 - {IV('ж'), '*', 0}, // 0436 - {IV('з'), 'e', 0}, // 0437, - {IV('и'), 'u', 0}, // 0438 - {IV('й'), 'u', 0}, // 0439, - {IV('к'), 'k', 0}, // 043A - {IV('л'), 'n', 0}, - {IV('м'), 'm', 0}, - {IV('н'), 'H', 0}, - {IV('о'), 'o', 0}, - {IV('п'), 'n', 0}, - {IV('р'), 'p', 0}, - {IV('с'), 'c', 0}, - {IV('т'), 't', 0}, - {IV('у'), 'y', 0}, - {IV('ф'), 'q', 'p'}, - {IV('х'), 'x', 0}, - {IV('ц'), 'u', 0}, - {IV('ч'), 'y', 0}, - {IV('ш'), 'w', 0}, - {IV('щ'), 'w', 0}, - {IV('ъ'), 'b', 0}, - {IV('ы'), 'b', '|'}, - {IV('ь'), 'b', 0}, - {IV('э'), 'e', 0}, - {IV('ю'), '|', 'o'}, - {IV('я'), 'g', 0}, // 044F - {IV('ё'), 'e', 0}, // 0451 - - #endif - - {IV('•'), '.', 0}, // 2022 · - {IV('℞'), 'P', 'x'}, // 211E ℞ Pt ASCII 158 - {IV('™'), 'T', 'M'}, // 2122 - {IV('←'), '<', '-'}, // 2190 - {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→⏵➟➠➡' LCD_STR_ARROW_RIGHT (0x03) - //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) - {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) - {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) - {IV('∼'), '~', 0}, // 223C - {IV('≈'), '~', '='}, // 2248 - {IV('≠'), '!', '='}, // 2260 - {IV('≡'), '=', 0}, // 2261 - {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾ - {IV('≥'), '>', '='}, // 2265 - {IV('⏱'), 0x07, 0}, // 23F1, Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) - - {IV('゠'), '=', 0}, // 30A0 - - // ⏰⏱⏲⏳◴◵◶◷ - // ⏻⏼♁♂ - //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07) - {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08) - {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: '📁📂' LCD_STR_FOLDER (0x02) - //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06) -}; - -/* return v1 - v2 */ -static int hd44780_charmap_compare(hd44780_charmap_t * v1, hd44780_charmap_t * v2) { - return (v1->uchar < v2->uchar) ? -1 : (v1->uchar > v2->uchar) ? 1 : 0; -} - -static int pf_bsearch_cb_comp_hd4map_pgm(void *userdata, size_t idx, void * data_pin) { - hd44780_charmap_t localval; - hd44780_charmap_t *p_hd44780_charmap = (hd44780_charmap_t *)userdata; - memcpy_P(&localval, p_hd44780_charmap + idx, sizeof(localval)); - return hd44780_charmap_compare(&localval, (hd44780_charmap_t *)data_pin); -} - -void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { lcd.setCursor(col, row); } - -void lcd_put_int(const int i) { lcd.print(i); } - -// return < 0 on error -// return the advanced cols -int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { - - // find the HD44780 internal ROM first - int ret; - size_t idx = 0; - hd44780_charmap_t pinval; - hd44780_charmap_t *copy_address = nullptr; - pinval.uchar = c; - pinval.idx = -1; - - if (max_length < 1) return 0; - - // TODO: fix the '\\' that doesn't exist in the HD44870 - if (c < 128) { - lcd.write((uint8_t)c); - return 1; - } - copy_address = nullptr; - ret = pf_bsearch_r((void *)g_hd44780_charmap_device, COUNT(g_hd44780_charmap_device), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); - if (ret >= 0) { - copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_device + idx); - } - else { - ret = pf_bsearch_r((void *)g_hd44780_charmap_common, COUNT(g_hd44780_charmap_common), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); - if (ret >= 0) copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_common + idx); - } - - if (ret >= 0) { - hd44780_charmap_t localval; - // found - memcpy_P(&localval, copy_address, sizeof(localval)); - lcd.write(localval.idx); - if (max_length >= 2 && localval.idx2 > 0) { - lcd.write(localval.idx2); - return 2; - } - return 1; - } - - // Not found, print '?' instead - lcd.write((uint8_t)'?'); - return 1; -} - -/** - * @brief Draw a UTF-8 string - * - * @param utf8_str : the UTF-8 string - * @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM) - * @param max_length : the pixel length of the string allowed (or number of slots in HD44780) - * - * @return the number of pixels advanced - * - * Draw a UTF-8 string - */ -static int lcd_put_u8str_max_cb(const char * utf8_str, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) { - pixel_len_t ret = 0; - uint8_t *p = (uint8_t *)utf8_str; - while (ret < max_length) { - wchar_t ch = 0; - p = get_utf8_value_cb(p, cb_read_byte, &ch); - if (!ch) break; - ret += lcd_put_wchar_max(ch, max_length - ret); - } - return (int)ret; -} - -int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { - return lcd_put_u8str_max_cb(utf8_str, read_byte_ram, max_length); -} - -int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { - return lcd_put_u8str_max_cb(utf8_str_P, read_byte_rom, max_length); -} - -#if ENABLED(DEBUG_LCDPRINT) - - int test_hd44780_charmap(hd44780_charmap_t *data, size_t size, char *name, char flg_show_contents) { - int ret; - size_t idx = 0; - hd44780_charmap_t preval = {0, 0, 0}; - hd44780_charmap_t pinval = {0, 0, 0}; - char flg_error = 0; - - int i; - - TRACE("Test %s\n", name); - - for (i = 0; i < size; i ++) { - memcpy_P(&pinval, &(data[i]), sizeof(pinval)); - - if (flg_show_contents) { - #if 1 - TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR")); - #else - TRACE("[% 4d]", i); - TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar); - TRACE("0x%02X,", (unsigned int)(pinval.idx)); - TRACE("0x%02X,", (unsigned int)(pinval.idx2)); - TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR")); - #endif - } - if (preval.uchar >= pinval.uchar) { - flg_error = 1; - //TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); - //return -1; - } - memcpy(&preval, &pinval, sizeof(pinval)); - - ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); - if (ret < 0) { - flg_error = 1; - TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); - //return -1; - } - if (idx != i) { - flg_error = 1; - TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); - //return -1; - } - } - if (flg_error) { - TRACE("\nError: in array %s\n\n", name); - return -1; - } - TRACE("\nPASS array %s\n\n", name); - return 0; - } - - int test_hd44780_charmap_all() { - int flg_error = 0; - if (test_hd44780_charmap(g_hd44780_charmap_device, COUNT(g_hd44780_charmap_device), "g_hd44780_charmap_device", 0) < 0) { - flg_error = 1; - test_hd44780_charmap(g_hd44780_charmap_device, COUNT(g_hd44780_charmap_device), "g_hd44780_charmap_device", 1); - } - if (test_hd44780_charmap(g_hd44780_charmap_common, COUNT(g_hd44780_charmap_common), "g_hd44780_charmap_common", 0) < 0) { - flg_error = 1; - test_hd44780_charmap(g_hd44780_charmap_common, COUNT(g_hd44780_charmap_common), "g_hd44780_charmap_common", 1); - } - if (flg_error) { - TRACE("\nFAILED in hd44780 tests!\n"); - return -1; - } - TRACE("\nPASS in hd44780 tests.\n"); - return 0; - } - -#endif // DEBUG_LCDPRINT - -#endif // HAS_MARLINUI_HD44780 diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp deleted file mode 100644 index e6cc227465..0000000000 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp +++ /dev/null @@ -1,1520 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_HD44780 - -/** - * ultralcd_HD44780.cpp - * - * LCD display implementations for Hitachi HD44780. - * These are the most common LCD character displays. - */ - -#include "ultralcd_HD44780.h" -#include "../ultralcd.h" -#include "../../libs/numtostr.h" - -#include "../../sd/cardreader.h" -#include "../../module/temperature.h" -#include "../../module/printcounter.h" -#include "../../module/planner.h" -#include "../../module/motion.h" - -#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - #include "../../feature/filwidth.h" - #include "../../gcode/parser.h" -#endif - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../../feature/bedlevel/bedlevel.h" -#endif - -// -// Create LCD instance and chipset-specific information -// - -#if ENABLED(LCD_I2C_TYPE_PCF8575) - - LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_I2C_PIN_EN, LCD_I2C_PIN_RW, LCD_I2C_PIN_RS, LCD_I2C_PIN_D4, LCD_I2C_PIN_D5, LCD_I2C_PIN_D6, LCD_I2C_PIN_D7); - -#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) - - LCD_CLASS lcd(LCD_I2C_ADDRESS - #ifdef DETECT_DEVICE - , 1 - #endif - ); - -#elif ENABLED(LCD_I2C_TYPE_PCA8574) - - LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_WIDTH, LCD_HEIGHT); - -#elif ENABLED(SR_LCD_2W_NL) - - // 2 wire Non-latching LCD SR from: - // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection - - LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN - #if PIN_EXISTS(SR_STROBE) - , SR_STROBE_PIN - #endif - ); - -#elif ENABLED(SR_LCD_3W_NL) - - // NewLiquidCrystal was not working - // https://github.com/mikeshub/SailfishLCD - // uses the code directly from Sailfish - - LCD_CLASS lcd(SR_STROBE_PIN, SR_DATA_PIN, SR_CLK_PIN); - -#elif ENABLED(LCM1602) - - LCD_CLASS lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); - -#else - - // Standard direct-connected LCD implementations - LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5, LCD_PINS_D6, LCD_PINS_D7); - -#endif - -static void createChar_P(const char c, const byte * const ptr) { - byte temp[8]; - LOOP_L_N(i, 8) - temp[i] = pgm_read_byte(&ptr[i]); - lcd.createChar(c, temp); -} - -#if ENABLED(LCD_PROGRESS_BAR) - #define LCD_STR_PROGRESS "\x03\x04\x05" -#endif - -#if ENABLED(LCD_USE_I2C_BUZZER) - void MarlinUI::buzz(const long duration, const uint16_t freq) { - lcd.buzz(duration, freq); - } -#endif - -void MarlinUI::set_custom_characters(const HD44780CharSet screen_charset/*=CHARSET_INFO*/) { - #if NONE(LCD_PROGRESS_BAR, SHOW_BOOTSCREEN) - UNUSED(screen_charset); - #endif - - // CHARSET_BOOT - #if ENABLED(SHOW_BOOTSCREEN) - const static PROGMEM byte corner[4][8] = { { - B00000, - B00000, - B00000, - B00000, - B00001, - B00010, - B00100, - B00100 - }, { - B00000, - B00000, - B00000, - B11100, - B11100, - B01100, - B00100, - B00100 - }, { - B00100, - B00010, - B00001, - B00000, - B00000, - B00000, - B00000, - B00000 - }, { - B00100, - B01000, - B10000, - B00000, - B00000, - B00000, - B00000, - B00000 - } }; - #endif // SHOW_BOOTSCREEN - - // CHARSET_INFO - const static PROGMEM byte bedTemp[8] = { - B00000, - B11111, - B10101, - B10001, - B10101, - B11111, - B00000, - B00000 - }; - - const static PROGMEM byte degree[8] = { - B01100, - B10010, - B10010, - B01100, - B00000, - B00000, - B00000, - B00000 - }; - - const static PROGMEM byte thermometer[8] = { - B00100, - B01010, - B01010, - B01010, - B01010, - B10001, - B10001, - B01110 - }; - - const static PROGMEM byte uplevel[8] = { - B00100, - B01110, - B11111, - B00100, - B11100, - B00000, - B00000, - B00000 - }; - - const static PROGMEM byte feedrate[8] = { - #if LCD_INFO_SCREEN_STYLE == 1 - B00000, - B00100, - B10010, - B01001, - B10010, - B00100, - B00000, - B00000 - #else - B11100, - B10000, - B11000, - B10111, - B00101, - B00110, - B00101, - B00000 - #endif - }; - - const static PROGMEM byte clock[8] = { - B00000, - B01110, - B10011, - B10101, - B10001, - B01110, - B00000, - B00000 - }; - - #if ENABLED(LCD_PROGRESS_BAR) - - // CHARSET_INFO - const static PROGMEM byte progress[3][8] = { { - B00000, - B10000, - B10000, - B10000, - B10000, - B10000, - B10000, - B00000 - }, { - B00000, - B10100, - B10100, - B10100, - B10100, - B10100, - B10100, - B00000 - }, { - B00000, - B10101, - B10101, - B10101, - B10101, - B10101, - B10101, - B00000 - } }; - - #endif // LCD_PROGRESS_BAR - - #if BOTH(SDSUPPORT, HAS_LCD_MENU) - - // CHARSET_MENU - const static PROGMEM byte refresh[8] = { - B00000, - B00110, - B11001, - B11000, - B00011, - B10011, - B01100, - B00000, - }; - const static PROGMEM byte folder[8] = { - B00000, - B11100, - B11111, - B10001, - B10001, - B11111, - B00000, - B00000 - }; - - #endif // SDSUPPORT - - #if ENABLED(SHOW_BOOTSCREEN) - // Set boot screen corner characters - if (screen_charset == CHARSET_BOOT) { - for (uint8_t i = 4; i--;) - createChar_P(i, corner[i]); - } - else - #endif - { // Info Screen uses 5 special characters - createChar_P(LCD_STR_BEDTEMP[0], bedTemp); - createChar_P(LCD_STR_DEGREE[0], degree); - createChar_P(LCD_STR_THERMOMETER[0], thermometer); - createChar_P(LCD_STR_FEEDRATE[0], feedrate); - createChar_P(LCD_STR_CLOCK[0], clock); - - #if ENABLED(LCD_PROGRESS_BAR) - if (screen_charset == CHARSET_INFO) { // 3 Progress bar characters for info screen - for (int16_t i = 3; i--;) - createChar_P(LCD_STR_PROGRESS[i], progress[i]); - } - else - #endif - { - createChar_P(LCD_STR_UPLEVEL[0], uplevel); - #if BOTH(SDSUPPORT, HAS_LCD_MENU) - // SD Card sub-menu special characters - createChar_P(LCD_STR_REFRESH[0], refresh); - createChar_P(LCD_STR_FOLDER[0], folder); - #endif - } - } - -} - -void MarlinUI::init_lcd() { - - #if ENABLED(LCD_I2C_TYPE_PCF8575) - lcd.begin(LCD_WIDTH, LCD_HEIGHT); - #ifdef LCD_I2C_PIN_BL - lcd.setBacklightPin(LCD_I2C_PIN_BL, POSITIVE); - lcd.setBacklight(HIGH); - #endif - - #elif ENABLED(LCD_I2C_TYPE_MCP23017) - lcd.setMCPType(LTI_TYPE_MCP23017); - lcd.begin(LCD_WIDTH, LCD_HEIGHT); - update_indicators(); - - #elif ENABLED(LCD_I2C_TYPE_MCP23008) - lcd.setMCPType(LTI_TYPE_MCP23008); - lcd.begin(LCD_WIDTH, LCD_HEIGHT); - - #elif ENABLED(LCD_I2C_TYPE_PCA8574) - lcd.init(); - lcd.backlight(); - - #else - lcd.begin(LCD_WIDTH, LCD_HEIGHT); - #endif - - set_custom_characters(on_status_screen() ? CHARSET_INFO : CHARSET_MENU); - - lcd.clear(); -} - -bool MarlinUI::detected() { - return (true - #if EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) && defined(DETECT_DEVICE) - && lcd.LcdDetected() == 1 - #endif - ); -} - -#if HAS_SLOW_BUTTONS - uint8_t MarlinUI::read_slow_buttons() { - #if ENABLED(LCD_I2C_TYPE_MCP23017) - // Reading these buttons is too slow for interrupt context - // so they are read during LCD update in the main loop. - uint8_t slow_bits = lcd.readButtons() - #if !BUTTON_EXISTS(ENC) - << B_I2C_BTN_OFFSET - #endif - ; - #if ENABLED(LCD_I2C_VIKI) - if ((slow_bits & (B_MI | B_RI)) && PENDING(millis(), next_button_update_ms)) // LCD clicked - slow_bits &= ~(B_MI | B_RI); // Disable LCD clicked buttons if screen is updated - #endif - return slow_bits; - #endif // LCD_I2C_TYPE_MCP23017 - } -#endif - -void MarlinUI::clear_lcd() { lcd.clear(); } - -#if ENABLED(SHOW_BOOTSCREEN) - - void lcd_erase_line(const lcd_uint_t line) { - lcd_moveto(0, line); - for (uint8_t i = LCD_WIDTH + 1; --i;) - lcd_put_wchar(' '); - } - - // Scroll the PSTR 'text' in a 'len' wide field for 'time' milliseconds at position col,line - void lcd_scroll(const lcd_uint_t col, const lcd_uint_t line, PGM_P const text, const uint8_t len, const int16_t time) { - uint8_t slen = utf8_strlen_P(text); - if (slen < len) { - lcd_put_u8str_max_P(col, line, text, len); - for (; slen < len; ++slen) lcd_put_wchar(' '); - safe_delay(time); - } - else { - PGM_P p = text; - int dly = time / _MAX(slen, 1); - LOOP_LE_N(i, slen) { - - // Print the text at the correct place - lcd_put_u8str_max_P(col, line, p, len); - - // Fill with spaces - for (uint8_t ix = slen - i; ix < len; ++ix) lcd_put_wchar(' '); - - // Delay - safe_delay(dly); - - // Advance to the next UTF8 valid position - p++; - while (!START_OF_UTF8_CHAR(pgm_read_byte(p))) p++; - } - } - } - - static void logo_lines(PGM_P const extra) { - int16_t indent = (LCD_WIDTH - 8 - utf8_strlen_P(extra)) / 2; - lcd_put_wchar(indent, 0, '\x00'); lcd_put_u8str_P(PSTR( "------" )); lcd_put_wchar('\x01'); - lcd_put_u8str_P(indent, 1, PSTR("|Marlin|")); lcd_put_u8str_P(extra); - lcd_put_wchar(indent, 2, '\x02'); lcd_put_u8str_P(PSTR( "------" )); lcd_put_wchar('\x03'); - } - - void MarlinUI::show_bootscreen() { - set_custom_characters(CHARSET_BOOT); - lcd.clear(); - - #define LCD_EXTRA_SPACE (LCD_WIDTH-8) - - #define CENTER_OR_SCROLL(STRING,DELAY) \ - lcd_erase_line(3); \ - if (utf8_strlen(STRING) <= LCD_WIDTH) { \ - lcd_put_u8str_P((LCD_WIDTH - utf8_strlen_P(PSTR(STRING))) / 2, 3, PSTR(STRING)); \ - safe_delay(DELAY); \ - } \ - else { \ - lcd_scroll(0, 3, PSTR(STRING), LCD_WIDTH, DELAY); \ - } - - // - // Show the Marlin logo with splash line 1 - // - if (LCD_EXTRA_SPACE >= utf8_strlen(SHORT_BUILD_VERSION) + 1) { - // - // Show the Marlin logo, splash line1, and splash line 2 - // - logo_lines(PSTR(" " SHORT_BUILD_VERSION)); - CENTER_OR_SCROLL(MARLIN_WEBSITE_URL, 2000); - } - else { - // - // Show the Marlin logo and short build version - // After a delay show the website URL - // - extern const char NUL_STR[]; - logo_lines(NUL_STR); - CENTER_OR_SCROLL(SHORT_BUILD_VERSION, 1500); - CENTER_OR_SCROLL(MARLIN_WEBSITE_URL, 1500); - #ifdef STRING_SPLASH_LINE3 - CENTER_OR_SCROLL(STRING_SPLASH_LINE3, 1500); - #endif - } - - lcd.clear(); - safe_delay(100); - set_custom_characters(CHARSET_INFO); - lcd.clear(); - } - -#endif // SHOW_BOOTSCREEN - -void MarlinUI::draw_kill_screen() { - lcd_put_u8str(0, 0, status_message); - lcd_uint_t y = 2; - #if LCD_HEIGHT >= 4 - lcd_put_u8str_P(0, y++, GET_TEXT(MSG_HALTED)); - #endif - lcd_put_u8str_P(0, y, GET_TEXT(MSG_PLEASE_RESET)); -} - -// -// Before homing, blink '123' <-> '???'. -// Homed but unknown... '123' <-> ' '. -// Homed and known, display constantly. -// -FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { - lcd_put_wchar('X' + uint8_t(axis)); - if (blink) - lcd_put_u8str(value); - else { - if (!TEST(axis_homed, axis)) - while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); - else { - #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) - if (!TEST(axis_known_position, axis)) - lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); - else - #endif - lcd_put_u8str(value); - } - } -} - -FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { - #if HAS_HEATED_BED - const bool isBed = TERN(HAS_HEATED_CHAMBER, heater_id == H_BED, heater_id < 0); - const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), - t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); - #else - const float t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); - #endif - - if (prefix >= 0) lcd_put_wchar(prefix); - - lcd_put_u8str(i16tostr3rj(t1 + 0.5)); - lcd_put_wchar('/'); - - #if !HEATER_IDLE_HANDLER - UNUSED(blink); - #else - if (!blink && thermalManager.heater_idle[thermalManager.idle_index_for_id(heater_id)].timed_out) { - lcd_put_wchar(' '); - if (t2 >= 10) lcd_put_wchar(' '); - if (t2 >= 100) lcd_put_wchar(' '); - } - else - #endif - lcd_put_u8str(i16tostr3left(t2 + 0.5)); - - if (prefix >= 0) { - lcd_put_wchar(LCD_STR_DEGREE[0]); - lcd_put_wchar(' '); - if (t2 < 10) lcd_put_wchar(' '); - } -} - -FORCE_INLINE void _draw_bed_status(const bool blink) { - _draw_heater_status(H_BED, TERN0(HAS_LEVELING, blink && planner.leveling_active) ? '_' : LCD_STR_BEDTEMP[0], blink); -} - -#if HAS_PRINT_PROGRESS - - FORCE_INLINE void _draw_print_progress() { - const uint8_t progress = ui.get_progress_percent(); - lcd_put_u8str_P(PSTR(TERN(SDSUPPORT, "SD", "P:"))); - if (progress) - lcd_put_u8str(ui8tostr3rj(progress)); - else - lcd_put_u8str_P(PSTR("---")); - lcd_put_wchar('%'); - } - -#endif - -#if ENABLED(LCD_PROGRESS_BAR) - - void MarlinUI::draw_progress_bar(const uint8_t percent) { - const int16_t tix = (int16_t)(percent * (LCD_WIDTH) * 3) / 100, - cel = tix / 3, - rem = tix % 3; - uint8_t i = LCD_WIDTH; - char msg[LCD_WIDTH + 1], b = ' '; - msg[LCD_WIDTH] = '\0'; - while (i--) { - if (i == cel - 1) - b = LCD_STR_PROGRESS[2]; - else if (i == cel && rem != 0) - b = LCD_STR_PROGRESS[rem - 1]; - msg[i] = b; - } - lcd_put_u8str(msg); - } - -#endif // LCD_PROGRESS_BAR - -void MarlinUI::draw_status_message(const bool blink) { - - lcd_moveto(0, LCD_HEIGHT - 1); - - #if ENABLED(LCD_PROGRESS_BAR) - - // Draw the progress bar if the message has shown long enough - // or if there is no message set. - if (ELAPSED(millis(), progress_bar_ms + PROGRESS_BAR_MSG_TIME) || !has_status()) { - const uint8_t progress = get_progress_percent(); - if (progress > 2) return draw_progress_bar(progress); - } - - #elif BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - - // Alternate Status message and Filament display - if (ELAPSED(millis(), next_filament_display)) { - lcd_put_u8str_P(PSTR("Dia ")); - lcd_put_u8str(ftostr12ns(filwidth.measured_mm)); - lcd_put_u8str_P(PSTR(" V")); - lcd_put_u8str(i16tostr3rj(planner.volumetric_percent(parser.volumetric_enabled))); - lcd_put_wchar('%'); - return; - } - - #endif // FILAMENT_LCD_DISPLAY && SDSUPPORT - - #if ENABLED(STATUS_MESSAGE_SCROLLING) - static bool last_blink = false; - - // Get the UTF8 character count of the string - uint8_t slen = utf8_strlen(status_message); - - // If the string fits into the LCD, just print it and do not scroll it - if (slen <= LCD_WIDTH) { - - // The string isn't scrolling and may not fill the screen - lcd_put_u8str(status_message); - - // Fill the rest with spaces - while (slen < LCD_WIDTH) { lcd_put_wchar(' '); ++slen; } - } - else { - // String is larger than the available space in screen. - - // Get a pointer to the next valid UTF8 character - // and the string remaining length - uint8_t rlen; - const char *stat = status_and_len(rlen); - lcd_put_u8str_max(stat, LCD_WIDTH); // The string leaves space - - // If the remaining string doesn't completely fill the screen - if (rlen < LCD_WIDTH) { - lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot - uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters - if (--chars) { // Draw a second dot if there's space - lcd_put_wchar('.'); - if (--chars) - lcd_put_u8str_max(status_message, chars); // Print a second copy of the message - } - } - if (last_blink != blink) { - last_blink = blink; - advance_status_scroll(); - } - } - #else - UNUSED(blink); - - // Get the UTF8 character count of the string - uint8_t slen = utf8_strlen(status_message); - - // Just print the string to the LCD - lcd_put_u8str_max(status_message, LCD_WIDTH); - - // Fill the rest with spaces if there are missing spaces - while (slen < LCD_WIDTH) { - lcd_put_wchar(' '); - ++slen; - } - #endif -} - -/** - * LCD_INFO_SCREEN_STYLE 0 : Classic Status Screen - * - * 16x2 |000/000 B000/000| - * |0123456789012345| - * - * 16x4 |000/000 B000/000| - * |SD---% Z 000.00| - * |F---% T--:--| - * |0123456789012345| - * - * 20x2 |T000/000° B000/000° | - * |01234567890123456789| - * - * 20x4 |T000/000° B000/000° | - * |X 000 Y 000 Z000.000| - * |F---% SD---% T--:--| - * |01234567890123456789| - * - * LCD_INFO_SCREEN_STYLE 1 : Průša-style Status Screen - * - * |T000/000° Z 000.00 | - * |B000/000° F---% | - * |SD---% T--:-- | - * |01234567890123456789| - * - * |T000/000° Z 000.00 | - * |T000/000° F---% | - * |B000/000° SD---% | - * |01234567890123456789| - */ - -void MarlinUI::draw_status_screen() { - - const bool blink = get_blink(); - lcd_moveto(0, 0); - - #if LCD_INFO_SCREEN_STYLE == 0 - - // ========== Line 1 ========== - - #if LCD_WIDTH < 20 - - // - // Hotend 0 Temperature - // - _draw_heater_status(H_E0, -1, blink); - - // - // Hotend 1 or Bed Temperature - // - #if HAS_MULTI_HOTEND - lcd_moveto(8, 0); - _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); - #elif HAS_HEATED_BED - lcd_moveto(8, 0); - _draw_bed_status(blink); - #endif - - #else // LCD_WIDTH >= 20 - - // - // Hotend 0 Temperature - // - _draw_heater_status(H_E0, LCD_STR_THERMOMETER[0], blink); - - // - // Hotend 1 or Bed Temperature - // - #if HAS_MULTI_HOTEND - lcd_moveto(10, 0); - _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); - #elif HAS_HEATED_BED - lcd_moveto(10, 0); - _draw_bed_status(blink); - #endif - - #endif // LCD_WIDTH >= 20 - - // ========== Line 2 ========== - - #if LCD_HEIGHT > 2 - - #if LCD_WIDTH < 20 - - #if HAS_PRINT_PROGRESS - lcd_moveto(0, 2); - _draw_print_progress(); - #endif - - #else // LCD_WIDTH >= 20 - - lcd_moveto(0, 1); - - // If the first line has two extruder temps, - // show more temperatures on the next line - - #if HOTENDS > 2 || (HAS_MULTI_HOTEND && HAS_HEATED_BED) - - #if HOTENDS > 2 - _draw_heater_status(H_E2, LCD_STR_THERMOMETER[0], blink); - lcd_moveto(10, 1); - #endif - - _draw_bed_status(blink); - - #else // HOTENDS <= 2 && (HOTENDS <= 1 || !HAS_HEATED_BED) - - #if HAS_DUAL_MIXING - - // Two-component mix / gradient instead of XY - - char mixer_messages[12]; - const char *mix_label; - #if ENABLED(GRADIENT_MIX) - if (mixer.gradient.enabled) { - mixer.update_mix_from_gradient(); - mix_label = "Gr"; - } - else - #endif - { - mixer.update_mix_from_vtool(); - mix_label = "Mx"; - } - sprintf_P(mixer_messages, PSTR("%s %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); - lcd_put_u8str(mixer_messages); - - #else // !HAS_DUAL_MIXING - - const bool show_e_total = TERN0(LCD_SHOW_E_TOTAL, printingIsActive() || marlin_state == MF_SD_COMPLETE); - - if (show_e_total) { - #if ENABLED(LCD_SHOW_E_TOTAL) - char tmp[20]; - const uint8_t escale = e_move_accumulator >= 100000.0f ? 10 : 1; // After 100m switch to cm - sprintf_P(tmp, PSTR("E %ld%cm "), uint32_t(_MAX(e_move_accumulator, 0.0f)) / escale, escale == 10 ? 'c' : 'm'); // 1234567mm - lcd_put_u8str(tmp); - #endif - } - else { - const xy_pos_t lpos = current_position.asLogical(); - _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink); - lcd_put_wchar(' '); - _draw_axis_value(Y_AXIS, ftostr4sign(lpos.y), blink); - } - - #endif // !HAS_DUAL_MIXING - - #endif // HOTENDS <= 2 && (HOTENDS <= 1 || !HAS_HEATED_BED) - - #endif // LCD_WIDTH >= 20 - - lcd_moveto(LCD_WIDTH - 8, 1); - _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); - - #if HAS_LEVELING && !HAS_HEATED_BED - lcd_put_wchar(planner.leveling_active || blink ? '_' : ' '); - #endif - - #endif // LCD_HEIGHT > 2 - - // ========== Line 3 ========== - - #if LCD_HEIGHT > 3 - - lcd_put_wchar(0, 2, LCD_STR_FEEDRATE[0]); - lcd_put_u8str(i16tostr3rj(feedrate_percentage)); - lcd_put_wchar('%'); - - char buffer[14]; - uint8_t timepos = 0; - #if ENABLED(SHOW_REMAINING_TIME) - const bool show_remain = TERN1(ROTATE_PROGRESS_DISPLAY, blink) && (printingIsActive() || marlin_state == MF_SD_COMPLETE); - if (show_remain) { - #if ENABLED(USE_M73_REMAINING_TIME) - duration_t remaining = get_remaining_time(); - #else - uint8_t progress = get_progress_percent(); - uint32_t elapsed = print_job_timer.duration(); - duration_t remaining = (progress > 0) ? ((elapsed * 25600 / progress) >> 8) - elapsed : 0; - #endif - const uint8_t len = remaining.toDigital(buffer); - timepos = LCD_WIDTH - 1 - len; - lcd_put_wchar(timepos, 2, 'R'); - } - #else - constexpr bool show_remain = false; - #endif - - if (!show_remain) { - duration_t elapsed = print_job_timer.duration(); - const uint8_t len = elapsed.toDigital(buffer); - timepos = LCD_WIDTH - 1 - len; - lcd_put_wchar(timepos, 2, LCD_STR_CLOCK[0]); - } - lcd_put_u8str(buffer); - - #if LCD_WIDTH >= 20 - lcd_moveto(timepos - 7, 2); - #if HAS_PRINT_PROGRESS - _draw_print_progress(); - #else - char c; - uint16_t per; - #if HAS_FAN0 - if (true - #if EXTRUDERS && ENABLED(ADAPTIVE_FAN_SLOWING) - && (blink || thermalManager.fan_speed_scaler[0] < 128) - #endif - ) { - uint16_t spd = thermalManager.fan_speed[0]; - if (blink) c = 'F'; - #if ENABLED(ADAPTIVE_FAN_SLOWING) - else { c = '*'; spd = thermalManager.scaledFanSpeed(0, spd); } - #endif - per = thermalManager.fanPercent(spd); - } - else - #endif - { - #if EXTRUDERS - c = 'E'; - per = planner.flow_percentage[0]; - #endif - } - lcd_put_wchar(c); - lcd_put_u8str(i16tostr3rj(per)); - lcd_put_wchar('%'); - #endif - #endif - - #endif // LCD_HEIGHT > 3 - - #elif LCD_INFO_SCREEN_STYLE == 1 - - // ========== Line 1 ========== - - // - // Hotend 0 Temperature - // - _draw_heater_status(H_E0, LCD_STR_THERMOMETER[0], blink); - - // - // Z Coordinate - // - lcd_moveto(LCD_WIDTH - 9, 0); - _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); - - #if HAS_LEVELING && (HAS_MULTI_HOTEND || !HAS_HEATED_BED) - lcd_put_wchar(LCD_WIDTH - 1, 0, planner.leveling_active || blink ? '_' : ' '); - #endif - - // ========== Line 2 ========== - - // - // Hotend 1 or Bed Temperature - // - lcd_moveto(0, 1); - #if HAS_MULTI_HOTEND - _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); - #elif HAS_HEATED_BED - _draw_bed_status(blink); - #endif - - lcd_put_wchar(LCD_WIDTH - 9, 1, LCD_STR_FEEDRATE[0]); - lcd_put_u8str(i16tostr3rj(feedrate_percentage)); - lcd_put_wchar('%'); - - // ========== Line 3 ========== - - // - // SD Percent, Hotend 2, or Bed - // - lcd_moveto(0, 2); - #if HOTENDS > 2 - _draw_heater_status(H_E2, LCD_STR_THERMOMETER[0], blink); - #elif HAS_MULTI_HOTEND && HAS_HEATED_BED - _draw_bed_status(blink); - #elif HAS_PRINT_PROGRESS - #define DREW_PRINT_PROGRESS - _draw_print_progress(); - #endif - - // - // Elapsed Time or SD Percent - // - lcd_moveto(LCD_WIDTH - 9, 2); - #if HAS_PRINT_PROGRESS && !defined(DREW_PRINT_PROGRESS) - _draw_print_progress(); - #else - duration_t elapsed = print_job_timer.duration(); - char buffer[14]; - (void)elapsed.toDigital(buffer); - lcd_put_wchar(LCD_STR_CLOCK[0]); - lcd_put_u8str(buffer); - #endif - - #endif // LCD_INFO_SCREEN_STYLE 1 - - // ========= Last Line ======== - - // - // Status Message (which may be a Progress Bar or Filament display) - // - draw_status_message(blink); -} - -#if HAS_LCD_MENU - - #include "../menu/menu.h" - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - - void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { - if (row < LCD_HEIGHT) { - lcd_moveto(LCD_WIDTH - 9, row); - _draw_heater_status((heater_id_t)extruder, LCD_STR_THERMOMETER[0], get_blink()); - } - } - - #endif // ADVANCED_PAUSE_FEATURE - - // Draw a static item with no left-right margin required. Centered by default. - void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { - int8_t n = LCD_WIDTH; - lcd_moveto(0, row); - const int8_t plen = pstr ? utf8_strlen_P(pstr) : 0, - vlen = vstr ? utf8_strlen(vstr) : 0; - if (style & SS_CENTER) { - int8_t pad = (LCD_WIDTH - plen - vlen) / 2; - while (--pad >= 0) { lcd_put_wchar(' '); n--; } - } - if (plen) n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n); - if (vlen) n -= lcd_put_u8str_max(vstr, n); - for (; n > 0; --n) lcd_put_wchar(' '); - } - - // Draw a generic menu item with pre_char (if selected) and post_char - void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { - lcd_put_wchar(0, row, sel ? pre_char : ' '); - uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2); - for (; n; --n) lcd_put_wchar(' '); - lcd_put_wchar(post_char); - } - - // Draw a menu item with a (potentially) editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm) { - const uint8_t vlen = inStr ? (pgm ? utf8_strlen_P(inStr) : utf8_strlen(inStr)) : 0; - lcd_put_wchar(0, row, sel ? LCD_STR_ARROW_RIGHT[0] : ' '); - uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vlen); - if (vlen) { - lcd_put_wchar(':'); - for (; n; --n) lcd_put_wchar(' '); - if (pgm) lcd_put_u8str_P(inStr); else lcd_put_u8str(inStr); - } - } - - // Low-level draw_edit_screen can be used to draw an edit screen from anyplace - void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { - ui.encoder_direction_normal(); - uint8_t n = lcd_put_u8str_ind_P(0, 1, pstr, itemIndex, itemString, LCD_WIDTH - 1); - if (value != nullptr) { - lcd_put_wchar(':'); n--; - const uint8_t len = utf8_strlen(value) + 1; // Plus one for a leading space - const lcd_uint_t valrow = n < len ? 2 : 1; // Value on the next row if it won't fit - lcd_put_wchar(LCD_WIDTH - len, valrow, ' '); // Right-justified, padded, leading space - lcd_put_u8str(value); - } - } - - // The Select Screen presents a prompt and two "buttons" - void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { - ui.draw_select_screen_prompt(pref, string, suff); - SETCURSOR(0, LCD_HEIGHT - 1); - lcd_put_wchar(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd_put_wchar(yesno ? ' ' : ']'); - SETCURSOR_RJ(utf8_strlen_P(yes) + 2, LCD_HEIGHT - 1); - lcd_put_wchar(yesno ? '[' : ' '); lcd_put_u8str_P(yes); lcd_put_wchar(yesno ? ']' : ' '); - } - - #if ENABLED(SDSUPPORT) - - void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { - lcd_put_wchar(0, row, sel ? LCD_STR_ARROW_RIGHT[0] : ' '); - constexpr uint8_t maxlen = LCD_WIDTH - 2; - uint8_t n = maxlen - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), maxlen); - for (; n; --n) lcd_put_wchar(' '); - lcd_put_wchar(isDir ? LCD_STR_FOLDER[0] : ' '); - } - - #endif - - #if ENABLED(LCD_HAS_STATUS_INDICATORS) - - void MarlinUI::update_indicators() { - // Set the LEDS - referred to as backlights by the LiquidTWI2 library - static uint8_t ledsprev = 0; - uint8_t leds = 0; - - if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed() > 0)) leds |= LED_A; - if (TERN0(HAS_HOTEND, thermalManager.degTargetHotend(0) > 0)) leds |= LED_B; - - #if HAS_FAN - if ( TERN0(HAS_FAN0, thermalManager.fan_speed[0]) - || TERN0(HAS_FAN1, thermalManager.fan_speed[1]) - || TERN0(HAS_FAN2, thermalManager.fan_speed[2]) - || TERN0(HAS_FAN3, thermalManager.fan_speed[3]) - || TERN0(HAS_FAN4, thermalManager.fan_speed[4]) - || TERN0(HAS_FAN5, thermalManager.fan_speed[5]) - || TERN0(HAS_FAN6, thermalManager.fan_speed[6]) - || TERN0(HAS_FAN7, thermalManager.fan_speed[7]) - ) leds |= LED_C; - #endif // HAS_FAN - - if (TERN0(HAS_MULTI_HOTEND, thermalManager.degTargetHotend(1) > 0)) leds |= LED_C; - - if (leds != ledsprev) { - lcd.setBacklight(leds); - ledsprev = leds; - } - } - - #endif // LCD_HAS_STATUS_INDICATORS - - #if ENABLED(AUTO_BED_LEVELING_UBL) - - #define HD44780_CHAR_WIDTH 5 - #define HD44780_CHAR_HEIGHT 8 - #define MESH_MAP_COLS 7 - #define MESH_MAP_ROWS 4 - - #define CHAR_LINE_TOP 0 - #define CHAR_LINE_BOT 1 - #define CHAR_EDGE_L 2 - #define CHAR_EDGE_R 3 - #define CHAR_UL_UL 4 - #define CHAR_LR_UL 5 - #define CHAR_UL_LR 6 - #define CHAR_LR_LR 7 - - #define TOP_LEFT _BV(0) - #define TOP_RIGHT _BV(1) - #define LOWER_LEFT _BV(2) - #define LOWER_RIGHT _BV(3) - - /** - * Possible map screens: - * - * 16x2 |X000.00 Y000.00| - * |(00,00) Z00.000| - * - * 20x2 | X:000.00 Y:000.00 | - * | (00,00) Z:00.000 | - * - * 16x4 |+-------+(00,00)| - * || |X000.00| - * || |Y000.00| - * |+-------+Z00.000| - * - * 20x4 | +-------+ (00,00) | - * | | | X:000.00| - * | | | Y:000.00| - * | +-------+ Z:00.000| - */ - - typedef struct { - uint8_t custom_char_bits[HD44780_CHAR_HEIGHT]; - } custom_char; - - typedef struct { - lcd_uint_t column, row, - x_pixel_offset, y_pixel_offset; - uint8_t x_pixel_mask; - } coordinate; - - void add_edges_to_custom_char(custom_char &custom, const coordinate &ul, const coordinate &lr, const coordinate &brc, const uint8_t cell_location); - FORCE_INLINE static void clear_custom_char(custom_char * const cc) { ZERO(cc->custom_char_bits); } - - coordinate pixel_location(int16_t x, int16_t y) { - coordinate ret_val; - int16_t xp, yp, r, c; - - x++; y++; // +1 because lines on the left and top - - c = x / (HD44780_CHAR_WIDTH); - r = y / (HD44780_CHAR_HEIGHT); - - ret_val.column = c; - ret_val.row = r; - - xp = x - c * (HD44780_CHAR_WIDTH); // Get the pixel offsets into the character cell - xp = HD44780_CHAR_WIDTH - 1 - xp; // Column within relevant character cell (0 on the right) - yp = y - r * (HD44780_CHAR_HEIGHT); - - ret_val.x_pixel_mask = _BV(xp); - ret_val.x_pixel_offset = xp; - ret_val.y_pixel_offset = yp; - return ret_val; - } - - inline coordinate pixel_location(const lcd_uint_t x, const lcd_uint_t y) { return pixel_location((int16_t)x, (int16_t)y); } - - void prep_and_put_map_char(custom_char &chrdata, const coordinate &ul, const coordinate &lr, const coordinate &brc, const uint8_t cl, const char c, const lcd_uint_t x, const lcd_uint_t y) { - add_edges_to_custom_char(chrdata, ul, lr, brc, cl); - lcd.createChar(c, (uint8_t*)&chrdata); - lcd_put_wchar(x, y, c); - } - - void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { - - #if LCD_WIDTH >= 20 - #define _LCD_W_POS 12 - #define _PLOT_X 1 - #define _MAP_X 3 - #define _LABEL(C,X,Y) lcd_put_u8str_P(X, Y, C) - #define _XLABEL(X,Y) _LABEL(X_LBL,X,Y) - #define _YLABEL(X,Y) _LABEL(Y_LBL,X,Y) - #define _ZLABEL(X,Y) _LABEL(Z_LBL,X,Y) - #else - #define _LCD_W_POS 8 - #define _PLOT_X 0 - #define _MAP_X 1 - #define _LABEL(X,Y,C) lcd_put_wchar(X, Y, C) - #define _XLABEL(X,Y) _LABEL('X',X,Y) - #define _YLABEL(X,Y) _LABEL('Y',X,Y) - #define _ZLABEL(X,Y) _LABEL('Z',X,Y) - #endif - - #if LCD_HEIGHT <= 3 // 16x2 or 20x2 display - - /** - * Show X and Y positions - */ - _XLABEL(_PLOT_X, 0); - lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(ubl.mesh_index_to_xpos(x_plot)))); - _YLABEL(_LCD_W_POS, 0); - lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(ubl.mesh_index_to_ypos(y_plot)))); - - lcd_moveto(_PLOT_X, 0); - - #else // 16x4 or 20x4 display - - coordinate upper_left, lower_right, bottom_right_corner; - custom_char new_char; - uint8_t i, n, n_rows, n_cols; - lcd_uint_t j, k, l, m, bottom_line, right_edge, - x_map_pixels, y_map_pixels, - pixels_per_x_mesh_pnt, pixels_per_y_mesh_pnt, - suppress_x_offset = 0, suppress_y_offset = 0; - - const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y - 1) - y_plot; - - upper_left.column = 0; - upper_left.row = 0; - lower_right.column = 0; - lower_right.row = 0; - - clear_lcd(); - - x_map_pixels = (HD44780_CHAR_WIDTH) * (MESH_MAP_COLS) - 2; // Minus 2 because we are drawing a box around the map - y_map_pixels = (HD44780_CHAR_HEIGHT) * (MESH_MAP_ROWS) - 2; - - pixels_per_x_mesh_pnt = x_map_pixels / (GRID_MAX_POINTS_X); - pixels_per_y_mesh_pnt = y_map_pixels / (GRID_MAX_POINTS_Y); - - if (pixels_per_x_mesh_pnt >= HD44780_CHAR_WIDTH) { // There are only 2 custom characters available, so the X - pixels_per_x_mesh_pnt = HD44780_CHAR_WIDTH; // Size of the mesh point needs to fit within them independent - suppress_x_offset = 1; // Of where the starting pixel is located. - } - - if (pixels_per_y_mesh_pnt >= HD44780_CHAR_HEIGHT) { // There are only 2 custom characters available, so the Y - pixels_per_y_mesh_pnt = HD44780_CHAR_HEIGHT; // Size of the mesh point needs to fit within them independent - suppress_y_offset = 1; // Of where the starting pixel is located. - } - - x_map_pixels = pixels_per_x_mesh_pnt * (GRID_MAX_POINTS_X); // Now we have the right number of pixels to make both - y_map_pixels = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y); // Directions fit nicely - - right_edge = pixels_per_x_mesh_pnt * (GRID_MAX_POINTS_X) + 1; // Find location of right edge within the character cell - bottom_line = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y) + 1; // Find location of bottome line within the character cell - - n_rows = bottom_line / (HD44780_CHAR_HEIGHT) + 1; - n_cols = right_edge / (HD44780_CHAR_WIDTH) + 1; - - for (i = 0; i < n_cols; i++) { - lcd_put_wchar(i, 0, CHAR_LINE_TOP); // Box Top line - lcd_put_wchar(i, n_rows - 1, CHAR_LINE_BOT); // Box Bottom line - } - - for (j = 0; j < n_rows; j++) { - lcd_put_wchar(0, j, CHAR_EDGE_L); // Box Left edge - lcd_put_wchar(n_cols - 1, j, CHAR_EDGE_R); // Box Right edge - } - - /** - * If the entire 4th row is not in use, do not put vertical bars all the way down to the bottom of the display - */ - - k = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y) + 2; - l = (HD44780_CHAR_HEIGHT) * n_rows; - if (l > k && l - k >= (HD44780_CHAR_HEIGHT) / 2) { - lcd_put_wchar(0, n_rows - 1, ' '); // Box Left edge - lcd_put_wchar(n_cols - 1, n_rows - 1, ' '); // Box Right edge - } - - clear_custom_char(&new_char); - new_char.custom_char_bits[0] = 0b11111U; // Char #0 is used for the box top line - lcd.createChar(CHAR_LINE_TOP, (uint8_t*)&new_char); - - clear_custom_char(&new_char); - k = (GRID_MAX_POINTS_Y) * pixels_per_y_mesh_pnt + 1; // Row of pixels for the bottom box line - l = k % (HD44780_CHAR_HEIGHT); // Row within relevant character cell - new_char.custom_char_bits[l] = 0b11111U; // Char #1 is used for the box bottom line - lcd.createChar(CHAR_LINE_BOT, (uint8_t*)&new_char); - - clear_custom_char(&new_char); - for (j = 0; j < HD44780_CHAR_HEIGHT; j++) - new_char.custom_char_bits[j] = 0b10000U; // Char #2 is used for the box left edge - lcd.createChar(CHAR_EDGE_L, (uint8_t*)&new_char); - - clear_custom_char(&new_char); - m = (GRID_MAX_POINTS_X) * pixels_per_x_mesh_pnt + 1; // Column of pixels for the right box line - n = m % (HD44780_CHAR_WIDTH); // Column within relevant character cell - i = HD44780_CHAR_WIDTH - 1 - n; // Column within relevant character cell (0 on the right) - for (j = 0; j < HD44780_CHAR_HEIGHT; j++) - new_char.custom_char_bits[j] = (uint8_t)_BV(i); // Char #3 is used for the box right edge - lcd.createChar(CHAR_EDGE_R, (uint8_t*)&new_char); - - i = x_plot * pixels_per_x_mesh_pnt - suppress_x_offset; - j = y_plot_inv * pixels_per_y_mesh_pnt - suppress_y_offset; - upper_left = pixel_location(i, j); - - k = (x_plot + 1) * pixels_per_x_mesh_pnt - 1 - suppress_x_offset; - l = (y_plot_inv + 1) * pixels_per_y_mesh_pnt - 1 - suppress_y_offset; - lower_right = pixel_location(k, l); - - bottom_right_corner = pixel_location(x_map_pixels, y_map_pixels); - - /** - * First, handle the simple case where everything is within a single character cell. - * If part of the Mesh Plot is outside of this character cell, we will follow up - * and deal with that next. - */ - - clear_custom_char(&new_char); - const lcd_uint_t ypix = _MIN(upper_left.y_pixel_offset + pixels_per_y_mesh_pnt, HD44780_CHAR_HEIGHT); - for (j = upper_left.y_pixel_offset; j < ypix; j++) { - i = upper_left.x_pixel_mask; - for (k = 0; k < pixels_per_x_mesh_pnt; k++) { - new_char.custom_char_bits[j] |= i; - i >>= 1; - } - } - - prep_and_put_map_char(new_char, upper_left, lower_right, bottom_right_corner, TOP_LEFT, CHAR_UL_UL, upper_left.column, upper_left.row); - - /** - * Next, check for two side by side character cells being used to display the Mesh Point - * If found... do the right hand character cell next. - */ - if (upper_left.column == lower_right.column - 1) { - l = upper_left.x_pixel_offset; - clear_custom_char(&new_char); - for (j = upper_left.y_pixel_offset; j < ypix; j++) { - i = _BV(HD44780_CHAR_WIDTH - 1); // Fill in the left side of the right character cell - for (k = 0; k < pixels_per_x_mesh_pnt - 1 - l; k++) { - new_char.custom_char_bits[j] |= i; - i >>= 1; - } - } - prep_and_put_map_char(new_char, upper_left, lower_right, bottom_right_corner, TOP_RIGHT, CHAR_LR_UL, lower_right.column, upper_left.row); - } - - /** - * Next, check for two character cells stacked on top of each other being used to display the Mesh Point - */ - if (upper_left.row == lower_right.row - 1) { - l = HD44780_CHAR_HEIGHT - upper_left.y_pixel_offset; // Number of pixel rows in top character cell - k = pixels_per_y_mesh_pnt - l; // Number of pixel rows in bottom character cell - clear_custom_char(&new_char); - for (j = 0; j < k; j++) { - i = upper_left.x_pixel_mask; - for (m = 0; m < pixels_per_x_mesh_pnt; m++) { // Fill in the top side of the bottom character cell - new_char.custom_char_bits[j] |= i; - if (!(i >>= 1)) break; - } - } - prep_and_put_map_char(new_char, upper_left, lower_right, bottom_right_corner, LOWER_LEFT, CHAR_UL_LR, upper_left.column, lower_right.row); - } - - /** - * Next, check for four character cells being used to display the Mesh Point. If that is - * what is here, we work to fill in the character cell that is down one and to the right one - * from the upper_left character cell. - */ - - if (upper_left.column == lower_right.column - 1 && upper_left.row == lower_right.row - 1) { - l = HD44780_CHAR_HEIGHT - upper_left.y_pixel_offset; // Number of pixel rows in top character cell - k = pixels_per_y_mesh_pnt - l; // Number of pixel rows in bottom character cell - clear_custom_char(&new_char); - for (j = 0; j < k; j++) { - l = upper_left.x_pixel_offset; - i = _BV(HD44780_CHAR_WIDTH - 1); // Fill in the left side of the right character cell - for (m = 0; m < pixels_per_x_mesh_pnt - 1 - l; m++) { // Fill in the top side of the bottom character cell - new_char.custom_char_bits[j] |= i; - i >>= 1; - } - } - prep_and_put_map_char(new_char, upper_left, lower_right, bottom_right_corner, LOWER_RIGHT, CHAR_LR_LR, lower_right.column, lower_right.row); - } - - #endif - - /** - * Print plot position - */ - lcd_put_wchar(_LCD_W_POS, 0, '('); - lcd_put_u8str(ui8tostr3rj(x_plot)); - lcd_put_wchar(','); - lcd_put_u8str(ui8tostr3rj(y_plot)); - lcd_put_wchar(')'); - - #if LCD_HEIGHT <= 3 // 16x2 or 20x2 display - - /** - * Print Z values - */ - _ZLABEL(_LCD_W_POS, 1); - if (!isnan(ubl.z_values[x_plot][y_plot])) - lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); - else - lcd_put_u8str_P(PSTR(" -----")); - - #else // 16x4 or 20x4 display - - /** - * Show all values at right of screen - */ - _XLABEL(_LCD_W_POS, 1); - lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(ubl.mesh_index_to_xpos(x_plot)))); - _YLABEL(_LCD_W_POS, 2); - lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(ubl.mesh_index_to_ypos(y_plot)))); - - /** - * Show the location value - */ - _ZLABEL(_LCD_W_POS, 3); - if (!isnan(ubl.z_values[x_plot][y_plot])) - lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); - else - lcd_put_u8str_P(PSTR(" -----")); - - #endif // LCD_HEIGHT > 3 - } - - void add_edges_to_custom_char(custom_char &custom, const coordinate &ul, const coordinate &lr, const coordinate &brc, const uint8_t cell_location) { - uint8_t i, k; - int16_t n_rows = lr.row - ul.row + 1, - n_cols = lr.column - ul.column + 1; - - /** - * Check if Top line of box needs to be filled in - */ - - if (ul.row == 0 && (cell_location & (TOP_LEFT|TOP_RIGHT))) { // Only fill in the top line for the top character cells - - if (n_cols == 1) { - if (ul.column != brc.column) - custom.custom_char_bits[0] = 0xFF; // Single column in middle - else - for (i = brc.x_pixel_offset; i < HD44780_CHAR_WIDTH; i++) // Single column on right side - SBI(custom.custom_char_bits[0], i); - } - else if ((cell_location & TOP_LEFT) || lr.column != brc.column) // Multiple column in the middle or with right cell in middle - custom.custom_char_bits[0] = 0xFF; - else - for (i = brc.x_pixel_offset; i < HD44780_CHAR_WIDTH; i++) - SBI(custom.custom_char_bits[0], i); - } - - /** - * Check if left line of box needs to be filled in - */ - if (cell_location & (TOP_LEFT|LOWER_LEFT)) { - if (ul.column == 0) { // Left column of characters on LCD Display - k = ul.row == brc.row ? brc.y_pixel_offset : HD44780_CHAR_HEIGHT; // If it isn't the last row... do the full character cell - for (i = 0; i < k; i++) - SBI(custom.custom_char_bits[i], HD44780_CHAR_WIDTH - 1); - } - } - - /** - * Check if bottom line of box needs to be filled in - */ - - // Single row of mesh plot cells - if (n_rows == 1 /* && (cell_location & (TOP_LEFT|TOP_RIGHT)) */ && ul.row == brc.row) { - if (n_cols == 1) // Single row, single column case - k = ul.column == brc.column ? brc.x_pixel_mask : 0x01; - else if (cell_location & TOP_RIGHT) // Single row, multiple column case - k = lr.column == brc.column ? brc.x_pixel_mask : 0x01; - else // Single row, left of multiple columns - k = 0x01; - while (k < _BV(HD44780_CHAR_WIDTH)) { - custom.custom_char_bits[brc.y_pixel_offset] |= k; - k <<= 1; - } - } - - // Double row of characters on LCD Display - // And this is a bottom custom character - if (n_rows == 2 && (cell_location & (LOWER_LEFT|LOWER_RIGHT)) && lr.row == brc.row) { - if (n_cols == 1) // Double row, single column case - k = ul.column == brc.column ? brc.x_pixel_mask : 0x01; - else if (cell_location & LOWER_RIGHT) // Double row, multiple column case - k = lr.column == brc.column ? brc.x_pixel_mask : 0x01; - else // Double row, left of multiple columns - k = 0x01; - while (k < _BV(HD44780_CHAR_WIDTH)) { - custom.custom_char_bits[brc.y_pixel_offset] |= k; - k <<= 1; - } - } - - /** - * Check if right line of box needs to be filled in - */ - - // Nothing to do if the lower right part of the mesh pnt isn't in the same column as the box line - if (lr.column == brc.column) { - // This mesh point is in the same character cell as the right box line - if (ul.column == brc.column || (cell_location & (TOP_RIGHT|LOWER_RIGHT))) { - // If not the last row... do the full character cell - k = ul.row == brc.row ? brc.y_pixel_offset : HD44780_CHAR_HEIGHT; - for (i = 0; i < k; i++) custom.custom_char_bits[i] |= brc.x_pixel_mask; - } - } - } - - #endif // AUTO_BED_LEVELING_UBL - -#endif // HAS_LCD_MENU - -#endif // HAS_MARLINUI_HD44780 diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.h b/Marlin/src/lcd/HD44780/ultralcd_HD44780.h deleted file mode 100644 index 604d26a029..0000000000 --- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Hitachi HD44780 display defines and headers - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(LCD_I2C_TYPE_PCF8575) - - // NOTE: These are register-mapped pins on the PCF8575 controller, not Arduino pins. - #define LCD_I2C_PIN_BL 3 - #define LCD_I2C_PIN_EN 2 - #define LCD_I2C_PIN_RW 1 - #define LCD_I2C_PIN_RS 0 - #define LCD_I2C_PIN_D4 4 - #define LCD_I2C_PIN_D5 5 - #define LCD_I2C_PIN_D6 6 - #define LCD_I2C_PIN_D7 7 - - #include - #include - #include - #define LCD_CLASS LiquidCrystal_I2C - -#elif ENABLED(LCD_I2C_TYPE_MCP23017) - - // For the LED indicators (which may be mapped to different events in update_indicators()) - #define LCD_HAS_STATUS_INDICATORS - #define LED_A 0x04 //100 - #define LED_B 0x02 //010 - #define LED_C 0x01 //001 - - #include - #include - #define LCD_CLASS LiquidTWI2 - -#elif ENABLED(LCD_I2C_TYPE_MCP23008) - - #include - #include - #define LCD_CLASS LiquidTWI2 - -#elif ENABLED(LCD_I2C_TYPE_PCA8574) - - #include - #define LCD_CLASS LiquidCrystal_I2C - -#elif ENABLED(SR_LCD_2W_NL) - - // 2 wire Non-latching LCD SR from: - // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection - #include - #include - #define LCD_CLASS LiquidCrystal_SR - -#elif ENABLED(SR_LCD_3W_NL) - - // NewLiquidCrystal didn't work, so this uses - // https://github.com/mikeshub/SailfishLCD - - #include - #define LCD_CLASS LiquidCrystalSerial - -#elif ENABLED(LCM1602) - - #include - #include - #include - #define LCD_CLASS LiquidCrystal_I2C - -#else - - // Standard directly connected LCD implementations - #include - #define LCD_CLASS LiquidCrystal - -#endif - -#include "../fontutils.h" -#include "../lcdprint.h" diff --git a/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp deleted file mode 100644 index 51681a8009..0000000000 --- a/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp +++ /dev/null @@ -1,1142 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * @file lcdprint_TFTGLCD.cpp - * @brief LCD print API for TFT-GLCD interface - * @author Yunhui Fu (yhfudev@gmail.com) - * @version 1.0 - * @date 2016-08-19 - * @copyright GPL/BSD - */ - -/** - * The TFTGLCD only supports ??? languages. - */ - -#include "../../inc/MarlinConfigPre.h" - -#if IS_TFTGLCD_PANEL - -#include "../ultralcd.h" -#include "../../MarlinCore.h" -#include "../../libs/numtostr.h" - -#include "ultralcd_TFTGLCD.h" - -#include - -int lcd_glyph_height(void) { return 1; } - -typedef struct _TFTGLCD_charmap_t { - wchar_t uchar; // the unicode char - uint8_t idx; // the glyph of the char in the ROM - uint8_t idx2; // the char used to be combined with the idx to simulate a single char -} TFTGLCD_charmap_t; - -#ifdef __AVR__ - #define IV(a) U##a -#else - #define IV(a) L##a -#endif - -static const TFTGLCD_charmap_t g_TFTGLCD_charmap_device[] PROGMEM = { - // sorted by uchar: - #if DISPLAY_CHARSET_HD44780 == JAPANESE - - {IV('¢'), 0xEC, 0}, // A2 - {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09) - {IV('ä'), 0xE1, 0}, // E4 - {IV('ö'), 0xEF, 0}, // F6 - {IV('÷'), 0xFD, 0}, // 00F7 - {IV('ü'), 0xF5, 0}, // 00FC - {IV('ˣ'), 0xEB, 0}, // 02E3 - - {IV('·'), 0xA5, 0}, // 0387 - {IV('Ώ'), 0xF4, 0}, // 038F - {IV('Θ'), 0xF2, 0}, // 0398, Theta - {IV('Ξ'), 0xE3, 0}, // 039E, Xi - {IV('Σ'), 0xF6, 0}, // 03A3, Sigma - {IV('Ω'), 0xF4, 0}, // 03A9, Omega - {IV('ά'), 0xE0, 0}, // 03AC - {IV('έ'), 0xE3, 0}, // 03AD - {IV('α'), 0xE0, 0}, // 03B1, alpha - {IV('β'), 0xE2, 0}, // 03B2, beta - {IV('ε'), 0xE3, 0}, // 03B5, epsilon - {IV('θ'), 0xF2, 0}, // 03B8, theta - {IV('μ'), 0xE4, 0}, // 03BC, mu - {IV('ξ'), 0xE3, 0}, // 03BE, xi - {IV('π'), 0xF7, 0}, // 03C0, pi - {IV('ρ'), 0xE6, 0}, // 03C1, rho - {IV('σ'), 0xE5, 0}, // 03C3, sigma - - {IV('←'), 0x7F, 0}, // 2190 - {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03) - {IV('√'), 0xE8, 0}, // 221A - {IV('∞'), 0xF3, 0}, // 221E - {IV('█'), 0xFF, 0}, // 2588 - - //{IV(''), 0xA0, 0}, - {IV('。'), 0xA1, 0}, - {IV('「'), 0xA2, 0}, - {IV('」'), 0xA3, 0}, - {IV('゛'), 0xDE, 0}, // ‶ - {IV('゜'), 0xDF, 0}, // '〫' - {IV('゠'), '=', 0}, - {IV('ァ'), 0xA7, 0}, - {IV('ア'), 0xB1, 0}, - {IV('ィ'), 0xA8, 0}, - {IV('イ'), 0xB2, 0}, - {IV('ゥ'), 0xA9, 0}, - {IV('ウ'), 0xB3, 0}, - {IV('ェ'), 0xAA, 0}, - {IV('エ'), 0xB4, 0}, - {IV('ォ'), 0xAB, 0}, - - {IV('オ'), 0xB5, 0}, - {IV('カ'), 0xB6, 0}, - {IV('ガ'), 0xB6, 0xDE}, - {IV('キ'), 0xB7, 0}, - {IV('ギ'), 0xB7, 0xDE}, // - {IV('ク'), 0xB8, 0}, - {IV('グ'), 0xB8, 0xDE}, - {IV('ケ'), 0xB9, 0}, - {IV('ゲ'), 0xB9, 0xDE}, - {IV('コ'), 0xBA, 0}, - {IV('ゴ'), 0xBA, 0xDE}, - {IV('サ'), 0xBB, 0}, - {IV('ザ'), 0xBB, 0xDE}, - {IV('シ'), 0xBC, 0}, - {IV('ジ'), 0xBC, 0xDE}, - {IV('ス'), 0xBD, 0}, - {IV('ズ'), 0xBD, 0xDE}, - {IV('セ'), 0xBE, 0}, - {IV('ゼ'), 0xBE, 0xDE}, - {IV('ソ'), 0xBF, 0}, - {IV('ゾ'), 0xBF, 0xDE}, - - {IV('タ'), 0xC0, 0}, - {IV('ダ'), 0xC0, 0xDE}, - {IV('チ'), 0xC1, 0}, - {IV('ヂ'), 0xC1, 0xDE}, - {IV('ッ'), 0xAF, 0}, - {IV('ツ'), 0xC2, 0}, - {IV('ヅ'), 0xC2, 0xDE}, - {IV('テ'), 0xC3, 0}, - {IV('デ'), 0xC3, 0xDE}, - {IV('ト'), 0xC4, 0}, - {IV('ド'), 0xC4, 0xDE}, - {IV('ナ'), 0xC5, 0}, - {IV('ニ'), 0xC6, 0}, - {IV('ヌ'), 0xC7, 0}, - {IV('ネ'), 0xC8, 0}, - {IV('ノ'), 0xC9, 0}, - {IV('ハ'), 0xCA, 0}, - {IV('バ'), 0xCA, 0xDE}, - {IV('パ'), 0xCA, 0xDF}, - {IV('ヒ'), 0xCB, 0}, - {IV('ビ'), 0xCB, 0xDE}, - {IV('ピ'), 0xCB, 0xDF}, - {IV('フ'), 0xCC, 0}, - {IV('ブ'), 0xCC, 0xDE}, - {IV('プ'), 0xCC, 0xDF}, - {IV('ヘ'), 0xCD, 0}, - {IV('ベ'), 0xCD, 0xDE}, - {IV('ペ'), 0xCD, 0xDF}, - {IV('ホ'), 0xCE, 0}, - {IV('ボ'), 0xCE, 0xDE}, - {IV('ポ'), 0xCE, 0xDF}, - {IV('マ'), 0xCF, 0}, - - {IV('ミ'), 0xD0, 0}, - {IV('ム'), 0xD1, 0}, - {IV('メ'), 0xD2, 0}, - {IV('モ'), 0xD3, 0}, - {IV('ャ'), 0xAC, 0}, - {IV('ヤ'), 0xD4, 0}, - {IV('ュ'), 0xAD, 0}, - {IV('ユ'), 0xD5, 0}, - {IV('ョ'), 0xAE, 0}, - {IV('ヨ'), 0xD6, 0}, - {IV('ラ'), 0xD7, 0}, - {IV('リ'), 0xD8, 0}, - {IV('ル'), 0xD9, 0}, - {IV('レ'), 0xDA, 0}, - {IV('ロ'), 0xDB, 0}, - {IV('ワ'), 0xDC, 0}, - {IV('ヲ'), 0xA6, 0}, - {IV('ン'), 0xDD, 0}, - {IV('ヴ'), 0xB3, 0xDE}, - {IV('ヷ'), 0xDC, 0xDE}, - {IV('ヺ'), 0xA6, 0xDE}, - {IV('・'), 0xA5, 0}, - {IV('ー'), 0xB0, 0}, - {IV('ヽ'), 0xA4, 0}, - - //{IV('g'), 0xE7, 0}, // error - //{IV(''), 0xE9, 0}, - //{IV('j'), 0xEA, 0}, // error - //{IV(''), 0xED, 0}, - //{IV(''), 0xEE, 0}, - - //{IV('p'), 0xF0, 0}, // error - //{IV('q'), 0xF1, 0}, // error - //{IV(''), 0xF8, 0}, - //{IV('y'), 0xF9, 0}, // error - {IV('万'), 0xFB, 0}, - {IV('円'), 0xFC, 0}, - {IV('千'), 0xFA, 0}, - //{IV(''), 0xFE, 0}, - - //、・ヲァィゥェォャュョッー - {IV('、'), 0xA4, 0}, //ヽ - {IV('・'), 0xA5, 0}, //・ - {IV('ヲ'), 0xA6, 0}, //ヲ - {IV('ァ'), 0xA7, 0}, //ァ - {IV('ィ'), 0xA8, 0}, //ィ - {IV('ゥ'), 0xA9, 0}, //ゥ - {IV('ェ'), 0xAA, 0}, //ェ - {IV('ォ'), 0xAB, 0}, //ォ - {IV('ャ'), 0xAC, 0}, //ャ - {IV('ュ'), 0xAD, 0}, //ュ - {IV('ョ'), 0xAE, 0}, //ョ - {IV('ッ'), 0xAF, 0}, //ッ - {IV('ー'), 0xB0, 0}, //ー - - //アイウエオカキクケコサシスセ - {IV('ア'), 0xB1, 0}, //ア - {IV('イ'), 0xB2, 0}, //イ - {IV('ウ'), 0xB3, 0}, //ウ - {IV('エ'), 0xB4, 0}, //エ - {IV('オ'), 0xB5, 0}, //オ - {IV('カ'), 0xB6, 0}, //カ - {IV('キ'), 0xB7, 0}, //キ - {IV('ク'), 0xB8, 0}, //ク - {IV('ケ'), 0xB9, 0}, //ケ - {IV('コ'), 0xBA, 0}, //コ - {IV('サ'), 0xBB, 0}, //サ - {IV('シ'), 0xBC, 0}, //シ - {IV('ス'), 0xBD, 0}, //ス - {IV('セ'), 0xBE, 0}, //セ - - //ソタチツテトナニヌネノハヒフ - {IV('ソ'), 0xBF, 0}, //ソ - {IV('タ'), 0xC0, 0}, //タ - {IV('チ'), 0xC1, 0}, //チ - {IV('ツ'), 0xC2, 0}, //ツ - {IV('テ'), 0xC3, 0}, //テ - {IV('ト'), 0xC4, 0}, //ト - {IV('ナ'), 0xC5, 0}, //ナ - {IV('ニ'), 0xC6, 0}, //ニ - {IV('ヌ'), 0xC7, 0}, //ヌ - {IV('ネ'), 0xC8, 0}, //ネ - {IV('ノ'), 0xC9, 0}, //ノ - {IV('ハ'), 0xCA, 0}, //ハ - {IV('ヒ'), 0xCB, 0}, //ヒ - {IV('フ'), 0xCC, 0}, //フ - - //ヘホマミムメモヤユヨラリルレロワン゙゚ - {IV('ヘ'), 0xCD, 0}, //ヘ - {IV('ホ'), 0xCE, 0}, //ホ - {IV('マ'), 0xCF, 0}, //マ - {IV('ミ'), 0xD0, 0}, //ミ - {IV('ム'), 0xD1, 0}, //ム - {IV('メ'), 0xD2, 0}, //メ - {IV('モ'), 0xD3, 0}, //モ - {IV('ヤ'), 0xD4, 0}, //ヤ - {IV('ユ'), 0xD5, 0}, //ユ - {IV('ヨ'), 0xD6, 0}, //ヨ - {IV('ラ'), 0xD7, 0}, //ラ - {IV('リ'), 0xD8, 0}, //リ - {IV('ル'), 0xD9, 0}, //ル - {IV('レ'), 0xDA, 0}, //レ - {IV('ロ'), 0xDB, 0}, //ロ - {IV('ワ'), 0xDC, 0}, //ワ - {IV('ン'), 0xDD, 0}, //ン - {IV('゙'), 0xDE, 0}, // ゛ - {IV('゚'), 0xDF, 0}, // ゜ - - {IV('¥'), 0x5C, 0}, - - #elif DISPLAY_CHARSET_HD44780 == WESTERN - // 0x10 -- 0x1F (except 0x1C) - // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF) - - {IV('¡'), 0xA9, 0}, - {IV('¢'), 0xA4, 0}, - {IV('£'), 0xA5, 0}, - {IV('¥'), 0xA6, 0}, - {IV('§'), 0xD2, 0}, // section sign - {IV('©'), 0xCF, 0}, - - {IV('ª'), 0x9D, 0}, - {IV('«'), 0xBB, 0}, - {IV('®'), 0xCE, 0}, - - {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09) - //{IV(''), 0xD1, 0}, - {IV('±'), 0x10, 0}, //∓± - //{'='), 0x1C, 0}, // error - {IV('²'), 0x1E, 0}, - {IV('³'), 0x1F, 0}, - {IV('¶'), 0xD3, 0}, // pilcrow sign - {IV('º'), 0x9E, 0}, - {IV('»'), 0xBC, 0}, // 00BB - //{IV(''), 0xB3, 0}, // error - //{IV(''), 0xB4, 0}, // error - {IV('¼'), 0xB6, 0}, // 00BC - {IV('½'), 0xB5, 0}, // 00BD - //{IV('¾'), '3', 0}, // 00BE - {IV('¿'), 0x9F, 0}, // 00BF - - {IV('Â'), 0x8F, 0}, - {IV('Ã'), 0xAA, 0}, - {IV('Ä'), 0x8E, 0}, - {IV('Æ'), 0x92, 0}, - {IV('Ç'), 0x80, 0}, - {IV('É'), 0x90, 0}, - {IV('Ñ'), 0x9C, 0}, - {IV('Õ'), 0xAC, 0}, - {IV('Ö'), 0x99, 0}, - {IV('×'), 0xB7, 0}, - {IV('Ø'), 0xAE, 0}, - {IV('Ü'), 0x9A, 0}, - {IV('à'), 0x85, 0}, - {IV('á'), 0xA0, 0}, - {IV('â'), 0x83, 0}, - {IV('ã'), 0xAB, 0}, - {IV('ä'), 0x84, 0}, - {IV('å'), 0x86, 0}, - {IV('æ'), 0x91, 0}, - {IV('ç'), 0x87, 0}, - {IV('è'), 0x8A, 0}, - {IV('é'), 0x82, 0}, - {IV('ê'), 0x88, 0}, - {IV('ë'), 0x89, 0}, - {IV('ì'), 0x8D, 0}, - {IV('í'), 0xA1, 0}, - {IV('î'), 0x8C, 0}, - {IV('ï'), 0x8B, 0}, - - {IV('ñ'), 0x9B, 0}, - {IV('ò'), 0x95, 0}, - {IV('ó'), 0xA2, 0}, - {IV('ô'), 0x93, 0}, - {IV('õ'), 0xAD, 0}, - {IV('ö'), 0x94, 0}, - {IV('÷'), 0xB8, 0}, - {IV('ø'), 0xAF, 0}, - {IV('ù'), 0x97, 0}, - {IV('ú'), 0xA3, 0}, - {IV('û'), 0x96, 0}, - {IV('ü'), 0x81, 0}, - {IV('ÿ'), 0x98, 0}, - - //{IV(''), 0xB0, 0}, // error - //{IV(''), 0xB1, 0}, // error - {IV('ƒ'), 0xA8, 0}, // 0192 - - {IV('Ύ'), 0xDB, 0}, // 038E - {IV('Ώ'), 0xDE, 0}, // 038F - {IV('ΐ'), 0xE7, 0}, // 0390 - - {IV('Γ'), 0xD4, 0}, // 0393, Gamma - {IV('Δ'), 0xD5, 0}, // 0394, Delta, ◿ - {IV('Θ'), 0xD6, 0}, // 0398, Theta - {IV('Λ'), 0xD7, 0}, // 039B, Lambda - {IV('Ξ'), 0xD8, 0}, // 039E, Xi - {IV('Π'), 0xD9, 0}, // Pi - {IV('Σ'), 0xDA, 0}, // Sigma - {IV('Υ'), 0xDB, 0}, // Upsilon - {IV('Φ'), 0xDC, 0}, // Phi - {IV('Ψ'), 0xDD, 0}, // Psi - {IV('Ω'), 0xDE, 0}, // Omega - - {IV('ά'), 0xDF, 0}, // 03AC - {IV('έ'), 0xE3, 0}, // 03AD - {IV('ή'), 0xE5, 0}, // 03AE - {IV('ί'), 0xE7, 0}, // 03AF - {IV('ΰ'), 0xF1, 0}, // 03B0 - - {IV('α'), 0xDF, 0}, // alpha - {IV('β'), 0xE0, 0}, // beta - {IV('γ'), 0xE1, 0}, // gamma - {IV('δ'), 0xE2, 0}, // delta - {IV('ε'), 0xE3, 0}, // epsilon - {IV('ζ'), 0xE4, 0}, // zeta - {IV('η'), 0xE5, 0}, // eta - {IV('θ'), 0xE6, 0}, // theta - {IV('ι'), 0xE7, 0}, // lota - {IV('κ'), 0xE8, 0}, // kappa - {IV('λ'), 0xE9, 0}, // lambda - {IV('μ'), 0xEA, 0}, // mu - {IV('ν'), 0xEB, 0}, // nu - {IV('ξ'), 0xEC, 0}, // xi - {IV('π'), 0xED, 0}, // pi - {IV('ρ'), 0xEE, 0}, // rho - {IV('σ'), 0xEF, 0}, // sigma - - {IV('τ'), 0xF0, 0}, // tau - {IV('υ'), 0xF1, 0}, // upsilon - {IV('χ'), 0xF2, 0}, // chi - {IV('ψ'), 0xF3, 0}, // psi - {IV('ω'), 0xF4, 0}, // 03C9, omega - {IV('ϊ'), 0xE7, 0}, // 03CA - {IV('ϋ'), 0xF1, 0}, // 03CB - {IV('ύ'), 0xF1, 0}, // 03CD - {IV('ώ'), 0xF4, 0}, // 03CE - - {IV('•'), 0xCD, 0}, // · - {IV('℞'), 0xA7, 0}, // ℞ Pt ASCII 158 - {IV('™'), 0xD0, 0}, - {IV('↤'), 0xF9, 0}, // ⟻ - {IV('↵'), 0xC4, 0}, - {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) - {IV('⇥'), 0xFB, 0}, - {IV('√'), 0xBE, 0}, // √ - {IV('∞'), 0xC2, 0}, // infinity - {IV('∫'), 0x1B, 0}, - {IV('∼'), 0x1D, 0}, - {IV('≈'), 0x1A, 0}, - {IV('≠'), 0xBD, 0}, - {IV('≡'), 0x11, 0}, - {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾ - {IV('≥'), 0xBA, 0}, - //{IV(''), 0xBF, 0}, // error - - {IV('⌠'), 0xC0, 0}, - {IV('⌡'), 0xC1, 0}, - - {IV('⎧'), 0x14, 0}, - {IV('⎩'), 0x15, 0}, - {IV('⎫'), 0x16, 0}, - {IV('⎭'), 0x17, 0}, - {IV('⎰'), 0x18, 0}, - {IV('⎱'), 0x19, 0}, - {IV('⎲'), 0x12, 0}, - {IV('⎳'), 0x13, 0}, - - {IV('⏱'), 0x07, 0}, // Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) - {IV('┌'), 0xC9, 0}, - {IV('┐'), 0xCA, 0}, - {IV('└'), 0xCB, 0}, - {IV('┘'), 0xCC, 0}, - {IV('◸'), 0xC3, 0}, // ◿ - {IV('⭠'), 0xC8, 0}, - {IV('⭡'), 0xC5, 0}, - {IV('⭢'), 0xC7, 0}, - {IV('⭣'), 0xC6, 0}, - - - {IV('⯆'), 0xF5, 0}, - {IV('⯇'), 0xF7, 0}, // ⯅ - {IV('⯈'), 0xF6, 0}, - //{IV(''), 0xF8, 0}, // error - //{IV(''), 0xFA, 0}, // error - //{IV(''), 0xFC, 0}, // error - //{IV(''), 0xFD, 0}, // error - //{IV(''), 0xFE, 0}, // error - //{IV(''), 0xFF, 0}, // error - - #elif DISPLAY_CHARSET_HD44780 == CYRILLIC - - #ifdef CONVERT_TO_EXT_ASCII - {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) - {IV('²'), 0x0E, 0}, // 0x32 if no special symbol in panel font - {IV('³'), 0x0F, 0}, // 0x33 if no special symbol in panel font - - // translate to cp866 codepage - //first ASCII symbols in panel font must be replaced with Marlin special symbols - {IV('Ё'), 0xF0, 0}, // 0401 - {IV('Є'), 0xF2, 0}, // 0404 - {IV('І'), 'I', 0}, // 0406 - {IV('Ї'), 0xF4, 0}, // 0407 - {IV('Ў'), 0xF6, 0}, // 040E - {IV('А'), 0x80, 0}, // 0410 - {IV('Б'), 0x81, 0}, - {IV('В'), 0x82, 0}, - {IV('Г'), 0x83, 0}, - {IV('Д'), 0x84, 0}, - {IV('Е'), 0x85, 0}, - {IV('Ж'), 0x86, 0}, - {IV('З'), 0x87, 0}, - {IV('И'), 0x88, 0}, - {IV('Й'), 0x89, 0}, - {IV('К'), 0x8A, 0}, - {IV('Л'), 0x8B, 0}, - {IV('М'), 0x8C, 0}, - {IV('Н'), 0x8D, 0}, - {IV('О'), 0x8E, 0}, - {IV('П'), 0x8F, 0}, - {IV('Р'), 0x90, 0}, - {IV('С'), 0x91, 0}, - {IV('Т'), 0x92, 0}, - {IV('У'), 0x93, 0}, - {IV('Ф'), 0x94, 0}, - {IV('Х'), 0x95, 0}, - {IV('Ц'), 0x96, 0}, - {IV('Ч'), 0x97, 0}, - {IV('Ш'), 0x98, 0}, - {IV('Щ'), 0x99, 0}, - {IV('Ъ'), 0x9A, 0}, - {IV('Ы'), 0x9B, 0}, - {IV('Ь'), 0x9C, 0}, - {IV('Э'), 0x9D, 0}, - {IV('Ю'), 0x9E, 0}, - {IV('Я'), 0x9F, 0}, - - {IV('а'), 0xA0, 0}, - {IV('б'), 0xA1, 0}, - {IV('в'), 0xA2, 0}, - {IV('г'), 0xA3, 0}, - {IV('д'), 0xA4, 0}, - {IV('е'), 0xA5, 0}, - {IV('ж'), 0xA6, 0}, - {IV('з'), 0xA7, 0}, - {IV('и'), 0xA8, 0}, - {IV('й'), 0xA9, 0}, - {IV('к'), 0xAA, 0}, - {IV('л'), 0xAB, 0}, - {IV('м'), 0xAC, 0}, - {IV('н'), 0xAD, 0}, - {IV('о'), 0xAE, 0}, - {IV('п'), 0xAF, 0}, - {IV('р'), 0xE0, 0}, - {IV('с'), 0xE1, 0}, - {IV('т'), 0xE2, 0}, - {IV('у'), 0xE3, 0}, - {IV('ф'), 0xE4, 0}, - {IV('х'), 0xE5, 0}, - {IV('ц'), 0xE6, 0}, - {IV('ч'), 0xE7, 0}, - {IV('ш'), 0xE8, 0}, - {IV('щ'), 0xE9, 0}, - {IV('ъ'), 0xEA, 0}, - {IV('ы'), 0xEB, 0}, - {IV('ь'), 0xEC, 0}, - {IV('э'), 0xED, 0}, - {IV('ю'), 0xEE, 0}, - {IV('я'), 0xEF, 0}, // 044F - {IV('ё'), 0xF1, 0}, // 0451 - {IV('є'), 0xF3, 0}, // 0454 - {IV('і'), 'i', 0}, // 0456 - {IV('ї'), 0xF5, 0}, // 0457 - {IV('ў'), 0xF7, 0}, // 045E - - #else - - {IV('¢'), 0x5C, 0}, // 00A2 - {IV('£'), 0xCF, 0}, // 00A3 - {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) - - //{IV(''), 0x80, 0}, - //{IV(''), 0x81, 0}, - //{IV(''), 0x82, 0}, - //{IV(''), 0x83, 0}, - //{IV(''), 0x84, 0}, - //{IV(''), 0x85, 0}, - //{IV(''), 0x86, 0}, - //{IV(''), 0x87, 0}, - //{IV(''), 0x88, 0}, - //{IV(''), 0x89, 0}, - //{IV(''), 0x8A, 0}, - //{IV(''), 0x8B, 0}, - //{IV(''), 0x8C, 0}, - //{IV(''), 0x8D, 0}, - //{IV(''), 0x8E, 0}, - //{IV(''), 0x8F, 0}, - - //{IV(''), 0x90, 0}, - //{IV(''), 0x91, 0}, - //{IV(''), 0x92, 0}, - //{IV(''), 0x93, 0}, - //{IV(''), 0x94, 0}, - //{IV(''), 0x95, 0}, - //{IV(''), 0x96, 0}, - //{IV(''), 0x97, 0}, - //{IV(''), 0x98, 0}, - //{IV(''), 0x99, 0}, - //{IV(''), 0x9A, 0}, - //{IV(''), 0x9B, 0}, - //{IV(''), 0x9C, 0}, - //{IV(''), 0x9D, 0}, - //{IV(''), 0x9E, 0}, - //{IV(''), 0x9F, 0}, - - {IV('¼'), 0xF0, 0}, // 00BC - {IV('⅓'), 0xF1, 0}, - {IV('½'), 0xF2, 0}, // 00BD - {IV('¾'), 0xF3, 0}, // 00BE - {IV('¿'), 0xCD, 0}, // 00BF - - {IV('Ё'), 0xA2, 0}, // 0401 - {IV('А'), 'A', 0}, // 0410 - {IV('Б'), 0xA0, 0}, - {IV('В'), 'B', 0}, - {IV('Г'), 0xA1, 0}, - {IV('Д'), 0xE0, 0}, - {IV('Е'), 'E', 0}, - {IV('Ж'), 0xA3, 0}, - {IV('З'), 0xA4, 0}, - {IV('И'), 0xA5, 0}, - {IV('Й'), 0xA6, 0}, - {IV('К'), 'K', 0}, - {IV('Л'), 0xA7, 0}, - {IV('М'), 'M', 0}, - {IV('Н'), 'H', 0}, - {IV('О'), 'O', 0}, - {IV('П'), 0xA8, 0}, - {IV('Р'), 'P', 0}, - {IV('С'), 'C', 0}, - {IV('Т'), 'T', 0}, - {IV('У'), 0xA9, 0}, - {IV('Ф'), 0xAA, 0}, - {IV('Х'), 'X', 0}, - {IV('Ц'), 0xE1, 0}, - {IV('Ч'), 0xAB, 0}, - {IV('Ш'), 0xAC, 0}, - {IV('Щ'), 0xE2, 0}, - {IV('Ъ'), 0xAD, 0}, - {IV('Ы'), 0xAE, 0}, - {IV('Ь'), 'b', 0}, - {IV('Э'), 0xAF, 0}, - {IV('Ю'), 0xB0, 0}, - {IV('Я'), 0xB1, 0}, - {IV('а'), 'a', 0}, - - {IV('б'), 0xB2, 0}, - {IV('в'), 0xB3, 0}, - {IV('г'), 0xB4, 0}, - {IV('д'), 0xE3, 0}, - {IV('е'), 'e', 0}, - {IV('ж'), 0xB6, 0}, - {IV('з'), 0xB7, 0}, - {IV('и'), 0xB8, 0}, - {IV('й'), 0xB9, 0}, - {IV('к'), 0xBA, 0}, - {IV('л'), 0xBB, 0}, - {IV('м'), 0xBC, 0}, - {IV('н'), 0xBD, 0}, - {IV('о'), 'o', 0}, - {IV('п'), 0xBE, 0}, - {IV('р'), 'p', 0}, - {IV('с'), 'c', 0}, - {IV('т'), 0xBF, 0}, - - {IV('у'), 'y', 0}, - {IV('ф'), 0xE4, 0}, - {IV('х'), 'x', 0}, - {IV('ц'), 0xE5, 0}, - {IV('ч'), 0xC0, 0}, - {IV('ш'), 0xC1, 0}, - {IV('щ'), 0xE6, 0}, - {IV('ъ'), 0xC2, 0}, - {IV('ы'), 0xC3, 0}, - {IV('ь'), 0xC4, 0}, - {IV('э'), 0xC5, 0}, - {IV('ю'), 0xC6, 0}, - {IV('я'), 0xC7, 0}, // 044F - {IV('ё'), 0xB5, 0}, // 0451 - //{IV(''), 0xC8, 0}, - //{IV(''), 0xC9, 0}, - //{IV(''), 0xCA, 0}, - //{IV(''), 0xCB, 0}, - //{IV(''), 0xCC, 0}, - //{IV(''), 0xCD, 0}, - //{IV(''), 0xCE, 0}, - - //{IV(''), 0xD0, 0}, - //{IV(''), 0xD1, 0}, - //{IV(''), 0xD2, 0}, - //{IV(''), 0xD3, 0}, - //{IV(''), 0xD4, 0}, - //{IV(''), 0xD5, 0}, - //{IV(''), 0xD6, 0}, - //{IV(''), 0xD7, 0}, - //{IV(''), 0xD8, 0}, - //{IV(''), 0xDB, 0}, - //{IV(''), 0xDC, 0}, - //{IV(''), 0xDD, 0}, - //{IV(''), 0xDE, 0}, - //{IV(''), 0xDF, 0}, - - //{IV(''), 0xE7, 0}, - //{IV(''), 0xE8, 0}, - //{IV(''), 0xE9, 0}, - //{IV(''), 0xEA, 0}, - //{IV(''), 0xEB, 0}, - //{IV(''), 0xEC, 0}, - //{IV(''), 0xED, 0}, - //{IV(''), 0xEE, 0}, - //{IV(''), 0xEF, 0}, - - //{IV(''), 0xF4, 0}, - //{IV(''), 0xF5, 0}, - //{IV(''), 0xF6, 0}, - //{IV(''), 0xF7, 0}, - //{IV(''), 0xF8, 0}, - //{IV(''), 0xF9, 0}, - //{IV(''), 0xFA, 0}, - //{IV(''), 0xFB, 0}, - //{IV(''), 0xFC, 0}, - //{IV(''), 0xFD, 0}, - //{IV(''), 0xFE, 0}, - //{IV(''), 0xFF, 0}, - - {IV('↑'), 0xD9, 0}, // 2191 ←↑→↓ - {IV('↓'), 0xDA, 0}, // 2193 - - #endif - - #endif -}; - -// the plain ASCII replacement for various char -static const TFTGLCD_charmap_t g_TFTGLCD_charmap_common[] PROGMEM = { - {IV('¡'), 'i', 0}, // A1 - {IV('¢'), 'c', 0}, // A2 - {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09) - - #ifndef CONVERT_TO_EXT_ASCII //this time CONVERT_TO_EXT_ASCII works only with en, ru and uk languages - - // map WESTERN code to the plain ASCII - {IV('Á'), 'A', 0}, // C1 - {IV('Â'), 'A', 0}, // C2 - {IV('Ã'), 'A', 0}, // C3 - {IV('Ä'), 'A', 0}, // C4 - {IV('Å'), 'A', 0}, // C5 - {IV('Æ'), 'A', 'E'}, // C6 - {IV('Ç'), 'C', 0}, // C7 - {IV('È'), 'E', 0}, // C8 - {IV('É'), 'E', 0}, // C9 - {IV('Í'), 'I', 0}, // CD - {IV('Ñ'), 'N', 0}, // D1 - {IV('Õ'), 'O', 0}, // D5 - {IV('Ö'), 'O', 0}, // D6 - {IV('×'), 'x', 0}, // D7 - {IV('Ü'), 'U', 0}, // DC - {IV('Ý'), 'Y', 0}, // DD - {IV('à'), 'a', 0}, // E0 - {IV('á'), 'a', 0}, - {IV('â'), 'a', 0}, - {IV('ã'), 'a', 0}, - {IV('ä'), 'a', 0}, - {IV('å'), 'a', 0}, - {IV('æ'), 'a', 'e'}, - {IV('ç'), 'c', 0}, - {IV('è'), 'e', 0}, // 00E8 - {IV('é'), 'e', 0}, - {IV('ê'), 'e', 0}, - {IV('ë'), 'e', 0}, - {IV('ì'), 'i', 0}, // 00EC - {IV('í'), 'i', 0}, - {IV('î'), 'i', 0}, - {IV('ï'), 'i', 0}, // 00EF - - {IV('ñ'), 'n', 0}, // 00F1 - {IV('ò'), 'o', 0}, - {IV('ó'), 'o', 0}, - {IV('ô'), 'o', 0}, - {IV('õ'), 'o', 0}, - {IV('ö'), 'o', 0}, - //{IV('÷'), 0xB8, 0}, - {IV('ø'), 'o', 0}, - {IV('ù'), 'u', 0}, - {IV('ú'), 'u', 0}, - {IV('û'), 'u', 0}, - {IV('ü'), 'u', 0}, // FC - {IV('ý'), 'y', 0}, // FD - {IV('ÿ'), 'y', 0}, // FF - - {IV('Ą'), 'A', 0}, // 0104 - {IV('ą'), 'a', 0}, // 0105 - {IV('Ć'), 'C', 0}, // 0106 - {IV('ć'), 'c', 0}, // 0107 - {IV('Č'), 'C', 0}, // 010C - {IV('č'), 'c', 0}, // 010D - {IV('Ď'), 'D', 0}, // 010E - {IV('ď'), 'd', 0}, // 010F - {IV('đ'), 'd', 0}, // 0111 - {IV('ę'), 'e', 0}, // 0119 - {IV('ğ'), 'g', 0}, // 011F - {IV('İ'), 'I', 0}, // 0130 - {IV('ı'), 'i', 0}, // 0131 - - {IV('Ł'), 'L', 0}, // 0141 - {IV('ł'), 'l', 0}, // 0142 - {IV('Ń'), 'N', 0}, // 0143 - {IV('ń'), 'n', 0}, // 0144 - {IV('ň'), 'n', 0}, // 0148 - - {IV('ř'), 'r', 0}, // 0159 - {IV('Ś'), 'S', 0}, // 015A - {IV('ś'), 's', 0}, // 015B - {IV('ş'), 's', 0}, // 015F - {IV('Š'), 'S', 0}, // 0160 - {IV('š'), 's', 0}, // 0161 - {IV('ť'), 't', 0}, // 0165 - {IV('ů'), 'u', 0}, // 016F - {IV('ż'), 'z', 0}, // 017C - {IV('Ž'), 'Z', 0}, // 017D - {IV('ž'), 'z', 0}, // 017E - {IV('ƒ'), 'f', 0}, // 0192 - - {IV('ˣ'), 'x', 0}, // 02E3 - - {IV('΄'), '\'', 0}, // 0384 - {IV('΅'), '\'', 0}, // 0385 - {IV('Ά'), 'A', 0}, // 0386 - {IV('·'), '.', 0}, // 0387 - {IV('Έ'), 'E', 0}, // 0388 - {IV('Ή'), 'H', 0}, // 0389 - {IV('Ί'), 'I', 0}, // 038A - {IV('Ό'), 'O', 0}, // 038C - {IV('Ύ'), 'Y', 0}, // 038E - {IV('Ώ'), 'O', 0}, // 038F - {IV('ΐ'), 'i', 0}, // 0390 - {IV('Α'), 'A', 0}, // 0391 - {IV('Β'), 'B', 0}, // 0392 - {IV('Γ'), 'T', 0}, // 0393, Gamma - {IV('Δ'), '4', 0}, // 0394, Delta, ◿ - {IV('Ε'), 'E', 0}, // 0395 - {IV('Ζ'), 'Z', 0}, // 0396 - {IV('Η'), 'H', 0}, // 0397 - {IV('Θ'), '0', 0}, // 0398, Theta - {IV('Ι'), 'I', 0}, // 0399 - {IV('Κ'), 'K', 0}, // 039A - {IV('Λ'), '^', 0}, // 039B, Lambda - {IV('Μ'), 'M', 0}, // 039C - {IV('Ν'), 'N', 0}, // 039D - {IV('Ξ'), '3', 0}, // 039E, Xi - {IV('Ο'), 'O', 0}, // 039F - {IV('Π'), 'n', 0}, // 03A0, Pi - {IV('Ρ'), 'P', 0}, // 03A1 - {IV('Σ'), 'E', 0}, // 03A3, Sigma - {IV('Τ'), 'T', 0}, // 03A4 - {IV('Υ'), 'Y', 0}, // 03A5, Upsilon - {IV('Φ'), 'p', 0}, // 03A6, Phi - {IV('Χ'), 'X', 0}, // 03A7 - {IV('Ψ'), 'P', 0}, // 03A8, Psi - {IV('Ω'), 'O', 0}, // 03A9, Omega - {IV('Ϊ'), 'I', 0}, // 03AA - {IV('Ϋ'), 'Y', 0}, // 03AB - {IV('ά'), 'a', 0}, // 03AC - {IV('έ'), 'e', 0}, // 03AD - {IV('ή'), 'n', 0}, // 03AE - {IV('ί'), 'i', 0}, // 03AF - {IV('ΰ'), 'v', 0}, // 03B0 - {IV('α'), 'a', 0}, // 03B1, alpha - {IV('β'), 'B', 0}, // 03B2, beta - {IV('γ'), 'v', 0}, // 03B3, gamma - {IV('δ'), 'd', 0}, // 03B4, delta - {IV('ε'), 'e', 0}, // 03B5, epsilon - {IV('ζ'), 'Z', 0}, // 03B6, zeta - {IV('η'), 'n', 0}, // 03B7, eta - {IV('θ'), '0', 0}, // 03B8, theta - {IV('ι'), 'i', 0}, // 03B9, lota - {IV('κ'), 'k', 0}, // 03BA, kappa - {IV('λ'), 'L', 0}, // 03BB, lambda - {IV('μ'), 'u', 0}, // 03BC, mu - {IV('ν'), 'v', 0}, // 03BD, nu - {IV('ξ'), 'e', 0}, // 03BE, xi - {IV('ο'), 'o', 0}, // 03BF - {IV('π'), 'n', 0}, // 03C0, pi - {IV('ρ'), 'p', 0}, // 03C1, rho - {IV('ς'), 'c', 0}, // 03C2 - {IV('σ'), 'o', 0}, // 03C3, sigma - {IV('τ'), 't', 0}, // 03C4, tau - {IV('υ'), 'v', 0}, // 03C5, upsilon - {IV('φ'), 'p', 0}, // 03C6 - {IV('χ'), 'X', 0}, // 03C7, chi - {IV('ψ'), 'W', 0}, // 03C8, psi - {IV('ω'), 'w', 0}, // 03C9, omega - {IV('ϊ'), 'i', 0}, // 03CA - {IV('ϋ'), 'v', 0}, // 03CB - {IV('ό'), 'o', 0}, // 03CC - {IV('ύ'), 'v', 0}, // 03CD - {IV('ώ'), 'w', 0}, // 03CE - - // map CYRILLIC code to the plain ASCII - {IV('А'), 'A', 0}, // 0410 - {IV('Б'), 'b', 0}, // 0411 - {IV('В'), 'B', 0}, // 0412 - {IV('Г'), 'T', 0}, // 0413 - {IV('Д'), 'Q', 0}, // 0414 - {IV('Е'), 'E', 0}, // 0415 - {IV('Ж'), '*', 0}, // 0416 - {IV('З'), 'E', 0}, // 0417 - {IV('И'), 'N', 0}, // 0418 - {IV('Й'), 'N', 0}, // 0419 - {IV('К'), 'K', 0}, // 041A - {IV('Л'), 'T', 0}, // 041B - {IV('М'), 'M', 0}, // 041C - {IV('Н'), 'H', 0}, // 041D - {IV('О'), 'O', 0}, // 041E - {IV('П'), 'n', 0}, // 041F - {IV('Р'), 'P', 0}, // 0420 - {IV('С'), 'C', 0}, // 0421 - {IV('Т'), 'T', 0}, // 0422 - {IV('У'), 'Y', 0}, - {IV('Ф'), 'o', 0}, - {IV('Х'), 'X', 0}, - {IV('Ц'), 'U', 0}, - {IV('Ч'), 'y', 0}, - {IV('Ш'), 'W', 0}, - {IV('Щ'), 'W', 0}, - {IV('Ъ'), 'b', 0}, - {IV('Ы'), 'b', '|'}, - {IV('Ь'), 'b'}, - {IV('Э'), 'e'}, - {IV('Ю'), '|', 'O'}, - {IV('Я'), '9', '|'}, // 042F - - {IV('а'), 'a', 0}, // 0430 - {IV('б'), '6', 0}, // 0431 - {IV('в'), 'B', 0}, // 0432, - {IV('г'), 'r', 0}, // 0433 - {IV('д'), 'a', 0}, // 0434, - {IV('е'), 'e', 0}, // 0435 - {IV('ж'), '*', 0}, // 0436 - {IV('з'), 'e', 0}, // 0437, - {IV('и'), 'u', 0}, // 0438 - {IV('й'), 'u', 0}, // 0439, - {IV('к'), 'k', 0}, // 043A - {IV('л'), 'n', 0}, - {IV('м'), 'm', 0}, - {IV('н'), 'H', 0}, - {IV('о'), 'o', 0}, - {IV('п'), 'n', 0}, - {IV('р'), 'p', 0}, - {IV('с'), 'c', 0}, - {IV('т'), 't', 0}, - {IV('у'), 'y', 0}, - {IV('ф'), 'q', 'p'}, - {IV('х'), 'x', 0}, - {IV('ц'), 'u', 0}, - {IV('ч'), 'y', 0}, - {IV('ш'), 'w', 0}, - {IV('щ'), 'w', 0}, - {IV('ъ'), 'b', 0}, - {IV('ы'), 'b', '|'}, - {IV('ь'), 'b', 0}, - {IV('э'), 'e', 0}, - {IV('ю'), '|', 'o'}, - {IV('я'), 'g', 0}, // 044F - - #endif - - {IV('•'), '.', 0}, // 2022 · - {IV('℞'), 'P', 'x'}, // 211E ℞ Pt ASCII 158 - {IV('™'), 'T', 'M'}, // 2122 - {IV('←'), '<', '-'}, // 2190 - {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→⏵➟➠➡' LCD_STR_ARROW_RIGHT (0x03) - //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) - {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) - {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) - {IV('∼'), '~', 0}, // 223C - {IV('≈'), '~', '='}, // 2248 - {IV('≠'), '!', '='}, // 2260 - {IV('≡'), '=', 0}, // 2261 - {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾ - {IV('≥'), '>', '='}, // 2265 - {IV('⏱'), 0x07, 0}, // 23F1, Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) - - {IV('゠'), '=', 0}, // 30A0 - - // ⏰⏱⏲⏳◴◵◶◷ - // ⏻⏼♁♂ - //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07) - {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08) - {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: '📁📂' LCD_STR_FOLDER (0x02) - //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06) -}; - -/* return v1 - v2 */ -static int TFTGLCD_charmap_compare(TFTGLCD_charmap_t * v1, TFTGLCD_charmap_t * v2) { - return (v1->uchar < v2->uchar) ? -1 : (v1->uchar > v2->uchar) ? 1 : 0; -} - -static int pf_bsearch_cb_comp_hd4map_pgm(void *userdata, size_t idx, void * data_pin) { - TFTGLCD_charmap_t localval; - TFTGLCD_charmap_t *p_TFTGLCD_charmap = (TFTGLCD_charmap_t *)userdata; - memcpy_P(&localval, p_TFTGLCD_charmap + idx, sizeof(localval)); - return TFTGLCD_charmap_compare(&localval, (TFTGLCD_charmap_t *)data_pin); -} - -void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { lcd.setCursor(col, row); } - -void lcd_put_int(const int i) { - const char* str = i16tostr3left(i); - while (*str) lcd.write(*str++); -} - -// return < 0 on error -// return the advanced cols -int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { - - // find the HD44780 internal ROM first - int ret; - size_t idx = 0; - TFTGLCD_charmap_t pinval; - TFTGLCD_charmap_t *copy_address = nullptr; - pinval.uchar = c; - pinval.idx = -1; - - if (max_length < 1) return 0; - - if (c < 128) { - lcd.write((uint8_t)c); - return 1; - } - copy_address = nullptr; - ret = pf_bsearch_r((void *)g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); - if (ret >= 0) { - copy_address = (TFTGLCD_charmap_t *)(g_TFTGLCD_charmap_device + idx); - } - else { - ret = pf_bsearch_r((void *)g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); - if (ret >= 0) copy_address = (TFTGLCD_charmap_t *)(g_TFTGLCD_charmap_common + idx); - } - - if (ret >= 0) { - TFTGLCD_charmap_t localval; - // found - memcpy_P(&localval, copy_address, sizeof(localval)); - lcd.write(localval.idx); - if (max_length >= 2 && localval.idx2 > 0) { - lcd.write(localval.idx2); - return 2; - } - return 1; - } - - // Not found, print '?' instead - lcd.write((uint8_t)'?'); - return 1; -} - -/** - * @brief Draw a UTF-8 string - * - * @param utf8_str : the UTF-8 string - * @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM) - * @param max_length : the pixel length of the string allowed (or number of slots in HD44780) - * - * @return the number of pixels advanced - * - * Draw a UTF-8 string - */ -static int lcd_put_u8str_max_cb(const char * utf8_str, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) { - pixel_len_t ret = 0; - uint8_t *p = (uint8_t *)utf8_str; - while (ret < max_length) { - wchar_t ch = 0; - p = get_utf8_value_cb(p, cb_read_byte, &ch); - if (!ch) break; - ret += lcd_put_wchar_max(ch, max_length - ret); - } - return (int)ret; -} - -int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { - return lcd_put_u8str_max_cb(utf8_str, read_byte_ram, max_length); -} - -int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { - return lcd_put_u8str_max_cb(utf8_str_P, read_byte_rom, max_length); -} - -#if ENABLED(DEBUG_LCDPRINT) - - int test_TFTGLCD_charmap(TFTGLCD_charmap_t *data, size_t size, char *name, char flg_show_contents) { - int ret; - size_t idx = 0; - TFTGLCD_charmap_t preval = {0, 0, 0}; - TFTGLCD_charmap_t pinval = {0, 0, 0}; - char flg_error = 0; - - int i; - - TRACE("Test %s\n", name); - - for (i = 0; i < size; i ++) { - memcpy_P(&pinval, &(data[i]), sizeof(pinval)); - - if (flg_show_contents) { - #if 1 - TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR")); - #else - TRACE("[% 4d]", i); - TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar); - TRACE("0x%02X,", (unsigned int)(pinval.idx)); - TRACE("0x%02X,", (unsigned int)(pinval.idx2)); - TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR")); - #endif - } - if (preval.uchar >= pinval.uchar) { - flg_error = 1; - //TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); - //return -1; - } - memcpy(&preval, &pinval, sizeof(pinval)); - - ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); - if (ret < 0) { - flg_error = 1; - TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); - //return -1; - } - if (idx != i) { - flg_error = 1; - TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); - //return -1; - } - } - if (flg_error) { - TRACE("\nError: in array %s\n\n", name); - return -1; - } - TRACE("\nPASS array %s\n\n", name); - return 0; - } - - int test_TFTGLCD_charmap_all(void) { - int flg_error = 0; - if (test_TFTGLCD_charmap(g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), "g_TFTGLCD_charmap_device", 0) < 0) { - flg_error = 1; - test_TFTGLCD_charmap(g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), "g_TFTGLCD_charmap_device", 1); - } - if (test_TFTGLCD_charmap(g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), "g_TFTGLCD_charmap_common", 0) < 0) { - flg_error = 1; - test_TFTGLCD_charmap(g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), "g_TFTGLCD_charmap_common", 1); - } - if (flg_error) { - TRACE("\nFAILED in hd44780 tests!\n"); - return -1; - } - TRACE("\nPASS in hd44780 tests.\n"); - return 0; - } - -#endif // DEBUG_LCDPRINT - -#endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp deleted file mode 100644 index b5789091dc..0000000000 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp +++ /dev/null @@ -1,963 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if IS_TFTGLCD_PANEL - -/** - * ultralcd_TFTGLCD.cpp - * - * Implementation of the LCD display routines for a TFT GLCD displays with external controller. - * This display looks as a REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER but has good text font - * and supports color output. - */ - -#if NONE(__AVR__, TARGET_LPC1768, __STM32F1__, STM32F4xx) - #warning "Selected platform not yet tested. Please contribute your good pin mappings." -#endif - -#if ENABLED(TFTGLCD_PANEL_SPI) - #include -#else - #include -#endif - -#include "ultralcd_TFTGLCD.h" -#include "../ultralcd.h" -#include "../../libs/numtostr.h" - -#include "../../sd/cardreader.h" -#include "../../module/temperature.h" -#include "../../module/printcounter.h" -#include "../../module/planner.h" -#include "../../module/motion.h" - -#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - #include "../../feature/filwidth.h" - #include "../../gcode/parser.h" -#endif - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../../feature/bedlevel/bedlevel.h" -#endif - -TFTGLCD lcd; - -#define ICON_LOGO B00000001 -#define ICON_TEMP1 B00000010 //hotend 1 -#define ICON_TEMP2 B00000100 //hotend 2 -#define ICON_TEMP3 B00001000 //hotend 3 -#define ICON_BED B00010000 -#define ICON_FAN B00100000 -#define ICON_HOT B01000000 //when any T > 50deg -#define PIC_MASK 0x7F - -// LEDs not used, for compatibility with Smoothieware -#define LED_HOTEND_ON B00000001 -#define LED_BED_ON B00000010 -#define LED_FAN_ON B00000100 -#define LED_HOT B00001000 -#define LED_MASK 0x0F - -#define FBSIZE (LCD_WIDTH * LCD_HEIGHT + 2) -#define MIDDLE_Y ((LCD_HEIGHT - 1) / 2) - -// Markers for change line colors -#define COLOR_EDIT '#' -#define COLOR_ERROR '!' - -#ifdef CONVERT_TO_EXT_ASCII //use standart pseudographic symbols in ASCII table - #define LR 179 //vertical line - #define TRC 191 //top right corner - #define BLC 192 //bottom left corner - #define GL 196 //horizontal line - #define BRC 217 //bottom right corner, should be replaced to 12 for some languages - #define TLC 218 //top left corner, should be replaced to 13 for some languages -#else //next symbols must be present in panel font - #define LR 8 //equal to 179 - #define TRC 9 //equal to 191 - #define BLC 10 //equal to 192 - #define GL 11 //equal to 196 - #define BRC 12 //equal to 217 - #define TLC 13 //equal to 218 -#endif - -#define Marlin 0x01 - -enum Commands { // based on Smoothieware commands - GET_SPI_DATA = 0, - READ_BUTTONS, // read buttons - READ_ENCODER, // read encoder - LCD_WRITE, // write all screen to LCD - BUZZER, // beep buzzer - CONTRAST, // set contrast (brightnes) - // Other commands... 0xE0 thru 0xFF - GET_LCD_ROW = 0xE0, // for detect panel - GET_LCD_COL, // reserved for compatibility with Smoothieware, not used - LCD_PUT, // write one line to LCD - CLR_SCREEN, - INIT_SCREEN = 0xFE // clear panel buffer -}; - -static unsigned char framebuffer[FBSIZE]; -static unsigned char *fb; -static uint8_t cour_line; -static uint8_t picBits, ledBits, hotBits; -static uint8_t PanelDetected = 0; - -// Different platforms use different SPI methods -#if ANY(__AVR__, TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - #define SPI_SEND_ONE(V) SPI.transfer(V); - #define SPI_SEND_TWO(V) SPI.transfer16(V); -#elif defined(STM32F4xx) - #define SPI_SEND_ONE(V) SPI.transfer(V, SPI_CONTINUE); - #define SPI_SEND_TWO(V) SPI.transfer16(V, SPI_CONTINUE); -#elif defined(ARDUINO_ARCH_ESP32) - #define SPI_SEND_ONE(V) SPI.write(V); - #define SPI_SEND_TWO(V) SPI.write16(V); -#endif - -#if ANY(__AVR__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L); -#elif defined(STM32F4xx) - #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L, SPI_CONTINUE); -#elif ANY(TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_ESP32) - #define SPI_SEND_SOME(V,L,Z) do{ for (uint16_t i = 0; i < L; i++) SPI_SEND_ONE(V[(Z)+i]); }while(0) -#endif - -// Constructor -TFTGLCD::TFTGLCD() {} - -// Clear local buffer -void TFTGLCD::clear_buffer() { - memset(&framebuffer[0], ' ', FBSIZE - 2); - framebuffer[FBSIZE - 1] = framebuffer[FBSIZE - 2] = 0; - picBits = ledBits = 0; -} - -// Clear panel's screen -void TFTGLCD::clr_screen() { - if (!PanelDetected) return; - #if ENABLED(TFTGLCD_PANEL_SPI) - WRITE(TFTGLCD_CS, LOW); - SPI_SEND_ONE(CLR_SCREEN); - WRITE(TFTGLCD_CS, HIGH); - #else - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address - Wire.write(CLR_SCREEN); - Wire.endTransmission(); //transmit data - #endif -} - -// Set new text cursor position -void TFTGLCD::setCursor(uint8_t col, uint8_t row) { - fb = &framebuffer[0] + col + row * LCD_WIDTH; - cour_line = row; -} - -// Send char to buffer -void TFTGLCD::write(char c) { - *fb++ = c; -} - -// Send text line to buffer -void TFTGLCD::print(const char *line) { - while (*line) *fb++ = *line++; -} - -// For menu -void TFTGLCD::print_line() { - if (!PanelDetected) return; - #if ENABLED(TFTGLCD_PANEL_SPI) - WRITE(TFTGLCD_CS, LOW); - SPI_SEND_ONE(LCD_PUT); - SPI_SEND_ONE(cour_line); - SPI_SEND_SOME(framebuffer, LCD_WIDTH, cour_line * LCD_WIDTH); - WRITE(TFTGLCD_CS, HIGH); - #else - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address - Wire.write(LCD_PUT); - Wire.write(cour_line); - Wire.write(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); //transfer 1 line to txBuffer - Wire.endTransmission(); //transmit data - safe_delay(1); - #endif -} - -void TFTGLCD::print_screen(){ - if (!PanelDetected) return; - framebuffer[FBSIZE - 2] = picBits & PIC_MASK; - framebuffer[FBSIZE - 1] = ledBits; - #if ENABLED(TFTGLCD_PANEL_SPI) - // Send all framebuffer to panel - WRITE(TFTGLCD_CS, LOW); - SPI_SEND_ONE(LCD_WRITE); - SPI_SEND_SOME(framebuffer, FBSIZE, 0); - WRITE(TFTGLCD_CS, HIGH); - #else - uint8_t r; - // Send framebuffer to panel by line - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); - // First line - Wire.write(LCD_WRITE); - Wire.write(&framebuffer[0], LCD_WIDTH); - Wire.endTransmission(); - for (r = 1; r < (LCD_HEIGHT - 1); r++) { - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); - Wire.write(&framebuffer[r * LCD_WIDTH], LCD_WIDTH); - Wire.endTransmission(); - } - // Last line - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); - Wire.write(&framebuffer[r * LCD_WIDTH], LCD_WIDTH); - Wire.write(&framebuffer[FBSIZE - 2], 2); - Wire.endTransmission(); - #endif -} - -void TFTGLCD::setContrast(uint16_t contrast) { - if (!PanelDetected) return; - #if ENABLED(TFTGLCD_PANEL_SPI) - WRITE(TFTGLCD_CS, LOW); - SPI_SEND_ONE(CONTRAST); - SPI_SEND_ONE((uint8_t)contrast); - WRITE(TFTGLCD_CS, HIGH); - #else - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); - Wire.write(CONTRAST); - Wire.write((uint8_t)contrast); - Wire.endTransmission(); - #endif -} - -extern volatile int8_t encoderDiff; - -// Read buttons and encoder states -uint8_t MarlinUI::read_slow_buttons(void) { - if (!PanelDetected) return 0; - #if ENABLED(TFTGLCD_PANEL_SPI) - uint8_t b = 0; - WRITE(TFTGLCD_CS, LOW); - SPI_SEND_ONE(READ_ENCODER); - #ifndef STM32F4xx - WRITE(TFTGLCD_CS, LOW); // for delay - #endif - encoderDiff += SPI_SEND_ONE(READ_BUTTONS); - #ifndef STM32F4xx - WRITE(TFTGLCD_CS, LOW); // for delay - WRITE(TFTGLCD_CS, LOW); - #endif - b = SPI_SEND_ONE(GET_SPI_DATA); - WRITE(TFTGLCD_CS, HIGH); - return b; - #else - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); - Wire.write(READ_ENCODER); - Wire.endTransmission(); - #ifdef __AVR__ - Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 2, 0, 0, 1); - #elif defined(__STM32F1__) - Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, (uint8_t)2); - #elif EITHER(STM32F4xx, TARGET_LPC1768) - Wire.requestFrom(LCD_I2C_ADDRESS, 2); - #endif - encoderDiff += Wire.read(); - return Wire.read(); //buttons - #endif -} - -// Duration in ms, freq in Hz -void MarlinUI::buzz(const long duration, const uint16_t freq) { - if (!PanelDetected) return; - #if ENABLED(TFTGLCD_PANEL_SPI) - WRITE(TFTGLCD_CS, LOW); - SPI_SEND_ONE(BUZZER); - SPI_SEND_TWO((uint16_t)duration); - SPI_SEND_TWO(freq); - WRITE(TFTGLCD_CS, HIGH); - #else - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); - Wire.write(BUZZER); - Wire.write((uint8_t)(duration >> 8)); - Wire.write((uint8_t)duration); - Wire.write((uint8_t)(freq >> 8)); - Wire.write((uint8_t)freq); - Wire.endTransmission(); - #endif -} - -void MarlinUI::init_lcd() { - uint8_t t; - lcd.clear_buffer(); - t = 0; - #if ENABLED(TFTGLCD_PANEL_SPI) - // SPI speed must be less 10MHz - _SET_OUTPUT(TFTGLCD_CS); - WRITE(TFTGLCD_CS, HIGH); - spiInit(TERN(__STM32F1__, SPI_QUARTER_SPEED, SPI_FULL_SPEED)); - WRITE(TFTGLCD_CS, LOW); - SPI_SEND_ONE(GET_LCD_ROW); - t = SPI_SEND_ONE(GET_SPI_DATA); - #else - #ifdef TARGET_LPC1768 - Wire.begin(); //init twi/I2C - #else - Wire.begin((uint8_t)LCD_I2C_ADDRESS); //init twi/I2C - #endif - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); - Wire.write((uint8_t)GET_LCD_ROW); // put command to buffer - Wire.endTransmission(); // send buffer - #ifdef __AVR__ - Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 1, 0, 0, 1); - #elif ANY(__STM32F1__, STM32F4xx, TARGET_LPC1768) - Wire.requestFrom(LCD_I2C_ADDRESS, 1); - #endif - t = (uint8_t)Wire.read(); - #endif - - if (t == LCD_HEIGHT) { - PanelDetected = 1; - #if ENABLED(TFTGLCD_PANEL_SPI) - SPI_SEND_ONE(INIT_SCREEN); - SPI_SEND_ONE(Marlin); - WRITE(TFTGLCD_CS, HIGH); - #else - Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); - Wire.write((uint8_t)INIT_SCREEN); - Wire.write(Marlin); - Wire.endTransmission(); - #endif - } - else - PanelDetected = 0; - safe_delay(100); -} - -bool MarlinUI::detected() { - return PanelDetected; -} - -void MarlinUI::clear_lcd() { - if (!PanelDetected) return; - lcd.clr_screen(); - lcd.clear_buffer(); -} - -int16_t MarlinUI::contrast; // Initialized by settings.load() - -void MarlinUI::set_contrast(const int16_t value) { - contrast = constrain(value, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX); - lcd.setContrast(contrast); -} - -static void center_text_P(PGM_P pstart, uint8_t y) { - uint8_t len = utf8_strlen_P(pstart); - if (len < LCD_WIDTH) - lcd.setCursor((LCD_WIDTH - len) / 2, y); - else - lcd.setCursor(0, y); - lcd_put_u8str_P(pstart); -} - -#if ENABLED(SHOW_BOOTSCREEN) - - void MarlinUI::show_bootscreen() { - if (!PanelDetected) return; - // - // Show the Marlin logo, splash line1, and splash line 2 - // - uint8_t indent = (LCD_WIDTH - 8) / 2; - // symbols 217 (bottom right corner) and 218 (top left corner) are using for letters in some languages - // and they should be moved to begining ASCII table as spetial symbols - lcd.setCursor(indent, 0); lcd.write(TLC); lcd_put_u8str_P(PSTR("------")); lcd.write(TRC); - lcd.setCursor(indent, 1); lcd.write(LR); lcd_put_u8str_P(PSTR("Marlin")); lcd.write(LR); - lcd.setCursor(indent, 2); lcd.write(BLC); lcd_put_u8str_P(PSTR("------")); lcd.write(BRC); - center_text_P(PSTR(SHORT_BUILD_VERSION), 3); - center_text_P(PSTR(MARLIN_WEBSITE_URL), 4); - picBits = ICON_LOGO; - lcd.print_screen(); - safe_delay(1500); - } - -#endif // SHOW_BOOTSCREEN - -void MarlinUI::draw_kill_screen() { - if (!PanelDetected) return; - lcd.clear_buffer(); - lcd.setCursor(0, 3); lcd.write(COLOR_ERROR); - lcd.setCursor((LCD_WIDTH - utf8_strlen(status_message)) / 2 + 1, 3); - lcd_put_u8str(status_message); - center_text_P(GET_TEXT(MSG_HALTED), 5); - center_text_P(GET_TEXT(MSG_PLEASE_RESET), 6); - lcd.print_screen(); -} - -// -// Before homing, blink '123' <-> '???'. -// Homed but unknown... '123' <-> ' '. -// Homed and known, display constantly. -// -FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { - lcd.write('X' + uint8_t(axis)); - if (blink) - lcd.print(value); - else { - if (!TEST(axis_homed, axis)) - while (const char c = *value++) lcd.write(c <= '.' ? c : '?'); - else { - #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) - if (!TEST(axis_known_position, axis)) - lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); - else - #endif - lcd_put_u8str(value); - } - } -} - -FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *prefix, const bool blink) { - uint8_t pic_hot_bits; - #if HAS_HEATED_BED - const bool isBed = heater_id < 0; - const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)); - const float t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); - #else - const float t1 = thermalManager.degHotend(heater_id); - const float t2 = thermalManager.degTargetHotend(heater_id); - #endif - - #if HOTENDS < 2 - if (heater_id == H_E0) { - lcd.setCursor(2, 5); lcd.print(prefix); //HE - lcd.setCursor(1, 6); lcd.print(i16tostr3rj(t1 + 0.5)); - lcd.setCursor(1, 7); - } - else { - lcd.setCursor(6, 5); lcd.print(prefix); //BED - lcd.setCursor(6, 6); lcd.print(i16tostr3rj(t1 + 0.5)); - lcd.setCursor(6, 7); - } - #else - if (heater_id > H_BED) { - lcd.setCursor(heater_id * 4, 5); lcd.print(prefix); //HE1 or HE2 or HE3 - lcd.setCursor(heater_id * 4, 6); lcd.print(i16tostr3rj(t1 + 0.5)); - lcd.setCursor(heater_id * 4, 7); - } - else { - lcd.setCursor(13, 5); lcd.print(prefix); //BED - lcd.setCursor(13, 6); lcd.print(i16tostr3rj(t1 + 0.5)); - lcd.setCursor(13, 7); - } - #endif // HOTENDS <= 1 - - #if !HEATER_IDLE_HANDLER - UNUSED(blink); - #else - if (!blink && thermalManager.heater_idle[thermalManager.idle_index_for_id(heater_id)].timed_out) { - lcd.write(' '); - if (t2 >= 10) lcd.write(' '); - if (t2 >= 100) lcd.write(' '); - } - else - #endif // !HEATER_IDLE_HANDLER - lcd.print(i16tostr3rj(t2 + 0.5)); - - switch (heater_id) { - case H_BED: pic_hot_bits = ICON_BED; break; - case H_E0: pic_hot_bits = ICON_TEMP1; break; - case H_E1: pic_hot_bits = ICON_TEMP2; break; - case H_E2: pic_hot_bits = ICON_TEMP3; - default: break; - } - - if (t2) picBits |= pic_hot_bits; - else picBits &= ~pic_hot_bits; - - if (t1 > 50) hotBits |= pic_hot_bits; - else hotBits &= ~pic_hot_bits; - - if (hotBits) picBits |= ICON_HOT; - else picBits &= ~ICON_HOT; -} - -#if HAS_PRINT_PROGRESS - - FORCE_INLINE void _draw_print_progress() { - if (!PanelDetected) return; - const uint8_t progress = ui._get_progress(); - #if ENABLED(SDSUPPORT) - lcd_put_u8str_P(PSTR("SD")); - #elif ENABLED(LCD_SET_PROGRESS_MANUALLY) - lcd_put_u8str_P(PSTR("P:")); - #endif - if (progress) - lcd.print(ui8tostr3rj(progress)); - else - lcd_put_u8str_P(PSTR("---")); - lcd.write('%'); - } - -#endif // HAS_PRINT_PROGRESS - -#if ENABLED(LCD_PROGRESS_BAR) - - void MarlinUI::draw_progress_bar(const uint8_t percent) { - if (!PanelDetected) return; - if (fb == &framebuffer[0] + LCD_WIDTH * 2) { // For status screen - lcd.write('%'); lcd.write(percent); - } - else { // For progress bar test - lcd.setCursor(LCD_WIDTH / 2 - 2, MIDDLE_Y); - lcd.print(i16tostr3rj(percent)); lcd.write('%'); - lcd.print_line(); - lcd.setCursor(0, MIDDLE_Y + 1); - lcd.write('%'); lcd.write(percent); - lcd.print_line(); - } - } - -#endif - -void MarlinUI::draw_status_message(const bool blink) { - if (!PanelDetected) return; - lcd.setCursor(0, 3); - #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - - // Alternate Status message and Filament display - if (ELAPSED(millis(), next_filament_display)) { - lcd_put_u8str_P(PSTR("Dia ")); - lcd.print(ftostr12ns(filament_width_meas)); - lcd_put_u8str_P(PSTR(" V")); - lcd.print(i16tostr3rj(100.0 * ( - parser.volumetric_enabled - ? planner.volumetric_area_nominal / planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] - : planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] - ) - )); - lcd.write('%'); - return; - } - - #endif // FILAMENT_LCD_DISPLAY && SDSUPPORT - - // Get the UTF8 character count of the string - uint8_t slen = utf8_strlen(status_message); - - #if ENABLED(STATUS_MESSAGE_SCROLLING) - - static bool last_blink = false; - - // If the string fits into the LCD, just print it and do not scroll it - if (slen <= LCD_WIDTH) { - - // The string isn't scrolling and may not fill the screen - lcd_put_u8str(status_message); - - // Fill the rest with spaces - while (slen < LCD_WIDTH) { lcd.write(' '); ++slen; } - } - else { - // String is larger than the available space in screen. - - // Get a pointer to the next valid UTF8 character - // and the string remaining length - uint8_t rlen; - const char *stat = status_and_len(rlen); - lcd_put_u8str_max(stat, LCD_WIDTH); // The string leaves space - - // If the remaining string doesn't completely fill the screen - if (rlen < LCD_WIDTH) { - lcd.write('.'); // Always at 1+ spaces left, draw a dot - uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters - if (--chars) { // Draw a second dot if there's space - lcd.write('.'); - if (--chars) - lcd_put_u8str_max(status_message, chars); // Print a second copy of the message - } - } - if (last_blink != blink) { - last_blink = blink; - advance_status_scroll(); - } - } - - #else - - UNUSED(blink); - - // Just print the string to the LCD - lcd_put_u8str_max(status_message, LCD_WIDTH); - - // Fill the rest with spaces if there are missing spaces - while (slen < LCD_WIDTH) { - lcd.write(' '); - ++slen; - } - - #endif -} - -/** -Possible status screens: - -Equal to 20x10 text LCD - -|X 000 Y 000 Z 000.00| -|FR100% SD100% C--:--| -| Progress bar line | -|Status message | -| | -| HE BED FAN | -| ttc ttc % | ttc - current temperature -| tts tts %%% | tts - setted temperature, %%% - percent for FAN -| ICO ICO ICO ICO | ICO - icon 48x48, placed in 2 text lines -| ICO ICO ICO ICO | ICO / - -or - -|X 000 Y 000 Z 000.00| -|FR100% SD100% C--:--| -| Progress bar line | -|Status message | -| | -|HE1 HE2 HE3 BED ICO| -|ttc ttc ttc ttc ICO| -|tts tts tts tts %%%| -|ICO ICO ICO ICO ICO| -|ICO ICO ICO ICO ICO| - -or - -Equal to 24x10 text LCD - -|X 000 Y 000 Z 000.00 | -|FR100% SD100% C--:--| -| Progress bar line | -|Status message | -| | -|HE1 HE2 HE3 BED FAN | -|ttc ttc ttc ttc % | -|tts tts tts tts %%% | -|ICO ICO ICO ICO ICO ICO| -|ICO ICO ICO ICO ICO ICO| -*/ - -void MarlinUI::draw_status_screen() { - if (!PanelDetected) return; - - const bool blink = get_blink(); - - lcd.clear_buffer(); - - // - // Line 1 - XYZ coordinates - // - - lcd.setCursor(0, 0); - _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' '); - _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' '); - _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink); - - #if HAS_LEVELING && !HAS_HEATED_BED - lcd.write(planner.leveling_active || blink ? '_' : ' '); - #endif - - // - // Line 2 - feedrate, , time - // - - lcd.setCursor(0, 1); - lcd_put_u8str_P(PSTR("FR")); lcd.print(i16tostr3rj(feedrate_percentage)); lcd.write('%'); - - #if BOTH(SDSUPPORT, HAS_PRINT_PROGRESS) - lcd.setCursor(LCD_WIDTH / 2 - 3, 1); - _draw_print_progress(); - #endif - - char buffer[10]; - duration_t elapsed = print_job_timer.duration(); - uint8_t len = elapsed.toDigital(buffer); - - lcd.setCursor((LCD_WIDTH - 1) - len, 1); - lcd.write(0x07); lcd.print(buffer); // LCD_CLOCK_CHAR - - // - // Line 3 - progressbar - // - - lcd.setCursor(0, 2); - #if ENABLED(LCD_PROGRESS_BAR) - draw_progress_bar(_get_progress()); - #else - lcd.write('%'); lcd.write(0); - #endif - - // - // Line 4 - Status Message (which may be a Filament display) - // - - draw_status_message(blink); - - // - // Line 5 - // - - #if HOTENDS <= 1 || (HOTENDS <= 2 && !HAS_HEATED_BED) - #if DUAL_MIXING_EXTRUDER - lcd.setCursor(0, 4); - // Two-component mix / gradient instead of XY - char mixer_messages[12]; - const char *mix_label; - #if ENABLED(GRADIENT_MIX) - if (mixer.gradient.enabled) { - mixer.update_mix_from_gradient(); - mix_label = "Gr"; - } - else - #endif - { - mixer.update_mix_from_vtool(); - mix_label = "Mx"; - } - sprintf_P(mixer_messages, PSTR("%s %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); - lcd_put_u8str(mixer_messages); - #endif - #endif - - // - // Line 6..8 Temperatures, FAN - // - - #if HOTENDS < 2 - _draw_heater_status(H_E0, "HE", blink); // Hotend Temperature - #else - _draw_heater_status(H_E0, "HE1", blink); // Hotend 1 Temperature - _draw_heater_status(H_E1, "HE2", blink); // Hotend 2 Temperature - #if HOTENDS > 2 - _draw_heater_status(H_E2, "HE3", blink); // Hotend 3 Temperature - #endif - #endif // HOTENDS <= 1 - - #if HAS_HEATED_BED - #if HAS_LEVELING - _draw_heater_status(H_BED, (planner.leveling_active && blink ? "___" : "BED"), blink); - #else - _draw_heater_status(H_BED, "BED", blink); - #endif - #endif // HAS_HEATED_BED - - #if FAN_COUNT > 0 - uint16_t spd = thermalManager.fan_speed[0]; - - #if ENABLED(ADAPTIVE_FAN_SLOWING) - if (!blink) spd = thermalManager.scaledFanSpeed(0, spd); - #endif - - uint16_t per = thermalManager.fanPercent(spd); - #if HOTENDS < 2 - #define FANX 11 - #else - #define FANX 17 - #endif - lcd.setCursor(FANX, 5); lcd_put_u8str_P(PSTR("FAN")); - lcd.setCursor(FANX + 1, 6); lcd.write('%'); - lcd.setCursor(FANX, 7); - lcd.print(i16tostr3rj(per)); - - if (TERN0(HAS_FAN0, thermalManager.fan_speed[0]) || TERN0(HAS_FAN1, thermalManager.fan_speed[1]) || TERN0(HAS_FAN2, thermalManager.fan_speed[2])) - picBits |= ICON_FAN; - else - picBits &= ~ICON_FAN; - - #endif // FAN_COUNT > 0 - - // - // Line 9, 10 - icons - // - lcd.print_screen(); -} - -#if HAS_LCD_MENU - - #include "../menu/menu.h" - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - - void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { - if (!PanelDetected) return; - lcd.setCursor((LCD_WIDTH - 14) / 2, row + 1); - lcd.write(0x02); lcd_put_u8str_P(" E"); lcd.write('1' + extruder); lcd.write(' '); - lcd.print(i16tostr3rj(thermalManager.degHotend(extruder))); lcd.write(0x01); lcd.write('/'); - lcd.print(i16tostr3rj(thermalManager.degTargetHotend(extruder))); lcd.write(0x01); - lcd.print_line(); - } - - #endif // ADVANCED_PAUSE_FEATURE - - // Draw a static item with no left-right margin required. Centered by default. - void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) { - if (!PanelDetected) return; - uint8_t n = LCD_WIDTH; - lcd.setCursor(0, row); - if ((style & SS_CENTER) && !valstr) { - int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; - while (--pad >= 0) { lcd.write(' '); n--; } - } - n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n); - if (valstr) n -= lcd_put_u8str_max(valstr, n); - for (; n; --n) lcd.write(' '); - lcd.print_line(); - } - - // Draw a generic menu item with pre_char (if selected) and post_char - void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { - if (!PanelDetected) return; - lcd.setCursor(0, row); - lcd.write(sel ? pre_char : ' '); - uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2); - for (; n; --n) lcd.write(' '); - lcd.write(post_char); - lcd.print_line(); - } - - // Draw a menu item with a (potentially) editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { - if (!PanelDetected) return; - const uint8_t vlen = data ? (pgm ? utf8_strlen_P(data) : utf8_strlen(data)) : 0; - lcd.setCursor(0, row); - lcd.write(sel ? LCD_STR_ARROW_RIGHT[0] : ' '); - uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vlen); - if (vlen) { - lcd.write(':'); - for (; n; --n) lcd.write(' '); - if (pgm) lcd_put_u8str_P(data); else lcd_put_u8str(data); - } - lcd.print_line(); - } - - // Low-level draw_edit_screen can be used to draw an edit screen from anyplace - // This line moves to the last line of the screen for UBL plot screen on the panel side - void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { - if (!PanelDetected) return; - ui.encoder_direction_normal(); - lcd.setCursor(0, MIDDLE_Y); - lcd.write(COLOR_EDIT); - lcd_put_u8str_P(pstr); - if (value != nullptr) { - lcd.write(':'); - lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), MIDDLE_Y); // Right-justified, padded by spaces - lcd.write(' '); // Overwrite char if value gets shorter - lcd.print(value); - lcd.write(' '); - lcd.print_line(); - } - } - - // The Select Screen presents a prompt and two "buttons" - void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) { - if (!PanelDetected) return; - ui.draw_select_screen_prompt(pref, string, suff); - lcd.setCursor(0, MIDDLE_Y); - lcd.write(COLOR_EDIT); - lcd.write(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd.write(yesno ? ' ' : ']'); - lcd.setCursor(LCD_WIDTH - utf8_strlen_P(yes) - 3, MIDDLE_Y); - lcd.write(yesno ? '[' : ' '); lcd_put_u8str_P(yes); lcd.write(yesno ? ']' : ' '); - lcd.print_line(); - } - - #if ENABLED(SDSUPPORT) - - void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { - if (!PanelDetected) return; - lcd.setCursor(0, row); - lcd.write(sel ? LCD_STR_ARROW_RIGHT[0] : ' '); - constexpr uint8_t maxlen = LCD_WIDTH - 2; - uint8_t n = maxlen - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), maxlen); - for (; n; --n) lcd.write(' '); - lcd.write(isDir ? LCD_STR_FOLDER[0] : ' '); - lcd.print_line(); - } - - #endif // SDSUPPORT - - #if ENABLED(LCD_HAS_STATUS_INDICATORS) - - void MarlinUI::update_indicators() {} - - #endif // LCD_HAS_STATUS_INDICATORS - - #if ENABLED(AUTO_BED_LEVELING_UBL) - /** - * Map screen: - * |/---------\ (00,00) | - * || . . . . | X:000.00| - * || . . . . | Y:000.00| - * || . . . . | Z:00.000| - * || . . . . | | - * || . . . . | | - * || . . . . | | - * |+---------/ | - * | | - * |____________________| - */ - void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { - if (!PanelDetected) return; - - #define _LCD_W_POS 12 - - lcd.clear_buffer(); - - //print only top left corner. All frame with grid points will be printed by panel - lcd.setCursor(0, 0); - *fb++ = TLC; //top left corner - marker for plot parameters - *fb = (GRID_MAX_POINTS_X << 4) + GRID_MAX_POINTS_Y; //set mesh size - - // Print plot position - lcd.setCursor(_LCD_W_POS, 0); - *fb++ = '('; lcd.print(i16tostr3left(x_plot)); - *fb++ = ','; lcd.print(i16tostr3left(y_plot)); *fb = ')'; - - // Show all values - lcd.setCursor(_LCD_W_POS, 1); lcd_put_u8str_P(PSTR("X:")); - lcd.print(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot])))); - lcd.setCursor(_LCD_W_POS, 2); lcd_put_u8str_P(PSTR("Y:")); - lcd.print(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot])))); - - // Show the location value - lcd.setCursor(_LCD_W_POS, 3); lcd_put_u8str_P(PSTR("Z:")); - - if (!isnan(ubl.z_values[x_plot][y_plot])) - lcd.print(ftostr43sign(ubl.z_values[x_plot][y_plot])); - else - lcd_put_u8str_P(PSTR(" -----")); - - center_text_P(GET_TEXT(MSG_UBL_FINE_TUNE_MESH), 8); - - lcd.print_screen(); - } - - #endif // AUTO_BED_LEVELING_UBL - -#endif // HAS_LCD_MENU - -#endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h deleted file mode 100644 index eedcc4afa0..0000000000 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Implementation of the LCD display routines for a TFT GLCD displays with external controller. - */ - -#include "../../inc/MarlinConfig.h" - -#if IS_TFTGLCD_PANEL - -#include "../../libs/duration_t.h" - -//////////////////////////////////// -// Set up button and encode mappings for each panel (into 'buttons' variable) -// -// This is just to map common functions (across different panels) onto the same -// macro name. The mapping is independent of whether the button is directly connected or -// via a shift/i2c register. - -//////////////////////////////////// -// Create LCD class instance and chipset-specific information -class TFTGLCD { - private: - public: - TFTGLCD(); - void clear_buffer(); - void clr_screen(); - void setCursor(uint8_t col, uint8_t row); - void write(char c); - void print(const char *line); - void print_line(); - void print_screen(); - void redraw_screen(); - void setContrast(uint16_t contrast); -}; - -extern TFTGLCD lcd; - -#include "../fontutils.h" -#include "../lcdprint.h" - -// Use panel encoder - free old encoder pins -#undef BTN_EN1 -#undef BTN_EN2 -#undef BTN_ENC -#define BTN_EN1 -1 -#define BTN_EN2 -1 -#define BTN_ENC -1 - -#ifndef EN_C - #define EN_C 4 //for click -#endif - -#endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h index 1511c69933..4b860a1f6e 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,94 +16,66 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include "../../inc/MarlinConfig.h" // use this file to create the public interface for device drivers that are NOT in the U8G library extern u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_sw_spi; extern u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi; - -class U8GLIB_64128N_2X_HAL : public U8GLIB { -public: - U8GLIB_64128N_2X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) - { } - U8GLIB_64128N_2X_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) - { } +class U8GLIB_64128N_2X_HAL : public U8GLIB +{ + public: + U8GLIB_64128N_2X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) + { } + U8GLIB_64128N_2X_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) + { } }; + extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi; extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi; - -class U8GLIB_ST7920_128X64_4X_HAL : public U8GLIB { -public: - U8GLIB_ST7920_128X64_4X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE - { } - U8GLIB_ST7920_128X64_4X_HAL(pin_t cs, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_hw_spi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE - { } +class U8GLIB_ST7920_128X64_4X_HAL : public U8GLIB +{ + public: + U8GLIB_ST7920_128X64_4X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE + { } + U8GLIB_ST7920_128X64_4X_HAL(pin_t cs, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_hw_spi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE + { } }; -// -// AVR version uses ultralcd_st7920_u8glib_rrd_AVR.cpp -// HAL version uses u8g_dev_st7920_128x64_HAL.cpp -// + +// AVR version uses ultralcd_st7920_u8glib_rrd_AVR.cpp, HAL version uses u8g_dev_st7920_128x64_HAL.cpp extern u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi; - -class U8GLIB_ST7920_128X64_RRD : public U8GLIB { -public: - U8GLIB_ST7920_128X64_RRD(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_st7920_128x64_rrd_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE - { } +class U8GLIB_ST7920_128X64_RRD : public U8GLIB +{ + public: + U8GLIB_ST7920_128X64_RRD(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7920_128x64_rrd_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE + { } }; + extern u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire; - class U8GLIB_SH1106_128X64_2X_I2C_2_WIRE : public U8GLIB { -public: - U8GLIB_SH1106_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) - : U8GLIB(&u8g_dev_sh1106_128x64_2x_i2c_2_wire, options) - { } + public: + U8GLIB_SH1106_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) + : U8GLIB(&u8g_dev_sh1106_128x64_2x_i2c_2_wire, options) + { } }; + + extern u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire; - class U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE : public U8GLIB { -public: - U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) - : U8GLIB(&u8g_dev_ssd1306_128x64_2x_i2c_2_wire, options) - { } -}; - -// -// Very basic support for 320x240 TFT screen -// Tested on MKS Robin TFT_V2.0 with ST7789V controller -// -extern u8g_dev_t u8g_dev_tft_320x240_upscale_from_128x64; - -class U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 : public U8GLIB { -public: - U8GLIB_TFT_320X240_UPSCALE_FROM_128X64(uint8_t cs, uint8_t rs, uint8_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_tft_320x240_upscale_from_128x64, cs, rs, reset) - { } -}; - - -extern u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, u8g_dev_uc1701_mini12864_HAL_2x_hw_spi; - -class U8GLIB_MINI12864_2X_HAL : public U8GLIB { -public: - U8GLIB_MINI12864_2X_HAL(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, sck, mosi, cs, a0, reset) - { } - U8GLIB_MINI12864_2X_HAL(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) - : U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset) - { } + public: + U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) + : U8GLIB(&u8g_dev_ssd1306_128x64_2x_i2c_2_wire, options) + { } }; diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h index da7d4f6f1e..1f3c280421 100644 --- a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,105 +16,59 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -// Use this file to select the com driver for device drivers that are NOT in the U8G library +// use this file to select the com driver for device drivers that are NOT in the U8G library -#include -#ifndef U8G_HAL_LINKS // Defined by LPC1768/9 environments in platform.ini +#ifndef U8G_HAL_LINKS + + uint8_t u8g_com_arduino_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_arduino_sw_spi_fn #ifdef __SAM3X8E__ - - uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_DUE_shared_hw_spi_fn + uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_DUE_sw_spi_fn - #define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_DUE_shared_hw_spi_fn #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_HAL_DUE_ST7920_sw_spi_fn + #else + uint8_t u8g_com_arduino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_HW_SPI_FN u8g_com_arduino_hw_spi_fn - #elif defined(__SAMD51__) - - #define U8G_COM_HAL_HW_SPI_FN u8g_com_samd51_hw_spi_fn - #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_samd51_st7920_hw_spi_fn - - #elif defined(__STM32F1__) - - uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - uint8_t u8g_com_stm32duino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_STM32F1_sw_spi_fn - #define U8G_COM_HAL_HW_SPI_FN u8g_com_stm32duino_hw_spi_fn - #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_std_sw_spi_fn - #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_stm32duino_hw_spi_fn - - #elif defined(ARDUINO_ARCH_STM32) - - uint8_t u8g_com_stm32duino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_HW_SPI_FN u8g_com_stm32duino_hw_spi_fn - - #elif defined(__AVR__) - - uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_AVR_sw_sp_fn - - #endif - - #ifndef U8G_COM_HAL_SW_SPI_FN - #define U8G_COM_HAL_SW_SPI_FN u8g_com_arduino_std_sw_spi_fn - #endif - #ifndef U8G_COM_HAL_HW_SPI_FN - #define U8G_COM_HAL_HW_SPI_FN u8g_com_arduino_hw_spi_fn - #endif - #ifndef U8G_COM_ST7920_HAL_SW_SPI + uint8_t u8g_com_arduino_st7920_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_arduino_st7920_spi_fn #endif - #ifndef U8G_COM_ST7920_HAL_HW_SPI - #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_arduino_st7920_hw_spi_fn - #endif - // This can't be invoked from the current platformio.ini - #ifdef TARGET_LPC1768 - uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #endif + uint8_t u8g_com_arduino_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_arduino_st7920_hw_spi_fn - #define U8G_COM_SSD_I2C_HAL u8g_com_arduino_ssd_i2c_fn - -#elif defined(TARGET_LPC1768) - - uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_LPC1768_sw_spi_fn - #define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_LPC1768_hw_spi_fn - #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_HAL_LPC1768_ST7920_sw_spi_fn - #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_HAL_LPC1768_ST7920_hw_spi_fn - #define U8G_COM_SSD_I2C_HAL u8g_com_HAL_LPC1768_ssd_hw_i2c_fn + #define U8G_COM_SSD_I2C_HAL u8g_com_arduino_ssd_i2c_fn -#endif +#elif TARGET_LPC1768 + uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_LPC1768_sw_spi_fn -#ifndef U8G_COM_HAL_SW_SPI_FN - #define U8G_COM_HAL_SW_SPI_FN u8g_com_null_fn -#endif -#ifndef U8G_COM_HAL_HW_SPI_FN - #define U8G_COM_HAL_HW_SPI_FN u8g_com_null_fn -#endif -#ifndef U8G_COM_ST7920_HAL_SW_SPI + uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_LPC1768_hw_spi_fn + + uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_HAL_LPC1768_ST7920_sw_spi_fn + + uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_HAL_LPC1768_ST7920_hw_spi_fn + + uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_SSD_I2C_HAL u8g_com_HAL_LPC1768_ssd_hw_i2c_fn + +#else // need to give them some definition or else get compiler errors + uint8_t u8g_com_null_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_null_fn + #define U8G_COM_HAL_HW_SPI_FN u8g_com_null_fn #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_null_fn -#endif -#ifndef U8G_COM_ST7920_HAL_HW_SPI #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_null_fn -#endif -#ifndef U8G_COM_SSD_I2C_HAL - #define U8G_COM_SSD_I2C_HAL u8g_com_null_fn -#endif -#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) - uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); - #define U8G_COM_HAL_TFT_FN u8g_com_hal_tft_fn -#else - #define U8G_COM_HAL_TFT_FN u8g_com_null_fn -#endif + #define U8G_COM_SSD_I2C_HAL u8g_com_null_fn +#endif \ No newline at end of file diff --git a/Marlin/src/lcd/dogm/dogm_Bootscreen.h b/Marlin/src/lcd/dogm/dogm_Bootscreen.h deleted file mode 100644 index c9001119d9..0000000000 --- a/Marlin/src/lcd/dogm/dogm_Bootscreen.h +++ /dev/null @@ -1,521 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Standard Marlin Boot Screen bitmaps - * - * Use the Marlin Bitmap Converter to make your own: - * https://marlinfw.org/tools/u8glib/converter.html - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) - - #include "../../../_Bootscreen.h" - - #ifndef CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH - #define CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH CEILING(CUSTOM_BOOTSCREEN_BMPWIDTH, 8) - #endif - #ifndef CUSTOM_BOOTSCREEN_BMPHEIGHT - #define CUSTOM_BOOTSCREEN_BMPHEIGHT (sizeof(custom_start_bmp) / (CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH)) - #endif - -#endif - -#if ENABLED(BOOT_MARLIN_LOGO_SMALL) - - #define START_BMPWIDTH 56 - - const unsigned char start_bmp[] PROGMEM = { - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B10000011,B11001111,B00000000,B00000000,B00001100,B00110000,B00111111, - B10000111,B11111111,B10000000,B00000000,B00001100,B00110000,B00011111, - B10000110,B01111001,B10000000,B00000000,B00001100,B00000000,B00001111, - B10001100,B00110000,B11000111,B10000011,B10001100,B00110000,B11100111, - B10001100,B00110000,B11001111,B11000111,B11001100,B00110001,B11110011, - B10001100,B00110000,B11011100,B11101100,B11101100,B00110011,B10111001, - B10001100,B00110000,B11011000,B01101100,B01101100,B00110011,B00011001, - B10001100,B00110000,B11010000,B01101100,B00001100,B00110011,B00011001, - B10001100,B00110000,B11011000,B01101100,B00001100,B00110011,B00011001, - B10001100,B00110000,B11011100,B01101100,B00001110,B00111011,B00011001, - B10001100,B00110000,B11001111,B01111100,B00000111,B10011111,B00011001, - B10001100,B00110000,B11000111,B01111100,B00000011,B10001111,B00011001, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 - }; - - #if ENABLED(BOOT_MARLIN_LOGO_ANIMATED) - - const unsigned char start_bmp1[] PROGMEM = { - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 - }; - - const unsigned char start_bmp2[] PROGMEM = { - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B10000011,B11001111,B00000000,B00000000,B00000000,B00000000,B00111111, - B10000111,B11111111,B10000000,B00000000,B00000000,B00000000,B00011111, - B10000110,B01111001,B10000000,B00000000,B00000000,B00000000,B00001111, - B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000111, - B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000011, - B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 - }; - - const unsigned char start_bmp3[] PROGMEM = { - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B10000011,B11001111,B00000000,B00000000,B00000000,B00000000,B00111111, - B10000111,B11111111,B10000000,B00000000,B00000000,B00000000,B00011111, - B10000110,B01111001,B10000000,B00000000,B00000000,B00000000,B00001111, - B10001100,B00110000,B11000111,B10000000,B00000000,B00000000,B00000111, - B10001100,B00110000,B11001111,B11000000,B00000000,B00000000,B00000011, - B10001100,B00110000,B11011100,B11100000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11011000,B01100000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11010000,B01100000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11011000,B01100000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11011100,B01100000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11001111,B01110000,B00000000,B00000000,B00000001, - B10001100,B00110000,B11000111,B01110000,B00000000,B00000000,B00000001, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 - }; - - const unsigned char start_bmp4[] PROGMEM = { - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B10000011,B11001111,B00000000,B00000000,B00000000,B00000000,B00111111, - B10000111,B11111111,B10000000,B00000000,B00000000,B00000000,B00011111, - B10000110,B01111001,B10000000,B00000000,B00000000,B00000000,B00001111, - B10001100,B00110000,B11000111,B10000011,B10000000,B00000000,B00000111, - B10001100,B00110000,B11001111,B11000111,B11000000,B00000000,B00000011, - B10001100,B00110000,B11011100,B11101100,B11100000,B00000000,B00000001, - B10001100,B00110000,B11011000,B01101100,B01100000,B00000000,B00000001, - B10001100,B00110000,B11010000,B01101100,B00000000,B00000000,B00000001, - B10001100,B00110000,B11011000,B01101100,B00000000,B00000000,B00000001, - B10001100,B00110000,B11011100,B01101100,B00000000,B00000000,B00000001, - B10001100,B00110000,B11001111,B01111100,B00000000,B00000000,B00000001, - B10001100,B00110000,B11000111,B01111100,B00000000,B00000000,B00000001, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 - }; - - const unsigned char start_bmp5[] PROGMEM = { - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B10000011,B11001111,B00000000,B00000000,B00001100,B00000000,B00111111, - B10000111,B11111111,B10000000,B00000000,B00001100,B00000000,B00011111, - B10000110,B01111001,B10000000,B00000000,B00001100,B00000000,B00001111, - B10001100,B00110000,B11000111,B10000011,B10001100,B00000000,B00000111, - B10001100,B00110000,B11001111,B11000111,B11001100,B00000000,B00000011, - B10001100,B00110000,B11011100,B11101100,B11101100,B00000000,B00000001, - B10001100,B00110000,B11011000,B01101100,B01101100,B00000000,B00000001, - B10001100,B00110000,B11010000,B01101100,B00001100,B00000000,B00000001, - B10001100,B00110000,B11011000,B01101100,B00001100,B00000000,B00000001, - B10001100,B00110000,B11011100,B01101100,B00001110,B00000000,B00000001, - B10001100,B00110000,B11001111,B01111100,B00000111,B10000000,B00000001, - B10001100,B00110000,B11000111,B01111100,B00000011,B10000000,B00000001, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 - }; - - const unsigned char start_bmp6[] PROGMEM = { - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B10000011,B11001111,B00000000,B00000000,B00001100,B00110000,B00111111, - B10000111,B11111111,B10000000,B00000000,B00001100,B00110000,B00011111, - B10000110,B01111001,B10000000,B00000000,B00001100,B00000000,B00001111, - B10001100,B00110000,B11000111,B10000011,B10001100,B00110000,B00000111, - B10001100,B00110000,B11001111,B11000111,B11001100,B00110000,B00000011, - B10001100,B00110000,B11011100,B11101100,B11101100,B00110000,B00000001, - B10001100,B00110000,B11011000,B01101100,B01101100,B00110000,B00000001, - B10001100,B00110000,B11010000,B01101100,B00001100,B00110000,B00000001, - B10001100,B00110000,B11011000,B01101100,B00001100,B00110000,B00000001, - B10001100,B00110000,B11011100,B01101100,B00001110,B00111000,B00000001, - B10001100,B00110000,B11001111,B01111100,B00000111,B10011100,B00000001, - B10001100,B00110000,B11000111,B01111100,B00000011,B10001100,B00000001, - B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 - }; - - #endif - -#else - - #define START_BMPWIDTH 112 - - const unsigned char start_bmp[] PROGMEM = { - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00111111,B11111111, - B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00011000,B00000000,B00011111,B11111111, - B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00001111,B11111111, - B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000111,B11111111, - B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000011,B11111111, - B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000001,B11111111, - B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000,B11111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000011,B11100000,B01111000,B00111100,B00000011,B11110000,B01111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B01111000,B00111100,B00000111,B11111100,B00111111, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B01111000,B00111100,B00001111,B11111110,B00011111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B01111000,B00111100,B00011111,B11111110,B00001111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B01111000,B00111100,B00111111,B00111111,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B01111000,B00111100,B00111110,B00011111,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B01111100,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B01111111,B10111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00111111,B10111111,B11111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00011111,B10111111,B11111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00001111,B10111111,B11111100,B00001111,B00000011, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 - }; - - #if ENABLED(BOOT_MARLIN_LOGO_ANIMATED) - - const unsigned char start_bmp1[] PROGMEM = { - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 - }; - - const unsigned char start_bmp2[] PROGMEM = { - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111, - B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111, - B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111, - B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111, - B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111, - B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 - }; - - const unsigned char start_bmp3[] PROGMEM = { - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111, - B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111, - B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111, - B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111, - B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111, - B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 - }; - - const unsigned char start_bmp4[] PROGMEM = { - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111, - B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111, - B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111, - B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111, - B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111, - B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, - B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B01111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B00000000,B00000000,B00000000,B00000000,B00111111, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B00000000,B00000000,B00000000,B00000000,B00011111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00001111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B00000000,B00000000,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B00000000,B00000000,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 - }; - - const unsigned char start_bmp5[] PROGMEM = { - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00111111,B11111111, - B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00011111,B11111111, - B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00001111,B11111111, - B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000111,B11111111, - B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000011,B11111111, - B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000001,B11111111, - B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000,B11111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000011,B11100000,B01111000,B00000000,B00000000,B00000000,B01111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B01111000,B00000000,B00000000,B00000000,B00111111, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B01111000,B00000000,B00000000,B00000000,B00011111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B01111000,B00000000,B00000000,B00000000,B00001111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B01111000,B00000000,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B01111000,B00000000,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B01111000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B01111000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B01111000,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B01111100,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B01111111,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00111111,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00011111,B00000000,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00001111,B00000000,B00000000,B00000000,B00000011, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 - }; - - const unsigned char start_bmp6[] PROGMEM = { - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00111111,B11111111, - B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00011000,B00000000,B00011111,B11111111, - B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00001111,B11111111, - B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000111,B11111111, - B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000011,B11111111, - B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000001,B11111111, - B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000,B11111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000011,B11100000,B01111000,B00111100,B00000000,B00000000,B01111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B01111000,B00111100,B00000000,B00000000,B00111111, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B01111000,B00111100,B00000000,B00000000,B00011111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B01111000,B00111100,B00000000,B00000000,B00001111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B01111000,B00111100,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B01111000,B00111100,B00000000,B00000000,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B01111000,B00111100,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B01111000,B00111100,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B01111100,B00111100,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B01111111,B10111100,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00111111,B10111111,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00011111,B10111111,B00000000,B00000000,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00001111,B10111111,B00000000,B00000000,B00000011, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 - }; - - #endif - -#endif - -#if ENABLED(BOOT_MARLIN_LOGO_ANIMATED) - #ifndef MARLIN_BOOTSCREEN_FRAME_TIME - #define MARLIN_BOOTSCREEN_FRAME_TIME 100 // (ms) - #endif - const unsigned char * const marlin_bootscreen_animation[] PROGMEM = { - start_bmp1, start_bmp2, start_bmp3, start_bmp4, start_bmp5, start_bmp6, start_bmp - }; -#endif - -#ifndef START_BMP_BYTEWIDTH - #define START_BMP_BYTEWIDTH CEILING(START_BMPWIDTH, 8) -#endif -#ifndef START_BMPHEIGHT - #define START_BMPHEIGHT (sizeof(start_bmp) / (START_BMP_BYTEWIDTH)) -#endif - -static_assert(sizeof(start_bmp) == (START_BMP_BYTEWIDTH) * (START_BMPHEIGHT), "Bootscreen (start_bmp) dimensions don't match data."); diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h deleted file mode 100644 index c6ad566cff..0000000000 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ /dev/null @@ -1,1788 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Standard Marlin Status Screen bitmaps - * - * Use the Marlin Bitmap Converter to make your own: - * https://marlinfw.org/tools/u8glib/converter.html - */ - -#include "../../inc/MarlinConfig.h" -#include "ultralcd_DOGM.h" - -#define BW(N) ((N + 7) / 8) - -#if ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && DISABLED(STATUS_COMBINE_HEATERS) - - #undef STATUS_HEATERS_X - #undef STATUS_BED_X - /** - * Custom _Statusscreen.h files can define: - * - A custom logo image - * - A custom heater bitmap - * - A custom fan bitmap / animation - * - * See the included examples for guidance - */ - #include "../../../_Statusscreen.h" - - #ifdef STATUS_SCREENWIDTH - #error "Your custom _Statusscreen.h needs to be converted for Marlin 2.0." - #endif - -#endif - -// -// Default Status Screen Heater or Hotends bitmaps -// -#if !STATUS_HEATERS_WIDTH && !STATUS_HOTEND1_WIDTH - - #if ENABLED(STATUS_COMBINE_HEATERS) - - #undef STATUS_HOTEND_ANIM - #undef STATUS_BED_ANIM - #define STATUS_HEATERS_XSPACE 24 - - // - // Status Screen Combined Heater bitmaps - // - #if HAS_HEATED_BED && HOTENDS <= 4 - - #if HOTENDS == 0 - - #define STATUS_HEATERS_WIDTH 96 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, - B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #elif HOTENDS == 1 - - #define STATUS_HEATERS_WIDTH 96 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, - B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, - B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #elif HOTENDS == 2 - - #define STATUS_HEATERS_WIDTH 96 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #elif HOTENDS == 3 - - #define STATUS_HEATERS_WIDTH 96 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #else // HOTENDS > 3 - - #define STATUS_HEATERS_WIDTH 120 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00000100,B00010000,B01000000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00001000,B00100000,B10000000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00010000,B01000001,B00000000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00001000,B00100000,B10000000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00011111,B11111111,B11111000 - }; - - #endif // HOTENDS - - #define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10) - - #else // !HAS_HEATED_BED || HOTENDS > 3 - - #if HOTENDS == 0 - - #define STATUS_HEATERS_WIDTH 0 - - #elif HOTENDS == 1 - - #define STATUS_HEATERS_WIDTH 12 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111111,B11110000, - B00111111,B11110000, - B00011111,B11100000, - B00011111,B11100000, - B00111111,B11110000, - B00111111,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #elif HOTENDS == 2 - - #define STATUS_HEATERS_WIDTH 36 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000, - B00111100,B11110000,B00000000,B00111011,B01110000, - B00111010,B11110000,B00000000,B00111111,B01110000, - B00011110,B11100000,B00000000,B00011110,B11100000, - B00011110,B11100000,B00000000,B00011101,B11100000, - B00111110,B11110000,B00000000,B00111011,B11110000, - B00111110,B11110000,B00000000,B00111000,B01110000, - B00111111,B11110000,B00000000,B00111111,B11110000, - B00001111,B11000000,B00000000,B00001111,B11000000, - B00000111,B10000000,B00000000,B00000111,B10000000, - B00000011,B00000000,B00000000,B00000011,B00000000 - }; - - #elif HOTENDS == 3 - - #define STATUS_HEATERS_WIDTH 60 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 - }; - - #elif HOTENDS == 4 - - #define STATUS_HEATERS_WIDTH 84 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 - }; - - #else // HOTENDS > 4 - - #define STATUS_HEATERS_WIDTH 108 - - const unsigned char status_heaters_bmp[] PROGMEM = { - B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, - B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111000,B01110000, - B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B11110000, - B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00111000,B11110000, - B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00011111,B01100000, - B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00011111,B01100000, - B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, - B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00111100,B11110000, - B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, - B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, - B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, - B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 - }; - - #endif // HOTENDS - - #endif // !HAS_HEATED_BED || HOTENDS > 3 - - #else // !STATUS_COMBINE_HEATERS - - // - // Status Screen Hotends bitmaps - // - #if HAS_HOTEND - - #define STATUS_HOTEND1_WIDTH 16 - - #define MAX_HOTEND_BITMAPS 5 - #if HOTENDS > MAX_HOTEND_BITMAPS - #define STATUS_HOTEND_BITMAPS MAX_HOTEND_BITMAPS - #else - #define STATUS_HOTEND_BITMAPS HOTENDS - #endif - - #if HOTENDS == 1 || ENABLED(STATUS_HOTEND_NUMBERLESS) - - const unsigned char status_hotend_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111111,B11110000, - B00111111,B11110000, - B00011111,B11100000, - B00011111,B11100000, - B00111111,B11110000, - B00111111,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100000,B00010000, - B00100000,B00010000, - B00010000,B00100000, - B00010000,B00100000, - B00100000,B00010000, - B00100000,B00010000, - B00110000,B00110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #endif - - #elif HOTENDS >= 2 - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend1_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111110,B11110000, - B00111100,B11110000, - B00011010,B11100000, - B00011110,B11100000, - B00111110,B11110000, - B00111110,B11110000, - B00111110,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend1_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100001,B00010000, - B00100011,B00010000, - B00010101,B00100000, - B00010001,B00100000, - B00100001,B00010000, - B00100001,B00010000, - B00110001,B00110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend2_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111100,B11110000, - B00111011,B01110000, - B00011111,B01100000, - B00011110,B11100000, - B00111101,B11110000, - B00111011,B11110000, - B00111000,B01110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend2_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100011,B00010000, - B00100100,B10010000, - B00010000,B10100000, - B00010001,B00100000, - B00100010,B00010000, - B00100100,B00010000, - B00110111,B10110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #else - - const unsigned char status_hotend1_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111110,B11110000, - B00111100,B11110000, - B00111010,B11110000, - B00011110,B11100000, - B00011110,B11100000, - B00111110,B11110000, - B00111110,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend2_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111100,B11110000, - B00111011,B01110000, - B00111111,B01110000, - B00011110,B11100000, - B00011101,B11100000, - B00111011,B11110000, - B00111000,B01110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #endif - - #if STATUS_HOTEND_BITMAPS >= 3 - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend3_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111100,B11110000, - B00111011,B01110000, - B00011111,B01100000, - B00011100,B11100000, - B00111111,B01110000, - B00111011,B01110000, - B00111100,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend3_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100011,B00010000, - B00100100,B10010000, - B00010000,B10100000, - B00010011,B00100000, - B00100000,B10010000, - B00100100,B10010000, - B00110011,B00110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #else - - const unsigned char status_hotend3_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111100,B11110000, - B00111011,B01110000, - B00111111,B01110000, - B00011100,B11100000, - B00011111,B01100000, - B00111011,B01110000, - B00111100,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #endif - - #endif - - #if STATUS_HOTEND_BITMAPS >= 4 - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend4_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111011,B01110000, - B00111011,B01110000, - B00011011,B01100000, - B00011011,B01100000, - B00111000,B00110000, - B00111111,B01110000, - B00111111,B01110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend4_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100100,B10010000, - B00100100,B10010000, - B00010100,B10100000, - B00010100,B10100000, - B00100111,B11010000, - B00100000,B10010000, - B00110000,B10110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #else - - const unsigned char status_hotend4_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111011,B01110000, - B00111011,B01110000, - B00111011,B01110000, - B00011011,B01100000, - B00011000,B00100000, - B00111111,B01110000, - B00111111,B01110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #endif - - #endif - - #if STATUS_HOTEND_BITMAPS >= 5 - - #ifdef STATUS_HOTEND_ANIM - - const unsigned char status_hotend5_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111111,B11110000, - B00111000,B01110000, - B00111011,B11110000, - B00011000,B11100000, - B00011111,B01100000, - B00111111,B01110000, - B00111011,B01110000, - B00111100,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - const unsigned char status_hotend5_b_bmp[] PROGMEM = { - B00011111,B11100000, - B00100000,B00010000, - B00100111,B10010000, - B00100100,B00010000, - B00010111,B00100000, - B00010000,B10100000, - B00100000,B10010000, - B00100100,B10010000, - B00110011,B00110000, - B00001000,B01000000, - B00000100,B10000000, - B00000011,B00000000 - }; - - #else - - const unsigned char status_hotend5_a_bmp[] PROGMEM = { - B00011111,B11100000, - B00111000,B01110000, - B00111011,B11110000, - B00111000,B11110000, - B00011111,B01100000, - B00011111,B01100000, - B00111011,B01110000, - B00111100,B11110000, - B00111111,B11110000, - B00001111,B11000000, - B00000111,B10000000, - B00000011,B00000000 - }; - - #endif - - #endif - - #endif - - #else - #define STATUS_HEATERS_HEIGHT 20 - #endif - - #endif - -#endif // !STATUS_HEATERS_WIDTH && !STATUS_HOTEND1_WIDTH - -// LASER / SPINDLE -#if !STATUS_CUTTER_WIDTH && HAS_CUTTER - #define STATUS_CUTTER_WIDTH 24 - #define STATUS_CUTTER_X 80 - #if ENABLED(LASER_FEATURE) - #ifdef STATUS_CUTTER_ANIM - const unsigned char status_cutter_on_bmp[] PROGMEM = { - B00000000,B00100100,B00000000, - B00000000,B01100110,B00000000, - B00000000,B11000011,B00000000, - B00000001,B10011001,B10000000, - B00000011,B00100100,B11000000, - B00000000,B01000010,B00000000, - B00000000,B01000010,B00000000, - B00000011,B00100100,B11000000, - B00000001,B10011001,B10000000, - B00000000,B11000011,B00000000, - B00000000,B01100110,B00000000, - B00000000,B00100100,B00000000 - }; - const unsigned char status_cutter_bmp[] PROGMEM = { - B00000000,B00100100,B00000000, - B00000000,B01100110,B00000000, - B00000000,B00000000,B00000000, - B00000001,B00000000,B10000000, - B00000011,B00000000,B11000000, - B00000000,B00011000,B00000000, - B00000000,B00011000,B00000000, - B00000011,B00000000,B11000000, - B00000001,B00000000,B10000000, - B00000000,B00000000,B00000000, - B00000000,B01100110,B00000000, - B00000000,B00100100,B00000000 - }; - #else - const unsigned char status_cutter_bmp[] PROGMEM = { - B00000000,B00100100,B00000000, - B00000000,B01100110,B00000000, - B00000000,B11000011,B00000000, - B00000001,B10000001,B10000000, - B00000011,B00000000,B11000000, - B00000000,B00000000,B00000000, - B00000000,B00000000,B00000000, - B00000011,B00000000,B11000000, - B00000001,B10000001,B10000000, - B00000000,B11000011,B00000000, - B00000000,B01100110,B00000000, - B00000000,B00100100,B00000000 - }; - #endif - #else - #ifdef STATUS_CUTTER_ANIM - const unsigned char status_cutter_on_bmp[] PROGMEM = { - B00000001,B11111110,B10000000, - B00000000,B11000000,B00000000, - B00000001,B10000000,B10000000, - B00000001,B00000000,B10000000, - B00000001,B11111100,B10000000, - B00000000,B11100000,B00000000, - B00000001,B11000000,B10000000, - B00000000,B10000001,B00000000, - B00000000,B01111010,B00000000, - B00000000,B00110100,B00000000, - B00000000,B00011000,B00000000, - B00000000,B00000000,B00000000 - }; - const unsigned char status_cutter_bmp[] PROGMEM = { - B00000001,B11111110,B10000000, - B00000000,B11000000,B00000000, - B00000001,B10000000,B10000000, - B00000001,B00000000,B10000000, - B00000001,B11111100,B10000000, - B00000000,B11100000,B00000000, - B00000001,B11000000,B10000000, - B00000000,B10000001,B00000000, - B00000000,B01111010,B00000000, - B00000000,B00110100,B00000000, - B00000000,B00011000,B00000000, - B00000000,B00000000,B00000000 - }; - #else - const unsigned char status_cutter_bmp[] PROGMEM = { - B00000001,B11000010,B10000000, - B00000001,B00011100,B10000000, - B00000000,B11100001,B00000000, - B00000001,B00001110,B10000000, - B00000001,B01110000,B10000000, - B00000000,B10000111,B10000000, - B00000001,B00111111,B10000000, - B00000000,B11111111,B00000000, - B00000000,B01111110,B00000000, - B00000000,B00111100,B00000000, - B00000000,B00011000,B00000000, - B00000000,B00000000,B00000000 - }; - #endif - #endif -#endif // LASER / SPINDLE - -// -// Default Status Screen Bed bitmaps -// -#if !STATUS_BED_WIDTH && HAS_HEATED_BED && DISABLED(STATUS_COMBINE_HEATERS) - - #if ENABLED(STATUS_ALT_BED_BITMAP) - - #define STATUS_BED_ANIM - #define STATUS_BED_WIDTH 24 - #ifndef STATUS_BED_X - #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_BED_BYTEWIDTH + STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) - #endif - #define STATUS_BED_TEXT_X (STATUS_BED_X + 11) - - const unsigned char status_bed_bmp[] PROGMEM = { - B11111111,B11111111,B11000000, - B01000000,B00000000,B00100000, - B00100000,B00000000,B00010000, - B00010000,B00000000,B00001000, - B00001000,B00000000,B00000100, - B00000100,B00000000,B00000010, - B00000011,B11111111,B11111111 - }; - - const unsigned char status_bed_on_bmp[] PROGMEM = { - B00000010,B00100010,B00000000, - B00000100,B01000100,B00000000, - B00000100,B01000100,B00000000, - B00000010,B00100010,B00000000, - B00000001,B00010001,B00000000, - B11111111,B11111111,B11000000, - B01000000,B10001000,B10100000, - B00100001,B00010001,B00010000, - B00010010,B00100010,B00001000, - B00001000,B00000000,B00000100, - B00000100,B00000000,B00000010, - B00000011,B11111111,B11111111 - }; - - #else - - #define STATUS_BED_WIDTH 21 - #ifndef STATUS_BED_X - #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_BED_BYTEWIDTH + STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) - #endif - - #ifdef STATUS_BED_ANIM - - const unsigned char status_bed_bmp[] PROGMEM = { - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - const unsigned char status_bed_on_bmp[] PROGMEM = { - B00000100,B00010000,B01000000, - B00000010,B00001000,B00100000, - B00000010,B00001000,B00100000, - B00000100,B00010000,B01000000, - B00001000,B00100000,B10000000, - B00010000,B01000001,B00000000, - B00010000,B01000001,B00000000, - B00001000,B00100000,B10000000, - B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - #else - - const unsigned char status_bed_bmp[] PROGMEM = { - B00000100,B00010000,B01000000, - B00000010,B00001000,B00100000, - B00000010,B00001000,B00100000, - B00000100,B00010000,B01000000, - B00001000,B00100000,B10000000, - B00010000,B01000001,B00000000, - B00010000,B01000001,B00000000, - B00001000,B00100000,B10000000, - B00000100,B00010000,B01000000, - B00000000,B00000000,B00000000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - #endif - - #endif -#endif - -#ifndef STATUS_BED_WIDTH - #define STATUS_BED_WIDTH 0 -#endif - -#if !STATUS_CHAMBER_WIDTH && HAS_TEMP_CHAMBER && ((HOTENDS <= 4 && !HAS_HEATED_BED) || (HOTENDS <= 3 && HAS_HEATED_BED)) - #define STATUS_CHAMBER_WIDTH 21 - #if STATUS_HEATERS_WIDTH - #if ENABLED(STATUS_COMBINE_HEATERS) - #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - 2 - (STATUS_CHAMBER_BYTEWIDTH) * 8) - #elif HAS_FAN0 && HAS_HEATED_BED && HOTENDS <= 2 - #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - 2 - (STATUS_HEATERS_BYTEWIDTH - STATUS_CHAMBER_BYTEWIDTH) * 8) - #elif HAS_FAN0 && !HAS_HEATED_BED - #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) - #else - #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH) * 8) - #endif - #endif - - #ifdef STATUS_CHAMBER_ANIM - - const unsigned char status_chamber_bmp[] PROGMEM = { - B00011111,B11111111,B11111000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00010000,B00000000,B00001000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - const unsigned char status_chamber_on_bmp[] PROGMEM = { - B00011111,B11111111,B11111000, - B00010000,B00000000,B00001000, - B00010000,B10000100,B00001000, - B00010000,B01000010,B00001000, - B00010000,B01000010,B00001000, - B00010000,B10000100,B00001000, - B00010001,B00001000,B00001000, - B00010001,B00001000,B00001000, - B00010000,B10000100,B00001000, - B00010000,B00000000,B00001000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - #else - - const unsigned char status_chamber_bmp[] PROGMEM = { - B00011111,B11111111,B11111000, - B00010000,B00000000,B00001000, - B00010000,B10000100,B00001000, - B00010000,B01000010,B00001000, - B00010000,B01000010,B00001000, - B00010000,B10000100,B00001000, - B00010001,B00001000,B00001000, - B00010001,B00001000,B00001000, - B00010000,B10000100,B00001000, - B00010000,B00000000,B00001000, - B00011111,B11111111,B11111000, - B00011111,B11111111,B11111000 - }; - - #endif -#endif - -#ifndef STATUS_CHAMBER_WIDTH - #define STATUS_CHAMBER_WIDTH 0 -#endif - -// Can also be overridden in Configuration_adv.h -// If you can afford it, try the 3-frame fan animation! -// Don't compile in the fan animation with no fan -#if !HAS_FAN0 || (HOTENDS == 5 || (HOTENDS == 4 && BED_OR_CHAMBER) || BOTH(STATUS_COMBINE_HEATERS, HAS_HEATED_CHAMBER)) - #undef STATUS_FAN_FRAMES -#elif !STATUS_FAN_FRAMES - #define STATUS_FAN_FRAMES 2 -#elif STATUS_FAN_FRAMES > 4 - #error "A maximum of 4 fan animation frames is currently supported." -#endif - -#if HOTENDS > 4 - #undef STATUS_LOGO_WIDTH - #undef STATUS_HEATERS_XSPACE - #define STATUS_HEATERS_XSPACE 24 -#endif - -// -// Provide default Fan Bitmaps -// -#if !STATUS_FAN_WIDTH && STATUS_FAN_FRAMES > 0 - - // Provide a fan animation if none exists - - #if STATUS_FAN_FRAMES <= 2 - - #define STATUS_FAN_Y 2 - #define STATUS_FAN_WIDTH 20 - - #if ENABLED(STATUS_ALT_FAN_BITMAP) - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00000001,B11111110,B00000000, - B00000110,B00000001,B10000000, - B00001000,B11111100,B01000000, - B00010000,B11111100,B00100000, - B00010000,B01111000,B00100000, - B00100000,B00110000,B00010000, - B00101100,B00000000,B11010000, - B00101110,B00110001,B11010000, - B00101111,B01111011,B11010000, - B00101111,B01111011,B11010000, - B00101110,B00110001,B11010000, - B00101100,B00000000,B11010000, - B00100000,B00110000,B00010000, - B00010000,B01111000,B00100000, - B00010000,B11111100,B00100000, - B00001000,B11111100,B01000000, - B00000110,B00000001,B10000000, - B00000001,B11111110,B00000000 - }; - - #if STATUS_FAN_FRAMES == 2 - const unsigned char status_fan1_bmp[] PROGMEM = { - B00000001,B11111110,B00000000, - B00000110,B00000001,B10000000, - B00001001,B10000110,B01000000, - B00010011,B10000111,B00100000, - B00010111,B10000111,B10100000, - B00101111,B10000111,B11010000, - B00101111,B00000011,B11010000, - B00100000,B00110000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B00110000,B00010000, - B00101111,B00000011,B11010000, - B00101111,B10000111,B11010000, - B00010111,B10000111,B10100000, - B00010011,B10000111,B00100000, - B00001001,B10000110,B01000000, - B00000110,B00000001,B10000000, - B00000001,B11111110,B00000000 - }; - #endif - - #else // !STATUS_ALT_FAN_BITMAP - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00111111,B11111111,B11110000, - B00111000,B00000000,B01110000, - B00110000,B11111100,B00110000, - B00100000,B11111100,B00010000, - B00100000,B01111000,B00010000, - B00100000,B00110000,B00010000, - B00101100,B00000000,B11010000, - B00101110,B00110001,B11010000, - B00101111,B01111011,B11010000, - B00101111,B01111011,B11010000, - B00101110,B00110001,B11010000, - B00101100,B00000000,B11010000, - B00100000,B00110000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B11111100,B00010000, - B00110000,B11111100,B00110000, - B00111000,B00000000,B01110000, - B00111111,B11111111,B11110000 - }; - - #if STATUS_FAN_FRAMES == 2 - const unsigned char status_fan1_bmp[] PROGMEM = { - B00111111,B11111111,B11110000, - B00111000,B00000000,B01110000, - B00110001,B10000110,B00110000, - B00100011,B10000111,B00010000, - B00100111,B10000111,B10010000, - B00101111,B10000111,B11010000, - B00101111,B00000011,B11010000, - B00100000,B00110000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B01111000,B00010000, - B00100000,B00110000,B00010000, - B00101111,B00000011,B11010000, - B00101111,B10000111,B11010000, - B00100111,B10000111,B10010000, - B00100011,B10000111,B00010000, - B00110001,B10000110,B00110000, - B00111000,B00000000,B01110000, - B00111111,B11111111,B11110000 - }; - #endif - - #endif // !STATUS_ALT_FAN_BITMAP - - #elif STATUS_FAN_FRAMES == 3 - - #define STATUS_FAN_WIDTH 20 - - #if ENABLED(STATUS_ALT_FAN_BITMAP) - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00000000,B11000000, - B00001001,B00000001,B00100000, - B00010111,B10000011,B11010000, - B00010111,B10000011,B11010000, - B00101111,B11000111,B11101000, - B00100111,B11000111,B11001000, - B00100001,B11111111,B00001000, - B00100000,B01111100,B00001000, - B00100000,B01111100,B00001000, - B00100000,B01111100,B00001000, - B00100001,B11111111,B00001000, - B00100111,B11000111,B11001000, - B00101111,B11000111,B11101000, - B00010111,B10000011,B11010000, - B00010111,B10000011,B11010000, - B00001001,B00000001,B00100000, - B00000110,B00000000,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan1_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00110000,B11000000, - B00001001,B11110000,B00100000, - B00010001,B11110000,B00010000, - B00010000,B11110000,B00010000, - B00100000,B11110000,B01101000, - B00100000,B00110001,B11101000, - B00100000,B00111001,B11101000, - B00100000,B01111111,B11111000, - B00111111,B11111111,B11111000, - B00111111,B11111100,B00001000, - B00101111,B00111000,B00001000, - B00101110,B00011000,B00001000, - B00101100,B00011110,B00001000, - B00010000,B00011110,B00010000, - B00010000,B00011111,B00010000, - B00001000,B00011111,B00100000, - B00000110,B00011000,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan2_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00011000,B11000000, - B00001000,B00011111,B00100000, - B00010000,B00011111,B10010000, - B00010100,B00011111,B00010000, - B00101110,B00011110,B00001000, - B00101111,B00011100,B00001000, - B00101111,B10111000,B00001000, - B00111111,B11111100,B00001000, - B00111111,B11111111,B11111000, - B00100000,B01111111,B11111000, - B00100000,B00111011,B11101000, - B00100000,B01110001,B11101000, - B00100000,B11110000,B11101000, - B00010001,B11110000,B01010000, - B00010011,B11110000,B00010000, - B00001001,B11110000,B00100000, - B00000110,B00110000,B11000000, - B00000001,B11111111,B00000000 - }; - - #else // !STATUS_ALT_FAN_BITMAP - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00000000,B11111000, - B00111001,B00000001,B00111000, - B00110111,B10000011,B11011000, - B00110111,B10000011,B11011000, - B00101111,B11000111,B11101000, - B00100111,B11000111,B11001000, - B00100001,B11111111,B00001000, - B00100000,B01111100,B00001000, - B00100000,B01111100,B00001000, - B00100000,B01111100,B00001000, - B00100001,B11111111,B00001000, - B00100111,B11000111,B11001000, - B00101111,B11000111,B11101000, - B00110111,B10000011,B11011000, - B00110111,B10000011,B11011000, - B00111001,B00000001,B00111000, - B00111110,B00000000,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan1_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00110000,B11111000, - B00111001,B11110000,B00111000, - B00110001,B11110000,B00011000, - B00110000,B11110000,B00011000, - B00100000,B11110000,B01101000, - B00100000,B00110001,B11101000, - B00100000,B00111001,B11101000, - B00100000,B01111111,B11111000, - B00111111,B11111111,B11111000, - B00111111,B11111100,B00001000, - B00101111,B00111000,B00001000, - B00101110,B00011000,B00001000, - B00101100,B00011110,B00001000, - B00110000,B00011110,B00011000, - B00110000,B00011111,B00011000, - B00111000,B00011111,B00111000, - B00111110,B00011000,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan2_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00011000,B11111000, - B00111000,B00011111,B00111000, - B00110000,B00011111,B10011000, - B00110100,B00011111,B00011000, - B00101110,B00011110,B00001000, - B00101111,B00011100,B00001000, - B00101111,B10111000,B00001000, - B00111111,B11111100,B00001000, - B00111111,B11111111,B11111000, - B00100000,B01111111,B11111000, - B00100000,B00111011,B11101000, - B00100000,B01110001,B11101000, - B00100000,B11110000,B11101000, - B00110001,B11110000,B01011000, - B00110011,B11110000,B00011000, - B00111001,B11110000,B00111000, - B00111110,B00110000,B11111000, - B00111111,B11111111,B11111000 - }; - - #endif // !STATUS_ALT_FAN_BITMAP - - #elif STATUS_FAN_FRAMES == 4 - - #define STATUS_FAN_WIDTH 20 - - #if ENABLED(STATUS_ALT_FAN_BITMAP) - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00000000,B11000000, - B00001000,B00111111,B00100000, - B00010000,B01111110,B00010000, - B00010000,B01111100,B00010000, - B00101000,B01111100,B00001000, - B00101100,B00111000,B00001000, - B00101111,B00111001,B11001000, - B00101111,B11111111,B11101000, - B00101111,B11000111,B11101000, - B00101111,B11111111,B11101000, - B00100111,B00111001,B11101000, - B00100000,B00111000,B01101000, - B00100000,B01111100,B00101000, - B00010000,B01111100,B00010000, - B00010000,B11111100,B00010000, - B00001001,B11111000,B00100000, - B00000110,B00000000,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan1_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00000000,B11000000, - B00001000,B00001111,B00100000, - B00010100,B00011111,B11010000, - B00010110,B00011111,B10010000, - B00101111,B00011111,B00001000, - B00101111,B10011110,B00001000, - B00101111,B11111100,B00001000, - B00101111,B11011100,B00001000, - B00100111,B11101111,B11001000, - B00100000,B01110111,B11101000, - B00100000,B01111111,B11101000, - B00100000,B11110011,B11101000, - B00100001,B11110001,B11101000, - B00010011,B11110000,B11010000, - B00010111,B11110000,B01010000, - B00001001,B11100000,B00100000, - B00000110,B00000000,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan2_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B10000000,B11000000, - B00001001,B10000000,B00100000, - B00010111,B10000001,B11010000, - B00010111,B11000011,B11010000, - B00100111,B11000111,B11101000, - B00100011,B11000111,B11111000, - B00100001,B11111111,B10001000, - B00100000,B01101100,B00001000, - B00100000,B01101100,B00001000, - B00100000,B01101100,B00001000, - B00100011,B11111111,B00001000, - B00111111,B11000111,B10001000, - B00101111,B11000111,B11001000, - B00010111,B10000111,B11010000, - B00010111,B00000011,B11010000, - B00001000,B00000011,B00100000, - B00000110,B00000010,B11000000, - B00000001,B11111111,B00000000 - }; - const unsigned char status_fan3_bmp[] PROGMEM = { - B00000001,B11111111,B00000000, - B00000110,B00000000,B11000000, - B00001001,B11110000,B00100000, - B00010001,B11100000,B00010000, - B00010001,B11100000,B00010000, - B00100001,B11100001,B11101000, - B00100000,B11110011,B11101000, - B00100000,B01111111,B11101000, - B00100000,B01110111,B11101000, - B00101000,B11101110,B00101000, - B00101111,B11011100,B00001000, - B00101111,B11111100,B00001000, - B00101111,B10011110,B00001000, - B00101111,B00001111,B00001000, - B00010000,B00001111,B00010000, - B00010000,B00001111,B00010000, - B00001000,B00011111,B00100000, - B00000110,B00000000,B11000000, - B00000001,B11111111,B00000000 - }; - - #else // !STATUS_ALT_FAN_BITMAP - - const unsigned char status_fan0_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00000000,B11111000, - B00111000,B00111111,B00111000, - B00110000,B01111110,B00011000, - B00110000,B01111100,B00011000, - B00101000,B01111100,B00001000, - B00101100,B00111000,B00001000, - B00101111,B00111001,B11001000, - B00101111,B11111111,B11101000, - B00101111,B11000111,B11101000, - B00101111,B11111111,B11101000, - B00100111,B00111001,B11101000, - B00100000,B00111000,B01101000, - B00100000,B01111100,B00101000, - B00110000,B01111100,B00011000, - B00110000,B11111100,B00011000, - B00111001,B11111000,B00111000, - B00111110,B00000000,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan1_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00000000,B11111000, - B00111000,B00001111,B00111000, - B00110100,B00011111,B11011000, - B00110110,B00011111,B10011000, - B00101111,B00011111,B00001000, - B00101111,B10011110,B00001000, - B00101111,B11111100,B00001000, - B00101111,B11011100,B00001000, - B00100111,B11101111,B11001000, - B00100000,B01110111,B11101000, - B00100000,B01111111,B11101000, - B00100000,B11110011,B11101000, - B00100001,B11110001,B11101000, - B00110011,B11110000,B11011000, - B00110111,B11110000,B01011000, - B00111001,B11100000,B00111000, - B00111110,B00000000,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan2_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B10000000,B11111000, - B00111001,B10000000,B00111000, - B00110111,B10000001,B11011000, - B00110111,B11000011,B11011000, - B00100111,B11000111,B11101000, - B00100011,B11000111,B11111000, - B00100001,B11111111,B10001000, - B00100000,B01101100,B00001000, - B00100000,B01101100,B00001000, - B00100000,B01101100,B00001000, - B00100011,B11111111,B00001000, - B00111111,B11000111,B10001000, - B00101111,B11000111,B11001000, - B00110111,B10000111,B11011000, - B00110111,B00000011,B11011000, - B00111000,B00000011,B00111000, - B00111110,B00000010,B11111000, - B00111111,B11111111,B11111000 - }; - const unsigned char status_fan3_bmp[] PROGMEM = { - B00111111,B11111111,B11111000, - B00111110,B00000000,B11111000, - B00111001,B11110000,B00111000, - B00110001,B11100000,B00011000, - B00110001,B11100000,B00011000, - B00100001,B11100001,B11101000, - B00100000,B11110011,B11101000, - B00100000,B01111111,B11101000, - B00100000,B01110111,B11101000, - B00101000,B11101110,B00101000, - B00101111,B11011100,B00001000, - B00101111,B11111100,B00001000, - B00101111,B10011110,B00001000, - B00101111,B00001111,B00001000, - B00110000,B00001111,B00011000, - B00110000,B00001111,B00011000, - B00111000,B00011111,B00111000, - B00111110,B00000000,B11111000, - B00111111,B11111111,B11111000 - }; - - #endif // !STATUS_ALT_FAN_BITMAP - - #endif -#else - #undef STATUS_FAN_FRAMES - #define STATUS_FAN_WIDTH 0 -#endif - -#define _EXTRA_WIDTH (STATUS_FAN_WIDTH + STATUS_CHAMBER_WIDTH + STATUS_BED_WIDTH) - -// -// Heater Bitmap X Space Requirements -// -#if !defined(STATUS_HEATERS_XSPACE) && (STATUS_HOTEND1_WIDTH || STATUS_HEATERS_WIDTH) - #if (HOTENDS == 3 || HOTENDS == 4) && ENABLED(STATUS_COMBINE_HEATERS) - // If more heaters or they're combined, 3 bytes - #define STATUS_HEATERS_XSPACE 24 - #elif STATUS_LOGO_WIDTH > (LCD_PIXEL_WIDTH - (_EXTRA_WIDTH) - 26 * (HOTENDS)) // 128 - (20 + 24 + 26) == 58 - // If the logo won't fit at 26 width - #define STATUS_HEATERS_XSPACE 24 - #else - #define STATUS_HEATERS_XSPACE 26 - #endif -#endif - -#if ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) - - // - // Disable the logo bitmap if insufficient space - // - #if STATUS_HEATERS_XSPACE - #define _HEATERS_WIDTH (HOTENDS * (STATUS_HEATERS_XSPACE)) // as many hotends as possible - #elif STATUS_HEATERS_WIDTH - #define _HEATERS_WIDTH STATUS_HEATERS_WIDTH - #elif HOTENDS - #error "Status screen heaters region was not specified." - #endif - #if STATUS_LOGO_WIDTH > (LCD_PIXEL_WIDTH - (_EXTRA_WIDTH + _HEATERS_WIDTH)) - #warning "Unable to fit custom Status Screen logo. Disabling." - #undef STATUS_LOGO_WIDTH - #endif - - #if !defined(STATUS_HEATERS_X) && ((HAS_MULTI_HOTEND && STATUS_LOGO_WIDTH && BED_OR_CHAMBER_OR_FAN) || (HOTENDS >= 3 && !BED_OR_CHAMBER_OR_FAN)) - #define _STATUS_HEATERS_X(H,S,N) ((LCD_PIXEL_WIDTH - (H * (S + N)) - (_EXTRA_WIDTH) + (STATUS_LOGO_WIDTH)) / 2) - #if STATUS_HOTEND1_WIDTH - #if HOTENDS > 2 - #define STATUS_HEATERS_X _STATUS_HEATERS_X(HOTENDS, STATUS_HOTEND1_WIDTH, 6) - #else - #define STATUS_HEATERS_X _STATUS_HEATERS_X(HOTENDS, STATUS_HOTEND1_WIDTH, 4) - #endif - #else - #define STATUS_HEATERS_X _STATUS_HEATERS_X(1, STATUS_HEATERS_WIDTH, 4) - #endif - #endif - -#endif - -// -// Custom Logo Bitmap Properties -// -#ifndef STATUS_LOGO_WIDTH - #define STATUS_LOGO_WIDTH 0 -#endif -#ifndef STATUS_LOGO_BYTEWIDTH - #define STATUS_LOGO_BYTEWIDTH BW(STATUS_LOGO_WIDTH) -#endif -#if STATUS_LOGO_WIDTH - #ifndef STATUS_LOGO_X - #define STATUS_LOGO_X 0 - #endif - #ifndef STATUS_LOGO_Y - #define STATUS_LOGO_Y _MIN(0U, (20 - (STATUS_LOGO_HEIGHT)) / 2) - #endif - #ifndef STATUS_LOGO_HEIGHT - #define STATUS_LOGO_HEIGHT (sizeof(status_logo_bmp) / (STATUS_LOGO_BYTEWIDTH)) - #endif - static_assert( - sizeof(status_logo_bmp) == (STATUS_LOGO_BYTEWIDTH) * (STATUS_LOGO_HEIGHT), - "Status logo bitmap (status_logo_bmp) dimensions don't match data." - ); -#endif - -// -// Hotend Heater Bitmap starting X position -// -#if !defined(STATUS_HEATERS_X) && (STATUS_HOTEND1_WIDTH || STATUS_HEATERS_WIDTH) - #if STATUS_LOGO_BYTEWIDTH - #define STATUS_HEATERS_X (STATUS_LOGO_BYTEWIDTH * 8) - #elif ((STATUS_CHAMBER_WIDTH || STATUS_FAN_WIDTH) && (STATUS_BED_WIDTH && STATUS_HOTEND_BITMAPS == 3)) || \ - ((STATUS_CHAMBER_WIDTH || STATUS_FAN_WIDTH || STATUS_BED_WIDTH) && STATUS_HOTEND_BITMAPS == 4) - #define STATUS_HEATERS_X 5 - #else - #if BOTH(STATUS_COMBINE_HEATERS, HAS_HEATED_BED) && HOTENDS <= 4 - #define STATUS_HEATERS_X 5 - #else - #define STATUS_HEATERS_X 8 // Like the included bitmaps - #endif - #endif -#endif - -#if STATUS_HOTEND1_WIDTH - - // - // Hotend images. A base hotend image and optional "ON" state image. - // - #ifndef STATUS_HOTEND_BITMAPS - #define STATUS_HOTEND_BITMAPS 1 - #endif - - #ifndef STATUS_HOTEND2_WIDTH - #define STATUS_HOTEND2_WIDTH STATUS_HOTEND1_WIDTH - #endif - #ifndef STATUS_HOTEND3_WIDTH - #define STATUS_HOTEND3_WIDTH STATUS_HOTEND2_WIDTH - #endif - #ifndef STATUS_HOTEND4_WIDTH - #define STATUS_HOTEND4_WIDTH STATUS_HOTEND3_WIDTH - #endif - #ifndef STATUS_HOTEND5_WIDTH - #define STATUS_HOTEND5_WIDTH STATUS_HOTEND4_WIDTH - #endif - #ifndef STATUS_HOTEND6_WIDTH - #define STATUS_HOTEND6_WIDTH STATUS_HOTEND5_WIDTH - #endif - #ifndef STATUS_HOTEND7_WIDTH - #define STATUS_HOTEND7_WIDTH STATUS_HOTEND6_WIDTH - #endif - #ifndef STATUS_HOTEND8_WIDTH - #define STATUS_HOTEND8_WIDTH STATUS_HOTEND7_WIDTH - #endif - - constexpr uint8_t status_hotend_width[HOTENDS] = ARRAY_N(HOTENDS, STATUS_HOTEND1_WIDTH, STATUS_HOTEND2_WIDTH, STATUS_HOTEND3_WIDTH, STATUS_HOTEND4_WIDTH, STATUS_HOTEND5_WIDTH, STATUS_HOTEND6_WIDTH, STATUS_HOTEND7_WIDTH, STATUS_HOTEND8_WIDTH); - #define STATUS_HOTEND_WIDTH(N) status_hotend_width[N] - - #ifndef STATUS_HOTEND1_BYTEWIDTH - #define STATUS_HOTEND1_BYTEWIDTH BW(STATUS_HOTEND1_WIDTH) - #endif - #ifndef STATUS_HOTEND2_BYTEWIDTH - #define STATUS_HOTEND2_BYTEWIDTH BW(STATUS_HOTEND2_WIDTH) - #endif - #ifndef STATUS_HOTEND3_BYTEWIDTH - #define STATUS_HOTEND3_BYTEWIDTH BW(STATUS_HOTEND3_WIDTH) - #endif - #ifndef STATUS_HOTEND4_BYTEWIDTH - #define STATUS_HOTEND4_BYTEWIDTH BW(STATUS_HOTEND4_WIDTH) - #endif - #ifndef STATUS_HOTEND5_BYTEWIDTH - #define STATUS_HOTEND5_BYTEWIDTH BW(STATUS_HOTEND5_WIDTH) - #endif - #ifndef STATUS_HOTEND6_BYTEWIDTH - #define STATUS_HOTEND6_BYTEWIDTH BW(STATUS_HOTEND6_WIDTH) - #endif - #ifndef STATUS_HOTEND7_BYTEWIDTH - #define STATUS_HOTEND7_BYTEWIDTH BW(STATUS_HOTEND7_WIDTH) - #endif - #ifndef STATUS_HOTEND8_BYTEWIDTH - #define STATUS_HOTEND8_BYTEWIDTH BW(STATUS_HOTEND8_WIDTH) - #endif - - constexpr uint8_t status_hotend_bytewidth[HOTENDS] = ARRAY_N(HOTENDS, STATUS_HOTEND1_BYTEWIDTH, STATUS_HOTEND2_BYTEWIDTH, STATUS_HOTEND3_BYTEWIDTH, STATUS_HOTEND4_BYTEWIDTH, STATUS_HOTEND5_BYTEWIDTH, STATUS_HOTEND6_BYTEWIDTH, STATUS_HOTEND7_BYTEWIDTH, STATUS_HOTEND8_BYTEWIDTH); - #define STATUS_HOTEND_BYTEWIDTH(N) status_hotend_bytewidth[N] - - #ifndef STATUS_HOTEND1_X - #define STATUS_HOTEND1_X STATUS_HEATERS_X - #endif - #ifndef STATUS_HOTEND2_X - #define STATUS_HOTEND2_X STATUS_HOTEND1_X + STATUS_HEATERS_XSPACE - #endif - - #if HOTENDS > 2 - #ifndef STATUS_HOTEND3_X - #define STATUS_HOTEND3_X STATUS_HOTEND2_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND4_X - #define STATUS_HOTEND4_X STATUS_HOTEND3_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND5_X - #define STATUS_HOTEND5_X STATUS_HOTEND4_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND6_X - #define STATUS_HOTEND6_X STATUS_HOTEND5_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND7_X - #define STATUS_HOTEND7_X STATUS_HOTEND6_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND8_X - #define STATUS_HOTEND8_X STATUS_HOTEND7_X + STATUS_HEATERS_XSPACE - #endif - - constexpr uint8_t status_hotend_x[HOTENDS] = ARRAY_N(HOTENDS, STATUS_HOTEND1_X, STATUS_HOTEND2_X, STATUS_HOTEND3_X, STATUS_HOTEND4_X, STATUS_HOTEND5_X, STATUS_HOTEND6_X, STATUS_HOTEND7_X, STATUS_HOTEND8_X); - #define STATUS_HOTEND_X(N) status_hotend_x[N] - #elif HAS_MULTI_HOTEND - #define STATUS_HOTEND_X(N) ((N) ? STATUS_HOTEND2_X : STATUS_HOTEND1_X) - #else - #define STATUS_HOTEND_X(N) STATUS_HOTEND1_X - #endif - - #ifndef STATUS_HOTEND_TEXT_X - #ifdef STATUS_HOTEND1_TEXT_X - #ifndef STATUS_HOTEND2_TEXT_X - #define STATUS_HOTEND2_TEXT_X STATUS_HOTEND1_TEXT_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND3_TEXT_X - #define STATUS_HOTEND3_TEXT_X STATUS_HOTEND2_TEXT_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND4_TEXT_X - #define STATUS_HOTEND4_TEXT_X STATUS_HOTEND3_TEXT_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND5_TEXT_X - #define STATUS_HOTEND5_TEXT_X STATUS_HOTEND4_TEXT_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND6_TEXT_X - #define STATUS_HOTEND6_TEXT_X STATUS_HOTEND5_TEXT_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND7_TEXT_X - #define STATUS_HOTEND7_TEXT_X STATUS_HOTEND6_TEXT_X + STATUS_HEATERS_XSPACE - #endif - #ifndef STATUS_HOTEND8_TEXT_X - #define STATUS_HOTEND8_TEXT_X STATUS_HOTEND7_TEXT_X + STATUS_HEATERS_XSPACE - #endif - constexpr uint8_t status_hotend_text_x[] = ARRAY_N(HOTENDS, STATUS_HOTEND1_TEXT_X, STATUS_HOTEND2_TEXT_X, STATUS_HOTEND3_TEXT_X, STATUS_HOTEND4_TEXT_X, STATUS_HOTEND5_TEXT_X, STATUS_HOTEND6_TEXT_X, STATUS_HOTEND7_TEXT_X, STATUS_HOTEND8_TEXT_X); - #define STATUS_HOTEND_TEXT_X(N) status_hotend_text_x[N] - #else - #define STATUS_HOTEND_TEXT_X(N) (STATUS_HOTEND1_X + 6 + (N) * (STATUS_HEATERS_XSPACE)) - #endif - #endif - - #if STATUS_HOTEND_BITMAPS > 1 && DISABLED(STATUS_HOTEND_NUMBERLESS) - #define TEST_BITMAP_OFF status_hotend1_a_bmp - #define TEST_BITMAP_ON status_hotend1_b_bmp - #else - #define TEST_BITMAP_OFF status_hotend_a_bmp - #define TEST_BITMAP_ON status_hotend_b_bmp - #endif - #ifndef STATUS_HEATERS_HEIGHT - #define STATUS_HEATERS_HEIGHT (sizeof(TEST_BITMAP_OFF) / (STATUS_HOTEND1_BYTEWIDTH)) - #endif - #ifndef STATUS_HEATERS_Y - #define STATUS_HEATERS_Y (20 - (STATUS_HEATERS_HEIGHT)) - #endif - - #define HOTEND0_BITMAP_SIZE (STATUS_HOTEND1_BYTEWIDTH) * (STATUS_HEATERS_HEIGHT) - static_assert( - sizeof(TEST_BITMAP_OFF) == HOTEND0_BITMAP_SIZE, - "Status hotend bitmap (" STRINGIFY(TEST_BITMAP_OFF) ") dimensions don't match data." - ); - #ifdef STATUS_HOTEND_ANIM - static_assert( - sizeof(TEST_BITMAP_ON) == HOTEND0_BITMAP_SIZE, - "Status hotend bitmaps (" STRINGIFY(TEST_BITMAP_OFF) " and " STRINGIFY(TEST_BITMAP_ON) ") dimensions don't match." - ); - #endif - -#elif STATUS_HEATERS_WIDTH - - #ifndef STATUS_HEATERS_XSPACE - #define STATUS_HEATERS_XSPACE 24 - #endif - #ifndef STATUS_HOTEND_WIDTH - #define STATUS_HOTEND_WIDTH(N) 10 - #endif - #ifndef STATUS_HOTEND_X - #define STATUS_HOTEND_X(N) (STATUS_HEATERS_X + 2 + (N) * (STATUS_HEATERS_XSPACE)) - #endif - #ifndef STATUS_HOTEND_TEXT_X - #if HOTENDS == 4 && STATUS_LOGO_WIDTH - #define STATUS_HOTEND_TEXT_X(N) (STATUS_HEATERS_X + 6 + (N) * (STATUS_HEATERS_XSPACE)) - #else - #define STATUS_HOTEND_TEXT_X(N) (STATUS_HEATERS_X + 6 + (N) * (STATUS_HEATERS_XSPACE)) - #endif - #endif - #ifndef STATUS_HEATERS_BYTEWIDTH - #define STATUS_HEATERS_BYTEWIDTH BW(STATUS_HEATERS_WIDTH) - #endif - #ifndef STATUS_HEATERS_HEIGHT - #define STATUS_HEATERS_HEIGHT (sizeof(status_heaters_bmp) / (STATUS_HEATERS_BYTEWIDTH)) - #endif - #ifndef STATUS_HEATERS_Y - #define STATUS_HEATERS_Y (20 - (STATUS_HEATERS_HEIGHT)) - #endif - - static_assert( - sizeof(status_heaters_bmp) == (STATUS_HEATERS_BYTEWIDTH) * (STATUS_HEATERS_HEIGHT), - "Status heaters bitmap (status_heaters_bmp) dimensions don't match data." - ); - -#else // HOTENDS == 0 - - #define STATUS_HOTEND_TEXT_X(N) 0 - #define STATUS_HEATERS_Y 0 - -#endif - -// -// Cutter Bitmap Properties -// -#ifndef STATUS_CUTTER_BYTEWIDTH - #define STATUS_CUTTER_BYTEWIDTH BW(STATUS_CUTTER_WIDTH) -#endif -#if STATUS_CUTTER_WIDTH - - #ifndef STATUS_CUTTER_X - #define STATUS_CUTTER_X (LCD_PIXEL_WIDTH - (STATUS_CUTTER_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) - #endif - - #ifndef STATUS_CUTTER_HEIGHT - #ifdef STATUS_CUTTER_ANIM - #define STATUS_CUTTER_HEIGHT(S) ((S) ? sizeof(status_cutter_on_bmp) / (STATUS_CUTTER_BYTEWIDTH) : sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) - #else - #define STATUS_CUTTER_HEIGHT(S) (sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) - #endif - #endif - - #ifndef STATUS_CUTTER_Y - #define STATUS_CUTTER_Y(S) 4 - #endif - - #ifndef STATUS_CUTTER_TEXT_X - #define STATUS_CUTTER_TEXT_X (STATUS_CUTTER_X -1) - #endif - - #ifndef STATUS_CUTTER_TEXT_Y - #define STATUS_CUTTER_TEXT_Y 28 - #endif - - static_assert( - sizeof(status_cutter_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(0)), - "Status cutter bitmap (status_cutter_bmp) dimensions don't match data." - ); - #ifdef STATUS_CUTTER_ANIM - static_assert( - sizeof(status_cutter_on_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(1)), - "Status cutter bitmap (status_cutter_on_bmp) dimensions don't match data." - ); - #endif - -#endif - -// -// Chamber Bitmap Properties -// -#ifndef STATUS_CHAMBER_BYTEWIDTH - #define STATUS_CHAMBER_BYTEWIDTH BW(STATUS_CHAMBER_WIDTH) -#endif -#if STATUS_CHAMBER_WIDTH - - #ifndef STATUS_CHAMBER_X - #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) - #endif - - #ifndef STATUS_CHAMBER_HEIGHT - #ifdef STATUS_CHAMBER_ANIM - #define STATUS_CHAMBER_HEIGHT(S) ((S) ? sizeof(status_chamber_on_bmp) / (STATUS_CHAMBER_BYTEWIDTH) : sizeof(status_chamber_bmp) / (STATUS_CHAMBER_BYTEWIDTH)) - #else - #define STATUS_CHAMBER_HEIGHT(S) (sizeof(status_chamber_bmp) / (STATUS_CHAMBER_BYTEWIDTH)) - #endif - #endif - - #ifndef STATUS_CHAMBER_Y - #define STATUS_CHAMBER_Y(S) (20 - STATUS_CHAMBER_HEIGHT(S)) - #endif - - #ifndef STATUS_CHAMBER_TEXT_X - #define STATUS_CHAMBER_TEXT_X (STATUS_CHAMBER_X + 11) - #endif - - static_assert( - sizeof(status_chamber_bmp) == (STATUS_CHAMBER_BYTEWIDTH) * (STATUS_CHAMBER_HEIGHT(0)), - "Status chamber bitmap (status_chamber_bmp) dimensions don't match data." - ); - #ifdef STATUS_CHAMBER_ANIM - static_assert( - sizeof(status_chamber_on_bmp) == (STATUS_CHAMBER_BYTEWIDTH) * (STATUS_CHAMBER_HEIGHT(1)), - "Status chamber bitmap (status_chamber_on_bmp) dimensions don't match data." - ); - #endif - -#endif - -// -// Bed Bitmap Properties -// -#ifndef STATUS_BED_BYTEWIDTH - #define STATUS_BED_BYTEWIDTH BW(STATUS_BED_WIDTH) -#endif -#if STATUS_BED_WIDTH && !STATUS_HEATERS_WIDTH - - #ifndef STATUS_BED_X - #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_BED_BYTEWIDTH) * 8) - #endif - - #ifndef STATUS_BED_HEIGHT - #ifdef STATUS_BED_ANIM - #define STATUS_BED_HEIGHT(S) ((S) ? sizeof(status_bed_on_bmp) / (STATUS_BED_BYTEWIDTH) : sizeof(status_bed_bmp) / (STATUS_BED_BYTEWIDTH)) - #else - #define STATUS_BED_HEIGHT(S) (sizeof(status_bed_bmp) / (STATUS_BED_BYTEWIDTH)) - #endif - #endif - - #ifndef STATUS_BED_Y - #define STATUS_BED_Y(S) (20 - STATUS_BED_HEIGHT(S)) - #endif - - #ifndef STATUS_BED_TEXT_X - #define STATUS_BED_TEXT_X (STATUS_BED_X + 9) - #endif - - static_assert( - sizeof(status_bed_bmp) == (STATUS_BED_BYTEWIDTH) * (STATUS_BED_HEIGHT(0)), - "Status bed bitmap (status_bed_bmp) dimensions don't match data." - ); - #ifdef STATUS_BED_ANIM - static_assert( - sizeof(status_bed_on_bmp) == (STATUS_BED_BYTEWIDTH) * (STATUS_BED_HEIGHT(1)), - "Status bed bitmap (status_bed_on_bmp) dimensions don't match data." - ); - #endif -#endif - -// -// Fan Bitmap Properties -// -#ifndef STATUS_FAN_BYTEWIDTH - #define STATUS_FAN_BYTEWIDTH BW(STATUS_FAN_WIDTH) -#endif -#if STATUS_FAN_FRAMES - #ifndef STATUS_FAN_X - #define STATUS_FAN_X (LCD_PIXEL_WIDTH - (STATUS_FAN_BYTEWIDTH) * 8) - #endif - #ifndef STATUS_FAN_Y - #define STATUS_FAN_Y 1 - #endif - #ifndef STATUS_FAN_TEXT_X - #define STATUS_FAN_TEXT_X (STATUS_FAN_X - 1) - #endif - #ifndef STATUS_FAN_TEXT_Y - #define STATUS_FAN_TEXT_Y 28 - #endif - #ifndef STATUS_FAN_HEIGHT - #define STATUS_FAN_HEIGHT (sizeof(status_fan0_bmp) / (STATUS_FAN_BYTEWIDTH)) - #endif - #define FAN_BMP_SIZE (STATUS_FAN_BYTEWIDTH) * (STATUS_FAN_HEIGHT) - static_assert(sizeof(status_fan0_bmp) == FAN_BMP_SIZE, "Status fan bitmap (status_fan0_bmp) dimensions don't match data."); - #if STATUS_FAN_FRAMES > 1 - static_assert(sizeof(status_fan1_bmp) == FAN_BMP_SIZE, "Status fan bitmap (status_fan1_bmp) dimensions don't match data."); - #if STATUS_FAN_FRAMES > 2 - static_assert(sizeof(status_fan2_bmp) == FAN_BMP_SIZE, "Status fan bitmap (status_fan2_bmp) dimensions don't match data."); - #if STATUS_FAN_FRAMES > 3 - static_assert(sizeof(status_fan3_bmp) == FAN_BMP_SIZE, "Status fan bitmap (status_fan3_bmp) dimensions don't match data."); - #endif - #endif - #endif -#endif - -#if STATUS_LOGO_WIDTH && ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) - #define DO_DRAW_LOGO 1 -#endif -#if HOTENDS > 0 - #define DO_DRAW_HOTENDS 1 -#endif -#if HAS_HEATED_BED && HOTENDS <= 4 - #define DO_DRAW_BED 1 -#endif -#if HAS_CUTTER && !DO_DRAW_BED - #define DO_DRAW_CUTTER 1 -#endif -#if HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4 - #define DO_DRAW_CHAMBER 1 -#endif -#if HAS_FAN0 && STATUS_FAN_WIDTH && HOTENDS <= 4 && defined(STATUS_FAN_FRAMES) - #define DO_DRAW_FAN 1 -#endif -#if BOTH(HAS_HOTEND, STATUS_HOTEND_ANIM) - #define ANIM_HOTEND 1 -#endif -#if BOTH(DO_DRAW_BED, STATUS_BED_ANIM) - #define ANIM_BED 1 -#endif -#if BOTH(DO_DRAW_CHAMBER, STATUS_CHAMBER_ANIM) - #define ANIM_CHAMBER 1 -#endif -#if BOTH(DO_DRAW_CUTTER, STATUS_CUTTER_ANIM) - #define ANIM_CUTTER 1 -#endif -#if ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER - #define ANIM_HBCC 1 -#endif diff --git a/Marlin/src/lcd/dogm/dogm_bitmaps.h b/Marlin/src/lcd/dogm/dogm_bitmaps.h new file mode 100644 index 0000000000..d138aa75a5 --- /dev/null +++ b/Marlin/src/lcd/dogm/dogm_bitmaps.h @@ -0,0 +1,1193 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Standard Marlin Boot and Status Screen bitmaps + * + * Use the Marlin Bitmap Converter to make your own: + * http://marlinfw.org/tools/u8glib/converter.html + */ + +#include + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SHOW_BOOTSCREEN) + + //#define START_BMPHIGH // Costs 399 bytes more flash + + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + + #include "../../../_Bootscreen.h" + + #ifndef CUSTOM_BOOTSCREEN_TIMEOUT + #define CUSTOM_BOOTSCREEN_TIMEOUT 2500 + #endif + + #endif + + #if ENABLED(START_BMPHIGH) + + #define START_BMPWIDTH 112 + + const unsigned char start_bmp[] PROGMEM = { + B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, + B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, + B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00111111,B11111111, + B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00011000,B00000000,B00011111,B11111111, + B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00001111,B11111111, + B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000111,B11111111, + B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000011,B11111111, + B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000001,B11111111, + B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000,B11111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000011,B11100000,B01111000,B00111100,B00000011,B11110000,B01111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B01111000,B00111100,B00000111,B11111100,B00111111, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B01111000,B00111100,B00001111,B11111110,B00011111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B01111000,B00111100,B00011111,B11111110,B00001111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B01111000,B00111100,B00111111,B00111111,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B01111000,B00111100,B00111110,B00011111,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B01111100,B00111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B01111111,B10111100,B00111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00111111,B10111111,B11111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00011111,B10111111,B11111100,B00001111,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00001111,B10111111,B11111100,B00001111,B00000011, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, + B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, + B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, + B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, + B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 + }; + + #else + + #define START_BMPWIDTH 56 + + const unsigned char start_bmp[] PROGMEM = { + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B10000011,B11001111,B00000000,B00000000,B00001100,B00110000,B00111111, + B10000111,B11111111,B10000000,B00000000,B00001100,B00110000,B00011111, + B10000110,B01111001,B10000000,B00000000,B00001100,B00000000,B00001111, + B10001100,B00110000,B11000111,B10000011,B10001100,B00110000,B11100111, + B10001100,B00110000,B11001111,B11000111,B11001100,B00110001,B11110011, + B10001100,B00110000,B11011100,B11101100,B11101100,B00110011,B10111001, + B10001100,B00110000,B11011000,B01101100,B01101100,B00110011,B00011001, + B10001100,B00110000,B11010000,B01101100,B00001100,B00110011,B00011001, + B10001100,B00110000,B11011000,B01101100,B00001100,B00110011,B00011001, + B10001100,B00110000,B11011100,B01101100,B00001110,B00111011,B00011001, + B10001100,B00110000,B11001111,B01111100,B00000111,B10011111,B00011001, + B10001100,B00110000,B11000111,B01111100,B00000011,B10001111,B00011001, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 + }; + + #endif + + #ifndef START_BMP_BYTEWIDTH + #define START_BMP_BYTEWIDTH ((START_BMPWIDTH + 7) / 8) + #endif + #ifndef START_BMPHEIGHT + #define START_BMPHEIGHT (sizeof(start_bmp) / (START_BMP_BYTEWIDTH)) + #endif + + static_assert(sizeof(start_bmp) == (START_BMP_BYTEWIDTH) * (START_BMPHEIGHT), "Bootscreen (start_bmp) dimensions don't match data."); + +#endif + +#if ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) + + // This file must define STATUS_SCREENWIDTH and status_screen[012]_bmp. + // It can also define STATUS_SCREEN_X, STATUS_SCREEN_{BED,FAN}_TEXT_X and + // STATUS_SCREEN_HOTEND_TEXT_X(i) to modify draw locations. + #include "../../../_Statusscreen.h" + +#else // !CUSTOM_STATUS_SCREEN_IMAGE + + // Can also be overridden in Configuration.h + // If you can afford it, try the 3-frame fan animation! + #ifndef FAN_ANIM_FRAMES + #define FAN_ANIM_FRAMES 2 + #endif + + #if HAS_HEATED_BED + + #define STATUS_SCREEN_X ( 8 + (HOTENDS ? 0 : 64)) + #define STATUS_SCREENWIDTH (120 - (HOTENDS ? 0 : 64)) + + #if HOTENDS == 0 + + #if FAN_ANIM_FRAMES == 3 + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B00000000,B00100000,B10000010,B00000000,B00100001,B11111111,B00001000, + B00000000,B00010000,B01000001,B00000000,B00100000,B01111100,B00001000, + B00000000,B00010000,B01000001,B00000000,B00100000,B01111100,B00001000, + B00000000,B00100000,B10000010,B00000000,B00100000,B01111100,B00001000, + B00000000,B01000001,B00000100,B00000000,B00100001,B11111111,B00001000, + B00000000,B10000010,B00001000,B00000000,B00100111,B11000111,B11001000, + B00000000,B10000010,B00001000,B00000000,B00101111,B11000111,B11101000, + B00000000,B01000001,B00000100,B00000000,B00110111,B10000011,B11011000, + B00000000,B00100000,B10000010,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00110000,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B01101000, + B00000000,B00000000,B00000000,B00000000,B00100000,B00110001,B11101000, + B00000000,B00100000,B10000010,B00000000,B00100000,B00111001,B11101000, + B00000000,B00010000,B01000001,B00000000,B00100000,B01111111,B11111000, + B00000000,B00010000,B01000001,B00000000,B00111111,B11111111,B11111000, + B00000000,B00100000,B10000010,B00000000,B00111111,B11111100,B00001000, + B00000000,B01000001,B00000100,B00000000,B00101111,B00111000,B00001000, + B00000000,B10000010,B00001000,B00000000,B00101110,B00011000,B00001000, + B00000000,B10000010,B00001000,B00000000,B00101100,B00011110,B00001000, + B00000000,B01000001,B00000100,B00000000,B00110000,B00011110,B00011000, + B00000000,B00100000,B10000010,B00000000,B00110000,B00011111,B00011000, + B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B11111111,B11111111,B11000000,B00111110,B00011000,B11111000, + B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B10011000, + B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B00011000, + B00000000,B00000000,B00000000,B00000000,B00101110,B00011110,B00001000, + B00000000,B00000000,B00000000,B00000000,B00101111,B00011100,B00001000, + B00000000,B00100000,B10000010,B00000000,B00101111,B10111000,B00001000, + B00000000,B00010000,B01000001,B00000000,B00111111,B11111100,B00001000, + B00000000,B00010000,B01000001,B00000000,B00111111,B11111111,B11111000, + B00000000,B00100000,B10000010,B00000000,B00100000,B01111111,B11111000, + B00000000,B01000001,B00000100,B00000000,B00100000,B00111011,B11101000, + B00000000,B10000010,B00001000,B00000000,B00100000,B01110001,B11101000, + B00000000,B10000010,B00001000,B00000000,B00100000,B11110000,B11101000, + B00000000,B01000001,B00000100,B00000000,B00110001,B11110000,B01011000, + B00000000,B00100000,B10000010,B00000000,B00110011,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00000000,B11111111,B11111111,B11000000,B00111110,B00110000,B11111000, + B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + #else + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00000000,B00100000,B10000010,B00000000,B00101110,B00110001,B11010000, + B00000000,B00010000,B01000001,B00000000,B00101111,B01111011,B11010000, + B00000000,B00010000,B01000001,B00000000,B00101111,B01111011,B11010000, + B00000000,B00100000,B10000010,B00000000,B00101110,B00110001,B11010000, + B00000000,B01000001,B00000100,B00000000,B00101100,B00000000,B11010000, + B00000000,B10000010,B00001000,B00000000,B00100000,B00110000,B00010000, + B00000000,B10000010,B00001000,B00000000,B00100000,B01111000,B00010000, + B00000000,B01000001,B00000100,B00000000,B00100000,B11111100,B00010000, + B00000000,B00100000,B10000010,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B00000000,B00010000,B01000001,B00000000,B00100000,B01111000,B00010000, + B00000000,B00010000,B01000001,B00000000,B00100000,B01111000,B00010000, + B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B00000000,B01000001,B00000100,B00000000,B00101111,B00000011,B11010000, + B00000000,B10000010,B00001000,B00000000,B00101111,B10000111,B11010000, + B00000000,B10000010,B00001000,B00000000,B00100111,B10000111,B10010000, + B00000000,B01000001,B00000100,B00000000,B00100011,B10000111,B00010000, + B00000000,B00100000,B10000010,B00000000,B00110001,B10000110,B00110000, + B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + #endif + + #elif HOTENDS == 1 + + #if FAN_ANIM_FRAMES == 3 + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100001,B11111111,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111100,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111100,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B01111100,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00100001,B11111111,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100111,B11000111,B11001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00101111,B11000111,B11101000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00110111,B10000011,B11011000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110111,B10000011,B11011000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B01101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110001,B11101000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B00111001,B11101000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111111,B11111000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00111111,B11111111,B11111000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00111111,B11111100,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00101111,B00111000,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00101110,B00011000,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00101100,B00011110,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00110000,B00011110,B00011000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110000,B00011111,B00011000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111110,B00011000,B11111000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B10011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011110,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011100,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00101111,B10111000,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00111111,B11111100,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00111111,B11111111,B11111000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B01111111,B11111000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00100000,B00111011,B11101000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100000,B01110001,B11101000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100000,B11110000,B11101000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00110001,B11110000,B01011000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110011,B11110000,B00011000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111110,B00110000,B11111000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + #else + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00101110,B00110001,B11010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00101111,B01111011,B11010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00101111,B01111011,B11010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00101110,B00110001,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00101100,B00000000,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100000,B00110000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100000,B01111000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00100000,B11111100,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110000,B11111100,B00110000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00101111,B00000011,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00101111,B10000111,B11010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100111,B10000111,B10010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00100011,B10000111,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110001,B10000110,B00110000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + #endif + + #elif HOTENDS == 2 + + #if FAN_ANIM_FRAMES == 3 + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100001,B11111111,B00001000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111100,B00001000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111100,B00001000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B01111100,B00001000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00100001,B11111111,B00001000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100111,B11000111,B11001000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00101111,B11000111,B11101000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00110111,B10000011,B11011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110111,B10000011,B11011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B01101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110001,B11101000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B00111001,B11101000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111111,B11111000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00111111,B11111111,B11111000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00111111,B11111100,B00001000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00101111,B00111000,B00001000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00101110,B00011000,B00001000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00101100,B00011110,B00001000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00110000,B00011110,B00011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110000,B00011111,B00011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111110,B00011000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B10011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011110,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011100,B00001000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00101111,B10111000,B00001000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00111111,B11111100,B00001000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00111111,B11111111,B11111000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B01111111,B11111000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00100000,B00111011,B11101000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100000,B01110001,B11101000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100000,B11110000,B11101000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00110001,B11110000,B01011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110011,B11110000,B00011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111110,B00110000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + #else + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00101110,B00110001,B11010000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00101111,B01111011,B11010000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00101111,B01111011,B11010000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00101110,B00110001,B11010000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00101100,B00000000,B11010000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100000,B00110000,B00010000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100000,B01111000,B00010000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00100000,B11111100,B00010000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110000,B11111100,B00110000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111000,B00010000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111000,B00010000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00101111,B00000011,B11010000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00101111,B10000111,B11010000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B10000010,B00001000,B00000000,B00100111,B10000111,B10010000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B01000001,B00000100,B00000000,B00100011,B10000111,B00010000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00100000,B10000010,B00000000,B00110001,B10000110,B00110000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + #endif + + #else // HOTENDS > 2 + + #if FAN_ANIM_FRAMES == 3 + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00100000,B10000010,B00000000,B00100001,B11111111,B00001000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111100,B00001000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111100,B00001000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00100000,B10000010,B00000000,B00100000,B01111100,B00001000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B01000001,B00000100,B00000000,B00100001,B11111111,B00001000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B10000010,B00001000,B00000000,B00100111,B11000111,B11001000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B10000010,B00001000,B00000000,B00101111,B11000111,B11101000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B01000001,B00000100,B00000000,B00110111,B10000011,B11011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00100000,B10000010,B00000000,B00110111,B10000011,B11011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B11111111,B11111111,B11000000,B00111110,B00000000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B01101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110001,B11101000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00100000,B10000010,B00000000,B00100000,B00111001,B11101000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111111,B11111000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000,B00111111,B11111111,B11111000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00100000,B10000010,B00000000,B00111111,B11111100,B00001000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B01000001,B00000100,B00000000,B00101111,B00111000,B00001000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B10000010,B00001000,B00000000,B00101110,B00011000,B00001000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B10000010,B00001000,B00000000,B00101100,B00011110,B00001000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B01000001,B00000100,B00000000,B00110000,B00011110,B00011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00100000,B10000010,B00000000,B00110000,B00011111,B00011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B11111111,B11111111,B11000000,B00111110,B00011000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B10011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011110,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011100,B00001000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00100000,B10000010,B00000000,B00101111,B10111000,B00001000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00010000,B01000001,B00000000,B00111111,B11111100,B00001000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000,B00111111,B11111111,B11111000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00100000,B10000010,B00000000,B00100000,B01111111,B11111000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B01000001,B00000100,B00000000,B00100000,B00111011,B11101000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B10000010,B00001000,B00000000,B00100000,B01110001,B11101000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B10000010,B00001000,B00000000,B00100000,B11110000,B11101000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B01000001,B00000100,B00000000,B00110001,B11110000,B01011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00100000,B10000010,B00000000,B00110011,B11110000,B00011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B11111111,B11111111,B11000000,B00111110,B00110000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11111000 + }; + #else + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00100000,B10000010,B00000000,B00101110,B00110001,B11010000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00010000,B01000001,B00000000,B00101111,B01111011,B11010000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000,B00101111,B01111011,B11010000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00100000,B10000010,B00000000,B00101110,B00110001,B11010000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B01000001,B00000100,B00000000,B00101100,B00000000,B11010000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B10000010,B00001000,B00000000,B00100000,B00110000,B00010000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B10000010,B00001000,B00000000,B00100000,B01111000,B00010000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B01000001,B00000100,B00000000,B00100000,B11111100,B00010000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00100000,B10000010,B00000000,B00110000,B11111100,B00110000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111000,B00010000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000,B00100000,B01111000,B00010000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00100000,B10000010,B00000000,B00100000,B00110000,B00010000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B01000001,B00000100,B00000000,B00101111,B00000011,B11010000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B10000010,B00001000,B00000000,B00101111,B10000111,B11010000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B10000010,B00001000,B00000000,B00100111,B10000111,B10010000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B01000001,B00000100,B00000000,B00100011,B10000111,B00010000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00100000,B10000010,B00000000,B00110001,B10000110,B00110000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B11111111,B11111111,B11000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000 + }; + #endif + + #endif // HOTENDS + + #else // !HAS_HEATED_BED + + #define STATUS_SCREEN_X ( 8 + (HOTENDS ? 0 : 96)) + #define STATUS_SCREENWIDTH (120 - (HOTENDS ? 0 : 96)) + + #if HOTENDS == 0 + + #if FAN_ANIM_FRAMES == 3 + const unsigned char status_screen0_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00000000,B11111000, + B00111001,B00000001,B00111000, + B00110111,B10000011,B11011000, + B00110111,B10000011,B11011000, + B00101111,B11000111,B11101000, + B00100111,B11000111,B11001000, + B00100001,B11111111,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100001,B11111111,B00001000, + B00100111,B11000111,B11001000, + B00101111,B11000111,B11101000, + B00110111,B10000011,B11011000, + B00110111,B10000011,B11011000, + B00111001,B00000001,B00111000, + B00111110,B00000000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00110000,B11111000, + B00111001,B11110000,B00111000, + B00110001,B11110000,B00011000, + B00110000,B11110000,B00011000, + B00100000,B11110000,B01101000, + B00100000,B00110001,B11101000, + B00100000,B00111001,B11101000, + B00100000,B01111111,B11111000, + B00111111,B11111111,B11111000, + B00111111,B11111100,B00001000, + B00101111,B00111000,B00001000, + B00101110,B00011000,B00001000, + B00101100,B00011110,B00001000, + B00110000,B00011110,B00011000, + B00110000,B00011111,B00011000, + B00111000,B00011111,B00111000, + B00111110,B00011000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00011000,B11111000, + B00111000,B00011111,B00111000, + B00110000,B00011111,B10011000, + B00110100,B00011111,B00011000, + B00101110,B00011110,B00001000, + B00101111,B00011100,B00001000, + B00101111,B10111000,B00001000, + B00111111,B11111100,B00001000, + B00111111,B11111111,B11111000, + B00100000,B01111111,B11111000, + B00100000,B00111011,B11101000, + B00100000,B01110001,B11101000, + B00100000,B11110000,B11101000, + B00110001,B11110000,B01011000, + B00110011,B11110000,B00011000, + B00111001,B11110000,B00111000, + B00111110,B00110000,B11111000, + B00111111,B11111111,B11111000 + }; + #else + const unsigned char status_screen0_bmp[] PROGMEM = { + B00111111,B11111111,B11110000, + B00111000,B00000000,B01110000, + B00110000,B11111100,B00110000, + B00100000,B11111100,B00010000, + B00100000,B01111000,B00010000, + B00100000,B00110000,B00010000, + B00101100,B00000000,B11010000, + B00101110,B00110001,B11010000, + B00101111,B01111011,B11010000, + B00101111,B01111011,B11010000, + B00101110,B00110001,B11010000, + B00101100,B00000000,B11010000, + B00100000,B00110000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B11111100,B00010000, + B00110000,B11111100,B00110000, + B00111000,B00000000,B01110000, + B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00111111,B11111111,B11110000, + B00111000,B00000000,B01110000, + B00110001,B10000110,B00110000, + B00100011,B10000111,B00010000, + B00100111,B10000111,B10010000, + B00101111,B10000111,B11010000, + B00101111,B00000011,B11010000, + B00100000,B00110000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B00110000,B00010000, + B00101111,B00000011,B11010000, + B00101111,B10000111,B11010000, + B00100111,B10000111,B10010000, + B00100011,B10000111,B00010000, + B00110001,B10000110,B00110000, + B00111000,B00000000,B01110000, + B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000 + }; + #endif + + #elif HOTENDS == 1 + + #if FAN_ANIM_FRAMES == 3 + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100001,B11111111,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111100,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111100,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111100,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100001,B11111111,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B01101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110001,B11101000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00111001,B11101000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111111,B11111000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111100,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00111000,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011000,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00011110,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011110,B00011000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B00011000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B10011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011110,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011100,B00001000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10111000,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111100,B00001000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111111,B11111000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00111011,B11101000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01110001,B11101000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B11101000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B01011000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B11110000,B00011000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000 + }; + #else + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00110001,B11010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B01111011,B11010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B01111011,B11010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00110001,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00011111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 + }; + #endif + + #elif HOTENDS == 2 + + #if FAN_ANIM_FRAMES == 3 + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100001,B11111111,B00001000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111100,B00001000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111100,B00001000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111100,B00001000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100001,B11111111,B00001000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B01101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110001,B11101000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00111001,B11101000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111111,B11111000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111100,B00001000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00111000,B00001000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011000,B00001000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00011110,B00001000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011110,B00011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B00011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B10011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011110,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011100,B00001000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10111000,B00001000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111100,B00001000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111111,B11111000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00111011,B11101000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01110001,B11101000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B11101000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B01011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110011,B11110000,B00011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000 + }; + #else + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00110001,B11010000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B01111011,B11010000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B01111011,B11010000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00110001,B11010000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 + }; + #endif + + #else // HOTENDS > 2 + + #if FAN_ANIM_FRAMES == 3 + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00100001,B11111111,B00001000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111100,B00001000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111100,B00001000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111100,B00001000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00000000,B00000000,B00000000,B00100001,B11111111,B00001000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11110000,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B01101000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110001,B11101000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00100000,B00111001,B11101000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111111,B11111000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111100,B00001000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00000000,B00000000,B00000000,B00101111,B00111000,B00001000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011000,B00001000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00101100,B00011110,B00001000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011110,B00011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B00011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000 + }; + const unsigned char status_screen2_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B10011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B00011000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011110,B00001000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011100,B00001000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00101111,B10111000,B00001000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111100,B00001000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111111,B11111000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00000000,B00000000,B00000000,B00100000,B00111011,B11101000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00000000,B00000000,B00000000,B00100000,B01110001,B11101000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B11101000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B01011000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00110011,B11110000,B00011000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000 + }; + #else + const unsigned char status_screen0_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00101110,B00110001,B11010000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00101111,B01111011,B11010000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00101111,B01111011,B11010000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00101110,B00110001,B11010000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 + }; + const unsigned char status_screen1_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000, + B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000, + B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000, + B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000, + B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000, + B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000, + B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000, + B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000, + B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000, + B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000 + }; + #endif + + #endif // HOTENDS + + #endif // !HAS_HEATED_BED + +#endif // !CUSTOM_STATUS_SCREEN_IMAGE + +#if ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) || ENABLED(MESH_EDIT_GFX_OVERLAY) + + const unsigned char cw_bmp[] PROGMEM = { + B00000011,B11111000,B00000000, + B00001111,B11111110,B00000000, + B00011110,B00001111,B00000000, + B00111000,B00000111,B00000000, + B00111000,B00000011,B10000000, + B01110000,B00000011,B10000000, + B01110000,B00001111,B11100000, + B01110000,B00000111,B11000000, + B01110000,B00000011,B10000000, + B01110000,B00000001,B00000000, + B01110000,B00000000,B00000000, + B00111000,B00000000,B00000000, + B00111000,B00000111,B00000000, + B00011110,B00001111,B00000000, + B00001111,B11111110,B00000000, + B00000011,B11111000,B00000000 + }; + + const unsigned char ccw_bmp[] PROGMEM = { + B00000000,B11111110,B00000000, + B00000011,B11111111,B10000000, + B00000111,B10000011,B11000000, + B00001110,B00000001,B11000000, + B00001110,B00000000,B11100000, + B00011100,B00000000,B11100000, + B01111111,B00000000,B11100000, + B00111110,B00000000,B11100000, + B00011100,B00000000,B11100000, + B00001000,B00000000,B11100000, + B00000000,B00000000,B11100000, + B00000000,B00000001,B11000000, + B00001110,B00000001,B11000000, + B00001111,B00000111,B10000000, + B00000111,B11111111,B00000000, + B00000001,B11111100,B00000000 + }; + + const unsigned char up_arrow_bmp[] PROGMEM = { + B00000100,B00000000, + B00001110,B00000000, + B00011111,B00000000, + B00111111,B10000000, + B01111111,B11000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000 + }; + + const unsigned char down_arrow_bmp[] PROGMEM = { + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B01111111,B11000000, + B00111111,B10000000, + B00011111,B00000000, + B00001110,B00000000, + B00000100,B00000000 + }; + + const unsigned char offset_bedline_bmp[] PROGMEM = { + B11111111,B11111111,B11111111 + }; + + const unsigned char nozzle_bmp[] PROGMEM = { + B01111111,B10000000, + B11111111,B11000000, + B11111111,B11000000, + B11111111,B11000000, + B01111111,B10000000, + B01111111,B10000000, + B11111111,B11000000, + B11111111,B11000000, + B11111111,B11000000, + B00111111,B00000000, + B00011110,B00000000, + B00001100,B00000000 + }; + +#endif // BABYSTEP_ZPROBE_GFX_OVERLAY || MESH_EDIT_GFX_OVERLAY + +#ifndef CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH + #define CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH ((CUSTOM_BOOTSCREEN_BMPWIDTH + 7) / 8) +#endif +#ifndef CUSTOM_BOOTSCREEN_BMPHEIGHT + #define CUSTOM_BOOTSCREEN_BMPHEIGHT (sizeof(custom_start_bmp) / (CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH)) +#endif + +#ifndef FAN_ANIM_FRAMES + #define FAN_ANIM_FRAMES 2 +#elif FAN_ANIM_FRAMES > 3 + #error "Only 3 fan animation frames currently supported." +#endif +#ifndef STATUS_SCREEN_X + #define STATUS_SCREEN_X 0 +#endif +#ifndef STATUS_SCREEN_Y + #define STATUS_SCREEN_Y 1 +#endif +#ifndef STATUS_BMP_BYTEWIDTH + #define STATUS_BMP_BYTEWIDTH ((STATUS_SCREENWIDTH + 7) / 8) +#endif +#ifndef STATUS_SCREENHEIGHT + #define STATUS_SCREENHEIGHT (sizeof(status_screen0_bmp) / (STATUS_BMP_BYTEWIDTH)) +#endif +#ifndef STATUS_SCREEN_HOTEND_TEXT_X + #define STATUS_SCREEN_HOTEND_TEXT_X(i) (5 + (i) * 25) +#endif +#ifndef STATUS_SCREEN_BED_TEXT_X + #define STATUS_SCREEN_BED_TEXT_X 81 +#endif +#ifndef STATUS_SCREEN_FAN_TEXT_X + #define STATUS_SCREEN_FAN_TEXT_X 104 +#endif +#ifndef STATUS_SCREEN_FAN_TEXT_Y + #define STATUS_SCREEN_FAN_TEXT_Y (FAN_ANIM_FRAMES > 2 ? 28 : 27) +#endif + +#define BMP_SIZE (STATUS_BMP_BYTEWIDTH) * (STATUS_SCREENHEIGHT) +static_assert(sizeof(status_screen0_bmp) == BMP_SIZE, "Status header (status_screen0_bmp) dimensions don't match data."); +#if FAN_ANIM_FRAMES > 1 + static_assert(sizeof(status_screen1_bmp) == BMP_SIZE, "Status header (status_screen1_bmp) dimensions don't match data."); + #if FAN_ANIM_FRAMES > 2 + static_assert(sizeof(status_screen2_bmp) == BMP_SIZE, "Status header (status_screen2_bmp) dimensions don't match data."); + #if FAN_ANIM_FRAMES > 3 + static_assert(sizeof(status_screen3_bmp) == BMP_SIZE, "Status header (status_screen3_bmp) dimensions don't match data."); + #endif + #endif +#endif diff --git a/Marlin/src/lcd/dogm/dogm_font_data_6x9_marlin.h b/Marlin/src/lcd/dogm/dogm_font_data_6x9_marlin.h new file mode 100644 index 0000000000..f298a6ac78 --- /dev/null +++ b/Marlin/src/lcd/dogm/dogm_font_data_6x9_marlin.h @@ -0,0 +1,180 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + Fontname: -Misc-Fixed-Medium-R-Normal--9-90-75-75-C-60-ISO10646-1 + Copyright: Public domain font. Share and enjoy. + Capital A Height: 6, '1' Height: 6 + Calculated Max Values w= 6 h= 9 x= 2 y= 7 dx= 6 dy= 0 ascent= 7 len= 9 + Font Bounding box w= 6 h= 9 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 6 descent=-2 + X Font ascent = 6 descent=-2 + Max Font ascent = 7 descent=-2 +*/ +#include +const u8g_fntpgm_uint8_t u8g_font_6x9[2300] U8G_SECTION(".progmem.u8g_font_6x9") = { + 0, 6, 9, 0, 254, 6, 1, 137, 2, 254, 32, 255, 254, 7, 254, 6, + 254, 0, 0, 0, 6, 0, 7, 1, 6, 6, 6, 2, 0, 128, 128, 128, + 128, 0, 128, 3, 3, 3, 6, 1, 3, 160, 160, 160, 5, 7, 7, 6, + 0, 255, 80, 80, 248, 80, 248, 80, 80, 5, 9, 9, 6, 0, 254, 32, + 112, 168, 160, 112, 40, 168, 112, 32, 6, 8, 8, 6, 0, 255, 64, 168, + 72, 16, 32, 72, 84, 8, 5, 7, 7, 6, 0, 255, 96, 144, 144, 96, + 152, 144, 104, 1, 3, 3, 6, 2, 3, 128, 128, 128, 2, 7, 7, 6, + 2, 255, 64, 128, 128, 128, 128, 128, 64, 2, 7, 7, 6, 2, 255, 128, + 64, 64, 64, 64, 64, 128, 5, 5, 5, 6, 0, 0, 136, 80, 248, 80, + 136, 5, 5, 5, 6, 0, 0, 32, 32, 248, 32, 32, 2, 4, 4, 6, + 2, 254, 192, 64, 64, 128, 5, 1, 1, 6, 0, 2, 248, 2, 2, 2, + 6, 2, 0, 192, 192, 4, 6, 6, 6, 1, 0, 16, 16, 32, 64, 128, + 128, 4, 6, 6, 6, 1, 0, 96, 144, 144, 144, 144, 96, 3, 6, 6, + 6, 1, 0, 64, 192, 64, 64, 64, 224, 4, 6, 6, 6, 1, 0, 96, + 144, 16, 32, 64, 240, 4, 6, 6, 6, 1, 0, 240, 32, 96, 16, 16, + 224, 5, 6, 6, 6, 0, 0, 16, 48, 80, 144, 248, 16, 4, 6, 6, + 6, 1, 0, 240, 128, 224, 16, 16, 224, 4, 6, 6, 6, 1, 0, 96, + 128, 224, 144, 144, 96, 4, 6, 6, 6, 1, 0, 240, 16, 16, 32, 64, + 64, 4, 6, 6, 6, 1, 0, 96, 144, 96, 144, 144, 96, 4, 6, 6, + 6, 1, 0, 96, 144, 144, 112, 16, 96, 2, 5, 5, 6, 2, 0, 192, + 192, 0, 192, 192, 2, 7, 7, 6, 2, 254, 192, 192, 0, 192, 64, 64, + 128, 5, 5, 5, 6, 0, 0, 24, 96, 128, 96, 24, 5, 3, 3, 6, + 0, 1, 248, 0, 248, 5, 5, 5, 6, 0, 0, 192, 48, 8, 48, 192, + 4, 7, 7, 6, 1, 0, 96, 144, 16, 96, 64, 0, 64, 5, 6, 6, + 6, 0, 0, 112, 144, 168, 176, 128, 112, 5, 6, 6, 6, 0, 0, 32, + 80, 136, 248, 136, 136, 5, 6, 6, 6, 0, 0, 240, 136, 240, 136, 136, + 240, 4, 6, 6, 6, 1, 0, 96, 144, 128, 128, 144, 96, 4, 6, 6, + 6, 1, 0, 224, 144, 144, 144, 144, 224, 4, 6, 6, 6, 1, 0, 240, + 128, 224, 128, 128, 240, 4, 6, 6, 6, 1, 0, 240, 128, 224, 128, 128, + 128, 4, 6, 6, 6, 1, 0, 96, 144, 128, 176, 144, 96, 4, 6, 6, + 6, 1, 0, 144, 144, 240, 144, 144, 144, 3, 6, 6, 6, 1, 0, 224, + 64, 64, 64, 64, 224, 5, 6, 6, 6, 0, 0, 56, 16, 16, 16, 144, + 96, 4, 6, 6, 6, 1, 0, 144, 160, 192, 160, 144, 144, 4, 6, 6, + 6, 1, 0, 128, 128, 128, 128, 128, 240, 5, 6, 6, 6, 0, 0, 136, + 216, 168, 168, 136, 136, 4, 6, 6, 6, 1, 0, 144, 208, 176, 144, 144, + 144, 5, 6, 6, 6, 0, 0, 112, 136, 136, 136, 136, 112, 4, 6, 6, + 6, 1, 0, 224, 144, 144, 224, 128, 128, 4, 7, 7, 6, 1, 255, 96, + 144, 144, 208, 176, 96, 16, 4, 6, 6, 6, 1, 0, 224, 144, 144, 224, + 144, 144, 4, 6, 6, 6, 1, 0, 96, 144, 64, 32, 144, 96, 5, 6, + 6, 6, 0, 0, 248, 32, 32, 32, 32, 32, 4, 6, 6, 6, 1, 0, + 144, 144, 144, 144, 144, 96, 4, 6, 6, 6, 1, 0, 144, 144, 144, 240, + 96, 96, 5, 6, 6, 6, 0, 0, 136, 136, 168, 168, 216, 136, 5, 6, + 6, 6, 0, 0, 136, 80, 32, 32, 80, 136, 5, 6, 6, 6, 0, 0, + 136, 136, 80, 32, 32, 32, 4, 6, 6, 6, 1, 0, 240, 16, 32, 64, + 128, 240, 3, 6, 6, 6, 1, 0, 224, 128, 128, 128, 128, 224, 4, 6, + 6, 6, 1, 0, 128, 128, 64, 32, 16, 16, 3, 6, 6, 6, 1, 0, + 224, 32, 32, 32, 32, 224, 5, 3, 3, 6, 0, 3, 32, 80, 136, 5, + 1, 1, 6, 0, 254, 248, 2, 2, 2, 6, 2, 4, 128, 64, 4, 4, + 4, 6, 1, 0, 112, 144, 144, 112, 4, 6, 6, 6, 1, 0, 128, 128, + 224, 144, 144, 224, 4, 4, 4, 6, 1, 0, 112, 128, 128, 112, 4, 6, + 6, 6, 1, 0, 16, 16, 112, 144, 144, 112, 4, 4, 4, 6, 1, 0, + 96, 176, 192, 112, 4, 6, 6, 6, 1, 0, 32, 80, 64, 224, 64, 64, + 4, 6, 6, 6, 1, 254, 96, 144, 144, 112, 16, 96, 4, 6, 6, 6, + 1, 0, 128, 128, 224, 144, 144, 144, 3, 6, 6, 6, 1, 0, 64, 0, + 192, 64, 64, 224, 3, 8, 8, 6, 1, 254, 32, 0, 96, 32, 32, 32, + 160, 64, 4, 6, 6, 6, 1, 0, 128, 128, 160, 192, 160, 144, 3, 6, + 6, 6, 1, 0, 192, 64, 64, 64, 64, 224, 5, 4, 4, 6, 0, 0, + 208, 168, 168, 136, 4, 4, 4, 6, 1, 0, 224, 144, 144, 144, 4, 4, + 4, 6, 1, 0, 96, 144, 144, 96, 4, 6, 6, 6, 1, 254, 224, 144, + 144, 224, 128, 128, 4, 6, 6, 6, 1, 254, 112, 144, 144, 112, 16, 16, + 4, 4, 4, 6, 1, 0, 160, 208, 128, 128, 4, 4, 4, 6, 1, 0, + 112, 192, 48, 224, 4, 6, 6, 6, 1, 0, 64, 64, 224, 64, 80, 32, + 4, 4, 4, 6, 1, 0, 144, 144, 144, 112, 4, 4, 4, 6, 1, 0, + 144, 144, 96, 96, 5, 4, 4, 6, 0, 0, 136, 168, 168, 80, 4, 4, + 4, 6, 1, 0, 144, 96, 96, 144, 4, 6, 6, 6, 1, 254, 144, 144, + 144, 112, 144, 96, 4, 4, 4, 6, 1, 0, 240, 32, 64, 240, 3, 7, + 7, 6, 1, 0, 32, 64, 64, 128, 64, 64, 32, 1, 7, 7, 6, 2, + 255, 128, 128, 128, 128, 128, 128, 128, 3, 7, 7, 6, 1, 0, 128, 64, + 64, 32, 64, 64, 128, 4, 2, 2, 6, 1, 3, 80, 160, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, + 0, 6, 0, 7, 1, 6, 6, 6, 2, 0, 128, 0, 128, 128, 128, 128, + 4, 6, 6, 6, 1, 255, 32, 112, 160, 160, 112, 32, 5, 7, 7, 6, + 0, 255, 48, 72, 64, 240, 64, 64, 248, 5, 5, 5, 6, 0, 0, 168, + 80, 136, 80, 168, 5, 6, 6, 6, 0, 0, 136, 80, 248, 32, 248, 32, + 1, 7, 7, 6, 2, 255, 128, 128, 128, 0, 128, 128, 128, 4, 7, 7, + 6, 1, 255, 112, 128, 96, 144, 96, 16, 224, 3, 1, 1, 6, 1, 5, + 160, 6, 7, 7, 6, 0, 0, 120, 132, 148, 164, 148, 132, 120, 3, 5, + 5, 6, 1, 1, 96, 160, 96, 0, 224, 5, 5, 5, 6, 0, 0, 40, + 80, 160, 80, 40, 4, 3, 3, 6, 1, 0, 240, 16, 16, 4, 1, 1, + 6, 1, 2, 240, 6, 7, 7, 6, 0, 0, 120, 132, 180, 164, 164, 132, + 120, 4, 1, 1, 6, 1, 5, 240, 4, 3, 3, 6, 1, 2, 96, 144, + 96, 5, 7, 7, 6, 0, 255, 32, 32, 248, 32, 32, 0, 248, 3, 5, + 5, 6, 1, 1, 64, 160, 32, 64, 224, 3, 5, 5, 6, 1, 1, 192, + 32, 64, 32, 192, 2, 2, 2, 6, 2, 4, 64, 128, 4, 5, 5, 6, + 1, 255, 144, 144, 176, 208, 128, 5, 6, 6, 6, 0, 0, 120, 232, 232, + 104, 40, 40, 1, 1, 1, 6, 2, 2, 128, 2, 2, 2, 6, 2, 254, + 64, 128, 3, 5, 5, 6, 1, 1, 64, 192, 64, 64, 224, 3, 5, 5, + 6, 1, 1, 64, 160, 64, 0, 224, 5, 5, 5, 6, 0, 0, 160, 80, + 40, 80, 160, 5, 8, 8, 6, 0, 255, 64, 192, 64, 80, 112, 48, 120, + 16, 5, 8, 8, 6, 0, 255, 64, 192, 64, 80, 104, 8, 16, 56, 5, + 8, 8, 6, 0, 255, 192, 32, 64, 48, 240, 48, 120, 16, 4, 7, 7, + 6, 1, 0, 32, 0, 32, 96, 128, 144, 96, 5, 7, 7, 6, 0, 0, + 64, 32, 32, 80, 112, 136, 136, 5, 7, 7, 6, 0, 0, 16, 32, 32, + 80, 112, 136, 136, 5, 7, 7, 6, 0, 0, 32, 80, 32, 80, 112, 136, + 136, 5, 7, 7, 6, 0, 0, 40, 80, 32, 80, 112, 136, 136, 5, 7, + 7, 6, 0, 0, 80, 0, 32, 80, 112, 136, 136, 5, 7, 7, 6, 0, + 0, 32, 80, 32, 80, 112, 136, 136, 5, 6, 6, 6, 0, 0, 120, 160, + 240, 160, 160, 184, 4, 8, 8, 6, 1, 254, 96, 144, 128, 128, 144, 96, + 32, 64, 4, 7, 7, 6, 1, 0, 64, 32, 240, 128, 224, 128, 240, 4, + 7, 7, 6, 1, 0, 32, 64, 240, 128, 224, 128, 240, 4, 7, 7, 6, + 1, 0, 32, 80, 240, 128, 224, 128, 240, 4, 7, 7, 6, 1, 0, 80, + 0, 240, 128, 224, 128, 240, 3, 7, 7, 6, 1, 0, 128, 64, 224, 64, + 64, 64, 224, 3, 7, 7, 6, 1, 0, 32, 64, 224, 64, 64, 64, 224, + 3, 7, 7, 6, 1, 0, 64, 160, 224, 64, 64, 64, 224, 3, 7, 7, + 6, 1, 0, 160, 0, 224, 64, 64, 64, 224, 5, 6, 6, 6, 0, 0, + 112, 72, 232, 72, 72, 112, 4, 7, 7, 6, 1, 0, 80, 160, 144, 208, + 176, 144, 144, 4, 7, 7, 6, 1, 0, 64, 32, 96, 144, 144, 144, 96, + 4, 7, 7, 6, 1, 0, 32, 64, 96, 144, 144, 144, 96, 4, 7, 7, + 6, 1, 0, 32, 80, 96, 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, + 80, 160, 96, 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, 80, 0, 96, + 144, 144, 144, 96, 5, 5, 5, 6, 0, 0, 136, 80, 32, 80, 136, 4, + 8, 8, 6, 1, 255, 16, 112, 176, 176, 208, 208, 224, 128, 4, 7, 7, + 6, 1, 0, 64, 32, 144, 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, + 32, 64, 144, 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, 32, 80, 144, + 144, 144, 144, 96, 4, 7, 7, 6, 1, 0, 80, 0, 144, 144, 144, 144, + 96, 5, 7, 7, 6, 0, 0, 16, 32, 136, 80, 32, 32, 32, 4, 6, + 6, 6, 1, 0, 128, 224, 144, 144, 224, 128, 4, 6, 6, 6, 1, 0, + 96, 144, 160, 160, 144, 160, 4, 7, 7, 6, 1, 0, 64, 32, 0, 112, + 144, 144, 112, 4, 7, 7, 6, 1, 0, 32, 64, 0, 112, 144, 144, 112, + 4, 7, 7, 6, 1, 0, 32, 80, 0, 112, 144, 144, 112, 4, 7, 7, + 6, 1, 0, 80, 160, 0, 112, 144, 144, 112, 4, 6, 6, 6, 1, 0, + 80, 0, 112, 144, 144, 112, 4, 7, 7, 6, 1, 0, 32, 80, 32, 112, + 144, 144, 112, 5, 4, 4, 6, 0, 0, 112, 168, 176, 120, 4, 6, 6, + 6, 1, 254, 112, 128, 128, 112, 32, 64, 4, 7, 7, 6, 1, 0, 64, + 32, 0, 96, 176, 192, 112, 4, 7, 7, 6, 1, 0, 32, 64, 0, 96, + 176, 192, 112, 4, 7, 7, 6, 1, 0, 32, 80, 0, 96, 176, 192, 112, + 4, 6, 6, 6, 1, 0, 80, 0, 96, 176, 192, 112, 3, 7, 7, 6, + 1, 0, 128, 64, 0, 192, 64, 64, 224, 3, 7, 7, 6, 1, 0, 32, + 64, 0, 192, 64, 64, 224, 3, 7, 7, 6, 1, 0, 64, 160, 0, 192, + 64, 64, 224, 3, 6, 6, 6, 1, 0, 160, 0, 192, 64, 64, 224, 4, + 7, 7, 6, 1, 0, 48, 96, 16, 112, 144, 144, 96, 4, 7, 7, 6, + 1, 0, 80, 160, 0, 224, 144, 144, 144, 4, 7, 7, 6, 1, 0, 64, + 32, 0, 96, 144, 144, 96, 4, 7, 7, 6, 1, 0, 32, 64, 0, 96, + 144, 144, 96, 4, 7, 7, 6, 1, 0, 32, 80, 0, 96, 144, 144, 96, + 4, 7, 7, 6, 1, 0, 80, 160, 0, 96, 144, 144, 96, 4, 6, 6, + 6, 1, 0, 80, 0, 96, 144, 144, 96, 5, 5, 5, 6, 0, 0, 32, + 0, 248, 0, 32, 4, 4, 4, 6, 1, 0, 112, 176, 208, 224, 4, 7, + 7, 6, 1, 0, 64, 32, 0, 144, 144, 144, 112, 4, 7, 7, 6, 1, + 0, 32, 64, 0, 144, 144, 144, 112, 4, 7, 7, 6, 1, 0, 32, 80, + 0, 144, 144, 144, 112, 4, 6, 6, 6, 1, 0, 80, 0, 144, 144, 144, + 112, 4, 9, 9, 6, 1, 254, 32, 64, 0, 144, 144, 144, 112, 144, 96, + 4, 8, 8, 6, 1, 254, 128, 128, 224, 144, 144, 224, 128, 128, 4, 8, + 8, 6, 1, 254, 80, 0, 144, 144, 144, 112, 144, 96 +}; diff --git a/Marlin/src/lcd/dogm/dogm_font_data_ISO10646_1.h b/Marlin/src/lcd/dogm/dogm_font_data_ISO10646_1.h new file mode 100644 index 0000000000..26e93f3a36 --- /dev/null +++ b/Marlin/src/lcd/dogm/dogm_font_data_ISO10646_1.h @@ -0,0 +1,306 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include + +#if defined(__AVR__) && ENABLED(NOT_EXTENDED_ISO10646_1_5X7) + // reduced font (only symbols 1 - 127) - saves about 1278 bytes of FLASH + +/* + Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Capital A Height: 7, '1' Height: 7 + Calculated Max Values w= 5 h=10 x= 5 y= 5 dx= 6 dy= 0 ascent= 8 len=10 + Font Bounding box w= 6 h=12 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 7 descent=-2 + X Font ascent = 8 descent=-2 + Max Font ascent = 8 descent=-2 +*/ + +const u8g_fntpgm_uint8_t ISO10646_1_5x7[1328] U8G_FONT_SECTION("ISO10646_1_5x7") = { + 0x00,0x06,0x0c,0x00,0xfe,0x07,0x02,0x29,0x03,0xbf,0x01,0x7f,0xfe,0x08,0xfe,0x08, + 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, + 0xb8,0x88,0x88,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0xff,0xe0,0x80,0xc0,0xb0,0xa8, + 0x28,0x30,0x28,0x28,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88, + 0x88,0xa8,0xf8,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8, + 0xa8,0x88,0x70,0x03,0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80, + 0x80,0x80,0x80,0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06, + 0x06,0x06,0x00,0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff, + 0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8, + 0xc8,0x10,0x20,0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40, + 0xa8,0x90,0x68,0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06, + 0x01,0xff,0x20,0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01, + 0xff,0x80,0x40,0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0xa8,0x70,0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8, + 0x20,0x20,0x02,0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00, + 0x03,0xf8,0x02,0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98, + 0xa8,0xc8,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40, + 0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00, + 0x00,0x10,0x30,0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, + 0xf0,0x08,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0, + 0xc0,0x00,0xc0,0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80, + 0x03,0x05,0x05,0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00, + 0x02,0xf8,0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70, + 0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80, + 0x80,0x98,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88, + 0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80, + 0x80,0x80,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0x88,0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0, + 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x88,0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, + 0x88,0xa8,0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01, + 0xff,0xe0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05, + 0x01,0x01,0x06,0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05, + 0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05, + 0x05,0x05,0x06,0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x30,0x48,0x40,0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88, + 0x88,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09, + 0x09,0x06,0x01,0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07, + 0x06,0x00,0x00,0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00, + 0xc0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8, + 0xa8,0xa8,0x05,0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05, + 0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88, + 0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78, + 0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0xf8,0x20,0x20,0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68, + 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50, + 0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05, + 0x05,0x06,0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20, + 0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40, + 0x40,0x20,0x40,0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff + }; +#else + // extended (original) font (symbols 1 - 255) + +/* + Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 + Capital A Height: 7, '1' Height: 7 + Calculated Max Values w= 6 h=10 x= 5 y= 7 dx= 6 dy= 0 ascent=10 len=10 + Font Bounding box w= 6 h=12 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 7 descent=-2 + X Font ascent = 8 descent=-2 + Max Font ascent =10 descent=-2 +*/ +const u8g_fntpgm_uint8_t ISO10646_1_5x7[2651] U8G_FONT_SECTION("ISO10646_1_5x7") = { + 0x00,0x06,0x0c,0x00,0xfe,0x07,0x02,0x29,0x03,0xbf,0x01,0xff,0xfe,0x0a,0xfe,0x08, + 0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05, + 0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05, + 0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, + 0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8, + 0xb8,0x88,0x88,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0xff,0xe0,0x80,0xc0,0xb0,0xa8, + 0x28,0x30,0x28,0x28,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88, + 0x88,0xa8,0xf8,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8, + 0xa8,0x88,0x70,0x03,0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80, + 0x80,0x80,0x80,0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06, + 0x06,0x06,0x00,0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff, + 0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8, + 0xc8,0x10,0x20,0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40, + 0xa8,0x90,0x68,0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06, + 0x01,0xff,0x20,0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01, + 0xff,0x80,0x40,0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0xa8,0x70,0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8, + 0x20,0x20,0x02,0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00, + 0x03,0xf8,0x02,0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98, + 0xa8,0xc8,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40, + 0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00, + 0x00,0x10,0x30,0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, + 0xf0,0x08,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0, + 0xc0,0x00,0xc0,0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80, + 0x03,0x05,0x05,0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00, + 0x02,0xf8,0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70, + 0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07, + 0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80, + 0x80,0x98,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88, + 0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07, + 0x07,0x06,0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80, + 0x80,0x80,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x88,0x88,0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0, + 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x88,0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, + 0x88,0xa8,0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01, + 0xff,0xe0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05, + 0x01,0x01,0x06,0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05, + 0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, + 0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05, + 0x05,0x05,0x06,0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x30,0x48,0x40,0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88, + 0x88,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09, + 0x09,0x06,0x01,0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07, + 0x06,0x00,0x00,0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00, + 0xc0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8, + 0xa8,0xa8,0x05,0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05, + 0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88, + 0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78, + 0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0xf8,0x20,0x20,0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68, + 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50, + 0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05, + 0x05,0x06,0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20, + 0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40, + 0x40,0x20,0x40,0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0x00,0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80, + 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20, + 0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05, + 0x06,0x00,0x00,0xa8,0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50, + 0xf8,0x20,0xf8,0x20,0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80, + 0x80,0x80,0x04,0x08,0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0, + 0x03,0x01,0x01,0x06,0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4, + 0xa4,0xb4,0x84,0x78,0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05, + 0x05,0x05,0x06,0x00,0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01, + 0xf8,0x08,0x08,0x03,0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00, + 0x78,0x84,0xb4,0xa4,0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04, + 0x04,0x06,0x01,0x05,0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0xf8,0x20,0x20,0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x20,0x40,0xe0, + 0x03,0x05,0x05,0x06,0x01,0x05,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01, + 0x05,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80, + 0x80,0x05,0x08,0x08,0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02, + 0x02,0x02,0x06,0x02,0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03, + 0x05,0x05,0x06,0x01,0x05,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05, + 0x40,0xa0,0x40,0x00,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38, + 0x05,0x0a,0x0a,0x06,0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10, + 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a, + 0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09, + 0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x20,0x50,0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x78,0xa0,0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70, + 0x88,0x80,0x80,0x80,0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20, + 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20, + 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50, + 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00, + 0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00, + 0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00, + 0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0, + 0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8, + 0x48,0x48,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8, + 0x98,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88, + 0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88, + 0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88, + 0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88, + 0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88, + 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09, + 0x06,0x00,0xff,0x08,0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06, + 0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06, + 0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00, + 0x00,0x10,0x20,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01, + 0x00,0x80,0xe0,0x90,0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0x90,0xa0,0x90,0x88,0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08, + 0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88, + 0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05, + 0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07, + 0x06,0x00,0x00,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00, + 0x20,0x50,0x20,0x70,0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28, + 0x70,0xa0,0x78,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60, + 0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08, + 0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06, + 0x00,0x00,0x20,0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00, + 0xc0,0x40,0x40,0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40, + 0x40,0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40, + 0xe0,0x03,0x07,0x07,0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09, + 0x09,0x06,0x00,0x00,0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08, + 0x06,0x00,0x00,0x68,0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00, + 0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10, + 0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00, + 0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88, + 0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70, + 0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00, + 0x00,0x78,0x98,0xa8,0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88, + 0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88, + 0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a, + 0x06,0x00,0xfe,0x10,0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09, + 0x06,0x00,0xfe,0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06, + 0x00,0xfe,0x50,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80}; + +#endif diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h deleted file mode 100644 index cd9cb3cdc9..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h +++ /dev/null @@ -1,189 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - Fontname: -Misc-Fixed-Medium-R-Normal--9-90-75-75-C-60-ISO10646-1 - Copyright: Public domain font. Share and enjoy. - Capital A Height: 6, '1' Height: 6 - Calculated Max Values w= 6 h= 9 x= 5 y= 5 dx= 6 dy= 0 ascent= 7 len= 9 - Font Bounding box w= 6 h= 9 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent = 6 descent=-2 - X Font ascent = 6 descent=-2 - Max Font ascent = 7 descent=-2 -*/ -#include -const u8g_fntpgm_uint8_t u8g_font_6x9[2434] U8G_FONT_SECTION(".progmem.u8g_font_6x9") = { - 0x00,0x06,0x09,0x00,0xFE,0x06,0x02,0x0F,0x03,0x84,0x01,0xFF,0xFE,0x07,0xFE,0x06, - 0xFE,0x05,0x07,0x07,0x00,0x00,0x00,0x40,0xF0,0xC8,0x88,0x98,0x78,0x10,0x05,0x07, - 0x07,0x00,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05,0x00,0x00, - 0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xF8,0x20, - 0x20,0x20,0xE0,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xA8,0xB8,0x88,0x70,0x20, - 0x06,0x05,0x05,0x00,0x00,0x00,0xB0,0xD8,0x6C,0xD8,0xB0,0x05,0x08,0x08,0x00,0x00, - 0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0xA8,0xF8,0x05,0x09,0x09,0x00,0x00,0xFE,0x20, - 0x50,0x50,0x50,0x50,0x88,0xA8,0x88,0x70,0x03,0x03,0x03,0x00,0x00,0x03,0x40,0xA0, - 0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x06,0x05,0xFF,0x01,0x06,0x06, - 0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x03,0xA0, - 0xA0,0xA0,0x05,0x07,0x07,0x06,0x00,0xFF,0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x05, - 0x09,0x09,0x06,0x00,0xFE,0x20,0x70,0xA8,0xA0,0x70,0x28,0xA8,0x70,0x20,0x06,0x08, - 0x08,0x06,0x00,0xFF,0x40,0xA8,0x48,0x10,0x20,0x48,0x54,0x08,0x05,0x07,0x07,0x06, - 0x00,0xFF,0x60,0x90,0x90,0x60,0x98,0x90,0x68,0x01,0x03,0x03,0x06,0x02,0x03,0x80, - 0x80,0x80,0x02,0x07,0x07,0x06,0x02,0xFF,0x40,0x80,0x80,0x80,0x80,0x80,0x40,0x02, - 0x07,0x07,0x06,0x02,0xFF,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x05,0x05,0x05,0x06, - 0x00,0x00,0x88,0x50,0xF8,0x50,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x20,0x20,0xF8, - 0x20,0x20,0x02,0x04,0x04,0x06,0x02,0xFE,0xC0,0x40,0x40,0x80,0x05,0x01,0x01,0x06, - 0x00,0x02,0xF8,0x02,0x02,0x02,0x06,0x02,0x00,0xC0,0xC0,0x04,0x06,0x06,0x06,0x01, - 0x00,0x10,0x10,0x20,0x40,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x90, - 0x90,0x90,0x60,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0xE0,0x04, - 0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x10,0x20,0x40,0xF0,0x04,0x06,0x06,0x06,0x01, - 0x00,0xF0,0x20,0x60,0x10,0x10,0xE0,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0x30,0x50, - 0x90,0xF8,0x10,0x04,0x06,0x06,0x06,0x01,0x00,0xF0,0x80,0xE0,0x10,0x10,0xE0,0x04, - 0x06,0x06,0x06,0x01,0x00,0x60,0x80,0xE0,0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01, - 0x00,0xF0,0x10,0x10,0x20,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x60, - 0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x90,0x70,0x10,0x60,0x02, - 0x05,0x05,0x06,0x02,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x02,0x07,0x07,0x06,0x02,0xFE, - 0xC0,0xC0,0x00,0xC0,0x40,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x18,0x60,0x80, - 0x60,0x18,0x05,0x03,0x03,0x06,0x00,0x01,0xF8,0x00,0xF8,0x05,0x05,0x05,0x06,0x00, - 0x00,0xC0,0x30,0x08,0x30,0xC0,0x04,0x07,0x07,0x06,0x01,0x00,0x60,0x90,0x10,0x60, - 0x40,0x00,0x40,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x90,0xA8,0xB0,0x80,0x70,0x05, - 0x06,0x06,0x06,0x00,0x00,0x20,0x50,0x88,0xF8,0x88,0x88,0x05,0x06,0x06,0x06,0x00, - 0x00,0xF0,0x88,0xF0,0x88,0x88,0xF0,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, - 0x80,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x04, - 0x06,0x06,0x06,0x01,0x00,0xF0,0x80,0xE0,0x80,0x80,0xF0,0x04,0x06,0x06,0x06,0x01, - 0x00,0xF0,0x80,0xE0,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, - 0xB0,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0x90,0xF0,0x90,0x90,0x90,0x03, - 0x06,0x06,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0xE0,0x05,0x06,0x06,0x06,0x00, - 0x00,0x38,0x10,0x10,0x10,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0xA0,0xC0, - 0xA0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x80,0x80,0x80,0xF0,0x05, - 0x06,0x06,0x06,0x00,0x00,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x04,0x06,0x06,0x06,0x01, - 0x00,0x90,0xD0,0xB0,0x90,0x90,0x90,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x88,0x88, - 0x88,0x88,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0xE0,0x90,0x90,0xE0,0x80,0x80,0x04, - 0x07,0x07,0x06,0x01,0xFF,0x60,0x90,0x90,0xD0,0xB0,0x60,0x10,0x04,0x06,0x06,0x06, - 0x01,0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90, - 0x40,0x20,0x90,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20, - 0x04,0x06,0x06,0x06,0x01,0x00,0x90,0x90,0x90,0x90,0x90,0x60,0x04,0x06,0x06,0x06, - 0x01,0x00,0x90,0x90,0x90,0xF0,0x60,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x88, - 0xA8,0xA8,0xD8,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88, - 0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x04,0x06,0x06,0x06, - 0x01,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x03,0x06,0x06,0x06,0x01,0x00,0xE0,0x80, - 0x80,0x80,0x80,0xE0,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x40,0x20,0x10,0x10, - 0x03,0x06,0x06,0x06,0x01,0x00,0xE0,0x20,0x20,0x20,0x20,0xE0,0x05,0x03,0x03,0x06, - 0x00,0x03,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00,0xFE,0xF8,0x02,0x02,0x02,0x06, - 0x02,0x04,0x80,0x40,0x04,0x04,0x04,0x06,0x01,0x00,0x70,0x90,0x90,0x70,0x04,0x06, - 0x06,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0x90,0xE0,0x04,0x04,0x04,0x06,0x01,0x00, - 0x70,0x80,0x80,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0x10,0x10,0x70,0x90,0x90,0x70, - 0x04,0x04,0x04,0x06,0x01,0x00,0x60,0xB0,0xC0,0x70,0x04,0x06,0x06,0x06,0x01,0x00, - 0x20,0x50,0x40,0xE0,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0xFE,0x60,0x90,0x90,0x70, - 0x10,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x03,0x06, - 0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x08,0x08,0x06,0x01,0xFE, - 0x20,0x00,0x60,0x20,0x20,0x20,0xA0,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80, - 0xA0,0xC0,0xA0,0x90,0x03,0x06,0x06,0x06,0x01,0x00,0xC0,0x40,0x40,0x40,0x40,0xE0, - 0x05,0x04,0x04,0x06,0x00,0x00,0xD0,0xA8,0xA8,0x88,0x04,0x04,0x04,0x06,0x01,0x00, - 0xE0,0x90,0x90,0x90,0x04,0x04,0x04,0x06,0x01,0x00,0x60,0x90,0x90,0x60,0x04,0x06, - 0x06,0x06,0x01,0xFE,0xE0,0x90,0x90,0xE0,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xFE, - 0x70,0x90,0x90,0x70,0x10,0x10,0x04,0x04,0x04,0x06,0x01,0x00,0xA0,0xD0,0x80,0x80, - 0x04,0x04,0x04,0x06,0x01,0x00,0x70,0xC0,0x30,0xE0,0x04,0x06,0x06,0x06,0x01,0x00, - 0x40,0x40,0xE0,0x40,0x50,0x20,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x90,0x90,0x70, - 0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x90,0x60,0x60,0x05,0x04,0x04,0x06,0x00,0x00, - 0x88,0xA8,0xA8,0x50,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x60,0x60,0x90,0x04,0x06, - 0x06,0x06,0x01,0xFE,0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x04,0x04,0x06,0x01,0x00, - 0xF0,0x20,0x40,0xF0,0x03,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x40,0x80,0x40,0x40, - 0x20,0x01,0x07,0x07,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x03,0x07, - 0x07,0x06,0x01,0x00,0x80,0x40,0x40,0x20,0x40,0x40,0x80,0x04,0x02,0x02,0x06,0x01, - 0x03,0x50,0xA0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x06,0x05,0xFF,0x01,0x06,0x06,0x06,0x02,0x00, - 0x80,0x00,0x80,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xFF,0x20,0x70,0xA0,0xA0, - 0x70,0x20,0x05,0x07,0x07,0x06,0x00,0xFF,0x30,0x48,0x40,0xF0,0x40,0x40,0xF8,0x05, - 0x05,0x05,0x06,0x00,0x00,0xA8,0x50,0x88,0x50,0xA8,0x05,0x06,0x06,0x06,0x00,0x00, - 0x88,0x50,0xF8,0x20,0xF8,0x20,0x01,0x07,0x07,0x06,0x02,0xFF,0x80,0x80,0x80,0x00, - 0x80,0x80,0x80,0x04,0x07,0x07,0x06,0x01,0xFF,0x70,0x80,0x60,0x90,0x60,0x10,0xE0, - 0x03,0x01,0x01,0x06,0x01,0x05,0xA0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0x94, - 0xA4,0x94,0x84,0x78,0x03,0x05,0x05,0x06,0x01,0x01,0x60,0xA0,0x60,0x00,0xE0,0x05, - 0x05,0x05,0x06,0x00,0x00,0x28,0x50,0xA0,0x50,0x28,0x04,0x03,0x03,0x06,0x01,0x00, - 0xF0,0x10,0x10,0x04,0x01,0x01,0x06,0x01,0x02,0xF0,0x06,0x07,0x07,0x06,0x00,0x00, - 0x78,0x84,0xB4,0xA4,0xA4,0x84,0x78,0x04,0x01,0x01,0x06,0x01,0x05,0xF0,0x04,0x03, - 0x03,0x06,0x01,0x02,0x60,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0xFF,0x20,0x20,0xF8, - 0x20,0x20,0x00,0xF8,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xA0,0x20,0x40,0xE0,0x03, - 0x05,0x05,0x06,0x01,0x01,0xC0,0x20,0x40,0x20,0xC0,0x02,0x02,0x02,0x06,0x02,0x04, - 0x40,0x80,0x04,0x05,0x05,0x06,0x01,0xFF,0x90,0x90,0xB0,0xD0,0x80,0x05,0x06,0x06, - 0x06,0x00,0x00,0x78,0xE8,0xE8,0x68,0x28,0x28,0x01,0x01,0x01,0x06,0x02,0x02,0x80, - 0x02,0x02,0x02,0x06,0x02,0xFE,0x40,0x80,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xC0, - 0x40,0x40,0xE0,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xA0,0x40,0x00,0xE0,0x05,0x05, - 0x05,0x06,0x00,0x00,0xA0,0x50,0x28,0x50,0xA0,0x05,0x08,0x08,0x06,0x00,0xFF,0x40, - 0xC0,0x40,0x50,0x70,0x30,0x78,0x10,0x05,0x08,0x08,0x06,0x00,0xFF,0x40,0xC0,0x40, - 0x50,0x68,0x08,0x10,0x38,0x05,0x08,0x08,0x06,0x00,0xFF,0xC0,0x20,0x40,0x30,0xF0, - 0x30,0x78,0x10,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x00,0x20,0x60,0x80,0x90,0x60, - 0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x20,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07, - 0x06,0x00,0x00,0x10,0x20,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00, - 0x20,0x50,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x50,0x20, - 0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x20,0x50,0x70,0x88, - 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x50,0x20,0x50,0x70,0x88,0x88,0x05,0x06, - 0x06,0x06,0x00,0x00,0x78,0xA0,0xF0,0xA0,0xA0,0xB8,0x04,0x08,0x08,0x06,0x01,0xFE, - 0x60,0x90,0x80,0x80,0x90,0x60,0x20,0x40,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20, - 0xF0,0x80,0xE0,0x80,0xF0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0xF0,0x80,0xE0, - 0x80,0xF0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0xF0,0x80,0xE0,0x80,0xF0,0x04, - 0x07,0x07,0x06,0x01,0x00,0x50,0x00,0xF0,0x80,0xE0,0x80,0xF0,0x03,0x07,0x07,0x06, - 0x01,0x00,0x80,0x40,0xE0,0x40,0x40,0x40,0xE0,0x03,0x07,0x07,0x06,0x01,0x00,0x20, - 0x40,0xE0,0x40,0x40,0x40,0xE0,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xA0,0xE0,0x40, - 0x40,0x40,0xE0,0x03,0x07,0x07,0x06,0x01,0x00,0xA0,0x00,0xE0,0x40,0x40,0x40,0xE0, - 0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x48,0xE8,0x48,0x48,0x70,0x04,0x07,0x07,0x06, - 0x01,0x00,0x50,0xA0,0x90,0xD0,0xB0,0x90,0x90,0x04,0x07,0x07,0x06,0x01,0x00,0x40, - 0x20,0x60,0x90,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x60,0x90, - 0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0x60,0x90,0x90,0x90,0x60, - 0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x60,0x90,0x90,0x90,0x60,0x04,0x07,0x07, - 0x06,0x01,0x00,0x50,0x00,0x60,0x90,0x90,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00, - 0x88,0x50,0x20,0x50,0x88,0x04,0x08,0x08,0x06,0x01,0xFF,0x10,0x70,0xB0,0xB0,0xD0, - 0xD0,0xE0,0x80,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x90,0x90,0x90,0x90,0x60, - 0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x90,0x90,0x90,0x90,0x60,0x04,0x07,0x07, - 0x06,0x01,0x00,0x20,0x50,0x90,0x90,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00, - 0x50,0x00,0x90,0x90,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x20,0x88, - 0x50,0x20,0x20,0x20,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0xE0,0x90,0x90,0xE0,0x80, - 0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0xA0,0xA0,0x90,0xA0,0x04,0x07,0x07,0x06, - 0x01,0x00,0x40,0x20,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20, - 0x40,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0x00,0x70, - 0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x00,0x70,0x90,0x90,0x70, - 0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06, - 0x01,0x00,0x20,0x50,0x20,0x70,0x90,0x90,0x70,0x05,0x04,0x04,0x06,0x00,0x00,0x70, - 0xA8,0xB0,0x78,0x04,0x06,0x06,0x06,0x01,0xFE,0x70,0x80,0x80,0x70,0x20,0x40,0x04, - 0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x60,0xB0,0xC0,0x70,0x04,0x07,0x07,0x06, - 0x01,0x00,0x20,0x40,0x00,0x60,0xB0,0xC0,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20, - 0x50,0x00,0x60,0xB0,0xC0,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x60,0xB0, - 0xC0,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x80,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03, - 0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x07,0x07,0x06, - 0x01,0x00,0x40,0xA0,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06,0x06,0x01,0x00,0xA0, - 0x00,0xC0,0x40,0x40,0xE0,0x04,0x07,0x07,0x06,0x01,0x00,0x30,0x60,0x10,0x70,0x90, - 0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x00,0xE0,0x90,0x90,0x90,0x04, - 0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06, - 0x01,0x00,0x20,0x40,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20, - 0x50,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x00,0x60, - 0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x60,0x90,0x90,0x60,0x05, - 0x05,0x05,0x06,0x00,0x00,0x20,0x00,0xF8,0x00,0x20,0x04,0x04,0x04,0x06,0x01,0x00, - 0x70,0xB0,0xD0,0xE0,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x90,0x90,0x90, - 0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x00,0x90,0x90,0x90,0x70,0x04,0x07, - 0x07,0x06,0x01,0x00,0x20,0x50,0x00,0x90,0x90,0x90,0x70,0x04,0x06,0x06,0x06,0x01, - 0x00,0x50,0x00,0x90,0x90,0x90,0x70,0x04,0x09,0x09,0x06,0x01,0xFE,0x20,0x40,0x00, - 0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x08,0x08,0x06,0x01,0xFE,0x80,0x80,0xE0,0x90, - 0x90,0xE0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0xFE,0x50,0x00,0x90,0x90,0x90,0x70, - 0x90,0x60}; diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h deleted file mode 100644 index b4b615da4d..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h +++ /dev/null @@ -1,301 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include - -#if defined(__AVR__) && ENABLED(NOT_EXTENDED_ISO10646_1_5X7) - // reduced font (only symbols 1 - 127) - saves about 1278 bytes of FLASH - -/* - Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 - Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 7 h=10 x= 5 y= 5 dx= 7 dy= 0 ascent= 8 len=10 - Font Bounding box w=12 h=15 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-2 - X Font ascent = 8 descent=-2 - Max Font ascent = 8 descent=-2 -*/ -const u8g_fntpgm_uint8_t ISO10646_1_5x7[1324] U8G_FONT_SECTION("ISO10646_1_5x7") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x07,0x02,0x25,0x03,0xBB,0x01,0x7F,0xFE,0x08,0xFE,0x08, - 0xFE,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xF0,0xC8,0x88,0x88,0x98,0x78,0x10,0x05, - 0x08,0x08,0x06,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, - 0xF8,0x20,0x20,0x20,0x20,0xE0,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA8, - 0xB8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xD8,0x6C,0x36,0x6C,0xD8, - 0x05,0x09,0x09,0x06,0x00,0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0x88,0xA8,0xF8,0x05, - 0x0A,0x0A,0x06,0x00,0xFE,0x20,0x50,0x50,0x50,0x50,0x88,0xA8,0xA8,0x88,0x70,0x03, - 0x03,0x03,0x06,0x00,0x03,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, - 0x00,0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00, - 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xA0,0xA0,0xA0,0x05,0x06,0x06,0x06,0x00,0x00, - 0x50,0xF8,0x50,0x50,0xF8,0x50,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA0, - 0x70,0x28,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xC8,0xC8,0x10,0x20,0x40, - 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68,0x01, - 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40, - 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40, - 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xA8,0x70,0x20, - 0x70,0xA8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xF8,0x20,0x20,0x02,0x03, - 0x03,0x06,0x01,0xFF,0xC0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xF8,0x02,0x02, - 0x02,0x06,0x01,0x00,0xC0,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20, - 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xA8,0xC8,0x88,0x70, - 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07, - 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xF8,0x05,0x07,0x07,0x06,0x00,0x00, - 0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50, - 0x90,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0xF0,0x08,0x08,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xF0,0x88,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xC0,0xC0,0x00,0xC0,0xC0, - 0x02,0x06,0x06,0x06,0x01,0xFF,0xC0,0xC0,0x00,0xC0,0x40,0x80,0x03,0x05,0x05,0x06, - 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xF8,0x00,0xF8, - 0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0xB8,0xA8,0xB8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88, - 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0xF0,0x05, - 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8, - 0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0, - 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x03,0x07,0x07, - 0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00, - 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, - 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80, - 0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88, - 0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xA8, - 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88, - 0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, - 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8,0x50, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,0x07, - 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, - 0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20, - 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0xE0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00, - 0xFE,0xF8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00, - 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88, - 0x88,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,0x00, - 0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xE0, - 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x88,0x88,0x78,0x08,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x03,0x07,0x07, - 0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x04,0x09,0x09,0x06,0x01,0xFE, - 0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80, - 0x80,0x88,0x90,0xE0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xC0,0x40,0x40,0x40, - 0x40,0x40,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x05,0x05, - 0x05,0x06,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70, - 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, - 0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05, - 0x05,0x06,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78, - 0x80,0x70,0x08,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, - 0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,0x06, - 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xA8, - 0xA8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07, - 0x06,0x00,0xFE,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0xF8,0x10,0x20,0x40,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40,0x40,0x40,0x80, - 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40,0x40,0x20,0x40,0x40, - 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xA8,0x90,0xFF}; -#else - // extended (original) font (symbols 1 - 255) - -/* - Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 - Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 7 h=10 x= 5 y= 7 dx= 7 dy= 0 ascent=10 len=10 - Font Bounding box w=12 h=15 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-2 - X Font ascent = 8 descent=-2 - Max Font ascent =10 descent=-2 -*/ -const u8g_fntpgm_uint8_t ISO10646_1_5x7[2647] U8G_FONT_SECTION("ISO10646_1_5x7") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x07,0x02,0x25,0x03,0xBB,0x01,0xFF,0xFE,0x0A,0xFE,0x08, - 0xFE,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xF0,0xC8,0x88,0x88,0x98,0x78,0x10,0x05, - 0x08,0x08,0x06,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, - 0xF8,0x20,0x20,0x20,0x20,0xE0,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA8, - 0xB8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xD8,0x6C,0x36,0x6C,0xD8, - 0x05,0x09,0x09,0x06,0x00,0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0x88,0xA8,0xF8,0x05, - 0x0A,0x0A,0x06,0x00,0xFE,0x20,0x50,0x50,0x50,0x50,0x88,0xA8,0xA8,0x88,0x70,0x03, - 0x03,0x03,0x06,0x00,0x03,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, - 0x00,0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00, - 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xA0,0xA0,0xA0,0x05,0x06,0x06,0x06,0x00,0x00, - 0x50,0xF8,0x50,0x50,0xF8,0x50,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA0, - 0x70,0x28,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xC8,0xC8,0x10,0x20,0x40, - 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68,0x01, - 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40, - 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40, - 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xA8,0x70,0x20, - 0x70,0xA8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xF8,0x20,0x20,0x02,0x03, - 0x03,0x06,0x01,0xFF,0xC0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xF8,0x02,0x02, - 0x02,0x06,0x01,0x00,0xC0,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20, - 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xA8,0xC8,0x88,0x70, - 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07, - 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xF8,0x05,0x07,0x07,0x06,0x00,0x00, - 0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50, - 0x90,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0xF0,0x08,0x08,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xF0,0x88,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xC0,0xC0,0x00,0xC0,0xC0, - 0x02,0x06,0x06,0x06,0x01,0xFF,0xC0,0xC0,0x00,0xC0,0x40,0x80,0x03,0x05,0x05,0x06, - 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xF8,0x00,0xF8, - 0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0xB8,0xA8,0xB8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88, - 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0xF0,0x05, - 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8, - 0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0, - 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x03,0x07,0x07, - 0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00, - 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, - 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80, - 0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88, - 0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xA8, - 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88, - 0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, - 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8,0x50, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,0x07, - 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, - 0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20, - 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0xE0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00, - 0xFE,0xF8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00, - 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88, - 0x88,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,0x00, - 0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xE0, - 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x88,0x88,0x78,0x08,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x03,0x07,0x07, - 0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x04,0x09,0x09,0x06,0x01,0xFE, - 0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80, - 0x80,0x88,0x90,0xE0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xC0,0x40,0x40,0x40, - 0x40,0x40,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x05,0x05, - 0x05,0x06,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70, - 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, - 0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05, - 0x05,0x06,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78, - 0x80,0x70,0x08,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, - 0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,0x06, - 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xA8, - 0xA8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07, - 0x06,0x00,0xFE,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0xF8,0x10,0x20,0x40,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40,0x40,0x40,0x80, - 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40,0x40,0x20,0x40,0x40, - 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xA8,0x90,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x06, - 0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x05, - 0x07,0x07,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA0,0xA8,0x70,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x30,0x48,0x40,0xE0,0x40,0x48,0xB0,0x05,0x05,0x05,0x06,0x00,0x00,0xA8, - 0x50,0x88,0x50,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xF8,0x20,0xF8,0x20, - 0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04,0x08, - 0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xE0,0x03,0x01,0x01,0x06, - 0x01,0x07,0xA0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xB4,0xA4,0xB4,0x84,0x78, - 0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xA0,0x60,0x00,0xE0,0x05,0x05,0x05,0x06,0x00, - 0x00,0x28,0x50,0xA0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xF8,0x08,0x08,0x03, - 0x01,0x01,0x06,0x01,0x03,0xE0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xB4,0xA4, - 0xA4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xF8,0x04,0x04,0x04,0x06,0x01,0x05, - 0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00, - 0xF8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xA0,0x20,0x40,0xE0,0x03,0x05,0x05,0x06, - 0x01,0x04,0xC0,0x20,0x40,0x20,0xC0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40,0x80, - 0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x08,0x08, - 0x06,0x00,0x00,0x78,0xE8,0xE8,0xE8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06,0x02, - 0x03,0xC0,0xC0,0x03,0x02,0x02,0x06,0x01,0xFE,0x20,0xC0,0x03,0x05,0x05,0x06,0x01, - 0x04,0x40,0xC0,0x40,0x40,0xE0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xA0,0x40,0x00, - 0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xA0,0x50,0x28,0x50,0xA0,0x05,0x0A,0x0A,0x06, - 0x00,0x00,0x40,0xC0,0x48,0x50,0x60,0x50,0xB0,0x50,0x78,0x10,0x05,0x0A,0x0A,0x06, - 0x00,0x00,0x40,0xC0,0x48,0x50,0x60,0x50,0xA8,0x08,0x10,0x38,0x05,0x0A,0x0A,0x06, - 0x00,0x00,0xC0,0x20,0x48,0x30,0xE0,0x50,0xB0,0x50,0x78,0x10,0x05,0x07,0x07,0x06, - 0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40, - 0x20,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10, - 0x20,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20, - 0x50,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x68, - 0xB0,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x50, - 0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50, - 0x20,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0xA0, - 0xA0,0xF0,0xA0,0xA0,0xB8,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x80,0x80,0x80, - 0x88,0x70,0x10,0x60,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0xF8,0x80,0x80, - 0xF0,0x80,0x80,0xF8,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0xF8,0x80,0x80, - 0xF0,0x80,0x80,0xF8,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50,0x00,0xF8,0x80,0x80, - 0xF0,0x80,0x80,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xF8,0x80,0x80,0xF0, - 0x80,0x80,0xF8,0x03,0x0A,0x0A,0x06,0x01,0x00,0x80,0x40,0x00,0xE0,0x40,0x40,0x40, - 0x40,0x40,0xE0,0x03,0x0A,0x0A,0x06,0x01,0x00,0x20,0x40,0x00,0xE0,0x40,0x40,0x40, - 0x40,0x40,0xE0,0x03,0x0A,0x0A,0x06,0x01,0x00,0x40,0xA0,0x00,0xE0,0x40,0x40,0x40, - 0x40,0x40,0xE0,0x03,0x09,0x09,0x06,0x01,0x00,0xA0,0x00,0xE0,0x40,0x40,0x40,0x40, - 0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xE8,0x48,0x48,0x70,0x05, - 0x0A,0x0A,0x06,0x00,0x00,0x68,0xB0,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05, - 0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x0A,0x0A,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x0A,0x0A,0x06,0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x05, - 0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xFF,0x08, - 0x70,0x98,0xA8,0xA8,0xA8,0xC8,0x70,0x80,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20, - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20, - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50, - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00, - 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00, - 0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xE0,0x90, - 0x90,0x90,0xE0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xA0,0x90,0x88, - 0xB0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05, - 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08, - 0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00, - 0x00,0x68,0xB0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x50, - 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x70, - 0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xA0,0x78,0x05, - 0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08,0x06, - 0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00, - 0x10,0x20,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50, - 0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88, - 0xF0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xC0,0x40,0x40,0x40, - 0xE0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x03, - 0x08,0x08,0x06,0x01,0x00,0x40,0xA0,0x00,0xC0,0x40,0x40,0x40,0xE0,0x03,0x07,0x07, - 0x06,0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0x40,0xE0,0x05,0x09,0x09,0x06,0x00,0x00, - 0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68, - 0xB0,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, - 0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88, - 0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x01,0x20,0x00,0xF8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98,0xA8, - 0xC8,0xF0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x70, - 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x08, - 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x10, - 0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xFE,0x80, - 0x80,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xFE,0x50,0x00, - 0x88,0x88,0x88,0x50,0x20,0x40,0x80}; - -#endif diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_an.h b/Marlin/src/lcd/dogm/fontdata/langdata_an.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_an.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_bg.h b/Marlin/src/lcd/dogm/fontdata/langdata_bg.h deleted file mode 100644 index c506f87933..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_bg.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_8_144_149[96] U8G_FONT_SECTION("fontpage_8_144_149") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x95,0x00,0x07,0xFF,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80, - 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0x50, - 0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8 - }; -const u8g_fntpgm_uint8_t fontpage_8_151_152[43] U8G_FONT_SECTION("fontpage_8_151_152") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x98,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_8_154_164[160] U8G_FONT_SECTION("fontpage_8_154_164") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0xA4,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88, - 0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88, - 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8, - 0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, - 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20 - }; -const u8g_fntpgm_uint8_t fontpage_8_166_166[32] U8G_FONT_SECTION("fontpage_8_166_166") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x07,0xFE,0x00, - 0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0x90,0x90,0xF8,0x08,0x08 - }; -const u8g_fntpgm_uint8_t fontpage_8_175_195[260] U8G_FONT_SECTION("fontpage_8_175_195") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xC3,0x00,0x08,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88,0xF0,0x88, - 0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, - 0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, - 0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xA8, - 0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x05,0x05, - 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xD8, - 0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8, - 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, - 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88, - 0x88,0x78,0x08,0x70}; -const u8g_fntpgm_uint8_t fontpage_8_197_200[63] U8G_FONT_SECTION("fontpage_8_197_200") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC8,0x00,0x05,0xFE,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07,0x06, - 0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xF8}; -const u8g_fntpgm_uint8_t fontpage_8_202_202[28] U8G_FONT_SECTION("fontpage_8_202_202") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xC0,0x40,0x70,0x48,0x70}; -const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCF,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06, - 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(8, 144, 149, fontpage_8_144_149), // 'А' -- 'Е' - FONTDATA_ITEM(8, 151, 152, fontpage_8_151_152), // 'З' -- 'И' - FONTDATA_ITEM(8, 154, 164, fontpage_8_154_164), // 'К' -- 'Ф' - FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц' - FONTDATA_ITEM(8, 175, 195, fontpage_8_175_195), // 'Я' -- 'у' - FONTDATA_ITEM(8, 197, 200, fontpage_8_197_200), // 'х' -- 'ш' - FONTDATA_ITEM(8, 202, 202, fontpage_8_202_202), // 'ъ' -- 'ъ' - FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ca.h b/Marlin/src/lcd/dogm/fontdata/langdata_ca.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_ca.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_cz.h b/Marlin/src/lcd/dogm/fontdata/langdata_cz.h deleted file mode 100644 index 754459d9af..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_cz.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; -const u8g_fntpgm_uint8_t fontpage_2_143_143[33] U8G_FONT_SECTION("fontpage_2_143_143") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0x00,0x00, - 0x00,0x06,0x0A,0x0A,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88, - 0x78}; -const u8g_fntpgm_uint8_t fontpage_2_154_155[47] U8G_FONT_SECTION("fontpage_2_154_155") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9B,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, - 0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0xF0,0x80,0x70}; -const u8g_fntpgm_uint8_t fontpage_2_200_200[31] U8G_FONT_SECTION("fontpage_2_200_200") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_2_216_217[47] U8G_FONT_SECTION("fontpage_2_216_217") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD9,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90, - 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xB0,0xC8,0x80,0x80,0x80}; -const u8g_fntpgm_uint8_t fontpage_2_224_225[47] U8G_FONT_SECTION("fontpage_2_224_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE1,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; -const u8g_fntpgm_uint8_t fontpage_2_229_229[33] U8G_FONT_SECTION("fontpage_2_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, - 0x18}; -const u8g_fntpgm_uint8_t fontpage_2_239_239[31] U8G_FONT_SECTION("fontpage_2_239_239") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x88,0x88,0x88,0x88,0x70}; -const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFE,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80, - 0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č' - FONTDATA_ITEM(2, 143, 143, fontpage_2_143_143), // 'ď' -- 'ď' - FONTDATA_ITEM(2, 154, 155, fontpage_2_154_155), // 'Ě' -- 'ě' - FONTDATA_ITEM(2, 200, 200, fontpage_2_200_200), // 'ň' -- 'ň' - FONTDATA_ITEM(2, 216, 217, fontpage_2_216_217), // 'Ř' -- 'ř' - FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Š' -- 'š' - FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'ť' -- 'ť' - FONTDATA_ITEM(2, 239, 239, fontpage_2_239_239), // 'ů' -- 'ů' - FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_da.h b/Marlin/src/lcd/dogm/fontdata/langdata_da.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_da.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_de.h b/Marlin/src/lcd/dogm/fontdata/langdata_de.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_de.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_el.h b/Marlin/src/lcd/dogm/fontdata/langdata_el.h deleted file mode 100644 index 4b545f2284..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_el.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x80,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, - 0xF8}; -const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x9D,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, - 0x50,0x50,0x88,0x88,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80, - 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xE0, - 0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0, - 0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, - 0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0xA1,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80}; -const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA7,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x40,0x20,0x10,0x20,0x40,0xF8,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, - 0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, - 0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAF,0x00,0x08,0xFE,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, - 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0A,0x0A, - 0x06,0x00,0xFE,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, - 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xA0,0x40}; -const u8g_fntpgm_uint8_t fontpage_7_177_181[80] U8G_FONT_SECTION("fontpage_7_177_181") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB5,0x00,0x07,0xFE,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, - 0x00,0xFE,0x60,0x90,0x90,0xB0,0x88,0x88,0xF0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, - 0xFE,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, - 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70 - }; -const u8g_fntpgm_uint8_t fontpage_7_183_199[226] U8G_FONT_SECTION("fontpage_7_183_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xC7,0x00,0x09,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0xFE,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x04,0x07, - 0x07,0x06,0x01,0x00,0x60,0x90,0x90,0xF0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02, - 0x00,0x80,0x80,0x80,0xA0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0, - 0x90,0x05,0x09,0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88, - 0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xFE,0xF8,0x20, - 0x40,0x70,0x80,0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88, - 0x88,0x70,0x06,0x05,0x05,0x06,0x00,0x00,0xF8,0x50,0x50,0x54,0x48,0x05,0x07,0x07, - 0x06,0x00,0xFE,0x70,0x88,0x88,0xC8,0xB0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE, - 0x70,0x88,0x80,0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88, - 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x20,0x20,0x28,0x10,0x05,0x05,0x05, - 0x06,0x00,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0x10,0xA8, - 0xA8,0xA8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x50,0x20,0x50, - 0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xA8,0xA8,0x50}; -const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCE,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, - 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, - 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xA8,0xA8,0x50}; -const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x01,0x00,0x00, - 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xA8}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ' - FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν' - FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ' - FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ' - FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί' - FONTDATA_ITEM(7, 177, 181, fontpage_7_177_181), // 'α' -- 'ε' - FONTDATA_ITEM(7, 183, 199, fontpage_7_183_199), // 'η' -- 'χ' - FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω' - FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ' - FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h b/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h deleted file mode 100644 index 4b545f2284..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x80,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, - 0xF8}; -const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x9D,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, - 0x50,0x50,0x88,0x88,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80, - 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xE0, - 0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0, - 0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, - 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, - 0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0xA1,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80}; -const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA7,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x40,0x20,0x10,0x20,0x40,0xF8,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, - 0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, - 0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAF,0x00,0x08,0xFE,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, - 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0A,0x0A, - 0x06,0x00,0xFE,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, - 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xA0,0x40}; -const u8g_fntpgm_uint8_t fontpage_7_177_181[80] U8G_FONT_SECTION("fontpage_7_177_181") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB5,0x00,0x07,0xFE,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, - 0x00,0xFE,0x60,0x90,0x90,0xB0,0x88,0x88,0xF0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, - 0xFE,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, - 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70 - }; -const u8g_fntpgm_uint8_t fontpage_7_183_199[226] U8G_FONT_SECTION("fontpage_7_183_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xC7,0x00,0x09,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0xFE,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x04,0x07, - 0x07,0x06,0x01,0x00,0x60,0x90,0x90,0xF0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02, - 0x00,0x80,0x80,0x80,0xA0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0, - 0x90,0x05,0x09,0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88, - 0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xFE,0xF8,0x20, - 0x40,0x70,0x80,0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88, - 0x88,0x70,0x06,0x05,0x05,0x06,0x00,0x00,0xF8,0x50,0x50,0x54,0x48,0x05,0x07,0x07, - 0x06,0x00,0xFE,0x70,0x88,0x88,0xC8,0xB0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE, - 0x70,0x88,0x80,0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88, - 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x20,0x20,0x28,0x10,0x05,0x05,0x05, - 0x06,0x00,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0x10,0xA8, - 0xA8,0xA8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x50,0x20,0x50, - 0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xA8,0xA8,0x50}; -const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCE,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, - 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, - 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xA8,0xA8,0x50}; -const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x01,0x00,0x00, - 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xA8}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ' - FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν' - FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ' - FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ' - FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί' - FONTDATA_ITEM(7, 177, 181, fontpage_7_177_181), // 'α' -- 'ε' - FONTDATA_ITEM(7, 183, 199, fontpage_7_183_199), // 'η' -- 'χ' - FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω' - FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ' - FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_en.h b/Marlin/src/lcd/dogm/fontdata/langdata_en.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_en.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_es.h b/Marlin/src/lcd/dogm/fontdata/langdata_es.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_es.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_eu.h b/Marlin/src/lcd/dogm/fontdata/langdata_eu.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_eu.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_fi.h b/Marlin/src/lcd/dogm/fontdata/langdata_fi.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_fi.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_fr.h b/Marlin/src/lcd/dogm/fontdata/langdata_fr.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_fr.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_gl.h b/Marlin/src/lcd/dogm/fontdata/langdata_gl.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_gl.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_hr.h b/Marlin/src/lcd/dogm/fontdata/langdata_hr.h deleted file mode 100644 index cdb2cc7d1a..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_hr.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; -const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; -const u8g_fntpgm_uint8_t fontpage_2_145_145[31] U8G_FONT_SECTION("fontpage_2_145_145") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x08,0x00,0x00, - 0x00,0x06,0x08,0x08,0x06,0x00,0x00,0x08,0x1C,0x08,0x78,0x88,0x88,0x88,0x78}; -const u8g_fntpgm_uint8_t fontpage_2_225_225[31] U8G_FONT_SECTION("fontpage_2_225_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; -const u8g_fntpgm_uint8_t fontpage_2_254_254[31] U8G_FONT_SECTION("fontpage_2_254_254") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć' - FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č' - FONTDATA_ITEM(2, 145, 145, fontpage_2_145_145), // 'đ' -- 'đ' - FONTDATA_ITEM(2, 225, 225, fontpage_2_225_225), // 'š' -- 'š' - FONTDATA_ITEM(2, 254, 254, fontpage_2_254_254), // 'ž' -- 'ž' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_hu.h b/Marlin/src/lcd/dogm/fontdata/langdata_hu.h deleted file mode 100644 index 8c15a3890a..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_hu.h +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_2_241_241[31] U8G_FONT_SECTION("fontpage_2_241_241") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x48,0x90,0x00,0x88,0x88,0x88,0x88,0x70}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(2, 241, 241, fontpage_2_241_241), // 'ű' -- 'ű' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_it.h b/Marlin/src/lcd/dogm/fontdata/langdata_it.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_it.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h b/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h deleted file mode 100644 index 01316d4c13..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_97_161_164[65] U8G_FONT_SECTION("fontpage_97_161_164") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA4,0x00,0x07,0x00,0x00, - 0x00,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10,0x60,0x40,0x80,0x05,0x07,0x07,0x06, - 0x00,0x00,0xF8,0x08,0x28,0x30,0x20,0x20,0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x10, - 0x20,0x60,0xA0,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x20,0x60,0xA0,0x20, - 0x20}; -const u8g_fntpgm_uint8_t fontpage_97_166_166[30] U8G_FONT_SECTION("fontpage_97_166_166") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x88,0x88,0x08,0x10,0x60}; -const u8g_fntpgm_uint8_t fontpage_97_168_168[29] U8G_FONT_SECTION("fontpage_97_168_168") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x06,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0xF8}; -const u8g_fntpgm_uint8_t fontpage_97_170_187[268] U8G_FONT_SECTION("fontpage_97_170_187") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xBB,0x00,0x0D,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0xF8,0x10,0x30,0x50,0x90,0x10,0x05,0x07, - 0x07,0x06,0x00,0x00,0x40,0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x09,0x09,0x06,0x00, - 0x00,0x28,0x08,0x40,0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x07,0x07,0x06,0x00,0x00, - 0x20,0xF8,0x20,0x20,0xF8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20, - 0xF8,0x20,0x20,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0x88, - 0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40,0x78,0x48,0x88,0x08, - 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05, - 0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05,0x06, - 0x06,0x06,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x05,0x09,0x09,0x06,0x00,0x00, - 0x28,0x28,0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x50, - 0xF8,0x50,0x50,0x50,0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x50,0xF8, - 0x50,0x50,0x50,0x10,0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xC0,0x08,0xC8,0x08,0x10, - 0xE0,0x07,0x0D,0x0D,0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x28,0x28,0x00,0xC0,0x08, - 0xC8,0x08,0x10,0xE0,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10,0x10,0x20,0x50,0x88, - 0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF8,0x48,0x50,0x40,0x38}; -const u8g_fntpgm_uint8_t fontpage_97_189_193[85] U8G_FONT_SECTION("fontpage_97_189_193") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xC1,0x00,0x09,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x48,0x48,0x10,0x10,0x20,0x05,0x09,0x09, - 0x06,0x00,0x00,0x28,0x28,0x00,0x88,0x48,0x48,0x10,0x10,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x40,0x78,0x48,0xA8,0x18,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28, - 0x08,0x40,0x78,0x48,0xA8,0x18,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x60, - 0x20,0xF8,0x20,0x20,0x40}; -const u8g_fntpgm_uint8_t fontpage_97_195_211[241] U8G_FONT_SECTION("fontpage_97_195_211") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xD3,0x00,0x09,0x00,0x00, - 0x00,0x05,0x04,0x04,0x06,0x00,0x00,0xA8,0xA8,0x08,0x30,0x05,0x06,0x06,0x06,0x00, - 0x00,0xA8,0xA8,0xA8,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00, - 0xA8,0xA8,0xA8,0x08,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xF8,0x20, - 0x20,0x20,0x40,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x70,0x00,0xF8,0x20,0x20, - 0x20,0x40,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x04, - 0x09,0x09,0x06,0x01,0x00,0x50,0x10,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x05,0x07, - 0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x40,0x80,0x05,0x06,0x06,0x06,0x00, - 0x00,0x70,0x00,0x00,0x00,0x00,0xF8,0x05,0x06,0x06,0x06,0x00,0x00,0x78,0x08,0x28, - 0x10,0x28,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0x10,0x20,0x70,0xA8,0x20, - 0x03,0x06,0x06,0x06,0x01,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x06,0x06,0x06, - 0x00,0x00,0x10,0x50,0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28, - 0x00,0x10,0x50,0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00, - 0x10,0x50,0x50,0x48,0x88,0x88,0x04,0x06,0x06,0x06,0x00,0x00,0x80,0x90,0xE0,0x80, - 0x80,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x80,0x90,0xE0,0x80,0x80, - 0x70}; -const u8g_fntpgm_uint8_t fontpage_97_213_217[84] U8G_FONT_SECTION("fontpage_97_213_217") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD9,0x00,0x09,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09, - 0x06,0x00,0x00,0x28,0x28,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06, - 0x00,0x00,0x18,0x18,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x05,0x05,0x06,0x00, - 0x01,0x60,0xA0,0x10,0x10,0x08,0x05,0x08,0x08,0x06,0x00,0x01,0x28,0x28,0x00,0x60, - 0xA0,0x10,0x10,0x08}; -const u8g_fntpgm_uint8_t fontpage_97_219_220[45] U8G_FONT_SECTION("fontpage_97_219_220") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDC,0x00,0x09,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x09, - 0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20}; -const u8g_fntpgm_uint8_t fontpage_97_222_223[41] U8G_FONT_SECTION("fontpage_97_222_223") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDF,0x00,0x06,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0x08,0x50,0x20,0x10,0x04,0x06,0x06, - 0x06,0x01,0x00,0xE0,0x00,0xE0,0x00,0xC0,0x30}; -const u8g_fntpgm_uint8_t fontpage_97_225_237[174] U8G_FONT_SECTION("fontpage_97_225_237") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xED,0x00,0x07,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x08,0x48,0x30,0x10,0x28,0xC0,0x05,0x06,0x06, - 0x06,0x00,0x00,0xF0,0x40,0xF8,0x40,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x40, - 0xF8,0x48,0x50,0x40,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF8,0x48,0x50,0x40, - 0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x60,0x20,0x20,0x20,0xF0,0x05,0x06,0x06,0x06, - 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10, - 0xF0,0x10,0xF0,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0xF8,0x08,0x08,0xF8,0x05, - 0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xF8,0x08,0x08,0x10,0x60,0x04,0x07,0x07,0x06, - 0x00,0x00,0x10,0x90,0x90,0x90,0x90,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20, - 0x20,0xA0,0xA0,0xA8,0xA8,0xB0,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0x80,0x88, - 0xB0,0xC0,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xF8}; -const u8g_fntpgm_uint8_t fontpage_97_242_243[41] U8G_FONT_SECTION("fontpage_97_242_243") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF3,0x00,0x06,0x00,0x00, - 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0xF8,0x08,0x10,0x60,0x05,0x06,0x06, - 0x06,0x00,0x00,0xC0,0x08,0x08,0x08,0x10,0xE0}; -const u8g_fntpgm_uint8_t fontpage_97_252_252[25] U8G_FONT_SECTION("fontpage_97_252_252") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x05,0x00,0x00, - 0x00,0x05,0x02,0x02,0x06,0x00,0x03,0x80,0x78}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(97, 161, 164, fontpage_97_161_164), // 'ァ' -- 'イ' - FONTDATA_ITEM(97, 166, 166, fontpage_97_166_166), // 'ウ' -- 'ウ' - FONTDATA_ITEM(97, 168, 168, fontpage_97_168_168), // 'エ' -- 'エ' - FONTDATA_ITEM(97, 170, 187, fontpage_97_170_187), // 'オ' -- 'セ' - FONTDATA_ITEM(97, 189, 193, fontpage_97_189_193), // 'ソ' -- 'チ' - FONTDATA_ITEM(97, 195, 211, fontpage_97_195_211), // 'ッ' -- 'ビ' - FONTDATA_ITEM(97, 213, 217, fontpage_97_213_217), // 'フ' -- 'ベ' - FONTDATA_ITEM(97, 219, 220, fontpage_97_219_220), // 'ホ' -- 'ボ' - FONTDATA_ITEM(97, 222, 223, fontpage_97_222_223), // 'マ' -- 'ミ' - FONTDATA_ITEM(97, 225, 237, fontpage_97_225_237), // 'メ' -- 'ロ' - FONTDATA_ITEM(97, 242, 243, fontpage_97_242_243), // 'ヲ' -- 'ン' - FONTDATA_ITEM(97, 252, 252, fontpage_97_252_252), // 'ー' -- 'ー' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h b/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h deleted file mode 100644 index 6b48434a6f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h +++ /dev/null @@ -1,547 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_344_240_240[34] U8G_FONT_SECTION("fontpage_344_240_240") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x17,0x21,0x41,0x81,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_345_224_224[41] U8G_FONT_SECTION("fontpage_345_224_224") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x08, - 0x80,0x08,0x80,0x09,0x00,0x08,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_347_248_248[41] U8G_FONT_SECTION("fontpage_347_248_248") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00, - 0x80,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_348_137_137[45] U8G_FONT_SECTION("fontpage_348_137_137") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x00,0x80,0x00,0x80,0x01,0x00,0xFF, - 0xC0,0x00,0x00,0x20,0x80,0x20,0x80,0x3F,0x00,0x20,0x80,0x3F,0x00}; -const u8g_fntpgm_uint8_t fontpage_348_176_176[34] U8G_FONT_SECTION("fontpage_348_176_176") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x11,0x21,0x41,0x81,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_348_197_197[34] U8G_FONT_SECTION("fontpage_348_197_197") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x21,0xC1,0x1E,0x21,0x41, - 0x21,0x1E}; -const u8g_fntpgm_uint8_t fontpage_352_196_196[41] U8G_FONT_SECTION("fontpage_352_196_196") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x7F,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08, - 0x80,0x08,0x80,0x10,0x80,0x11,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_353_180_180[34] U8G_FONT_SECTION("fontpage_353_180_180") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x85,0x85,0x85,0x85,0x87,0x85,0x85,0xFD,0x05, - 0x05,0x05}; -const u8g_fntpgm_uint8_t fontpage_354_248_248[41] U8G_FONT_SECTION("fontpage_354_248_248") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x3F, - 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_356_132_132[43] U8G_FONT_SECTION("fontpage_356_132_132") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFF,0x00, - 0x00,0x0A,0x0A,0x14,0x0A,0x00,0xFF,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x3F, - 0x80,0x00,0x00,0xFF,0xC0,0x04,0x00,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_356_244_244[43] U8G_FONT_SECTION("fontpage_356_244_244") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFF,0x00, - 0x00,0x0A,0x0A,0x14,0x0A,0x00,0xFF,0x20,0x00,0x20,0x00,0x20,0x00,0x3F,0x80,0x00, - 0x00,0x00,0x00,0xFF,0xC0,0x12,0x00,0x12,0x00,0x12,0x00}; -const u8g_fntpgm_uint8_t fontpage_357_200_200[34] U8G_FONT_SECTION("fontpage_357_200_200") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x7D,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_357_228_228[45] U8G_FONT_SECTION("fontpage_357_228_228") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE4,0xE4,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x81,0x00,0x81,0x00,0x81,0x00,0x81, - 0x80,0x81,0x00,0x81,0x00,0xFD,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_357_249_249[45] U8G_FONT_SECTION("fontpage_357_249_249") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x81,0x00,0x81,0x00,0x81,0x80,0x81, - 0x00,0xFD,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x3E,0x00}; -const u8g_fntpgm_uint8_t fontpage_359_196_196[41] U8G_FONT_SECTION("fontpage_359_196_196") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x3F, - 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_359_204_204[45] U8G_FONT_SECTION("fontpage_359_204_204") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x20,0x00,0x3F,0x80,0x04,0x00,0xFF, - 0xC0,0x00,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_359_217_217[45] U8G_FONT_SECTION("fontpage_359_217_217") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x20,0x00,0x20,0x00,0x3F,0x80,0x04, - 0x00,0xFF,0xC0,0x00,0x00,0x1F,0x00,0x20,0x80,0x20,0x80,0x1F,0x00}; -const u8g_fntpgm_uint8_t fontpage_360_152_152[45] U8G_FONT_SECTION("fontpage_360_152_152") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7C,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7E, - 0x80,0x10,0x80,0x10,0x80,0xFF,0x80,0x00,0x80,0x00,0x80,0x00,0x80}; -const u8g_fntpgm_uint8_t fontpage_360_156_156[45] U8G_FONT_SECTION("fontpage_360_156_156") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7C,0x80,0x40,0x80,0x40,0x80,0x7C,0x80,0x10, - 0x80,0x10,0x80,0xFF,0x80,0x00,0x80,0x20,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_360_168_168[34] U8G_FONT_SECTION("fontpage_360_168_168") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x81,0x81,0xF9,0x21,0xFF,0x00,0x7F,0x41, - 0x41,0x7F}; -const u8g_fntpgm_uint8_t fontpage_361_164_164[45] U8G_FONT_SECTION("fontpage_361_164_164") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7C,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7C, - 0x80,0x00,0x80,0xFE,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; -const u8g_fntpgm_uint8_t fontpage_361_220_220[41] U8G_FONT_SECTION("fontpage_361_220_220") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x20, - 0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_362_148_148[34] U8G_FONT_SECTION("fontpage_362_148_148") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x81,0x81,0x81,0x81,0x81,0x81,0xFD,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_366_252_252[45] U8G_FONT_SECTION("fontpage_366_252_252") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x09,0x00,0xF9,0x00,0x81, - 0x80,0x81,0x00,0x81,0x00,0xFD,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_367_236_236[34] U8G_FONT_SECTION("fontpage_367_236_236") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xEC,0xEC,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF1,0x09,0x09,0xF1,0x87,0x81,0x81,0xF9,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_368_136_136[34] U8G_FONT_SECTION("fontpage_368_136_136") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF5,0x15,0x15,0xF5,0x8D,0x85,0x85,0xFD,0x05, - 0x05,0x05}; -const u8g_fntpgm_uint8_t fontpage_368_165_165[34] U8G_FONT_SECTION("fontpage_368_165_165") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF1,0x17,0xF1,0x87,0x81,0xF9,0x00,0x7F,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_368_220_220[41] U8G_FONT_SECTION("fontpage_368_220_220") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x00,0x20, - 0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_369_204_204[41] U8G_FONT_SECTION("fontpage_369_204_204") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x00,0x20, - 0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_370_244_244[41] U8G_FONT_SECTION("fontpage_370_244_244") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x00,0x20, - 0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_371_172_172[34] U8G_FONT_SECTION("fontpage_371_172_172") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0xF9,0x81,0x81,0x81,0xFD,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_371_176_176[34] U8G_FONT_SECTION("fontpage_371_176_176") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0xF9,0x81,0x81,0xFD,0x01,0x20, - 0x20,0x3F}; -const u8g_fntpgm_uint8_t fontpage_371_189_189[34] U8G_FONT_SECTION("fontpage_371_189_189") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0xF9,0x81,0x81,0xFD,0x00,0x41,0x3F, - 0x41,0x3F}; -const u8g_fntpgm_uint8_t fontpage_371_193_193[34] U8G_FONT_SECTION("fontpage_371_193_193") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0xF9,0x81,0x81,0xFD,0x01,0x3E,0x21, - 0x21,0x3E}; -const u8g_fntpgm_uint8_t fontpage_372_200_200[34] U8G_FONT_SECTION("fontpage_372_200_200") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x89,0x8F,0x89,0xF9,0x00,0x3F,0x41, - 0x41,0x3F}; -const u8g_fntpgm_uint8_t fontpage_372_212_212[34] U8G_FONT_SECTION("fontpage_372_212_212") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF5,0x95,0x95,0x9D,0x95,0x95,0x95,0xF5,0x05, - 0x05,0x05}; -const u8g_fntpgm_uint8_t fontpage_372_244_244[34] U8G_FONT_SECTION("fontpage_372_244_244") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x8F,0x89,0x8F,0xF9,0x01,0x21,0x20, - 0x20,0x3F}; -const u8g_fntpgm_uint8_t fontpage_373_168_168[41] U8G_FONT_SECTION("fontpage_373_168_168") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x3F, - 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_373_187_187[45] U8G_FONT_SECTION("fontpage_373_187_187") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x20,0x80,0x20,0x80,0x3F,0x00,0x04, - 0x00,0xFF,0xC0,0x00,0x00,0x04,0x00,0x0C,0x00,0x1A,0x00,0x61,0x80}; -const u8g_fntpgm_uint8_t fontpage_375_248_248[34] U8G_FONT_SECTION("fontpage_375_248_248") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x89,0x89,0x89,0x89,0x89,0xF9,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_376_128_128[34] U8G_FONT_SECTION("fontpage_376_128_128") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x89,0x89,0xF9,0x00,0x3F,0x01,0x3F, - 0x40,0x3F}; -const u8g_fntpgm_uint8_t fontpage_376_148_148[45] U8G_FONT_SECTION("fontpage_376_148_148") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x89,0x00,0x89,0x00,0x89,0x00,0xF9,0x00,0x89, - 0x80,0x89,0x00,0x89,0x00,0xF9,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_377_132_132[34] U8G_FONT_SECTION("fontpage_377_132_132") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x89,0x89,0x89,0xFF,0x89,0x89,0x89,0xF9,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_377_160_160[34] U8G_FONT_SECTION("fontpage_377_160_160") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x95,0x95,0x95,0xF5,0x9D,0x95,0x95,0xF5,0x05, - 0x05,0x05}; -const u8g_fntpgm_uint8_t fontpage_377_168_168[34] U8G_FONT_SECTION("fontpage_377_168_168") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x95,0x95,0xFD,0x95,0xF5,0x00,0x3F,0x01,0x3F, - 0x40,0x3F}; -const u8g_fntpgm_uint8_t fontpage_377_248_248[45] U8G_FONT_SECTION("fontpage_377_248_248") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x20,0x80,0x20,0x80,0x3F,0x00,0x20,0x80,0x3F, - 0x00,0x04,0x00,0xFF,0xC0,0x00,0x00,0x20,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_380_196_196[34] U8G_FONT_SECTION("fontpage_380_196_196") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x89,0x89,0x89,0xF9,0x89,0x89,0x89,0xF9,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_385_172_172[45] U8G_FONT_SECTION("fontpage_385_172_172") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x61, - 0x80,0x51,0x00,0x99,0x00,0x89,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_385_189_189[45] U8G_FONT_SECTION("fontpage_385_189_189") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x21,0x00,0x21,0x00,0x21,0x00,0x51,0x80,0xD9, - 0x00,0x89,0x00,0x00,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x7E,0x00}; -const u8g_fntpgm_uint8_t fontpage_385_200_200[34] U8G_FONT_SECTION("fontpage_385_200_200") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x25,0x25,0x25,0x45,0x67,0x65,0x95,0x95,0x05, - 0x05,0x05}; -const u8g_fntpgm_uint8_t fontpage_386_164_164[34] U8G_FONT_SECTION("fontpage_386_164_164") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x21,0x21,0x27,0x51,0x89,0x00,0x3F,0x01,0x3F, - 0x40,0x3F}; -const u8g_fntpgm_uint8_t fontpage_387_140_141[69] U8G_FONT_SECTION("fontpage_387_140_141") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x04,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x31, - 0x00,0x44,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x04, - 0x00,0x0C,0x00,0x13,0x00,0x65,0x80,0x04,0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x00, - 0x80,0x00,0x80,0x00,0x80}; -const u8g_fntpgm_uint8_t fontpage_389_164_164[41] U8G_FONT_SECTION("fontpage_389_164_164") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x04,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x31, - 0x00,0x40,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_389_172_172[45] U8G_FONT_SECTION("fontpage_389_172_172") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x04,0x00,0x1A,0x00,0x61,0x80,0x00,0x00,0xFF, - 0xC0,0x00,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_389_220_221[51] U8G_FONT_SECTION("fontpage_389_220_221") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xDC,0xDD,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x21,0x21,0x21,0x21,0x21,0x51,0xC9,0x89,0x01, - 0x01,0x01,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x21,0x21,0x21,0x51,0xD9,0x89,0x00,0x7F, - 0x01,0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_395_180_180[34] U8G_FONT_SECTION("fontpage_395_180_180") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x8F,0x89,0x89,0x89,0x71,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_395_198_198[45] U8G_FONT_SECTION("fontpage_395_198_198") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x71,0x00,0x89,0x00,0x8F,0x00,0x89,0x00,0x89, - 0x00,0x71,0x00,0x00,0x00,0x4A,0x00,0x72,0x00,0x4D,0x00,0x74,0x80}; -const u8g_fntpgm_uint8_t fontpage_395_209_209[34] U8G_FONT_SECTION("fontpage_395_209_209") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x65,0x95,0x95,0x9D,0x95,0x65,0x00,0x7F,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_395_212_212[45] U8G_FONT_SECTION("fontpage_395_212_212") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x65,0x00,0x95,0x00,0x95,0x00,0x9D,0x00,0x95, - 0x00,0x65,0x00,0x05,0x00,0x25,0x00,0x20,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_395_244_244[34] U8G_FONT_SECTION("fontpage_395_244_244") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x8F,0x89,0x8F,0x71,0x00,0x3F,0x01,0x3F, - 0x40,0x3F}; -const u8g_fntpgm_uint8_t fontpage_396_136_136[34] U8G_FONT_SECTION("fontpage_396_136_136") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x65,0x95,0x9D,0x95,0x95,0x9D,0x95,0x65,0x05, - 0x05,0x05}; -const u8g_fntpgm_uint8_t fontpage_396_164_164[41] U8G_FONT_SECTION("fontpage_396_164_164") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x1E,0x00,0x21,0x00,0x20,0x80,0x20,0x80,0x21, - 0x00,0x1E,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_396_168_168[45] U8G_FONT_SECTION("fontpage_396_168_168") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1F,0x00,0x20,0x80,0x20,0x80,0x1F,0x00,0x04, - 0x00,0x04,0x00,0xFF,0xC0,0x00,0x00,0x20,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_396_196_196[45] U8G_FONT_SECTION("fontpage_396_196_196") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x44,0x80,0x44,0x80,0x44,0x80,0x38, - 0xC0,0x10,0x80,0xFE,0x80,0x00,0x80,0x20,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_397_208_208[34] U8G_FONT_SECTION("fontpage_397_208_208") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x71,0x01,0xFF,0x21,0x27,0x41, - 0x40,0x7F}; -const u8g_fntpgm_uint8_t fontpage_398_132_132[45] U8G_FONT_SECTION("fontpage_398_132_132") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x44,0x80,0x42,0x80,0x44,0x80,0x38, - 0x80,0x00,0x80,0xFE,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; -const u8g_fntpgm_uint8_t fontpage_398_188_188[41] U8G_FONT_SECTION("fontpage_398_188_188") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x1E,0x00,0x21,0x00,0x20,0x80,0x20,0x80,0x21, - 0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_398_204_204[45] U8G_FONT_SECTION("fontpage_398_204_204") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1E,0x00,0x21,0x00,0x21,0x00,0x1E,0x00,0x00, - 0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x20,0x80,0x20,0x80,0x3F,0x00}; -const u8g_fntpgm_uint8_t fontpage_398_244_244[34] U8G_FONT_SECTION("fontpage_398_244_244") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x49,0x89,0x89,0x89,0x89,0x49,0x71,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_398_252_253[51] U8G_FONT_SECTION("fontpage_398_252_253") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xFC,0xFD,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x89,0x71,0x00,0x3F,0x01,0x3F, - 0x40,0x3F,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x89,0x71,0x00,0x77,0x11, - 0x71,0x41,0x79}; -const u8g_fntpgm_uint8_t fontpage_399_133_133[34] U8G_FONT_SECTION("fontpage_399_133_133") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x89,0x89,0x71,0x00,0x41,0x3F, - 0x41,0x3F}; -const u8g_fntpgm_uint8_t fontpage_399_144_145[73] U8G_FONT_SECTION("fontpage_399_144_145") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x90,0x91,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x11,0x00,0x11,0x00,0x21, - 0x80,0x71,0x00,0xC9,0x00,0x85,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x09,0x0B,0x16, - 0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x11,0x00,0x31,0x80,0x49,0x00,0x85,0x00,0x00, - 0x00,0x7E,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_399_152_152[45] U8G_FONT_SECTION("fontpage_399_152_152") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x11,0x00,0x11,0x80,0x79,0x00,0x85, - 0x00,0x00,0x00,0x7E,0x00,0x01,0x00,0x7E,0x00,0x40,0x00,0x7F,0x00}; -const u8g_fntpgm_uint8_t fontpage_399_165_165[45] U8G_FONT_SECTION("fontpage_399_165_165") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x11,0x00,0x31,0x80,0x79, - 0x00,0x85,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x3E,0x00}; -const u8g_fntpgm_uint8_t fontpage_399_172_172[45] U8G_FONT_SECTION("fontpage_399_172_172") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7A,0x80,0x0A,0x80,0x0A,0x80,0x12,0x80,0x13, - 0x80,0x2A,0x80,0x6A,0x80,0xC6,0x80,0x02,0x80,0x02,0x80,0x02,0x80}; -const u8g_fntpgm_uint8_t fontpage_400_128_128[34] U8G_FONT_SECTION("fontpage_400_128_128") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x11,0x17,0x31,0x71,0xC9,0x85,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_400_132_132[34] U8G_FONT_SECTION("fontpage_400_132_132") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x17,0x31,0x49,0x85,0x01,0x21,0x20, - 0x20,0x3F}; -const u8g_fntpgm_uint8_t fontpage_400_149_149[34] U8G_FONT_SECTION("fontpage_400_149_149") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x17,0x31,0x49,0x85,0x00,0x3E,0x21, - 0x21,0x3E}; -const u8g_fntpgm_uint8_t fontpage_400_156_156[45] U8G_FONT_SECTION("fontpage_400_156_156") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7A,0x80,0x0A,0x80,0x0A,0x80,0x16,0x80,0x12, - 0x80,0x2A,0x80,0x4A,0x80,0x86,0x80,0x02,0x80,0x02,0x80,0x02,0x80}; -const u8g_fntpgm_uint8_t fontpage_401_253_253[45] U8G_FONT_SECTION("fontpage_401_253_253") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x01,0x00,0x0E,0x00,0x71,0x80,0x00, - 0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x00,0x80,0x00,0x80,0x00,0x80}; -const u8g_fntpgm_uint8_t fontpage_402_128_128[45] U8G_FONT_SECTION("fontpage_402_128_128") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x01,0x00,0x0E,0x00,0x71,0x80,0x00, - 0x00,0xFF,0xC0,0x04,0x00,0x24,0x00,0x24,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_402_145_145[45] U8G_FONT_SECTION("fontpage_402_145_145") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x01,0x00,0x0E,0x00,0x71,0x80,0x00, - 0x00,0xFF,0xC0,0x04,0x00,0x1F,0x00,0x20,0x80,0x20,0x80,0x1F,0x00}; -const u8g_fntpgm_uint8_t fontpage_403_144_144[45] U8G_FONT_SECTION("fontpage_403_144_144") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x0E,0x00,0x71,0x80,0x00,0x00,0xFF, - 0xC0,0x00,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_403_192_192[34] U8G_FONT_SECTION("fontpage_403_192_192") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x31,0x31,0xC9,0x85,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_409_152_152[34] U8G_FONT_SECTION("fontpage_409_152_152") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xF9,0x11,0x17,0x31,0x49,0x85,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_410_136_136[41] U8G_FONT_SECTION("fontpage_410_136_136") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x02,0x00,0x0E, - 0x00,0x71,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_411_149_149[45] U8G_FONT_SECTION("fontpage_411_149_149") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1E,0x00,0x00,0x00,0x3F,0x00,0x0C,0x00,0x73, - 0x80,0x00,0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x00,0x80,0x00,0x80}; -const u8g_fntpgm_uint8_t fontpage_411_156_156[47] U8G_FONT_SECTION("fontpage_411_156_156") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFD,0x00, - 0x00,0x0A,0x0C,0x18,0x0A,0x00,0xFD,0x1E,0x00,0x00,0x00,0x3F,0x00,0x1A,0x00,0x21, - 0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_411_164_164[45] U8G_FONT_SECTION("fontpage_411_164_164") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1E,0x00,0x00,0x00,0x3F,0x00,0x0C,0x00,0x73, - 0x80,0x00,0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x20,0x80,0x3F,0x00}; -const u8g_fntpgm_uint8_t fontpage_411_232_232[45] U8G_FONT_SECTION("fontpage_411_232_232") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x00,0x80,0x7C,0x80,0x18,0x80,0x66, - 0x80,0x00,0x80,0xFE,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; -const u8g_fntpgm_uint8_t fontpage_412_216_216[34] U8G_FONT_SECTION("fontpage_412_216_216") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xF9,0x09,0x11,0x31,0x49,0x85,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_412_232_232[34] U8G_FONT_SECTION("fontpage_412_232_232") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xF9,0x09,0x31,0xCD,0x00,0x3F,0x41, - 0x41,0x3F}; -const u8g_fntpgm_uint8_t fontpage_412_244_244[45] U8G_FONT_SECTION("fontpage_412_244_244") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x09,0x00,0xF1,0x00,0x11, - 0x80,0x21,0x00,0x41,0x00,0x81,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_414_156_156[34] U8G_FONT_SECTION("fontpage_414_156_156") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x0F,0xF1,0x11,0x2F,0x41,0x81,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_417_209_209[45] U8G_FONT_SECTION("fontpage_417_209_209") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x81,0x00,0xF9,0x80,0x81,0x00,0x81, - 0x00,0xFD,0x00,0x00,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x7E,0x00}; -const u8g_fntpgm_uint8_t fontpage_418_176_176[34] U8G_FONT_SECTION("fontpage_418_176_176") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x81,0x81,0xF7,0x81,0x81,0x81,0xF9,0x01, - 0x01,0x01}; -const u8g_fntpgm_uint8_t fontpage_418_204_204[34] U8G_FONT_SECTION("fontpage_418_204_204") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF5,0x85,0x85,0xED,0x85,0x85,0x85,0xFD,0x05, - 0x05,0x05}; -const u8g_fntpgm_uint8_t fontpage_419_160_160[41] U8G_FONT_SECTION("fontpage_419_160_160") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x3F,0x00,0x20,0x00,0x20, - 0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_421_184_184[41] U8G_FONT_SECTION("fontpage_421_184_184") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB8,0xB8,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x3F,0x00,0x20,0x00,0x20, - 0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_423_156_156[45] U8G_FONT_SECTION("fontpage_423_156_156") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0xFA,0x80,0x4A,0x80,0x4E,0x80,0x4A,0x80,0x4A, - 0x80,0xFE,0x80,0x02,0x80,0x12,0x80,0x10,0x00,0x10,0x00,0x1F,0xC0}; -const u8g_fntpgm_uint8_t fontpage_426_132_132[41] U8G_FONT_SECTION("fontpage_426_132_132") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0x00,0x00, - 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x12,0x00,0x12, - 0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_426_216_216[45] U8G_FONT_SECTION("fontpage_426_216_216") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x71,0x00,0x01,0x00,0xFD,0x00,0x01,0x00,0x71, - 0x80,0x89,0x00,0x89,0x00,0x89,0x00,0x71,0x00,0x01,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_426_233_233[45] U8G_FONT_SECTION("fontpage_426_233_233") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x09,0xFE,0x00, - 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x71,0x00,0x01,0x00,0xFD,0x00,0x49,0x80,0x89, - 0x00,0x79,0x00,0x00,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x7E,0x00}; -const u8g_fntpgm_uint8_t fontpage_428_200_200[45] U8G_FONT_SECTION("fontpage_428_200_200") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x0E,0x00,0x00,0x00,0x7F,0x80,0x21,0x00,0x1E, - 0x00,0x04,0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x20,0x80,0x3F,0x00}; -const u8g_fntpgm_uint8_t fontpage_428_212_212[45] U8G_FONT_SECTION("fontpage_428_212_212") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x09,0xFE,0x00, - 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x00,0x80,0x7E,0x80,0x00,0x80,0x38, - 0x80,0x44,0xC0,0x3C,0x80,0x10,0x80,0xFE,0x80,0x00,0x80,0x00,0x80}; -const u8g_fntpgm_uint8_t fontpage_431_136_136[34] U8G_FONT_SECTION("fontpage_431_136_136") = { - 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xFE,0x00, - 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xFD,0x01,0x71,0x49,0x89,0x49,0x71, - 0x01,0x01}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(344, 240, 240, fontpage_344_240_240), // '거' -- '거' - FONTDATA_ITEM(345, 224, 224, fontpage_345_224_224), // '고' -- '고' - FONTDATA_ITEM(347, 248, 248, fontpage_347_248_248), // '그' -- '그' - FONTDATA_ITEM(348, 137, 137, fontpage_348_137_137), // '급' -- '급' - FONTDATA_ITEM(348, 176, 176, fontpage_348_176_176), // '기' -- '기' - FONTDATA_ITEM(348, 197, 197, fontpage_348_197_197), // '깅' -- '깅' - FONTDATA_ITEM(352, 196, 196, fontpage_352_196_196), // '끄' -- '끄' - FONTDATA_ITEM(353, 180, 180, fontpage_353_180_180), // '내' -- '내' - FONTDATA_ITEM(354, 248, 248, fontpage_354_248_248), // '노' -- '노' - FONTDATA_ITEM(356, 132, 132, fontpage_356_132_132), // '누' -- '누' - FONTDATA_ITEM(356, 244, 244, fontpage_356_244_244), // '뉴' -- '뉴' - FONTDATA_ITEM(357, 200, 200, fontpage_357_200_200), // '니' -- '니' - FONTDATA_ITEM(357, 228, 228, fontpage_357_228_228), // '다' -- '다' - FONTDATA_ITEM(357, 249, 249, fontpage_357_249_249), // '당' -- '당' - FONTDATA_ITEM(359, 196, 196, fontpage_359_196_196), // '도' -- '도' - FONTDATA_ITEM(359, 204, 204, fontpage_359_204_204), // '돌' -- '돌' - FONTDATA_ITEM(359, 217, 217, fontpage_359_217_217), // '동' -- '동' - FONTDATA_ITEM(360, 152, 152, fontpage_360_152_152), // '되' -- '되' - FONTDATA_ITEM(360, 156, 156, fontpage_360_156_156), // '된' -- '된' - FONTDATA_ITEM(360, 168, 168, fontpage_360_168_168), // '됨' -- '됨' - FONTDATA_ITEM(361, 164, 164, fontpage_361_164_164), // '뒤' -- '뒤' - FONTDATA_ITEM(361, 220, 220, fontpage_361_220_220), // '드' -- '드' - FONTDATA_ITEM(362, 148, 148, fontpage_362_148_148), // '디' -- '디' - FONTDATA_ITEM(366, 252, 252, fontpage_366_252_252), // '라' -- '라' - FONTDATA_ITEM(367, 236, 236, fontpage_367_236_236), // '러' -- '러' - FONTDATA_ITEM(368, 136, 136, fontpage_368_136_136), // '레' -- '레' - FONTDATA_ITEM(368, 165, 165, fontpage_368_165_165), // '력' -- '력' - FONTDATA_ITEM(368, 220, 220, fontpage_368_220_220), // '로' -- '로' - FONTDATA_ITEM(369, 204, 204, fontpage_369_204_204), // '료' -- '료' - FONTDATA_ITEM(370, 244, 244, fontpage_370_244_244), // '르' -- '르' - FONTDATA_ITEM(371, 172, 172, fontpage_371_172_172), // '리' -- '리' - FONTDATA_ITEM(371, 176, 176, fontpage_371_176_176), // '린' -- '린' - FONTDATA_ITEM(371, 189, 189, fontpage_371_189_189), // '립' -- '립' - FONTDATA_ITEM(371, 193, 193, fontpage_371_193_193), // '링' -- '링' - FONTDATA_ITEM(372, 200, 200, fontpage_372_200_200), // '멈' -- '멈' - FONTDATA_ITEM(372, 212, 212, fontpage_372_212_212), // '메' -- '메' - FONTDATA_ITEM(372, 244, 244, fontpage_372_244_244), // '면' -- '면' - FONTDATA_ITEM(373, 168, 168, fontpage_373_168_168), // '모' -- '모' - FONTDATA_ITEM(373, 187, 187, fontpage_373_187_187), // '못' -- '못' - FONTDATA_ITEM(375, 248, 248, fontpage_375_248_248), // '미' -- '미' - FONTDATA_ITEM(376, 128, 128, fontpage_376_128_128), // '밀' -- '밀' - FONTDATA_ITEM(376, 148, 148, fontpage_376_148_148), // '바' -- '바' - FONTDATA_ITEM(377, 132, 132, fontpage_377_132_132), // '버' -- '버' - FONTDATA_ITEM(377, 160, 160, fontpage_377_160_160), // '베' -- '베' - FONTDATA_ITEM(377, 168, 168, fontpage_377_168_168), // '벨' -- '벨' - FONTDATA_ITEM(377, 248, 248, fontpage_377_248_248), // '본' -- '본' - FONTDATA_ITEM(380, 196, 196, fontpage_380_196_196), // '비' -- '비' - FONTDATA_ITEM(385, 172, 172, fontpage_385_172_172), // '사' -- '사' - FONTDATA_ITEM(385, 189, 189, fontpage_385_189_189), // '삽' -- '삽' - FONTDATA_ITEM(385, 200, 200, fontpage_385_200_200), // '새' -- '새' - FONTDATA_ITEM(386, 164, 164, fontpage_386_164_164), // '설' -- '설' - FONTDATA_ITEM(387, 140, 141, fontpage_387_140_141), // '소' -- '속' - FONTDATA_ITEM(389, 164, 164, fontpage_389_164_164), // '스' -- '스' - FONTDATA_ITEM(389, 172, 172, fontpage_389_172_172), // '슬' -- '슬' - FONTDATA_ITEM(389, 220, 221, fontpage_389_220_221), // '시' -- '식' - FONTDATA_ITEM(395, 180, 180, fontpage_395_180_180), // '어' -- '어' - FONTDATA_ITEM(395, 198, 198, fontpage_395_198_198), // '없' -- '없' - FONTDATA_ITEM(395, 209, 209, fontpage_395_209_209), // '엑' -- '엑' - FONTDATA_ITEM(395, 212, 212, fontpage_395_212_212), // '엔' -- '엔' - FONTDATA_ITEM(395, 244, 244, fontpage_395_244_244), // '열' -- '열' - FONTDATA_ITEM(396, 136, 136, fontpage_396_136_136), // '예' -- '예' - FONTDATA_ITEM(396, 164, 164, fontpage_396_164_164), // '오' -- '오' - FONTDATA_ITEM(396, 168, 168, fontpage_396_168_168), // '온' -- '온' - FONTDATA_ITEM(396, 196, 196, fontpage_396_196_196), // '완' -- '완' - FONTDATA_ITEM(397, 208, 208, fontpage_397_208_208), // '원' -- '원' - FONTDATA_ITEM(398, 132, 132, fontpage_398_132_132), // '위' -- '위' - FONTDATA_ITEM(398, 188, 188, fontpage_398_188_188), // '으' -- '으' - FONTDATA_ITEM(398, 204, 204, fontpage_398_204_204), // '음' -- '음' - FONTDATA_ITEM(398, 244, 244, fontpage_398_244_244), // '이' -- '이' - FONTDATA_ITEM(398, 252, 253, fontpage_398_252_253), // '일' -- '읽' - FONTDATA_ITEM(399, 133, 133, fontpage_399_133_133), // '입' -- '입' - FONTDATA_ITEM(399, 144, 145, fontpage_399_144_145), // '자' -- '작' - FONTDATA_ITEM(399, 152, 152, fontpage_399_152_152), // '잘' -- '잘' - FONTDATA_ITEM(399, 165, 165, fontpage_399_165_165), // '장' -- '장' - FONTDATA_ITEM(399, 172, 172, fontpage_399_172_172), // '재' -- '재' - FONTDATA_ITEM(400, 128, 128, fontpage_400_128_128), // '저' -- '저' - FONTDATA_ITEM(400, 132, 132, fontpage_400_132_132), // '전' -- '전' - FONTDATA_ITEM(400, 149, 149, fontpage_400_149_149), // '정' -- '정' - FONTDATA_ITEM(400, 156, 156, fontpage_400_156_156), // '제' -- '제' - FONTDATA_ITEM(401, 253, 253, fontpage_401_253_253), // '죽' -- '죽' - FONTDATA_ITEM(402, 128, 128, fontpage_402_128_128), // '준' -- '준' - FONTDATA_ITEM(402, 145, 145, fontpage_402_145_145), // '중' -- '중' - FONTDATA_ITEM(403, 144, 144, fontpage_403_144_144), // '즐' -- '즐' - FONTDATA_ITEM(403, 192, 192, fontpage_403_192_192), // '지' -- '지' - FONTDATA_ITEM(409, 152, 152, fontpage_409_152_152), // '처' -- '처' - FONTDATA_ITEM(410, 136, 136, fontpage_410_136_136), // '초' -- '초' - FONTDATA_ITEM(411, 149, 149, fontpage_411_149_149), // '축' -- '축' - FONTDATA_ITEM(411, 156, 156, fontpage_411_156_156), // '출' -- '출' - FONTDATA_ITEM(411, 164, 164, fontpage_411_164_164), // '춤' -- '춤' - FONTDATA_ITEM(411, 232, 232, fontpage_411_232_232), // '취' -- '취' - FONTDATA_ITEM(412, 216, 216, fontpage_412_216_216), // '치' -- '치' - FONTDATA_ITEM(412, 232, 232, fontpage_412_232_232), // '침' -- '침' - FONTDATA_ITEM(412, 244, 244, fontpage_412_244_244), // '카' -- '카' - FONTDATA_ITEM(414, 156, 156, fontpage_414_156_156), // '켜' -- '켜' - FONTDATA_ITEM(417, 209, 209, fontpage_417_209_209), // '탑' -- '탑' - FONTDATA_ITEM(418, 176, 176, fontpage_418_176_176), // '터' -- '터' - FONTDATA_ITEM(418, 204, 204, fontpage_418_204_204), // '테' -- '테' - FONTDATA_ITEM(419, 160, 160, fontpage_419_160_160), // '토' -- '토' - FONTDATA_ITEM(421, 184, 184, fontpage_421_184_184), // '트' -- '트' - FONTDATA_ITEM(423, 156, 156, fontpage_423_156_156), // '펜' -- '펜' - FONTDATA_ITEM(426, 132, 132, fontpage_426_132_132), // '프' -- '프' - FONTDATA_ITEM(426, 216, 216, fontpage_426_216_216), // '하' -- '하' - FONTDATA_ITEM(426, 233, 233, fontpage_426_233_233), // '합' -- '합' - FONTDATA_ITEM(428, 200, 200, fontpage_428_200_200), // '홈' -- '홈' - FONTDATA_ITEM(428, 212, 212, fontpage_428_212_212), // '화' -- '화' - FONTDATA_ITEM(431, 136, 136, fontpage_431_136_136), // '히' -- '히' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_nl.h b/Marlin/src/lcd/dogm/fontdata/langdata_nl.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_nl.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_pl.h b/Marlin/src/lcd/dogm/fontdata/langdata_pl.h deleted file mode 100644 index 926f075295..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_pl.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_2_132_133[45] U8G_FONT_SECTION("fontpage_2_132_133") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x07,0xFE,0x00, - 0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x10,0x08, - 0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x08,0x78,0x88,0x78,0x20,0x30}; -const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; -const u8g_fntpgm_uint8_t fontpage_2_153_153[30] U8G_FONT_SECTION("fontpage_2_153_153") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x05,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0xF0,0x80,0x70,0x20,0x30}; -const u8g_fntpgm_uint8_t fontpage_2_193_196[73] U8G_FONT_SECTION("fontpage_2_193_196") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC4,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0x60,0xC0,0x40,0x40,0x78,0x03,0x07, - 0x07,0x06,0x01,0x00,0xC0,0x40,0x60,0xC0,0x40,0x40,0xE0,0x05,0x0A,0x0A,0x06,0x00, - 0x00,0x10,0x20,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x08,0x08,0x06,0x00, - 0x00,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_2_218_219[47] U8G_FONT_SECTION("fontpage_2_218_219") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDA,0xDB,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; -const u8g_fntpgm_uint8_t fontpage_2_252_252[30] U8G_FONT_SECTION("fontpage_2_252_252") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(2, 132, 133, fontpage_2_132_133), // 'Ą' -- 'ą' - FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć' - FONTDATA_ITEM(2, 153, 153, fontpage_2_153_153), // 'ę' -- 'ę' - FONTDATA_ITEM(2, 193, 196, fontpage_2_193_196), // 'Ł' -- 'ń' - FONTDATA_ITEM(2, 218, 219, fontpage_2_218_219), // 'Ś' -- 'ś' - FONTDATA_ITEM(2, 252, 252, fontpage_2_252_252), // 'ż' -- 'ż' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_pt.h b/Marlin/src/lcd/dogm/fontdata/langdata_pt.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_pt.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_pt_br.h b/Marlin/src/lcd/dogm/fontdata/langdata_pt_br.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_pt_br.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ro.h b/Marlin/src/lcd/dogm/fontdata/langdata_ro.h deleted file mode 100644 index ffda82764f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_ro.h +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ru.h b/Marlin/src/lcd/dogm/fontdata/langdata_ru.h deleted file mode 100644 index 4edd6e74e3..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_ru.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_8_144_168[348] U8G_FONT_SECTION("fontpage_8_144_168") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0xA8,0x00,0x0A,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80, - 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0x50, - 0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8, - 0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0x70,0x20,0x70,0xA8,0xA8,0x05,0x07,0x07, - 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, - 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88,0x70,0x00, - 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, - 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, - 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x88, - 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x80, - 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, - 0x70,0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, - 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0x90,0x90,0xF8, - 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05, - 0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8}; -const u8g_fntpgm_uint8_t fontpage_8_171_173[56] U8G_FONT_SECTION("fontpage_8_171_173") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAD,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xC8,0xA8,0xA8,0xC8,0x04,0x07, - 0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0xE0,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x08,0x78,0x08,0x88,0x70}; -const u8g_fntpgm_uint8_t fontpage_8_175_207[400] U8G_FONT_SECTION("fontpage_8_175_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xCF,0x00,0x08,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88,0xF0,0x88, - 0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, - 0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, - 0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xA8, - 0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x05,0x05, - 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xD8, - 0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8, - 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, - 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88, - 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x20,0x20,0x70,0xA8,0xA8,0xA8, - 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, - 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8, - 0xF8,0x05,0x07,0x07,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08,0x05,0x05, - 0x05,0x06,0x00,0x00,0xC0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x88,0xC8,0xA8,0xC8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0xE0,0x04, - 0x05,0x05,0x06,0x01,0x00,0xE0,0x10,0x70,0x10,0xE0,0x05,0x05,0x05,0x06,0x00,0x00, - 0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90 - }; -const u8g_fntpgm_uint8_t fontpage_8_209_209[30] U8G_FONT_SECTION("fontpage_8_209_209") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xF0,0x80,0x70}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(8, 144, 168, fontpage_8_144_168), // 'А' -- 'Ш' - FONTDATA_ITEM(8, 171, 173, fontpage_8_171_173), // 'Ы' -- 'Э' - FONTDATA_ITEM(8, 175, 207, fontpage_8_175_207), // 'Я' -- 'я' - FONTDATA_ITEM(8, 209, 209, fontpage_8_209_209), // 'ё' -- 'ё' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h deleted file mode 100644 index d2e7ec2c56..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_2_140_143[79] U8G_FONT_SECTION("fontpage_2_140_143") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8F,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70,0x05, - 0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x06, - 0x0A,0x0A,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78}; -const u8g_fntpgm_uint8_t fontpage_2_186_186[33] U8G_FONT_SECTION("fontpage_2_186_186") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0x00,0x00, - 0x00,0x03,0x0A,0x0A,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40, - 0xE0}; -const u8g_fntpgm_uint8_t fontpage_2_190_190[33] U8G_FONT_SECTION("fontpage_2_190_190") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0x00,0x00, - 0x00,0x03,0x0A,0x0A,0x06,0x01,0x00,0xA0,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40, - 0xE0}; -const u8g_fntpgm_uint8_t fontpage_2_199_200[47] U8G_FONT_SECTION("fontpage_2_199_200") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC8,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88, - 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88}; -const u8g_fntpgm_uint8_t fontpage_2_224_225[47] U8G_FONT_SECTION("fontpage_2_224_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE1,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; -const u8g_fntpgm_uint8_t fontpage_2_229_229[33] U8G_FONT_SECTION("fontpage_2_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, - 0x18}; -const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFE,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80, - 0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(2, 140, 143, fontpage_2_140_143), // 'Č' -- 'ď' - FONTDATA_ITEM(2, 186, 186, fontpage_2_186_186), // 'ĺ' -- 'ĺ' - FONTDATA_ITEM(2, 190, 190, fontpage_2_190_190), // 'ľ' -- 'ľ' - FONTDATA_ITEM(2, 199, 200, fontpage_2_199_200), // 'Ň' -- 'ň' - FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Š' -- 'š' - FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'ť' -- 'ť' - FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_test.h b/Marlin/src/lcd/dogm/fontdata/langdata_test.h deleted file mode 100644 index c397d8b4b9..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_test.h +++ /dev/null @@ -1,231 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_8_128_255[1677] U8G_FONT_SECTION("fontpage_8_128_255") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x00,0x0A,0xFE,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, - 0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8, - 0x05,0x09,0x09,0x06,0x00,0xFE,0xE0,0x40,0x40,0x70,0x48,0x48,0x48,0x08,0x30,0x05, - 0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05, - 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0xF0,0x80,0x88,0x70,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xE0, - 0x40,0x40,0x40,0x40,0x40,0xE0,0x03,0x09,0x09,0x06,0x01,0x00,0xA0,0x00,0xE0,0x40, - 0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x10,0x10,0x10,0x10, - 0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x60,0xA0,0xA0,0xB0,0xA8,0xA8,0xB0,0x05, - 0x07,0x07,0x06,0x00,0x00,0xA0,0xA0,0xA0,0xF0,0xA8,0xA8,0xB0,0x05,0x07,0x07,0x06, - 0x00,0x00,0xE0,0x40,0x40,0x70,0x48,0x48,0x48,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10, - 0x20,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40, - 0x20,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88, - 0x70,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x88, - 0x88,0x88,0x88,0x88,0x88,0xF8,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, - 0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88, - 0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05, - 0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06, - 0x00,0xFF,0x30,0x50,0x50,0x50,0x50,0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00, - 0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0x70, - 0x20,0x70,0xA8,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A, - 0x0A,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8, - 0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88, - 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20, - 0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07, - 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xFE, - 0x90,0x90,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88, - 0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8, - 0xA8,0xA8,0xF8,0x05,0x09,0x09,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8, - 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xC8,0xA8,0xA8,0xC8,0x04,0x07,0x07,0x06, - 0x01,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x08,0x78,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0xA8,0xA8,0xE8, - 0xA8,0xA8,0x90,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88, - 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88, - 0xF0,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06, - 0x06,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x70,0x88,0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8, - 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00, - 0x00,0x88,0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88, - 0x98,0xA8,0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05, - 0x05,0x05,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x88,0xD8,0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88, - 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00, - 0x00,0xF8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88, - 0xF0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05, - 0x05,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88, - 0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x20,0x20,0x70,0xA8, - 0xA8,0xA8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88, - 0x05,0x07,0x07,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8, - 0xA8,0xA8,0xF8,0x05,0x07,0x07,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08, - 0x05,0x05,0x05,0x06,0x00,0x00,0xC0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00, - 0x00,0x88,0x88,0xC8,0xA8,0xC8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xE0,0x90, - 0xE0,0x04,0x05,0x05,0x06,0x01,0x00,0xE0,0x10,0x70,0x10,0xE0,0x05,0x05,0x05,0x06, - 0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70, - 0x50,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF0,0x80,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x09,0x09, - 0x06,0x00,0xFE,0x40,0xE0,0x40,0x70,0x48,0x48,0x48,0x08,0x10,0x05,0x08,0x08,0x06, - 0x00,0x00,0x10,0x20,0x00,0xF8,0x80,0x80,0x80,0x80,0x04,0x05,0x05,0x06,0x01,0x00, - 0x70,0x80,0xE0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xF0, - 0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06,0x06, - 0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0xE0,0x04,0x08,0x08,0x06,0x01,0xFE,0x10,0x00, - 0x30,0x10,0x10,0x10,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00,0x60,0xA0,0xB0,0xA8, - 0xB0,0x05,0x05,0x05,0x06,0x00,0x00,0xA0,0xA0,0xF0,0xA8,0xB0,0x05,0x07,0x07,0x06, - 0x00,0x00,0x40,0xE0,0x40,0x70,0x48,0x48,0x48,0x04,0x08,0x08,0x06,0x01,0x00,0x20, - 0x40,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, - 0x88,0x98,0xA8,0xC8,0x88,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x88,0x70,0x00,0x88,0x88, - 0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x88,0xF8, - 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x05, - 0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xA8,0xA8,0x50,0x05,0x07,0x07,0x06,0x00,0x00, - 0x40,0xF0,0x40,0x70,0x48,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF0, - 0x40,0x70,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x98,0xA0,0xA0,0xF8,0xA0,0xA0, - 0x98,0x05,0x05,0x05,0x06,0x00,0x00,0x98,0xA0,0xF8,0xA0,0x98,0x05,0x07,0x07,0x06, - 0x00,0x00,0x20,0x50,0x50,0x88,0xF8,0xA8,0xA8,0x05,0x06,0x06,0x06,0x00,0x00,0x20, - 0x50,0x50,0x88,0xF8,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0x90,0xB8,0xF8,0xB8, - 0xB8,0xB8,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0x90,0xF8,0xB8,0xB8,0x05,0x08,0x08, - 0x06,0x00,0x00,0xF8,0x88,0x50,0x50,0x70,0xA8,0xA8,0xA8,0x05,0x06,0x06,0x06,0x00, - 0x00,0xF8,0x88,0x50,0x70,0xA8,0xA8,0x06,0x08,0x08,0x06,0x00,0x00,0xFC,0xC4,0xA8, - 0x90,0xF8,0xB8,0xB8,0xA8,0x06,0x06,0x06,0x06,0x00,0x00,0xFC,0xA8,0x90,0xF8,0xB8, - 0xA8,0x05,0x0C,0x0C,0x06,0x00,0xFE,0x50,0x20,0x00,0x70,0x88,0x08,0x30,0x08,0x08, - 0x70,0x80,0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x50,0x20,0x00,0x70,0x88,0x30,0x08, - 0x70,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x20, - 0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, - 0xF8,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20, - 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x0A,0x0A,0x06,0x00, - 0x00,0x90,0x48,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20,0x05,0x08,0x08,0x06,0x00, - 0x00,0x90,0x48,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xFE,0x40, - 0xA0,0xA0,0xB8,0xB8,0xB8,0x58,0x08,0x10,0x05,0x07,0x07,0x06,0x00,0xFE,0x58,0xB8, - 0xB8,0xB8,0x58,0x08,0x10,0x05,0x0A,0x0A,0x06,0x00,0xFF,0x20,0x70,0xA8,0x88,0x88, - 0x88,0x88,0xA8,0x70,0x20,0x05,0x08,0x08,0x06,0x00,0xFF,0x20,0x70,0xA8,0x88,0x88, - 0xA8,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x70,0x00,0x20,0x20,0x88,0x88,0x88, - 0xA8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0x20,0xA8,0x88,0xA8,0x50,0x05, - 0x0A,0x0A,0x06,0x00,0x00,0xF8,0xA8,0x00,0x50,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x05, - 0x08,0x08,0x06,0x00,0x00,0xF8,0xA8,0x00,0x50,0x88,0xA8,0xA8,0x50}; -const u8g_fntpgm_uint8_t fontpage_97_129_191[911] U8G_FONT_SECTION("fontpage_97_129_191") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x81,0xBF,0x00,0x0D,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x04,0x00,0x4E,0x00,0x55,0x00,0x64, - 0x80,0x48,0x40,0xA8,0x40,0x90,0x40,0x90,0x80,0x61,0x00,0x06,0x00,0x08,0x0B,0x0B, - 0x0C,0x01,0xFF,0x20,0x10,0x70,0x1C,0x28,0xE2,0x39,0x21,0x21,0x12,0x0C,0x08,0x07, - 0x07,0x0C,0x02,0xFF,0x28,0x2E,0xF5,0x21,0x16,0x10,0x10,0x0B,0x0B,0x16,0x0C,0x00, - 0xFF,0x02,0x00,0x37,0x00,0x20,0x00,0x13,0xC0,0x9C,0x20,0x70,0x20,0x09,0xC0,0x08, - 0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x07,0x07,0x07,0x0C,0x03,0xFF,0x10,0x9C,0xB2, - 0xD2,0x9C,0x10,0x20,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x82,0x00,0x47,0x80, - 0x4A,0x40,0x52,0x20,0x62,0x20,0x6A,0x40,0x47,0x80,0x42,0x00,0x04,0x00,0x08,0x00, - 0x07,0x07,0x07,0x0C,0x02,0xFF,0x10,0x1C,0x10,0x10,0x78,0x96,0x60,0x09,0x0B,0x16, - 0x0C,0x01,0xFF,0x10,0x00,0x08,0x00,0x09,0x80,0x0E,0x00,0x08,0x00,0x08,0x00,0x08, - 0x00,0x78,0x00,0x8E,0x00,0x89,0x80,0x70,0x00,0x07,0x0B,0x0B,0x0C,0x02,0xFF,0x20, - 0x18,0x40,0x80,0x80,0xBC,0xC2,0x82,0x02,0x0C,0x70,0x07,0x0B,0x0B,0x0C,0x02,0xFF, - 0x88,0x54,0x52,0x62,0x62,0x42,0x42,0x04,0x04,0x08,0x10,0x08,0x0A,0x0A,0x0C,0x01, - 0xFF,0x4E,0x34,0x08,0x10,0x3E,0x61,0x81,0x19,0x26,0x1C,0x0B,0x0B,0x16,0x0C,0x00, - 0xFF,0x20,0x00,0x10,0x00,0x13,0x00,0x34,0x80,0xD8,0x80,0x10,0x80,0x10,0x80,0x30, - 0x80,0x50,0x80,0xB0,0x60,0x10,0x00,0x08,0x0A,0x0A,0x0C,0x01,0xFF,0x4E,0x34,0x08, - 0x10,0x3E,0x61,0x81,0x01,0x06,0x18,0x08,0x07,0x07,0x0C,0x02,0xFF,0x40,0x30,0xEE, - 0x31,0x61,0xA2,0x24,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x10,0x00,0x10,0x00, - 0x9B,0x80,0x7C,0x40,0x10,0x20,0x10,0x20,0x30,0x20,0x50,0x40,0xB1,0x80,0x10,0x00, - 0x0A,0x0A,0x14,0x0C,0x01,0xFF,0x4E,0x00,0x34,0x00,0x04,0x00,0x1F,0x00,0x28,0x80, - 0x48,0x40,0x90,0x40,0x96,0x40,0x69,0x80,0x47,0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF, - 0x20,0x00,0x1F,0x00,0x04,0x00,0x1F,0x00,0x20,0x80,0x4C,0x80,0x13,0x00,0x0C,0x00, - 0x00,0x00,0x59,0x80,0x86,0x40,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00, - 0x9E,0x00,0x70,0x00,0x21,0x80,0x72,0x00,0x8C,0x00,0x14,0x00,0x24,0x00,0x20,0x00, - 0x1F,0x00,0x0A,0x0A,0x14,0x0C,0x01,0xFF,0x10,0x00,0x08,0x00,0x08,0x00,0x10,0x00, - 0x10,0x00,0x38,0x00,0x24,0x00,0x44,0x40,0x44,0x80,0x83,0x00,0x0A,0x0B,0x16,0x0C, - 0x00,0xFF,0x10,0x00,0x0C,0x80,0x00,0x40,0x1D,0x00,0xE2,0x80,0x02,0x00,0x02,0x00, - 0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0xFF,0xFF,0xFF,0xFF,0x04,0x03,0x03,0x06, - 0x00,0x05,0x20,0x90,0x40,0xFF,0x04,0x03,0x03,0x06,0x00,0x05,0x20,0x90,0x40,0x03, - 0x03,0x03,0x06,0x00,0x05,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0x05,0x03,0x03,0x06,0x00, - 0x03,0xF8,0x00,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10,0x60,0x40,0x80,0x05, - 0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x28,0x30,0x20,0x20,0x40,0x04,0x05,0x05,0x06, - 0x00,0x00,0x10,0x20,0x60,0xA0,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x20, - 0x60,0xA0,0x20,0x20,0x04,0x05,0x05,0x06,0x00,0x00,0x20,0xF0,0x90,0x10,0x20,0x05, - 0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x88,0x88,0x08,0x10,0x60,0x03,0x04,0x04,0x06, - 0x00,0x00,0xE0,0x40,0x40,0xE0,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x20,0x20,0x20, - 0x20,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0x20,0xF0,0x20,0x60,0xA0,0x05,0x07,0x07, - 0x06,0x00,0x00,0x10,0xF8,0x10,0x30,0x50,0x90,0x10,0x05,0x07,0x07,0x06,0x00,0x00, - 0x40,0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40, - 0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x20,0x20, - 0xF8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xF8,0x20,0x20,0xF8, - 0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0x88,0x08,0x10,0x60,0x05, - 0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40,0x78,0x48,0x88,0x08,0x10,0x60,0x05,0x07, - 0x07,0x06,0x00,0x00,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05,0x09,0x09,0x06,0x00, - 0x00,0x28,0x28,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05,0x06,0x06,0x06,0x00,0x00, - 0xF8,0x08,0x08,0x08,0x08,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xF8, - 0x08,0x08,0x08,0x08,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0xF8,0x50,0x50,0x50, - 0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x50,0xF8,0x50,0x50,0x50,0x10, - 0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xC0,0x08,0xC8,0x08,0x10,0xE0,0x07,0x0D,0x0D, - 0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x28,0x28,0x00,0xC0,0x08,0xC8,0x08,0x10,0xE0, - 0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05,0x09,0x09,0x06, - 0x00,0x00,0x28,0x28,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x40,0x40,0xF8,0x48,0x50,0x40,0x38,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08, - 0x40,0x40,0xF8,0x48,0x50,0x40,0x38,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x48,0x48, - 0x10,0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x88,0x48,0x48,0x10, - 0x10,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0xA8,0x18,0x10,0x60}; -const u8g_fntpgm_uint8_t fontpage_97_193_255[822] U8G_FONT_SECTION("fontpage_97_193_255") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xFF,0x00,0x09,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x60,0x20,0xF8,0x20,0x20,0x40,0x05,0x09, - 0x09,0x06,0x00,0x00,0x28,0x08,0x10,0x60,0x20,0xF8,0x20,0x20,0x40,0x05,0x04,0x04, - 0x06,0x00,0x00,0xA8,0xA8,0x08,0x30,0x05,0x06,0x06,0x06,0x00,0x00,0xA8,0xA8,0xA8, - 0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xA8,0xA8,0xA8,0x08, - 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xF8,0x20,0x20,0x20,0x40,0x05, - 0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x70,0x00,0xF8,0x20,0x20,0x20,0x40,0x04,0x07, - 0x07,0x06,0x01,0x00,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x04,0x09,0x09,0x06,0x01, - 0x00,0x50,0x10,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00, - 0x20,0x20,0xF8,0x20,0x20,0x40,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0x00, - 0x00,0x00,0xF8,0x05,0x06,0x06,0x06,0x00,0x00,0x78,0x08,0x28,0x10,0x28,0xC0,0x05, - 0x07,0x07,0x06,0x00,0x00,0x20,0x70,0x10,0x20,0x70,0xA8,0x20,0x03,0x06,0x06,0x06, - 0x01,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0x50, - 0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x10,0x50,0x50, - 0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00,0x10,0x50,0x50,0x48, - 0x88,0x88,0x04,0x06,0x06,0x06,0x00,0x00,0x80,0x90,0xE0,0x80,0x80,0x70,0x05,0x09, - 0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x80,0x90,0xE0,0x80,0x80,0x70,0x05,0x09,0x09, - 0x06,0x00,0x00,0x18,0x18,0x00,0x80,0x90,0xE0,0x80,0x80,0x70,0x05,0x06,0x06,0x06, - 0x00,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28, - 0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00, - 0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x05,0x05,0x06,0x00,0x01,0x60,0xA0,0x10,0x10, - 0x08,0x05,0x08,0x08,0x06,0x00,0x01,0x28,0x28,0x00,0x60,0xA0,0x10,0x10,0x08,0x05, - 0x08,0x08,0x06,0x00,0x01,0x18,0x18,0x00,0x60,0xA0,0x10,0x10,0x08,0x05,0x07,0x07, - 0x06,0x00,0x00,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x09,0x09,0x06,0x00,0x00, - 0x28,0x08,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x18, - 0x18,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08, - 0x08,0x50,0x20,0x10,0x04,0x06,0x06,0x06,0x01,0x00,0xE0,0x00,0xE0,0x00,0xC0,0x30, - 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x20,0x40,0x48,0xF8,0x08,0x05,0x06,0x06, - 0x06,0x00,0x00,0x08,0x48,0x30,0x10,0x28,0xC0,0x05,0x06,0x06,0x06,0x00,0x00,0xF0, - 0x40,0xF8,0x40,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x40,0xF8,0x48,0x50,0x40, - 0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF8,0x48,0x50,0x40,0x40,0x04,0x05,0x05, - 0x06,0x00,0x00,0x60,0x20,0x20,0x20,0xF0,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10, - 0x10,0x10,0x10,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10,0xF0,0x10,0xF0,0x05, - 0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0xF8,0x08,0x08,0xF8,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x00,0xF8,0x08,0x08,0x10,0x60,0x04,0x07,0x07,0x06,0x00,0x00,0x10,0x90, - 0x90,0x90,0x90,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xA0,0xA0,0xA8, - 0xA8,0xB0,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0x80,0x88,0xB0,0xC0,0x05,0x06, - 0x06,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xF8,0x04,0x05,0x05,0x06,0x00,0x00, - 0xF0,0x90,0x10,0x10,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x88,0x88,0x08,0x10, - 0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0xF8,0x50,0x50,0xF8,0x10,0x10,0x05,0x06, - 0x06,0x06,0x00,0x00,0x70,0x10,0x20,0x20,0x20,0xF8,0x05,0x06,0x06,0x06,0x00,0x00, - 0xF8,0x08,0xF8,0x08,0x10,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xC0,0x08,0x08,0x08, - 0x10,0xE0,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xF8,0x88,0x88,0x08,0x10, - 0x60,0x04,0x05,0x05,0x06,0x00,0x00,0x40,0xF0,0x50,0x50,0xB0,0x04,0x05,0x05,0x06, - 0x00,0x00,0x80,0xF0,0xA0,0x20,0x40,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00, - 0xF8,0x88,0x88,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x10,0xF8, - 0x50,0x50,0xF8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x70,0x10, - 0x20,0x20,0x20,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xF8,0x08,0xF8, - 0x08,0x10,0x60,0x02,0x02,0x02,0x06,0x02,0x03,0xC0,0xC0,0x05,0x02,0x02,0x06,0x00, - 0x03,0x80,0x78,0x05,0x04,0x04,0x06,0x00,0x02,0x80,0x60,0x10,0x08,0x05,0x07,0x07, - 0x06,0x00,0x02,0x28,0x28,0x00,0x80,0x60,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x00, - 0xF8,0x08,0x08,0x08,0x08,0x08}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(8, 128, 255, fontpage_8_128_255), // 'Ѐ' -- 'ѿ' - FONTDATA_ITEM(97, 129, 191, fontpage_97_129_191), // 'め' -- 'タ' - FONTDATA_ITEM(97, 193, 255, fontpage_97_193_255), // 'チ' -- 'ヿ' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_tr.h b/Marlin/src/lcd/dogm/fontdata/langdata_tr.h deleted file mode 100644 index a4068e10d0..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_tr.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_2_158_159[49] U8G_FONT_SECTION("fontpage_2_158_159") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9E,0x9F,0x00,0x0A,0xFE,0x00, - 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88,0x70,0x00,0x70,0x88,0x80,0x80,0x98,0x88, - 0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x78,0x08, - 0x70}; -const u8g_fntpgm_uint8_t fontpage_2_176_177[43] U8G_FONT_SECTION("fontpage_2_176_177") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB1,0x00,0x09,0x00,0x00, - 0x00,0x03,0x09,0x09,0x06,0x01,0x00,0x40,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0, - 0x03,0x05,0x05,0x06,0x01,0x00,0xC0,0x40,0x40,0x40,0xE0}; -const u8g_fntpgm_uint8_t fontpage_2_222_223[45] U8G_FONT_SECTION("fontpage_2_222_223") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDF,0x00,0x07,0xFE,0x00, - 0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x10,0x60, - 0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x80,0x70,0x08,0xF0,0x10,0x60}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(2, 158, 159, fontpage_2_158_159), // 'Ğ' -- 'ğ' - FONTDATA_ITEM(2, 176, 177, fontpage_2_176_177), // 'İ' -- 'ı' - FONTDATA_ITEM(2, 222, 223, fontpage_2_222_223), // 'Ş' -- 'ş' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_uk.h b/Marlin/src/lcd/dogm/fontdata/langdata_uk.h deleted file mode 100644 index 47ec93992f..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_uk.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_8_134_134[30] U8G_FONT_SECTION("fontpage_8_134_134") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x07,0x00,0x00, - 0x00,0x03,0x07,0x07,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0}; -const u8g_fntpgm_uint8_t fontpage_8_144_169[363] U8G_FONT_SECTION("fontpage_8_144_169") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0xA9,0x00,0x0A,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80, - 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0x50, - 0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8, - 0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0x70,0x20,0x70,0xA8,0xA8,0x05,0x07,0x07, - 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, - 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88,0x70,0x00, - 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, - 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, - 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x88, - 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x80, - 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, - 0x70,0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, - 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0x90,0x90,0xF8, - 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05, - 0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x05,0x09,0x09,0x06, - 0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08}; -const u8g_fntpgm_uint8_t fontpage_8_172_172[30] U8G_FONT_SECTION("fontpage_8_172_172") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x07,0x00,0x00, - 0x00,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0xE0}; -const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_175_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xC9,0x00,0x08,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88,0xF0,0x88, - 0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, - 0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, - 0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, - 0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xA8, - 0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x05,0x05, - 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xD8, - 0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x05,0x05, - 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8, - 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, - 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, - 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88, - 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x20,0x20,0x70,0xA8,0xA8,0xA8, - 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, - 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8, - 0xF8,0x05,0x07,0x07,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08}; -const u8g_fntpgm_uint8_t fontpage_8_204_204[28] U8G_FONT_SECTION("fontpage_8_204_204") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x05,0x00,0x00, - 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0xE0}; -const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCF,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06, - 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; -const u8g_fntpgm_uint8_t fontpage_8_212_212[28] U8G_FONT_SECTION("fontpage_8_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x05,0x00,0x00, - 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x80,0xE0,0x80,0x70}; -const u8g_fntpgm_uint8_t fontpage_8_214_215[41] U8G_FONT_SECTION("fontpage_8_214_215") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD6,0xD7,0x00,0x06,0x00,0x00, - 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06, - 0x06,0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0xE0}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(8, 134, 134, fontpage_8_134_134), // 'І' -- 'І' - FONTDATA_ITEM(8, 144, 169, fontpage_8_144_169), // 'А' -- 'Щ' - FONTDATA_ITEM(8, 172, 172, fontpage_8_172_172), // 'Ь' -- 'Ь' - FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ' - FONTDATA_ITEM(8, 204, 204, fontpage_8_204_204), // 'ь' -- 'ь' - FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я' - FONTDATA_ITEM(8, 212, 212, fontpage_8_212_212), // 'є' -- 'є' - FONTDATA_ITEM(8, 214, 215, fontpage_8_214_215), // 'і' -- 'ї' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_vi.h b/Marlin/src/lcd/dogm/fontdata/langdata_vi.h deleted file mode 100644 index a8a0c5c121..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_vi.h +++ /dev/null @@ -1,227 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_2_131_131[31] U8G_FONT_SECTION("fontpage_2_131_131") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x70,0x08,0x78,0x88,0x78}; -const u8g_fntpgm_uint8_t fontpage_2_144_145[44] U8G_FONT_SECTION("fontpage_2_144_145") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x91,0x00,0x08,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0xE8,0x48,0x48,0xF0,0x06,0x08, - 0x08,0x06,0x00,0x00,0x08,0x1C,0x08,0x78,0x88,0x88,0x88,0x78}; -const u8g_fntpgm_uint8_t fontpage_2_169_169[31] U8G_FONT_SECTION("fontpage_2_169_169") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x08,0x00,0x00, - 0x00,0x04,0x08,0x08,0x06,0x00,0x00,0x50,0xA0,0x00,0x60,0x20,0x20,0x20,0x70}; -const u8g_fntpgm_uint8_t fontpage_3_161_161[30] U8G_FONT_SECTION("fontpage_3_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x07,0x00,0x00, - 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x70,0x88,0x88,0x88,0x70}; -const u8g_fntpgm_uint8_t fontpage_3_175_176[43] U8G_FONT_SECTION("fontpage_3_175_176") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xB0,0x00,0x08,0x00,0x00, - 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x08,0x98,0x90,0x90,0x90,0x90,0x90,0x60,0x05, - 0x06,0x06,0x06,0x00,0x00,0x08,0x98,0x90,0x90,0xB0,0x50}; -const u8g_fntpgm_uint8_t fontpage_6_131_131[25] U8G_FONT_SECTION("fontpage_6_131_131") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x02,0x02,0x06,0x00,0x08,0x68,0xB0}; -const u8g_fntpgm_uint8_t fontpage_6_137_137[26] U8G_FONT_SECTION("fontpage_6_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0x00,0x00, - 0x00,0x03,0x03,0x03,0x06,0x01,0x07,0xC0,0x20,0x40}; -const u8g_fntpgm_uint8_t fontpage_6_163_163[24] U8G_FONT_SECTION("fontpage_6_163_163") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA3,0x00,0x00,0xFE,0x00, - 0x00,0x01,0x01,0x01,0x06,0x02,0xFE,0x80}; -const u8g_fntpgm_uint8_t fontpage_6_192_193[33] U8G_FONT_SECTION("fontpage_6_192_193") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC1,0x00,0x0A,0x00,0x00, - 0x00,0x02,0x02,0x02,0x06,0x01,0x08,0x80,0x40,0x02,0x02,0x02,0x06,0x02,0x08,0x40, - 0x80}; -const u8g_fntpgm_uint8_t fontpage_61_161_161[30] U8G_FONT_SECTION("fontpage_61_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x05,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x07,0x00,0xFE,0x70,0x08,0x78,0x88,0x78,0x00,0x20}; -const u8g_fntpgm_uint8_t fontpage_61_163_163[32] U8G_FONT_SECTION("fontpage_61_163_163") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA3,0x00,0x09,0x00,0x00, - 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78 - }; -const u8g_fntpgm_uint8_t fontpage_61_165_165[33] U8G_FONT_SECTION("fontpage_61_165_165") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0x00,0x00, - 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x04,0x08,0x30,0x48,0x00,0x70,0x08,0x78,0x88, - 0x78}; -const u8g_fntpgm_uint8_t fontpage_61_167_167[33] U8G_FONT_SECTION("fontpage_61_167_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x10,0x08,0x30,0x48,0x00,0x70,0x08,0x78,0x88, - 0x78}; -const u8g_fntpgm_uint8_t fontpage_61_169_169[34] U8G_FONT_SECTION("fontpage_61_169_169") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x0B,0x00,0x00, - 0x00,0x06,0x0B,0x0B,0x07,0x00,0x00,0x0C,0x04,0x08,0x30,0x48,0x00,0x70,0x08,0x78, - 0x88,0x78}; -const u8g_fntpgm_uint8_t fontpage_61_173_173[33] U8G_FONT_SECTION("fontpage_61_173_173") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x08,0xFE,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x30,0x48,0x00,0x70,0x08,0x78,0x88,0x78,0x00, - 0x20}; -const u8g_fntpgm_uint8_t fontpage_61_175_175[33] U8G_FONT_SECTION("fontpage_61_175_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x08,0x10,0x48,0x30,0x00,0x70,0x08,0x78,0x88, - 0x78}; -const u8g_fntpgm_uint8_t fontpage_61_177_177[33] U8G_FONT_SECTION("fontpage_61_177_177") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x40,0x20,0x48,0x30,0x00,0x70,0x08,0x78,0x88, - 0x78}; -const u8g_fntpgm_uint8_t fontpage_61_179_179[34] U8G_FONT_SECTION("fontpage_61_179_179") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB3,0xB3,0x00,0x0B,0x00,0x00, - 0x00,0x05,0x0B,0x0B,0x07,0x00,0x00,0x18,0x08,0x10,0x48,0x30,0x00,0x70,0x08,0x78, - 0x88,0x78}; -const u8g_fntpgm_uint8_t fontpage_61_181_181[34] U8G_FONT_SECTION("fontpage_61_181_181") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB5,0xB5,0x00,0x0B,0x00,0x00, - 0x00,0x06,0x0B,0x0B,0x07,0x00,0x00,0x14,0x28,0x00,0x48,0x30,0x00,0x70,0x08,0x78, - 0x88,0x78}; -const u8g_fntpgm_uint8_t fontpage_61_183_183[33] U8G_FONT_SECTION("fontpage_61_183_183") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x08,0xFE,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x48,0x30,0x00,0x70,0x08,0x78,0x88,0x78,0x00, - 0x20}; -const u8g_fntpgm_uint8_t fontpage_61_191_191[33] U8G_FONT_SECTION("fontpage_61_191_191") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x0A,0x00,0x00, - 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x04,0x08,0x20,0x50,0x00,0x70,0x88,0xF0,0x80, - 0x78}; -const u8g_fntpgm_uint8_t fontpage_61_193_193[33] U8G_FONT_SECTION("fontpage_61_193_193") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x10,0x08,0x20,0x50,0x00,0x70,0x88,0xF0,0x80, - 0x78}; -const u8g_fntpgm_uint8_t fontpage_61_195_195[34] U8G_FONT_SECTION("fontpage_61_195_195") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0B,0x00,0x00, - 0x00,0x05,0x0B,0x0B,0x07,0x00,0x00,0x18,0x08,0x10,0x60,0x90,0x00,0x60,0x90,0xF0, - 0x80,0x70}; -const u8g_fntpgm_uint8_t fontpage_61_199_199[33] U8G_FONT_SECTION("fontpage_61_199_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x08,0xFE,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x20,0x50,0x00,0x70,0x88,0xF0,0x80,0x78,0x00, - 0x20}; -const u8g_fntpgm_uint8_t fontpage_61_201_201[32] U8G_FONT_SECTION("fontpage_61_201_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x09,0x00,0x00, - 0x00,0x03,0x09,0x09,0x07,0x02,0x00,0x60,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0 - }; -const u8g_fntpgm_uint8_t fontpage_61_203_203[32] U8G_FONT_SECTION("fontpage_61_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x07,0xFE,0x00, - 0x00,0x03,0x09,0x09,0x07,0x02,0xFE,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x00,0x40 - }; -const u8g_fntpgm_uint8_t fontpage_61_205_205[30] U8G_FONT_SECTION("fontpage_61_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x05,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x07,0x00,0xFE,0x70,0x88,0x88,0x88,0x70,0x00,0x20}; -const u8g_fntpgm_uint8_t fontpage_61_207_207[32] U8G_FONT_SECTION("fontpage_61_207_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x09,0x00,0x00, - 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70 - }; -const u8g_fntpgm_uint8_t fontpage_61_209_209[33] U8G_FONT_SECTION("fontpage_61_209_209") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0x00,0x00, - 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x04,0x08,0x20,0x50,0x00,0x70,0x88,0x88,0x88, - 0x70}; -const u8g_fntpgm_uint8_t fontpage_61_211_211[33] U8G_FONT_SECTION("fontpage_61_211_211") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x10,0x08,0x20,0x50,0x00,0x70,0x88,0x88,0x88, - 0x70}; -const u8g_fntpgm_uint8_t fontpage_61_213_213[33] U8G_FONT_SECTION("fontpage_61_213_213") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x18,0x08,0x30,0x50,0x00,0x70,0x88,0x88,0x88, - 0x70}; -const u8g_fntpgm_uint8_t fontpage_61_215_215[34] U8G_FONT_SECTION("fontpage_61_215_215") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD7,0xD7,0x00,0x0B,0x00,0x00, - 0x00,0x05,0x0B,0x0B,0x07,0x00,0x00,0x28,0x50,0x00,0x20,0x50,0x00,0x70,0x88,0x88, - 0x88,0x70}; -const u8g_fntpgm_uint8_t fontpage_61_217_217[33] U8G_FONT_SECTION("fontpage_61_217_217") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x08,0xFE,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x00, - 0x20}; -const u8g_fntpgm_uint8_t fontpage_61_219_219[32] U8G_FONT_SECTION("fontpage_61_219_219") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDB,0x00,0x09,0x00,0x00, - 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x20,0x40,0x10,0x08,0x70,0x88,0x88,0x88,0x70 - }; -const u8g_fntpgm_uint8_t fontpage_61_221_221[32] U8G_FONT_SECTION("fontpage_61_221_221") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x09,0x00,0x00, - 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x80,0x40,0x10,0x08,0x70,0x88,0x88,0x88,0x70 - }; -const u8g_fntpgm_uint8_t fontpage_61_223_223[33] U8G_FONT_SECTION("fontpage_61_223_223") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x60,0x20,0x40,0x10,0x08,0x70,0x88,0x88,0x88, - 0x70}; -const u8g_fntpgm_uint8_t fontpage_61_225_225[32] U8G_FONT_SECTION("fontpage_61_225_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x09,0x00,0x00, - 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x50,0xA0,0x10,0x08,0x70,0x88,0x88,0x88,0x70 - }; -const u8g_fntpgm_uint8_t fontpage_61_227_227[32] U8G_FONT_SECTION("fontpage_61_227_227") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE3,0xE3,0x00,0x07,0xFE,0x00, - 0x00,0x05,0x09,0x09,0x00,0x00,0xFE,0x10,0x08,0x70,0x88,0x88,0x88,0x70,0x00,0x20 - }; -const u8g_fntpgm_uint8_t fontpage_61_229_229[30] U8G_FONT_SECTION("fontpage_61_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x05,0xFE,0x00, - 0x00,0x05,0x07,0x07,0x07,0x00,0xFE,0x88,0x88,0x88,0x88,0x70,0x00,0x20}; -const u8g_fntpgm_uint8_t fontpage_61_231_231[33] U8G_FONT_SECTION("fontpage_61_231_231") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x00,0x0A,0x00,0x00, - 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x00,0x88,0x88,0x88,0x88, - 0x70}; -const u8g_fntpgm_uint8_t fontpage_61_233_233[32] U8G_FONT_SECTION("fontpage_61_233_233") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x09,0x00,0x00, - 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x10,0x20,0x0C,0x04,0x88,0x88,0x88,0x88,0x70 - }; -const u8g_fntpgm_uint8_t fontpage_61_235_235[32] U8G_FONT_SECTION("fontpage_61_235_235") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEB,0xEB,0x00,0x09,0x00,0x00, - 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x40,0x20,0x0C,0x04,0x88,0x88,0x88,0x88,0x70 - }; -const u8g_fntpgm_uint8_t fontpage_61_237_237[33] U8G_FONT_SECTION("fontpage_61_237_237") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0x00,0x00, - 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x30,0x10,0x20,0x0C,0x04,0x88,0x88,0x88,0x88, - 0x70}; -const u8g_fntpgm_uint8_t fontpage_61_239_239[32] U8G_FONT_SECTION("fontpage_61_239_239") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x09,0x00,0x00, - 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x28,0x50,0x0C,0x04,0x88,0x88,0x88,0x88,0x70 - }; -const u8g_fntpgm_uint8_t fontpage_61_241_241[32] U8G_FONT_SECTION("fontpage_61_241_241") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x07,0xFE,0x00, - 0x00,0x06,0x09,0x09,0x07,0x00,0xFE,0x0C,0x04,0x88,0x88,0x88,0x88,0x70,0x00,0x20 - }; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(2, 131, 131, fontpage_2_131_131), // 'ă' -- 'ă' - FONTDATA_ITEM(2, 144, 145, fontpage_2_144_145), // 'Đ' -- 'đ' - FONTDATA_ITEM(2, 169, 169, fontpage_2_169_169), // 'ĩ' -- 'ĩ' - FONTDATA_ITEM(3, 161, 161, fontpage_3_161_161), // 'ơ' -- 'ơ' - FONTDATA_ITEM(3, 175, 176, fontpage_3_175_176), // 'Ư' -- 'ư' - FONTDATA_ITEM(6, 131, 131, fontpage_6_131_131), // '̃' -- '̃' - FONTDATA_ITEM(6, 137, 137, fontpage_6_137_137), // '̉' -- '̉' - FONTDATA_ITEM(6, 163, 163, fontpage_6_163_163), // '̣' -- '̣' - FONTDATA_ITEM(6, 192, 193, fontpage_6_192_193), // '̀' -- '́' - FONTDATA_ITEM(61, 161, 161, fontpage_61_161_161), // 'ạ' -- 'ạ' - FONTDATA_ITEM(61, 163, 163, fontpage_61_163_163), // 'ả' -- 'ả' - FONTDATA_ITEM(61, 165, 165, fontpage_61_165_165), // 'ấ' -- 'ấ' - FONTDATA_ITEM(61, 167, 167, fontpage_61_167_167), // 'ầ' -- 'ầ' - FONTDATA_ITEM(61, 169, 169, fontpage_61_169_169), // 'ẩ' -- 'ẩ' - FONTDATA_ITEM(61, 173, 173, fontpage_61_173_173), // 'ậ' -- 'ậ' - FONTDATA_ITEM(61, 175, 175, fontpage_61_175_175), // 'ắ' -- 'ắ' - FONTDATA_ITEM(61, 177, 177, fontpage_61_177_177), // 'ằ' -- 'ằ' - FONTDATA_ITEM(61, 179, 179, fontpage_61_179_179), // 'ẳ' -- 'ẳ' - FONTDATA_ITEM(61, 181, 181, fontpage_61_181_181), // 'ẵ' -- 'ẵ' - FONTDATA_ITEM(61, 183, 183, fontpage_61_183_183), // 'ặ' -- 'ặ' - FONTDATA_ITEM(61, 191, 191, fontpage_61_191_191), // 'ế' -- 'ế' - FONTDATA_ITEM(61, 193, 193, fontpage_61_193_193), // 'ề' -- 'ề' - FONTDATA_ITEM(61, 195, 195, fontpage_61_195_195), // 'ể' -- 'ể' - FONTDATA_ITEM(61, 199, 199, fontpage_61_199_199), // 'ệ' -- 'ệ' - FONTDATA_ITEM(61, 201, 201, fontpage_61_201_201), // 'ỉ' -- 'ỉ' - FONTDATA_ITEM(61, 203, 203, fontpage_61_203_203), // 'ị' -- 'ị' - FONTDATA_ITEM(61, 205, 205, fontpage_61_205_205), // 'ọ' -- 'ọ' - FONTDATA_ITEM(61, 207, 207, fontpage_61_207_207), // 'ỏ' -- 'ỏ' - FONTDATA_ITEM(61, 209, 209, fontpage_61_209_209), // 'ố' -- 'ố' - FONTDATA_ITEM(61, 211, 211, fontpage_61_211_211), // 'ồ' -- 'ồ' - FONTDATA_ITEM(61, 213, 213, fontpage_61_213_213), // 'ổ' -- 'ổ' - FONTDATA_ITEM(61, 215, 215, fontpage_61_215_215), // 'ỗ' -- 'ỗ' - FONTDATA_ITEM(61, 217, 217, fontpage_61_217_217), // 'ộ' -- 'ộ' - FONTDATA_ITEM(61, 219, 219, fontpage_61_219_219), // 'ớ' -- 'ớ' - FONTDATA_ITEM(61, 221, 221, fontpage_61_221_221), // 'ờ' -- 'ờ' - FONTDATA_ITEM(61, 223, 223, fontpage_61_223_223), // 'ở' -- 'ở' - FONTDATA_ITEM(61, 225, 225, fontpage_61_225_225), // 'ỡ' -- 'ỡ' - FONTDATA_ITEM(61, 227, 227, fontpage_61_227_227), // 'ợ' -- 'ợ' - FONTDATA_ITEM(61, 229, 229, fontpage_61_229_229), // 'ụ' -- 'ụ' - FONTDATA_ITEM(61, 231, 231, fontpage_61_231_231), // 'ủ' -- 'ủ' - FONTDATA_ITEM(61, 233, 233, fontpage_61_233_233), // 'ứ' -- 'ứ' - FONTDATA_ITEM(61, 235, 235, fontpage_61_235_235), // 'ừ' -- 'ừ' - FONTDATA_ITEM(61, 237, 237, fontpage_61_237_237), // 'ử' -- 'ử' - FONTDATA_ITEM(61, 239, 239, fontpage_61_239_239), // 'ữ' -- 'ữ' - FONTDATA_ITEM(61, 241, 241, fontpage_61_241_241), // 'ự' -- 'ự' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h deleted file mode 100644 index 491d480a01..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h +++ /dev/null @@ -1,1823 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_64_157_157[26] U8G_FONT_SECTION("fontpage_64_157_157") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x07,0x00,0x00, - 0x00,0x05,0x03,0x03,0x06,0x00,0x04,0xD8,0x48,0x90}; -const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xF8}; -const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, - 0x00,0x0B,0x02,0x04,0x0C,0x00,0x04,0x00,0x40,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x8B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F, - 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x0B,0x0B,0x16,0x0C,0x00, - 0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x04,0x00,0x04, - 0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0xFF,0xE0,0x04, - 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, - 0x00}; -const u8g_fntpgm_uint8_t fontpage_156_141_141[45] U8G_FONT_SECTION("fontpage_156_141_141") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x02,0x00,0x02,0x00,0x04,0x00,0x0D, - 0x00,0x14,0x80,0x24,0x40,0x44,0x20,0x84,0x00,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_156_147_147[45] U8G_FONT_SECTION("fontpage_156_147_147") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x3F,0xC0,0x04,0x00,0x04,0x00,0xFF, - 0xE0,0x08,0x00,0x1F,0xC0,0x00,0x80,0x0D,0x00,0x02,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_156_157_157[45] U8G_FONT_SECTION("fontpage_156_157_157") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x29,0x40,0x4A,0x40,0xF7, - 0x80,0x10,0x80,0x21,0x00,0x42,0x00,0xF7,0xC0,0x00,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_156_170_170[45] U8G_FONT_SECTION("fontpage_156_170_170") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xAA,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x49, - 0x00,0x88,0xC0,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0x80,0x88,0x80,0x88, - 0x80,0x88,0x80,0xFF,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_156_186_187[73] U8G_FONT_SECTION("fontpage_156_186_187") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBB,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x48,0x00,0x28,0x00,0x08,0x00,0xFF,0x80,0x08, - 0x80,0x0C,0x80,0x12,0x80,0x12,0x80,0x20,0x80,0x44,0x80,0x83,0x00,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x7F, - 0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_156_201_201[45] U8G_FONT_SECTION("fontpage_156_201_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x80,0x24,0x80,0x24,0x80,0x21,0x00,0x11, - 0x00,0x12,0x00,0x0A,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60}; -const u8g_fntpgm_uint8_t fontpage_156_203_203[45] U8G_FONT_SECTION("fontpage_156_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0x7F,0xC0,0x00,0x80,0x01, - 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xE0}; -const u8g_fntpgm_uint8_t fontpage_157_134_134[45] U8G_FONT_SECTION("fontpage_157_134_134") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x08, - 0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x28,0x00,0x10,0x00}; -const u8g_fntpgm_uint8_t fontpage_157_140_140[39] U8G_FONT_SECTION("fontpage_157_140_140") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x08,0x00,0x00, - 0x00,0x0B,0x08,0x10,0x0C,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_157_142_142[45] U8G_FONT_SECTION("fontpage_157_142_142") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8E,0x8E,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, - 0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1C,0x00}; -const u8g_fntpgm_uint8_t fontpage_157_164_164[45] U8G_FONT_SECTION("fontpage_157_164_164") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20, - 0x80,0x51,0x40,0x11,0x00,0x0A,0x00,0x04,0x00,0x1B,0x00,0x60,0xE0}; -const u8g_fntpgm_uint8_t fontpage_157_174_174[45] U8G_FONT_SECTION("fontpage_157_174_174") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x11,0x00,0x1F,0x00,0x00, - 0x00,0xFF,0xE0,0x80,0x20,0x1F,0x00,0x11,0x00,0x21,0x20,0xC0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_157_206_206[45] U8G_FONT_SECTION("fontpage_157_206_206") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11, - 0x00,0x11,0x00,0x2A,0x80,0x2A,0x80,0x44,0x40,0x88,0x40,0x10,0x20}; -const u8g_fntpgm_uint8_t fontpage_157_228_229[73] U8G_FONT_SECTION("fontpage_157_228_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE4,0xE5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x24, - 0x80,0xC2,0x60,0x3F,0x80,0x01,0x00,0x0A,0x00,0x04,0x00,0x02,0x00,0x0A,0x0B,0x16, - 0x0C,0x01,0xFF,0x01,0x00,0x81,0x00,0x91,0x00,0x89,0x00,0x89,0x00,0x81,0x00,0x91, - 0x00,0xA1,0x00,0xC2,0x80,0x84,0x40,0x18,0x40}; -const u8g_fntpgm_uint8_t fontpage_157_246_246[45] U8G_FONT_SECTION("fontpage_157_246_246") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x15,0x00,0x25,0x00,0x2F,0xC0,0x71, - 0x00,0xA1,0x00,0x2F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_157_253_253[45] U8G_FONT_SECTION("fontpage_157_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, - 0x20,0xA7,0xC0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xC0}; -const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_145_145") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x21,0x00,0x3F,0xE0,0x61, - 0x00,0xA3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_158_160_160[45] U8G_FONT_SECTION("fontpage_158_160_160") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x27,0xE0,0x21,0x00,0x6F, - 0xE0,0xA2,0x00,0x27,0xE0,0x20,0x40,0x22,0x80,0x21,0x00,0x20,0x80}; -const u8g_fntpgm_uint8_t fontpage_158_205_206[73] U8G_FONT_SECTION("fontpage_158_205_206") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x11,0x00,0x20,0x00,0x2F,0xE0,0x60, - 0x00,0xA4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2F,0xE0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x10,0xC0,0x1F,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xAF,0xE0,0x29, - 0x00,0x29,0x20,0x2A,0xA0,0x2D,0x60,0x28,0xA0}; -const u8g_fntpgm_uint8_t fontpage_158_211_211[45] U8G_FONT_SECTION("fontpage_158_211_211") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x22,0x00,0x5F,0xC0,0x42,0x00,0xC7, - 0x00,0x4A,0x80,0x52,0x40,0x62,0x20,0x4F,0x80,0x42,0x00,0x42,0x00}; -const u8g_fntpgm_uint8_t fontpage_158_217_217[45] U8G_FONT_SECTION("fontpage_158_217_217") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, - 0x60,0x04,0x00,0x7F,0xC0,0x04,0x00,0x15,0x00,0x24,0x80,0x4C,0x40}; -const u8g_fntpgm_uint8_t fontpage_158_220_220[45] U8G_FONT_SECTION("fontpage_158_220_220") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x00,0x14,0x00,0x27,0xE0,0x2A,0x00,0x72, - 0x00,0xA3,0xC0,0x22,0x00,0x22,0x00,0x23,0xE0,0x22,0x00,0x22,0x00}; -const u8g_fntpgm_uint8_t fontpage_158_255_255[45] U8G_FONT_SECTION("fontpage_158_255_255") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x1F,0xE0,0x21,0x00,0x2F,0xE0,0x69, - 0x20,0xAF,0xE0,0x29,0x00,0x25,0x00,0x22,0x00,0x25,0x80,0x38,0x60}; -const u8g_fntpgm_uint8_t fontpage_159_155_155[45] U8G_FONT_SECTION("fontpage_159_155_155") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x80,0x14,0x80,0x24,0x80,0x2F,0xE0,0x64, - 0x80,0xA4,0x80,0x3F,0xE0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; -const u8g_fntpgm_uint8_t fontpage_159_181_181[45] U8G_FONT_SECTION("fontpage_159_181_181") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB5,0xB5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xC0,0x20,0x40,0x4F,0xC0,0x40,0x40,0xDF, - 0xE0,0x50,0x20,0x4F,0xC0,0x44,0x80,0x43,0x00,0x44,0x80,0x58,0x60}; -const u8g_fntpgm_uint8_t fontpage_159_221_221[45] U8G_FONT_SECTION("fontpage_159_221_221") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x17,0xC0,0x14,0x40,0x24,0x40,0x27,0xC0,0x61, - 0x00,0xAF,0xE0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_225_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x11,0x00,0x2F,0xE0,0x20,0x00,0x67, - 0xC0,0xA0,0x00,0x27,0xC0,0x20,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0}; -const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x1F,0xE0,0x22,0x00,0x27,0xC0,0x64, - 0x40,0xA7,0xC0,0x24,0x40,0x27,0x40,0x25,0xC0,0x24,0x40,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_160_190_190[45] U8G_FONT_SECTION("fontpage_160_190_190") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x13,0xE0,0x19,0x00,0x2B,0xE0,0x2E,0x20,0x6A, - 0xA0,0xAA,0xA0,0x2A,0xA0,0x2E,0xA0,0x2A,0xA0,0x21,0x40,0x26,0x20}; -const u8g_fntpgm_uint8_t fontpage_160_207_207[45] U8G_FONT_SECTION("fontpage_160_207_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x28,0x20,0x2F,0xE0,0x68, - 0x00,0xAF,0xE0,0x2A,0xA0,0x2F,0xE0,0x2A,0xA0,0x3A,0xA0,0x28,0x60}; -const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_220_220") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x3F,0xE0,0x20,0x00,0x4F,0xC0,0x48, - 0x40,0xDF,0xE0,0x50,0x20,0x4F,0xC0,0x41,0x00,0x41,0x00,0x47,0x00}; -const u8g_fntpgm_uint8_t fontpage_161_168_168[45] U8G_FONT_SECTION("fontpage_161_168_168") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x61,0x20,0x57,0xC0,0x41,0x40,0x77,0xE0,0xD1, - 0x00,0x53,0xC0,0x56,0x40,0x53,0xC0,0x5A,0x40,0x52,0x40,0x43,0xC0}; -const u8g_fntpgm_uint8_t fontpage_161_207_207[45] U8G_FONT_SECTION("fontpage_161_207_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x13,0xC0,0x14,0x80,0x2F,0xE0,0x35,0x20,0x67, - 0xE0,0xA2,0x20,0x2D,0x40,0x22,0x80,0x2D,0xC0,0x22,0xA0,0x2D,0x80}; -const u8g_fntpgm_uint8_t fontpage_162_197_197[45] U8G_FONT_SECTION("fontpage_162_197_197") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0xFF,0xC0,0x08,0x00,0x11,0x00,0x7F, - 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xC1,0xC0}; -const u8g_fntpgm_uint8_t fontpage_162_200_201[73] U8G_FONT_SECTION("fontpage_162_200_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x84, - 0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x24,0x80,0x04,0x00,0xFF,0xE0,0x12,0x00,0x12, - 0x00,0x12,0x20,0x12,0x20,0x22,0x20,0xC1,0xE0}; -const u8g_fntpgm_uint8_t fontpage_162_229_229[45] U8G_FONT_SECTION("fontpage_162_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0A, - 0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; -const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, - 0x60,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0}; -const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_241_241") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11, - 0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; -const u8g_fntpgm_uint8_t fontpage_162_243_243[45] U8G_FONT_SECTION("fontpage_162_243_243") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x11,0x00,0x7F,0xC0,0x04,0x00,0x04, - 0x00,0xFF,0xC0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; -const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_247_247") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F, - 0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0,0x11,0x00,0xE0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_163_151_151[43] U8G_FONT_SECTION("fontpage_163_151_151") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x09,0xFF,0x00, - 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x11,0x00,0x11, - 0x00,0x11,0x00,0x11,0x00,0x21,0x20,0x41,0x20,0x80,0xE0}; -const u8g_fntpgm_uint8_t fontpage_163_183_183[45] U8G_FONT_SECTION("fontpage_163_183_183") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, - 0x60,0x41,0x00,0x4F,0xC0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; -const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x89,0x00,0x4F,0xE0,0x59,0x00,0x09, - 0x00,0x2F,0xC0,0x29,0x00,0xCF,0xC0,0x49,0x00,0x49,0x00,0x4F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_163_250_251[73] U8G_FONT_SECTION("fontpage_163_250_251") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7F, - 0xC0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xFF,0xE0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04, - 0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0}; -const u8g_fntpgm_uint8_t fontpage_164_134_135[73] U8G_FONT_SECTION("fontpage_164_134_135") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x87,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, - 0x40,0xBF,0xA0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xC3,0x00,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0x21,0x20,0x39,0x20,0xE1,0x20,0x21,0x20,0x29, - 0x20,0x32,0x20,0x22,0x20,0x04,0x20,0x08,0xC0}; -const u8g_fntpgm_uint8_t fontpage_164_155_155[45] U8G_FONT_SECTION("fontpage_164_155_155") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x18,0x20,0x24,0xA0,0x42,0xA0,0xBC, - 0xA0,0x24,0xA0,0x24,0xA0,0x38,0xA0,0x22,0x20,0x22,0x20,0x1E,0x60}; -const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_157_157") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x27,0xE0,0xF9,0x20,0x11,0x20,0x21, - 0x20,0x69,0x20,0xB1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xC0}; -const u8g_fntpgm_uint8_t fontpage_164_171_171[45] U8G_FONT_SECTION("fontpage_164_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7C,0x20,0x44,0x20,0x44,0xA0,0x7C,0xA0,0x10, - 0xA0,0xFE,0xA0,0x12,0xA0,0x22,0xA0,0x22,0x20,0x42,0x20,0x8C,0xE0}; -const u8g_fntpgm_uint8_t fontpage_164_176_176[45] U8G_FONT_SECTION("fontpage_164_176_176") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFE,0x20,0x10,0x20,0x20,0xA0,0x44,0xA0,0xFE, - 0xA0,0x10,0xA0,0x7C,0xA0,0x10,0xA0,0x10,0x20,0x1E,0x20,0xE0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x50,0xA0,0x7E,0xA0,0x90,0xA0,0xFE, - 0xA0,0x10,0xA0,0x7E,0xA0,0x52,0xA0,0x52,0x20,0x56,0x20,0x10,0xE0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x7E,0x20,0x42,0x20,0x7E,0xA0,0x48,0xA0,0x48,0xA0,0x7E,0xA0,0x6A, - 0xA0,0xAA,0xA0,0xAA,0xA0,0x2E,0x20,0x08,0xE0}; -const u8g_fntpgm_uint8_t fontpage_164_242_242[45] U8G_FONT_SECTION("fontpage_164_242_242") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0xFE,0x20,0x92,0xA0,0x7C,0xA0,0x10, - 0xA0,0x7C,0xA0,0x10,0xA0,0xFE,0xA0,0x44,0x20,0x44,0x20,0x7C,0xE0}; -const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165_155_155") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0x08,0x00,0xFF,0x80,0x08, - 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; -const u8g_fntpgm_uint8_t fontpage_165_159_160[73] U8G_FONT_SECTION("fontpage_165_159_160") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0xA0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0x01,0x00,0xF9,0x00,0x27,0xE0,0x21, - 0x20,0x21,0x20,0x21,0x20,0x3A,0x20,0xC2,0x20,0x04,0x20,0x18,0xC0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x20,0x00,0x20,0x00,0xFD,0xE0,0x25,0x20,0x25,0x20,0x25,0x20,0x25, - 0x20,0x25,0x20,0x45,0x20,0x55,0xE0,0x89,0x20}; -const u8g_fntpgm_uint8_t fontpage_165_168_168[45] U8G_FONT_SECTION("fontpage_165_168_168") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0x79,0x00,0x01,0x00,0x03,0xE0,0xFD, - 0x20,0x21,0x20,0x21,0x20,0x49,0x20,0xFA,0x20,0x0A,0x20,0x04,0xC0}; -const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, - 0x00,0xA2,0x00,0x26,0x00,0x2A,0x00,0x22,0x20,0x22,0x20,0x21,0xE0}; -const u8g_fntpgm_uint8_t fontpage_166_199_199[45] U8G_FONT_SECTION("fontpage_166_199_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x0D,0x00,0x71,0x00,0x11,0x00,0x11,0x00,0x11, - 0x00,0xFF,0xC0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_202_202[45] U8G_FONT_SECTION("fontpage_166_202_202") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7F, - 0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_207_207[45] U8G_FONT_SECTION("fontpage_166_207_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x42,0x00,0x4F,0x80,0xE2,0x80,0x42, - 0x80,0x4A,0xC0,0x52,0xA0,0x44,0x80,0x44,0x80,0x4A,0x80,0x51,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_213_213[45] U8G_FONT_SECTION("fontpage_166_213_213") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x0A,0x00,0x7F,0xC0,0x44,0x40,0x7F, - 0xC0,0x44,0x40,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_225_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x0F,0x80,0x08,0x00,0x08,0x00,0xFF, - 0xE0,0x08,0x00,0x0A,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_240_241[73] U8G_FONT_SECTION("fontpage_166_240_241") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF1,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x10,0x00,0xE7,0xC0,0x84,0x40,0x84,0x40,0xF4, - 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xE5,0x80,0x84,0x00,0x04,0x00,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x10,0x00,0x1F,0x80,0x21,0x00,0x7F,0xE0,0x20,0x00,0x2F,0x80,0x28, - 0x80,0x28,0x80,0x2B,0x20,0x48,0x20,0x87,0xE0}; -const u8g_fntpgm_uint8_t fontpage_166_244_244[45] U8G_FONT_SECTION("fontpage_166_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x11,0xE0,0x7D,0x20,0x11,0x20,0x11, - 0x20,0xFF,0x20,0x11,0x20,0x21,0x20,0x4D,0x60,0x75,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166_248_248") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x7D,0xE0,0x91,0x20,0x11,0x20,0xFF, - 0x20,0x11,0x20,0x5D,0x20,0x51,0x20,0x51,0xA0,0x5D,0x40,0xE1,0x00}; -const u8g_fntpgm_uint8_t fontpage_167_139_139[45] U8G_FONT_SECTION("fontpage_167_139_139") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x20,0x00,0x22,0x00,0x22,0x00,0x22, - 0x00,0x3F,0xC0,0x22,0x00,0x22,0x80,0x42,0x40,0x42,0x00,0xBF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167_159_159") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x22,0x00,0x2F,0xC0,0x28,0x40,0x2F, - 0xC0,0x28,0x40,0x2F,0xC0,0x22,0x00,0x2A,0x80,0x52,0x60,0xA6,0x20}; -const u8g_fntpgm_uint8_t fontpage_167_204_205[71] U8G_FONT_SECTION("fontpage_167_204_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0xFF,0xE0,0x0A,0x40,0x4A,0x40,0x2A,0x40,0x11, - 0x40,0x11,0x40,0x28,0x80,0x45,0x80,0x82,0x40,0x04,0x20,0x0B,0x0B,0x16,0x0C,0x00, - 0xFF,0x01,0xC0,0x3E,0x00,0x20,0x00,0x20,0x00,0x3F,0xC0,0x28,0x80,0x25,0x00,0x22, - 0x00,0x45,0x00,0x48,0x80,0xB0,0x60}; -const u8g_fntpgm_uint8_t fontpage_167_214_214[45] U8G_FONT_SECTION("fontpage_167_214_214") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD6,0xD6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFC,0x00,0x4B,0xE0,0x4A,0x20,0x7A,0x20,0x49, - 0x40,0x79,0x40,0x48,0x80,0x4C,0x80,0xF9,0x40,0x0A,0x40,0x0C,0x20}; -const u8g_fntpgm_uint8_t fontpage_167_216_216[45] U8G_FONT_SECTION("fontpage_167_216_216") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0xFF,0xC0,0x12,0x00,0x52,0x80,0x92, - 0x40,0x00,0x00,0x7F,0x80,0x12,0x00,0x0C,0x00,0x12,0x00,0xE1,0xC0}; -const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xFF, - 0x80,0x00,0x80,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00}; -const u8g_fntpgm_uint8_t fontpage_168_131_131[45] U8G_FONT_SECTION("fontpage_168_131_131") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xF2,0x00,0x97,0xE0,0x98,0x00,0x97, - 0xC0,0x90,0x80,0x91,0x00,0xF2,0x00,0x94,0x20,0x04,0x20,0x03,0xE0}; -const u8g_fntpgm_uint8_t fontpage_168_136_136[45] U8G_FONT_SECTION("fontpage_168_136_136") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, - 0x60,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80}; -const u8g_fntpgm_uint8_t fontpage_168_141_142[73] U8G_FONT_SECTION("fontpage_168_141_142") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8E,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0xC0,0x10,0x80,0x29,0x00,0x46, - 0x00,0x04,0x00,0x1F,0xC0,0xF0,0x40,0x10,0x40,0x10,0x40,0x1F,0xC0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x01,0xC0,0x3E,0x00,0x20,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x2F, - 0xC0,0x28,0x40,0x48,0x40,0x4F,0xC0,0x88,0x40}; -const u8g_fntpgm_uint8_t fontpage_168_145_145[45] U8G_FONT_SECTION("fontpage_168_145_145") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x10,0x00,0xFF,0xC0,0x80,0x40,0x9E, - 0x40,0x92,0x40,0x92,0x40,0x9E,0x40,0x80,0x40,0x80,0x40,0x81,0xC0}; -const u8g_fntpgm_uint8_t fontpage_168_166_166[45] U8G_FONT_SECTION("fontpage_168_166_166") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x0D,0x80,0x34,0x40,0xC4, - 0x20,0x04,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40}; -const u8g_fntpgm_uint8_t fontpage_168_175_175[45] U8G_FONT_SECTION("fontpage_168_175_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F, - 0xC0,0x20,0x00,0x3F,0xC0,0x30,0x40,0x50,0x40,0x5F,0xC0,0x90,0x40}; -const u8g_fntpgm_uint8_t fontpage_168_202_202[45] U8G_FONT_SECTION("fontpage_168_202_202") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x04, - 0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_168_232_232[45] U8G_FONT_SECTION("fontpage_168_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x22,0x20,0x2F,0xA0,0x22,0x20,0x3F, - 0xE0,0x20,0x20,0x2F,0xA0,0x28,0xA0,0x4F,0xA0,0x40,0x20,0x80,0x60}; -const u8g_fntpgm_uint8_t fontpage_168_253_253[45] U8G_FONT_SECTION("fontpage_168_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0xEE,0xE0,0x00, - 0x00,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7A,0x40,0x4A,0xC0,0x02,0x00}; -const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0C,0x00,0x70,0x00,0x11,0xE0,0xFD,0x20,0x11, - 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xE0,0x10,0x00}; -const u8g_fntpgm_uint8_t fontpage_169_205_205[45] U8G_FONT_SECTION("fontpage_169_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0x02,0x00,0xEF,0xE0,0xA8,0x20,0xAB, - 0xA0,0xAA,0xA0,0xAA,0xA0,0xEB,0xA0,0x08,0x20,0x08,0x20,0x08,0x60}; -const u8g_fntpgm_uint8_t fontpage_171_183_183[45] U8G_FONT_SECTION("fontpage_171_183_183") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xEF,0xE0,0xA5,0x40,0xAF,0xE0,0xA4, - 0x40,0xAF,0xE0,0xE8,0x20,0xA9,0x20,0x09,0x20,0x02,0x80,0x0C,0x60}; -const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_180_180") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0xA0,0xEB,0xC0,0xAA,0xA0,0xBF,0xE0,0xA4, - 0x80,0xAF,0xE0,0xF9,0x20,0x0F,0xE0,0x09,0x20,0x0F,0xE0,0x11,0x20}; -const u8g_fntpgm_uint8_t fontpage_172_232_232[45] U8G_FONT_SECTION("fontpage_172_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7B,0xC0,0x04, - 0x80,0xFF,0xE0,0x11,0x00,0xFB,0xE0,0x4A,0x40,0x4A,0x40,0x7B,0xC0}; -const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xEF,0xE0,0xA5,0x40,0xAF,0xE0,0xA4, - 0x40,0xA7,0xC0,0xE4,0x40,0x07,0xC0,0x04,0x40,0x07,0xC0,0x0C,0x60}; -const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x80,0x40,0x80,0x40,0x9E,0x40,0x92, - 0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0x80,0x40,0xFF,0xC0,0x80,0x40}; -const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_224_224") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x84,0x20,0x84,0x20,0xBF,0xA0,0x84, - 0x20,0x84,0x20,0x8A,0x20,0x91,0x20,0xA0,0xA0,0x80,0x20,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_173_250_250[45] U8G_FONT_SECTION("fontpage_173_250_250") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x88,0x40,0x88,0x40,0xFF,0x40,0x88, - 0x40,0xBE,0x40,0xA2,0x40,0xA2,0x40,0xBE,0x40,0x80,0x40,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_173_254_254[45] U8G_FONT_SECTION("fontpage_173_254_254") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x90,0x40,0x9F,0x40,0xB2,0x40,0xCC, - 0x40,0x92,0x40,0xE9,0xC0,0x84,0x40,0x88,0x40,0x84,0x40,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0xC0,0x10,0x00,0x22, - 0x00,0x62,0x00,0xAF,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3F,0xC0}; -const u8g_fntpgm_uint8_t fontpage_174_207_207[45] U8G_FONT_SECTION("fontpage_174_207_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x2F,0xE0,0x20,0x80,0xF8,0x80,0x21, - 0x00,0x21,0x80,0x23,0x40,0x35,0x20,0xC9,0x20,0x01,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_174_215_215[45] U8G_FONT_SECTION("fontpage_174_215_215") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD7,0xD7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x27,0xC0,0xF9,0x40,0x21, - 0x40,0x21,0x40,0x2F,0xE0,0x31,0x00,0xC2,0x80,0x04,0x40,0x18,0x20}; -const u8g_fntpgm_uint8_t fontpage_175_139_139[45] U8G_FONT_SECTION("fontpage_175_139_139") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7E,0x40,0x29,0x40,0x29,0x40,0xFF,0x40,0x29, - 0x40,0x28,0x40,0x4C,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_175_171_171[45] U8G_FONT_SECTION("fontpage_175_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xFF,0x80,0x22,0x80,0x36,0xA0,0xE3, - 0xA0,0x2C,0xE0,0x64,0x00,0x04,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEB,0xEB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x21,0x00,0xF7,0xC0,0x24, - 0x40,0x27,0x40,0x25,0xC0,0x34,0x40,0xEF,0xE0,0x02,0x80,0x0C,0x60}; -const u8g_fntpgm_uint8_t fontpage_177_243_243[45] U8G_FONT_SECTION("fontpage_177_243_243") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0xC0,0x00, - 0x00,0xFF,0xE0,0x80,0x20,0x1F,0x00,0x11,0x20,0x21,0x20,0xC0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_178_135_135[45] U8G_FONT_SECTION("fontpage_178_135_135") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0x80,0x31,0x00,0x4E,0x00,0x0B, - 0x00,0x30,0xE0,0xFF,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_178_141_141[45] U8G_FONT_SECTION("fontpage_178_141_141") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x3F,0xE0,0x60,0x80,0xBF,0x80,0x20, - 0x80,0x3F,0x80,0x10,0x00,0x3F,0x80,0xC9,0x00,0x06,0x00,0xF9,0xE0}; -const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x3D,0x00,0x25,0x00,0x45, - 0x80,0xA5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; -const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x1F,0x00,0x21,0x00,0x52,0x00,0x0C, - 0x00,0x34,0x00,0xCF,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xF8,0x00}; -const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_167_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04, - 0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; -const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xAA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, - 0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A, - 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xC4,0x60}; -const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_177_177") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x04, - 0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; -const u8g_fntpgm_uint8_t fontpage_178_180_180[45] U8G_FONT_SECTION("fontpage_178_180_180") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x0A,0x00,0x22,0x00,0x12,0x00,0x02, - 0x00,0xFF,0xE0,0x02,0x00,0x05,0x00,0x08,0x80,0x10,0x40,0x60,0x20}; -const u8g_fntpgm_uint8_t fontpage_178_253_253[45] U8G_FONT_SECTION("fontpage_178_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x23,0xE0,0xF8,0x40,0x28,0x80,0x28, - 0x80,0x4F,0xE0,0x50,0x80,0x30,0x80,0x28,0x80,0x48,0x80,0x83,0x80}; -const u8g_fntpgm_uint8_t fontpage_179_203_203[45] U8G_FONT_SECTION("fontpage_179_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0xFA,0x40,0x2A,0x20,0x2F, - 0xE0,0x48,0x00,0x53,0xE0,0x32,0x20,0x2A,0x20,0x4B,0xE0,0x82,0x20}; -const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_208_208") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, - 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0xC0,0x20, - 0x80,0x61,0x00,0xBF,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; -const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x88,0x40,0x08, - 0x00,0xFF,0xE0,0x11,0x00,0x31,0x00,0x0E,0x00,0x09,0x80,0x70,0x60}; -const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x00, - 0x00,0x7F,0xE0,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xE0}; -const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x80,0x40,0x3F, - 0xC0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0xFF,0xC0,0x90,0x40,0x3F,0x00,0x52, - 0x00,0x8C,0x00,0x33,0x00,0xFF,0xC0,0x21,0x00,0x21,0x00,0x3F,0x00}; -const u8g_fntpgm_uint8_t fontpage_183_171_171[45] U8G_FONT_SECTION("fontpage_183_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0xFF,0xC0,0x80,0x40,0x3F,0x00,0x21, - 0x00,0x3F,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x7F,0x80,0x40,0x80}; -const u8g_fntpgm_uint8_t fontpage_183_249_249[45] U8G_FONT_SECTION("fontpage_183_249_249") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x00,0x80,0xF0,0x80,0x1F,0xE0,0x90,0x80,0x50, - 0x80,0x24,0x80,0x22,0x80,0x50,0x80,0x50,0x80,0x82,0x80,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_184_134_134[45] U8G_FONT_SECTION("fontpage_184_134_134") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x27,0xC0,0xA4,0x80,0x6B,0x00,0x22, - 0x80,0x24,0x80,0x6F,0xE0,0xA4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; -const u8g_fntpgm_uint8_t fontpage_184_143_143[45] U8G_FONT_SECTION("fontpage_184_143_143") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, - 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_177_177") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFD,0x40,0x01,0x20,0x7F,0xE0,0x4A, - 0x80,0x7A,0x80,0x12,0x80,0x5A,0xA0,0x56,0xA0,0x92,0xA0,0x34,0x60}; -const u8g_fntpgm_uint8_t fontpage_184_207_207[45] U8G_FONT_SECTION("fontpage_184_207_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x20,0x20,0x3F,0xE0,0x28,0x40,0x24, - 0x80,0x3F,0xE0,0x24,0x80,0x3F,0xE0,0x24,0x80,0x48,0x80,0x90,0x80}; -const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x09,0x00,0x00, - 0x00,0x0B,0x09,0x12,0x0C,0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, - 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_187_238_238[45] U8G_FONT_SECTION("fontpage_187_238_238") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0x09,0x00,0xFF,0xE0,0x04,0x00,0x7F, - 0xC0,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0x80,0x42,0x00,0xBF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_187_242_242[43] U8G_FONT_SECTION("fontpage_187_242_242") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x09,0xFF,0x00, - 0x00,0x0A,0x0A,0x14,0x0C,0x01,0xFF,0xFF,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xFF, - 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7F,0xC0}; -const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, - 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_188_246_246[45] U8G_FONT_SECTION("fontpage_188_246_246") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11, - 0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; -const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x7F, - 0xE0,0x42,0x00,0x47,0x00,0x4A,0x80,0x52,0x40,0xA2,0x20,0x82,0x00}; -const u8g_fntpgm_uint8_t fontpage_189_148_148[45] U8G_FONT_SECTION("fontpage_189_148_148") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x02,0x00,0x7F,0xE0,0x40,0x00,0x44, - 0x40,0x52,0x40,0x4A,0x40,0x48,0x80,0x40,0x80,0x81,0x00,0x9F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_189_159_159[45] U8G_FONT_SECTION("fontpage_189_159_159") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x3F,0xE0,0x2A,0x80,0x2A,0x40,0x3F, - 0xE0,0x24,0x00,0x27,0xC0,0x2A,0x40,0x31,0x80,0x42,0x40,0x8C,0x20}; -const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_166_166") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x49,0x00,0x7F,0xC0,0x49, - 0x00,0x4F,0x00,0x40,0x00,0x5F,0x80,0x49,0x00,0x86,0x00,0xB9,0xC0}; -const u8g_fntpgm_uint8_t fontpage_190_128_128[45] U8G_FONT_SECTION("fontpage_190_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x11,0x00,0x11,0x00,0x11,0x00,0x11, - 0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; -const u8g_fntpgm_uint8_t fontpage_190_131_131[45] U8G_FONT_SECTION("fontpage_190_131_131") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x08,0x00,0x10,0x80,0x3F, - 0xC0,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; -const u8g_fntpgm_uint8_t fontpage_190_143_143[45] U8G_FONT_SECTION("fontpage_190_143_143") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x80,0x02,0x40,0x02,0x00,0xFF,0xE0,0x02, - 0x00,0x7A,0x00,0x12,0x00,0x11,0x00,0x11,0x20,0x18,0xA0,0xE0,0x60}; -const u8g_fntpgm_uint8_t fontpage_190_149_149[45] U8G_FONT_SECTION("fontpage_190_149_149") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFC,0x40,0x04,0x40,0x04,0x40,0x7C,0x40,0x40, - 0x40,0xFC,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x28,0x40,0x10,0x40}; -const u8g_fntpgm_uint8_t fontpage_190_185_185[45] U8G_FONT_SECTION("fontpage_190_185_185") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xE4,0x40,0x22,0x80,0x2F,0xE0,0xE9,0x20,0x8F, - 0xE0,0x89,0x20,0xEF,0xE0,0x21,0x00,0x2F,0xE0,0xA1,0x00,0x41,0x00}; -const u8g_fntpgm_uint8_t fontpage_190_210_210[45] U8G_FONT_SECTION("fontpage_190_210_210") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x10,0x00,0x17,0xC0,0x90,0x40,0x90,0x40,0x90, - 0x40,0x97,0xC0,0x90,0x40,0x90,0x40,0x20,0x40,0x4F,0xC0,0x80,0x40}; -const u8g_fntpgm_uint8_t fontpage_191_132_133[73] U8G_FONT_SECTION("fontpage_191_132_133") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x17,0xC0,0x20,0x80,0x49,0x00,0x92,0x80,0x24, - 0x40,0x68,0x20,0xA7,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x11,0x00,0x21,0x00,0x47,0xC0,0x91,0x00,0x1F,0xE0,0x20,0x80,0x6F, - 0xE0,0xA4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; -const u8g_fntpgm_uint8_t fontpage_191_170_170[45] U8G_FONT_SECTION("fontpage_191_170_170") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xAA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0xE0,0x28,0x80,0x4F,0xE0,0x98,0x80,0x2B, - 0xE0,0x6A,0x20,0xAB,0xE0,0x2A,0x20,0x2B,0xE0,0x2A,0x20,0x33,0xE0}; -const u8g_fntpgm_uint8_t fontpage_191_174_174[45] U8G_FONT_SECTION("fontpage_191_174_174") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2A,0x80,0x6A,0x80,0xBE,0x80,0x01,0xE0,0x5D, - 0x40,0xC3,0x40,0x5D,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; -const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, - 0x40,0x50,0x20,0x50,0x20,0x50,0xA0,0x90,0x80,0x10,0x80,0x0F,0x80}; -const u8g_fntpgm_uint8_t fontpage_191_253_253[45] U8G_FONT_SECTION("fontpage_191_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x3F,0xC0,0x2A,0x40,0x4A,0x40,0x14, - 0x40,0x28,0x40,0x05,0x80,0x12,0x40,0x50,0xA0,0x50,0xA0,0x8F,0x80}; -const u8g_fntpgm_uint8_t fontpage_192_167_167[45] U8G_FONT_SECTION("fontpage_192_167_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x25,0x00,0xB5,0x00,0xAF,0xE0,0xA9, - 0x00,0xB1,0x00,0x27,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_192_187_187[45] U8G_FONT_SECTION("fontpage_192_187_187") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x0A,0x00,0x3F,0x80,0x20,0x80,0x20, - 0x80,0x3F,0x80,0x20,0x80,0x04,0x40,0x52,0xA0,0x50,0xA0,0x8F,0x80}; -const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_226_226") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x2F,0xE0,0xB2,0x00,0xAA,0x80,0xA4, - 0x80,0xA5,0xA0,0x2A,0xC0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; -const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_239_239") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20, - 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x54,0x40,0x52,0xA0,0x8F,0x80}; -const u8g_fntpgm_uint8_t fontpage_194_159_159[45] U8G_FONT_SECTION("fontpage_194_159_159") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x40,0x7F,0xE0,0x41,0x00,0x7F,0x40,0x5D, - 0x40,0x52,0x80,0x9D,0xA0,0x82,0x60,0x24,0x40,0xA2,0xA0,0x9F,0x80}; -const u8g_fntpgm_uint8_t fontpage_196_143_144[73] U8G_FONT_SECTION("fontpage_196_143_144") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x90,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x80,0x7A,0x40,0x0A,0x00,0x4F,0xE0,0x2A, - 0x00,0x12,0x40,0x12,0x80,0x29,0x00,0x41,0x20,0x86,0xA0,0x00,0x60,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x02,0x80,0x02,0x40,0x7F,0xE0,0x42,0x00,0x42,0x00,0x7A,0x40,0x4A, - 0x40,0x4A,0x80,0x49,0x20,0x52,0xA0,0x84,0x60}; -const u8g_fntpgm_uint8_t fontpage_196_183_183[45] U8G_FONT_SECTION("fontpage_196_183_183") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x02,0x00,0x3F,0xC0,0x20,0x40,0x20, - 0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; -const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_192_192") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x18,0x60,0x63,0x80,0x42,0x00,0x7A,0x00,0x4B, - 0xE0,0x4A,0x40,0x7A,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; -const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_199_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x7F,0xE0,0x40, - 0x00,0x7D,0xE0,0x44,0x20,0x54,0xA0,0x4C,0x60,0x54,0xA0,0xA9,0x60}; -const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x03,0xC0,0x7C,0x00,0x04,0x00,0x7F,0xC0,0x04, - 0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00}; -const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_211_211") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,0x28, - 0x80,0x30,0x80,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0xE3,0x80}; -const u8g_fntpgm_uint8_t fontpage_196_231_231[45] U8G_FONT_SECTION("fontpage_196_231_231") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x22,0x00,0xFF,0x80,0x22,0x80,0x2A, - 0x80,0x36,0x80,0x62,0x80,0xA7,0xA0,0x24,0xA0,0xA8,0xA0,0x50,0x60}; -const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_249_249") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x24,0x80,0xFC,0x80,0x24,0xA0,0x2F, - 0xC0,0x34,0x80,0x64,0x80,0xA4,0x80,0x25,0xA0,0x26,0xA0,0xE4,0x60}; -const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x40,0x22,0x40,0xF9,0x40,0x20,0x40,0x2A, - 0x40,0x31,0x40,0x60,0xE0,0xAF,0x40,0x20,0x40,0x20,0x40,0xE0,0x40}; -const u8g_fntpgm_uint8_t fontpage_197_165_165[45] U8G_FONT_SECTION("fontpage_197_165_165") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x24,0x40,0xFC,0x40,0x25,0x80,0x2C, - 0x00,0x37,0xE0,0x65,0x40,0xA5,0x40,0x24,0x80,0x25,0x40,0xE6,0x20}; -const u8g_fntpgm_uint8_t fontpage_197_172_172[45] U8G_FONT_SECTION("fontpage_197_172_172") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0xFA,0x40,0x27,0xA0,0x28, - 0x20,0x30,0x00,0x67,0xE0,0xA4,0x20,0x24,0x20,0x27,0xE0,0xE4,0x20}; -const u8g_fntpgm_uint8_t fontpage_197_189_189[45] U8G_FONT_SECTION("fontpage_197_189_189") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x20,0x80,0xF8,0x80,0x27,0xE0,0x2C, - 0xA0,0x34,0xA0,0x67,0xE0,0xA4,0xA0,0x24,0xA0,0x27,0xE0,0xE4,0x20}; -const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x22,0x40,0xFF,0xE0,0x22,0x00,0x2B, - 0xC0,0x32,0x40,0x65,0x40,0xA4,0x80,0x28,0x80,0x29,0x40,0xE6,0x20}; -const u8g_fntpgm_uint8_t fontpage_197_233_233[45] U8G_FONT_SECTION("fontpage_197_233_233") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x22,0x40,0xF9,0x80,0x22,0x40,0x2C, - 0x20,0x31,0x00,0x67,0xC0,0xA1,0x00,0x2F,0xE0,0x21,0x00,0xE1,0x00}; -const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0xFF,0xE0,0x25,0x20,0x29, - 0x00,0x37,0xE0,0x62,0x40,0xA6,0x40,0x21,0x80,0x22,0x80,0xEC,0x60}; -const u8g_fntpgm_uint8_t fontpage_198_161_161[45] U8G_FONT_SECTION("fontpage_198_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x25,0x20,0xFB,0x40,0x21,0x00,0x2F, - 0xE0,0x30,0x20,0x60,0x20,0xA7,0xE0,0x20,0x20,0x20,0x20,0xEF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_198_164_164[45] U8G_FONT_SECTION("fontpage_198_164_164") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xE0,0xFA,0x40,0x21,0x80,0x2E, - 0x60,0x30,0x00,0x62,0x40,0xA2,0x40,0x22,0x40,0x24,0x40,0xE8,0x40}; -const u8g_fntpgm_uint8_t fontpage_198_223_223[45] U8G_FONT_SECTION("fontpage_198_223_223") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xC0,0x22,0x40,0xFB,0xC0,0x20,0x00,0x2F, - 0xE0,0x34,0x20,0x65,0x20,0xA5,0x20,0x25,0x20,0x22,0x80,0xEC,0x60}; -const u8g_fntpgm_uint8_t fontpage_198_226_226[45] U8G_FONT_SECTION("fontpage_198_226_226") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0xFC,0x80,0x27,0xC0,0x2D, - 0x40,0x35,0x40,0x6F,0xE0,0xA1,0x00,0x22,0x80,0x24,0x40,0xE8,0x20}; -const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0xE0,0xF9,0x00,0x27,0xC0,0x2C, - 0x40,0x37,0xC0,0x64,0x40,0xA7,0xC0,0x21,0x00,0x2F,0xE0,0xE1,0x00}; -const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x28,0x20,0xF2,0x80,0x24,0x40,0x29, - 0x20,0x31,0x00,0x6F,0xE0,0xA1,0x00,0x25,0x80,0x29,0x40,0xF1,0x20}; -const u8g_fntpgm_uint8_t fontpage_199_165_165[45] U8G_FONT_SECTION("fontpage_199_165_165") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xF4,0x40,0x22,0x80,0x2F, - 0xE0,0x31,0x00,0x6F,0xE0,0xA2,0x40,0x26,0x80,0x21,0x40,0xEE,0x20}; -const u8g_fntpgm_uint8_t fontpage_199_167_167[45] U8G_FONT_SECTION("fontpage_199_167_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xF8,0x20,0x22,0x80,0x24, - 0x40,0x38,0x20,0x67,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0xEF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_199_208_208[45] U8G_FONT_SECTION("fontpage_199_208_208") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x24,0x40,0xFF,0xC0,0x24,0x40,0x27, - 0xC0,0x30,0x00,0x6F,0xE0,0xA5,0x00,0x25,0xE0,0x2B,0x00,0xF1,0xE0}; -const u8g_fntpgm_uint8_t fontpage_199_210_210[45] U8G_FONT_SECTION("fontpage_199_210_210") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0xC0,0x27,0x00,0xF1,0x00,0x2F,0xE0,0x21, - 0x00,0x35,0x60,0x69,0x20,0xAD,0x60,0x29,0x20,0x29,0x20,0xEF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_202_182_182[45] U8G_FONT_SECTION("fontpage_202_182_182") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x93,0xE0,0x94,0x40,0x9A, - 0x40,0x92,0x40,0xB2,0x80,0xD1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; -const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_190_190") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x11,0x00,0xFD,0xE0,0x22,0x40,0x25, - 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4A,0x40,0x94,0x20}; -const u8g_fntpgm_uint8_t fontpage_202_240_240[45] U8G_FONT_SECTION("fontpage_202_240_240") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x95,0x00,0x59,0x00,0xFD,0xE0,0x33,0x40,0x59, - 0x40,0x95,0x40,0xFD,0x40,0x29,0x40,0x68,0x80,0x11,0x40,0xEE,0x20}; -const u8g_fntpgm_uint8_t fontpage_202_242_242[45] U8G_FONT_SECTION("fontpage_202_242_242") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0xFE,0xE0,0x00,0x80,0x78,0x80,0x4B, - 0xE0,0x79,0x40,0x01,0x40,0xFF,0x40,0xAA,0x80,0xBB,0x40,0x86,0x20}; -const u8g_fntpgm_uint8_t fontpage_202_244_244[45] U8G_FONT_SECTION("fontpage_202_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x55,0x40,0x7C,0x80,0x39, - 0x40,0x56,0x20,0x7F,0xC0,0x04,0x00,0x27,0x80,0x24,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_203_135_135[45] U8G_FONT_SECTION("fontpage_203_135_135") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x11, - 0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x1B,0x00,0xE0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_203_153_153[45] U8G_FONT_SECTION("fontpage_203_153_153") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0xAC,0x80,0x72,0x80,0x20,0x80,0xFC, - 0x80,0x22,0x80,0x30,0xE0,0x6F,0x80,0xA0,0x80,0x20,0x80,0x20,0x80}; -const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x40,0x29,0x40,0x44,0xC0,0xB8,0x40,0x12, - 0x40,0x7D,0x40,0x10,0x60,0x55,0xC0,0x52,0x40,0x92,0x40,0x30,0x40}; -const u8g_fntpgm_uint8_t fontpage_203_173_173[45] U8G_FONT_SECTION("fontpage_203_173_173") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x60,0xD5,0x80,0xB9,0x00,0x91,0x00,0xFD, - 0xE0,0xB1,0x40,0xD9,0x40,0xD5,0x40,0x91,0x40,0xFA,0x40,0x04,0x40}; -const u8g_fntpgm_uint8_t fontpage_203_176_176[45] U8G_FONT_SECTION("fontpage_203_176_176") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x60,0xFD,0x80,0x45,0x00,0x29,0x00,0xFD, - 0xE0,0x11,0x40,0xFD,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; -const u8g_fntpgm_uint8_t fontpage_203_185_185[45] U8G_FONT_SECTION("fontpage_203_185_185") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0xFF,0xE0,0x08,0x00,0x08, - 0x00,0x0F,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; -const u8g_fntpgm_uint8_t fontpage_203_224_224[45] U8G_FONT_SECTION("fontpage_203_224_224") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, - 0xE0,0x0A,0x00,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0}; -const u8g_fntpgm_uint8_t fontpage_203_246_246[45] U8G_FONT_SECTION("fontpage_203_246_246") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x00,0x80,0xF0,0x80,0x9F,0xE0,0x90,0x80,0x94, - 0x80,0xF2,0x80,0x92,0x80,0x90,0x80,0x90,0x80,0xF0,0x80,0x03,0x80}; -const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_142_142") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8E,0x8E,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x03,0xE0,0xF2,0x20,0x92,0x20,0x93,0xE0,0xF2, - 0x20,0x92,0x20,0x93,0xE0,0xF2,0x20,0x04,0x20,0x08,0xA0,0x30,0x40}; -const u8g_fntpgm_uint8_t fontpage_204_175_175[45] U8G_FONT_SECTION("fontpage_204_175_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F, - 0x80,0x00,0x00,0xFF,0xE0,0x24,0x00,0x27,0x80,0x54,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_205_130_130[45] U8G_FONT_SECTION("fontpage_205_130_130") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x40,0xFB,0x80,0x52,0x00,0xFB,0xE0,0x12, - 0x80,0xF4,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xE0,0xFF,0x00,0x55,0xE0,0x7D,0x40,0x55, - 0x40,0xFF,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40}; -const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x02,0x00,0x3F,0xC0,0x22,0x40,0x3F, - 0xC0,0x22,0x40,0x3F,0xC0,0x0A,0x00,0x04,0x00,0x1B,0x00,0xE0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, - 0xE0,0x48,0x00,0x7F,0xC0,0x4A,0x40,0x79,0x80,0xC9,0x80,0x0E,0x60}; -const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x30, - 0x80,0x5F,0x80,0x90,0x80,0x1F,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; -const u8g_fntpgm_uint8_t fontpage_206_159_159[45] U8G_FONT_SECTION("fontpage_206_159_159") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x49,0xE0,0xFD,0x20,0x49,0x20,0x79,0xE0,0x49, - 0x20,0x79,0x20,0x49,0xE0,0xFD,0x20,0x01,0x20,0x49,0x20,0x86,0x60}; -const u8g_fntpgm_uint8_t fontpage_206_186_186[45] U8G_FONT_SECTION("fontpage_206_186_186") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0x80,0x24,0x80,0xFC,0x80,0x24, - 0x80,0x74,0x80,0x6C,0x80,0xA4,0x80,0xA4,0x80,0x28,0xA0,0x30,0xE0}; -const u8g_fntpgm_uint8_t fontpage_206_192_192[45] U8G_FONT_SECTION("fontpage_206_192_192") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x19,0x00,0x06,0x00,0x19,0x00,0x64, - 0xC0,0x04,0x00,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC4,0x60,0x0C,0x00}; -const u8g_fntpgm_uint8_t fontpage_206_223_223[45] U8G_FONT_SECTION("fontpage_206_223_223") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x24, - 0x80,0x24,0x80,0x3F,0x80,0x0E,0x00,0x15,0x00,0x24,0x80,0xC4,0x60}; -const u8g_fntpgm_uint8_t fontpage_206_225_225[45] U8G_FONT_SECTION("fontpage_206_225_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0x80,0x29,0x00,0x46,0x00,0x0A, - 0x00,0x35,0x80,0xC4,0x60,0x3F,0x80,0x15,0x00,0x24,0x80,0xDC,0x40}; -const u8g_fntpgm_uint8_t fontpage_206_229_229[45] U8G_FONT_SECTION("fontpage_206_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x24,0x80,0x15,0x00,0xFF, - 0xE0,0x04,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0xC4,0x60,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206_255_255") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0xC0,0x27,0x00,0xFC,0x00,0x24,0x00,0x27, - 0xC0,0x74,0x40,0x6E,0x40,0xA5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; -const u8g_fntpgm_uint8_t fontpage_207_151_151[45] U8G_FONT_SECTION("fontpage_207_151_151") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x71, - 0x00,0x6B,0x80,0xA5,0x40,0xA9,0x20,0x21,0x00,0x21,0x00,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_207_241_241[45] U8G_FONT_SECTION("fontpage_207_241_241") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x71, - 0x00,0x69,0x00,0xA7,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x21,0x00,0x2F,0xE0,0xF0,0x00,0x22, - 0x80,0x74,0x40,0x6A,0xA0,0xA2,0x80,0x21,0x00,0x22,0x80,0x2C,0x60}; -const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0xF4,0x40,0x2A,0x80,0x21, - 0x00,0x72,0x80,0x6C,0x60,0xA7,0xC0,0x24,0x40,0x24,0x40,0x27,0xC0}; -const u8g_fntpgm_uint8_t fontpage_209_175_175[45] U8G_FONT_SECTION("fontpage_209_175_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x40,0x22,0x80,0x27,0xC0,0xF9,0x40,0x27, - 0xC0,0x75,0x00,0x6F,0xE0,0xA3,0x20,0x25,0x20,0x29,0xC0,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_209_192_192[45] U8G_FONT_SECTION("fontpage_209_192_192") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x22,0x80,0xFC,0x40,0x28,0x20,0x27, - 0xC0,0x70,0x00,0x69,0x20,0xA4,0xA0,0x22,0x40,0x22,0x80,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x2F,0xE0,0xFA,0xA0,0x2F,0xE0,0x2A, - 0xA0,0x3F,0xE0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40}; -const u8g_fntpgm_uint8_t fontpage_212_161_161[45] U8G_FONT_SECTION("fontpage_212_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x2F,0xE0,0xF2,0x80,0x27,0xC0,0x34, - 0x40,0x6F,0xC0,0x64,0x40,0xAF,0xE0,0x21,0x00,0x22,0x80,0x2C,0x60}; -const u8g_fntpgm_uint8_t fontpage_212_217_217[45] U8G_FONT_SECTION("fontpage_212_217_217") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0x40,0x2A,0xA0,0xF4,0x40,0x27,0xC0,0x38, - 0x20,0x27,0xC0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x22,0x80,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_214_226_227[71] U8G_FONT_SECTION("fontpage_214_226_227") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE3,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, - 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xFF,0xC0,0x0B,0x0A,0x14, - 0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x04,0x00,0x24,0x00,0x27,0xC0,0x24,0x00,0x24, - 0x00,0x24,0x00,0x24,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x27,0xC0,0x24,0x00,0x24,0x00,0xFF, - 0xE0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xF8,0x00}; -const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xF6, - 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xB4,0x40,0xC4,0x40,0x83,0xC0}; -const u8g_fntpgm_uint8_t fontpage_217_161_161[45] U8G_FONT_SECTION("fontpage_217_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0x80,0x24,0x80,0x84,0x80,0x48,0xE0,0x10, - 0x00,0x2F,0xC0,0x24,0x80,0x42,0x80,0xC3,0x00,0x44,0x80,0x58,0x60}; -const u8g_fntpgm_uint8_t fontpage_217_226_226[45] U8G_FONT_SECTION("fontpage_217_226_226") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x21,0x00,0x8F,0xE0,0x49,0x20,0x19, - 0x00,0x2F,0xC0,0x28,0x40,0xCA,0x80,0x49,0x00,0x52,0x80,0x6C,0x60}; -const u8g_fntpgm_uint8_t fontpage_217_232_232[45] U8G_FONT_SECTION("fontpage_217_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x21,0x00,0x8F,0xE0,0x51,0x00,0x11, - 0x00,0x21,0x00,0x27,0xC0,0xC1,0x00,0x41,0x00,0x41,0x00,0x4F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_218_151_151[45] U8G_FONT_SECTION("fontpage_218_151_151") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x25,0x00,0x87,0xC0,0x49,0x00,0x21, - 0x00,0x3F,0xE0,0x42,0x80,0xC2,0x80,0x44,0xA0,0x48,0xA0,0x50,0xE0}; -const u8g_fntpgm_uint8_t fontpage_218_187_187[45] U8G_FONT_SECTION("fontpage_218_187_187") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0xC0,0x27,0x00,0x81,0x00,0x5F,0xE0,0x11, - 0x00,0x21,0x00,0x27,0xC0,0xC4,0x40,0x44,0x40,0x47,0xC0,0x44,0x40}; -const u8g_fntpgm_uint8_t fontpage_218_193_193[45] U8G_FONT_SECTION("fontpage_218_193_193") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x82,0x00,0x5F,0xE0,0x04,0x00,0x88,0x80,0x5F, - 0xC0,0x20,0x40,0x2A,0x80,0xCA,0x80,0x4A,0xA0,0x4A,0xA0,0x52,0x60}; -const u8g_fntpgm_uint8_t fontpage_218_203_203[45] U8G_FONT_SECTION("fontpage_218_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xBE,0x20,0x62,0xA0,0x2A,0xA0,0xAA,0xA0,0x6A, - 0xA0,0x2A,0xA0,0x2A,0xA0,0xC8,0xA0,0x54,0x20,0x62,0x20,0x40,0xE0}; -const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_136_136") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xE0,0x14, - 0x20,0x27,0xE0,0x24,0x20,0xC7,0xE0,0x44,0x20,0x44,0x20,0x44,0x60}; -const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_225_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, - 0x40,0x29,0x20,0x25,0x40,0xC5,0x80,0x49,0x00,0x42,0x80,0x5C,0x60}; -const u8g_fntpgm_uint8_t fontpage_219_247_247[45] U8G_FONT_SECTION("fontpage_219_247_247") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xC0,0x28,0x40,0x0F,0xC0,0x88,0x40,0x5F, - 0xC0,0x29,0x20,0x29,0x40,0xCF,0x80,0x49,0x20,0x4B,0x20,0x4C,0xE0}; -const u8g_fntpgm_uint8_t fontpage_220_133_133[45] U8G_FONT_SECTION("fontpage_220_133_133") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x2F,0xE0,0x01,0x00,0x97,0xC0,0x51, - 0x00,0x2F,0xE0,0x24,0x40,0xC7,0x40,0x45,0xC0,0x44,0x40,0x44,0xC0}; -const u8g_fntpgm_uint8_t fontpage_220_169_169[45] U8G_FONT_SECTION("fontpage_220_169_169") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x24,0x40,0x07,0xC0,0x94,0x40,0x57, - 0xC0,0x20,0x00,0x2F,0xE0,0xCA,0xA0,0x4A,0xA0,0x4A,0xA0,0x5F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_220_184_184[45] U8G_FONT_SECTION("fontpage_220_184_184") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB8,0xB8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x48,0x80,0x24,0xE0,0x1F,0x00,0x88,0xE0,0x5E, - 0x20,0x2A,0x40,0x2B,0xE0,0xCA,0x40,0x4A,0x40,0x52,0x40,0x66,0xC0}; -const u8g_fntpgm_uint8_t fontpage_221_144_144[45] U8G_FONT_SECTION("fontpage_221_144_144") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x28,0x80,0x8B,0xE0,0x4A,0x20,0x1B, - 0xE0,0x2A,0x20,0x2B,0xE0,0xC8,0x80,0x4A,0xC0,0x54,0xA0,0x69,0xA0}; -const u8g_fntpgm_uint8_t fontpage_221_162_162[45] U8G_FONT_SECTION("fontpage_221_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x40,0x22,0x80,0x0F,0xE0,0x82,0x80,0x44, - 0x40,0x28,0x20,0x3F,0xE0,0xCA,0xA0,0x4A,0xA0,0x4A,0xA0,0x5F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_221_209_209[45] U8G_FONT_SECTION("fontpage_221_209_209") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x24,0x40,0x07,0x40,0x85,0x40,0x5F, - 0xE0,0x34,0x60,0x27,0xC0,0xC4,0x40,0x47,0xC0,0x44,0x40,0x44,0xC0}; -const u8g_fntpgm_uint8_t fontpage_222_143_143[45] U8G_FONT_SECTION("fontpage_222_143_143") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x28,0x20,0x0F,0xE0,0x98,0x00,0x5F, - 0xE0,0x29,0x00,0x2F,0xE0,0xCD,0xA0,0x4B,0x60,0x5D,0xA0,0x49,0x60}; -const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x80,0x3E,0x80,0x12,0xE0,0x9E,0xA0,0x53, - 0xA0,0x3E,0xA0,0x28,0xA0,0xDF,0xA0,0x4A,0x40,0x52,0xA0,0x65,0x20}; -const u8g_fntpgm_uint8_t fontpage_224_239_239[45] U8G_FONT_SECTION("fontpage_224_239_239") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x17,0xE0,0x54,0x80,0x58,0x80,0x50, - 0x80,0x90,0x80,0x10,0x80,0x10,0x80,0x28,0x80,0x44,0x80,0x81,0x80}; -const u8g_fntpgm_uint8_t fontpage_225_185_185[45] U8G_FONT_SECTION("fontpage_225_185_185") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x3F, - 0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x52,0x40,0x89,0x20}; -const u8g_fntpgm_uint8_t fontpage_225_237_237[45] U8G_FONT_SECTION("fontpage_225_237_237") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xF7,0x80,0x22,0x80,0x32,0x80,0x66, - 0x80,0xA3,0x80,0x24,0xA0,0x68,0x60,0x00,0x00,0x52,0x40,0x89,0x20}; -const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_199_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20, - 0x00,0x20,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; -const u8g_fntpgm_uint8_t fontpage_228_233_233[45] U8G_FONT_SECTION("fontpage_228_233_233") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xA2,0x00,0xA7,0xE0,0xFA,0xA0,0xA2, - 0xA0,0x32,0xA0,0x64,0xA0,0xA9,0x20,0x22,0x20,0x25,0x20,0x28,0xC0}; -const u8g_fntpgm_uint8_t fontpage_228_249_249[45] U8G_FONT_SECTION("fontpage_228_249_249") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xA7,0xC0,0xF1,0x00,0xA1,0x00,0xAF, - 0xE0,0x30,0x80,0x6F,0xE0,0xA4,0x80,0x22,0x80,0x20,0x80,0x23,0x80}; -const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231_135_135") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x88,0x40,0x52,0x80,0x0C, - 0x00,0x2A,0x80,0xDF,0x40,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_231_175_175[45] U8G_FONT_SECTION("fontpage_231_175_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF9,0x00,0x21,0x00,0x23,0x00,0x73, - 0x80,0x25,0x40,0x25,0x20,0x39,0x20,0xC1,0x00,0x01,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_234_168_168[45] U8G_FONT_SECTION("fontpage_234_168_168") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44, - 0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xC0}; -const u8g_fntpgm_uint8_t fontpage_234_181_181[45] U8G_FONT_SECTION("fontpage_234_181_181") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB5,0xB5,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0x80,0x88,0x80,0xFF, - 0x80,0x88,0x80,0x88,0x80,0xFF,0x80,0x08,0x40,0x08,0x40,0x07,0xC0}; -const u8g_fntpgm_uint8_t fontpage_234_229_229[45] U8G_FONT_SECTION("fontpage_234_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xFB,0xC0,0xAE,0x40,0xA9,0x80,0xFA, - 0x40,0xAC,0x20,0xAB,0xC0,0xAA,0x40,0xFA,0x40,0x8B,0xC0,0x02,0x40}; -const u8g_fntpgm_uint8_t fontpage_236_253_253[34] U8G_FONT_SECTION("fontpage_236_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x08,0x0B,0x0B,0x0C,0x02,0xFF,0x10,0x20,0xFF,0x81,0x81,0xFF,0x81,0x81,0x81, - 0xFF,0x81}; -const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x22,0x00,0x42,0x00,0xF7,0xC0,0x98,0x40,0x90, - 0x40,0xF4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xF0,0x40,0x91,0x80}; -const u8g_fntpgm_uint8_t fontpage_237_209_209[45] U8G_FONT_SECTION("fontpage_237_209_209") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x4A,0x00,0x4B,0xE0,0x4A,0x00,0x4C, - 0x80,0x48,0x40,0x08,0x00,0x7F,0xC0,0x4A,0x40,0x4A,0x40,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_237_244_244[45] U8G_FONT_SECTION("fontpage_237_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x20, - 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_238_129_129[45] U8G_FONT_SECTION("fontpage_238_129_129") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x14,0x80,0x25,0x60,0x46,0x20,0x1F, - 0x80,0x30,0x80,0xDF,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80}; -const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_160_160") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF4,0x20,0x97,0xE0,0xF4,0x80,0x94, - 0x80,0x97,0xE0,0xF4,0x80,0x94,0x80,0xF4,0xA0,0x96,0x60,0x04,0x20}; -const u8g_fntpgm_uint8_t fontpage_240_238_238[45] U8G_FONT_SECTION("fontpage_240_238_238") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xF3,0xC0,0x24,0x80,0x4F,0xE0,0xF5, - 0x20,0x57,0xE0,0x55,0x20,0x57,0xE0,0x75,0x20,0x45,0x20,0x08,0x60}; -const u8g_fntpgm_uint8_t fontpage_243_187_187[45] U8G_FONT_SECTION("fontpage_243_187_187") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x2A,0x80,0x24,0x80,0x2A, - 0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x49,0x40,0x5F,0x40,0x40,0xC0}; -const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243_251_251") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xE3,0xE0,0x24,0x20,0xFA,0x40,0x21, - 0x80,0x36,0x80,0x29,0xE0,0x62,0x20,0xA5,0x40,0x20,0x80,0x27,0x00}; -const u8g_fntpgm_uint8_t fontpage_244_250_250[45] U8G_FONT_SECTION("fontpage_244_250_250") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x89,0x00,0x10, - 0x80,0x60,0x40,0x1F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_245_239_239[45] U8G_FONT_SECTION("fontpage_245_239_239") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x81,0x00,0x45,0x20,0xF7,0xE0,0x00,0x00,0xAF, - 0xE0,0xA1,0x00,0xAF,0xE0,0x4A,0xA0,0x6A,0xA0,0x8A,0xA0,0x08,0x60}; -const u8g_fntpgm_uint8_t fontpage_246_172_172[45] U8G_FONT_SECTION("fontpage_246_172_172") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x7B,0xE0,0x54,0x80,0xBF,0xC0,0x04, - 0x40,0x7F,0xC0,0x44,0x00,0x7F,0xE0,0x14,0x20,0x24,0xC0,0xC4,0x00}; -const u8g_fntpgm_uint8_t fontpage_246_201_201[45] U8G_FONT_SECTION("fontpage_246_201_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x7B,0xE0,0x94,0x80,0x7F,0xC0,0x04, - 0x00,0xFF,0xE0,0x01,0x00,0x7F,0xC0,0x11,0x00,0x09,0x00,0x03,0x00}; -const u8g_fntpgm_uint8_t fontpage_247_128_128[45] U8G_FONT_SECTION("fontpage_247_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x7B,0xE0,0x94,0x80,0x27,0xC0,0x50, - 0x40,0x4F,0x40,0x49,0x40,0x4F,0x40,0x49,0x40,0x4F,0x40,0x40,0xC0}; -const u8g_fntpgm_uint8_t fontpage_247_177_177[45] U8G_FONT_SECTION("fontpage_247_177_177") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x3D,0xE0,0x4A,0x80,0x94,0x40,0x7F, - 0xC0,0x12,0x40,0x3B,0xC0,0x56,0x40,0x93,0xC0,0x12,0x40,0x13,0xC0}; -const u8g_fntpgm_uint8_t fontpage_248_251_251[45] U8G_FONT_SECTION("fontpage_248_251_251") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x15,0x00,0xFF,0xE0,0x15,0x00,0x24, - 0x80,0x40,0x40,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x11,0x00,0xE0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_250_162_162[45] U8G_FONT_SECTION("fontpage_250_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x91, - 0x20,0x3E,0x00,0x08,0x80,0x7F,0xC0,0x04,0x40,0x24,0x80,0xCC,0x60}; -const u8g_fntpgm_uint8_t fontpage_250_171_171[45] U8G_FONT_SECTION("fontpage_250_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x51,0x40,0x5D,0x80,0x51,0x20,0xFD, - 0xE0,0x08,0x80,0x3F,0x00,0x08,0x80,0x7F,0xC0,0x24,0x80,0xCC,0x60}; -const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xC0,0x41,0x00,0x51,0x00,0xE1, - 0x00,0x21,0x00,0x41,0x00,0xF1,0x00,0x01,0x00,0x31,0x00,0xCF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_253_167_167[45] U8G_FONT_SECTION("fontpage_253_167_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xC0,0x22,0x40,0x4A,0x40,0x52,0x80,0xE2, - 0xE0,0x22,0x20,0x42,0x20,0xF5,0x40,0x0C,0x80,0x35,0x40,0xCA,0x20}; -const u8g_fntpgm_uint8_t fontpage_253_191_191[45] U8G_FONT_SECTION("fontpage_253_191_191") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x22,0x40,0x43,0xC0,0x4E,0x00,0xE3, - 0xE0,0x2E,0x00,0x42,0x40,0xF2,0x80,0x09,0x20,0x32,0xA0,0xCC,0x60}; -const u8g_fntpgm_uint8_t fontpage_253_198_198[45] U8G_FONT_SECTION("fontpage_253_198_198") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0x44,0xA0,0x54,0xA0,0xE4, - 0xA0,0x27,0xE0,0x44,0xA0,0xF4,0xA0,0x04,0xA0,0x37,0xE0,0xC4,0x20}; -const u8g_fntpgm_uint8_t fontpage_253_200_200[45] U8G_FONT_SECTION("fontpage_253_200_200") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0x54,0x40,0xEA,0x80,0x21, - 0x00,0x42,0x80,0xEC,0x60,0x01,0x00,0x30,0xC0,0xC3,0x00,0x00,0xC0}; -const u8g_fntpgm_uint8_t fontpage_253_211_211[45] U8G_FONT_SECTION("fontpage_253_211_211") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x4F,0xE0,0x51,0x00,0xE7, - 0xC0,0x20,0x00,0x47,0xC0,0xF4,0x40,0x0C,0x40,0x37,0xC0,0xC4,0x40}; -const u8g_fntpgm_uint8_t fontpage_253_217_217[45] U8G_FONT_SECTION("fontpage_253_217_217") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x42,0x80,0x54,0x40,0xE8, - 0x20,0x27,0xC0,0x40,0x00,0xF7,0xC0,0x0C,0x40,0x34,0x40,0xC7,0xC0}; -const u8g_fntpgm_uint8_t fontpage_253_223_223[45] U8G_FONT_SECTION("fontpage_253_223_223") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x42,0x00,0x54,0x40,0xEF, - 0xE0,0x22,0xA0,0x42,0x80,0xF2,0x80,0x02,0xA0,0x34,0xA0,0xC8,0xE0}; -const u8g_fntpgm_uint8_t fontpage_253_231_231[45] U8G_FONT_SECTION("fontpage_253_231_231") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x26,0xA0,0x45,0xC0,0x54,0x80,0xE7, - 0xE0,0x24,0x80,0x45,0xC0,0xF6,0xA0,0x04,0x80,0x34,0x80,0xC7,0xE0}; -const u8g_fntpgm_uint8_t fontpage_253_234_234[45] U8G_FONT_SECTION("fontpage_253_234_234") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEA,0xEA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xA0,0x49,0x40,0x57,0xE0,0xE1, - 0x00,0x23,0xE0,0x46,0x20,0xF3,0xE0,0x0A,0x20,0x33,0xE0,0xC2,0x20}; -const u8g_fntpgm_uint8_t fontpage_253_237_237[45] U8G_FONT_SECTION("fontpage_253_237_237") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xC0,0x41,0x00,0x57,0xE0,0xE4, - 0xA0,0x2A,0x80,0x44,0x80,0xEF,0xE0,0x01,0x00,0x32,0xC0,0xCC,0x20}; -const u8g_fntpgm_uint8_t fontpage_253_255_255[45] U8G_FONT_SECTION("fontpage_253_255_255") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x20,0x40,0x43,0xC0,0xF0,0x40,0x2F, - 0xE0,0x41,0x20,0xF5,0x40,0x03,0x80,0x35,0x40,0xC9,0x20,0x03,0x00}; -const u8g_fntpgm_uint8_t fontpage_254_150_150[45] U8G_FONT_SECTION("fontpage_254_150_150") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x48,0x20,0x5F,0xE0,0xE8, - 0x00,0x2F,0xE0,0x4A,0xA0,0xFF,0xE0,0x0A,0xA0,0x3A,0xA0,0xC8,0x60}; -const u8g_fntpgm_uint8_t fontpage_254_186_186[45] U8G_FONT_SECTION("fontpage_254_186_186") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x41,0x00,0x7B,0xC0,0xA1,0x40,0x21, - 0x40,0xFF,0xE0,0x21,0x00,0xA9,0x00,0xAA,0x80,0xFA,0x40,0x04,0x20}; -const u8g_fntpgm_uint8_t fontpage_254_209_209[45] U8G_FONT_SECTION("fontpage_254_209_209") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x80,0x40,0x91,0x40,0xD5,0x40,0xA2, - 0x40,0x92,0x40,0xAD,0x40,0xC5,0x40,0x88,0x40,0x80,0x40,0x81,0xC0}; -const u8g_fntpgm_uint8_t fontpage_254_238_238[45] U8G_FONT_SECTION("fontpage_254_238_238") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x4A,0x40,0x7F,0xC0,0x04,0x00,0xFF, - 0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_242_242") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x49,0x20,0x7F,0xE0,0x04,0x40,0x3F, - 0x80,0x05,0x00,0xFF,0xE0,0x30,0x80,0xDF,0x80,0x10,0x80,0x1F,0x80}; -const u8g_fntpgm_uint8_t fontpage_256_133_133[45] U8G_FONT_SECTION("fontpage_256_133_133") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x3F,0x40,0x04,0x80,0x05,0x00,0xFF, - 0xE0,0x08,0x00,0x3F,0x80,0xD0,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80}; -const u8g_fntpgm_uint8_t fontpage_256_234_234[45] U8G_FONT_SECTION("fontpage_256_234_234") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEA,0xEA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x40,0xFA,0x80,0x57,0xC0,0x54,0x40,0x74, - 0x40,0x57,0xC0,0x71,0x00,0x5A,0xA0,0xF6,0xA0,0x1A,0x40,0x11,0xC0}; -const u8g_fntpgm_uint8_t fontpage_257_253_253[45] U8G_FONT_SECTION("fontpage_257_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x49,0x40,0xFD,0x80,0x01,0x20,0x7D, - 0xE0,0x44,0x00,0x7D,0x40,0x45,0x80,0x7D,0x20,0x45,0x20,0x4D,0xE0}; -const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259_234_234") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEA,0xEA,0x00,0x0A,0xFF,0x00, - 0x00,0x07,0x0B,0x0B,0x0C,0x02,0xFF,0x20,0xFE,0x82,0x82,0xFE,0x82,0xFE,0x82,0x82, - 0xFE,0x82}; -const u8g_fntpgm_uint8_t fontpage_259_243_243[45] U8G_FONT_SECTION("fontpage_259_243_243") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x08,0x00,0x11,0x00,0x20,0x80,0x7F, - 0xC0,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_263_220_220[45] U8G_FONT_SECTION("fontpage_263_220_220") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x11,0x00,0x01,0xC0,0x7E, - 0x80,0x28,0x80,0x15,0x00,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC4,0x60}; -const u8g_fntpgm_uint8_t fontpage_265_221_221[45] U8G_FONT_SECTION("fontpage_265_221_221") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x11,0x00,0x52,0x00,0x53, - 0xC0,0x55,0x00,0x10,0x80,0x7F,0xC0,0x4A,0x40,0x4A,0x40,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_269_199_199[45] U8G_FONT_SECTION("fontpage_269_199_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0x27,0xE0,0xFC,0x20,0xAA, - 0x00,0xAA,0x40,0xFB,0x80,0x22,0x00,0x2A,0x20,0x3A,0x20,0xC9,0xE0}; -const u8g_fntpgm_uint8_t fontpage_272_204_204[45] U8G_FONT_SECTION("fontpage_272_204_204") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x40,0x00,0x80,0x00,0x10,0x00,0x2F, - 0xE0,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; -const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x80,0x20,0x80,0xFF,0xE0,0x14,0xA0,0x2C, - 0x80,0x77,0xE0,0xAD,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; -const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x9F,0xE0,0x51,0x00,0x31,0x00,0xD7, - 0xC0,0x12,0x00,0xFF,0xE0,0x0C,0x40,0x32,0x80,0xD1,0x00,0x18,0xE0}; -const u8g_fntpgm_uint8_t fontpage_275_129_129[45] U8G_FONT_SECTION("fontpage_275_129_129") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x0A,0x00,0x7F,0xC0,0x4A,0x40,0x7F, - 0xC0,0x08,0x00,0xFF,0xE0,0x11,0x00,0x3A,0x00,0x0F,0x00,0x70,0xC0}; -const u8g_fntpgm_uint8_t fontpage_275_210_210[45] U8G_FONT_SECTION("fontpage_275_210_210") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0x00,0x22,0x00,0x7F,0xC0,0xA4, - 0x40,0x3F,0xC0,0x24,0x40,0x3F,0xC0,0x24,0x40,0x45,0x40,0x80,0x80}; -const u8g_fntpgm_uint8_t fontpage_279_161_161[45] U8G_FONT_SECTION("fontpage_279_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x21,0x00,0x01,0x00,0x0F,0xE0,0xE1, - 0x00,0x21,0x00,0x21,0x00,0x29,0x00,0x31,0x00,0x21,0x00,0x01,0x00}; -const u8g_fntpgm_uint8_t fontpage_279_174_174[45] U8G_FONT_SECTION("fontpage_279_174_174") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x21,0x40,0x05,0x40,0x04,0x40,0xE4, - 0x40,0x22,0x80,0x22,0x80,0x29,0x00,0x32,0x80,0x24,0x40,0x08,0x20}; -const u8g_fntpgm_uint8_t fontpage_279_190_190[45] U8G_FONT_SECTION("fontpage_279_190_190") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0x80,0x24,0x80,0x04,0x80,0x08,0xE0,0xE0, - 0x00,0x2F,0xC0,0x24,0x40,0x22,0x80,0x31,0x00,0x22,0x80,0x1C,0x60}; -const u8g_fntpgm_uint8_t fontpage_279_213_213[45] U8G_FONT_SECTION("fontpage_279_213_213") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x40,0x21,0x20,0x1F,0xE0,0x01,0x00,0xEF, - 0x00,0x25,0x00,0x25,0x00,0x24,0xA0,0x26,0xA0,0x38,0x60,0x20,0x20}; -const u8g_fntpgm_uint8_t fontpage_279_239_239[45] U8G_FONT_SECTION("fontpage_279_239_239") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x24,0x40,0x04,0x40,0x07,0xC0,0xE0, - 0x00,0x27,0xC0,0x21,0x00,0x2F,0xE0,0x32,0x80,0x24,0x40,0x08,0x20}; -const u8g_fntpgm_uint8_t fontpage_279_247_247[45] U8G_FONT_SECTION("fontpage_279_247_247") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x2F,0xE0,0x21,0x00,0x07,0xC0,0xE1, - 0x00,0x2F,0xE0,0x24,0x40,0x27,0xC0,0x24,0x40,0x37,0xC0,0x24,0x40}; -const u8g_fntpgm_uint8_t fontpage_279_251_251[45] U8G_FONT_SECTION("fontpage_279_251_251") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x27,0xC0,0x01,0x00,0xEF,0xE0,0x22, - 0xA0,0x25,0x80,0x22,0x80,0x2F,0xE0,0x31,0x80,0x22,0x40,0x0C,0x20}; -const u8g_fntpgm_uint8_t fontpage_280_131_131[45] U8G_FONT_SECTION("fontpage_280_131_131") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x29,0x20,0x0B,0xA0,0xE9,0x20,0x2F, - 0xE0,0x28,0x20,0x2B,0xA0,0x2A,0xA0,0x3B,0xA0,0x28,0x20,0x10,0xE0}; -const u8g_fntpgm_uint8_t fontpage_282_165_165[45] U8G_FONT_SECTION("fontpage_282_165_165") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0x89,0x00,0xA9,0xE0,0xA9,0x40,0xAB, - 0x40,0xAD,0x40,0xA9,0x40,0x21,0x40,0x50,0x80,0x49,0x40,0x8A,0x20}; -const u8g_fntpgm_uint8_t fontpage_282_170_170[45] U8G_FONT_SECTION("fontpage_282_170_170") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xAA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x35,0x80,0xDF,0x60,0x01, - 0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x2A,0x80,0x11,0x00,0x60,0xC0}; -const u8g_fntpgm_uint8_t fontpage_282_247_247[45] U8G_FONT_SECTION("fontpage_282_247_247") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x13,0xC0,0x7C,0x40,0x10,0x40,0xFF, - 0xC0,0x12,0x00,0x52,0x20,0x5E,0x20,0x53,0xE0,0xB0,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_283_133_133[45] U8G_FONT_SECTION("fontpage_283_133_133") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x17,0xC0,0x11,0x40,0x7D,0x40,0x12,0xC0,0xFC, - 0x00,0x13,0xC0,0x5E,0x40,0x52,0x40,0x73,0xC0,0x98,0x00,0x87,0xE0}; -const u8g_fntpgm_uint8_t fontpage_283_221_221[45] U8G_FONT_SECTION("fontpage_283_221_221") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7B,0xE0,0x4A,0x00,0x4A,0x00,0x7B,0xE0,0x12, - 0x20,0x52,0x20,0x5A,0x20,0x53,0xE0,0x52,0x00,0x5E,0x00,0xE3,0xE0}; -const u8g_fntpgm_uint8_t fontpage_286_236_236[45] U8G_FONT_SECTION("fontpage_286_236_236") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEC,0xEC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xF7,0xC0,0x41,0x00,0x6F,0xE0,0xA2, - 0x00,0xF7,0xC0,0x20,0x40,0x3A,0x80,0xE1,0x00,0x20,0x80,0x20,0x80}; -const u8g_fntpgm_uint8_t fontpage_286_239_239[45] U8G_FONT_SECTION("fontpage_286_239_239") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x42,0x00,0xFB,0xE0,0x42,0x20,0xA5, - 0x40,0xF9,0x00,0x21,0x00,0x3A,0x80,0xE2,0x80,0x24,0x40,0x28,0x20}; -const u8g_fntpgm_uint8_t fontpage_286_244_244[45] U8G_FONT_SECTION("fontpage_286_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0xF8,0x80,0x47,0xE0,0x64,0xA0,0xA4, - 0xA0,0xFC,0xA0,0x27,0xE0,0x3C,0xA0,0xE4,0xA0,0x27,0xE0,0x24,0x20}; -const u8g_fntpgm_uint8_t fontpage_286_253_253[45] U8G_FONT_SECTION("fontpage_286_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x7D,0x40,0x11,0x20,0xFF,0xE0,0x21, - 0x00,0xFD,0x20,0x51,0x40,0x7C,0x80,0x10,0xA0,0xFD,0x60,0x12,0x20}; -const u8g_fntpgm_uint8_t fontpage_287_145_145[45] U8G_FONT_SECTION("fontpage_287_145_145") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xC0,0xFA,0x40,0x43,0xC0,0x60,0x00,0xA7, - 0xE0,0xFA,0x40,0x23,0x40,0x3A,0xC0,0xE2,0x60,0x2F,0xC0,0x20,0x40}; -const u8g_fntpgm_uint8_t fontpage_287_147_147[45] U8G_FONT_SECTION("fontpage_287_147_147") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x42,0x80,0xF4,0x40,0x4B,0xA0,0xA0, - 0x00,0xFE,0x20,0x2A,0xA0,0x3E,0xA0,0xEA,0xA0,0x2E,0xA0,0x2A,0x60}; -const u8g_fntpgm_uint8_t fontpage_287_185_185[45] U8G_FONT_SECTION("fontpage_287_185_185") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x21,0x00,0x2F,0xE0,0x01,0x20,0xE1, - 0x20,0x21,0x20,0x22,0x20,0x24,0x20,0x28,0xC0,0x50,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_287_193_193[45] U8G_FONT_SECTION("fontpage_287_193_193") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0xC0,0x27,0x00,0x21,0x00,0x01,0x00,0xEF, - 0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x50,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_287_208_209[73] U8G_FONT_SECTION("fontpage_287_208_209") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x20,0x00,0x20,0x00,0x0F,0xE0,0xE2, - 0x00,0x22,0x80,0x24,0x40,0x2F,0xA0,0x24,0x20,0x50,0x00,0x8F,0xE0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x40,0xC0,0x27,0x00,0x24,0x00,0x07,0xE0,0xE4,0x80,0x24,0x80,0x24, - 0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xE0,0xE6, - 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_287_216_216[45] U8G_FONT_SECTION("fontpage_287_216_216") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x20,0x80,0x21,0x00,0x01,0x00,0xE3, - 0x40,0x25,0x20,0x29,0x20,0x21,0x00,0x21,0x00,0x50,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_287_219_219[45] U8G_FONT_SECTION("fontpage_287_219_219") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x80,0x24,0x80,0x2F,0xC0,0x04,0x80,0xE4, - 0x80,0x3F,0xE0,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x80,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_287_222_222[45] U8G_FONT_SECTION("fontpage_287_222_222") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x2F,0xE0,0x22,0x00,0x05,0x00,0xEF, - 0xC0,0x21,0x00,0x2F,0xE0,0x21,0x00,0x21,0x00,0x51,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_287_247_247[45] U8G_FONT_SECTION("fontpage_287_247_247") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x29,0x20,0x25,0x40,0x01,0x00,0xEF, - 0xE0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_128_128[45] U8G_FONT_SECTION("fontpage_288_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x8F,0xC0,0x48,0x40,0x4F,0xC0,0x08,0x40,0xCF, - 0xC0,0x48,0x00,0x4B,0x40,0x48,0x80,0x4E,0x40,0xB0,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_137_137[45] U8G_FONT_SECTION("fontpage_288_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x45,0x00,0x25,0x00,0x27,0xC0,0x09,0x00,0xEF, - 0xE0,0x22,0x80,0x22,0xA0,0x24,0xA0,0x28,0x60,0x50,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_159_159") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x3F,0xE0,0x21,0x00,0x0F,0xE0,0xE9, - 0x20,0x2F,0xE0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xE0,0xFF,0x20,0x45,0x20,0x29,0x40,0xFF, - 0x80,0x01,0x40,0x7D,0x20,0x45,0x20,0x45,0xA0,0x7D,0x40,0x45,0x00}; -const u8g_fntpgm_uint8_t fontpage_290_205_205[45] U8G_FONT_SECTION("fontpage_290_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x50,0x20,0x50,0x20,0xF8,0x20,0xAB, - 0xE0,0xDA,0x00,0x8A,0x00,0xFA,0x00,0x8A,0x20,0xFA,0x20,0x8B,0xE0}; -const u8g_fntpgm_uint8_t fontpage_291_202_202[45] U8G_FONT_SECTION("fontpage_291_202_202") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0xC0,0xE2,0x80,0xA9,0x00,0x72,0x80,0xFD, - 0x60,0x31,0x00,0x6F,0xC0,0xA1,0x00,0xAF,0xE0,0x21,0x00,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x24,0x80,0x3F, - 0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_207_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, - 0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_297_136_136[45] U8G_FONT_SECTION("fontpage_297_136_136") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x80,0x40,0x80,0x78,0x80,0x80,0x80,0xFB, - 0xE0,0x20,0x80,0xF8,0x80,0x20,0x80,0x28,0x80,0x30,0x80,0x20,0x80}; -const u8g_fntpgm_uint8_t fontpage_297_174_174[45] U8G_FONT_SECTION("fontpage_297_174_174") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x47,0xC0,0x79,0x40,0x81,0x40,0xF9, - 0x40,0x27,0xC0,0xFA,0x40,0x22,0x40,0x2A,0x40,0x32,0x40,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_298_153_153[45] U8G_FONT_SECTION("fontpage_298_153_153") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x80,0x4F,0xE0,0x72,0x80,0x82,0x80,0xEF, - 0xE0,0x40,0x00,0xF7,0xC0,0x44,0x40,0x47,0xC0,0x54,0x40,0x67,0xC0}; -const u8g_fntpgm_uint8_t fontpage_298_220_220[45] U8G_FONT_SECTION("fontpage_298_220_220") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x4F,0xE0,0x72,0x80,0x8F,0xE0,0xF4, - 0x40,0x27,0xC0,0xF4,0x40,0x27,0xC0,0x2A,0x80,0x32,0xA0,0x2C,0x60}; -const u8g_fntpgm_uint8_t fontpage_298_255_255[45] U8G_FONT_SECTION("fontpage_298_255_255") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x21,0x00,0x22,0x00,0x24,0x00,0x28,0x00,0x30, - 0x00,0xFF,0xC0,0x28,0x00,0x24,0x00,0x22,0x00,0x29,0x00,0x30,0xC0}; -const u8g_fntpgm_uint8_t fontpage_299_237_237[45] U8G_FONT_SECTION("fontpage_299_237_237") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xE0,0x20,0x20,0x82,0x20,0x82,0x20,0xBF, - 0xA0,0x86,0x20,0x8A,0x20,0x92,0x20,0xA2,0x20,0x86,0x20,0x80,0xE0}; -const u8g_fntpgm_uint8_t fontpage_299_242_242[45] U8G_FONT_SECTION("fontpage_299_242_242") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x20,0x20,0x84,0x20,0x84,0x20,0xBF, - 0xA0,0x84,0x20,0x8E,0x20,0x95,0x20,0xA4,0xA0,0x84,0x20,0x80,0xE0}; -const u8g_fntpgm_uint8_t fontpage_299_244_244[45] U8G_FONT_SECTION("fontpage_299_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x4F,0xC0,0x20,0x40,0x80,0x40,0x9E,0x40,0x92, - 0x40,0x9E,0x40,0x92,0x40,0x92,0x40,0x9E,0x40,0x80,0x40,0x81,0xC0}; -const u8g_fntpgm_uint8_t fontpage_300_136_136[45] U8G_FONT_SECTION("fontpage_300_136_136") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xE0,0x11,0x20,0x82,0xA0,0xBF,0xE0,0x82, - 0x20,0xBA,0xA0,0xAA,0xA0,0xB9,0x20,0x81,0x20,0xBA,0xA0,0x84,0x60}; -const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF2,0x00,0x93,0xE0,0xA6,0x40,0xC1,0x80,0xA6, - 0x60,0x91,0x00,0x97,0xE0,0xD5,0x00,0xAF,0xE0,0x81,0x00,0x81,0x00}; -const u8g_fntpgm_uint8_t fontpage_300_208_208[45] U8G_FONT_SECTION("fontpage_300_208_208") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF7,0xC0,0x94,0x40,0xA7,0xC0,0xC4,0x40,0xA7, - 0xC0,0x95,0x00,0x95,0x20,0xD5,0x40,0xA4,0x80,0x85,0x40,0x86,0x20}; -const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE4,0xE4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF1,0x00,0x92,0x80,0xA4,0x40,0xCB,0xA0,0xA1, - 0x00,0x9F,0xE0,0x91,0x00,0xE5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; -const u8g_fntpgm_uint8_t fontpage_300_233_233[45] U8G_FONT_SECTION("fontpage_300_233_233") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF1,0x00,0x92,0x80,0xA4,0x40,0xC8,0x20,0xA7, - 0xC0,0x90,0x00,0x9A,0x40,0xD5,0x40,0xA5,0x40,0x80,0x80,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_301_246_246[45] U8G_FONT_SECTION("fontpage_301_246_246") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x95,0x20,0x0E, - 0x00,0x31,0x80,0xC4,0x60,0x3F,0x80,0x01,0x00,0x0E,0x00,0x03,0x00}; -const u8g_fntpgm_uint8_t fontpage_302_128_128[45] U8G_FONT_SECTION("fontpage_302_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0xB5,0xA0,0x04, - 0x00,0xFF,0xE0,0x08,0x00,0x7F,0xC0,0x4A,0x40,0x4A,0x40,0x4A,0xC0}; -const u8g_fntpgm_uint8_t fontpage_302_210_210[45] U8G_FONT_SECTION("fontpage_302_210_210") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04, - 0x00,0xFF,0xE0,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80}; -const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_222_222") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0x0A, - 0x00,0x7B,0xC0,0x0A,0x00,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0x0A,0x00}; -const u8g_fntpgm_uint8_t fontpage_302_224_224[45] U8G_FONT_SECTION("fontpage_302_224_224") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x3F,0xC0,0x44,0x00,0xFF,0xE0,0x20, - 0x80,0x3F,0x80,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0xFB,0xE0,0x0A,0x00}; -const u8g_fntpgm_uint8_t fontpage_302_226_226[45] U8G_FONT_SECTION("fontpage_302_226_226") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x08,0x00,0x10,0x00,0xFF,0xC0,0x92, - 0x40,0x9E,0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0xFF,0xC0,0x80,0x40}; -const u8g_fntpgm_uint8_t fontpage_304_245_245[45] U8G_FONT_SECTION("fontpage_304_245_245") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF5,0xF5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x20,0x80,0x24, - 0x80,0x24,0x80,0x24,0x80,0x26,0x80,0x09,0x00,0x10,0xC0,0x60,0x40}; -const u8g_fntpgm_uint8_t fontpage_304_249_249[45] U8G_FONT_SECTION("fontpage_304_249_249") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF9,0x00,0x27,0xE0,0x24,0x20,0x25, - 0x20,0x25,0x20,0x25,0x20,0x3D,0x20,0xC1,0x80,0x02,0x40,0x0C,0x20}; -const u8g_fntpgm_uint8_t fontpage_305_132_132[45] U8G_FONT_SECTION("fontpage_305_132_132") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x10,0x80,0x63,0xE0,0x22,0x20,0xFA, - 0xA0,0x2A,0xA0,0x22,0xA0,0x22,0xA0,0x22,0xA0,0x21,0x40,0x66,0x20}; -const u8g_fntpgm_uint8_t fontpage_305_145_145[45] U8G_FONT_SECTION("fontpage_305_145_145") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x13,0xE0,0x50,0x80,0x5F,0xE0,0x52,0x20,0xFE, - 0xA0,0x12,0xA0,0x56,0xA0,0x5A,0xA0,0x92,0xA0,0x21,0x40,0xC6,0x20}; -const u8g_fntpgm_uint8_t fontpage_305_157_157[45] U8G_FONT_SECTION("fontpage_305_157_157") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xE0,0xFC,0x80,0x87,0xE0,0x7A,0x20,0xCA, - 0xA0,0x32,0xA0,0x4A,0xA0,0xFE,0xA0,0x4A,0xA0,0x79,0x40,0x4E,0x20}; -const u8g_fntpgm_uint8_t fontpage_305_206_206[45] U8G_FONT_SECTION("fontpage_305_206_206") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0x80,0x40,0x80,0x42,0x80,0x52,0x80,0x4C, - 0x80,0x44,0x80,0x4C,0x80,0x52,0x80,0x62,0xA0,0x80,0x60,0x80,0x20}; -const u8g_fntpgm_uint8_t fontpage_306_241_241[45] U8G_FONT_SECTION("fontpage_306_241_241") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x00,0x47,0xC0,0x7C,0x40,0x97,0x40,0xAD, - 0x40,0x25,0x40,0x27,0x40,0x24,0xC0,0x2C,0x20,0x34,0x20,0x23,0xE0}; -const u8g_fntpgm_uint8_t fontpage_308_236_236[45] U8G_FONT_SECTION("fontpage_308_236_236") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEC,0xEC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0x80,0x00,0x80,0x10,0x80,0x11,0x00,0x21, - 0x00,0x3F,0xE0,0x00,0x20,0x00,0x20,0xFF,0x20,0x00,0x20,0x00,0xC0}; -const u8g_fntpgm_uint8_t fontpage_308_241_241[45] U8G_FONT_SECTION("fontpage_308_241_241") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF3,0xE0,0x12,0x00,0x52,0x20,0x53,0x20,0x52, - 0xA0,0x7A,0x40,0x0A,0x40,0xEA,0xA0,0x0B,0x20,0x0A,0x00,0x33,0xE0}; -const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x1F,0x00,0x11, - 0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x40,0xC0}; -const u8g_fntpgm_uint8_t fontpage_317_196_196[45] U8G_FONT_SECTION("fontpage_317_196_196") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x04, - 0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x60,0xC0}; -const u8g_fntpgm_uint8_t fontpage_317_222_222[45] U8G_FONT_SECTION("fontpage_317_222_222") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF8,0x80,0xA8,0x80,0xF8,0xE0,0xA8,0x80,0xF8, - 0x80,0x23,0xE0,0xFA,0x20,0x22,0x20,0xFA,0x20,0x52,0x20,0xAB,0xE0}; -const u8g_fntpgm_uint8_t fontpage_318_208_208[45] U8G_FONT_SECTION("fontpage_318_208_208") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x10,0x80,0x09,0x00,0x06, - 0x00,0x19,0x80,0xE0,0x60,0x09,0x00,0x09,0x00,0x11,0x00,0x61,0x00}; -const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510_154_154") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x08,0x00,0x00, - 0x00,0x02,0x07,0x07,0x0C,0x06,0x01,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(64, 157, 157, fontpage_64_157_157), // '”' -- '”' - FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿' - FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一' - FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下' - FONTDATA_ITEM(156, 141, 141, fontpage_156_141_141), // '不' -- '不' - FONTDATA_ITEM(156, 147, 147, fontpage_156_147_147), // '专' -- '专' - FONTDATA_ITEM(156, 157, 157, fontpage_156_157_157), // '丝' -- '丝' - FONTDATA_ITEM(156, 170, 170, fontpage_156_170_170), // '个' -- '个' - FONTDATA_ITEM(156, 173, 173, fontpage_156_173_173), // '中' -- '中' - FONTDATA_ITEM(156, 186, 187, fontpage_156_186_187), // '为' -- '主' - FONTDATA_ITEM(156, 201, 201, fontpage_156_201_201), // '义' -- '义' - FONTDATA_ITEM(156, 203, 203, fontpage_156_203_203), // '之' -- '之' - FONTDATA_ITEM(157, 134, 134, fontpage_157_134_134), // '了' -- '了' - FONTDATA_ITEM(157, 140, 140, fontpage_157_140_140), // '二' -- '二' - FONTDATA_ITEM(157, 142, 142, fontpage_157_142_142), // '于' -- '于' - FONTDATA_ITEM(157, 164, 164, fontpage_157_164_164), // '交' -- '交' - FONTDATA_ITEM(157, 174, 174, fontpage_157_174_174), // '亮' -- '亮' - FONTDATA_ITEM(157, 206, 206, fontpage_157_206_206), // '从' -- '从' - FONTDATA_ITEM(157, 228, 229, fontpage_157_228_229), // '令' -- '以' - FONTDATA_ITEM(157, 246, 246, fontpage_157_246_246), // '件' -- '件' - FONTDATA_ITEM(157, 253, 253, fontpage_157_253_253), // '份' -- '份' - FONTDATA_ITEM(158, 145, 145, fontpage_158_145_145), // '休' -- '休' - FONTDATA_ITEM(158, 160, 160, fontpage_158_160_160), // '传' -- '传' - FONTDATA_ITEM(158, 205, 206, fontpage_158_205_206), // '位' -- '低' - FONTDATA_ITEM(158, 211, 211, fontpage_158_211_211), // '体' -- '体' - FONTDATA_ITEM(158, 217, 217, fontpage_158_217_217), // '余' -- '余' - FONTDATA_ITEM(158, 220, 220, fontpage_158_220_220), // '作' -- '作' - FONTDATA_ITEM(158, 255, 255, fontpage_158_255_255), // '使' -- '使' - FONTDATA_ITEM(159, 155, 155, fontpage_159_155_155), // '供' -- '供' - FONTDATA_ITEM(159, 181, 181, fontpage_159_181_181), // '侵' -- '侵' - FONTDATA_ITEM(159, 221, 221, fontpage_159_221_221), // '保' -- '保' - FONTDATA_ITEM(159, 225, 225, fontpage_159_225_225), // '信' -- '信' - FONTDATA_ITEM(160, 188, 188, fontpage_160_188_188), // '值' -- '值' - FONTDATA_ITEM(160, 190, 190, fontpage_160_190_190), // '倾' -- '倾' - FONTDATA_ITEM(160, 207, 207, fontpage_160_207_207), // '偏' -- '偏' - FONTDATA_ITEM(160, 220, 220, fontpage_160_220_220), // '停' -- '停' - FONTDATA_ITEM(161, 168, 168, fontpage_161_168_168), // '储' -- '储' - FONTDATA_ITEM(161, 207, 207, fontpage_161_207_207), // '像' -- '像' - FONTDATA_ITEM(162, 197, 197, fontpage_162_197_197), // '充' -- '充' - FONTDATA_ITEM(162, 200, 201, fontpage_162_200_201), // '先' -- '光' - FONTDATA_ITEM(162, 229, 229, fontpage_162_229_229), // '入' -- '入' - FONTDATA_ITEM(162, 232, 232, fontpage_162_232_232), // '全' -- '全' - FONTDATA_ITEM(162, 241, 241, fontpage_162_241_241), // '共' -- '共' - FONTDATA_ITEM(162, 243, 243, fontpage_162_243_243), // '关' -- '关' - FONTDATA_ITEM(162, 247, 247, fontpage_162_247_247), // '具' -- '具' - FONTDATA_ITEM(163, 151, 151, fontpage_163_151_151), // '冗' -- '冗' - FONTDATA_ITEM(163, 183, 183, fontpage_163_183_183), // '冷' -- '冷' - FONTDATA_ITEM(163, 198, 198, fontpage_163_198_198), // '准' -- '准' - FONTDATA_ITEM(163, 250, 251, fontpage_163_250_251), // '出' -- '击' - FONTDATA_ITEM(164, 134, 135, fontpage_164_134_135), // '分' -- '切' - FONTDATA_ITEM(164, 155, 155, fontpage_164_155_155), // '创' -- '创' - FONTDATA_ITEM(164, 157, 157, fontpage_164_157_157), // '初' -- '初' - FONTDATA_ITEM(164, 171, 171, fontpage_164_171_171), // '别' -- '别' - FONTDATA_ITEM(164, 176, 176, fontpage_164_176_176), // '到' -- '到' - FONTDATA_ITEM(164, 182, 183, fontpage_164_182_183), // '制' -- '刷' - FONTDATA_ITEM(164, 242, 242, fontpage_164_242_242), // '割' -- '割' - FONTDATA_ITEM(165, 155, 155, fontpage_165_155_155), // '力' -- '力' - FONTDATA_ITEM(165, 159, 160, fontpage_165_159_160), // '功' -- '加' - FONTDATA_ITEM(165, 168, 168, fontpage_165_168_168), // '动' -- '动' - FONTDATA_ITEM(166, 150, 150, fontpage_166_150_150), // '化' -- '化' - FONTDATA_ITEM(166, 199, 199, fontpage_166_199_199), // '升' -- '升' - FONTDATA_ITEM(166, 202, 202, fontpage_166_202_202), // '半' -- '半' - FONTDATA_ITEM(166, 207, 207, fontpage_166_207_207), // '协' -- '协' - FONTDATA_ITEM(166, 213, 213, fontpage_166_213_213), // '单' -- '单' - FONTDATA_ITEM(166, 225, 225, fontpage_166_225_225), // '卡' -- '卡' - FONTDATA_ITEM(166, 240, 241, fontpage_166_240_241), // '印' -- '危' - FONTDATA_ITEM(166, 244, 244, fontpage_166_244_244), // '却' -- '却' - FONTDATA_ITEM(166, 248, 248, fontpage_166_248_248), // '卸' -- '卸' - FONTDATA_ITEM(167, 139, 139, fontpage_167_139_139), // '压' -- '压' - FONTDATA_ITEM(167, 159, 159, fontpage_167_159_159), // '原' -- '原' - FONTDATA_ITEM(167, 204, 205, fontpage_167_204_205), // '双' -- '反' - FONTDATA_ITEM(167, 214, 214, fontpage_167_214_214), // '取' -- '取' - FONTDATA_ITEM(167, 216, 216, fontpage_167_216_216), // '变' -- '变' - FONTDATA_ITEM(167, 240, 240, fontpage_167_240_240), // '台' -- '台' - FONTDATA_ITEM(168, 131, 131, fontpage_168_131_131), // '吃' -- '吃' - FONTDATA_ITEM(168, 136, 136, fontpage_168_136_136), // '合' -- '合' - FONTDATA_ITEM(168, 141, 142, fontpage_168_141_142), // '名' -- '后' - FONTDATA_ITEM(168, 145, 145, fontpage_168_145_145), // '向' -- '向' - FONTDATA_ITEM(168, 166, 166, fontpage_168_166_166), // '否' -- '否' - FONTDATA_ITEM(168, 175, 175, fontpage_168_175_175), // '启' -- '启' - FONTDATA_ITEM(168, 202, 202, fontpage_168_202_202), // '告' -- '告' - FONTDATA_ITEM(168, 232, 232, fontpage_168_232_232), // '周' -- '周' - FONTDATA_ITEM(168, 253, 253, fontpage_168_253_253), // '命' -- '命' - FONTDATA_ITEM(169, 140, 140, fontpage_169_140_140), // '和' -- '和' - FONTDATA_ITEM(169, 205, 205, fontpage_169_205_205), // '响' -- '响' - FONTDATA_ITEM(171, 183, 183, fontpage_171_183_183), // '喷' -- '喷' - FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴' - FONTDATA_ITEM(172, 232, 232, fontpage_172_232_232), // '器' -- '器' - FONTDATA_ITEM(172, 244, 244, fontpage_172_244_244), // '噴' -- '噴' - FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回' - FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // '因' -- '因' - FONTDATA_ITEM(173, 250, 250, fontpage_173_250_250), // '固' -- '固' - FONTDATA_ITEM(173, 254, 254, fontpage_173_254_254), // '图' -- '图' - FONTDATA_ITEM(174, 168, 168, fontpage_174_168_168), // '在' -- '在' - FONTDATA_ITEM(174, 207, 207, fontpage_174_207_207), // '坏' -- '坏' - FONTDATA_ITEM(174, 215, 215, fontpage_174_215_215), // '块' -- '块' - FONTDATA_ITEM(175, 139, 139, fontpage_175_139_139), // '型' -- '型' - FONTDATA_ITEM(175, 171, 171, fontpage_175_171_171), // '垫' -- '垫' - FONTDATA_ITEM(176, 235, 235, fontpage_176_235_235), // '填' -- '填' - FONTDATA_ITEM(177, 243, 243, fontpage_177_243_243), // '壳' -- '壳' - FONTDATA_ITEM(178, 135, 135, fontpage_178_135_135), // '备' -- '备' - FONTDATA_ITEM(178, 141, 141, fontpage_178_141_141), // '复' -- '复' - FONTDATA_ITEM(178, 150, 150, fontpage_178_150_150), // '外' -- '外' - FONTDATA_ITEM(178, 154, 154, fontpage_178_154_154), // '多' -- '多' - FONTDATA_ITEM(178, 167, 167, fontpage_178_167_167), // '大' -- '大' - FONTDATA_ITEM(178, 169, 170, fontpage_178_169_170), // '天' -- '太' - FONTDATA_ITEM(178, 177, 177, fontpage_178_177_177), // '失' -- '失' - FONTDATA_ITEM(178, 180, 180, fontpage_178_180_180), // '头' -- '头' - FONTDATA_ITEM(178, 253, 253, fontpage_178_253_253), // '好' -- '好' - FONTDATA_ITEM(179, 203, 203, fontpage_179_203_203), // '始' -- '始' - FONTDATA_ITEM(182, 208, 208, fontpage_182_208_208), // '子' -- '子' - FONTDATA_ITEM(182, 216, 216, fontpage_182_216_216), // '存' -- '存' - FONTDATA_ITEM(183, 137, 137, fontpage_183_137_137), // '安' -- '安' - FONTDATA_ITEM(183, 140, 140, fontpage_183_140_140), // '完' -- '完' - FONTDATA_ITEM(183, 154, 154, fontpage_183_154_154), // '定' -- '定' - FONTDATA_ITEM(183, 162, 162, fontpage_183_162_162), // '客' -- '客' - FONTDATA_ITEM(183, 171, 171, fontpage_183_171_171), // '宫' -- '宫' - FONTDATA_ITEM(183, 249, 249, fontpage_183_249_249), // '对' -- '对' - FONTDATA_ITEM(184, 134, 134, fontpage_184_134_134), // '将' -- '将' - FONTDATA_ITEM(184, 143, 143, fontpage_184_143_143), // '小' -- '小' - FONTDATA_ITEM(184, 177, 177, fontpage_184_177_177), // '就' -- '就' - FONTDATA_ITEM(184, 207, 207, fontpage_184_207_207), // '屏' -- '屏' - FONTDATA_ITEM(187, 229, 229, fontpage_187_229_229), // '工' -- '工' - FONTDATA_ITEM(187, 238, 238, fontpage_187_238_238), // '差' -- '差' - FONTDATA_ITEM(187, 242, 242, fontpage_187_242_242), // '已' -- '已' - FONTDATA_ITEM(188, 243, 243, fontpage_188_243_243), // '平' -- '平' - FONTDATA_ITEM(188, 246, 246, fontpage_188_246_246), // '并' -- '并' - FONTDATA_ITEM(189, 138, 138, fontpage_189_138_138), // '床' -- '床' - FONTDATA_ITEM(189, 148, 148, fontpage_189_148_148), // '应' -- '应' - FONTDATA_ITEM(189, 159, 159, fontpage_189_159_159), // '废' -- '废' - FONTDATA_ITEM(189, 166, 166, fontpage_189_166_166), // '度' -- '度' - FONTDATA_ITEM(190, 128, 128, fontpage_190_128_128), // '开' -- '开' - FONTDATA_ITEM(190, 131, 131, fontpage_190_131_131), // '弃' -- '弃' - FONTDATA_ITEM(190, 143, 143, fontpage_190_143_143), // '式' -- '式' - FONTDATA_ITEM(190, 149, 149, fontpage_190_149_149), // '引' -- '引' - FONTDATA_ITEM(190, 185, 185, fontpage_190_185_185), // '弹' -- '弹' - FONTDATA_ITEM(190, 210, 210, fontpage_190_210_210), // '归' -- '归' - FONTDATA_ITEM(191, 132, 133, fontpage_191_132_133), // '径' -- '待' - FONTDATA_ITEM(191, 170, 170, fontpage_191_170_170), // '循' -- '循' - FONTDATA_ITEM(191, 174, 174, fontpage_191_174_174), // '微' -- '微' - FONTDATA_ITEM(191, 195, 195, fontpage_191_195_195), // '心' -- '心' - FONTDATA_ITEM(191, 253, 253, fontpage_191_253_253), // '忽' -- '忽' - FONTDATA_ITEM(192, 167, 167, fontpage_192_167_167), // '性' -- '性' - FONTDATA_ITEM(192, 187, 187, fontpage_192_187_187), // '总' -- '总' - FONTDATA_ITEM(192, 226, 226, fontpage_192_226_226), // '恢' -- '恢' - FONTDATA_ITEM(192, 239, 239, fontpage_192_239_239), // '息' -- '息' - FONTDATA_ITEM(194, 159, 159, fontpage_194_159_159), // '感' -- '感' - FONTDATA_ITEM(196, 143, 144, fontpage_196_143_144), // '戏' -- '成' - FONTDATA_ITEM(196, 183, 183, fontpage_196_183_183), // '户' -- '户' - FONTDATA_ITEM(196, 192, 192, fontpage_196_192_192), // '所' -- '所' - FONTDATA_ITEM(196, 199, 199, fontpage_196_199_199), // '扇' -- '扇' - FONTDATA_ITEM(196, 203, 203, fontpage_196_203_203), // '手' -- '手' - FONTDATA_ITEM(196, 211, 211, fontpage_196_211_211), // '打' -- '打' - FONTDATA_ITEM(196, 231, 231, fontpage_196_231_231), // '执' -- '执' - FONTDATA_ITEM(196, 249, 249, fontpage_196_249_249), // '批' -- '批' - FONTDATA_ITEM(197, 150, 150, fontpage_197_150_150), // '抖' -- '抖' - FONTDATA_ITEM(197, 165, 165, fontpage_197_165_165), // '报' -- '报' - FONTDATA_ITEM(197, 172, 172, fontpage_197_172_172), // '抬' -- '抬' - FONTDATA_ITEM(197, 189, 189, fontpage_197_189_189), // '抽' -- '抽' - FONTDATA_ITEM(197, 212, 212, fontpage_197_212_212), // '拔' -- '拔' - FONTDATA_ITEM(197, 233, 233, fontpage_197_233_233), // '择' -- '择' - FONTDATA_ITEM(198, 137, 137, fontpage_198_137_137), // '按' -- '按' - FONTDATA_ITEM(198, 161, 161, fontpage_198_161_161), // '挡' -- '挡' - FONTDATA_ITEM(198, 164, 164, fontpage_198_164_164), // '挤' -- '挤' - FONTDATA_ITEM(198, 223, 223, fontpage_198_223_223), // '损' -- '损' - FONTDATA_ITEM(198, 226, 226, fontpage_198_226_226), // '换' -- '换' - FONTDATA_ITEM(199, 137, 137, fontpage_199_137_137), // '掉' -- '掉' - FONTDATA_ITEM(199, 162, 162, fontpage_199_162_162), // '探' -- '探' - FONTDATA_ITEM(199, 165, 165, fontpage_199_165_165), // '接' -- '接' - FONTDATA_ITEM(199, 167, 167, fontpage_199_167_167), // '控' -- '控' - FONTDATA_ITEM(199, 208, 208, fontpage_199_208_208), // '提' -- '提' - FONTDATA_ITEM(199, 210, 210, fontpage_199_210_210), // '插' -- '插' - FONTDATA_ITEM(202, 182, 182, fontpage_202_182_182), // '收' -- '收' - FONTDATA_ITEM(202, 190, 190, fontpage_202_190_190), // '放' -- '放' - FONTDATA_ITEM(202, 240, 240, fontpage_202_240_240), // '数' -- '数' - FONTDATA_ITEM(202, 242, 242, fontpage_202_242_242), // '敲' -- '敲' - FONTDATA_ITEM(202, 244, 244, fontpage_202_244_244), // '整' -- '整' - FONTDATA_ITEM(203, 135, 135, fontpage_203_135_135), // '文' -- '文' - FONTDATA_ITEM(203, 153, 153, fontpage_203_153_153), // '料' -- '料' - FONTDATA_ITEM(203, 156, 156, fontpage_203_156_156), // '斜' -- '斜' - FONTDATA_ITEM(203, 173, 173, fontpage_203_173_173), // '断' -- '断' - FONTDATA_ITEM(203, 176, 176, fontpage_203_176_176), // '新' -- '新' - FONTDATA_ITEM(203, 185, 185, fontpage_203_185_185), // '方' -- '方' - FONTDATA_ITEM(203, 224, 224, fontpage_203_224_224), // '无' -- '无' - FONTDATA_ITEM(203, 246, 246, fontpage_203_246_246), // '时' -- '时' - FONTDATA_ITEM(204, 142, 142, fontpage_204_142_142), // '明' -- '明' - FONTDATA_ITEM(204, 175, 175, fontpage_204_175_175), // '是' -- '是' - FONTDATA_ITEM(205, 130, 130, fontpage_205_130_130), // '暂' -- '暂' - FONTDATA_ITEM(205, 171, 171, fontpage_205_171_171), // '暫' -- '暫' - FONTDATA_ITEM(205, 244, 244, fontpage_205_244_244), // '更' -- '更' - FONTDATA_ITEM(206, 128, 128, fontpage_206_128_128), // '最' -- '最' - FONTDATA_ITEM(206, 137, 137, fontpage_206_137_137), // '有' -- '有' - FONTDATA_ITEM(206, 159, 159, fontpage_206_159_159), // '期' -- '期' - FONTDATA_ITEM(206, 186, 186, fontpage_206_186_186), // '机' -- '机' - FONTDATA_ITEM(206, 192, 192, fontpage_206_192_192), // '杀' -- '杀' - FONTDATA_ITEM(206, 223, 223, fontpage_206_223_223), // '束' -- '束' - FONTDATA_ITEM(206, 225, 225, fontpage_206_225_225), // '条' -- '条' - FONTDATA_ITEM(206, 229, 229, fontpage_206_229_229), // '来' -- '来' - FONTDATA_ITEM(206, 255, 255, fontpage_206_255_255), // '板' -- '板' - FONTDATA_ITEM(207, 151, 151, fontpage_207_151_151), // '林' -- '林' - FONTDATA_ITEM(207, 241, 241, fontpage_207_241_241), // '柱' -- '柱' - FONTDATA_ITEM(208, 161, 161, fontpage_208_161_161), // '校' -- '校' - FONTDATA_ITEM(208, 188, 188, fontpage_208_188_188), // '格' -- '格' - FONTDATA_ITEM(209, 175, 175, fontpage_209_175_175), // '梯' -- '梯' - FONTDATA_ITEM(209, 192, 192, fontpage_209_192_192), // '检' -- '检' - FONTDATA_ITEM(211, 253, 253, fontpage_211_253_253), // '槽' -- '槽' - FONTDATA_ITEM(212, 161, 161, fontpage_212_161_161), // '模' -- '模' - FONTDATA_ITEM(212, 217, 217, fontpage_212_217_217), // '橙' -- '橙' - FONTDATA_ITEM(214, 226, 227, fontpage_214_226_227), // '止' -- '正' - FONTDATA_ITEM(214, 229, 229, fontpage_214_229_229), // '步' -- '步' - FONTDATA_ITEM(215, 212, 212, fontpage_215_212_212), // '比' -- '比' - FONTDATA_ITEM(217, 161, 161, fontpage_217_161_161), // '没' -- '没' - FONTDATA_ITEM(217, 226, 226, fontpage_217_226_226), // '波' -- '波' - FONTDATA_ITEM(217, 232, 232, fontpage_217_232_232), // '注' -- '注' - FONTDATA_ITEM(218, 151, 151, fontpage_218_151_151), // '洗' -- '洗' - FONTDATA_ITEM(218, 187, 187, fontpage_218_187_187), // '活' -- '活' - FONTDATA_ITEM(218, 193, 193, fontpage_218_193_193), // '流' -- '流' - FONTDATA_ITEM(218, 203, 203, fontpage_218_203_203), // '测' -- '测' - FONTDATA_ITEM(219, 136, 136, fontpage_219_136_136), // '消' -- '消' - FONTDATA_ITEM(219, 225, 225, fontpage_219_225_225), // '淡' -- '淡' - FONTDATA_ITEM(219, 247, 247, fontpage_219_247_247), // '混' -- '混' - FONTDATA_ITEM(220, 133, 133, fontpage_220_133_133), // '清' -- '清' - FONTDATA_ITEM(220, 169, 169, fontpage_220_169_169), // '温' -- '温' - FONTDATA_ITEM(220, 184, 184, fontpage_220_184_184), // '游' -- '游' - FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // '源' -- '源' - FONTDATA_ITEM(221, 162, 162, fontpage_221_162_162), // '溢' -- '溢' - FONTDATA_ITEM(221, 209, 209, fontpage_221_209_209), // '滑' -- '滑' - FONTDATA_ITEM(222, 143, 143, fontpage_222_143_143), // '漏' -- '漏' - FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // '激' -- '激' - FONTDATA_ITEM(224, 239, 239, fontpage_224_239_239), // '灯' -- '灯' - FONTDATA_ITEM(225, 185, 185, fontpage_225_185_185), // '点' -- '点' - FONTDATA_ITEM(225, 237, 237, fontpage_225_237_237), // '热' -- '热' - FONTDATA_ITEM(228, 199, 199, fontpage_228_199_199), // '片' -- '片' - FONTDATA_ITEM(228, 233, 233, fontpage_228_233_233), // '物' -- '物' - FONTDATA_ITEM(228, 249, 249, fontpage_228_249_249), // '特' -- '特' - FONTDATA_ITEM(231, 135, 135, fontpage_231_135_135), // '率' -- '率' - FONTDATA_ITEM(231, 175, 175, fontpage_231_175_175), // '环' -- '环' - FONTDATA_ITEM(234, 168, 168, fontpage_234_168_168), // '用' -- '用' - FONTDATA_ITEM(234, 181, 181, fontpage_234_181_181), // '电' -- '电' - FONTDATA_ITEM(234, 229, 229, fontpage_234_229_229), // '略' -- '略' - FONTDATA_ITEM(236, 253, 253, fontpage_236_253_253), // '白' -- '白' - FONTDATA_ITEM(237, 132, 132, fontpage_237_132_132), // '的' -- '的' - FONTDATA_ITEM(237, 209, 209, fontpage_237_209_209), // '监' -- '监' - FONTDATA_ITEM(237, 244, 244, fontpage_237_244_244), // '直' -- '直' - FONTDATA_ITEM(238, 129, 129, fontpage_238_129_129), // '省' -- '省' - FONTDATA_ITEM(238, 160, 160, fontpage_238_160_160), // '眠' -- '眠' - FONTDATA_ITEM(240, 238, 238, fontpage_240_238_238), // '确' -- '确' - FONTDATA_ITEM(243, 187, 187, fontpage_243_187_187), // '离' -- '离' - FONTDATA_ITEM(243, 251, 251, fontpage_243_251_251), // '移' -- '移' - FONTDATA_ITEM(244, 250, 250, fontpage_244_250_250), // '空' -- '空' - FONTDATA_ITEM(245, 239, 239, fontpage_245_239_239), // '端' -- '端' - FONTDATA_ITEM(246, 172, 172, fontpage_246_172_172), // '第' -- '第' - FONTDATA_ITEM(246, 201, 201, fontpage_246_201_201), // '等' -- '等' - FONTDATA_ITEM(247, 128, 128, fontpage_247_128_128), // '简' -- '简' - FONTDATA_ITEM(247, 177, 177, fontpage_247_177_177), // '箱' -- '箱' - FONTDATA_ITEM(248, 251, 251, fontpage_248_251_251), // '类' -- '类' - FONTDATA_ITEM(250, 162, 162, fontpage_250_162_162), // '索' -- '索' - FONTDATA_ITEM(250, 171, 171, fontpage_250_171_171), // '紫' -- '紫' - FONTDATA_ITEM(253, 162, 162, fontpage_253_162_162), // '红' -- '红' - FONTDATA_ITEM(253, 167, 167, fontpage_253_167_167), // '级' -- '级' - FONTDATA_ITEM(253, 191, 191, fontpage_253_191_191), // '线' -- '线' - FONTDATA_ITEM(253, 198, 198, fontpage_253_198_198), // '细' -- '细' - FONTDATA_ITEM(253, 200, 200, fontpage_253_200_200), // '终' -- '终' - FONTDATA_ITEM(253, 211, 211, fontpage_253_211_211), // '结' -- '结' - FONTDATA_ITEM(253, 217, 217, fontpage_253_217_217), // '给' -- '给' - FONTDATA_ITEM(253, 223, 223, fontpage_253_223_223), // '统' -- '统' - FONTDATA_ITEM(253, 231, 231, fontpage_253_231_231), // '继' -- '继' - FONTDATA_ITEM(253, 234, 234, fontpage_253_234_234), // '绪' -- '绪' - FONTDATA_ITEM(253, 237, 237, fontpage_253_237_237), // '续' -- '续' - FONTDATA_ITEM(253, 255, 255, fontpage_253_255_255), // '绿' -- '绿' - FONTDATA_ITEM(254, 150, 150, fontpage_254_150_150), // '编' -- '编' - FONTDATA_ITEM(254, 186, 186, fontpage_254_186_186), // '缺' -- '缺' - FONTDATA_ITEM(254, 209, 209, fontpage_254_209_209), // '网' -- '网' - FONTDATA_ITEM(254, 238, 238, fontpage_254_238_238), // '置' -- '置' - FONTDATA_ITEM(254, 242, 242, fontpage_254_242_242), // '署' -- '署' - FONTDATA_ITEM(256, 133, 133, fontpage_256_133_133), // '者' -- '者' - FONTDATA_ITEM(256, 234, 234, fontpage_256_234_234), // '聪' -- '聪' - FONTDATA_ITEM(257, 253, 253, fontpage_257_253_253), // '能' -- '能' - FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自' - FONTDATA_ITEM(259, 243, 243, fontpage_259_243_243), // '至' -- '至' - FONTDATA_ITEM(263, 220, 220, fontpage_263_220_220), // '菜' -- '菜' - FONTDATA_ITEM(265, 221, 221, fontpage_265_221_221), // '蓝' -- '蓝' - FONTDATA_ITEM(269, 199, 199, fontpage_269_199_199), // '蛇' -- '蛇' - FONTDATA_ITEM(272, 204, 204, fontpage_272_204_204), // '行' -- '行' - FONTDATA_ITEM(273, 171, 171, fontpage_273_171_171), // '被' -- '被' - FONTDATA_ITEM(273, 197, 197, fontpage_273_197_197), // '装' -- '装' - FONTDATA_ITEM(275, 129, 129, fontpage_275_129_129), // '要' -- '要' - FONTDATA_ITEM(275, 210, 210, fontpage_275_210_210), // '角' -- '角' - FONTDATA_ITEM(279, 161, 161, fontpage_279_161_161), // '计' -- '计' - FONTDATA_ITEM(279, 174, 174, fontpage_279_174_174), // '议' -- '议' - FONTDATA_ITEM(279, 190, 190, fontpage_279_190_190), // '设' -- '设' - FONTDATA_ITEM(279, 213, 213, fontpage_279_213_213), // '试' -- '试' - FONTDATA_ITEM(279, 239, 239, fontpage_279_239_239), // '误' -- '误' - FONTDATA_ITEM(279, 247, 247, fontpage_279_247_247), // '请' -- '请' - FONTDATA_ITEM(279, 251, 251, fontpage_279_251_251), // '读' -- '读' - FONTDATA_ITEM(280, 131, 131, fontpage_280_131_131), // '调' -- '调' - FONTDATA_ITEM(282, 165, 165, fontpage_282_165_165), // '败' -- '败' - FONTDATA_ITEM(282, 170, 170, fontpage_282_170_170), // '贪' -- '贪' - FONTDATA_ITEM(282, 247, 247, fontpage_282_247_247), // '起' -- '起' - FONTDATA_ITEM(283, 133, 133, fontpage_283_133_133), // '超' -- '超' - FONTDATA_ITEM(283, 221, 221, fontpage_283_221_221), // '距' -- '距' - FONTDATA_ITEM(286, 236, 236, fontpage_286_236_236), // '转' -- '转' - FONTDATA_ITEM(286, 239, 239, fontpage_286_239_239), // '软' -- '软' - FONTDATA_ITEM(286, 244, 244, fontpage_286_244_244), // '轴' -- '轴' - FONTDATA_ITEM(286, 253, 253, fontpage_286_253_253), // '载' -- '载' - FONTDATA_ITEM(287, 145, 145, fontpage_287_145_145), // '辑' -- '辑' - FONTDATA_ITEM(287, 147, 147, fontpage_287_147_147), // '输' -- '输' - FONTDATA_ITEM(287, 185, 185, fontpage_287_185_185), // '边' -- '边' - FONTDATA_ITEM(287, 193, 193, fontpage_287_193_193), // '迁' -- '迁' - FONTDATA_ITEM(287, 208, 209, fontpage_287_208_209), // '运' -- '近' - FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // '返' -- '返' - FONTDATA_ITEM(287, 216, 216, fontpage_287_216_216), // '还' -- '还' - FONTDATA_ITEM(287, 219, 219, fontpage_287_219_219), // '进' -- '进' - FONTDATA_ITEM(287, 222, 222, fontpage_287_222_222), // '连' -- '连' - FONTDATA_ITEM(287, 247, 247, fontpage_287_247_247), // '迷' -- '迷' - FONTDATA_ITEM(288, 128, 128, fontpage_288_128_128), // '退' -- '退' - FONTDATA_ITEM(288, 137, 137, fontpage_288_137_137), // '选' -- '选' - FONTDATA_ITEM(288, 159, 159, fontpage_288_159_159), // '速' -- '速' - FONTDATA_ITEM(289, 232, 232, fontpage_289_232_232), // '部' -- '部' - FONTDATA_ITEM(290, 205, 205, fontpage_290_205_205), // '配' -- '配' - FONTDATA_ITEM(291, 202, 202, fontpage_291_202_202), // '释' -- '释' - FONTDATA_ITEM(291, 205, 205, fontpage_291_205_205), // '重' -- '重' - FONTDATA_ITEM(291, 207, 207, fontpage_291_207_207), // '量' -- '量' - FONTDATA_ITEM(297, 136, 136, fontpage_297_136_136), // '针' -- '针' - FONTDATA_ITEM(297, 174, 174, fontpage_297_174_174), // '钮' -- '钮' - FONTDATA_ITEM(298, 153, 153, fontpage_298_153_153), // '错' -- '错' - FONTDATA_ITEM(298, 220, 220, fontpage_298_220_220), // '镜' -- '镜' - FONTDATA_ITEM(298, 255, 255, fontpage_298_255_255), // '长' -- '长' - FONTDATA_ITEM(299, 237, 237, fontpage_299_237_237), // '闭' -- '闭' - FONTDATA_ITEM(299, 242, 242, fontpage_299_242_242), // '闲' -- '闲' - FONTDATA_ITEM(299, 244, 244, fontpage_299_244_244), // '间' -- '间' - FONTDATA_ITEM(300, 136, 136, fontpage_300_136_136), // '阈' -- '阈' - FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // '降' -- '降' - FONTDATA_ITEM(300, 208, 208, fontpage_300_208_208), // '限' -- '限' - FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除' - FONTDATA_ITEM(300, 233, 233, fontpage_300_233_233), // '险' -- '险' - FONTDATA_ITEM(301, 246, 246, fontpage_301_246_246), // '零' -- '零' - FONTDATA_ITEM(302, 128, 128, fontpage_302_128_128), // '需' -- '需' - FONTDATA_ITEM(302, 210, 210, fontpage_302_210_210), // '青' -- '青' - FONTDATA_ITEM(302, 222, 222, fontpage_302_222_222), // '非' -- '非' - FONTDATA_ITEM(302, 224, 224, fontpage_302_224_224), // '靠' -- '靠' - FONTDATA_ITEM(302, 226, 226, fontpage_302_226_226), // '面' -- '面' - FONTDATA_ITEM(304, 245, 245, fontpage_304_245_245), // '页' -- '页' - FONTDATA_ITEM(304, 249, 249, fontpage_304_249_249), // '项' -- '项' - FONTDATA_ITEM(305, 132, 132, fontpage_305_132_132), // '预' -- '预' - FONTDATA_ITEM(305, 145, 145, fontpage_305_145_145), // '频' -- '频' - FONTDATA_ITEM(305, 157, 157, fontpage_305_157_157), // '额' -- '额' - FONTDATA_ITEM(305, 206, 206, fontpage_305_206_206), // '风' -- '风' - FONTDATA_ITEM(306, 241, 241, fontpage_306_241_241), // '饱' -- '饱' - FONTDATA_ITEM(308, 236, 236, fontpage_308_236_236), // '马' -- '马' - FONTDATA_ITEM(308, 241, 241, fontpage_308_241_241), // '驱' -- '驱' - FONTDATA_ITEM(309, 216, 216, fontpage_309_216_216), // '高' -- '高' - FONTDATA_ITEM(317, 196, 196, fontpage_317_196_196), // '黄' -- '黄' - FONTDATA_ITEM(317, 222, 222, fontpage_317_222_222), // '點' -- '點' - FONTDATA_ITEM(318, 208, 208, fontpage_318_208_208), // '齐' -- '齐' - FONTDATA_ITEM(510, 154, 154, fontpage_510_154_154), // ':' -- ':' -}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h deleted file mode 100644 index 8eee544ec8..0000000000 --- a/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h +++ /dev/null @@ -1,1521 +0,0 @@ -/** - * Generated automatically by buildroot/share/fonts/uxggenpages.sh - * Contents will be REPLACED by future processing! - * Use genallfont.sh to generate font data for updated languages. - */ -#include - -const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x05,0x00,0x00, - 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xF8}; -const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, - 0x00,0x0B,0x02,0x04,0x0C,0x00,0x04,0x00,0x40,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x8B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F, - 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x0B,0x0B,0x16,0x0C,0x00, - 0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x04,0x00,0x04, - 0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0xFF,0xE0,0x04, - 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, - 0x00}; -const u8g_fntpgm_uint8_t fontpage_156_141_141[45] U8G_FONT_SECTION("fontpage_156_141_141") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x02,0x00,0x02,0x00,0x04,0x00,0x0D, - 0x00,0x14,0x80,0x24,0x40,0x44,0x20,0x84,0x00,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_156_166_166[45] U8G_FONT_SECTION("fontpage_156_166_166") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x11,0x00,0xFF,0xE0,0x0A,0x00,0x4A, - 0x40,0x4A,0x40,0x2A,0x40,0x2A,0x80,0x0A,0x00,0x0A,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0x80,0x88,0x80,0x88, - 0x80,0x88,0x80,0xFF,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_156_187_187[45] U8G_FONT_SECTION("fontpage_156_187_187") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04, - 0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_156_203_203[45] U8G_FONT_SECTION("fontpage_156_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x04,0x00,0x7F,0xC0,0x00,0x80,0x01, - 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xE0}; -const u8g_fntpgm_uint8_t fontpage_157_164_164[45] U8G_FONT_SECTION("fontpage_157_164_164") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20, - 0x80,0x51,0x40,0x11,0x00,0x0A,0x00,0x04,0x00,0x1B,0x00,0x60,0xE0}; -const u8g_fntpgm_uint8_t fontpage_157_174_174[45] U8G_FONT_SECTION("fontpage_157_174_174") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x11,0x00,0x1F,0x00,0x00, - 0x00,0xFF,0xE0,0x80,0x20,0x1F,0x00,0x11,0x00,0x21,0x20,0xC0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_157_228_228[45] U8G_FONT_SECTION("fontpage_157_228_228") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE4,0xE4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x24, - 0x80,0xC2,0x60,0x3F,0x80,0x01,0x00,0x0A,0x00,0x04,0x00,0x02,0x00}; -const u8g_fntpgm_uint8_t fontpage_157_246_246[45] U8G_FONT_SECTION("fontpage_157_246_246") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF6,0xF6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x15,0x00,0x25,0x00,0x2F,0xC0,0x71, - 0x00,0xA1,0x00,0x2F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_157_253_253[45] U8G_FONT_SECTION("fontpage_157_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, - 0x20,0xA7,0xC0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xC0}; -const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_145_145") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x21,0x00,0x3F,0xE0,0x61, - 0x00,0xA3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_158_205_206[73] U8G_FONT_SECTION("fontpage_158_205_206") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x11,0x00,0x20,0x00,0x2F,0xE0,0x60, - 0x00,0xA4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2F,0xE0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x10,0xC0,0x1F,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xAF,0xE0,0x29, - 0x00,0x29,0x20,0x2A,0xA0,0x2D,0x60,0x28,0xA0}; -const u8g_fntpgm_uint8_t fontpage_158_220_220[45] U8G_FONT_SECTION("fontpage_158_220_220") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x00,0x14,0x00,0x27,0xE0,0x2A,0x00,0x72, - 0x00,0xA3,0xC0,0x22,0x00,0x22,0x00,0x23,0xE0,0x22,0x00,0x22,0x00}; -const u8g_fntpgm_uint8_t fontpage_159_155_155[45] U8G_FONT_SECTION("fontpage_159_155_155") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x80,0x14,0x80,0x24,0x80,0x2F,0xE0,0x64, - 0x80,0xA4,0x80,0x3F,0xE0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; -const u8g_fntpgm_uint8_t fontpage_159_221_221[45] U8G_FONT_SECTION("fontpage_159_221_221") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x17,0xC0,0x14,0x40,0x24,0x40,0x27,0xC0,0x61, - 0x00,0xAF,0xE0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_225_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x11,0x00,0x2F,0xE0,0x20,0x00,0x67, - 0xC0,0xA0,0x00,0x27,0xC0,0x20,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0}; -const u8g_fntpgm_uint8_t fontpage_160_139_139[45] U8G_FONT_SECTION("fontpage_160_139_139") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x29,0x20,0x29,0x20,0x2F,0xE0,0x69, - 0x20,0xAB,0xA0,0x2A,0xA0,0x2B,0xA0,0x28,0x20,0x2F,0xE0,0x28,0x20}; -const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x1F,0xE0,0x22,0x00,0x27,0xC0,0x64, - 0x40,0xA7,0xC0,0x24,0x40,0x27,0x40,0x25,0xC0,0x24,0x40,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_160_207_207[45] U8G_FONT_SECTION("fontpage_160_207_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x28,0x20,0x2F,0xE0,0x68, - 0x00,0xAF,0xE0,0x2A,0xA0,0x2F,0xE0,0x2A,0xA0,0x3A,0xA0,0x28,0x60}; -const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_220_220") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x3F,0xE0,0x20,0x00,0x4F,0xC0,0x48, - 0x40,0xDF,0xE0,0x50,0x20,0x4F,0xC0,0x41,0x00,0x41,0x00,0x47,0x00}; -const u8g_fntpgm_uint8_t fontpage_160_245_245[45] U8G_FONT_SECTION("fontpage_160_245_245") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF5,0xF5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xE0,0x22,0x00,0x2F,0xC0,0x68, - 0x40,0xAF,0xC0,0x28,0x40,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x38,0x60}; -const u8g_fntpgm_uint8_t fontpage_161_153_153[45] U8G_FONT_SECTION("fontpage_161_153_153") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x2F,0xC0,0x24,0x80,0x3F,0xE0,0x64, - 0x00,0xAF,0xE0,0x29,0x20,0x3F,0xE0,0x29,0x20,0x2F,0xE0,0x29,0x20}; -const u8g_fntpgm_uint8_t fontpage_161_179_179[45] U8G_FONT_SECTION("fontpage_161_179_179") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB3,0xB3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x3F,0xE0,0x2A,0x40,0x2F,0xC0,0x6A, - 0x40,0xBF,0xC0,0x22,0x80,0x3F,0xE0,0x28,0x80,0x24,0x80,0x21,0x80}; -const u8g_fntpgm_uint8_t fontpage_161_190_190[45] U8G_FONT_SECTION("fontpage_161_190_190") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x13,0xE0,0x10,0x80,0x2B,0xE0,0x2A,0x20,0x6F, - 0xE0,0xAA,0x20,0x2B,0xE0,0x2E,0x20,0x2B,0xE0,0x31,0x40,0x26,0x20}; -const u8g_fntpgm_uint8_t fontpage_162_178_178[45] U8G_FONT_SECTION("fontpage_162_178_178") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB2,0xB2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x28,0x80,0x3D,0xE0,0x40,0xA0,0x5D,0xE0,0xC0, - 0x80,0x5D,0xE0,0x43,0x20,0x5D,0xE0,0x55,0x20,0x5D,0xE0,0x55,0x20}; -const u8g_fntpgm_uint8_t fontpage_162_197_197[45] U8G_FONT_SECTION("fontpage_162_197_197") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0xFF,0xC0,0x08,0x00,0x11,0x00,0x7F, - 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xC1,0xC0}; -const u8g_fntpgm_uint8_t fontpage_162_200_201[73] U8G_FONT_SECTION("fontpage_162_200_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x84, - 0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x24,0x80,0x04,0x00,0xFF,0xE0,0x12,0x00,0x12, - 0x00,0x12,0x20,0x12,0x20,0x22,0x20,0xC1,0xE0}; -const u8g_fntpgm_uint8_t fontpage_162_229_229[45] U8G_FONT_SECTION("fontpage_162_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0A, - 0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; -const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, - 0x60,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0}; -const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_241_241") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11, - 0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; -const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_247_247") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F, - 0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0,0x11,0x00,0xE0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_163_151_151[43] U8G_FONT_SECTION("fontpage_163_151_151") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x09,0xFF,0x00, - 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x11,0x00,0x11, - 0x00,0x11,0x00,0x11,0x00,0x21,0x20,0x41,0x20,0x80,0xE0}; -const u8g_fntpgm_uint8_t fontpage_163_183_183[45] U8G_FONT_SECTION("fontpage_163_183_183") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, - 0x60,0x41,0x00,0x4F,0xC0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; -const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x89,0x00,0x4F,0xE0,0x59,0x00,0x09, - 0x00,0x2F,0xC0,0x29,0x00,0xCF,0xC0,0x49,0x00,0x49,0x00,0x4F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_163_250_250[45] U8G_FONT_SECTION("fontpage_163_250_250") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7F, - 0xC0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_164_134_134[45] U8G_FONT_SECTION("fontpage_164_134_134") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, - 0x40,0xBF,0xA0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xC3,0x00}; -const u8g_fntpgm_uint8_t fontpage_164_151_151[45] U8G_FONT_SECTION("fontpage_164_151_151") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7E,0x20,0x10,0x20,0x11,0x20,0x3D,0x20,0x25, - 0x20,0x65,0x20,0x99,0x20,0x09,0x20,0x10,0x20,0x20,0x20,0xC0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_157_157") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x27,0xE0,0xF9,0x20,0x11,0x20,0x21, - 0x20,0x69,0x20,0xB1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xC0}; -const u8g_fntpgm_uint8_t fontpage_164_176_176[45] U8G_FONT_SECTION("fontpage_164_176_176") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFE,0x20,0x10,0x20,0x20,0xA0,0x44,0xA0,0xFE, - 0xA0,0x10,0xA0,0x7C,0xA0,0x10,0xA0,0x10,0x20,0x1E,0x20,0xE0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x50,0xA0,0x7E,0xA0,0x90,0xA0,0xFE, - 0xA0,0x10,0xA0,0x7E,0xA0,0x52,0xA0,0x52,0x20,0x56,0x20,0x10,0xE0,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x7E,0x20,0x42,0x20,0x7E,0xA0,0x48,0xA0,0x48,0xA0,0x7E,0xA0,0x6A, - 0xA0,0xAA,0xA0,0xAA,0xA0,0x2E,0x20,0x08,0xE0}; -const u8g_fntpgm_uint8_t fontpage_164_245_245[45] U8G_FONT_SECTION("fontpage_164_245_245") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF5,0xF5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x28,0x20,0x54,0xA0,0xFE,0xA0,0x44, - 0xA0,0x7C,0xA0,0x44,0xA0,0x7C,0xA0,0xC4,0x20,0x44,0x20,0x7C,0xE0}; -const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165_155_155") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9B,0x9B,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0x08,0x00,0xFF,0x80,0x08, - 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; -const u8g_fntpgm_uint8_t fontpage_165_160_160[45] U8G_FONT_SECTION("fontpage_165_160_160") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x20,0x00,0xFD,0xE0,0x25,0x20,0x25, - 0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0x20,0x55,0xE0,0x89,0x20}; -const u8g_fntpgm_uint8_t fontpage_165_213_213[45] U8G_FONT_SECTION("fontpage_165_213_213") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x78,0x80,0x10,0x80,0xFE,0x80,0x55,0xE0,0x7C, - 0xA0,0x54,0xA0,0x7C,0xA0,0x10,0xA0,0x7D,0x20,0x11,0x20,0xFE,0x60}; -const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, - 0x00,0xA2,0x00,0x26,0x00,0x2A,0x00,0x22,0x20,0x22,0x20,0x21,0xE0}; -const u8g_fntpgm_uint8_t fontpage_166_202_202[45] U8G_FONT_SECTION("fontpage_166_202_202") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7F, - 0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_212_212[45] U8G_FONT_SECTION("fontpage_166_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x27,0xC0,0x22,0x40,0xFA,0x40,0x24, - 0x80,0x24,0x80,0x3F,0xE0,0x2A,0xA0,0x2A,0xA0,0x33,0x20,0x24,0x40}; -const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_225_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x0F,0x80,0x08,0x00,0x08,0x00,0xFF, - 0xE0,0x08,0x00,0x0A,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_240_240[45] U8G_FONT_SECTION("fontpage_166_240_240") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x10,0x00,0xE7,0xC0,0x84,0x40,0x84,0x40,0xF4, - 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xE5,0x80,0x84,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166_248_248") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x7D,0xE0,0x91,0x20,0x11,0x20,0xFF, - 0x20,0x11,0x20,0x5D,0x20,0x51,0x20,0x51,0xA0,0x5D,0x40,0xE1,0x00}; -const u8g_fntpgm_uint8_t fontpage_166_251_251[45] U8G_FONT_SECTION("fontpage_166_251_251") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x28,0x00,0x25,0xE0,0x53,0x20,0x99,0x20,0x25, - 0x20,0x43,0x20,0xBD,0x20,0x25,0xA0,0x25,0x40,0x3D,0x00,0x25,0x00}; -const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167_159_159") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xE0,0x22,0x00,0x2F,0xC0,0x28,0x40,0x2F, - 0xC0,0x28,0x40,0x2F,0xC0,0x22,0x00,0x2A,0x80,0x52,0x60,0xA6,0x20}; -const u8g_fntpgm_uint8_t fontpage_167_205_205[45] U8G_FONT_SECTION("fontpage_167_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0xC0,0x3E,0x00,0x20,0x00,0x20,0x00,0x3F, - 0xC0,0x28,0x80,0x25,0x00,0x22,0x00,0x45,0x00,0x48,0x80,0xB0,0x60}; -const u8g_fntpgm_uint8_t fontpage_167_214_214[45] U8G_FONT_SECTION("fontpage_167_214_214") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD6,0xD6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFC,0x00,0x4B,0xE0,0x4A,0x20,0x7A,0x20,0x49, - 0x40,0x79,0x40,0x48,0x80,0x4C,0x80,0xF9,0x40,0x0A,0x40,0x0C,0x20}; -const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xFF, - 0x80,0x00,0x80,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00}; -const u8g_fntpgm_uint8_t fontpage_168_136_136[45] U8G_FONT_SECTION("fontpage_168_136_136") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, - 0x60,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80}; -const u8g_fntpgm_uint8_t fontpage_168_166_166[45] U8G_FONT_SECTION("fontpage_168_166_166") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x0D,0x80,0x34,0x40,0xC4, - 0x20,0x04,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40}; -const u8g_fntpgm_uint8_t fontpage_168_202_202[45] U8G_FONT_SECTION("fontpage_168_202_202") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x04, - 0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80}; -const u8g_fntpgm_uint8_t fontpage_168_253_253[45] U8G_FONT_SECTION("fontpage_168_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x0A,0x00,0x11,0x00,0xEE,0xE0,0x00, - 0x00,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7A,0x40,0x4A,0xC0,0x02,0x00}; -const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0C,0x00,0x70,0x00,0x11,0xE0,0xFD,0x20,0x11, - 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xE0,0x10,0x00}; -const u8g_fntpgm_uint8_t fontpage_170_223_223[45] U8G_FONT_SECTION("fontpage_170_223_223") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x7D,0x00,0x45,0xE0,0x7D,0x40,0x43, - 0x40,0x5D,0x40,0x55,0x40,0x54,0x80,0x94,0x80,0x9D,0x40,0x82,0x20}; -const u8g_fntpgm_uint8_t fontpage_171_174_174[45] U8G_FONT_SECTION("fontpage_171_174_174") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xF3,0xC0,0x92,0x40,0x92,0x40,0xFF,0xC0,0x44, - 0x80,0x7F,0x80,0x44,0x80,0x7F,0x80,0x04,0x00,0xFF,0xC0,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_180_180") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0xA0,0xEB,0xC0,0xAA,0xA0,0xBF,0xE0,0xA4, - 0x80,0xAF,0xE0,0xF9,0x20,0x0F,0xE0,0x09,0x20,0x0F,0xE0,0x11,0x20}; -const u8g_fntpgm_uint8_t fontpage_172_232_232[45] U8G_FONT_SECTION("fontpage_172_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7B,0xC0,0x04, - 0x80,0xFF,0xE0,0x11,0x00,0xFB,0xE0,0x4A,0x40,0x4A,0x40,0x7B,0xC0}; -const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xEF,0xE0,0xA5,0x40,0xAF,0xE0,0xA4, - 0x40,0xA7,0xC0,0xE4,0x40,0x07,0xC0,0x04,0x40,0x07,0xC0,0x0C,0x60}; -const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x80,0x40,0x80,0x40,0x9E,0x40,0x92, - 0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0x80,0x40,0xFF,0xC0,0x80,0x40}; -const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_224_224") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x84,0x20,0x84,0x20,0xBF,0xA0,0x84, - 0x20,0x84,0x20,0x8A,0x20,0x91,0x20,0xA0,0xA0,0x80,0x20,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_173_250_250[45] U8G_FONT_SECTION("fontpage_173_250_250") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x88,0x40,0x88,0x40,0xFF,0x40,0x88, - 0x40,0xBE,0x40,0xA2,0x40,0xA2,0x40,0xBE,0x40,0x80,0x40,0xFF,0xC0}; -const u8g_fntpgm_uint8_t fontpage_174_150_150[45] U8G_FONT_SECTION("fontpage_174_150_150") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x91,0x20,0x9F,0x20,0x84,0x20,0xFF, - 0xE0,0xAA,0xA0,0xAE,0xA0,0xA0,0xA0,0xBF,0xA0,0x80,0x20,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0xFF,0xC0,0x10,0x00,0x22, - 0x00,0x62,0x00,0xAF,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3F,0xC0}; -const u8g_fntpgm_uint8_t fontpage_175_139_139[45] U8G_FONT_SECTION("fontpage_175_139_139") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7E,0x40,0x29,0x40,0x29,0x40,0xFF,0x40,0x29, - 0x40,0x28,0x40,0x4C,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_175_247_247[45] U8G_FONT_SECTION("fontpage_175_247_247") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xF9,0x00,0x27,0xC0,0xF9,0x40,0x55, - 0x40,0xFB,0x40,0x21,0x40,0xF9,0xC0,0x22,0x40,0x24,0x20,0x28,0x20}; -const u8g_fntpgm_uint8_t fontpage_176_202_202[45] U8G_FONT_SECTION("fontpage_176_202_202") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x2F,0xE0,0x29,0x20,0xFF,0xE0,0x29, - 0x20,0x2F,0xE0,0x21,0x40,0x33,0xA0,0xE5,0xE0,0x09,0x20,0x10,0xE0}; -const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEB,0xEB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x21,0x00,0xF7,0xC0,0x24, - 0x40,0x27,0x40,0x25,0xC0,0x34,0x40,0xEF,0xE0,0x02,0x80,0x0C,0x60}; -const u8g_fntpgm_uint8_t fontpage_177_138_138[45] U8G_FONT_SECTION("fontpage_177_138_138") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0x23,0xC0,0xF9,0x40,0x51,0x40,0xFB, - 0x40,0x22,0xC0,0xFC,0x20,0x24,0x20,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x3D,0x00,0x25,0x00,0x45, - 0x80,0xA5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; -const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x1F,0x00,0x21,0x00,0x52,0x00,0x0C, - 0x00,0x34,0x00,0xCF,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xF8,0x00}; -const u8g_fntpgm_uint8_t fontpage_178_160_160[45] U8G_FONT_SECTION("fontpage_178_160_160") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x79,0xE0,0x8A,0x20,0x50,0x20,0x23, - 0xA0,0xFA,0xA0,0x2A,0xA0,0xCB,0xA0,0x28,0x20,0x11,0x20,0xE0,0xC0}; -const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_167_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04, - 0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; -const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xAA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, - 0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A, - 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xC4,0x60}; -const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_177_177") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x24,0x00,0x3F,0xC0,0x44,0x00,0x04, - 0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; -const u8g_fntpgm_uint8_t fontpage_179_203_203[45] U8G_FONT_SECTION("fontpage_179_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0xFA,0x40,0x2A,0x20,0x2F, - 0xE0,0x48,0x00,0x53,0xE0,0x32,0x20,0x2A,0x20,0x4B,0xE0,0x82,0x20}; -const u8g_fntpgm_uint8_t fontpage_181_146_146[45] U8G_FONT_SECTION("fontpage_181_146_146") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x40,0x2F,0xE0,0x24,0x40,0xF7,0xC0,0x54, - 0x40,0x57,0xC0,0x51,0x00,0x2F,0xE0,0x33,0x80,0x4D,0x40,0x89,0x20}; -const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_208_208") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, - 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0xC0,0x20, - 0x80,0x61,0x00,0xBF,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; -const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x88,0x40,0x08, - 0x00,0xFF,0xE0,0x11,0x00,0x31,0x00,0x0E,0x00,0x09,0x80,0x70,0x60}; -const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x00, - 0x00,0x7F,0xE0,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xE0}; -const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x80,0x40,0x3F, - 0xC0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0xFF,0xC0,0x90,0x40,0x3F,0x00,0x52, - 0x00,0x8C,0x00,0x33,0x00,0xFF,0xC0,0x21,0x00,0x21,0x00,0x3F,0x00}; -const u8g_fntpgm_uint8_t fontpage_183_185_185[45] U8G_FONT_SECTION("fontpage_183_185_185") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB9,0xB9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x91,0x20,0x24,0x80,0x4A, - 0x40,0x11,0x00,0x20,0x80,0xDF,0x60,0x11,0x00,0x11,0x00,0x1F,0x00}; -const u8g_fntpgm_uint8_t fontpage_184_141_141[45] U8G_FONT_SECTION("fontpage_184_141_141") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x28,0x40,0xAA,0x40,0x6C,0x40,0xFF,0xE0,0x28, - 0x40,0x7D,0x40,0x10,0xC0,0x7C,0x40,0x10,0x40,0x1D,0x40,0xE0,0x80}; -const u8g_fntpgm_uint8_t fontpage_184_143_143[45] U8G_FONT_SECTION("fontpage_184_143_143") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, - 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; -const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_177_177") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFD,0x40,0x01,0x20,0x7F,0xE0,0x4A, - 0x80,0x7A,0x80,0x12,0x80,0x5A,0xA0,0x56,0xA0,0x92,0xA0,0x34,0x60}; -const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x09,0x00,0x00, - 0x00,0x0B,0x09,0x12,0x0C,0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, - 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_187_238_238[45] U8G_FONT_SECTION("fontpage_187_238_238") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x80,0x09,0x00,0xFF,0xE0,0x04,0x00,0x7F, - 0xC0,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0x80,0x42,0x00,0xBF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_187_242_242[43] U8G_FONT_SECTION("fontpage_187_242_242") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x09,0xFF,0x00, - 0x00,0x0A,0x0A,0x14,0x0C,0x01,0xFF,0xFF,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xFF, - 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7F,0xC0}; -const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, - 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x7F, - 0xE0,0x42,0x00,0x47,0x00,0x4A,0x80,0x52,0x40,0xA2,0x20,0x82,0x00}; -const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_166_166") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x49,0x00,0x7F,0xC0,0x49, - 0x00,0x4F,0x00,0x40,0x00,0x5F,0x80,0x49,0x00,0x86,0x00,0xB9,0xC0}; -const u8g_fntpgm_uint8_t fontpage_189_226_226[45] U8G_FONT_SECTION("fontpage_189_226_226") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x55,0x40,0x48,0xA0,0x7D, - 0xC0,0x45,0x20,0x5E,0x00,0x51,0xC0,0x5D,0x40,0x84,0x80,0x9B,0x60}; -const u8g_fntpgm_uint8_t fontpage_189_250_250[45] U8G_FONT_SECTION("fontpage_189_250_250") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xEF,0xC0,0x22,0x40,0x5F,0xE0,0xE2, - 0x40,0x2F,0xC0,0xA2,0x00,0x6F,0xE0,0x22,0x00,0x52,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_190_149_149[45] U8G_FONT_SECTION("fontpage_190_149_149") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFC,0x40,0x04,0x40,0x04,0x40,0x7C,0x40,0x40, - 0x40,0xFC,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x28,0x40,0x10,0x40}; -const u8g_fntpgm_uint8_t fontpage_191_133_133[45] U8G_FONT_SECTION("fontpage_191_133_133") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x21,0x00,0x47,0xC0,0x91,0x00,0x1F, - 0xE0,0x20,0x80,0x6F,0xE0,0xA4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; -const u8g_fntpgm_uint8_t fontpage_191_140_140[45] U8G_FONT_SECTION("fontpage_191_140_140") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x24,0x80,0x47,0x00,0x92,0x40,0x2F, - 0xE0,0x64,0x20,0xA7,0xC0,0x2C,0x40,0x32,0x80,0x23,0x80,0x2C,0x60}; -const u8g_fntpgm_uint8_t fontpage_191_145_145[45] U8G_FONT_SECTION("fontpage_191_145_145") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0xE0,0x25,0x40,0x45,0x40,0x9A,0x80,0x25, - 0x40,0x65,0x40,0xA0,0x00,0x27,0xC0,0x21,0x00,0x21,0x00,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_191_158_158[45] U8G_FONT_SECTION("fontpage_191_158_158") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9E,0x9E,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x40,0x22,0x40,0x45,0xA0,0x99,0x20,0x20, - 0x00,0x65,0x00,0xA5,0x00,0x25,0xE0,0x25,0x00,0x2B,0x00,0x31,0xE0}; -const u8g_fntpgm_uint8_t fontpage_191_169_169[45] U8G_FONT_SECTION("fontpage_191_169_169") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x00,0x27,0xE0,0x4C,0x40,0x97,0xC0,0x24, - 0x40,0x67,0xC0,0xA4,0x00,0x27,0xC0,0x2C,0x80,0x33,0x00,0x2C,0xE0}; -const u8g_fntpgm_uint8_t fontpage_191_174_174[45] U8G_FONT_SECTION("fontpage_191_174_174") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2A,0x80,0x6A,0x80,0xBE,0x80,0x01,0xE0,0x5D, - 0x40,0xC3,0x40,0x5D,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; -const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, - 0x40,0x50,0x20,0x50,0x20,0x50,0xA0,0x90,0x80,0x10,0x80,0x0F,0x80}; -const u8g_fntpgm_uint8_t fontpage_192_167_167[45] U8G_FONT_SECTION("fontpage_192_167_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x25,0x00,0xB5,0x00,0xAF,0xE0,0xA9, - 0x00,0xB1,0x00,0x27,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_226_226") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x2F,0xE0,0xB2,0x00,0xAA,0x80,0xA4, - 0x80,0xA5,0xA0,0x2A,0xC0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; -const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_239_239") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20, - 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x54,0x40,0x52,0xA0,0x8F,0x80}; -const u8g_fntpgm_uint8_t fontpage_195_182_182[45] U8G_FONT_SECTION("fontpage_195_182_182") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xE0,0xB2,0x80,0xAF,0xE0,0xA4, - 0x40,0x27,0xC0,0x24,0x40,0x27,0xC0,0x25,0x40,0x2C,0xA0,0x33,0xA0}; -const u8g_fntpgm_uint8_t fontpage_195_201_201[45] U8G_FONT_SECTION("fontpage_195_201_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x7F,0xE0,0x4A,0x80,0x57,0xE0,0x7C, - 0x80,0x57,0xC0,0x54,0x80,0x57,0xE0,0x4A,0x40,0xA8,0xA0,0x4F,0xA0}; -const u8g_fntpgm_uint8_t fontpage_196_144_144[45] U8G_FONT_SECTION("fontpage_196_144_144") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x80,0x02,0x40,0x7F,0xE0,0x42,0x00,0x42, - 0x00,0x7A,0x40,0x4A,0x40,0x4A,0x80,0x49,0x20,0x52,0xA0,0x84,0x60}; -const u8g_fntpgm_uint8_t fontpage_196_182_182[45] U8G_FONT_SECTION("fontpage_196_182_182") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x01,0xC0,0x3E,0x00,0x20,0x00,0x3F,0xC0,0x20, - 0x40,0x20,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; -const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_192_192") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x18,0x60,0x63,0x80,0x42,0x00,0x7A,0x00,0x4B, - 0xE0,0x4A,0x40,0x7A,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; -const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_199_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x7F,0xE0,0x40, - 0x00,0x7D,0xE0,0x44,0x20,0x54,0xA0,0x4C,0x60,0x54,0xA0,0xA9,0x60}; -const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x03,0xC0,0x7C,0x00,0x04,0x00,0x7F,0xC0,0x04, - 0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00}; -const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_211_211") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,0x28, - 0x80,0x30,0x80,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0xE3,0x80}; -const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_249_249") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x24,0x80,0xFC,0x80,0x24,0xA0,0x2F, - 0xC0,0x34,0x80,0x64,0x80,0xA4,0x80,0x25,0xA0,0x26,0xA0,0xE4,0x60}; -const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x40,0x22,0x40,0xF9,0x40,0x20,0x40,0x2A, - 0x40,0x31,0x40,0x60,0xE0,0xAF,0x40,0x20,0x40,0x20,0x40,0xE0,0x40}; -const u8g_fntpgm_uint8_t fontpage_197_189_189[45] U8G_FONT_SECTION("fontpage_197_189_189") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x20,0x80,0xF8,0x80,0x27,0xE0,0x2C, - 0xA0,0x34,0xA0,0x67,0xE0,0xA4,0xA0,0x24,0xA0,0x27,0xE0,0xE4,0x20}; -const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x22,0x40,0xFF,0xE0,0x22,0x00,0x2B, - 0xC0,0x32,0x40,0x65,0x40,0xA4,0x80,0x28,0x80,0x29,0x40,0xE6,0x20}; -const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0xFF,0xE0,0x25,0x20,0x29, - 0x00,0x37,0xE0,0x62,0x40,0xA6,0x40,0x21,0x80,0x22,0x80,0xEC,0x60}; -const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0xE0,0xF9,0x00,0x27,0xC0,0x2C, - 0x40,0x37,0xC0,0x64,0x40,0xA7,0xC0,0x21,0x00,0x2F,0xE0,0xE1,0x00}; -const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x28,0x20,0xF2,0x80,0x24,0x40,0x29, - 0x20,0x31,0x00,0x6F,0xE0,0xA1,0x00,0x25,0x80,0x29,0x40,0xF1,0x20}; -const u8g_fntpgm_uint8_t fontpage_199_165_165[45] U8G_FONT_SECTION("fontpage_199_165_165") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xF4,0x40,0x22,0x80,0x2F, - 0xE0,0x31,0x00,0x6F,0xE0,0xA2,0x40,0x26,0x80,0x21,0x40,0xEE,0x20}; -const u8g_fntpgm_uint8_t fontpage_199_167_167[45] U8G_FONT_SECTION("fontpage_199_167_167") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xF8,0x20,0x22,0x80,0x24, - 0x40,0x38,0x20,0x67,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0xEF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_199_208_208[45] U8G_FONT_SECTION("fontpage_199_208_208") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x24,0x40,0xFF,0xC0,0x24,0x40,0x27, - 0xC0,0x30,0x00,0x6F,0xE0,0xA5,0x00,0x25,0xE0,0x2B,0x00,0xF1,0xE0}; -const u8g_fntpgm_uint8_t fontpage_199_210_210[45] U8G_FONT_SECTION("fontpage_199_210_210") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0xC0,0x27,0x00,0xF1,0x00,0x2F,0xE0,0x21, - 0x00,0x35,0x60,0x69,0x20,0xAD,0x60,0x29,0x20,0x29,0x20,0xEF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_199_219_219[45] U8G_FONT_SECTION("fontpage_199_219_219") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0xF4,0x80,0x2F,0xE0,0x2A, - 0xA0,0x3A,0xA0,0x6C,0x60,0xA1,0x00,0x2F,0xE0,0x22,0x80,0xEC,0x60}; -const u8g_fntpgm_uint8_t fontpage_201_199_199[45] U8G_FONT_SECTION("fontpage_201_199_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xE0,0x2A,0xA0,0xFF,0xE0,0x21,0x00,0x2F, - 0xE0,0x32,0x80,0xE7,0xC0,0x21,0x00,0x2F,0xE0,0xA1,0x00,0x61,0x00}; -const u8g_fntpgm_uint8_t fontpage_201_202_203[73] U8G_FONT_SECTION("fontpage_201_202_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFD,0xC0,0xA9,0x40,0xF9,0x60,0xAB,0xC0,0xFD, - 0x40,0xA9,0x80,0xAB,0x60,0xFE,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x29,0x20,0x25,0x40,0xFF,0xE0,0x2A,0xA0,0x2B,0x80,0x30,0x00,0xEF, - 0xE0,0x29,0x20,0x2F,0xE0,0xA9,0x20,0x6F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_201_224_224[45] U8G_FONT_SECTION("fontpage_201_224_224") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0xFA,0xA0,0x25,0x40,0x2D, - 0x60,0x35,0x40,0xE4,0x40,0x27,0xC0,0x24,0x40,0xA7,0xC0,0x68,0x40}; -const u8g_fntpgm_uint8_t fontpage_202_182_182[45] U8G_FONT_SECTION("fontpage_202_182_182") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x93,0xE0,0x94,0x40,0x9A, - 0x40,0x92,0x40,0xB2,0x80,0xD1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; -const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_190_190") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBE,0xBE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x11,0x00,0xFD,0xE0,0x22,0x40,0x25, - 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4A,0x40,0x94,0x20}; -const u8g_fntpgm_uint8_t fontpage_202_215_215[45] U8G_FONT_SECTION("fontpage_202_215_215") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD7,0xD7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7D,0x00,0x45,0x00,0x7D,0xE0,0x47,0x40,0x7D, - 0x40,0x45,0x40,0x7D,0x40,0x45,0x40,0x28,0x80,0x45,0x40,0x86,0x20}; -const u8g_fntpgm_uint8_t fontpage_202_244_244[45] U8G_FONT_SECTION("fontpage_202_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x55,0x40,0x7C,0x80,0x39, - 0x40,0x56,0x20,0x7F,0xC0,0x04,0x00,0x27,0x80,0x24,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_202_248_248[45] U8G_FONT_SECTION("fontpage_202_248_248") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x7D,0x00,0x55,0xE0,0xFF,0x40,0x55, - 0x40,0xFD,0x40,0x95,0x40,0xFF,0x40,0x28,0x80,0x19,0x40,0xE6,0x20}; -const u8g_fntpgm_uint8_t fontpage_203_153_153[45] U8G_FONT_SECTION("fontpage_203_153_153") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0xAC,0x80,0x72,0x80,0x20,0x80,0xFC, - 0x80,0x22,0x80,0x30,0xE0,0x6F,0x80,0xA0,0x80,0x20,0x80,0x20,0x80}; -const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x40,0x29,0x40,0x44,0xC0,0xB8,0x40,0x12, - 0x40,0x7D,0x40,0x10,0x60,0x55,0xC0,0x52,0x40,0x92,0x40,0x30,0x40}; -const u8g_fntpgm_uint8_t fontpage_203_176_176[45] U8G_FONT_SECTION("fontpage_203_176_176") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x60,0xFD,0x80,0x45,0x00,0x29,0x00,0xFD, - 0xE0,0x11,0x40,0xFD,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; -const u8g_fntpgm_uint8_t fontpage_203_183_183[45] U8G_FONT_SECTION("fontpage_203_183_183") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xAA,0x40,0xFD,0x80,0x95,0x00,0xAB,0x00,0xFF, - 0xE0,0xA9,0x40,0xAB,0x40,0xFD,0x40,0x95,0x40,0xAB,0x40,0xFE,0x40}; -const u8g_fntpgm_uint8_t fontpage_203_188_188[45] U8G_FONT_SECTION("fontpage_203_188_188") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x10,0x80,0xFD,0x40,0x21,0x40,0x3A, - 0x20,0x2C,0x80,0x28,0x40,0x28,0x40,0x49,0x00,0x48,0x80,0x98,0x40}; -const u8g_fntpgm_uint8_t fontpage_204_135_135[45] U8G_FONT_SECTION("fontpage_204_135_135") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x3F, - 0xC0,0x79,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0xC1,0x00}; -const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_142_142") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8E,0x8E,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x03,0xE0,0xF2,0x20,0x92,0x20,0x93,0xE0,0xF2, - 0x20,0x92,0x20,0x93,0xE0,0xF2,0x20,0x04,0x20,0x08,0xA0,0x30,0x40}; -const u8g_fntpgm_uint8_t fontpage_204_175_175[45] U8G_FONT_SECTION("fontpage_204_175_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F, - 0x80,0x00,0x00,0xFF,0xE0,0x24,0x00,0x27,0x80,0x54,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_204_194_194[45] U8G_FONT_SECTION("fontpage_204_194_194") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC2,0xC2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xF7,0xC0,0x91,0x00,0x91,0x00,0xFF, - 0xE0,0x90,0x80,0x9F,0xE0,0x94,0x80,0xF2,0x80,0x00,0x80,0x03,0x80}; -const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xE0,0xFF,0x00,0x55,0xE0,0x7D,0x40,0x55, - 0x40,0xFF,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40}; -const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x02,0x00,0x3F,0xC0,0x22,0x40,0x3F, - 0xC0,0x22,0x40,0x3F,0xC0,0x0A,0x00,0x04,0x00,0x1B,0x00,0xE0,0xE0}; -const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, - 0xE0,0x48,0x00,0x7F,0xC0,0x4A,0x40,0x79,0x80,0xC9,0x80,0x0E,0x60}; -const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x30, - 0x80,0x5F,0x80,0x90,0x80,0x1F,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; -const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206_255_255") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0xC0,0x27,0x00,0xFC,0x00,0x24,0x00,0x27, - 0xC0,0x74,0x40,0x6E,0x40,0xA5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; -const u8g_fntpgm_uint8_t fontpage_207_241_241[45] U8G_FONT_SECTION("fontpage_207_241_241") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x71, - 0x00,0x69,0x00,0xA7,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x21,0x00,0x2F,0xE0,0xF0,0x00,0x22, - 0x80,0x74,0x40,0x6A,0xA0,0xA2,0x80,0x21,0x00,0x22,0x80,0x2C,0x60}; -const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0xF4,0x40,0x2A,0x80,0x21, - 0x00,0x72,0x80,0x6C,0x60,0xA7,0xC0,0x24,0x40,0x24,0x40,0x27,0xC0}; -const u8g_fntpgm_uint8_t fontpage_209_157_157[45] U8G_FONT_SECTION("fontpage_209_157_157") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9D,0x9D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x00,0x27,0xE0,0x5A,0x40,0x51,0x80,0xDE, - 0x60,0x51,0x00,0x5F,0xE0,0x51,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; -const u8g_fntpgm_uint8_t fontpage_209_196_196[45] U8G_FONT_SECTION("fontpage_209_196_196") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x20,0x80,0x7F,0xC0,0x24, - 0x80,0xFF,0xE0,0x24,0x80,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC4,0x60}; -const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x2F,0xE0,0xFA,0xA0,0x2F,0xE0,0x2A, - 0xA0,0x3F,0xE0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40}; -const u8g_fntpgm_uint8_t fontpage_212_217_217[45] U8G_FONT_SECTION("fontpage_212_217_217") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0x40,0x2A,0xA0,0xF4,0x40,0x27,0xC0,0x38, - 0x20,0x27,0xC0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x22,0x80,0x2F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_212_223_223[45] U8G_FONT_SECTION("fontpage_212_223_223") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x25,0x40,0x29,0xA0,0xFF,0x40,0x25,0x20,0x6F, - 0xE0,0x75,0x40,0xAF,0xE0,0xA5,0x40,0x26,0xA0,0x29,0x60,0x32,0x20}; -const u8g_fntpgm_uint8_t fontpage_213_162_162[45] U8G_FONT_SECTION("fontpage_213_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x22,0x80,0xF4,0x40,0x2B,0xA0,0x60, - 0x00,0x7E,0xE0,0xAA,0xA0,0xAE,0xE0,0x24,0x40,0x2A,0xC0,0x31,0x20}; -const u8g_fntpgm_uint8_t fontpage_214_226_227[71] U8G_FONT_SECTION("fontpage_214_226_227") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE3,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, - 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xFF,0xC0,0x0B,0x0A,0x14, - 0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x04,0x00,0x24,0x00,0x27,0xC0,0x24,0x00,0x24, - 0x00,0x24,0x00,0x24,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_229_229") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x27,0xC0,0x24,0x00,0x24,0x00,0xFF, - 0xE0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xF8,0x00}; -const u8g_fntpgm_uint8_t fontpage_214_248_248[45] U8G_FONT_SECTION("fontpage_214_248_248") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x43,0xC0,0xF0,0x40,0x93,0xC0,0xF8,0x40,0x8F, - 0xE0,0xFC,0xA0,0x20,0x80,0xBB,0xE0,0xA2,0xA0,0xBA,0xE0,0xE0,0x80}; -const u8g_fntpgm_uint8_t fontpage_215_188_188[45] U8G_FONT_SECTION("fontpage_215_188_188") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xC0,0xFD,0x40,0x11,0x40,0xFF,0x60,0x84, - 0x00,0x7B,0xE0,0x01,0x40,0x79,0x40,0x4A,0x80,0x4D,0x40,0x82,0x20}; -const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xF6, - 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xB4,0x40,0xC4,0x40,0x83,0xC0}; -const u8g_fntpgm_uint8_t fontpage_217_146_146[45] U8G_FONT_SECTION("fontpage_217_146_146") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x23,0xC0,0x84,0x40,0x59,0x40,0x10, - 0x80,0x27,0xC0,0x24,0x40,0xC2,0x80,0x41,0x00,0x46,0x80,0x58,0x60}; -const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_136_136") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xE0,0x14, - 0x20,0x27,0xE0,0x24,0x20,0xC7,0xE0,0x44,0x20,0x44,0x20,0x44,0x60}; -const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_225_225") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, - 0x40,0x29,0x20,0x25,0x40,0xC5,0x80,0x49,0x00,0x42,0x80,0x5C,0x60}; -const u8g_fntpgm_uint8_t fontpage_220_133_133[45] U8G_FONT_SECTION("fontpage_220_133_133") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x2F,0xE0,0x01,0x00,0x97,0xC0,0x51, - 0x00,0x2F,0xE0,0x24,0x40,0xC7,0x40,0x45,0xC0,0x44,0x40,0x44,0xC0}; -const u8g_fntpgm_uint8_t fontpage_220_172_172[45] U8G_FONT_SECTION("fontpage_220_172_172") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4E,0x20,0x2A,0xA0,0x0A,0xA0,0x8E,0xA0,0x5A, - 0xA0,0x2E,0xA0,0x2A,0xA0,0xCA,0xA0,0x4E,0x20,0x4A,0x20,0x51,0x60}; -const u8g_fntpgm_uint8_t fontpage_221_144_144[45] U8G_FONT_SECTION("fontpage_221_144_144") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x28,0x80,0x8B,0xE0,0x4A,0x20,0x1B, - 0xE0,0x2A,0x20,0x2B,0xE0,0xC8,0x80,0x4A,0xC0,0x54,0xA0,0x69,0xA0}; -const u8g_fntpgm_uint8_t fontpage_221_150_150[45] U8G_FONT_SECTION("fontpage_221_150_150") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x85,0x00,0x4F,0xE0,0x99,0x00,0x4F,0xC0,0x49, - 0x00,0xCF,0xC0,0x49,0x00,0x4F,0xE0,0x04,0x00,0xFF,0xE0,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_221_171_171[45] U8G_FONT_SECTION("fontpage_221_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x25,0x40,0x06,0xC0,0x84,0x40,0x47, - 0xC0,0x20,0x00,0x2F,0xE0,0xCA,0xA0,0x4A,0xA0,0x4A,0xA0,0x5F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x80,0x3E,0x80,0x12,0xE0,0x9E,0xA0,0x53, - 0xA0,0x3E,0xA0,0x28,0xA0,0xDF,0xA0,0x4A,0x40,0x52,0xA0,0x65,0x20}; -const u8g_fntpgm_uint8_t fontpage_226_161_161[45] U8G_FONT_SECTION("fontpage_226_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0x7F,0xE0,0xAA,0x80,0x2A,0x80,0xFF, - 0xE0,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x12,0x40,0x49,0x20,0x89,0x20}; -const u8g_fntpgm_uint8_t fontpage_227_177_177[45] U8G_FONT_SECTION("fontpage_227_177_177") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xF9,0x00,0x23,0xC0,0xFD,0x40,0x53, - 0x40,0xA9,0x40,0xFA,0xE0,0x22,0x20,0xFA,0x40,0x49,0x20,0x89,0x20}; -const u8g_fntpgm_uint8_t fontpage_227_200_200[45] U8G_FONT_SECTION("fontpage_227_200_200") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xA0,0x2B,0x40,0xAC,0x80,0xB7,0xC0,0xA8, - 0x20,0x37,0xC0,0x24,0x40,0x27,0xC0,0x52,0x80,0x49,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_199_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20, - 0x00,0x20,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; -const u8g_fntpgm_uint8_t fontpage_228_233_233[45] U8G_FONT_SECTION("fontpage_228_233_233") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xA2,0x00,0xA7,0xE0,0xFA,0xA0,0xA2, - 0xA0,0x32,0xA0,0x64,0xA0,0xA9,0x20,0x22,0x20,0x25,0x20,0x28,0xC0}; -const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231_135_135") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x88,0x40,0x52,0x80,0x0C, - 0x00,0x2A,0x80,0xDF,0x40,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_234_168_168[45] U8G_FONT_SECTION("fontpage_234_168_168") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44, - 0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xC0}; -const u8g_fntpgm_uint8_t fontpage_234_204_204[45] U8G_FONT_SECTION("fontpage_234_204_204") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F, - 0xC0,0x0A,0x00,0x31,0x80,0xD1,0x60,0x11,0x00,0x21,0x00,0x41,0x00}; -const u8g_fntpgm_uint8_t fontpage_236_253_253[34] U8G_FONT_SECTION("fontpage_236_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x08,0x0B,0x0B,0x0C,0x02,0xFF,0x10,0x20,0xFF,0x81,0x81,0xFF,0x81,0x81,0x81, - 0xFF,0x81}; -const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x22,0x00,0x42,0x00,0xF7,0xC0,0x98,0x40,0x90, - 0x40,0xF4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xF0,0x40,0x91,0x80}; -const u8g_fntpgm_uint8_t fontpage_237_227_227[45] U8G_FONT_SECTION("fontpage_237_227_227") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE3,0xE3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0xA1,0x00,0xF9,0xE0,0x8A,0x00,0xFA, - 0x80,0xA0,0x40,0xFC,0x00,0x00,0x00,0x7F,0xC0,0x4A,0x40,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_237_244_244[45] U8G_FONT_SECTION("fontpage_237_244_244") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x20, - 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_160_160") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF4,0x20,0x97,0xE0,0xF4,0x80,0x94, - 0x80,0x97,0xE0,0xF4,0x80,0x94,0x80,0xF4,0xA0,0x96,0x60,0x04,0x20}; -const u8g_fntpgm_uint8_t fontpage_240_141_141[45] U8G_FONT_SECTION("fontpage_240_141_141") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xFA,0x00,0x23,0xE0,0x24,0x20,0x79, - 0x40,0xC9,0x00,0x49,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x08,0x20}; -const u8g_fntpgm_uint8_t fontpage_241_186_186[45] U8G_FONT_SECTION("fontpage_241_186_186") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBA,0xBA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xFF,0xE0,0x2A,0x20,0x22,0x80,0x77, - 0xE0,0xD4,0x80,0x5F,0xE0,0x54,0x80,0x77,0xE0,0x54,0x80,0x07,0xE0}; -const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243_251_251") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xE3,0xE0,0x24,0x20,0xFA,0x40,0x21, - 0x80,0x36,0x80,0x29,0xE0,0x62,0x20,0xA5,0x40,0x20,0x80,0x27,0x00}; -const u8g_fntpgm_uint8_t fontpage_244_205_205[45] U8G_FONT_SECTION("fontpage_244_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xEF,0xE0,0x21,0x00,0xFF,0xC0,0x21, - 0x00,0x2F,0xE0,0x34,0x40,0x6F,0xC0,0xA4,0x40,0x27,0xC0,0x2C,0x60}; -const u8g_fntpgm_uint8_t fontpage_245_239_239[45] U8G_FONT_SECTION("fontpage_245_239_239") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x81,0x00,0x45,0x20,0xF7,0xE0,0x00,0x00,0xAF, - 0xE0,0xA1,0x00,0xAF,0xE0,0x4A,0xA0,0x6A,0xA0,0x8A,0xA0,0x08,0x60}; -const u8g_fntpgm_uint8_t fontpage_246_201_201[45] U8G_FONT_SECTION("fontpage_246_201_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x7B,0xE0,0x94,0x80,0x7F,0xC0,0x04, - 0x00,0xFF,0xE0,0x01,0x00,0x7F,0xC0,0x11,0x00,0x09,0x00,0x03,0x00}; -const u8g_fntpgm_uint8_t fontpage_247_161_161[45] U8G_FONT_SECTION("fontpage_247_161_161") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x3D,0xE0,0x52,0x80,0xFF,0xE0,0x80, - 0x20,0x3F,0x80,0x20,0x80,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0}; -const u8g_fntpgm_uint8_t fontpage_247_177_177[45] U8G_FONT_SECTION("fontpage_247_177_177") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x3D,0xE0,0x4A,0x80,0x94,0x40,0x7F, - 0xC0,0x12,0x40,0x3B,0xC0,0x56,0x40,0x93,0xC0,0x12,0x40,0x13,0xC0}; -const u8g_fntpgm_uint8_t fontpage_249_251_251[45] U8G_FONT_SECTION("fontpage_249_251_251") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, - 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x03,0x80,0xFC,0x00,0x11,0x00,0x7E,0x00,0x08, - 0x00,0x11,0x00,0xFF,0x80,0x08,0x80,0x2A,0x00,0x49,0x00,0x98,0x80}; -const u8g_fntpgm_uint8_t fontpage_250_133_133[45] U8G_FONT_SECTION("fontpage_250_133_133") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xC0,0x41,0x00,0xF1,0x00,0x21, - 0x00,0x51,0x00,0xE9,0x00,0x01,0x00,0x51,0x00,0xA9,0x00,0xAF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_250_162_162[45] U8G_FONT_SECTION("fontpage_250_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x91, - 0x20,0x3E,0x00,0x08,0x80,0x7F,0xC0,0x04,0x40,0x24,0x80,0xCC,0x60}; -const u8g_fntpgm_uint8_t fontpage_250_171_171[45] U8G_FONT_SECTION("fontpage_250_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x51,0x40,0x5D,0x80,0x51,0x20,0xFD, - 0xE0,0x08,0x80,0x3F,0x00,0x08,0x80,0x7F,0xC0,0x24,0x80,0xCC,0x60}; -const u8g_fntpgm_uint8_t fontpage_250_176_176[45] U8G_FONT_SECTION("fontpage_250_176_176") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0x55,0x20,0xF5,0x20,0x25, - 0x20,0x57,0xE0,0xED,0x20,0x05,0x20,0x55,0x20,0xAF,0xE0,0xAC,0x20}; -const u8g_fntpgm_uint8_t fontpage_250_194_194[45] U8G_FONT_SECTION("fontpage_250_194_194") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC2,0xC2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0x54,0x40,0xF2,0x80,0x21, - 0x00,0x52,0x80,0xEC,0x60,0x01,0x00,0x50,0x80,0xAB,0x00,0x80,0xC0}; -const u8g_fntpgm_uint8_t fontpage_250_241_242[73] U8G_FONT_SECTION("fontpage_250_241_242") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0x57,0xE0,0xF1,0x00,0x22, - 0x40,0x57,0xA0,0xE8,0x00,0x02,0x80,0x52,0xA0,0xAC,0xA0,0xA8,0x60,0x0B,0x0B,0x16, - 0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x52,0x40,0xF7,0x80,0x21,0x40,0x57,0xE0,0xE8, - 0x80,0x02,0xC0,0x54,0xA0,0xA8,0xA0,0xA9,0x80}; -const u8g_fntpgm_uint8_t fontpage_251_160_160[45] U8G_FONT_SECTION("fontpage_251_160_160") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xC0,0x22,0x40,0x57,0x80,0xF0,0x80,0x2F, - 0xE0,0x51,0x20,0xED,0x40,0x03,0x80,0x55,0x40,0xA9,0x20,0xAF,0x20}; -const u8g_fntpgm_uint8_t fontpage_251_178_178[45] U8G_FONT_SECTION("fontpage_251_178_178") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB2,0xB2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xE0,0x24,0x20,0x55,0x60,0xF4,0xA0,0x27, - 0xE0,0x54,0xA0,0xEF,0xE0,0x05,0x20,0x55,0xE0,0xAC,0x20,0xAC,0x60}; -const u8g_fntpgm_uint8_t fontpage_251_210_210[45] U8G_FONT_SECTION("fontpage_251_210_210") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x20,0x27,0xA0,0x51,0x40,0xFF,0xE0,0x21, - 0x00,0x53,0xE0,0xEE,0x20,0x03,0xE0,0x52,0x20,0xAB,0xE0,0xAA,0x20}; -const u8g_fntpgm_uint8_t fontpage_251_218_218[45] U8G_FONT_SECTION("fontpage_251_218_218") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDA,0xDA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xC0,0x54,0x40,0xF7,0xC0,0x24, - 0x40,0x57,0xC0,0xE9,0x20,0x07,0x40,0x53,0x80,0xAD,0x40,0xAB,0x20}; -const u8g_fntpgm_uint8_t fontpage_251_232_232[45] U8G_FONT_SECTION("fontpage_251_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x58,0x20,0xFF,0xE0,0x28, - 0x00,0x5F,0xE0,0xEA,0xA0,0x0F,0xE0,0x5A,0xA0,0xAA,0xA0,0xAA,0x60}; -const u8g_fntpgm_uint8_t fontpage_252_174_174[45] U8G_FONT_SECTION("fontpage_252_174_174") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xE0,0x44,0x20,0xFB,0xE0,0x24, - 0x80,0x5D,0xE0,0xF5,0x20,0x05,0xE0,0x55,0x20,0xAD,0xE0,0xA5,0x20}; -const u8g_fntpgm_uint8_t fontpage_252_189_189[45] U8G_FONT_SECTION("fontpage_252_189_189") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xE0,0x55,0x60,0xF6,0xA0,0x25, - 0x20,0x56,0xA0,0xEF,0xE0,0x01,0x40,0x56,0xA0,0xAA,0x60,0xA9,0xC0}; -const u8g_fntpgm_uint8_t fontpage_252_252_252[45] U8G_FONT_SECTION("fontpage_252_252_252") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4A,0x40,0x4D,0xA0,0x8A,0x40,0xFD,0xA0,0x28, - 0x00,0x4F,0xE0,0xFA,0x40,0x0D,0xA0,0x5A,0x40,0xAD,0xA0,0xAF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_253_140_140[45] U8G_FONT_SECTION("fontpage_253_140_140") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x4F,0xE0,0x91,0x00,0xEF,0xE0,0x2A, - 0xA0,0x5F,0xE0,0xF4,0x40,0x07,0xC0,0x54,0x40,0xAF,0xC0,0xAC,0x60}; -const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_162_162") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA2,0xA2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xC0,0x41,0x00,0x51,0x00,0xE1, - 0x00,0x21,0x00,0x41,0x00,0xF1,0x00,0x01,0x00,0x31,0x00,0xCF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_254_238_238[45] U8G_FONT_SECTION("fontpage_254_238_238") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEE,0xEE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x4A,0x40,0x7F,0xC0,0x04,0x00,0xFF, - 0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_242_242") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x49,0x20,0x7F,0xE0,0x04,0x40,0x3F, - 0x80,0x05,0x00,0xFF,0xE0,0x30,0x80,0xDF,0x80,0x10,0x80,0x1F,0x80}; -const u8g_fntpgm_uint8_t fontpage_256_240_240[45] U8G_FONT_SECTION("fontpage_256_240_240") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0x57,0xE0,0x56,0xA0,0x75,0x20,0x56, - 0xA0,0x77,0xE0,0x51,0x00,0x52,0xC0,0xFE,0x20,0x12,0x60,0x11,0xC0}; -const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259_234_234") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEA,0xEA,0x00,0x0A,0xFF,0x00, - 0x00,0x07,0x0B,0x0B,0x0C,0x02,0xFF,0x20,0xFE,0x82,0x82,0xFE,0x82,0xFE,0x82,0x82, - 0xFE,0x82}; -const u8g_fntpgm_uint8_t fontpage_267_205_205[45] U8G_FONT_SECTION("fontpage_267_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x91,0x00,0xF9,0xE0,0x8A, - 0x80,0xFC,0x40,0x90,0x00,0xFF,0xC0,0x4A,0x40,0x4A,0x40,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_272_204_204[45] U8G_FONT_SECTION("fontpage_272_204_204") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x40,0x00,0x80,0x00,0x10,0x00,0x2F, - 0xE0,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; -const u8g_fntpgm_uint8_t fontpage_272_232_232[45] U8G_FONT_SECTION("fontpage_272_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04, - 0x00,0xFF,0xE0,0x0A,0x40,0x12,0x80,0x31,0x00,0xD4,0x80,0x18,0x60}; -const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_171_171") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x80,0x20,0x80,0xFF,0xE0,0x14,0xA0,0x2C, - 0x80,0x77,0xE0,0xAD,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; -const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x9F,0xE0,0x51,0x00,0x31,0x00,0xD7, - 0xC0,0x12,0x00,0xFF,0xE0,0x0C,0x40,0x32,0x80,0xD1,0x00,0x18,0xE0}; -const u8g_fntpgm_uint8_t fontpage_273_221_221[45] U8G_FONT_SECTION("fontpage_273_221_221") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x51,0x00,0x7F,0xE0,0x11,0x00,0xF1,0x00,0x57, - 0xC0,0x84,0x00,0xFF,0xE0,0x14,0x80,0x33,0x00,0xD5,0x80,0x18,0x60}; -const u8g_fntpgm_uint8_t fontpage_274_135_135[45] U8G_FONT_SECTION("fontpage_274_135_135") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x00,0x27,0xE0,0xF8,0x00,0x17,0xC0,0x2C, - 0x40,0x77,0xC0,0xAC,0x40,0x27,0xC0,0x2C,0x40,0x33,0x80,0x2C,0x60}; -const u8g_fntpgm_uint8_t fontpage_275_210_210[45] U8G_FONT_SECTION("fontpage_275_210_210") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x00,0x1F,0x00,0x22,0x00,0x7F,0xC0,0xA4, - 0x40,0x3F,0xC0,0x24,0x40,0x3F,0xC0,0x24,0x40,0x45,0x40,0x80,0x80}; -const u8g_fntpgm_uint8_t fontpage_276_136_136[45] U8G_FONT_SECTION("fontpage_276_136_136") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x10,0x80,0xFC,0x80,0x00,0x80,0x7F, - 0xE0,0x00,0x80,0x78,0x80,0x00,0x80,0x78,0x80,0x48,0x80,0x78,0x80}; -const u8g_fntpgm_uint8_t fontpage_276_138_138[45] U8G_FONT_SECTION("fontpage_276_138_138") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xC0,0xF2,0x40,0x02,0x40,0xF2,0x40,0x02, - 0x40,0xFF,0xC0,0x02,0x40,0xF2,0x40,0x92,0x60,0xF2,0x60,0x92,0x20}; -const u8g_fntpgm_uint8_t fontpage_276_152_152[45] U8G_FONT_SECTION("fontpage_276_152_152") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0xF7,0xC0,0x00,0x40,0xF0,0x40,0x07, - 0xC0,0xF4,0x40,0x04,0x00,0xF4,0x00,0x94,0x20,0xF4,0x20,0x93,0xE0}; -const u8g_fntpgm_uint8_t fontpage_276_173_173[45] U8G_FONT_SECTION("fontpage_276_173_173") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0x80,0xF4,0x80,0x04,0x80,0xF4,0xE0,0x08, - 0x00,0xF7,0xC0,0x04,0x40,0xF2,0x80,0x91,0x00,0xF2,0x80,0x9C,0x60}; -const u8g_fntpgm_uint8_t fontpage_276_230_230[45] U8G_FONT_SECTION("fontpage_276_230_230") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE6,0xE6,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0xC0,0xF0,0xA0,0x0F,0xE0,0xF0,0x80,0x07, - 0x80,0xF2,0x80,0x02,0x80,0xF2,0x80,0x93,0xA0,0xFC,0x60,0x90,0x20}; -const u8g_fntpgm_uint8_t fontpage_277_141_141[45] U8G_FONT_SECTION("fontpage_277_141_141") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xE0,0xF9,0x20,0x05,0x20,0xF5,0x20,0x02, - 0xE0,0xF4,0x40,0x03,0x00,0xF2,0xA0,0x96,0x20,0xFA,0x40,0x91,0xC0}; -const u8g_fntpgm_uint8_t fontpage_277_164_164[45] U8G_FONT_SECTION("fontpage_277_164_164") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0xF4,0x40,0x04,0x40,0xF7,0xC0,0x00, - 0x00,0xF7,0xC0,0x01,0x00,0xFF,0xE0,0x92,0x80,0xF4,0x40,0x98,0x20}; -const u8g_fntpgm_uint8_t fontpage_277_191_191[45] U8G_FONT_SECTION("fontpage_277_191_191") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xE0,0xF4,0x20,0x05,0x20,0xF7,0xA0,0x05, - 0x20,0xF7,0xE0,0x04,0x20,0xF7,0xA0,0x96,0xA0,0xF7,0xA0,0x98,0x60}; -const u8g_fntpgm_uint8_t fontpage_277_203_203[45] U8G_FONT_SECTION("fontpage_277_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0xFF,0xE0,0x01,0x00,0xF7,0xC0,0x01, - 0x00,0xFF,0xE0,0x04,0x40,0xF7,0xC0,0x94,0x40,0xF7,0xC0,0x94,0x40}; -const u8g_fntpgm_uint8_t fontpage_278_240_240[45] U8G_FONT_SECTION("fontpage_278_240_240") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x40,0xFF,0xE0,0x01,0x00,0xF7,0xC0,0x01, - 0x00,0xFF,0xE0,0x04,0xA0,0xFF,0xE0,0x94,0xA0,0xFE,0x40,0x95,0xA0}; -const u8g_fntpgm_uint8_t fontpage_279_128_128[45] U8G_FONT_SECTION("fontpage_279_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0xFF,0xE0,0x01,0x00,0xFF,0xE0,0x0A, - 0xA0,0xFF,0xE0,0x04,0x40,0xF7,0xC0,0x94,0x40,0xF7,0xC0,0x9C,0x60}; -const u8g_fntpgm_uint8_t fontpage_279_138_138[45] U8G_FONT_SECTION("fontpage_279_138_138") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x40,0xAE,0xA0,0x40,0x40,0xAE,0xA0,0xEA, - 0xE0,0x5E,0x40,0xA0,0xA0,0x1F,0xC0,0x69,0x00,0x06,0x00,0x79,0xE0}; -const u8g_fntpgm_uint8_t fontpage_281_199_199[45] U8G_FONT_SECTION("fontpage_281_199_199") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x88,0x00,0x5F,0xC0,0x22,0x40,0xFF,0x00,0x61, - 0xC0,0x3F,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x3F,0x00,0xE1,0xC0}; -const u8g_fntpgm_uint8_t fontpage_283_221_221[45] U8G_FONT_SECTION("fontpage_283_221_221") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7B,0xE0,0x4A,0x00,0x4A,0x00,0x7B,0xE0,0x12, - 0x20,0x52,0x20,0x5A,0x20,0x53,0xE0,0x52,0x00,0x5E,0x00,0xE3,0xE0}; -const u8g_fntpgm_uint8_t fontpage_285_202_202[45] U8G_FONT_SECTION("fontpage_285_202_202") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x24, - 0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00}; -const u8g_fntpgm_uint8_t fontpage_285_223_223[45] U8G_FONT_SECTION("fontpage_285_223_223") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xFA,0x00,0x23,0xE0,0xFD,0x20,0xA9, - 0x40,0xF9,0x00,0xA9,0x00,0xF9,0x80,0x22,0x80,0xFA,0x40,0x24,0x20}; -const u8g_fntpgm_uint8_t fontpage_285_248_248[45] U8G_FONT_SECTION("fontpage_285_248_248") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0xF8,0x80,0x23,0xE0,0xFA,0xA0,0xAA, - 0xA0,0xFA,0xA0,0xAB,0xE0,0xFA,0xA0,0x22,0xA0,0xFB,0xE0,0x22,0x20}; -const u8g_fntpgm_uint8_t fontpage_286_137_137[45] U8G_FONT_SECTION("fontpage_286_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x80,0x7D,0x40,0x11,0x00,0xFF,0xE0,0x11, - 0x00,0xFF,0x20,0x55,0x40,0x7C,0x80,0x54,0xA0,0xFF,0x60,0x12,0x20}; -const u8g_fntpgm_uint8_t fontpage_286_175_175[45] U8G_FONT_SECTION("fontpage_286_175_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xC0,0xFA,0x40,0x23,0xC0,0xF8,0x00,0xAF, - 0xE0,0xFA,0x40,0xAB,0xC0,0xFA,0x40,0x22,0xE0,0xFF,0x40,0x20,0x40}; -const u8g_fntpgm_uint8_t fontpage_286_184_184[45] U8G_FONT_SECTION("fontpage_286_184_184") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB8,0xB8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xFA,0x80,0x24,0x60,0xFB,0x80,0xAE, - 0x20,0xFA,0xA0,0xAE,0xA0,0xFA,0xA0,0x2E,0xA0,0xFA,0x20,0x2A,0x60}; -const u8g_fntpgm_uint8_t fontpage_286_201_201[45] U8G_FONT_SECTION("fontpage_286_201_201") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0xFF,0xE0,0x25,0x40,0xFF,0xC0,0xAD, - 0x40,0xFF,0xC0,0xA9,0x60,0xFF,0xE0,0x24,0x40,0xFA,0x40,0x20,0xC0}; -const u8g_fntpgm_uint8_t fontpage_287_209_209[45] U8G_FONT_SECTION("fontpage_287_209_209") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0xC0,0x27,0x00,0x24,0x00,0x07,0xE0,0xE4, - 0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xE0,0xE6, - 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_128_128[45] U8G_FONT_SECTION("fontpage_288_128_128") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x8F,0xC0,0x48,0x40,0x4F,0xC0,0x08,0x40,0xCF, - 0xC0,0x48,0x00,0x4B,0x40,0x48,0x80,0x4E,0x40,0xB0,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_159_159") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0x9F,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x3F,0xE0,0x21,0x00,0x0F,0xE0,0xE9, - 0x20,0x2F,0xE0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_163_163[45] U8G_FONT_SECTION("fontpage_288_163_163") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x2F,0xE0,0x25,0x40,0x07,0xC0,0xE5, - 0x40,0x27,0xC0,0x21,0x00,0x2F,0xE0,0x21,0x00,0x50,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_178_178[45] U8G_FONT_SECTION("fontpage_288_178_178") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB2,0xB2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x43,0x00,0x24,0x80,0x27,0xE0,0x0C,0x80,0xF7, - 0xE0,0x24,0x80,0x27,0xE0,0x24,0x80,0x27,0xE0,0x54,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_203_203[45] U8G_FONT_SECTION("fontpage_288_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x29,0x20,0x2F,0xE0,0x05,0x40,0xE7, - 0xC0,0x25,0x40,0x27,0xC0,0x21,0x00,0x2F,0xE0,0x51,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_212_212[45] U8G_FONT_SECTION("fontpage_288_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x27,0xC0,0x21,0x00,0x0F,0xE0,0xE2, - 0x80,0x2F,0xE0,0x21,0x00,0x2F,0xE0,0x21,0x00,0x51,0x00,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_288_248_248[45] U8G_FONT_SECTION("fontpage_288_248_248") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4E,0xE0,0x2A,0xA0,0x2E,0xE0,0x08,0x80,0xEA, - 0xA0,0x2F,0xE0,0x22,0x80,0x2F,0xE0,0x22,0x40,0x54,0x20,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_289_132_132[45] U8G_FONT_SECTION("fontpage_289_132_132") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x9F,0xC0,0x55,0x40,0x5F,0xC0,0x00,0x00,0xFF, - 0xE0,0x28,0x80,0x2F,0xA0,0x27,0x40,0x2A,0x80,0x52,0x40,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_289_138_138[45] U8G_FONT_SECTION("fontpage_289_138_138") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x2F,0xC0,0x28,0x40,0x1F,0xE0,0xF4, - 0xA0,0x29,0x40,0x3F,0xE0,0x22,0x00,0x27,0xC0,0x58,0xC0,0x8F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_232_232") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xE0,0xFF,0x20,0x45,0x20,0x29,0x40,0xFF, - 0x80,0x01,0x40,0x7D,0x20,0x45,0x20,0x45,0xA0,0x7D,0x40,0x45,0x00}; -const u8g_fntpgm_uint8_t fontpage_291_203_203[45] U8G_FONT_SECTION("fontpage_291_203_203") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x2A,0xA0,0xAF,0xE0,0x71,0x00,0xFF, - 0xE0,0x22,0x80,0x77,0xE0,0x69,0x00,0xA7,0xE0,0xA1,0x00,0x21,0x00}; -const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x24,0x80,0x3F, - 0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_207_207") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, - 0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; -const u8g_fntpgm_uint8_t fontpage_291_221_221[45] U8G_FONT_SECTION("fontpage_291_221_221") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x50,0x80,0x88,0x80,0x78,0x80,0x27, - 0xE0,0xF8,0x80,0x20,0x80,0xA8,0x80,0x70,0x80,0x38,0x80,0xC0,0x80}; -const u8g_fntpgm_uint8_t fontpage_292_149_149[45] U8G_FONT_SECTION("fontpage_292_149_149") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x31,0x40,0x49,0x40,0xF9,0x40,0x21, - 0x40,0xFF,0xC0,0x22,0x40,0xAA,0x40,0x72,0x40,0x3A,0x40,0xC7,0xE0}; -const u8g_fntpgm_uint8_t fontpage_294_175_175[45] U8G_FONT_SECTION("fontpage_294_175_175") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x40,0x57,0xE0,0x8A,0x40,0x7A,0x40,0x27, - 0xE0,0xF8,0x00,0x23,0xE0,0xAA,0x20,0x73,0xE0,0x3A,0x20,0xE3,0xE0}; -const u8g_fntpgm_uint8_t fontpage_294_245_245[45] U8G_FONT_SECTION("fontpage_294_245_245") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF5,0xF5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2C,0x80,0x25,0xE0,0x54,0xA0,0xFB,0xE0,0x2C, - 0xA0,0xF7,0xE0,0x24,0x80,0xB7,0xE0,0x6C,0x80,0x34,0x80,0xCB,0xE0}; -const u8g_fntpgm_uint8_t fontpage_298_247_247[45] U8G_FONT_SECTION("fontpage_298_247_247") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x3F,0x80,0x20,0x00,0x3F,0x00,0x20,0x00,0x3F, - 0x00,0x20,0x00,0xFF,0xC0,0x24,0x80,0x23,0x00,0x29,0x00,0x30,0xC0}; -const u8g_fntpgm_uint8_t fontpage_299_137_137[45] U8G_FONT_SECTION("fontpage_299_137_137") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xFB, - 0xE0,0x82,0x20,0xBF,0xA0,0x8A,0x20,0x92,0x20,0xA2,0x20,0x86,0xE0}; -const u8g_fntpgm_uint8_t fontpage_299_139_139[45] U8G_FONT_SECTION("fontpage_299_139_139") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8B,0x8B,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xFB, - 0xE0,0x80,0x20,0x9F,0x20,0x8A,0x20,0xBF,0xA0,0x8A,0x20,0x92,0xE0}; -const u8g_fntpgm_uint8_t fontpage_299_147_147[45] U8G_FONT_SECTION("fontpage_299_147_147") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xFB, - 0xE0,0x9F,0x20,0x91,0x20,0x9F,0x20,0x91,0x20,0x9F,0x20,0x80,0xE0}; -const u8g_fntpgm_uint8_t fontpage_299_220_220[45] U8G_FONT_SECTION("fontpage_299_220_220") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xF5, - 0xE0,0xAA,0xA0,0xBB,0xA0,0xAA,0xA0,0xBB,0xA0,0x8A,0x20,0xB2,0x60}; -const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF2,0x00,0x93,0xE0,0xA6,0x40,0xC1,0x80,0xA6, - 0x60,0x91,0x00,0x97,0xE0,0xD5,0x00,0xAF,0xE0,0x81,0x00,0x81,0x00}; -const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE4,0xE4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF1,0x00,0x92,0x80,0xA4,0x40,0xCB,0xA0,0xA1, - 0x00,0x9F,0xE0,0x91,0x00,0xE5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; -const u8g_fntpgm_uint8_t fontpage_301_142_142[45] U8G_FONT_SECTION("fontpage_301_142_142") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8E,0x8E,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF8,0x80,0x98,0xA0,0xAE,0xC0,0xC8,0xA0,0xAE, - 0xE0,0x92,0x00,0x97,0xC0,0xF4,0x40,0xA7,0xC0,0x84,0x40,0x87,0xC0}; -const u8g_fntpgm_uint8_t fontpage_301_217_217[45] U8G_FONT_SECTION("fontpage_301_217_217") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2A,0x80,0x3F,0xE0,0x6A,0x80,0xBF,0xC0,0x2A, - 0x80,0x3F,0xE0,0x00,0x00,0x3F,0xC0,0x08,0x80,0x07,0x00,0x78,0xE0}; -const u8g_fntpgm_uint8_t fontpage_301_226_226[45] U8G_FONT_SECTION("fontpage_301_226_226") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x80,0xFD,0x40,0x55,0xE0,0x6F,0x40,0x55, - 0xE0,0x7D,0x40,0x21,0x40,0xFD,0xE0,0xAD,0x40,0xB5,0x40,0x8D,0xE0}; -const u8g_fntpgm_uint8_t fontpage_301_251_251[45] U8G_FONT_SECTION("fontpage_301_251_251") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0xA4,0xA0,0x7F, - 0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x04,0x20,0x07,0xE0}; -const u8g_fntpgm_uint8_t fontpage_302_210_210[45] U8G_FONT_SECTION("fontpage_302_210_210") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD2,0xD2,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04, - 0x00,0xFF,0xE0,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80}; -const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_222_222") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0x0A, - 0x00,0x7B,0xC0,0x0A,0x00,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0x0A,0x00}; -const u8g_fntpgm_uint8_t fontpage_302_226_226[45] U8G_FONT_SECTION("fontpage_302_226_226") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE2,0x00,0x0A,0xFF,0x00, - 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x08,0x00,0x10,0x00,0xFF,0xC0,0x92, - 0x40,0x9E,0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0xFF,0xC0,0x80,0x40}; -const u8g_fntpgm_uint8_t fontpage_304_133_133[45] U8G_FONT_SECTION("fontpage_304_133_133") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x07,0xE0,0xF9,0x00,0x27,0xE0,0x24,0x20,0x27, - 0xE0,0x24,0x20,0x3F,0xE0,0xC4,0x20,0x07,0xE0,0x02,0x40,0x0C,0x20}; -const u8g_fntpgm_uint8_t fontpage_304_144_144[45] U8G_FONT_SECTION("fontpage_304_144_144") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x91,0x00,0x67,0xC0,0x24,0x40,0xFF, - 0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x27,0xC0,0x22,0x80,0xEC,0x60}; -const u8g_fntpgm_uint8_t fontpage_304_205_205[45] U8G_FONT_SECTION("fontpage_304_205_205") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x23,0xE0,0xFC,0x80,0xA7,0xE0,0x3A,0x20,0x4B, - 0xE0,0xB2,0x20,0x4B,0xE0,0xFE,0x20,0x4B,0xE0,0x79,0x40,0x4E,0x20}; -const u8g_fntpgm_uint8_t fontpage_304_222_222[45] U8G_FONT_SECTION("fontpage_304_222_222") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xAB,0xE0,0x70,0x80,0x23,0xE0,0xFA,0x20,0x73, - 0xE0,0xAA,0x20,0x23,0xE0,0xFA,0x20,0x23,0xE0,0x51,0x40,0x8E,0x20}; -const u8g_fntpgm_uint8_t fontpage_305_168_168[45] U8G_FONT_SECTION("fontpage_305_168_168") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xC0,0x21,0x40,0x2E,0x40,0x24,0x40,0x3F, - 0x40,0x35,0x40,0x3F,0x40,0x25,0x40,0x27,0x60,0x5C,0xA0,0x88,0x20}; -const u8g_fntpgm_uint8_t fontpage_305_253_253[45] U8G_FONT_SECTION("fontpage_305_253_253") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x52,0x00,0xAB,0xE0,0xFC,0x20,0x8B, - 0xA0,0xFA,0xA0,0x8B,0xA0,0xFA,0x40,0x92,0x20,0xAA,0x20,0xC9,0xE0}; -const u8g_fntpgm_uint8_t fontpage_306_152_152[45] U8G_FONT_SECTION("fontpage_306_152_152") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x52,0x80,0xAC,0x40,0xF8,0x20,0x8F, - 0xC0,0xF9,0x00,0x8F,0xE0,0xF9,0x00,0x95,0x40,0xB9,0x20,0xCB,0x00}; -const u8g_fntpgm_uint8_t fontpage_307_172_172[45] U8G_FONT_SECTION("fontpage_307_172_172") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x3F,0xC0,0x24,0x00,0x3F,0x80,0x24,0x00,0x3F, - 0x80,0x24,0x00,0x3F,0xE0,0x00,0x20,0x55,0x20,0x4A,0xA0,0x8A,0xC0}; -const u8g_fntpgm_uint8_t fontpage_308_197_197[45] U8G_FONT_SECTION("fontpage_308_197_197") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x54,0x00,0x7D,0xC0,0x55,0x40,0x7D, - 0xC0,0x54,0x00,0x7F,0xE0,0x5E,0xA0,0xAF,0xE0,0xAC,0x00,0x17,0xE0}; -const u8g_fntpgm_uint8_t fontpage_309_212_212[45] U8G_FONT_SECTION("fontpage_309_212_212") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x79,0x40,0x6B,0xE0,0x5A,0xA0,0xFF,0xE0,0x86, - 0xA0,0x7F,0xE0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x79,0x80,0x4F,0xE0}; -const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x1F,0x00,0x11, - 0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x40,0xC0}; -const u8g_fntpgm_uint8_t fontpage_317_195_195[45] U8G_FONT_SECTION("fontpage_317_195_195") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x11,0x00,0x1F,0x00,0x00, - 0x00,0xFF,0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0xC0,0x60}; -const u8g_fntpgm_uint8_t fontpage_317_222_222[45] U8G_FONT_SECTION("fontpage_317_222_222") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDE,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF8,0x80,0xA8,0x80,0xF8,0xE0,0xA8,0x80,0xF8, - 0x80,0x23,0xE0,0xFA,0x20,0x22,0x20,0xFA,0x20,0x52,0x20,0xAB,0xE0}; -const u8g_fntpgm_uint8_t fontpage_318_202_202[45] U8G_FONT_SECTION("fontpage_318_202_202") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x0A,0xFF,0x00, - 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x0A,0x40,0xF5,0x80,0x55, - 0x40,0x95,0xA0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xC0,0x80}; -const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510_154_154") = { - 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x08,0x00,0x00, - 0x00,0x02,0x07,0x07,0x0C,0x06,0x01,0xC0,0xC0,0x00,0x00,0x00,0xC0,0xC0}; - -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } -static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { - FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿' - FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一' - FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下' - FONTDATA_ITEM(156, 141, 141, fontpage_156_141_141), // '不' -- '不' - FONTDATA_ITEM(156, 166, 166, fontpage_156_166_166), // '並' -- '並' - FONTDATA_ITEM(156, 173, 173, fontpage_156_173_173), // '中' -- '中' - FONTDATA_ITEM(156, 187, 187, fontpage_156_187_187), // '主' -- '主' - FONTDATA_ITEM(156, 203, 203, fontpage_156_203_203), // '之' -- '之' - FONTDATA_ITEM(157, 164, 164, fontpage_157_164_164), // '交' -- '交' - FONTDATA_ITEM(157, 174, 174, fontpage_157_174_174), // '亮' -- '亮' - FONTDATA_ITEM(157, 228, 228, fontpage_157_228_228), // '令' -- '令' - FONTDATA_ITEM(157, 246, 246, fontpage_157_246_246), // '件' -- '件' - FONTDATA_ITEM(157, 253, 253, fontpage_157_253_253), // '份' -- '份' - FONTDATA_ITEM(158, 145, 145, fontpage_158_145_145), // '休' -- '休' - FONTDATA_ITEM(158, 205, 206, fontpage_158_205_206), // '位' -- '低' - FONTDATA_ITEM(158, 220, 220, fontpage_158_220_220), // '作' -- '作' - FONTDATA_ITEM(159, 155, 155, fontpage_159_155_155), // '供' -- '供' - FONTDATA_ITEM(159, 221, 221, fontpage_159_221_221), // '保' -- '保' - FONTDATA_ITEM(159, 225, 225, fontpage_159_225_225), // '信' -- '信' - FONTDATA_ITEM(160, 139, 139, fontpage_160_139_139), // '個' -- '個' - FONTDATA_ITEM(160, 188, 188, fontpage_160_188_188), // '值' -- '值' - FONTDATA_ITEM(160, 207, 207, fontpage_160_207_207), // '偏' -- '偏' - FONTDATA_ITEM(160, 220, 220, fontpage_160_220_220), // '停' -- '停' - FONTDATA_ITEM(160, 245, 245, fontpage_160_245_245), // '偵' -- '偵' - FONTDATA_ITEM(161, 153, 153, fontpage_161_153_153), // '備' -- '備' - FONTDATA_ITEM(161, 179, 179, fontpage_161_179_179), // '傳' -- '傳' - FONTDATA_ITEM(161, 190, 190, fontpage_161_190_190), // '傾' -- '傾' - FONTDATA_ITEM(162, 178, 178, fontpage_162_178_178), // '儲' -- '儲' - FONTDATA_ITEM(162, 197, 197, fontpage_162_197_197), // '充' -- '充' - FONTDATA_ITEM(162, 200, 201, fontpage_162_200_201), // '先' -- '光' - FONTDATA_ITEM(162, 229, 229, fontpage_162_229_229), // '入' -- '入' - FONTDATA_ITEM(162, 232, 232, fontpage_162_232_232), // '全' -- '全' - FONTDATA_ITEM(162, 241, 241, fontpage_162_241_241), // '共' -- '共' - FONTDATA_ITEM(162, 247, 247, fontpage_162_247_247), // '具' -- '具' - FONTDATA_ITEM(163, 151, 151, fontpage_163_151_151), // '冗' -- '冗' - FONTDATA_ITEM(163, 183, 183, fontpage_163_183_183), // '冷' -- '冷' - FONTDATA_ITEM(163, 198, 198, fontpage_163_198_198), // '准' -- '准' - FONTDATA_ITEM(163, 250, 250, fontpage_163_250_250), // '出' -- '出' - FONTDATA_ITEM(164, 134, 134, fontpage_164_134_134), // '分' -- '分' - FONTDATA_ITEM(164, 151, 151, fontpage_164_151_151), // '列' -- '列' - FONTDATA_ITEM(164, 157, 157, fontpage_164_157_157), // '初' -- '初' - FONTDATA_ITEM(164, 176, 176, fontpage_164_176_176), // '到' -- '到' - FONTDATA_ITEM(164, 182, 183, fontpage_164_182_183), // '制' -- '刷' - FONTDATA_ITEM(164, 245, 245, fontpage_164_245_245), // '創' -- '創' - FONTDATA_ITEM(165, 155, 155, fontpage_165_155_155), // '力' -- '力' - FONTDATA_ITEM(165, 160, 160, fontpage_165_160_160), // '加' -- '加' - FONTDATA_ITEM(165, 213, 213, fontpage_165_213_213), // '動' -- '動' - FONTDATA_ITEM(166, 150, 150, fontpage_166_150_150), // '化' -- '化' - FONTDATA_ITEM(166, 202, 202, fontpage_166_202_202), // '半' -- '半' - FONTDATA_ITEM(166, 212, 212, fontpage_166_212_212), // '協' -- '協' - FONTDATA_ITEM(166, 225, 225, fontpage_166_225_225), // '卡' -- '卡' - FONTDATA_ITEM(166, 240, 240, fontpage_166_240_240), // '印' -- '印' - FONTDATA_ITEM(166, 248, 248, fontpage_166_248_248), // '卸' -- '卸' - FONTDATA_ITEM(166, 251, 251, fontpage_166_251_251), // '卻' -- '卻' - FONTDATA_ITEM(167, 159, 159, fontpage_167_159_159), // '原' -- '原' - FONTDATA_ITEM(167, 205, 205, fontpage_167_205_205), // '反' -- '反' - FONTDATA_ITEM(167, 214, 214, fontpage_167_214_214), // '取' -- '取' - FONTDATA_ITEM(167, 240, 240, fontpage_167_240_240), // '台' -- '台' - FONTDATA_ITEM(168, 136, 136, fontpage_168_136_136), // '合' -- '合' - FONTDATA_ITEM(168, 166, 166, fontpage_168_166_166), // '否' -- '否' - FONTDATA_ITEM(168, 202, 202, fontpage_168_202_202), // '告' -- '告' - FONTDATA_ITEM(168, 253, 253, fontpage_168_253_253), // '命' -- '命' - FONTDATA_ITEM(169, 140, 140, fontpage_169_140_140), // '和' -- '和' - FONTDATA_ITEM(170, 223, 223, fontpage_170_223_223), // '啟' -- '啟' - FONTDATA_ITEM(171, 174, 174, fontpage_171_174_174), // '單' -- '單' - FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴' - FONTDATA_ITEM(172, 232, 232, fontpage_172_232_232), // '器' -- '器' - FONTDATA_ITEM(172, 244, 244, fontpage_172_244_244), // '噴' -- '噴' - FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回' - FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // '因' -- '因' - FONTDATA_ITEM(173, 250, 250, fontpage_173_250_250), // '固' -- '固' - FONTDATA_ITEM(174, 150, 150, fontpage_174_150_150), // '圖' -- '圖' - FONTDATA_ITEM(174, 168, 168, fontpage_174_168_168), // '在' -- '在' - FONTDATA_ITEM(175, 139, 139, fontpage_175_139_139), // '型' -- '型' - FONTDATA_ITEM(175, 247, 247, fontpage_175_247_247), // '執' -- '執' - FONTDATA_ITEM(176, 202, 202, fontpage_176_202_202), // '塊' -- '塊' - FONTDATA_ITEM(176, 235, 235, fontpage_176_235_235), // '填' -- '填' - FONTDATA_ITEM(177, 138, 138, fontpage_177_138_138), // '墊' -- '墊' - FONTDATA_ITEM(178, 150, 150, fontpage_178_150_150), // '外' -- '外' - FONTDATA_ITEM(178, 154, 154, fontpage_178_154_154), // '多' -- '多' - FONTDATA_ITEM(178, 160, 160, fontpage_178_160_160), // '夠' -- '夠' - FONTDATA_ITEM(178, 167, 167, fontpage_178_167_167), // '大' -- '大' - FONTDATA_ITEM(178, 169, 170, fontpage_178_169_170), // '天' -- '太' - FONTDATA_ITEM(178, 177, 177, fontpage_178_177_177), // '失' -- '失' - FONTDATA_ITEM(179, 203, 203, fontpage_179_203_203), // '始' -- '始' - FONTDATA_ITEM(181, 146, 146, fontpage_181_146_146), // '媒' -- '媒' - FONTDATA_ITEM(182, 208, 208, fontpage_182_208_208), // '子' -- '子' - FONTDATA_ITEM(182, 216, 216, fontpage_182_216_216), // '存' -- '存' - FONTDATA_ITEM(183, 137, 137, fontpage_183_137_137), // '安' -- '安' - FONTDATA_ITEM(183, 140, 140, fontpage_183_140_140), // '完' -- '完' - FONTDATA_ITEM(183, 154, 154, fontpage_183_154_154), // '定' -- '定' - FONTDATA_ITEM(183, 162, 162, fontpage_183_162_162), // '客' -- '客' - FONTDATA_ITEM(183, 185, 185, fontpage_183_185_185), // '容' -- '容' - FONTDATA_ITEM(184, 141, 141, fontpage_184_141_141), // '對' -- '對' - FONTDATA_ITEM(184, 143, 143, fontpage_184_143_143), // '小' -- '小' - FONTDATA_ITEM(184, 177, 177, fontpage_184_177_177), // '就' -- '就' - FONTDATA_ITEM(187, 229, 229, fontpage_187_229_229), // '工' -- '工' - FONTDATA_ITEM(187, 238, 238, fontpage_187_238_238), // '差' -- '差' - FONTDATA_ITEM(187, 242, 242, fontpage_187_242_242), // '已' -- '已' - FONTDATA_ITEM(188, 243, 243, fontpage_188_243_243), // '平' -- '平' - FONTDATA_ITEM(189, 138, 138, fontpage_189_138_138), // '床' -- '床' - FONTDATA_ITEM(189, 166, 166, fontpage_189_166_166), // '度' -- '度' - FONTDATA_ITEM(189, 226, 226, fontpage_189_226_226), // '廢' -- '廢' - FONTDATA_ITEM(189, 250, 250, fontpage_189_250_250), // '建' -- '建' - FONTDATA_ITEM(190, 149, 149, fontpage_190_149_149), // '引' -- '引' - FONTDATA_ITEM(191, 133, 133, fontpage_191_133_133), // '待' -- '待' - FONTDATA_ITEM(191, 140, 140, fontpage_191_140_140), // '後' -- '後' - FONTDATA_ITEM(191, 145, 145, fontpage_191_145_145), // '徑' -- '徑' - FONTDATA_ITEM(191, 158, 158, fontpage_191_158_158), // '從' -- '從' - FONTDATA_ITEM(191, 169, 169, fontpage_191_169_169), // '復' -- '復' - FONTDATA_ITEM(191, 174, 174, fontpage_191_174_174), // '微' -- '微' - FONTDATA_ITEM(191, 195, 195, fontpage_191_195_195), // '心' -- '心' - FONTDATA_ITEM(192, 167, 167, fontpage_192_167_167), // '性' -- '性' - FONTDATA_ITEM(192, 226, 226, fontpage_192_226_226), // '恢' -- '恢' - FONTDATA_ITEM(192, 239, 239, fontpage_192_239_239), // '息' -- '息' - FONTDATA_ITEM(195, 182, 182, fontpage_195_182_182), // '憶' -- '憶' - FONTDATA_ITEM(195, 201, 201, fontpage_195_201_201), // '應' -- '應' - FONTDATA_ITEM(196, 144, 144, fontpage_196_144_144), // '成' -- '成' - FONTDATA_ITEM(196, 182, 182, fontpage_196_182_182), // '戶' -- '戶' - FONTDATA_ITEM(196, 192, 192, fontpage_196_192_192), // '所' -- '所' - FONTDATA_ITEM(196, 199, 199, fontpage_196_199_199), // '扇' -- '扇' - FONTDATA_ITEM(196, 203, 203, fontpage_196_203_203), // '手' -- '手' - FONTDATA_ITEM(196, 211, 211, fontpage_196_211_211), // '打' -- '打' - FONTDATA_ITEM(196, 249, 249, fontpage_196_249_249), // '批' -- '批' - FONTDATA_ITEM(197, 150, 150, fontpage_197_150_150), // '抖' -- '抖' - FONTDATA_ITEM(197, 189, 189, fontpage_197_189_189), // '抽' -- '抽' - FONTDATA_ITEM(197, 212, 212, fontpage_197_212_212), // '拔' -- '拔' - FONTDATA_ITEM(198, 137, 137, fontpage_198_137_137), // '按' -- '按' - FONTDATA_ITEM(199, 137, 137, fontpage_199_137_137), // '掉' -- '掉' - FONTDATA_ITEM(199, 162, 162, fontpage_199_162_162), // '探' -- '探' - FONTDATA_ITEM(199, 165, 165, fontpage_199_165_165), // '接' -- '接' - FONTDATA_ITEM(199, 167, 167, fontpage_199_167_167), // '控' -- '控' - FONTDATA_ITEM(199, 208, 208, fontpage_199_208_208), // '提' -- '提' - FONTDATA_ITEM(199, 210, 210, fontpage_199_210_210), // '插' -- '插' - FONTDATA_ITEM(199, 219, 219, fontpage_199_219_219), // '換' -- '換' - FONTDATA_ITEM(201, 199, 199, fontpage_201_199_199), // '擇' -- '擇' - FONTDATA_ITEM(201, 202, 203, fontpage_201_202_203), // '擊' -- '擋' - FONTDATA_ITEM(201, 224, 224, fontpage_201_224_224), // '擠' -- '擠' - FONTDATA_ITEM(202, 182, 182, fontpage_202_182_182), // '收' -- '收' - FONTDATA_ITEM(202, 190, 190, fontpage_202_190_190), // '放' -- '放' - FONTDATA_ITEM(202, 215, 215, fontpage_202_215_215), // '敗' -- '敗' - FONTDATA_ITEM(202, 244, 244, fontpage_202_244_244), // '整' -- '整' - FONTDATA_ITEM(202, 248, 248, fontpage_202_248_248), // '數' -- '數' - FONTDATA_ITEM(203, 153, 153, fontpage_203_153_153), // '料' -- '料' - FONTDATA_ITEM(203, 156, 156, fontpage_203_156_156), // '斜' -- '斜' - FONTDATA_ITEM(203, 176, 176, fontpage_203_176_176), // '新' -- '新' - FONTDATA_ITEM(203, 183, 183, fontpage_203_183_183), // '斷' -- '斷' - FONTDATA_ITEM(203, 188, 188, fontpage_203_188_188), // '於' -- '於' - FONTDATA_ITEM(204, 135, 135, fontpage_204_135_135), // '昇' -- '昇' - FONTDATA_ITEM(204, 142, 142, fontpage_204_142_142), // '明' -- '明' - FONTDATA_ITEM(204, 175, 175, fontpage_204_175_175), // '是' -- '是' - FONTDATA_ITEM(204, 194, 194, fontpage_204_194_194), // '時' -- '時' - FONTDATA_ITEM(205, 171, 171, fontpage_205_171_171), // '暫' -- '暫' - FONTDATA_ITEM(205, 244, 244, fontpage_205_244_244), // '更' -- '更' - FONTDATA_ITEM(206, 128, 128, fontpage_206_128_128), // '最' -- '最' - FONTDATA_ITEM(206, 137, 137, fontpage_206_137_137), // '有' -- '有' - FONTDATA_ITEM(206, 255, 255, fontpage_206_255_255), // '板' -- '板' - FONTDATA_ITEM(207, 241, 241, fontpage_207_241_241), // '柱' -- '柱' - FONTDATA_ITEM(208, 161, 161, fontpage_208_161_161), // '校' -- '校' - FONTDATA_ITEM(208, 188, 188, fontpage_208_188_188), // '格' -- '格' - FONTDATA_ITEM(209, 157, 157, fontpage_209_157_157), // '條' -- '條' - FONTDATA_ITEM(209, 196, 196, fontpage_209_196_196), // '棄' -- '棄' - FONTDATA_ITEM(211, 253, 253, fontpage_211_253_253), // '槽' -- '槽' - FONTDATA_ITEM(212, 217, 217, fontpage_212_217_217), // '橙' -- '橙' - FONTDATA_ITEM(212, 223, 223, fontpage_212_223_223), // '機' -- '機' - FONTDATA_ITEM(213, 162, 162, fontpage_213_162_162), // '檢' -- '檢' - FONTDATA_ITEM(214, 226, 227, fontpage_214_226_227), // '止' -- '正' - FONTDATA_ITEM(214, 229, 229, fontpage_214_229_229), // '步' -- '步' - FONTDATA_ITEM(214, 248, 248, fontpage_214_248_248), // '歸' -- '歸' - FONTDATA_ITEM(215, 188, 188, fontpage_215_188_188), // '殼' -- '殼' - FONTDATA_ITEM(215, 212, 212, fontpage_215_212_212), // '比' -- '比' - FONTDATA_ITEM(217, 146, 146, fontpage_217_146_146), // '沒' -- '沒' - FONTDATA_ITEM(219, 136, 136, fontpage_219_136_136), // '消' -- '消' - FONTDATA_ITEM(219, 225, 225, fontpage_219_225_225), // '淡' -- '淡' - FONTDATA_ITEM(220, 133, 133, fontpage_220_133_133), // '清' -- '清' - FONTDATA_ITEM(220, 172, 172, fontpage_220_172_172), // '測' -- '測' - FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // '源' -- '源' - FONTDATA_ITEM(221, 150, 150, fontpage_221_150_150), // '準' -- '準' - FONTDATA_ITEM(221, 171, 171, fontpage_221_171_171), // '溫' -- '溫' - FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // '激' -- '激' - FONTDATA_ITEM(226, 161, 161, fontpage_226_161_161), // '無' -- '無' - FONTDATA_ITEM(227, 177, 177, fontpage_227_177_177), // '熱' -- '熱' - FONTDATA_ITEM(227, 200, 200, fontpage_227_200_200), // '燈' -- '燈' - FONTDATA_ITEM(228, 199, 199, fontpage_228_199_199), // '片' -- '片' - FONTDATA_ITEM(228, 233, 233, fontpage_228_233_233), // '物' -- '物' - FONTDATA_ITEM(231, 135, 135, fontpage_231_135_135), // '率' -- '率' - FONTDATA_ITEM(234, 168, 168, fontpage_234_168_168), // '用' -- '用' - FONTDATA_ITEM(234, 204, 204, fontpage_234_204_204), // '界' -- '界' - FONTDATA_ITEM(236, 253, 253, fontpage_236_253_253), // '白' -- '白' - FONTDATA_ITEM(237, 132, 132, fontpage_237_132_132), // '的' -- '的' - FONTDATA_ITEM(237, 227, 227, fontpage_237_227_227), // '監' -- '監' - FONTDATA_ITEM(237, 244, 244, fontpage_237_244_244), // '直' -- '直' - FONTDATA_ITEM(238, 160, 160, fontpage_238_160_160), // '眠' -- '眠' - FONTDATA_ITEM(240, 141, 141, fontpage_240_141_141), // '砍' -- '砍' - FONTDATA_ITEM(241, 186, 186, fontpage_241_186_186), // '確' -- '確' - FONTDATA_ITEM(243, 251, 251, fontpage_243_251_251), // '移' -- '移' - FONTDATA_ITEM(244, 205, 205, fontpage_244_205_205), // '積' -- '積' - FONTDATA_ITEM(245, 239, 239, fontpage_245_239_239), // '端' -- '端' - FONTDATA_ITEM(246, 201, 201, fontpage_246_201_201), // '等' -- '等' - FONTDATA_ITEM(247, 161, 161, fontpage_247_161_161), // '管' -- '管' - FONTDATA_ITEM(247, 177, 177, fontpage_247_177_177), // '箱' -- '箱' - FONTDATA_ITEM(249, 251, 251, fontpage_249_251_251), // '系' -- '系' - FONTDATA_ITEM(250, 133, 133, fontpage_250_133_133), // '紅' -- '紅' - FONTDATA_ITEM(250, 162, 162, fontpage_250_162_162), // '索' -- '索' - FONTDATA_ITEM(250, 171, 171, fontpage_250_171_171), // '紫' -- '紫' - FONTDATA_ITEM(250, 176, 176, fontpage_250_176_176), // '細' -- '細' - FONTDATA_ITEM(250, 194, 194, fontpage_250_194_194), // '終' -- '終' - FONTDATA_ITEM(250, 241, 242, fontpage_250_241_242), // '統' -- '絲' - FONTDATA_ITEM(251, 160, 160, fontpage_251_160_160), // '綠' -- '綠' - FONTDATA_ITEM(251, 178, 178, fontpage_251_178_178), // '網' -- '網' - FONTDATA_ITEM(251, 210, 210, fontpage_251_210_210), // '緒' -- '緒' - FONTDATA_ITEM(251, 218, 218, fontpage_251_218_218), // '線' -- '線' - FONTDATA_ITEM(251, 232, 232, fontpage_251_232_232), // '編' -- '編' - FONTDATA_ITEM(252, 174, 174, fontpage_252_174_174), // '縮' -- '縮' - FONTDATA_ITEM(252, 189, 189, fontpage_252_189_189), // '總' -- '總' - FONTDATA_ITEM(252, 252, 252, fontpage_252_252_252), // '繼' -- '繼' - FONTDATA_ITEM(253, 140, 140, fontpage_253_140_140), // '續' -- '續' - FONTDATA_ITEM(253, 162, 162, fontpage_253_162_162), // '红' -- '红' - FONTDATA_ITEM(254, 238, 238, fontpage_254_238_238), // '置' -- '置' - FONTDATA_ITEM(254, 242, 242, fontpage_254_242_242), // '署' -- '署' - FONTDATA_ITEM(256, 240, 240, fontpage_256_240_240), // '聰' -- '聰' - FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自' - FONTDATA_ITEM(267, 205, 205, fontpage_267_205_205), // '藍' -- '藍' - FONTDATA_ITEM(272, 204, 204, fontpage_272_204_204), // '行' -- '行' - FONTDATA_ITEM(272, 232, 232, fontpage_272_232_232), // '表' -- '表' - FONTDATA_ITEM(273, 171, 171, fontpage_273_171_171), // '被' -- '被' - FONTDATA_ITEM(273, 197, 197, fontpage_273_197_197), // '装' -- '装' - FONTDATA_ITEM(273, 221, 221, fontpage_273_221_221), // '裝' -- '裝' - FONTDATA_ITEM(274, 135, 135, fontpage_274_135_135), // '複' -- '複' - FONTDATA_ITEM(275, 210, 210, fontpage_275_210_210), // '角' -- '角' - FONTDATA_ITEM(276, 136, 136, fontpage_276_136_136), // '計' -- '計' - FONTDATA_ITEM(276, 138, 138, fontpage_276_138_138), // '訊' -- '訊' - FONTDATA_ITEM(276, 152, 152, fontpage_276_152_152), // '記' -- '記' - FONTDATA_ITEM(276, 173, 173, fontpage_276_173_173), // '設' -- '設' - FONTDATA_ITEM(276, 230, 230, fontpage_276_230_230), // '試' -- '試' - FONTDATA_ITEM(277, 141, 141, fontpage_277_141_141), // '認' -- '認' - FONTDATA_ITEM(277, 164, 164, fontpage_277_164_164), // '誤' -- '誤' - FONTDATA_ITEM(277, 191, 191, fontpage_277_191_191), // '調' -- '調' - FONTDATA_ITEM(277, 203, 203, fontpage_277_203_203), // '請' -- '請' - FONTDATA_ITEM(278, 240, 240, fontpage_278_240_240), // '議' -- '議' - FONTDATA_ITEM(279, 128, 128, fontpage_279_128_128), // '讀' -- '讀' - FONTDATA_ITEM(279, 138, 138, fontpage_279_138_138), // '變' -- '變' - FONTDATA_ITEM(281, 199, 199, fontpage_281_199_199), // '資' -- '資' - FONTDATA_ITEM(283, 221, 221, fontpage_283_221_221), // '距' -- '距' - FONTDATA_ITEM(285, 202, 202, fontpage_285_202_202), // '車' -- '車' - FONTDATA_ITEM(285, 223, 223, fontpage_285_223_223), // '軟' -- '軟' - FONTDATA_ITEM(285, 248, 248, fontpage_285_248_248), // '軸' -- '軸' - FONTDATA_ITEM(286, 137, 137, fontpage_286_137_137), // '載' -- '載' - FONTDATA_ITEM(286, 175, 175, fontpage_286_175_175), // '輯' -- '輯' - FONTDATA_ITEM(286, 184, 184, fontpage_286_184_184), // '輸' -- '輸' - FONTDATA_ITEM(286, 201, 201, fontpage_286_201_201), // '轉' -- '轉' - FONTDATA_ITEM(287, 209, 209, fontpage_287_209_209), // '近' -- '近' - FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // '返' -- '返' - FONTDATA_ITEM(288, 128, 128, fontpage_288_128_128), // '退' -- '退' - FONTDATA_ITEM(288, 159, 159, fontpage_288_159_159), // '速' -- '速' - FONTDATA_ITEM(288, 163, 163, fontpage_288_163_163), // '連' -- '連' - FONTDATA_ITEM(288, 178, 178, fontpage_288_178_178), // '進' -- '進' - FONTDATA_ITEM(288, 203, 203, fontpage_288_203_203), // '運' -- '運' - FONTDATA_ITEM(288, 212, 212, fontpage_288_212_212), // '達' -- '達' - FONTDATA_ITEM(288, 248, 248, fontpage_288_248_248), // '選' -- '選' - FONTDATA_ITEM(289, 132, 132, fontpage_289_132_132), // '還' -- '還' - FONTDATA_ITEM(289, 138, 138, fontpage_289_138_138), // '邊' -- '邊' - FONTDATA_ITEM(289, 232, 232, fontpage_289_232_232), // '部' -- '部' - FONTDATA_ITEM(291, 203, 203, fontpage_291_203_203), // '釋' -- '釋' - FONTDATA_ITEM(291, 205, 205, fontpage_291_205_205), // '重' -- '重' - FONTDATA_ITEM(291, 207, 207, fontpage_291_207_207), // '量' -- '量' - FONTDATA_ITEM(291, 221, 221, fontpage_291_221_221), // '針' -- '針' - FONTDATA_ITEM(292, 149, 149, fontpage_292_149_149), // '鈕' -- '鈕' - FONTDATA_ITEM(294, 175, 175, fontpage_294_175_175), // '錯' -- '錯' - FONTDATA_ITEM(294, 245, 245, fontpage_294_245_245), // '鍵' -- '鍵' - FONTDATA_ITEM(298, 247, 247, fontpage_298_247_247), // '長' -- '長' - FONTDATA_ITEM(299, 137, 137, fontpage_299_137_137), // '閉' -- '閉' - FONTDATA_ITEM(299, 139, 139, fontpage_299_139_139), // '開' -- '開' - FONTDATA_ITEM(299, 147, 147, fontpage_299_147_147), // '間' -- '間' - FONTDATA_ITEM(299, 220, 220, fontpage_299_220_220), // '關' -- '關' - FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // '降' -- '降' - FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除' - FONTDATA_ITEM(301, 142, 142, fontpage_301_142_142), // '階' -- '階' - FONTDATA_ITEM(301, 217, 217, fontpage_301_217_217), // '雙' -- '雙' - FONTDATA_ITEM(301, 226, 226, fontpage_301_226_226), // '離' -- '離' - FONTDATA_ITEM(301, 251, 251, fontpage_301_251_251), // '電' -- '電' - FONTDATA_ITEM(302, 210, 210, fontpage_302_210_210), // '青' -- '青' - FONTDATA_ITEM(302, 222, 222, fontpage_302_222_222), // '非' -- '非' - FONTDATA_ITEM(302, 226, 226, fontpage_302_226_226), // '面' -- '面' - FONTDATA_ITEM(304, 133, 133, fontpage_304_133_133), // '項' -- '項' - FONTDATA_ITEM(304, 144, 144, fontpage_304_144_144), // '預' -- '預' - FONTDATA_ITEM(304, 205, 205, fontpage_304_205_205), // '額' -- '額' - FONTDATA_ITEM(304, 222, 222, fontpage_304_222_222), // '類' -- '類' - FONTDATA_ITEM(305, 168, 168, fontpage_305_168_168), // '風' -- '風' - FONTDATA_ITEM(305, 253, 253, fontpage_305_253_253), // '飽' -- '飽' - FONTDATA_ITEM(306, 152, 152, fontpage_306_152_152), // '餘' -- '餘' - FONTDATA_ITEM(307, 172, 172, fontpage_307_172_172), // '馬' -- '馬' - FONTDATA_ITEM(308, 197, 197, fontpage_308_197_197), // '驅' -- '驅' - FONTDATA_ITEM(309, 212, 212, fontpage_309_212_212), // '體' -- '體' - FONTDATA_ITEM(309, 216, 216, fontpage_309_216_216), // '高' -- '高' - FONTDATA_ITEM(317, 195, 195, fontpage_317_195_195), // '黃' -- '黃' - FONTDATA_ITEM(317, 222, 222, fontpage_317_222_222), // '點' -- '點' - FONTDATA_ITEM(318, 202, 202, fontpage_318_202_202), // '齊' -- '齊' - FONTDATA_ITEM(510, 154, 154, fontpage_510_154_154), // ':' -- ':' -}; diff --git a/Marlin/src/lcd/dogm/language_data_an.h b/Marlin/src/lcd/dogm/language_data_an.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_an.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_bg.h b/Marlin/src/lcd/dogm/language_data_bg.h new file mode 100644 index 0000000000..5ea82240aa --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_bg.h @@ -0,0 +1,77 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_8_144_149[96] U8G_FONT_SECTION("fontpage_8_144_149") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x95,0x00,0x07,0xff,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50, + 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8 + }; +const u8g_fntpgm_uint8_t fontpage_8_151_152[43] U8G_FONT_SECTION("fontpage_8_151_152") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x98,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_8_154_164[160] U8G_FONT_SECTION("fontpage_8_154_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0xa4,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88, + 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, + 0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, + 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20 + }; +const u8g_fntpgm_uint8_t fontpage_8_166_166[32] U8G_FONT_SECTION("fontpage_8_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x07,0xfe,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08 + }; +const u8g_fntpgm_uint8_t fontpage_8_175_195[260] U8G_FONT_SECTION("fontpage_8_175_195") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc3,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88, + 0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xa8, + 0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xd8, + 0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_197_200[63] U8G_FONT_SECTION("fontpage_8_197_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc8,0x00,0x05,0xfe,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07,0x06, + 0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xf8}; +const u8g_fntpgm_uint8_t fontpage_8_202_202[28] U8G_FONT_SECTION("fontpage_8_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xc0,0x40,0x70,0x48,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xcf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06, + 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 144, 149, fontpage_8_144_149), // 'А' -- 'Е' + FONTDATA_ITEM(8, 151, 152, fontpage_8_151_152), // 'З' -- 'И' + FONTDATA_ITEM(8, 154, 164, fontpage_8_154_164), // 'К' -- 'Ф' + FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц' + FONTDATA_ITEM(8, 175, 195, fontpage_8_175_195), // 'Я' -- 'у' + FONTDATA_ITEM(8, 197, 200, fontpage_8_197_200), // 'х' -- 'ш' + FONTDATA_ITEM(8, 202, 202, fontpage_8_202_202), // 'ъ' -- 'ъ' + FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я' +}; diff --git a/Marlin/src/lcd/dogm/language_data_ca.h b/Marlin/src/lcd/dogm/language_data_ca.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_ca.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_cz.h b/Marlin/src/lcd/dogm/language_data_cz.h new file mode 100644 index 0000000000..5858e707b4 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_cz.h @@ -0,0 +1,52 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8d,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_143_143[33] U8G_FONT_SECTION("fontpage_2_143_143") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0x00,0x00, + 0x00,0x06,0x0a,0x0a,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88, + 0x78}; +const u8g_fntpgm_uint8_t fontpage_2_155_155[31] U8G_FONT_SECTION("fontpage_2_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0xf0,0x80,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_200_200[31] U8G_FONT_SECTION("fontpage_2_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_2_216_217[47] U8G_FONT_SECTION("fontpage_2_216_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd9,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xb0,0xc8,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_2_225_225[31] U8G_FONT_SECTION("fontpage_2_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; +const u8g_fntpgm_uint8_t fontpage_2_229_229[33] U8G_FONT_SECTION("fontpage_2_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x18}; +const u8g_fntpgm_uint8_t fontpage_2_239_239[31] U8G_FONT_SECTION("fontpage_2_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x88,0x88,0x88,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfe,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x08,0x10,0x20,0x40,0x80, + 0xf8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č' + FONTDATA_ITEM(2, 143, 143, fontpage_2_143_143), // 'ď' -- 'ď' + FONTDATA_ITEM(2, 155, 155, fontpage_2_155_155), // 'ě' -- 'ě' + FONTDATA_ITEM(2, 200, 200, fontpage_2_200_200), // 'ň' -- 'ň' + FONTDATA_ITEM(2, 216, 217, fontpage_2_216_217), // 'Ř' -- 'ř' + FONTDATA_ITEM(2, 225, 225, fontpage_2_225_225), // 'š' -- 'š' + FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'ť' -- 'ť' + FONTDATA_ITEM(2, 239, 239, fontpage_2_239_239), // 'ů' -- 'ů' + FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž' +}; diff --git a/Marlin/src/lcd/dogm/language_data_da.h b/Marlin/src/lcd/dogm/language_data_da.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_da.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_de.h b/Marlin/src/lcd/dogm/language_data_de.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_de.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_el-gr.h b/Marlin/src/lcd/dogm/language_data_el-gr.h new file mode 100644 index 0000000000..558ea2fa68 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_el-gr.h @@ -0,0 +1,86 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x80,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, + 0xf8}; +const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x9d,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0x50,0x50,0x88,0x88,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80, + 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xe0, + 0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0, + 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0xa1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa3,0xa7,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x40,0x20,0x10,0x20,0x40,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, + 0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, + 0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xaf,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0a,0x0a, + 0x06,0x00,0xfe,0x10,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, + 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xa0,0x40}; +const u8g_fntpgm_uint8_t fontpage_7_177_199[303] U8G_FONT_SECTION("fontpage_7_177_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xc7,0x00,0x09,0xfe,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, + 0x00,0xfe,0x60,0x90,0x90,0xb0,0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, + 0xfe,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, + 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70, + 0x05,0x08,0x08,0x06,0x00,0xff,0xf8,0x20,0x40,0x40,0x40,0x30,0x08,0x30,0x05,0x07, + 0x07,0x06,0x00,0xfe,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x04,0x07,0x07,0x06,0x01, + 0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02,0x00,0x80,0x80, + 0x80,0xa0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x09, + 0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xfe,0xf8,0x20,0x40,0x70,0x80, + 0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x06, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x50,0x50,0x54,0x48,0x05,0x07,0x07,0x06,0x00,0xfe, + 0x70,0x88,0x88,0xc8,0xb0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80, + 0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88,0x88,0x70,0x05, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x28,0x10,0x05,0x05,0x05,0x06,0x00,0x00, + 0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0x10,0xa8,0xa8,0xa8,0x70, + 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x50,0x20,0x50,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xce,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, + 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x01,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xa8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ' + FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν' + FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ' + FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ' + FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί' + FONTDATA_ITEM(7, 177, 199, fontpage_7_177_199), // 'α' -- 'χ' + FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω' + FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ' + FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…' +}; diff --git a/Marlin/src/lcd/dogm/language_data_el.h b/Marlin/src/lcd/dogm/language_data_el.h new file mode 100644 index 0000000000..1c7e810f6d --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_el.h @@ -0,0 +1,90 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x80,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, + 0xf8}; +const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x9d,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0x50,0x50,0x88,0x88,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80, + 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xe0, + 0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0, + 0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0xa1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa3,0xa7,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x40,0x20,0x10,0x20,0x40,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, + 0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, + 0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_169_169[30] U8G_FONT_SECTION("fontpage_7_169_169") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x50,0xd8}; +const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xaf,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0a,0x0a, + 0x06,0x00,0xfe,0x10,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, + 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xa0,0x40}; +const u8g_fntpgm_uint8_t fontpage_7_177_199[303] U8G_FONT_SECTION("fontpage_7_177_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xc7,0x00,0x09,0xfe,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, + 0x00,0xfe,0x60,0x90,0x90,0xb0,0x88,0x88,0xf0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, + 0xfe,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, + 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70, + 0x05,0x08,0x08,0x06,0x00,0xff,0xf8,0x20,0x40,0x40,0x40,0x30,0x08,0x30,0x05,0x07, + 0x07,0x06,0x00,0xfe,0xb0,0xc8,0x88,0x88,0x88,0x08,0x08,0x04,0x07,0x07,0x06,0x01, + 0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02,0x00,0x80,0x80, + 0x80,0xa0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x09, + 0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, + 0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xfe,0xf8,0x20,0x40,0x70,0x80, + 0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x06, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x50,0x50,0x54,0x48,0x05,0x07,0x07,0x06,0x00,0xfe, + 0x70,0x88,0x88,0xc8,0xb0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80, + 0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88,0x88,0x70,0x05, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x28,0x10,0x05,0x05,0x05,0x06,0x00,0x00, + 0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0x10,0xa8,0xa8,0xa8,0x70, + 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x50,0x20,0x50,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xce,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, + 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x01,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xa8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ' + FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν' + FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ' + FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ' + FONTDATA_ITEM(7, 169, 169, fontpage_7_169_169), // 'Ω' -- 'Ω' + FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί' + FONTDATA_ITEM(7, 177, 199, fontpage_7_177_199), // 'α' -- 'χ' + FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω' + FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ' + FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…' +}; diff --git a/Marlin/src/lcd/dogm/language_data_en.h b/Marlin/src/lcd/dogm/language_data_en.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_en.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_es.h b/Marlin/src/lcd/dogm/language_data_es.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_es.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_eu.h b/Marlin/src/lcd/dogm/language_data_eu.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_eu.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_fi.h b/Marlin/src/lcd/dogm/language_data_fi.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_fi.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_fr.h b/Marlin/src/lcd/dogm/language_data_fr.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_fr.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_gl.h b/Marlin/src/lcd/dogm/language_data_gl.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_gl.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_hr.h b/Marlin/src/lcd/dogm/language_data_hr.h new file mode 100644 index 0000000000..88254cdc67 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_hr.h @@ -0,0 +1,32 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8d,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_145_145[31] U8G_FONT_SECTION("fontpage_2_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x08,0x00,0x00, + 0x00,0x06,0x08,0x08,0x06,0x00,0x00,0x08,0x1c,0x08,0x78,0x88,0x88,0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_2_225_225[31] U8G_FONT_SECTION("fontpage_2_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; +const u8g_fntpgm_uint8_t fontpage_2_254_254[31] U8G_FONT_SECTION("fontpage_2_254_254") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć' + FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č' + FONTDATA_ITEM(2, 145, 145, fontpage_2_145_145), // 'đ' -- 'đ' + FONTDATA_ITEM(2, 225, 225, fontpage_2_225_225), // 'š' -- 'š' + FONTDATA_ITEM(2, 254, 254, fontpage_2_254_254), // 'ž' -- 'ž' +}; diff --git a/Marlin/src/lcd/dogm/language_data_it.h b/Marlin/src/lcd/dogm/language_data_it.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_it.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_jp-kana.h b/Marlin/src/lcd/dogm/language_data_jp-kana.h new file mode 100644 index 0000000000..2a2229e27e --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_jp-kana.h @@ -0,0 +1,116 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_97_161_164[61] U8G_FONT_SECTION("fontpage_97_161_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa4,0x00,0x06,0x00,0x00, + 0x00,0x04,0x04,0x04,0x06,0x00,0x00,0xf0,0x10,0x60,0x40,0x05,0x06,0x06,0x06,0x00, + 0x00,0xf8,0x08,0x28,0x30,0x20,0x40,0x03,0x04,0x04,0x06,0x01,0x00,0x20,0x40,0xc0, + 0x40,0x04,0x06,0x06,0x06,0x00,0x00,0x10,0x20,0x60,0xa0,0x20,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_166_166[29] U8G_FONT_SECTION("fontpage_97_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x88,0x08,0x10,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_168_168[28] U8G_FONT_SECTION("fontpage_97_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0xf8}; +const u8g_fntpgm_uint8_t fontpage_97_170_181[167] U8G_FONT_SECTION("fontpage_97_170_181") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xb5,0x00,0x08,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xf8,0x30,0x50,0x90,0x10,0x05,0x06,0x06, + 0x06,0x00,0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x28, + 0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20, + 0xf8,0x20,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x20,0xf8,0x20,0xf8,0x20, + 0x20,0x04,0x05,0x05,0x06,0x00,0x00,0x70,0x90,0x10,0x20,0xc0,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0x70,0x90,0x10,0x20,0xc0,0x05,0x06,0x06,0x06,0x00,0x00,0x40, + 0x78,0x90,0x10,0x10,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x40,0x78,0x90, + 0x10,0x10,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08,0x08,0xf8,0x05,0x07, + 0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x08,0xf8,0x05,0x06,0x06,0x06,0x00, + 0x00,0x50,0xf8,0x50,0x10,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_97_183_187[77] U8G_FONT_SECTION("fontpage_97_183_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xbb,0x00,0x07,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xc0,0x08,0xc8,0x10,0xe0,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0xc0,0x08,0xc8,0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, + 0x10,0x20,0x50,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x10,0x20,0x50, + 0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8,0x48,0x50,0x40,0x38}; +const u8g_fntpgm_uint8_t fontpage_97_189_193[77] U8G_FONT_SECTION("fontpage_97_189_193") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xc1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x05,0x05,0x06,0x00,0x00,0x78, + 0x48,0xa8,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0x78,0x48,0xa8,0x10, + 0x60,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xe0,0x20,0xf8,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_97_195_196[38] U8G_FONT_SECTION("fontpage_97_195_196") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc4,0x00,0x05,0x00,0x00, + 0x00,0x05,0x04,0x04,0x06,0x00,0x00,0xa8,0xa8,0x08,0x30,0x05,0x05,0x05,0x06,0x00, + 0x00,0xa8,0xa8,0x08,0x10,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_198_211[190] U8G_FONT_SECTION("fontpage_97_198_211") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xd3,0x00,0x08,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x05,0x08,0x08, + 0x06,0x00,0x00,0x28,0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x03,0x06,0x06,0x06,0x01, + 0x00,0x80,0x80,0xc0,0xa0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0x00,0x50,0x00,0x80, + 0x80,0xc0,0xa0,0x80,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0x20,0x40, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x00,0x00,0x00,0xf8,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x08,0x50,0x20,0xd0,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x10, + 0x20,0x70,0xa8,0x03,0x06,0x06,0x06,0x01,0x00,0x20,0x20,0x20,0x20,0x40,0x80,0x05, + 0x05,0x05,0x06,0x00,0x00,0x10,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00, + 0x28,0x00,0x10,0x88,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x18,0x18,0x00, + 0x10,0x88,0x88,0x88,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0xf8,0x80,0x80, + 0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x80,0x80,0xf8,0x80,0x80,0x78}; +const u8g_fntpgm_uint8_t fontpage_97_213_217[77] U8G_FONT_SECTION("fontpage_97_213_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd9,0x00,0x08,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x08,0x08,0x06,0x00,0x00,0x18, + 0x18,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x04,0x04,0x06,0x00,0x01,0x40,0xa0,0x10, + 0x08,0x05,0x06,0x06,0x06,0x00,0x01,0x28,0x00,0x40,0xa0,0x10,0x08}; +const u8g_fntpgm_uint8_t fontpage_97_219_220[43] U8G_FONT_SECTION("fontpage_97_219_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdc,0x00,0x08,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20,0x05,0x08,0x08, + 0x06,0x00,0x00,0x28,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_222_223[39] U8G_FONT_SECTION("fontpage_97_222_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xdf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x50,0x20,0x10,0x04,0x05,0x05,0x06, + 0x01,0x00,0xe0,0x00,0xe0,0x00,0xf0}; +const u8g_fntpgm_uint8_t fontpage_97_225_226[39] U8G_FONT_SECTION("fontpage_97_225_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe2,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x28,0x10,0x28,0xc0,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x40,0xf8,0x40,0x38}; +const u8g_fntpgm_uint8_t fontpage_97_228_229[39] U8G_FONT_SECTION("fontpage_97_228_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe5,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8,0x48,0x50,0x40,0x40,0x04,0x04,0x04, + 0x06,0x00,0x00,0x60,0x20,0x20,0xf0}; +const u8g_fntpgm_uint8_t fontpage_97_231_237[96] U8G_FONT_SECTION("fontpage_97_231_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xed,0x00,0x06,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x00,0x00,0xf0,0x10,0xf0,0x10,0xf0,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x08,0xf8,0x08,0xf8,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0xf8, + 0x08,0x10,0x20,0x04,0x06,0x06,0x06,0x00,0x00,0x90,0x90,0x90,0x90,0x10,0x20,0x05, + 0x05,0x05,0x06,0x00,0x00,0x20,0xa0,0xa8,0xa8,0xb0,0x04,0x05,0x05,0x06,0x00,0x00, + 0x80,0x80,0x90,0xa0,0xc0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0xf8 + }; +const u8g_fntpgm_uint8_t fontpage_97_242_243[39] U8G_FONT_SECTION("fontpage_97_242_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf3,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x30,0x05,0x05,0x05,0x06, + 0x00,0x00,0xc0,0x08,0x08,0x10,0xe0}; +const u8g_fntpgm_uint8_t fontpage_97_252_252[24] U8G_FONT_SECTION("fontpage_97_252_252") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x03,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x02,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(97, 161, 164, fontpage_97_161_164), // 'ァ' -- 'イ' + FONTDATA_ITEM(97, 166, 166, fontpage_97_166_166), // 'ウ' -- 'ウ' + FONTDATA_ITEM(97, 168, 168, fontpage_97_168_168), // 'エ' -- 'エ' + FONTDATA_ITEM(97, 170, 181, fontpage_97_170_181), // 'オ' -- 'サ' + FONTDATA_ITEM(97, 183, 187, fontpage_97_183_187), // 'シ' -- 'セ' + FONTDATA_ITEM(97, 189, 193, fontpage_97_189_193), // 'ソ' -- 'チ' + FONTDATA_ITEM(97, 195, 196, fontpage_97_195_196), // 'ッ' -- 'ツ' + FONTDATA_ITEM(97, 198, 211, fontpage_97_198_211), // 'テ' -- 'ビ' + FONTDATA_ITEM(97, 213, 217, fontpage_97_213_217), // 'フ' -- 'ベ' + FONTDATA_ITEM(97, 219, 220, fontpage_97_219_220), // 'ホ' -- 'ボ' + FONTDATA_ITEM(97, 222, 223, fontpage_97_222_223), // 'マ' -- 'ミ' + FONTDATA_ITEM(97, 225, 226, fontpage_97_225_226), // 'メ' -- 'モ' + FONTDATA_ITEM(97, 228, 229, fontpage_97_228_229), // 'ヤ' -- 'ュ' + FONTDATA_ITEM(97, 231, 237, fontpage_97_231_237), // 'ョ' -- 'ロ' + FONTDATA_ITEM(97, 242, 243, fontpage_97_242_243), // 'ヲ' -- 'ン' + FONTDATA_ITEM(97, 252, 252, fontpage_97_252_252), // 'ー' -- 'ー' +}; diff --git a/Marlin/src/lcd/dogm/language_data_nl.h b/Marlin/src/lcd/dogm/language_data_nl.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_nl.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_pl.h b/Marlin/src/lcd/dogm/language_data_pl.h new file mode 100644 index 0000000000..2f2e48e4b0 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_pl.h @@ -0,0 +1,39 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_133_133[30] U8G_FONT_SECTION("fontpage_2_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x05,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x08,0x78,0x88,0x78,0x20,0x30}; +const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_153_153[30] U8G_FONT_SECTION("fontpage_2_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x05,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0xf0,0x80,0x70,0x20,0x30}; +const u8g_fntpgm_uint8_t fontpage_2_193_196[73] U8G_FONT_SECTION("fontpage_2_193_196") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xc4,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0x60,0xc0,0x40,0x40,0x78,0x03,0x07, + 0x07,0x06,0x01,0x00,0xc0,0x40,0x60,0xc0,0x40,0x40,0xe0,0x05,0x0a,0x0a,0x06,0x00, + 0x00,0x10,0x20,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x08,0x08,0x06,0x00, + 0x00,0x10,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_2_218_219[47] U8G_FONT_SECTION("fontpage_2_218_219") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xda,0xdb,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; +const u8g_fntpgm_uint8_t fontpage_2_252_252[30] U8G_FONT_SECTION("fontpage_2_252_252") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 133, 133, fontpage_2_133_133), // 'ą' -- 'ą' + FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć' + FONTDATA_ITEM(2, 153, 153, fontpage_2_153_153), // 'ę' -- 'ę' + FONTDATA_ITEM(2, 193, 196, fontpage_2_193_196), // 'Ł' -- 'ń' + FONTDATA_ITEM(2, 218, 219, fontpage_2_218_219), // 'Ś' -- 'ś' + FONTDATA_ITEM(2, 252, 252, fontpage_2_252_252), // 'ż' -- 'ż' +}; diff --git a/Marlin/src/lcd/dogm/language_data_pt-br.h b/Marlin/src/lcd/dogm/language_data_pt-br.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_pt-br.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_pt.h b/Marlin/src/lcd/dogm/language_data_pt.h new file mode 100644 index 0000000000..51210a4394 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_pt.h @@ -0,0 +1,9 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {}; diff --git a/Marlin/src/lcd/dogm/language_data_ru.h b/Marlin/src/lcd/dogm/language_data_ru.h new file mode 100644 index 0000000000..43650b54dd --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_ru.h @@ -0,0 +1,78 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_8_144_152[135] U8G_FONT_SECTION("fontpage_8_144_152") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x98,0x00,0x07,0xff,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50, + 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8, + 0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x70,0xa8,0xa8,0x05,0x07,0x07, + 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_8_154_168[214] U8G_FONT_SECTION("fontpage_8_154_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0xa8,0x00,0x07,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88, + 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8, + 0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88, + 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20, + 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09, + 0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x07,0x07,0x06, + 0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xa8, + 0xa8,0xa8,0xa8,0xa8,0xa8,0xf8}; +const u8g_fntpgm_uint8_t fontpage_8_171_173[56] U8G_FONT_SECTION("fontpage_8_171_173") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xad,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xc8,0xa8,0xa8,0xc8,0x04,0x07, + 0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x08,0x78,0x08,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_175_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc9,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88, + 0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xa8, + 0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xd8, + 0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,0xa8,0xa8,0xa8, + 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8, + 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08}; +const u8g_fntpgm_uint8_t fontpage_8_203_207[72] U8G_FONT_SECTION("fontpage_8_203_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06, + 0x01,0x00,0x80,0x80,0xe0,0x90,0xe0,0x04,0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70, + 0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05, + 0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90}; +const u8g_fntpgm_uint8_t fontpage_8_209_209[30] U8G_FONT_SECTION("fontpage_8_209_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xf0,0x80,0x70}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 144, 152, fontpage_8_144_152), // 'А' -- 'И' + FONTDATA_ITEM(8, 154, 168, fontpage_8_154_168), // 'К' -- 'Ш' + FONTDATA_ITEM(8, 171, 173, fontpage_8_171_173), // 'Ы' -- 'Э' + FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ' + FONTDATA_ITEM(8, 203, 207, fontpage_8_203_207), // 'ы' -- 'я' + FONTDATA_ITEM(8, 209, 209, fontpage_8_209_209), // 'ё' -- 'ё' +}; diff --git a/Marlin/src/lcd/dogm/language_data_sk.h b/Marlin/src/lcd/dogm/language_data_sk.h new file mode 100644 index 0000000000..37e10057c3 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_sk.h @@ -0,0 +1,60 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_140_143[79] U8G_FONT_SECTION("fontpage_2_140_143") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8f,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x06, + 0x0a,0x0a,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_2_185_186[49] U8G_FONT_SECTION("fontpage_2_185_186") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xba,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0x40,0x40, + 0xe0}; +const u8g_fntpgm_uint8_t fontpage_2_189_190[49] U8G_FONT_SECTION("fontpage_2_189_190") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbe,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0xa0,0x40,0x00,0xc0,0x40,0x40,0x40,0x40,0x40, + 0xe0}; +const u8g_fntpgm_uint8_t fontpage_2_199_200[47] U8G_FONT_SECTION("fontpage_2_199_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc8,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xb0,0xc8,0x88,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_2_212_213[47] U8G_FONT_SECTION("fontpage_2_212_213") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd5,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0xb0,0xc8,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_2_224_225[47] U8G_FONT_SECTION("fontpage_2_224_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe1,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xf0}; +const u8g_fntpgm_uint8_t fontpage_2_228_229[49] U8G_FONT_SECTION("fontpage_2_228_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe5,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x20,0x20,0x20,0x20,0x20, + 0x20,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xf8,0x20,0x20,0x20, + 0x18}; +const u8g_fntpgm_uint8_t fontpage_2_239_239[31] U8G_FONT_SECTION("fontpage_2_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x88,0x88,0x88,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfe,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x08,0x10,0x20,0x40,0x80, + 0xf8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xf8,0x10,0x20,0x40,0xf8}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 140, 143, fontpage_2_140_143), // 'Č' -- 'ď' + FONTDATA_ITEM(2, 185, 186, fontpage_2_185_186), // 'Ĺ' -- 'ĺ' + FONTDATA_ITEM(2, 189, 190, fontpage_2_189_190), // 'Ľ' -- 'ľ' + FONTDATA_ITEM(2, 199, 200, fontpage_2_199_200), // 'Ň' -- 'ň' + FONTDATA_ITEM(2, 212, 213, fontpage_2_212_213), // 'Ŕ' -- 'ŕ' + FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Š' -- 'š' + FONTDATA_ITEM(2, 228, 229, fontpage_2_228_229), // 'Ť' -- 'ť' + FONTDATA_ITEM(2, 239, 239, fontpage_2_239_239), // 'ů' -- 'ů' + FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž' +}; diff --git a/Marlin/src/lcd/dogm/language_data_test.h b/Marlin/src/lcd/dogm/language_data_test.h new file mode 100644 index 0000000000..875071abea --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_test.h @@ -0,0 +1,225 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_8_128_255[1677] U8G_FONT_SECTION("fontpage_8_128_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x00,0x0a,0xfe,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80, + 0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8, + 0x05,0x09,0x09,0x06,0x00,0xfe,0xe0,0x40,0x40,0x70,0x48,0x48,0x48,0x08,0x30,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0xf0,0x80,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xe0, + 0x40,0x40,0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40, + 0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x10,0x10,0x10,0x10, + 0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x60,0xa0,0xa0,0xb0,0xa8,0xa8,0xb0,0x05, + 0x07,0x07,0x06,0x00,0x00,0xa0,0xa0,0xa0,0xf0,0xa8,0xa8,0xb0,0x05,0x07,0x07,0x06, + 0x00,0x00,0xe0,0x40,0x40,0x70,0x48,0x48,0x48,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10, + 0x20,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40, + 0x20,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88, + 0x70,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x88, + 0x88,0x88,0x88,0x88,0x88,0xf8,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88, + 0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06, + 0x00,0xff,0x30,0x50,0x50,0x50,0x50,0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00, + 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70, + 0x20,0x70,0xa8,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a, + 0x0a,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8, + 0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20, + 0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xfe, + 0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88, + 0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8, + 0xa8,0xa8,0xf8,0x05,0x09,0x09,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8, + 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xc0,0x40,0x40,0x70,0x48,0x48,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xc8,0xa8,0xa8,0xc8,0x04,0x07,0x07,0x06, + 0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x08,0x78,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0xa8,0xa8,0xe8, + 0xa8,0xa8,0x90,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88, + 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88, + 0xf0,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06, + 0x06,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8, + 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88, + 0x98,0xa8,0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05, + 0x05,0x05,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x88,0xd8,0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88, + 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0xf8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88, + 0xf0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05, + 0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88, + 0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,0xa8, + 0xa8,0xa8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88, + 0x05,0x07,0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8, + 0xa8,0xa8,0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08, + 0x05,0x05,0x05,0x06,0x00,0x00,0xc0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90, + 0xe0,0x04,0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70,0x10,0xe0,0x05,0x05,0x05,0x06, + 0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70, + 0x50,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x09,0x09, + 0x06,0x00,0xfe,0x40,0xe0,0x40,0x70,0x48,0x48,0x48,0x08,0x10,0x05,0x08,0x08,0x06, + 0x00,0x00,0x10,0x20,0x00,0xf8,0x80,0x80,0x80,0x80,0x04,0x05,0x05,0x06,0x01,0x00, + 0x70,0x80,0xe0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xf0, + 0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x06,0x06,0x06, + 0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0xe0,0x04,0x08,0x08,0x06,0x01,0xfe,0x10,0x00, + 0x30,0x10,0x10,0x10,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00,0x60,0xa0,0xb0,0xa8, + 0xb0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0xa0,0xf0,0xa8,0xb0,0x05,0x07,0x07,0x06, + 0x00,0x00,0x40,0xe0,0x40,0x70,0x48,0x48,0x48,0x04,0x08,0x08,0x06,0x01,0x00,0x20, + 0x40,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, + 0x88,0x98,0xa8,0xc8,0x88,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x88,0x70,0x00,0x88,0x88, + 0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x88,0xf8, + 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x88,0x88,0xa8,0xa8,0xa8,0x50,0x05, + 0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xa8,0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00, + 0x40,0xf0,0x40,0x70,0x48,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xf0, + 0x40,0x70,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x98,0xa0,0xa0,0xf8,0xa0,0xa0, + 0x98,0x05,0x05,0x05,0x06,0x00,0x00,0x98,0xa0,0xf8,0xa0,0x98,0x05,0x07,0x07,0x06, + 0x00,0x00,0x20,0x50,0x50,0x88,0xf8,0xa8,0xa8,0x05,0x06,0x06,0x06,0x00,0x00,0x20, + 0x50,0x50,0x88,0xf8,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0x90,0xb8,0xf8,0xb8, + 0xb8,0xb8,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0x90,0xf8,0xb8,0xb8,0x05,0x08,0x08, + 0x06,0x00,0x00,0xf8,0x88,0x50,0x50,0x70,0xa8,0xa8,0xa8,0x05,0x06,0x06,0x06,0x00, + 0x00,0xf8,0x88,0x50,0x70,0xa8,0xa8,0x06,0x08,0x08,0x06,0x00,0x00,0xfc,0xc4,0xa8, + 0x90,0xf8,0xb8,0xb8,0xa8,0x06,0x06,0x06,0x06,0x00,0x00,0xfc,0xa8,0x90,0xf8,0xb8, + 0xa8,0x05,0x0c,0x0c,0x06,0x00,0xfe,0x50,0x20,0x00,0x70,0x88,0x08,0x30,0x08,0x08, + 0x70,0x80,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x50,0x20,0x00,0x70,0x88,0x30,0x08, + 0x70,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0x70,0x20,0x20,0x20, + 0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xf8,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20, + 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x0a,0x0a,0x06,0x00, + 0x00,0x90,0x48,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20,0x05,0x08,0x08,0x06,0x00, + 0x00,0x90,0x48,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xfe,0x40, + 0xa0,0xa0,0xb8,0xb8,0xb8,0x58,0x08,0x10,0x05,0x07,0x07,0x06,0x00,0xfe,0x58,0xb8, + 0xb8,0xb8,0x58,0x08,0x10,0x05,0x0a,0x0a,0x06,0x00,0xff,0x20,0x70,0xa8,0x88,0x88, + 0x88,0x88,0xa8,0x70,0x20,0x05,0x08,0x08,0x06,0x00,0xff,0x20,0x70,0xa8,0x88,0x88, + 0xa8,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x70,0x00,0x20,0x20,0x88,0x88,0x88, + 0xa8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0x20,0xa8,0x88,0xa8,0x50,0x05, + 0x0a,0x0a,0x06,0x00,0x00,0xf8,0xa8,0x00,0x50,0x88,0x88,0xa8,0xa8,0xa8,0x50,0x05, + 0x08,0x08,0x06,0x00,0x00,0xf8,0xa8,0x00,0x50,0x88,0xa8,0xa8,0x50}; +const u8g_fntpgm_uint8_t fontpage_97_129_191[870] U8G_FONT_SECTION("fontpage_97_129_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0xbf,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x04,0x00,0x4e,0x00,0x55,0x00,0x64, + 0x80,0x48,0x40,0xa8,0x40,0x90,0x40,0x90,0x80,0x61,0x00,0x06,0x00,0x08,0x0b,0x0b, + 0x0c,0x01,0xff,0x20,0x10,0x70,0x1c,0x28,0xe2,0x39,0x21,0x21,0x12,0x0c,0x08,0x07, + 0x07,0x0c,0x02,0xff,0x28,0x2e,0xf5,0x21,0x16,0x10,0x10,0x0b,0x0b,0x16,0x0c,0x00, + 0xff,0x02,0x00,0x37,0x00,0x20,0x00,0x13,0xc0,0x9c,0x20,0x70,0x20,0x09,0xc0,0x08, + 0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x07,0x07,0x07,0x0c,0x03,0xff,0x10,0x9c,0xb2, + 0xd2,0x9c,0x10,0x20,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x82,0x00,0x47,0x80, + 0x4a,0x40,0x52,0x20,0x62,0x20,0x6a,0x40,0x47,0x80,0x42,0x00,0x04,0x00,0x08,0x00, + 0x07,0x07,0x07,0x0c,0x02,0xff,0x10,0x1c,0x10,0x10,0x78,0x96,0x60,0x09,0x0b,0x16, + 0x0c,0x01,0xff,0x10,0x00,0x08,0x00,0x09,0x80,0x0e,0x00,0x08,0x00,0x08,0x00,0x08, + 0x00,0x78,0x00,0x8e,0x00,0x89,0x80,0x70,0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20, + 0x18,0x40,0x80,0x80,0xbc,0xc2,0x82,0x02,0x0c,0x70,0x07,0x0b,0x0b,0x0c,0x02,0xff, + 0x88,0x54,0x52,0x62,0x62,0x42,0x42,0x04,0x04,0x08,0x10,0x08,0x0a,0x0a,0x0c,0x01, + 0xff,0x4e,0x34,0x08,0x10,0x3e,0x61,0x81,0x19,0x26,0x1c,0x0b,0x0b,0x16,0x0c,0x00, + 0xff,0x20,0x00,0x10,0x00,0x13,0x00,0x34,0x80,0xd8,0x80,0x10,0x80,0x10,0x80,0x30, + 0x80,0x50,0x80,0xb0,0x60,0x10,0x00,0x08,0x0a,0x0a,0x0c,0x01,0xff,0x4e,0x34,0x08, + 0x10,0x3e,0x61,0x81,0x01,0x06,0x18,0x08,0x07,0x07,0x0c,0x02,0xff,0x40,0x30,0xee, + 0x31,0x61,0xa2,0x24,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x10,0x00,0x10,0x00, + 0x9b,0x80,0x7c,0x40,0x10,0x20,0x10,0x20,0x30,0x20,0x50,0x40,0xb1,0x80,0x10,0x00, + 0x0a,0x0a,0x14,0x0c,0x01,0xff,0x4e,0x00,0x34,0x00,0x04,0x00,0x1f,0x00,0x28,0x80, + 0x48,0x40,0x90,0x40,0x96,0x40,0x69,0x80,0x47,0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff, + 0x20,0x00,0x1f,0x00,0x04,0x00,0x1f,0x00,0x20,0x80,0x4c,0x80,0x13,0x00,0x0c,0x00, + 0x00,0x00,0x59,0x80,0x86,0x40,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00, + 0x9e,0x00,0x70,0x00,0x21,0x80,0x72,0x00,0x8c,0x00,0x14,0x00,0x24,0x00,0x20,0x00, + 0x1f,0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0x10,0x00,0x08,0x00,0x08,0x00,0x10,0x00, + 0x10,0x00,0x38,0x00,0x24,0x00,0x44,0x40,0x44,0x80,0x83,0x00,0x0a,0x0b,0x16,0x0c, + 0x00,0xff,0x10,0x00,0x0c,0x80,0x00,0x40,0x1d,0x00,0xe2,0x80,0x02,0x00,0x02,0x00, + 0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0xff,0xff,0xff,0xff,0x04,0x03,0x03,0x0c, + 0x00,0x07,0x20,0x90,0x40,0xff,0x04,0x03,0x03,0x0c,0x00,0x06,0x20,0x90,0x40,0x03, + 0x03,0x03,0x0c,0x00,0x06,0x40,0xa0,0x40,0xff,0xff,0xff,0x05,0x03,0x03,0x06,0x00, + 0x01,0xf8,0x00,0xf8,0x04,0x04,0x04,0x06,0x00,0x00,0xf0,0x10,0x60,0x40,0x05,0x06, + 0x06,0x06,0x00,0x00,0xf8,0x08,0x28,0x30,0x20,0x40,0x03,0x04,0x04,0x06,0x01,0x00, + 0x20,0x40,0xc0,0x40,0x04,0x06,0x06,0x06,0x00,0x00,0x10,0x20,0x60,0xa0,0x20,0x20, + 0x04,0x04,0x04,0x06,0x00,0x00,0x20,0xf0,0x90,0x20,0x05,0x06,0x06,0x06,0x00,0x00, + 0x20,0xf8,0x88,0x08,0x10,0x20,0x03,0x04,0x04,0x06,0x01,0x00,0xe0,0x40,0x40,0xe0, + 0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0xf8,0x04,0x04,0x04,0x06,0x00, + 0x00,0x20,0xf0,0x60,0xa0,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xf8,0x30,0x50,0x90, + 0x10,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x08,0x08, + 0x06,0x00,0x00,0x28,0x00,0x40,0xf8,0x48,0x48,0x48,0x90,0x05,0x06,0x06,0x06,0x00, + 0x00,0x20,0xf8,0x20,0xf8,0x20,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x20, + 0xf8,0x20,0xf8,0x20,0x20,0x04,0x05,0x05,0x06,0x00,0x00,0x70,0x90,0x10,0x20,0xc0, + 0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0x70,0x90,0x10,0x20,0xc0,0x05,0x06,0x06, + 0x06,0x00,0x00,0x40,0x78,0x90,0x10,0x10,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x28, + 0x00,0x40,0x78,0x90,0x10,0x10,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08, + 0x08,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x08,0xf8,0x05, + 0x06,0x06,0x06,0x00,0x00,0x50,0xf8,0x50,0x10,0x20,0x40,0x05,0x08,0x08,0x06,0x00, + 0x00,0x28,0x00,0x50,0xf8,0x50,0x10,0x20,0x40,0x05,0x05,0x05,0x06,0x00,0x00,0xc0, + 0x08,0xc8,0x10,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xc0,0x08,0xc8,0x10, + 0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x10,0x20,0x50,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0xf8,0x10,0x20,0x50,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x40, + 0xf8,0x48,0x50,0x40,0x38,0x05,0x08,0x08,0x06,0x00,0x00,0x28,0x00,0x40,0xf8,0x48, + 0x50,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x07, + 0x07,0x06,0x00,0x00,0x28,0x00,0x88,0x88,0x48,0x10,0x60,0x05,0x05,0x05,0x06,0x00, + 0x00,0x78,0x48,0xa8,0x10,0x60}; +const u8g_fntpgm_uint8_t fontpage_97_193_255[753] U8G_FONT_SECTION("fontpage_97_193_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xff,0x00,0x08,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0xe0,0x20,0xf8,0x20,0x40,0x05,0x08,0x08, + 0x06,0x00,0x00,0x28,0x00,0x10,0xe0,0x20,0xf8,0x20,0x40,0x05,0x04,0x04,0x06,0x00, + 0x00,0xa8,0xa8,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0x08,0x10,0x20, + 0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xa8,0xa8,0x08,0x10,0x20,0x05,0x06,0x06, + 0x06,0x00,0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x05,0x08,0x08,0x06,0x00,0x00,0x28, + 0x00,0x70,0x00,0xf8,0x20,0x20,0x40,0x03,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0xc0, + 0xa0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0x00,0x50,0x00,0x80,0x80,0xc0,0xa0,0x80, + 0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0x20,0x40,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x70,0x00,0x00,0x00,0xf8,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08, + 0x50,0x20,0xd0,0x05,0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x10,0x20,0x70,0xa8,0x03, + 0x06,0x06,0x06,0x01,0x00,0x20,0x20,0x20,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, + 0x00,0x10,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0x10,0x88, + 0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x18,0x18,0x00,0x10,0x88,0x88,0x88, + 0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0xf8,0x80,0x80,0x78,0x05,0x07,0x07, + 0x06,0x00,0x00,0x28,0x80,0x80,0xf8,0x80,0x80,0x78,0x05,0x07,0x07,0x06,0x00,0x00, + 0x18,0x98,0x80,0xf8,0x80,0x80,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x08, + 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x08,0x08,0x10,0x60,0x05, + 0x08,0x08,0x06,0x00,0x00,0x18,0x18,0x00,0xf8,0x08,0x08,0x10,0x60,0x05,0x04,0x04, + 0x06,0x00,0x01,0x40,0xa0,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x01,0x28,0x00,0x40, + 0xa0,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x01,0x18,0x18,0x40,0xa0,0x10,0x08,0x05, + 0x06,0x06,0x06,0x00,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20,0x05,0x08,0x08,0x06,0x00, + 0x00,0x28,0x00,0x20,0xf8,0x20,0xa8,0xa8,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x18, + 0x18,0x20,0xf8,0x20,0xa8,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0x50, + 0x20,0x10,0x04,0x05,0x05,0x06,0x01,0x00,0xe0,0x00,0xe0,0x00,0xf0,0x05,0x05,0x05, + 0x06,0x00,0x00,0x20,0x40,0x88,0xf8,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x28, + 0x10,0x28,0xc0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x40,0xf8,0x40,0x38,0x05,0x04, + 0x04,0x06,0x00,0x00,0x40,0xf8,0x50,0x40,0x05,0x06,0x06,0x06,0x00,0x00,0x40,0xf8, + 0x48,0x50,0x40,0x40,0x04,0x04,0x04,0x06,0x00,0x00,0x60,0x20,0x20,0xf0,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x10,0x10,0x10,0xf8,0x04,0x05,0x05,0x06,0x00,0x00,0xf0, + 0x10,0xf0,0x10,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0xf8,0x05, + 0x06,0x06,0x06,0x00,0x00,0x70,0x00,0xf8,0x08,0x10,0x20,0x04,0x06,0x06,0x06,0x00, + 0x00,0x90,0x90,0x90,0x90,0x10,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x20,0xa0,0xa8, + 0xa8,0xb0,0x04,0x05,0x05,0x06,0x00,0x00,0x80,0x80,0x90,0xa0,0xc0,0x05,0x05,0x05, + 0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0xf8,0x04,0x04,0x04,0x06,0x00,0x00,0xf0,0x90, + 0x10,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x88,0x08,0x10,0x20,0x05,0x06,0x06, + 0x06,0x00,0x00,0x10,0xf8,0x50,0x50,0xf8,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0xf8, + 0x08,0x30,0x20,0xf8,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x08,0xf8,0x08,0x30,0x05, + 0x05,0x05,0x06,0x00,0x00,0xc0,0x08,0x08,0x10,0xe0,0x05,0x08,0x08,0x06,0x00,0x00, + 0x28,0x00,0x20,0xf8,0x88,0x08,0x10,0x20,0x04,0x04,0x04,0x06,0x00,0x00,0x40,0xf0, + 0x50,0xa0,0x04,0x04,0x04,0x06,0x00,0x00,0x40,0xf0,0x20,0x40,0x05,0x07,0x07,0x06, + 0x00,0x00,0x28,0x00,0xf8,0x88,0x08,0x10,0x60,0x05,0x08,0x08,0x06,0x00,0x00,0x28, + 0x00,0x10,0xf8,0x50,0x50,0xf8,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8, + 0x08,0x30,0x20,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x00,0xf8,0x08,0xf8,0x08, + 0x30,0x02,0x02,0x02,0x06,0x02,0x02,0xc0,0xc0,0x05,0x01,0x01,0x06,0x00,0x02,0xf8, + 0x05,0x04,0x04,0x06,0x00,0x01,0x80,0x60,0x10,0x08,0x05,0x05,0x05,0x06,0x00,0x01, + 0x28,0x80,0x60,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x00,0xf8,0x08,0x08,0x08,0x08, + 0x08}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 128, 255, fontpage_8_128_255), // 'Ѐ' -- 'ѿ' + FONTDATA_ITEM(97, 129, 191, fontpage_97_129_191), // 'め' -- 'タ' + FONTDATA_ITEM(97, 193, 255, fontpage_97_193_255), // 'チ' -- 'ヿ' +}; diff --git a/Marlin/src/lcd/dogm/language_data_tr.h b/Marlin/src/lcd/dogm/language_data_tr.h new file mode 100644 index 0000000000..23850ecfd7 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_tr.h @@ -0,0 +1,25 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_2_159_159[33] U8G_FONT_SECTION("fontpage_2_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x78,0x08, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_2_176_177[43] U8G_FONT_SECTION("fontpage_2_176_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb1,0x00,0x09,0x00,0x00, + 0x00,0x03,0x09,0x09,0x06,0x01,0x00,0x40,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0, + 0x03,0x05,0x05,0x06,0x01,0x00,0xc0,0x40,0x40,0x40,0xe0}; +const u8g_fntpgm_uint8_t fontpage_2_223_223[30] U8G_FONT_SECTION("fontpage_2_223_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x05,0xfe,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x80,0x70,0x08,0xf0,0x10,0x60}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 159, 159, fontpage_2_159_159), // 'ğ' -- 'ğ' + FONTDATA_ITEM(2, 176, 177, fontpage_2_176_177), // 'İ' -- 'ı' + FONTDATA_ITEM(2, 223, 223, fontpage_2_223_223), // 'ş' -- 'ş' +}; diff --git a/Marlin/src/lcd/dogm/language_data_uk.h b/Marlin/src/lcd/dogm/language_data_uk.h new file mode 100644 index 0000000000..9886e41d2e --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_uk.h @@ -0,0 +1,93 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_8_134_134[30] U8G_FONT_SECTION("fontpage_8_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x07,0x00,0x00, + 0x00,0x03,0x07,0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0}; +const u8g_fntpgm_uint8_t fontpage_8_144_146[56] U8G_FONT_SECTION("fontpage_8_144_146") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x92,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0}; +const u8g_fntpgm_uint8_t fontpage_8_148_149[44] U8G_FONT_SECTION("fontpage_8_148_149") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x94,0x95,0x00,0x07,0xff,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50,0x50,0xf8,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8}; +const u8g_fntpgm_uint8_t fontpage_8_151_154[72] U8G_FONT_SECTION("fontpage_8_151_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x9a,0x00,0x0a,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00, + 0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88}; +const u8g_fntpgm_uint8_t fontpage_8_156_164[134] U8G_FONT_SECTION("fontpage_8_156_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0xa4,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88, + 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, + 0x70,0xa8,0xa8,0xa8,0x70,0x20}; +const u8g_fntpgm_uint8_t fontpage_8_166_166[32] U8G_FONT_SECTION("fontpage_8_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x07,0xfe,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08 + }; +const u8g_fntpgm_uint8_t fontpage_8_168_168[30] U8G_FONT_SECTION("fontpage_8_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8}; +const u8g_fntpgm_uint8_t fontpage_8_176_201[321] U8G_FONT_SECTION("fontpage_8_176_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xc9,0x00,0x08,0xfe,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0, + 0x88,0xf0,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05, + 0x06,0x06,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00, + 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70, + 0xa8,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0x88,0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00, + 0x88,0x98,0xa8,0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90, + 0x05,0x05,0x05,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0xd8,0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88, + 0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88, + 0x88,0xf0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05, + 0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe, + 0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70, + 0xa8,0xa8,0xa8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50, + 0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05, + 0x05,0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8, + 0xa8,0xa8,0xa8,0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08, + 0x08}; +const u8g_fntpgm_uint8_t fontpage_8_204_204[28] U8G_FONT_SECTION("fontpage_8_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x05,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0xe0}; +const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xcf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06, + 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; +const u8g_fntpgm_uint8_t fontpage_8_212_212[28] U8G_FONT_SECTION("fontpage_8_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x05,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x80,0xe0,0x80,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_214_214[29] U8G_FONT_SECTION("fontpage_8_214_214") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x06,0x00,0x00, + 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 134, 134, fontpage_8_134_134), // 'І' -- 'І' + FONTDATA_ITEM(8, 144, 146, fontpage_8_144_146), // 'А' -- 'В' + FONTDATA_ITEM(8, 148, 149, fontpage_8_148_149), // 'Д' -- 'Е' + FONTDATA_ITEM(8, 151, 154, fontpage_8_151_154), // 'З' -- 'К' + FONTDATA_ITEM(8, 156, 164, fontpage_8_156_164), // 'М' -- 'Ф' + FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц' + FONTDATA_ITEM(8, 168, 168, fontpage_8_168_168), // 'Ш' -- 'Ш' + FONTDATA_ITEM(8, 176, 201, fontpage_8_176_201), // 'а' -- 'щ' + FONTDATA_ITEM(8, 204, 204, fontpage_8_204_204), // 'ь' -- 'ь' + FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я' + FONTDATA_ITEM(8, 212, 212, fontpage_8_212_212), // 'є' -- 'є' + FONTDATA_ITEM(8, 214, 214, fontpage_8_214_214), // 'і' -- 'і' +}; diff --git a/Marlin/src/lcd/dogm/language_data_zh_CN.h b/Marlin/src/lcd/dogm/language_data_zh_CN.h new file mode 100644 index 0000000000..e2e8788577 --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_zh_CN.h @@ -0,0 +1,1289 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8}; +const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, + 0x00,0x0b,0x02,0x04,0x0c,0x00,0x04,0x00,0x40,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0x7f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x0b,0x0b,0x16,0x0c,0x00, + 0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xc0,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04, + 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, + 0x00}; +const u8g_fntpgm_uint8_t fontpage_156_157_157[45] U8G_FONT_SECTION("fontpage_156_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x29,0x40,0x4a,0x40,0xf7, + 0x80,0x10,0x80,0x21,0x00,0x42,0x00,0xf7,0xc0,0x00,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_170_170[45] U8G_FONT_SECTION("fontpage_156_170_170") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x49, + 0x00,0x88,0xc0,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0x88, + 0x80,0x88,0x80,0xff,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_187_187[45] U8G_FONT_SECTION("fontpage_156_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04, + 0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_203_203[45] U8G_FONT_SECTION("fontpage_156_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0x7f,0xc0,0x00,0x80,0x01, + 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xe0}; +const u8g_fntpgm_uint8_t fontpage_157_134_134[45] U8G_FONT_SECTION("fontpage_157_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0xff,0x80,0x01,0x00,0x02,0x00,0x0c,0x00,0x08, + 0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x28,0x00,0x10,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_142_142[45] U8G_FONT_SECTION("fontpage_157_142_142") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, + 0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1c,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_174_174[45] U8G_FONT_SECTION("fontpage_157_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x11,0x00,0x1f,0x00,0x00, + 0x00,0xff,0xe0,0x80,0x20,0x1f,0x00,0x11,0x00,0x21,0x20,0xc0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_157_206_206[45] U8G_FONT_SECTION("fontpage_157_206_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xce,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11, + 0x00,0x11,0x00,0x2a,0x80,0x2a,0x80,0x44,0x40,0x88,0x40,0x10,0x20}; +const u8g_fntpgm_uint8_t fontpage_157_228_228[45] U8G_FONT_SECTION("fontpage_157_228_228") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x0a,0x00,0x11,0x00,0x24, + 0x80,0xc2,0x60,0x3f,0x80,0x01,0x00,0x0a,0x00,0x04,0x00,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_253_253[45] U8G_FONT_SECTION("fontpage_157_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, + 0x20,0xa7,0xc0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xc0}; +const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x21,0x00,0x3f,0xe0,0x61, + 0x00,0xa3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_158_205_206[73] U8G_FONT_SECTION("fontpage_158_205_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xce,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x20,0x00,0x2f,0xe0,0x60, + 0x00,0xa4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x10,0xc0,0x1f,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xaf,0xe0,0x29, + 0x00,0x29,0x20,0x2a,0xa0,0x2d,0x60,0x28,0xa0}; +const u8g_fntpgm_uint8_t fontpage_158_220_220[45] U8G_FONT_SECTION("fontpage_158_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x14,0x00,0x27,0xe0,0x2a,0x00,0x72, + 0x00,0xa3,0xc0,0x22,0x00,0x22,0x00,0x23,0xe0,0x22,0x00,0x22,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_155_155[45] U8G_FONT_SECTION("fontpage_159_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x80,0x14,0x80,0x24,0x80,0x2f,0xe0,0x64, + 0x80,0xa4,0x80,0x3f,0xe0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; +const u8g_fntpgm_uint8_t fontpage_159_221_221[45] U8G_FONT_SECTION("fontpage_159_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x14,0x40,0x24,0x40,0x27,0xc0,0x61, + 0x00,0xaf,0xe0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x2f,0xe0,0x20,0x00,0x67, + 0xc0,0xa0,0x00,0x27,0xc0,0x20,0x00,0x27,0xc0,0x24,0x40,0x27,0xc0}; +const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x1f,0xe0,0x22,0x00,0x27,0xc0,0x64, + 0x40,0xa7,0xc0,0x24,0x40,0x27,0x40,0x25,0xc0,0x24,0x40,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_160_207_207[45] U8G_FONT_SECTION("fontpage_160_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x28,0x20,0x2f,0xe0,0x68, + 0x00,0xaf,0xe0,0x2a,0xa0,0x2f,0xe0,0x2a,0xa0,0x3a,0xa0,0x28,0x60}; +const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x3f,0xe0,0x20,0x00,0x4f,0xc0,0x48, + 0x40,0xdf,0xe0,0x50,0x20,0x4f,0xc0,0x41,0x00,0x41,0x00,0x47,0x00}; +const u8g_fntpgm_uint8_t fontpage_161_168_168[45] U8G_FONT_SECTION("fontpage_161_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x61,0x20,0x57,0xc0,0x41,0x40,0x77,0xe0,0xd1, + 0x00,0x53,0xc0,0x56,0x40,0x53,0xc0,0x5a,0x40,0x52,0x40,0x43,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_197_197[45] U8G_FONT_SECTION("fontpage_162_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0xff,0xc0,0x08,0x00,0x11,0x00,0x7f, + 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xc1,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_200_200[45] U8G_FONT_SECTION("fontpage_162_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x84, + 0x00,0xff,0xe0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0}; +const u8g_fntpgm_uint8_t fontpage_162_229_229[45] U8G_FONT_SECTION("fontpage_162_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0a, + 0x00,0x0a,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; +const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, + 0x60,0x04,0x00,0x04,0x00,0x1f,0x00,0x04,0x00,0x04,0x00,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x7f,0xc0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xff,0xe0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; +const u8g_fntpgm_uint8_t fontpage_162_243_243[45] U8G_FONT_SECTION("fontpage_162_243_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x11,0x00,0x7f,0xc0,0x04,0x00,0x04, + 0x00,0xff,0xc0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_247_247") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f, + 0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0,0x11,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_163_183_183[45] U8G_FONT_SECTION("fontpage_163_183_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, + 0x60,0x41,0x00,0x4f,0xc0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x89,0x00,0x4f,0xe0,0x59,0x00,0x09, + 0x00,0x2f,0xc0,0x29,0x00,0xcf,0xc0,0x49,0x00,0x49,0x00,0x4f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_163_201_201[45] U8G_FONT_SECTION("fontpage_163_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x4f,0xe0,0x40,0x00,0x07,0xc0,0x24, + 0x40,0x24,0x40,0x27,0xc0,0xc1,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; +const u8g_fntpgm_uint8_t fontpage_163_250_251[73] U8G_FONT_SECTION("fontpage_163_250_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f, + 0xc0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xff,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, + 0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_164_134_134[45] U8G_FONT_SECTION("fontpage_164_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, + 0x40,0xbf,0xa0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xc3,0x00}; +const u8g_fntpgm_uint8_t fontpage_164_155_155[45] U8G_FONT_SECTION("fontpage_164_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x18,0x20,0x24,0xa0,0x42,0xa0,0xbc, + 0xa0,0x24,0xa0,0x24,0xa0,0x38,0xa0,0x22,0x20,0x22,0x20,0x1e,0x60}; +const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x27,0xe0,0xf9,0x20,0x11,0x20,0x21, + 0x20,0x69,0x20,0xb1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xc0}; +const u8g_fntpgm_uint8_t fontpage_164_176_176[45] U8G_FONT_SECTION("fontpage_164_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfe,0x20,0x10,0x20,0x20,0xa0,0x44,0xa0,0xfe, + 0xa0,0x10,0xa0,0x7c,0xa0,0x10,0xa0,0x10,0x20,0x1e,0x20,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x50,0xa0,0x7e,0xa0,0x90,0xa0,0xfe, + 0xa0,0x10,0xa0,0x7e,0xa0,0x52,0xa0,0x52,0x20,0x56,0x20,0x10,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x7e,0x20,0x42,0x20,0x7e,0xa0,0x48,0xa0,0x48,0xa0,0x7e,0xa0,0x6a, + 0xa0,0xaa,0xa0,0xaa,0xa0,0x2e,0x20,0x08,0xe0}; +const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x08,0x00,0xff,0x80,0x08, + 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; +const u8g_fntpgm_uint8_t fontpage_165_160_160[45] U8G_FONT_SECTION("fontpage_165_160_160") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x20,0x00,0xfd,0xe0,0x25,0x20,0x25, + 0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0x20,0x55,0xe0,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_165_168_168[45] U8G_FONT_SECTION("fontpage_165_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x79,0x00,0x01,0x00,0x03,0xe0,0xfd, + 0x20,0x21,0x20,0x21,0x20,0x49,0x20,0xfa,0x20,0x0a,0x20,0x04,0xc0}; +const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, + 0x00,0xa2,0x00,0x26,0x00,0x2a,0x00,0x22,0x20,0x22,0x20,0x21,0xe0}; +const u8g_fntpgm_uint8_t fontpage_166_202_202[45] U8G_FONT_SECTION("fontpage_166_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7f, + 0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_207_207[45] U8G_FONT_SECTION("fontpage_166_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x42,0x00,0x4f,0x80,0xe2,0x80,0x42, + 0x80,0x4a,0xc0,0x52,0xa0,0x44,0x80,0x44,0x80,0x4a,0x80,0x51,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_213_213[45] U8G_FONT_SECTION("fontpage_166_213_213") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x0a,0x00,0x7f,0xc0,0x44,0x40,0x7f, + 0xc0,0x44,0x40,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x0f,0x80,0x08,0x00,0x08,0x00,0xff, + 0xe0,0x08,0x00,0x0a,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_240_240[45] U8G_FONT_SECTION("fontpage_166_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0xe7,0xc0,0x84,0x40,0x84,0x40,0xf4, + 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xe5,0x80,0x84,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7d,0xe0,0x91,0x20,0x11,0x20,0xff, + 0x20,0x11,0x20,0x5d,0x20,0x51,0x20,0x51,0xa0,0x5d,0x40,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x00,0x2f,0xc0,0x28,0x40,0x2f, + 0xc0,0x28,0x40,0x2f,0xc0,0x22,0x00,0x2a,0x80,0x52,0x60,0xa6,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_204_204[43] U8G_FONT_SECTION("fontpage_167_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x09,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x0a,0x40,0x4a,0x40,0x2a,0x40,0x11, + 0x40,0x11,0x40,0x28,0x80,0x45,0x80,0x82,0x40,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_214_214[45] U8G_FONT_SECTION("fontpage_167_214_214") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfc,0x00,0x4b,0xe0,0x4a,0x20,0x7a,0x20,0x49, + 0x40,0x79,0x40,0x48,0x80,0x4c,0x80,0xf9,0x40,0x0a,0x40,0x0c,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_216_216[45] U8G_FONT_SECTION("fontpage_167_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x12,0x00,0x52,0x80,0x92, + 0x40,0x00,0x00,0x7f,0x80,0x12,0x00,0x0c,0x00,0x12,0x00,0xe1,0xc0}; +const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xff, + 0x80,0x00,0x80,0x7f,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7f,0x00}; +const u8g_fntpgm_uint8_t fontpage_168_136_136[45] U8G_FONT_SECTION("fontpage_168_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, + 0x60,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_168_142_142[45] U8G_FONT_SECTION("fontpage_168_142_142") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x3f,0xe0,0x20, + 0x00,0x20,0x00,0x2f,0xc0,0x28,0x40,0x48,0x40,0x4f,0xc0,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_168_175_175[45] U8G_FONT_SECTION("fontpage_168_175_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f, + 0xc0,0x20,0x00,0x3f,0xc0,0x30,0x40,0x50,0x40,0x5f,0xc0,0x90,0x40}; +const u8g_fntpgm_uint8_t fontpage_168_253_253[45] U8G_FONT_SECTION("fontpage_168_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0xee,0xe0,0x00, + 0x00,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7a,0x40,0x4a,0xc0,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0c,0x00,0x70,0x00,0x11,0xe0,0xfd,0x20,0x11, + 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xe0,0x10,0x00}; +const u8g_fntpgm_uint8_t fontpage_171_183_183[45] U8G_FONT_SECTION("fontpage_171_183_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, + 0x40,0xaf,0xe0,0xe8,0x20,0xa9,0x20,0x09,0x20,0x02,0x80,0x0c,0x60}; +const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_180_180") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0xa0,0xeb,0xc0,0xaa,0xa0,0xbf,0xe0,0xa4, + 0x80,0xaf,0xe0,0xf9,0x20,0x0f,0xe0,0x09,0x20,0x0f,0xe0,0x11,0x20}; +const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92, + 0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0x80,0x40,0xff,0xc0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_224_224") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x84,0x20,0x84,0x20,0xbf,0xa0,0x84, + 0x20,0x84,0x20,0x8a,0x20,0x91,0x20,0xa0,0xa0,0x80,0x20,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_173_254_254[45] U8G_FONT_SECTION("fontpage_173_254_254") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x90,0x40,0x9f,0x40,0xb2,0x40,0xcc, + 0x40,0x92,0x40,0xe9,0xc0,0x84,0x40,0x88,0x40,0x84,0x40,0xff,0xc0}; +const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0xc0,0x10,0x00,0x22, + 0x00,0x62,0x00,0xaf,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_174_215_215[45] U8G_FONT_SECTION("fontpage_174_215_215") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x27,0xc0,0xf9,0x40,0x21, + 0x40,0x21,0x40,0x2f,0xe0,0x31,0x00,0xc2,0x80,0x04,0x40,0x18,0x20}; +const u8g_fntpgm_uint8_t fontpage_175_139_139[45] U8G_FONT_SECTION("fontpage_175_139_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7e,0x40,0x29,0x40,0x29,0x40,0xff,0x40,0x29, + 0x40,0x28,0x40,0x4c,0xc0,0x04,0x00,0x3f,0x80,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_175_171_171[45] U8G_FONT_SECTION("fontpage_175_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xff,0x80,0x22,0x80,0x36,0xa0,0xe3, + 0xa0,0x2c,0xe0,0x64,0x00,0x04,0x00,0x3f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x21,0x00,0xf7,0xc0,0x24, + 0x40,0x27,0x40,0x25,0xc0,0x34,0x40,0xef,0xe0,0x02,0x80,0x0c,0x60}; +const u8g_fntpgm_uint8_t fontpage_177_243_243[45] U8G_FONT_SECTION("fontpage_177_243_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0xc0,0x00, + 0x00,0xff,0xe0,0x80,0x20,0x1f,0x00,0x11,0x20,0x21,0x20,0xc0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_178_135_135[45] U8G_FONT_SECTION("fontpage_178_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x80,0x31,0x00,0x4e,0x00,0x0b, + 0x00,0x30,0xe0,0xff,0x80,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80}; +const u8g_fntpgm_uint8_t fontpage_178_141_141[45] U8G_FONT_SECTION("fontpage_178_141_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x3f,0xe0,0x60,0x80,0xbf,0x80,0x20, + 0x80,0x3f,0x80,0x10,0x00,0x3f,0x80,0xc9,0x00,0x06,0x00,0xf9,0xe0}; +const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x3d,0x00,0x25,0x00,0x45, + 0x80,0xa5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x1f,0x00,0x21,0x00,0x52,0x00,0x0c, + 0x00,0x34,0x00,0xcf,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xf8,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, + 0x00,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, + 0xe0,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x0a, + 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xc4,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_179_203_203[45] U8G_FONT_SECTION("fontpage_179_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xfa,0x40,0x2a,0x20,0x2f, + 0xe0,0x48,0x00,0x53,0xe0,0x32,0x20,0x2a,0x20,0x4b,0xe0,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_208_208") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x2f,0xc0,0x20, + 0x80,0x61,0x00,0xbf,0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x88,0x40,0x08, + 0x00,0xff,0xe0,0x11,0x00,0x31,0x00,0x0e,0x00,0x09,0x80,0x70,0x60}; +const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x9f,0x40,0x00, + 0x00,0x7f,0xe0,0x0a,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xe0}; +const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x80,0x40,0x3f, + 0xc0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x90,0x40,0x3f,0x00,0x52, + 0x00,0x8c,0x00,0x33,0x00,0xff,0xc0,0x21,0x00,0x21,0x00,0x3f,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_185_185[45] U8G_FONT_SECTION("fontpage_183_185_185") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x91,0x20,0x24,0x80,0x4a, + 0x40,0x11,0x00,0x20,0x80,0xdf,0x60,0x11,0x00,0x11,0x00,0x1f,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_249_249[45] U8G_FONT_SECTION("fontpage_183_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x00,0x80,0xf0,0x80,0x1f,0xe0,0x90,0x80,0x50, + 0x80,0x24,0x80,0x22,0x80,0x50,0x80,0x50,0x80,0x82,0x80,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_143_143[45] U8G_FONT_SECTION("fontpage_184_143_143") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, + 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xfd,0x40,0x01,0x20,0x7f,0xe0,0x4a, + 0x80,0x7a,0x80,0x12,0x80,0x5a,0xa0,0x56,0xa0,0x92,0xa0,0x34,0x60}; +const u8g_fntpgm_uint8_t fontpage_184_207_207[45] U8G_FONT_SECTION("fontpage_184_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x20,0x20,0x3f,0xe0,0x28,0x40,0x24, + 0x80,0x3f,0xe0,0x24,0x80,0x3f,0xe0,0x24,0x80,0x48,0x80,0x90,0x80}; +const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x09,0x00,0x00, + 0x00,0x0b,0x09,0x12,0x0c,0x00,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_187_242_242[43] U8G_FONT_SECTION("fontpage_187_242_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x09,0xff,0x00, + 0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0xff,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xff, + 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_188_246_246[45] U8G_FONT_SECTION("fontpage_188_246_246") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x11,0x00,0x7f,0xc0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xff,0xe0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x7f,0xe0,0x42,0x00,0x42,0x00,0x7f, + 0xe0,0x42,0x00,0x47,0x00,0x4a,0x80,0x52,0x40,0xa2,0x20,0x82,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_148_148[45] U8G_FONT_SECTION("fontpage_189_148_148") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x7f,0xe0,0x40,0x00,0x44, + 0x40,0x52,0x40,0x4a,0x40,0x48,0x80,0x40,0x80,0x81,0x00,0x9f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_189_159_159[45] U8G_FONT_SECTION("fontpage_189_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x3f,0xe0,0x2a,0x80,0x2a,0x40,0x3f, + 0xe0,0x24,0x00,0x27,0xc0,0x2a,0x40,0x31,0x80,0x42,0x40,0x8c,0x20}; +const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x49,0x00,0x7f,0xc0,0x49, + 0x00,0x4f,0x00,0x40,0x00,0x5f,0x80,0x49,0x00,0x86,0x00,0xb9,0xc0}; +const u8g_fntpgm_uint8_t fontpage_190_128_128[45] U8G_FONT_SECTION("fontpage_190_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x11,0x00,0x11,0x00,0x11,0x00,0x11, + 0x00,0xff,0xe0,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_190_210_210[45] U8G_FONT_SECTION("fontpage_190_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0x17,0xc0,0x90,0x40,0x90,0x40,0x90, + 0x40,0x97,0xc0,0x90,0x40,0x90,0x40,0x20,0x40,0x4f,0xc0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_191_132_133[73] U8G_FONT_SECTION("fontpage_191_132_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x20,0x80,0x49,0x00,0x92,0x80,0x24, + 0x40,0x68,0x20,0xa7,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x11,0x00,0x21,0x00,0x47,0xc0,0x91,0x00,0x1f,0xe0,0x20,0x80,0x6f, + 0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; +const u8g_fntpgm_uint8_t fontpage_191_174_174[45] U8G_FONT_SECTION("fontpage_191_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x6a,0x80,0xbe,0x80,0x01,0xe0,0x5d, + 0x40,0xc3,0x40,0x5d,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; +const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, + 0x40,0x50,0x20,0x50,0x20,0x50,0xa0,0x90,0x80,0x10,0x80,0x0f,0x80}; +const u8g_fntpgm_uint8_t fontpage_192_167_167[45] U8G_FONT_SECTION("fontpage_192_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x00,0xb5,0x00,0xaf,0xe0,0xa9, + 0x00,0xb1,0x00,0x27,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_192_187_187[45] U8G_FONT_SECTION("fontpage_192_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x0a,0x00,0x3f,0x80,0x20,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x04,0x40,0x52,0xa0,0x50,0xa0,0x8f,0x80}; +const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x2f,0xe0,0xb2,0x00,0xaa,0x80,0xa4, + 0x80,0xa5,0xa0,0x2a,0xc0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x54,0x40,0x52,0xa0,0x8f,0x80}; +const u8g_fntpgm_uint8_t fontpage_196_144_144[45] U8G_FONT_SECTION("fontpage_196_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x7f,0xe0,0x42,0x00,0x42, + 0x00,0x7a,0x40,0x4a,0x40,0x4a,0x80,0x49,0x20,0x52,0xa0,0x84,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_183_183[45] U8G_FONT_SECTION("fontpage_196_183_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x3f,0xc0,0x20,0x40,0x20, + 0x40,0x3f,0xc0,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x60,0x63,0x80,0x42,0x00,0x7a,0x00,0x4b, + 0xe0,0x4a,0x40,0x7a,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x7f,0xe0,0x40, + 0x00,0x7d,0xe0,0x44,0x20,0x54,0xa0,0x4c,0x60,0x54,0xa0,0xa9,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xc0,0x7c,0x00,0x04,0x00,0x7f,0xc0,0x04, + 0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x0c,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_211_211") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0xf8,0x80,0x20,0x80,0x28, + 0x80,0x30,0x80,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0xe3,0x80}; +const u8g_fntpgm_uint8_t fontpage_196_231_231[45] U8G_FONT_SECTION("fontpage_196_231_231") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xe7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x22,0x00,0xff,0x80,0x22,0x80,0x2a, + 0x80,0x36,0x80,0x62,0x80,0xa7,0xa0,0x24,0xa0,0xa8,0xa0,0x50,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x24,0x80,0xfc,0x80,0x24,0xa0,0x2f, + 0xc0,0x34,0x80,0x64,0x80,0xa4,0x80,0x25,0xa0,0x26,0xa0,0xe4,0x60}; +const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0x22,0x40,0xf9,0x40,0x20,0x40,0x2a, + 0x40,0x31,0x40,0x60,0xe0,0xaf,0x40,0x20,0x40,0x20,0x40,0xe0,0x40}; +const u8g_fntpgm_uint8_t fontpage_197_189_189[45] U8G_FONT_SECTION("fontpage_197_189_189") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x20,0x80,0xf8,0x80,0x27,0xe0,0x2c, + 0xa0,0x34,0xa0,0x67,0xe0,0xa4,0xa0,0x24,0xa0,0x27,0xe0,0xe4,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0xff,0xe0,0x22,0x00,0x2b, + 0xc0,0x32,0x40,0x65,0x40,0xa4,0x80,0x28,0x80,0x29,0x40,0xe6,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_233_233[45] U8G_FONT_SECTION("fontpage_197_233_233") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe9,0xe9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x22,0x40,0xf9,0x80,0x22,0x40,0x2c, + 0x20,0x31,0x00,0x67,0xc0,0xa1,0x00,0x2f,0xe0,0x21,0x00,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0xff,0xe0,0x25,0x20,0x29, + 0x00,0x37,0xe0,0x62,0x40,0xa6,0x40,0x21,0x80,0x22,0x80,0xec,0x60}; +const u8g_fntpgm_uint8_t fontpage_198_161_161[45] U8G_FONT_SECTION("fontpage_198_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x20,0xfb,0x40,0x21,0x00,0x2f, + 0xe0,0x30,0x20,0x60,0x20,0xa7,0xe0,0x20,0x20,0x20,0x20,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_198_164_164[45] U8G_FONT_SECTION("fontpage_198_164_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0xfa,0x40,0x21,0x80,0x2e, + 0x60,0x30,0x00,0x62,0x40,0xa2,0x40,0x22,0x40,0x24,0x40,0xe8,0x40}; +const u8g_fntpgm_uint8_t fontpage_198_226_226[45] U8G_FONT_SECTION("fontpage_198_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xfc,0x80,0x27,0xc0,0x2d, + 0x40,0x35,0x40,0x6f,0xe0,0xa1,0x00,0x22,0x80,0x24,0x40,0xe8,0x20}; +const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0xe0,0xf9,0x00,0x27,0xc0,0x2c, + 0x40,0x37,0xc0,0x64,0x40,0xa7,0xc0,0x21,0x00,0x2f,0xe0,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x28,0x20,0xf2,0x80,0x24,0x40,0x29, + 0x20,0x31,0x00,0x6f,0xe0,0xa1,0x00,0x25,0x80,0x29,0x40,0xf1,0x20}; +const u8g_fntpgm_uint8_t fontpage_199_167_167[45] U8G_FONT_SECTION("fontpage_199_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf8,0x20,0x22,0x80,0x24, + 0x40,0x38,0x20,0x67,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_199_210_210[45] U8G_FONT_SECTION("fontpage_199_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xf1,0x00,0x2f,0xe0,0x21, + 0x00,0x35,0x60,0x69,0x20,0xad,0x60,0x29,0x20,0x29,0x20,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_202_182_182[45] U8G_FONT_SECTION("fontpage_202_182_182") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x93,0xe0,0x94,0x40,0x9a, + 0x40,0x92,0x40,0xb2,0x80,0xd1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_190_190") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x11,0x00,0xfd,0xe0,0x22,0x40,0x25, + 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4a,0x40,0x94,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_240_240[45] U8G_FONT_SECTION("fontpage_202_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x95,0x00,0x59,0x00,0xfd,0xe0,0x33,0x40,0x59, + 0x40,0x95,0x40,0xfd,0x40,0x29,0x40,0x68,0x80,0x11,0x40,0xee,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_244_244[45] U8G_FONT_SECTION("fontpage_202_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x55,0x40,0x7c,0x80,0x39, + 0x40,0x56,0x20,0x7f,0xc0,0x04,0x00,0x27,0x80,0x24,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_203_153_153[45] U8G_FONT_SECTION("fontpage_203_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xac,0x80,0x72,0x80,0x20,0x80,0xfc, + 0x80,0x22,0x80,0x30,0xe0,0x6f,0x80,0xa0,0x80,0x20,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x40,0x29,0x40,0x44,0xc0,0xb8,0x40,0x12, + 0x40,0x7d,0x40,0x10,0x60,0x55,0xc0,0x52,0x40,0x92,0x40,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_176_176[45] U8G_FONT_SECTION("fontpage_203_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x60,0xfd,0x80,0x45,0x00,0x29,0x00,0xfd, + 0xe0,0x11,0x40,0xfd,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_224_224[45] U8G_FONT_SECTION("fontpage_203_224_224") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, + 0xe0,0x0a,0x00,0x0a,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0}; +const u8g_fntpgm_uint8_t fontpage_203_246_246[45] U8G_FONT_SECTION("fontpage_203_246_246") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf6,0xf6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x00,0x80,0xf0,0x80,0x9f,0xe0,0x90,0x80,0x94, + 0x80,0xf2,0x80,0x92,0x80,0x90,0x80,0x90,0x80,0xf0,0x80,0x03,0x80}; +const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_142_142") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xe0,0xf2,0x20,0x92,0x20,0x93,0xe0,0xf2, + 0x20,0x92,0x20,0x93,0xe0,0xf2,0x20,0x04,0x20,0x08,0xa0,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_205_130_130[45] U8G_FONT_SECTION("fontpage_205_130_130") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0xfb,0x80,0x52,0x00,0xfb,0xe0,0x12, + 0x80,0xf4,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80}; +const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x00,0x55,0xe0,0x7d,0x40,0x55, + 0x40,0xff,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40}; +const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x02,0x00,0x3f,0xc0,0x22,0x40,0x3f, + 0xc0,0x22,0x40,0x3f,0xc0,0x0a,0x00,0x04,0x00,0x1b,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, + 0xe0,0x48,0x00,0x7f,0xc0,0x4a,0x40,0x79,0x80,0xc9,0x80,0x0e,0x60}; +const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x1f,0x80,0x30, + 0x80,0x5f,0x80,0x90,0x80,0x1f,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; +const u8g_fntpgm_uint8_t fontpage_206_186_186[45] U8G_FONT_SECTION("fontpage_206_186_186") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0x80,0x24,0x80,0xfc,0x80,0x24, + 0x80,0x74,0x80,0x6c,0x80,0xa4,0x80,0xa4,0x80,0x28,0xa0,0x30,0xe0}; +const u8g_fntpgm_uint8_t fontpage_206_192_192[45] U8G_FONT_SECTION("fontpage_206_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x19,0x00,0x06,0x00,0x19,0x00,0x64, + 0xc0,0x04,0x00,0xff,0xe0,0x15,0x00,0x24,0x80,0xc4,0x60,0x0c,0x00}; +const u8g_fntpgm_uint8_t fontpage_206_225_225[45] U8G_FONT_SECTION("fontpage_206_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x80,0x29,0x00,0x46,0x00,0x0a, + 0x00,0x35,0x80,0xc4,0x60,0x3f,0x80,0x15,0x00,0x24,0x80,0xdc,0x40}; +const u8g_fntpgm_uint8_t fontpage_206_229_229[45] U8G_FONT_SECTION("fontpage_206_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x24,0x80,0x15,0x00,0xff, + 0xe0,0x04,0x00,0x0e,0x00,0x15,0x00,0x24,0x80,0xc4,0x60,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xfc,0x00,0x24,0x00,0x27, + 0xc0,0x74,0x40,0x6e,0x40,0xa5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_207_241_241[45] U8G_FONT_SECTION("fontpage_207_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0xff,0xe0,0x21,0x00,0x71, + 0x00,0x69,0x00,0xa7,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0x2f,0xe0,0xf0,0x00,0x22, + 0x80,0x74,0x40,0x6a,0xa0,0xa2,0x80,0x21,0x00,0x22,0x80,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x40,0x2a,0x80,0x21, + 0x00,0x72,0x80,0x6c,0x60,0xa7,0xc0,0x24,0x40,0x24,0x40,0x27,0xc0}; +const u8g_fntpgm_uint8_t fontpage_209_192_192[45] U8G_FONT_SECTION("fontpage_209_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x22,0x80,0xfc,0x40,0x28,0x20,0x27, + 0xc0,0x70,0x00,0x69,0x20,0xa4,0xa0,0x22,0x40,0x22,0x80,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x2f,0xe0,0xfa,0xa0,0x2f,0xe0,0x2a, + 0xa0,0x3f,0xe0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x27,0xc0,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_212_217_217[45] U8G_FONT_SECTION("fontpage_212_217_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0x40,0x2a,0xa0,0xf4,0x40,0x27,0xc0,0x38, + 0x20,0x27,0xc0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x22,0x80,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_214_226_226[45] U8G_FONT_SECTION("fontpage_214_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, + 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xff,0xc0}; +const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x27,0xc0,0x24,0x00,0x24,0x00,0xff, + 0xe0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xf8,0x00}; +const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xf6, + 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xb4,0x40,0xc4,0x40,0x83,0xc0}; +const u8g_fntpgm_uint8_t fontpage_217_161_161[45] U8G_FONT_SECTION("fontpage_217_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0x80,0x24,0x80,0x84,0x80,0x48,0xe0,0x10, + 0x00,0x2f,0xc0,0x24,0x80,0x42,0x80,0xc3,0x00,0x44,0x80,0x58,0x60}; +const u8g_fntpgm_uint8_t fontpage_217_226_226[45] U8G_FONT_SECTION("fontpage_217_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x8f,0xe0,0x49,0x20,0x19, + 0x00,0x2f,0xc0,0x28,0x40,0xca,0x80,0x49,0x00,0x52,0x80,0x6c,0x60}; +const u8g_fntpgm_uint8_t fontpage_218_187_187[45] U8G_FONT_SECTION("fontpage_218_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x81,0x00,0x5f,0xe0,0x11, + 0x00,0x21,0x00,0x27,0xc0,0xc4,0x40,0x44,0x40,0x47,0xc0,0x44,0x40}; +const u8g_fntpgm_uint8_t fontpage_218_203_203[45] U8G_FONT_SECTION("fontpage_218_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xbe,0x20,0x62,0xa0,0x2a,0xa0,0xaa,0xa0,0x6a, + 0xa0,0x2a,0xa0,0x2a,0xa0,0xc8,0xa0,0x54,0x20,0x62,0x20,0x40,0xe0}; +const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xe0,0x14, + 0x20,0x27,0xe0,0x24,0x20,0xc7,0xe0,0x44,0x20,0x44,0x20,0x44,0x60}; +const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, + 0x40,0x29,0x20,0x25,0x40,0xc5,0x80,0x49,0x00,0x42,0x80,0x5c,0x60}; +const u8g_fntpgm_uint8_t fontpage_220_133_133[45] U8G_FONT_SECTION("fontpage_220_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x01,0x00,0x97,0xc0,0x51, + 0x00,0x2f,0xe0,0x24,0x40,0xc7,0x40,0x45,0xc0,0x44,0x40,0x44,0xc0}; +const u8g_fntpgm_uint8_t fontpage_220_169_169[45] U8G_FONT_SECTION("fontpage_220_169_169") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x07,0xc0,0x94,0x40,0x57, + 0xc0,0x20,0x00,0x2f,0xe0,0xca,0xa0,0x4a,0xa0,0x4a,0xa0,0x5f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_221_144_144[45] U8G_FONT_SECTION("fontpage_221_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x80,0x8b,0xe0,0x4a,0x20,0x1b, + 0xe0,0x2a,0x20,0x2b,0xe0,0xc8,0x80,0x4a,0xc0,0x54,0xa0,0x69,0xa0}; +const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x3e,0x80,0x12,0xe0,0x9e,0xa0,0x53, + 0xa0,0x3e,0xa0,0x28,0xa0,0xdf,0xa0,0x4a,0x40,0x52,0xa0,0x65,0x20}; +const u8g_fntpgm_uint8_t fontpage_224_237_237[43] U8G_FONT_SECTION("fontpage_224_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x09,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x24,0x40,0x24,0x40,0x24, + 0x80,0x4a,0x00,0x0a,0x00,0x11,0x00,0x20,0xe0,0xc0,0x40}; +const u8g_fntpgm_uint8_t fontpage_224_239_239[45] U8G_FONT_SECTION("fontpage_224_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x17,0xe0,0x54,0x80,0x58,0x80,0x50, + 0x80,0x90,0x80,0x10,0x80,0x10,0x80,0x28,0x80,0x44,0x80,0x81,0x80}; +const u8g_fntpgm_uint8_t fontpage_225_185_185[45] U8G_FONT_SECTION("fontpage_225_185_185") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x07,0xc0,0x04,0x00,0x3f, + 0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x00,0x00,0x52,0x40,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_225_237_237[45] U8G_FONT_SECTION("fontpage_225_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0xf7,0x80,0x22,0x80,0x32,0x80,0x66, + 0x80,0xa3,0x80,0x24,0xa0,0x68,0x60,0x00,0x00,0x52,0x40,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x21,0x00,0x3f,0xe0,0x20, + 0x00,0x20,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_228_249_249[45] U8G_FONT_SECTION("fontpage_228_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xa7,0xc0,0xf1,0x00,0xa1,0x00,0xaf, + 0xe0,0x30,0x80,0x6f,0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x23,0x80}; +const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x88,0x40,0x52,0x80,0x0c, + 0x00,0x2a,0x80,0xdf,0x40,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_234_168_168[45] U8G_FONT_SECTION("fontpage_234_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x44,0x40,0x7f,0xc0,0x44, + 0x40,0x44,0x40,0x7f,0xc0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xc0}; +const u8g_fntpgm_uint8_t fontpage_234_181_181[45] U8G_FONT_SECTION("fontpage_234_181_181") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb5,0xb5,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0xff, + 0x80,0x88,0x80,0x88,0x80,0xff,0x80,0x08,0x40,0x08,0x40,0x07,0xc0}; +const u8g_fntpgm_uint8_t fontpage_236_253_253[34] U8G_FONT_SECTION("fontpage_236_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x08,0x0b,0x0b,0x0c,0x02,0xff,0x10,0x20,0xff,0x81,0x81,0xff,0x81,0x81,0x81, + 0xff,0x81}; +const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x22,0x00,0x42,0x00,0xf7,0xc0,0x98,0x40,0x90, + 0x40,0xf4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xf0,0x40,0x91,0x80}; +const u8g_fntpgm_uint8_t fontpage_237_244_244[45] U8G_FONT_SECTION("fontpage_237_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x20,0x80,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_238_129_129[45] U8G_FONT_SECTION("fontpage_238_129_129") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x14,0x80,0x25,0x60,0x46,0x20,0x1f, + 0x80,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80}; +const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_160_160") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf4,0x20,0x97,0xe0,0xf4,0x80,0x94, + 0x80,0x97,0xe0,0xf4,0x80,0x94,0x80,0xf4,0xa0,0x96,0x60,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_243_239_239[45] U8G_FONT_SECTION("fontpage_243_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0xe3,0xe0,0x22,0x20,0xfa,0x20,0x22, + 0x20,0x73,0xe0,0x68,0x00,0xa2,0x40,0xa2,0x40,0x24,0x20,0x28,0x20}; +const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xe3,0xe0,0x24,0x20,0xfa,0x40,0x21, + 0x80,0x36,0x80,0x29,0xe0,0x62,0x20,0xa5,0x40,0x20,0x80,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_245_239_239[45] U8G_FONT_SECTION("fontpage_245_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x45,0x20,0xf7,0xe0,0x00,0x00,0xaf, + 0xe0,0xa1,0x00,0xaf,0xe0,0x4a,0xa0,0x6a,0xa0,0x8a,0xa0,0x08,0x60}; +const u8g_fntpgm_uint8_t fontpage_246_201_201[45] U8G_FONT_SECTION("fontpage_246_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x7f,0xc0,0x04, + 0x00,0xff,0xe0,0x01,0x00,0x7f,0xc0,0x11,0x00,0x09,0x00,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_247_161_161[45] U8G_FONT_SECTION("fontpage_247_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x52,0x80,0xff,0xe0,0x80, + 0x20,0x3f,0x80,0x20,0x80,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_248_251_251[45] U8G_FONT_SECTION("fontpage_248_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x15,0x00,0xff,0xe0,0x15,0x00,0x24, + 0x80,0x40,0x40,0x04,0x00,0xff,0xe0,0x0a,0x00,0x11,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_250_171_171[45] U8G_FONT_SECTION("fontpage_250_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x51,0x40,0x5d,0x80,0x51,0x20,0xfd, + 0xe0,0x08,0x80,0x3f,0x00,0x08,0x80,0x7f,0xc0,0x24,0x80,0xcc,0x60}; +const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xc0,0x41,0x00,0x51,0x00,0xe1, + 0x00,0x21,0x00,0x41,0x00,0xf1,0x00,0x01,0x00,0x31,0x00,0xcf,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_191_191[45] U8G_FONT_SECTION("fontpage_253_191_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0x43,0xc0,0x4e,0x00,0xe3, + 0xe0,0x2e,0x00,0x42,0x40,0xf2,0x80,0x09,0x20,0x32,0xa0,0xcc,0x60}; +const u8g_fntpgm_uint8_t fontpage_253_198_198[45] U8G_FONT_SECTION("fontpage_253_198_198") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0x44,0xa0,0x54,0xa0,0xe4, + 0xa0,0x27,0xe0,0x44,0xa0,0xf4,0xa0,0x04,0xa0,0x37,0xe0,0xc4,0x20}; +const u8g_fntpgm_uint8_t fontpage_253_200_200[45] U8G_FONT_SECTION("fontpage_253_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0x54,0x40,0xea,0x80,0x21, + 0x00,0x42,0x80,0xec,0x60,0x01,0x00,0x30,0xc0,0xc3,0x00,0x00,0xc0}; +const u8g_fntpgm_uint8_t fontpage_253_223_223[45] U8G_FONT_SECTION("fontpage_253_223_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x42,0x00,0x54,0x40,0xef, + 0xe0,0x22,0xa0,0x42,0x80,0xf2,0x80,0x02,0xa0,0x34,0xa0,0xc8,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_231_231[45] U8G_FONT_SECTION("fontpage_253_231_231") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xe7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x26,0xa0,0x45,0xc0,0x54,0x80,0xe7, + 0xe0,0x24,0x80,0x45,0xc0,0xf6,0xa0,0x04,0x80,0x34,0x80,0xc7,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_234_234[45] U8G_FONT_SECTION("fontpage_253_234_234") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xa0,0x49,0x40,0x57,0xe0,0xe1, + 0x00,0x23,0xe0,0x46,0x20,0xf3,0xe0,0x0a,0x20,0x33,0xe0,0xc2,0x20}; +const u8g_fntpgm_uint8_t fontpage_253_237_237[45] U8G_FONT_SECTION("fontpage_253_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xc0,0x41,0x00,0x57,0xe0,0xe4, + 0xa0,0x2a,0x80,0x44,0x80,0xef,0xe0,0x01,0x00,0x32,0xc0,0xcc,0x20}; +const u8g_fntpgm_uint8_t fontpage_253_255_255[45] U8G_FONT_SECTION("fontpage_253_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x20,0x40,0x43,0xc0,0xf0,0x40,0x2f, + 0xe0,0x41,0x20,0xf5,0x40,0x03,0x80,0x35,0x40,0xc9,0x20,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_254_150_150[45] U8G_FONT_SECTION("fontpage_254_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x48,0x20,0x5f,0xe0,0xe8, + 0x00,0x2f,0xe0,0x4a,0xa0,0xff,0xe0,0x0a,0xa0,0x3a,0xa0,0xc8,0x60}; +const u8g_fntpgm_uint8_t fontpage_254_186_186[45] U8G_FONT_SECTION("fontpage_254_186_186") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x41,0x00,0x7b,0xc0,0xa1,0x40,0x21, + 0x40,0xff,0xe0,0x21,0x00,0xa9,0x00,0xaa,0x80,0xfa,0x40,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_254_209_209[45] U8G_FONT_SECTION("fontpage_254_209_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x91,0x40,0xd5,0x40,0xa2, + 0x40,0x92,0x40,0xad,0x40,0xc5,0x40,0x88,0x40,0x80,0x40,0x81,0xc0}; +const u8g_fntpgm_uint8_t fontpage_254_238_238[45] U8G_FONT_SECTION("fontpage_254_238_238") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x4a,0x40,0x7f,0xc0,0x04,0x00,0xff, + 0xe0,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_242_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x49,0x20,0x7f,0xe0,0x04,0x40,0x3f, + 0x80,0x05,0x00,0xff,0xe0,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80}; +const u8g_fntpgm_uint8_t fontpage_256_234_234[45] U8G_FONT_SECTION("fontpage_256_234_234") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x40,0xfa,0x80,0x57,0xc0,0x54,0x40,0x74, + 0x40,0x57,0xc0,0x71,0x00,0x5a,0xa0,0xf6,0xa0,0x1a,0x40,0x11,0xc0}; +const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259_234_234") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, + 0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20,0xfe,0x82,0x82,0xfe,0x82,0xfe,0x82,0x82, + 0xfe,0x82}; +const u8g_fntpgm_uint8_t fontpage_263_220_220[45] U8G_FONT_SECTION("fontpage_263_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x01,0xc0,0x7e, + 0x80,0x28,0x80,0x15,0x00,0xff,0xe0,0x15,0x00,0x24,0x80,0xc4,0x60}; +const u8g_fntpgm_uint8_t fontpage_265_221_221[45] U8G_FONT_SECTION("fontpage_265_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x52,0x00,0x53, + 0xc0,0x55,0x00,0x10,0x80,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_272_204_204[45] U8G_FONT_SECTION("fontpage_272_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x40,0x00,0x80,0x00,0x10,0x00,0x2f, + 0xe0,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; +const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x80,0x20,0x80,0xff,0xe0,0x14,0xa0,0x2c, + 0x80,0x77,0xe0,0xad,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x9f,0xe0,0x51,0x00,0x31,0x00,0xd7, + 0xc0,0x12,0x00,0xff,0xe0,0x0c,0x40,0x32,0x80,0xd1,0x00,0x18,0xe0}; +const u8g_fntpgm_uint8_t fontpage_275_210_210[45] U8G_FONT_SECTION("fontpage_275_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x00,0x22,0x00,0x7f,0xc0,0xa4, + 0x40,0x3f,0xc0,0x24,0x40,0x3f,0xc0,0x24,0x40,0x45,0x40,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_279_161_161[45] U8G_FONT_SECTION("fontpage_279_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x01,0x00,0x0f,0xe0,0xe1, + 0x00,0x21,0x00,0x21,0x00,0x29,0x00,0x31,0x00,0x21,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_279_174_174[45] U8G_FONT_SECTION("fontpage_279_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x21,0x40,0x05,0x40,0x04,0x40,0xe4, + 0x40,0x22,0x80,0x22,0x80,0x29,0x00,0x32,0x80,0x24,0x40,0x08,0x20}; +const u8g_fntpgm_uint8_t fontpage_279_190_190[45] U8G_FONT_SECTION("fontpage_279_190_190") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0x80,0x24,0x80,0x04,0x80,0x08,0xe0,0xe0, + 0x00,0x2f,0xc0,0x24,0x40,0x22,0x80,0x31,0x00,0x22,0x80,0x1c,0x60}; +const u8g_fntpgm_uint8_t fontpage_279_213_213[45] U8G_FONT_SECTION("fontpage_279_213_213") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x40,0x21,0x20,0x1f,0xe0,0x01,0x00,0xef, + 0x00,0x25,0x00,0x25,0x00,0x24,0xa0,0x26,0xa0,0x38,0x60,0x20,0x20}; +const u8g_fntpgm_uint8_t fontpage_279_239_239[45] U8G_FONT_SECTION("fontpage_279_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x04,0x40,0x07,0xc0,0xe0, + 0x00,0x27,0xc0,0x21,0x00,0x2f,0xe0,0x32,0x80,0x24,0x40,0x08,0x20}; +const u8g_fntpgm_uint8_t fontpage_279_247_247[45] U8G_FONT_SECTION("fontpage_279_247_247") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x21,0x00,0x07,0xc0,0xe1, + 0x00,0x2f,0xe0,0x24,0x40,0x27,0xc0,0x24,0x40,0x37,0xc0,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_280_131_131[45] U8G_FONT_SECTION("fontpage_280_131_131") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x29,0x20,0x0b,0xa0,0xe9,0x20,0x2f, + 0xe0,0x28,0x20,0x2b,0xa0,0x2a,0xa0,0x3b,0xa0,0x28,0x20,0x10,0xe0}; +const u8g_fntpgm_uint8_t fontpage_282_165_165[45] U8G_FONT_SECTION("fontpage_282_165_165") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa5,0xa5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x89,0x00,0xa9,0xe0,0xa9,0x40,0xab, + 0x40,0xad,0x40,0xa9,0x40,0x21,0x40,0x50,0x80,0x49,0x40,0x8a,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_244_244[45] U8G_FONT_SECTION("fontpage_286_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xf8,0x80,0x47,0xe0,0x64,0xa0,0xa4, + 0xa0,0xfc,0xa0,0x27,0xe0,0x3c,0xa0,0xe4,0xa0,0x27,0xe0,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_253_253[45] U8G_FONT_SECTION("fontpage_286_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7d,0x40,0x11,0x20,0xff,0xe0,0x21, + 0x00,0xfd,0x20,0x51,0x40,0x7c,0x80,0x10,0xa0,0xfd,0x60,0x12,0x20}; +const u8g_fntpgm_uint8_t fontpage_287_145_145[45] U8G_FONT_SECTION("fontpage_287_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xc0,0xfa,0x40,0x43,0xc0,0x60,0x00,0xa7, + 0xe0,0xfa,0x40,0x23,0x40,0x3a,0xc0,0xe2,0x60,0x2f,0xc0,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_287_147_147[45] U8G_FONT_SECTION("fontpage_287_147_147") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x42,0x80,0xf4,0x40,0x4b,0xa0,0xa0, + 0x00,0xfe,0x20,0x2a,0xa0,0x3e,0xa0,0xea,0xa0,0x2e,0xa0,0x2a,0x60}; +const u8g_fntpgm_uint8_t fontpage_287_185_185[45] U8G_FONT_SECTION("fontpage_287_185_185") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x2f,0xe0,0x01,0x20,0xe1, + 0x20,0x21,0x20,0x22,0x20,0x24,0x20,0x28,0xc0,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_208_209[73] U8G_FONT_SECTION("fontpage_287_208_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x20,0x00,0x20,0x00,0x0f,0xe0,0xe2, + 0x00,0x22,0x80,0x24,0x40,0x2f,0xa0,0x24,0x20,0x50,0x00,0x8f,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x24,0x00,0x07,0xe0,0xe4,0x80,0x24,0x80,0x24, + 0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xe0,0xe6, + 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_216_216[45] U8G_FONT_SECTION("fontpage_287_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x20,0x80,0x21,0x00,0x01,0x00,0xe3, + 0x40,0x25,0x20,0x29,0x20,0x21,0x00,0x21,0x00,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_219_219[45] U8G_FONT_SECTION("fontpage_287_219_219") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x24,0x80,0x2f,0xc0,0x04,0x80,0xe4, + 0x80,0x3f,0xe0,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x80,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_128_128[45] U8G_FONT_SECTION("fontpage_288_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x8f,0xc0,0x48,0x40,0x4f,0xc0,0x08,0x40,0xcf, + 0xc0,0x48,0x00,0x4b,0x40,0x48,0x80,0x4e,0x40,0xb0,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_137_137[45] U8G_FONT_SECTION("fontpage_288_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x45,0x00,0x25,0x00,0x27,0xc0,0x09,0x00,0xef, + 0xe0,0x22,0x80,0x22,0xa0,0x24,0xa0,0x28,0x60,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x3f,0xe0,0x21,0x00,0x0f,0xe0,0xe9, + 0x20,0x2f,0xe0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x20,0x45,0x20,0x29,0x40,0xff, + 0x80,0x01,0x40,0x7d,0x20,0x45,0x20,0x45,0xa0,0x7d,0x40,0x45,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_202_202[45] U8G_FONT_SECTION("fontpage_291_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xc0,0xe2,0x80,0xa9,0x00,0x72,0x80,0xfd, + 0x60,0x31,0x00,0x6f,0xc0,0xa1,0x00,0xaf,0xe0,0x21,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x24,0x80,0x3f, + 0x80,0x24,0x80,0x3f,0x80,0x04,0x00,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, + 0xe0,0x24,0x80,0x3f,0x80,0x24,0x80,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_297_136_136[45] U8G_FONT_SECTION("fontpage_297_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x80,0x40,0x80,0x78,0x80,0x80,0x80,0xfb, + 0xe0,0x20,0x80,0xf8,0x80,0x20,0x80,0x28,0x80,0x30,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_297_174_174[45] U8G_FONT_SECTION("fontpage_297_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x47,0xc0,0x79,0x40,0x81,0x40,0xf9, + 0x40,0x27,0xc0,0xfa,0x40,0x22,0x40,0x2a,0x40,0x32,0x40,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_298_153_153[45] U8G_FONT_SECTION("fontpage_298_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x80,0x4f,0xe0,0x72,0x80,0x82,0x80,0xef, + 0xe0,0x40,0x00,0xf7,0xc0,0x44,0x40,0x47,0xc0,0x54,0x40,0x67,0xc0}; +const u8g_fntpgm_uint8_t fontpage_298_174_174[45] U8G_FONT_SECTION("fontpage_298_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x5c,0x80,0x47,0xe0,0x68,0xa0,0x8b,0xe0,0xfc, + 0xa0,0x47,0xe0,0xe4,0x80,0x57,0xe0,0x48,0x80,0x6c,0x80,0x53,0xe0}; +const u8g_fntpgm_uint8_t fontpage_298_255_255[45] U8G_FONT_SECTION("fontpage_298_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x21,0x00,0x22,0x00,0x24,0x00,0x28,0x00,0x30, + 0x00,0xff,0xc0,0x28,0x00,0x24,0x00,0x22,0x00,0x29,0x00,0x30,0xc0}; +const u8g_fntpgm_uint8_t fontpage_299_237_237[45] U8G_FONT_SECTION("fontpage_299_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xe0,0x20,0x20,0x82,0x20,0x82,0x20,0xbf, + 0xa0,0x86,0x20,0x8a,0x20,0x92,0x20,0xa2,0x20,0x86,0x20,0x80,0xe0}; +const u8g_fntpgm_uint8_t fontpage_299_244_244[45] U8G_FONT_SECTION("fontpage_299_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x4f,0xc0,0x20,0x40,0x80,0x40,0x9e,0x40,0x92, + 0x40,0x9e,0x40,0x92,0x40,0x92,0x40,0x9e,0x40,0x80,0x40,0x81,0xc0}; +const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf2,0x00,0x93,0xe0,0xa6,0x40,0xc1,0x80,0xa6, + 0x60,0x91,0x00,0x97,0xe0,0xd5,0x00,0xaf,0xe0,0x81,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xcb,0xa0,0xa1, + 0x00,0x9f,0xe0,0x91,0x00,0xe5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; +const u8g_fntpgm_uint8_t fontpage_302_210_210[45] U8G_FONT_SECTION("fontpage_302_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, + 0x00,0xff,0xe0,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80,0x10,0x80}; +const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a, + 0x00,0x7b,0xc0,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a,0x00}; +const u8g_fntpgm_uint8_t fontpage_304_249_249[45] U8G_FONT_SECTION("fontpage_304_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf9,0x00,0x27,0xe0,0x24,0x20,0x25, + 0x20,0x25,0x20,0x25,0x20,0x3d,0x20,0xc1,0x80,0x02,0x40,0x0c,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_132_132[45] U8G_FONT_SECTION("fontpage_305_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x10,0x80,0x63,0xe0,0x22,0x20,0xfa, + 0xa0,0x2a,0xa0,0x22,0xa0,0x22,0xa0,0x22,0xa0,0x21,0x40,0x66,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_157_157[45] U8G_FONT_SECTION("fontpage_305_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xe0,0xfc,0x80,0x87,0xe0,0x7a,0x20,0xca, + 0xa0,0x32,0xa0,0x4a,0xa0,0xfe,0xa0,0x4a,0xa0,0x79,0x40,0x4e,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_206_206[45] U8G_FONT_SECTION("fontpage_305_206_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xce,0xce,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0x80,0x40,0x80,0x42,0x80,0x52,0x80,0x4c, + 0x80,0x44,0x80,0x4c,0x80,0x52,0x80,0x62,0xa0,0x80,0x60,0x80,0x20}; +const u8g_fntpgm_uint8_t fontpage_306_241_241[45] U8G_FONT_SECTION("fontpage_306_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x00,0x47,0xc0,0x7c,0x40,0x97,0x40,0xad, + 0x40,0x25,0x40,0x27,0x40,0x24,0xc0,0x2c,0x20,0x34,0x20,0x23,0xe0}; +const u8g_fntpgm_uint8_t fontpage_308_241_241[45] U8G_FONT_SECTION("fontpage_308_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf3,0xe0,0x12,0x00,0x52,0x20,0x53,0x20,0x52, + 0xa0,0x7a,0x40,0x0a,0x40,0xea,0xa0,0x0b,0x20,0x0a,0x00,0x33,0xe0}; +const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x00,0x00,0x1f,0x00,0x11, + 0x00,0x7f,0xc0,0x40,0x40,0x5f,0x40,0x51,0x40,0x5f,0x40,0x40,0xc0}; +const u8g_fntpgm_uint8_t fontpage_317_196_196[45] U8G_FONT_SECTION("fontpage_317_196_196") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7f,0xc0,0x11,0x00,0xff,0xe0,0x04, + 0x00,0x3f,0x80,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80,0x60,0xc0}; +const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x08,0x00,0x00, + 0x00,0x02,0x07,0x07,0x0c,0x06,0x01,0xc0,0xc0,0x00,0x00,0x00,0xc0,0xc0}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿' + FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一' + FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下' + FONTDATA_ITEM(156, 157, 157, fontpage_156_157_157), // '丝' -- '丝' + FONTDATA_ITEM(156, 170, 170, fontpage_156_170_170), // '个' -- '个' + FONTDATA_ITEM(156, 173, 173, fontpage_156_173_173), // '中' -- '中' + FONTDATA_ITEM(156, 187, 187, fontpage_156_187_187), // '主' -- '主' + FONTDATA_ITEM(156, 203, 203, fontpage_156_203_203), // '之' -- '之' + FONTDATA_ITEM(157, 134, 134, fontpage_157_134_134), // '了' -- '了' + FONTDATA_ITEM(157, 142, 142, fontpage_157_142_142), // '于' -- '于' + FONTDATA_ITEM(157, 174, 174, fontpage_157_174_174), // '亮' -- '亮' + FONTDATA_ITEM(157, 206, 206, fontpage_157_206_206), // '从' -- '从' + FONTDATA_ITEM(157, 228, 228, fontpage_157_228_228), // '令' -- '令' + FONTDATA_ITEM(157, 253, 253, fontpage_157_253_253), // '份' -- '份' + FONTDATA_ITEM(158, 145, 145, fontpage_158_145_145), // '休' -- '休' + FONTDATA_ITEM(158, 205, 206, fontpage_158_205_206), // '位' -- '低' + FONTDATA_ITEM(158, 220, 220, fontpage_158_220_220), // '作' -- '作' + FONTDATA_ITEM(159, 155, 155, fontpage_159_155_155), // '供' -- '供' + FONTDATA_ITEM(159, 221, 221, fontpage_159_221_221), // '保' -- '保' + FONTDATA_ITEM(159, 225, 225, fontpage_159_225_225), // '信' -- '信' + FONTDATA_ITEM(160, 188, 188, fontpage_160_188_188), // '值' -- '值' + FONTDATA_ITEM(160, 207, 207, fontpage_160_207_207), // '偏' -- '偏' + FONTDATA_ITEM(160, 220, 220, fontpage_160_220_220), // '停' -- '停' + FONTDATA_ITEM(161, 168, 168, fontpage_161_168_168), // '储' -- '储' + FONTDATA_ITEM(162, 197, 197, fontpage_162_197_197), // '充' -- '充' + FONTDATA_ITEM(162, 200, 200, fontpage_162_200_200), // '先' -- '先' + FONTDATA_ITEM(162, 229, 229, fontpage_162_229_229), // '入' -- '入' + FONTDATA_ITEM(162, 232, 232, fontpage_162_232_232), // '全' -- '全' + FONTDATA_ITEM(162, 241, 241, fontpage_162_241_241), // '共' -- '共' + FONTDATA_ITEM(162, 243, 243, fontpage_162_243_243), // '关' -- '关' + FONTDATA_ITEM(162, 247, 247, fontpage_162_247_247), // '具' -- '具' + FONTDATA_ITEM(163, 183, 183, fontpage_163_183_183), // '冷' -- '冷' + FONTDATA_ITEM(163, 198, 198, fontpage_163_198_198), // '准' -- '准' + FONTDATA_ITEM(163, 201, 201, fontpage_163_201_201), // '凉' -- '凉' + FONTDATA_ITEM(163, 250, 251, fontpage_163_250_251), // '出' -- '击' + FONTDATA_ITEM(164, 134, 134, fontpage_164_134_134), // '分' -- '分' + FONTDATA_ITEM(164, 155, 155, fontpage_164_155_155), // '创' -- '创' + FONTDATA_ITEM(164, 157, 157, fontpage_164_157_157), // '初' -- '初' + FONTDATA_ITEM(164, 176, 176, fontpage_164_176_176), // '到' -- '到' + FONTDATA_ITEM(164, 182, 183, fontpage_164_182_183), // '制' -- '刷' + FONTDATA_ITEM(165, 155, 155, fontpage_165_155_155), // '力' -- '力' + FONTDATA_ITEM(165, 160, 160, fontpage_165_160_160), // '加' -- '加' + FONTDATA_ITEM(165, 168, 168, fontpage_165_168_168), // '动' -- '动' + FONTDATA_ITEM(166, 150, 150, fontpage_166_150_150), // '化' -- '化' + FONTDATA_ITEM(166, 202, 202, fontpage_166_202_202), // '半' -- '半' + FONTDATA_ITEM(166, 207, 207, fontpage_166_207_207), // '协' -- '协' + FONTDATA_ITEM(166, 213, 213, fontpage_166_213_213), // '单' -- '单' + FONTDATA_ITEM(166, 225, 225, fontpage_166_225_225), // '卡' -- '卡' + FONTDATA_ITEM(166, 240, 240, fontpage_166_240_240), // '印' -- '印' + FONTDATA_ITEM(166, 248, 248, fontpage_166_248_248), // '卸' -- '卸' + FONTDATA_ITEM(167, 159, 159, fontpage_167_159_159), // '原' -- '原' + FONTDATA_ITEM(167, 204, 204, fontpage_167_204_204), // '双' -- '双' + FONTDATA_ITEM(167, 214, 214, fontpage_167_214_214), // '取' -- '取' + FONTDATA_ITEM(167, 216, 216, fontpage_167_216_216), // '变' -- '变' + FONTDATA_ITEM(167, 240, 240, fontpage_167_240_240), // '台' -- '台' + FONTDATA_ITEM(168, 136, 136, fontpage_168_136_136), // '合' -- '合' + FONTDATA_ITEM(168, 142, 142, fontpage_168_142_142), // '后' -- '后' + FONTDATA_ITEM(168, 175, 175, fontpage_168_175_175), // '启' -- '启' + FONTDATA_ITEM(168, 253, 253, fontpage_168_253_253), // '命' -- '命' + FONTDATA_ITEM(169, 140, 140, fontpage_169_140_140), // '和' -- '和' + FONTDATA_ITEM(171, 183, 183, fontpage_171_183_183), // '喷' -- '喷' + FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴' + FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回' + FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // '因' -- '因' + FONTDATA_ITEM(173, 254, 254, fontpage_173_254_254), // '图' -- '图' + FONTDATA_ITEM(174, 168, 168, fontpage_174_168_168), // '在' -- '在' + FONTDATA_ITEM(174, 215, 215, fontpage_174_215_215), // '块' -- '块' + FONTDATA_ITEM(175, 139, 139, fontpage_175_139_139), // '型' -- '型' + FONTDATA_ITEM(175, 171, 171, fontpage_175_171_171), // '垫' -- '垫' + FONTDATA_ITEM(176, 235, 235, fontpage_176_235_235), // '填' -- '填' + FONTDATA_ITEM(177, 243, 243, fontpage_177_243_243), // '壳' -- '壳' + FONTDATA_ITEM(178, 135, 135, fontpage_178_135_135), // '备' -- '备' + FONTDATA_ITEM(178, 141, 141, fontpage_178_141_141), // '复' -- '复' + FONTDATA_ITEM(178, 150, 150, fontpage_178_150_150), // '外' -- '外' + FONTDATA_ITEM(178, 154, 154, fontpage_178_154_154), // '多' -- '多' + FONTDATA_ITEM(178, 167, 167, fontpage_178_167_167), // '大' -- '大' + FONTDATA_ITEM(178, 169, 170, fontpage_178_169_170), // '天' -- '太' + FONTDATA_ITEM(178, 177, 177, fontpage_178_177_177), // '失' -- '失' + FONTDATA_ITEM(179, 203, 203, fontpage_179_203_203), // '始' -- '始' + FONTDATA_ITEM(182, 208, 208, fontpage_182_208_208), // '子' -- '子' + FONTDATA_ITEM(182, 216, 216, fontpage_182_216_216), // '存' -- '存' + FONTDATA_ITEM(183, 137, 137, fontpage_183_137_137), // '安' -- '安' + FONTDATA_ITEM(183, 140, 140, fontpage_183_140_140), // '完' -- '完' + FONTDATA_ITEM(183, 154, 154, fontpage_183_154_154), // '定' -- '定' + FONTDATA_ITEM(183, 162, 162, fontpage_183_162_162), // '客' -- '客' + FONTDATA_ITEM(183, 185, 185, fontpage_183_185_185), // '容' -- '容' + FONTDATA_ITEM(183, 249, 249, fontpage_183_249_249), // '对' -- '对' + FONTDATA_ITEM(184, 143, 143, fontpage_184_143_143), // '小' -- '小' + FONTDATA_ITEM(184, 177, 177, fontpage_184_177_177), // '就' -- '就' + FONTDATA_ITEM(184, 207, 207, fontpage_184_207_207), // '屏' -- '屏' + FONTDATA_ITEM(187, 229, 229, fontpage_187_229_229), // '工' -- '工' + FONTDATA_ITEM(187, 242, 242, fontpage_187_242_242), // '已' -- '已' + FONTDATA_ITEM(188, 243, 243, fontpage_188_243_243), // '平' -- '平' + FONTDATA_ITEM(188, 246, 246, fontpage_188_246_246), // '并' -- '并' + FONTDATA_ITEM(189, 138, 138, fontpage_189_138_138), // '床' -- '床' + FONTDATA_ITEM(189, 148, 148, fontpage_189_148_148), // '应' -- '应' + FONTDATA_ITEM(189, 159, 159, fontpage_189_159_159), // '废' -- '废' + FONTDATA_ITEM(189, 166, 166, fontpage_189_166_166), // '度' -- '度' + FONTDATA_ITEM(190, 128, 128, fontpage_190_128_128), // '开' -- '开' + FONTDATA_ITEM(190, 210, 210, fontpage_190_210_210), // '归' -- '归' + FONTDATA_ITEM(191, 132, 133, fontpage_191_132_133), // '径' -- '待' + FONTDATA_ITEM(191, 174, 174, fontpage_191_174_174), // '微' -- '微' + FONTDATA_ITEM(191, 195, 195, fontpage_191_195_195), // '心' -- '心' + FONTDATA_ITEM(192, 167, 167, fontpage_192_167_167), // '性' -- '性' + FONTDATA_ITEM(192, 187, 187, fontpage_192_187_187), // '总' -- '总' + FONTDATA_ITEM(192, 226, 226, fontpage_192_226_226), // '恢' -- '恢' + FONTDATA_ITEM(192, 239, 239, fontpage_192_239_239), // '息' -- '息' + FONTDATA_ITEM(196, 144, 144, fontpage_196_144_144), // '成' -- '成' + FONTDATA_ITEM(196, 183, 183, fontpage_196_183_183), // '户' -- '户' + FONTDATA_ITEM(196, 192, 192, fontpage_196_192_192), // '所' -- '所' + FONTDATA_ITEM(196, 199, 199, fontpage_196_199_199), // '扇' -- '扇' + FONTDATA_ITEM(196, 203, 203, fontpage_196_203_203), // '手' -- '手' + FONTDATA_ITEM(196, 211, 211, fontpage_196_211_211), // '打' -- '打' + FONTDATA_ITEM(196, 231, 231, fontpage_196_231_231), // '执' -- '执' + FONTDATA_ITEM(196, 249, 249, fontpage_196_249_249), // '批' -- '批' + FONTDATA_ITEM(197, 150, 150, fontpage_197_150_150), // '抖' -- '抖' + FONTDATA_ITEM(197, 189, 189, fontpage_197_189_189), // '抽' -- '抽' + FONTDATA_ITEM(197, 212, 212, fontpage_197_212_212), // '拔' -- '拔' + FONTDATA_ITEM(197, 233, 233, fontpage_197_233_233), // '择' -- '择' + FONTDATA_ITEM(198, 137, 137, fontpage_198_137_137), // '按' -- '按' + FONTDATA_ITEM(198, 161, 161, fontpage_198_161_161), // '挡' -- '挡' + FONTDATA_ITEM(198, 164, 164, fontpage_198_164_164), // '挤' -- '挤' + FONTDATA_ITEM(198, 226, 226, fontpage_198_226_226), // '换' -- '换' + FONTDATA_ITEM(199, 137, 137, fontpage_199_137_137), // '掉' -- '掉' + FONTDATA_ITEM(199, 162, 162, fontpage_199_162_162), // '探' -- '探' + FONTDATA_ITEM(199, 167, 167, fontpage_199_167_167), // '控' -- '控' + FONTDATA_ITEM(199, 210, 210, fontpage_199_210_210), // '插' -- '插' + FONTDATA_ITEM(202, 182, 182, fontpage_202_182_182), // '收' -- '收' + FONTDATA_ITEM(202, 190, 190, fontpage_202_190_190), // '放' -- '放' + FONTDATA_ITEM(202, 240, 240, fontpage_202_240_240), // '数' -- '数' + FONTDATA_ITEM(202, 244, 244, fontpage_202_244_244), // '整' -- '整' + FONTDATA_ITEM(203, 153, 153, fontpage_203_153_153), // '料' -- '料' + FONTDATA_ITEM(203, 156, 156, fontpage_203_156_156), // '斜' -- '斜' + FONTDATA_ITEM(203, 176, 176, fontpage_203_176_176), // '新' -- '新' + FONTDATA_ITEM(203, 224, 224, fontpage_203_224_224), // '无' -- '无' + FONTDATA_ITEM(203, 246, 246, fontpage_203_246_246), // '时' -- '时' + FONTDATA_ITEM(204, 142, 142, fontpage_204_142_142), // '明' -- '明' + FONTDATA_ITEM(205, 130, 130, fontpage_205_130_130), // '暂' -- '暂' + FONTDATA_ITEM(205, 171, 171, fontpage_205_171_171), // '暫' -- '暫' + FONTDATA_ITEM(205, 244, 244, fontpage_205_244_244), // '更' -- '更' + FONTDATA_ITEM(206, 128, 128, fontpage_206_128_128), // '最' -- '最' + FONTDATA_ITEM(206, 137, 137, fontpage_206_137_137), // '有' -- '有' + FONTDATA_ITEM(206, 186, 186, fontpage_206_186_186), // '机' -- '机' + FONTDATA_ITEM(206, 192, 192, fontpage_206_192_192), // '杀' -- '杀' + FONTDATA_ITEM(206, 225, 225, fontpage_206_225_225), // '条' -- '条' + FONTDATA_ITEM(206, 229, 229, fontpage_206_229_229), // '来' -- '来' + FONTDATA_ITEM(206, 255, 255, fontpage_206_255_255), // '板' -- '板' + FONTDATA_ITEM(207, 241, 241, fontpage_207_241_241), // '柱' -- '柱' + FONTDATA_ITEM(208, 161, 161, fontpage_208_161_161), // '校' -- '校' + FONTDATA_ITEM(208, 188, 188, fontpage_208_188_188), // '格' -- '格' + FONTDATA_ITEM(209, 192, 192, fontpage_209_192_192), // '检' -- '检' + FONTDATA_ITEM(211, 253, 253, fontpage_211_253_253), // '槽' -- '槽' + FONTDATA_ITEM(212, 217, 217, fontpage_212_217_217), // '橙' -- '橙' + FONTDATA_ITEM(214, 226, 226, fontpage_214_226_226), // '止' -- '止' + FONTDATA_ITEM(214, 229, 229, fontpage_214_229_229), // '步' -- '步' + FONTDATA_ITEM(215, 212, 212, fontpage_215_212_212), // '比' -- '比' + FONTDATA_ITEM(217, 161, 161, fontpage_217_161_161), // '没' -- '没' + FONTDATA_ITEM(217, 226, 226, fontpage_217_226_226), // '波' -- '波' + FONTDATA_ITEM(218, 187, 187, fontpage_218_187_187), // '活' -- '活' + FONTDATA_ITEM(218, 203, 203, fontpage_218_203_203), // '测' -- '测' + FONTDATA_ITEM(219, 136, 136, fontpage_219_136_136), // '消' -- '消' + FONTDATA_ITEM(219, 225, 225, fontpage_219_225_225), // '淡' -- '淡' + FONTDATA_ITEM(220, 133, 133, fontpage_220_133_133), // '清' -- '清' + FONTDATA_ITEM(220, 169, 169, fontpage_220_169_169), // '温' -- '温' + FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // '源' -- '源' + FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // '激' -- '激' + FONTDATA_ITEM(224, 237, 237, fontpage_224_237_237), // '灭' -- '灭' + FONTDATA_ITEM(224, 239, 239, fontpage_224_239_239), // '灯' -- '灯' + FONTDATA_ITEM(225, 185, 185, fontpage_225_185_185), // '点' -- '点' + FONTDATA_ITEM(225, 237, 237, fontpage_225_237_237), // '热' -- '热' + FONTDATA_ITEM(228, 199, 199, fontpage_228_199_199), // '片' -- '片' + FONTDATA_ITEM(228, 249, 249, fontpage_228_249_249), // '特' -- '特' + FONTDATA_ITEM(231, 135, 135, fontpage_231_135_135), // '率' -- '率' + FONTDATA_ITEM(234, 168, 168, fontpage_234_168_168), // '用' -- '用' + FONTDATA_ITEM(234, 181, 181, fontpage_234_181_181), // '电' -- '电' + FONTDATA_ITEM(236, 253, 253, fontpage_236_253_253), // '白' -- '白' + FONTDATA_ITEM(237, 132, 132, fontpage_237_132_132), // '的' -- '的' + FONTDATA_ITEM(237, 244, 244, fontpage_237_244_244), // '直' -- '直' + FONTDATA_ITEM(238, 129, 129, fontpage_238_129_129), // '省' -- '省' + FONTDATA_ITEM(238, 160, 160, fontpage_238_160_160), // '眠' -- '眠' + FONTDATA_ITEM(243, 239, 239, fontpage_243_239_239), // '积' -- '积' + FONTDATA_ITEM(243, 251, 251, fontpage_243_251_251), // '移' -- '移' + FONTDATA_ITEM(245, 239, 239, fontpage_245_239_239), // '端' -- '端' + FONTDATA_ITEM(246, 201, 201, fontpage_246_201_201), // '等' -- '等' + FONTDATA_ITEM(247, 161, 161, fontpage_247_161_161), // '管' -- '管' + FONTDATA_ITEM(248, 251, 251, fontpage_248_251_251), // '类' -- '类' + FONTDATA_ITEM(250, 171, 171, fontpage_250_171_171), // '紫' -- '紫' + FONTDATA_ITEM(253, 162, 162, fontpage_253_162_162), // '红' -- '红' + FONTDATA_ITEM(253, 191, 191, fontpage_253_191_191), // '线' -- '线' + FONTDATA_ITEM(253, 198, 198, fontpage_253_198_198), // '细' -- '细' + FONTDATA_ITEM(253, 200, 200, fontpage_253_200_200), // '终' -- '终' + FONTDATA_ITEM(253, 223, 223, fontpage_253_223_223), // '统' -- '统' + FONTDATA_ITEM(253, 231, 231, fontpage_253_231_231), // '继' -- '继' + FONTDATA_ITEM(253, 234, 234, fontpage_253_234_234), // '绪' -- '绪' + FONTDATA_ITEM(253, 237, 237, fontpage_253_237_237), // '续' -- '续' + FONTDATA_ITEM(253, 255, 255, fontpage_253_255_255), // '绿' -- '绿' + FONTDATA_ITEM(254, 150, 150, fontpage_254_150_150), // '编' -- '编' + FONTDATA_ITEM(254, 186, 186, fontpage_254_186_186), // '缺' -- '缺' + FONTDATA_ITEM(254, 209, 209, fontpage_254_209_209), // '网' -- '网' + FONTDATA_ITEM(254, 238, 238, fontpage_254_238_238), // '置' -- '置' + FONTDATA_ITEM(254, 242, 242, fontpage_254_242_242), // '署' -- '署' + FONTDATA_ITEM(256, 234, 234, fontpage_256_234_234), // '聪' -- '聪' + FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自' + FONTDATA_ITEM(263, 220, 220, fontpage_263_220_220), // '菜' -- '菜' + FONTDATA_ITEM(265, 221, 221, fontpage_265_221_221), // '蓝' -- '蓝' + FONTDATA_ITEM(272, 204, 204, fontpage_272_204_204), // '行' -- '行' + FONTDATA_ITEM(273, 171, 171, fontpage_273_171_171), // '被' -- '被' + FONTDATA_ITEM(273, 197, 197, fontpage_273_197_197), // '装' -- '装' + FONTDATA_ITEM(275, 210, 210, fontpage_275_210_210), // '角' -- '角' + FONTDATA_ITEM(279, 161, 161, fontpage_279_161_161), // '计' -- '计' + FONTDATA_ITEM(279, 174, 174, fontpage_279_174_174), // '议' -- '议' + FONTDATA_ITEM(279, 190, 190, fontpage_279_190_190), // '设' -- '设' + FONTDATA_ITEM(279, 213, 213, fontpage_279_213_213), // '试' -- '试' + FONTDATA_ITEM(279, 239, 239, fontpage_279_239_239), // '误' -- '误' + FONTDATA_ITEM(279, 247, 247, fontpage_279_247_247), // '请' -- '请' + FONTDATA_ITEM(280, 131, 131, fontpage_280_131_131), // '调' -- '调' + FONTDATA_ITEM(282, 165, 165, fontpage_282_165_165), // '败' -- '败' + FONTDATA_ITEM(286, 244, 244, fontpage_286_244_244), // '轴' -- '轴' + FONTDATA_ITEM(286, 253, 253, fontpage_286_253_253), // '载' -- '载' + FONTDATA_ITEM(287, 145, 145, fontpage_287_145_145), // '辑' -- '辑' + FONTDATA_ITEM(287, 147, 147, fontpage_287_147_147), // '输' -- '输' + FONTDATA_ITEM(287, 185, 185, fontpage_287_185_185), // '边' -- '边' + FONTDATA_ITEM(287, 208, 209, fontpage_287_208_209), // '运' -- '近' + FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // '返' -- '返' + FONTDATA_ITEM(287, 216, 216, fontpage_287_216_216), // '还' -- '还' + FONTDATA_ITEM(287, 219, 219, fontpage_287_219_219), // '进' -- '进' + FONTDATA_ITEM(288, 128, 128, fontpage_288_128_128), // '退' -- '退' + FONTDATA_ITEM(288, 137, 137, fontpage_288_137_137), // '选' -- '选' + FONTDATA_ITEM(288, 159, 159, fontpage_288_159_159), // '速' -- '速' + FONTDATA_ITEM(289, 232, 232, fontpage_289_232_232), // '部' -- '部' + FONTDATA_ITEM(291, 202, 202, fontpage_291_202_202), // '释' -- '释' + FONTDATA_ITEM(291, 205, 205, fontpage_291_205_205), // '重' -- '重' + FONTDATA_ITEM(291, 207, 207, fontpage_291_207_207), // '量' -- '量' + FONTDATA_ITEM(297, 136, 136, fontpage_297_136_136), // '针' -- '针' + FONTDATA_ITEM(297, 174, 174, fontpage_297_174_174), // '钮' -- '钮' + FONTDATA_ITEM(298, 153, 153, fontpage_298_153_153), // '错' -- '错' + FONTDATA_ITEM(298, 174, 174, fontpage_298_174_174), // '键' -- '键' + FONTDATA_ITEM(298, 255, 255, fontpage_298_255_255), // '长' -- '长' + FONTDATA_ITEM(299, 237, 237, fontpage_299_237_237), // '闭' -- '闭' + FONTDATA_ITEM(299, 244, 244, fontpage_299_244_244), // '间' -- '间' + FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // '降' -- '降' + FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除' + FONTDATA_ITEM(302, 210, 210, fontpage_302_210_210), // '青' -- '青' + FONTDATA_ITEM(302, 222, 222, fontpage_302_222_222), // '非' -- '非' + FONTDATA_ITEM(304, 249, 249, fontpage_304_249_249), // '项' -- '项' + FONTDATA_ITEM(305, 132, 132, fontpage_305_132_132), // '预' -- '预' + FONTDATA_ITEM(305, 157, 157, fontpage_305_157_157), // '额' -- '额' + FONTDATA_ITEM(305, 206, 206, fontpage_305_206_206), // '风' -- '风' + FONTDATA_ITEM(306, 241, 241, fontpage_306_241_241), // '饱' -- '饱' + FONTDATA_ITEM(308, 241, 241, fontpage_308_241_241), // '驱' -- '驱' + FONTDATA_ITEM(309, 216, 216, fontpage_309_216_216), // '高' -- '高' + FONTDATA_ITEM(317, 196, 196, fontpage_317_196_196), // '黄' -- '黄' + FONTDATA_ITEM(510, 154, 154, fontpage_510_154_154), // ':' -- ':' +}; diff --git a/Marlin/src/lcd/dogm/language_data_zh_TW.h b/Marlin/src/lcd/dogm/language_data_zh_TW.h new file mode 100644 index 0000000000..478eb92eaa --- /dev/null +++ b/Marlin/src/lcd/dogm/language_data_zh_TW.h @@ -0,0 +1,1367 @@ +/** + * Generated automatically by buildroot/share/fonts/uxggenpages.sh + * Contents will be REPLACED by future processing! + * Use genallfont.sh to generate font data for updated languages. + */ +#include + +const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8}; +const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, + 0x00,0x0b,0x02,0x04,0x0c,0x00,0x04,0x00,0x40,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0x7f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xe0,0x0b,0x0b,0x16,0x0c,0x00, + 0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xc0,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04, + 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, + 0x00}; +const u8g_fntpgm_uint8_t fontpage_156_166_166[45] U8G_FONT_SECTION("fontpage_156_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x11,0x00,0xff,0xe0,0x0a,0x00,0x4a, + 0x40,0x4a,0x40,0x2a,0x40,0x2a,0x80,0x0a,0x00,0x0a,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_170_170[45] U8G_FONT_SECTION("fontpage_156_170_170") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x49, + 0x00,0x88,0xc0,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0x80,0x88,0x80,0x88, + 0x80,0x88,0x80,0xff,0x80,0x88,0x80,0x08,0x00,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_187_187[45] U8G_FONT_SECTION("fontpage_156_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04, + 0x00,0x04,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_156_203_203[45] U8G_FONT_SECTION("fontpage_156_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x04,0x00,0x7f,0xc0,0x00,0x80,0x01, + 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xe0}; +const u8g_fntpgm_uint8_t fontpage_157_174_174[45] U8G_FONT_SECTION("fontpage_157_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x11,0x00,0x1f,0x00,0x00, + 0x00,0xff,0xe0,0x80,0x20,0x1f,0x00,0x11,0x00,0x21,0x20,0xc0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_157_228_228[45] U8G_FONT_SECTION("fontpage_157_228_228") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x0a,0x00,0x11,0x00,0x24, + 0x80,0xc2,0x60,0x3f,0x80,0x01,0x00,0x0a,0x00,0x04,0x00,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_157_253_253[45] U8G_FONT_SECTION("fontpage_157_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x80,0x12,0x80,0x22,0x40,0x24,0x40,0x68, + 0x20,0xa7,0xc0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xc0}; +const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x21,0x00,0x3f,0xe0,0x61, + 0x00,0xa3,0x80,0x23,0x80,0x25,0x40,0x29,0x20,0x31,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_158_205_206[73] U8G_FONT_SECTION("fontpage_158_205_206") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xce,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x20,0x00,0x2f,0xe0,0x60, + 0x00,0xa4,0x40,0x22,0x40,0x22,0x80,0x20,0x80,0x21,0x00,0x2f,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x10,0xc0,0x1f,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0xaf,0xe0,0x29, + 0x00,0x29,0x20,0x2a,0xa0,0x2d,0x60,0x28,0xa0}; +const u8g_fntpgm_uint8_t fontpage_158_220_220[45] U8G_FONT_SECTION("fontpage_158_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x14,0x00,0x27,0xe0,0x2a,0x00,0x72, + 0x00,0xa3,0xc0,0x22,0x00,0x22,0x00,0x23,0xe0,0x22,0x00,0x22,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_134_134[45] U8G_FONT_SECTION("fontpage_159_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x24,0x80,0x24, + 0x80,0x55,0x40,0x8e,0x20,0x15,0x00,0x24,0x80,0xc4,0x60,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_155_155[45] U8G_FONT_SECTION("fontpage_159_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x80,0x14,0x80,0x24,0x80,0x2f,0xe0,0x64, + 0x80,0xa4,0x80,0x3f,0xe0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x20}; +const u8g_fntpgm_uint8_t fontpage_159_221_221[45] U8G_FONT_SECTION("fontpage_159_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x17,0xc0,0x14,0x40,0x24,0x40,0x27,0xc0,0x61, + 0x00,0xaf,0xe0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x11,0x00,0x2f,0xe0,0x20,0x00,0x67, + 0xc0,0xa0,0x00,0x27,0xc0,0x20,0x00,0x27,0xc0,0x24,0x40,0x27,0xc0}; +const u8g_fntpgm_uint8_t fontpage_160_139_139[45] U8G_FONT_SECTION("fontpage_160_139_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x29,0x20,0x29,0x20,0x2f,0xe0,0x69, + 0x20,0xab,0xa0,0x2a,0xa0,0x2b,0xa0,0x28,0x20,0x2f,0xe0,0x28,0x20}; +const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x1f,0xe0,0x22,0x00,0x27,0xc0,0x64, + 0x40,0xa7,0xc0,0x24,0x40,0x27,0x40,0x25,0xc0,0x24,0x40,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_160_207_207[45] U8G_FONT_SECTION("fontpage_160_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x28,0x20,0x2f,0xe0,0x68, + 0x00,0xaf,0xe0,0x2a,0xa0,0x2f,0xe0,0x2a,0xa0,0x3a,0xa0,0x28,0x60}; +const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x3f,0xe0,0x20,0x00,0x4f,0xc0,0x48, + 0x40,0xdf,0xe0,0x50,0x20,0x4f,0xc0,0x41,0x00,0x41,0x00,0x47,0x00}; +const u8g_fntpgm_uint8_t fontpage_161_153_153[45] U8G_FONT_SECTION("fontpage_161_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x2f,0xc0,0x24,0x80,0x3f,0xe0,0x64, + 0x00,0xaf,0xe0,0x29,0x20,0x3f,0xe0,0x29,0x20,0x2f,0xe0,0x29,0x20}; +const u8g_fntpgm_uint8_t fontpage_161_179_179[45] U8G_FONT_SECTION("fontpage_161_179_179") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb3,0xb3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x3f,0xe0,0x2a,0x40,0x2f,0xc0,0x6a, + 0x40,0xbf,0xc0,0x22,0x80,0x3f,0xe0,0x28,0x80,0x24,0x80,0x21,0x80}; +const u8g_fntpgm_uint8_t fontpage_162_178_178[45] U8G_FONT_SECTION("fontpage_162_178_178") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb2,0xb2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x28,0x80,0x3d,0xe0,0x40,0xa0,0x5d,0xe0,0xc0, + 0x80,0x5d,0xe0,0x43,0x20,0x5d,0xe0,0x55,0x20,0x5d,0xe0,0x55,0x20}; +const u8g_fntpgm_uint8_t fontpage_162_197_197[45] U8G_FONT_SECTION("fontpage_162_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0xff,0xc0,0x08,0x00,0x11,0x00,0x7f, + 0x80,0x12,0x80,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x40,0xc1,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_200_200[45] U8G_FONT_SECTION("fontpage_162_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x84, + 0x00,0xff,0xe0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xc1,0xe0}; +const u8g_fntpgm_uint8_t fontpage_162_229_229[45] U8G_FONT_SECTION("fontpage_162_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0a, + 0x00,0x0a,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; +const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, + 0x60,0x04,0x00,0x04,0x00,0x1f,0x00,0x04,0x00,0x04,0x00,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x7f,0xc0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xff,0xe0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; +const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_247_247") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f, + 0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0,0x11,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_163_183_183[45] U8G_FONT_SECTION("fontpage_163_183_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb7,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x82,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x32, + 0x60,0x41,0x00,0x4f,0xc0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x89,0x00,0x4f,0xe0,0x59,0x00,0x09, + 0x00,0x2f,0xc0,0x29,0x00,0xcf,0xc0,0x49,0x00,0x49,0x00,0x4f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_163_250_250[45] U8G_FONT_SECTION("fontpage_163_250_250") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7f, + 0xc0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_134_134[45] U8G_FONT_SECTION("fontpage_164_134_134") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40, + 0x40,0xbf,0xa0,0x08,0x80,0x08,0x80,0x10,0x80,0x20,0x80,0xc3,0x00}; +const u8g_fntpgm_uint8_t fontpage_164_151_151[45] U8G_FONT_SECTION("fontpage_164_151_151") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x97,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7e,0x20,0x10,0x20,0x11,0x20,0x3d,0x20,0x25, + 0x20,0x65,0x20,0x99,0x20,0x09,0x20,0x10,0x20,0x20,0x20,0xc0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x27,0xe0,0xf9,0x20,0x11,0x20,0x21, + 0x20,0x69,0x20,0xb1,0x20,0x29,0x20,0x22,0x20,0x24,0x20,0x28,0xc0}; +const u8g_fntpgm_uint8_t fontpage_164_176_176[45] U8G_FONT_SECTION("fontpage_164_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfe,0x20,0x10,0x20,0x20,0xa0,0x44,0xa0,0xfe, + 0xa0,0x10,0xa0,0x7c,0xa0,0x10,0xa0,0x10,0x20,0x1e,0x20,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x50,0xa0,0x7e,0xa0,0x90,0xa0,0xfe, + 0xa0,0x10,0xa0,0x7e,0xa0,0x52,0xa0,0x52,0x20,0x56,0x20,0x10,0xe0,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x7e,0x20,0x42,0x20,0x7e,0xa0,0x48,0xa0,0x48,0xa0,0x7e,0xa0,0x6a, + 0xa0,0xaa,0xa0,0xaa,0xa0,0x2e,0x20,0x08,0xe0}; +const u8g_fntpgm_uint8_t fontpage_164_245_245[45] U8G_FONT_SECTION("fontpage_164_245_245") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x20,0x28,0x20,0x54,0xa0,0xfe,0xa0,0x44, + 0xa0,0x7c,0xa0,0x44,0xa0,0x7c,0xa0,0xc4,0x20,0x44,0x20,0x7c,0xe0}; +const u8g_fntpgm_uint8_t fontpage_165_155_155[45] U8G_FONT_SECTION("fontpage_165_155_155") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9b,0x9b,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0x08,0x00,0xff,0x80,0x08, + 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; +const u8g_fntpgm_uint8_t fontpage_165_160_160[45] U8G_FONT_SECTION("fontpage_165_160_160") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x20,0x00,0xfd,0xe0,0x25,0x20,0x25, + 0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0x20,0x55,0xe0,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_165_168_168[45] U8G_FONT_SECTION("fontpage_165_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0x79,0x00,0x01,0x00,0x03,0xe0,0xfd, + 0x20,0x21,0x20,0x21,0x20,0x49,0x20,0xfa,0x20,0x0a,0x20,0x04,0xc0}; +const u8g_fntpgm_uint8_t fontpage_165_213_213[45] U8G_FONT_SECTION("fontpage_165_213_213") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd5,0xd5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x78,0x80,0x10,0x80,0xfe,0x80,0x55,0xe0,0x7c, + 0xa0,0x54,0xa0,0x7c,0xa0,0x10,0xa0,0x7d,0x20,0x11,0x20,0xfe,0x60}; +const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63, + 0x00,0xa2,0x00,0x26,0x00,0x2a,0x00,0x22,0x20,0x22,0x20,0x21,0xe0}; +const u8g_fntpgm_uint8_t fontpage_166_202_202[45] U8G_FONT_SECTION("fontpage_166_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x44,0x40,0x24,0x80,0x15,0x00,0x7f, + 0xc0,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_212_212[45] U8G_FONT_SECTION("fontpage_166_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x27,0xc0,0x22,0x40,0xfa,0x40,0x24, + 0x80,0x24,0x80,0x3f,0xe0,0x2a,0xa0,0x2a,0xa0,0x33,0x20,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x0f,0x80,0x08,0x00,0x08,0x00,0xff, + 0xe0,0x08,0x00,0x0a,0x00,0x09,0x00,0x08,0x80,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_240_240[45] U8G_FONT_SECTION("fontpage_166_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x10,0x00,0xe7,0xc0,0x84,0x40,0x84,0x40,0xf4, + 0x40,0x84,0x40,0x84,0x40,0x94,0x40,0xe5,0x80,0x84,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_248_248[45] U8G_FONT_SECTION("fontpage_166_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7d,0xe0,0x91,0x20,0x11,0x20,0xff, + 0x20,0x11,0x20,0x5d,0x20,0x51,0x20,0x51,0xa0,0x5d,0x40,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_167_159_159[45] U8G_FONT_SECTION("fontpage_167_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xe0,0x22,0x00,0x2f,0xc0,0x28,0x40,0x2f, + 0xc0,0x28,0x40,0x2f,0xc0,0x22,0x00,0x2a,0x80,0x52,0x60,0xa6,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_214_214[45] U8G_FONT_SECTION("fontpage_167_214_214") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfc,0x00,0x4b,0xe0,0x4a,0x20,0x7a,0x20,0x49, + 0x40,0x79,0x40,0x48,0x80,0x4c,0x80,0xf9,0x40,0x0a,0x40,0x0c,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x10,0x00,0x22,0x00,0x41,0x00,0xff, + 0x80,0x00,0x80,0x7f,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7f,0x00}; +const u8g_fntpgm_uint8_t fontpage_168_136_136[45] U8G_FONT_SECTION("fontpage_168_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xdf, + 0x60,0x00,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x3f,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_168_253_253[45] U8G_FONT_SECTION("fontpage_168_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x0a,0x00,0x11,0x00,0xee,0xe0,0x00, + 0x00,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7a,0x40,0x4a,0xc0,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0c,0x00,0x70,0x00,0x11,0xe0,0xfd,0x20,0x11, + 0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x91,0x20,0x11,0xe0,0x10,0x00}; +const u8g_fntpgm_uint8_t fontpage_170_223_223[45] U8G_FONT_SECTION("fontpage_170_223_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7d,0x00,0x45,0xe0,0x7d,0x40,0x43, + 0x40,0x5d,0x40,0x55,0x40,0x54,0x80,0x94,0x80,0x9d,0x40,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_171_174_174[45] U8G_FONT_SECTION("fontpage_171_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xf3,0xc0,0x92,0x40,0x92,0x40,0xff,0xc0,0x44, + 0x80,0x7f,0x80,0x44,0x80,0x7f,0x80,0x04,0x00,0xff,0xc0,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_180_180") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb4,0xb4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0xa0,0xeb,0xc0,0xaa,0xa0,0xbf,0xe0,0xa4, + 0x80,0xaf,0xe0,0xf9,0x20,0x0f,0xe0,0x09,0x20,0x0f,0xe0,0x11,0x20}; +const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4, + 0x40,0xa7,0xc0,0xe4,0x40,0x07,0xc0,0x04,0x40,0x07,0xc0,0x0c,0x60}; +const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92, + 0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0x80,0x40,0xff,0xc0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_224_224") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x84,0x20,0x84,0x20,0xbf,0xa0,0x84, + 0x20,0x84,0x20,0x8a,0x20,0x91,0x20,0xa0,0xa0,0x80,0x20,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_174_150_150[45] U8G_FONT_SECTION("fontpage_174_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x91,0x20,0x9f,0x20,0x84,0x20,0xff, + 0xe0,0xaa,0xa0,0xae,0xa0,0xa0,0xa0,0xbf,0xa0,0x80,0x20,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x08,0x00,0xff,0xc0,0x10,0x00,0x22, + 0x00,0x62,0x00,0xaf,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_175_139_139[45] U8G_FONT_SECTION("fontpage_175_139_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7e,0x40,0x29,0x40,0x29,0x40,0xff,0x40,0x29, + 0x40,0x28,0x40,0x4c,0xc0,0x04,0x00,0x3f,0x80,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_176_202_202[45] U8G_FONT_SECTION("fontpage_176_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x2f,0xe0,0x29,0x20,0xff,0xe0,0x29, + 0x20,0x2f,0xe0,0x21,0x40,0x33,0xa0,0xe5,0xe0,0x09,0x20,0x10,0xe0}; +const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xeb,0xeb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x21,0x00,0xf7,0xc0,0x24, + 0x40,0x27,0x40,0x25,0xc0,0x34,0x40,0xef,0xe0,0x02,0x80,0x0c,0x60}; +const u8g_fntpgm_uint8_t fontpage_177_138_138[45] U8G_FONT_SECTION("fontpage_177_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x23,0xc0,0xf9,0x40,0x51,0x40,0xfb, + 0x40,0x22,0xc0,0xfc,0x20,0x24,0x20,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x3d,0x00,0x25,0x00,0x45, + 0x80,0xa5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0x1f,0x00,0x21,0x00,0x52,0x00,0x0c, + 0x00,0x34,0x00,0xcf,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xf8,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04, + 0x00,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xaa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0xff, + 0xe0,0x04,0x00,0x0a,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x0a, + 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xc4,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x24,0x00,0x3f,0xc0,0x44,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x0a,0x00,0x11,0x00,0x20,0x80,0xc0,0x60}; +const u8g_fntpgm_uint8_t fontpage_179_203_203[45] U8G_FONT_SECTION("fontpage_179_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0xfa,0x40,0x2a,0x20,0x2f, + 0xe0,0x48,0x00,0x53,0xe0,0x32,0x20,0x2a,0x20,0x4b,0xe0,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_208_208") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x2f,0xc0,0x20, + 0x80,0x61,0x00,0xbf,0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x88,0x40,0x08, + 0x00,0xff,0xe0,0x11,0x00,0x31,0x00,0x0e,0x00,0x09,0x80,0x70,0x60}; +const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x9f,0x40,0x00, + 0x00,0x7f,0xe0,0x0a,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xe0}; +const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x80,0x40,0x3f, + 0xc0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x08,0x00,0xff,0xc0,0x90,0x40,0x3f,0x00,0x52, + 0x00,0x8c,0x00,0x33,0x00,0xff,0xc0,0x21,0x00,0x21,0x00,0x3f,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_185_185[45] U8G_FONT_SECTION("fontpage_183_185_185") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x91,0x20,0x24,0x80,0x4a, + 0x40,0x11,0x00,0x20,0x80,0xdf,0x60,0x11,0x00,0x11,0x00,0x1f,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_141_141[45] U8G_FONT_SECTION("fontpage_184_141_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x28,0x40,0xaa,0x40,0x6c,0x40,0xff,0xe0,0x28, + 0x40,0x7d,0x40,0x10,0xc0,0x7c,0x40,0x10,0x40,0x1d,0x40,0xe0,0x80}; +const u8g_fntpgm_uint8_t fontpage_184_143_143[45] U8G_FONT_SECTION("fontpage_184_143_143") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24, + 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xfd,0x40,0x01,0x20,0x7f,0xe0,0x4a, + 0x80,0x7a,0x80,0x12,0x80,0x5a,0xa0,0x56,0xa0,0x92,0xa0,0x34,0x60}; +const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x09,0x00,0x00, + 0x00,0x0b,0x09,0x12,0x0c,0x00,0x00,0x7f,0xc0,0x04,0x00,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_187_242_242[43] U8G_FONT_SECTION("fontpage_187_242_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x09,0xff,0x00, + 0x00,0x0a,0x0a,0x14,0x0c,0x01,0xff,0xff,0x00,0x01,0x00,0x01,0x00,0x81,0x00,0xff, + 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, + 0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x7f,0xe0,0x42,0x00,0x42,0x00,0x7f, + 0xe0,0x42,0x00,0x47,0x00,0x4a,0x80,0x52,0x40,0xa2,0x20,0x82,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_166_166") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x49,0x00,0x7f,0xc0,0x49, + 0x00,0x4f,0x00,0x40,0x00,0x5f,0x80,0x49,0x00,0x86,0x00,0xb9,0xc0}; +const u8g_fntpgm_uint8_t fontpage_189_226_226[45] U8G_FONT_SECTION("fontpage_189_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x55,0x40,0x48,0xa0,0x7d, + 0xc0,0x45,0x20,0x5e,0x00,0x51,0xc0,0x5d,0x40,0x84,0x80,0x9b,0x60}; +const u8g_fntpgm_uint8_t fontpage_189_250_250[45] U8G_FONT_SECTION("fontpage_189_250_250") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfa,0xfa,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xef,0xc0,0x22,0x40,0x5f,0xe0,0xe2, + 0x40,0x2f,0xc0,0xa2,0x00,0x6f,0xe0,0x22,0x00,0x52,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_191_133_133[45] U8G_FONT_SECTION("fontpage_191_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x21,0x00,0x47,0xc0,0x91,0x00,0x1f, + 0xe0,0x20,0x80,0x6f,0xe0,0xa4,0x80,0x22,0x80,0x20,0x80,0x21,0x80}; +const u8g_fntpgm_uint8_t fontpage_191_140_140[45] U8G_FONT_SECTION("fontpage_191_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x00,0x24,0x80,0x47,0x00,0x92,0x40,0x2f, + 0xe0,0x64,0x20,0xa7,0xc0,0x2c,0x40,0x32,0x80,0x23,0x80,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_191_145_145[45] U8G_FONT_SECTION("fontpage_191_145_145") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xe0,0x25,0x40,0x45,0x40,0x9a,0x80,0x25, + 0x40,0x65,0x40,0xa0,0x00,0x27,0xc0,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_191_158_158[45] U8G_FONT_SECTION("fontpage_191_158_158") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9e,0x9e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x12,0x40,0x22,0x40,0x45,0xa0,0x99,0x20,0x20, + 0x00,0x65,0x00,0xa5,0x00,0x25,0xe0,0x25,0x00,0x2b,0x00,0x31,0xe0}; +const u8g_fntpgm_uint8_t fontpage_191_169_169[45] U8G_FONT_SECTION("fontpage_191_169_169") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa9,0xa9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x14,0x00,0x27,0xe0,0x4c,0x40,0x97,0xc0,0x24, + 0x40,0x67,0xc0,0xa4,0x00,0x27,0xc0,0x2c,0x80,0x33,0x00,0x2c,0xe0}; +const u8g_fntpgm_uint8_t fontpage_191_174_174[45] U8G_FONT_SECTION("fontpage_191_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x6a,0x80,0xbe,0x80,0x01,0xe0,0x5d, + 0x40,0xc3,0x40,0x5d,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; +const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x10, + 0x40,0x50,0x20,0x50,0x20,0x50,0xa0,0x90,0x80,0x10,0x80,0x0f,0x80}; +const u8g_fntpgm_uint8_t fontpage_192_167_167[45] U8G_FONT_SECTION("fontpage_192_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x25,0x00,0xb5,0x00,0xaf,0xe0,0xa9, + 0x00,0xb1,0x00,0x27,0xc0,0x21,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x2f,0xe0,0xb2,0x00,0xaa,0x80,0xa4, + 0x80,0xa5,0xa0,0x2a,0xc0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x54,0x40,0x52,0xa0,0x8f,0x80}; +const u8g_fntpgm_uint8_t fontpage_195_182_182[45] U8G_FONT_SECTION("fontpage_195_182_182") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0xb2,0x80,0xaf,0xe0,0xa4, + 0x40,0x27,0xc0,0x24,0x40,0x27,0xc0,0x25,0x40,0x2c,0xa0,0x33,0xa0}; +const u8g_fntpgm_uint8_t fontpage_195_201_201[45] U8G_FONT_SECTION("fontpage_195_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0x7f,0xe0,0x4a,0x80,0x57,0xe0,0x7c, + 0x80,0x57,0xc0,0x54,0x80,0x57,0xe0,0x4a,0x40,0xa8,0xa0,0x4f,0xa0}; +const u8g_fntpgm_uint8_t fontpage_196_144_144[45] U8G_FONT_SECTION("fontpage_196_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x80,0x02,0x40,0x7f,0xe0,0x42,0x00,0x42, + 0x00,0x7a,0x40,0x4a,0x40,0x4a,0x80,0x49,0x20,0x52,0xa0,0x84,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_182_182[45] U8G_FONT_SECTION("fontpage_196_182_182") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb6,0xb6,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x01,0xc0,0x3e,0x00,0x20,0x00,0x3f,0xc0,0x20, + 0x40,0x20,0x40,0x3f,0xc0,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x18,0x60,0x63,0x80,0x42,0x00,0x7a,0x00,0x4b, + 0xe0,0x4a,0x40,0x7a,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xe0,0x40,0x20,0x7f,0xe0,0x40, + 0x00,0x7d,0xe0,0x44,0x20,0x54,0xa0,0x4c,0x60,0x54,0xa0,0xa9,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xc0,0x7c,0x00,0x04,0x00,0x7f,0xc0,0x04, + 0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00,0x04,0x00,0x0c,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_211_211") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd3,0xd3,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0xf8,0x80,0x20,0x80,0x28, + 0x80,0x30,0x80,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0xe3,0x80}; +const u8g_fntpgm_uint8_t fontpage_196_231_231[45] U8G_FONT_SECTION("fontpage_196_231_231") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe7,0xe7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x22,0x00,0xff,0x80,0x22,0x80,0x2a, + 0x80,0x36,0x80,0x62,0x80,0xa7,0xa0,0x24,0xa0,0xa8,0xa0,0x50,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_249_249") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf9,0xf9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x80,0x24,0x80,0xfc,0x80,0x24,0xa0,0x2f, + 0xc0,0x34,0x80,0x64,0x80,0xa4,0x80,0x25,0xa0,0x26,0xa0,0xe4,0x60}; +const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x40,0x22,0x40,0xf9,0x40,0x20,0x40,0x2a, + 0x40,0x31,0x40,0x60,0xe0,0xaf,0x40,0x20,0x40,0x20,0x40,0xe0,0x40}; +const u8g_fntpgm_uint8_t fontpage_197_189_189[45] U8G_FONT_SECTION("fontpage_197_189_189") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x20,0x80,0xf8,0x80,0x27,0xe0,0x2c, + 0xa0,0x34,0xa0,0x67,0xe0,0xa4,0xa0,0x24,0xa0,0x27,0xe0,0xe4,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x22,0x40,0xff,0xe0,0x22,0x00,0x2b, + 0xc0,0x32,0x40,0x65,0x40,0xa4,0x80,0x28,0x80,0x29,0x40,0xe6,0x20}; +const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0xff,0xe0,0x25,0x20,0x29, + 0x00,0x37,0xe0,0x62,0x40,0xa6,0x40,0x21,0x80,0x22,0x80,0xec,0x60}; +const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0xe0,0xf9,0x00,0x27,0xc0,0x2c, + 0x40,0x37,0xc0,0x64,0x40,0xa7,0xc0,0x21,0x00,0x2f,0xe0,0xe1,0x00}; +const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x28,0x20,0xf2,0x80,0x24,0x40,0x29, + 0x20,0x31,0x00,0x6f,0xe0,0xa1,0x00,0x25,0x80,0x29,0x40,0xf1,0x20}; +const u8g_fntpgm_uint8_t fontpage_199_167_167[45] U8G_FONT_SECTION("fontpage_199_167_167") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa7,0xa7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xf8,0x20,0x22,0x80,0x24, + 0x40,0x38,0x20,0x67,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_199_210_210[45] U8G_FONT_SECTION("fontpage_199_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xf1,0x00,0x2f,0xe0,0x21, + 0x00,0x35,0x60,0x69,0x20,0xad,0x60,0x29,0x20,0x29,0x20,0xef,0xe0}; +const u8g_fntpgm_uint8_t fontpage_199_219_219[45] U8G_FONT_SECTION("fontpage_199_219_219") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdb,0xdb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x80,0x2f,0xe0,0x2a, + 0xa0,0x3a,0xa0,0x6c,0x60,0xa1,0x00,0x2f,0xe0,0x22,0x80,0xec,0x60}; +const u8g_fntpgm_uint8_t fontpage_201_199_199[45] U8G_FONT_SECTION("fontpage_201_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xe0,0x2a,0xa0,0xff,0xe0,0x21,0x00,0x2f, + 0xe0,0x32,0x80,0xe7,0xc0,0x21,0x00,0x2f,0xe0,0xa1,0x00,0x61,0x00}; +const u8g_fntpgm_uint8_t fontpage_201_202_203[73] U8G_FONT_SECTION("fontpage_201_202_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfd,0xc0,0xa9,0x40,0xf9,0x60,0xab,0xc0,0xfd, + 0x40,0xa9,0x80,0xab,0x60,0xfe,0x00,0x04,0x00,0xff,0xe0,0x04,0x00,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x29,0x20,0x25,0x40,0xff,0xe0,0x2a,0xa0,0x2b,0x80,0x30,0x00,0xef, + 0xe0,0x29,0x20,0x2f,0xe0,0xa9,0x20,0x6f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_201_224_224[45] U8G_FONT_SECTION("fontpage_201_224_224") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0xfa,0xa0,0x25,0x40,0x2d, + 0x60,0x35,0x40,0xe4,0x40,0x27,0xc0,0x24,0x40,0xa7,0xc0,0x68,0x40}; +const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_190_190") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x11,0x00,0xfd,0xe0,0x22,0x40,0x25, + 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4a,0x40,0x94,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_215_215[45] U8G_FONT_SECTION("fontpage_202_215_215") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7d,0x00,0x45,0x00,0x7d,0xe0,0x47,0x40,0x7d, + 0x40,0x45,0x40,0x7d,0x40,0x45,0x40,0x28,0x80,0x45,0x40,0x86,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_244_244[45] U8G_FONT_SECTION("fontpage_202_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x55,0x40,0x7c,0x80,0x39, + 0x40,0x56,0x20,0x7f,0xc0,0x04,0x00,0x27,0x80,0x24,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_202_248_248[45] U8G_FONT_SECTION("fontpage_202_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7d,0x00,0x55,0xe0,0xff,0x40,0x55, + 0x40,0xfd,0x40,0x95,0x40,0xff,0x40,0x28,0x80,0x19,0x40,0xe6,0x20}; +const u8g_fntpgm_uint8_t fontpage_203_153_153[45] U8G_FONT_SECTION("fontpage_203_153_153") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xac,0x80,0x72,0x80,0x20,0x80,0xfc, + 0x80,0x22,0x80,0x30,0xe0,0x6f,0x80,0xa0,0x80,0x20,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0x9c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x40,0x29,0x40,0x44,0xc0,0xb8,0x40,0x12, + 0x40,0x7d,0x40,0x10,0x60,0x55,0xc0,0x52,0x40,0x92,0x40,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_176_176[45] U8G_FONT_SECTION("fontpage_203_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x60,0xfd,0x80,0x45,0x00,0x29,0x00,0xfd, + 0xe0,0x11,0x40,0xfd,0x40,0x11,0x40,0x55,0x40,0x92,0x40,0x34,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_188_188[45] U8G_FONT_SECTION("fontpage_203_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x10,0x80,0xfd,0x40,0x21,0x40,0x3a, + 0x20,0x2c,0x80,0x28,0x40,0x28,0x40,0x49,0x00,0x48,0x80,0x98,0x40}; +const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_142_142") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8e,0x8e,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x03,0xe0,0xf2,0x20,0x92,0x20,0x93,0xe0,0xf2, + 0x20,0x92,0x20,0x93,0xe0,0xf2,0x20,0x04,0x20,0x08,0xa0,0x30,0x40}; +const u8g_fntpgm_uint8_t fontpage_204_194_194[45] U8G_FONT_SECTION("fontpage_204_194_194") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc2,0xc2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xf7,0xc0,0x91,0x00,0x91,0x00,0xff, + 0xe0,0x90,0x80,0x9f,0xe0,0x94,0x80,0xf2,0x80,0x00,0x80,0x03,0x80}; +const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x00,0x55,0xe0,0x7d,0x40,0x55, + 0x40,0xff,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40,0x1f,0xc0,0x10,0x40}; +const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x02,0x00,0x3f,0xc0,0x22,0x40,0x3f, + 0xc0,0x22,0x40,0x3f,0xc0,0x0a,0x00,0x04,0x00,0x1b,0x00,0xe0,0xe0}; +const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, + 0xe0,0x48,0x00,0x7f,0xc0,0x4a,0x40,0x79,0x80,0xc9,0x80,0x0e,0x60}; +const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x08,0x00,0xff,0xe0,0x10,0x00,0x1f,0x80,0x30, + 0x80,0x5f,0x80,0x90,0x80,0x1f,0x80,0x10,0x80,0x10,0x80,0x11,0x80}; +const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0xc0,0x27,0x00,0xfc,0x00,0x24,0x00,0x27, + 0xc0,0x74,0x40,0x6e,0x40,0xa5,0x80,0x28,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_207_241_241[45] U8G_FONT_SECTION("fontpage_207_241_241") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0xff,0xe0,0x21,0x00,0x71, + 0x00,0x69,0x00,0xa7,0xc0,0xa1,0x00,0x21,0x00,0x21,0x00,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x21,0x00,0x2f,0xe0,0xf0,0x00,0x22, + 0x80,0x74,0x40,0x6a,0xa0,0xa2,0x80,0x21,0x00,0x22,0x80,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0xf4,0x40,0x2a,0x80,0x21, + 0x00,0x72,0x80,0x6c,0x60,0xa7,0xc0,0x24,0x40,0x24,0x40,0x27,0xc0}; +const u8g_fntpgm_uint8_t fontpage_209_157_157[45] U8G_FONT_SECTION("fontpage_209_157_157") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x24,0x00,0x27,0xe0,0x5a,0x40,0x51,0x80,0xde, + 0x60,0x51,0x00,0x5f,0xe0,0x51,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; +const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x80,0x2f,0xe0,0xfa,0xa0,0x2f,0xe0,0x2a, + 0xa0,0x3f,0xe0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x27,0xc0,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_212_217_217[45] U8G_FONT_SECTION("fontpage_212_217_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0x40,0x2a,0xa0,0xf4,0x40,0x27,0xc0,0x38, + 0x20,0x27,0xc0,0x64,0x40,0xa7,0xc0,0x24,0x40,0x22,0x80,0x2f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_212_223_223[45] U8G_FONT_SECTION("fontpage_212_223_223") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdf,0xdf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x25,0x40,0x29,0xa0,0xff,0x40,0x25,0x20,0x6f, + 0xe0,0x75,0x40,0xaf,0xe0,0xa5,0x40,0x26,0xa0,0x29,0x60,0x32,0x20}; +const u8g_fntpgm_uint8_t fontpage_213_162_162[45] U8G_FONT_SECTION("fontpage_213_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x22,0x80,0xf4,0x40,0x2b,0xa0,0x60, + 0x00,0x7e,0xe0,0xaa,0xa0,0xae,0xe0,0x24,0x40,0x2a,0xc0,0x31,0x20}; +const u8g_fntpgm_uint8_t fontpage_214_226_226[45] U8G_FONT_SECTION("fontpage_214_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, + 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xff,0xc0}; +const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_229_229") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe5,0xe5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x27,0xc0,0x24,0x00,0x24,0x00,0xff, + 0xe0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xf8,0x00}; +const u8g_fntpgm_uint8_t fontpage_214_248_248[45] U8G_FONT_SECTION("fontpage_214_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x43,0xc0,0xf0,0x40,0x93,0xc0,0xf8,0x40,0x8f, + 0xe0,0xfc,0xa0,0x20,0x80,0xbb,0xe0,0xa2,0xa0,0xba,0xe0,0xe0,0x80}; +const u8g_fntpgm_uint8_t fontpage_215_188_188[45] U8G_FONT_SECTION("fontpage_215_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xc0,0xfd,0x40,0x11,0x40,0xff,0x60,0x84, + 0x00,0x7b,0xe0,0x01,0x40,0x79,0x40,0x4a,0x80,0x4d,0x40,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xf6, + 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xb4,0x40,0xc4,0x40,0x83,0xc0}; +const u8g_fntpgm_uint8_t fontpage_217_146_146[45] U8G_FONT_SECTION("fontpage_217_146_146") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x23,0xc0,0x84,0x40,0x59,0x40,0x10, + 0x80,0x27,0xc0,0x24,0x40,0xc2,0x80,0x41,0x00,0x46,0x80,0x58,0x60}; +const u8g_fntpgm_uint8_t fontpage_218_187_187[45] U8G_FONT_SECTION("fontpage_218_187_187") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbb,0xbb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x81,0x00,0x5f,0xe0,0x11, + 0x00,0x21,0x00,0x27,0xc0,0xc4,0x40,0x44,0x40,0x47,0xc0,0x44,0x40}; +const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xe0,0x14, + 0x20,0x27,0xe0,0x24,0x20,0xc7,0xe0,0x44,0x20,0x44,0x20,0x44,0x60}; +const u8g_fntpgm_uint8_t fontpage_219_188_188[45] U8G_FONT_SECTION("fontpage_219_188_188") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbc,0xbc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x21,0x00,0x8f,0xe0,0x50,0x00,0x17, + 0xc0,0x24,0x40,0x27,0xc0,0xc1,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; +const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_225_225") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe1,0xe1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x25,0x40,0x09,0x80,0x82,0x80,0x54, + 0x40,0x29,0x20,0x25,0x40,0xc5,0x80,0x49,0x00,0x42,0x80,0x5c,0x60}; +const u8g_fntpgm_uint8_t fontpage_220_133_133[45] U8G_FONT_SECTION("fontpage_220_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x2f,0xe0,0x01,0x00,0x97,0xc0,0x51, + 0x00,0x2f,0xe0,0x24,0x40,0xc7,0x40,0x45,0xc0,0x44,0x40,0x44,0xc0}; +const u8g_fntpgm_uint8_t fontpage_220_172_172[45] U8G_FONT_SECTION("fontpage_220_172_172") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4e,0x20,0x2a,0xa0,0x0a,0xa0,0x8e,0xa0,0x5a, + 0xa0,0x2e,0xa0,0x2a,0xa0,0xca,0xa0,0x4e,0x20,0x4a,0x20,0x51,0x60}; +const u8g_fntpgm_uint8_t fontpage_221_144_144[45] U8G_FONT_SECTION("fontpage_221_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x80,0x8b,0xe0,0x4a,0x20,0x1b, + 0xe0,0x2a,0x20,0x2b,0xe0,0xc8,0x80,0x4a,0xc0,0x54,0xa0,0x69,0xa0}; +const u8g_fntpgm_uint8_t fontpage_221_150_150[45] U8G_FONT_SECTION("fontpage_221_150_150") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x85,0x00,0x4f,0xe0,0x99,0x00,0x4f,0xc0,0x49, + 0x00,0xcf,0xc0,0x49,0x00,0x4f,0xe0,0x04,0x00,0xff,0xe0,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_221_171_171[45] U8G_FONT_SECTION("fontpage_221_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x25,0x40,0x06,0xc0,0x84,0x40,0x47, + 0xc0,0x20,0x00,0x2f,0xe0,0xca,0xa0,0x4a,0xa0,0x4a,0xa0,0x5f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x3e,0x80,0x12,0xe0,0x9e,0xa0,0x53, + 0xa0,0x3e,0xa0,0x28,0xa0,0xdf,0xa0,0x4a,0x40,0x52,0xa0,0x65,0x20}; +const u8g_fntpgm_uint8_t fontpage_224_237_237[43] U8G_FONT_SECTION("fontpage_224_237_237") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xed,0xed,0x00,0x09,0xff,0x00, + 0x00,0x0b,0x0a,0x14,0x0c,0x00,0xff,0xff,0xe0,0x04,0x00,0x24,0x40,0x24,0x40,0x24, + 0x80,0x4a,0x00,0x0a,0x00,0x11,0x00,0x20,0xe0,0xc0,0x40}; +const u8g_fntpgm_uint8_t fontpage_224_239_239[45] U8G_FONT_SECTION("fontpage_224_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x17,0xe0,0x54,0x80,0x58,0x80,0x50, + 0x80,0x90,0x80,0x10,0x80,0x10,0x80,0x28,0x80,0x44,0x80,0x81,0x80}; +const u8g_fntpgm_uint8_t fontpage_226_161_161[45] U8G_FONT_SECTION("fontpage_226_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0x7f,0xe0,0xaa,0x80,0x2a,0x80,0xff, + 0xe0,0x2a,0x80,0x2a,0x80,0xff,0xe0,0x12,0x40,0x49,0x20,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_227_177_177[45] U8G_FONT_SECTION("fontpage_227_177_177") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb1,0xb1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xf9,0x00,0x23,0xc0,0xfd,0x40,0x53, + 0x40,0xa9,0x40,0xfa,0xe0,0x22,0x20,0xfa,0x40,0x49,0x20,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_227_200_200[45] U8G_FONT_SECTION("fontpage_227_200_200") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc8,0xc8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2f,0xa0,0x2b,0x40,0xac,0x80,0xb7,0xc0,0xa8, + 0x20,0x37,0xc0,0x24,0x40,0x27,0xc0,0x52,0x80,0x49,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x21,0x00,0x3f,0xe0,0x20, + 0x00,0x20,0x00,0x3f,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x88,0x40,0x52,0x80,0x0c, + 0x00,0x2a,0x80,0xdf,0x40,0x04,0x00,0xff,0xe0,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_234_168_168[45] U8G_FONT_SECTION("fontpage_234_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x44,0x40,0x7f,0xc0,0x44, + 0x40,0x44,0x40,0x7f,0xc0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xc0}; +const u8g_fntpgm_uint8_t fontpage_234_204_204[45] U8G_FONT_SECTION("fontpage_234_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x44,0x40,0x7f,0xc0,0x44,0x40,0x7f, + 0xc0,0x0a,0x00,0x31,0x80,0xd1,0x60,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_236_253_253[34] U8G_FONT_SECTION("fontpage_236_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x08,0x0b,0x0b,0x0c,0x02,0xff,0x10,0x20,0xff,0x81,0x81,0xff,0x81,0x81,0x81, + 0xff,0x81}; +const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x22,0x00,0x42,0x00,0xf7,0xc0,0x98,0x40,0x90, + 0x40,0xf4,0x40,0x92,0x40,0x92,0x40,0x90,0x40,0xf0,0x40,0x91,0x80}; +const u8g_fntpgm_uint8_t fontpage_237_244_244[45] U8G_FONT_SECTION("fontpage_237_244_244") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x04,0x00,0x3f,0x80,0x20, + 0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0x20,0x80,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_238_129_129[45] U8G_FONT_SECTION("fontpage_238_129_129") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x81,0x81,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x14,0x80,0x25,0x60,0x46,0x20,0x1f, + 0x80,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80}; +const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_160_160") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa0,0xa0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf4,0x20,0x97,0xe0,0xf4,0x80,0x94, + 0x80,0x97,0xe0,0xf4,0x80,0x94,0x80,0xf4,0xa0,0x96,0x60,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_240_141_141[45] U8G_FONT_SECTION("fontpage_240_141_141") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8d,0x8d,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x02,0x00,0xfa,0x00,0x23,0xe0,0x24,0x20,0x79, + 0x40,0xc9,0x00,0x49,0x00,0x49,0x00,0x7a,0x80,0x4c,0x40,0x08,0x20}; +const u8g_fntpgm_uint8_t fontpage_243_251_251[45] U8G_FONT_SECTION("fontpage_243_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xe3,0xe0,0x24,0x20,0xfa,0x40,0x21, + 0x80,0x36,0x80,0x29,0xe0,0x62,0x20,0xa5,0x40,0x20,0x80,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_244_205_205[45] U8G_FONT_SECTION("fontpage_244_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xef,0xe0,0x21,0x00,0xff,0xc0,0x21, + 0x00,0x2f,0xe0,0x34,0x40,0x6f,0xc0,0xa4,0x40,0x27,0xc0,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_245_239_239[45] U8G_FONT_SECTION("fontpage_245_239_239") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xef,0xef,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x81,0x00,0x45,0x20,0xf7,0xe0,0x00,0x00,0xaf, + 0xe0,0xa1,0x00,0xaf,0xe0,0x4a,0xa0,0x6a,0xa0,0x8a,0xa0,0x08,0x60}; +const u8g_fntpgm_uint8_t fontpage_246_201_201[45] U8G_FONT_SECTION("fontpage_246_201_201") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc9,0xc9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x7b,0xe0,0x94,0x80,0x7f,0xc0,0x04, + 0x00,0xff,0xe0,0x01,0x00,0x7f,0xc0,0x11,0x00,0x09,0x00,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_247_161_161[45] U8G_FONT_SECTION("fontpage_247_161_161") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa1,0xa1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x3d,0xe0,0x52,0x80,0xff,0xe0,0x80, + 0x20,0x3f,0x80,0x20,0x80,0x3f,0xc0,0x20,0x40,0x20,0x40,0x3f,0xc0}; +const u8g_fntpgm_uint8_t fontpage_249_251_251[45] U8G_FONT_SECTION("fontpage_249_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x09,0x0b,0x16,0x0c,0x01,0xff,0x03,0x80,0xfc,0x00,0x11,0x00,0x7e,0x00,0x08, + 0x00,0x11,0x00,0xff,0x80,0x08,0x80,0x2a,0x00,0x49,0x00,0x98,0x80}; +const u8g_fntpgm_uint8_t fontpage_250_171_171[45] U8G_FONT_SECTION("fontpage_250_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x51,0x40,0x5d,0x80,0x51,0x20,0xfd, + 0xe0,0x08,0x80,0x3f,0x00,0x08,0x80,0x7f,0xc0,0x24,0x80,0xcc,0x60}; +const u8g_fntpgm_uint8_t fontpage_250_176_176[45] U8G_FONT_SECTION("fontpage_250_176_176") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xb0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xe0,0x55,0x20,0xf5,0x20,0x25, + 0x20,0x57,0xe0,0xed,0x20,0x05,0x20,0x55,0x20,0xaf,0xe0,0xac,0x20}; +const u8g_fntpgm_uint8_t fontpage_250_194_194[45] U8G_FONT_SECTION("fontpage_250_194_194") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc2,0xc2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x23,0xc0,0x54,0x40,0xf2,0x80,0x21, + 0x00,0x52,0x80,0xec,0x60,0x01,0x00,0x50,0x80,0xab,0x00,0x80,0xc0}; +const u8g_fntpgm_uint8_t fontpage_250_241_242[73] U8G_FONT_SECTION("fontpage_250_241_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf1,0xf2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x20,0x80,0x57,0xe0,0xf1,0x00,0x22, + 0x40,0x57,0xa0,0xe8,0x00,0x02,0x80,0x52,0xa0,0xac,0xa0,0xa8,0x60,0x0b,0x0b,0x16, + 0x0c,0x00,0xff,0x21,0x00,0x21,0x00,0x52,0x40,0xf7,0x80,0x21,0x40,0x57,0xe0,0xe8, + 0x80,0x02,0xc0,0x54,0xa0,0xa8,0xa0,0xa9,0x80}; +const u8g_fntpgm_uint8_t fontpage_251_178_178[45] U8G_FONT_SECTION("fontpage_251_178_178") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb2,0xb2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xe0,0x24,0x20,0x55,0x60,0xf4,0xa0,0x27, + 0xe0,0x54,0xa0,0xef,0xe0,0x05,0x20,0x55,0xe0,0xac,0x20,0xac,0x60}; +const u8g_fntpgm_uint8_t fontpage_251_210_210[45] U8G_FONT_SECTION("fontpage_251_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x20,0x27,0xa0,0x51,0x40,0xff,0xe0,0x21, + 0x00,0x53,0xe0,0xee,0x20,0x03,0xe0,0x52,0x20,0xab,0xe0,0xaa,0x20}; +const u8g_fntpgm_uint8_t fontpage_251_218_218[45] U8G_FONT_SECTION("fontpage_251_218_218") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xda,0xda,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xc0,0x54,0x40,0xf7,0xc0,0x24, + 0x40,0x57,0xc0,0xe9,0x20,0x07,0x40,0x53,0x80,0xad,0x40,0xab,0x20}; +const u8g_fntpgm_uint8_t fontpage_251_232_232[45] U8G_FONT_SECTION("fontpage_251_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x2f,0xe0,0x58,0x20,0xff,0xe0,0x28, + 0x00,0x5f,0xe0,0xea,0xa0,0x0f,0xe0,0x5a,0xa0,0xaa,0xa0,0xaa,0x60}; +const u8g_fntpgm_uint8_t fontpage_252_174_174[45] U8G_FONT_SECTION("fontpage_252_174_174") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xae,0xae,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0x44,0x20,0xfb,0xe0,0x24, + 0x80,0x5d,0xe0,0xf5,0x20,0x05,0xe0,0x55,0x20,0xad,0xe0,0xa5,0x20}; +const u8g_fntpgm_uint8_t fontpage_252_189_189[45] U8G_FONT_SECTION("fontpage_252_189_189") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbd,0xbd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0x27,0xe0,0x55,0x60,0xf6,0xa0,0x25, + 0x20,0x56,0xa0,0xef,0xe0,0x01,0x40,0x56,0xa0,0xaa,0x60,0xa9,0xc0}; +const u8g_fntpgm_uint8_t fontpage_252_252_252[45] U8G_FONT_SECTION("fontpage_252_252_252") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4a,0x40,0x4d,0xa0,0x8a,0x40,0xfd,0xa0,0x28, + 0x00,0x4f,0xe0,0xfa,0x40,0x0d,0xa0,0x5a,0x40,0xad,0xa0,0xaf,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_140_140[45] U8G_FONT_SECTION("fontpage_253_140_140") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8c,0x8c,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x4f,0xe0,0x91,0x00,0xef,0xe0,0x2a, + 0xa0,0x5f,0xe0,0xf4,0x40,0x07,0xc0,0x54,0x40,0xaf,0xc0,0xac,0x60}; +const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_162_162") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa2,0xa2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x00,0x27,0xc0,0x41,0x00,0x51,0x00,0xe1, + 0x00,0x21,0x00,0x41,0x00,0xf1,0x00,0x01,0x00,0x31,0x00,0xcf,0xe0}; +const u8g_fntpgm_uint8_t fontpage_253_255_255[45] U8G_FONT_SECTION("fontpage_253_255_255") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x20,0x40,0x43,0xc0,0xf0,0x40,0x2f, + 0xe0,0x41,0x20,0xf5,0x40,0x03,0x80,0x35,0x40,0xc9,0x20,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_254_186_186[45] U8G_FONT_SECTION("fontpage_254_186_186") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xba,0xba,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x41,0x00,0x7b,0xc0,0xa1,0x40,0x21, + 0x40,0xff,0xe0,0x21,0x00,0xa9,0x00,0xaa,0x80,0xfa,0x40,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_254_209_209[45] U8G_FONT_SECTION("fontpage_254_209_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x91,0x40,0xd5,0x40,0xa2, + 0x40,0x92,0x40,0xad,0x40,0xc5,0x40,0x88,0x40,0x80,0x40,0x81,0xc0}; +const u8g_fntpgm_uint8_t fontpage_254_238_238[45] U8G_FONT_SECTION("fontpage_254_238_238") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xee,0xee,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x4a,0x40,0x7f,0xc0,0x04,0x00,0xff, + 0xe0,0x20,0x80,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_242_242") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf2,0xf2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x49,0x20,0x7f,0xe0,0x04,0x40,0x3f, + 0x80,0x05,0x00,0xff,0xe0,0x30,0x80,0xdf,0x80,0x10,0x80,0x1f,0x80}; +const u8g_fntpgm_uint8_t fontpage_256_240_240[45] U8G_FONT_SECTION("fontpage_256_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf9,0x00,0x57,0xe0,0x56,0xa0,0x75,0x20,0x56, + 0xa0,0x77,0xe0,0x51,0x00,0x52,0xc0,0xfe,0x20,0x12,0x60,0x11,0xc0}; +const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259_234_234") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00, + 0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20,0xfe,0x82,0x82,0xfe,0x82,0xfe,0x82,0x82, + 0xfe,0x82}; +const u8g_fntpgm_uint8_t fontpage_265_221_221[45] U8G_FONT_SECTION("fontpage_265_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x52,0x00,0x53, + 0xc0,0x55,0x00,0x10,0x80,0x7f,0xc0,0x4a,0x40,0x4a,0x40,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_272_204_204[45] U8G_FONT_SECTION("fontpage_272_204_204") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x40,0x00,0x80,0x00,0x10,0x00,0x2f, + 0xe0,0x60,0x80,0xa0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; +const u8g_fntpgm_uint8_t fontpage_272_232_232[45] U8G_FONT_SECTION("fontpage_272_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, + 0x00,0xff,0xe0,0x0a,0x40,0x12,0x80,0x31,0x00,0xd4,0x80,0x18,0x60}; +const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_171_171") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xab,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x80,0x20,0x80,0xff,0xe0,0x14,0xa0,0x2c, + 0x80,0x77,0xe0,0xad,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x9f,0xe0,0x51,0x00,0x31,0x00,0xd7, + 0xc0,0x12,0x00,0xff,0xe0,0x0c,0x40,0x32,0x80,0xd1,0x00,0x18,0xe0}; +const u8g_fntpgm_uint8_t fontpage_273_221_221[45] U8G_FONT_SECTION("fontpage_273_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x51,0x00,0x7f,0xe0,0x11,0x00,0xf1,0x00,0x57, + 0xc0,0x84,0x00,0xff,0xe0,0x14,0x80,0x33,0x00,0xd5,0x80,0x18,0x60}; +const u8g_fntpgm_uint8_t fontpage_274_135_135[45] U8G_FONT_SECTION("fontpage_274_135_135") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x00,0x27,0xe0,0xf8,0x00,0x17,0xc0,0x2c, + 0x40,0x77,0xc0,0xac,0x40,0x27,0xc0,0x2c,0x40,0x33,0x80,0x2c,0x60}; +const u8g_fntpgm_uint8_t fontpage_275_210_210[45] U8G_FONT_SECTION("fontpage_275_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x00,0xff,0x10,0x00,0x1f,0x00,0x22,0x00,0x7f,0xc0,0xa4, + 0x40,0x3f,0xc0,0x24,0x40,0x3f,0xc0,0x24,0x40,0x45,0x40,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_276_136_136[45] U8G_FONT_SECTION("fontpage_276_136_136") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x10,0x80,0xfc,0x80,0x00,0x80,0x7f, + 0xe0,0x00,0x80,0x78,0x80,0x00,0x80,0x78,0x80,0x48,0x80,0x78,0x80}; +const u8g_fntpgm_uint8_t fontpage_276_138_138[45] U8G_FONT_SECTION("fontpage_276_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xc0,0xf2,0x40,0x02,0x40,0xf2,0x40,0x02, + 0x40,0xff,0xc0,0x02,0x40,0xf2,0x40,0x92,0x60,0xf2,0x60,0x92,0x20}; +const u8g_fntpgm_uint8_t fontpage_276_152_152[45] U8G_FONT_SECTION("fontpage_276_152_152") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x00,0xf7,0xc0,0x00,0x40,0xf0,0x40,0x07, + 0xc0,0xf4,0x40,0x04,0x00,0xf4,0x00,0x94,0x20,0xf4,0x20,0x93,0xe0}; +const u8g_fntpgm_uint8_t fontpage_276_173_173[45] U8G_FONT_SECTION("fontpage_276_173_173") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xad,0xad,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0x80,0xf4,0x80,0x04,0x80,0xf4,0xe0,0x08, + 0x00,0xf7,0xc0,0x04,0x40,0xf2,0x80,0x91,0x00,0xf2,0x80,0x9c,0x60}; +const u8g_fntpgm_uint8_t fontpage_276_230_230[45] U8G_FONT_SECTION("fontpage_276_230_230") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe6,0xe6,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0xf0,0xa0,0x0f,0xe0,0xf0,0x80,0x07, + 0x80,0xf2,0x80,0x02,0x80,0xf2,0x80,0x93,0xa0,0xfc,0x60,0x90,0x20}; +const u8g_fntpgm_uint8_t fontpage_277_164_164[45] U8G_FONT_SECTION("fontpage_277_164_164") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa4,0xa4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0xf4,0x40,0x04,0x40,0xf7,0xc0,0x00, + 0x00,0xf7,0xc0,0x01,0x00,0xff,0xe0,0x92,0x80,0xf4,0x40,0x98,0x20}; +const u8g_fntpgm_uint8_t fontpage_277_191_191[45] U8G_FONT_SECTION("fontpage_277_191_191") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xe0,0xf4,0x20,0x05,0x20,0xf7,0xa0,0x05, + 0x20,0xf7,0xe0,0x04,0x20,0xf7,0xa0,0x96,0xa0,0xf7,0xa0,0x98,0x60}; +const u8g_fntpgm_uint8_t fontpage_277_203_203[45] U8G_FONT_SECTION("fontpage_277_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0xff,0xe0,0x01,0x00,0xf7,0xc0,0x01, + 0x00,0xff,0xe0,0x04,0x40,0xf7,0xc0,0x94,0x40,0xf7,0xc0,0x94,0x40}; +const u8g_fntpgm_uint8_t fontpage_278_240_240[45] U8G_FONT_SECTION("fontpage_278_240_240") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf0,0xf0,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x40,0xff,0xe0,0x01,0x00,0xf7,0xc0,0x01, + 0x00,0xff,0xe0,0x04,0xa0,0xff,0xe0,0x94,0xa0,0xfe,0x40,0x95,0xa0}; +const u8g_fntpgm_uint8_t fontpage_279_138_138[45] U8G_FONT_SECTION("fontpage_279_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x40,0xae,0xa0,0x40,0x40,0xae,0xa0,0xea, + 0xe0,0x5e,0x40,0xa0,0xa0,0x1f,0xc0,0x69,0x00,0x06,0x00,0x79,0xe0}; +const u8g_fntpgm_uint8_t fontpage_281_199_199[45] U8G_FONT_SECTION("fontpage_281_199_199") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc7,0xc7,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x88,0x00,0x5f,0xc0,0x22,0x40,0xff,0x00,0x61, + 0xc0,0x3f,0x00,0x21,0x00,0x3f,0x00,0x21,0x00,0x3f,0x00,0xe1,0xc0}; +const u8g_fntpgm_uint8_t fontpage_285_248_248[45] U8G_FONT_SECTION("fontpage_285_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0xf8,0x80,0x23,0xe0,0xfa,0xa0,0xaa, + 0xa0,0xfa,0xa0,0xab,0xe0,0xfa,0xa0,0x22,0xa0,0xfb,0xe0,0x22,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_137_137[45] U8G_FONT_SECTION("fontpage_286_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x80,0x7d,0x40,0x11,0x00,0xff,0xe0,0x11, + 0x00,0xff,0x20,0x55,0x40,0x7c,0x80,0x54,0xa0,0xff,0x60,0x12,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_175_175[45] U8G_FONT_SECTION("fontpage_286_175_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xc0,0xfa,0x40,0x23,0xc0,0xf8,0x00,0xaf, + 0xe0,0xfa,0x40,0xab,0xc0,0xfa,0x40,0x22,0xe0,0xff,0x40,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_286_184_184[45] U8G_FONT_SECTION("fontpage_286_184_184") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb8,0xb8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x21,0x00,0xfa,0x80,0x24,0x60,0xfb,0x80,0xae, + 0x20,0xfa,0xa0,0xae,0xa0,0xfa,0xa0,0x2e,0xa0,0xfa,0x20,0x2a,0x60}; +const u8g_fntpgm_uint8_t fontpage_287_209_209[45] U8G_FONT_SECTION("fontpage_287_209_209") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x24,0x00,0x07,0xe0,0xe4, + 0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xe0,0xe6, + 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_128_128[45] U8G_FONT_SECTION("fontpage_288_128_128") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x8f,0xc0,0x48,0x40,0x4f,0xc0,0x08,0x40,0xcf, + 0xc0,0x48,0x00,0x4b,0x40,0x48,0x80,0x4e,0x40,0xb0,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_159_159") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9f,0x9f,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x3f,0xe0,0x21,0x00,0x0f,0xe0,0xe9, + 0x20,0x2f,0xe0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_178_178[45] U8G_FONT_SECTION("fontpage_288_178_178") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb2,0xb2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x43,0x00,0x24,0x80,0x27,0xe0,0x0c,0x80,0xf7, + 0xe0,0x24,0x80,0x27,0xe0,0x24,0x80,0x27,0xe0,0x54,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_203_203[45] U8G_FONT_SECTION("fontpage_288_203_203") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x29,0x20,0x2f,0xe0,0x05,0x40,0xe7, + 0xc0,0x25,0x40,0x27,0xc0,0x21,0x00,0x2f,0xe0,0x51,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_212_212[45] U8G_FONT_SECTION("fontpage_288_212_212") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x27,0xc0,0x21,0x00,0x0f,0xe0,0xe2, + 0x80,0x2f,0xe0,0x21,0x00,0x2f,0xe0,0x21,0x00,0x51,0x00,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_288_248_248[45] U8G_FONT_SECTION("fontpage_288_248_248") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf8,0xf8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4e,0xe0,0x2a,0xa0,0x2e,0xe0,0x08,0x80,0xea, + 0xa0,0x2f,0xe0,0x22,0x80,0x2f,0xe0,0x22,0x40,0x54,0x20,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_289_132_132[45] U8G_FONT_SECTION("fontpage_289_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x9f,0xc0,0x55,0x40,0x5f,0xc0,0x00,0x00,0xff, + 0xe0,0x28,0x80,0x2f,0xa0,0x27,0x40,0x2a,0x80,0x52,0x40,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_289_138_138[45] U8G_FONT_SECTION("fontpage_289_138_138") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8a,0x8a,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x42,0x00,0x2f,0xc0,0x28,0x40,0x1f,0xe0,0xf4, + 0xa0,0x29,0x40,0x3f,0xe0,0x22,0x00,0x27,0xc0,0x58,0xc0,0x8f,0xe0}; +const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_232_232") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0xe0,0xff,0x20,0x45,0x20,0x29,0x40,0xff, + 0x80,0x01,0x40,0x7d,0x20,0x45,0x20,0x45,0xa0,0x7d,0x40,0x45,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_202_202[45] U8G_FONT_SECTION("fontpage_291_202_202") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xca,0xca,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x1f,0xc0,0xe2,0x80,0xa9,0x00,0x72,0x80,0xfd, + 0x60,0x31,0x00,0x6f,0xc0,0xa1,0x00,0xaf,0xe0,0x21,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0x24,0x80,0x3f, + 0x80,0x24,0x80,0x3f,0x80,0x04,0x00,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_207_207") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcf,0xcf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0x80,0x20,0x80,0x3f,0x80,0x20,0x80,0xff, + 0xe0,0x24,0x80,0x3f,0x80,0x24,0x80,0x7f,0xc0,0x04,0x00,0xff,0xe0}; +const u8g_fntpgm_uint8_t fontpage_291_221_221[45] U8G_FONT_SECTION("fontpage_291_221_221") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdd,0xdd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x20,0x80,0x50,0x80,0x88,0x80,0x78,0x80,0x27, + 0xe0,0xf8,0x80,0x20,0x80,0xa8,0x80,0x70,0x80,0x38,0x80,0xc0,0x80}; +const u8g_fntpgm_uint8_t fontpage_292_149_149[45] U8G_FONT_SECTION("fontpage_292_149_149") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x27,0xc0,0x31,0x40,0x49,0x40,0xf9,0x40,0x21, + 0x40,0xff,0xc0,0x22,0x40,0xaa,0x40,0x72,0x40,0x3a,0x40,0xc7,0xe0}; +const u8g_fntpgm_uint8_t fontpage_294_175_175[45] U8G_FONT_SECTION("fontpage_294_175_175") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xaf,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x40,0x57,0xe0,0x8a,0x40,0x7a,0x40,0x27, + 0xe0,0xf8,0x00,0x23,0xe0,0xaa,0x20,0x73,0xe0,0x3a,0x20,0xe3,0xe0}; +const u8g_fntpgm_uint8_t fontpage_294_245_245[45] U8G_FONT_SECTION("fontpage_294_245_245") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf5,0xf5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2c,0x80,0x25,0xe0,0x54,0xa0,0xfb,0xe0,0x2c, + 0xa0,0xf7,0xe0,0x24,0x80,0xb7,0xe0,0x6c,0x80,0x34,0x80,0xcb,0xe0}; +const u8g_fntpgm_uint8_t fontpage_298_247_247[45] U8G_FONT_SECTION("fontpage_298_247_247") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf7,0xf7,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0x3f,0x80,0x20,0x00,0x3f,0x00,0x20,0x00,0x3f, + 0x00,0x20,0x00,0xff,0xc0,0x24,0x80,0x23,0x00,0x29,0x00,0x30,0xc0}; +const u8g_fntpgm_uint8_t fontpage_299_137_137[45] U8G_FONT_SECTION("fontpage_299_137_137") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xfb, + 0xe0,0x82,0x20,0xbf,0xa0,0x8a,0x20,0x92,0x20,0xa2,0x20,0x86,0xe0}; +const u8g_fntpgm_uint8_t fontpage_299_139_139[45] U8G_FONT_SECTION("fontpage_299_139_139") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8b,0x8b,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xfb, + 0xe0,0x80,0x20,0x9f,0x20,0x8a,0x20,0xbf,0xa0,0x8a,0x20,0x92,0xe0}; +const u8g_fntpgm_uint8_t fontpage_299_147_147[45] U8G_FONT_SECTION("fontpage_299_147_147") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x93,0x93,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xfb, + 0xe0,0x9f,0x20,0x91,0x20,0x9f,0x20,0x91,0x20,0x9f,0x20,0x80,0xe0}; +const u8g_fntpgm_uint8_t fontpage_299_220_220[45] U8G_FONT_SECTION("fontpage_299_220_220") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x8a,0x20,0xfb,0xe0,0x8a,0x20,0xf5, + 0xe0,0xaa,0xa0,0xbb,0xa0,0xaa,0xa0,0xbb,0xa0,0x8a,0x20,0xb2,0x60}; +const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf2,0x00,0x93,0xe0,0xa6,0x40,0xc1,0x80,0xa6, + 0x60,0x91,0x00,0x97,0xe0,0xd5,0x00,0xaf,0xe0,0x81,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xcb,0xa0,0xa1, + 0x00,0x9f,0xe0,0x91,0x00,0xe5,0x40,0x89,0x20,0x91,0x20,0x83,0x00}; +const u8g_fntpgm_uint8_t fontpage_301_217_217[45] U8G_FONT_SECTION("fontpage_301_217_217") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd9,0xd9,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x2a,0x80,0x3f,0xe0,0x6a,0x80,0xbf,0xc0,0x2a, + 0x80,0x3f,0xe0,0x00,0x00,0x3f,0xc0,0x08,0x80,0x07,0x00,0x78,0xe0}; +const u8g_fntpgm_uint8_t fontpage_301_251_251[45] U8G_FONT_SECTION("fontpage_301_251_251") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfb,0xfb,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x04,0x00,0xff,0xe0,0xa4,0xa0,0x7f, + 0xc0,0x44,0x40,0x7f,0xc0,0x44,0x40,0x7f,0xc0,0x04,0x20,0x07,0xe0}; +const u8g_fntpgm_uint8_t fontpage_302_210_210[45] U8G_FONT_SECTION("fontpage_302_210_210") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd2,0xd2,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0x7f,0xc0,0x04,0x00,0x3f,0x80,0x04, + 0x00,0xff,0xe0,0x10,0x80,0x1f,0x80,0x10,0x80,0x1f,0x80,0x10,0x80}; +const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a, + 0x00,0x7b,0xc0,0x0a,0x00,0x0a,0x00,0xfb,0xe0,0x0a,0x00,0x0a,0x00}; +const u8g_fntpgm_uint8_t fontpage_302_226_226[45] U8G_FONT_SECTION("fontpage_302_226_226") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe2,0xe2,0x00,0x0a,0xff,0x00, + 0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x08,0x00,0x10,0x00,0xff,0xc0,0x92, + 0x40,0x9e,0x40,0x92,0x40,0x9e,0x40,0x92,0x40,0xff,0xc0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_304_133_133[45] U8G_FONT_SECTION("fontpage_304_133_133") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x07,0xe0,0xf9,0x00,0x27,0xe0,0x24,0x20,0x27, + 0xe0,0x24,0x20,0x3f,0xe0,0xc4,0x20,0x07,0xe0,0x02,0x40,0x0c,0x20}; +const u8g_fntpgm_uint8_t fontpage_304_144_144[45] U8G_FONT_SECTION("fontpage_304_144_144") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xff,0xe0,0x91,0x00,0x67,0xc0,0x24,0x40,0xff, + 0xc0,0x24,0x40,0x27,0xc0,0x24,0x40,0x27,0xc0,0x22,0x80,0xec,0x60}; +const u8g_fntpgm_uint8_t fontpage_304_205_205[45] U8G_FONT_SECTION("fontpage_304_205_205") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x23,0xe0,0xfc,0x80,0xa7,0xe0,0x3a,0x20,0x4b, + 0xe0,0xb2,0x20,0x4b,0xe0,0xfe,0x20,0x4b,0xe0,0x79,0x40,0x4e,0x20}; +const u8g_fntpgm_uint8_t fontpage_304_222_222[45] U8G_FONT_SECTION("fontpage_304_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xab,0xe0,0x70,0x80,0x23,0xe0,0xfa,0x20,0x73, + 0xe0,0xaa,0x20,0x23,0xe0,0xfa,0x20,0x23,0xe0,0x51,0x40,0x8e,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_132_132[45] U8G_FONT_SECTION("fontpage_305_132_132") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xfb,0xe0,0x10,0x80,0x63,0xe0,0x22,0x20,0xfa, + 0xa0,0x2a,0xa0,0x22,0xa0,0x22,0xa0,0x22,0xa0,0x21,0x40,0x66,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_168_168[45] U8G_FONT_SECTION("fontpage_305_168_168") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xc0,0x21,0x40,0x2e,0x40,0x24,0x40,0x3f, + 0x40,0x35,0x40,0x3f,0x40,0x25,0x40,0x27,0x60,0x5c,0xa0,0x88,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_253_253[45] U8G_FONT_SECTION("fontpage_305_253_253") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xfd,0xfd,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x22,0x00,0x52,0x00,0xab,0xe0,0xfc,0x20,0x8b, + 0xa0,0xfa,0xa0,0x8b,0xa0,0xfa,0x40,0x92,0x20,0xaa,0x20,0xc9,0xe0}; +const u8g_fntpgm_uint8_t fontpage_307_172_172[45] U8G_FONT_SECTION("fontpage_307_172_172") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x3f,0xc0,0x24,0x00,0x3f,0x80,0x24,0x00,0x3f, + 0x80,0x24,0x00,0x3f,0xe0,0x00,0x20,0x55,0x20,0x4a,0xa0,0x8a,0xc0}; +const u8g_fntpgm_uint8_t fontpage_308_197_197[45] U8G_FONT_SECTION("fontpage_308_197_197") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc5,0xc5,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xe0,0x54,0x00,0x7d,0xc0,0x55,0x40,0x7d, + 0xc0,0x54,0x00,0x7f,0xe0,0x5e,0xa0,0xaf,0xe0,0xac,0x00,0x17,0xe0}; +const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd8,0xd8,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x04,0x00,0xff,0xe0,0x00,0x00,0x1f,0x00,0x11, + 0x00,0x7f,0xc0,0x40,0x40,0x5f,0x40,0x51,0x40,0x5f,0x40,0x40,0xc0}; +const u8g_fntpgm_uint8_t fontpage_317_196_196[45] U8G_FONT_SECTION("fontpage_317_196_196") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc4,0xc4,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0x7f,0xc0,0x11,0x00,0xff,0xe0,0x04, + 0x00,0x3f,0x80,0x24,0x80,0x3f,0x80,0x24,0x80,0x3f,0x80,0x60,0xc0}; +const u8g_fntpgm_uint8_t fontpage_317_222_222[45] U8G_FONT_SECTION("fontpage_317_222_222") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00, + 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf8,0x80,0xa8,0x80,0xf8,0xe0,0xa8,0x80,0xf8, + 0x80,0x23,0xe0,0xfa,0x20,0x22,0x20,0xfa,0x20,0x52,0x20,0xab,0xe0}; +const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510_154_154") = { + 0x00,0x06,0x0c,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0x9a,0x00,0x08,0x00,0x00, + 0x00,0x02,0x07,0x07,0x0c,0x06,0x01,0xc0,0xc0,0x00,0x00,0x00,0xc0,0xc0}; + +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿' + FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一' + FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下' + FONTDATA_ITEM(156, 166, 166, fontpage_156_166_166), // '並' -- '並' + FONTDATA_ITEM(156, 170, 170, fontpage_156_170_170), // '个' -- '个' + FONTDATA_ITEM(156, 173, 173, fontpage_156_173_173), // '中' -- '中' + FONTDATA_ITEM(156, 187, 187, fontpage_156_187_187), // '主' -- '主' + FONTDATA_ITEM(156, 203, 203, fontpage_156_203_203), // '之' -- '之' + FONTDATA_ITEM(157, 174, 174, fontpage_157_174_174), // '亮' -- '亮' + FONTDATA_ITEM(157, 228, 228, fontpage_157_228_228), // '令' -- '令' + FONTDATA_ITEM(157, 253, 253, fontpage_157_253_253), // '份' -- '份' + FONTDATA_ITEM(158, 145, 145, fontpage_158_145_145), // '休' -- '休' + FONTDATA_ITEM(158, 205, 206, fontpage_158_205_206), // '位' -- '低' + FONTDATA_ITEM(158, 220, 220, fontpage_158_220_220), // '作' -- '作' + FONTDATA_ITEM(159, 134, 134, fontpage_159_134_134), // '來' -- '來' + FONTDATA_ITEM(159, 155, 155, fontpage_159_155_155), // '供' -- '供' + FONTDATA_ITEM(159, 221, 221, fontpage_159_221_221), // '保' -- '保' + FONTDATA_ITEM(159, 225, 225, fontpage_159_225_225), // '信' -- '信' + FONTDATA_ITEM(160, 139, 139, fontpage_160_139_139), // '個' -- '個' + FONTDATA_ITEM(160, 188, 188, fontpage_160_188_188), // '值' -- '值' + FONTDATA_ITEM(160, 207, 207, fontpage_160_207_207), // '偏' -- '偏' + FONTDATA_ITEM(160, 220, 220, fontpage_160_220_220), // '停' -- '停' + FONTDATA_ITEM(161, 153, 153, fontpage_161_153_153), // '備' -- '備' + FONTDATA_ITEM(161, 179, 179, fontpage_161_179_179), // '傳' -- '傳' + FONTDATA_ITEM(162, 178, 178, fontpage_162_178_178), // '儲' -- '儲' + FONTDATA_ITEM(162, 197, 197, fontpage_162_197_197), // '充' -- '充' + FONTDATA_ITEM(162, 200, 200, fontpage_162_200_200), // '先' -- '先' + FONTDATA_ITEM(162, 229, 229, fontpage_162_229_229), // '入' -- '入' + FONTDATA_ITEM(162, 232, 232, fontpage_162_232_232), // '全' -- '全' + FONTDATA_ITEM(162, 241, 241, fontpage_162_241_241), // '共' -- '共' + FONTDATA_ITEM(162, 247, 247, fontpage_162_247_247), // '具' -- '具' + FONTDATA_ITEM(163, 183, 183, fontpage_163_183_183), // '冷' -- '冷' + FONTDATA_ITEM(163, 198, 198, fontpage_163_198_198), // '准' -- '准' + FONTDATA_ITEM(163, 250, 250, fontpage_163_250_250), // '出' -- '出' + FONTDATA_ITEM(164, 134, 134, fontpage_164_134_134), // '分' -- '分' + FONTDATA_ITEM(164, 151, 151, fontpage_164_151_151), // '列' -- '列' + FONTDATA_ITEM(164, 157, 157, fontpage_164_157_157), // '初' -- '初' + FONTDATA_ITEM(164, 176, 176, fontpage_164_176_176), // '到' -- '到' + FONTDATA_ITEM(164, 182, 183, fontpage_164_182_183), // '制' -- '刷' + FONTDATA_ITEM(164, 245, 245, fontpage_164_245_245), // '創' -- '創' + FONTDATA_ITEM(165, 155, 155, fontpage_165_155_155), // '力' -- '力' + FONTDATA_ITEM(165, 160, 160, fontpage_165_160_160), // '加' -- '加' + FONTDATA_ITEM(165, 168, 168, fontpage_165_168_168), // '动' -- '动' + FONTDATA_ITEM(165, 213, 213, fontpage_165_213_213), // '動' -- '動' + FONTDATA_ITEM(166, 150, 150, fontpage_166_150_150), // '化' -- '化' + FONTDATA_ITEM(166, 202, 202, fontpage_166_202_202), // '半' -- '半' + FONTDATA_ITEM(166, 212, 212, fontpage_166_212_212), // '協' -- '協' + FONTDATA_ITEM(166, 225, 225, fontpage_166_225_225), // '卡' -- '卡' + FONTDATA_ITEM(166, 240, 240, fontpage_166_240_240), // '印' -- '印' + FONTDATA_ITEM(166, 248, 248, fontpage_166_248_248), // '卸' -- '卸' + FONTDATA_ITEM(167, 159, 159, fontpage_167_159_159), // '原' -- '原' + FONTDATA_ITEM(167, 214, 214, fontpage_167_214_214), // '取' -- '取' + FONTDATA_ITEM(167, 240, 240, fontpage_167_240_240), // '台' -- '台' + FONTDATA_ITEM(168, 136, 136, fontpage_168_136_136), // '合' -- '合' + FONTDATA_ITEM(168, 253, 253, fontpage_168_253_253), // '命' -- '命' + FONTDATA_ITEM(169, 140, 140, fontpage_169_140_140), // '和' -- '和' + FONTDATA_ITEM(170, 223, 223, fontpage_170_223_223), // '啟' -- '啟' + FONTDATA_ITEM(171, 174, 174, fontpage_171_174_174), // '單' -- '單' + FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴' + FONTDATA_ITEM(172, 244, 244, fontpage_172_244_244), // '噴' -- '噴' + FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回' + FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // '因' -- '因' + FONTDATA_ITEM(174, 150, 150, fontpage_174_150_150), // '圖' -- '圖' + FONTDATA_ITEM(174, 168, 168, fontpage_174_168_168), // '在' -- '在' + FONTDATA_ITEM(175, 139, 139, fontpage_175_139_139), // '型' -- '型' + FONTDATA_ITEM(176, 202, 202, fontpage_176_202_202), // '塊' -- '塊' + FONTDATA_ITEM(176, 235, 235, fontpage_176_235_235), // '填' -- '填' + FONTDATA_ITEM(177, 138, 138, fontpage_177_138_138), // '墊' -- '墊' + FONTDATA_ITEM(178, 150, 150, fontpage_178_150_150), // '外' -- '外' + FONTDATA_ITEM(178, 154, 154, fontpage_178_154_154), // '多' -- '多' + FONTDATA_ITEM(178, 167, 167, fontpage_178_167_167), // '大' -- '大' + FONTDATA_ITEM(178, 169, 170, fontpage_178_169_170), // '天' -- '太' + FONTDATA_ITEM(178, 177, 177, fontpage_178_177_177), // '失' -- '失' + FONTDATA_ITEM(179, 203, 203, fontpage_179_203_203), // '始' -- '始' + FONTDATA_ITEM(182, 208, 208, fontpage_182_208_208), // '子' -- '子' + FONTDATA_ITEM(182, 216, 216, fontpage_182_216_216), // '存' -- '存' + FONTDATA_ITEM(183, 137, 137, fontpage_183_137_137), // '安' -- '安' + FONTDATA_ITEM(183, 140, 140, fontpage_183_140_140), // '完' -- '完' + FONTDATA_ITEM(183, 154, 154, fontpage_183_154_154), // '定' -- '定' + FONTDATA_ITEM(183, 162, 162, fontpage_183_162_162), // '客' -- '客' + FONTDATA_ITEM(183, 185, 185, fontpage_183_185_185), // '容' -- '容' + FONTDATA_ITEM(184, 141, 141, fontpage_184_141_141), // '對' -- '對' + FONTDATA_ITEM(184, 143, 143, fontpage_184_143_143), // '小' -- '小' + FONTDATA_ITEM(184, 177, 177, fontpage_184_177_177), // '就' -- '就' + FONTDATA_ITEM(187, 229, 229, fontpage_187_229_229), // '工' -- '工' + FONTDATA_ITEM(187, 242, 242, fontpage_187_242_242), // '已' -- '已' + FONTDATA_ITEM(188, 243, 243, fontpage_188_243_243), // '平' -- '平' + FONTDATA_ITEM(189, 138, 138, fontpage_189_138_138), // '床' -- '床' + FONTDATA_ITEM(189, 166, 166, fontpage_189_166_166), // '度' -- '度' + FONTDATA_ITEM(189, 226, 226, fontpage_189_226_226), // '廢' -- '廢' + FONTDATA_ITEM(189, 250, 250, fontpage_189_250_250), // '建' -- '建' + FONTDATA_ITEM(191, 133, 133, fontpage_191_133_133), // '待' -- '待' + FONTDATA_ITEM(191, 140, 140, fontpage_191_140_140), // '後' -- '後' + FONTDATA_ITEM(191, 145, 145, fontpage_191_145_145), // '徑' -- '徑' + FONTDATA_ITEM(191, 158, 158, fontpage_191_158_158), // '從' -- '從' + FONTDATA_ITEM(191, 169, 169, fontpage_191_169_169), // '復' -- '復' + FONTDATA_ITEM(191, 174, 174, fontpage_191_174_174), // '微' -- '微' + FONTDATA_ITEM(191, 195, 195, fontpage_191_195_195), // '心' -- '心' + FONTDATA_ITEM(192, 167, 167, fontpage_192_167_167), // '性' -- '性' + FONTDATA_ITEM(192, 226, 226, fontpage_192_226_226), // '恢' -- '恢' + FONTDATA_ITEM(192, 239, 239, fontpage_192_239_239), // '息' -- '息' + FONTDATA_ITEM(195, 182, 182, fontpage_195_182_182), // '憶' -- '憶' + FONTDATA_ITEM(195, 201, 201, fontpage_195_201_201), // '應' -- '應' + FONTDATA_ITEM(196, 144, 144, fontpage_196_144_144), // '成' -- '成' + FONTDATA_ITEM(196, 182, 182, fontpage_196_182_182), // '戶' -- '戶' + FONTDATA_ITEM(196, 192, 192, fontpage_196_192_192), // '所' -- '所' + FONTDATA_ITEM(196, 199, 199, fontpage_196_199_199), // '扇' -- '扇' + FONTDATA_ITEM(196, 203, 203, fontpage_196_203_203), // '手' -- '手' + FONTDATA_ITEM(196, 211, 211, fontpage_196_211_211), // '打' -- '打' + FONTDATA_ITEM(196, 231, 231, fontpage_196_231_231), // '执' -- '执' + FONTDATA_ITEM(196, 249, 249, fontpage_196_249_249), // '批' -- '批' + FONTDATA_ITEM(197, 150, 150, fontpage_197_150_150), // '抖' -- '抖' + FONTDATA_ITEM(197, 189, 189, fontpage_197_189_189), // '抽' -- '抽' + FONTDATA_ITEM(197, 212, 212, fontpage_197_212_212), // '拔' -- '拔' + FONTDATA_ITEM(198, 137, 137, fontpage_198_137_137), // '按' -- '按' + FONTDATA_ITEM(199, 137, 137, fontpage_199_137_137), // '掉' -- '掉' + FONTDATA_ITEM(199, 162, 162, fontpage_199_162_162), // '探' -- '探' + FONTDATA_ITEM(199, 167, 167, fontpage_199_167_167), // '控' -- '控' + FONTDATA_ITEM(199, 210, 210, fontpage_199_210_210), // '插' -- '插' + FONTDATA_ITEM(199, 219, 219, fontpage_199_219_219), // '換' -- '換' + FONTDATA_ITEM(201, 199, 199, fontpage_201_199_199), // '擇' -- '擇' + FONTDATA_ITEM(201, 202, 203, fontpage_201_202_203), // '擊' -- '擋' + FONTDATA_ITEM(201, 224, 224, fontpage_201_224_224), // '擠' -- '擠' + FONTDATA_ITEM(202, 190, 190, fontpage_202_190_190), // '放' -- '放' + FONTDATA_ITEM(202, 215, 215, fontpage_202_215_215), // '敗' -- '敗' + FONTDATA_ITEM(202, 244, 244, fontpage_202_244_244), // '整' -- '整' + FONTDATA_ITEM(202, 248, 248, fontpage_202_248_248), // '數' -- '數' + FONTDATA_ITEM(203, 153, 153, fontpage_203_153_153), // '料' -- '料' + FONTDATA_ITEM(203, 156, 156, fontpage_203_156_156), // '斜' -- '斜' + FONTDATA_ITEM(203, 176, 176, fontpage_203_176_176), // '新' -- '新' + FONTDATA_ITEM(203, 188, 188, fontpage_203_188_188), // '於' -- '於' + FONTDATA_ITEM(204, 142, 142, fontpage_204_142_142), // '明' -- '明' + FONTDATA_ITEM(204, 194, 194, fontpage_204_194_194), // '時' -- '時' + FONTDATA_ITEM(205, 171, 171, fontpage_205_171_171), // '暫' -- '暫' + FONTDATA_ITEM(205, 244, 244, fontpage_205_244_244), // '更' -- '更' + FONTDATA_ITEM(206, 128, 128, fontpage_206_128_128), // '最' -- '最' + FONTDATA_ITEM(206, 137, 137, fontpage_206_137_137), // '有' -- '有' + FONTDATA_ITEM(206, 255, 255, fontpage_206_255_255), // '板' -- '板' + FONTDATA_ITEM(207, 241, 241, fontpage_207_241_241), // '柱' -- '柱' + FONTDATA_ITEM(208, 161, 161, fontpage_208_161_161), // '校' -- '校' + FONTDATA_ITEM(208, 188, 188, fontpage_208_188_188), // '格' -- '格' + FONTDATA_ITEM(209, 157, 157, fontpage_209_157_157), // '條' -- '條' + FONTDATA_ITEM(211, 253, 253, fontpage_211_253_253), // '槽' -- '槽' + FONTDATA_ITEM(212, 217, 217, fontpage_212_217_217), // '橙' -- '橙' + FONTDATA_ITEM(212, 223, 223, fontpage_212_223_223), // '機' -- '機' + FONTDATA_ITEM(213, 162, 162, fontpage_213_162_162), // '檢' -- '檢' + FONTDATA_ITEM(214, 226, 226, fontpage_214_226_226), // '止' -- '止' + FONTDATA_ITEM(214, 229, 229, fontpage_214_229_229), // '步' -- '步' + FONTDATA_ITEM(214, 248, 248, fontpage_214_248_248), // '歸' -- '歸' + FONTDATA_ITEM(215, 188, 188, fontpage_215_188_188), // '殼' -- '殼' + FONTDATA_ITEM(215, 212, 212, fontpage_215_212_212), // '比' -- '比' + FONTDATA_ITEM(217, 146, 146, fontpage_217_146_146), // '沒' -- '沒' + FONTDATA_ITEM(218, 187, 187, fontpage_218_187_187), // '活' -- '活' + FONTDATA_ITEM(219, 136, 136, fontpage_219_136_136), // '消' -- '消' + FONTDATA_ITEM(219, 188, 188, fontpage_219_188_188), // '涼' -- '涼' + FONTDATA_ITEM(219, 225, 225, fontpage_219_225_225), // '淡' -- '淡' + FONTDATA_ITEM(220, 133, 133, fontpage_220_133_133), // '清' -- '清' + FONTDATA_ITEM(220, 172, 172, fontpage_220_172_172), // '測' -- '測' + FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // '源' -- '源' + FONTDATA_ITEM(221, 150, 150, fontpage_221_150_150), // '準' -- '準' + FONTDATA_ITEM(221, 171, 171, fontpage_221_171_171), // '溫' -- '溫' + FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // '激' -- '激' + FONTDATA_ITEM(224, 237, 237, fontpage_224_237_237), // '灭' -- '灭' + FONTDATA_ITEM(224, 239, 239, fontpage_224_239_239), // '灯' -- '灯' + FONTDATA_ITEM(226, 161, 161, fontpage_226_161_161), // '無' -- '無' + FONTDATA_ITEM(227, 177, 177, fontpage_227_177_177), // '熱' -- '熱' + FONTDATA_ITEM(227, 200, 200, fontpage_227_200_200), // '燈' -- '燈' + FONTDATA_ITEM(228, 199, 199, fontpage_228_199_199), // '片' -- '片' + FONTDATA_ITEM(231, 135, 135, fontpage_231_135_135), // '率' -- '率' + FONTDATA_ITEM(234, 168, 168, fontpage_234_168_168), // '用' -- '用' + FONTDATA_ITEM(234, 204, 204, fontpage_234_204_204), // '界' -- '界' + FONTDATA_ITEM(236, 253, 253, fontpage_236_253_253), // '白' -- '白' + FONTDATA_ITEM(237, 132, 132, fontpage_237_132_132), // '的' -- '的' + FONTDATA_ITEM(237, 244, 244, fontpage_237_244_244), // '直' -- '直' + FONTDATA_ITEM(238, 129, 129, fontpage_238_129_129), // '省' -- '省' + FONTDATA_ITEM(238, 160, 160, fontpage_238_160_160), // '眠' -- '眠' + FONTDATA_ITEM(240, 141, 141, fontpage_240_141_141), // '砍' -- '砍' + FONTDATA_ITEM(243, 251, 251, fontpage_243_251_251), // '移' -- '移' + FONTDATA_ITEM(244, 205, 205, fontpage_244_205_205), // '積' -- '積' + FONTDATA_ITEM(245, 239, 239, fontpage_245_239_239), // '端' -- '端' + FONTDATA_ITEM(246, 201, 201, fontpage_246_201_201), // '等' -- '等' + FONTDATA_ITEM(247, 161, 161, fontpage_247_161_161), // '管' -- '管' + FONTDATA_ITEM(249, 251, 251, fontpage_249_251_251), // '系' -- '系' + FONTDATA_ITEM(250, 171, 171, fontpage_250_171_171), // '紫' -- '紫' + FONTDATA_ITEM(250, 176, 176, fontpage_250_176_176), // '細' -- '細' + FONTDATA_ITEM(250, 194, 194, fontpage_250_194_194), // '終' -- '終' + FONTDATA_ITEM(250, 241, 242, fontpage_250_241_242), // '統' -- '絲' + FONTDATA_ITEM(251, 178, 178, fontpage_251_178_178), // '網' -- '網' + FONTDATA_ITEM(251, 210, 210, fontpage_251_210_210), // '緒' -- '緒' + FONTDATA_ITEM(251, 218, 218, fontpage_251_218_218), // '線' -- '線' + FONTDATA_ITEM(251, 232, 232, fontpage_251_232_232), // '編' -- '編' + FONTDATA_ITEM(252, 174, 174, fontpage_252_174_174), // '縮' -- '縮' + FONTDATA_ITEM(252, 189, 189, fontpage_252_189_189), // '總' -- '總' + FONTDATA_ITEM(252, 252, 252, fontpage_252_252_252), // '繼' -- '繼' + FONTDATA_ITEM(253, 140, 140, fontpage_253_140_140), // '續' -- '續' + FONTDATA_ITEM(253, 162, 162, fontpage_253_162_162), // '红' -- '红' + FONTDATA_ITEM(253, 255, 255, fontpage_253_255_255), // '绿' -- '绿' + FONTDATA_ITEM(254, 186, 186, fontpage_254_186_186), // '缺' -- '缺' + FONTDATA_ITEM(254, 209, 209, fontpage_254_209_209), // '网' -- '网' + FONTDATA_ITEM(254, 238, 238, fontpage_254_238_238), // '置' -- '置' + FONTDATA_ITEM(254, 242, 242, fontpage_254_242_242), // '署' -- '署' + FONTDATA_ITEM(256, 240, 240, fontpage_256_240_240), // '聰' -- '聰' + FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自' + FONTDATA_ITEM(265, 221, 221, fontpage_265_221_221), // '蓝' -- '蓝' + FONTDATA_ITEM(272, 204, 204, fontpage_272_204_204), // '行' -- '行' + FONTDATA_ITEM(272, 232, 232, fontpage_272_232_232), // '表' -- '表' + FONTDATA_ITEM(273, 171, 171, fontpage_273_171_171), // '被' -- '被' + FONTDATA_ITEM(273, 197, 197, fontpage_273_197_197), // '装' -- '装' + FONTDATA_ITEM(273, 221, 221, fontpage_273_221_221), // '裝' -- '裝' + FONTDATA_ITEM(274, 135, 135, fontpage_274_135_135), // '複' -- '複' + FONTDATA_ITEM(275, 210, 210, fontpage_275_210_210), // '角' -- '角' + FONTDATA_ITEM(276, 136, 136, fontpage_276_136_136), // '計' -- '計' + FONTDATA_ITEM(276, 138, 138, fontpage_276_138_138), // '訊' -- '訊' + FONTDATA_ITEM(276, 152, 152, fontpage_276_152_152), // '記' -- '記' + FONTDATA_ITEM(276, 173, 173, fontpage_276_173_173), // '設' -- '設' + FONTDATA_ITEM(276, 230, 230, fontpage_276_230_230), // '試' -- '試' + FONTDATA_ITEM(277, 164, 164, fontpage_277_164_164), // '誤' -- '誤' + FONTDATA_ITEM(277, 191, 191, fontpage_277_191_191), // '調' -- '調' + FONTDATA_ITEM(277, 203, 203, fontpage_277_203_203), // '請' -- '請' + FONTDATA_ITEM(278, 240, 240, fontpage_278_240_240), // '議' -- '議' + FONTDATA_ITEM(279, 138, 138, fontpage_279_138_138), // '變' -- '變' + FONTDATA_ITEM(281, 199, 199, fontpage_281_199_199), // '資' -- '資' + FONTDATA_ITEM(285, 248, 248, fontpage_285_248_248), // '軸' -- '軸' + FONTDATA_ITEM(286, 137, 137, fontpage_286_137_137), // '載' -- '載' + FONTDATA_ITEM(286, 175, 175, fontpage_286_175_175), // '輯' -- '輯' + FONTDATA_ITEM(286, 184, 184, fontpage_286_184_184), // '輸' -- '輸' + FONTDATA_ITEM(287, 209, 209, fontpage_287_209_209), // '近' -- '近' + FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // '返' -- '返' + FONTDATA_ITEM(288, 128, 128, fontpage_288_128_128), // '退' -- '退' + FONTDATA_ITEM(288, 159, 159, fontpage_288_159_159), // '速' -- '速' + FONTDATA_ITEM(288, 178, 178, fontpage_288_178_178), // '進' -- '進' + FONTDATA_ITEM(288, 203, 203, fontpage_288_203_203), // '運' -- '運' + FONTDATA_ITEM(288, 212, 212, fontpage_288_212_212), // '達' -- '達' + FONTDATA_ITEM(288, 248, 248, fontpage_288_248_248), // '選' -- '選' + FONTDATA_ITEM(289, 132, 132, fontpage_289_132_132), // '還' -- '還' + FONTDATA_ITEM(289, 138, 138, fontpage_289_138_138), // '邊' -- '邊' + FONTDATA_ITEM(289, 232, 232, fontpage_289_232_232), // '部' -- '部' + FONTDATA_ITEM(291, 202, 202, fontpage_291_202_202), // '释' -- '释' + FONTDATA_ITEM(291, 205, 205, fontpage_291_205_205), // '重' -- '重' + FONTDATA_ITEM(291, 207, 207, fontpage_291_207_207), // '量' -- '量' + FONTDATA_ITEM(291, 221, 221, fontpage_291_221_221), // '針' -- '針' + FONTDATA_ITEM(292, 149, 149, fontpage_292_149_149), // '鈕' -- '鈕' + FONTDATA_ITEM(294, 175, 175, fontpage_294_175_175), // '錯' -- '錯' + FONTDATA_ITEM(294, 245, 245, fontpage_294_245_245), // '鍵' -- '鍵' + FONTDATA_ITEM(298, 247, 247, fontpage_298_247_247), // '長' -- '長' + FONTDATA_ITEM(299, 137, 137, fontpage_299_137_137), // '閉' -- '閉' + FONTDATA_ITEM(299, 139, 139, fontpage_299_139_139), // '開' -- '開' + FONTDATA_ITEM(299, 147, 147, fontpage_299_147_147), // '間' -- '間' + FONTDATA_ITEM(299, 220, 220, fontpage_299_220_220), // '關' -- '關' + FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // '降' -- '降' + FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除' + FONTDATA_ITEM(301, 217, 217, fontpage_301_217_217), // '雙' -- '雙' + FONTDATA_ITEM(301, 251, 251, fontpage_301_251_251), // '電' -- '電' + FONTDATA_ITEM(302, 210, 210, fontpage_302_210_210), // '青' -- '青' + FONTDATA_ITEM(302, 222, 222, fontpage_302_222_222), // '非' -- '非' + FONTDATA_ITEM(302, 226, 226, fontpage_302_226_226), // '面' -- '面' + FONTDATA_ITEM(304, 133, 133, fontpage_304_133_133), // '項' -- '項' + FONTDATA_ITEM(304, 144, 144, fontpage_304_144_144), // '預' -- '預' + FONTDATA_ITEM(304, 205, 205, fontpage_304_205_205), // '額' -- '額' + FONTDATA_ITEM(304, 222, 222, fontpage_304_222_222), // '類' -- '類' + FONTDATA_ITEM(305, 132, 132, fontpage_305_132_132), // '预' -- '预' + FONTDATA_ITEM(305, 168, 168, fontpage_305_168_168), // '風' -- '風' + FONTDATA_ITEM(305, 253, 253, fontpage_305_253_253), // '飽' -- '飽' + FONTDATA_ITEM(307, 172, 172, fontpage_307_172_172), // '馬' -- '馬' + FONTDATA_ITEM(308, 197, 197, fontpage_308_197_197), // '驅' -- '驅' + FONTDATA_ITEM(309, 216, 216, fontpage_309_216_216), // '高' -- '高' + FONTDATA_ITEM(317, 196, 196, fontpage_317_196_196), // '黄' -- '黄' + FONTDATA_ITEM(317, 222, 222, fontpage_317_222_222), // '點' -- '點' + FONTDATA_ITEM(510, 154, 154, fontpage_510_154_154), // ':' -- ':' +}; diff --git a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp deleted file mode 100644 index a6bdb373dd..0000000000 --- a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file lcdprint_u8g.cpp - * @brief LCD print api for u8glib - * @author Yunhui Fu (yhfudev@gmail.com) - * @version 1.0 - * @date 2016-08-19 - * @copyright GPL/BSD - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_U8GLIB - -#include "ultralcd_DOGM.h" - -#include "../ultralcd.h" -#include "../../MarlinCore.h" - -#include "../fontutils.h" -#include "u8g_fontutf8.h" -#include "../lcdprint.h" - -int lcd_glyph_height() { return u8g_GetFontBBXHeight(u8g.getU8g()); } - -void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { u8g.setPrintPos(col, row); } - -void lcd_put_int(const int i) { u8g.print(i); } - -// return < 0 on error -// return the advanced pixels -int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { - if (c < 256) { - u8g.print((char)c); - return u8g_GetFontBBXWidth(u8g.getU8g()); - } - u8g_uint_t x = u8g.getPrintCol(), y = u8g.getPrintRow(), - ret = uxg_DrawWchar(u8g.getU8g(), x, y, c, max_length); - u8g.setPrintPos(x + ret, y); - return ret; -} - -int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { - u8g_uint_t x = u8g.getPrintCol(), y = u8g.getPrintRow(), - ret = uxg_DrawUtf8Str(u8g.getU8g(), x, y, utf8_str, max_length); - u8g.setPrintPos(x + ret, y); - return ret; -} - -int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { - u8g_uint_t x = u8g.getPrintCol(), y = u8g.getPrintRow(), - ret = uxg_DrawUtf8StrP(u8g.getU8g(), x, y, utf8_str_P, max_length); - u8g.setPrintPos(x + ret, y); - return ret; -} - -#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp deleted file mode 100644 index 987924201a..0000000000 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ /dev/null @@ -1,916 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// status_screen_DOGM.cpp -// Standard Status Screen for Graphical Display -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_U8GLIB && DISABLED(LIGHTWEIGHT_UI) - -#include "dogm_Statusscreen.h" -#include "ultralcd_DOGM.h" -#include "../ultralcd.h" -#include "../lcdprint.h" -#include "../../libs/numtostr.h" - -#include "../../module/motion.h" -#include "../../module/temperature.h" - -#if ENABLED(FILAMENT_LCD_DISPLAY) - #include "../../feature/filwidth.h" - #include "../../module/planner.h" - #include "../../gcode/parser.h" -#endif - -#if HAS_CUTTER - #include "../../feature/spindle_laser.h" -#endif - -#if HAS_POWER_MONITOR - #include "../../feature/power_monitor.h" -#endif - -#if ENABLED(SDSUPPORT) - #include "../../sd/cardreader.h" -#endif - -#if HAS_PRINT_PROGRESS - #include "../../module/printcounter.h" -#endif - -#if HAS_DUAL_MIXING - #include "../../feature/mixing.h" -#endif - -#define X_LABEL_POS 3 -#define X_VALUE_POS 11 -#define XYZ_SPACING 37 -#define XYZ_BASELINE (30 + INFO_FONT_ASCENT) -#define EXTRAS_BASELINE (40 + INFO_FONT_ASCENT) -#define STATUS_BASELINE (LCD_PIXEL_HEIGHT - INFO_FONT_DESCENT) - -#if ANIM_HBCC - enum HeatBits : uint8_t { - HEATBIT_HOTEND, - HEATBIT_BED = HOTENDS, - HEATBIT_CHAMBER, - HEATBIT_CUTTER - }; - IF<(HEATBIT_CUTTER > 7), uint16_t, uint8_t>::type heat_bits; -#endif - -#if ANIM_HOTEND - #define HOTEND_ALT(N) TEST(heat_bits, HEATBIT_HOTEND + N) -#else - #define HOTEND_ALT(N) false -#endif -#if ANIM_BED - #define BED_ALT() TEST(heat_bits, HEATBIT_BED) -#else - #define BED_ALT() false -#endif -#if ANIM_CHAMBER - #define CHAMBER_ALT() TEST(heat_bits, HEATBIT_CHAMBER) -#else - #define CHAMBER_ALT() false -#endif -#if ANIM_CUTTER - #define CUTTER_ALT(N) TEST(heat_bits, HEATBIT_CUTTER) -#else - #define CUTTER_ALT() false -#endif - -#if DO_DRAW_HOTENDS - #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE))) - #define STATUS_HEATERS_BOT (STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1) -#endif - -#if HAS_POWER_MONITOR - - void display_power_monitor(const uint8_t x, const uint8_t y) { - - lcd_moveto(x, y); - - #if HAS_POWER_MONITOR_WATTS - const bool wflag = power_monitor.power_display_enabled(); - #endif - #if ENABLED(POWER_MONITOR_CURRENT) - const bool iflag = power_monitor.current_display_enabled(); - #endif - #if HAS_POWER_MONITOR_VREF - const bool vflag = power_monitor.voltage_display_enabled(); - #endif - - #if HAS_POWER_MONITOR_WATTS - // Cycle between current, voltage, and power - if (ELAPSED(millis(), power_monitor.display_item_ms)) { - power_monitor.display_item_ms = millis() + 1000UL; - ++power_monitor.display_item; - } - #elif ENABLED(POWER_MONITOR_CURRENT) - power_monitor.display_item = 0; - #elif HAS_POWER_MONITOR_VREF - power_monitor.display_item = 1; - #endif - - // ensure we have the right one selected for display - for (uint8_t i = 0; i < 3; i++) { - #if ENABLED(POWER_MONITOR_CURRENT) - if (power_monitor.display_item == 0 && !iflag) ++power_monitor.display_item; - #endif - #if HAS_POWER_MONITOR_VREF - if (power_monitor.display_item == 1 && !vflag) ++power_monitor.display_item; - #endif - #if HAS_POWER_MONITOR_WATTS - if (power_monitor.display_item == 2 && !wflag) ++power_monitor.display_item; - #endif - if (power_monitor.display_item >= 3) power_monitor.display_item = 0; - } - - switch (power_monitor.display_item) { - #if ENABLED(POWER_MONITOR_CURRENT) // Current - case 0: if (iflag) power_monitor.draw_current(); break; - #endif - #if HAS_POWER_MONITOR_VREF // Voltage - case 1: if (vflag) power_monitor.draw_voltage(); break; - #endif - #if HAS_POWER_MONITOR_WATTS // Power - case 2: if (wflag) power_monitor.draw_power(); break; - #endif - default: break; - } - } -#endif - -#define PROGRESS_BAR_X 54 -#define PROGRESS_BAR_Y (EXTRAS_BASELINE + 1) -#define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X) - -FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, const uint8_t ty) { - const char *str = i16tostr3rj(temp); - const uint8_t len = str[0] != ' ' ? 3 : str[1] != ' ' ? 2 : 1; - lcd_put_u8str(tx - len * (INFO_FONT_WIDTH) / 2 + 1, ty, &str[3-len]); - lcd_put_wchar(LCD_STR_DEGREE[0]); -} - -#if DO_DRAW_HOTENDS - - // Draw hotend bitmap with current and target temperatures - FORCE_INLINE void _draw_hotend_status(const heater_id_t heater_id, const bool blink) { - #if !HEATER_IDLE_HANDLER - UNUSED(blink); - #endif - - const bool isHeat = HOTEND_ALT(heater_id); - - const uint8_t tx = STATUS_HOTEND_TEXT_X(heater_id); - - const float temp = thermalManager.degHotend(heater_id), - target = thermalManager.degTargetHotend(heater_id); - - #if DISABLED(STATUS_HOTEND_ANIM) - #define STATIC_HOTEND true - #define HOTEND_DOT isHeat - #else - #define STATIC_HOTEND false - #define HOTEND_DOT false - #endif - - #if ANIM_HOTEND && BOTH(STATUS_HOTEND_INVERTED, STATUS_HOTEND_NUMBERLESS) - #define OFF_BMP(N) status_hotend_b_bmp - #define ON_BMP(N) status_hotend_a_bmp - #elif ANIM_HOTEND && DISABLED(STATUS_HOTEND_INVERTED) && ENABLED(STATUS_HOTEND_NUMBERLESS) - #define OFF_BMP(N) status_hotend_a_bmp - #define ON_BMP(N) status_hotend_b_bmp - #elif BOTH(ANIM_HOTEND, STATUS_HOTEND_INVERTED) - #define OFF_BMP(N) status_hotend##N##_b_bmp - #define ON_BMP(N) status_hotend##N##_a_bmp - #else - #define OFF_BMP(N) status_hotend##N##_a_bmp - #define ON_BMP(N) status_hotend##N##_b_bmp - #endif - - #if STATUS_HOTEND_BITMAPS > 1 - static const unsigned char* const status_hotend_gfx[STATUS_HOTEND_BITMAPS] PROGMEM = ARRAY_N(STATUS_HOTEND_BITMAPS, OFF_BMP(1), OFF_BMP(2), OFF_BMP(3), OFF_BMP(4), OFF_BMP(5), OFF_BMP(6)); - #if ANIM_HOTEND - static const unsigned char* const status_hotend_on_gfx[STATUS_HOTEND_BITMAPS] PROGMEM = ARRAY_N(STATUS_HOTEND_BITMAPS, ON_BMP(1), ON_BMP(2), ON_BMP(3), ON_BMP(4), ON_BMP(5), ON_BMP(6)); - #define HOTEND_BITMAP(N,S) (unsigned char*)pgm_read_ptr((S) ? &status_hotend_on_gfx[(N) % (STATUS_HOTEND_BITMAPS)] : &status_hotend_gfx[(N) % (STATUS_HOTEND_BITMAPS)]) - #else - #define HOTEND_BITMAP(N,S) (unsigned char*)pgm_read_ptr(&status_hotend_gfx[(N) % (STATUS_HOTEND_BITMAPS)]) - #endif - #elif ANIM_HOTEND - #define HOTEND_BITMAP(N,S) ((S) ? ON_BMP() : OFF_BMP()) - #else - #define HOTEND_BITMAP(N,S) status_hotend_a_bmp - #endif - - if (PAGE_CONTAINS(STATUS_HEATERS_Y, STATUS_HEATERS_BOT)) { - - #define BAR_TALL (STATUS_HEATERS_HEIGHT - 2) - - const float prop = target - 20, - perc = prop > 0 && temp >= 20 ? (temp - 20) / prop : 0; - uint8_t tall = uint8_t(perc * BAR_TALL + 0.5f); - NOMORE(tall, BAR_TALL); - - #if ANIM_HOTEND - // Draw hotend bitmap, either whole or split by the heating percent - const uint8_t hx = STATUS_HOTEND_X(heater_id), - bw = STATUS_HOTEND_BYTEWIDTH(heater_id); - #if ENABLED(STATUS_HEAT_PERCENT) - if (isHeat && tall <= BAR_TALL) { - const uint8_t ph = STATUS_HEATERS_HEIGHT - 1 - tall; - u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, ph, HOTEND_BITMAP(heater_id, false)); - u8g.drawBitmapP(hx, STATUS_HEATERS_Y + ph, bw, tall + 1, HOTEND_BITMAP(heater_id, true) + ph * bw); - } - else - #endif - u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, STATUS_HEATERS_HEIGHT, HOTEND_BITMAP(heater_id, isHeat)); - #endif - - } // PAGE_CONTAINS - - if (PAGE_UNDER(7)) { - #if HEATER_IDLE_HANDLER - const bool dodraw = (blink || !thermalManager.heater_idle[heater_id].timed_out); - #else - constexpr bool dodraw = true; - #endif - if (dodraw) _draw_centered_temp(target + 0.5, tx, 7); - } - - if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(temp + 0.5f, tx, 28); - - if (STATIC_HOTEND && HOTEND_DOT && PAGE_CONTAINS(17, 19)) { - u8g.setColorIndex(0); // set to white on black - u8g.drawBox(tx, 20 - 3, 2, 2); - u8g.setColorIndex(1); // restore black on white - } - - } - -#endif // DO_DRAW_HOTENDS - -#if DO_DRAW_BED - - // Draw bed bitmap with current and target temperatures - FORCE_INLINE void _draw_bed_status(const bool blink) { - #if !HEATER_IDLE_HANDLER - UNUSED(blink); - #endif - - const uint8_t tx = STATUS_BED_TEXT_X; - - const float temp = thermalManager.degBed(), - target = thermalManager.degTargetBed(); - - #if ENABLED(STATUS_HEAT_PERCENT) || DISABLED(STATUS_BED_ANIM) - const bool isHeat = BED_ALT(); - #endif - - #if DISABLED(STATUS_BED_ANIM) - #define STATIC_BED true - #define BED_DOT isHeat - #else - #define STATIC_BED false - #define BED_DOT false - #endif - - if (PAGE_CONTAINS(STATUS_HEATERS_Y, STATUS_HEATERS_BOT)) { - - #define BAR_TALL (STATUS_HEATERS_HEIGHT - 2) - - const float prop = target - 20, - perc = prop > 0 && temp >= 20 ? (temp - 20) / prop : 0; - uint8_t tall = uint8_t(perc * BAR_TALL + 0.5f); - NOMORE(tall, BAR_TALL); - - // Draw a heating progress bar, if specified - #if ENABLED(STATUS_HEAT_PERCENT) - - if (isHeat) { - const uint8_t bx = STATUS_BED_X + STATUS_BED_WIDTH; - u8g.drawFrame(bx, STATUS_HEATERS_Y, 3, STATUS_HEATERS_HEIGHT); - if (tall) { - const uint8_t ph = STATUS_HEATERS_HEIGHT - 1 - tall; - if (PAGE_OVER(STATUS_HEATERS_Y + ph)) - u8g.drawVLine(bx + 1, STATUS_HEATERS_Y + ph, tall); - } - } - - #endif - - } // PAGE_CONTAINS - - if (PAGE_UNDER(7)) { - #if HEATER_IDLE_HANDLER - const bool dodraw = (blink || !thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out); - #else - constexpr bool dodraw = true; - #endif - if (dodraw) _draw_centered_temp(target + 0.5, tx, 7); - } - - if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(temp + 0.5f, tx, 28); - - if (STATIC_BED && BED_DOT && PAGE_CONTAINS(17, 19)) { - u8g.setColorIndex(0); // set to white on black - u8g.drawBox(tx, 20 - 2, 2, 2); - u8g.setColorIndex(1); // restore black on white - } - - } - -#endif // DO_DRAW_BED - -#if DO_DRAW_CHAMBER - - FORCE_INLINE void _draw_chamber_status() { - #if HAS_HEATED_CHAMBER - if (PAGE_UNDER(7)) - _draw_centered_temp(thermalManager.degTargetChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 7); - #endif - - if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(thermalManager.degChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 28); - } - -#endif // DO_DRAW_CHAMBER - -// -// Before homing, blink '123' <-> '???'. -// Homed but unknown... '123' <-> ' '. -// Homed and known, display constantly. -// -FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { - const AxisEnum a = TERN(LCD_SHOW_E_TOTAL, axis == E_AXIS ? X_AXIS : axis, axis); - const uint8_t offs = (XYZ_SPACING) * a; - lcd_put_wchar(X_LABEL_POS + offs, XYZ_BASELINE, axis_codes[axis]); - lcd_moveto(X_VALUE_POS + offs, XYZ_BASELINE); - if (blink) - lcd_put_u8str(value); - else { - if (!TEST(axis_homed, axis)) - while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); - else { - #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) - if (!TEST(axis_known_position, axis)) - lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); - else - #endif - lcd_put_u8str(value); - } - } -} - -void MarlinUI::draw_status_screen() { - - static char xstring[TERN(LCD_SHOW_E_TOTAL, 12, 5)], ystring[5], zstring[8]; - #if ENABLED(FILAMENT_LCD_DISPLAY) - static char wstring[5], mstring[4]; - #endif - - #if HAS_PRINT_PROGRESS - #if DISABLED(DOGM_SD_PERCENT) - #define _SD_INFO_X(len) (PROGRESS_BAR_X + (PROGRESS_BAR_WIDTH) / 2 - (len) * (MENU_FONT_WIDTH) / 2) - #else - #define _SD_INFO_X(len) (LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH)) - #endif - - #if ENABLED(DOGM_SD_PERCENT) - static char progress_string[5]; - #endif - static uint8_t lastElapsed = 0xFF, lastProgress = 0xFF; - static u8g_uint_t elapsed_x_pos = 0, progress_bar_solid_width = 0; - static char elapsed_string[16]; - #if ENABLED(SHOW_REMAINING_TIME) - static u8g_uint_t estimation_x_pos = 0; - static char estimation_string[10]; - #if BOTH(DOGM_SD_PERCENT, ROTATE_PROGRESS_DISPLAY) - static u8g_uint_t progress_x_pos = 0; - static uint8_t progress_state = 0; - static bool prev_blink = 0; - #endif - #endif - #endif - - const bool show_e_total = TERN0(LCD_SHOW_E_TOTAL, printingIsActive() || marlin_state == MF_SD_COMPLETE); - - // At the first page, generate new display values - if (first_page) { - #if ANIM_HBCC - uint8_t new_bits = 0; - #if ANIM_HOTEND - HOTEND_LOOP() if (thermalManager.isHeatingHotend(e)) SBI(new_bits, HEATBIT_HOTEND + e); - #endif - if (TERN0(ANIM_BED, thermalManager.isHeatingBed())) SBI(new_bits, HEATBIT_BED); - #if DO_DRAW_CHAMBER && HAS_HEATED_CHAMBER - if (thermalManager.isHeatingChamber()) SBI(new_bits, HEATBIT_CHAMBER); - #endif - if (TERN0(ANIM_CUTTER, cutter.enabled())) SBI(new_bits, HEATBIT_CUTTER); - heat_bits = new_bits; - #endif - - const xyz_pos_t lpos = current_position.asLogical(); - strcpy(zstring, ftostr52sp(lpos.z)); - - if (show_e_total) { - #if ENABLED(LCD_SHOW_E_TOTAL) - const uint8_t escale = e_move_accumulator >= 100000.0f ? 10 : 1; // After 100m switch to cm - sprintf_P(xstring, PSTR("%ld%cm"), uint32_t(_MAX(e_move_accumulator, 0.0f)) / escale, escale == 10 ? 'c' : 'm'); // 1234567mm - #endif - } - else { - strcpy(xstring, ftostr4sign(lpos.x)); - strcpy(ystring, ftostr4sign(lpos.y)); - } - - #if ENABLED(FILAMENT_LCD_DISPLAY) - strcpy(wstring, ftostr12ns(filwidth.measured_mm)); - strcpy(mstring, i16tostr3rj(planner.volumetric_percent(parser.volumetric_enabled))); - #endif - - // Progress / elapsed / estimation updates and string formatting to avoid float math on each LCD draw - #if HAS_PRINT_PROGRESS - const progress_t progress = TERN(HAS_PRINT_PROGRESS_PERMYRIAD, get_progress_permyriad, get_progress_percent)(); - duration_t elapsed = print_job_timer.duration(); - const uint8_t p = progress & 0xFF, ev = elapsed.value & 0xFF; - if (p != lastProgress) { - lastProgress = p; - - progress_bar_solid_width = u8g_uint_t((PROGRESS_BAR_WIDTH - 2) * (progress / (PROGRESS_SCALE)) * 0.01f); - - #if ENABLED(DOGM_SD_PERCENT) - if (progress == 0) { - progress_string[0] = '\0'; - #if ENABLED(SHOW_REMAINING_TIME) - estimation_string[0] = '\0'; - estimation_x_pos = _SD_INFO_X(0); - #endif - } - else - strcpy(progress_string, TERN(PRINT_PROGRESS_SHOW_DECIMALS, permyriadtostr4(progress), ui8tostr3rj(progress / (PROGRESS_SCALE)))); - - #if BOTH(SHOW_REMAINING_TIME, ROTATE_PROGRESS_DISPLAY) // Tri-state progress display mode - progress_x_pos = _SD_INFO_X(strlen(progress_string) + 1); - #endif - #endif - } - - constexpr bool can_show_days = DISABLED(DOGM_SD_PERCENT) || ENABLED(ROTATE_PROGRESS_DISPLAY); - if (ev != lastElapsed) { - lastElapsed = ev; - const uint8_t len = elapsed.toDigital(elapsed_string, can_show_days && elapsed.value >= 60*60*24L); - elapsed_x_pos = _SD_INFO_X(len); - - #if ENABLED(SHOW_REMAINING_TIME) - if (!(ev & 0x3)) { - uint32_t timeval = (0 - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - + get_remaining_time() - #endif - ); - if (!timeval && progress > 0) timeval = elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; - if (!timeval) { - estimation_string[0] = '\0'; - estimation_x_pos = _SD_INFO_X(0); - } - else { - duration_t estimation = timeval; - const uint8_t len = estimation.toDigital(estimation_string, can_show_days && estimation.value >= 60*60*24L); - estimation_x_pos = _SD_INFO_X(len - #if !BOTH(DOGM_SD_PERCENT, ROTATE_PROGRESS_DISPLAY) - + 1 - #endif - ); - } - } - #endif - } - #endif - } - - const bool blink = get_blink(); - - // Status Menu Font - set_font(FONT_STATUSMENU); - - #if DO_DRAW_LOGO - if (PAGE_CONTAINS(STATUS_LOGO_Y, STATUS_LOGO_Y + STATUS_LOGO_HEIGHT - 1)) - u8g.drawBitmapP(STATUS_LOGO_X, STATUS_LOGO_Y, STATUS_LOGO_BYTEWIDTH, STATUS_LOGO_HEIGHT, status_logo_bmp); - #endif - - #if STATUS_HEATERS_WIDTH - // Draw all heaters (and maybe the bed) in one go - if (PAGE_CONTAINS(STATUS_HEATERS_Y, STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1)) - u8g.drawBitmapP(STATUS_HEATERS_X, STATUS_HEATERS_Y, STATUS_HEATERS_BYTEWIDTH, STATUS_HEATERS_HEIGHT, status_heaters_bmp); - #endif - - #if DO_DRAW_CUTTER && DISABLED(STATUS_COMBINE_HEATERS) - #if ANIM_CUTTER - #define CUTTER_BITMAP(S) ((S) ? status_cutter_on_bmp : status_cutter_bmp) - #else - #define CUTTER_BITMAP(S) status_cutter_bmp - #endif - const uint8_t cuttery = STATUS_CUTTER_Y(CUTTER_ALT()), - cutterh = STATUS_CUTTER_HEIGHT(CUTTER_ALT()); - if (PAGE_CONTAINS(cuttery, cuttery + cutterh - 1)) - u8g.drawBitmapP(STATUS_CUTTER_X, cuttery, STATUS_CUTTER_BYTEWIDTH, cutterh, CUTTER_BITMAP(CUTTER_ALT())); - #endif - - #if DO_DRAW_BED && DISABLED(STATUS_COMBINE_HEATERS) - #if ANIM_BED - #define BED_BITMAP(S) ((S) ? status_bed_on_bmp : status_bed_bmp) - #else - #define BED_BITMAP(S) status_bed_bmp - #endif - const uint8_t bedy = STATUS_BED_Y(BED_ALT()), - bedh = STATUS_BED_HEIGHT(BED_ALT()); - if (PAGE_CONTAINS(bedy, bedy + bedh - 1)) - u8g.drawBitmapP(STATUS_BED_X, bedy, STATUS_BED_BYTEWIDTH, bedh, BED_BITMAP(BED_ALT())); - #endif - - #if DO_DRAW_CHAMBER && DISABLED(STATUS_COMBINE_HEATERS) - #if ANIM_CHAMBER - #define CHAMBER_BITMAP(S) ((S) ? status_chamber_on_bmp : status_chamber_bmp) - #else - #define CHAMBER_BITMAP(S) status_chamber_bmp - #endif - const uint8_t chambery = STATUS_CHAMBER_Y(CHAMBER_ALT()), - chamberh = STATUS_CHAMBER_HEIGHT(CHAMBER_ALT()); - if (PAGE_CONTAINS(chambery, chambery + chamberh - 1)) - u8g.drawBitmapP(STATUS_CHAMBER_X, chambery, STATUS_CHAMBER_BYTEWIDTH, chamberh, CHAMBER_BITMAP(CHAMBER_ALT())); - #endif - - #if DO_DRAW_FAN - #if STATUS_FAN_FRAMES > 2 - static bool old_blink; - static uint8_t fan_frame; - if (old_blink != blink) { - old_blink = blink; - if (!thermalManager.fan_speed[0] || ++fan_frame >= STATUS_FAN_FRAMES) fan_frame = 0; - } - #endif - if (PAGE_CONTAINS(STATUS_FAN_Y, STATUS_FAN_Y + STATUS_FAN_HEIGHT - 1)) - u8g.drawBitmapP(STATUS_FAN_X, STATUS_FAN_Y, STATUS_FAN_BYTEWIDTH, STATUS_FAN_HEIGHT, - #if STATUS_FAN_FRAMES > 2 - fan_frame == 1 ? status_fan1_bmp : - fan_frame == 2 ? status_fan2_bmp : - #if STATUS_FAN_FRAMES > 3 - fan_frame == 3 ? status_fan3_bmp : - #endif - #elif STATUS_FAN_FRAMES > 1 - blink && thermalManager.fan_speed[0] ? status_fan1_bmp : - #endif - status_fan0_bmp - ); - #endif - - // - // Temperature Graphics and Info - // - if (PAGE_UNDER(6 + 1 + 12 + 1 + 6 + 1)) { - // Extruders - #if DO_DRAW_HOTENDS - LOOP_L_N(e, MAX_HOTEND_DRAW) - _draw_hotend_status((heater_id_t)e, blink); - #endif - - // Laser / Spindle - #if DO_DRAW_CUTTER - if (cutter.isReady && PAGE_CONTAINS(STATUS_CUTTER_TEXT_Y - INFO_FONT_ASCENT, STATUS_CUTTER_TEXT_Y - 1)) { - #if CUTTER_UNIT_IS(PERCENT) - lcd_put_u8str(STATUS_CUTTER_TEXT_X, STATUS_CUTTER_TEXT_Y, cutter_power2str(cutter.unitPower)); - lcd_put_wchar('%'); - #elif CUTTER_UNIT_IS(RPM) - lcd_put_u8str(STATUS_CUTTER_TEXT_X - 2, STATUS_CUTTER_TEXT_Y, ftostr51rj(float(cutter.unitPower) / 1000)); - lcd_put_wchar('K'); - #else - lcd_put_u8str(STATUS_CUTTER_TEXT_X, STATUS_CUTTER_TEXT_Y, cutter_power2str(cutter.unitPower)); - #endif - } - #endif - - // Heated Bed - TERN_(DO_DRAW_BED, _draw_bed_status(blink)); - - // Heated Chamber - TERN_(DO_DRAW_CHAMBER, _draw_chamber_status()); - - // Fan, if a bitmap was provided - #if DO_DRAW_FAN - if (PAGE_CONTAINS(STATUS_FAN_TEXT_Y - INFO_FONT_ASCENT, STATUS_FAN_TEXT_Y - 1)) { - char c = '%'; - uint16_t spd = thermalManager.fan_speed[0]; - if (spd) { - #if ENABLED(ADAPTIVE_FAN_SLOWING) - if (!blink && thermalManager.fan_speed_scaler[0] < 128) { - spd = thermalManager.scaledFanSpeed(0, spd); - c = '*'; - } - #endif - lcd_put_u8str(STATUS_FAN_TEXT_X, STATUS_FAN_TEXT_Y, i16tostr3rj(thermalManager.fanPercent(spd))); - lcd_put_wchar(c); - } - } - #endif - } - - #if ENABLED(SDSUPPORT) - // - // SD Card Symbol - // - if (card.isFileOpen() && PAGE_CONTAINS(42, 51)) { - // Upper box - u8g.drawBox(42, 42, 8, 7); // 42-48 (or 41-47) - // Right edge - u8g.drawBox(50, 44, 2, 5); // 44-48 (or 43-47) - // Bottom hollow box - u8g.drawFrame(42, 49, 10, 4); // 49-52 (or 48-51) - // Corner pixel - u8g.drawPixel(50, 43); // 43 (or 42) - } - #endif // SDSUPPORT - - #if HAS_PRINT_PROGRESS - // - // Progress bar frame - // - - if (PAGE_CONTAINS(PROGRESS_BAR_Y, PROGRESS_BAR_Y + 3)) - u8g.drawFrame(PROGRESS_BAR_X, PROGRESS_BAR_Y, PROGRESS_BAR_WIDTH, 4); - - // - // Progress bar solid part - // - - if (PAGE_CONTAINS(PROGRESS_BAR_Y + 1, PROGRESS_BAR_Y + 2)) - u8g.drawBox(PROGRESS_BAR_X + 1, PROGRESS_BAR_Y + 1, progress_bar_solid_width, 2); - - if (PAGE_CONTAINS(EXTRAS_BASELINE - INFO_FONT_ASCENT, EXTRAS_BASELINE - 1)) { - - #if ALL(DOGM_SD_PERCENT, SHOW_REMAINING_TIME, ROTATE_PROGRESS_DISPLAY) - - if (prev_blink != blink) { - prev_blink = blink; - if (++progress_state >= 3) progress_state = 0; - } - - if (progress_state == 0) { - if (progress_string[0]) { - lcd_put_u8str(progress_x_pos, EXTRAS_BASELINE, progress_string); - lcd_put_wchar('%'); - } - } - else if (progress_state == 2 && estimation_string[0]) { - lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, PSTR("R:")); - lcd_put_u8str(estimation_x_pos, EXTRAS_BASELINE, estimation_string); - } - else if (elapsed_string[0]) { - lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, E_LBL); - lcd_put_u8str(elapsed_x_pos, EXTRAS_BASELINE, elapsed_string); - } - - #else // !DOGM_SD_PERCENT || !SHOW_REMAINING_TIME || !ROTATE_PROGRESS_DISPLAY - - // - // SD Percent Complete - // - - #if ENABLED(DOGM_SD_PERCENT) - if (progress_string[0]) { - lcd_put_u8str(55, EXTRAS_BASELINE, progress_string); // Percent complete - lcd_put_wchar('%'); - } - #endif - - // - // Elapsed Time - // - - #if ENABLED(SHOW_REMAINING_TIME) - if (blink && estimation_string[0]) { - lcd_put_wchar(estimation_x_pos, EXTRAS_BASELINE, 'R'); - lcd_put_u8str(estimation_string); - } - else - #endif - lcd_put_u8str(elapsed_x_pos, EXTRAS_BASELINE, elapsed_string); - - #endif // !DOGM_SD_PERCENT || !SHOW_REMAINING_TIME || !ROTATE_PROGRESS_DISPLAY - } - - #endif // HAS_PRINT_PROGRESS - - // - // XYZ Coordinates - // - - #if EITHER(XYZ_NO_FRAME, XYZ_HOLLOW_FRAME) - #define XYZ_FRAME_TOP 29 - #define XYZ_FRAME_HEIGHT INFO_FONT_ASCENT + 3 - #else - #define XYZ_FRAME_TOP 30 - #define XYZ_FRAME_HEIGHT INFO_FONT_ASCENT + 1 - #endif - - if (PAGE_CONTAINS(XYZ_FRAME_TOP, XYZ_FRAME_TOP + XYZ_FRAME_HEIGHT - 1)) { - - #if DISABLED(XYZ_NO_FRAME) - #if ENABLED(XYZ_HOLLOW_FRAME) - u8g.drawFrame(0, XYZ_FRAME_TOP, LCD_PIXEL_WIDTH, XYZ_FRAME_HEIGHT); // 8: 29-40 7: 29-39 - #else - u8g.drawBox(0, XYZ_FRAME_TOP, LCD_PIXEL_WIDTH, XYZ_FRAME_HEIGHT); // 8: 30-39 7: 30-37 - #endif - #endif - - if (PAGE_CONTAINS(XYZ_BASELINE - (INFO_FONT_ASCENT - 1), XYZ_BASELINE)) { - - #if NONE(XYZ_NO_FRAME, XYZ_HOLLOW_FRAME) - u8g.setColorIndex(0); // white on black - #endif - - #if HAS_DUAL_MIXING - - // Two-component mix / gradient instead of XY - - char mixer_messages[15]; - PGM_P mix_label; - #if ENABLED(GRADIENT_MIX) - if (mixer.gradient.enabled) { - mixer.update_mix_from_gradient(); - mix_label = PSTR("Gr"); - } - else - #endif - { - mixer.update_mix_from_vtool(); - mix_label = PSTR("Mx"); - } - sprintf_P(mixer_messages, PSTR(S_FMT " %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); - lcd_put_u8str(X_LABEL_POS, XYZ_BASELINE, mixer_messages); - - #else - - if (show_e_total) { - _draw_axis_value(E_AXIS, xstring, true); - lcd_put_u8str_P(PSTR(" ")); - } - else { - _draw_axis_value(X_AXIS, xstring, blink); - _draw_axis_value(Y_AXIS, ystring, blink); - } - - #endif - - _draw_axis_value(Z_AXIS, zstring, blink); - - #if NONE(XYZ_NO_FRAME, XYZ_HOLLOW_FRAME) - u8g.setColorIndex(1); // black on white - #endif - } - } - - // - // Feedrate - // - #define EXTRAS_2_BASELINE (EXTRAS_BASELINE + 3) - - if (PAGE_CONTAINS(EXTRAS_2_BASELINE - INFO_FONT_ASCENT, EXTRAS_2_BASELINE - 1)) { - set_font(FONT_MENU); - lcd_put_wchar(3, EXTRAS_2_BASELINE, LCD_STR_FEEDRATE[0]); - - set_font(FONT_STATUSMENU); - lcd_put_u8str(12, EXTRAS_2_BASELINE, i16tostr3rj(feedrate_percentage)); - lcd_put_wchar('%'); - - // - // Filament sensor display if SD is disabled - // - #if ENABLED(FILAMENT_LCD_DISPLAY) && DISABLED(SDSUPPORT) - lcd_put_u8str(56, EXTRAS_2_BASELINE, wstring); - lcd_put_u8str(102, EXTRAS_2_BASELINE, mstring); - lcd_put_wchar('%'); - set_font(FONT_MENU); - lcd_put_wchar(47, EXTRAS_2_BASELINE, LCD_STR_FILAM_DIA[0]); // lcd_put_u8str_P(PSTR(LCD_STR_FILAM_DIA)); - lcd_put_wchar(93, EXTRAS_2_BASELINE, LCD_STR_FILAM_MUL[0]); - #endif - } - - // - // Status line - // - if (PAGE_CONTAINS(STATUS_BASELINE - INFO_FONT_ASCENT, STATUS_BASELINE + INFO_FONT_DESCENT)) { - lcd_moveto(0, STATUS_BASELINE); - - #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - // Alternate Status message and Filament display - if (ELAPSED(millis(), next_filament_display)) { - lcd_put_u8str_P(PSTR(LCD_STR_FILAM_DIA)); - lcd_put_wchar(':'); - lcd_put_u8str(wstring); - lcd_put_u8str_P(PSTR(" " LCD_STR_FILAM_MUL)); - lcd_put_wchar(':'); - lcd_put_u8str(mstring); - lcd_put_wchar('%'); - return; - } - #endif - - draw_status_message(blink); - } -} - -void MarlinUI::draw_status_message(const bool blink) { - - // Get the UTF8 character count of the string - uint8_t lcd_width = LCD_WIDTH, pixel_width = LCD_PIXEL_WIDTH, - slen = utf8_strlen(status_message); - - #if HAS_POWER_MONITOR - if (power_monitor.display_enabled()) { - // make room at the end of the status line for the power monitor reading - lcd_width -= 6; - pixel_width -= (MENU_FONT_WIDTH) * 6; - } - #endif - - #if ENABLED(STATUS_MESSAGE_SCROLLING) - - static bool last_blink = false; - - if (slen <= lcd_width) { - // The string fits within the line. Print with no scrolling - lcd_put_u8str(status_message); - while (slen < lcd_width) { lcd_put_wchar(' '); ++slen; } - } - else { - // String is longer than the available space - - // Get a pointer to the next valid UTF8 character - // and the string remaining length - uint8_t rlen; - const char *stat = status_and_len(rlen); - lcd_put_u8str_max(stat, pixel_width); - - // If the remaining string doesn't completely fill the screen - if (rlen < lcd_width) { - lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot - uint8_t chars = lcd_width - rlen; // Amount of space left in characters - if (--chars) { // Draw a second dot if there's space - lcd_put_wchar('.'); - if (--chars) { // Print a second copy of the message - lcd_put_u8str_max(status_message, pixel_width - (rlen + 2) * (MENU_FONT_WIDTH)); - lcd_put_wchar(' '); - } - } - } - - if (last_blink != blink) { - last_blink = blink; - advance_status_scroll(); - } - } - - #else // !STATUS_MESSAGE_SCROLLING - - UNUSED(blink); - - // Just print the string to the LCD - lcd_put_u8str_max(status_message, pixel_width); - - // Fill the rest with spaces - for (; slen < lcd_width; ++slen) lcd_put_wchar(' '); - - #endif // !STATUS_MESSAGE_SCROLLING - - #if HAS_POWER_MONITOR - display_power_monitor(pixel_width + MENU_FONT_WIDTH, STATUS_BASELINE); - #endif -} - -#endif // HAS_MARLINUI_U8GLIB && !LIGHTWEIGHT_UI diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.h b/Marlin/src/lcd/dogm/status_screen_DOGM.h new file mode 100644 index 0000000000..d8d8b252d8 --- /dev/null +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.h @@ -0,0 +1,495 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * status_screen_DOGM.h + * + * Standard Status Screen for Graphical Display + */ + +#ifndef _STATUS_SCREEN_DOGM_H_ +#define _STATUS_SCREEN_DOGM_H_ + +FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t x, const uint8_t y) { + const char * const str = itostr3(temp); + lcd_moveto(x - (str[0] != ' ' ? 0 : str[1] != ' ' ? 1 : 2) * DOG_CHAR_WIDTH / 2, y); + lcd_put_u8str(str); + lcd_put_u8str_P(PSTR(LCD_STR_DEGREE " ")); +} + +#ifndef HEAT_INDICATOR_X + #define HEAT_INDICATOR_X 8 +#endif + +FORCE_INLINE void _draw_heater_status(const uint8_t x, const int8_t heater, const bool blink) { + #if !HEATER_IDLE_HANDLER + UNUSED(blink); + #endif + + #if HAS_HEATED_BED + const bool isBed = heater < 0; + #else + constexpr bool isBed = false; + #endif + + if (PAGE_UNDER(7)) { + #if HEATER_IDLE_HANDLER + const bool is_idle = ( + #if HAS_HEATED_BED + isBed ? thermalManager.is_bed_idle() : + #endif + thermalManager.is_heater_idle(heater) + ); + + if (blink || !is_idle) + #endif + _draw_centered_temp(0.5 + ( + #if HAS_HEATED_BED + isBed ? thermalManager.degTargetBed() : + #endif + thermalManager.degTargetHotend(heater) + ), x, 7 + ); + } + + if (PAGE_CONTAINS(21, 28)) { + _draw_centered_temp(0.5f + ( + #if HAS_HEATED_BED + isBed ? thermalManager.degBed() : + #endif + thermalManager.degHotend(heater) + ), x, 28 + ); + + if (PAGE_CONTAINS(17, 20)) { + const uint8_t h = isBed ? 7 : HEAT_INDICATOR_X, + y = isBed ? 18 : 17; + if ( + #if HAS_HEATED_BED + isBed ? thermalManager.isHeatingBed() : + #endif + thermalManager.isHeatingHotend(heater) + ) { + u8g.setColorIndex(0); // white on black + u8g.drawBox(x + h, y, 2, 2); + u8g.setColorIndex(1); // black on white + } + else + u8g.drawBox(x + h, y, 2, 2); + } + } +} + +// +// Before homing, blink '123' <-> '???'. +// Homed but unknown... '123' <-> ' '. +// Homed and known, display constantly. +// +FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { + if (blink) + lcd_put_u8str(value); + else { + if (!TEST(axis_homed, axis)) + while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); + else { + #if DISABLED(HOME_AFTER_DEACTIVATE) && DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) + if (!TEST(axis_known_position, axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); + else + #endif + lcd_put_u8str(value); + } + } +} + +inline void lcd_implementation_status_message(const bool blink) { + #if ENABLED(STATUS_MESSAGE_SCROLLING) + static bool last_blink = false; + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(lcd_status_message); + + // If the string fits into the LCD, just print it and do not scroll it + if (slen <= LCD_WIDTH) { + + // The string isn't scrolling and may not fill the screen + lcd_put_u8str(lcd_status_message); + + // Fill the rest with spaces + while (slen < LCD_WIDTH) { + lcd_put_wchar(' '); + ++slen; + } + } + else { + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + const char *stat = lcd_status_message + status_scroll_offset; + + // Get the string remaining length + const uint8_t rlen = utf8_strlen(stat); + + // If we have enough characters to display + if (rlen >= LCD_WIDTH) { + // The remaining string fills the screen - Print it + lcd_put_u8str_max(stat, LCD_PIXEL_WIDTH); + } + else { + // The remaining string does not completely fill the screen + lcd_put_u8str_max(stat, LCD_PIXEL_WIDTH); // The string leaves space + uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters + + lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot + if (--chars) { // Draw a second dot if there's space + lcd_put_wchar('.'); + if (--chars) { + // Print a second copy of the message + lcd_put_u8str_max(lcd_status_message, LCD_PIXEL_WIDTH - ((rlen+2) * DOG_CHAR_WIDTH)); + } + } + } + if (last_blink != blink) { + last_blink = blink; + + // Adjust by complete UTF8 characters + if (status_scroll_offset < slen) { + status_scroll_offset++; + while (!START_OF_UTF8_CHAR(lcd_status_message[status_scroll_offset])) + status_scroll_offset++; + } + else + status_scroll_offset = 0; + } + } + #else + UNUSED(blink); + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(lcd_status_message); + + // Just print the string to the LCD + lcd_put_u8str_max(lcd_status_message, LCD_PIXEL_WIDTH); + + // Fill the rest with spaces if there are missing spaces + while (slen < LCD_WIDTH) { + lcd_put_wchar(' '); + ++slen; + } + #endif +} + +static void lcd_implementation_status_screen() { + + const bool blink = lcd_blink(); + + #if FAN_ANIM_FRAMES > 2 + static bool old_blink; + static uint8_t fan_frame; + if (old_blink != blink) { + old_blink = blink; + if (!fanSpeeds[0] || ++fan_frame >= FAN_ANIM_FRAMES) fan_frame = 0; + } + #endif + + // Status Menu Font + lcd_setFont(FONT_STATUSMENU); + + // + // Fan Animation + // + // Draws the whole heading image as a B/W bitmap rather than + // drawing the elements separately. + // This was done as an optimization, as it was slower to draw + // multiple parts compared to a single bitmap. + // + // The bitmap: + // - May be offset in X + // - Includes all nozzle(s), bed(s), and the fan. + // + // TODO: + // + // - Only draw the whole header on the first + // entry to the status screen. Nozzle, bed, and + // fan outline bits don't change. + // + if (PAGE_UNDER(STATUS_SCREENHEIGHT + 1)) { + + u8g.drawBitmapP( + STATUS_SCREEN_X, STATUS_SCREEN_Y, + (STATUS_SCREENWIDTH + 7) / 8, STATUS_SCREENHEIGHT, + #if HAS_FAN0 + #if FAN_ANIM_FRAMES > 2 + fan_frame == 1 ? status_screen1_bmp : + fan_frame == 2 ? status_screen2_bmp : + #if FAN_ANIM_FRAMES > 3 + fan_frame == 3 ? status_screen3_bmp : + #endif + #else + blink && fanSpeeds[0] ? status_screen1_bmp : + #endif + #endif + status_screen0_bmp + ); + + } + + // + // Temperature Graphics and Info + // + + if (PAGE_UNDER(28)) { + // Extruders + HOTEND_LOOP() _draw_heater_status(STATUS_SCREEN_HOTEND_TEXT_X(e), e, blink); + + // Heated bed + #if HOTENDS < 4 && HAS_HEATED_BED + _draw_heater_status(STATUS_SCREEN_BED_TEXT_X, -1, blink); + #endif + + #if HAS_FAN0 + if (PAGE_CONTAINS(STATUS_SCREEN_FAN_TEXT_Y - 7, STATUS_SCREEN_FAN_TEXT_Y)) { + // Fan + const int16_t per = ((fanSpeeds[0] + 1) * 100) / 256; + if (per) { + lcd_moveto(STATUS_SCREEN_FAN_TEXT_X, STATUS_SCREEN_FAN_TEXT_Y); + lcd_put_u8str(itostr3(per)); + lcd_put_wchar('%'); + } + } + #endif + } + + #if ENABLED(SDSUPPORT) + // + // SD Card Symbol + // + if (card.isFileOpen() && PAGE_CONTAINS(42 - (TALL_FONT_CORRECTION), 51 - (TALL_FONT_CORRECTION))) { + // Upper box + u8g.drawBox(42, 42 - (TALL_FONT_CORRECTION), 8, 7); // 42-48 (or 41-47) + // Right edge + u8g.drawBox(50, 44 - (TALL_FONT_CORRECTION), 2, 5); // 44-48 (or 43-47) + // Bottom hollow box + u8g.drawFrame(42, 49 - (TALL_FONT_CORRECTION), 10, 4); // 49-52 (or 48-51) + // Corner pixel + u8g.drawPixel(50, 43 - (TALL_FONT_CORRECTION)); // 43 (or 42) + } + #endif // SDSUPPORT + + #if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) + // + // Progress bar frame + // + #define PROGRESS_BAR_X 54 + #define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X) + + if (PAGE_CONTAINS(49, 52 - (TALL_FONT_CORRECTION))) // 49-52 (or 49-51) + u8g.drawFrame( + PROGRESS_BAR_X, 49, + PROGRESS_BAR_WIDTH, 4 - (TALL_FONT_CORRECTION) + ); + + #if DISABLED(LCD_SET_PROGRESS_MANUALLY) + const uint8_t progress_bar_percent = card.percentDone(); + #endif + + if (progress_bar_percent > 1) { + + // + // Progress bar solid part + // + + if (PAGE_CONTAINS(50, 51 - (TALL_FONT_CORRECTION))) // 50-51 (or just 50) + u8g.drawBox( + PROGRESS_BAR_X + 1, 50, + (uint16_t)((PROGRESS_BAR_WIDTH - 2) * progress_bar_percent * 0.01), 2 - (TALL_FONT_CORRECTION) + ); + + // + // SD Percent Complete + // + + #if ENABLED(DOGM_SD_PERCENT) + if (PAGE_CONTAINS(41, 48)) { + // Percent complete + lcd_moveto(55, 48); + lcd_put_u8str(itostr3(progress_bar_percent)); + lcd_put_wchar('%'); + } + #endif + } + + // + // Elapsed Time + // + + #if DISABLED(DOGM_SD_PERCENT) + #define SD_DURATION_X (PROGRESS_BAR_X + (PROGRESS_BAR_WIDTH / 2) - len * (DOG_CHAR_WIDTH / 2)) + #else + #define SD_DURATION_X (LCD_PIXEL_WIDTH - len * DOG_CHAR_WIDTH) + #endif + + if (PAGE_CONTAINS(41, 48)) { + char buffer[10]; + duration_t elapsed = print_job_timer.duration(); + bool has_days = (elapsed.value >= 60*60*24L); + uint8_t len = elapsed.toDigital(buffer, has_days); + lcd_moveto(SD_DURATION_X, 48); + lcd_put_u8str(buffer); + } + + #endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY + + // + // XYZ Coordinates + // + + #define XYZ_BASELINE (30 + INFO_FONT_HEIGHT) + + #define X_LABEL_POS 3 + #define X_VALUE_POS 11 + #define XYZ_SPACING 40 + + #if ENABLED(XYZ_HOLLOW_FRAME) + #define XYZ_FRAME_TOP 29 + #define XYZ_FRAME_HEIGHT INFO_FONT_HEIGHT + 3 + #else + #define XYZ_FRAME_TOP 30 + #define XYZ_FRAME_HEIGHT INFO_FONT_HEIGHT + 1 + #endif + + static char xstring[5], ystring[5], zstring[7]; + #if ENABLED(FILAMENT_LCD_DISPLAY) + static char wstring[5], mstring[4]; + #endif + + // At the first page, regenerate the XYZ strings + if (page.page == 0) { + strcpy(xstring, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS]))); + strcpy(ystring, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS]))); + strcpy(zstring, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS]))); + #if ENABLED(FILAMENT_LCD_DISPLAY) + strcpy(wstring, ftostr12ns(filament_width_meas)); + strcpy(mstring, itostr3(100.0 * ( + parser.volumetric_enabled + ? planner.volumetric_area_nominal / planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + : planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + ) + )); + #endif + } + + if (PAGE_CONTAINS(XYZ_FRAME_TOP, XYZ_FRAME_TOP + XYZ_FRAME_HEIGHT - 1)) { + + #if ENABLED(XYZ_HOLLOW_FRAME) + u8g.drawFrame(0, XYZ_FRAME_TOP, LCD_PIXEL_WIDTH, XYZ_FRAME_HEIGHT); // 8: 29-40 7: 29-39 + #else + u8g.drawBox(0, XYZ_FRAME_TOP, LCD_PIXEL_WIDTH, XYZ_FRAME_HEIGHT); // 8: 30-39 7: 30-37 + #endif + + if (PAGE_CONTAINS(XYZ_BASELINE - (INFO_FONT_HEIGHT - 1), XYZ_BASELINE)) { + + #if DISABLED(XYZ_HOLLOW_FRAME) + u8g.setColorIndex(0); // white on black + #endif + + lcd_moveto(0 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); + lcd_put_wchar('X'); + lcd_moveto(0 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); + _draw_axis_value(X_AXIS, xstring, blink); + + lcd_moveto(1 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); + lcd_put_wchar('Y'); + lcd_moveto(1 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); + _draw_axis_value(Y_AXIS, ystring, blink); + + lcd_moveto(2 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); + lcd_put_wchar('Z'); + lcd_moveto(2 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); + _draw_axis_value(Z_AXIS, zstring, blink); + + #if DISABLED(XYZ_HOLLOW_FRAME) + u8g.setColorIndex(1); // black on white + #endif + } + } + + // + // Feedrate + // + + if (PAGE_CONTAINS(51 - INFO_FONT_HEIGHT, 49)) { + lcd_setFont(FONT_MENU); + lcd_moveto(3, 50); + lcd_put_wchar(LCD_STR_FEEDRATE[0]); + + lcd_setFont(FONT_STATUSMENU); + lcd_moveto(12, 50); + lcd_put_u8str(itostr3(feedrate_percentage)); + lcd_put_wchar('%'); + + // + // Filament sensor display if SD is disabled + // + #if ENABLED(FILAMENT_LCD_DISPLAY) && DISABLED(SDSUPPORT) + lcd_moveto(56, 50); + lcd_put_u8str(wstring); + lcd_moveto(102, 50); + lcd_put_u8str(mstring); + lcd_put_wchar('%'); + lcd_setFont(FONT_MENU); + lcd_moveto(47, 50); + lcd_put_wchar(LCD_STR_FILAM_DIA[0]); // lcd_put_u8str_P(PSTR(LCD_STR_FILAM_DIA)); + lcd_moveto(93, 50); + lcd_put_wchar(LCD_STR_FILAM_MUL[0]); + #endif + } + + // + // Status line + // + + #define STATUS_BASELINE (55 + INFO_FONT_HEIGHT) + + if (PAGE_CONTAINS(STATUS_BASELINE - (INFO_FONT_HEIGHT - 1), STATUS_BASELINE)) { + lcd_moveto(0, STATUS_BASELINE); + + #if ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) + if (PENDING(millis(), previous_lcd_status_ms + 5000UL)) { //Display both Status message line and Filament display on the last line + lcd_implementation_status_message(blink); + } + else { + lcd_put_u8str_P(PSTR(LCD_STR_FILAM_DIA)); + lcd_put_wchar(':'); + lcd_put_u8str(wstring); + lcd_put_u8str_P(PSTR(" " LCD_STR_FILAM_MUL)); + lcd_put_wchar(':'); + lcd_put_u8str(mstring); + lcd_put_wchar('%'); + } + #else + lcd_implementation_status_message(blink); + #endif + } +} + +#endif // _STATUS_SCREEN_DOGM_H_ diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp deleted file mode 100644 index 806f370db3..0000000000 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ /dev/null @@ -1,918 +0,0 @@ -/** - * Lightweight Status Screen for the RepRapDiscount Full - * Graphics Smart Controller (ST7920-based 128x64 LCD) - * - * (c) 2017 Aleph Objects, Inc. - * - * The code in this page is free software: you can - * redistribute it and/or modify it under the terms of the GNU - * General Public License (GNU GPL) as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) - * any later version. The code is distributed WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. - */ - -/** - * Implementation of a Status Screen for the RepRapDiscount - * Full Graphics Smart Controller using native ST7920 commands - * instead of U8Glib. - * - * This alternative Status Screen makes use of the built-in character - * generation capabilities of the ST7920 to update the Status Screen - * with less SPI traffic and CPU use. In particular: - * - * - The fan and bed animations are handled using custom characters - * that are stored in CGRAM. This allows for the animation to be - * updated by writing a single character to the text-buffer (DDRAM). - * - * - All the information in the Status Screen is text that is written - * to DDRAM, so the work of generating the bitmaps is offloaded to - * the ST7920 rather than being render by U8Glib on the MCU. - * - * - The graphics buffer (GDRAM) is only used for static graphics - * elements (nozzle and feedrate bitmaps) and for the progress - * bar, so updates are sporadic. - */ - -// -// status_screen_lite_ST7920.cpp -// Lightweight Status Screen for Graphical Display -// - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(LIGHTWEIGHT_UI) - -#include "status_screen_lite_ST7920.h" - -#include "../ultralcd.h" -#include "../fontutils.h" -#include "../lcdprint.h" -#include "../../libs/duration_t.h" -#include "../../module/motion.h" -#include "../../module/printcounter.h" -#include "../../module/temperature.h" - -#if ENABLED(SDSUPPORT) - #include "../../sd/cardreader.h" -#endif - -#if ENABLED(LCD_SHOW_E_TOTAL) - #include "../../MarlinCore.h" // for printingIsActive -#endif - -#define TEXT_MODE_LCD_WIDTH 16 - -#define BUFFER_WIDTH 256 -#define BUFFER_HEIGHT 32 - -#define DDRAM_LINE_1 0x00 -#define DDRAM_LINE_2 0x10 -#define DDRAM_LINE_3 0x08 -#define DDRAM_LINE_4 0x18 - -ST7920_Lite_Status_Screen::st7920_state_t ST7920_Lite_Status_Screen::current_bits; - -void ST7920_Lite_Status_Screen::cmd(const uint8_t cmd) { - if (!current_bits.synced || !current_bits.cmd) { - current_bits.synced = true; - current_bits.cmd = true; - sync_cmd(); - } - write_byte(cmd); -} - -void ST7920_Lite_Status_Screen::begin_data() { - if (!current_bits.synced || current_bits.cmd) { - current_bits.synced = true; - current_bits.cmd = false; - sync_dat(); - } -} - -void ST7920_Lite_Status_Screen::write_str(const char *str) { - while (*str) write_byte(*str++); -} - -void ST7920_Lite_Status_Screen::write_str(const char *str, uint8_t len) { - while (*str && len--) write_byte(*str++); -} - -void ST7920_Lite_Status_Screen::write_str_P(PGM_P const str) { - PGM_P p_str = (PGM_P)str; - while (char c = pgm_read_byte(p_str++)) write_byte(c); -} - -void ST7920_Lite_Status_Screen::write_number(const int16_t value, const uint8_t digits/*=3*/) { - char str[7]; - PGM_P fmt; - switch (digits) { - case 6: fmt = PSTR("%6d"); break; - case 5: fmt = PSTR("%5d"); break; - case 4: fmt = PSTR("%4d"); break; - case 3: fmt = PSTR("%3d"); break; - case 2: fmt = PSTR("%2d"); break; - case 1: fmt = PSTR("%1d"); break; - default: return; - } - sprintf_P(str, fmt, value); - write_str(str); -} - -void ST7920_Lite_Status_Screen::display_status(const bool display_on, const bool cursor_on, const bool blink_on) { - extended_function_set(false); - cmd(0b00001000 | - (display_on ? 0b0100 : 0) | - (cursor_on ? 0b0010 : 0) | - (blink_on ? 0b0001 : 0) - ); -} - -// Sets the extended and graphics bits simultaneously, regardless of -// the current state. This is a helper function for extended_function_set() -// and graphics() -void ST7920_Lite_Status_Screen::_extended_function_set(const bool extended, const bool graphics) { - cmd( 0b00100000 | - (extended ? 0b00000100 : 0) | - (graphics ? 0b00000010 : 0) - ); - current_bits.extended = extended; - current_bits.graphics = graphics; -} - -void ST7920_Lite_Status_Screen::extended_function_set(const bool extended) { - if (extended != current_bits.extended) - _extended_function_set(extended, current_bits.graphics); -} - -void ST7920_Lite_Status_Screen::graphics(const bool graphics) { - if (graphics != current_bits.graphics) - _extended_function_set(current_bits.extended, graphics); -} - -void ST7920_Lite_Status_Screen::entry_mode_select(const bool ac_increase, const bool shift) { - extended_function_set(false); - cmd(0b00000100 | - (ac_increase ? 0b00000010 : 0) | - (shift ? 0b00000001 : 0) - ); -} - -// Sets the sa bit regardless of the current state. This is a helper -// function for scroll_or_addr_select() -void ST7920_Lite_Status_Screen::_scroll_or_addr_select(const bool sa) { - extended_function_set(true); - cmd(0b00000010 | (sa ? 0b00000001 : 0)); - current_bits.sa = sa; -} - -void ST7920_Lite_Status_Screen::scroll_or_addr_select(const bool sa) { - if (sa != current_bits.sa) - _scroll_or_addr_select(sa); -} - -void ST7920_Lite_Status_Screen::set_ddram_address(const uint8_t addr) { - extended_function_set(false); - cmd(0b10000000 | (addr & 0b00111111)); -} - -void ST7920_Lite_Status_Screen::set_cgram_address(const uint8_t addr) { - extended_function_set(false); - cmd(0b01000000 | (addr & 0b00111111)); -} - -void ST7920_Lite_Status_Screen::set_gdram_address(const uint8_t x, const uint8_t y) { - extended_function_set(true); - cmd(0b10000000 | (y & 0b01111111)); - cmd(0b10000000 | (x & 0b00001111)); -} - -void ST7920_Lite_Status_Screen::clear() { - extended_function_set(false); - cmd(0x00000001); - delay(15); //delay for CGRAM clear -} - -void ST7920_Lite_Status_Screen::home() { - extended_function_set(false); - cmd(0x00000010); -} - -/* This fills the entire text buffer with spaces */ -void ST7920_Lite_Status_Screen::clear_ddram() { - set_ddram_address(DDRAM_LINE_1); - begin_data(); - for (uint8_t i = 64; i--;) write_byte(' '); -} - -/* This fills the entire graphics buffer with zeros */ -void ST7920_Lite_Status_Screen::clear_gdram() { - LOOP_L_N(y, BUFFER_HEIGHT) { - set_gdram_address(0, y); - begin_data(); - for (uint8_t i = (BUFFER_WIDTH) / 16; i--;) write_word(0); - } -} - -void ST7920_Lite_Status_Screen::load_cgram_icon(const uint16_t addr, const void *data) { - const uint16_t *p_word = (const uint16_t *)data; - set_cgram_address(addr); - begin_data(); - for (uint8_t i = 16; i--;) - write_word(pgm_read_word(p_word++)); -} - -/** - * Draw an icon in GDRAM. Position specified in DDRAM - * coordinates. i.e., X from 1 to 8, Y from 1 to 4. - */ -void ST7920_Lite_Status_Screen::draw_gdram_icon(uint8_t x, uint8_t y, const void *data) { - const uint16_t *p_word = (const uint16_t *)data; - // Handle display folding - if (y > 1) y -= 2, x += 8; - for (int i = 0; i < 16; i++) { - set_gdram_address(x, i + y * 16); - begin_data(); - write_word(pgm_read_word(p_word++)); - } -} - -/************************** ICON DEFINITIONS *************************************/ - -#define CGRAM_ICON_1_ADDR 0x00 -#define CGRAM_ICON_2_ADDR 0x10 -#define CGRAM_ICON_3_ADDR 0x20 -#define CGRAM_ICON_4_ADDR 0x30 - -#define CGRAM_ICON_1_WORD 0x00 -#define CGRAM_ICON_2_WORD 0x02 -#define CGRAM_ICON_3_WORD 0x04 -#define CGRAM_ICON_4_WORD 0x06 - -const uint8_t degree_symbol_y_top = 1; -PROGMEM const uint8_t degree_symbol[] = { - 0b00110000, - 0b01001000, - 0b01001000, - 0b00110000, -}; - -const uint16_t nozzle_icon[] PROGMEM = { - 0b0000000000000000, - 0b0000000000000000, - 0b0000111111110000, - 0b0001111111111000, - 0b0001111111111000, - 0b0001111111111000, - 0b0000111111110000, - 0b0000111111110000, - 0b0001111111111000, - 0b0001111111111000, - 0b0001111111111000, - 0b0000011111100000, - 0b0000001111000000, - 0b0000000110000000, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t bed_icon[] PROGMEM = { - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0111111111111110, - 0b0111111111111110, - 0b0110000000000110, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t heat1_icon[] PROGMEM = { - 0b0000000000000000, - 0b0010001000100000, - 0b0001000100010000, - 0b0000100010001000, - 0b0000100010001000, - 0b0001000100010000, - 0b0010001000100000, - 0b0010001000100000, - 0b0001000100010000, - 0b0000100010001000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t heat2_icon[] PROGMEM = { - 0b0000000000000000, - 0b0000100010001000, - 0b0000100010001000, - 0b0001000100010000, - 0b0010001000100000, - 0b0010001000100000, - 0b0001000100010000, - 0b0000100010001000, - 0b0000100010001000, - 0b0001000100010000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t fan1_icon[] PROGMEM = { - 0b0000000000000000, - 0b0111111111111110, - 0b0111000000001110, - 0b0110001111000110, - 0b0100001111000010, - 0b0100000110000010, - 0b0101100000011010, - 0b0101110110111010, - 0b0101100000011010, - 0b0100000110000010, - 0b0100001111000010, - 0b0110001111000110, - 0b0111000000001110, - 0b0111111111111110, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t fan2_icon[] PROGMEM = { - 0b0000000000000000, - 0b0111111111111110, - 0b0111000000001110, - 0b0110010000100110, - 0b0100111001110010, - 0b0101111001111010, - 0b0100110000110010, - 0b0100000110000010, - 0b0100110000110010, - 0b0101111001111010, - 0b0100111001110010, - 0b0110010000100110, - 0b0111000000001110, - 0b0111111111111110, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t feedrate_icon[] PROGMEM = { - 0b0000000000000000, - 0b0111111000000000, - 0b0110000000000000, - 0b0110000000000000, - 0b0110000000000000, - 0b0111111011111000, - 0b0110000011001100, - 0b0110000011001100, - 0b0110000011001100, - 0b0110000011111000, - 0b0000000011001100, - 0b0000000011001100, - 0b0000000011001100, - 0b0000000011001100, - 0b0000000000000000, - 0b0000000000000000 -}; - -/************************** MAIN SCREEN *************************************/ - -/** - * The ST7920 has no degree character, so draw it to GDRAM. - * This function takes character position xy - * i.e., x is [0-15], while the y position is [0-3] - */ -void ST7920_Lite_Status_Screen::draw_degree_symbol(uint8_t x, uint8_t y, const bool draw) { - const uint8_t *p_bytes = degree_symbol; - // Handle display folding - if (y > 1) y -= 2, x += 16; - const bool oddChar = x & 1; - const uint8_t x_word = x >> 1, - y_top = degree_symbol_y_top, - y_bot = y_top + COUNT(degree_symbol); - LOOP_S_L_N(i, y_top, y_bot) { - uint8_t byte = pgm_read_byte(p_bytes++); - set_gdram_address(x_word, i + y * 16); - begin_data(); - if (draw) { - write_byte(oddChar ? 0x00 : byte); - write_byte(oddChar ? byte : 0x00); - } - else - write_word(0x0000); - } -} - -void ST7920_Lite_Status_Screen::draw_static_elements() { - scroll_or_addr_select(0); - - // Load the animated bed and fan icons - load_cgram_icon(CGRAM_ICON_1_ADDR, heat1_icon); - load_cgram_icon(CGRAM_ICON_2_ADDR, heat2_icon); - load_cgram_icon(CGRAM_ICON_3_ADDR, fan1_icon); - load_cgram_icon(CGRAM_ICON_4_ADDR, fan2_icon); - - // Draw the static icons in GDRAM - draw_gdram_icon(0, 0, nozzle_icon); - #if HAS_MULTI_HOTEND - draw_gdram_icon(0, 1, nozzle_icon); - draw_gdram_icon(0, 2, bed_icon); - #else - draw_gdram_icon(0, 1, bed_icon); - #endif - draw_gdram_icon(5, 1, feedrate_icon); - - // Draw the initial fan icon - draw_fan_icon(false); -} - -/** - * Although this is undocumented, the ST7920 allows the character - * data buffer (DDRAM) to be used in conjunction with the graphics - * bitmap buffer (CGRAM). The contents of the graphics buffer is - * XORed with the data from the character generator. This allows - * us to make the progess bar out of graphical data (the bar) and - * text data (the percentage). - */ -void ST7920_Lite_Status_Screen::draw_progress_bar(const uint8_t value) { - #if HOTENDS == 1 - // If we have only one extruder, draw a long progress bar on the third line - constexpr uint8_t top = 1, // Top in pixels - bottom = 13, // Bottom in pixels - left = 12, // Left edge, in 16-bit words - width = 4; // Width of progress bar, in 16-bit words - #else - constexpr uint8_t top = 16 + 1, - bottom = 16 + 13, - left = 5, - width = 3; - #endif - const uint8_t char_pcnt = 100 / width; // How many percent does each 16-bit word represent? - - // Draw the progress bar as a bitmap in CGRAM - LOOP_S_LE_N(y, top, bottom) { - set_gdram_address(left, y); - begin_data(); - LOOP_L_N(x, width) { - uint16_t gfx_word = 0x0000; - if ((x + 1) * char_pcnt <= value) - gfx_word = 0xFFFF; // Draw completely filled bytes - else if ((x * char_pcnt) < value) - gfx_word = int(0x8000) >> (value % char_pcnt) * 16 / char_pcnt; // Draw partially filled bytes - - // Draw the frame around the progress bar - if (y == top || y == bottom) - gfx_word = 0xFFFF; // Draw top/bottom border - else if (x == width - 1) - gfx_word |= 0x0001; // Draw right border - else if (x == 0) - gfx_word |= 0x8000; // Draw left border - write_word(gfx_word); - } - } - - // Draw the percentage as text in DDRAM - #if HOTENDS == 1 - set_ddram_address(DDRAM_LINE_3 + 4); - begin_data(); - write_byte(' '); - #else - set_ddram_address(DDRAM_LINE_2 + left); - begin_data(); - #endif - - // Draw centered - if (value > 9) { - write_number(value, 4); - write_str_P(PSTR("% ")); - } - else { - write_number(value, 3); - write_str_P(PSTR("% ")); - } -} - -void ST7920_Lite_Status_Screen::draw_fan_icon(const bool whichIcon) { - set_ddram_address(DDRAM_LINE_1 + 5); - begin_data(); - write_word(whichIcon ? CGRAM_ICON_3_WORD : CGRAM_ICON_4_WORD); -} - -void ST7920_Lite_Status_Screen::draw_heat_icon(const bool whichIcon, const bool heating) { - set_ddram_address( - #if HOTENDS == 1 - DDRAM_LINE_2 - #else - DDRAM_LINE_3 - #endif - ); - begin_data(); - if (heating) - write_word(whichIcon ? CGRAM_ICON_1_WORD : CGRAM_ICON_2_WORD); - else { - write_byte(' '); - write_byte(' '); - } -} - -#define FAR(a,b) (((a > b) ? (a-b) : (b-a)) > 2) - -static struct { - bool E1_show_target : 1; - bool E2_show_target : 1; - TERN_(HAS_HEATED_BED, bool bed_show_target : 1); -} display_state = { - true, true, TERN_(HAS_HEATED_BED, true) -}; - -void ST7920_Lite_Status_Screen::draw_temps(uint8_t line, const int16_t temp, const int16_t target, bool showTarget, bool targetStateChange) { - switch (line) { - case 0: set_ddram_address(DDRAM_LINE_1 + 1); break; - case 1: set_ddram_address(DDRAM_LINE_2 + 1); break; - case 2: set_ddram_address(DDRAM_LINE_3 + 1); break; - case 3: set_ddram_address(DDRAM_LINE_3 + 1); break; - } - begin_data(); - write_number(temp); - - if (showTarget) { - write_byte('\x1A'); - write_number(target); - }; - - if (targetStateChange) { - if (!showTarget) write_str_P(PSTR(" ")); - draw_degree_symbol(5, line, !showTarget); - draw_degree_symbol(9, line, showTarget); - } -} - -void ST7920_Lite_Status_Screen::draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate) { - const bool show_target = target && FAR(temp, target); - draw_temps(0, temp, target, show_target, display_state.E1_show_target != show_target || forceUpdate); - display_state.E1_show_target = show_target; -} - -void ST7920_Lite_Status_Screen::draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate) { - const bool show_target = target && FAR(temp, target); - draw_temps(1, temp, target, show_target, display_state.E2_show_target != show_target || forceUpdate); - display_state.E2_show_target = show_target; -} - -#if HAS_HEATED_BED - void ST7920_Lite_Status_Screen::draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate) { - const bool show_target = target && FAR(temp, target); - draw_temps(TERN(HAS_MULTI_HOTEND, 2, 1), temp, target, show_target, display_state.bed_show_target != show_target || forceUpdate); - display_state.bed_show_target = show_target; - } -#endif - -void ST7920_Lite_Status_Screen::draw_fan_speed(const uint8_t value) { - set_ddram_address(DDRAM_LINE_1 + 6); - begin_data(); - write_number(value, 3); - write_byte('%'); -} - -void ST7920_Lite_Status_Screen::draw_print_time(const duration_t &elapsed, char suffix) { - #if HOTENDS == 1 - set_ddram_address(DDRAM_LINE_3); - #else - set_ddram_address(DDRAM_LINE_3 + 5); - #endif - char str[7]; - int str_length = elapsed.toDigital(str); - str[str_length++] = suffix; - begin_data(); - write_str(str, str_length); -} - -void ST7920_Lite_Status_Screen::draw_feedrate_percentage(const uint16_t percentage) { - // We only have enough room for the feedrate when - // we have one extruder - #if HOTENDS == 1 - set_ddram_address(DDRAM_LINE_2 + 6); - begin_data(); - write_number(percentage, 3); - write_byte('%'); - #else - UNUSED(percentage); - #endif -} - -void ST7920_Lite_Status_Screen::draw_status_message() { - const char *str = ui.status_message; - - set_ddram_address(DDRAM_LINE_4); - begin_data(); - #if ENABLED(STATUS_MESSAGE_SCROLLING) - uint8_t slen = utf8_strlen(str); - - if (slen <= TEXT_MODE_LCD_WIDTH) { - // String fits the LCD, so just print it - write_str(str); - while (slen < TEXT_MODE_LCD_WIDTH) { write_byte(' '); ++slen; } - } - else { - // String is larger than the available space in screen. - - // Get a pointer to the next valid UTF8 character - // and the string remaining length - uint8_t rlen; - const char *stat = ui.status_and_len(rlen); - write_str(stat, TEXT_MODE_LCD_WIDTH); - - // If the remaining string doesn't completely fill the screen - if (rlen < TEXT_MODE_LCD_WIDTH) { - write_byte('.'); // Always at 1+ spaces left, draw a dot - uint8_t chars = TEXT_MODE_LCD_WIDTH - rlen; // Amount of space left in characters - if (--chars) { // Draw a second dot if there's space - write_byte('.'); - if (--chars) write_str(str, chars); // Print a second copy of the message - } - } - ui.advance_status_scroll(); - } - - #else - - uint8_t slen = utf8_strlen(str); - write_str(str, TEXT_MODE_LCD_WIDTH); - for (; slen < TEXT_MODE_LCD_WIDTH; ++slen) write_byte(' '); - - #endif -} - -void ST7920_Lite_Status_Screen::draw_position(const xyze_pos_t &pos, const bool position_known) { - char str[7]; - set_ddram_address(DDRAM_LINE_4); - begin_data(); - - // If position is unknown, flash the labels. - const unsigned char alt_label = position_known ? 0 : (ui.get_blink() ? ' ' : 0); - - if (TERN1(LCD_SHOW_E_TOTAL, !printingIsActive())) { - write_byte(alt_label ? alt_label : 'X'); - write_str(dtostrf(pos.x, -4, 0, str), 4); - - write_byte(alt_label ? alt_label : 'Y'); - write_str(dtostrf(pos.y, -4, 0, str), 4); - } - else { - #if ENABLED(LCD_SHOW_E_TOTAL) - char tmp[15]; - const uint8_t escale = e_move_accumulator >= 100000.0f ? 10 : 1; // After 100m switch to cm - sprintf_P(tmp, PSTR("E%-7ld%cm "), uint32_t(_MAX(e_move_accumulator, 0.0f)) / escale, escale == 10 ? 'c' : 'm'); // 1234567mm - write_str(tmp); - #endif - } - - write_byte(alt_label ? alt_label : 'Z'); - write_str(dtostrf(pos.z, -5, 1, str), 5); -} - -bool ST7920_Lite_Status_Screen::indicators_changed() { - // We only add the target temperatures to the checksum - // because the actual temps fluctuate so by updating - // them only during blinks we gain a bit of stability. - const bool blink = ui.get_blink(); - const uint16_t feedrate_perc = feedrate_percentage; - const uint16_t fs = thermalManager.scaledFanSpeed(0); - const int16_t extruder_1_target = thermalManager.degTargetHotend(0); - #if HAS_MULTI_HOTEND - const int16_t extruder_2_target = thermalManager.degTargetHotend(1); - #endif - #if HAS_HEATED_BED - const int16_t bed_target = thermalManager.degTargetBed(); - #endif - static uint16_t last_checksum = 0; - const uint16_t checksum = blink ^ feedrate_perc ^ fs ^ extruder_1_target - ^ TERN0(HAS_MULTI_HOTEND, extruder_2_target) - ^ TERN0(HAS_HEATED_BED, bed_target); - if (last_checksum == checksum) return false; - last_checksum = checksum; - return true; -} - -void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { - if (forceUpdate || indicators_changed()) { - const bool blink = ui.get_blink(); - const duration_t elapsed = print_job_timer.duration(); - duration_t remaining = TERN0(USE_M73_REMAINING_TIME, ui.get_remaining_time()); - const uint16_t feedrate_perc = feedrate_percentage; - const int16_t extruder_1_temp = thermalManager.degHotend(0), - extruder_1_target = thermalManager.degTargetHotend(0); - #if HAS_MULTI_HOTEND - const int16_t extruder_2_temp = thermalManager.degHotend(1), - extruder_2_target = thermalManager.degTargetHotend(1); - #endif - #if HAS_HEATED_BED - const int16_t bed_temp = thermalManager.degBed(), - bed_target = thermalManager.degTargetBed(); - #endif - - draw_extruder_1_temp(extruder_1_temp, extruder_1_target, forceUpdate); - TERN_(HAS_MULTI_HOTEND, draw_extruder_2_temp(extruder_2_temp, extruder_2_target, forceUpdate)); - TERN_(HAS_HEATED_BED, draw_bed_temp(bed_temp, bed_target, forceUpdate)); - - uint16_t spd = thermalManager.fan_speed[0]; - - #if ENABLED(ADAPTIVE_FAN_SLOWING) - if (!blink && thermalManager.fan_speed_scaler[0] < 128) - spd = thermalManager.scaledFanSpeed(0, spd); - #endif - - draw_fan_speed(thermalManager.fanPercent(spd)); - - // Draw elapsed/remaining time - const bool show_remaining = ENABLED(SHOW_REMAINING_TIME) && (DISABLED(ROTATE_PROGRESS_DISPLAY) || blink); - if (show_remaining && !remaining.second()) { - const auto progress = ui.get_progress_percent(); - if (progress) - remaining = elapsed.second() * (100 - progress) / progress; - } - if (show_remaining && remaining.second()) - draw_print_time(remaining, 'R'); - else - draw_print_time(elapsed); - - draw_feedrate_percentage(feedrate_perc); - - // Update the fan and bed animations - if (spd) draw_fan_icon(blink); - TERN_(HAS_HEATED_BED, draw_heat_icon(bed_target > 0 && blink, bed_target > 0)); - } -} - -bool ST7920_Lite_Status_Screen::position_changed() { - const xyz_pos_t pos = current_position; - const uint8_t checksum = uint8_t(pos.x) ^ uint8_t(pos.y) ^ uint8_t(pos.z); - static uint8_t last_checksum = 0, changed = last_checksum != checksum; - if (changed) last_checksum = checksum; - return changed; -} - -bool ST7920_Lite_Status_Screen::status_changed() { - uint8_t checksum = 0; - for (const char *p = ui.status_message; *p; p++) checksum ^= *p; - static uint8_t last_checksum = 0; - bool changed = last_checksum != checksum; - if (changed) last_checksum = checksum; - return changed; -} - -bool ST7920_Lite_Status_Screen::blink_changed() { - static uint8_t last_blink = 0; - const bool blink = ui.get_blink(), changed = last_blink != blink; - if (changed) last_blink = blink; - return changed; -} - -#ifndef STATUS_EXPIRE_SECONDS - #define STATUS_EXPIRE_SECONDS 20 -#endif - -void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { - - #if STATUS_EXPIRE_SECONDS - static uint8_t countdown = 0; - #endif - - /** - * There's only enough room for either the status message or the position, - * so draw one or the other. When the status message changes, show it for - * a few seconds, then return to the position display once the head moves. - * - * countdown > 1 -- Show status - * countdown = 1 -- Show status, until movement - * countdown = 0 -- Show position - * - * If STATUS_EXPIRE_SECONDS is zero, only the status is shown. - */ - if (forceUpdate || status_changed()) { - TERN_(STATUS_MESSAGE_SCROLLING, ui.status_scroll_offset = 0); - #if STATUS_EXPIRE_SECONDS - countdown = ui.status_message[0] ? STATUS_EXPIRE_SECONDS : 0; - #endif - draw_status_message(); - blink_changed(); // Clear changed flag - } - #if !STATUS_EXPIRE_SECONDS - else if (TERN0(STATUS_MESSAGE_SCROLLING, blink_changed())) - draw_status_message(); - #else - else if (blink_changed()) { - if (countdown > 1) { - countdown--; - TERN_(STATUS_MESSAGE_SCROLLING, draw_status_message()); - } - else if (countdown > 0) { - if (position_changed()) { - countdown--; - forceUpdate = true; - } - TERN_(STATUS_MESSAGE_SCROLLING, draw_status_message()); - } - } - - if (countdown == 0 && (forceUpdate || position_changed() - || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed()) - )) draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 1, all_axes_known())); - #endif -} - -void ST7920_Lite_Status_Screen::update_progress(const bool forceUpdate) { - #if EITHER(LCD_SET_PROGRESS_MANUALLY, SDSUPPORT) - - // Since the progress bar involves writing - // quite a few bytes to GDRAM, only do this - // when an update is actually necessary. - - static uint8_t last_progress = 0; - const uint8_t progress = ui.get_progress_percent(); - if (forceUpdate || last_progress != progress) { - last_progress = progress; - draw_progress_bar(progress); - } - - #else - - UNUSED(forceUpdate); - - #endif // LCD_SET_PROGRESS_MANUALLY || SDSUPPORT -} - -void ST7920_Lite_Status_Screen::update(const bool forceUpdate) { - cs(); - update_indicators(forceUpdate); - update_status_or_position(forceUpdate); - update_progress(forceUpdate); - ncs(); -} - -void ST7920_Lite_Status_Screen::reset_state_from_unknown() { - _extended_function_set(true, true); // Do it twice as only one bit - _extended_function_set(true, true); // get set at a time. - _scroll_or_addr_select(false); -} - -void ST7920_Lite_Status_Screen::on_entry() { - cs(); - reset_state_from_unknown(); - clear(); - clear_gdram(); - draw_static_elements(); - update(true); - ncs(); -} - -void ST7920_Lite_Status_Screen::on_exit() { - cs(); - clear(); - _extended_function_set(true, true); // Restore state to what u8g expects. - ncs(); -} - -// Called prior to the KILL screen to -// clear the screen, preventing a garbled display. -void ST7920_Lite_Status_Screen::clear_text_buffer() { - cs(); - reset_state_from_unknown(); - clear(); - _extended_function_set(true, true); // Restore state to what u8g expects. - ncs(); -} - -void MarlinUI::draw_status_screen() { - ST7920_Lite_Status_Screen::update(false); -} - -// This method is called before each screen update and -// fires on_entry() and on_exit() events upon entering -// or exiting the Status Screen. -void MarlinUI::lcd_in_status(const bool inStatus) { - static bool lastInStatus = false; - if (lastInStatus == inStatus) return; - if ((lastInStatus = inStatus)) - ST7920_Lite_Status_Screen::on_entry(); - else - ST7920_Lite_Status_Screen::on_exit(); -} - -#endif // LIGHTWEIGHT_UI diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h index b217246484..2ac5c19ccf 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h @@ -11,96 +11,962 @@ * any later version. The code is distributed WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * */ -#pragma once -#include "../../HAL/shared/HAL_ST7920.h" +/** + * Implementation of a Status Screen for the RepRapDiscount + * Full Graphics Smart Controller using native ST7920 commands + * instead of U8Glib. + * + * This alternative Status Screen makes use of the built-in character + * generation capabilities of the ST7920 to update the Status Screen + * with less SPI traffic and CPU use. In particular: + * + * - The fan and bed animations are handled using custom characters + * that are stored in CGRAM. This allows for the animation to be + * updated by writing a single character to the text-buffer (DDRAM). + * + * - All the information in the Status Screen is text that is written + * to DDRAM, so the work of generating the bitmaps is offloaded to + * the ST7920 rather than being render by U8Glib on the MCU. + * + * - The graphics buffer (GDRAM) is only used for static graphics + * elements (nozzle and feedrate bitmaps) and for the progress + * bar, so updates are sporadic. + */ + +#include "status_screen_lite_ST7920_class.h" -#include "../../core/types.h" -#include "../../core/macros.h" #include "../../libs/duration_t.h" -class ST7920_Lite_Status_Screen { - private: - static struct st7920_state_t { - uint8_t synced : 1; // Whether a sync has been sent - uint8_t cmd : 1; // Whether the sync was cmd or data - uint8_t extended : 1; - uint8_t graphics : 1; - uint8_t sa : 1; - } current_bits; +#define BUFFER_WIDTH 256 +#define BUFFER_HEIGHT 32 - static void cs() { ST7920_cs(); current_bits.synced = false; } - static void ncs() { ST7920_cs(); current_bits.synced = false; } - static void sync_cmd() { ST7920_set_cmd(); } - static void sync_dat() { ST7920_set_dat(); } - static void write_byte(const uint8_t w) { ST7920_write_byte(w); } +#define DDRAM_LINE_1 0x00 +#define DDRAM_LINE_2 0x10 +#define DDRAM_LINE_3 0x08 +#define DDRAM_LINE_4 0x18 - FORCE_INLINE static void write_word(const uint16_t w) { - write_byte((w >> 8) & 0xFF); - write_byte((w >> 0) & 0xFF); - } +ST7920_Lite_Status_Screen::st7920_state_t ST7920_Lite_Status_Screen::current_bits; - static void cmd(const uint8_t cmd); - static void begin_data(); +void ST7920_Lite_Status_Screen::cmd(const uint8_t cmd) { + if (!current_bits.synced || !current_bits.cmd) { + current_bits.synced = true; + current_bits.cmd = true; + sync_cmd(); + } + write_byte(cmd); +} - static void write_str(const char *str); - static void write_str(const char *str, const uint8_t len); - static void write_str_P(PGM_P const str); - static void write_number(const int16_t value, const uint8_t digits=3); +void ST7920_Lite_Status_Screen::begin_data() { + if (!current_bits.synced || current_bits.cmd) { + current_bits.synced = true; + current_bits.cmd = false; + sync_dat(); + } +} - static void _extended_function_set(const bool extended, const bool graphics); - static void _scroll_or_addr_select(const bool sa); - static void reset_state_from_unknown(); +void ST7920_Lite_Status_Screen::write_str(const char *str) { + while (*str) write_byte(*str++); +} - static void home(); - static void display_status(const bool display_on, const bool cursor_on, const bool blink_on); - static void extended_function_set(const bool extended); - static void graphics(const bool graphics); - static void entry_mode_select(const bool ac_increase, const bool shift); - static void scroll_or_addr_select(const bool sa); - static void set_ddram_address(const uint8_t addr); - static void set_cgram_address(const uint8_t addr); - static void set_gdram_address(const uint8_t x, const uint8_t y); +void ST7920_Lite_Status_Screen::write_str(const char *str, uint8_t len) { + while (*str && len--) write_byte(*str++); +} - static void clear(); - static void clear_ddram(); - static void clear_gdram(); +void ST7920_Lite_Status_Screen::write_str_P(const char * const str) { + const char *p_str = (const char *)str; + while (char c = pgm_read_byte_near(p_str++)) write_byte(c); +} - static void load_cgram_icon(const uint16_t addr, const void *data); - static void draw_gdram_icon(uint8_t x, uint8_t y, const void *data); +void ST7920_Lite_Status_Screen::write_str(progmem_str str) { + write_str_P((const char*)str); +} - static uint8_t string_checksum(const char *str); +void ST7920_Lite_Status_Screen::write_number(const int16_t value, const uint8_t digits/*=3*/) { + char str[7]; + const char *fmt; + switch (digits) { + case 6: fmt = PSTR("%6d"); break; + case 5: fmt = PSTR("%5d"); break; + case 4: fmt = PSTR("%4d"); break; + case 3: fmt = PSTR("%3d"); break; + case 2: fmt = PSTR("%2d"); break; + case 1: fmt = PSTR("%1d"); break; + } + sprintf_P(str, fmt, value); + write_str(str); +} - protected: - static void draw_degree_symbol(uint8_t x, uint8_t y, const bool draw); - static void draw_static_elements(); - static void draw_progress_bar(const uint8_t value); - static void draw_fan_icon(const bool whichIcon); - static void draw_heat_icon(const bool whichIcon, const bool heating); - static void draw_temps(uint8_t line, const int16_t temp, const int16_t target, bool showTarget, bool targetStateChange); - static void draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate=false); - static void draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate=false); - static void draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate=false); - static void draw_fan_speed(const uint8_t value); - static void draw_print_time(const duration_t &elapsed, char suffix=' '); - static void draw_feedrate_percentage(const uint16_t percentage); - static void draw_status_message(); - static void draw_position(const xyze_pos_t &pos, bool position_known=true); +void ST7920_Lite_Status_Screen::display_status(const bool display_on, const bool cursor_on, const bool blink_on) { + extended_function_set(false); + cmd(0b00001000 | + (display_on ? 0b0100 : 0) | + (cursor_on ? 0b0010 : 0) | + (blink_on ? 0b0001 : 0) + ); +} - static bool indicators_changed(); - static bool position_changed(); - static bool blink_changed(); - static bool status_changed(); +// Sets the extended and graphics bits simultaneously, regardless of +// the current state. This is a helper function for extended_function_set() +// and graphics() +void ST7920_Lite_Status_Screen::_extended_function_set(const bool extended, const bool graphics) { + cmd( 0b00100000 | + (extended ? 0b00000100 : 0) | + (graphics ? 0b00000010 : 0) + ); + current_bits.extended = extended; + current_bits.graphics = graphics; +} - static void update_indicators(const bool forceUpdate); - static void update_position(const bool forceUpdate, bool resetChecksum); - static void update_status_or_position(bool forceUpdate); - static void update_progress(const bool forceUpdate); +void ST7920_Lite_Status_Screen::extended_function_set(const bool extended) { + if (extended != current_bits.extended) + _extended_function_set(extended, current_bits.graphics); +} - public: - static void update(const bool forceUpdate); - static void on_entry(); - static void on_exit(); - static void clear_text_buffer(); +void ST7920_Lite_Status_Screen::graphics(const bool graphics) { + if (graphics != current_bits.graphics) + _extended_function_set(current_bits.extended, graphics); +} + +void ST7920_Lite_Status_Screen::entry_mode_select(const bool ac_increase, const bool shift) { + extended_function_set(false); + cmd(0b00000100 | + (ac_increase ? 0b00000010 : 0) | + (shift ? 0b00000001 : 0) + ); +} + +// Sets the sa bit regardless of the current state. This is a helper +// function for scroll_or_addr_select() +void ST7920_Lite_Status_Screen::_scroll_or_addr_select(const bool sa) { + extended_function_set(true); + cmd(0b00100010 | + (sa ? 0b000001 : 0) + ); + current_bits.sa = sa; +} + +void ST7920_Lite_Status_Screen::scroll_or_addr_select(const bool sa) { + if (sa != current_bits.sa) + _scroll_or_addr_select(sa); +} + +void ST7920_Lite_Status_Screen::set_ddram_address(const uint8_t addr) { + extended_function_set(false); + cmd(0b10000000 | (addr & 0b00111111)); +} + +void ST7920_Lite_Status_Screen::set_cgram_address(const uint8_t addr) { + extended_function_set(false); + cmd(0b01000000 | (addr & 0b00111111)); +} + +void ST7920_Lite_Status_Screen::set_gdram_address(const uint8_t x, const uint8_t y) { + extended_function_set(true); + cmd(0b10000000 | (y & 0b01111111)); + cmd(0b10000000 | (x & 0b00001111)); +} + +void ST7920_Lite_Status_Screen::clear() { + extended_function_set(false); + cmd(0x00000001); + delay(15); //delay for CGRAM clear +} + +void ST7920_Lite_Status_Screen::home() { + extended_function_set(false); + cmd(0x00000010); +} + +/* This fills the entire text buffer with spaces */ +void ST7920_Lite_Status_Screen::clear_ddram() { + set_ddram_address(DDRAM_LINE_1); + begin_data(); + for (uint8_t i = 64; i--;) write_byte(' '); +} + +/* This fills the entire graphics buffer with zeros */ +void ST7920_Lite_Status_Screen::clear_gdram() { + for (uint8_t y = 0; y < BUFFER_HEIGHT; y++) { + set_gdram_address(0, y); + begin_data(); + for (uint8_t i = (BUFFER_WIDTH) / 16; i--;) write_word(0); + } +} + +void ST7920_Lite_Status_Screen::load_cgram_icon(const uint16_t addr, const void *data) { + const uint16_t *p_word = (const uint16_t *)data; + set_cgram_address(addr); + begin_data(); + for (uint8_t i = 16; i--;) + write_word(pgm_read_word_near(p_word++)); +} + +/** + * Draw an icon in GDRAM. Position specified in DDRAM + * coordinates. i.e., X from 1 to 8, Y from 1 to 4. + */ +void ST7920_Lite_Status_Screen::draw_gdram_icon(uint8_t x, uint8_t y, const void *data) { + const uint16_t *p_word = (const uint16_t *)data; + if (y > 2) { // Handle display folding + y -= 2; + x += 8; + } + --x; + --y; + for (int i = 0; i < 16; i++) { + set_gdram_address(x, i + y * 16); + begin_data(); + write_word(pgm_read_word_near(p_word++)); + } +} + +/************************** ICON DEFINITIONS *************************************/ + +#define CGRAM_ICON_1_ADDR 0x00 +#define CGRAM_ICON_2_ADDR 0x10 +#define CGRAM_ICON_3_ADDR 0x20 +#define CGRAM_ICON_4_ADDR 0x30 + +#define CGRAM_ICON_1_WORD 0x00 +#define CGRAM_ICON_2_WORD 0x02 +#define CGRAM_ICON_3_WORD 0x04 +#define CGRAM_ICON_4_WORD 0x06 + +const uint8_t degree_symbol_y_top = 1; +PROGMEM const uint8_t degree_symbol[] = { + 0b00110000, + 0b01001000, + 0b01001000, + 0b00110000, }; + +const uint16_t nozzle_icon[] PROGMEM = { + 0b0000000000000000, + 0b0000000000000000, + 0b0000111111110000, + 0b0001111111111000, + 0b0001111111111000, + 0b0001111111111000, + 0b0000111111110000, + 0b0000111111110000, + 0b0001111111111000, + 0b0001111111111000, + 0b0001111111111000, + 0b0000011111100000, + 0b0000001111000000, + 0b0000000110000000, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t bed_icon[] PROGMEM = { + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0111111111111110, + 0b0111111111111110, + 0b0110000000000110, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t heat1_icon[] PROGMEM = { + 0b0000000000000000, + 0b0010001000100000, + 0b0001000100010000, + 0b0000100010001000, + 0b0000100010001000, + 0b0001000100010000, + 0b0010001000100000, + 0b0010001000100000, + 0b0001000100010000, + 0b0000100010001000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t heat2_icon[] PROGMEM = { + 0b0000000000000000, + 0b0000100010001000, + 0b0000100010001000, + 0b0001000100010000, + 0b0010001000100000, + 0b0010001000100000, + 0b0001000100010000, + 0b0000100010001000, + 0b0000100010001000, + 0b0001000100010000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t fan1_icon[] PROGMEM = { + 0b0000000000000000, + 0b0111111111111110, + 0b0111000000001110, + 0b0110001111000110, + 0b0100001111000010, + 0b0100000110000010, + 0b0101100000011010, + 0b0101110110111010, + 0b0101100000011010, + 0b0100000110000010, + 0b0100001111000010, + 0b0110001111000110, + 0b0111000000001110, + 0b0111111111111110, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t fan2_icon[] PROGMEM = { + 0b0000000000000000, + 0b0111111111111110, + 0b0111000000001110, + 0b0110010000100110, + 0b0100111001110010, + 0b0101111001111010, + 0b0100110000110010, + 0b0100000110000010, + 0b0100110000110010, + 0b0101111001111010, + 0b0100111001110010, + 0b0110010000100110, + 0b0111000000001110, + 0b0111111111111110, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t feedrate_icon[] PROGMEM = { + 0b0000000000000000, + 0b0111111000000000, + 0b0110000000000000, + 0b0110000000000000, + 0b0110000000000000, + 0b0111111011111000, + 0b0110000011001100, + 0b0110000011001100, + 0b0110000011001100, + 0b0110000011111000, + 0b0000000011001100, + 0b0000000011001100, + 0b0000000011001100, + 0b0000000011001100, + 0b0000000000000000, + 0b0000000000000000 +}; + +/************************** MAIN SCREEN *************************************/ + +// The ST7920 does not have a degree character, but we +// can fake it by writing it to GDRAM. +// This function takes as an argument character positions +// i.e x is [1-16], while the y position is [1-4] +void ST7920_Lite_Status_Screen::draw_degree_symbol(uint8_t x, uint8_t y, bool draw) { + const uint8_t *p_bytes = degree_symbol; + if (y > 2) { + // Handle display folding + y -= 2; + x += 16; + } + x -= 1; + y -= 1; + const bool oddChar = x & 1; + const uint8_t x_word = x >> 1; + const uint8_t y_top = degree_symbol_y_top; + const uint8_t y_bot = y_top + sizeof(degree_symbol)/sizeof(degree_symbol[0]); + for(uint8_t i = y_top; i < y_bot; i++) { + uint8_t byte = pgm_read_byte_near(p_bytes++); + set_gdram_address(x_word,i+y*16); + begin_data(); + if (draw) { + write_byte(oddChar ? 0x00 : byte); + write_byte(oddChar ? byte : 0x00); + } + else + write_word(0x0000); + } +} + +void ST7920_Lite_Status_Screen::draw_static_elements() { + scroll_or_addr_select(0); + + // Load the animated bed and fan icons + load_cgram_icon(CGRAM_ICON_1_ADDR, heat1_icon); + load_cgram_icon(CGRAM_ICON_2_ADDR, heat2_icon); + load_cgram_icon(CGRAM_ICON_3_ADDR, fan1_icon); + load_cgram_icon(CGRAM_ICON_4_ADDR, fan2_icon); + + // Draw the static icons in GDRAM + draw_gdram_icon(1, 1, nozzle_icon); + #if EXTRUDERS == 2 + draw_gdram_icon(1,2,nozzle_icon); + draw_gdram_icon(1,3,bed_icon); + #else + draw_gdram_icon(1,2,bed_icon); + #endif + draw_gdram_icon(6,2,feedrate_icon); + + // Draw the initial fan icon + draw_fan_icon(false); +} + +/** + * Although this is undocumented, the ST7920 allows the character + * data buffer (DDRAM) to be used in conjunction with the graphics + * bitmap buffer (CGRAM). The contents of the graphics buffer is + * XORed with the data from the character generator. This allows + * us to make the progess bar out of graphical data (the bar) and + * text data (the percentage). + */ +void ST7920_Lite_Status_Screen::draw_progress_bar(const uint8_t value) { + #if EXTRUDERS == 1 + // If we have only one extruder, draw a long progress bar on the third line + const uint8_t top = 1, // Top in pixels + bottom = 13, // Bottom in pixels + left = 12, // Left edge, in 16-bit words + width = 4; // Width of progress bar, in 16-bit words + #else + const uint8_t top = 16 + 1, + bottom = 16 + 13, + left = 5, + width = 3; + #endif + const uint8_t char_pcnt = 100 / width; // How many percent does each 16-bit word represent? + + // Draw the progress bar as a bitmap in CGRAM + for (uint8_t y = top; y <= bottom; y++) { + set_gdram_address(left, y); + begin_data(); + for (uint8_t x = 0; x < width; x++) { + uint16_t gfx_word = 0x0000; + if ((x + 1) * char_pcnt <= value) + gfx_word = 0xFFFF; // Draw completely filled bytes + else if ((x * char_pcnt) < value) + gfx_word = int(0x8000) >> (value % char_pcnt) * 16 / char_pcnt; // Draw partially filled bytes + + // Draw the frame around the progress bar + if (y == top || y == bottom) + gfx_word = 0xFFFF; // Draw top/bottom border + else if (x == width - 1) + gfx_word |= 0x0001; // Draw right border + else if (x == 0) + gfx_word |= 0x8000; // Draw left border + write_word(gfx_word); + } + } + + // Draw the percentage as text in DDRAM + #if EXTRUDERS == 1 + set_ddram_address(DDRAM_LINE_3 + 4); + begin_data(); + write_byte(' '); + #else + set_ddram_address(DDRAM_LINE_2 + left); + begin_data(); + #endif + + // Draw centered + if (value > 9) { + write_number(value, 4); + write_str(F("% ")); + } + else { + write_number(value, 3); + write_str(F("% ")); + } +} + +void ST7920_Lite_Status_Screen::draw_fan_icon(const bool whichIcon) { + set_ddram_address(DDRAM_LINE_1 + 5); + begin_data(); + write_word(whichIcon ? CGRAM_ICON_3_WORD : CGRAM_ICON_4_WORD); +} + +void ST7920_Lite_Status_Screen::draw_heat_icon(const bool whichIcon, const bool heating) { + set_ddram_address( + #if EXTRUDERS == 1 + DDRAM_LINE_2 + #else + DDRAM_LINE_3 + #endif + ); + begin_data(); + if (heating) + write_word(whichIcon ? CGRAM_ICON_1_WORD : CGRAM_ICON_2_WORD); + else { + write_byte(' '); + write_byte(' '); + } +} + +#define FAR(a,b) (((a > b) ? (a-b) : (b-a)) > 2) + +static struct { + bool E1_show_target : 1; + bool E2_show_target : 1; + #if HAS_HEATED_BED + bool bed_show_target : 1; + #endif +} display_state = { + true, true + #if HAS_HEATED_BED + , true + #endif +}; + +void ST7920_Lite_Status_Screen::draw_temps(uint8_t line, const int16_t temp, const int16_t target, bool showTarget, bool targetStateChange) { + switch (line) { + case 1: set_ddram_address(DDRAM_LINE_1 + 1); break; + case 2: set_ddram_address(DDRAM_LINE_2 + 1); break; + case 3: set_ddram_address(DDRAM_LINE_3 + 1); break; + case 4: set_ddram_address(DDRAM_LINE_3 + 1); break; + } + begin_data(); + write_number(temp); + + if (showTarget) { + write_str(F("\x1A")); + write_number(target); + }; + + if (targetStateChange) { + if (!showTarget) write_str(F(" ")); + draw_degree_symbol(6, line, !showTarget); + draw_degree_symbol(10, line, showTarget); + } +} + +void ST7920_Lite_Status_Screen::draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate) { + const bool show_target = target && FAR(temp, target); + draw_temps(1, temp, target, show_target, display_state.E1_show_target != show_target || forceUpdate); + display_state.E1_show_target = show_target; +} + +void ST7920_Lite_Status_Screen::draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate) { + const bool show_target = target && FAR(temp, target); + draw_temps(2, temp, target, show_target, display_state.E2_show_target != show_target || forceUpdate); + display_state.E2_show_target = show_target; +} + +#if HAS_HEATED_BED + void ST7920_Lite_Status_Screen::draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate) { + const bool show_target = target && FAR(temp, target); + draw_temps(2 + #if EXTRUDERS > 1 + + 1 + #endif + , temp, target, show_target, display_state.bed_show_target != show_target || forceUpdate + ); + display_state.bed_show_target = show_target; + } +#endif + +void ST7920_Lite_Status_Screen::draw_fan_speed(const uint8_t value) { + set_ddram_address(DDRAM_LINE_1 + 6); + begin_data(); + write_number(value, 3); + write_byte('%'); +} + +void ST7920_Lite_Status_Screen::draw_print_time(const duration_t &elapsed) { + #if EXTRUDERS == 1 + set_ddram_address(DDRAM_LINE_3); + #else + set_ddram_address(DDRAM_LINE_3 + 5); + #endif + char str[7]; + str[elapsed.toDigital(str)] = ' '; + begin_data(); + write_str(str, 6); +} + +void ST7920_Lite_Status_Screen::draw_feedrate_percentage(const uint16_t percentage) { + // We only have enough room for the feedrate when + // we have one extruder + #if EXTRUDERS == 1 + set_ddram_address(DDRAM_LINE_2 + 6); + begin_data(); + write_number(percentage, 3); + write_byte('%'); + #endif +} + +void ST7920_Lite_Status_Screen::draw_status_message(const char *str) { + set_ddram_address(DDRAM_LINE_4); + begin_data(); + const uint8_t lcd_len = 16; + #if ENABLED(STATUS_MESSAGE_SCROLLING) + + uint8_t slen = utf8_strlen(str); + + // If the string fits into the LCD, just print it and do not scroll it + if (slen <= lcd_len) { + + // The string isn't scrolling and may not fill the screen + write_str(str); + + // Fill the rest with spaces + while (slen < lcd_len) { + write_byte(' '); + ++slen; + } + } + else { + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + const char *stat = str + status_scroll_offset; + + // Get the string remaining length + const uint8_t rlen = utf8_strlen(stat); + + // If we have enough characters to display + if (rlen >= lcd_len) { + // The remaining string fills the screen - Print it + write_str(stat, lcd_len); + } + else { + // The remaining string does not completely fill the screen + write_str(stat); // The string leaves space + uint8_t chars = lcd_len - rlen; // Amount of space left in characters + + write_byte('.'); // Always at 1+ spaces left, draw a dot + if (--chars) { // Draw a second dot if there's space + write_byte('.'); + if (--chars) + write_str(str, chars); // Print a second copy of the message + } + } + + // Adjust by complete UTF8 characters + if (status_scroll_offset < slen) { + status_scroll_offset++; + while (!START_OF_UTF8_CHAR(str[status_scroll_offset])) + status_scroll_offset++; + } + else + status_scroll_offset = 0; + } + #else + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(str); + + // Just print the string to the LCD + write_str(str, lcd_len); + + // Fill the rest with spaces if there are missing spaces + while (slen < lcd_len) { + write_byte(' '); + ++slen; + } + #endif +} + +void ST7920_Lite_Status_Screen::draw_position(const float x, const float y, const float z, bool position_known) { + char str[7]; + set_ddram_address(DDRAM_LINE_4); + begin_data(); + + // If position is unknown, flash the labels. + const unsigned char alt_label = position_known ? 0 : (lcd_blink() ? ' ' : 0); + + dtostrf(x, -4, 0, str); + write_byte(alt_label ? alt_label : 'X'); + write_str(str, 4); + + dtostrf(y, -4, 0, str); + write_byte(alt_label ? alt_label : 'Y'); + write_str(str, 4); + + dtostrf(z, -5, 1, str); + write_byte(alt_label ? alt_label : 'Z'); + write_str(str, 5); +} + +bool ST7920_Lite_Status_Screen::indicators_changed() { + // We only add the target temperatures to the checksum + // because the actual temps fluctuate so by updating + // them only during blinks we gain a bit of stability. + const bool blink = lcd_blink(); + const uint16_t feedrate_perc = feedrate_percentage; + const uint8_t fan_speed = ((fanSpeeds[0] + 1) * 100) / 256; + const int16_t extruder_1_target = thermalManager.degTargetHotend(0); + #if EXTRUDERS == 2 + const int16_t extruder_2_target = thermalManager.degTargetHotend(1); + #endif + #if HAS_HEATED_BED + const int16_t bed_target = thermalManager.degTargetBed(); + #endif + static uint16_t last_checksum = 0; + const uint16_t checksum = blink ^ feedrate_perc ^ fan_speed ^ extruder_1_target + #if EXTRUDERS == 2 + ^ extruder_2_target + #endif + #if HAS_HEATED_BED + ^ bed_target + #endif + ; + if (last_checksum == checksum) return false; + last_checksum = checksum; + return true; +} + +void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { + if (forceUpdate || indicators_changed()) { + const bool blink = lcd_blink(); + const duration_t elapsed = print_job_timer.duration(); + const uint16_t feedrate_perc = feedrate_percentage; + const uint8_t fan_speed = ((fanSpeeds[0] + 1) * 100) / 256; + const int16_t extruder_1_temp = thermalManager.degHotend(0), + extruder_1_target = thermalManager.degTargetHotend(0); + #if EXTRUDERS == 2 + const int16_t extruder_2_temp = thermalManager.degHotend(1), + extruder_2_target = thermalManager.degTargetHotend(1); + #endif + #if HAS_HEATED_BED + const int16_t bed_temp = thermalManager.degBed(), + bed_target = thermalManager.degTargetBed(); + #endif + + draw_extruder_1_temp(extruder_1_temp, extruder_1_target, forceUpdate); + #if EXTRUDERS == 2 + draw_extruder_2_temp(extruder_2_temp, extruder_2_target, forceUpdate); + #endif + #if HAS_HEATED_BED + draw_bed_temp(bed_temp, bed_target, forceUpdate); + #endif + draw_fan_speed(fan_speed); + draw_print_time(elapsed); + draw_feedrate_percentage(feedrate_perc); + + // Update the fan and bed animations + if (fan_speed > 0) draw_fan_icon(blink); + #if HAS_HEATED_BED + if (bed_target > 0) + draw_heat_icon(blink, true); + else + draw_heat_icon(false, false); + #endif + } +} + +bool ST7920_Lite_Status_Screen::position_changed() { + const float x_pos = current_position[X_AXIS], + y_pos = current_position[Y_AXIS], + z_pos = current_position[Z_AXIS]; + const uint8_t checksum = uint8_t(x_pos) ^ uint8_t(y_pos) ^ uint8_t(z_pos); + + static uint8_t last_checksum = 0; + if (last_checksum == checksum) return false; + last_checksum = checksum; + return true; +} + +bool ST7920_Lite_Status_Screen::status_changed() { + uint8_t checksum = 0; + for (const char *p = lcd_status_message; *p; p++) checksum ^= *p; + static uint8_t last_checksum = 0; + if (last_checksum == checksum) return false; + last_checksum = checksum; + return true; +} + +bool ST7920_Lite_Status_Screen::blink_changed() { + static uint8_t last_blink = 0; + const bool blink = lcd_blink(); + if (last_blink == blink) return false; + last_blink = blink; + return true; +} + +#ifndef STATUS_EXPIRE_SECONDS + #define STATUS_EXPIRE_SECONDS 20 +#endif + +void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { + + #if STATUS_EXPIRE_SECONDS + static uint8_t countdown = 0; + #endif + + /** + * There is only enough room in the display for either the + * status message or the position, not both, so we choose + * one or another. Whenever the status message changes, + * we show it for a number of consecutive seconds, but + * then go back to showing the position as soon as the + * head moves, i.e: + * + * countdown > 1 -- Show status + * countdown = 1 -- Show status, until movement + * countdown = 0 -- Show position + * + * If STATUS_EXPIRE_SECONDS is zero, the position display + * will be disabled and only the status will be shown. + */ + if (forceUpdate || status_changed()) { + #if ENABLED(STATUS_MESSAGE_SCROLLING) + status_scroll_offset = 0; + #endif + #if STATUS_EXPIRE_SECONDS + countdown = lcd_status_message[0] ? STATUS_EXPIRE_SECONDS : 0; + #endif + draw_status_message(lcd_status_message); + blink_changed(); // Clear changed flag + } + #if !STATUS_EXPIRE_SECONDS + #if ENABLED(STATUS_MESSAGE_SCROLLING) + else + draw_status_message(lcd_status_message); + #endif + #else + else if (countdown > 1 && blink_changed()) { + countdown--; + #if ENABLED(STATUS_MESSAGE_SCROLLING) + draw_status_message(lcd_status_message); + #endif + } + else if (countdown > 0 && blink_changed()) { + if (position_changed()) { + countdown--; + forceUpdate = true; + } + #if ENABLED(STATUS_MESSAGE_SCROLLING) + draw_status_message(lcd_status_message); + #endif + } + if (countdown == 0 && (forceUpdate || position_changed() || + #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) + blink_changed() + #endif + )) { + draw_position( + current_position[X_AXIS], + current_position[Y_AXIS], + current_position[Z_AXIS], + #if ENABLED(DISABLE_REDUCED_ACCURACY_WARNING) + true + #else + all_axes_known() + #endif + ); + } + #endif +} + +void ST7920_Lite_Status_Screen::update_progress(const bool forceUpdate) { + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) || ENABLED(SDSUPPORT) + + #if DISABLED(LCD_SET_PROGRESS_MANUALLY) + uint8_t progress_bar_percent; //=0 + #endif + + #if ENABLED(SDSUPPORT) + // Progress bar % comes from SD when actively printing + if (IS_SD_PRINTING) progress_bar_percent = card.percentDone(); + #endif + + // Since the progress bar involves writing + // quite a few bytes to GDRAM, only do this + // when an update is actually necessary. + + static uint8_t last_progress = 0; + if (!forceUpdate && last_progress == progress_bar_percent) return; + last_progress = progress_bar_percent; + + draw_progress_bar(progress_bar_percent); + + #else + + UNUSED(forceUpdate); + + #endif // LCD_SET_PROGRESS_MANUALLY || SDSUPPORT +} + +void ST7920_Lite_Status_Screen::update(const bool forceUpdate) { + cs(); + update_indicators(forceUpdate); + update_status_or_position(forceUpdate); + update_progress(forceUpdate); + ncs(); +} + +void ST7920_Lite_Status_Screen::reset_state_from_unknown() { + _extended_function_set(true, true); // Do it twice as only one bit + _extended_function_set(true, true); // get set at a time. + _scroll_or_addr_select(false); +} + +void ST7920_Lite_Status_Screen::on_entry() { + cs(); + reset_state_from_unknown(); + clear(); + clear_gdram(); + draw_static_elements(); + update(true); + ncs(); +} + +void ST7920_Lite_Status_Screen::on_exit() { + cs(); + clear(); + _extended_function_set(true, true); // Restore state to what u8g expects. + ncs(); +} + +// This is called prior to the KILL screen to +// clear the screen so we don't end up with a +// garbled display. +void ST7920_Lite_Status_Screen::clear_text_buffer() { + cs(); + reset_state_from_unknown(); + clear(); + _extended_function_set(true, true); // Restore state to what u8g expects. + ncs(); +} + +static void lcd_implementation_status_screen() { + ST7920_Lite_Status_Screen::update(false); +} + +/** + * In order to properly update the lite Status Screen, + * we must know when we have entered and left the + * Status Screen. Since the ultralcd code is not + * set up for doing this, we call this function before + * each update indicating whether the current screen + * is the Status Screen. + * + * This function keeps track of whether we have left or + * entered the Status Screen and calls the on_entry() + * and on_exit() methods for cleanup. + */ +static void lcd_in_status(const bool inStatus) { + static bool lastInStatus = false; + if (lastInStatus == inStatus) return; + if ((lastInStatus = inStatus)) + ST7920_Lite_Status_Screen::on_entry(); + else + ST7920_Lite_Status_Screen::on_exit(); +} diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920_class.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920_class.h new file mode 100644 index 0000000000..4a96ed9128 --- /dev/null +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920_class.h @@ -0,0 +1,111 @@ +/** + * Lightweight Status Screen for the RepRapDiscount Full + * Graphics Smart Controller (ST7920-based 128x64 LCD) + * + * (c) 2017 Aleph Objects, Inc. + * + * The code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * + */ + +#ifndef STATUS_SCREEN_LITE_ST7920_CLASS_H +#define STATUS_SCREEN_LITE_ST7920_CLASS_H + +#include "../../core/macros.h" +#include "../../libs/duration_t.h" + +typedef const __FlashStringHelper *progmem_str; + +class ST7920_Lite_Status_Screen { + private: + static struct st7920_state_t { + uint8_t synced : 1; // Whether a sync has been sent + uint8_t cmd : 1; // Whether the sync was cmd or data + uint8_t extended : 1; + uint8_t graphics : 1; + uint8_t sa : 1; + } current_bits; + + static void cs(); + static void ncs(); + static void sync_cmd(); + static void sync_dat(); + static void write_byte(const uint8_t w); + + FORCE_INLINE static void write_word(const uint16_t w) { + write_byte((w >> 8) & 0xFF); + write_byte((w >> 0) & 0xFF); + } + + static void cmd(const uint8_t cmd); + static void begin_data(); + + static void write_str(const char *str); + static void write_str(const char *str, const uint8_t len); + static void write_str_P(const char * const str); + static void write_str(progmem_str str); + static void write_number(const int16_t value, const uint8_t digits=3); + + static void _extended_function_set(const bool extended, const bool graphics); + static void _scroll_or_addr_select(const bool sa); + static void reset_state_from_unknown(); + + static void home(); + static void display_status(const bool display_on, const bool cursor_on, const bool blink_on); + static void extended_function_set(const bool extended); + static void graphics(const bool graphics); + static void entry_mode_select(const bool ac_increase, const bool shift); + static void scroll_or_addr_select(const bool sa); + static void set_ddram_address(const uint8_t addr); + static void set_cgram_address(const uint8_t addr); + static void set_gdram_address(const uint8_t x, const uint8_t y); + + static void clear(); + static void clear_ddram(); + static void clear_gdram(); + + static void load_cgram_icon(const uint16_t addr, const void *data); + static void draw_gdram_icon(uint8_t x, uint8_t y, const void *data); + + static uint8_t string_checksum(const char *str); + + protected: + static void draw_degree_symbol(uint8_t x, uint8_t y, bool draw); + static void draw_static_elements(); + static void draw_progress_bar(const uint8_t value); + static void draw_fan_icon(const bool whichIcon); + static void draw_heat_icon(const bool whichIcon, const bool heating); + static void draw_temps(uint8_t line, const int16_t temp, const int16_t target, bool showTarget, bool targetStateChange); + static void draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); + static void draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); + static void draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); + static void draw_fan_speed(const uint8_t value); + static void draw_print_time(const duration_t &elapsed); + static void draw_feedrate_percentage(const uint16_t percentage); + static void draw_status_message(const char *str); + static void draw_position(const float x, const float y, const float z, bool position_known = true); + + static bool indicators_changed(); + static bool position_changed(); + static bool blink_changed(); + static bool status_changed(); + + static void update_indicators(const bool forceUpdate); + static void update_position(const bool forceUpdate, bool resetChecksum); + static void update_status_or_position(bool forceUpdate); + static void update_progress(const bool forceUpdate); + + public: + static void update(const bool forceUpdate); + static void on_entry(); + static void on_exit(); + static void clear_text_buffer(); +}; + +#endif // STATUS_SCREEN_LITE_ST7920_CLASS_H diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920_spi.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920_spi.h new file mode 100644 index 0000000000..9c59068f46 --- /dev/null +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920_spi.h @@ -0,0 +1,39 @@ +/** + * Lightweight Status Screen for the RepRapDiscount Full + * Graphics Smart Controller (ST7920-based 128x64 LCD) + * + * (c) 2017 Aleph Objects, Inc. + * + * The code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + * + */ + +#include "status_screen_lite_ST7920_class.h" + +void ST7920_Lite_Status_Screen::cs() { + ST7920_CS(); + current_bits.synced = false; +} + +void ST7920_Lite_Status_Screen::ncs() { + ST7920_NCS(); + current_bits.synced = false; +} + +void ST7920_Lite_Status_Screen::sync_cmd() { + ST7920_SET_CMD(); +} + +void ST7920_Lite_Status_Screen::sync_dat() { + ST7920_SET_DAT(); +} + +void ST7920_Lite_Status_Screen::write_byte(const uint8_t data) { + ST7920_WRITE_BYTE(data); +} diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp index f97a323350..3249068299 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -67,8 +67,9 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_U8GLIB +#if ENABLED(DOGLCD) +#include #include "HAL_LCD_com_defines.h" #define WIDTH 128 @@ -86,52 +87,32 @@ static const uint8_t u8g_dev_sh1106_128x64_data_start_2_wire[] PROGMEM = { U8G_ESC_END // end of sequence }; -#define SH1106_PAGE_ADR(N) (0x20), (N) -#define SH1106_COLUMN_RANGE(N) (0x21), (((N) >> 8) & 0xFF), ((N) & 0xFF) -#define SH1106_PAGE_RANGE(N,O) (0x22), (N), (O) -#define SH1106_SCROLL(N) ((N) ? 0x2F : 0x2E) -#define SH1106_START_LINE(N) (0x40 | (N)) -#define SH1106_CONTRAST(N) (0x81), (N) -#define SH1106_CHARGE_PUMP(N) (0x8D), ((N) ? 0x14 : 0x10) -#define SH1106_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) -#define SH1106_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) -#define SH1106_INVERTED(N) ((N) ? 0xA7 : 0xA6) -#define SH1106_MUX_RATIO(N) (0xA8), (N) -#define SH1106_ON(N) ((N) ? 0xAF : 0xAE) -#define SH1106_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) -#define SH1106_DISP_OFFS(N) (0xD3), (N) -#define SH1106_OSC_FREQ(R,F) (0xD5), ((F) << 4 | (R)) -#define SH1106_CHARGE_PER(P,D) (0xD9), ((D) << 4 | (P)) -#define SH1106_COM_CONFIG(N) (0xDA), ((N) ? 0x12 : 0x02) -#define SH1106_VCOM_DESEL(N) (0xDB), (N) -#define SH1106_NOOP() (0xE3) - static const uint8_t u8g_dev_sh1106_128x64_init_seq_2_wire[] PROGMEM = { - U8G_ESC_ADR(0), // Initiate command mode - SH1106_ON(0), // Display off, sleep mode - SH1106_MUX_RATIO(0x3F), // Mux ratio - SH1106_DISP_OFFS(0), // Display offset - SH1106_START_LINE(0), // Start line - SH1106_ADC_REVERSE(1), // Segment remap A0/A1 - SH1106_OUT_MODE(1), // C0: scan dir normal, C8: reverse - SH1106_COM_CONFIG(1), // Com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) - SH1106_CONTRAST(0xCF), // [2] set contrast control - SH1106_PAGE_ADR(0x02), // 2012-05-27: page addressing mode - SH1106_COLUMN_RANGE(0x281), // Set column range from 0 through 131 - SH1106_PAGE_RANGE(0, 7), // Set page range from 0 through 7 - SH1106_CHARGE_PER(0x1, 0xF), // [2] pre-charge period 0x22/F1 - SH1106_VCOM_DESEL(0x40), // Vcomh deselect level - SH1106_ALL_PIX(0), // Output ram to display - SH1106_INVERTED(0), // Normal display mode - SH1106_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) - SH1106_CHARGE_PUMP(1), // [2] charge pump setting (P62): 0x14 enable, 0x10 disable - SH1106_SCROLL(0), // 2012-05-27: Deactivate scroll - SH1106_ON(1), // Display on - U8G_ESC_END // End of sequence + U8G_ESC_ADR(0), // initiate command mode + 0x0AE, // display off, sleep mode + 0x0A8, 0x03F, // mux ratio + 0x0D3, 0x00, // display offset + 0x040, // start line + 0x0A1, // segment remap a0/a1 + 0x0C8, // c0: scan dir normal, c8: reverse + 0x0DA, 0x012, // com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) + 0x081, 0x0CF, // [2] set contrast control + 0x020, 0x002, // 2012-05-27: page addressing mode + 0x21, 2, 0x81, // set column range from 0 through 131 + 0x22, 0, 7, // set page range from 0 through 7 + 0x0D9, 0x0F1, // [2] pre-charge period 0x022/f1 + 0x0DB, 0x040, // vcomh deselect level + 0x0A4, // output ram to display + 0x0A6, // none inverted normal display mode + 0x0D5, 0x080, // clock divide ratio (0x00=1) and oscillator frequency (0x8) + 0x08D, 0x014, // [2] charge pump setting (p62): 0x014 enable, 0x010 disable + 0x02E, // 2012-05-27: Deactivate scroll + 0x0AF, // display on + U8G_ESC_END // end of sequence }; uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { - switch (msg) { + switch(msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_init_seq_2_wire); @@ -199,7 +180,7 @@ static const uint8_t u8g_dev_ssd1306_128x64_init_seq_2_wire[] PROGMEM = { }; uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { - switch (msg) { + switch(msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_init_seq_2_wire); @@ -246,7 +227,7 @@ u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire = { u8g_dev_ssd1306_128x64_2x_2_w uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq) { uint8_t is_escape = 0; uint8_t value; - for (;;) { + for(;;) { value = u8g_pgm_read(esc_seq); if (is_escape == 0) { if (value != 255) { @@ -300,4 +281,4 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s return 1; } -#endif // HAS_MARLINUI_U8GLIB +#endif // DOGLCD diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp index 84c10dbb4d..515ac32f6c 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ /** - * Based on u8g_dev_st7565_64128n_HAL.c (Displaytech) + * u8g_dev_st7565_64128n_HAL.c (Displaytech) * * Universal 8bit Graphics Library * @@ -55,30 +55,30 @@ #include "../../inc/MarlinConfig.h" -#if HAS_MARLINUI_U8GLIB +#if ENABLED(DOGLCD) #include + #include "HAL_LCD_com_defines.h" #define WIDTH 128 #define HEIGHT 64 #define PAGE_HEIGHT 8 -#define ST7565_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) -#define ST7565_BIAS_MODE(N) ((N) ? 0xA3 : 0xA2) -#define ST7565_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) -#define ST7565_INVERTED(N) ((N) ? 0xA7 : 0xA6) -#define ST7565_ON(N) ((N) ? 0xAF : 0xAE) -#define ST7565_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) +#define ST7565_ADC_REVERSE(N) (0xA0 | ((N) & 0x1)) +#define ST7565_BIAS_MODE(N) (0xA2 | ((N) & 0x1)) +#define ST7565_ALL_PIX(N) (0xA4 | ((N) & 0x1)) +#define ST7565_INVERTED(N) (0xA6 | ((N) & 0x1)) +#define ST7565_ON(N) (0xAE | ((N) & 0x1)) +#define ST7565_OUT_MODE(N) (0xC0 | ((N) & 0x1) << 3) #define ST7565_POWER_CONTROL(N) (0x28 | (N)) -#define ST7565_V0_RATIO(N) (0x10 | ((N) & 0x7)) -#define ST7565_V5_RATIO(N) (0x20 | ((N) & 0x7)) +#define ST7565_V0_RATIO(N) (0x10 | ((N) & 0x7)) // Specific to Displaytech 64128N? (ST7565 is 0x20 | N) #define ST7565_CONTRAST(N) (0x81), (N) #define ST7565_COLUMN_ADR(N) (0x10 | (((N) >> 4) & 0xF)), ((N) & 0xF) #define ST7565_PAGE_ADR(N) (0xB0 | (N)) #define ST7565_START_LINE(N) (0x40 | (N)) -#define ST7565_SLEEP_MODE() (0xAC) // ,(N) needed? +#define ST7565_SLEEP_MODE() (0xAC) #define ST7565_NOOP() (0xE3) /* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ @@ -91,7 +91,7 @@ static const uint8_t u8g_dev_st7565_64128n_HAL_init_seq[] PROGMEM = { ST7565_BIAS_MODE(0), // 0xA2: LCD bias 1/9 (according to Displaytech 64128N datasheet) ST7565_ADC_REVERSE(0), // Normal ADC Select (according to Displaytech 64128N datasheet) - ST7565_OUT_MODE(1), // common output mode: set scan direction + ST7565_OUT_MODE(1), // common output mode: set scan direction normal operation/SHL Select, 0xC0 --> SHL = 0, normal, 0xC8 --> SHL = 1 ST7565_START_LINE(0), // Display start line for Displaytech 64128N ST7565_POWER_CONTROL(0x4), // power control: turn on voltage converter @@ -149,7 +149,7 @@ static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_off[] PROGMEM = { }; uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t msg, void *arg) { - switch (msg) { + switch(msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_init_seq); @@ -183,7 +183,7 @@ uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t m } uint8_t u8g_dev_st7565_64128n_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t msg, void *arg) { - switch (msg) { + switch(msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_init_seq); @@ -233,4 +233,4 @@ u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_sw_spi = { u8g_dev_st7565_64128n_HAL_2x_f U8G_PB_DEV(u8g_dev_st7565_64128n_HAL_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_HAL_fn, U8G_COM_HAL_HW_SPI_FN); u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi = { u8g_dev_st7565_64128n_HAL_2x_fn, &u8g_dev_st7565_64128n_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN }; -#endif // HAS_MARLINUI_U8GLIB +#endif // DOGLCD diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp index 740436d93c..86a9fd110b 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ /** - * Based on u8g_dev_st7920_128x64.c + * u8g_dev_st7920_128x64_HAL.c * * Universal 8bit Graphics Library * @@ -55,11 +55,15 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_U8GLIB +#if ENABLED(DOGLCD) + +#include #include "HAL_LCD_com_defines.h" -#define PAGE_HEIGHT 8 +#define WIDTH 128 +#define HEIGHT 64 +#define PAGE_HEIGHT 8 /* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = { @@ -72,7 +76,7 @@ static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = { 0x038, // 8 Bit interface (DL=1), basic instruction set (RE=0) 0x00C, // display on, cursor & blink off; 0x08: all off - 0x006, // Entry mode: Cursor move to right, DDRAM address counter (AC) plus 1, no shift + 0x006, // Entry mode: Cursor move to right ,DDRAM address counter (AC) plus 1, no shift 0x002, // disable scroll, enable CGRAM adress 0x001, // clear RAM, needs 1.6 ms U8G_ESC_DLY(100), // delay 100 ms @@ -81,17 +85,17 @@ static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = { U8G_ESC_END // end of sequence }; -void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev) { +void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev){ u8g_SetChipSelect(u8g, dev, 1); u8g_Delay(1); u8g_SetAddress(u8g, dev, 0); // cmd mode u8g_WriteByte(u8g, dev, 0x08); //display off, cursor+blink off u8g_WriteByte(u8g, dev, 0x3E); //extended mode + GDRAM active - LOOP_L_N(y, (LCD_PIXEL_HEIGHT) / 2) { //clear GDRAM + for (uint8_t y = 0; y < (HEIGHT) / 2; y++) { //clear GDRAM u8g_WriteByte(u8g, dev, 0x80 | y); //set y u8g_WriteByte(u8g, dev, 0x80); //set x = 0 u8g_SetAddress(u8g, dev, 1); /* data mode */ - LOOP_L_N(i, 2 * (LCD_PIXEL_WIDTH) / 8) //2x width clears both segments + for (uint8_t i = 0; i < 2 * (WIDTH) / 8; i++) //2x width clears both segments u8g_WriteByte(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); /* cmd mode */ } @@ -102,7 +106,7 @@ void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev) { } uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { - switch (msg) { + switch(msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_HAL_init_seq); @@ -133,8 +137,8 @@ uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo } u8g_SetAddress(u8g, dev, 1); /* data mode */ - u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); - ptr += (LCD_PIXEL_WIDTH) / 8; + u8g_WriteSequence(u8g, dev, WIDTH/8, ptr); + ptr += WIDTH/8; y++; } u8g_SetChipSelect(u8g, dev, 0); @@ -145,7 +149,7 @@ uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo } uint8_t u8g_dev_st7920_128x64_HAL_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { - switch (msg) { + switch(msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_HAL_init_seq); @@ -178,8 +182,8 @@ uint8_t u8g_dev_st7920_128x64_HAL_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, } u8g_SetAddress(u8g, dev, 1); /* data mode */ - u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); - ptr += (LCD_PIXEL_WIDTH) / 8; + u8g_WriteSequence(u8g, dev, WIDTH/8, ptr); + ptr += WIDTH/8; y++; } u8g_SetChipSelect(u8g, dev, 0); @@ -189,20 +193,20 @@ uint8_t u8g_dev_st7920_128x64_HAL_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg); } -U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_sw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_SW_SPI); +U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_SW_SPI); -#define QWIDTH ((LCD_PIXEL_WIDTH) * 4) +#define QWIDTH (WIDTH*4) uint8_t u8g_dev_st7920_128x64_HAL_4x_buf[QWIDTH] U8G_NOCOMMON ; -u8g_pb_t u8g_dev_st7920_128x64_HAL_4x_pb = { { 32, LCD_PIXEL_HEIGHT, 0, 0, 0 }, LCD_PIXEL_WIDTH, u8g_dev_st7920_128x64_HAL_4x_buf}; +u8g_pb_t u8g_dev_st7920_128x64_HAL_4x_pb = { {32, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_st7920_128x64_HAL_4x_buf}; u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; -U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_HW_SPI); +U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_HW_SPI); u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_HW_SPI }; -#if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) || defined(U8G_HAL_LINKS) +#if defined(U8G_HAL_LINKS) || defined(__SAM3X8E__) // Also use this device for HAL version of rrd class. This results in the same device being used // for the ST7920 for HAL systems no matter what is selected in ultralcd_impl_DOGM.h. u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; #endif -#endif // HAS_MARLINUI_U8GLIB +#endif // DOGLCD diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp deleted file mode 100644 index d18b617987..0000000000 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ /dev/null @@ -1,480 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * u8g_dev_tft_320x240_upscale_from_128x64.cpp - * - * Universal 8bit Graphics Library - * - * Copyright (c) 2011, olikraus@gmail.com - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT)) - -#include "HAL_LCD_com_defines.h" -#include "ultralcd_DOGM.h" - -#include - -#if EITHER(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) - #define HAS_LCD_IO 1 -#endif - -#include "../tft_io/tft_io.h" -TFT_IO tftio; - -#define WIDTH LCD_PIXEL_WIDTH -#define HEIGHT LCD_PIXEL_HEIGHT -#define PAGE_HEIGHT 8 - -#include "../scaled_tft.h" - -#define UPSCALE0(M) ((M) * (GRAPHICAL_TFT_UPSCALE)) -#define UPSCALE(A,M) (UPSCALE0(M) + (A)) -#define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1) -#define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1) - -// see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html - -#define COLOR_BLACK 0x0000 // #000000 -#define COLOR_WHITE 0xFFFF // #FFFFFF -#define COLOR_SILVER 0xC618 // #C0C0C0 -#define COLOR_GREY 0x7BEF // #808080 -#define COLOR_DARKGREY 0x4208 // #404040 -#define COLOR_DARKGREY2 0x39E7 // #303030 -#define COLOR_DARK 0x0003 // Some dark color - -#define COLOR_RED 0xF800 // #FF0000 -#define COLOR_LIME 0x7E00 // #00FF00 -#define COLOR_BLUE 0x001F // #0000FF -#define COLOR_YELLOW 0xFFE0 // #FFFF00 -#define COLOR_MAGENTA 0xF81F // #FF00FF -#define COLOR_FUCHSIA 0xF81F // #FF00FF -#define COLOR_CYAN 0x07FF // #00FFFF -#define COLOR_AQUA 0x07FF // #00FFFF - -#define COLOR_MAROON 0x7800 // #800000 -#define COLOR_GREEN 0x03E0 // #008000 -#define COLOR_NAVY 0x000F // #000080 -#define COLOR_OLIVE 0x8400 // #808000 -#define COLOR_PURPLE 0x8010 // #800080 -#define COLOR_TEAL 0x0410 // #008080 - -#define COLOR_ORANGE 0xFC00 // #FF7F00 - -#ifndef TFT_MARLINUI_COLOR - #define TFT_MARLINUI_COLOR COLOR_WHITE -#endif -#ifndef TFT_MARLINBG_COLOR - #define TFT_MARLINBG_COLOR COLOR_BLACK -#endif -#ifndef TFT_DISABLED_COLOR - #define TFT_DISABLED_COLOR COLOR_DARK -#endif -#ifndef TFT_BTCANCEL_COLOR - #define TFT_BTCANCEL_COLOR COLOR_RED -#endif -#ifndef TFT_BTARROWS_COLOR - #define TFT_BTARROWS_COLOR COLOR_BLUE -#endif -#ifndef TFT_BTOKMENU_COLOR - #define TFT_BTOKMENU_COLOR COLOR_RED -#endif - -static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - tftio.set_window(Xmin, Ymin, Xmax, Ymax); -} - -#if HAS_TOUCH_XPT2046 - - static const uint8_t buttonD[] = { - B01111111,B11111111,B11111111,B11111110, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00011000,B00110000,B00000001, - B10000000,B00001100,B01100000,B00000001, - B10000000,B00000110,B11000000,B00000001, - B10000000,B00000011,B10000000,B00000001, - B10000000,B00000011,B10000000,B00000001, - B10000000,B00000110,B11000000,B00000001, - B10000000,B00001100,B01100000,B00000001, - B10000000,B00011000,B00110000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B01111111,B11111111,B11111111,B11111110, - }; - - #if ENABLED(REVERSE_MENU_DIRECTION) - - static const uint8_t buttonA[] = { - B01111111,B11111111,B11111111,B11111110, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B11100000,B00000000,B00000001, - B10000000,B11100000,B00000000,B00000001, - B10000000,B11100000,B00000000,B00000001, - B10000000,B11100000,B00000000,B00000001, - B10000000,B11100000,B00111111,B11100001, - B10000111,B11111100,B00111111,B11100001, - B10000011,B11111000,B00000000,B00000001, - B10000001,B11110000,B00000000,B00000001, - B10000000,B11100000,B00000000,B00000001, - B10000000,B01000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B01111111,B11111111,B11111111,B11111110, - }; - static const uint8_t buttonB[] = { - B01111111,B11111111,B11111111,B11111110, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B01100000,B00000010,B00000001, - B10000000,B01100000,B00000111,B00000001, - B10000000,B01100000,B00001111,B10000001, - B10000000,B01100000,B00011111,B11000001, - B10000111,B11111110,B00111111,B11100001, - B10000111,B11111110,B00000111,B00000001, - B10000000,B01100000,B00000111,B00000001, - B10000000,B01100000,B00000111,B00000001, - B10000000,B01100000,B00000111,B00000001, - B10000000,B01100000,B00000111,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B01111111,B11111111,B11111111,B11111110, - }; - - #else - - static const uint8_t buttonA[] = { - B01111111,B11111111,B11111111,B11111110, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B01000000,B00000000,B00000001, - B10000000,B11100000,B00000000,B00000001, - B10000001,B11110000,B00000000,B00000001, - B10000011,B11111000,B00000000,B00000001, - B10000111,B11111100,B00111111,B11100001, - B10000000,B11100000,B00111111,B11100001, - B10000000,B11100000,B00000000,B00000001, - B10000000,B11100000,B00000000,B00000001, - B10000000,B11100000,B00000000,B00000001, - B10000000,B11100000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B01111111,B11111111,B11111111,B11111110, - }; - - static const uint8_t buttonB[] = { - B01111111,B11111111,B11111111,B11111110, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B01100000,B00000111,B00000001, - B10000000,B01100000,B00000111,B00000001, - B10000000,B01100000,B00000111,B00000001, - B10000000,B01100000,B00000111,B00000001, - B10000111,B11111110,B00000111,B00000001, - B10000111,B11111110,B00111111,B11100001, - B10000000,B01100000,B00011111,B11000001, - B10000000,B01100000,B00001111,B10000001, - B10000000,B01100000,B00000111,B00000001, - B10000000,B01100000,B00000010,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B01111111,B11111111,B11111111,B11111110, - }; - - #endif - - static const uint8_t buttonC[] = { - B01111111,B11111111,B11111111,B11111110, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00011100,B00000001, - B10000000,B00000100,B00011100,B00000001, - B10000000,B00001100,B00011100,B00000001, - B10000000,B00011111,B11111100,B00000001, - B10000000,B00111111,B11111100,B00000001, - B10000000,B00011111,B11111100,B00000001, - B10000000,B00001100,B00000000,B00000001, - B10000000,B00000100,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B10000000,B00000000,B00000000,B00000001, - B01111111,B11111111,B11111111,B11111110, - }; - - #define BUTTON_SIZE_X 32 - #define BUTTON_SIZE_Y 20 - - // 14, 90, 166, 242, 185 are the original values upscaled 2x. - #define BUTTOND_X_LO UPSCALE0(14 / 2) - #define BUTTOND_X_HI (UPSCALE(BUTTOND_X_LO, BUTTON_SIZE_X) - 1) - - #define BUTTONA_X_LO UPSCALE0(90 / 2) - #define BUTTONA_X_HI (UPSCALE(BUTTONA_X_LO, BUTTON_SIZE_X) - 1) - - #define BUTTONB_X_LO UPSCALE0(166 / 2) - #define BUTTONB_X_HI (UPSCALE(BUTTONB_X_LO, BUTTON_SIZE_X) - 1) - - #define BUTTONC_X_LO UPSCALE0(242 / 2) - #define BUTTONC_X_HI (UPSCALE(BUTTONC_X_LO, BUTTON_SIZE_X) - 1) - - #define BUTTON_Y_LO UPSCALE0(140 / 2) + 44 // 184 2x, 254 3x - #define BUTTON_Y_HI (UPSCALE(BUTTON_Y_LO, BUTTON_SIZE_Y) - 1) - - void drawImage(const uint8_t *data, u8g_t *u8g, u8g_dev_t *dev, uint16_t length, uint16_t height, uint16_t color) { - uint16_t buffer[BUTTON_SIZE_X * sq(GRAPHICAL_TFT_UPSCALE)]; - - if (length > BUTTON_SIZE_X) return; - - for (uint16_t i = 0; i < height; i++) { - uint16_t k = 0; - for (uint16_t j = 0; j < length; j++) { - uint16_t v = TFT_MARLINBG_COLOR; - if (*(data + (i * (length >> 3) + (j >> 3))) & (0x80 >> (j & 7))) - v = color; - else - v = TFT_MARLINBG_COLOR; - LOOP_L_N(n, GRAPHICAL_TFT_UPSCALE) buffer[k++] = v; - } - #if HAS_LCD_IO - LOOP_S_L_N(n, 1, GRAPHICAL_TFT_UPSCALE) - for (uint16_t l = 0; l < UPSCALE0(length); l++) - buffer[l + n * UPSCALE0(length)] = buffer[l]; - - tftio.WriteSequence(buffer, length * sq(GRAPHICAL_TFT_UPSCALE)); - #else - for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) - u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); - #endif - } - } - -#endif // HAS_TOUCH_XPT2046 - -// Used to fill RGB565 (16bits) background -inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { - uint16_t* wptr = (uint16_t*)ptr; - for (size_t i = 0; i < cnt; i += 2) { *wptr = fill; wptr++; } -} - -static bool preinit = true; -static uint8_t page; - -uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { - u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - - #if HAS_LCD_IO - static uint16_t bufferA[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)], bufferB[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)]; - uint16_t* buffer = &bufferA[0]; - #else - uint16_t buffer[WIDTH * GRAPHICAL_TFT_UPSCALE]; // 16-bit RGB 565 pixel line buffer - #endif - - switch (msg) { - case U8G_DEV_MSG_INIT: - dev->com_fn(u8g, U8G_COM_MSG_INIT, U8G_SPI_CLK_CYCLE_NONE, NULL); - tftio.Init(); - tftio.InitTFT(); - - if (preinit) { - preinit = false; - return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); - } - - // Clear Screen - setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); - #if HAS_LCD_IO - tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT)); - #else - memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2); - for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++) - u8g_WriteSequence(u8g, dev, (TFT_WIDTH) / 2, (uint8_t *)buffer); - #endif - - // Bottom buttons - #if HAS_TOUCH_XPT2046 - setWindow(u8g, dev, BUTTOND_X_LO, BUTTON_Y_LO, BUTTOND_X_HI, BUTTON_Y_HI); - drawImage(buttonD, u8g, dev, 32, 20, TFT_BTCANCEL_COLOR); - - setWindow(u8g, dev, BUTTONA_X_LO, BUTTON_Y_LO, BUTTONA_X_HI, BUTTON_Y_HI); - drawImage(buttonA, u8g, dev, 32, 20, TFT_BTARROWS_COLOR); - - setWindow(u8g, dev, BUTTONB_X_LO, BUTTON_Y_LO, BUTTONB_X_HI, BUTTON_Y_HI); - drawImage(buttonB, u8g, dev, 32, 20, TFT_BTARROWS_COLOR); - - setWindow(u8g, dev, BUTTONC_X_LO, BUTTON_Y_LO, BUTTONC_X_HI, BUTTON_Y_HI); - drawImage(buttonC, u8g, dev, 32, 20, TFT_BTOKMENU_COLOR); - #endif // HAS_TOUCH_XPT2046 - - return 0; - - case U8G_DEV_MSG_STOP: preinit = true; break; - - case U8G_DEV_MSG_PAGE_FIRST: - page = 0; - setWindow(u8g, dev, TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI); - break; - - case U8G_DEV_MSG_PAGE_NEXT: - if (++page > (HEIGHT / PAGE_HEIGHT)) return 1; - - LOOP_L_N(y, PAGE_HEIGHT) { - uint32_t k = 0; - #if HAS_LCD_IO - buffer = (y & 1) ? bufferB : bufferA; - #endif - for (uint16_t i = 0; i < (uint32_t)pb->width; i++) { - const uint8_t b = *(((uint8_t *)pb->buf) + i); - const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR; - LOOP_L_N(n, GRAPHICAL_TFT_UPSCALE) buffer[k++] = c; - } - #if HAS_LCD_IO - LOOP_S_L_N(n, 1, GRAPHICAL_TFT_UPSCALE) - for (uint16_t l = 0; l < UPSCALE0(WIDTH); l++) - buffer[l + n * UPSCALE0(WIDTH)] = buffer[l]; - - tftio.WriteSequence(buffer, COUNT(bufferA)); - #else - uint8_t* bufptr = (uint8_t*) buffer; - for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) { - LOOP_S_L_N(n, 0, GRAPHICAL_TFT_UPSCALE * 2) { - u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH * n]); - } - } - #endif - } - break; - - case U8G_DEV_MSG_SLEEP_ON: - // Enter Sleep Mode (10h) - return 1; - case U8G_DEV_MSG_SLEEP_OFF: - // Sleep Out (11h) - return 1; - } - return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); -} - -static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT - -uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - if (msgInitCount) { - if (msg == U8G_COM_MSG_INIT) msgInitCount--; - if (msgInitCount) return -1; - } - - static uint8_t isCommand; - - switch (msg) { - case U8G_COM_MSG_STOP: break; - case U8G_COM_MSG_INIT: - u8g_SetPIOutput(u8g, U8G_PI_RESET); - u8g_Delay(50); - isCommand = 0; - break; - - case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) - isCommand = arg_val == 0 ? 1 : 0; - break; - - case U8G_COM_MSG_RESET: - u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); - break; - - case U8G_COM_MSG_WRITE_BYTE: - tftio.DataTransferBegin(DATASIZE_8BIT); - if (isCommand) - tftio.WriteReg(arg_val); - else - tftio.WriteData((uint16_t)arg_val); - tftio.DataTransferEnd(); - break; - - case U8G_COM_MSG_WRITE_SEQ: - tftio.DataTransferBegin(DATASIZE_16BIT); - for (uint8_t i = 0; i < arg_val; i += 2) - tftio.WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); - tftio.DataTransferEnd(); - break; - - } - return 1; -} - -U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_TFT_FN); - -#endif // HAS_MARLINUI_U8GLIB && FSMC_CS diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp index 172afbd766..e58bb34fae 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017, 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,46 +16,52 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -/** - * Based on u8g_dev_uc1701_mini12864.c (dealextreme) - * - * Universal 8bit Graphics Library - * - * Copyright (c) 2011, olikraus@gmail.com - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list - * of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ + +/* + + based on u8g_dev_uc1701_mini12864_HAL.c (dealextreme) + + Universal 8bit Graphics Library + + Copyright (c) 2011, olikraus@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ #include "../../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_U8GLIB +#if ENABLED(DOGLCD) + +#include #include "HAL_LCD_com_defines.h" @@ -63,100 +69,64 @@ #define HEIGHT 64 #define PAGE_HEIGHT 8 -#define UC1701_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) -#define UC1701_BIAS_MODE(N) ((N) ? 0xA3 : 0xA2) -#define UC1701_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) -#define UC1701_INVERTED(N) ((N) ? 0xA7 : 0xA6) -#define UC1701_ON(N) ((N) ? 0xAF : 0xAE) -#define UC1701_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) -#define UC1701_POWER_CONTROL(N) (0x28 | (N)) -#define UC1701_V5_RATIO(N) (0x20 | ((N) & 0x7)) -#define UC1701_CONTRAST(N) (0x81), (N) - -#define UC1701_COLUMN_HI(N) (0x10 | (((N) >> 4) & 0xF)) -#define UC1701_COLUMN_ADR(N) UC1701_COLUMN_HI(N), ((N) & 0xF) -#define UC1701_PAGE_ADR(N) (0xB0 | (N)) -#define UC1701_START_LINE(N) (0x40 | (N)) -#define UC1701_INDICATOR(N) (0xAC), (N) -#define UC1701_RESET() (0xE2) -#define UC1701_NOOP() (0xE3) -#define UC1701_BOOST_RATIO(N) (0xF8), (N) - static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_RST(1), // do reset low pulse with (1*16)+2 milliseconds - U8G_ESC_CS(1), // enable chip + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_RST(1), /* do reset low pulse with (1*16)+2 milliseconds */ + U8G_ESC_CS(1), /* enable chip */ - UC1701_RESET(), // soft reset - UC1701_START_LINE(0), // set display start line to 0 - UC1701_ADC_REVERSE(0), // ADC set to reverse - UC1701_OUT_MODE(1), // common output mode - UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off - UC1701_BIAS_MODE(0), // LCD bias 1/9 - UC1701_POWER_CONTROL(0x7), // all power control circuits on - UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x - UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large - UC1701_CONTRAST(0x27), // set contrast - UC1701_INDICATOR(0), // indicator disable - UC1701_ON(1), // display on + 0x0E2, /* soft reset */ + 0x040, /* set display start line to 0 */ + 0x0A0, /* ADC set to reverse */ + 0x0C8, /* common output mode */ + 0x0A6, /* display normal, bit val 0: LCD pixel off. */ + 0x0A2, /* LCD bias 1/9 */ + 0x02F, /* all power control circuits on */ + 0x0F8, /* set booster ratio to */ + 0x000, /* 4x */ + 0x023, /* set V0 voltage resistor ratio to large */ + 0x081, /* set contrast */ + 0x027, /* contrast value */ + 0x0AC, /* indicator */ + 0x000, /* disable */ + 0x0AF, /* display on */ - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_CS(1), // enable chip - - UC1701_ALL_PIX(1), // display all points, ST7565 - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_CS(1), // enable chip - UC1701_ALL_PIX(0), // normal display - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(150), // delay 150 ms before sending any data - U8G_ESC_END // end of sequence + U8G_ESC_DLY(100), /* delay 100 ms */ + 0x0A5, /* display all points, ST7565 */ + U8G_ESC_DLY(100), /* delay 100 ms */ + U8G_ESC_DLY(100), /* delay 100 ms */ + 0x0A4, /* normal display */ + U8G_ESC_CS(0), /* disable chip */ + U8G_ESC_END /* end of sequence */ }; static const uint8_t u8g_dev_uc1701_mini12864_HAL_data_start[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - #if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY, FYSETC_MINI_12864) - UC1701_START_LINE(0), // set display start line to 0 - UC1701_ADC_REVERSE(0), // ADC set to reverse - UC1701_OUT_MODE(1), // common output mode - UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off - UC1701_BIAS_MODE(0), // LCD bias 1/9 - UC1701_POWER_CONTROL(0x7),// all power control circuits on - UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x - UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large - UC1701_INDICATOR(0), // indicator disable - UC1701_ON(1), // display on - UC1701_COLUMN_HI(0), // set upper 4 bit of the col adr to 0 - U8G_ESC_END, // end of sequence - U8G_ESC_DLY(5) // delay 5 ms - #else - UC1701_COLUMN_ADR(0), // address 0 - U8G_ESC_END // end of sequence - #endif + U8G_ESC_ADR(0), /* instruction mode */ + U8G_ESC_CS(1), /* enable chip */ + 0x010, /* set upper 4 bit of the col adr to 0 */ + 0x000, /* set lower 4 bit of the col adr to 4 */ + U8G_ESC_END /* end of sequence */ }; uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { - switch (msg) { + switch(msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_init_seq); break; - - case U8G_DEV_MSG_STOP: break; - - case U8G_DEV_MSG_PAGE_NEXT: { - u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ - if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; - u8g_SetChipSelect(u8g, dev, 0); - } break; - + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: + { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); /* select current page */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + if ( u8g_pb_WriteBuffer(pb, u8g, dev) == 0 ) + return 0; + u8g_SetChipSelect(u8g, dev, 0); + } + break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); u8g_SetAddress(u8g, dev, 0); /* instruction mode */ @@ -169,31 +139,33 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, } uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { - switch (msg) { + switch(msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_init_seq); break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: + { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - case U8G_DEV_MSG_STOP: break; - - case U8G_DEV_MSG_PAGE_NEXT: { - u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ - u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); - u8g_SetChipSelect(u8g, dev, 0); - u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ - u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); - u8g_SetChipSelect(u8g, dev, 0); - } break; + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | (2*pb->p.page)); /* select current page */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | (2*pb->p.page+1)); /* select current page */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } + break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ u8g_WriteByte(u8g, dev, 0x081); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); @@ -210,4 +182,4 @@ u8g_pb_t u8g_dev_uc1701_mini12864_HAL_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_SW_SPI_FN }; u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_hw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN }; -#endif // HAS_MARLINUI_U8GLIB +#endif // DOGLCD \ No newline at end of file diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.h b/Marlin/src/lcd/dogm/u8g_fontutf8.h deleted file mode 100644 index 34e365cf95..0000000000 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @file fontutf8.h - * @brief font api for u8g lib - * @author Yunhui Fu (yhfudev@gmail.com) - * @version 1.0 - * @date 2015-02-19 - * @copyright GPL/BSD - */ -#pragma once - -#include -#include "../fontutils.h" - -// the macro to indicate a UTF-8 string -// You should to save the C/C++ source in UTF-8 encoding! -// Once you change your UTF-8 strings, you need to call the script uxggenpages.sh to create the font data file fontutf8-data.h -#define _UxGT(a) a - -typedef struct _uxg_fontinfo_t { - uint16_t page; - uint8_t begin; - uint8_t end; - uint16_t size; - const u8g_fntpgm_uint8_t *fntdata; -} uxg_fontinfo_t; - -int uxg_SetUtf8Fonts(const uxg_fontinfo_t * fntinfo, int number); // fntinfo is type of PROGMEM - -unsigned int uxg_DrawWchar(u8g_t *pu8g, unsigned int x, unsigned int y, wchar_t ch, pixel_len_t max_length); - -unsigned int uxg_DrawUtf8Str(u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_length); -unsigned int uxg_DrawUtf8StrP(u8g_t *pu8g, unsigned int x, unsigned int y, PGM_P utf8_msg, pixel_len_t max_length); - -int uxg_GetUtf8StrPixelWidth(u8g_t *pu8g, const char *utf8_msg); -int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, PGM_P utf8_msg); - -#define uxg_GetFont(puxg) ((puxg)->font) diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp deleted file mode 100644 index c48abac810..0000000000 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp +++ /dev/null @@ -1,690 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * lcd/dogm/ultralcd_DOGM.h - * - * Implementation of the LCD display routines for a DOGM128 graphic display. - * by STB for ErikZalm/Marlin. Common LCD 128x64 pixel graphic displays. - * - * Demonstrator: https://www.reprap.org/wiki/STB_Electronics - * License: https://opensource.org/licenses/BSD-3-Clause - * - * With the use of: - * u8glib by Oliver Kraus - * https://github.com/olikraus/U8glib_Arduino - * License: https://opensource.org/licenses/BSD-3-Clause - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_MARLINUI_U8GLIB - -#include "ultralcd_DOGM.h" -#include "u8g_fontutf8.h" - -#if ENABLED(SHOW_BOOTSCREEN) - #include "dogm_Bootscreen.h" -#endif - -#include "../lcdprint.h" -#include "../fontutils.h" -#include "../../libs/numtostr.h" -#include "../ultralcd.h" - -#include "../../sd/cardreader.h" -#include "../../module/temperature.h" -#include "../../module/printcounter.h" - -#if ENABLED(SDSUPPORT) - #include "../../libs/duration_t.h" -#endif - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../../feature/bedlevel/bedlevel.h" -#endif - -/** - * Include all needed font files - * (See https://marlinfw.org/docs/development/fonts.html) - */ -#include "fontdata/fontdata_ISO10646_1.h" -#if ENABLED(USE_SMALL_INFOFONT) - #include "fontdata/fontdata_6x9_marlin.h" - #define FONT_STATUSMENU_NAME u8g_font_6x9 -#else - #define FONT_STATUSMENU_NAME MENU_FONT_NAME -#endif - -U8G_CLASS u8g(U8G_PARAM); - -#include LANGUAGE_DATA_INCL(LCD_LANGUAGE) - -#if HAS_LCD_CONTRAST - - int16_t MarlinUI::contrast = DEFAULT_LCD_CONTRAST; - - void MarlinUI::set_contrast(const int16_t value) { - contrast = constrain(value, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX); - u8g.setContrast(contrast); - } - -#endif - -void MarlinUI::set_font(const MarlinFont font_nr) { - static char currentfont = 0; - if (font_nr != currentfont) { - switch ((currentfont = font_nr)) { - case FONT_STATUSMENU : u8g.setFont(FONT_STATUSMENU_NAME); break; - case FONT_EDIT : u8g.setFont(EDIT_FONT_NAME); break; - default: - case FONT_MENU : u8g.setFont(MENU_FONT_NAME); break; - } - } -} - -bool MarlinUI::detected() { return true; } - -#if ENABLED(SHOW_BOOTSCREEN) - - #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) - // Draws a slice of a particular frame of the custom bootscreen, without the u8g loop - void MarlinUI::draw_custom_bootscreen(const uint8_t frame/*=0*/) { - constexpr u8g_uint_t left = u8g_uint_t((LCD_PIXEL_WIDTH - (CUSTOM_BOOTSCREEN_BMPWIDTH)) / 2), - top = u8g_uint_t((LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT)) / 2); - #if ENABLED(CUSTOM_BOOTSCREEN_INVERTED) - constexpr u8g_uint_t right = left + CUSTOM_BOOTSCREEN_BMPWIDTH, - bottom = top + CUSTOM_BOOTSCREEN_BMPHEIGHT; - #endif - - const u8g_pgm_uint8_t * const bmp = - #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED) - (u8g_pgm_uint8_t*)pgm_read_ptr(&custom_bootscreen_animation[frame]) - #else - custom_start_bmp - #endif - ; - TERN(CUSTOM_BOOTSCREEN_ANIMATED,,UNUSED(frame)); - - u8g.drawBitmapP(left, top, CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH, CUSTOM_BOOTSCREEN_BMPHEIGHT, bmp); - - #if ENABLED(CUSTOM_BOOTSCREEN_INVERTED) - if (frame == 0) { - u8g.setColorIndex(1); - if (top) u8g.drawBox(0, 0, LCD_PIXEL_WIDTH, top); - if (left) u8g.drawBox(0, top, left, CUSTOM_BOOTSCREEN_BMPHEIGHT); - if (right < LCD_PIXEL_WIDTH) u8g.drawBox(right, top, LCD_PIXEL_WIDTH - right, CUSTOM_BOOTSCREEN_BMPHEIGHT); - if (bottom < LCD_PIXEL_HEIGHT) u8g.drawBox(0, bottom, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT - bottom); - } - #endif - } - - // Shows the custom bootscreen, with the u8g loop, animations and delays - void MarlinUI::show_custom_bootscreen() { - #if DISABLED(CUSTOM_BOOTSCREEN_ANIMATED) - constexpr millis_t d = 0; - constexpr uint8_t f = 0; - #else - constexpr millis_t d = CUSTOM_BOOTSCREEN_FRAME_TIME; - LOOP_L_N(f, COUNT(custom_bootscreen_animation)) - #endif - { - u8g.firstPage(); - do { draw_custom_bootscreen(f); } while (u8g.nextPage()); - if (d) safe_delay(d); - } - - #ifndef CUSTOM_BOOTSCREEN_TIMEOUT - #define CUSTOM_BOOTSCREEN_TIMEOUT 2500 - #endif - safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT); - } - #endif // SHOW_CUSTOM_BOOTSCREEN - - // Two-part needed to display all info - constexpr bool two_part = ((LCD_PIXEL_HEIGHT) - (START_BMPHEIGHT)) < ((MENU_FONT_ASCENT) * 2); - - // Draw the static Marlin bootscreen from a u8g loop - // or the animated boot screen within its own u8g loop - void MarlinUI::draw_marlin_bootscreen(const bool line2/*=false*/) { - - // Determine text space needed - constexpr u8g_uint_t text_width_1 = u8g_uint_t((sizeof(SHORT_BUILD_VERSION) - 1) * (MENU_FONT_WIDTH)), - text_width_2 = u8g_uint_t((sizeof(MARLIN_WEBSITE_URL) - 1) * (MENU_FONT_WIDTH)), - text_max_width = _MAX(text_width_1, text_width_2), - text_total_height = (MENU_FONT_HEIGHT) * 2, - width = LCD_PIXEL_WIDTH, height = LCD_PIXEL_HEIGHT, - rspace = width - (START_BMPWIDTH); - - u8g_int_t offx, offy, txt_base, txt_offx_1, txt_offx_2; - - // Can the text fit to the right of the bitmap? - if (text_max_width < rspace) { - constexpr int8_t inter = (width - text_max_width - (START_BMPWIDTH)) / 3; // Evenly distribute horizontal space - offx = inter; // First the boot logo... - offy = (height - (START_BMPHEIGHT)) / 2; // ...V-aligned in the full height - txt_offx_1 = txt_offx_2 = inter + (START_BMPWIDTH) + inter; // Text right of the bitmap - txt_base = (height + MENU_FONT_ASCENT + text_total_height - (MENU_FONT_HEIGHT)) / 2; // Text vertical center - } - else { - constexpr int8_t inter = (height - text_total_height - (START_BMPHEIGHT)) / 3; // Evenly distribute vertical space - offx = rspace / 2; // Center the boot logo in the whole space - offy = inter; // V-align boot logo proportionally - txt_offx_1 = (width - text_width_1) / 2; // Text 1 centered - txt_offx_2 = (width - text_width_2) / 2; // Text 2 centered - txt_base = offy + START_BMPHEIGHT + offy + text_total_height - (MENU_FONT_DESCENT); // Even spacing looks best - } - NOLESS(offx, 0); - NOLESS(offy, 0); - - auto _draw_bootscreen_bmp = [&](const uint8_t *bitmap) { - u8g.drawBitmapP(offx, offy, START_BMP_BYTEWIDTH, START_BMPHEIGHT, bitmap); - set_font(FONT_MENU); - if (!two_part || !line2) lcd_put_u8str_P(txt_offx_1, txt_base - (MENU_FONT_HEIGHT), PSTR(SHORT_BUILD_VERSION)); - if (!two_part || line2) lcd_put_u8str_P(txt_offx_2, txt_base, PSTR(MARLIN_WEBSITE_URL)); - }; - - auto draw_bootscreen_bmp = [&](const uint8_t *bitmap) { - u8g.firstPage(); do { _draw_bootscreen_bmp(bitmap); } while (u8g.nextPage()); - }; - - #if DISABLED(BOOT_MARLIN_LOGO_ANIMATED) - draw_bootscreen_bmp(start_bmp); - #else - constexpr millis_t d = MARLIN_BOOTSCREEN_FRAME_TIME; - LOOP_L_N(f, COUNT(marlin_bootscreen_animation)) { - draw_bootscreen_bmp((uint8_t*)pgm_read_ptr(&marlin_bootscreen_animation[f])); - if (d) safe_delay(d); - } - #endif - } - - // Show the Marlin bootscreen, with the u8g loop and delays - void MarlinUI::show_marlin_bootscreen() { - constexpr uint8_t pages = two_part ? 2 : 1; - for (uint8_t q = pages; q--;) { - draw_marlin_bootscreen(q == 0); - safe_delay((BOOTSCREEN_TIMEOUT) / pages); - } - } - - void MarlinUI::show_bootscreen() { - TERN_(SHOW_CUSTOM_BOOTSCREEN, show_custom_bootscreen()); - show_marlin_bootscreen(); - } - -#endif // SHOW_BOOTSCREEN - -#if ENABLED(LIGHTWEIGHT_UI) - #include "status_screen_lite_ST7920.h" -#endif - -// Initialize or re-initialize the LCD -void MarlinUI::init_lcd() { - #if PIN_EXISTS(LCD_BACKLIGHT) - OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away - #endif - - #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED) - SET_OUTPUT(LCD_PINS_DC); - #ifndef LCD_RESET_PIN - #define LCD_RESET_PIN LCD_PINS_RS - #endif - #endif - - #if PIN_EXISTS(LCD_RESET) - // Perform a clean hardware reset with needed delays - OUT_WRITE(LCD_RESET_PIN, LOW); - _delay_ms(5); - WRITE(LCD_RESET_PIN, HIGH); - _delay_ms(5); - u8g.begin(); - #endif - - #if PIN_EXISTS(LCD_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) - WRITE(LCD_BACKLIGHT_PIN, HIGH); - #endif - - TERN_(HAS_LCD_CONTRAST, refresh_contrast()); - - TERN_(LCD_SCREEN_ROT_90, u8g.setRot90()); - TERN_(LCD_SCREEN_ROT_180, u8g.setRot180()); - TERN_(LCD_SCREEN_ROT_270, u8g.setRot270()); - - uxg_SetUtf8Fonts(g_fontinfo, COUNT(g_fontinfo)); -} - -// The kill screen is displayed for unrecoverable conditions -void MarlinUI::draw_kill_screen() { - TERN_(LIGHTWEIGHT_UI, ST7920_Lite_Status_Screen::clear_text_buffer()); - const u8g_uint_t h4 = u8g.getHeight() / 4; - u8g.firstPage(); - do { - set_font(FONT_MENU); - lcd_put_u8str(0, h4 * 1, status_message); - lcd_put_u8str_P(0, h4 * 2, GET_TEXT(MSG_HALTED)); - lcd_put_u8str_P(0, h4 * 3, GET_TEXT(MSG_PLEASE_RESET)); - } while (u8g.nextPage()); -} - -void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop - -#if HAS_LCD_MENU - - #include "../menu/menu.h" - - u8g_uint_t row_y1, row_y2; - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - - void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { - row_y1 = row * (MENU_FONT_HEIGHT) + 1; - row_y2 = row_y1 + MENU_FONT_HEIGHT - 1; - - if (!PAGE_CONTAINS(row_y1 + 1, row_y2 + 2)) return; - - lcd_put_wchar(LCD_PIXEL_WIDTH - 11 * (MENU_FONT_WIDTH), row_y2, 'E'); - lcd_put_wchar((char)('1' + extruder)); - lcd_put_wchar(' '); - lcd_put_u8str(i16tostr3rj(thermalManager.degHotend(extruder))); - lcd_put_wchar('/'); - - if (get_blink() || !thermalManager.heater_idle[extruder].timed_out) - lcd_put_u8str(i16tostr3rj(thermalManager.degTargetHotend(extruder))); - } - - #endif // ADVANCED_PAUSE_FEATURE - - // Mark a menu item and set font color if selected. - // Return 'false' if the item is not on screen. - static bool mark_as_selected(const uint8_t row, const bool sel) { - row_y1 = row * (MENU_FONT_HEIGHT) + 1; - row_y2 = row_y1 + MENU_FONT_HEIGHT - 1; - - if (!PAGE_CONTAINS(row_y1 + 1, row_y2 + 2)) return false; - - if (sel) { - #if ENABLED(MENU_HOLLOW_FRAME) - u8g.drawHLine(0, row_y1 + 1, LCD_PIXEL_WIDTH); - u8g.drawHLine(0, row_y2 + 2, LCD_PIXEL_WIDTH); - #else - u8g.setColorIndex(1); // solid outline - u8g.drawBox(0, row_y1 + 2, LCD_PIXEL_WIDTH, MENU_FONT_HEIGHT - 1); - u8g.setColorIndex(0); // inverted text - #endif - } - #if DISABLED(MENU_HOLLOW_FRAME) - else u8g.setColorIndex(1); // solid text - #endif - - if (!PAGE_CONTAINS(row_y1, row_y2)) return false; - - lcd_moveto(0, row_y2); - return true; - } - - // Draw a static line of text in the same idiom as a menu item - void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { - - if (mark_as_selected(row, style & SS_INVERT)) { - - pixel_len_t n = LCD_PIXEL_WIDTH; // pixel width of string allowed - - const int8_t plen = pstr ? utf8_strlen_P(pstr) : 0, - vlen = vstr ? utf8_strlen(vstr) : 0; - if (style & SS_CENTER) { - int8_t pad = (LCD_WIDTH - plen - vlen) / 2; - while (--pad >= 0) n -= lcd_put_wchar(' '); - } - - if (plen) n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n / (MENU_FONT_WIDTH)) * (MENU_FONT_WIDTH); - if (vlen) n -= lcd_put_u8str_max(vstr, n); - while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); - } - } - - // Draw a generic menu item - void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char, const char post_char) { - if (mark_as_selected(row, sel)) { - pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 1) * (MENU_FONT_WIDTH); - while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); - lcd_put_wchar(LCD_PIXEL_WIDTH - (MENU_FONT_WIDTH), row_y2, post_char); - lcd_put_wchar(' '); - } - } - - // Draw a menu item with an editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm) { - if (mark_as_selected(row, sel)) { - const uint8_t vallen = (pgm ? utf8_strlen_P(inStr) : utf8_strlen((char*)inStr)), - pixelwidth = (pgm ? uxg_GetUtf8StrPixelWidthP(u8g.getU8g(), inStr) : uxg_GetUtf8StrPixelWidth(u8g.getU8g(), (char*)inStr)); - - pixel_len_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vallen) * (MENU_FONT_WIDTH); - if (vallen) { - lcd_put_wchar(':'); - while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); - lcd_moveto(LCD_PIXEL_WIDTH - _MAX((MENU_FONT_WIDTH) * vallen, pixelwidth + 2), row_y2); - if (pgm) lcd_put_u8str_P(inStr); else lcd_put_u8str((char*)inStr); - } - } - } - - void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { - ui.encoder_direction_normal(); - - const u8g_uint_t labellen = utf8_strlen_P(pstr), vallen = utf8_strlen(value); - bool extra_row = labellen > LCD_WIDTH - 2 - vallen; - - #if ENABLED(USE_BIG_EDIT_FONT) - // Use the menu font if the label won't fit on a single line - constexpr u8g_uint_t lcd_edit_width = (LCD_PIXEL_WIDTH) / (EDIT_FONT_WIDTH); - u8g_uint_t lcd_chr_fit, one_chr_width; - if (labellen <= lcd_edit_width - 1) { - if (labellen + vallen + 1 > lcd_edit_width) extra_row = true; - lcd_chr_fit = lcd_edit_width + 1; - one_chr_width = EDIT_FONT_WIDTH; - ui.set_font(FONT_EDIT); - } - else { - lcd_chr_fit = LCD_WIDTH; - one_chr_width = MENU_FONT_WIDTH; - ui.set_font(FONT_MENU); - } - #else - constexpr u8g_uint_t lcd_chr_fit = LCD_WIDTH, - one_chr_width = MENU_FONT_WIDTH; - #endif - - // Center the label and value lines on the middle line - u8g_uint_t baseline = extra_row ? (LCD_PIXEL_HEIGHT) / 2 - 1 - : (LCD_PIXEL_HEIGHT + EDIT_FONT_ASCENT) / 2; - - // Assume the label is alpha-numeric (with a descender) - bool onpage = PAGE_CONTAINS(baseline - (EDIT_FONT_ASCENT - 1), baseline + EDIT_FONT_DESCENT); - if (onpage) lcd_put_u8str_ind_P(0, baseline, pstr, itemIndex, itemString); - - // If a value is included, print a colon, then print the value right-justified - if (value != nullptr) { - lcd_put_wchar(':'); - if (extra_row) { - // Assume that value is numeric (with no descender) - baseline += EDIT_FONT_ASCENT + 2; - onpage = PAGE_CONTAINS(baseline - (EDIT_FONT_ASCENT - 1), baseline); - } - if (onpage) { - lcd_put_wchar(((lcd_chr_fit - 1) - (vallen + 1)) * one_chr_width, baseline, ' '); // Right-justified, padded, add a leading space - lcd_put_u8str(value); - } - } - TERN_(USE_BIG_EDIT_FONT, ui.set_font(FONT_MENU)); - } - - inline void draw_boxed_string(const u8g_uint_t x, const u8g_uint_t y, PGM_P const pstr, const bool inv) { - const u8g_uint_t len = utf8_strlen_P(pstr), - by = (y + 1) * (MENU_FONT_HEIGHT); - const pixel_len_t bw = len * (MENU_FONT_WIDTH), bx = x * (MENU_FONT_WIDTH); - if (inv) { - u8g.setColorIndex(1); - u8g.drawBox(bx - 1, by - (MENU_FONT_ASCENT) + 1, bw + 2, MENU_FONT_HEIGHT - 1); - u8g.setColorIndex(0); - } - lcd_put_u8str_P(bx, by, pstr); - if (inv) u8g.setColorIndex(1); - } - - void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { - ui.draw_select_screen_prompt(pref, string, suff); - draw_boxed_string(1, LCD_HEIGHT - 1, no, !yesno); - draw_boxed_string(LCD_WIDTH - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno); - } - - #if ENABLED(SDSUPPORT) - - void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { - if (mark_as_selected(row, sel)) { - if (isDir) lcd_put_wchar(LCD_STR_FOLDER[0]); - constexpr uint8_t maxlen = LCD_WIDTH - 1; - const pixel_len_t pixw = maxlen * (MENU_FONT_WIDTH); - pixel_len_t n = pixw - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), pixw); - while (n > MENU_FONT_WIDTH) n -= lcd_put_wchar(' '); - } - } - - #endif // SDSUPPORT - - #if ENABLED(AUTO_BED_LEVELING_UBL) - - /** - * UBL LCD "radar" map data - */ - #define MAP_UPPER_LEFT_CORNER_X 35 // These probably should be moved to the .h file But for now, - #define MAP_UPPER_LEFT_CORNER_Y 8 // it is easier to play with things having them here - #define MAP_MAX_PIXELS_X 53 - #define MAP_MAX_PIXELS_Y 49 - - void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { - // Scale the box pixels appropriately - u8g_uint_t x_map_pixels = ((MAP_MAX_PIXELS_X - 4) / (GRID_MAX_POINTS_X)) * (GRID_MAX_POINTS_X), - y_map_pixels = ((MAP_MAX_PIXELS_Y - 4) / (GRID_MAX_POINTS_Y)) * (GRID_MAX_POINTS_Y), - - pixels_per_x_mesh_pnt = x_map_pixels / (GRID_MAX_POINTS_X), - pixels_per_y_mesh_pnt = y_map_pixels / (GRID_MAX_POINTS_Y), - - x_offset = MAP_UPPER_LEFT_CORNER_X + 1 + (MAP_MAX_PIXELS_X - x_map_pixels - 2) / 2, - y_offset = MAP_UPPER_LEFT_CORNER_Y + 1 + (MAP_MAX_PIXELS_Y - y_map_pixels - 2) / 2; - - // Clear the Mesh Map - - if (PAGE_CONTAINS(y_offset - 2, y_offset + y_map_pixels + 4)) { - u8g.setColorIndex(1); // First draw the bigger box in White so we have a border around the mesh map box - u8g.drawBox(x_offset - 2, y_offset - 2, x_map_pixels + 4, y_map_pixels + 4); - if (PAGE_CONTAINS(y_offset, y_offset + y_map_pixels)) { - u8g.setColorIndex(0); // Now actually clear the mesh map box - u8g.drawBox(x_offset, y_offset, x_map_pixels, y_map_pixels); - } - } - - // Display Mesh Point Locations - - u8g.setColorIndex(1); - const u8g_uint_t sx = x_offset + pixels_per_x_mesh_pnt / 2; - u8g_uint_t y = y_offset + pixels_per_y_mesh_pnt / 2; - for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++, y += pixels_per_y_mesh_pnt) - if (PAGE_CONTAINS(y, y)) - for (uint8_t i = 0, x = sx; i < GRID_MAX_POINTS_X; i++, x += pixels_per_x_mesh_pnt) - u8g.drawBox(x, y, 1, 1); - - // Fill in the Specified Mesh Point - - const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y - 1) - y_plot; // The origin is typically in the lower right corner. We need to - // invert the Y to get it to plot in the right location. - - const u8g_uint_t by = y_offset + y_plot_inv * pixels_per_y_mesh_pnt; - if (PAGE_CONTAINS(by, by + pixels_per_y_mesh_pnt)) - u8g.drawBox( - x_offset + x_plot * pixels_per_x_mesh_pnt, by, - pixels_per_x_mesh_pnt, pixels_per_y_mesh_pnt - ); - - // Put Relevant Text on Display - - // Show X and Y positions at top of screen - u8g.setColorIndex(1); - if (PAGE_UNDER(7)) { - const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, - lpos = pos.asLogical(); - lcd_put_u8str_P(5, 7, X_LBL); - lcd_put_u8str(ftostr52(lpos.x)); - lcd_put_u8str_P(74, 7, Y_LBL); - lcd_put_u8str(ftostr52(lpos.y)); - } - - // Print plot position - if (PAGE_CONTAINS(LCD_PIXEL_HEIGHT - (INFO_FONT_HEIGHT - 1), LCD_PIXEL_HEIGHT)) { - lcd_put_wchar(5, LCD_PIXEL_HEIGHT, '('); - u8g.print(x_plot); - lcd_put_wchar(','); - u8g.print(y_plot); - lcd_put_wchar(')'); - - // Show the location value - lcd_put_u8str_P(74, LCD_PIXEL_HEIGHT, Z_LBL); - if (!isnan(ubl.z_values[x_plot][y_plot])) - lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); - else - lcd_put_u8str_P(PSTR(" -----")); - } - - } - - #endif // AUTO_BED_LEVELING_UBL - - #if EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) - - const unsigned char cw_bmp[] PROGMEM = { - B00000000,B11111110,B00000000, - B00000011,B11111111,B10000000, - B00000111,B11000111,B11000000, - B00000111,B00000001,B11100000, - B00000000,B00000000,B11100000, - B00000000,B00000000,B11110000, - B00000000,B00000000,B01110000, - B00000100,B00000000,B01110000, - B00001110,B00000000,B01110000, - B00011111,B00000000,B01110000, - B00111111,B10000000,B11110000, - B00001110,B00000000,B11100000, - B00001111,B00000001,B11100000, - B00000111,B11000111,B11000000, - B00000011,B11111111,B10000000, - B00000000,B11111110,B00000000 - }; - - const unsigned char ccw_bmp[] PROGMEM = { - B00000000,B11111110,B00000000, - B00000011,B11111111,B10000000, - B00000111,B11000111,B11000000, - B00001111,B00000001,B11100000, - B00001110,B00000000,B11100000, - B00111111,B10000000,B11110000, - B00011111,B00000000,B01110000, - B00001110,B00000000,B01110000, - B00000100,B00000000,B01110000, - B00000000,B00000000,B01110000, - B00000000,B00000000,B11110000, - B00000000,B00000000,B11100000, - B00000111,B00000001,B11100000, - B00000111,B11000111,B11000000, - B00000011,B11111111,B10000000, - B00000000,B11111110,B00000000 - }; - - const unsigned char up_arrow_bmp[] PROGMEM = { - B00000100,B00000000, - B00001110,B00000000, - B00011111,B00000000, - B00111111,B10000000, - B01111111,B11000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000 - }; - - const unsigned char down_arrow_bmp[] PROGMEM = { - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B01111111,B11000000, - B00111111,B10000000, - B00011111,B00000000, - B00001110,B00000000, - B00000100,B00000000 - }; - - const unsigned char offset_bedline_bmp[] PROGMEM = { - B11111111,B11111111,B11111111 - }; - - const unsigned char nozzle_bmp[] PROGMEM = { - B01111111,B10000000, - B11111111,B11000000, - B11111111,B11000000, - B11111111,B11000000, - B01111111,B10000000, - B01111111,B10000000, - B11111111,B11000000, - B11111111,B11000000, - B11111111,B11000000, - B00111111,B00000000, - B00011110,B00000000, - B00001100,B00000000 - }; - - void _lcd_zoffset_overlay_gfx(const float zvalue) { - // Determine whether the user is raising or lowering the nozzle. - static int8_t dir; - static float old_zvalue; - if (zvalue != old_zvalue) { - dir = zvalue ? zvalue < old_zvalue ? -1 : 1 : 0; - old_zvalue = zvalue; - } - - #if ENABLED(OVERLAY_GFX_REVERSE) - const unsigned char *rot_up = ccw_bmp, *rot_down = cw_bmp; - #else - const unsigned char *rot_up = cw_bmp, *rot_down = ccw_bmp; - #endif - - #if ENABLED(USE_BIG_EDIT_FONT) - const int left = 0, right = 45, nozzle = 95; - #else - const int left = 5, right = 90, nozzle = 60; - #endif - - // Draw a representation of the nozzle - if (PAGE_CONTAINS(3, 16)) u8g.drawBitmapP(nozzle + 6, 4 - dir, 2, 12, nozzle_bmp); - if (PAGE_CONTAINS(20, 20)) u8g.drawBitmapP(nozzle + 0, 20, 3, 1, offset_bedline_bmp); - - // Draw cw/ccw indicator and up/down arrows. - if (PAGE_CONTAINS(47, 62)) { - u8g.drawBitmapP(right + 0, 48 - dir, 2, 13, up_arrow_bmp); - u8g.drawBitmapP(left + 0, 49 - dir, 2, 13, down_arrow_bmp); - u8g.drawBitmapP(left + 13, 47, 3, 16, rot_down); - u8g.drawBitmapP(right + 13, 47, 3, 16, rot_up); - } - } - - #endif // BABYSTEP_ZPROBE_GFX_OVERLAY || MESH_EDIT_GFX_OVERLAY - -#endif // HAS_LCD_MENU - -#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h deleted file mode 100644 index 228cee6848..0000000000 --- a/Marlin/src/lcd/dogm/ultralcd_DOGM.h +++ /dev/null @@ -1,222 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * lcd/dogm/ultralcd_DOGM.h - */ - -#include "../../inc/MarlinConfigPre.h" - -#include -#include "HAL_LCD_class_defines.h" - -//#define ALTERNATIVE_LCD - -#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - // RepRapWorld Graphical LCD - - #define U8G_CLASS U8GLIB_ST7920_128X64_4X - #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) - #define U8G_PARAM LCD_PINS_RS - #else - #define U8G_PARAM LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS - #endif - -#elif ENABLED(U8GLIB_ST7920) - - // RepRap Discount Full Graphics Smart Controller - // and other variant LCDs using ST7920 - - #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) - #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) - #define U8G_PARAM LCD_PINS_RS - #else - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_ST7920_128X64_4X // 2 stripes, SW SPI (Original u8glib device) - #else - #define U8G_CLASS U8GLIB_ST7920_128X64_RRD // Adjust stripes with PAGE_HEIGHT in ultralcd_st7920_u8glib_rrd.h - #endif - #define U8G_PARAM LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS // AVR version ignores these pin settings - // HAL version uses these pin settings - #endif - -#elif ENABLED(CARTESIO_UI) - - // CartesioUI LCD - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_DOGM128_2X // 4 stripes - #define FORCE_SOFT_SPI // SW-SPI - #else - #define U8G_CLASS U8GLIB_DOGM128_2X // 4 stripes (HW-SPI) - #endif - -#elif ENABLED(U8GLIB_LM6059_AF) - - // Based on the Adafruit ST7565 (https://www.adafruit.com/products/250) - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_LM6059 // 8 stripes (HW-SPI) - #else - #define U8G_CLASS U8GLIB_LM6059_2X // 4 stripes (HW-SPI) - #endif - -#elif ENABLED(U8GLIB_ST7565_64128N) - - // MaKrPanel, Mini Viki, Viki 2.0, AZSMZ 12864 ST7565 controller - - #define SMART_RAMPS MB(RAMPS_SMART_EFB, RAMPS_SMART_EEB, RAMPS_SMART_EFF, RAMPS_SMART_EEF, RAMPS_SMART_SF) - #define U8G_CLASS U8GLIB_64128N_2X_HAL // 4 stripes (HW-SPI) - #if SMART_RAMPS || DOGLCD_SCK != SCK_PIN || DOGLCD_MOSI != MOSI_PIN - #define FORCE_SOFT_SPI // SW-SPI - #endif - -#elif ANY(FYSETC_MINI_12864, MKS_MINI_12864, ENDER2_STOCKDISPLAY) - - // The FYSETC Mini 12864 display // "4 stripes" - - // The MKS_MINI_12864 V1/V2 aren't exact copies of the MiniPanel. - // Panel management is in u8g_dev_uc1701_mini12864_HAL.cpp with - // extra delays added to remove glitches seen with fast MCUs. - - #define U8G_CLASS U8GLIB_MINI12864_2X_HAL // 8 stripes (HW-SPI) - -#elif ENABLED(MINIPANEL) - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_MINI12864 - #else - #define U8G_CLASS U8GLIB_MINI12864_2X // 8 stripes (HW-SPI) - #endif - -#elif EITHER(MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864) - - // MKS 128x64 (SSD1306) OLED I2C LCD - // - or - - // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER - - #define FORCE_SOFT_SPI // SW-SPI - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes - #else - #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes - #endif - -#elif ENABLED(ZONESTAR_12864OLED_SSD1306) - - // Zonestar SSD1306 OLED SPI LCD - - #define FORCE_SOFT_SPI // SW-SPI - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SH1306_128X64_2X // 4 stripes - #else - #define U8G_CLASS U8GLIB_SH1306_128X64 // 8 stripes - #endif - -#elif EITHER(MKS_12864OLED, ZONESTAR_12864OLED) - - // MKS 128x64 (SH1106) OLED I2C LCD - // - or - - // Zonestar SH1106 OLED SPI LCD - - #define FORCE_SOFT_SPI // SW-SPI - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SH1106_128X64_2X // 4 stripes - #else - #define U8G_CLASS U8GLIB_SH1106_128X64 // 8 stripes - #endif - -#elif ENABLED(U8GLIB_SH1106_EINSTART) - - // Connected via motherboard header - - #define U8G_CLASS U8GLIB_SH1106_128X64 - #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS - -#elif ENABLED(U8GLIB_SH1106) - - // Generic SH1106 OLED I2C LCD - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SH1106_128X64_2X_I2C_2_WIRE // 4 stripes - #else - #define U8G_CLASS U8GLIB_SH1106_128X64_2X // 4 stripes - #endif - #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) // I2C - -#elif ENABLED(U8GLIB_SSD1309) - - // Generic support for SSD1309 OLED I2C LCDs - - #define U8G_CLASS U8GLIB_SSD1309_128X64 - #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) // I2C - -#elif ENABLED(U8GLIB_SSD1306) - - // Generic SSD1306 OLED I2C LCD - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE // 4 stripes - #else - #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes - #endif - #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) - -#elif TFT_SCALED_DOGLCD - - // Unspecified 320x240 TFT pre-initialized by built-in bootloader - - #define U8G_CLASS U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 - #if ENABLED(FSMC_GRAPHICAL_TFT) - #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN - #else - #define U8G_PARAM -1, -1 - #endif - -#else - - #if ENABLED(ALTERNATIVE_LCD) - #define U8G_CLASS U8GLIB_DOGM128 // 8 stripes (HW-SPI) - #else - #define U8G_CLASS U8GLIB_DOGM128_2X // 4 stripes (HW-SPI) - #endif - -#endif - -// Use HW-SPI if no other option is specified -#ifndef U8G_PARAM - #if ENABLED(FORCE_SOFT_SPI) - #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0 // SW-SPI - #else - #define U8G_PARAM DOGLCD_CS, DOGLCD_A0 // HW-SPI - #endif -#endif - -// For selective rendering within a Y range -#define PAGE_OVER(ya) ((ya) <= u8g.getU8g()->current_page.y1) // Does the current page follow a region top? -#define PAGE_UNDER(yb) ((yb) >= u8g.getU8g()->current_page.y0) // Does the current page precede a region bottom? -#define PAGE_CONTAINS(ya, yb) ((yb) >= u8g.getU8g()->current_page.y0 && (ya) <= u8g.getU8g()->current_page.y1) // Do two vertical regions overlap? - -extern U8G_CLASS u8g; diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp index e6bd80c2c2..9d3d68ef46 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,63 +16,87 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ // NOTE - the HAL version of the rrd device uses a generic ST7920 device. See the // file u8g_dev_st7920_128x64_HAL.cpp for the HAL version. -#include "../../inc/MarlinConfigPre.h" - -#if !defined(U8G_HAL_LINKS) && ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) - #include "../../inc/MarlinConfig.h" #if ENABLED(U8GLIB_ST7920) -#include "ultralcd_st7920_u8glib_rrd_AVR.h" +#if !(defined(U8G_HAL_LINKS) || defined(__SAM3X8E__)) + +#include "../../HAL/shared/Delay.h" + +#define ST7920_CLK_PIN LCD_PINS_D4 +#define ST7920_DAT_PIN LCD_PINS_ENABLE +#define ST7920_CS_PIN LCD_PINS_RS + +//#define PAGE_HEIGHT 8 //128 byte framebuffer +#define PAGE_HEIGHT 16 //256 byte framebuffer +//#define PAGE_HEIGHT 32 //512 byte framebuffer + +#define LCD_PIXEL_WIDTH 128 +#define LCD_PIXEL_HEIGHT 64 + +#include + +//set optimization so ARDUINO optimizes this file +#pragma GCC optimize (3) + +// If you want you can define your own set of delays in Configuration.h +//#define ST7920_DELAY_1 DELAY_NS(0) +//#define ST7920_DELAY_2 DELAY_NS(0) +//#define ST7920_DELAY_3 DELAY_NS(0) + +#if F_CPU >= 20000000 + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(50) +#elif MB(3DRAG) || MB(K8200) || MB(K8400) || MB(SILVER_GATE) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(188) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(MINIRAMBO) || MB(EINSY_RAMBO) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(250) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(RAMBO) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(BQ_ZUM_MEGA_3D) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(189) +#elif F_CPU == 16000000 + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(63) +#else + #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd.h'" +#endif #ifndef ST7920_DELAY_1 - #ifdef BOARD_ST7920_DELAY_1 - #define ST7920_DELAY_1 BOARD_ST7920_DELAY_1 - #else - #define ST7920_DELAY_1 CPU_ST7920_DELAY_1 - #endif + #define ST7920_DELAY_1 CPU_ST7920_DELAY_1 #endif #ifndef ST7920_DELAY_2 - #ifdef BOARD_ST7920_DELAY_2 - #define ST7920_DELAY_2 BOARD_ST7920_DELAY_2 - #else - #define ST7920_DELAY_2 CPU_ST7920_DELAY_2 - #endif + #define ST7920_DELAY_2 CPU_ST7920_DELAY_2 #endif #ifndef ST7920_DELAY_3 - #ifdef BOARD_ST7920_DELAY_3 - #define ST7920_DELAY_3 BOARD_ST7920_DELAY_3 - #else - #define ST7920_DELAY_3 CPU_ST7920_DELAY_3 - #endif + #define ST7920_DELAY_3 CPU_ST7920_DELAY_3 #endif -// Optimize this code with -O3 -#pragma GCC optimize (3) +#define ST7920_SND_BIT \ + WRITE(ST7920_CLK_PIN, LOW); ST7920_DELAY_1; \ + WRITE(ST7920_DAT_PIN, val & 0x80); ST7920_DELAY_2; \ + WRITE(ST7920_CLK_PIN, HIGH); ST7920_DELAY_3; \ + val <<= 1 -#ifdef ARDUINO_ARCH_STM32F1 - #define ST7920_DAT(V) !!((V) & 0x80) -#else - #define ST7920_DAT(V) ((V) & 0x80) -#endif -#define ST7920_SND_BIT do{ \ - WRITE(ST7920_CLK_PIN, LOW); ST7920_DELAY_1; \ - WRITE(ST7920_DAT_PIN, ST7920_DAT(val)); ST7920_DELAY_2; \ - WRITE(ST7920_CLK_PIN, HIGH); ST7920_DELAY_3; \ - val <<= 1; }while(0) - -// Optimize this code with -O3 -#pragma GCC optimize (3) - -void ST7920_SWSPI_SND_8BIT(uint8_t val) { +static void ST7920_SWSPI_SND_8BIT(uint8_t val) { ST7920_SND_BIT; // 1 ST7920_SND_BIT; // 2 ST7920_SND_BIT; // 3 @@ -83,6 +107,19 @@ void ST7920_SWSPI_SND_8BIT(uint8_t val) { ST7920_SND_BIT; // 8 } +#if DOGM_SPI_DELAY_US > 0 + #define U8G_DELAY() DELAY_US(DOGM_SPI_DELAY_US) +#else + #define U8G_DELAY() DELAY_US(10) +#endif + +#define ST7920_CS() { WRITE(ST7920_CS_PIN,1); U8G_DELAY(); } +#define ST7920_NCS() { WRITE(ST7920_CS_PIN,0); } +#define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); U8G_DELAY(); } +#define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); U8G_DELAY(); } +#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4u)); U8G_DELAY(); } +#define ST7920_WRITE_BYTES(p,l) { for (uint8_t i = l + 1; --i;) { ST7920_SWSPI_SND_8BIT(*p&0xF0); ST7920_SWSPI_SND_8BIT(*p<<4); p++; } U8G_DELAY(); } + uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { uint8_t i, y; switch (msg) { @@ -92,23 +129,23 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo OUT_WRITE(ST7920_CLK_PIN, HIGH); ST7920_CS(); - u8g_Delay(120); // Initial delay for boot up + u8g_Delay(120); //initial delay for boot up ST7920_SET_CMD(); - ST7920_WRITE_BYTE(0x20); // Non-extended mode - ST7920_WRITE_BYTE(0x08); // Display off, cursor+blink off - ST7920_WRITE_BYTE(0x01); // Clear DDRAM ram - u8g_Delay(15); // Delay for DDRAM clear - ST7920_WRITE_BYTE(0x24); // Extended mode - ST7920_WRITE_BYTE(0x26); // Extended mode + GDRAM active - for (y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { // Clear GDRAM - ST7920_WRITE_BYTE(0x80 | y); // Set y - ST7920_WRITE_BYTE(0x80); // Set x = 0 + ST7920_WRITE_BYTE(0x20); //non-extended mode + ST7920_WRITE_BYTE(0x08); //display off, cursor+blink off + ST7920_WRITE_BYTE(0x01); //clear DDRAM ram + u8g_Delay(15); //delay for DDRAM clear + ST7920_WRITE_BYTE(0x24); //extended mode + ST7920_WRITE_BYTE(0x26); //extended mode + GDRAM active + for (y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { //clear GDRAM + ST7920_WRITE_BYTE(0x80 | y); //set y + ST7920_WRITE_BYTE(0x80); //set x = 0 ST7920_SET_DAT(); - for (i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; i++) // 2x width clears both segments + for (i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; i++) //2x width clears both segments ST7920_WRITE_BYTE(0); ST7920_SET_CMD(); } - ST7920_WRITE_BYTE(0x0C); // Display on, cursor+blink off + ST7920_WRITE_BYTE(0x0C); //display on, cursor+blink off ST7920_NCS(); } break; @@ -125,15 +162,15 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo for (i = 0; i < PAGE_HEIGHT; i ++) { ST7920_SET_CMD(); if (y < 32) { - ST7920_WRITE_BYTE(0x80 | y); // y - ST7920_WRITE_BYTE(0x80); // x = 0 + ST7920_WRITE_BYTE(0x80 | y); //y + ST7920_WRITE_BYTE(0x80); //x=0 } else { - ST7920_WRITE_BYTE(0x80 | (y - 32)); // y - ST7920_WRITE_BYTE(0x80 | 8); // x = 64 + ST7920_WRITE_BYTE(0x80 | (y - 32)); //y + ST7920_WRITE_BYTE(0x80 | 8); //x=64 } ST7920_SET_DAT(); - ST7920_WRITE_BYTES(ptr, (LCD_PIXEL_WIDTH) / 8); // ptr incremented inside of macro! + ST7920_WRITE_BYTES(ptr, (LCD_PIXEL_WIDTH) / 8); //ptr is incremented inside of macro y++; } ST7920_NCS(); @@ -150,19 +187,17 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo } uint8_t u8g_dev_st7920_128x64_rrd_buf[(LCD_PIXEL_WIDTH) * (PAGE_HEIGHT) / 8] U8G_NOCOMMON; -u8g_pb_t u8g_dev_st7920_128x64_rrd_pb = { { PAGE_HEIGHT, LCD_PIXEL_HEIGHT, 0, 0, 0 }, LCD_PIXEL_WIDTH, u8g_dev_st7920_128x64_rrd_buf }; -u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_rrd_st7920_128x64_fn, &u8g_dev_st7920_128x64_rrd_pb, &u8g_com_null_fn }; +u8g_pb_t u8g_dev_st7920_128x64_rrd_pb = {{PAGE_HEIGHT, LCD_PIXEL_HEIGHT, 0, 0, 0}, LCD_PIXEL_WIDTH, u8g_dev_st7920_128x64_rrd_buf}; +u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = {u8g_dev_rrd_st7920_128x64_fn, &u8g_dev_st7920_128x64_rrd_pb, &u8g_com_null_fn}; + +#if ENABLED(LIGHTWEIGHT_UI) + // We have to include the code for the lightweight UI here + // as it relies on macros that are only defined in this file. + #include "status_screen_lite_ST7920_spi.h" +#endif #pragma GCC reset_options -#if ENABLED(LIGHTWEIGHT_UI) - #include "../../HAL/shared/HAL_ST7920.h" - void ST7920_cs() { ST7920_CS(); } - void ST7920_ncs() { ST7920_NCS(); } - void ST7920_set_cmd() { ST7920_SET_CMD(); } - void ST7920_set_dat() { ST7920_SET_DAT(); } - void ST7920_write_byte(const uint8_t val) { ST7920_WRITE_BYTE(val); } -#endif +#endif // U8G_HAL_LINKS #endif // U8GLIB_ST7920 -#endif // !U8G_HAL_LINKS && (__AVR__ || ARDUINO_ARCH_STM32 || ARDUINO_ARCH_ESP32) diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h deleted file mode 100644 index 70be70eab7..0000000000 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// NOTE - the HAL version of the rrd device uses a generic ST7920 device. See the -// file u8g_dev_st7920_128x64_HAL.cpp for the HAL version. - -#include "../../inc/MarlinConfig.h" -#include "../../HAL/shared/Delay.h" - -#define ST7920_CLK_PIN LCD_PINS_D4 -#define ST7920_DAT_PIN LCD_PINS_ENABLE -#define ST7920_CS_PIN LCD_PINS_RS - -//#define PAGE_HEIGHT 8 // 128 byte framebuffer -#define PAGE_HEIGHT 16 // 256 byte framebuffer -//#define PAGE_HEIGHT 32 // 512 byte framebuffer - -#include - -// If you want you can define your own set of delays in Configuration.h -//#define ST7920_DELAY_1 DELAY_NS(0) -//#define ST7920_DELAY_2 DELAY_NS(0) -//#define ST7920_DELAY_3 DELAY_NS(0) - -#if F_CPU >= 20000000 - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(50) -#elif MB(3DRAG, K8200, K8400) - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(188) - #define CPU_ST7920_DELAY_3 DELAY_NS(0) -#elif MB(MINIRAMBO, EINSY_RAMBO, EINSY_RETRO, SILVER_GATE) - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(250) - #define CPU_ST7920_DELAY_3 DELAY_NS(0) -#elif MB(RAMBO) - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(0) -#elif MB(BQ_ZUM_MEGA_3D) - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(189) -#elif defined(ARDUINO_ARCH_STM32) - #define CPU_ST7920_DELAY_1 DELAY_NS(300) - #define CPU_ST7920_DELAY_2 DELAY_NS(40) - #define CPU_ST7920_DELAY_3 DELAY_NS(340) -#elif F_CPU == 16000000 - #define CPU_ST7920_DELAY_1 DELAY_NS(0) - #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(63) -#else - #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd_AVR.h'" -#endif - -void ST7920_SWSPI_SND_8BIT(uint8_t val); - -#if DOGM_SPI_DELAY_US > 0 - #define U8G_DELAY() DELAY_US(DOGM_SPI_DELAY_US) -#else - #define U8G_DELAY() DELAY_US(10) -#endif - -#define ST7920_CS() { WRITE(ST7920_CS_PIN,1); U8G_DELAY(); } -#define ST7920_NCS() { WRITE(ST7920_CS_PIN,0); } -#define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); U8G_DELAY(); } -#define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); U8G_DELAY(); } -#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4U)); U8G_DELAY(); } -#define ST7920_WRITE_BYTES(p,l) { for (uint8_t i = l + 1; --i;) { ST7920_SWSPI_SND_8BIT(*p&0xF0); ST7920_SWSPI_SND_8BIT(*p<<4); p++; } U8G_DELAY(); } diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp deleted file mode 100644 index 7d1528bed1..0000000000 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ /dev/null @@ -1,455 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/******************************************************************************** - * @file dwin_lcd.cpp - * @author LEO / Creality3D - * @date 2019/07/18 - * @version 2.0.1 - * @brief DWIN screen control functions - ********************************************************************************/ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(DWIN_CREALITY_LCD) - -#include "../../inc/MarlinConfig.h" - -#include "dwin_lcd.h" -#include // for memset - -//#define DEBUG_OUT 1 -#include "../../core/debug_out.h" - -// Make sure DWIN_SendBuf is large enough to hold the largest string plus draw command and tail. -// Assume the narrowest (6 pixel) font and 2-byte gb2312-encoded characters. -uint8_t DWIN_SendBuf[11 + DWIN_WIDTH / 6 * 2] = { 0xAA }; -uint8_t DWIN_BufTail[4] = { 0xCC, 0x33, 0xC3, 0x3C }; -uint8_t databuf[26] = { 0 }; -uint8_t receivedType; - -int recnum = 0; - -inline void DWIN_Byte(size_t &i, const uint16_t bval) { - DWIN_SendBuf[++i] = bval; -} - -inline void DWIN_Word(size_t &i, const uint16_t wval) { - DWIN_SendBuf[++i] = wval >> 8; - DWIN_SendBuf[++i] = wval & 0xFF; -} - -inline void DWIN_Long(size_t &i, const uint32_t lval) { - DWIN_SendBuf[++i] = (lval >> 24) & 0xFF; - DWIN_SendBuf[++i] = (lval >> 16) & 0xFF; - DWIN_SendBuf[++i] = (lval >> 8) & 0xFF; - DWIN_SendBuf[++i] = lval & 0xFF; -} - -inline void DWIN_String(size_t &i, char * const string) { - const size_t len = _MIN(sizeof(DWIN_SendBuf) - i, strlen(string)); - memcpy(&DWIN_SendBuf[i+1], string, len); - i += len; -} - -inline void DWIN_String(size_t &i, const __FlashStringHelper * string) { - if (!string) return; - const size_t len = strlen_P((PGM_P)string); // cast it to PGM_P, which is basically const char *, and measure it using the _P version of strlen. - if (len == 0) return; - memcpy(&DWIN_SendBuf[i+1], string, len); - i += len; -} - -// Send the data in the buffer and the packet end -inline void DWIN_Send(size_t &i) { - ++i; - LOOP_L_N(n, i) { MYSERIAL1.write(DWIN_SendBuf[n]); delayMicroseconds(1); } - LOOP_L_N(n, 4) { MYSERIAL1.write(DWIN_BufTail[n]); delayMicroseconds(1); } -} - -/*-------------------------------------- System variable function --------------------------------------*/ - -// Handshake (1: Success, 0: Fail) -bool DWIN_Handshake(void) { - size_t i = 0; - DWIN_Byte(i, 0x00); - DWIN_Send(i); - - while (MYSERIAL1.available() > 0 && recnum < (signed)sizeof(databuf)) { - databuf[recnum] = MYSERIAL1.read(); - // ignore the invalid data - if (databuf[0] != FHONE) { // prevent the program from running. - if (recnum > 0) { - recnum = 0; - ZERO(databuf); - } - continue; - } - delay(10); - recnum++; - } - - return ( recnum >= 3 - && databuf[0] == FHONE - && databuf[1] == '\0' - && databuf[2] == 'O' - && databuf[3] == 'K' ); -} - -// Set the backlight luminance -// luminance: (0x00-0xFF) -void DWIN_Backlight_SetLuminance(const uint8_t luminance) { - size_t i = 0; - DWIN_Byte(i, 0x30); - DWIN_Byte(i, _MAX(luminance, 0x1F)); - DWIN_Send(i); -} - -// Set screen display direction -// dir: 0=0°, 1=90°, 2=180°, 3=270° -void DWIN_Frame_SetDir(uint8_t dir) { - size_t i = 0; - DWIN_Byte(i, 0x34); - DWIN_Byte(i, 0x5A); - DWIN_Byte(i, 0xA5); - DWIN_Byte(i, dir); - DWIN_Send(i); -} - -// Update display -void DWIN_UpdateLCD(void) { - size_t i = 0; - DWIN_Byte(i, 0x3D); - DWIN_Send(i); -} - -/*---------------------------------------- Drawing functions ----------------------------------------*/ - -// Clear screen -// color: Clear screen color -void DWIN_Frame_Clear(const uint16_t color) { - size_t i = 0; - DWIN_Byte(i, 0x01); - DWIN_Word(i, color); - DWIN_Send(i); -} - -// Draw a point -// width: point width 0x01-0x0F -// height: point height 0x01-0x0F -// x,y: upper left point -void DWIN_Draw_Point(uint8_t width, uint8_t height, uint16_t x, uint16_t y) { - size_t i = 0; - DWIN_Byte(i, 0x02); - DWIN_Byte(i, width); - DWIN_Byte(i, height); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Send(i); -} - -// Draw a line -// color: Line segment color -// xStart/yStart: Start point -// xEnd/yEnd: End point -void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { - size_t i = 0; - DWIN_Byte(i, 0x03); - DWIN_Word(i, color); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Send(i); -} - -// Draw a rectangle -// mode: 0=frame, 1=fill, 2=XOR fill -// color: Rectangle color -// xStart/yStart: upper left point -// xEnd/yEnd: lower right point -void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, - uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { - size_t i = 0; - DWIN_Byte(i, 0x05); - DWIN_Byte(i, mode); - DWIN_Word(i, color); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Send(i); -} - -// Move a screen area -// mode: 0, circle shift; 1, translation -// dir: 0=left, 1=right, 2=up, 3=down -// dis: Distance -// color: Fill color -// xStart/yStart: upper left point -// xEnd/yEnd: bottom right point -void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, - uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { - size_t i = 0; - DWIN_Byte(i, 0x09); - DWIN_Byte(i, (mode << 7) | dir); - DWIN_Word(i, dis); - DWIN_Word(i, color); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Send(i); -} - -/*---------------------------------------- Text related functions ----------------------------------------*/ - -// Draw a string -// widthAdjust: true=self-adjust character width; false=no adjustment -// bShow: true=display background color; false=don't display background color -// size: Font size -// color: Character color -// bColor: Background color -// x/y: Upper-left coordinate of the string -// *string: The string -void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, - uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, char *string) { - size_t i = 0; - DWIN_Byte(i, 0x11); - // Bit 7: widthAdjust - // Bit 6: bShow - // Bit 5-4: Unused (0) - // Bit 3-0: size - DWIN_Byte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); - DWIN_Word(i, color); - DWIN_Word(i, bColor); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_String(i, string); - DWIN_Send(i); -} - -// Draw a positive integer -// bShow: true=display background color; false=don't display background color -// zeroFill: true=zero fill; false=no zero fill -// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space -// size: Font size -// color: Character color -// bColor: Background color -// iNum: Number of digits -// x/y: Upper-left coordinate -// value: Integer value -void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, - uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, uint16_t value) { - size_t i = 0; - DWIN_Byte(i, 0x14); - // Bit 7: bshow - // Bit 6: 1 = signed; 0 = unsigned number; - // Bit 5: zeroFill - // Bit 4: zeroMode - // Bit 3-0: size - DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); - DWIN_Word(i, color); - DWIN_Word(i, bColor); - DWIN_Byte(i, iNum); - DWIN_Byte(i, 0); // fNum - DWIN_Word(i, x); - DWIN_Word(i, y); - #if 0 - for (char count = 0; count < 8; count++) { - DWIN_Byte(i, value); - value >>= 8; - if (!(value & 0xFF)) break; - } - #else - // Write a big-endian 64 bit integer - const size_t p = i + 1; - for (char count = 8; count--;) { // 7..0 - ++i; - DWIN_SendBuf[p + count] = value; - value >>= 8; - } - #endif - - DWIN_Send(i); -} - -// Draw a floating point number -// bShow: true=display background color; false=don't display background color -// zeroFill: true=zero fill; false=no zero fill -// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space -// size: Font size -// color: Character color -// bColor: Background color -// iNum: Number of whole digits -// fNum: Number of decimal digits -// x/y: Upper-left point -// value: Float value -void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, - uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { - //uint8_t *fvalue = (uint8_t*)&value; - size_t i = 0; - DWIN_Byte(i, 0x14); - DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); - DWIN_Word(i, color); - DWIN_Word(i, bColor); - DWIN_Byte(i, iNum); - DWIN_Byte(i, fNum); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Long(i, value); - /* - DWIN_Byte(i, fvalue[3]); - DWIN_Byte(i, fvalue[2]); - DWIN_Byte(i, fvalue[1]); - DWIN_Byte(i, fvalue[0]); - */ - DWIN_Send(i); -} - -/*---------------------------------------- Picture related functions ----------------------------------------*/ - -// Draw JPG and cached in #0 virtual display area -// id: Picture ID -void DWIN_JPG_ShowAndCache(const uint8_t id) { - size_t i = 0; - DWIN_Word(i, 0x2200); - DWIN_Byte(i, id); - DWIN_Send(i); // AA 23 00 00 00 00 08 00 01 02 03 CC 33 C3 3C -} - -// Draw an Icon -// libID: Icon library ID -// picID: Icon ID -// x/y: Upper-left point -void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { - NOMORE(x, DWIN_WIDTH - 1); - NOMORE(y, DWIN_HEIGHT - 1); // -- ozy -- srl - size_t i = 0; - DWIN_Byte(i, 0x23); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Byte(i, 0x80 | libID); - DWIN_Byte(i, picID); - DWIN_Send(i); -} - -// Unzip the JPG picture to a virtual display area -// n: Cache index -// id: Picture ID -void DWIN_JPG_CacheToN(uint8_t n, uint8_t id) { - size_t i = 0; - DWIN_Byte(i, 0x25); - DWIN_Byte(i, n); - DWIN_Byte(i, id); - DWIN_Send(i); -} - -// Copy area from virtual display area to current screen -// cacheID: virtual area number -// xStart/yStart: Upper-left of virtual area -// xEnd/yEnd: Lower-right of virtual area -// x/y: Screen paste point -void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, - uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y) { - size_t i = 0; - DWIN_Byte(i, 0x27); - DWIN_Byte(i, 0x80 | cacheID); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Send(i); -} - -// Animate a series of icons -// animID: Animation ID; 0x00-0x0F -// animate: true on; false off; -// libID: Icon library ID -// picIDs: Icon starting ID -// picIDe: Icon ending ID -// x/y: Upper-left point -// interval: Display time interval, unit 10mS -void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval) { - NOMORE(x, DWIN_WIDTH - 1); - NOMORE(y, DWIN_HEIGHT - 1); // -- ozy -- srl - size_t i = 0; - DWIN_Byte(i, 0x28); - DWIN_Word(i, x); - DWIN_Word(i, y); - // Bit 7: animation on or off - // Bit 6: start from begin or end - // Bit 5-4: unused (0) - // Bit 3-0: animID - DWIN_Byte(i, (animate * 0x80) | 0x40 | animID); - DWIN_Byte(i, libID); - DWIN_Byte(i, picIDs); - DWIN_Byte(i, picIDe); - DWIN_Byte(i, interval); - DWIN_Send(i); -} - -// Animation Control -// state: 16 bits, each bit is the state of an animation id -void DWIN_ICON_AnimationControl(uint16_t state) { - size_t i = 0; - DWIN_Byte(i, 0x28); - DWIN_Word(i, state); - DWIN_Send(i); -} - -/*---------------------------------------- Memory functions ----------------------------------------*/ -// The LCD has an additional 32KB SRAM and 16KB Flash - -// Data can be written to the sram and save to one of the jpeg page files - -// Write Data Memory -// command 0x31 -// Type: Write memory selection; 0x5A=SRAM; 0xA5=Flash -// Address: Write data memory address; 0x000-0x7FFF for SRAM; 0x000-0x3FFF for Flash -// Data: data -// -// Flash writing returns 0xA5 0x4F 0x4B - -// Read Data Memory -// command 0x32 -// Type: Read memory selection; 0x5A=SRAM; 0xA5=Flash -// Address: Read data memory address; 0x000-0x7FFF for SRAM; 0x000-0x3FFF for Flash -// Length: leangth of data to read; 0x01-0xF0 -// -// Response: -// Type, Address, Length, Data - -// Write Picture Memory -// Write the contents of the 32KB SRAM data memory into the designated image memory space -// Issued: 0x5A, 0xA5, PIC_ID -// Response: 0xA5 0x4F 0x4B -// -// command 0x33 -// 0x5A, 0xA5 -// PicId: Picture Memory location, 0x00-0x0F -// -// Flash writing returns 0xA5 0x4F 0x4B - -#endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/dwin_lcd.h b/Marlin/src/lcd/dwin/dwin_lcd.h deleted file mode 100644 index 9ae6d076d5..0000000000 --- a/Marlin/src/lcd/dwin/dwin_lcd.h +++ /dev/null @@ -1,213 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/******************************************************************************** - * @file dwin_lcd.h - * @author LEO / Creality3D - * @date 2019/07/18 - * @version 2.0.1 - * @brief 迪文屏控制操作函数 - ********************************************************************************/ - -#include - -#define RECEIVED_NO_DATA 0x00 -#define RECEIVED_SHAKE_HAND_ACK 0x01 - -#define FHONE 0xAA - -#define DWIN_SCROLL_UP 2 -#define DWIN_SCROLL_DOWN 3 - -#define DWIN_WIDTH 272 -#define DWIN_HEIGHT 480 - -/*-------------------------------------- System variable function --------------------------------------*/ - -// Handshake (1: Success, 0: Fail) -bool DWIN_Handshake(void); - -// Common DWIN startup -void DWIN_Startup(void); - -// Set the backlight luminance -// luminance: (0x00-0xFF) -void DWIN_Backlight_SetLuminance(const uint8_t luminance); - -// Set screen display direction -// dir: 0=0°, 1=90°, 2=180°, 3=270° -void DWIN_Frame_SetDir(uint8_t dir); - -// Update display -void DWIN_UpdateLCD(void); - -/*---------------------------------------- Drawing functions ----------------------------------------*/ - -// Clear screen -// color: Clear screen color -void DWIN_Frame_Clear(const uint16_t color); - -// Draw a point -// width: point width 0x01-0x0F -// height: point height 0x01-0x0F -// x,y: upper left point -void DWIN_Draw_Point(uint8_t width, uint8_t height, uint16_t x, uint16_t y); - -// Draw a line -// color: Line segment color -// xStart/yStart: Start point -// xEnd/yEnd: End point -void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); - -// Draw a Horizontal line -// color: Line segment color -// xStart/yStart: Start point -// xLength: Line Length -inline void DWIN_Draw_HLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xLength) { - DWIN_Draw_Line(color, xStart, yStart, xStart + xLength - 1, yStart); -} - -// Draw a Vertical line -// color: Line segment color -// xStart/yStart: Start point -// yLength: Line Length -inline void DWIN_Draw_VLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t yLength) { - DWIN_Draw_Line(color, xStart, yStart, xStart, yStart + yLength - 1); -} - -// Draw a rectangle -// mode: 0=frame, 1=fill, 2=XOR fill -// color: Rectangle color -// xStart/yStart: upper left point -// xEnd/yEnd: lower right point -void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, - uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); - -// Draw a box -// mode: 0=frame, 1=fill, 2=XOR fill -// color: Rectangle color -// xStart/yStart: upper left point -// xSize/ySize: box size -inline void DWIN_Draw_Box(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xSize, uint16_t ySize) { - DWIN_Draw_Rectangle(mode, color, xStart, yStart, xStart + xSize - 1, yStart + ySize - 1); -} - -// Move a screen area -// mode: 0, circle shift; 1, translation -// dir: 0=left, 1=right, 2=up, 3=down -// dis: Distance -// color: Fill color -// xStart/yStart: upper left point -// xEnd/yEnd: bottom right point -void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, - uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); - -/*---------------------------------------- Text related functions ----------------------------------------*/ - -// Draw a string -// widthAdjust: true=self-adjust character width; false=no adjustment -// bShow: true=display background color; false=don't display background color -// size: Font size -// color: Character color -// bColor: Background color -// x/y: Upper-left coordinate of the string -// *string: The string -void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, - uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, char *string); - -class __FlashStringHelper; - -inline void DWIN_Draw_String(bool widthAdjust, bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const __FlashStringHelper *title) { - DWIN_Draw_String(widthAdjust, bShow, size, color, bColor, x, y, (char *)title); -} - -// Draw a positive integer -// bShow: true=display background color; false=don't display background color -// zeroFill: true=zero fill; false=no zero fill -// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space -// size: Font size -// color: Character color -// bColor: Background color -// iNum: Number of digits -// x/y: Upper-left coordinate -// value: Integer value -void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, - uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, uint16_t value); - -// Draw a floating point number -// bShow: true=display background color; false=don't display background color -// zeroFill: true=zero fill; false=no zero fill -// zeroMode: 1=leading 0 displayed as 0; 0=leading 0 displayed as a space -// size: Font size -// color: Character color -// bColor: Background color -// iNum: Number of whole digits -// fNum: Number of decimal digits -// x/y: Upper-left point -// value: Float value -void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, - uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); - -/*---------------------------------------- Picture related functions ----------------------------------------*/ - -// Draw JPG and cached in #0 virtual display area -// id: Picture ID -void DWIN_JPG_ShowAndCache(const uint8_t id); - -// Draw an Icon -// libID: Icon library ID -// picID: Icon ID -// x/y: Upper-left point -void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y); - -// Unzip the JPG picture to a virtual display area -// n: Cache index -// id: Picture ID -void DWIN_JPG_CacheToN(uint8_t n, uint8_t id); - -// Unzip the JPG picture to virtual display area #1 -// id: Picture ID -inline void DWIN_JPG_CacheTo1(uint8_t id) { DWIN_JPG_CacheToN(1, id); } - -// Copy area from virtual display area to current screen -// cacheID: virtual area number -// xStart/yStart: Upper-left of virtual area -// xEnd/yEnd: Lower-right of virtual area -// x/y: Screen paste point -void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, - uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y); - -// Animate a series of icons -// animID: Animation ID up to 16 -// animate: animation on or off -// libID: Icon library ID -// picIDs: Icon starting ID -// picIDe: Icon ending ID -// x/y: Upper-left point -// interval: Display time interval, unit 10mS -void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, - uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval); - -// Animation Control -// state: 16 bits, each bit is the state of an animation id -void DWIN_ICON_AnimationControl(uint16_t state); diff --git a/Marlin/src/lcd/dwin/e3v2/README.md b/Marlin/src/lcd/dwin/e3v2/README.md deleted file mode 100644 index 10b05455fd..0000000000 --- a/Marlin/src/lcd/dwin/e3v2/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# DWIN for Creality Ender 3 v2 - -Marlin's Ender 3 v2 support requires the `DWIN_SET` included with the Ender 3 V2 [example configuration](https://github.com/MarlinFirmware/Configurations/tree/bugfix-2.0.x/config/examples/Creality/Ender-3%20V2). - -## Easy Install - -Copy the `DWIN_SET` folder onto a Micro-SD card and insert the card into the slot on the DWIN screen. Cycle the machine and wait for the screen to go from blue to orange. Turn the machine off and remove the SD card. When you turn on the machine the screen will display a "Creality" loading screen. diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp deleted file mode 100644 index 2808749737..0000000000 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ /dev/null @@ -1,3702 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * DWIN by Creality3D - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(DWIN_CREALITY_LCD) - -#include "dwin.h" - -#if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) && DISABLED(PROBE_MANUALLY) - #define HAS_ONESTEP_LEVELING 1 -#endif - -#if ANY(BABYSTEPPING, HAS_BED_PROBE, HAS_WORKSPACE_OFFSET) - #define HAS_ZOFFSET_ITEM 1 -#endif - -#if !HAS_BED_PROBE && ENABLED(BABYSTEPPING) - #define JUST_BABYSTEP 1 -#endif - -#include -#include -#include - -#include "../../fontutils.h" -#include "../../ultralcd.h" - -#include "../../../sd/cardreader.h" - -#include "../../../MarlinCore.h" -#include "../../../core/serial.h" -#include "../../../core/macros.h" -#include "../../../gcode/queue.h" - -#include "../../../module/temperature.h" -#include "../../../module/printcounter.h" -#include "../../../module/motion.h" -#include "../../../module/planner.h" - -#if ENABLED(EEPROM_SETTINGS) - #include "../../../module/settings.h" -#endif - -#if ENABLED(HOST_ACTION_COMMANDS) - #include "../../../feature/host_actions.h" -#endif - -#if HAS_ONESTEP_LEVELING - #include "../../../feature/bedlevel/bedlevel.h" -#endif - -#if HAS_BED_PROBE - #include "../../../module/probe.h" -#endif - -#if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) - #include "../../../feature/babystep.h" -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../feature/powerloss.h" -#endif - -#ifndef MACHINE_SIZE - #define MACHINE_SIZE "220x220x250" -#endif -#ifndef CORP_WEBSITE_C - #define CORP_WEBSITE_C "www.cxsw3d.com" -#endif -#ifndef CORP_WEBSITE_E - #define CORP_WEBSITE_E "www.creality.com" -#endif - -#define PAUSE_HEAT - -#define USE_STRING_HEADINGS - -#define DWIN_FONT_MENU font8x16 -#define DWIN_FONT_STAT font10x20 -#define DWIN_FONT_HEAD font10x20 - -#define MENU_CHAR_LIMIT 24 -#define STATUS_Y 360 - -// Fan speed limit -#define FANON 255 -#define FANOFF 0 - -// Print speed limit -#define MAX_PRINT_SPEED 999 -#define MIN_PRINT_SPEED 10 - -// Temp limits -#if HAS_HOTEND - #define MAX_E_TEMP (HEATER_0_MAXTEMP - (HOTEND_OVERSHOOT)) - #define MIN_E_TEMP HEATER_0_MINTEMP -#endif - -#if HAS_HEATED_BED - #define MIN_BED_TEMP BED_MINTEMP -#endif - -// Feedspeed limit (max feedspeed = DEFAULT_MAX_FEEDRATE * 2) -#define MIN_MAXFEEDSPEED 1 -#define MIN_MAXACCELERATION 1 -#define MIN_MAXJERK 0.1 -#define MIN_STEP 1 - -#define FEEDRATE_E (60) - -// Mininum unit (0.1) : multiple (10) -#define MINUNITMULT 10 - -#define ENCODER_WAIT 20 -#define DWIN_SCROLL_UPDATE_INTERVAL 2000 -#define DWIN_REMAIN_TIME_UPDATE_INTERVAL 20000 - -constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other-than-Back - TITLE_HEIGHT = 30, // Title bar height - MLINE = 53, // Menu line height - LBLX = 60, // Menu item label X - MENU_CHR_W = 8, STAT_CHR_W = 10; - -#define MBASE(L) (49 + MLINE * (L)) - -#define BABY_Z_VAR TERN(HAS_BED_PROBE, probe.offset.z, dwin_zoffset) - -/* Value Init */ -HMI_value_t HMI_ValueStruct; -HMI_Flag_t HMI_flag{0}; - -millis_t dwin_heat_time = 0; - -uint8_t checkkey = 0; - -typedef struct { - uint8_t now, last; - void set(uint8_t v) { now = last = v; } - void reset() { set(0); } - bool changed() { bool c = (now != last); if (c) last = now; return c; } - bool dec() { if (now) now--; return changed(); } - bool inc(uint8_t v) { if (now < (v - 1)) now++; else now = (v - 1); return changed(); } -} select_t; - -select_t select_page{0}, select_file{0}, select_print{0}, select_prepare{0} - , select_control{0}, select_axis{0}, select_temp{0}, select_motion{0}, select_tune{0} - , select_PLA{0}, select_ABS{0} - , select_speed{0} - , select_acc{0} - , select_jerk{0} - , select_step{0} - ; - -uint8_t index_file = MROWS, - index_prepare = MROWS, - index_control = MROWS, - index_leveling = MROWS, - index_tune = MROWS; - -bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home - -constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; -constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; -constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK }; -constexpr float default_axis_steps_per_unit[] = DEFAULT_AXIS_STEPS_PER_UNIT; - -uint8_t Percentrecord = 0; -uint16_t remain_time = 0; - -#if ENABLED(PAUSE_HEAT) - #if HAS_HOTEND - uint16_t temphot = 0; - #endif - #if HAS_HEATED_BED - uint16_t tempbed = 0; - #endif -#endif - -#if HAS_ZOFFSET_ITEM - float dwin_zoffset = 0, last_zoffset = 0; -#endif - -#define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) - // BL24CXX::check() uses 0x00 - -inline bool HMI_IsChinese() { return HMI_flag.language == DWIN_CHINESE; } - -void HMI_SetLanguageCache() { - DWIN_JPG_CacheTo1(HMI_IsChinese() ? Language_Chinese : Language_English); -} - -void HMI_SetLanguage() { - #if ENABLED(EEPROM_SETTINGS) - BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); - #endif - HMI_SetLanguageCache(); -} - -void HMI_ToggleLanguage() { - HMI_flag.language = HMI_IsChinese() ? DWIN_ENGLISH : DWIN_CHINESE; - HMI_SetLanguageCache(); - #if ENABLED(EEPROM_SETTINGS) - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); - #endif -} - -void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value) { - if (value < 0) { - DWIN_Draw_String(false, true, size, Color_White, bColor, x - 6, y, F("-")); - DWIN_Draw_FloatValue(true, true, 0, size, Color_White, bColor, iNum, fNum, x, y, -value); - } - else { - DWIN_Draw_String(false, true, size, Color_White, bColor, x - 6, y, F(" ")); - DWIN_Draw_FloatValue(true, true, 0, size, Color_White, bColor, iNum, fNum, x, y, value); - } -} - -void ICON_Print() { - if (select_page.now == 0) { - DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130); - DWIN_Draw_Rectangle(0, Color_White, 17, 130, 126, 229); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 58, 201); - else - DWIN_Frame_AreaCopy(1, 1, 451, 31, 463, 57, 201); - } - else { - DWIN_ICON_Show(ICON, ICON_Print_0, 17, 130); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 58, 201); - else - DWIN_Frame_AreaCopy(1, 1, 423, 31, 435, 57, 201); - } -} - -void ICON_Prepare() { - if (select_page.now == 1) { - DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); - DWIN_Draw_Rectangle(0, Color_White, 145, 130, 254, 229); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 31, 447, 58, 460, 186, 201); - else - DWIN_Frame_AreaCopy(1, 33, 451, 82, 466, 175, 201); - } - else { - DWIN_ICON_Show(ICON, ICON_Prepare_0, 145, 130); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 31, 405, 58, 420, 186, 201); - else - DWIN_Frame_AreaCopy(1, 33, 423, 82, 438, 175, 201); - } -} - -void ICON_Control() { - if (select_page.now == 2) { - DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); - DWIN_Draw_Rectangle(0, Color_White, 17, 246, 126, 345); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 61, 447, 88, 460, 58, 318); - else - DWIN_Frame_AreaCopy(1, 85, 451, 132, 463, 48, 318); - } - else { - DWIN_ICON_Show(ICON, ICON_Control_0, 17, 246); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 61, 405, 88, 420, 58, 318); - else - DWIN_Frame_AreaCopy(1, 85, 423, 132, 434, 48, 318); - } -} - -void ICON_StartInfo(bool show) { - if (show) { - DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); - DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 91, 447, 118, 460, 186, 318); - else - DWIN_Frame_AreaCopy(1, 132, 451, 159, 466, 186, 318); - } - else { - DWIN_ICON_Show(ICON, ICON_Info_0, 145, 246); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 91, 405, 118, 420, 186, 318); - else - DWIN_Frame_AreaCopy(1, 132, 423, 159, 435, 186, 318); - } -} - -void ICON_Leveling(bool show) { - if (show) { - DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); - DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 211, 447, 238, 460, 186, 318); - else - DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 182, 318); - } - else { - DWIN_ICON_Show(ICON, ICON_Leveling_0, 145, 246); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 211, 405, 238, 420, 186, 318); - else - DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 182, 318); - } -} - -void ICON_Tune() { - if (select_print.now == 0) { - DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); - DWIN_Draw_Rectangle(0, Color_White, 8, 252, 87, 351); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 121, 447, 148, 458, 34, 325); - else - DWIN_Frame_AreaCopy(1, 0, 466, 34, 476, 31, 325); - } - else { - DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 121, 405, 148, 420, 34, 325); - else - DWIN_Frame_AreaCopy(1, 0, 438, 32, 448, 31, 325); - } -} - -void ICON_Pause() { - if (select_print.now == 1) { - DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); - DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 181, 447, 208, 459, 124, 325); - else - DWIN_Frame_AreaCopy(1, 177, 451, 216, 462, 116, 325); - } - else { - DWIN_ICON_Show(ICON, ICON_Pause_0, 96, 252); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 181, 405, 208, 420, 124, 325); - else - DWIN_Frame_AreaCopy(1, 177, 423, 215, 433, 116, 325); - } -} - -void ICON_Continue() { - if (select_print.now == 1) { - DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); - DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 124, 325); - else - DWIN_Frame_AreaCopy(1, 1, 452, 32, 464, 121, 325); - } - else { - DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 124, 325); - else - DWIN_Frame_AreaCopy(1, 1, 424, 31, 434, 121, 325); - } -} - -void ICON_Stop() { - if (select_print.now == 2) { - DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); - DWIN_Draw_Rectangle(0, Color_White, 184, 252, 263, 351); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 151, 447, 178, 459, 210, 325); - else - DWIN_Frame_AreaCopy(1, 218, 452, 249, 466, 209, 325); - } - else { - DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252); - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 151, 405, 178, 420, 210, 325); - else - DWIN_Frame_AreaCopy(1, 218, 423, 247, 436, 209, 325); - } -} - -inline void Clear_Title_Bar() { - DWIN_Draw_Rectangle(1, Color_Bg_Blue, 0, 0, DWIN_WIDTH, 30); -} - -inline void Draw_Title(const char * const title) { - DWIN_Draw_String(false, false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, (char*)title); -} - -inline void Draw_Title(const __FlashStringHelper * title) { - DWIN_Draw_String(false, false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, (char*)title); -} - -inline void Clear_Menu_Area() { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y); -} - -inline void Clear_Main_Window() { - Clear_Title_Bar(); - Clear_Menu_Area(); -} - -inline void Clear_Popup_Area() { - Clear_Title_Bar(); - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); -} - -void Draw_Popup_Bkgd_105() { - DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 105, 258, 374); -} - -inline void Draw_More_Icon(const uint8_t line) { - DWIN_ICON_Show(ICON, ICON_More, 226, MBASE(line) - 3); -} - -inline void Draw_Menu_Cursor(const uint8_t line) { - // DWIN_ICON_Show(ICON,ICON_Rectangle, 0, MBASE(line) - 18); - DWIN_Draw_Rectangle(1, Rectangle_Color, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); -} - -inline void Erase_Menu_Cursor(const uint8_t line) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); -} - -inline void Move_Highlight(const int16_t from, const uint16_t newline) { - Erase_Menu_Cursor(newline - from); - Draw_Menu_Cursor(newline); -} - -inline void Add_Menu_Line() { - Move_Highlight(1, MROWS); - DWIN_Draw_Line(Line_Color, 16, MBASE(MROWS + 1) - 20, 256, MBASE(MROWS + 1) - 19); -} - -inline void Scroll_Menu(const uint8_t dir) { - DWIN_Frame_AreaMove(1, dir, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); - switch (dir) { - case DWIN_SCROLL_DOWN: Move_Highlight(-1, 0); break; - case DWIN_SCROLL_UP: Add_Menu_Line(); break; - } -} - -inline uint16_t nr_sd_menu_items() { - return card.get_num_Files() + !card.flag.workDirIsRoot; -} - -inline void Draw_Menu_Icon(const uint8_t line, const uint8_t icon) { - DWIN_ICON_Show(ICON, icon, 26, MBASE(line) - 3); -} - -inline void Erase_Menu_Text(const uint8_t line) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, LBLX, MBASE(line) - 14, 271, MBASE(line) + 28); -} - -inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr) { - if (label) DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(line) - 1, (char*)label); - if (icon) Draw_Menu_Icon(line, icon); - DWIN_Draw_Line(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); -} - -// The "Back" label is always on the first line -inline void Draw_Back_Label() { - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 129, 72, 156, 84, LBLX, MBASE(0)); - else - DWIN_Frame_AreaCopy(1, 226, 179, 256, 189, LBLX, MBASE(0)); -} - -// Draw "Back" line at the top -inline void Draw_Back_First(const bool is_sel=true) { - Draw_Menu_Line(0, ICON_Back); - Draw_Back_Label(); - if (is_sel) Draw_Menu_Cursor(0); -} - -inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valref) { - if (encoder_diffState == ENCODER_DIFF_CW) - valref += EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_CCW) - valref -= EncoderRate.encoderMoveValue; - else if (encoder_diffState == ENCODER_DIFF_ENTER) - return true; - return false; -} - -// -// Draw Menus -// - -#define MOTION_CASE_RATE 1 -#define MOTION_CASE_ACCEL 2 -#define MOTION_CASE_JERK (MOTION_CASE_ACCEL + ENABLED(HAS_CLASSIC_JERK)) -#define MOTION_CASE_STEPS (MOTION_CASE_JERK + 1) -#define MOTION_CASE_TOTAL MOTION_CASE_STEPS - -#define PREPARE_CASE_MOVE 1 -#define PREPARE_CASE_DISA 2 -#define PREPARE_CASE_HOME 3 -#define PREPARE_CASE_ZOFF (PREPARE_CASE_HOME + ENABLED(HAS_ZOFFSET_ITEM)) -#define PREPARE_CASE_PLA (PREPARE_CASE_ZOFF + ENABLED(HAS_HOTEND)) -#define PREPARE_CASE_ABS (PREPARE_CASE_PLA + ENABLED(HAS_HOTEND)) -#define PREPARE_CASE_COOL (PREPARE_CASE_ABS + EITHER(HAS_HOTEND, HAS_HEATED_BED)) -#define PREPARE_CASE_LANG (PREPARE_CASE_COOL + 1) -#define PREPARE_CASE_TOTAL PREPARE_CASE_LANG - -#define CONTROL_CASE_TEMP 1 -#define CONTROL_CASE_MOVE (CONTROL_CASE_TEMP + 1) -#define CONTROL_CASE_SAVE (CONTROL_CASE_MOVE + ENABLED(EEPROM_SETTINGS)) -#define CONTROL_CASE_LOAD (CONTROL_CASE_SAVE + ENABLED(EEPROM_SETTINGS)) -#define CONTROL_CASE_RESET (CONTROL_CASE_LOAD + ENABLED(EEPROM_SETTINGS)) -#define CONTROL_CASE_INFO (CONTROL_CASE_RESET + 1) -#define CONTROL_CASE_TOTAL CONTROL_CASE_INFO - -#define TUNE_CASE_SPEED 1 -#define TUNE_CASE_TEMP (TUNE_CASE_SPEED + ENABLED(HAS_HOTEND)) -#define TUNE_CASE_BED (TUNE_CASE_TEMP + ENABLED(HAS_HEATED_BED)) -#define TUNE_CASE_FAN (TUNE_CASE_BED + ENABLED(HAS_FAN)) -#define TUNE_CASE_ZOFF (TUNE_CASE_FAN + ENABLED(HAS_ZOFFSET_ITEM)) -#define TUNE_CASE_TOTAL TUNE_CASE_ZOFF - -#define TEMP_CASE_TEMP (0 + ENABLED(HAS_HOTEND)) -#define TEMP_CASE_BED (TEMP_CASE_TEMP + ENABLED(HAS_HEATED_BED)) -#define TEMP_CASE_FAN (TEMP_CASE_BED + ENABLED(HAS_FAN)) -#define TEMP_CASE_PLA (TEMP_CASE_FAN + ENABLED(HAS_HOTEND)) -#define TEMP_CASE_ABS (TEMP_CASE_PLA + ENABLED(HAS_HOTEND)) -#define TEMP_CASE_TOTAL TEMP_CASE_ABS - -#define PREHEAT_CASE_TEMP (0 + ENABLED(HAS_HOTEND)) -#define PREHEAT_CASE_BED (PREHEAT_CASE_TEMP + ENABLED(HAS_HEATED_BED)) -#define PREHEAT_CASE_FAN (PREHEAT_CASE_BED + ENABLED(HAS_FAN)) -#define PREHEAT_CASE_SAVE (PREHEAT_CASE_FAN + ENABLED(EEPROM_SETTINGS)) -#define PREHEAT_CASE_TOTAL PREHEAT_CASE_SAVE - -// -// Draw Menus -// - -inline void draw_move_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 69, 61, 102, 71, LBLX, line); // "Move" -} - -inline void DWIN_Frame_TitleCopy(uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { DWIN_Frame_AreaCopy(id, x1, y1, x2, y2, 14, 8); } - -inline void Item_Prepare_Move(const uint8_t row) { - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 159, 70, 200, 84, LBLX, MBASE(row)); - else - draw_move_en(MBASE(row)); // "Move >" - Draw_Menu_Line(row, ICON_Axis); - Draw_More_Icon(row); -} - -inline void Item_Prepare_Disable(const uint8_t row) { - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 204, 70, 259, 82, LBLX, MBASE(row)); - else - DWIN_Frame_AreaCopy(1, 103, 59, 200, 74, LBLX, MBASE(row)); // "Disable Stepper" - Draw_Menu_Line(row, ICON_CloseMotor); -} - -inline void Item_Prepare_Home(const uint8_t row) { - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 0, 89, 41, 101, LBLX, MBASE(row)); - else - DWIN_Frame_AreaCopy(1, 202, 61, 271, 71, LBLX, MBASE(row)); // "Auto Home" - Draw_Menu_Line(row, ICON_Homing); -} - -#if HAS_ZOFFSET_ITEM - - inline void Item_Prepare_Offset(const uint8_t row) { - if (HMI_IsChinese()) { - #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); - #else - DWIN_Frame_AreaCopy(1, 43, 89, 98, 101, LBLX, MBASE(row)); - #endif - } - else { - #if HAS_BED_PROBE - DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); - #else - DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." - #endif - } - Draw_Menu_Line(row, ICON_SetHome); - } - -#endif - -#if HAS_HOTEND - inline void Item_Prepare_PLA(const uint8_t row) { - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 100, 89, 151, 101, LBLX, MBASE(row)); - } - else { - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(row)); // "PLA" - } - Draw_Menu_Line(row, ICON_PLAPreheat); - } - - inline void Item_Prepare_ABS(const uint8_t row) { - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 180, 89, 233, 100, LBLX, MBASE(row)); - } - else { - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(row)); // "ABS" - } - Draw_Menu_Line(row, ICON_ABSPreheat); - } -#endif - -#if HAS_PREHEAT - inline void Item_Prepare_Cool(const uint8_t row) { - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row)); - else - DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" - Draw_Menu_Line(row, ICON_Cool); - } -#endif - -inline void Item_Prepare_Lang(const uint8_t row) { - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 239, 134, 266, 146, LBLX, MBASE(row)); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("CN")); - } - else { - DWIN_Frame_AreaCopy(1, 0, 194, 121, 207, LBLX, MBASE(row)); // "Language selection" - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("EN")); - } - Draw_Menu_Icon(row, ICON_Language); -} - -inline void Draw_Prepare_Menu() { - Clear_Main_Window(); - - const int16_t scroll = MROWS - index_prepare; // Scrolled-up lines - #define PSCROL(L) (scroll + (L)) - #define PVISI(L) WITHIN(PSCROL(L), 0, MROWS) - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 133, 1, 160, 13); // "Prepare" - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_PREPARE)); - #else - DWIN_Frame_TitleCopy(1, 178, 2, 229, 14); // "Prepare" - #endif - } - - if (PVISI(0)) Draw_Back_First(select_prepare.now == 0); // < Back - if (PVISI(PREPARE_CASE_MOVE)) Item_Prepare_Move(PSCROL(PREPARE_CASE_MOVE)); // Move > - if (PVISI(PREPARE_CASE_DISA)) Item_Prepare_Disable(PSCROL(PREPARE_CASE_DISA)); // Disable Stepper - if (PVISI(PREPARE_CASE_HOME)) Item_Prepare_Home(PSCROL(PREPARE_CASE_HOME)); // Auto Home - #if HAS_ZOFFSET_ITEM - if (PVISI(PREPARE_CASE_ZOFF)) Item_Prepare_Offset(PSCROL(PREPARE_CASE_ZOFF)); // Edit Z-Offset / Babystep / Set Home Offset - #endif - #if HAS_HOTEND - if (PVISI(PREPARE_CASE_PLA)) Item_Prepare_PLA(PSCROL(PREPARE_CASE_PLA)); // Preheat PLA - if (PVISI(PREPARE_CASE_ABS)) Item_Prepare_ABS(PSCROL(PREPARE_CASE_ABS)); // Preheat ABS - #endif - #if HAS_PREHEAT - if (PVISI(PREPARE_CASE_COOL)) Item_Prepare_Cool(PSCROL(PREPARE_CASE_COOL)); // Cooldown - #endif - if (PVISI(PREPARE_CASE_LANG)) Item_Prepare_Lang(PSCROL(PREPARE_CASE_LANG)); // Language CN/EN - - if (select_prepare.now) Draw_Menu_Cursor(PSCROL(select_prepare.now)); -} - -inline void Draw_Control_Menu() { - Clear_Main_Window(); - - #if CONTROL_CASE_TOTAL >= 6 - const int16_t scroll = MROWS - index_control; // Scrolled-up lines - #define CSCROL(L) (scroll + (L)) - #else - #define CSCROL(L) (L) - #endif - #define CLINE(L) MBASE(CSCROL(L)) - #define CVISI(L) WITHIN(CSCROL(L), 0, MROWS) - - if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 103, 1, 130, 14); // "Control" - - DWIN_Frame_AreaCopy(1, 57, 104, 84, 116, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > - DWIN_Frame_AreaCopy(1, 87, 104, 114, 116, LBLX, CLINE(CONTROL_CASE_MOVE)); // Motion > - - #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 117, 104, 172, 116, LBLX, CLINE(CONTROL_CASE_SAVE)); // Store Configuration - DWIN_Frame_AreaCopy(1, 174, 103, 229, 116, LBLX, CLINE(CONTROL_CASE_LOAD)); // Read Configuration - DWIN_Frame_AreaCopy(1, 1, 118, 56, 131, LBLX, CLINE(CONTROL_CASE_RESET)); // Reset Configuration - #endif - - if (CVISI(CONTROL_CASE_INFO)) - DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, CLINE(CONTROL_CASE_TEMP)); // Info > - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_CONTROL)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); - #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); - #endif - if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_INFO), F("Info")); - #else - DWIN_Frame_TitleCopy(1, 128, 2, 176, 12); // "Control" - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > - DWIN_Frame_AreaCopy(1, 84, 89, 128, 99, LBLX, CLINE(CONTROL_CASE_MOVE)); // Motion > - #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 148, 89, 268, 101, LBLX , CLINE(CONTROL_CASE_SAVE // "Store Configuration" - DWIN_Frame_AreaCopy(1, 26, 104, 57, 114, LBLX , CLINE(CONTROL_CASE_LOAD)); // "Read" - DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 34, CLINE(CONTROL_CASE_LOAD)); // "Configuration" - DWIN_Frame_AreaCopy(1, 59, 104, 93, 114, LBLX , CLINE(CONTROL_CASE_RESET)); // "Reset" - DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 37, CLINE(CONTROL_CASE_RESET)); // "Configuration" - #endif - if (CVISI(CONTROL_CASE_INFO)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(CONTROL_CASE_INFO)); // Info > - #endif - } - - if (select_control.now && CVISI(select_control.now)) - Draw_Menu_Cursor(CSCROL(select_control.now)); - - // Draw icons and lines - uint8_t i = 0; - #define _TEMP_ICON(N) do{ ++i; if (CVISI(i)) Draw_Menu_Line(CSCROL(i), ICON_Temperature + (N) - 1); }while(0) - - _TEMP_ICON(CONTROL_CASE_TEMP); - if (CVISI(i)) Draw_More_Icon(CSCROL(i)); - - _TEMP_ICON(CONTROL_CASE_MOVE); - Draw_More_Icon(CSCROL(i)); - - #if ENABLED(EEPROM_SETTINGS) - _TEMP_ICON(CONTROL_CASE_SAVE); - _TEMP_ICON(CONTROL_CASE_LOAD); - _TEMP_ICON(CONTROL_CASE_RESET); - #endif - - _TEMP_ICON(CONTROL_CASE_INFO); - if (CVISI(CONTROL_CASE_INFO)) Draw_More_Icon(CSCROL(i)); -} - -inline void Draw_Tune_Menu() { - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 73, 2, 100, 13, 14, 9); - DWIN_Frame_AreaCopy(1, 116, 164, 171, 176, LBLX, MBASE(TUNE_CASE_SPEED)); - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(TUNE_CASE_TEMP)); - #endif - #if HAS_HEATED_BED - DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(TUNE_CASE_BED)); - #endif - #if HAS_FAN - DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(TUNE_CASE_FAN)); - #endif - #if HAS_ZOFFSET_ITEM - DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(TUNE_CASE_ZOFF)); - #endif - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_TUNE)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_SPEED), GET_TEXT_F(MSG_SPEED)); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - #endif - #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - #endif - #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); - #endif - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_ZOFF), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); - #else - DWIN_Frame_AreaCopy(1, 94, 2, 126, 12, 14, 9); - DWIN_Frame_AreaCopy(1, 1, 179, 92, 190, LBLX, MBASE(TUNE_CASE_SPEED)); // Print speed - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(TUNE_CASE_TEMP)); // Hotend... - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(TUNE_CASE_TEMP)); // ...Temperature - #endif - #if HAS_HEATED_BED - DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(TUNE_CASE_BED)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(TUNE_CASE_BED)); // ...Temperature - #endif - #if HAS_FAN - DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(TUNE_CASE_FAN)); // Fan speed - #endif - #if HAS_ZOFFSET_ITEM - DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(TUNE_CASE_ZOFF)); // Z-offset - #endif - #endif - } - - Draw_Back_First(select_tune.now == 0); - if (select_tune.now) Draw_Menu_Cursor(select_tune.now); - - Draw_Menu_Line(TUNE_CASE_SPEED, ICON_Speed); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_SPEED), feedrate_percentage); - - #if HAS_HOTEND - Draw_Menu_Line(TUNE_CASE_TEMP, ICON_HotendTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP), thermalManager.temp_hotend[0].target); - #endif - #if HAS_HEATED_BED - Draw_Menu_Line(TUNE_CASE_BED, ICON_BedTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED), thermalManager.temp_bed.target); - #endif - #if HAS_FAN - Draw_Menu_Line(TUNE_CASE_FAN, ICON_FanSpeed); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_FAN), thermalManager.fan_speed[0]); - #endif - #if HAS_ZOFFSET_ITEM - Draw_Menu_Line(TUNE_CASE_ZOFF, ICON_Zoffset); - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(TUNE_CASE_ZOFF), BABY_Z_VAR * 100); - #endif -} - -inline void draw_max_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 245, 119, 269, 129, LBLX, line); // "Max" -} -inline void draw_max_accel_en(const uint16_t line) { - draw_max_en(line); - DWIN_Frame_AreaCopy(1, 1, 135, 79, 145, LBLX + 27, line); // "Acceleration" -} -inline void draw_speed_en(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 184, 119, 224, 132, LBLX + inset, line); // "Speed" -} -inline void draw_jerk_en(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 64, 119, 106, 129, LBLX + 27, line); // "Jerk" -} -inline void draw_steps_per_mm(const uint16_t line) { - DWIN_Frame_AreaCopy(1, 1, 151, 101, 161, LBLX, line); // "Steps-per-mm" -} -inline void say_x(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 95, 104, 102, 114, LBLX + inset, line); // "X" -} -inline void say_y(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 104, 104, 110, 114, LBLX + inset, line); // "Y" -} -inline void say_z(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 112, 104, 120, 114, LBLX + inset, line); // "Z" -} -inline void say_e(const uint16_t inset, const uint16_t line) { - DWIN_Frame_AreaCopy(1, 237, 119, 244, 129, LBLX + inset, line); // "E" -} - -inline void Draw_Motion_Menu() { - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Motion" - DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, MBASE(MOTION_CASE_RATE)); // Max speed - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(MOTION_CASE_ACCEL)); // Max... - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(MOTION_CASE_ACCEL) + 1); // ...Acceleration - #if HAS_CLASSIC_JERK - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(MOTION_CASE_JERK)); // Max... - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(MOTION_CASE_JERK) + 1); // ... - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 54, MBASE(MOTION_CASE_JERK)); // ...Jerk - #endif - DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(MOTION_CASE_STEPS)); // Flow ratio - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_MOTION)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_RATE), F("Feedrate")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_ACCEL), GET_TEXT_F(MSG_ACCELERATION)); - #if HAS_CLASSIC_JERK - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_JERK), GET_TEXT_F(MSG_JERK)); - #endif - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_STEPS), GET_TEXT_F(MSG_STEPS_PER_MM)); - #else - DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Motion" - draw_max_en(MBASE(MOTION_CASE_RATE)); draw_speed_en(27, MBASE(MOTION_CASE_RATE)); // "Max Speed" - draw_max_accel_en(MBASE(MOTION_CASE_ACCEL)); // "Max Acceleration" - #if HAS_CLASSIC_JERK - draw_max_en(MBASE(MOTION_CASE_JERK)); draw_jerk_en(MBASE(MOTION_CASE_JERK)); // "Max Jerk" - #endif - draw_steps_per_mm(MBASE(MOTION_CASE_STEPS)); // "Steps-per-mm" - #endif - } - - Draw_Back_First(select_motion.now == 0); - if (select_motion.now) Draw_Menu_Cursor(select_motion.now); - - uint8_t i = 0; - #define _MOTION_ICON(N) Draw_Menu_Line(++i, ICON_MaxSpeed + (N) - 1) - _MOTION_ICON(MOTION_CASE_RATE); Draw_More_Icon(i); - _MOTION_ICON(MOTION_CASE_ACCEL); Draw_More_Icon(i); - #if HAS_CLASSIC_JERK - _MOTION_ICON(MOTION_CASE_JERK); Draw_More_Icon(i); - #endif - _MOTION_ICON(MOTION_CASE_STEPS); Draw_More_Icon(i); -} - -// -// Draw Popup Windows -// -#if HAS_HOTEND || HAS_HEATED_BED - - void DWIN_Popup_Temperature(const bool toohigh) { - Clear_Popup_Area(); - Draw_Popup_Bkgd_105(); - if (toohigh) { - DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 103, 371, 237, 386, 52, 285); - DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); - DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); - } - else { - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too high")); - } - } - else { - DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 103, 371, 270, 386, 52, 285); - DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); - } - else { - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too low")); - } - } - } - -#endif - -inline void Draw_Popup_Bkgd_60() { - DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 60, 258, 330); -} - -#if HAS_HOTEND - - void Popup_Window_ETempTooLow() { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 103, 371, 136, 386, 69, 240); - DWIN_Frame_AreaCopy(1, 170, 371, 270, 386, 102, 240); - DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); - } - else { - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 20, 235, F("Nozzle is too cold")); - DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280); - } - } - -#endif - -void Popup_Window_Resume() { - Clear_Popup_Area(); - Draw_Popup_Bkgd_105(); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 160, 338, 235, 354, 98, 135); - DWIN_Frame_AreaCopy(1, 103, 321, 271, 335, 52, 192); - DWIN_ICON_Show(ICON, ICON_Cancel_C, 26, 307); - DWIN_ICON_Show(ICON, ICON_Continue_C, 146, 307); - } - else { - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 14) / 2, 115, F("Continue Print")); - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 192, F("It looks like the last")); - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 212, F("file was interrupted.")); - DWIN_ICON_Show(ICON, ICON_Cancel_E, 26, 307); - DWIN_ICON_Show(ICON, ICON_Continue_E, 146, 307); - } -} - -void Popup_Window_Home(const bool parking/*=false*/) { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - DWIN_ICON_Show(ICON, ICON_BLTouch, 101, 105); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 0, 371, 33, 386, 85, 240); - DWIN_Frame_AreaCopy(1, 203, 286, 271, 302, 118, 240); - DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); - } - else { - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * (parking ? 7 : 10)) / 2, 230, parking ? F("Parking") : F("Homing XYZ")); - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); - } -} - -#if HAS_ONESTEP_LEVELING - - void Popup_Window_Leveling() { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - DWIN_ICON_Show(ICON, ICON_AutoLeveling, 101, 105); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 0, 371, 100, 386, 84, 240); - DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); - } - else { - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 13) / 2, 230, GET_TEXT_F(MSG_BED_LEVELING)); - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); - } - } - -#endif - -void Draw_Select_Highlight(const bool sel) { - HMI_flag.select_flag = sel; - const uint16_t c1 = sel ? Select_Color : Color_Bg_Window, - c2 = sel ? Color_Bg_Window : Select_Color; - DWIN_Draw_Rectangle(0, c1, 25, 279, 126, 318); - DWIN_Draw_Rectangle(0, c1, 24, 278, 127, 319); - DWIN_Draw_Rectangle(0, c2, 145, 279, 246, 318); - DWIN_Draw_Rectangle(0, c2, 144, 278, 247, 319); -} - -void Popup_window_PauseOrStop() { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - if (HMI_IsChinese()) { - if (select_print.now == 1) DWIN_Frame_AreaCopy(1, 237, 338, 269, 356, 98, 150); - else if (select_print.now == 2) DWIN_Frame_AreaCopy(1, 221, 320, 253, 336, 98, 150); - DWIN_Frame_AreaCopy(1, 220, 304, 264, 319, 130, 150); - DWIN_ICON_Show(ICON, ICON_Confirm_C, 26, 280); - DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 280); - } - else { - if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 11) / 2, 150, GET_TEXT_F(MSG_PAUSE_PRINT)); - else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 10) / 2, 150, GET_TEXT_F(MSG_STOP_PRINT)); - DWIN_ICON_Show(ICON, ICON_Confirm_E, 26, 280); - DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 280); - } - Draw_Select_Highlight(true); -} - -void Draw_Printing_Screen() { - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 30, 1, 71, 14, 14, 9); // Tune - DWIN_Frame_AreaCopy(1, 0, 72, 63, 86, 41, 188); // Pause - DWIN_Frame_AreaCopy(1, 65, 72, 128, 86, 176, 188); // Stop - } - else { - DWIN_Frame_AreaCopy(1, 40, 2, 92, 14, 14, 9); // Tune - DWIN_Frame_AreaCopy(1, 0, 44, 96, 58, 41, 188); // Pause - DWIN_Frame_AreaCopy(1, 98, 44, 152, 58, 176, 188); // Stop - } -} - -void Draw_Print_ProgressBar() { - DWIN_ICON_Show(ICON, ICON_Bar, 15, 93); - DWIN_Draw_Rectangle(1, BarFill_Color, 16 + Percentrecord * 240 / 100, 93, 256, 113); - DWIN_Draw_IntValue(true, true, 0, font8x16, Percent_Color, Color_Bg_Black, 2, 117, 133, Percentrecord); - DWIN_Draw_String(false, false, font8x16, Percent_Color, Color_Bg_Black, 133, 133, F("%")); -} - -void Draw_Print_ProgressElapsed() { - duration_t elapsed = print_job_timer.duration(); // print timer - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 42, 212, elapsed.value / 3600); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 58, 212, F(":")); - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 66, 212, (elapsed.value % 3600) / 60); -} - -void Draw_Print_ProgressRemain() { - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 176, 212, remain_time / 3600); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 192, 212, F(":")); - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 200, 212, (remain_time % 3600) / 60); -} - -void Goto_PrintProcess() { - checkkey = PrintProcess; - - Clear_Main_Window(); - Draw_Printing_Screen(); - - ICON_Tune(); - if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); - ICON_Stop(); - - // Copy into filebuf string before entry - char * const name = card.longest_filename(); - const int8_t npos = _MAX(0U, DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2; - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, npos, 60, name); - - DWIN_ICON_Show(ICON, ICON_PrintTime, 17, 193); - DWIN_ICON_Show(ICON, ICON_RemainTime, 150, 191); - - Draw_Print_ProgressBar(); - Draw_Print_ProgressElapsed(); - Draw_Print_ProgressRemain(); -} - -void Goto_MainMenu() { - checkkey = MainMenu; - - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 2, 2, 27, 14, 14, 9); // "Home" - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_MAIN)); - #else - DWIN_Frame_AreaCopy(1, 0, 2, 39, 12, 14, 9); - #endif - } - - DWIN_ICON_Show(ICON, ICON_LOGO, 71, 52); - - ICON_Print(); - ICON_Prepare(); - ICON_Control(); - TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(select_page.now == 3); -} - -inline ENCODER_DiffState get_encoder_state() { - static millis_t Encoder_ms = 0; - const millis_t ms = millis(); - if (PENDING(ms, Encoder_ms)) return ENCODER_DIFF_NO; - const ENCODER_DiffState state = Encoder_ReceiveAnalyze(); - if (state != ENCODER_DIFF_NO) Encoder_ms = ms + ENCODER_WAIT; - return state; -} - -void HMI_Move_X() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_X_scale)) { - checkkey = AxisMove; - EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); - if (!planner.is_full()) { - // Wait for planner moves to finish! - planner.synchronize(); - planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_XY), active_extruder); - } - DWIN_UpdateLCD(); - return; - } - NOLESS(HMI_ValueStruct.Move_X_scale, (X_MIN_POS) * MINUNITMULT); - NOMORE(HMI_ValueStruct.Move_X_scale, (X_MAX_POS) * MINUNITMULT); - current_position.x = HMI_ValueStruct.Move_X_scale / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); - DWIN_UpdateLCD(); - } -} - -void HMI_Move_Y() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Y_scale)) { - checkkey = AxisMove; - EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); - if (!planner.is_full()) { - // Wait for planner moves to finish! - planner.synchronize(); - planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_XY), active_extruder); - } - DWIN_UpdateLCD(); - return; - } - NOLESS(HMI_ValueStruct.Move_Y_scale, (Y_MIN_POS) * MINUNITMULT); - NOMORE(HMI_ValueStruct.Move_Y_scale, (Y_MAX_POS) * MINUNITMULT); - current_position.y = HMI_ValueStruct.Move_Y_scale / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); - DWIN_UpdateLCD(); - } -} - -void HMI_Move_Z() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Z_scale)) { - checkkey = AxisMove; - EncoderRate.enabled = false; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); - if (!planner.is_full()) { - // Wait for planner moves to finish! - planner.synchronize(); - planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_Z), active_extruder); - } - DWIN_UpdateLCD(); - return; - } - NOLESS(HMI_ValueStruct.Move_Z_scale, Z_MIN_POS * MINUNITMULT); - NOMORE(HMI_ValueStruct.Move_Z_scale, Z_MAX_POS * MINUNITMULT); - current_position.z = HMI_ValueStruct.Move_Z_scale / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); - DWIN_UpdateLCD(); - } -} - -#if HAS_HOTEND - - void HMI_Move_E() { - static float last_E_scale = 0; - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_E_scale)) { - checkkey = AxisMove; - EncoderRate.enabled = false; - last_E_scale = HMI_ValueStruct.Move_E_scale; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - if (!planner.is_full()) { - planner.synchronize(); // Wait for planner moves to finish! - planner.buffer_line(current_position, MMM_TO_MMS(FEEDRATE_E), active_extruder); - } - DWIN_UpdateLCD(); - return; - } - if ((HMI_ValueStruct.Move_E_scale - last_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scale = last_E_scale + (EXTRUDE_MAXLENGTH) * MINUNITMULT; - else if ((last_E_scale - HMI_ValueStruct.Move_E_scale) > (EXTRUDE_MAXLENGTH) * MINUNITMULT) - HMI_ValueStruct.Move_E_scale = last_E_scale - (EXTRUDE_MAXLENGTH) * MINUNITMULT; - current_position.e = HMI_ValueStruct.Move_E_scale / 10; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - DWIN_UpdateLCD(); - } - } - -#endif - -#if HAS_ZOFFSET_ITEM - - bool printer_busy() { return planner.movesplanned() || printingIsActive(); } - - void HMI_Zoffset() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - uint8_t zoff_line; - switch (HMI_ValueStruct.show_mode) { - case -4: zoff_line = PREPARE_CASE_ZOFF + MROWS - index_prepare; break; - default: zoff_line = TUNE_CASE_ZOFF + MROWS - index_tune; - } - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.offset_value)) { - EncoderRate.enabled = false; - #if HAS_BED_PROBE - probe.offset.z = dwin_zoffset; - TERN_(EEPROM_SETTINGS, settings.save()); - #endif - if (HMI_ValueStruct.show_mode == -4) { - checkkey = Prepare; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); - } - else { - checkkey = Tune; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); - } - DWIN_UpdateLCD(); - return; - } - NOLESS(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MIN) * 100); - NOMORE(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MAX) * 100); - last_zoffset = dwin_zoffset; - dwin_zoffset = HMI_ValueStruct.offset_value / 100.0f; - #if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) - if ( (ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_known()) && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy()) ) - babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset); - #endif - DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(zoff_line), HMI_ValueStruct.offset_value); - DWIN_UpdateLCD(); - } - } - -#endif // HAS_ZOFFSET_ITEM - -#if HAS_HOTEND - - void HMI_ETemp() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - uint8_t temp_line; - switch (HMI_ValueStruct.show_mode) { - case -1: temp_line = TEMP_CASE_TEMP; break; - case -2: temp_line = PREHEAT_CASE_TEMP; break; - case -3: temp_line = PREHEAT_CASE_TEMP; break; - default: temp_line = TUNE_CASE_TEMP + MROWS - index_tune; - } - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.E_Temp)) { - EncoderRate.enabled = false; - if (HMI_ValueStruct.show_mode == -1) { // temperature - checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); - } - else if (HMI_ValueStruct.show_mode == -2) { - checkkey = PLAPreheat; - ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), ui.material_preset[0].hotend_temp); - return; - } - else if (HMI_ValueStruct.show_mode == -3) { - checkkey = ABSPreheat; - ui.material_preset[1].hotend_temp = HMI_ValueStruct.E_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), ui.material_preset[1].hotend_temp); - return; - } - else { // tune - checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); - } - thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0); - return; - } - // E_Temp limit - NOMORE(HMI_ValueStruct.E_Temp, MAX_E_TEMP); - NOLESS(HMI_ValueStruct.E_Temp, MIN_E_TEMP); - // E_Temp value - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); - } - } - -#endif // HAS_HOTEND - -#if HAS_HEATED_BED - - void HMI_BedTemp() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - uint8_t bed_line; - switch (HMI_ValueStruct.show_mode) { - case -1: bed_line = TEMP_CASE_BED; break; - case -2: bed_line = PREHEAT_CASE_BED; break; - case -3: bed_line = PREHEAT_CASE_BED; break; - default: bed_line = TUNE_CASE_BED + MROWS - index_tune; - } - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Bed_Temp)) { - EncoderRate.enabled = false; - if (HMI_ValueStruct.show_mode == -1) { - checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); - } - else if (HMI_ValueStruct.show_mode == -2) { - checkkey = PLAPreheat; - ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), ui.material_preset[0].bed_temp); - return; - } - else if (HMI_ValueStruct.show_mode == -3) { - checkkey = ABSPreheat; - ui.material_preset[1].bed_temp = HMI_ValueStruct.Bed_Temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), ui.material_preset[1].bed_temp); - return; - } - else { - checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); - } - thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); - return; - } - // Bed_Temp limit - NOMORE(HMI_ValueStruct.Bed_Temp, BED_MAX_TARGET); - NOLESS(HMI_ValueStruct.Bed_Temp, MIN_BED_TEMP); - // Bed_Temp value - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); - } - } - -#endif // HAS_HEATED_BED - -#if HAS_PREHEAT - - void HMI_FanSpeed() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - uint8_t fan_line; - switch (HMI_ValueStruct.show_mode) { - case -1: fan_line = TEMP_CASE_FAN; break; - case -2: fan_line = PREHEAT_CASE_FAN; break; - case -3: fan_line = PREHEAT_CASE_FAN; break; - default: fan_line = TUNE_CASE_FAN + MROWS - index_tune; - } - - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Fan_speed)) { - EncoderRate.enabled = false; - if (HMI_ValueStruct.show_mode == -1) { - checkkey = TemperatureID; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); - } - else if (HMI_ValueStruct.show_mode == -2) { - checkkey = PLAPreheat; - ui.material_preset[0].fan_speed = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), ui.material_preset[0].fan_speed); - return; - } - else if (HMI_ValueStruct.show_mode == -3) { - checkkey = ABSPreheat; - ui.material_preset[1].fan_speed = HMI_ValueStruct.Fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), ui.material_preset[1].fan_speed); - return; - } - else { - checkkey = Tune; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); - } - thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed); - return; - } - // Fan_speed limit - NOMORE(HMI_ValueStruct.Fan_speed, FANON); - NOLESS(HMI_ValueStruct.Fan_speed, FANOFF); - // Fan_speed value - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); - } - } - -#endif // HAS_PREHEAT - -void HMI_PrintSpeed() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.print_speed)) { - checkkey = Tune; - EncoderRate.enabled = false; - feedrate_percentage = HMI_ValueStruct.print_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); - return; - } - // print_speed limit - NOMORE(HMI_ValueStruct.print_speed, MAX_PRINT_SPEED); - NOLESS(HMI_ValueStruct.print_speed, MIN_PRINT_SPEED); - // print_speed value - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); - } -} - -void HMI_MaxFeedspeedXYZE() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Feedspeed)) { - checkkey = MaxSpeed; - EncoderRate.enabled = false; - if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) - planner.set_max_feedrate(HMI_flag.feedspeed_axis, HMI_ValueStruct.Max_Feedspeed); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); - return; - } - // MaxFeedspeed limit - if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Feedspeed, default_max_feedrate[HMI_flag.feedspeed_axis] * 2); - if (HMI_ValueStruct.Max_Feedspeed < MIN_MAXFEEDSPEED) HMI_ValueStruct.Max_Feedspeed = MIN_MAXFEEDSPEED; - // MaxFeedspeed value - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); - } -} - -void HMI_MaxAccelerationXYZE() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Acceleration)) { - checkkey = MaxAcceleration; - EncoderRate.enabled = false; - if (HMI_flag.acc_axis == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); - else if (HMI_flag.acc_axis == Y_AXIS) planner.set_max_acceleration(Y_AXIS, HMI_ValueStruct.Max_Acceleration); - else if (HMI_flag.acc_axis == Z_AXIS) planner.set_max_acceleration(Z_AXIS, HMI_ValueStruct.Max_Acceleration); - #if HAS_HOTEND - else if (HMI_flag.acc_axis == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); - #endif - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); - return; - } - // MaxAcceleration limit - if (WITHIN(HMI_flag.acc_axis, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Acceleration, default_max_acceleration[HMI_flag.acc_axis] * 2); - if (HMI_ValueStruct.Max_Acceleration < MIN_MAXACCELERATION) HMI_ValueStruct.Max_Acceleration = MIN_MAXACCELERATION; - // MaxAcceleration value - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); - } -} - -#if HAS_CLASSIC_JERK - - void HMI_MaxJerkXYZE() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk)) { - checkkey = MaxJerk; - EncoderRate.enabled = false; - if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) - planner.set_max_jerk(HMI_flag.step_axis, HMI_ValueStruct.Max_Jerk / 10); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - return; - } - // MaxJerk limit - if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[HMI_flag.jerk_axis] * 2 * MINUNITMULT); - NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXJERK) * MINUNITMULT); - // MaxJerk value - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - } - } - -#endif // HAS_CLASSIC_JERK - -void HMI_StepXYZE() { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Step)) { - checkkey = Step; - EncoderRate.enabled = false; - if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) - planner.settings.axis_steps_per_mm[HMI_flag.step_axis] = HMI_ValueStruct.Max_Step / 10; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); - return; - } - // Step limit - if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) - NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[HMI_flag.step_axis] * 2 * MINUNITMULT); - NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP); - // Step value - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); - } -} - -void update_variable() { - #if HAS_HOTEND - static float last_temp_hotend_target = 0, last_temp_hotend_current = 0; - #endif - #if HAS_HEATED_BED - static float last_temp_bed_target = 0, last_temp_bed_current = 0; - #endif - #if HAS_FAN - static uint8_t last_fan_speed = 0; - #endif - - /* Tune page temperature update */ - if (checkkey == Tune) { - #if HAS_HOTEND - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); - #endif - #if HAS_HEATED_BED - if (last_temp_bed_target != thermalManager.temp_bed.target) - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); - #endif - #if HAS_FAN - if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); - last_fan_speed = thermalManager.fan_speed[0]; - } - #endif - } - - /* Temperature page temperature update */ - if (checkkey == TemperatureID) { - #if HAS_HOTEND - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_TEMP), thermalManager.temp_hotend[0].target); - #endif - #if HAS_HEATED_BED - if (last_temp_bed_target != thermalManager.temp_bed.target) - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_BED), thermalManager.temp_bed.target); - #endif - #if HAS_FAN - if (last_fan_speed != thermalManager.fan_speed[0]) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_FAN), thermalManager.fan_speed[0]); - last_fan_speed = thermalManager.fan_speed[0]; - } - #endif - } - - /* Bottom temperature update */ - #if HAS_HOTEND - if (last_temp_hotend_current != thermalManager.temp_hotend[0].celsius) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); - last_temp_hotend_current = thermalManager.temp_hotend[0].celsius; - } - if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); - last_temp_hotend_target = thermalManager.temp_hotend[0].target; - } - #endif - #if HAS_HEATED_BED - if (last_temp_bed_current != thermalManager.temp_bed.celsius) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, thermalManager.temp_bed.celsius); - last_temp_bed_current = thermalManager.temp_bed.celsius; - } - if (last_temp_bed_target != thermalManager.temp_bed.target) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); - last_temp_bed_target = thermalManager.temp_bed.target; - } - #endif - static uint16_t last_speed = 0; - if (last_speed != feedrate_percentage) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); - last_speed = feedrate_percentage; - } - #if HAS_ZOFFSET_ITEM - if (last_zoffset != BABY_Z_VAR) { - DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178 + STAT_CHR_W, 429, BABY_Z_VAR * 100); - last_zoffset = BABY_Z_VAR; - } - #endif -} - -/** - * Read and cache the working directory. - * - * TODO: New code can follow the pattern of menu_media.cpp - * and rely on Marlin caching for performance. No need to - * cache files here. - */ - -#ifndef strcasecmp_P - #define strcasecmp_P(a, b) strcasecmp((a), (b)) -#endif - -inline void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_LIMIT) { - char * const name = card.longest_filename(); - size_t pos = strlen(name); // index of ending nul - - // For files, remove the extension - // which may be .gcode, .gco, or .g - if (!card.flag.filenameIsDir) - while (pos && src[pos] != '.') pos--; // find last '.' (stop at 0) - - size_t len = pos; // nul or '.' - if (len > maxlen) { // Keep the name short - pos = len = maxlen; // move nul down - dst[--pos] = '.'; // insert dots - dst[--pos] = '.'; - dst[--pos] = '.'; - } - - dst[len] = '\0'; // end it - - // Copy down to 0 - while (pos--) dst[pos] = src[pos]; -} - -inline void HMI_SDCardInit() { card.cdroot(); } - -void MarlinUI::refresh() { /* Nothing to see here */ } - -#define ICON_Folder ICON_More - -#if ENABLED(SCROLL_LONG_FILENAMES) - - char shift_name[LONG_FILENAME_LENGTH + 1]; - int8_t shift_amt; // = 0 - millis_t shift_ms; // = 0 - - // Init the shift name based on the highlighted item - inline void Init_Shift_Name() { - const bool is_subdir = !card.flag.workDirIsRoot; - const int8_t filenum = select_file.now - 1 - is_subdir; // Skip "Back" and ".." - const uint16_t fileCnt = card.get_num_Files(); - if (WITHIN(filenum, 0, fileCnt - 1)) { - card.getfilename_sorted(SD_ORDER(filenum, fileCnt)); - char * const name = card.longest_filename(); - make_name_without_ext(shift_name, name, 100); - } - } - - inline void Init_SDItem_Shift() { - shift_amt = 0; - shift_ms = select_file.now > 0 && strlen(shift_name) > MENU_CHAR_LIMIT - ? millis() + 750UL : 0; - } - -#endif - -/** - * Display an SD item, adding a CDUP for subfolders. - */ -inline void Draw_SDItem(const uint16_t item, int16_t row=-1) { - if (row < 0) row = item + 1 + MROWS - index_file; - const bool is_subdir = !card.flag.workDirIsRoot; - if (is_subdir && item == 0) { - Draw_Menu_Line(row, ICON_Folder, ".."); - return; - } - - card.getfilename_sorted(item - is_subdir); - char * const name = card.longest_filename(); - - #if ENABLED(SCROLL_LONG_FILENAMES) - // Init the current selected name - // This is used during scroll drawing - if (item == select_file.now - 1) { - make_name_without_ext(shift_name, name, 100); - Init_SDItem_Shift(); - } - #endif - - // Draw the file/folder with name aligned left - char str[strlen(name) + 1]; - make_name_without_ext(str, name); - Draw_Menu_Line(row, card.flag.filenameIsDir ? ICON_Folder : ICON_File, str); -} - -#if ENABLED(SCROLL_LONG_FILENAMES) - - inline void Draw_SDItem_Shifted(int8_t &shift) { - // Limit to the number of chars past the cutoff - const size_t len = strlen(shift_name); - NOMORE(shift, _MAX(len - MENU_CHAR_LIMIT, 0U)); - - // Shorten to the available space - const size_t lastchar = _MIN((signed)len, shift + MENU_CHAR_LIMIT); - - const char c = shift_name[lastchar]; - shift_name[lastchar] = '\0'; - - const uint8_t row = select_file.now + MROWS - index_file; // skip "Back" and scroll - Erase_Menu_Text(row); - Draw_Menu_Line(row, 0, &shift_name[shift]); - - shift_name[lastchar] = c; - } - -#endif - -// Redraw the first set of SD Files -inline void Redraw_SD_List() { - select_file.reset(); - index_file = MROWS; - - Clear_Menu_Area(); // Leave title bar unchanged - - Draw_Back_First(); - - if (card.isMounted()) { - // As many files as will fit - LOOP_L_N(i, _MIN(nr_sd_menu_items(), MROWS)) - Draw_SDItem(i, i + 1); - - TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); - } - else { - DWIN_Draw_Rectangle(1, Color_Bg_Red, 10, MBASE(3) - 10, DWIN_WIDTH - 10, MBASE(4)); - DWIN_Draw_String(false, false, font16x32, Color_Yellow, Color_Bg_Red, ((DWIN_WIDTH) - 8 * 16) / 2, MBASE(3), F("No Media")); - } -} - -bool DWIN_lcd_sd_status = false; - -inline void SDCard_Up() { - card.cdup(); - Redraw_SD_List(); - DWIN_lcd_sd_status = false; // On next DWIN_Update -} - -inline void SDCard_Folder(char * const dirname) { - card.cd(dirname); - Redraw_SD_List(); - DWIN_lcd_sd_status = false; // On next DWIN_Update -} - -// -// Watch for media mount / unmount -// -void HMI_SDCardUpdate() { - if (HMI_flag.home_flag) return; - if (DWIN_lcd_sd_status != card.isMounted()) { - DWIN_lcd_sd_status = card.isMounted(); - // SERIAL_ECHOLNPAIR("HMI_SDCardUpdate: ", int(DWIN_lcd_sd_status)); - if (DWIN_lcd_sd_status) { - if (checkkey == SelectFile) - Redraw_SD_List(); - } - else { - // clean file icon - if (checkkey == SelectFile) { - Redraw_SD_List(); - } - else if (checkkey == PrintProcess || checkkey == Tune || printingIsActive()) { - // TODO: Move card removed abort handling - // to CardReader::manage_media. - card.flag.abort_sd_printing = true; - wait_for_heatup = wait_for_user = false; - dwin_abort_flag = true; // Reset feedrate, return to Home - } - } - DWIN_UpdateLCD(); - } -} - -// -// The status area is always on-screen, except during -// full-screen modal dialogs. (TODO: Keep alive during dialogs) -// -void Draw_Status_Area(const bool with_update) { - - // Clear the bottom area of the screen - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); - - // - // Status Area - // - #if HAS_HOTEND - DWIN_ICON_Show(ICON, ICON_HotendTemp, 13, 381); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); - DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); - #endif - #if HOTENDS > 1 - // DWIN_ICON_Show(ICON,ICON_HotendTemp, 13, 381); - #endif - - #if HAS_HEATED_BED - DWIN_ICON_Show(ICON, ICON_BedTemp, 158, 381); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, thermalManager.temp_bed.celsius); - DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 178 + 3 * STAT_CHR_W + 5, 383, F("/")); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); - #endif - - DWIN_ICON_Show(ICON, ICON_Speed, 13, 429); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); - DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 33 + 5 * STAT_CHR_W + 2, 429, F("%")); - - #if HAS_ZOFFSET_ITEM - DWIN_ICON_Show(ICON, ICON_Zoffset, 158, 428); - DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178, 429, BABY_Z_VAR * 100); - #endif - - if (with_update) { - DWIN_UpdateLCD(); - delay(5); - } -} - -void HMI_StartFrame(const bool with_update) { - Goto_MainMenu(); - Draw_Status_Area(with_update); -} - -inline void Draw_Info_Menu() { - Clear_Main_Window(); - - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 30, 17, 57, 29); // "Info" - - DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102); - DWIN_Frame_AreaCopy(1, 1, 164, 56, 176, 108, 175); - DWIN_Frame_AreaCopy(1, 58, 164, 113, 176, 105, 248); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_C) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_C); - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_INFO_SCREEN)); - #else - DWIN_Frame_TitleCopy(1, 190, 16, 215, 26); // "Info" - #endif - - DWIN_Frame_AreaCopy(1, 120, 150, 146, 161, 124, 102); - DWIN_Frame_AreaCopy(1, 146, 151, 254, 161, 82, 175); - DWIN_Frame_AreaCopy(1, 0, 165, 94, 175, 89, 248); - DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_E) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_E); - } - - Draw_Back_First(); - LOOP_L_N(i, 3) { - DWIN_ICON_Show(ICON, ICON_PrintSize + i, 26, 99 + i * 73); - DWIN_Draw_Line(Line_Color, 16, MBASE(2) + i * 73, 256, 156 + i * 73); - } -} - -inline void Draw_Print_File_Menu() { - Clear_Title_Bar(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 0, 31, 55, 44); // "Print file" - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("Print file"); // TODO: GET_TEXT_F - #else - DWIN_Frame_TitleCopy(1, 52, 31, 137, 41); // "Print file" - #endif - } - - Redraw_SD_List(); -} - -/* Main Process */ -void HMI_MainMenu() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_page.inc(4)) { - switch (select_page.now) { - case 0: ICON_Print(); break; - case 1: ICON_Print(); ICON_Prepare(); break; - case 2: ICON_Prepare(); ICON_Control(); break; - case 3: ICON_Control(); TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; - } - } - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_page.dec()) { - switch (select_page.now) { - case 0: ICON_Print(); ICON_Prepare(); break; - case 1: ICON_Prepare(); ICON_Control(); break; - case 2: ICON_Control(); TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(0); break; - case 3: TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; - } - } - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_page.now) { - case 0: // Print File - checkkey = SelectFile; - Draw_Print_File_Menu(); - break; - - case 1: // Prepare - checkkey = Prepare; - select_prepare.reset(); - index_prepare = MROWS; - Draw_Prepare_Menu(); - break; - - case 2: // Control - checkkey = Control; - select_control.reset(); - index_control = MROWS; - Draw_Control_Menu(); - break; - - case 3: // Leveling or Info - #if HAS_ONESTEP_LEVELING - checkkey = Leveling; - HMI_Leveling(); - #else - checkkey = Info; - Draw_Info_Menu(); - #endif - break; - } - } - DWIN_UpdateLCD(); -} - -// Select (and Print) File -void HMI_SelectFile() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - - const uint16_t hasUpDir = !card.flag.workDirIsRoot; - - if (encoder_diffState == ENCODER_DIFF_NO) { - #if ENABLED(SCROLL_LONG_FILENAMES) - if (shift_ms && select_file.now >= 1 + hasUpDir) { - // Scroll selected filename every second - const millis_t ms = millis(); - if (ELAPSED(ms, shift_ms)) { - const bool was_reset = shift_amt < 0; - shift_ms = ms + 375UL + was_reset * 250UL; // ms per character - int8_t shift_new = shift_amt + 1; // Try to shift by... - Draw_SDItem_Shifted(shift_new); // Draw the item - if (!was_reset && shift_new == 0) // Was it limited to 0? - shift_ms = 0; // No scrolling needed - else if (shift_new == shift_amt) // Scroll reached the end - shift_new = -1; // Reset - shift_amt = shift_new; // Set new scroll - } - } - #endif - return; - } - - // First pause is long. Easy. - // On reset, long pause must be after 0. - - const uint16_t fullCnt = nr_sd_menu_items(); - - if (encoder_diffState == ENCODER_DIFF_CW && fullCnt) { - if (select_file.inc(1 + fullCnt)) { - const uint8_t itemnum = select_file.now - 1; // -1 for "Back" - if (TERN0(SCROLL_LONG_FILENAMES, shift_ms)) { // If line was shifted - Erase_Menu_Text(itemnum + MROWS - index_file); // Erase and - Draw_SDItem(itemnum - 1); // redraw - } - if (select_file.now > MROWS && select_file.now > index_file) { // Cursor past the bottom - index_file = select_file.now; // New bottom line - Scroll_Menu(DWIN_SCROLL_UP); - Draw_SDItem(itemnum, MROWS); // Draw and init the shift name - } - else { - Move_Highlight(1, select_file.now + MROWS - index_file); // Just move highlight - TERN_(SCROLL_LONG_FILENAMES, Init_Shift_Name()); // ...and init the shift name - } - TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); - } - } - else if (encoder_diffState == ENCODER_DIFF_CCW && fullCnt) { - if (select_file.dec()) { - const uint8_t itemnum = select_file.now - 1; // -1 for "Back" - if (TERN0(SCROLL_LONG_FILENAMES, shift_ms)) { // If line was shifted - Erase_Menu_Text(select_file.now + 1 + MROWS - index_file); // Erase and - Draw_SDItem(itemnum + 1); // redraw - } - if (select_file.now < index_file - MROWS) { // Cursor past the top - index_file--; // New bottom line - Scroll_Menu(DWIN_SCROLL_DOWN); - if (index_file == MROWS) { - Draw_Back_First(); - TERN_(SCROLL_LONG_FILENAMES, shift_ms = 0); - } - else { - Draw_SDItem(itemnum, 0); // Draw the item (and init shift name) - } - } - else { - Move_Highlight(-1, select_file.now + MROWS - index_file); // Just move highlight - TERN_(SCROLL_LONG_FILENAMES, Init_Shift_Name()); // ...and init the shift name - } - TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); // Reset left. Init timer. - } - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - if (select_file.now == 0) { // Back - select_page.set(0); - Goto_MainMenu(); - } - else if (hasUpDir && select_file.now == 1) { // CD-Up - SDCard_Up(); - goto HMI_SelectFileExit; - } - else { - const uint16_t filenum = select_file.now - 1 - hasUpDir; - card.getfilename_sorted(SD_ORDER(filenum, card.get_num_Files())); - - // Enter that folder! - if (card.flag.filenameIsDir) { - SDCard_Folder(card.filename); - goto HMI_SelectFileExit; - } - - // Reset highlight for next entry - select_print.reset(); - select_file.reset(); - - // Start choice and print SD file - HMI_flag.heat_flag = true; - HMI_flag.print_finish = false; - HMI_ValueStruct.show_mode = 0; - - card.openAndPrintFile(card.filename); - - #if FAN_COUNT > 0 - // All fans on for Ender 3 v2 ? - // The slicer should manage this for us. - // for (uint8_t i = 0; i < FAN_COUNT; i++) - // thermalManager.fan_speed[i] = FANON; - #endif - - Goto_PrintProcess(); - } - } -HMI_SelectFileExit: - DWIN_UpdateLCD(); -} - -/* Printing */ -void HMI_Printing() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - if (HMI_flag.done_confirm_flag) { - if (encoder_diffState == ENCODER_DIFF_ENTER) { - HMI_flag.done_confirm_flag = false; - dwin_abort_flag = true; // Reset feedrate, return to Home - } - return; - } - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_print.inc(3)) { - switch (select_print.now) { - case 0: ICON_Tune(); break; - case 1: - ICON_Tune(); - if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); - break; - case 2: - if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); - ICON_Stop(); - break; - } - } - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_print.dec()) { - switch (select_print.now) { - case 0: - ICON_Tune(); - if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); - break; - case 1: - if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); - ICON_Stop(); - break; - case 2: ICON_Stop(); break; - } - } - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_print.now) { - case 0: // Tune - checkkey = Tune; - HMI_ValueStruct.show_mode = 0; - select_tune.reset(); - index_tune = MROWS; - Draw_Tune_Menu(); - break; - case 1: // Pause - if (HMI_flag.pause_flag) { - ICON_Pause(); - - char cmd[40]; - cmd[0] = '\0'; - - #if ENABLED(PAUSE_HEAT) - #if HAS_HEATED_BED - if (tempbed) sprintf_P(cmd, PSTR("M190 S%i\n"), tempbed); - #endif - #if HAS_HOTEND - if (temphot) sprintf_P(&cmd[strlen(cmd)], PSTR("M109 S%i\n"), temphot); - #endif - #endif - - strcat_P(cmd, PSTR("M24")); - queue.inject(cmd); - } - else { - HMI_flag.select_flag = true; - checkkey = Print_window; - Popup_window_PauseOrStop(); - } - break; - - case 2: // Stop - HMI_flag.select_flag = true; - checkkey = Print_window; - Popup_window_PauseOrStop(); - break; - - default: break; - } - } - DWIN_UpdateLCD(); -} - -/* Pause and Stop window */ -void HMI_PauseOrStop() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - if (encoder_diffState == ENCODER_DIFF_CW) - Draw_Select_Highlight(false); - else if (encoder_diffState == ENCODER_DIFF_CCW) - Draw_Select_Highlight(true); - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - if (select_print.now == 1) { // pause window - if (HMI_flag.select_flag) { - HMI_flag.pause_action = true; - ICON_Continue(); - #if ENABLED(POWER_LOSS_RECOVERY) - if (recovery.enabled) recovery.save(true); - #endif - queue.inject_P(PSTR("M25")); - } - else { - // cancel pause - } - Goto_PrintProcess(); - } - else if (select_print.now == 2) { // stop window - if (HMI_flag.select_flag) { - checkkey = Back_Main; - if (HMI_flag.home_flag) planner.synchronize(); // Wait for planner moves to finish! - wait_for_heatup = wait_for_user = false; // Stop waiting for heating/user - card.flag.abort_sd_printing = true; // Let the main loop handle SD abort - dwin_abort_flag = true; // Reset feedrate, return to Home - #ifdef ACTION_ON_CANCEL - host_action_cancel(); - #endif - Popup_Window_Home(true); - } - else - Goto_PrintProcess(); // cancel stop - } - } - DWIN_UpdateLCD(); -} - -inline void Draw_Move_Menu() { - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 192, 1, 233, 14); // "Move" - DWIN_Frame_AreaCopy(1, 58, 118, 106, 132, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 109, 118, 157, 132, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 160, 118, 209, 132, LBLX, MBASE(3)); - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 212, 118, 253, 131, LBLX, MBASE(4)); - #endif - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_MOVE_AXIS)); - #else - DWIN_Frame_TitleCopy(1, 231, 2, 265, 12); // "Move" - #endif - draw_move_en(MBASE(1)); say_x(36, MBASE(1)); // "Move X" - draw_move_en(MBASE(2)); say_y(36, MBASE(2)); // "Move Y" - draw_move_en(MBASE(3)); say_z(36, MBASE(3)); // "Move Z" - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 123, 192, 176, 202, LBLX, MBASE(4)); // "Extruder" - #endif - } - - Draw_Back_First(select_axis.now == 0); - if (select_axis.now) Draw_Menu_Cursor(select_axis.now); - - // Draw separators and icons - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MoveX + i); -} - -#include "../../../libs/buzzer.h" - -void HMI_AudioFeedback(const bool success=true) { - if (success) { - buzzer.tone(100, 659); - buzzer.tone(10, 0); - buzzer.tone(100, 698); - } - else - buzzer.tone(40, 440); -} - -/* Prepare */ -void HMI_Prepare() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_prepare.inc(1 + PREPARE_CASE_TOTAL)) { - if (select_prepare.now > MROWS && select_prepare.now > index_prepare) { - index_prepare = select_prepare.now; - - // Scroll up and draw a blank bottom line - Scroll_Menu(DWIN_SCROLL_UP); - Draw_Menu_Icon(MROWS, ICON_Axis + select_prepare.now - 1); - - // Draw "More" icon for sub-menus - if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); - - #if HAS_HOTEND - if (index_prepare == PREPARE_CASE_ABS) Item_Prepare_ABS(MROWS); - #endif - #if HAS_PREHEAT - if (index_prepare == PREPARE_CASE_COOL) Item_Prepare_Cool(MROWS); - #endif - if (index_prepare == PREPARE_CASE_LANG) Item_Prepare_Lang(MROWS); - } - else { - Move_Highlight(1, select_prepare.now + MROWS - index_prepare); - } - } - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_prepare.dec()) { - if (select_prepare.now < index_prepare - MROWS) { - index_prepare--; - Scroll_Menu(DWIN_SCROLL_DOWN); - - if (index_prepare == MROWS) - Draw_Back_First(); - else - Draw_Menu_Line(0, ICON_Axis + select_prepare.now - 1); - - if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); - - if (index_prepare == 6) Item_Prepare_Move(0); - else if (index_prepare == 7) Item_Prepare_Disable(0); - else if (index_prepare == 8) Item_Prepare_Home(0); - } - else { - Move_Highlight(-1, select_prepare.now + MROWS - index_prepare); - } - } - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_prepare.now) { - case 0: // Back - select_page.set(1); - Goto_MainMenu(); - break; - case PREPARE_CASE_MOVE: // Axis move - checkkey = AxisMove; - select_axis.reset(); - Draw_Move_Menu(); - - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), current_position.x * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), current_position.y * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), current_position.z * MINUNITMULT); - #if HAS_HOTEND - queue.inject_P(PSTR("G92 E0")); - current_position.e = HMI_ValueStruct.Move_E_scale = 0; - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0); - #endif - break; - case PREPARE_CASE_DISA: // Disable steppers - queue.inject_P(PSTR("M84")); - break; - case PREPARE_CASE_HOME: // Homing - checkkey = Last_Prepare; - index_prepare = MROWS; - queue.inject_P(PSTR("G28")); // G28 will set home_flag - Popup_Window_Home(); - break; - #if HAS_ZOFFSET_ITEM - case PREPARE_CASE_ZOFF: // Z-offset - #if EITHER(HAS_BED_PROBE, BABYSTEPPING) - checkkey = Homeoffset; - HMI_ValueStruct.show_mode = -4; - HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(PREPARE_CASE_ZOFF + MROWS - index_prepare), HMI_ValueStruct.offset_value); - EncoderRate.enabled = true; - #else - // Apply workspace offset, making the current position 0,0,0 - queue.inject_P(PSTR("G92 X0 Y0 Z0")); - HMI_AudioFeedback(); - #endif - break; - #endif - #if HAS_HOTEND - case PREPARE_CASE_PLA: // PLA preheat - thermalManager.setTargetHotend(ui.material_preset[0].hotend_temp, 0); - thermalManager.setTargetBed(ui.material_preset[0].bed_temp); - thermalManager.set_fan_speed(0, ui.material_preset[0].fan_speed); - break; - case PREPARE_CASE_ABS: // ABS preheat - thermalManager.setTargetHotend(ui.material_preset[1].hotend_temp, 0); - thermalManager.setTargetBed(ui.material_preset[1].bed_temp); - thermalManager.set_fan_speed(0, ui.material_preset[1].fan_speed); - break; - #endif - #if HAS_PREHEAT - case PREPARE_CASE_COOL: // Cool - TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); - #if HAS_HOTEND || HAS_HEATED_BED - thermalManager.disable_all_heaters(); - #endif - break; - #endif - case PREPARE_CASE_LANG: // Toggle Language - HMI_ToggleLanguage(); - Draw_Prepare_Menu(); - break; - default: break; - } - } - DWIN_UpdateLCD(); -} - -void Draw_Temperature_Menu() { - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 236, 2, 263, 13); // "Temperature" - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(TEMP_CASE_TEMP)); - #endif - #if HAS_HEATED_BED - DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(TEMP_CASE_BED)); - #endif - #if HAS_FAN - DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(TEMP_CASE_FAN)); - #endif - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 100, 89, 178, 101, LBLX, MBASE(TEMP_CASE_PLA)); - DWIN_Frame_AreaCopy(1, 180, 89, 260, 100, LBLX, MBASE(TEMP_CASE_ABS)); - #endif - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); - #endif - #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); - #endif - #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); - #endif - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_PLA), F("PLA Preheat Settings")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_ABS), F("ABS Preheat Settings")); - #endif - #else - DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "Temperature" - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(TEMP_CASE_TEMP)); // Nozzle... - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(TEMP_CASE_TEMP)); // ...Temperature - #endif - #if HAS_HEATED_BED - DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(TEMP_CASE_BED)); // Bed... - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(TEMP_CASE_BED)); // ...Temperature - #endif - #if HAS_FAN - DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(TEMP_CASE_FAN)); // Fan speed - #endif - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(TEMP_CASE_PLA)); // Preheat... - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(TEMP_CASE_PLA)); // ...PLA - DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 79, MBASE(TEMP_CASE_PLA)); // PLA setting - DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(TEMP_CASE_ABS)); // Preheat... - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(TEMP_CASE_ABS)); // ...ABS - DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 81, MBASE(TEMP_CASE_ABS)); // ABS setting - #endif - #endif - } - - Draw_Back_First(select_temp.now == 0); - if (select_temp.now) Draw_Menu_Cursor(select_temp.now); - - // Draw icons and lines - uint8_t i = 0; - #define _TMENU_ICON(N) Draw_Menu_Line(++i, ICON_SetEndTemp + (N) - 1) - #if HAS_HOTEND - _TMENU_ICON(TEMP_CASE_TEMP); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_hotend[0].target); - #endif - #if HAS_HEATED_BED - _TMENU_ICON(TEMP_CASE_BED); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_bed.target); - #endif - #if HAS_FAN - _TMENU_ICON(TEMP_CASE_FAN); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.fan_speed[0]); - #endif - #if HAS_HOTEND - // PLA/ABS items have submenus - _TMENU_ICON(TEMP_CASE_PLA); - Draw_More_Icon(i); - _TMENU_ICON(TEMP_CASE_ABS); - Draw_More_Icon(i); - #endif -} - -/* Control */ -void HMI_Control() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_control.inc(1 + CONTROL_CASE_TOTAL)) { - if (select_control.now > MROWS && select_control.now > index_control) { - index_control = select_control.now; - Scroll_Menu(DWIN_SCROLL_UP); - Draw_Menu_Icon(MROWS, ICON_Temperature + index_control - 1); - Draw_More_Icon(CONTROL_CASE_TEMP + MROWS - index_control); // Temperature > - Draw_More_Icon(CONTROL_CASE_MOVE + MROWS - index_control); // Motion > - if (index_control > MROWS) { - Draw_More_Icon(CONTROL_CASE_INFO + MROWS - index_control); // Info > - if (HMI_IsChinese()) - DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, MBASE(CONTROL_CASE_INFO - 1)); - else - DWIN_Frame_AreaCopy(1, 0, 104, 24, 114, LBLX, MBASE(CONTROL_CASE_INFO - 1)); - } - } - else { - Move_Highlight(1, select_control.now + MROWS - index_control); - } - } - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_control.dec()) { - if (select_control.now < index_control - MROWS) { - index_control--; - Scroll_Menu(DWIN_SCROLL_DOWN); - if (index_control == MROWS) - Draw_Back_First(); - else - Draw_Menu_Line(0, ICON_Temperature + select_control.now - 1); - Draw_More_Icon(0 + MROWS - index_control + 1); // Temperature > - Draw_More_Icon(1 + MROWS - index_control + 1); // Motion > - } - else { - Move_Highlight(-1, select_control.now + MROWS - index_control); - } - } - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_control.now) { - case 0: // Back - select_page.set(2); - Goto_MainMenu(); - break; - case CONTROL_CASE_TEMP: // Temperature - checkkey = TemperatureID; - HMI_ValueStruct.show_mode = -1; - select_temp.reset(); - Draw_Temperature_Menu(); - break; - case CONTROL_CASE_MOVE: // Motion - checkkey = Motion; - select_motion.reset(); - Draw_Motion_Menu(); - break; - #if ENABLED(EEPROM_SETTINGS) - case CONTROL_CASE_SAVE: { // Write EEPROM - const bool success = settings.save(); - HMI_AudioFeedback(success); - } break; - case CONTROL_CASE_LOAD: { // Read EEPROM - const bool success = settings.load(); - HMI_AudioFeedback(success); - } break; - case CONTROL_CASE_RESET: // Reset EEPROM - settings.reset(); - HMI_AudioFeedback(); - break; - #endif - case CONTROL_CASE_INFO: // Info - checkkey = Info; - Draw_Info_Menu(); - break; - default: break; - } - } - DWIN_UpdateLCD(); -} - - -#if HAS_ONESTEP_LEVELING - - /* Leveling */ - void HMI_Leveling() { - Popup_Window_Leveling(); - DWIN_UpdateLCD(); - queue.inject_P(PSTR("G28O\nG29")); - } - -#endif - -/* Axis Move */ -void HMI_AxisMove() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - #if ENABLED(PREVENT_COLD_EXTRUSION) - // popup window resume - if (HMI_flag.ETempTooLow_flag) { - if (encoder_diffState == ENCODER_DIFF_ENTER) { - HMI_flag.ETempTooLow_flag = false; - current_position.e = HMI_ValueStruct.Move_E_scale = 0; - Draw_Move_Menu(); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); - DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0); - DWIN_UpdateLCD(); - } - return; - } - #endif - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_axis.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_axis.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_axis.dec()) Move_Highlight(-1, select_axis.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_axis.now) { - case 0: // Back - checkkey = Prepare; - select_prepare.set(1); - index_prepare = MROWS; - Draw_Prepare_Menu(); - break; - case 1: // X axis move - checkkey = Move_X; - HMI_ValueStruct.Move_X_scale = current_position.x * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); - EncoderRate.enabled = true; - break; - case 2: // Y axis move - checkkey = Move_Y; - HMI_ValueStruct.Move_Y_scale = current_position.y * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); - EncoderRate.enabled = true; - break; - case 3: // Z axis move - checkkey = Move_Z; - HMI_ValueStruct.Move_Z_scale = current_position.z * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); - EncoderRate.enabled = true; - break; - #if HAS_HOTEND - case 4: // Extruder - // window tips - #ifdef PREVENT_COLD_EXTRUSION - if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) { - HMI_flag.ETempTooLow_flag = true; - Popup_Window_ETempTooLow(); - DWIN_UpdateLCD(); - return; - } - #endif - checkkey = Extruder; - HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); - EncoderRate.enabled = true; - break; - #endif - } - } - DWIN_UpdateLCD(); -} - -/* TemperatureID */ -void HMI_Temperature() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_temp.inc(1 + TEMP_CASE_TOTAL)) Move_Highlight(1, select_temp.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_temp.dec()) Move_Highlight(-1, select_temp.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_temp.now) { - case 0: // Back - checkkey = Control; - select_control.set(1); - index_control = MROWS; - Draw_Control_Menu(); - break; - #if HAS_HOTEND - case TEMP_CASE_TEMP: // Nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); - EncoderRate.enabled = true; - break; - #endif - #if HAS_HEATED_BED - case TEMP_CASE_BED: // Bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); - EncoderRate.enabled = true; - break; - #endif - #if HAS_FAN - case TEMP_CASE_FAN: // Fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); - EncoderRate.enabled = true; - break; - #endif - #if HAS_HOTEND - case TEMP_CASE_PLA: { // PLA preheat setting - checkkey = PLAPreheat; - select_PLA.reset(); - HMI_ValueStruct.show_mode = -2; - - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 59, 16, 139, 29); // "PLA Settings" - DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_TEMP)); - DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp - #if HAS_HEATED_BED - DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_BED)); - DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(PREHEAT_CASE_BED)); // PLA bed temp - #endif - #if HAS_FAN - DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_FAN)); - DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(PREHEAT_CASE_FAN)); // PLA fan speed - #endif - #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration - #endif - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("PLA Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); - #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); - #endif - #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); - #endif - #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); - #endif - #else - DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "PLA Settings" - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); - DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp - #if HAS_HEATED_BED - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_BED) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(PREHEAT_CASE_BED) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(PREHEAT_CASE_BED) + 3); // PLA bed temp - #endif - #if HAS_FAN - DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_FAN)); - DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(PREHEAT_CASE_FAN)); // PLA fan speed - #endif - #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration - #endif - #endif - } - - Draw_Back_First(); - - uint8_t i = 0; - Draw_Menu_Line(++i, ICON_SetEndTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[0].hotend_temp); - #if HAS_HEATED_BED - Draw_Menu_Line(++i, ICON_SetBedTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[0].bed_temp); - #endif - #if HAS_FAN - Draw_Menu_Line(++i, ICON_FanSpeed); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[0].fan_speed); - #endif - #if ENABLED(EEPROM_SETTINGS) - Draw_Menu_Line(++i, ICON_WriteEEPROM); - #endif - } break; - - case TEMP_CASE_ABS: { // ABS preheat setting - checkkey = ABSPreheat; - select_ABS.reset(); - HMI_ValueStruct.show_mode = -3; - - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 142, 16, 223, 29); // "ABS Settings" - - DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_TEMP)); - DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(PREHEAT_CASE_TEMP)); // ABS nozzle temp - #if HAS_HEATED_BED - DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_BED)); - DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(PREHEAT_CASE_BED)); // ABS bed temp - #endif - #if HAS_FAN - DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_FAN)); - DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(PREHEAT_CASE_FAN)); // ABS fan speed - #endif - #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(PREHEAT_CASE_SAVE)); - DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX + 28, MBASE(PREHEAT_CASE_SAVE) + 2); // Save ABS configuration - #endif - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("ABS Settings"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); - #if HAS_HEATED_BED - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); - #endif - #if HAS_FAN - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); - #endif - #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); - #endif - #else - DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "ABS Settings" - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); - DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // ABS nozzle temp - #if HAS_HEATED_BED - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_BED) + 3); - DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(PREHEAT_CASE_BED) + 3); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(PREHEAT_CASE_BED) + 3); // ABS bed temp - #endif - #if HAS_FAN - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_FAN)); - DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(PREHEAT_CASE_FAN)); // ABS fan speed - #endif - #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); - DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 33, MBASE(PREHEAT_CASE_SAVE)); // Save ABS configuration - #endif - #endif - } - - Draw_Back_First(); - - uint8_t i = 0; - Draw_Menu_Line(++i, ICON_SetEndTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[1].hotend_temp); - #if HAS_HEATED_BED - Draw_Menu_Line(++i, ICON_SetBedTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[1].bed_temp); - #endif - #if HAS_FAN - Draw_Menu_Line(++i, ICON_FanSpeed); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[1].fan_speed); - #endif - #if ENABLED(EEPROM_SETTINGS) - Draw_Menu_Line(++i, ICON_WriteEEPROM); - #endif - - } break; - - #endif // HAS_HOTEND - } - } - DWIN_UpdateLCD(); -} - -inline void Draw_Max_Speed_Menu() { - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Max Speed (mm/s)" - - auto say_max_speed = [](const uint16_t row) { - DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, row); // "Max speed" - }; - - say_max_speed(MBASE(1)); // "Max speed" - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 58, MBASE(1)); // X - say_max_speed(MBASE(2)); // "Max speed" - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 58, MBASE(2) + 3); // Y - say_max_speed(MBASE(3)); // "Max speed" - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 58, MBASE(3) + 3); // Z - #if HAS_HOTEND - say_max_speed(MBASE(4)); // "Max speed" - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 58, MBASE(4) + 3); // E - #endif - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title("Max Speed (mm/s)"); // TODO: GET_TEXT_F - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Feedrate X")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Feedrate Y")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Feedrate Z")); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Feedrate E")); - #endif - #else - DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Max Speed (mm/s)" - - draw_max_en(MBASE(1)); // "Max" - DWIN_Frame_AreaCopy(1, 184, 119, 234, 132, LBLX + 27, MBASE(1)); // "Speed X" - - draw_max_en(MBASE(2)); // "Max" - draw_speed_en(27, MBASE(2)); // "Speed" - say_y(70, MBASE(2)); // "Y" - - draw_max_en(MBASE(3)); // "Max" - draw_speed_en(27, MBASE(3)); // "Speed" - say_z(70, MBASE(3)); // "Z" - - #if HAS_HOTEND - draw_max_en(MBASE(4)); // "Max" - draw_speed_en(27, MBASE(4)); // "Speed" - say_e(70, MBASE(4)); // "E" - #endif - #endif - } - - Draw_Back_First(); - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedX + i); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(1), planner.settings.max_feedrate_mm_s[X_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(2), planner.settings.max_feedrate_mm_s[Y_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(3), planner.settings.max_feedrate_mm_s[Z_AXIS]); - #if HAS_HOTEND - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(4), planner.settings.max_feedrate_mm_s[E_AXIS]); - #endif -} - -inline void Draw_Max_Accel_Menu() { - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Acceleration" - - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(1) + 1); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 71, MBASE(1)); // Max acceleration X - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(2) + 1); - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 71, MBASE(2) + 2); // Max acceleration Y - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(3) + 1); - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 71, MBASE(3) + 2); // Max acceleration Z - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(4) + 1); - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 71, MBASE(4) + 2); // Max acceleration E - #endif - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_ACCELERATION)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Accel X")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Accel Y")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Accel Z")); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Accel E")); - #endif - #else - DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Acceleration" - draw_max_accel_en(MBASE(1)); say_x(108, MBASE(1)); // "Max Acceleration X" - draw_max_accel_en(MBASE(2)); say_y(108, MBASE(2)); // "Max Acceleration Y" - draw_max_accel_en(MBASE(3)); say_z(108, MBASE(3)); // "Max Acceleration Z" - #if HAS_HOTEND - draw_max_accel_en(MBASE(4)); say_e(108, MBASE(4)); // "Max Acceleration E" - #endif - #endif - } - - Draw_Back_First(); - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxAccX + i); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(1), planner.settings.max_acceleration_mm_per_s2[X_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(2), planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(3), planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); - #if HAS_HOTEND - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(4), planner.settings.max_acceleration_mm_per_s2[E_AXIS]); - #endif -} - -inline void Draw_Max_Jerk_Menu() { - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Jerk" - - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(1)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(1) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(1)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(1)); // Max Jerk speed X - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(2) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(2) + 3); // Max Jerk speed Y - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(3)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(3)); - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(3) + 3); // Max Jerk speed Z - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(4)); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(4) + 1); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(4)); - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 83, MBASE(4) + 3); // Max Jerk speed E - #endif - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_JERK)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Jerk X")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Jerk Y")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Jerk Z")); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Jerk E")); - #endif - #else - DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Jerk" - draw_max_en(MBASE(1)); // "Max" - draw_jerk_en(MBASE(1)); // "Jerk" - draw_speed_en(72, MBASE(1)); // "Speed" - say_x(115, MBASE(1)); // "X" - - draw_max_en(MBASE(2)); // "Max" - draw_jerk_en(MBASE(2)); // "Jerk" - draw_speed_en(72, MBASE(2)); // "Speed" - say_y(115, MBASE(2)); // "Y" - - draw_max_en(MBASE(3)); // "Max" - draw_jerk_en(MBASE(3)); // "Jerk" - draw_speed_en(72, MBASE(3)); // "Speed" - say_z(115, MBASE(3)); // "Z" - - #if HAS_HOTEND - draw_max_en(MBASE(4)); // "Max" - draw_jerk_en(MBASE(4)); // "Jerk" - draw_speed_en(72, MBASE(4)); // "Speed" - say_e(115, MBASE(4)); // "E" - #endif - #endif - } - - Draw_Back_First(); - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); - #if HAS_HOTEND - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); - #endif -} - -inline void Draw_Steps_Menu() { - Clear_Main_Window(); - - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Steps per mm" - - DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(1)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 44, MBASE(1)); // Transmission Ratio X - DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(2)); - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 44, MBASE(2) + 3); // Transmission Ratio Y - DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(3)); - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 44, MBASE(3) + 3); // Transmission Ratio Z - #if HAS_HOTEND - DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(4)); - DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 44, MBASE(4) + 3); // Transmission Ratio E - #endif - } - else { - #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_STEPS_PER_MM)); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Steps/mm X")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Steps/mm Y")); - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Steps/mm Z")); - #if HAS_HOTEND - DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Steps/mm E")); - #endif - #else - DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Steps per mm" - draw_steps_per_mm(MBASE(1)); say_x(103, MBASE(1)); // "Steps-per-mm X" - draw_steps_per_mm(MBASE(2)); say_y(103, MBASE(2)); // "Y" - draw_steps_per_mm(MBASE(3)); say_z(103, MBASE(3)); // "Z" - #if HAS_HOTEND - draw_steps_per_mm(MBASE(4)); say_e(103, MBASE(4)); // "E" - #endif - #endif - } - - Draw_Back_First(); - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_StepX + i); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); - #if HAS_HOTEND - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); - #endif -} - -/* Motion */ -void HMI_Motion() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_motion.inc(1 + MOTION_CASE_TOTAL)) Move_Highlight(1, select_motion.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_motion.dec()) Move_Highlight(-1, select_motion.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_motion.now) { - case 0: // Back - checkkey = Control; - select_control.set(CONTROL_CASE_MOVE); - index_control = MROWS; - Draw_Control_Menu(); - break; - case MOTION_CASE_RATE: // Max speed - checkkey = MaxSpeed; - select_speed.reset(); - Draw_Max_Speed_Menu(); - break; - case MOTION_CASE_ACCEL: // Max acceleration - checkkey = MaxAcceleration; - select_acc.reset(); - Draw_Max_Accel_Menu(); - break; - #if HAS_CLASSIC_JERK - case MOTION_CASE_JERK: // Max jerk - checkkey = MaxJerk; - select_jerk.reset(); - Draw_Max_Jerk_Menu(); - break; - #endif - case MOTION_CASE_STEPS: // Steps per mm - checkkey = Step; - select_step.reset(); - Draw_Steps_Menu(); - break; - default: break; - } - } - DWIN_UpdateLCD(); -} - -/* Info */ -void HMI_Info() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - if (encoder_diffState == ENCODER_DIFF_ENTER) { - #if HAS_ONESTEP_LEVELING - checkkey = Control; - select_control.set(CONTROL_CASE_INFO); - Draw_Control_Menu(); - #else - select_page.set(3); - Goto_MainMenu(); - #endif - } - DWIN_UpdateLCD(); -} - -/* Tune */ -void HMI_Tune() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_tune.inc(1 + TUNE_CASE_TOTAL)) { - if (select_tune.now > MROWS && select_tune.now > index_tune) { - index_tune = select_tune.now; - Scroll_Menu(DWIN_SCROLL_UP); - } - else { - Move_Highlight(1, select_tune.now + MROWS - index_tune); - } - } - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_tune.dec()) { - if (select_tune.now < index_tune - MROWS) { - index_tune--; - Scroll_Menu(DWIN_SCROLL_DOWN); - if (index_tune == MROWS) Draw_Back_First(); - } - else { - Move_Highlight(-1, select_tune.now + MROWS - index_tune); - } - } - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_tune.now) { - case 0: { // Back - select_print.set(0); - Goto_PrintProcess(); - } - break; - case TUNE_CASE_SPEED: // Print speed - checkkey = PrintSpeed; - HMI_ValueStruct.print_speed = feedrate_percentage; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_SPEED + MROWS - index_tune), feedrate_percentage); - EncoderRate.enabled = true; - break; - #if HAS_HOTEND - case TUNE_CASE_TEMP: // Nozzle temp - checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); - EncoderRate.enabled = true; - break; - #endif - #if HAS_HEATED_BED - case TUNE_CASE_BED: // Bed temp - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); - EncoderRate.enabled = true; - break; - #endif - #if HAS_FAN - case TUNE_CASE_FAN: // Fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); - EncoderRate.enabled = true; - break; - #endif - #if HAS_ZOFFSET_ITEM - case TUNE_CASE_ZOFF: // Z-offset - #if EITHER(HAS_BED_PROBE, BABYSTEPPING) - checkkey = Homeoffset; - HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; - DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(TUNE_CASE_ZOFF + MROWS - index_tune), HMI_ValueStruct.offset_value); - EncoderRate.enabled = true; - #else - // Apply workspace offset, making the current position 0,0,0 - queue.inject_P(PSTR("G92 X0 Y0 Z0")); - HMI_AudioFeedback(); - #endif - break; - #endif - default: break; - } - } - DWIN_UpdateLCD(); -} - -#if HAS_PREHEAT - - /* PLA Preheat */ - void HMI_PLAPreheatSetting() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_PLA.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_PLA.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_PLA.dec()) Move_Highlight(-1, select_PLA.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_PLA.now) { - case 0: // Back - checkkey = TemperatureID; - select_temp.now = TEMP_CASE_PLA; - HMI_ValueStruct.show_mode = -1; - Draw_Temperature_Menu(); - break; - #if HAS_HOTEND - case PREHEAT_CASE_TEMP: // Nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = ui.material_preset[0].hotend_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[0].hotend_temp); - EncoderRate.enabled = true; - break; - #endif - #if HAS_HEATED_BED - case PREHEAT_CASE_BED: // Bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = ui.material_preset[0].bed_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[0].bed_temp); - EncoderRate.enabled = true; - break; - #endif - #if HAS_FAN - case PREHEAT_CASE_FAN: // Fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = ui.material_preset[0].fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[0].fan_speed); - EncoderRate.enabled = true; - break; - #endif - #if ENABLED(EEPROM_SETTINGS) - case 4: { // Save PLA configuration - const bool success = settings.save(); - HMI_AudioFeedback(success); - } break; - #endif - default: break; - } - } - DWIN_UpdateLCD(); - } - - /* ABS Preheat */ - void HMI_ABSPreheatSetting() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_ABS.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_ABS.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_ABS.dec()) Move_Highlight(-1, select_ABS.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - switch (select_ABS.now) { - case 0: // Back - checkkey = TemperatureID; - select_temp.now = TEMP_CASE_ABS; - HMI_ValueStruct.show_mode = -1; - Draw_Temperature_Menu(); - break; - #if HAS_HOTEND - case PREHEAT_CASE_TEMP: // Set nozzle temperature - checkkey = ETemp; - HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[1].hotend_temp); - EncoderRate.enabled = true; - break; - #endif - #if HAS_HEATED_BED - case PREHEAT_CASE_BED: // Set bed temperature - checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[1].bed_temp); - EncoderRate.enabled = true; - break; - #endif - #if HAS_FAN - case PREHEAT_CASE_FAN: // Set fan speed - checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[1].fan_speed); - EncoderRate.enabled = true; - break; - #endif - #if ENABLED(EEPROM_SETTINGS) - case PREHEAT_CASE_SAVE: { // Save ABS configuration - const bool success = settings.save(); - HMI_AudioFeedback(success); - } break; - #endif - default: break; - } - } - DWIN_UpdateLCD(); - } - -#endif - -/* Max Speed */ -void HMI_MaxSpeed() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_speed.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_speed.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_speed.dec()) Move_Highlight(-1, select_speed.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - if (WITHIN(select_speed.now, 1, 4)) { - checkkey = MaxSpeed_value; - HMI_flag.feedspeed_axis = AxisEnum(select_speed.now - 1); - HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[HMI_flag.feedspeed_axis]; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); - EncoderRate.enabled = true; - } - else { // Back - checkkey = Motion; - select_motion.now = MOTION_CASE_RATE; - Draw_Motion_Menu(); - } - } - DWIN_UpdateLCD(); -} - -/* Max Acceleration */ -void HMI_MaxAcceleration() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_acc.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_acc.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_acc.dec()) Move_Highlight(-1, select_acc.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - if (WITHIN(select_acc.now, 1, 4)) { - checkkey = MaxAcceleration_value; - HMI_flag.acc_axis = AxisEnum(select_acc.now - 1); - HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[HMI_flag.acc_axis]; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); - EncoderRate.enabled = true; - } - else { // Back - checkkey = Motion; - select_motion.now = MOTION_CASE_ACCEL; - Draw_Motion_Menu(); - } - } - DWIN_UpdateLCD(); -} - -#if HAS_CLASSIC_JERK - /* Max Jerk */ - void HMI_MaxJerk() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_jerk.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_jerk.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_jerk.dec()) Move_Highlight(-1, select_jerk.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - if (WITHIN(select_jerk.now, 1, 4)) { - checkkey = MaxJerk_value; - HMI_flag.jerk_axis = AxisEnum(select_jerk.now - 1); - HMI_ValueStruct.Max_Jerk = planner.max_jerk[HMI_flag.jerk_axis] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); - EncoderRate.enabled = true; - } - else { // Back - checkkey = Motion; - select_motion.now = MOTION_CASE_JERK; - Draw_Motion_Menu(); - } - } - DWIN_UpdateLCD(); - } -#endif // HAS_CLASSIC_JERK - -/* Step */ -void HMI_Step() { - ENCODER_DiffState encoder_diffState = get_encoder_state(); - if (encoder_diffState == ENCODER_DIFF_NO) return; - - // Avoid flicker by updating only the previous menu - if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_step.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_step.now); - } - else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_step.dec()) Move_Highlight(-1, select_step.now); - } - else if (encoder_diffState == ENCODER_DIFF_ENTER) { - if (WITHIN(select_step.now, 1, 4)) { - checkkey = Step_value; - HMI_flag.step_axis = AxisEnum(select_step.now - 1); - HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[HMI_flag.step_axis] * MINUNITMULT; - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); - EncoderRate.enabled = true; - } - else { // Back - checkkey = Motion; - select_motion.now = MOTION_CASE_STEPS; - Draw_Motion_Menu(); - } - } - DWIN_UpdateLCD(); -} - -void HMI_Init() { - HMI_SDCardInit(); - - for (uint16_t t = 0; t <= 100; t += 2) { - DWIN_ICON_Show(ICON, ICON_Bar, 15, 260); - DWIN_Draw_Rectangle(1, Color_Bg_Black, 15 + t * 242 / 100, 260, 257, 280); - DWIN_UpdateLCD(); - delay(20); - } - - HMI_SetLanguage(); -} - -void DWIN_Update() { - EachMomentUpdate(); // Status update - HMI_SDCardUpdate(); // SD card update - DWIN_HandleScreen(); // Rotary encoder update -} - -void EachMomentUpdate() { - static millis_t next_rts_update_ms = 0; - const millis_t ms = millis(); - if (PENDING(ms, next_rts_update_ms)) return; - next_rts_update_ms = ms + DWIN_SCROLL_UPDATE_INTERVAL; - - // variable update - update_variable(); - - if (checkkey == PrintProcess) { - // if print done - if (HMI_flag.print_finish && !HMI_flag.done_confirm_flag) { - HMI_flag.print_finish = false; - HMI_flag.done_confirm_flag = true; - - TERN_(POWER_LOSS_RECOVERY, recovery.cancel()); - - planner.finish_and_disable(); - - // show percent bar and value - Percentrecord = 0; - Draw_Print_ProgressBar(); - - // show print done confirm - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 250, DWIN_WIDTH - 1, STATUS_Y); - DWIN_ICON_Show(ICON, HMI_IsChinese() ? ICON_Confirm_C : ICON_Confirm_E, 86, 283); - } - else if (HMI_flag.pause_flag != printingIsPaused()) { - // print status update - HMI_flag.pause_flag = printingIsPaused(); - if (HMI_flag.pause_flag) ICON_Continue(); else ICON_Pause(); - } - } - - // pause after homing - if (HMI_flag.pause_action && printingIsPaused() && !planner.has_blocks_queued()) { - HMI_flag.pause_action = false; - #if ENABLED(PAUSE_HEAT) - #if HAS_HEATED_BED - tempbed = thermalManager.temp_bed.target; - #endif - #if HAS_HOTEND - temphot = thermalManager.temp_hotend[0].target; - #endif - thermalManager.disable_all_heaters(); - #endif - queue.inject_P(PSTR("G1 F1200 X0 Y0")); - } - - if (card.isPrinting() && checkkey == PrintProcess) { // print process - const uint8_t card_pct = card.percentDone(); - static uint8_t last_cardpercentValue = 101; - if (last_cardpercentValue != card_pct) { // print percent - last_cardpercentValue = card_pct; - if (card_pct) { - Percentrecord = card_pct; - Draw_Print_ProgressBar(); - } - } - - duration_t elapsed = print_job_timer.duration(); // print timer - - // Print time so far - static uint16_t last_Printtime = 0; - const uint16_t min = (elapsed.value % 3600) / 60; - if (last_Printtime != min) { // 1 minute update - last_Printtime = min; - Draw_Print_ProgressElapsed(); - } - - // Estimate remaining time every 20 seconds - static millis_t next_remain_time_update = 0; - if (Percentrecord > 1 && ELAPSED(ms, next_remain_time_update) && !HMI_flag.heat_flag) { - remain_time = (elapsed.value - dwin_heat_time) / (Percentrecord * 0.01f) - (elapsed.value - dwin_heat_time); - next_remain_time_update += 20 * 1000UL; - Draw_Print_ProgressRemain(); - } - } - else if (dwin_abort_flag && !HMI_flag.home_flag) { // Print Stop - dwin_abort_flag = false; - HMI_ValueStruct.print_speed = feedrate_percentage = 100; - dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); - select_page.set(0); - Goto_MainMenu(); - } - #if ENABLED(POWER_LOSS_RECOVERY) - else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off - static bool recovery_flag = false; - - recovery.dwin_flag = false; - recovery_flag = true; - - auto update_selection = [&](const bool sel) { - HMI_flag.select_flag = sel; - const uint16_t c1 = sel ? Color_Bg_Window : Select_Color; - DWIN_Draw_Rectangle(0, c1, 25, 306, 126, 345); - DWIN_Draw_Rectangle(0, c1, 24, 305, 127, 346); - const uint16_t c2 = sel ? Select_Color : Color_Bg_Window; - DWIN_Draw_Rectangle(0, c2, 145, 306, 246, 345); - DWIN_Draw_Rectangle(0, c2, 144, 305, 247, 346); - }; - - Popup_Window_Resume(); - update_selection(true); - - // TODO: Get the name of the current file from someplace - // - //(void)recovery.interrupted_file_exists(); - char * const name = card.longest_filename(); - const int8_t npos = _MAX(0U, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; - DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, npos, 252, name); - DWIN_UpdateLCD(); - - while (recovery_flag) { - ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); - if (encoder_diffState != ENCODER_DIFF_NO) { - if (encoder_diffState == ENCODER_DIFF_ENTER) { - recovery_flag = false; - if (HMI_flag.select_flag) break; - TERN_(POWER_LOSS_RECOVERY, queue.inject_P(PSTR("M1000C"))); - HMI_StartFrame(true); - return; - } - else - update_selection(encoder_diffState == ENCODER_DIFF_CW); - - DWIN_UpdateLCD(); - } - } - - select_print.set(0); - HMI_ValueStruct.show_mode = 0; - queue.inject_P(PSTR("M1000")); - Goto_PrintProcess(); - Draw_Status_Area(true); - } - #endif - DWIN_UpdateLCD(); -} - -void DWIN_HandleScreen() { - switch (checkkey) { - case MainMenu: HMI_MainMenu(); break; - case SelectFile: HMI_SelectFile(); break; - case Prepare: HMI_Prepare(); break; - case Control: HMI_Control(); break; - case Leveling: break; - case PrintProcess: HMI_Printing(); break; - case Print_window: HMI_PauseOrStop(); break; - case AxisMove: HMI_AxisMove(); break; - case TemperatureID: HMI_Temperature(); break; - case Motion: HMI_Motion(); break; - case Info: HMI_Info(); break; - case Tune: HMI_Tune(); break; - #if HAS_PREHEAT - case PLAPreheat: HMI_PLAPreheatSetting(); break; - case ABSPreheat: HMI_ABSPreheatSetting(); break; - #endif - case MaxSpeed: HMI_MaxSpeed(); break; - case MaxAcceleration: HMI_MaxAcceleration(); break; - case MaxJerk: HMI_MaxJerk(); break; - case Step: HMI_Step(); break; - case Move_X: HMI_Move_X(); break; - case Move_Y: HMI_Move_Y(); break; - case Move_Z: HMI_Move_Z(); break; - #if HAS_HOTEND - case Extruder: HMI_Move_E(); break; - case ETemp: HMI_ETemp(); break; - #endif - #if EITHER(HAS_BED_PROBE, BABYSTEPPING) - case Homeoffset: HMI_Zoffset(); break; - #endif - #if HAS_HEATED_BED - case BedTemp: HMI_BedTemp(); break; - #endif - #if HAS_PREHEAT - case FanSpeed: HMI_FanSpeed(); break; - #endif - case PrintSpeed: HMI_PrintSpeed(); break; - case MaxSpeed_value: HMI_MaxFeedspeedXYZE(); break; - case MaxAcceleration_value: HMI_MaxAccelerationXYZE(); break; - case MaxJerk_value: HMI_MaxJerkXYZE(); break; - case Step_value: HMI_StepXYZE(); break; - default: break; - } -} - -void DWIN_CompletedHoming() { - HMI_flag.home_flag = false; - if (checkkey == Last_Prepare) { - checkkey = Prepare; - select_prepare.now = PREPARE_CASE_HOME; - index_prepare = MROWS; - Draw_Prepare_Menu(); - } - else if (checkkey == Back_Main) { - HMI_ValueStruct.print_speed = feedrate_percentage = 100; - dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); - planner.finish_and_disable(); - Goto_MainMenu(); - } -} - -void DWIN_CompletedLeveling() { - if (checkkey == Leveling) Goto_MainMenu(); -} - -#endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h deleted file mode 100644 index 5bff2e9f78..0000000000 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ /dev/null @@ -1,373 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * DWIN by Creality3D - */ - -#include "../dwin_lcd.h" -#include "rotary_encoder.h" -#include "../../../libs/BL24CXX.h" - -#include "../../../inc/MarlinConfigPre.h" - -#if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) && PREHEAT_COUNT - #define HAS_PREHEAT 1 - #if PREHEAT_COUNT < 2 - #error "Creality DWIN requires two material preheat presets." - #endif -#endif - -enum processID : uint8_t { - // Process ID - MainMenu, - SelectFile, - Prepare, - Control, - Leveling, - PrintProcess, - AxisMove, - TemperatureID, - Motion, - Info, - Tune, - #if HAS_PREHEAT - PLAPreheat, - ABSPreheat, - #endif - MaxSpeed, - MaxSpeed_value, - MaxAcceleration, - MaxAcceleration_value, - MaxJerk, - MaxJerk_value, - Step, - Step_value, - - // Last Process ID - Last_Prepare, - - // Back Process ID - Back_Main, - Back_Print, - - // Date variable ID - Move_X, - Move_Y, - Move_Z, - #if HAS_HOTEND - Extruder, - ETemp, - #endif - Homeoffset, - #if HAS_HEATED_BED - BedTemp, - #endif - #if HAS_FAN - FanSpeed, - #endif - PrintSpeed, - - // Window ID - Print_window, - Popup_Window -}; - -// Picture ID -#define Start_Process 0 -#define Language_English 1 -#define Language_Chinese 2 - -// ICON ID -#define ICON 0x09 -#define ICON_LOGO 0 -#define ICON_Print_0 1 -#define ICON_Print_1 2 -#define ICON_Prepare_0 3 -#define ICON_Prepare_1 4 -#define ICON_Control_0 5 -#define ICON_Control_1 6 -#define ICON_Leveling_0 7 -#define ICON_Leveling_1 8 -#define ICON_HotendTemp 9 -#define ICON_BedTemp 10 -#define ICON_Speed 11 -#define ICON_Zoffset 12 -#define ICON_Back 13 -#define ICON_File 14 -#define ICON_PrintTime 15 -#define ICON_RemainTime 16 -#define ICON_Setup_0 17 -#define ICON_Setup_1 18 -#define ICON_Pause_0 19 -#define ICON_Pause_1 20 -#define ICON_Continue_0 21 -#define ICON_Continue_1 22 -#define ICON_Stop_0 23 -#define ICON_Stop_1 24 -#define ICON_Bar 25 -#define ICON_More 26 - -#define ICON_Axis 27 -#define ICON_CloseMotor 28 -#define ICON_Homing 29 -#define ICON_SetHome 30 -#define ICON_PLAPreheat 31 -#define ICON_ABSPreheat 32 -#define ICON_Cool 33 -#define ICON_Language 34 - -#define ICON_MoveX 35 -#define ICON_MoveY 36 -#define ICON_MoveZ 37 -#define ICON_Extruder 38 - -#define ICON_Temperature 40 -#define ICON_Motion 41 -#define ICON_WriteEEPROM 42 -#define ICON_ReadEEPROM 43 -#define ICON_ResumeEEPROM 44 -#define ICON_Info 45 - -#define ICON_SetEndTemp 46 -#define ICON_SetBedTemp 47 -#define ICON_FanSpeed 48 -#define ICON_SetPLAPreheat 49 -#define ICON_SetABSPreheat 50 - -#define ICON_MaxSpeed 51 -#define ICON_MaxAccelerated 52 -#define ICON_MaxJerk 53 -#define ICON_Step 54 -#define ICON_PrintSize 55 -#define ICON_Version 56 -#define ICON_Contact 57 -#define ICON_StockConfiguraton 58 -#define ICON_MaxSpeedX 59 -#define ICON_MaxSpeedY 60 -#define ICON_MaxSpeedZ 61 -#define ICON_MaxSpeedE 62 -#define ICON_MaxAccX 63 -#define ICON_MaxAccY 64 -#define ICON_MaxAccZ 65 -#define ICON_MaxAccE 66 -#define ICON_MaxSpeedJerkX 67 -#define ICON_MaxSpeedJerkY 68 -#define ICON_MaxSpeedJerkZ 69 -#define ICON_MaxSpeedJerkE 70 -#define ICON_StepX 71 -#define ICON_StepY 72 -#define ICON_StepZ 73 -#define ICON_StepE 74 -#define ICON_Setspeed 75 -#define ICON_SetZOffset 76 -#define ICON_Rectangle 77 -#define ICON_BLTouch 78 -#define ICON_TempTooLow 79 -#define ICON_AutoLeveling 80 -#define ICON_TempTooHigh 81 -#define ICON_NoTips_C 82 -#define ICON_NoTips_E 83 -#define ICON_Continue_C 84 -#define ICON_Continue_E 85 -#define ICON_Cancel_C 86 -#define ICON_Cancel_E 87 -#define ICON_Confirm_C 88 -#define ICON_Confirm_E 89 -#define ICON_Info_0 90 -#define ICON_Info_1 91 - -/** - * 3-.0:The font size, 0x00-0x09, corresponds to the font size below: - * 0x00=6*12 0x01=8*16 0x02=10*20 0x03=12*24 0x04=14*28 - * 0x05=16*32 0x06=20*40 0x07=24*48 0x08=28*56 0x09=32*64 - */ -#define font6x12 0x00 -#define font8x16 0x01 -#define font10x20 0x02 -#define font12x24 0x03 -#define font14x28 0x04 -#define font16x32 0x05 -#define font20x40 0x06 -#define font24x48 0x07 -#define font28x56 0x08 -#define font32x64 0x09 - -// Color -#define Color_White 0xFFFF -#define Color_Yellow 0xFF0F -#define Color_Bg_Window 0x31E8 // Popup background color -#define Color_Bg_Blue 0x1125 // Dark blue background color -#define Color_Bg_Black 0x0841 // Black background color -#define Color_Bg_Red 0xF00F // Red background color -#define Popup_Text_Color 0xD6BA // Popup font background color -#define Line_Color 0x3A6A // Split line color -#define Rectangle_Color 0xEE2F // Blue square cursor color -#define Percent_Color 0xFE29 // Percentage color -#define BarFill_Color 0x10E4 // Fill color of progress bar -#define Select_Color 0x33BB // Selected color - -extern uint8_t checkkey; -extern float zprobe_zoffset; -extern char print_filename[16]; - -extern millis_t dwin_heat_time; - -typedef struct { - TERN_(HAS_HOTEND, int16_t E_Temp = 0); - TERN_(HAS_HEATED_BED, int16_t Bed_Temp = 0); - TERN_(HAS_PREHEAT, int16_t Fan_speed = 0); - int16_t print_speed = 100; - float Max_Feedspeed = 0; - float Max_Acceleration = 0; - float Max_Jerk = 0; - float Max_Step = 0; - float Move_X_scale = 0; - float Move_Y_scale = 0; - float Move_Z_scale = 0; - #if HAS_HOTEND - float Move_E_scale = 0; - #endif - float offset_value = 0; - char show_mode = 0; // -1: Temperature control 0: Printing temperature -} HMI_value_t; - -#define DWIN_CHINESE 123 -#define DWIN_ENGLISH 0 - -typedef struct { - uint8_t language; - bool pause_flag:1; - bool pause_action:1; - bool print_finish:1; - bool done_confirm_flag:1; - bool select_flag:1; - bool home_flag:1; - bool heat_flag:1; // 0: heating done 1: during heating - #if ENABLED(PREVENT_COLD_EXTRUSION) - bool ETempTooLow_flag:1; - #endif - #if HAS_LEVELING - bool leveling_offset_flag:1; - #endif - #if HAS_FAN - AxisEnum feedspeed_axis; - #endif - AxisEnum acc_axis, jerk_axis, step_axis; -} HMI_Flag_t; - -extern HMI_value_t HMI_ValueStruct; -extern HMI_Flag_t HMI_flag; - -// Show ICO -void ICON_Print(bool show); -void ICON_Prepare(bool show); -void ICON_Control(bool show); -void ICON_Leveling(bool show); -void ICON_StartInfo(bool show); - -void ICON_Setting(bool show); -void ICON_Pause(bool show); -void ICON_Continue(bool show); -void ICON_Stop(bool show); - -#if HAS_HOTEND || HAS_HEATED_BED - // Popup message window - void DWIN_Popup_Temperature(const bool toohigh); -#endif - -#if HAS_HOTEND - void Popup_Window_ETempTooLow(); -#endif - -void Popup_Window_Resume(); -void Popup_Window_Home(const bool parking=false); -void Popup_Window_Leveling(); - -void Goto_PrintProcess(); -void Goto_MainMenu(); - -// Variable control -void HMI_Move_X(); -void HMI_Move_Y(); -void HMI_Move_Z(); -void HMI_Move_E(); - -void HMI_Zoffset(); - -TERN_(HAS_HOTEND, void HMI_ETemp()); -TERN_(HAS_HEATED_BED, void HMI_BedTemp()); -TERN_(HAS_FAN, void HMI_FanSpeed()); - -void HMI_PrintSpeed(); - -void HMI_MaxFeedspeedXYZE(); -void HMI_MaxAccelerationXYZE(); -void HMI_MaxJerkXYZE(); -void HMI_StepXYZE(); - -void update_variable(); -void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); - -// SD Card -void HMI_SDCardInit(); -void HMI_SDCardUpdate(); - -// Main Process -void Icon_print(bool value); -void Icon_control(bool value); -void Icon_temperature(bool value); -void Icon_leveling(bool value); - -// Other -void Draw_Status_Area(const bool with_update); // Status Area -void HMI_StartFrame(const bool with_update); // Prepare the menu view -void HMI_MainMenu(); // Main process screen -void HMI_SelectFile(); // File page -void HMI_Printing(); // Print page -void HMI_Prepare(); // Prepare page -void HMI_Control(); // Control page -void HMI_Leveling(); // Level the page -void HMI_AxisMove(); // Axis movement menu -void HMI_Temperature(); // Temperature menu -void HMI_Motion(); // Sports menu -void HMI_Info(); // Information menu -void HMI_Tune(); // Adjust the menu - -#if HAS_PREHEAT - void HMI_PLAPreheatSetting(); // PLA warm-up setting - void HMI_ABSPreheatSetting(); // ABS warm-up setting -#endif - -void HMI_MaxSpeed(); // Maximum speed submenu -void HMI_MaxAcceleration(); // Maximum acceleration submenu -void HMI_MaxJerk(); // Maximum jerk speed submenu -void HMI_Step(); // Transmission ratio - -void HMI_Init(); -void DWIN_Update(); -void EachMomentUpdate(); -void DWIN_HandleScreen(); - -void DWIN_CompletedHoming(); -void DWIN_CompletedLeveling(); diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp deleted file mode 100644 index d39c6cfbd5..0000000000 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/***************************************************************************** - * @file rotary_encoder.cpp - * @author LEO / Creality3D - * @date 2019/07/06 - * @version 2.0.1 - * @brief Rotary encoder functions - *****************************************************************************/ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(DWIN_CREALITY_LCD) - -#include "rotary_encoder.h" - -#include "../../../MarlinCore.h" -#include "../../../HAL/shared/Delay.h" - -#if HAS_BUZZER - #include "../../../libs/buzzer.h" -#endif - -#include - -ENCODER_Rate EncoderRate; - -// Buzzer -void Encoder_tick(void) { - WRITE(BEEPER_PIN, 1); - delay(10); - WRITE(BEEPER_PIN, 0); -} - -// Encoder initialization -void Encoder_Configuration(void) { - #if BUTTON_EXISTS(EN1) - SET_INPUT_PULLUP(BTN_EN1); - #endif - #if BUTTON_EXISTS(EN2) - SET_INPUT_PULLUP(BTN_EN2); - #endif - #if BUTTON_EXISTS(ENC) - SET_INPUT_PULLUP(BTN_ENC); - #endif - #ifdef BEEPER_PIN - SET_OUTPUT(BEEPER_PIN); - #endif -} - -// Analyze encoder value and return state -ENCODER_DiffState Encoder_ReceiveAnalyze(void) { - const millis_t now = millis(); - static unsigned char lastEncoderBits; - unsigned char newbutton = 0; - static signed char temp_diff = 0; - - ENCODER_DiffState temp_diffState = ENCODER_DIFF_NO; - if (BUTTON_PRESSED(EN1)) newbutton |= 0x01; - if (BUTTON_PRESSED(EN2)) newbutton |= 0x02; - if (BUTTON_PRESSED(ENC)) { - static millis_t next_click_update_ms; - if (ELAPSED(now, next_click_update_ms)) { - next_click_update_ms = millis() + 300; - Encoder_tick(); - #if PIN_EXISTS(LCD_LED) - //LED_Action(); - #endif - const bool was_waiting = wait_for_user; - wait_for_user = false; - return was_waiting ? ENCODER_DIFF_NO : ENCODER_DIFF_ENTER; - } - else return ENCODER_DIFF_NO; - } - if (newbutton != lastEncoderBits) { - switch (newbutton) { - case ENCODER_PHASE_0: { - if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++; - else if (lastEncoderBits == ENCODER_PHASE_1) temp_diff--; - }break; - case ENCODER_PHASE_1: { - if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++; - else if (lastEncoderBits == ENCODER_PHASE_2) temp_diff--; - }break; - case ENCODER_PHASE_2: { - if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++; - else if (lastEncoderBits == ENCODER_PHASE_3) temp_diff--; - }break; - case ENCODER_PHASE_3: { - if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++; - else if (lastEncoderBits == ENCODER_PHASE_0) temp_diff--; - }break; - } - lastEncoderBits = newbutton; - } - - if (abs(temp_diff) >= ENCODER_PULSES_PER_STEP) { - if (temp_diff > 0) temp_diffState = ENCODER_DIFF_CW; - else temp_diffState = ENCODER_DIFF_CCW; - - #if ENABLED(ENCODER_RATE_MULTIPLIER) - - millis_t ms = millis(); - int32_t encoderMultiplier = 1; - - // if must encoder rati multiplier - if (EncoderRate.enabled) { - const float abs_diff = ABS(temp_diff), - encoderMovementSteps = abs_diff / (ENCODER_PULSES_PER_STEP); - if (EncoderRate.lastEncoderTime) { - // Note that the rate is always calculated between two passes through the - // loop and that the abs of the temp_diff value is tracked. - const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000; - if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100; - else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; - else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5; - } - EncoderRate.lastEncoderTime = ms; - } - #else - constexpr int32_t encoderMultiplier = 1; - #endif // ENCODER_RATE_MULTIPLIER - - // EncoderRate.encoderMoveValue += (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); - EncoderRate.encoderMoveValue = (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); - if (EncoderRate.encoderMoveValue < 0) EncoderRate.encoderMoveValue = -EncoderRate.encoderMoveValue; - - temp_diff = 0; - } - return temp_diffState; -} - -#if PIN_EXISTS(LCD_LED) - - // Take the low 24 valid bits 24Bit: G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0 - unsigned int LED_DataArray[LED_NUM]; - - // LED light operation - void LED_Action(void) { - LED_Control(RGB_SCALE_WARM_WHITE,0x0F); - delay(30); - LED_Control(RGB_SCALE_WARM_WHITE,0x00); - } - - // LED initialization - void LED_Configuration(void) { - SET_OUTPUT(LCD_LED_PIN); - } - - // LED write data - void LED_WriteData(void) { - unsigned char tempCounter_LED, tempCounter_Bit; - for (tempCounter_LED = 0; tempCounter_LED < LED_NUM; tempCounter_LED++) { - for (tempCounter_Bit = 0; tempCounter_Bit < 24; tempCounter_Bit++) { - if (LED_DataArray[tempCounter_LED] & (0x800000 >> tempCounter_Bit)) { - LED_DATA_HIGH; - DELAY_NS(300); - LED_DATA_LOW; - DELAY_NS(200); - } - else { - LED_DATA_HIGH; - LED_DATA_LOW; - DELAY_NS(200); - } - } - } - } - - // LED control - // RGB_Scale: RGB color ratio - // luminance: brightness (0~0xFF) - void LED_Control(unsigned char RGB_Scale, unsigned char luminance) { - unsigned char temp_Counter; - for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { - LED_DataArray[temp_Counter] = 0; - switch (RGB_Scale) { - case RGB_SCALE_R10_G7_B5: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*5/10; break; - case RGB_SCALE_R10_G7_B4: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*4/10; break; - case RGB_SCALE_R10_G8_B7: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*8/10) << 16 | luminance*7/10; break; - } - } - LED_WriteData(); - } - - // LED gradient control - // RGB_Scale: RGB color ratio - // luminance: brightness (0~0xFF) - // change_Time: gradient time (ms) - void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval) { - unsigned char temp_Counter; - unsigned char LED_R_Data[LED_NUM], LED_G_Data[LED_NUM], LED_B_Data[LED_NUM]; - bool LED_R_Flag = 0, LED_G_Flag = 0, LED_B_Flag = 0; - - for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { - switch (RGB_Scale) { - case RGB_SCALE_R10_G7_B5: { - LED_R_Data[temp_Counter] = luminance*10/10; - LED_G_Data[temp_Counter] = luminance*7/10; - LED_B_Data[temp_Counter] = luminance*5/10; - }break; - case RGB_SCALE_R10_G7_B4: { - LED_R_Data[temp_Counter] = luminance*10/10; - LED_G_Data[temp_Counter] = luminance*7/10; - LED_B_Data[temp_Counter] = luminance*4/10; - }break; - case RGB_SCALE_R10_G8_B7: { - LED_R_Data[temp_Counter] = luminance*10/10; - LED_G_Data[temp_Counter] = luminance*8/10; - LED_B_Data[temp_Counter] = luminance*7/10; - }break; - } - } - for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { - if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) > LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000100; - else if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) < LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000100; - while (1) { - else LED_R_Flag = 1; - if ((unsigned char)(LED_DataArray[temp_Counter]>>16) > LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x010000; - else if ((unsigned char)(LED_DataArray[temp_Counter]>>16) < LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x010000; - else LED_G_Flag = 1; - if ((unsigned char)LED_DataArray[temp_Counter] > LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000001; - else if ((unsigned char)LED_DataArray[temp_Counter] < LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000001; - else LED_B_Flag = 1; - } - LED_WriteData(); - if (LED_R_Flag && LED_G_Flag && LED_B_Flag) break; - else delay(change_Interval); - } - } - -#endif // LCD_LED - -#endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h deleted file mode 100644 index 93e54839d6..0000000000 --- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/***************************************************************************** - * @file rotary_encoder.h - * @author LEO / Creality3D - * @date 2019/07/06 - * @version 2.0.1 - * @brief Rotary encoder functions - ****************************************************************************/ - -#include "../../../inc/MarlinConfig.h" -#include "../../../MarlinCore.h" - -/*********************** Encoder Set ***********************/ - -#define ENCODER_PHASE_0 0 -#define ENCODER_PHASE_1 2 -#define ENCODER_PHASE_2 3 -#define ENCODER_PHASE_3 1 - -#define ENCODER_PULSES_PER_STEP 4 - -#define BUTTON_PRESSED(BN) !READ(BTN_## BN) - -typedef struct { - bool enabled = false; - int encoderMoveValue = 0; - millis_t lastEncoderTime = 0; -} ENCODER_Rate; - -extern ENCODER_Rate EncoderRate; - -typedef enum { - ENCODER_DIFF_NO = 0, // no state - ENCODER_DIFF_CW = 1, // clockwise rotation - ENCODER_DIFF_CCW = 2, // counterclockwise rotation - ENCODER_DIFF_ENTER = 3 // click -} ENCODER_DiffState; - -// Encoder initialization -void Encoder_Configuration(void); - -// Analyze encoder value and return state -ENCODER_DiffState Encoder_ReceiveAnalyze(void); - -/*********************** Encoder LED ***********************/ - -#if PIN_EXISTS(LCD_LED) - - #define LED_NUM 4 - #define LED_DATA_HIGH WRITE(LCD_LED_PIN, 1) - #define LED_DATA_LOW WRITE(LCD_LED_PIN, 0) - - #define RGB_SCALE_R10_G7_B5 1 - #define RGB_SCALE_R10_G7_B4 2 - #define RGB_SCALE_R10_G8_B7 3 - #define RGB_SCALE_NEUTRAL_WHITE RGB_SCALE_R10_G7_B5 - #define RGB_SCALE_WARM_WHITE RGB_SCALE_R10_G7_B4 - #define RGB_SCALE_COOL_WHITE RGB_SCALE_R10_G8_B7 - - extern unsigned int LED_DataArray[LED_NUM]; - - // LED light operation - void LED_Action(void); - - // LED initialization - void LED_Configuration(void); - - // LED write data - void LED_WriteData(void); - - // LED control - // RGB_Scale: RGB color ratio - // luminance: brightness (0~0xFF) - void LED_Control(unsigned char RGB_Scale, unsigned char luminance); - - // LED gradient control - // RGB_Scale: RGB color ratio - // luminance: brightness (0~0xFF) - // change_Time: gradient time (ms) - void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval); - -#endif // LCD_LED diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp deleted file mode 100644 index a7f9a7a0c3..0000000000 --- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * lcd/extui/anycubic_chiron_lcd.cpp - * - * Anycubic Chiron TFT support for Marlin - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(ANYCUBIC_LCD_CHIRON) - -#include "ui_api.h" -#include "lib/anycubic_chiron/chiron_tft.h" - -using namespace Anycubic; - -namespace ExtUI { - - void onStartup() { Chiron.Startup(); } - - void onIdle() { Chiron.IdleLoop(); } - - void onPrinterKilled(PGM_P const error, PGM_P const component) { - Chiron.PrinterKilled(error,component); - } - - void onMediaInserted() { Chiron.MediaEvent(AC_media_inserted); } - void onMediaError() { Chiron.MediaEvent(AC_media_error); } - void onMediaRemoved() { Chiron.MediaEvent(AC_media_removed); } - - void onPlayTone(const uint16_t frequency, const uint16_t duration) { - #if ENABLED(SPEAKER) - ::tone(BEEPER_PIN, frequency, duration); - #endif - } - - void onPrintTimerStarted() { Chiron.TimerEvent(AC_timer_started); } - void onPrintTimerPaused() { Chiron.TimerEvent(AC_timer_paused); } - void onPrintTimerStopped() { Chiron.TimerEvent(AC_timer_stopped); } - void onFilamentRunout(const extruder_t) { Chiron.FilamentRunout(); } - void onUserConfirmRequired(const char * const msg) { Chiron.ConfirmationRequest(msg); } - void onStatusChanged(const char * const msg) { Chiron.StatusChange(msg); } - - void onFactoryReset() {} - - void onStoreSettings(char *buff) { - // Called when saving to EEPROM (i.e. M500). If the ExtUI needs - // permanent data to be stored, it can write up to eeprom_data_size bytes - // into buff. - - // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); - // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); - } - - void onLoadSettings(const char *buff) { - // Called while loading settings from EEPROM. If the ExtUI - // needs to retrieve data, it should copy up to eeprom_data_size bytes - // from buff - - // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); - // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); - } - - void onConfigurationStoreWritten(bool success) { - // Called after the entire EEPROM has been written, - // whether successful or not. - } - - void onConfigurationStoreRead(bool success) { - // Called after the entire EEPROM has been read, - // whether successful or not. - } - - #if HAS_MESH - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { - // Called when any mesh points are updated - //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); - } - - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { - // Called to indicate a special condition - //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " state:", state); - } - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - // Called on resume from power-loss - void onPowerLossResume() { Chiron.PowerLossRecovery(); } - #endif - - #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { - // Called for temperature PID tuning result - } - #endif -} - -#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp deleted file mode 100644 index 15526d16fc..0000000000 --- a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * anycubic_i3mega_lcd.cpp - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(ANYCUBIC_LCD_I3MEGA) - -#include "lib/anycubic_i3mega/anycubic_i3mega_lcd.h" -#include "ui_api.h" - -#include // for the ::tone() call - -namespace ExtUI { - - void onStartup() { AnycubicTFT.OnSetup(); } - void onIdle() { AnycubicTFT.OnCommandScan(); } - void onPrinterKilled(PGM_P const error, PGM_P const component) { AnycubicTFT.OnKillTFT(); } - void onMediaInserted() { AnycubicTFT.OnSDCardStateChange(true); } - void onMediaError() { AnycubicTFT.OnSDCardError(); } - void onMediaRemoved() { AnycubicTFT.OnSDCardStateChange(false); } - void onPlayTone(const uint16_t frequency, const uint16_t duration) { - #if ENABLED(SPEAKER) - ::tone(BEEPER_PIN, frequency, duration); - #endif - } - void onPrintTimerStarted() { AnycubicTFT.OnPrintTimerStarted(); } - void onPrintTimerPaused() { AnycubicTFT.OnPrintTimerPaused(); } - void onPrintTimerStopped() { AnycubicTFT.OnPrintTimerStopped(); } - void onFilamentRunout(const extruder_t extruder) { AnycubicTFT.OnFilamentRunout(); } - void onUserConfirmRequired(const char * const msg) { AnycubicTFT.OnUserConfirmRequired(msg); } - void onStatusChanged(const char * const msg) {} - void onFactoryReset() {} - - void onStoreSettings(char *buff) { - // Called when saving to EEPROM (i.e. M500). If the ExtUI needs - // permanent data to be stored, it can write up to eeprom_data_size bytes - // into buff. - - // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); - // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); - } - - void onLoadSettings(const char *buff) { - // Called while loading settings from EEPROM. If the ExtUI - // needs to retrieve data, it should copy up to eeprom_data_size bytes - // from buff - - // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); - // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); - } - - void onConfigurationStoreWritten(bool success) { - // Called after the entire EEPROM has been written, - // whether successful or not. - } - - void onConfigurationStoreRead(bool success) { - // Called after the entire EEPROM has been read, - // whether successful or not. - } - - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { - // Called when any mesh points are updated - } - - #if ENABLED(POWER_LOSS_RECOVERY) - void onPowerLossResume() { - // Called on resume from power-loss - } - #endif - - #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { - // Called for temperature PID tuning result - } - #endif -} - -#endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp deleted file mode 100644 index d175b5acac..0000000000 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * dgus_lcd.cpp - * - * DGUS implementation for Marlin by coldtobi, Feb-May 2019 - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_DGUS_LCD - -#include "ui_api.h" -#include "lib/dgus/DGUSDisplay.h" -#include "lib/dgus/DGUSDisplayDef.h" -#include "lib/dgus/DGUSScreenHandler.h" - -extern const char NUL_STR[]; - -namespace ExtUI { - - void onStartup() { - dgusdisplay.InitDisplay(); - ScreenHandler.UpdateScreenVPData(); - } - - void onIdle() { ScreenHandler.loop(); } - - void onPrinterKilled(PGM_P const error, PGM_P const component) { - ScreenHandler.sendinfoscreen(GET_TEXT(MSG_HALTED), error, NUL_STR, GET_TEXT(MSG_PLEASE_RESET), true, true, true, true); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_KILL); - while (!ScreenHandler.loop()); // Wait while anything is left to be sent - } - - void onMediaInserted() { TERN_(SDSUPPORT, ScreenHandler.SDCardInserted()); } - void onMediaError() { TERN_(SDSUPPORT, ScreenHandler.SDCardError()); } - void onMediaRemoved() { TERN_(SDSUPPORT, ScreenHandler.SDCardRemoved()); } - - void onPlayTone(const uint16_t frequency, const uint16_t duration) {} - void onPrintTimerStarted() {} - void onPrintTimerPaused() {} - void onPrintTimerStopped() {} - void onFilamentRunout(const extruder_t extruder) {} - - void onUserConfirmRequired(const char * const msg) { - if (msg) { - ScreenHandler.sendinfoscreen(PSTR("Please confirm."), nullptr, msg, nullptr, true, true, false, true); - ScreenHandler.SetupConfirmAction(ExtUI::setUserConfirmed); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else if (ScreenHandler.getCurrentScreen() == DGUSLCD_SCREEN_POPUP ) { - ScreenHandler.SetupConfirmAction(nullptr); - ScreenHandler.PopToOldScreen(); - } - } - - void onStatusChanged(const char * const msg) { ScreenHandler.setstatusmessage(msg); } - - void onFactoryReset() {} - void onStoreSettings(char *buff) { - // Called when saving to EEPROM (i.e. M500). If the ExtUI needs - // permanent data to be stored, it can write up to eeprom_data_size bytes - // into buff. - - // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); - // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); - } - - void onLoadSettings(const char *buff) { - // Called while loading settings from EEPROM. If the ExtUI - // needs to retrieve data, it should copy up to eeprom_data_size bytes - // from buff - - // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); - // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); - } - - void onConfigurationStoreWritten(bool success) { - // Called after the entire EEPROM has been written, - // whether successful or not. - } - - void onConfigurationStoreRead(bool success) { - // Called after the entire EEPROM has been read, - // whether successful or not. - } - - #if HAS_MESH - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { - // Called when any mesh points are updated - } - - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { - // Called to indicate a special condition - } - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - void onPowerLossResume() { - // Called on resume from power-loss - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POWER_LOSS); - } - #endif - - - #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { - // Called for temperature PID tuning result - switch (rst) { - case PID_BAD_EXTRUDER_NUM: - ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_BAD_EXTRUDER_NUM)); - break; - case PID_TEMP_TOO_HIGH: - ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_TEMP_TOO_HIGH)); - break; - case PID_TUNING_TIMEOUT: - ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_TIMEOUT)); - break; - case PID_DONE: - ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_AUTOTUNE_DONE)); - break; - } - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN); - } - #endif - -} -#endif // HAS_DGUS_LCD diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp deleted file mode 100644 index a5ef5652bc..0000000000 --- a/Marlin/src/lcd/extui/example.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/********************* - * example.cpp * - *********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(EXTUI_EXAMPLE, EXTENSIBLE_UI) - -#include "ui_api.h" - -// To implement a new UI, complete the functions below and -// read or update Marlin's state using the methods in the -// ExtUI methods in "../ui_api.h" -// -// Although it may be possible to access other state -// variables from Marlin, using the API here possibly -// helps ensure future compatibility. - -namespace ExtUI { - void onStartup() { - /* Initialize the display module here. The following - * routines are available for access to the GPIO pins: - * - * SET_OUTPUT(pin) - * SET_INPUT_PULLUP(pin) - * SET_INPUT(pin) - * WRITE(pin,value) - * READ(pin) - */ - } - void onIdle() {} - void onPrinterKilled(PGM_P const error, PGM_P const component) {} - void onMediaInserted() {}; - void onMediaError() {}; - void onMediaRemoved() {}; - void onPlayTone(const uint16_t frequency, const uint16_t duration) {} - void onPrintTimerStarted() {} - void onPrintTimerPaused() {} - void onPrintTimerStopped() {} - void onFilamentRunout(const extruder_t extruder) {} - void onUserConfirmRequired(const char * const msg) {} - void onStatusChanged(const char * const msg) {} - void onFactoryReset() {} - - void onStoreSettings(char *buff) { - // Called when saving to EEPROM (i.e. M500). If the ExtUI needs - // permanent data to be stored, it can write up to eeprom_data_size bytes - // into buff. - - // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); - // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); - } - - void onLoadSettings(const char *buff) { - // Called while loading settings from EEPROM. If the ExtUI - // needs to retrieve data, it should copy up to eeprom_data_size bytes - // from buff - - // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); - // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); - } - - void onConfigurationStoreWritten(bool success) { - // Called after the entire EEPROM has been written, - // whether successful or not. - } - - void onConfigurationStoreRead(bool success) { - // Called after the entire EEPROM has been read, - // whether successful or not. - } - - #if HAS_MESH - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { - // Called when any mesh points are updated - } - - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { - // Called to indicate a special condition - } - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - void onPowerLossResume() { - // Called on resume from power-loss - } - #endif - - #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { - // Called for temperature PID tuning result - } - #endif -} - -#endif // EXTUI_EXAMPLE && EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp deleted file mode 100644 index fb4c84abb4..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * lcd/extui/lib/FileNavigator.cpp - * - * Extensible_UI implementation for Anycubic Chiron - * Written By Nick Wells, 2020 [https://github.com/SwiftNick] - * (not affiliated with Anycubic, Ltd.) - */ - -/*************************************************************************** - * The AC panel wants files in block of 4 and can only display a flat list * - * This library allows full folder traversal. * - ***************************************************************************/ - -#include "../../../../inc/MarlinConfigPre.h" - -#if ENABLED(ANYCUBIC_LCD_CHIRON) - -#include "FileNavigator.h" -#include "chiron_tft.h" - -using namespace ExtUI; - -namespace Anycubic { - - FileList FileNavigator::filelist; // Instance of the Marlin file API - char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path - uint16_t FileNavigator::lastindex; - uint8_t FileNavigator::folderdepth; - uint16_t FileNavigator::currentindex; // override the panel request - - FileNavigator::FileNavigator() { reset(); } - - void FileNavigator::reset() { - currentfoldername[0] = '\0'; - folderdepth = 0; - currentindex = 0; - lastindex = 0; - // Start at root folder - while (!filelist.isAtRootDir()) filelist.upDir(); - refresh(); - } - - void FileNavigator::refresh() { filelist.refresh(); } - - void FileNavigator::getFiles(uint16_t index) { - uint8_t files = 4; - if (index == 0) currentindex = 0; - - // Each time we change folder we reset the file index to 0 and keep track - // of the current position as the TFT panel isnt aware of folders trees. - if (index > 0) { - --currentindex; // go back a file to take account off the .. we added to the root. - if (index > lastindex) - currentindex += files; - else - currentindex = currentindex < 4 ? 0 : currentindex - files; - } - lastindex = index; - - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR("index=", index, " currentindex=", currentindex); - #endif - - if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder - TFTSer.println("<<"); - TFTSer.println(".."); - files--; - } - - for (uint16_t seek = currentindex; seek < currentindex + files; seek++) { - if (filelist.seek(seek)) { - sendFile(); - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n"); - #endif - } - } - } - - void FileNavigator::sendFile() { - // send the file and folder info to the panel - // this info will be returned when the file is selected - // Permitted special characters in file name -_*#~ - // Panel can display 22 characters per line - if (filelist.isDir()) { - //TFTSer.print(currentfoldername); - TFTSer.println(filelist.shortFilename()); - TFTSer.print(filelist.shortFilename()); - TFTSer.println("/"); - } - else { - // Logical Name - TFTSer.print("/"); - if (folderdepth > 0) TFTSer.print(currentfoldername); - - TFTSer.println(filelist.shortFilename()); - - // Display Name - TFTSer.println(filelist.longFilename()); - } - } - void FileNavigator::changeDIR(char *folder) { - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR("currentfolder: ", currentfoldername, " New: ", folder); - #endif - if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth - strcat(currentfoldername, folder); - strcat(currentfoldername, "/"); - filelist.changeDir(folder); - refresh(); - folderdepth++; - currentindex = 0; - } - - void FileNavigator::upDIR() { - filelist.upDir(); - refresh(); - folderdepth--; - currentindex = 0; - // Remove the last child folder from the stored path - if (folderdepth == 0) { - currentfoldername[0] = '\0'; - reset(); - } - else { - char *pos = nullptr; - for (uint8_t f = 0; f < folderdepth; f++) - pos = strchr(currentfoldername, '/'); - - *(pos + 1) = '\0'; - } - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR("depth: ", folderdepth, " currentfoldername: ", currentfoldername); - #endif - } - - char* FileNavigator::getCurrentFolderName() { return currentfoldername; } -} - -#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h deleted file mode 100644 index 8e03614a46..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * lcd/extui/lib/FileNavigator.h - * - * Extensible_UI implementation for Anycubic Chiron - * Written By Nick Wells, 2020 [https://github.com/SwiftNick] - * (not affiliated with Anycubic, Ltd.) - */ - -#include "chiron_tft_defs.h" -#include "../../ui_api.h" - -using namespace ExtUI; - -namespace Anycubic { - class FileNavigator { - public: - FileNavigator(); - void reset(); - void getFiles(uint16_t); - void upDIR(); - void changeDIR(char *); - void sendFile(); - void refresh(); - char * getCurrentFolderName(); - private: - static FileList filelist; - static char currentfoldername[MAX_PATH_LEN]; - static uint16_t lastindex; - static uint8_t folderdepth; - static uint16_t currentindex; - }; - extern FileNavigator filenavigator; -} diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp deleted file mode 100644 index f09c4db3f2..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * lcd/extui/lib/Tunes.cpp - * - * Extensible_UI implementation for Anycubic Chiron - * Written By Nick Wells, 2020 [https://github.com/SwiftNick] - * (not affiliated with Anycubic, Ltd.) - */ - -/*********************************************************************** - * A Utility to play tunes using the buzzer in the printer controller. * - * See Tunes.h for note and tune definitions. * - ***********************************************************************/ - -#include "../../../../inc/MarlinConfigPre.h" - -#if ENABLED(ANYCUBIC_LCD_CHIRON) - -#include "Tunes.h" -#include "../../ui_api.h" - -namespace Anycubic { - - void PlayTune(uint8_t beeperPin, const uint16_t *tune, uint8_t speed=1) { - uint8_t pos = 1; - uint16_t wholenotelen = tune[0] / speed; - do { - uint16_t freq = tune[pos]; - uint16_t notelen = wholenotelen / tune[pos + 1]; - - ::tone(beeperPin, freq, notelen); - ExtUI::delay_ms(notelen); - pos += 2; - - if (pos >= MAX_TUNE_LENGTH) break; - } while (tune[pos] != n_END); - } - -} - -#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h deleted file mode 100644 index 1bafec43ad..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * lcd/extui/lib/Tunes.h - * - * Extensible_UI implementation for Anycubic Chiron - * Written By Nick Wells, 2020 [https://github.com/SwiftNick] - * (not affiliated with Anycubic, Ltd.) - */ - -/************************************************************************** - * Notes definition from https://pages.mtu.edu/~suits/NoteFreqCalcs.html * - * * - * The format of a tune is: * - * {,,, ,, ... } * - * * - * 1) The first value is the length of a whole note in milliseconds * - * 2) Then a sequence of pitch and duration pairs * - * 3) Finally the END marker so your tunes can be any length up to * - * MAX_TUNE_LEN * - *************************************************************************/ - -#include - -#define MAX_TUNE_LENGTH 128 - -// Special notes! -#define n_P 0 // silence or pause -#define n_END 10000 // end of tune marker - -// Note duration divisors -#define l_T1 1 -#define l_T2 2 -#define l_T3 3 -#define l_T4 4 -#define l_T8 8 -#define l_T16 16 - -// Note Frequency -#define n_C0 16 -#define n_CS0 17 -#define n_D0 18 -#define n_DS0 19 -#define n_E0 21 -#define n_F0 22 -#define n_FS0 23 -#define n_G0 25 -#define n_GS0 26 -#define n_A0 28 -#define n_AS0 29 -#define n_B0 31 -#define n_C1 33 -#define n_CS1 35 -#define n_D1 37 -#define n_DS1 39 -#define n_E1 41 -#define n_F1 44 -#define n_FS1 46 -#define n_G1 49 -#define n_GS1 52 -#define n_A1 55 -#define n_AS1 58 -#define n_B1 62 -#define n_C2 65 -#define n_CS2 69 -#define n_D2 73 -#define n_DS2 78 -#define n_E2 82 -#define n_F2 87 -#define n_FS2 93 -#define n_G2 98 -#define n_GS2 104 -#define n_A2 110 -#define n_AS2 117 -#define n_B2 123 -#define n_C3 131 -#define n_CS3 139 -#define n_D3 147 -#define n_DS3 156 -#define n_E3 165 -#define n_F3 175 -#define n_FS3 185 -#define n_G3 196 -#define n_GS3 208 -#define n_A3 220 -#define n_AS3 233 -#define n_B3 247 -#define n_C4 262 -#define n_CS4 277 -#define n_D4 294 -#define n_DS4 311 -#define n_E4 330 -#define n_F4 349 -#define n_FS4 370 -#define n_G4 392 -#define n_GS4 415 -#define n_A4 440 -#define n_AS4 466 -#define n_B4 494 -#define n_C5 523 -#define n_CS5 554 -#define n_D5 587 -#define n_DS5 622 -#define n_E5 659 -#define n_F5 698 -#define n_FS5 740 -#define n_G5 784 -#define n_GS5 831 -#define n_A5 880 -#define n_AS5 932 -#define n_B5 988 -#define n_C6 1047 -#define n_CS6 1109 -#define n_D6 1175 -#define n_DS6 1245 -#define n_E6 1319 -#define n_F6 1397 -#define n_FS6 1480 -#define n_G6 1568 -#define n_GS6 1661 -#define n_A6 1760 -#define n_AS6 1865 -#define n_B6 1976 -#define n_C7 2093 -#define n_CS7 2217 -#define n_D7 2349 -#define n_DS7 2489 -#define n_E7 2637 -#define n_F7 2794 -#define n_FS7 2960 -#define n_G7 3136 -#define n_GS7 3322 -#define n_A7 3520 -#define n_AS7 3729 -#define n_B7 3951 -#define n_C8 4186 -#define n_CS8 4435 -#define n_D8 4699 -#define n_DS8 4978 -#define n_E8 5274 -#define n_F8 5587 -#define n_FS8 5920 -#define n_G8 6272 -#define n_GS8 6645 -#define n_A8 7040 -#define n_AS8 7459 -#define n_B8 7902 - -namespace Anycubic { - - void PlayTune(uint8_t beeperPin, const uint16_t *tune, uint8_t speed); - - // Only uncomment the tunes you are using to save memory - // This will help you write tunes! - // https://www.apronus.com/music/flashpiano.htm - - const uint16_t SOS[] = { - 250, - n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T1, - n_G6,l_T1, n_P,l_T3, n_G6,l_T1, n_P,l_T3, n_G6,l_T1, n_P,l_T1, - n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T1, - n_END - }; - - const uint16_t BeepBeep[] = { - 500, - n_C7,l_T8, n_P,l_T16, n_C7,l_T8, n_P,l_T8, - n_END - }; - - const uint16_t BeepBeepBeeep[] = { - 1000, - n_G7,l_T4, n_P,l_T16, n_G7,l_T4, n_P,l_T8, n_G7,l_T2, - n_END - }; - - const uint16_t Anycubic_PowerOn[] = { - 1000, - n_F7,l_T8, n_P,l_T8, n_C7,l_T8, n_P,l_T8, n_D7,l_T8, n_P,l_T8, - n_E7,l_T8, n_P,l_T8, n_D7,l_T4, n_P,l_T4, n_G7,l_T4, n_P,l_T4, - n_A7,l_T2, n_P,l_T1, - n_END - }; - - const uint16_t GB_PowerOn[] = { - 500, - n_C6,l_T4, n_P,l_T16, n_C7,l_T2, n_P,l_T8, - n_END - }; - - const uint16_t Heater_Timedout[] = { - 1000, - n_C6,l_T1, - n_END - }; - - const uint16_t FilamentOut[] = { - 1000, - n_AS7,l_T4, n_P,l_T16, n_FS7,l_T2, - n_END - }; - -} diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp deleted file mode 100644 index 5e492573e7..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ /dev/null @@ -1,896 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * lcd/extui/lib/chiron_tft.cpp - * - * Extensible_UI implementation for Anycubic Chiron - * Written By Nick Wells, 2020 [https://github.com/SwiftNick] - * (not affiliated with Anycubic, Ltd.) - */ - -#include "../../../../inc/MarlinConfigPre.h" - -#if ENABLED(ANYCUBIC_LCD_CHIRON) - -#include "chiron_tft.h" -#include "Tunes.h" -#include "FileNavigator.h" - -#include "../../../../gcode/queue.h" -#include "../../../../sd/cardreader.h" -#include "../../../../libs/numtostr.h" -#include "../../../../MarlinCore.h" -namespace Anycubic { - - printer_state_t ChironTFT::printer_state; - paused_state_t ChironTFT::pause_state; - heater_state_t ChironTFT::hotend_state; - heater_state_t ChironTFT::hotbed_state; - xy_uint8_t ChironTFT::selectedmeshpoint; - char ChironTFT::selectedfile[MAX_PATH_LEN]; - char ChironTFT::panel_command[MAX_CMND_LEN]; - uint8_t ChironTFT::command_len; - float ChironTFT::live_Zoffset; - file_menu_t ChironTFT::file_menu; - - ChironTFT::ChironTFT(){} - - void ChironTFT::Startup() { - selectedfile[0] = '\0'; - panel_command[0] = '\0'; - command_len = 0; - printer_state = AC_printer_idle; - pause_state = AC_paused_idle; - hotend_state = AC_heater_off; - hotbed_state = AC_heater_off; - live_Zoffset = 0.0; - file_menu = AC_menu_file; - - // Setup pins for powerloss detection - // Two IO pins are connected on the Trigorilla Board - // On a power interruption the OUTAGECON_PIN goes low. - - #if ENABLED(POWER_LOSS_RECOVERY) - OUT_WRITE(OUTAGECON_PIN, HIGH); - #endif - - // Filament runout is handled by Marlin settings in Configuration.h - // set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present. - // enable FIL_RUNOUT_PULLUP - - TFTSer.begin(115200); - - // Signal Board has reset - SendtoTFTLN(AC_msg_main_board_has_reset); - - safe_delay(200); - - // Enable levelling and Disable end stops during print - // as Z home places nozzle above the bed so we need to allow it past the end stops - injectCommands_P(AC_cmnd_enable_levelling); //M211 S0\n")); - - // Startup tunes are defined in Tunes.h - //PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1); - PlayTune(BEEPER_PIN, GB_PowerOn, 1); - #if ACDEBUGLEVEL - SERIAL_ECHOLNPAIR("AC Debug Level ", ACDEBUGLEVEL); - #endif - SendtoTFTLN(AC_msg_ready); - } - - void ChironTFT::IdleLoop() { - if (ReadTFTCommand()) { - ProcessPanelRequest(); - command_len = 0; - } - CheckHeaters(); - } - - void ChironTFT::PrinterKilled(PGM_P error,PGM_P component) { - SendtoTFTLN(AC_msg_kill_lcd); - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("PrinterKilled()\nerror: ", error , "\ncomponent: ", component); - #endif - } - - void ChironTFT::MediaEvent(media_event_t event) { - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("ProcessMediaStatus() ", event); - #endif - switch (event) { - case AC_media_inserted: - SendtoTFTLN(AC_msg_sd_card_inserted); - break; - - case AC_media_removed: - SendtoTFTLN(AC_msg_sd_card_removed); - break; - - case AC_media_error: - SendtoTFTLN(AC_msg_no_sd_card); - break; - } - } - - void ChironTFT::TimerEvent(timer_event_t event) { - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("TimerEvent() ", event); - SERIAL_ECHOLNPAIR("Printer State: ", printer_state); - #endif - - switch (event) { - case AC_timer_started: { - live_Zoffset = 0.0; // reset print offset - setSoftEndstopState(false); // disable endstops to print - printer_state = AC_printer_printing; - SendtoTFTLN(AC_msg_print_from_sd_card); - } break; - - case AC_timer_paused: { - printer_state = AC_printer_paused; - pause_state = AC_paused_idle; - SendtoTFTLN(AC_msg_paused); - } break; - - case AC_timer_stopped: { - if (printer_state != AC_printer_idle) { - printer_state = AC_printer_stopping; - SendtoTFTLN(AC_msg_print_complete); - } - setSoftEndstopState(true); // enable endstops - } break; - } - } - - void ChironTFT::FilamentRunout() { - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("FilamentRunout() printer_state ", printer_state); - #endif - // 1 Signal filament out - SendtoTFTLN(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); - //printer_state = AC_printer_filament_out; - PlayTune(BEEPER_PIN, FilamentOut, 1); - } - - void ChironTFT::ConfirmationRequest(const char * const msg) { - // M108 continue - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("ConfirmationRequest() ", msg, " printer_state:", printer_state); - #endif - switch (printer_state) { - case AC_printer_pausing: { - if ( (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) || (strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0 ) ) { - SendtoTFTLN(AC_msg_paused); // enable continue button - printer_state = AC_printer_paused; - } - } break; - - case AC_printer_resuming_from_power_outage: - case AC_printer_printing: - case AC_printer_paused: { - // Heater timout, send acknowledgement - if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0 ) { - pause_state = AC_paused_heater_timed_out; - SendtoTFTLN(AC_msg_paused); // enable continue button - PlayTune(BEEPER_PIN,Heater_Timedout,1); - } - // Reheat finished, send acknowledgement - else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0 ) { - pause_state = AC_paused_idle; - SendtoTFTLN(AC_msg_paused); // enable continue button - } - // Filament Purging, send acknowledgement enter run mode - else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0 ) { - pause_state = AC_paused_purging_filament; - SendtoTFTLN(AC_msg_paused); // enable continue button - } - } break; - default: - break; - } - } - - void ChironTFT::StatusChange(const char * const msg) { - #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPAIR("StatusChange() ", msg); - SERIAL_ECHOLNPAIR("printer_state:", printer_state); - #endif - bool msg_matched = false; - // The only way to get printer status is to parse messages - // Use the state to minimise the work we do here. - switch (printer_state) { - case AC_printer_probing: { - // If probing completes ok save the mesh and park - if (strcmp_P(msg, MARLIN_msg_ready) == 0 ) { - injectCommands_P(PSTR("M500\nG27")); - SendtoTFTLN(AC_msg_probing_complete); - printer_state = AC_printer_idle; - msg_matched = true; - } - // If probing fails dont save the mesh raise the probe above the bad point - if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0 ) { - PlayTune(BEEPER_PIN, BeepBeepBeeep, 1); - injectCommands_P(PSTR("G1 Z50 F500")); - SendtoTFTLN(AC_msg_probing_complete); - printer_state = AC_printer_idle; - msg_matched = true; - } - } break; - - case AC_printer_printing: { - if (strcmp_P(msg, MARLIN_msg_reheating) == 0 ) { - SendtoTFTLN(AC_msg_paused); // enable continue button - msg_matched = true; - } - } break; - - case AC_printer_pausing: { - if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) { - SendtoTFTLN(AC_msg_paused); - printer_state = AC_printer_paused; - pause_state = AC_paused_idle; - msg_matched = true; - } - } break; - - case AC_printer_stopping: { - if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0 ) { - SendtoTFTLN(AC_msg_stop); - printer_state = AC_printer_idle; - msg_matched = true; - } - } break; - default: - break; - } - - // If not matched earlier see if this was a heater message - if (!msg_matched) { - if (strcmp_P(msg, MARLIN_msg_extruder_heating) == 0) { - SendtoTFTLN(AC_msg_nozzle_heating); - hotend_state = AC_heater_temp_set; - } - else if (strcmp_P(msg, MARLIN_msg_bed_heating) == 0) { - SendtoTFTLN(AC_msg_bed_heating); - hotbed_state = AC_heater_temp_set; - } - } - } - - void ChironTFT::PowerLossRecovery() { - printer_state = AC_printer_resuming_from_power_outage; // Play tune to notify user we can recover. - PlayTune(BEEPER_PIN, SOS, 1); - SERIAL_ECHOLNPGM("Resuming from power outage..."); - SERIAL_ECHOLNPGM("Select SD file then press resume"); - } - - void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEN string to the panel - #if ACDEBUG(AC_SOME) - serialprintPGM(str); - #endif - while (const char c = pgm_read_byte(str++)) TFTSer.print(c); - } - - void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { - if (str != nullptr) { - #if ACDEBUG(AC_SOME) - SERIAL_ECHO("> "); - #endif - SendtoTFT(str); - #if ACDEBUG(AC_SOME) - SERIAL_EOL(); - #endif - } - TFTSer.println(""); - } - - bool ChironTFT::ReadTFTCommand() { - bool command_ready = false; - while( (TFTSer.available() > 0) && (command_len < MAX_CMND_LEN) ) { - panel_command[command_len] = TFTSer.read(); - if(panel_command[command_len] == '\n') { - command_ready = true; - break; - } - command_len++; - } - - if(command_ready) { - panel_command[command_len] = 0x00; - #if ACDEBUG(AC_ALL) - SERIAL_ECHOLNPAIR("< ", panel_command); - #endif - #if ACDEBUG(AC_SOME) - // Ignore status request commands - uint8_t req = atoi(&panel_command[1]); - if (req > 7 && req != 20) { - SERIAL_ECHOLNPAIR("> ", panel_command); - SERIAL_ECHOLNPAIR("printer_state:", printer_state); - } - #endif - } - return command_ready; - } - - int8_t ChironTFT::Findcmndpos(const char * buff, char q) { - bool found = false; - int8_t pos = 0; - do { - if (buff[pos] == q) { - found = true; - break; - } - pos ++; - } while(pos < MAX_CMND_LEN); - if (found) return pos; - return -1; - } - - void ChironTFT::CheckHeaters() { - uint8_t faultDuration = 0; float temp = 0; - - // if the hotend temp is abnormal, confirm state before signalling panel - temp = getActualTemp_celsius(E0); - if ( (temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) ) { - do { - faultDuration ++; - if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_nozzle_temp_abnormal); - SERIAL_ECHOLNPAIR("Extruder temp abnormal! : ", temp); - break; - } - delay_ms(500); - temp = getActualTemp_celsius(E0); - } while ((temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) ); - } - - // if the hotbed temp is abnormal, confirm state before signalling panel - faultDuration = 0; - temp = getActualTemp_celsius(BED); - if ( (temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) ) { - do { - faultDuration ++; - if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_nozzle_temp_abnormal); - SERIAL_ECHOLNPAIR_P("Bed temp abnormal! : ", temp); - break; - } - delay_ms(500); - temp = getActualTemp_celsius(E0); - } while ((temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) ); - } - - // Update panel with hotend heater status - if (hotend_state != AC_heater_temp_reached) { - if ( WITHIN( getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1 ) ) { - SendtoTFTLN(AC_msg_nozzle_heating_done); - hotend_state = AC_heater_temp_reached; - } - } - - // Update panel with bed heater status - if (hotbed_state != AC_heater_temp_reached) { - if ( WITHIN( getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5 ) ) { - SendtoTFTLN(AC_msg_bed_heating_done); - hotbed_state = AC_heater_temp_reached; - } - } - } - - void ChironTFT::SendFileList(int8_t startindex) { - // respond to panel request for 4 files starting at index - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("## SendFileList ## ", startindex); - #endif - SendtoTFTLN(PSTR("FN ")); - filenavigator.getFiles(startindex); - SendtoTFTLN(PSTR("END")); - } - - void ChironTFT::SelectFile() { - strncpy(selectedfile,panel_command+4,command_len-4); - selectedfile[command_len-5] = '\0'; - #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPAIR_F(" Selected File: ",selectedfile); - #endif - switch (selectedfile[0]) { - case '/': // Valid file selected - SendtoTFTLN(AC_msg_sd_file_open_success); - break; - - case '<': // .. (go up folder level) - filenavigator.upDIR(); - SendtoTFTLN(AC_msg_sd_file_open_failed); - SendFileList( 0 ); - break; - default: // enter sub folder - filenavigator.changeDIR(selectedfile); - SendtoTFTLN(AC_msg_sd_file_open_failed); - SendFileList( 0 ); - break; - } - } - - void ChironTFT::InjectCommandandWait(PGM_P cmd) { - //injectCommands_P(cmnd); queue.enqueue_now_P(cmd); - //SERIAL_ECHOLN(PSTR("Inject>")); - } - - void ChironTFT::ProcessPanelRequest() { - // Break these up into logical blocks // as its easier to navigate than one huge switch case! - int8_t req = atoi(&panel_command[1]); - - // Information requests A0 - A8 and A33 - if (req <= 8 || req == 33) PanelInfo(req); - - // Simple Actions A9 - A28 - else if ( req <= 28) PanelAction(req); - - // Process Initiation - else if (req <= 34) PanelProcess(req); - - else SendtoTFTLN(); - } - - void ChironTFT::PanelInfo(uint8_t req) { - // information requests A0-A8 and A33 - switch (req) { - case 0: // A0 Get HOTEND Temp - SendtoTFT(PSTR("A0V ")); - TFTSer.println(getActualTemp_celsius(E0)); - break; - - case 1: // A1 Get HOTEND Target Temp - SendtoTFT(PSTR("A1V ")); - TFTSer.println(getTargetTemp_celsius(E0)); - break; - - case 2: // A2 Get BED Temp - SendtoTFT(PSTR("A2V ")); - TFTSer.println(getActualTemp_celsius(BED)); - break; - - case 3: // A3 Get BED Target Temp - SendtoTFT(PSTR("A3V ")); - TFTSer.println(getTargetTemp_celsius(BED)); - break; - - case 4: // A4 Get FAN Speed - SendtoTFT(PSTR("A4V ")); - TFTSer.println(getActualFan_percent(FAN0)); - break; - - case 5: // A5 Get Current Coordinates - SendtoTFT(PSTR("A5V X: ")); - TFTSer.print(getAxisPosition_mm(X)); - SendtoTFT(PSTR(" Y: ")); - TFTSer.print(getAxisPosition_mm(Y)); - SendtoTFT(PSTR(" Z: ")); - TFTSer.println(getAxisPosition_mm(Z)); - break; - - case 6: // A6 Get printing progress - if (isPrintingFromMedia()) { - SendtoTFT(PSTR("A6V ")); - TFTSer.println(ui8tostr2(getProgress_percent())); - - } - else - SendtoTFTLN(PSTR("A6V ---")); - break; - - case 7: { // A7 Get Printing Time - uint32_t time = getProgress_seconds_elapsed() / 60; - SendtoTFT(PSTR("A7V ")); - TFTSer.print(ui8tostr2(time / 60)); - SendtoTFT(PSTR(" H ")); - TFTSer.print(ui8tostr2(time % 60)); - SendtoTFT(PSTR(" M")); - #if ACDEBUG(AC_ALL) - SERIAL_ECHOLNPAIR("Print time ", ui8tostr2(time / 60), ":", ui8tostr2(time % 60)); - #endif - } break; - - case 8: // A8 Get SD Card list A8 S0 - if (!isMediaInserted()) safe_delay(500); - if (!isMediaInserted()) // Make sure the card is removed - SendtoTFTLN(AC_msg_no_sd_card); - else if (panel_command[3] == 'S') - SendFileList( atoi( &panel_command[4] ) ); - break; - - case 33: // A33 Get firmware info - SendtoTFT(PSTR("J33 ")); - SendtoTFTLN(PSTR(SHORT_BUILD_VERSION)); - break; - } - } - - void ChironTFT::PanelAction(uint8_t req) { - switch (req) { - case 9: // A9 Pause SD print - if (isPrintingFromMedia()) { - SendtoTFTLN(AC_msg_pause); - pausePrint(); - printer_state = AC_printer_pausing; - } - else - SendtoTFTLN(AC_msg_stop); - break; - - case 10: // A10 Resume SD Print - if (pause_state == AC_paused_idle || printer_state == AC_printer_resuming_from_power_outage) - resumePrint(); - else - setUserConfirmed(); - break; - - case 11: // A11 Stop SD print - if (isPrintingFromMedia()) { - printer_state = AC_printer_stopping; - stopPrint(); - } - else { - if (printer_state == AC_printer_resuming_from_power_outage) - injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery - SendtoTFTLN(AC_msg_stop); - printer_state = AC_printer_idle; - } - break; - - case 12: // A12 Kill printer - kill(); // from marlincore.h - break; - - case 13: // A13 Select file - SelectFile(); - break; - - case 14: { // A14 Start Printing - // Allows printer to restart the job if we dont want to recover - if (printer_state == AC_printer_resuming_from_power_outage) { - injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery - printer_state = AC_printer_idle; - } - #if ACDebugLevel >= 1 - SERIAL_ECHOLNPAIR_F("Print: ", selectedfile); - #endif - // the card library needs a path starting // but the File api doesn't... - char file[MAX_PATH_LEN]; - file[0] = '/'; - strcpy(file + 1, selectedfile); - printFile(file); - SendtoTFTLN(AC_msg_print_from_sd_card); - } break; - - case 15: // A15 Resuming from outage - if (printer_state == AC_printer_resuming_from_power_outage) - // Need to home here to restore the Z position - injectCommands_P(AC_cmnd_power_loss_recovery); - - injectCommands_P(PSTR("M1000\n")); // home and start recovery - break; - - case 16: { // A16 Set HotEnd temp A17 S170 - const float set_Htemp = atof(&panel_command[5]); - hotend_state = set_Htemp ? AC_heater_temp_set : AC_heater_off; - switch ((char)panel_command[4]) { - // Set Temp - case 'S': case 'C': setTargetTemp_celsius(set_Htemp, E0); - } - } break; - - case 17: { // A17 Set bed temp - const float set_Btemp = atof(&panel_command[5]); - hotbed_state = set_Btemp ? AC_heater_temp_set : AC_heater_off; - if (panel_command[4] == 'S') - setTargetTemp_celsius(set_Btemp, BED); - } break; - - case 18: // A18 Set Fan Speed - if (panel_command[4] == 'S') - setTargetFan_percent(atof(&panel_command[5]), FAN0); - break; - - case 19: // A19 Motors off - if (!isPrinting()) { - disable_all_steppers(); // from marlincore.h - SendtoTFTLN(AC_msg_ready); - } - break; - - case 20: // A20 Read/write print speed - if (panel_command[4] == 'S') - setFeedrate_percent(atoi(&panel_command[5])); - else { - SendtoTFT(PSTR("A20V ")); - TFTSer.println(getFeedrate_percent()); - } - break; - - case 21: // A21 Home Axis A21 X - if (!isPrinting()) { - switch ((char)panel_command[4]) { - case 'X': injectCommands_P(PSTR("G28 X\n")); break; - case 'Y': injectCommands_P(PSTR("G28 Y\n")); break; - case 'Z': injectCommands_P(PSTR("G28 Z\n")); break; - case 'C': injectCommands_P(PSTR("G28\n")); break; - } - } - break; - - case 22: // A22 Move Axis A22 Y +10F3000 - // Ignore request if printing - if (!isPrinting()) { - // setAxisPosition_mm() uses pre defined manual feedrates so ignore the feedrate from the panel - setSoftEndstopState(true); // enable endstops - float newposition = atof(&panel_command[6]); - - #if ACDEBUG(AC_ACTION) - SERIAL_ECHOLNPAIR("Nudge ", panel_command[4], " axis ", newposition); - #endif - - switch (panel_command[4]) { - case 'X': setAxisPosition_mm(getAxisPosition_mm(X) + newposition, X); break; - case 'Y': setAxisPosition_mm(getAxisPosition_mm(Y) + newposition, Y); break; - case 'Z': setAxisPosition_mm(getAxisPosition_mm(Z) + newposition, Z); break; - case 'E': // The only time we get this command is from the filament load/unload menu - // the standard movement is too slow so we will use the load unlod GCode to speed it up a bit - if (canMove(E0) && !commandsInQueue()) - injectCommands_P(newposition > 0 ? AC_cmnd_manual_load_filament : AC_cmnd_manual_unload_filament); - break; - } - } - break; - - case 23: // A23 Preheat PLA - // Ignore request if printing - if (!isPrinting()) { - // Temps defined in configuration.h - setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); - setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0); - SendtoTFTLN(); - hotbed_state = AC_heater_temp_set; - hotend_state = AC_heater_temp_set; - } - break; - - case 24: // A24 Preheat ABS - // Ignore request if printing - if (!isPrinting()) { - setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); - setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0); - SendtoTFTLN(); - hotbed_state = AC_heater_temp_set; - hotend_state = AC_heater_temp_set; - } - break; - - case 25: // A25 Cool Down - // Ignore request if printing - if (!isPrinting()) { - setTargetTemp_celsius(0, E0); - setTargetTemp_celsius(0, BED); - SendtoTFTLN(AC_msg_ready); - hotbed_state = AC_heater_off; - hotend_state = AC_heater_off; - } - break; - - case 26: // A26 Refresh SD - // M22 M21 maybe needed here to reset sd card - filenavigator.reset(); - break; - - case 27: // A27 Servo Angles adjust - break; - - case 28: // A28 Filament set A28 O/C - // Ignore request if printing - if (isPrinting()) break; - SendtoTFTLN(); - break; - } - } - - void ChironTFT::PanelProcess(uint8_t req) { - switch (req) { - case 29: { // A29 Read Mesh Point A29 X1 Y1 - xy_uint8_t pos; - float pos_z; - pos.x = atoi(&panel_command[5]); - pos.y = atoi(&panel_command[8]); - pos_z = getMeshPoint(pos); - - SendtoTFT(PSTR("A29V ")); - TFTSer.println(pos_z * 100); - if (!isPrinting()) { - setSoftEndstopState(true); // disable endstops - // If the same meshpoint is selected twice in a row, move the head to that ready for adjustment - if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { - if (!isPositionKnown()) - injectCommands_P(PSTR("G28\n")); // home - - if (isPositionKnown()) { - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Moving to mesh point at x: ", pos.x, " y: ", pos.y, " z: ", pos_z); - #endif - // Go up before moving - setAxisPosition_mm(3.0,Z); - - setAxisPosition_mm(17 + (93 * pos.x), X); - setAxisPosition_mm(20 + (93 * pos.y), Y); - setAxisPosition_mm(0.0, Z); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Current Z: ", getAxisPosition_mm(Z)); - #endif - } - } - selectedmeshpoint.x = pos.x; - selectedmeshpoint.y = pos.y; - } - } break; - - case 30: { // A30 Auto leveling - if (panel_command[3] == 'S') { // Start probing - // Ignore request if printing - if (isPrinting()) - SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling - else { - injectCommands_P(isMachineHomed() ? PSTR("G29") : PSTR("G28\nG29")); - printer_state = AC_printer_probing; - SendtoTFTLN(AC_msg_start_probing); - } - } - else SendtoTFTLN(AC_msg_start_probing); - } break; - - case 31: { // A31 Adjust all Probe Points - switch (panel_command[3]) { - case 'C': // Restore and apply original offsets - if (!isPrinting()) { - injectCommands_P(PSTR("M501\nM420 S1\n")); - selectedmeshpoint.x = 99; - selectedmeshpoint.y = 99; - } - break; - case 'D': // Save Z Offset tables and restore levelling state - if (!isPrinting()) { - setAxisPosition_mm(1.0,Z); - injectCommands_P(PSTR("M500\n")); - selectedmeshpoint.x = 99; - selectedmeshpoint.y = 99; - } - break; - case 'G': // Get current offset - SendtoTFT(PSTR("A31V ")); - // When printing use the live z Offset position - // we will use babystepping to move the print head - if (isPrinting()) - TFTSer.println(live_Zoffset); - else { - TFTSer.println(getZOffset_mm()); - selectedmeshpoint.x = 99; - selectedmeshpoint.y = 99; - } - break; - case 'S': { // Set offset (adjusts all points by value) - float Zshift = atof(&panel_command[4]); - setSoftEndstopState(false); // disable endstops - // Allow temporary Z position nudging during print - // From the levelling panel use the all points UI to adjust the print pos. - if (isPrinting()) { - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift); - #endif - if (isAxisPositionKnown(Z)) { - #if ACDEBUG(AC_INFO) - const float currZpos = getAxisPosition_mm(Z); - SERIAL_ECHOLNPAIR("Nudge Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); - #endif - // Use babystepping to adjust the head position - int16_t steps = mmToWholeSteps(constrain(Zshift,-0.05,0.05), Z); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Steps to move Z: ", steps); - #endif - babystepAxis_steps(steps, Z); - live_Zoffset += Zshift; - } - SendtoTFT(PSTR("A31V ")); - TFTSer.println(live_Zoffset); - } - else { - GRID_LOOP(x, y) { - const xy_uint8_t pos { x, y }; - const float currval = getMeshPoint(pos); - setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2)); - } - const float currZOffset = getZOffset_mm(); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Change probe offset from ", currZOffset, " to ", currZOffset + Zshift); - #endif - - setZOffset_mm(currZOffset + Zshift); - SendtoTFT(PSTR("A31V ")); - TFTSer.println(getZOffset_mm()); - - if (isAxisPositionKnown(Z)) { - // Move Z axis - const float currZpos = getAxisPosition_mm(Z); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); - #endif - setAxisPosition_mm(currZpos+constrain(Zshift,-0.05,0.05),Z); - } - } - } break; - } // end switch - } break; - - case 32: { // A32 clean leveling beep flag - // Ignore request if printing - //if (isPrinting()) break; - //injectCommands_P(PSTR("M500\nM420 S1\nG1 Z10 F240\nG1 X0 Y0 F6000")); - //TFTSer.println(""); - } break; - - // A33 firmware info request seet PanelInfo() - - case 34: { // A34 Adjust single mesh point A34 C/S X1 Y1 V123 - if (panel_command[3] == 'C') { // Restore original offsets - injectCommands_P(PSTR("M501\nM420 S1")); - selectedmeshpoint.x = 99; - selectedmeshpoint.y = 99; - //printer_state = AC_printer_idle; - } - else { - xy_uint8_t pos; - pos.x = atoi(&panel_command[5]); - pos.y = atoi(&panel_command[8]); - - float currmesh = getMeshPoint(pos); - float newval = atof(&panel_command[11])/100; - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Change mesh point x:", pos.x, " y:", pos.y); - SERIAL_ECHOLNPAIR("from ", currmesh, " to ", newval); - #endif - // Update Meshpoint - setMeshPoint(pos,newval); - if ( (printer_state == AC_printer_idle) || (printer_state == AC_printer_probing) ) {//!isPrinting()) { - // if we are at the current mesh point indicated on the panel Move Z pos +/- 0.05mm ( The panel changes the mesh value by +/- 0.05mm on each button press) - if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { - setSoftEndstopState(false); - float currZpos = getAxisPosition_mm(Z); - #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(newval - currmesh, -0.05, 0.05)); - #endif - setAxisPosition_mm(currZpos + constrain(newval - currmesh, -0.05, 0.05), Z); - } - } - } - } break; - } - } -} // namespace - -#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h deleted file mode 100644 index 267f2fe978..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * lcd/extui/lib/chiron_tft.h - * - * Extensible_UI implementation for Anycubic Chiron - * Written By Nick Wells, 2020 [https://github.com/SwiftNick] - * (not affiliated with Anycubic, Ltd.) - */ - -#include "chiron_tft_defs.h" -#include "../../../../inc/MarlinConfigPre.h" -#include "../../ui_api.h" -namespace Anycubic { - - class ChironTFT { - static printer_state_t printer_state; - static paused_state_t pause_state; - static heater_state_t hotend_state; - static heater_state_t hotbed_state; - static xy_uint8_t selectedmeshpoint; - static char panel_command[MAX_CMND_LEN]; - static uint8_t command_len; - static char selectedfile[MAX_PATH_LEN]; - static float live_Zoffset; - static file_menu_t file_menu; - public: - ChironTFT(); - void Startup(); - void IdleLoop(); - void PrinterKilled(PGM_P,PGM_P); - void MediaEvent(media_event_t); - void TimerEvent(timer_event_t); - void FilamentRunout(); - void ConfirmationRequest(const char * const ); - void StatusChange(const char * const ); - void PowerLossRecovery(); - - private: - void SendtoTFT(PGM_P); - void SendtoTFTLN(PGM_P); - bool ReadTFTCommand(); - int8_t Findcmndpos(const char *, char); - void CheckHeaters(); - void SendFileList(int8_t); - void SelectFile(); - void InjectCommandandWait(PGM_P); - void ProcessPanelRequest(); - void PanelInfo(uint8_t); - void PanelAction(uint8_t); - void PanelProcess(uint8_t); - }; - - extern ChironTFT Chiron; - -} diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h deleted file mode 100644 index 937bdfde33..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * lcd/extui/lib/chiron_defs.h - * - * Extensible_UI implementation for Anycubic Chiron - * Written By Nick Wells, 2020 [https://github.com/SwiftNick] - * (not affiliated with Anycubic, Ltd.) - */ - -#pragma once -#include "../../../../inc/MarlinConfigPre.h" -//#define ACDEBUGLEVEL 255 - -#if ACDEBUGLEVEL - // Bit-masks for selective debug: - enum ACDebugMask : uint8_t { - AC_INFO = 1, - AC_ACTION = 2, - AC_FILE = 4, - AC_PANEL = 8, - AC_MARLIN = 16, - AC_SOME = 32, - AC_ALL = 64 - }; - #define ACDEBUG(mask) ( ((mask) & ACDEBUGLEVEL) == mask ) // Debug flag macro -#else - #define ACDEBUG(mask) false -#endif - -#define TFTSer LCD_SERIAL // Serial interface for TFT panel now uses marlinserial -#define MAX_FOLDER_DEPTH 4 // Limit folder depth TFT has a limit for the file path -#define MAX_CMND_LEN 16 * MAX_FOLDER_DEPTH // Maximum Length for a Panel command -#define MAX_PATH_LEN 16 * MAX_FOLDER_DEPTH // Maximum number of characters in a SD file path - -#define AC_HEATER_FAULT_VALIDATION_TIME 5 // number of 1/2 second loops before signalling a heater fault -#define AC_LOWEST_MESHPOINT_VAL -7.00 // The lowest value you can set for a single mesh point offset - - // TFT panel commands -#define AC_msg_sd_card_inserted PSTR("J00") -#define AC_msg_sd_card_removed PSTR("J01") -#define AC_msg_no_sd_card PSTR("J02") -#define AC_msg_usb_connected PSTR("J03") -#define AC_msg_print_from_sd_card PSTR("J04") -#define AC_msg_pause PSTR("J05") -#define AC_msg_nozzle_heating PSTR("J06") -#define AC_msg_nozzle_heating_done PSTR("J07") -#define AC_msg_bed_heating PSTR("J08") -#define AC_msg_bed_heating_done PSTR("J09") -#define AC_msg_nozzle_temp_abnormal PSTR("J10") -#define AC_msg_kill_lcd PSTR("J11") -#define AC_msg_ready PSTR("J12") -#define AC_msg_low_nozzle_temp PSTR("J13") -#define AC_msg_print_complete PSTR("J14") -#define AC_msg_filament_out_alert PSTR("J15") -#define AC_msg_stop PSTR("J16") -#define AC_msg_main_board_has_reset PSTR("J17") -#define AC_msg_paused PSTR("J18") -#define AC_msg_j19_unknown PSTR("J19") -#define AC_msg_sd_file_open_success PSTR("J20") -#define AC_msg_sd_file_open_failed PSTR("J21") -#define AC_msg_level_monitor_finished PSTR("J22") -#define AC_msg_filament_out_block PSTR("J23") -#define AC_msg_probing_not_allowed PSTR("J24") -#define AC_msg_probing_complete PSTR("J25") -#define AC_msg_start_probing PSTR("J26") -#define AC_msg_version PSTR("J27") - -#define MARLIN_msg_start_probing PSTR("Probing Point 1/25") -#define MARLIN_msg_probing_failed PSTR("Probing Failed") -#define MARLIN_msg_ready PSTR("3D Printer Ready.") -#define MARLIN_msg_print_paused PSTR("Print Paused") -#define MARLIN_msg_print_aborted PSTR("Print Aborted") -#define MARLIN_msg_extruder_heating PSTR("E Heating...") -#define MARLIN_msg_bed_heating PSTR("Bed Heating...") - -#define MARLIN_msg_nozzle_parked PSTR("Nozzle Parked") -#define MARLIN_msg_heater_timeout PSTR("Heater Timeout") -#define MARLIN_msg_reheating PSTR("Reheating...") -#define MARLIN_msg_reheat_done PSTR("Reheat finished.") -#define MARLIN_msg_filament_purging PSTR("Filament Purging...") -#define MARLIN_msg_special_pause PSTR("PB") -#define AC_cmnd_auto_unload_filament PSTR("M701") // Use Marlin unload routine -#define AC_cmnd_auto_load_filament PSTR("M702 M0 PB") // Use Marlin load routing then pause for user to clean nozzle - -#define AC_cmnd_manual_load_filament PSTR("M83\nG1 E50 F700\nM82") // replace the manual panel commands with something a little faster -#define AC_cmnd_manual_unload_filament PSTR("M83\nG1 E-50 F1200\nM82") -#define AC_cmnd_enable_levelling PSTR("M420 S1 V1") -#define AC_cmnd_power_loss_recovery PSTR("G28 X Y R5\nG28 Z") // Lift, home X and Y then home Z when in 'safe' position - -namespace Anycubic { - enum heater_state_t : uint8_t { - AC_heater_off, - AC_heater_temp_set, - AC_heater_temp_reached - }; - - enum paused_state_t : uint8_t { - AC_paused_heater_timed_out, - AC_paused_purging_filament, - AC_paused_idle - }; - - enum printer_state_t : uint8_t { - AC_printer_idle, - AC_printer_probing, - AC_printer_printing, - AC_printer_pausing, - AC_printer_paused, - AC_printer_stopping, - AC_printer_resuming_from_power_outage - }; - - enum timer_event_t : uint8_t { - AC_timer_started, - AC_timer_paused, - AC_timer_stopped - }; - - enum media_event_t : uint8_t { - AC_media_inserted, - AC_media_removed, - AC_media_error - }; - enum file_menu_t : uint8_t { - AC_menu_file, - AC_menu_command, - AC_menu_change_to_file, - AC_menu_change_to_command - }; -} diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp deleted file mode 100644 index efbc57e68a..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ /dev/null @@ -1,1032 +0,0 @@ -/** - * anycubic_i3mega_lcd.cpp --- Support for Anycubic i3 Mega TFT - * Created by Christian Hopp on 09.12.17. - * Improved by David Ramiro - * Converted to ext_iu by John BouAntoun 21 June 2020 - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "../../../../inc/MarlinConfigPre.h" - -#if ENABLED(ANYCUBIC_LCD_I3MEGA) - -#include "anycubic_i3mega_lcd.h" -#include "../../ui_api.h" - -#include "../../../../libs/numtostr.h" -#include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage -#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers -#include "../../../../inc/MarlinConfig.h" - -// command sending macro's with debugging capability -#define SEND_PGM(x) send_P(PSTR(x)) -#define SENDLINE_PGM(x) sendLine_P(PSTR(x)) -#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(i16tostr3rj(y))) -#define SEND(x) send(x) -#define SENDLINE(x) sendLine(x) -#if ENABLED(ANYCUBIC_LCD_DEBUG) - #define SENDLINE_DBG_PGM(x,y) (sendLine_P(PSTR(x)), SERIAL_ECHOLNPGM(y)) - #define SENDLINE_DBG_PGM_VAL(x,y,z) (sendLine_P(PSTR(x)), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) -#else - #define SENDLINE_DBG_PGM(x,y) sendLine_P(PSTR(x)) - #define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x)) -#endif - -AnycubicTFTClass AnycubicTFT; - -static void sendNewLine(void) { - LCD_SERIAL.write('\r'); - LCD_SERIAL.write('\n'); -} - -static void send(const char *str) { - LCD_SERIAL.print(str); -} - -static void sendLine(const char *str) { - send(str); - sendNewLine(); -} - -static void send_P(PGM_P str) { - while (const char c = pgm_read_byte(str++)) - LCD_SERIAL.write(c); -} - -static void sendLine_P(PGM_P str) { - send_P(str); - sendNewLine(); -} - -AnycubicTFTClass::AnycubicTFTClass() {} - -void AnycubicTFTClass::OnSetup() { - #ifndef LCD_BAUDRATE - #define LCD_BAUDRATE 115200 - #endif - LCD_SERIAL.begin(LCD_BAUDRATE); - - SENDLINE_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset - ExtUI::delay_ms(10); - - // initialise the state of the key pins running on the tft - #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - SET_INPUT_PULLUP(SD_DETECT_PIN); - #endif - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - SET_INPUT_PULLUP(FIL_RUNOUT_PIN); - #endif - - mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - - // DoSDCardStateCheck(); - SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready - ExtUI::delay_ms(10); - - DoFilamentRunoutCheck(); - SelectedFile[0] = 0; - - #if ENABLED(STARTUP_CHIME) - ExtUI::injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); - #endif - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: Finished startup"); - #endif -} - -void AnycubicTFTClass::OnCommandScan() { - static millis_t nextStopCheck = 0; // used to slow the stopped print check down to reasonable times - const millis_t ms = millis(); - if (ELAPSED(ms, nextStopCheck)) { - nextStopCheck = ms + 1000UL; - if (mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); - #endif - mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status - ExtUI::delay_ms(200); - // tell printer to release resources of print to indicate it is done - SENDLINE_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); - } - } - - if (TFTbuflen < (TFTBUFSIZE - 1)) - GetCommandFromTFT(); - - if (TFTbuflen) { - TFTbuflen = (TFTbuflen - 1); - TFTbufindr = (TFTbufindr + 1) % TFTBUFSIZE; - } -} - -void AnycubicTFTClass::OnKillTFT() { - SENDLINE_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); -} - -void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered..."); - SERIAL_ECHO(ui8tostr2(isInserted)); - SERIAL_EOL(); - #endif - DoSDCardStateCheck(); -} - -void AnycubicTFTClass::OnSDCardError() { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardError event triggered..."); - #endif - SENDLINE_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); -} - -void AnycubicTFTClass::OnFilamentRunout() { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: FilamentRunout triggered..."); - #endif - DoFilamentRunoutCheck(); -} - -void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOPGM("TFT Serial Debug: OnUserConfirmRequired triggered... "); - SERIAL_ECHOLN(msg); - #endif - - #if ENABLED(SDSUPPORT) - /** - * Need to handle the process of following states - * "Nozzle Parked" - * "Load Filament" - * "Filament Purging..." - * "HeaterTimeout" - * "Reheat finished." - * - * NOTE: The only way to handle these states is strcmp_P with the msg unfortunately (very expensive) - */ - if (strcmp_P(msg, PSTR("Nozzle Parked")) == 0) { - mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_PARKED; - // enable continue button - SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); - } - else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { - mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; - // enable continue button - SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); - SENDLINE_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); - } - else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { - mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_PARKING; - // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out - // disable continue button - // SENDLINE_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause - - // enable continue button - SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); - } - else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { - mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT; - // enable continue button - SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18"); - } - else if (strcmp_P(msg, PSTR("Reheat finished.")) == 0) { - mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_REHEAT_FINISHED; - // enable continue button - SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18"); - } - #endif -} - -float AnycubicTFTClass::CodeValue() { - return (strtod(&TFTcmdbuffer[TFTbufindr][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindr] + 1], NULL)); -} - -bool AnycubicTFTClass::CodeSeen(char code) { - TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindr], code); - return (TFTstrchr_pointer != NULL); // Return True if a character was found -} - -bool AnycubicTFTClass::IsNozzleHomed() { - const float xPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::X); - const float yPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::Y); - return WITHIN(xPosition, X_MIN_POS - 0.1, X_MIN_POS + 0.1) && - WITHIN(yPosition, Y_MIN_POS - 0.1, Y_MIN_POS + 0.1); -} - -void AnycubicTFTClass::HandleSpecialMenu() { - /** - * NOTE: that the file selection command actual lowercases the entire selected file/foldername, so charracter comparisons need to be lowercase. - */ - if (SelectedDirectory[0] == '<') { - switch (SelectedDirectory[1]) { - case 'e': // "" - SpecialMenu = false; - return; - break; - - #if ENABLED(PROBE_MANUALLY) - case '0': - switch (SelectedDirectory[2]) { - case '1': // "<01ZUp0.1>" - SERIAL_ECHOLNPGM("Special Menu: Z Up 0.1"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.1\nG90")); - break; - - case '2': // "<02ZUp0.02>" - SERIAL_ECHOLNPGM("Special Menu: Z Up 0.02"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.02\nG90")); - break; - - case '3': // "<03ZDn0.02>" - SERIAL_ECHOLNPGM("Special Menu: Z Down 0.02"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.02\nG90")); - break; - - case '4': // "<04ZDn0.1>" - SERIAL_ECHOLNPGM("Special Menu: Z Down 0.1"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.1\nG90")); - break; - - case '5': // "<05PrehtBed>" - SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - ExtUI::injectCommands_P(PSTR("M140 S65")); - break; - - case '6': // "<06SMeshLvl>" - SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling"); - ExtUI::injectCommands_P(PSTR("G29 S1")); - break; - - case '7': // "<07MeshNPnt>" - SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point"); - ExtUI::injectCommands_P(PSTR("G29 S2")); - break; - - case '8': // "<08HtEndPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); - // need to dwell for half a second to give the fan a chance to start before the pid tuning starts - ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); - break; - - case '9': // "<09HtBedPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); - break; - - default: - break; - } - break; - - case '1': - switch (SelectedDirectory[2]) { - case '0': // "<10FWDeflts>" - SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); - break; - - case '1': // "<11SvEEPROM>" - SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); - break; - - default: - break; - } - break; - #else // if ENABLED(PROBE_MANUALLY) - case '0': - switch (SelectedDirectory[2]) { - case '1': // "<01PrehtBed>" - SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - ExtUI::injectCommands_P(PSTR("M140 S65")); - break; - - case '2': // "<02ABL>" - SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling"); - ExtUI::injectCommands_P(PSTR("G28\nG29")); - break; - - case '3': // "<03HtendPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); - // need to dwell for half a second to give the fan a chance to start before the pid tuning starts - ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); - break; - - case '4': // "<04HtbedPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); - break; - - case '5': // "<05FWDeflts>" - SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); - break; - - case '6': // "<06SvEEPROM>" - SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); - break; - - case '7': // <07SendM108> - SERIAL_ECHOLNPGM("Special Menu: Send User Confirmation"); - ExtUI::injectCommands_P(PSTR("M108")); - break; - - default: - break; - } - break; - #endif // PROBE_MANUALLY - - default: - break; - } - #if ENABLED(ANYCUBIC_LCD_DEBUG) - } - else { - SERIAL_ECHOPGM("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); - SERIAL_ECHOLN(SelectedDirectory); - #endif - } -} - -void AnycubicTFTClass::RenderCurrentFileList() { - #if ENABLED(SDSUPPORT) - uint16_t selectedNumber = 0; - SelectedDirectory[0] = 0; - SelectedFile[0] = 0; - ExtUI::FileList currentFileList; - - SENDLINE_PGM("FN "); // Filelist start - - if (!ExtUI::isMediaInserted() && !SpecialMenu) { - SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); - - SENDLINE_PGM(""); - SENDLINE_PGM(""); - } - else { - if (CodeSeen('S')) - selectedNumber = CodeValue(); - - if (SpecialMenu) - RenderSpecialMenu(selectedNumber); - else if (selectedNumber <= currentFileList.count()) - RenderCurrentFolder(selectedNumber); - } - SENDLINE_PGM("END"); // Filelist stop - #endif // SDSUPPORT -} - -void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { - switch (selectedNumber) { - #if ENABLED(PROBE_MANUALLY) - case 0: // First Page - SENDLINE_PGM("<01ZUp0.1>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<02ZUp0.02>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<03ZDn0.02>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<04ZDn0.1>"); - SENDLINE_PGM(""); - break; - - case 4: // Second Page - SENDLINE_PGM("<05PrehtBed>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<06SMeshLvl>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<07MeshNPnt>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<08HtEndPID>"); - SENDLINE_PGM(""); - break; - - case 8: // Third Page - SENDLINE_PGM("<09HtBedPID>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<10FWDeflts>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<11SvEEPROM>"); - SENDLINE_PGM(""); - SENDLINE_PGM(""); - SENDLINE_PGM(""); - break; - #else - case 0: // First Page - SENDLINE_PGM("<01PrehtBed>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<02ABL>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<03HtEndPID>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<04HtBedPID>"); - SENDLINE_PGM(""); - break; - - case 4: // Second Page - SENDLINE_PGM("<05FWDeflts>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<06SvEEPROM>"); - SENDLINE_PGM(""); - SENDLINE_PGM("<07SendM108>"); - SENDLINE_PGM(""); - SENDLINE_PGM(""); - SENDLINE_PGM(""); - break; - - #endif // PROBE_MANUALLY - - default: - break; - } -} - -void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { - ExtUI::FileList currentFileList; - uint16_t cnt = selectedNumber; - uint16_t max_files; - uint16_t dir_files = currentFileList.count(); - - if ((dir_files - selectedNumber) < 4) - max_files = dir_files; - else - max_files = selectedNumber + 3; - - for (cnt = selectedNumber; cnt <= max_files; cnt++) { - if (cnt == 0) { // Special Entry - if (currentFileList.isAtRootDir()) { - SENDLINE_PGM(""); - SENDLINE_PGM(""); - } - else { - SENDLINE_PGM("/.."); - SENDLINE_PGM("/.."); - } - } - else { - currentFileList.seek(cnt - 1, false); - - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLN(currentFileList.filename()); - #endif - if (currentFileList.isDir()) { - SEND_PGM("/"); - SENDLINE(currentFileList.shortFilename()); - SEND_PGM("/"); - SENDLINE(currentFileList.filename()); - - } - else { - SENDLINE(currentFileList.shortFilename()); - SENDLINE(currentFileList.filename()); - } - } - } -} - -void AnycubicTFTClass::OnPrintTimerStarted() { - #if ENABLED(SDSUPPORT) - if (mediaPrintingState == AMPRINTSTATE_PRINTING) - SENDLINE_DBG_PGM("J04", "TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print - - #endif -} - -void AnycubicTFTClass::OnPrintTimerPaused() { - #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) { - mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_PARKING; - } - #endif -} - -void AnycubicTFTClass::OnPrintTimerStopped() { - #if ENABLED(SDSUPPORT) - if (mediaPrintingState == AMPRINTSTATE_PRINTING) { - mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - SENDLINE_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); - } - // otherwise it was stopped by the printer so don't send print completed signal to TFT - #endif -} - -void AnycubicTFTClass::GetCommandFromTFT() { - char *starpos = NULL; - while (LCD_SERIAL.available() > 0 && TFTbuflen < TFTBUFSIZE) { - serial3_char = LCD_SERIAL.read(); - if (serial3_char == '\n' || - serial3_char == '\r' || - serial3_char == ':' || - serial3_count >= (TFT_MAX_CMD_SIZE - 1) - ) { - - if (!serial3_count) return; // if empty line - - TFTcmdbuffer[TFTbufindw][serial3_count] = 0; // terminate string - - if ((strchr(TFTcmdbuffer[TFTbufindw], 'A') != NULL)) { - int16_t a_command; - TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindw], 'A'); - a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], NULL)))); - - #if ENABLED(ANYCUBIC_LCD_DEBUG) - if ((a_command > 7) && (a_command != 20)) { // No debugging of status polls, please! - SERIAL_ECHOPGM("TFT Serial Command: "); - SERIAL_ECHOLN(TFTcmdbuffer[TFTbufindw]); - } - #endif - - switch (a_command) { - case 0: { // A0 GET HOTEND TEMP - float hotendActualTemp = ExtUI::getActualTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); - SEND_PGM_VAL("A0V ", int(hotendActualTemp + 0.5)); - } - break; - - case 1: { // A1 GET HOTEND TARGET TEMP - float hotendTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); - SEND_PGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); - } - break; - - case 2: { // A2 GET HOTBED TEMP - float heatedBedActualTemp = ExtUI::getActualTemp_celsius((ExtUI::heater_t) ExtUI::BED); - SEND_PGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); - } - break; - - case 3: { // A3 GET HOTBED TARGET TEMP - float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); - SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); - } break; - - case 4: { // A4 GET FAN SPEED - float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); - fanPercent = constrain(fanPercent, 0, 100); - SEND_PGM_VAL("A4V ", int(fanPercent)); - } break; - - case 5: { // A5 GET CURRENT COORDINATE - float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X); - float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); - float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); - SEND_PGM("A5V X: "); - LCD_SERIAL.print(xPostition); - SEND_PGM(" Y: "); - LCD_SERIAL.print(yPostition); - SEND_PGM(" Z: "); - LCD_SERIAL.print(zPostition); - SENDLINE_PGM(""); - } break; - - case 6: // A6 GET SD CARD PRINTING STATUS - #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) { - SEND_PGM("A6V "); - if (ExtUI::isMediaInserted()) - SENDLINE(ui8tostr3rj(ExtUI::getProgress_percent())); - else - SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); - } - else - SENDLINE_PGM("A6V ---"); - #endif - break; - - case 7: { // A7 GET PRINTING TIME - const uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); - SEND_PGM("A7V "); - if (elapsedSeconds != 0) { // print time - const uint32_t elapsedMinutes = elapsedSeconds / 60; - SEND(ui8tostr2(elapsedMinutes / 60)); - SEND_PGM(" H "); - SEND(ui8tostr2(elapsedMinutes % 60)); - SENDLINE_PGM(" M"); - } - else - SENDLINE_PGM(" 999:999"); - } - break; - - case 8: // A8 GET SD LIST - #if ENABLED(SDSUPPORT) - SelectedFile[0] = 0; - RenderCurrentFileList(); - #endif - break; - - case 9: // A9 pause sd print - #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) - PausePrint(); - #endif - break; - - case 10: // A10 resume sd print - #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMediaPaused()) - ResumePrint(); - #endif - break; - - case 11: // A11 STOP SD PRINT - TERN_(SDSUPPORT, StopPrint()); - break; - - case 12: // A12 kill - kill(PSTR(STR_ERR_KILLED)); - break; - - case 13: // A13 SELECTION FILE - #if ENABLED(SDSUPPORT) - if (ExtUI::isMediaInserted()) { - starpos = (strchr(TFTstrchr_pointer + 4, '*')); - if (TFTstrchr_pointer[4] == '/') { - strcpy(SelectedDirectory, TFTstrchr_pointer + 5); - SelectedFile[0] = 0; - SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected - SENDLINE_PGM(""); - } - else if (TFTstrchr_pointer[4] == '<') { - strcpy(SelectedDirectory, TFTstrchr_pointer + 4); - SpecialMenu = true; - SelectedFile[0] = 0; - SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected - SENDLINE_PGM(""); - } - else { - SelectedDirectory[0] = 0; - - if (starpos != NULL) - *(starpos - 1) = '\0'; - - strcpy(SelectedFile, TFTstrchr_pointer + 4); - SENDLINE_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected - } - } - #endif - break; - - case 14: // A14 START PRINTING - #if ENABLED(SDSUPPORT) - if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) - StartPrint(); - #endif - break; - - case 15: // A15 RESUMING FROM OUTAGE - // TODO: JBA implement resume form outage - break; - - case 16: { // A16 set hotend temp - unsigned int tempvalue; - if (CodeSeen('S')) { - tempvalue = constrain(CodeValue(), 0, 275); - ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); - } - else if (CodeSeen('C') && !ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) - ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS - tempvalue = constrain(CodeValue(), 0, 275); - ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); - } - } - break; - - case 17: { // A17 set heated bed temp - unsigned int tempbed; - if (CodeSeen('S')) { - tempbed = constrain(CodeValue(), 0, 100); - ExtUI::setTargetTemp_celsius(tempbed, (ExtUI::heater_t)ExtUI::BED); - } - } - break; - - case 18: { // A18 set fan speed - float fanPercent; - if (CodeSeen('S')) { - fanPercent = CodeValue(); - fanPercent = constrain(fanPercent, 0, 100); - ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); - } - else - fanPercent = 100; - - ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); - SENDLINE_PGM(""); - } - break; - - case 19: // A19 stop stepper drivers - sent on stop extrude command and on turn motors off command - if (!ExtUI::isPrinting()) { - quickstop_stepper(); - disable_all_steppers(); - } - - SENDLINE_PGM(""); - break; - - case 20: // A20 read printing speed - if (CodeSeen('S')) - feedrate_percentage = constrain(CodeValue(), 40, 999); - else - SEND_PGM_VAL("A20V ", feedrate_percentage); - break; - - case 21: // A21 all home - if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { - if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) { - if (CodeSeen('X')) - ExtUI::injectCommands_P(PSTR("G28 X")); - if (CodeSeen('Y')) - ExtUI::injectCommands_P(PSTR("G28 Y")); - if (CodeSeen('Z')) - ExtUI::injectCommands_P(PSTR("G28 Z")); - } - else if (CodeSeen('C')) { - ExtUI::injectCommands_P(PSTR("G28")); - } - } - break; - - case 22: // A22 move X/Y/Z or extrude - if (!ExtUI::isPrinting()) { - float coorvalue; - unsigned int movespeed = 0; - char commandStr[30]; - char fullCommandStr[38]; - - commandStr[0] = 0; // empty string - if (CodeSeen('F')) // Set feedrate - movespeed = CodeValue(); - - if (CodeSeen('X')) { // Move in X direction - coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) - sprintf_P(commandStr, PSTR("G1 X0.1F%i"), movespeed); - else if ((coorvalue <= -0.1) && coorvalue > -1) - sprintf_P(commandStr, PSTR("G1 X-0.1F%i"), movespeed); - else - sprintf_P(commandStr, PSTR("G1 X%iF%i"), int(coorvalue), movespeed); - } - else if (CodeSeen('Y')) { // Move in Y direction - coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) - sprintf_P(commandStr, PSTR("G1 Y0.1F%i"), movespeed); - else if ((coorvalue <= -0.1) && coorvalue > -1) - sprintf_P(commandStr, PSTR("G1 Y-0.1F%i"), movespeed); - else - sprintf_P(commandStr, PSTR("G1 Y%iF%i"), int(coorvalue), movespeed); - } - else if (CodeSeen('Z')) { // Move in Z direction - coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) - sprintf_P(commandStr, PSTR("G1 Z0.1F%i"), movespeed); - else if ((coorvalue <= -0.1) && coorvalue > -1) - sprintf_P(commandStr, PSTR("G1 Z-0.1F%i"), movespeed); - else - sprintf_P(commandStr, PSTR("G1 Z%iF%i"), int(coorvalue), movespeed); - } - else if (CodeSeen('E')) { // Extrude - coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) - sprintf_P(commandStr, PSTR("G1 E0.1F%i"), movespeed); - else if ((coorvalue <= -0.1) && coorvalue > -1) - sprintf_P(commandStr, PSTR("G1 E-0.1F%i"), movespeed); - else - sprintf_P(commandStr, PSTR("G1 E%iF500"), int(coorvalue)); - } - - if (strlen(commandStr) > 0) { - sprintf_P(fullCommandStr, PSTR("G91\n%s\nG90"), commandStr); - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); - SERIAL_ECHOLN(fullCommandStr); - #endif - ExtUI::injectCommands(fullCommandStr); - } - } - SENDLINE_PGM(""); - break; - - case 23: // A23 preheat pla - if (!ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) - ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS - - ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); - ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); - SENDLINE_PGM("OK"); - } - break; - - case 24:// A24 preheat abs - if (!ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) - ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS - - ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); - ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); - SENDLINE_PGM("OK"); - } - break; - - case 25: // A25 cool down - if (!ExtUI::isPrinting()) { - ExtUI::setTargetTemp_celsius(0, (ExtUI::heater_t) ExtUI::BED); - ExtUI::setTargetTemp_celsius(0, (ExtUI::extruder_t) ExtUI::E0); - - SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down - } - break; - - case 26: // A26 refresh SD - #if ENABLED(SDSUPPORT) - if (ExtUI::isMediaInserted()) { - if (strlen(SelectedDirectory) > 0) { - ExtUI::FileList currentFileList; - if ((SelectedDirectory[0] == '.') && (SelectedDirectory[1] == '.')) { - currentFileList.upDir(); - } - else { - if (SelectedDirectory[0] == '<') - HandleSpecialMenu(); - else - currentFileList.changeDir(SelectedDirectory); - } - } - } - else { - SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); - } - - SelectedDirectory[0] = 0; - #endif - break; - - #if ENABLED(SERVO_ENDSTOPS) - case 27: break; // A27 servos angles adjust - #endif - - case 28: // A28 filament test - if (CodeSeen('O')) - NOOP; - else if (CodeSeen('C')) - NOOP; - SENDLINE_PGM(""); - break; - - case 33: // A33 get version info - SEND_PGM("J33 "); - SENDLINE_PGM(DETAILED_BUILD_VERSION); - break; - - default: - break; - } - } - - TFTbufindw = (TFTbufindw + 1) % TFTBUFSIZE; - TFTbuflen += 1; - serial3_count = 0; // clear buffer - } - else { - TFTcmdbuffer[TFTbufindw][serial3_count++] = serial3_char; - } - } -} - -void AnycubicTFTClass::DoSDCardStateCheck() { - #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - bool isInserted = ExtUI::isMediaInserted(); - if (isInserted) - SENDLINE_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); - else - SENDLINE_DBG_PGM("J01", "TFT Serial Debug: SD card state changed... !isInserted"); - - #endif -} - -void AnycubicTFTClass::DoFilamentRunoutCheck() { - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - // NOTE: ExtUI::getFilamentRunoutState() only returns the runout state if the job is printing - // we want to actually check the status of the pin here, regardless of printstate - if (READ(FIL_RUNOUT_PIN)) { - if (mediaPrintingState == AMPRINTSTATE_PRINTING || mediaPrintingState == AMPRINTSTATE_PAUSED || mediaPrintingState == AMPRINTSTATE_PAUSE_REQUESTED) { - // play tone to indicate filament is out - ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); - - // tell the user that the filament has run out and wait - SENDLINE_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); - } - else { - SENDLINE_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15"); - } - } - #endif // FILAMENT_RUNOUT_SENSOR -} - -void AnycubicTFTClass::StartPrint() { - #if ENABLED(SDSUPPORT) - if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOPGM("TFT Serial Debug: About to print file ... "); - SERIAL_ECHO(ExtUI::isPrinting()); - SERIAL_ECHOPGM(" "); - SERIAL_ECHOLN(SelectedFile); - #endif - mediaPrintingState = AMPRINTSTATE_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ExtUI::printFile(SelectedFile); - } - #endif // SDUPPORT -} - -void AnycubicTFTClass::PausePrint() { - #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { - mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state - SENDLINE_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause - - // for some reason pausing the print doesn't retract the extruder so force a manual one here - ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); - ExtUI::pausePrint(); - } - #endif -} - -void AnycubicTFTClass::ResumePrint() { - #if ENABLED(SDSUPPORT) - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - if (READ(FIL_RUNOUT_PIN)) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); - #endif - - // trigger the user message box - DoFilamentRunoutCheck(); - - // re-enable the continue button - SENDLINE_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still tripped... J18"); - return; - } - #endif - - if (mediaPauseState == AMPAUSESTATE_HEATER_TIMEOUT) { - mediaPauseState = AMPAUSESTATE_REHEATING; - // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out - // // disable the continue button - // SENDLINE_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause - - // reheat the nozzle - ExtUI::setUserConfirmed(); - } - else { - mediaPrintingState = AMPRINTSTATE_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - - SENDLINE_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now - ExtUI::resumePrint(); - } - #endif -} - -void AnycubicTFTClass::StopPrint() { - #if ENABLED(SDSUPPORT) - mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - SENDLINE_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); - - // for some reason stopping the print doesn't retract the extruder so force a manual one here - ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); - ExtUI::stopPrint(); - #endif -} - -#endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h deleted file mode 100644 index a4ecf5604f..0000000000 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - * anycubic_i3mega_lcd.h --- Support for Anycubic i3 Mega TFT - * Created by Christian Hopp on 09.12.17. - * Improved by David Ramiro - * Converted to ext_iu by John BouAntoun 21 June 2020 - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#pragma once - -#include "../../../../inc/MarlinConfigPre.h" -#include "../../../../sd/SdFatConfig.h" // for the FILENAME_LENGTH macro - -#define TFTBUFSIZE 4 -#define TFT_MAX_CMD_SIZE 96 - -enum AnycubicMediaPrintState { - AMPRINTSTATE_NOT_PRINTING, - AMPRINTSTATE_PRINTING, - AMPRINTSTATE_PAUSE_REQUESTED, - AMPRINTSTATE_PAUSED, - AMPRINTSTATE_STOP_REQUESTED -}; - -enum AnycubicMediaPauseState { - AMPAUSESTATE_NOT_PAUSED, - AMPAUSESTATE_PARKING, - AMPAUSESTATE_PARKED, - AMPAUSESTATE_FILAMENT_OUT, - AMPAUSESTATE_FIAMENT_PRUGING, - AMPAUSESTATE_HEATER_TIMEOUT, - AMPAUSESTATE_REHEATING, - AMPAUSESTATE_REHEAT_FINISHED -}; - -class AnycubicTFTClass { -public: - AnycubicTFTClass(); - void OnSetup(); - void OnCommandScan(); - void OnKillTFT(); - void OnSDCardStateChange(bool); - void OnSDCardError(); - void OnFilamentRunout(); - void OnUserConfirmRequired(const char *); - void OnPrintTimerStarted(); - void OnPrintTimerPaused(); - void OnPrintTimerStopped(); - -private: - char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; - int TFTbuflen=0; - int TFTbufindr = 0; - int TFTbufindw = 0; - char serial3_char; - int serial3_count = 0; - char *TFTstrchr_pointer; - uint8_t SpecialMenu = false; - AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - - float CodeValue(); - bool CodeSeen(char); - bool IsNozzleHomed(); - void RenderCurrentFileList(); - void RenderSpecialMenu(uint16_t); - void RenderCurrentFolder(uint16_t); - void GetCommandFromTFT(); - void CheckSDCardChange(); - void CheckPauseState(); - void CheckPrintCompletion(); - void HandleSpecialMenu(); - void DoSDCardStateCheck(); - void DoFilamentRunoutCheck(); - void StartPrint(); - void PausePrint(); - void ResumePrint(); - void StopPrint(); - - char SelectedDirectory[30]; - char SelectedFile[FILENAME_LENGTH]; -}; - -extern AnycubicTFTClass AnycubicTFT; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp deleted file mode 100644 index 8577b76ce6..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* DGUS implementation written by coldtobi in 2019 for Marlin */ - -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_DGUS_LCD - -#if HOTENDS > 2 - #error "More than 2 hotends not implemented on the Display UI design." -#endif - -#include "../../ui_api.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../module/motion.h" -#include "../../../../gcode/queue.h" -#include "../../../../module/planner.h" -#include "../../../../sd/cardreader.h" -#include "../../../../libs/duration_t.h" -#include "../../../../module/printcounter.h" -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" -#endif - -#include "DGUSDisplay.h" -#include "DGUSVPVariable.h" -#include "DGUSDisplayDef.h" - -// Preamble... 2 Bytes, usually 0x5A 0xA5, but configurable -constexpr uint8_t DGUS_HEADER1 = 0x5A; -constexpr uint8_t DGUS_HEADER2 = 0xA5; - -constexpr uint8_t DGUS_CMD_WRITEVAR = 0x82; -constexpr uint8_t DGUS_CMD_READVAR = 0x83; - -#if ENABLED(DEBUG_DGUSLCD) - bool dguslcd_local_debug; // = false; -#endif - -void DGUSDisplay::InitDisplay() { - #ifndef LCD_BAUDRATE - #define LCD_BAUDRATE 115200 - #endif - LCD_SERIAL.begin(LCD_BAUDRATE); - if (TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) - RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); -} - -void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { - const char* myvalues = static_cast(values); - bool strend = !myvalues; - WriteHeader(adr, DGUS_CMD_WRITEVAR, valueslen); - while (valueslen--) { - char x; - if (!strend) x = *myvalues++; - if ((isstr && !x) || strend) { - strend = true; - x = ' '; - } - LCD_SERIAL.write(x); - } -} - -void DGUSDisplay::WriteVariable(uint16_t adr, uint16_t value) { - value = (value & 0xffU) << 8U | (value >> 8U); - WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); -} - -void DGUSDisplay::WriteVariable(uint16_t adr, int16_t value) { - value = (value & 0xffU) << 8U | (value >> 8U); - WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); -} - -void DGUSDisplay::WriteVariable(uint16_t adr, uint8_t value) { - WriteVariable(adr, static_cast(&value), sizeof(uint8_t)); -} - -void DGUSDisplay::WriteVariable(uint16_t adr, int8_t value) { - WriteVariable(adr, static_cast(&value), sizeof(int8_t)); -} - -void DGUSDisplay::WriteVariable(uint16_t adr, long value) { - union { long l; char lb[4]; } endian; - char tmp[4]; - endian.l = value; - tmp[0] = endian.lb[3]; - tmp[1] = endian.lb[2]; - tmp[2] = endian.lb[1]; - tmp[3] = endian.lb[0]; - WriteVariable(adr, static_cast(&tmp), sizeof(long)); -} - -void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { - const char* myvalues = static_cast(values); - bool strend = !myvalues; - WriteHeader(adr, DGUS_CMD_WRITEVAR, valueslen); - while (valueslen--) { - char x; - if (!strend) x = pgm_read_byte(myvalues++); - if ((isstr && !x) || strend) { - strend = true; - x = ' '; - } - LCD_SERIAL.write(x); - } -} - -void DGUSDisplay::ProcessRx() { - - #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) - if (!LCD_SERIAL.available() && LCD_SERIAL.buffer_overruns()) { - // Overrun, but reset the flag only when the buffer is empty - // We want to extract as many as valid datagrams possible... - DEBUG_ECHOPGM("OVFL"); - rx_datagram_state = DGUS_IDLE; - //LCD_SERIAL.reset_rx_overun(); - LCD_SERIAL.flush(); - } - #endif - - uint8_t receivedbyte; - while (LCD_SERIAL.available()) { - switch (rx_datagram_state) { - - case DGUS_IDLE: // Waiting for the first header byte - receivedbyte = LCD_SERIAL.read(); - //DEBUG_ECHOPAIR("< ",x); - if (DGUS_HEADER1 == receivedbyte) rx_datagram_state = DGUS_HEADER1_SEEN; - break; - - case DGUS_HEADER1_SEEN: // Waiting for the second header byte - receivedbyte = LCD_SERIAL.read(); - //DEBUG_ECHOPAIR(" ",x); - rx_datagram_state = (DGUS_HEADER2 == receivedbyte) ? DGUS_HEADER2_SEEN : DGUS_IDLE; - break; - - case DGUS_HEADER2_SEEN: // Waiting for the length byte - rx_datagram_len = LCD_SERIAL.read(); - DEBUG_ECHOPAIR(" (", rx_datagram_len, ") "); - - // Telegram min len is 3 (command and one word of payload) - rx_datagram_state = WITHIN(rx_datagram_len, 3, DGUS_RX_BUFFER_SIZE) ? DGUS_WAIT_TELEGRAM : DGUS_IDLE; - break; - - case DGUS_WAIT_TELEGRAM: // wait for complete datagram to arrive. - if (LCD_SERIAL.available() < rx_datagram_len) return; - - Initialized = true; // We've talked to it, so we defined it as initialized. - uint8_t command = LCD_SERIAL.read(); - - DEBUG_ECHOPAIR("# ", command); - - uint8_t readlen = rx_datagram_len - 1; // command is part of len. - unsigned char tmp[rx_datagram_len - 1]; - unsigned char *ptmp = tmp; - while (readlen--) { - receivedbyte = LCD_SERIAL.read(); - DEBUG_ECHOPAIR(" ", receivedbyte); - *ptmp++ = receivedbyte; - } - DEBUG_ECHOPGM(" # "); - // mostly we'll get this: 5A A5 03 82 4F 4B -- ACK on 0x82, so discard it. - if (command == DGUS_CMD_WRITEVAR && 'O' == tmp[0] && 'K' == tmp[1]) { - DEBUG_ECHOLNPGM(">"); - rx_datagram_state = DGUS_IDLE; - break; - } - - /* AutoUpload, (and answer to) Command 0x83 : - | tmp[0 1 2 3 4 ... ] - | Example 5A A5 06 83 20 01 01 78 01 …… - | / / | | \ / | \ \ - | Header | | | | \_____\_ DATA (Words!) - | DatagramLen / VPAdr | - | Command DataLen (in Words) */ - if (command == DGUS_CMD_READVAR) { - const uint16_t vp = tmp[0] << 8 | tmp[1]; - //const uint8_t dlen = tmp[2] << 1; // Convert to Bytes. (Display works with words) - //DEBUG_ECHOPAIR(" vp=", vp, " dlen=", dlen); - DGUS_VP_Variable ramcopy; - if (populate_VPVar(vp, &ramcopy)) { - if (ramcopy.set_by_display_handler) - ramcopy.set_by_display_handler(ramcopy, &tmp[3]); - else - DEBUG_ECHOLNPGM(" VPVar found, no handler."); - } - else - DEBUG_ECHOLNPAIR(" VPVar not found:", vp); - - rx_datagram_state = DGUS_IDLE; - break; - } - - // discard anything else - rx_datagram_state = DGUS_IDLE; - } - } -} - -size_t DGUSDisplay::GetFreeTxBuffer() { return SERIAL_GET_TX_BUFFER_FREE(); } - -void DGUSDisplay::WriteHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen) { - LCD_SERIAL.write(DGUS_HEADER1); - LCD_SERIAL.write(DGUS_HEADER2); - LCD_SERIAL.write(payloadlen + 3); - LCD_SERIAL.write(cmd); - LCD_SERIAL.write(adr >> 8); - LCD_SERIAL.write(adr & 0xFF); -} - -void DGUSDisplay::WritePGM(const char str[], uint8_t len) { - while (len--) LCD_SERIAL.write(pgm_read_byte(str++)); -} - -void DGUSDisplay::loop() { - // protect against recursion… ProcessRx() may indirectly call idle() when injecting gcode commands. - if (!no_reentrance) { - no_reentrance = true; - ProcessRx(); - no_reentrance = false; - } -} - -rx_datagram_state_t DGUSDisplay::rx_datagram_state = DGUS_IDLE; -uint8_t DGUSDisplay::rx_datagram_len = 0; -bool DGUSDisplay::Initialized = false; -bool DGUSDisplay::no_reentrance = false; - -// A SW memory barrier, to ensure GCC does not overoptimize loops -#define sw_barrier() asm volatile("": : :"memory"); - -bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy) { - // DEBUG_ECHOPAIR("populate_VPVar ", VP); - const DGUS_VP_Variable *pvp = DGUSLCD_FindVPVar(VP); - // DEBUG_ECHOLNPAIR(" pvp ", (uint16_t )pvp); - if (!pvp) return false; - memcpy_P(ramcopy, pvp, sizeof(DGUS_VP_Variable)); - return true; -} - -#endif // HAS_DGUS_LCD diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h deleted file mode 100644 index ee536ea219..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/* DGUS implementation written by coldtobi in 2019 for Marlin */ - -#include "../../../../inc/MarlinConfigPre.h" - -#include "../../../../MarlinCore.h" -#if HAS_BED_PROBE - #include "../../../../module/probe.h" -#endif -#include "DGUSVPVariable.h" - -enum DGUSLCD_Screens : uint8_t; - -#define DEBUG_OUT ENABLED(DEBUG_DGUSLCD) -#include "../../../../core/debug_out.h" - -typedef enum : uint8_t { - DGUS_IDLE, //< waiting for DGUS_HEADER1. - DGUS_HEADER1_SEEN, //< DGUS_HEADER1 received - DGUS_HEADER2_SEEN, //< DGUS_HEADER2 received - DGUS_WAIT_TELEGRAM, //< LEN received, Waiting for to receive all bytes. -} rx_datagram_state_t; - -// Low-Level access to the display. -class DGUSDisplay { -public: - - DGUSDisplay() = default; - - static void InitDisplay(); - - // Variable access. - static void WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false); - static void WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false); - static void WriteVariable(uint16_t adr, int16_t value); - static void WriteVariable(uint16_t adr, uint16_t value); - static void WriteVariable(uint16_t adr, uint8_t value); - static void WriteVariable(uint16_t adr, int8_t value); - static void WriteVariable(uint16_t adr, long value); - - // Utility functions for bridging ui_api and dbus - template - static void SetVariable(DGUS_VP_Variable &var) { - WriteVariable(var.VP, (WireType)Getter(selector)); - } - - template - static void GetVariable(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t newvalue = swap16(*(uint16_t*)val_ptr); - Setter(newvalue, selector); - } - - // Until now I did not need to actively read from the display. That's why there is no ReadVariable - // (I extensively use the auto upload of the display) - - // Force display into another screen. - // (And trigger update of containing VPs) - // (to implement a pop up message, which may not be nested) - static void RequestScreen(DGUSLCD_Screens screen); - - // Periodic tasks, eg. Rx-Queue handling. - static void loop(); - -public: - // Helper for users of this class to estimate if an interaction would be blocking. - static size_t GetFreeTxBuffer(); - - // Checks two things: Can we confirm the presence of the display and has we initiliazed it. - // (both boils down that the display answered to our chatting) - static inline bool isInitialized() { return Initialized; } - -private: - static void WriteHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen); - static void WritePGM(const char str[], uint8_t len); - static void ProcessRx(); - - static inline uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); } - static rx_datagram_state_t rx_datagram_state; - static uint8_t rx_datagram_len; - static bool Initialized, no_reentrance; -}; - -#define GET_VARIABLE(f, t, V...) (&DGUSDisplay::GetVariable) -#define SET_VARIABLE(f, t, V...) (&DGUSDisplay::SetVariable) - -extern DGUSDisplay dgusdisplay; - -// compile-time x^y -constexpr float cpow(const float x, const int y) { return y == 0 ? 1.0 : x * cpow(x, y - 1); } - -/// Find the flash address of a DGUS_VP_Variable for the VP. -extern const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp); - -/// Helper to populate a DGUS_VP_Variable for a given VP. Return false if not found. -extern bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy); diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h deleted file mode 100644 index b34a04875d..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/* DGUS implementation written by coldtobi in 2019 for Marlin */ - -#include "DGUSVPVariable.h" - -#include - -// This file defines the interaction between Marlin and the display firmware. - -// information on which screen which VP is displayed -// As this is a sparse table, two arrays are needed: -// one to list the VPs of one screen and one to map screens to the lists. -// (Strictly this would not be necessary, but allows to only send data the display needs and reducing load on Marlin) -struct VPMapping { - const uint8_t screen; - const uint16_t *VPList; // The list is null-terminated. -}; - -extern const struct VPMapping VPMap[]; - -// List of VPs handled by Marlin / The Display. -extern const struct DGUS_VP_Variable ListOfVP[]; - -#include "../../../../inc/MarlinConfig.h" - -#if ENABLED(DGUS_LCD_UI_ORIGIN) - #include "origin/DGUSDisplayDef.h" -#elif ENABLED(DGUS_LCD_UI_FYSETC) - #include "fysetc/DGUSDisplayDef.h" -#elif ENABLED(DGUS_LCD_UI_HIPRECY) - #include "hiprecy/DGUSDisplayDef.h" -#endif diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp deleted file mode 100644 index 7988985c2e..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ /dev/null @@ -1,1140 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_DGUS_LCD - -#include "DGUSScreenHandler.h" -#include "DGUSDisplay.h" -#include "DGUSVPVariable.h" -#include "DGUSDisplayDef.h" - -#include "../../ui_api.h" -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../module/motion.h" -#include "../../../../gcode/queue.h" -#include "../../../../module/planner.h" -#include "../../../../sd/cardreader.h" -#include "../../../../libs/duration_t.h" -#include "../../../../module/printcounter.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" -#endif - -uint16_t DGUSScreenHandler::ConfirmVP; - -#if ENABLED(SDSUPPORT) - int16_t DGUSScreenHandler::top_file = 0; - int16_t DGUSScreenHandler::file_to_print = 0; - static ExtUI::FileList filelist; -#endif - -void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; - -//DGUSScreenHandler ScreenHandler; - -DGUSLCD_Screens DGUSScreenHandler::current_screen; -DGUSLCD_Screens DGUSScreenHandler::past_screens[NUM_PAST_SCREENS]; -uint8_t DGUSScreenHandler::update_ptr; -uint16_t DGUSScreenHandler::skipVP; -bool DGUSScreenHandler::ScreenComplete; - -//DGUSDisplay dgusdisplay; - -// endianness swap -uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); } - -void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { - DGUS_VP_Variable ramcopy; - if (populate_VPVar(VP_MSGSTR1, &ramcopy)) { - ramcopy.memadr = (void*) line1; - l1inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); - } - if (populate_VPVar(VP_MSGSTR2, &ramcopy)) { - ramcopy.memadr = (void*) line2; - l2inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); - } - if (populate_VPVar(VP_MSGSTR3, &ramcopy)) { - ramcopy.memadr = (void*) line3; - l3inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); - } - if (populate_VPVar(VP_MSGSTR4, &ramcopy)) { - ramcopy.memadr = (void*) line4; - l4inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); - } -} - -void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1, bool l2, bool l3, bool l4) { - if (current_screen == DGUSLCD_SCREEN_CONFIRM) { - // Already showing a pop up, so we need to cancel that first. - PopToOldScreen(); - } - - ConfirmVP = VP; - sendinfoscreen(line1, line2, line3, line4, l1, l2, l3, l4); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_CONFIRM); -} - -void DGUSScreenHandler::setstatusmessage(const char *msg) { - DGUS_VP_Variable ramcopy; - if (populate_VPVar(VP_M117, &ramcopy)) { - ramcopy.memadr = (void*) msg; - DGUSLCD_SendStringToDisplay(ramcopy); - } -} - -void DGUSScreenHandler::setstatusmessagePGM(PGM_P const msg) { - DGUS_VP_Variable ramcopy; - if (populate_VPVar(VP_M117, &ramcopy)) { - ramcopy.memadr = (void*) msg; - DGUSLCD_SendStringToDisplayPGM(ramcopy); - } -} - -// Send an 8 bit or 16 bit value to the display. -void DGUSScreenHandler::DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); - //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); - if (var.size > 1) - dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); - else - dgusdisplay.WriteVariable(var.VP, *(int8_t*)var.memadr); - } -} - -// Send an uint8_t between 0 and 255 to the display, but scale to a percentage (0..100) -void DGUSScreenHandler::DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); - //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); - uint16_t tmp = *(uint8_t *) var.memadr +1 ; // +1 -> avoid rounding issues for the display. - tmp = map(tmp, 0, 255, 0, 100); - dgusdisplay.WriteVariable(var.VP, tmp); - } -} - -// Send the current print progress to the display. -void DGUSScreenHandler::DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var) { - //DEBUG_ECHOPAIR(" DGUSLCD_SendPrintProgressToDisplay ", var.VP); - uint16_t tmp = ExtUI::getProgress_percent(); - //DEBUG_ECHOLNPAIR(" data ", tmp); - dgusdisplay.WriteVariable(var.VP, tmp); -} - -// Send the current print time to the display. -// It is using a hex display for that: It expects BSD coded data in the format xxyyzz -void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var) { - duration_t elapsed = print_job_timer.duration(); - char buf[32]; - elapsed.toString(buf); - dgusdisplay.WriteVariable(VP_PrintTime, buf, var.size, true); -} - -// Send an uint8_t between 0 and 100 to a variable scale to 0..255 -void DGUSScreenHandler::DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr) { - if (var.memadr) { - uint16_t value = swap16(*(uint16_t*)val_ptr); - *(uint8_t*)var.memadr = map(constrain(value, 0, 100), 0, 100, 0, 255); - } -} - -// Sends a (RAM located) string to the DGUS Display -// (Note: The DGUS Display does not clear after the \0, you have to -// overwrite the remainings with spaces.// var.size has the display buffer size! -void DGUSScreenHandler::DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var) { - char *tmp = (char*) var.memadr; - dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); -} - -// Sends a (flash located) string to the DGUS Display -// (Note: The DGUS Display does not clear after the \0, you have to -// overwrite the remainings with spaces.// var.size has the display buffer size! -void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { - char *tmp = (char*) var.memadr; - dgusdisplay.WriteVariablePGM(var.VP, tmp, var.size, true); -} - -#if HAS_PID_HEATING - void DGUSScreenHandler::DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var) { - float value = *(float *)var.memadr; - float valuesend = 0; - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_PID_P: valuesend = value; break; - case VP_E0_PID_I: valuesend = unscalePID_i(value); break; - case VP_E0_PID_D: valuesend = unscalePID_d(value); break; - #endif - #if HOTENDS >= 2 - case VP_E1_PID_P: valuesend = value; break; - case VP_E1_PID_I: valuesend = unscalePID_i(value); break; - case VP_E1_PID_D: valuesend = unscalePID_d(value); break; - #endif - #if HAS_HEATED_BED - case VP_BED_PID_P: valuesend = value; break; - case VP_BED_PID_I: valuesend = unscalePID_i(value); break; - case VP_BED_PID_D: valuesend = unscalePID_d(value); break; - #endif - } - - valuesend *= cpow(10, 1); - union { int16_t i; char lb[2]; } endian; - - char tmp[2]; - endian.i = valuesend; - tmp[0] = endian.lb[1]; - tmp[1] = endian.lb[0]; - dgusdisplay.WriteVariable(var.VP, tmp, 2); - } -#endif - -#if ENABLED(PRINTCOUNTER) - - // Send the accumulate print time to the display. - // It is using a hex display for that: It expects BSD coded data in the format xxyyzz - void DGUSScreenHandler::DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var) { - printStatistics state = print_job_timer.getStats(); - char buf[21]; - duration_t elapsed = state.printTime; - elapsed.toString(buf); - dgusdisplay.WriteVariable(VP_PrintAccTime, buf, var.size, true); - } - - void DGUSScreenHandler::DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var) { - printStatistics state = print_job_timer.getStats(); - char buf[21]; - sprintf_P(buf, PSTR("%u"), state.totalPrints); - dgusdisplay.WriteVariable(VP_PrintsTotal, buf, var.size, true); - } - -#endif - -// Send fan status value to the display. -#if HAS_FAN - void DGUSScreenHandler::DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - DEBUG_ECHOPAIR(" DGUSLCD_SendFanStatusToDisplay ", var.VP); - DEBUG_ECHOLNPAIR(" data ", *(uint8_t *)var.memadr); - uint16_t data_to_send = 0; - if (*(uint8_t *) var.memadr) data_to_send = 1; - dgusdisplay.WriteVariable(var.VP, data_to_send); - } - } -#endif - -// Send heater status value to the display. -void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - DEBUG_ECHOPAIR(" DGUSLCD_SendHeaterStatusToDisplay ", var.VP); - DEBUG_ECHOLNPAIR(" data ", *(int16_t *)var.memadr); - uint16_t data_to_send = 0; - if (*(int16_t *) var.memadr) data_to_send = 1; - dgusdisplay.WriteVariable(var.VP, data_to_send); - } -} - -#if ENABLED(DGUS_UI_WAITING) - void DGUSScreenHandler::DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var) { - // In FYSETC UI design there are 10 statuses to loop - static uint16_t period = 0; - static uint16_t index = 0; - //DEBUG_ECHOPAIR(" DGUSLCD_SendWaitingStatusToDisplay ", var.VP); - //DEBUG_ECHOLNPAIR(" data ", swap16(index)); - if (period++ > DGUS_UI_WAITING_STATUS_PERIOD) { - dgusdisplay.WriteVariable(var.VP, index); - //DEBUG_ECHOLNPAIR(" data ", swap16(index)); - if (++index >= DGUS_UI_WAITING_STATUS) index = 0; - period = 0; - } - } -#endif - -#if ENABLED(SDSUPPORT) - - void DGUSScreenHandler::ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr) { - // default action executed when there is a SD card, but not printing - if (ExtUI::isMediaInserted() && !ExtUI::isPrintingFromMedia()) { - ScreenChangeHook(var, val_ptr); - dgusdisplay.RequestScreen(current_screen); - return; - } - - // if we are printing, we jump to two screens after the requested one. - // This should host e.g a print pause / print abort / print resume dialog. - // This concept allows to recycle this hook for other file - if (ExtUI::isPrintingFromMedia() && !card.flag.abort_sd_printing) { - GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); - return; - } - - // Don't let the user in the dark why there is no reaction. - if (!ExtUI::isMediaInserted()) { - setstatusmessagePGM(GET_TEXT(MSG_NO_MEDIA)); - return; - } - if (card.flag.abort_sd_printing) { - setstatusmessagePGM(GET_TEXT(MSG_MEDIA_ABORTING)); - return; - } - } - - void DGUSScreenHandler::DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable& var, void *val_ptr) { - auto old_top = top_file; - const int16_t scroll = (int16_t)swap16(*(uint16_t*)val_ptr); - if (scroll) { - top_file += scroll; - DEBUG_ECHOPAIR("new topfile calculated:", top_file); - if (top_file < 0) { - top_file = 0; - DEBUG_ECHOLNPGM("Top of filelist reached"); - } - else { - int16_t max_top = filelist.count() - DGUS_SD_FILESPERSCREEN; - NOLESS(max_top, 0); - NOMORE(top_file, max_top); - } - DEBUG_ECHOPAIR("new topfile adjusted:", top_file); - } - else if (!filelist.isAtRootDir()) { - filelist.upDir(); - top_file = 0; - ForceCompleteUpdate(); - } - - if (old_top != top_file) ForceCompleteUpdate(); - } - - void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; - if (touched_nr > filelist.count()) return; - if (!filelist.seek(touched_nr)) return; - if (filelist.isDir()) { - filelist.changeDir(filelist.filename()); - top_file = 0; - ForceCompleteUpdate(); - return; - } - - #if ENABLED(DGUS_PRINT_FILENAME) - // Send print filename - dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); - #endif - - // Setup Confirmation screen - file_to_print = touched_nr; - HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); - } - - void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { - if (!filelist.seek(file_to_print)) return; - ExtUI::printFile(filelist.shortFilename()); - ScreenHandler.GotoScreen( - #if ENABLED(DGUS_LCD_UI_ORIGIN) - DGUSLCD_SCREEN_STATUS - #else - DGUSLCD_SCREEN_SDPRINTMANIPULATION - #endif - ); - } - - void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { - if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. - switch (swap16(*(uint16_t*)val_ptr)) { - case 0: // Resume - if (ExtUI::isPrintingFromMediaPaused()) ExtUI::resumePrint(); - break; - case 1: // Pause - if (!ExtUI::isPrintingFromMediaPaused()) ExtUI::pausePrint(); - break; - case 2: // Abort - ScreenHandler.HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); - break; - } - } - - void DGUSScreenHandler::DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr) { - ExtUI::stopPrint(); - GotoScreen(DGUSLCD_SCREEN_MAIN); - } - - void DGUSScreenHandler::DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr) { - if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. - GotoScreen(DGUSLCD_SCREEN_SDPRINTTUNE); - } - - void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { - uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; - if (target_line > DGUS_SD_FILESPERSCREEN) return; - char tmpfilename[VP_SD_FileName_LEN + 1] = ""; - var.memadr = (void*)tmpfilename; - if (filelist.seek(top_file + target_line)) - snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); - DGUSLCD_SendStringToDisplay(var); - } - - void DGUSScreenHandler::SDCardInserted() { - top_file = 0; - filelist.refresh(); - auto cs = ScreenHandler.getCurrentScreen(); - if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDFILELIST); - } - - void DGUSScreenHandler::SDCardRemoved() { - if (current_screen == DGUSLCD_SCREEN_SDFILELIST - || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) - || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION - ) ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN); - } - - void DGUSScreenHandler::SDCardError() { - DGUSScreenHandler::SDCardRemoved(); - ScreenHandler.sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("SD card error"), nullptr, true, true, true, true); - ScreenHandler.SetupConfirmAction(nullptr); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); - } - -#endif // SDSUPPORT - -void DGUSScreenHandler::ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr) { - DGUS_VP_Variable ramcopy; - if (!populate_VPVar(ConfirmVP, &ramcopy)) return; - if (ramcopy.set_by_display_handler) ramcopy.set_by_display_handler(ramcopy, val_ptr); -} - -const uint16_t* DGUSLCD_FindScreenVPMapList(uint8_t screen) { - const uint16_t *ret; - const struct VPMapping *map = VPMap; - while (ret = (uint16_t*) pgm_read_ptr(&(map->VPList))) { - if (pgm_read_byte(&(map->screen)) == screen) return ret; - map++; - } - return nullptr; -} - -const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp) { - const DGUS_VP_Variable *ret = ListOfVP; - do { - const uint16_t vpcheck = pgm_read_word(&(ret->VP)); - if (vpcheck == 0) break; - if (vpcheck == vp) return ret; - ++ret; - } while (1); - - DEBUG_ECHOLNPAIR("FindVPVar NOT FOUND ", vp); - return nullptr; -} - -void DGUSScreenHandler::ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr) { - if (!ExtUI::isPrinting()) { - ScreenChangeHook(var, val_ptr); - dgusdisplay.RequestScreen(current_screen); - } -} - -void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { - uint8_t *tmp = (uint8_t*)val_ptr; - - // The keycode in target is coded as , so 0x0100A means - // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, - // meaning "return to previous screen" - DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; - - if (target == DGUSLCD_SCREEN_POPUP) { - // special handling for popup is to return to previous menu - if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); - PopToOldScreen(); - return; - } - - UpdateNewScreen(target); - - #ifdef DEBUG_DGUSLCD - if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); - #endif -} - -void DGUSScreenHandler::HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr) { - thermalManager.disable_all_heaters(); - ScreenHandler.ForceCompleteUpdate(); // hint to send all data. -} - -void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t newvalue = swap16(*(uint16_t*)val_ptr); - uint16_t acceptedvalue; - - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_T_E0_Set: - thermalManager.setTargetHotend(newvalue, 0); - acceptedvalue = thermalManager.temp_hotend[0].target; - break; - #endif - #if HOTENDS >= 2 - case VP_T_E1_Set: - thermalManager.setTargetHotend(newvalue, 1); - acceptedvalue = thermalManager.temp_hotend[1].target; - break; - #endif - #if HAS_HEATED_BED - case VP_T_Bed_Set: - thermalManager.setTargetBed(newvalue); - acceptedvalue = thermalManager.temp_bed.target; - break; - #endif - } - - // reply to display the new value to update the view if the new value was rejected by the Thermal Manager. - if (newvalue != acceptedvalue && var.send_to_display_handler) var.send_to_display_handler(var); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel -} - -void DGUSScreenHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr) { - #if EXTRUDERS - uint16_t newvalue = swap16(*(uint16_t*)val_ptr); - uint8_t target_extruder; - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_Flowrate_E0: target_extruder = 0; break; - #endif - #if HOTENDS >= 2 - case VP_Flowrate_E1: target_extruder = 1; break; - #endif - } - - planner.set_flow(target_extruder, newvalue); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - #else - UNUSED(var); UNUSED(val_ptr); - #endif -} - -void DGUSScreenHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleManualExtrude"); - - int16_t movevalue = swap16(*(uint16_t*)val_ptr); - float target = movevalue * 0.01f; - ExtUI::extruder_t target_extruder; - - switch (var.VP) { - #if HOTENDS >= 1 - case VP_MOVE_E0: target_extruder = ExtUI::extruder_t::E0; break; - #endif - #if HOTENDS >= 2 - case VP_MOVE_E1: target_extruder = ExtUI::extruder_t::E1; break; - #endif - default: return; - } - - target += ExtUI::getAxisPosition_mm(target_extruder); - ExtUI::setAxisPosition_mm(target, target_extruder); - skipVP = var.VP; -} - -#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - void DGUSScreenHandler::HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleManualMoveOption"); - *(uint16_t*)var.memadr = swap16(*(uint16_t*)val_ptr); - } -#endif - -void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleManualMove"); - - int16_t movevalue = swap16(*(uint16_t*)val_ptr); - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - if (movevalue) { - const uint16_t choice = *(uint16_t*)var.memadr; - movevalue = movevalue < 0 ? -choice : choice; - } - #endif - char axiscode; - unsigned int speed = 1500; //FIXME: get default feedrate for manual moves, dont hardcode. - - switch (var.VP) { - default: return; - - case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; - break; - - case VP_MOVE_Y: - axiscode = 'Y'; - if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; - break; - - case VP_MOVE_Z: - axiscode = 'Z'; - speed = 300; // default to 5mm/s - if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; - break; - - case VP_HOME_ALL: // only used for homing - axiscode = '\0'; - movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. - break; - } - - if (!movevalue) { - // homing - DEBUG_ECHOPAIR(" homing ", axiscode); - char buf[6] = "G28 X"; - buf[4] = axiscode; - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); - //DEBUG_ECHOLNPGM(" ✓"); - ScreenHandler.ForceCompleteUpdate(); - return; - } - else { - //movement - DEBUG_ECHOPAIR(" move ", axiscode); - bool old_relative_mode = relative_mode; - if (!relative_mode) { - //DEBUG_ECHOPGM(" G91"); - queue.enqueue_now_P(PSTR("G91")); - //DEBUG_ECHOPGM(" ✓ "); - } - char buf[32]; // G1 X9999.99 F12345 - unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); - char sign[]="\0"; - int16_t value = movevalue / 100; - if (movevalue < 0) { value = -value; sign[0] = '-'; } - int16_t fraction = ABS(movevalue) % 100; - snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); - //DEBUG_ECHOLNPGM(" ✓ "); - if (backup_speed != speed) { - snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); - queue.enqueue_one_now(buf); - //DEBUG_ECHOPAIR(" ", buf); - } - //while (!enqueue_and_echo_command(buf)) idle(); - //DEBUG_ECHOLNPGM(" ✓ "); - if (!old_relative_mode) { - //DEBUG_ECHOPGM("G90"); - queue.enqueue_now_P(PSTR("G90")); - //DEBUG_ECHOPGM(" ✓ "); - } - } - - ScreenHandler.ForceCompleteUpdate(); - DEBUG_ECHOLNPGM("manmv done."); - return; - - cannotmove: - DEBUG_ECHOLNPAIR(" cannot move ", axiscode); - return; -} - -void DGUSScreenHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleMotorLockUnlock"); - - char buf[4]; - const int16_t lock = swap16(*(uint16_t*)val_ptr); - strcpy_P(buf, lock ? PSTR("M18") : PSTR("M17")); - - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); -} - -#if ENABLED(POWER_LOSS_RECOVERY) - - void DGUSScreenHandler::HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t value = swap16(*(uint16_t*)val_ptr); - if (value) { - queue.inject_P(PSTR("M1000")); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); - } - else { - recovery.cancel(); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_STATUS); - } - } - -#endif - -void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleSettings"); - uint16_t value = swap16(*(uint16_t*)val_ptr); - switch (value) { - default: break; - case 1: - TERN_(PRINTCOUNTER, print_job_timer.initStats()); - queue.inject_P(PSTR("M502\nM500")); - break; - case 2: queue.inject_P(PSTR("M501")); break; - case 3: queue.inject_P(PSTR("M500")); break; - } -} - -void DGUSScreenHandler::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); - - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); - DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw/10; - ExtUI::axis_t axis; - switch (var.VP) { - case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; - case VP_Y_STEP_PER_MM: axis = ExtUI::axis_t::Y; break; - case VP_Z_STEP_PER_MM: axis = ExtUI::axis_t::Z; break; - default: return; - } - DEBUG_ECHOLNPAIR_F("value:", value); - ExtUI::setAxisSteps_per_mm(value, axis); - DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(axis)); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; -} - -void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged"); - - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); - DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw/10; - ExtUI::extruder_t extruder; - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; - #endif - #if HOTENDS >= 2 - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; - #endif - } - DEBUG_ECHOLNPAIR_F("value:", value); - ExtUI::setAxisSteps_per_mm(value,extruder); - DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(extruder)); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; -} - -#if HAS_PID_HEATING - void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); - DEBUG_ECHOLNPAIR("V1:", rawvalue); - float value = (float)rawvalue / 10; - DEBUG_ECHOLNPAIR("V2:", value); - float newvalue = 0; - - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_PID_P: newvalue = value; break; - case VP_E0_PID_I: newvalue = scalePID_i(value); break; - case VP_E0_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HOTENDS >= 2 - case VP_E1_PID_P: newvalue = value; break; - case VP_E1_PID_I: newvalue = scalePID_i(value); break; - case VP_E1_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HAS_HEATED_BED - case VP_BED_PID_P: newvalue = value; break; - case VP_BED_PID_I: newvalue = scalePID_i(value); break; - case VP_BED_PID_D: newvalue = scalePID_d(value); break; - #endif - } - - DEBUG_ECHOLNPAIR_F("V3:", newvalue); - *(float *)var.memadr = newvalue; - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - } - - void DGUSScreenHandler::HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandlePIDAutotune"); - - char buf[32] = {0}; - - switch (var.VP) { - default: break; - #if ENABLED(PIDTEMP) - #if HOTENDS >= 1 - case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0 - sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E0); - break; - #endif - #if HOTENDS >= 2 - case VP_PID_AUTOTUNE_E1: - sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E1); - break; - #endif - #endif - #if ENABLED(PIDTEMPBED) - case VP_PID_AUTOTUNE_BED: - sprintf(buf, "M303 E-1 C5 S70 U1"); - break; - #endif - } - - if (buf[0]) queue.enqueue_one_now(buf); - - #if ENABLED(DGUS_UI_WAITING) - sendinfoscreen(PSTR("PID is autotuning"), PSTR("please wait"), NUL_STR, NUL_STR, true, true, true, true); - GotoScreen(DGUSLCD_SCREEN_WAITING); - #endif - } -#endif - -#if HAS_BED_PROBE - void DGUSScreenHandler::HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleProbeOffsetZChanged"); - - const float offset = float(int16_t(swap16(*(uint16_t*)val_ptr))) / 100.0f; - ExtUI::setZOffset_mm(offset); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; - } -#endif - -#if ENABLED(BABYSTEPPING) - void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); - - int16_t flag = swap16(*(uint16_t*)val_ptr); - int16_t steps = flag ? -20 : 20; - ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); - ScreenHandler.ForceCompleteUpdate(); - return; - } -#endif - -#if HAS_FAN - void DGUSScreenHandler::HandleFanControl(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleFanControl"); - *(uint8_t*)var.memadr = *(uint8_t*)var.memadr > 0 ? 0 : 255; - } -#endif - -void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleHeaterControl"); - - uint8_t preheat_temp = 0; - switch (var.VP) { - #if HOTENDS >= 1 - case VP_E0_CONTROL: - #endif - #if HOTENDS >= 2 - case VP_E1_CONTROL: - #endif - #if HOTENDS >= 3 - case VP_E2_CONTROL: - #endif - preheat_temp = PREHEAT_1_TEMP_HOTEND; - break; - - case VP_BED_CONTROL: - preheat_temp = PREHEAT_1_TEMP_BED; - break; - } - - *(int16_t*)var.memadr = *(int16_t*)var.memadr > 0 ? 0 : preheat_temp; -} - -#if ENABLED(DGUS_PREHEAT_UI) - - void DGUSScreenHandler::HandlePreheat(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandlePreheat"); - - uint8_t e_temp = 0; - TERN_(HAS_HEATED_BED, uint8_t bed_temp = 0); - const uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); - switch (preheat_option) { - default: - case 0: // Preheat PLA - #if defined(PREHEAT_1_TEMP_HOTEND) && defined(PREHEAT_1_TEMP_BED) - e_temp = PREHEAT_1_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_1_TEMP_BED); - #endif - break; - case 1: // Preheat ABS - #if defined(PREHEAT_2_TEMP_HOTEND) && defined(PREHEAT_2_TEMP_BED) - e_temp = PREHEAT_2_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_2_TEMP_BED); - #endif - break; - case 2: // Preheat PET - #if defined(PREHEAT_3_TEMP_HOTEND) && defined(PREHEAT_3_TEMP_BED) - e_temp = PREHEAT_3_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_3_TEMP_BED); - #endif - break; - case 3: // Preheat FLEX - #if defined(PREHEAT_4_TEMP_HOTEND) && defined(PREHEAT_4_TEMP_BED) - e_temp = PREHEAT_4_TEMP_HOTEND; - TERN_(HAS_HEATED_BED, bed_temp = PREHEAT_4_TEMP_BED); - #endif - break; - case 7: break; // Custom preheat - case 9: break; // Cool down - } - - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 0); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif - #if HOTENDS >= 2 - case VP_E1_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 1); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif - } - - // Go to the preheat screen to show the heating progress - GotoScreen(DGUSLCD_SCREEN_PREHEAT); - } - -#endif - -#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - - typedef struct { - ExtUI::extruder_t extruder; // which extruder to operate - uint8_t action; // load or unload - bool heated; // heating done ? - float purge_length; // the length to extrude before unload, prevent filament jam - } filament_data_t; - - static filament_data_t filament_data; - - void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleFilamentOption"); - - uint8_t e_temp = 0; - filament_data.heated = false; - uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); - if (preheat_option <= 8) // Load filament type - filament_data.action = 1; - else if (preheat_option >= 10) { // Unload filament type - preheat_option -= 10; - filament_data.action = 2; - filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; - } - else // Cancel filament operation - filament_data.action = 0; - - switch (preheat_option) { - case 0: // Load PLA - #ifdef PREHEAT_1_TEMP_HOTEND - e_temp = PREHEAT_1_TEMP_HOTEND; - #endif - break; - case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); - break; - case 2: // Load PET - #ifdef PREHEAT_3_TEMP_HOTEND - e_temp = PREHEAT_3_TEMP_HOTEND; - #endif - break; - case 3: // Load FLEX - #ifdef PREHEAT_4_TEMP_HOTEND - e_temp = PREHEAT_4_TEMP_HOTEND; - #endif - break; - case 9: // Cool down - default: - e_temp = 0; - break; - } - - if (filament_data.action == 0) { // Go back to utility screen - #if HOTENDS >= 1 - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); - #endif - #if HOTENDS >= 2 - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); - #endif - GotoScreen(DGUSLCD_SCREEN_UTILITY); - } - else { // Go to the preheat screen to show the heating progress - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - #if HOTENDS >= 2 - case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - } - GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); - } - } - - void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { - DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); - if (filament_data.action <= 0) return; - - // If we close to the target temperature, we can start load or unload the filament - if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ - thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { - float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; - - if (filament_data.action == 1) { // load filament - if (!filament_data.heated) { - GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); - filament_data.heated = true; - } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder)+movevalue; - } - else { // unload filament - if (!filament_data.heated) { - GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); - filament_data.heated = true; - } - // Before unloading extrude to prevent jamming - if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; - filament_data.purge_length -= movevalue; - } - else - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; - } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); - } - } -#endif - -void DGUSScreenHandler::UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup) { - DEBUG_ECHOLNPAIR("SetNewScreen: ", newscreen); - - if (!popup) { - memmove(&past_screens[1], &past_screens[0], sizeof(past_screens) - 1); - past_screens[0] = current_screen; - } - - current_screen = newscreen; - skipVP = 0; - ForceCompleteUpdate(); -} - -void DGUSScreenHandler::PopToOldScreen() { - DEBUG_ECHOLNPAIR("PopToOldScreen s=", past_screens[0]); - GotoScreen(past_screens[0], true); - memmove(&past_screens[0], &past_screens[1], sizeof(past_screens) - 1); - past_screens[sizeof(past_screens) - 1] = DGUSLCD_SCREEN_MAIN; -} - -void DGUSScreenHandler::UpdateScreenVPData() { - DEBUG_ECHOPAIR(" UpdateScreenVPData Screen: ", current_screen); - - const uint16_t *VPList = DGUSLCD_FindScreenVPMapList(current_screen); - if (!VPList) { - DEBUG_ECHOLNPAIR(" NO SCREEN FOR: ", current_screen); - ScreenComplete = true; - return; // nothing to do, likely a bug or boring screen. - } - - // Round-robin updating of all VPs. - VPList += update_ptr; - - bool sent_one = false; - do { - uint16_t VP = pgm_read_word(VPList); - DEBUG_ECHOPAIR(" VP: ", VP); - if (!VP) { - update_ptr = 0; - DEBUG_ECHOLNPGM(" UpdateScreenVPData done"); - ScreenComplete = true; - return; // Screen completed. - } - - if (VP == skipVP) { skipVP = 0; continue; } - - DGUS_VP_Variable rcpy; - if (populate_VPVar(VP, &rcpy)) { - uint8_t expected_tx = 6 + rcpy.size; // expected overhead is 6 bytes + payload. - // Send the VP to the display, but try to avoid overrunning the Tx Buffer. - // But send at least one VP, to avoid getting stalled. - if (rcpy.send_to_display_handler && (!sent_one || expected_tx <= dgusdisplay.GetFreeTxBuffer())) { - //DEBUG_ECHOPAIR(" calling handler for ", rcpy.VP); - sent_one = true; - rcpy.send_to_display_handler(rcpy); - } - else { - //auto x=dgusdisplay.GetFreeTxBuffer(); - //DEBUG_ECHOLNPAIR(" tx almost full: ", x); - //DEBUG_ECHOPAIR(" update_ptr ", update_ptr); - ScreenComplete = false; - return; // please call again! - } - } - - } while (++update_ptr, ++VPList, true); -} - -void DGUSScreenHandler::GotoScreen(DGUSLCD_Screens screen, bool ispopup) { - dgusdisplay.RequestScreen(screen); - UpdateNewScreen(screen, ispopup); -} - -bool DGUSScreenHandler::loop() { - dgusdisplay.loop(); - - const millis_t ms = millis(); - static millis_t next_event_ms = 0; - - if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { - next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; - UpdateScreenVPData(); - } - - #if ENABLED(SHOW_BOOTSCREEN) - static bool booted = false; - if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) - booted = true; - if (!booted && ELAPSED(ms, BOOTSCREEN_TIMEOUT)) { - booted = true; - GotoScreen(DGUSLCD_SCREEN_MAIN); - } - #endif - return IsScreenComplete(); -} - -void DGUSDisplay::RequestScreen(DGUSLCD_Screens screen) { - DEBUG_ECHOLNPAIR("GotoScreen ", screen); - const unsigned char gotoscreen[] = { 0x5A, 0x01, (unsigned char) (screen >> 8U), (unsigned char) (screen & 0xFFU) }; - WriteVariable(0x84, gotoscreen, sizeof(gotoscreen)); -} - -#endif // HAS_DGUS_LCD diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h deleted file mode 100644 index df738dbfd1..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h +++ /dev/null @@ -1,232 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "DGUSDisplay.h" -#include "DGUSVPVariable.h" - -#include "../../../../inc/MarlinConfig.h" - -enum DGUSLCD_Screens : uint8_t; - -class DGUSScreenHandler { -public: - DGUSScreenHandler() = default; - - static bool loop(); - - /// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen - /// The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - - /// "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); - /// The same for messages from Flash - static void setstatusmessagePGM(PGM_P const msg); - // Callback for VP "Display wants to change screen on idle printer" - static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); - // Callback for VP "Screen has been changed" - static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); - // Callback for VP "All Heaters Off" - static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); - // Hook for "Change this temperature" - static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); - // Hook for "Change Flowrate" - static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - // Hook for manual move option - static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for manual move. - static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); - // Hook for manual extrude. - static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); - // Hook for motor lock and unlook - static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(POWER_LOSS_RECOVERY) - // Hook for power loss recovery. - static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for settings - static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); - static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); - static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); - #if HAS_PID_HEATING - // Hook for "Change this temperature PID para" - static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); - // Hook for PID autotune - static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if HAS_BED_PROBE - // Hook for "Change probe offset z" - static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if ENABLED(BABYSTEPPING) - // Hook for live z adjust action - static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if HAS_FAN - // Hook for fan control - static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for heater control - static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(DGUS_PREHEAT_UI) - // Hook for preheat - static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - // Hook for filament load and unload filament option - static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); - // Hook for filament load and unload - static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); - #endif - - #if ENABLED(SDSUPPORT) - // Callback for VP "Display wants to change screen when there is a SD card" - static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); - /// Scroll buttons on the file listing screen. - static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); - /// File touched. - static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); - /// start print after confirmation received. - static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); - /// User hit the pause, resume or abort button. - static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); - /// User confirmed the abort action - static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); - /// User hit the tune button - static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); - /// Send a single filename to the display. - static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); - /// Marlin informed us that a new SD has been inserted. - static void SDCardInserted(); - /// Marlin informed us that the SD Card has been removed(). - static void SDCardRemoved(); - /// Marlin informed us about a bad SD Card. - static void SDCardError(); - #endif - - // OK Button the Confirm screen. - static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); - - // Update data after went to new screen (by display or by GotoScreen) - // remember: store the last-displayed screen, so it can get returned to. - // (e.g for pop up messages) - static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); - - // Recall the remembered screen. - static void PopToOldScreen(); - - // Make the display show the screen and update all VPs in it. - static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); - - static void UpdateScreenVPData(); - - // Helpers to convert and transfer data to the display. - static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); - static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); - static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); - #if ENABLED(PRINTCOUNTER) - static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); - #endif - #if HAS_FAN - static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); - #endif - static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); - #if ENABLED(DGUS_UI_WAITING) - static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); - #endif - - /// Send a value from 0..100 to a variable with a range from 0..255 - static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); - - template - static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { - if (!var.memadr) return; - union { unsigned char tmp[sizeof(T)]; T t; } x; - unsigned char *ptr = (unsigned char*)val_ptr; - LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; - *(T*)var.memadr = x.t; - } - - /// Send a float value to the display. - /// Display will get a 4-byte integer scaled to the number of digits: - /// Tell the display the number of digits and it cheats by displaying a dot between... - template - static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - float f = *(float *)var.memadr; - f *= cpow(10, decimals); - dgusdisplay.WriteVariable(var.VP, (long)f); - } - } - - /// Send a float value to the display. - /// Display will get a 2-byte integer scaled to the number of digits: - /// Tell the display the number of digits and it cheats by displaying a dot between... - template - static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - float f = *(float *)var.memadr; - DEBUG_ECHOLNPAIR_F(" >> ", f, 6); - f *= cpow(10, decimals); - dgusdisplay.WriteVariable(var.VP, (int16_t)f); - } - } - - /// Force an update of all VP on the current screen. - static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } - /// Has all VPs sent to the screen - static inline bool IsScreenComplete() { return ScreenComplete; } - - static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } - - static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } - -private: - static DGUSLCD_Screens current_screen; ///< currently on screen - static constexpr uint8_t NUM_PAST_SCREENS = 4; - static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; ///< LIFO with past screens for the "back" button. - - static uint8_t update_ptr; ///< Last sent entry in the VPList for the actual screen. - static uint16_t skipVP; ///< When updating the screen data, skip this one, because the user is interacting with it. - static bool ScreenComplete; ///< All VPs sent to screen? - - static uint16_t ConfirmVP; ///< context for confirm screen (VP that will be emulated-sent on "OK"). - - #if ENABLED(SDSUPPORT) - static int16_t top_file; ///< file on top of file chooser - static int16_t file_to_print; ///< touched file to be confirmed - #endif - - static void (*confirm_action_cb)(); -}; - -extern DGUSScreenHandler ScreenHandler; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h b/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h deleted file mode 100644 index 8c193c7c1e..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -/** - * DGUSVPVariable.h - * - * Created on: Feb 9, 2019 - * Author: tobi - */ - -struct DGUS_VP_Variable { - uint16_t VP; - void* memadr; // If nullptr, the value cannot be uploaded to the display. - uint8_t size; - - // Callback that will be called if the display modified the value. - // nullptr makes it readonly for the display. - void (*set_by_display_handler)(DGUS_VP_Variable &var, void *val_ptr); - void (*send_to_display_handler)(DGUS_VP_Variable &var); - - template - DGUS_VP_Variable& operator =(T &o) { - *(T*)memadr = o; // warning this is not typesafe. - // TODO: Call out the display or mark as dirty for the next update. - return *this; - } -}; diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp deleted file mode 100644 index 3beed892e3..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp +++ /dev/null @@ -1,486 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* DGUS VPs changed by George Fu in 2019 for Marlin */ - -#include "../../../../../inc/MarlinConfigPre.h" - -#if ENABLED(DGUS_LCD_UI_FYSETC) - -#include "../DGUSDisplayDef.h" -#include "../DGUSDisplay.h" -#include "../DGUSScreenHandler.h" - -#include "../../../../../module/temperature.h" -#include "../../../../../module/motion.h" -#include "../../../../../module/planner.h" - -#include "../../../ui_api.h" -#include "../../../../ultralcd.h" - -#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - uint16_t distanceToMove = 10; -#endif - -const uint16_t VPList_Boot[] PROGMEM = { - VP_MARLIN_VERSION, - 0x0000 -}; - -const uint16_t VPList_Main[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded. */ - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, VP_E0_STATUS, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, VP_BED_STATUS, - #endif - #if HAS_FAN - VP_Fan0_Percentage, VP_FAN0_STATUS, - #endif - VP_XPos, VP_YPos, VP_ZPos, - VP_Fan0_Percentage, - VP_Feedrate_Percentage, - #if ENABLED(LCD_SET_PROGRESS_MANUALLY) - VP_PrintProgress_Percentage, - #endif - 0x0000 -}; - -const uint16_t VPList_Temp[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - 0x0000 -}; - -const uint16_t VPList_Status[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded */ - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - #if HAS_FAN - VP_Fan0_Percentage, - #endif - VP_XPos, VP_YPos, VP_ZPos, - VP_Fan0_Percentage, - VP_Feedrate_Percentage, - VP_PrintProgress_Percentage, - 0x0000 -}; - -const uint16_t VPList_Status2[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded */ - #if HOTENDS >= 1 - VP_Flowrate_E0, - #endif - #if HOTENDS >= 2 - VP_Flowrate_E1, - #endif - VP_PrintProgress_Percentage, - VP_PrintTime, - 0x0000 -}; - -const uint16_t VPList_Preheat[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - 0x0000 -}; - -const uint16_t VPList_ManualMove[] PROGMEM = { - VP_XPos, VP_YPos, VP_ZPos, - 0x0000 -}; - -const uint16_t VPList_ManualExtrude[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - VP_EPos, - 0x0000 -}; - -const uint16_t VPList_FanAndFeedrate[] PROGMEM = { - VP_Feedrate_Percentage, VP_Fan0_Percentage, - 0x0000 -}; - -const uint16_t VPList_SD_FlowRates[] PROGMEM = { - VP_Flowrate_E0, VP_Flowrate_E1, - 0x0000 -}; - -const uint16_t VPList_Filament_heating[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - VP_E0_FILAMENT_LOAD_UNLOAD, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - VP_E1_FILAMENT_LOAD_UNLOAD, - #endif - 0x0000 -}; - -const uint16_t VPList_Filament_load_unload[] PROGMEM = { - #if HOTENDS >= 1 - VP_E0_FILAMENT_LOAD_UNLOAD, - #endif - #if HOTENDS >= 2 - VP_E1_FILAMENT_LOAD_UNLOAD, - #endif - 0x0000 -}; - -const uint16_t VPList_SDFileList[] PROGMEM = { - VP_SD_FileName0, VP_SD_FileName1, VP_SD_FileName2, VP_SD_FileName3, VP_SD_FileName4, - 0x0000 -}; - -const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { - VP_PrintProgress_Percentage, VP_PrintTime, - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - #if HAS_FAN - VP_Fan0_Percentage, - #if FAN_COUNT > 1 - VP_Fan1_Percentage, - #endif - #endif - VP_Flowrate_E0, - 0x0000 -}; - -const uint16_t VPList_SDPrintTune[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, VP_Flowrate_E0, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, VP_Flowrate_E1, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - VP_Feedrate_Percentage, - VP_SD_Print_ProbeOffsetZ, - 0x0000 -}; - -const uint16_t VPList_StepPerMM[] PROGMEM = { - VP_X_STEP_PER_MM, - VP_Y_STEP_PER_MM, - VP_Z_STEP_PER_MM, - #if HOTENDS >= 1 - VP_E0_STEP_PER_MM, - #endif - #if HOTENDS >= 2 - VP_E1_STEP_PER_MM, - #endif - 0x0000 -}; - -const uint16_t VPList_PIDE0[] PROGMEM = { - #if ENABLED(PIDTEMP) - VP_E0_PID_P, - VP_E0_PID_I, - VP_E0_PID_D, - #endif - 0x0000 -}; - -const uint16_t VPList_PIDBED[] PROGMEM = { - #if ENABLED(PIDTEMP) - VP_BED_PID_P, - VP_BED_PID_I, - VP_BED_PID_D, - #endif - 0x0000 -}; - -const uint16_t VPList_Infos[] PROGMEM = { - VP_MARLIN_VERSION, - VP_PrintTime, - #if ENABLED(PRINTCOUNTER) - VP_PrintAccTime, - VP_PrintsTotal, - #endif - 0x0000 -}; - -const uint16_t VPList_PIDTuningWaiting[] PROGMEM = { - VP_WAITING_STATUS, - 0x0000 -}; - -const uint16_t VPList_FLCPreheat[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - 0x0000 -}; - -const uint16_t VPList_FLCPrinting[] PROGMEM = { - #if HOTENDS >= 1 - VP_SD_Print_ProbeOffsetZ, - #endif - 0x0000 -}; - -const uint16_t VPList_Z_Offset[] PROGMEM = { - #if HOTENDS >= 1 - VP_SD_Print_ProbeOffsetZ, - #endif - 0x0000 -}; - -const struct VPMapping VPMap[] PROGMEM = { - { DGUSLCD_SCREEN_BOOT, VPList_Boot }, - { DGUSLCD_SCREEN_MAIN, VPList_Main }, - { DGUSLCD_SCREEN_TEMPERATURE, VPList_Temp }, - { DGUSLCD_SCREEN_STATUS, VPList_Status }, - { DGUSLCD_SCREEN_STATUS2, VPList_Status2 }, - { DGUSLCD_SCREEN_PREHEAT, VPList_Preheat }, - { DGUSLCD_SCREEN_MANUALMOVE, VPList_ManualMove }, - { DGUSLCD_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, - { DGUSLCD_SCREEN_FILAMENT_HEATING, VPList_Filament_heating }, - { DGUSLCD_SCREEN_FILAMENT_LOADING, VPList_Filament_load_unload }, - { DGUSLCD_SCREEN_FILAMENT_UNLOADING, VPList_Filament_load_unload }, - { DGUSLCD_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, - { DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList }, - { DGUSLCD_SCREEN_SDPRINTTUNE, VPList_SDPrintTune }, - { DGUSLCD_SCREEN_WAITING, VPList_PIDTuningWaiting }, - { DGUSLCD_SCREEN_FLC_PREHEAT, VPList_FLCPreheat }, - { DGUSLCD_SCREEN_FLC_PRINTING, VPList_FLCPrinting }, - { DGUSLCD_SCREEN_Z_OFFSET, VPList_Z_Offset }, - { DGUSLCD_SCREEN_STEPPERMM, VPList_StepPerMM }, - { DGUSLCD_SCREEN_PID_E, VPList_PIDE0 }, - { DGUSLCD_SCREEN_PID_BED, VPList_PIDBED }, - { DGUSLCD_SCREEN_INFOS, VPList_Infos }, - { 0 , nullptr } // List is terminated with an nullptr as table entry. -}; - -const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; - -// Helper to define a DGUS_VP_Variable for common use cases. -#define VPHELPER(VPADR, VPADRVAR, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=sizeof(VPADRVAR), \ - .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } - -// Helper to define a DGUS_VP_Variable when the sizeo of the var cannot be determined automaticalyl (eg. a string) -#define VPHELPER_STR(VPADR, VPADRVAR, STRLEN, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=STRLEN, \ - .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } - -const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { - // Helper to detect touch events - VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), - VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), - #if ENABLED(SDSUPPORT) - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), - #endif - VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), - - VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_OPTION, &distanceToMove, &ScreenHandler.HandleManualMoveOption, nullptr), - #endif - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_X, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - #else - VPHELPER(VP_MOVE_X, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, nullptr, &ScreenHandler.HandleManualMove, nullptr), - #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleMotorLockUnlock, nullptr), - #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), - #endif - VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), - #if ENABLED(SINGLE_Z_CALIBRATION) - VPHELPER(VP_Z_CALIBRATE, nullptr, &ScreenHandler.HandleZCalibration, nullptr), - #endif - - #if ENABLED(FIRST_LAYER_CAL) - VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &ScreenHandler.HandleFirstLayerCal, nullptr), - #endif - - { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr - { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplay }, - - // Temperature Data - #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_MOVE_E0, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), - VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &ScreenHandler.HandleHeaterControl, nullptr), - VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), - #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, &ScreenHandler.HandlePreheat, nullptr), - #endif - #if ENABLED(PIDTEMP) - VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), - #endif - #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), - #endif - #endif - #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), - VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &ScreenHandler.HandleHeaterControl, nullptr), - VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), - #if ENABLED(PIDTEMP) - VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), - #endif - VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), - #endif - #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), - VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), - #if ENABLED(PIDTEMPBED) - VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), - #endif - #endif - - // Fan Data - #if HAS_FAN - #define FAN_VPHELPER(N) \ - VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_PercentageToUint8, &ScreenHandler.DGUSLCD_SendPercentageToDisplay), \ - VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &ScreenHandler.HandleFanControl, nullptr), \ - VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &ScreenHandler.DGUSLCD_SendFanStatusToDisplay), - REPEAT(FAN_COUNT, FAN_VPHELPER) - #endif - - // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay ), - - // Position Data - VPHELPER(VP_XPos, ¤t_position.x, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_YPos, ¤t_position.y, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - - // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay ), - - // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay), - #if ENABLED(PRINTCOUNTER) - VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintAccTimeToDisplay), - VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintsTotalToDisplay), - #endif - - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #if HOTENDS >= 1 - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #endif - #if HOTENDS >= 2 - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #endif - - // SDCard File listing. - #if ENABLED(SDSUPPORT) - VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), - VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), - VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), - VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), - VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), - VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), - VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), - VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), - VPHELPER(VP_SD_ResumePauseAbort, nullptr, ScreenHandler.DGUSLCD_SD_ResumePauseAbort, nullptr), - VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), - VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), - #if HAS_BED_PROBE - VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, ScreenHandler.HandleProbeOffsetZChanged, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), - #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), - #endif - #endif - #endif - - #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), - #endif - - // Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content. - { .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - - VPHELPER(0, 0, 0, 0) // must be last entry. -}; - -#endif // DGUS_LCD_UI_FYSETC diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h deleted file mode 100644 index f6a65fe8a0..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h +++ /dev/null @@ -1,294 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -enum DGUSLCD_Screens : uint8_t { - DGUSLCD_SCREEN_BOOT = 0, - DGUSLCD_SCREEN_MAIN = 1, - DGUSLCD_SCREEN_STATUS = 1, - DGUSLCD_SCREEN_STATUS2 = 1, - DGUSLCD_SCREEN_TEMPERATURE = 10, - DGUSLCD_SCREEN_PREHEAT = 18, - DGUSLCD_SCREEN_POWER_LOSS = 100, - DGUSLCD_SCREEN_MANUALMOVE = 192, - DGUSLCD_SCREEN_UTILITY = 120, - DGUSLCD_SCREEN_FILAMENT_HEATING = 146, - DGUSLCD_SCREEN_FILAMENT_LOADING = 148, - DGUSLCD_SCREEN_FILAMENT_UNLOADING = 158, - DGUSLCD_SCREEN_MANUALEXTRUDE = 160, - DGUSLCD_SCREEN_SDFILELIST = 71, - DGUSLCD_SCREEN_SDPRINTMANIPULATION = 73, - DGUSLCD_SCREEN_SDPRINTTUNE = 75, - DGUSLCD_SCREEN_FLC_PREHEAT = 94, - DGUSLCD_SCREEN_FLC_PRINTING = 96, - DGUSLCD_SCREEN_STEPPERMM = 212, - DGUSLCD_SCREEN_PID_E = 214, - DGUSLCD_SCREEN_PID_BED = 218, - DGUSLCD_SCREEN_Z_OFFSET = 222, - DGUSLCD_SCREEN_INFOS = 36, - DGUSLCD_SCREEN_CONFIRM = 240, - DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") - DGUSLCD_SCREEN_WAITING = 251, - DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" - DGUSLDC_SCREEN_UNUSED = 255 -}; - -// Display Memory layout used (T5UID) -// Except system variables this is arbitrary, just to organize stuff.... - -// 0x0000 .. 0x0FFF -- System variables and reserved by the display -// 0x1000 .. 0x1FFF -- Variables to never change location, regardless of UI Version -// 0x2000 .. 0x2FFF -- Controls (VPs that will trigger some action) -// 0x3000 .. 0x4FFF -- Marlin Data to be displayed -// 0x5000 .. -- SPs (if we want to modify display elements, e.g change color or like) -- currently unused - -// As there is plenty of space (at least most displays have >8k RAM), we do not pack them too tight, -// so that we can keep variables nicely together in the address space. - -// UI Version always on 0x1000...0x1002 so that the firmware can check this and bail out. -constexpr uint16_t VP_UI_VERSION_MAJOR = 0x1000; // Major -- incremented when incompatible -constexpr uint16_t VP_UI_VERSION_MINOR = 0x1001; // Minor -- incremented on new features, but compatible -constexpr uint16_t VP_UI_VERSION_PATCH = 0x1002; // Patch -- fixed which do not change functionality. -constexpr uint16_t VP_UI_FLAVOUR = 0x1010; // lets reserve 16 bytes here to determine if UI is suitable for this Marlin. tbd. - -// Storage space for the Killscreen messages. 0x1100 - 0x1200 . Reused for the popup. -constexpr uint16_t VP_MSGSTR1 = 0x1100; -constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... -constexpr uint16_t VP_MSGSTR2 = 0x1140; -constexpr uint8_t VP_MSGSTR2_LEN = 0x20; -constexpr uint16_t VP_MSGSTR3 = 0x1180; -constexpr uint8_t VP_MSGSTR3_LEN = 0x20; -constexpr uint16_t VP_MSGSTR4 = 0x11C0; -constexpr uint8_t VP_MSGSTR4_LEN = 0x20; - -// Screenchange request for screens that only make sense when printer is idle. -// e.g movement is only allowed if printer is not printing. -// Marlin must confirm by setting the screen manually. -constexpr uint16_t VP_SCREENCHANGE_ASK = 0x2000; -constexpr uint16_t VP_SCREENCHANGE = 0x2001; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. -constexpr uint16_t VP_TEMP_ALL_OFF = 0x2002; // Turn all heaters off. Value arbitrary ;)= -constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x2003; // "Print" Button touched -- go only there if there is an SD Card. - -constexpr uint16_t VP_CONFIRMED = 0x2010; // OK on confirm screen. - -// Buttons on the SD-Card File listing. -constexpr uint16_t VP_SD_ScrollEvent = 0x2020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down -constexpr uint16_t VP_SD_FileSelected = 0x2022; // Number of file field selected. -constexpr uint16_t VP_SD_FileSelectConfirm = 0x2024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) - -constexpr uint16_t VP_SD_ResumePauseAbort = 0x2026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints -constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x2028; // Abort print confirmation (virtual, will be injected by the confirm dialog) -constexpr uint16_t VP_SD_Print_Setting = 0x2040; -constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x2050; // Data: 0 down, 1 up - -// Controls for movement (we can't use the incremental / decremental feature of the display at this feature works only with 16 bit values -// (which would limit us to 655.35mm, which is likely not a problem for common setups, but i don't want to rule out hangprinters support) -// A word about the coding: The VP will be per axis and the return code will be an signed 16 bit value in 0.01 mm resolution, telling us -// the relative travel amount t he user wants to do. So eg. if the display sends us VP=2100 with value 100, the user wants us to move X by +1 mm. -constexpr uint16_t VP_MOVE_X = 0x2100; -constexpr uint16_t VP_MOVE_Y = 0x2102; -constexpr uint16_t VP_MOVE_Z = 0x2104; -constexpr uint16_t VP_MOVE_E0 = 0x2110; -constexpr uint16_t VP_MOVE_E1 = 0x2112; -//constexpr uint16_t VP_MOVE_E2 = 0x2114; -//constexpr uint16_t VP_MOVE_E3 = 0x2116; -//constexpr uint16_t VP_MOVE_E4 = 0x2118; -//constexpr uint16_t VP_MOVE_E5 = 0x211A; -constexpr uint16_t VP_HOME_ALL = 0x2120; -constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; - -// Power loss recovery -constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; - -// Fan Control Buttons , switch between "off" and "on" -constexpr uint16_t VP_FAN0_CONTROL = 0x2200; -constexpr uint16_t VP_FAN1_CONTROL = 0x2202; -constexpr uint16_t VP_FAN2_CONTROL = 0x2204; -constexpr uint16_t VP_FAN3_CONTROL = 0x2206; - -// Heater Control Buttons , triged between "cool down" and "heat PLA" state -constexpr uint16_t VP_E0_CONTROL = 0x2210; -constexpr uint16_t VP_E1_CONTROL = 0x2212; -//constexpr uint16_t VP_E2_CONTROL = 0x2214; -//constexpr uint16_t VP_E3_CONTROL = 0x2216; -//constexpr uint16_t VP_E4_CONTROL = 0x2218; -//constexpr uint16_t VP_E5_CONTROL = 0x221A; -constexpr uint16_t VP_BED_CONTROL = 0x221C; - -// Preheat -constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; -constexpr uint16_t VP_E1_BED_PREHEAT = 0x2222; -//constexpr uint16_t VP_E2_BED_PREHEAT = 0x2224; -//constexpr uint16_t VP_E3_BED_PREHEAT = 0x2226; -//constexpr uint16_t VP_E4_BED_PREHEAT = 0x2228; -//constexpr uint16_t VP_E5_BED_PREHEAT = 0x222A; - -// Filament load and unload -constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; -constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; - -// Settings store , reset -constexpr uint16_t VP_SETTINGS = 0x2400; - -// PID autotune -constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x2410; -constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x2412; -//constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x2414; -//constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x2416; -//constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x2418; -//constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x241A; -constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x2420; - -// Calibrate Z -constexpr uint16_t VP_Z_CALIBRATE = 0x2430; - -// First layer cal -constexpr uint16_t VP_Z_FIRST_LAYER_CAL = 0x2500; // Data: 0 - Cancel first layer cal progress, >0 filament type have loaded - -// Firmware version on the boot screen. -constexpr uint16_t VP_MARLIN_VERSION = 0x3000; -constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. - -// Place for status messages. -constexpr uint16_t VP_M117 = 0x3020; -constexpr uint8_t VP_M117_LEN = 0x20; - -// Temperatures. -constexpr uint16_t VP_T_E0_Is = 0x3060; // 4 Byte Integer -constexpr uint16_t VP_T_E0_Set = 0x3062; // 2 Byte Integer -constexpr uint16_t VP_T_E1_Is = 0x3064; // 4 Byte Integer - -// reserved to support up to 6 Extruders: -constexpr uint16_t VP_T_E1_Set = 0x3066; // 2 Byte Integer -//constexpr uint16_t VP_T_E2_Is = 0x3068; // 4 Byte Integer -//constexpr uint16_t VP_T_E2_Set = 0x306A; // 2 Byte Integer -//constexpr uint16_t VP_T_E3_Is = 0x306C; // 4 Byte Integer -//constexpr uint16_t VP_T_E3_Set = 0x306E; // 2 Byte Integer -//constexpr uint16_t VP_T_E4_Is = 0x3070; // 4 Byte Integer -//constexpr uint16_t VP_T_E4_Set = 0x3072; // 2 Byte Integer -//constexpr uint16_t VP_T_E4_Is = 0x3074; // 4 Byte Integer -//constexpr uint16_t VP_T_E4_Set = 0x3076; // 2 Byte Integer -//constexpr uint16_t VP_T_E5_Is = 0x3078; // 4 Byte Integer -//constexpr uint16_t VP_T_E5_Set = 0x307A; // 2 Byte Integer - -constexpr uint16_t VP_T_Bed_Is = 0x3080; // 4 Byte Integer -constexpr uint16_t VP_T_Bed_Set = 0x3082; // 2 Byte Integer - -constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer -constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer - -// reserved for up to 6 Extruders: -//constexpr uint16_t VP_Flowrate_E2 = 0x3094; -//constexpr uint16_t VP_Flowrate_E3 = 0x3096; -//constexpr uint16_t VP_Flowrate_E4 = 0x3098; -//constexpr uint16_t VP_Flowrate_E5 = 0x309A; - -constexpr uint16_t VP_Fan0_Percentage = 0x3100; // 2 Byte Integer (0..100) -constexpr uint16_t VP_Fan1_Percentage = 0x3102; // 2 Byte Integer (0..100) -constexpr uint16_t VP_Fan2_Percentage = 0x3104; // 2 Byte Integer (0..100) -constexpr uint16_t VP_Fan3_Percentage = 0x3106; // 2 Byte Integer (0..100) -constexpr uint16_t VP_Feedrate_Percentage = 0x3108; // 2 Byte Integer (0..100) - -// Actual Position -constexpr uint16_t VP_XPos = 0x3110; // 4 Byte Fixed point number; format xxx.yy -constexpr uint16_t VP_YPos = 0x3112; // 4 Byte Fixed point number; format xxx.yy -constexpr uint16_t VP_ZPos = 0x3114; // 4 Byte Fixed point number; format xxx.yy - -constexpr uint16_t VP_EPos = 0x3120; // 4 Byte Fixed point number; format xxx.yy - -constexpr uint16_t VP_PrintProgress_Percentage = 0x3130; // 2 Byte Integer (0..100) - -constexpr uint16_t VP_PrintTime = 0x3140; -constexpr uint16_t VP_PrintTime_LEN = 32; - -constexpr uint16_t VP_PrintAccTime = 0x3160; -constexpr uint16_t VP_PrintAccTime_LEN = 32; - -constexpr uint16_t VP_PrintsTotal = 0x3180; -constexpr uint16_t VP_PrintsTotal_LEN = 16; - -// SDCard File Listing -constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. -constexpr uint16_t DGUS_SD_FILESPERSCREEN = 5; // FIXME move that info to the display and read it from there. -constexpr uint16_t VP_SD_FileName0 = 0x3200; -constexpr uint16_t VP_SD_FileName1 = 0x3220; -constexpr uint16_t VP_SD_FileName2 = 0x3240; -constexpr uint16_t VP_SD_FileName3 = 0x3260; -constexpr uint16_t VP_SD_FileName4 = 0x3280; - -constexpr uint16_t VP_SD_Print_ProbeOffsetZ = 0x32A0; // -constexpr uint16_t VP_SD_Print_Filename = 0x32C0; - -// Fan status -constexpr uint16_t VP_FAN0_STATUS = 0x3300; -constexpr uint16_t VP_FAN1_STATUS = 0x3302; -constexpr uint16_t VP_FAN2_STATUS = 0x3304; -constexpr uint16_t VP_FAN3_STATUS = 0x3306; - -// Heater status -constexpr uint16_t VP_E0_STATUS = 0x3310; -constexpr uint16_t VP_E1_STATUS = 0x3312; -//constexpr uint16_t VP_E2_STATUS = 0x3314; -//constexpr uint16_t VP_E3_STATUS = 0x3316; -//constexpr uint16_t VP_E4_STATUS = 0x3318; -//constexpr uint16_t VP_E5_STATUS = 0x331A; -constexpr uint16_t VP_BED_STATUS = 0x331C; - -constexpr uint16_t VP_MOVE_OPTION = 0x3400; - -// Step per mm -constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , 2 byte unsigned int , 0~1638.4 -//constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; -constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; -//constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; -constexpr uint16_t VP_Z_STEP_PER_MM = 0x3608; -//constexpr uint16_t VP_Z2_STEP_PER_MM = 0x360A; -constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; -constexpr uint16_t VP_E1_STEP_PER_MM = 0x3612; -//constexpr uint16_t VP_E2_STEP_PER_MM = 0x3614; -//constexpr uint16_t VP_E3_STEP_PER_MM = 0x3616; -//constexpr uint16_t VP_E4_STEP_PER_MM = 0x3618; -//constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; - -// PIDs -constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 -constexpr uint16_t VP_E0_PID_I = 0x3702; -constexpr uint16_t VP_E0_PID_D = 0x3704; -constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , 2 byte unsigned int , 0~1638.4 -constexpr uint16_t VP_E1_PID_I = 0x3708; -constexpr uint16_t VP_E1_PID_D = 0x370A; -constexpr uint16_t VP_BED_PID_P = 0x3710; -constexpr uint16_t VP_BED_PID_I = 0x3712; -constexpr uint16_t VP_BED_PID_D = 0x3714; - -// Wating screen status -constexpr uint16_t VP_WAITING_STATUS = 0x3800; - -// SPs for certain variables... -// located at 0x5000 and up -// Not used yet! -// This can be used e.g to make controls / data display invisible -constexpr uint16_t SP_T_E0_Is = 0x5000; -constexpr uint16_t SP_T_E0_Set = 0x5010; -constexpr uint16_t SP_T_E1_Is = 0x5020; -constexpr uint16_t SP_T_Bed_Is = 0x5030; -constexpr uint16_t SP_T_Bed_Set = 0x5040; diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp deleted file mode 100644 index 82c06d7a4a..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp +++ /dev/null @@ -1,485 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* DGUS VPs changed by George Fu in 2019 for Marlin */ - -#include "../../../../../inc/MarlinConfigPre.h" - -#if ENABLED(DGUS_LCD_UI_HIPRECY) - -#include "../DGUSDisplayDef.h" -#include "../DGUSDisplay.h" -#include "../DGUSScreenHandler.h" - -#include "../../../../../module/temperature.h" -#include "../../../../../module/motion.h" -#include "../../../../../module/planner.h" - -#include "../../../ui_api.h" -#include "../../../../ultralcd.h" - -#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - uint16_t distanceToMove = 10; -#endif - -const uint16_t VPList_Boot[] PROGMEM = { - VP_MARLIN_VERSION, - 0x0000 -}; - -const uint16_t VPList_Main[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded. */ - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, VP_E0_STATUS, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, VP_BED_STATUS, - #endif - #if HAS_FAN - VP_Fan0_Percentage, VP_FAN0_STATUS, - #endif - VP_XPos, VP_YPos, VP_ZPos, - VP_Fan0_Percentage, - VP_Feedrate_Percentage, - #if ENABLED(LCD_SET_PROGRESS_MANUALLY) - VP_PrintProgress_Percentage, - #endif - 0x0000 -}; - -const uint16_t VPList_Temp[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - 0x0000 -}; - -const uint16_t VPList_Status[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded */ - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - #if HAS_FAN - VP_Fan0_Percentage, - #endif - VP_XPos, VP_YPos, VP_ZPos, - VP_Fan0_Percentage, - VP_Feedrate_Percentage, - VP_PrintProgress_Percentage, - 0x0000 -}; - -const uint16_t VPList_Status2[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded */ - #if HOTENDS >= 1 - VP_Flowrate_E0, - #endif - #if HOTENDS >= 2 - VP_Flowrate_E1, - #endif - VP_PrintProgress_Percentage, - VP_PrintTime, - 0x0000 -}; - -const uint16_t VPList_Preheat[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - 0x0000 -}; - -const uint16_t VPList_ManualMove[] PROGMEM = { - VP_XPos, VP_YPos, VP_ZPos, - 0x0000 -}; - -const uint16_t VPList_ManualExtrude[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - VP_EPos, - 0x0000 -}; - -const uint16_t VPList_FanAndFeedrate[] PROGMEM = { - VP_Feedrate_Percentage, VP_Fan0_Percentage, - 0x0000 -}; - -const uint16_t VPList_SD_FlowRates[] PROGMEM = { - VP_Flowrate_E0, VP_Flowrate_E1, - 0x0000 -}; - -const uint16_t VPList_Filament_heating[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - VP_E0_FILAMENT_LOAD_UNLOAD, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - 0x0000 -}; - -const uint16_t VPList_Filament_load_unload[] PROGMEM = { - #if HOTENDS >= 1 - VP_E0_FILAMENT_LOAD_UNLOAD, - #endif - #if HOTENDS >= 2 - VP_E1_FILAMENT_LOAD_UNLOAD, - #endif - 0x0000 -}; - -const uint16_t VPList_SDFileList[] PROGMEM = { - VP_SD_FileName0, VP_SD_FileName1, VP_SD_FileName2, VP_SD_FileName3, VP_SD_FileName4, - 0x0000 -}; - -const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { - VP_PrintProgress_Percentage, VP_PrintTime, - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - #if HAS_FAN - VP_Fan0_Percentage, - #if FAN_COUNT > 1 - VP_Fan1_Percentage, - #endif - #endif - VP_Flowrate_E0, - 0x0000 -}; - -const uint16_t VPList_SDPrintTune[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - VP_Feedrate_Percentage, - #if HAS_FAN - VP_Fan0_Percentage, - #endif - VP_Flowrate_E0, - VP_SD_Print_ProbeOffsetZ, - 0x0000 -}; - -const uint16_t VPList_StepPerMM[] PROGMEM = { - VP_X_STEP_PER_MM, - VP_Y_STEP_PER_MM, - VP_Z_STEP_PER_MM, - #if HOTENDS >= 1 - VP_E0_STEP_PER_MM, - #endif - #if HOTENDS >= 2 - VP_E1_STEP_PER_MM, - #endif - 0x0000 -}; - -const uint16_t VPList_PIDE0[] PROGMEM = { - #if ENABLED(PIDTEMP) - VP_E0_PID_P, - VP_E0_PID_I, - VP_E0_PID_D, - #endif - 0x0000 -}; - -const uint16_t VPList_PIDBED[] PROGMEM = { - #if ENABLED(PIDTEMP) - VP_BED_PID_P, - VP_BED_PID_I, - VP_BED_PID_D, - #endif - 0x0000 -}; - -const uint16_t VPList_Infos[] PROGMEM = { - VP_MARLIN_VERSION, - VP_PrintTime, - #if ENABLED(PRINTCOUNTER) - VP_PrintAccTime, - VP_PrintsTotal, - #endif - 0x0000 -}; - -const uint16_t VPList_PIDTuningWaiting[] PROGMEM = { - VP_WAITING_STATUS, - 0x0000 -}; - -const uint16_t VPList_FLCPreheat[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - 0x0000 -}; - -const uint16_t VPList_FLCPrinting[] PROGMEM = { - #if HOTENDS >= 1 - VP_SD_Print_ProbeOffsetZ, - #endif - 0x0000 -}; - -const uint16_t VPList_Z_Offset[] PROGMEM = { - #if HOTENDS >= 1 - VP_SD_Print_ProbeOffsetZ, - #endif - 0x0000 -}; - -const struct VPMapping VPMap[] PROGMEM = { - { DGUSLCD_SCREEN_BOOT, VPList_Boot }, - { DGUSLCD_SCREEN_MAIN, VPList_Main }, - { DGUSLCD_SCREEN_TEMPERATURE, VPList_Temp }, - { DGUSLCD_SCREEN_STATUS, VPList_Status }, - { DGUSLCD_SCREEN_STATUS2, VPList_Status2 }, - { DGUSLCD_SCREEN_PREHEAT, VPList_Preheat }, - { DGUSLCD_SCREEN_MANUALMOVE, VPList_ManualMove }, - { DGUSLCD_SCREEN_Z_OFFSET, VPList_Z_Offset }, - { DGUSLCD_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, - { DGUSLCD_SCREEN_FILAMENT_HEATING, VPList_Filament_heating }, - { DGUSLCD_SCREEN_FILAMENT_LOADING, VPList_Filament_load_unload }, - { DGUSLCD_SCREEN_FILAMENT_UNLOADING, VPList_Filament_load_unload }, - { DGUSLCD_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, - { DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList }, - { DGUSLCD_SCREEN_SDPRINTTUNE, VPList_SDPrintTune }, - { DGUSLCD_SCREEN_WAITING, VPList_PIDTuningWaiting }, - { DGUSLCD_SCREEN_FLC_PREHEAT, VPList_FLCPreheat }, - { DGUSLCD_SCREEN_FLC_PRINTING, VPList_FLCPrinting }, - { DGUSLCD_SCREEN_STEPPERMM, VPList_StepPerMM }, - { DGUSLCD_SCREEN_PID_E, VPList_PIDE0 }, - { DGUSLCD_SCREEN_PID_BED, VPList_PIDBED }, - { DGUSLCD_SCREEN_INFOS, VPList_Infos }, - { 0 , nullptr } // List is terminated with an nullptr as table entry. -}; - -const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; - -// Helper to define a DGUS_VP_Variable for common use cases. -#define VPHELPER(VPADR, VPADRVAR, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=sizeof(VPADRVAR), \ - .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } - -// Helper to define a DGUS_VP_Variable when the sizeo of the var cannot be determined automaticalyl (eg. a string) -#define VPHELPER_STR(VPADR, VPADRVAR, STRLEN, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=STRLEN, \ - .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } - -const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { - // Helper to detect touch events - VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), - VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), - #if ENABLED(SDSUPPORT) - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), - #endif - VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), - - VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), - - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_OPTION, &distanceToMove, &ScreenHandler.HandleManualMoveOption, nullptr), - #endif - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_X, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - #else - VPHELPER(VP_MOVE_X, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, nullptr, &ScreenHandler.HandleManualMove, nullptr), - #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleMotorLockUnlock, nullptr), - #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), - #endif - VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), - #if ENABLED(SINGLE_Z_CALIBRATION) - VPHELPER(VP_Z_CALIBRATE, nullptr, &ScreenHandler.HandleZCalibration, nullptr), - #endif - #if ENABLED(FIRST_LAYER_CAL) - VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &ScreenHandler.HandleFirstLayerCal, nullptr), - #endif - - { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr - { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplay }, - - // Temperature Data - #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_MOVE_E0, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), - VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &ScreenHandler.HandleHeaterControl, nullptr), - VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), - #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, &ScreenHandler.HandlePreheat, nullptr), - #endif - #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), - #endif - #if ENABLED(PIDTEMP) - VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), - #endif - #endif - #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), - VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &ScreenHandler.HandleHeaterControl, nullptr), - VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), - #endif - #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), - VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), - #if ENABLED(PIDTEMP) - VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), - #endif - #endif - - // Fan Data - #if HAS_FAN - #define FAN_VPHELPER(N) \ - VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_PercentageToUint8, &ScreenHandler.DGUSLCD_SendPercentageToDisplay), \ - VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &ScreenHandler.HandleFanControl, nullptr), \ - VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &ScreenHandler.DGUSLCD_SendFanStatusToDisplay), - REPEAT(FAN_COUNT, FAN_VPHELPER) - #endif - - // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay ), - - // Position Data - VPHELPER(VP_XPos, ¤t_position.x, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_YPos, ¤t_position.y, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - - // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay ), - - // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay ), - #if ENABLED(PRINTCOUNTER) - VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintAccTimeToDisplay ), - VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintsTotalToDisplay ), - #endif - - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #if HOTENDS >= 1 - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #endif - #if HOTENDS >= 2 - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #endif - - // SDCard File listing. - #if ENABLED(SDSUPPORT) - VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), - VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), - VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), - VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER(VP_SD_ResumePauseAbort, nullptr, ScreenHandler.DGUSLCD_SD_ResumePauseAbort, nullptr), - VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), - VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), - #if HAS_BED_PROBE - VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, ScreenHandler.HandleProbeOffsetZChanged, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), - #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), - #endif - #endif - #endif - - #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), - #endif - - // Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content. - { .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - - VPHELPER(0, 0, 0, 0) // must be last entry. -}; - -#endif // DGUS_LCD_UI_HIPRECY diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h deleted file mode 100644 index 3ff5e06dc1..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h +++ /dev/null @@ -1,290 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -enum DGUSLCD_Screens : uint8_t { - DGUSLCD_SCREEN_BOOT = 160, - DGUSLCD_SCREEN_MAIN = 1, - DGUSLCD_SCREEN_STATUS = 1, - DGUSLCD_SCREEN_STATUS2 = 1, - DGUSLCD_SCREEN_POWER_LOSS = 17, - DGUSLCD_SCREEN_TEMPERATURE = 40, - DGUSLCD_SCREEN_MANUALMOVE = 86, - DGUSLCD_SCREEN_PREHEAT = 48, - DGUSLCD_SCREEN_UTILITY = 70, - DGUSLCD_SCREEN_FILAMENT_HEATING = 80, - DGUSLCD_SCREEN_FILAMENT_LOADING = 76, - DGUSLCD_SCREEN_FILAMENT_UNLOADING = 82, - DGUSLCD_SCREEN_MANUALEXTRUDE = 84, - DGUSLCD_SCREEN_Z_OFFSET = 88, - DGUSLCD_SCREEN_SDFILELIST = 3, - DGUSLCD_SCREEN_SDPRINTMANIPULATION = 7, - DGUSLCD_SCREEN_SDPRINTTUNE = 9, - DGUSLCD_SCREEN_FLC_PREHEAT = 94, - DGUSLCD_SCREEN_FLC_PRINTING = 96, - DGUSLCD_SCREEN_STEPPERMM = 122, - DGUSLCD_SCREEN_PID_E = 126, - DGUSLCD_SCREEN_PID_BED = 128, - DGUSLCD_SCREEN_INFOS = 131, - DGUSLCD_SCREEN_CONFIRM = 240, - DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") - DGUSLCD_SCREEN_WAITING = 251, - DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" - DGUSLDC_SCREEN_UNUSED = 255 -}; - -// Display Memory layout used (T5UID) -// Except system variables this is arbitrary, just to organize stuff.... - -// 0x0000 .. 0x0FFF -- System variables and reserved by the display -// 0x1000 .. 0x1FFF -- Variables to never change location, regardless of UI Version -// 0x2000 .. 0x2FFF -- Controls (VPs that will trigger some action) -// 0x3000 .. 0x4FFF -- Marlin Data to be displayed -// 0x5000 .. -- SPs (if we want to modify display elements, e.g change color or like) -- currently unused - -// As there is plenty of space (at least most displays have >8k RAM), we do not pack them too tight, -// so that we can keep variables nicely together in the address space. - -// UI Version always on 0x1000...0x1002 so that the firmware can check this and bail out. -constexpr uint16_t VP_UI_VERSION_MAJOR = 0x1000; // Major -- incremented when incompatible -constexpr uint16_t VP_UI_VERSION_MINOR = 0x1001; // Minor -- incremented on new features, but compatible -constexpr uint16_t VP_UI_VERSION_PATCH = 0x1002; // Patch -- fixed which do not change functionality. -constexpr uint16_t VP_UI_FLAVOUR = 0x1010; // lets reserve 16 bytes here to determine if UI is suitable for this Marlin. tbd. - -// Storage space for the Killscreen messages. 0x1100 - 0x1200 . Reused for the popup. -constexpr uint16_t VP_MSGSTR1 = 0x1100; -constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... -constexpr uint16_t VP_MSGSTR2 = 0x1140; -constexpr uint8_t VP_MSGSTR2_LEN = 0x20; -constexpr uint16_t VP_MSGSTR3 = 0x1180; -constexpr uint8_t VP_MSGSTR3_LEN = 0x20; -constexpr uint16_t VP_MSGSTR4 = 0x11C0; -constexpr uint8_t VP_MSGSTR4_LEN = 0x20; - -// Screenchange request for screens that only make sense when printer is idle. -// e.g movement is only allowed if printer is not printing. -// Marlin must confirm by setting the screen manually. -constexpr uint16_t VP_SCREENCHANGE_ASK = 0x2000; -constexpr uint16_t VP_SCREENCHANGE = 0x2001; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. -constexpr uint16_t VP_TEMP_ALL_OFF = 0x2002; // Turn all heaters off. Value arbitrary ;)= -constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x2003; // "Print" Button touched -- go only there if there is an SD Card. - -constexpr uint16_t VP_CONFIRMED = 0x2010; // OK on confirm screen. - -// Buttons on the SD-Card File listing. -constexpr uint16_t VP_SD_ScrollEvent = 0x2020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down -constexpr uint16_t VP_SD_FileSelected = 0x2022; // Number of file field selected. -constexpr uint16_t VP_SD_FileSelectConfirm = 0x2024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) - -constexpr uint16_t VP_SD_ResumePauseAbort = 0x2026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints -constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x2028; // Abort print confirmation (virtual, will be injected by the confirm dialog) -constexpr uint16_t VP_SD_Print_Setting = 0x2040; -constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x2050; // Data: 0 down, 1 up - -// Controls for movement (we can't use the incremental / decremental feature of the display at this feature works only with 16 bit values -// (which would limit us to 655.35mm, which is likely not a problem for common setups, but i don't want to rule out hangprinters support) -// A word about the coding: The VP will be per axis and the return code will be an signed 16 bit value in 0.01 mm resolution, telling us -// the relative travel amount t he user wants to do. So eg. if the display sends us VP=2100 with value 100, the user wants us to move X by +1 mm. -constexpr uint16_t VP_MOVE_X = 0x2100; -constexpr uint16_t VP_MOVE_Y = 0x2102; -constexpr uint16_t VP_MOVE_Z = 0x2104; -constexpr uint16_t VP_MOVE_E0 = 0x2110; -constexpr uint16_t VP_MOVE_E1 = 0x2112; -//constexpr uint16_t VP_MOVE_E2 = 0x2114; -//constexpr uint16_t VP_MOVE_E3 = 0x2116; -//constexpr uint16_t VP_MOVE_E4 = 0x2118; -//constexpr uint16_t VP_MOVE_E5 = 0x211A; -constexpr uint16_t VP_HOME_ALL = 0x2120; -constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; - -// Power loss recovery -constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; - -// Fan Control Buttons , switch between "off" and "on" -constexpr uint16_t VP_FAN0_CONTROL = 0x2200; -constexpr uint16_t VP_FAN1_CONTROL = 0x2202; -//constexpr uint16_t VP_FAN2_CONTROL = 0x2204; -//constexpr uint16_t VP_FAN3_CONTROL = 0x2206; - -// Heater Control Buttons , triged between "cool down" and "heat PLA" state -constexpr uint16_t VP_E0_CONTROL = 0x2210; -constexpr uint16_t VP_E1_CONTROL = 0x2212; -//constexpr uint16_t VP_E2_CONTROL = 0x2214; -//constexpr uint16_t VP_E3_CONTROL = 0x2216; -//constexpr uint16_t VP_E4_CONTROL = 0x2218; -//constexpr uint16_t VP_E5_CONTROL = 0x221A; -constexpr uint16_t VP_BED_CONTROL = 0x221C; - -// Preheat -constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; -//constexpr uint16_t VP_E1_BED_PREHEAT = 0x2222; -//constexpr uint16_t VP_E2_BED_PREHEAT = 0x2224; -//constexpr uint16_t VP_E3_BED_PREHEAT = 0x2226; -//constexpr uint16_t VP_E4_BED_PREHEAT = 0x2228; -//constexpr uint16_t VP_E5_BED_PREHEAT = 0x222A; - -// Filament load and unload -constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; - -// Settings store , reset -constexpr uint16_t VP_SETTINGS = 0x2400; - -// PID autotune -constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x2410; -//constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x2412; -//constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x2414; -//constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x2416; -//constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x2418; -//constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x241A; -constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x2420; - -// Calibrate Z -constexpr uint16_t VP_Z_CALIBRATE = 0x2430; - -// First layer cal -constexpr uint16_t VP_Z_FIRST_LAYER_CAL = 0x2500; // Data: 0 - Cancel first layer cal progress, >0 filament type have loaded - -// Firmware version on the boot screen. -constexpr uint16_t VP_MARLIN_VERSION = 0x3000; -constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. - -// Place for status messages. -constexpr uint16_t VP_M117 = 0x3020; -constexpr uint8_t VP_M117_LEN = 0x20; - -// Temperatures. -constexpr uint16_t VP_T_E0_Is = 0x3060; // 4 Byte Integer -constexpr uint16_t VP_T_E0_Set = 0x3062; // 2 Byte Integer -constexpr uint16_t VP_T_E1_Is = 0x3064; // 4 Byte Integer - -// reserved to support up to 6 Extruders: -//constexpr uint16_t VP_T_E1_Set = 0x3066; // 2 Byte Integer -//constexpr uint16_t VP_T_E2_Is = 0x3068; // 4 Byte Integer -//constexpr uint16_t VP_T_E2_Set = 0x306A; // 2 Byte Integer -//constexpr uint16_t VP_T_E3_Is = 0x306C; // 4 Byte Integer -//constexpr uint16_t VP_T_E3_Set = 0x306E; // 2 Byte Integer -//constexpr uint16_t VP_T_E4_Is = 0x3070; // 4 Byte Integer -//constexpr uint16_t VP_T_E4_Set = 0x3072; // 2 Byte Integer -//constexpr uint16_t VP_T_E4_Is = 0x3074; // 4 Byte Integer -//constexpr uint16_t VP_T_E4_Set = 0x3076; // 2 Byte Integer -//constexpr uint16_t VP_T_E5_Is = 0x3078; // 4 Byte Integer -//constexpr uint16_t VP_T_E5_Set = 0x307A; // 2 Byte Integer - -constexpr uint16_t VP_T_Bed_Is = 0x3080; // 4 Byte Integer -constexpr uint16_t VP_T_Bed_Set = 0x3082; // 2 Byte Integer - -constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer -constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer - -// reserved for up to 6 Extruders: -//constexpr uint16_t VP_Flowrate_E2 = 0x3094; -//constexpr uint16_t VP_Flowrate_E3 = 0x3096; -//constexpr uint16_t VP_Flowrate_E4 = 0x3098; -//constexpr uint16_t VP_Flowrate_E5 = 0x309A; - -constexpr uint16_t VP_Fan0_Percentage = 0x3100; // 2 Byte Integer (0..100) -constexpr uint16_t VP_Fan1_Percentage = 0x3102; // 2 Byte Integer (0..100) -constexpr uint16_t VP_Fan2_Percentage = 0x3104; // 2 Byte Integer (0..100) -constexpr uint16_t VP_Fan3_Percentage = 0x3106; // 2 Byte Integer (0..100) -constexpr uint16_t VP_Feedrate_Percentage = 0x3108; // 2 Byte Integer (0..100) - -// Actual Position -constexpr uint16_t VP_XPos = 0x3110; // 4 Byte Fixed point number; format xxx.yy -constexpr uint16_t VP_YPos = 0x3112; // 4 Byte Fixed point number; format xxx.yy -constexpr uint16_t VP_ZPos = 0x3114; // 4 Byte Fixed point number; format xxx.yy - -constexpr uint16_t VP_EPos = 0x3120; // 4 Byte Fixed point number; format xxx.yy - -constexpr uint16_t VP_PrintProgress_Percentage = 0x3130; // 2 Byte Integer (0..100) - -constexpr uint16_t VP_PrintTime = 0x3140; -constexpr uint16_t VP_PrintTime_LEN = 32; - -constexpr uint16_t VP_PrintAccTime = 0x3160; -constexpr uint16_t VP_PrintAccTime_LEN = 32; - -constexpr uint16_t VP_PrintsTotal = 0x3180; -constexpr uint16_t VP_PrintsTotal_LEN = 16; - -// SDCard File Listing -constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. -constexpr uint16_t DGUS_SD_FILESPERSCREEN = 5; // FIXME move that info to the display and read it from there. -constexpr uint16_t VP_SD_FileName0 = 0x3200; -constexpr uint16_t VP_SD_FileName1 = 0x3220; -constexpr uint16_t VP_SD_FileName2 = 0x3240; -constexpr uint16_t VP_SD_FileName3 = 0x3260; -constexpr uint16_t VP_SD_FileName4 = 0x3280; - -constexpr uint16_t VP_SD_Print_ProbeOffsetZ = 0x32A0; // - -constexpr uint16_t VP_SD_Print_Filename = 0x32C0; // -// Fan status -constexpr uint16_t VP_FAN0_STATUS = 0x3300; -constexpr uint16_t VP_FAN1_STATUS = 0x3302; -//constexpr uint16_t VP_FAN2_STATUS = 0x3304; -//constexpr uint16_t VP_FAN3_STATUS = 0x3306; - -// Heater status -constexpr uint16_t VP_E0_STATUS = 0x3310; -//constexpr uint16_t VP_E1_STATUS = 0x3312; -//constexpr uint16_t VP_E2_STATUS = 0x3314; -//constexpr uint16_t VP_E3_STATUS = 0x3316; -//constexpr uint16_t VP_E4_STATUS = 0x3318; -//constexpr uint16_t VP_E5_STATUS = 0x331A; -constexpr uint16_t VP_BED_STATUS = 0x331C; - -constexpr uint16_t VP_MOVE_OPTION = 0x3400; - -// Step per mm -constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , 2 byte unsigned int , 0~1638.4 -//constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; -constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; -//constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; -constexpr uint16_t VP_Z_STEP_PER_MM = 0x3608; -//constexpr uint16_t VP_Z2_STEP_PER_MM = 0x360A; -constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; -//constexpr uint16_t VP_E1_STEP_PER_MM = 0x3612; -//constexpr uint16_t VP_E2_STEP_PER_MM = 0x3614; -//constexpr uint16_t VP_E3_STEP_PER_MM = 0x3616; -//constexpr uint16_t VP_E4_STEP_PER_MM = 0x3618; -//constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; - -// PIDs -constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 -constexpr uint16_t VP_E0_PID_I = 0x3702; -constexpr uint16_t VP_E0_PID_D = 0x3704; -constexpr uint16_t VP_BED_PID_P = 0x3710; -constexpr uint16_t VP_BED_PID_I = 0x3712; -constexpr uint16_t VP_BED_PID_D = 0x3714; - -// Wating screen status -constexpr uint16_t VP_WAITING_STATUS = 0x3800; - -// SPs for certain variables... -// located at 0x5000 and up -// Not used yet! -// This can be used e.g to make controls / data display invisible -constexpr uint16_t SP_T_E0_Is = 0x5000; -constexpr uint16_t SP_T_E0_Set = 0x5010; -constexpr uint16_t SP_T_E1_Is = 0x5020; -constexpr uint16_t SP_T_Bed_Is = 0x5030; -constexpr uint16_t SP_T_Bed_Set = 0x5040; diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp deleted file mode 100644 index f9d4351e02..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* DGUS implementation written by coldtobi in 2019 for Marlin */ - -#include "../../../../../inc/MarlinConfigPre.h" - -#if ENABLED(DGUS_LCD_UI_ORIGIN) - -#include "../DGUSDisplayDef.h" -#include "../DGUSDisplay.h" -#include "../DGUSScreenHandler.h" - -#include "../../../../../module/temperature.h" -#include "../../../../../module/motion.h" -#include "../../../../../module/planner.h" - -#include "../../../../ultralcd.h" -#include "../../../ui_api.h" - -#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - uint16_t distanceToMove = 10; -#endif -using namespace ExtUI; - -const uint16_t VPList_Boot[] PROGMEM = { - VP_MARLIN_VERSION, - 0x0000 -}; - -const uint16_t VPList_Main[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded. */ - 0x0000 -}; - -const uint16_t VPList_Temp[] PROGMEM = { - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - 0x0000 -}; - -const uint16_t VPList_Status[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded */ - #if HOTENDS >= 1 - VP_T_E0_Is, VP_T_E0_Set, - #endif - #if HOTENDS >= 2 - VP_T_E1_Is, VP_T_E1_Set, - #endif - #if HAS_HEATED_BED - VP_T_Bed_Is, VP_T_Bed_Set, - #endif - #if HAS_FAN - VP_Fan0_Percentage, - #endif - VP_XPos, VP_YPos, VP_ZPos, - VP_Fan0_Percentage, - VP_Feedrate_Percentage, - VP_PrintProgress_Percentage, - 0x0000 -}; - -const uint16_t VPList_Status2[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded */ - #if HOTENDS >= 1 - VP_Flowrate_E0, - #endif - #if HOTENDS >= 2 - VP_Flowrate_E1, - #endif - VP_PrintProgress_Percentage, - VP_PrintTime, - 0x0000 -}; - -const uint16_t VPList_ManualMove[] PROGMEM = { - VP_XPos, VP_YPos, VP_ZPos, - 0x0000 -}; - -const uint16_t VPList_ManualExtrude[] PROGMEM = { - VP_EPos, - 0x0000 -}; - -const uint16_t VPList_FanAndFeedrate[] PROGMEM = { - VP_Feedrate_Percentage, VP_Fan0_Percentage, - 0x0000 -}; - -const uint16_t VPList_SD_FlowRates[] PROGMEM = { - VP_Flowrate_E0, VP_Flowrate_E1, - 0x0000 -}; - -const uint16_t VPList_SDFileList[] PROGMEM = { - VP_SD_FileName0, VP_SD_FileName1, VP_SD_FileName2, VP_SD_FileName3, VP_SD_FileName4, - 0x0000 -}; - -const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { - VP_PrintProgress_Percentage, VP_PrintTime, - 0x0000 -}; - -const struct VPMapping VPMap[] PROGMEM = { - { DGUSLCD_SCREEN_BOOT, VPList_Boot }, - { DGUSLCD_SCREEN_MAIN, VPList_Main }, - { DGUSLCD_SCREEN_TEMPERATURE, VPList_Temp }, - { DGUSLCD_SCREEN_STATUS, VPList_Status }, - { DGUSLCD_SCREEN_STATUS2, VPList_Status2 }, - { DGUSLCD_SCREEN_MANUALMOVE, VPList_ManualMove }, - { DGUSLCD_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, - { DGUSLCD_SCREEN_FANANDFEEDRATE, VPList_FanAndFeedrate }, - { DGUSLCD_SCREEN_FLOWRATES, VPList_SD_FlowRates }, - { DGUSLCD_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, - { DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList }, - { 0 , nullptr } // List is terminated with an nullptr as table entry. -}; - -const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; - -// Helper to define a DGUS_VP_Variable for common use cases. -#define VPHELPER(VPADR, VPADRVAR, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=sizeof(VPADRVAR), \ - .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } - -// Helper to define a DGUS_VP_Variable when the sizeo of the var cannot be determined automaticalyl (eg. a string) -#define VPHELPER_STR(VPADR, VPADRVAR, STRLEN, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=STRLEN, \ - .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } - -const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { - // Helper to detect touch events - VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), - VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), - #if ENABLED(SDSUPPORT) - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), - #endif - VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), - - VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), - - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_OPTION, &distanceToMove, &ScreenHandler.HandleManualMoveOption, nullptr), - #endif - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_X, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, &distanceToMove, &ScreenHandler.HandleManualMove, nullptr), - #else - VPHELPER(VP_MOVE_X, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, nullptr, &ScreenHandler.HandleManualMove, nullptr), - #endif - - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleMotorLockUnlock, nullptr), - #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), - #endif - VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), - - { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr - { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplay }, - - // Temperature Data - #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, nullptr, nullptr, SET_VARIABLE(getActualTemp_celsius, E0, long)), - VPHELPER(VP_T_E0_Set, nullptr, GET_VARIABLE(setTargetTemp_celsius, E0), - SET_VARIABLE(getTargetTemp_celsius, E0)), - VPHELPER(VP_Flowrate_E0, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_MOVE_E0, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), - VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &ScreenHandler.HandleHeaterControl, nullptr), - VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), - #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, &ScreenHandler.HandlePreheat, nullptr), - #endif - #if ENABLED(PIDTEMP) - VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), - #endif - #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), - #endif - #endif - #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), - VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &ScreenHandler.HandleHeaterControl, nullptr), - VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), - #if ENABLED(PIDTEMP) - VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), - #endif - #endif - #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), - VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), - VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), - #if ENABLED(PIDTEMPBED) - VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), - #endif - #endif - - // Fan Data - #if HAS_FAN - #define FAN_VPHELPER(N) \ - VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_PercentageToUint8, &ScreenHandler.DGUSLCD_SendPercentageToDisplay), \ - VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &ScreenHandler.HandleFanControl, nullptr), \ - VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &ScreenHandler.DGUSLCD_SendFanStatusToDisplay), - REPEAT(FAN_COUNT, FAN_VPHELPER) - #endif - - // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay ), - - // Position Data - VPHELPER(VP_XPos, ¤t_position.x, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_YPos, ¤t_position.y, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), - - // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay ), - - // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay ), - #if ENABLED(PRINTCOUNTER) - VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintAccTimeToDisplay ), - VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintsTotalToDisplay ), - #endif - - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #if HOTENDS >= 1 - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #endif - #if HOTENDS >= 2 - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - #endif - - // SDCard File listing. - #if ENABLED(SDSUPPORT) - VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), - VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), - VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), - VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename ), - VPHELPER(VP_SD_ResumePauseAbort, nullptr, ScreenHandler.DGUSLCD_SD_ResumePauseAbort, nullptr), - VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), - VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), - #if HAS_BED_PROBE - VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, ScreenHandler.HandleProbeOffsetZChanged, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), - #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), - #endif - #endif - #endif - - #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), - #endif - - // Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content. - { .VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, - - VPHELPER(0, 0, 0, 0) // must be last entry. -}; - -#endif // DGUS_LCD_UI_ORIGIN diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h deleted file mode 100644 index 451c11adba..0000000000 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h +++ /dev/null @@ -1,280 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -enum DGUSLCD_Screens : uint8_t { - DGUSLCD_SCREEN_BOOT = 0, - DGUSLCD_SCREEN_MAIN = 10, - DGUSLCD_SCREEN_TEMPERATURE = 20, - DGUSLCD_SCREEN_STATUS = 30, - DGUSLCD_SCREEN_STATUS2 = 32, - DGUSLCD_SCREEN_MANUALMOVE = 40, - DGUSLCD_SCREEN_MANUALEXTRUDE=42, - DGUSLCD_SCREEN_FANANDFEEDRATE = 44, - DGUSLCD_SCREEN_FLOWRATES = 46, - DGUSLCD_SCREEN_SDFILELIST = 50, - DGUSLCD_SCREEN_SDPRINTMANIPULATION = 52, - DGUSLCD_SCREEN_POWER_LOSS = 100, - DGUSLCD_SCREEN_PREHEAT=120, - DGUSLCD_SCREEN_UTILITY=110, - DGUSLCD_SCREEN_FILAMENT_HEATING=146, - DGUSLCD_SCREEN_FILAMENT_LOADING=148, - DGUSLCD_SCREEN_FILAMENT_UNLOADING=158, - DGUSLCD_SCREEN_SDPRINTTUNE = 170, - DGUSLCD_SCREEN_CONFIRM = 240, - DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") - DGUSLCD_SCREEN_WAITING = 251, - DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" - DGUSLDC_SCREEN_UNUSED = 255 -}; - -// Display Memory layout used (T5UID) -// Except system variables this is arbitrary, just to organize stuff.... - -// 0x0000 .. 0x0FFF -- System variables and reserved by the display -// 0x1000 .. 0x1FFF -- Variables to never change location, regardless of UI Version -// 0x2000 .. 0x2FFF -- Controls (VPs that will trigger some action) -// 0x3000 .. 0x4FFF -- Marlin Data to be displayed -// 0x5000 .. -- SPs (if we want to modify display elements, e.g change color or like) -- currently unused - -// As there is plenty of space (at least most displays have >8k RAM), we do not pack them too tight, -// so that we can keep variables nicely together in the address space. - -// UI Version always on 0x1000...0x1002 so that the firmware can check this and bail out. -constexpr uint16_t VP_UI_VERSION_MAJOR = 0x1000; // Major -- incremented when incompatible -constexpr uint16_t VP_UI_VERSION_MINOR = 0x1001; // Minor -- incremented on new features, but compatible -constexpr uint16_t VP_UI_VERSION_PATCH = 0x1002; // Patch -- fixed which do not change functionality. -constexpr uint16_t VP_UI_FLAVOUR = 0x1010; // lets reserve 16 bytes here to determine if UI is suitable for this Marlin. tbd. - -// Storage space for the Killscreen messages. 0x1100 - 0x1200 . Reused for the popup. -constexpr uint16_t VP_MSGSTR1 = 0x1100; -constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... -constexpr uint16_t VP_MSGSTR2 = 0x1140; -constexpr uint8_t VP_MSGSTR2_LEN = 0x20; -constexpr uint16_t VP_MSGSTR3 = 0x1180; -constexpr uint8_t VP_MSGSTR3_LEN = 0x20; -constexpr uint16_t VP_MSGSTR4 = 0x11C0; -constexpr uint8_t VP_MSGSTR4_LEN = 0x20; - -// Screenchange request for screens that only make sense when printer is idle. -// e.g movement is only allowed if printer is not printing. -// Marlin must confirm by setting the screen manually. -constexpr uint16_t VP_SCREENCHANGE_ASK = 0x2000; -constexpr uint16_t VP_SCREENCHANGE = 0x2001; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. -constexpr uint16_t VP_TEMP_ALL_OFF = 0x2002; // Turn all heaters off. Value arbitrary ;)= -constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x2003; // "Print" Button touched -- go only there if there is an SD Card. - -constexpr uint16_t VP_CONFIRMED = 0x2010; // OK on confirm screen. - -// Buttons on the SD-Card File listing. -constexpr uint16_t VP_SD_ScrollEvent = 0x2020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down -constexpr uint16_t VP_SD_FileSelected = 0x2022; // Number of file field selected. -constexpr uint16_t VP_SD_FileSelectConfirm = 0x2024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) - -constexpr uint16_t VP_SD_ResumePauseAbort = 0x2026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints -constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x2028; // Abort print confirmation (virtual, will be injected by the confirm dialog) -constexpr uint16_t VP_SD_Print_Setting = 0x2040; -constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x2050; // Data: 0 down, 1 up - -// Controls for movement (we can't use the incremental / decremental feature of the display at this feature works only with 16 bit values -// (which would limit us to 655.35mm, which is likely not a problem for common setups, but i don't want to rule out hangprinters support) -// A word about the coding: The VP will be per axis and the return code will be an signed 16 bit value in 0.01 mm resolution, telling us -// the relative travel amount t he user wants to do. So eg. if the display sends us VP=2100 with value 100, the user wants us to move X by +1 mm. -constexpr uint16_t VP_MOVE_X = 0x2100; -constexpr uint16_t VP_MOVE_Y = 0x2102; -constexpr uint16_t VP_MOVE_Z = 0x2104; -constexpr uint16_t VP_MOVE_E0 = 0x2110; -constexpr uint16_t VP_MOVE_E1 = 0x2112; -//constexpr uint16_t VP_MOVE_E2 = 0x2114; -//constexpr uint16_t VP_MOVE_E3 = 0x2116; -//constexpr uint16_t VP_MOVE_E4 = 0x2118; -//constexpr uint16_t VP_MOVE_E5 = 0x211A; -constexpr uint16_t VP_HOME_ALL = 0x2120; -constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; - -// Power loss recovery -constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; - -// Fan Control Buttons , switch between "off" and "on" -constexpr uint16_t VP_FAN0_CONTROL = 0x2200; -constexpr uint16_t VP_FAN1_CONTROL = 0x2202; -//constexpr uint16_t VP_FAN2_CONTROL = 0x2204; -//constexpr uint16_t VP_FAN3_CONTROL = 0x2206; - -// Heater Control Buttons , triged between "cool down" and "heat PLA" state -constexpr uint16_t VP_E0_CONTROL = 0x2210; -constexpr uint16_t VP_E1_CONTROL = 0x2212; -//constexpr uint16_t VP_E2_CONTROL = 0x2214; -//constexpr uint16_t VP_E3_CONTROL = 0x2216; -//constexpr uint16_t VP_E4_CONTROL = 0x2218; -//constexpr uint16_t VP_E5_CONTROL = 0x221A; -constexpr uint16_t VP_BED_CONTROL = 0x221C; - -// Preheat -constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; -constexpr uint16_t VP_E1_BED_CONTROL = 0x2222; -//constexpr uint16_t VP_E2_BED_CONTROL = 0x2224; -//constexpr uint16_t VP_E3_BED_CONTROL = 0x2226; -//constexpr uint16_t VP_E4_BED_CONTROL = 0x2228; -//constexpr uint16_t VP_E5_BED_CONTROL = 0x222A; - -// Filament load and unload -constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; -constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; - -// Settings store , reset -constexpr uint16_t VP_SETTINGS = 0x2400; - -// PID autotune -constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x2410; -//constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x2412; -//constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x2414; -//constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x2416; -//constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x2418; -//constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x241A; -constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x2420; - -// Firmware version on the boot screen. -constexpr uint16_t VP_MARLIN_VERSION = 0x3000; -constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. - -// Place for status messages. -constexpr uint16_t VP_M117 = 0x3020; -constexpr uint8_t VP_M117_LEN = 0x20; - -// Temperatures. -constexpr uint16_t VP_T_E0_Is = 0x3060; // 4 Byte Integer -constexpr uint16_t VP_T_E0_Set = 0x3062; // 2 Byte Integer -constexpr uint16_t VP_T_E1_Is = 0x3064; // 4 Byte Integer - -// reserved to support up to 6 Extruders: -//constexpr uint16_t VP_T_E1_Set = 0x3066; // 2 Byte Integer -//constexpr uint16_t VP_T_E2_Is = 0x3068; // 4 Byte Integer -//constexpr uint16_t VP_T_E2_Set = 0x306A; // 2 Byte Integer -//constexpr uint16_t VP_T_E3_Is = 0x306C; // 4 Byte Integer -//constexpr uint16_t VP_T_E3_Set = 0x306E; // 2 Byte Integer -//constexpr uint16_t VP_T_E4_Is = 0x3070; // 4 Byte Integer -//constexpr uint16_t VP_T_E4_Set = 0x3072; // 2 Byte Integer -//constexpr uint16_t VP_T_E4_Is = 0x3074; // 4 Byte Integer -//constexpr uint16_t VP_T_E4_Set = 0x3076; // 2 Byte Integer -//constexpr uint16_t VP_T_E5_Is = 0x3078; // 4 Byte Integer -//constexpr uint16_t VP_T_E5_Set = 0x307A; // 2 Byte Integer - -constexpr uint16_t VP_T_Bed_Is = 0x3080; // 4 Byte Integer -constexpr uint16_t VP_T_Bed_Set = 0x3082; // 2 Byte Integer - -constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer -constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer - -// reserved for up to 6 Extruders: -//constexpr uint16_t VP_Flowrate_E2 = 0x3094; -//constexpr uint16_t VP_Flowrate_E3 = 0x3096; -//constexpr uint16_t VP_Flowrate_E4 = 0x3098; -//constexpr uint16_t VP_Flowrate_E5 = 0x309A; - -constexpr uint16_t VP_Fan0_Percentage = 0x3100; // 2 Byte Integer (0..100) -constexpr uint16_t VP_Fan1_Percentage = 0x33A2; // 2 Byte Integer (0..100) -//constexpr uint16_t VP_Fan2_Percentage = 0x33A4; // 2 Byte Integer (0..100) -//constexpr uint16_t VP_Fan3_Percentage = 0x33A6; // 2 Byte Integer (0..100) - -constexpr uint16_t VP_Feedrate_Percentage = 0x3102; // 2 Byte Integer (0..100) -constexpr uint16_t VP_PrintProgress_Percentage = 0x3104; // 2 Byte Integer (0..100) - -constexpr uint16_t VP_PrintTime = 0x3106; -constexpr uint16_t VP_PrintTime_LEN = 10; - -constexpr uint16_t VP_PrintAccTime = 0x3160; -constexpr uint16_t VP_PrintAccTime_LEN = 32; - -constexpr uint16_t VP_PrintsTotal = 0x3180; -constexpr uint16_t VP_PrintsTotal_LEN = 16; - -// Actual Position -constexpr uint16_t VP_XPos = 0x3110; // 4 Byte Fixed point number; format xxx.yy -constexpr uint16_t VP_YPos = 0x3112; // 4 Byte Fixed point number; format xxx.yy -constexpr uint16_t VP_ZPos = 0x3114; // 4 Byte Fixed point number; format xxx.yy - -constexpr uint16_t VP_EPos = 0x3120; // 4 Byte Fixed point number; format xxx.yy - -// SDCard File Listing -constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. -constexpr uint16_t DGUS_SD_FILESPERSCREEN = 5; // FIXME move that info to the display and read it from there. -constexpr uint16_t VP_SD_FileName0 = 0x3200; -constexpr uint16_t VP_SD_FileName1 = 0x3220; -constexpr uint16_t VP_SD_FileName2 = 0x3240; -constexpr uint16_t VP_SD_FileName3 = 0x3260; -constexpr uint16_t VP_SD_FileName4 = 0x3280; - -constexpr uint16_t VP_SD_Print_ProbeOffsetZ = 0x32A0; // -constexpr uint16_t VP_SD_Print_Filename = 0x32C0; // - -// Fan status -constexpr uint16_t VP_FAN0_STATUS = 0x3300; -constexpr uint16_t VP_FAN1_STATUS = 0x3302; -//constexpr uint16_t VP_FAN2_STATUS = 0x3304; -//constexpr uint16_t VP_FAN3_STATUS = 0x3306; - -// Heater status -constexpr uint16_t VP_E0_STATUS = 0x3310; -//constexpr uint16_t VP_E1_STATUS = 0x3312; -//constexpr uint16_t VP_E2_STATUS = 0x3314; -//constexpr uint16_t VP_E3_STATUS = 0x3316; -//constexpr uint16_t VP_E4_STATUS = 0x3318; -//constexpr uint16_t VP_E5_STATUS = 0x331A; -constexpr uint16_t VP_BED_STATUS = 0x331C; - -constexpr uint16_t VP_MOVE_OPTION = 0x3400; - -// Step per mm -constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , 2 byte unsigned int , 0~1638.4 -//constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; -constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; -//constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; -constexpr uint16_t VP_Z_STEP_PER_MM = 0x3608; -//constexpr uint16_t VP_Z2_STEP_PER_MM = 0x360A; -constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; -//constexpr uint16_t VP_E1_STEP_PER_MM = 0x3612; -//constexpr uint16_t VP_E2_STEP_PER_MM = 0x3614; -//constexpr uint16_t VP_E3_STEP_PER_MM = 0x3616; -//constexpr uint16_t VP_E4_STEP_PER_MM = 0x3618; -//constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; - -// PIDs -constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 -constexpr uint16_t VP_E0_PID_I = 0x3702; -constexpr uint16_t VP_E0_PID_D = 0x3704; -constexpr uint16_t VP_BED_PID_P = 0x3710; -constexpr uint16_t VP_BED_PID_I = 0x3712; -constexpr uint16_t VP_BED_PID_D = 0x3714; - -// Wating screen status -constexpr uint16_t VP_WAITING_STATUS = 0x3800; - -// SPs for certain variables... -// located at 0x5000 and up -// Not used yet! -// This can be used e.g to make controls / data display invisible -constexpr uint16_t SP_T_E0_Is = 0x5000; -constexpr uint16_t SP_T_E0_Set = 0x5010; -constexpr uint16_t SP_T_E1_Is = 0x5020; -constexpr uint16_t SP_T_Bed_Is = 0x5030; -constexpr uint16_t SP_T_Bed_Set = 0x5040; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp deleted file mode 100644 index 2c466ffd04..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp +++ /dev/null @@ -1,553 +0,0 @@ -/********************* - * flash_storage.cpp * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../compat.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "../ftdi_eve_lib/ftdi_eve_lib.h" - -#include "media_file_reader.h" -#include "flash_storage.h" - -// The following must be changed whenever the layout of the flash -// data is changed in a manner that would render the data invalid. - -constexpr uint32_t flash_eeprom_version = 1; - -/* SPI Flash Memory Map: - * - * The following offsets and sizes are specified in 4k erase units: - * - * Page Size Description - * 0 16 DATA STORAGE AREA - * 16 1 VERSIONING DATA - * 17 inf MEDIA STORAGE AREA - */ - -#define DATA_STORAGE_SIZE_64K - -using namespace FTDI::SPI; -using namespace FTDI::SPI::most_significant_byte_first; - -bool UIFlashStorage::is_present = false; - -#ifdef SPI_FLASH_SS -/************************** SPI Flash Chip Interface **************************/ - - void SPIFlash::wait_while_busy() { - uint8_t status; - safe_delay(1); - do { - spi_flash_select(); - spi_write_8(READ_STATUS_1); - status = spi_read_8(); - spi_flash_deselect(); - safe_delay(1); - } while (status & 1); - } - - void SPIFlash::erase_sector_4k(uint32_t addr) { - spi_flash_select(); - spi_write_8(WRITE_ENABLE); - spi_flash_deselect(); - - spi_flash_select(); - spi_write_8(ERASE_4K); - spi_write_24(addr); - spi_flash_deselect(); - - wait_while_busy(); - } - - void SPIFlash::erase_sector_64k(uint32_t addr) { - spi_flash_select(); - spi_write_8(WRITE_ENABLE); - spi_flash_deselect(); - - spi_flash_select(); - spi_write_8(ERASE_64K); - spi_write_24(addr); - spi_flash_deselect(); - - wait_while_busy(); - } - - void SPIFlash::spi_write_begin(uint32_t addr) { - spi_flash_select(); - spi_write_8(WRITE_ENABLE); - spi_flash_deselect(); - - spi_flash_select(); - spi_write_8(PAGE_PROGRAM); - spi_write_24(addr); - } - - void SPIFlash::spi_write_end() { - spi_flash_deselect(); - wait_while_busy(); - } - - void SPIFlash::spi_read_begin(uint32_t addr) { - spi_flash_select(); - spi_write_8(READ_DATA); - spi_write_24(addr); - } - - void SPIFlash::spi_read_end() { - spi_flash_deselect(); - } - - void SPIFlash::erase_chip() { - spi_flash_select(); - spi_write_8(WRITE_ENABLE); - spi_flash_deselect(); - - spi_flash_select(); - spi_write_8(ERASE_CHIP); - spi_flash_deselect(); - wait_while_busy(); - } - - void SPIFlash::read_jedec_id(uint8_t &manufacturer_id, uint8_t &device_type, uint8_t &capacity) { - spi_flash_select(); - spi_write_8(READ_JEDEC_ID); - manufacturer_id = spi_recv(); - device_type = spi_recv(); - capacity = spi_recv(); - spi_flash_deselect (); - } - - /* This function writes "size" bytes from "data" starting at addr, while properly - * taking into account the special case of writing across a 256 byte page boundary. - * Returns the addr directly after the write. - */ - uint32_t SPIFlash::write(uint32_t addr, const void *_data, size_t size) { - const uint8_t *data = (const uint8_t*) _data; - while (size) { - const uint32_t page_start = addr & 0xFFFF00ul; - const uint32_t page_end = page_start + 256; - const uint32_t write_size = min(page_end - addr, size); - spi_write_begin(addr); - spi_write_bulk(data, write_size); - spi_write_end(); - addr += write_size; - size -= write_size; - data += write_size; - } - return addr; - } - - uint32_t SPIFlash::read(uint32_t addr, void *data, size_t size) { - spi_read_begin(addr); - spi_read_bulk(data, size); - spi_read_end(); - return addr + size; - } - - /********************************** UTILITY ROUTINES *********************************/ - - bool UIFlashStorage::check_known_device() { - uint8_t manufacturer_id, device_type, capacity; - read_jedec_id(manufacturer_id, device_type, capacity); - - const bool is_known = - ((manufacturer_id == 0xEF) && (device_type == 0x40) && (capacity == 0x15)) || // unknown - ((manufacturer_id == 0x01) && (device_type == 0x40) && (capacity == 0x15)) || // Cypress S25FL116K - ((manufacturer_id == 0xEF) && (device_type == 0x14) && (capacity == 0x15)) || // Winbond W25Q16JV - ((manufacturer_id == 0x1F) && (device_type == 0x86) && (capacity == 0x01)) ; // Adesto AT255F161 - - if (!is_known) { - SERIAL_ECHO_MSG("Unable to locate supported SPI Flash Memory."); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(" Manufacturer ID, got: ", manufacturer_id); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(" Device Type , got: ", device_type); - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(" Capacity , got: ", capacity); - } - - return is_known; - } - - void UIFlashStorage::initialize() { - for (uint8_t i = 0; i < 10; i++) { - if (check_known_device()) { - is_present = true; - break; - } - safe_delay(1000); - } - } - - /**************************** DATA STORAGE AREA (first 4K or 64k) ********************/ - - #ifdef DATA_STORAGE_SIZE_64K - constexpr uint32_t data_storage_area_size = 64 * 1024; // Large erase unit - #else - constexpr uint32_t data_storage_area_size = 4 * 1024; // Small erase unit - #endif - - /* In order to provide some degree of wear leveling, each data write to the - * SPI Flash chip is appended to data that was already written before, until - * the data storage area is completely filled. New data is written preceeded - * with a 32-bit delimiter 'LULZ', so that we can distinguish written and - * unwritten data: - * - * 'LULZ' <--- 1st record delimiter - * - * - * - * 'LULZ' <--- 2nd record delimiter - * - * - * - * ... - * 'LULZ' <--- Last record delimiter - * - * - * - * 0xFF <--- Start of free space - * 0xFF - * ... - * - * This function walks down the data storage area, verifying that the - * delimiters are either 'LULZ' or 0xFFFFFFFF. In the case that an invalid - * delimiter is found, this function returns -1, indicating that the Flash - * data is invalid (this will happen if the block_size changed with respect - * to earlier firmware). Otherwise, it returns the offset of the last - * valid delimiter 'LULZ', indicating the most recently written data. - */ - int32_t UIFlashStorage::get_config_read_offset(uint32_t block_size) { - uint16_t stride = 4 + block_size; - int32_t read_offset = -1; - - for (uint32_t offset = 0; offset < (data_storage_area_size - stride); offset += stride) { - uint32_t delim; - spi_read_begin(offset); - spi_read_bulk (&delim, sizeof(delim)); - spi_read_end(); - switch (delim) { - case 0xFFFFFFFFul: return read_offset; - case delimiter: read_offset = offset; break; - default: - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("Invalid delimiter in Flash: ", delim); - return -1; - } - } - SERIAL_ECHO_MSG("No LULZ delimiter found."); - return -1; - } - - /* This function returns the offset at which new data should be - * appended, or -1 if the Flash needs to be erased */ - int32_t UIFlashStorage::get_config_write_offset(uint32_t block_size) { - int32_t read_offset = get_config_read_offset(block_size); - if (read_offset == -1) return -1; // The SPI flash is invalid - - int32_t write_offset = read_offset + 4 + block_size; - if ((write_offset + 4 + block_size) > data_storage_area_size) { - SERIAL_ECHO_MSG("Not enough free space in Flash."); - return -1; // Not enough free space - } - return write_offset; - } - - bool UIFlashStorage::verify_config_data(const void *data, size_t size) { - if (!is_present) return false; - - int32_t read_addr = get_config_read_offset(size); - if (read_addr == -1) return false; - - uint32_t delim; - spi_read_begin(read_addr); - spi_read_bulk (&delim, sizeof(delim)); - bool ok = spi_verify_bulk(data,size); - spi_read_end(); - return ok && delim == delimiter; - } - - bool UIFlashStorage::read_config_data(void *data, size_t size) { - if (!is_present) return false; - - int32_t read_addr = get_config_read_offset(size); - if (read_addr == -1) return false; - - uint32_t delim; - spi_read_begin(read_addr); - spi_read_bulk (&delim, sizeof(delim)); - spi_read_bulk (data, size); - spi_read_end(); - return delim == delimiter; - } - - void UIFlashStorage::write_config_data(const void *data, size_t size) { - if (!is_present) { - SERIAL_ECHO_MSG("SPI Flash chip not present. Not saving UI settings."); - return; - } - - // Since Flash storage has a limited number of write cycles, - // make sure that the data is different before rewriting. - - if (verify_config_data(data, size)) { - SERIAL_ECHO_MSG("UI settings already written, skipping write."); - return; - } - - int16_t write_addr = get_config_write_offset(size); - if (write_addr == -1) { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Erasing UI settings from SPI Flash... "); - #ifdef DATA_STORAGE_SIZE_64K - erase_sector_64k(0); - #else - erase_sector_4k(0); - #endif - write_addr = 0; - SERIAL_ECHOLNPGM("DONE"); - } - - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR("Writing UI settings to SPI Flash (offset ", write_addr); - SERIAL_ECHOPGM(")..."); - - const uint32_t delim = delimiter; - write_addr = write(write_addr, &delim, sizeof(delim)); - write_addr = write(write_addr, data, size); - - SERIAL_ECHOLNPGM("DONE"); - } - - /************************** VERSIONING INFO AREA ************************/ - - /* The version info area follows the data storage area. If the version - * is incorrect, the data on the chip is invalid and format_flash should - * be called. - */ - - typedef struct { - uint32_t magic; - uint32_t version; - } flash_version_info; - - constexpr uint32_t version_info_addr = data_storage_area_size; - constexpr uint32_t version_info_size = 4 * 1024; // Small erase unit - - bool UIFlashStorage::is_valid() { - flash_version_info info; - - spi_read_begin(version_info_addr); - spi_read_bulk (&info, sizeof(flash_version_info)); - spi_read_end(); - - return info.magic == delimiter && info.version == flash_eeprom_version; - } - - void UIFlashStorage::write_version_info() { - flash_version_info info; - - info.magic = delimiter; - info.version = flash_eeprom_version; - - spi_write_begin(version_info_addr); - spi_write_bulk(&info, sizeof(flash_version_info)); - spi_write_end(); - } - - /**************************** MEDIA STORAGE AREA *****************************/ - - /* The media storage area follows the versioning info area. It consists - * of a file index followed by the data for one or more media files. - * - * The file index consists of an array of 32-bit file sizes. If a file - * is not present, the file's size will be set to 0xFFFFFFFF - */ - - constexpr uint32_t media_storage_addr = version_info_addr + version_info_size; - constexpr uint8_t media_storage_slots = 4; - - void UIFlashStorage::format_flash() { - SERIAL_ECHO_START(); SERIAL_ECHOPGM("Erasing SPI Flash..."); - SPIFlash::erase_chip(); - SERIAL_ECHOLNPGM("DONE"); - - write_version_info(); - } - - uint32_t UIFlashStorage::get_media_file_start(uint8_t slot) { - uint32_t addr = media_storage_addr + sizeof(uint32_t) * media_storage_slots; - spi_read_begin(media_storage_addr); - for (uint8_t i = 0; i < slot; i++) - addr += spi_read_32(); - spi_read_end(); - return addr; - } - - void UIFlashStorage::set_media_file_size(uint8_t slot, uint32_t size) { - spi_write_begin(media_storage_addr + sizeof(uint32_t) * slot); - spi_write_32(size); - spi_write_end(); - } - - uint32_t UIFlashStorage::get_media_file_size(uint8_t slot) { - spi_read_begin(media_storage_addr + sizeof(uint32_t) * slot); - uint32_t size = spi_read_32(); - spi_read_end(); - return size; - } - - /* Writes a media file from the SD card/USB flash drive into a slot on the SPI Flash. Media - * files must be written sequentially following by a chip erase and it is not possible to - * overwrite files. */ - UIFlashStorage::error_t UIFlashStorage::write_media_file(progmem_str filename, uint8_t slot) { - #if ENABLED(SDSUPPORT) - uint32_t addr; - uint8_t buff[write_page_size]; - - strcpy_P( (char*) buff, (const char*) filename); - - MediaFileReader reader; - if (!reader.open((char*) buff)) { - SERIAL_ECHO_MSG("Unable to find media file"); - return FILE_NOT_FOUND; - } - - if (get_media_file_size(slot) != 0xFFFFFFFFUL) { - SERIAL_ECHO_MSG("Media file already exists"); - return WOULD_OVERWRITE; - } - - SERIAL_ECHO_START(); SERIAL_ECHOPGM("Writing SPI Flash..."); - - set_media_file_size(slot, reader.size()); - addr = get_media_file_start(slot); - - // Write out the file itself - for (;;) { - const int16_t nBytes = reader.read(buff, write_page_size); - if (nBytes == -1) { - SERIAL_ECHOLNPGM("Failed to read from file"); - return READ_ERROR; - } - - addr = write(addr, buff, nBytes); - if (nBytes != write_page_size) break; - - TERN_(EXTENSIBLE_UI, ExtUI::yield()); - } - - SERIAL_ECHOLNPGM("DONE"); - - SERIAL_ECHO_START(); SERIAL_ECHOPGM("Verifying SPI Flash..."); - - bool verifyOk = true; - - // Verify the file index - - if (get_media_file_start(slot+1) != (get_media_file_start(slot) + reader.size())) { - SERIAL_ECHOLNPGM("File index verification failed. "); - verifyOk = false; - } - - // Verify the file itself - addr = get_media_file_start(slot); - reader.rewind(); - - while (verifyOk) { - const int16_t nBytes = reader.read(buff, write_page_size); - if (nBytes == -1) { - SERIAL_ECHOPGM("Failed to read from file"); - verifyOk = false; - break; - } - - spi_read_begin(addr); - if (!spi_verify_bulk(buff, nBytes)) { - verifyOk = false; - spi_read_end(); - break; - } - spi_read_end(); - - addr += nBytes; - if (nBytes != write_page_size) break; - TERN_(EXTENSIBLE_UI, ExtUI::yield()); - }; - - if (verifyOk) { - SERIAL_ECHOLNPGM("DONE"); - return SUCCESS; - } - else { - SERIAL_ECHOLNPGM("FAIL"); - return VERIFY_ERROR; - } - #else - return VERIFY_ERROR; - #endif // SDSUPPORT - } - - bool UIFlashStorage::BootMediaReader::isAvailable(uint32_t slot) { - if (!is_present) return false; - - bytes_remaining = get_media_file_size(slot); - if (bytes_remaining != 0xFFFFFFFFUL) { - SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("Boot media file size:", bytes_remaining); - addr = get_media_file_start(slot); - return true; - } - return false; - } - - int16_t UIFlashStorage::BootMediaReader::read(void *data, const size_t size) { - if (bytes_remaining == 0xFFFFFFFFUL) return -1; - - if (size > bytes_remaining) - return read(data, bytes_remaining); - - if (size > 0) { - spi_read_begin(addr); - spi_read_bulk(data, size); - spi_read_end(); - addr += size; - bytes_remaining -= size; - } - - return size; - } - - int16_t UIFlashStorage::BootMediaReader::read(void *obj, void *data, const size_t size) { - return reinterpret_cast(obj)->read(data, size); - } - -#else - void UIFlashStorage::initialize() {} - bool UIFlashStorage::is_valid() {return true;} - void UIFlashStorage::write_config_data(const void *, size_t) {} - bool UIFlashStorage::verify_config_data(const void *, size_t) {return false;} - bool UIFlashStorage::read_config_data(void *, size_t ) {return false;} - UIFlashStorage::error_t UIFlashStorage::write_media_file(progmem_str, uint8_t) {return FILE_NOT_FOUND;} - void UIFlashStorage::format_flash() {} - - bool UIFlashStorage::BootMediaReader::isAvailable(uint32_t) {return false;} - int16_t UIFlashStorage::BootMediaReader::read(void *, const size_t) {return -1;} - int16_t UIFlashStorage::BootMediaReader::read(void *, void *, const size_t) {return -1;} -#endif // SPI_FLASH_SS -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h deleted file mode 100644 index 3edc2a9de1..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h +++ /dev/null @@ -1,106 +0,0 @@ -/******************* - * flash_storage.h * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -class SPIFlash { - public: - static constexpr uint32_t erase_unit_size = 4 * 1024; // Minimum erase unit - static constexpr uint32_t write_page_size = 256; // Minimum page write unit - - enum { - READ_STATUS_1 = 0x05, - READ_STATUS_2 = 0x35, - READ_STATUS_3 = 0x33, - WRITE_ENABLE = 0x06, - WRITE_DISABLE = 0x04, - READ_ID = 0x90, - READ_JEDEC_ID = 0x9F, - READ_DATA = 0x03, - PAGE_PROGRAM = 0x02, - ERASE_4K = 0x20, - ERASE_64K = 0xD8, - ERASE_CHIP = 0xC7 - }; - - static void wait_while_busy(); - static void erase_sector_4k(uint32_t addr); - static void erase_sector_64k(uint32_t addr); - static void erase_chip (); - - static void read_jedec_id(uint8_t &manufacturer_id, uint8_t &device_type, uint8_t &capacity); - - static void spi_read_begin(uint32_t addr); - static void spi_read_end(); - - static void spi_write_begin(uint32_t addr); - static void spi_write_end(); - - static uint32_t write(uint32_t addr, const void *data, size_t size); - static uint32_t read(uint32_t addr, void *data, size_t size); -}; - -class UIFlashStorage : private SPIFlash { - private: - - static bool is_present; - static int32_t get_config_read_offset(uint32_t block_size); - static int32_t get_config_write_offset(uint32_t block_size); - - static uint32_t get_media_file_start(uint8_t slot); - static void set_media_file_size(uint8_t slot, uint32_t size); - static uint32_t get_media_file_size(uint8_t slot); - - static constexpr uint32_t delimiter = 0x4D524C4E; // 'MRLN' - public: - enum error_t { - SUCCESS, - FILE_NOT_FOUND, - READ_ERROR, - VERIFY_ERROR, - WOULD_OVERWRITE - }; - - static void initialize (); - static void format_flash (); - static bool check_known_device(); - - static bool is_valid (); - static void write_version_info(); - - static void write_config_data (const void *data, size_t size); - static bool verify_config_data (const void *data, size_t size); - static bool read_config_data (void *data, size_t size); - static error_t write_media_file (progmem_str filename, uint8_t slot = 0); - - class BootMediaReader; -}; - -class UIFlashStorage::BootMediaReader { - private: - uint32_t addr; - uint32_t bytes_remaining; - - public: - bool isAvailable(uint32_t slot = 0); - int16_t read(void *buffer, size_t const size); - - static int16_t read(void *obj, void *buffer, const size_t size); -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp deleted file mode 100644 index 46683401dc..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/************************ - * media_filereader.cpp * - ************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../compat.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "media_file_reader.h" - - #if ENABLED(SDSUPPORT) - bool MediaFileReader::open(const char* filename) { - card.init(SPI_SPEED, SDSS); - volume.init(&card); - root.openRoot(&volume); - return file.open(&root, filename, O_READ); - } - - int16_t MediaFileReader::read(void *buff, size_t bytes) { - return file.read(buff, bytes); - } - - void MediaFileReader::close() { - file.close(); - } - - uint32_t MediaFileReader::size() { - return file.fileSize(); - } - - void MediaFileReader::rewind() { - file.rewind(); - } - - int16_t MediaFileReader::read(void *obj, void *buff, size_t bytes) { - return reinterpret_cast(obj)->read(buff, bytes); - } - #else - bool MediaFileReader::open(const char*) {return -1;} - int16_t MediaFileReader::read(void *, size_t) {return 0;} - void MediaFileReader::close() {} - uint32_t MediaFileReader::size() {return 0;} - void MediaFileReader::rewind() {} - int16_t MediaFileReader::read(void *, void *, size_t) {return 0;} - #endif -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h deleted file mode 100644 index fcaa610e8b..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h +++ /dev/null @@ -1,48 +0,0 @@ -/********************** - * media_filereader.h * - **********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "../../../../../inc/MarlinConfigPre.h" - -#if ENABLED(SDSUPPORT) - #include "../../../../../sd/SdFile.h" - #include "../../../../../sd/cardreader.h" -#endif - -class MediaFileReader { - private: - #if ENABLED(SDSUPPORT) - Sd2Card card; - SdVolume volume; - SdFile root, file; - #endif - - public: - bool open(const char* filename); - int16_t read(void *buff, size_t bytes); - uint32_t size(); - void rewind(); - void close(); - - static int16_t read(void *obj, void *buff, size_t bytes); -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h deleted file mode 100644 index 11ad0798b5..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h +++ /dev/null @@ -1,52 +0,0 @@ -/************ - * compat.h * - ************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/** - * This following provides compatibility whether compiling - * as a part of Marlin or outside it - */ - -#ifdef __has_include - #if __has_include("../../ui_api.h") - #include "../../ui_api.h" - #endif -#else - #include "../../ui_api.h" -#endif - -#ifdef __MARLIN_FIRMWARE__ - // __MARLIN_FIRMWARE__ exists when compiled within Marlin. - #include "pin_mappings.h" - #undef max - #define max(a,b) ((a)>(b)?(a):(b)) - #undef min - #define min(a,b) ((a)<(b)?(a):(b)) -#else - namespace UI { - static inline uint32_t safe_millis() {return millis();}; - static inline void yield() {}; - }; -#endif - -class __FlashStringHelper; -typedef const __FlashStringHelper *progmem_str; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h deleted file mode 100644 index 7476c9e67e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h +++ /dev/null @@ -1,26 +0,0 @@ -/************ - * config.h * - ************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "compat.h" - -// Configure this display with options in Configuration_adv.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/LICENSE.txt b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/LICENSE.txt deleted file mode 100644 index e60008693e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/README.md b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/README.md deleted file mode 100644 index 6ba985d600..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/README.md +++ /dev/null @@ -1,28 +0,0 @@ -FTDI EVE Library ----------------- - -The FTDI EVE Library is a fully open-source library and UI framework for the FTDI -FT800 and FT810 graphics processor. - -Although the library has been developed within Lulzbot for providing a user interface -for Marlin, the library has been written so that it can be used in any Arduino sketch. - -The library is split into two parts. The "basic" API provides a shallow interface to -the underlying FTDI hardware and command FIFO and provides low-level access to the -hardware as closely as possible to the API described in the FTDI Programmer's Guide. - -The "extended" API builds on top of the "basic" API to provide a GUI framework for -handling common challenges in building a usable GUI. The GUI framework provides the -following features: - -- Macros for a resolution-independent placement of widgets based on a grid. -- Class-based UI screens, with press and unpress touch events, as well as touch repeat. -- Event loop with button debouncing and button push visual and auditory feedback. -- Easy screen-to-screen navigation including a navigation stack for going backwards. -- Visual feedback for disabled vs enabled buttons, and custom button styles. -- A sound player class for playing individual notes or complete sound sequences. -- Display list caching, for storing static background elements of a screen in RAM_G. - -See the "examples" folder for Arduino sketches. Modify the "src/config.h" file in -each to suit your particular setup. The "sample_configs" contain sample configuration -files for running the sketches on our 3D printer boards. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h deleted file mode 100644 index c09d10f148..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h +++ /dev/null @@ -1,184 +0,0 @@ -/************ - * boards.h * - ************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#define HAS_RESOLUTION (defined(TOUCH_UI_320x240) || defined(TOUCH_UI_480x272) || defined(TOUCH_UI_800x480)) - -#define IS_FT800 \ - constexpr uint16_t ftdi_chip = 800; \ - using namespace FTDI_FT800; \ - namespace DL { \ - using namespace FTDI_FT800_DL; \ - } \ - typedef ft800_memory_map ftdi_memory_map; \ - typedef ft800_registers ftdi_registers; - -#define IS_FT810 \ - constexpr uint16_t ftdi_chip = 810; \ - using namespace FTDI_FT810; \ - namespace DL { \ - using namespace FTDI_FT800_DL; \ - using namespace FTDI_FT810_DL; \ - } \ - typedef ft810_memory_map ftdi_memory_map; \ - typedef ft810_registers ftdi_registers; - -#ifdef LCD_FTDI_VM800B35A - #if !HAS_RESOLUTION - #define TOUCH_UI_320x240 - #endif - #ifndef FTDI_API_LEVEL - #define FTDI_API_LEVEL 800 - #endif - namespace FTDI { - IS_FT800 - constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated - constexpr bool GPIO_0_Audio_Enable = false; /* 1 = does use GPIO00 for amplifier control, 0 = not in use for Audio */ - constexpr bool GPIO_1_Audio_Shutdown = true; /* 1 = does use GPIO01 for amplifier control, 0 = not in use for Audio */ - constexpr uint8_t Swizzle = 2; - constexpr uint8_t CSpread = 1; - - constexpr uint16_t touch_threshold = 1200; /* touch-sensitivity */ - } - -/** - * Settings for the Haoyu Electronics, 4.3" Graphical LCD Touchscreen, 480x272, SPI, FT800 (FT800CB-HY43B) - * and 5" Graphical LCD Touchscreen, 480x272, SPI, FT800 (FT800CB-HY50B) - * http://www.hotmcu.com/43-graphical-lcd-touchscreen-480x272-spi-ft800-p-111.html?cPath=6_16 - * http://www.hotmcu.com/5-graphical-lcd-touchscreen-480x272-spi-ft800-p-124.html?cPath=6_16 - * Datasheet: - * https://www.hantronix.com/files/data/1278363262430-3.pdf - * https://www.haoyuelectronics.com/Attachment/HY43-LCD/LCD%20DataSheet.pdf - * https://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf - */ -#elif defined(LCD_HAOYU_FT800CB) - #if !HAS_RESOLUTION - #define TOUCH_UI_480x272 - #endif - #ifndef FTDI_API_LEVEL - #define FTDI_API_LEVEL 800 - #endif - namespace FTDI { - IS_FT800 - constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated - constexpr bool GPIO_0_Audio_Enable = false; - constexpr bool GPIO_1_Audio_Shutdown = false; - constexpr uint8_t Swizzle = 0; - constexpr uint8_t CSpread = 1; - constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ - } - -/** - * Settings for the Haoyu Electronics, 5" Graphical LCD Touchscreen, 800x480, SPI, FT810 - * http://www.hotmcu.com/5-graphical-lcd-touchscreen-800x480-spi-ft810-p-286.html - * Datasheet: - * https://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf - */ -#elif defined(LCD_HAOYU_FT810CB) - #if !HAS_RESOLUTION - #define TOUCH_UI_800x480 - #endif - #ifndef FTDI_API_LEVEL - #define FTDI_API_LEVEL 810 - #endif - namespace FTDI { - IS_FT810 - constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated - constexpr bool GPIO_0_Audio_Enable = false; - constexpr bool GPIO_1_Audio_Shutdown = false; - constexpr uint8_t Swizzle = 0; - constexpr uint8_t CSpread = 1; - constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ - } - -/** - * Settings for the 4D Systems, 4.3" Embedded SPI Display 480x272, SPI, FT800 (4DLCD-FT843) - * https://4dsystems.com.au/4dlcd-ft843 - * Datasheet: - * https://4dsystems.com.au/mwdownloads/download/link/id/52/ - */ -#elif defined(LCD_4DSYSTEMS_4DLCD_FT843) - #if !HAS_RESOLUTION - #define TOUCH_UI_480x272 - #endif - #ifndef FTDI_API_LEVEL - #define FTDI_API_LEVEL 800 - #endif - namespace FTDI { - IS_FT800 - constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated - constexpr bool GPIO_0_Audio_Enable = false; - constexpr bool GPIO_1_Audio_Shutdown = true; - constexpr uint8_t Swizzle = 0; - constexpr uint8_t CSpread = 1; - constexpr uint16_t touch_threshold = 1200; /* touch-sensitivity */ - } - -/** - * Settings for the Aleph Objects Color LCD User Interface - * Datasheet https://www.hantronix.com/files/data/s1501799605s500-gh7.pdf - */ -#elif defined(LCD_ALEPHOBJECTS_CLCD_UI) - #if !HAS_RESOLUTION - #define TOUCH_UI_800x480 - #endif - #ifndef FTDI_API_LEVEL - #define FTDI_API_LEVEL 810 - #endif - namespace FTDI { - IS_FT810 - constexpr bool Use_Crystal = false; // 0 = use internal oscillator, 1 = module has a crystal populated - constexpr bool GPIO_0_Audio_Enable = true; // The AO CLCD uses GPIO0 to enable audio - constexpr bool GPIO_1_Audio_Shutdown = false; - constexpr uint8_t Swizzle = 0; - constexpr uint8_t CSpread = 0; - constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ - } - -/** - * FYSETC Color LCD - * https://www.aliexpress.com/item/4000627651757.html - * Product information: - * https://github.com/FYSETC/TFT81050 - */ -#elif defined(LCD_FYSETC_TFT81050) - #if !HAS_RESOLUTION - #define TOUCH_UI_800x480 - #endif - #ifndef FTDI_API_LEVEL - #define FTDI_API_LEVEL 810 - #endif - namespace FTDI { - IS_FT810 - constexpr bool Use_Crystal = false; // 0 = use internal oscillator, 1 = module has a crystal populated - constexpr bool GPIO_0_Audio_Enable = true; // The AO CLCD uses GPIO0 to enable audio - constexpr bool GPIO_1_Audio_Shutdown = false; - constexpr uint8_t Swizzle = 0; - constexpr uint8_t CSpread = 0; - constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ - } -#else - - #error "Unknown or no TOUCH_UI_FTDI_EVE board specified. To add a new board, modify this file." - -#endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp deleted file mode 100644 index bb95411e06..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ /dev/null @@ -1,1186 +0,0 @@ -/**************** - * commands.cpp * - ****************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_basic.h" - -#ifdef FTDI_BASIC - -#define MULTIPLE_OF_4(val) ((((val)+3)>>2)<<2) - -using namespace FTDI; -using namespace FTDI::SPI; - -void CLCD::enable() { - mem_write_8(REG::PCLK, Pclk); -} - -void CLCD::disable() { - mem_write_8(REG::PCLK, 0x00); -} - -void CLCD::set_brightness(uint8_t brightness) { - mem_write_8(REG::PWM_DUTY, min(128,brightness)); -} - -uint8_t CLCD::get_brightness() { - return mem_read_8(REG::PWM_DUTY); -} - -void CLCD::turn_on_backlight() { - mem_write_8(REG::PWM_DUTY, 128); -} - -void CLCD::FontMetrics::load(const uint8_t font) { - static_assert(sizeof(FontMetrics) == 148, "Sizeof font metrics is incorrect"); - uint32_t rom_fontroot = mem_read_32(MAP::ROM_FONT_ADDR); - mem_read_bulk(rom_fontroot + 148 * (font - 16), (uint8_t*) this, 148); -} - -uint16_t CLCD::FontMetrics::get_text_width(const char *str, size_t n) const { - uint16_t width = 0; - const uint8_t *p = (const uint8_t *) str; - for (;;) { - const uint8_t val = *p++; n--; - if (!val || n == 0) break; - width += val < 128 ? char_widths[val] : 0; - } - return width; -} - -uint16_t CLCD::FontMetrics::get_text_width(progmem_str str, size_t n) const { - uint16_t width = 0; - const uint8_t *p = (const uint8_t *) str; - for (;;) { - const uint8_t val = pgm_read_byte(p++); n--; - if (!val || n == 0) break; - width += val < 128 ? char_widths[val] : 0; - } - return width; -} - -/************************** HOST COMMAND FUNCTION *********************************/ - -void CLCD::host_cmd(unsigned char host_command, unsigned char byte2) { // Sends 24-Bit Host Command to LCD - if (host_command != FTDI::ACTIVE) { - host_command |= 0x40; - } - spi_ftdi_select(); - spi_send(host_command); - spi_send(byte2); - spi_send(0x00); - spi_ftdi_deselect(); -} - -/************************** MEMORY READ FUNCTIONS *********************************/ - -void CLCD::spi_read_addr(uint32_t reg_address) { - spi_send((reg_address >> 16) & 0x3F); // Address [21:16] - spi_send((reg_address >> 8 ) & 0xFF); // Address [15:8] - spi_send((reg_address >> 0) & 0xFF); // Address [7:0] - spi_send(0x00); // Dummy Byte -} - -// Write 4-Byte Address, Read Multiple Bytes -void CLCD::mem_read_bulk(uint32_t reg_address, uint8_t *data, uint16_t len) { - spi_ftdi_select(); - spi_read_addr(reg_address); - spi_read_bulk (data, len); - spi_ftdi_deselect(); -} - -// Write 4-Byte Address, Read 1-Byte Data -uint8_t CLCD::mem_read_8(uint32_t reg_address) { - spi_ftdi_select(); - spi_read_addr(reg_address); - uint8_t r_data = spi_read_8(); - spi_ftdi_deselect(); - return r_data; -} - -// Write 4-Byte Address, Read 2-Bytes Data -uint16_t CLCD::mem_read_16(uint32_t reg_address) { - using namespace SPI::least_significant_byte_first; - spi_ftdi_select(); - spi_read_addr(reg_address); - uint16_t r_data = spi_read_16(); - spi_ftdi_deselect(); - return r_data; -} - -// Write 4-Byte Address, Read 4-Bytes Data -uint32_t CLCD::mem_read_32(uint32_t reg_address) { - using namespace SPI::least_significant_byte_first; - spi_ftdi_select(); - spi_read_addr(reg_address); - uint32_t r_data = spi_read_32(); - spi_ftdi_deselect(); - return r_data; -} - -/************************** MEMORY WRITE FUNCTIONS *********************************/ - -// Generic operations for transforming a byte, for use with _mem_write_bulk: -static inline uint8_t reverse_byte(uint8_t a) { - return ((a & 0x1) << 7) | ((a & 0x2) << 5) | - ((a & 0x4) << 3) | ((a & 0x8) << 1) | - ((a & 0x10) >> 1) | ((a & 0x20) >> 3) | - ((a & 0x40) >> 5) | ((a & 0x80) >> 7); -} -static inline uint8_t xbm_write(const uint8_t *p) {return reverse_byte(pgm_read_byte(p));} - -void CLCD::spi_write_addr(uint32_t reg_address) { - spi_send((reg_address >> 16) | 0x80); // Address [21:16] - spi_send((reg_address >> 8 ) & 0xFF); // Address [15:8] - spi_send((reg_address >> 0) & 0xFF); // Address [7:0] -} - -// Write 3-Byte Address, Multiple Bytes, plus padding bytes, from RAM -void CLCD::mem_write_bulk(uint32_t reg_address, const void *data, uint16_t len, uint8_t padding) { - spi_ftdi_select(); - spi_write_addr(reg_address); - spi_write_bulk(data, len, padding); - spi_ftdi_deselect(); -} - -// Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM -void CLCD::mem_write_bulk(uint32_t reg_address, progmem_str str, uint16_t len, uint8_t padding) { - spi_ftdi_select(); - spi_write_addr(reg_address); - spi_write_bulk(str, len, padding); - spi_ftdi_deselect(); -} - - // Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM -void CLCD::mem_write_pgm(uint32_t reg_address, const void *data, uint16_t len, uint8_t padding) { - spi_ftdi_select(); - spi_write_addr(reg_address); - spi_write_bulk(data, len, padding); - spi_ftdi_deselect(); -} - -// Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM, reversing bytes (suitable for loading XBM images) -void CLCD::mem_write_xbm(uint32_t reg_address, progmem_str data, uint16_t len, uint8_t padding) { - spi_ftdi_select(); - spi_write_addr(reg_address); - spi_write_bulk(data, len, padding); - spi_ftdi_deselect(); -} - -// Write 3-Byte Address, Write 1-Byte Data -void CLCD::mem_write_8(uint32_t reg_address, uint8_t data) { - spi_ftdi_select(); - spi_write_addr(reg_address); - spi_write_8(data); - spi_ftdi_deselect(); -} - -// Write 3-Byte Address, Write 2-Bytes Data -void CLCD::mem_write_16(uint32_t reg_address, uint16_t data) { - using namespace SPI::least_significant_byte_first; - spi_ftdi_select(); - spi_write_addr(reg_address); - spi_write_16(data); - spi_ftdi_deselect(); -} - -// Write 3-Byte Address, Write 4-Bytes Data -void CLCD::mem_write_32(uint32_t reg_address, uint32_t data) { - using namespace SPI::least_significant_byte_first; - spi_ftdi_select(); - spi_write_addr(reg_address); - spi_write_32(data); - spi_ftdi_deselect(); -} - -/******************* FT800/810 Co-processor Commands *********************************/ - -#if FTDI_API_LEVEL == 800 -uint32_t CLCD::CommandFifo::command_write_ptr = 0xFFFFFFFFul; -#endif - -void CLCD::CommandFifo::cmd(uint32_t cmd32) { - write((void*)&cmd32, sizeof(uint32_t)); -} - -void CLCD::CommandFifo::cmd(void* data, uint16_t len) { - write(data, len); -} - -void CLCD::CommandFifo::bgcolor(uint32_t rgb) { - cmd(CMD_BGCOLOR); - cmd(rgb); -} - -void CLCD::CommandFifo::fgcolor(uint32_t rgb) { - cmd(CMD_FGCOLOR); - cmd(rgb); -} - -void CLCD::CommandFifo::gradcolor(uint32_t rgb) { - cmd(CMD_GRADCOLOR); - cmd(rgb); -} - -// This sends the a text command to the command preprocessor, must be followed by str() -void CLCD::CommandFifo::button(int16_t x, int16_t y, int16_t w, int16_t h, int16_t font, uint16_t option) { - struct { - int32_t type = CMD_BUTTON; - int16_t x; - int16_t y; - int16_t w; - int16_t h; - int16_t font; - uint16_t option; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.w = w; - cmd_data.h = h; - cmd_data.font = font; - cmd_data.option = option; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -// This sends the a text command to the command preprocessor, must be followed by str() -void CLCD::CommandFifo::text(int16_t x, int16_t y, int16_t font, uint16_t options) { - struct { - int32_t type = CMD_TEXT; - int16_t x; - int16_t y; - int16_t font; - uint16_t options; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.font = font; - cmd_data.options = options; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -// This sends the a toggle command to the command preprocessor, must be followed by str() -void CLCD::CommandFifo::toggle(int16_t x, int16_t y, int16_t w, int16_t font, uint16_t options, bool state) { - struct { - int32_t type = CMD_TOGGLE; - int16_t x; - int16_t y; - int16_t w; - int16_t font; - uint16_t options; - uint16_t state; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.w = w; - cmd_data.font = font; - cmd_data.options = options; - cmd_data.state = state ? 65535 : 0; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -// This sends the a keys command to the command preprocessor, must be followed by str() -void CLCD::CommandFifo::keys(int16_t x, int16_t y, int16_t w, int16_t h, int16_t font, uint16_t options) { - struct { - int32_t type = CMD_KEYS; - int16_t x; - int16_t y; - int16_t w; - int16_t h; - int16_t font; - uint16_t options; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.w = w; - cmd_data.h = h; - cmd_data.font = font; - cmd_data.options = options; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::clock(int16_t x, int16_t y, int16_t r, uint16_t options, int16_t h, int16_t m, int16_t s, int16_t ms) -{ - struct { - int32_t type = CMD_CLOCK; - int16_t x; - int16_t y; - int16_t r; - uint16_t options; - int16_t h; - int16_t m; - int16_t s; - int16_t ms; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.r = r; - cmd_data.options = options; - cmd_data.h = h; - cmd_data.m = m; - cmd_data.s = s; - cmd_data.ms = ms; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::gauge(int16_t x, int16_t y, int16_t r, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range) -{ - struct { - int32_t type = CMD_GAUGE; - int16_t x; - int16_t y; - int16_t r; - uint16_t options; - uint16_t major; - uint16_t minor; - uint16_t val; - uint16_t range; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.r = r; - cmd_data.options = options; - cmd_data.major = major; - cmd_data.minor = minor; - cmd_data.val = val; - cmd_data.range = range; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::dial(int16_t x, int16_t y, int16_t r, uint16_t options, uint16_t val) -{ - struct { - int32_t type = CMD_DIAL; - int16_t x; - int16_t y; - int16_t r; - uint16_t options; - uint16_t val; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.r = r; - cmd_data.options = options; - cmd_data.val = val; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::scrollbar(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t size, uint16_t range) { - struct { - int32_t type = CMD_SCROLLBAR; - int16_t x; - int16_t y; - int16_t w; - uint16_t h; - uint16_t options; - uint16_t val; - uint16_t size; - uint16_t range; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.w = w; - cmd_data.h = h; - cmd_data.options = options; - cmd_data.val = val; - cmd_data.size = size; - cmd_data.range = range; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::progress(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range) { - struct { - int32_t type = CMD_PROGRESS; - int16_t x; - int16_t y; - int16_t w; - int16_t h; - uint16_t options; - uint16_t val; - uint16_t range; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.w = w; - cmd_data.h = h; - cmd_data.options = options; - cmd_data.val = val; - cmd_data.range = range; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::slider(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range) { - struct { - int32_t type = CMD_SLIDER; - int16_t x; - int16_t y; - int16_t w; - int16_t h; - uint16_t options; - uint16_t val; - uint16_t range; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.w = w; - cmd_data.h = h; - cmd_data.options = options; - cmd_data.val = val; - cmd_data.range = range; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::gradient(int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1) { - struct { - int32_t type = CMD_GRADIENT; - int16_t x0; - int16_t y0; - uint32_t rgb0; - int16_t x1; - int16_t y1; - uint32_t rgb1; - } cmd_data; - - cmd_data.x0 = x0; - cmd_data.y0 = y0; - cmd_data.rgb0 = rgb0; - cmd_data.x1 = x1; - cmd_data.y1 = y1; - cmd_data.rgb1 = rgb1; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::number(int16_t x, int16_t y, int16_t font, uint16_t options, int32_t n) { - struct { - int32_t type = CMD_NUMBER; - int16_t x; - int16_t y; - int16_t font; - uint16_t options; - int16_t n; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.font = font; - cmd_data.options = options; - cmd_data.n = n; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::memzero(uint32_t ptr, uint32_t size) { - struct { - uint32_t type = CMD_MEMZERO; - uint32_t ptr; - uint32_t size; - } cmd_data; - - cmd_data.ptr = ptr; - cmd_data.size = size; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::memset(uint32_t ptr, uint32_t val, uint32_t size) { - struct { - uint32_t type = CMD_MEMSET; - uint32_t ptr; - uint32_t val; - uint32_t size; - } cmd_data; - - cmd_data.ptr = ptr; - cmd_data.val = val; - cmd_data.size = size; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::memcpy(uint32_t dst, uint32_t src, uint32_t size) { - struct { - uint32_t type = CMD_MEMCPY; - uint32_t dst; - uint32_t src; - uint32_t size; - } cmd_data; - - cmd_data.dst = dst; - cmd_data.src = src; - cmd_data.size = size; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::memcrc(uint32_t ptr, uint32_t num, uint32_t result) { - struct { - uint32_t type = CMD_MEMCRC; - uint32_t ptr; - uint32_t num; - uint32_t result; - } cmd_data; - - cmd_data.ptr = ptr; - cmd_data.num = num; - cmd_data.result = result; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::memwrite(uint32_t ptr, uint32_t value) { - struct { - uint32_t type = CMD_MEMWRITE; - uint32_t ptr; - uint32_t num; - uint32_t value; - } cmd_data; - - cmd_data.ptr = ptr; - cmd_data.num = 4; - cmd_data.value = value; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::append(uint32_t ptr, uint32_t size) { - struct { - uint32_t type = CMD_APPEND; - uint32_t ptr; - uint32_t size; - } cmd_data; - - cmd_data.ptr = ptr; - cmd_data.size = size; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::inflate(uint32_t ptr) { - struct { - uint32_t type = CMD_INFLATE; - uint32_t ptr; - } cmd_data; - - cmd_data.ptr = ptr; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::getptr(uint32_t result) { - struct { - uint32_t type = CMD_GETPTR; - uint32_t result; - } cmd_data; - - cmd_data.result = result; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::track(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t tag) { - struct { - uint32_t type = CMD_TRACK; - int16_t x; - int16_t y; - int16_t w; - int16_t h; - int16_t tag; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.w = w; - cmd_data.h = h; - cmd_data.tag = tag; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::sketch(int16_t x, int16_t y, uint16_t w, uint16_t h, uint32_t ptr, uint16_t format) { - struct { - uint32_t type = CMD_SKETCH; - int16_t x; - int16_t y; - uint16_t w; - uint16_t h; - uint32_t ptr; - uint16_t format; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.w = w; - cmd_data.h = h; - cmd_data.ptr = ptr; - cmd_data.format = format; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::snapshot(uint32_t ptr) { - struct { - uint32_t type = CMD_SNAPSHOT; - uint32_t ptr; - } cmd_data; - - cmd_data.ptr = ptr; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::spinner(int16_t x, int16_t y, uint16_t style, uint16_t scale) { - struct { - uint32_t type = CMD_SPINNER; - uint16_t x; - uint16_t y; - uint16_t style; - uint16_t scale; - } cmd_data; - - cmd_data.x = x; - cmd_data.y = y; - cmd_data.style = style; - cmd_data.scale = scale; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::loadimage(uint32_t ptr, uint32_t options) { - struct { - uint32_t type = CMD_LOADIMAGE; - uint32_t ptr; - uint32_t options; - } cmd_data; - - cmd_data.ptr = ptr; - cmd_data.options = options; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::getprops(uint32_t ptr, uint32_t width, uint32_t height) { - struct { - uint32_t type = CMD_GETPROPS; - uint32_t ptr; - uint32_t width; - uint32_t height; - } cmd_data; - - cmd_data.ptr = ptr; - cmd_data.width = width; - cmd_data.height = height; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::scale(int32_t sx, int32_t sy) { - struct { - uint32_t type = CMD_SCALE; - int32_t sx; - int32_t sy; - } cmd_data; - - cmd_data.sx = sx; - cmd_data.sy = sy; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::rotate(int32_t a) { - struct { - uint32_t type = CMD_ROTATE; - int32_t a; - } cmd_data; - - cmd_data.a = a; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -void CLCD::CommandFifo::translate(int32_t tx, int32_t ty) { - struct { - uint32_t type = CMD_TRANSLATE; - int32_t tx; - int32_t ty; - } cmd_data; - - cmd_data.tx = tx; - cmd_data.ty = ty; - - cmd( &cmd_data, sizeof(cmd_data) ); -} - -#if FTDI_API_LEVEL >= 810 -void CLCD::CommandFifo::setbase(uint8_t base) { - struct { - int32_t type = CMD_SETBASE; - uint32_t base; - } cmd_data; - - cmd_data.base = base; - - cmd( &cmd_data, sizeof(cmd_data) ); -} -#endif - -#if FTDI_API_LEVEL >= 810 -void CLCD::CommandFifo::setbitmap(uint32_t addr, uint16_t fmt, uint16_t w, uint16_t h) { - struct { - uint32_t type = CMD_SETBITMAP; - uint32_t addr; - uint16_t fmt; - uint16_t w; - uint16_t h; - uint16_t dummy; - } cmd_data; - - cmd_data.addr = addr; - cmd_data.fmt = fmt; - cmd_data.w = w; - cmd_data.h = h; - cmd_data.dummy = 0; - - cmd( &cmd_data, sizeof(cmd_data) ); -} -#endif - -#if FTDI_API_LEVEL >= 810 -void CLCD::CommandFifo::snapshot2(uint32_t format, uint32_t ptr, int16_t x, int16_t y, uint16_t w, uint16_t h) { - struct { - uint32_t type = CMD_SNAPSHOT2; - uint32_t format; - uint32_t ptr; - int16_t x; - int16_t y; - uint16_t w; - uint16_t h; - } cmd_data; - - cmd_data.format = format; - cmd_data.ptr = ptr; - cmd_data.x = x; - cmd_data.y = y; - cmd_data.w = w; - cmd_data.h = h; - - cmd( &cmd_data, sizeof(cmd_data) ); -} -#endif - -#if FTDI_API_LEVEL >= 810 -void CLCD::CommandFifo::mediafifo(uint32_t ptr, uint32_t size) { - struct { - uint32_t type = CMD_MEDIAFIFO; - uint32_t ptr; - uint32_t size; - } cmd_data; - - cmd_data.ptr = ptr; - cmd_data.size = size; - - cmd( &cmd_data, sizeof(cmd_data) ); -} -#endif - -#if FTDI_API_LEVEL >= 810 -void CLCD::CommandFifo::videostart() { - cmd( CMD_VIDEOSTART ); -} -#endif - -#if FTDI_API_LEVEL >= 810 -void CLCD::CommandFifo::videoframe(uint32_t dst, uint32_t ptr) { - struct { - uint32_t type = CMD_VIDEOFRAME; - uint32_t dst; - uint32_t ptr; - } cmd_data; - - cmd_data.dst = dst; - cmd_data.ptr = ptr; - - cmd( &cmd_data, sizeof(cmd_data) ); -} -#endif - -#if FTDI_API_LEVEL >= 810 -void CLCD::CommandFifo::playvideo(uint32_t options) { - struct { - uint32_t type = CMD_PLAYVIDEO; - uint32_t options; - } cmd_data; - - cmd_data.options = options; - - cmd( &cmd_data, sizeof(cmd_data) ); -} -#endif - -#if FTDI_API_LEVEL >= 810 -void CLCD::CommandFifo::setrotate(uint8_t rotation) { - struct { - uint32_t type = CMD_SETROTATE; - uint32_t rotation; - } cmd_data; - - cmd_data.rotation = rotation; - - cmd( &cmd_data, sizeof(cmd_data) ); -} -#endif - -#if FTDI_API_LEVEL >= 810 -void CLCD::CommandFifo::romfont(uint8_t font, uint8_t romslot) { - struct { - uint32_t type = CMD_ROMFONT; - uint32_t font; - uint32_t romslot; - } cmd_data; - - cmd_data.font = font; - cmd_data.romslot = romslot; - - cmd( &cmd_data, sizeof(cmd_data) ); -} -#endif - -/**************************** FT800/810 Co-Processor Command FIFO ****************************/ - -bool CLCD::CommandFifo::is_processing() { - return (mem_read_32(REG::CMD_READ) & 0x0FFF) != (mem_read_32(REG::CMD_WRITE) & 0x0FFF); -} - -bool CLCD::CommandFifo::has_fault() { - uint16_t Cmd_Read_Reg = mem_read_32(REG::CMD_READ) & 0x0FFF; - return Cmd_Read_Reg == 0x0FFF; -} - -#if FTDI_API_LEVEL == 800 -void CLCD::CommandFifo::start() { - if (command_write_ptr == 0xFFFFFFFFul) { - command_write_ptr = mem_read_32(REG::CMD_WRITE) & 0x0FFF; - } -} - -void CLCD::CommandFifo::execute() { - if (command_write_ptr != 0xFFFFFFFFul) { - mem_write_32(REG::CMD_WRITE, command_write_ptr); - } -} - -void CLCD::CommandFifo::reset() { - safe_delay(100); - mem_write_32(REG::CPURESET, 0x00000001); - mem_write_32(REG::CMD_WRITE, 0x00000000); - mem_write_32(REG::CMD_READ, 0x00000000); - mem_write_32(REG::CPURESET, 0x00000000); - safe_delay(300); - command_write_ptr = 0xFFFFFFFFul; -}; - -template bool CLCD::CommandFifo::_write_unaligned(T data, uint16_t len) { - const char *ptr = (const char*)data; - uint32_t bytes_tail, bytes_head; - uint32_t command_read_ptr; - - #if ENABLED(TOUCH_UI_DEBUG) - if (command_write_ptr == 0xFFFFFFFFul) - SERIAL_ECHO_MSG("Attempt to write to FIFO before CommandFifo::Cmd_Start()."); - #endif - - /* Wait until there is enough space in the circular buffer for the transfer */ - do { - command_read_ptr = mem_read_32(REG::CMD_READ) & 0x0FFF; - if (command_read_ptr <= command_write_ptr) { - bytes_tail = 4096U - command_write_ptr; - bytes_head = command_read_ptr; - } - else { - bytes_tail = command_read_ptr - command_write_ptr; - bytes_head = 0; - } - // Check for faults which can lock up the command processor - if (has_fault()) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHOLNPGM("Fault waiting for space in the command processor"); - #endif - return false; - } - } while ((bytes_tail + bytes_head) < len); - - /* Write as many bytes as possible following REG::CMD_WRITE */ - uint16_t bytes_to_write = min(len, bytes_tail); - mem_write_bulk (MAP::RAM_CMD + command_write_ptr, T(ptr), bytes_to_write); - command_write_ptr += bytes_to_write; - ptr += bytes_to_write; - len -= bytes_to_write; - - if (len > 0) { - /* Write remaining bytes at start of circular buffer */ - mem_write_bulk (MAP::RAM_CMD, T(ptr), len); - command_write_ptr = len; - } - - if (command_write_ptr == 4096U) { - command_write_ptr = 0; - } - return true; -} - -// Writes len bytes into the FIFO, if len is not -// divisible by four, zero bytes will be written -// to align to the boundary. - -template bool CLCD::CommandFifo::write(T data, uint16_t len) { - const uint8_t padding = MULTIPLE_OF_4(len) - len; - - uint8_t pad_bytes[] = {0, 0, 0, 0}; - return _write_unaligned(data, len) && - _write_unaligned(pad_bytes, padding); -} -#else -void CLCD::CommandFifo::start() { -} - -void CLCD::CommandFifo::execute() { -} - -void CLCD::CommandFifo::reset() { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHOLNPGM("Resetting command processor"); - #endif - safe_delay(100); - mem_write_32(REG::CPURESET, 0x00000001); - mem_write_32(REG::CMD_WRITE, 0x00000000); - mem_write_32(REG::CMD_READ, 0x00000000); - mem_write_32(REG::CPURESET, 0x00000000); - safe_delay(300); -}; - -// Writes len bytes into the FIFO, if len is not -// divisible by four, zero bytes will be written -// to align to the boundary. - -template bool CLCD::CommandFifo::write(T data, uint16_t len) { - const uint8_t padding = MULTIPLE_OF_4(len) - len; - - if (has_fault()) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHOLNPGM("Faulted... ignoring write."); - #endif - return false; - } - // The FT810 provides a special register that can be used - // for writing data without us having to do our own FIFO - // management. - uint16_t Command_Space = mem_read_32(REG::CMDB_SPACE) & 0x0FFF; - if (Command_Space < (len + padding)) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR("Waiting for ", len + padding); - SERIAL_ECHOLNPAIR(" bytes in command queue, now free: ", Command_Space); - #endif - do { - Command_Space = mem_read_32(REG::CMDB_SPACE) & 0x0FFF; - if (has_fault()) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHOLNPGM("... fault"); - #endif - return false; - } - } while (Command_Space < len + padding); - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHOLNPGM("... done"); - #endif - } - mem_write_bulk(REG::CMDB_WRITE, data, len, padding); - return true; -} -#endif - -template bool CLCD::CommandFifo::write(const void*, uint16_t); -template bool CLCD::CommandFifo::write(progmem_str, uint16_t); - -// CO_PROCESSOR COMMANDS - -void CLCD::CommandFifo::str(const char * data) { - write(data, strlen(data)+1); -} - -void CLCD::CommandFifo::str(progmem_str data) { - write(data, strlen_P((const char*)data)+1); -} - -/******************* LCD INITIALIZATION ************************/ - -void CLCD::init() { - spi_init(); // Set Up I/O Lines for SPI and FT800/810 Control - ftdi_reset(); // Power down/up the FT8xx with the apropriate delays - - host_cmd(Use_Crystal ? CLKEXT : CLKINT, 0); - host_cmd(FTDI::ACTIVE, 0); // Activate the System Clock - - delay(40); // FTDI/BRT recommendation: no SPI traffic during startup. EVE needs at the very least 45ms to start, so leave her alone for a little while. - - /* read the device-id until it returns 0x7C or times out, should take less than 150ms */ - uint8_t counter; - for (counter = 0; counter < 250; counter++) { - uint8_t device_id = mem_read_8(REG::ID); // Read Device ID, Should Be 0x7C; - if (device_id == 0x7C) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("FTDI chip initialized "); - #endif - break; - } - else - delay(1); - - if (counter == 249) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Timeout waiting for device ID, should be 124, got ", device_id); - #endif - } - } - - /* make sure that all units are in working conditions, usually the touch-controller needs a little more time */ - for (counter = 0; counter < 100; counter++) { - uint8_t reset_status = mem_read_8(REG::CPURESET) & 0x03; - if (reset_status == 0x00) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("FTDI chip all units running "); - #endif - break; - } - else - delay(1); - - if (ENABLED(TOUCH_UI_DEBUG) && counter == 99) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Timeout waiting for reset status. Should be 0x00, got ", reset_status); - } - } - - mem_write_8(REG::PWM_DUTY, 0); // turn off Backlight, Frequency already is set to 250Hz default - - /* Configure the FT8xx Registers */ - mem_write_16(REG::HCYCLE, FTDI::Hcycle); - mem_write_16(REG::HOFFSET, FTDI::Hoffset); - mem_write_16(REG::HSYNC0, FTDI::Hsync0); - mem_write_16(REG::HSYNC1, FTDI::Hsync1); - mem_write_16(REG::VCYCLE, FTDI::Vcycle); - mem_write_16(REG::VOFFSET, FTDI::Voffset); - mem_write_16(REG::VSYNC0, FTDI::Vsync0); - mem_write_16(REG::VSYNC1, FTDI::Vsync1); - mem_write_16(REG::HSIZE, FTDI::Hsize); - mem_write_16(REG::VSIZE, FTDI::Vsize); - mem_write_8(REG::SWIZZLE, FTDI::Swizzle); - mem_write_8(REG::PCLK_POL, FTDI::Pclkpol); - mem_write_8(REG::CSPREAD, FTDI::CSpread); - - /* write a basic display-list to get things started */ - mem_write_32(MAP::RAM_DL, DL::CLEAR_COLOR_RGB); - mem_write_32(MAP::RAM_DL + 4, (DL::CLEAR | 0x07)); /* clear color, stencil and tag buffer */ - mem_write_32(MAP::RAM_DL + 8, DL::DL_DISPLAY); /* end of display list */ - - mem_write_8(REG::DLSWAP, 0x02); // activate display list, Bad Magic Cookie 2 = switch to new list after current frame is scanned out - - //mem_write_8(REG::TOUCH_MODE, 0x03); // Configure the Touch Screen, Bad Magic Cookie, 3 = CONTINUOUS = Reset Default - //mem_write_8(REG::TOUCH_ADC_MODE, 0x01); // Bad Magic Cookie, 1 = single touch = Reset Default - //mem_write_8(REG::TOUCH_OVERSAMPLE, 0x0F); // Reset Default = 7 - why 15? - mem_write_16(REG::TOUCH_RZTHRESH, touch_threshold); /* setup touch sensitivity */ - mem_write_8(REG::VOL_SOUND, 0x00); // Turn Synthesizer Volume Off - - /* turn on the display by setting DISP high */ - /* turn on the Audio Amplifier by setting GPIO_1 high for the select few modules supporting this */ - /* no need to use GPIOX here since DISP/GPIO_0 and GPIO_1 are on REG::GPIO for FT81x as well */ - if (GPIO_1_Audio_Shutdown) { - mem_write_8(REG::GPIO_DIR, GPIO_DISP | GPIO_GP1); - mem_write_8(REG::GPIO, GPIO_DISP | GPIO_GP1); - } else if (GPIO_0_Audio_Enable) { - mem_write_8(REG::GPIO_DIR, GPIO_DISP | GPIO_GP0); - mem_write_8(REG::GPIO, GPIO_DISP | GPIO_GP0); - } - else { - mem_write_8(REG::GPIO, GPIO_DISP); /* REG::GPIO_DIR is set to output for GPIO_DISP by default */ - } - - mem_write_8(REG::PCLK, Pclk); // Turns on Clock by setting PCLK Register to the value necessary for the module - - mem_write_16(REG::PWM_HZ, 0x00FA); - - // Turning off dithering seems to help prevent horizontal line artifacts on certain colors - mem_write_8(REG::DITHER, 0); - - default_touch_transform(); - default_display_orientation(); -} - -void CLCD::default_touch_transform() { - // Set Initial Values for Touch Transform Registers - mem_write_32(REG::ROTATE, 0); - mem_write_32(REG::TOUCH_TRANSFORM_A, FTDI::default_transform_a); - mem_write_32(REG::TOUCH_TRANSFORM_B, FTDI::default_transform_b); - mem_write_32(REG::TOUCH_TRANSFORM_C, FTDI::default_transform_c); - mem_write_32(REG::TOUCH_TRANSFORM_D, FTDI::default_transform_d); - mem_write_32(REG::TOUCH_TRANSFORM_E, FTDI::default_transform_e); - mem_write_32(REG::TOUCH_TRANSFORM_F, FTDI::default_transform_f); -} - -void CLCD::default_display_orientation() { - #if FTDI_API_LEVEL >= 810 - // Set the initial display orientation. On the FT810, we use the command - // processor to do this since it will also update the transform matrices. - CommandFifo cmd; - cmd.setrotate( - ENABLED(TOUCH_UI_MIRRORED) * 4 - + ENABLED(TOUCH_UI_PORTRAIT) * 2 - + ENABLED(TOUCH_UI_INVERTED) * 1 - ); - cmd.execute(); - #elif ANY(TOUCH_UI_PORTRAIT, TOUCH_UI_MIRRORED) - #error "PORTRAIT or MIRRORED orientation not supported on the FT800." - #elif ENABLED(TOUCH_UI_INVERTED) - mem_write_32(REG::ROTATE, 1); - #endif -} - -#endif // FTDI_BASIC diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h deleted file mode 100644 index a9fdb5c5c7..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h +++ /dev/null @@ -1,261 +0,0 @@ -/**************** - * commands.cpp * - ****************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - - /**************************************************************************** - * FUNCTION MAP * - * * - * SPI and FT800/810 Commands * - * * - * CLCD::spi_select() Set CS line to 0 * - * CLCD::spi_deselect() Set CS Line to 1 * - * CLCD::reset() Toggle FT800/810 Power Down Line 50 ms * - * CLCD::spi_init() Configure I/O Lines for SPI * - * CLCD::spi_transfer() Send/Receive 1 SPI Byte * - * CLCD::init() Set FT800/810 Registers * - * CLCD::enable() Turn On FT800/810 PCLK * - * CLCD::disable() Turn Off FT8880/810 PCLK * - * CLCD::set_backlight() Set LCD Backlight Level * - * * - * MEMORY READ FUNCTIONS * - * * - * CLCD::mem_read_addr() Send 32-Bit Address * - * CLCD::mem_read_8() Read 1 Byte * - * CLCD::mem_read_16() Read 2 Bytes * - * CLCD::mem_read_32() Read 4 Bytes * - * * - * MEMORY WRITE FUNCTIONS * - * * - * CLCD::mem_write_addr() Send 24-Bit Address * - * CLCD::mem_write_8() Write 1 Byte * - * CLCD::mem_write_16() Write 2 Bytes * - * CLCD::mem_write_32() Write 4 Bytes * - * * - * HOST COMMAND FUNCTION * - * * - * CLCD::host_cmd() Send 24-Bit Host Command * - * * - * COMMAND BUFFER FUNCTIONS * - * * - * CLCD::cmd() Send 32-Bit Value(4 Bytes)CMD Buffer * - * CLCD::cmd() Send Data Structure with 32-Bit Cmd * - * CLCD::str() Send Text String in 32-Bit Multiples * - - * * - * FT800/810 GRAPHIC COMMANDS * - * * - * class CLCD:CommandFifo {} Class to control Cmd FIFO * - - * CommandFifo::start() Wait for CP finish - Set FIFO Ptr * - * CommandFifo::execute() Set REG_CMD_WRITE and start CP * - * CommandFifo::reset() Set Cmd Buffer Pointers to 0 * - * - * CommandFifo::fgcolor Set Graphic Item Foreground Color * - * CommandFifo::bgcolor Set Graphic Item Background Color * - * CommandFifo::begin() Begin Drawing a Primative * - * CommandFifo::mem_copy() Copy a Block of Memory * - * CommandFifo::append() Append Commands to Current DL * - * CommandFifo::gradient_color() Set 3D Button Highlight Color * - * CommandFifo::button() Draw Button with Bulk Write * - * CommandFifo::text() Draw Text with Bulk Write * - *****************************************************************************/ - - /************************************************** - * RAM_G Graphics RAM Allocation * - * * - * Address Use * - * * - * 8000 Extruder Bitmap * - * 8100 Bed Heat Bitmap * - * 8200 Fan Bitmap * - * 8300 Thumb Drive Symbol Bitmap * - * 35000 Static DL Space (FT800) * - * F5000 Static DL Space (FT810) * - **************************************************/ - -#pragma once - -typedef const __FlashStringHelper *progmem_str; - -class UIStorage; - -class CLCD { - friend class UIStorage; - - public: - typedef FTDI::ftdi_registers REG; - typedef FTDI::ftdi_memory_map MAP; - - static void spi_write_addr (uint32_t reg_address); - static void spi_read_addr (uint32_t reg_address); - - static uint8_t mem_read_8 (uint32_t reg_address); - static uint16_t mem_read_16 (uint32_t reg_address); - static uint32_t mem_read_32 (uint32_t reg_address); - static void mem_read_bulk (uint32_t reg_address, uint8_t *data, uint16_t len); - - static void mem_write_8 (uint32_t reg_address, uint8_t w_data); - static void mem_write_16 (uint32_t reg_address, uint16_t w_data); - static void mem_write_32 (uint32_t reg_address, uint32_t w_data); - static void mem_write_bulk (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0); - static void mem_write_pgm (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0); - static void mem_write_bulk (uint32_t reg_address, progmem_str str, uint16_t len, uint8_t padding = 0); - static void mem_write_xbm (uint32_t reg_address, progmem_str str, uint16_t len, uint8_t padding = 0); - - public: - class CommandFifo; - class FontMetrics; - - static void init(); - static void default_touch_transform(); - static void default_display_orientation(); - static void turn_on_backlight(); - static void enable(); - static void disable(); - static void set_brightness (uint8_t brightness); - static uint8_t get_brightness(); - static void host_cmd (unsigned char host_command, unsigned char byte2); - static uint32_t dl_size() {return CLCD::mem_read_32(REG::CMD_DL) & 0x1FFF;} - - static void get_font_metrics (uint8_t font, struct FontMetrics &fm); - static uint16_t get_text_width(const uint8_t font, const char *str); - static uint16_t get_text_width_P(const uint8_t font, const char *str); - - static uint8_t get_tag () {return mem_read_8(REG::TOUCH_TAG);} - static bool is_touching () {return (mem_read_32(REG::TOUCH_DIRECT_XY) & 0x80000000) == 0;} - - static uint8_t get_tracker (uint16_t &value) { - uint32_t tracker = mem_read_32(REG::TRACKER); - value = tracker >> 16; - return tracker & 0xFF; - } -}; - -/*************************** FT800/810 Font Metrics ****************************/ - -class CLCD::FontMetrics { - public: - uint8_t char_widths[128]; - uint32_t format; - uint32_t stride; - uint32_t width; - uint32_t height; - uint32_t ptr; - - FontMetrics() {} - FontMetrics(uint8_t font) {load(font);} - - void load(uint8_t font); - - // Returns width of string, up to a maximum of n characters. - uint16_t get_text_width(const char *str, size_t n = SIZE_MAX) const; - uint16_t get_text_width(progmem_str str, size_t n = SIZE_MAX) const; -}; - -/******************* FT800/810 Graphic Commands *********************************/ - -class CLCD::CommandFifo { - protected: - #if FTDI_API_LEVEL >= 810 - uint32_t getRegCmdBSpace(); - #else - static uint32_t command_write_ptr; - template bool _write_unaligned(T data, uint16_t len); - #endif - void start(); - - public: - template bool write(T data, uint16_t len); - - public: - CommandFifo() {start();} - - static void reset(); - static bool is_processing(); - static bool has_fault(); - - void execute(); - - void cmd(uint32_t cmd32); - void cmd(void* data, uint16_t len); - - void dlstart() {cmd(FTDI::CMD_DLSTART);} - void swap() {cmd(FTDI::CMD_SWAP);} - void coldstart() {cmd(FTDI::CMD_COLDSTART);} - void screensaver() {cmd(FTDI::CMD_SCREENSAVER);} - void stop() {cmd(FTDI::CMD_STOP);} - void loadidentity() {cmd(FTDI::CMD_LOADIDENTITY);} - void setmatrix() {cmd(FTDI::CMD_SETMATRIX);} - - void fgcolor (uint32_t rgb); - void bgcolor (uint32_t rgb); - void gradcolor (uint32_t rgb); - - void track (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t tag); - void clock (int16_t x, int16_t y, int16_t r, uint16_t options, int16_t h, int16_t m, int16_t s, int16_t ms); - void gauge (int16_t x, int16_t y, int16_t r, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range); - void dial (int16_t x, int16_t y, int16_t r, uint16_t options, uint16_t val); - void slider (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range); - void progress (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range); - void scrollbar (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t size, uint16_t range); - void number (int16_t x, int16_t y, int16_t font, uint16_t options, int32_t n); - void spinner (int16_t x, int16_t y, uint16_t style, uint16_t scale); - void sketch (int16_t x, int16_t y, uint16_t w, uint16_t h, uint32_t ptr, uint16_t format); - void gradient (int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1); - void snapshot (uint32_t ptr); - void loadimage (uint32_t ptr, uint32_t options); - void getprops (uint32_t ptr, uint32_t width, uint32_t height); - - void scale (int32_t sx, int32_t sy); - void rotate (int32_t a); - void translate (int32_t tx, int32_t ty); - - #if FTDI_API_LEVEL >= 810 - void setbase (uint8_t base); - void setrotate (uint8_t rotation); - void setbitmap (uint32_t ptr, uint16_t fmt, uint16_t w, uint16_t h); - void snapshot2 (uint32_t fmt, uint32_t ptr, int16_t x, int16_t y, uint16_t w, uint16_t h); - void mediafifo (uint32_t ptr, uint32_t size); - void playvideo (uint32_t options); - void videostart(); - void videoframe(uint32_t dst, uint32_t ptr); - void romfont (uint8_t font, uint8_t romslot); - #endif - - // All the following must be followed by str() - void text (int16_t x, int16_t y, int16_t font, uint16_t options); - void button (int16_t x, int16_t y, int16_t w, int16_t h, int16_t font, uint16_t option); - void toggle (int16_t x, int16_t y, int16_t w, int16_t font, uint16_t options, bool state); - void keys (int16_t x, int16_t y, int16_t w, int16_t h, int16_t font, uint16_t options); - - // Sends the string portion of text, button, toggle and keys. - void str (const char * data); - void str (progmem_str data); - - void memzero (uint32_t ptr, uint32_t size); - void memset (uint32_t ptr, uint32_t value, uint32_t size); - void memcpy (uint32_t dst, uint32_t src, uint32_t size); - void memcrc (uint32_t ptr, uint32_t num, uint32_t result); - void memwrite (uint32_t ptr, uint32_t value); - void inflate (uint32_t ptr); - void getptr (uint32_t result); - void append (uint32_t ptr, uint32_t size); -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h deleted file mode 100644 index 1e6642fedc..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h +++ /dev/null @@ -1,414 +0,0 @@ -/*************** - * constants.h * - ***************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/**************************************************************************** - * This header defines constants and commands for the FTDI FT810 LCD Driver * - * chip. * - ****************************************************************************/ - -#pragma once - -// OPTIONS - -namespace FTDI { - constexpr uint16_t OPT_3D = 0x0000; - constexpr uint16_t OPT_RGB565 = 0x0000; - constexpr uint16_t OPT_MONO = 0x0001; - constexpr uint16_t OPT_NODL = 0x0002; - constexpr uint16_t OPT_FLAT = 0x0100; - constexpr uint16_t OPT_SIGNED = 0x0100; - constexpr uint16_t OPT_CENTERX = 0x0200; - constexpr uint16_t OPT_CENTERY = 0x0400; - constexpr uint16_t OPT_CENTER = (OPT_CENTERX | OPT_CENTERY); - constexpr uint16_t OPT_RIGHTX = 0x0800; - constexpr uint16_t OPT_NOBACK = 0x1000; - constexpr uint16_t OPT_NOTICKS = 0x2000; - constexpr uint16_t OPT_NOHM = 0x4000; - constexpr uint16_t OPT_NOPOINTER = 0x4000; - constexpr uint16_t OPT_NOSECS = 0x8000; - constexpr uint16_t OPT_NOHANDS = (OPT_NOPOINTER | OPT_NOSECS); -} - -namespace FTDI_FT810 { - constexpr uint16_t OPT_NOTEAR = 0x0004; - constexpr uint16_t OPT_FULLSCREEN = 0x0008; - constexpr uint16_t OPT_MEDIAFIFO = 0x0010; - constexpr uint16_t OPT_SOUND = 0x0020; -} - -// GPIO Bits - -namespace FTDI { - constexpr uint8_t GPIO_GP0 = 1 << 0; - constexpr uint8_t GPIO_GP1 = 1 << 1; - constexpr uint8_t GPIO_DISP = 1 << 7; -} - -namespace FTDI_FT810 { - constexpr uint16_t GPIOX_GP0 = 1 << 0; - constexpr uint16_t GPIOX_GP1 = 1 << 1; - constexpr uint16_t GPIOX_DISP = 1 << 15; -} - -// HOST COMMANDS - -namespace FTDI { - constexpr uint8_t ACTIVE = 0x00; - constexpr uint8_t STANDBY = 0x41; - constexpr uint8_t SLEEP = 0x42; - constexpr uint8_t PWRDOWN = 0x50; - constexpr uint8_t CLKEXT = 0x44; - constexpr uint8_t CLKINT = 0x48; - constexpr uint8_t CORESET = 0x68; -} - -namespace FTDI_FT800 { - constexpr uint8_t CLK48M = 0x62; - constexpr uint8_t CLK36M = 0x61; -} - -namespace FTDI_FT810 { - constexpr uint8_t CLKSEL = 0x61; -} - -// DISPLAY LIST COMMANDS - -namespace FTDI { - constexpr uint8_t ARGB1555 = 0; - constexpr uint8_t L1 = 1; - constexpr uint8_t L4 = 2; - constexpr uint8_t L8 = 3; - constexpr uint8_t RGB332 = 4; - constexpr uint8_t ARGB2 = 5; - constexpr uint8_t ARGB4 = 6; - constexpr uint8_t RGB565 = 7; - constexpr uint8_t PALETTED = 8; - constexpr uint8_t TEXT8X8 = 9; - constexpr uint8_t TEXTVGA = 10; - constexpr uint8_t BARGRAPH = 11; - - constexpr uint8_t ALPHA_FUNC_NEVER = 0; - constexpr uint8_t ALPHA_FUNC_LESS = 1; - constexpr uint8_t ALPHA_FUNC_LEQUAL = 2; - constexpr uint8_t ALPHA_FUNC_GREATER = 3; - constexpr uint8_t ALPHA_FUNC_GEQUAL = 4; - constexpr uint8_t ALPHA_FUNC_EQUAL = 5; - constexpr uint8_t ALPHA_FUNC_NOTEQUAL = 6; - constexpr uint8_t ALPHA_FUNC_ALWAYS = 7; - - constexpr uint8_t NEAREST = 0; - constexpr uint8_t BILINEAR = 1; - constexpr uint8_t BORDER = 0; - constexpr uint8_t REPEAT = 1; - - constexpr uint8_t BLEND_FUNC_ZERO = 0; - constexpr uint8_t BLEND_FUNC_ONE = 1; - constexpr uint8_t BLEND_FUNC_SRC_ALPHA = 2; - constexpr uint8_t BLEND_FUNC_DST_ALPHA = 3; - constexpr uint8_t BLEND_FUNC_ONE_MINUS_SRC_ALPHA = 4; - constexpr uint8_t BLEND_FUNC_ONE_MINUS_DST_ALPHA = 5; - - constexpr uint32_t COLOR_MASK_RED = 8; - constexpr uint32_t COLOR_MASK_GRN = 4; - constexpr uint32_t COLOR_MASK_BLU = 2; - constexpr uint32_t COLOR_MASK_ALPHA = 1; - - constexpr uint8_t STENCIL_FUNC_NEVER = 0; - constexpr uint8_t STENCIL_FUNC_LESS = 1; - constexpr uint8_t STENCIL_FUNC_LEQUAL = 2; - constexpr uint8_t STENCIL_FUNC_GREATER = 3; - constexpr uint8_t STENCIL_FUNC_GEQUAL = 4; - constexpr uint8_t STENCIL_FUNC_EQUAL = 5; - constexpr uint8_t STENCIL_FUNC_NOTEQUAL = 6; - constexpr uint8_t STENCIL_FUNC_ALWAYS = 7; - - constexpr uint8_t STENCIL_OP_ZERO = 0; - constexpr uint8_t STENCIL_OP_KEEP = 1; - constexpr uint8_t STENCIL_OP_REPLACE = 2; - constexpr uint8_t STENCIL_OP_INCR = 3; - constexpr uint8_t STENCIL_OP_DECR = 4; - constexpr uint8_t STENCIL_OP_INVERT = 5; - - typedef enum : uint32_t { - BITMAPS = 1, - POINTS = 2, - LINES = 3, - LINE_STRIP = 4, - EDGE_STRIP_R = 5, - EDGE_STRIP_L = 6, - EDGE_STRIP_A = 7, - EDGE_STRIP_B = 8, - RECTS = 9 - } begin_t; -} - -namespace FTDI_FT800_DL { - constexpr uint32_t ALPHA_FUNC = 0x09000000; - constexpr uint32_t BEGIN = 0x1F000000; - constexpr uint32_t BITMAP_HANDLE = 0x05000000; - constexpr uint32_t BITMAP_LAYOUT = 0x07000000; - constexpr uint32_t BITMAP_SIZE = 0x08000000; - constexpr uint32_t BITMAP_SOURCE = 0x01000000; - constexpr uint32_t BITMAP_TRANSFORM_A = 0x15000000; - constexpr uint32_t BITMAP_TRANSFORM_B = 0x16000000; - constexpr uint32_t BITMAP_TRANSFORM_C = 0x17000000; - constexpr uint32_t BITMAP_TRANSFORM_D = 0x18000000; - constexpr uint32_t BITMAP_TRANSFORM_E = 0x19000000; - constexpr uint32_t BITMAP_TRANSFORM_F = 0x1A000000; - constexpr uint32_t BLEND_FUNC = 0x0B000000; - constexpr uint32_t CALL = 0x1D000000; - constexpr uint32_t CELL = 0x06000000; - constexpr uint32_t CLEAR = 0x26000000; - constexpr uint32_t CLEAR_COLOR_BUFFER = 0x00000004; - constexpr uint32_t CLEAR_STENCIL_BUFFER = 0x00000002; - constexpr uint32_t CLEAR_TAG_BUFFER = 0x00000001; - constexpr uint32_t CLEAR_COLOR_A = 0x0F000000; - constexpr uint32_t CLEAR_COLOR_RGB = 0x02000000; - constexpr uint32_t CLEAR_STENCIL = 0x11000000; - constexpr uint32_t CLEAR_TAG = 0x12000000; - constexpr uint32_t COLOR_A = 0x10000000; - constexpr uint32_t COLOR_MASK = 0x20000000; - constexpr uint32_t COLOR_RGB = 0x04000000; - constexpr uint32_t DL_DISPLAY = 0x00000000; - constexpr uint32_t END = 0x21000000; - constexpr uint32_t JUMP = 0x1E000000; - constexpr uint32_t LINE_WIDTH = 0x0E000000; - constexpr uint32_t MACRO = 0x25000000; - constexpr uint32_t POINT_SIZE = 0x0D000000; - constexpr uint32_t RESTORE_CONTEXT = 0x23000000; - constexpr uint32_t RETURN = 0x24000000; - constexpr uint32_t SAVE_CONTEXT = 0x22000000; - constexpr uint32_t SCISSOR_SIZE = 0x1C000000; - constexpr uint32_t SCISSOR_XY = 0x1B000000; - constexpr uint32_t STENCIL_FUNC = 0x0A000000; - constexpr uint32_t STENCIL_MASK = 0x13000000; - constexpr uint32_t STENCIL_OP = 0x0C000000; - constexpr uint32_t TAG = 0x03000000; - constexpr uint32_t TAG_MASK = 0x14000000; - constexpr uint32_t VERTEX2F = 0x40000000; - constexpr uint32_t VERTEX2II = 0x80000000; -} - -namespace FTDI_FT810_DL { - constexpr uint32_t NOP = 0x25000000; - constexpr uint32_t BITMAP_LAYOUT_H = 0x28000000; - constexpr uint32_t BITMAP_SIZE_H = 0x29000000; - constexpr uint32_t VERTEX_FORMAT = 0x27000000; - constexpr uint32_t VERTEX_TRANSLATE_X = 0x2B000000; - constexpr uint32_t VERTEX_TRANSLATE_Y = 0x2C000000; -} - -// CO-PROCESSOR ENGINE COMMANDS -namespace FTDI { - constexpr uint32_t CMD_DLSTART = 0xFFFFFF00; - constexpr uint32_t CMD_SWAP = 0xFFFFFF01; - constexpr uint32_t CMD_COLDSTART = 0xFFFFFF32; - constexpr uint32_t CMD_INTERRUPT = 0xFFFFFF02; - constexpr uint32_t CMD_APPEND = 0xFFFFFF1E; - constexpr uint32_t CMD_REGREAD = 0xFFFFFF19; - constexpr uint32_t CMD_MEMWRITE = 0xFFFFFF1A; - constexpr uint32_t CMD_INFLATE = 0xFFFFFF22; - constexpr uint32_t CMD_LOADIMAGE = 0xFFFFFF24; - constexpr uint32_t CMD_MEMCRC = 0xFFFFFF18; - constexpr uint32_t CMD_MEMZERO = 0xFFFFFF1C; - constexpr uint32_t CMD_MEMSET = 0xFFFFFF1B; - constexpr uint32_t CMD_MEMCPY = 0xFFFFFF1D; - constexpr uint32_t CMD_BUTTON = 0xFFFFFF0D; - constexpr uint32_t CMD_CLOCK = 0xFFFFFF14; - constexpr uint32_t CMD_FGCOLOR = 0xFFFFFF0A; - constexpr uint32_t CMD_BGCOLOR = 0xFFFFFF09; - constexpr uint32_t CMD_GRADCOLOR = 0xFFFFFF34; - constexpr uint32_t CMD_GAUGE = 0xFFFFFF13; - constexpr uint32_t CMD_GRADIENT = 0xFFFFFF0B; - constexpr uint32_t CMD_KEYS = 0xFFFFFF0E; - constexpr uint32_t CMD_PROGRESS = 0xFFFFFF0F; - constexpr uint32_t CMD_SCROLLBAR = 0xFFFFFF11; - constexpr uint32_t CMD_SLIDER = 0xFFFFFF10; - constexpr uint32_t CMD_DIAL = 0xFFFFFF2D; - constexpr uint32_t CMD_TOGGLE = 0xFFFFFF12; - constexpr uint32_t CMD_TEXT = 0xFFFFFF0C; - constexpr uint32_t CMD_NUMBER = 0xFFFFFF2E; - constexpr uint32_t CMD_LOADIDENTITY = 0xFFFFFF26; - constexpr uint32_t CMD_SETMATRIX = 0xFFFFFF2A; - constexpr uint32_t CMD_GETMATRIX = 0xFFFFFF33; - constexpr uint32_t CMD_GETPTR = 0xFFFFFF23; - constexpr uint32_t CMD_GETPROPS = 0xFFFFFF25; - constexpr uint32_t CMD_SCALE = 0xFFFFFF28; - constexpr uint32_t CMD_ROTATE = 0xFFFFFF29; - constexpr uint32_t CMD_TRANSLATE = 0xFFFFFF27; - constexpr uint32_t CMD_CALIBRATE = 0xFFFFFF15; - constexpr uint32_t CMD_SPINNER = 0xFFFFFF16; - constexpr uint32_t CMD_SCREENSAVER = 0xFFFFFF2F; - constexpr uint32_t CMD_SKETCH = 0xFFFFFF30; - constexpr uint32_t CMD_STOP = 0xFFFFFF17; - constexpr uint32_t CMD_SETFONT = 0xFFFFFF2B; - constexpr uint32_t CMD_TRACK = 0xFFFFFF2C; - constexpr uint32_t CMD_SNAPSHOT = 0xFFFFFF1F; - constexpr uint32_t CMD_LOGO = 0xFFFFFF31; -} - -namespace FTDI_FT810 { - constexpr uint32_t CMD_SETROTATE = 0xFFFFFF36; - constexpr uint32_t CMD_SNAPSHOT2 = 0xFFFFFF37; - constexpr uint32_t CMD_SETBASE = 0xFFFFFF38; - constexpr uint32_t CMD_MEDIAFIFO = 0xFFFFFF39; - constexpr uint32_t CMD_PLAYVIDEO = 0xFFFFFF3A; - constexpr uint32_t CMD_SETFONT2 = 0xFFFFFF3B; - constexpr uint32_t CMD_SETSCRATCH = 0xFFFFFF3C; - constexpr uint32_t CMD_ROMFONT = 0xFFFFFF3F; - constexpr uint32_t CMD_VIDEOSTART = 0xFFFFFF40; - constexpr uint32_t CMD_VIDEOFRAME = 0xFFFFFF41; - constexpr uint32_t CMD_SETBITMAP = 0xFFFFFF43; -} - -namespace FTDI { - enum effect_t : unsigned char { - SILENCE = 0x00, - SQUARE_WAVE = 0x01, - SINE_WAVE = 0x02, - SAWTOOTH_WAVE = 0x03, - TRIANGLE_WAVE = 0x04, - BEEPING = 0x05, - ALARM = 0x06, - WARBLE = 0x07, - CAROUSEL = 0x08, - SHORT_PIPS_1 = 0x10, - SHORT_PIPS_2 = 0x11, - SHORT_PIPS_3 = 0x12, - SHORT_PIPS_4 = 0x13, - SHORT_PIPS_5 = 0x14, - SHORT_PIPS_6 = 0x15, - SHORT_PIPS_7 = 0x16, - SHORT_PIPS_8 = 0x17, - SHORT_PIPS_9 = 0x18, - SHORT_PIPS_10 = 0x19, - SHORT_PIPS_11 = 0x1A, - SHORT_PIPS_12 = 0x1B, - SHORT_PIPS_13 = 0x1C, - SHORT_PIPS_14 = 0x1D, - SHORT_PIPS_15 = 0x1E, - SHORT_PIPS_16 = 0x1F, - DTMF_POUND = 0x23, - DTMF_STAR = 0x2C, - DTMF_0 = 0x30, - DTMF_1 = 0x31, - DTMF_2 = 0x32, - DTMF_3 = 0x33, - DTMF_4 = 0x34, - DTMF_5 = 0x35, - DTMF_6 = 0x36, - DTMF_7 = 0x37, - DTMF_8 = 0x38, - DTMF_9 = 0x39, - HARP = 0x40, - XYLOPHONE = 0x41, - TUBA = 0x42, - GLOCKENSPIEL = 0x43, - ORGAN = 0x44, - TRUMPET = 0x45, - PIANO = 0x46, - CHIMES = 0x47, - MUSIC_BOX = 0x48, - BELL = 0x49, - CLICK = 0x50, - SWITCH = 0x51, - COWBELL = 0x52, - NOTCH = 0x53, - HIHAT = 0x54, - KICKDRUM = 0x55, - POP = 0x56, - CLACK = 0x57, - CHACK = 0x58, - MUTE = 0x60, - UNMUTE = 0x61 - }; - - enum note_t : unsigned char { - END_SONG = 0xFF, - REST = 0x00, - - NOTE_C1 = 0x18, // 24 - NOTE_C1S = 0x19, - NOTE_D1 = 0x1A, - NOTE_D1S = 0x1B, - NOTE_E1 = 0x1C, - NOTE_F1 = 0x1D, - NOTE_F1S = 0x1E, - NOTE_G1 = 0x1F, - NOTE_G1S = 0x20, - NOTE_A1 = 0x21, - NOTE_A1S = 0x22, - NOTE_B1 = 0x23, - - NOTE_C2 = 0x24, //36 - NOTE_C2S = 0x25, - NOTE_D2 = 0x26, - NOTE_D2S = 0x27, - NOTE_E2 = 0x28, - NOTE_F2 = 0x29, - NOTE_F2S = 0x2A, - NOTE_G2 = 0x2B, - NOTE_G2S = 0x2C, - NOTE_A2 = 0x2D, - NOTE_A2S = 0x2E, - NOTE_B2 = 0x2F, - - NOTE_C3 = 0x30, - NOTE_C3S = 0x31, - NOTE_D3 = 0x32, - NOTE_D3S = 0x33, - NOTE_E3 = 0x34, - NOTE_F3 = 0x35, - NOTE_F3S = 0x36, - NOTE_G3 = 0x37, - NOTE_G3S = 0x38, - NOTE_A3 = 0x39, - NOTE_A3S = 0x3A, - NOTE_B3 = 0x3B, - - NOTE_C4 = 0x3C, - NOTE_C4S = 0x3D, - NOTE_D4 = 0x3E, - NOTE_D4S = 0x3F, - NOTE_E4 = 0x40, - NOTE_F4 = 0x41, - NOTE_F4S = 0x42, - NOTE_G4 = 0x43, - NOTE_G4S = 0x44, - NOTE_A4 = 0x45, - NOTE_A4S = 0x46, - NOTE_B4 = 0x47, - - NOTE_C5 = 0x48, - NOTE_C5S = 0x49, - NOTE_D5 = 0x4A, - NOTE_D5S = 0x4B, - NOTE_E5 = 0x4C, - NOTE_F5 = 0x4D, - NOTE_F5S = 0x4E, - NOTE_G5 = 0x4F, - NOTE_G5S = 0x50, - NOTE_A5 = 0x51, - NOTE_A5S = 0x52, - NOTE_B5 = 0x53, - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/display_list.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/display_list.h deleted file mode 100644 index 99a9e0e810..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/display_list.h +++ /dev/null @@ -1,118 +0,0 @@ -/****************** - * display_list.h * - *****************/ - -/********************************************************************************** - * Adapted from: * - * https://github.com/RudolphRiedel/FT800-FT813 * - * By Rudolph Riedel * - * * - * MIT License * - * * - * Copyright (c) 2017 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy * - * of this software and associated documentation files (the "Software"), to deal * - * in the Software without restriction, including without limitation the rights * - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * - * copies of the Software, and to permit persons to whom the Software is * - * furnished to do so, subject to the following conditions: * - * * - * The above copyright notice and this permission notice shall be included in all * - * copies or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * - * SOFTWARE. * - * * - **********************************************************************************/ - -#pragma once - -namespace FTDI { - /* FT8xx graphics engine specific macros useful for static display list generation */ - inline uint32_t ALPHA_FUNC(uint8_t func, uint8_t ref) {return DL::ALPHA_FUNC|((func&7UL)<<8)|(ref&255UL);} - inline uint32_t BEGIN(begin_t prim) {return DL::BEGIN|(prim&15UL);} - - inline uint32_t BITMAP_SOURCE(uint32_t ram_g_addr) {return DL::BITMAP_SOURCE|(ram_g_addr);} - inline uint32_t BITMAP_HANDLE(uint8_t handle) {return DL::BITMAP_HANDLE|(handle&31UL);} - inline uint32_t BITMAP_LAYOUT(uint8_t format, uint16_t linestride, uint16_t height) - {return DL::BITMAP_LAYOUT|((format&31UL)<<19)|((linestride&1023UL)<<9)|(height&511UL);} - - inline uint32_t BITMAP_SIZE(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height) - {return DL::BITMAP_SIZE|((filter&1UL)<<20)|((wrapx&1UL)<<19)|((wrapy&1UL)<<18)|((width&511UL)<<9)|(height&511UL);} - #if FTDI_API_LEVEL >= 810 - inline uint32_t BITMAP_LAYOUT_H(uint8_t linestride, uint8_t height) - {return DL::BITMAP_LAYOUT_H|((linestride&3UL)<<2)|(height&3UL);} - inline uint32_t BITMAP_SIZE_H(uint8_t width, uint8_t height) - {return DL::BITMAP_SIZE_H|((width&3UL)<<2)|(height&3UL);} - #endif - inline uint32_t BITMAP_TRANSFORM_A(uint16_t a) {return DL::BITMAP_TRANSFORM_A|(a&131071UL);} - inline uint32_t BITMAP_TRANSFORM_B(uint16_t b) {return DL::BITMAP_TRANSFORM_B|(b&131071UL);} - inline uint32_t BITMAP_TRANSFORM_C(uint32_t c) {return DL::BITMAP_TRANSFORM_C|(c&16777215UL);} - inline uint32_t BITMAP_TRANSFORM_D(uint16_t d) {return DL::BITMAP_TRANSFORM_D|(d&131071UL);} - inline uint32_t BITMAP_TRANSFORM_E(uint16_t e) {return DL::BITMAP_TRANSFORM_E|(e&131071UL);} - inline uint32_t BITMAP_TRANSFORM_F(uint32_t f) {return DL::BITMAP_TRANSFORM_F|(f&16777215UL);} - inline uint32_t BLEND_FUNC(uint8_t src,uint8_t dst) {return DL::BLEND_FUNC|((src&7UL)<<3)|(dst&7UL);} - inline uint32_t CALL(uint16_t dest) {return DL::CALL|(dest&65535UL);} - inline uint32_t CELL(uint8_t cell) {return DL::CELL|(cell&127UL);} - inline uint32_t CLEAR(bool c,bool s,bool t) {return DL::CLEAR|((c?1UL:0UL)<<2)|((s?1UL:0UL)<<1)|(t?1UL:0UL);} - inline uint32_t CLEAR_COLOR_A(uint8_t alpha) {return DL::CLEAR_COLOR_A|(alpha&255UL);} - inline uint32_t CLEAR_COLOR_RGB(uint8_t red, uint8_t green, uint8_t blue) - {return DL::CLEAR_COLOR_RGB|((red&255UL)<<16)|((green&255UL)<<8)|(blue&255UL);} - inline uint32_t CLEAR_COLOR_RGB(uint32_t rgb) {return DL::CLEAR_COLOR_RGB|rgb;} - inline uint32_t CLEAR_STENCIL(uint8_t s) {return DL::CLEAR_STENCIL|(s&255UL);} - inline uint32_t CLEAR_TAG(uint8_t s) {return DL::CLEAR_TAG|(s&255UL);} - inline uint32_t COLOR_A(uint8_t alpha) {return DL::COLOR_A|(alpha&255UL);} - inline uint32_t COLOR_MASK(bool r, bool g, bool b, bool a) {return DL::COLOR_MASK|((r?1UL:0UL)<<3)|((g?1UL:0UL)<<2)|((b?1UL:0UL)<<1)|(a?1UL:0UL);} - inline uint32_t COLOR_RGB(uint8_t red,uint8_t green,uint8_t blue) - {return DL::COLOR_RGB|((red&255UL)<<16)|((green&255UL)<<8)|(blue&255UL);} - inline uint32_t COLOR_RGB(uint32_t rgb) {return DL::COLOR_RGB|rgb;} - /* inline uint32_t DISPLAY() {return (0UL<<24)) */ - inline uint32_t END() {return DL::END;} - inline uint32_t JUMP(uint16_t dest) {return DL::JUMP|(dest&65535UL);} - inline uint32_t LINE_WIDTH(uint16_t width) {return DL::LINE_WIDTH|(width&4095UL);} - inline uint32_t MACRO(uint8_t m) {return DL::MACRO|(m&1UL);} - inline uint32_t POINT_SIZE(uint16_t size) {return DL::POINT_SIZE|(size&8191UL);} - inline uint32_t RESTORE_CONTEXT() {return DL::RESTORE_CONTEXT;} - inline uint32_t RETURN () {return DL::RETURN;} - inline uint32_t SAVE_CONTEXT() {return DL::SAVE_CONTEXT;} - inline uint32_t SCISSOR_XY(uint16_t x,uint16_t y) { - return DL::SCISSOR_XY | - (FTDI::ftdi_chip >= 810 - ? ((x&2047UL)<<11)|(y&2047UL) - : ((x& 511UL)<<10)|(y&511UL)); - } - inline uint32_t SCISSOR_SIZE(uint16_t w,uint16_t h) { - return DL::SCISSOR_SIZE | - (FTDI::ftdi_chip >= 810 - ? ((w&4095UL)<<12)|(h&4095UL) - : ((w&1023UL)<<10)|(h&1023UL)); - } - inline uint32_t SCISSOR_XY() {return DL::SCISSOR_XY;} - inline uint32_t SCISSOR_SIZE() { - return DL::SCISSOR_SIZE | - (FTDI::ftdi_chip >= 810 - ? (2048UL<<12)|(2048UL) - : ( 512UL<<10)|( 512UL)); - } - inline uint32_t STENCIL_FUNC(uint16_t func, uint8_t ref, uint8_t mask) - {return DL::STENCIL_FUNC|((func&7UL)<<16)|((ref&255UL)<<8)|(mask&255UL);} - inline uint32_t STENCIL_MASK(uint8_t mask) {return DL::STENCIL_MASK|(mask&255UL);} - inline uint32_t STENCIL_OP(uint8_t sfail, uint8_t spass) {return DL::STENCIL_OP|(((sfail)&7UL)<<3)|(spass&7UL);} - inline uint32_t TAG(uint8_t s) {return DL::TAG|(s&255UL);} - inline uint32_t TAG_MASK(bool mask) {return DL::TAG_MASK|(mask?1:0);} - inline uint32_t VERTEX2F(uint16_t x, uint16_t y) {return DL::VERTEX2F|((x&32767UL)<<15)|(y&32767UL);} - inline uint32_t VERTEX2II(uint16_t x,uint16_t y, uint8_t handle = 0, uint8_t cell = 0) - {return DL::VERTEX2II|((x&511UL)<<21)|((y&511UL)<<12)|((handle&31UL)<<7)|(cell&127UL);} - - #if FTDI_API_LEVEL >= 810 - inline uint32_t VERTEX_FORMAT(uint8_t frac) {return DL::VERTEX_FORMAT|(frac&7UL);} - inline uint32_t VERTEX_TRANSLATE_X(int32_t x) {return DL::VERTEX_TRANSLATE_X|(x&131071UL);} - inline uint32_t VERTEX_TRANSLATE_Y(int32_t y) {return DL::VERTEX_TRANSLATE_Y|(y&131071UL);} - #endif -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h deleted file mode 100644 index 75a2d54fca..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h +++ /dev/null @@ -1,40 +0,0 @@ -/**************** - * ftdi_basic.h * - ****************/ - -/**************************************************************************** - * Written By Mark Pelletier 2019 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "../compat.h" - -#ifndef __MARLIN_FIRMWARE__ - #define FTDI_BASIC -#endif - -#ifdef FTDI_BASIC - #include "registers_ft800.h" - #include "registers_ft810.h" - #include "constants.h" - #include "boards.h" - #include "commands.h" - #include "spi.h" - #include "display_list.h" - #include "resolutions.h" -#endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h deleted file mode 100644 index 4063bf2d5d..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h +++ /dev/null @@ -1,150 +0,0 @@ -/********************* - * registers_ft800.h * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/**************************************************************************** - * This header defines registers for the FTDI FT800 LCD Driver chip. * - ****************************************************************************/ - -/******************************************************************************* - * FT810 * - * * - * START END ADDR SIZE NAME DESCRIPTION * - * * - * 0x000000 0x03FFFF 256 kB RAM_G Main Graphics RAM * - * * - * 0x0C0000 0x0C0003 4 B ROM_CHIPID [0:1] 0x800 Chip Id * - * [1:2] 0x0100 Vers ID * - * * - * 0x0BB23C 0x0FFFFB 275 kB ROM_FONT Font table and bitmap * - * * - * 0x0FFFFC 0x0FFFFF 4 B ROM_FONT_ADDR Font table pointer address * - * * - * 0x100000 0x101FFF 8 kB RAM_DL Display List RAM * - * * - * 0x102000 0x1023FF 1 kB RAM_PAL Palette RAM * - * * - * 0x102400 0x10257F 380 B * Registers * - * * - * 0x108000 0x108FFF 4 kB RAM_CMD Command Buffer * - * * - *******************************************************************************/ - -#pragma once - -namespace FTDI { - struct ft800_memory_map { - - // MEMORY LOCATIONS FT800 - static constexpr uint32_t RAM_G = 0x000000; // Main Graphics RAM - static constexpr uint32_t ROM_CHIPID = 0x0C0000; // Chip ID/Version ID - static constexpr uint32_t ROM_FONT = 0x0BB23C; // Font ROM - static constexpr uint32_t ROM_FONT_ADDR = 0x0FFFFC; // Font Table Pointer - static constexpr uint32_t RAM_DL = 0x100000; // Display List RAM - static constexpr uint32_t RAM_PAL = 0x102000; // Palette RAM - static constexpr uint32_t RAM_REG = 0x102400; // Registers - static constexpr uint32_t RAM_CMD = 0x108000; // Command Buffer - - static constexpr uint32_t RAM_G_SIZE = 256*1024L; // 256k - }; - - struct ft800_registers { - // REGISTERS AND ADDRESSES FT800 - - // REGISTER ADDRESS SIZE RESET VALUE TYPE DESCRIPTION - - static constexpr uint32_t ID = 0x102400; // 8 0x7C r Identification Register, Always 0x7C - static constexpr uint32_t FRAMES = 0x102404; // 32 0x00000000 r Frame Counter, Since Reset - static constexpr uint32_t CLOCK = 0x102408; // 32 0x00000000 r Clock cycles, Since Reset - static constexpr uint32_t FREQUENCY = 0x10240C; // 28 0x03938700 r/w Main Clock Frequency - static constexpr uint32_t RENDERMODE = 0x102410; // 1 0x00 r/w Rendering Mode: 0 = normal, 1 = single-line - static constexpr uint32_t SNAPY = 0x102414; // 11 0x0000 r/w Scan Line Select for RENDERMODE 1 - static constexpr uint32_t SNAPSHOT = 0x102418; // 1 - r Trigger for RENDERMODE 1 - static constexpr uint32_t CPURESET = 0x10241C; // 3 0x02 r/w RESET Bit2 Audio - Bit1 Touch - Bit0 Graphics - static constexpr uint32_t TAP_CRC = 0x102420; // 32 - r Live Video Tap - static constexpr uint32_t TAP_MASK = 0x102424; // 32 0xFFFFFFFF r/w Live Video Tap Mask - static constexpr uint32_t HCYCLE = 0x102428; // 12 0x224 r/w Horizontal Total Cycle Count - static constexpr uint32_t HOFFSET = 0x10242C; // 12 0x02B r/w Horizontal Display Start Offset - static constexpr uint32_t HSIZE = 0x102430; // 12 0x1E0 r/w Horizontal Display Pixel Count - static constexpr uint32_t HSYNC0 = 0x102434; // 12 0x000 r/w Horizontal Sync Fall Offset - static constexpr uint32_t HSYNC1 = 0x102438; // 12 0x029 r/w Horizontal Sync Rise Offset - static constexpr uint32_t VCYCLE = 0x10243C; // 12 0x124 r/w Vertical Total Cycle Count - static constexpr uint32_t VOFFSET = 0x102440; // 12 0x00C r/w Vertical Display Start Offset - static constexpr uint32_t VSIZE = 0x102444; // 12 0x110 r/w Vertical Display Line Count - static constexpr uint32_t VSYNC0 = 0x102448; // 10 0x000 r/w Vertical Sync Fall Offset - static constexpr uint32_t VSYNC1 = 0x10244C; // 10 0x00A r/w Vertical Sync Rise Offset - static constexpr uint32_t DLSWAP = 0x102450; // 2 0x00 r/w Display List Swap Control - static constexpr uint32_t ROTATE = 0x102454; // 3 0x00 r/w Screen 90,180, 270 degree rotate - static constexpr uint32_t OUTBITS = 0x102458; // 9 0x1B6 r/w Output Resolution, 3x3x3 Bits - static constexpr uint32_t DITHER = 0x10245C; // 1 0x01 r/w Output Dither Enable - static constexpr uint32_t SWIZZLE = 0x102460; // 4 0x00 r/w Output RGB Swizzle, Pin Change for PCB Routing - static constexpr uint32_t CSPREAD = 0x102464; // 1 0x01 r/w Output Clock Spreading Enable - static constexpr uint32_t PCLK_POL = 0x102468; // 1 0x00 r/w PCLK Polarity: 0 = Rising Edge, 1 = Falling Edge - static constexpr uint32_t PCLK = 0x10246C; // 8 0x00 r/w PCLK Frequency Divider, 0 = Disable Clock - static constexpr uint32_t TAG_X = 0x102470; // 11 0x000 r/w Tag Query X Coordinate - static constexpr uint32_t TAG_Y = 0x102474; // 11 0x000 r/w Tag Query Y Coordinate - static constexpr uint32_t TAG = 0x102478; // 8 0x00 r Tag Query Result - static constexpr uint32_t VOL_PB = 0x10247C; // 8 0xFF r/w Audio Playback Volume - static constexpr uint32_t VOL_SOUND = 0x102480; // 8 0xFF r/w Audio Synthesizer Volume - static constexpr uint32_t SOUND = 0x102484; // 16 0x0000 r/w Audio Sound Effect Select - static constexpr uint32_t PLAY = 0x102488; // 1 0x00 r/w Audio Start Effect Playback - static constexpr uint32_t GPIO_DIR = 0x10248C; // 8 0x80 r/w GPIO Pin Direction: 0 = Input , 1 = Output - static constexpr uint32_t GPIO = 0x102490; // 8 0x00 r/w GPIO Pin Values for 0, 1, 7 Drive Strength 2, 3, 4, 5, 6 - static constexpr uint32_t INT_FLAGS = 0x102498; // 8 0x00 r Interrupt Flags, Clear by Reading - static constexpr uint32_t INT_EN = 0x10249C; // 1 0x00 r/w Global Interrupt Enable - static constexpr uint32_t INT_MASK = 0x1024A0; // 8 0xFF r/w Interrupt Enable Mask - static constexpr uint32_t PLAYBACK_START = 0x1024A4; // 20 0x00000 r/w Audio Playback RAM Start Address - static constexpr uint32_t PLAYBACK_LENGTH = 0x1024A8; // 20 0x00000 r/w Audio Playback Sample Length (Bytes) - static constexpr uint32_t PLAYBACK_READPTR = 0x1024AC; // 20 - r Audio Playback Read Pointer - static constexpr uint32_t PLAYBACK_FREQ = 0x1024B0; // 16 0x1F40 r/w Audio Playback Frequency (Hz) - static constexpr uint32_t PLAYBACK_FORMAT = 0x1024B4; // 2 0x00 r/w Audio Playback Format - static constexpr uint32_t PLAYBACK_LOOP = 0x1024B8; // 1 0x00 r/w Audio Playback Loop Enable - static constexpr uint32_t PLAYBACK_PLAY = 0x1024BC; // 1 0x00 r Audio Start Playback - static constexpr uint32_t PWM_HZ = 0x1024C0; // 14 0x00FA r/w Backlight PWM Frequency (Hz) - static constexpr uint32_t PWM_DUTY = 0x1024C4; // 8 0x80 r/w Backlight PWM Duty Cycle: 0 = 0%, 128 = 100% - static constexpr uint32_t MACRO_0 = 0x1024C8; // 32 0x00000000 r/w Display List Macro Command 0 - static constexpr uint32_t MACRO_1 = 0x1024CC; // 32 0x00000000 r/w Display List Macro Command 1 - static constexpr uint32_t CMD_READ = 0x1024E4; // 12 0x000 r/w Command Buffer Read Pointer - static constexpr uint32_t CMD_WRITE = 0x1024E8; // 12 0x000 r/w Command Buffer Write Pointer - static constexpr uint32_t CMD_DL = 0x1024EC; // 13 0x0000 r/w Command Display List Offset - static constexpr uint32_t TOUCH_MODE = 0x1024F0; // 2 0x03 r/w Touch-Screen Sampling Mode - static constexpr uint32_t TOUCH_ADC_MODE = 0x1024F4; // 1 0x01 r/w Select Single Ended or Differential Sampling - static constexpr uint32_t TOUCH_CHARGE = 0x1024F8; // 16 0x1770 r/w Touch Screen Charge Time, n x 6 Clocks - static constexpr uint32_t TOUCH_SETTLE = 0x1024FC; // 4 0x03 r/w Touch-Screen Settle Time, n x 6 Clocks - static constexpr uint32_t TOUCH_OVERSAMPLE = 0x102500; // 4 0x07 r/w Touch-Screen Oversample Factor - static constexpr uint32_t TOUCH_RZTHRESH = 0x102504; // 16 0xFFFF r/w Touch-Screen Resistance Threshold - static constexpr uint32_t TOUCH_RAW_XY = 0x102508; // 32 - r Touch-Screen Raw (x-MSB16; y-LSB16) - static constexpr uint32_t TOUCH_RZ = 0x10250C; // 16 - r Touch-Screen Resistance - static constexpr uint32_t TOUCH_SCREEN_XY = 0x102510; // 32 - r Touch-Screen Screen (x-MSB16; y-LSB16) - static constexpr uint32_t TOUCH_TAG_XY = 0x102514; // 32 - r Touch-Screen Tag 0 Lookup (x-MSB16; y-LSB16) - static constexpr uint32_t TOUCH_TAG = 0x102518; // 8 - r Touch-Screen Tag 0 Result - static constexpr uint32_t TOUCH_TRANSFORM_A = 0x10251C; // 32 0x00010000 r/w Touch-Screen Transform Coefficient A (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_B = 0x102520; // 32 0x00000000 r/w Touch-Screen Transform Coefficient B (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_C = 0x102524; // 32 0x00000000 r/w Touch-Screen Transform Coefficient C (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_D = 0x102528; // 32 0x00000000 r/w Touch-Screen Transform Coefficient D (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_E = 0x10252C; // 32 0x00010000 r/w Touch-Screen Transform Coefficient E (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_F = 0x102530; // 32 0x00000000 r/w Touch-Screen Transform Coefficient F (s15.16) - // Reserved Addresses 0x102434 - 0x102470 - static constexpr uint32_t TOUCH_DIRECT_XY = 0x102574; // 32 - r Touch-Screen Direct Conversions XY (x-MSB16; y-LSB16) - static constexpr uint32_t TOUCH_DIRECT_Z1Z2 = 0x102578; // 32 - r Touch-Screen Direct Conversions Z (z1-MSB16; z2-LSB16) - static constexpr uint32_t TRACKER = 0x109000; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h deleted file mode 100644 index 448717b478..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h +++ /dev/null @@ -1,187 +0,0 @@ -/********************* - * registers_ft810.h * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/**************************************************************************** - * This header defines registers for the FTDI FT810 LCD Driver chip. * - ****************************************************************************/ - -/******************************************************************************* - * FT810 * - * * - * START END ADDR SIZE NAME DESCRIPTION * - * * - * 0x000000 0x0FFFFF 1024 kB RAM_G Main Graphics RAM (0 to 1048572) * - * * - * 0x0C0000 0x0C0003 4 B ROM_CHIPID [0:1] 0x800 Chip Id * - * [1:2] 0x0100 Vers ID * - * * - * 0x1E0000 0x2FFFFB 1152 kB ROM_FONT Font table and bitmap * - * * - * 0x201EE0 0x2029DC 2812 B ROM_FONT_ROOT ROM font table * - * * - * 0x2FFFFC 0x2FFFFF 4 B ROM_FONT_ADDR Font table pointer address * - * * - * 0x300000 0x301FFF 8 kB RAM_DL Display List RAM * - * * - * 0x302000 0x302FFF 4 kB * Registers * - * * - * 0x308000 0x308FFF 4 kB RAM_CMD Command Buffer * - * * - *******************************************************************************/ - -#pragma once - -namespace FTDI { - struct ft810_memory_map { - // MEMORY LOCATIONS FT810 - static constexpr uint32_t RAM_G = 0x000000; // Main Graphics RAM - static constexpr uint32_t ROM_CHIPID = 0x0C0000; // Chip ID/Version ID - static constexpr uint32_t ROM_FONT = 0x1E0000; // Font ROM - static constexpr uint32_t ROM_FONT_ADDR = 0x2FFFFC; // Font Table Pointer - static constexpr uint32_t RAM_DL = 0x300000; // Display List RAM - static constexpr uint32_t RAM_REG = 0x302000; // Registers - static constexpr uint32_t RAM_CMD = 0x308000; // Command Buffer - - static constexpr uint32_t RAM_G_SIZE = 1024*1024L; // 1024k - }; - - struct ft810_registers { - // REGISTERS AND ADDRESSES FT810 - - // REGISTER ADDRESS SIZE RESET VALUE TYPE DESCRIPTION - - static constexpr uint32_t ID = 0x302000; // 8 0x7C r Identification Register, Always 0x7C - static constexpr uint32_t FRAMES = 0x302004; // 32 0x00000000 r Frame Counter, Since Reset - static constexpr uint32_t CLOCK = 0x302008; // 32 0x00000000 r Clock cycles, Since Reset - static constexpr uint32_t FREQUENCY = 0x30200C; // 28 0x03938700 r/w Main Clock Frequency - static constexpr uint32_t RENDERMODE = 0x302010; // 1 0x00 r/w Rendering Mode: 0 = normal, 1 = single-line - static constexpr uint32_t SNAPY = 0x302014; // 11 0x0000 r/w Scan Line Select for RENDERMODE 1 - static constexpr uint32_t SNAPSHOT = 0x302018; // 1 - r Trigger for RENDERMODE 1 - static constexpr uint32_t SNAPFORMAT = 0x30201C; // 6 0x20 r/w Pixel Format for Scanline Readout - static constexpr uint32_t CPURESET = 0x302020; // 3 0x02 r/w RESET Bit2 Audio - Bit1 Touch - Bit0 Graphics - static constexpr uint32_t TAP_CRC = 0x302024; // 32 - r Live Video Tap - static constexpr uint32_t TAP_MASK = 0x302028; // 32 0xFFFFFFFF r/w Live Video Tap Mask - static constexpr uint32_t HCYCLE = 0x30202C; // 12 0x224 r/w Horizontal Total Cycle Count - static constexpr uint32_t HOFFSET = 0x302030; // 12 0x02B r/w Horizontal Display Start Offset - static constexpr uint32_t HSIZE = 0x302034; // 12 0x1E0 r/w Horizontal Display Pixel Count - static constexpr uint32_t HSYNC0 = 0x302038; // 12 0x000 r/w Horizontal Sync Fall Offset - static constexpr uint32_t HSYNC1 = 0x30203C; // 12 0x029 r/w Horizontal Sync Rise Offset - static constexpr uint32_t VCYCLE = 0x302040; // 12 0x124 r/w Vertical Total Cycle Count - static constexpr uint32_t VOFFSET = 0x302044; // 12 0x00C r/w Vertical Display Start Offset - static constexpr uint32_t VSIZE = 0x302048; // 12 0x110 r/w Vertical Display Line Count - static constexpr uint32_t VSYNC0 = 0x30204C; // 10 0x000 r/w Vertical Sync Fall Offset - static constexpr uint32_t VSYNC1 = 0x302050; // 10 0x00A r/w Vertical Sync Rise Offset - static constexpr uint32_t DLSWAP = 0x302054; // 2 0x00 r/w Display List Swap Control - static constexpr uint32_t ROTATE = 0x302058; // 3 0x00 r/w Screen 90,180, 270 degree rotate - static constexpr uint32_t OUTBITS = 0x30205C; // 9 0x1B6 r/w Output Resolution, 3x3x3 Bits - static constexpr uint32_t DITHER = 0x302060; // 1 0x01 r/w Output Dither Enable - static constexpr uint32_t SWIZZLE = 0x302064; // 4 0x00 r/w Output RGB Swizzle, Pin Change for PCB Routing - static constexpr uint32_t CSPREAD = 0x302068; // 1 0x01 r/w Output Clock Spreading Enable - static constexpr uint32_t PCLK_POL = 0x30206C; // 1 0x00 r/w PCLK Polarity: 0 = Rising Edge, 1 = Falling Edge - static constexpr uint32_t PCLK = 0x302070; // 8 0x00 r/w PCLK Frequency Divider, 0 = Disable Clock - static constexpr uint32_t TAG_X = 0x302074; // 11 0x000 r/w Tag Query X Coordinate - static constexpr uint32_t TAG_Y = 0x302078; // 11 0x000 r/w Tag Query Y Coordinate - static constexpr uint32_t TAG = 0x30207C; // 8 0x00 r Tag Query Result - static constexpr uint32_t VOL_PB = 0x302080; // 8 0xFF r/w Audio Playback Volume - static constexpr uint32_t VOL_SOUND = 0x302084; // 8 0xFF r/w Audio Synthesizer Volume - static constexpr uint32_t SOUND = 0x302088; // 16 0x0000 r/w Audio Sound Effect Select - static constexpr uint32_t PLAY = 0x30208C; // 1 0x00 r/w Audio Start Effect Playback - static constexpr uint32_t GPIO_DIR = 0x302090; // 8 0x80 r/w GPIO Pin Direction: 0 = Input , 1 = Output - static constexpr uint32_t GPIO = 0x302094; // 8 0x00 r/w GPIO Pin Values for 0, 1, 7 Drive Strength 2, 3, 4, 5, 6 - static constexpr uint32_t GPIOX_DIR = 0x302098; // 16 0x8000 r/w Extended GPIO Pin Direction - static constexpr uint32_t GPIOX = 0x30209C; // 16 0x0080 r/w Extended GPIO Pin Values - // Reserved Addr 0x3020A0 - // Reserved Addr 0x3020A4 - static constexpr uint32_t INT_FLAGS = 0x3020A8; // 8 0x00 r Interrupt Flags, Clear by Reading - static constexpr uint32_t INT_EN = 0x3020AC; // 1 0x00 r/w Global Interrupt Enable - static constexpr uint32_t INT_MASK = 0x3020B0; // 8 0xFF r/w Interrupt Enable Mask - static constexpr uint32_t PLAYBACK_START = 0x3020B4; // 20 0x00000 r/w Audio Playback RAM Start Address - static constexpr uint32_t PLAYBACK_LENGTH = 0x3020B8; // 20 0x00000 r/w Audio Playback Sample Length (Bytes) - static constexpr uint32_t PLAYBACK_READPTR = 0x3020BC; // 20 - r Audio Playback Read Pointer - static constexpr uint32_t PLAYBACK_FREQ = 0x3020C0; // 16 0x1F40 r/w Audio Playback Frequency (Hz) - static constexpr uint32_t PLAYBACK_FORMAT = 0x3020C4; // 2 0x00 r/w Audio Playback Format - static constexpr uint32_t PLAYBACK_LOOP = 0x3020C8; // 1 0x00 r/w Audio Playback Loop Enable - static constexpr uint32_t PLAYBACK_PLAY = 0x3020CC; // 1 0x00 r Audio Start Playback - static constexpr uint32_t PWM_HZ = 0x3020D0; // 14 0x00FA r/w Backlight PWM Frequency (Hz) - static constexpr uint32_t PWM_DUTY = 0x3020D4; // 8 0x80 r/w Backlight PWM Duty Cycle: 0 = 0%, 128 = 100% - static constexpr uint32_t MACRO_0 = 0x3020D8; // 32 0x00000000 r/w Display List Macro Command 0 - static constexpr uint32_t MACRO_1 = 0x3020DC; // 32 0x00000000 r/w Display List Macro Command 1 - // Reserved Addr 0x3020E0 - // Reserved Addr 0x3020E4 - // Reserved Addr 0x3020E8 - // Reserved Addr 0x3020EC - // Reserved Addr 0x3020F0 - // Reserved Addr 0x3020F4 - static constexpr uint32_t CMD_READ = 0x3020F8; // 12 0x000 r/w Command Buffer Read Pointer - static constexpr uint32_t CMD_WRITE = 0x3020FC; // 12 0x000 r/w Command Buffer Write Pointer - static constexpr uint32_t CMD_DL = 0x302100; // 13 0x0000 r/w Command Display List Offset - static constexpr uint32_t TOUCH_MODE = 0x302104; // 2 0x03 r/w Touch-Screen Sampling Mode - static constexpr uint32_t TOUCH_ADC_MODE = 0x302108; // 1 0x01 r/w Select Single Ended or Differential Sampling - static constexpr uint32_t TOUCH_CHARGE = 0x30210C; // 16 0x1770 r/w Touch Screen Charge Time, n x 6 Clocks - static constexpr uint32_t TOUCH_SETTLE = 0x302110; // 4 0x03 r/w Touch-Screen Settle Time, n x 6 Clocks - static constexpr uint32_t TOUCH_OVERSAMPLE = 0x302114; // 4 0x07 r/w Touch-Screen Oversample Factor - static constexpr uint32_t TOUCH_RZTHRESH = 0x302118; // 16 0xFFFF r/w Touch-Screen Resistance Threshold - static constexpr uint32_t TOUCH_RAW_XY = 0x30211C; // 32 - r Touch-Screen Raw (x-MSB16; y-LSB16) - static constexpr uint32_t TOUCH_RZ = 0x302120; // 16 - r Touch-Screen Resistance - static constexpr uint32_t TOUCH_SCREEN_XY = 0x302124; // 32 - r Touch-Screen Screen (x-MSB16; y-LSB16) - static constexpr uint32_t TOUCH_TAG_XY = 0x302128; // 32 - r Touch-Screen Tag 0 Lookup (x-MSB16; y-LSB16) - static constexpr uint32_t TOUCH_TAG = 0x30212C; // 8 - r Touch-Screen Tag 0 Result - static constexpr uint32_t TOUCH_TAG1_XY = 0x302130; // 32 - r Touch-Screen Tag 1 Lookup - static constexpr uint32_t TOUCH_TAG1 = 0x302134; // 8 - r Touch-Screen Tag 1 Result - static constexpr uint32_t TOUCH_TAG2_XY = 0x302138; // 32 - r Touch-Screen Tag 2 Lookup - static constexpr uint32_t TOUCH_TAG2 = 0x30213C; // 8 - r Touch-Screen Tag 2 Result - static constexpr uint32_t TOUCH_TAG3_XY = 0x302140; // 32 - r Touch-Screen Tag 3 Lookup - static constexpr uint32_t TOUCH_TAG3 = 0x302144; // 8 - r Touch-Screen Tag 3 Result - static constexpr uint32_t TOUCH_TAG4_XY = 0x302148; // 32 - r Touch-Screen Tag 4 Lookup - static constexpr uint32_t TOUCH_TAG4 = 0x30214C; // 8 - r Touch-Screen Tag 4 Result - static constexpr uint32_t TOUCH_TRANSFORM_A = 0x302150; // 32 0x00010000 r/w Touch-Screen Transform Coefficient A (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_B = 0x302154; // 32 0x00000000 r/w Touch-Screen Transform Coefficient B (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_C = 0x302158; // 32 0x00000000 r/w Touch-Screen Transform Coefficient C (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_D = 0x30215C; // 32 0x00000000 r/w Touch-Screen Transform Coefficient D (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_E = 0x302160; // 32 0x00010000 r/w Touch-Screen Transform Coefficient E (s15.16) - static constexpr uint32_t TOUCH_TRANSFORM_F = 0x302164; // 32 0x00000000 r/w Touch-Screen Transform Coefficient F (s15.16) - static constexpr uint32_t TOUCH_CONFIG = 0x302168; // 16 0x8381 r/w Touch Configuration - static constexpr uint32_t CTOUCH_TOUCH4_X = 0x30216C; // 16 - r Extended Mode Touch Screen - // Reserved Addresses 0x302170 - static constexpr uint32_t BIST_EN = 0x302174; // 1 0 r/w BIST Memory Mapping Enable - // Reserved Addr 0x302178 - // Reserved Addr 0x30217C - static constexpr uint32_t TRIM = 0x302180; // 8 0 r/w Internal Clock Trimming - static constexpr uint32_t ANA_COMP = 0x302184; // 8 0 r/w Analog Control Register - static constexpr uint32_t SPI_WIDTH = 0x302188; // 3 0 r/w QSPI Bus Width Setting - static constexpr uint32_t TOUCH_DIRECT_XY = 0x30218C; // 32 - r Touch-Screen Direct Conversions XY (x-MSB16; y-LSB16) - static constexpr uint32_t TOUCH_DIRECT_Z1Z2 = 0x302190; // 32 - r Touch-Screen Direct Conversions Z (z1-MSB16; z2-LSB16) - // Reserved Addresses 0x302194 - 0x302560 - static constexpr uint32_t DATESTAMP = 0x320564; // 128 - r Stamp Date Code - static constexpr uint32_t CMDB_SPACE = 0x302574; // 12 0xFFC r/w Command DL Space Available - static constexpr uint32_t CMDB_WRITE = 0x302578; // 32 0 w Command DL Write - - static constexpr uint32_t TRACKER = 0x309000; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) - static constexpr uint32_t TRACKER_1 = 0x309004; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) - static constexpr uint32_t TRACKER_2 = 0x309008; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) - static constexpr uint32_t TRACKER_3 = 0x30900C; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) - static constexpr uint32_t TRACKER_4 = 0x309010; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) - - static constexpr uint32_t MEDIAFIFO_READ = 0x309014; // 32 0x00000000 r/w Media FIFO read pointer - static constexpr uint32_t MEDIAFIFO_WRITE = 0x309018; // 32 0x00000000 r/w Media FIFO write pointer - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h deleted file mode 100644 index 8d455907e9..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h +++ /dev/null @@ -1,127 +0,0 @@ -/***************** - * resolutions.h * - *****************/ - -/**************************************************************************** - * Written By Mark Pelletier 2019 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/*** - * The FT8xx has odd registers that don't correspond to timing values in - * display datasheets. This macro computes the register values using the - * formulas given in the document: - * - * Bridgetek Application Note - * AN_336 FT8xx - * Selecting an LCD Display - * Version 2.1 - * Issue Date: 2017-11-14 - */ -#define COMPUTE_REGS_FROM_DATASHEET \ - constexpr uint16_t Hoffset = thfp + thb - 1; \ - constexpr uint16_t Hcycle = th; \ - constexpr uint16_t Hsync0 = thfp - 1 ; \ - constexpr uint16_t Hsync1 = thfp + thpw - 1; \ - constexpr uint16_t Voffset = tvfp + tvb - 1; \ - constexpr uint16_t Vcycle = tv; \ - constexpr uint16_t Vsync0 = tvfp - 1; \ - constexpr uint16_t Vsync1 = tvfp + tvpw - 1; \ - static_assert(thfp + thb + Hsize == th, "Mismatch in display th"); \ - static_assert(tvfp + tvb + Vsize == tv, "Mismatch in display tv"); - -#ifdef TOUCH_UI_320x240 - namespace FTDI { - constexpr uint8_t Pclk = 8; - constexpr uint8_t Pclkpol = 0; - constexpr uint16_t Hsize = 320; - constexpr uint16_t Vsize = 240; - constexpr uint16_t Vsync0 = 0; - constexpr uint16_t Vsync1 = 2; - constexpr uint16_t Voffset = 13; - constexpr uint16_t Vcycle = 263; - constexpr uint16_t Hsync0 = 0; - constexpr uint16_t Hsync1 = 10; - constexpr uint16_t Hoffset = 70; - constexpr uint16_t Hcycle = 408; - - constexpr uint32_t default_transform_a = 0x000054AD; - constexpr uint32_t default_transform_b = 0xFFFFFF52; - constexpr uint32_t default_transform_c = 0xFFF7F6E4; - constexpr uint32_t default_transform_d = 0x00000065; - constexpr uint32_t default_transform_e = 0xFFFFBE3B; - constexpr uint32_t default_transform_f = 0x00F68E75; - } - -#elif defined(TOUCH_UI_480x272) - namespace FTDI { - constexpr uint8_t Pclk = 7; - constexpr uint8_t Pclkpol = 1; - constexpr uint16_t Hsize = 480; - constexpr uint16_t Vsize = 272; - - constexpr uint16_t th = 525; // One horizontal line - constexpr uint16_t thfp = 43; // HS Front porch - constexpr uint16_t thb = 2; // HS Back porch (blanking) - constexpr uint16_t thpw = 41; // HS pulse width - - constexpr uint16_t tv = 286; // Vertical period time - constexpr uint16_t tvfp = 12; // VS Front porch - constexpr uint16_t tvb = 2; // VS Back porch (blanking) - constexpr uint16_t tvpw = 10; // VS pulse width - - COMPUTE_REGS_FROM_DATASHEET - - constexpr uint32_t default_transform_a = 0x00008100; - constexpr uint32_t default_transform_b = 0x00000000; - constexpr uint32_t default_transform_c = 0xFFF18000; - constexpr uint32_t default_transform_d = 0x00000000; - constexpr uint32_t default_transform_e = 0xFFFFB100; - constexpr uint32_t default_transform_f = 0x0120D000; - } - -#elif defined(TOUCH_UI_800x480) - namespace FTDI { - constexpr uint8_t Pclk = 3; - constexpr uint8_t Pclkpol = 1; - constexpr uint16_t Hsize = 800; - constexpr uint16_t Vsize = 480; - - constexpr uint16_t th = 1056; // One horizontal line - constexpr uint16_t thfp = 210; // HS Front porch - constexpr uint16_t thb = 46; // HS Back porch (blanking) - constexpr uint16_t thpw = 23; // HS pulse width - - constexpr uint16_t tv = 525; // Vertical period time - constexpr uint16_t tvfp = 22; // VS Front porch - constexpr uint16_t tvb = 23; // VS Back porch (blanking) - constexpr uint16_t tvpw = 10; // VS pulse width - - COMPUTE_REGS_FROM_DATASHEET - - constexpr uint32_t default_transform_a = 0x0000D8B9; - constexpr uint32_t default_transform_b = 0x00000124; - constexpr uint32_t default_transform_c = 0xFFE23926; - constexpr uint32_t default_transform_d = 0xFFFFFF51; - constexpr uint32_t default_transform_e = 0xFFFF7E4F; - constexpr uint32_t default_transform_f = 0x01F0AF70; - } - -#else - #error "Unknown or no TOUCH_UI_FTDI_EVE display resolution specified. To add a display resolution, modify 'ftdi_eve_resolutions.h'." -#endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp deleted file mode 100644 index d91d08fbfa..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/*********** - * spi.cpp * - ***********/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_basic.h" - -#ifdef FTDI_BASIC - -/********************************* SPI Functions *********************************/ - -namespace FTDI { - - #ifndef CLCD_USE_SOFT_SPI - #ifdef CLCD_SPI_BUS - SPIClass EVE_SPI(CLCD_SPI_BUS); - #endif - #ifndef CLCD_HW_SPI_SPEED - #define CLCD_HW_SPI_SPEED 8000000 >> SPI_SPEED - #endif - SPISettings SPI::spi_settings(CLCD_HW_SPI_SPEED, MSBFIRST, SPI_MODE0); - #endif - - void SPI::spi_init() { - SET_OUTPUT(CLCD_MOD_RESET); // Module Reset (a.k.a. PD, not SPI) - WRITE(CLCD_MOD_RESET, 0); // start with module in power-down - - SET_OUTPUT(CLCD_SPI_CS); - WRITE(CLCD_SPI_CS, 1); - - #ifdef CLCD_SPI_EXTRA_CS - SET_OUTPUT(CLCD_SPI_EXTRA_CS); - WRITE(CLCD_SPI_EXTRA_CS, 1); - #endif - - #ifdef SPI_FLASH_SS - SET_OUTPUT(SPI_FLASH_SS); - WRITE(SPI_FLASH_SS, 1); - #endif - - #ifdef CLCD_USE_SOFT_SPI - SET_OUTPUT(CLCD_SOFT_SPI_MOSI); - WRITE(CLCD_SOFT_SPI_MOSI, 1); - - SET_OUTPUT(CLCD_SOFT_SPI_SCLK); - WRITE(CLCD_SOFT_SPI_SCLK, 0); - - SET_INPUT_PULLUP(CLCD_SOFT_SPI_MISO); - #else - SPI_OBJ.begin(); - #endif - } - - #ifdef CLCD_USE_SOFT_SPI - uint8_t SPI::_soft_spi_xfer(uint8_t spiOutByte) { - uint8_t spiIndex = 0x80; - uint8_t spiInByte = 0; - uint8_t k; - - noInterrupts(); - for (k = 0; k < 8; k++) { // Output and Read each bit of spiOutByte and spiInByte - WRITE(CLCD_SOFT_SPI_MOSI, (spiOutByte & spiIndex) ? 1 : 0); // Output MOSI Bit - WRITE(CLCD_SOFT_SPI_SCLK, 1); // Pulse Clock - if (READ(CLCD_SOFT_SPI_MISO)) spiInByte |= spiIndex; // MISO changes on the falling edge of clock, so sample it before - WRITE(CLCD_SOFT_SPI_SCLK, 0); - spiIndex >>= 1; - } - interrupts(); - return spiInByte; - } - #endif - - #ifdef CLCD_USE_SOFT_SPI - void SPI::_soft_spi_send(uint8_t spiOutByte) { - uint8_t k, spiIndex = 0x80; - - noInterrupts(); - for (k = 0; k < 8; k++) { // Output each bit of spiOutByte - WRITE(CLCD_SOFT_SPI_MOSI, (spiOutByte & spiIndex) ? 1 : 0); // Output MOSI Bit - WRITE(CLCD_SOFT_SPI_SCLK, 1); // Pulse Clock - WRITE(CLCD_SOFT_SPI_SCLK, 0); - spiIndex >>= 1; - } - interrupts(); - } - #endif - - void SPI::spi_read_bulk(void *data, uint16_t len) { - uint8_t* p = (uint8_t *)data; - while (len--) *p++ = spi_recv(); - } - - bool SPI::spi_verify_bulk(const void *data, uint16_t len) { - const uint8_t* p = (const uint8_t *)data; - while (len--) if (*p++ != spi_recv()) return false; - return true; - } - - // CLCD SPI - Chip Select - void SPI::spi_ftdi_select() { - #ifndef CLCD_USE_SOFT_SPI - SPI_OBJ.beginTransaction(spi_settings); - #endif - WRITE(CLCD_SPI_CS, 0); - #ifdef CLCD_SPI_EXTRA_CS - WRITE(CLCD_SPI_EXTRA_CS, 0); - #endif - delayMicroseconds(1); - } - - // CLCD SPI - Chip Deselect - void SPI::spi_ftdi_deselect() { - WRITE(CLCD_SPI_CS, 1); - #ifdef CLCD_SPI_EXTRA_CS - WRITE(CLCD_SPI_EXTRA_CS, 1); - #endif - #ifndef CLCD_USE_SOFT_SPI - SPI_OBJ.endTransaction(); - #endif - } - - #ifdef SPI_FLASH_SS - // Serial SPI Flash SPI - Chip Select - void SPI::spi_flash_select() { - #ifndef CLCD_USE_SOFT_SPI - SPI_OBJ.beginTransaction(spi_settings); - #endif - WRITE(SPI_FLASH_SS, 0); - delayMicroseconds(1); - } - - // Serial SPI Flash SPI - Chip Deselect - void SPI::spi_flash_deselect() { - WRITE(SPI_FLASH_SS, 1); - #ifndef CLCD_USE_SOFT_SPI - SPI_OBJ.endTransaction(); - #endif - } - #endif - - // Not really a SPI signal... - void SPI::ftdi_reset() { - WRITE(CLCD_MOD_RESET, 0); - delay(6); /* minimum time for power-down is 5ms */ - WRITE(CLCD_MOD_RESET, 1); - delay(21); /* minimum time to allow from rising PD_N to first access is 20ms */ - } - - // Not really a SPI signal... - void SPI::test_pulse() { - #ifdef CLCD_AUX_0 - WRITE(CLCD_AUX_0, 1); - delayMicroseconds(10); - WRITE(CLCD_AUX_0, 0); - #endif - } -} -#endif // FTDI_BASIC diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h deleted file mode 100644 index 30ec786c60..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h +++ /dev/null @@ -1,136 +0,0 @@ -/********* - * spi.h * - *********/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#ifndef CLCD_USE_SOFT_SPI - #include -#endif - -namespace FTDI { - - #if !defined(CLCD_SPI_BUS) || defined(CLCD_USE_SOFT_SPI) - #define SPI_OBJ ::SPI - #else - extern SPIClass EVE_SPI; - #define SPI_OBJ EVE_SPI - #endif - - namespace SPI { - #ifndef CLCD_USE_SOFT_SPI - extern SPISettings spi_settings; - #endif - - uint8_t _soft_spi_xfer (uint8_t val); - void _soft_spi_send (uint8_t val); - - void spi_init (); - - void spi_ftdi_select (); - void spi_ftdi_deselect (); - - void spi_flash_select (); - void spi_flash_deselect (); - - inline uint8_t spi_recv() { - #ifdef CLCD_USE_SOFT_SPI - return _soft_spi_xfer(0x00); - #else - return SPI_OBJ.transfer(0x00); - #endif - }; - - inline void spi_send (uint8_t val) { - #ifdef CLCD_USE_SOFT_SPI - _soft_spi_send(val); - #else - SPI_OBJ.transfer(val); - #endif - }; - - inline void spi_write_8 (uint8_t val) {spi_send(val);}; - inline uint8_t spi_read_8 () {return spi_recv();}; - - namespace least_significant_byte_first { - inline void spi_write_16 (uint16_t val) {spi_send(val >> 0); - spi_send(val >> 8);}; - inline void spi_write_32 (uint32_t val) {spi_send(val >> 0); - spi_send(val >> 8); - spi_send(val >> 16); - spi_send(val >> 24);}; - - inline uint8_t spi_read_8 () {return spi_recv();}; - inline uint16_t spi_read_16 () {return (((uint16_t) spi_recv()) << 0) | - (((uint16_t) spi_recv()) << 8);}; - inline uint32_t spi_read_32 () {return (((uint32_t) spi_recv()) << 0) | - (((uint32_t) spi_recv()) << 8) | - (((uint32_t) spi_recv()) << 16) | - (((uint32_t) spi_recv()) << 24);}; - } - - namespace most_significant_byte_first { - inline void spi_write_16 (uint16_t val) {spi_send(val >> 8); - spi_send(val >> 0);}; - inline void spi_write_24 (uint32_t val) {spi_send(val >> 16); - spi_send(val >> 8); - spi_send(val >> 0);}; - inline void spi_write_32 (uint32_t val) {spi_send(val >> 24); - spi_send(val >> 16); - spi_send(val >> 8); - spi_send(val >> 0);}; - - inline uint16_t spi_read_16 () {return (((uint16_t) spi_recv()) << 8) | - (((uint16_t) spi_recv()) << 0);}; - inline uint32_t spi_read_32 () {return (((uint32_t) spi_recv()) << 24) | - (((uint32_t) spi_recv()) << 16) | - (((uint32_t) spi_recv()) << 8) | - (((uint32_t) spi_recv()) << 0);}; - } - - inline uint8_t ram_write(const uint8_t *p) {return *p;} - inline uint8_t pgm_write(const uint8_t *p) {return pgm_read_byte(p);} - - typedef uint8_t (*bulk_write_op)(const uint8_t*); - - // Generic template for function for writing multiple bytes, plus padding bytes. - // The template parameter op is an inlineable function which is applied to each byte. - - template - void spi_write_bulk(const void *data, uint16_t len, uint8_t padding) { - const uint8_t* p = (const uint8_t *)data; - while (len--) spi_send(byte_op(p++)); - while (padding--) spi_send(0); - } - - template - void spi_write_bulk(const void *data, uint16_t len) { - const uint8_t* p = (const uint8_t *)data; - while (len--) spi_send(byte_op(p++)); - } - - void spi_read_bulk( void *data, uint16_t len); - bool spi_verify_bulk(const void *data, uint16_t len); - - void ftdi_reset(); - void test_pulse(); - } -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h deleted file mode 100644 index 436c67edf2..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h +++ /dev/null @@ -1,271 +0,0 @@ -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "../config.h" - -#ifdef __MARLIN_FIRMWARE__ - - // Marlin will define the I/O functions for us - #if ENABLED(TOUCH_UI_FTDI_EVE) - #define FTDI_BASIC - #define FTDI_EXTENDED - #endif - -#else // !__MARLIN_FIRMWARE__ - - #include - - #ifndef CLCD_USE_SOFT_SPI - #include - #endif - - namespace fast_io { - - template - struct port_pin { - typedef port_t port; - static inline void set_high() {port::port() = (port::port() | bits);} - static inline void set_low() {port::port() = (port::port() & (~bits));} - static inline void set_input() {port::ddr() = (port::ddr() & (~bits));} - static inline void set_input_pullup() {set_input(); set_high();} - static inline void set_output() {port::ddr() = (port::ddr() | bits);} - static inline uint8_t read() {return port::pin() & bits;} - static inline void write(bool v) {if (v) set_high(); else set_low();} - }; - - #define MAKE_AVR_PORT_PINS(ID) \ - struct port_##ID { \ - static volatile uint8_t &pin() {return PIN##ID;}; \ - static volatile uint8_t &port() {return PORT##ID;}; \ - static volatile uint8_t &ddr() {return DDR##ID;}; \ - }; \ - typedef port_pin AVR_##ID##0; \ - typedef port_pin AVR_##ID##1; \ - typedef port_pin AVR_##ID##2; \ - typedef port_pin AVR_##ID##3; \ - typedef port_pin AVR_##ID##4; \ - typedef port_pin AVR_##ID##5; \ - typedef port_pin AVR_##ID##6; \ - typedef port_pin AVR_##ID##7; - - #ifdef PORTA - MAKE_AVR_PORT_PINS(A); - #endif - #ifdef PORTB - MAKE_AVR_PORT_PINS(B); - #endif - #ifdef PORTC - MAKE_AVR_PORT_PINS(C); - #endif - #ifdef PORTD - MAKE_AVR_PORT_PINS(D); - #endif - #ifdef PORTE - MAKE_AVR_PORT_PINS(E); - #endif - #ifdef PORTF - MAKE_AVR_PORT_PINS(F); - #endif - #ifdef PORTG - MAKE_AVR_PORT_PINS(G); - #endif - #ifdef PORTH - MAKE_AVR_PORT_PINS(H); - #endif - #ifdef PORTJ - MAKE_AVR_PORT_PINS(J); - #endif - #ifdef PORTK - MAKE_AVR_PORT_PINS(K); - #endif - #ifdef PORTL - MAKE_AVR_PORT_PINS(L); - #endif - #ifdef PORTQ - MAKE_AVR_PORT_PINS(Q); - #endif - #ifdef PORTR - MAKE_AVR_PORT_PINS(R); - #endif - - #undef MAKE_AVR_PORT_PINS - - template - struct arduino_digital_pin { - static constexpr uint8_t pin = p; - static inline void set_high() {digitalWrite(p, HIGH);} - static inline void set_low() {digitalWrite(p, LOW);} - static inline void set_input() {pinMode(p, INPUT);} - static inline void set_input_pullup() {pinMode(p, INPUT_PULLUP);} - static inline void set_output() {pinMode(p, OUTPUT);} - static inline uint8_t read() {return digitalRead(p);} - static inline void write(bool v) {digitalWrite(p, v ? HIGH : LOW);} - }; - - #define MAKE_ARDUINO_PINS(ID) typedef arduino_digital_pin ARDUINO_DIGITAL_##ID; - MAKE_ARDUINO_PINS( 0); - MAKE_ARDUINO_PINS( 1); - MAKE_ARDUINO_PINS( 2); - MAKE_ARDUINO_PINS( 3); - MAKE_ARDUINO_PINS( 4); - MAKE_ARDUINO_PINS( 5); - MAKE_ARDUINO_PINS( 6); - MAKE_ARDUINO_PINS( 7); - MAKE_ARDUINO_PINS( 8); - MAKE_ARDUINO_PINS( 9); - MAKE_ARDUINO_PINS(10); - MAKE_ARDUINO_PINS(11); - MAKE_ARDUINO_PINS(12); - MAKE_ARDUINO_PINS(13); - MAKE_ARDUINO_PINS(14); - MAKE_ARDUINO_PINS(15); - MAKE_ARDUINO_PINS(16); - MAKE_ARDUINO_PINS(17); - MAKE_ARDUINO_PINS(18); - MAKE_ARDUINO_PINS(19); - MAKE_ARDUINO_PINS(10); - MAKE_ARDUINO_PINS(21); - MAKE_ARDUINO_PINS(22); - MAKE_ARDUINO_PINS(23); - MAKE_ARDUINO_PINS(24); - MAKE_ARDUINO_PINS(25); - MAKE_ARDUINO_PINS(26); - MAKE_ARDUINO_PINS(27); - MAKE_ARDUINO_PINS(28); - MAKE_ARDUINO_PINS(29); - MAKE_ARDUINO_PINS(30); - MAKE_ARDUINO_PINS(31); - MAKE_ARDUINO_PINS(32); - MAKE_ARDUINO_PINS(33); - MAKE_ARDUINO_PINS(34); - MAKE_ARDUINO_PINS(35); - MAKE_ARDUINO_PINS(36); - MAKE_ARDUINO_PINS(37); - MAKE_ARDUINO_PINS(38); - MAKE_ARDUINO_PINS(39); - MAKE_ARDUINO_PINS(40); - MAKE_ARDUINO_PINS(41); - MAKE_ARDUINO_PINS(42); - MAKE_ARDUINO_PINS(43); - MAKE_ARDUINO_PINS(44); - MAKE_ARDUINO_PINS(45); - MAKE_ARDUINO_PINS(46); - MAKE_ARDUINO_PINS(47); - MAKE_ARDUINO_PINS(48); - MAKE_ARDUINO_PINS(49); - MAKE_ARDUINO_PINS(50); - MAKE_ARDUINO_PINS(51); - MAKE_ARDUINO_PINS(52); - MAKE_ARDUINO_PINS(53); - #undef MAKE_ARDUINO_PINS - } // namespace fast_io - - #define SET_INPUT(pin) fast_io::pin::set_input() - #define SET_INPUT_PULLUP(pin) do{ fast_io::pin::set_input(); fast_io::pin::set_high(); }while(0) - #define SET_INPUT_PULLDOWN SET_INPUT - #define SET_OUTPUT(pin) fast_io::pin::set_output() - #define READ(pin) fast_io::pin::read() - #define WRITE(pin, value) fast_io::pin::write(value) - - #ifndef pgm_read_word_far - #define pgm_read_word_far pgm_read_word - #endif - - #ifndef pgm_read_dword_far - #define pgm_read_dword_far pgm_read_dword - #endif - - #ifndef pgm_read_ptr_far - #define pgm_read_ptr_far pgm_read_ptr - #endif - - #define SERIAL_ECHO_START() - #define SERIAL_ECHOLNPGM(str) Serial.println(F(str)) - #define SERIAL_ECHOPGM(str) Serial.print(F(str)) - #define SERIAL_ECHO_MSG(str) Serial.println(str) - #define SERIAL_ECHOLNPAIR(str, val) do{ Serial.print(F(str)); Serial.println(val); }while(0) - #define SERIAL_ECHOPAIR(str, val) do{ Serial.print(F(str)); Serial.print(val); }while(0) - - #define safe_delay delay - - // Define macros for compatibility - - #define _CAT(a,V...) a##V - #define CAT(a,V...) _CAT(a,V) - - #define FIRST(a,...) a - #define SECOND(a,b,...) b - #define THIRD(a,b,c,...) c - - #define IS_PROBE(V...) SECOND(V, 0) // Get the second item passed, or 0 - #define PROBE() ~, 1 // Second item will be 1 if this is passed - #define _NOT_0 PROBE() - #define NOT(x) IS_PROBE(_CAT(_NOT_, x)) // NOT('0') gets '1'. Anything else gets '0'. - #define _BOOL(x) NOT(NOT(x)) // NOT('0') gets '0'. Anything else gets '1'. - - #define _DO_1(W,C,A) (_##W##_1(A)) - #define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B)) - #define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V)) - #define _DO_4(W,C,A,V...) (_##W##_1(A) C _DO_3(W,C,V)) - #define _DO_5(W,C,A,V...) (_##W##_1(A) C _DO_4(W,C,V)) - #define _DO_6(W,C,A,V...) (_##W##_1(A) C _DO_5(W,C,V)) - #define _DO_7(W,C,A,V...) (_##W##_1(A) C _DO_6(W,C,V)) - #define _DO_8(W,C,A,V...) (_##W##_1(A) C _DO_7(W,C,V)) - #define _DO_9(W,C,A,V...) (_##W##_1(A) C _DO_8(W,C,V)) - #define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V)) - #define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V)) - #define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V)) - #define __DO_N(W,C,N,V...) _DO_##N(W,C,V) - #define _DO_N(W,C,N,V...) __DO_N(W,C,N,V) - #define DO(W,C,V...) _DO_N(W,C,NUM_ARGS(V),V) - - #define _ISENA_ ~,1 - #define _ISENA_1 ~,1 - #define _ISENA_0x1 ~,1 - #define _ISENA_true ~,1 - #define _ISENA(V...) IS_PROBE(V) - #define _ENA_1(O) _ISENA(CAT(_IS,CAT(ENA_, O))) - #define _DIS_1(O) NOT(_ENA_1(O)) - #define ENABLED(V...) DO(ENA,&&,V) - #define DISABLED(V...) DO(DIS,&&,V) - - #define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION converted to '0' or '1' - #define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION converted to A or '0' - #define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION converted to A or '1' - #define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION converted to A or '' - #define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1' - #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' - #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. - - #define ANY(V...) !DISABLED(V) - #define NONE(V...) DISABLED(V) - #define ALL(V...) ENABLED(V) - #define BOTH(V1,V2) ALL(V1,V2) - #define EITHER(V1,V2) ANY(V1,V2) - - // Remove compiler warning on an unused variable - #ifndef UNUSED - #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) - #define UNUSED(X) (void)X - #else - #define UNUSED(x) ((void)(x)) - #endif - #endif - -#endif // !__MARLIN_FIRMWARE__ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h deleted file mode 100644 index b763c890c2..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h +++ /dev/null @@ -1,49 +0,0 @@ -/***************** - * bitmap_info.h * - *****************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#ifndef FORCEDINLINE - #define FORCEDINLINE __attribute__((always_inline)) inline -#endif - -namespace FTDI { - // The following functions *must* be inlined since we are relying on the compiler to do - // substitution of the constants from the data structure rather than actually storing - // it in PROGMEM (which would fail, since we are not using pgm_read to read them). - // Plus, by inlining, all the equations are evaluated at compile-time as everything - // should be a constant. - - typedef struct { - const uint8_t format; - const uint16_t linestride; - const uint8_t filter; - const uint8_t wrapx; - const uint8_t wrapy; - const uint32_t RAMG_offset; - const uint16_t width; - const uint16_t height; - } bitmap_info_t; - - FORCEDINLINE uint32_t BITMAP_SOURCE (const bitmap_info_t& info) {return BITMAP_SOURCE (ftdi_memory_map::RAM_G + info.RAMG_offset);}; - FORCEDINLINE uint32_t BITMAP_LAYOUT (const bitmap_info_t& info) {return BITMAP_LAYOUT (info.format, info.linestride, info.height);}; - FORCEDINLINE uint32_t BITMAP_SIZE (const bitmap_info_t& info) {return BITMAP_SIZE (info.filter, info.wrapx, info.wrapy, info.width, info.height);} -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp deleted file mode 100644 index 7224b681bb..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/************************* - * command_processor.cpp * - *************************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_extended.h" - -#ifdef FTDI_EXTENDED - -CommandProcessor::btn_style_func_t *CommandProcessor::_btn_style_callback = CommandProcessor::default_button_style_func; -bool CommandProcessor::is_tracking = false; - -#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h deleted file mode 100644 index 94ccbb7a60..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h +++ /dev/null @@ -1,437 +0,0 @@ -/*********************** - * command_processor.h * - ***********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -typedef struct { - uint32_t bg; - uint32_t grad; - uint32_t fg; - uint32_t rgb; -} btn_colors; - -// Disable TOUCH_UI_FIT_TEXT on a case-by-case basis -namespace FTDI { - constexpr uint16_t OPT_NOFIT = OPT_NOTICKS; -} - -/**************************** Enhanced Command Processor **************************/ - -/* The CommandProcessor class wraps the CommandFifo with several features to make - * defining user interfaces much easier. - * - * - Implements chaining on all methods - * - Automatically adds text to button, toggle, text and keys. - * - Constrains all widgets to fit inside a box for ease of layout. - * - Font size is specified using a chained modifier. - * - Option argument is given the default OPT_3D value. - */ - -class CommandProcessor : public CLCD::CommandFifo { - public: - static constexpr uint8_t STYLE_DISABLED = 0x80; - - private: - static bool default_button_style_func(CommandProcessor &, uint8_t tag, uint8_t & /*style*/, uint16_t &options, bool) { - if (tag != 0 && FTDI::EventLoop::get_pressed_tag() == tag) { - options = FTDI::OPT_FLAT; - } - return false; - } - - typedef bool btn_style_func_t(CommandProcessor &cmd, uint8_t tag, uint8_t &style, uint16_t &options, bool post); - - static btn_style_func_t *_btn_style_callback; - static bool is_tracking; - int8_t _font = 26, _tag = 0; - uint8_t _style = 0; - - protected: - // Returns the cannonical thickness of a widget (i.e. the height of a toggle element) - uint16_t widget_thickness() { - CLCD::FontMetrics fm(_font); - return fm.height * 20.0/16; - } - - FORCEDINLINE void linear_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h, bool tracker = false) { - const uint16_t th = widget_thickness() / 2; - if (w > h) { - x += tracker ? th * 2.5 : th; - y += (h - th) / 2; - w -= tracker ? th * 5.0 : th * 2; - h = th; - } - else { - x += (w - th) / 2; - y += tracker ? th * 2.5 : th; - w = th; - h -= tracker ? th * 5.0 : th * 2; - } - } - - FORCEDINLINE uint16_t circular_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h) { - const uint16_t r = min(w,h) / 2; - x += w / 2; - y += h / 2; - w = 1; - h = 1; - return r; - } - - public: - // Helper method for setting all colors at once - inline CommandProcessor& colors(const btn_colors &colors) { - cmd(FTDI::COLOR_RGB(colors.rgb)) - .gradcolor(colors.grad) - .fgcolor(colors.fg) - .bgcolor(colors.bg); - return *this; - } - - inline CommandProcessor& bitmap_size(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height) { - cmd(FTDI::BITMAP_SIZE(filter, wrapx, wrapy, width, height)); - #if FTDI_API_LEVEL >= 810 - if (FTDI::ftdi_chip >= 810) - cmd(FTDI::BITMAP_SIZE_H(width >> 9, height >> 9)); - #endif - return *this; - } - - inline CommandProcessor& bitmap_layout(uint8_t format, uint16_t linestride, uint16_t height) { - cmd(FTDI::BITMAP_LAYOUT(format, linestride, height)); - #if FTDI_API_LEVEL >= 810 - if (FTDI::ftdi_chip >= 810) - cmd(FTDI::BITMAP_LAYOUT_H(linestride >> 10, height >> 9)); - #endif - return *this; - } - - inline CommandProcessor& set_button_style_callback(const btn_style_func_t *func) { - _btn_style_callback = func ? func : default_button_style_func; - return *this; - } - - inline CommandProcessor& tag (uint8_t tag) {_tag = tag; cmd(FTDI::TAG(tag)); return *this;} - - inline CommandProcessor& font (int16_t font) {_font = font; return *this;} - - inline CommandProcessor& enabled (bool enabled=false) { - if (enabled) - _style &= ~STYLE_DISABLED; - else - _style |= STYLE_DISABLED; - return *this; - } - - inline CommandProcessor& style (uint8_t style) { - _style = (_style & STYLE_DISABLED) | style; - return *this; - } - - // Wrap all the CommandFifo routines to allow method chaining - - inline CommandProcessor& cmd (uint32_t cmd32) {CLCD::CommandFifo::cmd(cmd32); return *this;} - inline CommandProcessor& cmd (void* data, uint16_t len) {CLCD::CommandFifo::cmd(data, len); return *this;} - inline CommandProcessor& execute() {CLCD::CommandFifo::execute(); return *this;} - - inline CommandProcessor& fgcolor (uint32_t rgb) {CLCD::CommandFifo::fgcolor(rgb); return *this;} - inline CommandProcessor& bgcolor (uint32_t rgb) {CLCD::CommandFifo::bgcolor(rgb); return *this;} - inline CommandProcessor& gradcolor(uint32_t rgb) {CLCD::CommandFifo::gradcolor(rgb); return *this;} - - inline CommandProcessor& snapshot (uint32_t ptr) {CLCD::CommandFifo::snapshot(ptr); return *this;} - - inline CommandProcessor& loadimage(uint32_t ptr, uint32_t options) - {CLCD::CommandFifo::loadimage(ptr, options); return *this;} - inline CommandProcessor& sketch (int16_t x, int16_t y, uint16_t w, uint16_t h, uint32_t ptr, uint16_t format) - {CLCD::CommandFifo::sketch(x, y, w, h, ptr, format); return *this;} - inline CommandProcessor& screensaver () {CLCD::CommandFifo::screensaver(); return *this;} - #if FTDI_API_LEVEL >= 810 - inline CommandProcessor& setbase (uint8_t base) {CLCD::CommandFifo::setbase(base); return *this;} - #endif - inline CommandProcessor& loadidentity () {CLCD::CommandFifo::loadidentity(); return *this;} - inline CommandProcessor& scale (int32_t sx, int32_t sy) {CLCD::CommandFifo::scale(sx,sy); return *this;} - inline CommandProcessor& rotate (int32_t a) {CLCD::CommandFifo::rotate(a); return *this;} - inline CommandProcessor& translate(int32_t tx, int32_t ty) {CLCD::CommandFifo::translate(tx,ty); return *this;} - inline CommandProcessor& setmatrix () {CLCD::CommandFifo::setmatrix(); return *this;} - inline CommandProcessor& stop () {CLCD::CommandFifo::stop(); return *this;} - - inline CommandProcessor& memzero (uint32_t ptr, uint32_t size) - {CLCD::CommandFifo::memzero(ptr, size); return *this;} - inline CommandProcessor& memset (uint32_t ptr, uint32_t val, uint32_t size) - {CLCD::CommandFifo::memset(ptr, val, size); return *this;} - inline CommandProcessor& memcpy (uint32_t src, uint32_t dst, uint32_t size) - {CLCD::CommandFifo::memcpy(src, dst, size); return *this;} - inline CommandProcessor& memcrc (uint32_t ptr, uint32_t num, uint32_t result) - {CLCD::CommandFifo::memcrc(ptr, num, result); return *this;} - inline CommandProcessor& memwrite (uint32_t ptr, uint32_t value) - {CLCD::CommandFifo::memwrite(ptr, value); return *this;} - inline CommandProcessor& inflate (uint32_t ptr) - {CLCD::CommandFifo::inflate(ptr); return *this;} - inline CommandProcessor& getptr (uint32_t result) - {CLCD::CommandFifo::getptr(result); return *this;} - inline CommandProcessor& getprops (uint32_t ptr, uint32_t width, uint32_t height) - {CLCD::CommandFifo::getprops(ptr, width, height); return *this;} - - #if FTDI_API_LEVEL >= 810 - inline CommandProcessor& setbitmap (uint32_t ptr, uint16_t fmt, uint16_t w, uint16_t h) - {CLCD::CommandFifo::setbitmap(ptr,fmt,w,h); return *this;} - inline CommandProcessor& snapshot2 (uint32_t fmt, uint32_t ptr, int16_t x, int16_t y, uint16_t w, uint16_t h) - {CLCD::CommandFifo::snapshot2(fmt,ptr,x,y,w,h); return *this;} - inline CommandProcessor& mediafifo (uint32_t p, uint32_t s) {CLCD::CommandFifo::mediafifo(p, s); return *this;} - inline CommandProcessor& playvideo(uint32_t options) {CLCD::CommandFifo::playvideo(options); return *this;} - inline CommandProcessor& romfont(uint8_t font, uint8_t slot) {CLCD::CommandFifo::romfont(font, slot); return *this;} - #endif - - inline CommandProcessor& gradient(int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1) - {CLCD::CommandFifo::gradient(x0,y0,rgb0,x1,y1,rgb1); return *this;} - - inline CommandProcessor& rectangle(int16_t x, int16_t y, int16_t w, int16_t h) { - using namespace FTDI; - CLCD::CommandFifo::cmd(BEGIN(RECTS)); - CLCD::CommandFifo::cmd(VERTEX2F(x * 16, y * 16)); - CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, (y + h) * 16)); - return *this; - } - - template - FORCEDINLINE CommandProcessor& toggle(int16_t x, int16_t y, int16_t w, int16_t h, T text, bool state, uint16_t options = FTDI::OPT_3D) { - CLCD::FontMetrics fm(_font); - const int16_t widget_h = fm.height * 20.0 / 16; - //const int16_t outer_bar_r = widget_h / 2; - //const int16_t knob_r = outer_bar_r - 1.5; - // The y coordinate of the toggle is the baseline of the text, - // so we must introduce a fudge factor based on the line height to - // actually center the control. - const int16_t fudge_y = fm.height * 5 / 16; - CLCD::CommandFifo::toggle(x + h / 2, y + (h - widget_h) / 2 + fudge_y, w - h, _font, options, state); - CLCD::CommandFifo::str(text); - return *this; - } - - CommandProcessor& toggle2(int16_t x, int16_t y, int16_t w, int16_t h, progmem_str no, progmem_str yes, bool state, uint16_t options = FTDI::OPT_3D) { - char text[strlen_P((const char *)no) + strlen_P((const char *)yes) + 2]; - strcpy_P(text, (const char *)no); - strcat(text, "\xFF"); - strcat_P(text, (const char *)yes); - return toggle(x, y, w, h, text, state, options); - } - - // Contrained drawing routines. These constrain the widget inside a box for easier layout. - // The FORCEDINLINE ensures that the code is inlined so that all the math is done at compile time. - - FORCEDINLINE CommandProcessor& track_linear(int16_t x, int16_t y, int16_t w, int16_t h, int16_t tag) { - linear_widget_box(x, y, w, h, true); - CLCD::CommandFifo::track(x, y, w, h, tag); - is_tracking = true; - return *this; - } - - FORCEDINLINE CommandProcessor& track_circular(int16_t x, int16_t y, int16_t w, int16_t h, int16_t tag) { - circular_widget_box(x,y, w, h); - CLCD::CommandFifo::track(x, y, w, h, tag); - is_tracking = true; - return *this; - } - - uint8_t track_tag (uint16_t &value) { - if (is_tracking) { - if (FTDI::EventLoop::is_touch_held()) { - return CLCD::get_tracker(value); - } - else { - CLCD::CommandFifo::track(0, 0, 0, 0, 0); - CLCD::CommandFifo::execute(); - is_tracking = false; - } - } - return 0; - } - - FORCEDINLINE CommandProcessor& clock(int16_t x, int16_t y, int16_t w, int16_t h, int16_t hr, int16_t m, int16_t s, int16_t ms, uint16_t options = FTDI::OPT_3D) { - const uint16_t r = circular_widget_box(x, y, w, h); - CLCD::CommandFifo::clock(x, y, r, options, hr, m, s, ms); - return *this; - } - - FORCEDINLINE CommandProcessor& gauge(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t major, uint16_t minor, uint16_t val, uint16_t range, uint16_t options = FTDI::OPT_3D) { - const uint16_t r = circular_widget_box(x, y, w, h); - CLCD::CommandFifo::gauge(x, y, r, options, major, minor, val, range); - return *this; - } - - FORCEDINLINE CommandProcessor& dial(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t val, uint16_t options = FTDI::OPT_3D) { - const uint16_t r = circular_widget_box(x, y, w, h); - CLCD::CommandFifo::dial(x, y, r, options, val); - return *this; - } - - FORCEDINLINE CommandProcessor& slider(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t val, uint16_t range, uint16_t options = FTDI::OPT_3D) { - linear_widget_box(x, y, w, h); - CLCD::CommandFifo::slider(x, y, w, h, options, val, range); - return *this; - } - - FORCEDINLINE CommandProcessor& progress(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t val, uint16_t range, uint16_t options = FTDI::OPT_3D) { - linear_widget_box(x, y, w, h); - CLCD::CommandFifo::progress(x, y, w, h, options, val, range); - return *this; - } - - FORCEDINLINE CommandProcessor& scrollbar(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t val, uint16_t size, uint16_t range, uint16_t options = 0) { - linear_widget_box(x, y, w, h); - CLCD::CommandFifo::scrollbar(x, y, w, h, options, val, size, range); - return *this; - } - - void apply_text_alignment(int16_t &x, int16_t &y, int16_t w, int16_t h, uint16_t options) { - using namespace FTDI; - x += ((options & OPT_CENTERX) ? w/2 : ((options & OPT_RIGHTX) ? w : 0)); - y += ((options & OPT_CENTERY) ? h/2 : h); - } - - // Reduce font size until text fits the enclosing box. - template - int8_t apply_fit_text(int16_t w, int16_t h, T text) { - using namespace FTDI; - int8_t font = _font; - #ifdef TOUCH_UI_USE_UTF8 - const bool is_utf8 = has_utf8_chars(text); - #endif - for (;font > 26;) { - int16_t width, height; - #ifdef TOUCH_UI_USE_UTF8 - if (is_utf8) { - width = get_utf8_text_width(text, font_size_t::from_romfont(font)); - height = font_size_t::from_romfont(font).get_height(); - } - else - #endif - { - CLCD::FontMetrics fm(font); - width = fm.get_text_width(text); - height = fm.height; - } - if (width < w && height < h) break; - font--; - } - return font; - } - - CommandProcessor& number(int16_t x, int16_t y, int16_t w, int16_t h, int32_t n, uint16_t options = FTDI::OPT_CENTER) { - using namespace FTDI; - apply_text_alignment(x, y, w, h, options); - CLCD::CommandFifo::number(x, y, _font, options, n); - return *this; - } - - template - uint16_t text_width(T text) { - using namespace FTDI; - #ifdef TOUCH_UI_USE_UTF8 - if (has_utf8_chars(text)) - return get_utf8_text_width(text, font_size_t::from_romfont(_font)); - #endif - CLCD::FontMetrics fm(_font); - return fm.get_text_width(text); - } - - template - CommandProcessor& text(int16_t x, int16_t y, int16_t w, int16_t h, T text, uint16_t options = FTDI::OPT_CENTER) { - using namespace FTDI; - apply_text_alignment(x, y, w, h, options); - #ifdef TOUCH_UI_FIT_TEXT - const int8_t font = (options & OPT_NOFIT) ? _font : apply_fit_text(w, h, text); - #else - const int8_t font = _font; - #endif - #ifdef TOUCH_UI_USE_UTF8 - if (has_utf8_chars(text)) - draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(font), options); - else - #endif - { - CLCD::CommandFifo::text(x, y, font, options); - CLCD::CommandFifo::str(text); - } - return *this; - } - - FORCEDINLINE CommandProcessor& icon(int16_t x, int16_t y, int16_t w, int16_t h, const FTDI::bitmap_info_t& info, const float scale = 1) { - using namespace FTDI; - cmd(BEGIN(BITMAPS)); - if (scale != 1) { - cmd(BITMAP_TRANSFORM_A(uint32_t(float(256)/scale))); - cmd(BITMAP_TRANSFORM_E(uint32_t(float(256)/scale))); - } - cmd(BITMAP_SIZE(info.filter, info.wrapx, info.wrapy, info.width*scale, info.height*scale)); - cmd(VERTEX2F((x + w/2 - info.width*scale/2)*16, (y + h/2 - info.height*scale/2)*16)); - if (scale != 1) { - cmd(BITMAP_TRANSFORM_A(256)); - cmd(BITMAP_TRANSFORM_E(256)); - } - return *this; - } - - template - CommandProcessor& button(int16_t x, int16_t y, int16_t w, int16_t h, T text, uint16_t options = FTDI::OPT_3D) { - using namespace FTDI; - bool styleModified = false; - if (_btn_style_callback) styleModified = _btn_style_callback(*this, _tag, _style, options, false); - #ifdef TOUCH_UI_FIT_TEXT - const int8_t font = (options & OPT_NOFIT) ? _font : apply_fit_text(w, h, text); - #else - const int8_t font = _font; - #endif - CLCD::CommandFifo::button(x, y, w, h, font, options); - #ifdef TOUCH_UI_USE_UTF8 - if (has_utf8_chars(text)) { - CLCD::CommandFifo::str(F("")); - apply_text_alignment(x, y, w, h, OPT_CENTER); - if (!(options & FTDI::OPT_FLAT)) { - // Reproduce the black "shadow" the FTDI adds to the button label - CLCD::CommandFifo::cmd(SAVE_CONTEXT()); - CLCD::CommandFifo::cmd(COLOR_RGB(0x00000)); - draw_utf8_text(*this, x-1, y-1, text, font_size_t::from_romfont(font), OPT_CENTER); - CLCD::CommandFifo::cmd(RESTORE_CONTEXT()); - } - // Draw the button label - draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(font), OPT_CENTER); - } - else - #endif - CLCD::CommandFifo::str(text); - if (_btn_style_callback && styleModified) _btn_style_callback(*this, _tag, _style, options, true); - return *this; - } - - template - CommandProcessor& keys(int16_t x, int16_t y, int16_t w, int16_t h, T keys, uint16_t options = FTDI::OPT_3D) { - CLCD::CommandFifo::keys(x, y, w, h, _font, options); - CLCD::CommandFifo::str(keys); - return *this; - } - - FORCEDINLINE CommandProcessor& spinner(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t style = 0, uint16_t scale = 0) { - circular_widget_box(x, y, w, h); - CLCD::CommandFifo::spinner(x, y, style, scale); - return *this; - } -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp deleted file mode 100644 index baed9f8502..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/**************** - * dl_cache.cpp * - ****************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_extended.h" - -#ifdef FTDI_EXTENDED - -/* The Display List Cache mechanism stores the display list corresponding - * to a menu into RAM_G so that on subsequent calls drawing the menu does - * not require as much SPI traffic. - * - * Layout of Cache memory: - * - * The cache memory begins with a table at - * DL_CACHE_START: each table entry contains - * an address, size and used bytes for a cached - * DL slot. - * - * Immediately following the table is the - * DL_FREE_ADDR, which points to free cache - * space; following this is occupied DL space, - * and after that free space that is yet to - * be used. - * - * location data sizeof - * - * DL_CACHE_START slot0_addr 4 - * slot0_size 4 - * slot0_used 4 - * slot1_addr 4 - * slot1_size 4 - * slot1_used 4 - * ... - * slotN_addr 4 - * slotN_size 4 - * slotN_used 4 - * DL_FREE_ADDR dl_free_ptr 4 - * cached data - * ... - * dl_free_ptr empty space - * ... - */ - -#define DL_CACHE_START MAP::RAM_G_SIZE - 0xFFFF -#define DL_FREE_ADDR DL_CACHE_START + DL_CACHE_SLOTS * 12 - -using namespace FTDI; - -// The init function ensures all cache locations are marked as empty - -void DLCache::init() { - CLCD::mem_write_32(DL_FREE_ADDR, DL_FREE_ADDR + 4); - for (uint8_t slot = 0; slot < DL_CACHE_SLOTS; slot++) - save_slot(slot, 0, 0, 0); -} - -bool DLCache::has_data() { - return dl_slot_size != 0; -} - -bool DLCache::wait_until_idle() { - const unsigned long startTime = millis(); - do { - if ((millis() - startTime) > 250) { - SERIAL_ECHO_MSG("Timeout on DL_Cache::Wait_Until_Idle()"); - CLCD::CommandFifo::reset(); - return false; - } - #ifdef __MARLIN_FIRMWARE__ - ExtUI::yield(); - #endif - } while (CLCD::CommandFifo::is_processing()); - return true; -} - -/* This caches the current display list in RAMG so - * that it can be appended later. The memory is - * dynamically allocated following DL_FREE_ADDR. - * - * If min_bytes is provided, then that many bytes - * will be reserved so that the cache may be re-written - * later with potentially a bigger DL. - */ - -bool DLCache::store(uint32_t min_bytes /* = 0*/) { - CLCD::CommandFifo cmd; - - // Execute any commands already in the FIFO - cmd.execute(); - if (!wait_until_idle()) - return false; - - // Figure out how long the display list is - const uint32_t dl_size = CLCD::dl_size(); - - if (dl_slot_addr == 0) { - // If we are allocating new space... - dl_slot_addr = CLCD::mem_read_32(DL_FREE_ADDR); - dl_slot_size = max(dl_size, min_bytes); - - const uint32_t free_space = MAP::RAM_G_SIZE - dl_slot_addr; - if (dl_slot_size <= free_space) { - CLCD::mem_write_32(DL_FREE_ADDR, dl_slot_addr + dl_slot_size); - } - else { - dl_slot_addr = 0; - dl_slot_size = 0; - dl_slot_used = 0; - } - } - - if (dl_size > dl_slot_size) { - // Not enough memory to cache the display list. - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Not enough space in GRAM to cache display list, free space: ", dl_slot_size); - SERIAL_ECHOLNPAIR(" Required: ", dl_size); - #endif - dl_slot_used = 0; - save_slot(); - return false; - } - else { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Saving DL to RAMG cache, bytes: ", dl_slot_used); - SERIAL_ECHOLNPAIR(" Free space: ", dl_slot_size); - #endif - dl_slot_used = dl_size; - save_slot(); - cmd.memcpy(dl_slot_addr, MAP::RAM_DL, dl_slot_used); - cmd.execute(); - return true; - } -} - -void DLCache::save_slot(uint8_t indx, uint32_t addr, uint16_t size, uint16_t used) { - CLCD::mem_write_32(DL_CACHE_START + indx * 12 + 0, addr); - CLCD::mem_write_32(DL_CACHE_START + indx * 12 + 4, size); - CLCD::mem_write_32(DL_CACHE_START + indx * 12 + 8, used); -} - -void DLCache::load_slot(uint8_t indx, uint32_t &addr, uint16_t &size, uint16_t &used) { - addr = CLCD::mem_read_32(DL_CACHE_START + indx * 12 + 0); - size = CLCD::mem_read_32(DL_CACHE_START + indx * 12 + 4); - used = CLCD::mem_read_32(DL_CACHE_START + indx * 12 + 8); -} - -void DLCache::append() { - CLCD::CommandFifo cmd; - cmd.append(dl_slot_addr, dl_slot_used); - #if ENABLED(TOUCH_UI_DEBUG) - cmd.execute(); - wait_until_idle(); - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Appending to DL from RAMG cache, bytes: ", dl_slot_used); - SERIAL_ECHOLNPAIR(" REG_CMD_DL: ", CLCD::mem_read_32(REG::CMD_DL)); - #endif -} - -#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h deleted file mode 100644 index da927aeae2..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h +++ /dev/null @@ -1,73 +0,0 @@ -/************** - * dl_cache.h * - **************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/******************* DISPLAY LIST CACHE MANAGEMENT ************************/ -/* The Display List Cache mechanism stores the display list corresponding - * to a menu into RAM_G so that on subsequent calls drawing the menu does - * not require as much SPI traffic. Dynamic content, such as indicators, - * should not be cached. - * - * The DLCache can be used like so: - * - * void some_function() { - * DLCache dlcache(UNIQUE_ID); - * - * if (dlcache.hasData()) { - * dlcache.append(); - * } else { - * // Add stuff to the DL - * dlcache.store(); - * } - */ -class DLCache { - private: - typedef FTDI::ftdi_registers REG; - typedef FTDI::ftdi_memory_map MAP; - - uint8_t dl_slot_indx; - uint32_t dl_slot_addr; - uint16_t dl_slot_size; - uint16_t dl_slot_used; - - void load_slot() {load_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} - void save_slot() {save_slot(dl_slot_indx, dl_slot_addr, dl_slot_size, dl_slot_used);} - - static void load_slot(uint8_t indx, uint32_t &addr, uint16_t &size, uint16_t &used); - static void save_slot(uint8_t indx, uint32_t addr, uint16_t size, uint16_t used); - - bool wait_until_idle(); - - public: - static void init(); - - DLCache(uint8_t slot) { - dl_slot_indx = slot; - load_slot(); - } - - bool has_data(); - bool store(uint32_t min_bytes = 0); - void append(); -}; - -#define DL_CACHE_SLOTS 250 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp deleted file mode 100644 index 3dd2b88b19..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/****************** - * event_loop.cpp * - ******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_extended.h" - -#ifdef FTDI_EXTENDED -using namespace FTDI; - -enum { - UNPRESSED = 0x00 -}; - -tiny_timer_t touch_timer; -UIData::flags_t UIData::flags; -uint8_t pressed_tag = UNPRESSED; - -uint8_t UIData::get_persistent_data_mask() { - // A bit mask for flags that should be stored to the EEPROM. - // Others are considered temporarily values that need not be - // saved. - constexpr flags_t persistent_flags = { - bits: { - touch_start_sound: true, - touch_end_sound: true, - touch_repeat_sound: true, - show_animations: true - } - }; - return persistent_flags.value; -} - -void UIData::reset_persistent_data() { - // Default values for persistent data - constexpr flags_t default_flags = { - bits: { - touch_start_sound: true, - touch_end_sound: true, - touch_repeat_sound: true, - show_animations: true, - touch_debouncing: false, - ignore_unpress: false - } - }; - flags.value = default_flags.value; -} - -uint8_t UIData::get_persistent_data() { - return flags.value & get_persistent_data_mask(); -} - -void UIData::set_persistent_data(uint8_t value) { - flags.value = value & get_persistent_data_mask(); -} - - -void UIData::enable_touch_sounds(bool enabled) { - UIData::flags.bits.touch_start_sound = enabled; - UIData::flags.bits.touch_end_sound = enabled; - UIData::flags.bits.touch_repeat_sound = enabled; -} - -bool UIData::touch_sounds_enabled() { - return UIData::flags.bits.touch_start_sound || UIData::flags.bits.touch_end_sound || UIData::flags.bits.touch_repeat_sound; -} - -void UIData::enable_animations(bool enabled) { - UIData::flags.bits.show_animations = enabled; -} - -bool UIData::animations_enabled() { - return UIData::flags.bits.show_animations; -} - -namespace FTDI { - uint8_t EventLoop::get_pressed_tag() { - return pressed_tag; - } - - bool EventLoop::is_touch_held() { - return pressed_tag != 0; - } - - /** - * process_events(): Process events from the touch panel. - * - * This function consists of a state machine that accomplishes the following: - * - * - Reads the tag register from the touch panel - * - Dispatches onTouchStart and onTouchEnd events to the active screen. - * - Handles auto-repetition by sending onTouchHeld to the active screen periodically. - * - Plays touch feedback "click" sounds when appropriate. - * - Performs debouncing to supress spurious touch events. - */ - void EventLoop::process_events() { - // If the LCD is processing commands, don't check - // for tags since they may be changing and could - // cause spurious events. - if (!touch_timer.elapsed(TOUCH_UPDATE_INTERVAL) || CLCD::CommandFifo::is_processing()) { - return; - } - - const uint8_t tag = CLCD::get_tag(); - - switch (pressed_tag) { - case UNPRESSED: - if (tag != 0) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Touch start: ", tag); - #endif - - pressed_tag = tag; - current_screen.onRefresh(); - - // When the user taps on a button, activate the onTouchStart handler - const uint8_t lastScreen = current_screen.getScreen(); - - if (current_screen.onTouchStart(tag)) { - touch_timer.start(); - if (UIData::flags.bits.touch_start_sound) sound.play(press_sound); - } - - // In the case in which a touch event triggered a new screen to be - // drawn, we don't issue a touchEnd since it would be sent to the - // wrong screen. - UIData::flags.bits.ignore_unpress = (lastScreen != current_screen.getScreen()); - } - else { - touch_timer.start(); - } - break; - default: // PRESSED - if (!UIData::flags.bits.touch_debouncing) { - if (tag == pressed_tag) { - // The user is holding down a button. - if (touch_timer.elapsed(1000 / TOUCH_REPEATS_PER_SECOND)) { - if (current_screen.onTouchHeld(tag)) { - current_screen.onRefresh(); - if (UIData::flags.bits.touch_repeat_sound) sound.play(repeat_sound); - } - touch_timer.start(); - } - } - else if (tag == 0) { - touch_timer.start(); - UIData::flags.bits.touch_debouncing = true; - } - } - - else { - // Debouncing... - - if (tag == pressed_tag) { - // If while debouncing, we detect a press, then cancel debouncing. - UIData::flags.bits.touch_debouncing = false; - } - - else if (touch_timer.elapsed(DEBOUNCE_PERIOD)) { - UIData::flags.bits.touch_debouncing = false; - - if (UIData::flags.bits.ignore_unpress) { - UIData::flags.bits.ignore_unpress = false; - pressed_tag = UNPRESSED; - break; - } - - if (UIData::flags.bits.touch_end_sound) sound.play(unpress_sound); - - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("Touch end: ", pressed_tag); - #endif - - const uint8_t saved_pressed_tag = pressed_tag; - pressed_tag = UNPRESSED; - current_screen.onTouchEnd(saved_pressed_tag); - current_screen.onRefresh(); - } - } - break; - } // switch (pressed_tag) - - } // processEvents() - - void EventLoop::setup() { - CLCD::init(); - DLCache::init(); - UIData::reset_persistent_data(); - current_screen.start(); - } - - void EventLoop::loop() { - sound.onIdle(); - - /** - * Guard against re-entry of UI methods, which can - * crash. Re-entry can happen because some functions - * (e.g. planner.synchronize) call idle(). - */ - if (!UIData::flags.bits.prevent_reentry) { - UIData::flags.bits.prevent_reentry = true; - current_screen.onIdle(); - process_events(); - UIData::flags.bits.prevent_reentry = false; - } - } -} // namespace FTDI - -#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h deleted file mode 100644 index d9bede92df..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h +++ /dev/null @@ -1,74 +0,0 @@ -/**************** - * event_loop.h * - ****************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#define STATUS_UPDATE_INTERVAL 1000 -#define TOUCH_UPDATE_INTERVAL 50 -#define TOUCH_REPEATS_PER_SECOND 4 -#define DEBOUNCE_PERIOD 150 - -class UIData { - private: - typedef union { - struct { - uint8_t touch_start_sound : 1; - uint8_t touch_end_sound : 1; - uint8_t touch_repeat_sound : 1; - uint8_t show_animations : 1; - uint8_t touch_debouncing : 1; - uint8_t ignore_unpress : 1; - uint8_t prevent_reentry : 1; - } bits; - uint8_t value; - } flags_t; - - public: - static flags_t flags; - - static uint8_t get_persistent_data_mask(); - static uint8_t get_persistent_data(); - static void set_persistent_data(uint8_t value); - static void reset_persistent_data(); - - static void enable_touch_sounds(bool enabled); - static bool touch_sounds_enabled(); - static void enable_animations(bool enabled); - static bool animations_enabled(); -}; - -namespace FTDI { - class EventLoop { - private: - static constexpr FTDI::effect_t press_sound = FTDI::CHACK; - static constexpr FTDI::effect_t repeat_sound = FTDI::CHACK; - static constexpr FTDI::effect_t unpress_sound = FTDI::POP; - static void process_events(); - - public: - static void setup(); - static void loop(); - - static uint8_t get_pressed_tag(); - static bool is_touch_held(); - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h deleted file mode 100644 index 6e4d0668fe..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h +++ /dev/null @@ -1,51 +0,0 @@ -/******************* - * ftdi_extended.h * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2019 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 201( - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "../compat.h" -#include "../basic/ftdi_basic.h" - -#ifndef __MARLIN_FIRMWARE__ - #define FTDI_EXTENDED -#endif - -#ifdef FTDI_EXTENDED - #include "unicode/font_size_t.h" - #include "unicode/unicode.h" - #include "unicode/standard_char_set.h" - #include "unicode/western_char_set.h" - #include "unicode/font_bitmaps.h" - #include "rgb_t.h" - #include "bitmap_info.h" - #include "tiny_timer.h" - #include "grid_layout.h" - #include "dl_cache.h" - #include "event_loop.h" - #include "command_processor.h" - #include "screen_types.h" - #include "sound_player.h" - #include "sound_list.h" - #include "polygon.h" - #include "text_box.h" - #include "text_ellipsis.h" -#endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h deleted file mode 100644 index e3c3ebb39d..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h +++ /dev/null @@ -1,98 +0,0 @@ -/***************** - * grid_layout.h * - *****************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/* The grid layout macros allow buttons to be arranged on a grid so - * that their locations become independent of the display size. The - * layout model is similar to that of HTML TABLEs. - * - * These macros are meant to be evaluated into constants at compile - * time, so resolution independence can be as efficient as using - * hard-coded coordinates. - */ - -// Margin defines the margin (in pixels) on each side of a button in -// the layout - -#ifdef TOUCH_UI_800x480 - #define MARGIN_L 5 - #define MARGIN_R 5 - #define MARGIN_T 5 - #define MARGIN_B 5 - #define MARGIN_DEFAULT 5 -#else - #define MARGIN_L 3 - #define MARGIN_R 3 - #define MARGIN_T 3 - #define MARGIN_B 3 - #define MARGIN_DEFAULT 3 -#endif - -// EDGE_R adds some black space on the right edge of the display -// This shifts some of the screens left to visually center them. - -#define EDGE_R 0 - -// GRID_X and GRID_Y computes the positions of the divisions on -// the layout grid. -#define GRID_X(x) ((x)*(FTDI::display_width-EDGE_R)/GRID_COLS) -#define GRID_Y(y) ((y)*FTDI::display_height/GRID_ROWS) - -// BTN_X, BTN_Y, BTN_W and BTN_X returns the top-left and width -// and height of a button, taking into account the button margins. - -#define BTN_X(x) (GRID_X((x)-1) + MARGIN_L) -#define BTN_Y(y) (GRID_Y((y)-1) + MARGIN_T) -#define BTN_W(w) (GRID_X(w) - MARGIN_L - MARGIN_R) -#define BTN_H(h) (GRID_Y(h) - MARGIN_T - MARGIN_B) - -// Abbreviations for common phrases, to allow a button to be -// defined in one line of source. -#define BTN_POS(x,y) BTN_X(x), BTN_Y(y) -#define BTN_SIZE(w,h) BTN_W(w), BTN_H(h) - -// Draw a reference grid for ease of spacing out widgets. -#define DRAW_LAYOUT_GRID \ - { \ - cmd.cmd(LINE_WIDTH(4)); \ - for (int i = 1; i <= GRID_COLS; i++) { \ - cmd.cmd(BEGIN(LINES)); \ - cmd.cmd(VERTEX2F(GRID_X(i) *16, 0 *16)); \ - cmd.cmd(VERTEX2F(GRID_X(i) *16, FTDI::display_height *16)); \ - } \ - for (int i = 1; i < GRID_ROWS; i++) { \ - cmd.cmd(BEGIN(LINES)); \ - cmd.cmd(VERTEX2F(0 *16, GRID_Y(i) *16)); \ - cmd.cmd(VERTEX2F(FTDI::display_width *16, GRID_Y(i) *16)); \ - } \ - cmd.cmd(LINE_WIDTH(16)); \ - } - -namespace FTDI { - #ifdef TOUCH_UI_PORTRAIT - constexpr uint16_t display_width = Vsize; - constexpr uint16_t display_height = Hsize; - #else - constexpr uint16_t display_width = Hsize; - constexpr uint16_t display_height = Vsize; - #endif -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h deleted file mode 100644 index 7da6213211..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h +++ /dev/null @@ -1,96 +0,0 @@ -/************* - * polygon.h * - *************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/** - * The Polygon class helps drawing filled or stroked polygons on the FTDI EVE: - * - * CommandProcessor cmd; - * cmd.cmd(COLOR_RGB(0x00FF00)); - * - * Polygon p(cmd); - * p.begin_fill(); - * p.begin_loop(); - * p(10,10); - * p(20,10); - * p(20,20); - * p(10,20); - * p.end_loop(); - * p.begin_loop(); - * ... // Additional closed paths - * p.end_loop(); - * ... - * p.end_fill(); - * - * Based on the example from "Applicaton Note AN_334, FT801 Polygon Application": - * - * https://brtchip.com/wp-content/uploads/Support/Documentation/Application_Notes/ICs/EVE/AN_334-FT801_Polygon_Application.pdf - */ - -namespace FTDI { - class Polygon { - private: - FTDI::begin_t path_initiator = FTDI::LINE_STRIP; - - public: - CommandProcessor &cmd; - - Polygon(CommandProcessor &c) : cmd(c) {} - - void begin_fill() { - using namespace FTDI; - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(TAG_MASK(0)); - cmd.cmd(CLEAR(0,1,0)); - cmd.cmd(COLOR_MASK(0,0,0,0)); - cmd.cmd(STENCIL_OP(STENCIL_OP_KEEP, STENCIL_OP_INVERT)); - cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255)); - // Drawing the edge strip along scan lines - // seems to yield the best performance - #ifdef TOUCH_UI_PORTRAIT - path_initiator = EDGE_STRIP_B; - #else - path_initiator = EDGE_STRIP_R; - #endif - } - - // Specify a clipping rectangle to paint fewer pixels and reduce rendering time, otherwise all pixels will be painted. - void end_fill(const int16_t x1 = 0, const int16_t y1 = 0, const int16_t x2 = display_width * 16, const int16_t y2 = display_height * 16) { - using namespace FTDI; - cmd.cmd(RESTORE_CONTEXT()); - - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_NOTEQUAL, 0, 255)); - cmd.cmd(BEGIN(RECTS)); - cmd.cmd(VERTEX2F(x1, y1)); - cmd.cmd(VERTEX2F(x2, y2)); - cmd.cmd(RESTORE_CONTEXT()); - } - - void begin_stroke() {path_initiator = FTDI::LINE_STRIP;} - void begin_loop() {cmd.cmd(FTDI::BEGIN(path_initiator));} - void end_stroke() {} - void end_loop() {} - - void operator()(const uint16_t x, const uint16_t y) {cmd.cmd(FTDI::VERTEX2F(x, y));} - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h deleted file mode 100644 index 2b18244e22..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h +++ /dev/null @@ -1,84 +0,0 @@ -/*********** - * rgb_t.h * - ***********/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/** - * Implementation of hsl_to_rgb as constexpr functions based on: - * - * https://www.rapidtables.com/convert/color/hsl-to-rgb.html - */ - -constexpr float _hsl_fmod(float x, float y) { - return x - int(x/y)*y; -} - -constexpr float _hsl_c(float, float S, float L) { - return (1.0f - fabs(2*L-1.0f)) * S; -} - -constexpr float _hsl_x(float H, float S, float L) { - return _hsl_c(H,S,L) * (1.0f - fabs(_hsl_fmod(H/60, 2) - 1)); -} - -constexpr float _hsl_m(float H, float S, float L) { - return L - _hsl_c(H,S,L)/2; -} - -constexpr float _hsl_rgb(float H, float S, float L, float r, float g, float b) { - return ((uint32_t((r + _hsl_m(H,S,L))*255+0.5) << 16) | - (uint32_t((g + _hsl_m(H,S,L))*255+0.5) << 8) | - (uint32_t((b + _hsl_m(H,S,L))*255+0.5) << 0)); -} - -constexpr uint32_t hsl_to_rgb(float H, float S, float L) { - return (H < 60) ? _hsl_rgb(H,S,L,_hsl_c(H,S,L), _hsl_x(H,S,L), 0) : - (H < 120) ? _hsl_rgb(H,S,L,_hsl_x(H,S,L), _hsl_c(H,S,L), 0) : - (H < 180) ? _hsl_rgb(H,S,L, 0, _hsl_c(H,S,L), _hsl_x(H,S,L)) : - (H < 240) ? _hsl_rgb(H,S,L, 0, _hsl_x(H,S,L), _hsl_c(H,S,L)) : - (H < 300) ? _hsl_rgb(H,S,L,_hsl_x(H,S,L), 0, _hsl_c(H,S,L)) : - _hsl_rgb(H,S,L,_hsl_c(H,S,L), 0, _hsl_x(H,S,L)); -} - -/** - * Structure for RGB colors - */ -struct rgb_t { - union { - struct { - uint8_t b,g,r,a; - }; - uint32_t packed; - }; - - rgb_t() : packed(0) {} - rgb_t(uint32_t rgb) : packed(rgb) {} - rgb_t(uint8_t r, uint8_t g, uint8_t b) : b(b), g(g), r(r), a(0) {} - operator uint32_t() const {return packed;}; - - static void lerp(float t, const rgb_t a, const rgb_t b, rgb_t &c) { - c.r = a.r + t * (b.r - a.r); - c.g = a.g + t * (b.g - a.g); - c.b = a.b + t * (b.b - a.b); - } - - uint8_t luminance() const {return 0.299*r + 0.587*g + 0.114*b;} -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp deleted file mode 100644 index 57a9e3e89b..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/****************** - * screen_types.h * - ******************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_extended.h" - -#ifdef FTDI_EXTENDED - -/********************** VIRTUAL DISPATCH DATA TYPE ******************************/ - -uint8_t ScreenRef::lookupScreen(onRedraw_func_t onRedraw_ptr) { - for (uint8_t type = 0; type < functionTableSize; type++) { - if (GET_METHOD(type, onRedraw) == onRedraw_ptr) { - return type; - } - } - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR("Screen not found: ", (uintptr_t) onRedraw_ptr); - #endif - return 0xFF; -} - -void ScreenRef::setScreen(onRedraw_func_t onRedraw_ptr) { - uint8_t type = lookupScreen(onRedraw_ptr); - if (type != 0xFF) { - setType(type); - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("New screen: ", type); - #endif - } -} - -void ScreenRef::initializeAll() { - for (uint8_t type = 0; type < functionTableSize; type++) - GET_METHOD(type, onStartup)(); -} - -/********************** SCREEN STACK ******************************/ - -void ScreenStack::start() { - initializeAll(); - onEntry(); -} - -void ScreenStack::push(onRedraw_func_t onRedraw_ptr) { - stack[3] = stack[2]; - stack[2] = stack[1]; - stack[1] = stack[0]; - stack[0] = lookupScreen(onRedraw_ptr); -} - -void ScreenStack::push() { - stack[3] = stack[2]; - stack[2] = stack[1]; - stack[1] = stack[0]; - stack[0] = getType(); -} - -void ScreenStack::pop() { - setType(stack[0]); - forget(); -} - -void ScreenStack::forget() { - stack[0] = stack[1]; - stack[1] = stack[2]; - stack[2] = stack[3]; - stack[3] = 0; -} - -void ScreenStack::goTo(onRedraw_func_t s) { - push(); - onExit(); - setScreen(s); - onEntry(); -} - -void ScreenStack::goBack() { - onExit(); - pop(); - onEntry(); -} - -ScreenStack current_screen; - -#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h deleted file mode 100644 index d1f84c8a6e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h +++ /dev/null @@ -1,241 +0,0 @@ -/******************** - * screen_types.cpp * - ********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -typedef enum { - BACKGROUND = 1, - FOREGROUND = 2, - BOTH = 3 -} draw_mode_t; - - /********************** VIRTUAL DISPATCH DATA TYPE ******************************/ - -// True virtual classes are extremely expensive on the Arduino -// as the compiler stores the virtual function tables in RAM. -// We invent a data type called ScreenRef that gives us -// polymorphism by mapping an ID to virtual methods on various -// classes. This works by keeping a table in PROGMEM of pointers -// to static methods. - -#define DECL_SCREEN(className) { \ - className::onStartup, \ - className::onEntry, \ - className::onExit, \ - className::onIdle, \ - className::onRefresh, \ - className::onRedraw, \ - className::onTouchStart, \ - className::onTouchHeld, \ - className::onTouchEnd \ -} - -#define GET_METHOD(type, method) reinterpret_cast(pgm_read_ptr_far(&functionTable[type].method##_ptr)) -#define SCREEN_TABLE PROGMEM const ScreenRef::table_t ScreenRef::functionTable[] = -#define SCREEN_TABLE_POST const uint8_t ScreenRef::functionTableSize = sizeof(ScreenRef::functionTable)/sizeof(ScreenRef::functionTable[0]); - -class ScreenRef { - protected: - typedef void onStartup_func_t(); - typedef void onEntry_func_t(); - typedef void onExit_func_t(); - typedef void onIdle_func_t(); - typedef void onRefresh_func_t(); - typedef void onRedraw_func_t(draw_mode_t); - typedef bool onTouchStart_func_t(uint8_t); - typedef bool onTouchHeld_func_t(uint8_t); - typedef bool onTouchEnd_func_t(uint8_t); - - private: - typedef struct { - onStartup_func_t *onStartup_ptr; - onEntry_func_t *onEntry_ptr; - onExit_func_t *onExit_ptr; - onIdle_func_t *onIdle_ptr; - onRefresh_func_t *onRefresh_ptr; - onRedraw_func_t *onRedraw_ptr; - onTouchStart_func_t *onTouchStart_ptr; - onTouchHeld_func_t *onTouchHeld_ptr; - onTouchEnd_func_t *onTouchEnd_ptr; - } table_t; - - uint8_t type = 0; - static PROGMEM const table_t functionTable[]; - static const uint8_t functionTableSize; - - public: - uint8_t getType() {return type;} - - void setType(uint8_t t) { - type = t; - } - - uint8_t lookupScreen(onRedraw_func_t onRedraw_ptr); - - void setScreen(onRedraw_func_t onRedraw_ptr); - - void onStartup() {GET_METHOD(type, onStartup)();} - void onEntry() {GET_METHOD(type, onEntry)();} - void onExit() {GET_METHOD(type, onExit)();} - void onIdle() {GET_METHOD(type, onIdle)();} - void onRefresh() {GET_METHOD(type, onRefresh)();} - void onRedraw(draw_mode_t dm) {GET_METHOD(type, onRedraw)(dm);} - bool onTouchStart(uint8_t tag) {return GET_METHOD(type, onTouchStart)(tag);} - bool onTouchHeld(uint8_t tag) {return GET_METHOD(type, onTouchHeld)(tag);} - bool onTouchEnd(uint8_t tag) {return GET_METHOD(type, onTouchEnd)(tag);} - - void initializeAll(); -}; - -/********************** SCREEN STACK ******************************/ - -// To conserve dynamic memory, the screen stack is hard-coded to -// have four values, allowing a menu of up to four levels. - -class ScreenStack : public ScreenRef { - private: - uint8_t stack[4]; - - public: - void start(); - void push(onRedraw_func_t); - void push(); - void pop(); - void forget(); - void goTo(onRedraw_func_t); - void goBack(); - - uint8_t peek() {return stack[0];} - uint8_t getScreen() {return getType();} -}; - -extern ScreenStack current_screen; - -/********************** BASE SCREEN CLASS ******************************/ - -/* UIScreen is the base class for all user interface screens. - */ -class UIScreen { - public: - static void onStartup() {} - static void onEntry() {current_screen.onRefresh();} - static void onExit() {} - static void onIdle() {} - static bool onTouchStart(uint8_t) {return true;} - static bool onTouchHeld(uint8_t) {return false;} - static bool onTouchEnd(uint8_t) {return true;} -}; - -#define PUSH_SCREEN(screen) current_screen.push(screen::onRedraw) -#define GOTO_SCREEN(screen) current_screen.goTo(screen::onRedraw) -#define GOTO_PREVIOUS() current_screen.goBack(); -#define AT_SCREEN(screen) (current_screen.getType() == current_screen.lookupScreen(screen::onRedraw)) -#define IS_PARENT_SCREEN(screen) (current_screen.peek() == current_screen.lookupScreen(screen::onRedraw)) - -/************************** CACHED VS UNCHACHED SCREENS ***************************/ - -class UncachedScreen { - public: - static void onRefresh() { - using namespace FTDI; - CommandProcessor cmd; - cmd.cmd(CMD_DLSTART); - #ifdef TOUCH_UI_USE_UTF8 - load_utf8_bitmaps(cmd); - #endif - - current_screen.onRedraw(BOTH); - - cmd.cmd(DL::DL_DISPLAY); - cmd.cmd(CMD_SWAP); - cmd.execute(); - } -}; - -template -class CachedScreen { - protected: - static void gfxError() { - using namespace FTDI; - CommandProcessor cmd; - cmd.cmd(CMD_DLSTART) - .cmd(CLEAR(true,true,true)) - .font(30) - .text(0, 0, display_width, display_height, F("GFX MEM FULL")); - } - - static bool storeBackground() { - DLCache dlcache(DL_SLOT); - if (!dlcache.store(DL_SIZE)) { - SERIAL_ECHO_MSG("CachedScreen::storeBackground() failed: not enough DL cache space"); - gfxError(); // Try to cache a shorter error message instead. - dlcache.store(DL_SIZE); - return false; - } - return true; - } - - static void repaintBackground() { - using namespace FTDI; - DLCache dlcache(DL_SLOT); - CommandProcessor cmd; - - cmd.cmd(CMD_DLSTART); - #ifdef TOUCH_UI_USE_UTF8 - load_utf8_bitmaps(cmd); - #endif - current_screen.onRedraw(BACKGROUND); - - dlcache.store(DL_SIZE); - } - - public: - static void onRefresh() { - #if ENABLED(TOUCH_UI_DEBUG) - const uint32_t start_time = millis(); - #endif - using namespace FTDI; - DLCache dlcache(DL_SLOT); - CommandProcessor cmd; - - cmd.cmd(CMD_DLSTART); - - if (dlcache.has_data()) { - dlcache.append(); - } - else { - #ifdef TOUCH_UI_USE_UTF8 - load_utf8_bitmaps(cmd); - #endif - current_screen.onRedraw(BACKGROUND); - dlcache.store(DL_SIZE); - } - - current_screen.onRedraw(FOREGROUND); - - cmd.cmd(DL::DL_DISPLAY); - cmd.cmd(CMD_SWAP); - cmd.execute(); - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHOLNPAIR("Time to draw screen (ms): ", millis() - start_time); - #endif - } -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h deleted file mode 100644 index fbdfe2fe99..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h +++ /dev/null @@ -1,38 +0,0 @@ -/**************** - * sound_list.h * - ****************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -class SoundList { - private: - static PROGMEM const struct list_t { - const char *const PROGMEM name; - const FTDI::SoundPlayer::sound_t* data; - } list[]; - public: - static const uint8_t n; - static inline const char* name(uint8_t val) { - return (const char* ) pgm_read_ptr_far(&list[val].name); - } - static inline FTDI::SoundPlayer::sound_t* data(uint8_t val) { - return (FTDI::SoundPlayer::sound_t*) pgm_read_ptr_far(&list[val].data); - } -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp deleted file mode 100644 index 6a5b6e3cf8..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/******************** - * sound_player.cpp * - ********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_extended.h" - -#ifdef FTDI_EXTENDED - -namespace FTDI { - SoundPlayer sound; // Global sound player object - - void SoundPlayer::set_volume(uint8_t vol) { - CLCD::mem_write_8(REG::VOL_SOUND, vol); - } - - uint8_t SoundPlayer::get_volume() { - return CLCD::mem_read_8(REG::VOL_SOUND); - } - - void SoundPlayer::play(effect_t effect, note_t note) { - - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR ("Playing note ", int(note)); - SERIAL_ECHOLNPAIR(", instrument ", int(effect)); - #endif - - // Play the note - CLCD::mem_write_16(REG::SOUND, (note == REST) ? 0 : (((note ? note : NOTE_C4) << 8) | effect)); - CLCD::mem_write_8(REG::PLAY, 1); - } - - note_t SoundPlayer::frequency_to_midi_note(const uint16_t frequency_hz) { - const float f0 = 440; - return note_t(NOTE_A4 + (log(frequency_hz)-log(f0))*12/log(2) + 0.5); - } - - // Plays a tone of a given frequency and duration. Since the FTDI FT810 only - // supports MIDI notes, we round down to the nearest note. - - void SoundPlayer::play_tone(const uint16_t frequency_hz, const uint16_t duration_ms) { - play(ORGAN, frequency_to_midi_note(frequency_hz)); - - // Schedule silence to squelch the note after the duration expires. - sequence = silence; - wait = duration_ms; - timer.start(); - } - - void SoundPlayer::play(const sound_t* seq, play_mode_t mode) { - sequence = seq; - wait = 250; // Adding this delay causes the note to not be clipped, not sure why. - timer.start(); - - if (mode == PLAY_ASYNCHRONOUS) return; - - // If playing synchronously, then play all the notes here - - while (has_more_notes()) { - onIdle(); - #ifdef EXTENSIBLE_UI - ExtUI::yield(); - #endif - } - } - - bool SoundPlayer::is_sound_playing() { - return CLCD::mem_read_8( REG::PLAY ) & 0x1; - } - - void SoundPlayer::onIdle() { - if (!sequence) return; - - const bool ready_for_next_note = (wait == 0) ? !is_sound_playing() : timer.elapsed(wait); - - if (ready_for_next_note) { - const effect_t fx = effect_t(pgm_read_byte(&sequence->effect)); - const note_t nt = note_t(pgm_read_byte(&sequence->note)); - const uint32_t ms = uint32_t(pgm_read_byte(&sequence->sixteenths)) * 1000 / 16; - - if (ms == 0 && fx == SILENCE && nt == END_SONG) { - sequence = 0; - play(SILENCE, REST); - } - else { - wait = ms; - timer.start(); - play(fx, nt); - sequence++; - } - } - } -} // namespace FTDI - -#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h deleted file mode 100644 index e2650b10ae..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h +++ /dev/null @@ -1,70 +0,0 @@ -/****************** - * sound_player.h * - ******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -namespace FTDI { - typedef enum { - PLAY_ASYNCHRONOUS, - PLAY_SYNCHRONOUS - } play_mode_t; - - class SoundPlayer { - typedef FTDI::ftdi_registers REG; - typedef FTDI::ftdi_memory_map MAP; - - public: - struct sound_t { - effect_t effect; // The sound effect number - note_t note; // The MIDI note value - uint16_t sixteenths; // Duration of note, in sixteeths of a second, or zero to play to completion - }; - - const uint8_t WAIT = 0; - - private: - const sound_t *sequence; - tiny_timer_t timer; - tiny_time_t wait; - - note_t frequency_to_midi_note(const uint16_t frequency); - - public: - static void set_volume(uint8_t volume); - static uint8_t get_volume(); - - static void play(effect_t effect, note_t note = NOTE_C4); - static bool is_sound_playing(); - - void play(const sound_t* seq, play_mode_t mode = PLAY_SYNCHRONOUS); - void play_tone(const uint16_t frequency_hz, const uint16_t duration_ms); - bool has_more_notes() {return sequence != 0;}; - - void onIdle(); - }; - - extern SoundPlayer sound; - - const PROGMEM SoundPlayer::sound_t silence[] = { - {SILENCE, END_SONG, 0} - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp deleted file mode 100644 index 3616f15ab6..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/**************** - * text_box.cpp * - ****************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_extended.h" - -#ifdef FTDI_EXTENDED - -namespace FTDI { - /** - * Given a str, end will be set to the position at which a line needs to - * be broken so that the display width is less than w. The line will also - * be broken after a '\n'. Returns the display width of the line. - */ - static uint16_t find_line_break(const FontMetrics &fm, uint16_t w, const char *str, const char *&end) { - w -= fm.get_char_width(' '); - const char *p = str; - end = str; - uint16_t lw = 0, result = 0; - for (;;) { - utf8_char_t c = get_utf8_char_and_inc(p); - if (c == ' ' || c == '\n' || c == '\0') { - if (lw < w || end == str) { - end = (c == '\0') ? p-1 : p; - result = lw; - } - if (c == '\0' || c == '\n') break; - } - lw += fm.get_char_width(c); - } - if (end == str) { - end = p-1; - result = lw; - } - return result; - } - - /** - * This function returns a measurements of the word-wrapped text box. - */ - static void measure_text_box(const FontMetrics &fm, const char *str, uint16_t &width, uint16_t &height) { - const char *line_start = (const char*)str; - const char *line_end; - const uint16_t wrap_width = width; - width = height = 0; - for (;;) { - uint16_t line_width = find_line_break(fm, wrap_width, line_start, line_end); - if (line_end == line_start) break; - width = max(width, line_width); - height += fm.get_height(); - line_start = line_end; - } - } - - /** - * This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit. - */ - void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options, uint8_t font) { - uint16_t box_width, box_height; - - FontMetrics fm(font); - - // Shrink the font until we find a font that fits - for (;;) { - box_width = w; - measure_text_box(fm, str, box_width, box_height); - if (box_width <= (uint16_t)w && box_height <= (uint16_t)h) break; - fm.load(--font); - if (font == 26) break; - } - - const uint16_t dx = (options & OPT_RIGHTX) ? w : (options & OPT_CENTERX) ? w/2 : 0; - const uint16_t dy = (options & OPT_CENTERY) ? (h - box_height)/2 : 0; - - const char *line_start = str; - const char *line_end; - for (;;) { - find_line_break(fm, w, line_start, line_end); - if (line_end == line_start) break; - - const size_t line_len = line_end - line_start; - if (line_len) { - char line[line_len + 1]; - strncpy(line, line_start, line_len); - line[line_len] = 0; - if (line[line_len - 1] == '\n' || line[line_len - 1] == ' ') - line[line_len - 1] = 0; - - #ifdef TOUCH_UI_USE_UTF8 - if (has_utf8_chars(line)) { - draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~OPT_CENTERY); - } else - #endif - { - cmd.CLCD::CommandFifo::text(x + dx, y + dy, font, options & ~OPT_CENTERY); - cmd.CLCD::CommandFifo::str(line); - } - } - y += fm.get_height(); - - line_start = line_end; - } - } - - void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, progmem_str pstr, uint16_t options, uint8_t font) { - char str[strlen_P((const char*)pstr) + 1]; - strcpy_P(str, (const char*)pstr); - draw_text_box(cmd, x, y, w, h, (const char*) str, options, font); - } -} // namespace FTDI - -#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h deleted file mode 100644 index 261995147c..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h +++ /dev/null @@ -1,30 +0,0 @@ -/************** - * text_box.h * - **************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/** - * This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit. - */ -namespace FTDI { - void draw_text_box(class CommandProcessor& cmd, int x, int y, int w, int h, progmem_str str, uint16_t options = 0, uint8_t font = 31); - void draw_text_box(class CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options = 0, uint8_t font = 31); -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp deleted file mode 100644 index b2f62f060c..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/********************* - * text_ellipsis.cpp * - *********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_extended.h" - -#ifdef FTDI_EXTENDED - -namespace FTDI { - - /** - * Helper function for drawing text with ellipses. The str buffer may be modified and should have space for up to two extra characters. - */ - static void _draw_text_with_ellipsis(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, char *str, uint16_t options, uint8_t font) { - FontMetrics fm(font); - const int16_t ellipsisWidth = fm.get_char_width('.') * 3; - - // Compute the total line length, as well as - // the location in the string where it can - // split and still allow the ellipsis to fit. - int16_t lineWidth = 0; - char *breakPoint = str; - for (char* c = str; *c; c++) { - lineWidth += fm.get_char_width(*c); - if (lineWidth + ellipsisWidth < w) - breakPoint = c; - } - - if (lineWidth > w) { - *breakPoint = '\0'; - strcpy_P(breakPoint,PSTR("...")); - } - - cmd.apply_text_alignment(x, y, w, h, options); - #ifdef TOUCH_UI_USE_UTF8 - if (has_utf8_chars(str)) { - draw_utf8_text(cmd, x, y, str, font_size_t::from_romfont(font), options); - } else - #endif - { - cmd.CLCD::CommandFifo::text(x, y, font, options); - cmd.CLCD::CommandFifo::str(str); - } - } - - /** - * These functions draws text inside a bounding box, truncating the text and - * adding ellipsis if the text does not fit. - */ - void draw_text_with_ellipsis(CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options, uint8_t font) { - char tmp[strlen(str) + 3]; - strcpy(tmp, str); - _draw_text_with_ellipsis(cmd, x, y, w, h, tmp, options, font); - } - - void draw_text_with_ellipsis(CommandProcessor& cmd, int x, int y, int w, int h, progmem_str pstr, uint16_t options, uint8_t font) { - char tmp[strlen_P((const char*)pstr) + 3]; - strcpy_P(tmp, (const char*)pstr); - _draw_text_with_ellipsis(cmd, x, y, w, h, tmp, options, font); - } -} // namespace FTDI - -#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h deleted file mode 100644 index 7852b7ec3e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.h +++ /dev/null @@ -1,31 +0,0 @@ -/******************* - * text_ellipsis.h * - *******************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2020 - SynDaver Labs, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/** - * This function draws text inside a bounding box, truncating the text and - * showing ellipsis if it does not fit. - */ -namespace FTDI { - void draw_text_with_ellipsis(class CommandProcessor& cmd, int x, int y, int w, int h, progmem_str str, uint16_t options = 0, uint8_t font = 31); - void draw_text_with_ellipsis(class CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options = 0, uint8_t font = 31); -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp deleted file mode 100644 index 58ec96ac15..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/****************** - * tiny_timer.cpp * - ******************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "ftdi_extended.h" - -#ifdef FTDI_EXTENDED - -bool tiny_timer_t::elapsed(tiny_time_t duration) { - uint8_t now = tiny_time_t::tiny_time( - #ifdef __MARLIN_FIRMWARE__ - ExtUI::safe_millis() - #else - millis() - #endif - ); - uint8_t elapsed = now - _start; - if (elapsed >= duration._duration) { - return true; - } else { - return false; - } -} - -void tiny_timer_t::start() { - _start = tiny_time_t::tiny_time( - #ifdef __MARLIN_FIRMWARE__ - ExtUI::safe_millis() - #else - millis() - #endif - ); -} -#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h deleted file mode 100644 index 700da7bcf2..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h +++ /dev/null @@ -1,56 +0,0 @@ -/**************** - * tiny_timer.h * - ****************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/* Helpful Reference: - * - * https://arduino.stackexchange.com/questions/12587/how-can-i-handle-the-millis-rollover - */ - -/* tiny_interval_t downsamples a 32-bit millis() value - into a 8-bit value which can record periods of - a few seconds with a rougly 1/16th of second - resolution. This allows us to measure small - intervals without needing to use four-byte counters. - */ -class tiny_time_t { - private: - friend class tiny_timer_t; - uint8_t _duration; - - static uint8_t tiny_time(uint32_t ms) {return ceil(float(ms) / 64);}; - - public: - tiny_time_t() : _duration(0) {} - tiny_time_t(uint32_t ms) : _duration(tiny_time(ms)) {} - tiny_time_t & operator= (uint32_t ms) {_duration = tiny_time(ms); return *this;} - bool operator == (uint32_t ms) {return _duration == tiny_time(ms);} -}; - -class tiny_timer_t { - private: - uint8_t _start; - - public: - void start(); - bool elapsed(tiny_time_t interval); -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/README.txt b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/README.txt deleted file mode 100644 index 818bf08cea..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/README.txt +++ /dev/null @@ -1,40 +0,0 @@ - -FTDI EVE Unicode Rendering --------------------------- - -The FTDI EVE chips have several fonts in ROM, but these fonts only contain a -subset of ASCII characters. Notably, this excludes diacritics and accents -used in most Western languages. - -While the FTDI EVE has the capability for user-defined fonts, such fonts only -support 127 character positions, making them as limiting as the built-in fonts. - -As a further complication, high resolution TFT displays require high resolution -fonts. It is not feasible to put a complete international font into the limited -flash memory of most microprocessors. - -To work around these limitations, this library uses a custom font renderer with -the following characteristics: - - 1) Rather than providing bitmaps for different font sizes, it uses a single - bitmap for the largest font size (romfont 31) and emulates other sizes by - scaling the bitmaps using BITMAP_TRANSFORM. - - 2) Rather than loading an entire font, it combines symbols from romfont 31 - with a limited number of symbols from a custom font. For accented letters, - the rendering code combine basic letter shapes from romfont 31 with - bitmaps containing only the accent themselves. - - 3) The custom bitmap is RLE compressed into PROGMEM. For accents, which have - a fairly small number of non-white pixels, the savings are significant. - -These characteristics enable an alphabet for Western languages to be -synthesized from only a few dozen custom symbols and modest PROGMEM use (~10k) - -The text layout is done by the code in "unicode.cpp" with the help of one of -more character renderers (e.g. "western_char_set.cpp"). Each character render -is responsible for loading the necessary bitmap data into RAMG and drawing -characters as requested. - -To add symbols for other languages, it will only be necessary to make a bitmap -and implement a corresponding character renderer. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp deleted file mode 100644 index c5126721ab..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/******************* - * font_bitmap.cpp * - *******************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../ftdi_extended.h" - -#ifdef FTDI_EXTENDED - -namespace FTDI { - - void write_rle_data(uint16_t addr, const uint8_t *data, size_t n) { - for (; n >= 2; n -= 2) { - uint8_t count = pgm_read_byte(data++); - uint8_t value = pgm_read_byte(data++); - while (count--) CLCD::mem_write_8(addr++, value); - } - } - - void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle) { - cmd.cmd(BITMAP_HANDLE(handle)); - cmd.cmd(BITMAP_SOURCE(fm.ptr)); - cmd.bitmap_layout(fm.format, fm.stride, fm.height); - cmd.bitmap_size(BILINEAR, BORDER, BORDER, fm.width, fm.height); - } - - void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell) { - if (x < 0 || y < 0 || x > 511 || y > 511) { - cmd.cmd(BITMAP_HANDLE(handle)); - cmd.cmd(CELL(cell)); - cmd.cmd(VERTEX2F(x * 16, y * 16)); - } - else { - cmd.cmd(VERTEX2II(x, y, handle, cell)); - } - } - -} // namespace FTDI - -#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h deleted file mode 100644 index f1e22e17dd..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h +++ /dev/null @@ -1,30 +0,0 @@ -/****************** - * font_bitmaps.h * - ******************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -class CommandProcessor; - -namespace FTDI { - void write_rle_data(uint16_t addr, const uint8_t *data, size_t n); - void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle); - void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell); -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm deleted file mode 100644 index 39cb67034f..0000000000 Binary files a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm and /dev/null differ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.png b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.png deleted file mode 100644 index ef681923db..0000000000 Binary files a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.png and /dev/null differ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg deleted file mode 100644 index f803126c2b..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg +++ /dev/null @@ -1,443 +0,0 @@ - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - ̀ ́ ̂ ̃ ̈ ̊ ̧ıߨøÆæÐðÞþ«»¡¿¢£¤¥¹²³ºª©®±×÷¼½¾µ¦§¬ - - - - - - - - diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp deleted file mode 100644 index 733cf8f660..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/******************* - * font_size_t.cpp * - *******************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../ftdi_extended.h" - -#if BOTH(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) - -namespace FTDI { - // Returns the height of a standard FTDI romfont - uint8_t font_size_t::get_romfont_height(uint8_t font) { - static const uint8_t tbl[] PROGMEM = { - 8, 8, 16, 16, 13, 17, 20, 22, 29, 38, 16, 20, 25, 28, 36, 49, 63, 83, 108 - }; - return pgm_read_byte(&tbl[font - 16]); - } - - // Sets the scaling coefficient to match a romfont size - font_size_t font_size_t::from_romfont(uint8_t font) { - return font_size_t(uint32_t(std_height) * 256 / get_romfont_height(font)); - } - - // Returns the height of the font - uint8_t font_size_t::get_height() const { - return scale(std_height); - } -} - -#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h deleted file mode 100644 index f5bf644ef9..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h +++ /dev/null @@ -1,55 +0,0 @@ -/***************** - * font_size_t.h * - *****************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -class CommandProcessor; - -namespace FTDI { - - /* The unicode rendering of different font sizes happens by scaling a - * large-sized font bitmap using the FTDI bitmap transformation matrix. - * This keeps us from having to have load bitmaps for all font sizes. - * - * The font_size_t class helps manage this scaling factor. - */ - class font_size_t { - private: - // Standard height for font bitmaps - static constexpr uint8_t std_height = 49; - - // 8.8 fixed point scaling coefficient - uint16_t coefficient; - - font_size_t(uint16_t v) : coefficient(v) {} - public: - font_size_t() : coefficient(256) {} - - static uint8_t get_romfont_height(uint8_t font); - - static font_size_t from_romfont(uint8_t size); - - template T scale(T val) const {return (int32_t(val) * 256 / coefficient);} - - uint8_t get_height() const; - uint16_t get_coefficient() const {return coefficient;} - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp deleted file mode 100644 index b50c12fc6d..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/************************* - * standard_char_set.cpp * - *************************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../ftdi_extended.h" - -#if BOTH(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) - - constexpr static uint8_t std_font = 31; - - /* Lookup table of the char widths for standard ROMFONT 31 */ - - uint8_t FTDI::StandardCharSet::std_char_width(char c) { - static const uint8_t tbl[] PROGMEM = { - 10, 11, 15, 26, 25, 31, 26, 10, 15, 14, 18, 24, 9, 18, 11, 17, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 10, 10, 21, 23, 22, 20, 37, 27, 27, 26, - 28, 23, 22, 28, 29, 12, 23, 26, 22, 35, 29, 28, 26, 29, 27, 26, 26, 28, - 27, 36, 27, 26, 25, 12, 18, 12, 18, 21, 13, 23, 24, 22, 24, 22, 15, 24, - 24, 10, 11, 22, 10, 36, 24, 24, 24, 24, 15, 22, 14, 24, 21, 32, 21, 21, - 22, 15, 10, 15, 29, 10 - }; - return pgm_read_byte(&tbl[c - ' ']); - } - - /** - * Load bitmap data into RAMG. This function is called once at the start - * of the program. - * - * Parameters: - * - * addr - Address in RAMG where the font data is written - */ - - void FTDI::StandardCharSet::load_data(uint32_t) { - } - - /** - * Populates the bitmap handles for the custom into the display list. - * This function is called once at the start of each display list. - * - * Parameters: - * - * cmd - Object used for writing to the FTDI chip command queue. - */ - - void FTDI::StandardCharSet::load_bitmaps(CommandProcessor& cmd) { - CLCD::FontMetrics std_fm(std_font); - set_font_bitmap(cmd, std_fm, std_font); - } - - /** - * Renders a character at location x and y. The x position is incremented - * by the width of the character. - * - * Parameters: - * - * cmd - If non-NULL the symbol is drawn to the screen. - * If NULL, only increment position for text measurement. - * - * x, y - The location at which to draw the character. On output, - * incremented to the location of the next character. - * - * fs - A scaling object used to scale the font. The display will - * already be configured to scale bitmaps, but positions - * must be scaled using fs.scale() - * - * c - The unicode code point to draw. If the renderer does not - * support the character, it should draw nothing. - */ - - bool FTDI::StandardCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) { - uint8_t which = (c >= ' ' && c < 128) ? c : '?'; - uint8_t width = std_char_width(which); - - if (c == '\t') { - // Special handling for the tab character - which = ' '; - width = std_char_width(' '); - } - - // Draw the character - if (cmd) ext_vertex2ii(*cmd, x, y, std_font, which); - - // Increment X to the next character position - x += fs.scale(width); - return true; - } - -#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h deleted file mode 100644 index 7decdfd38f..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h +++ /dev/null @@ -1,30 +0,0 @@ -/*********************** - * standard_char_set.h * - ***********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -namespace FTDI { - class StandardCharSet { - public: - static uint8_t std_char_width(char); - static void load_data(uint32_t addr); - static void load_bitmaps(CommandProcessor&); - static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t); - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp deleted file mode 100644 index 09473c1c26..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/*************** - * unicode.cpp * - ***************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../ftdi_extended.h" - -#if BOTH(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) - - using namespace FTDI; - - /** - * Return true if a string has UTF8 characters - * - * Parameters: - * - * c - Pointer to a string. - * - * Returns: True if the strings has UTF8 characters - */ - - bool FTDI::has_utf8_chars(const char *str) { - for (;;) { - const char c = *str++; - if (!c) break; - if ((c & 0xC0) == 0x80) return true; - } - return false; - } - - bool FTDI::has_utf8_chars(progmem_str _str) { - const char *str = (const char *) _str; - for (;;) { - const char c = pgm_read_byte(str++); - if (!c) break; - if ((c & 0xC0) == 0x80) return true; - } - return false; - } - - /** - * Return a character in a UTF8 string and increment the - * pointer to the next character - * - * Parameters: - * - * c - Pointer to a UTF8 encoded string. - * - * Returns: The packed bytes of a UTF8 encoding of a single - * character (this is not the unicode codepoint) - */ - - utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) { - utf8_char_t val = *(uint8_t*)c++; - while ((*c & 0xC0) == 0x80) - val = (val << 8) | *(uint8_t*)c++; - return val; - } - - /** - * Helper function to draw and/or measure a UTF8 string - * - * Parameters: - * - * cmd - If non-NULL the symbol is drawn to the screen. - * If NULL, only increment position for text measurement. - * - * x, y - The location at which to draw the string. - * - * str - The UTF8 string to draw or measure. - * - * fs - A scaling object used to specify the font size. - */ - - static uint16_t render_utf8_text(CommandProcessor* cmd, int x, int y, const char *str, font_size_t fs) { - const int start_x = x; - while (*str) { - const utf8_char_t c = get_utf8_char_and_inc(str); - #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET - WesternCharSet::render_glyph(cmd, x, y, fs, c) || - #endif - StandardCharSet::render_glyph(cmd, x, y, fs, c); - } - return x - start_x; - } - - /** - * Load the font bitmap data into RAMG. Called once at program start. - * - * Parameters: - * - * addr - Address in RAMG where the font data is written - */ - - void FTDI::load_utf8_data(uint16_t addr) { - #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET - WesternCharSet::load_data(addr); - #endif - StandardCharSet::load_data(addr); - } - - /** - * Populate the bitmap handles for the custom fonts into the display list. - * Called once at the start of each display list. - * - * Parameters: - * - * cmd - Object used for writing to the FTDI chip command queue. - */ - - void FTDI::load_utf8_bitmaps(CommandProcessor &cmd) { - #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET - WesternCharSet::load_bitmaps(cmd); - #endif - StandardCharSet::load_bitmaps(cmd); - } - - /** - * Measure a UTF8 text character - * - * Parameters: - * - * c - The unicode code point to measure. - * - * fs - A scaling object used to specify the font size. - * - * Returns: A width in pixels - */ - - uint16_t FTDI::get_utf8_char_width(utf8_char_t c, font_size_t fs) { - int x = 0, y = 0; - #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET - WesternCharSet::render_glyph(NULL, x, y, fs, c) || - #endif - StandardCharSet::render_glyph(NULL, x, y, fs, c); - return x; - } - - /** - * Measure a UTF8 text string - * - * Parameters: - * - * str - The UTF8 string to measure. - * - * fs - A scaling object used to specify the font size. - * - * Returns: A width in pixels - */ - - uint16_t FTDI::get_utf8_text_width(const char *str, font_size_t fs) { - return render_utf8_text(NULL, 0, 0, str, fs); - } - - uint16_t FTDI::get_utf8_text_width(progmem_str pstr, font_size_t fs) { - char str[strlen_P((const char*)pstr) + 1]; - strcpy_P(str, (const char*)pstr); - return get_utf8_text_width(str, fs); - } - - /** - * Draw a UTF8 text string - * - * Parameters: - * - * cmd - Object used for writing to the FTDI chip command queue. - * - * x, y - The location at which to draw the string. - * - * str - The UTF8 string to draw. - * - * fs - A scaling object used to specify the font size. - * - * options - Text alignment options (i.e. OPT_CENTERX, OPT_CENTERY, OPT_CENTER or OPT_RIGHTX) - * - */ - - void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, const char *str, font_size_t fs, uint16_t options) { - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(BITMAP_TRANSFORM_A(fs.get_coefficient())); - cmd.cmd(BITMAP_TRANSFORM_E(fs.get_coefficient())); - cmd.cmd(BEGIN(BITMAPS)); - - // Apply alignment options - if (options & OPT_CENTERX) - x -= get_utf8_text_width(str, fs) / 2; - else if (options & OPT_RIGHTX) - x -= get_utf8_text_width(str, fs); - if (options & OPT_CENTERY) - y -= fs.get_height()/2; - - // Render the text - render_utf8_text(&cmd, x, y, str, fs); - cmd.cmd(RESTORE_CONTEXT()); - } - - void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, progmem_str pstr, font_size_t fs, uint16_t options) { - char str[strlen_P((const char*)pstr) + 1]; - strcpy_P(str, (const char*)pstr); - draw_utf8_text(cmd, x, y, (const char*) str, fs, options); - } - -#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h deleted file mode 100644 index 16f7e197b5..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h +++ /dev/null @@ -1,111 +0,0 @@ -/************* - * unicode.h * - *************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -class CommandProcessor; - -namespace FTDI { - #ifdef TOUCH_UI_USE_UTF8 - typedef uint16_t utf8_char_t; - - /** - * Converts a 32-bit codepoint into UTF-8. This compile-time function - * will be useful until the u8'a' character literal becomes more common. - */ - constexpr uint32_t utf8(const uint32_t c) { - return (c < 0x7F ) ? c : - (c < 0x7FF) ? (0x0000C080 | ((c & 0b011111000000) << 2) | (c & 0b111111)) : - (c < 0xFFFF) ? (0x00E08080 | ((c & 0b001111000000000000) << 4) | ((c & 0b111111000000) << 2) | (c & 0b111111)) : - (0xF0808080 | ((c & 0b000111000000000000000000) << 6) | ((c & 0b111111000000000000) << 4) | ((c & 0b111111000000) << 2) | (c & 0b111111)); - } - - /* Returns true if the string has UTF8 string characters */ - - bool has_utf8_chars(progmem_str str); - bool has_utf8_chars(const char *str); - - /* Returns the next character in a UTF8 string and increments the - * pointer to the next character */ - - utf8_char_t get_utf8_char_and_inc(const char *&c); - - /* Returns the next character in a UTF8 string, without incrementing */ - - inline utf8_char_t get_utf8_char(const char *c) {return get_utf8_char_and_inc(c);} - - void load_utf8_data(uint16_t addr); - #else - typedef char utf8_char_t; - - inline utf8_char_t get_utf8_char_and_inc(const char *&c) {return *c++;} - inline utf8_char_t get_utf8_char(const char *c) {return *c;} - - inline void load_utf8_data(uint16_t) {} - #endif - - void load_utf8_bitmaps(CommandProcessor& cmd); - - uint16_t get_utf8_char_width(utf8_char_t, font_size_t); - uint16_t get_utf8_text_width(progmem_str, font_size_t); - uint16_t get_utf8_text_width(const char *, font_size_t); - - void draw_utf8_text(CommandProcessor&, int x, int y, progmem_str, font_size_t, uint16_t options = 0); - void draw_utf8_text(CommandProcessor&, int x, int y, const char *, font_size_t, uint16_t options = 0); - - // Similar to CLCD::FontMetrics, but can be used with UTF8 encoded strings. - - struct FontMetrics { - #ifdef TOUCH_UI_USE_UTF8 - font_size_t fs; - #else - CLCD::FontMetrics fm; - #endif - - inline void load(uint8_t rom_font_size) { - #ifdef TOUCH_UI_USE_UTF8 - fs = font_size_t::from_romfont(rom_font_size); - #else - fm.load(rom_font_size); - #endif - } - - inline uint16_t get_char_width(utf8_char_t c) const { - #ifdef TOUCH_UI_USE_UTF8 - return get_utf8_char_width(c, fs); - #else - return fm.char_widths[(uint8_t)c]; - #endif - } - - inline uint8_t get_height() const { - #ifdef TOUCH_UI_USE_UTF8 - return fs.get_height(); - #else - return fm.height; - #endif - } - - inline FontMetrics(uint8_t rom_font_size) { - load(rom_font_size); - } - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp deleted file mode 100644 index 4aa2580c63..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp +++ /dev/null @@ -1,450 +0,0 @@ -/************************ - * western_char_set.cpp * - ************************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../ftdi_extended.h" - -#if ALL(FTDI_EXTENDED, TOUCH_UI_USE_UTF8, TOUCH_UI_UTF8_WESTERN_CHARSET) - - #include "western_char_set_bitmap_31.h" - - #define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0])) - - using namespace FTDI; - - constexpr static uint8_t std_font = 31; - constexpr static uint8_t alt_font = 1; - - static uint32_t bitmap_addr; - - /* Glyphs in the WesternCharSet bitmap */ - - enum { - GRAVE, - ACUTE, - CIRCUMFLEX, - TILDE, - DIAERESIS, - DOT_ABOVE, - CEDILLA, - NO_DOT_I, - #if ENABLED(TOUCH_UI_UTF8_GERMANIC) - SHARP_S, - #endif - #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - LRG_O_STROKE, - SML_O_STROKE, - LRG_AE, - SML_AE, - LRG_ETH, - SML_ETH, - LRG_THORN, - SML_THORN, - #endif - #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) - LEFT_DBL_QUOTE, - RIGHT_DBL_QUOTE, - INV_EXCLAMATION, - INV_QUESTION, - #endif - #if ENABLED(TOUCH_UI_UTF8_CURRENCY) - CENT_SIGN, - POUND_SIGN, - CURRENCY_SIGN, - YEN_SIGN, - #endif - #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) - SUPERSCRIPT_ONE, - SUPERSCRIPT_TWO, - SUPERSCRIPT_THREE, - #endif - #if ENABLED(TOUCH_UI_UTF8_ORDINALS) - MASCULINE_ORDINAL, - FEMININE_ORDINAL, - #endif - #if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) - COPYRIGHT_SIGN, - REGISTERED_SIGN, - #endif - #if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) - PLUS_MINUS_SIGN, - MULTIPLICATION_SIGN, - DIVISION_SIGN, - #endif - #if ENABLED(TOUCH_UI_UTF8_FRACTIONS) - FRACTION_QUARTER, - FRACTION_HALF, - FRACTION_THREE_FOURTHS, - #endif - #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) - MICRON_SIGN, - PILCROW_SIGN, - BROKEN_BAR, - SECTION_SIGN, - NOT_SIGN - #endif - }; - - /* Centerline of characters that can take accents */ - - constexpr int8_t mid_a = 12, - mid_e = 12, - mid_i = 5, - mid_o = 12, - mid_u = 12, - mid_y = 11, - mid_n = 12, - mid_c = 12, - mid_A = 13, - mid_E = 13, - mid_I = 6, - mid_O = 14, - mid_U = 14, - mid_Y = 13, - mid_N = 15, - mid_C = 13; - - /* Centerline of accent glyphs */ - - constexpr int8_t mid_accent = 16; - - /* When reusing the DOT_ABOVE accent glyph for the degree sign, we need to trim the leading space */ - constexpr uint8_t deg_sign_leading = 9; - - /* Look-up table for constructing characters (must be ordered by unicode) - * - * Characters are either complete symbols from the Western Char Set bitmap, - * or they are constructed using a standard letter from the romfont and - * drawing an accent from the Western Char Set bitmap over it. - */ - - #define UTF8(A) uint16_t(utf8(U##A)) - - PROGMEM constexpr struct { - uint16_t unicode; - uint8_t std_char; // Glyph from standard ROMFONT (zero if none) - uint8_t alt_char; // Glyph from Western Char Set bitmap - uint8_t alt_data; // For accented characters, the centerline; else char width - } char_recipe[] = { - {0, 0, NO_DOT_I, 10 }, - #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) - {UTF8('¡'), 0 , INV_EXCLAMATION, 13 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_CURRENCY) - {UTF8('¢'), 0 , CENT_SIGN, 23 }, - {UTF8('£'), 0 , POUND_SIGN, 24 }, - {UTF8('¤'), 0 , CURRENCY_SIGN, 26 }, - {UTF8('¥'), 0 , YEN_SIGN, 26 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) - {UTF8('¦'), 0 , BROKEN_BAR, 11 }, - {UTF8('§'), 0 , SECTION_SIGN, 21 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) - {UTF8('©'), 0 , COPYRIGHT_SIGN, 38 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_ORDINALS) - {UTF8('ª'), 0 , FEMININE_ORDINAL, 19 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) - {UTF8('«'), 0 , LEFT_DBL_QUOTE, 23 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) - {UTF8('¬'), 0 , NOT_SIGN, 32 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) - {UTF8('®'), 0 , REGISTERED_SIGN, 38 }, - #endif - {UTF8('°'), 0 , DOT_ABOVE, 24 }, - #if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) - {UTF8('±'), 0 , NOT_SIGN, 32 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) - {UTF8('²'), 0 , SUPERSCRIPT_TWO, 16 }, - {UTF8('³'), 0 , SUPERSCRIPT_THREE, 16 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) - {UTF8('µ'), 0 , MICRON_SIGN, 28 }, - {UTF8('¶'), 0 , PILCROW_SIGN, 24 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) - {UTF8('¹'), 0 , SUPERSCRIPT_ONE, 16 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_ORDINALS) - {UTF8('º'), 0 , MASCULINE_ORDINAL, 19 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) - {UTF8('»'), 0 , RIGHT_DBL_QUOTE, 24 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_FRACTIONS) - {UTF8('¼'), 0 , FRACTION_QUARTER, 40 }, - {UTF8('½'), 0 , FRACTION_HALF, 40 }, - {UTF8('¾'), 0 , FRACTION_THREE_FOURTHS, 40 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) - {UTF8('¿'), 0 , INV_QUESTION, 21 }, - #endif - {UTF8('À'), 'A', GRAVE, mid_A}, - {UTF8('Á'), 'A', ACUTE, mid_A}, - {UTF8('Â'), 'A', CIRCUMFLEX, mid_A}, - {UTF8('Ã'), 'A', TILDE, mid_A}, - {UTF8('Ä'), 'A', DIAERESIS, mid_A}, - {UTF8('Å'), 'A', DOT_ABOVE, mid_A}, - #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - {UTF8('Æ'), 0 , LRG_AE, 40}, - #endif - {UTF8('Ç'), 'C', CEDILLA, mid_C}, - {UTF8('È'), 'E', GRAVE, mid_E}, - {UTF8('É'), 'E', ACUTE, mid_E}, - {UTF8('Ê'), 'E', CIRCUMFLEX, mid_E}, - {UTF8('Ë'), 'E', DIAERESIS, mid_E}, - {UTF8('Ì'), 'I', GRAVE, mid_I}, - {UTF8('Í'), 'I', ACUTE, mid_I}, - {UTF8('Î'), 'I', CIRCUMFLEX, mid_I}, - {UTF8('Ï'), 'I', DIAERESIS, mid_I}, - #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - {UTF8('Ð'), 0, LRG_ETH, 31 }, - #endif - {UTF8('Ñ'), 'N', TILDE, mid_N}, - {UTF8('Ò'), 'O', GRAVE, mid_O}, - {UTF8('Ó'), 'O', ACUTE, mid_O}, - {UTF8('Ô'), 'O', CIRCUMFLEX, mid_O}, - {UTF8('Õ'), 'O', TILDE, mid_O}, - {UTF8('Ö'), 'O', DIAERESIS, mid_O}, - #if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) - {UTF8('×'), 0 , MULTIPLICATION_SIGN, 32 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - {UTF8('Ø'), 0 , LRG_O_STROKE, 32 }, - #endif - {UTF8('Ù'), 'U', GRAVE, mid_U}, - {UTF8('Ú'), 'U', ACUTE, mid_U}, - {UTF8('Û'), 'U', CIRCUMFLEX, mid_U}, - {UTF8('Ü'), 'U', DIAERESIS, mid_U}, - {UTF8('Ý'), 'Y', ACUTE, mid_Y}, - #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - {UTF8('Þ'), 0 , LRG_THORN, 25 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_GERMANIC) - {UTF8('ß'), 0 , SHARP_S, 26 }, - #endif - {UTF8('à'), 'a', GRAVE, mid_a}, - {UTF8('á'), 'a', ACUTE, mid_a}, - {UTF8('â'), 'a', CIRCUMFLEX, mid_a}, - {UTF8('ã'), 'a', TILDE, mid_a}, - {UTF8('ä'), 'a', DIAERESIS, mid_a}, - {UTF8('å'), 'a', DOT_ABOVE, mid_a}, - #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - {UTF8('æ'), 0 , SML_AE, 40 }, - #endif - {UTF8('ç'), 'c', CEDILLA, mid_c}, - {UTF8('è'), 'e', GRAVE, mid_e}, - {UTF8('é'), 'e', ACUTE, mid_e}, - {UTF8('ê'), 'e', CIRCUMFLEX, mid_e}, - {UTF8('ë'), 'e', DIAERESIS, mid_e}, - {UTF8('ì'), 'i', GRAVE, mid_i}, - {UTF8('í'), 'i', ACUTE, mid_i}, - {UTF8('î'), 'i', CIRCUMFLEX, mid_i}, - {UTF8('ï'), 'i', DIAERESIS, mid_i}, - #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - {UTF8('ð'), 0, SML_ETH, 24 }, - #endif - {UTF8('ñ'), 'n', TILDE, mid_n}, - {UTF8('ò'), 'o', GRAVE, mid_o}, - {UTF8('ó'), 'o', ACUTE, mid_o}, - {UTF8('ô'), 'o', CIRCUMFLEX, mid_o}, - {UTF8('õ'), 'o', TILDE, mid_o}, - {UTF8('ö'), 'o', DIAERESIS, mid_o}, - #if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) - {UTF8('÷'), 0 , DIVISION_SIGN, 32 }, - #endif - #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - {UTF8('ø'), 0 , SML_O_STROKE, 25 }, - #endif - {UTF8('ù'), 'u', GRAVE, mid_u}, - {UTF8('ú'), 'u', ACUTE, mid_u}, - {UTF8('û'), 'u', CIRCUMFLEX, mid_u}, - {UTF8('ü'), 'u', DIAERESIS, mid_u}, - {UTF8('ý'), 'y', ACUTE, mid_y}, - #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - {UTF8('þ'), 0 , SML_THORN, 25 }, - #endif - {UTF8('ÿ'), 'y', DIAERESIS, mid_y} - }; - - static_assert(UTF8('¡') == 0xC2A1, "Incorrect encoding for character"); - - /* Compile-time check that the table is in sorted order */ - - constexpr bool is_sorted(size_t n) { - return n < 2 ? true : char_recipe[n-2].unicode < char_recipe[n-1].unicode && is_sorted(n-1); - } - - static_assert(is_sorted(NUM_ELEMENTS(char_recipe)), "The table must be sorted by unicode value"); - - /* Performs a binary search to find a unicode character in the table */ - - static int8_t find_char_data(FTDI::utf8_char_t c) { - int8_t min = 0, max = NUM_ELEMENTS(char_recipe), index; - for (;;) { - index = (min + max)/2; - const uint16_t char_at = pgm_read_word(&char_recipe[index].unicode); - if (char_at == c) break; - if (min == max) return -1; - if (c > char_at) - min = index + 1; - else - max = index; - } - return index; - } - - static void get_char_data(uint8_t index, uint8_t &std_char, uint8_t &alt_char, uint8_t &alt_data) { - std_char = pgm_read_byte(&char_recipe[index].std_char); - alt_char = pgm_read_byte(&char_recipe[index].alt_char); - alt_data = pgm_read_byte(&char_recipe[index].alt_data); - } - - /** - * Load bitmap data into RAMG. This function is called once at the start - * of the program. - * - * Parameters: - * - * addr - Address in RAMG where the font data is written - */ - - void FTDI::WesternCharSet::load_data(uint32_t addr) { - // Load the alternative font metrics - CLCD::FontMetrics alt_fm; - alt_fm.ptr = addr + 148; - alt_fm.format = L4; - alt_fm.stride = 19; - alt_fm.width = 38; - alt_fm.height = 49; - LOOP_L_N(i, 127) - alt_fm.char_widths[i] = 0; - - // For special characters, copy the character widths from the char tables - LOOP_L_N(i, NUM_ELEMENTS(char_recipe)) { - uint8_t std_char, alt_char, alt_data; - get_char_data(i, std_char, alt_char, alt_data); - if (std_char == 0) - alt_fm.char_widths[alt_char] = alt_data; - } - CLCD::mem_write_bulk(addr, &alt_fm, 148); - - // Decode the RLE data and load it into RAMG as a bitmap - write_rle_data(addr + 148, font, sizeof(font)); - - bitmap_addr = addr; - } - - /** - * Populates the bitmap handles for the custom into the display list. - * This function is called once at the start of each display list. - * - * Parameters: - * - * cmd - Object used for writing to the FTDI chip command queue. - */ - - void FTDI::WesternCharSet::load_bitmaps(CommandProcessor& cmd) { - CLCD::FontMetrics alt_fm; - alt_fm.ptr = bitmap_addr + 148; - alt_fm.format = L4; - alt_fm.stride = 19; - alt_fm.width = 38; - alt_fm.height = 49; - set_font_bitmap(cmd, alt_fm, alt_font); - } - - /** - * Renders a character at location x and y. The x position is incremented - * by the width of the character. - * - * Parameters: - * - * cmd - If non-NULL the symbol is drawn to the screen. - * If NULL, only increment position for text measurement. - * - * x, y - The location at which to draw the character. On output, - * incremented to the location of the next character. - * - * fs - A scaling object used to scale the font. The display will - * already be configured to scale bitmaps, but positions - * must be scaled using fs.scale() - * - * c - The unicode code point to draw. If the renderer does not - * support the character, it should return false. - - * Returns: Whether the character was supported. - */ - - bool FTDI::WesternCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) { - - // A supported character? - if (c < UTF8('¡') || c > UTF8('ÿ')) return false; - - int8_t index = find_char_data(c); - if (index == -1) return false; - - // Determine character characteristics - uint8_t std_char, alt_char, alt_data; - get_char_data(index, std_char, alt_char, alt_data); - - bool base_special; - uint8_t base_width; - uint8_t base_char; - uint8_t accent_char; - int8_t accent_dx, accent_dy; - - if (std_char == 0) { - // Special character, non-accented - base_width = alt_data; - base_special = true; - base_char = alt_char; - accent_char = 0; - if (c == UTF8('°')) - x -= fs.scale(deg_sign_leading); - } - else { - // Regular character with accent: - accent_dx = alt_data - mid_accent; - accent_dy = isupper(std_char) ? -7 : 0; - accent_char = alt_char; - base_width = StandardCharSet::std_char_width(std_char); - base_special = std_char == 'i'; - base_char = base_special ? NO_DOT_I : std_char; - } - - // If cmd != NULL, draw the glyph to the screen - if (cmd) { - ext_vertex2ii(*cmd, x, y, base_special ? alt_font : std_font, base_char); - if (accent_char) - ext_vertex2ii(*cmd, x + fs.scale(accent_dx), y + fs.scale(accent_dy), alt_font, accent_char); - } - - // Increment X to the next character position - x += fs.scale(base_width); - return true; - } - -#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 && TOUCH_UI_UTF8_WESTERN_CHARSET diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h deleted file mode 100644 index 2adad2327a..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h +++ /dev/null @@ -1,29 +0,0 @@ -/********************** - * western_char_set.h * - **********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -namespace FTDI { - class WesternCharSet { - public: - static void load_data(uint32_t addr); - static void load_bitmaps(CommandProcessor&); - static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t); - }; -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h deleted file mode 100644 index 3426e1377d..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h +++ /dev/null @@ -1,1315 +0,0 @@ -/******************************** - * western_european_bitmap_31.h * - ********************************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/* This is a dump of "font_bitmaps/western_european_bitmap_31.png" - * using the tool "bitmap2cpp.py". The tool converts the image into - * 16-level grayscale and packs two pixels per byte. The resulting - * bytes are then RLE compressed to yield (count, byte) pairs. - */ - -const unsigned char font[] PROGMEM = { - - /* 0 GRAVE */ - 0x76, 0x00, 0x01, 0x08, 0x01, 0xEE, 0x01, 0xE5, 0x11, 0x00, 0x01, 0xAF, - 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xD0, - 0x10, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xF9, 0x11, 0x00, 0x01, 0x2E, - 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF2, - 0x11, 0x00, 0x01, 0x5F, 0x01, 0xFD, 0x11, 0x00, 0x01, 0x06, 0x01, 0x99, - 0x01, 0x40, 0xFF, 0x00, 0xFF, 0x00, 0xA4, 0x00, - - /* 1 ACUTE */ - 0x7B, 0x00, 0x01, 0x9E, 0x01, 0xEE, 0x01, 0x50, 0x0F, 0x00, 0x01, 0x05, - 0x01, 0xFF, 0x01, 0xF8, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x09, 0x01, 0xFF, - 0x01, 0xD1, 0x10, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x01, 0x20, 0x0F, 0x00, - 0x01, 0x01, 0x01, 0xEF, 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xAA, - 0x01, 0x40, 0xFF, 0x00, 0xFF, 0x00, 0xA5, 0x00, - - /* 2 CIRCUMFLEX */ - 0x79, 0x00, 0x01, 0xCF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x07, 0x02, 0xFF, - 0x01, 0x60, 0x0F, 0x00, 0x01, 0x2F, 0x02, 0xFF, 0x01, 0xF2, 0x0F, 0x00, - 0x01, 0xCF, 0x01, 0xF6, 0x01, 0x6F, 0x01, 0xFB, 0x0E, 0x00, 0x01, 0x06, - 0x01, 0xFF, 0x01, 0xA0, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x60, 0x0D, 0x00, - 0x01, 0x1F, 0x01, 0xFD, 0x01, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xF1, - 0x0D, 0x00, 0x01, 0xBF, 0x01, 0xF3, 0x02, 0x00, 0x01, 0x3F, 0x01, 0xFB, - 0x0C, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x50, 0x02, 0x00, 0x01, 0x05, - 0x01, 0x99, 0x01, 0x20, 0xFF, 0x00, 0xFF, 0x00, 0xA2, 0x00, - - /* 3 TILDE */ - 0x7C, 0x00, 0x01, 0x11, 0x0D, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xC3, - 0x02, 0x00, 0x01, 0xFF, 0x01, 0x80, 0x0C, 0x00, 0x01, 0xAF, 0x02, 0xFF, - 0x01, 0x50, 0x01, 0x01, 0x01, 0xFF, 0x01, 0x60, 0x0B, 0x00, 0x01, 0x02, - 0x01, 0xFF, 0x01, 0xD9, 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0x40, 0x0B, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x3E, - 0x02, 0xFF, 0x01, 0xFD, 0x0C, 0x00, 0x01, 0x09, 0x01, 0xFE, 0x01, 0x00, - 0x01, 0x02, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xF4, 0x0C, 0x00, 0x01, 0x07, - 0x01, 0xA8, 0x02, 0x00, 0x01, 0x06, 0x01, 0x98, 0x01, 0x20, 0xFF, 0x00, - 0xFF, 0x00, 0xB6, 0x00, - - /* 4 DIAERESIS */ - 0x8A, 0x00, 0x02, 0x44, 0x02, 0x00, 0x02, 0x44, 0x0D, 0x00, 0x02, 0xFF, - 0x01, 0x10, 0x01, 0x01, 0x02, 0xFF, 0x0D, 0x00, 0x02, 0xFF, 0x01, 0x10, - 0x01, 0x01, 0x02, 0xFF, 0x0D, 0x00, 0x02, 0xFF, 0x01, 0x10, 0x01, 0x01, - 0x02, 0xFF, 0x0D, 0x00, 0x02, 0xCC, 0x01, 0x10, 0x01, 0x01, 0x02, 0xCC, - 0xFF, 0x00, 0xFF, 0x00, 0xC9, 0x00, - - /* 5 DOT_ABOVE / DEGREE_SIGN */ - 0x2D, 0x00, 0x01, 0x13, 0x01, 0x30, 0x10, 0x00, 0x01, 0x2B, 0x02, 0xFF, - 0x01, 0xA1, 0x0E, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xFD, - 0x01, 0x10, 0x0D, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x94, 0x01, 0x5A, - 0x01, 0xFF, 0x01, 0xB0, 0x0D, 0x00, 0x01, 0x4F, 0x01, 0xF7, 0x02, 0x00, - 0x01, 0x9F, 0x01, 0xF2, 0x0D, 0x00, 0x01, 0x8F, 0x01, 0xF0, 0x02, 0x00, - 0x01, 0x2F, 0x01, 0xF6, 0x0D, 0x00, 0x01, 0x8F, 0x01, 0xE0, 0x02, 0x00, - 0x01, 0x0F, 0x01, 0xF7, 0x0D, 0x00, 0x01, 0x7F, 0x01, 0xF2, 0x02, 0x00, - 0x01, 0x4F, 0x01, 0xF5, 0x0D, 0x00, 0x01, 0x2F, 0x01, 0xFC, 0x01, 0x10, - 0x01, 0x02, 0x01, 0xDF, 0x01, 0xF0, 0x0D, 0x00, 0x01, 0x08, 0x01, 0xFF, - 0x01, 0xFB, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x60, 0x0E, 0x00, 0x01, 0x9F, - 0x02, 0xFF, 0x01, 0xF8, 0x0F, 0x00, 0x01, 0x03, 0x01, 0x9C, 0x01, 0xC9, - 0x01, 0x30, 0xFF, 0x00, 0xFF, 0x00, 0xA4, 0x00, - - /* 6 CEDILLA */ - 0xFF, 0x00, 0xFF, 0x00, 0xEE, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0x20, - 0x11, 0x00, 0x01, 0xCF, 0x01, 0xC0, 0x11, 0x00, 0x01, 0x3F, 0x01, 0xF6, - 0x11, 0x00, 0x01, 0x0F, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x3F, 0x01, 0xFD, - 0x0E, 0x00, 0x01, 0x07, 0x01, 0xD9, 0x01, 0x89, 0x01, 0xFF, 0x01, 0xFB, - 0x0E, 0x00, 0x01, 0x07, 0x03, 0xFF, 0x01, 0xF3, 0x0E, 0x00, 0x01, 0x04, - 0x01, 0xBD, 0x01, 0xEE, 0x01, 0xD9, 0x01, 0x20, 0x2F, 0x00, - - /* 7 NO_DOT_I */ - 0xFF, 0x00, 0x32, 0x00, 0x01, 0x01, 0x01, 0x99, 0x01, 0x96, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, - 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, - 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, - 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, - 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, - 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, - 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, - 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0xCD, 0x00, - -#if ENABLED(TOUCH_UI_UTF8_GERMANIC) - /* 8 SHARP_S */ - 0x8A, 0x00, 0x01, 0x35, 0x01, 0x66, 0x01, 0x52, 0x0E, 0x00, 0x01, 0x03, - 0x01, 0xAF, 0x03, 0xFF, 0x01, 0xE7, 0x0D, 0x00, 0x01, 0x7F, 0x05, 0xFF, - 0x01, 0xC1, 0x0B, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xFC, 0x01, 0xAA, - 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFC, 0x0B, 0x00, 0x01, 0x2F, 0x01, 0xFF, - 0x01, 0xF9, 0x01, 0x10, 0x01, 0x00, 0x01, 0x02, 0x01, 0xCF, 0x01, 0xFF, - 0x01, 0x70, 0x0A, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x80, 0x03, 0x00, - 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xE0, 0x0A, 0x00, 0x01, 0xEF, 0x01, 0xFF, - 0x04, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF3, 0x09, 0x00, 0x01, 0x02, - 0x01, 0xFF, 0x01, 0xFB, 0x04, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF7, - 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF9, 0x03, 0x00, 0x01, 0x03, - 0x01, 0x9E, 0x01, 0xFF, 0x01, 0xF8, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF8, 0x02, 0x00, 0x01, 0x01, 0x01, 0xAF, 0x02, 0xFF, 0x01, 0xD7, - 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x1D, - 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x50, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF8, 0x02, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x70, 0x0B, 0x00, - 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x01, 0x01, 0xFF, - 0x01, 0xFA, 0x0C, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, - 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF4, 0x0C, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF8, 0x01, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF4, 0x0C, 0x00, - 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFF, - 0x01, 0xF9, 0x0C, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, - 0x01, 0x02, 0x02, 0xFF, 0x01, 0x50, 0x0B, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF8, 0x02, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xF8, 0x0B, 0x00, - 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x1D, 0x02, 0xFF, - 0x01, 0xD3, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, - 0x01, 0x01, 0x01, 0xCF, 0x02, 0xFF, 0x01, 0x70, 0x09, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xFB, - 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x2B, - 0x02, 0xFF, 0x01, 0xB0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, - 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xF6, 0x08, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF8, 0x05, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFD, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xDF, - 0x01, 0xFF, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, - 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x10, 0x07, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF8, 0x06, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x08, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF8, 0x05, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xFD, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x02, 0x01, 0x84, - 0x03, 0x00, 0x01, 0x2D, 0x01, 0xFF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xEC, 0x01, 0xA9, - 0x01, 0xAC, 0x02, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF8, 0x01, 0x02, 0x05, 0xFF, 0x01, 0xFE, 0x01, 0x20, 0x08, 0x00, - 0x01, 0x03, 0x01, 0xEE, 0x01, 0xE7, 0x01, 0x01, 0x01, 0xBF, 0x03, 0xFF, - 0x01, 0xFE, 0x01, 0x80, 0x0E, 0x00, 0x01, 0x35, 0x01, 0x78, 0x01, 0x76, - 0x01, 0x30, 0xB4, 0x00, -#endif - -#if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) - /* 9 LRG_O_STROKE */ - 0x93, 0x00, 0x01, 0x40, 0x0A, 0x00, 0x01, 0x47, 0x01, 0x9A, 0x01, 0xBA, - 0x01, 0x95, 0x01, 0x10, 0x02, 0x00, 0x01, 0x07, 0x01, 0xF8, 0x08, 0x00, - 0x01, 0x02, 0x01, 0xAF, 0x04, 0xFF, 0x01, 0xFC, 0x01, 0x50, 0x01, 0x00, - 0x01, 0x5F, 0x01, 0xFF, 0x01, 0x30, 0x07, 0x00, 0x01, 0x8F, 0x06, 0xFF, - 0x01, 0xFC, 0x01, 0x23, 0x01, 0xFF, 0x01, 0xF6, 0x07, 0x00, 0x01, 0x1C, - 0x03, 0xFF, 0x01, 0xCA, 0x01, 0x9B, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xFE, - 0x01, 0xFF, 0x01, 0x80, 0x07, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xFD, - 0x01, 0x50, 0x02, 0x00, 0x01, 0x02, 0x01, 0x9F, 0x02, 0xFF, 0x01, 0xFA, - 0x07, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0x90, 0x04, 0x00, 0x01, 0x03, - 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xF3, 0x07, 0x00, 0x01, 0x5F, 0x01, 0xFF, - 0x01, 0xF9, 0x06, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xFC, 0x07, 0x00, - 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xC0, 0x05, 0x00, 0x01, 0x06, 0x03, 0xFF, - 0x01, 0x60, 0x05, 0x00, 0x01, 0x04, 0x02, 0xFF, 0x01, 0x30, 0x05, 0x00, - 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xC0, 0x05, 0x00, - 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xFC, 0x05, 0x00, 0x01, 0x02, 0x01, 0xEF, - 0x01, 0xF7, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x0F, - 0x01, 0xFF, 0x01, 0xF6, 0x05, 0x00, 0x01, 0x1D, 0x01, 0xFF, 0x01, 0xA0, - 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xF8, 0x05, 0x00, 0x01, 0x3F, 0x01, 0xFF, - 0x01, 0xF2, 0x05, 0x00, 0x01, 0xCF, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x09, - 0x01, 0xFF, 0x01, 0xFB, 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xE0, - 0x04, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xD1, 0x01, 0x00, 0x01, 0x06, - 0x01, 0xFF, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xC0, - 0x04, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x00, 0x01, 0x03, - 0x02, 0xFF, 0x05, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xB0, 0x03, 0x00, - 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF4, 0x02, 0x00, 0x01, 0x02, 0x02, 0xFF, - 0x01, 0x10, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x03, 0x00, - 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0x01, 0x02, 0xFF, - 0x01, 0x30, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x02, 0x00, - 0x01, 0x01, 0x01, 0xEF, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x02, 0x02, 0xFF, - 0x01, 0x20, 0x04, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xB0, 0x02, 0x00, - 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xB0, 0x03, 0x00, 0x01, 0x03, 0x02, 0xFF, - 0x01, 0x10, 0x04, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xC0, 0x02, 0x00, - 0x01, 0xBF, 0x01, 0xFD, 0x04, 0x00, 0x01, 0x04, 0x02, 0xFF, 0x05, 0x00, - 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xE0, 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF, - 0x01, 0xE1, 0x04, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFE, 0x05, 0x00, - 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x6F, 0x01, 0xFF, - 0x01, 0x30, 0x04, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xFA, 0x05, 0x00, - 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF6, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xF5, - 0x05, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF7, 0x05, 0x00, 0x01, 0x09, - 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0x70, 0x05, 0x00, - 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xF2, 0x05, 0x00, 0x01, 0x03, 0x02, 0xFF, - 0x01, 0xEF, 0x01, 0xFA, 0x06, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xB0, - 0x06, 0x00, 0x01, 0xCF, 0x02, 0xFF, 0x01, 0xC0, 0x05, 0x00, 0x01, 0x06, - 0x02, 0xFF, 0x01, 0x40, 0x06, 0x00, 0x01, 0x2F, 0x02, 0xFF, 0x01, 0x20, - 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x0B, - 0x02, 0xFF, 0x01, 0xD2, 0x04, 0x00, 0x01, 0x06, 0x02, 0xFF, 0x01, 0xE1, - 0x07, 0x00, 0x01, 0x5F, 0x03, 0xFF, 0x01, 0x93, 0x02, 0x00, 0x01, 0x05, - 0x01, 0xCF, 0x02, 0xFF, 0x01, 0x30, 0x06, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xFB, 0x03, 0xFF, 0x01, 0xFD, 0x01, 0xDE, 0x03, 0xFF, 0x01, 0xE3, - 0x07, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0x80, 0x01, 0x4D, 0x06, 0xFF, - 0x01, 0xFA, 0x01, 0x10, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFB, 0x02, 0x00, - 0x01, 0x5C, 0x04, 0xFF, 0x01, 0xE9, 0x01, 0x30, 0x08, 0x00, 0x01, 0x1C, - 0x01, 0xD0, 0x03, 0x00, 0x01, 0x04, 0x01, 0x67, 0x01, 0x86, 0x01, 0x53, - 0x0B, 0x00, 0x01, 0x10, 0xA8, 0x00, - - /* 10 SML_O_STROKE */ - 0xFF, 0x00, 0x15, 0x00, 0x01, 0x02, 0x01, 0x20, 0x0C, 0x00, 0x01, 0x02, - 0x01, 0x32, 0x01, 0x10, 0x02, 0x00, 0x01, 0x1D, 0x01, 0xE3, 0x0A, 0x00, - 0x01, 0x01, 0x01, 0x7C, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0x82, 0x01, 0x00, - 0x01, 0xCF, 0x01, 0xF7, 0x0A, 0x00, 0x01, 0x6E, 0x05, 0xFF, 0x01, 0x89, - 0x01, 0xFF, 0x01, 0xA0, 0x09, 0x00, 0x01, 0x08, 0x07, 0xFF, 0x01, 0xFC, - 0x0A, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x50, 0x01, 0x00, - 0x01, 0x3A, 0x02, 0xFF, 0x01, 0xF1, 0x09, 0x00, 0x01, 0x01, 0x02, 0xFF, - 0x01, 0x90, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xF5, 0x09, 0x00, - 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x01, 0x01, 0xDF, - 0x01, 0xFF, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF3, - 0x03, 0x00, 0x01, 0x0B, 0x03, 0xFF, 0x01, 0x30, 0x08, 0x00, 0x01, 0x3F, - 0x01, 0xFF, 0x01, 0xD0, 0x03, 0x00, 0x01, 0x9F, 0x01, 0xFA, 0x01, 0x8F, - 0x01, 0xFF, 0x01, 0x80, 0x08, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x80, - 0x02, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xC0, 0x01, 0x3F, 0x01, 0xFF, - 0x01, 0xB0, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x50, 0x02, 0x00, - 0x01, 0x3F, 0x01, 0xFE, 0x01, 0x10, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xE0, - 0x08, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x40, 0x01, 0x00, 0x01, 0x02, - 0x01, 0xEF, 0x01, 0xF3, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, - 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x30, 0x01, 0x00, 0x01, 0x0D, - 0x01, 0xFF, 0x01, 0x50, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF0, - 0x08, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x30, 0x01, 0x00, 0x01, 0xBF, - 0x01, 0xF8, 0x02, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, - 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x40, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xB0, - 0x02, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x7F, - 0x01, 0xFF, 0x01, 0x60, 0x01, 0x5F, 0x01, 0xFD, 0x03, 0x00, 0x01, 0x3F, - 0x01, 0xFF, 0x01, 0xC0, 0x08, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA3, - 0x01, 0xFF, 0x01, 0xE2, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x90, - 0x08, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0xFF, 0x01, 0x40, - 0x03, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x08, 0x00, 0x01, 0x0A, - 0x02, 0xFF, 0x01, 0xF6, 0x03, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFE, - 0x09, 0x00, 0x01, 0x02, 0x02, 0xFF, 0x01, 0xB0, 0x03, 0x00, 0x01, 0x2E, - 0x01, 0xFF, 0x01, 0xF8, 0x0A, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xF7, - 0x02, 0x00, 0x01, 0x05, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xD0, 0x09, 0x00, - 0x01, 0x04, 0x03, 0xFF, 0x01, 0xFC, 0x01, 0xAB, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0xFE, 0x01, 0x20, 0x09, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xAF, - 0x05, 0xFF, 0x01, 0xD2, 0x09, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xF5, - 0x01, 0x04, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xD6, 0x0A, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0x70, 0x01, 0x00, 0x01, 0x01, 0x01, 0x46, 0x01, 0x76, - 0x01, 0x52, 0x0C, 0x00, 0x01, 0x28, 0xA9, 0x00, - - /* 11 LRG_AE */ - 0x9E, 0x00, 0x01, 0x14, 0x0B, 0x44, 0x01, 0x41, 0x06, 0x00, 0x01, 0x8F, - 0x0B, 0xFF, 0x01, 0xF3, 0x06, 0x00, 0x01, 0xEF, 0x0B, 0xFF, 0x01, 0xF3, - 0x05, 0x00, 0x01, 0x05, 0x02, 0xFF, 0x01, 0xEE, 0x09, 0xFF, 0x01, 0xF3, - 0x05, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF5, 0x01, 0x00, 0x01, 0xDF, - 0x01, 0xFF, 0x01, 0x63, 0x06, 0x33, 0x01, 0x30, 0x05, 0x00, 0x01, 0x3F, - 0x01, 0xFF, 0x01, 0xE0, 0x01, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, - 0x0C, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x80, 0x01, 0x00, 0x01, 0xDF, - 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x01, 0x10, - 0x01, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0x07, - 0x01, 0xFF, 0x01, 0xFA, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, - 0x0B, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xF3, 0x02, 0x00, 0x01, 0xDF, - 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xD0, - 0x02, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0xBF, - 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, - 0x0A, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFE, 0x03, 0x00, 0x01, 0xDF, - 0x01, 0xFF, 0x01, 0x40, 0x0A, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF9, - 0x03, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xED, 0x06, 0xDD, 0x01, 0x80, - 0x03, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x03, 0x00, 0x01, 0xDF, - 0x08, 0xFF, 0x01, 0xA0, 0x03, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xB0, - 0x03, 0x00, 0x01, 0xDF, 0x08, 0xFF, 0x01, 0xA0, 0x03, 0x00, 0x01, 0xCF, - 0x01, 0xFF, 0x01, 0x40, 0x03, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xA8, - 0x06, 0x88, 0x01, 0x50, 0x02, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFE, - 0x04, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x09, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, - 0x09, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xF4, 0x04, 0x33, 0x01, 0xDF, - 0x01, 0xFF, 0x01, 0x40, 0x09, 0x00, 0x01, 0x7F, 0x08, 0xFF, 0x01, 0x40, - 0x09, 0x00, 0x01, 0xEF, 0x08, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x05, - 0x09, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF7, - 0x05, 0x33, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x2F, - 0x01, 0xFF, 0x01, 0xE0, 0x05, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, - 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x80, 0x05, 0x00, 0x01, 0xDF, - 0x01, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x05, 0x00, - 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x07, 0x00, 0x01, 0x06, 0x01, 0xFF, - 0x01, 0xFB, 0x06, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xA8, 0x06, 0x88, - 0x01, 0x85, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xF4, 0x06, 0x00, 0x01, 0xDF, - 0x08, 0xFF, 0x01, 0xF9, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xE0, 0x06, 0x00, - 0x01, 0xDF, 0x08, 0xFF, 0x01, 0xF9, 0x01, 0x8D, 0x01, 0xDD, 0x01, 0x60, - 0x06, 0x00, 0x01, 0xBD, 0x08, 0xDD, 0x01, 0xD8, 0xBE, 0x00, - - /* 12 SML_AE */ - 0xFF, 0x00, 0x22, 0x00, 0x01, 0x01, 0x01, 0x34, 0x01, 0x31, 0x06, 0x00, - 0x01, 0x12, 0x01, 0x42, 0x01, 0x10, 0x05, 0x00, 0x01, 0x02, 0x01, 0x7B, - 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xFB, 0x01, 0x60, 0x02, 0x00, 0x01, 0x03, - 0x01, 0x9E, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0x81, 0x04, 0x00, 0x01, 0xBF, - 0x05, 0xFF, 0x01, 0xFE, 0x01, 0x40, 0x01, 0x01, 0x01, 0x9F, 0x05, 0xFF, - 0x01, 0x60, 0x03, 0x00, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xEE, 0x03, 0xFF, - 0x01, 0xF5, 0x01, 0x1D, 0x03, 0xFF, 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xF8, - 0x03, 0x00, 0x01, 0xDF, 0x01, 0xB6, 0x01, 0x30, 0x01, 0x00, 0x01, 0x01, - 0x01, 0x5D, 0x02, 0xFF, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xE7, 0x01, 0x20, - 0x01, 0x00, 0x01, 0x29, 0x02, 0xFF, 0x01, 0x50, 0x02, 0x00, 0x01, 0x71, - 0x05, 0x00, 0x01, 0xAF, 0x02, 0xFF, 0x01, 0xFB, 0x01, 0x10, 0x03, 0x00, - 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x0D, 0x02, 0xFF, - 0x01, 0xD0, 0x04, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF7, 0x08, 0x00, - 0x01, 0x06, 0x02, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0xEF, 0x01, 0xFD, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFD, 0x06, 0x00, 0x01, 0x9F, - 0x01, 0xFF, 0x04, 0x00, 0x01, 0x02, 0x01, 0x45, 0x02, 0x66, 0x01, 0x67, - 0x01, 0xFF, 0x01, 0xF9, 0x06, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x03, 0x00, - 0x01, 0x4A, 0x06, 0xFF, 0x01, 0xFB, 0x03, 0x66, 0x01, 0x67, 0x02, 0x77, - 0x01, 0xAF, 0x01, 0xFF, 0x02, 0x00, 0x01, 0x1B, 0x10, 0xFF, 0x01, 0x00, - 0x01, 0x01, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xCA, 0x01, 0x98, 0x01, 0x88, - 0x01, 0x89, 0x0A, 0xFF, 0x01, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFD, - 0x01, 0x40, 0x03, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFA, 0x08, 0x77, - 0x01, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xD0, 0x04, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF7, 0x09, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0x70, - 0x04, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFA, 0x09, 0x00, 0x01, 0x7F, - 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFE, - 0x09, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0F, - 0x02, 0xFF, 0x01, 0x50, 0x08, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x60, - 0x04, 0x00, 0x01, 0x8F, 0x02, 0xFF, 0x01, 0xE1, 0x08, 0x00, 0x01, 0x3F, - 0x01, 0xFF, 0x01, 0xD0, 0x03, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFE, - 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x10, 0x05, 0x00, 0x01, 0x45, 0x01, 0x00, - 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, - 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xA2, 0x02, 0xFF, 0x01, 0xE6, 0x01, 0x10, - 0x02, 0x00, 0x01, 0x02, 0x01, 0x8D, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x05, - 0x02, 0xFF, 0x01, 0xFD, 0x01, 0xAB, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xFC, - 0x01, 0x00, 0x01, 0x3F, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0xBA, 0x01, 0xBC, - 0x02, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x7F, 0x05, 0xFF, 0x01, 0xA0, - 0x01, 0x00, 0x01, 0x02, 0x01, 0xCF, 0x06, 0xFF, 0x01, 0xF7, 0x02, 0x00, - 0x01, 0x03, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xB4, 0x03, 0x00, 0x01, 0x05, - 0x01, 0xBF, 0x04, 0xFF, 0x01, 0xB7, 0x01, 0x10, 0x03, 0x00, 0x01, 0x01, - 0x01, 0x46, 0x01, 0x76, 0x01, 0x41, 0x06, 0x00, 0x01, 0x35, 0x01, 0x67, - 0x01, 0x64, 0x01, 0x20, 0xAD, 0x00, - - /* 13 LRG_ETH */ - 0x9A, 0x00, 0x01, 0x34, 0x03, 0x44, 0x01, 0x43, 0x01, 0x21, 0x0D, 0x00, - 0x01, 0xBF, 0x05, 0xFF, 0x01, 0xFE, 0x01, 0xB8, 0x01, 0x40, 0x0A, 0x00, - 0x01, 0xBF, 0x07, 0xFF, 0x01, 0xFE, 0x01, 0x81, 0x09, 0x00, 0x01, 0xBF, - 0x08, 0xFF, 0x01, 0xFE, 0x01, 0x60, 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, - 0x01, 0x61, 0x02, 0x11, 0x01, 0x23, 0x01, 0x58, 0x01, 0xCF, 0x02, 0xFF, - 0x01, 0xF9, 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x04, 0x00, - 0x01, 0x02, 0x01, 0x9F, 0x02, 0xFF, 0x01, 0x80, 0x07, 0x00, 0x01, 0xBF, - 0x01, 0xFF, 0x01, 0x50, 0x05, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0xF4, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x06, 0x00, - 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFD, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, - 0x01, 0x50, 0x06, 0x00, 0x01, 0x06, 0x02, 0xFF, 0x01, 0x50, 0x06, 0x00, - 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0xB0, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, - 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xF0, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, - 0x01, 0x50, 0x07, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0xF3, 0x06, 0x00, - 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0F, 0x01, 0xFF, - 0x01, 0xF5, 0x04, 0x00, 0x01, 0x23, 0x01, 0x33, 0x01, 0xCF, 0x01, 0xFF, - 0x01, 0x73, 0x02, 0x33, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0D, 0x01, 0xFF, - 0x01, 0xF6, 0x04, 0x00, 0x01, 0xCF, 0x06, 0xFF, 0x01, 0xF2, 0x04, 0x00, - 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0xCF, 0x06, 0xFF, - 0x01, 0xF2, 0x04, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF9, 0x04, 0x00, - 0x01, 0x9B, 0x01, 0xBB, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xDB, 0x02, 0xBB, - 0x01, 0xB1, 0x04, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, - 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0D, 0x01, 0xFF, - 0x01, 0xF7, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, - 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF6, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, - 0x01, 0x50, 0x07, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xF4, 0x06, 0x00, - 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x5F, 0x01, 0xFF, - 0x01, 0xF1, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, - 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xD0, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, - 0x01, 0x50, 0x06, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x01, 0x80, 0x06, 0x00, - 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0B, 0x02, 0xFF, - 0x01, 0x20, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x06, 0x00, - 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xF9, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, - 0x01, 0x50, 0x05, 0x00, 0x01, 0x0A, 0x02, 0xFF, 0x01, 0xE1, 0x07, 0x00, - 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x04, 0x00, 0x01, 0x29, 0x03, 0xFF, - 0x01, 0x30, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xA7, 0x01, 0x77, - 0x01, 0x78, 0x01, 0x9A, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xE3, 0x08, 0x00, - 0x01, 0xBF, 0x08, 0xFF, 0x01, 0xF9, 0x01, 0x10, 0x08, 0x00, 0x01, 0xBF, - 0x07, 0xFF, 0x01, 0xD8, 0x01, 0x10, 0x09, 0x00, 0x01, 0xAD, 0x03, 0xDD, - 0x01, 0xDC, 0x01, 0xCB, 0x01, 0xA7, 0x01, 0x41, 0xC7, 0x00, - - /* 14 SML_ETH */ - 0x88, 0x00, 0x01, 0x38, 0x01, 0x88, 0x01, 0x81, 0x10, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x5A, 0x01, 0x40, 0x0C, 0x00, - 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xB0, 0x01, 0x04, 0x01, 0xAF, 0x01, 0xFF, - 0x01, 0xA0, 0x0C, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0xFC, 0x02, 0xFF, - 0x01, 0xD8, 0x01, 0x20, 0x0C, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xFD, - 0x01, 0x82, 0x0D, 0x00, 0x01, 0x5A, 0x03, 0xFF, 0x01, 0xF4, 0x0D, 0x00, - 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x87, 0x02, 0xFF, 0x01, 0x30, - 0x0C, 0x00, 0x01, 0x6F, 0x01, 0xE9, 0x01, 0x30, 0x01, 0x00, 0x01, 0x8F, - 0x01, 0xFF, 0x01, 0xE2, 0x0C, 0x00, 0x01, 0x03, 0x03, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x10, 0x0E, 0x00, 0x01, 0x23, 0x01, 0x44, - 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0x02, 0x01, 0x9E, - 0x04, 0xFF, 0x01, 0xF7, 0x0C, 0x00, 0x01, 0x7F, 0x06, 0xFF, 0x01, 0x30, - 0x0A, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0xFE, 0x01, 0xCB, 0x01, 0xDF, - 0x02, 0xFF, 0x01, 0xD0, 0x0A, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xFB, - 0x01, 0x30, 0x02, 0x00, 0x01, 0x4E, 0x01, 0xFF, 0x01, 0xF5, 0x09, 0x00, - 0x01, 0x02, 0x02, 0xFF, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05, 0x01, 0xFF, - 0x01, 0xFD, 0x09, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFA, 0x05, 0x00, - 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x20, 0x08, 0x00, 0x01, 0x0F, 0x01, 0xFF, - 0x01, 0xF1, 0x05, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA0, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, - 0x01, 0xB0, 0x08, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x70, 0x05, 0x00, - 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xD0, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, - 0x01, 0x40, 0x05, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, - 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x30, 0x05, 0x00, 0x01, 0x0E, 0x01, 0xFF, - 0x01, 0xF0, 0x08, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x30, 0x05, 0x00, - 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, - 0x01, 0x40, 0x05, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, - 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x70, 0x05, 0x00, 0x01, 0x2F, 0x01, 0xFF, - 0x01, 0xD0, 0x08, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA0, 0x05, 0x00, - 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0F, 0x01, 0xFF, - 0x01, 0xF1, 0x05, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x08, 0x00, - 0x01, 0x09, 0x01, 0xFF, 0x01, 0xF9, 0x04, 0x00, 0x01, 0x05, 0x01, 0xFF, - 0x01, 0xFE, 0x09, 0x00, 0x01, 0x02, 0x02, 0xFF, 0x01, 0x60, 0x03, 0x00, - 0x01, 0x3E, 0x01, 0xFF, 0x01, 0xF6, 0x0A, 0x00, 0x01, 0x7F, 0x01, 0xFF, - 0x01, 0xF9, 0x01, 0x20, 0x01, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xB0, - 0x0A, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0xBD, 0x02, 0xFF, - 0x01, 0xFD, 0x01, 0x10, 0x0B, 0x00, 0x01, 0x7F, 0x05, 0xFF, 0x01, 0xB0, - 0x0C, 0x00, 0x01, 0x02, 0x01, 0xAE, 0x03, 0xFF, 0x01, 0xB4, 0x0F, 0x00, - 0x01, 0x35, 0x01, 0x65, 0x01, 0x40, 0xB6, 0x00, - - /* 15 LRG_THORN */ - 0x9A, 0x00, 0x02, 0x55, 0x11, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, - 0x05, 0xFF, 0x01, 0xED, 0x01, 0xA7, 0x01, 0x10, 0x0B, 0x00, 0x07, 0xFF, - 0x01, 0xFA, 0x01, 0x10, 0x0A, 0x00, 0x08, 0xFF, 0x01, 0xE2, 0x0A, 0x00, - 0x02, 0xFF, 0x01, 0x65, 0x01, 0x55, 0x01, 0x56, 0x01, 0x7A, 0x02, 0xFF, - 0x01, 0xFE, 0x01, 0x10, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x03, 0x00, - 0x01, 0x1B, 0x02, 0xFF, 0x01, 0x80, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, - 0x04, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xF0, 0x09, 0x00, 0x02, 0xFF, - 0x01, 0x20, 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xF3, 0x09, 0x00, - 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF6, - 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0D, 0x01, 0xFF, - 0x01, 0xF7, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0D, - 0x01, 0xFF, 0x01, 0xF7, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, - 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF6, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, - 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xF3, 0x09, 0x00, 0x02, 0xFF, - 0x01, 0x20, 0x04, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xF0, 0x09, 0x00, - 0x02, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x1B, 0x02, 0xFF, 0x01, 0x80, - 0x09, 0x00, 0x02, 0xFF, 0x01, 0x65, 0x02, 0x55, 0x01, 0x7A, 0x02, 0xFF, - 0x01, 0xFE, 0x01, 0x10, 0x09, 0x00, 0x08, 0xFF, 0x01, 0xE2, 0x0A, 0x00, - 0x07, 0xFF, 0x01, 0xFA, 0x01, 0x10, 0x0A, 0x00, 0x05, 0xFF, 0x01, 0xED, - 0x01, 0xA7, 0x01, 0x10, 0x0B, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, - 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xCC, 0x01, 0x10, 0xCC, 0x00, - - /* 16 SML_THORN */ - 0x86, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x94, 0x10, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, - 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, - 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, - 0x02, 0x00, 0x01, 0x13, 0x01, 0x54, 0x01, 0x20, 0x0B, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x00, 0x01, 0x5C, 0x02, 0xFF, 0x01, 0xFD, - 0x01, 0x70, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x0B, - 0x04, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF7, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xEC, 0x01, 0xDF, 0x02, 0xFF, - 0x01, 0xE1, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0xFF, - 0x01, 0xC3, 0x02, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xFC, 0x09, 0x00, - 0x01, 0x03, 0x02, 0xFF, 0x01, 0xFA, 0x03, 0x00, 0x01, 0x02, 0x01, 0xEF, - 0x01, 0xFF, 0x01, 0x60, 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x01, 0xE0, - 0x04, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD0, 0x08, 0x00, 0x01, 0x03, - 0x02, 0xFF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF3, - 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x05, 0x00, 0x01, 0x06, 0x01, 0xFF, - 0x01, 0xF7, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFC, 0x05, 0x00, - 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFB, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF9, 0x06, 0x00, 0x01, 0xFF, 0x01, 0xFD, 0x08, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xFE, 0x08, 0x00, - 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xFF, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xEF, - 0x01, 0xFE, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF9, 0x06, 0x00, - 0x01, 0xFF, 0x01, 0xFD, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFC, - 0x05, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFB, 0x08, 0x00, 0x01, 0x03, - 0x02, 0xFF, 0x05, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF8, 0x08, 0x00, - 0x01, 0x03, 0x02, 0xFF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0C, 0x01, 0xFF, - 0x01, 0xF3, 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x01, 0xD0, 0x04, 0x00, - 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, - 0x01, 0xFA, 0x03, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x60, - 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0xFF, 0x01, 0xB3, - 0x02, 0x00, 0x01, 0x6E, 0x01, 0xFF, 0x01, 0xFC, 0x09, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF7, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xEC, 0x01, 0xCF, - 0x02, 0xFF, 0x01, 0xE2, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, - 0x01, 0x0B, 0x04, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x00, 0x01, 0x6C, 0x02, 0xFF, 0x01, 0xFE, - 0x01, 0x70, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x02, 0x00, - 0x01, 0x23, 0x01, 0x54, 0x01, 0x20, 0x0B, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, - 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, - 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, - 0x01, 0xF7, 0x10, 0x00, 0x01, 0x01, 0x01, 0x66, 0x01, 0x63, 0x22, 0x00, -#endif // TOUCH_UI_UTF8_SCANDINAVIAN - -#if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) - /* 17 LEFT_DBL_QUOTE */ - 0xFF, 0x00, 0x4A, 0x00, 0x01, 0x30, 0x03, 0x00, 0x01, 0x02, 0x0D, 0x00, - 0x01, 0x08, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x01, 0x01, 0xC6, 0x0D, 0x00, - 0x01, 0xAF, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x1D, 0x01, 0xF6, 0x0C, 0x00, - 0x01, 0x1C, 0x01, 0xFF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xEF, - 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x50, - 0x01, 0x00, 0x01, 0x3E, 0x01, 0xFF, 0x01, 0xE2, 0x0B, 0x00, 0x01, 0x2E, - 0x01, 0xFF, 0x01, 0xF4, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFD, - 0x01, 0x20, 0x0A, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFE, 0x01, 0x30, - 0x01, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xD1, 0x0B, 0x00, 0x01, 0x5F, - 0x01, 0xFF, 0x01, 0xD2, 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFB, - 0x0B, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x10, 0x01, 0x00, - 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x0C, 0x01, 0xFF, - 0x01, 0xD0, 0x02, 0x00, 0x01, 0xFF, 0x01, 0xFA, 0x0C, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x50, - 0x0C, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x1C, - 0x01, 0xFF, 0x01, 0xF6, 0x0C, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFB, - 0x02, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x90, 0x0C, 0x00, 0x01, 0x6F, - 0x01, 0xFF, 0x01, 0xD1, 0x01, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xFA, - 0x0C, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x01, 0x00, - 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0x4F, 0x01, 0xFF, - 0x01, 0xA0, 0x01, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF6, 0x0C, 0x00, - 0x01, 0x02, 0x01, 0xEF, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x5F, 0x01, 0xF6, - 0x0D, 0x00, 0x01, 0x1D, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x04, 0x01, 0xE6, - 0x0D, 0x00, 0x01, 0x01, 0x01, 0x60, 0x03, 0x00, 0x01, 0x24, 0xFF, 0x00, - - /* 18 RIGHT_DBL_QUOTE */ - 0xFF, 0x00, 0x46, 0x00, 0x01, 0x20, 0x03, 0x00, 0x01, 0x20, 0x0D, 0x00, - 0x01, 0x01, 0x01, 0xE3, 0x03, 0x00, 0x01, 0x5D, 0x01, 0x10, 0x0C, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0x50, 0x02, 0x00, 0x01, 0x5F, 0x01, 0xE2, - 0x0C, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF6, 0x02, 0x00, 0x01, 0x5F, - 0x01, 0xFE, 0x01, 0x30, 0x0C, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x80, - 0x01, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xF5, 0x0C, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0xFA, 0x01, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x01, 0xFF, - 0x01, 0x60, 0x0C, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xB0, 0x01, 0x00, - 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF9, 0x0C, 0x00, 0x01, 0x06, 0x01, 0xFF, - 0x01, 0xFC, 0x01, 0x10, 0x01, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, - 0x0C, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD1, 0x01, 0x00, 0x01, 0x08, - 0x01, 0xFF, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF5, - 0x02, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x10, 0x0B, 0x00, 0x01, 0x2D, - 0x01, 0xFF, 0x01, 0xF3, 0x01, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFE, - 0x01, 0x10, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x40, - 0x01, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD2, 0x0B, 0x00, 0x01, 0x4F, - 0x01, 0xFF, 0x01, 0xE3, 0x01, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFC, - 0x01, 0x10, 0x0A, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x10, - 0x01, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x6F, - 0x01, 0xFF, 0x01, 0xC1, 0x01, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF9, - 0x0B, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x5F, - 0x01, 0xFF, 0x01, 0x70, 0x0B, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0x90, - 0x02, 0x00, 0x01, 0x5F, 0x01, 0xF6, 0x0C, 0x00, 0x01, 0x01, 0x01, 0xF8, - 0x03, 0x00, 0x01, 0x5F, 0x01, 0x40, 0x0C, 0x00, 0x01, 0x01, 0x01, 0x50, - 0x03, 0x00, 0x01, 0x43, 0xFF, 0x00, 0x04, 0x00, - - /* 19 INV_EXCLAMATION */ - 0xFF, 0x00, 0x34, 0x00, 0x01, 0xAD, 0x01, 0xDD, 0x01, 0x40, 0x10, 0x00, - 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, - 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, - 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34, 0x01, 0x44, - 0x01, 0x10, 0x49, 0x00, 0x01, 0x02, 0x01, 0x22, 0x11, 0x00, 0x01, 0x6F, - 0x01, 0xFF, 0x11, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x11, 0x00, 0x01, 0x7F, - 0x01, 0xFF, 0x01, 0x10, 0x10, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x20, - 0x10, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x30, 0x10, 0x00, 0x01, 0xAF, - 0x01, 0xFF, 0x01, 0x30, 0x10, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x40, - 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, - 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, - 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, - 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, - 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, - 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, - 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, - 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, - 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34, - 0x01, 0x44, 0x01, 0x10, 0x33, 0x00, - - /* 20 INV_QUESTION */ - 0xFF, 0x00, 0x36, 0x00, 0x02, 0xDD, 0x11, 0x00, 0x02, 0xFF, 0x11, 0x00, - 0x02, 0xFF, 0x11, 0x00, 0x02, 0xFF, 0x11, 0x00, 0x02, 0xFF, 0x11, 0x00, - 0x02, 0x44, 0x37, 0x00, 0x01, 0xBC, 0x01, 0xCB, 0x11, 0x00, 0x01, 0xEF, - 0x01, 0xFE, 0x11, 0x00, 0x01, 0xEF, 0x01, 0xFE, 0x11, 0x00, 0x01, 0xEF, - 0x01, 0xFE, 0x11, 0x00, 0x01, 0xFF, 0x01, 0xFD, 0x10, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xFB, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF6, - 0x10, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xD0, 0x0F, 0x00, 0x01, 0x0A, - 0x02, 0xFF, 0x01, 0x30, 0x0F, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xF4, - 0x0F, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0x40, 0x0F, 0x00, 0x01, 0x7F, - 0x01, 0xFF, 0x01, 0xF4, 0x0F, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x01, 0x40, - 0x0F, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF8, 0x10, 0x00, 0x01, 0x0F, - 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xF0, - 0x10, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, - 0x01, 0xFF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x05, 0x01, 0xD0, 0x0A, 0x00, - 0x01, 0x08, 0x02, 0xFF, 0x01, 0x70, 0x02, 0x00, 0x01, 0x05, 0x01, 0xCF, - 0x01, 0xF0, 0x0A, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xFE, - 0x01, 0x98, 0x01, 0x8B, 0x02, 0xFF, 0x01, 0xF0, 0x0B, 0x00, 0x01, 0x3F, - 0x06, 0xFF, 0x01, 0xC0, 0x0B, 0x00, 0x01, 0x02, 0x01, 0xCF, 0x04, 0xFF, - 0x01, 0xC5, 0x0D, 0x00, 0x01, 0x03, 0x01, 0x8B, 0x01, 0xCC, 0x01, 0xB9, - 0x01, 0x62, 0x31, 0x00, -#endif // TOUCH_UI_UTF8_PUNCTUATION - -#if ENABLED(TOUCH_UI_UTF8_CURRENCY) - /* 21 CENT_SIGN */ - 0xB1, 0x00, 0x01, 0x01, 0x01, 0x32, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, - 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, - 0x11, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFC, - 0x11, 0x00, 0x01, 0x39, 0x01, 0xFD, 0x01, 0x42, 0x0E, 0x00, 0x01, 0x05, - 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xFB, 0x01, 0x50, 0x0B, 0x00, 0x01, 0x03, - 0x01, 0xCF, 0x05, 0xFF, 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x4F, 0x02, 0xFF, - 0x02, 0xFE, 0x01, 0xCE, 0x01, 0xFF, 0x01, 0xF6, 0x0A, 0x00, 0x01, 0x02, - 0x02, 0xFF, 0x01, 0xE6, 0x01, 0x05, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x38, - 0x01, 0xE6, 0x0A, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x10, - 0x01, 0x05, 0x01, 0xFC, 0x02, 0x00, 0x01, 0x02, 0x0A, 0x00, 0x01, 0x5F, - 0x01, 0xFF, 0x01, 0xE1, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x0D, 0x00, - 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x60, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFC, - 0x0D, 0x00, 0x02, 0xFF, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x0C, 0x00, - 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFB, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFC, - 0x0C, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x05, - 0x01, 0xFC, 0x0C, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF7, 0x02, 0x00, - 0x01, 0x05, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF6, - 0x02, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x0C, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x06, - 0x01, 0xFF, 0x01, 0xF9, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x0C, 0x00, - 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFC, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFB, - 0x0D, 0x00, 0x02, 0xFF, 0x01, 0x10, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFB, - 0x0D, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x80, 0x01, 0x00, 0x01, 0x05, - 0x01, 0xFB, 0x0D, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xF3, 0x01, 0x00, - 0x01, 0x05, 0x01, 0xFB, 0x0D, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xFE, - 0x01, 0x30, 0x01, 0x05, 0x01, 0xFB, 0x02, 0x00, 0x01, 0x33, 0x0A, 0x00, - 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xF9, 0x01, 0x35, 0x01, 0xFB, - 0x01, 0x02, 0x01, 0x6C, 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x2D, 0x06, 0xFF, - 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x01, 0x01, 0x9F, 0x05, 0xFF, 0x01, 0xF5, - 0x0C, 0x00, 0x01, 0x02, 0x01, 0x8D, 0x03, 0xFF, 0x01, 0xC7, 0x01, 0x20, - 0x0E, 0x00, 0x01, 0x06, 0x01, 0xFC, 0x01, 0x20, 0x10, 0x00, 0x01, 0x05, - 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, - 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, - 0x01, 0xFB, 0x57, 0x00, - - /* 22 POUND_SIGN */ - 0x9E, 0x00, 0x01, 0x6B, 0x01, 0xDF, 0x01, 0xFD, 0x01, 0xC9, 0x01, 0x40, - 0x0D, 0x00, 0x01, 0x6E, 0x05, 0xFF, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x07, - 0x06, 0xFF, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0xFE, - 0x01, 0x85, 0x01, 0x34, 0x01, 0x7B, 0x01, 0xFF, 0x01, 0x30, 0x0B, 0x00, - 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xC1, 0x03, 0x00, 0x01, 0x18, 0x01, 0x30, - 0x0A, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x01, 0x30, 0x0F, 0x00, 0x01, 0x04, - 0x01, 0xFF, 0x01, 0xFD, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xFA, - 0x10, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF8, 0x10, 0x00, 0x01, 0x09, - 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, - 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, - 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x0E, 0x00, 0x01, 0x0A, - 0x07, 0xFF, 0x01, 0xF4, 0x0A, 0x00, 0x01, 0x0A, 0x07, 0xFF, 0x01, 0xF4, - 0x0A, 0x00, 0x01, 0x08, 0x01, 0xDD, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFE, - 0x03, 0xDD, 0x01, 0xD4, 0x0C, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, - 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, - 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, - 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0xF6, 0x0E, 0x00, 0x01, 0x4B, 0x01, 0xBB, 0x01, 0xBE, - 0x01, 0xFF, 0x01, 0xFD, 0x05, 0xBB, 0x01, 0x70, 0x08, 0x00, 0x01, 0x6F, - 0x09, 0xFF, 0x01, 0xA0, 0x08, 0x00, 0x01, 0x6F, 0x09, 0xFF, 0x01, 0xA0, - 0x08, 0x00, 0x01, 0x4A, 0x09, 0xAA, 0x01, 0x60, 0xC5, 0x00, - - /* 23 CURRENCY_SIGN */ - 0xFF, 0x00, 0x0D, 0x00, 0x01, 0x30, 0x07, 0x00, 0x01, 0x01, 0x01, 0x40, - 0x08, 0x00, 0x01, 0x0B, 0x01, 0xF5, 0x07, 0x00, 0x01, 0x1D, 0x01, 0xF4, - 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x01, - 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x30, 0x07, 0x00, 0x01, 0x5F, 0x01, 0xFF, - 0x01, 0xF4, 0x01, 0x00, 0x01, 0x6B, 0x01, 0xDD, 0x01, 0xC8, 0x01, 0x20, - 0x01, 0x1D, 0x01, 0xFF, 0x01, 0xFA, 0x08, 0x00, 0x01, 0x05, 0x02, 0xFF, - 0x01, 0x8E, 0x03, 0xFF, 0x01, 0xFA, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xA0, - 0x09, 0x00, 0x01, 0x5F, 0x07, 0xFF, 0x01, 0xFA, 0x0A, 0x00, 0x01, 0x05, - 0x02, 0xFF, 0x01, 0xE9, 0x01, 0x55, 0x01, 0x7C, 0x02, 0xFF, 0x01, 0xA0, - 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFB, 0x01, 0x10, 0x02, 0x00, - 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xA0, 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, - 0x01, 0xC0, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF2, 0x0A, 0x00, - 0x01, 0x1F, 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0xDF, 0x01, 0xF7, - 0x0A, 0x00, 0x01, 0x4F, 0x01, 0xFD, 0x05, 0x00, 0x01, 0x8F, 0x01, 0xFA, - 0x0A, 0x00, 0x01, 0x6F, 0x01, 0xFC, 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFC, - 0x0A, 0x00, 0x01, 0x5F, 0x01, 0xFC, 0x05, 0x00, 0x01, 0x7F, 0x01, 0xFB, - 0x0A, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x10, 0x04, 0x00, 0x01, 0xBF, - 0x01, 0xF8, 0x0A, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0x80, 0x03, 0x00, - 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF3, 0x0A, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF5, 0x03, 0x00, 0x01, 0x1D, 0x01, 0xFF, 0x01, 0xC0, 0x0A, 0x00, - 0x01, 0x01, 0x02, 0xFF, 0x01, 0x92, 0x01, 0x00, 0x01, 0x16, 0x01, 0xEF, - 0x01, 0xFF, 0x01, 0x60, 0x0A, 0x00, 0x01, 0x1D, 0x03, 0xFF, 0x01, 0xFE, - 0x03, 0xFF, 0x01, 0xF4, 0x09, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x05, 0xFF, - 0x01, 0xFE, 0x02, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x1D, 0x01, 0xFF, - 0x01, 0xFA, 0x01, 0x06, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x81, - 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xF4, 0x08, 0x00, 0x01, 0xCF, 0x01, 0xFF, - 0x01, 0xA0, 0x01, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x20, 0x01, 0x00, - 0x01, 0x05, 0x02, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFA, - 0x07, 0x00, 0x01, 0x4F, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x05, 0x01, 0xA0, - 0x07, 0x00, 0x01, 0x05, 0x01, 0x80, 0xEB, 0x00, - - /* 24 YEN_SIGN */ - 0x98, 0x00, 0x01, 0x01, 0x01, 0x88, 0x01, 0x85, 0x07, 0x00, 0x01, 0x38, - 0x01, 0x88, 0x01, 0x40, 0x07, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x10, - 0x06, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x10, 0x07, 0x00, 0x01, 0x3F, - 0x01, 0xFF, 0x01, 0x90, 0x05, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF8, - 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF2, 0x05, 0x00, 0x01, 0x0D, - 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFA, - 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x60, 0x09, 0x00, 0x01, 0xAF, - 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0xEF, 0x01, 0xFD, 0x0A, 0x00, - 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xC0, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF5, 0x0A, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF4, 0x03, 0x00, - 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xC0, 0x0A, 0x00, 0x01, 0x01, 0x01, 0xEF, - 0x01, 0xFD, 0x03, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, - 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x50, 0x01, 0x00, 0x01, 0x02, 0x01, 0xFF, - 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xE0, 0x01, 0x00, - 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF3, 0x0C, 0x00, 0x01, 0x06, 0x01, 0xFF, - 0x01, 0xF7, 0x01, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xA0, 0x0A, 0x00, - 0x01, 0x2A, 0x02, 0xAA, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x10, 0x01, 0xBF, - 0x01, 0xFF, 0x01, 0xCA, 0x01, 0xAA, 0x01, 0xA5, 0x08, 0x00, 0x01, 0x4F, - 0x04, 0xFF, 0x01, 0x83, 0x04, 0xFF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x3C, - 0x02, 0xCC, 0x01, 0xCE, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0xFF, 0x01, 0xFC, - 0x02, 0xCC, 0x01, 0xC6, 0x0B, 0x00, 0x01, 0x03, 0x03, 0xFF, 0x01, 0x70, - 0x0F, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xFE, 0x10, 0x00, 0x01, 0x2F, - 0x01, 0xFF, 0x01, 0xF5, 0x0C, 0x00, 0x01, 0x01, 0x03, 0x11, 0x01, 0x1E, - 0x01, 0xFF, 0x01, 0xF3, 0x03, 0x11, 0x01, 0x10, 0x08, 0x00, 0x01, 0x4F, - 0x09, 0xFF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x4F, 0x09, 0xFF, 0x01, 0xF8, - 0x08, 0x00, 0x01, 0x27, 0x03, 0x77, 0x01, 0x7E, 0x01, 0xFF, 0x01, 0xF8, - 0x03, 0x77, 0x01, 0x73, 0x0C, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, - 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, - 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, - 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, - 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, - 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x08, - 0x01, 0x99, 0x01, 0x91, 0xC9, 0x00, -#endif // TOUCH_UI_UTF8_CURRENCY - -#if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) - /* 25 SUPERSCRIPT_ONE */ - 0x99, 0x00, 0x01, 0x01, 0x01, 0x36, 0x01, 0x9B, 0x01, 0xBB, 0x01, 0x20, - 0x0E, 0x00, 0x01, 0x3F, 0x03, 0xFF, 0x01, 0x20, 0x0E, 0x00, 0x01, 0x3F, - 0x01, 0xFE, 0x01, 0xBE, 0x01, 0xFF, 0x01, 0x20, 0x0E, 0x00, 0x01, 0x14, - 0x01, 0x10, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, - 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, - 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, - 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0x20, 0x0F, 0x00, 0x01, 0x11, 0x01, 0x1C, 0x01, 0xFF, - 0x01, 0x31, 0x01, 0x11, 0x0D, 0x00, 0x01, 0x0D, 0x05, 0xFF, 0x01, 0x40, - 0x0C, 0x00, 0x01, 0x0D, 0x05, 0xFF, 0x01, 0x40, 0x0C, 0x00, 0x01, 0x01, - 0x05, 0x22, 0xFF, 0x00, 0xC2, 0x00, - - /* 26 SUPERSCRIPT_TWO */ - 0x88, 0x00, 0x01, 0x01, 0x10, 0x00, 0x01, 0x16, 0x01, 0xAE, 0x01, 0xFF, - 0x01, 0xFD, 0x01, 0x92, 0x0E, 0x00, 0x05, 0xFF, 0x01, 0x60, 0x0D, 0x00, - 0x01, 0xFE, 0x01, 0x84, 0x01, 0x22, 0x01, 0x5C, 0x01, 0xFF, 0x01, 0xF3, - 0x0D, 0x00, 0x01, 0x50, 0x03, 0x00, 0x01, 0xCF, 0x01, 0xFA, 0x11, 0x00, - 0x01, 0x5F, 0x01, 0xFC, 0x11, 0x00, 0x01, 0x5F, 0x01, 0xFB, 0x11, 0x00, - 0x01, 0xCF, 0x01, 0xF4, 0x10, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x6F, 0x01, 0xFE, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x05, - 0x01, 0xFF, 0x01, 0xE2, 0x10, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0x30, - 0x0F, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xE3, 0x10, 0x00, 0x01, 0x6F, - 0x01, 0xFE, 0x01, 0x20, 0x0F, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xD1, - 0x10, 0x00, 0x01, 0xAF, 0x01, 0xFD, 0x01, 0x43, 0x03, 0x33, 0x0C, 0x00, - 0x01, 0x01, 0x06, 0xFF, 0x0C, 0x00, 0x01, 0x01, 0x06, 0xFF, 0x0D, 0x00, - 0x06, 0x22, 0xFF, 0x00, 0xC2, 0x00, - - /* 27 SUPERSCRIPT_THREE */ - 0x88, 0x00, 0x01, 0x01, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x39, 0x01, 0xCE, - 0x02, 0xFF, 0x01, 0xB5, 0x0E, 0x00, 0x01, 0x7F, 0x04, 0xFF, 0x01, 0xB0, - 0x0D, 0x00, 0x01, 0x6B, 0x01, 0x73, 0x01, 0x22, 0x01, 0x38, 0x01, 0xFF, - 0x01, 0xF9, 0x11, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x11, 0x00, 0x01, 0x0F, - 0x01, 0xFF, 0x11, 0x00, 0x01, 0x4F, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x27, - 0x01, 0xFF, 0x01, 0xF3, 0x0E, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x01, 0xFA, - 0x01, 0x20, 0x0E, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x01, 0xFB, 0x01, 0x40, - 0x0E, 0x00, 0x01, 0x01, 0x01, 0x23, 0x01, 0x49, 0x01, 0xFF, 0x01, 0xF6, - 0x11, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x10, 0x10, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x60, - 0x10, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0x40, 0x0C, 0x00, 0x01, 0xA4, - 0x02, 0x00, 0x01, 0x05, 0x01, 0xDF, 0x01, 0xFD, 0x0D, 0x00, 0x02, 0xFF, - 0x01, 0xDE, 0x02, 0xFF, 0x01, 0xE3, 0x0D, 0x00, 0x01, 0xAE, 0x03, 0xFF, - 0x01, 0xE9, 0x01, 0x10, 0x0E, 0x00, 0x01, 0x24, 0x01, 0x55, 0x01, 0x52, - 0xFF, 0x00, 0xC4, 0x00, -#endif // TOUCH_UI_UTF8_SUPERSCRIPTS - -#if ENABLED(TOUCH_UI_UTF8_ORDINALS) - /* 28 MASCULINE_ORDINAL */ - 0x89, 0x00, 0x01, 0x01, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x01, 0x01, 0x8D, - 0x02, 0xFF, 0x01, 0xB4, 0x0E, 0x00, 0x01, 0x4F, 0x04, 0xFF, 0x01, 0xA0, - 0x0C, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x63, 0x01, 0x48, - 0x01, 0xFF, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xA0, - 0x02, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x60, 0x0B, 0x00, 0x01, 0x6F, - 0x01, 0xFE, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xD0, 0x0B, 0x00, - 0x01, 0xBF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0xFF, 0x01, 0xF2, 0x0B, 0x00, - 0x01, 0xEF, 0x01, 0xF3, 0x04, 0x00, 0x01, 0xCF, 0x01, 0xF6, 0x0B, 0x00, - 0x01, 0xFF, 0x01, 0xF1, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xF7, 0x0B, 0x00, - 0x01, 0xFF, 0x01, 0xF1, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xF7, 0x0B, 0x00, - 0x01, 0xFF, 0x01, 0xF2, 0x04, 0x00, 0x01, 0xBF, 0x01, 0xF6, 0x0B, 0x00, - 0x01, 0xCF, 0x01, 0xF6, 0x04, 0x00, 0x01, 0xEF, 0x01, 0xF4, 0x0B, 0x00, - 0x01, 0x8F, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xF0, - 0x0B, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0x1D, - 0x01, 0xFF, 0x01, 0x90, 0x0B, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF8, - 0x01, 0x10, 0x01, 0x04, 0x01, 0xDF, 0x01, 0xFE, 0x01, 0x10, 0x0C, 0x00, - 0x01, 0xAF, 0x04, 0xFF, 0x01, 0xE3, 0x0D, 0x00, 0x01, 0x05, 0x01, 0xDF, - 0x02, 0xFF, 0x01, 0xFA, 0x01, 0x10, 0x0E, 0x00, 0x01, 0x02, 0x01, 0x56, - 0x01, 0x64, 0x21, 0x00, 0x01, 0x16, 0x06, 0x66, 0x01, 0x40, 0x0B, 0x00, - 0x01, 0x3F, 0x06, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x3F, 0x06, 0xFF, - 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x01, 0x06, 0x11, 0xFF, 0x00, 0x75, 0x00, - - /* 29 FEMININE_ORDINAL */ - 0x89, 0x00, 0x01, 0x12, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x49, 0x01, 0xDF, - 0x02, 0xFF, 0x01, 0xB4, 0x0D, 0x00, 0x01, 0x07, 0x05, 0xFF, 0x01, 0xA0, - 0x0C, 0x00, 0x01, 0x07, 0x01, 0xFC, 0x01, 0x74, 0x01, 0x33, 0x01, 0x59, - 0x01, 0xFF, 0x01, 0xF8, 0x0C, 0x00, 0x01, 0x03, 0x01, 0x20, 0x03, 0x00, - 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x10, 0x10, 0x00, 0x01, 0x09, 0x01, 0xFF, - 0x01, 0x50, 0x0E, 0x00, 0x01, 0x01, 0x01, 0x11, 0x01, 0x16, 0x01, 0xFF, - 0x01, 0x80, 0x0C, 0x00, 0x01, 0x05, 0x01, 0xAE, 0x04, 0xFF, 0x01, 0x90, - 0x0B, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x05, 0xFF, 0x01, 0xA0, 0x0B, 0x00, - 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xE9, 0x01, 0x65, 0x01, 0x44, 0x01, 0x48, - 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x5F, 0x01, 0xFD, 0x01, 0x10, - 0x02, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x9F, - 0x01, 0xF6, 0x03, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, - 0x01, 0xAF, 0x01, 0xF5, 0x03, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xA0, - 0x0B, 0x00, 0x01, 0x9F, 0x01, 0xFA, 0x03, 0x00, 0x01, 0xAF, 0x01, 0xFF, - 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA2, 0x01, 0x00, - 0x01, 0x3B, 0x02, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x0A, 0x04, 0xFF, - 0x01, 0xE7, 0x01, 0xFF, 0x01, 0xA0, 0x0C, 0x00, 0x01, 0x8F, 0x02, 0xFF, - 0x01, 0xF9, 0x01, 0x15, 0x01, 0xFF, 0x01, 0xA0, 0x0D, 0x00, 0x01, 0x46, - 0x01, 0x64, 0x02, 0x00, 0x01, 0x11, 0x1F, 0x00, 0x01, 0x16, 0x06, 0x66, - 0x01, 0x40, 0x0B, 0x00, 0x01, 0x3F, 0x06, 0xFF, 0x01, 0xB0, 0x0B, 0x00, - 0x01, 0x3F, 0x06, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x01, 0x06, 0x11, - 0xFF, 0x00, 0x75, 0x00, -#endif // TOUCH_UI_UTF8_ORDINALS - -#if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) - /* 30 COPYRIGHT_SIGN */ - 0xA0, 0x00, 0x01, 0x01, 0x01, 0x45, 0x01, 0x76, 0x01, 0x43, 0x0E, 0x00, - 0x01, 0x28, 0x01, 0xDF, 0x03, 0xFF, 0x01, 0xE9, 0x01, 0x40, 0x0B, 0x00, - 0x01, 0x19, 0x02, 0xFF, 0x01, 0xDB, 0x01, 0xAB, 0x01, 0xCE, 0x01, 0xFF, - 0x01, 0xFB, 0x01, 0x30, 0x09, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFB, - 0x01, 0x50, 0x03, 0x00, 0x01, 0x38, 0x01, 0xFF, 0x01, 0xF7, 0x09, 0x00, - 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, 0x01, 0x19, 0x01, 0xFF, - 0x01, 0xA0, 0x07, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xA0, 0x07, 0x00, - 0x01, 0x5F, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x3F, 0x01, 0xF8, 0x03, 0x00, - 0x01, 0x46, 0x01, 0x88, 0x01, 0x65, 0x01, 0x10, 0x01, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0x80, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xA0, 0x01, 0x00, - 0x01, 0x01, 0x01, 0x9F, 0x03, 0xFF, 0x01, 0xFC, 0x01, 0x60, 0x01, 0x00, - 0x01, 0x4F, 0x01, 0xF4, 0x05, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, - 0x01, 0x4E, 0x02, 0xFF, 0x01, 0xED, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, - 0x01, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x05, 0x00, 0x01, 0x1F, 0x01, 0xF4, - 0x01, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x61, 0x01, 0x00, - 0x01, 0x01, 0x01, 0x4A, 0x01, 0xA0, 0x02, 0x00, 0x01, 0xEF, 0x01, 0x60, - 0x04, 0x00, 0x01, 0x6F, 0x01, 0xC0, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, - 0x01, 0xC1, 0x07, 0x00, 0x01, 0x7F, 0x01, 0xB0, 0x04, 0x00, 0x01, 0xBF, - 0x01, 0x60, 0x01, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x10, 0x07, 0x00, - 0x01, 0x1F, 0x01, 0xF0, 0x04, 0x00, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x00, - 0x01, 0xDF, 0x01, 0xF9, 0x08, 0x00, 0x01, 0x0D, 0x01, 0xF4, 0x03, 0x00, - 0x01, 0x01, 0x01, 0xFE, 0x01, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF4, - 0x08, 0x00, 0x01, 0x0A, 0x01, 0xF6, 0x03, 0x00, 0x01, 0x03, 0x01, 0xFD, - 0x01, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF1, 0x08, 0x00, 0x01, 0x08, - 0x01, 0xF8, 0x03, 0x00, 0x01, 0x04, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x03, - 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, 0x01, 0x07, 0x01, 0xF9, 0x03, 0x00, - 0x01, 0x03, 0x01, 0xFD, 0x01, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF1, - 0x08, 0x00, 0x01, 0x08, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x01, 0x01, 0xFE, - 0x01, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF3, 0x08, 0x00, 0x01, 0x09, - 0x01, 0xF7, 0x04, 0x00, 0x01, 0xFF, 0x01, 0x10, 0x01, 0x00, 0x01, 0xDF, - 0x01, 0xF8, 0x08, 0x00, 0x01, 0x0C, 0x01, 0xF5, 0x04, 0x00, 0x01, 0xBF, - 0x01, 0x60, 0x01, 0x00, 0x01, 0x8F, 0x01, 0xFE, 0x01, 0x10, 0x07, 0x00, - 0x01, 0x1F, 0x01, 0xF1, 0x04, 0x00, 0x01, 0x6F, 0x01, 0xB0, 0x01, 0x00, - 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xB0, 0x07, 0x00, 0x01, 0x6F, 0x01, 0xC0, - 0x04, 0x00, 0x01, 0x1F, 0x01, 0xF4, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFF, - 0x01, 0xFD, 0x01, 0x50, 0x02, 0x00, 0x01, 0x29, 0x01, 0xA0, 0x02, 0x00, - 0x01, 0xEF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, - 0x01, 0x6F, 0x02, 0xFF, 0x01, 0xDB, 0x01, 0xCE, 0x01, 0xFF, 0x01, 0xB0, - 0x01, 0x00, 0x01, 0x07, 0x01, 0xFD, 0x05, 0x00, 0x01, 0x01, 0x01, 0xEF, - 0x01, 0x90, 0x01, 0x00, 0x01, 0x02, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xFE, - 0x01, 0x70, 0x01, 0x00, 0x01, 0x4F, 0x01, 0xF4, 0x06, 0x00, 0x01, 0x4F, - 0x01, 0xF7, 0x02, 0x00, 0x01, 0x01, 0x01, 0x58, 0x01, 0x9A, 0x01, 0x86, - 0x01, 0x30, 0x01, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0x80, 0x06, 0x00, - 0x01, 0x06, 0x01, 0xFF, 0x01, 0x90, 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFB, - 0x08, 0x00, 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, 0x01, 0x18, - 0x01, 0xFF, 0x01, 0xB0, 0x08, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFA, - 0x01, 0x40, 0x03, 0x00, 0x01, 0x27, 0x01, 0xEF, 0x01, 0xF8, 0x0A, 0x00, - 0x01, 0x19, 0x02, 0xFF, 0x01, 0xCA, 0x01, 0x9A, 0x01, 0xBE, 0x01, 0xFF, - 0x01, 0xFC, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x29, 0x01, 0xDF, 0x03, 0xFF, - 0x01, 0xFA, 0x01, 0x40, 0x0D, 0x00, 0x01, 0x02, 0x01, 0x46, 0x01, 0x76, - 0x01, 0x53, 0xC5, 0x00, - - /* 31 REGISTERED_SIGN */ - 0xA0, 0x00, 0x01, 0x02, 0x01, 0x46, 0x01, 0x76, 0x01, 0x53, 0x0E, 0x00, - 0x01, 0x28, 0x01, 0xDF, 0x03, 0xFF, 0x01, 0xEA, 0x01, 0x40, 0x0B, 0x00, - 0x01, 0x19, 0x02, 0xFF, 0x01, 0xCB, 0x01, 0x9A, 0x01, 0xCE, 0x01, 0xFF, - 0x01, 0xFC, 0x01, 0x30, 0x09, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFA, - 0x01, 0x40, 0x03, 0x00, 0x01, 0x38, 0x01, 0xFF, 0x01, 0xF8, 0x09, 0x00, - 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, 0x01, 0x18, 0x01, 0xFF, - 0x01, 0xA0, 0x07, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0x90, 0x07, 0x00, - 0x01, 0x4F, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x3F, 0x01, 0xF7, 0x01, 0x00, - 0x01, 0x13, 0x02, 0x33, 0x01, 0x32, 0x03, 0x00, 0x01, 0x02, 0x01, 0xFF, - 0x01, 0x80, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x7F, - 0x03, 0xFF, 0x01, 0xFD, 0x01, 0x81, 0x02, 0x00, 0x01, 0x4F, 0x01, 0xF5, - 0x05, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFF, - 0x01, 0xDD, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x30, 0x01, 0x00, - 0x01, 0x08, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x1F, 0x01, 0xF4, 0x02, 0x00, - 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x3C, 0x01, 0xFF, 0x01, 0xD0, - 0x02, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x6F, 0x01, 0xC0, - 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x02, 0x01, 0xFF, - 0x01, 0xF3, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xB0, 0x04, 0x00, 0x01, 0xBF, - 0x01, 0x60, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x03, 0x00, 0x01, 0xFF, - 0x01, 0xF4, 0x02, 0x00, 0x01, 0x1F, 0x01, 0xF0, 0x04, 0x00, 0x01, 0xFF, - 0x01, 0x10, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x03, 0x00, 0x01, 0xFF, - 0x01, 0xF2, 0x02, 0x00, 0x01, 0x0C, 0x01, 0xF5, 0x03, 0x00, 0x01, 0x01, - 0x01, 0xFE, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x08, - 0x01, 0xFF, 0x01, 0xE0, 0x02, 0x00, 0x01, 0x0A, 0x01, 0xF6, 0x03, 0x00, - 0x01, 0x03, 0x01, 0xFD, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFD, 0x01, 0x88, - 0x01, 0x9A, 0x01, 0xEF, 0x01, 0xFE, 0x01, 0x30, 0x02, 0x00, 0x01, 0x08, - 0x01, 0xF8, 0x03, 0x00, 0x01, 0x04, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x7F, - 0x03, 0xFF, 0x01, 0xFE, 0x01, 0x91, 0x03, 0x00, 0x01, 0x07, 0x01, 0xF9, - 0x03, 0x00, 0x01, 0x03, 0x01, 0xFD, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFC, - 0x01, 0x78, 0x01, 0xDF, 0x01, 0xFD, 0x01, 0x20, 0x03, 0x00, 0x01, 0x08, - 0x01, 0xF8, 0x03, 0x00, 0x01, 0x01, 0x01, 0xFE, 0x03, 0x00, 0x01, 0x7F, - 0x01, 0xFA, 0x01, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xC0, 0x03, 0x00, - 0x01, 0x09, 0x01, 0xF6, 0x04, 0x00, 0x01, 0xFF, 0x01, 0x10, 0x02, 0x00, - 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xF8, 0x03, 0x00, - 0x01, 0x0C, 0x01, 0xF5, 0x04, 0x00, 0x01, 0xBF, 0x01, 0x60, 0x02, 0x00, - 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x30, - 0x02, 0x00, 0x01, 0x1F, 0x01, 0xF1, 0x04, 0x00, 0x01, 0x6F, 0x01, 0xC0, - 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x09, 0x01, 0xFF, - 0x01, 0xD0, 0x02, 0x00, 0x01, 0x6F, 0x01, 0xB0, 0x04, 0x00, 0x01, 0x1F, - 0x01, 0xF4, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x01, - 0x01, 0xEF, 0x01, 0xF7, 0x02, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x04, 0x00, - 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x03, 0x00, - 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x08, 0x01, 0xFE, 0x06, 0x00, - 0x01, 0xEF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x5A, 0x01, 0xA6, 0x03, 0x00, - 0x01, 0x09, 0x01, 0xAA, 0x01, 0x60, 0x01, 0x4F, 0x01, 0xF4, 0x06, 0x00, - 0x01, 0x3F, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0x80, - 0x06, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0x90, 0x07, 0x00, 0x01, 0x4F, - 0x01, 0xFB, 0x08, 0x00, 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, - 0x01, 0x19, 0x01, 0xFF, 0x01, 0xA0, 0x08, 0x00, 0x01, 0x04, 0x01, 0xEF, - 0x01, 0xFA, 0x01, 0x40, 0x03, 0x00, 0x01, 0x38, 0x01, 0xEF, 0x01, 0xF8, - 0x0A, 0x00, 0x01, 0x19, 0x02, 0xFF, 0x01, 0xCB, 0x01, 0x9A, 0x01, 0xCE, - 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x28, 0x01, 0xDF, - 0x03, 0xFF, 0x01, 0xEA, 0x01, 0x40, 0x0D, 0x00, 0x01, 0x02, 0x01, 0x45, - 0x01, 0x76, 0x01, 0x43, 0xC5, 0x00, -#endif // TOUCH_UI_UTF8_COPYRIGHT - -#if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) - /* 32 PLUS_MINUS_SIGN */ - 0xEB, 0x00, 0x01, 0x02, 0x01, 0x77, 0x01, 0x70, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xFF, 0x01, 0xF0, 0x0B, 0x00, 0x01, 0x6A, 0x04, 0xAA, 0x01, 0xAC, - 0x01, 0xFF, 0x01, 0xFA, 0x05, 0xAA, 0x01, 0x20, 0x05, 0x00, 0x01, 0x9F, - 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, - 0x05, 0x00, 0x01, 0x7C, 0x04, 0xCC, 0x01, 0xCD, 0x01, 0xFF, 0x01, 0xFC, - 0x05, 0xCC, 0x01, 0x30, 0x0A, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, - 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, - 0x10, 0x00, 0x01, 0x03, 0x01, 0x99, 0x01, 0x90, 0x44, 0x00, 0x01, 0x9F, - 0x0C, 0xFF, 0x01, 0x30, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, - 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x47, - 0x0C, 0x77, 0x01, 0x10, 0xC1, 0x00, - - /* 33 MULTIPLICATION_SIGN */ - 0xFF, 0x00, 0x0E, 0x00, 0x01, 0x09, 0x01, 0xB0, 0x07, 0x00, 0x01, 0x03, - 0x01, 0xE4, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x3E, - 0x01, 0xFF, 0x01, 0x40, 0x06, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0xB0, 0x05, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xA0, - 0x07, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, 0x05, 0x00, 0x01, 0x3E, - 0x01, 0xFF, 0x01, 0xFB, 0x08, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0xB0, 0x03, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, - 0x09, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, 0x03, 0x00, 0x01, 0x3E, - 0x01, 0xFF, 0x01, 0xFB, 0x0A, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0xB0, 0x01, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, - 0x0B, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, 0x01, 0x00, 0x01, 0x3E, - 0x01, 0xFF, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0xB3, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x0D, 0x00, 0x01, 0x3E, - 0x03, 0xFF, 0x01, 0xFB, 0x0E, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x02, 0xFF, - 0x01, 0xB0, 0x0F, 0x00, 0x01, 0x5F, 0x02, 0xFF, 0x01, 0x10, 0x0E, 0x00, - 0x01, 0x03, 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xB0, 0x0E, 0x00, 0x01, 0x3E, - 0x03, 0xFF, 0x01, 0xFB, 0x0D, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0xB3, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0x2E, - 0x01, 0xFF, 0x01, 0xFB, 0x01, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, - 0x0B, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x01, 0x00, - 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x0A, 0x00, 0x01, 0x2E, - 0x01, 0xFF, 0x01, 0xFB, 0x03, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, - 0x09, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x03, 0x00, - 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x08, 0x00, 0x01, 0x2E, - 0x01, 0xFF, 0x01, 0xFB, 0x05, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, - 0x07, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x05, 0x00, - 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xA0, 0x07, 0x00, 0x01, 0x8F, - 0x01, 0xFB, 0x07, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0x40, 0x07, 0x00, - 0x01, 0x09, 0x01, 0xB0, 0x07, 0x00, 0x01, 0x02, 0x01, 0xE4, 0xE9, 0x00, - - /* 34 DIVISION_SIGN */ - 0xFF, 0x00, 0x25, 0x00, 0x01, 0x17, 0x01, 0x77, 0x01, 0x76, 0x10, 0x00, - 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, - 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, - 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x17, 0x01, 0x77, - 0x01, 0x76, 0x31, 0x00, 0x01, 0x24, 0x0C, 0x44, 0x01, 0x10, 0x05, 0x00, - 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, - 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, - 0x01, 0x12, 0x0C, 0x22, 0x31, 0x00, 0x01, 0x18, 0x01, 0x88, 0x01, 0x87, - 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, - 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, - 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x16, - 0x01, 0x66, 0x01, 0x65, 0xFF, 0x00, 0x01, 0x00, -#endif // TOUCH_UI_UTF8_MATHEMATICS - -#if ENABLED(TOUCH_UI_UTF8_FRACTIONS) - /* 35 FRACTION_QUARTER */ - 0x92, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x40, 0x04, 0x00, 0x01, 0x04, - 0x01, 0x79, 0x01, 0xCE, 0x01, 0xEE, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0x90, 0x04, 0x00, 0x01, 0x3F, 0x03, 0xFF, 0x01, 0x20, - 0x07, 0x00, 0x01, 0x3F, 0x01, 0xFE, 0x01, 0x10, 0x04, 0x00, 0x01, 0x3F, - 0x01, 0xDB, 0x01, 0x8D, 0x01, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0xDF, - 0x01, 0xF5, 0x05, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0B, 0x01, 0xFF, - 0x01, 0x20, 0x06, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xC0, 0x07, 0x00, - 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, 0x01, 0x1F, 0x01, 0xFF, - 0x01, 0x20, 0x07, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, - 0x01, 0xAF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, - 0x05, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE1, 0x08, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, - 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x7F, - 0x01, 0xFC, 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, - 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF2, 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, - 0x01, 0x20, 0x04, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x80, 0x09, 0x00, - 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFE, - 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0xDF, - 0x01, 0xF5, 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, - 0x01, 0x07, 0x01, 0xFF, 0x01, 0xB0, 0x04, 0x00, 0x01, 0x37, 0x01, 0x77, - 0x02, 0x00, 0x01, 0x04, 0x01, 0x55, 0x01, 0x5D, 0x01, 0xFF, 0x01, 0x75, - 0x01, 0x55, 0x01, 0x10, 0x01, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0x20, - 0x03, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x02, 0x00, 0x01, 0x0D, - 0x05, 0xFF, 0x01, 0x40, 0x01, 0x00, 0x01, 0xAF, 0x01, 0xF8, 0x04, 0x00, - 0x01, 0x0C, 0x02, 0xFF, 0x02, 0x00, 0x01, 0x0C, 0x05, 0xEE, 0x01, 0x40, - 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, 0x04, 0x00, 0x01, 0x8F, 0x01, 0xBE, - 0x01, 0xFF, 0x09, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, 0x03, 0x00, - 0x01, 0x04, 0x01, 0xFE, 0x01, 0x1E, 0x01, 0xFF, 0x09, 0x00, 0x01, 0x7F, - 0x01, 0xFC, 0x04, 0x00, 0x01, 0x1E, 0x01, 0xF4, 0x01, 0x0E, 0x01, 0xFF, - 0x08, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF2, 0x04, 0x00, 0x01, 0xBF, - 0x01, 0x80, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, - 0x01, 0x80, 0x03, 0x00, 0x01, 0x08, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x0E, - 0x01, 0xFF, 0x08, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x04, 0x00, 0x01, 0x4F, - 0x01, 0xE1, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0xDF, - 0x01, 0xF5, 0x03, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0x40, 0x01, 0x00, - 0x01, 0x0E, 0x01, 0xFF, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xB0, - 0x03, 0x00, 0x01, 0x0B, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x0E, 0x01, 0xFF, - 0x07, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x3F, - 0x01, 0xF8, 0x02, 0x88, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x88, 0x06, 0x00, - 0x01, 0xBF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x4F, 0x06, 0xFF, 0x05, 0x00, - 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, 0x04, 0x00, 0x01, 0x2A, 0x03, 0xAA, - 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xAA, 0x05, 0x00, 0x01, 0x0D, 0x01, 0xFF, - 0x01, 0x50, 0x08, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x06, 0x00, 0x01, 0x8F, - 0x01, 0xFB, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x02, - 0x01, 0xFF, 0x01, 0xF2, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, - 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x80, 0x09, 0x00, 0x01, 0x05, 0x01, 0x66, - 0xBF, 0x00, - - /* 36 FRACTION_HALF */ - 0x92, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x40, 0x04, 0x00, 0x01, 0x04, - 0x01, 0x7A, 0x01, 0xCE, 0x01, 0xEE, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0x80, 0x04, 0x00, 0x01, 0x3F, 0x03, 0xFF, 0x01, 0x20, - 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x3F, 0x01, 0xDA, - 0x01, 0x7D, 0x01, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0xDF, 0x01, 0xF5, - 0x07, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, 0x01, 0x07, - 0x01, 0xFF, 0x01, 0xC0, 0x07, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, - 0x06, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, 0x01, 0xAF, 0x01, 0xF8, 0x08, 0x00, - 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x04, 0x01, 0xFF, - 0x01, 0xE0, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, - 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, - 0x01, 0x20, 0x05, 0x00, 0x01, 0x7F, 0x01, 0xFC, 0x09, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF2, - 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, - 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, - 0x01, 0x20, 0x04, 0x00, 0x01, 0xDF, 0x01, 0xF5, 0x0A, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xB0, - 0x01, 0x00, 0x01, 0x04, 0x01, 0x8A, 0x01, 0xCC, 0x01, 0xA7, 0x01, 0x10, - 0x02, 0x00, 0x01, 0x04, 0x01, 0x55, 0x01, 0x5D, 0x01, 0xFF, 0x01, 0x75, - 0x01, 0x55, 0x01, 0x10, 0x01, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, - 0x01, 0x06, 0x04, 0xFF, 0x01, 0xF7, 0x02, 0x00, 0x01, 0x0D, 0x05, 0xFF, - 0x01, 0x40, 0x01, 0x00, 0x01, 0xBF, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x08, - 0x01, 0xFF, 0x01, 0xA7, 0x01, 0x68, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x70, - 0x01, 0x00, 0x01, 0x0B, 0x05, 0xDD, 0x01, 0x40, 0x01, 0x04, 0x01, 0xFF, - 0x01, 0xE0, 0x01, 0x00, 0x01, 0x05, 0x01, 0x60, 0x02, 0x00, 0x01, 0x08, - 0x01, 0xFF, 0x01, 0xF1, 0x08, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, - 0x06, 0x00, 0x01, 0xEF, 0x01, 0xF4, 0x08, 0x00, 0x01, 0x7F, 0x01, 0xFB, - 0x07, 0x00, 0x01, 0xCF, 0x01, 0xF3, 0x07, 0x00, 0x01, 0x02, 0x01, 0xFF, - 0x01, 0xF2, 0x06, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xE0, 0x07, 0x00, - 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x80, 0x06, 0x00, 0x01, 0x0D, 0x01, 0xFF, - 0x01, 0x50, 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x07, 0x00, 0x01, 0xAF, - 0x01, 0xFA, 0x08, 0x00, 0x01, 0xDF, 0x01, 0xF5, 0x06, 0x00, 0x01, 0x09, - 0x01, 0xFF, 0x01, 0xC0, 0x07, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xB0, - 0x06, 0x00, 0x01, 0x8F, 0x01, 0xFD, 0x01, 0x10, 0x07, 0x00, 0x01, 0x2F, - 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xC1, - 0x08, 0x00, 0x01, 0xBF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xAF, 0x01, 0xFB, - 0x08, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xE0, 0x05, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0xA0, 0x08, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, - 0x04, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x01, 0xF9, 0x09, 0x00, 0x01, 0x8F, - 0x01, 0xFB, 0x05, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFE, 0x03, 0xEE, - 0x01, 0xE6, 0x04, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF2, 0x05, 0x00, - 0x01, 0x0A, 0x05, 0xFF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0x0A, 0x01, 0xEE, - 0x01, 0x70, 0x05, 0x00, 0x01, 0x04, 0x05, 0x66, 0x01, 0x62, 0xBE, 0x00, - - /* 37 FRACTION_THREE_FOURTHS */ - 0x87, 0x00, 0x01, 0x02, 0x01, 0x34, 0x01, 0x42, 0x08, 0x00, 0x01, 0x01, - 0x01, 0x55, 0x01, 0x50, 0x04, 0x00, 0x01, 0x4C, 0x03, 0xFF, 0x01, 0xE9, - 0x01, 0x10, 0x06, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x80, 0x04, 0x00, - 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xFE, 0x02, 0xFF, 0x01, 0xE2, 0x06, 0x00, - 0x01, 0x4F, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x47, 0x01, 0x30, 0x01, 0x00, - 0x01, 0x05, 0x01, 0xEF, 0x01, 0xFB, 0x06, 0x00, 0x01, 0xDF, 0x01, 0xF5, - 0x09, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xB0, 0x09, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x2F, - 0x01, 0xFF, 0x01, 0x20, 0x09, 0x00, 0x01, 0x6F, 0x01, 0xFB, 0x05, 0x00, - 0x01, 0xBF, 0x01, 0xF8, 0x07, 0x00, 0x01, 0x03, 0x01, 0x44, 0x01, 0x5A, - 0x01, 0xFF, 0x01, 0xD1, 0x04, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, - 0x07, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x01, 0xE7, 0x05, 0x00, 0x01, 0x0D, - 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0B, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0xFE, 0x01, 0x70, 0x04, 0x00, 0x01, 0x7F, 0x01, 0xFB, 0x0A, 0x00, - 0x01, 0x16, 0x01, 0xDF, 0x01, 0xF9, 0x03, 0x00, 0x01, 0x02, 0x01, 0xFF, - 0x01, 0xF2, 0x0B, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0x20, 0x02, 0x00, - 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x80, 0x0B, 0x00, 0x01, 0x0A, 0x01, 0xFF, - 0x01, 0x60, 0x02, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x0C, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xF5, 0x0C, 0x00, - 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x30, 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF, - 0x01, 0xB0, 0x04, 0x00, 0x01, 0x47, 0x01, 0x77, 0x02, 0x00, 0x01, 0xD7, - 0x01, 0x42, 0x01, 0x01, 0x01, 0x38, 0x01, 0xEF, 0x01, 0xFC, 0x02, 0x00, - 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x02, 0x02, 0xFF, - 0x02, 0x00, 0x05, 0xFF, 0x01, 0xC1, 0x02, 0x00, 0x01, 0xBF, 0x01, 0xF8, - 0x04, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x02, 0x00, 0x01, 0x7B, 0x01, 0xEF, - 0x02, 0xFF, 0x01, 0xB6, 0x02, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, - 0x04, 0x00, 0x01, 0x9F, 0x01, 0xBE, 0x01, 0xFF, 0x04, 0x00, 0x01, 0x22, - 0x01, 0x10, 0x03, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, 0x03, 0x00, - 0x01, 0x04, 0x01, 0xFE, 0x01, 0x1E, 0x01, 0xFF, 0x09, 0x00, 0x01, 0x8F, - 0x01, 0xFB, 0x04, 0x00, 0x01, 0x1E, 0x01, 0xF3, 0x01, 0x0E, 0x01, 0xFF, - 0x08, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF2, 0x04, 0x00, 0x01, 0xCF, - 0x01, 0x70, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, - 0x01, 0x80, 0x03, 0x00, 0x01, 0x08, 0x01, 0xFB, 0x01, 0x00, 0x01, 0x0E, - 0x01, 0xFF, 0x08, 0x00, 0x01, 0x5F, 0x01, 0xFE, 0x04, 0x00, 0x01, 0x4F, - 0x01, 0xE1, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0xDF, - 0x01, 0xF4, 0x03, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0x40, 0x01, 0x00, - 0x01, 0x0E, 0x01, 0xFF, 0x07, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xB0, - 0x03, 0x00, 0x01, 0x0B, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x0E, 0x01, 0xFF, - 0x07, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x3F, - 0x01, 0xF9, 0x02, 0x99, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x99, 0x06, 0x00, - 0x01, 0xBF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x4F, 0x06, 0xFF, 0x05, 0x00, - 0x01, 0x05, 0x01, 0xFF, 0x01, 0xD0, 0x04, 0x00, 0x01, 0x29, 0x03, 0x99, - 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x99, 0x05, 0x00, 0x01, 0x0D, 0x01, 0xFF, - 0x01, 0x40, 0x08, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x06, 0x00, 0x01, 0x8F, - 0x01, 0xFB, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x02, - 0x01, 0xFF, 0x01, 0xF2, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, - 0x01, 0x0A, 0x01, 0xEE, 0x01, 0x70, 0x09, 0x00, 0x01, 0x04, 0x01, 0x55, - 0xBF, 0x00, -#endif // TOUCH_UI_UTF8_FRACTIONS - -#if ENABLED(TOUCH_UI_UTF8_SYMBOLS) - /* 38 MICRON_SIGN */ - 0xFF, 0x00, 0x1F, 0x00, 0x01, 0x02, 0x01, 0x44, 0x01, 0x40, 0x05, 0x00, - 0x01, 0x14, 0x01, 0x44, 0x01, 0x10, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, - 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, - 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, - 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, - 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF4, 0x05, 0x00, - 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF6, 0x05, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, - 0x01, 0x07, 0x01, 0xFF, 0x01, 0xFA, 0x05, 0x00, 0x01, 0xEF, 0x01, 0xFF, - 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0x20, 0x03, 0x00, - 0x01, 0x07, 0x02, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x02, 0xFF, - 0x01, 0xD2, 0x03, 0x00, 0x01, 0x6F, 0x02, 0xFF, 0x01, 0xA0, 0x08, 0x00, - 0x01, 0x07, 0x03, 0xFF, 0x01, 0xA6, 0x01, 0x55, 0x01, 0x8D, 0x03, 0xFF, - 0x01, 0xF9, 0x01, 0xA4, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF7, - 0x05, 0xFF, 0x01, 0x5D, 0x02, 0xFF, 0x01, 0xF4, 0x07, 0x00, 0x01, 0x07, - 0x01, 0xFF, 0x01, 0xF3, 0x01, 0x5F, 0x03, 0xFF, 0x01, 0xF5, 0x01, 0x06, - 0x02, 0xFF, 0x01, 0xF4, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, - 0x01, 0x01, 0x01, 0x7C, 0x01, 0xDD, 0x01, 0xC7, 0x01, 0x10, 0x01, 0x00, - 0x01, 0x6C, 0x01, 0xDB, 0x01, 0x50, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, - 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, - 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, - 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xEE, 0x01, 0xE3, 0x35, 0x00, - - /* 39 PILCROW_SIGN */ - 0x9C, 0x00, 0x01, 0x16, 0x01, 0x9B, 0x04, 0xCC, 0x01, 0xCA, 0x0B, 0x00, - 0x01, 0x19, 0x06, 0xFF, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xEF, - 0x03, 0xFF, 0x01, 0xFB, 0x01, 0xAA, 0x01, 0xAF, 0x01, 0xFD, 0x0A, 0x00, - 0x01, 0x2E, 0x04, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, - 0x0A, 0x00, 0x01, 0xBF, 0x04, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, - 0x01, 0xFD, 0x09, 0x00, 0x01, 0x03, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x08, 0x05, 0xFF, 0x01, 0xF2, - 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x0B, 0x05, 0xFF, - 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x0C, - 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, - 0x01, 0x0B, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, - 0x09, 0x00, 0x01, 0x0A, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, - 0x01, 0xFD, 0x09, 0x00, 0x01, 0x06, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0xEF, 0x04, 0xFF, 0x01, 0xF2, - 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0x6F, 0x04, 0xFF, - 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0x08, - 0x04, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x0B, 0x00, - 0x01, 0x5E, 0x03, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, - 0x0C, 0x00, 0x01, 0x6B, 0x02, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, - 0x01, 0xFD, 0x0D, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, - 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0x34, 0x01, 0x40, 0x01, 0x00, - 0x01, 0x04, 0x01, 0x43, 0x7A, 0x00, - - /* 40 BROKEN_BAR */ - 0xAD, 0x00, 0x01, 0x07, 0x01, 0x99, 0x01, 0x60, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x08, 0x01, 0xBB, 0x01, 0x70, 0x6F, 0x00, 0x01, 0x0B, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, - 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x04, - 0x01, 0x55, 0x01, 0x30, 0x47, 0x00, - - /* 41 SECTION_SIGN */ - 0x89, 0x00, 0x01, 0x35, 0x01, 0x64, 0x01, 0x31, 0x0E, 0x00, 0x01, 0x01, - 0x01, 0x9E, 0x03, 0xFF, 0x01, 0xD9, 0x01, 0x30, 0x0C, 0x00, 0x01, 0x2E, - 0x05, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xFB, - 0x01, 0x98, 0x01, 0xAE, 0x01, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x07, - 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x10, 0x02, 0x00, 0x01, 0x39, 0x01, 0xA0, - 0x0B, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0C, - 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF3, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x10, 0x00, - 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xE4, 0x10, 0x00, 0x01, 0x1D, 0x02, 0xFF, - 0x01, 0xA1, 0x0F, 0x00, 0x01, 0x4E, 0x03, 0xFF, 0x01, 0x70, 0x0D, 0x00, - 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF9, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFD, - 0x01, 0x30, 0x0C, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x60, 0x01, 0x07, - 0x02, 0xFF, 0x01, 0xF8, 0x0C, 0x00, 0x01, 0xBF, 0x01, 0xF9, 0x02, 0x00, - 0x01, 0x19, 0x02, 0xFF, 0x01, 0xC0, 0x0B, 0x00, 0x01, 0xFF, 0x01, 0xF3, - 0x03, 0x00, 0x01, 0x4E, 0x01, 0xFF, 0x01, 0xFB, 0x0A, 0x00, 0x01, 0x01, - 0x01, 0xFF, 0x01, 0xF2, 0x03, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xFF, - 0x01, 0x40, 0x09, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF7, 0x04, 0x00, - 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x90, 0x0A, 0x00, 0x01, 0xDF, 0x01, 0xFF, - 0x01, 0x20, 0x03, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xB0, 0x0A, 0x00, - 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xF5, 0x03, 0x00, 0x01, 0x08, 0x01, 0xFF, - 0x01, 0xA0, 0x0A, 0x00, 0x01, 0x0A, 0x02, 0xFF, 0x01, 0x91, 0x02, 0x00, - 0x01, 0x0C, 0x01, 0xFF, 0x01, 0x70, 0x0B, 0x00, 0x01, 0x8F, 0x01, 0xFF, - 0x01, 0xFE, 0x01, 0x60, 0x01, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x10, - 0x0B, 0x00, 0x01, 0x03, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x46, - 0x01, 0xFF, 0x01, 0xF5, 0x0D, 0x00, 0x01, 0x07, 0x04, 0xFF, 0x01, 0x50, - 0x0E, 0x00, 0x01, 0x2A, 0x02, 0xFF, 0x01, 0xF5, 0x10, 0x00, 0x01, 0x4E, - 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x20, 0x0F, 0x00, 0x01, 0x01, 0x01, 0xCF, - 0x01, 0xFF, 0x01, 0xC0, 0x10, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0xF3, - 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x05, - 0x01, 0xFF, 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x01, 0x04, 0x00, 0x01, 0x0A, - 0x01, 0xFF, 0x01, 0xF3, 0x0B, 0x00, 0x01, 0x08, 0x01, 0xE8, 0x01, 0x20, - 0x01, 0x00, 0x01, 0x01, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xE0, 0x0B, 0x00, - 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0xCB, 0x01, 0xDF, 0x02, 0xFF, - 0x01, 0x40, 0x0B, 0x00, 0x01, 0x08, 0x05, 0xFF, 0x01, 0xF5, 0x0D, 0x00, - 0x01, 0x49, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xE8, 0x01, 0x20, 0x0F, 0x00, - 0x01, 0x12, 0x01, 0x21, 0x7F, 0x00, - - /* 42 NOT_SIGN */ - 0xFF, 0x00, 0x7F, 0x00, 0x01, 0x12, 0x0C, 0x22, 0x06, 0x00, 0x01, 0x9F, - 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, - 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x24, - 0x0A, 0x44, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, - 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, - 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, - 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, - 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, - 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x17, 0x01, 0x77, 0x01, 0x10, - 0xFF, 0x00, 0x34, 0x00 -#endif // TOUCH_UI_UTF8_SYMBOLS -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py deleted file mode 100644 index a7de06d68b..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/python - -# Written By Marcio Teixeira 2019 - Aleph Objects, Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# To view a copy of the GNU General Public License, go to the following -# location: . - -from __future__ import print_function -from PIL import Image -import argparse -import textwrap - -def pack_rle(data): - """Use run-length encoding to pack the bytes""" - rle = [] - value = data[0] - count = 0 - for i in data: - if i != value or count == 255: - rle.append(count) - rle.append(value) - value = i - count = 1 - else: - count += 1 - rle.append(count) - rle.append(value) - return rle - -class WriteSource: - def __init__(self, lines_in_blocks): - self.blocks = [] - self.values = [] - self.block_size = lines_in_blocks - self.rows = 0 - - def add_pixel(self, value): - self.values.append(value) - - def convert_to_4bpp(self, data, chunk_size = 0): - # Invert the image - data = map(lambda i: 255 - i, data) - # Quanitize 8-bit values into 4-bits - data = map(lambda i: i >> 4, data) - # Make sure there is an even number of elements - if (len(data) & 1) == 1: - result.append(0) - # Combine each two adjacent values into one - i = iter(data) - data = map(lambda a, b: a << 4 | b, i ,i) - # Pack the data - data = pack_rle(data) - # Convert values into hex strings - return map(lambda a: "0x" + format(a, '02x'), data) - - def end_row(self, y): - # Pad each row into even number of values - if len(self.values) & 1: - self.values.append(0) - - self.rows += 1 - if self.block_size and (self.rows % self.block_size) == 0: - self.blocks.append(self.values) - self.values = [] - - def write(self): - if len(self.values): - self.blocks.append(self.values) - - block_strs = []; - for b in self.blocks: - data = self.convert_to_4bpp(b) - data = ', '.join(data) - data = textwrap.fill(data, 75, initial_indent = ' ', subsequent_indent = ' ') - block_strs.append(data) - - print("const unsigned char font[] PROGMEM = {") - for i, b in enumerate(block_strs): - if i: - print(',') - print('\n /* {} */'.format(i)) - print(b, end='') - print("\n};") - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Converts a grayscale bitmap into a 16-level RLE packed C array for use as font data') - parser.add_argument("input") - parser.add_argument('--char_height', help='Adds a separator every so many lines', type=int) - args = parser.parse_args() - - writer = WriteSource(args.char_height) - - img = Image.open(args.input).convert('L') - for y in range(img.height): - for x in range(img.width): - writer.add_pixel(img.getpixel((x,y))) - writer.end_row(y) - writer.write() diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h deleted file mode 100644 index 5357de3ef3..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h +++ /dev/null @@ -1,105 +0,0 @@ -/*********************** - * circular_progress.h * - ***********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/* This function draws a circular progress "ring" */ - -void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, char *text, uint32_t bgcolor, uint32_t fgcolor) { - using namespace FTDI; - - const float rim = 0.3; - const float a = percent/100.0*2.0*PI; - const float a1 = min(PI/2, a); - const float a2 = min(PI/2, a-a1); - const float a3 = min(PI/2, a-a1-a2); - const float a4 = min(PI/2, a-a1-a2-a3); - - const int ro = min(w,h) * 8; - const int rr = ro * rim; - const int cx = x * 16 + w * 8; - const int cy = y * 16 + h * 8; - - // Load a rim shape into stencil buffer - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(TAG_MASK(0)); - cmd.cmd(CLEAR(0,1,0)); - cmd.cmd(COLOR_MASK(0,0,0,0)); - cmd.cmd(STENCIL_OP(STENCIL_OP_KEEP, STENCIL_OP_INVERT)); - cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255)); - cmd.cmd(BEGIN(POINTS)); - cmd.cmd(POINT_SIZE(ro)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(POINT_SIZE(ro - rr)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(RESTORE_CONTEXT()); - - // Mask further drawing by stencil buffer - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_NOTEQUAL, 0, 255)); - - // Fill the background - cmd.cmd(COLOR_RGB(bgcolor)); - cmd.cmd(BEGIN(POINTS)); - cmd.cmd(POINT_SIZE(ro)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(COLOR_RGB(fgcolor)); - - // Paint upper-right quadrant - cmd.cmd(BEGIN(EDGE_STRIP_A)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx + ro*sin(a1) + 16,cy - ro*cos(a1) + 8)); - - // Paint lower-right quadrant - if (a > PI/2) { - cmd.cmd(BEGIN(EDGE_STRIP_R)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx + ro*cos(a2),cy + ro*sin(a2) + 16)); - } - - // Paint lower-left quadrant - if (a > PI) { - cmd.cmd(BEGIN(EDGE_STRIP_B)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx - ro*sin(a3) - 8,cy + ro*cos(a3))); - } - - // Paint upper-left quadrant - if (a > 1.5*PI) { - cmd.cmd(BEGIN(EDGE_STRIP_L)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx - ro*cos(a4),cy - ro*sin(a4))); - } - cmd.cmd(RESTORE_CONTEXT()); - - // Draw the text - - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(COLOR_RGB(fgcolor)); - cmd.text(x,y,w,h,text, OPT_CENTERX | OPT_CENTERY); - cmd.cmd(RESTORE_CONTEXT()); -} - -void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, uint32_t bgcolor, uint32_t fgcolor) { - char str[5]; - sprintf(str,"%d\%%",int(percent)); - draw_circular_progress(cmd, x, y, w, h, percent, str, bgcolor, fgcolor); -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h deleted file mode 100644 index a501de20ba..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h +++ /dev/null @@ -1,408 +0,0 @@ -/************* - * poly_ui.h * - *************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/** - * The PolyReader class iterates over an array of (x,y) pairs. - * For supporting polygons with holes an end-of-loop marker may - * be embedded into the data stream: - * - * const PROGMEM uint16_t data[] = { - * x, y, x, y, ..., eol, - * ... - * x, y, x, y, ..., eol - * } - * - * The PolyReader object can be used to iterate over the points. - * - * PolyReader r(data, N_ELEMENTS(data)); - * - * for (r.start();r.has_more(); r.next()) { - * uint16_t x = r.x; - * uint16_t y = r.y; - * - * // Do something with the point - * ... - * - * // Do something else if this point - * // closes a loop. - * if (r.end_of_loop()) { - * ... - * } - * } - */ - -class PolyReader { - public: - typedef uint16_t type_t; - - private: - static constexpr type_t eol = 0xFFFF; - - const type_t *p, *top, *end; - type_t start_x, start_y; - - void close_loop() { - x = start_x; - y = start_y; - start_x = eol; - start_y = eol; - } - - public: - type_t x, y; - - // Begin reading a polygon data structure - PolyReader(const uint16_t data[], const size_t n_elements) : top(data), end(data + n_elements) { - start(); - } - - void start() { - p = top; - start_x = eol; - next(); - } - - // Reads the next point in the polygon data structure - void next() { - if (!p) return; - - if (p == end) { - if (start_x != eol) - close_loop(); - else - p = NULL; - } - else { - x = pgm_read_word_far(p++); - if (x == eol) - close_loop(); - else { - y = pgm_read_word_far(p++); - if (start_x == eol) { - start_x = x; - start_y = y; - } - } - } - } - - bool has_more() { return p != NULL; } - bool end_of_loop() { return start_x == eol; } -}; - -/** - * The TransformedPolyReader class works like the PolyReader, - * but the (x,y) input is assumed to be normalized onto a - * unit square and then mapped to the full 16-bits, i.e. - * (0.0,1.0) => (0x0000,0xFFFE). This class will scale the - * data to fit the entire display, a bounding box, or apply - * some arbitrary affine transform. - * - * This class is suitable for reading data from "svg2cpp.py" - */ -class TransformedPolyReader : public PolyReader { - private: - /** - * Fixed point type for fast transformations, supports - * values from 0 to 1024, with 1/32 precision. - */ - static constexpr uint8_t fract_bits = 5; - typedef int16_t fix_t; - fix_t makefix(float f) { return f * (1 << fract_bits); } - - // First two rows of 3x3 transformation matrix - fix_t a, b, c; - fix_t d, e, f; - - void transform() { - /** - * Values from PolyReader vary from 0 to FFFE. - * As an approximation to dividing by FFFE, - * we perform a bit shift right by 16. - */ - const int32_t px = PolyReader::x; - const int32_t py = PolyReader::y; - const int32_t round = 1 << (fract_bits-1); - x = (((((a * px) + (b * py)) >> 16) + c) + round) >> fract_bits; - y = (((((d * px) + (e * py)) >> 16) + f) + round) >> fract_bits; - } - - void set_transform( - fix_t A, fix_t B, fix_t C, - fix_t D, fix_t E, fix_t F - ) { - a = A; b = B; c = C; - d = D; e = E; f = F; - } - - public: - typedef int16_t type_t; - - type_t x, y; - - TransformedPolyReader(const uint16_t data[], const size_t n) : PolyReader(data, n) { - scale_to_fit(); - transform(); - } - - // Set an arbitrary affine transform - void set_transform( - float A, float B, float C, - float D, float E, float F - ) { - set_transform( - makefix(A), makefix(B), makefix(C), - makefix(D), makefix(E), makefix(F) - ); - } - - // Scale the data to fit a specified bounding box - void scale_to_fit(type_t x_min, type_t y_min, type_t x_max, type_t y_max) { - fix_t sx = makefix(x_max - x_min); - fix_t sy = makefix(y_max - y_min); - fix_t tx = makefix(x_min); - fix_t ty = makefix(y_min); - set_transform( - sx, 0, tx, - 0, sy, ty - ); - } - - // Scale to fit the entire display (default) - void scale_to_fit() { - scale_to_fit(0, 0, FTDI::display_width, FTDI::display_height); - } - - void next() { - PolyReader::next(); - transform(); - } -}; - -/** - * The DeduplicatedPolyReader wraps around another PolyReader - * class to remove repeated points from the data. This could - * happen when scaling down using TransformedPolyReader, for - * example. - */ -template -class DeduplicatedPolyReader : public POLY_READER { - private: - typename POLY_READER::type_t last_x, last_y; - - static constexpr typename POLY_READER::type_t eol = 0xFFFF; - - public: - DeduplicatedPolyReader(const uint16_t data[], const size_t n) : POLY_READER(data, n) { - last_x = POLY_READER::x; - last_y = POLY_READER::y; - } - - void next() { - do { - if (!POLY_READER::has_more()) return; - POLY_READER::next(); - } while (POLY_READER::x == last_x && POLY_READER::y == last_y && !POLY_READER::end_of_loop()); - if (POLY_READER::end_of_loop()) { - last_x = last_y = eol; - } - else { - last_x = POLY_READER::x; - last_y = POLY_READER::y; - } - } -}; - -/** - * The helper class allows you to build an interface based on arbitrary - * shapes. - */ -template> -class GenericPolyUI { - private: - CommandProcessor &cmd; - - // Attributes used to paint buttons - - uint32_t btn_fill_color = 0x000000; - uint32_t btn_shadow_color = 0xF3E0E0; - uint8_t btn_shadow_depth = 5; - uint32_t btn_stroke_color = 0x000000; - uint8_t btn_stroke_width = 28; - - draw_mode_t mode; - - public: - enum ButtonStyle : uint8_t { - FILL = 1, - STROKE = 2, - SHADOW = 4, - REGULAR = 7 - }; - - typedef POLY_READER poly_reader_t; - - GenericPolyUI(CommandProcessor &c, draw_mode_t what = BOTH) : cmd(c), mode(what) {} - - // Fills a polygon with the current COLOR_RGB - void fill(poly_reader_t r, bool clip = true) { - using namespace FTDI; - int16_t x, y, w, h; - - if (clip) { - // Clipping reduces the number of pixels that are - // filled, allowing more complex shapes to be drawn - // in the alloted time. - bounds(r, x, y, w, h); - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(SCISSOR_XY(x, y)); - cmd.cmd(SCISSOR_SIZE(w, h)); - } - - Polygon p(cmd); - p.begin_fill(); - p.begin_loop(); - for (r.start();r.has_more();r.next()) { - p(r.x * 16, r.y * 16); - if (r.end_of_loop()) { - p.end_loop(); - p.begin_loop(); - } - } - p.end_loop(); - p.end_fill(); - if (clip) - cmd.cmd(RESTORE_CONTEXT()); - } - - void shadow(poly_reader_t r, uint8_t offset) { - #if FTDI_API_LEVEL >= 810 - using namespace FTDI; - cmd.cmd(VERTEX_TRANSLATE_X(offset * 16)); - cmd.cmd(VERTEX_TRANSLATE_Y(offset * 16)); - fill(r, false); - cmd.cmd(VERTEX_TRANSLATE_X(0)); - cmd.cmd(VERTEX_TRANSLATE_Y(0)); - #endif - } - - // Strokes a polygon with the current COLOR_RGB - void stroke(poly_reader_t r) { - using namespace FTDI; - Polygon p(cmd); - p.begin_stroke(); - p.begin_loop(); - for (r.start();r.has_more(); r.next()) { - p(r.x * 16, r.y * 16); - if (r.end_of_loop()) { - p.end_loop(); - p.begin_loop(); - } - } - p.end_loop(); - p.end_stroke(); - } - - // Compute the bounds of a polygon - void bounds(poly_reader_t r, int16_t &x, int16_t &y, int16_t &w, int16_t &h) { - int16_t x_min = INT16_MAX; - int16_t y_min = INT16_MAX; - int16_t x_max = INT16_MIN; - int16_t y_max = INT16_MIN; - for (r.start(); r.has_more(); r.next()) { - x_min = min(x_min, int16_t(r.x)); - x_max = max(x_max, int16_t(r.x)); - y_min = min(y_min, int16_t(r.y)); - y_max = max(y_max, int16_t(r.y)); - } - x = x_min; - y = y_min; - w = x_max - x_min; - h = y_max - y_min; - } - - /** - * Draw shaped buttons. Buttons are drawn out of a polygon which is - * filled and stroked on top of a drop shadow. The button will - * become "pushed" when touched. - */ - - void button_fill(const uint32_t color) { - btn_fill_color = color; - } - - void button_stroke(const uint32_t color, const uint8_t width) { - btn_stroke_color = color; - btn_stroke_width = width; - } - - void button_shadow(const uint32_t color, const uint8_t depth) { - btn_shadow_color = color; - btn_shadow_depth = depth; - } - - void button(const uint8_t tag, poly_reader_t r, uint8_t style = REGULAR) { - using namespace FTDI; - // Draw the shadow - #if FTDI_API_LEVEL >= 810 - if (mode & BACKGROUND && style & SHADOW) { - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(TAG(tag)); - cmd.cmd(VERTEX_TRANSLATE_X(btn_shadow_depth * 16)); - cmd.cmd(VERTEX_TRANSLATE_Y(btn_shadow_depth * 16)); - cmd.cmd(COLOR_RGB(btn_shadow_color)); - fill(r, false); - cmd.cmd(RESTORE_CONTEXT()); - } - #endif - - if (mode & FOREGROUND) { - cmd.cmd(SAVE_CONTEXT()); - #if FTDI_API_LEVEL >= 810 - if (EventLoop::get_pressed_tag() == tag) { - // "Push" the button - cmd.cmd(VERTEX_TRANSLATE_X(btn_shadow_depth * 16)); - cmd.cmd(VERTEX_TRANSLATE_Y(btn_shadow_depth * 16)); - } - #endif - // Draw the fill and stroke - cmd.cmd(TAG(tag)); - if (style & FILL) { - cmd.cmd(COLOR_RGB(btn_fill_color)); - fill(r, false); - } - if (style & STROKE) { - cmd.cmd(COLOR_RGB(btn_stroke_color)); - cmd.cmd(LINE_WIDTH(btn_stroke_width)); - stroke(r); - } - cmd.cmd(RESTORE_CONTEXT()); - } - } - - void color(const uint32_t color) { - cmd.cmd(FTDI::COLOR_RGB(color)); - } -}; - -typedef GenericPolyUI<> PolyUI; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py deleted file mode 100644 index da08014e89..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py +++ /dev/null @@ -1,280 +0,0 @@ -#!/usr/bin/python - -# Written By Marcio Teixeira 2018 - Aleph Objects, Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# To view a copy of the GNU General Public License, go to the following -# location: . - -from __future__ import print_function -import argparse, re, sys - -usage = ''' -This program extracts line segments from a SVG file and writes -them as coordinates in a C array. The x and y values will be -scaled from 0x0000 to 0xFFFE. 0xFFFF is used as path separator. - -This program can only interpret straight segments, not curves. -It also cannot handle SVG transform attributes. To convert an -SVG file into the proper format, use the following procedure: - - - Load SVG file into Inkscape - - Convert all Objects to Paths (Path -> Object to Path) - - Convert all Strokes to Paths (Path -> Stroke to Path) - - Combine all paths into one (Path -> Combine) [1] - - Convert all curves into short line segments - (Extensions -> Modify Paths -> Flatten Beziers...) - - Save as new SVG - - Convert into a header file using this utility - - To give paths individual names, break apart paths and - use the XML Editor to set the "id" attributes. - -[1] Combining paths is necessary to remove transforms. You -could also use inkscape-applytransforms Inkscape extension. - -''' - -header = ''' -/**************************************************************************** - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/** - * This file was auto-generated using "svg2cpp.py" - * - * The encoding consists of x,y pairs with the min and max scaled to - * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the - * start of a new closed path. - */ - -#pragma once -''' - -class ComputeBoundingBox: - def reset(self): - self.x_min = float(" inf") - self.y_min = float(" inf") - self.x_max = float("-inf") - self.y_max = float("-inf") - self.n_points = 0 - self.n_paths = 0 - - def command(self, type, x, y): - self.x_min = min(self.x_min, x) - self.x_max = max(self.x_max, x) - self.y_min = min(self.y_min, y) - self.y_max = max(self.y_max, y) - - if type == "M": - self.n_paths += 1 - self.n_points += 1 - - def scale(self, x, y): - x -= self.x_min - y -= self.y_min - x /= self.x_max - self.x_min - y /= self.y_max - self.y_min - #y = 1 - y # Flip upside down - return (x, y) - - def path_finished(self, id): - pass - - def write(self): - print("constexpr float x_min = %f;" % self.x_min) - print("constexpr float x_max = %f;" % self.x_max) - print("constexpr float y_min = %f;" % self.y_min) - print("constexpr float y_max = %f;" % self.y_max) - print() - - def from_svg_view_box(self, svg): - s = re.search(']+>', svg); - if s: - m = re.search('viewBox="([0-9-.]+) ([0-9-.]+) ([0-9-.]+) ([0-9-.]+)"', svg) - if m: - self.x_min = float(m.group(1)) - self.y_min = float(m.group(2)) - self.x_max = float(m.group(3)) - self.y_max = float(m.group(4)) - return True - return False - -# op -class WriteDataStructure: - def __init__(self, bounding_box): - self.bounds = bounding_box - - def reset(self, ): - self.hex_words = [] - - def push(self, value): - self.hex_words.append("0x%04X" % (0xFFFF & int(value))) - - def command(self, type, x, y): - if type == "M": - self.push(0xFFFF) - x, y = self.bounds.scale(x,y) - self.push(x * 0xFFFE) - self.push(y * 0xFFFE) - - def path_finished(self, id): - if self.hex_words and self.hex_words[0] == "0xFFFF": - self.hex_words.pop(0) - print("const PROGMEM uint16_t", id + "[] = {" + ", ".join (self.hex_words) + "};") - self.hex_words = [] - -class Parser: - def __init__(self, op): - self.op = op - self.reset() - - def reset(self): - self.last_x = 0 - self.last_y = 0 - self.initial_x = 0 - self.initial_y = 0 - - def process_svg_path_L_or_M(self, cmd, x, y): - self.op.command(cmd, x, y) - self.last_x = x - self.last_y = y - if cmd == "M": - self.initial_x = x - self.initial_y = y - - def process_svg_path_data_cmd(self, id, cmd, a, b): - """Converts the various types of moves into L or M commands - and dispatches to process_svg_path_L_or_M for futher processing.""" - if cmd == "Z" or cmd == "z": - self.process_svg_path_L_or_M("L", self.initial_x, self.initial_y) - elif cmd == "H": - self.process_svg_path_L_or_M("L", a, self.last_y) - elif cmd == "V": - self.process_svg_path_L_or_M("L", self.last_x, a) - elif cmd == "h": - self.process_svg_path_L_or_M("L", self.last_x + a, self.last_y) - elif cmd == "v": - self.process_svg_path_L_or_M("L", self.last_x, self.last_y + a) - elif cmd == "L": - self.process_svg_path_L_or_M("L", a, b) - elif cmd == "l": - self.process_svg_path_L_or_M("L", self.last_x + a, self.last_y + b) - elif cmd == "M": - self.process_svg_path_L_or_M("M", a, b) - elif cmd == "m": - self.process_svg_path_L_or_M("M", self.last_x + a, self.last_y + b) - else: - print("Unsupported path data command:", cmd, "in path", id, "\n", file=sys.stderr) - quit() - - def eat_token(self, regex): - """Looks for a token at the start of self.d. - If found, the token is removed.""" - self.m = re.match(regex,self.d) - if self.m: - self.d = self.d[self.m.end():] - return self.m - - def process_svg_path_data(self, id, d): - """Breaks up the "d" attribute into individual commands - and calls "process_svg_path_data_cmd" for each""" - - self.d = d - while (self.d): - if self.eat_token('\s+'): - pass # Just eat the spaces - - elif self.eat_token('([LMHVZlmhvz])'): - cmd = self.m.group(1) - # The following commands take no arguments - if cmd == "Z" or cmd == "z": - self.process_svg_path_data_cmd(id, cmd, 0, 0) - - elif self.eat_token('([CScsQqTtAa])'): - print("Unsupported path data command:", self.m.group(1), "in path", id, "\n", file=sys.stderr) - quit() - - elif self.eat_token('([ ,]*[-0-9e.]+)+'): - # Process list of coordinates following command - coords = re.split('[ ,]+', self.m.group(0)) - # The following commands take two arguments - if cmd == "L" or cmd == "l": - while coords: - self.process_svg_path_data_cmd(id, cmd, float(coords.pop(0)), float(coords.pop(0))) - elif cmd == "M": - while coords: - self.process_svg_path_data_cmd(id, cmd, float(coords.pop(0)), float(coords.pop(0))) - # If a MOVETO has multiple points, the subsequent ones are assumed to be LINETO - cmd = "L" - elif cmd == "m": - while coords: - self.process_svg_path_data_cmd(id, cmd, float(coords.pop(0)), float(coords.pop(0))) - # If a MOVETO has multiple points, the subsequent ones are assumed to be LINETO - cmd = "l" - # Assume all other commands are single argument - else: - while coords: - self.process_svg_path_data_cmd(id, cmd, float(coords.pop(0)), 0) - else: - print("Syntax error:", d, "in path", id, "\n", file=sys.stderr) - quit() - - def process_svg_paths(self, svg): - self.op.reset() - for path in re.findall(']+>', svg): - id = "" - m = re.search(' id="(.*)"', path) - if m: - id = m.group(1) - - m = re.search(' transform="(.*)"', path) - if m: - print("Found transform in path", id, "! Cannot process file!", file=sys.stderr) - quit() - - m = re.search(' d="(.*)"', path) - if m: - self.process_svg_path_data(id, m.group(1)) - self.op.path_finished(id) - self.reset() - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("filename") - args = parser.parse_args() - - f = open(args.filename, "r") - data = f.read() - - print(header) - - b = ComputeBoundingBox() - if not b.from_svg_view_box(data): - # Can't find the view box, so use the bounding box of the elements themselves. - p = Parser(b) - p.process_svg_paths(data) - b.write() - - w = WriteDataStructure(b) - p = Parser(w) - p.process_svg_paths(data) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h deleted file mode 100644 index 5c1a74f66e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h +++ /dev/null @@ -1,27 +0,0 @@ -/****************** - * ftdi_eve_lib.h * - ******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2019 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "compat.h" -#include "basic/ftdi_basic.h" -#include "extended/ftdi_extended.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp deleted file mode 100644 index 912c95731d..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/**************** - * language.cpp * - ****************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - - -#include "../../../../../MarlinCore.h" - -#include "language.h" - -uint8_t lang = 0; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h deleted file mode 100644 index 873e84455a..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h +++ /dev/null @@ -1,23 +0,0 @@ -/************** - * language.h * - **************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ -#pragma once - -#include "language_en.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h deleted file mode 100644 index cc96c8b9cd..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ /dev/null @@ -1,170 +0,0 @@ -/***************** - * language_en.h * - *****************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "language.h" - -#if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) - #define COPYRIGHT_SIGN u8"©" -#else - #define COPYRIGHT_SIGN u8"(c)" -#endif - -#if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) - #define SUPERSCRIPT_TWO u8"²" -#else - #define SUPERSCRIPT_TWO u8"^2" -#endif - -#if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET) - #define DEGREE_SIGN u8"°" -#else - #define DEGREE_SIGN u8" " -#endif - -namespace Language_en { - PROGMEM Language_Str MSG_BUTTON_OKAY = u8"Okay"; - PROGMEM Language_Str MSG_BUTTON_MENU = u8"Menu"; - PROGMEM Language_Str MSG_BUTTON_MEDIA = u8"Media"; - PROGMEM Language_Str MSG_BUTTON_OPEN = u8"Open"; - PROGMEM Language_Str MSG_CLEAN_NOZZLE = u8"Clean Nozzle"; - PROGMEM Language_Str MSG_VMAX_X = u8"Vmax X"; - PROGMEM Language_Str MSG_VMAX_Y = u8"Vmax Y"; - PROGMEM Language_Str MSG_VMAX_Z = u8"Vmax Z"; - PROGMEM Language_Str MSG_ACCEL_PRINTING = u8"Printing"; - PROGMEM Language_Str MSG_ACCEL_TRAVEL = u8"Travel"; - PROGMEM Language_Str MSG_ACCEL_RETRACT = u8"Retraction"; - PROGMEM Language_Str MSG_AMAX_X = u8"Amax X"; - PROGMEM Language_Str MSG_AMAX_Y = u8"Amax Y"; - PROGMEM Language_Str MSG_AMAX_Z = u8"Amax Z"; - PROGMEM Language_Str MSG_AXIS_X = u8"X"; - PROGMEM Language_Str MSG_AXIS_X2 = u8"X2"; - PROGMEM Language_Str MSG_AXIS_Y = u8"Y"; - PROGMEM Language_Str MSG_AXIS_Y2 = u8"Y2"; - PROGMEM Language_Str MSG_AXIS_Z = u8"Z"; - PROGMEM Language_Str MSG_AXIS_Z2 = u8"Z2"; - PROGMEM Language_Str MSG_AXIS_E = u8"E"; - PROGMEM Language_Str MSG_AXIS_E1 = u8"E1"; - PROGMEM Language_Str MSG_AXIS_E2 = u8"E2"; - PROGMEM Language_Str MSG_AXIS_E3 = u8"E3"; - PROGMEM Language_Str MSG_AXIS_E4 = u8"E4"; - PROGMEM Language_Str MSG_AXIS_ALL = u8"All"; - PROGMEM Language_Str MSG_HOME = u8"Home"; - PROGMEM Language_Str MSG_PRINT_STARTING = u8"Print starting"; - PROGMEM Language_Str MSG_PRINT_FINISHED = u8"Print finished"; - PROGMEM Language_Str MSG_PRINT_ERROR = u8"Print error"; - PROGMEM Language_Str MSG_ABOUT_TOUCH_PANEL_1 = u8"Color Touch Panel"; - PROGMEM Language_Str MSG_ABOUT_TOUCH_PANEL_2 = WEBSITE_URL; - PROGMEM Language_Str MSG_LICENSE = u8"This program is free software: you can redistribute it and/or modify it under the terms of " - "the GNU General Public License as published by the Free Software Foundation, either version 3 " - "of the License, or (at your option) any later version.\n\nTo view a copy of the GNU General " - "Public License, go to the following location: https://www.gnu.org/licenses."; - PROGMEM Language_Str MSG_RUNOUT_1 = u8"Runout 1"; - PROGMEM Language_Str MSG_RUNOUT_2 = u8"Runout 2"; - PROGMEM Language_Str MSG_DISPLAY_MENU = u8"Display"; - PROGMEM Language_Str MSG_INTERFACE = u8"Interface"; - PROGMEM Language_Str MSG_MEASURE_AUTOMATICALLY = u8"Measure automatically"; - PROGMEM Language_Str MSG_H_OFFSET = u8"H Offset"; - PROGMEM Language_Str MSG_V_OFFSET = u8"V Offset"; - PROGMEM Language_Str MSG_TOUCH_SCREEN = u8"Touch Screen"; - PROGMEM Language_Str MSG_CALIBRATE = u8"Calibrate"; - PROGMEM Language_Str MSG_UNITS_MILLIAMP = u8"mA"; - PROGMEM Language_Str MSG_UNITS_MM = u8"mm"; - PROGMEM Language_Str MSG_UNITS_MM_S = u8"mm/s"; - PROGMEM Language_Str MSG_UNITS_MM_S2 = u8"mm/s" SUPERSCRIPT_TWO; - PROGMEM Language_Str MSG_UNITS_STEP_MM = u8"st/mm"; - PROGMEM Language_Str MSG_UNITS_PERCENT = u8"%"; - PROGMEM Language_Str MSG_UNITS_C = DEGREE_SIGN u8"C"; - PROGMEM Language_Str MSG_IDLE = u8"idle"; - PROGMEM Language_Str MSG_SET_MAXIMUM = u8"Set Maximum"; - PROGMEM Language_Str MSG_PRINT_SPEED = u8"Print Speed"; - PROGMEM Language_Str MSG_LINEAR_ADVANCE = u8"Linear Advance"; - PROGMEM Language_Str MSG_LINEAR_ADVANCE_K = u8"K"; - PROGMEM Language_Str MSG_LINEAR_ADVANCE_K1 = u8"K E1"; - PROGMEM Language_Str MSG_LINEAR_ADVANCE_K2 = u8"K E2"; - PROGMEM Language_Str MSG_LINEAR_ADVANCE_K3 = u8"K E3"; - PROGMEM Language_Str MSG_LINEAR_ADVANCE_K4 = u8"K E4"; - PROGMEM Language_Str MSG_NUDGE_NOZZLE = u8"Nudge Nozzle"; - PROGMEM Language_Str MSG_ADJUST_BOTH_NOZZLES = u8"Adjust Both Nozzles"; - PROGMEM Language_Str MSG_SHOW_OFFSETS = u8"Show Offsets"; - PROGMEM Language_Str MSG_INCREMENT = u8"Increment"; - PROGMEM Language_Str MSG_ERASE_FLASH_WARNING = u8"Are you sure? SPI flash will be erased."; - PROGMEM Language_Str MSG_ERASING = u8"Erasing..."; - PROGMEM Language_Str MSG_ERASED = u8"SPI flash erased"; - PROGMEM Language_Str MSG_CALIBRATION_WARNING = u8"For best results, unload the filament and clean the hotend prior to starting calibration. Continue?"; - PROGMEM Language_Str MSG_START_PRINT_CONFIRMATION = u8"Start printing %s?"; - PROGMEM Language_Str MSG_ABORT_WARNING = u8"Are you sure you want to cancel the print?"; - PROGMEM Language_Str MSG_EXTRUDER_SELECTION = u8"Extruder Selection"; - PROGMEM Language_Str MSG_CURRENT_TEMPERATURE = u8"Current Temp"; - PROGMEM Language_Str MSG_REMOVAL_TEMPERATURE = u8"Removal Temp"; - PROGMEM Language_Str MSG_CAUTION = u8"Caution:"; - PROGMEM Language_Str MSG_HOT = u8"Hot!"; - PROGMEM Language_Str MSG_UNLOAD_FILAMENT = u8"Unload/Retract"; - PROGMEM Language_Str MSG_LOAD_FILAMENT = u8"Load/Extruder"; - PROGMEM Language_Str MSG_MOMENTARY = u8"Momentary"; - PROGMEM Language_Str MSG_CONTINUOUS = u8"Continuous"; - PROGMEM Language_Str MSG_PLEASE_WAIT = u8"Please wait..."; - PROGMEM Language_Str MSG_PRINT_MENU = u8"Print Menu"; - PROGMEM Language_Str MSG_FINE_MOTION = u8"Fine motion"; - PROGMEM Language_Str MSG_ENABLE_MEDIA = u8"Enable Media"; - PROGMEM Language_Str MSG_INSERT_MEDIA = u8"Insert Media..."; - PROGMEM Language_Str MSG_LCD_BRIGHTNESS = u8"LCD brightness"; - PROGMEM Language_Str MSG_SOUND_VOLUME = u8"Sound volume"; - PROGMEM Language_Str MSG_SCREEN_LOCK = u8"Screen lock"; - PROGMEM Language_Str MSG_BOOT_SCREEN = u8"Boot screen"; - PROGMEM Language_Str MSG_SOUNDS = u8"Sounds"; - PROGMEM Language_Str MSG_CLICK_SOUNDS = u8"Click sounds"; - PROGMEM Language_Str MSG_EEPROM_RESTORED = u8"Settings restored from backup"; - PROGMEM Language_Str MSG_EEPROM_RESET = u8"Settings restored to default"; - PROGMEM Language_Str MSG_EEPROM_SAVED = u8"Settings saved!"; - PROGMEM Language_Str MSG_EEPROM_SAVE_PROMPT = u8"Do you wish to save these settings as defaults?"; - PROGMEM Language_Str MSG_EEPROM_RESET_WARNING = u8"Are you sure? Customizations will be lost."; - - PROGMEM Language_Str MSG_PASSCODE_REJECTED = u8"Wrong passcode!"; - PROGMEM Language_Str MSG_PASSCODE_ACCEPTED = u8"Passcode accepted!"; - PROGMEM Language_Str MSG_PASSCODE_SELECT = u8"Select Passcode:"; - PROGMEM Language_Str MSG_PASSCODE_REQUEST = u8"Enter Passcode:"; - - PROGMEM Language_Str MSG_TOUCH_CALIBRATION_START = u8"Release to begin screen calibration"; - PROGMEM Language_Str MSG_TOUCH_CALIBRATION_PROMPT = u8"Touch the dots to calibrate"; - PROGMEM Language_Str MSG_AUTOLEVEL_X_AXIS = u8"Level X Axis"; - PROGMEM Language_Str MSG_BED_MAPPING_DONE = u8"Bed mapping finished"; - PROGMEM Language_Str MSG_BED_MAPPING_INCOMPLETE = u8"Not all points probed"; - PROGMEM Language_Str MSG_LEVELING = u8"Leveling"; - PROGMEM Language_Str MSG_SHOW_MESH = u8"Show Bed Mesh"; - - #ifdef TOUCH_UI_LULZBOT_BIO - PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home"; - PROGMEM Language_Str MSG_RAISE_PLUNGER = u8"Raise Plunger"; - PROGMEM Language_Str MSG_RELEASE_XY_AXIS = u8"Release X and Y Axis"; - PROGMEM Language_Str MSG_BED_TEMPERATURE = u8"Bed Temperature"; - PROGMEM Language_Str MSG_HOME_XYZ_WARNING = u8"About to move to home position. Ensure the top and the bed of the printer are clear.\n\nContinue?"; - PROGMEM Language_Str MSG_HOME_E_WARNING = u8"About to re-home plunger and auto-level. Remove syringe prior to proceeding.\n\nContinue?"; - #endif - - #ifdef TOUCH_UI_COCOA_PRESS - PROGMEM Language_Str MSG_ZONE_1 = u8"Zone 1:"; - PROGMEM Language_Str MSG_ZONE_2 = u8"Zone 2:"; - PROGMEM Language_Str MSG_ZONE_3 = u8"Zone 3:"; - PROGMEM Language_Str MSG_PREHEAT_FINISHED = u8"Preheat finished"; - #endif -}; // namespace Language_en diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp deleted file mode 100644 index fe68faefee..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/********************* - * marlin_events.cpp * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "compat.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens/screens.h" - -namespace ExtUI { - using namespace Theme; - using namespace FTDI; - - void onStartup() { - EventLoop::setup(); - } - - void onIdle() { - EventLoop::loop(); - } - - void onPrinterKilled(PGM_P const error, PGM_P const component) { - char str[strlen_P(error) + strlen_P(component) + 3]; - sprintf_P(str, PSTR(S_FMT ": " S_FMT), error, component); - KillScreen::show(str); - } - - void onMediaInserted() { - if (AT_SCREEN(StatusScreen)) - StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_INSERTED)); - sound.play(media_inserted, PLAY_ASYNCHRONOUS); - } - - void onMediaRemoved() { - if (isPrintingFromMedia()) { - stopPrint(); - InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED); - } - else - sound.play(media_removed, PLAY_ASYNCHRONOUS); - - if (AT_SCREEN(StatusScreen) || isPrintingFromMedia()) - StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_REMOVED)); - - #if ENABLED(SDSUPPORT) - if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen); - #endif - } - - void onMediaError() { - sound.play(sad_trombone, PLAY_ASYNCHRONOUS); - AlertDialogBox::showError(F("Unable to read media.")); - } - - void onStatusChanged(const char* lcd_msg) { - StatusScreen::setStatusMessage(lcd_msg); - } - - void onStatusChanged(progmem_str lcd_msg) { - StatusScreen::setStatusMessage(lcd_msg); - } - - void onPrintTimerStarted() { - InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_STARTED); - } - - void onPrintTimerStopped() { - InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FINISHED); - } - - void onPrintTimerPaused() { - } - - void onFilamentRunout(const extruder_t extruder) { - char lcd_msg[30]; - sprintf_P(lcd_msg, PSTR("Extruder %d Filament Error"), extruder + 1); - StatusScreen::setStatusMessage(lcd_msg); - InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED, FTDI::PLAY_SYNCHRONOUS); - } - - void onFactoryReset() { - InterfaceSettingsScreen::defaultSettings(); - } - - void onStoreSettings(char *buff) { - InterfaceSettingsScreen::saveSettings(buff); - } - - void onLoadSettings(const char *buff) { - InterfaceSettingsScreen::loadSettings(buff); - } - - void onConfigurationStoreWritten(bool success) { - #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE - if (success && InterfaceSettingsScreen::backupEEPROM()) { - SERIAL_ECHOLNPGM("Made backup of EEPROM to SPI Flash"); - } - #else - UNUSED(success); - #endif - } - - void onConfigurationStoreRead(bool) { - } - - void onPlayTone(const uint16_t frequency, const uint16_t duration) { - sound.play_tone(frequency, duration); - } - - void onUserConfirmRequired(const char * const msg) { - if (msg) - ConfirmUserRequestAlertBox::show(msg); - else - ConfirmUserRequestAlertBox::hide(); - } - - #if HAS_LEVELING && HAS_MESH - void onMeshUpdate(const int8_t x, const int8_t y, const float val) { - BedMeshScreen::onMeshUpdate(x, y, val); - } - - void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { - BedMeshScreen::onMeshUpdate(x, y, state); - } - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - void onPowerLossResume() { - // Called on resume from power-loss - } - #endif - - #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { - // Called for temperature PID tuning result - //SERIAL_ECHOLNPAIR("OnPidTuning:", rst); - switch (rst) { - case PID_BAD_EXTRUDER_NUM: - StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_BAD_EXTRUDER_NUM)); - break; - case PID_TEMP_TOO_HIGH: - StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH)); - break; - case PID_TUNING_TIMEOUT: - StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_TIMEOUT)); - break; - case PID_DONE: - StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE_DONE)); - break; - } - GOTO_SCREEN(StatusScreen); - } - #endif // HAS_PID_HEATING -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h deleted file mode 100644 index 5ad84c60b0..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h +++ /dev/null @@ -1,144 +0,0 @@ -/****************** - * pin_mappings.h * - ******************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/* This file defines mappings from the ULTRA_LCD pins functions to new - * functions for the FTDI display. These mappings allows any board that - * support ULTRA_LCD via EXP1 and EXP2 connectors to use FTDI modules - * without adding new pin definitions to the board. - */ - -#include "../../../../inc/MarlinConfig.h" - -#if ENABLED(F6_TFT_PINMAP) // FYSETC F6 - ATmega2560 - - #define CLCD_SPI_CS 33 - #define CLCD_MOD_RESET 31 - -#elif ENABLED(S6_TFT_PINMAP) // FYSETC S6 - STM32F4 - - #define CLCD_SPI_CS PC7 - #define CLCD_MOD_RESET PC6 - -#elif ENABLED(CR10_TFT_PINMAP) // FYSETC S6 - STM32F4 - with TOUCH_UI_ULTIPANEL - - #define CLCD_USE_SOFT_SPI - #define CLCD_SOFT_SPI_SCLK LCD_PINS_D4 // PORTA1 Pin 6 - #define CLCD_SOFT_SPI_MOSI LCD_PINS_ENABLE // PORTC1 Pin 8 - #define CLCD_SPI_CS LCD_PINS_RS // PORTA3 Pin 7 - #define CLCD_SOFT_SPI_MISO 16 // PORTC0 BTN_ENC Pin 2 - #define CLCD_MOD_RESET 11 // PORTD3 BTN_EN1 Pin 3 - #define CLCD_AUX_0 10 // PORTD2 BTN_EN2 Pin 5 - #define CLCD_AUX_1 BEEPER_PIN // PORTA4 Pin 1 - -#elif ENABLED(AO_EXP1_DEPRECATED_PINMAP) - - /** - * This AlephObjects pinout re-purposes the UltraLCD - * connector EXP1 for Software SPI (rev B, obsolete) - */ - - #define CLCD_MOD_RESET LCD_PINS_D4 - #define CLCD_SPI_CS LCD_PINS_D5 - - #define CLCD_AUX_0 LCD_PINS_ENABLE - #define CLCD_AUX_1 BTN_ENC - #define CLCD_AUX_2 BEEPER_PIN - - #define CLCD_USE_SOFT_SPI - #define CLCD_SOFT_SPI_SCLK LCD_PINS_D7 - #define CLCD_SOFT_SPI_MOSI LCD_PINS_D6 - #define CLCD_SOFT_SPI_MISO LCD_PINS_RS - -#elif ENABLED(AO_EXP1_PINMAP) - - /** - * AO_EXP1_PINMAP with TOUCH_UI_ULTIPANEL - * - * This AlephObjects mapping re-purposes the UltraLCD - * connector EXP1 for Software SPI for display (rev C): - * - * EXP2: FTDI: SD -or- USB [1]: ULTRA_LCD: - * 1 MISO MISO MISO --> BEEPER - * 2 SCLK SCLK SCLK --> BTN_ENC - * 3 PD_N - - --> LCDE - * 4 - CS_N CS_N --> LCDRS - * 5 CS_N - - --> LCD4 - * 6 MOSI MOSI MOSI --> LCD5 - * 7 - SD_DET INT --> LCD6 - * 8 RESET - RESET --> LCD4 - * 9 GND GND GND --> GND - * 10 5V 5V 5V --> 5V - * - * [1] At the moment, Marlin does not support SD or USB - * functionality over software SPI. - */ - - #define CLCD_MOD_RESET LCD_PINS_ENABLE - #define CLCD_SPI_CS LCD_PINS_D4 - - #define CLCD_USE_SOFT_SPI - #define CLCD_SOFT_SPI_SCLK BTN_ENC - #define CLCD_SOFT_SPI_MOSI LCD_PINS_D5 - #define CLCD_SOFT_SPI_MISO BEEPER_PIN - -#elif ENABLED(AO_EXP2_PINMAP) - - /** - * AO_EXP2_PINMAP with TOUCH_UI_ULTIPANEL - * - * The AlephObjects mapping for re-purposing the UltraLCD - * connector EXP2 for hardware SPI for display and SD card - * or USB (rev C): - * - * EXP2: FTDI: SD -or- USB: ULTRA_LCD: - * 1 MISO MISO MISO --> MISO - * 2 SCLK SCLK SCLK --> SCLK - * 3 PD_N - - --> BTN_EN2 - * 4 - CS_N CS_N --> SD_CSEL - * 5 CS_N - - --> BTN_EN1 - * 6 MOSI MOSI MOSI --> MOSI - * 7 - SD_DET INT --> SD_DET - * 8 RESET - RESET --> RESET - * 9 GND GND GND --> GND - * 10 5V 5V 5V --> KILL [3] - * - * [1] This configuration allows daisy-chaining of the - * display and SD/USB on EXP2, except for [2] - * - * [2] The Ultimachine Einsy boards have a level shifter - * on MISO enabled by SD_CSEL chip select, hence it - * is not possible to run both the display and the - * SD/USB on EXP2. - * - * [3] Archim Rambo provides 5V on this pin. On any other - * board, divert this wire from the ribbon cable and - * connect it to 5V at an endstop. - */ - - #define CLCD_SPI_CS BTN_EN1 - #define CLCD_MOD_RESET BTN_EN2 - #if MB(EINSY_RAMBO, EINSY_RETRO) && DISABLED(SDSUPPORT) - #define CLCD_SPI_EXTRA_CS SDSS - #endif - -#endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp deleted file mode 100644 index 9cd17637bd..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/******************** - * about_screen.cpp * - ********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -#define GRID_COLS 4 -#define GRID_ROWS 7 - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -void AboutScreen::onEntry() { - BaseScreen::onEntry(); - sound.play(chimes, PLAY_ASYNCHRONOUS); -} - -void AboutScreen::onRedraw(draw_mode_t) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0); - - #define HEADING_POS BTN_POS(1,2), BTN_SIZE(4,1) - #define FW_VERS_POS BTN_POS(1,3), BTN_SIZE(4,1) - #define FW_INFO_POS BTN_POS(1,4), BTN_SIZE(4,1) - #define LICENSE_POS BTN_POS(1,5), BTN_SIZE(4,2) - #define STATS_POS BTN_POS(1,7), BTN_SIZE(2,1) - #define BACK_POS BTN_POS(3,7), BTN_SIZE(2,1) - - #define _INSET_POS(x,y,w,h) x + w/10, y, w - w/5, h - #define INSET_POS(pos) _INSET_POS(pos) - - char about_str[1 - + strlen_P(GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2)) - #ifdef TOOLHEAD_NAME - + strlen_P(TOOLHEAD_NAME) - #endif - ]; - #ifdef TOOLHEAD_NAME - // If MSG_ABOUT_TOUCH_PANEL_2 has %s, substitute in the toolhead name. - // But this is optional, so squelch the compiler warning here. - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wformat-extra-args" - sprintf_P(about_str, GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2), TOOLHEAD_NAME); - #pragma GCC diagnostic pop - #else - strcpy_P(about_str, GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2)); - #endif - - draw_text_box(cmd, HEADING_POS, - #ifdef CUSTOM_MACHINE_NAME - F(CUSTOM_MACHINE_NAME) - #else - GET_TEXT_F(MSG_ABOUT_TOUCH_PANEL_1) - #endif - , OPT_CENTER, font_xlarge - ); - cmd.tag(3); - draw_text_box(cmd, FW_VERS_POS, - #ifdef TOUCH_UI_VERSION - F(TOUCH_UI_VERSION) - #else - progmem_str(getFirmwareName_str()) - #endif - , OPT_CENTER, font_medium); - cmd.tag(0); - draw_text_box(cmd, FW_INFO_POS, about_str, OPT_CENTER, font_medium); - draw_text_box(cmd, INSET_POS(LICENSE_POS), GET_TEXT_F(MSG_LICENSE), OPT_CENTER, font_tiny); - - cmd.font(font_medium) - .colors(normal_btn) - .tag(2).button(STATS_POS, GET_TEXT_F(MSG_INFO_STATS_MENU)) - .colors(action_btn) - .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); -} - -bool AboutScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - #if ENABLED(PRINTCOUNTER) - case 2: GOTO_SCREEN(StatisticsScreen); break; - #endif - #if ENABLED(TOUCH_UI_DEVELOPER_MENU) - case 3: GOTO_SCREEN(DeveloperMenu); break; - #endif - default: return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp deleted file mode 100644 index cfb268f0b4..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/***************************** - * advance_settings_menu.cpp * - *****************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && !defined(TOUCH_UI_LULZBOT_BIO) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)); - } - - #ifdef TOUCH_UI_PORTRAIT - #if EITHER(HAS_MULTI_HOTEND, SENSORLESS_HOMING) - #define GRID_ROWS 9 - #else - #define GRID_ROWS 8 - #endif - #define GRID_COLS 2 - #define RESTORE_DEFAULTS_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define DISPLAY_POS BTN_POS(1,2), BTN_SIZE(1,1) - #define INTERFACE_POS BTN_POS(2,2), BTN_SIZE(1,1) - #define ZPROBE_ZOFFSET_POS BTN_POS(1,3), BTN_SIZE(1,1) - #define STEPS_PER_MM_POS BTN_POS(2,3), BTN_SIZE(1,1) - #define FILAMENT_POS BTN_POS(1,4), BTN_SIZE(1,1) - #define VELOCITY_POS BTN_POS(2,4), BTN_SIZE(1,1) - #define TMC_CURRENT_POS BTN_POS(1,5), BTN_SIZE(1,1) - #define ACCELERATION_POS BTN_POS(2,5), BTN_SIZE(1,1) - #define ENDSTOPS_POS BTN_POS(1,6), BTN_SIZE(1,1) - #define JERK_POS BTN_POS(2,6), BTN_SIZE(1,1) - #define CASE_LIGHT_POS BTN_POS(1,7), BTN_SIZE(1,1) - #define BACKLASH_POS BTN_POS(2,7), BTN_SIZE(1,1) - #define OFFSETS_POS BTN_POS(1,8), BTN_SIZE(1,1) - #define TMC_HOMING_THRS_POS BTN_POS(2,8), BTN_SIZE(1,1) - #if EITHER(HAS_MULTI_HOTEND, SENSORLESS_HOMING) - #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) - #else - #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) - #endif - #else - #define GRID_ROWS 6 - #define GRID_COLS 3 - #define ZPROBE_ZOFFSET_POS BTN_POS(1,1), BTN_SIZE(1,1) - #define CASE_LIGHT_POS BTN_POS(1,4), BTN_SIZE(1,1) - #define STEPS_PER_MM_POS BTN_POS(2,1), BTN_SIZE(1,1) - #define TMC_CURRENT_POS BTN_POS(3,1), BTN_SIZE(1,1) - #define TMC_HOMING_THRS_POS BTN_POS(3,2), BTN_SIZE(1,1) - #define BACKLASH_POS BTN_POS(3,3), BTN_SIZE(1,1) - #define FILAMENT_POS BTN_POS(1,3), BTN_SIZE(1,1) - #define ENDSTOPS_POS BTN_POS(3,4), BTN_SIZE(1,1) - #define DISPLAY_POS BTN_POS(3,5), BTN_SIZE(1,1) - #define INTERFACE_POS BTN_POS(1,5), BTN_SIZE(2,1) - #define RESTORE_DEFAULTS_POS BTN_POS(1,6), BTN_SIZE(2,1) - #define VELOCITY_POS BTN_POS(2,2), BTN_SIZE(1,1) - #define ACCELERATION_POS BTN_POS(2,3), BTN_SIZE(1,1) - #define JERK_POS BTN_POS(2,4), BTN_SIZE(1,1) - #define OFFSETS_POS BTN_POS(1,2), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(3,6), BTN_SIZE(1,1) - #endif - - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(Theme::font_medium) - .enabled(ENABLED(HAS_BED_PROBE)) - .tag(2) .button( ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) - .enabled(ENABLED(CASE_LIGHT_ENABLE)) - .tag(16).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) - .tag(3) .button( STEPS_PER_MM_POS, GET_TEXT_F(MSG_STEPS_PER_MM)) - .enabled(ENABLED(HAS_TRINAMIC_CONFIG)) - .tag(13).button( TMC_CURRENT_POS, GET_TEXT_F(MSG_TMC_CURRENT)) - .enabled(ENABLED(SENSORLESS_HOMING)) - .tag(14).button( TMC_HOMING_THRS_POS, GET_TEXT_F(MSG_TMC_HOMING_THRS)) - .enabled(ENABLED(HAS_MULTI_HOTEND)) - .tag(4) .button( OFFSETS_POS, GET_TEXT_F(MSG_OFFSETS_MENU)) - .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) - .tag(11).button( FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) - .tag(12).button( ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) - .tag(15).button( DISPLAY_POS, GET_TEXT_F(MSG_DISPLAY_MENU)) - .tag(9) .button( INTERFACE_POS, GET_TEXT_F(MSG_INTERFACE)) - .tag(10).button( RESTORE_DEFAULTS_POS, GET_TEXT_F(MSG_RESTORE_DEFAULTS)) - .tag(5) .button( VELOCITY_POS, GET_TEXT_F(MSG_VELOCITY)) - .tag(6) .button( ACCELERATION_POS, GET_TEXT_F(MSG_ACCELERATION)) - .tag(7) .button( JERK_POS, GET_TEXT_F(TERN(HAS_JUNCTION_DEVIATION, MSG_JUNCTION_DEVIATION, MSG_JERK))) - .enabled(ENABLED(BACKLASH_GCODE)) - .tag(8).button( BACKLASH_POS, GET_TEXT_F(MSG_BACKLASH)) - .colors(action_btn) - .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); - } -} - -bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; - #if HAS_BED_PROBE - case 2: GOTO_SCREEN(ZOffsetScreen); break; - #endif - case 3: GOTO_SCREEN(StepsScreen); break; - #if ENABLED(HAS_MULTI_HOTEND) - case 4: GOTO_SCREEN(NozzleOffsetScreen); break; - #endif - case 5: GOTO_SCREEN(MaxVelocityScreen); break; - case 6: GOTO_SCREEN(DefaultAccelerationScreen); break; - case 7: GOTO_SCREEN(TERN(HAS_JUNCTION_DEVIATION, JunctionDeviationScreen, JerkScreen)); break; - #if ENABLED(BACKLASH_GCODE) - case 8: GOTO_SCREEN(BacklashCompensationScreen); break; - #endif - case 9: GOTO_SCREEN(InterfaceSettingsScreen); LockScreen::check_passcode(); break; - case 10: GOTO_SCREEN(RestoreFailsafeDialogBox); LockScreen::check_passcode(); break; - #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - case 11: GOTO_SCREEN(FilamentMenu); break; - #endif - case 12: GOTO_SCREEN(EndstopStatesScreen); break; - #if HAS_TRINAMIC_CONFIG - case 13: GOTO_SCREEN(StepperCurrentScreen); break; - #endif - #if ENABLED(SENSORLESS_HOMING) - case 14: GOTO_SCREEN(StepperBumpSensitivityScreen); break; - #endif - case 15: GOTO_SCREEN(DisplayTuningScreen); break; - #if ENABLED(CASE_LIGHT_ENABLE) - case 16: GOTO_SCREEN(CaseLightScreen); break; - #endif - default: return false; - } - return true; -} -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp deleted file mode 100644 index bd09d2a5cd..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/************************ - * alert_dialog_box.cpp * - ************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace Theme; - -void AlertDialogBox::onEntry() { - BaseScreen::onEntry(); - sound.play(screen_data.AlertDialogBox.isError ? sad_trombone : twinkle, PLAY_ASYNCHRONOUS); -} - -void AlertDialogBox::onRedraw(draw_mode_t what) { - if (what & FOREGROUND) { - drawOkayButton(); - } -} - -template -void AlertDialogBox::show(const T message) { - drawMessage(message); - storeBackground(); - screen_data.AlertDialogBox.isError = false; - GOTO_SCREEN(AlertDialogBox); -} - -template -void AlertDialogBox::showError(const T message) { - drawMessage(message); - storeBackground(); - screen_data.AlertDialogBox.isError = true; - GOTO_SCREEN(AlertDialogBox); -} - -void AlertDialogBox::hide() { - if (AT_SCREEN(AlertDialogBox)) - GOTO_PREVIOUS(); -} - -template void AlertDialogBox::show(const char *); -template void AlertDialogBox::show(const progmem_str); -template void AlertDialogBox::showError(const char *); -template void AlertDialogBox::showError(const progmem_str); - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp deleted file mode 100644 index 8d65518455..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/************************************ - * backlash_compensation_screen.cpp * - ************************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, BACKLASH_GCODE) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void BacklashCompensationScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(2).units( GET_TEXT_F(MSG_UNITS_MM)); - w.heading( GET_TEXT_F(MSG_BACKLASH)); - w.color(x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), getAxisBacklash_mm(X)); - w.color(y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), getAxisBacklash_mm(Y)); - w.color(z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), getAxisBacklash_mm(Z)); - #if ENABLED(CALIBRATION_GCODE) - w.button(12, GET_TEXT_F(MSG_MEASURE_AUTOMATICALLY)); - #endif - #ifdef BACKLASH_SMOOTHING_MM - w.color(other).adjuster(8, GET_TEXT_F(MSG_BACKLASH_SMOOTHING), getBacklashSmoothing_mm()); - #endif - w.precision(0).units(GET_TEXT_F(MSG_UNITS_PERCENT)) - .adjuster(10, GET_TEXT_F(MSG_BACKLASH_CORRECTION), getBacklashCorrection_percent()); - w.precision(2).increments(); -} - -bool BacklashCompensationScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(AxisBacklash_mm, X); break; - case 3: UI_INCREMENT(AxisBacklash_mm, X); break; - case 4: UI_DECREMENT(AxisBacklash_mm, Y); break; - case 5: UI_INCREMENT(AxisBacklash_mm, Y); break; - case 6: UI_DECREMENT(AxisBacklash_mm, Z); break; - case 7: UI_INCREMENT(AxisBacklash_mm, Z); break; - #ifdef BACKLASH_SMOOTHING_MM - case 8: UI_DECREMENT(BacklashSmoothing_mm); break; - case 9: UI_INCREMENT(BacklashSmoothing_mm); break; - #endif - case 10: UI_DECREMENT_BY(BacklashCorrection_percent, increment*100); break; - case 11: UI_INCREMENT_BY(BacklashCorrection_percent, increment*100); break; - #if ENABLED(CALIBRATION_GCODE) - case 12: GOTO_SCREEN(ConfirmAutoCalibrationDialogBox); return true; - #endif - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp deleted file mode 100644 index 1c4ef594bb..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/************************************** - * base_numeric_adjustment_screen.cpp * - **************************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace Theme; - -#ifdef TOUCH_UI_PORTRAIT - #define GRID_COLS 13 - #define GRID_ROWS 10 - #define LAYOUT_FONT font_small -#else - #define GRID_COLS 18 - #define GRID_ROWS 7 - #define LAYOUT_FONT font_medium -#endif - -BaseNumericAdjustmentScreen::widgets_t::widgets_t(draw_mode_t what) : _what(what) { - CommandProcessor cmd; - - if (what & BACKGROUND) { - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .colors(normal_btn) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0); - } - - cmd.font(font_medium); - _button(cmd, 1, - #ifdef TOUCH_UI_PORTRAIT - BTN_POS(1,10), BTN_SIZE(13,1), - #else - BTN_POS(15,7), BTN_SIZE(4,1), - #endif - GET_TEXT_F(MSG_BACK), true, true - ); - - _line = 1; - _units = F(""); -} - -/** - * Speed optimization for changing button style. - */ -void BaseNumericAdjustmentScreen::widgets_t::_button_style(CommandProcessor &cmd, BaseNumericAdjustmentScreen::widgets_t::style_t style) { - if (_style != style) { - const btn_colors *old_colors = &normal_btn; - const btn_colors *new_colors = &normal_btn; - - switch (_style) { - case BTN_ACTION: old_colors = &action_btn; break; - case BTN_TOGGLE: old_colors = &ui_toggle; break; - case BTN_DISABLED: old_colors = &disabled_btn; break; - default: break; - } - switch (style) { - case BTN_ACTION: new_colors = &action_btn; break; - case BTN_TOGGLE: new_colors = &ui_toggle; break; - case BTN_DISABLED: new_colors = &disabled_btn; break; - default: break; - } - - const bool rgb_changed = (old_colors->rgb != new_colors->rgb) || - (_style == TEXT_LABEL && style != TEXT_LABEL) || - (_style != TEXT_LABEL && style == TEXT_LABEL); - const bool grad_changed = old_colors->grad != new_colors->grad; - const bool fg_changed = (old_colors->fg != new_colors->fg) || (_style == TEXT_AREA); - const bool bg_changed = old_colors->bg != new_colors->bg; - - if (rgb_changed) cmd.cmd(COLOR_RGB(style == TEXT_LABEL ? bg_text_enabled : new_colors->rgb)); - if (grad_changed) cmd.gradcolor(new_colors->grad); - if (fg_changed) cmd.fgcolor(new_colors->fg); - if (bg_changed) cmd.bgcolor(new_colors->bg); - - _style = style; - } -} - -/** - * Speed optimization for drawing buttons. Draw all unpressed buttons in the - * background layer and draw only the pressed button in the foreground layer. - */ -void BaseNumericAdjustmentScreen::widgets_t::_button(CommandProcessor &cmd, uint8_t tag, int16_t x, int16_t y, int16_t w, int16_t h, progmem_str text, bool enabled, bool highlight) { - if (_what & BACKGROUND) enabled = true; - if ((_what & BACKGROUND) || buttonIsPressed(tag) || highlight || !enabled) { - _button_style(cmd, (!enabled) ? BTN_DISABLED : (highlight ? BTN_ACTION : BTN_NORMAL)); - cmd.tag(enabled ? tag : 0).button(x, y, w, h, text); - } -} - -BaseNumericAdjustmentScreen::widgets_t &BaseNumericAdjustmentScreen::widgets_t::precision(uint8_t decimals, precision_default_t initial) { - _decimals = decimals; - if (screen_data.BaseNumericAdjustmentScreen.increment == 0) { - screen_data.BaseNumericAdjustmentScreen.increment = 243 + (initial - DEFAULT_LOWEST) - _decimals; - } - return *this; -} - -void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) { - if (_what & BACKGROUND) { - CommandProcessor cmd; - _button_style(cmd, TEXT_LABEL); - cmd.font(font_medium) - .tag(0) - .text( - #ifdef TOUCH_UI_PORTRAIT - BTN_POS(1, _line), BTN_SIZE(12,1), - #else - BTN_POS(5, _line), BTN_SIZE(8,1), - #endif - label - ); - } - - _line++; -} - -#ifdef TOUCH_UI_PORTRAIT - #ifdef TOUCH_UI_800x480 - #undef EDGE_R - #define EDGE_R 20 - #else - #undef EDGE_R - #define EDGE_R 10 - #endif -#endif - -void BaseNumericAdjustmentScreen::widgets_t::_draw_increment_btn(CommandProcessor &cmd, uint8_t, const uint8_t tag) { - const char *label = PSTR("?"); - uint8_t pos; - uint8_t & increment = screen_data.BaseNumericAdjustmentScreen.increment; - - if (increment == 0) { - increment = tag; // Set the default value to be the first. - } - - switch (tag) { - case 240: label = PSTR( ".001"); pos = _decimals - 3; break; - case 241: label = PSTR( ".01" ); pos = _decimals - 2; break; - case 242: label = PSTR( "0.1" ); pos = _decimals - 1; break; - case 243: label = PSTR( "1" ); pos = _decimals + 0; break; - case 244: label = PSTR( "10" ); pos = _decimals + 1; break; - default: label = PSTR("100" ); pos = _decimals + 2; break; - } - - const bool highlight = (_what & FOREGROUND) && (increment == tag); - - switch (pos) { - #ifdef TOUCH_UI_PORTRAIT - case 0: _button(cmd, tag, BTN_POS(5,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break; - case 1: _button(cmd, tag, BTN_POS(7,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break; - case 2: _button(cmd, tag, BTN_POS(9,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break; - #else - case 0: _button(cmd, tag, BTN_POS(15,2), BTN_SIZE(4,1), progmem_str(label), true, highlight); break; - case 1: _button(cmd, tag, BTN_POS(15,3), BTN_SIZE(4,1), progmem_str(label), true, highlight); break; - case 2: _button(cmd, tag, BTN_POS(15,4), BTN_SIZE(4,1), progmem_str(label), true, highlight); break; - #endif - } -} - -void BaseNumericAdjustmentScreen::widgets_t::increments() { - CommandProcessor cmd; - - cmd.font(LAYOUT_FONT); - - if (_what & BACKGROUND) { - _button_style(cmd, TEXT_LABEL); - cmd.tag(0).text( - #ifdef TOUCH_UI_PORTRAIT - BTN_POS(1, _line), BTN_SIZE(4,1), - #else - BTN_POS(15, 1), BTN_SIZE(4,1), - #endif - GET_TEXT_F(MSG_INCREMENT) - ); - } - - _draw_increment_btn(cmd, _line+1, 245 - _decimals); - _draw_increment_btn(cmd, _line+1, 244 - _decimals); - _draw_increment_btn(cmd, _line+1, 243 - _decimals); - - #ifdef TOUCH_UI_PORTRAIT - _line++; - #endif -} - -void BaseNumericAdjustmentScreen::widgets_t::adjuster_sram_val(uint8_t tag, progmem_str label, const char *value, bool is_enabled) { - CommandProcessor cmd; - - if (_what & BACKGROUND) { - _button_style(cmd, TEXT_LABEL); - cmd.tag(0) - .font(font_small) - .text( BTN_POS(1,_line), BTN_SIZE(4,1), label); - _button_style(cmd, TEXT_AREA); - cmd.fgcolor(_color).button( BTN_POS(5,_line), BTN_SIZE(5,1), F(""), OPT_FLAT); - } - - cmd.font(font_medium); - _button(cmd, tag, BTN_POS(10,_line), BTN_SIZE(2,1), F("-"), is_enabled); - _button(cmd, tag + 1, BTN_POS(12,_line), BTN_SIZE(2,1), F("+"), is_enabled); - - if ((_what & FOREGROUND) && is_enabled) { - _button_style(cmd, BTN_NORMAL); - cmd.tag(0) - .font(font_small) - .text(BTN_POS(5,_line), BTN_SIZE(5,1), value); - } - - _line++; -} - -void BaseNumericAdjustmentScreen::widgets_t::adjuster(uint8_t tag, progmem_str label, const char *value, bool is_enabled) { - if (_what & BACKGROUND) { - adjuster_sram_val(tag, label, nullptr); - } - - if (_what & FOREGROUND) { - char b[strlen_P(value)+1]; - strcpy_P(b,value); - adjuster_sram_val(tag, label, b, is_enabled); - } -} - -void BaseNumericAdjustmentScreen::widgets_t::adjuster(uint8_t tag, progmem_str label, float value, bool is_enabled) { - if (_what & BACKGROUND) { - adjuster_sram_val(tag, label, nullptr); - } - - if (_what & FOREGROUND) { - char b[32]; - dtostrf(value, 5, _decimals, b); - strcat_P(b, PSTR(" ")); - strcat_P(b, (const char*) _units); - adjuster_sram_val(tag, label, b, is_enabled); - } -} - -void BaseNumericAdjustmentScreen::widgets_t::button(uint8_t tag, progmem_str label, bool is_enabled) { - CommandProcessor cmd; - cmd.font(LAYOUT_FONT); - _button(cmd, tag, BTN_POS(5,_line), BTN_SIZE(9,1), label, is_enabled); - - _line++; -} - -void BaseNumericAdjustmentScreen::widgets_t::text_field(uint8_t tag, progmem_str label, const char *value, bool is_enabled) { - CommandProcessor cmd; - - if (_what & BACKGROUND) { - _button_style(cmd, TEXT_LABEL); - cmd.enabled(1) - .tag(0) - .font(font_small) - .text( BTN_POS(1,_line), BTN_SIZE(4,1), label); - _button_style(cmd, TEXT_AREA); - cmd.fgcolor(_color) - .tag(tag) - .button( BTN_POS(5,_line), BTN_SIZE(9,1), F(""), OPT_FLAT); - } - - if (_what & FOREGROUND) { - cmd.font(font_small).text( BTN_POS(5,_line), BTN_SIZE(9,1), is_enabled ? value : "-"); - } - - _line++; -} - -void BaseNumericAdjustmentScreen::widgets_t::two_buttons(uint8_t tag1, progmem_str label1, uint8_t tag2, progmem_str label2, bool is_enabled) { - CommandProcessor cmd; - cmd.font(LAYOUT_FONT); - _button(cmd, tag1, BTN_POS(5,_line), BTN_SIZE(4.5,1), label1, is_enabled); - _button(cmd, tag2, BTN_POS(9.5,_line), BTN_SIZE(4.5,1), label2, is_enabled); - - _line++; -} - -void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str label, bool value, bool is_enabled) { - CommandProcessor cmd; - - if (_what & BACKGROUND) { - _button_style(cmd, TEXT_LABEL); - cmd.font(font_small) - .text( - #ifdef TOUCH_UI_PORTRAIT - BTN_POS(1, _line), BTN_SIZE( 8,1), - #else - BTN_POS(1, _line), BTN_SIZE(10,1), - #endif - label - ); - } - - if (_what & FOREGROUND) { - _button_style(cmd, BTN_TOGGLE); - cmd.tag(is_enabled ? tag : 0) - .enabled(is_enabled) - .font(font_small) - .toggle2( - #ifdef TOUCH_UI_PORTRAIT - BTN_POS( 9,_line), BTN_SIZE(5,1), - #else - BTN_POS(10,_line), BTN_SIZE(4,1), - #endif - GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), value - ); - } - - _line++; -} - -void BaseNumericAdjustmentScreen::widgets_t::home_buttons(uint8_t tag) { - CommandProcessor cmd; - - if (_what & BACKGROUND) { - _button_style(cmd, TEXT_LABEL); - cmd.font(font_small) - .text(BTN_POS(1, _line), BTN_SIZE(4,1), GET_TEXT_F(MSG_HOME)); - } - - cmd.font(LAYOUT_FONT); - _button(cmd, tag+0, BTN_POS(5,_line), BTN_SIZE(2,1), GET_TEXT_F(MSG_AXIS_X)); - _button(cmd, tag+1, BTN_POS(7,_line), BTN_SIZE(2,1), GET_TEXT_F(MSG_AXIS_Y)); - #if DISABLED(Z_SAFE_HOMING) - _button(cmd, tag+2, BTN_POS(9,_line), BTN_SIZE(2,1), GET_TEXT_F(MSG_AXIS_Z)); - _button(cmd, tag+3, BTN_POS(11,_line), BTN_SIZE(3,1), GET_TEXT_F(MSG_AXIS_ALL)); - #else - _button(cmd, tag+3, BTN_POS(9,_line), BTN_SIZE(3,1), GET_TEXT_F(MSG_AXIS_ALL)); - #endif - - _line++; -} - -void BaseNumericAdjustmentScreen::onEntry() { - screen_data.BaseNumericAdjustmentScreen.increment = 0; // This will force the increment to be picked while drawing. - BaseScreen::onEntry(); - CommandProcessor cmd; - cmd.set_button_style_callback(nullptr); -} - -bool BaseNumericAdjustmentScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); return true; - case 240 ... 245: screen_data.BaseNumericAdjustmentScreen.increment = tag; break; - default: return current_screen.onTouchHeld(tag); - } - return true; -} - -float BaseNumericAdjustmentScreen::getIncrement() { - switch (screen_data.BaseNumericAdjustmentScreen.increment) { - case 240: return 0.001; - case 241: return 0.01; - case 242: return 0.1; - case 243: return 1.0; - case 244: return 10.0; - case 245: return 100.0; - default: return 0.0; - } -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp deleted file mode 100644 index c84dd45f00..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/******************* - * base_screen.cpp * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -void BaseScreen::onEntry() { - CommandProcessor cmd; - cmd.set_button_style_callback(buttonStyleCallback); - reset_menu_timeout(); - UIScreen::onEntry(); -} - -bool BaseScreen::buttonIsPressed(uint8_t tag) { - return tag != 0 && EventLoop::get_pressed_tag() == tag; -} - -bool BaseScreen::buttonStyleCallback(CommandProcessor &cmd, uint8_t tag, uint8_t &style, uint16_t &options, bool post) { - if (post) { - cmd.colors(normal_btn); - return false; - } - - #if LCD_TIMEOUT_TO_STATUS > 0 - if (EventLoop::get_pressed_tag() != 0) { - reset_menu_timeout(); - } - #endif - - if (buttonIsPressed(tag)) { - options = OPT_FLAT; - } - - if (style & cmd.STYLE_DISABLED) { - cmd.tag(0); - style &= ~cmd.STYLE_DISABLED; - cmd.colors(disabled_btn); - return true; // Call me again to reset the colors - } - return false; -} - -void BaseScreen::onIdle() { - #if LCD_TIMEOUT_TO_STATUS > 0 - if ((millis() - last_interaction) > LCD_TIMEOUT_TO_STATUS) { - reset_menu_timeout(); - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("Returning to status due to menu timeout"); - #endif - GOTO_SCREEN(StatusScreen); - } - #endif -} - -void BaseScreen::reset_menu_timeout() { - #if LCD_TIMEOUT_TO_STATUS > 0 - last_interaction = millis(); - #endif -} - -#if LCD_TIMEOUT_TO_STATUS > 0 - uint32_t BaseScreen::last_interaction; -#endif - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp deleted file mode 100644 index a11609dd97..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/*********************** - * bed_mesh_screen.cpp * - ***********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2020 * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_MESH) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -#ifdef TOUCH_UI_PORTRAIT - #define GRID_COLS 2 - #define GRID_ROWS 10 - - #define MESH_POS BTN_POS(1, 2), BTN_SIZE(2,5) - #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(2,1) - #define Z_LABEL_POS BTN_POS(1, 8), BTN_SIZE(1,1) - #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(1,1) - #define OKAY_POS BTN_POS(1,10), BTN_SIZE(2,1) -#else - #define GRID_COLS 5 - #define GRID_ROWS 5 - - #define MESH_POS BTN_POS(1,1), BTN_SIZE(3,5) - #define MESSAGE_POS BTN_POS(4,1), BTN_SIZE(2,1) - #define Z_LABEL_POS BTN_POS(4,2), BTN_SIZE(2,1) - #define Z_VALUE_POS BTN_POS(4,3), BTN_SIZE(2,1) - #define OKAY_POS BTN_POS(4,5), BTN_SIZE(2,1) -#endif - -void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max) { - constexpr uint8_t rows = GRID_MAX_POINTS_Y; - constexpr uint8_t cols = GRID_MAX_POINTS_X; - - #define VALUE(X,Y) (data ? data[X][Y] : 0) - #define ISVAL(X,Y) (data ? !isnan(VALUE(X,Y)) : true) - #define HEIGHT(X,Y) (ISVAL(X,Y) ? (VALUE(X,Y) - val_min) * scale_z : 0) - - // Compute the mean, min and max for the points - - float val_mean = 0; - float val_max = -INFINITY; - float val_min = INFINITY; - uint8_t val_cnt = 0; - - if (data && (opts & USE_AUTOSCALE)) { - for (uint8_t y = 0; y < rows; y++) { - for (uint8_t x = 0; x < cols; x++) { - if (ISVAL(x,y)) { - const float val = VALUE(x,y); - val_mean += val; - val_max = max(val_max, val); - val_min = min(val_min, val); - val_cnt++; - } - } - } - } - if (val_cnt) { - val_mean /= val_cnt; - } else { - val_mean = 0; - val_min = 0; - val_max = 0; - } - - const float scale_z = ((val_max == val_min) ? 1 : 1/(val_max - val_min)) * autoscale_max; - - /** - * The 3D points go through a 3D graphics pipeline to determine the final 2D point on the screen. - * This is written out as a stack of macros that each apply an affine transformation to the point. - * At compile time, the compiler should be able to reduce these expressions. - * - * The last transformation in the chain (TRANSFORM_5) is initially set to a no-op so we can measure - * the dimensions of the grid, but is later replaced with a scaling transform that scales the grid - * to fit. - */ - - #define TRANSFORM_5(X,Y,Z) (X), (Y) // No transform - #define TRANSFORM_4(X,Y,Z) TRANSFORM_5((X)/(Z),(Y)/-(Z), 0) // Perspective - #define TRANSFORM_3(X,Y,Z) TRANSFORM_4((X), (Z), (Y)) // Swap Z and Y - #define TRANSFORM_2(X,Y,Z) TRANSFORM_3((X), (Y) + 2.5, (Z) - 1) // Translate - #define TRANSFORM(X,Y,Z) TRANSFORM_2(float(X)/(cols-1) - 0.5, float(Y)/(rows-1) - 0.5, (Z)) // Normalize - - // Compute the bounding box for the grid prior to scaling. Do this at compile-time by - // transforming the four corner points via the transformation equations and finding - // the min and max for each axis. - - constexpr float bounds[][3] = {{TRANSFORM(0 , 0 , 0)}, - {TRANSFORM(cols-1, 0 , 0)}, - {TRANSFORM(0 , rows-1, 0)}, - {TRANSFORM(cols-1, rows-1, 0)}}; - #define APPLY(FUNC, AXIS) FUNC(FUNC(bounds[0][AXIS], bounds[1][AXIS]), FUNC(bounds[2][AXIS], bounds[3][AXIS])) - constexpr float grid_x = APPLY(min,0); - constexpr float grid_y = APPLY(min,1); - constexpr float grid_w = APPLY(max,0) - grid_x; - constexpr float grid_h = APPLY(max,1) - grid_y; - constexpr float grid_cx = grid_x + grid_w/2; - constexpr float grid_cy = grid_y + grid_h/2; - - // Figure out scale and offset such that the grid fits within the rectangle given by (x,y,w,h) - - const float scale_x = float(w)/grid_w; - const float scale_y = float(h)/grid_h; - const float center_x = x + w/2; - const float center_y = y + h/2; - - // Now replace the last transformation in the chain with a scaling operation. - - #undef TRANSFORM_5 - #define TRANSFORM_6(X,Y,Z) (X)*16, (Y)*16 // Scale to 1/16 pixel units - #define TRANSFORM_5(X,Y,Z) TRANSFORM_6( center_x + ((X) - grid_cx) * scale_x, \ - center_y + ((Y) - grid_cy) * scale_y, 0) // Scale to bounds - - // Draw the grid - - const uint16_t basePointSize = min(w,h) / max(cols,rows); - - CommandProcessor cmd; - cmd.cmd(SAVE_CONTEXT()) - .cmd(TAG_MASK(false)) - .cmd(SAVE_CONTEXT()); - - for (uint8_t y = 0; y < rows; y++) { - for (uint8_t x = 0; x < cols; x++) { - if (ISVAL(x,y)) { - const bool hasLeftSegment = x < cols - 1 && ISVAL(x+1,y); - const bool hasRightSegment = y < rows - 1 && ISVAL(x,y+1); - if (hasLeftSegment || hasRightSegment) { - cmd.cmd(BEGIN(LINE_STRIP)); - if (hasLeftSegment) cmd.cmd(VERTEX2F(TRANSFORM(x + 1, y , HEIGHT(x + 1, y )))); - cmd.cmd( VERTEX2F(TRANSFORM(x , y , HEIGHT(x , y )))); - if (hasRightSegment) cmd.cmd(VERTEX2F(TRANSFORM(x , y + 1, HEIGHT(x , y + 1)))); - } - } - } - - if (opts & USE_POINTS) { - const float sq_min = sq(val_min - val_mean); - const float sq_max = sq(val_max - val_mean); - cmd.cmd(POINT_SIZE(basePointSize * 2)); - cmd.cmd(BEGIN(POINTS)); - for (uint8_t x = 0; x < cols; x++) { - if (ISVAL(x,y)) { - if (opts & USE_COLORS) { - const float val_dev = VALUE(x, y) - val_mean; - const uint8_t neg_byte = sq(val_dev) / (val_dev < 0 ? sq_min : sq_max) * 0xFF; - const uint8_t pos_byte = 255 - neg_byte; - cmd.cmd(COLOR_RGB(pos_byte, pos_byte, 0xFF)); - } - cmd.cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); - } - } - if (opts & USE_COLORS) { - cmd.cmd(RESTORE_CONTEXT()) - .cmd(SAVE_CONTEXT()); - } - } - } - cmd.cmd(RESTORE_CONTEXT()) - .cmd(TAG_MASK(true)); - - if (opts & USE_TAGS) { - cmd.cmd(COLOR_MASK(false, false, false, false)) - .cmd(POINT_SIZE(basePointSize * 10)) - .cmd(BEGIN(POINTS)); - for (uint8_t y = 0; y < rows; y++) { - for (uint8_t x = 0; x < cols; x++) { - const uint8_t tag = pointToTag(x, y); - cmd.tag(tag).cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); - } - } - cmd.cmd(COLOR_MASK(true, true, true, true)); - } - - if (opts & USE_HIGHLIGHT) { - const uint8_t tag = screen_data.BedMeshScreen.highlightedTag; - uint8_t x, y; - if (tagToPoint(tag, x, y)) { - cmd.cmd(COLOR_A(128)) - .cmd(POINT_SIZE(basePointSize * 6)) - .cmd(BEGIN(POINTS)) - .tag(tag).cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); - } - } - cmd.cmd(END()); - cmd.cmd(RESTORE_CONTEXT()); -} - -uint8_t BedMeshScreen::pointToTag(uint8_t x, uint8_t y) { - return y * (GRID_MAX_POINTS_X) + x + 10; -} - -bool BedMeshScreen::tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y) { - if (tag < 10) return false; - x = (tag - 10) % (GRID_MAX_POINTS_X); - y = (tag - 10) / (GRID_MAX_POINTS_X); - return true; -} - -void BedMeshScreen::onEntry() { - screen_data.BedMeshScreen.highlightedTag = 0; - screen_data.BedMeshScreen.count = GRID_MAX_POINTS; - screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; - BaseScreen::onEntry(); -} - -float BedMeshScreen::getHightlightedValue() { - if (screen_data.BedMeshScreen.highlightedTag) { - xy_uint8_t pt; - tagToPoint(screen_data.BedMeshScreen.highlightedTag, pt.x, pt.y); - return ExtUI::getMeshPoint(pt); - } - return NAN; -} - -void BedMeshScreen::drawHighlightedPointValue() { - char str[16]; - const float val = getHightlightedValue(); - const bool isGood = !isnan(val); - if (isGood) - dtostrf(val, 5, 3, str); - else - strcpy_P(str, PSTR("-")); - - CommandProcessor cmd; - cmd.font(Theme::font_medium) - .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) - .text(Z_VALUE_POS, str) - .colors(action_btn) - .tag(1).button( OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) - .tag(0); - - switch (screen_data.BedMeshScreen.message) { - case screen_data.BedMeshScreen.MSG_MESH_COMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); break; - case screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE)); break; - default: break; - } -} - -void BedMeshScreen::onRedraw(draw_mode_t what) { - #define _INSET_POS(x,y,w,h) x + min(w,h)/10, y + min(w,h)/10, w - min(w,h)/5, h - min(w,h)/5 - #define INSET_POS(pos) _INSET_POS(pos) - - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)); - - // Draw the shadow and tags - cmd.cmd(COLOR_RGB(0x444444)); - BedMeshScreen::drawMesh(INSET_POS(MESH_POS), nullptr, USE_POINTS | USE_TAGS); - cmd.cmd(COLOR_RGB(bg_text_enabled)); - } - - if (what & FOREGROUND) { - constexpr float autoscale_max_amplitude = 0.03; - const bool gotAllPoints = screen_data.BedMeshScreen.count >= GRID_MAX_POINTS; - if (gotAllPoints) { - drawHighlightedPointValue(); - } - const float levelingProgress = sq(float(screen_data.BedMeshScreen.count) / GRID_MAX_POINTS); - BedMeshScreen::drawMesh(INSET_POS(MESH_POS), ExtUI::getMeshArray(), - USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (gotAllPoints ? USE_COLORS : 0), - autoscale_max_amplitude * levelingProgress - ); - } -} - -bool BedMeshScreen::onTouchStart(uint8_t tag) { - screen_data.BedMeshScreen.highlightedTag = tag; - return true; -} - -bool BedMeshScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - GOTO_PREVIOUS(); - return true; - default: - return false; - } -} - -void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { - if (AT_SCREEN(BedMeshScreen)) - onRefresh(); -} - -bool BedMeshScreen::isMeshComplete(ExtUI::bed_mesh_t data) { - for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) { - for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { - if (isnan(data[x][y])) { - return false; - } - } - } - return true; -} - -void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { - switch (state) { - case ExtUI::MESH_START: - screen_data.BedMeshScreen.count = 0; - screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; - break; - case ExtUI::MESH_FINISH: - if (screen_data.BedMeshScreen.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray())) { - screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_COMPLETE; - } else { - screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE; - } - screen_data.BedMeshScreen.count = GRID_MAX_POINTS; - break; - case ExtUI::PROBE_START: - screen_data.BedMeshScreen.highlightedTag = pointToTag(x, y); - break; - case ExtUI::PROBE_FINISH: - screen_data.BedMeshScreen.count++; - break; - } - BedMeshScreen::onMeshUpdate(x, y, 0); -} - -void BedMeshScreen::startMeshProbe() { - GOTO_SCREEN(BedMeshScreen); - screen_data.BedMeshScreen.count = 0; - injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); -} - -#endif // TOUCH_UI_FTDI_EVE && HAS_MESH diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp deleted file mode 100644 index 76ebdca587..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/***************************** - * bio_advanced_settings.cpp * - *****************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)); - } - - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(Theme::font_medium) - #define GRID_ROWS 9 - #define GRID_COLS 2 - - .tag(2) .button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXT_F(MSG_DISPLAY_MENU)) - .enabled( - #if HAS_TRINAMIC_CONFIG - 1 - #endif - ) - .tag(3) .button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_TMC_CURRENT)) - .enabled( - #if HAS_TRINAMIC_CONFIG - 1 - #endif - ) - .tag(4) .button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_TMC_HOMING_THRS)) - .tag(5) .button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_LCD_ENDSTOPS)) - .enabled( - #if HAS_MULTI_HOTEND - 1 - #endif - ) - .tag(6) .button( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_OFFSETS_MENU)) - - - .tag(7) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(MSG_STEPS_PER_MM)) - .tag(8) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_VELOCITY)) - .tag(9) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_ACCELERATION)) - #if HAS_JUNCTION_DEVIATION - .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_JUNCTION_DEVIATION)) - #else - .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_JERK)) - #endif - .enabled( - #if ENABLED(BACKLASH_GCODE) - 1 - #endif - ) - .tag(11) .button( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_BACKLASH)) - .enabled( - #if ENABLED(LIN_ADVANCE) - 1 - #endif - ) - .tag(12) .button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_LINEAR_ADVANCE)) - .tag(13) .button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_INTERFACE)) - .tag(14) .button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_RESTORE_DEFAULTS)) - .colors(action_btn) - .tag(1). button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); - #undef GRID_COLS - #undef GRID_ROWS - } -} - -bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { - using namespace ExtUI; - - switch (tag) { - case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; - case 2: GOTO_SCREEN(DisplayTuningScreen); break; - #if HAS_TRINAMIC_CONFIG - case 3: GOTO_SCREEN(StepperCurrentScreen); break; - case 4: GOTO_SCREEN(StepperBumpSensitivityScreen); break; - #endif - case 5: GOTO_SCREEN(EndstopStatesScreen); break; - #if HAS_MULTI_HOTEND - case 6: GOTO_SCREEN(NozzleOffsetScreen); break; - #endif - - case 7: GOTO_SCREEN(StepsScreen); break; - case 8: GOTO_SCREEN(MaxVelocityScreen); break; - case 9: GOTO_SCREEN(DefaultAccelerationScreen); break; - case 10: - #if HAS_JUNCTION_DEVIATION - GOTO_SCREEN(JunctionDeviationScreen); - #else - GOTO_SCREEN(JerkScreen); - #endif - break; - #if ENABLED(BACKLASH_GCODE) - case 11: GOTO_SCREEN(BacklashCompensationScreen); break; - #endif - #if ENABLED(LIN_ADVANCE) - case 12: GOTO_SCREEN(LinearAdvanceScreen); break; - #endif - case 13: GOTO_SCREEN(InterfaceSettingsScreen); break; - case 14: GOTO_SCREEN(RestoreFailsafeDialogBox); break; - - default: - return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp deleted file mode 100644 index da772971ce..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/**************************** - * bio_confirm_home_xyz.cpp * - ****************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) - -#include "screens.h" - -using namespace FTDI; - -void BioConfirmHomeE::onRedraw(draw_mode_t) { - drawMessage(GET_TEXT_F(MSG_HOME_E_WARNING)); - drawYesNoButtons(1); -} - -bool BioConfirmHomeE::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - #if defined(AXIS_LEVELING_COMMANDS) && defined(PARK_AND_RELEASE_COMMANDS) - SpinnerDialogBox::enqueueAndWait_P(F( - "G28 E\n" - AXIS_LEVELING_COMMANDS "\n" - PARK_AND_RELEASE_COMMANDS - )); - #endif - current_screen.forget(); - break; - case 2: - GOTO_SCREEN(StatusScreen); - break; - default: - return DialogBoxBaseClass::onTouchEnd(tag); - } - return true; -} -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp deleted file mode 100644 index 48ce320482..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/**************************** - * bio_confirm_home_xyz.cpp * - ****************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) - -#include "screens.h" - -using namespace FTDI; - -void BioConfirmHomeXYZ::onRedraw(draw_mode_t) { - drawMessage(GET_TEXT_F(MSG_HOME_XYZ_WARNING)); - drawYesNoButtons(1); -} - -bool BioConfirmHomeXYZ::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - #ifdef PARK_AND_RELEASE_COMMANDS - SpinnerDialogBox::enqueueAndWait_P(F( - "G28\n" - PARK_AND_RELEASE_COMMANDS - )); - #endif - current_screen.forget(); - break; - case 2: - GOTO_SCREEN(StatusScreen); - break; - default: - return DialogBoxBaseClass::onTouchEnd(tag); - } - return true; -} -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp deleted file mode 100644 index e2bb8a2414..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/********************* - * bio_main_menu.cpp * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -void MainMenu::onRedraw(draw_mode_t what) { - #define GRID_ROWS 10 - #define GRID_COLS 2 - - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)) - .tag(0); - } - - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.cmd(COLOR_RGB(bg_text_enabled)) - .font(font_large).text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_MAIN)) - .colors(normal_btn) - .font(font_medium) - .tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_MOVE_TO_HOME)) - .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_RAISE_PLUNGER)) - .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_RELEASE_XY_AXIS)) - .tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) - .tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BED_TEMPERATURE)) - .tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_INTERFACE)) - .tag(8).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_ADVANCED_SETTINGS)) - .tag(9).button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_MENU)) - .colors(action_btn) - .tag(1).button( BTN_POS(1,10), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); - } - - #undef GRID_COLS - #undef GRID_ROWS -} - -bool MainMenu::onTouchEnd(uint8_t tag) { - using namespace ExtUI; - - const bool e_homed = isAxisPositionKnown(E0); - - switch (tag) { - case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; - case 2: GOTO_SCREEN(BioConfirmHomeXYZ); break; - case 3: SpinnerDialogBox::enqueueAndWait_P(e_homed ? F("G0 E0 F120") : F("G112")); break; - case 4: StatusScreen::unlockMotors(); break; - #ifdef AXIS_LEVELING_COMMANDS - case 5: SpinnerDialogBox::enqueueAndWait_P(F(AXIS_LEVELING_COMMANDS)); break; - #endif - case 6: GOTO_SCREEN(TemperatureScreen); break; - case 7: GOTO_SCREEN(InterfaceSettingsScreen); break; - case 8: GOTO_SCREEN(AdvancedSettingsMenu); break; - case 9: GOTO_SCREEN(AboutScreen); break; - default: - return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h deleted file mode 100644 index 9279fd7df0..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h +++ /dev/null @@ -1,59 +0,0 @@ - -/**************************************************************************** - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/** - * This file was auto-generated using "svg2cpp.py" - * - * The encoding consists of x,y pairs with the min and max scaled to - * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the - * start of a new closed path. - */ - -#pragma once - -constexpr float x_min = 0.000000; -constexpr float x_max = 480.000000; -constexpr float y_min = 0.000000; -constexpr float y_max = 272.000000; - -const PROGMEM uint16_t z_neg[] = {0x7950, 0x51EA, 0x824E, 0x51EA, 0x824E, 0x71E2, 0x86CD, 0x71E2, 0x7DCF, 0x81DF, 0x74D1, 0x71E2, 0x7950, 0x71E2, 0x7950, 0x51EA}; -const PROGMEM uint16_t z_pos[] = {0x7950, 0x41EE, 0x824E, 0x41EE, 0x824E, 0x21F5, 0x86CD, 0x21F5, 0x7DCF, 0x11F9, 0x74D0, 0x21F5, 0x7950, 0x21F5, 0x7950, 0x41EE}; -const PROGMEM uint16_t y_neg[] = {0x3479, 0x56CF, 0x3EC6, 0x56CF, 0x3747, 0x7281, 0x3C6D, 0x7281, 0x2E61, 0x8059, 0x27D4, 0x7281, 0x2CFA, 0x7281, 0x3479, 0x56CF}; -const PROGMEM uint16_t y_pos[] = {0x3BF9, 0x3B1D, 0x4645, 0x3B1D, 0x4DC4, 0x1F6B, 0x52EB, 0x1F6B, 0x4C5E, 0x1192, 0x3E52, 0x1F6B, 0x4378, 0x1F6B, 0x3BF9, 0x3B1D}; -const PROGMEM uint16_t x_neg[] = {0x350E, 0x4209, 0x314E, 0x4FE2, 0x1CB5, 0x4FE2, 0x1AD6, 0x56CF, 0x1449, 0x48F6, 0x2255, 0x3B1D, 0x2075, 0x4209, 0x350E, 0x4209}; -const PROGMEM uint16_t x_pos[] = {0x498C, 0x4209, 0x45CC, 0x4FE2, 0x5A65, 0x4FE2, 0x5885, 0x56CF, 0x6691, 0x48F6, 0x6004, 0x3B1D, 0x5E25, 0x4209, 0x498C, 0x4209}; -const PROGMEM uint16_t syringe_fluid[] = {0xB4E9, 0x78BE, 0xBB12, 0x7C44, 0xBDE3, 0x7C44, 0xC426, 0x78BE, 0xC426, 0x250D, 0xB4E9, 0x250D, 0xB4E9, 0x78BE}; -const PROGMEM uint16_t syringe[] = {0xB8AD, 0x6BB1, 0xB8AD, 0x6E0C, 0xBE02, 0x6E0C, 0xBE02, 0x6BB1, 0xFFFF, 0xB8AD, 0x6248, 0xB8AD, 0x64A2, 0xBE02, 0x64A2, 0xBE02, 0x6248, 0xFFFF, 0xB8AD, 0x58DF, 0xB8AD, 0x5B39, 0xBE02, 0x5B39, 0xBE02, 0x58DF, 0xFFFF, 0xB8AD, 0x4F75, 0xB8AD, 0x51D0, 0xBE02, 0x51D0, 0xBE02, 0x4F75, 0xFFFF, 0xB8AD, 0x460C, 0xB8AD, 0x4866, 0xBE02, 0x4866, 0xBE02, 0x460C, 0xFFFF, 0xB8AD, 0x3CA3, 0xB8AD, 0x3EFD, 0xBE02, 0x3EFD, 0xBE02, 0x3CA3, 0xFFFF, 0xB8AD, 0x3339, 0xB8AD, 0x3594, 0xBE02, 0x3594, 0xBE02, 0x3339, 0xFFFF, 0xB396, 0x110A, 0xB396, 0x1818, 0xB995, 0x1818, 0xB995, 0x22AD, 0xB396, 0x22AD, 0xB396, 0x7ADA, 0xB995, 0x7E61, 0xB995, 0x88F5, 0xBB95, 0x88F5, 0xBB95, 0xA8B4, 0xBD94, 0xAC3B, 0xBD94, 0x88F5, 0xBF94, 0x88F5, 0xBF94, 0x7E61, 0xC593, 0x7ADA, 0xC593, 0x22AD, 0xBF94, 0x22AD, 0xBF94, 0x1818, 0xC593, 0x1818, 0xC593, 0x110A, 0xFFFF, 0xBB95, 0x1818, 0xBD94, 0x1818, 0xBD94, 0x22AD, 0xBB95, 0x22AD, 0xBB95, 0x1818, 0xFFFF, 0xB596, 0x2634, 0xC393, 0x2634, 0xC393, 0x7753, 0xBD94, 0x7ADA, 0xBB95, 0x7ADA, 0xB596, 0x7753, 0xB596, 0x2634}; -const PROGMEM uint16_t syringe_outline[] = {0xB396, 0x110A, 0xB396, 0x1818, 0xB995, 0x1818, 0xB995, 0x22AD, 0xB396, 0x22AD, 0xB396, 0x7ADA, 0xB995, 0x7E61, 0xB995, 0x88F5, 0xBB95, 0x88F5, 0xBB95, 0xA8B4, 0xBD94, 0xAC3B, 0xBD94, 0x88F5, 0xBF94, 0x88F5, 0xBF94, 0x7E61, 0xC593, 0x7ADA, 0xC593, 0x22AD, 0xBF94, 0x22AD, 0xBF94, 0x1818, 0xC593, 0x1818, 0xC593, 0x110A, 0xB396, 0x110A}; -const PROGMEM uint16_t padlock[] = {0x3FE3, 0x2A04, 0x3D34, 0x2AF9, 0x3AFF, 0x2D93, 0x397D, 0x316D, 0x38E8, 0x3626, 0x38E8, 0x3A14, 0x39B3, 0x3C8F, 0x3B50, 0x3C8F, 0x3C1C, 0x3A14, 0x3C1C, 0x363C, 0x3C6B, 0x33A9, 0x3D3A, 0x3193, 0x3E6C, 0x302D, 0x3FE3, 0x2FAA, 0x415A, 0x302D, 0x428C, 0x3192, 0x435B, 0x33A8, 0x43AB, 0x363C, 0x43AB, 0x4492, 0x38C3, 0x4492, 0x3741, 0x45AC, 0x36A1, 0x4856, 0x36A1, 0x5C41, 0x3741, 0x5EEC, 0x38C3, 0x6005, 0x4703, 0x6005, 0x4886, 0x5EEC, 0x4925, 0x5C41, 0x4925, 0x4856, 0x4886, 0x45AC, 0x4703, 0x4492, 0x46DE, 0x362B, 0x4649, 0x316D, 0x44C7, 0x2D92, 0x4292, 0x2AF9}; -const PROGMEM uint16_t home_z[] = {0x80BB, 0x2B43, 0x712C, 0x46B9, 0x750F, 0x46B9, 0x750F, 0x622F, 0x7CD7, 0x622F, 0x7CD7, 0x5474, 0x849F, 0x5474, 0x849F, 0x622F, 0x8C67, 0x622F, 0x8C67, 0x46B9, 0x904B, 0x46B9, 0x8A48, 0x3C1D, 0x8A48, 0x2ECD, 0x8664, 0x2ECD, 0x8664, 0x3540}; -const PROGMEM uint16_t usb_btn[] = {0x0558, 0xC0D6, 0x3BDB, 0xC0D6, 0x3BDB, 0xF431, 0x0558, 0xF431, 0x0558, 0xC0D6}; -const PROGMEM uint16_t menu_btn[] = {0x416B, 0xC0D6, 0x77EE, 0xC0D6, 0x77EE, 0xF431, 0x416B, 0xF431, 0x416B, 0xC0D6}; -const PROGMEM uint16_t e_pos[] = {0xE04E, 0x5E7B, 0xE94C, 0x5E7B, 0xE94C, 0x7E74, 0xEDCB, 0x7E74, 0xE4CD, 0x8E70, 0xDBCF, 0x7E74, 0xE04E, 0x7E74, 0xE04E, 0x5E7B}; -const PROGMEM uint16_t e_neg[] = {0xE04E, 0x4E7F, 0xE94C, 0x4E7F, 0xE94C, 0x2E87, 0xEDCB, 0x2E87, 0xE4CD, 0x1E8A, 0xDBCF, 0x2E87, 0xE04E, 0x2E87, 0xE04E, 0x4E7F}; -const PROGMEM uint16_t home_e[] = {0xD705, 0x3885, 0xC775, 0x53FB, 0xCB59, 0x53FB, 0xCB59, 0x6F71, 0xD321, 0x6F71, 0xD321, 0x61B6, 0xDAE9, 0x61B6, 0xDAE9, 0x6F71, 0xE2B1, 0x6F71, 0xE2B1, 0x53FB, 0xE695, 0x53FB, 0xE092, 0x495F, 0xE092, 0x3C0E, 0xDCAE, 0x3C0E, 0xDCAE, 0x4281}; -const PROGMEM uint16_t fine_label[] = {0x0D92, 0x9444, 0x5211, 0x9444, 0x5211, 0xA9EA, 0x0D92, 0xA9EA}; -const PROGMEM uint16_t fine_toggle[] = {0x56E7, 0x9444, 0x8007, 0x9444, 0x8007, 0xA9EA, 0x56E7, 0xA9EA}; -const PROGMEM uint16_t h1_temp[] = {0x9C2B, 0xDD3B, 0xBBDE, 0xDD3B, 0xBBDE, 0xFA57, 0x9C2B, 0xFA57}; -const PROGMEM uint16_t h1_label[] = {0x9C2B, 0xBE8F, 0xBBDC, 0xBE8F, 0xBBDC, 0xDBAA, 0x9C2B, 0xDBAA}; -const PROGMEM uint16_t h0_temp[] = {0x7BD0, 0xDD3B, 0x9B83, 0xDD3B, 0x9B83, 0xFA57, 0x7BD0, 0xFA57}; -const PROGMEM uint16_t h0_label[] = {0x7BD0, 0xBE8F, 0x9B83, 0xBE8F, 0x9B83, 0xDBAA, 0x7BD0, 0xDBAA}; -const PROGMEM uint16_t h2_temp[] = {0xBC86, 0xDD3B, 0xDC39, 0xDD3B, 0xDC39, 0xFA57, 0xBC86, 0xFA57}; -const PROGMEM uint16_t h2_label[] = {0xBC86, 0xBE8F, 0xDC37, 0xBE8F, 0xDC37, 0xDBAA, 0xBC86, 0xDBAA}; -const PROGMEM uint16_t h3_temp[] = {0xDCE2, 0xDD0D, 0xFC95, 0xDD0D, 0xFC95, 0xFA28, 0xDCE2, 0xFA28}; -const PROGMEM uint16_t h3_label[] = {0xDCE2, 0xBE60, 0xFC92, 0xBE60, 0xFC92, 0xDB7C, 0xDCE2, 0xDB7C}; -const PROGMEM uint16_t actual_temp[] = {0xCDF6, 0xD037, 0xF7CA, 0xD037, 0xF7CA, 0xF424, 0xCDF6, 0xF424}; -const PROGMEM uint16_t bed_icon[] = {0xCDF6, 0xA5CC, 0xF7CA, 0xA5CC, 0xF7CA, 0xC9B9, 0xCDF6, 0xC9B9}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h deleted file mode 100644 index f03e3413f8..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h +++ /dev/null @@ -1,52 +0,0 @@ - -/**************************************************************************** - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/** - * This file was auto-generated using "svg2cpp.py" - * - * The encoding consists of x,y pairs with the min and max scaled to - * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the - * start of a new closed path. - */ - -#pragma once - -constexpr float x_min = 0.000000; -constexpr float x_max = 272.000000; -constexpr float y_min = 0.000000; -constexpr float y_max = 480.000000; - -const PROGMEM uint16_t z_neg[] = {0xC9B1, 0x96B3, 0xD990, 0x96B3, 0xD990, 0xA8D0, 0xE17F, 0xA8D0, 0xD1A0, 0xB1DF, 0xC1C2, 0xA8D0, 0xC9B1, 0xA8D0, 0xC9B1, 0x96B3}; -const PROGMEM uint16_t z_pos[] = {0xC9B1, 0x8DA4, 0xD990, 0x8DA4, 0xD990, 0x7B86, 0xE17F, 0x7B86, 0xD1A0, 0x7277, 0xC1C2, 0x7B86, 0xC9B1, 0x7B86, 0xC9B1, 0x8DA4}; -const PROGMEM uint16_t y_neg[] = {0x5037, 0x9979, 0x6264, 0x9979, 0x5529, 0xA92A, 0x5E3F, 0xA92A, 0x4575, 0xB103, 0x39E6, 0xA92A, 0x42FC, 0xA92A, 0x5037, 0x9979}; -const PROGMEM uint16_t y_pos[] = {0x5D72, 0x89C7, 0x6F9F, 0x89C7, 0x7CDA, 0x7A15, 0x85F0, 0x7A15, 0x7A61, 0x723D, 0x6197, 0x7A15, 0x6AAD, 0x7A15, 0x5D72, 0x89C7}; -const PROGMEM uint16_t x_neg[] = {0x513D, 0x8DB3, 0x4AA0, 0x958C, 0x2647, 0x958C, 0x22F8, 0x9979, 0x1769, 0x91A0, 0x3033, 0x89C7, 0x2CE4, 0x8DB3, 0x513D, 0x8DB3}; -const PROGMEM uint16_t x_pos[] = {0x7566, 0x8DB3, 0x6EC9, 0x958C, 0x9322, 0x958C, 0x8FD4, 0x9979, 0xA89E, 0x91A0, 0x9D0E, 0x89C7, 0x99C0, 0x8DB3, 0x7566, 0x8DB3}; -const PROGMEM uint16_t syringe_fluid[] = {0x7D1D, 0x4A0F, 0x87FC, 0x4C0E, 0x8CF4, 0x4C0E, 0x9801, 0x4A0F, 0x9801, 0x1AA2, 0x7D1D, 0x1AA2, 0x7D1D, 0x4A0F}; -const PROGMEM uint16_t syringe[] = {0x83C2, 0x42AA, 0x83C2, 0x43FF, 0x8D2C, 0x43FF, 0x8D2C, 0x42AA, 0xFFFF, 0x83C2, 0x3D54, 0x83C2, 0x3EAA, 0x8D2C, 0x3EAA, 0x8D2C, 0x3D54, 0xFFFF, 0x83C2, 0x37FF, 0x83C2, 0x3954, 0x8D2C, 0x3954, 0x8D2C, 0x37FF, 0xFFFF, 0x83C2, 0x32AA, 0x83C2, 0x33FF, 0x8D2C, 0x33FF, 0x8D2C, 0x32AA, 0xFFFF, 0x83C2, 0x2D54, 0x83C2, 0x2EAA, 0x8D2C, 0x2EAA, 0x8D2C, 0x2D54, 0xFFFF, 0x83C2, 0x27FF, 0x83C2, 0x2955, 0x8D2C, 0x2955, 0x8D2C, 0x27FF, 0xFFFF, 0x83C2, 0x22AA, 0x83C2, 0x23FF, 0x8D2C, 0x23FF, 0x8D2C, 0x22AA, 0xFFFF, 0x7AC7, 0x0F4B, 0x7AC7, 0x134A, 0x855B, 0x134A, 0x855B, 0x1949, 0x7AC7, 0x1949, 0x7AC7, 0x4B40, 0x855B, 0x4D40, 0x855B, 0x533F, 0x88E2, 0x533F, 0x88E2, 0x653C, 0x8C69, 0x673C, 0x8C69, 0x533F, 0x8FF0, 0x533F, 0x8FF0, 0x4D40, 0x9A85, 0x4B40, 0x9A85, 0x1949, 0x8FF0, 0x1949, 0x8FF0, 0x134A, 0x9A85, 0x134A, 0x9A85, 0x0F4B, 0xFFFF, 0x88E2, 0x134A, 0x8C69, 0x134A, 0x8C69, 0x1949, 0x88E2, 0x1949, 0x88E2, 0x134A, 0xFFFF, 0x7E4D, 0x1B49, 0x96FE, 0x1B49, 0x96FE, 0x4941, 0x8C69, 0x4B40, 0x88E2, 0x4B40, 0x7E4D, 0x4941, 0x7E4D, 0x1B49}; -const PROGMEM uint16_t syringe_outline[] = {0x7AC7, 0x0F4B, 0x7AC7, 0x134A, 0x855B, 0x134A, 0x855B, 0x1949, 0x7AC7, 0x1949, 0x7AC7, 0x4B40, 0x855B, 0x4D40, 0x855B, 0x533F, 0x88E2, 0x533F, 0x88E2, 0x653C, 0x8C69, 0x673C, 0x8C69, 0x533F, 0x8FF0, 0x533F, 0x8FF0, 0x4D40, 0x9A85, 0x4B40, 0x9A85, 0x1949, 0x8FF0, 0x1949, 0x8FF0, 0x134A, 0x9A85, 0x134A, 0x9A85, 0x0F4B, 0x7AC7, 0x0F4B}; -const PROGMEM uint16_t padlock[] = {0x645A, 0x8017, 0x5F9E, 0x80A1, 0x5BBA, 0x821B, 0x5911, 0x844A, 0x580A, 0x86F7, 0x580A, 0x8931, 0x5970, 0x8A98, 0x5C49, 0x8A98, 0x5DB0, 0x8931, 0x5DB0, 0x8703, 0x5E3C, 0x858E, 0x5FAA, 0x845F, 0x61C5, 0x8394, 0x645A, 0x834A, 0x66F0, 0x8394, 0x690C, 0x845F, 0x6A7A, 0x858D, 0x6B07, 0x8703, 0x6B07, 0x8F23, 0x57C8, 0x8F23, 0x551E, 0x8FC3, 0x5404, 0x9145, 0x5404, 0x9C8F, 0x551E, 0x9E11, 0x57C8, 0x9EB1, 0x70EE, 0x9EB1, 0x7398, 0x9E11, 0x74B2, 0x9C8F, 0x74B2, 0x9145, 0x7398, 0x8FC3, 0x70EE, 0x8F23, 0x70AC, 0x86FA, 0x6FA5, 0x844A, 0x6CFD, 0x821B, 0x6917, 0x80A1}; -const PROGMEM uint16_t home_z[] = {0xD6C9, 0x80CC, 0xBB53, 0x905B, 0xC231, 0x905B, 0xC231, 0x9FEB, 0xCFEC, 0x9FEB, 0xCFEC, 0x9823, 0xDDA7, 0x9823, 0xDDA7, 0x9FEB, 0xEB62, 0x9FEB, 0xEB62, 0x905B, 0xF240, 0x905B, 0xE7A3, 0x8A58, 0xE7A3, 0x82CD, 0xE0C6, 0x82CD, 0xE0C6, 0x8674}; -const PROGMEM uint16_t home_e[] = {0xB94F, 0x25AA, 0x9DD8, 0x353A, 0xA4B6, 0x353A, 0xA4B6, 0x44C9, 0xB271, 0x44C9, 0xB271, 0x3D02, 0xC02C, 0x3D02, 0xC02C, 0x44C9, 0xCDE7, 0x44C9, 0xCDE7, 0x353A, 0xD4C5, 0x353A, 0xCA28, 0x2F36, 0xCA28, 0x27AB, 0xC34B, 0x27AB, 0xC34B, 0x2B53}; -const PROGMEM uint16_t bed_icon[] = {0x1764, 0x2C4C, 0x6135, 0x2C4C, 0x6135, 0x40A8, 0x1764, 0x40A8}; -const PROGMEM uint16_t actual_temp[] = {0x1764, 0x466F, 0x6135, 0x466F, 0x6135, 0x5ACB, 0x1764, 0x5ACB}; -const PROGMEM uint16_t target_temp[] = {0x1764, 0x1228, 0x6135, 0x1228, 0x6135, 0x2684, 0x1764, 0x2684}; -const PROGMEM uint16_t fine_label[] = {0x1AA7, 0xC6D2, 0x9387, 0xC6D2, 0x9387, 0xD316, 0x1AA7, 0xD316}; -const PROGMEM uint16_t fine_toggle[] = {0x9C10, 0xC6D2, 0xE4A3, 0xC6D2, 0xE4A3, 0xD316, 0x9C10, 0xD316}; -const PROGMEM uint16_t usb_btn[] = {0x0B68, 0xE880, 0x7B1A, 0xE880, 0x7B1A, 0xF94B, 0x0B68, 0xF94B, 0x0B68, 0xE880}; -const PROGMEM uint16_t menu_btn[] = {0x84E3, 0xE880, 0xF495, 0xE880, 0xF495, 0xF94B, 0x84E3, 0xF94B, 0x84E3, 0xE880}; -const PROGMEM uint16_t e_pos[] = {0xC9B1, 0x3B2D, 0xD990, 0x3B2D, 0xD990, 0x4D4B, 0xE17F, 0x4D4B, 0xD1A0, 0x565A, 0xC1C2, 0x4D4B, 0xC9B1, 0x4D4B, 0xC9B1, 0x3B2D}; -const PROGMEM uint16_t e_neg[] = {0xC9B1, 0x321E, 0xD990, 0x321E, 0xD990, 0x2000, 0xE17F, 0x2000, 0xD1A0, 0x16F1, 0xC1C2, 0x2000, 0xC9B1, 0x2000, 0xC9B1, 0x321E}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp deleted file mode 100644 index c5e26da98a..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/******************************* - * bio_printing_dialog_box.cpp * - *******************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) - -#include "screens.h" - -#include "../ftdi_eve_lib/extras/circular_progress.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -#define GRID_COLS 2 -#define GRID_ROWS 9 - -void BioPrintingDialogBox::draw_status_message(draw_mode_t what, const char* message) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(COLOR_RGB(bg_text_enabled)) - .tag(0); - draw_text_box(cmd, BTN_POS(1,2), BTN_SIZE(2,2), message, OPT_CENTER, font_large); - } -} - -void BioPrintingDialogBox::draw_progress(draw_mode_t what) { - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.font(font_large) - .text(BTN_POS(1,1), BTN_SIZE(2,2), isPrinting() ? F("Printing...") : F("Finished.")) - .tag(1) - .font(font_xlarge); - - draw_circular_progress(cmd, BTN_POS(1,4), BTN_SIZE(2,3), getProgress_percent(), theme_dark, theme_darkest); - } -} - -void BioPrintingDialogBox::draw_time_remaining(draw_mode_t what) { - if (what & FOREGROUND) { - const uint32_t elapsed = getProgress_seconds_elapsed(); - const uint8_t hrs = elapsed/3600; - const uint8_t min = (elapsed/60)%60; - - char time_str[10]; - sprintf_P(time_str, PSTR("%02dh %02dm"), hrs, min); - - CommandProcessor cmd; - cmd.font(font_large) - .text(BTN_POS(1,7), BTN_SIZE(2,2), time_str); - } -} - -void BioPrintingDialogBox::draw_interaction_buttons(draw_mode_t what) { - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(font_medium) - .colors(isPrinting() ? action_btn : normal_btn) - .tag(2).button(BTN_POS(1,9), BTN_SIZE(1,1), F("Menu")) - #if ENABLED(SDSUPPORT) - .enabled(isPrinting() ? isPrintingFromMedia() : 1) - #else - .enabled(isPrinting() ? 0 : 1) - #endif - .tag(3) - .colors(isPrinting() ? normal_btn : action_btn) - .button( BTN_POS(2,9), BTN_SIZE(1,1), isPrinting() ? F("Cancel") : F("Back")); - } -} - -void BioPrintingDialogBox::onRedraw(draw_mode_t what) { - if (what & FOREGROUND) { - draw_progress(FOREGROUND); - draw_time_remaining(FOREGROUND); - draw_interaction_buttons(FOREGROUND); - } -} - -bool BioPrintingDialogBox::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_SCREEN(FeedratePercentScreen); break; - case 2: GOTO_SCREEN(TuneMenu); break; - case 3: - if (isPrinting()) - GOTO_SCREEN(ConfirmAbortPrintDialogBox); - else - GOTO_SCREEN(StatusScreen); - break; - default: return false; - } - return true; -} - -void BioPrintingDialogBox::setStatusMessage(progmem_str message) { - char buff[strlen_P((const char*)message)+1]; - strcpy_P(buff, (const char*) message); - setStatusMessage(buff); -} - -void BioPrintingDialogBox::setStatusMessage(const char* message) { - CommandProcessor cmd; - cmd.cmd(CMD_DLSTART) - .cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)); - - draw_status_message(BACKGROUND, message); - draw_progress(BACKGROUND); - draw_time_remaining(BACKGROUND); - draw_interaction_buttons(BACKGROUND); - storeBackground(); - - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("New status message: ", message); - #endif - - if (AT_SCREEN(BioPrintingDialogBox)) - current_screen.onRefresh(); -} - -void BioPrintingDialogBox::onIdle() { - reset_menu_timeout(); - if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { - onRefresh(); - refresh_timer.start(); - } - BaseScreen::onIdle(); -} - -void BioPrintingDialogBox::show() { - GOTO_SCREEN(BioPrintingDialogBox); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp deleted file mode 100644 index e881995f2e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ /dev/null @@ -1,462 +0,0 @@ -/************************* - * bio_status_screen.cpp * - *************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2019 - Cocoa Press * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) - -#include "screens.h" - -#include "../ftdi_eve_lib/extras/poly_ui.h" - -#if ENABLED(TOUCH_UI_COCOA_PRESS) - #include "cocoa_press_ui.h" -#elif ENABLED(TOUCH_UI_PORTRAIT) - #include "bio_printer_ui_portrait.h" -#else - #include "bio_printer_ui_landscape.h" -#endif - -#define GRID_COLS 2 -#define GRID_ROWS 9 - -#define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) - -const uint8_t shadow_depth = 5; -const float max_speed = 1.00; -const float min_speed = 0.02; -const float emax_speed = 2.00; -const float emin_speed = 0.70; - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -float StatusScreen::increment; -bool StatusScreen::jog_xy; -bool StatusScreen::fine_motion; - -void StatusScreen::unlockMotors() { - injectCommands_P(PSTR("M84 XY")); - jog_xy = false; -} - -void StatusScreen::draw_temperature(draw_mode_t what) { - CommandProcessor cmd; - PolyUI ui(cmd, what); - - int16_t x, y, h, v; - - cmd.tag(15); - - if (what & BACKGROUND) { - cmd.cmd(COLOR_RGB(bg_color)); - - #if ENABLED(TOUCH_UI_LULZBOT_BIO) - // The LulzBot Bio shows the temperature for - // the bed. - - #ifdef TOUCH_UI_PORTRAIT - // Draw touch surfaces - ui.bounds(POLY(target_temp), x, y, h, v); - cmd.rectangle(x, y, h, v); - ui.bounds(POLY(actual_temp), x, y, h, v); - cmd.rectangle(x, y, h, v); - #else - ui.bounds(POLY(bed_temp), x, y, h, v); - cmd.rectangle(x, y, h, v); - #endif - ui.bounds(POLY(bed_icon), x, y, h, v); - cmd.rectangle(x, y, h, v); - - // Draw bed icon - cmd.cmd(BITMAP_SOURCE(Bed_Heat_Icon_Info)) - .cmd(BITMAP_LAYOUT(Bed_Heat_Icon_Info)) - .cmd(BITMAP_SIZE (Bed_Heat_Icon_Info)) - .cmd(COLOR_RGB(shadow_rgb)) - .icon (x + 2, y + 2, h, v, Bed_Heat_Icon_Info, icon_scale * 2) - .cmd(COLOR_RGB(bg_text_enabled)) - .icon (x, y, h, v, Bed_Heat_Icon_Info, icon_scale * 2); - #elif ENABLED(TOUCH_UI_COCOA_PRESS) && DISABLED(TOUCH_UI_PORTRAIT) - // The CocoaPress shows the temperature for two - // heating zones, but has no bed temperature - - cmd.cmd(COLOR_RGB(bg_text_enabled)); - cmd.font(font_xsmall); - - ui.bounds(POLY(h0_label), x, y, h, v); - cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_1)); - - ui.bounds(POLY(h1_label), x, y, h, v); - cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_2)); - - ui.bounds(POLY(h2_label), x, y, h, v); - cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_3)); - - ui.bounds(POLY(h3_label), x, y, h, v); - cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHAMBER)); - #else - UNUSED(x); - UNUSED(y); - UNUSED(h); - UNUSED(v); - #endif - - #ifdef TOUCH_UI_USE_UTF8 - load_utf8_bitmaps(cmd); // Restore font bitmap handles - #endif - } - - if (what & FOREGROUND) { - char str[15]; - cmd.cmd(COLOR_RGB(bg_text_enabled)); - #if ENABLED(TOUCH_UI_LULZBOT_BIO) - cmd.font(font_medium); - - #ifdef TOUCH_UI_PORTRAIT - if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) - format_temp(str, getTargetTemp_celsius(BED)); - else - strcpy_P(str, GET_TEXT(MSG_BED)); - - ui.bounds(POLY(target_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - - format_temp(str, getActualTemp_celsius(BED)); - ui.bounds(POLY(actual_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - #else - if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) - format_temp_and_temp(str, getActualTemp_celsius(BED), getTargetTemp_celsius(BED)); - else - format_temp_and_idle(str, getActualTemp_celsius(BED)); - - ui.bounds(POLY(bed_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - #endif - - #elif ENABLED(TOUCH_UI_COCOA_PRESS) && DISABLED(TOUCH_UI_PORTRAIT) - // The CocoaPress shows the temperature for two - // heating zones, but has no bed temperature - - cmd.font(font_large); - - if (!isHeaterIdle(E0) && getTargetTemp_celsius(E0) > 0) - format_temp_and_temp(str, getActualTemp_celsius(E0), getTargetTemp_celsius(E0)); - else - format_temp_and_idle(str, getActualTemp_celsius(E0)); - - ui.bounds(POLY(h0_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - - if (!isHeaterIdle(E1) && getTargetTemp_celsius(E1) > 0) - format_temp_and_temp(str, getActualTemp_celsius(E1), getTargetTemp_celsius(E1)); - else - format_temp_and_idle(str, getActualTemp_celsius(E1)); - - ui.bounds(POLY(h1_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - - if (!isHeaterIdle(E2) && getTargetTemp_celsius(E2) > 0) - format_temp_and_temp(str, getActualTemp_celsius(E2), getTargetTemp_celsius(E2)); - else - format_temp_and_idle(str, getActualTemp_celsius(E2)); - - ui.bounds(POLY(h2_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - - if (!isHeaterIdle(CHAMBER) && getTargetTemp_celsius(CHAMBER) > 0) - format_temp_and_temp(str, getActualTemp_celsius(CHAMBER), getTargetTemp_celsius(CHAMBER)); - else - format_temp_and_idle(str, getActualTemp_celsius(CHAMBER)); - - ui.bounds(POLY(h3_temp), x, y, h, v); - cmd.text(x, y, h, v, str); - #else - UNUSED(str); - #endif - } -} - -void StatusScreen::draw_syringe(draw_mode_t what) { - int16_t x, y, h, v; - const float fill_level = ( - #ifdef E_MAX_POS - 1.0 - min(1.0, max(0.0, getAxisPosition_mm(E0) / E_MAX_POS)) - #else - 0.75 - #endif - ); - const bool e_homed = TERN0(TOUCH_UI_LULZBOT_BIO, isAxisPositionKnown(E0)); - - CommandProcessor cmd; - PolyUI ui(cmd, what); - - if (what & BACKGROUND) { - // Paint the shadow for the syringe - ui.color(shadow_rgb); - ui.shadow(POLY(syringe_outline), shadow_depth); - } - - if (what & FOREGROUND && e_homed) { - // Paint the syringe icon - ui.color(syringe_rgb); - ui.fill(POLY(syringe_outline)); - - ui.color(fluid_rgb); - ui.bounds(POLY(syringe_fluid), x, y, h, v); - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(SCISSOR_XY(x,y + v * (1.0 - fill_level))); - cmd.cmd(SCISSOR_SIZE(h, v * fill_level)); - ui.fill(POLY(syringe_fluid), false); - cmd.cmd(RESTORE_CONTEXT()); - - ui.color(stroke_rgb); - ui.fill(POLY(syringe)); - } -} - -void StatusScreen::draw_arrows(draw_mode_t what) { - const bool e_homed = TERN1(TOUCH_UI_LULZBOT_BIO, isAxisPositionKnown(E0)), - z_homed = isAxisPositionKnown(Z); - - CommandProcessor cmd; - PolyUI ui(cmd, what); - - ui.button_fill (fill_rgb); - ui.button_stroke(stroke_rgb, 28); - ui.button_shadow(shadow_rgb, shadow_depth); - - constexpr uint8_t style = TERN(TOUCH_UI_COCOA_PRESS, PolyUI::FILL | PolyUI::SHADOW, PolyUI::REGULAR); - - if ((what & BACKGROUND) || jog_xy) { - ui.button(1, POLY(x_neg), style); - ui.button(2, POLY(x_pos), style); - ui.button(3, POLY(y_neg), style); - ui.button(4, POLY(y_pos), style); - } - - if ((what & BACKGROUND) || z_homed) { - ui.button(5, POLY(z_neg), style); - ui.button(6, POLY(z_pos), style); - } - - if ((what & BACKGROUND) || e_homed) { - #if DISABLED(TOUCH_UI_COCOA_PRESS) - ui.button(7, POLY(e_neg), style); - #endif - ui.button(8, POLY(e_pos), style); - } -} - -void StatusScreen::draw_fine_motion(draw_mode_t what) { - int16_t x, y, h, v; - CommandProcessor cmd; - PolyUI ui(cmd, what); - - cmd.font( - #ifdef TOUCH_UI_PORTRAIT - font_medium - #else - font_small - #endif - ) - .tag(16); - - if (what & BACKGROUND) { - ui.bounds(POLY(fine_label), x, y, h, v); - cmd.cmd(COLOR_RGB(bg_text_enabled)) - .text(x, y, h, v, GET_TEXT_F(MSG_FINE_MOTION)); - } - - if (what & FOREGROUND) { - ui.bounds(POLY(fine_toggle), x, y, h, v); - cmd.colors(ui_toggle) - .toggle2(x, y, h, v, GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), fine_motion); - } -} - -void StatusScreen::draw_overlay_icons(draw_mode_t what) { - const bool e_homed = TERN1(TOUCH_UI_LULZBOT_BIO, isAxisPositionKnown(E0)), - z_homed = isAxisPositionKnown(Z); - - CommandProcessor cmd; - PolyUI ui(cmd, what); - - if (what & FOREGROUND) { - ui.button_fill (TERN(TOUCH_UI_COCOA_PRESS, stroke_rgb, fill_rgb)); - ui.button_stroke(stroke_rgb, 28); - ui.button_shadow(shadow_rgb, shadow_depth); - - constexpr uint8_t style = TERN(TOUCH_UI_COCOA_PRESS, PolyUI::FILL | PolyUI::SHADOW, PolyUI::REGULAR); - if (!jog_xy) ui.button(12, POLY(padlock), style); - if (!e_homed) ui.button(13, POLY(home_e), style); - if (!z_homed) ui.button(14, POLY(home_z), style); - } -} - -void StatusScreen::draw_buttons(draw_mode_t what) { - int16_t x, y, h, v; - - const bool has_media = isMediaInserted() && !isPrintingFromMedia(); - - CommandProcessor cmd; - PolyUI ui(cmd, what); - - ui.bounds(POLY(usb_btn), x, y, h, v); - cmd.font(font_medium) - .colors(normal_btn) - .enabled(has_media) - .colors(has_media ? action_btn : normal_btn) - .tag(9).button(x, y, h, v, - isPrintingFromMedia() ? - GET_TEXT_F(MSG_PRINTING) : - GET_TEXT_F(MSG_BUTTON_MEDIA) - ); - - ui.bounds(POLY(menu_btn), x, y, h, v); - cmd.colors(!has_media ? action_btn : normal_btn).tag(10).button(x, y, h, v, GET_TEXT_F(MSG_BUTTON_MENU)); -} - -void StatusScreen::loadBitmaps() { - // Load the bitmaps for the status screen - constexpr uint32_t base = ftdi_memory_map::RAM_G; - CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon)); - - // Load fonts for internationalization - #ifdef TOUCH_UI_USE_UTF8 - load_utf8_data(base + UTF8_FONT_OFFSET); - #endif -} - -void StatusScreen::onRedraw(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .tag(0); - } - - draw_syringe(what); - draw_temperature(what); - draw_arrows(what); - draw_overlay_icons(what); - draw_buttons(what); - draw_fine_motion(what); -} - -bool StatusScreen::onTouchStart(uint8_t) { - increment = 0; - return true; -} - -bool StatusScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - case 2: - case 3: - case 4: - case 12: - if (!jog_xy) { - jog_xy = true; - injectCommands_P(PSTR("M17")); - } - jog({ 0, 0, 0 }); - break; - case 5: - case 6: - jog({ 0, 0, 0 }); - break; - case 9: GOTO_SCREEN(FilesScreen); break; - case 10: GOTO_SCREEN(MainMenu); break; - #if ENABLED(TOUCH_UI_LULZBOT_BIO) - case 13: GOTO_SCREEN(BioConfirmHomeE); break; - #endif - case 14: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break; - case 15: GOTO_SCREEN(TemperatureScreen); break; - case 16: fine_motion = !fine_motion; break; - default: return false; - } - // If a passcode is enabled, the LockScreen will prevent the - // user from proceeding. - LockScreen::check_passcode(); - return true; -} - -bool StatusScreen::onTouchHeld(uint8_t tag) { - if (tag >= 1 && tag <= 4 && !jog_xy) return false; - const float s = min_speed + (fine_motion ? 0 : (max_speed - min_speed) * sq(increment)); - switch (tag) { - case 1: jog({-s, 0, 0}); break; - case 2: jog({ s, 0, 0}); break; - case 4: jog({ 0, -s, 0}); break; // NOTE: Y directions inverted because bed rather than needle moves - case 3: jog({ 0, s, 0}); break; - case 5: jog({ 0, 0, -s}); break; - case 6: jog({ 0, 0, s}); break; - case 7: case 8: - { - if (ExtUI::isMoving()) return false; - const feedRate_t feedrate = emin_speed + (fine_motion ? 0 : (emax_speed - emin_speed) * sq(increment)); - const float increment = 0.25 * feedrate * (tag == 7 ? -1 : 1); - MoveAxisScreen::setManualFeedrate(E0, feedrate); - UI_INCREMENT(AxisPosition_mm, E0); - current_screen.onRefresh(); - break; - } - default: - return false; - } - increment = min(1.0f, increment + 0.1f); - return false; -} - -void StatusScreen::setStatusMessage(progmem_str pstr) { - #ifdef TOUCH_UI_LULZBOT_BIO - BioPrintingDialogBox::setStatusMessage(pstr); - #else - UNUSED(pstr); - #endif -} - -void StatusScreen::setStatusMessage(const char * const str) { - #ifdef TOUCH_UI_LULZBOT_BIO - BioPrintingDialogBox::setStatusMessage(str); - #else - UNUSED(str); - #endif -} - -void StatusScreen::onIdle() { - reset_menu_timeout(); - if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { - if (!EventLoop::is_touch_held()) - onRefresh(); - #ifdef TOUCH_UI_LULZBOT_BIO - if (isPrintingFromMedia()) - BioPrintingDialogBox::show(); - #endif - refresh_timer.start(); - } -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp deleted file mode 100644 index 0d8d71b45c..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/********************* - * bio_tune_menu.cpp * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -void TuneMenu::onRedraw(draw_mode_t what) { - #define GRID_ROWS 8 - #define GRID_COLS 2 - - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0) - .font(font_large) - .text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_MENU)); - } - - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(font_medium) - .enabled( isPrinting()).tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_SPEED)) - .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_BED_TEMPERATURE)) - .enabled(TERN_(BABYSTEPPING, true)) - .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_NUDGE_NOZZLE)) - .enabled(!isPrinting()).tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_MOVE_TO_HOME)) - .enabled(!isPrinting()).tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_RAISE_PLUNGER)) - .enabled(!isPrinting()).tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_RELEASE_XY_AXIS)) - .colors(action_btn) .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); - } - #undef GRID_COLS - #undef GRID_ROWS -} - -bool TuneMenu::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - case 2: GOTO_SCREEN(FeedratePercentScreen); break; - case 3: GOTO_SCREEN(TemperatureScreen); break; - case 4: GOTO_SCREEN(NudgeNozzleScreen); break; - case 5: GOTO_SCREEN(BioConfirmHomeXYZ); break; - case 6: SpinnerDialogBox::enqueueAndWait_P(F("G0 E0 F120")); break; - case 7: StatusScreen::unlockMotors(); break; - default: - return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp deleted file mode 100644 index 4ce8f608f1..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/******************* - * boot_screen.cpp * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2019 - Cocoa Press * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -#include "../ftdi_eve_lib/extras/poly_ui.h" -#include "../archim2-flash/flash_storage.h" - -#ifdef SHOW_CUSTOM_BOOTSCREEN - #ifdef TOUCH_UI_PORTRAIT - #include "../theme/bootscreen_logo_portrait.h" - #else - #include "../theme/_bootscreen_landscape.h" - #endif -#else - #ifdef TOUCH_UI_PORTRAIT - #include "../theme/marlin_bootscreen_portrait.h" - #else - #include "../theme/marlin_bootscreen_landscape.h" - #endif -#endif - -using namespace FTDI; -using namespace Theme; - -void BootScreen::onRedraw(draw_mode_t) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(0x000000)); - cmd.cmd(CLEAR(true,true,true)); - - CLCD::turn_on_backlight(); - SoundPlayer::set_volume(255); -} - -void BootScreen::onIdle() { - if (CLCD::is_touching()) { - // If the user is touching the screen at startup, then - // assume the user wants to re-calibrate the screen. - // This gives the user the ability to recover a - // miscalibration that has been stored to EEPROM. - - // Also reset display parameters to defaults, just - // in case the display is borked. - InterfaceSettingsScreen::failSafeSettings(); - - StatusScreen::loadBitmaps(); - StatusScreen::setStatusMessage(GET_TEXT_F(WELCOME_MSG)); - GOTO_SCREEN(TouchCalibrationScreen); - current_screen.forget(); - PUSH_SCREEN(StatusScreen); - } else { - if (!UIFlashStorage::is_valid()) { - StatusScreen::loadBitmaps(); - SpinnerDialogBox::show(GET_TEXT_F(MSG_PLEASE_WAIT)); - UIFlashStorage::format_flash(); - SpinnerDialogBox::hide(); - } - - #if DISABLED(TOUCH_UI_NO_BOOTSCREEN) - if (UIData::animations_enabled()) { - // If there is a startup video in the flash SPI, play - // that, otherwise show a static splash screen. - if (!MediaPlayerScreen::playBootMedia()) - showSplashScreen(); - } - #endif - - StatusScreen::loadBitmaps(); - - #ifdef TOUCH_UI_LULZBOT_BIO - GOTO_SCREEN(BioConfirmHomeXYZ); - current_screen.forget(); - PUSH_SCREEN(StatusScreen); - PUSH_SCREEN(BioConfirmHomeE); - #elif NUM_LANGUAGES > 1 - StatusScreen::setStatusMessage(GET_TEXT_F(WELCOME_MSG)); - GOTO_SCREEN(LanguageMenu); - #else - StatusScreen::setStatusMessage(GET_TEXT_F(WELCOME_MSG)); - GOTO_SCREEN(StatusScreen); - #endif - } -} - -void BootScreen::showSplashScreen() { - CommandProcessor cmd; - cmd.cmd(CMD_DLSTART); - cmd.cmd(CLEAR_COLOR_RGB(LOGO_BACKGROUND)); - cmd.cmd(CLEAR(true,true,true)); - - #define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) - #define LOGO_PAINT_PATH(rgb, path) cmd.cmd(COLOR_RGB(rgb)); ui.fill(POLY(path)); - - PolyUI ui(cmd); - - LOGO_PAINT_PATHS - - cmd.cmd(DL::DL_DISPLAY); - cmd.cmd(CMD_SWAP); - cmd.execute(); - - ExtUI::delay_ms(2500); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp deleted file mode 100644 index 776a9fe5f7..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/************************* - * case_light_screen.cpp * - *************************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Cocoa Press * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, CASE_LIGHT_ENABLE) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void CaseLightScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.heading( GET_TEXT_F(MSG_CASE_LIGHT)); - w.toggle( 2, GET_TEXT_F(MSG_LEDS), getCaseLightState()); - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - w.precision(0).units(GET_TEXT_F(MSG_UNITS_PERCENT)) - .adjuster(10, GET_TEXT_F(MSG_CASE_LIGHT_BRIGHTNESS), getCaseLightBrightness_percent()); - w.precision(0).increments(); - #endif -} - -bool CaseLightScreen::onTouchHeld(uint8_t tag) { - using namespace ExtUI; - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - const float increment = getIncrement(); - #endif - switch (tag) { - case 2: setCaseLightState(!getCaseLightState()); break; - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - case 10: UI_DECREMENT(CaseLightBrightness_percent); break; - case 11: UI_INCREMENT(CaseLightBrightness_percent); break; - #endif - default: - return false; - } - - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp deleted file mode 100644 index 589da9b210..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp +++ /dev/null @@ -1,354 +0,0 @@ -/****************************** - * change_filament_screen.cpp * - ******************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -using namespace ExtUI; -using namespace FTDI; -using namespace Theme; - -#define COOL_TEMP 40 -#define LOW_TEMP 180 -#define MED_TEMP 200 -#define HIGH_TEMP 220 - -/****************** COLOR SCALE ***********************/ - -uint32_t getWarmColor(uint16_t temp, uint16_t cool, uint16_t low, uint16_t med, uint16_t high) { - rgb_t R0, R1, mix; - - float t; - if (temp < cool) { - R0 = cool_rgb; - R1 = low_rgb; - t = 0; - } - else if (temp < low) { - R0 = cool_rgb; - R1 = low_rgb; - t = (float(temp)-cool)/(low-cool); - } - else if (temp < med) { - R0 = low_rgb; - R1 = med_rgb; - t = (float(temp)-low)/(med-low); - } - else if (temp < high) { - R0 = med_rgb; - R1 = high_rgb; - t = (float(temp)-med)/(high-med); - } - else if (temp >= high) { - R0 = med_rgb; - R1 = high_rgb; - t = 1; - } - rgb_t::lerp(t, R0, R1, mix); - return mix; -} - -void ChangeFilamentScreen::drawTempGradient(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { - CommandProcessor cmd; - cmd.cmd(SCISSOR_XY (x, y)) - .cmd(SCISSOR_SIZE (w, h/2)) - .gradient (x, y, high_rgb, x, y+h/2, med_rgb) - .cmd(SCISSOR_XY (x, y+h/2)) - .cmd(SCISSOR_SIZE (w, h/2)) - .gradient (x, y+h/2, med_rgb, x, y+h, low_rgb) - .cmd(SCISSOR_XY ()) - .cmd(SCISSOR_SIZE ()); -} - -void ChangeFilamentScreen::onEntry() { - screen_data.ChangeFilamentScreen.e_tag = ExtUI::getActiveTool() + 10; - screen_data.ChangeFilamentScreen.t_tag = 0; - screen_data.ChangeFilamentScreen.repeat_tag = 0; - screen_data.ChangeFilamentScreen.saved_extruder = getActiveTool(); - #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - screen_data.ChangeFilamentScreen.need_purge = true; - #endif -} - -void ChangeFilamentScreen::onExit() { - setActiveTool(screen_data.ChangeFilamentScreen.saved_extruder, true); -} - -void ChangeFilamentScreen::onRedraw(draw_mode_t what) { - CommandProcessor cmd; - - #ifdef TOUCH_UI_PORTRAIT - #define GRID_COLS 2 - #define GRID_ROWS 11 - #else - #define GRID_COLS 4 - #define GRID_ROWS 6 - #endif - - if (what & BACKGROUND) { - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0) - #ifdef TOUCH_UI_PORTRAIT - .font(font_large) - #else - .font(font_medium) - #endif - .text(BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_EXTRUDER_SELECTION)) - #ifdef TOUCH_UI_PORTRAIT - .text(BTN_POS(1,7), BTN_SIZE(1,1), GET_TEXT_F(MSG_CURRENT_TEMPERATURE)) - #else - .text(BTN_POS(3,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_CURRENT_TEMPERATURE)) - .font(font_small) - #endif - .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_REMOVAL_TEMPERATURE)); - drawTempGradient(BTN_POS(1,4), BTN_SIZE(1,3)); - } - - if (what & FOREGROUND) { - const extruder_t e = getExtruder(); - - char e_str[15]; - if (isHeaterIdle(e)) - format_temp_and_idle(e_str, getActualTemp_celsius(e)); - else - format_temp_and_temp(e_str, getActualTemp_celsius(e), getTargetTemp_celsius(e)); - - const rgb_t tcol = getWarmColor(getActualTemp_celsius(e), COOL_TEMP, LOW_TEMP, MED_TEMP, HIGH_TEMP); - cmd.cmd(COLOR_RGB(tcol)) - .tag(15) - #ifdef TOUCH_UI_PORTRAIT - .rectangle(BTN_POS(2,7), BTN_SIZE(1,1)) - #else - .rectangle(BTN_POS(3,2), BTN_SIZE(2,1)) - #endif - .cmd(COLOR_RGB(tcol.luminance() > 128 ? 0x000000 : 0xFFFFFF)) - .font(font_medium) - #ifdef TOUCH_UI_PORTRAIT - .text(BTN_POS(2,7), BTN_SIZE(1,1), e_str) - #else - .text(BTN_POS(3,2), BTN_SIZE(2,1), e_str) - #endif - .colors(normal_btn); - - const bool t_ok = getActualTemp_celsius(e) > getSoftenTemp() - 10; - - if (screen_data.ChangeFilamentScreen.t_tag && !t_ok) { - cmd.text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(MSG_HEATING)); - } else if (getActualTemp_celsius(e) > 100) { - cmd.cmd(COLOR_RGB(0xFF0000)) - .text(BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_CAUTION)) - .colors(normal_btn) - .text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(MSG_HOT)); - } - - #define TOG_STYLE(A) colors(A ? action_btn : normal_btn) - - const bool tog2 = screen_data.ChangeFilamentScreen.t_tag == 2; - const bool tog3 = screen_data.ChangeFilamentScreen.t_tag == 3; - const bool tog4 = screen_data.ChangeFilamentScreen.t_tag == 4; - const bool tog10 = screen_data.ChangeFilamentScreen.e_tag == 10; - #if HAS_MULTI_HOTEND - const bool tog11 = screen_data.ChangeFilamentScreen.e_tag == 11; - #endif - - #ifdef TOUCH_UI_PORTRAIT - cmd.font(font_large) - #else - cmd.font(font_medium) - #endif - .TOG_STYLE(tog10) - .tag(10) .button (BTN_POS(1,2), BTN_SIZE(1,1), F("1")) - #if HOTENDS < 2 - .enabled(false) - #else - .TOG_STYLE(tog11) - #endif - .tag(11) .button (BTN_POS(2,2), BTN_SIZE(1,1), F("2")); - - if (!t_ok) reset_menu_timeout(); - - const bool tog7 = screen_data.ChangeFilamentScreen.repeat_tag == 7; - const bool tog8 = screen_data.ChangeFilamentScreen.repeat_tag == 8; - - - cmd.font( - #ifdef TOUCH_UI_PORTRAIT - font_large - #else - font_small - #endif - ); - - { - char str[30]; - - format_temp(str, LOW_TEMP); - cmd.tag(2) .TOG_STYLE(tog2) .button (BTN_POS(2,6), BTN_SIZE(1,1), str); - - format_temp(str, MED_TEMP); - cmd.tag(3) .TOG_STYLE(tog3) .button (BTN_POS(2,5), BTN_SIZE(1,1), str); - - format_temp(str, HIGH_TEMP); - cmd.tag(4) .TOG_STYLE(tog4) .button (BTN_POS(2,4), BTN_SIZE(1,1), str); - } - cmd.colors(normal_btn) - - // Add tags to color gradient - .cmd(COLOR_MASK(0,0,0,0)) - .tag(2) .rectangle(BTN_POS(1,6), BTN_SIZE(1,1)) - .tag(3) .rectangle(BTN_POS(1,5), BTN_SIZE(1,1)) - .tag(4) .rectangle(BTN_POS(1,4), BTN_SIZE(1,1)) - .cmd(COLOR_MASK(1,1,1,1)) - - .cmd(COLOR_RGB(t_ok ? bg_text_enabled : bg_text_disabled)) - #ifdef TOUCH_UI_PORTRAIT - .font(font_large) - .tag(0) .text (BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_UNLOAD_FILAMENT)) - .text (BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_LOAD_FILAMENT)) - .tag(5) .enabled(t_ok).button (BTN_POS(1,9), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) - .tag(6) .enabled(t_ok).button (BTN_POS(2,9), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) - .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(1,10), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) - .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(2,10), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) - .tag(1).colors(action_btn) .button (BTN_POS(1,11), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); - #else - .font(font_small) - .tag(0) .text (BTN_POS(3,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_UNLOAD_FILAMENT)) - .text (BTN_POS(4,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_LOAD_FILAMENT)) - .tag(5) .enabled(t_ok).button (BTN_POS(3,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) - .tag(6) .enabled(t_ok).button (BTN_POS(4,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) - .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(3,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) - .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(4,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) - .font(font_medium) - .tag(1).colors(action_btn) .button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); - #endif - } - #undef GRID_COLS - #undef GRID_ROWS -} - -uint8_t ChangeFilamentScreen::getSoftenTemp() { - switch (screen_data.ChangeFilamentScreen.t_tag) { - case 2: return LOW_TEMP; - case 3: return MED_TEMP; - case 4: return HIGH_TEMP; - default: return EXTRUDE_MINTEMP; - } -} - -ExtUI::extruder_t ChangeFilamentScreen::getExtruder() { - switch (screen_data.ChangeFilamentScreen.e_tag) { - case 13: return ExtUI::E3; - case 12: return ExtUI::E2; - case 11: return ExtUI::E1; - default: return ExtUI::E0; - } -} - -void ChangeFilamentScreen::doPurge() { - #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - constexpr float purge_distance_mm = FILAMENT_UNLOAD_PURGE_LENGTH; - if (screen_data.ChangeFilamentScreen.need_purge) { - screen_data.ChangeFilamentScreen.need_purge = false; - MoveAxisScreen::setManualFeedrate(getExtruder(), purge_distance_mm); - ExtUI::setAxisPosition_mm(ExtUI::getAxisPosition_mm(getExtruder()) + purge_distance_mm, getExtruder()); - } - #endif -} - -bool ChangeFilamentScreen::onTouchStart(uint8_t tag) { - // Make the Momentary and Continuous buttons slightly more responsive - switch (tag) { - case 5: case 6: case 7: case 8: - #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - if (tag == 5 || tag == 7) doPurge(); - #endif - return ChangeFilamentScreen::onTouchHeld(tag); - default: - return false; - } -} - -bool ChangeFilamentScreen::onTouchEnd(uint8_t tag) { - using namespace ExtUI; - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - case 2: - case 3: - case 4: - // Change temperature - screen_data.ChangeFilamentScreen.t_tag = tag; - setTargetTemp_celsius(getSoftenTemp(), getExtruder()); - break; - case 7: - screen_data.ChangeFilamentScreen.repeat_tag = (screen_data.ChangeFilamentScreen.repeat_tag == 7) ? 0 : 7; - break; - case 8: - screen_data.ChangeFilamentScreen.repeat_tag = (screen_data.ChangeFilamentScreen.repeat_tag == 8) ? 0 : 8; - break; - case 10: - case 11: - // Change extruder - screen_data.ChangeFilamentScreen.e_tag = tag; - screen_data.ChangeFilamentScreen.t_tag = 0; - screen_data.ChangeFilamentScreen.repeat_tag = 0; - #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - screen_data.ChangeFilamentScreen.need_purge = true; - #endif - setActiveTool(getExtruder(), true); - break; - case 15: GOTO_SCREEN(TemperatureScreen); break; - } - return true; -} - -bool ChangeFilamentScreen::onTouchHeld(uint8_t tag) { - if (ExtUI::isMoving()) return false; // Don't allow moves to accumulate - constexpr float increment = 1; - #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); - #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); - switch (tag) { - case 5: case 7: UI_DECREMENT_AXIS(getExtruder()); break; - case 6: case 8: UI_INCREMENT_AXIS(getExtruder()); break; - default: return false; - } - #undef UI_DECREMENT_AXIS - #undef UI_INCREMENT_AXIS - return false; -} - -void ChangeFilamentScreen::onIdle() { - reset_menu_timeout(); - if (screen_data.ChangeFilamentScreen.repeat_tag) onTouchHeld(screen_data.ChangeFilamentScreen.repeat_tag); - if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { - onRefresh(); - refresh_timer.start(); - } - BaseScreen::onIdle(); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp deleted file mode 100644 index e23592a46e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/************************************** - * confirm_abort_print_dialog_box.cpp * - **************************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace ExtUI; - -void ConfirmAbortPrintDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXT_F(MSG_ABORT_WARNING)); - drawYesNoButtons(); -} - -bool ConfirmAbortPrintDialogBox::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - GOTO_PREVIOUS(); - stopPrint(); - return true; - default: - return DialogBoxBaseClass::onTouchEnd(tag); - } -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp deleted file mode 100644 index 7e1a82025d..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/******************************************* - * confirm_auto_calibration_dialog_box.cpp * - *******************************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, CALIBRATION_GCODE) - -#include "screens.h" - -using namespace ExtUI; -using namespace Theme; - -void ConfirmAutoCalibrationDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXT_F(MSG_CALIBRATION_WARNING)); - drawYesNoButtons(); -} - -bool ConfirmAutoCalibrationDialogBox::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - GOTO_SCREEN(StatusScreen); - injectCommands_P(PSTR("G425")); - return true; - default: - return DialogBoxBaseClass::onTouchEnd(tag); - } -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp deleted file mode 100644 index 574de21088..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/************************************** - * confirm_erase_flash_dialog_box.cpp * - **************************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - -#include "screens.h" - -#include "../archim2-flash/flash_storage.h" - -using namespace FTDI; - -void ConfirmEraseFlashDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXT_F(MSG_ERASE_FLASH_WARNING)); - drawYesNoButtons(); -} - -bool ConfirmEraseFlashDialogBox::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - SpinnerDialogBox::show(GET_TEXT_F(MSG_ERASING)); - UIFlashStorage::format_flash(); - SpinnerDialogBox::hide(); - AlertDialogBox::show(GET_TEXT_F(MSG_ERASED)); - // Remove ConfirmEraseFlashDialogBox from the stack - // so the alert box doesn't return to me. - current_screen.forget(); - return true; - default: - return DialogBoxBaseClass::onTouchEnd(tag); - } -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp deleted file mode 100644 index 4e5b174d53..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/************************************** - * confirm_start_print_dialog_box.cpp * - **************************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -void ConfirmStartPrintDialogBox::onRedraw(draw_mode_t) { - const char *filename = getLongFilename(); - char buffer[strlen_P(GET_TEXT(MSG_START_PRINT_CONFIRMATION)) + strlen(filename) + 1]; - sprintf_P(buffer, GET_TEXT(MSG_START_PRINT_CONFIRMATION), filename); - drawMessage((const char *)buffer); - drawYesNoButtons(1); -} - -bool ConfirmStartPrintDialogBox::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - printFile(getShortFilename()); - StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PRINT_STARTING)); - GOTO_SCREEN(StatusScreen); - return true; - case 2: GOTO_PREVIOUS(); return true; - default: return false; - } -} - -const char *ConfirmStartPrintDialogBox::getFilename(bool longName) { - FileList files; - files.seek(screen_data.ConfirmStartPrintDialogBox.file_index, true); - return longName ? files.longFilename() : files.shortFilename(); -} - -void ConfirmStartPrintDialogBox::show(uint8_t file_index) { - screen_data.ConfirmStartPrintDialogBox.file_index = file_index; - GOTO_SCREEN(ConfirmStartPrintDialogBox); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp deleted file mode 100644 index 6b6affadd5..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/************************************** - * confirm_user_request_alert_box.cpp * - **************************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; - -void ConfirmUserRequestAlertBox::onRedraw(draw_mode_t mode) { - AlertDialogBox::onRedraw(mode); // Required for the GOTO_SCREEN function to work -} - -bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - ExtUI::setUserConfirmed(); - GOTO_PREVIOUS(); - return true; - case 2: GOTO_PREVIOUS(); return true; - default: return false; - } -} - -void ConfirmUserRequestAlertBox::show(const char* msg) { - drawMessage(msg); - storeBackground(); - screen_data.AlertDialogBox.isError = false; - GOTO_SCREEN(ConfirmUserRequestAlertBox); -} - -void ConfirmUserRequestAlertBox::hide() { - if (AT_SCREEN(ConfirmUserRequestAlertBox)) - GOTO_PREVIOUS(); -} -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp deleted file mode 100644 index 8496955f73..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/*********************************** - * default_acceleration_screen.cpp * - ***********************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void DefaultAccelerationScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(0); - w.units(GET_TEXT_F(MSG_UNITS_MM_S2)); - w.heading( GET_TEXT_F(MSG_ACCELERATION)); - w.color(other); - w.adjuster( 2, GET_TEXT_F(MSG_ACCEL_PRINTING), getPrintingAcceleration_mm_s2() ); - w.adjuster( 4, GET_TEXT_F(MSG_ACCEL_TRAVEL), getTravelAcceleration_mm_s2() ); - w.adjuster( 6, GET_TEXT_F(MSG_ACCEL_RETRACT), getRetractAcceleration_mm_s2() ); - w.increments(); - w.button( 8, GET_TEXT_F(MSG_SET_MAXIMUM)); -} - -bool DefaultAccelerationScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(PrintingAcceleration_mm_s2); break; - case 3: UI_INCREMENT(PrintingAcceleration_mm_s2); break; - case 4: UI_DECREMENT(TravelAcceleration_mm_s2); break; - case 5: UI_INCREMENT(TravelAcceleration_mm_s2); break; - case 6: UI_DECREMENT(RetractAcceleration_mm_s2); break; - case 7: UI_INCREMENT(RetractAcceleration_mm_s2); break; - case 8: GOTO_SCREEN(MaxAccelerationScreen); break; - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp deleted file mode 100644 index 8e56c4197b..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/********************** - * developer_menu.cpp * - **********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - -#include "screens.h" - -#include "../archim2-flash/flash_storage.h" - -using namespace FTDI; -using namespace Theme; - -void DeveloperMenu::onRedraw(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .font(font_medium) - .tag(0); - - #ifdef SPI_FLASH_SS - constexpr bool has_flash = true; - #else - constexpr bool has_flash = false; - #endif - - #if ENABLED(SDSUPPORT) - constexpr bool has_media = true; - #else - constexpr bool has_media = false; - #endif - - cmd.cmd(COLOR_RGB(bg_text_enabled)); - #ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 10 - #define GRID_COLS 1 - cmd.font(font_large) .text ( BTN_POS(1,1), BTN_SIZE(1,1), F("Developer Menu")) - .colors(normal_btn) - .tag(2).font(font_medium) .button( BTN_POS(1,2), BTN_SIZE(1,1), F("Show All Widgets")) - .tag(3) .button( BTN_POS(1,3), BTN_SIZE(1,1), F("Stress Test")) - .tag(4) .button( BTN_POS(1,4), BTN_SIZE(1,1), F("Show Touch Registers")) - .tag(5) .button( BTN_POS(1,5), BTN_SIZE(1,1), F("Play Song")) - .tag(6).enabled(has_media).button( BTN_POS(1,6), BTN_SIZE(1,1), F("Play Video from Media")) - .tag(7).enabled(has_flash).button( BTN_POS(1,7), BTN_SIZE(1,1), F("Play Video from SPI Flash")) - .tag(8).enabled(has_flash).button( BTN_POS(1,8), BTN_SIZE(1,1), F("Load Video to SPI Flash")) - .tag(9).enabled(has_flash).button( BTN_POS(1,9), BTN_SIZE(1,1), F("Erase SPI Flash")) - - .tag(1).colors(action_btn) - .button( BTN_POS(1,10), BTN_SIZE(1,1), F("Back")); - #else - #define GRID_ROWS 6 - #define GRID_COLS 2 - cmd.font(font_medium) .text ( BTN_POS(1,1), BTN_SIZE(2,1), F("Developer Menu")) - .colors(normal_btn) - .tag(2).font(font_small) .button( BTN_POS(1,2), BTN_SIZE(1,1), F("Show All Widgets")) - .tag(3) .button( BTN_POS(1,3), BTN_SIZE(1,1), F("Show Touch Registers")) - .tag(9) .button( BTN_POS(1,4), BTN_SIZE(1,1), F("Show Pin States")) - .tag(4) .button( BTN_POS(1,5), BTN_SIZE(1,1), F("Play Song")) - .tag(5).enabled(has_media).button( BTN_POS(2,2), BTN_SIZE(1,1), F("Play Video from Media")) - .tag(6).enabled(has_flash).button( BTN_POS(2,3), BTN_SIZE(1,1), F("Play Video from SPI Flash")) - .tag(7).enabled(has_flash).button( BTN_POS(2,4), BTN_SIZE(1,1), F("Load Video to SPI Flash")) - .tag(8).enabled(has_flash).button( BTN_POS(2,5), BTN_SIZE(1,1), F("Erase SPI Flash")) - .tag(1).colors(action_btn) - .button( BTN_POS(1,6), BTN_SIZE(2,1), F("Back")); - #endif - } -} - -bool DeveloperMenu::onTouchEnd(uint8_t tag) { - using namespace Theme; - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - case 2: GOTO_SCREEN(WidgetsScreen); break; - case 3: - PUSH_SCREEN(StressTestScreen); - AlertDialogBox::show(F("Please do not run this test unattended as it may cause your printer to malfunction.")); - current_screen.forget(); - break; - case 4: GOTO_SCREEN(TouchRegistersScreen); break; - case 5: sound.play(js_bach_joy, PLAY_ASYNCHRONOUS); break; - #if ENABLED(SDSUPPORT) - case 6: - if (!MediaPlayerScreen::playCardMedia()) - AlertDialogBox::showError(F("Cannot open STARTUP.AVI")); - break; - #endif - #ifdef SPI_FLASH_SS - case 7: - if (!MediaPlayerScreen::playBootMedia()) - AlertDialogBox::showError(F("No boot media available")); - break; - case 8: - { - SpinnerDialogBox::show(F("Saving...")); - UIFlashStorage::error_t res = UIFlashStorage::write_media_file(F("STARTUP.AVI")); - SpinnerDialogBox::hide(); - reset_menu_timeout(); - switch (res) { - case UIFlashStorage::SUCCESS: - AlertDialogBox::show(F("File copied!")); - break; - - case UIFlashStorage::READ_ERROR: - AlertDialogBox::showError(F("Failed to read file")); - break; - - case UIFlashStorage::VERIFY_ERROR: - AlertDialogBox::showError(F("Failed to verify file")); - break; - - case UIFlashStorage::FILE_NOT_FOUND: - AlertDialogBox::showError(F("Cannot open STARTUP.AVI")); - break; - - case UIFlashStorage::WOULD_OVERWRITE: - AlertDialogBox::showError(F("Cannot overwrite existing media.")); - break; - } - break; - } - case 9: GOTO_SCREEN(ConfirmEraseFlashDialogBox); break; - #endif - case 10: GOTO_SCREEN(EndstopStatesScreen); break; - default: return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp deleted file mode 100644 index 782ae7bbc7..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/***************************** - * dialog_box_base_class.cpp * - *****************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -#define GRID_COLS 2 -#define GRID_ROWS 8 - -template -void DialogBoxBaseClass::drawMessage(const T message, int16_t font) { - CommandProcessor cmd; - cmd.cmd(CMD_DLSTART) - .cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0); - draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(2,3), message, OPT_CENTER, font ? font : font_large); - cmd.colors(normal_btn); -} - -template void DialogBoxBaseClass::drawMessage(const char *, int16_t font); -template void DialogBoxBaseClass::drawMessage(progmem_str, int16_t font); - -void DialogBoxBaseClass::drawYesNoButtons(uint8_t default_btn) { - CommandProcessor cmd; - cmd.font(font_medium) - .colors(default_btn == 1 ? action_btn : normal_btn).tag(1).button( BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_YES)) - .colors(default_btn == 2 ? action_btn : normal_btn).tag(2).button( BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_NO)); -} - -void DialogBoxBaseClass::drawOkayButton() { - CommandProcessor cmd; - cmd.font(font_medium) - .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_OKAY)); -} - -void DialogBoxBaseClass::drawButton(const progmem_str label) { - CommandProcessor cmd; - cmd.font(font_medium) - .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), label); -} - -void DialogBoxBaseClass::drawSpinner() { - CommandProcessor cmd; - cmd.cmd(COLOR_RGB(bg_text_enabled)) - .spinner(BTN_POS(1,4), BTN_SIZE(2,3)).execute(); -} - -bool DialogBoxBaseClass::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); return true; - case 2: GOTO_PREVIOUS(); return true; - default: return false; - } -} - -void DialogBoxBaseClass::onIdle() { - reset_menu_timeout(); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp deleted file mode 100644 index 8845dfb5c0..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/***************************** - * display_tuning_screen.cpp * - *****************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -void DisplayTuningScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(0, BaseNumericAdjustmentScreen::DEFAULT_LOWEST); - w.units(F("")); - w.heading(GET_TEXT_F(MSG_DISPLAY_MENU)); - w.color(other); - w.adjuster( 2, GET_TEXT_F(MSG_H_OFFSET), CLCD::mem_read_16(CLCD::REG::HOFFSET) ); - w.adjuster( 4, GET_TEXT_F(MSG_V_OFFSET), CLCD::mem_read_16(CLCD::REG::VOFFSET) ); - w.increments(); - w.heading( GET_TEXT_F(MSG_TOUCH_SCREEN)); - w.button(6, GET_TEXT_F(MSG_CALIBRATE)); -} - -bool DisplayTuningScreen::onTouchHeld(uint8_t tag) { - #define REG_INCREMENT(a,i) CLCD::mem_write_16(CLCD::REG::a, CLCD::mem_read_16(CLCD::REG::a) + i) - const float increment = getIncrement(); - switch (tag) { - case 2: REG_INCREMENT(HOFFSET, -increment); break; - case 3: REG_INCREMENT(HOFFSET, increment); break; - case 4: REG_INCREMENT(VOFFSET, -increment); break; - case 5: REG_INCREMENT(VOFFSET, increment); break; - case 6: GOTO_SCREEN(TouchCalibrationScreen); break; - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp deleted file mode 100644 index 7f3f507fd6..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/**************************** - * endstop_state_screen.cpp * - ****************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -void EndstopStatesScreen::onEntry() { - BaseScreen::onEntry(); -} - -void EndstopStatesScreen::onExit() { - BaseScreen::onExit(); -} - -void EndstopStatesScreen::onRedraw(draw_mode_t) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(COLOR_RGB(bg_text_enabled)) - .cmd(CLEAR(true,true,true)) - .tag(0); - - #define GRID_ROWS 7 - #define GRID_COLS 6 - - #define PIN_BTN(X,Y,PIN,LABEL) button(BTN_POS(X,Y), BTN_SIZE(2,1), LABEL) - #define PIN_ENABLED(X,Y,LABEL,PIN,INV) cmd.enabled(1).colors(READ(PIN##_PIN) != INV ? action_btn : normal_btn).PIN_BTN(X,Y,PIN,LABEL); - #define PIN_DISABLED(X,Y,LABEL,PIN) cmd.enabled(0).PIN_BTN(X,Y,PIN,LABEL); - - cmd.font( - #ifdef TOUCH_UI_PORTRAIT - font_large - #else - font_medium - #endif - ) - .text(BTN_POS(1,1), BTN_SIZE(6,1), GET_TEXT_F(MSG_LCD_ENDSTOPS)) - .font(font_tiny); - #if PIN_EXISTS(X_MAX) - PIN_ENABLED (1, 2, PSTR(STR_X_MAX), X_MAX, X_MAX_ENDSTOP_INVERTING) - #else - PIN_DISABLED(1, 2, PSTR(STR_X_MAX), X_MAX) - #endif - #if PIN_EXISTS(Y_MAX) - PIN_ENABLED (3, 2, PSTR(STR_Y_MAX), Y_MAX, Y_MAX_ENDSTOP_INVERTING) - #else - PIN_DISABLED(3, 2, PSTR(STR_Y_MAX), Y_MAX) - #endif - #if PIN_EXISTS(Z_MAX) - PIN_ENABLED (5, 2, PSTR(STR_Z_MAX), Z_MAX, Z_MAX_ENDSTOP_INVERTING) - #else - PIN_DISABLED(5, 2, PSTR(STR_Z_MAX), Z_MAX) - #endif - #if PIN_EXISTS(X_MIN) - PIN_ENABLED (1, 3, PSTR(STR_X_MIN), X_MIN, X_MIN_ENDSTOP_INVERTING) - #else - PIN_DISABLED(1, 3, PSTR(STR_X_MIN), X_MIN) - #endif - #if PIN_EXISTS(Y_MIN) - PIN_ENABLED (3, 3, PSTR(STR_Y_MIN), Y_MIN, Y_MIN_ENDSTOP_INVERTING) - #else - PIN_DISABLED(3, 3, PSTR(STR_Y_MIN), Y_MIN) - #endif - #if PIN_EXISTS(Z_MIN) - PIN_ENABLED (5, 3, PSTR(STR_Z_MIN), Z_MIN, Z_MIN_ENDSTOP_INVERTING) - #else - PIN_DISABLED(5, 3, PSTR(STR_Z_MIN), Z_MIN) - #endif - #if ENABLED(FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT) - PIN_ENABLED (1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT, FIL_RUNOUT_STATE) - #else - PIN_DISABLED(1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT) - #endif - #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2) - PIN_ENABLED (3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2, FIL_RUNOUT_STATE) - #else - PIN_DISABLED(3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2) - #endif - #if PIN_EXISTS(Z_MIN_PROBE) - PIN_ENABLED (5, 4, PSTR(STR_Z_PROBE), Z_MIN_PROBE, Z_MIN_PROBE_ENDSTOP_INVERTING) - #else - PIN_DISABLED(5, 4, PSTR(STR_Z_PROBE), Z_MIN_PROBE) - #endif - - #if HAS_SOFTWARE_ENDSTOPS - #undef EDGE_R - #define EDGE_R 30 - cmd.cmd(COLOR_RGB(bg_text_enabled)) - .font(font_small) - .text (BTN_POS(1,5), BTN_SIZE(3,1), GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS), OPT_RIGHTX | OPT_CENTERY) - .colors(ui_toggle) - .tag(2).toggle2(BTN_POS(4,5), BTN_SIZE(3,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), getSoftEndstopState()); - #undef EDGE_R - #define EDGE_R 0 - #endif - - cmd.font(font_medium) - .colors(action_btn) - .tag(1).button( BTN_POS(1,7), BTN_SIZE(6,1), GET_TEXT_F(MSG_BACK)); - #undef GRID_COLS - #undef GRID_ROWS -} - -bool EndstopStatesScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - #if HAS_SOFTWARE_ENDSTOPS - case 2: setSoftEndstopState(!getSoftEndstopState()); - #endif - default: - return false; - } - return true; -} - -void EndstopStatesScreen::onIdle() { - constexpr uint32_t DIAGNOSTICS_UPDATE_INTERVAL = 100; - - if (refresh_timer.elapsed(DIAGNOSTICS_UPDATE_INTERVAL)) { - onRefresh(); - refresh_timer.start(); - reset_menu_timeout(); - } - BaseScreen::onIdle(); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp deleted file mode 100644 index 2698708e51..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/******************************* - * feedrate_percent_screen.cpp * - *******************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; - -void FeedratePercentScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(0).units(GET_TEXT_F(MSG_UNITS_PERCENT)); - - w.heading(GET_TEXT_F(MSG_PRINT_SPEED)); - w.adjuster(4, GET_TEXT_F(MSG_SPEED), getFeedrate_percent()); - w.increments(); -} - -bool FeedratePercentScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 4: UI_DECREMENT(Feedrate_percent); break; - case 5: UI_INCREMENT(Feedrate_percent); break; - default: - return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp deleted file mode 100644 index 82ee118e4c..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/********************* - * filament_menu.cpp * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -#ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 9 - #define GRID_COLS 2 - #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define RUNOUT_SENSOR_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define LIN_ADVANCE_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) -#else - #define GRID_ROWS 6 - #define GRID_COLS 2 - #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define RUNOUT_SENSOR_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define LIN_ADVANCE_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define BACK_POS BTN_POS(1,6), BTN_SIZE(2,1) -#endif - -void FilamentMenu::onRedraw(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)) - .tag(0); - } - - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.font(font_large) - .text(TITLE_POS, GET_TEXT_F(MSG_FILAMENT)) - .font(font_medium).colors(normal_btn) - .enabled(ENABLED(FILAMENT_RUNOUT_SENSOR)) - .tag(2).button(RUNOUT_SENSOR_POS, GET_TEXT_F(MSG_RUNOUT_SENSOR)) - .enabled(ENABLED(LIN_ADVANCE)) - .tag(3).button(LIN_ADVANCE_POS, GET_TEXT_F(MSG_LINEAR_ADVANCE)) - .colors(action_btn) - .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); - } -} - -bool FilamentMenu::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - case 2: GOTO_SCREEN(FilamentRunoutScreen); break; - #endif - #if ENABLED(LIN_ADVANCE) - case 3: GOTO_SCREEN(LinearAdvanceScreen); break; - #endif - default: return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp deleted file mode 100644 index f1808bf20e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/****************************** - * filament_runout_screen.cpp * - ******************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, FILAMENT_RUNOUT_SENSOR) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void FilamentRunoutScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.heading( GET_TEXT_F(MSG_FILAMENT)); - w.toggle( 2, GET_TEXT_F(MSG_RUNOUT_SENSOR), getFilamentRunoutEnabled()); - - #if HAS_FILAMENT_RUNOUT_DISTANCE - extern const char NUL_STR[]; - w.heading(GET_TEXT_F(MSG_RUNOUT_DISTANCE_MM)); - w.units(GET_TEXT_F(MSG_UNITS_MM)); - w.precision(0); - w.color(e_axis); - w.adjuster( 10, progmem_str(NUL_STR), getFilamentRunoutDistance_mm(), getFilamentRunoutEnabled()); - w.increments(); - #endif -} - -bool FilamentRunoutScreen::onTouchHeld(uint8_t tag) { - using namespace ExtUI; - const float increment = getIncrement(); - switch (tag) { - case 2: setFilamentRunoutEnabled(!getFilamentRunoutEnabled()); break; - #if HAS_FILAMENT_RUNOUT_DISTANCE - case 10: UI_DECREMENT(FilamentRunoutDistance_mm); break; - case 11: UI_INCREMENT(FilamentRunoutDistance_mm); break; - #endif - default: - return false; - } - - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp deleted file mode 100644 index f4c224dbe8..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/******************** - * files_screen.cpp * - ********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, SDSUPPORT) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void FilesScreen::onEntry() { - screen_data.FilesScreen.cur_page = 0; - screen_data.FilesScreen.selected_tag = 0xFF; - #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) - CLCD::mem_write_32(CLCD::REG::MACRO_0,DL::NOP); - #endif - gotoPage(0); - BaseScreen::onEntry(); -} - -const char *FilesScreen::getSelectedFilename(bool longName) { - FileList files; - files.seek(getSelectedFileIndex(), true); - return longName ? files.longFilename() : files.shortFilename(); -} - -void FilesScreen::drawSelectedFile() { - FileList files; - files.seek(getSelectedFileIndex(), true); - screen_data.FilesScreen.flags.is_dir = files.isDir(); - drawFileButton( - files.filename(), - screen_data.FilesScreen.selected_tag, - screen_data.FilesScreen.flags.is_dir, - true - ); -} - -uint16_t FilesScreen::getSelectedFileIndex() { - return getFileForTag(screen_data.FilesScreen.selected_tag); -} - -uint16_t FilesScreen::getFileForTag(uint8_t tag) { - return screen_data.FilesScreen.cur_page * files_per_page + tag - 2; -} - -#ifdef TOUCH_UI_PORTRAIT - #define GRID_COLS 6 - #define GRID_ROWS (files_per_page + header_h + footer_h) -#else - #define GRID_COLS 6 - #define GRID_ROWS (files_per_page + header_h + footer_h) -#endif - -void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted) { - const uint8_t line = getLineForTag(tag)+1; - CommandProcessor cmd; - cmd.tag(tag); - cmd.cmd(COLOR_RGB(is_highlighted ? fg_action : bg_color)); - cmd.font(font_medium) - .rectangle( 0, BTN_Y(header_h+line), display_width, BTN_H(1)); - cmd.cmd(COLOR_RGB(is_highlighted ? normal_btn.rgb : bg_text_enabled)); - constexpr uint16_t dim[2] = {BTN_SIZE(6,1)}; - #define POS_AND_SHORTEN(SHORTEN) BTN_POS(1,header_h+line), dim[0] - (SHORTEN), dim[1] - #define POS_AND_SIZE POS_AND_SHORTEN(0) - #if ENABLED(SCROLL_LONG_FILENAMES) - if (is_highlighted) { - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(MACRO(0)); - cmd.text(POS_AND_SIZE, filename, OPT_CENTERY | OPT_NOFIT); - } else - #endif - draw_text_with_ellipsis(cmd, POS_AND_SHORTEN(is_dir ? 20 : 0), filename, OPT_CENTERY, font_medium); - if (is_dir && !is_highlighted) { - cmd.text(POS_AND_SIZE, F("> "), OPT_CENTERY | OPT_RIGHTX); - } - #if ENABLED(SCROLL_LONG_FILENAMES) - if (is_highlighted) { - cmd.cmd(RESTORE_CONTEXT()); - } - #endif -} - -void FilesScreen::drawFileList() { - FileList files; - screen_data.FilesScreen.num_page = max(1,ceil(float(files.count()) / files_per_page)); - screen_data.FilesScreen.cur_page = min(screen_data.FilesScreen.cur_page, screen_data.FilesScreen.num_page-1); - screen_data.FilesScreen.flags.is_root = files.isAtRootDir(); - - #undef MARGIN_T - #undef MARGIN_B - #define MARGIN_T 0 - #define MARGIN_B 0 - uint16_t fileIndex = screen_data.FilesScreen.cur_page * files_per_page; - for (uint8_t i = 0; i < files_per_page; i++, fileIndex++) { - if (files.seek(fileIndex)) { - drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false); - } - else { - break; - } - } -} - -void FilesScreen::drawHeader() { - const bool prev_enabled = screen_data.FilesScreen.cur_page > 0; - const bool next_enabled = screen_data.FilesScreen.cur_page < (screen_data.FilesScreen.num_page - 1); - - #undef MARGIN_T - #undef MARGIN_B - #define MARGIN_T 0 - #define MARGIN_B 2 - - char str[16]; - sprintf_P(str, PSTR("Page %d of %d"), - screen_data.FilesScreen.cur_page + 1, screen_data.FilesScreen.num_page); - - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(font_small) - .tag(0).button( BTN_POS(2,1), BTN_SIZE(4,header_h), str, OPT_CENTER | OPT_FLAT) - .font(font_medium) - .colors(action_btn) - .tag(241).enabled(prev_enabled).button( BTN_POS(1,1), BTN_SIZE(1,header_h), F("<")) - .tag(242).enabled(next_enabled).button( BTN_POS(6,1), BTN_SIZE(1,header_h), F(">")); -} - -void FilesScreen::drawFooter() { - #undef MARGIN_T - #undef MARGIN_B - #ifdef TOUCH_UI_PORTRAIT - #define MARGIN_T 15 - #define MARGIN_B 5 - #else - #define MARGIN_T 5 - #define MARGIN_B 5 - #endif - const bool has_selection = screen_data.FilesScreen.selected_tag != 0xFF; - const uint8_t back_tag = screen_data.FilesScreen.flags.is_root ? 240 : 245; - const uint8_t y = GRID_ROWS - footer_h + 1; - const uint8_t h = footer_h; - - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(font_medium) - .colors(has_selection ? normal_btn : action_btn) - .tag(back_tag).button( BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BACK)) - .enabled(has_selection) - .colors(has_selection ? action_btn : normal_btn); - if (screen_data.FilesScreen.flags.is_dir) { - cmd.tag(244).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_OPEN)); - } else { - cmd.tag(243).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_PRINT)); - } -} - -void FilesScreen::onRedraw(draw_mode_t what) { - if (what & FOREGROUND) { - drawHeader(); - drawSelectedFile(); - drawFooter(); - } -} - -void FilesScreen::gotoPage(uint8_t page) { - screen_data.FilesScreen.selected_tag = 0xFF; - screen_data.FilesScreen.cur_page = page; - CommandProcessor cmd; - cmd.cmd(CMD_DLSTART) - .cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .colors(normal_btn); - drawFileList(); - storeBackground(); -} - -bool FilesScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 240: GOTO_PREVIOUS(); return true; - case 241: - if (screen_data.FilesScreen.cur_page > 0) { - gotoPage(screen_data.FilesScreen.cur_page-1); - } - break; - case 242: - if (screen_data.FilesScreen.cur_page < (screen_data.FilesScreen.num_page-1)) { - gotoPage(screen_data.FilesScreen.cur_page+1); - } - break; - case 243: - ConfirmStartPrintDialogBox::show(getSelectedFileIndex()); - return true; - case 244: - { - FileList files; - files.changeDir(getSelectedShortFilename()); - gotoPage(0); - } - break; - case 245: - { - FileList files; - files.upDir(); - gotoPage(0); - } - break; - default: - if (tag < 240) { - screen_data.FilesScreen.selected_tag = tag; - #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) - if (FTDI::ftdi_chip >= 810) { - const char *longFilename = getSelectedLongFilename(); - if (longFilename[0]) { - CommandProcessor cmd; - uint16_t text_width = cmd.font(font_medium).text_width(longFilename); - screen_data.FilesScreen.scroll_pos = 0; - if (text_width > display_width) - screen_data.FilesScreen.scroll_max = text_width - display_width + MARGIN_L + MARGIN_R; - else - screen_data.FilesScreen.scroll_max = 0; - } - } - #endif - } - break; - } - return true; -} - -void FilesScreen::onIdle() { - #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) - if (FTDI::ftdi_chip >= 810) { - CLCD::mem_write_32(CLCD::REG::MACRO_0, - VERTEX_TRANSLATE_X(-int32_t(screen_data.FilesScreen.scroll_pos))); - if (screen_data.FilesScreen.scroll_pos < screen_data.FilesScreen.scroll_max * 16) - screen_data.FilesScreen.scroll_pos++; - } - #endif -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp deleted file mode 100644 index c806ef499b..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp +++ /dev/null @@ -1,291 +0,0 @@ -/********************************* - * interface_settings_screen.cpp * - *********************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -#include "../archim2-flash/flash_storage.h" - -#include "../../../../../module/settings.h" - -#if ENABLED(LULZBOT_PRINTCOUNTER) - #include "../../../../../module/printcounter.h" -#endif - -bool restoreEEPROM(); - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -constexpr bool PERSISTENT_STORE_SUCCESS = false; // persistentStore uses true for error - -void InterfaceSettingsScreen::onStartup() { -} - -void InterfaceSettingsScreen::onEntry() { - screen_data.InterfaceSettingsScreen.brightness = CLCD::get_brightness(); - screen_data.InterfaceSettingsScreen.volume = SoundPlayer::get_volume(); - BaseScreen::onEntry(); -} - -void InterfaceSettingsScreen::onRedraw(draw_mode_t what) { - CommandProcessor cmd; - - if (what & BACKGROUND) { - - #define GRID_COLS 4 - #ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 7 - #else - #define GRID_ROWS 6 - #endif - - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0) - .font(font_medium) - .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(MSG_INTERFACE)) - #undef EDGE_R - #define EDGE_R 30 - .font(font_small) - .tag(0) - #if DISABLED(LCD_FYSETC_TFT81050) - .text(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_LCD_BRIGHTNESS), OPT_RIGHTX | OPT_CENTERY) - #endif - .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY) - .text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_SCREEN_LOCK), OPT_RIGHTX | OPT_CENTERY); - #if DISABLED(TOUCH_UI_NO_BOOTSCREEN) - cmd.text(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BOOT_SCREEN), OPT_RIGHTX | OPT_CENTERY); - #endif - #undef EDGE_R - } - - if (what & FOREGROUND) { - #ifdef TOUCH_UI_PORTRAIT - constexpr uint8_t w = 2; - #else - constexpr uint8_t w = 1; - #endif - - cmd.font(font_medium) - #define EDGE_R 30 - .colors(ui_slider) - #if DISABLED(LCD_FYSETC_TFT81050) - .tag(2).slider(BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.brightness, 128) - #endif - .tag(3).slider(BTN_POS(3,3), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF) - .colors(ui_toggle) - .tag(4).toggle2(BTN_POS(3,4), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), LockScreen::is_enabled()) - #if DISABLED(TOUCH_UI_NO_BOOTSCREEN) - .tag(5).toggle2(BTN_POS(3,5), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::animations_enabled()) - #endif - #undef EDGE_R - #define EDGE_R 0 - #ifdef TOUCH_UI_PORTRAIT - .colors(normal_btn) - .tag(6).button (BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXT_F(MSG_SOUNDS)) - .colors(action_btn) - .tag(1).button (BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BACK)); - #else - .tag(6).button (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUNDS)) - .colors(action_btn) - .tag(1).button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); - #endif - } -} - -bool InterfaceSettingsScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); return true; - case 4: - if (!LockScreen::is_enabled()) - LockScreen::enable(); - else - LockScreen::disable(); - break; - case 5: UIData::enable_animations(!UIData::animations_enabled());; break; - case 6: GOTO_SCREEN(InterfaceSoundsScreen); return true; - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -bool InterfaceSettingsScreen::onTouchStart(uint8_t tag) { - #undef EDGE_R - #define EDGE_R 30 - CommandProcessor cmd; - switch (tag) { - case 2: cmd.track_linear(BTN_POS(3,3), BTN_SIZE(2,1), 2).execute(); break; - case 3: cmd.track_linear(BTN_POS(3,4), BTN_SIZE(2,1), 3).execute(); break; - default: break; - } - #undef EDGE_R - #define EDGE_R 0 - #undef GRID_COLS - #undef GRID_ROWS - return true; -} - -void InterfaceSettingsScreen::onIdle() { - if (refresh_timer.elapsed(TOUCH_UPDATE_INTERVAL)) { - refresh_timer.start(); - - uint16_t value; - CommandProcessor cmd; - switch (cmd.track_tag(value)) { - case 2: - screen_data.InterfaceSettingsScreen.brightness = max(11, (value * 128UL) / 0xFFFF); - CLCD::set_brightness(screen_data.InterfaceSettingsScreen.brightness); - SaveSettingsDialogBox::settingsChanged(); - break; - case 3: - screen_data.InterfaceSettingsScreen.volume = value >> 8; - SoundPlayer::set_volume(screen_data.InterfaceSettingsScreen.volume); - SaveSettingsDialogBox::settingsChanged(); - break; - default: - return; - } - onRefresh(); - } - BaseScreen::onIdle(); -} - -void InterfaceSettingsScreen::failSafeSettings() { - // Reset settings that may make the printer interface - // unusable. - CLCD::mem_write_32(CLCD::REG::ROTATE, 0); - CLCD::default_touch_transform(); - CLCD::default_display_orientation(); - CLCD::set_brightness(255); - UIData::reset_persistent_data(); - CLCD::mem_write_16(CLCD::REG::HOFFSET, FTDI::Hoffset); - CLCD::mem_write_16(CLCD::REG::VOFFSET, FTDI::Voffset); -} - -void InterfaceSettingsScreen::defaultSettings() { - LockScreen::passcode = 0; - SoundPlayer::set_volume(255); - CLCD::set_brightness(255); - UIData::reset_persistent_data(); - InterfaceSoundsScreen::defaultSettings(); - CLCD::mem_write_16(CLCD::REG::HOFFSET, FTDI::Hoffset); - CLCD::mem_write_16(CLCD::REG::VOFFSET, FTDI::Voffset); -} - -void InterfaceSettingsScreen::saveSettings(char *buff) { - static_assert( - ExtUI::eeprom_data_size >= sizeof(persistent_data_t), - "Insufficient space in EEPROM for UI parameters" - ); - - SERIAL_ECHOLNPGM("Writing setting to EEPROM"); - - persistent_data_t eeprom; - - eeprom.passcode = LockScreen::passcode; - eeprom.sound_volume = SoundPlayer::get_volume(); - eeprom.display_brightness = CLCD::get_brightness(); - eeprom.bit_flags = UIData::get_persistent_data(); - eeprom.touch_transform_a = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_A); - eeprom.touch_transform_b = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_B); - eeprom.touch_transform_c = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_C); - eeprom.touch_transform_d = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_D); - eeprom.touch_transform_e = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_E); - eeprom.touch_transform_f = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_F); - eeprom.display_h_offset_adj = CLCD::mem_read_16(CLCD::REG::HOFFSET) - FTDI::Hoffset; - eeprom.display_v_offset_adj = CLCD::mem_read_16(CLCD::REG::VOFFSET) - FTDI::Voffset; - for (uint8_t i = 0; i < InterfaceSoundsScreen::NUM_EVENTS; i++) - eeprom.event_sounds[i] = InterfaceSoundsScreen::event_sounds[i]; - - memcpy(buff, &eeprom, sizeof(eeprom)); -} - -void InterfaceSettingsScreen::loadSettings(const char *buff) { - static_assert( - ExtUI::eeprom_data_size >= sizeof(persistent_data_t), - "Insufficient space in EEPROM for UI parameters" - ); - - persistent_data_t eeprom; - memcpy(&eeprom, buff, sizeof(eeprom)); - - SERIAL_ECHOLNPGM("Loading setting from EEPROM"); - - LockScreen::passcode = eeprom.passcode; - SoundPlayer::set_volume(eeprom.sound_volume); - UIData::set_persistent_data(eeprom.bit_flags); - CLCD::set_brightness(eeprom.display_brightness); - CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_A, eeprom.touch_transform_a); - CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_B, eeprom.touch_transform_b); - CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_C, eeprom.touch_transform_c); - CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_D, eeprom.touch_transform_d); - CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_E, eeprom.touch_transform_e); - CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_F, eeprom.touch_transform_f); - CLCD::mem_write_16(CLCD::REG::HOFFSET, eeprom.display_h_offset_adj + FTDI::Hoffset); - CLCD::mem_write_16(CLCD::REG::VOFFSET, eeprom.display_v_offset_adj + FTDI::Voffset); - for (uint8_t i = 0; i < InterfaceSoundsScreen::NUM_EVENTS; i++) - InterfaceSoundsScreen::event_sounds[i] = eeprom.event_sounds[i]; - - TERN_(TOUCH_UI_DEVELOPER_MENU, StressTestScreen::startupCheck()); -} - -#ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE - #include "../../../../../HAL/shared/eeprom_api.h" - - bool restoreEEPROM() { - uint8_t data[ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE]; - - bool success = UIFlashStorage::read_config_data(data, ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE); - - if (success) - success = persistentStore.write_data(0, data, ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE) == PERSISTENT_STORE_SUCCESS; - - if (success) - StatusScreen::setStatusMessage(GET_TEXT_F(MSG_EEPROM_RESTORED)); - else - StatusScreen::setStatusMessage(GET_TEXT_F(MSG_EEPROM_RESET)); - - return success; - } - - bool InterfaceSettingsScreen::backupEEPROM() { - uint8_t data[ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE]; - - if (persistentStore.read_data(0, data, ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE) != PERSISTENT_STORE_SUCCESS) - return false; - - UIFlashStorage::write_config_data(data, ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE); - - return true; - } -#endif - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp deleted file mode 100644 index 25a44c1adb..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/******************************* - * interface_sounds_screen.cpp * - *******************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -uint8_t InterfaceSoundsScreen::event_sounds[]; - -const char* InterfaceSoundsScreen::getSoundSelection(event_t event) { - return SoundList::name(event_sounds[event]); -} - -void InterfaceSoundsScreen::toggleSoundSelection(event_t event) { - event_sounds[event] = (event_sounds[event]+1) % SoundList::n; - playEventSound(event); -} - -void InterfaceSoundsScreen::setSoundSelection(event_t event, const SoundPlayer::sound_t* sound) { - for (uint8_t i = 0; i < SoundList::n; i++) - if (SoundList::data(i) == sound) - event_sounds[event] = i; -} - -void InterfaceSoundsScreen::playEventSound(event_t event, play_mode_t mode) { - sound.play(SoundList::data(event_sounds[event]), mode); -} - -void InterfaceSoundsScreen::defaultSettings() { - setSoundSelection(PRINTING_STARTED, twinkle); - setSoundSelection(PRINTING_FINISHED, fanfare); - setSoundSelection(PRINTING_FAILED, sad_trombone); -} - -void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { - CommandProcessor cmd; - - if (what & BACKGROUND) { - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0) - - #define GRID_COLS 4 - #define GRID_ROWS 9 - - .font(font_medium) - .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(MSG_SOUNDS)) - #undef EDGE_R - #define EDGE_R 30 - .font(font_small) - .tag(0).text (BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY) - .text (BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_CLICK_SOUNDS), OPT_RIGHTX | OPT_CENTERY) - .text (BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_STARTING), OPT_RIGHTX | OPT_CENTERY) - .text (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_FINISHED), OPT_RIGHTX | OPT_CENTERY) - .text (BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_ERROR), OPT_RIGHTX | OPT_CENTERY); - #undef EDGE_R - } - - if (what & FOREGROUND) { - #ifdef TOUCH_UI_PORTRAIT - constexpr uint8_t w = 2; - #else - constexpr uint8_t w = 1; - #endif - - cmd.font(font_medium) - .colors(ui_slider) - #define EDGE_R 30 - .tag(2).slider (BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF) - .colors(ui_toggle) - .tag(3).toggle2 (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::touch_sounds_enabled()) - #undef EDGE_R - .colors(normal_btn) - #define EDGE_R 0 - .tag(4).button (BTN_POS(3,5), BTN_SIZE(2,1), getSoundSelection(PRINTING_STARTED)) - .tag(5).button (BTN_POS(3,6), BTN_SIZE(2,1), getSoundSelection(PRINTING_FINISHED)) - .tag(6).button (BTN_POS(3,7), BTN_SIZE(2,1), getSoundSelection(PRINTING_FAILED)) - .colors(action_btn) - .tag(1).button (BTN_POS(1,9), BTN_SIZE(4,1), GET_TEXT_F(MSG_BACK)); - } -} - -void InterfaceSoundsScreen::onEntry() { - screen_data.InterfaceSettingsScreen.volume = SoundPlayer::get_volume(); - BaseScreen::onEntry(); -} - -bool InterfaceSoundsScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); return true; - case 3: UIData::enable_touch_sounds(!UIData::touch_sounds_enabled()); break; - case 4: toggleSoundSelection(PRINTING_STARTED); break; - case 5: toggleSoundSelection(PRINTING_FINISHED); break; - case 6: toggleSoundSelection(PRINTING_FAILED); break; - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -bool InterfaceSoundsScreen::onTouchStart(uint8_t tag) { - CommandProcessor cmd; - #undef EDGE_R - #define EDGE_R 30 - switch (tag) { - case 2: cmd.track_linear(BTN_POS(3,2), BTN_SIZE(2,1), 2).execute(); break; - default: break; - } - return true; -} - -void InterfaceSoundsScreen::onIdle() { - if (refresh_timer.elapsed(TOUCH_UPDATE_INTERVAL)) { - refresh_timer.start(); - - uint16_t value; - CommandProcessor cmd; - switch (cmd.track_tag(value)) { - case 2: - screen_data.InterfaceSettingsScreen.volume = value >> 8; - SoundPlayer::set_volume(screen_data.InterfaceSettingsScreen.volume); - SaveSettingsDialogBox::settingsChanged(); - break; - default: - return; - } - onRefresh(); - } - BaseScreen::onIdle(); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp deleted file mode 100644 index b96c2be7c8..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/******************* - * jerk_screen.cpp * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, CLASSIC_JERK) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void JerkScreen::onRedraw(draw_mode_t what) { - - widgets_t w(what); - w.precision(1); - w.units(GET_TEXT_F(MSG_UNITS_MM_S)); - w.heading(GET_TEXT_F(MSG_JERK)); - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisMaxJerk_mm_s(X) ); - w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getAxisMaxJerk_mm_s(Y) ); - w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisMaxJerk_mm_s(Z) ); - w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_E), getAxisMaxJerk_mm_s(E0) ); - w.increments(); -} - -bool JerkScreen::onTouchHeld(uint8_t tag) { - using namespace ExtUI; - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(AxisMaxJerk_mm_s, X); break; - case 3: UI_INCREMENT(AxisMaxJerk_mm_s, X); break; - case 4: UI_DECREMENT(AxisMaxJerk_mm_s, Y); break; - case 5: UI_INCREMENT(AxisMaxJerk_mm_s, Y); break; - case 6: UI_DECREMENT(AxisMaxJerk_mm_s, Z); break; - case 7: UI_INCREMENT(AxisMaxJerk_mm_s, Z); break; - case 8: UI_DECREMENT(AxisMaxJerk_mm_s, E0); break; - case 9: UI_INCREMENT(AxisMaxJerk_mm_s, E0); break; - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE && CLASSIC_JERK diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp deleted file mode 100644 index d365b12eb1..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/******************* - * boot_screen.cpp * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_JUNCTION_DEVIATION) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void JunctionDeviationScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(2); - w.units(GET_TEXT_F(MSG_UNITS_MM)); - w.heading(GET_TEXT_F(MSG_JUNCTION_DEVIATION)); - w.color(other) .adjuster( 2, F(""), getJunctionDeviation_mm() ); - w.increments(); -} - -bool JunctionDeviationScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(JunctionDeviation_mm); break; - case 3: UI_INCREMENT(JunctionDeviation_mm); break; - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE && !CLASSIC_JERK diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp deleted file mode 100644 index d98324623c..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/******************* - * kill_screen.cpp * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; - -// The kill screen is an oddball that happens after Marlin has killed the events -// loop. So we only have a show() method rather than onRedraw(). The KillScreen -// should not be used as a model for other UI screens as it is an exception. - -void KillScreen::show(const char *message) { - CommandProcessor cmd; - - cmd.cmd(CMD_DLSTART) - .cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)) - .tag(0); - - #define GRID_COLS 4 - #define GRID_ROWS 8 - - cmd.font(Theme::font_large) - .cmd(COLOR_RGB(Theme::bg_text_enabled)) - .text(BTN_POS(1,2), BTN_SIZE(4,1), message) - .text(BTN_POS(1,3), BTN_SIZE(4,1), GET_TEXT_F(MSG_HALTED)) - .text(BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXT_F(MSG_PLEASE_RESET)); - - #undef GRID_COLS - #undef GRID_ROWS - - cmd.cmd(DL::DL_DISPLAY) - .cmd(CMD_SWAP) - .execute(); - - InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED, PLAY_SYNCHRONOUS); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp deleted file mode 100644 index 5b4c1c9175..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/********************* - * language_menu.cpp * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" -#include "../language/language.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && NUM_LANGUAGES > 1 - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -void LanguageMenu::onRedraw(draw_mode_t) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)) - .colors(normal_btn) - .font(Theme::font_medium); - - #define GRID_ROWS 8 - #define GRID_COLS 1 - - cmd.tag(1).button(BTN_POS(1,1), BTN_SIZE(1,1), GET_LANGUAGE_NAME(1)); - cmd.tag(2).button(BTN_POS(1,2), BTN_SIZE(1,1), GET_LANGUAGE_NAME(2)); - #if NUM_LANGUAGES > 2 - cmd.tag(3).button(BTN_POS(1,3), BTN_SIZE(1,1), GET_LANGUAGE_NAME(3)); - #if NUM_LANGUAGES > 3 - cmd.tag(4).button(BTN_POS(1,4), BTN_SIZE(1,1), GET_LANGUAGE_NAME(4)); - #if NUM_LANGUAGES > 5 - cmd.tag(5).button(BTN_POS(1,5), BTN_SIZE(1,1), GET_LANGUAGE_NAME(5)); - #endif - #endif - #endif -} - -bool LanguageMenu::onTouchEnd(uint8_t tag) { - - if (tag > 0 && tag <= NUM_LANGUAGES) { - lang = tag - 1; - GOTO_SCREEN(StatusScreen); - return true; - } - return false; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp deleted file mode 100644 index 763403d287..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/********************* - * leveling_menu.cpp * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE,HAS_LEVELING) - -#include "screens.h" - -#if BOTH(HAS_BED_PROBE,BLTOUCH) - #include "../../../../../feature/bltouch.h" -#endif - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -#ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 10 - #define GRID_COLS 2 - #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define Z_AUTO_ALIGN_POS BTN_POS(1,4), BTN_SIZE(2,1) - #define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(2,1) - #define BLTOUCH_TITLE_POS BTN_POS(1,7), BTN_SIZE(2,1) - #define BLTOUCH_RESET_POS BTN_POS(1,8), BTN_SIZE(1,1) - #define BLTOUCH_TEST_POS BTN_POS(2,8), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,10), BTN_SIZE(2,1) -#else - #define GRID_ROWS 8 - #define GRID_COLS 2 - #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define Z_AUTO_ALIGN_POS BTN_POS(1,4), BTN_SIZE(2,1) - #define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(2,1) - #define BLTOUCH_TITLE_POS BTN_POS(1,6), BTN_SIZE(2,1) - #define BLTOUCH_RESET_POS BTN_POS(1,7), BTN_SIZE(1,1) - #define BLTOUCH_TEST_POS BTN_POS(2,7), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) -#endif - -void LevelingMenu::onRedraw(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)) - .tag(0); - } - - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.font(font_large) - .text(TITLE_POS, GET_TEXT_F(MSG_LEVELING)) - .font(font_medium).colors(normal_btn) - .tag(2).button(LEVEL_BED_POS, GET_TEXT_F(MSG_LEVEL_BED)) - .enabled( - #ifdef AXIS_LEVELING_COMMANDS - 1 - #endif - ) - .tag(3).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) - .enabled(ENABLED(Z_STEPPER_AUTO_ALIGN)) - .tag(4).button(Z_AUTO_ALIGN_POS, GET_TEXT_F(MSG_AUTO_Z_ALIGN)) - .enabled(ENABLED(HAS_MESH)) - .tag(5).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)); - #if ENABLED(BLTOUCH) - cmd.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH)) - .tag(6).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET)) - .tag(7).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST)); - #endif - cmd.colors(action_btn) - .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); - } -} - -bool LevelingMenu::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - case 2: - #if HAS_MESH - BedMeshScreen::startMeshProbe(); - #else - SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS)); - #endif - break; - #ifdef AXIS_LEVELING_COMMANDS - case 3: SpinnerDialogBox::enqueueAndWait_P(F(AXIS_LEVELING_COMMANDS)); break; - #endif - #if ENABLED(Z_STEPPER_AUTO_ALIGN) - case 4: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break; - #endif - #if HAS_MESH - case 5: GOTO_SCREEN(BedMeshScreen); break; - #endif - #if ENABLED(BLTOUCH) - case 6: injectCommands_P(PSTR("M280 P0 S60")); break; - case 7: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break; - #endif - default: return false; - } - return true; -} - -#endif // BOTH(TOUCH_UI_FTDI_EVE,HAS_LEVELING) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp deleted file mode 100644 index 8a5c675fac..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/***************************** - * linear_advance_screen.cpp * - *****************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, LIN_ADVANCE) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void LinearAdvanceScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(2, DEFAULT_LOWEST).color(e_axis); - w.heading( GET_TEXT_F(MSG_LINEAR_ADVANCE)); - #if !HAS_MULTI_EXTRUDER - w.adjuster( 2, GET_TEXT_F(MSG_LINEAR_ADVANCE_K), getLinearAdvance_mm_mm_s(E0) ); - #else - w.adjuster( 2, GET_TEXT_F(MSG_LINEAR_ADVANCE_K1), getLinearAdvance_mm_mm_s(E0) ); - w.adjuster( 4, GET_TEXT_F(MSG_LINEAR_ADVANCE_K2), getLinearAdvance_mm_mm_s(E1) ); - #if EXTRUDERS > 2 - w.adjuster( 6, GET_TEXT_F(MSG_LINEAR_ADVANCE_K3), getLinearAdvance_mm_mm_s(E2) ); - #if EXTRUDERS > 3 - w.adjuster( 8, GET_TEXT_F(MSG_LINEAR_ADVANCE_K4), getLinearAdvance_mm_mm_s(E3) ); - #endif - #endif - #endif - w.increments(); -} - -bool LinearAdvanceScreen::onTouchHeld(uint8_t tag) { - using namespace ExtUI; - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(LinearAdvance_mm_mm_s, E0); break; - case 3: UI_INCREMENT(LinearAdvance_mm_mm_s, E0); break; - #if HAS_MULTI_EXTRUDER - case 4: UI_DECREMENT(LinearAdvance_mm_mm_s, E1); break; - case 5: UI_INCREMENT(LinearAdvance_mm_mm_s, E1); break; - #if EXTRUDERS > 2 - case 6: UI_DECREMENT(LinearAdvance_mm_mm_s, E2); break; - case 7: UI_INCREMENT(LinearAdvance_mm_mm_s, E2); break; - #if EXTRUDERS > 3 - case 8: UI_DECREMENT(LinearAdvance_mm_mm_s, E3); break; - case 9: UI_INCREMENT(LinearAdvance_mm_mm_s, E3); break; - #endif - #endif - #endif - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp deleted file mode 100644 index 7854ce5e39..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/******************* - * lock_screen.cpp * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace Theme; - -uint16_t LockScreen::passcode = 0; - -void LockScreen::onEntry() { - const uint8_t siz = sizeof(screen_data.LockScreen.passcode); - memset(screen_data.LockScreen.passcode, '_', siz-1); - screen_data.LockScreen.passcode[siz-1] = '\0'; - BaseScreen::onEntry(); -} - -void LockScreen::onRedraw(draw_mode_t what) { - CommandProcessor cmd; - - if (what & BACKGROUND) { - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0); - } - - if (what & FOREGROUND) { - #ifdef TOUCH_UI_PORTRAIT - #define GRID_COLS 1 - #define GRID_ROWS 10 - #else - #define GRID_COLS 1 - #define GRID_ROWS 7 - #endif - - #undef MARGIN_T - #undef MARGIN_B - #define MARGIN_T 3 - #define MARGIN_B 3 - - progmem_str message; - switch (message_style()) { - case 'w': - message = GET_TEXT_F(MSG_PASSCODE_REJECTED); - break; - case 'g': - message = GET_TEXT_F(MSG_PASSCODE_ACCEPTED); - break; - default: - message = passcode ? GET_TEXT_F(MSG_PASSCODE_REQUEST) : GET_TEXT_F(MSG_PASSCODE_SELECT); - } - message_style() = '\0'; // Terminate the string. - - constexpr uint8_t l = TERN(TOUCH_UI_PORTRAIT, 6, 3); - - const uint8_t pressed = EventLoop::get_pressed_tag(); - - cmd.font(font_large) - #ifdef TOUCH_UI_PORTRAIT - .text(BTN_POS(1,2), BTN_SIZE(1,1), message) - .font(font_xlarge) - .text(BTN_POS(1,4), BTN_SIZE(1,1), screen_data.LockScreen.passcode) - #else - .text(BTN_POS(1,1), BTN_SIZE(1,1), message) - .font(font_xlarge) - .text(BTN_POS(1,2), BTN_SIZE(1,1), screen_data.LockScreen.passcode) - #endif - .font(font_large) - .colors(normal_btn) - #ifdef TOUCH_UI_PASSCODE - .keys(BTN_POS(1,l+1), BTN_SIZE(1,1), F("123"), pressed) - .keys(BTN_POS(1,l+2), BTN_SIZE(1,1), F("456"), pressed) - .keys(BTN_POS(1,l+3), BTN_SIZE(1,1), F("789"), pressed) - .keys(BTN_POS(1,l+4), BTN_SIZE(1,1), F("0.<"), pressed); - #else - .keys(BTN_POS(1,l+1), BTN_SIZE(1,1), F("1234567890"), pressed) - .keys(BTN_POS(1,l+2), BTN_SIZE(1,1), F("qwertyuiop"), pressed) - .keys(BTN_POS(1,l+3), BTN_SIZE(1,1), F("asdfghjkl "), pressed) - .keys(BTN_POS(1,l+4), BTN_SIZE(1,1), F("zxcvbnm!?<"), pressed); - #endif - - #undef MARGIN_T - #undef MARGIN_B - #define MARGIN_T MARGIN_DEFAULT - #define MARGIN_B MARGIN_DEFAULT - - #undef GRID_COLS - #undef GRID_ROWS - } -} - -char &LockScreen::message_style() { - // We use the last byte of the passcode string as a flag to indicate, - // which message to show. - constexpr uint8_t last_char = sizeof(screen_data.LockScreen.passcode)-1; - return screen_data.LockScreen.passcode[last_char]; -} - -void LockScreen::onPasscodeEntered() { - if (passcode == 0) { - // We are defining a passcode - message_style() = 0; - onRefresh(); - sound.play(twinkle, PLAY_SYNCHRONOUS); - passcode = compute_checksum(); - GOTO_PREVIOUS(); - } else { - // We are verifying a passcode - if (passcode == compute_checksum()) { - message_style() = 'g'; - onRefresh(); - sound.play(twinkle, PLAY_SYNCHRONOUS); - GOTO_PREVIOUS(); - } - else { - message_style() = 'w'; - onRefresh(); - sound.play(sad_trombone, PLAY_SYNCHRONOUS); - current_screen.forget(); // Discard the screen the user was trying to go to. - GOTO_PREVIOUS(); - } - } -} - -bool LockScreen::onTouchEnd(uint8_t tag) { - char *c = strchr(screen_data.LockScreen.passcode,'_'); - if (c) { - if (tag == '<') { - if (c != screen_data.LockScreen.passcode) { - // Backspace deletes previous entered characters. - *--c = '_'; - } - } - else { - // Append character to passcode - *c++ = tag; - if (*c == '\0') { - // If at last character, then process the code. - onPasscodeEntered(); - } - } - } - return true; -} - -uint16_t LockScreen::compute_checksum() { - uint16_t checksum = 0; - const char* c = screen_data.LockScreen.passcode; - while (*c) { - checksum = (checksum << 2) ^ *c++; - } - if (checksum == 0) checksum = 0xFFFF; // Prevent a zero checksum - return checksum; -} - -// This function should be called *after* calling GOTO_SCREEN -// to move to new screen. If a passcode is enabled, it will -// immediately jump to the keypad screen, pushing the previous -// screen onto the stack. If the code is entered correctly, -// the stack will be popped, allowing the user to proceed to -// the new screen. Otherwise it will be popped twice, taking -// the user back to where they were before. -void LockScreen::check_passcode() { - if (passcode == 0) return; - message_style() = 0; - GOTO_SCREEN(LockScreen); -} - -bool LockScreen::is_enabled() { - return passcode != 0; -} - -void LockScreen::disable() { - passcode = 0; -} - -void LockScreen::enable() { - message_style() = 0; - passcode = 0; - GOTO_SCREEN(LockScreen); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp deleted file mode 100644 index 53e3ab00c7..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/***************** - * main_menu.cpp * - *****************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2019 - Cocoa Press * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && !defined(TOUCH_UI_LULZBOT_BIO) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -void MainMenu::onRedraw(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)); - } - - #ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 8 - #define GRID_COLS 2 - #define ABOUT_PRINTER_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define ADVANCED_SETTINGS_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(2,1) - #define DISABLE_STEPPERS_POS BTN_POS(1,5), BTN_SIZE(2,1) - #define MOVE_AXIS_POS BTN_POS(1,6), BTN_SIZE(1,1) - #define LEVELING_POS BTN_POS(2,6), BTN_SIZE(1,1) - #define AUTO_HOME_POS BTN_POS(1,7), BTN_SIZE(1,1) - #define CLEAN_NOZZLE_POS BTN_POS(2,7), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) - #else - #define GRID_ROWS 5 - #define GRID_COLS 2 - #define ADVANCED_SETTINGS_POS BTN_POS(1,1), BTN_SIZE(1,1) - #define ABOUT_PRINTER_POS BTN_POS(2,1), BTN_SIZE(1,1) - #define AUTO_HOME_POS BTN_POS(1,2), BTN_SIZE(1,1) - #define CLEAN_NOZZLE_POS BTN_POS(2,2), BTN_SIZE(1,1) - #define MOVE_AXIS_POS BTN_POS(1,3), BTN_SIZE(1,1) - #define DISABLE_STEPPERS_POS BTN_POS(2,3), BTN_SIZE(1,1) - #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(1,1) - #define FILAMENTCHANGE_POS BTN_POS(2,4), BTN_SIZE(1,1) - #define LEVELING_POS BTN_POS(1,5), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(2,5), BTN_SIZE(1,1) - #endif - - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(Theme::font_medium) - .tag(2).button( AUTO_HOME_POS, GET_TEXT_F(MSG_AUTO_HOME)) - .enabled( - #if ANY(NOZZLE_CLEAN_FEATURE, TOUCH_UI_COCOA_PRESS) - 1 - #endif - ) - .tag(3).button( CLEAN_NOZZLE_POS, GET_TEXT_F( - #if ENABLED(TOUCH_UI_COCOA_PRESS) - MSG_PREHEAT_1 - #else - MSG_CLEAN_NOZZLE - #endif - )) - .tag(4).button( MOVE_AXIS_POS, GET_TEXT_F(MSG_MOVE_AXIS)) - .tag(5).button( DISABLE_STEPPERS_POS, GET_TEXT_F(MSG_DISABLE_STEPPERS)) - .tag(6).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) - .enabled( - #if DISABLED(TOUCH_UI_LULZBOT_BIO) - 1 - #endif - ) - .tag(7).button( FILAMENTCHANGE_POS, GET_TEXT_F( - #if ENABLED(TOUCH_UI_COCOA_PRESS) - MSG_CASE_LIGHT - #else - MSG_FILAMENTCHANGE - #endif - )) - .tag(8).button( ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) - .enabled( - #ifdef HAS_LEVELING - 1 - #endif - ) - .tag(9).button( LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) - .tag(10).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) - .colors(action_btn) - .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); - } -} - -bool MainMenu::onTouchEnd(uint8_t tag) { - using namespace ExtUI; - - switch (tag) { - case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; - case 2: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break; - #if ENABLED(TOUCH_UI_COCOA_PRESS) - case 3: GOTO_SCREEN(PreheatMenu); break; - #elif ENABLED(NOZZLE_CLEAN_FEATURE) - case 3: injectCommands_P(PSTR("G12")); GOTO_SCREEN(StatusScreen); break; - #endif - case 4: GOTO_SCREEN(MoveAxisScreen); break; - case 5: injectCommands_P(PSTR("M84")); break; - case 6: GOTO_SCREEN(TemperatureScreen); break; - #if BOTH(TOUCH_UI_COCOA_PRESS, CASE_LIGHT_ENABLE) - case 7: GOTO_SCREEN(CaseLightScreen); break; - #else - case 7: GOTO_SCREEN(ChangeFilamentScreen); break; - #endif - case 8: GOTO_SCREEN(AdvancedSettingsMenu); break; - #ifdef HAS_LEVELING - case 9: GOTO_SCREEN(LevelingMenu); break; - #endif - case 10: GOTO_SCREEN(AboutScreen); break; - default: - return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp deleted file mode 100644 index 29ac2f1b40..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/******************************* - * max_acceleration_screen.cpp * - *******************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void MaxAccelerationScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(0); - w.units(GET_TEXT_F(MSG_UNITS_MM_S2)); - w.heading(GET_TEXT_F(MSG_ACCELERATION)); - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AMAX_X), getAxisMaxAcceleration_mm_s2(X) ); - w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AMAX_Y), getAxisMaxAcceleration_mm_s2(Y) ); - w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AMAX_Z), getAxisMaxAcceleration_mm_s2(Z) ); - #if DISTINCT_E == 1 - w.color(e_axis).adjuster( 8, GET_TEXT_F(MSG_AMAX_E), getAxisMaxAcceleration_mm_s2(E0) ); - #elif DISTINCT_E > 1 - w.heading(GET_TEXT_F(MSG_AMAX_E)); - w.color(e_axis).adjuster( 8, F(LCD_STR_E0), getAxisMaxAcceleration_mm_s2(E0) ); - w.color(e_axis).adjuster(10, F(LCD_STR_E1), getAxisMaxAcceleration_mm_s2(E1) ); - #if DISTINCT_E > 2 - w.color(e_axis).adjuster(12, F(LCD_STR_E2), getAxisMaxAcceleration_mm_s2(E2) ); - #endif - #if DISTINCT_E > 3 - w.color(e_axis).adjuster(14, F(LCD_STR_E3), getAxisMaxAcceleration_mm_s2(E3) ); - #endif - #endif - w.increments(); -} - -bool MaxAccelerationScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(AxisMaxAcceleration_mm_s2, X ); break; - case 3: UI_INCREMENT(AxisMaxAcceleration_mm_s2, X ); break; - case 4: UI_DECREMENT(AxisMaxAcceleration_mm_s2, Y ); break; - case 5: UI_INCREMENT(AxisMaxAcceleration_mm_s2, Y ); break; - case 6: UI_DECREMENT(AxisMaxAcceleration_mm_s2, Z ); break; - case 7: UI_INCREMENT(AxisMaxAcceleration_mm_s2, Z ); break; - case 8: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E0); break; - case 9: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E0); break; - #if DISTINCT_E > 1 - case 10: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E1); break; - case 11: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E1); break; - #endif - #if DISTINCT_E > 2 - case 12: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E2); break; - case 13: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E2); break; - #endif - #if DISTINCT_E > 3 - case 14: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E3); break; - case 15: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E3); break; - #endif - default: - return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp deleted file mode 100644 index 2316f93ee2..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/*************************** - * max_velocity_screen.cpp * - ***************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void MaxVelocityScreen::onRedraw(draw_mode_t what) { - using namespace ExtUI; - widgets_t w(what); - w.precision(0); - w.units(GET_TEXT_F(MSG_UNITS_MM_S)); - w.heading( GET_TEXT_F(MSG_VELOCITY)); - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_VMAX_X), getAxisMaxFeedrate_mm_s(X) ); - w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_VMAX_Y), getAxisMaxFeedrate_mm_s(Y) ); - w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_VMAX_Z), getAxisMaxFeedrate_mm_s(Z) ); - #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS) - w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_VMAX_E), getAxisMaxFeedrate_mm_s(E0) ); - #elif HAS_MULTI_EXTRUDER - w.heading(GET_TEXT_F(MSG_VMAX_E)); - w.color(e_axis) .adjuster( 8, F(LCD_STR_E0), getAxisMaxFeedrate_mm_s(E0) ); - w.color(e_axis) .adjuster( 10, F(LCD_STR_E1), getAxisMaxFeedrate_mm_s(E1) ); - #if EXTRUDERS > 2 - w.color(e_axis).adjuster( 12, F(LCD_STR_E2), getAxisMaxFeedrate_mm_s(E2) ); - #endif - #if EXTRUDERS > 3 - w.color(e_axis).adjuster( 14, F(LCD_STR_E3), getAxisMaxFeedrate_mm_s(E3) ); - #endif - #endif - w.increments(); -} - -bool MaxVelocityScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(AxisMaxFeedrate_mm_s, X); break; - case 3: UI_INCREMENT(AxisMaxFeedrate_mm_s, X); break; - case 4: UI_DECREMENT(AxisMaxFeedrate_mm_s, Y); break; - case 5: UI_INCREMENT(AxisMaxFeedrate_mm_s, Y); break; - case 6: UI_DECREMENT(AxisMaxFeedrate_mm_s, Z); break; - case 7: UI_INCREMENT(AxisMaxFeedrate_mm_s, Z); break; - #if DISTINCT_E > 0 - case 8: UI_DECREMENT(AxisMaxFeedrate_mm_s, E0); break; - case 9: UI_INCREMENT(AxisMaxFeedrate_mm_s, E0); break; - #endif - #if DISTINCT_E > 1 - case 10: UI_DECREMENT(AxisMaxFeedrate_mm_s, E1); break; - case 11: UI_INCREMENT(AxisMaxFeedrate_mm_s, E1); break; - #endif - #if DISTINCT_E > 2 - case 12: UI_DECREMENT(AxisMaxFeedrate_mm_s, E2); break; - case 13: UI_INCREMENT(AxisMaxFeedrate_mm_s, E2); break; - #endif - #if DISTINCT_E > 3 - case 14: UI_DECREMENT(AxisMaxFeedrate_mm_s, E3); break; - case 15: UI_INCREMENT(AxisMaxFeedrate_mm_s, E3); break; - #endif - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp deleted file mode 100644 index d7e476e04e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/*************************** - * media_player_screen.cpp * - ***************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -/** - * The MediaPlayerScreen allows an AVI to be played. - * - * It requires a special AVI file. The following video - * and audio codecs must be used: - * - * -vcodec mjpeg -pix_fmt yuvj420p - * -acodec adpcm_ima_wav - * - * To generate a 2 second static screen from a png file: - * - * ffmpeg -i startup.png -vcodec mjpeg -pix_fmt yuvj420p -r 1 video.avi - * sox -n -r 44100 -b 8 -c 2 -L silence.wav trim 0.0 2.000 - * ffmpeg -i silence.wav -acodec adpcm_ima_wav silence.avi - * ffmpeg -i video.avi -i silence.wav -c copy -map 0:v:0 -map 1:a:0 startup.avi - */ - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -#include "../archim2-flash/flash_storage.h" -#include "../archim2-flash/media_file_reader.h" - -using namespace FTDI; - -void MediaPlayerScreen::onEntry() { - BaseScreen::onEntry(); - CLCD::turn_on_backlight(); - SoundPlayer::set_volume(255); -} - -void MediaPlayerScreen::onRedraw(draw_mode_t) { -} - -bool MediaPlayerScreen::playCardMedia() { - #if ENABLED(SDSUPPORT) - char fname[15]; - strcpy_P(fname, PSTR("STARTUP.AVI")); - - MediaFileReader reader; - if (!reader.open(fname)) - return false; - - SERIAL_ECHO_MSG("Starting to play STARTUP.AVI"); - playStream(&reader, MediaFileReader::read); - reader.close(); - #endif - return true; -} - -// Attempt to play media from the onboard SPI flash chip -bool MediaPlayerScreen::playBootMedia() { - UIFlashStorage::BootMediaReader reader; - if (!reader.isAvailable()) return false; - - SERIAL_ECHO_MSG("Starting to play boot video"); - playStream(&reader, UIFlashStorage::BootMediaReader::read); - return true; -} - -void MediaPlayerScreen::playStream(void *obj, media_streamer_func_t *data_stream) { - #if FTDI_API_LEVEL >= 810 - if (FTDI::ftdi_chip >= 810) { - // Set up the media FIFO on the end of RAMG, as the top of RAMG - // will be used as the framebuffer. - - uint8_t buf[512]; - const uint32_t block_size = 512; - const uint32_t fifo_size = block_size * 2; - const uint32_t fifo_start = CLCD::MAP::RAM_G + CLCD::MAP::RAM_G_SIZE - fifo_size; - - CommandProcessor cmd; - cmd.cmd(CMD_DLSTART) - .cmd(CLEAR_COLOR_RGB(0x000000)) - .cmd(CLEAR(true,true,true)) - .cmd(DL::DL_DISPLAY) - .cmd(CMD_SWAP) - .execute() - .cmd(CMD_DLSTART) - .mediafifo(fifo_start, fifo_size) - .playvideo(OPT_FULLSCREEN | OPT_MEDIAFIFO | OPT_NOTEAR | OPT_SOUND) - .cmd(DL::DL_DISPLAY) - .cmd(CMD_SWAP) - .execute(); - - uint32_t writePtr = 0; - int16_t nBytes; - - uint32_t t = millis(); - uint8_t timeouts; - - spiInit(SPI_HALF_SPEED); // Boost SPI speed for video playback - - do { - // Write block n - nBytes = (*data_stream)(obj, buf, block_size); - if (nBytes == -1) break; - - if (millis() - t > 10) { - ExtUI::yield(); - t = millis(); - } - - CLCD::mem_write_bulk (fifo_start + writePtr, buf, nBytes); - - // Wait for FTDI810 to finish playing block n-1 - timeouts = 20; - do { - if (millis() - t > 10) { - ExtUI::yield(); - t = millis(); - timeouts--; - if (timeouts == 0) { - SERIAL_ECHO_MSG("Timeout playing video"); - cmd.reset(); - goto exit; - } - } - } while (CLCD::mem_read_32(CLCD::REG::MEDIAFIFO_READ) != writePtr); - - // Start playing block n - writePtr = (writePtr + nBytes) % fifo_size; - CLCD::mem_write_32(CLCD::REG::MEDIAFIFO_WRITE, writePtr); - } while (nBytes == block_size); - - SERIAL_ECHO_MSG("Done playing video"); - - exit: - spiInit(SPI_SPEED); // Restore default speed - - // Since playing media overwrites RAMG, we need to reinitialize - // everything that is stored in RAMG. - cmd.cmd(CMD_DLSTART).execute(); - DLCache::init(); - StatusScreen::loadBitmaps(); - } - #else - UNUSED(obj); - UNUSED(data_stream); - #endif // FTDI_API_LEVEL >= 810 -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp deleted file mode 100644 index 5dd3174821..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/************************ - * move_axis_screen.cpp * - ************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace ExtUI; - -void MoveAxisScreen::onEntry() { - // Since Marlin keeps only one absolute position for all the extruders, - // we have to keep track of the relative motion of individual extruders - // ourselves. The relative distances are reset to zero whenever this - // screen is entered. - - LOOP_L_N(i, ExtUI::extruderCount) { - screen_data.MoveAxisScreen.e_rel[i] = 0; - } - BaseNumericAdjustmentScreen::onEntry(); -} - -void MoveAxisScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(1); - w.units(GET_TEXT_F(MSG_UNITS_MM)); - w.heading( GET_TEXT_F(MSG_MOVE_AXIS)); - w.home_buttons(20); - w.color(Theme::x_axis).adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisPosition_mm(X), canMove(X)); - w.color(Theme::y_axis).adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getAxisPosition_mm(Y), canMove(Y)); - w.color(Theme::z_axis).adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisPosition_mm(Z), canMove(Z)); - - w.color(Theme::e_axis); - #if EXTRUDERS == 1 - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); - #elif HAS_MULTI_EXTRUDER - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); - w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1)); - #if EXTRUDERS > 2 - w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxisScreen.e_rel[2], canMove(E2)); - #endif - #if EXTRUDERS > 3 - w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxisScreen.e_rel[3], canMove(E3)); - #endif - #endif - w.increments(); -} - -bool MoveAxisScreen::onTouchHeld(uint8_t tag) { - #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); - #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT_AXIS(X); break; - case 3: UI_INCREMENT_AXIS(X); break; - case 4: UI_DECREMENT_AXIS(Y); break; - case 5: UI_INCREMENT_AXIS(Y); break; - case 6: UI_DECREMENT_AXIS(Z); break; - case 7: UI_INCREMENT_AXIS(Z); break; - // For extruders, also update relative distances. - case 8: UI_DECREMENT_AXIS(E0); screen_data.MoveAxisScreen.e_rel[0] -= increment; break; - case 9: UI_INCREMENT_AXIS(E0); screen_data.MoveAxisScreen.e_rel[0] += increment; break; - #if HAS_MULTI_EXTRUDER - case 10: UI_DECREMENT_AXIS(E1); screen_data.MoveAxisScreen.e_rel[1] -= increment; break; - case 11: UI_INCREMENT_AXIS(E1); screen_data.MoveAxisScreen.e_rel[1] += increment; break; - #endif - #if EXTRUDERS > 2 - case 12: UI_DECREMENT_AXIS(E2); screen_data.MoveAxisScreen.e_rel[2] -= increment; break; - case 13: UI_INCREMENT_AXIS(E2); screen_data.MoveAxisScreen.e_rel[2] += increment; break; - #endif - #if EXTRUDERS > 3 - case 14: UI_DECREMENT_AXIS(E3); screen_data.MoveAxisScreen.e_rel[3] -= increment; break; - case 15: UI_INCREMENT_AXIS(E3); screen_data.MoveAxisScreen.e_rel[3] += increment; break; - #endif - case 20: SpinnerDialogBox::enqueueAndWait_P(F("G28 X")); break; - case 21: SpinnerDialogBox::enqueueAndWait_P(F("G28 Y")); break; - case 22: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break; - case 23: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break; - default: - return false; - } - #undef UI_DECREMENT_AXIS - #undef UI_INCREMENT_AXIS - return true; -} - -float MoveAxisScreen::getManualFeedrate(uint8_t axis, float increment_mm) { - // Compute feedrate so that the tool lags the adjuster when it is - // being held down, this allows enough margin for the planner to - // connect segments and even out the motion. - constexpr xyze_feedrate_t max_manual_feedrate = MANUAL_FEEDRATE; - return min(max_manual_feedrate[axis] / 60.0f, abs(increment_mm * (TOUCH_REPEATS_PER_SECOND) * 0.80f)); -} - -void MoveAxisScreen::setManualFeedrate(ExtUI::axis_t axis, float increment_mm) { - ExtUI::setFeedrate_mm_s(getManualFeedrate(X_AXIS + (axis - ExtUI::X), increment_mm)); -} - -void MoveAxisScreen::setManualFeedrate(ExtUI::extruder_t, float increment_mm) { - ExtUI::setFeedrate_mm_s(getManualFeedrate(E_AXIS, increment_mm)); -} - -void MoveAxisScreen::onIdle() { - if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { - onRefresh(); - refresh_timer.start(); - } - BaseScreen::onIdle(); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp deleted file mode 100644 index 07d6900c16..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/***************************** - * nozzle_offsets_screen.cpp * - *****************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_MULTI_HOTEND) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; - -void NozzleOffsetScreen::onEntry() { - // Since we don't allow the user to edit the offsets for E0, - // make sure they are all zero. - normalizeNozzleOffset(X); - normalizeNozzleOffset(Y); - normalizeNozzleOffset(Z); -} - -void NozzleOffsetScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(2).units(GET_TEXT_F(MSG_UNITS_MM)); - - w.heading( GET_TEXT_F(MSG_OFFSETS_MENU)); - w.color(Theme::x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), ExtUI::getNozzleOffset_mm(X, E1)); - w.color(Theme::y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), ExtUI::getNozzleOffset_mm(Y, E1)); - w.color(Theme::z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), ExtUI::getNozzleOffset_mm(Z, E1)); - #if ENABLED(CALIBRATION_GCODE) - w.button(8, GET_TEXT_F(MSG_MEASURE_AUTOMATICALLY), !isPrinting()); - #endif - w.increments(); -} - -bool NozzleOffsetScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(NozzleOffset_mm, X, E1); break; - case 3: UI_INCREMENT(NozzleOffset_mm, X, E1); break; - case 4: UI_DECREMENT(NozzleOffset_mm, Y, E1); break; - case 5: UI_INCREMENT(NozzleOffset_mm, Y, E1); break; - case 6: UI_DECREMENT(NozzleOffset_mm, Z, E1); break; - case 7: UI_INCREMENT(NozzleOffset_mm, Z, E1); break; - #if ENABLED(CALIBRATION_GCODE) - case 8: GOTO_SCREEN(ConfirmAutoCalibrationDialogBox); return true; - #endif - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp deleted file mode 100644 index ed3c8d999b..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/******************** - * nudge_nozzle.cpp * - ********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, BABYSTEPPING) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -void NudgeNozzleScreen::onEntry() { - screen_data.NudgeNozzleScreen.show_offsets = false; - #if HAS_MULTI_EXTRUDER - screen_data.NudgeNozzleScreen.link_nozzles = true; - #endif - screen_data.NudgeNozzleScreen.rel.reset(); - - BaseNumericAdjustmentScreen::onEntry(); -} - -void NudgeNozzleScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXT_F(MSG_UNITS_MM)); - - w.heading(GET_TEXT_F(MSG_NUDGE_NOZZLE)); - #if ENABLED(BABYSTEP_XY) - w.color(x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), screen_data.NudgeNozzleScreen.rel.x / getAxisSteps_per_mm(X)); - w.color(y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), screen_data.NudgeNozzleScreen.rel.y / getAxisSteps_per_mm(Y)); - #endif - w.color(z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), screen_data.NudgeNozzleScreen.rel.z / getAxisSteps_per_mm(Z)); - w.increments(); - #if HAS_MULTI_EXTRUDER - w.toggle(8, GET_TEXT_F(MSG_ADJUST_BOTH_NOZZLES), screen_data.NudgeNozzleScreen.link_nozzles); - #endif - - #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE - w.toggle(9, GET_TEXT_F(MSG_SHOW_OFFSETS), screen_data.NudgeNozzleScreen.show_offsets); - - if (screen_data.NudgeNozzleScreen.show_offsets) { - char str[19]; - - w.draw_mode(BOTH); - w.color(other); - - #if HAS_BED_PROBE - dtostrf(getZOffset_mm(), 4, 2, str); - strcat(str, " "); - strcat_P(str, GET_TEXT(MSG_UNITS_MM)); - w.text_field(0, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), str); - #endif - - #if HAS_MULTI_HOTEND - format_position(str, getNozzleOffset_mm(X, E1), getNozzleOffset_mm(Y, E1), getNozzleOffset_mm(Z, E1)); - w.text_field(0, GET_TEXT_F(MSG_OFFSETS_MENU), str); - #endif - } - #endif -} - -bool NudgeNozzleScreen::onTouchHeld(uint8_t tag) { - const float inc = getIncrement(); - #if HAS_MULTI_EXTRUDER - const bool link = screen_data.NudgeNozzleScreen.link_nozzles; - #else - constexpr bool link = true; - #endif - int16_t steps; - switch (tag) { - case 2: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps(-steps, X, link); screen_data.NudgeNozzleScreen.rel.x -= steps; break; - case 3: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps( steps, X, link); screen_data.NudgeNozzleScreen.rel.x += steps; break; - case 4: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps(-steps, Y, link); screen_data.NudgeNozzleScreen.rel.y -= steps; break; - case 5: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps( steps, Y, link); screen_data.NudgeNozzleScreen.rel.y += steps; break; - case 6: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps(-steps, Z, link); screen_data.NudgeNozzleScreen.rel.z -= steps; break; - case 7: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps( steps, Z, link); screen_data.NudgeNozzleScreen.rel.z += steps; break; - #if HAS_MULTI_EXTRUDER - case 8: screen_data.NudgeNozzleScreen.link_nozzles = !link; break; - #endif - case 9: screen_data.NudgeNozzleScreen.show_offsets = !screen_data.NudgeNozzleScreen.show_offsets; break; - default: return false; - } - #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE - SaveSettingsDialogBox::settingsChanged(); - #endif - return true; -} - -bool NudgeNozzleScreen::onTouchEnd(uint8_t tag) { - if (tag == 1) { - SaveSettingsDialogBox::promptToSaveSettings(); - return true; - } - else - return BaseNumericAdjustmentScreen::onTouchEnd(tag); -} - -void NudgeNozzleScreen::onIdle() { - reset_menu_timeout(); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp deleted file mode 100644 index a8891162ea..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/******************** - * preheat_menu.cpp * - ********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2020 - Cocoa Press * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_COCOA_PRESS) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void PreheatMenu::onRedraw(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)) - .tag(0); - } - - #define GRID_ROWS 3 - #define GRID_COLS 2 - - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.cmd(COLOR_RGB(bg_text_enabled)) - .font(Theme::font_medium) - .text ( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_PREHEAT_1)) - .colors(normal_btn) - .tag(2).button( BTN_POS(1,2), BTN_SIZE(1,1), F("Dark Chocolate")) - .tag(3).button( BTN_POS(2,2), BTN_SIZE(1,1), F("Milk Chocolate")) - .tag(4).button( BTN_POS(1,3), BTN_SIZE(1,1), F("White Chocolate")) - .colors(action_btn) - .tag(1) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_BACK)); - } -} - -bool PreheatMenu::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - case 2: - #ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT - injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT)); - #endif - GOTO_SCREEN(PreheatTimerScreen); - break; - case 3: - #ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT - injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT)); - #endif - GOTO_SCREEN(PreheatTimerScreen); - break; - case 4: - #ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT - injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT)); - #endif - GOTO_SCREEN(PreheatTimerScreen); - break; - default: return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp deleted file mode 100644 index 69eecaf54b..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/**************************** - * preheat_timer_screen.cpp * - ****************************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - Cocoa Press * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_COCOA_PRESS) - -#include "screens.h" -#include "screen_data.h" - -#include "../ftdi_eve_lib/extras/circular_progress.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -#define GRID_COLS 2 -#define GRID_ROWS 5 - -void PreheatTimerScreen::draw_message(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0); - draw_text_box(cmd, BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_HEATING), OPT_CENTER, font_large); - } -} - -uint16_t PreheatTimerScreen::secondsRemaining() { - const uint32_t elapsed_sec = (millis() - screen_data.PreheatTimerScreen.start_ms) / 1000; - return (COCOA_PRESS_PREHEAT_SECONDS > elapsed_sec) ? COCOA_PRESS_PREHEAT_SECONDS - elapsed_sec : 0; -} - -void PreheatTimerScreen::draw_time_remaining(draw_mode_t what) { - if (what & FOREGROUND) { - const uint16_t elapsed_sec = secondsRemaining(); - const uint8_t min = elapsed_sec / 60, - sec = elapsed_sec % 60; - - char str[10]; - sprintf_P(str, PSTR("%02d:%02d"), min, sec); - - CommandProcessor cmd; - cmd.font(font_xlarge); - draw_circular_progress(cmd, BTN_POS(1,1), BTN_SIZE(1,5), float(secondsRemaining()) * 100 / COCOA_PRESS_PREHEAT_SECONDS, str, theme_dark, theme_darkest); - } -} - -void PreheatTimerScreen::draw_interaction_buttons(draw_mode_t what) { - if (what & FOREGROUND) { - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(font_medium) - .tag(1).button( BTN_POS(2,5), BTN_SIZE(1,1), F("Cancel")); - } -} - -void PreheatTimerScreen::onEntry() { - screen_data.PreheatTimerScreen.start_ms = millis(); -} - -void PreheatTimerScreen::onRedraw(draw_mode_t what) { - draw_message(what); - draw_time_remaining(what); - draw_interaction_buttons(what); -} - -bool PreheatTimerScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); return true; - default: break; - } - return false; -} - -void PreheatTimerScreen::onIdle() { - if (secondsRemaining() == 0) { - AlertDialogBox::show(GET_TEXT_F(MSG_PREHEAT_FINISHED)); - // Remove SaveSettingsDialogBox from the stack - // so the alert box doesn't return to me. - current_screen.forget(); - } - - reset_menu_timeout(); - if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { - onRefresh(); - refresh_timer.start(); - } - BaseScreen::onIdle(); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp deleted file mode 100644 index 94b8ac0fb5..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/*********************************** - * restore_failsafe_dialog_box.cpp * - ***********************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace ExtUI; - -void RestoreFailsafeDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXT_F(MSG_EEPROM_RESET_WARNING)); - drawYesNoButtons(); -} - -bool RestoreFailsafeDialogBox::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: - ExtUI::injectCommands_P(PSTR("M502")); - AlertDialogBox::show(GET_TEXT_F(MSG_EEPROM_RESET)); - // Remove RestoreFailsafeDialogBox from the stack - // so the alert box doesn't return to it. - current_screen.forget(); - SaveSettingsDialogBox::settingsChanged(); - return true; - default: - return DialogBoxBaseClass::onTouchEnd(tag); - } -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp deleted file mode 100644 index f4a99accd6..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/******************************** - * save_settings_dialog_box.cpp * - ********************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace ExtUI; - -bool SaveSettingsDialogBox::needs_save = false; - -void SaveSettingsDialogBox::onRedraw(draw_mode_t) { - drawMessage(GET_TEXT_F(MSG_EEPROM_SAVE_PROMPT)); - drawYesNoButtons(); -} - -bool SaveSettingsDialogBox::onTouchEnd(uint8_t tag) { - needs_save = false; - switch (tag) { - case 1: - injectCommands_P(PSTR("M500")); - AlertDialogBox::show(GET_TEXT_F(MSG_EEPROM_SAVED)); - // Remove SaveSettingsDialogBox from the stack - // so the alert box doesn't return to me. - current_screen.forget(); - return true; - default: - return DialogBoxBaseClass::onTouchEnd(tag); - } -} - -void SaveSettingsDialogBox::promptToSaveSettings() { - if (needs_save) { - // Remove current screen from the stack - // so SaveSettingsDialogBox doesn't return here. - GOTO_SCREEN(SaveSettingsDialogBox); - current_screen.forget(); - } else { - // No save needed. - GOTO_PREVIOUS(); - } -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h deleted file mode 100644 index dc38890a0e..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ /dev/null @@ -1,97 +0,0 @@ -/***************** - * screen_data.h * - *****************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "../ftdi_eve_lib/ftdi_eve_lib.h" - -// To save RAM, store state information related to a particular screen -// in a union. The values should be initialized in the onEntry method. - -struct base_numeric_adjustment_t {uint8_t increment;}; - -union screen_data_t { - struct base_numeric_adjustment_t BaseNumericAdjustmentScreen; - struct {uint8_t volume; uint8_t brightness;} InterfaceSettingsScreen; - struct {char passcode[5];} LockScreen; - struct {bool isError;} AlertDialogBox; - struct {bool auto_hide;} SpinnerDialogBox; - struct {uint8_t file_index;} ConfirmStartPrintDialogBox; - struct { - uint8_t e_tag, t_tag, repeat_tag; - ExtUI::extruder_t saved_extruder; - #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 - bool need_purge; - #endif - } ChangeFilamentScreen; - struct { - struct { - uint8_t is_dir : 1; - uint8_t is_root : 1; - } flags; - uint8_t selected_tag; - uint8_t num_page; - uint8_t cur_page; - #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) - uint16_t scroll_pos; - uint16_t scroll_max; - #endif - } FilesScreen; - struct { - struct base_numeric_adjustment_t placeholder; - float e_rel[ExtUI::extruderCount]; - } MoveAxisScreen; - #if HAS_MESH - struct { - enum : uint8_t { - MSG_NONE, - MSG_MESH_COMPLETE, - MSG_MESH_INCOMPLETE - } message; - uint8_t count; - uint8_t highlightedTag; - } BedMeshScreen; - #endif - #if ENABLED(TOUCH_UI_DEVELOPER_MENU) - struct { - uint32_t next_watchdog_trigger; - const char* message; - } StressTestScreen; - #endif - #if ENABLED(TOUCH_UI_COCOA_PRESS) - struct { - uint32_t start_ms; - } PreheatTimerScreen; - #endif - #if ENABLED(BABYSTEPPING) - struct { - struct base_numeric_adjustment_t placeholder; - xyz_int_t rel; - #if HAS_MULTI_EXTRUDER - bool link_nozzles; - #endif - bool show_offsets; - } NudgeNozzleScreen; - #endif -}; - -extern screen_data_t screen_data; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp deleted file mode 100644 index 16aa682168..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/*************** - * screens.cpp * - ***************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) -#include "screens.h" -#include "screen_data.h" - -tiny_timer_t refresh_timer; -screen_data_t screen_data; - -SCREEN_TABLE { - DECL_SCREEN(BootScreen), - #if NUM_LANGUAGES > 1 - DECL_SCREEN(LanguageMenu), - #endif - DECL_SCREEN(TouchCalibrationScreen), - DECL_SCREEN(StatusScreen), - DECL_SCREEN(MainMenu), - DECL_SCREEN(TuneMenu), - DECL_SCREEN(AdvancedSettingsMenu), - DECL_SCREEN(AlertDialogBox), - DECL_SCREEN(ConfirmUserRequestAlertBox), - DECL_SCREEN(RestoreFailsafeDialogBox), - DECL_SCREEN(SaveSettingsDialogBox), - DECL_SCREEN(ConfirmStartPrintDialogBox), - DECL_SCREEN(ConfirmAbortPrintDialogBox), -#if ENABLED(CALIBRATION_GCODE) - DECL_SCREEN(ConfirmAutoCalibrationDialogBox), -#endif - DECL_SCREEN(SpinnerDialogBox), - DECL_SCREEN(AboutScreen), -#if ENABLED(PRINTCOUNTER) - DECL_SCREEN(StatisticsScreen), -#endif -#if ENABLED(BABYSTEPPING) - DECL_SCREEN(NudgeNozzleScreen), -#endif - DECL_SCREEN(MoveAxisScreen), - DECL_SCREEN(StepsScreen), -#if HAS_TRINAMIC_CONFIG - DECL_SCREEN(StepperCurrentScreen), - DECL_SCREEN(StepperBumpSensitivityScreen), -#endif -#if HAS_LEVELING - DECL_SCREEN(LevelingMenu), - #if HAS_BED_PROBE - DECL_SCREEN(ZOffsetScreen), - #endif - #if HAS_MESH - DECL_SCREEN(BedMeshScreen), - #endif -#endif -#if HAS_MULTI_HOTEND - DECL_SCREEN(NozzleOffsetScreen), -#endif -#if ENABLED(BACKLASH_GCODE) - DECL_SCREEN(BacklashCompensationScreen), -#endif - DECL_SCREEN(FeedratePercentScreen), - DECL_SCREEN(MaxVelocityScreen), - DECL_SCREEN(MaxAccelerationScreen), - DECL_SCREEN(DefaultAccelerationScreen), -#if HAS_JUNCTION_DEVIATION - DECL_SCREEN(JunctionDeviationScreen), -#else - DECL_SCREEN(JerkScreen), -#endif -#if ENABLED(CASE_LIGHT_ENABLE) - DECL_SCREEN(CaseLightScreen), -#endif -#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - DECL_SCREEN(FilamentMenu), -#endif -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - DECL_SCREEN(FilamentRunoutScreen), -#endif -#if ENABLED(LIN_ADVANCE) - DECL_SCREEN(LinearAdvanceScreen), -#endif - DECL_SCREEN(TemperatureScreen), - DECL_SCREEN(ChangeFilamentScreen), - DECL_SCREEN(InterfaceSettingsScreen), - DECL_SCREEN(InterfaceSoundsScreen), - DECL_SCREEN(LockScreen), -#if ENABLED(SDSUPPORT) - DECL_SCREEN(FilesScreen), -#endif - DECL_SCREEN(EndstopStatesScreen), -#if ENABLED(TOUCH_UI_LULZBOT_BIO) - DECL_SCREEN(BioPrintingDialogBox), - DECL_SCREEN(BioConfirmHomeXYZ), - DECL_SCREEN(BioConfirmHomeE), -#endif -#if ENABLED(TOUCH_UI_COCOA_PRESS) - DECL_SCREEN(PreheatMenu), - DECL_SCREEN(PreheatTimerScreen), -#endif -#if ENABLED(TOUCH_UI_DEVELOPER_MENU) - DECL_SCREEN(DeveloperMenu), - DECL_SCREEN(ConfirmEraseFlashDialogBox), - DECL_SCREEN(WidgetsScreen), - DECL_SCREEN(TouchRegistersScreen), - DECL_SCREEN(StressTestScreen), -#endif - DECL_SCREEN(MediaPlayerScreen), - DECL_SCREEN(DisplayTuningScreen) -}; - -SCREEN_TABLE_POST - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h deleted file mode 100644 index 2108cff8df..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ /dev/null @@ -1,851 +0,0 @@ -/************* - * screens.h * - *************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "../ftdi_eve_lib/ftdi_eve_lib.h" -#include "../language/language.h" -#include "../theme/theme.h" -#include "string_format.h" - -#ifndef BED_LEVELING_COMMANDS - #define BED_LEVELING_COMMANDS "G29" -#endif - -extern tiny_timer_t refresh_timer; - -/********************************* DL CACHE SLOTS ******************************/ - -// In order to reduce SPI traffic, we cache display lists (DL) in RAMG. This -// is done using the CLCD::DLCache class, which takes a unique ID for each -// cache location. These IDs are defined here: - -enum { - STATUS_SCREEN_CACHE, - MENU_SCREEN_CACHE, - TUNE_SCREEN_CACHE, - ALERT_BOX_CACHE, - SPINNER_CACHE, - ADVANCED_SETTINGS_SCREEN_CACHE, - MOVE_AXIS_SCREEN_CACHE, - TEMPERATURE_SCREEN_CACHE, - STEPS_SCREEN_CACHE, - MAX_FEEDRATE_SCREEN_CACHE, - MAX_VELOCITY_SCREEN_CACHE, - MAX_ACCELERATION_SCREEN_CACHE, - DEFAULT_ACCELERATION_SCREEN_CACHE, -#if HAS_LEVELING - LEVELING_SCREEN_CACHE, - #if HAS_BED_PROBE - ZOFFSET_SCREEN_CACHE, - #endif - #if HAS_MESH - BED_MESH_SCREEN_CACHE, - #endif -#endif -#if ENABLED(BABYSTEPPING) - ADJUST_OFFSETS_SCREEN_CACHE, -#endif -#if HAS_TRINAMIC_CONFIG - STEPPER_CURRENT_SCREEN_CACHE, - STEPPER_BUMP_SENSITIVITY_SCREEN_CACHE, -#endif -#if HAS_MULTI_HOTEND - NOZZLE_OFFSET_SCREEN_CACHE, -#endif -#if ENABLED(BACKLASH_GCODE) - BACKLASH_COMPENSATION_SCREEN_CACHE, -#endif -#if HAS_JUNCTION_DEVIATION - JUNC_DEV_SCREEN_CACHE, -#else - JERK_SCREEN_CACHE, -#endif -#if ENABLED(CASE_LIGHT_ENABLE) - CASE_LIGHT_SCREEN_CACHE, -#endif -#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - FILAMENT_MENU_CACHE, -#endif -#if ENABLED(LIN_ADVANCE) - LINEAR_ADVANCE_SCREEN_CACHE, -#endif -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - FILAMENT_RUNOUT_SCREEN_CACHE, -#endif -#if ENABLED(TOUCH_UI_LULZBOT_BIO) - PRINTING_SCREEN_CACHE, -#endif -#if ENABLED(TOUCH_UI_COCOA_PRESS) - PREHEAT_MENU_CACHE, - PREHEAT_TIMER_SCREEN_CACHE, -#endif -#if ENABLED(SDSUPPORT) - FILES_SCREEN_CACHE, -#endif - CHANGE_FILAMENT_SCREEN_CACHE, - INTERFACE_SETTINGS_SCREEN_CACHE, - INTERFACE_SOUNDS_SCREEN_CACHE, - LOCK_SCREEN_CACHE, - DISPLAY_TIMINGS_SCREEN_CACHE -}; - -// To save MCU RAM, the status message is "baked" in to the status screen -// cache, so we reserve a large chunk of memory for the DL cache - -#define STATUS_SCREEN_DL_SIZE 2048 -#define ALERT_BOX_DL_SIZE 3072 -#define SPINNER_DL_SIZE 3072 -#define FILE_SCREEN_DL_SIZE 4160 -#define PRINTING_SCREEN_DL_SIZE 2048 - -/************************* MENU SCREEN DECLARATIONS *************************/ - -class BaseScreen : public UIScreen { - protected: - #if LCD_TIMEOUT_TO_STATUS > 0 - static uint32_t last_interaction; - #endif - - static bool buttonIsPressed(uint8_t tag); - - public: - static bool buttonStyleCallback(CommandProcessor &, uint8_t, uint8_t &, uint16_t &, bool); - - static void reset_menu_timeout(); - - static void onEntry(); - static void onIdle(); -}; - -class BootScreen : public BaseScreen, public UncachedScreen { - private: - static void showSplashScreen(); - public: - static void onRedraw(draw_mode_t); - static void onIdle(); -}; - -class AboutScreen : public BaseScreen, public UncachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -#if ENABLED(PRINTCOUNTER) - class StatisticsScreen : public BaseScreen, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; -#endif - -class KillScreen { - // The KillScreen is behaves differently than the - // others, so we do not bother extending UIScreen. - public: - static void show(const char*); -}; - -class DialogBoxBaseClass : public BaseScreen { - protected: - template static void drawMessage(const T, int16_t font = 0); - static void drawYesNoButtons(uint8_t default_btn = 0); - static void drawOkayButton(); - static void drawSpinner(); - static void drawButton(const progmem_str); - - static void onRedraw(draw_mode_t) {}; - public: - static bool onTouchEnd(uint8_t tag); - static void onIdle(); -}; - -class AlertDialogBox : public DialogBoxBaseClass, public CachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - template static void show(T); - template static void showError(T); - static void hide(); -}; - -class RestoreFailsafeDialogBox : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -class SaveSettingsDialogBox : public DialogBoxBaseClass, public UncachedScreen { - private: - static bool needs_save; - - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - - static void promptToSaveSettings(); - static void settingsChanged() {needs_save = true;} -}; - -class ConfirmStartPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { - private: - inline static const char *getShortFilename() {return getFilename(false);} - inline static const char *getLongFilename() {return getFilename(true);} - - static const char *getFilename(bool longName); - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t); - - static void show(uint8_t file_index); -}; - -class ConfirmAbortPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -#if ENABLED(CALIBRATION_GCODE) -class ConfirmAutoCalibrationDialogBox : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; -#endif - -class ConfirmUserRequestAlertBox : public AlertDialogBox { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t); - static void hide(); - static void show(const char*); -}; - -class SpinnerDialogBox : public DialogBoxBaseClass, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static void onIdle(); - - static void show(const progmem_str); - static void hide(); - static void enqueueAndWait_P(const progmem_str commands); - static void enqueueAndWait_P(const progmem_str message, const progmem_str commands); -}; - -#if NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) -class StatusScreen : public BaseScreen, public CachedScreen { - private: - static void draw_axis_position(draw_mode_t); - static void draw_temperature(draw_mode_t); - static void draw_progress(draw_mode_t); - static void draw_interaction_buttons(draw_mode_t); - static void draw_status_message(draw_mode_t, const char * const); - - public: - static void loadBitmaps(); - static void setStatusMessage(const char *); - static void setStatusMessage(progmem_str); - static void onRedraw(draw_mode_t); - static void onStartup(); - static void onEntry(); - static void onIdle(); - static bool onTouchEnd(uint8_t tag); -}; -#else - class StatusScreen : public BaseScreen, public CachedScreen { - private: - static float increment; - static bool jog_xy; - static bool fine_motion; - - static void draw_temperature(draw_mode_t what); - static void draw_syringe(draw_mode_t what); - static void draw_arrows(draw_mode_t what); - static void draw_overlay_icons(draw_mode_t what); - static void draw_fine_motion(draw_mode_t what); - static void draw_buttons(draw_mode_t what); - public: - static void loadBitmaps(); - static void unlockMotors(); - - static void setStatusMessage(const char *); - static void setStatusMessage(progmem_str); - - static void onRedraw(draw_mode_t); - - static bool onTouchStart(uint8_t tag); - static bool onTouchHeld(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); - - }; -#endif - -#if ENABLED(TOUCH_UI_LULZBOT_BIO) - class BioPrintingDialogBox : public BaseScreen, public CachedScreen { - private: - static void draw_status_message(draw_mode_t, const char * const); - static void draw_progress(draw_mode_t); - static void draw_time_remaining(draw_mode_t); - static void draw_interaction_buttons(draw_mode_t); - public: - static void onRedraw(draw_mode_t); - - static void show(); - - static void setStatusMessage(const char *); - static void setStatusMessage(progmem_str); - - static void onIdle(); - static bool onTouchEnd(uint8_t tag); - }; - - class BioConfirmHomeXYZ : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - - class BioConfirmHomeE : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; -#endif - -#if ENABLED(TOUCH_UI_COCOA_PRESS) - class PreheatMenu : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - - class PreheatTimerScreen : public BaseScreen, public CachedScreen { - private: - static uint16_t secondsRemaining(); - - static void draw_message(draw_mode_t); - static void draw_time_remaining(draw_mode_t); - static void draw_interaction_buttons(draw_mode_t); - public: - static void onRedraw(draw_mode_t); - - static void onEntry(); - static void onIdle(); - static bool onTouchEnd(uint8_t tag); - }; -#endif - -class MainMenu : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -class TuneMenu : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -class TouchCalibrationScreen : public BaseScreen, public UncachedScreen { - public: - static void onRefresh(); - static void onEntry(); - static void onRedraw(draw_mode_t); - static void onIdle(); -}; - -class TouchRegistersScreen : public BaseScreen, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -class AdvancedSettingsMenu : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -class ChangeFilamentScreen : public BaseScreen, public CachedScreen { - private: - static uint8_t getSoftenTemp(); - static ExtUI::extruder_t getExtruder(); - static void drawTempGradient(uint16_t x, uint16_t y, uint16_t w, uint16_t h); - static uint32_t getTempColor(uint32_t temp); - static void doPurge(); - public: - static void onEntry(); - static void onExit(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - static bool onTouchHeld(uint8_t tag); - static void onIdle(); -}; - -class BaseNumericAdjustmentScreen : public BaseScreen { - public: - enum precision_default_t { - DEFAULT_LOWEST, - DEFAULT_MIDRANGE, - DEFAULT_HIGHEST - }; - - protected: - class widgets_t { - private: - draw_mode_t _what; - uint8_t _line; - uint32_t _color; - uint8_t _decimals; - progmem_str _units; - enum style_t { - BTN_NORMAL, - BTN_ACTION, - BTN_TOGGLE, - BTN_DISABLED, - TEXT_AREA, - TEXT_LABEL - } _style; - - protected: - void _draw_increment_btn(CommandProcessor &, uint8_t line, const uint8_t tag); - void _button(CommandProcessor &, uint8_t tag, int16_t x, int16_t y, int16_t w, int16_t h, progmem_str, bool enabled = true, bool highlight = false); - void _button_style(CommandProcessor &cmd, style_t style); - public: - widgets_t(draw_mode_t); - - widgets_t &color(uint32_t color) {_color = color; return *this;} - widgets_t &units(progmem_str units) {_units = units; return *this;} - widgets_t &draw_mode(draw_mode_t what) {_what = what; return *this;} - widgets_t &precision(uint8_t decimals, precision_default_t = DEFAULT_HIGHEST); - - void heading (progmem_str label); - void adjuster_sram_val (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); - void adjuster (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); - void adjuster (uint8_t tag, progmem_str label, float value=0, bool is_enabled = true); - void button (uint8_t tag, progmem_str label, bool is_enabled = true); - void text_field (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); - void two_buttons (uint8_t tag1, progmem_str label1, - uint8_t tag2, progmem_str label2, bool is_enabled = true); - void toggle (uint8_t tag, progmem_str label, bool value, bool is_enabled = true); - void home_buttons (uint8_t tag); - void increments (); - }; - - static float getIncrement(); - - public: - static void onEntry(); - static bool onTouchEnd(uint8_t tag); -}; - -class MoveAxisScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - private: - static float getManualFeedrate(uint8_t axis, float increment_mm); - public: - static void setManualFeedrate(ExtUI::axis_t, float increment_mm); - static void setManualFeedrate(ExtUI::extruder_t, float increment_mm); - - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - static void onIdle(); -}; - -class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -#if HAS_TRINAMIC_CONFIG - class StepperCurrentScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; - - class StepperBumpSensitivityScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; -#endif - -#if HAS_MULTI_HOTEND - class NozzleOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; -#endif - -#if HAS_LEVELING - class LevelingMenu : public BaseScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - - #if HAS_BED_PROBE - class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; - #endif - - #if HAS_MESH - class BedMeshScreen : public BaseScreen, public CachedScreen { - private: - enum MeshOpts { - USE_POINTS = 0x01, - USE_COLORS = 0x02, - USE_TAGS = 0x04, - USE_HIGHLIGHT = 0x08, - USE_AUTOSCALE = 0x10 - }; - - static uint8_t pointToTag(uint8_t x, uint8_t y); - static bool tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y); - static float getHightlightedValue(); - static void drawHighlightedPointValue(); - static void drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max = 0.1); - static bool isMeshComplete(ExtUI::bed_mesh_t data); - - public: - static void onMeshUpdate(const int8_t x, const int8_t y, const float val); - static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - - static void startMeshProbe(); - }; - #endif -#endif - -#if ENABLED(BABYSTEPPING) - class NudgeNozzleScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static bool onTouchHeld(uint8_t tag); - static void onIdle(); - }; -#endif - -#if ENABLED(BACKLASH_GCODE) - class BacklashCompensationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; -#endif - -class FeedratePercentScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -class MaxVelocityScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -class MaxAccelerationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -class DefaultAccelerationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -#if HAS_JUNCTION_DEVIATION - class JunctionDeviationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; -#else - class JerkScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) - class CaseLightScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; -#endif - -#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - class FilamentMenu : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; -#endif - -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - class FilamentRunoutScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; -#endif - -#if ENABLED(LIN_ADVANCE) - class LinearAdvanceScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); - }; -#endif - -class TemperatureScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -class InterfaceSoundsScreen : public BaseScreen, public CachedScreen { - public: - enum event_t { - PRINTING_STARTED = 0, - PRINTING_FINISHED = 1, - PRINTING_FAILED = 2, - - NUM_EVENTS - }; - - private: - friend class InterfaceSettingsScreen; - - static uint8_t event_sounds[NUM_EVENTS]; - - static const char* getSoundSelection(event_t); - static void toggleSoundSelection(event_t); - static void setSoundSelection(event_t, const FTDI::SoundPlayer::sound_t*); - - public: - static void playEventSound(event_t, FTDI::play_mode_t = FTDI::PLAY_ASYNCHRONOUS); - - static void defaultSettings(); - - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); -}; - -class InterfaceSettingsScreen : public BaseScreen, public CachedScreen { - private: - struct persistent_data_t { - uint32_t touch_transform_a; - uint32_t touch_transform_b; - uint32_t touch_transform_c; - uint32_t touch_transform_d; - uint32_t touch_transform_e; - uint32_t touch_transform_f; - uint16_t passcode; - uint8_t display_brightness; - int8_t display_h_offset_adj; - int8_t display_v_offset_adj; - uint8_t sound_volume; - uint8_t bit_flags; - uint8_t event_sounds[InterfaceSoundsScreen::NUM_EVENTS]; - }; - - public: - #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE - static bool backupEEPROM(); - #endif - - static void saveSettings(char *); - static void loadSettings(const char *); - static void defaultSettings(); - static void failSafeSettings(); - - static void onStartup(); - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); -}; - -class LockScreen : public BaseScreen, public CachedScreen { - private: - friend InterfaceSettingsScreen; - - static uint16_t passcode; - - static char & message_style(); - static uint16_t compute_checksum(); - static void onPasscodeEntered(); - public: - static bool is_enabled(); - static void check_passcode(); - static void enable(); - static void disable(); - - static void set_hash(uint16_t pass) {passcode = pass;}; - static uint16_t get_hash() {return passcode;}; - - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); -}; - -#if ENABLED(SDSUPPORT) - class FilesScreen : public BaseScreen, public CachedScreen { - private: - #ifdef TOUCH_UI_PORTRAIT - static constexpr uint8_t header_h = 2; - static constexpr uint8_t footer_h = 2; - static constexpr uint8_t files_per_page = 11; - #else - static constexpr uint8_t header_h = 1; - static constexpr uint8_t footer_h = 1; - static constexpr uint8_t files_per_page = 6; - #endif - - static uint8_t getTagForLine(uint8_t line) {return line + 2;} - static uint8_t getLineForTag(uint8_t tag) {return tag - 2;} - static uint16_t getFileForTag(uint8_t tag); - static uint16_t getSelectedFileIndex(); - - inline static const char *getSelectedShortFilename() {return getSelectedFilename(false);} - inline static const char *getSelectedLongFilename() {return getSelectedFilename(true);} - static const char *getSelectedFilename(bool longName); - - static void drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted); - static void drawFileList(); - static void drawHeader(); - static void drawFooter(); - static void drawSelectedFile(); - - static void gotoPage(uint8_t); - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); - }; -#endif - -class EndstopStatesScreen : public BaseScreen, public UncachedScreen { - public: - static void onEntry(); - static void onExit(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); -}; - -class DisplayTuningScreen : public BaseNumericAdjustmentScreen, public CachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchHeld(uint8_t tag); -}; - -#if ENABLED(TOUCH_UI_DEVELOPER_MENU) - class DeveloperMenu : public BaseScreen, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - - class ConfirmEraseFlashDialogBox : public DialogBoxBaseClass, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; - - class WidgetsScreen : public BaseScreen, public UncachedScreen { - public: - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchStart(uint8_t tag); - static void onIdle(); - }; - - class StressTestScreen : public BaseScreen, public UncachedScreen { - private: - static void drawDots(uint16_t x, uint16_t y, uint16_t h, uint16_t v); - static bool watchDogTestNow(); - static void recursiveLockup(); - static void iterativeLockup(); - static void runTestOnBootup(bool enable); - - public: - static void startupCheck(); - - static void onEntry(); - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - static void onIdle(); - }; -#endif - -class MediaPlayerScreen : public BaseScreen, public UncachedScreen { - private: - typedef int16_t media_streamer_func_t(void *obj, void *buff, size_t bytes); - - public: - static bool playCardMedia(); - static bool playBootMedia(); - - static void onEntry(); - static void onRedraw(draw_mode_t); - - static void playStream(void *obj, media_streamer_func_t*); -}; - -#if NUM_LANGUAGES > 1 - class LanguageMenu : public BaseScreen, public UncachedScreen { - public: - static void onRedraw(draw_mode_t); - static bool onTouchEnd(uint8_t tag); - }; -#endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp deleted file mode 100644 index de7eb92a88..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/************************** - * spinner_dialog_box.cpp * - **************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" -#include "screen_data.h" - -using namespace FTDI; -using namespace ExtUI; - -void SpinnerDialogBox::onRedraw(draw_mode_t) { -} - -void SpinnerDialogBox::show(const progmem_str message) { - drawMessage(message); - drawSpinner(); - storeBackground(); - screen_data.SpinnerDialogBox.auto_hide = false; -} - -void SpinnerDialogBox::hide() { - CommandProcessor cmd; - cmd.stop().execute(); -} - -void SpinnerDialogBox::enqueueAndWait_P(const progmem_str commands) { - enqueueAndWait_P(GET_TEXT_F(MSG_PLEASE_WAIT), commands); -} - -void SpinnerDialogBox::enqueueAndWait_P(const progmem_str message, const progmem_str commands) { - show(message); - GOTO_SCREEN(SpinnerDialogBox); - ExtUI::injectCommands_P((const char*)commands); - screen_data.SpinnerDialogBox.auto_hide = true; -} - -void SpinnerDialogBox::onIdle() { - reset_menu_timeout(); - if (screen_data.SpinnerDialogBox.auto_hide && !commandsInQueue()) { - screen_data.SpinnerDialogBox.auto_hide = false; - hide(); - GOTO_PREVIOUS(); - } -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp deleted file mode 100644 index cb26324808..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/************************* - * statistics_screen.cpp * - *************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, PRINTCOUNTER) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -#define GRID_COLS 4 -#define GRID_ROWS 7 - -void StatisticsScreen::onRedraw(draw_mode_t what) { - CommandProcessor cmd; - - if (what & BACKGROUND) { - char buffer[21]; - - cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0) - - .font(Theme::font_medium) - .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(MSG_INFO_STATS_MENU)) - .font(Theme::font_small) - .tag(0) - .text(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_COUNT), OPT_RIGHTX | OPT_CENTERY) - .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_COMPLETED_PRINTS), OPT_RIGHTX | OPT_CENTERY) - .text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_TIME), OPT_RIGHTX | OPT_CENTERY) - .text(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_LONGEST), OPT_RIGHTX | OPT_CENTERY) - .text(BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_FILAMENT), OPT_RIGHTX | OPT_CENTERY); - // Don't chain the following, it causes strange issues with evaluation ordering! - cmd.text(BTN_POS(3,2), BTN_SIZE(2,1), getTotalPrints_str(buffer)); - cmd.text(BTN_POS(3,3), BTN_SIZE(2,1), getFinishedPrints_str(buffer)); - cmd.text(BTN_POS(3,4), BTN_SIZE(2,1), getTotalPrintTime_str(buffer)); - cmd.text(BTN_POS(3,5), BTN_SIZE(2,1), getLongestPrint_str(buffer)); - cmd.text(BTN_POS(3,6), BTN_SIZE(2,1), getFilamentUsed_str(buffer)); - } - - if (what & FOREGROUND) { - cmd.font(Theme::font_medium) - .colors(action_btn) - .tag(1).button(BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BACK)); - } -} - -bool StatisticsScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); return true; - default: return false; - } -} - -#endif // TOUCH_UI_FTDI_EVE && PRINTCOUNTER diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp deleted file mode 100644 index fc7453fca7..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/********************* - * status_screen.cpp * - *********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) - -#include "screens.h" -#include "screen_data.h" - -#include "../archim2-flash/flash_storage.h" - -using namespace FTDI; -using namespace Theme; - -#ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 8 -#else - #define GRID_ROWS 8 -#endif - -void StatusScreen::draw_axis_position(draw_mode_t what) { - CommandProcessor cmd; - - #define GRID_COLS 3 - - #ifdef TOUCH_UI_PORTRAIT - #define X_LBL_POS BTN_POS(1,5), BTN_SIZE(1,1) - #define Y_LBL_POS BTN_POS(1,6), BTN_SIZE(1,1) - #define Z_LBL_POS BTN_POS(1,7), BTN_SIZE(1,1) - #define X_VAL_POS BTN_POS(2,5), BTN_SIZE(2,1) - #define Y_VAL_POS BTN_POS(2,6), BTN_SIZE(2,1) - #define Z_VAL_POS BTN_POS(2,7), BTN_SIZE(2,1) - #else - #define X_LBL_POS BTN_POS(1,5), BTN_SIZE(1,1) - #define Y_LBL_POS BTN_POS(2,5), BTN_SIZE(1,1) - #define Z_LBL_POS BTN_POS(3,5), BTN_SIZE(1,1) - #define X_VAL_POS BTN_POS(1,6), BTN_SIZE(1,1) - #define Y_VAL_POS BTN_POS(2,6), BTN_SIZE(1,1) - #define Z_VAL_POS BTN_POS(3,6), BTN_SIZE(1,1) - #endif - - #define _UNION_POS(x1,y1,w1,h1,x2,y2,w2,h2) x1,y1,max(x1+w1,x2+w2)-x1,max(y1+h1,y2+h2)-y1 - #define UNION_POS(p1, p2) _UNION_POS(p1, p2) - - if (what & BACKGROUND) { - cmd.tag(6) - .fgcolor(Theme::axis_label) - .font(Theme::font_large) - .button( UNION_POS(X_LBL_POS, X_VAL_POS), F(""), OPT_FLAT) - .button( UNION_POS(Y_LBL_POS, Y_VAL_POS), F(""), OPT_FLAT) - .button( UNION_POS(Z_LBL_POS, Z_VAL_POS), F(""), OPT_FLAT) - .font(Theme::font_medium) - .fgcolor(Theme::x_axis) .button( X_VAL_POS, F(""), OPT_FLAT) - .fgcolor(Theme::y_axis) .button( Y_VAL_POS, F(""), OPT_FLAT) - .fgcolor(Theme::z_axis) .button( Z_VAL_POS, F(""), OPT_FLAT) - .font(Theme::font_small) - .text ( X_LBL_POS, GET_TEXT_F(MSG_AXIS_X)) - .text ( Y_LBL_POS, GET_TEXT_F(MSG_AXIS_Y)) - .text ( Z_LBL_POS, GET_TEXT_F(MSG_AXIS_Z)) - .colors(normal_btn); - } - - if (what & FOREGROUND) { - using namespace ExtUI; - char x_str[15]; - char y_str[15]; - char z_str[15]; - - if (isAxisPositionKnown(X)) - format_position(x_str, getAxisPosition_mm(X)); - else - strcpy_P(x_str, PSTR("?")); - - if (isAxisPositionKnown(Y)) - format_position(y_str, getAxisPosition_mm(Y)); - else - strcpy_P(y_str, PSTR("?")); - - if (isAxisPositionKnown(Z)) - format_position(z_str, getAxisPosition_mm(Z), 2); - else - strcpy_P(z_str, PSTR("?")); - - cmd.tag(6) - .font(Theme::font_medium) - .text ( X_VAL_POS, x_str) - .text ( Y_VAL_POS, y_str) - .text ( Z_VAL_POS, z_str); - } - - #undef GRID_COLS -} - -#ifdef TOUCH_UI_PORTRAIT - #define GRID_COLS 8 -#else - #define GRID_COLS 12 -#endif - -void StatusScreen::draw_temperature(draw_mode_t what) { - using namespace Theme; - - #define TEMP_RECT_1 BTN_POS(1,1), BTN_SIZE(4,2) - #define TEMP_RECT_2 BTN_POS(1,1), BTN_SIZE(8,1) - #define NOZ_1_POS BTN_POS(1,1), BTN_SIZE(4,1) - #define NOZ_2_POS BTN_POS(5,1), BTN_SIZE(4,1) - #define BED_POS BTN_POS(1,2), BTN_SIZE(4,1) - #define FAN_POS BTN_POS(5,2), BTN_SIZE(4,1) - - #define _ICON_POS(x,y,w,h) x, y, w/4, h - #define _TEXT_POS(x,y,w,h) x + w/4, y, w - w/4, h - #define ICON_POS(pos) _ICON_POS(pos) - #define TEXT_POS(pos) _TEXT_POS(pos) - - CommandProcessor cmd; - - if (what & BACKGROUND) { - cmd.font(Theme::font_small) - .tag(5) - .fgcolor(temp) .button( TEMP_RECT_1, F(""), OPT_FLAT) - .button( TEMP_RECT_2, F(""), OPT_FLAT) - .fgcolor(fan_speed).button( FAN_POS, F(""), OPT_FLAT) - .tag(0); - - // Draw Extruder Bitmap on Extruder Temperature Button - - cmd.tag(5) - .cmd (BITMAP_SOURCE(Extruder_Icon_Info)) - .cmd (BITMAP_LAYOUT(Extruder_Icon_Info)) - .cmd (BITMAP_SIZE (Extruder_Icon_Info)) - .icon(ICON_POS(NOZ_1_POS), Extruder_Icon_Info, icon_scale) - .icon(ICON_POS(NOZ_2_POS), Extruder_Icon_Info, icon_scale); - - // Draw Bed Heat Bitmap on Bed Heat Button - cmd.cmd (BITMAP_SOURCE(Bed_Heat_Icon_Info)) - .cmd (BITMAP_LAYOUT(Bed_Heat_Icon_Info)) - .cmd (BITMAP_SIZE (Bed_Heat_Icon_Info)) - .icon(ICON_POS(BED_POS), Bed_Heat_Icon_Info, icon_scale); - - // Draw Fan Percent Bitmap on Bed Heat Button - - cmd.cmd (BITMAP_SOURCE(Fan_Icon_Info)) - .cmd (BITMAP_LAYOUT(Fan_Icon_Info)) - .cmd (BITMAP_SIZE (Fan_Icon_Info)) - .icon(ICON_POS(FAN_POS), Fan_Icon_Info, icon_scale); - - #ifdef TOUCH_UI_USE_UTF8 - load_utf8_bitmaps(cmd); // Restore font bitmap handles - #endif - } - - if (what & FOREGROUND) { - using namespace ExtUI; - char e0_str[20]; - char e1_str[20]; - char bed_str[20]; - char fan_str[20]; - - sprintf_P(fan_str, PSTR("%-3d %%"), int8_t(getActualFan_percent(FAN0))); - - if (isHeaterIdle(BED)) - format_temp_and_idle(bed_str, getActualTemp_celsius(BED)); - else - format_temp_and_temp(bed_str, getActualTemp_celsius(BED), getTargetTemp_celsius(BED)); - - if (isHeaterIdle(H0)) - format_temp_and_idle(e0_str, getActualTemp_celsius(H0)); - else - format_temp_and_temp(e0_str, getActualTemp_celsius(H0), getTargetTemp_celsius(H0)); - - - #if HAS_MULTI_EXTRUDER - if (isHeaterIdle(H1)) - format_temp_and_idle(e1_str, getActualTemp_celsius(H1)); - else - format_temp_and_temp(e1_str, getActualTemp_celsius(H1), getTargetTemp_celsius(H1)); - #else - strcpy_P(e1_str, PSTR("-")); - #endif - - cmd.tag(5) - .font(font_medium) - .text(TEXT_POS(NOZ_1_POS), e0_str) - .text(TEXT_POS(NOZ_2_POS), e1_str) - .text(TEXT_POS(BED_POS), bed_str) - .text(TEXT_POS(FAN_POS), fan_str); - } -} - -void StatusScreen::draw_progress(draw_mode_t what) { - using namespace ExtUI; - using namespace Theme; - - CommandProcessor cmd; - - #if ENABLED(TOUCH_UI_PORTRAIT) - #define TIME_POS BTN_POS(1,3), BTN_SIZE(4,1) - #define PROGRESS_POS BTN_POS(5,3), BTN_SIZE(4,1) - #else - #define TIME_POS BTN_POS(9,1), BTN_SIZE(4,1) - #define PROGRESS_POS BTN_POS(9,2), BTN_SIZE(4,1) - #endif - - if (what & BACKGROUND) { - cmd.tag(0).font(font_medium) - .fgcolor(progress).button(TIME_POS, F(""), OPT_FLAT) - .button(PROGRESS_POS, F(""), OPT_FLAT); - } - - if (what & FOREGROUND) { - const uint32_t elapsed = getProgress_seconds_elapsed(); - const uint8_t hrs = elapsed/3600; - const uint8_t min = (elapsed/60)%60; - - char time_str[10]; - char progress_str[10]; - - sprintf_P(time_str, PSTR(" %02d : %02d"), hrs, min); - sprintf_P(progress_str, PSTR("%-3d %%"), getProgress_percent() ); - - cmd.font(font_medium) - .tag(7).text(TIME_POS, time_str) - .text(PROGRESS_POS, progress_str); - } -} - -#undef GRID_COLS - - -void StatusScreen::draw_interaction_buttons(draw_mode_t what) { - #define GRID_COLS 4 - if (what & FOREGROUND) { - using namespace ExtUI; - - #if ENABLED(TOUCH_UI_PORTRAIT) - #define MEDIA_BTN_POS BTN_POS(1,8), BTN_SIZE(2,1) - #define MENU_BTN_POS BTN_POS(3,8), BTN_SIZE(2,1) - #else - #define MEDIA_BTN_POS BTN_POS(1,7), BTN_SIZE(2,2) - #define MENU_BTN_POS BTN_POS(3,7), BTN_SIZE(2,2) - #endif - - const bool has_media = isMediaInserted() && !isPrintingFromMedia(); - - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(Theme::font_medium) - .colors(has_media ? action_btn : normal_btn) - .enabled(has_media) - .tag(3).button(MEDIA_BTN_POS, isPrintingFromMedia() ? GET_TEXT_F(MSG_PRINTING) : GET_TEXT_F(MSG_BUTTON_MEDIA)) - .colors(!has_media ? action_btn : normal_btn) - .tag(4).button( MENU_BTN_POS, GET_TEXT_F(MSG_BUTTON_MENU)); - } - #undef GRID_COLS -} - -void StatusScreen::draw_status_message(draw_mode_t what, const char* message) { - #define GRID_COLS 1 - - #if ENABLED(TOUCH_UI_PORTRAIT) - #define STATUS_POS BTN_POS(1,4), BTN_SIZE(1,1) - #else - #define STATUS_POS BTN_POS(1,3), BTN_SIZE(1,2) - #endif - - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.fgcolor(Theme::status_msg) - .tag(0) - .button( STATUS_POS, F(""), OPT_FLAT); - - draw_text_box(cmd, STATUS_POS, message, OPT_CENTER, font_large); - } - #undef GRID_COLS -} - -void StatusScreen::setStatusMessage(progmem_str message) { - char buff[strlen_P((const char * const)message)+1]; - strcpy_P(buff, (const char * const) message); - setStatusMessage((const char *) buff); -} - -void StatusScreen::setStatusMessage(const char* message) { - CommandProcessor cmd; - cmd.cmd(CMD_DLSTART) - .cmd(CLEAR_COLOR_RGB(Theme::bg_color)) - .cmd(CLEAR(true,true,true)); - - draw_temperature(BACKGROUND); - draw_status_message(BACKGROUND, message); - draw_interaction_buttons(BACKGROUND); - draw_progress(BACKGROUND); - draw_axis_position(BACKGROUND); - - storeBackground(); - - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("New status message: ", message); - #endif - - if (AT_SCREEN(StatusScreen)) { - current_screen.onRefresh(); - } -} - -void StatusScreen::loadBitmaps() { - // Load the bitmaps for the status screen - using namespace Theme; - constexpr uint32_t base = ftdi_memory_map::RAM_G; - CLCD::mem_write_pgm(base + TD_Icon_Info.RAMG_offset, TD_Icon, sizeof(TD_Icon)); - CLCD::mem_write_pgm(base + Extruder_Icon_Info.RAMG_offset, Extruder_Icon, sizeof(Extruder_Icon)); - CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon)); - CLCD::mem_write_pgm(base + Fan_Icon_Info.RAMG_offset, Fan_Icon, sizeof(Fan_Icon)); - - // Load fonts for internationalization - #ifdef TOUCH_UI_USE_UTF8 - load_utf8_data(base + UTF8_FONT_OFFSET); - #endif -} - -void StatusScreen::onStartup() { - UIFlashStorage::initialize(); -} - -void StatusScreen::onRedraw(draw_mode_t what) { - if (what & FOREGROUND) { - draw_temperature(FOREGROUND); - draw_progress(FOREGROUND); - draw_axis_position(FOREGROUND); - draw_interaction_buttons(FOREGROUND); - } -} - -void StatusScreen::onEntry() { - BaseScreen::onEntry(); - onRefresh(); -} - -void StatusScreen::onIdle() { - if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { - onRefresh(); - refresh_timer.start(); - } - BaseScreen::onIdle(); -} - -bool StatusScreen::onTouchEnd(uint8_t tag) { - using namespace ExtUI; - - switch (tag) { - #if ENABLED(SDSUPPORT) - case 3: GOTO_SCREEN(FilesScreen); break; - #endif - case 4: - if (isPrinting()) { - GOTO_SCREEN(TuneMenu); - } - else { - GOTO_SCREEN(MainMenu); - } - break; - case 5: GOTO_SCREEN(TemperatureScreen); break; - case 6: - if (isPrinting()) { - #if ENABLED(BABYSTEPPING) - GOTO_SCREEN(NudgeNozzleScreen); - #elif HAS_BED_PROBE - GOTO_SCREEN(ZOffsetScreen); - #else - return false; - #endif - } - else { - GOTO_SCREEN(MoveAxisScreen); - } - break; - case 7: GOTO_SCREEN(FeedratePercentScreen); break; - default: - return true; - } - // If a passcode is enabled, the LockScreen will prevent the - // user from proceeding. - LockScreen::check_passcode(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp deleted file mode 100644 index 693d125fbf..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/************************************** - * stepper_bump_sensiivity_screen.cpp * - **************************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_TRINAMIC_CONFIG) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void StepperBumpSensitivityScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(0, BaseNumericAdjustmentScreen::DEFAULT_LOWEST); - w.heading( GET_TEXT_F(MSG_TMC_HOMING_THRS)); - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getTMCBumpSensitivity(X), ENABLED(X_SENSORLESS)); - w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getTMCBumpSensitivity(Y), ENABLED(Y_SENSORLESS)); - w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getTMCBumpSensitivity(Z), ENABLED(Z_SENSORLESS)); - w.increments(); -} - -bool StepperBumpSensitivityScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(TMCBumpSensitivity, X); break; - case 3: UI_INCREMENT(TMCBumpSensitivity, X); break; - case 4: UI_DECREMENT(TMCBumpSensitivity, Y); break; - case 5: UI_INCREMENT(TMCBumpSensitivity, Y); break; - case 6: UI_DECREMENT(TMCBumpSensitivity, Z); break; - case 7: UI_INCREMENT(TMCBumpSensitivity, Z); break; - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE && HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp deleted file mode 100644 index 136582f09a..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/****************************** - * stepper_current_screen.cpp * - ******************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_TRINAMIC_CONFIG) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void StepperCurrentScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(0); - w.units(GET_TEXT_F(MSG_UNITS_MILLIAMP)); - w.heading( GET_TEXT_F(MSG_TMC_CURRENT)); - #if AXIS_IS_TMC(X) - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ); - #endif - #if AXIS_IS_TMC(X2) - w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2) ); - #endif - #if AXIS_IS_TMC(Y) - w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ); - #endif - #if AXIS_IS_TMC(Y2) - w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2) ); - #endif - #if AXIS_IS_TMC(Z) - w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ); - #endif - #if AXIS_IS_TMC(Z2) - w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2) ); - #endif - #if AXIS_IS_TMC(E0) - w.color(e_axis) .adjuster(14, GET_TEXT_F( - #if EXTRUDERS == 1 - MSG_AXIS_E - #else - MSG_AXIS_E1 - #endif - ), getAxisCurrent_mA(E0) ); - #endif - #if AXIS_IS_TMC(E1) - w.color(e_axis).adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) ); - #endif - #if AXIS_IS_TMC(E2) - w.color(e_axis).adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2) ); - #endif - #if AXIS_IS_TMC(E3) - w.color(e_axis).adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3) ); - #endif - w.increments(); -} - -bool StepperCurrentScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - #if AXIS_IS_TMC(X) - case 2: UI_DECREMENT(AxisCurrent_mA, X ); break; - case 3: UI_INCREMENT(AxisCurrent_mA, X ); break; - #endif - #if AXIS_IS_TMC(X2) - case 4: UI_DECREMENT(AxisCurrent_mA, X2 ); break; - case 5: UI_INCREMENT(AxisCurrent_mA, X2 ); break; - #endif - #if AXIS_IS_TMC(Y) - case 6: UI_DECREMENT(AxisCurrent_mA, Y ); break; - case 7: UI_INCREMENT(AxisCurrent_mA, Y ); break; - #endif - #if AXIS_IS_TMC(Y2) - case 8: UI_DECREMENT(AxisCurrent_mA, Y2 ); break; - case 9: UI_INCREMENT(AxisCurrent_mA, Y2 ); break; - #endif - #if AXIS_IS_TMC(Z) - case 10: UI_DECREMENT(AxisCurrent_mA, Z ); break; - case 11: UI_INCREMENT(AxisCurrent_mA, Z ); break; - #endif - #if AXIS_IS_TMC(Z2) - case 12: UI_DECREMENT(AxisCurrent_mA, Z2 ); break; - case 13: UI_INCREMENT(AxisCurrent_mA, Z2 ); break; - #endif - #if AXIS_IS_TMC(E0) - case 14: UI_DECREMENT(AxisCurrent_mA, E0); break; - case 15: UI_INCREMENT(AxisCurrent_mA, E0); break; - #endif - #if AXIS_IS_TMC(E1) - case 16: UI_DECREMENT(AxisCurrent_mA, E1); break; - case 17: UI_INCREMENT(AxisCurrent_mA, E1); break; - #endif - #if AXIS_IS_TMC(E2) - case 18: UI_DECREMENT(AxisCurrent_mA, E2); break; - case 19: UI_INCREMENT(AxisCurrent_mA, E2); break; - #endif - #if AXIS_IS_TMC(E3) - case 20: UI_DECREMENT(AxisCurrent_mA, E3); break; - case 21: UI_INCREMENT(AxisCurrent_mA, E3); break; - #endif - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp deleted file mode 100644 index 92035d1b1c..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/******************** - * steps_screen.cpp * - ********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void StepsScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(0); - w.units(GET_TEXT_F(MSG_UNITS_STEP_MM)); - w.heading( GET_TEXT_F(MSG_STEPS_PER_MM)); - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisSteps_per_mm(X) ); - w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getAxisSteps_per_mm(Y) ); - w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisSteps_per_mm(Z) ); - #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS) - w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_E), getAxisSteps_per_mm(E0) ); - #elif HAS_MULTI_EXTRUDER - w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), getAxisSteps_per_mm(E0) ); - w.color(e_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_E2), getAxisSteps_per_mm(E1) ); - #if EXTRUDERS > 2 - w.color(e_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_E3), getAxisSteps_per_mm(E2) ); - #endif - #if EXTRUDERS > 3 - w.color(e_axis) .adjuster(14, GET_TEXT_F(MSG_AXIS_E4), getAxisSteps_per_mm(E3) ); - #endif - #endif - w.increments(); -} - -bool StepsScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 2: UI_DECREMENT(AxisSteps_per_mm, X); break; - case 3: UI_INCREMENT(AxisSteps_per_mm, X); break; - case 4: UI_DECREMENT(AxisSteps_per_mm, Y); break; - case 5: UI_INCREMENT(AxisSteps_per_mm, Y); break; - case 6: UI_DECREMENT(AxisSteps_per_mm, Z); break; - case 7: UI_INCREMENT(AxisSteps_per_mm, Z); break; - case 8: UI_DECREMENT(AxisSteps_per_mm, E0); break; - case 9: UI_INCREMENT(AxisSteps_per_mm, E0); break; - #if HAS_MULTI_EXTRUDER - case 10: UI_DECREMENT(AxisSteps_per_mm, E1); break; - case 11: UI_INCREMENT(AxisSteps_per_mm, E1); break; - #endif - #if EXTRUDERS > 2 - case 12: UI_DECREMENT(AxisSteps_per_mm, E2); break; - case 13: UI_INCREMENT(AxisSteps_per_mm, E2); break; - #endif - #if EXTRUDERS > 3 - case 14: UI_DECREMENT(AxisSteps_per_mm, E3); break; - case 15: UI_INCREMENT(AxisSteps_per_mm, E3); break; - #endif - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp deleted file mode 100644 index 44ee453f15..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/************************** - * stress_test_screen.cpp * - **************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - -#include "screens.h" -#include "screen_data.h" - -#define STRESS_TEST_CHANGE_INTERVAL 6000 - -#define GRID_COLS 4 -#define GRID_ROWS 9 - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -void StressTestScreen::drawDots(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { - CommandProcessor cmd; - for (uint8_t i = 0; i < 100; i++) { - cmd.cmd(BEGIN(POINTS)) - .cmd(POINT_SIZE(20*16)) - .cmd(COLOR_RGB(random(0xFFFFFF))) - .cmd(VERTEX2F((x + random(w)) * 16,(y + random(h)) * 16)); - } -} - -bool StressTestScreen::watchDogTestNow() { - return screen_data.StressTestScreen.next_watchdog_trigger && - ELAPSED(millis(), screen_data.StressTestScreen.next_watchdog_trigger); -} - -void StressTestScreen::onRedraw(draw_mode_t) { - using namespace ExtUI; - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .font(font_medium) - .text(BTN_POS(1,1), BTN_SIZE(4,1), progmem_str(screen_data.StressTestScreen.message)); - - drawDots(BTN_POS(1,3), BTN_SIZE(4,4)); - - cmd.font(font_medium).enabled(!watchDogTestNow()).colors(action_btn).tag(1).button(BTN_POS(2,8), BTN_SIZE(2,1), F("Exit")); -} - -bool StressTestScreen::onTouchEnd(uint8_t tag) { - CommandProcessor cmd; - switch (tag) { - case 1: - runTestOnBootup(false); - GOTO_SCREEN(StatusScreen); - break; - default: - return false; - } - return true; -} - -void StressTestScreen::runTestOnBootup(bool enable) { - // Use a magic value in passcode to indicate - // whether or not we need to re-run the test - // at startup. - LockScreen::set_hash(enable ? 0xDEAD : 0); - injectCommands_P(PSTR("M500")); -} - -void StressTestScreen::startupCheck() { - if (LockScreen::get_hash() == 0xDEAD) - GOTO_SCREEN(StressTestScreen); -} - -void StressTestScreen::onEntry() { - screen_data.StressTestScreen.next_watchdog_trigger = millis() + 10000 + random(40000); - screen_data.StressTestScreen.message = PSTR("Test 1: Stress testing..."); - - // Turn off heaters. - setTargetTemp_celsius(0, E0); - setTargetTemp_celsius(0, E1); - setTargetTemp_celsius(0, BED); - - runTestOnBootup(true); -} - -void StressTestScreen::recursiveLockup() { - screen_data.StressTestScreen.message = PSTR("Test 2: Printer will restart."); - current_screen.onRefresh(); - recursiveLockup(); -} - -void StressTestScreen::iterativeLockup() { - screen_data.StressTestScreen.message = PSTR("Test 3: Printer will restart."); - for (;;) current_screen.onRefresh(); -} - -void StressTestScreen::onIdle() { - current_screen.onRefresh(); - reset_menu_timeout(); - - if (!commandsInQueue()) { - if (!isPositionKnown()) { - extern const char G28_STR[]; - injectCommands_P(G28_STR); - } - else { - injectCommands_P(PSTR( - "G0 X100 Y100 Z100 F6000\n" - "T0\nG4 S1" - TERN_(HAS_MULTI_EXTRUDER, "\nT1\nG4 S1") - "\nG0 X150 Y150 Z150" - )); - } - } - - if (refresh_timer.elapsed(STRESS_TEST_CHANGE_INTERVAL)) { - setTargetFan_percent(random(100),FAN0); - } - - if (watchDogTestNow()) { - if (random(2) % 2) - iterativeLockup(); - else - recursiveLockup(); - } - - BaseScreen::onIdle(); -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp deleted file mode 100644 index b7ce76ecd2..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/********************* - * string_format.cpp * - *********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -#define ROUND(val) uint16_t((val)+0.5) - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wno-format" - -/** - * Formats a temperature string (e.g. "100°C") - */ -void format_temp(char *str, float t1) { - sprintf_P(str, PSTR("%3d" S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C)); -} - -/** - * Formats a temperature string for an idle heater (e.g. "100 °C / idle") - */ -void format_temp_and_idle(char *str, float t1) { - sprintf_P(str, PSTR("%3d" S_FMT " / " S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C), GET_TEXT(MSG_IDLE)); -} - -/** - * Formats a temperature string for an active heater (e.g. "100 / 200°C") - */ -void format_temp_and_temp(char *str, float t1, float t2) { - sprintf_P(str, PSTR("%3d / %3d" S_FMT), ROUND(t1), ROUND(t2), GET_TEXT(MSG_UNITS_C)); -} - -/** - * Formats a temperature string for a material (e.g. "100°C (PLA)") - */ -void format_temp_and_material(char *str, float t1, const char *material) { - sprintf_P(str, PSTR("%3d" S_FMT " (" S_FMT ")"), ROUND(t1), GET_TEXT(MSG_UNITS_C), material); -} - -/** - * Formats a position value (e.g. "10 mm") - */ -void format_position(char *str, float p, uint8_t decimals) { - dtostrf(p, 4 + decimals, decimals, str); - strcat_P(str, PSTR(" ")); - strcat_P(str, GET_TEXT(MSG_UNITS_MM)); -} - -/** - * Formats a position vector (e.g. "10; 20; 30 mm") - */ -void format_position(char *str, float x, float y, float z) { - char num1[7], num2[7], num3[7]; - dtostrf(x, 4, 2, num1); - dtostrf(y, 4, 2, num2); - dtostrf(z, 4, 2, num3); - sprintf_P(str, PSTR("%s; %s; %s " S_FMT), num1, num2, num3, GET_TEXT(MSG_UNITS_MM)); -} - -#pragma GCC diagnostic pop - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h deleted file mode 100644 index e37a82d28a..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h +++ /dev/null @@ -1,29 +0,0 @@ -/******************* - * string_format.h * - *******************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -void format_temp(char *str, float t1); -void format_temp_and_idle(char *str, float t1); -void format_temp_and_temp(char *str, float t1, float t2); -void format_temp_and_material(char *str, float t1, const char *material); -void format_position(char *str, float p, uint8_t decimals = 1); -void format_position(char *str, float x, float y, float z); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp deleted file mode 100644 index c254d2997f..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/******************* - * boot_screen.cpp * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; -using namespace ExtUI; - -void TemperatureScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - #if TOUCH_UI_LCD_TEMP_SCALING == 10 - w.precision(1) - #else - w.precision(0, getTargetTemp_celsius(E0) == 0 ? DEFAULT_HIGHEST : DEFAULT_MIDRANGE) - #endif - .color(temp).units(GET_TEXT_F(MSG_UNITS_C)); - w.heading(GET_TEXT_F(MSG_TEMPERATURE)); - w.button(30, GET_TEXT_F(MSG_COOLDOWN)); - #ifndef NO_TOOLHEAD_HEATER_GCODE - #if HOTENDS == 1 - w.adjuster( 2, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0)); - #else - w.adjuster( 2, F(LCD_STR_E0), getTargetTemp_celsius(E0)); - w.adjuster( 4, F(LCD_STR_E1), getTargetTemp_celsius(E1)); - #if HOTENDS > 2 - w.adjuster( 6, F(LCD_STR_E2), getTargetTemp_celsius(E2)); - #endif - #if HOTENDS > 3 - w.adjuster( 8, F(LCD_STR_E3), getTargetTemp_celsius(E3)); - #endif - #endif - #endif - #if HAS_HEATED_BED - w.adjuster( 20, GET_TEXT_F(MSG_BED), getTargetTemp_celsius(BED)); - #endif - #if HAS_HEATED_CHAMBER - w.adjuster( 22, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER)); - #endif - #if HAS_FAN - w.color(fan_speed).units(GET_TEXT_F(MSG_UNITS_PERCENT)); - w.adjuster( 10, GET_TEXT_F(MSG_FAN_SPEED), getTargetFan_percent(FAN0)); - #endif - w.increments(); -} - -bool TemperatureScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 20: UI_DECREMENT(TargetTemp_celsius, BED); break; - case 21: UI_INCREMENT(TargetTemp_celsius, BED); break; - case 22: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break; - case 23: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break; - #ifndef NO_TOOLHEAD_HEATER_GCODE - case 2: UI_DECREMENT(TargetTemp_celsius, E0); break; - case 3: UI_INCREMENT(TargetTemp_celsius, E0); break; - #endif - #if HAS_MULTI_HOTEND - case 4: UI_DECREMENT(TargetTemp_celsius, E1); break; - case 5: UI_INCREMENT(TargetTemp_celsius, E1); break; - #endif - #if HOTENDS > 2 - case 6: UI_DECREMENT(TargetTemp_celsius, E2); break; - case 7: UI_INCREMENT(TargetTemp_celsius, E2); break; - #endif - #if HOTENDS > 3 - case 8: UI_DECREMENT(TargetTemp_celsius, E3); break; - case 9: UI_INCREMENT(TargetTemp_celsius, E3); break; - #endif - #if HAS_FAN - case 10: UI_DECREMENT(TargetFan_percent, FAN0); break; - case 11: UI_INCREMENT(TargetFan_percent, FAN0); break; - #endif - case 30: - #define _HOTEND_OFF(N) setTargetTemp_celsius(0,E##N); - REPEAT(HOTENDS, _HOTEND_OFF); - TERN_(HAS_HEATED_BED, setTargetTemp_celsius(0,BED)); - TERN_(HAS_HEATED_CHAMBER, setTargetTemp_celsius(0,CHAMBER)); - #if HAS_FAN - setTargetFan_percent(0,FAN0); - #endif - break; - default: - return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp deleted file mode 100644 index 436445024a..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/******************************** - * touch_calibration_screen.cpp * - ********************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -#define GRID_COLS 4 -#define GRID_ROWS 16 - -#define TEXT_POS BTN_POS(1,1), BTN_SIZE(4,12) - -void TouchCalibrationScreen::onEntry() { - CommandProcessor cmd; - - BaseScreen::onEntry(); - - if (CLCD::is_touching()) { - // Ask the user to release the touch before starting, - // as otherwise the first calibration point could - // be misinterpreted. - cmd.cmd(CMD_DLSTART) - .cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)); - draw_text_box(cmd, TEXT_POS, GET_TEXT_F(MSG_TOUCH_CALIBRATION_START), OPT_CENTER, font_large); - cmd.cmd(DL::DL_DISPLAY) - .cmd(CMD_SWAP) - .execute(); - - while (CLCD::is_touching()) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("Waiting for touch release"); - #endif - } - } - - // Force a refresh - cmd.cmd(CMD_DLSTART); - onRedraw(FOREGROUND); - cmd.cmd(DL::DL_DISPLAY); - cmd.execute(); -} - -void TouchCalibrationScreen::onRefresh() { - // Don't do the regular refresh, as this would - // cause the calibration be restarted on every - // touch. -} - -void TouchCalibrationScreen::onRedraw(draw_mode_t) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)); - - draw_text_box(cmd, TEXT_POS, GET_TEXT_F(MSG_TOUCH_CALIBRATION_PROMPT), OPT_CENTER, font_large); - cmd.cmd(CMD_CALIBRATE); -} - -void TouchCalibrationScreen::onIdle() { - if (!CLCD::is_touching() && !CommandProcessor::is_processing()) { - GOTO_PREVIOUS(); - } -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp deleted file mode 100644 index 8c3bc856b3..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/****************************** - * touch_registers_screen.cpp * - ******************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -void TouchRegistersScreen::onRedraw(draw_mode_t) { - const uint32_t T_Transform_A = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_A); - const uint32_t T_Transform_B = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_B); - const uint32_t T_Transform_C = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_C); - const uint32_t T_Transform_D = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_D); - const uint32_t T_Transform_E = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_E); - const uint32_t T_Transform_F = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_F); - char b[20]; - - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .tag(0); - - #define GRID_ROWS 7 - #define GRID_COLS 2 - cmd.tag(0) - .font(font_xsmall) - .fgcolor(transformA) .button( BTN_POS(1,1), BTN_SIZE(1,1), F("TOUCH_XFORM_A")) - .fgcolor(transformB) .button( BTN_POS(1,2), BTN_SIZE(1,1), F("TOUCH_XFORM_B")) - .fgcolor(transformC) .button( BTN_POS(1,3), BTN_SIZE(1,1), F("TOUCH_XFORM_C")) - .fgcolor(transformD) .button( BTN_POS(1,4), BTN_SIZE(1,1), F("TOUCH_XFORM_D")) - .fgcolor(transformE) .button( BTN_POS(1,5), BTN_SIZE(1,1), F("TOUCH_XFORM_E")) - .fgcolor(transformF) .button( BTN_POS(1,6), BTN_SIZE(1,1), F("TOUCH_XFORM_F")) - - .fgcolor(transformVal).button( BTN_POS(2,1), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,2), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,3), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,4), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,5), BTN_SIZE(1,1), F(""), OPT_FLAT) - .fgcolor(transformVal).button( BTN_POS(2,6), BTN_SIZE(1,1), F(""), OPT_FLAT); - - sprintf_P(b, PSTR("0x%08lX"), T_Transform_A); cmd.text( BTN_POS(2,1), BTN_SIZE(1,1), b); - sprintf_P(b, PSTR("0x%08lX"), T_Transform_B); cmd.text( BTN_POS(2,2), BTN_SIZE(1,1), b); - sprintf_P(b, PSTR("0x%08lX"), T_Transform_C); cmd.text( BTN_POS(2,3), BTN_SIZE(1,1), b); - sprintf_P(b, PSTR("0x%08lX"), T_Transform_D); cmd.text( BTN_POS(2,4), BTN_SIZE(1,1), b); - sprintf_P(b, PSTR("0x%08lX"), T_Transform_E); cmd.text( BTN_POS(2,5), BTN_SIZE(1,1), b); - sprintf_P(b, PSTR("0x%08lX"), T_Transform_F); cmd.text( BTN_POS(2,6), BTN_SIZE(1,1), b); - - cmd.colors(action_btn).font(font_medium) - .tag(1).button( BTN_POS(2,7), BTN_SIZE(1,1), F("Back")); - #undef GRID_COLS - #undef GRID_ROWS - } - - bool TouchRegistersScreen::onTouchEnd(uint8_t tag) { - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - default: - return false; - } - return true; - } - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp deleted file mode 100644 index 9fe2f1e9cb..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/******************* - * tune_menu.cpp * - *******************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) && !defined(TOUCH_UI_LULZBOT_BIO) - -#include "screens.h" - -using namespace FTDI; -using namespace Theme; - -void TuneMenu::onRedraw(draw_mode_t what) { - if (what & BACKGROUND) { - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)); - } - - #ifdef TOUCH_UI_PORTRAIT - #define GRID_ROWS 9 - #define GRID_COLS 2 - #define TEMPERATURE_POS BTN_POS(1,1), BTN_SIZE(2,1) - #define FIL_CHANGE_POS BTN_POS(1,2), BTN_SIZE(2,1) - #define FILAMENT_POS BTN_POS(1,3), BTN_SIZE(2,1) - #define NUDGE_NOZ_POS BTN_POS(1,4), BTN_SIZE(2,1) - #define SPEED_POS BTN_POS(1,5), BTN_SIZE(2,1) - #define PAUSE_POS BTN_POS(1,6), BTN_SIZE(2,1) - #define STOP_POS BTN_POS(1,7), BTN_SIZE(2,1) - #define CASE_LIGHT_POS BTN_POS(1,8), BTN_SIZE(2,1) - #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) - #else - #define GRID_ROWS 5 - #define GRID_COLS 2 - #define TEMPERATURE_POS BTN_POS(1,1), BTN_SIZE(1,1) - #define NUDGE_NOZ_POS BTN_POS(2,1), BTN_SIZE(1,1) - #define FIL_CHANGE_POS BTN_POS(1,2), BTN_SIZE(1,1) - #define SPEED_POS BTN_POS(2,2), BTN_SIZE(1,1) - #define PAUSE_POS BTN_POS(1,3), BTN_SIZE(1,1) - #define STOP_POS BTN_POS(2,3), BTN_SIZE(1,1) - #define FILAMENT_POS BTN_POS(1,4), BTN_SIZE(1,1) - #define CASE_LIGHT_POS BTN_POS(2,4), BTN_SIZE(1,1) - #define BACK_POS BTN_POS(1,5), BTN_SIZE(2,1) - #endif - - if (what & FOREGROUND) { - using namespace ExtUI; - - CommandProcessor cmd; - cmd.colors(normal_btn) - .font(font_medium) - .tag(2).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) - .enabled(!isPrinting() || isPrintingFromMediaPaused()) - .tag(3).button( FIL_CHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) - .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) - .tag(9).button( FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) - .enabled(EITHER(HAS_BED_PROBE, BABYSTEPPING)) - .tag(4).button( NUDGE_NOZ_POS, GET_TEXT_F(TERN(BABYSTEPPING, MSG_NUDGE_NOZZLE, MSG_ZPROBE_ZOFFSET))) - .tag(5).button( SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) - .tag(isPrintingFromMediaPaused() ? 7 : 6) - .enabled(TERN0(SDSUPPORT, isPrintingFromMedia())) - .button( PAUSE_POS, isPrintingFromMediaPaused() ? GET_TEXT_F(MSG_RESUME_PRINT) : GET_TEXT_F(MSG_PAUSE_PRINT)) - .enabled(TERN0(SDSUPPORT, isPrintingFromMedia())) - .tag(8).button( STOP_POS, GET_TEXT_F(MSG_STOP_PRINT)) - .enabled(ENABLED(CASE_LIGHT_ENABLE)) - .tag(10).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) - .tag(1).colors(action_btn) - .button( BACK_POS, GET_TEXT_F(MSG_BACK)); - } - #undef GRID_COLS - #undef GRID_ROWS -} - -bool TuneMenu::onTouchEnd(uint8_t tag) { - using namespace Theme; - using namespace ExtUI; - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - case 2: GOTO_SCREEN(TemperatureScreen); break; - case 3: GOTO_SCREEN(ChangeFilamentScreen); break; - case 4: - #if ENABLED(BABYSTEPPING) - GOTO_SCREEN(NudgeNozzleScreen); - #elif HAS_BED_PROBE - GOTO_SCREEN(ZOffsetScreen); - #endif - break; - case 5: GOTO_SCREEN(FeedratePercentScreen); break; - case 6: sound.play(twinkle, PLAY_ASYNCHRONOUS); ExtUI::pausePrint(); GOTO_SCREEN(StatusScreen); break; - case 7: sound.play(twinkle, PLAY_ASYNCHRONOUS); ExtUI::resumePrint(); GOTO_SCREEN(StatusScreen); break; - case 8: - GOTO_SCREEN(ConfirmAbortPrintDialogBox); - current_screen.forget(); - PUSH_SCREEN(StatusScreen); - break; - #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) - case 9: GOTO_SCREEN(FilamentMenu); break; - #endif - #if ENABLED(CASE_LIGHT_ENABLE) - case 10: GOTO_SCREEN(CaseLightScreen); break; - #endif - default: - return false; - } - return true; -} - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp deleted file mode 100644 index d7c4562041..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/************************** - * widget_demo_screen.cpp * - **************************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -uint16_t slider_val; -bool show_grid; - -void WidgetsScreen::onEntry() { - BaseScreen::onEntry(); - CLCD::turn_on_backlight(); - SoundPlayer::set_volume(255); -} - -void WidgetsScreen::onRedraw(draw_mode_t) { - using namespace ExtUI; - CommandProcessor cmd; - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0); - - const uint16_t hrs = (slider_val*12/0xFFFFU); - const uint16_t m = (slider_val*12*60/0xFFFFU)%60; - const uint16_t s = (slider_val*12*60*60/0xFFFFU)%60; - - #ifdef TOUCH_UI_PORTRAIT - #define GRID_COLS 3 - #define GRID_ROWS 8 - cmd.font(font_large) - .cmd(COLOR_RGB(bg_text_enabled)) - .text (BTN_POS(1,1), BTN_SIZE(3,1), F("Sample Widgets")) - .tag(0).text (BTN_POS(2,6), BTN_SIZE(1,1), F("Show grid:")) - .colors(ui_toggle) - .tag(2).dial (BTN_POS(1,2), BTN_SIZE(1,2), slider_val) - .tag(0).clock (BTN_POS(1,4), BTN_SIZE(1,2), hrs, m, s, 0) - .gauge (BTN_POS(1,6), BTN_SIZE(1,2), 5, 4, slider_val, 0xFFFFU) - .font(font_medium) - .colors(ui_slider) - .tag(4).slider (BTN_POS(2,3), BTN_SIZE(2,1), slider_val, 0xFFFFU) - .tag(5).progress (BTN_POS(2,4), BTN_SIZE(2,1), slider_val, 0xFFFFU) - .tag(6).scrollbar (BTN_POS(2,5), BTN_SIZE(2,1), slider_val, 1000, 0xFFFFU) - .font(font_small) - .colors(ui_toggle) - .tag(7).toggle (BTN_POS(3,6), BTN_SIZE(1,1), F("no\xFFyes"), show_grid) - .colors(normal_btn) - .font(font_medium) - .tag(1) - .button (BTN_POS(2, 8), BTN_SIZE(1,1), F("1")) - .button (BTN_POS(3, 8), BTN_SIZE(1,1), F("2")) - .colors(action_btn) - .button (BTN_POS(1, 8), BTN_SIZE(1,1), F("Back")); - #else - #define GRID_COLS 4 - #define GRID_ROWS 8 - - cmd.font(font_large) - .text (BTN_POS(1,1), BTN_SIZE(4,1), F("Sample Widgets")) - .tag(0).text (BTN_POS(3,6), BTN_SIZE(1,1), F("Show grid:")) - .colors(ui_toggle) - .tag(2).dial (BTN_POS(1,2), BTN_SIZE(1,3), slider_val) - .tag(3).dial (BTN_POS(1,5), BTN_SIZE(1,3), slider_val) - .tag(0).clock (BTN_POS(2,2), BTN_SIZE(1,3), hrs, m, s, 0) - .gauge (BTN_POS(2,5), BTN_SIZE(1,3), 5, 4, slider_val, 0xFFFFU) - .font(font_medium) - .colors(ui_slider) - .tag(4).slider (BTN_POS(3,3), BTN_SIZE(2,1), slider_val, 0xFFFFU) - .tag(5).progress (BTN_POS(3,4), BTN_SIZE(2,1), slider_val, 0xFFFFU) - .tag(6).scrollbar (BTN_POS(3,5), BTN_SIZE(2,1), slider_val, 1000, 0xFFFFU) - .font(font_small) - .colors(ui_toggle) - .tag(7).toggle (BTN_POS(4,6), BTN_SIZE(1,1), F("no\xFFyes"), show_grid) - .colors(normal_btn) - .font(font_medium) - .tag(1).button (BTN_POS(3, 8), BTN_SIZE(1,1), F("1")) - .button (BTN_POS(4, 8), BTN_SIZE(1,1), F("2")) - .colors(action_btn) - .button (BTN_POS(1, 8), BTN_SIZE(2,1), F("Back")); - #endif - - cmd.cmd(COLOR_RGB(bg_text_enabled)); - if (show_grid) DRAW_LAYOUT_GRID -} - -bool WidgetsScreen::onTouchStart(uint8_t tag) { - CommandProcessor cmd; - switch (tag) { - case 1: GOTO_PREVIOUS(); break; - #ifdef TOUCH_UI_PORTRAIT - case 2: cmd.track_circular (BTN_POS(1,2), BTN_SIZE(1,2), 2).execute(); break; - case 4: cmd.track_linear (BTN_POS(2,3), BTN_SIZE(2,1), 4).execute(); break; - case 5: cmd.track_linear (BTN_POS(2,4), BTN_SIZE(2,1), 5).execute(); break; - case 6: cmd.track_linear (BTN_POS(2,5), BTN_SIZE(2,1), 6).execute(); break; - #else - case 2: cmd.track_circular (BTN_POS(1,2), BTN_SIZE(1,3), 2).execute(); break; - case 3: cmd.track_circular (BTN_POS(1,5), BTN_SIZE(1,3), 3).execute(); break; - case 4: cmd.track_linear (BTN_POS(3,3), BTN_SIZE(2,1), 4).execute(); break; - case 5: cmd.track_linear (BTN_POS(3,4), BTN_SIZE(2,1), 5).execute(); break; - case 6: cmd.track_linear (BTN_POS(3,5), BTN_SIZE(2,1), 6).execute(); break; - #endif - case 7: show_grid = !show_grid; break; - default: - return false; - } - - return true; -} - -void WidgetsScreen::onIdle() { - if (refresh_timer.elapsed(TOUCH_UPDATE_INTERVAL)) { - refresh_timer.start(); - - uint16_t value; - CommandProcessor cmd; - switch (cmd.track_tag(value)) { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - slider_val = value; break; - default: - return; - } - onRefresh(); - } - BaseScreen::onIdle(); -} - -#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_DEVELOPER_MENU diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp deleted file mode 100644 index f5cd03697c..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/*********************** - * z_offset_screen.cpp * - ***********************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../config.h" - -#if BOTH(TOUCH_UI_FTDI_EVE, HAS_BED_PROBE) - -#include "screens.h" - -using namespace FTDI; -using namespace ExtUI; -using namespace Theme; - -void ZOffsetScreen::onRedraw(draw_mode_t what) { - widgets_t w(what); - w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXT_F(MSG_UNITS_MM)); - - w.heading( GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); - w.color(z_axis).adjuster(4, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), getZOffset_mm()); - w.increments(); -} - -bool ZOffsetScreen::onTouchHeld(uint8_t tag) { - const float increment = getIncrement(); - switch (tag) { - case 4: UI_DECREMENT(ZOffset_mm); break; - case 5: UI_INCREMENT(ZOffset_mm); break; - default: - return false; - } - SaveSettingsDialogBox::settingsChanged(); - return true; -} - -#endif // TOUCH_UI_FTDI_EVE && HAS_BED_PROBE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h deleted file mode 100644 index 2cb039c84d..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h +++ /dev/null @@ -1,183 +0,0 @@ -/************* - * bitmaps.h * - *************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -namespace Theme { - using namespace FTDI; - - constexpr PROGMEM bitmap_info_t Extruder_Icon_Info = { - .format = L1, - .linestride = 3, - .filter = BILINEAR, - .wrapx = BORDER, - .wrapy = BORDER, - .RAMG_offset = 8000, - .width = 24, - .height = 23, - }; - - constexpr PROGMEM unsigned char Extruder_Icon[] = { - 0x3F, 0xFF, 0xFC, - 0x7F, 0xFF, 0xFE, - 0xC0, 0x00, 0x03, - 0xC0, 0x00, 0x03, - 0xC0, 0x00, 0x03, - 0xC0, 0x00, 0x03, - 0x7F, 0xFF, 0xFE, - 0x3F, 0xFF, 0xFC, - 0x3F, 0xFF, 0xFC, - 0x7F, 0xFF, 0xFE, - 0xC0, 0x00, 0x03, - 0xC0, 0x00, 0x03, - 0xC0, 0x00, 0x03, - 0xC0, 0x00, 0x03, - 0x7F, 0xFF, 0xFE, - 0x7F, 0xFF, 0xFE, - 0x07, 0xFF, 0xE0, - 0x03, 0xFF, 0xC0, - 0x01, 0x81, 0x80, - 0x00, 0xC3, 0x00, - 0x00, 0x66, 0x00, - 0x00, 0x3C, 0x00, - 0x00, 0x3C, 0x00 - }; - - constexpr PROGMEM bitmap_info_t Bed_Heat_Icon_Info = { - .format = L1, - .linestride = 4, - .filter = BILINEAR, - .wrapx = BORDER, - .wrapy = BORDER, - .RAMG_offset = 8100, - .width = 32, - .height = 23, - }; - - constexpr PROGMEM unsigned char Bed_Heat_Icon[] = { - 0x01, 0x81, 0x81, 0x80, - 0x01, 0x81, 0x81, 0x80, - 0x00, 0xC0, 0xC0, 0xC0, - 0x00, 0xC0, 0xC0, 0xC0, - 0x00, 0x60, 0x60, 0x60, - 0x00, 0x60, 0x60, 0x60, - 0x00, 0xC0, 0xC0, 0xC0, - 0x00, 0xC0, 0xC0, 0xC0, - 0x01, 0x81, 0x81, 0x80, - 0x01, 0x81, 0x81, 0x80, - 0x03, 0x03, 0x03, 0x00, - 0x03, 0x03, 0x03, 0x00, - 0x06, 0x06, 0x06, 0x00, - 0x06, 0x06, 0x06, 0x00, - 0x03, 0x03, 0x03, 0x00, - 0x03, 0x03, 0x03, 0x00, - 0x01, 0x81, 0x81, 0x80, - 0x01, 0x81, 0x81, 0x80, - 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, - 0xC0, 0x00, 0x00, 0x03, - 0xFF, 0xFF, 0xFF, 0xFF - }; - - constexpr PROGMEM bitmap_info_t Fan_Icon_Info = { - .format = L1, - .linestride = 4, - .filter = BILINEAR, - .wrapx = BORDER, - .wrapy = BORDER, - .RAMG_offset = 8300, - .width = 32, - .height = 32, - }; - - constexpr PROGMEM unsigned char Fan_Icon[] = { - 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, - 0xF8, 0x00, 0x00, 0x1F, - 0xF0, 0x03, 0xF8, 0x0F, - 0xE0, 0x07, 0xF0, 0x07, - 0xC0, 0x0F, 0xE0, 0x03, - 0xC0, 0x1F, 0xE0, 0x03, - 0xC0, 0x1F, 0xE0, 0x03, - 0xC0, 0x0F, 0xE0, 0x03, - 0xC0, 0x07, 0xE0, 0x03, - 0xC0, 0x03, 0xC0, 0x03, - 0xD0, 0x00, 0x00, 0xC3, - 0xD8, 0x03, 0xC1, 0xE3, - 0xDF, 0xC7, 0xE3, 0xF3, - 0xDF, 0xEF, 0xF7, 0xFB, - 0xDF, 0xEF, 0xF7, 0xFB, - 0xDF, 0xEF, 0xF7, 0xFB, - 0xDF, 0xEF, 0xF7, 0xFB, - 0xCF, 0xC7, 0xE3, 0xFB, - 0xC7, 0x83, 0xC0, 0x1B, - 0xC3, 0x00, 0x00, 0x0B, - 0xC0, 0x03, 0xC0, 0x03, - 0xC0, 0x07, 0xE0, 0x03, - 0xC0, 0x07, 0xF0, 0x03, - 0xC0, 0x07, 0xF8, 0x03, - 0xC0, 0x07, 0xF8, 0x03, - 0xC0, 0x07, 0xF0, 0x03, - 0xE0, 0x0F, 0xE0, 0x07, - 0xF0, 0x1F, 0xC0, 0x0F, - 0xF8, 0x00, 0x00, 0x1F, - 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF - }; - - constexpr PROGMEM bitmap_info_t TD_Icon_Info = { - .format = L1, - .linestride = 7, - .filter = BILINEAR, - .wrapx = BORDER, - .wrapy = BORDER, - .RAMG_offset = 9000, - .width = 50, - .height = 20, - }; - - constexpr PROGMEM unsigned char TD_Icon[] = { - 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, // Thumb Drive Widget - 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80, - 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, - 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00 - }; - - constexpr PROGMEM uint32_t UTF8_FONT_OFFSET = 10000; -}; // namespace Theme diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h deleted file mode 100644 index 6ea317dbc3..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************************** - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/** - * This file was auto-generated using "svg2cpp.pl" - * - * The encoding consists of x,y pairs with the min and max scaled to - * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the - * start of a new closed path. - */ - -#pragma once - -constexpr float x_min = 0.000000, x_max = 272.000000, - y_min = 0.000000, y_max = 480.000000; - -const PROGMEM uint16_t logo_green[] = {0x8048, 0x46D9, 0x27BC, 0x9DBA, 0xD8D3, 0x9DBA}; -const PROGMEM uint16_t logo_mark[] = {0xDB9F, 0xAC0C, 0xDA6F, 0xAC2D, 0xD970, 0xAC91, 0xD8C0, 0xAD23, 0xD885, 0xADCF, 0xD8C0, 0xAE7A, 0xD970, 0xAF0C, 0xDA6F, 0xAF6F, 0xDB9F, 0xAF8F, 0xDCCE, 0xAF6F, 0xDDD0, 0xAF0C, 0xDE7D, 0xAE7B, 0xDEB9, 0xADCF, 0xDE7D, 0xAD22, 0xDDD0, 0xAC91, 0xDCCE, 0xAC2D, 0xFFFF, 0xDB9F, 0xABC3, 0xDCFE, 0xABEA, 0xDE28, 0xAC5E, 0xDEF1, 0xAD06, 0xDF36, 0xADCF, 0xDEF1, 0xAE95, 0xDE28, 0xAF3E, 0xDCFE, 0xAFB1, 0xDB9F, 0xAFD8, 0xDA3F, 0xAFB1, 0xD916, 0xAF3E, 0xD849, 0xAE95, 0xD808, 0xADCF, 0xD849, 0xAD06, 0xD916, 0xAC5E, 0xDA3F, 0xABEA, 0xFFFF, 0xDB7D, 0xACE6, 0xDAE4, 0xACE6, 0xDAE4, 0xADA9, 0xDB7D, 0xADA9, 0xDC3B, 0xAD94, 0xDC71, 0xAD48, 0xDC3B, 0xACFD, 0xFFFF, 0xDB85, 0xAC9E, 0xDCCB, 0xACC8, 0xDD37, 0xAD47, 0xDCF6, 0xADAC, 0xDC3E, 0xADDE, 0xDC85, 0xADFF, 0xDCE8, 0xAE4E, 0xDD92, 0xAEEA, 0xDCBD, 0xAEEA, 0xDC1E, 0xAE58, 0xDBA7, 0xAE03, 0xDB36, 0xADEF, 0xDAE4, 0xADEF, 0xDAE4, 0xAEEA, 0xDA26, 0xAEEA, 0xDA26, 0xAC9E}; -const PROGMEM uint16_t logo_type[] = {0xD8D5, 0xA520, 0xD8A5, 0xA563, 0xD82E, 0xA57F, 0xD348, 0xA57F, 0xD2D1, 0xA598, 0xD2A0, 0xA5D9, 0xD2A0, 0xAF7A, 0xD274, 0xAFBE, 0xD202, 0xAFDA, 0xCD37, 0xAFDA, 0xCCBF, 0xAFBE, 0xCC8F, 0xAF7A, 0xCC8F, 0xA5D9, 0xCC63, 0xA598, 0xCBF1, 0xA57F, 0xC70B, 0xA57F, 0xC694, 0xA563, 0xC664, 0xA520, 0xC664, 0xA28C, 0xC70B, 0xA22C, 0xD82E, 0xA22C, 0xD8A5, 0xA248, 0xD8D5, 0xA28C, 0xFFFF, 0xB138, 0xAC8C, 0xB952, 0xAC8C, 0xB952, 0xA57F, 0xB138, 0xA57F, 0xFFFF, 0xBF27, 0xA421, 0xBF57, 0xA476, 0xBF6D, 0xA4D0, 0xBF6D, 0xAD36, 0xBF57, 0xAD90, 0xBF27, 0xADE6, 0xBBFA, 0xAFB2, 0xBB60, 0xAFCF, 0xBABD, 0xAFDA, 0xAFCE, 0xAFDA, 0xAF30, 0xAFCF, 0xAE9A, 0xAFB2, 0xAB6E, 0xADE6, 0xAB39, 0xAD90, 0xAB28, 0xAD36, 0xAB28, 0xA4D0, 0xAB39, 0xA476, 0xAB6E, 0xA421, 0xAE9A, 0xA255, 0xAF30, 0xA239, 0xAFCE, 0xA22C, 0xBABD, 0xA22C, 0xBB60, 0xA239, 0xBBFA, 0xA255, 0xFFFF, 0x93A4, 0xACDC, 0x9CEA, 0xACDC, 0x9CEA, 0xAA34, 0x93A4, 0xAA34, 0x93A4, 0xACDC, 0xFFFF, 0x93A4, 0xA796, 0x9CEA, 0xA796, 0x9CEA, 0xA525, 0x93A4, 0xA525, 0xFFFF, 0xA227, 0xA421, 0xA258, 0xA478, 0xA26E, 0xA4D5, 0xA26E, 0xA700, 0xA24F, 0xA757, 0xA204, 0xA7A5, 0xA089, 0xA8B8, 0xA061, 0xA903, 0xA092, 0xA949, 0xA1FC, 0xAA43, 0xA24B, 0xAA91, 0xA26E, 0xAAE8, 0xA26E, 0xAD36, 0xA258, 0xAD90, 0xA227, 0xADE6, 0x9EFC, 0xAFB2, 0x9E61, 0xAFCF, 0x9DBE, 0xAFDA, 0x8ED0, 0xAFDA, 0x8E28, 0xAF7A, 0x8E28, 0xA28C, 0x8E59, 0xA248, 0x8ED0, 0xA22C, 0x9DBE, 0xA22C, 0x9E61, 0xA239, 0x9EFC, 0xA255, 0xFFFF, 0x853C, 0xA502, 0x8517, 0xA557, 0x84C9, 0xA5A2, 0x7994, 0xACC8, 0x8494, 0xACC8, 0x850A, 0xACE4, 0x853C, 0xAD27, 0x853C, 0xAF7A, 0x850A, 0xAFBE, 0x8494, 0xAFDA, 0x7371, 0xAFDA, 0x72C9, 0xAF7A, 0x72C9, 0xAD09, 0x72E8, 0xACB2, 0x7333, 0xAC64, 0x7EA5, 0xA53E, 0x73A6, 0xA53E, 0x732F, 0xA522, 0x72FE, 0xA4DF, 0x72FE, 0xA28C, 0x732F, 0xA248, 0x73A6, 0xA22C, 0x8494, 0xA22C, 0x850A, 0xA248, 0x853C, 0xA28C, 0xFFFF, 0x6B68, 0xAC87, 0x6BDB, 0xACA3, 0x6C07, 0xACE6, 0x6C07, 0xAF7A, 0x6BDB, 0xAFBE, 0x6B68, 0xAFDA, 0x5C84, 0xAFDA, 0x5BDC, 0xAF7A, 0x5BDC, 0xA28C, 0x5C84, 0xA22C, 0x6146, 0xA22C, 0x61EE, 0xA28C, 0x61EE, 0xAC2D, 0x621E, 0xAC6E, 0x6295, 0xAC87, 0xFFFF, 0x52C6, 0xA248, 0x52F7, 0xA28C, 0x52F7, 0xAD45, 0x52EE, 0xAD45, 0x52DC, 0xAD9B, 0x52B1, 0xADE6, 0x4F85, 0xAFB2, 0x4EEA, 0xAFCF, 0x4E47, 0xAFDA, 0x4359, 0xAFDA, 0x42BA, 0xAFCF, 0x4224, 0xAFB2, 0x3EF8, 0xADE6, 0x3EC3, 0xAD90, 0x3EB2, 0xAD36, 0x3EB2, 0xA28C, 0x3EE2, 0xA248, 0x3F5A, 0xA22C, 0x441B, 0xA22C, 0x4493, 0xA248, 0x44C3, 0xA28C, 0x44C3, 0xAC2D, 0x44F4, 0xAC71, 0x456B, 0xAC8C, 0x4C3E, 0xAC8C, 0x4CB1, 0xAC71, 0x4CDD, 0xAC2D, 0x4CDD, 0xA28C, 0x4D0D, 0xA248, 0x4D85, 0xA22C, 0x524F, 0xA22C, 0xFFFF, 0x3748, 0xAC87, 0x37BB, 0xACA3, 0x37E7, 0xACE6, 0x37E7, 0xAF7A, 0x37BB, 0xAFBE, 0x3748, 0xAFDA, 0x2864, 0xAFDA, 0x27BC, 0xAF7A, 0x27BC, 0xA28C, 0x2864, 0xA22C, 0x2D26, 0xA22C, 0x2DCD, 0xA28C, 0x2DCD, 0xAC2D, 0x2DFE, 0xAC6E, 0x2E75, 0xAC87}; -const PROGMEM uint16_t logo_black[] = {0x8048, 0x527A, 0x8ADE, 0x5CDE, 0x75B2, 0x5CDE, 0xFFFF, 0x8048, 0x4FF6, 0x71D9, 0x5E20, 0x8EB8, 0x5E20, 0x8048, 0x4FF6, 0xFFFF, 0x4436, 0x8D8E, 0x4ECC, 0x97F2, 0x39A0, 0x97F2, 0xFFFF, 0x4436, 0x8B0A, 0x35C8, 0x9934, 0x52A5, 0x9934, 0xFFFF, 0xBC3D, 0x8D8E, 0xC6D4, 0x97F2, 0xB1A7, 0x97F2, 0xFFFF, 0xBC3D, 0x8B0A, 0xADCE, 0x9934, 0xCAAC, 0x9934, 0xFFFF, 0x8045, 0x6778, 0x7F6D, 0x67A7, 0x7E9D, 0x689F, 0x7D49, 0x69EA, 0x7B41, 0x6A81, 0x7908, 0x6A3A, 0x7726, 0x692C, 0x75EA, 0x685A, 0x7505, 0x684C, 0x744A, 0x6899, 0x73F5, 0x69A8, 0x7345, 0x6B1A, 0x7193, 0x6BF8, 0x6F4D, 0x6C08, 0x6CFA, 0x6B45, 0x6B61, 0x6AA3, 0x6A7D, 0x6AB7, 0x69EB, 0x6B1D, 0x6A1D, 0x6C34, 0x6A22, 0x6DB8, 0x68E5, 0x6ECD, 0x66B9, 0x6F33, 0x6417, 0x6EC5, 0x6239, 0x6E5C, 0x6165, 0x6E91, 0x6108, 0x6F09, 0x61C1, 0x7018, 0x6282, 0x7196, 0x61CF, 0x72D1, 0x5FE5, 0x7384, 0x5D38, 0x7380, 0x5B4B, 0x7365, 0x5A97, 0x73B7, 0x5A74, 0x7438, 0x5B90, 0x7520, 0x5CE8, 0x7671, 0x5CCB, 0x77BB, 0x5B43, 0x78B0, 0x58B6, 0x7914, 0x56D7, 0x7944, 0x564F, 0x79AD, 0x5667, 0x7A2F, 0x57DA, 0x7AE3, 0x59B7, 0x7BF3, 0x5A31, 0x7D37, 0x5927, 0x7E5D, 0x56E0, 0x7F1E, 0x5529, 0x7F93, 0x54D7, 0x800D, 0x5529, 0x8087, 0x56E0, 0x80FD, 0x5926, 0x81BE, 0x5A30, 0x82E5, 0x59B5, 0x8428, 0x57D8, 0x8538, 0x5664, 0x85EB, 0x564C, 0x866D, 0x56D4, 0x86D7, 0x58B2, 0x8708, 0x5B3F, 0x876B, 0x5CC6, 0x8860, 0x5CE3, 0x89AA, 0x5B8B, 0x8AFC, 0x5A6D, 0x8BE3, 0x5A91, 0x8C65, 0x5B44, 0x8CB7, 0x5D32, 0x8C9C, 0x5FDE, 0x8C98, 0x61C7, 0x8D4B, 0x627A, 0x8E87, 0x61B9, 0x9005, 0x60FF, 0x9114, 0x615C, 0x918B, 0x622F, 0x91C0, 0x640E, 0x9158, 0x66B0, 0x90EA, 0x68DC, 0x9150, 0x6A18, 0x9266, 0x6A12, 0x93E9, 0x69E0, 0x9501, 0x6A72, 0x9567, 0x6B56, 0x957B, 0x6CEE, 0x94D9, 0x6F43, 0x9417, 0x7188, 0x9428, 0x7339, 0x9506, 0x73E9, 0x9678, 0x743E, 0x9787, 0x74F8, 0x97D4, 0x75DD, 0x97C6, 0x771A, 0x96F4, 0x78FB, 0x95E6, 0x7B35, 0x95A1, 0x7D3D, 0x9637, 0x7E91, 0x9782, 0x7F60, 0x987A, 0x8038, 0x98AA, 0x810F, 0x987B, 0x81DF, 0x9782, 0x8333, 0x9638, 0x853B, 0x95A1, 0x8775, 0x95E7, 0x8956, 0x96F5, 0x8A92, 0x97C8, 0x8B78, 0x97D6, 0x8C32, 0x9789, 0x8C88, 0x967A, 0x8D37, 0x9508, 0x8EE9, 0x942A, 0x912F, 0x941A, 0x9383, 0x94DD, 0x951B, 0x957F, 0x95FF, 0x956B, 0x9690, 0x9505, 0x9660, 0x93ED, 0x9659, 0x926A, 0x9797, 0x9154, 0x99C3, 0x90EF, 0x9C65, 0x915D, 0x9E43, 0x91C6, 0x9F17, 0x9191, 0x9F74, 0x9119, 0x9EBB, 0x900A, 0x9DFA, 0x8E8C, 0x9EAE, 0x8D51, 0xA098, 0x8C9E, 0xA345, 0x8CA2, 0xA531, 0x8CBE, 0xA5E5, 0x8C6B, 0xA609, 0x8BEA, 0xA4EC, 0x8B02, 0xA394, 0x89B1, 0xA3B2, 0x8867, 0xA53A, 0x8772, 0xA7C6, 0x870E, 0xA9A5, 0x86DE, 0xAA2D, 0x8675, 0xAA14, 0x85F2, 0xA8A2, 0x853F, 0xA6C5, 0x842E, 0xA64B, 0x82EB, 0xA755, 0x81C5, 0xA99C, 0x8104, 0xAB52, 0x808F, 0xABA6, 0x8015, 0xAB52, 0x7F9B, 0xA99C, 0x7F25, 0xA755, 0x7E64, 0xA64C, 0x7D3E, 0xA6C7, 0x7BFA, 0xA8A5, 0x7AEA, 0xAA18, 0x7A37, 0xAA31, 0x79B5, 0xA9A9, 0x794B, 0xA7CA, 0x791B, 0xA53C, 0x78B7, 0xA3B6, 0x77C1, 0xA39A, 0x7677, 0xA4F1, 0x7526, 0xA60E, 0x743F, 0xA5EB, 0x73BD, 0xA538, 0x736B, 0xA34B, 0x7387, 0xA09E, 0x738A, 0x9EB4, 0x72D6, 0x9E02, 0x719B, 0x9EC4, 0x701D, 0x9F7E, 0x6F0E, 0x9F20, 0x6E96, 0x9E4E, 0x6E61, 0x9C6E, 0x6ECA, 0x99CB, 0x6F37, 0x97A0, 0x6ED2, 0x9664, 0x6DBC, 0x966B, 0x6C38, 0x969B, 0x6B21, 0x960B, 0x6ABB, 0x9526, 0x6AA6, 0x938E, 0x6B48, 0x913B, 0x6C0B, 0x8EF4, 0x6BFA, 0x8D43, 0x6B1D, 0x8C94, 0x69AA, 0x8C3F, 0x689B, 0x8B85, 0x684D, 0x8A9E, 0x685C, 0x8962, 0x692E, 0x8781, 0x6A3C, 0x8546, 0x6A82, 0x833F, 0x69EA, 0x81EC, 0x68A0, 0x811C, 0x67A8, 0x8045, 0x6778, 0x8045, 0x6778, 0xFFFF, 0x8047, 0x6AA0, 0x81C8, 0x6AFA, 0x8268, 0x6BD5, 0x81C8, 0x6CAF, 0x8047, 0x6D09, 0x7EC6, 0x6CAF, 0x7E27, 0x6BD5, 0x7EC6, 0x6AFA, 0x8047, 0x6AA0, 0x8047, 0x6AA0, 0xFFFF, 0x803E, 0x6E19, 0x867C, 0x6E71, 0x8C65, 0x6F75, 0x91D7, 0x711B, 0x96AD, 0x735B, 0x9ABC, 0x762C, 0x9DA2, 0x794C, 0x9F5F, 0x7CA2, 0x9FF3, 0x8011, 0x9F5E, 0x8380, 0x9DA1, 0x86D5, 0x9ABA, 0x89F6, 0x96AB, 0x8CC7, 0x91D6, 0x8F08, 0x8C65, 0x90AD, 0x867C, 0x91B1, 0x803D, 0x9209, 0x7A00, 0x91B1, 0x7416, 0x90AD, 0x6EA6, 0x8F08, 0x69D0, 0x8CC7, 0x65D6, 0x8A0A, 0x62EE, 0x86F4, 0x6125, 0x839B, 0x6089, 0x8011, 0x6124, 0x7C88, 0x62ED, 0x792E, 0x65D6, 0x7619, 0x69CF, 0x735B, 0x6EA5, 0x711B, 0x7416, 0x6F75, 0x7A00, 0x6E71, 0x803E, 0x6E19, 0x803E, 0x6E19, 0xFFFF, 0x803E, 0x6EB2, 0x7A5A, 0x6F04, 0x74B2, 0x6FF8, 0x6F4B, 0x7194, 0x6A8F, 0x73C7, 0x66A2, 0x7681, 0x63D5, 0x7986, 0x6226, 0x7CBF, 0x6197, 0x8011, 0x6226, 0x8363, 0x63D5, 0x869C, 0x66A2, 0x89A2, 0x6A8F, 0x8C5B, 0x6F4B, 0x8E8E, 0x74B2, 0x902B, 0x7A5A, 0x911E, 0x803D, 0x9170, 0x803E, 0x9170, 0x8621, 0x911E, 0x8BCA, 0x902B, 0x9130, 0x8E8E, 0x95ED, 0x8C5B, 0x99CF, 0x89AB, 0x9CA7, 0x869C, 0x9E55, 0x8367, 0x9EE5, 0x8011, 0x9E55, 0x7CBB, 0x9CA7, 0x7986, 0x99CF, 0x7677, 0x95ED, 0x73C7, 0x9130, 0x7194, 0x8BCA, 0x6FF8, 0x8621, 0x6F04, 0x803E, 0x6EB2, 0x803E, 0x6EB2, 0xFFFF, 0x80BC, 0x6FD7, 0x80AF, 0x71D8, 0x7FC8, 0x71D9, 0x7FB7, 0x6FD8, 0x80BC, 0x6FD7, 0x80BC, 0x6FD7, 0xFFFF, 0x83CB, 0x6FF6, 0x84CD, 0x700B, 0x843E, 0x7206, 0x835B, 0x71F4, 0xFFFF, 0x7CA9, 0x6FF8, 0x7D1A, 0x71F5, 0x7C37, 0x7207, 0x7BA7, 0x700D, 0x7CA9, 0x6FF8, 0x7CA9, 0x6FF8, 0xFFFF, 0x87CD, 0x7068, 0x88C7, 0x7092, 0x87BA, 0x727C, 0x86DF, 0x7258, 0xFFFF, 0x78A8, 0x706B, 0x7997, 0x725A, 0x78BA, 0x727E, 0x77AD, 0x7095, 0x78A8, 0x706B, 0x78A8, 0x706B, 0xFFFF, 0x6700, 0x708A, 0x6880, 0x70E5, 0x6920, 0x71BF, 0x6880, 0x7299, 0x66FF, 0x72F4, 0x657F, 0x7299, 0x64E0, 0x71BF, 0x657F, 0x70E4, 0x6700, 0x708A, 0x6700, 0x708A, 0xFFFF, 0x998D, 0x708C, 0x9B0E, 0x70E6, 0x9BAE, 0x71C0, 0x9B0E, 0x729B, 0x998D, 0x72F6, 0x980D, 0x729B, 0x976E, 0x71C1, 0x980D, 0x70E7, 0x998D, 0x708C, 0x998D, 0x708C, 0xFFFF, 0x8BA7, 0x712C, 0x8C95, 0x716A, 0x8B10, 0x7339, 0x8A3F, 0x7303, 0x8BA7, 0x712C, 0xFFFF, 0x74CE, 0x712F, 0x7635, 0x7307, 0x7564, 0x733C, 0x73DE, 0x716D, 0x74CE, 0x712F, 0x74CE, 0x712F, 0xFFFF, 0x8F47, 0x723F, 0x9023, 0x728E, 0x8E2D, 0x743A, 0x8D6B, 0x73F4, 0x8F47, 0x723F, 0xFFFF, 0x712D, 0x7242, 0x7308, 0x73F7, 0x7248, 0x743D, 0x7050, 0x7292, 0x712D, 0x7242, 0x712D, 0x7242, 0xFFFF, 0x803E, 0x72F6, 0x891B, 0x73F4, 0x909A, 0x76CC, 0x959F, 0x7B0B, 0x975E, 0x8011, 0x959F, 0x8517, 0x909A, 0x8957, 0x891B, 0x8C2E, 0x803E, 0x8D2B, 0x7761, 0x8C2E, 0x6FE2, 0x8957, 0x6ADD, 0x8517, 0x691E, 0x8011, 0x6ADD, 0x7B0B, 0x6FE2, 0x76CC, 0x7761, 0x73F4, 0x803E, 0x72F6, 0x803E, 0x72F6, 0xFFFF, 0x803E, 0x738F, 0x77C8, 0x7481, 0x70A0, 0x7738, 0x6BD7, 0x7B46, 0x6A2C, 0x8011, 0x6BD7, 0x84DC, 0x70A1, 0x88EA, 0x77C9, 0x8BA1, 0x803E, 0x8C93, 0x88B4, 0x8BA1, 0x8FDB, 0x88EA, 0x94A5, 0x84DD, 0x9650, 0x8011, 0x94A5, 0x7B46, 0x8FDB, 0x7738, 0x88B4, 0x7481, 0x803E, 0x738F, 0x803E, 0x738F, 0xFFFF, 0x929B, 0x739A, 0x935C, 0x73FA, 0x9100, 0x7578, 0x905A, 0x7527, 0x9175, 0x745E, 0xFFFF, 0x6DDC, 0x739D, 0x7022, 0x7527, 0x6F74, 0x757C, 0x6D16, 0x73FF, 0x6DDC, 0x739D, 0x6DDC, 0x739D, 0xFFFF, 0x9589, 0x7533, 0x9634, 0x75A4, 0x937E, 0x76ED, 0x92E8, 0x768B, 0xFFFF, 0x6AEB, 0x7539, 0x6D8D, 0x7690, 0x6CFB, 0x76F0, 0x6CEC, 0x76FA, 0x6BED, 0x7674, 0x6A40, 0x75A9, 0x6A45, 0x75A7, 0x6AEB, 0x7539, 0x6AEB, 0x7539, 0xFFFF, 0x980B, 0x7707, 0x989A, 0x7784, 0x9597, 0x7892, 0x951A, 0x7825, 0xFFFF, 0x686A, 0x770C, 0x6B5B, 0x782A, 0x6ADF, 0x7897, 0x67DD, 0x7788, 0x686A, 0x770C, 0x686A, 0x770C, 0xFFFF, 0x9A12, 0x790A, 0x9A7E, 0x7991, 0x9740, 0x7A5E, 0x96E1, 0x79E8, 0x9A12, 0x790A, 0xFFFF, 0x6664, 0x790F, 0x6996, 0x79ED, 0x6937, 0x7A63, 0x65F9, 0x7996, 0x6664, 0x790F, 0x6664, 0x790F, 0xFFFF, 0x9B91, 0x7B32, 0x9BDB, 0x7BC1, 0x9870, 0x7C48, 0x9831, 0x7BCB, 0xFFFF, 0x64E6, 0x7B37, 0x6847, 0x7BD0, 0x6807, 0x7C4C, 0x649D, 0x7BC5, 0x64E6, 0x7B37, 0x64E6, 0x7B37, 0xFFFF, 0x9C82, 0x7D72, 0x9CA7, 0x7E06, 0x9925, 0x7E46, 0x9903, 0x7DC5, 0xFFFF, 0x63F7, 0x7D78, 0x6776, 0x7DC9, 0x6756, 0x7E49, 0x63D3, 0x7E0A, 0x63F7, 0x7D78, 0x63F7, 0x7D78, 0xFFFF, 0x5C87, 0x7EDB, 0x5E08, 0x7F35, 0x5EA8, 0x800F, 0x5E08, 0x80E9, 0x5C87, 0x8144, 0x5C85, 0x8144, 0x5B06, 0x80E9, 0x5A67, 0x800F, 0x5B06, 0x7F35, 0x5C87, 0x7EDB, 0x5C87, 0x7EDB, 0xFFFF, 0xA402, 0x7EDE, 0xA583, 0x7F38, 0xA623, 0x8011, 0xA623, 0x8013, 0xA583, 0x80EC, 0xA402, 0x8147, 0xA281, 0x80ED, 0xA1E2, 0x8013, 0xA281, 0x7F38, 0xA402, 0x7EDE, 0xA402, 0x7EDE, 0xFFFF, 0x9CE0, 0x7FC0, 0x9CE0, 0x8055, 0x9957, 0x804D, 0x9957, 0x7FCB, 0xFFFF, 0x639D, 0x7FC5, 0x6726, 0x7FCE, 0x6726, 0x8051, 0x639D, 0x805A, 0x639D, 0x7FC5, 0x639D, 0x7FC5, 0xFFFF, 0x9927, 0x81D1, 0x9CAA, 0x8210, 0x9C87, 0x82A2, 0x9907, 0x8252, 0x9927, 0x81D1, 0x9927, 0x81D1, 0xFFFF, 0x6757, 0x81D5, 0x6777, 0x8255, 0x63F9, 0x82A7, 0x63D4, 0x8214, 0xFFFF, 0x9877, 0x83CF, 0x9BE2, 0x8455, 0x9B99, 0x84E3, 0x9838, 0x844C, 0x9877, 0x83CF, 0x9877, 0x83CF, 0xFFFF, 0x6808, 0x83D3, 0x6848, 0x8450, 0x64E7, 0x84E8, 0x649E, 0x845A, 0xFFFF, 0x9749, 0x85B9, 0x9A88, 0x8684, 0x9A1D, 0x870C, 0x96EB, 0x862E, 0x9749, 0x85B9, 0x9749, 0x85B9, 0xFFFF, 0x6938, 0x85BD, 0x6997, 0x8634, 0x6665, 0x8710, 0x65F9, 0x8689, 0xFFFF, 0x95A2, 0x8785, 0x98A5, 0x8892, 0x9818, 0x890F, 0x9527, 0x87F2, 0x95A2, 0x8785, 0x95A2, 0x8785, 0xFFFF, 0x6ADF, 0x878A, 0x6B5B, 0x87F8, 0x686A, 0x8914, 0x67DC, 0x8897, 0x6ADF, 0x878A, 0xFFFF, 0x6CF7, 0x892F, 0x6D8D, 0x8991, 0x6AEB, 0x8AE9, 0x6A40, 0x8A79, 0xFFFF, 0x9380, 0x8932, 0x9645, 0x8A72, 0x963E, 0x8A77, 0x9599, 0x8AE3, 0x92F5, 0x898D, 0x9380, 0x8932, 0x9380, 0x8932, 0xFFFF, 0x9110, 0x8AA1, 0x936F, 0x8C1F, 0x92AA, 0x8C80, 0x9064, 0x8AF7, 0x9110, 0x8AA1, 0x9110, 0x8AA1, 0xFFFF, 0x6F73, 0x8AA5, 0x7021, 0x8AFB, 0x7035, 0x8B04, 0x6DED, 0x8C8B, 0x6DE1, 0x8C87, 0x6D17, 0x8C23, 0xFFFF, 0x8E3E, 0x8BE1, 0x9037, 0x8D8B, 0x8F59, 0x8DDC, 0x8D7C, 0x8C27, 0x8E3E, 0x8BE1, 0x8E3E, 0x8BE1, 0xFFFF, 0x7259, 0x8BEB, 0x731B, 0x8C31, 0x7140, 0x8DE7, 0x7064, 0x8D97, 0xFFFF, 0x8B21, 0x8CE3, 0x8CA9, 0x8EB2, 0x8BBA, 0x8EEF, 0x8A51, 0x8D18, 0x8B21, 0x8CE3, 0x8B21, 0x8CE3, 0xFFFF, 0x7576, 0x8CEB, 0x7648, 0x8D20, 0x74E0, 0x8EF8, 0x73F2, 0x8EBB, 0xFFFF, 0x66F3, 0x8D2F, 0x6874, 0x8D8A, 0x687D, 0x8D8F, 0x6886, 0x8D94, 0x6926, 0x8E6E, 0x6887, 0x8F48, 0x6705, 0x8FA2, 0x6584, 0x8F49, 0x657F, 0x8F45, 0x6570, 0x8F3E, 0x6573, 0x8F3E, 0x64D3, 0x8E63, 0x6573, 0x8D89, 0x66F3, 0x8D2F, 0x66F3, 0x8D2F, 0xFFFF, 0x9993, 0x8D31, 0x9B13, 0x8D8C, 0x9BB4, 0x8E66, 0x9B16, 0x8F40, 0x9993, 0x8F9A, 0x9814, 0x8F40, 0x9774, 0x8E66, 0x9812, 0x8D8C, 0x9993, 0x8D31, 0x9993, 0x8D31, 0xFFFF, 0x87CD, 0x8DA1, 0x88DC, 0x8F8B, 0x87E0, 0x8FB5, 0x86F0, 0x8DC6, 0x87CD, 0x8DA1, 0x87CD, 0x8DA1, 0xFFFF, 0x78CD, 0x8DA8, 0x79A8, 0x8DCB, 0x78BC, 0x8FBB, 0x77C1, 0x8F92, 0xFFFF, 0x8450, 0x8E19, 0x84E2, 0x9014, 0x83E0, 0x9029, 0x836C, 0x8E2C, 0x8450, 0x8E19, 0x8450, 0x8E19, 0xFFFF, 0x7C48, 0x8E1C, 0x7D2B, 0x8E2E, 0x7CBD, 0x902C, 0x7BBB, 0x9017, 0x7C48, 0x8E1C, 0xFFFF, 0x80BF, 0x8E49, 0x80D2, 0x904A, 0x7FCC, 0x904A, 0x7FD9, 0x8E49, 0x80BF, 0x8E49, 0x80BF, 0x8E49, 0xFFFF, 0x804F, 0x9321, 0x81D0, 0x937A, 0x8271, 0x9455, 0x81D1, 0x952F, 0x8051, 0x958A, 0x7ECF, 0x9530, 0x7E2F, 0x9456, 0x7ECE, 0x937B, 0x804F, 0x9321, 0x804F, 0x9321, 0xFFFF, 0x8048, 0x46D9, 0x27BC, 0x9DBA, 0xD8D3, 0x9DBA, 0xFFFF, 0x8048, 0x4BC9, 0x952E, 0x604A, 0x6B62, 0x604A, 0xFFFF, 0x68D2, 0x62CE, 0x97BF, 0x62CE, 0xB9BA, 0x8427, 0xA239, 0x9B36, 0x5E16, 0x9B36, 0x46B6, 0x8446, 0x68D2, 0x62CE, 0xFFFF, 0xBC3E, 0x869F, 0xD13B, 0x9B36, 0xA742, 0x9B36, 0xFFFF, 0x4431, 0x86BE, 0x590E, 0x9B36, 0x2F54, 0x9B36, 0x4431, 0x86BE}; -const PROGMEM uint16_t logo_white[] = {0x80BC, 0x6FD7, 0x80AF, 0x71D8, 0x7FC8, 0x71D9, 0x7FB7, 0x6FD8, 0x80BC, 0x6FD7, 0xFFFF, 0x83CB, 0x6FF6, 0x84CD, 0x700B, 0x843E, 0x7206, 0x835B, 0x71F4, 0xFFFF, 0x7CA9, 0x6FF8, 0x7D1A, 0x71F5, 0x7C37, 0x7207, 0x7BA7, 0x700D, 0x7CA9, 0x6FF8, 0x7CA9, 0x6FF8, 0xFFFF, 0x87CD, 0x7068, 0x88C7, 0x7092, 0x87BA, 0x727C, 0x86DF, 0x7258, 0xFFFF, 0x78A8, 0x706B, 0x7997, 0x725A, 0x78BA, 0x727E, 0x77AD, 0x7095, 0x78A8, 0x706B, 0x78A8, 0x706B, 0xFFFF, 0x8BA7, 0x712C, 0x8C95, 0x716A, 0x8B10, 0x7339, 0x8A3F, 0x7303, 0xFFFF, 0x74CE, 0x712F, 0x7635, 0x7307, 0x7564, 0x733C, 0x73DE, 0x716D, 0x74CE, 0x712F, 0x74CE, 0x712F, 0xFFFF, 0x8F47, 0x723F, 0x9023, 0x728E, 0x8E2D, 0x743A, 0x8D6B, 0x73F4, 0xFFFF, 0x712D, 0x7242, 0x7309, 0x73F7, 0x7248, 0x743D, 0x7050, 0x7292, 0x712D, 0x7242, 0x712D, 0x7242, 0xFFFF, 0x929B, 0x739A, 0x935C, 0x73FA, 0x9100, 0x7578, 0x905A, 0x7527, 0xFFFF, 0x6DDC, 0x739D, 0x7022, 0x7527, 0x6F74, 0x757C, 0x6D16, 0x73FF, 0x6DDC, 0x739D, 0x6DDC, 0x739D, 0xFFFF, 0x9589, 0x7533, 0x9634, 0x75A4, 0x937E, 0x76ED, 0x92E8, 0x768B, 0xFFFF, 0x6AEB, 0x7539, 0x6D8D, 0x7690, 0x6CFB, 0x76F0, 0x6A40, 0x75A9, 0x6AEB, 0x7539, 0xFFFF, 0x980B, 0x7707, 0x989A, 0x7784, 0x9597, 0x7892, 0x951A, 0x7825, 0xFFFF, 0x686A, 0x770C, 0x6B5B, 0x782A, 0x6ADF, 0x7897, 0x67DD, 0x7788, 0x686A, 0x770C, 0x686A, 0x770C, 0xFFFF, 0x9A12, 0x790A, 0x9A7E, 0x7991, 0x9740, 0x7A5E, 0x96E1, 0x79E8, 0xFFFF, 0x6664, 0x790F, 0x6996, 0x79ED, 0x6937, 0x7A63, 0x65F9, 0x7996, 0x6664, 0x790F, 0x6664, 0x790F, 0xFFFF, 0x9B91, 0x7B32, 0x9BDB, 0x7BC1, 0x9870, 0x7C48, 0x9831, 0x7BCC, 0xFFFF, 0x64E6, 0x7B37, 0x6847, 0x7BD0, 0x6807, 0x7C4C, 0x649D, 0x7BC5, 0x64E6, 0x7B37, 0x64E6, 0x7B37, 0xFFFF, 0x9C82, 0x7D72, 0x9CA7, 0x7E06, 0x9925, 0x7E46, 0x9903, 0x7DC5, 0xFFFF, 0x63F7, 0x7D78, 0x6776, 0x7DC9, 0x6756, 0x7E49, 0x63D3, 0x7E0A, 0x63F7, 0x7D78, 0x63F7, 0x7D78, 0xFFFF, 0x9CE0, 0x7FC0, 0x9CE0, 0x8055, 0x9957, 0x804D, 0x9957, 0x7FCB, 0xFFFF, 0x639D, 0x7FC5, 0x6726, 0x7FCE, 0x6726, 0x8051, 0x639D, 0x805A, 0x639D, 0x7FC5, 0xFFFF, 0x9927, 0x81D1, 0x9CAA, 0x8210, 0x9C87, 0x82A2, 0x9907, 0x8252, 0x9927, 0x81D1, 0x9927, 0x81D1, 0xFFFF, 0x6757, 0x81D5, 0x6777, 0x8256, 0x63F9, 0x82A7, 0x63D4, 0x8214, 0xFFFF, 0x9877, 0x83CF, 0x9BE2, 0x8455, 0x9B99, 0x84E3, 0x9838, 0x844C, 0x9877, 0x83CF, 0xFFFF, 0x6808, 0x83D3, 0x6848, 0x8450, 0x64E7, 0x84E8, 0x649E, 0x845A, 0xFFFF, 0x9749, 0x85B9, 0x9A88, 0x8684, 0x9A1D, 0x870C, 0x96EB, 0x862E, 0x9749, 0x85B9, 0x9749, 0x85B9, 0xFFFF, 0x6938, 0x85BD, 0x6997, 0x8634, 0x6665, 0x8710, 0x65F9, 0x8689, 0xFFFF, 0x95A2, 0x8785, 0x98A5, 0x8892, 0x9818, 0x890F, 0x9527, 0x87F2, 0x95A2, 0x8785, 0x95A2, 0x8785, 0xFFFF, 0x6ADF, 0x878A, 0x6B5B, 0x87F8, 0x686A, 0x8915, 0x67DC, 0x8897, 0xFFFF, 0x6CF7, 0x8930, 0x6D8D, 0x8991, 0x6AEB, 0x8AE9, 0x6A40, 0x8A79, 0xFFFF, 0x9380, 0x8932, 0x9645, 0x8A72, 0x9599, 0x8AE3, 0x92F5, 0x898D, 0x9380, 0x8932, 0xFFFF, 0x9110, 0x8AA1, 0x936F, 0x8C1F, 0x92AA, 0x8C80, 0x9064, 0x8AF7, 0x9110, 0x8AA1, 0x9110, 0x8AA1, 0xFFFF, 0x6F73, 0x8AA5, 0x7021, 0x8AFB, 0x6DED, 0x8C8C, 0x6D17, 0x8C23, 0xFFFF, 0x8E3E, 0x8BE1, 0x9037, 0x8D8B, 0x8F59, 0x8DDC, 0x8D7C, 0x8C27, 0x8E3E, 0x8BE1, 0x8E3E, 0x8BE1, 0xFFFF, 0x7259, 0x8BEB, 0x731B, 0x8C31, 0x7140, 0x8DE7, 0x7064, 0x8D97, 0xFFFF, 0x8B21, 0x8CE3, 0x8CA9, 0x8EB2, 0x8BBA, 0x8EEF, 0x8A51, 0x8D18, 0x8B21, 0x8CE3, 0x8B21, 0x8CE3, 0xFFFF, 0x7576, 0x8CEB, 0x7648, 0x8D20, 0x74E0, 0x8EF8, 0x73F2, 0x8EBB, 0xFFFF, 0x87CD, 0x8DA1, 0x88DC, 0x8F8B, 0x87E0, 0x8FB5, 0x86F0, 0x8DC6, 0x87CD, 0x8DA1, 0x87CD, 0x8DA1, 0xFFFF, 0x78CC, 0x8DA8, 0x79A8, 0x8DCB, 0x78BC, 0x8FBB, 0x77C0, 0x8F92, 0xFFFF, 0x8450, 0x8E19, 0x84E2, 0x9014, 0x83E0, 0x9029, 0x836C, 0x8E2C, 0x8450, 0x8E19, 0x8450, 0x8E19, 0xFFFF, 0x7C48, 0x8E1C, 0x7D2B, 0x8E2E, 0x7CBD, 0x902C, 0x7BBB, 0x9017, 0xFFFF, 0x80BE, 0x8E49, 0x80D1, 0x904A, 0x7FCC, 0x904A, 0x7FD9, 0x8E49, 0x80BE, 0x8E49, 0xFFFF, 0x8276, 0x75D6, 0x83AF, 0x75FE, 0x8436, 0x7628, 0x84AE, 0x7661, 0x8542, 0x7706, 0x8512, 0x77BA, 0x8457, 0x7845, 0x8335, 0x788B, 0x8318, 0x7882, 0x82D8, 0x7860, 0x831E, 0x7830, 0x8353, 0x7823, 0x83E6, 0x77F9, 0x8464, 0x7790, 0x847A, 0x771A, 0x8415, 0x76B7, 0x83B6, 0x7691, 0x8351, 0x7676, 0x827F, 0x7662, 0x81BB, 0x7687, 0x8161, 0x76AF, 0x8123, 0x76DA, 0x80E5, 0x771A, 0x80C5, 0x774D, 0x80B8, 0x77C1, 0x80D1, 0x77EE, 0x8107, 0x7814, 0x81CC, 0x786B, 0x837F, 0x7918, 0x8464, 0x7983, 0x84C0, 0x79B2, 0x852D, 0x79FD, 0x859D, 0x7ABC, 0x858E, 0x7B79, 0x8545, 0x7C25, 0x84D9, 0x7CC5, 0x8469, 0x7D4D, 0x843B, 0x7DCD, 0x8555, 0x7DA8, 0x85D3, 0x7D67, 0x870D, 0x7CA0, 0x87E0, 0x7BC0, 0x880D, 0x7B5B, 0x886D, 0x7A46, 0x88B3, 0x799B, 0x88CC, 0x7970, 0x893A, 0x78EA, 0x8995, 0x78A8, 0x8A01, 0x786F, 0x8AF8, 0x781F, 0x8BA6, 0x77FD, 0x8C0C, 0x77EF, 0x8C96, 0x77FB, 0x8D1D, 0x7815, 0x8D59, 0x7826, 0x8E40, 0x7889, 0x8EDB, 0x7925, 0x8EFC, 0x797B, 0x8EFF, 0x79D4, 0x8E71, 0x7A7B, 0x8D58, 0x7AD2, 0x8C23, 0x7ADE, 0x8AFF, 0x7A97, 0x8AF5, 0x7A81, 0x8AEF, 0x7A4E, 0x8B68, 0x7A52, 0x8B96, 0x7A5F, 0x8C39, 0x7A87, 0x8D33, 0x7A7F, 0x8E07, 0x7A3F, 0x8E66, 0x79CB, 0x8E63, 0x7985, 0x8E43, 0x793F, 0x8DC6, 0x78C6, 0x8CFA, 0x7876, 0x8C7E, 0x785F, 0x8C18, 0x7857, 0x8B84, 0x7874, 0x8B22, 0x788F, 0x8A7D, 0x78CA, 0x8A2E, 0x78F9, 0x89F0, 0x7930, 0x89A3, 0x79A5, 0x8979, 0x7AC0, 0x897C, 0x7B9C, 0x8972, 0x7BF2, 0x88CC, 0x7D32, 0x87B7, 0x7E4C, 0x8665, 0x7F52, 0x8660, 0x7F5A, 0x878F, 0x7F01, 0x88AE, 0x7EC2, 0x89FD, 0x7E9E, 0x8B8D, 0x7EC6, 0x8C40, 0x7F0E, 0x8CB6, 0x7F68, 0x8D1D, 0x7FD7, 0x8DFA, 0x80BD, 0x8EA8, 0x816E, 0x8F34, 0x81D4, 0x8F8A, 0x81F9, 0x8FDA, 0x820A, 0x90AB, 0x820F, 0x9120, 0x81FF, 0x91A5, 0x81DC, 0x91F4, 0x81B8, 0x922C, 0x8198, 0x9288, 0x812B, 0x927D, 0x80AB, 0x9252, 0x8068, 0x921C, 0x8033, 0x9174, 0x7FEB, 0x9099, 0x7FEB, 0x8FCF, 0x8029, 0x8F5D, 0x808D, 0x8F47, 0x80A4, 0x8ED4, 0x80A4, 0x8EC5, 0x8070, 0x8F65, 0x7FE6, 0x906D, 0x7F92, 0x91A4, 0x7F90, 0x92A8, 0x7FF7, 0x92FC, 0x8043, 0x9331, 0x8090, 0x9349, 0x813D, 0x92D1, 0x81E3, 0x9264, 0x8227, 0x91E5, 0x825B, 0x915D, 0x8280, 0x90D3, 0x8296, 0x8FA0, 0x829A, 0x8F2C, 0x8286, 0x8EE7, 0x8273, 0x8E78, 0x824A, 0x8DA9, 0x81D4, 0x8CB9, 0x8127, 0x8B68, 0x802C, 0x8B22, 0x8001, 0x8AC3, 0x7FE7, 0x8A50, 0x7FF4, 0x88FD, 0x8068, 0x87A4, 0x811D, 0x879E, 0x812D, 0x8904, 0x81F1, 0x89D4, 0x8285, 0x8A7C, 0x8343, 0x8A94, 0x8431, 0x8A4E, 0x84A1, 0x89E8, 0x850E, 0x892F, 0x85E5, 0x88B0, 0x86E5, 0x88C0, 0x8757, 0x88F2, 0x878D, 0x8927, 0x87AD, 0x8ABF, 0x8821, 0x8B0E, 0x881E, 0x8B70, 0x8811, 0x8C1B, 0x87D6, 0x8C9B, 0x8776, 0x8CC4, 0x873D, 0x8CD3, 0x8705, 0x8CA2, 0x86A3, 0x8C06, 0x8662, 0x8B39, 0x864F, 0x8A77, 0x8662, 0x89F9, 0x864D, 0x8A10, 0x8606, 0x8A66, 0x85F7, 0x8B35, 0x85DC, 0x8C50, 0x85FD, 0x8D3C, 0x8663, 0x8D94, 0x870A, 0x8D7D, 0x875F, 0x8D3A, 0x87B8, 0x8CB1, 0x882D, 0x8BC1, 0x888C, 0x8B30, 0x88A7, 0x8A8D, 0x88AE, 0x89EE, 0x8898, 0x896E, 0x887E, 0x8869, 0x882D, 0x87EE, 0x87EA, 0x87A4, 0x87A8, 0x878E, 0x8785, 0x874D, 0x86E3, 0x875D, 0x8637, 0x87FD, 0x8466, 0x8705, 0x835A, 0x86B8, 0x8359, 0x84A4, 0x8358, 0x7F20, 0x851B, 0x7F13, 0x864D, 0x8016, 0x86F9, 0x818E, 0x87D8, 0x823B, 0x8869, 0x8272, 0x88C9, 0x8276, 0x8915, 0x8266, 0x893D, 0x81FB, 0x89D8, 0x8197, 0x8A21, 0x8119, 0x8A62, 0x80A7, 0x8A8A, 0x8016, 0x8AAA, 0x7EDC, 0x8AAE, 0x7DC5, 0x8A63, 0x7D55, 0x8A29, 0x7CFA, 0x89E5, 0x7CAD, 0x8939, 0x7D1B, 0x8895, 0x7E00, 0x8825, 0x7F27, 0x8800, 0x7F66, 0x880F, 0x7F69, 0x8850, 0x7E49, 0x8873, 0x7D9A, 0x88C9, 0x7D4F, 0x893E, 0x7D8B, 0x89B2, 0x7DD8, 0x89E6, 0x7E36, 0x8A10, 0x7F02, 0x8A40, 0x7FDB, 0x8A34, 0x8046, 0x8A16, 0x8091, 0x89F5, 0x80A5, 0x89EB, 0x80FE, 0x89AB, 0x8126, 0x8981, 0x8159, 0x8918, 0x814F, 0x88E6, 0x8128, 0x88B8, 0x8094, 0x8856, 0x7EFC, 0x8796, 0x7D74, 0x86E7, 0x7D3D, 0x86C5, 0x7CD8, 0x8674, 0x7C98, 0x8605, 0x7CA0, 0x8536, 0x7D7C, 0x83E6, 0x7E07, 0x8357, 0x7DED, 0x835B, 0x79CC, 0x843E, 0x7962, 0x8448, 0x77CB, 0x8450, 0x76F3, 0x8438, 0x763E, 0x841E, 0x7502, 0x83FE, 0x746C, 0x83FD, 0x73E4, 0x840A, 0x72CE, 0x8444, 0x729B, 0x8457, 0x71E6, 0x84B7, 0x71B5, 0x84EB, 0x719B, 0x853B, 0x719B, 0x8558, 0x71D4, 0x85E0, 0x72B0, 0x8642, 0x73D4, 0x8661, 0x74B3, 0x8616, 0x74AD, 0x84D7, 0x74B2, 0x84B3, 0x74B5, 0x849B, 0x751E, 0x8496, 0x753B, 0x84B8, 0x75C5, 0x856E, 0x756D, 0x865A, 0x74D0, 0x86B8, 0x73FA, 0x86EA, 0x7250, 0x86CF, 0x70E7, 0x863F, 0x707E, 0x85C8, 0x705F, 0x8549, 0x7075, 0x84CC, 0x70AC, 0x8475, 0x70CD, 0x8452, 0x71FF, 0x839C, 0x7287, 0x8376, 0x736A, 0x833A, 0x7443, 0x8319, 0x751E, 0x8311, 0x76AC, 0x8327, 0x77C4, 0x8341, 0x7810, 0x8340, 0x799F, 0x8313, 0x7A2A, 0x82EA, 0x7B24, 0x8281, 0x7BE4, 0x820C, 0x7BEC, 0x81B1, 0x7A5E, 0x81C8, 0x7809, 0x81ED, 0x7751, 0x81F8, 0x7664, 0x81EF, 0x7571, 0x81B4, 0x74BB, 0x8141, 0x7483, 0x80F9, 0x7408, 0x802F, 0x73D9, 0x7FEB, 0x7359, 0x7F50, 0x72A0, 0x7EC4, 0x719E, 0x7E89, 0x7074, 0x7EA8, 0x7015, 0x7ECC, 0x6FD0, 0x7EF8, 0x6FA3, 0x7F19, 0x6F6B, 0x7FBB, 0x6F93, 0x8017, 0x6FA7, 0x8032, 0x6FD7, 0x805A, 0x70DF, 0x8092, 0x7205, 0x805A, 0x729E, 0x7FCB, 0x72B3, 0x7FBC, 0x7309, 0x7FA6, 0x733B, 0x7FDE, 0x72F9, 0x804B, 0x726D, 0x80A7, 0x70E6, 0x80FB, 0x700D, 0x80EC, 0x6F48, 0x80A8, 0x6EFC, 0x8073, 0x6EC1, 0x8026, 0x6E93, 0x7FCC, 0x6ED4, 0x7ED8, 0x6F54, 0x7E72, 0x6FCB, 0x7E3A, 0x700B, 0x7E25, 0x71AB, 0x7DED, 0x7356, 0x7E3E, 0x7472, 0x7EF4, 0x7536, 0x7FBD, 0x75DA, 0x8075, 0x7628, 0x80B6, 0x767B, 0x80D8, 0x76D9, 0x80EF, 0x7755, 0x80FC, 0x7881, 0x80D5, 0x7931, 0x8093, 0x7A00, 0x801E, 0x799B, 0x7D9B, 0x789A, 0x7CD8, 0x77C0, 0x7BE5, 0x7783, 0x7B55, 0x7787, 0x7AB9, 0x77AE, 0x7A67, 0x77E6, 0x7A1D, 0x781E, 0x79CD, 0x785E, 0x7909, 0x7853, 0x78C0, 0x7823, 0x788B, 0x7808, 0x7875, 0x7649, 0x77E8, 0x74B6, 0x7869, 0x7488, 0x78B3, 0x7472, 0x7901, 0x74D2, 0x796F, 0x75D8, 0x799A, 0x76EE, 0x7971, 0x774A, 0x797A, 0x7751, 0x79B4, 0x76A0, 0x79F0, 0x75E4, 0x7A0A, 0x7454, 0x79E1, 0x73AF, 0x7986, 0x7369, 0x7909, 0x7374, 0x7891, 0x739D, 0x783C, 0x73B6, 0x781E, 0x74B7, 0x7768, 0x765D, 0x772C, 0x77ED, 0x7769, 0x7932, 0x77FC, 0x7979, 0x7836, 0x79B8, 0x787B, 0x79DF, 0x7912, 0x7998, 0x7A14, 0x7967, 0x7AB4, 0x796A, 0x7AD8, 0x79C5, 0x7B60, 0x7A9D, 0x7BE9, 0x7B72, 0x7C47, 0x7EBA, 0x7BD6, 0x8206, 0x7CA8, 0x82FA, 0x7C2E, 0x8391, 0x7BB4, 0x83F6, 0x7B40, 0x8413, 0x7AD0, 0x83DD, 0x7A71, 0x838A, 0x7A39, 0x8296, 0x79B7, 0x80F3, 0x78FA, 0x8016, 0x788A, 0x7FB4, 0x7833, 0x7F8D, 0x77DF, 0x7F92, 0x77A9, 0x7FB3, 0x7718, 0x7FF6, 0x76C2, 0x8036, 0x768A, 0x8097, 0x764A, 0x80DF, 0x762A, 0x813C, 0x7605, 0x8275, 0x75D5}; - -#define LOGO_BACKGROUND 0xDEEA5C - -#define LOGO_PAINT_PATHS \ - LOGO_PAINT_PATH(0xC1D82F, logo_green) \ - LOGO_PAINT_PATH(0x000000, logo_black) \ - LOGO_PAINT_PATH(0x000000, logo_type) \ - LOGO_PAINT_PATH(0x000000, logo_mark) \ - LOGO_PAINT_PATH(0xFFFFFF, logo_white) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h deleted file mode 100644 index 4e2fde6ab3..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h +++ /dev/null @@ -1,183 +0,0 @@ -/************ - * colors.h * - ************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2019 - Cocoa Press * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -namespace Theme { - #if ENABLED(TOUCH_UI_COCOA_THEME) - constexpr int accent_hue = 23; - - // Browns and Oranges - constexpr uint32_t accent_color_1 = hsl_to_rgb(12.8,0.597,0.263); // Darkest - constexpr uint32_t accent_color_2 = hsl_to_rgb(12.8,0.597,0.263); - constexpr uint32_t accent_color_3 = hsl_to_rgb( 9.6,0.664,0.443); - constexpr uint32_t accent_color_4 = hsl_to_rgb(16.3,0.873,0.537); - constexpr uint32_t accent_color_5 = hsl_to_rgb(23.0,0.889,0.539); - constexpr uint32_t accent_color_6 = hsl_to_rgb(23.0,0.889,0.539); // Lightest - #else - // Use linear accent colors - - #if ANY(TOUCH_UI_ROYAL_THEME, TOUCH_UI_FROZEN_THEME) - // Dark blue accent colors - constexpr int accent_hue = 216; - constexpr float accent_sat = 0.7; - #else - // Green accent colors - constexpr int accent_hue = 68; - constexpr float accent_sat = 0.68; - #endif - - // Shades of accent color - constexpr uint32_t accent_color_0 = hsl_to_rgb(accent_hue, accent_sat, 0.15); // Darkest - constexpr uint32_t accent_color_1 = hsl_to_rgb(accent_hue, accent_sat, 0.26); - constexpr uint32_t accent_color_2 = hsl_to_rgb(accent_hue, accent_sat, 0.39); - constexpr uint32_t accent_color_3 = hsl_to_rgb(accent_hue, accent_sat, 0.52); - constexpr uint32_t accent_color_4 = hsl_to_rgb(accent_hue, accent_sat, 0.65); - constexpr uint32_t accent_color_5 = hsl_to_rgb(accent_hue, accent_sat, 0.78); - constexpr uint32_t accent_color_6 = hsl_to_rgb(accent_hue, accent_sat, 0.91); // Lightest - #endif - - // Shades of gray - - constexpr float gray_sat = 0.14; - constexpr uint32_t gray_color_0 = hsl_to_rgb(accent_hue, gray_sat, 0.15); // Darkest - constexpr uint32_t gray_color_1 = hsl_to_rgb(accent_hue, gray_sat, 0.26); - constexpr uint32_t gray_color_2 = hsl_to_rgb(accent_hue, gray_sat, 0.39); - constexpr uint32_t gray_color_3 = hsl_to_rgb(accent_hue, gray_sat, 0.52); - constexpr uint32_t gray_color_4 = hsl_to_rgb(accent_hue, gray_sat, 0.65); - constexpr uint32_t gray_color_5 = hsl_to_rgb(accent_hue, gray_sat, 0.78); - constexpr uint32_t gray_color_6 = hsl_to_rgb(accent_hue, gray_sat, 0.91); // Lightest - - #if ENABLED(TOUCH_UI_ROYAL_THEME) - constexpr uint32_t theme_darkest = accent_color_1; - constexpr uint32_t theme_dark = accent_color_4; - - constexpr uint32_t bg_color = gray_color_0; - constexpr uint32_t axis_label = gray_color_1; - - constexpr uint32_t bg_text_enabled = accent_color_6; - constexpr uint32_t bg_text_disabled = gray_color_0; - constexpr uint32_t bg_normal = accent_color_4; - constexpr uint32_t fg_disabled = gray_color_0; - constexpr uint32_t fg_normal = accent_color_0; - constexpr uint32_t fg_action = accent_color_1; - - constexpr uint32_t logo_bg_rgb = accent_color_1; - constexpr uint32_t logo_fill_rgb = accent_color_0; - constexpr uint32_t logo_stroke_rgb = accent_color_4; - #elif ANY(TOUCH_UI_COCOA_THEME, TOUCH_UI_FROZEN_THEME) - constexpr uint32_t theme_darkest = accent_color_1; - constexpr uint32_t theme_dark = accent_color_4; - - constexpr uint32_t bg_color = 0xFFFFFF; - constexpr uint32_t axis_label = gray_color_5; - - constexpr uint32_t bg_text_enabled = accent_color_1; - constexpr uint32_t bg_text_disabled = gray_color_1; - constexpr uint32_t bg_normal = accent_color_4; - constexpr uint32_t fg_disabled = gray_color_6; - constexpr uint32_t fg_normal = accent_color_1; - constexpr uint32_t fg_action = accent_color_4; - - constexpr uint32_t logo_bg_rgb = accent_color_5; - constexpr uint32_t logo_fill_rgb = accent_color_6; - constexpr uint32_t logo_stroke_rgb = accent_color_2; - #else - constexpr uint32_t theme_darkest = gray_color_1; - constexpr uint32_t theme_dark = gray_color_2; - - constexpr uint32_t bg_color = gray_color_1; - constexpr uint32_t axis_label = gray_color_2; - - constexpr uint32_t bg_text_enabled = 0xFFFFFF; - constexpr uint32_t bg_text_disabled = gray_color_2; - constexpr uint32_t bg_normal = gray_color_1; - constexpr uint32_t fg_disabled = gray_color_1; - constexpr uint32_t fg_normal = gray_color_2; - constexpr uint32_t fg_action = accent_color_2; - - constexpr uint32_t logo_bg_rgb = accent_color_4; - constexpr uint32_t logo_fill_rgb = accent_color_3; - constexpr uint32_t logo_stroke_rgb = 0x000000; - #endif - - constexpr uint32_t shadow_rgb = gray_color_6; - constexpr uint32_t stroke_rgb = accent_color_1; - constexpr uint32_t fill_rgb = accent_color_3; - #if ENABLED(TOUCH_UI_COCOA_PRESS) - constexpr uint32_t syringe_rgb = 0xFFFFFF; - constexpr uint32_t fluid_rgb = accent_color_5; - #else - constexpr uint32_t syringe_rgb = accent_color_5; - constexpr uint32_t fluid_rgb = accent_color_3; - #endif - - #if ENABLED(TOUCH_UI_ROYAL_THEME) - constexpr uint32_t x_axis = hsl_to_rgb(0, 1.00, 0.26); - constexpr uint32_t y_axis = hsl_to_rgb(120, 1.00, 0.13); - constexpr uint32_t z_axis = hsl_to_rgb(240, 1.00, 0.10); - #else - constexpr uint32_t x_axis = hsl_to_rgb(0, 1.00, 0.5); - constexpr uint32_t y_axis = hsl_to_rgb(120, 1.00, 0.37); - constexpr uint32_t z_axis = hsl_to_rgb(240, 1.00, 0.37); - #endif - constexpr uint32_t e_axis = axis_label; - constexpr uint32_t feedrate = axis_label; - constexpr uint32_t other = axis_label; - - // Status screen - constexpr uint32_t progress = axis_label; - constexpr uint32_t status_msg = axis_label; - #if ENABLED(TOUCH_UI_ROYAL_THEME) - constexpr uint32_t fan_speed = hsl_to_rgb(240, 0.5, 0.13); - constexpr uint32_t temp = hsl_to_rgb(343, 1.0, 0.23); - #else - constexpr uint32_t fan_speed = hsl_to_rgb(204, 0.47, 0.41); - constexpr uint32_t temp = hsl_to_rgb(311, 0.51, 0.35); - #endif - - constexpr uint32_t disabled_icon = gray_color_1; - - // Calibration Registers Screen - constexpr uint32_t transformA = 0x3010D0; - constexpr uint32_t transformB = 0x4010D0; - constexpr uint32_t transformC = 0x5010D0; - constexpr uint32_t transformD = 0x6010D0; - constexpr uint32_t transformE = 0x7010D0; - constexpr uint32_t transformF = 0x8010D0; - constexpr uint32_t transformVal = 0x104010; - - constexpr btn_colors disabled_btn = {.bg = bg_color, .grad = fg_disabled, .fg = fg_disabled, .rgb = fg_disabled }; - constexpr btn_colors normal_btn = {.bg = fg_action, .grad = 0xFFFFFF, .fg = fg_normal, .rgb = 0xFFFFFF }; - constexpr btn_colors action_btn = {.bg = bg_color, .grad = 0xFFFFFF, .fg = fg_action, .rgb = 0xFFFFFF }; - constexpr btn_colors red_btn = {.bg = 0xFF5555, .grad = 0xFFFFFF, .fg = 0xFF0000, .rgb = 0xFFFFFF }; - constexpr btn_colors ui_slider = {.bg = theme_darkest, .grad = 0xFFFFFF, .fg = theme_dark, .rgb = accent_color_3 }; - constexpr btn_colors ui_toggle = {.bg = theme_darkest, .grad = 0xFFFFFF, .fg = theme_dark, .rgb = 0xFFFFFF }; - - // Temperature color scale - - const rgb_t cool_rgb ( 0, 0, 0); - const rgb_t low_rgb (128, 0, 0); - const rgb_t med_rgb (255, 128, 0); - const rgb_t high_rgb (255, 255, 128); -}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h deleted file mode 100644 index 63115b4187..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h +++ /dev/null @@ -1,80 +0,0 @@ -/*********** - * fonts.h * - ***********/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -namespace Theme { - #ifdef TOUCH_UI_800x480 - #ifdef TOUCH_UI_PORTRAIT - constexpr int16_t font_tiny = 26; - constexpr int16_t font_xsmall = 28; - constexpr int16_t font_small = 29; - constexpr int16_t font_medium = 30; - constexpr int16_t font_large = 30; - constexpr int16_t font_xlarge = 31; - #else - constexpr int16_t font_tiny = 27; - constexpr int16_t font_xsmall = 29; - constexpr int16_t font_small = 30; - constexpr int16_t font_medium = 30; - constexpr int16_t font_large = 31; - constexpr int16_t font_xlarge = 31; - #endif - constexpr float icon_scale = 1.0; - #elif defined(TOUCH_UI_480x272) - #ifdef TOUCH_UI_PORTRAIT - constexpr int16_t font_tiny = 26; - constexpr int16_t font_xsmall = 26; - constexpr int16_t font_small = 26; - constexpr int16_t font_medium = 27; - constexpr int16_t font_large = 28; - constexpr int16_t font_xlarge = 29; - constexpr float icon_scale = 0.7; - #else - constexpr int16_t font_tiny = 26; - constexpr int16_t font_xsmall = 26; - constexpr int16_t font_small = 27; - constexpr int16_t font_medium = 28; - constexpr int16_t font_large = 30; - constexpr int16_t font_xlarge = 31; - constexpr float icon_scale = 0.6; - #endif - #elif defined(TOUCH_UI_320x240) - #ifdef TOUCH_UI_PORTRAIT - constexpr int16_t font_tiny = 26; - constexpr int16_t font_xsmall = 26; - constexpr int16_t font_small = 26; - constexpr int16_t font_medium = 27; - constexpr int16_t font_large = 27; - constexpr int16_t font_xlarge = 28; - constexpr float icon_scale = 0.6; - #else - constexpr int16_t font_tiny = 26; - constexpr int16_t font_xsmall = 26; - constexpr int16_t font_small = 26; - constexpr int16_t font_medium = 27; - constexpr int16_t font_large = 29; - constexpr int16_t font_xlarge = 30; - constexpr float icon_scale = 0.5; - #endif - #endif -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h deleted file mode 100644 index eb9cadeba1..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h +++ /dev/null @@ -1,39 +0,0 @@ - -/**************************************************************************** - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/** - * This file was auto-generated using "svg2cpp.py" - * - * The encoding consists of x,y pairs with the min and max scaled to - * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the - * start of a new closed path. - */ - -#pragma once - -constexpr float x_min = 0.000000; -constexpr float x_max = 480.000000; -constexpr float y_min = 0.000000; -constexpr float y_max = 272.000000; - -const PROGMEM uint16_t logo_fill[] = {0x419D, 0x546F, 0x3D05, 0x5615, 0x3942, 0x5A92, 0x36B7, 0x6136, 0x35C8, 0x6950, 0x35C8, 0x96B0, 0x36B7, 0x9ECA, 0x3942, 0xA56E, 0x3D05, 0xA9EB, 0x419D, 0xAB91, 0xBE60, 0xAB91, 0xC2F8, 0xA9EB, 0xC6BB, 0xA56E, 0xC946, 0x9ECA, 0xCA35, 0x96B0, 0xCA32, 0x546C, 0x419D, 0x546F}; - -const PROGMEM uint16_t logo_stroke[] = {0xADF3, 0x546C, 0x419D, 0x546F, 0x3D05, 0x5615, 0x3942, 0x5A92, 0x36B7, 0x6136, 0x35C8, 0x6950, 0x35C8, 0x96B0, 0x36B7, 0x9ECA, 0x3942, 0xA56E, 0x3D05, 0xA9EB, 0x419D, 0xAB91, 0xBE60, 0xAB91, 0xC2F8, 0xA9EB, 0xC6BB, 0xA56E, 0xC946, 0x9ECA, 0xCA35, 0x96B0, 0xCA32, 0x546C, 0xADF3, 0x546C, 0xFFFF, 0x419D, 0x5913, 0xB08C, 0x5913, 0xC794, 0x8250, 0xC794, 0x96B0, 0xC6DA, 0x9CFF, 0xC4E1, 0xA229, 0xC1F4, 0xA5A5, 0xBE60, 0xA6ED, 0x419D, 0xA6ED, 0x3E09, 0xA5A5, 0x3B1C, 0xA229, 0x3923, 0x9CFF, 0x3869, 0x96B0, 0x3869, 0x6950, 0x3923, 0x6301, 0x3B1C, 0x5DD7, 0x3E09, 0x5A5B, 0x419D, 0x5913, 0xFFFF, 0xAC7A, 0x8620, 0xAC7A, 0x9373, 0xA767, 0x9373, 0xA767, 0x75CB, 0xA1C6, 0x75CB, 0xA1C6, 0x9373, 0xA1C6, 0x9C8E, 0xA767, 0x9C8E, 0xAC7A, 0x9C8E, 0xB21C, 0x9C8E, 0xB21C, 0x9373, 0xB21C, 0x85E7, 0xB350, 0x8093, 0xB65F, 0x7E86, 0xB9D5, 0x8165, 0xBA83, 0x85E7, 0xBA83, 0x9C8E, 0xBEFE, 0x9C8E, 0xC024, 0x99E1, 0xC024, 0x8620, 0xBF7B, 0x7F22, 0xBD8F, 0x79A9, 0xBA7E, 0x7617, 0xB65F, 0x74D0, 0xB24F, 0x7622, 0xAF30, 0x79C6, 0xAD2F, 0x7F43, 0xAC7A, 0x8620, 0xAC7A, 0x8620, 0xAC7A, 0x8620, 0xFFFF, 0x8179, 0x9C8E, 0x7CE9, 0x9C8E, 0x7747, 0x9C8E, 0x7747, 0x92EC, 0x7747, 0x8949, 0x75A2, 0x81A3, 0x71A6, 0x7E73, 0x6DAB, 0x818B, 0x6C05, 0x88FC, 0x6DAF, 0x9019, 0x71C7, 0x92EC, 0x7505, 0x92EC, 0x7505, 0x9C8E, 0x7118, 0x9C8E, 0x6CD3, 0x9B06, 0x696B, 0x96D6, 0x6729, 0x909E, 0x6658, 0x88FC, 0x672D, 0x8133, 0x6980, 0x7AC7, 0x6D13, 0x766C, 0x71A6, 0x74D0, 0x7632, 0x766D, 0x79C2, 0x7AD1, 0x7C14, 0x8153, 0x7CE9, 0x8949, 0x7CE9, 0x92EC, 0x8179, 0x92EC, 0x8179, 0x8620, 0x822E, 0x7F43, 0x842E, 0x79C6, 0x874E, 0x7622, 0x8B5E, 0x74D0, 0x8F7C, 0x7617, 0x928E, 0x79A9, 0x9479, 0x7F22, 0x9523, 0x8620, 0x9523, 0x87DB, 0x8F81, 0x87DB, 0x8F81, 0x85E7, 0x8ED4, 0x8165, 0x8B5E, 0x7E86, 0x884F, 0x8093, 0x871A, 0x85E7, 0x871A, 0x92EC, 0x871A, 0x9C8F, 0x8179, 0x9C8F, 0x8179, 0x9C8E, 0x8179, 0x9C8E, 0xFFFF, 0x6515, 0x79DB, 0x644C, 0x7281, 0x6218, 0x6C86, 0x5EB2, 0x6882, 0x5A56, 0x670A, 0x55D9, 0x68E0, 0x5272, 0x6DD0, 0x4F0B, 0x68E0, 0x4A8E, 0x670A, 0x4638, 0x6882, 0x42D5, 0x6C86, 0x40A2, 0x7281, 0x3FD9, 0x79DB, 0x3FD9, 0x9AC9, 0x40E4, 0x9C8E, 0x456F, 0x9C8E, 0x456F, 0x79B5, 0x46D4, 0x735D, 0x4A8E, 0x70C0, 0x4E3E, 0x735D, 0x4FA1, 0x79B5, 0x4FA1, 0x9C8E, 0x554D, 0x9C8E, 0x554D, 0x79B5, 0x56A7, 0x735D, 0x5A56, 0x70C0, 0x5E0C, 0x735D, 0x5F74, 0x79B5, 0x5F74, 0x9C8E, 0x6515, 0x9C8E, 0x6515, 0x79DB, 0x6515, 0x79DB, 0x6515, 0x79DB, 0xFFFF, 0x9672, 0x8C4C, 0x9714, 0x9379, 0x98F5, 0x98D2, 0x9C0B, 0x9BF4, 0xA04C, 0x9C7B, 0xA04C, 0x9373, 0x9D2B, 0x920C, 0x9C1E, 0x8C4C, 0x9C1E, 0x648E, 0x9672, 0x648E, 0x9672, 0x8C4C, 0x9672, 0x8C4C, 0x9672, 0x8C4C, 0xFFFF, 0xA767, 0x7194, 0xA767, 0x6C02, 0xA692, 0x687A, 0xA496, 0x670A, 0xA291, 0x687A, 0xA1BB, 0x6C02, 0xA1BB, 0x7194, 0xA767, 0x7194, 0xA767, 0x7194, 0xA767, 0x7194}; - -#define LOGO_BACKGROUND logo_bg_rgb -#define LOGO_PAINT_PATHS \ - LOGO_PAINT_PATH(logo_fill_rgb, logo_fill) \ - LOGO_PAINT_PATH(logo_stroke_rgb, logo_stroke) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h deleted file mode 100644 index dd5088e0ce..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h +++ /dev/null @@ -1,39 +0,0 @@ - -/**************************************************************************** - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/** - * This file was auto-generated using "svg2cpp.py" - * - * The encoding consists of x,y pairs with the min and max scaled to - * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the - * start of a new closed path. - */ - -#pragma once - -constexpr float x_min = 0.000000; -constexpr float x_max = 272.000000; -constexpr float y_min = 0.000000; -constexpr float y_max = 480.000000; - -const PROGMEM uint16_t logo_fill[] = {0x3C19, 0x70C5, 0x371A, 0x7159, 0x3302, 0x72EA, 0x303D, 0x753C, 0x2F39, 0x7811, 0x2F39, 0x87ED, 0x303D, 0x8AC2, 0x3302, 0x8D14, 0x371A, 0x8EA5, 0x3C19, 0x8F39, 0xC3E4, 0x8F39, 0xC8E3, 0x8EA5, 0xCCFB, 0x8D14, 0xCFC0, 0x8AC2, 0xD0C4, 0x87ED, 0xD0C0, 0x70C4, 0x3C19, 0x70C5}; - -const PROGMEM uint16_t logo_stroke[] = {0x3C19, 0x70C5, 0x371A, 0x7159, 0x3302, 0x72EA, 0x303D, 0x753C, 0x2F39, 0x7811, 0x2F39, 0x87ED, 0x303D, 0x8AC2, 0x3302, 0x8D14, 0x371A, 0x8EA5, 0x3C19, 0x8F39, 0xC3E4, 0x8F39, 0xC8E3, 0x8EA5, 0xCCFB, 0x8D14, 0xCFC0, 0x8AC2, 0xD0C4, 0x87ED, 0xD0C0, 0x70C4, 0x3C19, 0x70C5, 0xFFFF, 0x3C19, 0x7264, 0xB4D6, 0x7264, 0xCDE7, 0x80CE, 0xCDE7, 0x87ED, 0xCD1D, 0x8A21, 0xCAF7, 0x8BEF, 0xC7C8, 0x8D27, 0xC3E4, 0x8D9A, 0x3C19, 0x8D9A, 0x3835, 0x8D27, 0x3506, 0x8BEF, 0x32E0, 0x8A21, 0x3216, 0x87ED, 0x3216, 0x7811, 0x32E0, 0x75DD, 0x3506, 0x740F, 0x3835, 0x72D7, 0x3C19, 0x7264, 0xFFFF, 0xB069, 0x8223, 0xB069, 0x86CB, 0xAAE2, 0x86CB, 0xAAE2, 0x7C6E, 0xA4C2, 0x7C6E, 0xA4C2, 0x86CB, 0xA4C2, 0x89FA, 0xAAE2, 0x89FA, 0xB069, 0x89FA, 0xB689, 0x89FA, 0xB689, 0x86CB, 0xB689, 0x820F, 0xB7D9, 0x8033, 0xBB2E, 0x7F7B, 0xBEF2, 0x807C, 0xBFAE, 0x820F, 0xBFAE, 0x89FA, 0xC48F, 0x89FA, 0xC5CF, 0x890A, 0xC5CF, 0x8223, 0xC517, 0x7FB2, 0xC300, 0x7DC8, 0xBFA9, 0x7C88, 0xBB2E, 0x7C16, 0xB6C1, 0x7C8C, 0xB35B, 0x7DD2, 0xB12D, 0x7FBD, 0xB069, 0x8223, 0xB069, 0x8223, 0xB069, 0x8223, 0xFFFF, 0x819B, 0x89FA, 0x7CA3, 0x89FA, 0x7682, 0x89FA, 0x7682, 0x869C, 0x7682, 0x833E, 0x74B7, 0x8092, 0x7062, 0x7F74, 0x6C0C, 0x8089, 0x6A41, 0x8323, 0x6C10, 0x859F, 0x7085, 0x869C, 0x740C, 0x869C, 0x740C, 0x89FA, 0x6FC7, 0x89FA, 0x6B21, 0x8971, 0x676C, 0x87FA, 0x64F8, 0x85CE, 0x6414, 0x8323, 0x64FC, 0x806A, 0x6784, 0x7E2C, 0x6B67, 0x7CA6, 0x7062, 0x7C16, 0x7555, 0x7CA6, 0x7935, 0x7E2F, 0x7BBC, 0x8076, 0x7CA3, 0x833E, 0x7CA3, 0x869C, 0x819A, 0x869C, 0x819A, 0x8223, 0x825F, 0x7FBD, 0x848D, 0x7DD2, 0x87F3, 0x7C8C, 0x8C60, 0x7C16, 0x90DB, 0x7C88, 0x9432, 0x7DC8, 0x9648, 0x7FB2, 0x9701, 0x8223, 0x9701, 0x82BE, 0x90E0, 0x82BE, 0x90E0, 0x820F, 0x9024, 0x807C, 0x8C60, 0x7F7B, 0x890B, 0x8033, 0x87BB, 0x820F, 0x87BB, 0x869C, 0x87BB, 0x89FA, 0x819B, 0x89FA, 0x819B, 0x89FA, 0x819B, 0x89FA, 0xFFFF, 0x62B5, 0x7DD9, 0x61DA, 0x7B47, 0x5F73, 0x7931, 0x5BC1, 0x77C9, 0x5702, 0x7746, 0x521F, 0x77EA, 0x4E6B, 0x79A4, 0x4AB8, 0x77EA, 0x45D5, 0x7746, 0x411D, 0x77C9, 0x3D6E, 0x7931, 0x3B09, 0x7B47, 0x3A2E, 0x7DD9, 0x3A2E, 0x895C, 0x3B51, 0x89FA, 0x4043, 0x89FA, 0x4043, 0x7DCC, 0x41C6, 0x7B95, 0x45D5, 0x7AAB, 0x49D9, 0x7B95, 0x4B5B, 0x7DCC, 0x4B5B, 0x89FA, 0x5188, 0x89FA, 0x5188, 0x7DCC, 0x52FF, 0x7B95, 0x5702, 0x7AAB, 0x5B0C, 0x7B95, 0x5C94, 0x7DCC, 0x5C94, 0x89FA, 0x62B5, 0x89FA, 0x62B5, 0x7DD9, 0x62B5, 0x7DD9, 0x62B5, 0x7DD9, 0xFFFF, 0x986E, 0x844B, 0x991E, 0x86CD, 0x9B2A, 0x88AC, 0x9E85, 0x89C4, 0xA327, 0x89F3, 0xA327, 0x86CB, 0x9FBF, 0x864E, 0x9E9A, 0x844B, 0x9E9A, 0x7668, 0x986E, 0x7668, 0x986E, 0x844B, 0x986E, 0x844B, 0x986E, 0x844B, 0xFFFF, 0xAAE2, 0x7AF5, 0xAAE2, 0x7902, 0xA9FB, 0x77C7, 0xA7D2, 0x7746, 0xA59F, 0x77C7, 0xA4B6, 0x7902, 0xA4B6, 0x7AF5, 0xAAE2, 0x7AF5, 0xAAE2, 0x7AF5, 0xAAE2, 0x7AF5}; - -#define LOGO_BACKGROUND logo_bg_rgb -#define LOGO_PAINT_PATHS \ - LOGO_PAINT_PATH(logo_fill_rgb, logo_fill) \ - LOGO_PAINT_PATH(logo_stroke_rgb, logo_stroke) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp deleted file mode 100644 index f4a80bcc09..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp +++ /dev/null @@ -1,410 +0,0 @@ -/************** - * sounds.cpp * - **************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../compat.h" - -#if ENABLED(TOUCH_UI_FTDI_EVE) - -#include "../ftdi_eve_lib/ftdi_eve_lib.h" - -#include "sounds.h" - -namespace Theme { - using namespace FTDI; - - const PROGMEM SoundPlayer::sound_t chimes[] = { - {CHIMES, NOTE_G3, 5}, - {CHIMES, NOTE_E4, 5}, - {CHIMES, NOTE_C4, 5}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t sad_trombone[] = { - {TRUMPET, NOTE_A3S, 10}, - {TRUMPET, NOTE_A3 , 10}, - {TRUMPET, NOTE_G3S, 10}, - {TRUMPET, NOTE_G3, 20}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t twinkle[] = { - {GLOCKENSPIEL, NOTE_C4, 1}, - {GLOCKENSPIEL, NOTE_E4, 1}, - {GLOCKENSPIEL, NOTE_G4, 16}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t fanfare[] = { - {TRUMPET, NOTE_A3, 4}, - {SILENCE, REST, 1}, - {TRUMPET, NOTE_A3, 2}, - {SILENCE, REST, 1}, - {TRUMPET, NOTE_A3, 2}, - {SILENCE, REST, 1}, - {TRUMPET, NOTE_E4, 10}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t media_inserted[] = { - {MUSIC_BOX, NOTE_C4, 2}, - {MUSIC_BOX, NOTE_E4, 2}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t media_removed[] = { - {MUSIC_BOX, NOTE_E4, 2}, - {MUSIC_BOX, NOTE_C4, 2}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t js_bach_toccata[] = { - {ORGAN, NOTE_A4, 2}, - {ORGAN, NOTE_G4, 2}, - {ORGAN, NOTE_A4, 35}, - {SILENCE, REST, 12}, - {ORGAN, NOTE_G4, 4}, - {ORGAN, NOTE_F4, 4}, - {ORGAN, NOTE_E4, 4}, - {ORGAN, NOTE_D4, 4}, - {ORGAN, NOTE_C4S, 16}, - {ORGAN, NOTE_D4, 32}, - {SILENCE, REST, 42}, - - {ORGAN, NOTE_A3, 2}, - {ORGAN, NOTE_G3, 2}, - {ORGAN, NOTE_A3, 35}, - {SILENCE, REST, 9}, - {ORGAN, NOTE_E3, 8}, - {ORGAN, NOTE_F3, 8}, - {ORGAN, NOTE_C3S, 16}, - {ORGAN, NOTE_D3, 27}, - {SILENCE, REST, 42}, - - {ORGAN, NOTE_A2, 2}, - {ORGAN, NOTE_G2, 2}, - {ORGAN, NOTE_A2, 35}, - {SILENCE, REST, 12}, - {ORGAN, NOTE_G2, 4}, - {ORGAN, NOTE_F2, 4}, - {ORGAN, NOTE_E2, 4}, - {ORGAN, NOTE_D2, 4}, - {ORGAN, NOTE_C2S, 16}, - {ORGAN, NOTE_D2, 32}, - {SILENCE, REST, 52}, - - //{ORGAN, NOTE_D1, 28}, - {ORGAN, NOTE_C3S, 9}, - {ORGAN, NOTE_E3, 9}, - {ORGAN, NOTE_G3, 9}, - {ORGAN, NOTE_A3S, 9}, - {ORGAN, NOTE_C4S, 9}, - {ORGAN, NOTE_E4, 9}, - {ORGAN, NOTE_D4, 20}, - {SILENCE, REST, 30}, - - {ORGAN, NOTE_C4S, 4}, - {ORGAN, NOTE_D4, 2}, - {ORGAN, NOTE_E4, 2}, - - {ORGAN, NOTE_C4S, 2}, - {ORGAN, NOTE_D4, 2}, - {ORGAN, NOTE_E4, 2}, - - {ORGAN, NOTE_C4S, 2}, - {ORGAN, NOTE_D4, 2}, - {ORGAN, NOTE_E4, 2}, - - {ORGAN, NOTE_C4S, 2}, - {ORGAN, NOTE_D4, 4}, - {ORGAN, NOTE_E4, 4}, - {ORGAN, NOTE_F4, 2}, - {ORGAN, NOTE_G4, 2}, - - {ORGAN, NOTE_E4, 2}, - {ORGAN, NOTE_F4, 2}, - {ORGAN, NOTE_G4, 2}, - - {ORGAN, NOTE_E4, 2}, - {ORGAN, NOTE_F4, 2}, - {ORGAN, NOTE_G4, 2}, - - {ORGAN, NOTE_E4, 2}, - {ORGAN, NOTE_F4, 4}, - {ORGAN, NOTE_G4, 4}, - {ORGAN, NOTE_A4, 2}, - {ORGAN, NOTE_A4S, 2}, - - {ORGAN, NOTE_G4, 2}, - {ORGAN, NOTE_A4, 2}, - {ORGAN, NOTE_A4S, 2}, - - {ORGAN, NOTE_G4, 2}, - {ORGAN, NOTE_A4, 2}, - {ORGAN, NOTE_A4S, 2}, - - {ORGAN, NOTE_G4, 2}, - {ORGAN, NOTE_A4, 4}, - {SILENCE, REST, 36}, - - - {ORGAN, NOTE_C5S, 4}, - {ORGAN, NOTE_D5, 2}, - {ORGAN, NOTE_E5, 2}, - - {ORGAN, NOTE_C5S, 2}, - {ORGAN, NOTE_D5, 2}, - {ORGAN, NOTE_E5, 2}, - - {ORGAN, NOTE_C5S, 2}, - {ORGAN, NOTE_D5, 2}, - {ORGAN, NOTE_E5, 2}, - - {ORGAN, NOTE_C5S, 2}, - {ORGAN, NOTE_D5, 4}, - {ORGAN, NOTE_E5, 4}, - {ORGAN, NOTE_F5, 2}, - {ORGAN, NOTE_G5, 2}, - - {ORGAN, NOTE_E5, 2}, - {ORGAN, NOTE_F5, 2}, - {ORGAN, NOTE_G5, 2}, - - {ORGAN, NOTE_E5, 2}, - {ORGAN, NOTE_F5, 2}, - {ORGAN, NOTE_G5, 2}, - - {ORGAN, NOTE_E5, 2}, - {ORGAN, NOTE_F5, 4}, - {ORGAN, NOTE_G5, 4}, - {ORGAN, NOTE_A5, 2}, - {ORGAN, NOTE_A5S, 2}, - - {ORGAN, NOTE_G5, 2}, - {ORGAN, NOTE_A5, 2}, - {ORGAN, NOTE_A5S, 2}, - - {ORGAN, NOTE_G5, 2}, - {ORGAN, NOTE_A5, 2}, - {ORGAN, NOTE_A5S, 2}, - - {ORGAN, NOTE_G5, 2}, - {ORGAN, NOTE_A5, 4}, - {SILENCE, REST, 32}, - - {ORGAN, NOTE_A5, 4}, - {ORGAN, NOTE_G5, 2}, - {ORGAN, NOTE_A5S, 2}, - - {ORGAN, NOTE_E5, 2}, - {ORGAN, NOTE_G5, 2}, - {ORGAN, NOTE_A5S, 2}, - - {ORGAN, NOTE_E5, 2}, - {ORGAN, NOTE_F5, 2}, - {ORGAN, NOTE_A5, 2}, - - {ORGAN, NOTE_D5, 2}, - {ORGAN, NOTE_F5, 2}, - {ORGAN, NOTE_G5, 2}, - - {ORGAN, NOTE_D5, 2}, - {ORGAN, NOTE_E5, 2}, - {ORGAN, NOTE_A5, 2}, - - {ORGAN, NOTE_C5, 2}, - {ORGAN, NOTE_E5, 2}, - {ORGAN, NOTE_A5, 2}, - - {ORGAN, NOTE_C5, 2}, - {ORGAN, NOTE_D5, 2}, - {ORGAN, NOTE_F5, 2}, - - {ORGAN, NOTE_A4S, 2}, - {ORGAN, NOTE_D5, 2}, - {ORGAN, NOTE_E5, 2}, - - {ORGAN, NOTE_A4S, 2}, - {ORGAN, NOTE_C5, 2}, - {ORGAN, NOTE_E5, 2}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t js_bach_joy[] = { - {PIANO, NOTE_G3, 4}, - {PIANO, NOTE_A3, 4}, - {PIANO, NOTE_B3, 4}, - {PIANO, NOTE_D4, 3}, - {SILENCE, REST, 1}, - - {PIANO, NOTE_C4, 3}, - {SILENCE, REST, 1}, - {PIANO, NOTE_C4, 4}, - {PIANO, NOTE_E4, 3}, - {SILENCE, REST, 1}, - {PIANO, NOTE_D4, 2}, - {SILENCE, REST, 2}, - - {PIANO, NOTE_D4, 4}, - {PIANO, NOTE_G4 , 3}, - {SILENCE, REST, 1}, - {PIANO, NOTE_F4S, 4}, - {PIANO, NOTE_G4, 4}, - - {PIANO, NOTE_D4, 2}, - {SILENCE, REST, 2}, - {PIANO, NOTE_B3, 3}, - {SILENCE, REST, 1}, - {PIANO, NOTE_G3, 4}, - {PIANO, NOTE_A3, 2}, - {SILENCE, REST, 2}, - - {PIANO, NOTE_B3, 2}, - {SILENCE, REST, 2}, - {PIANO, NOTE_C4, 4}, - {PIANO, NOTE_D4, 2}, - {SILENCE, REST, 2}, - {PIANO, NOTE_E4, 2}, - {SILENCE, REST, 2}, - - {PIANO, NOTE_D4, 4}, - {PIANO, NOTE_C4, 2}, - {SILENCE, REST, 2}, - {PIANO, NOTE_B3, 2}, - {SILENCE, REST, 2}, - {PIANO, NOTE_A3, 4}, - - {PIANO, NOTE_B3, 2}, - {SILENCE, REST, 2}, - {PIANO, NOTE_G3, 2}, - {SILENCE, REST, 2}, - {PIANO, NOTE_G3, 8}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t big_band[] = { - {XYLOPHONE, NOTE_F4, 3}, - {XYLOPHONE, NOTE_G4, 3}, - {XYLOPHONE, NOTE_F4, 3}, - {XYLOPHONE, NOTE_D4, 3}, - {XYLOPHONE, NOTE_A3S, 3}, - {SILENCE, REST, 3}, - - {TRUMPET, NOTE_F4, 3}, - {TRUMPET, NOTE_G4, 3}, - {TRUMPET, NOTE_F4, 3}, - {TRUMPET, NOTE_D4, 3}, - {TRUMPET, NOTE_A3S, 3}, - {SILENCE, REST, 3}, - - {TUBA, NOTE_A2S, 6}, - {TUBA, NOTE_A2S, 6}, - {TUBA, NOTE_A2S, 4}, - {TUBA, NOTE_A2S, 6}, - {TUBA, NOTE_A2S, 6}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t beats[] = { - {SILENCE, REST, 8}, - {NOTCH, NOTE_C4, 8}, - {KICKDRUM, NOTE_C4, 8}, - {HIHAT, NOTE_C4, 8}, - {COWBELL, NOTE_C4, 8}, - {SILENCE, REST, 8}, - {NOTCH, NOTE_C4, 8}, - {KICKDRUM, NOTE_C4, 8}, - {HIHAT, NOTE_C4, 8}, - {COWBELL, NOTE_C4, 8}, - {SILENCE, REST, 8}, - {NOTCH, NOTE_C4, 8}, - {KICKDRUM, NOTE_C4, 8}, - {HIHAT, NOTE_C4, 8}, - {COWBELL, NOTE_C4, 8}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t beeping[] = { - {BEEPING, NOTE_C4, 64}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t alarm[] = { - {ALARM, NOTE_C4, 64}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t warble[] = { - {WARBLE, NOTE_C4, 64}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t carousel[] = { - {CAROUSEL, NOTE_C4, 64}, - {SILENCE, END_SONG, 0} - }; - - const PROGMEM SoundPlayer::sound_t all_instruments[] = { - {HARP}, - {XYLOPHONE}, - {TUBA}, - {GLOCKENSPIEL}, - {ORGAN}, - {TRUMPET}, - {PIANO}, - {CHIMES}, - {MUSIC_BOX}, - {BELL}, - {CLICK}, - {SWITCH}, - {COWBELL}, - {NOTCH}, - {HIHAT}, - {KICKDRUM}, - {SWITCH}, - {POP}, - {CLACK}, - {CHACK}, - {SILENCE, END_SONG, 0} - }; -}; // namespace Theme - -#define N_ELEMENTS(a) (sizeof(a)/sizeof(a[0])) - -const SoundList::list_t SoundList::list[] = { - {"Silence", FTDI::silence}, - {"Twinkle", Theme::twinkle}, - {"Chimes", Theme::chimes}, - {"Fanfare", Theme::fanfare}, - {"Sad Trombone", Theme::sad_trombone}, - {"Big Band", Theme::big_band}, - {"Beeping", Theme::beeping}, - {"Alarm", Theme::alarm}, - {"Warble", Theme::warble}, - {"Carousel", Theme::carousel}, - {"Beats", Theme::beats}, - {"Bach Joy", Theme::js_bach_joy}, - {"Bach Toccata", Theme::js_bach_toccata} -}; - -const uint8_t SoundList::n = N_ELEMENTS(SoundList::list); - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h deleted file mode 100644 index b2b8890386..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h +++ /dev/null @@ -1,43 +0,0 @@ -/************ - * sounds.h * - ************/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -namespace Theme { - using namespace FTDI; - - extern const PROGMEM SoundPlayer::sound_t chimes[]; - extern const PROGMEM SoundPlayer::sound_t sad_trombone[]; - extern const PROGMEM SoundPlayer::sound_t twinkle[]; - extern const PROGMEM SoundPlayer::sound_t fanfare[]; - extern const PROGMEM SoundPlayer::sound_t media_inserted[]; - extern const PROGMEM SoundPlayer::sound_t media_removed[]; - extern const PROGMEM SoundPlayer::sound_t js_bach_toccata[]; - extern const PROGMEM SoundPlayer::sound_t js_bach_joy[]; - extern const PROGMEM SoundPlayer::sound_t big_band[]; - extern const PROGMEM SoundPlayer::sound_t beats[]; - extern const PROGMEM SoundPlayer::sound_t beeping[]; - extern const PROGMEM SoundPlayer::sound_t alarm[]; - extern const PROGMEM SoundPlayer::sound_t warble[]; - extern const PROGMEM SoundPlayer::sound_t carousel[]; - extern const PROGMEM SoundPlayer::sound_t all_instruments[]; -}; // namespace Theme diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h deleted file mode 100644 index df7782ce87..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h +++ /dev/null @@ -1,28 +0,0 @@ -/*********** - * theme.h * - ***********/ - -/**************************************************************************** - * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -#include "bitmaps.h" -#include "colors.h" -#include "fonts.h" -#include "sounds.h" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp deleted file mode 100644 index 3f57124451..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../../inc/MarlinConfig.h" -#include "SPIFlashStorage.h" - -extern W25QXXFlash W25QXX; - -uint8_t SPIFlashStorage::m_pageData[SPI_FLASH_PageSize]; -uint32_t SPIFlashStorage::m_currentPage; -uint16_t SPIFlashStorage::m_pageDataUsed; -uint32_t SPIFlashStorage::m_startAddress; - -#if HAS_SPI_FLASH_COMPRESSION - - uint8_t SPIFlashStorage::m_compressedData[SPI_FLASH_PageSize]; - uint16_t SPIFlashStorage::m_compressedDataUsed; - - template - static uint32_t rle_compress(T *output, uint32_t outputLength, T *input, uint32_t inputLength, uint32_t& inputProcessed) { - uint32_t count = 0, out = 0, index, i; - T pixel; - //32767 for uint16_t - //127 for uint16_t - //calculated at compile time - constexpr T max = (0xFFFFFFFF >> (8 * (4 - sizeof(T)))) / 2; - - inputProcessed = 0; - while (count < inputLength && out < outputLength) { - index = count; - pixel = input[index++]; - while (index < inputLength && index - count < max && input[index] == pixel) - index++; - if (index - count == 1) { - /* - * Failed to "replicate" the current pixel. See how many to copy. - * Avoid a replicate run of only 2-pixels after a literal run. There - * is no gain in this, and there is a risK of loss if the run after - * the two identical pixels is another literal run. So search for - * 3 identical pixels. - */ - while (index < inputLength && index - count < max && (input[index] != input[index - 1] || (index > 1 && input[index] != input[index - 2]))) - index++; - /* - * Check why this run stopped. If it found two identical pixels, reset - * the index so we can add a run. Do this twice: the previous run - * tried to detect a replicate run of at least 3 pixels. So we may be - * able to back up two pixels if such a replicate run was found. - */ - while (index < inputLength && input[index] == input[index - 1]) - index--; - // If the output buffer could overflow, stop at the remaining bytes - NOMORE(index, count + outputLength - out - 1); - output[out++] = (uint16_t)(count - index); - for (i = count; i < index; i++) - output[out++] = input[i]; - } - else { - // Need at least more 2 spaces - if (out > outputLength - 2) break; - output[out++] = (uint16_t)(index - count); - output[out++] = pixel; - } - count = index; - } - inputProcessed = count; - - // Padding - if (out == outputLength - 1) output[out++] = 0; - - return out; - } - - template - static uint32_t rle_uncompress(UT *output, uint32_t outputLength, UT *input, uint32_t inputLength, uint32_t &outputFilled) { - T count; - UT i; - uint32_t processedBytes = 0; - outputFilled = 0; - - while (outputLength > 0 && inputLength > 0) { - processedBytes++; - count = static_cast(*input++); - inputLength--; - if (count > 0) { // Replicate run - for (i = 0; i < count && outputLength > i; i++) - output[i] = *input; - outputFilled += i; - // If copy incomplete, change the input buffer to start with remaining data in the next call - if (i < count) { - // Change to process the difference in the next call - *(input - 1) = static_cast(count - i); - return processedBytes - 1; - } - input++; - inputLength--; - processedBytes++; - } - else if (count < 0) { // literal run - count = static_cast(-count); - // Copy, validating if the output have enough space - for (i = 0; i < count && outputLength > i; i++) - output[i] = input[i]; - outputFilled += i; - // If copy incomplete, change the input buffer to start with remaining data in the next call - if (i < count) { - input[i - 1] = static_cast((count - i) * -1); - // Back one - return processedBytes + i - 1; - } - input += count; - inputLength -= count; - processedBytes += count; - } - output += count; - outputLength -= count; - } - - return processedBytes; - } - -#endif // HAS_SPI_FLASH_COMPRESSION - -void SPIFlashStorage::beginWrite(uint32_t startAddress) { - m_pageDataUsed = 0; - m_currentPage = 0; - m_startAddress = startAddress; - #if HAS_SPI_FLASH_COMPRESSION - // Restart the compressed buffer, keep the pointers of the uncompressed buffer - m_compressedDataUsed = 0; - #endif -} - - -void SPIFlashStorage::endWrite() { - // Flush remaining data - #if HAS_SPI_FLASH_COMPRESSION - if (m_compressedDataUsed > 0) { - flushPage(); - savePage(m_compressedData); - } - #else - if (m_pageDataUsed > 0) flushPage(); - #endif -} - -void SPIFlashStorage::savePage(uint8_t* buffer) { - W25QXX.SPI_FLASH_BufferWrite(buffer, m_startAddress + (SPI_FLASH_PageSize * m_currentPage), SPI_FLASH_PageSize); - - // Test env - // char fname[256]; - // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); - // FILE *fp = fopen(fname, "wb"); - // fwrite(buffer, 1, m_compressedDataUsed, fp); - // fclose(fp); -} - -void SPIFlashStorage::loadPage(uint8_t* buffer) { - W25QXX.SPI_FLASH_BufferRead(buffer, m_startAddress + (SPI_FLASH_PageSize * m_currentPage), SPI_FLASH_PageSize); - - // Test env - // char fname[256]; - // memset(buffer, 0, SPI_FLASH_PageSize); - // snprintf(fname, sizeof(fname), "./pages/page-%03d.data", m_currentPage); - // FILE *fp = fopen(fname, "rb"); - // if (fp != NULL) { - // fread(buffer, 1, SPI_FLASH_PageSize, fp); - // fclose(fp); - // } -} - -void SPIFlashStorage::flushPage() { - #if HAS_SPI_FLASH_COMPRESSION - // Work com with compressed in memory - uint32_t inputProcessed; - uint32_t compressedSize = rle_compress((uint16_t *)(m_compressedData + m_compressedDataUsed), compressedDataFree() / 2, (uint16_t *)m_pageData, m_pageDataUsed / 2, inputProcessed) * 2; - inputProcessed *= 2; - m_compressedDataUsed += compressedSize; - - // Space remaining in the compressed buffer? - if (compressedDataFree() > 0) { - // Free the uncompressed buffer - m_pageDataUsed = 0; - return; - } - - // Part of the m_pageData was compressed, so ajust the pointers, freeing what was processed, shift the buffer - // TODO: To avoid this copy, use a circular buffer - memmove(m_pageData, m_pageData + inputProcessed, m_pageDataUsed - inputProcessed); - m_pageDataUsed -= inputProcessed; - - // No? So flush page with compressed data!! - uint8_t *buffer = m_compressedData; - #else - uint8_t *buffer = m_pageData; - #endif - - savePage(buffer); - - #if HAS_SPI_FLASH_COMPRESSION - // Restart the compressed buffer, keep the pointers of the uncompressed buffer - m_compressedDataUsed = 0; - #else - m_pageDataUsed = 0; - #endif - m_currentPage++; -} - -void SPIFlashStorage::readPage() { - #if HAS_SPI_FLASH_COMPRESSION - if (compressedDataFree() == 0) { - loadPage(m_compressedData); - m_currentPage++; - m_compressedDataUsed = 0; - } - - // Need to uncompress data - if (pageDataFree() == 0) { - m_pageDataUsed = 0; - uint32_t outpuProcessed = 0; - uint32_t inputProcessed = rle_uncompress((uint16_t *)(m_pageData + m_pageDataUsed), pageDataFree() / 2, (uint16_t *)(m_compressedData + m_compressedDataUsed), compressedDataFree() / 2, outpuProcessed); - inputProcessed *= 2; - outpuProcessed *= 2; - if (outpuProcessed < pageDataFree()) { - m_pageDataUsed = SPI_FLASH_PageSize - outpuProcessed; - // TODO: To avoid this copy, use a circular buffer - memmove(m_pageData + m_pageDataUsed, m_pageData, outpuProcessed); - } - - m_compressedDataUsed += inputProcessed; - } - #else - loadPage(m_pageData); - m_pageDataUsed = 0; - m_currentPage++; - #endif -} - -uint16_t SPIFlashStorage::inData(uint8_t* data, uint16_t size) { - // Don't write more than we can - NOMORE(size, pageDataFree()); - memcpy(m_pageData + m_pageDataUsed, data, size); - m_pageDataUsed += size; - return size; -} - -void SPIFlashStorage::writeData(uint8_t* data, uint16_t size) { - // Flush a page if needed - if (pageDataFree() == 0) flushPage(); - - while (size > 0) { - uint16_t written = inData(data, size); - size -= written; - // Need to write more? Flush page and continue! - if (size > 0) { - flushPage(); - data += written; - } - } -} - -void SPIFlashStorage::beginRead(uint32_t startAddress) { - m_startAddress = startAddress; - m_currentPage = 0; - // Nothing in memory now - m_pageDataUsed = SPI_FLASH_PageSize; - #if HAS_SPI_FLASH_COMPRESSION - m_compressedDataUsed = sizeof(m_compressedData); - #endif -} - -uint16_t SPIFlashStorage::outData(uint8_t* data, uint16_t size) { - // Don't read more than we have - NOMORE(size, pageDataFree()); - memcpy(data, m_pageData + m_pageDataUsed, size); - m_pageDataUsed += size; - return size; -} - -void SPIFlashStorage::readData(uint8_t* data, uint16_t size) { - // Read a page if needed - if (pageDataFree() == 0) readPage(); - - while (size > 0) { - uint16_t read = outData(data, size); - size -= read; - // Need to write more? Flush page and continue! - if (size > 0) { - readPage(); - data += read; - } - } -} - -SPIFlashStorage SPIFlash; - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h deleted file mode 100644 index 98c8067bd3..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../../libs/W25Qxx.h" - -#define HAS_SPI_FLASH_COMPRESSION 1 - -/** - * This class manages and optimizes SPI Flash data storage, - * keeping an internal buffer to write and save full SPI flash - * pages as needed. - * - * Since the data is always in the buffer, the class is also - * able to support fast on-the-fly RLE compression/decompression. - * - * In testing with the current LVGL_UI it compacts 2.9MB of icons - * (which have lots of runs) down to 370kB!!! As a result the UI - * refresh rate becomes faster and now all LVGL UI can fit into a - * tiny 2MB SPI Flash, such as the Chitu Board. - * - * == Usage == - * - * Writing: - * - * The class keeps an internal buffer that caches data until it - * fits into a full SPI Flash page. Each time the buffer fills up - * the page is saved to SPI Flash. Sequential writes are optimal. - * - * SPIFlashStorage.beginWrite(myStartAddress); - * while (there is data to write) - * SPIFlashStorage.addData(myBuffer, bufferSize); - * SPIFlashStorage.endWrite(); // Flush remaining buffer data - * - * Reading: - * - * When reading, it loads a full page from SPI Flash at once and - * keeps it in a private SRAM buffer. Data is loaded as needed to - * fullfill requests. Sequential reads are optimal. - * - * SPIFlashStorage.beginRead(myStartAddress); - * while (there is data to read) - * SPIFlashStorage.readData(myBuffer, bufferSize); - * - * Compression: - * - * The biggest advantage of this class is the RLE compression. - * With compression activated a second buffer holds the compressed - * data, so when writing data, as this buffer becomes full it is - * flushed to SPI Flash. - * - * The same goes for reading: A compressed page is read from SPI - * flash, and the data is uncompressed as needed to provide the - * requested amount of data. - */ -class SPIFlashStorage { -public: - // Write operation - static void beginWrite(uint32_t startAddress); - static void endWrite(); - static void writeData(uint8_t* data, uint16_t size); - - // Read operation - static void beginRead(uint32_t startAddress); - static void readData(uint8_t* data, uint16_t size); - - static uint32_t getCurrentPage() { return m_currentPage; } - -private: - static void flushPage(); - static void savePage(uint8_t* buffer); - static void loadPage(uint8_t* buffer); - static void readPage(); - static uint16_t inData(uint8_t* data, uint16_t size); - static uint16_t outData(uint8_t* data, uint16_t size); - - static uint8_t m_pageData[SPI_FLASH_PageSize]; - static uint32_t m_currentPage; - static uint16_t m_pageDataUsed; - static inline uint16_t pageDataFree() { return SPI_FLASH_PageSize - m_pageDataUsed; } - static uint32_t m_startAddress; - #if HAS_SPI_FLASH_COMPRESSION - static uint8_t m_compressedData[SPI_FLASH_PageSize]; - static uint16_t m_compressedDataUsed; - static inline uint16_t compressedDataFree() { return SPI_FLASH_PageSize - m_compressedDataUsed; } - #endif -}; - -extern SPIFlashStorage SPIFlash; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp deleted file mode 100644 index 394ce48075..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "SPI_TFT.h" -#include "pic_manager.h" -#include "tft_lvgl_configuration.h" - -#include "../../../../inc/MarlinConfig.h" - -#include - -#include "draw_ui.h" - -TFT SPI_TFT; - -// use SPI1 for the spi tft. -void TFT::spi_init(uint8_t spiRate) { - tftio.Init(); -} - -void TFT::SetPoint(uint16_t x, uint16_t y, uint16_t point) { - if ((x > 480) || (y > 320)) return; - - setWindow(x, y, 1, 1); - tftio.WriteMultiple(point, (uint16_t)1); -} - -void TFT::setWindow(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { - tftio.set_window(x, y, (x + with - 1), (y + height - 1)); -} - -void TFT::LCD_init() { - tftio.InitTFT(); - #if PIN_EXISTS(TFT_BACKLIGHT) - OUT_WRITE(TFT_BACKLIGHT_PIN, LOW); - #endif - delay(100); - LCD_clear(0x0000); - LCD_Draw_Logo(); - #if PIN_EXISTS(TFT_BACKLIGHT) - OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); - #endif - #if HAS_LOGO_IN_FLASH - delay(2000); - #endif -} - -void TFT::LCD_clear(uint16_t color) { - setWindow(0, 0, (TFT_WIDTH), (TFT_HEIGHT)); - tftio.WriteMultiple(color, (uint32_t)(TFT_WIDTH) * (TFT_HEIGHT)); -} - -extern unsigned char bmp_public_buf[17 * 1024]; - -void TFT::LCD_Draw_Logo() { - #if HAS_LOGO_IN_FLASH - setWindow(0, 0, TFT_WIDTH, TFT_HEIGHT); - for (uint16_t i = 0; i < (TFT_HEIGHT); i ++) { - Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (TFT_WIDTH) * 2); - tftio.WriteSequence((uint16_t *)bmp_public_buf, TFT_WIDTH); - } - #endif -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h deleted file mode 100644 index 696bc16974..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../tft_io/tft_io.h" - -class TFT { -public: - TFT_IO tftio; - void spi_init(uint8_t spiRate); - void SetPoint(uint16_t x, uint16_t y, uint16_t point); - void setWindow(uint16_t x, uint16_t y, uint16_t with, uint16_t height); - void LCD_init(); - void LCD_clear(uint16_t color); - void LCD_Draw_Logo(); -}; - -extern TFT SPI_TFT; - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp deleted file mode 100644 index 34b7427860..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t * fw_type, *board; //*fw_version; - -#define ID_A_RETURN 1 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_A_RETURN: - if (event == LV_EVENT_CLICKED) { - // do nothing - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } - break; - } -} - -void lv_draw_about(void) { - lv_obj_t *buttonBack, *label_Back; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ABOUT_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ABOUT_UI; - } - disp_state = ABOUT_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create an Image button - buttonBack = lv_imgbtn_create(scr, NULL); - - #if 1 - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_A_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - #endif - - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - // Create a label on the image button - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - //fw_version = lv_label_create(scr, NULL); - //lv_obj_set_style(fw_version, &tft_style_label_rel); - //lv_label_set_text(fw_version, SHORT_BUILD_VERSION); - //lv_obj_align(fw_version, NULL, LV_ALIGN_CENTER, 0, -60); - - fw_type = lv_label_create(scr, NULL); - lv_obj_set_style(fw_type, &tft_style_label_rel); - lv_label_set_text(fw_type, "Firmware: Marlin " SHORT_BUILD_VERSION); - lv_obj_align(fw_type, NULL, LV_ALIGN_CENTER, 0, -20); - - board = lv_label_create(scr, NULL); - lv_obj_set_style(board, &tft_style_label_rel); - lv_label_set_text(board, "Board: " BOARD_INFO_NAME); - lv_obj_align(board, NULL, LV_ALIGN_CENTER, 0, -60); -} - -void lv_clear_about() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h deleted file mode 100644 index 2ee7ec04c6..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_about(void); -extern void lv_clear_about(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp deleted file mode 100644 index a30c99dba0..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp +++ /dev/null @@ -1,449 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_ACCE_RETURN 1 -#define ID_ACCE_PRINT 2 -#define ID_ACCE_RETRA 3 -#define ID_ACCE_TRAVEL 4 -#define ID_ACCE_X 5 -#define ID_ACCE_Y 6 -#define ID_ACCE_Z 7 -#define ID_ACCE_E0 8 -#define ID_ACCE_E1 9 -#define ID_ACCE_UP 10 -#define ID_ACCE_DOWN 11 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_ACCE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_acceleration_settings(); - draw_return_ui(); - } - break; - case ID_ACCE_PRINT: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = PrintAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } - break; - case ID_ACCE_RETRA: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = RetractAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } - break; - case ID_ACCE_TRAVEL: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = TravelAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } - break; - case ID_ACCE_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = XAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } - break; - case ID_ACCE_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = YAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } - break; - case ID_ACCE_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = ZAcceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } - break; - case ID_ACCE_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E0Acceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } - break; - case ID_ACCE_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E1Acceleration; - lv_clear_acceleration_settings(); - lv_draw_number_key(); - } - break; - case ID_ACCE_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_acceleration_settings(); - lv_draw_acceleration_settings(); - } - break; - case ID_ACCE_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_acceleration_settings(); - lv_draw_acceleration_settings(); - } - break; - } -} - -void lv_draw_acceleration_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelPrintText = NULL, *buttonPrintValue = NULL, *labelPrintValue = NULL; - lv_obj_t *labelRetraText = NULL, *buttonRetraValue = NULL, *labelRetraValue = NULL; - lv_obj_t *labelTravelText = NULL, *buttonTravelValue = NULL, *labelTravelValue = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ACCELERATION_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ACCELERATION_UI; - } - disp_state = ACCELERATION_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.AccelerationConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - if (uiCfg.para_ui_page != 1) { - - labelPrintText = lv_label_create(scr, NULL); - lv_obj_set_style(labelPrintText, &tft_style_label_rel); - lv_obj_set_pos(labelPrintText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelPrintText, machine_menu.PrintAcceleration); - - buttonPrintValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonPrintValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonPrintValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonPrintValue, event_handler, ID_ACCE_PRINT, NULL, 0); - lv_btn_set_style(buttonPrintValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonPrintValue, LV_BTN_STYLE_PR, &style_para_value); - labelPrintValue = lv_label_create(buttonPrintValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelRetraText = lv_label_create(scr, NULL); - lv_obj_set_style(labelRetraText, &tft_style_label_rel); - lv_obj_set_pos(labelRetraText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelRetraText, machine_menu.RetractAcceleration); - - buttonRetraValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonRetraValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonRetraValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonRetraValue, event_handler, ID_ACCE_RETRA, NULL, 0); - lv_btn_set_style(buttonRetraValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonRetraValue, LV_BTN_STYLE_PR, &style_para_value); - labelRetraValue = lv_label_create(buttonRetraValue, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelTravelText = lv_label_create(scr, NULL); - lv_obj_set_style(labelTravelText, &tft_style_label_rel); - lv_obj_set_pos(labelTravelText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelTravelText, machine_menu.TravelAcceleration); - - buttonTravelValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonTravelValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonTravelValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonTravelValue, event_handler, ID_ACCE_TRAVEL, NULL, 0); - lv_btn_set_style(buttonTravelValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonTravelValue, LV_BTN_STYLE_PR, &style_para_value); - labelTravelValue = lv_label_create(buttonTravelValue, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelXText, machine_menu.X_Acceleration); - - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_ACCE_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPrintValue); - lv_group_add_obj(g, buttonRetraValue); - lv_group_add_obj(g, buttonTravelValue); - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - else { - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelYText, machine_menu.Y_Acceleration); - - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Acceleration); - - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_ACCE_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); - - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelE0Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE0Text, &tft_style_label_rel); - lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelE0Text, machine_menu.E0_Acceleration); - - buttonE0Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_ACCE_E0, NULL, 0); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); - labelE0Value = lv_label_create(buttonE0Value, NULL); - - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - labelE1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE1Text, &tft_style_label_rel); - lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelE1Text, machine_menu.E1_Acceleration); - - buttonE1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_ACCE_E1, NULL, 0); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); - labelE1Value = lv_label_create(buttonE1Value, NULL); - - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_UP, NULL, 0); - //lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - //lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - //lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonE0Value); - lv_group_add_obj(g, buttonE1Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - - //lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - //lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); - //labelTurnPage = lv_label_create(buttonTurnPage, NULL); - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ACCE_RETURN, NULL, 0); - //lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - //lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - //lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - //lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - //lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - //lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.para_ui_page != 1) { - - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.acceleration); - lv_label_set_text(labelPrintValue, public_buf_l); - lv_obj_align(labelPrintValue, buttonPrintValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.retract_acceleration); - lv_label_set_text(labelRetraValue, public_buf_l); - lv_obj_align(labelRetraValue, buttonRetraValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.travel_acceleration); - lv_label_set_text(labelTravelValue, public_buf_l); - lv_obj_align(labelTravelValue, buttonTravelValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - } - else { - - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); - lv_label_set_text(labelE0Value, public_buf_l); - lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); - lv_label_set_text(labelE1Value, public_buf_l); - lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_acceleration_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h deleted file mode 100644 index 6ab49713c9..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_acceleration_settings(void); -extern void lv_clear_acceleration_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp deleted file mode 100644 index 5b1b241716..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_ADVANCE_RETURN 1 -#define ID_PAUSE_POS 2 -#define ID_PAUSE_POS_ARROW 3 -#define ID_WIFI_PARA 4 -#define ID_WIFI_PARA_ARROW 5 -#define ID_FILAMENT_SETTINGS 6 -#define ID_FILAMENT_SETTINGS_ARROW 7 -#define ID_ENCODER_SETTINGS 8 -#define ID_ENCODER_SETTINGS_ARROW 9 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_ADVANCE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - draw_return_ui(); - } - break; - case ID_PAUSE_POS: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_pause_position(); - } - break; - case ID_PAUSE_POS_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_pause_position(); - } - break; - case ID_FILAMENT_SETTINGS: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_filament_settings(); - } - break; - case ID_FILAMENT_SETTINGS_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_filament_settings(); - } - break; - #if ENABLED(USE_WIFI_FUNCTION) - case ID_WIFI_PARA: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_wifi_settings(); - } - break; - case ID_WIFI_PARA_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_wifi_settings(); - } - break; - #endif - #if HAS_ROTARY_ENCODER - case ID_ENCODER_SETTINGS: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_encoder_settings(); - } - break; - case ID_ENCODER_SETTINGS_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_advance_settings(); - lv_draw_encoder_settings(); - } - break; - #endif - } -} - -void lv_draw_advance_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonPausePos, *labelPausePos, *buttonPausePosNarrow; - lv_obj_t *buttonFilamentSettings, *labelFilamentSettings, *buttonFilamentSettingsNarrow; - lv_obj_t * line1,* line2; - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_t *buttonWifiSet,*labelWifiSet,*buttonWifiSetNarrow; - #endif - #if HAS_ROTARY_ENCODER - lv_obj_t *buttonEcoder,*labelEcoder,*buttonEcoderNarrow; - #endif - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ADVANCED_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ADVANCED_UI; - } - disp_state = ADVANCED_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.AdvancedConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - buttonPausePos = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonPausePos, PARA_UI_POS_X, PARA_UI_POS_Y); - lv_obj_set_size(buttonPausePos, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonPausePos, event_handler, ID_PAUSE_POS, NULL, 0); - lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_PR, &tft_style_label_pre); - lv_btn_set_layout(buttonPausePos, LV_LAYOUT_OFF); - labelPausePos = lv_label_create(buttonPausePos, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPausePos); - #endif - - buttonPausePosNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonPausePosNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonPausePosNarrow, event_handler, ID_PAUSE_POS_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonPausePosNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPausePosNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonPausePosNarrow, LV_LAYOUT_OFF); - - line1 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line1, line_points[0]); - - buttonFilamentSettings = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonFilamentSettings, PARA_UI_POS_X, PARA_UI_POS_Y*2); - lv_obj_set_size(buttonFilamentSettings, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonFilamentSettings, event_handler, ID_FILAMENT_SETTINGS, NULL, 0); - lv_btn_set_style(buttonFilamentSettings, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonFilamentSettings, LV_BTN_STYLE_PR, &tft_style_label_pre); - lv_btn_set_layout(buttonFilamentSettings, LV_LAYOUT_OFF); - labelFilamentSettings = lv_label_create(buttonFilamentSettings, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonFilamentSettings); - #endif - - buttonFilamentSettingsNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonFilamentSettingsNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y*2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonFilamentSettingsNarrow, event_handler, ID_FILAMENT_SETTINGS_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonFilamentSettingsNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonFilamentSettingsNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonFilamentSettingsNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFilamentSettingsNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonFilamentSettingsNarrow, LV_LAYOUT_OFF); - - line2 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line2, line_points[1]); - - #if ENABLED(USE_WIFI_FUNCTION) - - buttonWifiSet = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonWifiSet, PARA_UI_POS_X,PARA_UI_POS_Y*3); - lv_obj_set_size(buttonWifiSet, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonWifiSet, event_handler,ID_WIFI_PARA,NULL,0); - lv_btn_set_style(buttonWifiSet, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonWifiSet, LV_BTN_STYLE_PR, &tft_style_label_pre); - lv_btn_set_layout(buttonWifiSet, LV_LAYOUT_OFF); - labelWifiSet = lv_label_create(buttonWifiSet, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonWifiSet); - #endif - - buttonWifiSetNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonWifiSetNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*3+PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonWifiSetNarrow, event_handler,ID_WIFI_PARA_ARROW, NULL,0); - lv_imgbtn_set_src(buttonWifiSetNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonWifiSetNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonWifiSetNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonWifiSetNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonWifiSetNarrow, LV_LAYOUT_OFF); - - lv_obj_t * line3 = lv_line_create(scr, NULL); - lv_ex_line(line3,line_points[2]); - - #if HAS_ROTARY_ENCODER - buttonEcoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonEcoder, PARA_UI_POS_X,PARA_UI_POS_Y*4); - lv_obj_set_size(buttonEcoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonEcoder, event_handler,ID_ENCODER_SETTINGS,NULL,0); - lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_PR, &tft_style_label_pre); - lv_btn_set_layout(buttonEcoder, LV_LAYOUT_OFF); - labelEcoder = lv_label_create(buttonEcoder, NULL); - - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEcoder); - - buttonEcoderNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonEcoderNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*4+PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonEcoderNarrow, event_handler,ID_ENCODER_SETTINGS_ARROW, NULL,0); - lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonEcoderNarrow, LV_LAYOUT_OFF); - - lv_obj_t * line4 = lv_line_create(scr, NULL); - lv_ex_line(line4,line_points[3]); - #endif - - #elif HAS_ROTARY_ENCODER - buttonEcoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonEcoder, PARA_UI_POS_X,PARA_UI_POS_Y*3); - lv_obj_set_size(buttonEcoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonEcoder, event_handler,ID_ENCODER_SETTINGS,NULL,0); - lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_PR, &tft_style_label_pre); - lv_btn_set_layout(buttonEcoder, LV_LAYOUT_OFF); - labelEcoder = lv_label_create(buttonEcoder, NULL); - - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEcoder); - - buttonEcoderNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonEcoderNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*3+PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonEcoderNarrow, event_handler,ID_ENCODER_SETTINGS_ARROW, NULL,0); - lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonEcoderNarrow, LV_LAYOUT_OFF); - - lv_obj_t * line3 = lv_line_create(scr, NULL); - lv_ex_line(line3,line_points[2]); - #endif - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ADVANCE_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelPausePos, machine_menu.PausePosition); - lv_obj_align(labelPausePos, buttonPausePos, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelFilamentSettings, machine_menu.FilamentConf); - lv_obj_align(labelFilamentSettings, buttonFilamentSettings, LV_ALIGN_IN_LEFT_MID, 0, 0); - - #if ENABLED(USE_WIFI_FUNCTION) - lv_label_set_text(labelWifiSet, machine_menu.WifiSettings); - lv_obj_align(labelWifiSet, buttonWifiSet, LV_ALIGN_IN_LEFT_MID,0, 0); - #endif - #if HAS_ROTARY_ENCODER - lv_label_set_text(labelEcoder, machine_menu.EncoderSettings); - lv_obj_align(labelEcoder, buttonEcoder, LV_ALIGN_IN_LEFT_MID,0, 0); - #endif - } - -} - -void lv_clear_advance_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h deleted file mode 100644 index 84e4a4d4cf..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_advance_settings(void); -extern void lv_clear_advance_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp deleted file mode 100644 index bb6b45aebe..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_TFT_LVGL_UI, HAS_BED_PROBE) - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" -#include "../../../../module/probe.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_OFFSET_RETURN 1 -#define ID_OFFSET_X 2 -#define ID_OFFSET_Y 3 -#define ID_OFFSET_Z 4 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_OFFSET_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_auto_level_offset_settings(); - draw_return_ui(); - } - break; - case ID_OFFSET_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = x_offset; - lv_clear_auto_level_offset_settings(); - lv_draw_number_key(); - } - break; - case ID_OFFSET_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = y_offset; - lv_clear_auto_level_offset_settings(); - lv_draw_number_key(); - } - break; - case ID_OFFSET_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = z_offset; - lv_clear_auto_level_offset_settings(); - lv_draw_number_key(); - } - break; - } -} - -void lv_draw_auto_level_offset_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != NOZZLE_PROBE_OFFSET_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = NOZZLE_PROBE_OFFSET_UI; - } - disp_state = NOZZLE_PROBE_OFFSET_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.OffsetConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.Xoffset); - - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_OFFSET_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Yoffset); - - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_OFFSET_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Zoffset); - - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_OFFSET_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_OFFSET_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonBack); - } - #endif - - if (gCfgItems.multiple_language != 0) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.x, 0)); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.y, 0)); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), probe.offset.z); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_auto_level_offset_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI && HAS_BED_PROBE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h deleted file mode 100644 index 688cd205d0..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_auto_level_offset_settings(void); -extern void lv_clear_auto_level_offset_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp deleted file mode 100644 index 70564c036c..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp +++ /dev/null @@ -1,352 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../gcode/queue.h" -#include "../../../../gcode/gcode.h" - -#if HAS_BED_PROBE - #include "../../../../module/probe.h" -#endif - -extern lv_group_t * g; -static lv_obj_t * scr; - -static lv_obj_t *labelV, *buttonV, * zOffsetText; - -#define ID_BABY_STEP_X_P 1 -#define ID_BABY_STEP_X_N 2 -#define ID_BABY_STEP_Y_P 3 -#define ID_BABY_STEP_Y_N 4 -#define ID_BABY_STEP_Z_P 5 -#define ID_BABY_STEP_Z_N 6 -#define ID_BABY_STEP_DIST 7 -#define ID_BABY_STEP_RETURN 8 - -static float babystep_dist=0.01; -static uint8_t has_adjust_z = 0; - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - char baby_buf[30]={0}; - switch (obj->mks_obj_id) { - case ID_BABY_STEP_X_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); - sprintf_P(baby_buf, PSTR("M290 X%.3f"),babystep_dist); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } - break; - case ID_BABY_STEP_X_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); - sprintf_P(baby_buf, PSTR("M290 X%.3f"),((float)0 - babystep_dist)); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } - break; - case ID_BABY_STEP_Y_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); - sprintf_P(baby_buf, PSTR("M290 Y%.3f"), babystep_dist); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } - break; - case ID_BABY_STEP_Y_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); - sprintf_P(baby_buf, PSTR("M290 Y%.3f"),((float)0 - babystep_dist)); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } - break; - case ID_BABY_STEP_Z_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); - sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } - break; - case ID_BABY_STEP_Z_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - ZERO(baby_buf); - sprintf_P(baby_buf, PSTR("M290 Z%.3f"),((float)0 - babystep_dist)); - gcode.process_subcommands_now_P(PSTR(baby_buf)); - has_adjust_z = 1; - } - break; - case ID_BABY_STEP_DIST: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (abs((int)(100 * babystep_dist)) == 1) - babystep_dist = 0.05; - else if (abs((int)(100 * babystep_dist)) == 5) - babystep_dist = 0.1; - else - babystep_dist = 0.01; - disp_baby_step_dist(); - } - - break; - case ID_BABY_STEP_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (has_adjust_z == 1) { - gcode.process_subcommands_now_P(PSTR("M500")); - has_adjust_z = 0; - } - clear_cur_ui(); - draw_return_ui(); - } - break; - } -} - -void lv_draw_baby_stepping(void) { - lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD, *buttonZI, *buttonZD, *buttonBack; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != BABY_STEP_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = BABY_STEP_UI; - } - disp_state = BABY_STEP_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create an Image button - buttonXI = lv_imgbtn_create(scr, NULL); - buttonXD = lv_imgbtn_create(scr, NULL); - buttonYI = lv_imgbtn_create(scr, NULL); - buttonYD = lv_imgbtn_create(scr, NULL); - buttonZI = lv_imgbtn_create(scr, NULL); - buttonZD = lv_imgbtn_create(scr, NULL); - buttonV = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_BABY_STEP_X_P, NULL, 0); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, "F:/bmp_xAdd.bin"); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, "F:/bmp_xAdd.bin"); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_BABY_STEP_X_N, NULL, 0); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, "F:/bmp_xDec.bin"); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, "F:/bmp_xDec.bin"); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_BABY_STEP_Y_P, NULL, 0); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, "F:/bmp_yAdd.bin"); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, "F:/bmp_yAdd.bin"); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_BABY_STEP_Y_N, NULL, 0); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, "F:/bmp_yDec.bin"); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, "F:/bmp_yDec.bin"); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_BABY_STEP_Z_P, NULL, 0); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, "F:/bmp_zAdd.bin"); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, "F:/bmp_zAdd.bin"); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_BABY_STEP_Z_N, NULL, 0); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, "F:/bmp_zDec.bin"); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, "F:/bmp_zDec.bin"); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_BABY_STEP_DIST, NULL, 0); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_BABY_STEP_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif // if 1 - lv_obj_set_pos(buttonXI, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonYI, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonZI, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonV, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonXD, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonYD, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonYD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonZI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonZD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonV, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelXI = lv_label_create(buttonXI, NULL); - lv_obj_t *labelXD = lv_label_create(buttonXD, NULL); - lv_obj_t *labelYI = lv_label_create(buttonYI, NULL); - lv_obj_t *labelYD = lv_label_create(buttonYD, NULL); - lv_obj_t *labelZI = lv_label_create(buttonZI, NULL); - lv_obj_t *labelZD = lv_label_create(buttonZD, NULL); - labelV = lv_label_create(buttonV, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelXI, move_menu.x_add); - lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelXD, move_menu.x_dec); - lv_obj_align(labelXD, buttonXD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelYI, move_menu.y_add); - lv_obj_align(labelYI, buttonYI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelYD, move_menu.y_dec); - lv_obj_align(labelYD, buttonYD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelZI, move_menu.z_add); - lv_obj_align(labelZI, buttonZI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelZD, move_menu.z_dec); - lv_obj_align(labelZD, buttonZD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXI); - lv_group_add_obj(g, buttonXD); - lv_group_add_obj(g, buttonYI); - lv_group_add_obj(g, buttonYD); - lv_group_add_obj(g, buttonZI); - lv_group_add_obj(g, buttonZD); - lv_group_add_obj(g, buttonV); - lv_group_add_obj(g, buttonBack); - } - #endif - - disp_baby_step_dist(); - - zOffsetText = lv_label_create(scr, NULL); - lv_obj_set_style(zOffsetText, &tft_style_label_rel); - lv_obj_set_pos(zOffsetText, 290, TITLE_YPOS); - disp_z_offset_value(); -} - -void disp_baby_step_dist() { - // char buf[30] = {0}; - - if ((int)(100 * babystep_dist) == 1) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_01.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_01.bin"); - } - else if ((int)(100 * babystep_dist) == 5) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_05.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_05.bin"); - } - else if ((int)(100 * babystep_dist) == 10) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_1.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_1.bin"); - } - if (gCfgItems.multiple_language != 0) { - if ((int)(100 * babystep_dist) == 1) { - lv_label_set_text(labelV, move_menu.step_001mm); - lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if ((int)(100 * babystep_dist) == 5) { - lv_label_set_text(labelV, move_menu.step_005mm); - lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if ((int)(100 * babystep_dist) == 10) { - lv_label_set_text(labelV, move_menu.step_01mm); - lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } -} - -void disp_z_offset_value() { - char buf[20]; - - ZERO(buf); - sprintf_P(buf, PSTR("offset Z: %.3f"), (double)TERN(HAS_BED_PROBE, probe.offset.z, 0)); - lv_label_set_text(zOffsetText, buf); -} - -void lv_clear_baby_stepping() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h deleted file mode 100644 index 333ba2d597..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_baby_stepping(void); -extern void lv_clear_baby_stepping(); -extern void disp_baby_step_dist(); -extern void disp_z_offset_value(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp deleted file mode 100644 index c60000afae..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp +++ /dev/null @@ -1,356 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t *labelStep, *buttonStep, *buttonMov, *buttonExt; -static lv_obj_t *labelMov, *labelExt; -static lv_obj_t * printSpeedText; - -#define ID_C_ADD 1 -#define ID_C_DEC 2 -#define ID_C_MOVE 3 -#define ID_C_EXT 4 -#define ID_C_STEP 5 -#define ID_C_RETURN 6 - -static uint8_t speedType; - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_C_ADD: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (speedType == 0) { - if (feedrate_percentage < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed) - feedrate_percentage += uiCfg.stepPrintSpeed; - else - feedrate_percentage = MAX_EXT_SPEED_PERCENT; - } - else if (speedType == 1) { - if (planner.flow_percentage[0] < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed) - planner.flow_percentage[0] += uiCfg.stepPrintSpeed; - else - planner.flow_percentage[0] = MAX_EXT_SPEED_PERCENT; - //planner.e_factor[0]= planner.flow_percentage[0]*0.01; - //planner.flow_percentage[1] = planner.flow_percentage[0]; - //planner.e_factor[1]= planner.flow_percentage[1]*0.01; - planner.refresh_e_factor(0); - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = planner.flow_percentage[0]; - planner.refresh_e_factor(1); - #endif - } - disp_print_speed(); - } - break; - case ID_C_DEC: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (speedType == 0) { - if (feedrate_percentage > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed) - feedrate_percentage -= uiCfg.stepPrintSpeed; - else - feedrate_percentage = MIN_EXT_SPEED_PERCENT; - } - else if (speedType == 1) { - if (planner.flow_percentage[0] > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed) - planner.flow_percentage[0] -= uiCfg.stepPrintSpeed; - else - planner.flow_percentage[0] = MIN_EXT_SPEED_PERCENT; - //planner.e_factor[0]= planner.flow_percentage[0] * 0.01; - //planner.flow_percentage[1] = planner.flow_percentage[0]; - //planner.e_factor[1]= planner.flow_percentage[1] * 0.01; - planner.refresh_e_factor(0); - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = planner.flow_percentage[0]; - planner.refresh_e_factor(1); - #endif - } - disp_print_speed(); - } - break; - case ID_C_MOVE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - speedType = 0; - disp_speed_type(); - disp_print_speed(); - } - break; - case ID_C_EXT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - speedType = 1; - disp_speed_type(); - disp_print_speed(); - } - break; - case ID_C_STEP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.stepPrintSpeed == 1) - uiCfg.stepPrintSpeed = 5; - else if (uiCfg.stepPrintSpeed == 5) - uiCfg.stepPrintSpeed = 10; - else - uiCfg.stepPrintSpeed = 1; - disp_speed_step(); - } - break; - case ID_C_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } - break; - } -} - -void lv_draw_change_speed(void) { - lv_obj_t *buttonAdd, *buttonDec; - lv_obj_t *buttonBack; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != CHANGE_SPEED_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = CHANGE_SPEED_UI; - } - disp_state = CHANGE_SPEED_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - - // Create an Image button - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttonMov = lv_imgbtn_create(scr, NULL); - buttonExt = lv_imgbtn_create(scr, NULL); - buttonStep = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_C_ADD, NULL, 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_C_DEC, NULL, 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, NULL, 0); - lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, NULL, 0); - lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, NULL, 0); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_C_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonMov, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonExt, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonStep, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMov, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonExt, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); - labelMov = lv_label_create(buttonMov, NULL); - labelExt = lv_label_create(buttonExt, NULL); - labelStep = lv_label_create(buttonStep, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelAdd, speed_menu.add); - lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelDec, speed_menu.dec); - lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAdd); - lv_group_add_obj(g, buttonDec); - lv_group_add_obj(g, buttonMov); - lv_group_add_obj(g, buttonExt); - lv_group_add_obj(g, buttonStep); - lv_group_add_obj(g, buttonBack); - } - #endif - - disp_speed_type(); - disp_speed_step(); - - printSpeedText = lv_label_create(scr, NULL); - lv_obj_set_style(printSpeedText, &tft_style_label_rel); - disp_print_speed(); -} - -void disp_speed_step() { - if (uiCfg.stepPrintSpeed == 1) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_percent.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_percent.bin"); - } - else if (uiCfg.stepPrintSpeed == 5) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_percent.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_percent.bin"); - } - else if (uiCfg.stepPrintSpeed == 10) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_percent.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_percent.bin"); - } - if (gCfgItems.multiple_language != 0) { - if (uiCfg.stepPrintSpeed == 1) { - lv_label_set_text(labelStep, speed_menu.step_1percent); - lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if (uiCfg.stepPrintSpeed == 5) { - lv_label_set_text(labelStep, speed_menu.step_5percent); - lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if (uiCfg.stepPrintSpeed == 10) { - lv_label_set_text(labelStep, speed_menu.step_10percent); - lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } -} - -void disp_print_speed() { - char buf[30] = { 0 }; - - public_buf_l[0] = '\0'; - - if (speedType == 0) { // move - strcat(public_buf_l, speed_menu.move_speed); - strcat_P(public_buf_l, PSTR(": ")); - sprintf_P(buf, PSTR("%d%%"), feedrate_percentage); - strcat(public_buf_l, buf); - } - else if (speedType == 1) { // e1 - strcat(public_buf_l, speed_menu.extrude_speed); - strcat_P(public_buf_l, PSTR(": ")); - sprintf_P(buf, PSTR("%d%%"), planner.flow_percentage[0]); - strcat(public_buf_l, buf); - } - lv_label_set_text(printSpeedText, public_buf_l); - lv_obj_align(printSpeedText, NULL, LV_ALIGN_CENTER, 0, -65); -} - -void disp_speed_type() { - switch (speedType) { - case 1: - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, "F:/bmp_mov_changeSpeed.bin"); - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, "F:/bmp_mov_changeSpeed.bin"); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, "F:/bmp_extruct_sel.bin"); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, "F:/bmp_extruct_sel.bin"); - break; - - default: - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, "F:/bmp_mov_sel.bin"); - lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, "F:/bmp_mov_sel.bin"); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, "F:/bmp_speed_extruct.bin"); - lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, "F:/bmp_speed_extruct.bin"); - break; - } - lv_obj_refresh_ext_draw_pad(buttonExt); - lv_obj_refresh_ext_draw_pad(buttonMov); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelMov, speed_menu.move); - lv_obj_align(labelMov, buttonMov, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelExt, speed_menu.extrude); - lv_obj_align(labelExt, buttonExt, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } -} - -void lv_clear_change_speed() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h deleted file mode 100644 index c4996a3ef7..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#define MIN_EXT_SPEED_PERCENT 10 -#define MAX_EXT_SPEED_PERCENT 999 - -extern void lv_draw_change_speed(void); -extern void lv_clear_change_speed(); -extern void disp_speed_step(); -extern void disp_print_speed(); -extern void disp_speed_type(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp deleted file mode 100644 index c848323010..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ /dev/null @@ -1,703 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * draw_dialog.cpp - */ - -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include "../../../../sd/cardreader.h" -#include "../../../../gcode/queue.h" -#include "../../../../module/temperature.h" -#include "../../../../module/planner.h" -#include "../../../../gcode/gcode.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" -#endif - -#if ENABLED(PARK_HEAD_ON_PAUSE) - #include "../../../../feature/pause.h" -#endif -#include "../../../../gcode/gcode.h" - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t * tempText1; -static lv_obj_t * filament_bar; - -extern uint8_t sel_id; -extern uint8_t once_flag; -extern uint8_t gcode_preview_over; -extern int upload_result ; -extern uint32_t upload_time; -extern uint32_t upload_size; -extern uint8_t temperature_change_frequency; - -static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) { - #if HAS_GCODE_PREVIEW - preview_gcode_prehandle(list_file.file_name[sel_id]); - #endif - reset_print_time(); - start_print_time(); - - uiCfg.print_state = WORKING; - lv_clear_dialog(); - lv_draw_printing(); - - #if ENABLED(SDSUPPORT) - if (gcode_preview_over != 1) { - char *cur_name; - cur_name = strrchr(list_file.file_name[sel_id], '/'); - - SdFile file, *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01f; - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01f; - #endif - card.startFileprint(); - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.prepare(); - #endif - once_flag = 0; - } - } - #endif - } - else if (uiCfg.dialogType == DIALOG_TYPE_STOP) { - wait_for_heatup = false; - stop_print_time(); - lv_clear_dialog(); - lv_draw_ready_print(); - - #if ENABLED(SDSUPPORT) - //card.endFilePrint(); - //wait_for_heatup = false; - uiCfg.print_state = IDLE; - card.flag.abort_sd_printing = true; - //queue.clear(); - //quickstop_stepper(); - //print_job_timer.stop(); - //thermalManager.disable_all_heaters(); - - //#if ENABLED(POWER_LOSS_RECOVERY) - // recovery.purge(); - //#endif - //queue.enqueue_now_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0")); - //queue.inject_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0\nM84\nM107")); - #endif - } - else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) { - clear_cur_ui(); - lv_draw_ready_print(); - } - #if ENABLED(ADVANCED_PAUSE_FEATURE) - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT - ) { - wait_for_user = false; - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { - pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { - clear_cur_ui(); - draw_return_ui(); - } - #endif - else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) { - gcode.process_subcommands_now_P(PSTR("M500")); - clear_cur_ui(); - draw_return_ui(); - } - else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) { - gcode.process_subcommands_now_P(PSTR("M501")); - clear_cur_ui(); - draw_return_ui(); - } - else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) { - gcode.process_subcommands_now_P(PSTR("M502")); - clear_cur_ui(); - draw_return_ui(); - } - else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) { - uiCfg.configWifi = 1; - clear_cur_ui(); - draw_return_ui(); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) { - uiCfg.filament_heat_completed_load = 1; - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) { - uiCfg.filament_heat_completed_unload = 1; - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED - ) { - clear_cur_ui(); - draw_return_ui(); - } - } -} - -static void btn_cancel_event_cb(lv_obj_t * btn, lv_event_t event) { - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { - #if ENABLED(ADVANCED_PAUSE_FEATURE) - pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; - #endif - } - else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) - ) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target= uiCfg.desireSprayerTempBak; - clear_cur_ui(); - draw_return_ui(); - } - else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING) - ) { - queue.enqueue_one_P(PSTR("M410")); - uiCfg.filament_rate = 0; - uiCfg.filament_loading_completed = 0; - uiCfg.filament_unloading_completed = 0; - uiCfg.filament_loading_time_flg = 0; - uiCfg.filament_loading_time_cnt = 0; - uiCfg.filament_unloading_time_flg = 0; - uiCfg.filament_unloading_time_cnt = 0; - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; - clear_cur_ui(); - draw_return_ui(); - } - else { - clear_cur_ui(); - draw_return_ui(); - } - } -} - -void lv_draw_dialog(uint8_t type) { - - lv_obj_t * btnOk = NULL; - lv_obj_t * btnCancel = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != DIALOG_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = DIALOG_UI; - } - disp_state = DIALOG_UI; - - uiCfg.dialogType = type; - - scr = lv_obj_create(NULL, NULL); - - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - - static lv_style_t style_btn_rel; // A variable to store the released style - lv_style_copy(&style_btn_rel, &lv_style_plain); // Initialize from a built-in style - style_btn_rel.body.border.color = lv_color_hex3(0x269); - style_btn_rel.body.border.width = 1; - style_btn_rel.body.main_color = lv_color_hex3(0xADF); - style_btn_rel.body.grad_color = lv_color_hex3(0x46B); - style_btn_rel.body.shadow.width = 4; - style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM; - style_btn_rel.body.radius = LV_RADIUS_CIRCLE; - style_btn_rel.text.color = lv_color_hex3(0xDEF); - style_btn_rel.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); - - static lv_style_t style_btn_pr; // A variable to store the pressed style - lv_style_copy(&style_btn_pr, &style_btn_rel); // Initialize from the released style - style_btn_pr.body.border.color = lv_color_hex3(0x46B); - style_btn_pr.body.main_color = lv_color_hex3(0x8BD); - style_btn_pr.body.grad_color = lv_color_hex3(0x24A); - style_btn_pr.body.shadow.width = 2; - style_btn_pr.text.color = lv_color_hex3(0xBCD); - style_btn_pr.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); - - lv_obj_t *labelDialog = lv_label_create(scr, NULL); - lv_obj_set_style(labelDialog, &tft_style_label_rel); - - if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { - btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button - lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT - ) { - btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button - lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME - || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING - ) { - // nothing to do - } - else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); - } - else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); - } - #if ENABLED(USE_WIFI_FUNCTION) - else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) { - if (upload_result == 2) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); - } - else if (upload_result == 3) { - btnOk = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnOk, 100, 50); - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); - lv_label_set_text(labelOk, print_file_dialog_menu.confirm); - } - } - #endif //USE_WIFI_FUNCTION - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT - ) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); - - tempText1 = lv_label_create(scr, NULL); - lv_obj_set_style(tempText1, &tft_style_label_rel); - filament_sprayer_temp(); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED - ) { - btnOk = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnOk, 100, 50); - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); - lv_label_set_text(labelOk, print_file_dialog_menu.confirm); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING - ) { - btnCancel = lv_btn_create(scr, NULL); - lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); - lv_obj_set_size(btnCancel, 100, 50); - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); - - filament_bar = lv_bar_create(scr, NULL); - lv_obj_set_pos(filament_bar, (TFT_WIDTH-400)/2, ((TFT_HEIGHT - titleHeight)-40)/2); - lv_obj_set_size(filament_bar, 400, 25); - lv_bar_set_style(filament_bar, LV_BAR_STYLE_INDIC, &lv_bar_style_indic); - lv_bar_set_anim_time(filament_bar, 1000); - lv_bar_set_value(filament_bar, 0, LV_ANIM_ON); - } - else { - btnOk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnOk, BTN_OK_X, BTN_OK_Y); // Set its position - lv_obj_set_size(btnOk, 100, 50); // Set its size - lv_obj_set_event_cb(btnOk, btn_ok_event_cb); - lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t *labelOk = lv_label_create(btnOk, NULL); // Add a label to the button - - btnCancel = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(btnCancel, BTN_CANCEL_X, BTN_CANCEL_Y); // Set its position - lv_obj_set_size(btnCancel, 100, 50); // Set its size - lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); - lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style - lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style - lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); // Add a label to the button - - if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { - lv_label_set_text(labelOk, pause_msg_menu.purgeMore); // Set the labels text - lv_label_set_text(labelCancel, pause_msg_menu.continuePrint); - } - else { - lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text - lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); - } - } - if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) { - lv_label_set_text(labelDialog, print_file_dialog_menu.print_file); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - - lv_obj_t *labelFile = lv_label_create(scr, NULL); - lv_obj_set_style(labelFile, &tft_style_label_rel); - - lv_label_set_text(labelFile, list_file.long_name[sel_id]); - lv_obj_align(labelFile, NULL, LV_ALIGN_CENTER, 0, -60); - } - else if (uiCfg.dialogType == DIALOG_TYPE_STOP) { - lv_label_set_text(labelDialog, print_file_dialog_menu.cancle_print); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) { - lv_label_set_text(labelDialog, print_file_dialog_menu.print_finish); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING) { - lv_label_set_text(labelDialog, pause_msg_menu.pausing); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING) { - lv_label_set_text(labelDialog, pause_msg_menu.changing); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD) { - lv_label_set_text(labelDialog, pause_msg_menu.unload); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING) { - lv_label_set_text(labelDialog, pause_msg_menu.waiting); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT) { - lv_label_set_text(labelDialog, pause_msg_menu.insert); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD) { - lv_label_set_text(labelDialog, pause_msg_menu.load); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE) { - lv_label_set_text(labelDialog, pause_msg_menu.purge); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { - lv_label_set_text(labelDialog, pause_msg_menu.resume); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT) { - lv_label_set_text(labelDialog, pause_msg_menu.heat); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING) { - lv_label_set_text(labelDialog, pause_msg_menu.heating); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { - lv_label_set_text(labelDialog, pause_msg_menu.option); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) { - lv_label_set_text(labelDialog, eeprom_menu.storeTips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) { - lv_label_set_text(labelDialog, eeprom_menu.readTips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) { - lv_label_set_text(labelDialog, eeprom_menu.revertTips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) { - lv_label_set_text(labelDialog, machine_menu.wifiConfigTips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) { - lv_label_set_text(labelDialog, print_file_dialog_menu.wifi_enable_tips); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) { - lv_label_set_text(labelDialog, DIALOG_UPDATE_NO_DEVICE_EN); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - #if ENABLED(USE_WIFI_FUNCTION) - else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) { - if (upload_result == 1) { - lv_label_set_text(labelDialog, DIALOG_UPLOAD_ING_EN); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (upload_result == 2) { - lv_label_set_text(labelDialog, DIALOG_UPLOAD_ERROR_EN); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (upload_result == 3) { - char buf[200]; - int _index = 0; - - ZERO(buf); - - strcpy(buf, DIALOG_UPLOAD_FINISH_EN); - _index = strlen(buf); - buf[_index] = '\n'; - _index++; - strcat(buf, DIALOG_UPLOAD_SIZE_EN); - - _index = strlen(buf); - buf[_index] = ':'; - _index++; - sprintf(&buf[_index], " %d KBytes\n", (int)(upload_size / 1024)); - - strcat(buf, DIALOG_UPLOAD_TIME_EN); - _index = strlen(buf); - buf[_index] = ':'; - _index++; - sprintf(&buf[_index], " %d s\n", (int)upload_time); - - strcat(buf, DIALOG_UPLOAD_SPEED_EN); - _index = strlen(buf); - buf[_index] = ':'; - _index++; - sprintf(&buf[_index], " %d KBytes/s\n", (int)(upload_size / upload_time / 1024)); - - lv_label_set_text(labelDialog, buf); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - - } - } - #endif //USE_WIFI_FUNCTION - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) { - lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) { - lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat_confirm); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) { - lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) { - lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat_confirm); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED) { - lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_completed); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED) { - lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_completed); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING) { - lv_label_set_text(labelDialog, filament_menu.filament_dialog_loading); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); - } - else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING) { - lv_label_set_text(labelDialog, filament_menu.filament_dialog_unloading); - lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - if (btnOk) lv_group_add_obj(g, btnOk); - if (btnCancel) lv_group_add_obj(g, btnCancel); - } - #endif -} - -void filament_sprayer_temp() { - char buf[20] = {0}; - - public_buf_l[0] = '\0'; - - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, preheat_menu.ext1); - else - strcat(public_buf_l, preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); - - strcat_P(public_buf_l, PSTR(": ")); - strcat(public_buf_l, buf); - lv_label_set_text(tempText1, public_buf_l); - lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50); -} - -void filament_dialog_handle() { - if ((temperature_change_frequency == 1) - && ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) - || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT)) - ) { - filament_sprayer_temp(); - temperature_change_frequency = 0; - } - if (uiCfg.filament_heat_completed_load == 1) { - uiCfg.filament_heat_completed_load = 0; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOADING); - planner.synchronize(); - uiCfg.filament_loading_time_flg = 1; - uiCfg.filament_loading_time_cnt = 0; - ZERO(public_buf_m); - sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_load_length,gCfgItems.filamentchange_load_speed); - queue.inject_P(PSTR(public_buf_m)); - //gcode.process_subcommands_now_P(PSTR(public_buf_m)); - } - if (uiCfg.filament_heat_completed_unload == 1) { - uiCfg.filament_heat_completed_unload = 0; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOADING); - planner.synchronize(); - uiCfg.filament_unloading_time_flg = 1; - uiCfg.filament_unloading_time_cnt = 0; - ZERO(public_buf_m); - sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E-%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_unload_length,gCfgItems.filamentchange_unload_speed); - queue.inject_P(PSTR(public_buf_m)); - } - - if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) - && (uiCfg.filament_load_heat_flg == 1) - ) { - uiCfg.filament_load_heat_flg = 0; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); - } - - if (uiCfg.filament_loading_completed == 1) { - uiCfg.filament_rate = 0; - uiCfg.filament_loading_completed = 0; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED); - } - if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) - && (uiCfg.filament_unload_heat_flg == 1) - ) { - uiCfg.filament_unload_heat_flg = 0; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); - } - - if (uiCfg.filament_unloading_completed == 1) { - uiCfg.filament_rate = 0; - uiCfg.filament_unloading_completed = 0; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED); - } - - if ( uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING - || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING - ) lv_filament_setbar(); -} - -void lv_filament_setbar() { - lv_bar_set_value(filament_bar, uiCfg.filament_rate, LV_ANIM_ON); -} - -void lv_clear_dialog() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h deleted file mode 100644 index dc5adc5ad6..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#define DIALOG_TYPE_STOP 0 -#define DIALOG_TYPE_PRINT_FILE 1 -#define DIALOG_TYPE_REPRINT_NO_FILE 2 - -#define DIALOG_TYPE_M80_FAIL 3 //** -#define DIALOG_TYPE_MESSAGE_ERR1 4 //** - -#define DIALOG_TYPE_UPDATE_ESP_FIRMARE 5 -#define DIALOG_TYPE_UPDATE_ESP_DATA 6 -#define DIALOG_TYPE_UPLOAD_FILE 7 -#define DIALOG_TYPE_UNBIND 8 - -#define DIALOG_TYPE_FILAMENT_LOAD_HEAT 9 -#define DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED 10 -#define DIALOG_TYPE_FILAMENT_LOADING 11 -#define DIALOG_TYPE_FILAMENT_LOAD_COMPLETED 12 -#define DIALOG_TYPE_FILAMENT_UNLOAD_HEAT 13 -#define DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED 14 -#define DIALOG_TYPE_FILAMENT_UNLOADING 15 -#define DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED 16 - -#define DIALOG_TYPE_FILE_LOADING 17 //** - -#define DIALOG_TYPE_FILAMENT_NO_PRESS 18 -#define DIALOG_TYPE_FINISH_PRINT 19 - -#define WIFI_ENABLE_TIPS 20 - -#define DIALOG_PAUSE_MESSAGE_PAUSING 21 -#define DIALOG_PAUSE_MESSAGE_CHANGING 22 -#define DIALOG_PAUSE_MESSAGE_UNLOAD 23 -#define DIALOG_PAUSE_MESSAGE_WAITING 24 -#define DIALOG_PAUSE_MESSAGE_INSERT 25 -#define DIALOG_PAUSE_MESSAGE_LOAD 26 -#define DIALOG_PAUSE_MESSAGE_PURGE 27 -#define DIALOG_PAUSE_MESSAGE_RESUME 28 -#define DIALOG_PAUSE_MESSAGE_HEAT 29 -#define DIALOG_PAUSE_MESSAGE_HEATING 30 -#define DIALOG_PAUSE_MESSAGE_OPTION 31 - -#define DIALOG_STORE_EEPROM_TIPS 32 -#define DIALOG_READ_EEPROM_TIPS 33 -#define DIALOG_REVERT_EEPROM_TIPS 34 - -#define DIALOG_WIFI_CONFIG_TIPS 35 -#define DIALOG_TRANSFER_NO_DEVICE 36 -#define BTN_OK_X 100 -#define BTN_OK_Y 180 -#define BTN_CANCEL_X 280 -#define BTN_CANCEL_Y 180 - -extern void lv_draw_dialog(uint8_t type); -extern void lv_clear_dialog(); -extern void filament_sprayer_temp(); -extern void filament_dialog_handle(); -extern void lv_filament_setbar(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp deleted file mode 100644 index ca7d2d1e31..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_EEPROM_RETURN 1 -#define ID_EEPROM_STORE 2 -#define ID_EEPROM_STORE_ARROW 3 -#define ID_EEPROM_READ 4 -#define ID_EEPROM_READ_ARROW 5 -#define ID_EEPROM_REVERT 6 -#define ID_EEPROM_REVERT_ARROW 7 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_EEPROM_RETURN: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - draw_return_ui(); - } - break; - case ID_EEPROM_STORE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); - } - break; - case ID_EEPROM_STORE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_STORE_EEPROM_TIPS); - } - break; - #if 0 - case ID_EEPROM_READ: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_READ_EEPROM_TIPS); - } - break; - case ID_EEPROM_READ_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_READ_EEPROM_TIPS); - } - break; - #endif - - case ID_EEPROM_REVERT: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_REVERT_EEPROM_TIPS); - } - break; - case ID_EEPROM_REVERT_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_eeprom_settings(); - lv_draw_dialog(DIALOG_REVERT_EEPROM_TIPS); - } - break; - } -} - -void lv_draw_eeprom_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonStore,*labelStore,*buttonStoreNarrow; - //lv_obj_t *buttonRead,*labelRead,*buttonReadNarrow; - lv_obj_t *buttonRevert, *labelRevert, *buttonRevertNarrow; - lv_obj_t * line1, * line2; //* line3; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EEPROM_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = EEPROM_SETTINGS_UI; - } - disp_state = EEPROM_SETTINGS_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - buttonRevert = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonRevert, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonRevert, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonRevert, event_handler, ID_EEPROM_REVERT, NULL, 0); - lv_btn_set_style(buttonRevert, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonRevert, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonRevert, LV_LAYOUT_OFF); - labelRevert = lv_label_create(buttonRevert, NULL); /*Add a label to the button*/ - - buttonRevertNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonRevertNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonRevertNarrow, event_handler, ID_EEPROM_REVERT_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonRevertNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonRevertNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonRevertNarrow, LV_LAYOUT_OFF); - - //line3 = lv_line_create(scr, NULL); - //lv_ex_line(line3,line_points[2]); - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonStore = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonStore, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonStore, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonStore, event_handler, ID_EEPROM_STORE, NULL, 0); - lv_btn_set_style(buttonStore, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonStore, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonStore, LV_LAYOUT_OFF); - labelStore = lv_label_create(buttonStore, NULL); /*Add a label to the button*/ - - buttonStoreNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonStoreNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonStoreNarrow, event_handler, ID_EEPROM_STORE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStoreNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonStoreNarrow, LV_LAYOUT_OFF); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_EEPROM_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelStore, eeprom_menu.store); - lv_obj_align(labelStore, buttonStore, LV_ALIGN_IN_LEFT_MID,0, 0); - - //lv_label_set_text(labelRead, eeprom_menu.read); - //lv_obj_align(labelRead, buttonRead, LV_ALIGN_IN_LEFT_MID,0, 0); - - lv_label_set_text(labelRevert, eeprom_menu.revert); - lv_obj_align(labelRevert, buttonRevert, LV_ALIGN_IN_LEFT_MID, 0, 0); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonRevert); - lv_group_add_obj(g, buttonStore); - lv_group_add_obj(g, buttonBack); - } - #endif - -} - -void lv_clear_eeprom_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h deleted file mode 100644 index 6d5ecf0870..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_eeprom_settings(void); -extern void lv_clear_eeprom_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp deleted file mode 100644 index 0ad2bb5f1d..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" -#include "../../../../module/stepper/indirection.h" -#include "../../../../feature/tmc_util.h" -#include "../../../../gcode/gcode.h" -#include "../../../../module/planner.h" - -#if BUTTONS_EXIST(EN1, EN2) - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t * buttonEncoderState = NULL; -static lv_obj_t *labelEncoderState = NULL; - -#define ID_ENCODER_RETURN 1 -#define ID_ENCODER_STATE 2 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_ENCODER_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_encoder_settings(); - draw_return_ui(); - } - break; - case ID_ENCODER_STATE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.encoder_enable) { - gCfgItems.encoder_enable = false; - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - lv_label_set_text(labelEncoderState, machine_menu.disable); - update_spi_flash(); - } - else { - gCfgItems.encoder_enable = true; - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelEncoderState, machine_menu.enable); - update_spi_flash(); - } - } - break; - } -} - -void lv_draw_encoder_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelEncoderTips = NULL; - - lv_obj_t * line1 = NULL; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ENCODER_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ENCODER_SETTINGS_UI; - } - disp_state = ENCODER_SETTINGS_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.EncoderConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - labelEncoderTips = lv_label_create(scr, NULL); - lv_obj_set_style(labelEncoderTips, &tft_style_label_rel); - lv_obj_set_pos(labelEncoderTips, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelEncoderTips, machine_menu.EncoderConfText); - - buttonEncoderState = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonEncoderState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); - if (gCfgItems.encoder_enable) { - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - - lv_obj_set_event_cb_mks(buttonEncoderState, event_handler, ID_ENCODER_STATE, NULL, 0); - - lv_imgbtn_set_style(buttonEncoderState, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEncoderState, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonEncoderState, LV_LAYOUT_OFF); - labelEncoderState = lv_label_create(buttonEncoderState, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ENCODER_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.encoder_enable) { - lv_label_set_text(labelEncoderState, machine_menu.enable); - lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); - } - else { - lv_label_set_text(labelEncoderState, machine_menu.disable); - lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonEncoderState); - lv_group_add_obj(g, buttonBack); - } - #endif -} - -void lv_clear_encoder_settings() { - #if HAS_ROTARY_ENCODER - lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // BUTTONS_EXIST(EN1, EN2) - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h deleted file mode 100644 index 62892a6ec1..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_encoder_settings(void); -extern void lv_clear_encoder_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp deleted file mode 100644 index c21ee3612c..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "SPI_TFT.h" - -#include "lv_conf.h" -#include "draw_ui.h" -#include "tft_lvgl_configuration.h" -#include "mks_hardware_test.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" - -static lv_obj_t * scr; - -void lv_draw_error_message(PGM_P const msg) { - #if 0 - static lv_obj_t * message = NULL, *kill_message = NULL, *reset_tips = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ERROR_MESSAGE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ERROR_MESSAGE_UI; - } - disp_state = ERROR_MESSAGE_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - if (msg) { - message = lv_label_create(scr, NULL); - lv_obj_set_style(message, &tft_style_label_rel); - lv_label_set_text(message, msg); - lv_obj_align(message, NULL, LV_ALIGN_CENTER, 0, -50); - } - - kill_message = lv_label_create(scr, NULL); - lv_obj_set_style(kill_message, &tft_style_label_rel); - lv_label_set_text(kill_message, "PRINTER HALTED"); - lv_obj_align(kill_message, NULL, LV_ALIGN_CENTER, 0, -10); - - reset_tips = lv_label_create(scr, NULL); - lv_obj_set_style(reset_tips, &tft_style_label_rel); - lv_label_set_text(reset_tips, "Please Reset"); - lv_obj_align(reset_tips, NULL, LV_ALIGN_CENTER, 0, 30); - - lv_task_handler(); - #endif - - SPI_TFT.LCD_clear(0x0000); - if (msg) disp_string((TFT_WIDTH - strlen(msg) * 16) / 2, 100, msg, 0xFFFF, 0x0000); - disp_string((TFT_WIDTH - strlen("PRINTER HALTED") * 16) / 2, 140, "PRINTER HALTED", 0xFFFF, 0x0000); - disp_string((TFT_WIDTH - strlen("Please Reset") * 16) / 2, 180, "Please Reset", 0xFFFF, 0x0000); -} - -void lv_clear_error_message() { lv_obj_del(scr); } - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h deleted file mode 100644 index 8f64d67f93..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#ifndef PGM_P - #define PGM_P const char * -#endif - -extern void lv_draw_error_message(PGM_P const msg); -extern void lv_clear_error_message(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp deleted file mode 100644 index 543202067f..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ /dev/null @@ -1,403 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../gcode/queue.h" - -static lv_obj_t * scr; -extern lv_group_t* g; -static lv_obj_t * buttoType, *buttonStep, *buttonSpeed; -static lv_obj_t *labelType; -static lv_obj_t *labelStep; -static lv_obj_t *labelSpeed; -static lv_obj_t * tempText; -static lv_obj_t * ExtruText; - -#define ID_E_ADD 1 -#define ID_E_DEC 2 -#define ID_E_TYPE 3 -#define ID_E_STEP 4 -#define ID_E_SPEED 5 -#define ID_E_RETURN 6 - -static int32_t extructAmount; - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_E_ADD: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { - queue.enqueue_now_P(PSTR("G91")); - ZERO(public_buf_l); - sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), uiCfg.extruStep, 60 * uiCfg.extruSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - extructAmount += uiCfg.extruStep; - disp_extru_amount(); - } - } - break; - case ID_E_DEC: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { - queue.enqueue_now_P(PSTR("G91")); - ZERO(public_buf_l); - sprintf_P((char *)public_buf_l, PSTR("G1 E%d F%d"), 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - extructAmount -= uiCfg.extruStep; - disp_extru_amount(); - } - } - break; - case ID_E_TYPE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (ENABLED(HAS_MULTI_EXTRUDER)) { - if (uiCfg.curSprayerChoose == 0) { - uiCfg.curSprayerChoose = 1; - queue.inject_P(PSTR("T1")); - } - else { - uiCfg.curSprayerChoose = 0; - queue.inject_P(PSTR("T0")); - } - } - else - uiCfg.curSprayerChoose = 0; - - extructAmount = 0; - disp_hotend_temp(); - disp_ext_type(); - disp_extru_amount(); - } - break; - case ID_E_STEP: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - switch (abs(uiCfg.extruStep)) { - case 1: uiCfg.extruStep = 5; break; - case 5: uiCfg.extruStep = 10; break; - case 10: uiCfg.extruStep = 1; break; - default: break; - } - disp_ext_step(); - } - break; - case ID_E_SPEED: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - switch (uiCfg.extruSpeed) { - case 1: uiCfg.extruSpeed = 10; break; - case 10: uiCfg.extruSpeed = 20; break; - case 20: uiCfg.extruSpeed = 1; break; - default: break; - } - disp_ext_speed(); - } - break; - case ID_E_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } - break; - } -} - -void lv_draw_extrusion(void) { - lv_obj_t *buttonAdd, *buttonDec, *buttonBack; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EXTRUSION_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = EXTRUSION_UI; - } - disp_state = EXTRUSION_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create image buttons - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttoType = lv_imgbtn_create(scr, NULL); - buttonStep = lv_imgbtn_create(scr, NULL); - buttonSpeed = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_E_ADD, NULL, 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_in.bin"); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_in.bin"); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_E_DEC, NULL, 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_out.bin"); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_out.bin"); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, NULL, 0); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, NULL, 0); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, NULL, 0); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_E_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonSpeed, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); - lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); - labelType = lv_label_create(buttoType, NULL); - labelStep = lv_label_create(buttonStep, NULL); - labelSpeed = lv_label_create(buttonSpeed, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelAdd, extrude_menu.in); - lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelDec, extrude_menu.out); - lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAdd); - lv_group_add_obj(g, buttonDec); - lv_group_add_obj(g, buttoType); - lv_group_add_obj(g, buttonStep); - lv_group_add_obj(g, buttonSpeed); - lv_group_add_obj(g, buttonBack); - } - #endif - - disp_ext_type(); - disp_ext_step(); - disp_ext_speed(); - - tempText = lv_label_create(scr, NULL); - lv_obj_set_style(tempText, &tft_style_label_rel); - disp_hotend_temp(); - - ExtruText = lv_label_create(scr, NULL); - lv_obj_set_style(ExtruText, &tft_style_label_rel); - disp_extru_amount(); -} - -void disp_ext_type() { - if (uiCfg.curSprayerChoose == 1) { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelType, extrude_menu.ext2); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } - else { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelType, extrude_menu.ext1); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } -} - -void disp_ext_speed() { - if (uiCfg.extruSpeed == 20) { - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_high.bin"); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_high.bin"); - } - else if (uiCfg.extruSpeed == 1) { - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_slow.bin"); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_slow.bin"); - } - else { - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_normal.bin"); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_normal.bin"); - } - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.extruSpeed == 20) { - lv_label_set_text(labelSpeed, extrude_menu.high); - lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if (uiCfg.extruSpeed == 1) { - lv_label_set_text(labelSpeed, extrude_menu.low); - lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else { - lv_label_set_text(labelSpeed, extrude_menu.normal); - lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } -} - -void disp_hotend_temp() { - char buf[20] = {0}; - public_buf_l[0] = '\0'; - strcat(public_buf_l, extrude_menu.temper_text); - sprintf(buf, extrude_menu.temp_value, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); - strcat(public_buf_l, buf); - lv_label_set_text(tempText, public_buf_l); - lv_obj_align(tempText, NULL, LV_ALIGN_CENTER, 0, -50); -} - -void disp_extru_amount() { - char buf1[10] = {0}; - - public_buf_l[0] = '\0'; - - if (extructAmount < 999 && extructAmount > -99) { - sprintf(buf1, extrude_menu.count_value_mm, extructAmount); - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, extrude_menu.ext1); - else - strcat(public_buf_l, extrude_menu.ext2); - strcat(public_buf_l, buf1); - } - else if (extructAmount < 9999 && extructAmount > -999) { - sprintf(buf1, extrude_menu.count_value_cm, extructAmount / 10); - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, extrude_menu.ext1); - else - strcat(public_buf_l, extrude_menu.ext2); - strcat(public_buf_l, buf1); - } - else { - sprintf(buf1, extrude_menu.count_value_m, extructAmount / 1000); - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, extrude_menu.ext1); - else - strcat(public_buf_l, extrude_menu.ext2); - strcat(public_buf_l, buf1); - } - - lv_label_set_text(ExtruText, public_buf_l); - lv_obj_align(ExtruText, NULL, LV_ALIGN_CENTER, 0, -75); -} - -void disp_ext_step() { - if (uiCfg.extruStep == 1) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_mm.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_mm.bin"); - } - else if (uiCfg.extruStep == 5) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_mm.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_mm.bin"); - } - else if (uiCfg.extruStep == 10) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_mm.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_mm.bin"); - } - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.extruStep == 1) { - lv_label_set_text(labelStep, extrude_menu.step_1mm); - lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if (uiCfg.extruStep == 5) { - lv_label_set_text(labelStep, extrude_menu.step_5mm); - lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if (uiCfg.extruStep == 10) { - lv_label_set_text(labelStep, extrude_menu.step_10mm); - lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } -} - -void lv_clear_extrusion() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h deleted file mode 100644 index 576cc6c66c..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_extrusion(void); -extern void lv_clear_extrusion(); -extern void disp_ext_type(); -extern void disp_ext_step(); -extern void disp_ext_speed(); -extern void disp_hotend_temp(); -extern void disp_extru_amount(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp deleted file mode 100644 index 8cdc14964f..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../../MarlinCore.h" -#include "lv_conf.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" -#include "../../../../../Configuration.h" -#include "draw_ui.h" -#include "../../../../module/temperature.h" -#include "../../../../gcode/queue.h" -#include "../../../../gcode/gcode.h" - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t * fanText; - -#define ID_F_ADD 1 -#define ID_F_DEC 2 -#define ID_F_HIGH 3 -#define ID_F_MID 4 -#define ID_F_OFF 5 -#define ID_F_RETURN 6 - -static uint8_t fanSpeed; - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_F_ADD: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (fanSpeed + 1 <= 255) { - fanSpeed++; - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); - gcode.process_subcommands_now(public_buf_l); - } - } - break; - case ID_F_DEC: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (fanSpeed > 0) { - fanSpeed--; - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); - gcode.process_subcommands_now(public_buf_l); - } - } - - break; - case ID_F_HIGH: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - gcode.process_subcommands_now_P(PSTR("M106 S255")); - } - break; - case ID_F_MID: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - gcode.process_subcommands_now_P(PSTR("M106 S127")); - } - break; - case ID_F_OFF: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - gcode.process_subcommands_now_P(PSTR("M107")); - } - break; - case ID_F_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } - break; - } -} - -void lv_draw_fan(void) { - lv_obj_t *buttonAdd, *buttonDec, *buttonHigh, *buttonMid; - lv_obj_t *buttonOff, *buttonBack; - - #if HAS_FAN - fanSpeed = thermalManager.fan_speed[0]; - #endif - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FAN_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = FAN_UI; - } - disp_state = FAN_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create an Image button - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttonHigh = lv_imgbtn_create(scr, NULL); - buttonMid = lv_imgbtn_create(scr, NULL); - buttonOff = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_F_ADD, NULL, 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_F_DEC, NULL, 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHigh, event_handler,ID_F_HIGH, NULL,0); - lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_REL, "F:/bmp_speed255.bin"); - lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_PR, "F:/bmp_speed255.bin"); - lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMid, event_handler,ID_F_MID, NULL,0); - lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_REL, "F:/bmp_speed127.bin"); - lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_PR, "F:/bmp_speed127.bin"); - lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOff, event_handler,ID_F_OFF, NULL,0); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, "F:/bmp_speed0.bin"); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, "F:/bmp_speed0.bin"); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_F_RETURN, NULL,0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif - - lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonHigh, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonMid, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHigh, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMid, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); - lv_obj_t *labelHigh = lv_label_create(buttonHigh, NULL); - lv_obj_t *labelMid = lv_label_create(buttonMid, NULL); - lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelAdd, fan_menu.add); - lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelDec, fan_menu.dec); - lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelHigh, fan_menu.full); - lv_obj_align(labelHigh, buttonHigh, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelMid, fan_menu.half); - lv_obj_align(labelMid, buttonMid, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOff, fan_menu.off); - lv_obj_align(labelOff, buttonOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAdd); - lv_group_add_obj(g, buttonDec); - lv_group_add_obj(g, buttonHigh); - lv_group_add_obj(g, buttonMid); - lv_group_add_obj(g, buttonOff); - lv_group_add_obj(g, buttonBack); - } - #endif - - fanText = lv_label_create(scr, NULL); - lv_obj_set_style(fanText, &tft_style_label_rel); - disp_fan_value(); -} - -void disp_fan_value() { - char buf1[10] = {0}; - public_buf_l[0] = '\0'; - strcat(public_buf_l, fan_menu.state); - strcat_P(public_buf_l, PSTR(": ")); - sprintf_P(buf1, PSTR("%3d"), thermalManager.fan_speed[0]); - strcat(public_buf_l, buf1); - lv_label_set_text(fanText, public_buf_l); - lv_obj_align(fanText, NULL, LV_ALIGN_CENTER, 0, -65); -} - -void lv_clear_fan() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h deleted file mode 100644 index 602d02c6c0..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_fan(void); -extern void lv_clear_fan(); -extern void disp_fan_value(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp deleted file mode 100644 index 83f9e53677..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../gcode/queue.h" -#include "../../../../gcode/gcode.h" -#include "../../../../module/motion.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t *buttoType; -static lv_obj_t *labelType; -static lv_obj_t * tempText1; - -#define ID_FILAMNT_IN 1 -#define ID_FILAMNT_OUT 2 -#define ID_FILAMNT_TYPE 3 -#define ID_FILAMNT_RETURN 4 - -extern feedRate_t feedrate_mm_s; - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_FILAMNT_IN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.filament_load_heat_flg = 1; - if ((abs(thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius) <= 1) - || (gCfgItems.filament_limit_temper <= thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) { - lv_clear_filament_change(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); - } - else { - lv_clear_filament_change(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_HEAT); - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); - } - } - } - break; - case ID_FILAMNT_OUT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.filament_unload_heat_flg=1; - if ((thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > 0) - && ((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= gCfgItems.filament_limit_temper)) - ) { - lv_clear_filament_change(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); - } - else { - lv_clear_filament_change(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_HEAT); - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); - } - filament_sprayer_temp(); - } - } - break; - case ID_FILAMNT_TYPE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if HAS_MULTI_EXTRUDER - if (uiCfg.curSprayerChoose == 0) - uiCfg.curSprayerChoose = 1; - else if (uiCfg.curSprayerChoose == 1) - uiCfg.curSprayerChoose = 0; - #endif - disp_filament_type(); - } - break; - case ID_FILAMNT_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if HAS_MULTI_EXTRUDER - if (uiCfg.print_state != IDLE && uiCfg.print_state != REPRINTED) - gcode.process_subcommands_now_P(uiCfg.curSprayerChoose_bak == 1 ? PSTR("T1") : PSTR("T0")); - #endif - feedrate_mm_s = (float)uiCfg.moveSpeed_bak; - if (uiCfg.print_state == PAUSED) - planner.set_e_position_mm((destination.e = current_position.e = uiCfg.current_e_position_bak)); - //current_position.e = destination.e = uiCfg.current_e_position_bak; - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; - - clear_cur_ui(); - draw_return_ui(); - } - break; - } -} - -void lv_draw_filament_change(void) { - lv_obj_t *buttonIn, *buttonOut; - lv_obj_t *buttonBack; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENTCHANGE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENTCHANGE_UI; - } - disp_state = FILAMENTCHANGE_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create an Image button - buttonIn = lv_imgbtn_create(scr, NULL); - buttonOut = lv_imgbtn_create(scr, NULL); - buttoType = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonIn, event_handler, ID_FILAMNT_IN, NULL, 0); - lv_imgbtn_set_src(buttonIn, LV_BTN_STATE_REL, "F:/bmp_in.bin"); - lv_imgbtn_set_src(buttonIn, LV_BTN_STATE_PR, "F:/bmp_in.bin"); - lv_imgbtn_set_style(buttonIn, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonIn, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonIn, LV_PROTECT_FOLLOW); - - lv_obj_set_event_cb_mks(buttonOut, event_handler, ID_FILAMNT_OUT, NULL, 0); - lv_imgbtn_set_src(buttonOut, LV_BTN_STATE_REL, "F:/bmp_out.bin"); - lv_imgbtn_set_src(buttonOut, LV_BTN_STATE_PR, "F:/bmp_out.bin"); - lv_imgbtn_set_style(buttonOut, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOut, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_FILAMNT_TYPE, NULL, 0); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FILAMNT_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonIn, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonOut, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonIn, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOut, LV_LAYOUT_OFF); - lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelIn = lv_label_create(buttonIn, NULL); - lv_obj_t *labelOut = lv_label_create(buttonOut, NULL); - labelType = lv_label_create(buttoType, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelIn, filament_menu.in); - lv_obj_align(labelIn, buttonIn, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOut, filament_menu.out); - lv_obj_align(labelOut, buttonOut, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonIn); - lv_group_add_obj(g, buttonOut); - lv_group_add_obj(g, buttoType); - lv_group_add_obj(g, buttonBack); - } - #endif - - disp_filament_type(); - - tempText1 = lv_label_create(scr, NULL); - lv_obj_set_style(tempText1, &tft_style_label_rel); - disp_filament_temp(); -} - -void disp_filament_type() { - if (uiCfg.curSprayerChoose == 1) { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelType, preheat_menu.ext2); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } - else { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelType, preheat_menu.ext1); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } -} - -void disp_filament_temp() { - char buf[20] = {0}; - - public_buf_l[0] = '\0'; - - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, preheat_menu.ext1); - else - strcat(public_buf_l, preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); - - strcat_P(public_buf_l, PSTR(": ")); - strcat(public_buf_l, buf); - lv_label_set_text(tempText1, public_buf_l); - lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50); -} - -void lv_clear_filament_change() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h deleted file mode 100644 index b0068f7f0f..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_filament_change(void); -extern void lv_clear_filament_change(); -extern void disp_filament_type(); -extern void disp_filament_temp(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp deleted file mode 100644 index 06ab35f3f0..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ /dev/null @@ -1,329 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_FILAMENT_SET_RETURN 1 -#define ID_FILAMENT_SET_IN_LENGTH 2 -#define ID_FILAMENT_SET_IN_SPEED 3 -#define ID_FILAMENT_SET_OUT_LENGTH 4 -#define ID_FILAMENT_SET_OUT_SPEED 5 -#define ID_FILAMENT_SET_TEMP 6 -#define ID_FILAMENT_SET_DOWN 12 -#define ID_FILAMENT_SET_UP 13 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_FILAMENT_SET_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_filament_settings(); - draw_return_ui(); - } - break; - case ID_FILAMENT_SET_IN_LENGTH: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = load_length; - lv_clear_filament_settings(); - lv_draw_number_key(); - } - break; - case ID_FILAMENT_SET_IN_SPEED: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = load_speed; - lv_clear_filament_settings(); - lv_draw_number_key(); - } - break; - case ID_FILAMENT_SET_OUT_LENGTH: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = unload_length; - lv_clear_filament_settings(); - lv_draw_number_key(); - } - break; - case ID_FILAMENT_SET_OUT_SPEED: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = unload_speed; - lv_clear_filament_settings(); - lv_draw_number_key(); - } - break; - case ID_FILAMENT_SET_TEMP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = filament_temp; - lv_clear_filament_settings(); - lv_draw_number_key(); - } - break; - case ID_FILAMENT_SET_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_filament_settings(); - lv_draw_filament_settings(); - } - break; - case ID_FILAMENT_SET_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_filament_settings(); - lv_draw_filament_settings(); - } - break; - } -} - -void lv_draw_filament_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelInLengthText = NULL, *buttonInLengthValue = NULL, *labelInLengthValue = NULL; - lv_obj_t *labelInSpeedText = NULL, *buttonInSpeedValue = NULL, *labelInSpeedValue = NULL; - lv_obj_t *labelOutLengthText = NULL, *buttonOutLengthValue = NULL, *labelOutLengthValue = NULL; - lv_obj_t *labelOutSpeedText = NULL, *buttonOutSpeedValue = NULL, *labelOutSpeedValue = NULL; - lv_obj_t *labelTemperText = NULL, *buttonTemperValue = NULL, *labelTemperValue = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENT_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENT_SETTINGS_UI; - } - disp_state = FILAMENT_SETTINGS_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.FilamentConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - if (uiCfg.para_ui_page != 1) { - labelInLengthText = lv_label_create(scr, NULL); - lv_obj_set_style(labelInLengthText, &tft_style_label_rel); - lv_obj_set_pos(labelInLengthText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelInLengthText, machine_menu.InLength); - - buttonInLengthValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonInLengthValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonInLengthValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonInLengthValue, event_handler, ID_FILAMENT_SET_IN_LENGTH, NULL, 0); - lv_btn_set_style(buttonInLengthValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonInLengthValue, LV_BTN_STYLE_PR, &style_para_value); - labelInLengthValue = lv_label_create(buttonInLengthValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelInSpeedText = lv_label_create(scr, NULL); - lv_obj_set_style(labelInSpeedText, &tft_style_label_rel); - lv_obj_set_pos(labelInSpeedText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelInSpeedText, machine_menu.InSpeed); - - buttonInSpeedValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonInSpeedValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonInSpeedValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonInSpeedValue, event_handler, ID_FILAMENT_SET_IN_SPEED, NULL, 0); - lv_btn_set_style(buttonInSpeedValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonInSpeedValue, LV_BTN_STYLE_PR, &style_para_value); - labelInSpeedValue = lv_label_create(buttonInSpeedValue, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelOutLengthText = lv_label_create(scr, NULL); - lv_obj_set_style(labelOutLengthText, &tft_style_label_rel); - lv_obj_set_pos(labelOutLengthText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 6); - lv_label_set_text(labelOutLengthText, machine_menu.OutLength); - - buttonOutLengthValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonOutLengthValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonOutLengthValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonOutLengthValue, event_handler, ID_FILAMENT_SET_OUT_LENGTH, NULL, 0); - lv_btn_set_style(buttonOutLengthValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonOutLengthValue, LV_BTN_STYLE_PR, &style_para_value); - labelOutLengthValue = lv_label_create(buttonOutLengthValue, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - labelOutSpeedText = lv_label_create(scr, NULL); - lv_obj_set_style(labelOutSpeedText, &tft_style_label_rel); - lv_obj_set_pos(labelOutSpeedText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelOutSpeedText, machine_menu.OutSpeed); - - buttonOutSpeedValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonOutSpeedValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonOutSpeedValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonOutSpeedValue, event_handler, ID_FILAMENT_SET_OUT_SPEED, NULL, 0); - lv_btn_set_style(buttonOutSpeedValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonOutSpeedValue, LV_BTN_STYLE_PR, &style_para_value); - labelOutSpeedValue = lv_label_create(buttonOutSpeedValue, NULL); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FILAMENT_SET_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonInLengthValue); - lv_group_add_obj(g, buttonInSpeedValue); - lv_group_add_obj(g, buttonOutLengthValue); - lv_group_add_obj(g, buttonOutSpeedValue); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - else { - labelTemperText = lv_label_create(scr, NULL); - lv_obj_set_style(labelTemperText, &tft_style_label_rel); - lv_obj_set_pos(labelTemperText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelTemperText, machine_menu.FilamentTemperature); - - buttonTemperValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonTemperValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonTemperValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonTemperValue, event_handler, ID_FILAMENT_SET_TEMP, NULL, 0); - lv_btn_set_style(buttonTemperValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonTemperValue, LV_BTN_STYLE_PR, &style_para_value); - labelTemperValue = lv_label_create(buttonTemperValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FILAMENT_SET_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonTemperValue); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FILAMENT_SET_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.para_ui_page != 1) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); - lv_label_set_text(labelInLengthValue, public_buf_l); - lv_obj_align(labelInLengthValue, buttonInLengthValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_speed); - lv_label_set_text(labelInSpeedValue, public_buf_l); - lv_obj_align(labelInSpeedValue, buttonInSpeedValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_length); - lv_label_set_text(labelOutLengthValue, public_buf_l); - lv_obj_align(labelOutLengthValue, buttonOutLengthValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_speed); - lv_label_set_text(labelOutSpeedValue, public_buf_l); - lv_obj_align(labelOutSpeedValue, buttonOutSpeedValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - } - else { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temper); - lv_label_set_text(labelTemperValue, public_buf_l); - lv_obj_align(labelTemperValue, buttonTemperValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_filament_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h deleted file mode 100644 index a5ae542895..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_filament_settings(void); -extern void lv_clear_filament_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp deleted file mode 100644 index 22e05f0e00..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../../MarlinCore.h" -#include "draw_ready_print.h" -#include "draw_set.h" -#include "lv_conf.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" -#include "../../../../gcode/queue.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_H_ALL 1 -#define ID_H_X 2 -#define ID_H_Y 3 -#define ID_H_Z 4 -#define ID_H_RETURN 5 -#define ID_H_OFF_ALL 6 -#define ID_H_OFF_XY 7 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_H_ALL: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("G28")); - } - break; - case ID_H_X: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("G28 X0")); - } - break; - case ID_H_Y: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("G28 Y0")); - } - break; - case ID_H_Z: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("G28 Z0")); - } - break; - case ID_H_OFF_ALL: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("M84")); - } - break; - case ID_H_OFF_XY: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - queue.inject_P(PSTR("M84 X Y")); - } - break; - case ID_H_RETURN: - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_home(); - lv_draw_tool(); - } - break; - } -} - -void lv_draw_home(void) { - lv_obj_t *buttonHomeAll, *buttonHomeX, *buttonHomeY, *buttonHomeZ; - lv_obj_t *buttonBack; - lv_obj_t *buttonOffAll, *buttonOffXY; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ZERO_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = ZERO_UI; - } - disp_state = ZERO_UI; - - scr = lv_obj_create(NULL, NULL); - - //static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create image buttons - //buttonWifi = lv_imgbtn_create(scr, NULL); - buttonHomeAll = lv_imgbtn_create(scr, NULL); - buttonHomeX = lv_imgbtn_create(scr, NULL); - //buttonContinue = lv_imgbtn_create(scr, NULL); - buttonHomeY = lv_imgbtn_create(scr, NULL); - buttonHomeZ = lv_imgbtn_create(scr, NULL); - buttonOffAll = lv_imgbtn_create(scr, NULL); - buttonOffXY = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - #if 1 - lv_obj_set_event_cb_mks(buttonHomeAll, event_handler,ID_H_ALL, NULL,0); - lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_REL, "F:/bmp_zeroAll.bin"); - lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_PR, "F:/bmp_zeroAll.bin"); - lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHomeX, event_handler, ID_H_X, NULL, 0); - lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_REL, "F:/bmp_zeroX.bin"); - lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_PR, "F:/bmp_zeroX.bin"); - lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHomeY, event_handler, ID_H_Y, NULL, 0); - lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_REL, "F:/bmp_zeroY.bin"); - lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_PR, "F:/bmp_zeroY.bin"); - lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHomeZ, event_handler, ID_H_Z, NULL, 0); - lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_REL, "F:/bmp_zeroZ.bin"); - lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_PR, "F:/bmp_zeroZ.bin"); - lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOffAll, event_handler,ID_H_OFF_ALL, NULL,0); - lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); - lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); - lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOffXY, event_handler,ID_H_OFF_XY, NULL,0); - lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); - lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); - lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_H_RETURN, NULL,0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonHomeAll, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonHomeX, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonHomeY, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonHomeZ, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonOffAll, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonOffXY, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonHomeAll, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHomeX, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHomeY, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHomeZ, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOffAll, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOffXY, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelHomeAll = lv_label_create(buttonHomeAll, NULL); - lv_obj_t *labelHomeX = lv_label_create(buttonHomeX, NULL); - lv_obj_t *labelHomeY = lv_label_create(buttonHomeY, NULL); - lv_obj_t *labelHomeZ = lv_label_create(buttonHomeZ, NULL); - lv_obj_t *labelOffAll = lv_label_create(buttonOffAll, NULL); - lv_obj_t *labelOffXY = lv_label_create(buttonOffXY, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelHomeAll, home_menu.home_all); - lv_obj_align(labelHomeAll, buttonHomeAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelHomeX, home_menu.home_x); - lv_obj_align(labelHomeX, buttonHomeX, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelHomeY, home_menu.home_y); - lv_obj_align(labelHomeY, buttonHomeY, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelHomeZ, home_menu.home_z); - lv_obj_align(labelHomeZ, buttonHomeZ, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOffAll, set_menu.motoroff); - lv_obj_align(labelOffAll, buttonOffAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOffXY, set_menu.motoroffXY); - lv_obj_align(labelOffXY, buttonOffXY, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonHomeAll); - lv_group_add_obj(g, buttonHomeX); - lv_group_add_obj(g, buttonHomeY); - lv_group_add_obj(g, buttonHomeZ); - lv_group_add_obj(g, buttonOffAll); - lv_group_add_obj(g, buttonOffXY); - lv_group_add_obj(g, buttonBack); - } - #endif -} - -void lv_clear_home() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h deleted file mode 100644 index c5060127a8..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_home(void); -extern void lv_clear_home(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp deleted file mode 100644 index d22eeb157e..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" -#include "../../../../module/probe.h" - -#if USE_SENSORLESS -#include "../../../../module/stepper/indirection.h" -#include "../../../../feature/tmc_util.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_SENSITIVITY_RETURN 1 -#define ID_SENSITIVITY_X 2 -#define ID_SENSITIVITY_Y 3 -#define ID_SENSITIVITY_Z 4 -#define ID_SENSITIVITY_Z2 5 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_SENSITIVITY_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_homing_sensitivity_settings(); - draw_return_ui(); - } - break; - case ID_SENSITIVITY_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = x_sensitivity; - lv_clear_homing_sensitivity_settings(); - lv_draw_number_key(); - } - break; - case ID_SENSITIVITY_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = y_sensitivity; - lv_clear_homing_sensitivity_settings(); - lv_draw_number_key(); - } - break; - case ID_SENSITIVITY_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = z_sensitivity; - lv_clear_homing_sensitivity_settings(); - lv_draw_number_key(); - } - break; - #if Z2_SENSORLESS - case ID_SENSITIVITY_Z2: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = z2_sensitivity; - lv_clear_homing_sensitivity_settings(); - lv_draw_number_key(); - } - break; - #endif - } -} - -void lv_draw_homing_sensitivity_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; - #if Z2_SENSORLESS - lv_obj_t *labelZ2Text = NULL, *buttonZ2Value = NULL, *labelZ2Value = NULL; - lv_obj_t * line4 = NULL; - #endif - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != HOMING_SENSITIVITY_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = HOMING_SENSITIVITY_UI; - } - disp_state = HOMING_SENSITIVITY_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.HomingSensitivityConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.X_Sensitivity); - - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_SENSITIVITY_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXValue); - #endif - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Y_Sensitivity); - - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_SENSITIVITY_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYValue); - #endif - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Sensitivity); - - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_SENSITIVITY_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) lv_group_add_obj(g, buttonZValue); - #endif - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - #if Z2_SENSORLESS - labelZ2Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelZ2Text, &tft_style_label_rel); - lv_obj_set_pos(labelZ2Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelZ2Text, machine_menu.Z2_Sensitivity); - - buttonZ2Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZ2Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonZ2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZ2Value, event_handler, ID_SENSITIVITY_Z2, NULL, 0); - lv_btn_set_style(buttonZ2Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZ2Value, LV_BTN_STYLE_PR, &style_para_value); - labelZ2Value = lv_label_create(buttonZ2Value, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZ2Value); - #endif - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - #endif - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_SENSITIVITY_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language != 0) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - #if Z2_SENSORLESS - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); - lv_label_set_text(labelZ2Value, public_buf_l); - lv_obj_align(labelZ2Value, buttonZ2Value, LV_ALIGN_CENTER, 0, 0); - #endif - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_homing_sensitivity_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // USE_SENSORLESS - -#endif // HAS_TFT_LVGL_UI && USE_SENSORLESS diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h deleted file mode 100644 index 0c554702b1..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_homing_sensitivity_settings(void); -extern void lv_clear_homing_sensitivity_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp deleted file mode 100644 index 8c359233e6..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_TFT_LVGL_UI, HAS_CLASSIC_JERK) - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_JERK_RETURN 1 -#define ID_JERK_X 2 -#define ID_JERK_Y 3 -#define ID_JERK_Z 4 -#define ID_JERK_E 5 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_JERK_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_jerk_settings(); - draw_return_ui(); - } - break; - case ID_JERK_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = XJerk; - lv_clear_jerk_settings(); - lv_draw_number_key(); - } - break; - case ID_JERK_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = YJerk; - lv_clear_jerk_settings(); - lv_draw_number_key(); - } - break; - case ID_JERK_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = ZJerk; - lv_clear_jerk_settings(); - lv_draw_number_key(); - } - break; - case ID_JERK_E: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = EJerk; - lv_clear_jerk_settings(); - lv_draw_number_key(); - } - break; - } -} - -void lv_draw_jerk_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelEText = NULL, *buttonEValue = NULL, *labelEValue = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != JERK_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = JERK_UI; - } - disp_state = JERK_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.JerkConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.X_Jerk); - - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_JERK_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Y_Jerk); - - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_JERK_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Jerk); - - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_JERK_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - labelEText = lv_label_create(scr, NULL); - lv_obj_set_style(labelEText, &tft_style_label_rel); - lv_obj_set_pos(labelEText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelEText, machine_menu.E_Jerk); - - buttonEValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonEValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonEValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonEValue, event_handler, ID_JERK_E, NULL, 0); - lv_btn_set_style(buttonEValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonEValue, LV_BTN_STYLE_PR, &style_para_value); - labelEValue = lv_label_create(buttonEValue, NULL); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_JERK_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonEValue); - lv_group_add_obj(g, buttonBack); - } - #endif - - if (gCfgItems.multiple_language != 0) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[X_AXIS]); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.max_jerk[E_AXIS]); - lv_label_set_text(labelEValue, public_buf_l); - lv_obj_align(labelEValue, buttonEValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_jerk_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI && HAS_CLASSIC_JERK diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h deleted file mode 100644 index 0531dae9da..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_jerk_settings(void); -extern void lv_clear_jerk_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp deleted file mode 100644 index 902472b884..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../../Configuration.h" -#include "../../../../MarlinCore.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define LV_KB_CTRL_BTN_FLAGS (LV_BTNM_CTRL_NO_REPEAT | LV_BTNM_CTRL_CLICK_TRIG) - -static const char * kb_map_lc[] = {"1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n", - "ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n", - "_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n", - LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; - -static const lv_btnm_ctrl_t kb_ctrl_lc_map[] = { - LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, - LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; - -static const char * kb_map_uc[] = {"1#", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", LV_SYMBOL_BACKSPACE, "\n", - "abc", "A", "S", "D", "F", "G", "H", "J", "K", "L", LV_SYMBOL_NEW_LINE, "\n", - "_", "-", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n", - LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; - -static const lv_btnm_ctrl_t kb_ctrl_uc_map[] = { - LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, - LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; - -static const char * kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", - "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", - "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", - LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; - -static const lv_btnm_ctrl_t kb_ctrl_spec_map[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, - LV_KB_CTRL_BTN_FLAGS | 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; - -static const lv_btnm_ctrl_t kb_ctrl_num_map[] = { - 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, - 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, - 1, 1, 1, 2, - 1, 1, 1, 1, 1}; - -static void lv_kb_event_cb(lv_obj_t * kb, lv_event_t event) { - //LV_ASSERT_OBJ(kb, LV_OBJX_NAME); - - if (event != LV_EVENT_VALUE_CHANGED) return; - - lv_kb_ext_t * ext = (lv_kb_ext_t * )lv_obj_get_ext_attr(kb); - const uint16_t btn_id = lv_btnm_get_active_btn(kb); - if (btn_id == LV_BTNM_BTN_NONE) return; - if (lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_HIDDEN | LV_BTNM_CTRL_INACTIVE)) return; - if (lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_NO_REPEAT) && event == LV_EVENT_LONG_PRESSED_REPEAT) return; - - const char * txt = lv_btnm_get_active_btn_text(kb); - if (txt == NULL) return; - - // Do the corresponding action according to the text of the button - if (strcmp(txt, "abc") == 0) { - lv_btnm_set_map(kb, kb_map_lc); - lv_btnm_set_ctrl_map(kb, kb_ctrl_lc_map); - return; - } - else if (strcmp(txt, "ABC") == 0) { - lv_btnm_set_map(kb, kb_map_uc); - lv_btnm_set_ctrl_map(kb, kb_ctrl_uc_map); - return; - } - else if (strcmp(txt, "1#") == 0) { - lv_btnm_set_map(kb, kb_map_spec); - lv_btnm_set_ctrl_map(kb, kb_ctrl_spec_map); - return; - } - else if (strcmp(txt, LV_SYMBOL_CLOSE) == 0) { - if (kb->event_cb != lv_kb_def_event_cb) { - //lv_res_t res = lv_event_send(kb, LV_EVENT_CANCEL, NULL); - //if (res != LV_RES_OK) return; - lv_clear_keyboard(); - draw_return_ui(); - } - else { - lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ - lv_obj_del(kb); - return; - } - return; - } - else if (strcmp(txt, LV_SYMBOL_OK) == 0) { - if (kb->event_cb != lv_kb_def_event_cb) { - //lv_res_t res = lv_event_send(kb, LV_EVENT_APPLY, NULL); - //if (res != LV_RES_OK) return; - const char * ret_ta_txt = lv_ta_get_text(ext->ta); - switch (keyboard_value) { - #if ENABLED(USE_WIFI_FUNCTION) - case wifiName: - memcpy(uiCfg.wifi_name,ret_ta_txt,sizeof(uiCfg.wifi_name)); - lv_clear_keyboard(); - draw_return_ui(); - break; - case wifiPassWord: - memcpy(uiCfg.wifi_key,ret_ta_txt,sizeof(uiCfg.wifi_name)); - lv_clear_keyboard(); - draw_return_ui(); - break; - case wifiConfig: - memset((void *)uiCfg.wifi_name, 0, sizeof(uiCfg.wifi_name)); - memcpy((void *)uiCfg.wifi_name, wifi_list.wifiName[wifi_list.nameIndex], 32); - - memset((void *)uiCfg.wifi_key, 0, sizeof(uiCfg.wifi_key)); - memcpy((void *)uiCfg.wifi_key, ret_ta_txt, sizeof(uiCfg.wifi_key)); - - gCfgItems.wifi_mode_sel = STA_MODEL; - - package_to_wifi(WIFI_PARA_SET, (char *)0, 0); - - memset(public_buf_l,0,sizeof(public_buf_l)); - - public_buf_l[0] = 0xA5; - public_buf_l[1] = 0x09; - public_buf_l[2] = 0x01; - public_buf_l[3] = 0x00; - public_buf_l[4] = 0x01; - public_buf_l[5] = 0xFC; - public_buf_l[6] = 0x00; - raw_send_to_wifi(public_buf_l, 6); - - last_disp_state = KEY_BOARD_UI; - lv_clear_keyboard(); - wifi_tips_type = TIPS_TYPE_JOINING; - lv_draw_wifi_tips(); - break; - #endif // USE_WIFI_FUNCTION - case gcodeCommand: - uint8_t buf[100]; - strncpy((char *)buf,ret_ta_txt,sizeof(buf)); - update_gcode_command(AUTO_LEVELING_COMMAND_ADDR,buf); - lv_clear_keyboard(); - draw_return_ui(); - break; - default: break; - } - } - else { - lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ - } - return; - } - - /*Add the characters to the text area if set*/ - if (ext->ta == NULL) return; - - if (strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) - lv_ta_add_char(ext->ta, '\n'); - else if (strcmp(txt, LV_SYMBOL_LEFT) == 0) - lv_ta_cursor_left(ext->ta); - else if (strcmp(txt, LV_SYMBOL_RIGHT) == 0) - lv_ta_cursor_right(ext->ta); - else if (strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) - lv_ta_del_char(ext->ta); - else if (strcmp(txt, "+/-") == 0) { - uint16_t cur = lv_ta_get_cursor_pos(ext->ta); - const char * ta_txt = lv_ta_get_text(ext->ta); - if (ta_txt[0] == '-') { - lv_ta_set_cursor_pos(ext->ta, 1); - lv_ta_del_char(ext->ta); - lv_ta_add_char(ext->ta, '+'); - lv_ta_set_cursor_pos(ext->ta, cur); - } - else if (ta_txt[0] == '+') { - lv_ta_set_cursor_pos(ext->ta, 1); - lv_ta_del_char(ext->ta); - lv_ta_add_char(ext->ta, '-'); - lv_ta_set_cursor_pos(ext->ta, cur); - } - else { - lv_ta_set_cursor_pos(ext->ta, 0); - lv_ta_add_char(ext->ta, '-'); - lv_ta_set_cursor_pos(ext->ta, cur + 1); - } - } - else { - lv_ta_add_text(ext->ta, txt); - } -} - -void lv_draw_keyboard() { - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != KEY_BOARD_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = KEY_BOARD_UI; - } - disp_state = KEY_BOARD_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - /*Create styles for the keyboard*/ - static lv_style_t rel_style, pr_style; - - lv_style_copy(&rel_style, &lv_style_btn_rel); - rel_style.body.radius = 0; - rel_style.body.border.width = 1; - rel_style.body.main_color = lv_color_make(0xA9, 0x62, 0x1D); - rel_style.body.grad_color = lv_color_make(0xA7, 0x59, 0x0E); - - lv_style_copy(&pr_style, &lv_style_btn_pr); - pr_style.body.radius = 0; - pr_style.body.border.width = 1; - pr_style.body.main_color = lv_color_make(0x72, 0x42, 0x15); - pr_style.body.grad_color = lv_color_make(0x6A, 0x3A, 0x0C); - - /*Create a keyboard and apply the styles*/ - lv_obj_t *kb = lv_kb_create(scr, NULL); - lv_obj_set_event_cb(kb, lv_kb_event_cb); - lv_kb_set_cursor_manage(kb, true); - lv_kb_set_style(kb, LV_KB_STYLE_BG, &lv_style_transp_tight); - lv_kb_set_style(kb, LV_KB_STYLE_BTN_REL, &rel_style); - lv_kb_set_style(kb, LV_KB_STYLE_BTN_PR, &pr_style); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - //lv_group_add_obj(g, kb); - //lv_group_set_editing(g, true); - } - #endif - - /*Create a text area. The keyboard will write here*/ - lv_obj_t *ta = lv_ta_create(scr, NULL); - lv_obj_align(ta, NULL, LV_ALIGN_IN_TOP_MID, 0, 10); - if (keyboard_value == gcodeCommand) { - get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); - public_buf_m[sizeof(public_buf_m)-1] = 0; - lv_ta_set_text(ta, public_buf_m); - } - else { - lv_ta_set_text(ta, ""); - } - - /*Assign the text area to the keyboard*/ - lv_kb_set_ta(kb, ta); -} - -void lv_clear_keyboard() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { /* lv_group_remove_all_objs(g); */ } - #endif - lv_obj_del(scr); -} - - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h deleted file mode 100644 index 0013dc4030..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_keyboard(); -extern void lv_clear_keyboard(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp deleted file mode 100644 index 3e4ad06477..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp +++ /dev/null @@ -1,401 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include - -//static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn; - -#define ID_CN 1 -#define ID_T_CN 2 -#define ID_EN 3 -#define ID_RU 4 -#define ID_ES 5 -#define ID_FR 6 -#define ID_IT 7 -#define ID_L_RETURN 8 - -#define SELECTED 1 -#define UNSELECTED 0 - -static void disp_language(uint8_t language, uint8_t state); - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t *buttonCN, *buttonT_CN, *buttonEN, *buttonRU; -static lv_obj_t *buttonES, *buttonFR, *buttonIT, *buttonBack; - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_CN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, "F:/bmp_simplified_cn_sel.bin"); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, "F:/bmp_simplified_cn_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonCN); - gCfgItems.language = LANG_SIMPLE_CHINESE; - update_spi_flash(); - disp_language_init(); - } - break; - case ID_T_CN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, "F:/bmp_traditional_cn_sel.bin"); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, "F:/bmp_traditional_cn_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonT_CN); - gCfgItems.language = LANG_COMPLEX_CHINESE; - update_spi_flash(); - disp_language_init(); - } - break; - case ID_EN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, "F:/bmp_english_sel.bin"); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, "F:/bmp_english_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonEN); - gCfgItems.language = LANG_ENGLISH; - update_spi_flash(); - disp_language_init(); - } - break; - case ID_RU: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, "F:/bmp_russian_sel.bin"); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, "F:/bmp_russian_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonRU); - gCfgItems.language = LANG_RUSSIAN; - update_spi_flash(); - disp_language_init(); - } - break; - case ID_ES: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, "F:/bmp_spanish_sel.bin"); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, "F:/bmp_spanish_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonES); - gCfgItems.language = LANG_SPANISH; - update_spi_flash(); - disp_language_init(); - } - break; - case ID_FR: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, "F:/bmp_french_sel.bin"); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, "F:/bmp_french_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonFR); - gCfgItems.language = LANG_FRENCH; - update_spi_flash(); - disp_language_init(); - } - break; - case ID_IT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - disp_language(gCfgItems.language, UNSELECTED); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, "F:/bmp_italy_sel.bin"); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, "F:/bmp_italy_sel.bin"); - lv_obj_refresh_ext_draw_pad(buttonIT); - gCfgItems.language = LANG_ITALY; - update_spi_flash(); - disp_language_init(); - } - break; - case ID_L_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - - buttonCN = NULL; - buttonT_CN = NULL; - buttonEN = NULL; - buttonRU = NULL; - buttonES = NULL; - buttonFR = NULL; - buttonFR = NULL; - buttonIT = NULL; - buttonBack = NULL; - lv_clear_language(); - lv_draw_set(); - } - break; - - } -} - -static void disp_language(uint8_t language, uint8_t state) { - uint16_t id; - lv_obj_t *obj; - - public_buf_l[0] = '\0'; - - switch (language) { - case LANG_SIMPLE_CHINESE: - id = ID_CN; - strcpy_P(public_buf_l, PSTR("F:/bmp_simplified_cn")); - obj = buttonCN; - break; - case LANG_COMPLEX_CHINESE: - id = ID_T_CN; - strcpy_P(public_buf_l, PSTR("F:/bmp_traditional_cn")); - obj = buttonT_CN; - break; - case LANG_ENGLISH: - id = ID_EN; - strcpy_P(public_buf_l, PSTR("F:/bmp_english")); - obj = buttonEN; - break; - case LANG_RUSSIAN: - id = ID_RU; - strcpy_P(public_buf_l, PSTR("F:/bmp_russian")); - obj = buttonRU; - break; - case LANG_SPANISH: - id = ID_ES; - strcpy_P(public_buf_l, PSTR("F:/bmp_spanish")); - obj = buttonES; - break; - case LANG_FRENCH: - id = ID_FR; - strcpy_P(public_buf_l, PSTR("F:/bmp_french")); - obj = buttonFR; - break; - case LANG_ITALY: - id = ID_IT; - strcpy_P(public_buf_l, PSTR("F:/bmp_italy")); - obj = buttonIT; - break; - default: - id = ID_CN; - strcpy_P(public_buf_l, PSTR("F:/bmp_simplified_cn")); - obj = buttonCN; - break; - } - - if (state == SELECTED) strcat_P(public_buf_l, PSTR("_sel")); - - strcat_P(public_buf_l, PSTR(".bin")); - - lv_obj_set_event_cb_mks(obj, event_handler, id, NULL, 0); - lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, public_buf_l); - lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, public_buf_l); - - if (state == UNSELECTED) lv_obj_refresh_ext_draw_pad(obj); -} - -void lv_draw_language(void) { - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LANGUAGE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = LANGUAGE_UI; - } - disp_state = LANGUAGE_UI; - - scr = lv_obj_create(NULL, NULL); - - // static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create image buttons - buttonCN = lv_imgbtn_create(scr, NULL); - buttonT_CN = lv_imgbtn_create(scr, NULL); - buttonEN = lv_imgbtn_create(scr, NULL); - buttonRU = lv_imgbtn_create(scr, NULL); - buttonES = lv_imgbtn_create(scr, NULL); - buttonFR = lv_imgbtn_create(scr, NULL); - buttonIT = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, NULL, 0); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, "F:/bmp_simplified_cn.bin"); - lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, "F:/bmp_simplified_cn.bin"); - lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, NULL, 0); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, "F:/bmp_traditional_cn.bin"); - lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, "F:/bmp_traditional_cn.bin"); - lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, NULL, 0); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, "F:/bmp_english.bin"); - lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, "F:/bmp_english.bin"); - lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, NULL, 0); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, "F:/bmp_russian.bin"); - lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, "F:/bmp_russian.bin"); - lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, NULL, 0); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, "F:/bmp_spanish.bin"); - lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, "F:/bmp_spanish.bin"); - lv_imgbtn_set_style(buttonES, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonES, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, NULL, 0); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, "F:/bmp_french.bin"); - lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, "F:/bmp_french.bin"); - lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_IT, NULL, 0); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, "F:/bmp_italy.bin"); - lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, "F:/bmp_italy.bin"); - lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_L_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif // if 1 - - lv_obj_set_pos(buttonCN, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonT_CN, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonEN, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonRU, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonES, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonFR, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonIT, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonCN, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonT_CN, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonEN, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonRU, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonES, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFR, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonIT, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *label_CN = lv_label_create(buttonCN, NULL); - lv_obj_t *label_T_CN = lv_label_create(buttonT_CN, NULL); - lv_obj_t *label_EN = lv_label_create(buttonEN, NULL); - lv_obj_t *label_RU = lv_label_create(buttonRU, NULL); - lv_obj_t *label_ES = lv_label_create(buttonES, NULL); - lv_obj_t *label_FR = lv_label_create(buttonFR, NULL); - lv_obj_t *label_IT = lv_label_create(buttonIT, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - disp_language(gCfgItems.language, SELECTED); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_CN, language_menu.chinese_s); - lv_obj_align(label_CN, buttonCN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_T_CN, language_menu.chinese_t); - lv_obj_align(label_T_CN, buttonT_CN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_EN, language_menu.english); - lv_obj_align(label_EN, buttonEN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_RU, language_menu.russian); - lv_obj_align(label_RU, buttonRU, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_ES, language_menu.spanish); - lv_obj_align(label_ES, buttonES, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_FR, language_menu.french); - lv_obj_align(label_FR, buttonFR, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_IT, language_menu.italy); - lv_obj_align(label_IT, buttonIT, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonCN); - lv_group_add_obj(g, buttonT_CN); - lv_group_add_obj(g, buttonEN); - lv_group_add_obj(g, buttonRU); - lv_group_add_obj(g, buttonES); - lv_group_add_obj(g, buttonFR); - lv_group_add_obj(g, buttonIT); - lv_group_add_obj(g, buttonBack); - } - #endif -} - -void lv_clear_language() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h deleted file mode 100644 index ca6d40bfc3..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_language(void); -extern void lv_clear_language(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp deleted file mode 100644 index 0e0283d32a..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_LEVEL_RETURN 1 -#define ID_LEVEL_POSITION 2 -#define ID_LEVEL_POSITION_ARROW 3 -#define ID_LEVEL_COMMAND 4 -#define ID_LEVEL_COMMAND_ARROW 5 -#define ID_LEVEL_ZOFFSET 6 -#define ID_LEVEL_ZOFFSET_ARROW 7 - - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_LEVEL_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - draw_return_ui(); - } - break; - case ID_LEVEL_POSITION: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - lv_draw_manual_level_pos_settings(); - } - break; - case ID_LEVEL_POSITION_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - lv_draw_manual_level_pos_settings(); - } - break; - case ID_LEVEL_COMMAND: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - keyboard_value = gcodeCommand; - lv_clear_level_settings(); - lv_draw_keyboard(); - } - break; - case ID_LEVEL_COMMAND_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - keyboard_value = gcodeCommand; - lv_clear_level_settings(); - lv_draw_keyboard(); - } - break; - #if HAS_BED_PROBE - case ID_LEVEL_ZOFFSET: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - lv_draw_auto_level_offset_settings(); - } - break; - case ID_LEVEL_ZOFFSET_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_level_settings(); - lv_draw_auto_level_offset_settings(); - } - break; - #endif - } -} - -void lv_draw_level_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonPosition, *labelPosition, *buttonPositionNarrow; - lv_obj_t *buttonCommand, *labelCommand, *buttonCommandNarrow; - #if HAS_BED_PROBE - lv_obj_t *buttonZoffset, *labelZoffset, *buttonZoffsetNarrow; - lv_obj_t * line3; - #endif - lv_obj_t * line1, * line2; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_PARA_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_PARA_UI; - } - disp_state = LEVELING_PARA_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.LevelingParaConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - - buttonPosition = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonPosition, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonPosition, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb_mks(buttonPosition, event_handler, ID_LEVEL_POSITION, NULL, 0); - lv_btn_set_style(buttonPosition, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonPosition, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonPosition, LV_LAYOUT_OFF); - labelPosition = lv_label_create(buttonPosition, NULL); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPosition); - #endif - - buttonPositionNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonPositionNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonPositionNarrow, event_handler, ID_LEVEL_POSITION_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonPositionNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonPositionNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonPositionNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPositionNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonPositionNarrow, LV_LAYOUT_OFF); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonCommand = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonCommand, PARA_UI_POS_X, PARA_UI_POS_Y * 2); - lv_obj_set_size(buttonCommand, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); - lv_obj_set_event_cb_mks(buttonCommand, event_handler, ID_LEVEL_COMMAND, NULL, 0); - lv_btn_set_style(buttonCommand, LV_BTN_STYLE_REL, &tft_style_label_rel); - lv_btn_set_style(buttonCommand, LV_BTN_STYLE_PR, &tft_style_label_pre); - lv_btn_set_layout(buttonCommand, LV_LAYOUT_OFF); - labelCommand = lv_label_create(buttonCommand, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonCommand); - #endif - - buttonCommandNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonCommandNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonCommandNarrow, event_handler, ID_LEVEL_COMMAND_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonCommandNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonCommandNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonCommandNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonCommandNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonCommandNarrow, LV_LAYOUT_OFF); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - #if HAS_BED_PROBE - - buttonZoffset = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonZoffset, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb_mks(buttonZoffset, event_handler, ID_LEVEL_ZOFFSET, NULL, 0); - lv_btn_set_style(buttonZoffset, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZoffset, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonZoffset, LV_LAYOUT_OFF); - labelZoffset = lv_label_create(buttonZoffset, NULL); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZoffset); - #endif - - buttonZoffsetNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonZoffsetNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonZoffsetNarrow, event_handler, ID_LEVEL_ZOFFSET_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonZoffsetNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonZoffsetNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonZoffsetNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZoffsetNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonZoffsetNarrow, LV_LAYOUT_OFF); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - #endif // HAS_BED_PROBE - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_LEVEL_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelPosition, machine_menu.LevelingManuPosConf); - lv_obj_align(labelPosition, buttonPosition, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelCommand, machine_menu.LevelingAutoCommandConf); - lv_obj_align(labelCommand, buttonCommand, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if HAS_BED_PROBE - lv_label_set_text(labelZoffset, machine_menu.LevelingAutoZoffsetConf); - lv_obj_align(labelZoffset, buttonZoffset, LV_ALIGN_IN_LEFT_MID, 0, 0); - #endif - } - -} - -void lv_clear_level_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h deleted file mode 100644 index ce290172b6..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_level_settings(void); -extern void lv_clear_level_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp deleted file mode 100644 index 9f03793c24..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_PARA_RETURN 1 -#define ID_PARA_MACHINE 2 -#define ID_PARA_MACHINE_ARROW 3 -#define ID_PARA_MOTOR 4 -#define ID_PARA_MOTOR_ARROW 5 -#define ID_PARA_LEVEL 6 -#define ID_PARA_LEVEL_ARROW 7 -#define ID_PARA_ADVANCE 8 -#define ID_PARA_ADVANCE_ARROW 9 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_PARA_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - draw_return_ui(); - } - break; - case ID_PARA_MACHINE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_machine_settings(); - } - break; - case ID_PARA_MACHINE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_machine_settings(); - } - break; - case ID_PARA_MOTOR: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_motor_settings(); - } - break; - case ID_PARA_MOTOR_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_motor_settings(); - } - break; - case ID_PARA_LEVEL: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_level_settings(); - } - break; - case ID_PARA_LEVEL_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_level_settings(); - } - break; - case ID_PARA_ADVANCE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_advance_settings(); - } - break; - case ID_PARA_ADVANCE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_para(); - lv_draw_advance_settings(); - } - break; - } -} - -void lv_draw_machine_para(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonMachine, *labelMachine, *buttonMachineNarrow; - lv_obj_t *buttonMotor, *labelMotor, *buttonMotorNarrow; - lv_obj_t *buttonLevel, *labelLevel, *buttonLevelNarrow; - lv_obj_t *buttonAdvance, *labelAdvance, *buttonAdvanceNarrow; - lv_obj_t * line1, * line2, * line3, * line4; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MACHINE_PARA_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MACHINE_PARA_UI; - } - disp_state = MACHINE_PARA_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - buttonMachine = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonMachine, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonMachine, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonMachine, event_handler, ID_PARA_MACHINE, NULL, 0); - lv_btn_set_style(buttonMachine, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonMachine, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonMachine, LV_LAYOUT_OFF); - labelMachine = lv_label_create(buttonMachine, NULL); /*Add a label to the button*/ - - buttonMachineNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonMachineNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonMachineNarrow, event_handler, ID_PARA_MACHINE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonMachineNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMachineNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonMachineNarrow, LV_LAYOUT_OFF); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonMotor = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonMotor, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonMotor, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonMotor, event_handler, ID_PARA_MOTOR, NULL, 0); - lv_btn_set_style(buttonMotor, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonMotor, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonMotor, LV_LAYOUT_OFF); - labelMotor = lv_label_create(buttonMotor, NULL); /*Add a label to the button*/ - - buttonMotorNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonMotorNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonMotorNarrow, event_handler, ID_PARA_MOTOR_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonMotorNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMotorNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonMotorNarrow, LV_LAYOUT_OFF); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - buttonLevel = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonLevel, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonLevel, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_PARA_LEVEL, NULL, 0); - lv_btn_set_style(buttonLevel, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonLevel, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); - labelLevel = lv_label_create(buttonLevel, NULL); /*Add a label to the button*/ - - buttonLevelNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonLevelNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonLevelNarrow, event_handler, ID_PARA_LEVEL_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonLevelNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonLevelNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonLevelNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonLevelNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonLevelNarrow, LV_LAYOUT_OFF); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - buttonAdvance = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonAdvance, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonAdvance, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonAdvance, event_handler, ID_PARA_ADVANCE, NULL, 0); - lv_btn_set_style(buttonAdvance, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonAdvance, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonAdvance, LV_LAYOUT_OFF); - labelAdvance = lv_label_create(buttonAdvance, NULL); /*Add a label to the button*/ - - buttonAdvanceNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonAdvanceNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 4 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonAdvanceNarrow, event_handler, ID_PARA_ADVANCE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonAdvanceNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdvanceNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonAdvanceNarrow, LV_LAYOUT_OFF); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PARA_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, -2); - - lv_label_set_text(labelMachine, MachinePara_menu.MachineSetting); - lv_obj_align(labelMachine, buttonMachine, LV_ALIGN_IN_LEFT_MID, 0, -3); - - lv_label_set_text(labelMotor, MachinePara_menu.MotorSetting); - lv_obj_align(labelMotor, buttonMotor, LV_ALIGN_IN_LEFT_MID, 0, -3); - - lv_label_set_text(labelLevel, MachinePara_menu.leveling); - lv_obj_align(labelLevel, buttonLevel, LV_ALIGN_IN_LEFT_MID, 0, -3); - - lv_label_set_text(labelAdvance, MachinePara_menu.AdvanceSetting); - lv_obj_align(labelAdvance, buttonAdvance, LV_ALIGN_IN_LEFT_MID, 0, -3); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonMachine); - lv_group_add_obj(g, buttonMotor); - lv_group_add_obj(g, buttonLevel); - lv_group_add_obj(g, buttonAdvance); - lv_group_add_obj(g, buttonBack); - } - #endif - -} - -void lv_clear_machine_para() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h deleted file mode 100644 index e830f75db7..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_machine_para(void); -extern void lv_clear_machine_para(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp deleted file mode 100644 index 0cf5bbaf7f..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_MACHINE_RETURN 1 -#define ID_MACHINE_ACCELERATION 2 -#define ID_MACHINE_ACCELERATION_ARROW 3 -#define ID_MACHINE_FEEDRATE 4 -#define ID_MACHINE_FEEDRATE_ARROW 5 -#define ID_MACHINE_JERK 6 -#define ID_MACHINE_JERK_ARROW 7 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_MACHINE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - draw_return_ui(); - } - break; - case ID_MACHINE_ACCELERATION: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_acceleration_settings(); - } - break; - case ID_MACHINE_ACCELERATION_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_acceleration_settings(); - } - break; - case ID_MACHINE_FEEDRATE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_max_feedrate_settings(); - } - break; - case ID_MACHINE_FEEDRATE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_max_feedrate_settings(); - } - break; - #if HAS_CLASSIC_JERK - case ID_MACHINE_JERK: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_jerk_settings(); - } - break; - case ID_MACHINE_JERK_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_machine_settings(); - lv_draw_jerk_settings(); - } - break; - #endif - } -} - -void lv_draw_machine_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonAcceleration, *labelAcceleration, *buttonAccelerationNarrow; - lv_obj_t *buttonMaxFeedrate, *labelMaxFeedrate, *buttonMaxFeedrateNarrow; - #if HAS_CLASSIC_JERK - lv_obj_t *buttonJerk, *labelJerk, *buttonJerkNarrow; - #endif - lv_obj_t * line1, * line2; - #if HAS_CLASSIC_JERK - lv_obj_t * line3; - #endif - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MACHINE_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MACHINE_SETTINGS_UI; - } - disp_state = MACHINE_SETTINGS_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.MachineConfigTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - buttonAcceleration = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(buttonAcceleration, PARA_UI_POS_X, PARA_UI_POS_Y); // Set its position - lv_obj_set_size(buttonAcceleration, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonAcceleration, event_handler, ID_MACHINE_ACCELERATION, NULL, 0); - lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_REL, &tft_style_label_rel); // Set the button's released style - lv_btn_set_style(buttonAcceleration, LV_BTN_STYLE_PR, &tft_style_label_pre); // Set the button's pressed style - lv_btn_set_layout(buttonAcceleration, LV_LAYOUT_OFF); - labelAcceleration = lv_label_create(buttonAcceleration, NULL); // Add a label to the button - - buttonAccelerationNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonAccelerationNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonAccelerationNarrow, event_handler, ID_MACHINE_ACCELERATION_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonAccelerationNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAccelerationNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonAccelerationNarrow, LV_LAYOUT_OFF); - - line1 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line1, line_points[0]); - - buttonMaxFeedrate = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(buttonMaxFeedrate, PARA_UI_POS_X, PARA_UI_POS_Y * 2); // Set its position - lv_obj_set_size(buttonMaxFeedrate, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonMaxFeedrate, event_handler, ID_MACHINE_FEEDRATE, NULL, 0); - lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_REL, &tft_style_label_rel); // Set the button's released style - lv_btn_set_style(buttonMaxFeedrate, LV_BTN_STYLE_PR, &tft_style_label_pre); // Set the button's pressed style - lv_btn_set_layout(buttonMaxFeedrate, LV_LAYOUT_OFF); - labelMaxFeedrate = lv_label_create(buttonMaxFeedrate, NULL); // Add a label to the button - - buttonMaxFeedrateNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonMaxFeedrateNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonMaxFeedrateNarrow, event_handler, ID_MACHINE_FEEDRATE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonMaxFeedrateNarrow, LV_LAYOUT_OFF); - - line2 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line2, line_points[1]); - - #if HAS_CLASSIC_JERK - buttonJerk = lv_btn_create(scr, NULL); // Add a button the current screen - lv_obj_set_pos(buttonJerk, PARA_UI_POS_X, PARA_UI_POS_Y * 3); // Set its position - lv_obj_set_size(buttonJerk, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); // Set its size - //lv_obj_set_event_cb(buttonMotor, event_handler); - lv_obj_set_event_cb_mks(buttonJerk, event_handler, ID_MACHINE_JERK, NULL, 0); - lv_btn_set_style(buttonJerk, LV_BTN_STYLE_REL, &tft_style_label_rel); // Set the button's released style - lv_btn_set_style(buttonJerk, LV_BTN_STYLE_PR, &tft_style_label_pre); // Set the button's pressed style - lv_btn_set_layout(buttonJerk, LV_LAYOUT_OFF); - labelJerk = lv_label_create(buttonJerk, NULL); // Add a label to the button - - buttonJerkNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonJerkNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonJerkNarrow, event_handler, ID_MACHINE_JERK_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonJerkNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonJerkNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonJerkNarrow, LV_LAYOUT_OFF); - - line3 = lv_line_create(lv_scr_act(), NULL); - lv_ex_line(line3, line_points[2]); - #endif - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MACHINE_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelAcceleration, machine_menu.AccelerationConf); - lv_obj_align(labelAcceleration, buttonAcceleration, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelMaxFeedrate, machine_menu.MaxFeedRateConf); - lv_obj_align(labelMaxFeedrate, buttonMaxFeedrate, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if HAS_CLASSIC_JERK - lv_label_set_text(labelJerk, machine_menu.JerkConf); - lv_obj_align(labelJerk, buttonJerk, LV_ALIGN_IN_LEFT_MID, 0, 0); - #endif - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAcceleration); - lv_group_add_obj(g, buttonMaxFeedrate); - #if HAS_CLASSIC_JERK - lv_group_add_obj(g, buttonJerk); - #endif - lv_group_add_obj(g, buttonBack); - } - #endif -} - -void lv_clear_machine_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h deleted file mode 100644 index 38d02e7189..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_machine_settings(void); -extern void lv_clear_machine_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp deleted file mode 100644 index 3d68019b35..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../../MarlinCore.h" -#include "lv_conf.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" -#include "../../../../gcode/queue.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_M_POINT1 1 -#define ID_M_POINT2 2 -#define ID_M_POINT3 3 -#define ID_M_POINT4 4 -#define ID_M_POINT5 5 -#define ID_MANUAL_RETURN 6 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_M_POINT1: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[0][0], (int)gCfgItems.levelingPos[0][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); - } - } - break; - case ID_M_POINT2: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[1][0], (int)gCfgItems.levelingPos[1][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); - } - } - break; - case ID_M_POINT3: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[2][0], (int)gCfgItems.levelingPos[2][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); - } - } - - break; - case ID_M_POINT4: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[3][0], (int)gCfgItems.levelingPos[3][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); - } - } - break; - case ID_M_POINT5: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length == 0) { - if (uiCfg.leveling_first_time) { - queue.enqueue_now_P(PSTR("G28")); - uiCfg.leveling_first_time = 0; - } - - queue.enqueue_now_P(PSTR("G1 Z10")); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[4][0], (int)gCfgItems.levelingPos[4][1]); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G1 Z0")); - } - } - - break; - case ID_MANUAL_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_manualLevel(); - lv_draw_tool(); - } - break; - } -} - -void lv_draw_manualLevel(void) { - lv_obj_t *buttonPoint1, *buttonPoint2, *buttonPoint3, *buttonPoint4, *buttonPoint5; - lv_obj_t *buttonBack; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_UI; - } - disp_state = LEVELING_UI; - - scr = lv_obj_create(NULL, NULL); - - // static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create an Image button - buttonPoint1 = lv_imgbtn_create(scr, NULL); - buttonPoint2 = lv_imgbtn_create(scr, NULL); - buttonPoint3 = lv_imgbtn_create(scr, NULL); - buttonPoint4 = lv_imgbtn_create(scr, NULL); - buttonPoint5 = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPoint1, event_handler, ID_M_POINT1, NULL, 0); - lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_REL, "F:/bmp_leveling1.bin"); - lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_PR, "F:/bmp_leveling1.bin"); - lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonPoint1, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonPoint2, event_handler, ID_M_POINT2, NULL, 0); - lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_REL, "F:/bmp_leveling2.bin"); - lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_PR, "F:/bmp_leveling2.bin"); - lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonPoint3, event_handler, ID_M_POINT3, NULL, 0); - lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_REL, "F:/bmp_leveling3.bin"); - lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_PR, "F:/bmp_leveling3.bin"); - lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonPoint4, event_handler, ID_M_POINT4, NULL, 0); - lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_REL, "F:/bmp_leveling4.bin"); - lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_PR, "F:/bmp_leveling4.bin"); - lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonPoint5, event_handler, ID_M_POINT5, NULL, 0); - lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_REL, "F:/bmp_leveling5.bin"); - lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_PR, "F:/bmp_leveling5.bin"); - lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonPoint1, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonPoint2, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonPoint3, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonPoint4, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonPoint5, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonPoint1, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPoint2, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPoint3, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPoint4, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPoint5, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *label_Point1 = lv_label_create(buttonPoint1, NULL); - lv_obj_t *label_Point2 = lv_label_create(buttonPoint2, NULL); - lv_obj_t *label_Point3 = lv_label_create(buttonPoint3, NULL); - lv_obj_t *label_Point4 = lv_label_create(buttonPoint4, NULL); - lv_obj_t *label_Point5 = lv_label_create(buttonPoint5, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_Point1, leveling_menu.position1); - lv_obj_align(label_Point1, buttonPoint1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Point2, leveling_menu.position2); - lv_obj_align(label_Point2, buttonPoint2, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Point3, leveling_menu.position3); - lv_obj_align(label_Point3, buttonPoint3, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Point4, leveling_menu.position4); - lv_obj_align(label_Point4, buttonPoint4, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Point5, leveling_menu.position5); - lv_obj_align(label_Point5, buttonPoint5, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPoint1); - lv_group_add_obj(g, buttonPoint2); - lv_group_add_obj(g, buttonPoint3); - lv_group_add_obj(g, buttonPoint4); - lv_group_add_obj(g, buttonPoint5); - lv_group_add_obj(g, buttonBack); - } - #endif -} - -void lv_clear_manualLevel() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h deleted file mode 100644 index cfa10370e1..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_manualLevel(void); -extern void lv_clear_manualLevel(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp deleted file mode 100644 index 9b7200b5a9..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ /dev/null @@ -1,459 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_MANUAL_POS_RETURN 1 -#define ID_MANUAL_POS_X1 2 -#define ID_MANUAL_POS_Y1 3 -#define ID_MANUAL_POS_X2 4 -#define ID_MANUAL_POS_Y2 5 -#define ID_MANUAL_POS_X3 6 -#define ID_MANUAL_POS_Y3 7 -#define ID_MANUAL_POS_X4 8 -#define ID_MANUAL_POS_Y4 9 -#define ID_MANUAL_POS_X5 10 -#define ID_MANUAL_POS_Y5 11 -#define ID_MANUAL_POS_DOWN 12 -#define ID_MANUAL_POS_UP 13 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_MANUAL_POS_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_manual_level_pos_settings(); - draw_return_ui(); - } - break; - case ID_MANUAL_POS_X1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_x1; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_Y1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y1; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_X2: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_x2; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_Y2: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y2; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_X3: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_x3; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_Y3: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y3; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_X4: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_x4; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_Y4: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y4; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_X5: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y5; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_Y5: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = level_pos_y5; - lv_clear_manual_level_pos_settings(); - lv_draw_number_key(); - } - break; - case ID_MANUAL_POS_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_manual_level_pos_settings(); - lv_draw_manual_level_pos_settings(); - } - break; - case ID_MANUAL_POS_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_manual_level_pos_settings(); - lv_draw_manual_level_pos_settings(); - } - break; - } -} - -void lv_draw_manual_level_pos_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelPoint1Text = NULL, *buttonX1Value = NULL, *labelX1Value = NULL; - lv_obj_t *buttonY1Value = NULL, *labelY1Value = NULL; - lv_obj_t *labelPoint2Text = NULL, *buttonX2Value = NULL, *labelX2Value = NULL; - lv_obj_t *buttonY2Value = NULL, *labelY2Value = NULL; - lv_obj_t *labelPoint3Text = NULL, *buttonX3Value = NULL, *labelX3Value = NULL; - lv_obj_t *buttonY3Value = NULL, *labelY3Value = NULL; - lv_obj_t *labelPoint4Text = NULL, *buttonX4Value = NULL, *labelX4Value = NULL; - lv_obj_t *buttonY4Value = NULL, *labelY4Value = NULL; - lv_obj_t *labelPoint5Text = NULL, *buttonX5Value = NULL, *labelX5Value = NULL; - lv_obj_t *buttonY5Value = NULL, *labelY5Value = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MANUAL_LEVELING_POSIGION_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MANUAL_LEVELING_POSIGION_UI; - } - disp_state = MANUAL_LEVELING_POSIGION_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.LevelingParaConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - if (uiCfg.para_ui_page != 1) { - labelPoint1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint1Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelPoint1Text, leveling_menu.position1); - - buttonX1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX1Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX1Value, event_handler, ID_MANUAL_POS_X1, NULL, 0); - lv_btn_set_style(buttonX1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX1Value, LV_BTN_STYLE_PR, &style_para_value); - labelX1Value = lv_label_create(buttonX1Value, NULL); - - buttonY1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY1Value, event_handler, ID_MANUAL_POS_Y1, NULL, 0); - lv_btn_set_style(buttonY1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY1Value, LV_BTN_STYLE_PR, &style_para_value); - labelY1Value = lv_label_create(buttonY1Value, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelPoint2Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint2Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint2Text, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelPoint2Text, leveling_menu.position2); - - buttonX2Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX2Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX2Value, event_handler, ID_MANUAL_POS_X2, NULL, 0); - lv_btn_set_style(buttonX2Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX2Value, LV_BTN_STYLE_PR, &style_para_value); - labelX2Value = lv_label_create(buttonX2Value, NULL); - - buttonY2Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY2Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY2Value, event_handler, ID_MANUAL_POS_Y2, NULL, 0); - lv_btn_set_style(buttonY2Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY2Value, LV_BTN_STYLE_PR, &style_para_value); - labelY2Value = lv_label_create(buttonY2Value, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelPoint3Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint3Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint3Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelPoint3Text, leveling_menu.position3); - - buttonX3Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX3Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX3Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX3Value, event_handler, ID_MANUAL_POS_X3, NULL, 0); - lv_btn_set_style(buttonX3Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX3Value, LV_BTN_STYLE_PR, &style_para_value); - labelX3Value = lv_label_create(buttonX3Value, NULL); - - buttonY3Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY3Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY3Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY3Value, event_handler, ID_MANUAL_POS_Y3, NULL, 0); - lv_btn_set_style(buttonY3Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY3Value, LV_BTN_STYLE_PR, &style_para_value); - labelY3Value = lv_label_create(buttonY3Value, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - labelPoint4Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint4Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint4Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelPoint4Text, leveling_menu.position4); - - buttonX4Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX4Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX4Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX4Value, event_handler, ID_MANUAL_POS_X4, NULL, 0); - lv_btn_set_style(buttonX4Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX4Value, LV_BTN_STYLE_PR, &style_para_value); - labelX4Value = lv_label_create(buttonX4Value, NULL); - - buttonY4Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY4Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY4Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY4Value, event_handler, ID_MANUAL_POS_Y4, NULL, 0); - lv_btn_set_style(buttonY4Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY4Value, LV_BTN_STYLE_PR, &style_para_value); - labelY4Value = lv_label_create(buttonY4Value, NULL); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonX1Value); - lv_group_add_obj(g, buttonY1Value); - lv_group_add_obj(g, buttonX2Value); - lv_group_add_obj(g, buttonY2Value); - lv_group_add_obj(g, buttonX3Value); - lv_group_add_obj(g, buttonY3Value); - lv_group_add_obj(g, buttonX4Value); - lv_group_add_obj(g, buttonY4Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - else { - labelPoint5Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelPoint5Text, &tft_style_label_rel); - lv_obj_set_pos(labelPoint5Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelPoint5Text, leveling_menu.position5); - - buttonX5Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonX5Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonX5Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonX5Value, event_handler, ID_MANUAL_POS_X5, NULL, 0); - lv_btn_set_style(buttonX5Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonX5Value, LV_BTN_STYLE_PR, &style_para_value); - labelX5Value = lv_label_create(buttonX5Value, NULL); - - buttonY5Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonY5Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); - lv_obj_set_size(buttonY5Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonY5Value, event_handler, ID_MANUAL_POS_Y5, NULL, 0); - lv_btn_set_style(buttonY5Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonY5Value, LV_BTN_STYLE_PR, &style_para_value); - labelY5Value = lv_label_create(buttonY5Value, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonX5Value); - lv_group_add_obj(g, buttonY5Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_POS_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.para_ui_page != 1) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); - lv_label_set_text(labelX1Value, public_buf_l); - lv_obj_align(labelX1Value, buttonX1Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][1]); - lv_label_set_text(labelY1Value, public_buf_l); - lv_obj_align(labelY1Value, buttonY1Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][0]); - lv_label_set_text(labelX2Value, public_buf_l); - lv_obj_align(labelX2Value, buttonX2Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][1]); - lv_label_set_text(labelY2Value, public_buf_l); - lv_obj_align(labelY2Value, buttonY2Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][0]); - lv_label_set_text(labelX3Value, public_buf_l); - lv_obj_align(labelX3Value, buttonX3Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][1]); - lv_label_set_text(labelY3Value, public_buf_l); - lv_obj_align(labelY3Value, buttonY3Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][0]); - lv_label_set_text(labelX4Value, public_buf_l); - lv_obj_align(labelX4Value, buttonX4Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][1]); - lv_label_set_text(labelY4Value, public_buf_l); - lv_obj_align(labelY4Value, buttonY4Value, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - } - else { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][0]); - lv_label_set_text(labelX5Value, public_buf_l); - lv_obj_align(labelX5Value, buttonX5Value, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][1]); - lv_label_set_text(labelY5Value, public_buf_l); - lv_obj_align(labelY5Value, buttonY5Value, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_manual_level_pos_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h deleted file mode 100644 index 8e89ecf559..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_manual_level_pos_settings(void); -extern void lv_clear_manual_level_pos_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp deleted file mode 100644 index e82124f705..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp +++ /dev/null @@ -1,335 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_FEED_RETURN 1 -#define ID_FEED_X 2 -#define ID_FEED_Y 3 -#define ID_FEED_Z 4 -#define ID_FEED_E0 5 -#define ID_FEED_E1 6 -#define ID_FEED_DOWN 7 -#define ID_FEED_UP 8 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_FEED_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_max_feedrate_settings(); - draw_return_ui(); - } - break; - case ID_FEED_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = XMaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } - break; - case ID_FEED_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = YMaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } - break; - case ID_FEED_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = ZMaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } - break; - case ID_FEED_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E0MaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } - break; - case ID_FEED_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E1MaxFeedRate; - lv_clear_max_feedrate_settings(); - lv_draw_number_key(); - } - break; - case ID_FEED_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_max_feedrate_settings(); - lv_draw_max_feedrate_settings(); - } - break; - case ID_FEED_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_max_feedrate_settings(); - lv_draw_max_feedrate_settings(); - } - break; - } -} - -void lv_draw_max_feedrate_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MAXFEEDRATE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MAXFEEDRATE_UI; - } - disp_state = MAXFEEDRATE_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.MaxFeedRateConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - if (uiCfg.para_ui_page != 1) { - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.XMaxFeedRate); - - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_FEED_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - lv_btn_set_layout(buttonXValue, LV_LAYOUT_OFF); - labelXValue = lv_label_create(buttonXValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.YMaxFeedRate); - - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_FEED_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - lv_btn_set_layout(buttonYValue, LV_LAYOUT_OFF); - labelYValue = lv_label_create(buttonYValue, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.ZMaxFeedRate); - - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_FEED_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - lv_btn_set_layout(buttonZValue, LV_LAYOUT_OFF); - labelZValue = lv_label_create(buttonZValue, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - labelE0Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE0Text, &tft_style_label_rel); - lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelE0Text, machine_menu.E0MaxFeedRate); - - buttonE0Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_FEED_E0, NULL, 0); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); - lv_btn_set_layout(buttonE0Value, LV_LAYOUT_OFF); - labelE0Value = lv_label_create(buttonE0Value, NULL); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonE0Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - else { - labelE1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE1Text, &tft_style_label_rel); - lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelE1Text, machine_menu.E1MaxFeedRate); - - buttonE1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_FEED_E1, NULL, 0); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); - lv_btn_set_layout(buttonE1Value, LV_LAYOUT_OFF); - labelE1Value = lv_label_create(buttonE1Value, NULL); - - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonE1Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FEED_RETURN, NULL, 0); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - label_Back = lv_label_create(buttonBack, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.para_ui_page != 1) { - - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); - lv_label_set_text(labelE0Value, public_buf_l); - lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); - } - else { - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); - lv_label_set_text(labelE1Value, public_buf_l); - lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_max_feedrate_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h deleted file mode 100644 index 78caca5ade..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_max_feedrate_settings(void); -extern void lv_clear_max_feedrate_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp deleted file mode 100644 index f6568df143..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_MOTOR_RETURN 1 -#define ID_MOTOR_STEPS 2 -#define ID_MOTOR_STEPS_ARROW 3 -#define ID_MOTOR_TMC_CURRENT 4 -#define ID_MOTOR_TMC_CURRENT_ARROW 5 -#define ID_MOTOR_STEP_MODE 6 -#define ID_MOTOR_STEP_MODE_ARROW 7 -#define ID_HOME_SENSE 8 -#define ID_HOME_SENSE_ARROW 9 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_MOTOR_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - draw_return_ui(); - } - break; - case ID_MOTOR_STEPS: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_step_settings(); - } - break; - case ID_MOTOR_STEPS_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_step_settings(); - } - break; - #if USE_SENSORLESS - case ID_HOME_SENSE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_homing_sensitivity_settings(); - } - break; - case ID_HOME_SENSE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_homing_sensitivity_settings(); - } - break; - #endif - #if HAS_TRINAMIC_CONFIG - case ID_MOTOR_TMC_CURRENT: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_tmc_current_settings(); - } - break; - case ID_MOTOR_TMC_CURRENT_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_tmc_current_settings(); - } - break; - #if HAS_STEALTHCHOP - case ID_MOTOR_STEP_MODE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_tmc_step_mode_settings(); - } - break; - case ID_MOTOR_STEP_MODE_ARROW: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_motor_settings(); - lv_draw_tmc_step_mode_settings(); - } - break; - #endif - #endif - } -} - -void lv_draw_motor_settings(void) { - lv_obj_t *buttonBack, *label_Back; - lv_obj_t *buttonSteps, *labelSteps, *buttonStepsNarrow; - lv_obj_t * line1; - #if USE_SENSORLESS - lv_obj_t *buttonSensitivity, *labelSensitivity, *buttonSensitivityNarrow; - lv_obj_t * line2; - #endif - #if HAS_TRINAMIC_CONFIG - #if USE_SENSORLESS - lv_obj_t * line3; - #else - lv_obj_t * line2; - #endif - lv_obj_t *buttonTMCcurrent, *labelTMCcurrent, *buttonTMCcurrentNarrow; - #if HAS_STEALTHCHOP - #if USE_SENSORLESS - lv_obj_t * line4; - #else - lv_obj_t * line3; - #endif - lv_obj_t *buttonStepMode, *labelStepMode, *buttonStepModeNarrow; - #endif - #endif - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOTOR_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MOTOR_SETTINGS_UI; - } - disp_state = MOTOR_SETTINGS_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.MotorConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - buttonSteps = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonSteps, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonSteps, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonSteps, event_handler, ID_MOTOR_STEPS, NULL, 0); - lv_btn_set_style(buttonSteps, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonSteps, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonSteps, LV_LAYOUT_OFF); - labelSteps = lv_label_create(buttonSteps, NULL); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSteps); - #endif - - buttonStepsNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonStepsNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonStepsNarrow, event_handler, ID_MOTOR_STEPS_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonStepsNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStepsNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonStepsNarrow, LV_LAYOUT_OFF); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - #if USE_SENSORLESS - buttonSensitivity = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonSensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonSensitivity, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonSensitivity, event_handler, ID_HOME_SENSE, NULL, 0); - lv_btn_set_style(buttonSensitivity, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonSensitivity, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonSensitivity, LV_LAYOUT_OFF); - labelSensitivity = lv_label_create(buttonSensitivity, NULL); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSensitivity); - #endif - - buttonSensitivityNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonSensitivityNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonSensitivityNarrow, event_handler, ID_HOME_SENSE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonSensitivityNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonSensitivityNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonSensitivityNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSensitivityNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonSensitivityNarrow, LV_LAYOUT_OFF); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - #endif - - - #if HAS_TRINAMIC_CONFIG - buttonTMCcurrent = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonTMCcurrent, PARA_UI_POS_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2)); - lv_obj_set_size(buttonTMCcurrent, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - //lv_obj_set_event_cb(buttonMachine, event_handler); - lv_obj_set_event_cb_mks(buttonTMCcurrent, event_handler, ID_MOTOR_TMC_CURRENT, NULL, 0); - lv_btn_set_style(buttonTMCcurrent, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonTMCcurrent, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonTMCcurrent, LV_LAYOUT_OFF); - labelTMCcurrent = lv_label_create(buttonTMCcurrent, NULL); /*Add a label to the button*/ - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTMCcurrent); - #endif - - buttonTMCcurrentNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonTMCcurrentNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2) + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonTMCcurrentNarrow, event_handler, ID_MOTOR_TMC_CURRENT_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonTMCcurrentNarrow, LV_LAYOUT_OFF); - #if USE_SENSORLESS - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - #else - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - #endif - - #if HAS_STEALTHCHOP - buttonStepMode = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonStepMode, PARA_UI_POS_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3)); - lv_obj_set_size(buttonStepMode, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb_mks(buttonStepMode, event_handler, ID_MOTOR_STEP_MODE, NULL, 0); - lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonStepMode, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonStepMode, LV_LAYOUT_OFF); - labelStepMode = lv_label_create(buttonStepMode, NULL); /*Add a label to the button*/ - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonStepMode); - #endif - - buttonStepModeNarrow = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonStepModeNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3) + PARA_UI_ARROW_V); - lv_obj_set_event_cb_mks(buttonStepModeNarrow, event_handler, ID_MOTOR_STEP_MODE_ARROW, NULL, 0); - lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); - lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); - lv_imgbtn_set_style(buttonStepModeNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStepModeNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonStepModeNarrow, LV_LAYOUT_OFF); - - #if USE_SENSORLESS - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - #else - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - #endif - - #endif // HAS_STEALTHCHOP - - #endif // HAS_TRINAMIC_CONFIG - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MOTOR_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelSteps, machine_menu.StepsConf); - lv_obj_align(labelSteps, buttonSteps, LV_ALIGN_IN_LEFT_MID, 0, 0); - - #if USE_SENSORLESS - lv_label_set_text(labelSensitivity, machine_menu.HomingSensitivityConf); - lv_obj_align(labelSensitivity, buttonSensitivity, LV_ALIGN_IN_LEFT_MID, 0, 0); - #endif - #if HAS_TRINAMIC_CONFIG - lv_label_set_text(labelTMCcurrent, machine_menu.TMCcurrentConf); - lv_obj_align(labelTMCcurrent, buttonTMCcurrent, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if HAS_STEALTHCHOP - lv_label_set_text(labelStepMode, machine_menu.TMCStepModeConf); - lv_obj_align(labelStepMode, buttonStepMode, LV_ALIGN_IN_LEFT_MID, 0, 0); - #endif - #endif - } - -} - -void lv_clear_motor_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h deleted file mode 100644 index 9a1c7a4db5..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_motor_settings(void); -extern void lv_clear_motor_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp deleted file mode 100644 index a6c0c0551a..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ /dev/null @@ -1,347 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../../MarlinCore.h" -#include "lv_conf.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" -#include "../../../../gcode/queue.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -static lv_obj_t *labelV, *buttonV; - -#define ID_M_X_P 1 -#define ID_M_X_N 2 -#define ID_M_Y_P 3 -#define ID_M_Y_N 4 -#define ID_M_Z_P 5 -#define ID_M_Z_N 6 -#define ID_M_STEP 7 -#define ID_M_RETURN 8 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_M_X_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_one_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 X%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_one_P(PSTR("G90")); - } - } - break; - case ID_M_X_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 X-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - } - break; - case ID_M_Y_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Y%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - } - break; - case ID_M_Y_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Y-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - } - break; - case ID_M_Z_P: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - } - break; - case ID_M_Z_N: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (queue.length <= (BUFSIZE - 3)) { - ZERO(public_buf_l); - queue.enqueue_now_P(PSTR("G91")); - sprintf_P(public_buf_l, PSTR("G1 Z-%3.1f F%d"), uiCfg.move_dist, uiCfg.moveSpeed); - queue.enqueue_one_now(public_buf_l); - queue.enqueue_now_P(PSTR("G90")); - } - } - break; - case ID_M_STEP: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (abs(10 * (int)uiCfg.move_dist) == 100) - uiCfg.move_dist = 0.1; - else - uiCfg.move_dist *= (float)10; - - disp_move_dist(); - } - - break; - case ID_M_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } - break; - } -} - -void lv_draw_move_motor(void) { - lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD, *buttonZI, *buttonZD, *buttonBack; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOVE_MOTOR_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = MOVE_MOTOR_UI; - } - disp_state = MOVE_MOTOR_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create an Image button - buttonXI = lv_imgbtn_create(scr, NULL); - buttonXD = lv_imgbtn_create(scr, NULL); - buttonYI = lv_imgbtn_create(scr, NULL); - buttonYD = lv_imgbtn_create(scr, NULL); - buttonZI = lv_imgbtn_create(scr, NULL); - buttonZD = lv_imgbtn_create(scr, NULL); - buttonV = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_M_X_P, NULL, 0); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, "F:/bmp_xAdd.bin"); - lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, "F:/bmp_xAdd.bin"); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_M_X_N, NULL, 0); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, "F:/bmp_xDec.bin"); - lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, "F:/bmp_xDec.bin"); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_M_Y_P, NULL, 0); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, "F:/bmp_yAdd.bin"); - lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, "F:/bmp_yAdd.bin"); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_M_Y_N, NULL, 0); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, "F:/bmp_yDec.bin"); - lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, "F:/bmp_yDec.bin"); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_M_Z_P, NULL, 0); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, "F:/bmp_zAdd.bin"); - lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, "F:/bmp_zAdd.bin"); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_M_Z_N, NULL, 0); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, "F:/bmp_zDec.bin"); - lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, "F:/bmp_zDec.bin"); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_label_rel); - - //lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0); - lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, NULL, 0); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_M_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif // if 1 - - lv_obj_set_pos(buttonXI, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonYI, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonZI, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonV, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonXD, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonYD, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonYD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonZI, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonZD, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonV, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelXI = lv_label_create(buttonXI, NULL); - lv_obj_t *labelXD = lv_label_create(buttonXD, NULL); - lv_obj_t *labelYI = lv_label_create(buttonYI, NULL); - lv_obj_t *labelYD = lv_label_create(buttonYD, NULL); - lv_obj_t *labelZI = lv_label_create(buttonZI, NULL); - lv_obj_t *labelZD = lv_label_create(buttonZD, NULL); - labelV = lv_label_create(buttonV, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelXI, move_menu.x_add); - lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelXD, move_menu.x_dec); - lv_obj_align(labelXD, buttonXD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelYI, move_menu.y_add); - lv_obj_align(labelYI, buttonYI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelYD, move_menu.y_dec); - lv_obj_align(labelYD, buttonYD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelZI, move_menu.z_add); - lv_obj_align(labelZI, buttonZI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelZD, move_menu.z_dec); - lv_obj_align(labelZD, buttonZD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXI); - lv_group_add_obj(g, buttonXD); - lv_group_add_obj(g, buttonYI); - lv_group_add_obj(g, buttonYD); - lv_group_add_obj(g, buttonZI); - lv_group_add_obj(g, buttonZD); - lv_group_add_obj(g, buttonV); - lv_group_add_obj(g, buttonBack); - } - #endif - - disp_move_dist(); -} - -void disp_move_dist() { - // char buf[30] = {0}; - - if ((int)(10 * uiCfg.move_dist) == 1) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move0_1.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move0_1.bin"); - } - else if ((int)(10 * uiCfg.move_dist) == 10) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move1.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move1.bin"); - } - else if ((int)(10 * uiCfg.move_dist) == 100) { - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move10.bin"); - lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move10.bin"); - } - if (gCfgItems.multiple_language != 0) { - if ((int)(10 * uiCfg.move_dist) == 1) { - lv_label_set_text(labelV, move_menu.step_01mm); - lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if ((int)(10 * uiCfg.move_dist) == 10) { - lv_label_set_text(labelV, move_menu.step_1mm); - lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if ((int)(10 * uiCfg.move_dist) == 100) { - lv_label_set_text(labelV, move_menu.step_10mm); - lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } -} - -void lv_clear_move_motor() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h deleted file mode 100644 index fdbb61f6f9..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_move_motor(void); -extern void lv_clear_move_motor(); -extern void disp_move_dist(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp deleted file mode 100644 index 4842776304..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ /dev/null @@ -1,981 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -//#include "../../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../../lvgl/src/lv_objx/lv_img.h" -//#include "../../lvgl/src/lv_core/lv_disp.h" -//#include "../../lvgl/src/lv_core/lv_refr.h" -//#include "../../MarlinCore.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../gcode/queue.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" -#endif - -#include "../../../../gcode/gcode.h" -#include "../../../../module/planner.h" - -#if HAS_TRINAMIC_CONFIG - #include "../../../../module/stepper/indirection.h" - #include "../../../../feature/tmc_util.h" -#endif - -#if HAS_BED_PROBE - #include "../../../../module/probe.h" -#endif - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t *buttonValue = NULL; -static lv_obj_t *labelValue = NULL; - -static char key_value[11] = {0}; -static uint8_t cnt = 0; -static char point_flg = 1; - -#define ID_NUM_KEY1 1 -#define ID_NUM_KEY2 2 -#define ID_NUM_KEY3 3 -#define ID_NUM_KEY4 4 -#define ID_NUM_KEY5 5 -#define ID_NUM_KEY6 6 -#define ID_NUM_KEY7 7 -#define ID_NUM_KEY8 8 -#define ID_NUM_KEY9 9 -#define ID_NUM_KEY0 10 -#define ID_NUM_BACK 11 -#define ID_NUM_RESET 12 -#define ID_NUM_CONFIRM 13 -#define ID_NUM_POINT 14 -#define ID_NUM_NAGETIVE 15 - -static void disp_key_value() { - char *temp; - #if HAS_TRINAMIC_CONFIG - float milliamps; - #endif - - ZERO(public_buf_m); - - switch (value) { - case PrintAcceleration: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.acceleration); - break; - case RetractAcceleration: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.retract_acceleration); - break; - case TravelAcceleration: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.travel_acceleration); - break; - case XAcceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); - break; - case YAcceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); - break; - case ZAcceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); - break; - case E0Acceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); - break; - case E1Acceleration: - sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); - break; - case XMaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); - break; - case YMaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); - break; - case ZMaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); - break; - case E0MaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); - break; - case E1MaxFeedRate: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); - break; - - case XJerk: - #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[X_AXIS]); - #endif - break; - case YJerk: - #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); - #endif - break; - case ZJerk: - #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); - #endif - break; - case EJerk: - #if HAS_CLASSIC_JERK - sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[E_AXIS]); - #endif - break; - - case Xstep: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); - - break; - case Ystep: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); - - break; - case Zstep: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); - - break; - case E0step: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); - - break; - case E1step: - sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS_N(1)]); - break; - - case Xcurrent: - #if AXIS_IS_TMC(X) - milliamps = stepperX.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); - #endif - break; - - case Ycurrent: - #if AXIS_IS_TMC(Y) - milliamps = stepperY.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); - #endif - break; - - case Zcurrent: - #if AXIS_IS_TMC(Z) - milliamps = stepperZ.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); - #endif - break; - - case E0current: - #if AXIS_IS_TMC(E0) - milliamps = stepperE0.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); - #endif - break; - - case E1current: - #if AXIS_IS_TMC(E1) - milliamps = stepperE1.getMilliamps(); - sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); - #endif - break; - - case pause_pos_x: - sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosX); - break; - case pause_pos_y: - sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosY); - break; - case pause_pos_z: - sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosZ); - break; - case level_pos_x1: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][0]); - break; - case level_pos_y1: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][1]); - break; - case level_pos_x2: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][0]); - break; - case level_pos_y2: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][1]); - break; - case level_pos_x3: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][0]); - break; - case level_pos_y3: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][1]); - break; - case level_pos_x4: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][0]); - break; - case level_pos_y4: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][1]); - break; - case level_pos_x5: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][0]); - break; - case level_pos_y5: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][1]); - break; - #if HAS_BED_PROBE - case x_offset: - #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.x); - #endif - break; - case y_offset: - #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.y); - #endif - break; - case z_offset: - sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.z); - break; - #endif - case load_length: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_length); - break; - case load_speed: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_speed); - break; - case unload_length: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_length); - break; - case unload_speed: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_speed); - break; - case filament_temp: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temper); - break; - case x_sensitivity: - #if X_SENSORLESS - sprintf_P(public_buf_m, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); - #endif - break; - case y_sensitivity: - #if Y_SENSORLESS - sprintf_P(public_buf_m, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); - #endif - break; - case z_sensitivity: - #if Z_SENSORLESS - sprintf_P(public_buf_m, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); - #endif - break; - case z2_sensitivity: - #if Z2_SENSORLESS - sprintf_P(public_buf_m, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); - #endif - break; - } - ZERO(key_value); - strcpy(key_value, public_buf_m); - cnt = strlen(key_value); - temp = strchr(key_value, '.'); - if (temp) - point_flg = 0; - else - point_flg = 1; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - -} - -static void set_value_confirm() { - #if HAS_TRINAMIC_CONFIG - uint16_t current_mA; - #endif - switch (value) { - case PrintAcceleration: - planner.settings.acceleration = atof(key_value); - break; - case RetractAcceleration: - planner.settings.retract_acceleration = atof(key_value); - break; - case TravelAcceleration: - planner.settings.travel_acceleration = atof(key_value); - break; - case XAcceleration: - planner.settings.max_acceleration_mm_per_s2[X_AXIS] = atof(key_value); - break; - case YAcceleration: - planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = atof(key_value); - break; - case ZAcceleration: - planner.settings.max_acceleration_mm_per_s2[Z_AXIS] = atof(key_value); - break; - case E0Acceleration: - planner.settings.max_acceleration_mm_per_s2[E_AXIS] = atof(key_value); - break; - case E1Acceleration: - planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)] = atof(key_value); - break; - case XMaxFeedRate: - planner.settings.max_feedrate_mm_s[X_AXIS] = atof(key_value); - break; - case YMaxFeedRate: - planner.settings.max_feedrate_mm_s[Y_AXIS] = atof(key_value); - break; - case ZMaxFeedRate: - planner.settings.max_feedrate_mm_s[Z_AXIS] = atof(key_value); - break; - case E0MaxFeedRate: - planner.settings.max_feedrate_mm_s[E_AXIS] = atof(key_value); - break; - case E1MaxFeedRate: - planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value); - break; - case XJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[X_AXIS] = atof(key_value); - #endif - break; - case YJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[Y_AXIS] = atof(key_value); - #endif - break; - case ZJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[Z_AXIS] = atof(key_value); - #endif - break; - case EJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[E_AXIS] = atof(key_value); - #endif - break; - case Xstep: - planner.settings.axis_steps_per_mm[X_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case Ystep: - planner.settings.axis_steps_per_mm[Y_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case Zstep: - planner.settings.axis_steps_per_mm[Z_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case E0step: - planner.settings.axis_steps_per_mm[E_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case E1step: - planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); - planner.refresh_positioning(); - break; - case Xcurrent: - #if AXIS_IS_TMC(X) - current_mA = atoi(key_value); - stepperX.rms_current(current_mA); - #endif - break; - case Ycurrent: - #if AXIS_IS_TMC(Y) - current_mA = atoi(key_value); - stepperY.rms_current(current_mA); - #endif - break; - case Zcurrent: - #if AXIS_IS_TMC(Z) - current_mA = atoi(key_value); - stepperZ.rms_current(current_mA); - #endif - break; - case E0current: - #if AXIS_IS_TMC(E0) - current_mA = atoi(key_value); - stepperE0.rms_current(current_mA); - #endif - break; - case E1current: - #if AXIS_IS_TMC(E1) - current_mA = atoi(key_value); - stepperE1.rms_current(current_mA); - #endif - break; - case pause_pos_x: - gCfgItems.pausePosX = atof(key_value); - update_spi_flash(); - break; - case pause_pos_y: - gCfgItems.pausePosY = atof(key_value); - update_spi_flash(); - break; - case pause_pos_z: - gCfgItems.pausePosZ = atof(key_value); - update_spi_flash(); - break; - case level_pos_x1: - gCfgItems.levelingPos[0][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y1: - gCfgItems.levelingPos[0][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x2: - gCfgItems.levelingPos[1][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y2: - gCfgItems.levelingPos[1][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x3: - gCfgItems.levelingPos[2][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y3: - gCfgItems.levelingPos[2][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x4: - gCfgItems.levelingPos[3][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y4: - gCfgItems.levelingPos[3][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x5: - gCfgItems.levelingPos[4][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y5: - gCfgItems.levelingPos[4][1] = atoi(key_value); - update_spi_flash(); - break; - #if HAS_BED_PROBE - case x_offset: - #if HAS_PROBE_XY_OFFSET - float x; - x = atof(key_value); - if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE)) - probe.offset.x = x; - #endif - break; - case y_offset: - #if HAS_PROBE_XY_OFFSET - float y; - y = atof(key_value); - if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE)) - probe.offset.y = y; - #endif - break; - case z_offset: - float z; - z = atof(key_value); - if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) - probe.offset.z = z; - break; - #endif - case load_length: - gCfgItems.filamentchange_load_length = atoi(key_value); - uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length*60.0/gCfgItems.filamentchange_load_speed)+0.5); - update_spi_flash(); - break; - case load_speed: - gCfgItems.filamentchange_load_speed = atoi(key_value); - uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length*60.0/gCfgItems.filamentchange_load_speed)+0.5); - update_spi_flash(); - break; - case unload_length: - gCfgItems.filamentchange_unload_length = atoi(key_value); - uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length*60.0/gCfgItems.filamentchange_unload_speed)+0.5); - update_spi_flash(); - break; - case unload_speed: - gCfgItems.filamentchange_unload_speed = atoi(key_value); - uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length*60.0/gCfgItems.filamentchange_unload_speed)+0.5); - update_spi_flash(); - break; - case filament_temp: - gCfgItems.filament_limit_temper = atoi(key_value); - update_spi_flash(); - break; - case x_sensitivity: - #if X_SENSORLESS - stepperX.homing_threshold(atoi(key_value)); - #endif - break; - case y_sensitivity: - #if Y_SENSORLESS - stepperY.homing_threshold(atoi(key_value)); - #endif - break; - case z_sensitivity: - #if Z_SENSORLESS - stepperZ.homing_threshold(atoi(key_value)); - #endif - break; - case z2_sensitivity: - #if Z2_SENSORLESS - stepperZ2.homing_threshold(atoi(key_value)); - #endif - break; - } - gcode.process_subcommands_now_P(PSTR("M500")); -} - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_NUM_KEY1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'1'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_KEY2: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'2'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_KEY3: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'3'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_KEY4: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'4'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_KEY5: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'5'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_KEY6: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'6'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_KEY7: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'7'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_KEY8: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'8'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_KEY9: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'9'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_KEY0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt <= 10) { - key_value[cnt] = (char)'0'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_BACK: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt > 0) - cnt--; - if (key_value[cnt] == (char)'.') point_flg = 1; - key_value[cnt] = (char)'\0'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - } - break; - case ID_NUM_RESET: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - ZERO(key_value); - cnt = 0; - key_value[cnt] = (char)'0'; - point_flg = 1; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - } - break; - case ID_NUM_POINT: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if ((cnt != 0) && (point_flg == 1)) { - point_flg = 0; - key_value[cnt] = (char)'.'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_NAGETIVE: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (cnt == 0) { - key_value[cnt] = (char)'-'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - } - break; - case ID_NUM_CONFIRM: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - last_disp_state = NUMBER_KEY_UI; - if (strlen(key_value) != 0) - set_value_confirm(); - lv_clear_number_key(); - draw_return_ui(); - } - break; - } -} - -void lv_draw_number_key(void) { - lv_obj_t *NumberKey_1 = NULL, *NumberKey_2 = NULL, *NumberKey_3 = NULL, *NumberKey_4 = NULL, *NumberKey_5 = NULL; - lv_obj_t *NumberKey_6 = NULL, *NumberKey_7 = NULL, *NumberKey_8 = NULL, *NumberKey_9 = NULL, *NumberKey_0 = NULL; - lv_obj_t *KeyPoint = NULL, *KeyConfirm = NULL, *KeyReset = NULL, *KeyBack = NULL; - lv_obj_t *Minus = NULL; - lv_obj_t *labelKey_1 = NULL, *labelKey_2 = NULL, *labelKey_3 = NULL, *labelKey_4 = NULL, *labelKey_5 = NULL; - lv_obj_t *labelKey_6 = NULL, *labelKey_7 = NULL, *labelKey_8 = NULL, *labelKey_9 = NULL, *labelKey_0 = NULL; - lv_obj_t *labelKeyPoint = NULL, *labelKeyConfirm = NULL, *labelKeyReset = NULL, *labelKeyBack = NULL; - lv_obj_t *labelMinus = NULL; - - buttonValue = NULL; - labelValue = NULL; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != NUMBER_KEY_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = NUMBER_KEY_UI; - } - disp_state = NUMBER_KEY_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - //lv_obj_t * title = lv_label_create(scr, NULL); - //lv_obj_set_style(title, &tft_style_label_rel); - //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - //lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - buttonValue = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonValue, 92, 40); /*Set its position*/ - lv_obj_set_size(buttonValue, 296, 40); - lv_obj_set_event_cb_mks(buttonValue, event_handler, ID_NUM_KEY1, NULL, 0); - lv_btn_set_style(buttonValue, LV_BTN_STYLE_REL, &style_num_text); /*Set the button's released style*/ - lv_btn_set_style(buttonValue, LV_BTN_STYLE_PR, &style_num_text); /*Set the button's pressed style*/ - //lv_btn_set_layout(buttonValue, LV_LAYOUT_OFF); - labelValue = lv_label_create(buttonValue, NULL); /*Add a label to the button*/ - - NumberKey_1 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_1, 92, 90); /*Set its position*/ - lv_obj_set_size(NumberKey_1, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_1, event_handler, ID_NUM_KEY1, NULL, 0); - lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_1, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_1, LV_LAYOUT_OFF); - labelKey_1 = lv_label_create(NumberKey_1, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_1, machine_menu.key_1); - lv_obj_align(labelKey_1, NumberKey_1, LV_ALIGN_CENTER, 0, 0); - - NumberKey_2 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_2, 168, 90); /*Set its position*/ - lv_obj_set_size(NumberKey_2, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_2, event_handler, ID_NUM_KEY2, NULL, 0); - lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_2, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_2, LV_LAYOUT_OFF); - labelKey_2 = lv_label_create(NumberKey_2, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_2, machine_menu.key_2); - lv_obj_align(labelKey_2, NumberKey_2, LV_ALIGN_CENTER, 0, 0); - - NumberKey_3 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_3, 244, 90); /*Set its position*/ - lv_obj_set_size(NumberKey_3, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_3, event_handler, ID_NUM_KEY3, NULL, 0); - lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_3, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_3, LV_LAYOUT_OFF); - labelKey_3 = lv_label_create(NumberKey_3, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_3, machine_menu.key_3); - lv_obj_align(labelKey_3, NumberKey_3, LV_ALIGN_CENTER, 0, 0); - - NumberKey_4 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_4, 92, 140); /*Set its position*/ - lv_obj_set_size(NumberKey_4, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_4, event_handler, ID_NUM_KEY4, NULL, 0); - lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_4, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_4, LV_LAYOUT_OFF); - labelKey_4 = lv_label_create(NumberKey_4, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_4, machine_menu.key_4); - lv_obj_align(labelKey_4, NumberKey_4, LV_ALIGN_CENTER, 0, 0); - - NumberKey_5 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_5, 168, 140); /*Set its position*/ - lv_obj_set_size(NumberKey_5, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_5, event_handler, ID_NUM_KEY5, NULL, 0); - lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_5, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_5, LV_LAYOUT_OFF); - labelKey_5 = lv_label_create(NumberKey_5, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_5, machine_menu.key_5); - lv_obj_align(labelKey_5, NumberKey_5, LV_ALIGN_CENTER, 0, 0); - - NumberKey_6 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_6, 244, 140); /*Set its position*/ - lv_obj_set_size(NumberKey_6, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_6, event_handler, ID_NUM_KEY6, NULL, 0); - lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_6, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_6, LV_LAYOUT_OFF); - labelKey_6 = lv_label_create(NumberKey_6, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_6, machine_menu.key_6); - lv_obj_align(labelKey_6, NumberKey_6, LV_ALIGN_CENTER, 0, 0); - - NumberKey_7 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_7, 92, 190); /*Set its position*/ - lv_obj_set_size(NumberKey_7, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_7, event_handler, ID_NUM_KEY7, NULL, 0); - lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_7, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_7, LV_LAYOUT_OFF); - labelKey_7 = lv_label_create(NumberKey_7, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_7, machine_menu.key_7); - lv_obj_align(labelKey_7, NumberKey_7, LV_ALIGN_CENTER, 0, 0); - - NumberKey_8 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_8, 168, 190); /*Set its position*/ - lv_obj_set_size(NumberKey_8, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_8, event_handler, ID_NUM_KEY8, NULL, 0); - lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_8, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_8, LV_LAYOUT_OFF); - labelKey_8 = lv_label_create(NumberKey_8, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_8, machine_menu.key_8); - lv_obj_align(labelKey_8, NumberKey_8, LV_ALIGN_CENTER, 0, 0); - - NumberKey_9 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_9, 244, 190); /*Set its position*/ - lv_obj_set_size(NumberKey_9, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_9, event_handler, ID_NUM_KEY9, NULL, 0); - lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_9, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_9, LV_LAYOUT_OFF); - labelKey_9 = lv_label_create(NumberKey_9, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_9, machine_menu.key_9); - lv_obj_align(labelKey_9, NumberKey_9, LV_ALIGN_CENTER, 0, 0); - - NumberKey_0 = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(NumberKey_0, 92, 240); /*Set its position*/ - lv_obj_set_size(NumberKey_0, 68, 40); - lv_obj_set_event_cb_mks(NumberKey_0, event_handler, ID_NUM_KEY0, NULL, 0); - lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(NumberKey_0, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(NumberKey_0, LV_LAYOUT_OFF); - labelKey_0 = lv_label_create(NumberKey_0, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKey_0, machine_menu.key_0); - lv_obj_align(labelKey_0, NumberKey_0, LV_ALIGN_CENTER, 0, 0); - - KeyBack = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(KeyBack, 320, 90); /*Set its position*/ - lv_obj_set_size(KeyBack, 68, 40); - lv_obj_set_event_cb_mks(KeyBack, event_handler, ID_NUM_BACK, NULL, 0); - lv_btn_set_style(KeyBack, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(KeyBack, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(KeyBack, LV_LAYOUT_OFF); - labelKeyBack = lv_label_create(KeyBack, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKeyBack, machine_menu.key_back); - lv_obj_align(labelKeyBack, KeyBack, LV_ALIGN_CENTER, 0, 0); - - KeyReset = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(KeyReset, 320, 140); /*Set its position*/ - lv_obj_set_size(KeyReset, 68, 40); - lv_obj_set_event_cb_mks(KeyReset, event_handler, ID_NUM_RESET, NULL, 0); - lv_btn_set_style(KeyReset, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(KeyReset, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(KeyReset, LV_LAYOUT_OFF); - labelKeyReset = lv_label_create(KeyReset, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKeyReset, machine_menu.key_reset); - lv_obj_align(labelKeyReset, KeyReset, LV_ALIGN_CENTER, 0, 0); - - KeyConfirm = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(KeyConfirm, 320, 190); /*Set its position*/ - lv_obj_set_size(KeyConfirm, 68, 90); - lv_obj_set_event_cb_mks(KeyConfirm, event_handler, ID_NUM_CONFIRM, NULL, 0); - lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(KeyConfirm, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(KeyConfirm, LV_LAYOUT_OFF); - labelKeyConfirm = lv_label_create(KeyConfirm, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKeyConfirm, machine_menu.key_confirm); - lv_obj_align(labelKeyConfirm, KeyConfirm, LV_ALIGN_CENTER, 0, 0); - - KeyPoint = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(KeyPoint, 244, 240); /*Set its position*/ - lv_obj_set_size(KeyPoint, 68, 40); - lv_obj_set_event_cb_mks(KeyPoint, event_handler, ID_NUM_POINT, NULL, 0); - lv_btn_set_style(KeyPoint, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(KeyPoint, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(KeyPoint, LV_LAYOUT_OFF); - labelKeyPoint = lv_label_create(KeyPoint, NULL); /*Add a label to the button*/ - lv_label_set_text(labelKeyPoint, machine_menu.key_point); - lv_obj_align(labelKeyPoint, KeyPoint, LV_ALIGN_CENTER, 0, 0); - - Minus = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(Minus, 168, 240); /*Set its position*/ - lv_obj_set_size(Minus, 68, 40); - lv_obj_set_event_cb_mks(Minus, event_handler, ID_NUM_NAGETIVE, NULL, 0); - lv_btn_set_style(Minus, LV_BTN_STYLE_REL, &style_num_key_pre); /*Set the button's released style*/ - lv_btn_set_style(Minus, LV_BTN_STYLE_PR, &style_num_key_rel); /*Set the button's pressed style*/ - //lv_btn_set_layout(Minus, LV_LAYOUT_OFF); - labelMinus = lv_label_create(Minus, NULL); /*Add a label to the button*/ - lv_label_set_text(labelMinus, machine_menu.negative); - lv_obj_align(labelMinus, Minus, LV_ALIGN_CENTER, 0, 0); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, NumberKey_1); - lv_group_add_obj(g, NumberKey_2); - lv_group_add_obj(g, NumberKey_3); - lv_group_add_obj(g, KeyBack); - lv_group_add_obj(g, NumberKey_4); - lv_group_add_obj(g, NumberKey_5); - lv_group_add_obj(g, NumberKey_6); - lv_group_add_obj(g, KeyReset); - lv_group_add_obj(g, NumberKey_7); - lv_group_add_obj(g, NumberKey_8); - lv_group_add_obj(g, NumberKey_9); - lv_group_add_obj(g, NumberKey_0); - lv_group_add_obj(g, Minus); - lv_group_add_obj(g, KeyPoint); - lv_group_add_obj(g, KeyConfirm); - } - #endif - - disp_key_value(); -} - -void lv_clear_number_key() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h deleted file mode 100644 index 7902da3649..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_number_key(void); -extern void lv_clear_number_key(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp deleted file mode 100644 index 4a4a0ee130..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ /dev/null @@ -1,413 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../module/motion.h" -#include "../../../../sd/cardreader.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_O_PRE_HEAT 1 -#define ID_O_EXTRUCT 2 -#define ID_O_MOV 3 -#define ID_O_FILAMENT 4 -#define ID_O_SPEED 5 -#define ID_O_RETURN 6 -#define ID_O_FAN 7 -#define ID_O_POWER_OFF 8 -#define ID_O_BABY_STEP 9 - -static lv_obj_t *label_PowerOff; -static lv_obj_t *buttonPowerOff; - -extern feedRate_t feedrate_mm_s; - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_O_PRE_HEAT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_preHeat(); - } - break; - case ID_O_EXTRUCT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_extrusion(); - } - break; - case ID_O_MOV: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_move_motor(); - } - break; - case ID_O_FILAMENT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if HAS_MULTI_EXTRUDER - uiCfg.curSprayerChoose_bak = active_extruder; - #endif - if (uiCfg.print_state == WORKING) { - #if ENABLED(SDSUPPORT) - card.pauseSDPrint(); - stop_print_time(); - uiCfg.print_state = PAUSING; - #endif - } - uiCfg.moveSpeed_bak = (uint16_t)feedrate_mm_s; - uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[active_extruder].target; - lv_clear_operation(); - lv_draw_filament_change(); - } - break; - case ID_O_FAN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_fan(); - } - break; - case ID_O_SPEED: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_change_speed(); - } - break; - case ID_O_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } - break; - case ID_O_POWER_OFF: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.finish_power_off == 1) { - gCfgItems.finish_power_off = 0; - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); - lv_label_set_text(label_PowerOff, printing_more_menu.manual); - lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_obj_refresh_ext_draw_pad(label_PowerOff); - update_spi_flash(); - } - else { - gCfgItems.finish_power_off = 1; - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); - lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); - lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - lv_obj_refresh_ext_draw_pad(label_PowerOff); - update_spi_flash(); - } - } - break; - case ID_O_BABY_STEP: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_operation(); - lv_draw_baby_stepping(); - } - break; - } -} - -void lv_draw_operation(void) { - lv_obj_t *buttonPreHeat = NULL, *buttonExtrusion = NULL, *buttonSpeed = NULL; - lv_obj_t *buttonBack = NULL, *buttonFan = NULL; - lv_obj_t *labelPreHeat = NULL, *labelExtrusion = NULL; - lv_obj_t *label_Back = NULL, *label_Speed = NULL, *label_Fan = NULL; - lv_obj_t *buttonMove = NULL, *label_Move = NULL; - lv_obj_t *buttonBabyStep = NULL, *label_BabyStep = NULL; - lv_obj_t *buttonFilament = NULL, *label_Filament = NULL; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != OPERATE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = OPERATE_UI; - } - disp_state = OPERATE_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create image buttons - buttonPreHeat = lv_imgbtn_create(scr, NULL); - buttonFilament = lv_imgbtn_create(scr, NULL); - buttonFan = lv_imgbtn_create(scr, NULL); - buttonPowerOff = lv_imgbtn_create(scr, NULL); - if (uiCfg.print_state != WORKING) { - buttonExtrusion = lv_imgbtn_create(scr, NULL); - buttonMove = lv_imgbtn_create(scr, NULL); - } - else { - buttonSpeed = lv_imgbtn_create(scr, NULL); - buttonBabyStep = lv_imgbtn_create(scr, NULL); - } - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_O_PRE_HEAT, NULL, 0); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, "F:/bmp_temp.bin"); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, "F:/bmp_temp.bin"); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonFilament, event_handler, ID_O_FILAMENT, NULL, 0); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, "F:/bmp_filamentchange.bin"); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, "F:/bmp_filamentchange.bin"); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_O_FAN, NULL, 0); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, "F:/bmp_fan.bin"); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, "F:/bmp_fan.bin"); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_label_rel); - - if (gCfgItems.finish_power_off == 1) { - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); - } - else { - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); - lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); - } - lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, NULL, 0); - lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPreHeat); - lv_group_add_obj(g, buttonFilament); - lv_group_add_obj(g, buttonFan); - lv_group_add_obj(g, buttonPowerOff); - } - #endif - - if (uiCfg.print_state != WORKING) { - lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_O_EXTRUCT, NULL, 0); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, "F:/bmp_extrude_opr.bin"); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, "F:/bmp_extrude_opr.bin"); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_O_MOV, NULL, 0); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, "F:/bmp_move_opr.bin"); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, "F:/bmp_move_opr.bin"); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonExtrusion); - lv_group_add_obj(g, buttonMove); - } - #endif - } - else { - lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_O_SPEED, NULL, 0); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed.bin"); - lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed.bin"); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBabyStep, event_handler, ID_O_BABY_STEP, NULL, 0); - lv_imgbtn_set_src(buttonBabyStep, LV_BTN_STATE_REL, "F:/bmp_mov.bin"); - lv_imgbtn_set_src(buttonBabyStep, LV_BTN_STATE_PR, "F:/bmp_mov.bin"); - lv_imgbtn_set_style(buttonBabyStep, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBabyStep, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonSpeed); - lv_group_add_obj(g, buttonBabyStep); - } - #endif - } - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_O_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif // if 1 - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonFilament, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonFan, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonPowerOff, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - - if (uiCfg.print_state != WORKING) { - /* - lv_obj_set_pos(buttonFilament,INTERVAL_V,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - } else { - */ - lv_obj_set_pos(buttonExtrusion, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonMove, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - } - else { - lv_obj_set_pos(buttonSpeed, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBabyStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - } - - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPowerOff, LV_LAYOUT_OFF); - - if (uiCfg.print_state != WORKING) { - /* - lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); - } else { - */ - lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); - } - else { - lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBabyStep, LV_LAYOUT_OFF); - } - - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - labelPreHeat = lv_label_create(buttonPreHeat, NULL); - label_Filament = lv_label_create(buttonFilament, NULL); - label_Fan = lv_label_create(buttonFan, NULL); - label_PowerOff = lv_label_create(buttonPowerOff, NULL); - - if (uiCfg.print_state != WORKING) { - /* - label_Filament = lv_label_create(buttonFilament, NULL); - } else { - */ - labelExtrusion = lv_label_create(buttonExtrusion, NULL); - label_Move = lv_label_create(buttonMove, NULL); - } - else { - label_Speed = lv_label_create(buttonSpeed, NULL); - label_BabyStep = lv_label_create(buttonBabyStep, NULL); - } - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelPreHeat, operation_menu.temp); - lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Filament, operation_menu.filament); - lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Fan, operation_menu.fan); - lv_obj_align(label_Fan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - if (gCfgItems.finish_power_off == 1) - lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); - else - lv_label_set_text(label_PowerOff, printing_more_menu.manual); - lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - if (uiCfg.print_state != WORKING) { - /* - lv_label_set_text(label_Filament, operation_menu.filament); - lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - } else { - */ - lv_label_set_text(labelExtrusion, operation_menu.extr); - lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Move, operation_menu.move); - lv_obj_align(label_Move, buttonMove, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else { - lv_label_set_text(label_Speed, operation_menu.speed); - lv_obj_align(label_Speed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_BabyStep, operation_menu.babystep); - lv_obj_align(label_BabyStep, buttonBabyStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } -} - -void lv_clear_operation() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h deleted file mode 100644 index cca1f6a2a5..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_operation(void); -extern void lv_clear_operation(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp deleted file mode 100644 index f7dd2060b8..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_TFT_LVGL_UI, ADVANCED_PAUSE_FEATURE) - -#include "draw_ui.h" -#include "lv_conf.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include "../../../../feature/pause.h" - -void lv_draw_pause_message(const PauseMessage msg) { - switch (msg) { - case PAUSE_MESSAGE_PAUSING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_PAUSING); break; - case PAUSE_MESSAGE_CHANGING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_CHANGING); break; - case PAUSE_MESSAGE_UNLOAD: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_UNLOAD); break; - case PAUSE_MESSAGE_WAITING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_WAITING); break; - case PAUSE_MESSAGE_INSERT: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_INSERT); break; - case PAUSE_MESSAGE_LOAD: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_LOAD); break; - case PAUSE_MESSAGE_PURGE: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_PURGE); break; - case PAUSE_MESSAGE_RESUME: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_RESUME); break; - case PAUSE_MESSAGE_HEAT: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_HEAT); break; - case PAUSE_MESSAGE_HEATING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_HEATING); break; - case PAUSE_MESSAGE_OPTION: pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; - clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_OPTION); break; - case PAUSE_MESSAGE_STATUS: - default: break; - } -} - -#endif // HAS_TFT_LVGL_UI && ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h deleted file mode 100644 index 7d55d83756..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_pause_message(const PauseMessage msg); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp deleted file mode 100644 index 9b99971f4f..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp +++ /dev/null @@ -1,202 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_PAUSE_RETURN 1 -#define ID_PAUSE_X 2 -#define ID_PAUSE_Y 3 -#define ID_PAUSE_Z 4 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_PAUSE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_pause_position(); - draw_return_ui(); - } - break; - case ID_PAUSE_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = pause_pos_x; - lv_clear_pause_position(); - lv_draw_number_key(); - } - break; - case ID_PAUSE_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = pause_pos_y; - lv_clear_pause_position(); - lv_draw_number_key(); - } - break; - case ID_PAUSE_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = pause_pos_z; - lv_clear_pause_position(); - lv_draw_number_key(); - } - break; - } -} - -void lv_draw_pause_position(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PAUSE_POS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = PAUSE_POS_UI; - } - disp_state = PAUSE_POS_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.PausePosText); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.xPos); - - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_PAUSE_X, NULL, 0); - labelXValue = lv_label_create(buttonXValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.yPos); - - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_PAUSE_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.zPos); - - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_PAUSE_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PAUSE_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosX); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosY); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), gCfgItems.pausePosZ); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonBack); - } - #endif -} - -void lv_clear_pause_position() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h deleted file mode 100644 index 3e9e079827..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_pause_position(void); -extern void lv_clear_pause_position(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp deleted file mode 100644 index f58a47b341..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ /dev/null @@ -1,401 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" - -static lv_obj_t * scr; -extern lv_group_t* g; -static lv_obj_t *buttoType, *buttonStep; -static lv_obj_t *labelType; -static lv_obj_t *labelStep; -static lv_obj_t * tempText1; - -#define ID_P_ADD 1 -#define ID_P_DEC 2 -#define ID_P_TYPE 3 -#define ID_P_STEP 4 -#define ID_P_OFF 5 -#define ID_P_RETURN 6 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_P_ADD: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.curTempType == 0) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target += uiCfg.stepHeat; - if (uiCfg.curSprayerChoose == 0) { - if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - } - } - #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER - else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - } - #endif - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); - } - #if HAS_HEATED_BED - else { - thermalManager.temp_bed.target += uiCfg.stepHeat; - if ((int)thermalManager.temp_bed.target > BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { - thermalManager.temp_bed.target = (float)BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); - } - thermalManager.start_watching_bed(); - } - #endif - disp_desire_temp(); - } - break; - case ID_P_DEC: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.curTempType == 0) { - if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > uiCfg.stepHeat) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target -= uiCfg.stepHeat; - } - else { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)0; - } - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); - } - #if HAS_HEATED_BED - else { - if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) { - thermalManager.temp_bed.target -= uiCfg.stepHeat; - } - else { - thermalManager.temp_bed.target = (float)0; - } - thermalManager.start_watching_bed(); - } - #endif - disp_desire_temp(); - } - - break; - case ID_P_TYPE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.curTempType == 0) { - if (ENABLED(HAS_MULTI_EXTRUDER)) { - if (uiCfg.curSprayerChoose == 0) { - uiCfg.curSprayerChoose = 1; - } - else if (uiCfg.curSprayerChoose == 1) { - if (TEMP_SENSOR_BED != 0) { - uiCfg.curTempType = 1; - } - else { - uiCfg.curTempType = 0; - uiCfg.curSprayerChoose = 0; - } - } - } - else if (uiCfg.curSprayerChoose == 0) { - if (TEMP_SENSOR_BED != 0) - uiCfg.curTempType = 1; - else - uiCfg.curTempType = 0; - } - } - else if (uiCfg.curTempType == 1) { - uiCfg.curSprayerChoose = 0; - uiCfg.curTempType = 0; - } - disp_temp_type(); - } - break; - case ID_P_STEP: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - switch (uiCfg.stepHeat) { - case 1: uiCfg.stepHeat = 5; break; - case 5: uiCfg.stepHeat = 10; break; - case 10: uiCfg.stepHeat = 1; break; - default: break; - } - disp_step_heat(); - } - break; - case ID_P_OFF: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (uiCfg.curTempType == 0) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)0; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); - } - #if HAS_HEATED_BED - else { - thermalManager.temp_bed.target = (float)0; - thermalManager.start_watching_bed(); - } - #endif - disp_desire_temp(); - } - break; - case ID_P_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - draw_return_ui(); - } - break; - } -} - -void lv_draw_preHeat(void) { - lv_obj_t *buttonAdd, *buttonDec; - lv_obj_t *buttonOff, *buttonBack; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PRE_HEAT_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = PRE_HEAT_UI; - } - disp_state = PRE_HEAT_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create image buttons - buttonAdd = lv_imgbtn_create(scr, NULL); - buttonDec = lv_imgbtn_create(scr, NULL); - buttoType = lv_imgbtn_create(scr, NULL); - buttonStep = lv_imgbtn_create(scr, NULL); - buttonOff = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_P_ADD, NULL, 0); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); - lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW); - - #if 1 - lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_P_DEC, NULL, 0); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); - lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, NULL, 0); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, NULL, 0); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOff, event_handler, ID_P_OFF, NULL, 0); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, "F:/bmp_speed0.bin"); - lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, "F:/bmp_speed0.bin"); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); - lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); - lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); - labelType = lv_label_create(buttoType, NULL); - labelStep = lv_label_create(buttonStep, NULL); - lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelAdd, preheat_menu.add); - lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelDec, preheat_menu.dec); - lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelOff, preheat_menu.off); - lv_obj_align(labelOff, buttonOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonAdd); - lv_group_add_obj(g, buttonDec); - lv_group_add_obj(g, buttoType); - lv_group_add_obj(g, buttonStep); - lv_group_add_obj(g, buttonOff); - lv_group_add_obj(g, buttonBack); - } - #endif - - disp_temp_type(); - disp_step_heat(); - - tempText1 = lv_label_create(scr, NULL); - lv_obj_set_style(tempText1, &tft_style_label_rel); - disp_desire_temp(); -} - -void disp_temp_type() { - if (uiCfg.curTempType == 0) { - if (uiCfg.curSprayerChoose == 1) { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelType, preheat_menu.ext2); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } - else { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelType, preheat_menu.ext1); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } - - } - else { - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_bed.bin"); - lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_bed.bin"); - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelType, preheat_menu.hotbed); - lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } -} - -void disp_desire_temp() { - char buf[20] = {0}; - - public_buf_l[0] = '\0'; - - if (uiCfg.curTempType == 0) { - if (uiCfg.curSprayerChoose < 1) - strcat(public_buf_l, preheat_menu.ext1); - else - strcat(public_buf_l, preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); - } - #if HAS_HEATED_BED - else { - strcat(public_buf_l, preheat_menu.hotbed); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); - } - #endif - strcat_P(public_buf_l, PSTR(": ")); - strcat(public_buf_l, buf); - lv_label_set_text(tempText1, public_buf_l); - lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50); -} - -void disp_step_heat() { - if (uiCfg.stepHeat == 1) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_degree.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_degree.bin"); - } - else if (uiCfg.stepHeat == 5) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_degree.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_degree.bin"); - } - else if (uiCfg.stepHeat == 10) { - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_degree.bin"); - lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_degree.bin"); - } - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.stepHeat == 1) { - lv_label_set_text(labelStep, preheat_menu.step_1c); - lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if (uiCfg.stepHeat == 5) { - lv_label_set_text(labelStep, preheat_menu.step_5c); - lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - else if (uiCfg.stepHeat == 10) { - lv_label_set_text(labelStep, preheat_menu.step_10c); - lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - } -} - -void lv_clear_preHeat() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h deleted file mode 100644 index c8de942f3f..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_preHeat(void); -extern void lv_clear_preHeat(); -extern void disp_temp_type(); -extern void disp_step_heat(); -extern void disp_desire_temp(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp deleted file mode 100644 index 6d7b68af42..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ /dev/null @@ -1,640 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../../MarlinCore.h" -#include "lv_conf.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" -#include "../../../../sd/cardreader.h" - -static lv_obj_t * scr; -extern lv_group_t* g; - -static lv_obj_t *buttonPageUp, *buttonPageDown, *buttonBack, - *buttonGcode[FILE_BTN_CNT], *labelPageUp[FILE_BTN_CNT], *buttonText[FILE_BTN_CNT]; - -#define ID_P_UP 7 -#define ID_P_DOWN 8 -#define ID_P_RETURN 9 - -int8_t curDirLever = 0; -LIST_FILE list_file; -DIR_OFFSET dir_offset[10]; - -extern uint8_t public_buf[512]; -extern char public_buf_m[100]; - -uint8_t sel_id = 0; - -#if ENABLED(SDSUPPORT) - - static uint8_t search_file() { - int valid_name_cnt = 0; - //char tmp[SHORT_NEME_LEN*MAX_DIR_LEVEL+1]; - - list_file.Sd_file_cnt = 0; - //list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; - - //root2.rewind(); - //SERIAL_ECHOLN(list_file.curDirPath); - - if (curDirLever != 0) card.cd(list_file.curDirPath); - else card.cdroot(); // while(card.cdup()); - - const uint16_t fileCnt = card.get_num_Files(); - - for (uint16_t i = 0; i < fileCnt; i++) { - if (list_file.Sd_file_cnt == list_file.Sd_file_offset) { - const uint16_t nr = SD_ORDER(i, fileCnt); - card.getfilename_sorted(nr); - - if (card.flag.filenameIsDir) { - //SERIAL_ECHOLN(card.longest_filename); - list_file.IsFolder[valid_name_cnt] = 1; - } - else { - //SERIAL_ECHOLN(card.longFilename); - list_file.IsFolder[valid_name_cnt] = 0; - } - - #if 1 - // - memset(list_file.file_name[valid_name_cnt], 0, strlen(list_file.file_name[valid_name_cnt])); - strcpy(list_file.file_name[valid_name_cnt], list_file.curDirPath); - strcat_P(list_file.file_name[valid_name_cnt], PSTR("/")); - strcat(list_file.file_name[valid_name_cnt], card.filename); - // - memset(list_file.long_name[valid_name_cnt], 0, strlen(list_file.long_name[valid_name_cnt])); - if (card.longFilename[0] == 0) - strncpy(list_file.long_name[valid_name_cnt], card.filename, strlen(card.filename)); - else - strncpy(list_file.long_name[valid_name_cnt], card.longFilename, strlen(card.longFilename)); - - valid_name_cnt++; - if (valid_name_cnt == 1) - dir_offset[curDirLever].cur_page_first_offset = list_file.Sd_file_offset; - if (valid_name_cnt >= FILE_NUM) { - dir_offset[curDirLever].cur_page_last_offset = list_file.Sd_file_offset; - list_file.Sd_file_offset++; - break; - } - list_file.Sd_file_offset++; - #endif - } - list_file.Sd_file_cnt++; - } - //card.closefile(false); - return valid_name_cnt; - } - -#endif // SDSUPPORT - -uint8_t have_pre_pic(char *path) { - #if ENABLED(SDSUPPORT) - char *ps1, *ps2, *cur_name = strrchr(path, '/'); - - card.openFileRead(cur_name); - card.read(public_buf, 512); - ps1 = strstr((char *)public_buf, ";simage:"); - card.read(public_buf, 512); - ps2 = strstr((char *)public_buf, ";simage:"); - if (ps1 || ps2) { - card.closefile(); - return 1; - } - card.closefile(); - #endif - - return 0; -} - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - uint8_t i, file_count = 0; - //switch (obj->mks_obj_id) - //{ - if (obj->mks_obj_id == ID_P_UP) { - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - if (dir_offset[curDirLever].curPage > 0) { - // 2015.05.19 - list_file.Sd_file_cnt = 0; - - if (dir_offset[curDirLever].cur_page_first_offset >= FILE_NUM) - list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset - FILE_NUM; - - #if ENABLED(SDSUPPORT) - file_count = search_file(); - #endif - if (file_count != 0) { - dir_offset[curDirLever].curPage--; - lv_clear_print_file(); - disp_gcode_icon(file_count); - } - } - } - } - else if (obj->mks_obj_id == ID_P_DOWN) { - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - if (dir_offset[curDirLever].cur_page_last_offset > 0) { - list_file.Sd_file_cnt = 0; - list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_last_offset + 1; - #if ENABLED(SDSUPPORT) - file_count = search_file(); - #endif - if (file_count != 0) { - dir_offset[curDirLever].curPage++; - lv_clear_print_file(); - disp_gcode_icon(file_count); - } - if (file_count < FILE_NUM) - dir_offset[curDirLever].cur_page_last_offset = 0; - } - } - } - else if (obj->mks_obj_id == ID_P_RETURN) { - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - if (curDirLever > 0) { - int8_t *ch = (int8_t *)strrchr(list_file.curDirPath, '/'); - if (ch) { - *ch = 0; - #if ENABLED(SDSUPPORT) - card.cdup(); - #endif - dir_offset[curDirLever].curPage = 0; - dir_offset[curDirLever].cur_page_first_offset = 0; - dir_offset[curDirLever].cur_page_last_offset = 0; - curDirLever--; - list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; - #if ENABLED(SDSUPPORT) - file_count = search_file(); - #endif - lv_clear_print_file(); - disp_gcode_icon(file_count); - } - } - else { - lv_clear_print_file(); - lv_draw_ready_print(); - } - } - } - else { - for (i = 0; i < FILE_BTN_CNT; i++) { - if (obj->mks_obj_id == (i + 1)) { - if (event == LV_EVENT_CLICKED) { - } - else if (event == LV_EVENT_RELEASED) { - if (list_file.file_name[i][0] != 0) { - if (list_file.IsFolder[i] == 1) { - ZERO(list_file.curDirPath); - strcpy(list_file.curDirPath, list_file.file_name[i]); - curDirLever++; - list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; - #if ENABLED(SDSUPPORT) - file_count = search_file(); - #endif - lv_clear_print_file(); - disp_gcode_icon(file_count); - } - else { - sel_id = i; - lv_clear_print_file(); - lv_draw_dialog(DIALOG_TYPE_PRINT_FILE); - } - break; - } - } - } - } - } -} - -void lv_draw_print_file(void) { - //uint8_t i; - uint8_t file_count; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PRINT_FILE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINT_FILE_UI; - } - disp_state = PRINT_FILE_UI; - - curDirLever = 0; - dir_offset[curDirLever].curPage = 0; - - list_file.Sd_file_offset = 0; - list_file.Sd_file_cnt = 0; - - ZERO(dir_offset); - ZERO(list_file.IsFolder); - ZERO(list_file.curDirPath); - - list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; - #if ENABLED(SDSUPPORT) - card.mount(); - file_count = search_file(); - #endif - disp_gcode_icon(file_count); - - //lv_obj_t *labelPageUp = lv_label_create(buttonPageUp, NULL); - //lv_obj_t *labelPageDown = lv_label_create(buttonPageDown, NULL); - //lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - /* - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelPageUp, tool_menu.preheat); - lv_obj_align(labelPageUp, buttonPageUp, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelPageDown, tool_menu.extrude); - lv_obj_align(labelPageDown, buttonPageDown, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - } - */ -} -static char test_public_buf_l[40]; -void disp_gcode_icon(uint8_t file_num) { - uint8_t i; - - scr = lv_obj_create(NULL, NULL); - - //static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create image buttons - buttonPageUp = lv_imgbtn_create(scr, NULL); - buttonPageDown = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPageUp, event_handler, ID_P_UP, NULL, 0); - lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_REL, "F:/bmp_pageUp.bin"); - lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_PR, "F:/bmp_pageUp.bin"); - lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonPageDown, event_handler, ID_P_DOWN, NULL, 0); - lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_REL, "F:/bmp_pageDown.bin"); - lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_PR, "F:/bmp_pageDown.bin"); - lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonPageUp, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonPageDown, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H); - lv_obj_set_pos(buttonBack, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL * 2 + INTERVAL_H * 2); - - // Create labels on the image buttons - lv_btn_set_layout(buttonPageUp, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPageDown, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - for (i = 0; i < FILE_BTN_CNT; i++) { - /* - if (seq) { - j = (FILE_BTN_CNT-1) - i; - back_flg = 1; - } - else { - j = i; - back_flg = 0; - } - */ - if (i >= file_num) break; - - #ifdef TFT35 - buttonGcode[i] = lv_imgbtn_create(scr, NULL); - - lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonGcode[i], LV_PROTECT_FOLLOW); - lv_btn_set_layout(buttonGcode[i], LV_LAYOUT_OFF); - - ZERO(public_buf_m); - cutFileName((char *)list_file.long_name[i], 16, 8, (char *)public_buf_m); - - if (list_file.IsFolder[i] == 1) { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, "F:/bmp_dir.bin"); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, "F:/bmp_dir.bin"); - if (i < 3) - lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); - else - lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - labelPageUp[i] = lv_label_create(buttonGcode[i], NULL); - lv_obj_set_style(labelPageUp[i], &tft_style_label_rel); - lv_label_set_text(labelPageUp[i], public_buf_m); - lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5); - } - else { - if (have_pre_pic((char *)list_file.file_name[i])) { - - //lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), list_file.file_name[i], 1); - - ZERO(test_public_buf_l); - strcat(test_public_buf_l,"S:"); - strcat(test_public_buf_l,list_file.file_name[i]); - char *temp = strstr(test_public_buf_l,".GCO"); - if (temp) { strcpy(temp,".bin"); } - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, test_public_buf_l); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, test_public_buf_l); - if (i < 3) { - lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET); - buttonText[i] = lv_btn_create(scr, NULL); - //lv_obj_set_event_cb(buttonText[i], event_handler); - - lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_label_pre); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_label_rel); - //lv_obj_set_style(buttonText[i], &tft_style_label_pre); - //lv_obj_set_style(buttonText[i], &tft_style_label_rel); - lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); - lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); - //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0); - lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); - lv_obj_set_size(buttonText[i], 100, 40); - } - else { - lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET); - buttonText[i] = lv_btn_create(scr, NULL); - //lv_obj_set_event_cb(buttonText[i], event_handler); - - lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_label_pre); - lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_label_rel); - - //lv_imgbtn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW); - lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF); - //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0); - lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); - lv_obj_set_size(buttonText[i], 100, 40); - } - labelPageUp[i] = lv_label_create(buttonText[i], NULL); - lv_obj_set_style(labelPageUp[i], &tft_style_label_rel); - lv_label_set_text(labelPageUp[i], public_buf_m); - lv_obj_align(labelPageUp[i], buttonText[i], LV_ALIGN_IN_BOTTOM_MID, 0, 0); - } - else { - lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, "F:/bmp_file.bin"); - lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, "F:/bmp_file.bin"); - if (i < 3) - lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); - else - lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - labelPageUp[i] = lv_label_create(buttonGcode[i], NULL); - lv_obj_set_style(labelPageUp[i], &tft_style_label_rel); - lv_label_set_text(labelPageUp[i], public_buf_m); - lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5); - } - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonGcode[i]); - #endif - - #else // !TFT35 - #endif // !TFT35 - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPageUp); - lv_group_add_obj(g, buttonPageDown); - lv_group_add_obj(g, buttonBack); - } - #endif -} - -uint32_t lv_open_gcode_file(char *path) { - #if ENABLED(SDSUPPORT) - uint32_t *ps4; - uint32_t pre_sread_cnt = 0; - char *cur_name; - - cur_name = strrchr(path, '/'); - - card.openFileRead(cur_name); - card.read(public_buf, 512); - ps4 = (uint32_t *)strstr((char *)public_buf, ";simage:"); - // Ignore the beginning message of gcode file - if (ps4) { - pre_sread_cnt = (uint32_t)ps4 - (uint32_t)((uint32_t *)(&public_buf[0])); - card.setIndex(pre_sread_cnt); - } - return pre_sread_cnt; - #endif // SDSUPPORT -} - -int ascii2dec_test(char *ascii) { - int result = 0; - if (ascii == 0) return 0; - - if (*(ascii) >= '0' && *(ascii) <= '9') - result = *(ascii) - '0'; - else if (*(ascii) >= 'a' && *(ascii) <= 'f') - result = *(ascii) - 'a' + 0x0A; - else if (*(ascii) >= 'A' && *(ascii) <= 'F') - result = *(ascii) - 'A' + 0x0A; - else - return 0; - - return result; -} - -void lv_gcode_file_read(uint8_t *data_buf) { - #if ENABLED(SDSUPPORT) - uint16_t i = 0, j = 0, k = 0; - uint16_t row_1 = 0; - bool ignore_start = true; - char temp_test[200]; - volatile uint16_t *p_index; - - memset(public_buf, 0, 200); - - while (card.isFileOpen()) { - if (ignore_start) card.read(temp_test, 8); // line start -> ignore - card.read(temp_test, 200); // data - // \r;;gimage: we got the bit img, so stop here - if (temp_test[1] == ';') { - card.closefile(); - break; - } - for (i = 0; i < 200;) { - public_buf[row_1 * 200 + 100 * k + j] = (char)(ascii2dec_test(&temp_test[i]) << 4 | ascii2dec_test(&temp_test[i + 1])); - j++; - i += 2; - } - - uint16_t c = card.get(); - // check if we have more data or finished the line (CR) - if (c == '\r') break; - card.setIndex(card.getIndex()); - k++; - j = 0; - ignore_start = false; - } - #if ENABLED(TFT_LVGL_UI_SPI) - for (i = 0; i < 200;) { - p_index = (uint16_t *)(&public_buf[i]); - - //Color = (*p_index >> 8); - //*p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; - } - #else - for (i = 0; i < 200;) { - p_index = (uint16_t *)(&public_buf[i]); - //Color = (*p_index >> 8); - //*p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // 0x18C3; - } - #endif // TFT_LVGL_UI_SPI - memcpy(data_buf, public_buf, 200); - #endif // SDSUPPORT -} - -void lv_close_gcode_file() {TERN_(SDSUPPORT, card.closefile());} - -void lv_gcode_file_seek(uint32_t pos) { - card.setIndex(pos); -} - -void cutFileName(char *path, int len, int bytePerLine, char *outStr) { - #if _LFN_UNICODE - TCHAR *tmpFile; - TCHAR *strIndex1 = 0, *strIndex2 = 0, *beginIndex; - TCHAR secSeg[10] = {0}; - TCHAR gFileTail[4] = {'~', '.', 'g', '\0'}; - #else - char *tmpFile; - char *strIndex1 = 0, *strIndex2 = 0, *beginIndex; - char secSeg[10] = {0}; - #endif - - if (path == 0 || len <= 3 || outStr == 0) return; - - tmpFile = path; - #if _LFN_UNICODE - strIndex1 = (WCHAR *)wcsstr((const WCHAR *)tmpFile, (const WCHAR *)'/'); - strIndex2 = (WCHAR *)wcsstr((const WCHAR *)tmpFile, (const WCHAR *)'.'); - #else - strIndex1 = (char *)strrchr(tmpFile, '/'); - strIndex2 = (char *)strrchr(tmpFile, '.'); - #endif - - beginIndex = (strIndex1 != 0 - //&& (strIndex2 != 0) && (strIndex1 < strIndex2) - ) ? strIndex1 + 1 : tmpFile; - - if (strIndex2 == 0 || (strIndex1 > strIndex2)) { // not gcode file - #if _LFN_UNICODE - if (wcslen(beginIndex) > len) - wcsncpy(outStr, beginIndex, len); - else - wcscpy(outStr, beginIndex); - #else - if ((int)strlen(beginIndex) > len) - strncpy(outStr, beginIndex, len); - else - strcpy(outStr, beginIndex); - #endif - } - else { // gcode file - if (strIndex2 - beginIndex > (len - 2)) { - #if _LFN_UNICODE - wcsncpy(outStr, (const WCHAR *)beginIndex, len - 3); - wcscat(outStr, (const WCHAR *)gFileTail); - #else - //strncpy(outStr, beginIndex, len - 3); - strncpy(outStr, beginIndex, len - 4); - strcat_P(outStr, PSTR("~.g")); - #endif - } - else { - #if _LFN_UNICODE - wcsncpy(outStr, (const WCHAR *)beginIndex, strIndex2 - beginIndex + 1); - wcscat(outStr, (const WCHAR *)&gFileTail[3]); - #else - strncpy(outStr, beginIndex, strIndex2 - beginIndex + 1); - strcat_P(outStr, PSTR("g")); - #endif - } - } - - #if _LFN_UNICODE - if (wcslen(outStr) > bytePerLine) { - wcscpy(secSeg, (const WCHAR *)&outStr[bytePerLine]); - outStr[bytePerLine] = '\n'; - outStr[bytePerLine + 1] = '\0'; - wcscat(outStr, (const WCHAR *)secSeg); - } - #else - if ((int)strlen(outStr) > bytePerLine) { - strcpy(secSeg, &outStr[bytePerLine]); - outStr[bytePerLine] = '\n'; - outStr[bytePerLine + 1] = '\0'; - strcat(outStr, secSeg); - } - else { - strcat_P(outStr, PSTR("\n")); - } - #endif -} - -void lv_clear_print_file() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h deleted file mode 100644 index 083b3d9acf..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -typedef struct { - int cur_page_first_offset; - int cur_page_last_offset; - int curPage; -} DIR_OFFSET; -extern DIR_OFFSET dir_offset[10]; - -#define FILE_NUM 6 -#define SHORT_NEME_LEN 13 -#define NAME_CUT_LEN 23 - -#define MAX_DIR_LEVEL 10 - -typedef struct { - //char longName[FILE_NUM][LONG_FILENAME_LENGTH]; - char file_name[FILE_NUM][SHORT_NEME_LEN * MAX_DIR_LEVEL + 1]; - char curDirPath[SHORT_NEME_LEN * MAX_DIR_LEVEL + 1]; - char long_name[FILE_NUM][SHORT_NEME_LEN * 2 + 1]; - char IsFolder[FILE_NUM]; - char Sd_file_cnt; - char sd_file_index; - char Sd_file_offset; -} LIST_FILE; -extern LIST_FILE list_file; - -extern void disp_gcode_icon(uint8_t file_num); -extern void lv_draw_print_file(void); -extern uint32_t lv_open_gcode_file(char *path); -extern void lv_gcode_file_read(uint8_t *data_buf); -extern void lv_close_gcode_file(); -extern void cutFileName(char *path, int len, int bytePerLine, char *outStr); -extern int ascii2dec_test(char *ascii); -extern void lv_clear_print_file(); -extern void lv_gcode_file_seek(uint32_t pos); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp deleted file mode 100644 index c6369db413..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../module/motion.h" -#include "../../../../sd/cardreader.h" -#include "../../../../gcode/queue.h" -#include "../../../../gcode/gcode.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" -#endif -#if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - #include "../../../ultralcd.h" -#endif - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t *labelExt1, * labelFan, * labelZpos, * labelTime; -TERN_(HAS_MULTI_EXTRUDER, static lv_obj_t *labelExt2;) -static lv_obj_t *labelPause, * labelStop, * labelOperat; -static lv_obj_t * bar1, *bar1ValueText; -static lv_obj_t * buttonPause, *buttonOperat, *buttonStop; - -#if HAS_HEATED_BED - static lv_obj_t* labelBed; -#endif - -#define ID_PAUSE 1 -#define ID_STOP 2 -#define ID_OPTION 3 - -uint8_t once_flag = 0; -extern uint32_t To_pre_view; -extern uint8_t flash_preview_begin; -extern uint8_t default_preview_flg; -extern uint8_t gcode_preview_over; - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_PAUSE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (gcode_preview_over != 1) { - if (uiCfg.print_state == WORKING) { - // #if ENABLED(PARK_HEAD_ON_PAUSE) - // queue.inject_P(PSTR("M25 P\nM24")); - #if ENABLED(SDSUPPORT) - // queue.inject_P(PSTR("M25\nG91\nG1 Z10\nG90")); - card.pauseSDPrint(); - stop_print_time(); - uiCfg.print_state = PAUSING; - #endif - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_resume.bin"); - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_resume.bin"); - lv_label_set_text(labelPause, printing_menu.resume); - lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); - } - else if (uiCfg.print_state == PAUSED) { - uiCfg.print_state = RESUMING; - lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); - lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); - lv_label_set_text(labelPause, printing_menu.pause); - lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); - } - #if ENABLED(POWER_LOSS_RECOVERY) - else if (uiCfg.print_state == REPRINTING) { - uiCfg.print_state = REPRINTED; - lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); - lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); - lv_label_set_text(labelPause, printing_menu.pause); - lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0); - // recovery.resume(); - print_time.minutes = recovery.info.print_job_elapsed / 60; - print_time.seconds = recovery.info.print_job_elapsed % 60; - print_time.hours = print_time.minutes / 60; - } - #endif - } - } - break; - - case ID_STOP: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (gcode_preview_over != 1) { - lv_clear_printing(); - lv_draw_dialog(DIALOG_TYPE_STOP); - } - } - break; - case ID_OPTION: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - if (gcode_preview_over != 1) { - lv_clear_printing(); - lv_draw_operation(); - } - } - break; - } -} - -void lv_draw_printing(void) { - disp_state_stack._disp_index = 0; - ZERO(disp_state_stack._disp_state); - disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINTING_UI; - - disp_state = PRINTING_UI; - - scr = lv_obj_create(NULL, NULL); - - // static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create image buttons - lv_obj_t *buttonExt1 = lv_img_create(scr, NULL); - #if HAS_MULTI_EXTRUDER - lv_obj_t *buttonExt2 = lv_img_create(scr, NULL); - #endif - #if HAS_HEATED_BED - lv_obj_t *buttonBedstate = lv_img_create(scr, NULL); - #endif - lv_obj_t *buttonFanstate = lv_img_create(scr, NULL); - lv_obj_t *buttonTime = lv_img_create(scr, NULL); - lv_obj_t *buttonZpos = lv_img_create(scr, NULL); - buttonPause = lv_imgbtn_create(scr, NULL); - buttonStop = lv_imgbtn_create(scr, NULL); - buttonOperat = lv_imgbtn_create(scr, NULL); - - lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); - #if 1 - #if HAS_MULTI_EXTRUDER - lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); - #endif - #if HAS_HEATED_BED - lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); - #endif - - lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); - - lv_img_set_src(buttonTime, "F:/bmp_time_state.bin"); - - lv_img_set_src(buttonZpos, "F:/bmp_zpos_state.bin"); - - if (uiCfg.print_state == WORKING) { - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); - } - else { - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_resume.bin"); - lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_resume.bin"); - } - - lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, NULL, 0); - lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonStop, event_handler, ID_STOP, NULL, 0); - lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_REL, "F:/bmp_stop.bin"); - lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_PR, "F:/bmp_stop.bin"); - lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonOperat, event_handler, ID_OPTION, NULL, 0); - lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_REL, "F:/bmp_operate.bin"); - lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_PR, "F:/bmp_operate.bin"); - lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif // if 1 - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPause); - lv_group_add_obj(g, buttonStop); - lv_group_add_obj(g, buttonOperat); - } - #endif - - lv_obj_set_pos(buttonExt1, 205, 136); - - #if HAS_MULTI_EXTRUDER - lv_obj_set_pos(buttonExt2, 350, 136); - #endif - - #if HAS_HEATED_BED - lv_obj_set_pos(buttonBedstate, 205, 186); - #endif - - lv_obj_set_pos(buttonFanstate, 350, 186); - lv_obj_set_pos(buttonTime, 205, 86); - lv_obj_set_pos(buttonZpos, 350, 86); - lv_obj_set_pos(buttonPause, 5, 240); - lv_obj_set_pos(buttonStop, 165, 240); - lv_obj_set_pos(buttonOperat, 325, 240); - - // Create labels on the image buttons - //lv_btn_set_layout(buttonExt1, LV_LAYOUT_OFF); - //#if HAS_MULTI_EXTRUDER - //lv_btn_set_layout(buttonExt2, LV_LAYOUT_OFF); - //#endif - - //#if HAS_HEATED_BED - //lv_btn_set_layout(buttonBedstate, LV_LAYOUT_OFF); - //#endif - - //lv_btn_set_layout(buttonFanstate, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonTime, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonZpos, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonPause, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonStop, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonOperat, LV_LAYOUT_OFF); - - labelExt1 = lv_label_create(scr, NULL); - lv_obj_set_style(labelExt1, &tft_style_label_rel); - lv_obj_set_pos(labelExt1, 250, 146); - - #if HAS_MULTI_EXTRUDER - labelExt2 = lv_label_create(scr, NULL); - lv_obj_set_style(labelExt2, &tft_style_label_rel); - lv_obj_set_pos(labelExt2, 395, 146); - #endif - - #if HAS_HEATED_BED - labelBed = lv_label_create(scr, NULL); - lv_obj_set_style(labelBed, &tft_style_label_rel); - lv_obj_set_pos(labelBed, 250, 196); - #endif - - labelFan = lv_label_create(scr, NULL); - lv_obj_set_style(labelFan, &tft_style_label_rel); - lv_obj_set_pos(labelFan, 395, 196); - - labelTime = lv_label_create(scr, NULL); - lv_obj_set_style(labelTime, &tft_style_label_rel); - lv_obj_set_pos(labelTime, 250, 96); - - labelZpos = lv_label_create(scr, NULL); - lv_obj_set_style(labelZpos, &tft_style_label_rel); - lv_obj_set_pos(labelZpos, 395, 96); - - labelPause = lv_label_create(buttonPause, NULL); - labelStop = lv_label_create(buttonStop, NULL); - labelOperat = lv_label_create(buttonOperat, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelPause, uiCfg.print_state == WORKING ? printing_menu.pause : printing_menu.resume); - lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 20, 0); - - lv_label_set_text(labelStop, printing_menu.stop); - lv_obj_align(labelStop, buttonStop, LV_ALIGN_CENTER, 20, 0); - - lv_label_set_text(labelOperat, printing_menu.option); - lv_obj_align(labelOperat, buttonOperat, LV_ALIGN_CENTER, 20, 0); - } - - bar1 = lv_bar_create(scr, NULL); - lv_obj_set_pos(bar1, 205, 36); - lv_obj_set_size(bar1, 270, 40); - lv_bar_set_style(bar1, LV_BAR_STYLE_INDIC, &lv_bar_style_indic); - lv_bar_set_anim_time(bar1, 1000); - lv_bar_set_value(bar1, 0, LV_ANIM_ON); - bar1ValueText = lv_label_create(bar1, NULL); - lv_label_set_text(bar1ValueText,"0%"); - lv_obj_align(bar1ValueText, bar1, LV_ALIGN_CENTER, 0, 0); - - disp_ext_temp(); - disp_bed_temp(); - disp_fan_speed(); - disp_print_time(); - disp_fan_Zpos(); -} - -void disp_ext_temp() { - ZERO(public_buf_l); - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target); - lv_label_set_text(labelExt1, public_buf_l); - - #if HAS_MULTI_EXTRUDER - ZERO(public_buf_l); - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target); - lv_label_set_text(labelExt2, public_buf_l); - #endif -} - -void disp_bed_temp() { - #if HAS_HEATED_BED - ZERO(public_buf_l); - sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); - lv_label_set_text(labelBed, public_buf_l); - #endif -} - -void disp_fan_speed() { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%3d"), thermalManager.fan_speed[0]); - lv_label_set_text(labelFan, public_buf_l); -} - -void disp_print_time() { - ZERO(public_buf_l); - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - const uint32_t r = ui.get_remaining_time(); - sprintf_P(public_buf_l, PSTR("%02d:%02d R"), r / 3600, (r % 3600) / 60); - #else - sprintf_P(public_buf_l, PSTR("%d%d:%d%d:%d%d"), print_time.hours / 10, print_time.hours % 10, print_time.minutes / 10, print_time.minutes % 10, print_time.seconds / 10, print_time.seconds % 10); - #endif - lv_label_set_text(labelTime, public_buf_l); -} - -void disp_fan_Zpos() { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.3f"), current_position[Z_AXIS]); - lv_label_set_text(labelZpos, public_buf_l); -} - -void reset_print_time() { - // print_time.days = 0; - print_time.hours = 0; - print_time.minutes = 0; - print_time.seconds = 0; - print_time.ms_10 = 0; - // print_time.start = 1; -} - -void start_print_time() { print_time.start = 1; } - -void stop_print_time() { print_time.start = 0; } - -void setProBarRate() { - int rate; - volatile long long rate_tmp_r; - - if (gCfgItems.from_flash_pic != 1) { - #if ENABLED(SDSUPPORT) - rate_tmp_r = (long long)card.getIndex() * 100; - #endif - rate = rate_tmp_r / gCfgItems.curFilesize; - } - else { - #if ENABLED(SDSUPPORT) - rate_tmp_r = (long long)card.getIndex(); - #endif - rate = (rate_tmp_r - (PREVIEW_SIZE + To_pre_view)) * 100 / (gCfgItems.curFilesize - (PREVIEW_SIZE + To_pre_view)); - } - // gCurFileState.totalSend = rate; - - if (rate <= 0) return; - - if (disp_state == PRINTING_UI) { - lv_bar_set_value(bar1, rate, LV_ANIM_ON); - ZERO(public_buf_l); - sprintf_P(public_buf_l, "%d%%", rate); - lv_label_set_text(bar1ValueText,public_buf_l); - lv_obj_align(bar1ValueText, bar1, LV_ALIGN_CENTER, 0, 0); - - if (marlin_state == MF_SD_COMPLETE) { - if (once_flag == 0) { - stop_print_time(); - - flash_preview_begin = 0; - default_preview_flg = 0; - lv_clear_printing(); - lv_draw_dialog(DIALOG_TYPE_FINISH_PRINT); - - once_flag = 1; - - #if HAS_SUICIDE - if (gCfgItems.finish_power_off == 1) { - gcode.process_subcommands_now_P(PSTR("M1001")); - queue.inject_P(PSTR("M81")); - marlin_state = MF_RUNNING; - } - #endif - } - } - } -} - -void lv_clear_printing() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h deleted file mode 100644 index b7d464e4f0..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#define IDLE 0 -#define WORKING 1 -#define PAUSING 2 -#define PAUSED 3 -#define REPRINTING 4 -#define REPRINTED 5 -#define RESUMING 6 -#define STOP 7 - -extern void lv_draw_printing(void); -extern void lv_clear_printing(); -extern void disp_ext_temp(); -extern void disp_bed_temp(); -extern void disp_fan_speed(); -extern void disp_print_time(); -extern void disp_fan_Zpos(); -extern void reset_print_time(); -extern void start_print_time(); -extern void stop_print_time(); -extern void setProBarRate(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp deleted file mode 100644 index 54ffdca64a..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "draw_ready_print.h" -#include "draw_tool.h" -#include "lv_conf.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" -#include "tft_lvgl_configuration.h" -#include "mks_hardware_test.h" -#include "draw_ui.h" - -#include - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" - -#include - -//static lv_obj_t *buttonPrint,*buttonTool,*buttonSet; -extern lv_group_t* g; -static lv_obj_t * scr; -#if ENABLED(MKS_TEST) - uint8_t curent_disp_ui = 0; -#endif - -#define ID_TOOL 1 -#define ID_SET 2 -#define ID_PRINT 3 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_TOOL: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - - lv_clear_ready_print(); - lv_draw_tool(); - } - break; - case ID_SET: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_ready_print(); - lv_draw_set(); - } - break; - case ID_PRINT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_ready_print(); - lv_draw_print_file(); - } - break; - } -} - -lv_obj_t *limit_info, *det_info; -lv_style_t limit_style, det_style; -void disp_Limit_ok() { - limit_style.text.color.full = 0xFFFF; - lv_obj_set_style(limit_info, &limit_style); - lv_label_set_text(limit_info, "Limit:ok"); -} -void disp_Limit_error() { - limit_style.text.color.full = 0xF800; - lv_obj_set_style(limit_info, &limit_style); - lv_label_set_text(limit_info, "Limit:error"); -} - -void disp_det_ok() { - det_style.text.color.full = 0xFFFF; - lv_obj_set_style(det_info, &det_style); - lv_label_set_text(det_info, "det:ok"); -} -void disp_det_error() { - det_style.text.color.full = 0xF800; - lv_obj_set_style(det_info, &det_style); - lv_label_set_text(det_info, "det:error"); -} - -lv_obj_t *e1, *e2, *e3, *bed; -void mks_disp_test() { - char buf[30] = {0}; - //lv_obj_t *label_tool2 = lv_label_create(scr, NULL); - //lv_obj_set_pos(label_tool,20,50); - ZERO(buf); - sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.temp_hotend[0].celsius); - lv_label_set_text(e1, buf); - #if HAS_MULTI_HOTEND - ZERO(buf); - sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.temp_hotend[1].celsius); - lv_label_set_text(e2, buf); - #endif - - //ZERO(buf); - //sprintf_P(buf, PSTR("e3:%d"), (int)thermalManager.temp_hotend[2].celsius); - //lv_label_set_text(e3, buf); - #if HAS_HEATED_BED - ZERO(buf); - sprintf_P(buf, PSTR("bed:%d"), (int)thermalManager.temp_bed.celsius); - lv_label_set_text(bed, buf); - #endif -} - -void lv_draw_ready_print(void) { - char buf[30] = {0}; - lv_obj_t *buttonPrint, *buttonTool, *buttonSet; - - disp_state_stack._disp_index = 0; - ZERO(disp_state_stack._disp_state); - disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINT_READY_UI; - - disp_state = PRINT_READY_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - //lv_obj_set_hidden(scr,true); - lv_refr_now(lv_refr_get_disp_refreshing()); - - if (mks_test_flag == 0x1E) { - //lv_obj_t * title = lv_label_create(scr, NULL); - //lv_obj_set_style(title, &tft_style_label_rel); - //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - //lv_label_set_text(title, creat_title_text()); - - // Create image buttons - //buttonPrint = lv_imgbtn_create(scr, NULL); - buttonTool = lv_imgbtn_create(scr, NULL); - //buttonSet = lv_imgbtn_create(scr, NULL); - - #if 1 - lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, NULL, 0); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, "F:/bmp_tool.bin"); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, "F:/bmp_tool.bin"); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_pos(buttonTool, 360, 180); - //lv_obj_set_pos(buttonSet,180,90); - //lv_obj_set_pos(buttonPrint,340,90); - - //lv_obj_set_pos(buttonTool,SIMPLE_FIRST_PAGE_GRAP+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - //lv_obj_set_pos(buttonSet,BTN_X_PIXEL+SIMPLE_FIRST_PAGE_GRAP*2+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - //lv_obj_set_pos(buttonPrint,BTN_X_PIXEL*2+SIMPLE_FIRST_PAGE_GRAP*3+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2); - - // Create labels on the image buttons - //lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF); - - //lv_obj_t *label_print = lv_label_create(buttonPrint, NULL); - //lv_obj_t *label_set = lv_label_create(buttonSet, NULL); - lv_obj_t *label_tool = lv_label_create(buttonTool, NULL); - if (gCfgItems.multiple_language != 0) { - //lv_label_set_text(label_print, main_menu.print); - //lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - - //lv_label_set_text(label_set, main_menu.set); - //lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - - //lv_label_set_style(label_tool,LV_BTN_STATE_PR,&tft_style_label_pre); - //lv_label_set_style(label_tool,LV_BTN_STATE_REL,&tft_style_label_rel); - lv_label_set_text(label_tool, main_menu.tool); - lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - #if 1 - e1 = lv_label_create(scr, NULL); - lv_obj_set_pos(e1, 20, 20); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[0].celsius); - lv_label_set_text(e1, buf); - #if HAS_MULTI_HOTEND - e2 = lv_label_create(scr, NULL); - lv_obj_set_pos(e2, 20, 45); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[1].celsius); - lv_label_set_text(e2, buf); - #endif - - //e3 = lv_label_create(scr, NULL); - //lv_obj_set_pos(e3,20,70); - //sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[2].celsius); - //lv_label_set_text(e3, buf); - - #if HAS_HEATED_BED - bed = lv_label_create(scr, NULL); - lv_obj_set_pos(bed, 20, 95); - sprintf_P(buf, PSTR("bed: %d"), (int)thermalManager.temp_bed.celsius); - lv_label_set_text(bed, buf); - #endif - - limit_info = lv_label_create(scr, NULL); - - lv_style_copy(&limit_style, &lv_style_scr); - limit_style.body.main_color.full = 0X0000; - limit_style.body.grad_color.full = 0X0000; - limit_style.text.color.full = 0Xffff; - lv_obj_set_style(limit_info, &limit_style); - - lv_obj_set_pos(limit_info, 20, 120); - lv_label_set_text(limit_info, " "); - - det_info = lv_label_create(scr, NULL); - - lv_style_copy(&det_style, &lv_style_scr); - det_style.body.main_color.full = 0X0000; - det_style.body.grad_color.full = 0X0000; - det_style.text.color.full = 0Xffff; - lv_obj_set_style(det_info, &det_style); - - lv_obj_set_pos(det_info, 20, 145); - lv_label_set_text(det_info, " "); - #endif // if 1 - - } - else { - // Create an Image button - buttonTool = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonTool, 20, 90); - lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, NULL, 0); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, "F:/bmp_tool.bin"); - lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, "F:/bmp_tool.bin"); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_t *label_tool = lv_label_create(buttonTool, NULL); - lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF); - - buttonSet = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonSet, 180, 90); - lv_obj_set_event_cb_mks(buttonSet, event_handler, ID_SET, NULL, 0); - lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_REL, "F:/bmp_set.bin"); - lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_PR, "F:/bmp_set.bin"); - lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_t *label_set = lv_label_create(buttonSet, NULL); - lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); - - buttonPrint = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonPrint, 340, 90); - lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, NULL, 0); - lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, "F:/bmp_printing.bin"); - lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, "F:/bmp_printing.bin"); - lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_t *label_print = lv_label_create(buttonPrint, NULL); - lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(label_print, main_menu.print); - lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_set, main_menu.set); - lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_tool, main_menu.tool); - lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) { - lv_group_add_obj(g, buttonTool); - lv_group_add_obj(g, buttonSet); - lv_group_add_obj(g, buttonPrint); - } - #endif - } -} - -void lv_clear_ready_print() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable == true) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h deleted file mode 100644 index 5cefe8b59b..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_ready_print(void); -extern void mks_disp_test(); -extern void disp_Limit_ok(); -extern void disp_Limit_error(); -extern void disp_det_error(); -extern void disp_det_ok(); -extern void lv_clear_ready_print(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp deleted file mode 100644 index 6c10713d8a..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp +++ /dev/null @@ -1,389 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../../MarlinCore.h" -#include "draw_ready_print.h" -#include "draw_set.h" -#include "lv_conf.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" -#include "draw_ui.h" -#include "../../../../gcode/queue.h" -#include "pic_manager.h" - -static lv_obj_t * scr; -extern lv_group_t* g; - -#define ID_S_WIFI 1 -#define ID_S_FAN 2 -#define ID_S_ABOUT 3 -#define ID_S_CONTINUE 4 -#define ID_S_MOTOR_OFF 5 -#define ID_S_LANGUAGE 6 -#define ID_S_MACHINE_PARA 7 -#define ID_S_EEPROM_SET 8 -#define ID_S_RETURN 9 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - #if ENABLED(USE_WIFI_FUNCTION) - char buf[6] = { 0 }; - #endif - switch (obj->mks_obj_id) { - - case ID_S_FAN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_fan(); - } - break; - case ID_S_ABOUT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_about(); - } - break; - case ID_S_CONTINUE: - - break; - case ID_S_MOTOR_OFF: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if HAS_SUICIDE - suicide(); - #else - queue.enqueue_now_P(PSTR("M84")); - #endif - } - break; - case ID_S_LANGUAGE: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_language(); - } - break; - case ID_S_MACHINE_PARA: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_machine_para(); - } - break; - case ID_S_EEPROM_SET: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_eeprom_settings(); - } - break; - case ID_S_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_set(); - lv_draw_ready_print(); - } - break; - #if ENABLED(USE_WIFI_FUNCTION) - case ID_S_WIFI: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.wifi_mode_sel == STA_MODEL) { - if (wifi_link_state == WIFI_CONNECTED) { - last_disp_state = SET_UI; - lv_clear_set(); - lv_draw_wifi(); - } - else { - if (uiCfg.command_send == 1) { - buf[0] = 0xA5; - buf[1] = 0x07; - buf[2] = 0x00; - buf[3] = 0x00; - buf[4] = 0xFC; - raw_send_to_wifi(buf, 5); - - last_disp_state = SET_UI; - lv_clear_set(); - lv_draw_wifi_list(); - } - else { - last_disp_state = SET_UI; - lv_clear_set(); - lv_draw_dialog(WIFI_ENABLE_TIPS); - } - } - } - else { - last_disp_state = SET_UI; - lv_clear_set(); - lv_draw_wifi(); - } - } - break; - #endif - } -} - -void lv_draw_set(void) { - lv_obj_t *buttonFan, *buttonAbout; - lv_obj_t *buMotorOff, *buttonBack; - #if HAS_LANG_SELECT_SCREEN - lv_obj_t *buttonLanguage; - #endif - lv_obj_t *buttonMachinePara; - lv_obj_t *buttonEepromSet; - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_t *buttonWifi; - #endif - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != SET_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = SET_UI; - } - disp_state = SET_UI; - - scr = lv_obj_create(NULL, NULL); - - //static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create image buttons - buttonEepromSet = lv_imgbtn_create(scr, NULL); - //buttonWifi = lv_imgbtn_create(scr, NULL); - buttonFan = lv_imgbtn_create(scr, NULL); - buttonAbout = lv_imgbtn_create(scr, NULL); - //buttonContinue = lv_imgbtn_create(scr, NULL); - buMotorOff = lv_imgbtn_create(scr, NULL); - buttonMachinePara = lv_imgbtn_create(scr, NULL); - #if HAS_LANG_SELECT_SCREEN - buttonLanguage = lv_imgbtn_create(scr, NULL); - #endif - #if ENABLED(USE_WIFI_FUNCTION) - buttonWifi = lv_imgbtn_create(scr, NULL); - #endif - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonEepromSet, event_handler, ID_S_EEPROM_SET, NULL, 0); - lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_REL, "F:/bmp_eeprom_settings.bin"); - lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_PR, "F:/bmp_eeprom_settings.bin"); - lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonEepromSet, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if 1 - lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_S_FAN, NULL, 0); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, "F:/bmp_fan.bin"); - lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, "F:/bmp_fan.bin"); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonAbout, event_handler, ID_S_ABOUT, NULL, 0); - lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_REL, "F:/bmp_about.bin"); - lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_PR, "F:/bmp_about.bin"); - lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, NULL, 0); - - #if HAS_SUICIDE - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); - #else - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); - lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); - #endif - lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMachinePara, event_handler, ID_S_MACHINE_PARA, NULL, 0); - lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_REL, "F:/bmp_machine_para.bin"); - lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_PR, "F:/bmp_machine_para.bin"); - lv_imgbtn_set_style(buttonMachinePara, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMachinePara, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if HAS_LANG_SELECT_SCREEN - lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, NULL, 0); - lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, "F:/bmp_language.bin"); - lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, "F:/bmp_language.bin"); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,NULL,0); - lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, "F:/bmp_wifi.bin"); - lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, "F:/bmp_wifi.bin"); - lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_label_rel); - #endif - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN,NULL , 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - #endif // if 1 - - /*lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); - lv_obj_set_pos(buttonFan,BTN_X_PIXEL+INTERVAL_V*2,titleHeight); - lv_obj_set_pos(buttonAbout,BTN_X_PIXEL*2+INTERVAL_V*3,titleHeight); - lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); - lv_obj_set_pos(buMotorOff,INTERVAL_V, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonLanguage,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/ - - //lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight); - lv_obj_set_pos(buttonEepromSet, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonFan, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonAbout, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight); - lv_obj_set_pos(buMotorOff, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - - lv_obj_set_pos(buttonMachinePara, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - #if HAS_LANG_SELECT_SCREEN - lv_obj_set_pos(buttonLanguage, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - #endif - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_set_pos(buttonWifi,BTN_X_PIXEL*2+INTERVAL_V*3,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - #endif - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - /// Create labels on the buttons - //lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonEepromSet, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonAbout, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonContinue, LV_LAYOUT_OFF); - lv_btn_set_layout(buMotorOff, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMachinePara, LV_LAYOUT_OFF); - #if HAS_LANG_SELECT_SCREEN - lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF); - #endif - #if ENABLED(USE_WIFI_FUNCTION) - lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); - #endif - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - //lv_obj_t *labelWifi= lv_label_create(buttonWifi, NULL); - lv_obj_t *label_EepromSet = lv_label_create(buttonEepromSet, NULL); - lv_obj_t *labelFan = lv_label_create(buttonFan, NULL); - lv_obj_t *label_About = lv_label_create(buttonAbout, NULL); - //lv_obj_t *label_Continue = lv_label_create(buttonContinue, NULL); - lv_obj_t *label_MotorOff = lv_label_create(buMotorOff, NULL); - lv_obj_t *label_MachinePara = lv_label_create(buttonMachinePara, NULL); - #if HAS_LANG_SELECT_SCREEN - lv_obj_t *label_Language = lv_label_create(buttonLanguage, NULL); - #endif - #if ENABLED(USE_WIFI_FUNCTION) - lv_obj_t *label_Wifi = lv_label_create(buttonWifi, NULL); - #endif - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - - lv_label_set_text(label_EepromSet, set_menu.eepromSet); - lv_obj_align(label_EepromSet, buttonEepromSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelFan, set_menu.fan); - lv_obj_align(labelFan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_About, set_menu.about); - lv_obj_align(label_About, buttonAbout, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - //lv_label_set_text(label_Continue, set_menu.breakpoint); - //lv_obj_align(label_Continue, buttonContinue, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - lv_label_set_text(label_MotorOff, set_menu.TERN(HAS_SUICIDE, shutdown, motoroff)); - lv_obj_align(label_MotorOff, buMotorOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_MachinePara, set_menu.machine_para); - lv_obj_align(label_MachinePara, buttonMachinePara, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - #if HAS_LANG_SELECT_SCREEN - lv_label_set_text(label_Language, set_menu.language); - lv_obj_align(label_Language, buttonLanguage, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - #endif - - #if ENABLED(USE_WIFI_FUNCTION) - lv_label_set_text(label_Wifi, set_menu.wifi); - lv_obj_align(label_Wifi, buttonWifi, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - #endif - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonEepromSet); - lv_group_add_obj(g, buttonFan); - lv_group_add_obj(g, buttonAbout); - lv_group_add_obj(g, buMotorOff); - lv_group_add_obj(g, buttonMachinePara); - lv_group_add_obj(g, buttonLanguage); - #if ENABLED(USE_WIFI_FUNCTION) - lv_group_add_obj(g, buttonWifi); - #endif - lv_group_add_obj(g, buttonBack); - } - #endif -} - -void lv_clear_set() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h deleted file mode 100644 index b243bca296..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_set(void); -extern void lv_clear_set(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp deleted file mode 100644 index baad23f9ae..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp +++ /dev/null @@ -1,328 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_STEP_RETURN 1 -#define ID_STEP_X 2 -#define ID_STEP_Y 3 -#define ID_STEP_Z 4 -#define ID_STEP_E0 5 -#define ID_STEP_E1 6 -#define ID_STEP_DOWN 7 -#define ID_STEP_UP 8 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_STEP_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_step_settings(); - draw_return_ui(); - } - break; - case ID_STEP_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Xstep; - lv_clear_step_settings(); - lv_draw_number_key(); - } - break; - case ID_STEP_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Ystep; - lv_clear_step_settings(); - lv_draw_number_key(); - } - break; - case ID_STEP_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Zstep; - lv_clear_step_settings(); - lv_draw_number_key(); - } - break; - case ID_STEP_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E0step; - lv_clear_step_settings(); - lv_draw_number_key(); - } - break; - case ID_STEP_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E1step; - lv_clear_step_settings(); - lv_draw_number_key(); - } - break; - case ID_STEP_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_step_settings(); - lv_draw_step_settings(); - } - break; - case ID_STEP_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_step_settings(); - lv_draw_step_settings(); - } - break; - } -} - -void lv_draw_step_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != STEPS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = STEPS_UI; - } - disp_state = STEPS_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.StepsConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - if (uiCfg.para_ui_page != 1) { - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.X_Steps); - - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_STEP_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Y_Steps); - - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_STEP_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Steps); - - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_STEP_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - labelE0Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE0Text, &tft_style_label_rel); - lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelE0Text, machine_menu.E0_Steps); - - buttonE0Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_STEP_E0, NULL, 0); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); - labelE0Value = lv_label_create(buttonE0Value, NULL); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonE0Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - else { - labelE1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE1Text, &tft_style_label_rel); - lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelE1Text, machine_menu.E1_Steps); - - buttonE1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_STEP_E1, NULL, 0); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); - labelE1Value = lv_label_create(buttonE1Value, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonE1Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - } - - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); - - buttonBack = lv_btn_create(scr, NULL); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_STEP_RETURN, NULL, 0); - label_Back = lv_label_create(buttonBack, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.para_ui_page != 1) { - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); - lv_label_set_text(labelE0Value, public_buf_l); - lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); - } - else { - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS_N(1)]); - lv_label_set_text(labelE1Value, public_buf_l); - lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_step_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h deleted file mode 100644 index b7eaeb4c61..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_step_settings(void); -extern void lv_clear_step_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp deleted file mode 100644 index 10aa7badff..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp +++ /dev/null @@ -1,387 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_TFT_LVGL_UI, HAS_TRINAMIC_CONFIG) - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" -#include "../../../../module/stepper/indirection.h" -#include "../../../../feature/tmc_util.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_TMC_CURRENT_RETURN 1 -#define ID_TMC_CURRENT_X 2 -#define ID_TMC_CURRENT_Y 3 -#define ID_TMC_CURRENT_Z 4 -#define ID_TMC_CURRENT_E0 5 -#define ID_TMC_CURRENT_E1 6 -#define ID_TMC_CURRENT_DOWN 7 -#define ID_TMC_CURRENT_UP 8 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_TMC_CURRENT_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_current_settings(); - draw_return_ui(); - } - break; - #if AXIS_IS_TMC(X) - case ID_TMC_CURRENT_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Xcurrent; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } - break; - #endif - - #if AXIS_IS_TMC(Y) - case ID_TMC_CURRENT_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Ycurrent; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } - break; - #endif - - #if AXIS_IS_TMC(Z) - case ID_TMC_CURRENT_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = Zcurrent; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } - break; - #endif - - #if AXIS_IS_TMC(E0) - case ID_TMC_CURRENT_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E0current; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } - break; - #endif - - #if AXIS_IS_TMC(E1) - case ID_TMC_CURRENT_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - value = E1current; - lv_clear_tmc_current_settings(); - lv_draw_number_key(); - } - break; - #endif - case ID_TMC_CURRENT_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_current_settings(); - lv_draw_tmc_current_settings(); - } - break; - case ID_TMC_CURRENT_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_tmc_current_settings(); - lv_draw_tmc_current_settings(); - } - break; - } -} - -void lv_draw_tmc_current_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; - lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; - lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; - lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; - - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - //#if AXIS_IS_TMC(E1) - lv_obj_t *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *labelE1Text = NULL, *buttonE1Value = NULL, *labelE1Value = NULL; - //#endif - float milliamps; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_CURRENT_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = TMC_CURRENT_UI; - } - disp_state = TMC_CURRENT_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.TmcCurrentConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - if (uiCfg.para_ui_page != 1) { - labelXText = lv_label_create(scr, NULL); - lv_obj_set_style(labelXText, &tft_style_label_rel); - lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelXText, machine_menu.X_Current); - - buttonXValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_TMC_CURRENT_X, NULL, 0); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); - labelXValue = lv_label_create(buttonXValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - labelYText = lv_label_create(scr, NULL); - lv_obj_set_style(labelYText, &tft_style_label_rel); - lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - lv_label_set_text(labelYText, machine_menu.Y_Current); - - buttonYValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_TMC_CURRENT_Y, NULL, 0); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); - labelYValue = lv_label_create(buttonYValue, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - labelZText = lv_label_create(scr, NULL); - lv_obj_set_style(labelZText, &tft_style_label_rel); - lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - lv_label_set_text(labelZText, machine_menu.Z_Current); - - buttonZValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_TMC_CURRENT_Z, NULL, 0); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); - labelZValue = lv_label_create(buttonZValue, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - labelE0Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE0Text, &tft_style_label_rel); - lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelE0Text, machine_menu.E0_Current); - - buttonE0Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE0Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_TMC_CURRENT_E0, NULL, 0); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); - labelE0Value = lv_label_create(buttonE0Value, NULL); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonXValue); - lv_group_add_obj(g, buttonYValue); - lv_group_add_obj(g, buttonZValue); - lv_group_add_obj(g, buttonE0Value); - } - #endif - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - //#if AXIS_IS_TMC(E1) - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_DOWN, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); - #endif - //#endif - } - else { - //#if AXIS_IS_TMC(E1) - labelE1Text = lv_label_create(scr, NULL); - lv_obj_set_style(labelE1Text, &tft_style_label_rel); - lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelE1Text, machine_menu.E1_Current); - - buttonE1Value = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); - lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_TMC_CURRENT_E1, NULL, 0); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); - labelE1Value = lv_label_create(buttonE1Value, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_UP, NULL, 0); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonE1Value); - lv_group_add_obj(g, buttonTurnPage); - } - #endif - //#endif - } - //#if AXIS_IS_TMC(E1) - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); - //#endif - - buttonBack = lv_btn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_CURRENT_RETURN, NULL, 0); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); - lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.para_ui_page != 1) { - //#if AXIS_IS_TMC(E1) - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - //#endif - #if AXIS_IS_TMC(X) - milliamps = stepperX.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelXValue, public_buf_l); - lv_obj_align(labelXValue, buttonXValue, LV_ALIGN_CENTER, 0, 0); - - #if AXIS_IS_TMC(Y) - milliamps = stepperY.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelYValue, public_buf_l); - lv_obj_align(labelYValue, buttonYValue, LV_ALIGN_CENTER, 0, 0); - - #if AXIS_IS_TMC(Z) - milliamps = stepperZ.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelZValue, public_buf_l); - lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); - - #if AXIS_IS_TMC(E0) - milliamps = stepperE0.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelE0Value, public_buf_l); - lv_obj_align(labelE0Value, buttonE0Value, LV_ALIGN_CENTER, 0, 0); - } - else { - //#if AXIS_IS_TMC(E1) - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - #if AXIS_IS_TMC(E1) - milliamps = stepperE1.getMilliamps(); - #else - milliamps = -1; - #endif - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("%.1f"), milliamps); - lv_label_set_text(labelE1Value, public_buf_l); - lv_obj_align(labelE1Value, buttonE1Value, LV_ALIGN_CENTER, 0, 0); - //#endif - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_tmc_current_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI && HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h deleted file mode 100644 index 927db37138..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_tmc_current_settings(void); -extern void lv_clear_tmc_current_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif - diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp deleted file mode 100644 index 3e014a781c..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp +++ /dev/null @@ -1,586 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_TFT_LVGL_UI, HAS_STEALTHCHOP) - -#include "lv_conf.h" -#include "draw_ui.h" - -#include "../../../../MarlinCore.h" -#include "../../../../module/planner.h" -#include "../../../../module/stepper/indirection.h" -#include "../../../../feature/tmc_util.h" -#include "../../../../gcode/gcode.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_TMC_MODE_RETURN 1 -#define ID_TMC_MODE_X 2 -#define ID_TMC_MODE_Y 3 -#define ID_TMC_MODE_Z 4 -#define ID_TMC_MODE_E0 5 -#define ID_TMC_MODE_E1 6 -#define ID_TMC_MODE_DOWN 7 -#define ID_TMC_MODE_UP 8 - -static lv_obj_t *labelXState = NULL, *labelYState = NULL, *labelZState = NULL, *labelE0State = NULL; -static lv_obj_t *buttonXState = NULL, *buttonYState = NULL, *buttonZState = NULL, *buttonE0State = NULL; - -//#if AXIS_HAS_STEALTHCHOP(E1) - static lv_obj_t *labelE1State = NULL, *buttonE1State = NULL; -//#endif - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_TMC_MODE_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_step_mode_settings(); - draw_return_ui(); - } - break; - - #if AXIS_HAS_STEALTHCHOP(X) - case ID_TMC_MODE_X: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperX.stored.stealthChop_enabled) { - stepperX.stored.stealthChop_enabled = false; - stepperX.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - lv_label_set_text(labelXState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - // gcode.process_subcommands_now_P(PSTR("M500")); - } - else { - stepperX.stored.stealthChop_enabled = true; - stepperX.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelXState, machine_menu.enable); - // gcode.process_subcommands_now_P(PSTR("M500")); - } - gcode.process_subcommands_now_P(PSTR("M500")); - } - break; - #endif // if AXIS_HAS_STEALTHCHOP(X) - - #if AXIS_HAS_STEALTHCHOP(Y) - case ID_TMC_MODE_Y: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperY.stored.stealthChop_enabled) { - stepperY.stored.stealthChop_enabled = false; - stepperY.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - lv_label_set_text(labelYState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - else { - stepperY.stored.stealthChop_enabled = true; - stepperY.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelYState, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); - } - break; - #endif // if AXIS_HAS_STEALTHCHOP(Y) - - #if AXIS_HAS_STEALTHCHOP(Z) - case ID_TMC_MODE_Z: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperZ.stored.stealthChop_enabled) { - stepperZ.stored.stealthChop_enabled = false; - stepperZ.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - lv_label_set_text(labelZState, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - else { - stepperZ.stored.stealthChop_enabled = true; - stepperZ.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelZState, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); - } - break; - #endif // if AXIS_HAS_STEALTHCHOP(Z) - - #if AXIS_HAS_STEALTHCHOP(E0) - case ID_TMC_MODE_E0: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperE0.stored.stealthChop_enabled) { - stepperE0.stored.stealthChop_enabled = false; - stepperE0.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - lv_label_set_text(labelE0State, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - else { - stepperE0.stored.stealthChop_enabled = true; - stepperE0.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelE0State, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); - } - break; - #endif // if AXIS_HAS_STEALTHCHOP(E0) - - #if AXIS_HAS_STEALTHCHOP(E1) - case ID_TMC_MODE_E1: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (stepperE1.stored.stealthChop_enabled) { - stepperE1.stored.stealthChop_enabled = false; - stepperE1.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - lv_label_set_text(labelE1State, machine_menu.disable); - //lv_obj_align(labelXState, buttonE1State, LV_ALIGN_IN_LEFT_MID,0, 0); - } - else { - stepperE1.stored.stealthChop_enabled = true; - stepperE1.refresh_stepping_mode(); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - lv_label_set_text(labelE1State, machine_menu.enable); - } - gcode.process_subcommands_now_P(PSTR("M500")); - } - break; - #endif // if AXIS_HAS_STEALTHCHOP(E1) - case ID_TMC_MODE_UP: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 0; - lv_clear_tmc_step_mode_settings(); - lv_draw_tmc_step_mode_settings(); - } - break; - case ID_TMC_MODE_DOWN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.para_ui_page = 1; - lv_clear_tmc_step_mode_settings(); - lv_draw_tmc_step_mode_settings(); - } - break; - } -} - -void lv_draw_tmc_step_mode_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL; - lv_obj_t *buttonXText = NULL, *labelXText = NULL; - lv_obj_t *buttonYText = NULL, *labelYText = NULL; - lv_obj_t *buttonZText = NULL, *labelZText = NULL; - lv_obj_t *buttonE0Text = NULL, *labelE0Text = NULL; - - lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; - //#if AXIS_HAS_STEALTHCHOP(E1) - lv_obj_t *buttonTurnPage = NULL, *labelTurnPage = NULL; - lv_obj_t *buttonE1Text = NULL, *labelE1Text = NULL; - //#endif - - - labelXState = NULL; - buttonXState = NULL; - labelYState = NULL; - buttonYState = NULL; - labelZState = NULL; - buttonZState = NULL; - labelE0State = NULL; - buttonE0State = NULL; - //#if AXIS_HAS_STEALTHCHOP(E1) - labelE1State = NULL; - buttonE1State = NULL; - //#endif - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TMC_MODE_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = TMC_MODE_UI; - } - disp_state = TMC_MODE_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, machine_menu.TmcStepModeConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - if (uiCfg.para_ui_page != 1) { - buttonXText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonXText, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonXText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonXText, event_handler); - lv_btn_set_style(buttonXText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonXText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonXText, LV_LAYOUT_OFF); - labelXText = lv_label_create(buttonXText, NULL); /*Add a label to the button*/ - - buttonXState = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonXState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(X) - if (stepperX.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, NULL, 0); - - lv_imgbtn_set_style(buttonXState, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonXState, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonXState, LV_LAYOUT_OFF); - labelXState = lv_label_create(buttonXState, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXState); - #endif - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonYText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ - lv_obj_set_size(buttonYText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonYText, event_handler); - lv_btn_set_style(buttonYText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonYText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonYText, LV_LAYOUT_OFF); - labelYText = lv_label_create(buttonYText, NULL); /*Add a label to the button*/ - - buttonYState = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonYState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(Y) - if (stepperY.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, NULL, 0); - - lv_imgbtn_set_style(buttonYState, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonYState, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonYState, LV_LAYOUT_OFF); - labelYState = lv_label_create(buttonYState, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYState); - #endif - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2, line_points[1]); - - buttonZText = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ - lv_obj_set_size(buttonZText, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonZText, event_handler); - lv_btn_set_style(buttonZText, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonZText, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonZText, LV_LAYOUT_OFF); - labelZText = lv_label_create(buttonZText, NULL); /*Add a label to the button*/ - - buttonZState = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonZState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(Z) - if (stepperZ.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, NULL, 0); - lv_imgbtn_set_style(buttonZState, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonZState, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonZState, LV_LAYOUT_OFF); - labelZState = lv_label_create(buttonZState, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZState); - #endif - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3, line_points[2]); - - buttonE0Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4); /*Set its position*/ - lv_obj_set_size(buttonE0Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE0Text, event_handler); - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE0Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE0Text, LV_LAYOUT_OFF); - labelE0Text = lv_label_create(buttonE0Text, NULL); /*Add a label to the button*/ - - buttonE0State = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonE0State, PARA_UI_STATE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(E0) - if (stepperE0.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - - lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, NULL, 0); - - lv_imgbtn_set_style(buttonE0State, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonE0State, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonE0State, LV_LAYOUT_OFF); - labelE0State = lv_label_create(buttonE0State, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE0State); - #endif - - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4, line_points[3]); - - //#if AXIS_HAS_STEALTHCHOP(E1) - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_DOWN, NULL, 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); - #endif - //#endif - } - else { - //#if AXIS_HAS_STEALTHCHOP(E1) - buttonE1Text = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonE1Text, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ - lv_obj_set_size(buttonE1Text, PARA_UI_VALUE_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ - lv_obj_set_event_cb(buttonE1Text, event_handler); - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonE1Text, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonE1Text, LV_LAYOUT_OFF); - labelE1Text = lv_label_create(buttonE1Text, NULL); /*Add a label to the button*/ - - buttonE1State = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonE1State, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); - #if AXIS_HAS_STEALTHCHOP(E1) - if (stepperE1.get_stealthChop_status()) { - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - #else - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - #endif - lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, NULL, 0); - lv_imgbtn_set_style(buttonE1State, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonE1State, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonE1State, LV_LAYOUT_OFF); - labelE1State = lv_label_create(buttonE1State, NULL); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE1State); - #endif - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1, line_points[0]); - - buttonTurnPage = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_MODE_UP, NULL, 0); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonTurnPage, LV_BTN_STATE_REL, &tft_style_label_rel); - //#endif - } - //#if AXIS_HAS_STEALTHCHOP(E1) - lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_btn_set_layout(buttonTurnPage, LV_LAYOUT_OFF); - labelTurnPage = lv_label_create(buttonTurnPage, NULL); - //#endif - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_MODE_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - if (uiCfg.para_ui_page != 1) { - lv_label_set_text(labelXText, machine_menu.X_StepMode); - lv_obj_align(labelXText, buttonXText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelYText, machine_menu.Y_StepMode); - lv_obj_align(labelYText, buttonYText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelZText, machine_menu.Z_StepMode); - lv_obj_align(labelZText, buttonZText, LV_ALIGN_IN_LEFT_MID, 0, 0); - - lv_label_set_text(labelE0Text, machine_menu.E0_StepMode); - lv_obj_align(labelE0Text, buttonE0Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - - #if AXIS_HAS_STEALTHCHOP(X) - if (stepperX.get_stealthChop_status()) - lv_label_set_text(labelXState, machine_menu.enable); - else - lv_label_set_text(labelXState, machine_menu.disable); - #else - lv_label_set_text(labelXState, machine_menu.disable); - #endif - lv_obj_align(labelXState, buttonXState, LV_ALIGN_CENTER, 0, 0); - - #if AXIS_HAS_STEALTHCHOP(Y) - if (stepperY.get_stealthChop_status()) - lv_label_set_text(labelYState, machine_menu.enable); - else - lv_label_set_text(labelYState, machine_menu.disable); - #else - lv_label_set_text(labelYState, machine_menu.disable); - #endif - lv_obj_align(labelYState, buttonYState, LV_ALIGN_CENTER, 0, 0); - - #if AXIS_HAS_STEALTHCHOP(Z) - if (stepperZ.get_stealthChop_status()) - lv_label_set_text(labelZState, machine_menu.enable); - else - lv_label_set_text(labelZState, machine_menu.disable); - #else - lv_label_set_text(labelZState, machine_menu.disable); - #endif - lv_obj_align(labelZState, buttonZState, LV_ALIGN_CENTER, 0, 0); - - #if AXIS_HAS_STEALTHCHOP(E0) - if (stepperE0.get_stealthChop_status()) - lv_label_set_text(labelE0State, machine_menu.enable); - else - lv_label_set_text(labelE0State, machine_menu.disable); - #else - lv_label_set_text(labelE0State, machine_menu.disable); - #endif - lv_obj_align(labelE0State, buttonE0State, LV_ALIGN_CENTER, 0, 0); - - //#if AXIS_HAS_STEALTHCHOP(E1) - lv_label_set_text(labelTurnPage, machine_menu.next); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - //#endif - } - else { - //#if AXIS_HAS_STEALTHCHOP(E1) - lv_label_set_text(labelE1Text, machine_menu.E1_StepMode); - lv_obj_align(labelE1Text, buttonE1Text, LV_ALIGN_IN_LEFT_MID, 0, 0); - #if AXIS_HAS_STEALTHCHOP(E1) - if (stepperE1.get_stealthChop_status()) - lv_label_set_text(labelE1State, machine_menu.enable); - else - lv_label_set_text(labelE1State, machine_menu.disable); - #else - lv_label_set_text(labelE1State, machine_menu.disable); - #endif - lv_obj_align(labelE1State, buttonE1State, LV_ALIGN_CENTER, 0, 0); - - lv_label_set_text(labelTurnPage, machine_menu.previous); - lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); - //#endif - } - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); - } -} - -void lv_clear_tmc_step_mode_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI && HAS_STEALTHCHOP diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h deleted file mode 100644 index 35c57ab0cc..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_tmc_step_mode_settings(void); -extern void lv_clear_tmc_step_mode_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp deleted file mode 100644 index 3681b1b2d6..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" -//#include "../lvgl/src/lv_objx/lv_imgbtn.h" -//#include "../lvgl/src/lv_objx/lv_img.h" -//#include "../lvgl/src/lv_core/lv_disp.h" -//#include "../lvgl/src/lv_core/lv_refr.h" - -#include "../../../../MarlinCore.h" -#include "../../../../gcode/queue.h" -#include "../../../../module/temperature.h" - -extern lv_group_t * g; -static lv_obj_t * scr; - -#define ID_T_PRE_HEAT 1 -#define ID_T_EXTRUCT 2 -#define ID_T_MOV 3 -#define ID_T_HOME 4 -#define ID_T_LEVELING 5 -#define ID_T_FILAMENT 6 -#define ID_T_MORE 7 -#define ID_T_RETURN 8 - -#if ENABLED(MKS_TEST) - extern uint8_t curent_disp_ui; -#endif - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_T_PRE_HEAT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_tool(); - lv_draw_preHeat(); - } - break; - case ID_T_EXTRUCT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_tool(); - lv_draw_extrusion(); - } - break; - case ID_T_MOV: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_tool(); - lv_draw_move_motor(); - } - break; - case ID_T_HOME: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_tool(); - lv_draw_home(); - } - break; - case ID_T_LEVELING: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - //queue.enqueue_one_P(PSTR("G28")); - //queue.enqueue_one_P(PSTR("G29")); - get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); - public_buf_m[sizeof(public_buf_m)-1] = 0; - queue.inject_P(PSTR(public_buf_m)); - #else - uiCfg.leveling_first_time = 1; - lv_clear_tool(); - lv_draw_manualLevel(); - #endif - } - break; - case ID_T_FILAMENT: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; - lv_clear_tool(); - lv_draw_filament_change(); - } - break; - case ID_T_MORE: break; - case ID_T_RETURN: - if (event == LV_EVENT_CLICKED) { - // nothing to do - } - else if (event == LV_EVENT_RELEASED) { - TERN_(MKS_TEST, curent_disp_ui = 1); - lv_clear_tool(); - lv_draw_ready_print(); - } - break; - } -} - -void lv_draw_tool(void) { - lv_obj_t *buttonPreHeat, *buttonExtrusion, *buttonMove, *buttonHome, *buttonLevel; - lv_obj_t *buttonFilament; - lv_obj_t *buttonBack; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TOOL_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = TOOL_UI; - } - disp_state = TOOL_UI; - - scr = lv_obj_create(NULL, NULL); - - //static lv_style_t tool_style; - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create image buttons - buttonPreHeat = lv_imgbtn_create(scr, NULL); - buttonExtrusion = lv_imgbtn_create(scr, NULL); - buttonMove = lv_imgbtn_create(scr, NULL); - buttonHome = lv_imgbtn_create(scr, NULL); - buttonLevel = lv_imgbtn_create(scr, NULL); - buttonFilament = lv_imgbtn_create(scr, NULL); - //buttonMore = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_T_PRE_HEAT, NULL, 0); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, "F:/bmp_preHeat.bin"); - lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, "F:/bmp_preHeat.bin"); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_T_EXTRUCT, NULL, 0); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, "F:/bmp_extruct.bin"); - lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, "F:/bmp_extruct.bin"); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_T_MOV, NULL, 0); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, "F:/bmp_mov.bin"); - lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, "F:/bmp_mov.bin"); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonHome, event_handler, ID_T_HOME, NULL, 0); - lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_REL, "F:/bmp_zero.bin"); - lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_PR, "F:/bmp_zero.bin"); - lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_T_LEVELING, NULL, 0); - lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_REL, "F:/bmp_leveling.bin"); - lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_PR, "F:/bmp_leveling.bin"); - lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_T_FILAMENT,NULL,0); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, "F:/bmp_filamentchange.bin"); - lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, "F:/bmp_filamentchange.bin"); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_T_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); - lv_obj_set_pos(buttonExtrusion, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); - lv_obj_set_pos(buttonMove, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); - lv_obj_set_pos(buttonHome, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); - lv_obj_set_pos(buttonLevel, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - lv_obj_set_pos(buttonFilament,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight); - //lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); - - // Create labels on the image buttons - lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonHome, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); - //lv_btn_set_layout(buttonMore, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - lv_obj_t *labelPreHeat = lv_label_create(buttonPreHeat, NULL); - lv_obj_t *labelExtrusion = lv_label_create(buttonExtrusion, NULL); - lv_obj_t *label_Move = lv_label_create(buttonMove, NULL); - lv_obj_t *label_Home = lv_label_create(buttonHome, NULL); - lv_obj_t *label_Level = lv_label_create(buttonLevel, NULL); - lv_obj_t *label_Filament = lv_label_create(buttonFilament, NULL); - //lv_obj_t *label_More = lv_label_create(buttonMore, NULL); - lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language != 0) { - lv_label_set_text(labelPreHeat, tool_menu.preheat); - lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(labelExtrusion, tool_menu.extrude); - lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Move, tool_menu.move); - lv_obj_align(label_Move, buttonMove, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Home, tool_menu.home); - lv_obj_align(label_Home, buttonHome, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Level, tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling)); - lv_obj_align(label_Level, buttonLevel, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Filament, tool_menu.filament); - lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - //lv_label_set_text(label_More, tool_menu.more); - //lv_obj_align(label_More, buttonMore, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonPreHeat); - lv_group_add_obj(g, buttonExtrusion); - lv_group_add_obj(g, buttonMove); - lv_group_add_obj(g, buttonHome); - lv_group_add_obj(g, buttonLevel); - lv_group_add_obj(g, buttonFilament); - lv_group_add_obj(g, buttonBack); - } - #endif -} - -void lv_clear_tool() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h deleted file mode 100644 index 8a033e2c40..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_tool(void); -extern void lv_clear_tool(); - -//extern void disp_temp_ready_print(); -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp deleted file mode 100644 index d600b09a5f..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ /dev/null @@ -1,1631 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "SPI_TFT.h" - -#include "tft_lvgl_configuration.h" - -#include "pic_manager.h" - -#include "draw_ui.h" -#include "mks_hardware_test.h" - -#include - -#include "../../../../MarlinCore.h" -#include "../../../../sd/cardreader.h" -#include "../../../../module/motion.h" -#include "../../../../module/planner.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" -#endif - -#if ENABLED(PARK_HEAD_ON_PAUSE) - #include "../../../../feature/pause.h" -#endif - -CFG_ITMES gCfgItems; -UI_CFG uiCfg; -DISP_STATE_STACK disp_state_stack; -DISP_STATE disp_state = MAIN_UI; -DISP_STATE last_disp_state; -PRINT_TIME print_time; -num_key_value_state value; -keyboard_value_state keyboard_value; - -uint32_t To_pre_view; -uint8_t gcode_preview_over; -uint8_t flash_preview_begin; -uint8_t default_preview_flg; -uint32_t size = 809; -uint16_t row; -uint8_t temperature_change_frequency; -uint8_t printing_rate_update_flag; - -extern uint8_t once_flag; -extern uint8_t sel_id; -extern uint8_t public_buf[512]; -extern uint8_t bmp_public_buf[17 * 1024]; - -extern void LCD_IO_WriteData(uint16_t RegValue); - -static const char custom_gcode_command[][100] = { - "G28\nG29\nM500", - "G28", - "G28", - "G28", - "G28" -}; - -lv_point_t line_points[4][2] = { - {{PARA_UI_POS_X, PARA_UI_POS_Y + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y + PARA_UI_SIZE_Y}}, - {{PARA_UI_POS_X, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*2 + PARA_UI_SIZE_Y}}, - {{PARA_UI_POS_X, PARA_UI_POS_Y*3 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*3 + PARA_UI_SIZE_Y}}, - {{PARA_UI_POS_X, PARA_UI_POS_Y*4 + PARA_UI_SIZE_Y}, {TFT_WIDTH, PARA_UI_POS_Y*4 + PARA_UI_SIZE_Y}} -}; -void gCfgItems_init() { - gCfgItems.multiple_language = MULTI_LANGUAGE_ENABLE; - #if 1 // LCD_LANGUAGE == en - gCfgItems.language = LANG_ENGLISH; - #elif LCD_LANGUAGE == zh_CN - gCfgItems.language = LANG_SIMPLE_CHINESE; - #elif LCD_LANGUAGE == zh_TW - gCfgItems.language = LANG_COMPLEX_CHINESE; - #elif LCD_LANGUAGE == jp_kana - gCfgItems.language = LANG_JAPAN; - #elif LCD_LANGUAGE == de - gCfgItems.language = LANG_GERMAN; - #elif LCD_LANGUAGE == fr - gCfgItems.language = LANG_FRENCH; - #elif LCD_LANGUAGE == ru - gCfgItems.language = LANG_RUSSIAN; - #elif LCD_LANGUAGE == ko_KR - gCfgItems.language = LANG_KOREAN; - #elif LCD_LANGUAGE == tr - gCfgItems.language = LANG_TURKISH; - #elif LCD_LANGUAGE == es - gCfgItems.language = LANG_SPANISH; - #elif LCD_LANGUAGE == el - gCfgItems.language = LANG_GREEK; - #elif LCD_LANGUAGE == it - gCfgItems.language = LANG_ITALY; - #elif LCD_LANGUAGE == pt - gCfgItems.language = LANG_PORTUGUESE; - #endif - gCfgItems.leveling_mode = 0; - gCfgItems.from_flash_pic = 0; - gCfgItems.curFilesize = 0; - gCfgItems.finish_power_off = 0; - gCfgItems.pause_reprint = 0; - gCfgItems.pausePosX = -1; - gCfgItems.pausePosY = -1; - gCfgItems.pausePosZ = 5; - gCfgItems.levelingPos[0][0] = X_MIN_POS + 30; - gCfgItems.levelingPos[0][1] = Y_MIN_POS + 30; - gCfgItems.levelingPos[1][0] = X_MAX_POS - 30; - gCfgItems.levelingPos[1][1] = Y_MIN_POS + 30; - gCfgItems.levelingPos[2][0] = X_MAX_POS - 30; - gCfgItems.levelingPos[2][1] = Y_MAX_POS - 30; - gCfgItems.levelingPos[3][0] = X_MIN_POS + 30; - gCfgItems.levelingPos[3][1] = Y_MAX_POS - 30; - gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2; - gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2; - gCfgItems.cloud_enable = true; - #if ENABLED(USE_WIFI_FUNCTION) - gCfgItems.wifi_mode_sel = STA_MODEL; - gCfgItems.fileSysType = FILE_SYS_SD; - gCfgItems.wifi_type = ESP_WIFI; - #endif - gCfgItems.filamentchange_load_length = 200; - gCfgItems.filamentchange_load_speed = 1000; - gCfgItems.filamentchange_unload_length = 200; - gCfgItems.filamentchange_unload_speed = 1000; - gCfgItems.filament_limit_temper = 200; - - gCfgItems.encoder_enable = true; - - W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems.spi_flash_flag, VAR_INF_ADDR, sizeof(gCfgItems.spi_flash_flag)); - if (gCfgItems.spi_flash_flag == FLASH_INF_VALID_FLAG) { - W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); - } - else { - gCfgItems.spi_flash_flag = FLASH_INF_VALID_FLAG; - W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); - //init gcode command - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[0], AUTO_LEVELING_COMMAND_ADDR, 100); - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[1], OTHERS_COMMAND_ADDR_1, 100); - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[2], OTHERS_COMMAND_ADDR_2, 100); - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[3], OTHERS_COMMAND_ADDR_3, 100); - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[4], OTHERS_COMMAND_ADDR_4, 100); - } - - const byte rot = (TFT_ROTATION & TFT_ROTATE_180) ? 0xEE : 0x00; - if (gCfgItems.disp_rotation_180 != rot) { - gCfgItems.disp_rotation_180 = rot; - update_spi_flash(); - } - - uiCfg.F[0] = 'N'; - uiCfg.F[1] = 'A'; - uiCfg.F[2] = 'N'; - uiCfg.F[3] = 'O'; - W25QXX.SPI_FLASH_BlockErase(REFLSHE_FLGA_ADD + 32 - 64*1024); - W25QXX.SPI_FLASH_BufferWrite(uiCfg.F,REFLSHE_FLGA_ADD,4); -} - -void ui_cfg_init() { - uiCfg.curTempType = 0; - uiCfg.curSprayerChoose = 0; - uiCfg.stepHeat = 10; - uiCfg.leveling_first_time = 0; - uiCfg.para_ui_page = 0; - uiCfg.extruStep = 5; - uiCfg.extruSpeed = 10; - uiCfg.move_dist = 1; - uiCfg.moveSpeed = 3000; - uiCfg.stepPrintSpeed = 10; - uiCfg.command_send = 0; - uiCfg.dialogType = 0; - uiCfg.filament_heat_completed_load = 0; - uiCfg.filament_rate = 0; - uiCfg.filament_loading_completed = 0; - uiCfg.filament_unloading_completed = 0; - uiCfg.filament_loading_time_flg = 0; - uiCfg.filament_loading_time_cnt = 0; - uiCfg.filament_unloading_time_flg = 0; - uiCfg.filament_unloading_time_cnt = 0; - - #if ENABLED(USE_WIFI_FUNCTION) - memset(&wifiPara, 0, sizeof(wifiPara)); - memset(&ipPara, 0, sizeof(ipPara)); - strcpy(wifiPara.ap_name, WIFI_AP_NAME); - strcpy(wifiPara.keyCode, WIFI_KEY_CODE); - //client - strcpy(ipPara.ip_addr, IP_ADDR); - strcpy(ipPara.mask, IP_MASK); - strcpy(ipPara.gate, IP_GATE); - strcpy(ipPara.dns, IP_DNS); - - ipPara.dhcp_flag = IP_DHCP_FLAG; - - //AP - strcpy(ipPara.dhcpd_ip, AP_IP_ADDR); - strcpy(ipPara.dhcpd_mask, AP_IP_MASK); - strcpy(ipPara.dhcpd_gate, AP_IP_GATE); - strcpy(ipPara.dhcpd_dns, AP_IP_DNS); - strcpy(ipPara.start_ip_addr, IP_START_IP); - strcpy(ipPara.end_ip_addr, IP_END_IP); - - ipPara.dhcpd_flag = AP_IP_DHCP_FLAG; - - strcpy((char*)uiCfg.cloud_hostUrl, "baizhongyun.cn"); - uiCfg.cloud_port = 10086; - #endif - - uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length * 60.0 / gCfgItems.filamentchange_load_speed) + 0.5); - uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length * 60.0 / gCfgItems.filamentchange_unload_speed) + 0.5); -} - -void update_spi_flash() { - uint8_t command_buf[512]; - - W25QXX.init(SPI_QUARTER_SPEED); - //read back the gcode command befor erase spi flash - W25QXX.SPI_FLASH_BufferRead((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); - W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); -} - -void update_gcode_command(int addr,uint8_t *s) { - uint8_t command_buf[512]; - - W25QXX.init(SPI_QUARTER_SPEED); - //read back the gcode command befor erase spi flash - W25QXX.SPI_FLASH_BufferRead((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); - W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); - switch (addr) { - case AUTO_LEVELING_COMMAND_ADDR: memcpy(&command_buf[0*100], s, 100); break; - case OTHERS_COMMAND_ADDR_1: memcpy(&command_buf[1*100], s, 100); break; - case OTHERS_COMMAND_ADDR_2: memcpy(&command_buf[2*100], s, 100); break; - case OTHERS_COMMAND_ADDR_3: memcpy(&command_buf[3*100], s, 100); break; - case OTHERS_COMMAND_ADDR_4: memcpy(&command_buf[4*100], s, 100); break; - default: break; - } - W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); -} - -void get_gcode_command(int addr,uint8_t *d) { - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead((uint8_t *)d, addr, 100); -} - -lv_style_t tft_style_scr; -lv_style_t tft_style_label_pre; -lv_style_t tft_style_label_rel; -lv_style_t style_line; -lv_style_t style_para_value_pre; -lv_style_t style_para_value_rel; - -lv_style_t style_num_key_pre; -lv_style_t style_num_key_rel; - -lv_style_t style_num_text; -lv_style_t style_sel_text; - -lv_style_t style_para_value; -lv_style_t style_para_back; - -lv_style_t lv_bar_style_indic; - -void tft_style_init() { - lv_style_copy(&tft_style_scr, &lv_style_scr); - tft_style_scr.body.main_color = LV_COLOR_BACKGROUND; - tft_style_scr.body.grad_color = LV_COLOR_BACKGROUND; - tft_style_scr.text.color = LV_COLOR_TEXT; - tft_style_scr.text.sel_color = LV_COLOR_TEXT; - tft_style_scr.line.width = 0; - tft_style_scr.text.letter_space = 0; - tft_style_scr.text.line_space = 0; - - lv_style_copy(&tft_style_label_pre, &lv_style_scr); - lv_style_copy(&tft_style_label_rel, &lv_style_scr); - tft_style_label_pre.body.main_color = LV_COLOR_BACKGROUND; - tft_style_label_pre.body.grad_color = LV_COLOR_BACKGROUND; - tft_style_label_pre.text.color = LV_COLOR_TEXT; - tft_style_label_pre.text.sel_color = LV_COLOR_TEXT; - tft_style_label_rel.body.main_color = LV_COLOR_BACKGROUND; - tft_style_label_rel.body.grad_color = LV_COLOR_BACKGROUND; - tft_style_label_rel.text.color = LV_COLOR_TEXT; - tft_style_label_rel.text.sel_color = LV_COLOR_TEXT; - tft_style_label_pre.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); - tft_style_label_rel.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); - tft_style_label_pre.line.width = 0; - tft_style_label_rel.line.width = 0; - tft_style_label_pre.text.letter_space = 0; - tft_style_label_rel.text.letter_space = 0; - tft_style_label_pre.text.line_space = -5; - tft_style_label_rel.text.line_space = -5; - - lv_style_copy(&style_para_value_pre, &lv_style_scr); - lv_style_copy(&style_para_value_rel, &lv_style_scr); - style_para_value_pre.body.main_color = LV_COLOR_BACKGROUND; - style_para_value_pre.body.grad_color = LV_COLOR_BACKGROUND; - style_para_value_pre.text.color = LV_COLOR_TEXT; - style_para_value_pre.text.sel_color = LV_COLOR_TEXT; - style_para_value_rel.body.main_color = LV_COLOR_BACKGROUND; - style_para_value_rel.body.grad_color = LV_COLOR_BACKGROUND; - style_para_value_rel.text.color = LV_COLOR_BLACK; - style_para_value_rel.text.sel_color = LV_COLOR_BLACK; - style_para_value_pre.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); - style_para_value_rel.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); - style_para_value_pre.line.width = 0; - style_para_value_rel.line.width = 0; - style_para_value_pre.text.letter_space = 0; - style_para_value_rel.text.letter_space = 0; - style_para_value_pre.text.line_space = -5; - style_para_value_rel.text.line_space = -5; - - lv_style_copy(&style_num_key_pre, &lv_style_scr); - lv_style_copy(&style_num_key_rel, &lv_style_scr); - style_num_key_pre.body.main_color = LV_COLOR_KEY_BACKGROUND; - style_num_key_pre.body.grad_color = LV_COLOR_KEY_BACKGROUND; - style_num_key_pre.text.color = LV_COLOR_TEXT; - style_num_key_pre.text.sel_color = LV_COLOR_TEXT; - style_num_key_rel.body.main_color = LV_COLOR_KEY_BACKGROUND; - style_num_key_rel.body.grad_color = LV_COLOR_KEY_BACKGROUND; - style_num_key_rel.text.color = LV_COLOR_TEXT; - style_num_key_rel.text.sel_color = LV_COLOR_TEXT; - #if HAS_SPI_FLASH_FONT - style_num_key_pre.text.font = &gb2312_puhui32; - style_num_key_rel.text.font = &gb2312_puhui32; - #else - style_num_key_pre.text.font = LV_FONT_DEFAULT; - style_num_key_rel.text.font = LV_FONT_DEFAULT; - #endif - - style_num_key_pre.line.width = 0; - style_num_key_rel.line.width = 0; - style_num_key_pre.text.letter_space = 0; - style_num_key_rel.text.letter_space = 0; - style_num_key_pre.text.line_space = -5; - style_num_key_rel.text.line_space = -5; - lv_style_copy(&style_num_text, &lv_style_scr); - - style_num_text.body.main_color = LV_COLOR_WHITE; - style_num_text.body.grad_color = LV_COLOR_WHITE; - style_num_text.text.color = LV_COLOR_BLACK; - style_num_text.text.sel_color = LV_COLOR_BLACK; - style_num_text.text.font = TERN(HAS_SPI_FLASH_FONT, &gb2312_puhui32, LV_FONT_DEFAULT); - style_num_text.line.width = 0; - style_num_text.text.letter_space = 0; - style_num_text.text.line_space = -5; - - lv_style_copy(&style_sel_text, &lv_style_scr); - style_sel_text.body.main_color = LV_COLOR_BACKGROUND; - style_sel_text.body.grad_color = LV_COLOR_BACKGROUND; - style_sel_text.text.color = LV_COLOR_YELLOW; - style_sel_text.text.sel_color = LV_COLOR_YELLOW; - style_sel_text.text.font = &gb2312_puhui32; - style_sel_text.line.width = 0; - style_sel_text.text.letter_space = 0; - style_sel_text.text.line_space = -5; - lv_style_copy(&style_line, &lv_style_plain); - style_line.line.color = LV_COLOR_MAKE(0x49, 0x54, 0xFF); - style_line.line.width = 1; - style_line.line.rounded = 1; - - lv_style_copy(&style_para_value, &lv_style_plain); - style_para_value.body.border.color = LV_COLOR_BACKGROUND; - style_para_value.body.border.width = 1; - style_para_value.body.main_color = LV_COLOR_WHITE; - style_para_value.body.grad_color = LV_COLOR_WHITE; - style_para_value.body.shadow.width = 0; - style_para_value.body.radius = 3; - style_para_value.text.color = LV_COLOR_BLACK; - style_para_value.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); - - lv_style_copy(&style_para_back, &lv_style_plain); - style_para_back.body.border.color = LV_COLOR_BACKGROUND; - style_para_back.body.border.width = 1; - style_para_back.body.main_color = TFT_LV_PARA_BACK_BODY_COLOR; - style_para_back.body.grad_color = TFT_LV_PARA_BACK_BODY_COLOR; - style_para_back.body.shadow.width = 0; - style_para_back.body.radius = 3; - style_para_back.text.color = LV_COLOR_WHITE; - style_para_back.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); - - lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color); - lv_bar_style_indic.text.color = lv_color_hex3(0xADF); - lv_bar_style_indic.image.color = lv_color_hex3(0xADF); - lv_bar_style_indic.line.color = lv_color_hex3(0xADF); - lv_bar_style_indic.body.main_color = lv_color_hex3(0xADF); - lv_bar_style_indic.body.grad_color = lv_color_hex3(0xADF); - lv_bar_style_indic.body.border.color = lv_color_hex3(0xADF); - -} - -#define MAX_TITLE_LEN 28 - -char public_buf_m[100] = {0}; -char public_buf_l[30]; - -void titleText_cat(char *str, int strSize, char *addPart) { - if (str == 0 || addPart == 0) return; - if ((int)(strlen(str) + strlen(addPart)) >= strSize) return; - strcat(str, addPart); -} - -char *getDispText(int index) { - - ZERO(public_buf_l); - - switch (disp_state_stack._disp_state[index]) { - case PRINT_READY_UI: - strcpy(public_buf_l, main_menu.title); - break; - case PRINT_FILE_UI: - strcpy(public_buf_l, file_menu.title); - break; - case PRINTING_UI: - if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - #ifndef TFT35 - || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI - #endif - ) strcpy(public_buf_l, common_menu.print_special_title); - else strcpy(public_buf_l, printing_menu.title); - break; - case MOVE_MOTOR_UI: - strcpy(public_buf_l, move_menu.title); - break; - case OPERATE_UI: - if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - #ifndef TFT35 - || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI - #endif - ) strcpy(public_buf_l, common_menu.operate_special_title); - else strcpy(public_buf_l, operation_menu.title); - break; - - case PAUSE_UI: - if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI - ) strcpy(public_buf_l, common_menu.pause_special_title); - else strcpy(public_buf_l, pause_menu.title); - break; - - case EXTRUSION_UI: - strcpy(public_buf_l, extrude_menu.title); - break; - case CHANGE_SPEED_UI: - strcpy(public_buf_l, speed_menu.title); - break; - case FAN_UI: - strcpy(public_buf_l, fan_menu.title); - break; - case PRE_HEAT_UI: - if ((disp_state_stack._disp_state[disp_state_stack._disp_index - 1] == OPERATE_UI)) - strcpy(public_buf_l, preheat_menu.adjust_title); - else strcpy(public_buf_l, preheat_menu.title); - break; - case SET_UI: - strcpy(public_buf_l, set_menu.title); - break; - case ZERO_UI: - strcpy(public_buf_l, home_menu.title); - break; - case SPRAYER_UI: break; - case MACHINE_UI: break; - case LANGUAGE_UI: - strcpy(public_buf_l, language_menu.title); - break; - case ABOUT_UI: - strcpy(public_buf_l, about_menu.title); - break; - case LOG_UI: break; - case DISK_UI: - strcpy(public_buf_l, filesys_menu.title); - break; - case DIALOG_UI: - strcpy(public_buf_l, common_menu.dialog_confirm_title); - break; - case WIFI_UI: - strcpy(public_buf_l, wifi_menu.title); - break; - case MORE_UI: - case PRINT_MORE_UI: - strcpy(public_buf_l, more_menu.title); - break; - case FILAMENTCHANGE_UI: - strcpy(public_buf_l, filament_menu.title); - break; - case LEVELING_UI: - case MESHLEVELING_UI: - strcpy(public_buf_l, leveling_menu.title); - break; - case BIND_UI: - strcpy(public_buf_l, cloud_menu.title); - break; - case TOOL_UI: - strcpy(public_buf_l, tool_menu.title); - break; - case WIFI_LIST_UI: - #if ENABLED(USE_WIFI_FUNCTION) - strcpy(public_buf_l, list_menu.title); - break; - #endif - case MACHINE_PARA_UI: - strcpy(public_buf_l, MachinePara_menu.title); - break; - case BABY_STEP_UI: - strcpy(public_buf_l, operation_menu.babystep); - break; - case EEPROM_SETTINGS_UI: - strcpy(public_buf_l, eeprom_menu.title); - break; - default: break; - } - - return public_buf_l; -} - -char *creat_title_text() { - int index = 0; - char *tmpText = 0; - char tmpCurFileStr[20]; - - ZERO(tmpCurFileStr); - - #if _LFN_UNICODE - //cutFileName((TCHAR *)curFileName, 16, 16, (TCHAR *)tmpCurFileStr); - #else - cutFileName(list_file.long_name[sel_id], 16, 16, tmpCurFileStr); - #endif - - ZERO(public_buf_m); - - while (index <= disp_state_stack._disp_index) { - tmpText = getDispText(index); - if ((*tmpText == 0) || (tmpText == 0)) { - index++; - continue; - } - - titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText); - if (index < disp_state_stack._disp_index) titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">"); - - index++; - } - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI - /*|| disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI - || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI*/ - ) { - titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)":"); - titleText_cat(public_buf_m, sizeof(public_buf_m), tmpCurFileStr); - } - - if (strlen(public_buf_m) > MAX_TITLE_LEN) { - ZERO(public_buf_m); - tmpText = getDispText(0); - if (*tmpText != 0) { - titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText); - titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">...>"); - tmpText = getDispText(disp_state_stack._disp_index); - if (*tmpText != 0) titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText); - } - } - - return public_buf_m; -} - -#if HAS_GCODE_PREVIEW - - uint32_t gPicturePreviewStart = 0; - - void preview_gcode_prehandle(char *path) { - #if ENABLED(SDSUPPORT) - //uint8_t re; - //uint32_t read; - uint32_t pre_read_cnt = 0; - uint32_t *p1; - char *cur_name; - - gPicturePreviewStart = 0; - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - card.read(public_buf, 512); - p1 = (uint32_t *)strstr((char *)public_buf, ";simage:"); - - if (p1) { - pre_read_cnt = (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); - - To_pre_view = pre_read_cnt; - gcode_preview_over = 1; - gCfgItems.from_flash_pic = 1; - update_spi_flash(); - } - else { - gcode_preview_over = 0; - default_preview_flg = 1; - gCfgItems.from_flash_pic = 0; - update_spi_flash(); - } - card.closefile(); - #endif - } - - #if 1 - - void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { - #if ENABLED(SDSUPPORT) - //uint8_t ress; - //uint32_t write; - volatile uint32_t i, j; - volatile uint16_t *p_index; - //int res; - char *cur_name; - - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - - if (gPicturePreviewStart <= 0) { - while (1) { - uint32_t br = card.read(public_buf, 400); - uint32_t* p1 = (uint32_t *)strstr((char *)public_buf, ";gimage:"); - if (p1) { - gPicturePreviewStart += (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0])); - break; - } - else { - gPicturePreviewStart += br; - } - if (br < 400) break; - } - } - - card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); - SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); - - j = i = 0; - - while (1) { - card.read(public_buf, 400); - for (i = 0; i < 400;) { - bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); - i += 2; - j++; - } - if (j >= 400) break; - } - for (i = 0; i < 400; i += 2) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; - } - SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); - #if HAS_BAK_VIEW_IN_FLASH - W25QXX.init(SPI_QUARTER_SPEED); - if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); - W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); - #endif - row++; - if (row >= 200) { - size = 809; - row = 0; - - gcode_preview_over = 0; - //flash_preview_begin = 1; - - card.closefile(); - - /* - if (gCurFileState.file_open_flag != 0xAA) { - reset_file_info(); - res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); - if (res == FR_OK) { - f_lseek(file,PREVIEW_SIZE+To_pre_view); - gCurFileState.file_open_flag = 0xAA; - //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); - srcfp = file; - mksReprint.mks_printer_state = MKS_WORKING; - once_flag = 0; - } - } - */ - char *cur_name; - - cur_name = strrchr(list_file.file_name[sel_id], '/'); - - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } - - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01; - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01; - #endif - card.startFileprint(); - TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - once_flag = 0; - } - return; - } - card.closefile(); - #endif // SDSUPPORT - } - - #else // if 1 - - void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) { - #if ENABLED(SDSUPPORT) - //uint8_t ress; - //uint32_t write; - volatile uint32_t i, j; - volatile uint16_t *p_index; - //int res; - char *cur_name; - uint16_t Color; - - cur_name = strrchr(path, '/'); - card.openFileRead(cur_name); - - card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8); - #if ENABLED(TFT_LVGL_UI_SPI) - SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); - #else - LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1); - LCD_WriteRAM_Prepare(); - #endif - - j = 0; - i = 0; - - while (1) { - card.read(public_buf, 400); - for (i = 0; i < 400;) { - bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]); - i += 2; - j++; - } - - //if (i > 800) break; - //#ifdef TFT70 - // if (j > 400) { - // f_read(file, buff_pic, 1, &read); - // break; - // } - //#elif defined(TFT35) - if (j >= 400) - //f_read(file, buff_pic, 1, &read); - break; - //#endif - - } - #if ENABLED(TFT_LVGL_UI_SPI) - for (i = 0; i < 400;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - - Color = (*p_index >> 8); - *p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - if (*p_index == 0x0000) *p_index = 0xC318; - } - TFT_CS_L; - TFT_DC_H; - SPI.dmaSend(bmp_public_buf, 400, true); - TFT_CS_H; - - #else - for (i = 0; i < 400;) { - p_index = (uint16_t *)(&bmp_public_buf[i]); - if (*p_index == 0x0000) *p_index = 0x18C3; - LCD_IO_WriteData(*p_index); - i = i + 2; - } - #endif - W25QXX.init(SPI_QUARTER_SPEED); - if (row < 20) - W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); - W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400); - row++; - if (row >= 200) { - size = 809; - row = 0; - - gcode_preview_over = 0; - //flash_preview_begin = 1; - - card.closefile(); - - /* - if (gCurFileState.file_open_flag != 0xAA) { - reset_file_info(); - res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ); - if (res == FR_OK) { - f_lseek(file,PREVIEW_SIZE+To_pre_view); - gCurFileState.file_open_flag = 0xAA; - //bakup_file_path((uint8_t *)curFileName, strlen(curFileName)); - srcfp = file; - mksReprint.mks_printer_state = MKS_WORKING; - once_flag = 0; - } - } - */ - char *cur_name; - - cur_name = strrchr(list_file.file_name[sel_id], '/'); - - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } - - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0] = planner.flow_percentage[0] * 0.01; - #if HAS_MULTI_EXTRUDER - planner.flow_percentage[1] = 100; - planner.e_factor[1] = planner.flow_percentage[1] * 0.01; - #endif - card.startFileprint(); - TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); - once_flag = 0; - } - return; - } - card.closefile(); - #endif // SDSUPPORT - } - - #endif // if 1 - - void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) { - int index; - int y_off = 0; - W25QXX.init(SPI_QUARTER_SPEED); - for (index = 0; index < 10; index++) { // 200*200 - #if HAS_BAK_VIEW_IN_FLASH - if (sel == 1) { - flash_view_Read(bmp_public_buf, 8000); // 20k - } - else { - default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k - } - #else - default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k - #endif - - SPI_TFT.setWindow(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 - SPI_TFT.tftio.WriteSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20); - - y_off++; - } - W25QXX.init(SPI_QUARTER_SPEED); - } - - void disp_pre_gcode(int xpos_pixel, int ypos_pixel) { - if (gcode_preview_over == 1) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel); - #if HAS_BAK_VIEW_IN_FLASH - if (flash_preview_begin == 1) { - flash_preview_begin = 0; - Draw_default_preview(xpos_pixel, ypos_pixel, 1); - } - #endif - #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH - if (default_preview_flg == 1) { - Draw_default_preview(xpos_pixel, ypos_pixel, 0); - default_preview_flg = 0; - } - #endif - } -#endif // HAS_GCODE_PREVIEW - -void print_time_run() { - static uint8_t lastSec = 0; - - if (print_time.seconds >= 60) { - print_time.seconds = 0; - print_time.minutes++; - if (print_time.minutes >= 60) { - print_time.minutes = 0; - print_time.hours++; - } - } - if (disp_state == PRINTING_UI) { - if (lastSec != print_time.seconds) disp_print_time(); - lastSec = print_time.seconds; - } -} - -void GUI_RefreshPage() { - if ((systick_uptime_millis % 1000) == 0) temperature_change_frequency = 1; - if ((systick_uptime_millis % 3000) == 0) printing_rate_update_flag = 1; - - switch (disp_state) { - case MAIN_UI: - //lv_draw_ready_print(); - break; - case EXTRUSION_UI: - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; - disp_hotend_temp(); - } - break; - case PRE_HEAT_UI: - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; - disp_desire_temp(); - } - break; - case PRINT_READY_UI: - /* - if (gCfgItems.display_style == 2) { - if (temperature_change_frequency) { - temperature_change_frequency = 0; - disp_restro_state(); - } - } - */ - break; - - case PRINT_FILE_UI: break; - - case PRINTING_UI: - if (temperature_change_frequency) { - temperature_change_frequency = 0; - disp_ext_temp(); - disp_bed_temp(); - disp_fan_speed(); - disp_print_time(); - disp_fan_Zpos(); - } - if (printing_rate_update_flag || marlin_state == MF_SD_COMPLETE) { - printing_rate_update_flag = 0; - if (gcode_preview_over == 0) setProBarRate(); - } - break; - - case OPERATE_UI: - /* - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; - disp_temp_operate(); - } - - setProBarRateOpera(); - */ - break; - - case PAUSE_UI: - /* - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; - disp_temp_pause(); - } - */ - break; - - case FAN_UI: - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; - disp_fan_value(); - } - break; - - case MOVE_MOTOR_UI: - /* - if (mksReprint.mks_printer_state == MKS_IDLE) { - if ((z_high_count==1)&&(temper_error_flg != 1)) { - z_high_count = 0; - { - memset((char *)gCfgItems.move_z_coordinate, ' ', sizeof(gCfgItems.move_z_coordinate)); - GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); - sprintf_P((char *)gCfgItems.move_z_coordinate, PSTR("Z: %.3f"), current_position[Z_AXIS]); - GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); - } - } - } - */ - break; - - #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_UI: - if (temperature_change_frequency == 1) { - disp_wifi_state(); - temperature_change_frequency = 0; - } - break; - #endif - - case BIND_UI: - /*refresh_bind_ui();*/ - break; - - case FILAMENTCHANGE_UI: - if (temperature_change_frequency) { - temperature_change_frequency = 0; - disp_filament_temp(); - } - break; - case DIALOG_UI: - filament_dialog_handle(); - TERN_(USE_WIFI_FUNCTION, wifi_scan_handle()); - break; - case MESHLEVELING_UI: - /*disp_zpos();*/ - break; - case HARDWARE_TEST_UI: - break; - case WIFI_LIST_UI: - #if ENABLED(USE_WIFI_FUNCTION) - if (printing_rate_update_flag == 1) { - disp_wifi_list(); - printing_rate_update_flag = 0; - } - #endif - break; - case KEY_BOARD_UI: - /*update_password_disp(); - update_join_state_disp();*/ - break; - #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_TIPS_UI: - switch (wifi_tips_type) { - case TIPS_TYPE_JOINING: - if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName,(const char *)wifi_list.wifiName[wifi_list.nameIndex]) == 0) { - tips_disp.timer = TIPS_TIMER_STOP; - tips_disp.timer_count = 0; - - lv_clear_wifi_tips(); - wifi_tips_type = TIPS_TYPE_WIFI_CONECTED; - lv_draw_wifi_tips(); - - } - if (tips_disp.timer_count >= 30 * 1000) { - tips_disp.timer = TIPS_TIMER_STOP; - tips_disp.timer_count = 0; - lv_clear_wifi_tips(); - wifi_tips_type = TIPS_TYPE_TAILED_JOIN; - lv_draw_wifi_tips(); - } - break; - case TIPS_TYPE_TAILED_JOIN: - if (tips_disp.timer_count >= 3 * 1000) { - tips_disp.timer = TIPS_TIMER_STOP; - tips_disp.timer_count = 0; - - last_disp_state = WIFI_TIPS_UI; - lv_clear_wifi_tips(); - lv_draw_wifi_list(); - } - break; - case TIPS_TYPE_WIFI_CONECTED: - if (tips_disp.timer_count >= 3 * 1000) { - tips_disp.timer = TIPS_TIMER_STOP; - tips_disp.timer_count = 0; - - last_disp_state = WIFI_TIPS_UI; - lv_clear_wifi_tips(); - lv_draw_wifi(); - } - break; - default: break; - } - break; - #endif - - case BABY_STEP_UI: - if (temperature_change_frequency == 1) { - temperature_change_frequency = 0; - disp_z_offset_value(); - } - break; - default: break; - } - - print_time_run(); -} - -void clear_cur_ui() { - last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index]; - - switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { - case PRINT_READY_UI: - //Get_Temperature_Flg = 0; - lv_clear_ready_print(); - break; - case PRINT_FILE_UI: - lv_clear_print_file(); - break; - case PRINTING_UI: - lv_clear_printing(); - break; - case MOVE_MOTOR_UI: - lv_clear_move_motor(); - break; - case OPERATE_UI: - lv_clear_operation(); - break; - case PAUSE_UI: - //Clear_pause(); - break; - case EXTRUSION_UI: - lv_clear_extrusion(); - break; - case PRE_HEAT_UI: - lv_clear_preHeat(); - break; - case CHANGE_SPEED_UI: - lv_clear_change_speed(); - break; - case FAN_UI: - lv_clear_fan(); - break; - case SET_UI: - lv_clear_set(); - break; - case ZERO_UI: - lv_clear_home(); - break; - case SPRAYER_UI: - //Clear_Sprayer(); - break; - case MACHINE_UI: - //Clear_Machine(); - break; - case LANGUAGE_UI: - lv_clear_language(); - break; - case ABOUT_UI: - lv_clear_about(); - break; - case LOG_UI: - //Clear_Connect(); - break; - case DISK_UI: - //Clear_Disk(); - break; - #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_UI: - lv_clear_wifi(); - break; - #endif - case MORE_UI: - //Clear_more(); - break; - case FILETRANSFER_UI: - //Clear_fileTransfer(); - break; - case DIALOG_UI: - lv_clear_dialog(); - break; - case FILETRANSFERSTATE_UI: - //Clear_WifiFileTransferdialog(); - break; - case PRINT_MORE_UI: - //Clear_Printmore(); - break; - case FILAMENTCHANGE_UI: - lv_clear_filament_change(); - break; - case LEVELING_UI: - lv_clear_manualLevel(); - break; - case BIND_UI: - //Clear_Bind(); - break; - #if HAS_BED_PROBE - case NOZZLE_PROBE_OFFSET_UI: - lv_clear_auto_level_offset_settings(); - break; - #endif - case TOOL_UI: - lv_clear_tool(); - break; - case MESHLEVELING_UI: - //Clear_MeshLeveling(); - break; - case HARDWARE_TEST_UI: - //Clear_Hardwaretest(); - break; - #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_LIST_UI: - lv_clear_wifi_list(); - break; - #endif - case KEY_BOARD_UI: - lv_clear_keyboard(); - break; - #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_TIPS_UI: - lv_clear_wifi_tips(); - break; - #endif - case MACHINE_PARA_UI: - lv_clear_machine_para(); - break; - case MACHINE_SETTINGS_UI: - lv_clear_machine_settings(); - break; - case TEMPERATURE_SETTINGS_UI: - //Clear_TemperatureSettings(); - break; - case MOTOR_SETTINGS_UI: - lv_clear_motor_settings(); - break; - case MACHINETYPE_UI: - //Clear_MachineType(); - break; - case STROKE_UI: - //Clear_Stroke(); - break; - case HOME_DIR_UI: - //Clear_HomeDir(); - break; - case ENDSTOP_TYPE_UI: - //Clear_EndstopType(); - break; - case FILAMENT_SETTINGS_UI: - lv_clear_filament_settings(); - break; - case LEVELING_SETTIGNS_UI: - //Clear_LevelingSettings(); - break; - case LEVELING_PARA_UI: - lv_clear_level_settings(); - break; - case DELTA_LEVELING_PARA_UI: - //Clear_DeltaLevelPara(); - break; - case MANUAL_LEVELING_POSIGION_UI: - lv_clear_manual_level_pos_settings(); - break; - case MAXFEEDRATE_UI: - lv_clear_max_feedrate_settings(); - break; - case STEPS_UI: - lv_clear_step_settings(); - break; - case ACCELERATION_UI: - lv_clear_acceleration_settings(); - break; - case JERK_UI: - #if HAS_CLASSIC_JERK - lv_clear_jerk_settings(); - #endif - break; - case MOTORDIR_UI: - //Clear_MotorDir(); - break; - case HOMESPEED_UI: - //Clear_HomeSpeed(); - break; - case NOZZLE_CONFIG_UI: - //Clear_NozzleConfig(); - break; - case HOTBED_CONFIG_UI: - //Clear_HotbedConfig(); - break; - case ADVANCED_UI: - lv_clear_advance_settings(); - break; - case DOUBLE_Z_UI: - //Clear_DoubleZ(); - break; - case ENABLE_INVERT_UI: - //Clear_EnableInvert(); - break; - case NUMBER_KEY_UI: - lv_clear_number_key(); - break; - case BABY_STEP_UI: - lv_clear_baby_stepping(); - break; - case PAUSE_POS_UI: - lv_clear_pause_position(); - break; - #if HAS_TRINAMIC_CONFIG - case TMC_CURRENT_UI: - lv_clear_tmc_current_settings(); - break; - #endif - case EEPROM_SETTINGS_UI: - lv_clear_eeprom_settings(); - break; - #if HAS_STEALTHCHOP - case TMC_MODE_UI: - lv_clear_tmc_step_mode_settings(); - break; - #endif - #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_SETTINGS_UI: - lv_clear_wifi_settings(); - break; - #endif - #if USE_SENSORLESS - case HOMING_SENSITIVITY_UI: - lv_clear_homing_sensitivity_settings(); - break; - #endif - #if HAS_ROTARY_ENCODER - case ENCODER_SETTINGS_UI: - lv_clear_encoder_settings(); - break; - #endif - default: break; - } - //GUI_Clear(); -} - -void draw_return_ui() { - if (disp_state_stack._disp_index > 0) { - disp_state_stack._disp_index--; - - switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { - case PRINT_READY_UI: - lv_draw_ready_print(); - break; - case PRINT_FILE_UI: - lv_draw_print_file(); - break; - case PRINTING_UI: - if (gCfgItems.from_flash_pic == 1) flash_preview_begin = 1; - else default_preview_flg = 1; - lv_draw_printing(); - break; - case MOVE_MOTOR_UI: - lv_draw_move_motor(); - break; - case OPERATE_UI: - lv_draw_operation(); - break; - - #if 1 - case PAUSE_UI: - //draw_pause(); - break; - #endif - - case EXTRUSION_UI: - lv_draw_extrusion(); - break; - case PRE_HEAT_UI: - lv_draw_preHeat(); - break; - case CHANGE_SPEED_UI: - lv_draw_change_speed(); - break; - case FAN_UI: - lv_draw_fan(); - break; - case SET_UI: - lv_draw_set(); - break; - case ZERO_UI: - lv_draw_home(); - break; - case SPRAYER_UI: - //draw_Sprayer(); - break; - case MACHINE_UI: - //draw_Machine(); - break; - case LANGUAGE_UI: - lv_draw_language(); - break; - case ABOUT_UI: - lv_draw_about(); - break; - - case CALIBRATE_UI: - //draw_calibrate(); - break; - case DISK_UI: - //draw_Disk(); - break; - #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_UI: - lv_draw_wifi(); - break; - #endif - case MORE_UI: - //draw_More(); - break; - case PRINT_MORE_UI: - //draw_printmore(); - break; - case FILAMENTCHANGE_UI: - lv_draw_filament_change(); - break; - case LEVELING_UI: - lv_draw_manualLevel(); - break; - case BIND_UI: - //draw_bind(); - break; - #if HAS_BED_PROBE - case NOZZLE_PROBE_OFFSET_UI: - lv_draw_auto_level_offset_settings(); - break; - #endif - case TOOL_UI: - lv_draw_tool(); - break; - case MESHLEVELING_UI: - //draw_meshleveling(); - break; - case HARDWARE_TEST_UI: - //draw_Hardwaretest(); - break; - case WIFI_LIST_UI: - #if ENABLED(USE_WIFI_FUNCTION) - lv_draw_wifi_list(); - #endif - break; - case KEY_BOARD_UI: - lv_draw_keyboard(); - break; - case WIFI_TIPS_UI: - #if ENABLED(USE_WIFI_FUNCTION) - lv_draw_wifi_tips(); - #endif - break; - case MACHINE_PARA_UI: - lv_draw_machine_para(); - break; - case MACHINE_SETTINGS_UI: - lv_draw_machine_settings(); - break; - case TEMPERATURE_SETTINGS_UI: - //draw_TemperatureSettings(); - break; - case MOTOR_SETTINGS_UI: - lv_draw_motor_settings(); - break; - case MACHINETYPE_UI: - //draw_MachineType(); - break; - case STROKE_UI: - //draw_Stroke(); - break; - case HOME_DIR_UI: - //draw_HomeDir(); - break; - case ENDSTOP_TYPE_UI: - //draw_EndstopType(); - break; - case FILAMENT_SETTINGS_UI: - lv_draw_filament_settings(); - break; - case LEVELING_SETTIGNS_UI: - //draw_LevelingSettings(); - break; - case LEVELING_PARA_UI: - lv_draw_level_settings(); - break; - case DELTA_LEVELING_PARA_UI: - //draw_DeltaLevelPara(); - break; - case MANUAL_LEVELING_POSIGION_UI: - lv_draw_manual_level_pos_settings(); - break; - case MAXFEEDRATE_UI: - lv_draw_max_feedrate_settings(); - break; - case STEPS_UI: - lv_draw_step_settings(); - break; - case ACCELERATION_UI: - lv_draw_acceleration_settings(); - break; - case JERK_UI: - #if HAS_CLASSIC_JERK - lv_draw_jerk_settings(); - #endif - break; - case MOTORDIR_UI: - //draw_MotorDir(); - break; - case HOMESPEED_UI: - //draw_HomeSpeed(); - break; - case NOZZLE_CONFIG_UI: - //draw_NozzleConfig(); - break; - case HOTBED_CONFIG_UI: - //draw_HotbedConfig(); - break; - case ADVANCED_UI: - lv_draw_advance_settings(); - break; - case DOUBLE_Z_UI: - //draw_DoubleZ(); - break; - case ENABLE_INVERT_UI: - //draw_EnableInvert(); - break; - case NUMBER_KEY_UI: - lv_draw_number_key(); - break; - case DIALOG_UI: - //draw_dialog(uiCfg.dialogType); - break; - case BABY_STEP_UI: - lv_draw_baby_stepping(); - break; - case PAUSE_POS_UI: - lv_draw_pause_position(); - break; - #if HAS_TRINAMIC_CONFIG - case TMC_CURRENT_UI: - lv_draw_tmc_current_settings(); - break; - #endif - case EEPROM_SETTINGS_UI: - lv_draw_eeprom_settings(); - break; - #if HAS_STEALTHCHOP - case TMC_MODE_UI: - lv_draw_tmc_step_mode_settings(); - break; - #endif - #if ENABLED(USE_WIFI_FUNCTION) - case WIFI_SETTINGS_UI: - lv_draw_wifi_settings(); - break; - #endif - #if USE_SENSORLESS - case HOMING_SENSITIVITY_UI: - lv_draw_homing_sensitivity_settings(); - break; - #endif - #if HAS_ROTARY_ENCODER - case ENCODER_SETTINGS_UI: - lv_draw_encoder_settings(); - break; - #endif - default: break; - } - } -} - -#if ENABLED(SDSUPPORT) - - void sd_detection() { - static bool last_sd_status; - const bool sd_status = IS_SD_INSERTED(); - if (sd_status != last_sd_status) { - last_sd_status = sd_status; - if (sd_status) card.mount(); else card.release(); - } - } - -#endif - -void lv_ex_line(lv_obj_t * line, lv_point_t *points) { - // Copy the previous line and apply the new style - lv_line_set_points(line, points, 2); // Set the points - lv_line_set_style(line, LV_LINE_STYLE_MAIN, &style_line); - lv_obj_align(line, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); -} - -extern volatile uint32_t systick_uptime_millis; - -void print_time_count() { - if ((systick_uptime_millis % 1000) == 0) - if (print_time.start == 1) print_time.seconds++; -} - -void LV_TASK_HANDLER() { - //lv_tick_inc(1); - lv_task_handler(); - if (mks_test_flag == 0x1E) mks_hardware_test(); - - #if HAS_GCODE_PREVIEW - disp_pre_gcode(2, 36); - #endif - - GUI_RefreshPage(); - - #if ENABLED(USE_WIFI_FUNCTION) - get_wifi_commands(); - #endif - - //sd_detection(); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_update_encoder(); - #endif -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h deleted file mode 100644 index 51782688c0..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ /dev/null @@ -1,454 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -#include -#include - -// the colors of the last MKS Ui -#undef LV_COLOR_BACKGROUND -#define LV_COLOR_BACKGROUND LV_COLOR_MAKE(0x1A, 0x1A, 0x1A) // LV_COLOR_MAKE(0x00, 0x00, 0x00) - -#define TFT_LV_PARA_BACK_BODY_COLOR LV_COLOR_MAKE(0x4A, 0x52, 0xFF) - -#include "tft_lvgl_configuration.h" -#include "tft_multi_language.h" -#include "pic_manager.h" -#include "draw_ready_print.h" -#include "draw_language.h" -#include "draw_set.h" -#include "draw_tool.h" -#include "draw_print_file.h" -#include "draw_dialog.h" -#include "draw_printing.h" -#include "draw_operation.h" -#include "draw_preHeat.h" -#include "draw_extrusion.h" -#include "draw_home.h" -#include "draw_move_motor.h" -#include "draw_fan.h" -#include "draw_about.h" -#include "draw_change_speed.h" -#include "draw_manuaLevel.h" -#include "draw_error_message.h" -#include "printer_operation.h" -#include "draw_machine_para.h" -#include "draw_machine_settings.h" -#include "draw_motor_settings.h" -#include "draw_advance_settings.h" -#include "draw_acceleration_settings.h" -#include "draw_number_key.h" -#include "draw_jerk_settings.h" -#include "draw_pause_position.h" -#include "draw_step_settings.h" -#include "draw_tmc_current_settings.h" -#include "draw_eeprom_settings.h" -#include "draw_max_feedrate_settings.h" -#include "draw_tmc_step_mode_settings.h" -#include "draw_level_settings.h" -#include "draw_manual_level_pos_settings.h" -#include "draw_auto_level_offset_settings.h" -#include "draw_filament_change.h" -#include "draw_filament_settings.h" -#include "draw_homing_sensitivity_settings.h" -#include "draw_baby_stepping.h" -#include "draw_keyboard.h" -#include "draw_encoder_settings.h" - -#if ENABLED(USE_WIFI_FUNCTION) - #include "wifiSerial.h" - #include "wifi_module.h" - #include "wifi_upload.h" - #include "draw_wifi_settings.h" - #include "draw_wifi.h" - #include "draw_wifi_list.h" - #include "draw_wifi_tips.h" -#endif - -#include "../../inc/MarlinConfigPre.h" -#define FILE_SYS_USB 0 -#define FILE_SYS_SD 1 - -#define TICK_CYCLE 1 - -#define PARA_SEL_ICON_TEXT_COLOR LV_COLOR_MAKE(0x4A, 0x52, 0xFF); - -#define TFT35 - -#ifdef TFT35 - - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 - - #define titleHeight 36 // TFT_screen.title_high - #define INTERVAL_H 2 // TFT_screen.gap_h // 2 - #define INTERVAL_V 2 // TFT_screen.gap_v // 2 - #define BTN_X_PIXEL 117 // TFT_screen.btn_x_pixel - #define BTN_Y_PIXEL 140 // TFT_screen.btn_y_pixel - - #define SIMPLE_FIRST_PAGE_GRAP 30 - - #define BUTTON_TEXT_Y_OFFSET -20 - - #define TITLE_XPOS 3 // TFT_screen.title_xpos - #define TITLE_YPOS 5 // TFT_screen.title_ypos - - #define FILE_BTN_CNT 6 - - #define OTHER_BTN_XPIEL 117 - #define OTHER_BTN_YPIEL 92 - - #define FILE_PRE_PIC_X_OFFSET 8 - #define FILE_PRE_PIC_Y_OFFSET 0 - - #define PREVIEW_LITTLE_PIC_SIZE 40910 // 400*100+9*101+1 - #define PREVIEW_SIZE 202720 // (PREVIEW_LITTLE_PIC_SIZE+800*200+201*9+1) - - // machine parameter ui - #define PARA_UI_POS_X 10 - #define PARA_UI_POS_Y 50 - - #define PARA_UI_SIZE_X 450 - #define PARA_UI_SIZE_Y 40 - - #define PARA_UI_ARROW_V 12 - - #define PARA_UI_BACL_POS_X 400 - #define PARA_UI_BACL_POS_Y 270 - - #define PARA_UI_TURN_PAGE_POS_X 320 - #define PARA_UI_TURN_PAGE_POS_Y 270 - - #define PARA_UI_VALUE_SIZE_X 370 - #define PARA_UI_VALUE_POS_X 400 - #define PARA_UI_VALUE_V 5 - - #define PARA_UI_STATE_POS_X 380 - #define PARA_UI_STATE_V 2 - - #define PARA_UI_VALUE_SIZE_X_2 200 - #define PARA_UI_VALUE_POS_X_2 320 - #define PARA_UI_VALUE_V_2 5 - - #define PARA_UI_VALUE_BTN_X_SIZE 70 - #define PARA_UI_VALUE_BTN_Y_SIZE 28 - - #define PARA_UI_BACK_BTN_X_SIZE 70 - #define PARA_UI_BACK_BTN_Y_SIZE 40 - -#else // ifdef TFT35 - - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 - -#endif // ifdef TFT35 - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern char public_buf_m[100]; -extern char public_buf_l[30]; - -typedef struct { - uint32_t spi_flash_flag; - uint8_t disp_rotation_180; - uint8_t multiple_language; - uint8_t language; - uint8_t leveling_mode; - uint8_t from_flash_pic; - uint8_t finish_power_off; - uint8_t pause_reprint; - uint8_t wifi_mode_sel; - uint8_t fileSysType; - uint8_t wifi_type; - bool cloud_enable; - bool encoder_enable; - int levelingPos[5][2]; - int filamentchange_load_length; - int filamentchange_load_speed; - int filamentchange_unload_length; - int filamentchange_unload_speed; - int filament_limit_temper; - float pausePosX; - float pausePosY; - float pausePosZ; - uint32_t curFilesize; -} CFG_ITMES; - -typedef struct { - uint8_t curTempType : 1, - curSprayerChoose : 3, - stepHeat : 4; - uint8_t leveling_first_time : 1, - para_ui_page:1, - configWifi:1, - command_send:1, - filament_load_heat_flg:1, - filament_heat_completed_load:1, - filament_unload_heat_flg:1, - filament_heat_completed_unload:1; - uint8_t filament_loading_completed:1, - filament_unloading_completed:1, - filament_loading_time_flg:1, - filament_unloading_time_flg:1, - curSprayerChoose_bak:4; - uint8_t wifi_name[32]; - uint8_t wifi_key[64]; - uint8_t cloud_hostUrl[96]; - uint8_t extruStep; - uint8_t extruSpeed; - uint8_t print_state; - uint8_t stepPrintSpeed; - uint8_t waitEndMoves; - uint8_t dialogType; - uint8_t F[4]; - uint8_t filament_rate; - uint16_t moveSpeed; - uint16_t cloud_port; - uint16_t moveSpeed_bak; - uint32_t totalSend; - uint32_t filament_loading_time; - uint32_t filament_unloading_time; - uint32_t filament_loading_time_cnt; - uint32_t filament_unloading_time_cnt; - float move_dist; - float desireSprayerTempBak; - float current_x_position_bak; - float current_y_position_bak; - float current_e_position_bak; -} UI_CFG; - -typedef enum { - MAIN_UI, - PRINT_READY_UI, - PRINT_FILE_UI, - PRINTING_UI, - MOVE_MOTOR_UI, - OPERATE_UI, - PAUSE_UI, - EXTRUSION_UI, - FAN_UI, - PRE_HEAT_UI, - CHANGE_SPEED_UI, - TEMP_UI, - SET_UI, - ZERO_UI, - SPRAYER_UI, - MACHINE_UI, - LANGUAGE_UI, - ABOUT_UI, - LOG_UI, - DISK_UI, - CALIBRATE_UI, - DIALOG_UI, - WIFI_UI, - MORE_UI, - FILETRANSFER_UI, - FILETRANSFERSTATE_UI, - PRINT_MORE_UI, - FILAMENTCHANGE_UI, - LEVELING_UI, - MESHLEVELING_UI, - BIND_UI, - #if HAS_BED_PROBE - NOZZLE_PROBE_OFFSET_UI, - #endif - TOOL_UI, - HARDWARE_TEST_UI, - WIFI_LIST_UI, - KEY_BOARD_UI, - WIFI_TIPS_UI, - MACHINE_PARA_UI, - MACHINE_SETTINGS_UI, - TEMPERATURE_SETTINGS_UI, - MOTOR_SETTINGS_UI, - MACHINETYPE_UI, - STROKE_UI, - HOME_DIR_UI, - ENDSTOP_TYPE_UI, - FILAMENT_SETTINGS_UI, - LEVELING_SETTIGNS_UI, - LEVELING_PARA_UI, - DELTA_LEVELING_PARA_UI, - MANUAL_LEVELING_POSIGION_UI, - MAXFEEDRATE_UI, - STEPS_UI, - ACCELERATION_UI, - JERK_UI, - MOTORDIR_UI, - HOMESPEED_UI, - NOZZLE_CONFIG_UI, - HOTBED_CONFIG_UI, - ADVANCED_UI, - DOUBLE_Z_UI, - ENABLE_INVERT_UI, - NUMBER_KEY_UI, - BABY_STEP_UI, - ERROR_MESSAGE_UI, - PAUSE_POS_UI, - TMC_CURRENT_UI, - TMC_MODE_UI, - EEPROM_SETTINGS_UI, - WIFI_SETTINGS_UI, - HOMING_SENSITIVITY_UI, - ENCODER_SETTINGS_UI -} DISP_STATE; - -typedef struct { - DISP_STATE _disp_state[100]; - int _disp_index; -} DISP_STATE_STACK; - -typedef struct { - int16_t days; - uint16_t hours; - uint8_t minutes; - volatile int8_t seconds; - int8_t ms_10; - int8_t start; -} PRINT_TIME; -extern PRINT_TIME print_time; - -typedef enum { - PrintAcceleration, - RetractAcceleration, - TravelAcceleration, - XAcceleration, - YAcceleration, - ZAcceleration, - E0Acceleration, - E1Acceleration, - - XMaxFeedRate, - YMaxFeedRate, - ZMaxFeedRate, - E0MaxFeedRate, - E1MaxFeedRate, - - XJerk, - YJerk, - ZJerk, - EJerk, - - Xstep, - Ystep, - Zstep, - E0step, - E1step, - - Xcurrent, - Ycurrent, - Zcurrent, - E0current, - E1current, - - pause_pos_x, - pause_pos_y, - pause_pos_z, - - level_pos_x1, - level_pos_y1, - level_pos_x2, - level_pos_y2, - level_pos_x3, - level_pos_y3, - level_pos_x4, - level_pos_y4, - level_pos_x5, - level_pos_y5 - #if HAS_BED_PROBE - , - x_offset, - y_offset, - z_offset - #endif - , - load_length, - load_speed, - unload_length, - unload_speed, - filament_temp, - - x_sensitivity, - y_sensitivity, - z_sensitivity, - z2_sensitivity -} num_key_value_state; -extern num_key_value_state value; - -typedef enum { - wifiName, - wifiPassWord, - wifiConfig, - gcodeCommand -} keyboard_value_state; -extern keyboard_value_state keyboard_value; - -extern CFG_ITMES gCfgItems; -extern UI_CFG uiCfg; -extern DISP_STATE disp_state; -extern DISP_STATE last_disp_state; -extern DISP_STATE_STACK disp_state_stack; - -extern lv_style_t tft_style_scr; -extern lv_style_t tft_style_label_pre; -extern lv_style_t tft_style_label_rel; -extern lv_style_t style_line; -extern lv_style_t style_para_value_pre; -extern lv_style_t style_para_value_rel; -extern lv_style_t style_num_key_pre; -extern lv_style_t style_num_key_rel; -extern lv_style_t style_num_text; -extern lv_style_t style_sel_text; -extern lv_style_t style_para_value; -extern lv_style_t style_para_back; -extern lv_style_t lv_bar_style_indic; - -extern lv_point_t line_points[4][2]; - -extern void gCfgItems_init(); -extern void ui_cfg_init(); -extern void tft_style_init(); -extern char *creat_title_text(void); -extern void preview_gcode_prehandle(char *path); -extern void update_spi_flash(); -extern void update_gcode_command(int addr,uint8_t *s); -extern void get_gcode_command(int addr,uint8_t *d); -#if HAS_GCODE_PREVIEW - extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel); -#endif -extern void GUI_RefreshPage(); -extern void clear_cur_ui(); -extern void draw_return_ui(); -extern void sd_detection(); -extern void gCfg_to_spiFlah(); -extern void print_time_count(); - -extern void LV_TASK_HANDLER(); -extern void lv_ex_line(lv_obj_t * line, lv_point_t *points); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp deleted file mode 100644 index 9cf4555b25..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#if ENABLED(USE_WIFI_FUNCTION) - -#include "../../../../../Configuration.h" -#include "../../../../module/temperature.h" - -extern lv_group_t * g; -static lv_obj_t *scr, *wifi_name_text, *wifi_key_text, *wifi_state_text, *wifi_ip_text; - -#define ID_W_RETURN 1 -#define ID_W_CLOUD 2 -#define ID_W_RECONNECT 3 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_W_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - lv_draw_set(); - } - break; - case ID_W_CLOUD: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - //clear_cur_ui(); - //draw_return_ui(); - } - break; - case ID_W_RECONNECT: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - lv_draw_wifi_list(); - } - break; - } -} - -void lv_draw_wifi(void) { - lv_obj_t *buttonBack=NULL,*label_Back=NULL; - lv_obj_t *buttonCloud=NULL,*label_Cloud=NULL; - lv_obj_t *buttonReconnect=NULL,*label_Reconnect=NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_UI; - } - disp_state = WIFI_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - // Create an Image button - buttonBack = lv_imgbtn_create(scr, NULL); - if (gCfgItems.wifi_mode_sel == STA_MODEL) { - //buttonCloud = lv_imgbtn_create(scr, NULL); - buttonReconnect = lv_imgbtn_create(scr, NULL); - } - - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_W_RETURN, NULL,0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); - #endif - - lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - if (gCfgItems.wifi_mode_sel == STA_MODEL) { - - lv_obj_set_event_cb_mks(buttonReconnect, event_handler,ID_W_RECONNECT, NULL,0); - lv_imgbtn_set_src(buttonReconnect, LV_BTN_STATE_REL, "F:/bmp_wifi.bin"); - lv_imgbtn_set_src(buttonReconnect, LV_BTN_STATE_PR, "F:/bmp_wifi.bin"); - lv_imgbtn_set_style(buttonReconnect, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonReconnect, LV_BTN_STATE_REL, &tft_style_label_rel); - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonReconnect); - #endif - - lv_obj_set_pos(buttonReconnect,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); - lv_btn_set_layout(buttonReconnect, LV_LAYOUT_OFF); - } - - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.wifi_mode_sel == STA_MODEL) { - //label_Cloud = lv_label_create(buttonCloud, NULL); - label_Reconnect = lv_label_create(buttonReconnect, NULL); - } - - if (gCfgItems.multiple_language !=0) { - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - - if (gCfgItems.wifi_mode_sel == STA_MODEL) { - //lv_label_set_text(label_Cloud, common_menu.text_back); - //lv_obj_align(label_Cloud, buttonCloud, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - - lv_label_set_text(label_Reconnect, wifi_menu.reconnect); - lv_obj_align(label_Reconnect, buttonReconnect, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); - } - } - - wifi_ip_text = lv_label_create(scr, NULL); - lv_obj_set_style(wifi_ip_text, &tft_style_label_rel); - - wifi_name_text = lv_label_create(scr, NULL); - lv_obj_set_style(wifi_name_text, &tft_style_label_rel); - - wifi_key_text = lv_label_create(scr, NULL); - lv_obj_set_style(wifi_key_text, &tft_style_label_rel); - - wifi_state_text = lv_label_create(scr, NULL); - lv_obj_set_style(wifi_state_text, &tft_style_label_rel); - - disp_wifi_state(); -} - -void disp_wifi_state() { - memset(public_buf_m, 0, sizeof(public_buf_m)); - strcpy(public_buf_m,wifi_menu.ip); - strcat(public_buf_m,ipPara.ip_addr); - lv_label_set_text(wifi_ip_text, public_buf_m); - lv_obj_align(wifi_ip_text, NULL, LV_ALIGN_CENTER,0, -100); - - memset(public_buf_m, 0, sizeof(public_buf_m)); - strcpy(public_buf_m,wifi_menu.wifi); - strcat(public_buf_m,wifiPara.ap_name); - lv_label_set_text(wifi_name_text, public_buf_m); - lv_obj_align(wifi_name_text, NULL, LV_ALIGN_CENTER,0, -70); - - if (wifiPara.mode == AP_MODEL) { - memset(public_buf_m, 0, sizeof(public_buf_m)); - strcpy(public_buf_m,wifi_menu.key); - strcat(public_buf_m,wifiPara.keyCode); - lv_label_set_text(wifi_key_text, public_buf_m); - lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER,0, -40); - - memset(public_buf_m, 0, sizeof(public_buf_m)); - strcpy(public_buf_m,wifi_menu.state_ap); - if (wifi_link_state == WIFI_CONNECTED) - strcat(public_buf_m,wifi_menu.connected); - else if (wifi_link_state == WIFI_NOT_CONFIG) - strcat(public_buf_m,wifi_menu.disconnected); - else - strcat(public_buf_m,wifi_menu.exception); - lv_label_set_text(wifi_state_text, public_buf_m); - lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER,0, -10); - } - else { - ZERO(public_buf_m); - strcpy(public_buf_m, wifi_menu.state_sta); - if (wifi_link_state == WIFI_CONNECTED) - strcat(public_buf_m, wifi_menu.connected); - else if (wifi_link_state == WIFI_NOT_CONFIG) - strcat(public_buf_m, wifi_menu.disconnected); - else - strcat(public_buf_m, wifi_menu.exception); - lv_label_set_text(wifi_state_text, public_buf_m); - lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER,0, -40); - - lv_label_set_text(wifi_key_text, ""); - lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER,0, -10); - } -} - -void lv_clear_wifi() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // USE_WIFI_FUNCTION -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h deleted file mode 100644 index 966a84d3b1..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - - -extern void lv_draw_wifi(void); -extern void lv_clear_wifi(); -extern void disp_wifi_state(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif - - - diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp deleted file mode 100644 index 14fd63f852..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#if ENABLED(USE_WIFI_FUNCTION) - -#include "../../../../../Configuration.h" -#include "../../../../module/temperature.h" - -#define NAME_BTN_X 330 -#define NAME_BTN_Y 48 - -#define MARK_BTN_X 0 -#define MARK_BTN_Y 68 - -WIFI_LIST wifi_list; -list_menu_def list_menu; - -extern lv_group_t * g; -static lv_obj_t * scr; -static lv_obj_t *buttonWifiN[NUMBER_OF_PAGE]; -static lv_obj_t *lableWifiText[NUMBER_OF_PAGE]; -static lv_obj_t *lablePageText; - -#define ID_WL_RETURN 11 -#define ID_WL_DOWN 12 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - if (obj->mks_obj_id == ID_WL_RETURN) { - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - clear_cur_ui(); - lv_draw_set(); - } - } - else if (obj->mks_obj_id == ID_WL_DOWN) { - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (wifi_list.getNameNum > 0) { - if ((wifi_list.nameIndex + NUMBER_OF_PAGE) >= wifi_list.getNameNum) { - wifi_list.nameIndex = 0; - wifi_list.currentWifipage = 1; - } - else { - wifi_list.nameIndex += NUMBER_OF_PAGE; - wifi_list.currentWifipage++; - } - disp_wifi_list(); - } - } - } - else { - for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) { - if (obj->mks_obj_id == i + 1) { - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (wifi_list.getNameNum != 0) { - const bool do_wifi = wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[wifi_list.nameIndex + i]) == 0; - wifi_list.nameIndex += i; - last_disp_state = WIFI_LIST_UI; - lv_clear_wifi_list(); - if (do_wifi) - lv_draw_wifi(); - else { - keyboard_value = wifiConfig; - lv_draw_keyboard(); - } - } - } - } - } - } -} - -void lv_draw_wifi_list(void) { - lv_obj_t *buttonBack = NULL, *buttonDown = NULL; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_LIST_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_LIST_UI; - } - disp_state = WIFI_LIST_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - lv_label_set_text(title, creat_title_text()); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - buttonDown = lv_imgbtn_create(scr, NULL); - buttonBack = lv_imgbtn_create(scr, NULL); - - lv_obj_set_event_cb_mks(buttonDown, event_handler,ID_WL_DOWN,NULL,0); - lv_imgbtn_set_src(buttonDown, LV_BTN_STATE_REL, "F:/bmp_pageDown.bin"); - lv_imgbtn_set_src(buttonDown, LV_BTN_STATE_PR, "F:/bmp_pageDown.bin"); - lv_imgbtn_set_style(buttonDown, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonDown, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_WL_RETURN,NULL,0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - - lv_obj_set_pos(buttonDown,OTHER_BTN_XPIEL*3+INTERVAL_V*4,titleHeight+OTHER_BTN_YPIEL+INTERVAL_H); - lv_obj_set_pos(buttonBack,OTHER_BTN_XPIEL*3+INTERVAL_V*4,titleHeight+OTHER_BTN_YPIEL*2+INTERVAL_H*2); - - lv_btn_set_layout(buttonDown, LV_LAYOUT_OFF); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - - for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) { - buttonWifiN[i] = lv_btn_create(scr, NULL); /*Add a button the current screen*/ - lv_obj_set_pos(buttonWifiN[i], 0,NAME_BTN_Y*i+10+titleHeight); /*Set its position*/ - lv_obj_set_size(buttonWifiN[i], NAME_BTN_X,NAME_BTN_Y); /*Set its size*/ - lv_obj_set_event_cb_mks(buttonWifiN[i], event_handler,(i+1),NULL,0); - lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ - lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ - lv_btn_set_layout(buttonWifiN[i], LV_LAYOUT_OFF); - lableWifiText[i] = lv_label_create(buttonWifiN[i], NULL); - #if HAS_ROTARY_ENCODER - uint8_t j = 0; - if (gCfgItems.encoder_enable) { - j = wifi_list.nameIndex + i; - if (j < wifi_list.getNameNum) lv_group_add_obj(g, buttonWifiN[i]); - } - #endif - } - - lablePageText = lv_label_create(scr, NULL); - lv_obj_set_style(lablePageText, &tft_style_label_rel); - - wifi_list.nameIndex = 0; - wifi_list.currentWifipage = 1; - - if (wifi_link_state == WIFI_CONNECTED && wifiPara.mode == STA_MODEL) { - memset(wifi_list.wifiConnectedName, 0, sizeof(&wifi_list.wifiConnectedName)); - memcpy(wifi_list.wifiConnectedName, wifiPara.ap_name, sizeof(wifi_list.wifiConnectedName)); - } - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonDown); - lv_group_add_obj(g, buttonBack); - } - #endif - - disp_wifi_list(); -} - -void disp_wifi_list(void) { - int8_t tmpStr[WIFI_NAME_BUFFER_SIZE] = { 0 }; - uint8_t i, j; - - sprintf((char *)tmpStr, list_menu.file_pages, wifi_list.currentWifipage, wifi_list.getPage); - lv_label_set_text(lablePageText, (const char *)tmpStr); - lv_obj_align(lablePageText, NULL, LV_ALIGN_CENTER, 50, -100); - - for (i = 0; i < NUMBER_OF_PAGE; i++) { - memset(tmpStr, 0, sizeof(tmpStr)); - - j = wifi_list.nameIndex + i; - if (j >= wifi_list.getNameNum) { - lv_label_set_text(lableWifiText[i], (const char *)tmpStr); - lv_obj_align(lableWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); - } - else { - lv_label_set_text(lableWifiText[i], (char const *)wifi_list.wifiName[j]); - lv_obj_align(lableWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); - - if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[j]) == 0) { - lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &style_sel_text); - } - else { - lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &tft_style_label_rel); - } - } - } -} - -void wifi_scan_handle() { - if (uiCfg.dialogType != WIFI_ENABLE_TIPS || uiCfg.command_send != 1) return; - last_disp_state = DIALOG_UI; - lv_clear_dialog(); - if (wifi_link_state == WIFI_CONNECTED && wifiPara.mode != AP_MODEL) - lv_draw_wifi(); - else - lv_draw_wifi_list(); -} - -void lv_clear_wifi_list() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // USE_WIFI_FUNCTION - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h deleted file mode 100644 index e2d9275ef9..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -extern void lv_draw_wifi_list(); -extern void lv_clear_wifi_list(); -extern void disp_wifi_list(void); -extern void cutWifiName(char *name, int len,char *outStr); -extern void wifi_scan_handle(); - -#define NUMBER_OF_PAGE 5 - -#define WIFI_TOTAL_NUMBER 20 -#define WIFI_NAME_BUFFER_SIZE 33 - -typedef struct { - int8_t getNameNum; - int8_t nameIndex; - int8_t currentWifipage; - int8_t getPage; - int8_t RSSI[WIFI_TOTAL_NUMBER]; - uint8_t wifiName[WIFI_TOTAL_NUMBER][WIFI_NAME_BUFFER_SIZE]; - uint8_t wifiConnectedName[WIFI_NAME_BUFFER_SIZE]; -} WIFI_LIST; -extern WIFI_LIST wifi_list; - -typedef struct list_menu_disp { - const char *title; - const char *file_pages; -} list_menu_def; -extern list_menu_def list_menu; - -typedef struct keyboard_menu_disp { - const char *title; - const char *apply; - const char *password; - const char *letter; - const char *digital; - const char *symbol; - const char *space; -} keyboard_menu_def; -extern keyboard_menu_def keyboard_menu; - -typedef struct tips_menu_disp { - const char *joining; - const char *failedJoin; - const char *wifiConected; -} tips_menu_def; -extern tips_menu_def tips_menu; - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp deleted file mode 100644 index 86733470dd..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp +++ /dev/null @@ -1,299 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#if ENABLED(USE_WIFI_FUNCTION) - -#include "../../../../../Configuration.h" -#include "../../../../module/planner.h" - -extern lv_group_t * g; -static lv_obj_t *scr, *labelModelValue = NULL, *buttonModelValue = NULL, *labelCloudValue = NULL; - -#define ID_WIFI_RETURN 1 -#define ID_WIFI_MODEL 2 -#define ID_WIFI_NAME 3 -#define ID_WIFI_PASSWORD 4 -#define ID_WIFI_CLOUD 5 -#define ID_WIFI_CONFIG 6 - -static void event_handler(lv_obj_t * obj, lv_event_t event) { - switch (obj->mks_obj_id) { - case ID_WIFI_RETURN: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_wifi_settings(); - draw_return_ui(); - } - break; - case ID_WIFI_MODEL: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.wifi_mode_sel == AP_MODEL) { - gCfgItems.wifi_mode_sel = STA_MODEL; - lv_label_set_text(labelModelValue, WIFI_STA_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); - update_spi_flash(); - } - else{ - gCfgItems.wifi_mode_sel = AP_MODEL; - lv_label_set_text(labelModelValue, WIFI_AP_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); - update_spi_flash(); - } - } - break; - case ID_WIFI_NAME: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - keyboard_value=wifiName; - lv_clear_wifi_settings(); - lv_draw_keyboard(); - } - break; - case ID_WIFI_PASSWORD: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - keyboard_value=wifiPassWord; - lv_clear_wifi_settings(); - lv_draw_keyboard(); - } - break; - case ID_WIFI_CLOUD: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - if (gCfgItems.cloud_enable) { - gCfgItems.cloud_enable = false; - lv_obj_set_event_cb_mks(obj, event_handler,ID_WIFI_CLOUD,"bmp_disable.bin",0); - lv_label_set_text(labelCloudValue, machine_menu.disable); - update_spi_flash(); - } - else { - gCfgItems.cloud_enable = true; - lv_obj_set_event_cb_mks(obj, event_handler,ID_WIFI_CLOUD,"bmp_enable.bin",0); - lv_label_set_text(labelCloudValue, machine_menu.enable); - update_spi_flash(); - } - } - break; - case ID_WIFI_CONFIG: - if (event == LV_EVENT_CLICKED) { - - } - else if (event == LV_EVENT_RELEASED) { - lv_clear_wifi_settings(); - lv_draw_dialog(DIALOG_WIFI_CONFIG_TIPS); - } - break; - } -} - -void lv_draw_wifi_settings(void) { - lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonConfig = NULL, *labelConfig = NULL; - lv_obj_t *labelModelText = NULL; - lv_obj_t *labelNameText = NULL, *buttonNameValue = NULL, *labelNameValue = NULL; - lv_obj_t *labelPassWordText = NULL, *buttonPassWordValue = NULL, *labelPassWordValue = NULL; - lv_obj_t *labelCloudText = NULL, *buttonCloudValue = NULL; - lv_obj_t * line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_SETTINGS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_SETTINGS_UI; - } - disp_state = WIFI_SETTINGS_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - - lv_obj_t * title = lv_label_create(scr, NULL); - lv_obj_set_style(title, &tft_style_label_rel); - lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS); - lv_label_set_text(title, machine_menu.WifiConfTitle); - - lv_refr_now(lv_refr_get_disp_refreshing()); - - labelModelText = lv_label_create(scr, NULL); - lv_obj_set_style(labelModelText, &tft_style_label_rel); - lv_obj_set_pos(labelModelText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); - lv_label_set_text(labelModelText, machine_menu.wifiMode); - - buttonModelValue = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonModelValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y+PARA_UI_VALUE_V); - lv_obj_set_event_cb_mks(buttonModelValue, event_handler,ID_WIFI_MODEL, NULL,0); - lv_imgbtn_set_src(buttonModelValue, LV_BTN_STATE_REL, "F:/bmp_blank_sel.bin"); - lv_imgbtn_set_src(buttonModelValue, LV_BTN_STATE_PR, "F:/bmp_blank_sel.bin"); - lv_imgbtn_set_style(buttonModelValue, LV_BTN_STATE_PR, &style_para_value_pre); - lv_imgbtn_set_style(buttonModelValue, LV_BTN_STATE_REL, &style_para_value_pre); - lv_btn_set_layout(buttonModelValue, LV_LAYOUT_OFF); - labelModelValue = lv_label_create(buttonModelValue, NULL); - - line1 = lv_line_create(scr, NULL); - lv_ex_line(line1,line_points[0]); - - labelNameText = lv_label_create(scr, NULL); - lv_obj_set_style(labelNameText, &tft_style_label_rel); - lv_obj_set_pos(labelNameText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); - - buttonNameValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonNameValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y*2+PARA_UI_VALUE_V); - lv_obj_set_size(buttonNameValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonNameValue, event_handler,ID_WIFI_NAME, NULL,0); - lv_btn_set_style(buttonNameValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonNameValue, LV_BTN_STYLE_PR, &style_para_value); - labelNameValue = lv_label_create(buttonNameValue, NULL); - - line2 = lv_line_create(scr, NULL); - lv_ex_line(line2,line_points[1]); - - labelPassWordText = lv_label_create(scr, NULL); - lv_obj_set_style(labelPassWordText, &tft_style_label_rel); - lv_obj_set_pos(labelPassWordText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); - - buttonPassWordValue = lv_btn_create(scr, NULL); - lv_obj_set_pos(buttonPassWordValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y*3+PARA_UI_VALUE_V); - lv_obj_set_size(buttonPassWordValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); - lv_obj_set_event_cb_mks(buttonPassWordValue, event_handler,ID_WIFI_PASSWORD, NULL,0); - lv_btn_set_style(buttonPassWordValue, LV_BTN_STYLE_REL, &style_para_value); - lv_btn_set_style(buttonPassWordValue, LV_BTN_STYLE_PR, &style_para_value); - labelPassWordValue = lv_label_create(buttonPassWordValue, NULL); - - line3 = lv_line_create(scr, NULL); - lv_ex_line(line3,line_points[2]); - - labelCloudText = lv_label_create(scr, NULL); - lv_obj_set_style(labelCloudText, &tft_style_label_rel); - lv_obj_set_pos(labelCloudText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); - lv_label_set_text(labelCloudText, machine_menu.wifiCloud); - - buttonCloudValue = lv_imgbtn_create(scr, NULL); - lv_obj_set_pos(buttonCloudValue,PARA_UI_STATE_POS_X,PARA_UI_POS_Y*4+PARA_UI_STATE_V); - if (gCfgItems.cloud_enable) { - lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); - lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); - } - else { - lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); - lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); - } - lv_obj_set_event_cb_mks(buttonCloudValue, event_handler,ID_WIFI_CLOUD, NULL,0); - lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_btn_set_layout(buttonCloudValue, LV_LAYOUT_OFF); - labelCloudValue = lv_label_create(buttonCloudValue, NULL); - - line4 = lv_line_create(scr, NULL); - lv_ex_line(line4,line_points[3]); - - buttonConfig = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonConfig, event_handler,ID_WIFI_CONFIG, NULL,0); - lv_imgbtn_set_src(buttonConfig, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonConfig, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonConfig, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonConfig, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_pos(buttonConfig, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); - lv_btn_set_layout(buttonConfig, LV_LAYOUT_OFF); - labelConfig = lv_label_create(buttonConfig, NULL); - - buttonBack = lv_imgbtn_create(scr, NULL); - lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_WIFI_RETURN, NULL, 0); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_label_pre); - lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_label_rel); - lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); - lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); - label_Back = lv_label_create(buttonBack, NULL); - - if (gCfgItems.multiple_language !=0) { - if (gCfgItems.wifi_mode_sel == AP_MODEL) { - lv_label_set_text(labelModelValue, WIFI_AP_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); - } - else { - lv_label_set_text(labelModelValue, WIFI_STA_TEXT); - lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); - } - memset(public_buf_m,0,sizeof(public_buf_m)); - strcat(public_buf_m,machine_menu.wifiName); - strcat(public_buf_m,(const char *)uiCfg.wifi_name); - lv_label_set_text(labelNameText,public_buf_m); - - lv_label_set_text(labelNameValue,machine_menu.wifiEdit); - lv_obj_align(labelNameValue, buttonNameValue, LV_ALIGN_CENTER,0, 0); - - memset(public_buf_m,0,sizeof(public_buf_m)); - strcat(public_buf_m,machine_menu.wifiPassWord); - strcat(public_buf_m,(const char *)uiCfg.wifi_key); - lv_label_set_text(labelPassWordText,public_buf_m); - - lv_label_set_text(labelPassWordValue,machine_menu.wifiEdit); - lv_obj_align(labelPassWordValue, buttonPassWordValue, LV_ALIGN_CENTER,0, 0); - - lv_label_set_text(labelCloudValue, gCfgItems.cloud_enable ? machine_menu.enable : machine_menu.disable); - lv_obj_align(labelCloudValue, buttonCloudValue, LV_ALIGN_CENTER,0, 0); - - lv_label_set_text(labelConfig,machine_menu.wifiConfig); - lv_obj_align(labelConfig, buttonConfig, LV_ALIGN_CENTER,0, 0); - - lv_label_set_text(label_Back, common_menu.text_back); - lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER,0, 0); - } - - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) { - lv_group_add_obj(g, buttonModelValue); - lv_group_add_obj(g, buttonNameValue); - lv_group_add_obj(g, buttonPassWordValue); - lv_group_add_obj(g, buttonCloudValue); - lv_group_add_obj(g, buttonConfig); - lv_group_add_obj(g, buttonBack); - } - #endif -} - -void lv_clear_wifi_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif - lv_obj_del(scr); -} - -#endif // USE_WIFI_FUNCTION - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h deleted file mode 100644 index c0d6e0ccdd..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#define WIFI_AP_TEXT "AP" -#define WIFI_STA_TEXT "STA" - -extern void lv_draw_wifi_settings(void); -extern void lv_clear_wifi_settings(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp deleted file mode 100644 index 50fa0aaf99..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "lv_conf.h" -#include "draw_ui.h" - -#if ENABLED(USE_WIFI_FUNCTION) - -#include "../../../../../Configuration.h" -#include "../../../../module/temperature.h" - -static lv_obj_t * scr; - -TIPS_TYPE wifi_tips_type; -TIPS_DISP tips_disp; -tips_menu_def tips_menu; - -void lv_draw_wifi_tips(void) { - static lv_obj_t * text_tips,*wifi_name; - - if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_TIPS_UI) { - disp_state_stack._disp_index++; - disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_TIPS_UI; - } - disp_state = WIFI_TIPS_UI; - - scr = lv_obj_create(NULL, NULL); - - lv_obj_set_style(scr, &tft_style_scr); - lv_scr_load(scr); - lv_obj_clean(scr); - lv_refr_now(lv_refr_get_disp_refreshing()); - - text_tips = lv_label_create(scr, NULL); - lv_obj_set_style(text_tips, &tft_style_label_rel); - - wifi_name = lv_label_create(scr, NULL); - lv_obj_set_style(wifi_name, &tft_style_label_rel); - - if (wifi_tips_type == TIPS_TYPE_JOINING) { - lv_label_set_text(text_tips, tips_menu.joining); - lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); - } - else if (wifi_tips_type == TIPS_TYPE_TAILED_JOIN) { - lv_label_set_text(text_tips, tips_menu.failedJoin); - lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); - } - else if (wifi_tips_type == TIPS_TYPE_WIFI_CONECTED) { - lv_label_set_text(text_tips, tips_menu.wifiConected); - lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); - } - - lv_label_set_text(wifi_name, (const char *)wifi_list.wifiName[wifi_list.nameIndex]); - lv_obj_align(wifi_name, NULL, LV_ALIGN_CENTER,0, -20); - - tips_disp.timer = TIPS_TIMER_START; - tips_disp.timer_count = 0; -} - -void lv_clear_wifi_tips() { lv_obj_del(scr); } - -#endif // USE_WIFI_FUNCTION -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h deleted file mode 100644 index 4f81f00a43..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - - -extern void lv_draw_wifi_tips(void); -extern void lv_clear_wifi_tips(); - -typedef enum { - TIPS_TYPE_JOINING, - TIPS_TYPE_TAILED_JOIN, - TIPS_TYPE_WIFI_CONECTED -} TIPS_TYPE; -extern TIPS_TYPE wifi_tips_type; - -typedef struct { - unsigned char timer; - unsigned int timer_count; -} TIPS_DISP; -extern TIPS_DISP tips_disp; - -#define TIPS_TIMER_START 1 -#define TIPS_TIMER_STOP 0 - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif - diff --git a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp deleted file mode 100644 index 856d645e9e..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "pic_manager.h" -#include - -#include "../../../../inc/MarlinConfig.h" - -#if HAS_SPI_FLASH_FONT - -typedef struct { - uint16_t min; - uint16_t max; - uint8_t bpp; - uint8_t reserved[3]; -} x_header_t; - -typedef struct { - uint32_t pos; -} x_table_t; - -typedef struct { - uint8_t adv_w; - uint8_t box_w; -} glyph_dsc_t; - -static x_header_t __g_xbf_hd = { .min = 0, .max = 0, .bpp = 0 }; -static uint8_t __g_font_buf[63]; - -static uint8_t *__user_font_getdata(int offset, int size) { - //ZERO(__g_font_buf); - get_spi_flash_data((char *)__g_font_buf, offset, size); - return __g_font_buf; - //return &buf_test[offset]; -} - -static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t unicode_letter) { - if (__g_xbf_hd.max == 0) { - uint8_t *p = __user_font_getdata(0, sizeof(x_header_t)); - memcpy(&__g_xbf_hd, p, sizeof(x_header_t)); - } - if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min) - return NULL; - uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4; - uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); - if (p_pos[0] != 0) { - uint32_t pos = p_pos[0]; - //glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(pos, 2); - __user_font_getdata(pos, 2); - //return __user_font_getdata(pos+2, gdsc->box_w*__g_xbf_hd.bpp/8); - return __user_font_getdata(pos + 2, sizeof(__g_font_buf)); - } - return NULL; -} - -static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) { - if (__g_xbf_hd.max == 0) { - uint8_t *p = __user_font_getdata(0, sizeof(x_header_t)); - memcpy(&__g_xbf_hd, p, sizeof(x_header_t)); - } - if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min) - return NULL; - uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4; - uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); - if (p_pos[0] != 0) { - glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(p_pos[0], 2); - dsc_out->adv_w = gdsc->adv_w; - dsc_out->box_h = font->line_height; - dsc_out->box_w = gdsc->box_w; - dsc_out->ofs_x = 0; - dsc_out->ofs_y = 0; - dsc_out->bpp = __g_xbf_hd.bpp; - return true; - } - return false; -} - -/*lv_font_t gb2312_puhui32 = { -.get_glyph_bitmap = __user_font_get_bitmap, -.get_glyph_dsc = __user_font_get_glyph_dsc, -.line_height = 25, -.base_line = 0, -};*/ -lv_font_t gb2312_puhui32; -void init_gb2312_font() { - gb2312_puhui32.get_glyph_bitmap = __user_font_get_bitmap; - gb2312_puhui32.get_glyph_dsc = __user_font_get_glyph_dsc; - gb2312_puhui32.line_height = 21; - gb2312_puhui32.base_line = 0; -} - -#endif // HAS_SPI_FLASH_FONT -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp deleted file mode 100644 index cf64571292..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "draw_ui.h" - -#if ENABLED(USE_WIFI_FUNCTION) - -#include "wifiSerial.h" - -#include -#include -#include -#include -#include - -#include "../../../../inc/MarlinConfig.h" - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); -#define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); - -void __irq_usart1(void) { - WIFISERIAL.wifi_usart_irq(USART1_BASE); - if (wifi_link_state == WIFI_TRANS_FILE) { - if (WIFISERIAL.available() == (400)) WIFI_IO1_SET(); - if (WIFISERIAL.wifi_rb_is_full()) { - if (esp_state == TRANSFER_IDLE) esp_state = TRANSFERING; - if (storeRcvData(UART_RX_BUFFER_SIZE)) { - if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); - } - else { - WIFI_IO1_SET(); - esp_state = TRANSFER_STORE; - } - } - } -} - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif - -#endif // USE_WIFI_FUNCTION -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp deleted file mode 100644 index bc329aa82b..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp +++ /dev/null @@ -1,665 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "SPI_TFT.h" - -#include "tft_lvgl_configuration.h" -#include "draw_ready_print.h" -#include "mks_hardware_test.h" -#include "draw_ui.h" -#include "pic_manager.h" -#include - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../sd/cardreader.h" - -uint8_t pw_det_sta, pw_off_sta, mt_det_sta, mt_det3_sta; -#if PIN_EXISTS(MT_DET_2) - uint8_t mt_det2_sta; -#endif -uint8_t endstopx1_sta, endstopx2_sta, endstopy1_sta, endstopy2_sta, endstopz1_sta, endstopz2_sta; -void test_gpio_readlevel_L() { - #if ENABLED(MKS_TEST) - volatile uint32_t itest; - WRITE(WIFI_IO0_PIN, HIGH); - itest = 10000; - while (itest--); - pw_det_sta = (READ(MKS_TEST_POWER_LOSS_PIN) == 0); - pw_off_sta = (READ(MKS_TEST_PS_ON_PIN) == 0); - mt_det_sta = (READ(MT_DET_1_PIN) == 0); - #if PIN_EXISTS(MT_DET_2) - mt_det2_sta = (READ(MT_DET_2_PIN) == 0); - #endif - //mt_det3_sta = (READ(FIL_RUNOUT_3_PIN) == 0); - endstopx1_sta = (READ(X_MIN_PIN) == 0); - //endstopx2_sta = (READ(X_MAX_PIN) == 0); - endstopy1_sta = (READ(Y_MIN_PIN) == 0); - //endstopy2_sta = (READ(Y_MAX_PIN) == 0); - endstopz1_sta = (READ(Z_MIN_PIN) == 0); - endstopz2_sta = (READ(Z_MAX_PIN) == 0); - #endif -} - -void test_gpio_readlevel_H() { - #if ENABLED(MKS_TEST) - volatile uint32_t itest; - WRITE(WIFI_IO0_PIN, LOW); - itest = 10000; - while (itest--); - pw_det_sta = (READ(MKS_TEST_POWER_LOSS_PIN) == 1); - pw_off_sta = (READ(MKS_TEST_PS_ON_PIN) == 1); - mt_det_sta = (READ(MT_DET_1_PIN) == 1); - #if PIN_EXISTS(MT_DET_2) - mt_det2_sta = (READ(MT_DET_2_PIN) == 1); - #endif - //mt_det3_sta = (READ(MT_DET_3_PIN) == 1); - endstopx1_sta = (READ(X_MIN_PIN) == 1); - //endstopx2_sta = (READ(X_MAX_PIN) == 1); - endstopy1_sta = (READ(Y_MIN_PIN) == 1); - //endstopy2_sta = (READ(Y_MAX_PIN) == 1); - endstopz1_sta = (READ(Z_MIN_PIN) == 1); - endstopz2_sta = (READ(Z_MAX_PIN) == 1); - #endif -} - -void init_test_gpio() { - #ifdef MKS_TEST - SET_INPUT_PULLUP(X_MIN_PIN); - //SET_INPUT_PULLUP(X_MAX_PIN); - SET_INPUT_PULLUP(Y_MIN_PIN); - //SET_INPUT_PULLUP(Y_MAX_PIN); - SET_INPUT_PULLUP(Z_MIN_PIN); - SET_INPUT_PULLUP(Z_MAX_PIN); - - SET_OUTPUT(WIFI_IO0_PIN); - - SET_INPUT_PULLUP(MT_DET_1_PIN); - #if PIN_EXISTS(MT_DET_2) - SET_INPUT_PULLUP(MT_DET_2_PIN); - #endif - //SET_INPUT_PULLUP(MT_DET_3_PIN); - - SET_INPUT_PULLUP(MKS_TEST_POWER_LOSS_PIN); - SET_INPUT_PULLUP(MKS_TEST_PS_ON_PIN); - - SET_INPUT_PULLUP(SERVO0_PIN); - - SET_OUTPUT(X_ENABLE_PIN); - SET_OUTPUT(Y_ENABLE_PIN); - SET_OUTPUT(Z_ENABLE_PIN); - SET_OUTPUT(E0_ENABLE_PIN); - #if !MB(MKS_ROBIN_E3P) - SET_OUTPUT(E1_ENABLE_PIN); - #endif - - WRITE(X_ENABLE_PIN, LOW); - WRITE(Y_ENABLE_PIN, LOW); - WRITE(Z_ENABLE_PIN, LOW); - WRITE(E0_ENABLE_PIN, LOW); - #if !MB(MKS_ROBIN_E3P) - WRITE(E1_ENABLE_PIN, LOW); - #endif - //WRITE(E2_ENABLE_PIN, LOW); - - #if MB(MKS_ROBIN_E3P) - SET_INPUT_PULLUP(PA1); - SET_INPUT_PULLUP(PA3); - SET_INPUT_PULLUP(PC2); - SET_INPUT_PULLUP(PD8); - SET_INPUT_PULLUP(PE5); - SET_INPUT_PULLUP(PE6); - SET_INPUT_PULLUP(PE7); - #endif - #endif -} - -void mks_test_beeper() { - #ifdef MKS_TEST - WRITE(BEEPER_PIN, HIGH); - delay(100); - WRITE(BEEPER_PIN, LOW); - delay(100); - #endif -} - -void mks_gpio_test() { - #if ENABLED(MKS_TEST) - init_test_gpio(); - - test_gpio_readlevel_L(); - test_gpio_readlevel_H(); - test_gpio_readlevel_L(); - if ((pw_det_sta == 1) - && (pw_off_sta == 1) - && (mt_det_sta == 1) - #if PIN_EXISTS(MT_DET_2) - && (mt_det2_sta == 1) - #endif - #if MB(MKS_ROBIN_E3P) - && (READ(PA1) == 0) - && (READ(PA3) == 0) - && (READ(PC2) == 0) - && (READ(PD8) == 0) - && (READ(PE5) == 0) - && (READ(PE6) == 0) - && (READ(PE7) == 0) - #endif - ) // &&(mt_det3_sta == 1)) - disp_det_ok(); - else - disp_det_error(); - - if ( (endstopx1_sta == 1) - //&& (endstopx2_sta == 1) - && (endstopy1_sta == 1) - //&& (endstopy2_sta == 1) - && (endstopz1_sta == 1) - && (endstopz2_sta == 1) - ) - disp_Limit_ok(); - else - disp_Limit_error(); - #endif -} - -void mks_hardware_test() { - #if ENABLED(MKS_TEST) - if (millis() % 2000 < 1000) { - WRITE(X_DIR_PIN, LOW); - WRITE(Y_DIR_PIN, LOW); - WRITE(Z_DIR_PIN, LOW); - WRITE(E0_DIR_PIN, LOW); - #if !MB(MKS_ROBIN_E3P) - WRITE(E1_DIR_PIN, LOW); - #endif - //WRITE(E2_DIR_PIN, LOW); - thermalManager.fan_speed[0] = 255; - //WRITE(HEATER_2_PIN, HIGH); // HE2 - #if !MB(MKS_ROBIN_E3P) - WRITE(HEATER_1_PIN, HIGH); // HE1 - #endif - WRITE(HEATER_0_PIN, HIGH); // HE0 - WRITE(HEATER_BED_PIN, HIGH); // HOT-BED - } - else { - WRITE(X_DIR_PIN, HIGH); - WRITE(Y_DIR_PIN, HIGH); - WRITE(Z_DIR_PIN, HIGH); - WRITE(E0_DIR_PIN, HIGH); - #if !MB(MKS_ROBIN_E3P) - WRITE(E1_DIR_PIN, HIGH); - #endif - //WRITE(E2_DIR_PIN, HIGH); - thermalManager.fan_speed[0] = 0; - //WRITE(HEATER_2_PIN, LOW); // HE2 - #if !MB(MKS_ROBIN_E3P) - WRITE(HEATER_1_PIN, LOW); // HE1 - #endif - WRITE(HEATER_0_PIN, LOW); // HE0 - WRITE(HEATER_BED_PIN, LOW); // HOT-BED - } - - if ( (endstopx1_sta == 1) && (endstopx2_sta == 1) - && (endstopy1_sta == 1) && (endstopy2_sta == 1) - && (endstopz1_sta == 1) && (endstopz2_sta == 1) - ) { - // nothing here - } - else { - //mks_test_beeper(); - } - - if (disp_state == PRINT_READY_UI) - mks_disp_test(); - - #endif -} - -static const uint16_t ASCII_Table_16x24[] PROGMEM = { - // Space ' ' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '!' - 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000, - 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '"' - 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '#' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60, - 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318, - 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000, - // '$' - 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C, - 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C, - 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, - // '%' - 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611, - 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460, - 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000, - // '&' - 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0, - 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06, - 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // "'" - 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '(' - 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060, - 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, - 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000, - // ')' - 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300, - 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, - 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000, - // '*' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, - 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '+' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // ',' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, - // '-' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '.' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '/' - 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, - 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0, - 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '0' - 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C, - 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38, - 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '1' - 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '2' - 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800, - 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, - 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '3' - 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600, - 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18, - 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '4' - 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60, - 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00, - 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '5' - 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC, - 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18, - 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '6' - 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC, - 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38, - 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '7' - 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380, - 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030, - 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '8' - 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638, - 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38, - 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '9' - 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C, - 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C, - 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // ':' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // ';' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, - // '<' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0, - 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '=' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '>' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0, - 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '?' - 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00, - 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000, - 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '@' - 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411, - 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004, - 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'A' - 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60, - 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C, - 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'B' - 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C, - 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C, - 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'C' - 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C, - 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'D' - 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006, - 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06, - 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'E' - 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, - 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, - 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'F' - 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'G' - 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003, - 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C, - 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'H' - 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, - 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, - 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'I' - 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'J' - 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, - 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738, - 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'K' - 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6, - 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806, - 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'L' - 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, - 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'M' - 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836, - 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6, - 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'N' - 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC, - 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C, - 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'O' - 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003, - 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C, - 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'P' - 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C, - 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, - 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'Q' - 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003, - 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C, - 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'R' - 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806, - 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006, - 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'S' - 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C, - 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C, - 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'T' - 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'U' - 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, - 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818, - 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'V' - 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C, - 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360, - 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'W' - 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366, - 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C, - 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'X' - 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0, - 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C, - 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'Y' - 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660, - 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'Z' - 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600, - 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006, - 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '[' - 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, - 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000, - // '\' - 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0, - 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300, - 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // ']' - 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, - 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, - 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000, - // '^' - 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630, - 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '_' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // ''' - 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'a' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8, - 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C, - 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'b' - 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8, - 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, - 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'c' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0, - 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30, - 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'd' - 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0, - 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, - 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'e' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, - 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30, - 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'f' - 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, - 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, - 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'g' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8, - 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18, - 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000, - // 'h' - 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8, - 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, - 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'i' - 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, - 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, - 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'j' - 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, - 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, - 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000, - // 'k' - 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C, - 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C, - 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'l' - 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, - 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, - 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'm' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF, - 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, - 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'n' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8, - 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, - 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'o' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, - 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30, - 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'p' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8, - 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, - 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000, - // 'q' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0, - 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, - 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000, - // 'r' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0, - 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, - 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 's' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0, - 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38, - 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 't' - 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, - 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, - 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'u' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818, - 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38, - 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'v' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18, - 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360, - 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'w' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1, - 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C, - 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'x' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38, - 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30, - 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // 'y' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830, - 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380, - 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000, - // 'z' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC, - 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, - 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - // '{' - 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, - 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0, - 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000, - // '|' - 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, - // '}' - 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180, - 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180, - 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000, - // '~' - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -}; - -void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint16_t bkColor) { - for (uint16_t i = 0; i < 24; i++) { - const uint16_t tmp_char = pgm_read_word(&ASCII_Table_16x24[((c - 0x20) * 24) + i]); - for (uint16_t j = 0; j < 16; j++) - SPI_TFT.SetPoint(x + j, y + i, ((tmp_char >> j) & 0x01) ? charColor : bkColor); - } -} - -void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor, uint16_t bkColor) { - while (*string != '\0') { - disp_char_1624(x, y, *string, charColor, bkColor); - string++; - x += 16; - } -} - -//static lv_obj_t * scr_test; -void disp_assets_update() { - SPI_TFT.LCD_clear(0x0000); - disp_string(100, 140, "Assets Updating...", 0xFFFF, 0x0000); -} - -void disp_assets_update_progress(const char *msg) { - char buf[30]; - memset(buf, ' ', COUNT(buf)); - strncpy(buf, msg, strlen(msg)); - buf[COUNT(buf)-1] = '\0'; - disp_string(100, 165, buf, 0xFFFF, 0x0000); -} - -uint8_t mks_test_flag = 0; -const char *MKSTestPath = "MKS_TEST"; - -#if ENABLED(SDSUPPORT) - void mks_test_get() { - SdFile dir, root = card.getroot(); - if (dir.open(&root, MKSTestPath, O_RDONLY)) - mks_test_flag = 0x1E; - } -#endif - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h deleted file mode 100644 index 0e2d8096ba..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -void mks_gpio_test(); -void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint16_t bkColor); -void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor, uint16_t bkColor); -void mks_hardware_test(); -void disp_assets_update(); -void disp_assets_update_progress(const char *msg); -void mks_test_get(); -extern uint8_t mks_test_flag; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp deleted file mode 100644 index 07ac563802..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp +++ /dev/null @@ -1,626 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "string.h" -#include "draw_ui.h" -#include "pic_manager.h" -#include "draw_ready_print.h" -#include "mks_hardware_test.h" - -#include "SPIFlashStorage.h" -#include "../../../../libs/W25Qxx.h" - -#include "../../../../sd/cardreader.h" -#include "../../../../MarlinCore.h" - -extern uint16_t DeviceCode; -extern unsigned char bmp_public_buf[17 * 1024]; - -#if ENABLED(SDSUPPORT) - extern char *createFilename(char * const buffer, const dir_t &p); -#endif - -static const char assets[][LONG_FILENAME_LENGTH] = { - //homing screen - "bmp_zeroAll.bin", - "bmp_zero.bin", - "bmp_zeroX.bin", - "bmp_zeroY.bin", - "bmp_zeroZ.bin", - "bmp_manual_off.bin", - - //tool screen - "bmp_preHeat.bin", - "bmp_extruct.bin", - "bmp_mov.bin", - // "bmp_Zero.bin", - "bmp_leveling.bin", - "bmp_filamentchange.bin", - - //fan screen - "bmp_Add.bin", - "bmp_Dec.bin", - "bmp_speed255.bin", - "bmp_speed127.bin", - "bmp_speed0.bin", - - //preheat screen - // "bmp_Add.bin", - // "bmp_Dec.bin", - "bmp_speed0.bin", - // "bmp_Extru2.bin", - // "bmp_Extru1.bin", - "bmp_bed.bin", - "bmp_step1_degree.bin", - "bmp_step5_degree.bin", - "bmp_step10_degree.bin", - - //extrusion screen - "bmp_in.bin", - "bmp_out.bin", - "bmp_extru1.bin", - #if HAS_MULTI_EXTRUDER - "bmp_extru2.bin", - #endif - "bmp_speed_high.bin", - "bmp_speed_slow.bin", - "bmp_speed_normal.bin", - "bmp_step1_mm.bin", - "bmp_step5_mm.bin", - "bmp_step10_mm.bin", - - //select file screen - "bmp_pageUp.bin", - "bmp_pageDown.bin", - "bmp_back.bin", //TODO: why two back buttons? Why not just one? (return / back) - "bmp_dir.bin", - "bmp_file.bin", - - //move motor screen - //TODO: 6 equal icons, just in diffenct rotation... it may be optimized too - "bmp_xAdd.bin", - "bmp_xDec.bin", - "bmp_yAdd.bin", - "bmp_yDec.bin", - "bmp_zAdd.bin", - "bmp_zDec.bin", - "bmp_step_move0_1.bin", - "bmp_step_move1.bin", - "bmp_step_move10.bin", - - //operation screen - "bmp_auto_off.bin", - "bmp_speed.bin", - //"bmp_Mamual.bin", //TODO: didn't find it.. changed to bmp_manual_off.bin - "bmp_fan.bin", - "bmp_temp.bin", - "bmp_extrude_opr.bin", - "bmp_move_opr.bin", - - //change speed screen - "bmp_step1_percent.bin", - "bmp_step5_percent.bin", - "bmp_step10_percent.bin", - "bmp_extruct_sel.bin", - "bmp_mov_changespeed.bin", - // "bmp_extrude_opr.bin", equal to "bmp_Extruct.bin" - "bmp_mov_sel.bin", - "bmp_speed_extruct.bin", - - //printing screen - "bmp_pause.bin", - "bmp_resume.bin", - "bmp_stop.bin", - "bmp_ext1_state.bin", - #if HAS_MULTI_EXTRUDER - "bmp_ext2_state.bin", - #endif - "bmp_bed_state.bin", - "bmp_fan_state.bin", - "bmp_time_state.bin", - "bmp_zpos_state.bin", - "bmp_operate.bin", - - //manual leval screen (only if disabled auto level) - #if DISABLED(AUTO_BED_LEVELING_BILINEAR) - "bmp_leveling1.bin", - "bmp_leveling2.bin", - "bmp_leveling3.bin", - "bmp_leveling4.bin", - "bmp_leveling5.bin", - #endif - - //lang select screen - #if HAS_LANG_SELECT_SCREEN - "bmp_language.bin", - "bmp_simplified_cn.bin", - "bmp_simplified_cn_sel.bin", - "bmp_traditional_cn.bin", - "bmp_traditional_cn_sel.bin", - "bmp_english.bin", - "bmp_english_sel.bin", - "bmp_russian.bin", - "bmp_russian_sel.bin", - "bmp_spanish.bin", - "bmp_spanish_sel.bin", - "bmp_french.bin", - "bmp_french_sel.bin", - "bmp_italy.bin", - "bmp_italy_sel.bin", - #endif // HAS_LANG_SELECT_SCREEN - - // gcode preview - #if HAS_GCODE_DEFAULT_VIEW_IN_FLASH - "bmp_preview.bin", - #endif - - #if HAS_LOGO_IN_FLASH - "bmp_logo.bin", - #endif - - // settings screen - "bmp_about.bin", - //"bmp_Language.bin", - //"bmp_Fan.bin", - //"bmp_manual_off.bin", - - //start screen - "bmp_printing.bin", - "bmp_set.bin", - "bmp_tool.bin", - - // settings screen - "bmp_eeprom_settings.bin", - "bmp_machine_para.bin", - "bmp_function1.bin", - - // base icons - "bmp_arrow.bin", - "bmp_back70x40.bin", - "bmp_value_blank.bin", - "bmp_blank_sel.bin", - "bmp_disable.bin", - "bmp_enable.bin", - "bmp_return.bin", - - #if ENABLED(USE_WIFI_FUNCTION) - //wifi screen - "bmp_wifi.bin", - #endif - - //babystep screen - "bmp_baby_move0_01.bin", - "bmp_baby_move0_05.bin", - "bmp_baby_move0_1.bin" -}; - -#if HAS_SPI_FLASH_FONT - static char fonts[][LONG_FILENAME_LENGTH] = { "FontUNIGBK.bin" }; -#endif - -uint8_t currentFlashPage = 0; - -uint32_t lv_get_pic_addr(uint8_t *Pname) { - uint8_t Pic_cnt; - uint8_t i, j; - PIC_MSG PIC; - uint32_t tmp_cnt = 0; - uint32_t addr = 0; - - currentFlashPage = 0; - - #if ENABLED(MARLIN_DEV_MODE) - SERIAL_ECHOLNPAIR("Getting picture SPI Flash Address: ", (const char*)Pname); - #endif - - W25QXX.init(SPI_QUARTER_SPEED); - - W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1); - if (Pic_cnt == 0xFF) Pic_cnt = 0; - for (i = 0; i < Pic_cnt; i++) { - j = 0; - do { - W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1); - tmp_cnt++; - } while (PIC.name[j++] != '\0'); - - if ((strcasecmp((char*)Pname, (char*)PIC.name)) == 0) { - if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) - addr = PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35; - else - addr = PIC_DATA_ADDR_TFT32 + i * PER_PIC_MAX_SPACE_TFT32; - return addr; - } - } - - return addr; -} - -const char *assetsPath = "assets"; -const char *bakPath = "_assets"; - -void spiFlashErase_PIC() { - volatile uint32_t pic_sectorcnt = 0; - W25QXX.init(SPI_QUARTER_SPEED); - //erase 0x001000 -64K - for (pic_sectorcnt = 0; pic_sectorcnt < (64 - 4) / 4; pic_sectorcnt++) { - watchdog_refresh(); - W25QXX.SPI_FLASH_SectorErase(PICINFOADDR + pic_sectorcnt * 4 * 1024); - } - //erase 64K -- 6M - for (pic_sectorcnt = 0; pic_sectorcnt < (PIC_SIZE_xM * 1024 / 64 - 1); pic_sectorcnt++) { - watchdog_refresh(); - W25QXX.SPI_FLASH_BlockErase((pic_sectorcnt + 1) * 64 * 1024); - } -} - -#if HAS_SPI_FLASH_FONT - void spiFlashErase_FONT() { - volatile uint32_t Font_sectorcnt = 0; - W25QXX.init(SPI_QUARTER_SPEED); - for (Font_sectorcnt = 0; Font_sectorcnt < 32-1; Font_sectorcnt++) { - watchdog_refresh(); - W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024); - } - } -#endif - -uint32_t LogoWrite_Addroffset = 0; - -uint8_t Pic_Logo_Write(uint8_t *LogoName, uint8_t *Logo_Wbuff, uint32_t LogoWriteSize) { - if (LogoWriteSize <= 0) return 0; - - W25QXX.SPI_FLASH_BufferWrite(Logo_Wbuff, PIC_LOGO_ADDR + LogoWrite_Addroffset, LogoWriteSize); - - for (uint32_t i = 0; i < LogoWriteSize; i++) { - uint8_t temp1; - W25QXX.SPI_FLASH_BufferRead(&temp1, PIC_LOGO_ADDR + LogoWrite_Addroffset + i, 1); - if (*(Logo_Wbuff + i) != temp1) return 0; - } - LogoWrite_Addroffset += LogoWriteSize; - const uint32_t logo_maxsize = DeviceCode == 0x9488 || DeviceCode == 0x5761 ? LOGO_MAX_SIZE_TFT35 : LOGO_MAX_SIZE_TFT32; - if (LogoWrite_Addroffset >= logo_maxsize) LogoWrite_Addroffset = 0; - return 1; -} - -uint32_t TitleLogoWrite_Addroffset = 0; -uint8_t Pic_TitleLogo_Write(uint8_t *TitleLogoName, uint8_t *TitleLogo_Wbuff, uint32_t TitleLogoWriteSize) { - if (TitleLogoWriteSize <= 0) - return 0; - if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) - W25QXX.SPI_FLASH_BufferWrite(TitleLogo_Wbuff, PIC_ICON_LOGO_ADDR_TFT35 + TitleLogoWrite_Addroffset, TitleLogoWriteSize); - else - W25QXX.SPI_FLASH_BufferWrite(TitleLogo_Wbuff, PIC_ICON_LOGO_ADDR_TFT32 + TitleLogoWrite_Addroffset, TitleLogoWriteSize); - TitleLogoWrite_Addroffset += TitleLogoWriteSize; - if (TitleLogoWrite_Addroffset >= TITLELOGO_MAX_SIZE) - TitleLogoWrite_Addroffset = 0; - return 1; -} - -uint32_t default_view_addroffset_r = 0; -void default_view_Write(uint8_t *default_view__Rbuff, uint32_t default_view_Writesize) { - W25QXX.SPI_FLASH_BufferWrite(default_view__Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset_r, default_view_Writesize); - default_view_addroffset_r += default_view_Writesize; - if (default_view_addroffset_r >= DEFAULT_VIEW_MAX_SIZE) - default_view_addroffset_r = 0; -} - -uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { - uint8_t pic_counter = 0; - uint32_t Pic_SaveAddr; - uint32_t Pic_SizeSaveAddr; - uint32_t Pic_NameSaveAddr; - uint8_t Pname_temp; - uint32_t i, j; - uint32_t name_len = 0; - uint32_t SaveName_len = 0; - union union32 size_tmp; - - W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); - - if (pic_counter == 0xFF) - pic_counter = 0; - - if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) - Pic_SaveAddr = PIC_DATA_ADDR_TFT35 + pic_counter * PER_PIC_MAX_SPACE_TFT35; - else - Pic_SaveAddr = PIC_DATA_ADDR_TFT32 + pic_counter * PER_PIC_MAX_SPACE_TFT32; - - for (j = 0; j < pic_counter; j++) { - do { - W25QXX.SPI_FLASH_BufferRead(&Pname_temp, PIC_NAME_ADDR + SaveName_len, 1); - SaveName_len++; - } while (Pname_temp != '\0'); - } - i = 0; - while ((*(P_name + i) != '\0')) { - i++; - name_len++; - } - - Pic_NameSaveAddr = PIC_NAME_ADDR + SaveName_len; - W25QXX.SPI_FLASH_BufferWrite(P_name, Pic_NameSaveAddr, name_len + 1); - Pic_SizeSaveAddr = PIC_SIZE_ADDR + 4 * pic_counter; - size_tmp.dwords = P_size; - W25QXX.SPI_FLASH_BufferWrite(size_tmp.bytes, Pic_SizeSaveAddr, 4); - - pic_counter++; - W25QXX.SPI_FLASH_SectorErase(PIC_COUNTER_ADDR); - W25QXX.SPI_FLASH_BufferWrite(&pic_counter, PIC_COUNTER_ADDR, 1); - - return Pic_SaveAddr; -} - -uint8_t public_buf[512]; - -#if ENABLED(SDSUPPORT) - - static void dosName2LongName(const char dosName[11], char* longName) { - uint8_t j = 0; - LOOP_L_N(i, 11) { - if (i == 8) longName[j++] = '.'; - if (dosName[i] == '\0' || dosName[i] == ' ') continue; - longName[j++] = dosName[i]; - } - longName[j] = '\0'; - } - - static int8_t arrayFindStr(const char arr[][LONG_FILENAME_LENGTH], uint8_t arraySize, const char* str) { - for (uint8_t a = 0; a < arraySize; a++) { - if (strcasecmp(arr[a], str) == 0) - return a; - } - return -1; - } - - #if ENABLED(MARLIN_DEV_MODE) - static uint32_t totalSizes = 0, totalCompressed = 0; - #endif - - #define ASSET_TYPE_ICON 0 - #define ASSET_TYPE_LOGO 1 - #define ASSET_TYPE_TITLE_LOGO 2 - #define ASSET_TYPE_G_PREVIEW 3 - #define ASSET_TYPE_FONT 4 - static void loadAsset(SdFile &dir, dir_t& entry, const char *fn, int8_t assetType) { - SdFile file; - char dosFilename[FILENAME_LENGTH]; - createFilename(dosFilename, entry); - if (!file.open(&dir, dosFilename, O_READ)) { - #if ENABLED(MARLIN_DEV_MODE) - SERIAL_ECHOLNPAIR("Error opening Asset: ", fn); - #endif - return; - } - - watchdog_refresh(); - disp_assets_update_progress(fn); - - W25QXX.init(SPI_QUARTER_SPEED); - - uint16_t pbr; - uint32_t pfileSize; - uint32_t totalSizeLoaded = 0; - uint32_t Pic_Write_Addr; - pfileSize = file.fileSize(); - totalSizeLoaded += pfileSize; - if (assetType == ASSET_TYPE_LOGO) { - do { - watchdog_refresh(); - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); - } while (pbr >= BMP_WRITE_BUF_LEN); - } - else if (assetType == ASSET_TYPE_TITLE_LOGO) { - do { - watchdog_refresh(); - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); - } while (pbr >= BMP_WRITE_BUF_LEN); - } - else if (assetType == ASSET_TYPE_G_PREVIEW) { - do { - watchdog_refresh(); - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - default_view_Write(public_buf, pbr); - } while (pbr >= BMP_WRITE_BUF_LEN); - } - else if (assetType == ASSET_TYPE_ICON) { - Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize); - SPIFlash.beginWrite(Pic_Write_Addr); - #if HAS_SPI_FLASH_COMPRESSION - do { - watchdog_refresh(); - pbr = file.read(public_buf, SPI_FLASH_PageSize); - TERN_(MARLIN_DEV_MODE, totalSizes += pbr); - SPIFlash.writeData(public_buf, SPI_FLASH_PageSize); - } while (pbr >= SPI_FLASH_PageSize); - #else - do { - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); - Pic_Write_Addr += pbr; - } while (pbr >= BMP_WRITE_BUF_LEN); - #endif - #if ENABLED(MARLIN_DEV_MODE) - SERIAL_ECHOLNPAIR("Space used: ", fn, " - ", (SPIFlash.getCurrentPage() + 1) * SPI_FLASH_PageSize / 1024, "KB"); - totalCompressed += (SPIFlash.getCurrentPage() + 1) * SPI_FLASH_PageSize; - #endif - SPIFlash.endWrite(); - } - else if (assetType == ASSET_TYPE_FONT) { - Pic_Write_Addr = UNIGBK_FLASH_ADDR; - do { - watchdog_refresh(); - pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr); - Pic_Write_Addr += pbr; - } while (pbr >= BMP_WRITE_BUF_LEN); - } - - file.close(); - - #if ENABLED(MARLIN_DEV_MODE) - SERIAL_ECHOLNPAIR("Asset added: ", fn); - #endif - } - - void UpdateAssets() { - SdFile dir, root = card.getroot(); - if (dir.open(&root, assetsPath, O_RDONLY)) { - - disp_assets_update(); - disp_assets_update_progress("Erasing pics..."); - watchdog_refresh(); - spiFlashErase_PIC(); - #if HAS_SPI_FLASH_FONT - disp_assets_update_progress("Erasing fonts..."); - watchdog_refresh(); - spiFlashErase_FONT(); - #endif - - disp_assets_update_progress("Reading files..."); - dir_t d; - while (dir.readDir(&d, card.longFilename) > 0) { - // If we dont get a long name, but gets a short one, try it - if (card.longFilename[0] == 0 && d.name[0] != 0) - dosName2LongName((const char*)d.name, card.longFilename); - if (card.longFilename[0] == 0) continue; - if (card.longFilename[0] == '.') continue; - - int8_t a = arrayFindStr(assets, COUNT(assets), card.longFilename); - if (a >= 0 && a < (int8_t)COUNT(assets)) { - uint8_t assetType = ASSET_TYPE_ICON; - if (strstr(assets[a], "_logo")) - assetType = ASSET_TYPE_LOGO; - else if (strstr(assets[a], "_titlelogo")) - assetType = ASSET_TYPE_TITLE_LOGO; - else if (strstr(assets[a], "_preview")) - assetType = ASSET_TYPE_G_PREVIEW; - - loadAsset(dir, d, assets[a], assetType); - - continue; - } - - #if HAS_SPI_FLASH_FONT - a = arrayFindStr(fonts, COUNT(fonts), card.longFilename); - if (a >= 0 && a < (int8_t)COUNT(fonts)) - loadAsset(dir, d, fonts[a], ASSET_TYPE_FONT); - #endif - } - dir.rename(&root, bakPath); - } - dir.close(); - - #if ENABLED(MARLIN_DEV_MODE) - uint8_t pic_counter = 0; - W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); - SERIAL_ECHOLNPAIR("Total assets loaded: ", pic_counter); - SERIAL_ECHOLNPAIR("Total Uncompressed: ", totalSizes, ", Compressed: ", totalCompressed); - #endif - } - - #if HAS_SPI_FLASH_FONT - void spi_flash_read_test() { W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN); } - #endif - -#endif // SDSUPPORT - -void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) { - uint8_t i, j; - uint8_t Pic_cnt; - uint32_t tmp_cnt = 0; - PIC_MSG PIC; - - W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1); - if (Pic_cnt == 0xFF) - Pic_cnt = 0; - - for (i = 0; i < Pic_cnt; i++) { - j = 0; - do { - W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1); - tmp_cnt++; - } while (PIC.name[j++] != '\0'); - //pic size - W25QXX.SPI_FLASH_BufferRead(PIC.size.bytes, PIC_SIZE_ADDR + i * 4, 4); - - if ((strcmp((char*)Pname, (char*)PIC.name)) == 0) { - W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35, PIC.size.dwords); - break; - } - } -} - -void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) { - #if HAS_SPI_FLASH_COMPRESSION - if (currentFlashPage == 0) - SPIFlash.beginRead(addr); - SPIFlash.readData(P_Rbuff, size); - currentFlashPage++; - #else - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size); - #endif -} - -#if HAS_SPI_FLASH_FONT - void get_spi_flash_data(const char *rec_buf, int addr, int size) { - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead((uint8_t *)rec_buf, UNIGBK_FLASH_ADDR + addr, size); - } -#endif - -uint32_t logo_addroffset = 0; -void Pic_Logo_Read(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize) { - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead(Logo_Rbuff, PIC_LOGO_ADDR + logo_addroffset, LogoReadsize); - logo_addroffset += LogoReadsize; - if (logo_addroffset >= LOGO_MAX_SIZE_TFT35) - logo_addroffset = 0; -} - -uint32_t default_view_addroffset = 0; -void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize) { - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead(default_view_Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset, default_view_Readsize); - default_view_addroffset += default_view_Readsize; - if (default_view_addroffset >= DEFAULT_VIEW_MAX_SIZE) - default_view_addroffset = 0; -} - -#if HAS_BAK_VIEW_IN_FLASH - uint32_t flash_view_addroffset = 0; - void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize) { - W25QXX.init(SPI_QUARTER_SPEED); - W25QXX.SPI_FLASH_BufferRead(flash_view_Rbuff, BAK_VIEW_ADDR_TFT35 + flash_view_addroffset, flash_view_Readsize); - flash_view_addroffset += flash_view_Readsize; - if (flash_view_addroffset >= FLASH_VIEW_MAX_SIZE) - flash_view_addroffset = 0; - } -#endif - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h deleted file mode 100644 index ea75915df3..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../../inc/MarlinConfig.h" - -#include "../../../../libs/W25Qxx.h" - -#include - -#include -#include - -#ifndef HAS_SPI_FLASH_FONT - #define HAS_SPI_FLASH_FONT 1 // Disabled until fix the font load code -#endif -#ifndef HAS_GCODE_PREVIEW - #define HAS_GCODE_PREVIEW 1 -#endif -#ifndef HAS_LANG_SELECT_SCREEN - #define HAS_LANG_SELECT_SCREEN 1 -#endif -#ifndef HAS_BAK_VIEW_IN_FLASH - #define HAS_BAK_VIEW_IN_FLASH 1 -#endif -#ifndef HAS_GCODE_DEFAULT_VIEW_IN_FLASH - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 1 -#endif -#ifndef HAS_LOGO_IN_FLASH - #define HAS_LOGO_IN_FLASH 1 -#endif -#ifndef SPI_FLASH_SIZE - #define SPI_FLASH_SIZE 0x1000000 // 16MB -#endif - -#define PIC_MAX_CN 100 // Maximum number of pictures -#define PIC_NAME_MAX_LEN 50 // Picture name maximum length - -#define LOGO_MAX_SIZE_TFT35 (300*1024) -#define LOGO_MAX_SIZE_TFT32 (150*1024) -#define TITLELOGO_MAX_SIZE (150*1024) // Little logo maximum -#define DEFAULT_VIEW_MAX_SIZE (200*200*2) -#define FLASH_VIEW_MAX_SIZE (200*200*2) - -#define PER_PIC_MAX_SPACE_TFT35 (9*1024) -#define PER_PIC_MAX_SPACE_TFT32 (16*1024) -#define PER_FONT_MAX_SPACE (16*1024) - -#if SPI_FLASH_SIZE == 0x200000 - //pic - //Robin_pro pic addr - #define PIC_NAME_ADDR 0x001000 // Pic information addr - #define PIC_SIZE_ADDR 0x001800 // Pic size information addr - #define PIC_COUNTER_ADDR 0x002000 // Pic total number - #define PER_PIC_SAVE_ADDR 0x000000 // Storage address of each picture - #define PIC_LOGO_ADDR 0x000000 // Logo addr - #define PIC_DATA_ADDR 0x003000 // - - // TFT35 - #define DEFAULT_VIEW_ADDR_TFT35 0x1EA070 - #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) - #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) - #define PIC_DATA_ADDR_TFT35 0x003000 // (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800 - - #define PIC_DATA_ADDR_TFT32 0x00F000 - #define PIC_ICON_LOGO_ADDR_TFT32 0x5D8000 - #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000 - - // font - #define FONTINFOADDR 0x150000 // 6M -- font addr - #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 - -#else - //pic - //Robin_pro pic addr - #define PIC_NAME_ADDR 0x003000 // Pic information addr - #define PIC_SIZE_ADDR 0x007000 // Pic size information addr - #define PIC_COUNTER_ADDR 0x008000 // Pic total number - //#define PER_PIC_SAVE_ADDR 0x009000 // Storage address of each picture - #define PIC_LOGO_ADDR 0x009000 // Logo addr - //#define PIC_DATA_ADDR 0x02F000 // - - // TFT35 - #define DEFAULT_VIEW_ADDR_TFT35 0xC5800 - #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024) - #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024) - #define PIC_DATA_ADDR_TFT35 (PIC_ICON_LOGO_ADDR_TFT35+350*1024) //0xC5800 - - // TFT32 - #define PIC_DATA_ADDR_TFT32 0x02F000 - #define PIC_ICON_LOGO_ADDR_TFT32 0x5D8000 - #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000 - - // font - #define FONTINFOADDR 0x600000 // 6M -- font addr - #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024 - #define GBK_FLASH_ADDR (UNIGBK_FLASH_ADDR+180224) // 176*1024 - -#endif - -// Flash flag -#define REFLSHE_FLGA_ADD (0X800000-32) - -// SD card information first addr -#define VAR_INF_ADDR 0x000000 -#define FLASH_INF_VALID_FLAG 0x20200831 - -//Store some gcode commands, such as auto leveling commands -#define GCODE_COMMAND_ADDR VAR_INF_ADDR + 3*1024 -#define AUTO_LEVELING_COMMAND_ADDR GCODE_COMMAND_ADDR -#define OTHERS_COMMAND_ADDR_1 AUTO_LEVELING_COMMAND_ADDR + 100 -#define OTHERS_COMMAND_ADDR_2 OTHERS_COMMAND_ADDR_1 + 100 -#define OTHERS_COMMAND_ADDR_3 OTHERS_COMMAND_ADDR_2 + 100 -#define OTHERS_COMMAND_ADDR_4 OTHERS_COMMAND_ADDR_3 + 100 - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -union union32 { - uint8_t bytes[4]; - uint32_t dwords; -}; - -// pic information -struct pic_msg { - uint8_t name[PIC_NAME_MAX_LEN]; - union union32 size; -}; - -typedef struct pic_msg PIC_MSG; - -#define BMP_WRITE_BUF_LEN 512 - -#define PICINFOADDR 0x1000 - -#define PIC_SIZE_xM 6 -#define FONT_SIZE_xM 2 - -extern void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff); -extern void Pic_Logo_Read(uint8_t *LogoName,uint8_t *Logo_Rbuff,uint32_t LogoReadsize); -extern void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); -extern uint32_t lv_get_pic_addr(uint8_t *Pname); -extern void get_spi_flash_data(const char *rec_buf, int offset, int size); -extern void spi_flash_read_test(); -extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize); -extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp deleted file mode 100644 index 2b6f5f89f6..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../../MarlinCore.h" - -#include "lv_conf.h" -#include "draw_ui.h" -#include "../../../../module/temperature.h" -#include "../../../../module/motion.h" -#include "../../../../sd/cardreader.h" -#include "../../../../gcode/queue.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" -#endif - -#include "../../../../gcode/gcode.h" -#include "../../../../module/planner.h" - -extern uint32_t To_pre_view; -extern uint8_t flash_preview_begin, default_preview_flg, gcode_preview_over; - -void printer_state_polling() { - if (uiCfg.print_state == PAUSING) { - #if ENABLED(SDSUPPORT) - if (!planner.has_blocks_queued() && card.getIndex() > MIN_FILE_PRINTED) - uiCfg.waitEndMoves++; - - if (uiCfg.waitEndMoves > 20) { - uiCfg.waitEndMoves = 0; - planner.synchronize(); - - gcode.process_subcommands_now_P(PSTR("M25")); - - //save the positon - uiCfg.current_x_position_bak = current_position.x; - uiCfg.current_y_position_bak = current_position.y; - - if (gCfgItems.pausePosZ != (float)-1) { - gcode.process_subcommands_now_P(PSTR("G91")); - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 Z%.1f"), gCfgItems.pausePosZ); - gcode.process_subcommands_now(public_buf_l); - gcode.process_subcommands_now_P(PSTR("G90")); - } - if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 X%.1f Y%.1f"), gCfgItems.pausePosX, gCfgItems.pausePosY); - gcode.process_subcommands_now(public_buf_l); - } - uiCfg.print_state = PAUSED; - uiCfg.current_e_position_bak = current_position.e; - - // #if ENABLED(POWER_LOSS_RECOVERY) - // if (recovery.enabled) recovery.save(true); - // #endif - gCfgItems.pause_reprint = 1; - update_spi_flash(); - } - #endif - } - else - uiCfg.waitEndMoves = 0; - - if (uiCfg.print_state == PAUSED) { - } - - if (uiCfg.print_state == RESUMING) { - if (IS_SD_PAUSED()) { - if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { - ZERO(public_buf_m); - sprintf_P(public_buf_m, PSTR("G1 X%.1f Y%.1f"), uiCfg.current_x_position_bak, uiCfg.current_y_position_bak); - gcode.process_subcommands_now(public_buf_m); - } - if (gCfgItems.pausePosZ != (float)-1) { - gcode.process_subcommands_now_P(PSTR("G91")); - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); - gcode.process_subcommands_now(public_buf_l); - gcode.process_subcommands_now_P(PSTR("G90")); - } - gcode.process_subcommands_now_P(PSTR("M24")); - uiCfg.print_state = WORKING; - start_print_time(); - - gCfgItems.pause_reprint = 0; - update_spi_flash(); - } - } - #if ENABLED(POWER_LOSS_RECOVERY) - if (uiCfg.print_state == REPRINTED) { - ZERO(public_buf_m); - #if HAS_HOTEND - HOTEND_LOOP() { - const int16_t et = recovery.info.target_temperature[e]; - if (et) { - #if HAS_MULTI_HOTEND - sprintf_P(public_buf_m, PSTR("T%i"), e); - gcode.process_subcommands_now(public_buf_m); - #endif - sprintf_P(public_buf_m, PSTR("M109 S%i"), et); - gcode.process_subcommands_now(public_buf_m); - } - } - #endif - - recovery.resume(); - #if 0 - // Move back to the saved XY - char str_1[16], str_2[16]; - ZERO(public_buf_m); - sprintf_P(public_buf_m, PSTR("G1 X%s Y%s F2000"), - dtostrf(recovery.info.current_position.x, 1, 3, str_1), - dtostrf(recovery.info.current_position.y, 1, 3, str_2) - ); - gcode.process_subcommands_now(public_buf_m); - - if ((gCfgItems.pause_reprint) == 1 && (gCfgItems.pausePosZ != (float)-1)) { - gcode.process_subcommands_now_P(PSTR("G91")); - ZERO(public_buf_l); - sprintf_P(public_buf_l, PSTR("G1 Z-%.1f"), gCfgItems.pausePosZ); - gcode.process_subcommands_now(public_buf_l); - gcode.process_subcommands_now_P(PSTR("G90")); - } - #endif - uiCfg.print_state = WORKING; - start_print_time(); - - gCfgItems.pause_reprint = 0; - update_spi_flash(); - } - #endif - - if (uiCfg.print_state == WORKING) - filament_check(); - - TERN_(USE_WIFI_FUNCTION, wifi_looping()); -} - -void filament_pin_setup() { - #if PIN_EXISTS(MT_DET_1) - SET_INPUT_PULLUP(MT_DET_1_PIN); - #endif - #if PIN_EXISTS(MT_DET_2) - SET_INPUT_PULLUP(MT_DET_2_PIN); - #endif - #if PIN_EXISTS(MT_DET_3) - SET_INPUT_PULLUP(MT_DET_3_PIN); - #endif -} - -void filament_check() { - const int FIL_DELAY = 20; - #if PIN_EXISTS(MT_DET_1) - static int fil_det_count_1 = 0; - if (!READ(MT_DET_1_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_1++; - else if (READ(MT_DET_1_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_1++; - else if (fil_det_count_1 > 0) - fil_det_count_1--; - - if (!READ(MT_DET_1_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_1++; - else if (READ(MT_DET_1_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_1++; - else if (fil_det_count_1 > 0) - fil_det_count_1--; - #endif - - #if PIN_EXISTS(MT_DET_2) - static int fil_det_count_2 = 0; - if (!READ(MT_DET_2_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_2++; - else if (READ(MT_DET_2_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_2++; - else if (fil_det_count_2 > 0) - fil_det_count_2--; - - if (!READ(MT_DET_2_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_2++; - else if (READ(MT_DET_2_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_2++; - else if (fil_det_count_2 > 0) - fil_det_count_2--; - #endif - - #if PIN_EXISTS(MT_DET_3) - static int fil_det_count_3 = 0; - if (!READ(MT_DET_3_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_3++; - else if (READ(MT_DET_3_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_3++; - else if (fil_det_count_3 > 0) - fil_det_count_3--; - - if (!READ(MT_DET_3_PIN) && !MT_DET_PIN_INVERTING) - fil_det_count_3++; - else if (READ(MT_DET_3_PIN) && MT_DET_PIN_INVERTING) - fil_det_count_3++; - else if (fil_det_count_3 > 0) - fil_det_count_3--; - #endif - - if (false - #if PIN_EXISTS(MT_DET_1) - || fil_det_count_1 >= FIL_DELAY - #endif - #if PIN_EXISTS(MT_DET_2) - || fil_det_count_2 >= FIL_DELAY - #endif - #if PIN_EXISTS(MT_DET_3) - || fil_det_count_3 >= FIL_DELAY - #endif - ) { - clear_cur_ui(); - card.pauseSDPrint(); - stop_print_time(); - uiCfg.print_state = PAUSING; - - if (gCfgItems.from_flash_pic == 1) - flash_preview_begin = 1; - else - default_preview_flg = 1; - - lv_draw_printing(); - } -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h deleted file mode 100644 index f304158824..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#define MIN_FILE_PRINTED 100 //5000 - -extern void printer_state_polling(); -extern void filament_pin_setup(); -extern void filament_check(); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h deleted file mode 100644 index fa8d5a52a4..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ /dev/null @@ -1,766 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//****************英文***************************// -#define MACHINE_CONFIG_EN "Config" - -#define NEXT_EN "Next" -#define PREVIOUS_EN "Previous" -#define DEFAULT_EN "Default" -#define KEY_BACK_EN "Del" -#define KEY_REST_EN "Reset" -#define KEY_CONFIRM_EN "Confirm" - -#define KEYBOARD_KEY0_EN "0" -#define KEYBOARD_KEY1_EN "1" -#define KEYBOARD_KEY2_EN "2" -#define KEYBOARD_KEY3_EN "3" -#define KEYBOARD_KEY4_EN "4" -#define KEYBOARD_KEY5_EN "5" -#define KEYBOARD_KEY6_EN "6" -#define KEYBOARD_KEY7_EN "7" -#define KEYBOARD_KEY8_EN "8" -#define KEYBOARD_KEY9_EN "9" -#define KEYBOARD_KEY_POINT_EN "." -#define KEYBOARD_KEY_NEGATIVE_EN "-" - -#define MACHINE_PARA_TITLE_EN "Config" -#define MACHINE_TYPE_CNOFIG_EN "Machine settings" -#define MOTOR_CONFIG_EN "Motor settings" -#define MACHINE_LEVELING_CONFIG_EN "Leveling settings" -#define ADVANCE_CONFIG_EN "Adavance settings" - -#define MACHINE_CONFIG_TITLE_EN "Machine Settings" -#define MACHINE_TYPE_EN "Machine type" -#define MACHINE_STROKE_EN "Machine Size" -#define MACHINE_HOMEDIR_EN "Home direction" -#define MACHINE_ENDSTOP_TYPE_EN "Endstop type" -#define MACHINE_FILAMENT_CONFIG_EN "Filament settings" - -#define MACHINE_TYPE_CONFIG_TITLE_EN "Machine Settings>Machine type" -#define MACHINE_TYPE_XYZ_EN "XYZ Machine" -#define MACHINE_TYPE_DELTA_EN "Delta Machine" -#define MACHINE_TYPE_COREXY_EN "Corexy Machine" - -#define MACHINE_STROKE_CONF_TITLE_EN "Machine Settings>Machine Size" -#define X_MAX_LENGTH_EN "X-axis maximum stroke" -#define Y_MAX_LENGTH_EN "Y-axis maximum stroke" -#define Z_MAX_LENGTH_EN "Z-axis maximum stroke" - -#define X_MIN_LENGTH_EN "X-axis minimum stroke" -#define Y_MIN_LENGTH_EN "Y-axis minimum stroke" -#define Z_MIN_LENGTH_EN "Z-axis minimum stroke" - -#define HOME_DIR_CONF_TITLE_EN "Machine Settings>Home direction" -#define HOME_DIR_X_EN "X-axis home direction" -#define HOME_DIR_Y_EN "Y-axis home direction" -#define HOME_DIR_Z_EN "Z-axis home direction" -#define HOME_MIN_EN "MIN" -#define HOME_MAX_EN "MAX" - -#define ENDSTOP_CONF_TITLE_EN "Machine Settings>Endstop type" -#define MIN_ENDSTOP_X_EN "X-axis minimum Endstop" -#define MIN_ENDSTOP_Y_EN "Y-axis minimum Endstop" -#define MIN_ENDSTOP_Z_EN "Z-axis minimum Endstop" -#define MAX_ENDSTOP_X_EN "X axis maximum Endstop" -#define MAX_ENDSTOP_Y_EN "Y axis maximum Endstop" -#define MAX_ENDSTOP_Z_EN "Z axis maximum Endstop" -#define ENDSTOP_FIL_EN "Filament sensor" -#define ENDSTOP_LEVEL_EN "Leveling sensor" -#define ENDSTOP_OPENED_EN "Open" -#define ENDSTOP_CLOSED_EN "Close" - -#define FILAMENT_CONF_TITLE_EN "Machine Settings>Filament settings" -#define FILAMENT_IN_LENGTH_EN "Load length" -#define FILAMENT_IN_SPEED_EN "Load speed" -#define FILAMENT_TEMPERATURE_EN "Filament temperature" -#define FILAMENT_OUT_LENGTH_EN "Unload length" -#define FILAMENT_OUT_SPEED_EN "Unload speed" - -#define LEVELING_CONF_TITLE_EN "Machine Settings>Leveling settings" -#define LEVELING_PARA_CONF_EN "Leveling settings" -#define LEVELING_MANUAL_POS_EN "Manual leveling coordinate settings" -#define LEVELING_AUTO_COMMAND_EN "AutoLeveling command settings" -#define LEVELING_AUTO_ZOFFSET_EN "Nozzle-to-probe offsets settings" - -#define LEVELING_PARA_CONF_TITLE_EN "leveling setting" -#define AUTO_LEVELING_ENABLE_EN "Enable auto leveling" -#define BLTOUCH_LEVELING_ENABLE_EN "Enable BLtouch" -#define PROBE_PORT_EN "Probe connector" -#define PROBE_X_OFFSET_EN "Probe x axis offset" -#define PROBE_Y_OFFSET_EN "Probe y axis offset" -#define PROBE_Z_OFFSET_EN "Probe z axis offset" -#define PROBE_XY_SPEED_EN "Probe xy axis speed" -#define PROBE_Z_SPEED_EN "Probe z axis speed" -#define ENABLE_EN "YES" -#define DISABLE_EN "NO" -#define Z_MIN_EN "ZMin" -#define Z_MAX_EN "ZMax" - -#define DELTA_LEVEL_CONF_TITLE_EN "Delta Machine settings" -#define DELTA_LEVEL_CONF_EN "Delta Machine Leveling" -#define DELTA_MACHINE_RADIUS_EN "Machine Radius" -#define DELTA_DIAGONAL_ROD_EN "Machine rod length" -#define DELTA_PRINT_RADIUS_EN "Print radius" -#define DELTA_HEIGHT_EN "Print height" -#define SMOOTH_ROD_OFFSET_EN "Slider offset" -#define EFFECTOR_OFFSET_EN "Effector offset" -#define CALIBRATION_RADIUS_EN "Leveling radius" - -#define XYZ_LEVEL_CONF_TITLE_EN "Cartesian Machine Settings" -#define PROBE_REACH_MAX_LEFT_EN "Probe reaches leftmost position" -#define PROBE_REACH_MAX_RIGHT_EN "Probe reaches rightmost position" -#define PROBE_REACH_MAX_FRONT_EN "Probe reaches front position" -#define PROBE_REACH_MAX_BACK_EN "Probe reaches final position" - -#define TEMPERATURE_CONF_TITLE_EN "Machine Settings>Temperature settings" -#define NOZZLE_CONF_EN "Nozzle settings" -#define HOTBED_CONF_EN "Hotbed settings" -#define PREHEAT_TEMPER_EN "Preset temperature" - -#define NOZZLE_CONF_TITLE_EN "Machine Settings>Nozzle settings" -#define NOZZLECNT_EN "Number of nozzles" -#define NOZZLE_TYPE_EN "E0 Temperature type" -#define NOZZLE_ADJUST_TYPE_EN "PID thermostat" -#define NOZZLE_MIN_TEMPERATURE_EN "lowest temperature" -#define NOZZLE_MAX_TEMPERATURE_EN "Maximum temperature" -#define EXTRUD_MIN_TEMPER_EN "Minimum extrusion temperature" - -#define HOTBED_CONF_TITLE_EN "Machine Settings>Hotbed settings" -#define HOTBED_ADJUST_EN "PID thermostat" -#define HOTBED_MIN_TEMPERATURE_EN "lowest temperature" -#define HOTBED_MAX_TEMPERATURE_EN "Maximum temperature" - -#define MOTOR_CONF_TITLE_EN "Machine Settings>Motor settings" -#define MAXFEEDRATE_CONF_EN "Maximum speed settings" -#define ACCELERATION_CONF_EN "Acceleration settings" -#define JERKCONF_EN "Jerk settings" -#define STEPSCONF_EN "Steps settings" -#define TMC_CURRENT_EN "TMC Current settings" -#define TMC_STEP_MODE_EN "TMC Step mode settings" -#define MOTORDIRCONF_EN "Motor direction settings" -#define HOMEFEEDRATECONF_EN "Home speed setting" - -#define MAXFEEDRATE_CONF_TITLE_EN "Machine Settings>Maximum speed" -#define X_MAXFEEDRATE_EN "X axis maximum speed" -#define Y_MAXFEEDRATE_EN "Y axis maximum speed" -#define Z_MAXFEEDRATE_EN "Z axis maximum speed" -#define E0_MAXFEEDRATE_EN "E0 axis maximum speed" -#define E1_MAXFEEDRATE_EN "E1 axis maximum speed" - -#define ACCELERATION_CONF_TITLE_EN "Machine Settings>Acceleration" -#define PRINT_ACCELERATION_EN "Print acceleration" -#define RETRACT_ACCELERATION_EN "Retraction acceleration" -#define TRAVEL_ACCELERATION_EN "Travel acceleration" -#define X_ACCELERATION_EN "X-axis acceleration" -#define Y_ACCELERATION_EN "Y-axis acceleration" -#define Z_ACCELERATION_EN "Z-axis acceleration" -#define E0_ACCELERATION_EN "E0-axis acceleration" -#define E1_ACCELERATION_EN "E1-axis acceleration" - -#define JERK_CONF_TITLE_EN "Machine Settings>Jerk speed" -#define X_JERK_EN "X-axis jerk speed" -#define Y_JERK_EN "Y-axis jerk speed" -#define Z_JERK_EN "J-axis jerk speed" -#define E_JERK_EN "E-axis jerk speed" - -#define STEPS_CONF_TITLE_EN "Machine Settings>Steps settings" -#define X_STEPS_EN "X-axis steps" -#define Y_STEPS_EN "Y-axis stepS" -#define Z_STEPS_EN "Z-axis stepS" -#define E0_STEPS_EN "E0-axis steps" -#define E1_STEPS_EN "E1-axis steps" - -#define TMC_CURRENT_CONF_TITLE_EN "Machine Settings>TMC current settings" -#define X_TMC_CURRENT_EN "X axis current (mA)" -#define Y_TMC_CURRENT_EN "Y axis current (mA)" -#define Z_TMC_CURRENT_EN "Z axis current (mA)" -#define E0_TMC_CURRENT_EN "E0 axis current (mA)" -#define E1_TMC_CURRENT_EN "E1 axis current (mA)" - -#define TMC_MODE_CONF_TITLE_EN "Machine Settings>TMC step mode settings" -#define X_TMC_MODE_EN "Whether X axis enable stealthChop modes" -#define Y_TMC_MODE_EN "Whether Y axis enable stealthChop modes" -#define Z_TMC_MODE_EN "Whether Z axis enable stealthChop modes" -#define E0_TMC_MODE_EN "Whether E0 axis enable stealthChop modes" -#define E1_TMC_MODE_EN "Whether E1 axis enable stealthChop modes" - -#define MOTORDIR_CONF_TITLE_EN "Machine Settings>Motor direction" -#define X_MOTORDIR_EN "X-axis motor direction invert" -#define Y_MOTORDIR_EN "Y-axis motor direction invert" -#define Z_MOTORDIR_EN "Z-axis motor direction invert" -#define E0_MOTORDIR_EN "E0-axis motor direction invert" -#define E1_MOTORDIR_EN "E1-axis motor direction invert" -#define INVERT_P_EN "YES" -#define INVERT_N_EN "NO" - -#define HOMEFEEDRATE_CONF_TITLE_EN "Machine Settings>Home speed" -#define X_HOMESPEED_EN "XY-axis Home speed" -#define Y_HOMESPEED_EN "Y-axis Home speed" -#define Z_HOMESPEED_EN "Z-axis Home speed" - -#define ADVANCED_CONF_TITLE_EN "Machine Settings>Advance" -#define PWROFF_DECTION_EN "power off dection module" -#define PWROFF_AFTER_PRINT_EN "Auto Shutdown after print" -#define HAVE_UPS_EN "Has UPS power supply" -#define Z2_AND_Z2ENDSTOP_CONF_EN "Z2 Settings" -#define ENABLE_PINS_CONF_EN "Enable pins level settings" -#define WIFI_SETTINGS_EN "Wi-Fi parameter settings" -#define HOMING_SENSITIVITY_CONF_EN "Homing sensitivity settings" -#define ENCODER_SETTINGS_EN "Rotary encoder settings" - -#define Z2_AND_Z2ENDSTOP_CONF_TITLE_EN "Z2 Settings" -#define Z2_ENABLE_EN "Z2 Enable" -#define Z2_ENDSTOP_EN "Z2_EndStop Enable" -#define Z2_PORT_EN "Z2 Connector" - -#define ENABLE_PINS_CONF_TITLE_EN "ENABLE_PINS_LEVEL" -#define X_ENABLE_PINS_INVERT_EN "X_ENABLE_PIN_INVERT" -#define Y_ENABLE_PINS_INVERT_EN "Y_ENABLE_PIN_INVERT" -#define Z_ENABLE_PINS_INVERT_EN "Z_ENABLE_PIN_INVERT" -#define E_ENABLE_PINS_INVERT_EN "E_ENABLE_PIN_INVERT" - -#define PAUSE_POSITION_EN "Printing pause position settings" -#define PAUSE_POSITION_X_EN "X axis position (Absolute position,-1 invalid)" -#define PAUSE_POSITION_Y_EN "Y axis position (Absolute position,-1 invalid)" -#define PAUSE_POSITION_Z_EN "Z axis position (Relative position,-1 invalid)" - -#define WIFI_SETTINGS_TITLE_EN "Machine Settings>Wi-Fi Parameter" -#define WIFI_SETTINGS_MODE_EN "Wi-Fi Mode" -#define WIFI_SETTINGS_NAME_EN "Wi-Fi Name: " -#define WIFI_SETTINGS_PASSWORD_EN "Wi-Fi Password: " -#define WIFI_SETTINGS_CLOUD_EN "Do you use cloud services?" -#define WIFI_SETTINGS_CONFIG_EN "Config" -#define WIFI_SETTINGS_EDIT_EN "Edit" -#define WIFI_CONFIG_TIPS_EN "Wi-Fi configuration?" - -#define OFFSET_TITLE_EN "Machine Settings>Offset" -#define OFFSET_X_EN "X offset" -#define OFFSET_Y_EN "Y offset" -#define OFFSET_Z_EN "Z offset" - -#define HOMING_SENSITIVITY_CONF_TITLE_EN "Machine Settings>Sensitivity" -#define X_SENSITIVITY_EN "X Axis Sensitivity" -#define Y_SENSITIVITY_EN "Y Axis Sensitivity" -#define Z_SENSITIVITY_EN "Z Axis Sensitivity" -#define Z2_SENSITIVITY_EN "Z2 Axis Sensitivity" - -#define ENCODER_CONF_TITLE_EN "Machine Settings>Rotary encoder settings" -#define ENCODER_CONF_TEXT_EN "Is the encoder function used?" - -#define TOOL_TEXT_EN "Tool" -#define PREHEAT_TEXT_EN "Preheat" -#define MOVE_TEXT_EN "Move" -#define HOME_TEXT_EN "Home" -#define PRINT_TEXT_EN "Printing" -#define EXTRUDE_TEXT_EN "Extrusion" -#define LEVELING_TEXT_EN "Leveling" -#define AUTO_LEVELING_TEXT_EN "AutoLevel" -#define SET_TEXT_EN "Settings" -#define MORE_TEXT_EN "More" - -#define ADD_TEXT_EN "Add" -#define DEC_TEXT_EN "Dec" -#define EXTRUDER_1_TEXT_EN "Extrusion1" -#define EXTRUDER_2_TEXT_EN "Extrusion2" -#define HEATBED_TEXT_EN "HeatBed" -#define TEXT_1C_EN "1℃" -#define TEXT_5C_EN "5℃" -#define TEXT_10C_EN "10℃" -#define CLOSE_TEXT_EN "Close" - -#define BACK_TEXT_EN "Back" - -#define TOOL_PREHEAT_EN "Preheat" -#define TOOL_EXTRUDE_EN "Extrusion" -#define TOOL_MOVE_EN "Move" -#define TOOL_HOME_EN "Home" -#define TOOL_LEVELING_EN "Leveling" -#define TOOL_AUTO_LEVELING_EN "AutoLevel" -#define TOOL_FILAMENT_EN "Filament" -#define TOOL_MORE_EN "More" - -#define AXIS_X_ADD_TEXT_EN "X+" -#define AXIS_X_DEC_TEXT_EN "X-" -#define AXIS_Y_ADD_TEXT_EN "Y+" -#define AXIS_Y_DEC_TEXT_EN "Y-" -#define AXIS_Z_ADD_TEXT_EN "Z+" -#define AXIS_Z_DEC_TEXT_EN "Z-" -#define TEXT_01MM_EN "0.1mm" -#define TEXT_1MM_EN "1mm" -#define TEXT_10MM_EN "10mm" - -#define HOME_X_TEXT_EN "X" -#define HOME_Y_TEXT_EN "Y" -#define HOME_Z_TEXT_EN "Z" -#define HOME_ALL_TEXT_EN "Home" -#define HOME_STOPMOVE_EN "Quickstop" - -#define PAGE_UP_TEXT_EN "Page up" -#define PAGE_DOWN_TEXT_EN "Page down" - -#define EXTRUDER_IN_TEXT_EN "In" -#define EXTRUDER_OUT_TEXT_EN "Out" -#define EXTRUDE_1MM_TEXT_EN "1mm" -#define EXTRUDE_5MM_TEXT_EN "5mm" -#define EXTRUDE_10MM_TEXT_EN "10mm" -#define EXTRUDE_LOW_SPEED_TEXT_EN "Low" -#define EXTRUDE_MEDIUM_SPEED_TEXT_EN "Normal" -#define EXTRUDE_HIGH_SPEED_TEXT_EN "High" - -#define LEVELING_POINT1_TEXT_EN "Point1" -#define LEVELING_POINT2_TEXT_EN "Point2" -#define LEVELING_POINT3_TEXT_EN "Point3" -#define LEVELING_POINT4_TEXT_EN "Point4" -#define LEVELING_POINT5_TEXT_EN "Point5" - -#define FILESYS_TEXT_EN "FileSys" -#define WIFI_TEXT_EN "WiFi" -#define FAN_TEXT_EN "Fan" -#define ABOUT_TEXT_EN "About" -#define BREAK_POINT_TEXT_EN "Continue" -#define FILAMENT_TEXT_EN "Filament" -#define LANGUAGE_TEXT_EN "Language" -#define MOTOR_OFF_TEXT_EN "Motor-off" -#define MOTOR_OFF_XY_TEXT_EN "Off-XY" -#define SHUTDOWN_TEXT_EN "Shutdown" -#define MACHINE_PARA_EN "Config" -#define EEPROM_SETTINGS_EN "Eeprom Set" - -#define U_DISK_TEXT_EN "USB" -#define SD_CARD_TEXT_EN "SD" -#define WIFI_NAME_TEXT_EN "WiFi: " -#define WIFI_KEY_TEXT_EN "Key: " -#define WIFI_IP_TEXT_EN "IP: " -#define WIFI_AP_TEXT_EN "State: AP" -#define WIFI_STA_TEXT_EN "State: STA" -#define WIFI_CONNECTED_TEXT_EN "Connected" -#define WIFI_DISCONNECTED_TEXT_EN "Disconnected" -#define WIFI_EXCEPTION_TEXT_EN "Exception" -#define WIFI_RECONNECT_TEXT_EN "Reconnect" -#define CLOUD_TEXT_EN "Cloud" -#define CLOUD_BIND_EN "Bind" -#define CLOUD_UNBIND_EN "Unbind" -#define CLOUD_UNBINDING_EN "Unbinding" -#define CLOUD_DISCONNECTED_EN "Disconnected" -#define CLOUD_UNBINDED_EN "Unbinded" -#define CLOUD_BINDED_EN "Binded" -#define CLOUD_DISABLE_EN "Disable" - -#define FAN_ADD_TEXT_EN "Add" -#define FAN_DEC_TEXT_EN "Dec" -#define FAN_OPEN_TEXT_EN "100%" -#define FAN_HALF_TEXT_EN "50%" -#define FAN_CLOSE_TEXT_EN "Close" -#define FAN_TIPS1_TEXT_EN "FAN" -#define FAN_TIPS2_TEXT_EN "FAN\nClose" - -#define FILAMENT_IN_TEXT_EN "Load" -#define FILAMENT_OUT_TEXT_EN "Unload" -#define FILAMENT_EXT0_TEXT_EN "Extrusion1" -#define FILAMENT_EXT1_TEXT_EN "Extrusion2" -#define FILAMENT_HEAT_TEXT_EN "Preheat" -#define FILAMENT_STOP_TEXT_EN "Stop" -//#define FILAMENT_CHANGE_TEXT_EN "Filament replace" -#define FILAMENT_TIPS2_TEXT_EN "T:" -#define FILAMENT_TIPS3_TEXT_EN "Loading..." -#define FILAMENT_TIPS4_TEXT_EN "Unloading..." -#define FILAMENT_TIPS5_TEXT_EN "Temp is too low to go,please heat" -#define FILAMENT_TIPS6_TEXT_EN "Completed" - -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_EN "Please click or \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_EN "Please click or ,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN "Heat completed,please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_EN "Please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN "Heat completed,please click for start unloading.!" - #define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading ,please wait!" - #define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading,please wait!" - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,click for return!" - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,click for return!" -#endif - - -#define FILAMENT_CHANGE_TEXT_EN "Please click \nor ,After \npinter pause." -#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN "Heating up the nozzle,\nplease wait..." -#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN "Heating up the nozzle,\nplease wait..." -#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN "Heat completed,please load filament \nto extruder,and click \nfor start loading." -#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_EN "Please load filament to extruder,\nand click for start loading." -#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading,please wait!" -#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,\nclick for return!" -#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,\nclick for return!" - - -#define PRE_HEAT_EXT_TEXT_EN "E" -#define PRE_HEAT_BED_TEXT_EN "Bed" - -#define FILE_LOADING_EN "Loading......" -#if 0 - #define NO_FILE_AND_CHECK_EN "No files found!Please insert SD card or U disk!" -#else - #define NO_FILE_AND_CHECK_EN " No files found!\n Check the file system configuration!" -#endif - -#define NO_FILE_EN "No files found!" - -#define EXTRUDER_TEMP_TEXT_EN "Temper" -#define EXTRUDER_E_LENGTH1_TEXT_EN "Extrusion1" -#define EXTRUDER_E_LENGTH2_TEXT_EN "Extrusion2" -#define EXTRUDER_E_LENGTH3_TEXT_EN "Extrusion3" - -#define ABOUT_TYPE_TEXT_EN "Type: " -#define ABOUT_VERSION_TEXT_EN "Firmware: " -#define ABOUT_WIFI_TEXT_EN "WiFi: " - -#define PRINTING_OPERATION_EN "Option" -#define PRINTING_PAUSE_EN "Pause" -#define PRINTING_TEMP_EN "Temp." -#define PRINTING_CHANGESPEED_EN "Speed" -#define PRINTING_RESUME_EN "Resume" -#define PRINTING_STOP_EN "Stop" -#define PRINTING_MORE_EN "More" -#define PRINTING_EXTRUDER_EN "Extrusion" -#define PRINTING_MOVE_EN "Move" - -#define EXTRUDER_SPEED_EN "Extrusion" -#define MOVE_SPEED_EN "Move" -#define EXTRUDER_SPEED_STATE_EN "Extrude Speed" -#define MOVE_SPEED_STATE_EN "Move Speed" -#define STEP_1PERCENT_EN "1%" -#define STEP_5PERCENT_EN "5%" -#define STEP_10PERCENT_EN "10%" - -#define TITLE_READYPRINT_EN "ReadyPrint" -#define TITLE_PREHEAT_EN "Preheat" -#define TITLE_MOVE_EN "Move" -#define TITLE_HOME_EN "Home" -#define TITLE_EXTRUDE_EN "Extrusion" -#define TITLE_LEVELING_EN "Leveling" -#define TITLE_SET_EN "Settings" -#define TITLE_MORE_EN "More" -#define TITLE_CHOOSEFILE_EN "ChooseFile" -#define TITLE_PRINTING_EN "Printing" -#define TITLE_OPERATION_EN "Operation" -#define TITLE_ADJUST_EN "Adjust" -#define TITLE_WIRELESS_EN "Wireless" -#define TITLE_FILAMENT_EN "Filament" -#define TITLE_ABOUT_EN "About" -#define TITLE_FAN_EN "Fan" -#define TITLE_LANGUAGE_EN "Language" -#define TITLE_PAUSE_EN "Pause" -#define TITLE_CHANGESPEED_EN "Speed" -#define TITLE_CLOUD_TEXT_EN "Cloud" -#define TITLE_DIALOG_CONFIRM_EN "Confirm" -#define TITLE_FILESYS_EN "FileSys" - -#define AUTO_SHUTDOWN_EN "Auto" -#define MANUAL_SHUTDOWN_EN "Manual" - -#define DIALOG_CONFIRM_EN "Confirm" -#define DIALOG_CANCLE_EN "Cancel" -#define DIALOG_OK_EN "OK" -#define DIALOG_RESET_EN "Reset" -#define DIALOG_RETRY_EN "Retry" -#define DIALOG_DISABLE_EN "Disable" -#define DIALOG_PRINT_MODEL_EN "Print this model?" -#define DIALOG_CANCEL_PRINT_EN "Stop print?" -#define DIALOG_RETRY_EN "Retry" -#define DIALOG_STOP_EN "Stop" -#define DIALOG_REPRINT_FROM_BREAKPOINT_EN "Reprint from breakpoint?" -//#define DIALOG_UNBIND_PRINTER_EN "Unbind the printer?" -#define DIALOG_ERROR_TIPS1_EN "Error:no file,please check it again." -#define DIALOG_ERROR_TIPS2_EN "Error:transaction failed.please check display baudrate \nwhether as the same as mainboard!" -#define DIALOG_ERROR_TIPS3_EN "Error:file name or path is too long!" -#define DIALOG_CLOSE_MACHINE_EN "Closing machine......" -#define DIALOG_UNBIND_PRINTER_EN "Unbind the printer?" -#define DIALOG_FILAMENT_NO_PRESS_EN "Filament detection switch is not pressed" -#define DIALOG_PRINT_FINISH_EN "Done print!" -#define DIALOG_PRINT_TIME_EN "Print time: " -#define DIALOG_REPRINT_EN "Print again" -#define DIALOG_WIFI_ENABLE_TIPS_EN "The wifi module is being configured\nplease wait a moment....." - -#define HOTBED_ENABLE_EN "Enable heatbed" -#define MOTOR_EN_HIGH_LEVEL_EN "High" -#define MOTOR_EN_LOW_LEVEL_EN "Low" - -#define TEXT_WIFI_MENU_TITLE_EN "WI-FI" -#define TEXT_WIFI_SAPCE_EN "space" -#define TEXT_WIFI_LETTER_EN "abc" -#define TEXT_WIFI_DIGITAL_EN "123" -#define TEXT_WIFI_SYMBOL_EN "#+=" -#define TEXT_WIFI_PASSWORD_EN "Password" - -#define TEXT_WIFI_JOINING_EN "Joining Network..." -#define TEXT_WIFI_FAILED_JOIN_EN "Failed to Join Wi-Fi" -#define TEXT_WIFI_WIFI_CONECTED_EN "Wi-Fi Connected" - -#define TEXT_BUTTON_DISCONECTED_EN "Disconnect" -#define TEXT_WIFI_FORGET_EN "Forget Network" -#define TEXT_DISCONECTED_EN "Wi-Fi Connected" - -//wifi-list -#define MAIN_BUILT_EN "Build" -#define MAIN_FILAMENT_EN "Filament" -#define MAIN_SETUP_EN "Setup" -#define MAIN_ABOUT_EN "About" -#define MAIN_MENU_EN "Menu" -#define FILE_MENU_BUILD_EN "Build" -#define FILE_MENU_MENU_EN " < Menu" - -//about -#define ABOUT_TITLE_EN "About" -#define ABOUT_BUILT_MACHINES_EN "Built Machines" -#define ABOUT_SPARK_EN "Spark" -#define ABOUT_VERSION_EN "Version 1.1.0" -#define ABOUT_SERIAL_NUMBER_EN "Serial Number:" -#define ABOUT_S_NUMBER_EN "DCPLX02KFC6P" - -//set -#define SETUP_TITLE_EN "Setup" -#define SETUP_WIFI_EN "Wi-Fi" -#define SETUP_MANUAL_IP_EN "Manual IP" -#define SETUP_WIFI_NOT_CONNECTED_EN "Not Connected" -#define SETUP_WIFI_NETWORK_EN "WiFi_Network" - -//build -#define BUILD_TITLE_EN "Build" -#define BUILD_SD_CARD_EN "SD Card" -#define BUILD_USB_DRIVE_EN "USB Drive" - -//SD card -#define SD_CARD_TITLE_EN "SD Card" -#define SD_CARD_BACK_EN "< Back" -//USB Drive -#define USB_DRIVE_TITLE_EN "USB Drive" -#define USB_DRIVE_BACK_EN "< Back" -#define FILE_PAGES_EN "%d/%d" -#define FILE_NEXT_PAGE_EN "Next Page" - -//BUILD PLATE -#define PLATE_TITLE_EN "Build Plate" -#define PLATE_BACK_EN "< Back" -#define PLATE_CONFIRM_EN "Confirm >" -#define PLATE_TIPS_EN "Confirm that there is a Clear\nBuild Plate installed in the\nmachine." - -//build model -#define MODEL_TITLE_EN "Build Model" -#define MODEL_START_BUILD_EN "Start Build" -#define MODEL_BACK_EN "< Back" - -//building -#define BUILDING_TITLE_EN "Building" -#define BUILDING_MENU_EN "Build Menu" -#define BUILDING_COMPLETED "Build\nComplete" - -//building menu -#define BUILDING_MENU_TITLE_EN "Build Menu" -#define BUILDING_MENU_SETTINGS_EN "Build Settings" -#define BUILDING_MENU_PAUSE_EN "Pause Build" -#define BUILDING_MENU_CANCEL_EN "Cancel Build" -#define BUILDING_MENU_BACK_EN "< Back" - -//build settings -#define SETTINGS_TITLE_EN "Build Settings" -#define SETTINGS_NOZZLE_TEMPER_EN "Nozzle Temp:" -#define SETTINGS_NOZZLE_VALUE_EN "%d" -#define SETTINGS_BED_TEMPER_EN "Bed Temp:" -#define SETTINGS_BED_VALUE_EN "%d" -#define SETTINGS_BUILD_SPEED_EN "Build Speed:" -#define SETTINGS_SPEED_VALUE_EN "Standard" -#define SETTINGS_BACK_EN "< Back" - -//build paused -#define PAUSED_TITLE_EN "Build Paused" -#define PAUSED_RESUME_EN "Resume Build" -#define PAUSED_CANCEL_EN "Cancel Build" -#define PAUSED_BACK_EN "< Back" - -//build cancel -#define CANCEL_TITLE_EN "Cancel Build" -#define CANCEL_BUILD_EN "Cancel Build" -#define CANCEL_TIPS_EN "Are you sure you want to\ncancel this build? The model\nwill be deleted from this\nmachine. It will need to be\nresent from your computer\nbefore it can be built in the\nfuture." -#define CANCEL_BACK_EN "< Back" -#define CANCEL_BUILD_DISPLAY_EN "Build\nCanceled" -#define CANCEL_OVER_PLATE_TIPS_EN "Confirm that the Build Plate\nhas been removed from the\nmachine." - -//filament model enter -#define FILAMENT_MODEL_ENTER_TITLE_EN "Model-PLA" -#define FILAMENT_MODEL_ENTER_BACK_EN "< Back" -#define FILAMENT_MODEL_ENTER_BEGIN_EN "Begin >" -#define FILAMENT_MODEL_ENTER_TIPS_EN "The Model Filament spool\ncompartment is located on\nthe right side of the machine." - -//filament model PLA -#define FILAMENT_MODEL_PLA_TITLE_EN "Model-PLA" -#define FILAMENT_PLA_LOAD_TITLE_EN "Load Filament" -#define FILAMENT_PLA_UNLOAD_TITLE_EN "Unload Filament" -#define FILAMENT_MODEL_PLA_LOAD_EN "Load Filament" -#define FILAMENT_MODEL_PLA_UNLOAD_EN "Unload Filament" -//filament support enter -#define FILAMENT_SUPPORT_ENTER_TITLE_EN "Support-PVA" -#define FILAMENT_SUPPORT_ENTER_BACK_EN "< Back" -#define FILAMENT_SUPPORT_ENTER_BEGIN_EN "Begin >" -#define FILAMENT_SUPPORT_ENTER_TIPS_EN "The Support Filament spool\ncompartment is located on\nthe left side of the machine." -//filament heating -#define FILAMENT_HEATING_LOAD_TITLE_EN "Load Filament" -#define FILAMENT_HEATING_UNLOAD_TITLE_EN "Unload Filament" -#define FILAMENT_HEATING_CANCEL_EN "< Cancel" -#define FILAMENT_HEATING_MATERIAL_EN "Material:" -#define FILAMENT_HEATING_PLA_EN "Model-PLA" -#define FILAMENT_HEATING_TIPS_EN "Print head is heating..." -//rotate left -#define ROTATE_LEFT_LOAD_TITLE_EN "Load Filament" -#define ROTATE_LEFT_UNLOAD_TITLE_EN "Unload Filament" -#define ROTATE_LEFT_CANCEL_EN "< Cancel" -#define ROTATE_LEFT_MATERIAL_EN "Material:" -#define ROTATE_LEFT_PLA_EN "Model-PLA" -#define ROTATE_LEFT_NEXT_EN "Next >" -#define ROTATE_LEFT_TIPS_EN "Rotate extruder selection\ndial to the left." - -//hang spool -#define HANG_SPOOL_TITLE_EN "Load Filament" -#define HANG_SPOOL_PREVIOUS_EN "< Previous" -#define HANG_SPOOL_MATERIAL_EN "Material:" -#define HANG_SPOOL_PLA_EN "Model-PLA" -#define HANG_SPOOL_NEXT_EN "Next >" -#define HANG_SPOOL_TIPS_EN "Hang the spool in the spool\ncompartment as shown." - -//feed filament -#define FEED_FILAMENT_TITLE_EN "Load Filament" -#define FEED_FILAMENT_PREVIOUS_EN "< Previous" -#define FEED_FILAMENT_MATERIAL_EN "Material:" -#define FEED_FILAMENT_PLA_EN "Model-PLA" -#define FEED_FILAMENT_NEXT_EN "Next >" -#define FEED_FILAMENT_TIPS_EN "Feed filament into extruder\nup beyond the gears." - -//feed filament -#define ROTATE_UP_TITLE_EN "Load Filament" -#define ROTATE_UP_PREVIOUS_EN "< Previous" -#define ROTATE_UP_MATERIAL_EN "Material:" -#define ROTATE_UP_PLA_EN "Model-PLA" -#define ROTATE_UP_NEXT_EN "Next >" -#define ROTATE_UP_TIPS_EN "Rotate extruder selection\ndial up." - -//filament begin -#define FEED_BEGIN_TITLE_EN "Load Filament" -#define FEED_BEGIN_MATERIAL_EN "Material:" -#define FEED_BEGIN_PLA_EN "Model-PLA" -#define FEED_BEGIN_NEXT_EN "Next >" -#define FEED_BEGIN_TIPS_EN "Press Next when filament\nbegins to extrude." - -//filament finish -#define FEED_FINISH_TITLE_EN "Load Filament" -#define FEED_FINISH_MATERIAL_EN "Material:" -#define FEED_FINISH_PLA_EN "Model-PLA" -#define FEED_FINISH_NEXT_EN "Finish >" -#define FEED_FINISH_TIPS_EN "Remove filament from the\nnozzle and discard." -//fiament remove -#define REMOVE_SPOOL_TITLE_EN "Unload Filament" -#define REMOVE_SPOOL_PREVIOUS_EN "< Previous" -#define REMOVE_SPOOL_FINISH_EN "Finish >" -#define REMOVE_SPOOL_MATERIAL_EN "Material:" -#define REMOVE_SPOOL_PLA_EN "Model-PLA" -#define REMOVE_SPOOL_TIPS_EN "Remove the spool and pull\nfilament out of the machine." - -#define FILAMENT_SUPPORT_PVA_EN "Support-PVA" -#define LOAD_FINISH_EN "Load\nFilament\nComplete" -#define UNLOAD_FINISH_EN "Unload\nFilament\nComplete" - -//manual ip -#define MANUAL_IP_TITLE_EN "Manual IP" -#define MANUAL_IP_CANCEL_EN "< Cancel" -#define MANUAL_IP_APPLY_EN "Join >" -#define MANUAL_IP_ADDRESS_EN "IP Address" -#define MANUAL_IP_MASK_EN "Subnet Mask" -#define MANUAL_IP_GATEWAY_EN "Default Gateway" -#define MANUAL_IP_SERVER_EN "Name Server" -#define MANUAL_IP_INIT_DATA_EN "0.0.0.0" -#define MANUAL_TEXT_POINT_EN "." -#define MANUAL_TEXT_ENTER_EN "enter" - -//Wifi name -//#define TEXT_WIFI_MENU_TITLE_EN "WI-FI" -//#define TEXT_WIFI_SAPCE_EN "space" -//#define TEXT_WIFI_LETTER_EN "abc" -//#define TEXT_WIFI_DIGITAL_EN "123" -//#define TEXT_WIFI_SYMBOL_EN "#+=" -//#define TEXT_WIFI_PASSWORD_EN "Password" - -//#define TEXT_WIFI_POINT_BOLD_EN "`" - -//#define TEXT_WIFI_JOINING_EN "Joining\nNetwork..." -//#define TEXT_WIFI_FAILED_JOIN_EN "Failed to\nJoin Wi-Fi" -//#define TEXT_WIFI_WIFI_CONECTED_EN "Wi-Fi\nConnected" - -//#define TEXT_BUTTON_DISCONECTED_EN "Disconnect" -//#define TEXT_WIFI_FORGET_EN "Forget Network" -//#define TEXT_DISCONECTED_EN "Wi-Fi Connected" - -#define TEXT_FORGET_TIPS_TITLE_EN "Forget Network" -#define TEXT_FORGET_NETWORK_TIPS1_EN "Are you sure you want to\nforget this network?" -#define TEXT_FORGET_NETWORK_TIPS2_EN "This machine will no longer\njoin this Wi-Fi Network." - -#define TEXT_IPADDRESS_EN "IP Address: " - -#define TEXT_BUILD_FROM_CURA_CANCEL_TIPS1_EN "Are you sure you want to\ncancel this build?" -#define TEXT_BUILD_FROM_CURA_CANCEL_TIPS2_EN "The model will be deleted\nfrom this machine.It will\nneed to be resent from your\ncomputer before it can be\nbuilt in the future." - -#define DIALOG_CONFIRM_EN2 "Confirm" - -#define HEATING_TITLE_EN "Heating" -#define LEVELING_TITLE_EN "Leveling" - -#define ABOUT_SPARK_ADD_EN "Spark+" - -#define TEXT_RECEIVING_DATA_EN "Receiving Data" - -#define TEXT_BABY_STEP_EN "Babystep" - -#define PRINTING_OTHER_LANGUGE "Printing" -#define PRINTING_OPERATION_OTHER_LANGUGE "Operation" -#define PRINTING_PAUSE_OTHER_LANGUGE "Pause" - -#define MESSAGE_PAUSING_EN "Parking..." -#define MESSAGE_CHANGING_EN "Wait for filament change to start" -#define MESSAGE_UNLOAD_EN "Wait for filament unload" -#define MESSAGE_WAITING_EN "Press Button to resume print" -#define MESSAGE_INSERT_EN "Insert filament and press button to continue" -#define MESSAGE_LOAD_EN "Wait for filament load" -#define MESSAGE_PURGE_EN "Wait for filament purge" -#define MESSAGE_RESUME_EN "Wait for print to resume..." -#define MESSAGE_HEAT_EN "Press button to heat nozzle" -#define MESSAGE_HEATING_EN "Nozzle heating Please wait..." -#define MESSAGE_OPTION_EN "Purge more or continue print?" -#define MESSAGE_PURGE_MORE_EN "Purge" -#define MESSAGE_CONTINUE_PRINT_EN "Print" -#define EEPROM_SETTINGS_TITLE_EN "EEPROM Settings" -#define EEPROM_SETTINGS_STORE_EN "Store settings to EEPROM" -#define EEPROM_SETTINGS_READ_EN "Read settings from EEPROM" -#define EEPROM_SETTINGS_REVERT_EN "Revert settings to factory defaults" - -#define EEPROM_STORE_TIPS_EN "Store settings to EEPROM?" -#define EEPROM_READ_TIPS_EN "Read settings from EEPROM?" -#define EEPROM_REVERT_TIPS_EN "Revert settings to factory defaults?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h deleted file mode 100644 index 6944d6b235..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ /dev/null @@ -1,281 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//*************法文****************************// -#define TOOL_TEXT_FR "prêt" -#define PREHEAT_TEXT_FR "Préchauffe" -#define MOVE_TEXT_FR "Déplace" -#define HOME_TEXT_FR "Acceuil" -#define PRINT_TEXT_FR "Impression" -#define EXTRUDE_TEXT_FR "Extruder" -#define LEVELING_TEXT_FR "Leveling" -#define AUTO_LEVELING_TEXT_FR "AutoLevel" -#define SET_TEXT_FR "Config" -#define MORE_TEXT_FR "Plus" - -#define ADD_TEXT_FR "Ajouter" -#define DEC_TEXT_FR "Réduire" -#define EXTRUDER_1_TEXT_FR "Extr1" -#define EXTRUDER_2_TEXT_FR "Extr2" -#define HEATBED_TEXT_FR "Hotlit" -#define TEXT_1C_FR "1℃" -#define TEXT_5C_FR "5℃" -#define TEXT_10C_FR "10℃" -#define CLOSE_TEXT_FR "Off" - -#define BACK_TEXT_FR "Arrière" - -#define TOOL_PREHEAT_FR "Préchauffe" -#define TOOL_EXTRUDE_FR "Extruder" -#define TOOL_MOVE_FR "Déplace" -#define TOOL_HOME_FR "Acceuil" -#define TOOL_LEVELING_FR "Leveling" -#define TOOL_AUTO_LEVELING_FR "AutoLevel" -#define TOOL_FILAMENT_FR "Filament" -#define TOOL_MORE_FR "Plus" - -#define AXIS_X_ADD_TEXT_FR "X+" -#define AXIS_X_DEC_TEXT_FR "X-" -#define AXIS_Y_ADD_TEXT_FR "Y+" -#define AXIS_Y_DEC_TEXT_FR "Y-" -#define AXIS_Z_ADD_TEXT_FR "Z+" -#define AXIS_Z_DEC_TEXT_FR "Z-" -#define TEXT_01MM_FR "0.1mm" -#define TEXT_1MM_FR "1mm" -#define TEXT_10MM_FR "10mm" - -#define HOME_X_TEXT_FR "X" -#define HOME_Y_TEXT_FR "Y" -#define HOME_Z_TEXT_FR "Z" -#define HOME_ALL_TEXT_FR "ALL" -#define HOME_STOPMOVE_FR "Quickstop" - -#define PAGE_UP_TEXT_FR "En haut" -#define PAGE_DOWN_TEXT_FR "En bas" - -#define EXTRUDER_IN_TEXT_FR "Insérer" -#define EXTRUDER_OUT_TEXT_FR "éjecter" -#define EXTRUDE_1MM_TEXT_FR "1mm" -#define EXTRUDE_5MM_TEXT_FR "5mm" -#define EXTRUDE_10MM_TEXT_FR "10mm" -#define EXTRUDE_LOW_SPEED_TEXT_FR "Lente" -#define EXTRUDE_MEDIUM_SPEED_TEXT_FR "Moyen" -#define EXTRUDE_HIGH_SPEED_TEXT_FR "Rapide" - -#define LEVELING_POINT1_TEXT_FR "Premier" -#define LEVELING_POINT2_TEXT_FR "Seconde" -#define LEVELING_POINT3_TEXT_FR "Troisième" -#define LEVELING_POINT4_TEXT_FR "Quatrième" -#define LEVELING_POINT5_TEXT_FR "Cinquième" - -#define FILESYS_TEXT_FR "Fichier" -#define WIFI_TEXT_FR "WiFi" -#define FAN_TEXT_FR "Fan" -#define ABOUT_TEXT_FR "A propos" -#define BREAK_POINT_TEXT_FR "Continuer" -#define FILAMENT_TEXT_FR "Remplacer" -#define LANGUAGE_TEXT_FR "Langue" -#define MOTOR_OFF_TEXT_FR "M-hors" -#define MOTOR_OFF_XY_TEXT_FR "M-hors-XY" -#define SHUTDOWN_TEXT_FR "Eteindre" -#define MACHINE_PARA_FR "Config" -#define EEPROM_SETTINGS_FR "Eeprom Set" - -#define U_DISK_TEXT_FR "Clé usb" -#define SD_CARD_TEXT_FR "Carte SD" -#define WIFI_NAME_TEXT_FR "WiFi: " -#define WIFI_KEY_TEXT_FR "Key: " -#define WIFI_IP_TEXT_FR "IP: " -#define WIFI_AP_TEXT_FR "Etat: AP" -#define WIFI_STA_TEXT_FR "Etat: STA" -#define WIFI_CONNECTED_TEXT_FR "Connecté" -#define WIFI_DISCONNECTED_TEXT_FR "Déconnecté" -#define WIFI_EXCEPTION_TEXT_FR "Exception" -#define WIFI_RECONNECT_TEXT_FR "Reconnect" -#define CLOUD_TEXT_FR "Cloud" -#define CLOUD_BIND_FR "Lié" -#define CLOUD_UNBIND_FR "Délier" -#define CLOUD_UNBINDING_FR "Délier" -#define CLOUD_DISCONNECTED_FR "Déconnecté" -#define CLOUD_UNBINDED_FR "Délier" -#define CLOUD_BINDED_FR "Lié" -#define CLOUD_DISABLE_FR "Désactiver" - -#define FAN_ADD_TEXT_FR "Ajouter" -#define FAN_DEC_TEXT_FR "Réduire" -#define FAN_OPEN_TEXT_FR "100%" -#define FAN_HALF_TEXT_FR "50%" -#define FAN_CLOSE_TEXT_FR "0%" -#define FAN_TIPS1_TEXT_FR "ventilateur" -#define FAN_TIPS2_TEXT_FR "ventilateur\n0" - -#define FILAMENT_IN_TEXT_FR "Insérer" -#define FILAMENT_OUT_TEXT_FR "éjecter" -#define FILAMENT_EXT0_TEXT_FR "Extr1" -#define FILAMENT_EXT1_TEXT_FR "Extr2" -#define FILAMENT_HEAT_TEXT_FR "Preheat" -#define FILAMENT_STOP_TEXT_FR "Arrêter" -//#define FILAMENT_CHANGE_TEXT_FR "Filament remplacer" -#define FILAMENT_TIPS2_TEXT_FR "T:" -#define FILAMENT_TIPS3_TEXT_FR "Insérer le filament..." -#define FILAMENT_TIPS4_TEXT_FR "éjecter le filament..." -#define FILAMENT_TIPS5_TEXT_FR "Température trop basse pour démarrer, chauffez svp" -#define FILAMENT_TIPS6_TEXT_FR "Terminé" - -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_FR "Please click or <éjecter> \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_FR "Please click or <éjecter>,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Heat completed,please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Heat completed,please click for start unloading.!" - #define FILAMENT_DIALOG_LOADING_TIPS_FR "Is loading ,please wait!" - #define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Is unloading,please wait!" - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Load filament completed,click for return!" - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Unload filament completed,click for return!" -#endif -#define FILAMENT_CHANGE_TEXT_FR "Please click \nor ,After \npinter pause." -#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..." -#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..." -#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Heat completed,please load filament \nto extruder,and click \nfor start loading." -#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Please load filament to extruder,\nand click for start loading." -#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_FR "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Is unloading,please wait!" -#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Load filament completed,\nclick for return!" -#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Unload filament completed,\nclick for return!" - - -#define PRE_HEAT_EXT_TEXT_FR "E" -#define PRE_HEAT_BED_TEXT_FR "Bed" - -#define FILE_LOADING_FR "Chargement......" -#if 0 - #define NO_FILE_AND_CHECK_FR "Aucun fichier trouvé! Insérez une carte SD ou un disque U!" -#else - #define NO_FILE_AND_CHECK_FR "Aucun fichier,vérifiez à nouveau!" -#endif - -#define NO_FILE_FR "Pas de fichier!" - - - -#define EXTRUDER_TEMP_TEXT_FR "Temper" -#define EXTRUDER_E_LENGTH1_TEXT_FR "Extruder1" -#define EXTRUDER_E_LENGTH2_TEXT_FR "Extruder2" -#define EXTRUDER_E_LENGTH3_TEXT_FR "Extruder3" - -#define ABOUT_TYPE_TEXT_FR "Type: " -#define ABOUT_VERSION_TEXT_FR "Firmware: " -#define ABOUT_WIFI_TEXT_FR "Wifi: " - -#define PRINTING_OPERATION_FR "Option" -#define PRINTING_PAUSE_FR "Pause" -#define PRINTING_TEMP_FR "Temp." -#define PRINTING_CHANGESPEED_FR "Speed" -#define PRINTING_RESUME_FR "Reprendre" -#define PRINTING_STOP_FR "Stop" -#define PRINTING_MORE_FR "Plus" -#define PRINTING_EXTRUDER_FR "Extruder" -#define PRINTING_MOVE_FR "Déplace" - -#define EXTRUDER_SPEED_FR "Extruder" -#define MOVE_SPEED_FR "Déplace" -#define EXTRUDER_SPEED_STATE_FR "Vitesse d'extrusion" -#define MOVE_SPEED_STATE_FR "vitesse de déplacement" -#define STEP_1PERCENT_FR "1%" -#define STEP_5PERCENT_FR "5%" -#define STEP_10PERCENT_FR "10%" - -#define TITLE_READYPRINT_FR "Prête" -#define TITLE_PREHEAT_FR "Préchauffe" -#define TITLE_MOVE_FR "Déplace" -#define TITLE_HOME_FR "Acceuil" -#define TITLE_EXTRUDE_FR "Extruder" -#define TITLE_LEVELING_FR "Leveling" -#define TITLE_SET_FR "Paramètres" -#define TITLE_MORE_FR "Plus" -#define TITLE_CHOOSEFILE_FR "Fichier" -#define TITLE_PRINTING_FR "Pimpression" -#define TITLE_OPERATION_FR "Option" -#define TITLE_ADJUST_FR "Réglage" -#define TITLE_WIRELESS_FR "Sans fil" -#define TITLE_FILAMENT_FR "Remplacer" -#define TITLE_ABOUT_FR "A propos" -#define TITLE_FAN_FR "Ventilateur" -#define TITLE_LANGUAGE_FR "Langue" -#define TITLE_PAUSE_FR "Pause" -#define TITLE_CHANGESPEED_FR "Speed" -#define TITLE_CLOUD_TEXT_FR "Cloud" -#define TITLE_DIALOG_CONFIRM_FR "Confirm" -#define TITLE_FILESYS_FR "FileSys" - -#define DIALOG_CLOSE_MACHINE_FR "Closing machine......" - -#define AUTO_SHUTDOWN_FR "Auto" -#define MANUAL_SHUTDOWN_FR "Manuel" - -#define DIALOG_CONFIRM_FR "Confirmer" -#define DIALOG_CANCLE_FR "Annuler" -#define DIALOG_OK_FR "OK" -#define DIALOG_RESET_FR "Réinitialiser" -#define DIALOG_RETRY_FR "Recommencez" -#define DIALOG_DISABLE_FR "Disable" -#define DIALOG_PRINT_MODEL_FR "Imprimer le fichier?" -#define DIALOG_CANCEL_PRINT_FR "Arrêter?" - -#define DIALOG_STOP_FR "Arrêter" -#define DIALOG_REPRINT_FROM_BREAKPOINT_FR "Continuer?" -//#define DIALOG_UNBIND_PRINTER_FR "Non lié?" -#define DIALOG_ERROR_TIPS1_FR "Erreur:error:Aucun fichier, \nvérifiez à nouveau." -#define DIALOG_ERROR_TIPS2_FR "Erreur:La opération a échoué. \nVerifiez que le baudrate de l'écran et de \nla carte mère soient identique!" -#define DIALOG_ERROR_TIPS3_FR "Erreur: le nom du fichier ou le \nchemin d'accès est trop long." -#define DIALOG_UNBIND_PRINTER_FR "Unbind the printer?" -#define DIALOG_FILAMENT_NO_PRESS_FR "Filament detection switch is not pressed" -#define DIALOG_PRINT_FINISH_FR "L'impression est terminée!" -#define DIALOG_PRINT_TIME_FR "Temps d'impression: " -#define DIALOG_REPRINT_FR "Print again" -#define DIALOG_WIFI_ENABLE_TIPS_FR "The wifi module is being configured,\nplease wait a moment....." - -#define MESSAGE_PAUSING_FR "Parking..." -#define MESSAGE_CHANGING_FR "Attente filament pour démarrer" -#define MESSAGE_UNLOAD_FR "Attente retrait du filament" -#define MESSAGE_WAITING_FR "Presser bouton,pour reprendre" -#define MESSAGE_INSERT_FR "Insérer filament et app. bouton pour continuer..." -#define MESSAGE_LOAD_FR "Attente chargement filament" -#define MESSAGE_PURGE_FR "Attente Purge filament" -#define MESSAGE_RESUME_FR "Attente reprise impression" -#define MESSAGE_HEAT_FR "Presser le bouton pour chauffer..." -#define MESSAGE_HEATING_FR "Buse en chauffe Patienter SVP..." -#define MESSAGE_OPTION_FR "Purger davantage ou continuer l'impression?" -#define MESSAGE_PURGE_MORE_FR "Purge" -#define MESSAGE_CONTINUE_PRINT_FR "Impression" -#define EEPROM_SETTINGS_TITLE_FR "Paramètres EEPROM" -#define EEPROM_SETTINGS_STORE_FR "Stocker les paramètres dans l'EEPROM" -#define EEPROM_SETTINGS_READ_FR "Lire les paramètres de l'EEPROM" -#define EEPROM_SETTINGS_REVERT_FR "Rétablir les paramètres par défaut d'usine" - -#define EEPROM_STORE_TIPS_FR "Stocker les paramètres dans l'EEPROM?" -#define EEPROM_READ_TIPS_FR "Lire les paramètres de l'EEPROM?" -#define EEPROM_REVERT_TIPS_FR "Rétablir les paramètres par défaut d'usine?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h deleted file mode 100644 index f64ca4df79..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ /dev/null @@ -1,276 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//****************意大利语***************************// -#define TOOL_TEXT_IT "Strumento" -#define PREHEAT_TEXT_IT "Prerisc" -#define MOVE_TEXT_IT "Muovi" -#define HOME_TEXT_IT "Home" -#define PRINT_TEXT_IT "Stampa" -#define EXTRUDE_TEXT_IT "Estrude" -#define LEVELING_TEXT_IT "Leveling" -#define AUTO_LEVELING_TEXT_IT "AutoLevel" -#define SET_TEXT_IT "Imposta" -#define MORE_TEXT_IT "Di più" - -#define ADD_TEXT_IT "Aumentare" -#define DEC_TEXT_IT "Ridurre" -#define EXTRUDER_1_TEXT_IT "Estrude1" -#define EXTRUDER_2_TEXT_IT "Estrude2" -#define HEATBED_TEXT_IT "Piano" -#define TEXT_1C_IT "1℃" -#define TEXT_5C_IT "5℃" -#define TEXT_10C_IT "10℃" -#define CLOSE_TEXT_IT "Spento" - -#define BACK_TEXT_IT "Indietro" - -#define TOOL_PREHEAT_IT "Prerisc" -#define TOOL_EXTRUDE_IT "Estrude" -#define TOOL_MOVE_IT "Muovi" -#define TOOL_HOME_IT "Home" -#define TOOL_LEVELING_IT "Leveling" -#define TOOL_AUTO_LEVELING_IT "Autolevel" -#define TOOL_FILAMENT_IT "Filamento" -#define TOOL_MORE_IT "Di più" - -#define AXIS_X_ADD_TEXT_IT "X+" -#define AXIS_X_DEC_TEXT_IT "X-" -#define AXIS_Y_ADD_TEXT_IT "Y+" -#define AXIS_Y_DEC_TEXT_IT "Y-" -#define AXIS_Z_ADD_TEXT_IT "Z+" -#define AXIS_Z_DEC_TEXT_IT "Z-" -#define TEXT_01MM_IT "0.1mm" -#define TEXT_1MM_IT "1mm" -#define TEXT_10MM_IT "10mm" - -#define HOME_X_TEXT_IT "X" -#define HOME_Y_TEXT_IT "Y" -#define HOME_Z_TEXT_IT "Z" -#define HOME_ALL_TEXT_IT "All" -#define HOME_STOPMOVE_IT "Quickstop" - -#define PAGE_UP_TEXT_IT "Pagina su" -#define PAGE_DOWN_TEXT_IT "Pagina giù" - -#define EXTRUDER_IN_TEXT_IT "Estru" -#define EXTRUDER_OUT_TEXT_IT "Ritra" -#define EXTRUDE_1MM_TEXT_IT "1mm" -#define EXTRUDE_5MM_TEXT_IT "5mm" -#define EXTRUDE_10MM_TEXT_IT "10mm" -#define EXTRUDE_LOW_SPEED_TEXT_IT "Bassa" -#define EXTRUDE_MEDIUM_SPEED_TEXT_IT "Media" -#define EXTRUDE_HIGH_SPEED_TEXT_IT "Alta" - -#define LEVELING_POINT1_TEXT_IT "Primo" -#define LEVELING_POINT2_TEXT_IT "Secondo" -#define LEVELING_POINT3_TEXT_IT "Terzo" -#define LEVELING_POINT4_TEXT_IT "Quarto" -#define LEVELING_POINT5_TEXT_IT "Quinto" - -#define FILESYS_TEXT_IT "FileSys" -#define WIFI_TEXT_IT "WIFI" -#define FAN_TEXT_IT "Ventola" -#define ABOUT_TEXT_IT "Circa" -#define BREAK_POINT_TEXT_IT "Continua" -#define FILAMENT_TEXT_IT "Filamento" -#define LANGUAGE_TEXT_IT "Lingua" -#define MOTOR_OFF_TEXT_IT "Motor off" -#define MOTOR_OFF_XY_TEXT_IT "Off-XY" -#define SHUTDOWN_TEXT_IT "Spento" -#define MACHINE_PARA_IT "Config" -#define EEPROM_SETTINGS_IT "Eeprom Set" - -#define U_DISK_TEXT_IT "USB" -#define SD_CARD_TEXT_IT "SD" -#define WIFI_NAME_TEXT_IT "WIFI: " -#define WIFI_KEY_TEXT_IT "KEY: " -#define WIFI_IP_TEXT_IT "IP: " -#define WIFI_AP_TEXT_IT "Stato: AP" -#define WIFI_STA_TEXT_IT "Stato: STA" -#define WIFI_CONNECTED_TEXT_IT "Connesso" -#define WIFI_DISCONNECTED_TEXT_IT "Disconnesso" -#define WIFI_EXCEPTION_TEXT_IT "Eccezione" -#define WIFI_RECONNECT_TEXT_IT "Reconnect" -#define CLOUD_TEXT_IT "Cloud" -#define CLOUD_BIND_IT "Legato" -#define CLOUD_UNBIND_IT "Libero" -#define CLOUD_DISCONNECTED_IT "Disconnesso" -#define CLOUD_UNBINDING_IT "Libero" -#define CLOUD_UNBINDED_IT "Sciolto" -#define CLOUD_BINDED_IT "Legato" -#define CLOUD_DISABLE_IT "Disable" - -#define FAN_ADD_TEXT_IT "Aumentare" -#define FAN_DEC_TEXT_IT "Ridurre" -#define FAN_OPEN_TEXT_IT "100%" -#define FAN_HALF_TEXT_IT "50%" -#define FAN_CLOSE_TEXT_IT "Spento" -#define FAN_TIPS1_TEXT_IT "Ventola" -#define FAN_TIPS2_TEXT_IT "Ventola\n0" - -#define FILAMENT_IN_TEXT_IT "Inser" -#define FILAMENT_OUT_TEXT_IT "Estra" -#define FILAMENT_EXT0_TEXT_IT "Estrude1" -#define FILAMENT_EXT1_TEXT_IT "Estrude2" -#define FILAMENT_HEAT_TEXT_IT "Preriscaldamento" -#define FILAMENT_STOP_TEXT_IT "Stop" -//#define FILAMENT_CHANGE_TEXT_IT "Filamento" -#define FILAMENT_TIPS2_TEXT_IT "T:" -#define FILAMENT_TIPS3_TEXT_IT "Inserimento del filamento..." -#define FILAMENT_TIPS4_TEXT_IT "Estrazione del filamento..." -#define FILAMENT_TIPS5_TEXT_IT "Temp is too low to go,please heat" -#define FILAMENT_TIPS6_TEXT_IT "Completato" - -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_IT "Please click or \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_IT "Please click or ,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,and click for start loading." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please click for start unloading.!" - #define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!" - #define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!" - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,click for return!" - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,click for return!" -#endif -#define FILAMENT_CHANGE_TEXT_IT "Please click \nor ,After \npinter pause." -#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." -#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..." -#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament \nto extruder,and click \nfor start loading." -#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,\nand click for start loading." -#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!" -#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,\nclick for return!" -#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,\nclick for return!" - - -#define PRE_HEAT_EXT_TEXT_IT "E" -#define PRE_HEAT_BED_TEXT_IT "Piano" - -#define FILE_LOADING_IT "Caricamento......" -#if 0 - #define NO_FILE_AND_CHECK_IT "Nessun file trovato! Inserisci la scheda SD o il disco U!" -#endif -#define NO_FILE_AND_CHECK_IT "Nessun file,\n per favore controllare di nuovo!" - -#define NO_FILE_IT "Nessun file!" - -#define EXTRUDER_TEMP_TEXT_IT "Temper" -#define EXTRUDER_E_LENGTH1_TEXT_IT "Estrude1" -#define EXTRUDER_E_LENGTH2_TEXT_IT "Estrude2" -#define EXTRUDER_E_LENGTH3_TEXT_IT "Estrude3" - -#define ABOUT_TYPE_TEXT_IT "Type: " -#define ABOUT_VERSION_TEXT_IT "Firmware: " -#define ABOUT_WIFI_TEXT_IT "WiFi: " - -#define PRINTING_OPERATION_IT "Opzioni" -#define PRINTING_PAUSE_IT "Pause" -#define PRINTING_TEMP_IT "Temp." -#define PRINTING_CHANGESPEED_IT "Velocità" -#define PRINTING_RESUME_IT "Recupero" -#define PRINTING_STOP_IT "Stop" -#define PRINTING_MORE_IT "Di più" -#define PRINTING_EXTRUDER_IT "Estrude" -#define PRINTING_MOVE_IT "Muovi" - -#define EXTRUDER_SPEED_IT "Estrude" -#define MOVE_SPEED_IT "Muovi" -#define EXTRUDER_SPEED_STATE_IT "Estrusione" -#define MOVE_SPEED_STATE_IT "Movimento" -#define STEP_1PERCENT_IT "1%" -#define STEP_5PERCENT_IT "5%" -#define STEP_10PERCENT_IT "10%" - -#define TITLE_READYPRINT_IT "Pronto" -#define TITLE_PREHEAT_IT "Preris" -#define TITLE_MOVE_IT "Muovi" -#define TITLE_HOME_IT "Home" -#define TITLE_EXTRUDE_IT "Estrude" -#define TITLE_LEVELING_IT "Livella" -#define TITLE_SET_IT "Impostare" -#define TITLE_MORE_IT "Di più" -#define TITLE_CHOOSEFILE_IT "File" -#define TITLE_PRINTING_IT "Stampa" -#define TITLE_OPERATION_IT "Opzioni" -#define TITLE_ADJUST_IT "Regolare" -#define TITLE_WIRELESS_IT "Wireless" -#define TITLE_FILAMENT_IT "Filamento" -#define TITLE_ABOUT_IT "Circa" -#define TITLE_FAN_IT "Ventola" -#define TITLE_LANGUAGE_IT "Lingua" -#define TITLE_PAUSE_IT "Pausa" -#define TITLE_CHANGESPEED_IT "Velocità" -#define TITLE_CLOUD_TEXT_IT "Cloud" -#define TITLE_DIALOG_CONFIRM_IT "Confirm" -#define TITLE_FILESYS_IT "FileSys" - -#define AUTO_SHUTDOWN_IT "Auto" -#define MANUAL_SHUTDOWN_IT "Manuale" - -#define DIALOG_CONFIRM_IT "Conferma" -#define DIALOG_CANCLE_IT "Cancella" -#define DIALOG_OK_IT "OK" -#define DIALOG_RESET_IT "Resettare" -#define DIALOG_RETRY_IT "Riprovare" -#define DIALOG_DISABLE_IT "Disable" -#define DIALOG_PRINT_MODEL_IT "Gcode stampa?" -#define DIALOG_CANCEL_PRINT_IT "Stop stampa?" -#define DIALOG_STOP_IT "Stop" -#define DIALOG_REPRINT_FROM_BREAKPOINT_IT "Continua a stampare dal \npunto di interruzione?" -//#define DIALOG_UNBIND_PRINTER_IT "Libero?" -#define DIALOG_ERROR_TIPS1_IT "Errore: nessun file, \nper favore controllare di nuovo." -#define DIALOG_ERROR_TIPS2_IT "Errore: operazione non riuscita, \nsi prega di controllare se il baudrate del \ndisplay è lo stesso scheda madre" -#define DIALOG_ERROR_TIPS3_IT "Errore: il nome del file o il \npercorso è troppo lungo!" -#define DIALOG_CLOSE_MACHINE_IT "Closing machine......" -#define DIALOG_UNBIND_PRINTER_IT "Unbind the printer?" -#define DIALOG_FILAMENT_NO_PRESS_IT "Filament detection switch is not pressed" -#define DIALOG_PRINT_FINISH_IT "La stampa è completa!" -#define DIALOG_PRINT_TIME_IT "Tempo di stampa: " -#define DIALOG_REPRINT_IT "Print again" -#define DIALOG_WIFI_ENABLE_TIPS_IT "The wifi module is being configured,\nplease wait a moment....." - -#define MESSAGE_PAUSING_IT "Parcheggiando..." -#define MESSAGE_CHANGING_IT "Attendere avvio del cambio di filamento" -#define MESSAGE_UNLOAD_IT "Attendere l'espulsione del filamento" -#define MESSAGE_WAITING_IT "Premi per riprendere la stampa" -#define MESSAGE_INSERT_IT "Inserisci il filamento e premi per continuare" -#define MESSAGE_LOAD_IT "Attendere il caricamento del filamento" -#define MESSAGE_PURGE_IT "Attendere lo spurgo del filamento" -#define MESSAGE_RESUME_IT "Attendere la ripresa della stampa..." -#define MESSAGE_HEAT_IT "Premi per riscaldare ugello" -#define MESSAGE_HEATING_IT "Riscaldam. ugello Attendere prego..." -#define MESSAGE_OPTION_IT "Eliminare di più o continuare a stampare?" -#define MESSAGE_PURGE_MORE_IT "Epurazione" -#define MESSAGE_CONTINUE_PRINT_IT "Stampa" -#define EEPROM_SETTINGS_TITLE_IT "Impostazioni EEPROM" -#define EEPROM_SETTINGS_STORE_IT "Memorizzare le impostazioni su EEPROM" -#define EEPROM_SETTINGS_READ_IT "Leggi le impostazioni dalla EEPROM" -#define EEPROM_SETTINGS_REVERT_IT "Ripristina le impostazioni predefinite di fabbrica" - -#define EEPROM_STORE_TIPS_IT "Memorizzare le impostazioni su EEPROM?" -#define EEPROM_READ_TIPS_IT "Leggi le impostazioni dalla EEPROM?" -#define EEPROM_REVERT_TIPS_IT "Ripristinare le impostazioni predefinite?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h deleted file mode 100644 index 9f695b376b..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ /dev/null @@ -1,277 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//****************俄语***************************// -#define TOOL_TEXT_RU "инструмент" -#define PREHEAT_TEXT_RU " нагрев" -#define MOVE_TEXT_RU "движение" -#define HOME_TEXT_RU "домой" -#define PRINT_TEXT_RU " печать" -#define EXTRUDE_TEXT_RU "экструзия" -#define LEVELING_TEXT_RU "уровень" -#define AUTO_LEVELING_TEXT_RU "aвто" -#define SET_TEXT_RU "настройки" -#define MORE_TEXT_RU "больше" - -#define ADD_TEXT_RU "добавить" -#define DEC_TEXT_RU "уменьшить" -#define EXTRUDER_1_TEXT_RU "экструдер1" -#define EXTRUDER_2_TEXT_RU "экструдер2" -#define HEATBED_TEXT_RU "стол" -#define TEXT_1C_RU "1℃" -#define TEXT_5C_RU "5℃" -#define TEXT_10C_RU "10℃" -#define CLOSE_TEXT_RU "выкл" - -#define BACK_TEXT_RU "назад" - -#define TOOL_PREHEAT_RU "нагрев" -#define TOOL_EXTRUDE_RU "экструзия" -#define TOOL_MOVE_RU "движение" -#define TOOL_HOME_RU "домой" -#define TOOL_LEVELING_RU "уровень" -#define TOOL_AUTO_LEVELING_RU "aвто" -#define TOOL_FILAMENT_RU "замена" -#define TOOL_MORE_RU "больше" - -#define AXIS_X_ADD_TEXT_RU "X+" -#define AXIS_X_DEC_TEXT_RU "X-" -#define AXIS_Y_ADD_TEXT_RU "Y+" -#define AXIS_Y_DEC_TEXT_RU "Y-" -#define AXIS_Z_ADD_TEXT_RU "Z+" -#define AXIS_Z_DEC_TEXT_RU "Z-" -#define TEXT_01MM_RU "0.1mm" -#define TEXT_1MM_RU "1mm" -#define TEXT_10MM_RU "10mm" - -#define HOME_X_TEXT_RU "X" -#define HOME_Y_TEXT_RU "Y" -#define HOME_Z_TEXT_RU "Z" -#define HOME_ALL_TEXT_RU "Home" -#define HOME_STOPMOVE_RU "Quickstop" - -#define PAGE_UP_TEXT_RU "вверх" -#define PAGE_DOWN_TEXT_RU "вниз" - -#define EXTRUDER_IN_TEXT_RU "втянуть" -#define EXTRUDER_OUT_TEXT_RU "выдавить" -#define EXTRUDE_1MM_TEXT_RU "1mm" -#define EXTRUDE_5MM_TEXT_RU "5mm" -#define EXTRUDE_10MM_TEXT_RU "10mm" -#define EXTRUDE_LOW_SPEED_TEXT_RU "мин" -#define EXTRUDE_MEDIUM_SPEED_TEXT_RU "сред" -#define EXTRUDE_HIGH_SPEED_TEXT_RU "выс" - -#define LEVELING_POINT1_TEXT_RU "1точка" -#define LEVELING_POINT2_TEXT_RU "2точка" -#define LEVELING_POINT3_TEXT_RU "3точка" -#define LEVELING_POINT4_TEXT_RU "4точка" -#define LEVELING_POINT5_TEXT_RU "5точка" - -#define FILESYS_TEXT_RU "система" -#define WIFI_TEXT_RU "WiFi" -#define FAN_TEXT_RU "вентилятор" -#define ABOUT_TEXT_RU "инфо" -#define BREAK_POINT_TEXT_RU "продолжить" -#define FILAMENT_TEXT_RU "замена" -#define LANGUAGE_TEXT_RU "язык" -#define MOTOR_OFF_TEXT_RU "отклмотор" -#define MOTOR_OFF_XY_TEXT_RU "Off-XY" -#define SHUTDOWN_TEXT_RU "выключение" -#define MACHINE_PARA_RU "конфиг" -#define EEPROM_SETTINGS_RU "Eeprom Set" - -#define U_DISK_TEXT_RU "U диск" -#define SD_CARD_TEXT_RU "SD диск" -#define WIFI_NAME_TEXT_RU "WiFi: " -#define WIFI_KEY_TEXT_RU "пароль: " -#define WIFI_IP_TEXT_RU "IP: " -#define WIFI_AP_TEXT_RU "режим: AP" -#define WIFI_STA_TEXT_RU "режим: STA" -#define WIFI_CONNECTED_TEXT_RU "подключен" -#define WIFI_DISCONNECTED_TEXT_RU "не подключен" -#define WIFI_EXCEPTION_TEXT_RU "исключение" -#define WIFI_RECONNECT_TEXT_RU "Reconnect" -#define CLOUD_TEXT_RU "облако" -#define CLOUD_BIND_RU "соединён" -#define CLOUD_UNBIND_RU "не соединён" -#define CLOUD_UNBINDING_RU "Unbinding" -#define CLOUD_DISCONNECTED_RU "Disconnected" -#define CLOUD_UNBINDED_RU "Unbinded" -#define CLOUD_BINDED_RU "Binded" -#define CLOUD_DISABLE_RU "Disable" - -#define FAN_ADD_TEXT_RU "добавить" -#define FAN_DEC_TEXT_RU "уменьшить" -#define FAN_OPEN_TEXT_RU "100%" -#define FAN_HALF_TEXT_RU "50%" -#define FAN_CLOSE_TEXT_RU "откл" -#define FAN_TIPS1_TEXT_RU "вентилятор" -#define FAN_TIPS2_TEXT_RU "вентилятор\nоткл" - -#define FILAMENT_IN_TEXT_RU "втянуть" -#define FILAMENT_OUT_TEXT_RU "выдавить" -#define FILAMENT_EXT0_TEXT_RU "экструдер1" -#define FILAMENT_EXT1_TEXT_RU "экструдер2" -#define FILAMENT_HEAT_TEXT_RU "нагрев" -#define FILAMENT_STOP_TEXT_RU "стоп" -//#define FILAMENT_CHANGE_TEXT_RU "замена" -#define FILAMENT_TIPS2_TEXT_RU "T:" -#define FILAMENT_TIPS3_TEXT_RU "втянуть..." -#define FILAMENT_TIPS4_TEXT_RU "вядавить..." -#define FILAMENT_TIPS5_TEXT_RU "Низкая температура, \nнеобходим нагрев" -#define FILAMENT_TIPS6_TEXT_RU "завершено" - -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_RU "Please click <втянуть> or <выдавить> \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_RU "Please click <втянуть> or <выдавить>,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU "Heating up the nozzle,please wait..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU "Heat completed,please load filament to extruder,and click <да> for start loading." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_RU "Please load filament to extruder,and click <да> for start loading." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU "Heat completed,please click <да> for start unloading.!" - #define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading ,please wait!" - #define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading,please wait!" - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,click <да> for return!" - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,click <да> for return!" -#endif -#define FILAMENT_CHANGE_TEXT_RU "Please click \nor ,After \npinter pause." -#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU "Heating up the nozzle,\nplease wait..." -#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU "Heating up the nozzle,\nplease wait..." -#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU "Heat completed,please load filament \nto extruder,and click \nfor start loading." -#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_RU "Please load filament to extruder,\nand click for start loading." -#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU "Heat completed,please \nclick for start unloading.!" -#define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading ,please wait!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading,please wait!" -#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,\nclick for return!" -#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,\nclick for return!" - - -#define PRE_HEAT_EXT_TEXT_RU "E" -#define PRE_HEAT_BED_TEXT_RU "стол" - -#define FILE_LOADING_RU "загрузка......" -#if 0 - #define NO_FILE_AND_CHECK_RU "Файлы не найдены! Вставьте SD-карту или диск U!" -#endif -#define NO_FILE_AND_CHECK_RU "нет файла,попробуйте ещё раз!" - -#define NO_FILE_RU "нет файла!" - -#define EXTRUDER_TEMP_TEXT_RU "температура" -#define EXTRUDER_E_LENGTH1_TEXT_RU "экструзия1" -#define EXTRUDER_E_LENGTH2_TEXT_RU "экструзия2" -#define EXTRUDER_E_LENGTH3_TEXT_RU "экструзия3" - -#define ABOUT_TYPE_TEXT_RU "Type: " -#define ABOUT_VERSION_TEXT_RU "Firmware: " -#define ABOUT_WIFI_TEXT_RU "WiFi: " - -#define PRINTING_OPERATION_RU "управление" -#define PRINTING_PAUSE_RU "пауза" -#define PRINTING_TEMP_RU "темп" -#define PRINTING_CHANGESPEED_RU "скорости" -#define PRINTING_RESUME_RU "возобновить" -#define PRINTING_STOP_RU "стоп" -#define PRINTING_MORE_RU "больше" -#define PRINTING_EXTRUDER_RU "экстр" -#define PRINTING_MOVE_RU "движение" - -#define EXTRUDER_SPEED_RU "экстр" -#define MOVE_SPEED_RU "движ" -#define EXTRUDER_SPEED_STATE_RU "скорость экстр" -#define MOVE_SPEED_STATE_RU "скорость движ" -#define STEP_1PERCENT_RU "1%" -#define STEP_5PERCENT_RU "5%" -#define STEP_10PERCENT_RU "10%" - -#define TITLE_READYPRINT_RU "готов к" -#define TITLE_PREHEAT_RU "движение" -#define TITLE_MOVE_RU "движение" -#define TITLE_HOME_RU "Home" -#define TITLE_EXTRUDE_RU "экструзия" -#define TITLE_LEVELING_RU "уровень" -#define TITLE_SET_RU "настройки" -#define TITLE_MORE_RU "больше" -#define TITLE_CHOOSEFILE_RU "файла" -#define TITLE_PRINTING_RU "печать" -#define TITLE_OPERATION_RU "управление" -#define TITLE_ADJUST_RU "регулировать" -#define TITLE_WIRELESS_RU "Wireless" -#define TITLE_FILAMENT_RU "замена" -#define TITLE_ABOUT_RU "инфо" -#define TITLE_FAN_RU "вентилятор" -#define TITLE_LANGUAGE_RU "язык" -#define TITLE_PAUSE_RU "пауза" -#define TITLE_CHANGESPEED_RU "скорости" -#define TILE_TOOL_RU "инструмент" -#define TITLE_CLOUD_TEXT_RU "Cloud" -#define TITLE_DIALOG_CONFIRM_RU "Confirm" -#define TITLE_FILESYS_RU "FileSys" - -#define AUTO_SHUTDOWN_RU "авто-откл" -#define MANUAL_SHUTDOWN_RU "ручн-откл" - -#define DIALOG_CONFIRM_RU "да"//"подтвердить" -#define DIALOG_CANCLE_RU "отмена" -#define DIALOG_OK_RU "да" -#define DIALOG_RESET_RU "сброс" -#define DIALOG_RETRY_RU "повтор" -#define DIALOG_DISABLE_RU "запретить" -#define DIALOG_PRINT_MODEL_RU "печать модели?" -#define DIALOG_CANCEL_PRINT_RU "стоп?" -#define DIALOG_STOP_RU "стоп" -#define DIALOG_REPRINT_FROM_BREAKPOINT_RU "продолжить?" -//#define DIALOG_UNBIND_PRINTER_RU "разрыв?" -#define DIALOG_ERROR_TIPS1_RU "ошибка:нет файла, попробуйте ещё раз." -#define DIALOG_ERROR_TIPS2_RU "ошибка:сбой передачи. установите скорость \nпередачи данных как на плате управления!" -#define DIALOG_ERROR_TIPS3_RU "ошибка: имя файла слишком длинное!" -#define DIALOG_CLOSE_MACHINE_RU "Closing machine......" -#define DIALOG_UNBIND_PRINTER_RU "Unbind the printer?" -#define DIALOG_FILAMENT_NO_PRESS_RU "Filament detection switch is not pressed" -#define DIALOG_PRINT_FINISH_RU "Печать завершена!" -#define DIALOG_PRINT_TIME_RU "Время печати: " -#define DIALOG_REPRINT_RU "Print again" -#define DIALOG_WIFI_ENABLE_TIPS_RU "The wifi module is being configured,\nplease wait a moment....." - -#define MESSAGE_PAUSING_RU "Стоянка..." -#define MESSAGE_CHANGING_RU "Подождите, пока начнется смена филамента" -#define MESSAGE_UNLOAD_RU "Дождитесь выгрузки нити" -#define MESSAGE_WAITING_RU "Нажмите кнопку,чтобы возобновить печать" -#define MESSAGE_INSERT_RU "Вставьте нить и нажмите кнопку,чтобы продолжить" -#define MESSAGE_LOAD_RU "Дождитесь загрузки нити" -#define MESSAGE_PURGE_RU "Дождитесь чистки нити" -#define MESSAGE_RESUME_RU "Подождите,пока печать возобновится ..." -#define MESSAGE_HEAT_RU "Нажмите кнопку, чтобы нагреть форсунку" -#define MESSAGE_HEATING_RU "Подогрев форсунки Пожалуйста, подождите ..." -#define MESSAGE_OPTION_RU "Очистить больше или продолжить печать?" -#define MESSAGE_PURGE_MORE_RU "чистка" -#define MESSAGE_CONTINUE_PRINT_RU "Распечатать" -#define EEPROM_SETTINGS_TITLE_RU "Настройки EEPROM" -#define EEPROM_SETTINGS_STORE_RU "Сохранение настроек в EEPROM" -#define EEPROM_SETTINGS_READ_RU "Чтение настроек из EEPROM" -#define EEPROM_SETTINGS_REVERT_RU "Восстановить заводские настройки по умолчанию" - -#define EEPROM_STORE_TIPS_RU "Сохранить настройки в EEPROM?" -#define EEPROM_READ_TIPS_RU "Читать настройки из EEPROM?" -#define EEPROM_REVERT_TIPS_RU "Revert settings to factory defaults?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h deleted file mode 100644 index 1189927770..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ /dev/null @@ -1,499 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//*************简体中文***********************// -#define NEXT_CN "下一页" -#define PREVIOUS_CN "上一页" -#define DEFAULT_CN "默认值" -#define KEY_BACK_CN "退格" -#define KEY_REST_CN "重置" -#define KEY_CONFIRM_CN "确定" - -#define MACHINE_PARA_TITLE_CN "机器参数" -#define MACHINE_TYPE_CNOFIG_CN "机器设置" -#define MOTOR_CONFIG_CN "电机设置" -#define MACHINE_LEVELING_CONFIG_CN "调平设置" -#define ADVANCE_CONFIG_CN "高级设置" - -#define MACHINE_CONFIG_TITLE_CN "机器参数>机器配置" -#define MACHINE_TYPE_CN "机型选择" -#define MACHINE_STROKE_CN "行程设置" -#define MACHINE_HOMEDIR_CN "归零方向" -#define MACHINE_ENDSTOP_TYPE_CN "限位开关类型" -#define MACHINE_FILAMENT_CONFIG_CN "换料设置" - -#define MACHINE_TYPE_CONFIG_TITLE_CN "机器参数>机型选择" -#define MACHINE_TYPE_XYZ_CN "XYZ机型" -#define MACHINE_TYPE_DELTA_CN "Delta机型" -#define MACHINE_TYPE_COREXY_CN "Corexy机型" - -#define MACHINE_STROKE_CONF_TITLE_CN "机器参数>机器行程" -#define X_MAX_LENGTH_CN "X轴最大行程" -#define Y_MAX_LENGTH_CN "Y轴最大行程" -#define Z_MAX_LENGTH_CN "Z轴最大行程" - -#define X_MIN_LENGTH_CN "X轴最小行程" -#define Y_MIN_LENGTH_CN "Y轴最小行程" -#define Z_MIN_LENGTH_CN "Z轴最小行程" - -#define HOME_DIR_CONF_TITLE_CN "机器参数>归零方向" -#define HOME_DIR_X_CN "X轴归零方向" -#define HOME_DIR_Y_CN "Y轴归零方向" -#define HOME_DIR_Z_CN "Z轴归零方向" -#define HOME_MIN_CN "MIN" -#define HOME_MAX_CN "MAX" - -#define ENDSTOP_CONF_TITLE_CN "机器参数>限位开关" -#define MIN_ENDSTOP_X_CN "X轴最小限位" -#define MIN_ENDSTOP_Y_CN "Y轴最小限位" -#define MIN_ENDSTOP_Z_CN "Z轴最小限位" -#define MAX_ENDSTOP_X_CN "X轴最大限位" -#define MAX_ENDSTOP_Y_CN "Y轴最大限位" -#define MAX_ENDSTOP_Z_CN "Z轴最大限位" -#define ENDSTOP_FIL_CN "断料开关类型" -#define ENDSTOP_LEVEL_CN "调平开关类型" -#define ENDSTOP_OPENED_CN "常开" -#define ENDSTOP_CLOSED_CN "常闭" - -#define FILAMENT_CONF_TITLE_CN "换料设置" -#define FILAMENT_IN_LENGTH_CN "进料长度" -#define FILAMENT_IN_SPEED_CN "进料速度" -#define FILAMENT_TEMPERATURE_CN "换料温度" -#define FILAMENT_OUT_LENGTH_CN "退料长度" -#define FILAMENT_OUT_SPEED_CN "退料速度" - -#define LEVELING_CONF_TITLE_CN "机器参数>调平设置" -#define LEVELING_PARA_CONF_CN "调平设置" -#define LEVELING_MANUAL_POS_CN "手动调平坐标设置" -#define LEVELING_AUTO_COMMAND_CN "自动调平指令设置" -#define LEVELING_AUTO_ZOFFSET_CN "挤出头与调平开关偏移设置" - -#define LEVELING_PARA_CONF_TITLE_CN "调平参数" -#define AUTO_LEVELING_ENABLE_CN "自动调平" -#define BLTOUCH_LEVELING_ENABLE_CN "启动BLtouch" -#define PROBE_PORT_CN "调平探针接口" -#define PROBE_X_OFFSET_CN "探针X方向偏移" -#define PROBE_Y_OFFSET_CN "探针Y方向偏移" -#define PROBE_Z_OFFSET_CN "探针Z方向偏移" -#define PROBE_XY_SPEED_CN "探针XY方向移动速度" -#define PROBE_Z_SPEED_CN "探针Z方向移动速度" -#define ENABLE_CN "是" -#define DISABLE_CN "否" -#define Z_MIN_CN "ZMin" -#define Z_MAX_CN "ZMax" - -#define DELTA_LEVEL_CONF_TITLE_CN "Delta机器参数" -#define DELTA_LEVEL_CONF_CN "Delta机器调平" -#define DELTA_MACHINE_RADIUS_CN "机器半径" -#define DELTA_DIAGONAL_ROD_CN "机器杆长" -#define DELTA_PRINT_RADIUS_CN "打印半径" -#define DELTA_HEIGHT_CN "打印高度" -#define SMOOTH_ROD_OFFSET_CN "滑块偏移" -#define EFFECTOR_OFFSET_CN "效应器偏移" -#define CALIBRATION_RADIUS_CN "调平半径" - -#define XYZ_LEVEL_CONF_TITLE_CN "XYZ机器参数" -#define PROBE_REACH_MAX_LEFT_CN "探针达到最左位置" -#define PROBE_REACH_MAX_RIGHT_CN "探针达到最右位置" -#define PROBE_REACH_MAX_FRONT_CN "探针达到最前位置" -#define PROBE_REACH_MAX_BACK_CN "探针达到最后位置" - -#define TEMPERATURE_CONF_TITLE_CN "机器参数>温度设置" -#define NOZZLE_CONF_CN "喷头设置" -#define HOTBED_CONF_CN "热床设置" -#define PREHEAT_TEMPER_CN "预设温度" - -#define NOZZLE_CONF_TITLE_CN "机器参数>喷头设置" -#define NOZZLECNT_CN "喷头数量" -#define NOZZLE_TYPE_CN "E0温感类型" -#define NOZZLE_ADJUST_TYPE_CN "PID调温" -#define NOZZLE_MIN_TEMPERATURE_CN "最低温度" -#define NOZZLE_MAX_TEMPERATURE_CN "最高温度" -#define EXTRUD_MIN_TEMPER_CN "最低挤出温度" - -#define HOTBED_CONF_TITLE_CN "机器参数>热床设置" -#define HOTBED_ADJUST_CN "PID调温" -#define HOTBED_MIN_TEMPERATURE_CN "最低温度" -#define HOTBED_MAX_TEMPERATURE_CN "最高温度" - -#define MOTOR_CONF_TITLE_CN "机器参数>电机设置" -#define MAXFEEDRATE_CONF_CN "最大速度设置" -#define ACCELERATION_CONF_CN "加速度设置" -#define JERKCONF_CN "突变速度设置" -#define STEPSCONF_CN "脉冲设置" -#define TMC_CURRENT_CN "TMC 驱动电流设置" -#define TMC_STEP_MODE_CN "TMC 驱动模式设置" -#define MOTORDIRCONF_CN "电机方向设置" -#define HOMEFEEDRATECONF_CN "归零速度设置" -#define HOMING_SENSITIVITY_CONF_CN "无限位回零灵敏度调节" - -#define MAXFEEDRATE_CONF_TITLE_CN "机器参数>最大速度" -#define X_MAXFEEDRATE_CN "X轴最大速度" -#define Y_MAXFEEDRATE_CN "Y轴最大速度" -#define Z_MAXFEEDRATE_CN "Z轴最大速度" -#define E0_MAXFEEDRATE_CN "E0轴最大速度" -#define E1_MAXFEEDRATE_CN "E1轴最大速度" - -#define ACCELERATION_CONF_TITLE_CN "机器参数>加速度" -#define PRINT_ACCELERATION_CN "打印加速度" -#define RETRACT_ACCELERATION_CN "回抽加速度" -#define TRAVEL_ACCELERATION_CN "空载加速度" -#define X_ACCELERATION_CN "X轴加速度" -#define Y_ACCELERATION_CN "Y轴加速度" -#define Z_ACCELERATION_CN "Z轴加速度" -#define E0_ACCELERATION_CN "E0轴加速度" -#define E1_ACCELERATION_CN "E1轴加速度" - -#define JERK_CONF_TITLE_CN "机器参数>突变速度" -#define X_JERK_CN "X轴突变速度" -#define Y_JERK_CN "Y轴突变速度" -#define Z_JERK_CN "Z轴突变速度" -#define E_JERK_CN "E轴突变速度" - -#define STEPS_CONF_TITLE_CN "机器参数>脉冲设置" -#define X_STEPS_CN "X轴脉冲" -#define Y_STEPS_CN "Y轴脉冲" -#define Z_STEPS_CN "Z轴脉冲" -#define E0_STEPS_CN "E0轴脉冲" -#define E1_STEPS_CN "E1轴脉冲" - -#define TMC_CURRENT_CONF_TITLE_CN "机器参数>TMC电流设置" -#define X_TMC_CURRENT_CN "X轴电流(毫安)" -#define Y_TMC_CURRENT_CN "Y轴电流(毫安)" -#define Z_TMC_CURRENT_CN "Z轴电流(毫安)" -#define E0_TMC_CURRENT_CN "E0轴电流(毫安)" -#define E1_TMC_CURRENT_CN "E1轴电流(毫安)" - -#define TMC_MODE_CONF_TITLE_CN "机器参数>TMC模式设置" -#define X_TMC_MODE_CN "X轴是否使能静音模式" -#define Y_TMC_MODE_CN "Y轴是否使能静音模式" -#define Z_TMC_MODE_CN "Z轴是否使能静音模式" -#define E0_TMC_MODE_CN "E0轴是否使能静音模式" -#define E1_TMC_MODE_CN "E1轴是否使能静音模式" - -#define MOTORDIR_CONF_TITLE_CN "机器参数>电机方向" -#define X_MOTORDIR_CN "X轴电机方向" -#define Y_MOTORDIR_CN "Y轴电机方向" -#define Z_MOTORDIR_CN "Z轴电机方向" -#define E0_MOTORDIR_CN "E0轴电机方向" -#define E1_MOTORDIR_CN "E1轴电机方向" -#define INVERT_P_CN "正向" -#define INVERT_N_CN "反向" - -#define HOMEFEEDRATE_CONF_TITLE_CN "机器参数>归零速度" -#define X_HOMESPEED_CN "XY轴归零速度" -#define Y_HOMESPEED_CN "Y轴归零速度" -#define Z_HOMESPEED_CN "Z轴归零速度" - -#define ADVANCED_CONF_TITLE_CN "机器参数>高级设置" -#define PWROFF_DECTION_CN "断电检测模块" -#define PWROFF_AFTER_PRINT_CN "启动打完关机功能" -#define HAVE_UPS_CN "机器配备UPS电源" -#define Z2_AND_Z2ENDSTOP_CONF_CN "双Z轴双限位功能设置" -#define ENABLE_PINS_CONF_CN "电机使能脚电平设置" -#define WIFI_SETTINGS_CN "Wi-Fi参数设置" -#define ENCODER_SETTINGS_CN "旋钮设置" - -#define Z2_AND_Z2ENDSTOP_CONF_TITLE_CN "双z双限位设置" -#define Z2_ENABLE_CN "启用Z2轴" -#define Z2_ENDSTOP_CN "启用Z2限位" -#define Z2_PORT_CN "Z2限位接口" - -#define ENABLE_PINS_CONF_TITLE_CN "电机使能脚电平" -#define X_ENABLE_PINS_INVERT_CN "X轴电机使能电平" -#define Y_ENABLE_PINS_INVERT_CN "Y轴电机使能电平" -#define Z_ENABLE_PINS_INVERT_CN "Z轴电机使能电平" -#define E_ENABLE_PINS_INVERT_CN "E轴电机使能电平" - -#define PAUSE_POSITION_CN "打印暂停位置设置" -#define PAUSE_POSITION_X_CN "X轴暂停位置(绝对位置,-1无效)" -#define PAUSE_POSITION_Y_CN "Y轴暂停位置(绝对位置,-1无效)" -#define PAUSE_POSITION_Z_CN "Z轴暂停位置(相对位置,-1无效)" -#define WIFI_SETTINGS_TITLE_CN "机器参数>Wi-Fi设置" -#define WIFI_SETTINGS_MODE_CN "Wi-Fi 模式" -#define WIFI_SETTINGS_NAME_CN "Wi-Fi 名称: " -#define WIFI_SETTINGS_PASSWORD_CN "Wi-Fi 密码: " -#define WIFI_SETTINGS_CLOUD_CN "是否使用云服务?" -#define WIFI_SETTINGS_CONFIG_CN "配置" -#define WIFI_SETTINGS_EDIT_CN "编辑" -#define WIFI_CONFIG_TIPS_CN "进行Wi-Fi配置?" - -#define OFFSET_TITLE_CN "机器参数>偏移设置" -#define OFFSET_X_CN "X轴与调平开关偏移" -#define OFFSET_Y_CN "Y轴与调平开关偏移" -#define OFFSET_Z_CN "Z轴与调平开关偏移" - -#define HOMING_SENSITIVITY_CONF_TITLE_CN "机器参数>灵敏度调节" -#define X_SENSITIVITY_CN "X轴灵敏度" -#define Y_SENSITIVITY_CN "Y轴灵敏度" -#define Z_SENSITIVITY_CN "Z轴灵敏度" -#define Z2_SENSITIVITY_CN "Z2轴灵敏度" - -#define ENCODER_CONF_TITLE_CN "机器参数>旋钮设置" -#define ENCODER_CONF_TEXT_CN "是否使用旋钮功能?" - -#define TOOL_TEXT_CN "工具" -#define PREHEAT_TEXT_CN "预热" -#define MOVE_TEXT_CN "移动" -#define HOME_TEXT_CN "回零" -#define PRINT_TEXT_CN "打印" -#define EXTRUDE_TEXT_CN "挤出" -#define LEVELING_TEXT_CN "调平" -#define AUTO_LEVELING_TEXT_CN "自动调平" -#define SET_TEXT_CN "设置" -#define MORE_TEXT_CN "更多" - -#define ADD_TEXT_CN "增加" -#define DEC_TEXT_CN "减少" -#define EXTRUDER_1_TEXT_CN "喷头1" -#define EXTRUDER_2_TEXT_CN "喷头2" -#define HEATBED_TEXT_CN "热床" -#define TEXT_1C_CN "1℃" -#define TEXT_5C_CN "5℃" -#define TEXT_10C_CN "10℃" -#define CLOSE_TEXT_CN "关闭" - -#define BACK_TEXT_CN "返回" - -#define TOOL_PREHEAT_CN "预热" -#define TOOL_EXTRUDE_CN "挤出" -#define TOOL_MOVE_CN "移动" -#define TOOL_HOME_CN "回零" -#define TOOL_LEVELING_CN "调平" -#define TOOL_AUTO_LEVELING_CN "自动调平" -#define TOOL_FILAMENT_CN "换料" -#define TOOL_MORE_CN "更多" - -#define AXIS_X_ADD_TEXT_CN "X+" -#define AXIS_X_DEC_TEXT_CN "X-" -#define AXIS_Y_ADD_TEXT_CN "Y+" -#define AXIS_Y_DEC_TEXT_CN "Y-" -#define AXIS_Z_ADD_TEXT_CN "Z+" -#define AXIS_Z_DEC_TEXT_CN "Z-" -#define TEXT_01MM_CN "0.1mm" -#define TEXT_1MM_CN "1mm" -#define TEXT_10MM_CN "10mm" - -#define HOME_X_TEXT_CN "X" -#define HOME_Y_TEXT_CN "Y" -#define HOME_Z_TEXT_CN "Z" -#define HOME_ALL_TEXT_CN "回零" -#define HOME_STOPMOVE_CN "急停" - -#define PAGE_UP_TEXT_CN "上一页" -#define PAGE_DOWN_TEXT_CN "下一页" - -#define EXTRUDER_IN_TEXT_CN "进料" -#define EXTRUDER_OUT_TEXT_CN "退料" -#define EXTRUDE_1MM_TEXT_CN "1mm" -#define EXTRUDE_5MM_TEXT_CN "5mm" -#define EXTRUDE_10MM_TEXT_CN "10mm" -#define EXTRUDE_LOW_SPEED_TEXT_CN "低速" -#define EXTRUDE_MEDIUM_SPEED_TEXT_CN "常速" -#define EXTRUDE_HIGH_SPEED_TEXT_CN "高速" - -#define LEVELING_POINT1_TEXT_CN "第一点" -#define LEVELING_POINT2_TEXT_CN "第二点" -#define LEVELING_POINT3_TEXT_CN "第三点" -#define LEVELING_POINT4_TEXT_CN "第四点" -#define LEVELING_POINT5_TEXT_CN "第五点" - -#define FILESYS_TEXT_CN "文件系统" -#define WIFI_TEXT_CN "WIFI" -#define FAN_TEXT_CN "风扇" -#define ABOUT_TEXT_CN "关于" -#define BREAK_POINT_TEXT_CN "断点续打" -#define FILAMENT_TEXT_CN "换料" -#define LANGUAGE_TEXT_CN "语言" -#define MOTOR_OFF_TEXT_CN "关闭电机" -#define MOTOR_OFF_XY_TEXT_CN "关闭XY" -#define SHUTDOWN_TEXT_CN "关机" -#define MACHINE_PARA_CN "机器参数" -#define EEPROM_SETTINGS_CN "Eeprom设置" - -#define U_DISK_TEXT_CN "U盘" -#define SD_CARD_TEXT_CN "SD卡" -#define WIFI_NAME_TEXT_CN "无线网络:" -#define WIFI_KEY_TEXT_CN "密码: " -#define WIFI_IP_TEXT_CN "IP: " -#define WIFI_AP_TEXT_CN "状态: AP" -#define WIFI_STA_TEXT_CN "状态: STA" -#define WIFI_CONNECTED_TEXT_CN "已连接" -#define WIFI_DISCONNECTED_TEXT_CN "未连接" -#define WIFI_EXCEPTION_TEXT_CN "模块异常" -#define CLOUD_TEXT_CN "云服务" -#define CLOUD_BIND_CN "已绑定" -#define CLOUD_UNBIND_CN "解绑" -#define CLOUD_UNBINDING_CN "解绑中" -#define CLOUD_DISCONNECTED_CN "未连接" -#define CLOUD_UNBINDED_CN "未绑定" -#define CLOUD_BINDED_CN "已绑定" -#define CLOUD_DISABLE_CN "已禁用" - -#define FAN_ADD_TEXT_CN "增加" -#define FAN_DEC_TEXT_CN "减少" -#define FAN_OPEN_TEXT_CN "100%" -#define FAN_HALF_TEXT_CN "50%" -#define FAN_CLOSE_TEXT_CN "关闭" -#define FAN_TIPS1_TEXT_CN "风扇" -#define FAN_TIPS2_TEXT_CN "FAN\nClose" - -#define FILAMENT_IN_TEXT_CN "进料" -#define FILAMENT_OUT_TEXT_CN "退料" -#define FILAMENT_EXT0_TEXT_CN "喷头1" -#define FILAMENT_EXT1_TEXT_CN "喷头2" -#define FILAMENT_HEAT_TEXT_CN "预热" -#define FILAMENT_STOP_TEXT_CN "停止" -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_CN "请按<进料>或<退料>进行换料!" - #define FILAMENT_CHANGE_TEXT_CN "待打印机暂停后,请按<进料>或<退料>进行换料!" -#else - #define FILAMENT_CHANGE_TEXT_CN "待打印机暂停后,\n请按<进料>或<退料>" -#endif - -#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN "准备进料,正在加热,请稍等!" -#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN "准备退料,正在加热,请稍等!" -#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_CN "加热完成,请装载耗材后,按<确定>开始进料!" -#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_CN "请装载耗材,按<确定>开始进料!" -#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_CN "加热完成,请按<确定>开始退料!" -#define FILAMENT_DIALOG_LOADING_TIPS_CN "正在进料,请等待耗材加载完成!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_CN "正在退料,请等待耗材卸载完成!" -#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_CN "进料完成,请按<确定>返回" -#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN "退料完成,请按<确定>返回" - -#define FILAMENT_TIPS3_TEXT_CN "正在进料" -#define FILAMENT_TIPS4_TEXT_CN "正在退料" -#define FILAMENT_TIPS5_TEXT_CN "温度太低,请先预热" -#define FILAMENT_TIPS6_TEXT_CN "换料完成" - -#define PRE_HEAT_EXT_TEXT_CN "喷头" -#define PRE_HEAT_BED_TEXT_CN "热床" - -#define FILE_LOADING_CN "正在载入......" -#define NO_FILE_AND_CHECK_CN "无文件!请插入sd卡或u盘!" -#define NO_FILE_CN "无文件!" - -#define EXTRUDER_TEMP_TEXT_CN "温度" -#define EXTRUDER_E_LENGTH1_TEXT_CN "喷头" -#define EXTRUDER_E_LENGTH2_TEXT_CN "喷头" -#define EXTRUDER_E_LENGTH3_TEXT_CN "喷头" - -#define ABOUT_TYPE_TEXT_CN "Type: " -#define ABOUT_VERSION_TEXT_CN "Firmware: " -#define ABOUT_WIFI_TEXT_CN "Wifi: " - -#define PRINTING_OPERATION_CN "操作" -#define PRINTING_PAUSE_CN "暂停" -#define PRINTING_TEMP_CN "温度" -#define PRINTING_CHANGESPEED_CN "变速" -#define PRINTING_RESUME_CN "恢复" -#define PRINTING_STOP_CN "停止" -#define PRINTING_MORE_CN "更多" -#define PRINTING_EXTRUDER_CN "挤出" -#define PRINTING_MOVE_CN "移动" - -#define EXTRUDER_SPEED_CN "挤出" -#define MOVE_SPEED_CN "移动" -#define EXTRUDER_SPEED_STATE_CN "挤出速度" -#define MOVE_SPEED_STATE_CN "移动速度" -#define STEP_1PERCENT_CN "1%" -#define STEP_5PERCENT_CN "5%" -#define STEP_10PERCENT_CN "10%" - -#define TITLE_READYPRINT_CN "准备打印" -#define TITLE_PREHEAT_CN "预热" -#define TITLE_MOVE_CN "移动" -#define TITLE_HOME_CN "回零" -#define TITLE_EXTRUDE_CN "挤出" -#define TITLE_LEVELING_CN "调平" -#define TITLE_SET_CN "设置" -#define TITLE_MORE_CN "更多" -#define TITLE_CHOOSEFILE_CN "选择文件" -#define TITLE_PRINTING_CN "正在打印" -#define TITLE_OPERATION_CN "操作" -#define TITLE_ADJUST_CN "调整" -#define TITLE_WIRELESS_CN "无线网络" -#define TITLE_FILAMENT_CN "换料" -#define TITLE_ABOUT_CN "关于" -#define TITLE_FAN_CN "风扇" -#define TITLE_LANGUAGE_CN "语言" -#define TITLE_PAUSE_CN "暂停" -#define TITLE_CHANGESPEED_CN "变速" -#define TITLE_CLOUD_TEXT_CN "云服务" -#define TITLE_DIALOG_CONFIRM_CN "确认" -#define TITLE_FILESYS_CN "文件系统" - -#define AUTO_SHUTDOWN_CN "自动关机" -#define MANUAL_SHUTDOWN_CN "手动关机" - -#define DIALOG_CONFIRM_CN "确定" -#define DIALOG_CANCLE_CN "取消" -#define DIALOG_OK_CN "确认" -#define DIALOG_RESET_CN "重置" -#define DIALOG_DISABLE_CN "禁用" -#define DIALOG_PRINT_MODEL_CN "打印模型?" -#define DIALOG_CANCEL_PRINT_CN "停止打印?" -#define DIALOG_RETRY_CN "重试" -#define DIALOG_STOP_CN "停止" -#define DIALOG_REPRINT_FROM_BREAKPOINT_CN "从断点续打?" -//#define DIALOG_UNBIND_PRINTER_CN "解除绑定 ?" -#define DIALOG_ERROR_TIPS1_CN "错误:找不到文件,请插入sd卡/u盘!" -#define DIALOG_ERROR_TIPS2_CN "错误:通信失败,请检查波特率或主板硬件!" -#define DIALOG_ERROR_TIPS3_CN "错误:文件名或文件路径太长 !" -#define DIALOG_CLOSE_MACHINE_CN "正在关机......" -#define DIALOG_UNBIND_PRINTER_CN "解除绑定?" -#define DIALOG_FILAMENT_NO_PRESS_CN "请先装载耗材!" -#define DIALOG_PRINT_FINISH_CN "打印完成!" -#define DIALOG_PRINT_TIME_CN "打印时间: " -#define DIALOG_REPRINT_CN "再打印一次" -#define DIALOG_WIFI_ENABLE_TIPS_CN "wifi模块正在配置中,请稍等......" - -#define TEXT_VALUE_CN "%d℃/%d℃" -#define EXTRUDE_TEXT_VALUE_T_CN ": %d℃" -#define WIFI_RECONNECT_TEXT_CN "重新连接" - -#define PRINTING_GBK "正在打印" -#define PRINTING_OPERATION_GBK "操作" -#define PRINTING_PAUSE_GBK "暂停" - -#define MESSAGE_PAUSING_CN "暂停中..." -#define MESSAGE_CHANGING_CN "等待换料开始..." -#define MESSAGE_UNLOAD_CN "退料中,请稍等..." -#define MESSAGE_WAITING_CN "点击按钮恢复打印" -#define MESSAGE_INSERT_CN "装载耗材后,点击按钮开始打印" -#define MESSAGE_LOAD_CN "进料中,请稍等..." -#define MESSAGE_PURGE_CN "等待挤出..." -#define MESSAGE_RESUME_CN "等待恢复打印..." -#define MESSAGE_HEAT_CN "按下按钮,加热喷头" -#define MESSAGE_HEATING_CN "喷头加热中,请等待..." -#define MESSAGE_OPTION_CN "挤出更多还是继续打印?" -#define MESSAGE_PURGE_MORE_CN "挤出" -#define MESSAGE_CONTINUE_PRINT_CN "打印" -#define EEPROM_SETTINGS_TITLE_CN "EEPROM 设置" -#define EEPROM_SETTINGS_STORE_CN "保存参数至EEPROM" -#define EEPROM_SETTINGS_READ_CN "读取EEPROM参数" -#define EEPROM_SETTINGS_REVERT_CN "恢复默认参数" - -#define EEPROM_STORE_TIPS_CN "是否保存参数到EEPROM?" -#define EEPROM_READ_TIPS_CN "是否使用EEPROM参数?" -#define EEPROM_REVERT_TIPS_CN "是否恢复默认参数?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h deleted file mode 100644 index 2babbaba93..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ /dev/null @@ -1,284 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//****************西班牙语*************************** -#define TOOL_TEXT_SP "Ajustes" -#define PREHEAT_TEXT_SP "Precalentar"//"precalent\nar" -#define MOVE_TEXT_SP "Mover" -#define HOME_TEXT_SP "Origen" -#define PRINT_TEXT_SP "Imprimir" -#define EXTRUDE_TEXT_SP "Extrusor" -#define LEVELING_TEXT_SP "Leveling"//"nivelac\nión" -#define AUTO_LEVELING_TEXT_SP "Autolevel"//"auto\nnivelación" -#define SET_TEXT_SP "Config" -#define MORE_TEXT_SP "Más" - -#define ADD_TEXT_SP "Más" -#define DEC_TEXT_SP "Menos" -#define EXTRUDER_1_TEXT_SP "Extrusor1: " -#define EXTRUDER_2_TEXT_SP "Extrusor2: " -#define HEATBED_TEXT_SP "Cama: " -#define TEXT_1C_SP "1℃" -#define TEXT_5C_SP "5℃" -#define TEXT_10C_SP "10℃" -#define CLOSE_TEXT_SP "Apagar" - -#define BACK_TEXT_SP "Atrás" - -#define TOOL_PREHEAT_SP "Precalentar" -#define TOOL_EXTRUDE_SP "Extrusor" -#define TOOL_MOVE_SP "Mover" -#define TOOL_HOME_SP "Origen" -#define TOOL_LEVELING_SP "Leveling" -#define TOOL_AUTO_LEVELING_SP "Autolevel" -#define TOOL_FILAMENT_SP "Filamento" -#define TOOL_MORE_SP "Más" - -#define AXIS_X_ADD_TEXT_SP "X+" -#define AXIS_X_DEC_TEXT_SP "X-" -#define AXIS_Y_ADD_TEXT_SP "Y+" -#define AXIS_Y_DEC_TEXT_SP "Y-" -#define AXIS_Z_ADD_TEXT_SP "Z+" -#define AXIS_Z_DEC_TEXT_SP "Z-" -#define TEXT_01MM_SP "0.1mm" -#define TEXT_1MM_SP "1mm" -#define TEXT_10MM_SP "10mm" - -#define HOME_X_TEXT_SP "EJE X" -#define HOME_Y_TEXT_SP "EJE Y" -#define HOME_Z_TEXT_SP "EJE Z" -#define HOME_ALL_TEXT_SP "TODOS" -#define HOME_STOPMOVE_SP "Quickstop" - -#define PAGE_UP_TEXT_SP "Arriba" -#define PAGE_DOWN_TEXT_SP "Abajo" - -#define EXTRUDER_IN_TEXT_SP "Dentro" -#define EXTRUDER_OUT_TEXT_SP "Fuera" -#define EXTRUDE_1MM_TEXT_SP "1mm" -#define EXTRUDE_5MM_TEXT_SP "5mm" -#define EXTRUDE_10MM_TEXT_SP "10mm" -#define EXTRUDE_LOW_SPEED_TEXT_SP "Baja" -#define EXTRUDE_MEDIUM_SPEED_TEXT_SP "Media" -#define EXTRUDE_HIGH_SPEED_TEXT_SP "Alta" - -#define LEVELING_POINT1_TEXT_SP "Primero" -#define LEVELING_POINT2_TEXT_SP "Segundo" -#define LEVELING_POINT3_TEXT_SP "Tercero" -#define LEVELING_POINT4_TEXT_SP "Cuarto" -#define LEVELING_POINT5_TEXT_SP "Quinto" - -#define FILESYS_TEXT_SP "Puerto" -#define WIFI_TEXT_SP "WiFi" -#define FAN_TEXT_SP "Ventilador" -#define ABOUT_TEXT_SP "Acerca" -#define BREAK_POINT_TEXT_SP "Continuar" -#define FILAMENT_TEXT_SP "Filamento" -#define LANGUAGE_TEXT_SP "Language" -#define MOTOR_OFF_TEXT_SP "Apagar motor" -#define MOTOR_OFF_XY_TEXT_SP "Off-XY" -#define SHUTDOWN_TEXT_SP "Apagar" -#define MACHINE_PARA_SP "Config" -#define EEPROM_SETTINGS_SP "Eeprom Set" - -#define U_DISK_TEXT_SP "PENDRIVE" -#define SD_CARD_TEXT_SP "SD" -#define WIFI_NAME_TEXT_SP "WIFI: " -#define WIFI_KEY_TEXT_SP "Contraseña: " -#define WIFI_IP_TEXT_SP "IP: " -#define WIFI_AP_TEXT_SP "Estado: AP" -#define WIFI_STA_TEXT_SP "Estado: STA" -#define WIFI_CONNECTED_TEXT_SP "Conectado" -#define WIFI_DISCONNECTED_TEXT_SP "Desconectado" -#define WIFI_EXCEPTION_TEXT_SP "Excepción" -#define WIFI_RECONNECT_TEXT_SP "Reconnect" -#define CLOUD_TEXT_SP "Nube" -#define CLOUD_BIND_SP "Atado" -#define CLOUD_UNBIND_SP "Sin atar" -#define CLOUD_UNBINDING_SP "Unbinding" -#define CLOUD_DISCONNECTED_SP "Disconnected" -#define CLOUD_UNBINDED_SP "Unbinded" -#define CLOUD_BINDED_SP "Binded" -#define CLOUD_DISABLE_SP "Disable" - -#define FAN_ADD_TEXT_SP "Más" -#define FAN_DEC_TEXT_SP "Menos" -#define FAN_OPEN_TEXT_SP "100%" -#define FAN_HALF_TEXT_SP "50%" -#define FAN_CLOSE_TEXT_SP "0%" -#define FAN_TIPS1_TEXT_SP "ventilador" -#define FAN_TIPS2_TEXT_SP "ventilador\n0" - -#define FILAMENT_IN_TEXT_SP "Dentro" -#define FILAMENT_OUT_TEXT_SP "Fuera" -#define FILAMENT_EXT0_TEXT_SP "Extrusor1" -#define FILAMENT_EXT1_TEXT_SP "Extrusor2" -#define FILAMENT_HEAT_TEXT_SP "Precalentar" -#define FILAMENT_STOP_TEXT_SP "Parar" -//#define FILAMENT_CHANGE_TEXT_SP "Filamento" -#define FILAMENT_TIPS2_TEXT_SP "T:" -#define FILAMENT_TIPS3_TEXT_SP "Dentro..." -#define FILAMENT_TIPS4_TEXT_SP "Fuera..." -#define FILAMENT_TIPS5_TEXT_SP "Temperatura demasiado baja, por favor calentar" -#define FILAMENT_TIPS6_TEXT_SP "Completado" -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_SP "Please click or \nto replace filament!" - #define FILAMENT_CHANGE_TEXT_SP "Please click or ,\nAfter pinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP "Calentando el extrusor, por favor espere..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP "Calentando el extrusor, por favor espere..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP "Temperatura alcanzada.Inserte el filamento y luego presione\"Confirmar\"para comenzar la carga." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_SP "Inserte el filamento y luego presione\"Confirmar\"para comenzar la carga." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP "Temperatura alcanzada.Presione\"Confirmar\"para retirar el filamento." - #define FILAMENT_DIALOG_LOADING_TIPS_SP "Cargando filamento,por favor espere." - #define FILAMENT_DIALOG_UNLOADING_TIPS_SP "Retirando filamento,por favor espere." - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP "Filamento cargado,presione\"Confirmar\"." - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP "Filamento retirado,presione\"Confirmar\"." -#else - #define FILAMENT_CHANGE_TEXT_SP "Please click \nor ,After \npinter pause." - #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..." - #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..." - #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP "Temperatura alcanzada.Inserte el \nfilamento y luego presione\"Confirmar\"\npara comenzar la carga." - #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_SP "Inserte el filamento y \nluego presione\"Confirmar\"para \ncomenzar la carga." - #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP "Temperatura alcanzada.\nPresione\"Confirmar\"para retirar \nel filamento." - #define FILAMENT_DIALOG_LOADING_TIPS_SP "Cargando filamento,\npor favor espere." - #define FILAMENT_DIALOG_UNLOADING_TIPS_SP "Retirando filamento,\npor favor espere." - #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP "Filamento cargado,\npresione\"Confirmar\"." - #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP "Filamento retirado,\npresione\"Confirmar\"." -#endif - -#define PRE_HEAT_EXT_TEXT_SP "Extrusor" -#define PRE_HEAT_BED_TEXT_SP "cama" - -#define FILE_LOADING_SP "Cargando......" -#if 0 - #define NO_FILE_AND_CHECK_SP "No se encontraron archivos! Por favor, inserte la tarjeta SD o el disco U!" -#endif -#define NO_FILE_AND_CHECK_SP "Archivo no encontrado,\n por favor insertar SD o disco USB!" - -#define NO_FILE_SP "Sin archivo!" - - - -#define EXTRUDER_TEMP_TEXT_SP "Temper" -#define EXTRUDER_E_LENGTH1_TEXT_SP "Extrusor1" -#define EXTRUDER_E_LENGTH2_TEXT_SP "Extrusor2" -#define EXTRUDER_E_LENGTH3_TEXT_SP "Extrusor3" - -#define ABOUT_TYPE_TEXT_SP "Pantalla: " -#define ABOUT_VERSION_TEXT_SP "Firmware: " -#define ABOUT_WIFI_TEXT_SP "WiFi: " - -#define PRINTING_OPERATION_SP "Ajustes" -#define PRINTING_PAUSE_SP "Pausar" -#define PRINTING_TEMP_SP "Temp." -#define PRINTING_CHANGESPEED_SP "Velocidad" -#define PRINTING_RESUME_SP "Resumir" -#define PRINTING_STOP_SP "Detener" -#define PRINTING_MORE_SP "Más" -#define PRINTING_EXTRUDER_SP "Extrusor" -#define PRINTING_MOVE_SP "Mover" - -#define EXTRUDER_SPEED_SP "Extrusor" -#define MOVE_SPEED_SP "Mover" -#define EXTRUDER_SPEED_STATE_SP "Extrusión" -#define MOVE_SPEED_STATE_SP "Movimiento" -#define STEP_1PERCENT_SP "1%" -#define STEP_5PERCENT_SP "5%" -#define STEP_10PERCENT_SP "10%" - -#define TITLE_READYPRINT_SP "Inicio" -#define TITLE_PREHEAT_SP "Precalentar" -#define TITLE_MOVE_SP "Mover" -#define TITLE_HOME_SP "Origen" -#define TITLE_EXTRUDE_SP "Extrusor" -#define TITLE_LEVELING_SP "Leveling" -#define TITLE_SET_SP "Config" -#define TITLE_MORE_SP "Más" -#define TITLE_CHOOSEFILE_SP "Imprimir" -#define TITLE_PRINTING_SP "Imprimir" -#define TITLE_OPERATION_SP "Ajustes" -#define TITLE_ADJUST_SP "Temp." -#define TITLE_WIRELESS_SP "Wireless" -#define TITLE_FILAMENT_SP "Filamento" -#define TITLE_ABOUT_SP "Acerca" -#define TITLE_FAN_SP "Ventilador" -#define TITLE_LANGUAGE_SP "Language" -#define TITLE_PAUSE_SP "Pausar" -#define TITLE_CHANGESPEED_SP "Velocidad" -#define TILE_TOOL_SP "Ajustes" -#define TITLE_CLOUD_TEXT_SP "Cloud" -#define TITLE_DIALOG_CONFIRM_SP "Confirmar" -#define TITLE_FILESYS_SP "Puerto" - -#define AUTO_SHUTDOWN_SP "Auto" -#define MANUAL_SHUTDOWN_SP "manual" - -#define DIALOG_CONFIRM_SP "Confirmar" -#define DIALOG_CANCLE_SP "Cancelar" -#define DIALOG_OK_SP "OK" -#define DIALOG_RESET_SP "Resetear" -#define DIALOG_RETRY_SP "Reintentar" -#define DIALOG_DISABLE_SP "Desactivar" -#define DIALOG_PRINT_MODEL_SP "¿Está seguro?" -#define DIALOG_CANCEL_PRINT_SP "¿Está seguro que desea detener la impresión?" - -#define DIALOG_RETRY_SP "Reintentar" -#define DIALOG_STOP_SP "Stop" -#define DIALOG_REPRINT_FROM_BREAKPOINT_SP "Reprint from breakpoint?" -//#define DIALOG_UNBIND_PRINTER_SP "Unbind the printer?" -#define DIALOG_ERROR_TIPS1_SP "Error:archivo no encontrado, \npor favor insertar SD o disco USB." -#define DIALOG_ERROR_TIPS2_SP "error:transacción fallida, \nconfigurar baudrate del \ndisplay para la placa base!" -#define DIALOG_ERROR_TIPS3_SP "Error : nombre de archivo o \nruta demasiado largo!" -#define DIALOG_CLOSE_MACHINE_SP "Closing machine......" -#define DIALOG_UNBIND_PRINTER_SP "Unbind the printer?" -#define DIALOG_FILAMENT_NO_PRESS_SP "Filament detection switch is not pressed" -#define DIALOG_PRINT_FINISH_SP "¡La impresión está completa!" -#define DIALOG_PRINT_TIME_SP "Tiempo de impresión: " -#define DIALOG_REPRINT_SP "Print again" -#define DIALOG_WIFI_ENABLE_TIPS_SP "The wifi module is being configured,\nplease wait a moment....." - -#define PRINTING_SP "Imprimiendo" -#define PRINTING_AJUSTES_SP "Ajustes" -#define PRINTING_PAUSAR_SP "Pausar" - -#define MESSAGE_PAUSING_SP "Aparcando..." -#define MESSAGE_CHANGING_SP "Esperando para iniciar el cambio de filamento" -#define MESSAGE_UNLOAD_SP "Espere para liberar el filamento" -#define MESSAGE_WAITING_SP "Pulsar el botón para reanudar impresión" -#define MESSAGE_INSERT_SP "Inserte el filamento y pulse el botón para continuar..." -#define MESSAGE_LOAD_SP "Espere para purgar el filamento" -#define MESSAGE_PURGE_SP "Espere para purgar el filamento" -#define MESSAGE_RESUME_SP "Esperando impresora para reanudar..." -#define MESSAGE_HEAT_SP "Pulse el botón para calentar la boquilla" -#define MESSAGE_HEATING_SP "Calentando boquilla Espere por favor..." -#define MESSAGE_OPTION_SP "¿Purgar más o continuar con la impresión?" -#define MESSAGE_PURGE_MORE_SP "Purga" -#define MESSAGE_CONTINUE_PRINT_SP "Impresión" -#define EEPROM_SETTINGS_TITLE_SP "Configuraciones EEPROM" -#define EEPROM_SETTINGS_STORE_SP "Guardar configuración en EEPROM" -#define EEPROM_SETTINGS_READ_SP "Leer la configuración de EEPROM" -#define EEPROM_SETTINGS_REVERT_SP "Revert settings to factory defaults" - -#define EEPROM_STORE_TIPS_SP "¿Guardar ajustes en EEPROM?" -#define EEPROM_READ_TIPS_SP "Leer la configuración de EEPROM?" -#define EEPROM_REVERT_TIPS_SP "Revert settings to factory defaults?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h deleted file mode 100644 index d956e14aad..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ /dev/null @@ -1,499 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -//***************繁体中文**********************// -#define NEXT_T_CN "下一頁" -#define PREVIOUS_T_CN "上一頁" -#define DEFAULT_T_CN "默認值" -#define KEY_BACK_T_CN "退格" -#define KEY_REST_T_CN "重置" -#define KEY_CONFIRM_T_CN "確定" - -#define MACHINE_PARA_TITLE_T_CN "機器參數" -#define MACHINE_TYPE_CNOFIG_T_CN "機器設置" -#define MOTOR_CONFIG_T_CN "電機設置" -#define MACHINE_LEVELING_CONFIG_T_CN "調平設置" -#define ADVANCE_CONFIG_T_CN "高級設置" - -#define MACHINE_CONFIG_TITLE_T_CN "機器參數>機器配置" -#define MACHINE_TYPE_T_CN "機型選擇" -#define MACHINE_STROKE_T_CN "行程設置" -#define MACHINE_HOMEDIR_T_CN "歸零方向" -#define MACHINE_ENDSTOP_TYPE_T_CN "限位開關類型" -#define MACHINE_FILAMENT_CONFIG_T_CN "換料設置" - -#define MACHINE_TYPE_CONFIG_TITLE_T_CN "機器參數>機型選擇" -#define MACHINE_TYPE_XYZ_T_CN "XYZ機型" -#define MACHINE_TYPE_DELTA_T_CN "Delta機型" -#define MACHINE_TYPE_COREXY_T_CN "Corexy機型" - -#define MACHINE_STROKE_CONF_TITLE_T_CN "機器參數>機器行程" -#define X_MAX_LENGTH_T_CN "X軸最大行程" -#define Y_MAX_LENGTH_T_CN "Y軸最大行程" -#define Z_MAX_LENGTH_T_CN "Z軸最大行程" - -#define X_MIN_LENGTH_T_CN "X軸最小行程" -#define Y_MIN_LENGTH_T_CN "Y軸最小行程" -#define Z_MIN_LENGTH_T_CN "Z軸最小行程" - -#define HOME_DIR_CONF_TITLE_T_CN "機器參數>歸零方向" -#define HOME_DIR_X_T_CN "X軸歸零方向" -#define HOME_DIR_Y_T_CN "Y軸歸零方向" -#define HOME_DIR_Z_T_CN "Z軸歸零方向" -#define HOME_MIN_T_CN "MIN" -#define HOME_MAX_T_CN "MAX" - -#define ENDSTOP_CONF_TITLE_T_CN "機器參數>限位開關" -#define MIN_ENDSTOP_X_T_CN "X軸最小限位" -#define MIN_ENDSTOP_Y_T_CN "Y軸最小限位" -#define MIN_ENDSTOP_Z_T_CN "Z軸最小限位" -#define MAX_ENDSTOP_X_T_CN "X軸最大限位" -#define MAX_ENDSTOP_Y_T_CN "Y軸最大限位" -#define MAX_ENDSTOP_Z_T_CN "Z軸最大限位" -#define ENDSTOP_FIL_T_CN "斷料開關類型" -#define ENDSTOP_LEVEL_T_CN "調平開關類型" -#define ENDSTOP_OPENED_T_CN "常開" -#define ENDSTOP_CLOSED_T_CN "常閉" - -#define FILAMENT_CONF_TITLE_T_CN "換料設置" -#define FILAMENT_IN_LENGTH_T_CN "進料長度" -#define FILAMENT_IN_SPEED_T_CN "進料速度" -#define FILAMENT_TEMPERATURE_T_CN "換料溫度" -#define FILAMENT_OUT_LENGTH_T_CN "退料長度" -#define FILAMENT_OUT_SPEED_T_CN "退料速度" - -#define LEVELING_CONF_TITLE_T_CN "機器參數>調平設置" -#define LEVELING_PARA_CONF_T_CN "調平設置" -#define LEVELING_MANUAL_POS_T_CN "手動調平坐標設置" -#define LEVELING_AUTO_COMMAND_T_CN "自動調平指令設置" -#define LEVELING_AUTO_ZOFFSET_T_CN "擠出頭與調平開關偏移設置" - -#define LEVELING_PARA_CONF_TITLE_T_CN "調平參數" -#define AUTO_LEVELING_ENABLE_T_CN "自動調平" -#define BLTOUCH_LEVELING_ENABLE_T_CN "啟動BLtouch" -#define PROBE_PORT_T_CN "調平探針接口" -#define PROBE_X_OFFSET_T_CN "探針X方向偏移" -#define PROBE_Y_OFFSET_T_CN "探针Y方向偏移" -#define PROBE_Z_OFFSET_T_CN "探针Z方向偏移" -#define PROBE_XY_SPEED_T_CN "探针XY方向移動速度" -#define PROBE_Z_SPEED_T_CN "探针Z方向移動速度" -#define ENABLE_T_CN "是" -#define DISABLE_T_CN "否" -#define Z_MIN_T_CN "ZMin" -#define Z_MAX_T_CN "ZMax" - -#define DELTA_LEVEL_CONF_TITLE_T_CN "Delta機器參數" -#define DELTA_LEVEL_CONF_T_CN "Delta機器調平" -#define DELTA_MACHINE_RADIUS_T_CN "機器半徑" -#define DELTA_DIAGONAL_ROD_T_CN "機器桿長" -#define DELTA_PRINT_RADIUS_T_CN "打印半徑" -#define DELTA_HEIGHT_T_CN "打印高度" -#define SMOOTH_ROD_OFFSET_T_CN "滑塊偏移" -#define EFFECTOR_OFFSET_T_CN "效應器偏移" -#define CALIBRATION_RADIUS_T_CN "調平半徑" - -#define XYZ_LEVEL_CONF_TITLE_T_CN "XYZ機器參數" -#define PROBE_REACH_MAX_LEFT_T_CN "探针達到最左位置" -#define PROBE_REACH_MAX_RIGHT_T_CN "探针達到最右位置" -#define PROBE_REACH_MAX_FRONT_T_CN "探针達到最前位置" -#define PROBE_REACH_MAX_BACK_T_CN "探针達到最後位置" - -#define TEMPERATURE_CONF_TITLE_T_CN "機器參數>溫度設置" -#define NOZZLE_CONF_T_CN "噴頭設置" -#define HOTBED_CONF_T_CN "熱床設置" -#define PREHEAT_TEMPER_T_CN "預設溫度" - -#define NOZZLE_CONF_TITLE_T_CN "機器參數>噴頭設置" -#define NOZZLECNT_T_CN "噴頭數量" -#define NOZZLE_TYPE_T_CN "E0溫感類型" -#define NOZZLE_ADJUST_TYPE_T_CN "PID調溫" -#define NOZZLE_MIN_TEMPERATURE_T_CN "最低溫度" -#define NOZZLE_MAX_TEMPERATURE_T_CN "最高溫度" -#define EXTRUD_MIN_TEMPER_T_CN "最低擠出溫度" - -#define HOTBED_CONF_TITLE_T_CN "機器參數>熱床設置" -#define HOTBED_ADJUST_T_CN "PID調溫" -#define HOTBED_MIN_TEMPERATURE_T_CN "最低溫度" -#define HOTBED_MAX_TEMPERATURE_T_CN "最高溫度" - -#define MOTOR_CONF_TITLE_T_CN "機器參數>電機設置" -#define MAXFEEDRATE_CONF_T_CN "最大速度設置" -#define ACCELERATION_CONF_T_CN "加速度設置" -#define JERKCONF_T_CN "突變速度設置" -#define STEPSCONF_T_CN "脈沖設置" -#define TMC_CURRENT_T_CN "TMC 驅動電流設置" -#define TMC_STEP_MODE_T_CN "TMC 驅動模式設置" -#define MOTORDIRCONF_T_CN "電機方向設置" -#define HOMEFEEDRATECONF_T_CN "歸零速度設置" -#define HOMING_SENSITIVITY_CONF_T_CN "無限位回零靈敏度調節" - -#define MAXFEEDRATE_CONF_TITLE_T_CN "機器參數>最大速度" -#define X_MAXFEEDRATE_T_CN "X軸最大速度" -#define Y_MAXFEEDRATE_T_CN "Y軸最大速度" -#define Z_MAXFEEDRATE_T_CN "Z軸最大速度" -#define E0_MAXFEEDRATE_T_CN "E0軸最大速度" -#define E1_MAXFEEDRATE_T_CN "E1軸最大速度" - -#define ACCELERATION_CONF_TITLE_T_CN "機器參數>加速度" -#define PRINT_ACCELERATION_T_CN "打印加速度" -#define RETRACT_ACCELERATION_T_CN "回抽加速度" -#define TRAVEL_ACCELERATION_T_CN "空載加速度" -#define X_ACCELERATION_T_CN "X軸加速度" -#define Y_ACCELERATION_T_CN "Y軸加速度" -#define Z_ACCELERATION_T_CN "Z軸加速度" -#define E0_ACCELERATION_T_CN "E0軸加速度" -#define E1_ACCELERATION_T_CN "E1軸加速度" - -#define JERK_CONF_TITLE_T_CN "機器參數>突變速度" -#define X_JERK_T_CN "X軸突變速度" -#define Y_JERK_T_CN "Y軸突變速度" -#define Z_JERK_T_CN "Z軸突變速度" -#define E_JERK_T_CN "E軸突變速度" - -#define STEPS_CONF_TITLE_T_CN "機器參數>脈衝設置" -#define X_STEPS_T_CN "X軸脈沖" -#define Y_STEPS_T_CN "Y軸脈沖" -#define Z_STEPS_T_CN "Z軸脈沖" -#define E0_STEPS_T_CN "E0軸脈沖" -#define E1_STEPS_T_CN "E1軸脈沖" - -#define TMC_CURRENT_CONF_TITLE_T_CN "機器參數>TMC電流設置" -#define X_TMC_CURRENT_T_CN "X軸電流(毫安)" -#define Y_TMC_CURRENT_T_CN "Y軸電流(毫安)" -#define Z_TMC_CURRENT_T_CN "Z軸電流(毫安)" -#define E0_TMC_CURRENT_T_CN "E0軸電流(毫安)" -#define E1_TMC_CURRENT_T_CN "E1軸電流(毫安)" - -#define TMC_MODE_CONF_TITLE_T_CN "機器參數>TMC模式設置" -#define X_TMC_MODE_T_CN "X軸是否使能靜音模式" -#define Y_TMC_MODE_T_CN "Y軸是否使能靜音模式" -#define Z_TMC_MODE_T_CN "Z軸是否使能靜音模式" -#define E0_TMC_MODE_T_CN "E0軸是否使能靜音模式" -#define E1_TMC_MODE_T_CN "E1軸是否使能靜音模式" - -#define MOTORDIR_CONF_TITLE_T_CN "機器參數>電機方向" -#define X_MOTORDIR_T_CN "X軸電機方向" -#define Y_MOTORDIR_T_CN "Y軸電機方向" -#define Z_MOTORDIR_T_CN "Z軸電機方向" -#define E0_MOTORDIR_T_CN "E0軸電機方向" -#define E1_MOTORDIR_T_CN "E1軸電機方向" -#define INVERT_P_T_CN "正向" -#define INVERT_N_T_CN "反向" - -#define HOMEFEEDRATE_CONF_TITLE_T_CN "機器參數>歸零速度" -#define X_HOMESPEED_T_CN "XY軸歸零速度" -#define Y_HOMESPEED_T_CN "Y軸歸零速度" -#define Z_HOMESPEED_T_CN "Z軸歸零速度" - -#define ADVANCED_CONF_TITLE_T_CN "機器參數>高級設置" -#define PWROFF_DECTION_T_CN "斷電檢測模塊" -#define PWROFF_AFTER_PRINT_T_CN "啟動打完關機功能" -#define HAVE_UPS_T_CN "機器配備UPS電壓" -#define Z2_AND_Z2ENDSTOP_CONF_T_CN "雙z軸雙限位功能設置" -#define ENABLE_PINS_CONF_T_CN "電機使能腳電平設置" -#define WIFI_SETTINGS_T_CN "Wi-Fi參數設置" -#define ENCODER_SETTINGS_T_CN "旋鈕設置" - -#define Z2_AND_Z2ENDSTOP_CONF_TITLE_T_CN "雙z軸雙限位設置" -#define Z2_ENABLE_T_CN "啟用Z2軸" -#define Z2_ENDSTOP_T_CN "啟用Z2限位" -#define Z2_PORT_T_CN "Z2限位接口" - -#define ENABLE_PINS_CONF_TITLE_T_CN "電機使能腳電平" -#define X_ENABLE_PINS_INVERT_T_CN "X軸電機使能電平" -#define Y_ENABLE_PINS_INVERT_T_CN "Y軸電機使能電平" -#define Z_ENABLE_PINS_INVERT_T_CN "Z軸電機使能電平" -#define E_ENABLE_PINS_INVERT_T_CN "E軸電機使能電平" - -#define PAUSE_POSITION_T_CN "打印暫停位置設置" -#define PAUSE_POSITION_X_T_CN "X軸暫停位置(絕對位置,-1無效)" -#define PAUSE_POSITION_Y_T_CN "Y軸暫停位置(絕對位置,-1無效)" -#define PAUSE_POSITION_Z_T_CN "Z軸暫停位置(相對位置,-1無效)" -#define WIFI_SETTINGS_TITLE_T_CN "機器參數>Wi-Fi設置" -#define WIFI_SETTINGS_MODE_T_CN "Wi-Fi 模式" -#define WIFI_SETTINGS_NAME_T_CN "Wi-Fi 名稱: " -#define WIFI_SETTINGS_PASSWORD_T_CN "Wi-Fi 密碼: " -#define WIFI_SETTINGS_CLOUD_T_CN "是否使用雲服務?" -#define WIFI_SETTINGS_CONFIG_T_CN "配置" -#define WIFI_SETTINGS_EDIT_T_CN "編輯" -#define WIFI_CONFIG_TIPS_T_CN "進行Wi-Fi配置?" - -#define OFFSET_TITLE_T_CN "機器參數>偏移設置" -#define OFFSET_X_T_CN "X軸與調平開關偏移" -#define OFFSET_Y_T_CN "Y軸與調平開關偏移" -#define OFFSET_Z_T_CN "Z軸與調平開關偏移" - -#define HOMING_SENSITIVITY_CONF_TITLE_T_CN "機器參數>靈敏度調節" -#define X_SENSITIVITY_T_CN "X軸靈敏度" -#define Y_SENSITIVITY_T_CN "Y軸靈敏度" -#define Z_SENSITIVITY_T_CN "Z軸靈敏度" -#define Z2_SENSITIVITY_T_CN "Z2軸靈敏度" - -#define ENCODER_CONF_TITLE_T_CN "機器參數>旋鈕設置" -#define ENCODER_CONF_TEXT_T_CN "是否使用旋鈕功能?" - -#define TOOL_TEXT_T_CN "工具" -#define PREHEAT_TEXT_T_CN "預熱" -#define MOVE_TEXT_T_CN "移動" -#define HOME_TEXT_T_CN "回零" -#define PRINT_TEXT_T_CN "打印" -#define EXTRUDE_TEXT_T_CN "擠出" -#define LEVELING_TEXT_T_CN "調平" -#define AUTO_LEVELING_TEXT_T_CN "自動調平" -#define SET_TEXT_T_CN "設置" -#define MORE_TEXT_T_CN "更多" - -#define ADD_TEXT_T_CN "增加" -#define DEC_TEXT_T_CN "減少" -#define EXTRUDER_1_TEXT_T_CN "噴頭1" -#define EXTRUDER_2_TEXT_T_CN "噴頭2" -#define HEATBED_TEXT_T_CN "熱床" -#define TEXT_1C_T_CN "1℃" -#define TEXT_5C_T_CN "5℃" -#define TEXT_10C_T_CN "10℃" -#define CLOSE_TEXT_T_CN "關閉" - -#define BACK_TEXT_T_CN "返回" - -#define TOOL_PREHEAT_T_CN "預熱" -#define TOOL_EXTRUDE_T_CN "擠出" -#define TOOL_MOVE_T_CN "移動" -#define TOOL_HOME_T_CN "回零" -#define TOOL_LEVELING_T_CN "調平" -#define TOOL_AUTO_LEVELING_T_CN "自動調平" -#define TOOL_FILAMENT_T_CN "換料" -#define TOOL_MORE_T_CN "更多" - -#define AXIS_X_ADD_TEXT_T_CN "X+" -#define AXIS_X_DEC_TEXT_T_CN "X-" -#define AXIS_Y_ADD_TEXT_T_CN "Y+" -#define AXIS_Y_DEC_TEXT_T_CN "Y-" -#define AXIS_Z_ADD_TEXT_T_CN "Z+" -#define AXIS_Z_DEC_TEXT_T_CN "Z-" -#define TEXT_01MM_T_CN "0.1mm" -#define TEXT_1MM_T_CN "1mm" -#define TEXT_10MM_T_CN "10mm" - -#define HOME_X_TEXT_T_CN "X" -#define HOME_Y_TEXT_T_CN "Y" -#define HOME_Z_TEXT_T_CN "Z" -#define HOME_ALL_TEXT_T_CN "回零" -#define HOME_STOPMOVE_T_CN "急停" - -#define PAGE_UP_TEXT_T_CN "上一頁" -#define PAGE_DOWN_TEXT_T_CN "下一頁" - -#define EXTRUDER_IN_TEXT_T_CN "進料" -#define EXTRUDER_OUT_TEXT_T_CN "退料" -#define EXTRUDE_1MM_TEXT_T_CN "1mm" -#define EXTRUDE_5MM_TEXT_T_CN "5mm" -#define EXTRUDE_10MM_TEXT_T_CN "10mm" -#define EXTRUDE_LOW_SPEED_TEXT_T_CN "低速" -#define EXTRUDE_MEDIUM_SPEED_TEXT_T_CN "常速" -#define EXTRUDE_HIGH_SPEED_TEXT_T_CN "高速" - -#define LEVELING_POINT1_TEXT_T_CN "第一點" -#define LEVELING_POINT2_TEXT_T_CN "第二點" -#define LEVELING_POINT3_TEXT_T_CN "第三點" -#define LEVELING_POINT4_TEXT_T_CN "第四點" -#define LEVELING_POINT5_TEXT_T_CN "第五點" - -#define FILESYS_TEXT_T_CN "文件系統" -#define WIFI_TEXT_T_CN "WIFI" -#define FAN_TEXT_T_CN "風扇" -#define ABOUT_TEXT_T_CN "關於" -#define BREAK_POINT_TEXT_T_CN "斷點續打" -#define FILAMENT_TEXT_T_CN "換料" -#define LANGUAGE_TEXT_T_CN "語言" -#define MOTOR_OFF_TEXT_T_CN "關閉電機" -#define MOTOR_OFF_XY_TEXT_T_CN "關閉XY" -#define SHUTDOWN_TEXT_T_CN "關機" -#define MACHINE_PARA_T_CN "機器參數" -#define EEPROM_SETTINGS_T_CN "Eeprom設置" - -#define U_DISK_TEXT_T_CN "U盤" -#define SD_CARD_TEXT_T_CN "SD卡" -#define WIFI_NAME_TEXT_T_CN "無線網絡:" -#define WIFI_KEY_TEXT_T_CN "密碼: " -#define WIFI_IP_TEXT_T_CN "IP: " -#define WIFI_AP_TEXT_T_CN "狀態: AP" -#define WIFI_STA_TEXT_T_CN "狀態: STA" -#define WIFI_CONNECTED_TEXT_T_CN "已連接" -#define WIFI_DISCONNECTED_TEXT_T_CN "未連接" -#define WIFI_EXCEPTION_TEXT_T_CN "模塊異常" -#define CLOUD_TEXT_T_CN "雲服務" -#define CLOUD_BIND_T_CN "已綁定" -#define CLOUD_UNBIND_T_CN "解綁" -#define CLOUD_UNBINDING_T_CN "解绑中" -#define CLOUD_DISCONNECTED_T_CN "未連接" -#define CLOUD_UNBINDED_T_CN "未綁定" -#define CLOUD_BINDED_T_CN "已綁定" -#define CLOUD_DISABLE_T_CN "已禁用" - -#define FAN_ADD_TEXT_T_CN "增加" -#define FAN_DEC_TEXT_T_CN "減少" -#define FAN_OPEN_TEXT_T_CN "100%" -#define FAN_HALF_TEXT_T_CN "50%" -#define FAN_CLOSE_TEXT_T_CN "關閉" -#define FAN_TIPS1_TEXT_T_CN "風扇" -#define FAN_TIPS2_TEXT_T_CN "FAN\nClose" - -#define FILAMENT_IN_TEXT_T_CN "進料" -#define FILAMENT_OUT_TEXT_T_CN "退料" -#define FILAMENT_EXT0_TEXT_T_CN "噴頭1" -#define FILAMENT_EXT1_TEXT_T_CN "噴頭2" -#define FILAMENT_HEAT_TEXT_T_CN "預熱" -#define FILAMENT_STOP_TEXT_T_CN "停止" -//#define FILAMENT_CHANGE_TEXT_T_CN "準備換料" -#define FILAMENT_TIPS2_TEXT_T_CN "T:" -#define FILAMENT_TIPS3_TEXT_T_CN "正在進料" -#define FILAMENT_TIPS4_TEXT_T_CN "正在退料" -#define FILAMENT_TIPS5_TEXT_T_CN "溫度太低,請先預熱" -#define FILAMENT_TIPS6_TEXT_T_CN "換料完成" - -#if 0 - #define FILAMENT_REPLAYS_IDLE_TEXT_T_CN "請按<進料>或<退料>進行換料!" - #define FILAMENT_CHANGE_TEXT_T_CN "待打印機暫停后,請按<進料>或<退料>進行換料!" -#endif - - #define FILAMENT_CHANGE_TEXT_T_CN "待打印機暫停后,\n請按<進料>或<退料>" - -#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_T_CN "準備進料,正在加熱,請稍等" -#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_T_CN "準備退料,正在加熱,請稍等" -#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_T_CN "加熱完成,請裝載耗材后,按<確定>開始進料" -#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_T_CN "請裝載耗,按<確定>開始進料!" -#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_T_CN "加熱完成,请按<確定>開始退料!" -#define FILAMENT_DIALOG_LOADING_TIPS_T_CN "正在進料,请等待耗材加載完成!" -#define FILAMENT_DIALOG_UNLOADING_TIPS_T_CN "正在退料,请等待耗材卸載完成!" -#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_T_CN "進料完成,请按<確定>返回" -#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_T_CN "退料完成,请按<確定>返回" - -#define PRE_HEAT_EXT_TEXT_T_CN "噴頭" -#define PRE_HEAT_BED_TEXT_T_CN "熱床" - -#define FILE_LOADING_T_CN "正在載入......" -#define NO_FILE_AND_CHECK_T_CN "無文件!請插入sd卡/u盤!" -#define NO_FILE_T_CN "無文件!" - -#define EXTRUDER_TEMP_TEXT_T_CN "溫度" -#define EXTRUDER_E_LENGTH1_TEXT_T_CN "噴頭" -#define EXTRUDER_E_LENGTH2_TEXT_T_CN "噴頭" -#define EXTRUDER_E_LENGTH3_TEXT_T_CN "噴頭" - -#define ABOUT_TYPE_TEXT_T_CN "Type: " -#define ABOUT_VERSION_TEXT_T_CN "Firmware: " -#define ABOUT_WIFI_TEXT_T_CN "Wifi: " - -#define PRINTING_OPERATION_T_CN "操作" -#define PRINTING_PAUSE_T_CN "暫停" -#define PRINTING_TEMP_T_CN "溫度" -#define PRINTING_CHANGESPEED_T_CN "變速" -#define PRINTING_RESUME_T_CN "恢復" -#define PRINTING_STOP_T_CN "停止" -#define PRINTING_MORE_T_CN "更多" -#define PRINTING_EXTRUDER_T_CN "擠出" -#define PRINTING_MOVE_T_CN "移動" - -#define EXTRUDER_SPEED_T_CN "擠出" -#define MOVE_SPEED_T_CN "移動" -#define EXTRUDER_SPEED_STATE_T_CN "擠出速度" -#define MOVE_SPEED_STATE_T_CN "移動速度" -#define STEP_1PERCENT_T_CN "1%%" -#define STEP_5PERCENT_T_CN "5%%" -#define STEP_10PERCENT_T_CN "10%%" - -#define TITLE_READYPRINT_T_CN "準備打印" -#define TITLE_PREHEAT_T_CN "預熱" -#define TITLE_MOVE_T_CN "移動" -#define TITLE_HOME_T_CN "回零" -#define TITLE_EXTRUDE_T_CN "擠出" -#define TITLE_LEVELING_T_CN "調平" -#define TITLE_SET_T_CN "設置" -#define TITLE_MORE_T_CN "更多" -#define TITLE_CHOOSEFILE_T_CN "選擇文件" -#define TITLE_PRINTING_T_CN "正在打印" -#define TITLE_OPERATION_T_CN "操作" -#define TITLE_ADJUST_T_CN "調整" -#define TITLE_WIRELESS_T_CN "無線網絡" -#define TITLE_FILAMENT_T_CN "換料" -#define TITLE_ABOUT_T_CN "關於" -#define TITLE_FAN_T_CN "風扇" -#define TITLE_LANGUAGE_T_CN "語言" -#define TITLE_PAUSE_T_CN "暫停" -#define TITLE_CHANGESPEED_T_CN "變速" -#define TITLE_CLOUD_TEXT_T_CN "雲服務" -#define TITLE_DIALOG_CONFIRM_T_CN "確認" -#define TITLE_FILESYS_T_CN "文件系統" - -#define AUTO_SHUTDOWN_T_CN "自動關機" -#define MANUAL_SHUTDOWN_T_CN "手動關機" - -#define DIALOG_CONFIRM_T_CN "確定" -#define DIALOG_CANCLE_T_CN "取消" -#define DIALOG_OK_T_CN "確認" -#define DIALOG_RESET_T_CN "重設" -#define DIALOG_RETRY_T_CN "重試" -#define DIALOG_DISABLE_T_CN "禁用" -#define DIALOG_PRINT_MODEL_T_CN "打印模型?" -#define DIALOG_CANCEL_PRINT_T_CN "停止打印?" -#define DIALOG_RETRY_T_CN "重試" -#define DIALOG_STOP_T_CN "停止" -#define DIALOG_REPRINT_FROM_BREAKPOINT_T_CN "從斷點續打?" -//#define DIALOG_UNBIND_PRINTER_T_CN "解除綁定?" -#define DIALOG_ERROR_TIPS1_T_CN "錯誤:找不到文件,請插入sd卡/u盤!" -#define DIALOG_ERROR_TIPS2_T_CN "錯誤:通信失敗,請檢查波特率或主板硬件!" -#define DIALOG_ERROR_TIPS3_T_CN "錯誤:文件名或文件路徑太長!" -#define DIALOG_CLOSE_MACHINE_T_CN "正在關機......" -#define DIALOG_UNBIND_PRINTER_T_CN "解除綁定?" -#define DIALOG_FILAMENT_NO_PRESS_T_CN "請先裝載耗材!" -#define DIALOG_PRINT_FINISH_T_CN "打印完成!" -#define DIALOG_PRINT_TIME_T_CN "打印時間: " -#define DIALOG_REPRINT_T_CN "再打印壹次" -#define DIALOG_WIFI_ENABLE_TIPS_T_CN "wifi模塊正在配置中,請稍等......" - -#define TEXT_VALUE_T_CN "%d℃/%d℃" -#define EXTRUDE_TEXT_VALUE_T_T_CN ": %d℃" -#define WIFI_RECONNECT_TEXT_T_CN "重新連接" - -#define MESSAGE_PAUSING_T_CN "暫停中..." -#define MESSAGE_CHANGING_T_CN "等待換料開始..." -#define MESSAGE_UNLOAD_T_CN "退料中,請稍等..." -#define MESSAGE_WAITING_T_CN "點擊按鈕恢復打印" -#define MESSAGE_INSERT_T_CN "裝載耗材後,點擊按鈕開始打印" -#define MESSAGE_LOAD_T_CN "進料中,請稍等..." -#define MESSAGE_PURGE_T_CN "等待擠出..." -#define MESSAGE_RESUME_T_CN "等待恢復打印..." -#define MESSAGE_HEAT_T_CN "按下按鈕,加熱噴頭" -#define MESSAGE_HEATING_T_CN "噴頭加熱中,請等待..." -#define MESSAGE_OPTION_T_CN "擠出更多還是繼續打印" -#define MESSAGE_PURGE_MORE_T_CN "擠出" -#define MESSAGE_CONTINUE_PRINT_T_CN "打印" - -#define EEPROM_SETTINGS_TITLE_T_CN "EEPROM 設置" -#define EEPROM_SETTINGS_STORE_T_CN "保存參數至EEPROM" -#define EEPROM_SETTINGS_READ_T_CN "讀取EEPROM參數" -#define EEPROM_SETTINGS_REVERT_T_CN "恢復默認參數" - -#define EEPROM_STORE_TIPS_T_CN "是否保存參數到EEPROM?" -#define EEPROM_READ_TIPS_T_CN "是否使用EEPROM參數?" -#define EEPROM_REVERT_TIPS_T_CN "是否恢復默認參數?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp deleted file mode 100644 index 5a8c498608..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ /dev/null @@ -1,525 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * @file tft_lvgl_configuration.cpp - * @date 2020-02-21 - */ - -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "SPI_TFT.h" - -#include "tft_lvgl_configuration.h" -#include "draw_ready_print.h" - -#include "pic_manager.h" -#include "mks_hardware_test.h" -#include "draw_ui.h" -#include "SPIFlashStorage.h" -#include - -#include "../../../../MarlinCore.h" -#include "../../../../inc/MarlinConfig.h" - -#include HAL_PATH(../../HAL, tft/xpt2046.h) -#include "../../../ultralcd.h" -XPT2046 touch; - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" -#endif - -#include - -#ifndef TFT_WIDTH - #define TFT_WIDTH 480 -#endif -#ifndef TFT_HEIGHT - #define TFT_HEIGHT 320 -#endif - -#if HAS_SPI_FLASH_FONT - extern void init_gb2312_font(); -#endif - -static lv_disp_buf_t disp_buf; -lv_group_t* g; -#if ENABLED(SDSUPPORT) - extern void UpdateAssets(); -#endif -uint16_t DeviceCode = 0x9488; -extern uint8_t sel_id; - -extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg; - -uint8_t bmp_public_buf[17 * 1024]; - -void SysTick_Callback() { - lv_tick_inc(1); - print_time_count(); - #if ENABLED(USE_WIFI_FUNCTION) - if (tips_disp.timer == TIPS_TIMER_START) { - tips_disp.timer_count++; - } - #endif - if (uiCfg.filament_loading_time_flg == 1) { - uiCfg.filament_loading_time_cnt++; - uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_loading_time_cnt / (uiCfg.filament_loading_time * 1000.0)) * 100.0) + 0.5); - if (uiCfg.filament_loading_time_cnt >= (uiCfg.filament_loading_time * 1000)) { - uiCfg.filament_loading_time_cnt = 0; - uiCfg.filament_loading_time_flg = 0; - uiCfg.filament_loading_completed = 1; - } - } - if (uiCfg.filament_unloading_time_flg == 1) { - uiCfg.filament_unloading_time_cnt++; - uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_unloading_time_cnt / (uiCfg.filament_unloading_time * 1000.0)) * 100.0) + 0.5); - if (uiCfg.filament_unloading_time_cnt >= (uiCfg.filament_unloading_time * 1000)) { - uiCfg.filament_unloading_time_cnt = 0; - uiCfg.filament_unloading_time_flg = 0; - uiCfg.filament_unloading_completed = 1; - uiCfg.filament_rate = 100; - } - } -} - -extern uint8_t bmp_public_buf[17 * 1024]; - -void tft_lvgl_init() { - - //uint16_t test_id=0; - W25QXX.init(SPI_QUARTER_SPEED); - //test_id=W25QXX.W25QXX_ReadID(); - - gCfgItems_init(); - ui_cfg_init(); - disp_language_init(); - - //init tft first! - SPI_TFT.spi_init(SPI_FULL_SPEED); - SPI_TFT.LCD_init(); - - //spi_flash_read_test(); - #if ENABLED(SDSUPPORT) - watchdog_refresh(); - UpdateAssets(); - #endif - - watchdog_refresh(); - mks_test_get(); - - touch.Init(); - - lv_init(); - - lv_disp_buf_init(&disp_buf, bmp_public_buf, NULL, LV_HOR_RES_MAX * 18); /*Initialize the display buffer*/ - - lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ - lv_disp_drv_init(&disp_drv); /*Basic initialization*/ - disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/ - disp_drv.buffer = &disp_buf; /*Assign the buffer to the display*/ - lv_disp_drv_register(&disp_drv); /*Finally register the driver*/ - - lv_indev_drv_t indev_drv; - lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/ - indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/ - indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/ - lv_indev_drv_register(&indev_drv); /*Finally register the driver*/ - - #if HAS_ROTARY_ENCODER - g = lv_group_create(); - lv_indev_drv_t enc_drv; - lv_indev_drv_init(&enc_drv); - enc_drv.type = LV_INDEV_TYPE_ENCODER; - enc_drv.read_cb = my_mousewheel_read; - lv_indev_t * enc_indev = lv_indev_drv_register(&enc_drv); - lv_indev_set_group(enc_indev, g); - #endif - - lv_fs_drv_t spi_flash_drv; - lv_fs_drv_init(&spi_flash_drv); - spi_flash_drv.letter = 'F'; - spi_flash_drv.open_cb = spi_flash_open_cb; - spi_flash_drv.close_cb = spi_flash_close_cb; - spi_flash_drv.read_cb = spi_flash_read_cb; - spi_flash_drv.seek_cb = spi_flash_seek_cb; - spi_flash_drv.tell_cb = spi_flash_tell_cb; - lv_fs_drv_register(&spi_flash_drv); - - lv_fs_drv_t sd_drv; - lv_fs_drv_init(&sd_drv); - sd_drv.letter = 'S'; - sd_drv.open_cb = sd_open_cb; - sd_drv.close_cb = sd_close_cb; - sd_drv.read_cb = sd_read_cb; - sd_drv.seek_cb = sd_seek_cb; - sd_drv.tell_cb = sd_tell_cb; - lv_fs_drv_register(&sd_drv); - - systick_attach_callback(SysTick_Callback); - - #if HAS_SPI_FLASH_FONT - init_gb2312_font(); - #endif - - tft_style_init(); - - filament_pin_setup(); - - lv_encoder_pin_init(); - - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.load(); - if (recovery.valid()) { - if (gCfgItems.from_flash_pic == 1) - flash_preview_begin = 1; - else - default_preview_flg = 1; - - uiCfg.print_state = REPRINTING; - - ZERO(public_buf_m); - strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m)); - card.printLongPath(public_buf_m); - - strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id])); - - lv_draw_printing(); - } - else - #endif - lv_draw_ready_print(); - - if (mks_test_flag == 0x1E) - mks_gpio_test(); -} - -void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { - uint16_t i, width, height; - - width = area->x2 - area->x1 + 1; - height = area->y2 - area->y1 + 1; - - SPI_TFT.setWindow((uint16_t)area->x1, (uint16_t)area->y1, width, height); - for (i = 0; i < height; i++) { - SPI_TFT.tftio.WriteSequence((uint16_t*)(color_p + width * i), width); - } - lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ - - W25QXX.init(SPI_QUARTER_SPEED); -} - -#define TICK_CYCLE 1 - -unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { - return TICK_CYCLE * (lastTick <= curTick ? (curTick - lastTick) : (0xFFFFFFFF - lastTick + curTick)); -} - -static bool get_point(int16_t *x, int16_t *y) { - bool is_touched = touch.getRawPoint(x, y); - - if (is_touched) { - *x = int16_t((int32_t(*x) * XPT2046_X_CALIBRATION) >> 16) + XPT2046_X_OFFSET; - *y = int16_t((int32_t(*y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; - } - - #if (TFT_ROTATION & TFT_ROTATE_180) - *x = int16_t((TFT_WIDTH) - (int)(*x)); - *y = int16_t((TFT_HEIGHT) - (int)(*y)); - #endif - - return is_touched; -} - -bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { - static int16_t last_x = 0, last_y = 0; - static uint8_t last_touch_state = LV_INDEV_STATE_REL; - static int32_t touch_time1 = 0; - uint32_t tmpTime, diffTime = 0; - - tmpTime = millis(); - diffTime = getTickDiff(tmpTime, touch_time1); - /*Save the state and save the pressed coordinate*/ - //data->state = TOUCH_PressValid(last_x, last_y) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; - //if (data->state == LV_INDEV_STATE_PR) ADS7843_Rd_Addata((u16 *)&last_x, (u16 *)&last_y); - //touchpad_get_xy(&last_x, &last_y); - /*Save the pressed coordinates and the state*/ - if (diffTime > 20) { - if (get_point(&last_x, &last_y)) { - - if (last_touch_state == LV_INDEV_STATE_PR) return false; - data->state = LV_INDEV_STATE_PR; - - // Set the coordinates (if released use the last-pressed coordinates) - - data->point.x = last_x; - data->point.y = last_y; - - last_x = last_y = 0; - last_touch_state = LV_INDEV_STATE_PR; - } - else { - if (last_touch_state == LV_INDEV_STATE_PR) - data->state = LV_INDEV_STATE_REL; - last_touch_state = LV_INDEV_STATE_REL; - } - - touch_time1 = tmpTime; - } - - return false; // Return `false` since no data is buffering or left to read -} - -int16_t enc_diff = 0; -lv_indev_state_t state = LV_INDEV_STATE_REL; - -bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { - (void) indev_drv; /*Unused*/ - - data->state = state; - data->enc_diff = enc_diff; - enc_diff = 0; - - return false; /*No more data to read so return false*/ -} - -extern uint8_t currentFlashPage; - -//spi_flash -uint32_t pic_read_base_addr = 0, pic_read_addr_offset = 0; -lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { - static char last_path_name[30]; - if (strcasecmp(last_path_name,path) != 0) { - pic_read_base_addr = lv_get_pic_addr((uint8_t *)path); - ZERO(last_path_name); - strcpy(last_path_name,path); - } - else { - W25QXX.init(SPI_QUARTER_SPEED); - currentFlashPage = 0; - } - pic_read_addr_offset = pic_read_base_addr; - return LV_FS_RES_OK; -} - -lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p) { - lv_fs_res_t res = LV_FS_RES_OK; - /* Add your code here*/ - pic_read_addr_offset = pic_read_base_addr; - return res; -} - -lv_fs_res_t spi_flash_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) { - lv_pic_test((uint8_t *)buf, pic_read_addr_offset, btr); - *br = btr; - return LV_FS_RES_OK; -} - -lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos) { - #if HAS_SPI_FLASH_COMPRESSION - if (pos == 4) { - uint8_t bmp_header[4]; - SPIFlash.beginRead(pic_read_base_addr); - SPIFlash.readData(bmp_header, 4); - currentFlashPage = 1; - } - pic_read_addr_offset = pic_read_base_addr; - #else - pic_read_addr_offset = pic_read_base_addr + pos; - #endif - return LV_FS_RES_OK; -} - -lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { - *pos_p = pic_read_addr_offset - pic_read_base_addr; - return LV_FS_RES_OK; -} - -//sd -char *cur_namefff; -uint32_t sd_read_base_addr = 0,sd_read_addr_offset = 0; -lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { - //cur_namefff = strrchr(path, '/'); - char name_buf[100]; - ZERO(name_buf); - strcat(name_buf,"/"); - strcat(name_buf,path); - char *temp = strstr(name_buf,".bin"); - if (temp) { strcpy(temp,".GCO"); } - sd_read_base_addr = lv_open_gcode_file((char *)name_buf); - sd_read_addr_offset = sd_read_base_addr; - if (sd_read_addr_offset == 0) return LV_FS_RES_NOT_EX; - return LV_FS_RES_OK; -} - -lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p) { - /* Add your code here*/ - lv_close_gcode_file(); - return LV_FS_RES_OK; -} - -lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) { - if (btr == 200) { - lv_gcode_file_read((uint8_t *)buf); - //pic_read_addr_offset += 208; - *br = 200; - } - else if (btr == 4) { - uint8_t header_pic[4] = { 0x04, 0x90, 0x81, 0x0C }; - memcpy(buf, header_pic, 4); - //pic_read_addr_offset += 4; - *br = 4; - } - return LV_FS_RES_OK; -} - -lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos) { - sd_read_addr_offset = sd_read_base_addr + (pos - 4) / 200 * 409; - lv_gcode_file_seek(sd_read_addr_offset); - return LV_FS_RES_OK; -} - -lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { - if (sd_read_addr_offset) *pos_p = 0; - else *pos_p = (sd_read_addr_offset - sd_read_base_addr) / 409 * 200 + 4; - return LV_FS_RES_OK; -} - -void lv_encoder_pin_init() { - #if 1 // HAS_DIGITAL_BUTTONS - - #if BUTTON_EXISTS(EN1) - SET_INPUT_PULLUP(BTN_EN1); - #endif - #if BUTTON_EXISTS(EN2) - SET_INPUT_PULLUP(BTN_EN2); - #endif - #if BUTTON_EXISTS(ENC) - SET_INPUT_PULLUP(BTN_ENC); - #endif - - #if BUTTON_EXISTS(BACK) - SET_INPUT_PULLUP(BTN_BACK); - #endif - - #if BUTTON_EXISTS(UP) - SET_INPUT(BTN_UP); - #endif - #if BUTTON_EXISTS(DWN) - SET_INPUT(BTN_DWN); - #endif - #if BUTTON_EXISTS(LFT) - SET_INPUT(BTN_LFT); - #endif - #if BUTTON_EXISTS(RT) - SET_INPUT(BTN_RT); - #endif - - #endif // HAS_DIGITAL_BUTTONS -} - -#if 1 // HAS_ENCODER_ACTION - - //static const int8_t encoderDirection = 1; - //static int16_t enc_Direction; - void lv_update_encoder() { - static uint32_t encoder_time1; - uint32_t tmpTime, diffTime = 0; - tmpTime = millis(); - diffTime = getTickDiff(tmpTime, encoder_time1); - if (diffTime > 50) { - - #if HAS_ENCODER_WHEEL - - #if ANY_BUTTON(EN1, EN2, ENC, BACK) - - uint8_t newbutton = 0; - - #if BUTTON_EXISTS(EN1) - if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; - #endif - #if BUTTON_EXISTS(EN2) - if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; - #endif - #if BUTTON_EXISTS(ENC) - if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; - #endif - #if BUTTON_EXISTS(BACK) - if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; - #endif - - #else - - constexpr uint8_t newbutton = 0; - - #endif - - static uint8_t buttons = 0; - buttons = newbutton; - static uint8_t lastEncoderBits; - - #define encrot0 0 - #define encrot1 1 - #define encrot2 2 - - // Manage encoder rotation - //#define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: enc_Direction += encoderDirection; break; case _E2: enc_Direction -= encoderDirection; } - - uint8_t enc = 0; - if (buttons & EN_A) enc |= B01; - if (buttons & EN_B) enc |= B10; - if (enc != lastEncoderBits) { - switch (enc) { - case encrot1: - if (lastEncoderBits == encrot0) { - enc_diff--; - encoder_time1 = tmpTime; - } - break; - case encrot2: - if (lastEncoderBits == encrot0) { - enc_diff++; - encoder_time1 = tmpTime; - } - break; - } - lastEncoderBits = enc; - } - static uint8_t last_button_state = LV_INDEV_STATE_REL; - const uint8_t enc_c = (buttons & EN_C) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; - if (enc_c != last_button_state) { - state = enc_c ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; - - last_button_state = enc_c; - } - - #endif // HAS_ENCODER_WHEEL - - } // next_button_update_ms - } - -#endif // HAS_ENCODER_ACTION - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h deleted file mode 100644 index 727ab33aea..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * @file lcd/extui/lib/mks_ui/tft_lvgl_configuration.h - * @date 2020-02-21 - */ - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#include - -//#define TFT_ROTATION TFT_ROTATE_180 -#define USE_WIFI_FUNCTION 0 - -extern void tft_lvgl_init(); -extern void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); -extern bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); -extern bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); - -extern void LCD_Clear(uint16_t Color); -extern void tft_set_point(uint16_t x, uint16_t y, uint16_t point); -extern void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh); -extern void LCD_WriteRAM_Prepare(void); -extern void lcd_draw_logo(); -extern void lv_encoder_pin_init(); -extern void lv_update_encoder(); - -extern lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); -extern lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p); -extern lv_fs_res_t spi_flash_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -extern lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); -extern lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); - -extern lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); -extern lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p); -extern lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -extern lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); -extern lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp deleted file mode 100644 index e230195eab..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ /dev/null @@ -1,2631 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "../../../../MarlinCore.h" - -#include "draw_ui.h" -#include "tft_multi_language.h" - -// ********************************************* // - -common_menu_def common_menu; -main_menu_def main_menu; -preheat_menu_def preheat_menu; -move_menu_def move_menu; -home_menu_def home_menu; -file_menu_def file_menu; -extrude_menu_def extrude_menu; -leveling_menu_def leveling_menu; -set_menu_def set_menu; -more_menu_def more_menu; -wifi_menu_def wifi_menu; -cloud_menu_def cloud_menu; -about_menu_def about_menu; -fan_menu_def fan_menu; -filament_menu_def filament_menu; -printing_menu_def printing_menu; -operation_menu_def operation_menu; -pause_menu_def pause_menu; -speed_menu_def speed_menu; -printing_more_menu_def printing_more_menu; -dialog_menu_def dialog_menu; -language_menu_def language_menu; -print_file_dialog_menu_def print_file_dialog_menu; -filesys_menu_def filesys_menu; -tool_menu_def tool_menu; -MachinePara_menu_def MachinePara_menu; -pause_msg_def pause_msg_menu; -eeprom_def eeprom_menu; - -machine_common_def machine_menu; -void machine_setting_disp() { - if (gCfgItems.language == LANG_SIMPLE_CHINESE) { - MachinePara_menu.title = MACHINE_PARA_TITLE_CN; - MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_CN; - MachinePara_menu.MotorSetting = MOTOR_CONFIG_CN; - MachinePara_menu.leveling = MACHINE_LEVELING_CONFIG_CN; - MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_CN; - - machine_menu.default_value = DEFAULT_CN; - machine_menu.next = NEXT_CN; - machine_menu.previous = PREVIOUS_CN; - - machine_menu.MachineConfigTitle = MACHINE_CONFIG_TITLE_CN; - machine_menu.MachineType = MACHINE_TYPE_CN; - machine_menu.Stroke = MACHINE_STROKE_CN; - machine_menu.HomeDir = MACHINE_HOMEDIR_CN; - machine_menu.EndStopType = MACHINE_ENDSTOP_TYPE_CN; - machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_CN; - - machine_menu.MachineTypeConfTitle = MACHINE_TYPE_CONFIG_TITLE_CN; - machine_menu.xyz = MACHINE_TYPE_XYZ_CN; - machine_menu.delta = MACHINE_TYPE_DELTA_CN; - machine_menu.corexy = MACHINE_TYPE_COREXY_CN; - - machine_menu.StrokeConfTitle = MACHINE_STROKE_CONF_TITLE_CN; - machine_menu.xStroke = X_MAX_LENGTH_CN; - machine_menu.yStroke = Y_MAX_LENGTH_CN; - machine_menu.zStroke = Z_MAX_LENGTH_CN; - - machine_menu.xmin = X_MIN_LENGTH_CN; - machine_menu.ymin = Y_MIN_LENGTH_CN; - machine_menu.zmin = Z_MIN_LENGTH_CN; - - machine_menu.HomeDirConfTitle = HOME_DIR_CONF_TITLE_CN; - machine_menu.xHomeDir = HOME_DIR_X_CN; - machine_menu.yHomeDir = HOME_DIR_Y_CN; - machine_menu.zHomeDir = HOME_DIR_Z_CN; - machine_menu.min = HOME_MIN_CN; - machine_menu.max = HOME_MAX_CN; - - machine_menu.EndstopConfTitle = ENDSTOP_CONF_TITLE_CN; - machine_menu.xEndstop_min = MIN_ENDSTOP_X_CN; - machine_menu.yEndstop_min = MIN_ENDSTOP_Y_CN; - machine_menu.zEndstop_min = MIN_ENDSTOP_Z_CN; - machine_menu.xEndstop_max = MAX_ENDSTOP_X_CN; - machine_menu.yEndstop_max = MAX_ENDSTOP_Y_CN; - machine_menu.zEndstop_max = MAX_ENDSTOP_Z_CN; - machine_menu.FilamentEndstop = ENDSTOP_FIL_CN; - machine_menu.LevelingEndstop = ENDSTOP_LEVEL_CN; - machine_menu.opened = ENDSTOP_OPENED_CN; - machine_menu.closed = ENDSTOP_CLOSED_CN; - - machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_CN; - machine_menu.InLength = FILAMENT_IN_LENGTH_CN; - machine_menu.InSpeed = FILAMENT_IN_SPEED_CN; - machine_menu.FilamentTemperature = FILAMENT_TEMPERATURE_CN; - machine_menu.OutLength = FILAMENT_OUT_LENGTH_CN; - machine_menu.OutSpeed = FILAMENT_OUT_SPEED_CN; - - machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_CN; - machine_menu.LevelingParaConf = LEVELING_PARA_CONF_CN; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_CN; - machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_CN; - machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_CN; - - machine_menu.LevelingSubConfTitle = LEVELING_PARA_CONF_TITLE_CN; - machine_menu.AutoLevelEnable = AUTO_LEVELING_ENABLE_CN; - machine_menu.BLtouchEnable = BLTOUCH_LEVELING_ENABLE_CN; - machine_menu.ProbePort = PROBE_PORT_CN; - machine_menu.ProbeXoffset = PROBE_X_OFFSET_CN; - machine_menu.ProbeYoffset = PROBE_Y_OFFSET_CN; - machine_menu.ProbeZoffset = PROBE_Z_OFFSET_CN; - machine_menu.ProbeXYspeed = PROBE_XY_SPEED_CN; - machine_menu.ProbeZspeed = PROBE_Z_SPEED_CN; - machine_menu.enable = ENABLE_CN; - machine_menu.disable = DISABLE_CN; - machine_menu.z_min = Z_MIN_CN; - machine_menu.z_max = Z_MAX_CN; - - machine_menu.LevelingSubDeltaConfTitle = DELTA_LEVEL_CONF_TITLE_CN; - machine_menu.MachineRadius = DELTA_MACHINE_RADIUS_CN; - machine_menu.DiagonalRod = DELTA_DIAGONAL_ROD_CN; - machine_menu.PrintableRadius = DELTA_PRINT_RADIUS_CN; - machine_menu.DeltaHeight = DELTA_HEIGHT_CN; - machine_menu.SmoothRodOffset = SMOOTH_ROD_OFFSET_CN; - machine_menu.EffectorOffset = EFFECTOR_OFFSET_CN; - machine_menu.CalibrationRadius = CALIBRATION_RADIUS_CN; - - machine_menu.LevelingSubXYZConfTitle = XYZ_LEVEL_CONF_TITLE_CN; - // machine_menu.ProbeMaxLeft=PROBE_REACH_MAX_LEFT_CN; - // machine_menu.ProbeMaxRigh=PROBE_REACH_MAX_RIGHT_CN; - // machine_menu.ProbeMaxfront=PROBE_REACH_MAX_FRONT_CN; - // machine_menu.ProbeMaxback=PROBE_REACH_MAX_BACK_CN; - - machine_menu.TemperatureConfTitle = TEMPERATURE_CONF_TITLE_CN; - machine_menu.NozzleConf = NOZZLE_CONF_CN; - machine_menu.HotBedConf = HOTBED_CONF_CN; - machine_menu.PreheatTemperConf = PREHEAT_TEMPER_CN; - - machine_menu.NozzleConfTitle = NOZZLE_CONF_TITLE_CN; - machine_menu.NozzleCnt = NOZZLECNT_CN; - machine_menu.NozzleType = NOZZLE_TYPE_CN; - machine_menu.NozzleAdjustType = NOZZLE_ADJUST_TYPE_CN; - machine_menu.NozzleMinTemperature = NOZZLE_MIN_TEMPERATURE_CN; - machine_menu.NozzleMaxTemperature = NOZZLE_MAX_TEMPERATURE_CN; - machine_menu.Extrude_Min_Temper = EXTRUD_MIN_TEMPER_CN; - - // machine_menu.HotbedEnable=HOTBED_ENABLE_CN; - machine_menu.HotbedConfTitle = HOTBED_CONF_TITLE_CN; - machine_menu.HotbedAjustType = HOTBED_ADJUST_CN; - machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_CN; - machine_menu.HotbedMaxTemperature = HOTBED_MAX_TEMPERATURE_CN; - - machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_CN; - machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_CN; - machine_menu.AccelerationConf = ACCELERATION_CONF_CN; - machine_menu.JerkConf = JERKCONF_CN; - machine_menu.StepsConf = STEPSCONF_CN; - machine_menu.TMCcurrentConf = TMC_CURRENT_CN; - machine_menu.TMCStepModeConf = TMC_STEP_MODE_CN; - machine_menu.MotorDirConf = MOTORDIRCONF_CN; - machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_CN; - machine_menu.PausePosition = PAUSE_POSITION_CN; - machine_menu.WifiSettings = WIFI_SETTINGS_CN; - machine_menu.HomingSensitivityConf = HOMING_SENSITIVITY_CONF_CN; - machine_menu.EncoderSettings = ENCODER_SETTINGS_CN; - - machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_CN; - machine_menu.XMaxFeedRate = X_MAXFEEDRATE_CN; - machine_menu.YMaxFeedRate = Y_MAXFEEDRATE_CN; - machine_menu.ZMaxFeedRate = Z_MAXFEEDRATE_CN; - machine_menu.E0MaxFeedRate = E0_MAXFEEDRATE_CN; - machine_menu.E1MaxFeedRate = E1_MAXFEEDRATE_CN; - - machine_menu.AccelerationConfTitle = ACCELERATION_CONF_TITLE_CN; - machine_menu.PrintAcceleration = PRINT_ACCELERATION_CN; - machine_menu.RetractAcceleration = RETRACT_ACCELERATION_CN; - machine_menu.TravelAcceleration = TRAVEL_ACCELERATION_CN; - machine_menu.X_Acceleration = X_ACCELERATION_CN; - machine_menu.Y_Acceleration = Y_ACCELERATION_CN; - machine_menu.Z_Acceleration = Z_ACCELERATION_CN; - machine_menu.E0_Acceleration = E0_ACCELERATION_CN; - machine_menu.E1_Acceleration = E1_ACCELERATION_CN; - - machine_menu.JerkConfTitle = JERK_CONF_TITLE_CN; - machine_menu.X_Jerk = X_JERK_CN; - machine_menu.Y_Jerk = Y_JERK_CN; - machine_menu.Z_Jerk = Z_JERK_CN; - machine_menu.E_Jerk = E_JERK_CN; - - machine_menu.StepsConfTitle = STEPS_CONF_TITLE_CN; - machine_menu.X_Steps = X_STEPS_CN; - machine_menu.Y_Steps = Y_STEPS_CN; - machine_menu.Z_Steps = Z_STEPS_CN; - machine_menu.E0_Steps = E0_STEPS_CN; - machine_menu.E1_Steps = E1_STEPS_CN; - - machine_menu.TmcCurrentConfTitle = TMC_CURRENT_CONF_TITLE_CN; - machine_menu.X_Current = X_TMC_CURRENT_CN; - machine_menu.Y_Current = Y_TMC_CURRENT_CN; - machine_menu.Z_Current = Z_TMC_CURRENT_CN; - machine_menu.E0_Current = E0_TMC_CURRENT_CN; - machine_menu.E1_Current = E1_TMC_CURRENT_CN; - - machine_menu.TmcStepModeConfTitle = TMC_MODE_CONF_TITLE_CN; - machine_menu.X_StepMode = X_TMC_MODE_CN; - machine_menu.Y_StepMode = Y_TMC_MODE_CN; - machine_menu.Z_StepMode = Z_TMC_MODE_CN; - machine_menu.E0_StepMode = E0_TMC_MODE_CN; - machine_menu.E1_StepMode = E1_TMC_MODE_CN; - - machine_menu.MotorDirConfTitle = MOTORDIR_CONF_TITLE_CN; - machine_menu.X_MotorDir = X_MOTORDIR_CN; - machine_menu.Y_MotorDir = Y_MOTORDIR_CN; - machine_menu.Z_MotorDir = Z_MOTORDIR_CN; - machine_menu.E0_MotorDir = E0_MOTORDIR_CN; - machine_menu.E1_MotorDir = E1_MOTORDIR_CN; - machine_menu.Invert_0 = INVERT_P_CN; - machine_menu.Invert_1 = INVERT_N_CN; - - machine_menu.HomeFeedRateConfTitle = HOMEFEEDRATE_CONF_TITLE_CN; - machine_menu.XY_HomeFeedRate = X_HOMESPEED_CN; - // machine_menu.Y_HomeFeedRate=Y_HOMESPEED_CN; - machine_menu.Z_HomeFeedRate = Z_HOMESPEED_CN; - - machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_CN; - machine_menu.PwrOffDection = PWROFF_DECTION_CN; - machine_menu.PwrOffAfterPrint = PWROFF_AFTER_PRINT_CN; - machine_menu.HaveUps = HAVE_UPS_CN; - machine_menu.Z2andZ2Endstop = Z2_AND_Z2ENDSTOP_CONF_CN; - machine_menu.EnablePinsInvert = ENABLE_PINS_CONF_CN; - - machine_menu.Z2ConfTitle = Z2_AND_Z2ENDSTOP_CONF_TITLE_CN; - machine_menu.Z2Enable = Z2_ENABLE_CN; - machine_menu.Z2EndstopEnable = Z2_ENDSTOP_CN; - machine_menu.Z2Port = Z2_PORT_CN; - - machine_menu.EnablePinsInvertTitle = ENABLE_PINS_CONF_TITLE_CN; - machine_menu.XInvert = X_ENABLE_PINS_INVERT_CN; - machine_menu.YInvert = Y_ENABLE_PINS_INVERT_CN; - machine_menu.ZInvert = Z_ENABLE_PINS_INVERT_CN; - machine_menu.EInvert = E_ENABLE_PINS_INVERT_CN; - - machine_menu.key_back = KEY_BACK_CN; - machine_menu.key_reset = KEY_REST_CN; - machine_menu.key_confirm = KEY_CONFIRM_CN; - - machine_menu.PausePosText = PAUSE_POSITION_CN; - machine_menu.xPos = PAUSE_POSITION_X_CN; - machine_menu.yPos = PAUSE_POSITION_Y_CN; - machine_menu.zPos = PAUSE_POSITION_Z_CN; - machine_menu.WifiConfTitle = WIFI_SETTINGS_TITLE_CN; - machine_menu.wifiMode = WIFI_SETTINGS_MODE_CN; - machine_menu.wifiName = WIFI_SETTINGS_NAME_CN; - machine_menu.wifiPassWord = WIFI_SETTINGS_PASSWORD_CN; - machine_menu.wifiCloud = WIFI_SETTINGS_CLOUD_CN; - machine_menu.wifiConfig = WIFI_SETTINGS_CONFIG_CN; - machine_menu.wifiEdit = WIFI_SETTINGS_EDIT_CN; - machine_menu.wifiConfigTips = WIFI_CONFIG_TIPS_CN; - - machine_menu.OffsetConfTitle = OFFSET_TITLE_CN; - machine_menu.Xoffset = OFFSET_X_CN; - machine_menu.Yoffset = OFFSET_Y_CN; - machine_menu.Zoffset = OFFSET_Z_CN; - - machine_menu.HomingSensitivityConfTitle = HOMING_SENSITIVITY_CONF_TITLE_CN; - machine_menu.X_Sensitivity = X_SENSITIVITY_CN; - machine_menu.Y_Sensitivity = Y_SENSITIVITY_CN; - machine_menu.Z_Sensitivity = Z_SENSITIVITY_CN; - machine_menu.Z2_Sensitivity = Z2_SENSITIVITY_CN; - - machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_CN; - machine_menu.EncoderConfText = ENCODER_CONF_TEXT_CN; - } - else if (gCfgItems.language == LANG_COMPLEX_CHINESE) { - MachinePara_menu.title = MACHINE_PARA_TITLE_T_CN; - MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_T_CN; - MachinePara_menu.MotorSetting = MOTOR_CONFIG_T_CN; - MachinePara_menu.leveling = MACHINE_LEVELING_CONFIG_T_CN; - MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_T_CN; - - machine_menu.default_value = DEFAULT_T_CN; - machine_menu.next = NEXT_T_CN; - machine_menu.previous = PREVIOUS_T_CN; - - machine_menu.MachineConfigTitle = MACHINE_CONFIG_TITLE_T_CN; - machine_menu.MachineType = MACHINE_TYPE_T_CN; - machine_menu.Stroke = MACHINE_STROKE_T_CN; - machine_menu.HomeDir = MACHINE_HOMEDIR_T_CN; - machine_menu.EndStopType = MACHINE_ENDSTOP_TYPE_T_CN; - machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_T_CN; - - machine_menu.MachineTypeConfTitle = MACHINE_TYPE_CONFIG_TITLE_T_CN; - machine_menu.xyz = MACHINE_TYPE_XYZ_T_CN; - machine_menu.delta = MACHINE_TYPE_DELTA_T_CN; - machine_menu.corexy = MACHINE_TYPE_COREXY_T_CN; - - machine_menu.StrokeConfTitle = MACHINE_STROKE_CONF_TITLE_T_CN; - machine_menu.xStroke = X_MAX_LENGTH_T_CN; - machine_menu.yStroke = Y_MAX_LENGTH_T_CN; - machine_menu.zStroke = Z_MAX_LENGTH_T_CN; - - machine_menu.xmin = X_MIN_LENGTH_T_CN; - machine_menu.ymin = Y_MIN_LENGTH_T_CN; - machine_menu.zmin = Z_MIN_LENGTH_T_CN; - - machine_menu.HomeDirConfTitle = HOME_DIR_CONF_TITLE_T_CN; - machine_menu.xHomeDir = HOME_DIR_X_T_CN; - machine_menu.yHomeDir = HOME_DIR_Y_T_CN; - machine_menu.zHomeDir = HOME_DIR_Z_T_CN; - machine_menu.min = HOME_MIN_T_CN; - machine_menu.max = HOME_MAX_T_CN; - - machine_menu.EndstopConfTitle = ENDSTOP_CONF_TITLE_T_CN; - machine_menu.xEndstop_min = MIN_ENDSTOP_X_T_CN; - machine_menu.yEndstop_min = MIN_ENDSTOP_Y_T_CN; - machine_menu.zEndstop_min = MIN_ENDSTOP_Z_T_CN; - machine_menu.xEndstop_max = MAX_ENDSTOP_X_T_CN; - machine_menu.yEndstop_max = MAX_ENDSTOP_Y_T_CN; - machine_menu.zEndstop_max = MAX_ENDSTOP_Z_T_CN; - machine_menu.FilamentEndstop = ENDSTOP_FIL_T_CN; - machine_menu.LevelingEndstop = ENDSTOP_LEVEL_T_CN; - machine_menu.opened = ENDSTOP_OPENED_T_CN; - machine_menu.closed = ENDSTOP_CLOSED_T_CN; - - machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_T_CN; - machine_menu.InLength = FILAMENT_IN_LENGTH_T_CN; - machine_menu.InSpeed = FILAMENT_IN_SPEED_T_CN; - machine_menu.FilamentTemperature = FILAMENT_TEMPERATURE_T_CN; - machine_menu.OutLength = FILAMENT_OUT_LENGTH_T_CN; - machine_menu.OutSpeed = FILAMENT_OUT_SPEED_T_CN; - - machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_T_CN; - machine_menu.LevelingParaConf = LEVELING_PARA_CONF_T_CN; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_T_CN; - machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_T_CN; - machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_T_CN; - - machine_menu.LevelingSubConfTitle = LEVELING_PARA_CONF_TITLE_T_CN; - machine_menu.AutoLevelEnable = AUTO_LEVELING_ENABLE_T_CN; - machine_menu.BLtouchEnable = BLTOUCH_LEVELING_ENABLE_T_CN; - machine_menu.ProbePort = PROBE_PORT_T_CN; - machine_menu.ProbeXoffset = PROBE_X_OFFSET_T_CN; - machine_menu.ProbeYoffset = PROBE_Y_OFFSET_T_CN; - machine_menu.ProbeZoffset = PROBE_Z_OFFSET_T_CN; - machine_menu.ProbeXYspeed = PROBE_XY_SPEED_T_CN; - machine_menu.ProbeZspeed = PROBE_Z_SPEED_T_CN; - machine_menu.enable = ENABLE_T_CN; - machine_menu.disable = DISABLE_T_CN; - machine_menu.z_min = Z_MIN_T_CN; - machine_menu.z_max = Z_MAX_T_CN; - - machine_menu.LevelingSubDeltaConfTitle = DELTA_LEVEL_CONF_TITLE_T_CN; - machine_menu.MachineRadius = DELTA_MACHINE_RADIUS_T_CN; - machine_menu.DiagonalRod = DELTA_DIAGONAL_ROD_T_CN; - machine_menu.PrintableRadius = DELTA_PRINT_RADIUS_T_CN; - machine_menu.DeltaHeight = DELTA_HEIGHT_T_CN; - machine_menu.SmoothRodOffset = SMOOTH_ROD_OFFSET_T_CN; - machine_menu.EffectorOffset = EFFECTOR_OFFSET_T_CN; - machine_menu.CalibrationRadius = CALIBRATION_RADIUS_T_CN; - - machine_menu.LevelingSubXYZConfTitle = XYZ_LEVEL_CONF_TITLE_T_CN; - // machine_menu.ProbeMaxLeft=PROBE_REACH_MAX_LEFT_T_CN; - // machine_menu.ProbeMaxRigh=PROBE_REACH_MAX_RIGHT_T_CN; - // machine_menu.ProbeMaxfront=PROBE_REACH_MAX_FRONT_T_CN; - // machine_menu.ProbeMaxback=PROBE_REACH_MAX_BACK_T_CN; - - machine_menu.TemperatureConfTitle = TEMPERATURE_CONF_TITLE_T_CN; - machine_menu.NozzleConf = NOZZLE_CONF_T_CN; - machine_menu.HotBedConf = HOTBED_CONF_T_CN; - machine_menu.PreheatTemperConf = PREHEAT_TEMPER_T_CN; - - machine_menu.NozzleConfTitle = NOZZLE_CONF_TITLE_T_CN; - machine_menu.NozzleCnt = NOZZLECNT_T_CN; - machine_menu.NozzleType = NOZZLE_TYPE_T_CN; - machine_menu.NozzleAdjustType = NOZZLE_ADJUST_TYPE_T_CN; - machine_menu.NozzleMinTemperature = NOZZLE_MIN_TEMPERATURE_T_CN; - machine_menu.NozzleMaxTemperature = NOZZLE_MAX_TEMPERATURE_T_CN; - machine_menu.Extrude_Min_Temper = EXTRUD_MIN_TEMPER_T_CN; - - // machine_menu.HotbedEnable=HOTBED_ENABLE_T_CN; - machine_menu.HotbedConfTitle = HOTBED_CONF_TITLE_T_CN; - machine_menu.HotbedAjustType = HOTBED_ADJUST_T_CN; - machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_T_CN; - machine_menu.HotbedMaxTemperature = HOTBED_MAX_TEMPERATURE_T_CN; - - machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_T_CN; - machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_T_CN; - machine_menu.AccelerationConf = ACCELERATION_CONF_T_CN; - machine_menu.JerkConf = JERKCONF_T_CN; - machine_menu.StepsConf = STEPSCONF_T_CN; - machine_menu.TMCcurrentConf = TMC_CURRENT_T_CN; - machine_menu.TMCStepModeConf = TMC_STEP_MODE_T_CN; - machine_menu.MotorDirConf = MOTORDIRCONF_T_CN; - machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_T_CN; - machine_menu.PausePosition = PAUSE_POSITION_T_CN; - machine_menu.WifiSettings = WIFI_SETTINGS_T_CN; - machine_menu.HomingSensitivityConf = HOMING_SENSITIVITY_CONF_T_CN; - machine_menu.EncoderSettings = ENCODER_SETTINGS_T_CN; - - machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_T_CN; - machine_menu.XMaxFeedRate = X_MAXFEEDRATE_T_CN; - machine_menu.YMaxFeedRate = Y_MAXFEEDRATE_T_CN; - machine_menu.ZMaxFeedRate = Z_MAXFEEDRATE_T_CN; - machine_menu.E0MaxFeedRate = E0_MAXFEEDRATE_T_CN; - machine_menu.E1MaxFeedRate = E1_MAXFEEDRATE_T_CN; - - machine_menu.AccelerationConfTitle = ACCELERATION_CONF_TITLE_T_CN; - machine_menu.PrintAcceleration = PRINT_ACCELERATION_T_CN; - machine_menu.RetractAcceleration = RETRACT_ACCELERATION_T_CN; - machine_menu.TravelAcceleration = TRAVEL_ACCELERATION_T_CN; - machine_menu.X_Acceleration = X_ACCELERATION_T_CN; - machine_menu.Y_Acceleration = Y_ACCELERATION_T_CN; - machine_menu.Z_Acceleration = Z_ACCELERATION_T_CN; - machine_menu.E0_Acceleration = E0_ACCELERATION_T_CN; - machine_menu.E1_Acceleration = E1_ACCELERATION_T_CN; - - machine_menu.JerkConfTitle = JERK_CONF_TITLE_T_CN; - machine_menu.X_Jerk = X_JERK_T_CN; - machine_menu.Y_Jerk = Y_JERK_T_CN; - machine_menu.Z_Jerk = Z_JERK_T_CN; - machine_menu.E_Jerk = E_JERK_T_CN; - - machine_menu.StepsConfTitle = STEPS_CONF_TITLE_T_CN; - machine_menu.X_Steps = X_STEPS_T_CN; - machine_menu.Y_Steps = Y_STEPS_T_CN; - machine_menu.Z_Steps = Z_STEPS_T_CN; - machine_menu.E0_Steps = E0_STEPS_T_CN; - machine_menu.E1_Steps = E1_STEPS_T_CN; - - machine_menu.TmcCurrentConfTitle = TMC_CURRENT_CONF_TITLE_T_CN; - machine_menu.X_Current = X_TMC_CURRENT_T_CN; - machine_menu.Y_Current = Y_TMC_CURRENT_T_CN; - machine_menu.Z_Current = Z_TMC_CURRENT_T_CN; - machine_menu.E0_Current = E0_TMC_CURRENT_T_CN; - machine_menu.E1_Current = E1_TMC_CURRENT_T_CN; - - machine_menu.TmcStepModeConfTitle = TMC_MODE_CONF_TITLE_T_CN; - machine_menu.X_StepMode = X_TMC_MODE_T_CN; - machine_menu.Y_StepMode = Y_TMC_MODE_T_CN; - machine_menu.Z_StepMode = Z_TMC_MODE_T_CN; - machine_menu.E0_StepMode = E0_TMC_MODE_T_CN; - machine_menu.E1_StepMode = E1_TMC_MODE_T_CN; - - machine_menu.MotorDirConfTitle = MOTORDIR_CONF_TITLE_T_CN; - machine_menu.X_MotorDir = X_MOTORDIR_T_CN; - machine_menu.Y_MotorDir = Y_MOTORDIR_T_CN; - machine_menu.Z_MotorDir = Z_MOTORDIR_T_CN; - machine_menu.E0_MotorDir = E0_MOTORDIR_T_CN; - machine_menu.E1_MotorDir = E1_MOTORDIR_T_CN; - machine_menu.Invert_0 = INVERT_P_T_CN; - machine_menu.Invert_1 = INVERT_N_T_CN; - - machine_menu.HomeFeedRateConfTitle = HOMEFEEDRATE_CONF_TITLE_T_CN; - machine_menu.XY_HomeFeedRate = X_HOMESPEED_T_CN; - // machine_menu.Y_HomeFeedRate=Y_HOMESPEED_T_CN; - machine_menu.Z_HomeFeedRate = Z_HOMESPEED_T_CN; - - machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_T_CN; - machine_menu.PwrOffDection = PWROFF_DECTION_T_CN; - machine_menu.PwrOffAfterPrint = PWROFF_AFTER_PRINT_T_CN; - machine_menu.HaveUps = HAVE_UPS_T_CN; - machine_menu.Z2andZ2Endstop = Z2_AND_Z2ENDSTOP_CONF_T_CN; - machine_menu.EnablePinsInvert = ENABLE_PINS_CONF_T_CN; - - machine_menu.Z2ConfTitle = Z2_AND_Z2ENDSTOP_CONF_TITLE_T_CN; - machine_menu.Z2Enable = Z2_ENABLE_T_CN; - machine_menu.Z2EndstopEnable = Z2_ENDSTOP_T_CN; - machine_menu.Z2Port = Z2_PORT_T_CN; - - machine_menu.EnablePinsInvertTitle = ENABLE_PINS_CONF_TITLE_T_CN; - machine_menu.XInvert = X_ENABLE_PINS_INVERT_T_CN; - machine_menu.YInvert = Y_ENABLE_PINS_INVERT_T_CN; - machine_menu.ZInvert = Z_ENABLE_PINS_INVERT_T_CN; - machine_menu.EInvert = E_ENABLE_PINS_INVERT_T_CN; - - machine_menu.key_back = KEY_BACK_T_CN; - machine_menu.key_reset = KEY_REST_T_CN; - machine_menu.key_confirm = KEY_CONFIRM_T_CN; - // machine_menu.high_level = MOTOR_EN_HIGH_LEVEL_T_CN; - // machine_menu.low_level = MOTOR_EN_LOW_LEVEL_T_CN; - - machine_menu.PausePosText = PAUSE_POSITION_T_CN; - machine_menu.xPos = PAUSE_POSITION_X_T_CN; - machine_menu.yPos = PAUSE_POSITION_Y_T_CN; - machine_menu.zPos = PAUSE_POSITION_Z_T_CN; - - machine_menu.WifiConfTitle = WIFI_SETTINGS_TITLE_T_CN; - machine_menu.wifiMode = WIFI_SETTINGS_MODE_T_CN; - machine_menu.wifiName = WIFI_SETTINGS_NAME_T_CN; - machine_menu.wifiPassWord = WIFI_SETTINGS_PASSWORD_T_CN; - machine_menu.wifiCloud = WIFI_SETTINGS_CLOUD_T_CN; - machine_menu.wifiConfig = WIFI_SETTINGS_CONFIG_T_CN; - machine_menu.wifiEdit = WIFI_SETTINGS_EDIT_T_CN; - machine_menu.wifiConfigTips = WIFI_CONFIG_TIPS_T_CN; - - machine_menu.OffsetConfTitle = OFFSET_TITLE_T_CN; - machine_menu.Xoffset = OFFSET_X_T_CN; - machine_menu.Yoffset = OFFSET_Y_T_CN; - machine_menu.Zoffset = OFFSET_Z_T_CN; - - machine_menu.HomingSensitivityConfTitle = HOMING_SENSITIVITY_CONF_TITLE_T_CN; - machine_menu.X_Sensitivity = X_SENSITIVITY_T_CN; - machine_menu.Y_Sensitivity = Y_SENSITIVITY_T_CN; - machine_menu.Z_Sensitivity = Z_SENSITIVITY_T_CN; - machine_menu.Z2_Sensitivity = Z2_SENSITIVITY_T_CN; - - machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_T_CN; - machine_menu.EncoderConfText = ENCODER_CONF_TEXT_T_CN; - } - else { - MachinePara_menu.title = MACHINE_PARA_TITLE_EN; - MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_EN; - MachinePara_menu.MotorSetting = MOTOR_CONFIG_EN; - MachinePara_menu.leveling = MACHINE_LEVELING_CONFIG_EN; - MachinePara_menu.AdvanceSetting = ADVANCE_CONFIG_EN; - - machine_menu.default_value = DEFAULT_EN; - machine_menu.next = NEXT_EN; - machine_menu.previous = PREVIOUS_EN; - - machine_menu.MachineConfigTitle = MACHINE_CONFIG_TITLE_EN; - machine_menu.MachineType = MACHINE_TYPE_EN; - machine_menu.Stroke = MACHINE_STROKE_EN; - machine_menu.HomeDir = MACHINE_HOMEDIR_EN; - machine_menu.EndStopType = MACHINE_ENDSTOP_TYPE_EN; - machine_menu.FilamentConf = MACHINE_FILAMENT_CONFIG_EN; - - machine_menu.MachineTypeConfTitle = MACHINE_TYPE_CONFIG_TITLE_EN; - machine_menu.xyz = MACHINE_TYPE_XYZ_EN; - machine_menu.delta = MACHINE_TYPE_DELTA_EN; - machine_menu.corexy = MACHINE_TYPE_COREXY_EN; - - machine_menu.StrokeConfTitle = MACHINE_STROKE_CONF_TITLE_EN; - machine_menu.xStroke = X_MAX_LENGTH_EN; - machine_menu.yStroke = Y_MAX_LENGTH_EN; - machine_menu.zStroke = Z_MAX_LENGTH_EN; - - machine_menu.xmin = X_MIN_LENGTH_EN; - machine_menu.ymin = Y_MIN_LENGTH_EN; - machine_menu.zmin = Z_MIN_LENGTH_EN; - - machine_menu.HomeDirConfTitle = HOME_DIR_CONF_TITLE_EN; - machine_menu.xHomeDir = HOME_DIR_X_EN; - machine_menu.yHomeDir = HOME_DIR_Y_EN; - machine_menu.zHomeDir = HOME_DIR_Z_EN; - machine_menu.min = HOME_MIN_EN; - machine_menu.max = HOME_MAX_EN; - - machine_menu.EndstopConfTitle = ENDSTOP_CONF_TITLE_EN; - machine_menu.xEndstop_min = MIN_ENDSTOP_X_EN; - machine_menu.yEndstop_min = MIN_ENDSTOP_Y_EN; - machine_menu.zEndstop_min = MIN_ENDSTOP_Z_EN; - machine_menu.xEndstop_max = MAX_ENDSTOP_X_EN; - machine_menu.yEndstop_max = MAX_ENDSTOP_Y_EN; - machine_menu.zEndstop_max = MAX_ENDSTOP_Z_EN; - machine_menu.FilamentEndstop = ENDSTOP_FIL_EN; - machine_menu.LevelingEndstop = ENDSTOP_LEVEL_EN; - machine_menu.opened = ENDSTOP_OPENED_EN; - machine_menu.closed = ENDSTOP_CLOSED_EN; - - machine_menu.FilamentConfTitle = FILAMENT_CONF_TITLE_EN; - machine_menu.InLength = FILAMENT_IN_LENGTH_EN; - machine_menu.InSpeed = FILAMENT_IN_SPEED_EN; - machine_menu.FilamentTemperature = FILAMENT_TEMPERATURE_EN; - machine_menu.OutLength = FILAMENT_OUT_LENGTH_EN; - machine_menu.OutSpeed = FILAMENT_OUT_SPEED_EN; - - machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_EN; - machine_menu.LevelingParaConf = LEVELING_PARA_CONF_EN; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_EN; - machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_EN; - machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_EN; - - machine_menu.LevelingSubConfTitle = LEVELING_PARA_CONF_TITLE_EN; - machine_menu.AutoLevelEnable = AUTO_LEVELING_ENABLE_EN; - machine_menu.BLtouchEnable = BLTOUCH_LEVELING_ENABLE_EN; - machine_menu.ProbePort = PROBE_PORT_EN; - machine_menu.ProbeXoffset = PROBE_X_OFFSET_EN; - machine_menu.ProbeYoffset = PROBE_Y_OFFSET_EN; - machine_menu.ProbeZoffset = PROBE_Z_OFFSET_EN; - machine_menu.ProbeXYspeed = PROBE_XY_SPEED_EN; - machine_menu.ProbeZspeed = PROBE_Z_SPEED_EN; - machine_menu.enable = ENABLE_EN; - machine_menu.disable = DISABLE_EN; - machine_menu.z_min = Z_MIN_EN; - machine_menu.z_max = Z_MAX_EN; - - machine_menu.LevelingSubDeltaConfTitle = DELTA_LEVEL_CONF_TITLE_EN; - machine_menu.MachineRadius = DELTA_MACHINE_RADIUS_EN; - machine_menu.DiagonalRod = DELTA_DIAGONAL_ROD_EN; - machine_menu.PrintableRadius = DELTA_PRINT_RADIUS_EN; - machine_menu.DeltaHeight = DELTA_HEIGHT_EN; - machine_menu.SmoothRodOffset = SMOOTH_ROD_OFFSET_EN; - machine_menu.EffectorOffset = EFFECTOR_OFFSET_EN; - machine_menu.CalibrationRadius = CALIBRATION_RADIUS_EN; - - machine_menu.LevelingSubXYZConfTitle = XYZ_LEVEL_CONF_TITLE_EN; - // machine_menu.Level_positon=PROBE_REACH_MAX_LEFT_EN; - // machine_menu.ProbeMaxRigh=PROBE_REACH_MAX_RIGHT_EN; - // machine_menu.ProbeMaxfront=PROBE_REACH_MAX_FRONT_EN; - // machine_menu.ProbeMaxback=PROBE_REACH_MAX_BACK_EN; - - machine_menu.TemperatureConfTitle = TEMPERATURE_CONF_TITLE_EN; - machine_menu.NozzleConf = NOZZLE_CONF_EN; - machine_menu.HotBedConf = HOTBED_CONF_EN; - machine_menu.PreheatTemperConf = PREHEAT_TEMPER_EN; - - machine_menu.NozzleConfTitle = NOZZLE_CONF_TITLE_EN; - machine_menu.NozzleCnt = NOZZLECNT_EN; - machine_menu.NozzleType = NOZZLE_TYPE_EN; - machine_menu.NozzleAdjustType = NOZZLE_ADJUST_TYPE_EN; - machine_menu.NozzleMinTemperature = NOZZLE_MIN_TEMPERATURE_EN; - machine_menu.NozzleMaxTemperature = NOZZLE_MAX_TEMPERATURE_EN; - machine_menu.Extrude_Min_Temper = EXTRUD_MIN_TEMPER_EN; - - machine_menu.HotbedEnable = HOTBED_ENABLE_EN; - machine_menu.HotbedConfTitle = HOTBED_CONF_TITLE_EN; - machine_menu.HotbedAjustType = HOTBED_ADJUST_EN; - machine_menu.HotbedMinTemperature = HOTBED_MIN_TEMPERATURE_EN; - machine_menu.HotbedMaxTemperature = HOTBED_MAX_TEMPERATURE_EN; - - machine_menu.MotorConfTitle = MOTOR_CONF_TITLE_EN; - machine_menu.MaxFeedRateConf = MAXFEEDRATE_CONF_EN; - machine_menu.AccelerationConf = ACCELERATION_CONF_EN; - machine_menu.JerkConf = JERKCONF_EN; - machine_menu.StepsConf = STEPSCONF_EN; - machine_menu.TMCcurrentConf = TMC_CURRENT_EN; - machine_menu.TMCStepModeConf = TMC_STEP_MODE_EN; - machine_menu.MotorDirConf = MOTORDIRCONF_EN; - machine_menu.HomeFeedRateConf = HOMEFEEDRATECONF_EN; - machine_menu.PausePosition = PAUSE_POSITION_EN; - machine_menu.WifiSettings = WIFI_SETTINGS_EN; - machine_menu.HomingSensitivityConf = HOMING_SENSITIVITY_CONF_EN; - machine_menu.EncoderSettings = ENCODER_SETTINGS_EN; - - machine_menu.MaxFeedRateConfTitle = MAXFEEDRATE_CONF_TITLE_EN; - machine_menu.XMaxFeedRate = X_MAXFEEDRATE_EN; - machine_menu.YMaxFeedRate = Y_MAXFEEDRATE_EN; - machine_menu.ZMaxFeedRate = Z_MAXFEEDRATE_EN; - machine_menu.E0MaxFeedRate = E0_MAXFEEDRATE_EN; - machine_menu.E1MaxFeedRate = E1_MAXFEEDRATE_EN; - - machine_menu.AccelerationConfTitle = ACCELERATION_CONF_TITLE_EN; - machine_menu.PrintAcceleration = PRINT_ACCELERATION_EN; - machine_menu.RetractAcceleration = RETRACT_ACCELERATION_EN; - machine_menu.TravelAcceleration = TRAVEL_ACCELERATION_EN; - machine_menu.X_Acceleration = X_ACCELERATION_EN; - machine_menu.Y_Acceleration = Y_ACCELERATION_EN; - machine_menu.Z_Acceleration = Z_ACCELERATION_EN; - machine_menu.E0_Acceleration = E0_ACCELERATION_EN; - machine_menu.E1_Acceleration = E1_ACCELERATION_EN; - - machine_menu.JerkConfTitle = JERK_CONF_TITLE_EN; - machine_menu.X_Jerk = X_JERK_EN; - machine_menu.Y_Jerk = Y_JERK_EN; - machine_menu.Z_Jerk = Z_JERK_EN; - machine_menu.E_Jerk = E_JERK_EN; - - machine_menu.StepsConfTitle = STEPS_CONF_TITLE_EN; - machine_menu.X_Steps = X_STEPS_EN; - machine_menu.Y_Steps = Y_STEPS_EN; - machine_menu.Z_Steps = Z_STEPS_EN; - machine_menu.E0_Steps = E0_STEPS_EN; - machine_menu.E1_Steps = E1_STEPS_EN; - - machine_menu.TmcCurrentConfTitle = TMC_CURRENT_CONF_TITLE_EN; - machine_menu.X_Current = X_TMC_CURRENT_EN; - machine_menu.Y_Current = Y_TMC_CURRENT_EN; - machine_menu.Z_Current = Z_TMC_CURRENT_EN; - machine_menu.E0_Current = E0_TMC_CURRENT_EN; - machine_menu.E1_Current = E1_TMC_CURRENT_EN; - - machine_menu.TmcStepModeConfTitle = TMC_MODE_CONF_TITLE_EN; - machine_menu.X_StepMode = X_TMC_MODE_EN; - machine_menu.Y_StepMode = Y_TMC_MODE_EN; - machine_menu.Z_StepMode = Z_TMC_MODE_EN; - machine_menu.E0_StepMode = E0_TMC_MODE_EN; - machine_menu.E1_StepMode = E1_TMC_MODE_EN; - - machine_menu.MotorDirConfTitle = MOTORDIR_CONF_TITLE_EN; - machine_menu.X_MotorDir = X_MOTORDIR_EN; - machine_menu.Y_MotorDir = Y_MOTORDIR_EN; - machine_menu.Z_MotorDir = Z_MOTORDIR_EN; - machine_menu.E0_MotorDir = E0_MOTORDIR_EN; - machine_menu.E1_MotorDir = E1_MOTORDIR_EN; - machine_menu.Invert_0 = INVERT_P_EN; - machine_menu.Invert_1 = INVERT_N_EN; - - machine_menu.HomeFeedRateConfTitle = HOMEFEEDRATE_CONF_TITLE_EN; - machine_menu.XY_HomeFeedRate = X_HOMESPEED_EN; - // machine_menu.Y_HomeFeedRate=Y_HOMESPEED_EN; - machine_menu.Z_HomeFeedRate = Z_HOMESPEED_EN; - - machine_menu.AdvancedConfTitle = ADVANCED_CONF_TITLE_EN; - machine_menu.PwrOffDection = PWROFF_DECTION_EN; - machine_menu.PwrOffAfterPrint = PWROFF_AFTER_PRINT_EN; - machine_menu.HaveUps = HAVE_UPS_EN; - machine_menu.Z2andZ2Endstop = Z2_AND_Z2ENDSTOP_CONF_EN; - machine_menu.EnablePinsInvert = ENABLE_PINS_CONF_EN; - - machine_menu.Z2ConfTitle = Z2_AND_Z2ENDSTOP_CONF_TITLE_EN; - machine_menu.Z2Enable = Z2_ENABLE_EN; - machine_menu.Z2EndstopEnable = Z2_ENDSTOP_EN; - machine_menu.Z2Port = Z2_PORT_EN; - - machine_menu.EnablePinsInvertTitle = ENABLE_PINS_CONF_TITLE_EN; - machine_menu.XInvert = X_ENABLE_PINS_INVERT_EN; - machine_menu.YInvert = Y_ENABLE_PINS_INVERT_EN; - machine_menu.ZInvert = Z_ENABLE_PINS_INVERT_EN; - machine_menu.EInvert = E_ENABLE_PINS_INVERT_EN; - - machine_menu.key_back = KEY_BACK_EN; - machine_menu.key_reset = KEY_REST_EN; - machine_menu.key_confirm = KEY_CONFIRM_EN; - // - machine_menu.high_level = MOTOR_EN_HIGH_LEVEL_EN; - machine_menu.low_level = MOTOR_EN_LOW_LEVEL_EN; - - machine_menu.PausePosText = PAUSE_POSITION_EN; - machine_menu.xPos = PAUSE_POSITION_X_EN; - machine_menu.yPos = PAUSE_POSITION_Y_EN; - machine_menu.zPos = PAUSE_POSITION_Z_EN; - machine_menu.WifiConfTitle = WIFI_SETTINGS_TITLE_EN; - machine_menu.wifiMode = WIFI_SETTINGS_MODE_EN; - machine_menu.wifiName = WIFI_SETTINGS_NAME_EN; - machine_menu.wifiPassWord = WIFI_SETTINGS_PASSWORD_EN; - machine_menu.wifiCloud = WIFI_SETTINGS_CLOUD_EN; - machine_menu.wifiConfig = WIFI_SETTINGS_CONFIG_EN; - machine_menu.wifiEdit = WIFI_SETTINGS_EDIT_EN; - machine_menu.wifiConfigTips = WIFI_CONFIG_TIPS_EN; - - machine_menu.OffsetConfTitle = OFFSET_TITLE_EN; - machine_menu.Xoffset = OFFSET_X_EN; - machine_menu.Yoffset = OFFSET_Y_EN; - machine_menu.Zoffset = OFFSET_Z_EN; - - machine_menu.HomingSensitivityConfTitle = HOMING_SENSITIVITY_CONF_TITLE_EN; - machine_menu.X_Sensitivity = X_SENSITIVITY_EN; - machine_menu.Y_Sensitivity = Y_SENSITIVITY_EN; - machine_menu.Z_Sensitivity = Z_SENSITIVITY_EN; - machine_menu.Z2_Sensitivity = Z2_SENSITIVITY_EN; - - machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_EN; - machine_menu.EncoderConfText = ENCODER_CONF_TEXT_EN; - } -} - -void disp_language_init() { - preheat_menu.value_state = TEXT_VALUE; - preheat_menu.step_1c = TEXT_1C; - preheat_menu.step_5c = TEXT_5C; - preheat_menu.step_10c = TEXT_10C; - - move_menu.x_add = AXIS_X_ADD_TEXT; - move_menu.x_dec = AXIS_X_DEC_TEXT; - move_menu.y_add = AXIS_Y_ADD_TEXT; - move_menu.y_dec = AXIS_Y_DEC_TEXT; - move_menu.z_add = AXIS_Z_ADD_TEXT; - move_menu.z_dec = AXIS_Z_DEC_TEXT; - - move_menu.step_001mm = TEXT_001MM; - move_menu.step_005mm = TEXT_005MM; - move_menu.step_01mm = TEXT_01MM; - move_menu.step_1mm = TEXT_1MM; - move_menu.step_10mm = TEXT_10MM; - - home_menu.home_x = HOME_X_TEXT; - home_menu.home_y = HOME_Y_TEXT; - home_menu.home_z = HOME_Z_TEXT; - home_menu.home_all = HOME_ALL_TEXT; - - extrude_menu.temp_value = TEXT_VALUE_T; - extrude_menu.count_value_mm = TEXT_VALUE_mm; - extrude_menu.count_value_cm = TEXT_VALUE_cm; - extrude_menu.count_value_m = TEXT_VALUE_m; - extrude_menu.step_1mm = EXTRUDE_1MM_TEXT; - extrude_menu.step_5mm = EXTRUDE_5MM_TEXT; - extrude_menu.step_10mm = EXTRUDE_10MM_TEXT; - - fan_menu.full = FAN_OPEN_TEXT; - fan_menu.half = FAN_HALF_TEXT; - fan_menu.off = FAN_CLOSE_TEXT; - - speed_menu.step_1percent = STEP_1PERCENT; - speed_menu.step_5percent = STEP_5PERCENT; - speed_menu.step_10percent = STEP_10PERCENT; - - language_menu.chinese_s = LANGUAGE_S_CN; - language_menu.chinese_t = LANGUAGE_T_CN; - language_menu.english = LANGUAGE_EN; - language_menu.russian = LANGUAGE_RU; - language_menu.spanish = LANGUAGE_SP; - language_menu.german = LANGUAGE_GE; - language_menu.japan = LANGUAGE_JP; - language_menu.korean = LANGUAGE_KR; - language_menu.portuguese = LANGUAGE_PR; - language_menu.italy = LANGUAGE_IT; - language_menu.brazil = LANGUAGE_BR; - language_menu.french = LANGUAGE_FR; - - about_menu.type_name = ABOUT_TYPE_TEXT; - about_menu.firmware_v = ABOUT_VERSION_TEXT; - // about_menu.wifi = ABOUT_WIFI_TEXT; - - wifi_menu.ip = WIFI_IP_TEXT; - wifi_menu.wifi = WIFI_NAME_TEXT; - wifi_menu.key = WIFI_KEY_TEXT; - wifi_menu.state_ap = WIFI_STATE_AP_TEXT; - wifi_menu.state_sta = WIFI_STATE_STA_TEXT; - wifi_menu.connected = WIFI_CONNECTED_TEXT; - wifi_menu.disconnected = WIFI_DISCONNECTED_TEXT; - wifi_menu.exception = WIFI_EXCEPTION_TEXT; - - printing_menu.temp1 = TEXT_VALUE; - printing_menu.temp2 = TEXT_VALUE; - printing_menu.bed_temp = TEXT_VALUE; - - filament_menu.stat_temp = TEXT_VALUE; - - machine_menu.key_0 = KEYBOARD_KEY0_EN; - machine_menu.key_1 = KEYBOARD_KEY1_EN; - machine_menu.key_2 = KEYBOARD_KEY2_EN; - machine_menu.key_3 = KEYBOARD_KEY3_EN; - machine_menu.key_4 = KEYBOARD_KEY4_EN; - machine_menu.key_5 = KEYBOARD_KEY5_EN; - machine_menu.key_6 = KEYBOARD_KEY6_EN; - machine_menu.key_7 = KEYBOARD_KEY7_EN; - machine_menu.key_8 = KEYBOARD_KEY8_EN; - machine_menu.key_9 = KEYBOARD_KEY9_EN; - machine_menu.key_point = KEYBOARD_KEY_POINT_EN; - machine_menu.negative = KEYBOARD_KEY_NEGATIVE_EN; - // wifi-list - #if ENABLED(USE_WIFI_FUNCTION) - list_menu.title = TEXT_WIFI_MENU_TITLE_EN; - list_menu.file_pages = FILE_PAGES_EN; - - // tips - tips_menu.joining = TEXT_WIFI_JOINING_EN; - tips_menu.failedJoin = TEXT_WIFI_FAILED_JOIN_EN; - tips_menu.wifiConected = TEXT_WIFI_WIFI_CONECTED_EN; - #endif //USE_WIFI_FUNCTION - machine_setting_disp(); - - operation_menu.babystep = TEXT_BABY_STEP_EN; - - switch (gCfgItems.language) { - case LANG_SIMPLE_CHINESE: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_CN; - common_menu.text_back = BACK_TEXT_CN; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_CN; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_CN; - common_menu.print_special_title = PRINTING_GBK; - common_menu.pause_special_title = PRINTING_PAUSE_GBK; - common_menu.operate_special_title = PRINTING_OPERATION_GBK; - // - main_menu.title = TITLE_READYPRINT_CN; - main_menu.preheat = PREHEAT_TEXT_CN; - main_menu.move = MOVE_TEXT_CN; - main_menu.home = HOME_TEXT_CN; - main_menu.print = PRINT_TEXT_CN; - main_menu.extrude = EXTRUDE_TEXT_CN; - main_menu.leveling = LEVELING_TEXT_CN; - main_menu.autoleveling = AUTO_LEVELING_TEXT_CN; - main_menu.fan = FAN_TEXT_CN; - main_menu.set = SET_TEXT_CN; - main_menu.more = MORE_TEXT_CN; - main_menu.tool = TOOL_TEXT_CN; - // TOOL - tool_menu.title = TOOL_TEXT_CN; - tool_menu.preheat = TOOL_PREHEAT_CN; - tool_menu.extrude = TOOL_EXTRUDE_CN; - tool_menu.move = TOOL_MOVE_CN; - tool_menu.home = TOOL_HOME_CN; - tool_menu.leveling = TOOL_LEVELING_CN; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_CN; - tool_menu.filament = TOOL_FILAMENT_CN; - tool_menu.more = TOOL_MORE_CN; - // - preheat_menu.adjust_title = TITLE_ADJUST_CN; - preheat_menu.title = TITLE_PREHEAT_CN; - preheat_menu.add = ADD_TEXT_CN; - preheat_menu.dec = DEC_TEXT_CN; - preheat_menu.ext1 = EXTRUDER_1_TEXT_CN; - preheat_menu.ext2 = EXTRUDER_2_TEXT_CN; - preheat_menu.hotbed = HEATBED_TEXT_CN; - preheat_menu.off = CLOSE_TEXT_CN; - - preheat_menu.value_state = TEXT_VALUE_CN; - preheat_menu.step_1c = TEXT_1C_CN; - preheat_menu.step_5c = TEXT_5C_CN; - preheat_menu.step_10c = TEXT_10C_CN; - // - move_menu.title = MOVE_TEXT_CN; - // - home_menu.title = TITLE_HOME_CN; - home_menu.stopmove = HOME_STOPMOVE_CN; - // - file_menu.title = TITLE_CHOOSEFILE_CN; - file_menu.page_up = PAGE_UP_TEXT_CN; - file_menu.page_down = PAGE_DOWN_TEXT_CN; - file_menu.file_loading = FILE_LOADING_CN; - file_menu.no_file = NO_FILE_CN; - file_menu.no_file_and_check = NO_FILE_CN;// NO_FILE_AND_CHECK_CN; - // - extrude_menu.title = TITLE_EXTRUDE_CN; - extrude_menu.in = EXTRUDER_IN_TEXT_CN; - extrude_menu.out = EXTRUDER_OUT_TEXT_CN; - extrude_menu.ext1 = EXTRUDER_1_TEXT_CN; - extrude_menu.ext2 = EXTRUDER_2_TEXT_CN; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_CN; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_CN; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_CN; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_CN; - extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_CN; - // - leveling_menu.title = TITLE_LEVELING_CN; - leveling_menu.position1 = LEVELING_POINT1_TEXT_CN; - leveling_menu.position2 = LEVELING_POINT2_TEXT_CN; - leveling_menu.position3 = LEVELING_POINT3_TEXT_CN; - leveling_menu.position4 = LEVELING_POINT4_TEXT_CN; - leveling_menu.position5 = LEVELING_POINT5_TEXT_CN; - // - set_menu.title = TITLE_SET_CN; - set_menu.filesys = FILESYS_TEXT_CN; - set_menu.wifi = WIFI_TEXT_CN; - set_menu.about = ABOUT_TEXT_CN; - set_menu.fan = FAN_TEXT_CN; - set_menu.filament = FILAMENT_TEXT_CN; - set_menu.breakpoint = BREAK_POINT_TEXT_CN; - set_menu.motoroff = MOTOR_OFF_TEXT_CN; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_CN; - set_menu.language = LANGUAGE_TEXT_CN; - set_menu.shutdown = SHUTDOWN_TEXT_CN; - set_menu.machine_para = MACHINE_PARA_CN; - set_menu.eepromSet = EEPROM_SETTINGS_CN; - // - filesys_menu.title = TITLE_FILESYS_CN; - filesys_menu.sd_sys = SD_CARD_TEXT_CN; - filesys_menu.usb_sys = U_DISK_TEXT_CN; - // - more_menu.title = TITLE_MORE_CN; - // WIFI - wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_CN; - // wifi_menu.ip = WIFI_IP_TEXT_CN; - // wifi_menu.state = WIFI_STA_TEXT_CN; - wifi_menu.cloud = CLOUD_TEXT_CN; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_CN; - // CLOUD - cloud_menu.title = TITLE_CLOUD_TEXT_CN; - cloud_menu.bind = CLOUD_BINDED_CN; - cloud_menu.binded = CLOUD_BINDED_CN; - cloud_menu.unbind = CLOUD_UNBIND_CN; - cloud_menu.unbinding = CLOUD_UNBINDED_CN; - cloud_menu.disconnected = CLOUD_DISCONNECTED_CN; - cloud_menu.disable = CLOUD_DISABLE_CN; - // - about_menu.title = ABOUT_TEXT_CN; - about_menu.type = ABOUT_TYPE_TEXT_CN; - about_menu.version = ABOUT_VERSION_TEXT_CN; - about_menu.wifi = ABOUT_WIFI_TEXT_CN; - - // - fan_menu.title = FAN_TEXT_CN; - fan_menu.add = FAN_ADD_TEXT_CN; - fan_menu.dec = FAN_DEC_TEXT_CN; - fan_menu.state = FAN_TIPS1_TEXT_CN; - // - filament_menu.title = TITLE_FILAMENT_CN; - filament_menu.in = FILAMENT_IN_TEXT_CN; - filament_menu.out = FILAMENT_OUT_TEXT_CN; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_CN; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_CN; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_CN; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_CN; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_CN; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_CN; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_CN; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_CN; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN; - - - // - language_menu.title = TITLE_LANGUAGE_CN; - language_menu.next = PAGE_DOWN_TEXT_CN; - language_menu.up = PAGE_UP_TEXT_CN; - - // - printing_menu.title = TITLE_PRINTING_CN; - printing_menu.option = PRINTING_OPERATION_CN; - printing_menu.stop = PRINTING_STOP_CN; - printing_menu.pause = PRINTING_PAUSE_CN; - printing_menu.resume = PRINTING_RESUME_CN; - - // - operation_menu.title = TITLE_OPERATION_CN; - operation_menu.pause = PRINTING_PAUSE_CN; - operation_menu.stop = PRINTING_STOP_CN; - operation_menu.temp = PRINTING_TEMP_CN; - operation_menu.fan = FAN_TEXT_CN; - operation_menu.filament = FILAMENT_TEXT_CN; - operation_menu.extr = PRINTING_EXTRUDER_CN; - operation_menu.speed = PRINTING_CHANGESPEED_CN; - operation_menu.more = PRINTING_MORE_CN; - operation_menu.move = PRINTING_MOVE_CN; - operation_menu.auto_off = AUTO_SHUTDOWN_CN; - operation_menu.manual_off = MANUAL_SHUTDOWN_CN; - // - pause_menu.title = TITLE_PAUSE_CN; - pause_menu.resume = PRINTING_RESUME_CN; - pause_menu.stop = PRINTING_STOP_CN; - pause_menu.extrude = PRINTING_EXTRUDER_CN; - pause_menu.move = PRINTING_MOVE_CN; - pause_menu.filament = FILAMENT_TEXT_CN; - pause_menu.more = PRINTING_MORE_CN; - - // - speed_menu.title = PRINTING_CHANGESPEED_CN; - speed_menu.add = ADD_TEXT_CN; - speed_menu.dec = DEC_TEXT_CN; - speed_menu.move = MOVE_SPEED_CN; - speed_menu.extrude = EXTRUDER_SPEED_CN; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_CN; - speed_menu.move_speed = MOVE_SPEED_STATE_CN; - // - printing_more_menu.title = TITLE_MORE_CN; - printing_more_menu.fan = FAN_TEXT_CN; - printing_more_menu.auto_close = AUTO_SHUTDOWN_CN; - printing_more_menu.manual = MANUAL_SHUTDOWN_CN; - printing_more_menu.speed = PRINTING_CHANGESPEED_CN; - printing_more_menu.temp = PRINTING_TEMP_CN; - - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_CN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_CN; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_CN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_CN; - print_file_dialog_menu.retry = DIALOG_RETRY_CN; - print_file_dialog_menu.stop = DIALOG_STOP_CN; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_CN; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_CN; - - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_CN; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_CN; - - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_CN; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_CN; - print_file_dialog_menu.reprint = DIALOG_REPRINT_CN; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_CN; - - pause_msg_menu.pausing = MESSAGE_PAUSING_CN; - pause_msg_menu.changing = MESSAGE_CHANGING_CN; - pause_msg_menu.unload = MESSAGE_UNLOAD_CN; - pause_msg_menu.waiting = MESSAGE_WAITING_CN; - pause_msg_menu.insert = MESSAGE_INSERT_CN; - pause_msg_menu.load = MESSAGE_LOAD_CN; - pause_msg_menu.purge = MESSAGE_PURGE_CN; - pause_msg_menu.resume = MESSAGE_RESUME_CN; - pause_msg_menu.heat = MESSAGE_HEAT_CN; - pause_msg_menu.heating = MESSAGE_HEATING_CN; - pause_msg_menu.option = MESSAGE_OPTION_CN; - pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_CN; - pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_CN; - eeprom_menu.title = EEPROM_SETTINGS_TITLE_CN; - eeprom_menu.store = EEPROM_SETTINGS_STORE_CN; - eeprom_menu.read = EEPROM_SETTINGS_READ_CN; - eeprom_menu.revert = EEPROM_SETTINGS_REVERT_CN; - eeprom_menu.storeTips = EEPROM_STORE_TIPS_CN; - eeprom_menu.readTips = EEPROM_READ_TIPS_CN; - eeprom_menu.revertTips = EEPROM_REVERT_TIPS_CN; - break; - - #if 1 - #if 1 - - case LANG_COMPLEX_CHINESE: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_T_CN; - common_menu.text_back = BACK_TEXT_T_CN; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_T_CN; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_T_CN; - common_menu.print_special_title = PRINTING_GBK; - common_menu.pause_special_title = PRINTING_PAUSE_GBK; - common_menu.operate_special_title = PRINTING_OPERATION_GBK; - // - main_menu.title = TITLE_READYPRINT_T_CN; - main_menu.preheat = PREHEAT_TEXT_T_CN; - main_menu.move = MOVE_TEXT_T_CN; - main_menu.home = HOME_TEXT_T_CN; - main_menu.print = PRINT_TEXT_T_CN; - main_menu.extrude = EXTRUDE_TEXT_T_CN; - main_menu.leveling = LEVELING_TEXT_T_CN; - main_menu.autoleveling = AUTO_LEVELING_TEXT_T_CN; - main_menu.fan = FAN_TEXT_T_CN; - main_menu.set = SET_TEXT_T_CN; - main_menu.more = MORE_TEXT_T_CN; - main_menu.tool = TOOL_TEXT_T_CN; - // TOOL - tool_menu.title = TOOL_TEXT_T_CN; - tool_menu.preheat = TOOL_PREHEAT_T_CN; - tool_menu.extrude = TOOL_EXTRUDE_T_CN; - tool_menu.move = TOOL_MOVE_T_CN; - tool_menu.home = TOOL_HOME_T_CN; - tool_menu.leveling = TOOL_LEVELING_T_CN; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_T_CN; - tool_menu.filament = TOOL_FILAMENT_T_CN; - tool_menu.more = TOOL_MORE_T_CN; - // - preheat_menu.adjust_title = TITLE_ADJUST_T_CN; - preheat_menu.title = TITLE_PREHEAT_T_CN; - preheat_menu.add = ADD_TEXT_T_CN; - preheat_menu.dec = DEC_TEXT_T_CN; - preheat_menu.ext1 = EXTRUDER_1_TEXT_T_CN; - preheat_menu.ext2 = EXTRUDER_2_TEXT_T_CN; - preheat_menu.hotbed = HEATBED_TEXT_T_CN; - preheat_menu.off = CLOSE_TEXT_T_CN; - preheat_menu.value_state = TEXT_VALUE_T_CN; - preheat_menu.step_1c = TEXT_1C_T_CN; - preheat_menu.step_5c = TEXT_5C_T_CN; - preheat_menu.step_10c = TEXT_10C_T_CN; - // - move_menu.title = MOVE_TEXT_T_CN; - // - home_menu.title = TITLE_HOME_T_CN; - home_menu.stopmove = HOME_STOPMOVE_T_CN; - // - file_menu.title = TITLE_CHOOSEFILE_T_CN; - file_menu.page_up = PAGE_UP_TEXT_T_CN; - file_menu.page_down = PAGE_DOWN_TEXT_T_CN; - file_menu.file_loading = FILE_LOADING_T_CN; - file_menu.no_file = NO_FILE_T_CN; - file_menu.no_file_and_check = NO_FILE_T_CN;// NO_FILE_AND_CHECK_T_CN; - // - extrude_menu.title = TITLE_EXTRUDE_T_CN; - extrude_menu.in = EXTRUDER_IN_TEXT_T_CN; - extrude_menu.out = EXTRUDER_OUT_TEXT_T_CN; - extrude_menu.ext1 = EXTRUDER_1_TEXT_T_CN; - extrude_menu.ext2 = EXTRUDER_2_TEXT_T_CN; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_T_CN; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_T_CN; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_T_CN; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_T_CN; - extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_T_CN; - // - leveling_menu.title = TITLE_LEVELING_CN; - leveling_menu.position1 = LEVELING_POINT1_TEXT_T_CN; - leveling_menu.position2 = LEVELING_POINT2_TEXT_T_CN; - leveling_menu.position3 = LEVELING_POINT3_TEXT_T_CN; - leveling_menu.position4 = LEVELING_POINT4_TEXT_T_CN; - leveling_menu.position5 = LEVELING_POINT5_TEXT_T_CN; - // - set_menu.title = TITLE_SET_T_CN; - set_menu.filesys = FILESYS_TEXT_T_CN; - set_menu.wifi = WIFI_TEXT_T_CN; - set_menu.about = ABOUT_TEXT_T_CN; - set_menu.fan = FAN_TEXT_T_CN; - set_menu.filament = FILAMENT_TEXT_T_CN; - set_menu.breakpoint = BREAK_POINT_TEXT_T_CN; - set_menu.motoroff = MOTOR_OFF_TEXT_T_CN; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_T_CN; - set_menu.language = LANGUAGE_TEXT_T_CN; - set_menu.shutdown = SHUTDOWN_TEXT_T_CN; - set_menu.machine_para = MACHINE_PARA_T_CN; - set_menu.eepromSet = EEPROM_SETTINGS_T_CN; - filesys_menu.title = TITLE_FILESYS_T_CN; - filesys_menu.sd_sys = SD_CARD_TEXT_T_CN; - filesys_menu.usb_sys = U_DISK_TEXT_T_CN; - // - more_menu.title = TITLE_MORE_T_CN; - // WIFI - wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_CN; - // wifi_menu.ip = WIFI_IP_TEXT_CN; - // wifi_menu.state= WIFI_STA_TEXT_CN; - wifi_menu.cloud = CLOUD_TEXT_T_CN; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_T_CN; - // CLOUD - cloud_menu.title = TITLE_CLOUD_TEXT_T_CN; - cloud_menu.bind = CLOUD_BINDED_T_CN; - cloud_menu.binded = CLOUD_BINDED_T_CN; - cloud_menu.unbind = CLOUD_UNBIND_T_CN; - cloud_menu.unbinding = CLOUD_UNBINDED_T_CN; - cloud_menu.disconnected = CLOUD_DISCONNECTED_T_CN; - cloud_menu.disable = CLOUD_DISABLE_T_CN; - // - about_menu.title = ABOUT_TEXT_T_CN; - about_menu.type = ABOUT_TYPE_TEXT_T_CN; - about_menu.version = ABOUT_VERSION_TEXT_T_CN; - about_menu.wifi = ABOUT_WIFI_TEXT_T_CN; - - // - fan_menu.title = FAN_TEXT_T_CN; - fan_menu.add = FAN_ADD_TEXT_T_CN; - fan_menu.dec = FAN_DEC_TEXT_T_CN; - fan_menu.state = FAN_TIPS1_TEXT_T_CN; - // - filament_menu.title = TITLE_FILAMENT_T_CN; - filament_menu.in = FILAMENT_IN_TEXT_T_CN; - filament_menu.out = FILAMENT_OUT_TEXT_T_CN; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_T_CN; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_T_CN; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_T_CN; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_T_CN; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_T_CN; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_T_CN; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_T_CN; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_T_CN; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_T_CN; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_T_CN; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_T_CN; - - - // - language_menu.title = TITLE_LANGUAGE_T_CN; - language_menu.next = PAGE_DOWN_TEXT_T_CN; - language_menu.up = PAGE_UP_TEXT_T_CN; - - // - printing_menu.title = TITLE_PRINTING_T_CN; - printing_menu.option = PRINTING_OPERATION_T_CN; - printing_menu.stop = PRINTING_STOP_T_CN; - printing_menu.pause = PRINTING_PAUSE_T_CN; - printing_menu.resume = PRINTING_RESUME_T_CN; - - // - operation_menu.title = TITLE_OPERATION_T_CN; - operation_menu.pause = PRINTING_PAUSE_T_CN; - operation_menu.stop = PRINTING_STOP_T_CN; - operation_menu.temp = PRINTING_TEMP_T_CN; - operation_menu.fan = FAN_TEXT_T_CN; - operation_menu.extr = PRINTING_EXTRUDER_T_CN; - operation_menu.speed = PRINTING_CHANGESPEED_T_CN; - operation_menu.filament = FILAMENT_TEXT_T_CN; - operation_menu.more = PRINTING_MORE_T_CN; - operation_menu.move = PRINTING_MOVE_T_CN; - operation_menu.auto_off = AUTO_SHUTDOWN_T_CN; - operation_menu.manual_off = MANUAL_SHUTDOWN_T_CN; - // - pause_menu.title = TITLE_PAUSE_T_CN; - pause_menu.resume = PRINTING_RESUME_T_CN; - pause_menu.stop = PRINTING_STOP_T_CN; - pause_menu.extrude = PRINTING_EXTRUDER_T_CN; - pause_menu.move = PRINTING_MOVE_T_CN; - pause_menu.filament = FILAMENT_TEXT_T_CN; - pause_menu.more = PRINTING_MORE_T_CN; - - // - speed_menu.title = PRINTING_CHANGESPEED_T_CN; - speed_menu.add = ADD_TEXT_T_CN; - speed_menu.dec = DEC_TEXT_T_CN; - speed_menu.move = MOVE_SPEED_T_CN; - speed_menu.extrude = EXTRUDER_SPEED_T_CN; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_T_CN; - speed_menu.move_speed = MOVE_SPEED_STATE_T_CN; - // - printing_more_menu.title = TITLE_MORE_T_CN; - printing_more_menu.fan = FAN_TEXT_T_CN; - printing_more_menu.auto_close = AUTO_SHUTDOWN_T_CN; - printing_more_menu.manual = MANUAL_SHUTDOWN_T_CN; - printing_more_menu.speed = PRINTING_CHANGESPEED_T_CN; - printing_more_menu.temp = PRINTING_TEMP_T_CN; - - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_T_CN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_T_CN; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_T_CN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_T_CN; - print_file_dialog_menu.retry = DIALOG_RETRY_T_CN; - print_file_dialog_menu.stop = DIALOG_STOP_T_CN; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_T_CN; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_T_CN; - - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_T_CN; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_T_CN; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_T_CN; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_T_CN; - print_file_dialog_menu.reprint = DIALOG_REPRINT_T_CN; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_T_CN; - - pause_msg_menu.pausing = MESSAGE_PAUSING_T_CN; - pause_msg_menu.changing = MESSAGE_CHANGING_T_CN; - pause_msg_menu.unload = MESSAGE_UNLOAD_T_CN; - pause_msg_menu.waiting = MESSAGE_WAITING_T_CN; - pause_msg_menu.insert = MESSAGE_INSERT_T_CN; - pause_msg_menu.load = MESSAGE_LOAD_T_CN; - pause_msg_menu.purge = MESSAGE_PURGE_T_CN; - pause_msg_menu.resume = MESSAGE_RESUME_T_CN; - pause_msg_menu.heat = MESSAGE_HEAT_T_CN; - pause_msg_menu.heating = MESSAGE_HEATING_T_CN; - pause_msg_menu.option = MESSAGE_OPTION_T_CN; - pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_T_CN; - pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_T_CN; - eeprom_menu.title = EEPROM_SETTINGS_TITLE_T_CN; - eeprom_menu.store = EEPROM_SETTINGS_STORE_T_CN; - eeprom_menu.read = EEPROM_SETTINGS_READ_T_CN; - eeprom_menu.revert = EEPROM_SETTINGS_REVERT_T_CN; - eeprom_menu.storeTips = EEPROM_STORE_TIPS_T_CN; - eeprom_menu.readTips = EEPROM_READ_TIPS_T_CN; - eeprom_menu.revertTips = EEPROM_REVERT_TIPS_T_CN; - break; - case LANG_ENGLISH: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_EN; - common_menu.text_back = BACK_TEXT_EN; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_EN; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_EN; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; - common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; - // - main_menu.title = TITLE_READYPRINT_EN; - main_menu.preheat = PREHEAT_TEXT_EN; - main_menu.move = MOVE_TEXT_EN; - main_menu.home = HOME_TEXT_EN; - main_menu.print = PRINT_TEXT_EN; - main_menu.extrude = EXTRUDE_TEXT_EN; - main_menu.leveling = LEVELING_TEXT_EN; - main_menu.autoleveling = AUTO_LEVELING_TEXT_EN; - main_menu.fan = FAN_TEXT_EN; - main_menu.set = SET_TEXT_EN; - main_menu.more = MORE_TEXT_EN; - main_menu.tool = TOOL_TEXT_EN; - // TOOL - tool_menu.title = TOOL_TEXT_EN; - tool_menu.preheat = TOOL_PREHEAT_EN; - tool_menu.extrude = TOOL_EXTRUDE_EN; - tool_menu.move = TOOL_MOVE_EN; - tool_menu.home = TOOL_HOME_EN; - tool_menu.leveling = TOOL_LEVELING_EN; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_EN; - tool_menu.filament = TOOL_FILAMENT_EN; - tool_menu.more = TOOL_MORE_EN; - // - preheat_menu.adjust_title = TITLE_ADJUST_EN; - preheat_menu.title = TITLE_PREHEAT_EN; - preheat_menu.add = ADD_TEXT_EN; - preheat_menu.dec = DEC_TEXT_EN; - preheat_menu.ext1 = EXTRUDER_1_TEXT_EN; - preheat_menu.ext2 = EXTRUDER_2_TEXT_EN; - preheat_menu.hotbed = HEATBED_TEXT_EN; - preheat_menu.off = CLOSE_TEXT_EN; - // - move_menu.title = TITLE_MOVE_EN; - // - home_menu.title = TITLE_HOME_EN; - home_menu.stopmove = HOME_STOPMOVE_EN; - // - file_menu.title = TITLE_CHOOSEFILE_EN; - file_menu.page_up = PAGE_UP_TEXT_EN; - file_menu.page_down = PAGE_DOWN_TEXT_EN; - file_menu.file_loading = FILE_LOADING_EN; - file_menu.no_file = NO_FILE_EN; - file_menu.no_file_and_check = NO_FILE_EN;// NO_FILE_AND_CHECK_EN; - // - extrude_menu.title = TITLE_EXTRUDE_EN; - extrude_menu.in = EXTRUDER_IN_TEXT_EN; - extrude_menu.out = EXTRUDER_OUT_TEXT_EN; - extrude_menu.ext1 = EXTRUDER_1_TEXT_EN; - extrude_menu.ext2 = EXTRUDER_2_TEXT_EN; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_EN; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_EN; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_EN; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_EN; - // - leveling_menu.title = TITLE_LEVELING_EN; - leveling_menu.position1 = LEVELING_POINT1_TEXT_EN; - leveling_menu.position2 = LEVELING_POINT2_TEXT_EN; - leveling_menu.position3 = LEVELING_POINT3_TEXT_EN; - leveling_menu.position4 = LEVELING_POINT4_TEXT_EN; - leveling_menu.position5 = LEVELING_POINT5_TEXT_EN; - // - set_menu.title = TITLE_SET_EN; - set_menu.filesys = FILESYS_TEXT_EN; - set_menu.wifi = WIFI_TEXT_EN; - set_menu.about = ABOUT_TEXT_EN; - set_menu.fan = FAN_TEXT_EN; - set_menu.filament = FILAMENT_TEXT_EN; - set_menu.breakpoint = BREAK_POINT_TEXT_EN; - set_menu.motoroff = MOTOR_OFF_TEXT_EN; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_EN; - set_menu.language = LANGUAGE_TEXT_EN; - set_menu.shutdown = SHUTDOWN_TEXT_EN; - set_menu.machine_para = MACHINE_PARA_EN; - set_menu.eepromSet = EEPROM_SETTINGS_EN; - more_menu.title = TITLE_MORE_EN; - // - filesys_menu.title = TITLE_FILESYS_EN; - filesys_menu.sd_sys = SD_CARD_TEXT_EN; - filesys_menu.usb_sys = U_DISK_TEXT_EN; - // WIFI - wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_EN; - // wifi_menu.ip = WIFI_IP_TEXT_EN; - // wifi_menu.state = WIFI_STA_TEXT_EN; - wifi_menu.cloud = CLOUD_TEXT_EN; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; - - cloud_menu.title = TITLE_CLOUD_TEXT_EN; - cloud_menu.bind = CLOUD_BINDED_EN; - cloud_menu.binded = CLOUD_BINDED_EN; - cloud_menu.unbind = CLOUD_UNBIND_EN; - cloud_menu.unbinding = CLOUD_UNBINDED_EN; - cloud_menu.disconnected = CLOUD_DISCONNECTED_EN; - cloud_menu.disable = CLOUD_DISABLE_EN; - // - about_menu.title = TITLE_ABOUT_EN; - about_menu.type = ABOUT_TYPE_TEXT_EN; - about_menu.version = ABOUT_VERSION_TEXT_EN; - about_menu.wifi = ABOUT_WIFI_TEXT_EN; - // - fan_menu.title = TITLE_FAN_EN; - fan_menu.add = FAN_ADD_TEXT_EN; - fan_menu.dec = FAN_DEC_TEXT_EN; - fan_menu.state = FAN_TIPS1_TEXT_EN; - // - filament_menu.title = TITLE_FILAMENT_EN; - filament_menu.in = FILAMENT_IN_TEXT_EN; - filament_menu.out = FILAMENT_OUT_TEXT_EN; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_EN; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_EN; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_EN; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_EN; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_EN; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN; - - // - language_menu.title = TITLE_LANGUAGE_EN; - language_menu.next = PAGE_DOWN_TEXT_EN; - language_menu.up = PAGE_UP_TEXT_EN; - // - printing_menu.title = TITLE_PRINTING_EN; - printing_menu.option = PRINTING_OPERATION_EN; - printing_menu.stop = PRINTING_STOP_EN; - printing_menu.pause = PRINTING_PAUSE_EN; - printing_menu.resume = PRINTING_RESUME_EN; - - // - operation_menu.title = TITLE_OPERATION_EN; - operation_menu.pause = PRINTING_PAUSE_EN; - operation_menu.stop = PRINTING_STOP_EN; - operation_menu.temp = PRINTING_TEMP_EN; - operation_menu.fan = FAN_TEXT_EN; - operation_menu.extr = PRINTING_EXTRUDER_EN; - operation_menu.speed = PRINTING_CHANGESPEED_EN; - operation_menu.filament = FILAMENT_TEXT_EN; - operation_menu.more = PRINTING_MORE_EN; - operation_menu.move = PRINTING_MOVE_EN; - operation_menu.auto_off = AUTO_SHUTDOWN_EN; - operation_menu.manual_off = MANUAL_SHUTDOWN_EN; - // - pause_menu.title = TITLE_PAUSE_EN; - pause_menu.resume = PRINTING_RESUME_EN; - pause_menu.stop = PRINTING_STOP_EN; - pause_menu.extrude = PRINTING_EXTRUDER_EN; - pause_menu.move = PRINTING_MOVE_EN; - pause_menu.filament = FILAMENT_TEXT_EN; - pause_menu.more = PRINTING_MORE_EN; - - // - speed_menu.title = TITLE_CHANGESPEED_EN; - speed_menu.add = ADD_TEXT_EN; - speed_menu.dec = DEC_TEXT_EN; - speed_menu.move = MOVE_SPEED_EN; - speed_menu.extrude = EXTRUDER_SPEED_EN; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_EN; - speed_menu.move_speed = MOVE_SPEED_STATE_EN; - // - printing_more_menu.title = TITLE_MORE_EN; - printing_more_menu.fan = FAN_TEXT_EN; - printing_more_menu.auto_close = AUTO_SHUTDOWN_EN; - printing_more_menu.manual = MANUAL_SHUTDOWN_EN; - printing_more_menu.speed = PRINTING_CHANGESPEED_EN; - printing_more_menu.temp = PRINTING_TEMP_EN; - - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_EN; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN; - print_file_dialog_menu.retry = DIALOG_RETRY_EN; - print_file_dialog_menu.stop = DIALOG_STOP_EN; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_EN; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_EN; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_EN; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_EN; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN; - print_file_dialog_menu.reprint = DIALOG_REPRINT_EN; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN; - - pause_msg_menu.pausing = MESSAGE_PAUSING_EN; - pause_msg_menu.changing = MESSAGE_CHANGING_EN; - pause_msg_menu.unload = MESSAGE_UNLOAD_EN; - pause_msg_menu.waiting = MESSAGE_WAITING_EN; - pause_msg_menu.insert = MESSAGE_INSERT_EN; - pause_msg_menu.load = MESSAGE_LOAD_EN; - pause_msg_menu.purge = MESSAGE_PURGE_EN; - pause_msg_menu.resume = MESSAGE_RESUME_EN; - pause_msg_menu.heat = MESSAGE_HEAT_EN; - pause_msg_menu.heating = MESSAGE_HEATING_EN; - pause_msg_menu.option = MESSAGE_OPTION_EN; - pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_EN; - pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_EN; - eeprom_menu.title = EEPROM_SETTINGS_TITLE_EN; - eeprom_menu.store = EEPROM_SETTINGS_STORE_EN; - eeprom_menu.read = EEPROM_SETTINGS_READ_EN; - eeprom_menu.revert = EEPROM_SETTINGS_REVERT_EN; - eeprom_menu.storeTips = EEPROM_STORE_TIPS_EN; - eeprom_menu.readTips = EEPROM_READ_TIPS_EN; - eeprom_menu.revertTips = EEPROM_REVERT_TIPS_EN; - break; - case LANG_RUSSIAN: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_RU; - common_menu.text_back = BACK_TEXT_RU; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_RU; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_RU; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; - common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; - // - main_menu.title = TITLE_READYPRINT_RU; - main_menu.preheat = PREHEAT_TEXT_RU; - main_menu.move = MOVE_TEXT_RU; - main_menu.home = HOME_TEXT_RU; - main_menu.print = PRINT_TEXT_RU; - main_menu.extrude = EXTRUDE_TEXT_RU; - main_menu.leveling = LEVELING_TEXT_RU; - main_menu.autoleveling = AUTO_LEVELING_TEXT_RU; - main_menu.fan = FAN_TEXT_RU; - main_menu.set = SET_TEXT_RU; - main_menu.more = MORE_TEXT_RU; - main_menu.tool = TOOL_TEXT_RU; - // TOOL - tool_menu.title = TOOL_TEXT_RU; - tool_menu.preheat = TOOL_PREHEAT_RU; - tool_menu.extrude = TOOL_EXTRUDE_RU; - tool_menu.move = TOOL_MOVE_RU; - tool_menu.home = TOOL_HOME_RU; - tool_menu.leveling = TOOL_LEVELING_RU; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_RU; - tool_menu.filament = TOOL_FILAMENT_RU; - tool_menu.more = TOOL_MORE_RU; - // - preheat_menu.adjust_title = TITLE_ADJUST_RU; - preheat_menu.title = TITLE_PREHEAT_RU; - preheat_menu.add = ADD_TEXT_RU; - preheat_menu.dec = DEC_TEXT_RU; - preheat_menu.ext1 = EXTRUDER_1_TEXT_RU; - preheat_menu.ext2 = EXTRUDER_2_TEXT_RU; - preheat_menu.hotbed = HEATBED_TEXT_RU; - preheat_menu.off = CLOSE_TEXT_RU; - // - move_menu.title = MOVE_TEXT_RU; - // - home_menu.title = TITLE_HOME_RU; - home_menu.stopmove = HOME_STOPMOVE_RU; - // - file_menu.title = TITLE_CHOOSEFILE_RU; - file_menu.page_up = PAGE_UP_TEXT_RU; - file_menu.page_down = PAGE_DOWN_TEXT_RU; - file_menu.file_loading = FILE_LOADING_RU; - file_menu.no_file = NO_FILE_RU; - file_menu.no_file_and_check = NO_FILE_RU;// NO_FILE_AND_CHECK_RU; - // - extrude_menu.title = TITLE_EXTRUDE_RU; - extrude_menu.in = EXTRUDER_IN_TEXT_RU; - extrude_menu.out = EXTRUDER_OUT_TEXT_RU; - extrude_menu.ext1 = EXTRUDER_1_TEXT_RU; - extrude_menu.ext2 = EXTRUDER_2_TEXT_RU; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_RU; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_RU; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_RU; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_RU; - // - leveling_menu.title = TITLE_LEVELING_RU; - leveling_menu.position1 = LEVELING_POINT1_TEXT_RU; - leveling_menu.position2 = LEVELING_POINT2_TEXT_RU; - leveling_menu.position3 = LEVELING_POINT3_TEXT_RU; - leveling_menu.position4 = LEVELING_POINT4_TEXT_RU; - leveling_menu.position5 = LEVELING_POINT5_TEXT_RU; - // - set_menu.title = TITLE_SET_RU; - set_menu.filesys = FILESYS_TEXT_RU; - set_menu.wifi = WIFI_TEXT_RU; - set_menu.about = ABOUT_TEXT_RU; - set_menu.fan = FAN_TEXT_RU; - set_menu.filament = FILAMENT_TEXT_RU; - set_menu.breakpoint = BREAK_POINT_TEXT_RU; - set_menu.motoroff = MOTOR_OFF_TEXT_RU; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_RU; - set_menu.language = LANGUAGE_TEXT_RU; - set_menu.shutdown = SHUTDOWN_TEXT_RU; - set_menu.machine_para = MACHINE_PARA_RU; - set_menu.eepromSet = EEPROM_SETTINGS_RU; - more_menu.title = TITLE_MORE_RU; - // - filesys_menu.title = TITLE_FILESYS_RU; - filesys_menu.sd_sys = SD_CARD_TEXT_RU; - filesys_menu.usb_sys = U_DISK_TEXT_RU; - // WIFI - wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_RU; - // wifi_menu.ip = WIFI_IP_TEXT_RU; - // wifi_menu.state = WIFI_STA_TEXT_RU; - wifi_menu.cloud = CLOUD_TEXT_RU; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_RU; - - - cloud_menu.title = TITLE_CLOUD_TEXT_RU; - cloud_menu.bind = CLOUD_BINDED_RU; - cloud_menu.binded = CLOUD_BINDED_RU; - cloud_menu.unbind = CLOUD_UNBIND_RU; - cloud_menu.unbinding = CLOUD_UNBINDED_RU; - cloud_menu.disconnected = CLOUD_DISCONNECTED_RU; - cloud_menu.disable = CLOUD_DISABLE_RU; - // - about_menu.title = ABOUT_TEXT_RU; - about_menu.type = ABOUT_TYPE_TEXT_RU; - about_menu.version = ABOUT_VERSION_TEXT_RU; - about_menu.wifi = ABOUT_WIFI_TEXT_RU; - // - fan_menu.title = FAN_TEXT_RU; - fan_menu.add = FAN_ADD_TEXT_RU; - fan_menu.dec = FAN_DEC_TEXT_RU; - fan_menu.state = FAN_TIPS1_TEXT_RU; - // - filament_menu.title = TITLE_FILAMENT_RU; - filament_menu.in = FILAMENT_IN_TEXT_RU; - filament_menu.out = FILAMENT_OUT_TEXT_RU; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_RU; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_RU; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_RU; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_RU; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_RU; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU; - - // - language_menu.title = LANGUAGE_TEXT_RU; - language_menu.next = PAGE_DOWN_TEXT_RU; - language_menu.up = PAGE_UP_TEXT_RU; - // - printing_menu.title = TITLE_PRINTING_RU; - printing_menu.option = PRINTING_OPERATION_RU; - printing_menu.stop = PRINTING_STOP_RU; - printing_menu.pause = PRINTING_PAUSE_RU; - printing_menu.resume = PRINTING_RESUME_RU; - - // - operation_menu.title = TITLE_OPERATION_RU; - operation_menu.pause = PRINTING_PAUSE_RU; - operation_menu.stop = PRINTING_STOP_RU; - operation_menu.temp = PRINTING_TEMP_RU; - operation_menu.fan = FAN_TEXT_RU; - operation_menu.extr = PRINTING_EXTRUDER_RU; - operation_menu.speed = PRINTING_CHANGESPEED_RU; - operation_menu.filament = FILAMENT_TEXT_RU; - operation_menu.more = PRINTING_MORE_RU; - operation_menu.move = PRINTING_MOVE_RU; - operation_menu.auto_off = AUTO_SHUTDOWN_RU; - operation_menu.manual_off = MANUAL_SHUTDOWN_RU; - // - pause_menu.title = TITLE_PAUSE_RU; - pause_menu.resume = PRINTING_RESUME_RU; - pause_menu.stop = PRINTING_STOP_RU; - pause_menu.extrude = PRINTING_EXTRUDER_RU; - pause_menu.move = PRINTING_MOVE_RU; - pause_menu.filament = FILAMENT_TEXT_RU; - pause_menu.more = PRINTING_MORE_RU; - - // - speed_menu.title = PRINTING_CHANGESPEED_RU; - speed_menu.add = ADD_TEXT_RU; - speed_menu.dec = DEC_TEXT_RU; - speed_menu.move = MOVE_SPEED_RU; - speed_menu.extrude = EXTRUDER_SPEED_RU; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_RU; - speed_menu.move_speed = MOVE_SPEED_STATE_RU; - // - printing_more_menu.title = TITLE_MORE_RU; - printing_more_menu.fan = FAN_TEXT_RU; - printing_more_menu.auto_close = AUTO_SHUTDOWN_RU; - printing_more_menu.manual = MANUAL_SHUTDOWN_RU; - printing_more_menu.speed = PRINTING_CHANGESPEED_RU; - printing_more_menu.temp = PRINTING_TEMP_RU; - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_RU; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_RU; - print_file_dialog_menu.cancle = DIALOG_CANCLE_RU; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_RU; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_RU; - print_file_dialog_menu.retry = DIALOG_RETRY_RU; - print_file_dialog_menu.stop = DIALOG_STOP_RU; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_RU; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_RU; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_RU; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_RU; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_RU; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_RU; - print_file_dialog_menu.reprint = DIALOG_REPRINT_RU; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_RU; - - pause_msg_menu.pausing = MESSAGE_PAUSING_RU; - pause_msg_menu.changing = MESSAGE_CHANGING_RU; - pause_msg_menu.unload = MESSAGE_UNLOAD_RU; - pause_msg_menu.waiting = MESSAGE_WAITING_RU; - pause_msg_menu.insert = MESSAGE_INSERT_RU; - pause_msg_menu.load = MESSAGE_LOAD_RU; - pause_msg_menu.purge = MESSAGE_PURGE_RU; - pause_msg_menu.resume = MESSAGE_RESUME_RU; - pause_msg_menu.heat = MESSAGE_HEAT_RU; - pause_msg_menu.heating = MESSAGE_HEATING_RU; - pause_msg_menu.option = MESSAGE_OPTION_RU; - pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_RU; - pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_RU; - eeprom_menu.title = EEPROM_SETTINGS_TITLE_RU; - eeprom_menu.store = EEPROM_SETTINGS_STORE_RU; - eeprom_menu.read = EEPROM_SETTINGS_READ_RU; - eeprom_menu.revert = EEPROM_SETTINGS_REVERT_RU; - eeprom_menu.storeTips = EEPROM_STORE_TIPS_RU; - eeprom_menu.readTips = EEPROM_READ_TIPS_RU; - eeprom_menu.revertTips = EEPROM_REVERT_TIPS_RU; - break; - case LANG_SPANISH: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_SP; - common_menu.text_back = BACK_TEXT_SP; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_SP; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_SP; - common_menu.print_special_title = PRINTING_SP; - common_menu.pause_special_title = PRINTING_PAUSAR_SP; - common_menu.operate_special_title = PRINTING_AJUSTES_SP; - // - main_menu.title = TITLE_READYPRINT_SP; - main_menu.preheat = PREHEAT_TEXT_SP; - main_menu.move = MOVE_TEXT_SP; - main_menu.home = HOME_TEXT_SP; - main_menu.print = PRINT_TEXT_SP; - main_menu.extrude = EXTRUDE_TEXT_SP; - main_menu.leveling = LEVELING_TEXT_SP; - main_menu.autoleveling = AUTO_LEVELING_TEXT_SP; - main_menu.fan = FAN_TEXT_SP; - main_menu.set = SET_TEXT_SP; - main_menu.more = MORE_TEXT_SP; - main_menu.tool = TOOL_TEXT_SP; - // TOOL - tool_menu.title = TOOL_TEXT_SP; - tool_menu.preheat = TOOL_PREHEAT_SP; - tool_menu.extrude = TOOL_EXTRUDE_SP; - tool_menu.move = TOOL_MOVE_SP; - tool_menu.home = TOOL_HOME_SP; - tool_menu.leveling = TOOL_LEVELING_SP; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_SP; - tool_menu.filament = TOOL_FILAMENT_SP; - tool_menu.more = TOOL_MORE_SP; - // - preheat_menu.adjust_title = TITLE_ADJUST_SP; - preheat_menu.title = TITLE_PREHEAT_SP; - preheat_menu.add = ADD_TEXT_SP; - preheat_menu.dec = DEC_TEXT_SP; - preheat_menu.ext1 = EXTRUDER_1_TEXT_SP; - preheat_menu.ext2 = EXTRUDER_2_TEXT_SP; - preheat_menu.hotbed = HEATBED_TEXT_SP; - preheat_menu.off = CLOSE_TEXT_SP; - // - move_menu.title = MOVE_TEXT_SP; - // - home_menu.title = TITLE_HOME_SP; - home_menu.home_x = HOME_X_TEXT_SP; - home_menu.home_y = HOME_Y_TEXT_SP; - home_menu.home_z = HOME_Z_TEXT_SP; - home_menu.home_all = HOME_ALL_TEXT_SP; - home_menu.stopmove = HOME_STOPMOVE_SP; - // - file_menu.title = TITLE_CHOOSEFILE_SP; - file_menu.page_up = PAGE_UP_TEXT_SP; - file_menu.page_down = PAGE_DOWN_TEXT_SP; - file_menu.file_loading = FILE_LOADING_SP; - file_menu.no_file = NO_FILE_SP; - file_menu.no_file_and_check = NO_FILE_SP;// NO_FILE_AND_CHECK_SP; - // - extrude_menu.title = TITLE_EXTRUDE_SP; - extrude_menu.in = EXTRUDER_IN_TEXT_SP; - extrude_menu.out = EXTRUDER_OUT_TEXT_SP; - extrude_menu.ext1 = EXTRUDER_1_TEXT_SP; - extrude_menu.ext2 = EXTRUDER_2_TEXT_SP; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_SP; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_SP; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_SP; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_SP; - // - leveling_menu.title = TITLE_LEVELING_SP; - leveling_menu.position1 = LEVELING_POINT1_TEXT_SP; - leveling_menu.position2 = LEVELING_POINT2_TEXT_SP; - leveling_menu.position3 = LEVELING_POINT3_TEXT_SP; - leveling_menu.position4 = LEVELING_POINT4_TEXT_SP; - leveling_menu.position5 = LEVELING_POINT5_TEXT_SP; - // - set_menu.title = TITLE_SET_SP; - set_menu.filesys = FILESYS_TEXT_SP; - set_menu.wifi = WIFI_TEXT_SP; - set_menu.about = ABOUT_TEXT_SP; - set_menu.fan = FAN_TEXT_SP; - set_menu.filament = FILAMENT_TEXT_SP; - set_menu.breakpoint = BREAK_POINT_TEXT_SP; - set_menu.motoroff = MOTOR_OFF_TEXT_SP; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_SP; - set_menu.language = LANGUAGE_TEXT_SP; - set_menu.shutdown = SHUTDOWN_TEXT_SP; - set_menu.machine_para = MACHINE_PARA_SP; - set_menu.eepromSet = EEPROM_SETTINGS_SP; - more_menu.title = TITLE_MORE_SP; - // - filesys_menu.title = TITLE_FILESYS_SP; - filesys_menu.sd_sys = SD_CARD_TEXT_SP; - filesys_menu.usb_sys = U_DISK_TEXT_SP; - - // WIFI - wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_SP; - // wifi_menu.ip = WIFI_IP_TEXT_SP; - // wifi_menu.state = WIFI_STA_TEXT_SP; - wifi_menu.cloud = CLOUD_TEXT_SP; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_SP; - - cloud_menu.title = TITLE_CLOUD_TEXT_SP; - cloud_menu.bind = CLOUD_BINDED_SP; - cloud_menu.binded = CLOUD_BINDED_SP; - cloud_menu.unbind = CLOUD_UNBIND_SP; - cloud_menu.unbinding = CLOUD_UNBINDED_SP; - cloud_menu.disconnected = CLOUD_DISCONNECTED_SP; - cloud_menu.disable = CLOUD_DISABLE_SP; - // - about_menu.title = ABOUT_TEXT_SP; - about_menu.type = ABOUT_TYPE_TEXT_SP; - about_menu.version = ABOUT_VERSION_TEXT_SP; - about_menu.wifi = ABOUT_WIFI_TEXT_SP; - // - fan_menu.title = FAN_TEXT_SP; - fan_menu.add = FAN_ADD_TEXT_SP; - fan_menu.dec = FAN_DEC_TEXT_SP; - fan_menu.state = FAN_TIPS1_TEXT_SP; - // - filament_menu.title = TITLE_FILAMENT_SP; - filament_menu.in = FILAMENT_IN_TEXT_SP; - filament_menu.out = FILAMENT_OUT_TEXT_SP; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_SP; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_SP; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_SP; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_SP; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_SP; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP; - - // - language_menu.title = LANGUAGE_TEXT_SP; - language_menu.next = PAGE_DOWN_TEXT_SP; - language_menu.up = PAGE_UP_TEXT_SP; - // - printing_menu.title = TITLE_PRINTING_SP; - printing_menu.option = PRINTING_OPERATION_SP; - printing_menu.stop = PRINTING_STOP_SP; - printing_menu.pause = PRINTING_PAUSE_SP; - printing_menu.resume = PRINTING_RESUME_SP; - - // - operation_menu.title = TITLE_OPERATION_SP; - operation_menu.pause = PRINTING_PAUSE_SP; - operation_menu.stop = PRINTING_STOP_SP; - operation_menu.temp = PRINTING_TEMP_SP; - operation_menu.fan = FAN_TEXT_SP; - operation_menu.extr = PRINTING_EXTRUDER_SP; - operation_menu.speed = PRINTING_CHANGESPEED_SP; - operation_menu.filament = FILAMENT_TEXT_SP; - operation_menu.more = PRINTING_MORE_SP; - operation_menu.move = PRINTING_MOVE_SP; - operation_menu.auto_off = AUTO_SHUTDOWN_SP; - operation_menu.manual_off = MANUAL_SHUTDOWN_SP; - // - pause_menu.title = TITLE_PAUSE_RU; - pause_menu.resume = PRINTING_RESUME_SP; - pause_menu.stop = PRINTING_STOP_SP; - pause_menu.extrude = PRINTING_EXTRUDER_SP; - pause_menu.move = PRINTING_MOVE_SP; - pause_menu.filament = FILAMENT_TEXT_SP; - pause_menu.more = PRINTING_MORE_SP; - - // - speed_menu.title = PRINTING_CHANGESPEED_SP; - speed_menu.add = ADD_TEXT_SP; - speed_menu.dec = DEC_TEXT_SP; - speed_menu.move = MOVE_SPEED_SP; - speed_menu.extrude = EXTRUDER_SPEED_SP; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_SP; - speed_menu.move_speed = MOVE_SPEED_STATE_SP; - // - printing_more_menu.title = TITLE_MORE_SP; - printing_more_menu.fan = FAN_TEXT_SP; - printing_more_menu.auto_close = AUTO_SHUTDOWN_SP; - printing_more_menu.manual = MANUAL_SHUTDOWN_SP; - printing_more_menu.speed = PRINTING_CHANGESPEED_SP; - printing_more_menu.temp = PRINTING_TEMP_SP; - - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_SP; - print_file_dialog_menu.cancle = DIALOG_CANCLE_SP; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_SP; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_SP; - print_file_dialog_menu.retry = DIALOG_RETRY_SP; - print_file_dialog_menu.stop = DIALOG_STOP_SP; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_SP; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_SP; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_SP; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_SP; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_SP; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_SP; - print_file_dialog_menu.reprint = DIALOG_REPRINT_SP; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_SP; - - pause_msg_menu.pausing = MESSAGE_PAUSING_SP; - pause_msg_menu.changing = MESSAGE_CHANGING_SP; - pause_msg_menu.unload = MESSAGE_UNLOAD_SP; - pause_msg_menu.waiting = MESSAGE_WAITING_SP; - pause_msg_menu.insert = MESSAGE_INSERT_SP; - pause_msg_menu.load = MESSAGE_LOAD_SP; - pause_msg_menu.purge = MESSAGE_PURGE_SP; - pause_msg_menu.resume = MESSAGE_RESUME_SP; - pause_msg_menu.heat = MESSAGE_HEAT_SP; - pause_msg_menu.heating = MESSAGE_HEATING_SP; - pause_msg_menu.option = MESSAGE_OPTION_SP; - pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_SP; - pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_SP; - eeprom_menu.title = EEPROM_SETTINGS_TITLE_SP; - eeprom_menu.store = EEPROM_SETTINGS_STORE_SP; - eeprom_menu.read = EEPROM_SETTINGS_READ_SP; - eeprom_menu.revert = EEPROM_SETTINGS_REVERT_SP; - eeprom_menu.storeTips = EEPROM_STORE_TIPS_SP; - eeprom_menu.readTips = EEPROM_READ_TIPS_SP; - eeprom_menu.revertTips = EEPROM_REVERT_TIPS_SP; - break; - - #endif // if 1 - - case LANG_FRENCH: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_FR; - common_menu.text_back = BACK_TEXT_FR; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_FR; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_FR; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; - common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; - - // - main_menu.title = TITLE_READYPRINT_FR; - main_menu.preheat = PREHEAT_TEXT_FR; - main_menu.move = MOVE_TEXT_FR; - main_menu.home = HOME_TEXT_FR; - main_menu.print = PRINT_TEXT_FR; - main_menu.extrude = EXTRUDE_TEXT_FR; - main_menu.leveling = LEVELING_TEXT_FR; - main_menu.autoleveling = AUTO_LEVELING_TEXT_FR; - main_menu.fan = FAN_TEXT_FR; - main_menu.set = SET_TEXT_FR; - main_menu.more = MORE_TEXT_FR; - main_menu.tool = TOOL_TEXT_FR; - // TOOL - tool_menu.title = TOOL_TEXT_FR; - tool_menu.preheat = TOOL_PREHEAT_FR; - tool_menu.extrude = TOOL_EXTRUDE_FR; - tool_menu.move = TOOL_MOVE_FR; - tool_menu.home = TOOL_HOME_FR; - tool_menu.leveling = TOOL_LEVELING_FR; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_FR; - tool_menu.filament = TOOL_FILAMENT_FR; - tool_menu.more = TOOL_MORE_FR; - // - preheat_menu.adjust_title = TITLE_ADJUST_FR; - preheat_menu.title = TITLE_PREHEAT_FR; - preheat_menu.add = ADD_TEXT_FR; - preheat_menu.dec = DEC_TEXT_FR; - preheat_menu.ext1 = EXTRUDER_1_TEXT_FR; - preheat_menu.ext2 = EXTRUDER_2_TEXT_FR; - preheat_menu.hotbed = HEATBED_TEXT_FR; - preheat_menu.off = CLOSE_TEXT_FR; - // - move_menu.title = MOVE_TEXT_FR; - // - home_menu.title = TITLE_HOME_FR; - home_menu.stopmove = HOME_STOPMOVE_FR; - // - file_menu.title = TITLE_CHOOSEFILE_FR; - file_menu.page_up = PAGE_UP_TEXT_FR; - file_menu.page_down = PAGE_DOWN_TEXT_FR; - // - extrude_menu.title = TITLE_EXTRUDE_FR; - extrude_menu.in = EXTRUDER_IN_TEXT_FR; - extrude_menu.out = EXTRUDER_OUT_TEXT_FR; - extrude_menu.ext1 = EXTRUDER_1_TEXT_FR; - extrude_menu.ext2 = EXTRUDER_2_TEXT_FR; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_FR; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_FR; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_FR; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_FR; - // - leveling_menu.title = TITLE_LEVELING_FR; - leveling_menu.position1 = LEVELING_POINT1_TEXT_FR; - leveling_menu.position2 = LEVELING_POINT2_TEXT_FR; - leveling_menu.position3 = LEVELING_POINT3_TEXT_FR; - leveling_menu.position4 = LEVELING_POINT4_TEXT_FR; - leveling_menu.position5 = LEVELING_POINT5_TEXT_FR; - // - set_menu.title = TITLE_SET_FR; - set_menu.filesys = FILESYS_TEXT_FR; - set_menu.wifi = WIFI_TEXT_FR; - set_menu.about = ABOUT_TEXT_FR; - set_menu.fan = FAN_TEXT_FR; - set_menu.filament = FILAMENT_TEXT_FR; - set_menu.breakpoint = BREAK_POINT_TEXT_FR; - set_menu.motoroff = MOTOR_OFF_TEXT_FR; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_FR; - set_menu.language = LANGUAGE_TEXT_FR; - set_menu.shutdown = SHUTDOWN_TEXT_FR; - set_menu.machine_para = MACHINE_PARA_FR; - set_menu.eepromSet = EEPROM_SETTINGS_FR; - more_menu.title = TITLE_MORE_FR; - // - filesys_menu.title = TITLE_FILESYS_FR; - filesys_menu.sd_sys = SD_CARD_TEXT_FR; - filesys_menu.usb_sys = U_DISK_TEXT_FR; - file_menu.file_loading = FILE_LOADING_FR; - file_menu.no_file = NO_FILE_FR; - file_menu.no_file_and_check = NO_FILE_FR;// NO_FILE_AND_CHECK_FR; - // WIFI - wifi_menu.title = WIFI_NAME_TEXT_FR; - // wifi_menu.key = WIFI_KEY_TEXT_FR; - // wifi_menu.ip = WIFI_IP_TEXT_FR; - // wifi_menu.state = WIFI_STA_TEXT_FR; - // wifi_menu.cloud = CLOSE_TEXT_FR; - wifi_menu.cloud = CLOUD_TEXT_FR; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_FR; - - cloud_menu.title = TITLE_CLOUD_TEXT_FR; - cloud_menu.bind = CLOUD_BINDED_FR; - cloud_menu.binded = CLOUD_BINDED_FR; - cloud_menu.unbind = CLOUD_UNBIND_FR; - cloud_menu.unbinding = CLOUD_UNBINDED_FR; - cloud_menu.disconnected = CLOUD_DISCONNECTED_FR; - cloud_menu.disable = CLOUD_DISABLE_FR; - // - about_menu.title = ABOUT_TEXT_FR; - about_menu.type = ABOUT_TYPE_TEXT_FR; - about_menu.version = ABOUT_VERSION_TEXT_FR; - about_menu.wifi = ABOUT_WIFI_TEXT_FR; - // - fan_menu.title = FAN_TEXT_FR; - fan_menu.add = FAN_ADD_TEXT_FR; - fan_menu.dec = FAN_DEC_TEXT_FR; - fan_menu.state = FAN_TIPS1_TEXT_FR; - // - filament_menu.title = TITLE_FILAMENT_FR; - filament_menu.in = FILAMENT_IN_TEXT_FR; - filament_menu.out = FILAMENT_OUT_TEXT_FR; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_FR; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_FR; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_FR; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_FR; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_FR; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR; - - // - language_menu.title = LANGUAGE_TEXT_FR; - - // - printing_menu.title = TITLE_PRINTING_FR; - printing_menu.option = PRINTING_OPERATION_FR; - printing_menu.stop = PRINTING_STOP_FR; - printing_menu.pause = PRINTING_PAUSE_FR; - printing_menu.resume = PRINTING_RESUME_FR; - - // - operation_menu.title = TITLE_OPERATION_FR; - operation_menu.pause = PRINTING_PAUSE_FR; - operation_menu.stop = PRINTING_STOP_FR; - operation_menu.temp = PRINTING_TEMP_FR; - operation_menu.fan = FAN_TEXT_FR; - operation_menu.extr = PRINTING_EXTRUDER_FR; - operation_menu.speed = PRINTING_CHANGESPEED_FR; - operation_menu.filament = FILAMENT_TEXT_FR; - operation_menu.more = PRINTING_MORE_FR; - operation_menu.move = PRINTING_MOVE_FR; - operation_menu.auto_off = AUTO_SHUTDOWN_FR; - operation_menu.manual_off = MANUAL_SHUTDOWN_FR; - // - pause_menu.title = TITLE_PAUSE_FR; - pause_menu.resume = PRINTING_RESUME_FR; - pause_menu.stop = PRINTING_STOP_FR; - pause_menu.extrude = PRINTING_EXTRUDER_FR; - pause_menu.move = PRINTING_MOVE_FR; - pause_menu.filament = FILAMENT_TEXT_FR; - pause_menu.more = PRINTING_MORE_FR; - - // - speed_menu.title = PRINTING_CHANGESPEED_FR; - speed_menu.add = ADD_TEXT_FR; - speed_menu.dec = DEC_TEXT_FR; - speed_menu.move = MOVE_SPEED_FR; - speed_menu.extrude = EXTRUDER_SPEED_FR; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_FR; - speed_menu.move_speed = MOVE_SPEED_STATE_FR; - // - printing_more_menu.fan = FAN_TEXT_FR; - printing_more_menu.auto_close = AUTO_SHUTDOWN_FR; - printing_more_menu.manual = MANUAL_SHUTDOWN_FR; - printing_more_menu.speed = PRINTING_CHANGESPEED_FR; - printing_more_menu.temp = PRINTING_TEMP_FR; - - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_FR; - print_file_dialog_menu.cancle = DIALOG_CANCLE_FR; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_FR; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_FR; - print_file_dialog_menu.retry = DIALOG_RETRY_FR; - print_file_dialog_menu.stop = DIALOG_STOP_FR; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_FR; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_FR; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_FR; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_FR; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_FR; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_FR; - print_file_dialog_menu.reprint = DIALOG_REPRINT_FR; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_FR; - - pause_msg_menu.pausing = MESSAGE_PAUSING_FR; - pause_msg_menu.changing = MESSAGE_CHANGING_FR; - pause_msg_menu.unload = MESSAGE_UNLOAD_FR; - pause_msg_menu.waiting = MESSAGE_WAITING_FR; - pause_msg_menu.insert = MESSAGE_INSERT_FR; - pause_msg_menu.load = MESSAGE_LOAD_FR; - pause_msg_menu.purge = MESSAGE_PURGE_FR; - pause_msg_menu.resume = MESSAGE_RESUME_FR; - pause_msg_menu.heat = MESSAGE_HEAT_FR; - pause_msg_menu.heating = MESSAGE_HEATING_FR; - pause_msg_menu.option = MESSAGE_OPTION_FR; - pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_FR; - pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_FR; - eeprom_menu.title = EEPROM_SETTINGS_TITLE_FR; - eeprom_menu.store = EEPROM_SETTINGS_STORE_FR; - eeprom_menu.read = EEPROM_SETTINGS_READ_FR; - eeprom_menu.revert = EEPROM_SETTINGS_REVERT_FR; - eeprom_menu.storeTips = EEPROM_STORE_TIPS_FR; - eeprom_menu.readTips = EEPROM_READ_TIPS_FR; - eeprom_menu.revertTips = EEPROM_REVERT_TIPS_FR; - break; - - case LANG_ITALY: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_IT; - common_menu.text_back = BACK_TEXT_IT; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_IT; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_IT; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; - common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; - - // - main_menu.title = TITLE_READYPRINT_IT; - main_menu.preheat = PREHEAT_TEXT_IT; - main_menu.move = MOVE_TEXT_IT; - main_menu.home = HOME_TEXT_IT; - main_menu.print = PRINT_TEXT_IT; - main_menu.extrude = EXTRUDE_TEXT_IT; - main_menu.leveling = LEVELING_TEXT_IT; - main_menu.autoleveling = AUTO_LEVELING_TEXT_IT; - main_menu.fan = FAN_TEXT_IT; - main_menu.set = SET_TEXT_IT; - main_menu.more = MORE_TEXT_IT; - main_menu.tool = TOOL_TEXT_IT; - // TOOL - tool_menu.title = TOOL_TEXT_IT; - tool_menu.preheat = TOOL_PREHEAT_IT; - tool_menu.extrude = TOOL_EXTRUDE_IT; - tool_menu.move = TOOL_MOVE_IT; - tool_menu.home = TOOL_HOME_IT; - tool_menu.leveling = TOOL_LEVELING_IT; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_IT; - tool_menu.filament = TOOL_FILAMENT_IT; - tool_menu.more = TOOL_MORE_IT; - // - preheat_menu.adjust_title = TITLE_ADJUST_IT; - preheat_menu.title = TITLE_PREHEAT_IT; - preheat_menu.add = ADD_TEXT_IT; - preheat_menu.dec = DEC_TEXT_IT; - preheat_menu.ext1 = EXTRUDER_1_TEXT_IT; - preheat_menu.ext2 = EXTRUDER_2_TEXT_IT; - preheat_menu.hotbed = HEATBED_TEXT_IT; - preheat_menu.off = CLOSE_TEXT_IT; - // - move_menu.title = MOVE_TEXT_IT; - // - home_menu.title = TITLE_HOME_IT; - home_menu.stopmove = HOME_STOPMOVE_IT; - // - file_menu.title = TITLE_CHOOSEFILE_IT; - file_menu.page_up = PAGE_UP_TEXT_IT; - file_menu.page_down = PAGE_DOWN_TEXT_IT; - file_menu.file_loading = FILE_LOADING_IT; - file_menu.no_file = NO_FILE_IT; - file_menu.no_file_and_check = NO_FILE_IT;// NO_FILE_AND_CHECK_IT; - // - extrude_menu.title = TITLE_EXTRUDE_IT; - extrude_menu.in = EXTRUDER_IN_TEXT_IT; - extrude_menu.out = EXTRUDER_OUT_TEXT_IT; - extrude_menu.ext1 = EXTRUDER_1_TEXT_IT; - extrude_menu.ext2 = EXTRUDER_2_TEXT_IT; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_IT; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_IT; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_IT; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_IT; - // - leveling_menu.title = TITLE_LEVELING_IT; - leveling_menu.position1 = LEVELING_POINT1_TEXT_IT; - leveling_menu.position2 = LEVELING_POINT2_TEXT_IT; - leveling_menu.position3 = LEVELING_POINT3_TEXT_IT; - leveling_menu.position4 = LEVELING_POINT4_TEXT_IT; - leveling_menu.position5 = LEVELING_POINT5_TEXT_IT; - // - set_menu.title = TITLE_SET_IT; - set_menu.filesys = FILESYS_TEXT_IT; - set_menu.wifi = WIFI_TEXT_IT; - set_menu.about = ABOUT_TEXT_IT; - set_menu.fan = FAN_TEXT_IT; - set_menu.filament = FILAMENT_TEXT_IT; - set_menu.breakpoint = BREAK_POINT_TEXT_IT; - set_menu.motoroff = MOTOR_OFF_TEXT_IT; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_IT; - set_menu.language = LANGUAGE_TEXT_IT; - set_menu.shutdown = SHUTDOWN_TEXT_IT; - set_menu.machine_para = MACHINE_PARA_IT; - set_menu.eepromSet = EEPROM_SETTINGS_IT; - more_menu.title = TITLE_MORE_IT; - // - filesys_menu.title = TITLE_FILESYS_IT; - filesys_menu.sd_sys = SD_CARD_TEXT_IT; - filesys_menu.usb_sys = U_DISK_TEXT_IT; - - // WIFI - wifi_menu.title = WIFI_NAME_TEXT_IT; - // wifi_menu.key = WIFI_KEY_TEXT_IT; - // wifi_menu.ip = WIFI_IP_TEXT_IT; - // wifi_menu.state = WIFI_STA_TEXT_IT; - wifi_menu.cloud = CLOSE_TEXT_IT; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_IT; - - cloud_menu.title = TITLE_CLOUD_TEXT_IT; - cloud_menu.bind = CLOUD_BINDED_IT; - cloud_menu.binded = CLOUD_BINDED_IT; - cloud_menu.unbind = CLOUD_UNBIND_IT; - cloud_menu.unbinding = CLOUD_UNBINDED_IT; - cloud_menu.disconnected = CLOUD_DISCONNECTED_IT; - cloud_menu.disable = CLOUD_DISABLE_IT; - // - about_menu.title = ABOUT_TEXT_IT; - about_menu.type = ABOUT_TYPE_TEXT_IT; - about_menu.version = ABOUT_VERSION_TEXT_IT; - about_menu.wifi = ABOUT_WIFI_TEXT_IT; - // - fan_menu.title = FAN_TEXT_IT; - fan_menu.add = FAN_ADD_TEXT_IT; - fan_menu.dec = FAN_DEC_TEXT_IT; - fan_menu.state = FAN_TIPS1_TEXT_IT; - // - filament_menu.title = TITLE_FILAMENT_IT; - filament_menu.in = FILAMENT_IN_TEXT_IT; - filament_menu.out = FILAMENT_OUT_TEXT_IT; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_IT; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_IT; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_IT; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_IT; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_IT; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT; - - // - language_menu.title = LANGUAGE_TEXT_IT; - - // - printing_menu.title = TITLE_PRINTING_IT; - printing_menu.option = PRINTING_OPERATION_IT; - printing_menu.stop = PRINTING_STOP_IT; - printing_menu.pause = PRINTING_PAUSE_IT; - printing_menu.resume = PRINTING_RESUME_IT; - - // - operation_menu.title = TITLE_OPERATION_IT; - operation_menu.pause = PRINTING_PAUSE_IT; - operation_menu.stop = PRINTING_STOP_IT; - operation_menu.temp = PRINTING_TEMP_IT; - operation_menu.fan = FAN_TEXT_IT; - operation_menu.extr = PRINTING_EXTRUDER_IT; - operation_menu.speed = PRINTING_CHANGESPEED_IT; - operation_menu.filament = FILAMENT_TEXT_IT; - operation_menu.more = PRINTING_MORE_IT; - operation_menu.move = PRINTING_MOVE_IT; - operation_menu.auto_off = AUTO_SHUTDOWN_IT; - operation_menu.manual_off = MANUAL_SHUTDOWN_IT; - // - pause_menu.title = TITLE_PAUSE_IT; - pause_menu.resume = PRINTING_RESUME_IT; - pause_menu.stop = PRINTING_STOP_IT; - pause_menu.extrude = PRINTING_EXTRUDER_IT; - pause_menu.move = PRINTING_MOVE_IT; - pause_menu.filament = FILAMENT_TEXT_IT; - pause_menu.more = PRINTING_MORE_IT; - - // - speed_menu.title = PRINTING_CHANGESPEED_IT; - speed_menu.add = ADD_TEXT_IT; - speed_menu.dec = DEC_TEXT_IT; - speed_menu.move = MOVE_SPEED_IT; - speed_menu.extrude = EXTRUDER_SPEED_IT; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_IT; - speed_menu.move_speed = MOVE_SPEED_STATE_IT; - // - printing_more_menu.fan = FAN_TEXT_IT; - printing_more_menu.auto_close = AUTO_SHUTDOWN_IT; - printing_more_menu.manual = MANUAL_SHUTDOWN_IT; - printing_more_menu.temp = PRINTING_TEMP_IT; - printing_more_menu.speed = PRINTING_CHANGESPEED_IT; - - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_IT; - print_file_dialog_menu.cancle = DIALOG_CANCLE_IT; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_IT; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_IT; - print_file_dialog_menu.retry = DIALOG_RETRY_IT; - print_file_dialog_menu.stop = DIALOG_STOP_IT; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_IT; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_IT; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_IT; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_IT; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_IT; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_IT; - print_file_dialog_menu.reprint = DIALOG_REPRINT_IT; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_IT; - - pause_msg_menu.pausing = MESSAGE_PAUSING_IT; - pause_msg_menu.changing = MESSAGE_CHANGING_IT; - pause_msg_menu.unload = MESSAGE_UNLOAD_IT; - pause_msg_menu.waiting = MESSAGE_WAITING_IT; - pause_msg_menu.insert = MESSAGE_INSERT_IT; - pause_msg_menu.load = MESSAGE_LOAD_IT; - pause_msg_menu.purge = MESSAGE_PURGE_IT; - pause_msg_menu.resume = MESSAGE_RESUME_IT; - pause_msg_menu.heat = MESSAGE_HEAT_IT; - pause_msg_menu.heating = MESSAGE_HEATING_IT; - pause_msg_menu.option = MESSAGE_OPTION_IT; - pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_IT; - pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_IT; - eeprom_menu.title = EEPROM_SETTINGS_TITLE_IT; - eeprom_menu.store = EEPROM_SETTINGS_STORE_IT; - eeprom_menu.read = EEPROM_SETTINGS_READ_IT; - eeprom_menu.revert = EEPROM_SETTINGS_REVERT_IT; - eeprom_menu.storeTips = EEPROM_STORE_TIPS_IT; - eeprom_menu.readTips = EEPROM_READ_TIPS_IT; - eeprom_menu.revertTips = EEPROM_REVERT_TIPS_IT; - break; - - #endif // if 1 - - default: - common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_EN; - common_menu.text_back = BACK_TEXT_EN; - common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_EN; - common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_EN; - common_menu.print_special_title = PRINTING_OTHER_LANGUGE; - common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE; - common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE; - // - main_menu.title = TITLE_READYPRINT_EN; - main_menu.preheat = PREHEAT_TEXT_EN; - main_menu.move = MOVE_TEXT_EN; - main_menu.home = HOME_TEXT_EN; - main_menu.print = PRINT_TEXT_EN; - main_menu.extrude = EXTRUDE_TEXT_EN; - main_menu.leveling = LEVELING_TEXT_EN; - main_menu.autoleveling = AUTO_LEVELING_TEXT_EN; - main_menu.fan = FAN_TEXT_EN; - main_menu.set = SET_TEXT_EN; - main_menu.more = MORE_TEXT_EN; - main_menu.tool = TOOL_TEXT_EN; - // TOOL - tool_menu.title = TOOL_TEXT_EN; - tool_menu.preheat = TOOL_PREHEAT_EN; - tool_menu.extrude = TOOL_EXTRUDE_EN; - tool_menu.move = TOOL_MOVE_EN; - tool_menu.home = TOOL_HOME_EN; - tool_menu.leveling = TOOL_LEVELING_EN; - tool_menu.autoleveling = TOOL_AUTO_LEVELING_EN; - tool_menu.filament = TOOL_FILAMENT_EN; - tool_menu.more = TOOL_MORE_EN; - // - preheat_menu.adjust_title = TITLE_ADJUST_EN; - preheat_menu.title = TITLE_PREHEAT_EN; - preheat_menu.add = ADD_TEXT_EN; - preheat_menu.dec = DEC_TEXT_EN; - preheat_menu.ext1 = EXTRUDER_1_TEXT_EN; - preheat_menu.ext2 = EXTRUDER_2_TEXT_EN; - preheat_menu.hotbed = HEATBED_TEXT_EN; - preheat_menu.off = CLOSE_TEXT_EN; - // - move_menu.title = TITLE_MOVE_EN; - // - home_menu.title = TITLE_HOME_EN; - home_menu.stopmove = HOME_STOPMOVE_EN; - // - file_menu.title = TITLE_CHOOSEFILE_EN; - file_menu.page_up = PAGE_UP_TEXT_EN; - file_menu.page_down = PAGE_DOWN_TEXT_EN; - file_menu.file_loading = FILE_LOADING_EN; - file_menu.no_file = NO_FILE_EN; - file_menu.no_file_and_check = NO_FILE_EN;// NO_FILE_AND_CHECK_EN; - // - extrude_menu.title = TITLE_EXTRUDE_EN; - extrude_menu.in = EXTRUDER_IN_TEXT_EN; - extrude_menu.out = EXTRUDER_OUT_TEXT_EN; - extrude_menu.ext1 = EXTRUDER_1_TEXT_EN; - extrude_menu.ext2 = EXTRUDER_2_TEXT_EN; - extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_EN; - extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_EN; - extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_EN; - extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_EN; - // - leveling_menu.title = TITLE_LEVELING_EN; - leveling_menu.position1 = LEVELING_POINT1_TEXT_EN; - leveling_menu.position2 = LEVELING_POINT2_TEXT_EN; - leveling_menu.position3 = LEVELING_POINT3_TEXT_EN; - leveling_menu.position4 = LEVELING_POINT4_TEXT_EN; - leveling_menu.position5 = LEVELING_POINT5_TEXT_EN; - // - set_menu.title = TITLE_SET_EN; - set_menu.filesys = FILESYS_TEXT_EN; - set_menu.wifi = WIFI_TEXT_EN; - set_menu.about = ABOUT_TEXT_EN; - set_menu.fan = FAN_TEXT_EN; - set_menu.filament = FILAMENT_TEXT_EN; - set_menu.breakpoint = BREAK_POINT_TEXT_EN; - set_menu.motoroff = MOTOR_OFF_TEXT_EN; - set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_EN; - set_menu.language = LANGUAGE_TEXT_EN; - set_menu.shutdown = SHUTDOWN_TEXT_EN; - set_menu.machine_para = MACHINE_PARA_EN; - set_menu.eepromSet = EEPROM_SETTINGS_EN; - // - more_menu.title = TITLE_MORE_EN; - // - filesys_menu.title = TITLE_FILESYS_EN; - filesys_menu.sd_sys = SD_CARD_TEXT_EN; - filesys_menu.usb_sys = U_DISK_TEXT_EN; - // WIFI - wifi_menu.title = WIFI_TEXT; - // wifi_menu.key = WIFI_KEY_TEXT_EN; - // wifi_menu.ip = WIFI_IP_TEXT_EN; - // wifi_menu.state = WIFI_STA_TEXT_EN; - wifi_menu.cloud = CLOUD_TEXT_EN; - wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN; - - cloud_menu.title = TITLE_CLOUD_TEXT_EN; - cloud_menu.bind = CLOUD_BINDED_EN; - cloud_menu.binded = CLOUD_BINDED_EN; - cloud_menu.unbind = CLOUD_UNBIND_EN; - cloud_menu.unbinding = CLOUD_UNBINDED_EN; - cloud_menu.disconnected = CLOUD_DISCONNECTED_EN; - cloud_menu.disable = CLOUD_DISABLE_EN; - // - about_menu.title = TITLE_ABOUT_EN; - about_menu.type = ABOUT_TYPE_TEXT_EN; - about_menu.version = ABOUT_VERSION_TEXT_EN; - about_menu.wifi = ABOUT_WIFI_TEXT_EN; - // - fan_menu.title = TITLE_FAN_EN; - fan_menu.add = FAN_ADD_TEXT_EN; - fan_menu.dec = FAN_DEC_TEXT_EN; - fan_menu.state = FAN_TIPS1_TEXT_EN; - // - filament_menu.title = TITLE_FILAMENT_EN; - filament_menu.in = FILAMENT_IN_TEXT_EN; - filament_menu.out = FILAMENT_OUT_TEXT_EN; - filament_menu.ext1 = FILAMENT_EXT0_TEXT_EN; - filament_menu.ext2 = FILAMENT_EXT1_TEXT_EN; - filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_EN; - filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN; - filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN; - filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_EN; - filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN; - filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN; - filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN; - filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_EN; - filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN; - - // - language_menu.title = TITLE_LANGUAGE_EN; - language_menu.next = PAGE_DOWN_TEXT_EN; - language_menu.up = PAGE_UP_TEXT_EN; - // - printing_menu.title = TITLE_PRINTING_EN; - printing_menu.option = PRINTING_OPERATION_EN; - printing_menu.stop = PRINTING_STOP_EN; - printing_menu.pause = PRINTING_PAUSE_EN; - printing_menu.resume = PRINTING_RESUME_EN; - - // - operation_menu.title = TITLE_OPERATION_EN; - operation_menu.pause = PRINTING_PAUSE_EN; - operation_menu.stop = PRINTING_STOP_EN; - operation_menu.temp = PRINTING_TEMP_EN; - operation_menu.fan = FAN_TEXT_EN; - operation_menu.extr = PRINTING_EXTRUDER_EN; - operation_menu.speed = PRINTING_CHANGESPEED_EN; - operation_menu.filament = FILAMENT_TEXT_EN; - operation_menu.more = PRINTING_MORE_EN; - operation_menu.move = PRINTING_MOVE_EN; - operation_menu.auto_off = AUTO_SHUTDOWN_EN; - operation_menu.manual_off = MANUAL_SHUTDOWN_EN; - // - pause_menu.title = TITLE_PAUSE_EN; - pause_menu.resume = PRINTING_RESUME_EN; - pause_menu.stop = PRINTING_STOP_EN; - pause_menu.extrude = PRINTING_EXTRUDER_EN; - pause_menu.move = PRINTING_MOVE_EN; - pause_menu.filament = FILAMENT_TEXT_EN; - pause_menu.more = PRINTING_MORE_EN; - - // - speed_menu.title = TITLE_CHANGESPEED_EN; - speed_menu.add = ADD_TEXT_EN; - speed_menu.dec = DEC_TEXT_EN; - speed_menu.move = MOVE_SPEED_EN; - speed_menu.extrude = EXTRUDER_SPEED_EN; - speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_EN; - speed_menu.move_speed = MOVE_SPEED_STATE_EN; - // - printing_more_menu.title = TITLE_MORE_EN; - printing_more_menu.fan = FAN_TEXT_EN; - printing_more_menu.auto_close = AUTO_SHUTDOWN_EN; - printing_more_menu.manual = MANUAL_SHUTDOWN_EN; - printing_more_menu.speed = PRINTING_CHANGESPEED_EN; - printing_more_menu.temp = PRINTING_TEMP_EN; - - // print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN; - print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN; - print_file_dialog_menu.cancle = DIALOG_CANCLE_EN; - print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN; - print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN; - print_file_dialog_menu.retry = DIALOG_RETRY_EN; - print_file_dialog_menu.stop = DIALOG_STOP_EN; - print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN; - print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_EN; - print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_EN; - print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_EN; - print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_EN; - print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN; - print_file_dialog_menu.reprint = DIALOG_REPRINT_EN; - print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN; - - pause_msg_menu.pausing = MESSAGE_PAUSING_EN; - pause_msg_menu.changing = MESSAGE_CHANGING_EN; - pause_msg_menu.unload = MESSAGE_UNLOAD_EN; - pause_msg_menu.waiting = MESSAGE_WAITING_EN; - pause_msg_menu.insert = MESSAGE_INSERT_EN; - pause_msg_menu.load = MESSAGE_LOAD_EN; - pause_msg_menu.purge = MESSAGE_PURGE_EN; - pause_msg_menu.resume = MESSAGE_RESUME_EN; - pause_msg_menu.heat = MESSAGE_HEAT_EN; - pause_msg_menu.heating = MESSAGE_HEATING_EN; - pause_msg_menu.option = MESSAGE_OPTION_EN; - pause_msg_menu.purgeMore = MESSAGE_PURGE_MORE_EN; - pause_msg_menu.continuePrint = MESSAGE_CONTINUE_PRINT_EN; - eeprom_menu.title = EEPROM_SETTINGS_TITLE_EN; - eeprom_menu.store = EEPROM_SETTINGS_STORE_EN; - eeprom_menu.read = EEPROM_SETTINGS_READ_EN; - eeprom_menu.revert = EEPROM_SETTINGS_REVERT_EN; - eeprom_menu.storeTips = EEPROM_STORE_TIPS_EN; - eeprom_menu.readTips = EEPROM_READ_TIPS_EN; - eeprom_menu.revertTips = EEPROM_REVERT_TIPS_EN; - break; - } -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h deleted file mode 100644 index 675fd41f16..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ /dev/null @@ -1,837 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_Language_en.h" -#include "tft_Language_s_cn.h" -#include "tft_Language_t_cn.h" -#include "tft_Language_ru.h" -#include "tft_Language_fr.h" -#include "tft_Language_sp.h" -#include "tft_Language_it.h" - -extern void disp_language_init(); - -#define LANG_SIMPLE_CHINESE 1 -#define LANG_COMPLEX_CHINESE 2 -#define LANG_ENGLISH 3 -#define LANG_JAPAN 4 -#define LANG_GERMAN 5 -#define LANG_FRENCH 6 -#define LANG_RUSSIAN 7 -#define LANG_KOREAN 8 -#define LANG_TURKISH 9 -#define LANG_SPANISH 10 -#define LANG_GREEK 11 -#define LANG_ITALY 12 -#define LANG_PORTUGUESE 13 - -#define MULTI_LANGUAGE_ENABLE 1 -#define MULTI_LANGUAGE_DISABLE 0 - -typedef struct machine_common_disp{ - const char *default_value; - - const char *next; - const char *previous; - - const char *MachineConfigTitle; - const char *MachineType; - const char *Stroke; - const char *HomeDir; - const char *EndStopType; - const char *FilamentConf; - - const char *MachineTypeConfTitle; - const char *xyz; - const char *delta; - const char *corexy; - - const char *StrokeConfTitle; - const char *xStroke; - const char *yStroke; - const char *zStroke; - - const char *xmin; - const char *ymin; - const char *zmin; - - const char *HomeDirConfTitle; - const char *xHomeDir; - const char *yHomeDir; - const char *zHomeDir; - const char *min; - const char *max; - - const char *EndstopConfTitle; - const char *xEndstop_min; - const char *yEndstop_min; - const char *zEndstop_min; - const char *xEndstop_max; - const char *yEndstop_max; - const char *zEndstop_max; - const char *FilamentEndstop; - const char *LevelingEndstop; - const char *opened; - const char *closed; - - const char *FilamentConfTitle; - const char *InLength; - const char *InSpeed; - const char *FilamentTemperature; - const char *OutLength; - const char *OutSpeed; - - const char *LevelingParaConfTitle; - const char *LevelingParaConf; - const char *LevelingManuPosConf; - const char *LevelingAutoCommandConf; - const char *LevelingAutoZoffsetConf; - - const char *LevelingSubConfTitle; - const char *AutoLevelEnable; - const char *BLtouchEnable; - const char *ProbePort; - const char *ProbeXoffset; - const char *ProbeYoffset; - const char *ProbeZoffset; - const char *ProbeXYspeed; - const char *ProbeZspeed; - const char *enable; - const char *disable; - const char *z_min; - const char *z_max; - - const char *LevelingSubDeltaConfTitle; - const char *MachineRadius; - const char *DiagonalRod; - const char *PrintableRadius; - const char *DeltaHeight; - const char *SmoothRodOffset; - const char *EffectorOffset; - const char *CalibrationRadius; - - const char *LevelingSubXYZConfTitle; - //const char *Level_positon1; - //const char *Level_positon2; - //const char *Level_positon3; - //const char *Level_positon4; - - const char *TemperatureConfTitle; - const char *NozzleConf; - const char *HotBedConf; - const char *PreheatTemperConf; - - const char *NozzleCnt; - const char *NozzleConfTitle; - const char *NozzleType; - const char *NozzleAdjustType; - const char *NozzleMinTemperature; - const char *NozzleMaxTemperature; - const char *Extrude_Min_Temper; - - const char *HotbedEnable; - const char *HotbedConfTitle; - const char *HotbedAjustType; - const char *HotbedMinTemperature; - const char *HotbedMaxTemperature; - - const char *MotorConfTitle; - const char *MaxFeedRateConf; - const char *AccelerationConf; - const char *JerkConf; - const char *StepsConf; - const char *MotorDirConf; - const char *HomeFeedRateConf; - const char *TMCcurrentConf; - const char *TMCStepModeConf; - const char *HomingSensitivityConf; - - const char *MaxFeedRateConfTitle; - const char *XMaxFeedRate; - const char *YMaxFeedRate; - const char *ZMaxFeedRate; - const char *E0MaxFeedRate; - const char *E1MaxFeedRate; - - const char *AccelerationConfTitle; - const char *PrintAcceleration; - const char *RetractAcceleration; - const char *TravelAcceleration; - const char *X_Acceleration; - const char *Y_Acceleration; - const char *Z_Acceleration; - const char *E0_Acceleration; - const char *E1_Acceleration; - - const char *JerkConfTitle; - const char *X_Jerk; - const char *Y_Jerk; - const char *Z_Jerk; - const char *E_Jerk; - - const char *StepsConfTitle; - const char *X_Steps; - const char *Y_Steps; - const char *Z_Steps; - const char *E0_Steps; - const char *E1_Steps; - - const char *TmcCurrentConfTitle; - const char *X_Current; - const char *Y_Current; - const char *Z_Current; - const char *E0_Current; - const char *E1_Current; - - const char *TmcStepModeConfTitle; - const char *X_StepMode; - const char *Y_StepMode; - const char *Z_StepMode; - const char *E0_StepMode; - const char *E1_StepMode; - - const char *HomingSensitivityConfTitle; - const char *X_Sensitivity; - const char *Y_Sensitivity; - const char *Z_Sensitivity; - const char *Z2_Sensitivity; - - const char *MotorDirConfTitle; - const char *X_MotorDir; - const char *Y_MotorDir; - const char *Z_MotorDir; - const char *E0_MotorDir; - const char *E1_MotorDir; - const char *Invert_1; - const char *Invert_0; - - const char *HomeFeedRateConfTitle; - const char *XY_HomeFeedRate; - const char *Y_HomeFeedRate; - const char *Z_HomeFeedRate; - - const char *AdvancedConfTitle; - const char *PwrOffDection; - const char *PwrOffAfterPrint; - const char *HaveUps; - const char *Z2andZ2Endstop; - const char *EnablePinsInvert; - const char *PausePosition; - const char *WifiSettings; - const char *EncoderSettings; - - const char *Z2ConfTitle; - const char *Z2Enable; - const char *Z2EndstopEnable; - const char *Z2Port; - - const char *EnablePinsInvertTitle; - const char *XInvert; - const char *YInvert; - const char *ZInvert; - const char *EInvert; - - const char *key_1; - const char *key_2; - const char *key_3; - const char *key_4; - const char *key_5; - const char *key_6; - const char *key_7; - const char *key_8; - const char *key_9; - const char *key_0; - const char *key_point; - const char *key_back; - const char *key_reset; - const char *key_confirm; - const char *negative; - const char *low_level; - const char *high_level; - - const char *PausePosText; - const char *xPos; - const char *yPos; - const char *zPos; - - const char *WifiConfTitle; - const char *wifiMode; - const char *wifiName; - const char *wifiPassWord; - const char *wifiCloud; - const char *wifiConfig; - const char *wifiEdit; - const char *wifiConfigTips; - - const char *OffsetConfTitle; - const char *Xoffset; - const char *Yoffset; - const char *Zoffset; - - const char *EncoderConfTitle; - const char *EncoderConfText; - -} machine_common_def; - -extern machine_common_def machine_menu; - -typedef struct common_menu_disp { - const char *text_back; - const char *dialog_confirm_title; - const char *close_machine_tips; - const char *unbind_printer_tips; - const char *print_special_title; - const char *pause_special_title; - const char *operate_special_title; - const char *next; - const char *previous; -} common_menu_def; - -extern common_menu_def common_menu; - -typedef struct main_menu_disp { - const char *title; - const char *preheat; - const char *move; - const char *home; - const char *print; - const char *extrude; - const char *leveling; - const char *autoleveling; - const char *fan; - const char *set; - const char *tool; - const char *more; - const char *machine_para; -} main_menu_def; - -extern main_menu_def main_menu; - -typedef struct preheat_menu_disp { - const char *adjust_title; - const char *title; - const char *add; - const char *dec; - const char *ext1; - const char *ext2; - const char *hotbed; - const char *off; - const char *step_1c; - const char *step_5c; - const char *step_10c; - const char *back; - - const char *value_state; - - const char *dialog_tips; - -} preheat_menu_def; - -extern preheat_menu_def preheat_menu; - -typedef struct move_menu_disp { - const char *title; - const char *x_add; - const char *x_dec; - const char *y_add; - const char *y_dec; - const char *z_add; - const char *z_dec; - const char *step_001mm; - const char *step_005mm; - const char *step_01mm; - const char *step_1mm; - const char *step_10mm; - const char *back; -} move_menu_def; - -extern move_menu_def move_menu; - -typedef struct home_menu_disp { - const char *title; - const char *home_all; - const char *home_x; - const char *home_y; - const char *home_z; - const char *stopmove; - const char *back; -} home_menu_def; - -extern home_menu_def home_menu; - -typedef struct file_menu_disp { - const char *title; - const char *page_up; - const char *page_down; - const char *back; - - const char *file_loading; - const char *no_file; - const char *no_file_and_check; - -} file_menu_def; - -extern file_menu_def file_menu; - -typedef struct extrude_menu_disp { - const char *title; - const char *in; - const char *out; - const char *ext1; - const char *ext2; - const char *step_1mm; - const char *step_5mm; - const char *step_10mm; - const char *low; - const char *normal; - const char *high; - const char *back; - - const char *count_value_mm; - const char *count_value_cm; - const char *count_value_m; - const char *temp_value; - const char *temper_text; -} extrude_menu_def; - -extern extrude_menu_def extrude_menu; - -typedef struct leveling_menu_disp { - const char *title; - const char *position1; - const char *position2; - const char *position3; - const char *position4; - const char *position5; - - char *back; -} leveling_menu_def; - -extern leveling_menu_def leveling_menu; - -typedef struct set_menu_disp { - const char *title; - const char *filesys; - const char *wifi; - const char *about; - const char *fan; - const char *filament; - const char *breakpoint; - const char *motoroff; - const char *motoroffXY; - const char *shutdown; - const char *language; - const char *machine_para; - const char *eepromSet; - const char *back; -} set_menu_def; - -extern set_menu_def set_menu; - -typedef struct filesys_menu_disp { - const char *title; - const char *filesys; - const char *sd_sys; - const char *usb_sys; - const char *back; -} filesys_menu_def; - -extern filesys_menu_def filesys_menu; - -typedef struct more_menu_disp { - const char *title; - const char *back; -} more_menu_def; - -extern more_menu_def more_menu; - -typedef struct wifi_menu_disp { - const char *title; - const char *ip; - const char *wifi; - const char *key; - const char *state_ap; - const char *state_sta; - const char *cloud; - const char *connected; - const char *disconnected; - const char *exception; - const char *back; - const char *reconnect; -} wifi_menu_def; - -extern wifi_menu_def wifi_menu; - -typedef struct cloud_menu_disp { - const char *title; - const char *unbind; - const char *unbinding; - const char *unbinded; - const char *bind; - const char *binding; - const char *binded; - const char *disable; - const char *disconnected; - const char *back; - const char *unbind_printer_tips; -} cloud_menu_def; - -extern cloud_menu_def cloud_menu; - -typedef struct about_menu_disp { - const char *title; - const char *type_name; - const char *firmware_v; - const char *type; - const char *version; - const char *wifi; - const char *type_robin; - const char *type_robin_mini; - const char *back; -} about_menu_def; - -extern about_menu_def about_menu; - -typedef struct fan_menu_disp { - const char *title; - const char *add; - const char *dec; - const char *full; - const char *half; - const char *off; - const char *back; - - const char *state; - const char *state_value; -} fan_menu_def; - -extern fan_menu_def fan_menu; - -typedef struct filament_menu_disp { - const char *title; - const char *in; - const char *out; - const char *ext1; - const char *ext2; - const char *back; - const char *stat_temp; - const char *ready_replace; - const char *replacing; - const char *loading; - const char *unloading; - const char *heating; - const char *complete_and_back; - const char *filament_dialog_load_heat; - const char *filament_dialog_unload_heat; - const char *filament_dialog_load_heat_confirm; - const char *filament_dialog_unload_heat_confirm; - const char *filament_dialog_loading; - const char *filament_dialog_unloading; - const char *filament_dialog_load_completed; - const char *filament_dialog_unload_completed; - const char *filament_dialog_ok; - const char *filament_dialog_back; -} filament_menu_def; - -extern filament_menu_def filament_menu; - -typedef struct language_menu { - const char *title; - const char *chinese_s; - const char *chinese_t; - const char *english; - const char *russian; - const char *japan; - const char *italy; - const char *german; - const char *spanish; - const char *korean; - const char *french; - const char *brazil; - const char *portuguese; - const char *next; - const char *up; - const char *back; -} language_menu_def; - -extern language_menu_def language_menu; - -typedef struct printing_menu_disp { - const char *title; - const char *option; - const char *temp1; - const char *temp2; - const char *bed_temp; - const char *fan_speed; - const char *pause; - const char *resume; - const char *stop; -} printing_menu_def; - -extern printing_menu_def printing_menu; - -typedef struct operation_menu_disp { - const char *title; - const char *pause; - const char *stop; - const char *temp; - const char *fan; - const char *filament; - const char *extr; - const char *speed; - const char *move; - const char *more; - const char *auto_off; - const char *manual_off; - const char *back; - const char *babystep; -} operation_menu_def; - -extern operation_menu_def operation_menu; - -typedef struct pause_menu_disp { - const char *title; - const char *resume; - const char *stop; - const char *extrude; - const char *move; - const char *filament; - const char *more; -} pause_menu_def; - -extern pause_menu_def pause_menu; - -typedef struct speed_menu_disp { - const char *title; - const char *add; - const char *dec; - const char *extrude; - const char *move; - const char *step_1percent; - const char *step_5percent; - const char *step_10percent; - const char *back; - const char *move_speed; - const char *extrude_speed; -} speed_menu_def; - -extern speed_menu_def speed_menu; - -typedef struct printing_more_menu_disp { - const char *title; - const char *fan; - const char *auto_close; - const char *manual; - const char *temp; - const char *speed; - const char *back; -} printing_more_menu_def; - -extern printing_more_menu_def printing_more_menu; - -typedef struct dialog_menu_disp { - const char *confirm_title; - - const char *error1_repint_no_file; - const char *error2_communication_fail; - const char *error3_filename_too_long; - const char *error4_no_file; - const char *error5_check_filesys; - - const char *tip1_print_file; - const char *tip2_stop_file; -} dialog_menu_def; - -extern dialog_menu_def dialog_menu; - -typedef struct print_file_dialog_disp { - const char *title; - const char *confirm; - const char *cancle; - const char *print_file; - const char *cancle_print; - const char *retry; - const char *stop; - const char *no_file_print_tips; - const char *print_from_breakpoint; - const char *file_name_too_long_error; - const char *close_machine_error; - const char *filament_no_press; - const char *print_finish; - const char *print_time; - const char *reprint; - const char *wifi_enable_tips; -} print_file_dialog_menu_def; - -extern print_file_dialog_menu_def print_file_dialog_menu; - -typedef struct tool_menu_disp { - const char *title; - const char *preheat; - const char *extrude; - const char *move; - const char *home; - const char *leveling; - const char *autoleveling; - const char *filament; - const char *more; - const char *back; -} tool_menu_def; - -extern tool_menu_def tool_menu; - -typedef struct MachinePara_menu_disp { - const char *title; - const char *MachineSetting; - const char *MotorSetting; - const char *leveling; - const char *AdvanceSetting; -} MachinePara_menu_def; - -extern MachinePara_menu_def MachinePara_menu; - -typedef struct pause_msg_disp { - const char *pausing; - const char *changing; - const char *unload; - const char *waiting; - const char *insert; - const char *load; - const char *purge; - const char *resume; - const char *heat; - const char *heating; - const char *option; - const char *purgeMore; - const char *continuePrint; -} pause_msg_def; - -extern pause_msg_def pause_msg_menu; - -typedef struct eeprom_disp{ - const char *title; - const char *store; - const char *read; - const char *revert; - const char *storeTips; - const char *readTips; - const char *revertTips; -} eeprom_def; - -extern eeprom_def eeprom_menu; -/*****************************************/ -//********************************************// -//#if defined(TFT70) -// -//#elif defined(TFT35) -#define TEXT_VALUE "%d/%d" -//#endif - -#define TEXT_VALUE_T ": %d℃" -#define TEXT_VALUE_mm ": %dmm" -#define TEXT_VALUE_cm ": %dcm" -#define TEXT_VALUE_m ": %dm" - -#define TEMP_UNIT_SYBOL "%d℃" -#define FLOAT_TEMP_UNIT_SYBOL "%.1f℃" - -#define TEXT_1C "1℃" -#define TEXT_5C "5℃" -#define TEXT_10C "10℃" - -#define AXIS_X_ADD_TEXT "X+" -#define AXIS_X_DEC_TEXT "X-" -#define AXIS_Y_ADD_TEXT "Y+" -#define AXIS_Y_DEC_TEXT "Y-" -#define AXIS_Z_ADD_TEXT "Z+" -#define AXIS_Z_DEC_TEXT "Z-" -#define TEXT_001MM "0.01mm" -#define TEXT_005MM "0.05mm" -#define TEXT_01MM "0.1mm" -#define TEXT_1MM "1mm" -#define TEXT_10MM "10mm" - -#define EXTRUDE_1MM_TEXT "1mm" -#define EXTRUDE_5MM_TEXT "5mm" -#define EXTRUDE_10MM_TEXT "10mm" - -#define STEP_1PERCENT "1%" -#define STEP_5PERCENT "5%" -#define STEP_10PERCENT "10%" - -#define LANGUAGE_S_CN "简体" -#define LANGUAGE_T_CN "繁体" -#define LANGUAGE_EN "English" -#define LANGUAGE_JP "日本語" -#define LANGUAGE_GE "Deutsch" -#define LANGUAGE_FR "français" -#define LANGUAGE_IT "Italiano" -#define LANGUAGE_PR "português" -#define LANGUAGE_KR "Korean" -#define LANGUAGE_BR "Brazil" -#define LANGUAGE_RU "русский" -#define LANGUAGE_SP "español" - -#define HOME_X_TEXT "X" -#define HOME_Y_TEXT "Y" -#define HOME_Z_TEXT "Z" -#define HOME_ALL_TEXT "All" -//#if defined(MKS_ROBIN_NANO) -#define ABOUT_TYPE_TEXT "MKS Robin Pro" -//#elif defined(MKS_ROBIN_MINI) -//#define ABOUT_TYPE_TEXT "MKS Robin Mini" -//#endif -#define ABOUT_VERSION_TEXT "1.0.0" -//#define ABOUT_WIFI_TEXT "WiFi:" - -#define FAN_OPEN_TEXT "100%" -#define FAN_HALF_TEXT "50%" -#define FAN_CLOSE_TEXT "0%" -//#define FAN_TIPS1_TEXT "FAN" -//#define FAN_TIPS2_TEXT "FAN\nClose" - -#define WIFI_TEXT "WIFI" -#define WIFI_IP_TEXT "IP: " -#define WIFI_NAME_TEXT "WiFi: " -#define WIFI_KEY_TEXT "Key: " -#define WIFI_STATE_AP_TEXT "State: AP" -#define WIFI_STATE_STA_TEXT "State: STA" -#define WIFI_CONNECTED_TEXT "Connected" -#define WIFI_DISCONNECTED_TEXT "Disconnected" -#define WIFI_EXCEPTION_TEXT "Exception" - -#define FILAMENT_TIPS2_TEXT "T:" - -#define DIALOG_UPLOAD_ING_EN "Uploading......" -#define DIALOG_UPLOAD_ERROR_EN "Upload error" -#define DIALOG_UPLOAD_FINISH_EN "Upload finished" -#define DIALOG_UPLOAD_SIZE_EN "Size" -#define DIALOG_UPLOAD_TIME_EN "Time" -#define DIALOG_UPLOAD_SPEED_EN "Speed" -#define DIALOG_UPDATE_WIFI_FIRMWARE_EN "Updating wifi model firmware" -#define DIALOG_UPDATE_WIFI_WEB_EN "Updating wifi model web data" -#define DIALOG_UPDATE_NO_DEVICE_EN "please check \nwether memory device insert!" - -#define ZOFFSET_STEP001 "0.01mm" -#define ZOFFSET_STEP01 "0.1mm" -#define ZOFFSET_STEP1 "1mm" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp deleted file mode 100644 index 01c86ad7cb..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "draw_ui.h" -#include "wifiSerial.h" - -#if ENABLED(USE_WIFI_FUNCTION) - -#include -#include -#include -#include -#include - -#include "../../../../MarlinCore.h" - -DEFINE_WFSERIAL(WifiSerial1, 1); - -WifiSerial::WifiSerial(usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) { - this->usart_device = usart_device; - this->tx_pin = tx_pin; - this->rx_pin = rx_pin; -} - -/** - * Set up / tear down - */ -#if STM32_MCU_SERIES == STM32_SERIES_F1 - /* F1 MCUs have no GPIO_AFR[HL], so turn off PWM if there's a conflict - * on this GPIO bit. */ - static void disable_timer_if_necessary(timer_dev *dev, uint8 ch) { - if (dev != nullptr) timer_set_mode(dev, ch, TIMER_DISABLED); - } -#elif STM32_MCU_SERIES == STM32_SERIES_F2 || STM32_MCU_SERIES == STM32_SERIES_F4 - #define disable_timer_if_necessary(dev, ch) ((void)0) -#else - #warning "Unsupported STM32 series; timer conflicts are possible" -#endif - -void WifiSerial::begin(uint32 baud) { begin(baud, SERIAL_8N1); } - -/** - * Roger Clark. - * Note. The config parameter is not currently used. This is a work in progress. - * Code needs to be written to set the config of the hardware serial control register in question. - */ - -void WifiSerial::begin(uint32 baud, uint8_t config) { - //ASSERT(baud <= this->usart_device->max_baud); // Roger Clark. Assert doesn't do anything useful, we may as well save the space in flash and ram etc - - if (baud > this->usart_device->max_baud) return; - - const stm32_pin_info *txi = &PIN_MAP[this->tx_pin], - *rxi = &PIN_MAP[this->rx_pin]; - - disable_timer_if_necessary(txi->timer_device, txi->timer_channel); - - usart_init(this->usart_device); - - // Reinitialize the receive buffer, mks_esp8266 fixed data frame length is 1k bytes - rb_init(this->usart_device->rb, WIFI_RX_BUF_SIZE, wifiRxBuf); - - usart_config_gpios_async(this->usart_device, - rxi->gpio_device, rxi->gpio_bit, - txi->gpio_device, txi->gpio_bit, - config); - usart_set_baud_rate(this->usart_device, USART_USE_PCLK, baud); - usart_enable(this->usart_device); -} - -void WifiSerial::end(void) { - usart_disable(this->usart_device); -} - -int WifiSerial::available(void) { - return usart_data_available(this->usart_device); -} - -// -// I/O -// - -int WifiSerial::read(void) { - if (usart_data_available(usart_device) <= 0) return -1; - return usart_getc(usart_device); -} - -int WifiSerial::write(unsigned char ch) { - usart_putc(this->usart_device, ch); - return 1; -} - -int WifiSerial::wifi_rb_is_full(void) { - return rb_is_full(this->usart_device->rb); -} - -#endif // USE_WIFI_FUNCTION -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h deleted file mode 100644 index 9d3946fee7..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_lvgl_configuration.h" - -#if ENABLED(USE_WIFI_FUNCTION) - -#if SERIAL_PORT_2 != -1 - #error "SERIAL_PORT_2 must be set to -1 with HAS_TFT_LVGL_UI and USE_WIFI_FUNCTION." -#endif - -#define WIFI_BAUDRATE 115200 -#define WIFI_UPLOAD_BAUDRATE 1958400 -#define USART_SAFE_INSERT - -#define WIFI_RX_BUF_SIZE (1024+1) - -#include -#include -#include -#include -#include -#include - -#define DEFINE_WFSERIAL(name, n)\ - WifiSerial name(USART##n, \ - BOARD_USART##n##_TX_PIN, \ - BOARD_USART##n##_RX_PIN) - -class WifiSerial { - public: - uint8 wifiRxBuf[WIFI_RX_BUF_SIZE]; - - public: - WifiSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin); - - /* Set up/tear down */ - void begin(uint32 baud); - void begin(uint32 baud,uint8_t config); - void end(); - int available(void); - int read(void); - int write(uint8_t); - inline void wifi_usart_irq(usart_reg_map *regs) { - /* Handling RXNEIE and TXEIE interrupts. - * RXNE signifies availability of a byte in DR. - * - * See table 198 (sec 27.4, p809) in STM document RM0008 rev 15. - * We enable RXNEIE. - */ - if ((regs->CR1 & USART_CR1_RXNEIE) && (regs->SR & USART_SR_RXNE)) { - #ifdef USART_SAFE_INSERT - /* If the buffer is full and the user defines USART_SAFE_INSERT, - * ignore new bytes. */ - rb_safe_insert(this->usart_device->rb, (uint8)regs->DR); - #else - /* By default, push bytes around in the ring buffer. */ - rb_push_insert(this->usart_device->rb, (uint8)regs->DR); - #endif - } - /* TXE signifies readiness to send a byte to DR. */ - if ((regs->CR1 & USART_CR1_TXEIE) && (regs->SR & USART_SR_TXE)) { - if (!rb_is_empty(this->usart_device->wb)) - regs->DR=rb_remove(this->usart_device->wb); - else - regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE - } - } - - int wifi_rb_is_full(void); - - private: - struct usart_dev *usart_device; - uint8 tx_pin; - uint8 rx_pin; -}; - -extern WifiSerial WifiSerial1; - -#define WIFISERIAL WifiSerial1 - -#endif // USE_WIFI_FUNCTION diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp deleted file mode 100644 index f5d954792e..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ /dev/null @@ -1,1927 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "draw_ui.h" -#include "wifi_module.h" -#include "wifi_upload.h" - -#if ENABLED(USE_WIFI_FUNCTION) - -#include "../../../../MarlinCore.h" -#include "../../../../module/temperature.h" -#include "../../../../gcode/queue.h" -#include "../../../../gcode/gcode.h" -#include "../../../../lcd/ultralcd.h" -#include "../../../../sd/cardreader.h" -#include "../../../../module/planner.h" -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" -#endif -#if ENABLED(PARK_HEAD_ON_PAUSE) - #include "../../../../feature/pause.h" -#endif - -#define WIFI_SET() WRITE(WIFI_RESET_PIN, HIGH); -#define WIFI_RESET() WRITE(WIFI_RESET_PIN, LOW); -#define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); -#define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); - -extern uint8_t Explore_Disk (char* path , uint8_t recu_level); - -extern uint8_t commands_in_queue; -extern uint8_t sel_id; - -int usartFifoAvailable(SZ_USART_FIFO *fifo); -int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len); -int writeUsartFifo(SZ_USART_FIFO * fifo, int8_t * buf, int32_t len); -extern unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick); - -volatile SZ_USART_FIFO WifiRxFifo; - -#define WAIT_ESP_TRANS_TIMEOUT_TICK 10500 - -int cfg_cloud_flag = 0; - -extern PRINT_TIME print_time; - -char wifi_firm_ver[20] = {0}; -WIFI_GCODE_BUFFER espGcodeFifo; -extern uint8_t pause_resum; - -uint8_t wifi_connect_flg = 0; -extern volatile uint8_t get_temp_flag; - - -#define WIFI_MODE 2 -#define WIFI_AP_MODE 3 - -int upload_result = 0; - -uint32_t upload_time = 0; -uint32_t upload_size = 0; - -volatile WIFI_STATE wifi_link_state; -WIFI_PARA wifiPara; -IP_PARA ipPara; -CLOUD_PARA cloud_para; - -char wifi_check_time = 0; - -extern uint8_t gCurDir[100]; - -extern uint32_t wifi_loop_cycle; - -volatile TRANSFER_STATE esp_state; - -uint8_t left_to_send = 0; -uint8_t left_to_save[96] = {0}; - -volatile WIFI_DMA_RCV_FIFO wifiDmaRcvFifo; - -volatile WIFI_TRANS_ERROR wifiTransError; - -static bool need_ok_later = false; - -extern volatile WIFI_STATE wifi_link_state; -extern WIFI_PARA wifiPara; -extern IP_PARA ipPara; -extern CLOUD_PARA cloud_para; - -extern uint8_t once_flag; -extern uint8_t flash_preview_begin; -extern uint8_t default_preview_flg; -extern uint8_t gcode_preview_over; - -extern uint8_t bmp_public_buf[17 * 1024]; - -uint32_t getWifiTick() { - return millis(); -} - -uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { - if (lastTick <= curTick) { - return (curTick - lastTick) * TICK_CYCLE; - } - else { - return (0xFFFFFFFF - lastTick + curTick) * TICK_CYCLE; - } -} - -void wifi_delay(int n) { - uint32_t begin = getWifiTick(); - uint32_t end = begin; - - while (getWifiTickDiff(begin, end) < (uint32_t)n) { - end = getWifiTick(); - } -} - -void wifi_reset() { - uint32_t start, now; - start = getWifiTick(); - now = start; - WIFI_RESET(); - while (getWifiTickDiff(start, now) < 500) { - now = getWifiTick(); - } - WIFI_SET(); - -} - -void mount_file_sys(uint8_t disk_type) { - if (disk_type == FILE_SYS_SD) { - card.mount(); - } - else if (disk_type == FILE_SYS_USB) { - - } -} - -static void dma_init() { - #if 0 - __HAL_RCC_DMA1_CLK_ENABLE(); - - //HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); - HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 4, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); - - hdma_usart1_rx.Instance = DMA1_Channel5; - //hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; - hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; - hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_usart1_rx.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE; - hdma_usart1_rx.Init.Mode = DMA_NORMAL; - hdma_usart1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; - if (HAL_DMA_Init((DMA_HandleTypeDef *)&hdma_usart1_rx) != HAL_OK) { - Error_Handler(); - } - - - HAL_DMA_Start_IT((DMA_HandleTypeDef *)&hdma_usart1_rx, - (uint32_t)&huart1.Instance->DR, - (uint32_t)(&WifiRxFifo.uartTxBuffer[0]), - UART_RX_BUFFER_SIZE); - - //HAL_UART_Receive_DMA(&huart1,(uint8_t*)&WifiRxFifo.uartTxBuffer[0], UART_RX_BUFFER_SIZE); - - /* Enable the DMA transfer for the receiver request by setting the DMAR bit - in the UART CR3 register */ - SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR); - - #endif - for (uint8_t i = 0; i < TRANS_RCV_FIFO_BLOCK_NUM; i++) { - wifiDmaRcvFifo.bufferAddr[i] = &bmp_public_buf[1024 * i]; - wifiDmaRcvFifo.state[i] = udisk_buf_empty; - } - - memset(wifiDmaRcvFifo.bufferAddr[0], 0, 1024 * TRANS_RCV_FIFO_BLOCK_NUM); - wifiDmaRcvFifo.read_cur = 0; - wifiDmaRcvFifo.write_cur = 0; - -} - -static void wifi_deInit() { - #if 0 - HAL_DMA_Abort((DMA_HandleTypeDef *)&hdma_usart1_rx); - HAL_DMA_DeInit((DMA_HandleTypeDef *)&hdma_usart1_rx); - __HAL_DMA_DISABLE((DMA_HandleTypeDef *)&hdma_usart1_rx); - #endif -} - -extern uint8_t mksUsart1Rx; - -void esp_port_begin(uint8_t interrupt) { - WifiRxFifo.uart_read_point = 0; - WifiRxFifo.uart_write_point = 0; - #if 0 - NVIC_InitTypeDef NVIC_InitStructure; - - USART_InitTypeDef USART_InitStructure; - GPIO_InitTypeDef GPIO_InitStruct; - - WifiRxFifo.uart_read_point = 0; - WifiRxFifo.uart_write_point = 0; - memset((uint8_t*)WifiRxFifo.uartTxBuffer, 0, sizeof(WifiRxFifo.uartTxBuffer)); - - if (interrupt) { - #if TAN - wifi_deInit (); - - //SZ_STM32_COMInit(COM1, 115200); - __HAL_UART_ENABLE_IT(USART1, USART_IT_RXNE); - - USART_InitStructure.USART_BaudRate = 115200; //���ڵIJ����ʣ�����115200 ��ߴ�4.5Mbits/s - USART_InitStructure.USART_WordLength = USART_WordLength_8b; //�����ֳ���(8λ��9λ) - USART_InitStructure.USART_StopBits = USART_StopBits_1; //�����õ�ֹͣλ-֧��1��2��ֹͣλ - USART_InitStructure.USART_Parity = USART_Parity_No; //����żУ�� - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //��Ӳ�������� - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //˫��ģʽ��ʹ�ܷ��ͺͽ��� - - __HAL_RCC_USART1_CLK_ENABLE(); - - GPIO_InitStruct.Pin = TFT_WIFI_TX_Pin|TFT_WIFI_RX_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF7_USART1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pin = TFT_WIFI_RX_Pin; - HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); - - USART_Init(USART1, &USART_InitStructure); - - NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; - // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; - // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - - NVIC_Init(&NVIC_InitStructure); - #else - HAL_UART_DeInit(&huart1); - MX_USART1_UART_Init(3); - //__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); - HAL_UART_Receive_IT(&huart1,&mksUsart1Rx,1); - #endif - } - else{ - #if 0 - NVIC_DisableIRQ(SZ_STM32_COM1_IRQn); - - USART_Cmd(SZ_STM32_COM1, DISABLE); - - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); - - SZ_STM32_COMInit(COM1, 1958400); - - USART_Cmd(SZ_STM32_COM1, ENABLE); - - wifi_delay(10); - - dma_init(); - #endif - HAL_UART_DeInit(&huart1); - MX_USART1_UART_Init(5); - //dma1_5_IRQ_sel = 1; - dma_init(); - } - #endif - if (interrupt) { - #if ENABLED(USE_WIFI_FUNCTION) - WIFISERIAL.end(); - for (uint16_t i = 0; i < 65535; i++); - WIFISERIAL.begin(WIFI_BAUDRATE); - uint32_t serial_connect_timeout = millis() + 1000UL; - while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - //for(uint8_t i=0;i<100;i++)WIFISERIAL.write(0x33); - #endif - } - else { - #if ENABLED(USE_WIFI_FUNCTION) - WIFISERIAL.end(); - for (uint16_t i = 0; i < 65535; i++); - WIFISERIAL.begin(WIFI_UPLOAD_BAUDRATE); - uint32_t serial_connect_timeout = millis() + 1000UL; - while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } - //for(uint16_t i=0;i<65535;i++);//WIFISERIAL.write(0x33); - #endif - dma_init(); - } -} - -#if ENABLED(USE_WIFI_FUNCTION) - -int raw_send_to_wifi(char *buf, int len) { - if (buf == 0 || len <= 0) return 0; - - for (int i = 0; i < len; i++) - WIFISERIAL.write(*(buf + i)); - - return len; -} - -#endif // USE_WIFI_FUNCTION - -void wifi_ret_ack() {} - -char buf_to_wifi[256]; -int index_to_wifi = 0; -int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { - char wifi_ret_head = 0xA5; - char wifi_ret_tail = 0xFC; - - if (type == WIFI_PARA_SET) { - int data_offset = 4; - int apLen = strlen((const char *)uiCfg.wifi_name); - int keyLen = strlen((const char *)uiCfg.wifi_key); - - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - - buf_to_wifi[data_offset] = gCfgItems.wifi_mode_sel; - buf_to_wifi[data_offset + 1] = apLen; - strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.wifi_name, apLen); - buf_to_wifi[data_offset + apLen + 2] = keyLen; - strncpy(&buf_to_wifi[data_offset + apLen + 3], (const char *)uiCfg.wifi_key, keyLen); - buf_to_wifi[data_offset + apLen + keyLen + 3] = wifi_ret_tail; - - index_to_wifi = apLen + keyLen + 3; - - buf_to_wifi[0] = wifi_ret_head; - buf_to_wifi[1] = type; - buf_to_wifi[2] = index_to_wifi & 0xFF; - buf_to_wifi[3] = (index_to_wifi >> 8) & 0xFF; - - raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); - - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - - } - else if (type == WIFI_TRANS_INF) { - if (len > (int)(sizeof(buf_to_wifi) - index_to_wifi - 5)) { - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - return 0; - } - - if (len > 0) { - memcpy(&buf_to_wifi[4 + index_to_wifi], buf, len); - index_to_wifi += len; - - if (index_to_wifi < 1) - return 0; - - if (buf_to_wifi[index_to_wifi + 3] == '\n') { - //mask "wait" "busy" "X:" - if (((buf_to_wifi[4] == 'w') && (buf_to_wifi[5] == 'a') && (buf_to_wifi[6] == 'i') && (buf_to_wifi[7] == 't') ) - || ((buf_to_wifi[4] == 'b') && (buf_to_wifi[5] == 'u') && (buf_to_wifi[6] == 's') && (buf_to_wifi[7] == 'y') ) - || ((buf_to_wifi[4] == 'X') && (buf_to_wifi[5] == ':') ) - ) { - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - return 0; - } - - buf_to_wifi[0] = wifi_ret_head; - buf_to_wifi[1] = type; - buf_to_wifi[2] = index_to_wifi & 0xFF; - buf_to_wifi[3] = (index_to_wifi >> 8) & 0xFF; - buf_to_wifi[4 + index_to_wifi] = wifi_ret_tail; - - raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); - - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - } - } - } - else if (type == WIFI_EXCEP_INF) { - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - - buf_to_wifi[0] = wifi_ret_head; - buf_to_wifi[1] = type; - buf_to_wifi[2] = 1; - buf_to_wifi[3] = 0; - buf_to_wifi[4] = *buf; - buf_to_wifi[5] = wifi_ret_tail; - - raw_send_to_wifi(buf_to_wifi, 6); - - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - } - else if (type == WIFI_CLOUD_CFG) { - int data_offset = 4; - int urlLen = strlen((const char *)uiCfg.cloud_hostUrl); - - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - - if (gCfgItems.cloud_enable == true) - buf_to_wifi[data_offset] = 0x0A; - else - buf_to_wifi[data_offset] = 0x05; - - buf_to_wifi[data_offset + 1] = urlLen; - strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.cloud_hostUrl, urlLen); - buf_to_wifi[data_offset + urlLen + 2] = uiCfg.cloud_port & 0xFF; - buf_to_wifi[data_offset + urlLen + 3] = (uiCfg.cloud_port >> 8) & 0xFF; - buf_to_wifi[data_offset + urlLen + 4] = wifi_ret_tail; - - index_to_wifi = urlLen + 4; - - buf_to_wifi[0] = wifi_ret_head; - buf_to_wifi[1] = type; - buf_to_wifi[2] = index_to_wifi & 0xFF; - buf_to_wifi[3] = (index_to_wifi >> 8) & 0xFF; - - raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); - - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - } - else if (type == WIFI_CLOUD_UNBIND) { - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - - buf_to_wifi[0] = wifi_ret_head; - buf_to_wifi[1] = type; - buf_to_wifi[2] = 0; - buf_to_wifi[3] = 0; - buf_to_wifi[4] = wifi_ret_tail; - - raw_send_to_wifi(buf_to_wifi, 5); - - memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); - index_to_wifi = 0; - } -} - - -int send_to_wifi(char *buf, int len) { return package_to_wifi(WIFI_TRANS_INF, buf, len); } - -void set_cur_file_sys(int fileType) { - gCfgItems.fileSysType = fileType; -} - -void get_file_list(char *path) { - if ( path == 0) { - return; - } - - if (gCfgItems.fileSysType == FILE_SYS_SD) { - #if ENABLED(SDSUPPORT) - card.mount(); - #endif - } - else if (gCfgItems.fileSysType == FILE_SYS_USB) { - //udisk - } - Explore_Disk(path, 0); -} - -char wait_ip_back_flag = 0; - -typedef struct { - char write_buf[513]; - int write_index; - uint8_t saveFileName[30]; - uint32_t fileLen; - uint32_t tick_begin; - uint32_t tick_end; -} FILE_WRITER; - -FILE_WRITER file_writer; - -int32_t lastFragment = 0; - -char lastBinaryCmd[50] = {0}; - -int total_write = 0; -char binary_head[2] = {0, 0}; -unsigned char binary_data_len = 0; - -int write_to_file(char *buf, int len) { - int i; - int res; - - for (i = 0; i < len; i++) { - file_writer.write_buf[file_writer.write_index++] = buf[i]; - if (file_writer.write_index >= 512) { - res = card.write(file_writer.write_buf, file_writer.write_index); - if (res == -1) { - return -1; - } - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); - file_writer.write_index = 0; - } - } - return 0; -} - -#define ESP_PROTOC_HEAD (uint8_t)0xA5 -#define ESP_PROTOC_TAIL (uint8_t)0xFC - -#define ESP_TYPE_NET (uint8_t)0x0 -#define ESP_TYPE_GCODE (uint8_t)0x1 -#define ESP_TYPE_FILE_FIRST (uint8_t)0x2 -#define ESP_TYPE_FILE_FRAGMENT (uint8_t)0x3 - -#define ESP_TYPE_WIFI_LIST (uint8_t)0x4 - -uint8_t esp_msg_buf[UART_RX_BUFFER_SIZE] = {0}; -uint16_t esp_msg_index = 0; - -typedef struct { - uint8_t head; - uint8_t type; - uint16_t dataLen; - uint8_t *data; - uint8_t tail; -} ESP_PROTOC_FRAME; - - -static int cut_msg_head(uint8_t *msg, uint16_t msgLen, uint16_t cutLen) { - if (msgLen < cutLen) return 0; - - else if (msgLen == cutLen) { - memset(msg, 0, msgLen); - return 0; - } - - for (int i = 0; i < (msgLen - cutLen); i++) - msg[i] = msg[cutLen + i]; - - memset(&msg[msgLen - cutLen], 0, cutLen); - - return msgLen - cutLen; -} - - -uint8_t Explore_Disk (char* path , uint8_t recu_level) { - char tmp[200]; - char Fstream[200]; - - if (path == 0)return 0; - - const uint8_t fileCnt = card.get_num_Files(); - - for (uint8_t i = 0; i < fileCnt; i++) { - const uint16_t nr = - #if ENABLED(SDCARD_RATHERRECENTFIRST) && DISABLED(SDCARD_SORT_ALPHA) - fileCnt - 1 - - #endif - i; - - #if ENABLED(SDCARD_SORT_ALPHA) - card.getfilename_sorted(nr); - #else - card.getfilename_sorted(nr); - #endif - memset(tmp, 0, sizeof(tmp)); - //if (card.longFilename[0] == 0) - strcpy(tmp, card.filename); - //else - //strcpy(tmp, card.longFilename); - - memset(Fstream, 0, sizeof(Fstream)); - strcpy(Fstream, tmp); - - if (card.flag.filenameIsDir && (recu_level <= 10)) { - strcat(Fstream, ".DIR\r\n"); - send_to_wifi(Fstream, strlen(Fstream)); - } - else { - strcat(Fstream, "\r\n"); - send_to_wifi(Fstream, strlen(Fstream)); - } - } - - return fileCnt; -} - -static void wifi_gcode_exec(uint8_t *cmd_line) { - int8_t tempBuf[100] = {0}; - uint8_t *tmpStr = 0; - int cmd_value; - volatile int print_rate; - if ((strstr((char *)&cmd_line[0], "\n") != 0) && ((strstr((char *)&cmd_line[0], "G") != 0) || (strstr((char *)&cmd_line[0], "M") != 0) || (strstr((char *)&cmd_line[0], "T") != 0) )) { - - tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "\n"); - if (tmpStr) { - *tmpStr = '\0'; - } - tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "\r"); - if (tmpStr) { - *tmpStr = '\0'; - } - tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "*"); - if (tmpStr) { - *tmpStr = '\0'; - } - tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "M"); - if ( tmpStr) { - cmd_value = atoi((char *)(tmpStr + 1)); - tmpStr = (uint8_t *)strstr((char *)tmpStr, " "); - - switch (cmd_value) { - - case 20: //print sd / udisk file - if (uiCfg.print_state == IDLE) { - int index = 0; - - if (tmpStr == 0) { - gCfgItems.fileSysType = FILE_SYS_SD; - send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); - - get_file_list((char *)"0:/"); - - send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); - - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - break; - } - - while (tmpStr[index] == ' ') - index++; - - if (gCfgItems.wifi_type == ESP_WIFI) { - char *path = (char *)tempBuf; - - if (strlen((char *)&tmpStr[index]) < 80) { - send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); - - if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { - gCfgItems.fileSysType = FILE_SYS_SD; - - } - else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { - gCfgItems.fileSysType = FILE_SYS_USB; - } - strcpy((char *)path, (char *)&tmpStr[index]); - get_file_list(path); - send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); - } - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - } - } - break; - - case 21: - /*init sd card*/ - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - break; - - case 23: - /*select the file*/ - if (uiCfg.print_state == IDLE) { - int index = 0; - while (tmpStr[index] == ' ') - index++; - - if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { - if (strlen((char *)&tmpStr[index]) < 80) { - memset(list_file.file_name[sel_id], 0, sizeof(list_file.file_name[sel_id])); - - if (gCfgItems.wifi_type == ESP_WIFI) { - if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { - gCfgItems.fileSysType = FILE_SYS_SD; - - } - else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { - gCfgItems.fileSysType = FILE_SYS_USB; - } - else { - if (tmpStr[index] != '/') - strcat((char *)list_file.file_name[0], "/"); - } - strcat((char *)list_file.file_name[sel_id], (char *)&tmpStr[index]); - - } - else { - strcpy(list_file.file_name[sel_id], (char *)&tmpStr[index]); - } - - char *cur_name=strrchr(list_file.file_name[sel_id],'/'); - - card.openFileRead(cur_name); - - if (card.isFileOpen()) { - send_to_wifi((char *)"File selected\r\n", strlen("File selected\r\n")); - - } - else { - send_to_wifi((char *)"file.open failed\r\n", strlen("file.open failed\r\n")); - strcpy(list_file.file_name[sel_id], "notValid"); - } - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - - } - - - } - } - break; - - case 24: - if (strcmp(list_file.file_name[sel_id], "notValid") != 0) { - if (uiCfg.print_state == IDLE) { - clear_cur_ui(); - reset_print_time(); - start_print_time(); - preview_gcode_prehandle(list_file.file_name[sel_id]); - uiCfg.print_state = WORKING; - lv_draw_printing(); - - if (gcode_preview_over != 1) { - #if ENABLED(SDSUPPORT) - char *cur_name; - cur_name=strrchr(list_file.file_name[sel_id],'/'); - - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_READ)) { - gCfgItems.curFilesize = file.fileSize(); - file.close(); - update_spi_flash(); - } - card.openFileRead(cur_name); - if (card.isFileOpen()) { - feedrate_percentage = 100; - //saved_feedrate_percentage = feedrate_percentage; - planner.flow_percentage[0] = 100; - planner.e_factor[0]= planner.flow_percentage[0]*0.01; - if (EXTRUDERS==2) { - planner.flow_percentage[1] = 100; - planner.e_factor[1]= planner.flow_percentage[1]*0.01; - } - card.startFileprint(); - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.prepare(); - #endif - once_flag = 0; - } - #endif - - } - } - else if (uiCfg.print_state == PAUSED) { - uiCfg.print_state = RESUMING; - clear_cur_ui(); - start_print_time(); - - if (gCfgItems.from_flash_pic==1) - flash_preview_begin = 1; - else - default_preview_flg = 1; - lv_draw_printing(); - } - else if (uiCfg.print_state == REPRINTING) { - uiCfg.print_state = REPRINTED; - clear_cur_ui(); - start_print_time(); - if (gCfgItems.from_flash_pic==1) - flash_preview_begin = 1; - else - default_preview_flg = 1; - lv_draw_printing(); - } - } - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - break; - - case 25: - /*pause print file*/ - if (uiCfg.print_state == WORKING) { - stop_print_time(); - - clear_cur_ui(); - - #if ENABLED(SDSUPPORT) - card.pauseSDPrint(); - uiCfg.print_state = PAUSING; - #endif - if (gCfgItems.from_flash_pic==1) - flash_preview_begin = 1; - else - default_preview_flg = 1; - lv_draw_printing(); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - } - break; - - case 26: - /*stop print file*/ - if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED) || (uiCfg.print_state == REPRINTING)) { - stop_print_time(); - - clear_cur_ui(); - #if ENABLED(SDSUPPORT) - uiCfg.print_state = IDLE; - card.flag.abort_sd_printing = true; - #endif - - lv_draw_ready_print(); - - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - } - break; - - case 27: - /*report print rate*/ - if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)|| (uiCfg.print_state == REPRINTING)) { - print_rate = uiCfg.totalSend; - - memset((char *)tempBuf, 0, sizeof(tempBuf)); - - sprintf((char *)tempBuf, "M27 %d\r\n", print_rate); - - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - - } - - break; - - case 28: - /*begin to transfer file to filesys*/ - if (uiCfg.print_state == IDLE) { - - int index = 0; - while (tmpStr[index] == ' ') - index++; - - if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { - strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); - - if (gCfgItems.fileSysType == FILE_SYS_SD) { - memset(tempBuf, 0, sizeof(tempBuf)); - sprintf((char *)tempBuf, "%s", file_writer.saveFileName); - } - else if (gCfgItems.fileSysType == FILE_SYS_USB) { - memset(tempBuf, 0, sizeof(tempBuf)); - sprintf((char *)tempBuf, "%s", (char *)file_writer.saveFileName); - } - mount_file_sys(gCfgItems.fileSysType); - - #if ENABLED(SDSUPPORT) - char *cur_name=strrchr(list_file.file_name[sel_id],'/'); - card.openFileWrite(cur_name); - if (card.isFileOpen()) { - memset(file_writer.saveFileName, 0, sizeof(file_writer.saveFileName)); - strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); - memset(tempBuf, 0, sizeof(tempBuf)); - sprintf((char *)tempBuf, "Writing to file: %s\r\n", (char *)file_writer.saveFileName); - wifi_ret_ack(); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - - total_write = 0; - wifi_link_state = WIFI_WAIT_TRANS_START; - - } - else{ - wifi_link_state = WIFI_CONNECTED; - clear_cur_ui(); - lv_draw_dialog(DIALOG_TRANSFER_NO_DEVICE); - } - #endif - - } - - } - break; - case 105: - case 991: - memset(tempBuf, 0, sizeof(tempBuf)); - if (cmd_value == 105) { - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - sprintf((char *)tempBuf,"T:%.1f /%.1f B:%.1f /%.1f T0:%.1f /%.1f T1:%.1f /%.1f @:0 B@:0\r\n", - - (float)thermalManager.temp_hotend[0].celsius,(float)thermalManager.temp_hotend[0].target, - #if HAS_HEATED_BED - (float)thermalManager.temp_bed.celsius,(float)thermalManager.temp_bed.target, - #else - (float)0,(float)0, - #endif - (float)thermalManager.temp_hotend[0].celsius,(float)thermalManager.temp_hotend[0].target, - #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER - (float)thermalManager.temp_hotend[1].celsius,(float)thermalManager.temp_hotend[1].target - #else - (float)0,(float)0 - #endif - ); - } - else { - sprintf((char *)tempBuf,"T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n", - - (int)thermalManager.temp_hotend[0].celsius,(int)thermalManager.temp_hotend[0].target, - #if HAS_HEATED_BED - (int)thermalManager.temp_bed.celsius,(int)thermalManager.temp_bed.target, - #else - 0,0, - #endif - (int)thermalManager.temp_hotend[0].celsius,(int)thermalManager.temp_hotend[0].target, - #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER - (int)thermalManager.temp_hotend[1].celsius,(int)thermalManager.temp_hotend[1].target - #else - 0,0 - #endif - ); - } - - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - - queue.enqueue_one_P(PSTR("M105")); - - break; - case 992: - if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { - memset(tempBuf,0,sizeof(tempBuf)); - sprintf((char *)tempBuf, "M992 %d%d:%d%d:%d%d\r\n", print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); - wifi_ret_ack(); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - } - - break; - case 994: - if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { - memset(tempBuf,0,sizeof(tempBuf)); - if (strlen((char *)list_file.file_name[sel_id]) > (100-1)) { - return; - } - sprintf((char *)tempBuf, "M994 %s;%d\n", list_file.file_name[sel_id],(int)gCfgItems.curFilesize); - wifi_ret_ack(); - send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); - } - break; - case 997: - if (uiCfg.print_state == IDLE) { - wifi_ret_ack(); - send_to_wifi((char *)"M997 IDLE\r\n", strlen("M997 IDLE\r\n")); - } - else if (uiCfg.print_state == WORKING) { - wifi_ret_ack(); - send_to_wifi((char *)"M997 PRINTING\r\n", strlen("M997 PRINTING\r\n")); - } - else if (uiCfg.print_state == PAUSED) { - wifi_ret_ack(); - send_to_wifi((char *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); - } - else if (uiCfg.print_state == REPRINTING) { - wifi_ret_ack(); - send_to_wifi((char *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); - } - if (uiCfg.command_send == 0) get_wifi_list_command_send(); - break; - - case 998: - if (uiCfg.print_state == IDLE) { - if (atoi((char *)tmpStr) == 0) { - set_cur_file_sys(0); - } - else if (atoi((char *)tmpStr) == 1) { - set_cur_file_sys(1); - } - wifi_ret_ack(); - } - break; - - case 115: - memset(tempBuf,0,sizeof(tempBuf)); - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - send_to_wifi((char *)"FIRMWARE_NAME:Robin_nano\r\n", strlen("FIRMWARE_NAME:Robin_nano\r\n")); - break; - - default: - strcat((char *)cmd_line, "\n"); - - uint32_t left; - - if (espGcodeFifo.wait_tick> 5) { - - if (espGcodeFifo.r > espGcodeFifo.w) - left = espGcodeFifo.r - espGcodeFifo.w - 1; - else - left = WIFI_GCODE_BUFFER_SIZE + espGcodeFifo.r - espGcodeFifo.w - 1; - if (left >= strlen((const char *)cmd_line)) { - uint32_t index = 0; - while (index < strlen((const char *)cmd_line)) { - espGcodeFifo.Buffer[espGcodeFifo.w] = cmd_line[index] ; - espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; - index++; - } - if (left - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - else - need_ok_later = true; - - } - - } - break; - - } - } - else{ - strcat((char *)cmd_line, "\n"); - uint32_t left_g; - - if (espGcodeFifo.wait_tick > 5) { - - if (espGcodeFifo.r > espGcodeFifo.w) - left_g = espGcodeFifo.r - espGcodeFifo.w - 1; - else - left_g = WIFI_GCODE_BUFFER_SIZE + espGcodeFifo.r - espGcodeFifo.w - 1; - if (left_g >= strlen((const char *)cmd_line)) { - uint32_t index = 0; - while (index < strlen((const char *)cmd_line)) { - espGcodeFifo.Buffer[espGcodeFifo.w] = cmd_line[index] ; - espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; - index++; - } - if (left_g - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - else - need_ok_later = true; - - } - } - } - } -} - -static int32_t charAtArray(const uint8_t *_array, uint32_t _arrayLen, uint8_t _char) { - for (uint32_t i = 0; i < _arrayLen; i++) - if (*(_array + i) == _char) return i; - return -1; -} - -void get_wifi_list_command_send() { - char buf[6] = {0}; - buf[0] = 0xA5; - buf[1] = 0x07; - buf[2] = 0x00; - buf[3] = 0x00; - buf[4] = 0xFC; - raw_send_to_wifi(buf, 5); -} - -static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { - int wifiNameLen, wifiKeyLen, hostLen, id_len, ver_len; - - if (msgLen <= 0) return; - //ip - sprintf(ipPara.ip_addr, "%d.%d.%d.%d", msg[0], msg[1], msg[2], msg[3]); - - //port - //connect state - if (msg[6] == 0x0A) - wifi_link_state = WIFI_CONNECTED; - else if (msg[6] == 0x0E) - wifi_link_state = WIFI_EXCEPTION; - else - wifi_link_state = WIFI_NOT_CONFIG; - - //mode - wifiPara.mode = msg[7]; - - - //wifi name - wifiNameLen = msg[8]; - wifiKeyLen = msg[9 + wifiNameLen]; - if (wifiNameLen < 32) { - memset(wifiPara.ap_name, 0, sizeof(wifiPara.ap_name)); - memcpy(wifiPara.ap_name, &msg[9], wifiNameLen); - - memset(&wifi_list.wifiConnectedName,0,sizeof(wifi_list.wifiConnectedName)); - memcpy(&wifi_list.wifiConnectedName,&msg[9],wifiNameLen); - - //wifi key - if (wifiKeyLen < 64) { - memset(wifiPara.keyCode, 0, sizeof(wifiPara.keyCode)); - memcpy(wifiPara.keyCode, &msg[10 + wifiNameLen], wifiKeyLen); - } - } - - - cloud_para.state =msg[10 + wifiNameLen + wifiKeyLen]; - hostLen = msg[11 + wifiNameLen + wifiKeyLen]; - if (cloud_para.state) { - if (hostLen < 96) { - memset(cloud_para.hostUrl, 0, sizeof(cloud_para.hostUrl)); - memcpy(cloud_para.hostUrl, &msg[12 + wifiNameLen + wifiKeyLen], hostLen); - } - cloud_para.port = msg[12 + wifiNameLen + wifiKeyLen + hostLen] + (msg[13 + wifiNameLen + wifiKeyLen + hostLen] << 8); - - } - - // id - id_len = msg[14 + wifiNameLen + wifiKeyLen + hostLen]; - if (id_len == 20) { - memset(cloud_para.id, 0, sizeof(cloud_para.id)); - memcpy(cloud_para.id, (const char *)&msg[15 + wifiNameLen + wifiKeyLen + hostLen], id_len); - } - ver_len = msg[15 + wifiNameLen + wifiKeyLen + hostLen + id_len]; - if (ver_len < 20) { - memset(wifi_firm_ver, 0, sizeof(wifi_firm_ver)); - memcpy(wifi_firm_ver, (const char *)&msg[16 + wifiNameLen + wifiKeyLen + hostLen + id_len], ver_len); - } - - if (uiCfg.configWifi == 1) { - if ((wifiPara.mode != gCfgItems.wifi_mode_sel) - || (strncmp(wifiPara.ap_name, (const char *)uiCfg.wifi_name, 32) != 0) - || (strncmp(wifiPara.keyCode, (const char *)uiCfg.wifi_key, 64) != 0)) { - package_to_wifi(WIFI_PARA_SET, (char *)0, 0); - } - else uiCfg.configWifi = 0; - } - if (cfg_cloud_flag == 1) { - if (((cloud_para.state >> 4) != (char)gCfgItems.cloud_enable) - || (strncmp(cloud_para.hostUrl, (const char *)uiCfg.cloud_hostUrl, 96) != 0) - || (cloud_para.port != uiCfg.cloud_port)) { - package_to_wifi(WIFI_CLOUD_CFG, (char *)0, 0); - } - else cfg_cloud_flag = 0; - } -} - -static void wifi_list_msg_handle(uint8_t * msg, uint16_t msgLen) { - int wifiNameLen,wifiMsgIdex=1; - int8_t wifi_name_is_same=0; - int8_t i,j; - int8_t wifi_name_num=0; - uint8_t *str=0; - int8_t valid_name_num; - - if (msgLen <= 0) - return; - if (disp_state == KEY_BOARD_UI) - return; - - wifi_list.getNameNum = msg[0]; - - if (wifi_list.getNameNum < 20) { - uiCfg.command_send = 1; - - memset(wifi_list.wifiName,0,sizeof(wifi_list.wifiName)); - - wifi_name_num = wifi_list.getNameNum; - - valid_name_num=0; - str = wifi_list.wifiName[valid_name_num]; - - if (wifi_list.getNameNum > 0) wifi_list.currentWifipage = 1; - - for (i = 0; i 0x80) { - wifi_name_is_same = 1; - //break; - } - //} - } - if (wifi_name_is_same == 1) { - wifi_name_is_same = 0; - wifiMsgIdex += wifiNameLen; - //wifi_list.RSSI[i] = msg[wifiMsgIdex]; - wifiMsgIdex += 1; - wifi_name_num--; - //i--; - continue; - } - if (i < WIFI_TOTAL_NUMBER-1) { - str = wifi_list.wifiName[++valid_name_num]; - } - } - wifiMsgIdex += wifiNameLen; - wifi_list.RSSI[i] = msg[wifiMsgIdex]; - wifiMsgIdex += 1; - } - wifi_list.getNameNum = wifi_name_num; - if (wifi_list.getNameNum % NUMBER_OF_PAGE == 0) { - wifi_list.getPage = wifi_list.getNameNum/NUMBER_OF_PAGE; - } - else { - wifi_list.getPage = wifi_list.getNameNum/NUMBER_OF_PAGE + 1; - } - wifi_list.nameIndex = 0; - if (disp_state == WIFI_LIST_UI) - disp_wifi_list(); - } -} - -static void gcode_msg_handle(uint8_t * msg, uint16_t msgLen) { - uint8_t gcodeBuf[100] = {0}; - char *index_s; - char *index_e; - - if (msgLen <= 0) - return; - - index_s = (char *)msg; - index_e = (char *)strstr((char *)msg, "\n"); - if (*msg == 'N') { - index_s = (char *)strstr((char *)msg, " "); - while ((*index_s) == ' ') { - index_s++; - } - } - while ((index_e != 0) && ((int)index_s < (int)index_e)) { - if ((int)(index_e - index_s) < (int)sizeof(gcodeBuf)) { - memset(gcodeBuf, 0, sizeof(gcodeBuf)); - - memcpy(gcodeBuf, index_s, index_e - index_s + 1); - - wifi_gcode_exec(gcodeBuf); - } - while ((*index_e == '\r') || (*index_e == '\n')) - index_e++; - - index_s = index_e; - index_e = (char *)strstr(index_s, "\n"); - } -} - -void utf8_2_unicode(uint8_t *source,uint8_t Len) { - uint8_t i=0,char_i=0,char_byte_num=0; - uint16_t u16_h,u16_m,u16_l,u16_value; - uint8_t FileName_unicode[30]; - - memset(FileName_unicode, 0, sizeof(FileName_unicode)); - - while (1) { - char_byte_num = source[i] & 0xF0; - if (source[i] < 0X80) { - //ASCII --1byte - FileName_unicode[char_i] = source[i]; - i += 1; - char_i += 1; - } - else if (char_byte_num == 0XC0 || char_byte_num == 0XD0) { - //--2byte - - u16_h = (((uint16_t)source[i] <<8) & 0x1F00) >> 2; - u16_l = ((uint16_t)source[i+1] & 0x003F); - u16_value = (u16_h | u16_l); - FileName_unicode[char_i] = (uint8_t)((u16_value & 0xFF00) >> 8); - FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00FF); - i += 2; - char_i += 2; - } - else if (char_byte_num == 0XE0) { - //--3byte - u16_h = (((uint16_t)source[i] <<8 ) & 0x0F00) << 4; - u16_m = (((uint16_t)source[i+1] << 8) & 0x3F00) >> 2; - u16_l = ((uint16_t)source[i+2] & 0x003F); - u16_value = (u16_h | u16_m | u16_l); - FileName_unicode[char_i] = (uint8_t)((u16_value & 0xFF00) >> 8); - FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00FF); - i += 3; - char_i += 2; - } - else if (char_byte_num == 0XF0) { - //--4byte - i += 4; - //char_i += 3; - } - else { - break; - } - if (i >= Len || i >= 255)break; - } - memcpy(source, FileName_unicode, sizeof(FileName_unicode)); -} - -char saveFilePath[50]; - -static bool longName2DosName(const char* longName, uint8_t* dosName) { - uint8_t i = 11; - while (i--) dosName[i] = '\0'; - while (*longName) { - uint8_t c = *longName++; - if (c == '.') { // For a dot... - if (i == 0) return false; - else { strcat((char *)dosName,".GCO"); return dosName[0] != '\0'; } - } - else { - // Fail for illegal characters - PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); - while (uint8_t b = pgm_read_byte(p++)) if (b == c) return false; - if (c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters - dosName[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name - } - if (i >= 5) strcat((char *)dosName,"~1.GCO"); - } - return dosName[0] != '\0'; // Return true if any name was set -} - -static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { - uint8_t fileNameLen = *msg; - - if (msgLen != fileNameLen + 5) return; - - file_writer.fileLen = *((uint32_t *)(msg + 1)); - memset(file_writer.saveFileName, 0, sizeof(file_writer.saveFileName)); - - memcpy(file_writer.saveFileName, msg + 5, fileNameLen); - - utf8_2_unicode(file_writer.saveFileName,fileNameLen); - - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); - - if (strlen((const char *)file_writer.saveFileName) > sizeof(saveFilePath)) - return; - - memset(saveFilePath, 0, sizeof(saveFilePath)); - - if (gCfgItems.fileSysType == FILE_SYS_SD) { - //sprintf((char *)saveFilePath, "/%s", file_writer.saveFileName); - card.mount(); - - //ZERO(list_file.long_name[sel_id]); - //memcpy(list_file.long_name[sel_id],file_writer.saveFileName,sizeof(list_file.long_name[sel_id])); - } - else if (gCfgItems.fileSysType == FILE_SYS_USB) { - - } - file_writer.write_index = 0; - lastFragment = -1; - - wifiTransError.flag = 0; - wifiTransError.start_tick = 0; - wifiTransError.now_tick = 0; - - TERN_(SDSUPPORT, card.closefile()); - - wifi_delay(1000); - - #if ENABLED(SDSUPPORT) - - uint8_t dosName[FILENAME_LENGTH]; - - if (!longName2DosName((const char *)file_writer.saveFileName,dosName)) { - clear_cur_ui(); - upload_result = 2; - wifiTransError.flag = 1; - wifiTransError.start_tick = getWifiTick(); - lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); - return; - } - sprintf((char *)saveFilePath, "/%s", dosName); - - ZERO(list_file.long_name[sel_id]); - memcpy(list_file.long_name[sel_id],dosName,sizeof(dosName)); - - char *cur_name=strrchr((const char *)saveFilePath,'/'); - - SdFile file; - SdFile *curDir; - card.endFilePrint(); - const char * const fname = card.diveToFile(true, curDir, cur_name); - if (!fname) return; - if (file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { - gCfgItems.curFilesize = file.fileSize(); - } - else { - clear_cur_ui(); - upload_result = 2; - wifiTransError.flag = 1; - wifiTransError.start_tick = getWifiTick(); - lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); - return; - } - #endif - - wifi_link_state = WIFI_TRANS_FILE; - - upload_result = 1; - - clear_cur_ui(); - lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); - - lv_task_handler(); - - file_writer.tick_begin = getWifiTick(); -} - -#define FRAG_MASK _BV32(31) - -static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { - uint32_t frag = *((uint32_t *)msg); - - if ((frag & FRAG_MASK) != (uint32_t)(lastFragment + 1)) { - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); - file_writer.write_index = 0; - wifi_link_state = WIFI_CONNECTED; - upload_result = 2; - } - else { - if (write_to_file((char *)msg + 4, msgLen - 4) < 0) { - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); - file_writer.write_index = 0; - wifi_link_state = WIFI_CONNECTED; - upload_result = 2; - return; - } - lastFragment = frag; - - if ((frag & (~FRAG_MASK))) { - int res = card.write(file_writer.write_buf, file_writer.write_index); - if (res == -1) { - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); - file_writer.write_index = 0; - wifi_link_state = WIFI_CONNECTED; - upload_result = 2; - return; - } - memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); - file_writer.write_index = 0; - file_writer.tick_end = getWifiTick(); - upload_time = getWifiTickDiff(file_writer.tick_begin, file_writer.tick_end) / 1000; - upload_size = gCfgItems.curFilesize; - wifi_link_state = WIFI_CONNECTED; - upload_result = 3; - } - - } -} - -void esp_data_parser(char *cmdRxBuf, int len) { - int32_t head_pos; - int32_t tail_pos; - uint16_t cpyLen; - int16_t leftLen = len; - bool loop_again = false; - - ESP_PROTOC_FRAME esp_frame; - - while (leftLen > 0 || loop_again) { - loop_again = false; - - if (esp_msg_index != 0) { - head_pos = 0; - cpyLen = (leftLen < (int16_t)((sizeof(esp_msg_buf) - esp_msg_index)) ? leftLen : sizeof(esp_msg_buf) - esp_msg_index); - - memcpy(&esp_msg_buf[esp_msg_index], cmdRxBuf + len - leftLen, cpyLen); - - esp_msg_index += cpyLen; - - leftLen = leftLen - cpyLen; - tail_pos = charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL); - - if (tail_pos == -1) { - if (esp_msg_index >= sizeof(esp_msg_buf)) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); - esp_msg_index = 0; - } - return; - } - } - else { - head_pos = charAtArray((uint8_t const *)&cmdRxBuf[len - leftLen], leftLen, ESP_PROTOC_HEAD); - if (head_pos == -1) return; - - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); - memcpy(esp_msg_buf, &cmdRxBuf[len - leftLen + head_pos], leftLen - head_pos); - - esp_msg_index = leftLen - head_pos; - - leftLen = 0; - head_pos = 0; - tail_pos = charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL); - if (tail_pos == -1) { - if (esp_msg_index >= sizeof(esp_msg_buf)) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); - esp_msg_index = 0; - } - return; - } - } - - esp_frame.type = esp_msg_buf[1]; - if ((esp_frame.type != ESP_TYPE_NET) && (esp_frame.type != ESP_TYPE_GCODE) - && (esp_frame.type != ESP_TYPE_FILE_FIRST) && (esp_frame.type != ESP_TYPE_FILE_FRAGMENT) - &&(esp_frame.type != ESP_TYPE_WIFI_LIST)) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); - esp_msg_index = 0; - return; - } - - esp_frame.dataLen = esp_msg_buf[2] + (esp_msg_buf[3] << 8); - - if ((int)(4 + esp_frame.dataLen) > (int)(sizeof(esp_msg_buf))) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); - esp_msg_index = 0; - return; - } - - if (esp_msg_buf[4 + esp_frame.dataLen] != ESP_PROTOC_TAIL) { - if (esp_msg_index >= sizeof(esp_msg_buf)) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); - esp_msg_index = 0; - } - return; - } - - esp_frame.data = &esp_msg_buf[4]; - switch (esp_frame.type) { - case ESP_TYPE_NET: - net_msg_handle(esp_frame.data, esp_frame.dataLen); - break; - case ESP_TYPE_GCODE: - gcode_msg_handle(esp_frame.data, esp_frame.dataLen); - break; - case ESP_TYPE_FILE_FIRST: - file_first_msg_handle(esp_frame.data, esp_frame.dataLen); - break; - case ESP_TYPE_FILE_FRAGMENT: - file_fragment_msg_handle(esp_frame.data, esp_frame.dataLen); - break; - case ESP_TYPE_WIFI_LIST: - wifi_list_msg_handle(esp_frame.data, esp_frame.dataLen); - break; - default: break; - } - - esp_msg_index = cut_msg_head(esp_msg_buf, esp_msg_index, esp_frame.dataLen + 5); - if (esp_msg_index > 0) { - if (charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_HEAD) == -1) { - memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); - esp_msg_index = 0; - return; - } - - if ((charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_HEAD) != -1) && (charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL) != -1)) - loop_again = true; - } - } -} - -int32_t tick_net_time1, tick_net_time2; - -int storeRcvData(int32_t len) { - unsigned char tmpW = wifiDmaRcvFifo.write_cur; - if (len <= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpW] == udisk_buf_empty) { - for (uint16_t i = 0; i < len; i++) - wifiDmaRcvFifo.bufferAddr[tmpW][i] = WIFISERIAL.read(); - wifiDmaRcvFifo.state[tmpW] = udisk_buf_full; - wifiDmaRcvFifo.write_cur = (tmpW + 1) % TRANS_RCV_FIFO_BLOCK_NUM; - return 1; - } - return 0; -} - -int32_t readWifiFifo(uint8_t *retBuf, uint32_t bufLen) { - unsigned char tmpR = wifiDmaRcvFifo.read_cur; - if (bufLen >= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpR] == udisk_buf_full) { - memcpy(retBuf, (unsigned char *)wifiDmaRcvFifo.bufferAddr[tmpR], UDISKBUFLEN); - wifiDmaRcvFifo.state[tmpR] = udisk_buf_empty; - wifiDmaRcvFifo.read_cur = (tmpR + 1) % TRANS_RCV_FIFO_BLOCK_NUM; - return UDISKBUFLEN; - } - return 0; -} - -void stopEspTransfer() { - if (wifi_link_state == WIFI_TRANS_FILE) - wifi_link_state = WIFI_CONNECTED; - - TERN_(SDSUPPORT, card.closefile()); - - if (upload_result != 3) { - wifiTransError.flag = 1; - wifiTransError.start_tick = getWifiTick(); - card.removeFile((const char *)saveFilePath); - } - else { - } - wifi_delay(200); - WIFI_IO1_SET(); - //exchangeFlashMode(1); //change spi flash to use dma mode - esp_port_begin(1); - if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); -} - -void wifi_rcv_handle() { - int32_t len = 0; - uint8_t ucStr[(UART_RX_BUFFER_SIZE) + 1] = {0}; - int8_t getDataF = 0; - - if (wifi_link_state == WIFI_TRANS_FILE) { - #if 0 - if (WIFISERIAL.available() == UART_RX_BUFFER_SIZE) { - for (uint16_t i=0;i 0) { - esp_data_parser((char *)ucStr, len); - if (wifi_link_state == WIFI_CONNECTED) { - clear_cur_ui(); - lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); - stopEspTransfer(); - } - getDataF = 1; - } - if (esp_state == TRANSFER_STORE) { - if (storeRcvData(UART_RX_BUFFER_SIZE)) { - esp_state = TRANSFERING; - //esp_dma_pre(); - if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); - } - else - WIFI_IO1_SET(); - } - } - else { - //len = readUsartFifo((SZ_USART_FIFO *)&WifiRxFifo, (int8_t *)ucStr, UART_RX_BUFFER_SIZE); - len = readWifiBuf((int8_t *)ucStr, UART_RX_BUFFER_SIZE); - if (len > 0) { - esp_data_parser((char *)ucStr, len); - - if (wifi_link_state == WIFI_TRANS_FILE) { - //exchangeFlashMode(0); //change spi flash not use dma mode - wifi_delay(10); - esp_port_begin(0); - wifi_delay(10); - tick_net_time1 = 0; - } - if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); - getDataF = 1; - } - if (need_ok_later && (queue.length < BUFSIZE)) { - need_ok_later = false; - send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); - } - } - - if (getDataF == 1) { - tick_net_time1 = getWifiTick(); - } - else { - tick_net_time2 = getWifiTick(); - - if (wifi_link_state == WIFI_TRANS_FILE) { - if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 4500)) { - wifi_link_state = WIFI_CONNECTED; - upload_result = 2; - clear_cur_ui(); - stopEspTransfer(); - lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); - } - } - - if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 10000)) - wifi_link_state = WIFI_NOT_CONFIG; - - if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 120000)) { - wifi_link_state = WIFI_NOT_CONFIG; - wifi_reset(); - tick_net_time1 = getWifiTick(); - } - } - - if (wifiTransError.flag == 0x1) { - wifiTransError.now_tick = getWifiTick(); - if (getWifiTickDiff(wifiTransError.start_tick, wifiTransError.now_tick) > WAIT_ESP_TRANS_TIMEOUT_TICK) { - wifiTransError.flag = 0; - WIFI_IO1_RESET(); - } - } -} - -void wifi_looping() { - do { wifi_rcv_handle(); } while (wifi_link_state == WIFI_TRANS_FILE); -} - -void mks_esp_wifi_init() { - wifi_link_state = WIFI_NOT_CONFIG; - - SET_OUTPUT(WIFI_RESET_PIN); - WIFI_SET(); - SET_OUTPUT(WIFI_IO1_PIN); - SET_INPUT_PULLUP(WIFI_IO0_PIN); - WIFI_IO1_SET(); - - esp_state = TRANSFER_IDLE; - esp_port_begin(1); - - wifi_reset(); - - #if 0 - res = f_open(&esp_upload.uploadFile, ESP_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); - - if (res == FR_OK) { - f_close(&esp_upload.uploadFile); - - wifi_delay(2000); - - if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { - return; - } - - clear_cur_ui(); - - draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); - - if (wifi_upload(0) >= 0) { - - f_unlink("1:/MKS_WIFI_CUR"); - f_rename(ESP_FIRMWARE_FILE,"/MKS_WIFI_CUR"); - } - draw_return_ui(); - - update_flag = 1; - } - if (update_flag == 0) { - res = f_open(&esp_upload.uploadFile, ESP_WEB_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); - - if (res == FR_OK) { - f_close(&esp_upload.uploadFile); - - wifi_delay(2000); - - if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { - return; - } - - clear_cur_ui(); - - draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); - if (wifi_upload(1) >= 0) { - - f_unlink("1:/MKS_WIFI_CUR"); - f_rename(ESP_WEB_FIRMWARE_FILE,"/MKS_WIFI_CUR"); - } - draw_return_ui(); - update_flag = 1; - } - - } - if (update_flag == 0) { - res = f_open(&esp_upload.uploadFile, ESP_WEB_FILE, FA_OPEN_EXISTING | FA_READ); - if (res == FR_OK) { - f_close(&esp_upload.uploadFile); - - wifi_delay(2000); - - if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { - return; - } - - clear_cur_ui(); - - draw_dialog(DIALOG_TYPE_UPDATE_ESP_DATA); - - if (wifi_upload(2) >= 0) { - - f_unlink("1:/MKS_WEB_CONTROL_CUR"); - f_rename(ESP_WEB_FILE,"/MKS_WEB_CONTROL_CUR"); - } - draw_return_ui(); - } - } - #endif - wifiPara.decodeType = WIFI_DECODE_TYPE; - wifiPara.baud = 115200; - wifi_link_state = WIFI_NOT_CONFIG; -} - -#define BUF_INC_POINTER(p) ((p + 1 == UART_FIFO_BUFFER_SIZE) ? 0 : (p + 1)) - -int usartFifoAvailable(SZ_USART_FIFO *fifo) { - int diff = fifo->uart_write_point - fifo->uart_read_point; - if (diff < 0) diff += UART_FIFO_BUFFER_SIZE; - return diff; -} - -int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { - int i = 0 ; - while (i < len && fifo->uart_read_point != fifo->uart_write_point) { - buf[i++] = fifo->uartTxBuffer[fifo->uart_read_point]; - fifo->uart_read_point = BUF_INC_POINTER(fifo->uart_read_point); - } - return i; -} - -int writeUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { - if (buf == 0 || len <= 0) return -1; - - int i = 0 ; - while (i < len && fifo->uart_read_point != BUF_INC_POINTER(fifo->uart_write_point)) { - fifo->uartTxBuffer[fifo->uart_write_point] = buf[i++]; - fifo->uart_write_point = BUF_INC_POINTER(fifo->uart_write_point); - } - return i; -} - -void get_wifi_commands() { - static char wifi_line_buffer[MAX_CMD_SIZE]; - static bool wifi_comment_mode = false; - static int wifi_read_count = 0; - - if (espGcodeFifo.wait_tick > 5) { - while ((queue.length < BUFSIZE) && (espGcodeFifo.r != espGcodeFifo.w)) { - - espGcodeFifo.wait_tick = 0; - - char wifi_char = espGcodeFifo.Buffer[espGcodeFifo.r]; - - espGcodeFifo.r = (espGcodeFifo.r + 1) % WIFI_GCODE_BUFFER_SIZE; - - /** - * If the character ends the line - */ - if (wifi_char == '\n' || wifi_char == '\r') { - - wifi_comment_mode = false; // end of line == end of comment - - if (!wifi_read_count) continue; // skip empty lines - - wifi_line_buffer[wifi_read_count] = 0; // terminate string - wifi_read_count = 0; //reset buffer - - char* command = wifi_line_buffer; - while (*command == ' ') command++; // skip any leading spaces - - // Movement commands alert when stopped - if (IsStopped()) { - char* gpos = strchr(command, 'G'); - if (gpos) { - switch (strtol(gpos + 1, nullptr, 10)) { - case 0 ... 1: - #if ENABLED(ARC_SUPPORT) - case 2 ... 3: - #endif - #if ENABLED(BEZIER_CURVE_SUPPORT) - case 5: - #endif - SERIAL_ECHOLNPGM(STR_ERR_STOPPED); - LCD_MESSAGEPGM(MSG_STOPPED); - break; - } - } - } - - #if DISABLED(EMERGENCY_PARSER) - // Process critical commands early - if (strcmp(command, "M108") == 0) { - wait_for_heatup = false; - TERN_(HAS_LCD_MENU, wait_for_user = false); - } - if (strcmp(command, "M112") == 0) kill(M112_KILL_STR, nullptr, true); - if (strcmp(command, "M410") == 0) quickstop_stepper(); - #endif - - // Add the command to the queue - queue.enqueue_one_P(wifi_line_buffer); - } - else if (wifi_read_count >= MAX_CMD_SIZE - 1) { - - } - else { // it's not a newline, carriage return or escape char - if (wifi_char == ';') wifi_comment_mode = true; - if (!wifi_comment_mode) wifi_line_buffer[wifi_read_count++] = wifi_char; - } - } - }// queue has space, serial has data - else { - espGcodeFifo.wait_tick++; - } -} - -int readWifiBuf(int8_t *buf, int32_t len) { - int i = 0; - while (i < len && WIFISERIAL.available()) - buf[i++] = WIFISERIAL.read(); - return i; -} - -#endif // USE_WIFI_FUNCTION -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h deleted file mode 100644 index 0b402a3adb..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h +++ /dev/null @@ -1,202 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#include "../../inc/MarlinConfigPre.h" - -#include -#include -#include - -#define UART_RX_BUFFER_SIZE 1024 -#define UART_FIFO_BUFFER_SIZE 1024 - -#define ESP_WIFI 0x02 - -#define AP_MODEL 0x01 -#define STA_MODEL 0x02 - -#define WIFI_DECODE_TYPE 1 - -#define IP_DHCP_FLAG 1 - -#define WIFI_AP_NAME "TP-LINK_MKS" -#define WIFI_KEY_CODE "makerbase" - -#define IP_ADDR "192.168.3.100" -#define IP_MASK "255.255.255.0" -#define IP_GATE "192.168.3.1" -#define IP_DNS "192.168.3.1" - -#define AP_IP_DHCP_FLAG 1 -#define AP_IP_ADDR "192.168.3.100" -#define AP_IP_MASK "255.255.255.0" -#define AP_IP_GATE "192.168.3.1" -#define AP_IP_DNS "192.168.3.1" -#define IP_START_IP "192.168.3.1" -#define IP_END_IP "192.168.3.255" - -#define UDISKBUFLEN 1024 - -typedef enum{ - udisk_buf_empty = 0, - udisk_buf_full, -} UDISK_DATA_BUFFER_STATE; - -#define TRANS_RCV_FIFO_BLOCK_NUM 8 - -typedef struct { - unsigned char *bufferAddr[TRANS_RCV_FIFO_BLOCK_NUM]; - unsigned char *p; - UDISK_DATA_BUFFER_STATE state[TRANS_RCV_FIFO_BLOCK_NUM]; - unsigned char read_cur; - unsigned char write_cur; -} WIFI_DMA_RCV_FIFO; - -typedef struct { - uint8_t flag; // 0x0: no error; 0x01: error - uint32_t start_tick; //error start time - uint32_t now_tick; -} WIFI_TRANS_ERROR; - -extern volatile WIFI_TRANS_ERROR wifiTransError; - -typedef struct { - char ap_name[32]; //wifi-name - char keyCode[64]; //wifi password - int decodeType; - int baud; - int mode; -} WIFI_PARA; - -typedef struct { - char state; - char hostUrl[96]; - int port; - char id[21]; -} CLOUD_PARA; - -typedef struct { - char dhcp_flag; - char ip_addr[16]; - char mask[16]; - char gate[16]; - char dns[16]; - - char dhcpd_flag; - char dhcpd_ip[16]; - char dhcpd_mask[16]; - char dhcpd_gate[16]; - char dhcpd_dns[16]; - char start_ip_addr[16]; - char end_ip_addr[16]; -} IP_PARA; - -typedef enum { - WIFI_NOT_CONFIG, - WIFI_CONFIG_MODE, - WIFI_CONFIG_DHCP, - WIFI_CONFIG_AP, - WIFI_CONFIG_IP_INF, - WIFI_CONFIG_DNS, - WIFI_CONFIG_TCP, - WIFI_CONFIG_SERVER, - WIFI_CONFIG_REMOTE_PORT, - WIFI_CONFIG_BAUD, - WIFI_CONFIG_COMMINT, - WIFI_CONFIG_OK, - WIFI_GET_IP_OK, - WIFI_RECONN, - WIFI_CONNECTED, - WIFI_WAIT_TRANS_START, - WIFI_TRANS_FILE, - WIFI_CONFIG_DHCPD, - WIFI_COFIG_DHCPD_IP, - WIFI_COFIG_DHCPD_DNS, - WIFI_EXCEPTION, -} WIFI_STATE; - -typedef enum { - TRANSFER_IDLE, - TRANSFERING, - TRANSFER_STORE, -} TRANSFER_STATE; -extern volatile TRANSFER_STATE esp_state; - -typedef struct { - char buf[20][80]; - int rd_index; - int wt_index; -} QUEUE; - -typedef enum { - WIFI_PARA_SET, // 0x0:net parameter - WIFI_PRINT_INF, // 0x1:print message - WIFI_TRANS_INF, // 0x2:Pass through information - WIFI_EXCEP_INF, // 0x3:Exception information - WIFI_CLOUD_CFG, // 0x4:cloud config - WIFI_CLOUD_UNBIND, // 0x5:Unbind ID -} WIFI_RET_TYPE; - -typedef struct { - uint32_t uart_read_point; - uint32_t uart_write_point; - uint8_t uartTxBuffer[UART_FIFO_BUFFER_SIZE]; -} SZ_USART_FIFO; - -#define WIFI_GCODE_BUFFER_LEAST_SIZE 96 -#define WIFI_GCODE_BUFFER_SIZE (WIFI_GCODE_BUFFER_LEAST_SIZE * 3) -typedef struct { - uint8_t wait_tick; - uint8_t Buffer[WIFI_GCODE_BUFFER_SIZE]; - uint32_t r; - uint32_t w; -} WIFI_GCODE_BUFFER; - -extern volatile WIFI_STATE wifi_link_state; -extern WIFI_PARA wifiPara; -extern IP_PARA ipPara; -extern CLOUD_PARA cloud_para; - -extern WIFI_GCODE_BUFFER espGcodeFifo; - -extern uint32_t getWifiTick(); -extern uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick); - -extern void mks_esp_wifi_init(); -extern int cfg_cloud_flag; -extern int send_to_wifi(char *buf, int len); -extern void wifi_looping(); -extern int raw_send_to_wifi(char *buf, int len); -extern int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len); -extern void get_wifi_list_command_send(); -extern void get_wifi_commands(); -extern int readWifiBuf(int8_t *buf, int32_t len); -extern int storeRcvData(int32_t len); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp deleted file mode 100644 index 087a3b2110..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ /dev/null @@ -1,829 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#include "../../../../inc/MarlinConfigPre.h" - -#if HAS_TFT_LVGL_UI - -#include "draw_ui.h" -#include "wifi_module.h" -#include "wifi_upload.h" - -#include "../../../../MarlinCore.h" - -#define WIFI_SET() WRITE(WIFI_RESET_PIN, HIGH); -#define WIFI_RESET() WRITE(WIFI_RESET_PIN, LOW); -#define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); -#define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); - -extern SZ_USART_FIFO WifiRxFifo; - -extern int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len); -extern int writeUsartFifo(SZ_USART_FIFO * fifo, int8_t * buf, int32_t len); -extern void esp_port_begin(uint8_t interrupt); -extern int usartFifoAvailable(SZ_USART_FIFO *fifo); -extern void wifi_delay(int n); - -#define ARRAY_SIZE(a) sizeof(a) / sizeof((a)[0]) - -//typedef signed char bool; - -// ESP8266 command codes -const uint8_t ESP_FLASH_BEGIN = 0x02; -const uint8_t ESP_FLASH_DATA = 0x03; -const uint8_t ESP_FLASH_END = 0x04; -const uint8_t ESP_MEM_BEGIN = 0x05; -const uint8_t ESP_MEM_END = 0x06; -const uint8_t ESP_MEM_DATA = 0x07; -const uint8_t ESP_SYNC = 0x08; -const uint8_t ESP_WRITE_REG = 0x09; -const uint8_t ESP_READ_REG = 0x0A; - -// MAC address storage locations -const uint32_t ESP_OTP_MAC0 = 0x3FF00050; -const uint32_t ESP_OTP_MAC1 = 0x3FF00054; -const uint32_t ESP_OTP_MAC2 = 0x3FF00058; -const uint32_t ESP_OTP_MAC3 = 0x3FF0005C; - -const size_t EspFlashBlockSize = 0x0400; // 1K byte blocks - -const uint8_t ESP_IMAGE_MAGIC = 0xE9; -const uint8_t ESP_CHECKSUM_MAGIC = 0xEF; - -const uint32_t ESP_ERASE_CHIP_ADDR = 0x40004984; // &SPIEraseChip -const uint32_t ESP_SEND_PACKET_ADDR = 0x40003C80; // &send_packet -const uint32_t ESP_SPI_READ_ADDR = 0x40004B1C; // &SPIRead -const uint32_t ESP_UNKNOWN_ADDR = 0x40001121; // not used -const uint32_t ESP_USER_DATA_RAM_ADDR = 0x3FFE8000; // &user data ram -const uint32_t ESP_IRAM_ADDR = 0x40100000; // instruction RAM -const uint32_t ESP_FLASH_ADDR = 0x40200000; // address of start of Flash -//const uint32_t ESP_FLASH_READ_STUB_BEGIN = IRAM_ADDR + 0x18; - -UPLOAD_STRUCT esp_upload; - -static const unsigned int retriesPerReset = 3; -static const uint32_t connectAttemptInterval = 50; -static const unsigned int percentToReportIncrement = 5; // how often we report % complete -static const uint32_t defaultTimeout = 500; -static const uint32_t eraseTimeout = 15000; -static const uint32_t blockWriteTimeout = 200; -static const uint32_t blockWriteInterval = 15; // 15ms is long enough, 10ms is mostly too short - -// Messages corresponding to result codes, should make sense when followed by " error" -const char *resultMessages[] = { - "no", - "timeout", - "comm write", - "connect", - "bad reply", - "file read", - "empty file", - "response header", - "slip frame", - "slip state", - "slip data" -}; - -// A note on baud rates. -// The ESP8266 supports 921600, 460800, 230400, 115200, 74880 and some lower baud rates. -// 921600b is not reliable because even though it sometimes succeeds in connecting, we get a bad response during uploading after a few blocks. -// Probably our UART ISR cannot receive bytes fast enough, perhaps because of the latency of the system tick ISR. -// 460800b doesn't always manage to connect, but if it does then uploading appears to be reliable. -// 230400b always manages to connect. -static const uint32_t uploadBaudRates[] = { 460800, 230400, 115200, 74880 }; - -signed char IsReady() { - return esp_upload.state == upload_idle; -} - -void uploadPort_write(const uint8_t *buf, size_t len) { - #if 0 - int i; - - for (i = 0; i < len; i++) { - while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { /* nada */ } - USART_SendData(USART1, *(buf + i)); - } - #endif -} - -char uploadPort_read() { - uint8_t retChar; - if (readUsartFifo(&WifiRxFifo, (int8_t *)&retChar, 1) == 1) - return retChar; - else - return 0; -} - -int uploadPort_available() { - return usartFifoAvailable(&WifiRxFifo); -} - -void uploadPort_begin() { - esp_port_begin(1); -} - -void uploadPort_close() { - //WIFI_COM.end(); - //WIFI_COM.begin(115200, true); - esp_port_begin(0); -} - -void flushInput() { - while (uploadPort_available() != 0) { - (void)uploadPort_read(); - //IWDG_ReloadCounter(); - } -} - -// Extract 1-4 bytes of a value in little-endian order from a buffer beginning at a specified offset -uint32_t getData(unsigned byteCnt, const uint8_t *buf, int ofst) { - uint32_t val = 0; - - if (buf && byteCnt) { - unsigned int shiftCnt = 0; - if (byteCnt > 4) - byteCnt = 4; - do{ - val |= (uint32_t)buf[ofst++] << shiftCnt; - shiftCnt += 8; - } while (--byteCnt); - } - return(val); -} - -// Put 1-4 bytes of a value in little-endian order into a buffer beginning at a specified offset. -void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { - if (buf && byteCnt) { - if (byteCnt > 4) { - byteCnt = 4; - } - do { - buf[ofst++] = (uint8_t)(val & 0xFF); - val >>= 8; - } while (--byteCnt); - } -} - -// Read a byte optionally performing SLIP decoding. The return values are: -// -// 2 - an escaped byte was read successfully -// 1 - a non-escaped byte was read successfully -// 0 - no data was available -// -1 - the value 0xC0 was encountered (shouldn't happen) -// -2 - a SLIP escape byte was found but the following byte wasn't available -// -3 - a SLIP escape byte was followed by an invalid byte -int ReadByte(uint8_t *data, signed char slipDecode) { - if (uploadPort_available() == 0) { - return(0); - } - - // at least one byte is available - *data = uploadPort_read(); - if (!slipDecode) { - return(1); - } - - if (*data == 0xC0) { - // this shouldn't happen - return(-1); - } - - // if not the SLIP escape, we're done - if (*data != 0xDB) { - return(1); - } - - // SLIP escape, check availability of subsequent byte - if (uploadPort_available() == 0) { - return(-2); - } - - // process the escaped byte - *data = uploadPort_read(); - if (*data == 0xDC) { - *data = 0xC0; - return(2); - } - - if (*data == 0xDD) { - *data = 0xDB; - return(2); - } - // invalid - return(-3); -} -// When we write a sync packet, there must be no gaps between most of the characters. -// So use this function, which does a block write to the UART buffer in the latest CoreNG. -void _writePacketRaw(const uint8_t *buf, size_t len) { - uploadPort_write(buf, len); -} - -// Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. -void WriteByteRaw(uint8_t b) { - uploadPort_write((const uint8_t *)&b, 1); -} - -// Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. -void WriteByteSlip(uint8_t b) { - if (b == 0xC0) { - WriteByteRaw(0xDB); - WriteByteRaw(0xDC); - } - else if (b == 0xDB) { - WriteByteRaw(0xDB); - WriteByteRaw(0xDD); - } - else { - uploadPort_write((const uint8_t *)&b, 1); - } -} - -// Wait for a data packet to be returned. If the body of the packet is -// non-zero length, return an allocated buffer indirectly containing the -// data and return the data length. Note that if the pointer for returning -// the data buffer is NULL, the response is expected to be two bytes of zero. -// -// If an error occurs, return a negative value. Otherwise, return the number -// of bytes in the response (or zero if the response was not the standard "two bytes of zero"). -EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t msTimeout) { - typedef enum { - begin = 0, - header, - body, - end, - done - } PacketState; - - uint8_t resp, opRet; - - const size_t headerLength = 8; - - uint32_t startTime = getWifiTick(); - uint8_t hdr[headerLength]; - uint16_t hdrIdx = 0; - - uint16_t bodyIdx = 0; - uint8_t respBuf[2]; - - // wait for the response - uint16_t needBytes = 1; - - PacketState state = begin; - - *bodyLen = 0; - - while (state != done) { - uint8_t c; - EspUploadResult stat; - - //IWDG_ReloadCounter(); - - if (getWifiTickDiff(startTime, getWifiTick()) > msTimeout) { - return(timeout); - } - - if (uploadPort_available() < needBytes) { - // insufficient data available - // preferably, return to Spin() here - continue; - } - - // sufficient bytes have been received for the current state, process them - switch (state) { - case begin: // expecting frame start - c = uploadPort_read(); - if (c != (uint8_t)0xC0) { - break; - } - state = header; - needBytes = 2; - - break; - case end: // expecting frame end - c = uploadPort_read(); - if (c != (uint8_t)0xC0) { - return slipFrame; - } - state = done; - - break; - - case header: // reading an 8-byte header - case body: // reading the response body - { - int rslt; - // retrieve a byte with SLIP decoding - rslt = ReadByte(&c, 1); - if (rslt != 1 && rslt != 2) { - // some error occurred - stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; - return stat; - } - else if (state == header) { - //store the header byte - hdr[hdrIdx++] = c; - if (hdrIdx >= headerLength) { - // get the body length, prepare a buffer for it - *bodyLen = (uint16_t)getData(2, hdr, 2); - - // extract the value, if requested - if (valp != 0) { - *valp = getData(4, hdr, 4); - } - - if (*bodyLen != 0) { - state = body; - } - else { - needBytes = 1; - state = end; - } - } - } - else { - // Store the response body byte, check for completion - if (bodyIdx < ARRAY_SIZE(respBuf)) { - respBuf[bodyIdx] = c; - } - ++bodyIdx; - if (bodyIdx >= *bodyLen) { - needBytes = 1; - state = end; - } - } - } - break; - - default: // this shouldn't happen - return slipState; - } - } - - // Extract elements from the header - resp = (uint8_t)getData(1, hdr, 0); - opRet = (uint8_t)getData(1, hdr, 1); - // Sync packets often provoke a response with a zero opcode instead of ESP_SYNC - if (resp != 0x01 || opRet != op) { - //printf("resp %02x %02x\n", resp, opRet); //debug - return respHeader; - } - - return success; -} - -// Send a block of data performing SLIP encoding of the content. -void _writePacket(const uint8_t *data, size_t len) { - unsigned char outBuf[2048] = {0}; - unsigned int outIndex = 0; - while (len != 0) { - if (*data == 0xC0) { - outBuf[outIndex++] = 0xDB; - outBuf[outIndex++] = 0xDC; - } - else if (*data == 0xDB) { - outBuf[outIndex++] = 0xDB; - outBuf[outIndex++] = 0xDD; - } - else { - outBuf[outIndex++] = *data; - - } - data++; - --len; - } - uploadPort_write((const uint8_t *)outBuf, outIndex); -} - -// Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. -// A SLIP packet begins and ends with 0xC0. The data encapsulated has the bytes -// 0xC0 and 0xDB replaced by the two-byte sequences {0xDB, 0xDC} and {0xDB, 0xDD} respectively. - -void writePacket(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { - WriteByteRaw(0xC0); // send the packet start character - _writePacket(hdr, hdrLen); // send the header - _writePacket(data, dataLen); // send the data block - WriteByteRaw(0xC0); // send the packet end character -} - -// Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. -// This is like writePacket except that it does a fast block write for both the header and the main data with no SLIP encoding. Used to send sync commands. -void writePacketRaw(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { - WriteByteRaw(0xC0); // send the packet start character - _writePacketRaw(hdr, hdrLen); // send the header - _writePacketRaw(data, dataLen); // send the data block in raw mode - WriteByteRaw(0xC0); // send the packet end character -} - -// Send a command to the attached device together with the supplied data, if any. -// The data is supplied via a list of one or more segments. -void sendCommand(uint8_t op, uint32_t checkVal, const uint8_t *data, size_t dataLen) { - // populate the header - uint8_t hdr[8]; - putData(0, 1, hdr, 0); - putData(op, 1, hdr, 1); - putData(dataLen, 2, hdr, 2); - putData(checkVal, 4, hdr, 4); - - // send the packet - //flushInput(); - if (op == ESP_SYNC) - writePacketRaw(hdr, sizeof(hdr), data, dataLen); - else - writePacket(hdr, sizeof(hdr), data, dataLen); -} - -// Send a command to the attached device together with the supplied data, if any, and get the response -EspUploadResult doCommand(uint8_t op, const uint8_t *data, size_t dataLen, uint32_t checkVal, uint32_t *valp, uint32_t msTimeout) { - size_t bodyLen; - EspUploadResult stat; - - sendCommand(op, checkVal, data, dataLen); - - stat = readPacket(op, valp, &bodyLen, msTimeout); - if (stat == success && bodyLen != 2) - stat = badReply; - - return stat; -} - -// Send a synchronising packet to the serial port in an attempt to induce -// the ESP8266 to auto-baud lock on the baud rate. -EspUploadResult Sync(uint16_t timeout) { - uint8_t buf[36]; - EspUploadResult stat; - int i ; - - // compose the data for the sync attempt - memset(buf, 0x55, sizeof(buf)); - buf[0] = 0x07; - buf[1] = 0x07; - buf[2] = 0x12; - buf[3] = 0x20; - - stat = doCommand(ESP_SYNC, buf, sizeof(buf), 0, 0, timeout); - - // If we got a response other than sync, discard it and wait for a sync response. This happens at higher baud rates. - for (i = 0; i < 10 && stat == respHeader; ++i) { - size_t bodyLen; - stat = readPacket(ESP_SYNC, 0, &bodyLen, timeout); - } - - if (stat == success) { - // Read and discard additional replies - for (;;) { - size_t bodyLen; - EspUploadResult rc = readPacket(ESP_SYNC, 0, &bodyLen, defaultTimeout); - if (rc != success || bodyLen != 2) { - break; - } - } - } - //DEBUG - //else debug//printf("stat=%d\n", (int)stat); - return stat; -} - -// Send a command to the device to begin the Flash process. -EspUploadResult flashBegin(uint32_t addr, uint32_t size) { - // determine the number of blocks represented by the size - uint32_t blkCnt; - uint8_t buf[16]; - uint32_t timeout; - - blkCnt = (size + EspFlashBlockSize - 1) / EspFlashBlockSize; - - // ensure that the address is on a block boundary - addr &= ~(EspFlashBlockSize - 1); - - // begin the Flash process - putData(size, 4, buf, 0); - putData(blkCnt, 4, buf, 4); - putData(EspFlashBlockSize, 4, buf, 8); - putData(addr, 4, buf, 12); - - timeout = (size != 0) ? eraseTimeout : defaultTimeout; - return doCommand(ESP_FLASH_BEGIN, buf, sizeof(buf), 0, 0, timeout); -} - -// Send a command to the device to terminate the Flash process -EspUploadResult flashFinish(signed char reboot) { - uint8_t buf[4]; - putData(reboot ? 0 : 1, 4, buf, 0); - return doCommand(ESP_FLASH_END, buf, sizeof(buf), 0, 0, defaultTimeout); -} - -// Compute the checksum of a block of data -uint16_t checksum(const uint8_t *data, uint16_t dataLen, uint16_t cksum) { - if (data != NULL) { - while (dataLen--) { - cksum ^= (uint16_t)*data++; - } - } - return(cksum); -} - -EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { - #if 0 - const uint32_t blkSize = EspFlashBlockSize; - int i; - - // Allocate a data buffer for the combined header and block data - const uint16_t hdrOfst = 0; - const uint16_t dataOfst = 16; - const uint16_t blkBufSize = dataOfst + blkSize; - uint32_t blkBuf32[blkBufSize/4]; - uint8_t * const blkBuf = (uint8_t*)(blkBuf32); - uint32_t cnt; - uint16_t cksum; - EspUploadResult stat; - - // Prepare the header for the block - putData(blkSize, 4, blkBuf, hdrOfst + 0); - putData(esp_upload.uploadBlockNumber, 4, blkBuf, hdrOfst + 4); - putData(0, 4, blkBuf, hdrOfst + 8); - putData(0, 4, blkBuf, hdrOfst + 12); - - // Get the data for the block - f_read(&esp_upload.uploadFile, blkBuf + dataOfst, blkSize, &cnt );//->Read(reinterpret_cast(blkBuf + dataOfst), blkSize); - if (cnt != blkSize) { - if (f_tell(&esp_upload.uploadFile) == esp_upload.fileSize) { - // partial last block, fill the remainder - memset(blkBuf + dataOfst + cnt, 0xFF, blkSize - cnt); - } - else { - return fileRead; - } - } - - // Patch the flash parameters into the first block if it is loaded at address 0 - if (esp_upload.uploadBlockNumber == 0 && esp_upload.uploadAddress == 0 && blkBuf[dataOfst] == ESP_IMAGE_MAGIC && flashParmMask != 0) { - // update the Flash parameters - uint32_t flashParm = getData(2, blkBuf + dataOfst + 2, 0) & ~(uint32_t)flashParmMask; - putData(flashParm | flashParmVal, 2, blkBuf + dataOfst + 2, 0); - } - - // Calculate the block checksum - cksum = checksum(blkBuf + dataOfst, blkSize, ESP_CHECKSUM_MAGIC); - - for (i = 0; i < 3; i++) { - if ((stat = doCommand(ESP_FLASH_DATA, blkBuf, blkBufSize, cksum, 0, blockWriteTimeout)) == success) { - break; - } - } - - //printf("Upload %d\%\n", ftell(&esp_upload.uploadFile) * 100 / esp_upload.fileSize); - - return stat; - #else - return success; - #endif -} - -void upload_spin() { - #if 0 - switch (esp_upload.state) { - case resetting: - - if (esp_upload.connectAttemptNumber == 9) { - // Time to give up - //Network::ResetWiFi(); - esp_upload.uploadResult = connected; - esp_upload.state = done; - } - else { - - // Reset the serial port at the new baud rate. Also reset the ESP8266. - // const uint32_t baud = uploadBaudRates[esp_upload.connectAttemptNumber/esp_upload.retriesPerBaudRate]; - if (esp_upload.connectAttemptNumber % esp_upload.retriesPerBaudRate == 0) { - } - //uploadPort.begin(baud); - //uploadPort_close(); - - uploadPort_begin(); - - wifi_delay(2000); - - flushInput(); - - esp_upload.lastAttemptTime = esp_upload.lastResetTime = getWifiTick(); - esp_upload.state = connecting; - } - - break; - - case connecting: - if ((getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= connectAttemptInterval) && (getWifiTickDiff(esp_upload.lastResetTime, getWifiTick()) >= 500)) { - // Attempt to establish a connection to the ESP8266. - EspUploadResult res = Sync(5000); - esp_upload.lastAttemptTime = getWifiTick(); - if (res == success) { - // Successful connection - //MessageF(" success on attempt %d\n", (connectAttemptNumber % retriesPerBaudRate) + 1); - //printf("connect success\n"); - esp_upload.state = erasing; - } - else { - // This attempt failed - esp_upload.connectAttemptNumber++; - if (esp_upload.connectAttemptNumber % retriesPerReset == 0) { - esp_upload.state = resetting; // try a reset and a lower baud rate - } - } - } - break; - - case erasing: - if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= blockWriteInterval) { - uint32_t eraseSize; - const uint32_t sectorsPerBlock = 16; - const uint32_t sectorSize = 4096; - const uint32_t numSectors = (esp_upload.fileSize + sectorSize - 1)/sectorSize; - const uint32_t startSector = esp_upload.uploadAddress/sectorSize; - - uint32_t headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); - NOMORE(headSectors, numSectors); - - eraseSize = (numSectors < 2 * headSectors) - ? (numSectors + 1) / 2 * sectorSize - : (numSectors - headSectors) * sectorSize; - - //MessageF("Erasing %u bytes...\n", fileSize); - esp_upload.uploadResult = flashBegin(esp_upload.uploadAddress, eraseSize); - if (esp_upload.uploadResult == success) { - //MessageF("Uploading file...\n"); - esp_upload.uploadBlockNumber = 0; - esp_upload.uploadNextPercentToReport = percentToReportIncrement; - esp_upload.lastAttemptTime = getWifiTick(); - esp_upload.state = uploading; - } - else { - //MessageF("Erase failed\n"); - esp_upload.state = done; - } - } - break; - - case uploading: - // The ESP needs several milliseconds to recover from one packet before it will accept another - if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= 15) { - unsigned int percentComplete; - const uint32_t blkCnt = (esp_upload.fileSize + EspFlashBlockSize - 1) / EspFlashBlockSize; - if (esp_upload.uploadBlockNumber < blkCnt) { - esp_upload.uploadResult = flashWriteBlock(0, 0); - esp_upload.lastAttemptTime = getWifiTick(); - if (esp_upload.uploadResult != success) { - //MessageF("Flash block upload failed\n"); - esp_upload.state = done; - } - percentComplete = (100 * esp_upload.uploadBlockNumber)/blkCnt; - ++esp_upload.uploadBlockNumber; - if (percentComplete >= esp_upload.uploadNextPercentToReport) { - //MessageF("%u%% complete\n", percentComplete); - esp_upload.uploadNextPercentToReport += percentToReportIncrement; - } - } - else { - esp_upload.state = done; - } - } - break; - - case done: - f_close(&esp_upload.uploadFile); - //uploadPort.end(); - //uploadPort_close(); - - //WIFI_COM.begin(115200, true); - //wifi_init(); - - if (esp_upload.uploadResult == success) { - //printf("upload successfully\n"); - } - else { - //printf("upload failed\n"); - } - esp_upload.state = upload_idle;//idle; - break; - - default: - break; - } - #endif -} - -// Try to upload the given file at the given address -void SendUpdateFile(const char *file, uint32_t address) { - #if 0 - FRESULT res = f_open(&esp_upload.uploadFile, file, FA_OPEN_EXISTING | FA_READ); - - if (res != FR_OK) return; - - esp_upload.fileSize = f_size(&esp_upload.uploadFile); - if (esp_upload.fileSize == 0) { - f_close(&esp_upload.uploadFile); - return; - } - f_lseek(&esp_upload.uploadFile, 0); - - esp_upload.uploadAddress = address; - esp_upload.connectAttemptNumber = 0; - esp_upload.state = resetting; - #endif -} - -static const uint32_t FirmwareAddress = 0x00000000, WebFilesAddress = 0x00100000; - -void ResetWiFiForUpload(int begin_or_end) { - #if 0 - uint32_t start, now; - - GPIO_InitTypeDef GPIO_InitStructure; - - #if V1_0_V1_1 - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStructure.Pin = GPIO_Pin_8; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - #else - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = GPIO_Pin_13; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - #endif - start = getWifiTick(); - now = start; - - if (begin_or_end == 0) { - #if V1_0_V1_1 - HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_RESET); //update mode - #else - HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_RESET); //update mode - #endif - } - else { - #if V1_0_V1_1 - #if V1_0_V1_1 - HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_SET); //boot mode - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStructure.Pin = GPIO_Pin_8; - GPIO_InitStructure.Mode = GPIO_MODE_INPUT; - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - #endif - #else - HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_SET); //boot mode - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Pin = GPIO_Pin_13; - GPIO_InitStructure.Mode = GPIO_MODE_INPUT; - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - #endif - } - WIFI_RESET(); - while (getWifiTickDiff(start, now) < 500) now = getWifiTick(); - WIFI_SET(); - #endif -} - -int32_t wifi_upload(int type) { - esp_upload.retriesPerBaudRate = 9; - - ResetWiFiForUpload(0); - - if (type == 0) - SendUpdateFile(ESP_FIRMWARE_FILE, FirmwareAddress); - else if (type == 1) - SendUpdateFile(ESP_WEB_FIRMWARE_FILE, FirmwareAddress); - else if (type == 2) - SendUpdateFile(ESP_WEB_FILE, WebFilesAddress); - else - return -1; - - while (esp_upload.state != upload_idle) { - upload_spin(); - //IWDG_ReloadCounter(); - } - - ResetWiFiForUpload(1); - - return esp_upload.uploadResult == success ? 0 : -1; -} - -#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h deleted file mode 100644 index d942a2c84f..0000000000 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef __cplusplus - extern "C" { /* C-declarations for C++ */ -#endif - -#define ESP_FIRMWARE_FILE "1:/MksWifi.bin" -#define ESP_WEB_FIRMWARE_FILE "1:/MksWifi_Web.bin" -#define ESP_WEB_FILE "1:/MksWifi_WebView.bin" - -typedef enum { - upload_idle, - resetting, - connecting, - erasing, - uploading, - done -} UploadState; - -typedef enum { - success = 0, - timeout, - connected, - badReply, - fileRead, - emptyFile, - respHeader, - slipFrame, - slipState, - slipData, -} EspUploadResult; - -typedef struct { - //FIL uploadFile; - uint32_t fileSize; - - uint32_t uploadAddress; - UploadState state; - uint32_t retriesPerBaudRate; - uint32_t connectAttemptNumber; - uint32_t lastAttemptTime; - uint32_t lastResetTime; - uint32_t uploadBlockNumber; - uint32_t uploadNextPercentToReport; - EspUploadResult uploadResult; -} UPLOAD_STRUCT; - -extern UPLOAD_STRUCT esp_upload; -int32_t wifi_upload(int type); - -#ifdef __cplusplus - } /* C-declarations for C++ */ -#endif diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp deleted file mode 100644 index 79a5fb961a..0000000000 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * malyan_lcd.cpp - * - * LCD implementation for Malyan's LCD, a separate ESP8266 MCU running - * on Serial1 for the M200 board. This module outputs a pseudo-gcode - * wrapped in curly braces which the LCD implementation translates into - * actual G-code commands. - * - * Added to Marlin for Mini/Malyan M200 - * Unknown commands as of Jan 2018: {H:} - * Not currently implemented: - * {E:} when sent by LCD. Meaning unknown. - * - * Notes for connecting to boards that are not Malyan: - * The LCD is 3.3v, so if powering from a RAMPS 1.4 board or - * other 5v/12v board, use a buck converter to power the LCD and - * the 3.3v side of a logic level shifter. Aux1 on the RAMPS board - * has Serial1 and 12v, making it perfect for this. - * Copyright (c) 2017 Jason Nelson (xC0000005) - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(MALYAN_LCD) - -//#define DEBUG_MALYAN_LCD - -#include "ui_api.h" - -#include "../ultralcd.h" -#include "../../sd/cardreader.h" -#include "../../module/temperature.h" -#include "../../module/stepper.h" -#include "../../module/motion.h" -#include "../../libs/duration_t.h" -#include "../../module/printcounter.h" -#include "../../gcode/queue.h" - -#define DEBUG_OUT ENABLED(DEBUG_MALYAN_LCD) -#include "../../core/debug_out.h" - -// This is based on longest sys command + a filename, plus some buffer -// in case we encounter some data we don't recognize -// There is no evidence a line will ever be this long, but better safe than sorry -#define MAX_CURLY_COMMAND (32 + LONG_FILENAME_LENGTH) * 2 - -// Track incoming command bytes from the LCD -uint16_t inbound_count; - -// For sending print completion messages -bool last_printing_status = false; - -// Everything written needs the high bit set. -void write_to_lcd_P(PGM_P const message) { - char encoded_message[MAX_CURLY_COMMAND]; - uint8_t message_length = _MIN(strlen_P(message), sizeof(encoded_message)); - - LOOP_L_N(i, message_length) - encoded_message[i] = pgm_read_byte(&message[i]) | 0x80; - - LCD_SERIAL.Print::write(encoded_message, message_length); -} - -void write_to_lcd(const char * const message) { - char encoded_message[MAX_CURLY_COMMAND]; - const uint8_t message_length = _MIN(strlen(message), sizeof(encoded_message)); - - LOOP_L_N(i, message_length) - encoded_message[i] = message[i] | 0x80; - - LCD_SERIAL.Print::write(encoded_message, message_length); -} - -// {E:} is for error states. -void set_lcd_error_P(PGM_P const error, PGM_P const component=nullptr) { - write_to_lcd_P(PSTR("{E:")); - write_to_lcd_P(error); - if (component) { - write_to_lcd_P(PSTR(" ")); - write_to_lcd_P(component); - } - write_to_lcd_P(PSTR("}")); -} - - -/** - * Process an LCD 'C' command. - * These are currently all temperature commands - * {C:T0190} - * Set temp for hotend to 190 - * {C:P050} - * Set temp for bed to 50 - * - * {C:S09} set feedrate to 90 %. - * {C:S12} set feedrate to 120 %. - * - * the command portion begins after the : - */ -void process_lcd_c_command(const char* command) { - const int target_val = command[1] ? atoi(command + 1) : -1; - if (target_val < 0) { - DEBUG_ECHOLNPAIR("UNKNOWN C COMMAND ", command); - return; - } - switch (command[0]) { - case 'C': // Cope with both V1 early rev and later LCDs. - case 'S': - feedrate_percentage = target_val * 10; - LIMIT(feedrate_percentage, 10, 999); - break; - - case 'T': - // Sometimes the LCD will send commands to turn off both extruder and bed, though - // this should not happen since the printing screen is up. Better safe than sorry. - if (!print_job_timer.isRunning() || target_val > 0) - ExtUI::setTargetTemp_celsius(target_val, ExtUI::extruder_t::E0); - break; - - #if HAS_HEATED_BED - case 'P': ExtUI::setTargetTemp_celsius(target_val, ExtUI::heater_t::BED); break; - #endif - - default: DEBUG_ECHOLNPAIR("UNKNOWN C COMMAND ", command); - } -} - -/** - * Process an LCD 'B' command. - * {B:0} results in: {T0:008/195}{T1:000/000}{TP:000/000}{TQ:000C}{TT:000000} - * T0/T1 are hot end temperatures, TP is bed, TQ is percent, and TT is probably - * time remaining (HH:MM:SS). The UI can't handle displaying a second hotend, - * but the stock firmware always sends it, and it's always zero. - */ -void process_lcd_eb_command(const char* command) { - char elapsed_buffer[10]; - static uint8_t iteration = 0; - duration_t elapsed; - switch (command[0]) { - case '0': { - elapsed = print_job_timer.duration(); - sprintf_P(elapsed_buffer, PSTR("%02u%02u%02u"), uint16_t(elapsed.hour()), uint16_t(elapsed.minute()) % 60, uint16_t(elapsed.second()) % 60); - - char message_buffer[MAX_CURLY_COMMAND]; - uint8_t done_pct = print_job_timer.isRunning() ? (iteration * 10) : 100; - iteration = (iteration + 1) % 10; // Provide progress animation - #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia() || ExtUI::isPrintingFromMediaPaused()) - done_pct = card.percentDone(); - #endif - - sprintf_P(message_buffer, - PSTR("{T0:%03i/%03i}{T1:000/000}{TP:%03i/%03i}{TQ:%03i}{TT:%s}"), - int(thermalManager.degHotend(0)), thermalManager.degTargetHotend(0), - #if HAS_HEATED_BED - int(thermalManager.degBed()), thermalManager.degTargetBed(), - #else - 0, 0, - #endif - #if ENABLED(SDSUPPORT) - done_pct, - #else - 0, - #endif - elapsed_buffer - ); - write_to_lcd(message_buffer); - } break; - - default: DEBUG_ECHOLNPAIR("UNKNOWN E/B COMMAND ", command); - } -} - -/** - * Process an LCD 'J' command. - * These are currently all movement commands. - * The command portion begins after the : - * Move X Axis - * - * {J:E}{J:X-200}{J:E} - * {J:E}{J:X+200}{J:E} - * X, Y, Z, A (extruder) - */ -template -void j_move_axis(const char* command, const T axis) { - const float dist = atof(command + 1) / 10.0; - ExtUI::setAxisPosition_mm(ExtUI::getAxisPosition_mm(axis) + dist, axis); -}; - -void process_lcd_j_command(const char* command) { - switch (command[0]) { - case 'E': break; - case 'A': j_move_axis(command, ExtUI::extruder_t::E0); break; - case 'Y': j_move_axis(command, ExtUI::axis_t::Y); break; - case 'Z': j_move_axis(command, ExtUI::axis_t::Z); break; - case 'X': j_move_axis(command, ExtUI::axis_t::X); break; - default: DEBUG_ECHOLNPAIR("UNKNOWN J COMMAND ", command); - } -} - -/** - * Process an LCD 'P' command, related to homing and printing. - * Cancel: - * {P:X} - * - * Home all axes: - * {P:H} - * - * Print a file: - * {P:000} - * The File number is specified as a three digit value. - * Printer responds with: - * {PRINTFILE:Mini_SNES_Bottom.gcode} - * {SYS:BUILD}echo:Now fresh file: Mini_SNES_Bottom.gcode - * File opened: Mini_SNES_Bottom.gcode Size: 5805813 - * File selected - * {SYS:BUILD} - * T:-2526.8 E:0 - * T:-2533.0 E:0 - * T:-2537.4 E:0 - * Note only the curly brace stuff matters. - */ -void process_lcd_p_command(const char* command) { - - switch (command[0]) { - case 'P': - ExtUI::pausePrint(); - write_to_lcd_P(PSTR("{SYS:PAUSED}")); - break; - case 'R': - ExtUI::resumePrint(); - write_to_lcd_P(PSTR("{SYS:RESUMED}")); - break; - case 'X': - write_to_lcd_P(PSTR("{SYS:CANCELING}")); - ExtUI::stopPrint(); - write_to_lcd_P(PSTR("{SYS:STARTED}")); - break; - case 'H': queue.enqueue_now_P(G28_STR); break; // Home all axes - default: { - #if ENABLED(SDSUPPORT) - // Print file 000 - a three digit number indicating which - // file to print in the SD card. If it's a directory, - // then switch to the directory. - - // Find the name of the file to print. - // It's needed to echo the PRINTFILE option. - // The {S:L} command should've ensured the SD card was mounted. - card.selectFileByIndex(atoi(command)); - - // There may be a difference in how V1 and V2 LCDs handle subdirectory - // prints. Investigate more. This matches the V1 motion controller actions - // but the V2 LCD switches to "print" mode on {SYS:DIR} response. - if (card.flag.filenameIsDir) { - card.cd(card.filename); - write_to_lcd_P(PSTR("{SYS:DIR}")); - } - else { - char message_buffer[MAX_CURLY_COMMAND]; - sprintf_P(message_buffer, PSTR("{PRINTFILE:%s}"), card.longest_filename()); - write_to_lcd(message_buffer); - write_to_lcd_P(PSTR("{SYS:BUILD}")); - card.openAndPrintFile(card.filename); - } - #endif - } break; // default - } // switch -} - -/** - * Handle an lcd 'S' command - * {S:I} - Temperature request - * {T0:999/000}{T1:000/000}{TP:004/000} - * - * {S:L} - File Listing request - * Printer Response: - * {FILE:buttons.gcode} - * {FILE:update.bin} - * {FILE:nupdate.bin} - * {FILE:fcupdate.flg} - * {SYS:OK} - */ -void process_lcd_s_command(const char* command) { - switch (command[0]) { - case 'I': { - // temperature information - char message_buffer[MAX_CURLY_COMMAND]; - sprintf_P(message_buffer, PSTR("{T0:%03i/%03i}{T1:000/000}{TP:%03i/%03i}"), - int(thermalManager.degHotend(0)), thermalManager.degTargetHotend(0), - #if HAS_HEATED_BED - int(thermalManager.degBed()), thermalManager.degTargetBed() - #else - 0, 0 - #endif - ); - write_to_lcd(message_buffer); - } break; - - case 'L': { - #if ENABLED(SDSUPPORT) - if (!card.isMounted()) card.mount(); - - // A more efficient way to do this would be to - // implement a callback in the ls_SerialPrint code, but - // that requires changes to the core cardreader class that - // would not benefit the majority of users. Since one can't - // select a file for printing during a print, there's - // little reason not to do it this way. - char message_buffer[MAX_CURLY_COMMAND]; - uint16_t file_count = card.get_num_Files(); - for (uint16_t i = 0; i < file_count; i++) { - card.selectFileByIndex(i); - sprintf_P(message_buffer, card.flag.filenameIsDir ? PSTR("{DIR:%s}") : PSTR("{FILE:%s}"), card.longest_filename()); - write_to_lcd(message_buffer); - } - - write_to_lcd_P(PSTR("{SYS:OK}")); - #endif - } break; - - default: DEBUG_ECHOLNPAIR("UNKNOWN S COMMAND ", command); - } -} - -/** - * Receive a curly brace command and translate to G-code. - * Currently {E:0} is not handled. Its function is unknown, - * but it occurs during the temp window after a sys build. - */ -void process_lcd_command(const char* command) { - const char *current = command; - - byte command_code = *current++; - if (*current == ':') { - - current++; // skip the : - - switch (command_code) { - case 'S': process_lcd_s_command(current); break; - case 'J': process_lcd_j_command(current); break; - case 'P': process_lcd_p_command(current); break; - case 'C': process_lcd_c_command(current); break; - case 'B': - case 'E': process_lcd_eb_command(current); break; - default: DEBUG_ECHOLNPAIR("UNKNOWN COMMAND ", command); - } - } - else - DEBUG_ECHOLNPAIR("UNKNOWN COMMAND FORMAT ", command); -} - -// -// Parse LCD commands mixed with G-Code -// -void parse_lcd_byte(const byte b) { - static char inbound_buffer[MAX_CURLY_COMMAND]; - - static uint8_t parsing = 0; // Parsing state - static bool prevcr = false; // Was the last c a CR? - - const char c = b & 0x7F; - - if (parsing) { - const bool is_lcd = parsing == 1; // 1 for LCD - if ( ( is_lcd && c == '}') // Closing brace on LCD command - || (!is_lcd && c == '\n') // LF on a G-code command - ) { - inbound_buffer[inbound_count] = '\0'; // Reset before processing - inbound_count = 0; // Reset buffer index - if (parsing == 1) - process_lcd_command(inbound_buffer); // Handle the LCD command - else - queue.enqueue_one_now(inbound_buffer); // Handle the G-code command - parsing = 0; // Unflag and... - } - else if (inbound_count < MAX_CURLY_COMMAND - 2) - inbound_buffer[inbound_count++] = is_lcd ? c : b; // Buffer while space remains - } - else { - if (c == '{') parsing = 1; // Brace opens an LCD command - else if (prevcr && c == '\n') parsing = 2; // CRLF indicates G-code - prevcr = (c == '\r'); // Remember if it was a CR - } -} - -/** - * UC means connected. - * UD means disconnected - * The stock firmware considers USB initialized as "connected." - */ -void update_usb_status(const bool forceUpdate) { - static bool last_usb_connected_status = false; - // This is mildly different than stock, which - // appears to use the usb discovery status. - // This is more logical. - if (last_usb_connected_status != MYSERIAL0 || forceUpdate) { - last_usb_connected_status = MYSERIAL0; - write_to_lcd_P(last_usb_connected_status ? PSTR("{R:UC}\r\n") : PSTR("{R:UD}\r\n")); - } -} - -namespace ExtUI { - void onStartup() { - /** - * The Malyan LCD actually runs as a separate MCU on Serial 1. - * This code's job is to siphon the weird curly-brace commands from - * it and translate into ExtUI operations where possible. - */ - inbound_count = 0; - - #ifndef LCD_BAUDRATE - #define LCD_BAUDRATE 500000 - #endif - LCD_SERIAL.begin(LCD_BAUDRATE); - - // Signal init - write_to_lcd_P(PSTR("{SYS:STARTED}\r\n")); - - // send a version that says "unsupported" - write_to_lcd_P(PSTR("{VER:99}\r\n")); - - // No idea why it does this twice. - write_to_lcd_P(PSTR("{SYS:STARTED}\r\n")); - update_usb_status(true); - } - - void onIdle() { - /** - * - from printer on startup: - * {SYS:STARTED}{VER:29}{SYS:STARTED}{R:UD} - */ - - // First report USB status. - update_usb_status(false); - - // now drain commands... - while (LCD_SERIAL.available()) - parse_lcd_byte((byte)LCD_SERIAL.read()); - - #if ENABLED(SDSUPPORT) - // The way last printing status works is simple: - // The UI needs to see at least one TQ which is not 100% - // and then when the print is complete, one which is. - static uint8_t last_percent_done = 100; - - // If there was a print in progress, we need to emit the final - // print status as {TQ:100}. Reset last percent done so a new print will - // issue a percent of 0. - const uint8_t percent_done = (ExtUI::isPrinting() || ExtUI::isPrintingFromMediaPaused()) ? ExtUI::getProgress_percent() : last_printing_status ? 100 : 0; - if (percent_done != last_percent_done) { - char message_buffer[16]; - sprintf_P(message_buffer, PSTR("{TQ:%03i}"), percent_done); - write_to_lcd(message_buffer); - last_percent_done = percent_done; - last_printing_status = ExtUI::isPrinting(); - } - #endif - } - - void onPrinterKilled(PGM_P const error, PGM_P const component) { - set_lcd_error_P(error, component); - } - - #if HAS_PID_HEATING - - void onPidTuning(const result_t rst) { - // Called for temperature PID tuning result - //SERIAL_ECHOLNPAIR("OnPidTuning:", rst); - switch (rst) { - case PID_BAD_EXTRUDER_NUM: - set_lcd_error_P(GET_TEXT(MSG_PID_BAD_EXTRUDER_NUM)); - break; - case PID_TEMP_TOO_HIGH: - set_lcd_error_P(GET_TEXT(MSG_PID_TEMP_TOO_HIGH)); - break; - case PID_TUNING_TIMEOUT: - set_lcd_error_P(GET_TEXT(MSG_PID_TIMEOUT)); - break; - case PID_DONE: - set_lcd_error_P(GET_TEXT(MSG_PID_AUTOTUNE_DONE)); - break; - } - } - - #endif - - void onPrintTimerStarted() { write_to_lcd_P(PSTR("{SYS:BUILD}")); } - void onPrintTimerPaused() {} - void onPrintTimerStopped() { write_to_lcd_P(PSTR("{TQ:100}")); } - - // Not needed for Malyan LCD - void onStatusChanged(const char * const) {} - void onMediaInserted() {}; - void onMediaError() {}; - void onMediaRemoved() {}; - void onPlayTone(const uint16_t, const uint16_t) {} - void onFilamentRunout(const extruder_t extruder) {} - void onUserConfirmRequired(const char * const) {} - void onFactoryReset() {} - void onStoreSettings(char*) {} - void onLoadSettings(const char*) {} - void onConfigurationStoreWritten(bool) {} - void onConfigurationStoreRead(bool) {} - - #if HAS_MESH - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) {} - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - void onPowerLossResume() {} - #endif -} - -#endif // MALYAN_LCD diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp deleted file mode 100644 index 30cf696f3e..0000000000 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ /dev/null @@ -1,1072 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/************** - * ui_api.cpp * - **************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(EXTENSIBLE_UI) - -#include "../ultralcd.h" -#include "../../gcode/queue.h" -#include "../../module/motion.h" -#include "../../module/planner.h" -#include "../../module/probe.h" -#include "../../module/temperature.h" -#include "../../module/printcounter.h" -#include "../../libs/duration_t.h" -#include "../../HAL/shared/Delay.h" -#include "../../sd/cardreader.h" - -#if ENABLED(PRINTCOUNTER) - #include "../../core/utility.h" - #include "../../libs/numtostr.h" -#endif - -#if HAS_MULTI_EXTRUDER - #include "../../module/tool_change.h" -#endif - -#if ENABLED(EMERGENCY_PARSER) - #include "../../feature/e_parser.h" -#endif - -#if HAS_TRINAMIC_CONFIG - #include "../../feature/tmc_util.h" - #include "../../module/stepper/indirection.h" -#endif - -#include "ui_api.h" - -#if ENABLED(BACKLASH_GCODE) - #include "../../feature/backlash.h" -#endif - -#if HAS_LEVELING - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#if HAS_FILAMENT_SENSOR - #include "../../feature/runout.h" -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) - #include "../../feature/caselight.h" -#endif - -#if ENABLED(BABYSTEPPING) - #include "../../feature/babystep.h" -#endif - -#if ENABLED(HOST_PROMPT_SUPPORT) - #include "../../feature/host_actions.h" -#endif - -namespace ExtUI { - static struct { - uint8_t printer_killed : 1; - TERN_(JOYSTICK, uint8_t jogging : 1); - TERN_(SDSUPPORT, uint8_t was_sd_printing : 1); - } flags; - - #ifdef __SAM3X8E__ - /** - * Implement a special millis() to allow time measurement - * within an ISR (such as when the printer is killed). - * - * To keep proper time, must be called at least every 1s. - */ - uint32_t safe_millis() { - // Not killed? Just call millis() - if (!flags.printer_killed) return millis(); - - static uint32_t currTimeHI = 0; /* Current time */ - - // Machine was killed, reinit SysTick so we are able to compute time without ISRs - if (currTimeHI == 0) { - // Get the last time the Arduino time computed (from CMSIS) and convert it to SysTick - currTimeHI = (uint32_t)((GetTickCount() * (uint64_t)(F_CPU / 8000)) >> 24); - - // Reinit the SysTick timer to maximize its period - SysTick->LOAD = SysTick_LOAD_RELOAD_Msk; // get the full range for the systick timer - SysTick->VAL = 0; // Load the SysTick Counter Value - SysTick->CTRL = // MCLK/8 as source - // No interrupts - SysTick_CTRL_ENABLE_Msk; // Enable SysTick Timer - } - - // Check if there was a timer overflow from the last read - if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) { - // There was. This means (SysTick_LOAD_RELOAD_Msk * 1000 * 8)/F_CPU ms has elapsed - currTimeHI++; - } - - // Calculate current time in milliseconds - uint32_t currTimeLO = SysTick_LOAD_RELOAD_Msk - SysTick->VAL; // (in MCLK/8) - uint64_t currTime = ((uint64_t)currTimeLO) | (((uint64_t)currTimeHI) << 24); - - // The ms count is - return (uint32_t)(currTime / (F_CPU / 8000)); - } - #endif // __SAM3X8E__ - - void delay_us(unsigned long us) { DELAY_US(us); } - - void delay_ms(unsigned long ms) { - if (flags.printer_killed) - DELAY_US(ms * 1000); - else - safe_delay(ms); - } - - void yield() { - if (!flags.printer_killed) thermalManager.manage_heater(); - } - - void enableHeater(const extruder_t extruder) { - #if HAS_HOTEND && HEATER_IDLE_HANDLER - thermalManager.reset_hotend_idle_timer(extruder - E0); - #else - UNUSED(extruder); - #endif - } - - void enableHeater(const heater_t heater) { - #if HEATER_IDLE_HANDLER - switch (heater) { - #if HAS_HEATED_BED - case BED: thermalManager.reset_bed_idle_timer(); return; - #endif - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return); // Chamber has no idle timer - default: - TERN_(HAS_HOTEND, thermalManager.reset_hotend_idle_timer(heater - H0)); - break; - } - #else - UNUSED(heater); - #endif - } - - #if ENABLED(JOYSTICK) - /** - * Jogs in the direction given by the vector (dx, dy, dz). - * The values range from -1 to 1 mapping to the maximum - * feedrate for an axis. - * - * The axis will continue to jog until this function is - * called with all zeros. - */ - void jog(const xyz_float_t &dir) { - // The "destination" variable is used as a scratchpad in - // Marlin by GCODE routines, but should remain untouched - // during manual jogging, allowing us to reuse the space - // for our direction vector. - destination = dir; - flags.jogging = !NEAR_ZERO(dir.x) || !NEAR_ZERO(dir.y) || !NEAR_ZERO(dir.z); - } - - // Called by the polling routine in "joystick.cpp" - void _joystick_update(xyz_float_t &norm_jog) { - if (flags.jogging) { - #define OUT_OF_RANGE(VALUE) (VALUE < -1.0f || VALUE > 1.0f) - - if (OUT_OF_RANGE(destination.x) || OUT_OF_RANGE(destination.y) || OUT_OF_RANGE(destination.z)) { - // If destination on any axis is out of range, it - // probably means the UI forgot to stop jogging and - // ran GCODE that wrote a position to destination. - // To prevent a disaster, stop jogging. - flags.jogging = false; - return; - } - norm_jog = destination; - } - } - #endif - - bool isHeaterIdle(const extruder_t extruder) { - #if HAS_HOTEND && HEATER_IDLE_HANDLER - return thermalManager.heater_idle[extruder - E0].timed_out; - #else - UNUSED(extruder); - return false; - #endif - } - - bool isHeaterIdle(const heater_t heater) { - #if HEATER_IDLE_HANDLER - switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out); - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return false); // Chamber has no idle timer - default: - return TERN0(HAS_HOTEND, thermalManager.heater_idle[heater - H0].timed_out); - } - #else - UNUSED(heater); - return false; - #endif - } - - #ifdef TOUCH_UI_LCD_TEMP_SCALING - #define GET_TEMP_ADJUSTMENT(A) float(A)/TOUCH_UI_LCD_TEMP_SCALING - #else - #define GET_TEMP_ADJUSTMENT(A) A - #endif - - float getActualTemp_celsius(const heater_t heater) { - switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degBed())); - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degChamber())); - default: return GET_TEMP_ADJUSTMENT(thermalManager.degHotend(heater - H0)); - } - } - - float getActualTemp_celsius(const extruder_t extruder) { - return GET_TEMP_ADJUSTMENT(thermalManager.degHotend(extruder - E0)); - } - - float getTargetTemp_celsius(const heater_t heater) { - switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetBed())); - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetChamber())); - default: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetHotend(heater - H0)); - } - } - - float getTargetTemp_celsius(const extruder_t extruder) { - return GET_TEMP_ADJUSTMENT(thermalManager.degTargetHotend(extruder - E0)); - } - - float getTargetFan_percent(const fan_t fan) { - #if HAS_FAN - return thermalManager.fanPercent(thermalManager.fan_speed[fan - FAN0]); - #else - UNUSED(fan); - return 0; - #endif - } - - float getActualFan_percent(const fan_t fan) { - #if HAS_FAN - return thermalManager.fanPercent(thermalManager.scaledFanSpeed(fan - FAN0)); - #else - UNUSED(fan); - return 0; - #endif - } - - float getAxisPosition_mm(const axis_t axis) { - return TERN_(JOYSTICK, flags.jogging ? destination[axis] :) current_position[axis]; - } - - float getAxisPosition_mm(const extruder_t extruder) { - const extruder_t old_tool = getActiveTool(); - setActiveTool(extruder, true); - const float epos = TERN_(JOYSTICK, flags.jogging ? destination.e :) current_position.e; - setActiveTool(old_tool, true); - return epos; - } - - void setAxisPosition_mm(const float position, const axis_t axis, const feedRate_t feedrate/*=0*/) { - // Get motion limit from software endstops, if any - float min, max; - soft_endstop.get_manual_axis_limits((AxisEnum)axis, min, max); - - // Delta limits XY based on the current offset from center - // This assumes the center is 0,0 - #if ENABLED(DELTA) - if (axis != Z) { - max = SQRT(sq(float(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y - axis])); // (Y - axis) == the other axis - min = -max; - } - #endif - - current_position[axis] = constrain(position, min, max); - line_to_current_position(feedrate ?: manual_feedrate_mm_s[axis]); - } - - void setAxisPosition_mm(const float position, const extruder_t extruder, const feedRate_t feedrate/*=0*/) { - setActiveTool(extruder, true); - - current_position.e = position; - line_to_current_position(feedrate ?: manual_feedrate_mm_s.e); - } - - void setActiveTool(const extruder_t extruder, bool no_move) { - #if HAS_MULTI_EXTRUDER - const uint8_t e = extruder - E0; - if (e != active_extruder) tool_change(e, no_move); - active_extruder = e; - #else - UNUSED(extruder); - UNUSED(no_move); - #endif - } - - extruder_t getActiveTool() { - switch (active_extruder) { - case 5: return E5; - case 4: return E4; - case 3: return E3; - case 2: return E2; - case 1: return E1; - default: return E0; - } - } - - bool isMoving() { return planner.has_blocks_queued(); } - - bool canMove(const axis_t axis) { - switch (axis) { - #if IS_KINEMATIC || ENABLED(NO_MOTION_BEFORE_HOMING) - case X: return TEST(axis_homed, X_AXIS); - case Y: return TEST(axis_homed, Y_AXIS); - case Z: return TEST(axis_homed, Z_AXIS); - #else - case X: case Y: case Z: return true; - #endif - default: return false; - } - } - - bool canMove(const extruder_t extruder) { - return !thermalManager.tooColdToExtrude(extruder - E0); - } - - #if HAS_SOFTWARE_ENDSTOPS - bool getSoftEndstopState() { return soft_endstop._enabled; } - void setSoftEndstopState(const bool value) { soft_endstop._enabled = value; } - #endif - - #if HAS_TRINAMIC_CONFIG - float getAxisCurrent_mA(const axis_t axis) { - switch (axis) { - #if AXIS_IS_TMC(X) - case X: return stepperX.getMilliamps(); - #endif - #if AXIS_IS_TMC(X2) - case X2: return stepperX2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y) - case Y: return stepperY.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y2) - case Y2: return stepperY2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z) - case Z: return stepperZ.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z2) - case Z2: return stepperZ2.getMilliamps(); - #endif - default: return NAN; - }; - } - - float getAxisCurrent_mA(const extruder_t extruder) { - switch (extruder) { - #if AXIS_IS_TMC(E0) - case E0: return stepperE0.getMilliamps(); - #endif - #if AXIS_IS_TMC(E1) - case E1: return stepperE1.getMilliamps(); - #endif - #if AXIS_IS_TMC(E2) - case E2: return stepperE2.getMilliamps(); - #endif - #if AXIS_IS_TMC(E3) - case E3: return stepperE3.getMilliamps(); - #endif - #if AXIS_IS_TMC(E4) - case E4: return stepperE4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E5) - case E5: return stepperE5.getMilliamps(); - #endif - #if AXIS_IS_TMC(E6) - case E6: return stepperE6.getMilliamps(); - #endif - #if AXIS_IS_TMC(E7) - case E7: return stepperE7.getMilliamps(); - #endif - default: return NAN; - }; - } - - void setAxisCurrent_mA(const float mA, const axis_t axis) { - switch (axis) { - #if AXIS_IS_TMC(X) - case X: stepperX.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(X2) - case X2: stepperX2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Y) - case Y: stepperY.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Y2) - case Y2: stepperY2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z) - case Z: stepperZ.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z2) - case Z2: stepperZ2.rms_current(constrain(mA, 400, 1500)); break; - #endif - default: break; - }; - } - - void setAxisCurrent_mA(const float mA, const extruder_t extruder) { - switch (extruder) { - #if AXIS_IS_TMC(E0) - case E0: stepperE0.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E1) - case E1: stepperE1.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E2) - case E2: stepperE2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E3) - case E3: stepperE3.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E4) - case E4: stepperE4.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E5) - case E5: stepperE5.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E6) - case E6: stepperE6.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E7) - case E7: stepperE7.rms_current(constrain(mA, 400, 1500)); break; - #endif - default: break; - }; - } - - int getTMCBumpSensitivity(const axis_t axis) { - switch (axis) { - TERN_(X_SENSORLESS, case X: return stepperX.homing_threshold()); - TERN_(X2_SENSORLESS, case X2: return stepperX2.homing_threshold()); - TERN_(Y_SENSORLESS, case Y: return stepperY.homing_threshold()); - TERN_(Y2_SENSORLESS, case Y2: return stepperY2.homing_threshold()); - TERN_(Z_SENSORLESS, case Z: return stepperZ.homing_threshold()); - TERN_(Z2_SENSORLESS, case Z2: return stepperZ2.homing_threshold()); - TERN_(Z3_SENSORLESS, case Z3: return stepperZ3.homing_threshold()); - TERN_(Z4_SENSORLESS, case Z4: return stepperZ4.homing_threshold()); - default: return 0; - } - } - - void setTMCBumpSensitivity(const float value, const axis_t axis) { - switch (axis) { - #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS - #if X_SENSORLESS - case X: stepperX.homing_threshold(value); break; - #endif - #if X2_SENSORLESS - case X2: stepperX2.homing_threshold(value); break; - #endif - #if Y_SENSORLESS - case Y: stepperY.homing_threshold(value); break; - #endif - #if Y2_SENSORLESS - case Y2: stepperY2.homing_threshold(value); break; - #endif - #if Z_SENSORLESS - case Z: stepperZ.homing_threshold(value); break; - #endif - #if Z2_SENSORLESS - case Z2: stepperZ2.homing_threshold(value); break; - #endif - #if Z3_SENSORLESS - case Z3: stepperZ3.homing_threshold(value); break; - #endif - #if Z4_SENSORLESS - case Z4: stepperZ4.homing_threshold(value); break; - #endif - #else - UNUSED(value); - #endif - default: break; - } - } - #endif - - float getAxisSteps_per_mm(const axis_t axis) { - return planner.settings.axis_steps_per_mm[axis]; - } - - float getAxisSteps_per_mm(const extruder_t extruder) { - UNUSED_E(extruder); - return planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)]; - } - - void setAxisSteps_per_mm(const float value, const axis_t axis) { - planner.settings.axis_steps_per_mm[axis] = value; - planner.refresh_positioning(); - } - - void setAxisSteps_per_mm(const float value, const extruder_t extruder) { - UNUSED_E(extruder); - planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)] = value; - planner.refresh_positioning(); - } - - feedRate_t getAxisMaxFeedrate_mm_s(const axis_t axis) { - return planner.settings.max_feedrate_mm_s[axis]; - } - - feedRate_t getAxisMaxFeedrate_mm_s(const extruder_t extruder) { - UNUSED_E(extruder); - return planner.settings.max_feedrate_mm_s[E_AXIS_N(extruder - E0)]; - } - - void setAxisMaxFeedrate_mm_s(const feedRate_t value, const axis_t axis) { - planner.set_max_feedrate(axis, value); - } - - void setAxisMaxFeedrate_mm_s(const feedRate_t value, const extruder_t extruder) { - UNUSED_E(extruder); - planner.set_max_feedrate(E_AXIS_N(extruder - E0), value); - } - - float getAxisMaxAcceleration_mm_s2(const axis_t axis) { - return planner.settings.max_acceleration_mm_per_s2[axis]; - } - - float getAxisMaxAcceleration_mm_s2(const extruder_t extruder) { - UNUSED_E(extruder); - return planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(extruder - E0)]; - } - - void setAxisMaxAcceleration_mm_s2(const float value, const axis_t axis) { - planner.set_max_acceleration(axis, value); - planner.reset_acceleration_rates(); - } - - void setAxisMaxAcceleration_mm_s2(const float value, const extruder_t extruder) { - UNUSED_E(extruder); - planner.set_max_acceleration(E_AXIS_N(extruder - E0), value); - planner.reset_acceleration_rates(); - } - - #if HAS_FILAMENT_SENSOR - bool getFilamentRunoutEnabled() { return runout.enabled; } - void setFilamentRunoutEnabled(const bool value) { runout.enabled = value; } - bool getFilamentRunoutState() { return runout.filament_ran_out; } - void setFilamentRunoutState(const bool value) { runout.filament_ran_out = value; } - - #if HAS_FILAMENT_RUNOUT_DISTANCE - float getFilamentRunoutDistance_mm() { return runout.runout_distance(); } - void setFilamentRunoutDistance_mm(const float value) { runout.set_runout_distance(constrain(value, 0, 999)); } - #endif - #endif - - #if ENABLED(CASE_LIGHT_ENABLE) - bool getCaseLightState() { return caselight.on; } - void setCaseLightState(const bool value) { - caselight.on = value; - caselight.update_enabled(); - } - - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - float getCaseLightBrightness_percent() { return ui8_to_percent(caselight.brightness); } - void setCaseLightBrightness_percent(const float value) { - caselight.brightness = map(constrain(value, 0, 100), 0, 100, 0, 255); - caselight.update_brightness(); - } - #endif - #endif - - #if ENABLED(LIN_ADVANCE) - float getLinearAdvance_mm_mm_s(const extruder_t extruder) { - return (extruder < EXTRUDERS) ? planner.extruder_advance_K[extruder - E0] : 0; - } - - void setLinearAdvance_mm_mm_s(const float value, const extruder_t extruder) { - if (extruder < EXTRUDERS) - planner.extruder_advance_K[extruder - E0] = constrain(value, 0, 999); - } - #endif - - #if HAS_JUNCTION_DEVIATION - - float getJunctionDeviation_mm() { - return planner.junction_deviation_mm; - } - - void setJunctionDeviation_mm(const float value) { - planner.junction_deviation_mm = constrain(value, 0.001, 0.3); - TERN_(LIN_ADVANCE, planner.recalculate_max_e_jerk()); - } - - #else - - float getAxisMaxJerk_mm_s(const axis_t axis) { - return planner.max_jerk[axis]; - } - - float getAxisMaxJerk_mm_s(const extruder_t) { - return planner.max_jerk.e; - } - - void setAxisMaxJerk_mm_s(const float value, const axis_t axis) { - planner.set_max_jerk((AxisEnum)axis, value); - } - - void setAxisMaxJerk_mm_s(const float value, const extruder_t) { - planner.set_max_jerk(E_AXIS, value); - } - #endif - - feedRate_t getFeedrate_mm_s() { return feedrate_mm_s; } - int16_t getFlowPercentage(const extruder_t extr) { return planner.flow_percentage[extr]; } - feedRate_t getMinFeedrate_mm_s() { return planner.settings.min_feedrate_mm_s; } - feedRate_t getMinTravelFeedrate_mm_s() { return planner.settings.min_travel_feedrate_mm_s; } - float getPrintingAcceleration_mm_s2() { return planner.settings.acceleration; } - float getRetractAcceleration_mm_s2() { return planner.settings.retract_acceleration; } - float getTravelAcceleration_mm_s2() { return planner.settings.travel_acceleration; } - void setFeedrate_mm_s(const feedRate_t fr) { feedrate_mm_s = fr; } - void setFlow_percent(const int16_t flow, const extruder_t extr) { planner.set_flow(extr, flow); } - void setMinFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_feedrate_mm_s = fr; } - void setMinTravelFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_travel_feedrate_mm_s = fr; } - void setPrintingAcceleration_mm_s2(const float acc) { planner.settings.acceleration = acc; } - void setRetractAcceleration_mm_s2(const float acc) { planner.settings.retract_acceleration = acc; } - void setTravelAcceleration_mm_s2(const float acc) { planner.settings.travel_acceleration = acc; } - - #if ENABLED(BABYSTEPPING) - bool babystepAxis_steps(const int16_t steps, const axis_t axis) { - switch (axis) { - #if ENABLED(BABYSTEP_XY) - case X: babystep.add_steps(X_AXIS, steps); break; - case Y: babystep.add_steps(Y_AXIS, steps); break; - #endif - case Z: babystep.add_steps(Z_AXIS, steps); break; - default: return false; - }; - return true; - } - - /** - * This function adjusts an axis during a print. - * - * When linked_nozzles is false, each nozzle in a multi-nozzle - * printer can be babystepped independently of the others. This - * lets the user to fine tune the Z-offset and Nozzle Offsets - * while observing the first layer of a print, regardless of - * what nozzle is printing. - */ - void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles) { - const float mm = steps * planner.steps_to_mm[axis]; - UNUSED(mm); - - if (!babystepAxis_steps(steps, axis)) return; - - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - // Make it so babystepping in Z adjusts the Z probe offset. - if (axis == Z && TERN1(HAS_MULTI_EXTRUDER, (linked_nozzles || active_extruder == 0))) - probe.offset.z += mm; - #endif - - #if HAS_MULTI_EXTRUDER && HAS_HOTEND_OFFSET - /** - * When linked_nozzles is false, as an axis is babystepped - * adjust the hotend offsets so that the other nozzles are - * unaffected by the babystepping of the active nozzle. - */ - if (!linked_nozzles) { - HOTEND_LOOP() - if (e != active_extruder) - hotend_offset[e][axis] += mm; - - normalizeNozzleOffset(X); - normalizeNozzleOffset(Y); - normalizeNozzleOffset(Z); - } - #else - UNUSED(linked_nozzles); - #endif - } - - /** - * Converts a mm displacement to a number of whole number of - * steps that is at least mm long. - */ - int16_t mmToWholeSteps(const float mm, const axis_t axis) { - const float steps = mm / planner.steps_to_mm[axis]; - return steps > 0 ? CEIL(steps) : FLOOR(steps); - } - #endif - - float getZOffset_mm() { - return (0.0f - #if HAS_BED_PROBE - + probe.offset.z - #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) - + planner.steps_to_mm[Z_AXIS] * babystep.axis_total[BS_AXIS_IND(Z_AXIS)] - #endif - ); - } - - void setZOffset_mm(const float value) { - #if HAS_BED_PROBE - if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) - probe.offset.z = value; - #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) - babystep.add_mm(Z_AXIS, value - getZOffset_mm()); - #else - UNUSED(value); - #endif - } - - #if HAS_HOTEND_OFFSET - - float getNozzleOffset_mm(const axis_t axis, const extruder_t extruder) { - if (extruder - E0 >= HOTENDS) return 0; - return hotend_offset[extruder - E0][axis]; - } - - void setNozzleOffset_mm(const float value, const axis_t axis, const extruder_t extruder) { - if (extruder - E0 >= HOTENDS) return; - hotend_offset[extruder - E0][axis] = value; - } - - /** - * The UI should call this if needs to guarantee the first - * nozzle offset is zero (such as when it doesn't allow the - * user to edit the offset the first nozzle). - */ - void normalizeNozzleOffset(const axis_t axis) { - const float offs = hotend_offset[0][axis]; - HOTEND_LOOP() hotend_offset[e][axis] -= offs; - } - - #endif // HAS_HOTEND_OFFSET - - #if HAS_BED_PROBE - float getProbeOffset_mm(const axis_t axis) { - return probe.offset.pos[axis]; - } - void setProbeOffset_mm(const float val, const axis_t axis) { - probe.offset.pos[axis] = val; - } - #endif - - #if ENABLED(BACKLASH_GCODE) - float getAxisBacklash_mm(const axis_t axis) { return backlash.distance_mm[axis]; } - void setAxisBacklash_mm(const float value, const axis_t axis) - { backlash.distance_mm[axis] = constrain(value,0,5); } - - float getBacklashCorrection_percent() { return ui8_to_percent(backlash.correction); } - void setBacklashCorrection_percent(const float value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } - - #ifdef BACKLASH_SMOOTHING_MM - float getBacklashSmoothing_mm() { return backlash.smoothing_mm; } - void setBacklashSmoothing_mm(const float value) { backlash.smoothing_mm = constrain(value, 0, 999); } - #endif - #endif - - uint8_t getProgress_percent() { - return ui.get_progress_percent(); - } - - uint32_t getProgress_seconds_elapsed() { - const duration_t elapsed = print_job_timer.duration(); - return elapsed.value; - } - - #if HAS_LEVELING - bool getLevelingActive() { return planner.leveling_active; } - void setLevelingActive(const bool state) { set_bed_leveling_enabled(state); } - bool getMeshValid() { return leveling_is_valid(); } - #if HAS_MESH - bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; } - float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); } - void setMeshPoint(const xy_uint8_t &pos, const float zoff) { - if (WITHIN(pos.x, 0, GRID_MAX_POINTS_X) && WITHIN(pos.y, 0, GRID_MAX_POINTS_Y)) { - Z_VALUES(pos.x, pos.y) = zoff; - TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); - } - } - #endif - #endif - - #if ENABLED(HOST_PROMPT_SUPPORT) - void setHostResponse(const uint8_t response) { host_response_handler(response); } - #endif - - #if ENABLED(PRINTCOUNTER) - char* getTotalPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().totalPrints)); return buffer; } - char* getFinishedPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().finishedPrints)); return buffer; } - char* getTotalPrintTime_str(char buffer[21]) { return duration_t(print_job_timer.getStats().printTime).toString(buffer); } - char* getLongestPrint_str(char buffer[21]) { return duration_t(print_job_timer.getStats().longestPrint).toString(buffer); } - char* getFilamentUsed_str(char buffer[21]) { - printStatistics stats = print_job_timer.getStats(); - sprintf_P(buffer, PSTR("%ld.%im"), long(stats.filamentUsed / 1000), int16_t(stats.filamentUsed / 100) % 10); - return buffer; - } - #endif - - float getFeedrate_percent() { return feedrate_percentage; } - - #if ENABLED(PIDTEMP) - float getPIDValues_Kp(const extruder_t tool) { return PID_PARAM(Kp, tool); } - float getPIDValues_Ki(const extruder_t tool) { return unscalePID_i(PID_PARAM(Ki, tool)); } - float getPIDValues_Kd(const extruder_t tool) { return unscalePID_d(PID_PARAM(Kd, tool)); } - - void setPIDValues(const float p, const float i, const float d, extruder_t tool) { - thermalManager.temp_hotend[tool].pid.Kp = p; - thermalManager.temp_hotend[tool].pid.Ki = scalePID_i(i); - thermalManager.temp_hotend[tool].pid.Kd = scalePID_d(d); - thermalManager.updatePID(); - } - - void startPIDTune(const float temp, extruder_t tool) { - thermalManager.PID_autotune(temp, (heater_id_t)tool, 8, true); - } - #endif - - #if ENABLED(PIDTEMPBED) - float getBedPIDValues_Kp() { return thermalManager.temp_bed.pid.Kp; } - float getBedPIDValues_Ki() { return unscalePID_i(thermalManager.temp_bed.pid.Ki); } - float getBedPIDValues_Kd() { return unscalePID_d(thermalManager.temp_bed.pid.Kd); } - - void setBedPIDValues(const float p, const float i, const float d) { - thermalManager.temp_bed.pid.Kp = p; - thermalManager.temp_bed.pid.Ki = scalePID_i(i); - thermalManager.temp_bed.pid.Kd = scalePID_d(d); - thermalManager.updatePID(); - } - - void startBedPIDTune(const float temp) { - thermalManager.PID_autotune(temp, H_BED, 4, true); - } - #endif - - void injectCommands_P(PGM_P const gcode) { queue.inject_P(gcode); } - void injectCommands(char * const gcode) { queue.inject(gcode); } - - bool commandsInQueue() { return (planner.movesplanned() || queue.has_commands_queued()); } - - bool isAxisPositionKnown(const axis_t axis) { return TEST(axis_known_position, axis); } - bool isAxisPositionKnown(const extruder_t) { return TEST(axis_known_position, E_AXIS); } - bool isPositionKnown() { return all_axes_known(); } - bool isMachineHomed() { return all_axes_homed(); } - - PGM_P getFirmwareName_str() { - static PGMSTR(firmware_name, "Marlin " SHORT_BUILD_VERSION); - return firmware_name; - } - - void setTargetTemp_celsius(float value, const heater_t heater) { - #ifdef TOUCH_UI_LCD_TEMP_SCALING - value *= TOUCH_UI_LCD_TEMP_SCALING; - #endif - enableHeater(heater); - #if HAS_HEATED_CHAMBER - if (heater == CHAMBER) - thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAXTEMP - 10))); - else - #endif - #if HAS_HEATED_BED - if (heater == BED) - thermalManager.setTargetBed(LROUND(constrain(value, 0, BED_MAX_TARGET))); - else - #endif - { - #if HAS_HOTEND - const int16_t e = heater - H0; - thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); - #endif - } - } - - void setTargetTemp_celsius(float value, const extruder_t extruder) { - #ifdef TOUCH_UI_LCD_TEMP_SCALING - value *= TOUCH_UI_LCD_TEMP_SCALING; - #endif - #if HAS_HOTEND - const int16_t e = extruder - E0; - enableHeater(extruder); - thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); - #endif - } - - void setTargetFan_percent(const float value, const fan_t fan) { - #if HAS_FAN - if (fan < FAN_COUNT) - thermalManager.set_fan_speed(fan - FAN0, map(constrain(value, 0, 100), 0, 100, 0, 255)); - #else - UNUSED(value); - UNUSED(fan); - #endif - } - - void setFeedrate_percent(const float value) { - feedrate_percentage = constrain(value, 10, 500); - } - - void setUserConfirmed() { - TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); - } - - void printFile(const char *filename) { - UNUSED(filename); - IFSD(card.openAndPrintFile(filename), NOOP); - } - - bool isPrintingFromMediaPaused() { - return IFSD(isPrintingFromMedia() && !IS_SD_PRINTING(), false); - } - - bool isPrintingFromMedia() { - #if ENABLED(SDSUPPORT) - // Account for when IS_SD_PRINTING() reports the end of the - // print when there is still SD card data in the planner. - flags.was_sd_printing = card.isFileOpen() || (flags.was_sd_printing && commandsInQueue()); - return flags.was_sd_printing; - #else - return false; - #endif - } - - bool isPrinting() { - return (commandsInQueue() || isPrintingFromMedia() || IFSD(IS_SD_PRINTING(), false)); - } - - bool isMediaInserted() { - return IFSD(IS_SD_INSERTED() && card.isMounted(), false); - } - - void pausePrint() { ui.pause_print(); } - void resumePrint() { ui.resume_print(); } - void stopPrint() { ui.abort_print(); } - - void onUserConfirmRequired_P(PGM_P const pstr) { - char msg[strlen_P(pstr) + 1]; - strcpy_P(msg, pstr); - onUserConfirmRequired(msg); - } - - void onStatusChanged_P(PGM_P const pstr) { - char msg[strlen_P(pstr) + 1]; - strcpy_P(msg, pstr); - onStatusChanged(msg); - } - - FileList::FileList() { refresh(); } - - void FileList::refresh() { num_files = 0xFFFF; } - - bool FileList::seek(const uint16_t pos, const bool skip_range_check) { - #if ENABLED(SDSUPPORT) - if (!skip_range_check && (pos + 1) > count()) return false; - card.getfilename_sorted(SD_ORDER(pos, count())); - return card.filename[0] != '\0'; - #else - UNUSED(pos); - UNUSED(skip_range_check); - return false; - #endif - } - - const char* FileList::filename() { - return IFSD(card.longFilename[0] ? card.longFilename : card.filename, ""); - } - - const char* FileList::shortFilename() { - return IFSD(card.filename, ""); - } - - const char* FileList::longFilename() { - return IFSD(card.longFilename, ""); - } - - bool FileList::isDir() { - return IFSD(card.flag.filenameIsDir, false); - } - - uint16_t FileList::count() { - return IFSD((num_files = (num_files == 0xFFFF ? card.get_num_Files() : num_files)), 0); - } - - bool FileList::isAtRootDir() { - return IFSD(card.flag.workDirIsRoot, true); - } - - void FileList::upDir() { - #if ENABLED(SDSUPPORT) - card.cdup(); - num_files = 0xFFFF; - #endif - } - - void FileList::changeDir(const char * const dirname) { - #if ENABLED(SDSUPPORT) - card.cd(dirname); - num_files = 0xFFFF; - #else - UNUSED(dirname); - #endif - } - -} // namespace ExtUI - -// At the moment, we piggy-back off the ultralcd calls, but this could be cleaned up in the future - -void MarlinUI::init() { - ExtUI::onStartup(); -} - -void MarlinUI::update() { ExtUI::onIdle(); } - -void MarlinUI::kill_screen(PGM_P const error, PGM_P const component) { - using namespace ExtUI; - if (!flags.printer_killed) { - flags.printer_killed = true; - onPrinterKilled(error, component); - } -} - -#endif // EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h deleted file mode 100644 index 15122ec69e..0000000000 --- a/Marlin/src/lcd/extui/ui_api.h +++ /dev/null @@ -1,383 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/************ - * ui_api.h * - ************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#include "../../inc/MarlinConfig.h" - -namespace ExtUI { - - // The ExtUI implementation can store up to this many bytes - // in the EEPROM when the methods onStoreSettings and - // onLoadSettings are called. - - static constexpr size_t eeprom_data_size = 48; - - enum axis_t : uint8_t { X, Y, Z, X2, Y2, Z2, Z3, Z4 }; - enum extruder_t : uint8_t { E0, E1, E2, E3, E4, E5, E6, E7 }; - enum heater_t : uint8_t { H0, H1, H2, H3, H4, H5, BED, CHAMBER }; - enum fan_t : uint8_t { FAN0, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7 }; - enum result_t : uint8_t { PID_BAD_EXTRUDER_NUM, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, PID_DONE }; - - constexpr uint8_t extruderCount = EXTRUDERS; - constexpr uint8_t hotendCount = HOTENDS; - constexpr uint8_t fanCount = FAN_COUNT; - - #if HAS_MESH - typedef float bed_mesh_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - #endif - - bool isMoving(); - bool isAxisPositionKnown(const axis_t); - bool isAxisPositionKnown(const extruder_t); - bool isPositionKnown(); // Axis position guaranteed, steppers active since homing - bool isMachineHomed(); // Axis position most likely correct, steppers may have deactivated - bool canMove(const axis_t); - bool canMove(const extruder_t); - void injectCommands_P(PGM_P const); - void injectCommands(char * const); - bool commandsInQueue(); - - bool isHeaterIdle(const heater_t); - bool isHeaterIdle(const extruder_t); - void enableHeater(const heater_t); - void enableHeater(const extruder_t); - - #if ENABLED(JOYSTICK) - void jog(const xyz_float_t &dir); - void _joystick_update(xyz_float_t &norm_jog); - #endif - - /** - * Getters and setters - * Should be used by the EXTENSIBLE_UI to query or change Marlin's state. - */ - PGM_P getFirmwareName_str(); - - #if HAS_SOFTWARE_ENDSTOPS - bool getSoftEndstopState(); - void setSoftEndstopState(const bool); - #endif - - #if HAS_TRINAMIC_CONFIG - float getAxisCurrent_mA(const axis_t); - float getAxisCurrent_mA(const extruder_t); - void setAxisCurrent_mA(const float, const axis_t); - void setAxisCurrent_mA(const float, const extruder_t); - - int getTMCBumpSensitivity(const axis_t); - void setTMCBumpSensitivity(const float, const axis_t); - #endif - - float getActualTemp_celsius(const heater_t); - float getActualTemp_celsius(const extruder_t); - float getTargetTemp_celsius(const heater_t); - float getTargetTemp_celsius(const extruder_t); - float getTargetFan_percent(const fan_t); - float getActualFan_percent(const fan_t); - float getAxisPosition_mm(const axis_t); - float getAxisPosition_mm(const extruder_t); - float getAxisSteps_per_mm(const axis_t); - float getAxisSteps_per_mm(const extruder_t); - feedRate_t getAxisMaxFeedrate_mm_s(const axis_t); - feedRate_t getAxisMaxFeedrate_mm_s(const extruder_t); - float getAxisMaxAcceleration_mm_s2(const axis_t); - float getAxisMaxAcceleration_mm_s2(const extruder_t); - feedRate_t getMinFeedrate_mm_s(); - feedRate_t getMinTravelFeedrate_mm_s(); - float getPrintingAcceleration_mm_s2(); - float getRetractAcceleration_mm_s2(); - float getTravelAcceleration_mm_s2(); - float getFeedrate_percent(); - int16_t getFlowPercentage(const extruder_t); - uint8_t getProgress_percent(); - uint32_t getProgress_seconds_elapsed(); - - #if HAS_LEVELING - bool getLevelingActive(); - void setLevelingActive(const bool); - bool getMeshValid(); - #if HAS_MESH - bed_mesh_t& getMeshArray(); - float getMeshPoint(const xy_uint8_t &pos); - void setMeshPoint(const xy_uint8_t &pos, const float zval); - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval); - inline void onMeshUpdate(const xy_int8_t &pos, const float zval) { onMeshUpdate(pos.x, pos.y, zval); } - - typedef enum : unsigned char { - MESH_START, // Prior to start of probe - MESH_FINISH, // Following probe of all points - PROBE_START, // Beginning probe of grid location - PROBE_FINISH // Finished probe of grid location - } probe_state_t; - void onMeshUpdate(const int8_t xpos, const int8_t ypos, probe_state_t state); - inline void onMeshUpdate(const xy_int8_t &pos, probe_state_t state) { onMeshUpdate(pos.x, pos.y, state); } - #endif - #endif - - #if ENABLED(HOST_PROMPT_SUPPORT) - void setHostResponse(const uint8_t); - #endif - - #if ENABLED(PRINTCOUNTER) - char* getTotalPrints_str(char buffer[21]); - char* getFinishedPrints_str(char buffer[21]); - char* getTotalPrintTime_str(char buffer[21]); - char* getLongestPrint_str(char buffer[21]); - char* getFilamentUsed_str(char buffer[21]); - #endif - - void setTargetTemp_celsius(const float, const heater_t); - void setTargetTemp_celsius(const float, const extruder_t); - void setTargetFan_percent(const float, const fan_t); - void setAxisPosition_mm(const float, const axis_t, const feedRate_t=0); - void setAxisPosition_mm(const float, const extruder_t, const feedRate_t=0); - void setAxisSteps_per_mm(const float, const axis_t); - void setAxisSteps_per_mm(const float, const extruder_t); - void setAxisMaxFeedrate_mm_s(const feedRate_t, const axis_t); - void setAxisMaxFeedrate_mm_s(const feedRate_t, const extruder_t); - void setAxisMaxAcceleration_mm_s2(const float, const axis_t); - void setAxisMaxAcceleration_mm_s2(const float, const extruder_t); - void setFeedrate_mm_s(const feedRate_t); - void setMinFeedrate_mm_s(const feedRate_t); - void setMinTravelFeedrate_mm_s(const feedRate_t); - void setPrintingAcceleration_mm_s2(const float); - void setRetractAcceleration_mm_s2(const float); - void setTravelAcceleration_mm_s2(const float); - void setFeedrate_percent(const float); - void setFlow_percent(const int16_t, const extruder_t); - void setUserConfirmed(); - - #if ENABLED(LIN_ADVANCE) - float getLinearAdvance_mm_mm_s(const extruder_t); - void setLinearAdvance_mm_mm_s(const float, const extruder_t); - #endif - - #if HAS_JUNCTION_DEVIATION - float getJunctionDeviation_mm(); - void setJunctionDeviation_mm(const float); - #else - float getAxisMaxJerk_mm_s(const axis_t); - float getAxisMaxJerk_mm_s(const extruder_t); - void setAxisMaxJerk_mm_s(const float, const axis_t); - void setAxisMaxJerk_mm_s(const float, const extruder_t); - #endif - - extruder_t getActiveTool(); - void setActiveTool(const extruder_t, bool no_move); - - #if ENABLED(BABYSTEPPING) - int16_t mmToWholeSteps(const float mm, const axis_t axis); - - bool babystepAxis_steps(const int16_t steps, const axis_t axis); - void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles); - #endif - - #if HAS_HOTEND_OFFSET - float getNozzleOffset_mm(const axis_t, const extruder_t); - void setNozzleOffset_mm(const float, const axis_t, const extruder_t); - void normalizeNozzleOffset(const axis_t axis); - #endif - - float getZOffset_mm(); - void setZOffset_mm(const float); - - #if HAS_BED_PROBE - float getProbeOffset_mm(const axis_t); - void setProbeOffset_mm(const float, const axis_t); - #endif - - #if ENABLED(BACKLASH_GCODE) - float getAxisBacklash_mm(const axis_t); - void setAxisBacklash_mm(const float, const axis_t); - - float getBacklashCorrection_percent(); - void setBacklashCorrection_percent(const float); - - #ifdef BACKLASH_SMOOTHING_MM - float getBacklashSmoothing_mm(); - void setBacklashSmoothing_mm(const float); - #endif - #endif - - #if HAS_FILAMENT_SENSOR - bool getFilamentRunoutEnabled(); - void setFilamentRunoutEnabled(const bool); - bool getFilamentRunoutState(); - void setFilamentRunoutState(const bool); - - #if HAS_FILAMENT_RUNOUT_DISTANCE - float getFilamentRunoutDistance_mm(); - void setFilamentRunoutDistance_mm(const float); - #endif - #endif - - #if ENABLED(CASE_LIGHT_ENABLE) - bool getCaseLightState(); - void setCaseLightState(const bool); - - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - float getCaseLightBrightness_percent(); - void setCaseLightBrightness_percent(const float); - #endif - #endif - - #if ENABLED(PIDTEMP) - float getPIDValues_Kp(const extruder_t); - float getPIDValues_Ki(const extruder_t); - float getPIDValues_Kd(const extruder_t); - void setPIDValues(const float, const float, const float, extruder_t); - void startPIDTune(const float, extruder_t); - #endif - - #if ENABLED(PIDTEMPBED) - float getBedPIDValues_Kp(); - float getBedPIDValues_Ki(); - float getBedPIDValues_Kd(); - void setBedPIDValues(const float, const float, const float); - void startBedPIDTune(const float); - #endif - - /** - * Delay and timing routines - * Should be used by the EXTENSIBLE_UI to safely pause or measure time - * safe_millis must be called at least every 1 sec to guarantee time - * yield should be called within lengthy loops - */ - #ifdef __SAM3X8E__ - uint32_t safe_millis(); - #else - FORCE_INLINE uint32_t safe_millis() { return millis(); } // TODO: Implement for AVR - #endif - - void delay_us(unsigned long us); - void delay_ms(unsigned long ms); - void yield(); - - /** - * Media access routines - * - * Should be used by the EXTENSIBLE_UI to operate on files - */ - bool isMediaInserted(); - bool isPrintingFromMediaPaused(); - bool isPrintingFromMedia(); - bool isPrinting(); - - void printFile(const char *filename); - void stopPrint(); - void pausePrint(); - void resumePrint(); - - class FileList { - private: - uint16_t num_files; - - public: - FileList(); - void refresh(); - bool seek(const uint16_t, const bool skip_range_check = false); - - const char *longFilename(); - const char *shortFilename(); - const char *filename(); - bool isDir(); - - void changeDir(const char * const dirname); - void upDir(); - bool isAtRootDir(); - uint16_t count(); - }; - - /** - * Event callback routines - * - * Should be declared by EXTENSIBLE_UI and will be called by Marlin - */ - void onStartup(); - void onIdle(); - void onMediaInserted(); - void onMediaError(); - void onMediaRemoved(); - void onPlayTone(const uint16_t frequency, const uint16_t duration); - void onPrinterKilled(PGM_P const error, PGM_P const component); - void onPrintTimerStarted(); - void onPrintTimerPaused(); - void onPrintTimerStopped(); - void onFilamentRunout(const extruder_t extruder); - void onUserConfirmRequired(const char * const msg); - void onUserConfirmRequired_P(PGM_P const pstr); - void onStatusChanged(const char * const msg); - void onStatusChanged_P(PGM_P const pstr); - void onFactoryReset(); - void onStoreSettings(char *); - void onLoadSettings(const char *); - void onConfigurationStoreWritten(bool success); - void onConfigurationStoreRead(bool success); - #if ENABLED(POWER_LOSS_RECOVERY) - void onPowerLossResume(); - #endif - #if HAS_PID_HEATING - void onPidTuning(const result_t rst); - #endif -}; - -/** - * Helper macros to increment or decrement a value. For example: - * - * UI_INCREMENT_BY(TargetTemp_celsius, 10, E0) - * - * Expands to: - * - * setTargetTemp_celsius(getTargetTemp_celsius(E0) + 10, E0); - * - * Or, in the case where a constant increment is desired: - * - * constexpr float increment = 10; - * - * UI_INCREMENT(TargetTemp_celsius, E0) - */ -#define UI_INCREMENT_BY(method, inc, ...) ExtUI::set ## method(ExtUI::get ## method (__VA_ARGS__) + inc, ##__VA_ARGS__) -#define UI_DECREMENT_BY(method, inc, ...) ExtUI::set ## method(ExtUI::get ## method (__VA_ARGS__) - inc, ##__VA_ARGS__) - -#define UI_INCREMENT(method, ...) UI_INCREMENT_BY(method, increment, ##__VA_ARGS__) -#define UI_DECREMENT(method, ...) UI_DECREMENT_BY(method, increment, ##__VA_ARGS__) diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp index 5bf07e1bd4..08afb2ed8a 100644 --- a/Marlin/src/lcd/fontutils.cpp +++ b/Marlin/src/lcd/fontutils.cpp @@ -9,9 +9,9 @@ #include "../inc/MarlinConfig.h" -#if HAS_WIRED_LCD - #include "ultralcd.h" - #include "../MarlinCore.h" +#if ENABLED(ULTRA_LCD) +#include "ultralcd.h" +#include "../Marlin.h" #endif #include "fontutils.h" @@ -73,7 +73,7 @@ int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, return -1; } -/* This function gets the character at the pstart position, interpreting UTF8 multibyte sequences +/* This function gets the character at the pstart position, interpreting UTF8 multybyte sequences and returns the pointer to the next character */ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t *pval) { uint32_t val = 0; @@ -161,6 +161,7 @@ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t } static inline uint8_t utf8_strlen_cb(const char *pstart, read_byte_cb_t cb_read_byte) { + uint8_t cnt = 0; uint8_t *pnext = (uint8_t *)pstart; for (;;) { @@ -176,6 +177,7 @@ uint8_t utf8_strlen(const char *pstart) { return utf8_strlen_cb(pstart, read_byte_ram); } -uint8_t utf8_strlen_P(PGM_P pstart) { +uint8_t utf8_strlen_P(const char *pstart) { return utf8_strlen_cb(pstart, read_byte_rom); } + diff --git a/Marlin/src/lcd/fontutils.h b/Marlin/src/lcd/fontutils.h index 74c4a87fb9..b2eca477a3 100644 --- a/Marlin/src/lcd/fontutils.h +++ b/Marlin/src/lcd/fontutils.h @@ -6,15 +6,15 @@ * @date 2016-08-19 * @copyright GPL/BSD */ -#pragma once +#ifndef _FONT_UTILS_H +#define _FONT_UTILS_H #include +#include +#include "../core/macros.h" #include // wchar_t #include // uint32_t -#include "../HAL/shared/Marduino.h" -#include "../core/macros.h" - // read a byte from ROM or RAM typedef uint8_t (*read_byte_cb_t)(uint8_t * str); @@ -28,6 +28,10 @@ uint8_t read_byte_rom(uint8_t * str); #define wchar_t uint32_t //typedef uint32_t wchar_t; +#ifndef NUM_ARRAY + #define NUM_ARRAY(a) (sizeof(a)/sizeof((a)[0])) +#endif + typedef uint16_t pixel_len_t; #define PIXEL_LEN_NOLIMIT ((pixel_len_t)(-1)) @@ -38,6 +42,8 @@ int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, /* Get the character, decoding multibyte UTF8 characters and returning a pointer to the start of the next UTF8 character */ uint8_t* get_utf8_value_cb(uint8_t *pstart, read_byte_cb_t cb_read_byte, wchar_t *pval); -/* Returns length of string in CHARACTERS, NOT BYTES */ +/* Returns lenght of string in CHARACTERS, NOT BYTES */ uint8_t utf8_strlen(const char *pstart); -uint8_t utf8_strlen_P(PGM_P pstart); +uint8_t utf8_strlen_P(const char *pstart); + +#endif // _FONT_UTILS_H diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index a5030fcd56..679ed1cf3f 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,218 +16,244 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Aragonese * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_AN_H +#define LANGUAGE_AN_H #define DISPLAY_CHARSET_ISO10646_1 #define NOT_EXTENDED_ISO10646_1_5X7 -namespace Language_an { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" parada.") +#define MSG_SD_INSERTED _UxGT("Tarcheta mesa") +#define MSG_SD_REMOVED _UxGT("Tarcheta sacada") +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters +#define MSG_MAIN _UxGT("Menu prencipal") +#define MSG_AUTOSTART _UxGT("Inicio automatico") +#define MSG_DISABLE_STEPPERS _UxGT("Amortar motors") +#define MSG_AUTO_HOME _UxGT("Levar a l'orichen") +#define MSG_AUTO_HOME_X _UxGT("Orichen X") +#define MSG_AUTO_HOME_Y _UxGT("Orichen Y") +#define MSG_AUTO_HOME_Z _UxGT("Orichen Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Calibrar Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Orichen XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Encetar (pretar)") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Vinient punto") +#define MSG_LEVEL_BED_DONE _UxGT("Nivelacion feita!") +#define MSG_SET_HOME_OFFSETS _UxGT("Achustar desfases") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Desfase aplicau") +#define MSG_SET_ORIGIN _UxGT("Establir orichen") +#define MSG_PREHEAT_1 _UxGT("Precalentar PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Tot") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Base") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Conf") +#define MSG_PREHEAT_2 _UxGT("Precalentar ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Tot") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Base") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Conf") +#define MSG_COOLDOWN _UxGT("Enfriar") +#define MSG_SWITCH_PS_ON _UxGT("Enchegar Fuent") +#define MSG_SWITCH_PS_OFF _UxGT("Amortar Fuent") +#define MSG_EXTRUDE _UxGT("Extruir") +#define MSG_RETRACT _UxGT("Retraer") +#define MSG_MOVE_AXIS _UxGT("Mover Eixes") +#define MSG_BED_LEVELING _UxGT("Nivelar base") +#define MSG_LEVEL_BED _UxGT("Nivelar base") +#define MSG_MOVE_X _UxGT("Mover X") +#define MSG_MOVE_Y _UxGT("Mover Y") +#define MSG_MOVE_Z _UxGT("Mover Z") +#define MSG_MOVE_E _UxGT("Extrusor") +#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") +#define MSG_MOVE_1MM _UxGT("Mover 1mm") +#define MSG_MOVE_10MM _UxGT("Mover 10mm") +#define MSG_SPEED _UxGT("Velocidat") +#define MSG_BED_Z _UxGT("Base Z") +#define MSG_NOZZLE _UxGT("Boquilla") +#define MSG_BED _UxGT("Base") +#define MSG_FAN_SPEED _UxGT("Ixoriador") +#define MSG_FLOW _UxGT("Fluxo") +#define MSG_CONTROL _UxGT("Control") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Temperatura Auto.") +#define MSG_ON _UxGT("On") +#define MSG_OFF _UxGT("Off") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Trigar") +#define MSG_ACC _UxGT("Aceleracion") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VMAX _UxGT("Vmax") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("Vel. viache min") +#define MSG_ACCELERATION MSG_ACC +#define MSG_AMAX _UxGT("Acel. max") +#define MSG_A_RETRACT _UxGT("Acel. retrac.") +#define MSG_A_TRAVEL _UxGT("Acel. Viaje") +#define MSG_STEPS_PER_MM _UxGT("Trangos/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("A trangos/mm") + #define MSG_BSTEPS _UxGT("B trangos/mm") + #define MSG_CSTEPS _UxGT("C trangos/mm") +#else + #define MSG_ASTEPS _UxGT("X trangos/mm") + #define MSG_BSTEPS _UxGT("Y trangos/mm") + #define MSG_CSTEPS _UxGT("Z trangos/mm") +#endif +#define MSG_ESTEPS _UxGT("E trangos/mm") +#define MSG_E1STEPS _UxGT("E1 trangos/mm") +#define MSG_E2STEPS _UxGT("E2 trangos/mm") +#define MSG_E3STEPS _UxGT("E3 trangos/mm") +#define MSG_E4STEPS _UxGT("E4 trangos/mm") +#define MSG_E5STEPS _UxGT("E5 trangos/mm") +#define MSG_TEMPERATURE _UxGT("Temperatura") +#define MSG_MOTION _UxGT("Movimiento") +#define MSG_FILAMENT _UxGT("Filamento") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") +#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") +#define MSG_CONTRAST _UxGT("Contraste") +#define MSG_STORE_EEPROM _UxGT("Alzar memoria") +#define MSG_LOAD_EEPROM _UxGT("Cargar memoria") +#define MSG_RESTORE_FAILSAFE _UxGT("Restaurar memoria") +#define MSG_REFRESH _UxGT("Tornar a cargar") +#define MSG_WATCH _UxGT("Informacion") +#define MSG_PREPARE _UxGT("Preparar") +#define MSG_TUNE _UxGT("Achustar") +#define MSG_PAUSE_PRINT _UxGT("Pausar impresion") +#define MSG_RESUME_PRINT _UxGT("Contin. impresion") +#define MSG_STOP_PRINT _UxGT("Detener Impresion") +#define MSG_CARD_MENU _UxGT("Menu de SD") +#define MSG_NO_CARD _UxGT("No i hai tarcheta") +#define MSG_DWELL _UxGT("Reposo...") +#define MSG_USERWAIT _UxGT("Aguardand ordines") +#define MSG_PRINT_ABORTED _UxGT("Impres. cancelada") +#define MSG_NO_MOVE _UxGT("Sin movimiento") +#define MSG_KILLED _UxGT("Aturada d'emerch.") +#define MSG_STOPPED _UxGT("Aturada.") +#define MSG_CONTROL_RETRACT _UxGT("Retraer mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Retraer mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retraer F") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Devantar mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("DesRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Swap DesRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("DesRet F") +#define MSG_AUTORETRACT _UxGT("Retraccion auto.") +#define MSG_FILAMENTCHANGE _UxGT("Cambear filamento") +#define MSG_INIT_SDCARD _UxGT("Encetan. tarcheta") +#define MSG_CNG_SDCARD _UxGT("Cambiar tarcheta") +#define MSG_ZPROBE_OUT _UxGT("Sonda Z fuera") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Auto-Test") +#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("first") +#define MSG_ZPROBE_ZOFFSET _UxGT("Desfase Z") +#define MSG_BABYSTEP_X _UxGT("Micropaso X") +#define MSG_BABYSTEP_Y _UxGT("Micropaso Y") +#define MSG_BABYSTEP_Z _UxGT("Micropaso Z") +#define MSG_ENDSTOP_ABORT _UxGT("Cancelado - Endstop") +#define MSG_HEATING_FAILED_LCD _UxGT("Error: en calentar") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Error: temperatura") +#define MSG_THERMAL_RUNAWAY _UxGT("Error de temperatura") +#define MSG_ERR_MAXTEMP _UxGT("Error: Temp Maxima") +#define MSG_ERR_MINTEMP _UxGT("Error: Temp Menima") +#define MSG_ERR_MAXTEMP_BED _UxGT("Error: Temp Max base") +#define MSG_ERR_MINTEMP_BED _UxGT("Error: Temp Min base") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("IMPRESORA ATURADA") +#define MSG_PLEASE_RESET _UxGT("Per favor reinic.") +#define MSG_SHORT_DAY _UxGT("d") +#define MSG_SHORT_HOUR _UxGT("h") +#define MSG_SHORT_MINUTE _UxGT("m") +#define MSG_HEATING _UxGT("Calentando...") +#define MSG_BED_HEATING _UxGT("Calentando base...") +#define MSG_DELTA_CALIBRATE _UxGT("Calibracion Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") - constexpr uint8_t CHARSIZE = 1; - PROGMEM Language_Str LANGUAGE = _UxGT("Aragonese"); +#define MSG_INFO_MENU _UxGT("Inf. Impresora") +#define MSG_INFO_PRINTER_MENU _UxGT("Inf. Impresora") +#define MSG_INFO_STATS_MENU _UxGT("Estadisticas Imp.") +#define MSG_INFO_BOARD_MENU _UxGT("Inf. Controlador") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistors") +#define MSG_INFO_EXTRUDERS _UxGT("Extrusors") +#define MSG_INFO_BAUDRATE _UxGT("Baudios") +#define MSG_INFO_PROTOCOL _UxGT("Protocolo") +#define MSG_CASE_LIGHT _UxGT("Luz") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" parada."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tarcheta mesa"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tarcheta sacada"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters - PROGMEM Language_Str MSG_MAIN = _UxGT("Menu prencipal"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inicio automatico"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Amortar motors"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Levar a l'orichen"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Orichen X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Orichen Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Orichen Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Orichen XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Encetar (pretar)"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Vinient punto"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivelacion feita!"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Achustar desfases"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicau"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Establir orichen"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precalentar ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Precalentar ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Tot"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Base"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Conf"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Conteo de impresion") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") + #define MSG_INFO_PRINT_TIME _UxGT("Tiempo total d'imp.") + #define MSG_INFO_PRINT_LONGEST _UxGT("Impresion mas larga") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Total d'extrusion") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Impresions") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") + #define MSG_INFO_PRINT_TIME _UxGT("Total") + #define MSG_INFO_PRINT_LONGEST _UxGT("Mas larga") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrusion") +#endif - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Precalentar $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Precalentar $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Precal. $ Boquilla"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Precal. $ Boquilla ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Precalentar $ Tot"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Precalentar $ Base"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Precalentar $ Conf"); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Enfriar"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Enchegar Fuent"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Amortar Fuent"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruir"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Retraer"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover Eixes"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelar base"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar base"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidat"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Boquilla"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Boquilla ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Base"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ixoriador"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Ixoriador ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxo"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Fluxo ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temperatura Auto."); - PROGMEM Language_Str MSG_SELECT = _UxGT("Trigar"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Trigar *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Aceleracion"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vel. viache min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accel"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Acel. max") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Acel. max") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Acel. max") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Acel. max") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Acel. max *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Acel. retrac."); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Acel. Viaje"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Trangos/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" trangos/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" trangos/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" trangos/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E trangos/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* trangos/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Movimiento"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Alzar memoria"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Cargar memoria"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restaurar memoria"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Tornar a cargar"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Informacion"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Achustar"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impresion"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Contin. impresion"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Detener Impresion"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Menu de SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No i hai tarcheta"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Reposo..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Aguardand ordines"); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impres. cancelada"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sin movimiento"); - PROGMEM Language_Str MSG_KILLED = _UxGT("Aturada d'emerch."); - PROGMEM Language_Str MSG_STOPPED = _UxGT("Aturada."); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retraer mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Retraer mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraer F"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Devantar mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap DesRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet F"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retraccion auto."); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambear filamento"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Cambear filamento *"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Encetan. tarcheta"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambiar tarcheta"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z fuera"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desfase Z"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropaso X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropaso Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropaso Z"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancelado - Endstop"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Error: en calentar"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Error: temperatura"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Error de temperatura"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Error: Temp Max"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Error: Temp Min"); - PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA ATURADA"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Per favor reinic."); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); - PROGMEM Language_Str MSG_HEATING = _UxGT("Calentando..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Calentando base..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibracion Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); +#define MSG_INFO_MIN_TEMP _UxGT("Temperatura menima") +#define MSG_INFO_MAX_TEMP _UxGT("Temperatura maxima") +#define MSG_INFO_PSU _UxGT("Fuente de aliment") - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Inf. Impresora"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Inf. Impresora"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadisticas Imp."); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Inf. Controlador"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistors"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusors"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudios"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz"); +#define MSG_DRIVE_STRENGTH _UxGT("Fuerza d'o driver") +#define MSG_DAC_PERCENT _UxGT("Driver %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Escri. DAC EEPROM") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Resumir imp.") - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Conteo de impresion"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tiempo total d'imp."); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impresion mas larga"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total d'extrusion"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impresions"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Mas larga"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrusion"); - #endif +// +// Filament Change screens show up to 3 lines on a 4-line display +// ...or up to 2 lines on a 3-line display +// +#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Aguardand iniciar") - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temperatura menima"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temperatura maxima"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Fuente de aliment"); +#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Meta o filamento") +#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y prete lo boton") - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Fuerza d'o driver"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escri. DAC EEPROM"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Resumir imp."); +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("d'o filamento") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("cambear") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("pa continar...") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("d'o fil. cambear") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Meta o filamento") +#endif // LCD_HEIGHT < 4 - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // +#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Aguardando a") +#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("expulsar filament") +#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Aguardando a") +#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("cargar filamento") +#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Aguardando impre.") +#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("pa continar") - #if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Aguardand iniciar", "d'o filamento", "cambear")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Meta o filamento", "y prete lo boton", "pa continar...")); - #else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Aguardand iniciar", "d'o fil. cambear")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("Meta o filamento", "y prete lo boton")); - #endif // LCD_HEIGHT < 4 - - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Aguardando a", "expulsar filament")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Aguardando a", "cargar filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Aguardando impre.", "pa continar")); -} +#endif // LANGUAGE_AN_H diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index dcb06e31e7..cd86dbe6b2 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,140 +16,134 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Bulgarian * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_BG_H +#define LANGUAGE_BG_H #define DISPLAY_CHARSET_ISO10646_5 +#define CHARSIZE 2 -namespace Language_bg { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" Готов.") +#define MSG_SD_INSERTED _UxGT("Картата е поставена") +#define MSG_SD_REMOVED _UxGT("Картата е извадена") +#define MSG_MAIN _UxGT("Меню") +#define MSG_AUTOSTART _UxGT("Автостарт") +#define MSG_DISABLE_STEPPERS _UxGT("Изкл. двигатели") +#define MSG_AUTO_HOME _UxGT("Паркиране") +#define MSG_TMC_Z_CALIBRATION _UxGT("Калибровка Z") +#define MSG_SET_HOME_OFFSETS _UxGT("Задай Начало") +#define MSG_SET_ORIGIN _UxGT("Изходна точка") +#define MSG_PREHEAT_1 _UxGT("Подгряване PLA") +#define MSG_PREHEAT_1_N _UxGT("Подгряване PLA") +#define MSG_PREHEAT_1_ALL _UxGT("Подгр. PLA Всички") +#define MSG_PREHEAT_1_BEDONLY _UxGT("Подгр. PLA Легло") +#define MSG_PREHEAT_1_SETTINGS _UxGT("Настройки PLA") +#define MSG_PREHEAT_2 _UxGT("Подгряване ABS") +#define MSG_PREHEAT_2_N _UxGT("Подгряване ABS") +#define MSG_PREHEAT_2_ALL _UxGT("Подгр. ABS Всички") +#define MSG_PREHEAT_2_BEDONLY _UxGT("Подгр. ABS Легло") +#define MSG_PREHEAT_2_SETTINGS _UxGT("Настройки ABS") +#define MSG_COOLDOWN _UxGT("Охлаждане") +#define MSG_SWITCH_PS_ON _UxGT("Вкл. захранване") +#define MSG_SWITCH_PS_OFF _UxGT("Изкл. захранване") +#define MSG_EXTRUDE _UxGT("Екструзия") +#define MSG_RETRACT _UxGT("Откат") +#define MSG_MOVE_AXIS _UxGT("Движение по ос") +#define MSG_BED_LEVELING _UxGT("Нивелиране") +#define MSG_LEVEL_BED _UxGT("Нивелиране") +#define MSG_MOVE_X _UxGT("Движение по X") +#define MSG_MOVE_Y _UxGT("Движение по Y") +#define MSG_MOVE_Z _UxGT("Движение по Z") +#define MSG_MOVE_E _UxGT("Екструдер") +#define MSG_MOVE_01MM _UxGT("Премести с 0.1mm") +#define MSG_MOVE_1MM _UxGT("Премести с 1mm") +#define MSG_MOVE_10MM _UxGT("Премести с 10mm") +#define MSG_SPEED _UxGT("Скорост") +#define MSG_BED_Z _UxGT("Bed Z") +#define MSG_NOZZLE LCD_STR_THERMOMETER _UxGT(" Дюза") +#define MSG_BED LCD_STR_THERMOMETER _UxGT(" Легло") +#define MSG_FAN_SPEED _UxGT("Вентилатор") +#define MSG_FLOW _UxGT("Поток") +#define MSG_CONTROL _UxGT("Управление") +#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Минимум") +#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Максимум") +#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Фактор") +#define MSG_AUTOTEMP _UxGT("Авто-темп.") +#define MSG_ON _UxGT("Вкл. ") +#define MSG_OFF _UxGT("Изкл. ") +#define MSG_A_RETRACT _UxGT("A-откат") +#define MSG_A_TRAVEL _UxGT("A-travel") +#define MSG_STEPS_PER_MM _UxGT("Стъпки/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Aстъпки/mm") + #define MSG_BSTEPS _UxGT("Bстъпки/mm") + #define MSG_CSTEPS _UxGT("Cстъпки/mm") +#else + #define MSG_ASTEPS _UxGT("Xстъпки/mm") + #define MSG_BSTEPS _UxGT("Yстъпки/mm") + #define MSG_CSTEPS _UxGT("Zстъпки/mm") +#endif +#define MSG_ESTEPS _UxGT("E стъпки/mm") +#define MSG_E1STEPS _UxGT("E1 стъпки/mm") +#define MSG_E2STEPS _UxGT("E2 стъпки/mm") +#define MSG_E3STEPS _UxGT("E3 стъпки/mm") +#define MSG_E4STEPS _UxGT("E4 стъпки/mm") +#define MSG_E5STEPS _UxGT("E5 стъпки/mm") +#define MSG_TEMPERATURE _UxGT("Температура") +#define MSG_MOTION _UxGT("Движение") +#define MSG_FILAMENT _UxGT("Нишка") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") +#define MSG_FILAMENT_DIAM _UxGT("Диам. нишка") +#define MSG_CONTRAST _UxGT("LCD контраст") +#define MSG_STORE_EEPROM _UxGT("Запази в EPROM") +#define MSG_LOAD_EEPROM _UxGT("Зареди от EPROM") +#define MSG_RESTORE_FAILSAFE _UxGT("Фабрични настройки") +#define MSG_REFRESH LCD_STR_REFRESH _UxGT("Обнови") +#define MSG_WATCH _UxGT("Преглед") +#define MSG_PREPARE _UxGT("Действия") +#define MSG_TUNE _UxGT("Настройка") +#define MSG_PAUSE_PRINT _UxGT("Пауза") +#define MSG_RESUME_PRINT _UxGT("Възобнови печата") +#define MSG_STOP_PRINT _UxGT("Спри печата") +#define MSG_CARD_MENU _UxGT("Меню карта") +#define MSG_NO_CARD _UxGT("Няма карта") +#define MSG_DWELL _UxGT("Почивка...") +#define MSG_USERWAIT _UxGT("Изчакване") +#define MSG_PRINT_ABORTED _UxGT("Печатът е прекъснат") +#define MSG_NO_MOVE _UxGT("Няма движение") +#define MSG_KILLED _UxGT("УБИТО.") +#define MSG_STOPPED _UxGT("СПРЯНО.") +#define MSG_CONTROL_RETRACT _UxGT("Откат mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Смяна Откат mm") +#define MSG_CONTROL_RETRACTF _UxGT("Откат V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Скок mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Възврат mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Смяна Възврат mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Възврат V") +#define MSG_AUTORETRACT _UxGT("Автоoткат") +#define MSG_FILAMENTCHANGE _UxGT("Смяна нишка") +#define MSG_INIT_SDCARD _UxGT("Иниц. SD-Карта") +#define MSG_CNG_SDCARD _UxGT("Смяна SD-Карта") +#define MSG_ZPROBE_OUT _UxGT("Z-сондата е извадена") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z Отстояние") +#define MSG_BABYSTEP_X _UxGT("Министъпка X") +#define MSG_BABYSTEP_Y _UxGT("Министъпка Y") +#define MSG_BABYSTEP_Z _UxGT("Министъпка Z") +#define MSG_ENDSTOP_ABORT _UxGT("Стоп Кр.Изключватели") +#define MSG_DELTA_CALIBRATE _UxGT("Делта Калибровка") +#define MSG_DELTA_CALIBRATE_X _UxGT("Калибровка X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Калибровка Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Калибровка Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Калибровка Център") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Bulgarian"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Готов."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Картата е поставена"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Картата е извадена"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Меню"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Автостарт"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Изкл. двигатели"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Паркиране"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Задай Начало"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Изходна точка"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Подгряване ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Подгряване ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Всички"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Легло"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Настройки ") PREHEAT_1_LABEL; - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Подгряване $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Подгряване $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Подгряване $ Дюза"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Подгряване $ Дюза ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Подгр. $ Всички"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Подгр. $ Легло"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Настройки $"); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охлаждане"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Вкл. захранване"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Изкл. захранване"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Екструзия"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Откат"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Движение по ос"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Нивелиране"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Нивелиране"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Движение по X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Движение по Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Движение по Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Екструдер"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Екструдер *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Премести с %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Премести с 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Премести с 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Премести с 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Скорост"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); - PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Дюза"); - PROGMEM Language_Str MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" Дюза ~"); - PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" Легло"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Вентилатор"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Вентилатор ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Поток"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Поток ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Управление"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Минимум"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Максимум"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Авто-темп."); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Вкл."); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Изкл."); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-откат"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-travel"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Стъпки/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("стъпки/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("стъпки/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("стъпки/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E стъпки/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* стъпки/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Движение"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Нишка"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диам. нишка"); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Диам. нишка *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD контраст"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Запази в EPROM"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Зареди от EPROM"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Фабрични настройки"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Обнови"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Преглед"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Действия"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Настройка"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Пауза"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Възобнови печата"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Спри печата"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Меню карта"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Няма карта"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Почивка..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Изчакване"); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Печатът е прекъснат"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Няма движение"); - PROGMEM Language_Str MSG_KILLED = _UxGT("УБИТО."); - PROGMEM Language_Str MSG_STOPPED = _UxGT("СПРЯНО."); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Откат mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Смяна Откат mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Откат V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Скок mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Възврат mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Смяна Възврат mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Възврат V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Автоoткат"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Смяна нишка"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Смяна нишка *"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Иниц. SD-Карта"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Смяна SD-Карта"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-сондата е извадена"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Отстояние"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Министъпка X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Министъпка Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Министъпка Z"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Стоп Кр.Изключватели"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Делта Калибровка"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калибровка X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калибровка Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Калибровка Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калибровка Център"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Неправилен принтер"); -} +#endif // LANGUAGE_BG_H diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index 0657c4a759..31007b7352 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,213 +16,248 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Catalan * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ -namespace Language_ca { - using namespace Language_en; // Inherit undefined strings from English +#ifndef LANGUAGE_CA_H +#define LANGUAGE_CA_H - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Catalan"); +#define CHARSIZE 2 - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" preparada."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Targeta detectada."); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Targeta extreta."); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inici automatic"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desactiva motors"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu de depuracio"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra progres"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ves a l'origen"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X a origen"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y a origen"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z a origen"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origen XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Premeu per iniciar"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Següent punt"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Anivellament fet!"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ajusta decalatge"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Decalatge aplicat"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Estableix origen"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preescalfa ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preescalfa ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Tot"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Llit"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Conf."); +#define WELCOME_MSG MACHINE_NAME _UxGT(" preparada.") +#define MSG_SD_INSERTED _UxGT("Targeta detectada.") +#define MSG_SD_REMOVED _UxGT("Targeta extreta.") +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") +#define MSG_MAIN _UxGT("Menú principal") +#define MSG_AUTOSTART _UxGT("Inici automatic") +#define MSG_DISABLE_STEPPERS _UxGT("Desactiva motors") +#define MSG_DEBUG_MENU _UxGT("Menu de depuracio") +#define MSG_PROGRESS_BAR_TEST _UxGT("Test barra progres") +#define MSG_AUTO_HOME _UxGT("Ves a l'origen") +#define MSG_AUTO_HOME_X _UxGT("X a origen") +#define MSG_AUTO_HOME_Y _UxGT("Y a origen") +#define MSG_AUTO_HOME_Z _UxGT("Z a origen") +#define MSG_TMC_Z_CALIBRATION _UxGT("Calibra Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Origen XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Premeu per iniciar") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Següent punt") +#define MSG_LEVEL_BED_DONE _UxGT("Anivellament fet!") +#define MSG_SET_HOME_OFFSETS _UxGT("Ajusta decalatge") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Decalatge aplicat") +#define MSG_SET_ORIGIN _UxGT("Estableix origen") +#define MSG_PREHEAT_1 _UxGT("Preescalfa PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Tot") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Llit") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Conf.") +#define MSG_PREHEAT_2 _UxGT("Preescalfa ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Tot") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Llit") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Conf.") +#define MSG_COOLDOWN _UxGT("Refreda") +#define MSG_SWITCH_PS_ON _UxGT("Switch power on") +#define MSG_SWITCH_PS_OFF _UxGT("Switch power off") +#define MSG_EXTRUDE _UxGT("Extrudeix") +#define MSG_RETRACT _UxGT("Retreu") +#define MSG_MOVE_AXIS _UxGT("Mou eixos") +#define MSG_BED_LEVELING _UxGT("Anivella llit") +#define MSG_LEVEL_BED _UxGT("Anivella llit") +#define MSG_MOVING _UxGT("Movent..") +#define MSG_FREE_XY _UxGT("XY lliures") +#define MSG_MOVE_X _UxGT("Mou X") +#define MSG_MOVE_Y _UxGT("Mou Y") +#define MSG_MOVE_Z _UxGT("Mou Z") +#define MSG_MOVE_E _UxGT("Extrusor") +#define MSG_MOVE_01MM _UxGT("Mou 0.1mm") +#define MSG_MOVE_1MM _UxGT("Mou 1mm") +#define MSG_MOVE_10MM _UxGT("Mou 10mm") +#define MSG_SPEED _UxGT("Velocitat") +#define MSG_BED_Z _UxGT("Llit Z") +#define MSG_NOZZLE _UxGT("Nozzle") +#define MSG_BED _UxGT("Llit") +#define MSG_FAN_SPEED _UxGT("Vel. Ventilador") +#define MSG_FLOW _UxGT("Flux") +#define MSG_CONTROL _UxGT("Control") +#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Autotemp") +#define MSG_ON _UxGT("On ") +#define MSG_OFF _UxGT("Off") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Select") +#define MSG_ACC _UxGT("Accel") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VViatge min") +#define MSG_AMAX _UxGT("Accel. max ") +#define MSG_A_RETRACT _UxGT("Accel. retracc") +#define MSG_A_TRAVEL _UxGT("Accel. Viatge") +#define MSG_STEPS_PER_MM _UxGT("Passos/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Apassos/mm") + #define MSG_BSTEPS _UxGT("Bpassos/mm") + #define MSG_CSTEPS _UxGT("Cpassos/mm") +#else + #define MSG_ASTEPS _UxGT("Xpassos/mm") + #define MSG_BSTEPS _UxGT("Ypassos/mm") + #define MSG_CSTEPS _UxGT("Zpassos/mm") +#endif +#define MSG_ESTEPS _UxGT("Epassos/mm") +#define MSG_E1STEPS _UxGT("E1passos/mm") +#define MSG_E2STEPS _UxGT("E2passos/mm") +#define MSG_E3STEPS _UxGT("E3passos/mm") +#define MSG_E4STEPS _UxGT("E4passos/mm") +#define MSG_E5STEPS _UxGT("E5passos/mm") +#define MSG_TEMPERATURE _UxGT("Temperatura") +#define MSG_MOTION _UxGT("Moviment") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E en mm3") +#define MSG_FILAMENT_DIAM _UxGT("Diam. Fil.") +#define MSG_CONTRAST _UxGT("Contrast de LCD") +#define MSG_STORE_EEPROM _UxGT("Desa memoria") +#define MSG_LOAD_EEPROM _UxGT("Carrega memoria") +#define MSG_RESTORE_FAILSAFE _UxGT("Restaura valors") +#define MSG_REFRESH _UxGT("Actualitza") +#define MSG_WATCH _UxGT("Pantalla Info.") +#define MSG_PREPARE _UxGT("Prepara") +#define MSG_TUNE _UxGT("Ajusta") +#define MSG_PAUSE_PRINT _UxGT("Pausa impressio") +#define MSG_RESUME_PRINT _UxGT("Repren impressio") +#define MSG_STOP_PRINT _UxGT("Atura impressio.") +#define MSG_CARD_MENU _UxGT("Imprimeix de SD") +#define MSG_NO_CARD _UxGT("No hi ha targeta") +#define MSG_DWELL _UxGT("En repos...") +#define MSG_USERWAIT _UxGT("Esperant usuari..") +#define MSG_PRINT_ABORTED _UxGT("Imp. cancelada") +#define MSG_NO_MOVE _UxGT("Sense moviment.") +#define MSG_KILLED _UxGT("MATAT.") +#define MSG_STOPPED _UxGT("ATURADA.") +#define MSG_CONTROL_RETRACT _UxGT("Retreu mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Retreure mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retreu V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Aixeca mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("DesRet +mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Swap DesRet +mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("DesRet V") +#define MSG_AUTORETRACT _UxGT("Auto retraccio") +#define MSG_FILAMENTCHANGE _UxGT("Canvia filament") +#define MSG_INIT_SDCARD _UxGT("Inicialitza SD") +#define MSG_CNG_SDCARD _UxGT("Canvia SD") +#define MSG_ZPROBE_OUT _UxGT("Sonda Z fora") +#define MSG_BLTOUCH_RESET _UxGT("Reinicia BLTouch") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("primer") +#define MSG_ZPROBE_ZOFFSET _UxGT("Decalatge Z") +#define MSG_BABYSTEP_X _UxGT("Micropas X") +#define MSG_BABYSTEP_Y _UxGT("Micropas Y") +#define MSG_BABYSTEP_Z _UxGT("Micropas Z") +#define MSG_ENDSTOP_ABORT _UxGT("Cancel. Endstop") +#define MSG_HEATING_FAILED_LCD _UxGT("Error al escalfar") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP REDUNDANT") +#define MSG_THERMAL_RUNAWAY _UxGT("THERMAL RUNAWAY") +#define MSG_ERR_MAXTEMP _UxGT("Err: TEMP MAXIMA") +#define MSG_ERR_MINTEMP _UxGT("Err: TEMP MINIMA") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMPMAX LLIT") +#define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMPMIN LLIT") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("IMPRESSORA PARADA") +#define MSG_PLEASE_RESET _UxGT("Reinicieu") +#define MSG_SHORT_DAY _UxGT("d") // One character only +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("Escalfant...") +#define MSG_BED_HEATING _UxGT("Escalfant llit...") +#define MSG_DELTA_CALIBRATE _UxGT("Calibratge Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Calibra X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibra Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibra Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibra el centre") - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Preescalfa $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Preescalfa $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preescalfa $ End"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preescalfa $ End ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preescalfa $ Tot"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preescalfa $ Llit"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preescalfa $ Conf."); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Refreda"); +#define MSG_INFO_MENU _UxGT("Quant a la impr.") +#define MSG_INFO_PRINTER_MENU _UxGT("Info Impressora") +#define MSG_INFO_STATS_MENU _UxGT("Estadistiques") +#define MSG_INFO_BOARD_MENU _UxGT("Info placa") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistors") +#define MSG_INFO_EXTRUDERS _UxGT("Extrusors") +#define MSG_INFO_BAUDRATE _UxGT("Baud") +#define MSG_INFO_PROTOCOL _UxGT("Protocol") +#define MSG_CASE_LIGHT _UxGT("Llum") - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudeix"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Retreu"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mou eixos"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Anivella llit"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Anivella llit"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Total impressions") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Acabades") + #define MSG_INFO_PRINT_TIME _UxGT("Temps imprimint") + #define MSG_INFO_PRINT_LONGEST _UxGT("Treball mes llarg") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Total extrudit") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Impressions") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Acabades") + #define MSG_INFO_PRINT_TIME _UxGT("Total") + #define MSG_INFO_PRINT_LONGEST _UxGT("Mes llarg") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrudit") +#endif - PROGMEM Language_Str MSG_MOVING = _UxGT("Movent.."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY lliures"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mou X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mou Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mou Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mou %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mou 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mou 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mou 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Velocitat"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Llit Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Nozzle ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Llit"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. Ventilador"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. Ventilador ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Flux"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flux ~"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VViatge min"); +#define MSG_INFO_MIN_TEMP _UxGT("Temp. mínima") +#define MSG_INFO_MAX_TEMP _UxGT("Temp. màxima") +#define MSG_INFO_PSU _UxGT("Font alimentacio") - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Accel. retracc"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Accel. Viatge"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passos/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("passos/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("passos/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("passos/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Epassos/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*passos/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Moviment"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. Fil."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diam. Fil. *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contrast de LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Desa memoria"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Carrega memoria"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restaura valors"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualitza"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Pantalla Info."); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepara"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Ajusta"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausa impressio"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Repren impressio"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Atura impressio."); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprimeix de SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No hi ha targeta"); - PROGMEM Language_Str MSG_DWELL = _UxGT("En repos..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Esperant usuari.."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Imp. cancelada"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sense moviment."); - PROGMEM Language_Str MSG_KILLED = _UxGT("MATAT."); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ATURADA."); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retreu mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Retreure mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retreu V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Aixeca mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet +mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap DesRet +mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto retraccio"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Canvia filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Canvia filament *"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Inicialitza SD"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Canvia SD"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z fora"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reinicia BLTouch"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s primer"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Decalatge Z"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropas X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropas Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropas Z"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancel. Endstop"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Error al escalfar"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP REDUNDANT"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MAXIMA"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA"); - PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESSORA PARADA"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reinicieu"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Escalfant..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Escalfant llit..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibratge Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibra el centre"); +#define MSG_DRIVE_STRENGTH _UxGT("Força motor") +#define MSG_DAC_PERCENT _UxGT("Driver %") +#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Write") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Repren impressió") - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Quant a la impr."); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info Impressora"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadistiques"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info placa"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistors"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusors"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocol"); - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Llum"); +// +// Filament Change screens show up to 3 lines on a 4-line display +// ...or up to 2 lines on a 3-line display +// +#if LCD_HEIGHT >= 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperant per") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("iniciar el canvi") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("de filament") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperant per") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("treure filament") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Poseu filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("i premeu el boto") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("per continuar...") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Premeu boto per") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("escalfar nozzle.") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Escalfant nozzle") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Espereu...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperant carrega") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("de filament") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperant per") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("reprendre") +#else // LCD_HEIGHT < 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Espereu...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Expulsant...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insereix i prem") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Escalfant...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Carregant...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Reprenent...") +#endif // LCD_HEIGHT < 4 - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total impressions"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Acabades"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Temps imprimint"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Treball mes llarg"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total extrudit"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impressions"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Acabades"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Mes llarg"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudit"); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp. mínima"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp. màxima"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Font alimentacio"); - - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Força motor"); - - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Repren impressió"); - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora incorrecta"); - - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperant per", "iniciar el canvi", "de filament")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Esperant per", "treure filament")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Poseu filament", "i premeu el boto", "per continuar...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Premeu boto per", "escalfar nozzle.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Escalfant nozzle", "Espereu...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Esperant carrega", "de filament")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperant per", "reprendre")); - #else // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Espereu...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Expulsant...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insereix i prem")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Escalfant...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Carregant...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reprenent...")); - #endif // LCD_HEIGHT < 4 -} +#endif // LANGUAGE_CA_H diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 9cbd7042d6..bd57e30813 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,583 +16,394 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Czech * UTF-8 for Graphical Display * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html * * Translated by Petr Zahradnik, Computer Laboratory * Blog and video blog Zahradnik se bavi - * https://www.zahradniksebavi.cz + * http://www.zahradniksebavi.cz + * */ +#ifndef LANGUAGE_CZ_UTF_H +#define LANGUAGE_CZ_UTF_H #define DISPLAY_CHARSET_ISO10646_CZ +#define CHARSIZE 2 -namespace Language_cz { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" připraven.") +#define MSG_BACK _UxGT("Zpět") +#define MSG_SD_INSERTED _UxGT("Karta vložena") +#define MSG_SD_REMOVED _UxGT("Karta vyjmuta") +#define MSG_LCD_ENDSTOPS _UxGT("Endstopy") // max 8 znaku +#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Soft Endstopy") +#define MSG_MAIN _UxGT("Hlavní nabídka") +#define MSG_AUTOSTART _UxGT("Autostart") +#define MSG_DISABLE_STEPPERS _UxGT("Uvolnit motory") +#define MSG_DEBUG_MENU _UxGT("Nabídka ladění") +#define MSG_PROGRESS_BAR_TEST _UxGT("Test uk. průběhu") +#define MSG_AUTO_HOME _UxGT("Domovská pozice") +#define MSG_AUTO_HOME_X _UxGT("Domů osa X") +#define MSG_AUTO_HOME_Y _UxGT("Domů osa Y") +#define MSG_AUTO_HOME_Z _UxGT("Domů osa Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibrovat Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Měření podložky") +#define MSG_LEVEL_BED_WAITING _UxGT("Kliknutím spusťte") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Další bod") +#define MSG_LEVEL_BED_DONE _UxGT("Měření hotovo!") +#define MSG_Z_FADE_HEIGHT _UxGT("Výška srovnávání") +#define MSG_SET_HOME_OFFSETS _UxGT("Nastavit ofsety") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Ofsety nastaveny") +#define MSG_SET_ORIGIN _UxGT("Nastavit počátek") +#define MSG_PREHEAT_1 _UxGT("Zahřát PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" vše") +#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" hotend") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" podlož") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" nast") +#define MSG_PREHEAT_2 _UxGT("Zahřát ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" vše") +#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" hotend") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" podlož") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" nast") +#define MSG_COOLDOWN _UxGT("Zchladit") +#define MSG_SWITCH_PS_ON _UxGT("Zapnout napájení") +#define MSG_SWITCH_PS_OFF _UxGT("Vypnout napájení") +#define MSG_EXTRUDE _UxGT("Vytlačit (extr.)") +#define MSG_RETRACT _UxGT("Zatlačit (retr.)") +#define MSG_MOVE_AXIS _UxGT("Posunout osy") +#define MSG_BED_LEVELING _UxGT("Vyrovnat podložku") +#define MSG_LEVEL_BED _UxGT("Vyrovnat podložku") +#define MSG_LEVEL_CORNERS _UxGT("Vyrovnat rohy") +#define MSG_NEXT_CORNER _UxGT("Další roh") +#define MSG_EDITING_STOPPED _UxGT("Konec úprav sítě") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Czech"); +#define MSG_UBL_DOING_G29 _UxGT("Provádím G29") +#define MSG_UBL_UNHOMED _UxGT("Přejeďte domů") +#define MSG_UBL_TOOLS _UxGT("UBL nástroje") +#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") +#define MSG_UBL_MANUAL_MESH _UxGT("Manuální síť bodů") +#define MSG_UBL_BC_INSERT _UxGT("Vložte kartu, změřte") +#define MSG_UBL_BC_INSERT2 _UxGT("Změřte") +#define MSG_UBL_BC_REMOVE _UxGT("Odstraňte a změřte") +#define MSG_UBL_MOVING_TO_NEXT _UxGT("Přesun na další") +#define MSG_UBL_ACTIVATE_MESH _UxGT("Aktivovat UBL") +#define MSG_UBL_DEACTIVATE_MESH _UxGT("Deaktivovat UBL") +#define MSG_UBL_SET_BED_TEMP _UxGT("Teplota podložky") +#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Teplota hotendu") +#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP +#define MSG_UBL_MESH_EDIT _UxGT("Úprava sítě bodů") +#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Upravit vlastní síť") +#define MSG_UBL_FINE_TUNE_MESH _UxGT("Doladit síť bodů") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Konec úprav sítě") +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Vlastní síť") +#define MSG_UBL_BUILD_MESH_MENU _UxGT("Vytvořit síť") +#define MSG_UBL_BUILD_PLA_MESH _UxGT("Síť bodu PLA") +#define MSG_UBL_BUILD_ABS_MESH _UxGT("Síť bodu ABS") +#define MSG_UBL_BUILD_COLD_MESH _UxGT("Studená síť bodů") +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Upravit výšku sítě") +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Výška") +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Zkontrolovat síť") +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Kontrola sítě PLA") +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Kontrola sítě ABS") +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Kontrola vlast. sítě") +#define MSG_UBL_CONTINUE_MESH _UxGT("Pokračovat v síťi") +#define MSG_UBL_MESH_LEVELING _UxGT("Síťové rovnání") +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-bodove rovnání") +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Mrizkove rovnání") +#define MSG_UBL_MESH_LEVEL _UxGT("Srovnat podložku") +#define MSG_UBL_SIDE_POINTS _UxGT("Postranní body") +#define MSG_UBL_MAP_TYPE _UxGT("Typ sítě bodu") +#define MSG_UBL_OUTPUT_MAP _UxGT("Exportovat síť") +#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Exportovat do PC") +#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Exportovat do CSV") +#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Záloha do PC") +#define MSG_UBL_INFO_UBL _UxGT("Info o UBL do PC") +#define MSG_UBL_EDIT_MESH_MENU _UxGT("Upravit síť bodů") +#define MSG_UBL_FILLIN_AMOUNT _UxGT("Hustota mřížky") +#define MSG_UBL_MANUAL_FILLIN _UxGT("Ruční hustota") +#define MSG_UBL_SMART_FILLIN _UxGT("Chytrá hustota") +#define MSG_UBL_FILLIN_MESH _UxGT("Zaplnit mřížku") +#define MSG_UBL_INVALIDATE_ALL _UxGT("Zrušit všechno") +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Zrušit poslední") +#define MSG_UBL_FINE_TUNE_ALL _UxGT("Upravit všechny") +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Upravit poslední") +#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Uložiště sítí") +#define MSG_UBL_STORAGE_SLOT _UxGT("Paměťový slot") +#define MSG_UBL_LOAD_MESH _UxGT("Načíst síť bodů") +#define MSG_UBL_SAVE_MESH _UxGT("Uložit síť bodů") +#define MSG_MESH_LOADED _UxGT("Síť %i načtena") +#define MSG_MESH_SAVED _UxGT("Síť %i uložena") +#define MSG_NO_STORAGE _UxGT("Nedostatek místa") +#define MSG_UBL_SAVE_ERROR _UxGT("Err: Uložit UBL") +#define MSG_UBL_RESTORE_ERROR _UxGT("Err: Obnovit UBL") +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Konec Z-Offsetu") +#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL Postupně") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" připraven."); - PROGMEM Language_Str MSG_YES = _UxGT("ANO"); - PROGMEM Language_Str MSG_NO = _UxGT("NE"); - PROGMEM Language_Str MSG_BACK = _UxGT("Zpět"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Rušení..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Médium vloženo"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Médium vyjmuto"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Čekání na médium"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Chyba čtení média"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB odstraněno"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Chyba USB"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znaku - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstopy"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Hlavní nabídka"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Další nastavení"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfigurace"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Uvolnit motory"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Nabídka ladění"); - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test ukaz. průběhu"); - #else - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. průběhu"); - #endif - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Domovská pozice"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Domů osa X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Domů osa Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Domů osa Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto srovnání Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Měření podložky"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím spusťte"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Další bod"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Měření hotovo!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Výška srovnávání"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Nastavit ofsety"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastaveny"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Nastavit počátek"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Zahřát ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Zahřát ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" vše"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" podlož"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" nast"); +#define MSG_LED_CONTROL _UxGT("LED Nastavení") +#define MSG_LEDS _UxGT("Světla") +#define MSG_LED_PRESETS _UxGT("Světla Předvolby") +#define MSG_SET_LEDS_RED _UxGT("Červená") +#define MSG_SET_LEDS_ORANGE _UxGT("Oranžová") +#define MSG_SET_LEDS_YELLOW _UxGT("Žlutá") +#define MSG_SET_LEDS_GREEN _UxGT("Zelená") +#define MSG_SET_LEDS_BLUE _UxGT("Modrá") +#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") +#define MSG_SET_LEDS_VIOLET _UxGT("Fialová") +#define MSG_SET_LEDS_WHITE _UxGT("Bílá") +#define MSG_SET_LEDS_DEFAULT _UxGT("Výchozí") +#define MSG_CUSTOM_LEDS _UxGT("Vlastní světla") +#define MSG_INTENSITY_R _UxGT("Červená intenzita") +#define MSG_INTENSITY_G _UxGT("Zelená intezita") +#define MSG_INTENSITY_B _UxGT("Modrá intenzita") +#define MSG_INTENSITY_W _UxGT("Bílá intenzita") +#define MSG_LED_BRIGHTNESS _UxGT("Jas") - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Zahřát $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Zahřát $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Zahřát $ end"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Zahřát $ end ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Zahřát $ vše"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Zahřát $ podlož"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Zahřát $ nast"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Zahřát vlastní"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Zchladit"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Ovládání laseru"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Vypnout laser"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Zapnout laser"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon laseru"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Vřeteno ovládání"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Vřeteno vyp"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Vřeteno zap"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Vřeteno výkon"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Vřeteno opačně"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnout napájení"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Vypnout napájení"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Vytlačit (extr.)"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Zatlačit (retr.)"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Posunout osy"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Vyrovnat podložku"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Vyrovnat podložku"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Vyrovnat rohy"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Další roh"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor sítě"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Upravit síť bodů"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Konec úprav sítě"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Měření bodu"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Hodnota Z"); +#define MSG_USER_MENU _UxGT("Vlastní příkazy") +#define MSG_MOVING _UxGT("Posouvani...") +#define MSG_FREE_XY _UxGT("Uvolnit XY") +#define MSG_MOVE_X _UxGT("Posunout X") +#define MSG_MOVE_Y _UxGT("Posunout Y") +#define MSG_MOVE_Z _UxGT("Posunout Z") +#define MSG_MOVE_E _UxGT("Extrudér") +#define MSG_MOVE_01MM _UxGT("Posunout o 0,1mm") +#define MSG_MOVE_1MM _UxGT("Posunout o 1mm") +#define MSG_MOVE_10MM _UxGT("Posunout o 10mm") +#define MSG_SPEED _UxGT("Rychlost") +#define MSG_BED_Z _UxGT("Výška podl.") +#define MSG_NOZZLE _UxGT("Tryska") +#define MSG_BED _UxGT("Podložka") +#define MSG_FAN_SPEED _UxGT("Rychlost vent.") +#define MSG_EXTRA_FAN_SPEED _UxGT("Rychlost ex. vent.") +#define MSG_FLOW _UxGT("Průtok") +#define MSG_CONTROL _UxGT("Ovládaní") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fakt") +#define MSG_AUTOTEMP _UxGT("Autoteplota") +#define MSG_ON _UxGT("Zap") +#define MSG_OFF _UxGT("Vyp") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Vybrat") +#define MSG_ACC _UxGT("Zrychl") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VELOCITY _UxGT("Rychlost") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VTrav min") +#define MSG_ACCELERATION _UxGT("Akcelerace") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-retrakt") +#define MSG_A_TRAVEL _UxGT("A-přejezd") +#define MSG_STEPS_PER_MM _UxGT("Kroků/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Akroků/mm") + #define MSG_BSTEPS _UxGT("Bkroků/mm") + #define MSG_CSTEPS _UxGT("Ckroků/mm") +#else + #define MSG_ASTEPS _UxGT("Xkroků/mm") + #define MSG_BSTEPS _UxGT("Ykroků/mm") + #define MSG_CSTEPS _UxGT("Zkroků/mm") +#endif +#define MSG_ESTEPS _UxGT("Ekroků/mm") +#define MSG_E1STEPS _UxGT("E1kroků/mm") +#define MSG_E2STEPS _UxGT("E2kroků/mm") +#define MSG_E3STEPS _UxGT("E3kroků/mm") +#define MSG_E4STEPS _UxGT("E4kroků/mm") +#define MSG_E5STEPS _UxGT("E5kroků/mm") +#define MSG_TEMPERATURE _UxGT("Teplota") +#define MSG_MOTION _UxGT("Pohyb") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E na mm3") +#define MSG_FILAMENT_DIAM _UxGT("Fil. Prum.") +#define MSG_FILAMENT_UNLOAD _UxGT("Vysunout mm") +#define MSG_FILAMENT_LOAD _UxGT("Zavést mm") +#define MSG_ADVANCE_K _UxGT("K pro posun") +#define MSG_CONTRAST _UxGT("Kontrast LCD") +#define MSG_STORE_EEPROM _UxGT("Uložit nastavení") +#define MSG_LOAD_EEPROM _UxGT("Načíst nastavení") +#define MSG_RESTORE_FAILSAFE _UxGT("Obnovit výchozí") +#define MSG_INIT_EEPROM _UxGT("Inic. EEPROM") +#define MSG_REFRESH _UxGT("Obnovit") +#define MSG_WATCH _UxGT("Info obrazovka") +#define MSG_PREPARE _UxGT("Připrava tisku") +#define MSG_TUNE _UxGT("Doladění tisku") +#define MSG_PAUSE_PRINT _UxGT("Pozastavit tisk") +#define MSG_RESUME_PRINT _UxGT("Obnovit tisk") +#define MSG_STOP_PRINT _UxGT("Zastavit tisk") +#define MSG_POWER_LOSS_RECOVERY _UxGT("Obnova vypadku") +#define MSG_CARD_MENU _UxGT("Tisknout z SD") +#define MSG_NO_CARD _UxGT("Žádná SD karta") +#define MSG_DWELL _UxGT("Uspáno...") +#define MSG_USERWAIT _UxGT("Čekání na uživ...") +#define MSG_PRINT_PAUSED _UxGT("Tisk pozastaven") +#define MSG_PRINTING _UxGT("Tisknu...") +#define MSG_PRINT_ABORTED _UxGT("Tisk zrušen") +#define MSG_NO_MOVE _UxGT("Žádný pohyb.") +#define MSG_KILLED _UxGT("PŘERUSENO. ") +#define MSG_STOPPED _UxGT("ZASTAVENO. ") +#define MSG_CONTROL_RETRACT _UxGT("Retrakt mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Výměna Re.mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retraktovat V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Zvednuti Z mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") +#define MSG_AUTORETRACT _UxGT("AutoRetr.") +#define MSG_FILAMENTCHANGE _UxGT("Vyměnit filament") +#define MSG_FILAMENTLOAD _UxGT("Zavést filament") +#define MSG_FILAMENTUNLOAD _UxGT("Vysunout filament") +#define MSG_FILAMENTUNLOAD_ALL _UxGT("Vysunout vše") - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastní příkazy"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 test sondy"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 bod"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchylka"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Režim IDEX"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ofsety nástrojů"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikace"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Zrcadlení"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Plná kontrola"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. tryska X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. tryska Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. tryska Z"); +#define MSG_INIT_SDCARD _UxGT("Načíst SD kartu") +#define MSG_CNG_SDCARD _UxGT("Vyměnit SD kartu") +#define MSG_ZPROBE_OUT _UxGT("Sonda Z mimo podl") +#define MSG_SKEW_FACTOR _UxGT("Faktor zkosení") +#define MSG_BLTOUCH _UxGT("BLTouch") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") +#define MSG_BLTOUCH_RESET _UxGT("BLTouch Reset") +#define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch Vysunout") +#define MSG_BLTOUCH_STOW _UxGT("BLTouch Zasunout") +#define MSG_HOME _UxGT("Domů") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("první") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z ofset") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") +#define MSG_HEATING_FAILED_LCD _UxGT("Chyba zahřívání") +#define MSG_HEATING_FAILED_LCD_BED _UxGT("Chyba zahř. podl.") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("REDUND. TEPLOTA") +#define MSG_THERMAL_RUNAWAY _UxGT("TEPLOTNÍ SKOK") +#define MSG_THERMAL_RUNAWAY_BED _UxGT("PODL. TEPL. SKOK") +#define MSG_ERR_MAXTEMP _UxGT("VYSOKÁ TEPLOTA") +#define MSG_ERR_MINTEMP _UxGT("NÍZKA TEPLOTA") +#define MSG_ERR_MAXTEMP_BED _UxGT("VYS. TEPL. PODL.") +#define MSG_ERR_MINTEMP_BED _UxGT("NÍZ. TEPL. PODL.") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("TISK. ZASTAVENA") +#define MSG_PLEASE_RESET _UxGT("Proveďte reset") +#define MSG_SHORT_DAY _UxGT("d") +#define MSG_SHORT_HOUR _UxGT("h") +#define MSG_SHORT_MINUTE _UxGT("m") +#define MSG_HEATING _UxGT("Zahřívání...") +#define MSG_COOLING _UxGT("Chlazení") +#define MSG_BED_HEATING _UxGT("Zahřívání podl...") +#define MSG_BED_COOLING _UxGT("Chlazení podl...") +#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrace") +#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibrovat X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibrovat Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibrovat Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibrovat Střed") +#define MSG_DELTA_SETTINGS _UxGT("Delta nastavení") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Autokalibrace") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Nast.výšku delty") +#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Nast. Z-ofset") +#define MSG_DELTA_DIAG_ROD _UxGT("Diag rameno") +#define MSG_DELTA_HEIGHT _UxGT("Výška") +#define MSG_DELTA_RADIUS _UxGT("Poloměr") +#define MSG_INFO_MENU _UxGT("O tiskárně") +#define MSG_INFO_PRINTER_MENU _UxGT("Info o tiskárně") +#define MSG_3POINT_LEVELING _UxGT("3-bodové rovnání") +#define MSG_LINEAR_LEVELING _UxGT("Lineárni rovnání") +#define MSG_BILINEAR_LEVELING _UxGT("Bilineární rovnání") +#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") +#define MSG_MESH_LEVELING _UxGT("Mřížkové rovnání") +#define MSG_INFO_STATS_MENU _UxGT("Statistika") +#define MSG_INFO_BOARD_MENU _UxGT("Info o desce") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistory") +#define MSG_INFO_EXTRUDERS _UxGT("Extrudéry") +#define MSG_INFO_BAUDRATE _UxGT("Rychlost") +#define MSG_INFO_PROTOCOL _UxGT("Protokol") +#define MSG_CASE_LIGHT _UxGT("Osvětlení") +#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Jas světla") - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Provádím G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL nástroje"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Vyrovnání bodu"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manuální síť bodů"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Vložte kartu, změřte"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Změřte"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Odstraňte a změřte"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Přesun na další"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivovat UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deaktivovat UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Teplota podložky"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Teplota podložky"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Teplota hotendu"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Teplota hotendu"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Úprava sítě bodů"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Upravit vlastní síť"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Doladit síť bodů"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Konec úprav sítě"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastní síť"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Vytvořit síť"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Síť bodů $"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola sítě $"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená síť bodů"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Upravit výšku sítě"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Zkontrolovat síť"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast. sítě"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 zahřívání podl."); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 zařívání trysky"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ruční zavedení..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Pevné zavední"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Done Priming"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Canceled"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Leaving G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Pokračovat v síťi"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Síťové rovnání"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-bodové rovnání"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Mřížkové rovnání"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Srovnat podložku"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Postranní body"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Typ sítě bodu"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Exportovat síť"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Exportovat do PC"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Exportovat do CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Záloha do PC"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Info o UBL do PC"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Hustota mřížky"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ruční hustota"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Chytrá hustota"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Zaplnit mřížku"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Zrušit všechno"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Zrušit poslední"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Upravit všechny"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Upravit poslední"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Uložiště sítí"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Paměťový slot"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Načíst síť bodů"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Uložit síť bodů"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Síť %i načtena"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Síť %i uložena"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nedostatek místa"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Ch.: Uložit UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Ch.: Obnovit UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-ofset: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Konec Z-ofsetu"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Postupně"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Studená síť bodů"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Chytrá hustota"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Zkontrolovat síť"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Upravit všechny"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Zkontrolovat síť"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Upravit všechny"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Uložit síť bodů"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Počet tisků") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Dokončeno") + #define MSG_INFO_PRINT_TIME _UxGT("Celkový čas") + #define MSG_INFO_PRINT_LONGEST _UxGT("Nejdelší tisk") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Celkem vytlačeno") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Tisky") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Hotovo") + #define MSG_INFO_PRINT_TIME _UxGT("Čas") + #define MSG_INFO_PRINT_LONGEST _UxGT("Nejdelší") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Vytlačeno") +#endif - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Nastavení LED"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Světla"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Světla Předvolby"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Červená"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Oranžová"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Žlutá"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zelená"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Modrá"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fialová"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Bílá"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Výchozí"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Vlastní světla"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Červená intenzita"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zelená intezita"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Modrá intenzita"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Bílá intenzita"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Jas"); +#define MSG_INFO_MIN_TEMP _UxGT("Teplota min") +#define MSG_INFO_MAX_TEMP _UxGT("Teplota max") +#define MSG_INFO_PSU _UxGT("Nap. zdroj") +#define MSG_DRIVE_STRENGTH _UxGT("Buzení motorů") +#define MSG_DAC_PERCENT _UxGT("Motor %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Uložit do EEPROM") +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("TISK POZASTAVEN") +#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("ZAVEDENÍ FILAMENTU") +#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("VYSUNUTÍ FILAMENTU") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("MOŽNOSTI OBNOVENÍ:") +#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Vytlačit víc") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Obnovit tisk") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Tryska: ") +#define MSG_ERR_HOMING_FAILED _UxGT("Parkování selhalo") +#define MSG_ERR_PROBING_FAILED _UxGT("Kalibrace selhala") +#define MSG_M600_TOO_COLD _UxGT("M600: Moc studený") - PROGMEM Language_Str MSG_MOVING = _UxGT("Posouvání..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Uvolnit XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Posunout X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Posunout Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Posunout Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudér"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudér *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Posunout o %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunout o 0,1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunout o 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunout o 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Rychlost"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl."); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Tryska ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Podložka"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Komora"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Rychlost vent."); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Rychlost vent. ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Ulož. vent. ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Rychlost ex. vent."); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Rychlost ex. vent. ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Průtok"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Průtok ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Ovládaní"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" fakt"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autoteplota"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Zap"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Vyp"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID automatika"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID automatika *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Vybrat"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Vybrat *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Zrychl"); - PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-jerk"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-jerk"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-jerk"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Jerk"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Odchylka spoje"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Rychlost"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VTrav Min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Akcelerace"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retrakt"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-přejezd"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Kroků/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("kroků/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("kroků/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("kroků/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Ekroků/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*kroků/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Teplota"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Pohyb"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E na mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Prum."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Prum. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Vysunout mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Zavést mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K pro posun"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K pro posun *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Uložit nastavení"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Načíst nastavení"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Obnovit výchozí"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inic. EEPROM"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Aktualizace z SD"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reset tiskárny"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnovit"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info obrazovka"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Připrava tisku"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Doladění tisku"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Spustit tisk"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Další"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inicializace"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Tisk"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Zrušit"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Hotovo"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Zpět"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Pokračovat"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pozastavit tisk"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Obnovit tisk"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zastavit tisk"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Tisk objektu"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Zrušit objekt"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Zrušit objekt ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Obnova výpadku"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Tisknout z SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Žádná SD karta"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Uspáno..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Čekání na uživ..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Tisk pozastaven"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Tisknu..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Tisk zrušen"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Žádný pohyb."); - PROGMEM Language_Str MSG_KILLED = _UxGT("PŘERUSENO. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ZASTAVENO. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrakt mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Výměna Re.mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraktovat V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zvednuti Z mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Délka retrakce"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Délka zavedení"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Výměna nástroje"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Zdvih Z"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Rychlost primár."); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Rychlost retrak."); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Tryska standby"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Vyměnit filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Vyměnit filament *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Zavést filament"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Zavést filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Vysunout filament"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Vysunout filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Vysunout vše"); +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čekejte prosím") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("na zahájení") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("výměny filamentu") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Čekejte prosím") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("na vysunuti") + #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("filamentu") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vložte filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("a stiskněte") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("tlačítko...") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Klikněte pro") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("nahřátí trysky") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Čekejte prosím") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("na nahřátí tr.") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Čekejte prosím") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("na zavedení") + #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("filamentu") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Vyčkejte na") + #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("vytlačení") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Čekejte prosím") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("na pokračování") + #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("tisku") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čekejte...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Vysouvání...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vložte, klikněte") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Nahřívání...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Zavádění...") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Vytlačování...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Pokračování...") +#endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Načíst médium"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Vyměnit médium"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Vysunout médium"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z mimo podl"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Faktor zkosení"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch self-test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("BLTouch zasunout"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch vysunout"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW výsun BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("BLTouch 5V režim"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("BLTouch OD režim"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Uložit režim"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Nastavit 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Nastacit OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Vypsat nastavení"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VAROVANÍ: Špatné nastavení může způsobit škody! Pokračovat?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Inic. TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z Ofsetu"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Uložiy"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("vysunout TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Vysunout Z-sondu"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Zasunout Z-sondu"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Domů %s%s%s první"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z ofset"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Celkem"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop abort"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba zahřívání"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEPLOTA"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNÍ ÚNIK"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPL. ÚNIK PODL."); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("TEPL. ÚNIK KOMORA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("VYSOKÁ TEPLOTA"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("NÍZKA TEPLOTA"); - PROGMEM Language_Str MSG_HALTED = _UxGT("TISK. ZASTAVENA"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Proveďte reset"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); - PROGMEM Language_Str MSG_HEATING = _UxGT("Zahřívání..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Chlazení..."); - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Zahřívání podložky"); - #else - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Zahřívání podl."); - #endif - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Chlazení podložky"); - #else - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Chlazení podl."); - #endif - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Zahřívání komory..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chlazení komory..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrace"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrovat X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrovat Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrovat Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrovat Střed"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta nastavení"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Autokalibrace"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Nast.výšku delty"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Nast. Z-ofset"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag rameno"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Výška"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Poloměr"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O tiskárně"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info o tiskárně"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-bodové rovnání"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineárni rovnání"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineární rovnání"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mřížkové rovnání"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistika"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info o desce"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudéry"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Rychlost"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Sledování úniku: VYP"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Sledování úniku: ZAP"); - - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Osvětlení"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jas světla"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("NESPRÁVNÁ TISKÁRNA"); - - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Počet tisků"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Dokončeno"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Celkový čas"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Nejdelší tisk"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Celkem vytlačeno"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Tisky"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Hotovo"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Čas"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Nejdelší"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Vytlačeno"); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Teplota min"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Teplota max"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Nap. zdroj"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Buzení motorů"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Motor %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Motor %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Motor %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Motor %"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC uložit EEPROM"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CHYBA SPOJENÍ"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("VÝMĚNA FILAMENTU"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("TISK POZASTAVEN"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ZAVEDENÍ FILAMENTU"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("VYSUNUTÍ FILAMENTU"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("MOŽNOSTI OBNOVENÍ:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Vytlačit víc"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Obnovit tisk"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Tryska: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Senzor filamentu"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Délka mm senz.fil."); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Parkování selhalo"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Kalibrace selhala"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Aktual. MMU firmware!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU potř. pozornost."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Obnovit tisk"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Obnovování..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Zavést filament"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Zavést všechny"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Zavést do trysky"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Vysunout filament"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Vysun. filament ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Vytáhnout filament"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Zavádění fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Vytahování fil. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Vysouvání fil...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Všechny"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Resetovat MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Resetování MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Vytáhněte, klikněte"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponenta ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Přechod"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Celý přechod"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Přepnout mix"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Střídat mix"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Přechod mix"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Opačný přechod"); - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktivní V-nástroj"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Spustit V-nástroj"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ukončit V-nástroj"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-nástroje"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Resetovat V-nástroj"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Uložit V-nástroj mix"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-nástroj resetovat"); - #else - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktivní V-nástr."); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Spustit V-nástr."); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ukončit V-nástr."); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-nástr."); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reset. V-nástr."); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Uložit V-nás. mix"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-nástr. reset."); - #endif - PROGMEM Language_Str MSG_START_Z = _UxGT("Počáteční Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" Koncové Z:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Hry"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Bludiště"); - - #if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stikněte tlačítko", "pro obnovení tisku")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkování...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čekejte prosím", "na zahájení", "výměny filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Vložte filament", "a stiskněte", "tlačítko...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klikněte pro", "nahřátí trysky")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Čekejte prosím", "na nahřátí tr.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Čekejte prosím", "na vysunuti", "filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Čekejte prosím", "na zavedení", "filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Vyčkejte na", "vytlačení")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klikněte pro", "ukončení", "vytlačování")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Čekejte prosím", "na pokračování", "tisku")); - #else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stikněte tlač.", "pro obnovení")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkování...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Čekejte...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Vložte, klikněte")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klikněte pro", "nahřátí")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Nahřívání...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Vysouvání...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Zavádění...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Vytlačování...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klikněte pro", "ukončení")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Pokračování...")); - #endif // LCD_HEIGHT < 4 - - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC budiče"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Proud budičů"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybridní práh"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Domů bez senzorů"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Režim kroků"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop povolen"); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" za:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Vůle"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korekce"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Vyhlazení"); -} +#endif // LANGUAGE_CZ_UTF_H diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index be9ad758ce..0782b96531 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,187 +16,238 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Danish * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_DA_H +#define LANGUAGE_DA_H #define DISPLAY_CHARSET_ISO10646_1 +#define CHARSIZE 2 -namespace Language_da { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" er klar") +#define MSG_SD_INSERTED _UxGT("Kort isat") +#define MSG_SD_REMOVED _UxGT("Kort fjernet") +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters +#define MSG_MAIN _UxGT("Menu") +#define MSG_AUTOSTART _UxGT("Autostart") +#define MSG_DISABLE_STEPPERS _UxGT("Slå alle steppere fra") +#define MSG_AUTO_HOME _UxGT("Auto Home") // G28 +#define MSG_AUTO_HOME_X _UxGT("Home X") +#define MSG_AUTO_HOME_Y _UxGT("Home Y") +#define MSG_AUTO_HOME_Z _UxGT("Home Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibrer Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Homing XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Klik når du er klar") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Næste punkt") +#define MSG_LEVEL_BED_DONE _UxGT("Bed level er færdig!") +#define MSG_SET_HOME_OFFSETS _UxGT("Sæt forsk. af home") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Forsk. er nu aktiv") +#define MSG_SET_ORIGIN _UxGT("Sæt origin") +#define MSG_PREHEAT_1 _UxGT("Forvarm PLA") +#define MSG_PREHEAT_1_N _UxGT("Forvarm PLA ") +#define MSG_PREHEAT_1_ALL _UxGT("Forvarm PLA Alle") +#define MSG_PREHEAT_1_BEDONLY _UxGT("Forvarm PLA Bed") +#define MSG_PREHEAT_1_SETTINGS _UxGT("Forvarm PLA conf") +#define MSG_PREHEAT_2 _UxGT("Forvarm ABS") +#define MSG_PREHEAT_2_N _UxGT("Forvarm ABS ") +#define MSG_PREHEAT_2_ALL _UxGT("Forvarm ABS Alle") +#define MSG_PREHEAT_2_BEDONLY _UxGT("Forvarm ABS Bed") +#define MSG_PREHEAT_2_SETTINGS _UxGT("Forvarm ABS conf") +#define MSG_COOLDOWN _UxGT("Afkøl") +#define MSG_SWITCH_PS_ON _UxGT("Slå strøm til") +#define MSG_SWITCH_PS_OFF _UxGT("Slå strøm fra") +#define MSG_EXTRUDE _UxGT("Extruder") +#define MSG_RETRACT _UxGT("Retract") +#define MSG_MOVE_AXIS _UxGT("Flyt akser") +#define MSG_BED_LEVELING _UxGT("Juster bed") +#define MSG_LEVEL_BED _UxGT("Juster bed") +#define MSG_MOVE_X _UxGT("Flyt X") +#define MSG_MOVE_Y _UxGT("Flyt Y") +#define MSG_MOVE_Z _UxGT("Flyt Z") +#define MSG_MOVE_E _UxGT("Extruder") +#define MSG_MOVE_01MM _UxGT("Flyt 0.1mm") +#define MSG_MOVE_1MM _UxGT("Flyt 1mm") +#define MSG_MOVE_10MM _UxGT("Flyt 10mm") +#define MSG_SPEED _UxGT("Hastighed") +#define MSG_BED_Z _UxGT("Plade Z") +#define MSG_NOZZLE _UxGT("Dyse") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Danish"); +#define MSG_BED _UxGT("Plade") +#define MSG_FAN_SPEED _UxGT("Blæser hastighed") +#define MSG_FLOW _UxGT("Flow") +#define MSG_CONTROL _UxGT("Kontrol") +#define MSG_MIN _UxGT(" \002 Min") +#define MSG_MAX _UxGT(" \002 Max") +#define MSG_FACTOR _UxGT(" \002 Fact") +#define MSG_AUTOTEMP _UxGT("Autotemp") +#define MSG_ON _UxGT("Til ") +#define MSG_OFF _UxGT("Fra") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Vælg") +#define MSG_ACC _UxGT("Accel") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VTrav min") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-retract") +#define MSG_A_TRAVEL _UxGT("A-rejse") +#define MSG_STEPS_PER_MM _UxGT("Steps/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Asteps/mm") + #define MSG_BSTEPS _UxGT("Bsteps/mm") + #define MSG_CSTEPS _UxGT("Csteps/mm") +#else + #define MSG_ASTEPS _UxGT("Xsteps/mm") + #define MSG_BSTEPS _UxGT("Ysteps/mm") + #define MSG_CSTEPS _UxGT("Zsteps/mm") +#endif +#define MSG_ESTEPS _UxGT("Esteps/mm") +#define MSG_E1STEPS _UxGT("E1steps/mm") +#define MSG_E2STEPS _UxGT("E2steps/mm") +#define MSG_E3STEPS _UxGT("E3steps/mm") +#define MSG_E4STEPS _UxGT("E4steps/mm") +#define MSG_E5STEPS _UxGT("E5steps/mm") +#define MSG_TEMPERATURE _UxGT("Temperatur") +#define MSG_MOTION _UxGT("Bevægelse") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E i mm3") +#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") +#define MSG_CONTRAST _UxGT("LCD kontrast") +#define MSG_STORE_EEPROM _UxGT("Gem i EEPROM") +#define MSG_LOAD_EEPROM _UxGT("Hent fra EEPROM") +#define MSG_RESTORE_FAILSAFE _UxGT("Gendan failsafe") +#define MSG_REFRESH _UxGT("Genopfrisk") +#define MSG_WATCH _UxGT("Info skærm") +#define MSG_PREPARE _UxGT("Forbered") +#define MSG_TUNE _UxGT("Tune") +#define MSG_PAUSE_PRINT _UxGT("Pause printet") +#define MSG_RESUME_PRINT _UxGT("Forsæt printet") +#define MSG_STOP_PRINT _UxGT("Stop printet") +#define MSG_CARD_MENU _UxGT("Print fra SD") +#define MSG_NO_CARD _UxGT("Intet SD kort") +#define MSG_DWELL _UxGT("Dvale...") +#define MSG_USERWAIT _UxGT("Venter på bruger...") +#define MSG_PRINT_ABORTED _UxGT("Print annulleret") +#define MSG_NO_MOVE _UxGT("Ingen bevægelse.") +#define MSG_KILLED _UxGT("DRÆBT. ") +#define MSG_STOPPED _UxGT("STOPPET. ") +#define MSG_CONTROL_RETRACT _UxGT("Tilbagetræk mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Skift Re.mm") +#define MSG_CONTROL_RETRACTF _UxGT("Tilbagetræk V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Hop mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Skift UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_AUTORETRACT _UxGT("AutoRetr.") +#define MSG_FILAMENTCHANGE _UxGT("Skift filament") +#define MSG_INIT_SDCARD _UxGT("Init. SD card") +#define MSG_CNG_SDCARD _UxGT("Skift SD kort") +#define MSG_ZPROBE_OUT _UxGT("Probe udenfor plade") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Selv-Test") +#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("først") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") +#define MSG_HEATING_FAILED_LCD _UxGT("Opvarmning fejlet") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Fejl: reserve temp") +#define MSG_THERMAL_RUNAWAY _UxGT("Temp løber løbsk") +#define MSG_ERR_MAXTEMP _UxGT("Fejl: Maks temp") +#define MSG_ERR_MINTEMP _UxGT("Fejl: Min temp") +#define MSG_ERR_MAXTEMP_BED _UxGT("Fejl: Maks Plade temp") +#define MSG_ERR_MINTEMP_BED _UxGT("Fejl: Min Plade temp") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("PRINTER STOPPET") +#define MSG_PLEASE_RESET _UxGT("Reset Venligst") +#define MSG_SHORT_DAY _UxGT("d") // Kun et bogstav +#define MSG_SHORT_HOUR _UxGT("h") // Kun et bogstav +#define MSG_SHORT_MINUTE _UxGT("m") // Kun et bogstav +#define MSG_HEATING _UxGT("Opvarmer...") +#define MSG_BED_HEATING _UxGT("Opvarmer plade...") +#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrering") +#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibrer X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibrer Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibrer Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibrerings Center") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" er klar"); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kort isat"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kort fjernet"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menu"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Slå alle steppere fra"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); // G28 - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klik når du er klar"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Næste punkt"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Bed level er færdig!"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Sæt forsk. af home"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Forsk. er nu aktiv"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Sæt origin"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Forvarm ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Forvarm ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Alle"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Bed"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" conf"); +#define MSG_INFO_MENU _UxGT("Om Printer") +#define MSG_INFO_PRINTER_MENU _UxGT("Printer Info") +#define MSG_INFO_STATS_MENU _UxGT("Printer Stats") +#define MSG_INFO_BOARD_MENU _UxGT("Kort Info") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") +#define MSG_INFO_EXTRUDERS _UxGT("Extruders") +#define MSG_INFO_BAUDRATE _UxGT("Baud") +#define MSG_INFO_PROTOCOL _UxGT("Protocol") - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Forvarm $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Forvarm $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Forvarm $ end"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Forvarm $ end ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Forvarm $ Alle"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Forvarm $ Bed"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Forvarm $ conf"); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Afkøl"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Slå strøm til"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Slå strøm fra"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruder"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Flyt akser"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Juster bed"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Juster bed"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Flyt X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Flyt Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Flyt Z"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Flyt %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Flyt 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Flyt 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Flyt 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Hastighed"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Plade Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dyse"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Dyse ~"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Ant. Prints") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Færdige") + #define MSG_INFO_PRINT_TIME _UxGT("Total print tid") + #define MSG_INFO_PRINT_LONGEST _UxGT("Længste print") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Total Extruderet") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Prints") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Færdige") + #define MSG_INFO_PRINT_TIME _UxGT("Total") + #define MSG_INFO_PRINT_LONGEST _UxGT("Længste") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extruderet") +#endif - PROGMEM Language_Str MSG_BED = _UxGT("Plade"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Blæser hastighed"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Blæser hastighed ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrol"); - PROGMEM Language_Str MSG_MIN = _UxGT(" \002 Min"); - PROGMEM Language_Str MSG_MAX = _UxGT(" \002 Max"); - PROGMEM Language_Str MSG_FACTOR = _UxGT(" \002 Fact"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Til"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Fra"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Vælg"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Vælg *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retract"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-rejse"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatur"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Bevægelse"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E i mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrast"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Gem i EEPROM"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Hent fra EEPROM"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Gendan Defaults"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Genopfrisk"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info skærm"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Forbered"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause printet"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Forsæt printet"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop printet"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print fra SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Intet SD kort"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Dvale..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Venter på bruger..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print annulleret"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Ingen bevægelse."); - PROGMEM Language_Str MSG_KILLED = _UxGT("DRÆBT. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPET. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Tilbagetræk mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Skift Re.mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Tilbagetræk V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Skift Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Skift filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Skift filament *"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Skift SD kort"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Probe udenfor plade"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Selv-Test"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s først"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Opvarmning fejlet"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Fejl: reserve temp"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Temp løber løbsk"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Fejl: Maks temp"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Fejl: Min temp"); - PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER STOPPET"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reset Venligst"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // Kun et bogstav - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // Kun et bogstav - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // Kun et bogstav - PROGMEM Language_Str MSG_HEATING = _UxGT("Opvarmer..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Opvarmer plade..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrering"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrer X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrer Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrer Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrerings Center"); +#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") +#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") +#define MSG_INFO_PSU _UxGT("Strømfors.") - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Om Printer"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Kort Info"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors"); +#define MSG_DRIVE_STRENGTH _UxGT("Driv Styrke") +#define MSG_DAC_PERCENT _UxGT("Driv %") +#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Skriv") - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Ant. Prints"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Færdige"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total print tid"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Længste print"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruderet"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Prints"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Færdige"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Længste"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruderet"); - #endif +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Forsæt print") - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Strømfors."); +#if LCD_HEIGHT >= 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Vent på start") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("af filament") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("skift") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Vent på") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament udskyd.") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Indsæt filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("og tryk på knap") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("for at fortsætte...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Vent på") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament indtag") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Vent på at print") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("fortsætter") +#else // LCD_HEIGHT < 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Vent venligst...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Udskyder...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Indsæt og klik") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Indtager...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Fortsætter...") +#endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Driv Styrke"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driv %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driv %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driv %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driv %"); - - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Skriv"); - - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Forsæt print"); - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Forkert printer"); - - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Vent på start", "af filament", "skift")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Vent på", "filament udskyd.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Indsæt filament", "og tryk på knap", "for at fortsætte...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Vent på", "filament indtag")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Vent på at print", "fortsætter")); - #else // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Vent venligst...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Udskyder...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Indsæt og klik")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Indtager...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Fortsætter...")); - #endif // LCD_HEIGHT < 4 -} +#endif // LANGUAGE_DA_H diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 74e185680c..75d1d7aa2a 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,631 +16,382 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * German * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_DE_H +#define LANGUAGE_DE_H -namespace Language_de { - using namespace Language_en; // Inherit undefined strings from English +#define CHARSIZE 2 - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Deutsch"); +#define THIS_LANGUAGES_SPECIAL_SYMBOLS _UxGT("ÄäÖöÜüß²³") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" bereit"); - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("JA"); - PROGMEM Language_Str MSG_NO = _UxGT("NEIN"); - PROGMEM Language_Str MSG_BACK = _UxGT("Zurück"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Abbruch..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Medium erkannt"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Medium entfernt"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Warten auf Medium"); - PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD Init fehlgesch."); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Medium Lesefehler"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB Gerät entfernt"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB Start fehlge."); - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall überschritten"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopp"); // Max length 8 characters - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Software-Endstopp"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Hauptmenü"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Erw. Einstellungen"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguration"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motoren deaktivieren"); // M84 :: Max length 19 characters - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug-Menü"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Statusbalken-Test"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Z-Achsen ausgleichen"); - PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Bett ausrichten"); // Bettausrichtung - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ homen"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klick zum Starten"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Nächste Koordinate"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivellieren fertig!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Ausblendhöhe"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Setze Homeversatz"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Homeversatz aktiv"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Setze Nullpunkte"); //"G92 X0 Y0 Z0" commented out in ultralcd.cpp - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" Vorwärmen ~"); - PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" Alles Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" Bett Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" Einstellungen"); +#define WELCOME_MSG MACHINE_NAME _UxGT(" bereit") +#define MSG_BACK _UxGT("Zurück") +#define MSG_SD_INSERTED _UxGT("SD-Karte erkannt") +#define MSG_SD_REMOVED _UxGT("SD-Karte entfernt") +#define MSG_LCD_ENDSTOPS _UxGT("Endstopp") // Max length 8 characters +#define MSG_MAIN _UxGT("Hauptmenü") +#define MSG_AUTOSTART _UxGT("Autostart") +#define MSG_DISABLE_STEPPERS _UxGT("Motoren deaktivieren") // M84 +#define MSG_DEBUG_MENU _UxGT("Debug Menü") +#define MSG_PROGRESS_BAR_TEST _UxGT("Fortschrittsb. Test") +#define MSG_AUTO_HOME _UxGT("Home") // G28 +#define MSG_AUTO_HOME_X _UxGT("Home X") +#define MSG_AUTO_HOME_Y _UxGT("Home Y") +#define MSG_AUTO_HOME_Z _UxGT("Home Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibriere Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Home XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Klick für Start") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Nächste Koordinate") +#define MSG_LEVEL_BED_DONE _UxGT("Fertig") +#define MSG_Z_FADE_HEIGHT _UxGT("Ausblendhöhe") +#define MSG_SET_HOME_OFFSETS _UxGT("Setze Homeversatz") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Homeversatz aktiv") +#define MSG_SET_ORIGIN _UxGT("Setze Nullpunkt") //"G92 X0 Y0 Z0" commented out in ultralcd.cpp +#define MSG_PREHEAT_1 _UxGT("Vorwärmen PLA") +#define MSG_PREHEAT_1_N _UxGT("Vorwärmen PLA ") +#define MSG_PREHEAT_1_ALL _UxGT("Vorw. PLA Alle") +#define MSG_PREHEAT_1_END _UxGT("Vorw. PLA Extr.") +#define MSG_PREHEAT_1_BEDONLY _UxGT("Vorw. PLA Bett") +#define MSG_PREHEAT_1_SETTINGS _UxGT("Vorw. PLA Einst.") +#define MSG_PREHEAT_2 _UxGT("Vorwärmen ABS") +#define MSG_PREHEAT_2_N _UxGT("Vorwärmen ABS ") +#define MSG_PREHEAT_2_ALL _UxGT("Vorw. ABS Alle") +#define MSG_PREHEAT_2_END _UxGT("Vorw. ABS Extr.") +#define MSG_PREHEAT_2_BEDONLY _UxGT("Vorw. ABS Bett") +#define MSG_PREHEAT_2_SETTINGS _UxGT("Vorw. ABS Einst.") +#define MSG_COOLDOWN _UxGT("Abkühlen") +#define MSG_SWITCH_PS_ON _UxGT("Netzteil ein") +#define MSG_SWITCH_PS_OFF _UxGT("Netzteil aus") +#define MSG_EXTRUDE _UxGT("Extrudieren") +#define MSG_RETRACT _UxGT("Retract") +#define MSG_MOVE_AXIS _UxGT("Bewegen") +#define MSG_BED_LEVELING _UxGT("Bett Nivellierung") +#define MSG_LEVEL_BED _UxGT("Bett nivellieren") +#define MSG_LEVEL_CORNERS _UxGT("Ecken nivellieren") +#define MSG_NEXT_CORNER _UxGT("Nächste Ecke") +#define MSG_EDITING_STOPPED _UxGT("Netzbearb. angeh.") +#define MSG_USER_MENU _UxGT("Benutzer Menü") +#define MSG_MOVING _UxGT("In Bewegung...") +#define MSG_FREE_XY _UxGT("Abstand XY") +#define MSG_MOVE_X _UxGT("X") +#define MSG_MOVE_Y _UxGT("Y") +#define MSG_MOVE_Z _UxGT("Z") +#define MSG_MOVE_E _UxGT("Extruder ") +#define MSG_MOVE_01MM _UxGT(" 0,1 mm") +#define MSG_MOVE_1MM _UxGT(" 1,0 mm") +#define MSG_MOVE_10MM _UxGT("10,0 mm") +#define MSG_SPEED _UxGT("Geschw.") +#define MSG_BED_Z _UxGT("Bett Z") +#define MSG_NOZZLE _UxGT("Düse") +#define MSG_BED _UxGT("Bett") +#define MSG_FAN_SPEED _UxGT("Lüfter") +#define MSG_EXTRA_FAN_SPEED _UxGT("Extra Lüfter") +#define MSG_FLOW _UxGT("Flussrate") +#define MSG_CONTROL _UxGT("Einstellungen") +#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" min") +#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" max") +#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Faktor") +#define MSG_AUTOTEMP _UxGT("AutoTemp") +#define MSG_ON _UxGT("Ein") +#define MSG_OFF _UxGT("Aus") +#define MSG_PID_P _UxGT("PID P") +#define MSG_PID_I _UxGT("PID I") +#define MSG_PID_D _UxGT("PID D") +#define MSG_PID_C _UxGT("PID C") +#define MSG_SELECT _UxGT("Auswählen") +#define MSG_ACC _UxGT("A") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("V A Jerk") + #define MSG_VB_JERK _UxGT("V B Jerk") + #define MSG_VC_JERK _UxGT("V C Jerk") +#else + #define MSG_VA_JERK _UxGT("V X Jerk") + #define MSG_VB_JERK _UxGT("V Y Jerk") + #define MSG_VC_JERK _UxGT("V Z Jerk") +#endif +#define MSG_VE_JERK _UxGT("V E Jerk") +#define MSG_VELOCITY _UxGT("Geschwindigkeit") +#define MSG_VMAX _UxGT("V max ") // space by purpose +#define MSG_VMIN _UxGT("V min") +#define MSG_VTRAV_MIN _UxGT("V min Leerfahrt") +#define MSG_ACCELERATION _UxGT("Beschleunigung") +#define MSG_AMAX _UxGT("A max ") // space by purpose +#define MSG_A_RETRACT _UxGT("A Retract") +#define MSG_A_TRAVEL _UxGT("A Leerfahrt") +#define MSG_STEPS_PER_MM _UxGT("Steps/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("A Steps/mm") + #define MSG_BSTEPS _UxGT("B Steps/mm") + #define MSG_CSTEPS _UxGT("C Steps/mm") +#else + #define MSG_ASTEPS _UxGT("X Steps/mm") + #define MSG_BSTEPS _UxGT("Y Steps/mm") + #define MSG_CSTEPS _UxGT("Z Steps/mm") +#endif +#define MSG_ESTEPS _UxGT("E Steps/mm") +#define MSG_E1STEPS _UxGT("E1 Steps/mm") +#define MSG_E2STEPS _UxGT("E2 Steps/mm") +#define MSG_E3STEPS _UxGT("E3 Steps/mm") +#define MSG_E4STEPS _UxGT("E4 Steps/mm") +#define MSG_E5STEPS _UxGT("E5 Steps/mm") +#define MSG_TEMPERATURE _UxGT("Temperatur") +#define MSG_MOTION _UxGT("Bewegung") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm³") +#define MSG_FILAMENT_DIAM _UxGT("D Fil.") +#define MSG_FILAMENT_UNLOAD _UxGT("Entladen mm") +#define MSG_FILAMENT_LOAD _UxGT("Laden mm") +#define MSG_ADVANCE_K _UxGT("Advance Faktor") +#define MSG_CONTRAST _UxGT("LCD Kontrast") +#define MSG_STORE_EEPROM _UxGT("Konfig. speichern") +#define MSG_LOAD_EEPROM _UxGT("Konfig. laden") +#define MSG_RESTORE_FAILSAFE _UxGT("Standardwerte laden") +#define MSG_INIT_EEPROM _UxGT("Werkseinstellungen") +#define MSG_REFRESH _UxGT("Aktualisieren") +#define MSG_WATCH _UxGT("Info") +#define MSG_PREPARE _UxGT("Vorbereitung") +#define MSG_TUNE _UxGT("Justierung") +#define MSG_PAUSE_PRINT _UxGT("SD-Druck Pause") +#define MSG_RESUME_PRINT _UxGT("SD-Druck Fortsetzung") +#define MSG_STOP_PRINT _UxGT("SD-Druck Abbruch") +#define MSG_CARD_MENU _UxGT("SD-Karte") +#define MSG_NO_CARD _UxGT("Keine SD-Karte") +#define MSG_DWELL _UxGT("Warten...") +#define MSG_USERWAIT _UxGT("Warte auf Nutzer") +#define MSG_PRINT_PAUSED _UxGT("Druck pausiert") +#define MSG_PRINT_ABORTED _UxGT("Druck abgebrochen") +#define MSG_NO_MOVE _UxGT("Motoren eingeschaltet") +#define MSG_KILLED _UxGT("ABGEBROCHEN") +#define MSG_STOPPED _UxGT("ANGEHALTEN") +#define MSG_CONTROL_RETRACT _UxGT("Retract mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Wechs. Retract mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retract V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Z-Hop mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Wechs. UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") +#define MSG_AUTORETRACT _UxGT("Autom. Retract") +#define MSG_FILAMENTCHANGE _UxGT("Filament wechseln") +#define MSG_FILAMENTLOAD _UxGT("Filament laden") +#define MSG_FILAMENTUNLOAD _UxGT("Filament entladen") +#define MSG_FILAMENTUNLOAD_ALL _UxGT("Alles entladen") +#define MSG_INIT_SDCARD _UxGT("SD-Karte erkennen") // Manually initialize the SD-card via user interface +#define MSG_CNG_SDCARD _UxGT("SD-Karte getauscht") // SD-card changed by user. For machines with no autocarddetect. Both send "M21" +#define MSG_ZPROBE_OUT _UxGT("Sensor ausserhalb") +#define MSG_SKEW_FACTOR _UxGT("Skew Faktor") +#define MSG_BLTOUCH _UxGT("BLTouch") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Test") +#define MSG_BLTOUCH_RESET _UxGT("BLTouch Reset") +#define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch ausfahren") +#define MSG_BLTOUCH_STOW _UxGT("BLTouch einfahren") +#define MSG_HOME _UxGT("Vorher") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("homen") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z Versatz") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Endstopp-Abbr.") +#define MSG_HEATING_FAILED_LCD _UxGT("HEIZEN FEHLGESCHLAGEN") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("REDUND. TEMPERATURABWEICHUNG") +#define MSG_THERMAL_RUNAWAY LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT") +#define MSG_THERMAL_RUNAWAY_BED _UxGT("BETT") MSG_THERMAL_RUNAWAY +#define MSG_ERR_MAXTEMP LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN") +#define MSG_ERR_MINTEMP LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN") +#define MSG_ERR_MAXTEMP_BED _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN") +#define MSG_ERR_MINTEMP_BED _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("DRUCKER STOPP") +#define MSG_PLEASE_RESET _UxGT("Bitte Resetten") +#define MSG_SHORT_DAY _UxGT("t") // One character only +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("Extr. heizt...") +#define MSG_BED_HEATING _UxGT("Bett heizt...") +#define MSG_DELTA_CALIBRATE _UxGT("Delta kalibrieren") +#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibriere X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibriere Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibriere Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibriere Mitte") +#define MSG_DELTA_SETTINGS _UxGT("Delta Einst. anzeig.") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Autom. Kalibrierung") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Delta Höhe setzen") +#define MSG_DELTA_DIAG_ROD _UxGT("Diag Rod") +#define MSG_DELTA_HEIGHT _UxGT("Höhe") +#define MSG_DELTA_RADIUS _UxGT("Radius") +#define MSG_INFO_MENU _UxGT("Über den Drucker") +#define MSG_INFO_PRINTER_MENU _UxGT("Drucker Info") +#define MSG_3POINT_LEVELING _UxGT("3-Punkt Nivellierung") +#define MSG_LINEAR_LEVELING _UxGT("Lineare Nivellierung") +#define MSG_BILINEAR_LEVELING _UxGT("Bilineare Nivell.") +#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") +#define MSG_MESH_LEVELING _UxGT("Netz Nivellierung") +#define MSG_INFO_STATS_MENU _UxGT("Drucker Statistik") +#define MSG_INFO_BOARD_MENU _UxGT("Board Info") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistoren") +#define MSG_INFO_EXTRUDERS _UxGT("Extruder") +#define MSG_INFO_BAUDRATE _UxGT("Baud") +#define MSG_INFO_PROTOCOL _UxGT("Protokoll") +#define MSG_CASE_LIGHT _UxGT("Beleuchtung") +#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Helligkeit") - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("$ Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("$ Vorwärmen") " ~"; - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("$ Extr. Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("$ Extr. Vorwärm. ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("$ Alles Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("$ Bett Vorwärmen"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("$ Einstellungen"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("benutzerdef. Heizen"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Abkühlen"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequenz"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Laser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser aus"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser an"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laserleistung"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindel-Steuerung"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindel aus"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindel an"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindelleistung"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindelrichtung"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Netzteil ein"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Netzteil aus"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudieren"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Einzug"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Achsen bewegen"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bett-Nivellierung"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Bett nivellieren"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Ecken nivellieren"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Nächste Ecke"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Netz Editor"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Netz bearbeiten"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Netzbearb. angeh."); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Messpunkt"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z-Wert"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Benutzer-Menü"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Sondentest"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punkt"); - PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Zu weit draußen"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Abweichung"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX-Modus"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Werkzeugversätze"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Autom. parken"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplizieren"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Spiegelkopie"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("vollstä. Kontrolle"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. Düse X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. Düse Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. Düse Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 ausführen"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL-Werkzeuge"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Berührungspunkt"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Netz manuell erst."); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Unterlegen & messen"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Messen"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Entfernen & messen"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Nächster Punkt..."); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktivieren"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL deaktivieren"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Betttemperatur"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Betttemperatur"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hotend-Temp."); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend-Temp."); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Netz bearbeiten"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Eigenes Netz bearb."); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Feineinstellung..."); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Bearbeitung beendet"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Eigenes Netz erst."); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Netz erstellen"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("$ Netz erstellen"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("$ Netz validieren"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Netz erstellen kalt"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Netzhöhe einst."); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Höhe"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Netz validieren"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Eig. Netz validieren"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 heizt Bett"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Düse aufheizen"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manuell Prime..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Feste Länge Prime"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Priming fertig"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 abgebrochen"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("G26 verlassen"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Netzerst. forts."); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Netz-Nivellierung"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Punkt-Nivell."); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Gitternetz-Nivell."); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Netz nivellieren"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Eckpunkte"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Kartentyp"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Karte ausgeben"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Ausgabe für Host"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Ausgabe für CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Externe Sicherung"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL-Info ausgeben"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Menge an Füllung"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manuelles Füllen"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Cleveres Füllen"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Netz Füllen"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Alles annullieren"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Nächstlieg. ann."); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Feineinst. Alles"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Feineinst. Nächstl."); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Netz-Speicherplatz"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Speicherort"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Bettnetz laden"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Bettnetz speichern"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Netz %i geladen"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Netz %i gespeichert"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Kein Speicher"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err:UBL speichern"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err:UBL wiederherst."); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Versatz: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Versatz angehalten"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Schrittweises UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Netz erstellen kalt"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Cleveres Füllen"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Netz validieren"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Feineinst. Alles"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Netz validieren"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Feineinst. Alles"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Bettnetz speichern"); +#define MSG_UBL_DOING_G29 _UxGT("G29 UBL läuft!") +#define MSG_UBL_UNHOMED _UxGT("Erst XYZ homen") +#define MSG_UBL_TOOLS _UxGT("UBL Werkzeuge") +#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") +#define MSG_UBL_MANUAL_MESH _UxGT("Netz manuell erst.") +#define MSG_UBL_BC_INSERT _UxGT("Unterlegen & messen") +#define MSG_UBL_BC_INSERT2 _UxGT("Messen") +#define MSG_UBL_BC_REMOVE _UxGT("Entfernen & messen") +#define MSG_UBL_MOVING_TO_NEXT _UxGT("Nächster Punkt...") +#define MSG_UBL_ACTIVATE_MESH _UxGT("UBL aktivieren") +#define MSG_UBL_DEACTIVATE_MESH _UxGT("UBL deaktivieren") +#define MSG_UBL_SET_BED_TEMP _UxGT("Bett Temp.") +#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Hotend Temp.") +#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP +#define MSG_UBL_MESH_EDIT _UxGT("Netz bearbeiten") +#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Eigenes Netz bearb.") +#define MSG_UBL_FINE_TUNE_MESH _UxGT("Feineinstellung...") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Bearbeitung beendet") +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Eigenes Netz erst.") +#define MSG_UBL_BUILD_MESH_MENU _UxGT("Netz erstellen") +#define MSG_UBL_BUILD_PLA_MESH _UxGT("Netz erstellen PLA") +#define MSG_UBL_BUILD_ABS_MESH _UxGT("Netz erstellen ABS") +#define MSG_UBL_BUILD_COLD_MESH _UxGT("Netz erstellen kalt") +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Netz Höhe einst.") +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Höhe") +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Netz validieren") +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Netz validieren PLA") +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Netz validieren ABS") +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Eig. Netz validieren") +#define MSG_UBL_CONTINUE_MESH _UxGT("Netzerst. forts.") +#define MSG_UBL_MESH_LEVELING _UxGT("Netz Nivellierung") +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-Punkt Nivellierung") +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Gitternetz Nivell.") +#define MSG_UBL_MESH_LEVEL _UxGT("Netz nivellieren") +#define MSG_UBL_SIDE_POINTS _UxGT("Eckpunkte") +#define MSG_UBL_MAP_TYPE _UxGT("Kartentyp") +#define MSG_UBL_OUTPUT_MAP _UxGT("Karte ausgeben") +#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Ausgabe für Host") +#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Ausgabe für CSV") +#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Externe Sicherung") +#define MSG_UBL_INFO_UBL _UxGT("UBL Info ausgeben") +#define MSG_UBL_EDIT_MESH_MENU _UxGT("Netz bearbeiten") +#define MSG_UBL_FILLIN_AMOUNT _UxGT("Menge an Fill-in") +#define MSG_UBL_MANUAL_FILLIN _UxGT("Manuelles Fill-in") +#define MSG_UBL_SMART_FILLIN _UxGT("Kluges Fill-in") +#define MSG_UBL_FILLIN_MESH _UxGT("Fill-in Netz") +#define MSG_UBL_INVALIDATE_ALL _UxGT("Alles annullieren") +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Nächstlieg. ann.") +#define MSG_UBL_FINE_TUNE_ALL _UxGT("Feineinstellung Alle") +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Feineinst. Nächstl.") +#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Netz Speicherplatz") +#define MSG_UBL_STORAGE_SLOT _UxGT("Memory Slot") +#define MSG_UBL_LOAD_MESH _UxGT("Bett Netz laden") +#define MSG_UBL_SAVE_MESH _UxGT("Bett Netz speichern") +#define MSG_MESH_LOADED _UxGT("Netz %i geladen") +#define MSG_MESH_SAVED _UxGT("Netz %i gespeichert") +#define MSG_NO_STORAGE _UxGT("Kein Speicher") +#define MSG_UBL_SAVE_ERROR _UxGT("ERR:UBL speichern") +#define MSG_UBL_RESTORE_ERROR _UxGT("ERR:UBL wiederherst.") +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Versatz angehalten") +#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Schrittweises UBL") - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Licht-Steuerung"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Licht"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Licht-Einstellung"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rot"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Gelb"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Grün"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blau"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violett"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Weiß"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Standard"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Benutzerdefiniert"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensität Rot"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensität Grün"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensität Blau"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensität Weiß"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Helligkeit"); +#define MSG_LED_CONTROL _UxGT("LED Kontrolle") +#define MSG_LEDS _UxGT("Licht") +#define MSG_LED_PRESETS _UxGT("Licht Einstellungen") +#define MSG_SET_LEDS_RED _UxGT("Rot") +#define MSG_SET_LEDS_ORANGE _UxGT("Orange") +#define MSG_SET_LEDS_YELLOW _UxGT("Gelb") +#define MSG_SET_LEDS_GREEN _UxGT("Grün") +#define MSG_SET_LEDS_BLUE _UxGT("Blau") +#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") +#define MSG_SET_LEDS_VIOLET _UxGT("Violett") +#define MSG_SET_LEDS_WHITE _UxGT("Weiß") +#define MSG_SET_LEDS_DEFAULT _UxGT("Standard") +#define MSG_CUSTOM_LEDS _UxGT("Benutzerdef.") +#define MSG_INTENSITY_R _UxGT("Intensität Rot") +#define MSG_INTENSITY_G _UxGT("Intensität Grün") +#define MSG_INTENSITY_B _UxGT("Intensität Blau") +#define MSG_INTENSITY_W _UxGT("Intensität Weiß") +#define MSG_LED_BRIGHTNESS _UxGT("Helligkeit") - PROGMEM Language_Str MSG_MOVING = _UxGT("In Bewegung..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Abstand XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Bewege X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Bewege Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Bewege Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Bewege Extruder"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Bewege Extruder *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend zu kalt"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT(" %s mm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT(" 0,1 mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1,0 mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("10,0 mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Geschw."); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Bett Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Düse"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Düse ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Düse geparkt"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Düse bereit"); - PROGMEM Language_Str MSG_BED = _UxGT("Bett"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Gehäuse"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Lüfter"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Lüfter ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Gespeich. Lüfter ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Geschw. Extralüfter"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Geschw. Extralüfter ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Lüfter Kontroller"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Lüfter Leerlauf"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Motorlast Modus"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Lüfter Motorlast"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Ausschalt Delay"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Flussrate"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flussrate ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Einstellungen"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Faktor"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto Temperatur"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("an"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("aus"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID Tuning fertig"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune fehlge. Falscher Extruder"); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune fehlge. Temperatur zu hoch."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Autotune fehlge.! Timeout."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Auswählen"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Auswählen *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Beschleunigung"); - PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V ") LCD_STR_A _UxGT(" Jerk"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V ") LCD_STR_B _UxGT(" Jerk"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V ") LCD_STR_C _UxGT(" Jerk"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("V E Jerk"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Geschwindigkeit"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("V max ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("V max ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("V max ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("V max ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("V max *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("V min "); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("V min Leerfahrt"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Beschleunigung"); - PROGMEM Language_Str MSG_AMAX = _UxGT("A max "); // space intentional - PROGMEM Language_Str MSG_AMAX_A = _UxGT("A max ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("A max ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("A max ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("A max ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("A max *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A Einzug"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A Leerfahrt"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("max. Frequenz"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("min. Vorschub"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steps/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" Steps/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" Steps/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" Steps/mm"); - PROGMEM Language_Str MSG_E_STEPS = LCD_STR_E _UxGT(" Steps/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* Steps/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatur"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Bewegung"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Filamentdurchmesser"); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Filamentdurchmesser *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Entladen mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Laden mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Vorschubfaktor"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Vorschubfaktor *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD-Kontrast"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Konfig. speichern"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Konfig. laden"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Standardwerte laden"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Werkseinstellungen"); - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Fehler"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Fehler"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Fehler"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Einstell. gespei."); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("FW Update vom Medium"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Drucker neustarten"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aktualisieren"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Vorbereitung"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Justierung"); - PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Power Monitor"); - PROGMEM Language_Str MSG_CURRENT = _UxGT("Strom"); - PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Spannung"); - PROGMEM Language_Str MSG_POWER = _UxGT("Power"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Starte Druck"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Weiter"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Bestätigen"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Drucken"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reseten"); - PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignorieren"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Abbrechen"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Fertig"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Zurück"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Weiter"); - PROGMEM Language_Str MSG_PAUSING = _UxGT("Pause..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("SD-Druck pausieren"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("SD-Druck fortsetzen"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("SD-Druck abbrechen"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objekt drucken"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objekt abbrechen"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Objekt abbrechen ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Wiederh. n. Stroma."); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Druck vom Medium"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Kein Medium"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Warten..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Klick zum Fortsetzen"); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Druck pausiert..."); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Druckt..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Druck abgebrochen"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Druck fertig"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Motoren angeschaltet"); - PROGMEM Language_Str MSG_KILLED = _UxGT("ABGEBROCHEN"); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ANGEHALTEN"); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Einzug mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Wechs. Einzug mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("V Einzug"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z-Sprung mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Wechs. Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Autom. Einzug"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Einzugslänge"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Einzug"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Entladelänge"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Werkzeugwechsel"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z anheben"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prime-Geschwin."); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Einzug-Geschwin."); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Kopf parken"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Rückzugsgeschwindigkeit"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Lüfter Geschwindigkeit"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Lüfter Zeit"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto AN"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto AUS"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Werkzeugmigration"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-Migration"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Letzter Extruder"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrieren zu *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Filament wechseln"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Filament wechseln *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Filament laden"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Filament laden *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Filament entladen"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Filament entladen *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Alles entladen"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Medium initial."); // Manually initialize the SD-card via user interface - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Medium getauscht"); // SD-card changed by user. For machines with no autocarddetect. Both send "M21" - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Medium freigeben"); // if Marlin gets confused - M22 - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-Sonde außerhalb"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Korrekturfaktor"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Selbsttest"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Zurücksetzen"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Einfahren"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Ausfahren"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Modus"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Modus"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Modus"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Setze auf 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Setze auf OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Modus: "); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("ACHTUNG: Falsche Einstellung - kann zu Beschädigung führen! Fortfahren?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("TouchMI initial."); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z-Versatz"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Speichern"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI ausfahren"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Sonde ausfahren"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Sonde einfahren"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Vorher %s%s%s homen"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Sondenversatz"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Sondenversatz X"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Sondenversatz Y"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Sondenversatz Z"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Abbr. mit Endstopp"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("HEIZEN ERFOLGLOS"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEMP-ABWEI."); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BETT") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("GEH.") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = " " LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN"); - PROGMEM Language_Str MSG_ERR_MINTEMP = " " LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN"); - PROGMEM Language_Str MSG_HALTED = _UxGT("DRUCKER GESTOPPT"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Bitte neustarten"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("t"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("heizt..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("kühlt..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bett heizt..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Bett kühlt..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Gehäuse heizt..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Gehäuse kühlt..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrieren"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibriere X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibriere Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibriere Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibriere Mitte"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Einst. anzeig."); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Autom. Kalibrierung"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Höhe setzen"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Sondenversatz Z"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Höhe"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radius"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Über den Drucker"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Drucker-Info"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Punkt-Nivellierung"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineare Nivellierung"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineare Nivell."); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Netz-Nivellierung"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Drucker-Statistik"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Board-Info"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistoren"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruder"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudrate"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: AUS"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: AN"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout"); - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Beleuchtung"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Helligkeit"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Gesamte Drucke") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Beendete Drucke") + #define MSG_INFO_PRINT_TIME _UxGT("Gesamte Druckzeit") + #define MSG_INFO_PRINT_LONGEST _UxGT("Längster Druckjob") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Gesamt Extrudiert") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Drucke") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Komplett") + #define MSG_INFO_PRINT_TIME _UxGT("Gesamt ") + #define MSG_INFO_PRINT_LONGEST _UxGT("Längster") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrud.") +#endif - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Falscher Drucker"); +#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") +#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") +#define MSG_INFO_PSU _UxGT("Netzteil") - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Gesamte Drucke"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Komplette Drucke"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Gesamte Druckzeit"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Längste Druckzeit"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Gesamt Extrudiert"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Drucke"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Komplette"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Gesamte"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Längste"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrud."); - #endif +#define MSG_DRIVE_STRENGTH _UxGT("Motorströme") +#define MSG_DAC_PERCENT _UxGT("Treiber %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Werte speichern") +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("DRUCK PAUSIERT") +#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("FILAMENT LADEN") +#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("FILAMENT ENTLADEN") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("FORTS. OPTIONEN:") +#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Mehr entleeren") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Drucke weiter") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Düse: ") +#define MSG_ERR_HOMING_FAILED _UxGT("Homing gescheitert") +#define MSG_ERR_PROBING_FAILED _UxGT("Probing gescheitert") +#define MSG_M600_TOO_COLD _UxGT("M600: Zu kalt") +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Warte auf den") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("Start des") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("Filamentwechsels") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Warte auf") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("Herausnahme") + #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("des Filaments...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Filament einlegen") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("und Knopf") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("drücken...") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Knopf drücken um") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Düse aufzuheizen.") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Düse heizt auf...") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Bitte warten...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Warte auf") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Laden des") + #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("Filaments") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Warte auf") + #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("Entleeren des") + #define MSG_FILAMENT_CHANGE_PURGE_3 _UxGT("Filaments") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Warte auf") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("Fortsetzung des") + #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("Druckes...") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Bitte warten...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Auswerfen...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Laden und Klick") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heizen...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Laden...") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Entleeren...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Fortsetzen...") +#endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Netzteil"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Motorleistung"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Treiber %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Treiber %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Treiber %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Treiber %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC Verbindungsfehler"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Werte speichern"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT WECHSEL"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("DRUCK PAUSIERT"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("FILAMENT LADEN"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("FILAMENT ENTLADEN"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("FORTS. OPTIONEN:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Mehr entladen"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Druck weiter"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Düse: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout-Sensor"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout-Weg mm"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Homing gescheitert"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing gescheitert"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("FILAMENT WÄHLEN"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Update MMU Firmware!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU handeln erfor."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Druck fortsetzen"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Fortfahren..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Filament laden"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Lade alle"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Düse laden"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Filament auswerfen"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Filament ~ auswerfen"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Filament entladen "); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Lade Fila. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Fila. auswerfen..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Fila. entladen..."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Alle"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("setze MMU zurück"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU zurücksetzen..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Entfernen, klicken"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponente ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Mixer"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); // equal Farbverlauf - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Volle Gradient"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Mix umschalten"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Zyklus Mix"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Umgekehrte Gradient"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktives V-Tool"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("V-Tool Start"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("V-Tool Ende"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("V-Tool Alias"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("V-Tools Reseten"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("V-Tool Mix sichern"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-Tools ist resetet"); - PROGMEM Language_Str MSG_START_Z = _UxGT("Z Start:"); - PROGMEM Language_Str MSG_END_Z = _UxGT("Z Ende:"); - PROGMEM Language_Str MSG_GAMES = _UxGT("Spiele"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); - - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("ungült. Seitenzahl"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("ungült. Seitengeschw."); - - PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Passwort bearbeiten"); - PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login erforderlich"); - PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Passwort Einstellungen"); - PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("PIN eingeben"); - PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Passwort ändern"); - PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Passwort löschen"); - PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Passwort ist "); - PROGMEM Language_Str MSG_START_OVER = _UxGT("von vorn beginnen"); - PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Bald speichern!"); - PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Passwort gelöscht"); - - // - // Die Filament-Change-Bildschirme können bis zu 3 Zeilen auf einem 4-Zeilen-Display anzeigen - // ...oder 2 Zeilen auf einem 3-Zeilen-Display. - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Knopf drücken um", "Druck fortzusetzen")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_2_LINE("Druck ist", "pausiert...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Warte auf den", "Start des", "Filamentwechsels...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Filament einlegen", "und Knopf drücken", "um fortzusetzen")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Knopf drücken um", "Düse aufzuheizen")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Düse heizt auf", "bitte warten...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Warte auf", "Entnahme", "des Filaments...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Warte auf", "Laden des", "Filaments...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Warte auf", "Spülung", "der Düse...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klicke um", "die Düsenspülung", "zu beenden")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Warte auf", "Fortsetzen des", "Drucks...")); - #else // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Klick zum Fortsetzen")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Pausiert...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Bitte warten...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Laden und Klick")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Klick zum Heizen")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Heizen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Entnehmen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Laden...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spülen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klick zum beenden", "der Düsenspülung")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Fortsetzen...")); - #endif // LCD_HEIGHT < 4 - - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Treiber"); // Max length 18 characters - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Treiber Strom"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybrid threshold"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorloses Homing"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Schrittmodus"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop einsch."); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" im:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Spiel"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korrektur"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Glätten"); - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Achse leveln"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto. Kalibiren"); - #if ENABLED(TOUCH_UI_FTDI_EVE) - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Idle Timeout, Temperatur fällt. Drücke Okay, um erneut aufzuheizen und fortzufahren."); - #else - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heizungs Timeout"); - #endif - PROGMEM Language_Str MSG_REHEAT = _UxGT("Erneut aufheizen"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Erneut aufhei. ..."); -} +#endif // LANGUAGE_DE_H diff --git a/Marlin/src/lcd/language/language_el-gr.h b/Marlin/src/lcd/language/language_el-gr.h new file mode 100644 index 0000000000..04a1198f32 --- /dev/null +++ b/Marlin/src/lcd/language/language_el-gr.h @@ -0,0 +1,190 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Greek (Greece) + * + * LCD Menu Messages + * See also http://marlinfw.org/docs/development/lcd_language.html + * + */ +#ifndef LANGUAGE_EL_GR_H +#define LANGUAGE_EL_GR_H + +#define DISPLAY_CHARSET_ISO10646_GREEK +#define CHARSIZE 2 + +#define WELCOME_MSG MACHINE_NAME _UxGT(" έτοιμο.") +#define MSG_SD_INSERTED _UxGT("Εισαγωγή κάρτας") +#define MSG_SD_REMOVED _UxGT("Αφαίρεση κάρτας") +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters +#define MSG_MAIN _UxGT("Βασική Οθόνη") +#define MSG_AUTOSTART _UxGT("Αυτόματη εκκίνηση") +#define MSG_DISABLE_STEPPERS _UxGT("Απενεργοποίηση βηματιστή") +#define MSG_AUTO_HOME _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο") +#define MSG_AUTO_HOME_X _UxGT("Αρχικό σημείο X") +#define MSG_AUTO_HOME_Y _UxGT("Αρχικό σημείο Y") +#define MSG_AUTO_HOME_Z _UxGT("Αρχικό σημείο Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Βαθμονόμηση Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Επαναφορά στο αρχικό σημείο ΧΥΖ") +#define MSG_LEVEL_BED_WAITING _UxGT("Κάντε κλικ για να ξεκινήσετε") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Επόμενο σημείο") +#define MSG_LEVEL_BED_DONE _UxGT("Ολοκλήρωση επιπεδοποίησης!") +#define MSG_SET_HOME_OFFSETS _UxGT("Ορισμός βασικών μετατοπίσεων") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Εφαρμόστηκαν οι μετατοπίσεις") +#define MSG_SET_ORIGIN _UxGT("Ορισμός προέλευσης") +#define MSG_PREHEAT_1 _UxGT("Προθέρμανση PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" όλα") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" κλίνη") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" επιβεβαίωση") +#define MSG_PREHEAT_2 _UxGT("Προθέρμανση ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" όλα") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Bed") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" επιβεβαίωση") +#define MSG_COOLDOWN _UxGT("Μειωση θερμοκρασιας") +#define MSG_SWITCH_PS_ON _UxGT("Ενεργοποίηση") +#define MSG_SWITCH_PS_OFF _UxGT("Απενεργοποίηση") +#define MSG_EXTRUDE _UxGT("Εξώθηση") +#define MSG_RETRACT _UxGT("Ανάσυρση") +#define MSG_MOVE_AXIS _UxGT("Μετακίνηση άξονα") +#define MSG_BED_LEVELING _UxGT("Επιπεδοποίηση κλίνης") +#define MSG_LEVEL_BED _UxGT("Επιπεδοποίηση κλίνης") +#define MSG_MOVE_X _UxGT("Μετακίνηση X") +#define MSG_MOVE_Y _UxGT("Μετακίνηση Y") +#define MSG_MOVE_Z _UxGT("Μετακίνηση Z") +#define MSG_MOVE_E _UxGT("Εξωθητήρας") +#define MSG_MOVE_01MM _UxGT("Μετακίνηση 0,1 μμ") +#define MSG_MOVE_1MM _UxGT("Μετακίνηση 1 μμ") +#define MSG_MOVE_10MM _UxGT("Μετακίνηση 10 μμ") +#define MSG_SPEED _UxGT("Ταχύτητα") +#define MSG_BED_Z _UxGT("Κλίνη Z") +#define MSG_NOZZLE _UxGT("Ακροφύσιο") +#define MSG_BED _UxGT("Κλίνη") +#define MSG_FAN_SPEED _UxGT("Ταχύτητα ανεμιστήρα") +#define MSG_FLOW _UxGT("Ροή") +#define MSG_CONTROL _UxGT("Έλεγχος") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Αυτομ. ρύθμιση θερμοκρασίας") +#define MSG_ON _UxGT("Ενεργοποιημένο") +#define MSG_OFF _UxGT("Απενεργοποιημένο") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_ACC _UxGT("Επιτάχυνση") +#define MSG_JERK _UxGT("Vαντίδραση") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Vαντίδραση A") + #define MSG_VB_JERK _UxGT("Vαντίδραση B") + #define MSG_VC_JERK _UxGT("Vαντίδραση C") +#else + #define MSG_VA_JERK _UxGT("Vαντίδραση X") + #define MSG_VB_JERK _UxGT("Vαντίδραση Y") + #define MSG_VC_JERK _UxGT("Vαντίδραση Z") +#endif +#define MSG_VE_JERK _UxGT("Vαντίδραση E") +#define MSG_VMAX _UxGT("Vμεγ ") +#define MSG_VMIN _UxGT("Vελαχ") +#define MSG_VTRAV_MIN _UxGT("Vελάχ. μετατόπιση") +#define MSG_ACCELERATION MSG_ACC +#define MSG_AMAX _UxGT("Aμεγ ") +#define MSG_A_RETRACT _UxGT("Α-ανάσυρση") +#define MSG_A_TRAVEL _UxGT("Α-μετατόπιση") +#define MSG_STEPS_PER_MM _UxGT("Bήματα ανά μμ") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Bήματα A ανά μμ") + #define MSG_BSTEPS _UxGT("Bήματα B ανά μμ") + #define MSG_CSTEPS _UxGT("Bήματα C ανά μμ") +#else + #define MSG_ASTEPS _UxGT("Bήματα X ανά μμ") + #define MSG_BSTEPS _UxGT("Bήματα Y ανά μμ") + #define MSG_CSTEPS _UxGT("Bήματα Z ανά μμ") +#endif +#define MSG_ESTEPS _UxGT("Bήματα Ε ανά μμ") +#define MSG_E1STEPS _UxGT("Bήματα Ε1 ανά μμ") +#define MSG_E2STEPS _UxGT("Bήματα Ε2 ανά μμ") +#define MSG_E3STEPS _UxGT("Bήματα Ε3 ανά μμ") +#define MSG_E4STEPS _UxGT("Bήματα Ε4 ανά μμ") +#define MSG_E5STEPS _UxGT("Bήματα Ε5 ανά μμ") +#define MSG_TEMPERATURE _UxGT("Θερμοκρασία") +#define MSG_MOTION _UxGT("Κίνηση") +#define MSG_FILAMENT _UxGT("Νήμα") +#define MSG_VOLUMETRIC_ENABLED _UxGT("Ε σε μμ3") +#define MSG_FILAMENT_DIAM _UxGT("Διάμετρος νήματος") +#define MSG_CONTRAST _UxGT("Κοντράστ LCD") +#define MSG_STORE_EEPROM _UxGT("Αποθήκευση") +#define MSG_LOAD_EEPROM _UxGT("Φόρτωση") +#define MSG_RESTORE_FAILSAFE _UxGT("Επαναφορά ασφαλούς αντιγράφου") +#define MSG_REFRESH _UxGT("Ανανέωση") +#define MSG_WATCH _UxGT("Οθόνη πληροφόρησης") +#define MSG_PREPARE _UxGT("Προετοιμασία") +#define MSG_TUNE _UxGT("Συντονισμός") +#define MSG_PAUSE_PRINT _UxGT("Παύση εκτύπωσης") +#define MSG_RESUME_PRINT _UxGT("Συνέχιση εκτύπωσης") +#define MSG_STOP_PRINT _UxGT("Διακοπή εκτύπωσης") +#define MSG_CARD_MENU _UxGT("Εκτύπωση από SD") +#define MSG_NO_CARD _UxGT("Δεν βρέθηκε SD") +#define MSG_DWELL _UxGT("Αναστολή λειτουργίας…") +#define MSG_USERWAIT _UxGT("Αναμονή για χρήστη…") +#define MSG_PRINT_ABORTED _UxGT("Διακόπτεται η εκτύπωση") +#define MSG_NO_MOVE _UxGT("Καμία κίνηση.") +#define MSG_KILLED _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. ") +#define MSG_STOPPED _UxGT("ΔΙΑΚΟΠΗ. ") +#define MSG_CONTROL_RETRACT _UxGT("Ανάσυρση μμ") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Εναλλαγή ανάσυρσης μμ") +#define MSG_CONTROL_RETRACTF _UxGT("Ανάσυρση V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Μεταπήδηση μμ") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_AUTORETRACT _UxGT("Αυτόματη ανάσυρση") +#define MSG_FILAMENTCHANGE _UxGT("Αλλαγή νήματος") +#define MSG_INIT_SDCARD _UxGT("Προετοιμασία κάρτας SD") +#define MSG_CNG_SDCARD _UxGT("Αλλαγή κάρτας SD") +#define MSG_ZPROBE_OUT _UxGT("Διερεύνηση Z εκτός κλίνης") +#define MSG_YX_UNHOMED _UxGT("Επαναφορά Χ/Υ πριν από Ζ") +#define MSG_XYZ_UNHOMED _UxGT("Επαναφορά ΧΥΖ πρώτα") +#define MSG_ZPROBE_ZOFFSET _UxGT("Μετατόπιση Ζ") +#define MSG_BABYSTEP_X _UxGT("Μικρό βήμα Χ") +#define MSG_BABYSTEP_Y _UxGT("Μικρό βήμα Υ") +#define MSG_BABYSTEP_Z _UxGT("Μικρό βήμα Ζ") +#define MSG_ENDSTOP_ABORT _UxGT("Ματαίωση endstop ") +#define MSG_HEATING_FAILED_LCD _UxGT("Ανεπιτυχής θέρμανση") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Λάθος: ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ") +#define MSG_THERMAL_RUNAWAY _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΤΗΤΑΣ") +#define MSG_ERR_MAXTEMP _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ") +#define MSG_ERR_MINTEMP _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ") +#define MSG_ERR_MAXTEMP_BED _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙΝΗΣ") +#define MSG_ERR_MINTEMP_BED _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙΝΗΣ") +#define MSG_HEATING _UxGT("Θερμαίνεται…") +#define MSG_BED_HEATING _UxGT("Θέρμανση κλίνης…") +#define MSG_DELTA_CALIBRATE _UxGT("Βαθμονόμηση Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Βαθμονόμηση X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Βαθμονόμηση Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Βαθμονόμηση Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Βαθμονόμηση κέντρου") + +#endif // LANGUAGE_EL_GR_H diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index 125119d5cc..2a90098308 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,177 +16,176 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Greek * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_EL_H +#define LANGUAGE_EL_H #define DISPLAY_CHARSET_ISO10646_GREEK +#define CHARSIZE 2 -namespace Language_el { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" έτοιμο.") +#define MSG_SD_INSERTED _UxGT("Εισαγωγή κάρτας") +#define MSG_SD_REMOVED _UxGT("Αφαίρεση κάρτας") +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters +#define MSG_MAIN _UxGT("Βασική Οθόνη") +#define MSG_AUTOSTART _UxGT("Αυτόματη εκκίνηση") +#define MSG_DISABLE_STEPPERS _UxGT("Απενεργοποίηση Μοτέρ") +#define MSG_AUTO_HOME _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο") //SHORTEN +#define MSG_AUTO_HOME_X _UxGT("Αρχικό σημείο X") +#define MSG_AUTO_HOME_Y _UxGT("Αρχικό σημείο Y") +#define MSG_AUTO_HOME_Z _UxGT("Αρχικό σημείο Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Βαθμονόμηση Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Επαναφορά Επ. Εκτύπωσης") //SHORTEN +#define MSG_LEVEL_BED_WAITING _UxGT("Επιπεδοποίηση επ. Εκτύπωσης περιμενει") //SHORTEN +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Επόμενο σημείο") +#define MSG_LEVEL_BED_DONE _UxGT("Ολοκλήρωση επιπεδοποίησης!") //SHORTEN +#define MSG_SET_HOME_OFFSETS _UxGT("Ορισμός βασικών μετατοπίσεων") //SHORTEN +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Εφαρμόστηκαν οι μετατοπίσεις") //SHORTEN +#define MSG_SET_ORIGIN _UxGT("Ορισμός προέλευσης") +#define MSG_PREHEAT_1 _UxGT("Προθέρμανση PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" όλα") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" bed") //SHORTEN +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" επιβεβαίωση") //SHORTEN +#define MSG_PREHEAT_2 _UxGT("Προθέρμανση ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" όλα") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" bed") //SHORTEN +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" επιβεβαίωση") //SHORTEN +#define MSG_COOLDOWN _UxGT("Μειωση θερμοκρασιας") +#define MSG_SWITCH_PS_ON _UxGT("Ενεργοποίηση") +#define MSG_SWITCH_PS_OFF _UxGT("Απενεργοποίηση") +#define MSG_EXTRUDE _UxGT("Εξώθηση") +#define MSG_RETRACT _UxGT("Ανάσυρση") +#define MSG_MOVE_AXIS _UxGT("Μετακίνηση άξονα") +#define MSG_BED_LEVELING _UxGT("Επιπεδοποίηση Επ. Εκτύπωσης") //SHORTEN +#define MSG_LEVEL_BED _UxGT("Επιπεδοποίηση Επ. Εκτύπωσης") //SHORTEN +#define MSG_MOVE_X _UxGT("Μετακίνηση X") +#define MSG_MOVE_Y _UxGT("Μετακίνηση Y") +#define MSG_MOVE_Z _UxGT("Μετακίνηση Z") +#define MSG_MOVE_E _UxGT("Εξωθητήρας") +#define MSG_MOVE_01MM _UxGT("Μετακίνηση 0,1μμ") +#define MSG_MOVE_1MM _UxGT("Μετακίνηση 1μμ") +#define MSG_MOVE_10MM _UxGT("Μετακίνηση 10μμ") +#define MSG_SPEED _UxGT("Ταχύτητα") +#define MSG_BED_Z _UxGT("Επ. Εκτύπωσης Z") +#define MSG_NOZZLE _UxGT("Ακροφύσιο") +#define MSG_BED _UxGT("Κλίνη") +#define MSG_FAN_SPEED _UxGT("Ταχύτητα ανεμιστήρα") +#define MSG_FLOW _UxGT("Ροή") +#define MSG_CONTROL _UxGT("Έλεγχος") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Αυτομ ρύθμιση θερ/σίας") //SHORTEN +#define MSG_ON _UxGT("Ενεργοποιημένο") +#define MSG_OFF _UxGT("Απενεργοποιημένο") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_ACC _UxGT("Επιτάχυνση") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Vαντίδραση A") + #define MSG_VB_JERK _UxGT("Vαντίδραση B") + #define MSG_VC_JERK _UxGT("Vαντίδραση C") +#else + #define MSG_VA_JERK _UxGT("Vαντίδραση X") + #define MSG_VB_JERK _UxGT("Vαντίδραση Y") + #define MSG_VC_JERK _UxGT("Vαντίδραση Z") +#endif +#define MSG_VE_JERK _UxGT("Vαντίδραση E") +#define MSG_VMAX _UxGT("V Μέγιστο") +#define MSG_VMIN _UxGT("V Ελάχιστο") +#define MSG_VTRAV_MIN _UxGT("Vελάχ. μετατόπιση") +#define MSG_ACCELERATION MSG_ACC +#define MSG_AMAX _UxGT("Aμεγ ") +#define MSG_A_RETRACT _UxGT("Α-ανάσυρση") +#define MSG_A_TRAVEL _UxGT("Α-μετατόπιση") +#define MSG_STEPS_PER_MM _UxGT("Bήματα ανά μμ") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Bήματα A ανά μμ") + #define MSG_BSTEPS _UxGT("Bήματα B ανά μμ") + #define MSG_CSTEPS _UxGT("Bήματα C ανά μμ") +#else + #define MSG_ASTEPS _UxGT("Bήματα X ανά μμ") + #define MSG_BSTEPS _UxGT("Bήματα Y ανά μμ") + #define MSG_CSTEPS _UxGT("Bήματα Z ανά μμ") +#endif +#define MSG_ESTEPS _UxGT("Bήματα Ε ανά μμ") +#define MSG_E1STEPS _UxGT("Bήματα Ε1 ανά μμ") +#define MSG_E2STEPS _UxGT("Bήματα Ε2 ανά μμ") +#define MSG_E3STEPS _UxGT("Bήματα Ε3 ανά μμ") +#define MSG_E4STEPS _UxGT("Bήματα Ε4 ανά μμ") +#define MSG_E5STEPS _UxGT("Bήματα Ε5 ανά μμ") +#define MSG_TEMPERATURE _UxGT("Θερμοκρασία") +#define MSG_MOTION _UxGT("Κίνηση") +#define MSG_FILAMENT _UxGT("Νήμα") +#define MSG_VOLUMETRIC_ENABLED _UxGT("Ε σε μμ3") +#define MSG_FILAMENT_DIAM _UxGT("Διάμετρος νήματος") +#define MSG_CONTRAST _UxGT("Κοντράστ LCD") +#define MSG_STORE_EEPROM _UxGT("Αποθήκευση") +#define MSG_LOAD_EEPROM _UxGT("Φόρτωση") +#define MSG_RESTORE_FAILSAFE _UxGT("Επαναφορά ασφαλούς αντιγράφου") //SHORTEN +#define MSG_REFRESH _UxGT("Ανανέωση") +#define MSG_WATCH _UxGT("Οθόνη πληροφόρησης") +#define MSG_PREPARE _UxGT("Προετοιμασία") +#define MSG_TUNE _UxGT("Συντονισμός") +#define MSG_PAUSE_PRINT _UxGT("Παύση εκτύπωσης") +#define MSG_RESUME_PRINT _UxGT("Συνέχιση εκτύπωσης") +#define MSG_STOP_PRINT _UxGT("Διακοπή εκτύπωσης") +#define MSG_CARD_MENU _UxGT("Εκτύπωση από SD") +#define MSG_NO_CARD _UxGT("Δεν βρέθηκε SD") +#define MSG_DWELL _UxGT("Αναστολή λειτουργίας") +#define MSG_USERWAIT _UxGT("Αναμονή για χρήστη") +#define MSG_PRINT_ABORTED _UxGT("Διακόπτεται η εκτύπωση") //SHORTEN +#define MSG_NO_MOVE _UxGT("Καμία κίνηση.") +#define MSG_KILLED _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. ") +#define MSG_STOPPED _UxGT("ΔΙΑΚΟΠΗ. ") +#define MSG_CONTROL_RETRACT _UxGT("Ανάσυρση μμ") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Εναλλαγή ανάσυρσης μμ") //SHORTEN +#define MSG_CONTROL_RETRACTF _UxGT("Ανάσυρση V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Μεταπήδηση μμ") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_AUTORETRACT _UxGT("Αυτόματη ανάσυρση") +#define MSG_FILAMENTCHANGE _UxGT("Αλλαγή νήματος") +#define MSG_INIT_SDCARD _UxGT("Προετοιμασία κάρτας SD") //SHORTEN +#define MSG_CNG_SDCARD _UxGT("Αλλαγή κάρτας SD") +#define MSG_ZPROBE_OUT _UxGT("Διερεύνηση Z εκτός Επ.Εκτύπωσης") //SHORTEN +#define MSG_YX_UNHOMED _UxGT("Επαναφορά Χ/Υ πριν από Ζ") //SHORTEN +#define MSG_XYZ_UNHOMED _UxGT("Επαναφορά ΧΥΖ πρώτα") +#define MSG_ZPROBE_ZOFFSET _UxGT("Μετατόπιση Ζ") +#define MSG_BABYSTEP_X _UxGT("Μικρό βήμα Χ") +#define MSG_BABYSTEP_Y _UxGT("Μικρό βήμα Υ") +#define MSG_BABYSTEP_Z _UxGT("Μικρό βήμα Ζ") +#define MSG_ENDSTOP_ABORT _UxGT("Ακύρωση endstop ") +#define MSG_HEATING_FAILED_LCD _UxGT("Ανεπιτυχής θέρμανση") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ") +#define MSG_THERMAL_RUNAWAY _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΚΡΑΣΙΑΣ") +#define MSG_ERR_MAXTEMP _UxGT("ΠΕΡΙΤΗ ΘΕΡΜΟΚΡΑΣΙΑ") +#define MSG_ERR_MINTEMP _UxGT("ΜΗ ΕΠΑΡΚΗΣ ΘΕΡΜΟΚΡΑΣΙΑΣ") //SHORTEN +#define MSG_ERR_MAXTEMP_BED _UxGT("ΜΕΓΙΣΤΗ ΘΕΡΜΟΚΡΑΣΙΑΣ ΕΠ. ΕΚΤΥΠΩΣΗΣ") //SHORTEN +#define MSG_ERR_MINTEMP_BED _UxGT("ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΚΡΑΣΙΑΣ ΕΠ. ΕΚΤΥΠΩΣΗΣ") //SHORTEN +#define MSG_HALTED _UxGT("H εκτύπωση διακόπηκε") +#define MSG_HEATING _UxGT("Θερμαίνεται…") +#define MSG_BED_HEATING _UxGT("Θέρμανση ΕΠ. Εκτύπωσης") //SHORTEN +#define MSG_DELTA_CALIBRATE _UxGT("Βαθμονόμηση Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Βαθμονόμηση X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Βαθμονόμηση Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Βαθμονόμηση Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Βαθμονόμηση κέντρου") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Greek"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" έτοιμο."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Εισαγωγή κάρτας"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Αφαίρεση κάρτας"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Βασική Οθόνη"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Αυτόματη εκκίνηση"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση Μοτέρ"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο"); //SHORTEN - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Αρχικό σημείο X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Αρχικό σημείο Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Αρχικό σημείο Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Επαναφορά Επ. Εκτύπωσης"); //SHORTEN - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Επιπεδοποίηση επ. Εκτύπωσης περιμενει"); //SHORTEN - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Επόμενο σημείο"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Ολοκλήρωση επιπεδοποίησης!"); //SHORTEN - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ορισμός βασικών μετατοπίσεων"); //SHORTEN - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Εφαρμόστηκαν οι μετατοπίσεις"); //SHORTEN - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ορισμός προέλευσης"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" όλα"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" bed"); //SHORTEN - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); //SHORTEN - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Προθέρμανση $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Προθέρμανση $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Προθέρμανση $ End"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Προθέρμανση $ End ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Προθέρμανση $ όλα"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Προθέρμανση $ bed"); //SHORTEN - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Προθέρμανση $ επιβεβαίωση"); //SHORTEN - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Μειωση θερμοκρασιας"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ενεργοποίηση"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Απενεργοποίηση"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Εξώθηση"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Ανάσυρση"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Μετακίνηση άξονα"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Επιπεδοποίηση Επ. Εκτύπωσης"); //SHORTEN - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Επιπεδοποίηση Επ. Εκτύπωσης"); //SHORTEN - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Μετακίνηση X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Μετακίνηση Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Μετακίνηση Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Εξωθητήρας"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Εξωθητήρας *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Μετακίνηση %s μμ"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Ταχύτητα"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Επ. Εκτύπωσης Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ακροφύσιο"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Ακροφύσιο ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Κλίνη"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ταχύτητα ανεμιστήρα"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Ταχύτητα ανεμιστήρα ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Ροή"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Ροή ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Έλεγχος"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Αυτομ ρύθμιση θερ/σίας"); //SHORTEN - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Ενεργοποιημένο"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Απενεργοποιημένο"); - PROGMEM Language_Str MSG_ACC = _UxGT("Επιτάχυνση"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("Vαντίδραση ") LCD_STR_A; - PROGMEM Language_Str MSG_VB_JERK = _UxGT("Vαντίδραση ") LCD_STR_B; - PROGMEM Language_Str MSG_VC_JERK = _UxGT("Vαντίδραση ") LCD_STR_C; - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Vαντίδραση E"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("V Μέγιστο") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("V Μέγιστο") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("V Μέγιστο") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("V Μέγιστο") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("V Μέγιστο *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("V Ελάχιστο"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vελάχ. μετατόπιση"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accel"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Aμεγ ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Aμεγ ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Aμεγ ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Aμεγ ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Aμεγ *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Α-ανάσυρση"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Α-μετατόπιση"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Bήματα ανά μμ"); - PROGMEM Language_Str MSG_A_STEPS = _UxGT("Bήματα ") LCD_STR_A _UxGT(" ανά μμ"); - PROGMEM Language_Str MSG_B_STEPS = _UxGT("Bήματα ") LCD_STR_B _UxGT(" ανά μμ"); - PROGMEM Language_Str MSG_C_STEPS = _UxGT("Bήματα ") LCD_STR_C _UxGT(" ανά μμ"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Bήματα Ε ανά μμ"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("Bήματα * ανά μμ"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Θερμοκρασία"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Κίνηση"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Νήμα"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε μμ³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Διάμετρος νήματος"); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Διάμετρος νήματος *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Κοντράστ LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Αποθήκευση"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Φόρτωση"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Επαναφορά ασφαλούς αντιγράφου"); //SHORTEN - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Οθόνη πληροφόρησης"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Προετοιμασία"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Συντονισμός"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Παύση εκτύπωσης"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Συνέχιση εκτύπωσης"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Διακοπή εκτύπωσης"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Εκτύπωση από SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Δεν βρέθηκε SD"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Αναστολή λειτουργίας"); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Αναμονή για χρήστη"); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Διακόπτεται η εκτύπωση"); //SHORTEN - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Καμία κίνηση."); - PROGMEM Language_Str MSG_KILLED = _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ΔΙΑΚΟΠΗ. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ανάσυρση μμ"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυρσης μμ"); //SHORTEN - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ανάσυρση V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση μμ"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Αυτόματη ανάσυρση"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Αλλαγή νήματος"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Αλλαγή νήματος *"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Προετοιμασία κάρτας SD"); //SHORTEN - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Αλλαγή κάρτας SD"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Διερεύνηση Z εκτός Επ.Εκτύπωσης"); //SHORTEN - PROGMEM Language_Str MSG_YX_UNHOMED = _UxGT("Επαναφορά Χ/Υ πριν από Ζ"); //SHORTEN - PROGMEM Language_Str MSG_XYZ_UNHOMED = _UxGT("Επαναφορά ΧΥΖ πρώτα"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Μετατόπιση Ζ"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Μικρό βήμα Χ"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Μικρό βήμα Υ"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Μικρό βήμα Ζ"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Ακύρωση endstop "); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Ανεπιτυχής θέρμανση"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΚΡΑΣΙΑΣ"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("ΠΕΡΙΤΗ ΘΕΡΜΟΚΡΑΣΙΑ"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("ΜΗ ΕΠΑΡΚΗΣ ΘΕΡΜΟΚΡΑΣΙΑΣ"); //SHORTEN - PROGMEM Language_Str MSG_HALTED = _UxGT("H εκτύπωση διακόπηκε"); - PROGMEM Language_Str MSG_HEATING = _UxGT("Θερμαίνεται…"); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Θέρμανση ΕΠ. Εκτύπωσης"); //SHORTEN - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Βαθμονόμηση Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Βαθμονόμηση X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Βαθμονόμηση Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Βαθμονόμηση Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Βαθμονόμηση κέντρου"); - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Εσφαλμένος εκτυπωτής"); -} +#endif // LANGUAGE_EL_H diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h deleted file mode 100644 index 3db6fccdf0..0000000000 --- a/Marlin/src/lcd/language/language_el_gr.h +++ /dev/null @@ -1,193 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Greek (Greece) - * - * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html - */ - -#define DISPLAY_CHARSET_ISO10646_GREEK - -namespace Language_el_gr { - using namespace Language_en; // Inherit undefined strings from English - - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Greek (Greece)"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" έτοιμο."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Εισαγωγή κάρτας"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Αφαίρεση κάρτας"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters - PROGMEM Language_Str MSG_MAIN = _UxGT("Βασική Οθόνη"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Αυτόματη εκκίνηση"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση βηματιστή"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Αρχικό σημείο X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Αρχικό σημείο Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Αρχικό σημείο Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Επαναφορά στο αρχικό σημείο ΧΥΖ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Κάντε κλικ για να ξεκινήσετε"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Επόμενο σημείο"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Ολοκλήρωση επιπεδοποίησης!"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ορισμός βασικών μετατοπίσεων"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Εφαρμόστηκαν οι μετατοπίσεις"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ορισμός προέλευσης"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" όλα"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" κλίνη"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Προθέρμανση $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Προθέρμανση $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Προθέρμανση $ End"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Προθέρμανση $ End ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Προθέρμανση $ όλα"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Προθέρμανση $ κλίνη"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Προθέρμανση $ επιβεβαίωση"); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Μειωση θερμοκρασιας"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ενεργοποίηση"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Απενεργοποίηση"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Εξώθηση"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Ανάσυρση"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Μετακίνηση άξονα"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Επιπεδοποίηση κλίνης"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Επιπεδοποίηση κλίνης"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Μετακίνηση X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Μετακίνηση Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Μετακίνηση Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Εξωθητήρας"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Εξωθητήρας *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Μετακίνηση %s μμ"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Ταχύτητα"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Κλίνη Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ακροφύσιο"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Ακροφύσιο ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Κλίνη"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ταχύτητα ανεμιστήρα"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Ταχύτητα ανεμιστήρα ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Ροή"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Ροή ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Έλεγχος"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Αυτομ. ρύθμιση θερμοκρασίας"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Ενεργοποιημένο"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Απενεργοποιημένο"); - PROGMEM Language_Str MSG_ACC = _UxGT("Επιτάχυνση"); - PROGMEM Language_Str MSG_JERK = _UxGT("Vαντίδραση"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("Vαντίδραση ") LCD_STR_A; - PROGMEM Language_Str MSG_VB_JERK = _UxGT("Vαντίδραση ") LCD_STR_B; - PROGMEM Language_Str MSG_VC_JERK = _UxGT("Vαντίδραση ") LCD_STR_C; - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Vαντίδραση E"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vμεγ ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vμεγ ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vμεγ ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vμεγ ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vμεγ *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vελαχ"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vελάχ. μετατόπιση"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accel"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Aμεγ ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Aμεγ ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Aμεγ ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Aμεγ ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Aμεγ *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Α-ανάσυρση"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Α-μετατόπιση"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Bήματα ανά μμ"); - PROGMEM Language_Str MSG_A_STEPS = _UxGT("Bήματα ") LCD_STR_A _UxGT(" ανά μμ"); - PROGMEM Language_Str MSG_B_STEPS = _UxGT("Bήματα ") LCD_STR_B _UxGT(" ανά μμ"); - PROGMEM Language_Str MSG_C_STEPS = _UxGT("Bήματα ") LCD_STR_C _UxGT(" ανά μμ"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Bήματα Ε ανά μμ"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("Bήματα * ανά μμ"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Θερμοκρασία"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Κίνηση"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Νήμα"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε μμ³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Διάμετρος νήματος"); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Διάμετρος νήματος *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Κοντράστ LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Αποθήκευση"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Φόρτωση"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Επαναφορά ασφαλούς αντιγράφου"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Οθόνη πληροφόρησης"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Προετοιμασία"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Συντονισμός"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Παύση εκτύπωσης"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Συνέχιση εκτύπωσης"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Διακοπή εκτύπωσης"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Εκτύπωση από SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Δεν βρέθηκε SD"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Αναστολή λειτουργίας…"); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Αναμονή για χρήστη…"); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Διακόπτεται η εκτύπωση"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Καμία κίνηση."); - PROGMEM Language_Str MSG_KILLED = _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ΔΙΑΚΟΠΗ. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ανάσυρση μμ"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυρσης μμ"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ανάσυρση V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση μμ"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Αυτόματη ανάσυρση"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Αλλαγή νήματος"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Αλλαγή νήματος *"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Προετοιμασία κάρτας SD"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Αλλαγή κάρτας SD"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Διερεύνηση Z εκτός κλίνης"); - PROGMEM Language_Str MSG_YX_UNHOMED = _UxGT("Επαναφορά Χ/Υ πριν από Ζ"); - PROGMEM Language_Str MSG_XYZ_UNHOMED = _UxGT("Επαναφορά ΧΥΖ πρώτα"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Μετατόπιση Ζ"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Μικρό βήμα Χ"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Μικρό βήμα Υ"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Μικρό βήμα Ζ"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Ματαίωση endstop "); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Ανεπιτυχής θέρμανση"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Λάθος: ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΤΗΤΑΣ"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ"); - PROGMEM Language_Str MSG_HEATING = _UxGT("Θερμαίνεται…"); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Θέρμανση κλίνης…"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Βαθμονόμηση Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Βαθμονόμηση X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Βαθμονόμηση Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Βαθμονόμηση Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Βαθμονόμηση κέντρου"); - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Εσφαλμένος εκτυπωτής"); -} diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index e8b4769cc2..7e976a5b4c 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,19 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * English * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_EN_H +#define LANGUAGE_EN_H #define en 1234 #if LCD_LANGUAGE == en @@ -34,637 +36,1061 @@ #endif #undef en -namespace Language_en { - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("English"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Ready."); - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("YES"); - PROGMEM Language_Str MSG_NO = _UxGT("NO"); - PROGMEM Language_Str MSG_BACK = _UxGT("Back"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Aborting..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media Inserted"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media Removed"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Waiting for media"); - PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD Init Fail"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Media read error"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB device removed"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB start failed"); - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall Overflow"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Main"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Advanced Settings"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuration"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Disable Steppers"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug Menu"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Progress Bar Test"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Align"); - PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisted Tramming"); - PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Iteration: %i"); - PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Accuracy Decreasing!"); - PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Accuracy Achieved"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Homing XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click to Begin"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Next Point"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Leveling Done!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Height"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Set Home Offsets"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets Applied"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Set Origin"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preheat ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preheat ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" All"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Bed"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Conf"); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Preheat $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Preheat $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preheat $ End"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preheat $ End ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preheat $ All"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preheat $ Bed"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preheat $ Conf"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Preheat Custom"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Cooldown"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequency"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Laser Control"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Off"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser On"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laser Power"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindle Control"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Off"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle On"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Power"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Switch Power On"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Switch Power Off"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrude"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Retract"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Move Axis"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bed Leveling"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Level Bed"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Level Corners"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Next Corner"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Mesh Editor"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Edit Mesh"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Mesh Editing Stopped"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Probing Point"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Value"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Custom Commands"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); - PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Probe out of bounds"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviation"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mode"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Mirrored Copy"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2nd Nozzle X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2nd Nozzle Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2nd Nozzle Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Doing G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Tools"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Tilting Point"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manually Build Mesh"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Place Shim & Measure"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Measure"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Remove & Measure Bed"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Moving to next"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activate UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deactivate UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Bed Temp"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hotend Temp"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Mesh Edit"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit Custom Mesh"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Fine Tuning Mesh"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Done Editing Mesh"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Build Custom Mesh"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Build Mesh"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Build Mesh ($)"); - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Build Cold Mesh"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Adjust Mesh Height"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Height Amount"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validate Mesh"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Validate Mesh ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validate Custom Mesh"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Heating Bed"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Heating Nozzle"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manual priming..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fixed Length Prime"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Done Priming"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Canceled"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Leaving G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continue Bed Mesh"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Mesh Leveling"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Point Leveling"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Grid Mesh Leveling"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Level Mesh"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Side Points"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Map Type"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Output Mesh Map"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Output for Host"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Output for CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Off Printer Backup"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Output UBL Info"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Fill-in Amount"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manual Fill-in"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Smart Fill-in"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Fill-in Mesh"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidate All"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidate Closest"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Fine Tune All"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Fine Tune Closest"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Storage"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memory Slot"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Load Bed Mesh"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Save Bed Mesh"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Mesh %i Loaded"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Mesh %i Saved"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("No Storage"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: UBL Save"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: UBL Restore"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Stopped"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Step-By-Step UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Build Cold Mesh"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Smart Fill-in"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validate Mesh"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Fine Tune All"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validate Mesh"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Fine Tune All"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Save Bed Mesh"); - - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Control"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Lights"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Light Presets"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Red"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Yellow"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Green"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blue"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violet"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("White"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Default"); - PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Channel ="); - PROGMEM Language_Str MSG_LEDS2 = _UxGT("Lights #2"); - PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Light #2 Presets"); - PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Brightness"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Custom Lights"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Red Intensity"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Green Intensity"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Blue Intensity"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("White Intensity"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brightness"); - - PROGMEM Language_Str MSG_MOVING = _UxGT("Moving..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Free XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Move X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Move Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Move Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend too cold"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Move %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Move 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Move 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Move 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Speed"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Nozzle ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Nozzle Parked"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Nozzle Standby"); - PROGMEM Language_Str MSG_BED = _UxGT("Bed"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Enclosure"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Speed"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan Speed ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Stored Fan ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra Fan Speed"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra Fan Speed ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Controller Fan"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Idle Speed"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto Mode"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Active Speed"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Idle Period"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Flow"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flow ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("On"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Off"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune failed. Bad extruder."); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed. Temperature too high."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Select"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Select *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Accel"); - PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Jerk"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocity"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VTrav Min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Acceleration"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-Retract"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-Travel"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frequency max"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Feed min"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steps/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" Steps/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" Steps/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" Steps/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E steps/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* Steps/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Motion"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Unload mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Load mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advance K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Contrast"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Store Settings"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Load Settings"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restore Defaults"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initialize EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Error"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Error"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Error"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Settings Stored"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Media Update"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reset Printer"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info Screen"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepare"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Tune"); - PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Power monitor"); - PROGMEM Language_Str MSG_CURRENT = _UxGT("Current"); - PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Voltage"); - PROGMEM Language_Str MSG_POWER = _UxGT("Power"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Start Print"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Next"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Init"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Print"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignore"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancel"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Done"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Back"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Proceed"); - PROGMEM Language_Str MSG_PAUSING = _UxGT("Pausing..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause Print"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Resume Print"); - PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Host Start"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop Print"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Printing Object"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancel Object"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancel Object ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Power Outage"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print from Media"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No Media"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Sleep..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Click to Resume..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Print Paused"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Printing..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print Aborted"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Print Done"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("No Move."); - PROGMEM Language_Str MSG_KILLED = _UxGT("KILLED. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPED. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retract mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Swap Length"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Swap Extra"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purge Length"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Tool Change"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Raise"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prime Speed"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Retract Speed"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Park Head"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Fan Speed"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Fan Time"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Tool Migration"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migration"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Last Extruder"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrate to *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Change Filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Change Filament *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Load Filament"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Load Filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Unload Filament"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Unload Filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Unload All"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Attach Media"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Change Media"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Release Media"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Probe Past Bed"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Skew Factor"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Stow"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Deploy"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("DANGER: Bad settings can cause damage! Proceed anyway?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Save"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Deploy TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Deploy Z-Probe"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Stow Z-Probe"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s First"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Probe Offsets"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Probe X Offset"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Probe Y Offset"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Probe Z Offset"); - PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Move Nozzle to Bed"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP"); - PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Please Reset"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Heating..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Cooling..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bed Heating..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Bed Cooling..."); - PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Probe Heating..."); - PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Probe Cooling..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chamber Heating..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chamber Cooling..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibration"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrate X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrate Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrate Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrate Center"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Settings"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibration"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Set Delta Height"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Probe Z-offset"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Height"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radius"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("About Printer"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Printer Info"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Point Leveling"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Linear Leveling"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilinear Leveling"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mesh Leveling"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Printer Stats"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Board Info"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruders"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocol"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: OFF"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: ON"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout"); - - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Case Light"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Light Brightness"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("INCORRECT PRINTER"); - - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Print Count"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total Print Time"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded Total"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Prints"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded"); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Drive Strength"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CONNECTION ERROR"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Write"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT CHANGE"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PRINT PAUSED"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("LOAD FILAMENT"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("UNLOAD FILAMENT"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("RESUME OPTIONS:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purge more"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continue"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout Sensor"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout Dist mm"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Homing Failed"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing Failed"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOOSE FILAMENT"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Update MMU Firmware!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Needs Attention."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("MMU Resume"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("MMU Resuming..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU Load"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("MMU Load All"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Load to Nozzle"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Eject"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Eject ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Unload"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Loading Fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejecting Fil. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Unloading Fil...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("All"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reset MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Resetting..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Remove, click"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Component ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Mixer"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Full Gradient"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Toggle Mix"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cycle Mix"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Reverse Gradient"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Active V-tool"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Start V-tool"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" End V-tool"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reset V-tools"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit V-tool Mix"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools Were Reset"); - PROGMEM Language_Str MSG_START_Z = _UxGT("Start Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" End Z:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Games"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); - - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Bad page index"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Bad page speed"); - - PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Edit Password"); - PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login Required"); - PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Password Settings"); - PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Enter Digit"); - PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Set/Edit Password"); - PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Remove Password"); - PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Password is "); - PROGMEM Language_Str MSG_START_OVER = _UxGT("Start Over"); - PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Remember to Save!"); - PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Password Removed"); - - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Press Button", "to resume print")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parking...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Wait for", "filament change", "to start")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insert filament", "and press button", "to continue")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Press button", "to heat nozzle")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle heating", "Please wait...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wait for", "filament unload")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wait for", "filament load")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Wait for", "filament purge")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Click to finish", "filament purge")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wait for print", "to resume...")); - #else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Click to continue")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parking...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Please wait...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insert and Click")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Click to heat")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Heating...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejecting...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Loading...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purging...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click to finish")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Resuming...")); - #endif - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver Current"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" in:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Backlash"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correction"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Level X Axis"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrate"); - #if ENABLED(TOUCH_UI_FTDI_EVE) - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Idle timeout, temperature decreased. Press Okay to reheat and again to resume."); - #else - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Heater Timeout"); - #endif - PROGMEM Language_Str MSG_REHEAT = _UxGT("Reheat"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Reheating..."); - - PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Probe Wizard"); -} - -#if FAN_COUNT == 1 - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED -#else - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#ifndef CHARSIZE + #define CHARSIZE 1 #endif + +#ifndef WELCOME_MSG + #define WELCOME_MSG MACHINE_NAME _UxGT(" Ready.") +#endif +#ifndef MSG_BACK + #define MSG_BACK _UxGT("Back") +#endif +#ifndef MSG_SD_INSERTED + #define MSG_SD_INSERTED _UxGT("Card inserted") +#endif +#ifndef MSG_SD_REMOVED + #define MSG_SD_REMOVED _UxGT("Card removed") +#endif +#ifndef MSG_LCD_ENDSTOPS + #define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters +#endif +#ifndef MSG_LCD_SOFT_ENDSTOPS + #define MSG_LCD_SOFT_ENDSTOPS _UxGT("Soft Endstops") +#endif +#ifndef MSG_MAIN + #define MSG_MAIN _UxGT("Main") +#endif +#ifndef MSG_ADVANCED_SETTINGS + #define MSG_ADVANCED_SETTINGS _UxGT("Advanced Settings") +#endif +#ifndef MSG_CONFIGURATION + #define MSG_CONFIGURATION _UxGT("Configuration") +#endif +#ifndef MSG_AUTOSTART + #define MSG_AUTOSTART _UxGT("Autostart") +#endif +#ifndef MSG_DISABLE_STEPPERS + #define MSG_DISABLE_STEPPERS _UxGT("Disable steppers") +#endif +#ifndef MSG_DEBUG_MENU + #define MSG_DEBUG_MENU _UxGT("Debug Menu") +#endif +#ifndef MSG_PROGRESS_BAR_TEST + #define MSG_PROGRESS_BAR_TEST _UxGT("Progress Bar Test") +#endif +#ifndef MSG_AUTO_HOME + #define MSG_AUTO_HOME _UxGT("Auto home") +#endif +#ifndef MSG_AUTO_HOME_X + #define MSG_AUTO_HOME_X _UxGT("Home X") +#endif +#ifndef MSG_AUTO_HOME_Y + #define MSG_AUTO_HOME_Y _UxGT("Home Y") +#endif +#ifndef MSG_AUTO_HOME_Z + #define MSG_AUTO_HOME_Z _UxGT("Home Z") +#endif +#ifndef MSG_TMC_Z_CALIBRATION + #define MSG_TMC_Z_CALIBRATION _UxGT("Calibrate Z") +#endif +#ifndef MSG_LEVEL_BED_HOMING + #define MSG_LEVEL_BED_HOMING _UxGT("Homing XYZ") +#endif +#ifndef MSG_LEVEL_BED_WAITING + #define MSG_LEVEL_BED_WAITING _UxGT("Click to Begin") +#endif +#ifndef MSG_LEVEL_BED_NEXT_POINT + #define MSG_LEVEL_BED_NEXT_POINT _UxGT("Next Point") +#endif +#ifndef MSG_LEVEL_BED_DONE + #define MSG_LEVEL_BED_DONE _UxGT("Leveling Done!") +#endif +#ifndef MSG_Z_FADE_HEIGHT + #define MSG_Z_FADE_HEIGHT _UxGT("Fade Height") +#endif +#ifndef MSG_SET_HOME_OFFSETS + #define MSG_SET_HOME_OFFSETS _UxGT("Set home offsets") +#endif +#ifndef MSG_HOME_OFFSETS_APPLIED + #define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets applied") +#endif +#ifndef MSG_SET_ORIGIN + #define MSG_SET_ORIGIN _UxGT("Set origin") +#endif +#ifndef MSG_PREHEAT_1 + #define MSG_PREHEAT_1 _UxGT("Preheat PLA") +#endif +#ifndef MSG_PREHEAT_1_N + #define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#endif +#ifndef MSG_PREHEAT_1_ALL + #define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" All") +#endif +#ifndef MSG_PREHEAT_1_END + #define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" End") +#endif +#ifndef MSG_PREHEAT_1_BEDONLY + #define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Bed") +#endif +#ifndef MSG_PREHEAT_1_SETTINGS + #define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" conf") +#endif +#ifndef MSG_PREHEAT_2 + #define MSG_PREHEAT_2 _UxGT("Preheat ABS") +#endif +#ifndef MSG_PREHEAT_2_N + #define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#endif +#ifndef MSG_PREHEAT_2_ALL + #define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" All") +#endif +#ifndef MSG_PREHEAT_2_END + #define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" End") +#endif +#ifndef MSG_PREHEAT_2_BEDONLY + #define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Bed") +#endif +#ifndef MSG_PREHEAT_2_SETTINGS + #define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" conf") +#endif +#ifndef MSG_PREHEAT_CUSTOM + #define MSG_PREHEAT_CUSTOM _UxGT("Preheat Custom") +#endif +#ifndef MSG_COOLDOWN + #define MSG_COOLDOWN _UxGT("Cooldown") +#endif +#ifndef MSG_SWITCH_PS_ON + #define MSG_SWITCH_PS_ON _UxGT("Switch power on") +#endif +#ifndef MSG_SWITCH_PS_OFF + #define MSG_SWITCH_PS_OFF _UxGT("Switch power off") +#endif +#ifndef MSG_EXTRUDE + #define MSG_EXTRUDE _UxGT("Extrude") +#endif +#ifndef MSG_RETRACT + #define MSG_RETRACT _UxGT("Retract") +#endif +#ifndef MSG_MOVE_AXIS + #define MSG_MOVE_AXIS _UxGT("Move axis") +#endif +#ifndef MSG_BED_LEVELING + #define MSG_BED_LEVELING _UxGT("Bed Leveling") +#endif +#ifndef MSG_LEVEL_BED + #define MSG_LEVEL_BED _UxGT("Level bed") +#endif +#ifndef MSG_LEVEL_CORNERS + #define MSG_LEVEL_CORNERS _UxGT("Level corners") +#endif +#ifndef MSG_NEXT_CORNER + #define MSG_NEXT_CORNER _UxGT("Next corner") +#endif +#ifndef MSG_EDITING_STOPPED + #define MSG_EDITING_STOPPED _UxGT("Mesh Editing Stopped") +#endif +#ifndef MSG_USER_MENU + #define MSG_USER_MENU _UxGT("Custom User Commands") +#endif +#ifndef MSG_UBL_DOING_G29 + #define MSG_UBL_DOING_G29 _UxGT("Doing G29") +#endif +#ifndef MSG_UBL_UNHOMED + #define MSG_UBL_UNHOMED _UxGT("Home XYZ first") +#endif +#ifndef MSG_UBL_TOOLS + #define MSG_UBL_TOOLS _UxGT("UBL Tools") +#endif +#ifndef MSG_UBL_LEVEL_BED + #define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") +#endif +#ifndef MSG_IDEX_MENU + #define MSG_IDEX_MENU _UxGT("IDEX Mode") +#endif +#ifndef MSG_IDEX_MODE_AUTOPARK + #define MSG_IDEX_MODE_AUTOPARK _UxGT("Auto-Park") +#endif +#ifndef MSG_IDEX_MODE_DUPLICATE + #define MSG_IDEX_MODE_DUPLICATE _UxGT("Duplication") +#endif +#ifndef MSG_IDEX_MODE_FULL_CTRL + #define MSG_IDEX_MODE_FULL_CTRL _UxGT("Full control") +#endif +#ifndef MSG_UBL_MANUAL_MESH + #define MSG_UBL_MANUAL_MESH _UxGT("Manually Build Mesh") +#endif +#ifndef MSG_UBL_BC_INSERT + #define MSG_UBL_BC_INSERT _UxGT("Place shim & measure") +#endif +#ifndef MSG_UBL_BC_INSERT2 + #define MSG_UBL_BC_INSERT2 _UxGT("Measure") +#endif +#ifndef MSG_UBL_BC_REMOVE + #define MSG_UBL_BC_REMOVE _UxGT("Remove & measure bed") +#endif +#ifndef MSG_UBL_MOVING_TO_NEXT + #define MSG_UBL_MOVING_TO_NEXT _UxGT("Moving to next") +#endif +#ifndef MSG_UBL_ACTIVATE_MESH + #define MSG_UBL_ACTIVATE_MESH _UxGT("Activate UBL") +#endif +#ifndef MSG_UBL_DEACTIVATE_MESH + #define MSG_UBL_DEACTIVATE_MESH _UxGT("Deactivate UBL") +#endif +#ifndef MSG_UBL_SET_BED_TEMP + #define MSG_UBL_SET_BED_TEMP _UxGT("Bed Temp") +#endif +#ifndef MSG_UBL_CUSTOM_BED_TEMP + #define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP +#endif +#ifndef MSG_UBL_SET_HOTEND_TEMP + #define MSG_UBL_SET_HOTEND_TEMP _UxGT("Hotend Temp") +#endif +#ifndef MSG_UBL_CUSTOM_HOTEND_TEMP + #define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP +#endif +#ifndef MSG_UBL_MESH_EDIT + #define MSG_UBL_MESH_EDIT _UxGT("Mesh Edit") +#endif +#ifndef MSG_UBL_EDIT_CUSTOM_MESH + #define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Edit Custom Mesh") +#endif +#ifndef MSG_UBL_FINE_TUNE_MESH + #define MSG_UBL_FINE_TUNE_MESH _UxGT("Fine Tuning Mesh") +#endif +#ifndef MSG_UBL_DONE_EDITING_MESH + #define MSG_UBL_DONE_EDITING_MESH _UxGT("Done Editing Mesh") +#endif +#ifndef MSG_UBL_BUILD_CUSTOM_MESH + #define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Build Custom Mesh") +#endif +#ifndef MSG_UBL_BUILD_MESH_MENU + #define MSG_UBL_BUILD_MESH_MENU _UxGT("Build Mesh") +#endif +#ifndef MSG_UBL_BUILD_PLA_MESH + #define MSG_UBL_BUILD_PLA_MESH _UxGT("Build PLA Mesh") +#endif +#ifndef MSG_UBL_BUILD_ABS_MESH + #define MSG_UBL_BUILD_ABS_MESH _UxGT("Build ABS Mesh") +#endif +#ifndef MSG_UBL_BUILD_COLD_MESH + #define MSG_UBL_BUILD_COLD_MESH _UxGT("Build Cold Mesh") +#endif +#ifndef MSG_UBL_MESH_HEIGHT_ADJUST + #define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Adjust Mesh Height") +#endif +#ifndef MSG_UBL_MESH_HEIGHT_AMOUNT + #define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Height Amount") +#endif +#ifndef MSG_UBL_VALIDATE_MESH_MENU + #define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Validate Mesh") +#endif +#ifndef MSG_UBL_VALIDATE_PLA_MESH + #define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Validate PLA Mesh") +#endif +#ifndef MSG_UBL_VALIDATE_ABS_MESH + #define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Validate ABS Mesh") +#endif +#ifndef MSG_UBL_VALIDATE_CUSTOM_MESH + #define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Validate Custom Mesh") +#endif +#ifndef MSG_UBL_CONTINUE_MESH + #define MSG_UBL_CONTINUE_MESH _UxGT("Continue Bed Mesh") +#endif +#ifndef MSG_UBL_MESH_LEVELING + #define MSG_UBL_MESH_LEVELING _UxGT("Mesh Leveling") +#endif +#ifndef MSG_UBL_3POINT_MESH_LEVELING + #define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-Point Leveling") +#endif +#ifndef MSG_UBL_GRID_MESH_LEVELING + #define MSG_UBL_GRID_MESH_LEVELING _UxGT("Grid Mesh Leveling") +#endif +#ifndef MSG_UBL_MESH_LEVEL + #define MSG_UBL_MESH_LEVEL _UxGT("Level Mesh") +#endif +#ifndef MSG_UBL_SIDE_POINTS + #define MSG_UBL_SIDE_POINTS _UxGT("Side Points") +#endif +#ifndef MSG_UBL_MAP_TYPE + #define MSG_UBL_MAP_TYPE _UxGT("Map Type") +#endif +#ifndef MSG_UBL_OUTPUT_MAP + #define MSG_UBL_OUTPUT_MAP _UxGT("Output Mesh Map") +#endif +#ifndef MSG_UBL_OUTPUT_MAP_HOST + #define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Output for Host") +#endif +#ifndef MSG_UBL_OUTPUT_MAP_CSV + #define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Output for CSV") +#endif +#ifndef MSG_UBL_OUTPUT_MAP_BACKUP + #define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Off Printer Backup") +#endif +#ifndef MSG_UBL_INFO_UBL + #define MSG_UBL_INFO_UBL _UxGT("Output UBL Info") +#endif +#ifndef MSG_UBL_EDIT_MESH_MENU + #define MSG_UBL_EDIT_MESH_MENU _UxGT("Edit Mesh") +#endif +#ifndef MSG_UBL_FILLIN_AMOUNT + #define MSG_UBL_FILLIN_AMOUNT _UxGT("Fill-in Amount") +#endif +#ifndef MSG_UBL_MANUAL_FILLIN + #define MSG_UBL_MANUAL_FILLIN _UxGT("Manual Fill-in") +#endif +#ifndef MSG_UBL_SMART_FILLIN + #define MSG_UBL_SMART_FILLIN _UxGT("Smart Fill-in") +#endif +#ifndef MSG_UBL_FILLIN_MESH + #define MSG_UBL_FILLIN_MESH _UxGT("Fill-in Mesh") +#endif +#ifndef MSG_UBL_INVALIDATE_ALL + #define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidate All") +#endif +#ifndef MSG_UBL_INVALIDATE_CLOSEST + #define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidate Closest") +#endif +#ifndef MSG_UBL_FINE_TUNE_ALL + #define MSG_UBL_FINE_TUNE_ALL _UxGT("Fine Tune All") +#endif +#ifndef MSG_UBL_FINE_TUNE_CLOSEST + #define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Fine Tune Closest") +#endif +#ifndef MSG_UBL_STORAGE_MESH_MENU + #define MSG_UBL_STORAGE_MESH_MENU _UxGT("Mesh Storage") +#endif +#ifndef MSG_UBL_STORAGE_SLOT + #define MSG_UBL_STORAGE_SLOT _UxGT("Memory Slot") +#endif +#ifndef MSG_UBL_LOAD_MESH + #define MSG_UBL_LOAD_MESH _UxGT("Load Bed Mesh") +#endif +#ifndef MSG_UBL_SAVE_MESH + #define MSG_UBL_SAVE_MESH _UxGT("Save Bed Mesh") +#endif +#ifndef MSG_MESH_LOADED + #define MSG_MESH_LOADED _UxGT("Mesh %i loaded") +#endif +#ifndef MSG_MESH_SAVED + #define MSG_MESH_SAVED _UxGT("Mesh %i saved") +#endif +#ifndef MSG_NO_STORAGE + #define MSG_NO_STORAGE _UxGT("No storage") +#endif +#ifndef MSG_UBL_SAVE_ERROR + #define MSG_UBL_SAVE_ERROR _UxGT("Err: UBL Save") +#endif +#ifndef MSG_UBL_RESTORE_ERROR + #define MSG_UBL_RESTORE_ERROR _UxGT("Err: UBL Restore") +#endif +#ifndef MSG_UBL_Z_OFFSET_STOPPED + #define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Offset Stopped") +#endif +#ifndef MSG_UBL_STEP_BY_STEP_MENU + #define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Step-By-Step UBL") +#endif + +#ifndef MSG_LED_CONTROL + #define MSG_LED_CONTROL _UxGT("LED Control") +#endif +#ifndef MSG_LEDS + #define MSG_LEDS _UxGT("Lights") +#endif +#ifndef MSG_LED_PRESETS + #define MSG_LED_PRESETS _UxGT("Light Presets") +#endif +#ifndef MSG_SET_LEDS_RED + #define MSG_SET_LEDS_RED _UxGT("Red") +#endif +#ifndef MSG_SET_LEDS_ORANGE + #define MSG_SET_LEDS_ORANGE _UxGT("Orange") +#endif +#ifndef MSG_SET_LEDS_YELLOW + #define MSG_SET_LEDS_YELLOW _UxGT("Yellow") +#endif +#ifndef MSG_SET_LEDS_GREEN + #define MSG_SET_LEDS_GREEN _UxGT("Green") +#endif +#ifndef MSG_SET_LEDS_BLUE + #define MSG_SET_LEDS_BLUE _UxGT("Blue") +#endif +#ifndef MSG_SET_LEDS_INDIGO + #define MSG_SET_LEDS_INDIGO _UxGT("Indigo") +#endif +#ifndef MSG_SET_LEDS_VIOLET + #define MSG_SET_LEDS_VIOLET _UxGT("Violet") +#endif +#ifndef MSG_SET_LEDS_WHITE + #define MSG_SET_LEDS_WHITE _UxGT("White") +#endif +#ifndef MSG_SET_LEDS_DEFAULT + #define MSG_SET_LEDS_DEFAULT _UxGT("Default") +#endif +#ifndef MSG_CUSTOM_LEDS + #define MSG_CUSTOM_LEDS _UxGT("Custom Lights") +#endif +#ifndef MSG_INTENSITY_R + #define MSG_INTENSITY_R _UxGT("Red Intensity") +#endif +#ifndef MSG_INTENSITY_G + #define MSG_INTENSITY_G _UxGT("Green Intensity") +#endif +#ifndef MSG_INTENSITY_B + #define MSG_INTENSITY_B _UxGT("Blue Intensity") +#endif +#ifndef MSG_INTENSITY_W + #define MSG_INTENSITY_W _UxGT("White Intensity") +#endif +#ifndef MSG_LED_BRIGHTNESS + #define MSG_LED_BRIGHTNESS _UxGT("Brightness") +#endif + +#ifndef MSG_MOVING + #define MSG_MOVING _UxGT("Moving...") +#endif +#ifndef MSG_FREE_XY + #define MSG_FREE_XY _UxGT("Free XY") +#endif +#ifndef MSG_MOVE_X + #define MSG_MOVE_X _UxGT("Move X") +#endif +#ifndef MSG_MOVE_Y + #define MSG_MOVE_Y _UxGT("Move Y") +#endif +#ifndef MSG_MOVE_Z + #define MSG_MOVE_Z _UxGT("Move Z") +#endif +#ifndef MSG_MOVE_E + #define MSG_MOVE_E _UxGT("Extruder") +#endif +#ifndef MSG_MOVE_01MM + #define MSG_MOVE_01MM _UxGT("Move 0.1mm") +#endif +#ifndef MSG_MOVE_1MM + #define MSG_MOVE_1MM _UxGT("Move 1mm") +#endif +#ifndef MSG_MOVE_10MM + #define MSG_MOVE_10MM _UxGT("Move 10mm") +#endif +#ifndef MSG_SPEED + #define MSG_SPEED _UxGT("Speed") +#endif +#ifndef MSG_BED_Z + #define MSG_BED_Z _UxGT("Bed Z") +#endif +#ifndef MSG_NOZZLE + #define MSG_NOZZLE _UxGT("Nozzle") +#endif +#ifndef MSG_BED + #define MSG_BED _UxGT("Bed") +#endif +#ifndef MSG_FAN_SPEED + #define MSG_FAN_SPEED _UxGT("Fan speed") +#endif +#ifndef MSG_EXTRA_FAN_SPEED + #define MSG_EXTRA_FAN_SPEED _UxGT("Extra fan speed") +#endif +#ifndef MSG_FLOW + #define MSG_FLOW _UxGT("Flow") +#endif +#ifndef MSG_CONTROL + #define MSG_CONTROL _UxGT("Control") +#endif +#ifndef MSG_MIN + #define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#endif +#ifndef MSG_MAX + #define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#endif +#ifndef MSG_FACTOR + #define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") +#endif +#ifndef MSG_AUTOTEMP + #define MSG_AUTOTEMP _UxGT("Autotemp") +#endif +#ifndef MSG_ON + #define MSG_ON _UxGT("On ") +#endif +#ifndef MSG_OFF + #define MSG_OFF _UxGT("Off") +#endif +#ifndef MSG_PID_P + #define MSG_PID_P _UxGT("PID-P") +#endif +#ifndef MSG_PID_I + #define MSG_PID_I _UxGT("PID-I") +#endif +#ifndef MSG_PID_D + #define MSG_PID_D _UxGT("PID-D") +#endif +#ifndef MSG_PID_C + #define MSG_PID_C _UxGT("PID-C") +#endif +#ifndef MSG_SELECT + #define MSG_SELECT _UxGT("Select") +#endif +#ifndef MSG_ACC + #define MSG_ACC _UxGT("Accel") +#endif +#ifndef MSG_JERK + #define MSG_JERK _UxGT("Jerk") +#endif +#if IS_KINEMATIC + #ifndef MSG_VA_JERK + #define MSG_VA_JERK _UxGT("Va-jerk") + #endif + #ifndef MSG_VB_JERK + #define MSG_VB_JERK _UxGT("Vb-jerk") + #endif + #ifndef MSG_VC_JERK + #define MSG_VC_JERK _UxGT("Vc-jerk") + #endif +#else + #ifndef MSG_VA_JERK + #define MSG_VA_JERK _UxGT("Vx-jerk") + #endif + #ifndef MSG_VB_JERK + #define MSG_VB_JERK _UxGT("Vy-jerk") + #endif + #ifndef MSG_VC_JERK + #define MSG_VC_JERK _UxGT("Vz-jerk") + #endif +#endif +#ifndef MSG_VE_JERK + #define MSG_VE_JERK _UxGT("Ve-jerk") +#endif +#ifndef MSG_JUNCTION_DEVIATION + #define MSG_JUNCTION_DEVIATION _UxGT("Junction Dev") +#endif +#ifndef MSG_VELOCITY + #define MSG_VELOCITY _UxGT("Velocity") +#endif +#ifndef MSG_VMAX + #define MSG_VMAX _UxGT("Vmax ") +#endif +#ifndef MSG_VMIN + #define MSG_VMIN _UxGT("Vmin") +#endif +#ifndef MSG_VTRAV_MIN + #define MSG_VTRAV_MIN _UxGT("VTrav min") +#endif +#ifndef MSG_ACCELERATION + #define MSG_ACCELERATION _UxGT("Acceleration") +#endif +#ifndef MSG_AMAX + #define MSG_AMAX _UxGT("Amax ") +#endif +#ifndef MSG_A_RETRACT + #define MSG_A_RETRACT _UxGT("A-retract") +#endif +#ifndef MSG_A_TRAVEL + #define MSG_A_TRAVEL _UxGT("A-travel") +#endif +#ifndef MSG_STEPS_PER_MM + #define MSG_STEPS_PER_MM _UxGT("Steps/mm") +#endif +#if IS_KINEMATIC + #ifndef MSG_ASTEPS + #define MSG_ASTEPS _UxGT("Asteps/mm") + #endif + #ifndef MSG_BSTEPS + #define MSG_BSTEPS _UxGT("Bsteps/mm") + #endif + #ifndef MSG_CSTEPS + #define MSG_CSTEPS _UxGT("Csteps/mm") + #endif +#else + #ifndef MSG_ASTEPS + #define MSG_ASTEPS _UxGT("Xsteps/mm") + #endif + #ifndef MSG_BSTEPS + #define MSG_BSTEPS _UxGT("Ysteps/mm") + #endif + #ifndef MSG_CSTEPS + #define MSG_CSTEPS _UxGT("Zsteps/mm") + #endif +#endif +#ifndef MSG_ESTEPS + #define MSG_ESTEPS _UxGT("Esteps/mm") +#endif +#ifndef MSG_E1STEPS + #define MSG_E1STEPS _UxGT("E1steps/mm") +#endif +#ifndef MSG_E2STEPS + #define MSG_E2STEPS _UxGT("E2steps/mm") +#endif +#ifndef MSG_E3STEPS + #define MSG_E3STEPS _UxGT("E3steps/mm") +#endif +#ifndef MSG_E4STEPS + #define MSG_E4STEPS _UxGT("E4steps/mm") +#endif +#ifndef MSG_E5STEPS + #define MSG_E5STEPS _UxGT("E5steps/mm") +#endif +#ifndef MSG_TEMPERATURE + #define MSG_TEMPERATURE _UxGT("Temperature") +#endif +#ifndef MSG_MOTION + #define MSG_MOTION _UxGT("Motion") +#endif +#ifndef MSG_FILAMENT + #define MSG_FILAMENT _UxGT("Filament") +#endif +#ifndef MSG_VOLUMETRIC_ENABLED + #define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") +#endif +#ifndef MSG_FILAMENT_DIAM + #define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") +#endif +#ifndef MSG_FILAMENT_UNLOAD + #define MSG_FILAMENT_UNLOAD _UxGT("Unload mm") +#endif +#ifndef MSG_FILAMENT_LOAD + #define MSG_FILAMENT_LOAD _UxGT("Load mm") +#endif +#ifndef MSG_ADVANCE_K + #define MSG_ADVANCE_K _UxGT("Advance K") +#endif +#ifndef MSG_CONTRAST + #define MSG_CONTRAST _UxGT("LCD contrast") +#endif +#ifndef MSG_STORE_EEPROM + #define MSG_STORE_EEPROM _UxGT("Store settings") +#endif +#ifndef MSG_LOAD_EEPROM + #define MSG_LOAD_EEPROM _UxGT("Load settings") +#endif +#ifndef MSG_RESTORE_FAILSAFE + #define MSG_RESTORE_FAILSAFE _UxGT("Restore failsafe") +#endif +#ifndef MSG_INIT_EEPROM + #define MSG_INIT_EEPROM _UxGT("Initialize EEPROM") +#endif +#ifndef MSG_REFRESH + #define MSG_REFRESH _UxGT("Refresh") +#endif +#ifndef MSG_WATCH + #define MSG_WATCH _UxGT("Info screen") +#endif +#ifndef MSG_PREPARE + #define MSG_PREPARE _UxGT("Prepare") +#endif +#ifndef MSG_TUNE + #define MSG_TUNE _UxGT("Tune") +#endif +#ifndef MSG_PAUSE_PRINT + #define MSG_PAUSE_PRINT _UxGT("Pause print") +#endif +#ifndef MSG_RESUME_PRINT + #define MSG_RESUME_PRINT _UxGT("Resume print") +#endif +#ifndef MSG_STOP_PRINT + #define MSG_STOP_PRINT _UxGT("Stop print") +#endif +#ifndef MSG_POWER_LOSS_RECOVERY + #define MSG_POWER_LOSS_RECOVERY _UxGT("Power-Loss Recovery") +#endif +#ifndef MSG_CARD_MENU + #define MSG_CARD_MENU _UxGT("Print from SD") +#endif +#ifndef MSG_NO_CARD + #define MSG_NO_CARD _UxGT("No SD card") +#endif +#ifndef MSG_DWELL + #define MSG_DWELL _UxGT("Sleep...") +#endif +#ifndef MSG_USERWAIT + #define MSG_USERWAIT _UxGT("Click to resume...") +#endif +#ifndef MSG_PRINT_PAUSED + #define MSG_PRINT_PAUSED _UxGT("Print paused") +#endif +#ifndef MSG_PRINTING + #define MSG_PRINTING _UxGT("Printing...") +#endif +#ifndef MSG_PRINT_ABORTED + #define MSG_PRINT_ABORTED _UxGT("Print aborted") +#endif +#ifndef MSG_NO_MOVE + #define MSG_NO_MOVE _UxGT("No move.") +#endif +#ifndef MSG_KILLED + #define MSG_KILLED _UxGT("KILLED. ") +#endif +#ifndef MSG_STOPPED + #define MSG_STOPPED _UxGT("STOPPED. ") +#endif +#ifndef MSG_CONTROL_RETRACT + #define MSG_CONTROL_RETRACT _UxGT("Retract mm") +#endif +#ifndef MSG_CONTROL_RETRACT_SWAP + #define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Re.mm") +#endif +#ifndef MSG_CONTROL_RETRACTF + #define MSG_CONTROL_RETRACTF _UxGT("Retract V") +#endif +#ifndef MSG_CONTROL_RETRACT_ZLIFT + #define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Hop mm") +#endif +#ifndef MSG_CONTROL_RETRACT_RECOVER + #define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#endif +#ifndef MSG_CONTROL_RETRACT_RECOVER_SWAP + #define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") +#endif +#ifndef MSG_CONTROL_RETRACT_RECOVERF + #define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#endif +#ifndef MSG_CONTROL_RETRACT_RECOVER_SWAPF + #define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") +#endif +#ifndef MSG_AUTORETRACT + #define MSG_AUTORETRACT _UxGT("AutoRetr.") +#endif +#ifndef MSG_FILAMENTCHANGE + #define MSG_FILAMENTCHANGE _UxGT("Change filament") +#endif +#ifndef MSG_FILAMENTLOAD + #define MSG_FILAMENTLOAD _UxGT("Load filament") +#endif +#ifndef MSG_FILAMENTUNLOAD + #define MSG_FILAMENTUNLOAD _UxGT("Unload filament") +#endif +#ifndef MSG_FILAMENTUNLOAD_ALL + #define MSG_FILAMENTUNLOAD_ALL _UxGT("Unload All") +#endif +#ifndef MSG_INIT_SDCARD + #define MSG_INIT_SDCARD _UxGT("Init. SD card") +#endif +#ifndef MSG_CNG_SDCARD + #define MSG_CNG_SDCARD _UxGT("Change SD card") +#endif +#ifndef MSG_ZPROBE_OUT + #define MSG_ZPROBE_OUT _UxGT("Z Probe past bed") +#endif +#ifndef MSG_SKEW_FACTOR + #define MSG_SKEW_FACTOR _UxGT("Skew Factor") +#endif +#ifndef MSG_BLTOUCH + #define MSG_BLTOUCH _UxGT("BLTouch") +#endif +#ifndef MSG_BLTOUCH_SELFTEST + #define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") +#endif +#ifndef MSG_BLTOUCH_RESET + #define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") +#endif +#ifndef MSG_BLTOUCH_DEPLOY + #define MSG_BLTOUCH_DEPLOY _UxGT("Deploy BLTouch") +#endif +#ifndef MSG_BLTOUCH_STOW + #define MSG_BLTOUCH_STOW _UxGT("Stow BLTouch") +#endif +#ifndef MSG_HOME + #define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#endif +#ifndef MSG_FIRST + #define MSG_FIRST _UxGT("first") +#endif +#ifndef MSG_ZPROBE_ZOFFSET + #define MSG_ZPROBE_ZOFFSET _UxGT("Probe Z Offset") +#endif +#ifndef MSG_BABYSTEP_X + #define MSG_BABYSTEP_X _UxGT("Babystep X") +#endif +#ifndef MSG_BABYSTEP_Y + #define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#endif +#ifndef MSG_BABYSTEP_Z + #define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#endif +#ifndef MSG_ENDSTOP_ABORT + #define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") +#endif +#ifndef MSG_HEATING_FAILED_LCD + #define MSG_HEATING_FAILED_LCD _UxGT("Heating failed") +#endif +#ifndef MSG_HEATING_FAILED_LCD_BED + #define MSG_HEATING_FAILED_LCD_BED _UxGT("Bed heating failed") +#endif +#ifndef MSG_ERR_REDUNDANT_TEMP + #define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: REDUNDANT TEMP") +#endif +#ifndef MSG_THERMAL_RUNAWAY + #define MSG_THERMAL_RUNAWAY _UxGT("THERMAL RUNAWAY") +#endif +#ifndef MSG_THERMAL_RUNAWAY_BED + #define MSG_THERMAL_RUNAWAY_BED _UxGT("BED THERMAL RUNAWAY") +#endif +#ifndef MSG_ERR_MAXTEMP + #define MSG_ERR_MAXTEMP _UxGT("Err: MAXTEMP") +#endif +#ifndef MSG_ERR_MINTEMP + #define MSG_ERR_MINTEMP _UxGT("Err: MINTEMP") +#endif +#ifndef MSG_ERR_MAXTEMP_BED + #define MSG_ERR_MAXTEMP_BED _UxGT("Err: MAXTEMP BED") +#endif +#ifndef MSG_ERR_MINTEMP_BED + #define MSG_ERR_MINTEMP_BED _UxGT("Err: MINTEMP BED") +#endif +#ifndef MSG_ERR_Z_HOMING + #define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#endif +#ifndef MSG_HALTED + #define MSG_HALTED _UxGT("PRINTER HALTED") +#endif +#ifndef MSG_PLEASE_RESET + #define MSG_PLEASE_RESET _UxGT("Please reset") +#endif +#ifndef MSG_SHORT_DAY + #define MSG_SHORT_DAY _UxGT("d") // One character only +#endif +#ifndef MSG_SHORT_HOUR + #define MSG_SHORT_HOUR _UxGT("h") // One character only +#endif +#ifndef MSG_SHORT_MINUTE + #define MSG_SHORT_MINUTE _UxGT("m") // One character only +#endif +#ifndef MSG_HEATING + #define MSG_HEATING _UxGT("Heating...") +#endif +#ifndef MSG_COOLING + #define MSG_COOLING _UxGT("Cooling...") +#endif +#ifndef MSG_BED_HEATING + #define MSG_BED_HEATING _UxGT("Bed heating...") +#endif +#ifndef MSG_BED_COOLING + #define MSG_BED_COOLING _UxGT("Bed cooling...") +#endif +#ifndef MSG_DELTA_CALIBRATE + #define MSG_DELTA_CALIBRATE _UxGT("Delta Calibration") +#endif +#ifndef MSG_DELTA_CALIBRATE_X + #define MSG_DELTA_CALIBRATE_X _UxGT("Calibrate X") +#endif +#ifndef MSG_DELTA_CALIBRATE_Y + #define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrate Y") +#endif +#ifndef MSG_DELTA_CALIBRATE_Z + #define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrate Z") +#endif +#ifndef MSG_DELTA_CALIBRATE_CENTER + #define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrate Center") +#endif +#ifndef MSG_DELTA_SETTINGS + #define MSG_DELTA_SETTINGS _UxGT("Delta Settings") +#endif +#ifndef MSG_DELTA_AUTO_CALIBRATE + #define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibration") +#endif +#ifndef MSG_DELTA_HEIGHT_CALIBRATE + #define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Set Delta Height") +#endif +#ifndef MSG_DELTA_Z_OFFSET_CALIBRATE + #define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Probe Z-offset") +#endif +#ifndef MSG_DELTA_DIAG_ROD + #define MSG_DELTA_DIAG_ROD _UxGT("Diag Rod") +#endif +#ifndef MSG_DELTA_HEIGHT + #define MSG_DELTA_HEIGHT _UxGT("Height") +#endif +#ifndef MSG_DELTA_RADIUS + #define MSG_DELTA_RADIUS _UxGT("Radius") +#endif +#ifndef MSG_INFO_MENU + #define MSG_INFO_MENU _UxGT("About Printer") +#endif +#ifndef MSG_INFO_PRINTER_MENU + #define MSG_INFO_PRINTER_MENU _UxGT("Printer Info") +#endif +#ifndef MSG_3POINT_LEVELING + #define MSG_3POINT_LEVELING _UxGT("3-Point Leveling") +#endif +#ifndef MSG_LINEAR_LEVELING + #define MSG_LINEAR_LEVELING _UxGT("Linear Leveling") +#endif +#ifndef MSG_BILINEAR_LEVELING + #define MSG_BILINEAR_LEVELING _UxGT("Bilinear Leveling") +#endif +#ifndef MSG_UBL_LEVELING + #define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") +#endif +#ifndef MSG_MESH_LEVELING + #define MSG_MESH_LEVELING _UxGT("Mesh Leveling") +#endif +#ifndef MSG_INFO_STATS_MENU + #define MSG_INFO_STATS_MENU _UxGT("Printer Stats") +#endif +#ifndef MSG_INFO_BOARD_MENU + #define MSG_INFO_BOARD_MENU _UxGT("Board Info") +#endif +#ifndef MSG_INFO_THERMISTOR_MENU + #define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") +#endif +#ifndef MSG_INFO_EXTRUDERS + #define MSG_INFO_EXTRUDERS _UxGT("Extruders") +#endif +#ifndef MSG_INFO_BAUDRATE + #define MSG_INFO_BAUDRATE _UxGT("Baud") +#endif +#ifndef MSG_INFO_PROTOCOL + #define MSG_INFO_PROTOCOL _UxGT("Protocol") +#endif +#ifndef MSG_CASE_LIGHT + #define MSG_CASE_LIGHT _UxGT("Case light") +#endif +#ifndef MSG_CASE_LIGHT_BRIGHTNESS + #define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Light BRIGHTNESS") +#endif +#if LCD_WIDTH >= 20 + #ifndef MSG_INFO_PRINT_COUNT + #define MSG_INFO_PRINT_COUNT _UxGT("Print Count") + #endif + #ifndef MSG_INFO_COMPLETED_PRINTS + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completed") + #endif + #ifndef MSG_INFO_PRINT_TIME + #define MSG_INFO_PRINT_TIME _UxGT("Total print time") + #endif + #ifndef MSG_INFO_PRINT_LONGEST + #define MSG_INFO_PRINT_LONGEST _UxGT("Longest job time") + #endif + #ifndef MSG_INFO_PRINT_FILAMENT + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extruded total") + #endif +#else + #ifndef MSG_INFO_PRINT_COUNT + #define MSG_INFO_PRINT_COUNT _UxGT("Prints") + #endif + #ifndef MSG_INFO_COMPLETED_PRINTS + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completed") + #endif + #ifndef MSG_INFO_PRINT_TIME + #define MSG_INFO_PRINT_TIME _UxGT("Total") + #endif + #ifndef MSG_INFO_PRINT_LONGEST + #define MSG_INFO_PRINT_LONGEST _UxGT("Longest") + #endif + #ifndef MSG_INFO_PRINT_FILAMENT + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extruded") + #endif +#endif +#ifndef MSG_INFO_MIN_TEMP + #define MSG_INFO_MIN_TEMP _UxGT("Min Temp") +#endif +#ifndef MSG_INFO_MAX_TEMP + #define MSG_INFO_MAX_TEMP _UxGT("Max Temp") +#endif +#ifndef MSG_INFO_PSU + #define MSG_INFO_PSU _UxGT("PSU") +#endif +#ifndef MSG_DRIVE_STRENGTH + #define MSG_DRIVE_STRENGTH _UxGT("Drive Strength") +#endif +#ifndef MSG_DAC_PERCENT + #define MSG_DAC_PERCENT _UxGT("Driver %") +#endif +#ifndef MSG_DAC_EEPROM_WRITE + #define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Write") +#endif +#ifndef MSG_FILAMENT_CHANGE_HEADER_PAUSE + #define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("PRINT PAUSED") +#endif +#ifndef MSG_FILAMENT_CHANGE_HEADER_LOAD + #define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("LOAD FILAMENT") +#endif +#ifndef MSG_FILAMENT_CHANGE_HEADER_UNLOAD + #define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("UNLOAD FILAMENT") +#endif +#ifndef MSG_FILAMENT_CHANGE_OPTION_HEADER + #define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("RESUME OPTIONS:") +#endif +#ifndef MSG_FILAMENT_CHANGE_OPTION_PURGE + #define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purge more") +#endif +#ifndef MSG_FILAMENT_CHANGE_OPTION_RESUME + #define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Continue") +#endif +#ifndef MSG_FILAMENT_CHANGE_NOZZLE + #define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Nozzle: ") +#endif +#ifndef MSG_ERR_HOMING_FAILED + #define MSG_ERR_HOMING_FAILED _UxGT("Homing failed") +#endif +#ifndef MSG_ERR_PROBING_FAILED + #define MSG_ERR_PROBING_FAILED _UxGT("Probing failed") +#endif +#ifndef MSG_M600_TOO_COLD + #define MSG_M600_TOO_COLD _UxGT("M600: Too cold") +#endif + +// +// Filament Change screens show up to 3 lines on a 4-line display +// ...or up to 2 lines on a 3-line display +// +#if LCD_HEIGHT >= 4 + #ifndef MSG_FILAMENT_CHANGE_INIT_1 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Wait for start") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("of the filament") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("change") + #endif + #ifndef MSG_FILAMENT_CHANGE_UNLOAD_1 + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wait for") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament unload") + #endif + #ifndef MSG_FILAMENT_CHANGE_INSERT_1 + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("and press button") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("to continue...") + #endif + #ifndef MSG_FILAMENT_CHANGE_HEAT_1 + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Press button to") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("heat nozzle.") + #endif + #ifndef MSG_FILAMENT_CHANGE_HEATING_1 + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heating nozzle") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Please wait...") + #endif + #ifndef MSG_FILAMENT_CHANGE_LOAD_1 + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Wait for") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament load") + #endif + #ifndef MSG_FILAMENT_CHANGE_PURGE_1 + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Wait for") + #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("filament purge") + #endif + #ifndef MSG_FILAMENT_CHANGE_RESUME_1 + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wait for print") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("to resume") + #endif +#else // LCD_HEIGHT < 4 + #ifndef MSG_FILAMENT_CHANGE_INIT_1 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Please wait...") + #endif + #ifndef MSG_FILAMENT_CHANGE_UNLOAD_1 + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejecting...") + #endif + #ifndef MSG_FILAMENT_CHANGE_INSERT_1 + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert and Click") + #endif + #ifndef MSG_FILAMENT_CHANGE_HEATING_1 + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heating...") + #endif + #ifndef MSG_FILAMENT_CHANGE_LOAD_1 + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Loading...") + #endif + #ifndef MSG_FILAMENT_CHANGE_PURGE_1 + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Purging...") + #endif + #ifndef MSG_FILAMENT_CHANGE_RESUME_1 + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Resuming...") + #endif +#endif // LCD_HEIGHT < 4 + +#endif // LANGUAGE_EN_H diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index c77b12ee77..101f38220b 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,579 +16,249 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Spanish * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_ES_UTF_H +#define LANGUAGE_ES_UTF_H -namespace Language_es { - using namespace Language_en; // Inherit undefined strings from English +#define DISPLAY_CHARSET_ISO10646_1 +#define CHARSIZE 2 - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Spanish"); +#define WELCOME_MSG MACHINE_NAME _UxGT(" lista.") +#define MSG_BACK _UxGT("Atrás") +#define MSG_SD_INSERTED _UxGT("Tarjeta colocada") +#define MSG_SD_REMOVED _UxGT("Tarjeta retirada") +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters +#define MSG_MAIN _UxGT("Menú principal") +#define MSG_AUTOSTART _UxGT("Inicio automático") +#define MSG_DISABLE_STEPPERS _UxGT("Apagar motores") +#define MSG_DEBUG_MENU _UxGT("Menú depurar") +#define MSG_PROGRESS_BAR_TEST _UxGT("Prueba barra avance") +#define MSG_AUTO_HOME _UxGT("Llevar al origen") +#define MSG_AUTO_HOME_X _UxGT("Origen X") +#define MSG_AUTO_HOME_Y _UxGT("Origen Y") +#define MSG_AUTO_HOME_Z _UxGT("Origen Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Calibrar Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Origen XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Iniciar (Presione)") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Siguiente punto") +#define MSG_LEVEL_BED_DONE _UxGT("Nivelación lista!") +#define MSG_SET_HOME_OFFSETS _UxGT("Ajustar desfases") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Desfase aplicado") +#define MSG_SET_ORIGIN _UxGT("Establecer origen") +#define MSG_PREHEAT_1 _UxGT("Precalentar PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Todo") +#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" End") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Cama") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Config") +#define MSG_PREHEAT_2 _UxGT("Precalentar ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Todo") +#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" End") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Cama") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Config") +#define MSG_COOLDOWN _UxGT("Enfriar") +#define MSG_SWITCH_PS_ON _UxGT("Encender") +#define MSG_SWITCH_PS_OFF _UxGT("Apagar") +#define MSG_EXTRUDE _UxGT("Extruir") +#define MSG_RETRACT _UxGT("Retraer") +#define MSG_MOVE_AXIS _UxGT("Mover ejes") +#define MSG_BED_LEVELING _UxGT("Nivelar cama") +#define MSG_LEVEL_BED _UxGT("Nivelar cama") +#define MSG_MOVING _UxGT("Moviendo...") +#define MSG_FREE_XY _UxGT("Libre XY") +#define MSG_MOVE_X _UxGT("Mover X") +#define MSG_MOVE_Y _UxGT("Mover Y") +#define MSG_MOVE_Z _UxGT("Mover Z") +#define MSG_MOVE_E _UxGT("Extrusor") +#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") +#define MSG_MOVE_1MM _UxGT("Mover 1mm") +#define MSG_MOVE_10MM _UxGT("Mover 10mm") +#define MSG_SPEED _UxGT("Velocidad") +#define MSG_BED_Z _UxGT("Cama Z") +#define MSG_NOZZLE _UxGT("Boquilla") +#define MSG_BED _UxGT("Cama") +#define MSG_FAN_SPEED _UxGT("Ventilador") +#define MSG_FLOW _UxGT("Flujo") +#define MSG_CONTROL _UxGT("Control") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Temperatura Auto.") +#define MSG_ON _UxGT("Encender") +#define MSG_OFF _UxGT("Apagar") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Seleccionar") +#define MSG_ACC _UxGT("Aceleración") +#define MSG_JERK _UxGT("Jerk") +#define MSG_VX_JERK _UxGT("Vx-jerk") +#define MSG_VY_JERK _UxGT("Vy-jerk") +#define MSG_VZ_JERK _UxGT("Vz-jerk") +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VMAX _UxGT("Vmax") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("Vel. viaje min") +#define MSG_ACCELERATION MSG_ACC +#define MSG_AMAX _UxGT("Acel. max") +#define MSG_A_RETRACT _UxGT("Acel. retrac.") +#define MSG_A_TRAVEL _UxGT("Acel. Viaje") +#define MSG_STEPS_PER_MM _UxGT("Pasos/mm") +#define MSG_XSTEPS _UxGT("X pasos/mm") +#define MSG_YSTEPS _UxGT("Y pasos/mm") +#define MSG_ZSTEPS _UxGT("Z pasos/mm") +#define MSG_ESTEPS _UxGT("E pasos/mm") +#define MSG_E1STEPS _UxGT("E1 pasos/mm") +#define MSG_E2STEPS _UxGT("E2 pasos/mm") +#define MSG_E3STEPS _UxGT("E3 pasos/mm") +#define MSG_E4STEPS _UxGT("E4 pasos/mm") +#define MSG_E5STEPS _UxGT("E5 pasos/mm") +#define MSG_TEMPERATURE _UxGT("Temperatura") +#define MSG_MOTION _UxGT("Movimiento") +#define MSG_FILAMENT _UxGT("Filamento") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") +#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") +#define MSG_ADVANCE_K _UxGT("Avance K") +#define MSG_CONTRAST _UxGT("Contraste") +#define MSG_STORE_EEPROM _UxGT("Guardar memoria") +#define MSG_LOAD_EEPROM _UxGT("Cargar memoria") +#define MSG_RESTORE_FAILSAFE _UxGT("Restaurar memoria") +#define MSG_REFRESH _UxGT("Volver a cargar") +#define MSG_WATCH _UxGT("Información") +#define MSG_PREPARE _UxGT("Preparar") +#define MSG_TUNE _UxGT("Ajustar") +#define MSG_PAUSE_PRINT _UxGT("Pausar impresión") +#define MSG_RESUME_PRINT _UxGT("Reanudar impresión") +#define MSG_STOP_PRINT _UxGT("Detener impresión") +#define MSG_CARD_MENU _UxGT("Menú de SD") +#define MSG_NO_CARD _UxGT("No hay tarjeta SD") +#define MSG_DWELL _UxGT("Reposo...") +#define MSG_USERWAIT _UxGT("Esperando órdenes") +#define MSG_PRINT_ABORTED _UxGT("Impresión cancelada") +#define MSG_NO_MOVE _UxGT("Sin movimiento") +#define MSG_KILLED _UxGT("Parada de emergencia") +#define MSG_STOPPED _UxGT("Detenida") +#define MSG_CONTROL_RETRACT _UxGT("Retraer mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Interc. Retraer mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retraer V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Levantar mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("DesRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Interc. DesRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("DesRet V") +#define MSG_AUTORETRACT _UxGT("Retracción Auto.") +#define MSG_FILAMENTCHANGE _UxGT("Cambiar filamento") +#define MSG_INIT_SDCARD _UxGT("Iniciando tarjeta") +#define MSG_CNG_SDCARD _UxGT("Cambiar tarjeta") +#define MSG_ZPROBE_OUT _UxGT("Sonda Z fuera") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Auto-Prueba") +#define MSG_BLTOUCH_RESET _UxGT("Reiniciar BLTouch") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("primero") +#define MSG_ZPROBE_ZOFFSET _UxGT("Desfase Z") +#define MSG_BABYSTEP_X _UxGT("Micropaso X") +#define MSG_BABYSTEP_Y _UxGT("Micropaso Y") +#define MSG_BABYSTEP_Z _UxGT("Micropaso Z") +#define MSG_ENDSTOP_ABORT _UxGT("Cancelado - Endstop") +#define MSG_HEATING_FAILED_LCD _UxGT("Error: al calentar") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Error: temperatura") +#define MSG_THERMAL_RUNAWAY _UxGT("Error: temperatura") +#define MSG_ERR_MAXTEMP _UxGT("Error: Temp Máxima") +#define MSG_ERR_MINTEMP _UxGT("Error: Temp Mínima") +#define MSG_ERR_MAXTEMP_BED _UxGT("Error: Temp Max Cama") +#define MSG_ERR_MINTEMP_BED _UxGT("Error: Temp Min Cama") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("IMPRESORA PARADA") +#define MSG_PLEASE_RESET _UxGT("Por favor, reinicie") +#define MSG_SHORT_DAY _UxGT("d") // One character only +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("Calentando...") +#define MSG_BED_HEATING _UxGT("Calentando Cama...") +#define MSG_DELTA_CALIBRATE _UxGT("Calibración Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibración") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Est. Altura Delta") +#define MSG_INFO_MENU _UxGT("Inf. Impresora") +#define MSG_INFO_PRINTER_MENU _UxGT("Inf. Impresora") +#define MSG_INFO_STATS_MENU _UxGT("Estadísticas Imp.") +#define MSG_INFO_BOARD_MENU _UxGT("Inf. Controlador") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistores") +#define MSG_INFO_EXTRUDERS _UxGT("Extrusores") +#define MSG_INFO_BAUDRATE _UxGT("Baudios") +#define MSG_INFO_PROTOCOL _UxGT("Protocolo") +#define MSG_CASE_LIGHT _UxGT("Luz cabina") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Lista"); - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("SI"); - PROGMEM Language_Str MSG_NO = _UxGT("NO"); - PROGMEM Language_Str MSG_BACK = _UxGT("Atrás"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Cancelando..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD/USB insertado"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD/USB retirado"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Esperando al SD/USB"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Error lectura SD/USB"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Ajustes avanzados"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuración"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inicio automático"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Apagar motores"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menú depuración"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Prob. barra progreso"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Llevar al origen"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Origen X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Origen Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Origen Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto alineado Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origen XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Pulsar para comenzar"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Siguiente punto"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("¡Nivelación lista!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Compen. Altura"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ajustar desfases"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicada"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Establecer origen"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Precal. ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Precal. ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Todo"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Cama"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Ajuste"); +#if LCD_WIDTH > 19 + #define MSG_INFO_PRINT_COUNT _UxGT("Conteo de impresión") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") + #define MSG_INFO_PRINT_TIME _UxGT("Tiempo total de imp.") + #define MSG_INFO_PRINT_LONGEST _UxGT("Impresión más larga") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Total de Extrusión") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Impresiones") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") + #define MSG_INFO_PRINT_TIME _UxGT("Total") + #define MSG_INFO_PRINT_LONGEST _UxGT("Más larga") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrusión") +#endif - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Precal. $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Precal. $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Precal. $ Fusor"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Precal. $ Fusor ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Precal. $ Todo"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Precal. $ Cama"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Precal. $ Ajuste"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Precal. manual"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Enfriar"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecuencia"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Láser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Apagar Láser"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Encender Láser"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potencia Láser"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Control Mandrino"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Apagar Mandrino"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Encender Mandrino"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potencia Mandrino"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Invertir giro"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Encender Fuente"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Apagar Fuente"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruir"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Retraer"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover ejes"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelando Cama"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar Cama"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Nivelar Esquinas"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Siguente Esquina"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mallado"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editar Mallado"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Ed. Mallado parada"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Sondear Punto"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Índice X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Índice Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Com. Personalizados"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probar Sonda"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punto"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Desviación"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Desfase Herramienta"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Aparcado"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicar"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia Reflejada"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Control Total"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2ª Fusor X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2ª Fusor Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2ª Fusor Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Hacer G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Herramientas UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Nivelado UBL"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto de inclinación"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Crear Mallado man."); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Colocar cuña y Medir"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Medir"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Retirar y Medir Cama"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Mover al Siguente"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activar UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Desactivar UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Cama"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Cama perso."); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Fusor"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Fusor perso."); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Editar Mallado"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit. Mallado perso."); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ajuste fino Mallado"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Term. edici. Mallado"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crear Mallado Pers."); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Crear Mallado"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Crear Mallado ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Valid. Mall. ($)"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Crear Mallado Frío"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajustar alt. Mallado"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Cantidad de altura"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valid. Mallado"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valid. Mall. perso."); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Calentando Cama"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Calent. Boquilla"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Imprimado manual..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Impri. longit. fija"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Imprimación Lista"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Cancelado"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Dejando G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Contin. Mallado cama"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Nivelando Mallado"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelando 3Puntos"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Niv. Mall. cuadri"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Nivel de Mallado"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Puntos Laterales"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo de mapa "); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Salida Mapa mallado"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Salida para el host"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Salida para CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Cópia de seg. ext"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Salida Info. UBL"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Cantidad de relleno"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Relleno manual"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Relleno inteligente"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Mallado de relleno"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar todo"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar proximos"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ajustar Fino Todo"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ajustar Fino proxi."); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Almacen de Mallado"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Huecos memoria"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Cargar Mall. cama"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Guardar Mall. cama"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Malla %i Cargada"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Malla %i Guardada"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Sin guardar"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Error: Guardar UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Error: Restaurar UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Desfase de Z: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Desfase de Z Parado"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Paso a Paso"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crear Mall. Frío"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Relleno intelig."); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valid. Mallado"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ajustar Fino Todo"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valid. Mallado"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ajustar Fino Todo"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Guardar Mall. cama"); +#define MSG_INFO_MIN_TEMP _UxGT("Temperatura mínima") +#define MSG_INFO_MAX_TEMP _UxGT("Temperatura máxima") +#define MSG_INFO_PSU _UxGT("Fuente de poder") +#define MSG_DRIVE_STRENGTH _UxGT("Potencia driver") +#define MSG_DAC_PERCENT _UxGT("Driver %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Escribe DAC EEPROM") - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Control LED"); - PROGMEM Language_Str MSG_LEDS = _UxGT("LEDS"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Color predefinido"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rojo"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Naranja"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Amarillo"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Verde"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Azul"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Índigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violeta"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Blanco"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Por defecto"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Color personalizado"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensidad Rojo"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensidad Verde"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensidad Azul"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensidad Blanco"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brillo"); +#define MSG_FILAMENT_CHANGE_HEADER _UxGT("IMPR. PAUSADA") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPC. REINICIO:") +#define MSG_FILAMENT_CHANGE_OPTION_EXTRUDE _UxGT("Extruir más") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Resumir imp.") - PROGMEM Language_Str MSG_MOVING = _UxGT("Moviendo..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Libre XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend muy frio"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidad"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Cama Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Boquilla"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Boquilla ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Boquilla Aparcada"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Boquilla en Espera"); - PROGMEM Language_Str MSG_BED = _UxGT("Cama"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Recinto"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ventilador"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Ventilador ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Vent. almacenado ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Vel. Ext. ventil."); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Vel. Ext. ventil. ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Controlador Vent."); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Velocidad en reposo"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo Auto"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Velocidad Activa"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Periodo de reposo"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Flujo"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flujo ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Factor"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temp. Autom."); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Enc"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Apg"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Auto-ajuste"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Auto-ajuste *"); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Seleccionar"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Seleccionar *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Aceleración"); - PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Jerk"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Desvi. Unión"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocidad"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vel. viaje min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Acceleración"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Acel. max") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Acel. max") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Acel. max") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Acel. max") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Acel. max *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Acel. retrac."); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Acel. Viaje"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pasos/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pasos/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pasos/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pasos/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pasos/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* pasos/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Movimiento"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diámetro Fil."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diámetro Fil. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarga mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carga mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avance K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Avance K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Guardar EEPROM"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Cargar EEPROM"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Rest. fábrica"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inicializar EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Err: EEPROM CRC"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Err: Índice EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Err: Versión EEPROM"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Actualizar SD/USB"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetear Impresora"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Pantalla de Inf."); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Ajustar"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Iniciar impresión"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Siguinte"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Iniciar"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Parar"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimir"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reiniciar"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancelar"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Listo"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Retroceder"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Proceder"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impresión"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Reanudar impresión"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Detener impresión"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Imprimiendo Objeto"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancelar Objeto"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancelar Objeto ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Rec. Fallo electrico"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprim. desde SD/USB"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD/USB no presente"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Reposo..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Pulsar para Reanudar"); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impresión Pausada"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Imprimiendo..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impresión cancelada"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Impresión Completada"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sin movimiento"); - PROGMEM Language_Str MSG_KILLED = _UxGT("MUERTA"); - PROGMEM Language_Str MSG_STOPPED = _UxGT("DETENIDA"); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retraer mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Interc. Retraer mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraer V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Levantar mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Interc. DesRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retracción Auto."); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Inter. longitud"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purgar longitud"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Cambiar Herramienta"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Aumentar Z"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Vel. de Cebado"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Vel. de retracción"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambiar filamento"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Cambiar filamento *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Cargar filamento"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Cargar filamento *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Descargar filamento"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Descargar fil. *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Descargar todo"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Iniciar SD/USB"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambiar SD/USB"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Lanzar SD/USB"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z fuera cama"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Factor de desviación"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Auto-Prueba"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reiniciar"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Subir pistón"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Bajar pistón"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Modo Software"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Modo 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Modo OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Modo almacenar"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Poner BLTouch a 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Poner BLTouch a OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Informe de drenaje"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PELIGRO: ¡Una mala configuración puede producir daños! ¿Proceder igualmente?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Iniciar TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test de desfase Z"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Guardar"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Subir TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Subir Sonda Z"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Bajar Sonda Z"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Origen %s%s%s Prim."); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Desf. Sonda"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Desf. Sonda X"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Desf. Sonda Y"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desf. Sonda Z"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropaso X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropaso Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropaso Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancelado - Endstop"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Calent. fallido"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP. REDUN."); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FUGA TÉRMICA"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("FUGA TÉRMICA CAMA"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("FUGA TÉRMICA CAMARA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err:TEMP. MÁX"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err:TEMP. MIN"); - PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA DETENIDA"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Por favor, reinicie"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Calentando..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Enfriando..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Calentando Cama..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Enfriando Cama..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Calentando Cámara..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Enfriando Cámara..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibración Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Configuración Delta"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibración"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Est. Altura Delta"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Ajustar Sonda Z"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonal"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altura"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radio"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Info. Impresora"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info. Impresora"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelando 3puntos"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelando Lineal"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelando Bilineal"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelando UBL"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelando en Mallado"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadísticas Imp."); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. Controlador"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusores"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudios"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Vig. Fuga Térm.: OFF"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Vig. Fuga Térm.: ON"); +#define MSG_FILAMENT_CHANGE_MINTEMP _UxGT("Temp Mínima es ") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Boquilla: ") - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz cabina"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Brillo cabina"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impresora incorrecta"); +#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando iniciar") - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Cont. de impresión"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tiempo total de imp."); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impresión más larga"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruido"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impresiones"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Más larga"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruido"); - #endif +#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte filamento") +#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y presione el botón") - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp. Mínima"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp. Máxima"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("F. Aliment."); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Fuerza de empuje"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ERROR CONEX. TMC"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escribe DAC EEPROM"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIAR FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESIÓN PAUSADA"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARGAR FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARGAR FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPC. REINICIO:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar más"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continuar imp."); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Boquilla: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sens. filamento"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist. filamento mm"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Ir a origen Fallado"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondeo Fallado"); +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del filamento") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("cambiar") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del fil. cambiar") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte filamento") +#endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ELIJE FILAMENTO"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("¡Actu. MMU Firmware!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Necesita Cuidado"); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Continuar imp."); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Resumiendo..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Cargar Filamento"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Cargar Todo"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Cargar hasta boqui."); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Expulsar Filamento"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Expulsar Filamento ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Descargar Filamento"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Cargando Fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Expulsando Fil. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Descargando Fil...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Todo"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reiniciar MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Reiniciando MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Retirar, y pulsar"); +#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperado por") +#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filamento expulsado") +#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperado por") +#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Cargar filamento") +#define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Esperado por") +#define MSG_FILAMENT_CHANGE_EXTRUDE_2 _UxGT("Extruir filamento") +#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando imp.") +#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("para resumir") +#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Oprima botón para") +#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Calentar la boquilla") +#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Calentando boquilla") +#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Espere por favor") - PROGMEM Language_Str MSG_MIX = _UxGT("Mezcla"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Componente ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Miezclador"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Degradado"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Degradado Total"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Mezcla Conmutada"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Mezcla Cíclica"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Mezcla de Degradado"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Degradado inverso"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Activar Herr.V"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Inicio Herr.V"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Fin Herr.V"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias Herr.V"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reiniciar Herr.V"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Cometer mezc. Herr.V"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Herr.V reiniciados"); - PROGMEM Language_Str MSG_START_Z = _UxGT("Inicio Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" Fin Z:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Juegos"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); - - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Pulsar el botón para", "reanudar impresión")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Aparcando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperando para", "iniciar el cambio", "de filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Inserte el filamento", "y pulse el botón", "para continuar...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Pulse el botón para", "calentar la boquilla")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Calentando boquilla", "Espere por favor...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Espere para", "liberar el filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Espere para", "cargar el filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Espere para", "purgar el filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Pulse para finalizar", "la purga de filamen.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperando impresora", "para reanudar...")); - #else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Pulse para continuar")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Aparcando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Por Favor espere...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Inserte y Pulse")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Pulse para Calentar")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Calentando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Liberando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Cargando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Pulse para finalizar")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reanudando...")); - #endif - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Controladores TMC"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Amperaje Controlador"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Límite Hibrido"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Origen sin sensores"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reiniciar"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" dentro:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Backlash"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Corrección"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Suavizado"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Nivel Eje X"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrar"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("T. de esp. Calent."); - PROGMEM Language_Str MSG_REHEAT = _UxGT("Recalentar"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Recalentando..."); -} +#endif // LANGUAGE_ES_UTF_H diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index 7e35c6ee41..999855ef37 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,306 +16,373 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Basque-Euskera * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_EU_H +#define LANGUAGE_EU_H #define DISPLAY_CHARSET_ISO10646_1 #define NOT_EXTENDED_ISO10646_1_5X7 -namespace Language_eu { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" prest.") +#define MSG_BACK _UxGT("Atzera") +#define MSG_SD_INSERTED _UxGT("Txartela sartuta") +#define MSG_SD_REMOVED _UxGT("Txartela kenduta") +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters +#define MSG_MAIN _UxGT("Menu nagusia") +#define MSG_AUTOSTART _UxGT("Auto hasiera") +#define MSG_DISABLE_STEPPERS _UxGT("Itzali motoreak") +#define MSG_DEBUG_MENU _UxGT("Arazketa Menua") +#define MSG_PROGRESS_BAR_TEST _UxGT("Prog. Barra Proba") +#define MSG_AUTO_HOME _UxGT("Hasierara joan") +#define MSG_AUTO_HOME_X _UxGT("X jatorrira") +#define MSG_AUTO_HOME_Y _UxGT("Y jatorrira") +#define MSG_AUTO_HOME_Z _UxGT("Z jatorrira") +#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibratu Z") +#define MSG_LEVEL_BED_HOMING _UxGT("XYZ hasieraratzen") +#define MSG_LEVEL_BED_WAITING _UxGT("Klik egin hasteko") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Hurrengo Puntua") +#define MSG_LEVEL_BED_DONE _UxGT("Berdintzea eginda") +//#define MSG_Z_FADE_HEIGHT _UxGT("Fade Height") +#define MSG_SET_HOME_OFFSETS _UxGT("Etxe. offset eza.") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsetak ezarrita") +#define MSG_SET_ORIGIN _UxGT("Hasiera ipini") +#define MSG_PREHEAT_1 _UxGT("Berotu PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Guztia") +#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" Amaia") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Ohea") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Ezarp.") +#define MSG_PREHEAT_2 _UxGT("Berotu ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_1 _UxGT(" Guztia") +#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" Amaia") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_1 _UxGT(" Ohea") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_1 _UxGT(" Ezarp.") +#define MSG_COOLDOWN _UxGT("Hoztu") +#define MSG_SWITCH_PS_ON _UxGT("Energia piztu") +#define MSG_SWITCH_PS_OFF _UxGT("Energia itzali") +#define MSG_EXTRUDE _UxGT("Estruitu") +#define MSG_RETRACT _UxGT("Atzera eragin") +#define MSG_MOVE_AXIS _UxGT("Ardatzak mugitu") +#define MSG_BED_LEVELING _UxGT("Ohe berdinketa") +#define MSG_LEVEL_BED _UxGT("Ohea berdindu") +#define MSG_LEVEL_CORNERS _UxGT("Ertzak berdindu") +#define MSG_NEXT_CORNER _UxGT("Hurrengo ertza") +//#define MSG_EDITING_STOPPED _UxGT("Mesh Editing Stopped") +//#define MSG_USER_MENU _UxGT("Custom Commands") +#define MSG_UBL_DOING_G29 _UxGT("G29 exekutatzen") +#define MSG_UBL_UNHOMED _UxGT("XYZ etxeratu lehenengo") +#define MSG_UBL_TOOLS _UxGT("UBL Tresnak") +#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") +#define MSG_UBL_MANUAL_MESH _UxGT("Sarea eskuz sortu") +//#define MSG_UBL_BC_INSERT _UxGT("Place shim & measure") +#define MSG_UBL_BC_INSERT2 _UxGT("Neurtu") +//#define MSG_UBL_BC_REMOVE _UxGT("Remove & measure bed") +//#define MSG_UBL_MOVING_TO_NEXT _UxGT("Moving to next") +#define MSG_UBL_ACTIVATE_MESH _UxGT("UBL aktibatu") +#define MSG_UBL_DEACTIVATE_MESH _UxGT("UBL desaktibatu") +#define MSG_UBL_SET_BED_TEMP _UxGT("Ohearen tenperatura") +#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Mutur beroaren tenp.") +#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP +#define MSG_UBL_MESH_EDIT _UxGT("Sarea editatu") +//#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Edit Custom Mesh") +//#define MSG_UBL_FINE_TUNE_MESH _UxGT("Fine Tuning Mesh") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Sarea editatzea eginda") +//#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Build Custom Mesh") +#define MSG_UBL_BUILD_MESH_MENU _UxGT("Sarea sortu") +#define MSG_UBL_BUILD_PLA_MESH _UxGT("PLA sarea sortu") +#define MSG_UBL_BUILD_ABS_MESH _UxGT("ABS sarea sortu") +#define MSG_UBL_BUILD_COLD_MESH _UxGT("Sare hotza sortu") +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Sarearen altuera doitu") +//#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Height Amount") +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Sarea balioetsi") +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("PLA sarea balioetsi") +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("ABS sarea balioetsi") +//#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Validate Custom Mesh") +#define MSG_UBL_CONTINUE_MESH _UxGT("Ohe sarea balioetsi") +#define MSG_UBL_MESH_LEVELING _UxGT("Sare berdinketa") +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3 puntuko berdinketa") +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Lauki-sare berdinketa") +#define MSG_UBL_MESH_LEVEL _UxGT("Sarea berdindu") +//#define MSG_UBL_SIDE_POINTS _UxGT("Side Points") +#define MSG_UBL_MAP_TYPE _UxGT("Mapa mota") +//#define MSG_UBL_OUTPUT_MAP _UxGT("Output Mesh Map") +//#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Output for Host") +//#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Output for CSV") +//#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Off Printer Backup") +//#define MSG_UBL_INFO_UBL _UxGT("Output UBL Info") +#define MSG_UBL_EDIT_MESH_MENU _UxGT("Sarea editatu") +//#define MSG_UBL_FILLIN_AMOUNT _UxGT("Fill-in Amount") +//#define MSG_UBL_MANUAL_FILLIN _UxGT("Manual Fill-in") +//#define MSG_UBL_SMART_FILLIN _UxGT("Smart Fill-in") +//#define MSG_UBL_FILLIN_MESH _UxGT("Fill-in Mesh") +//#define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidate All") +//#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidate Closest") +//#define MSG_UBL_FINE_TUNE_ALL _UxGT("Fine Tune All") +//#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Fine Tune Closest") +//#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Mesh Storage") +//#define MSG_UBL_STORAGE_SLOT _UxGT("Memory Slot") +//#define MSG_UBL_LOAD_MESH _UxGT("Load Bed Mesh") +//#define MSG_UBL_SAVE_MESH _UxGT("Save Bed Mesh") +//#define MSG_MESH_LOADED _UxGT("Mesh %i loaded") +//#define MSG_MESH_SAVED _UxGT("Mesh %i saved") +//#define MSG_NO_STORAGE _UxGT("No storage") +//#define MSG_UBL_SAVE_ERROR _UxGT("Err: UBL Save") +//#define MSG_UBL_RESTORE_ERROR _UxGT("Err: UBL Restore") +//#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Offset Stopped") +//#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Step-By-Step UBL") +#define MSG_LED_CONTROL _UxGT("LED ezarpenak") +#define MSG_LEDS _UxGT("Argiak") +#define MSG_LED_PRESETS _UxGT("Argi aurrehautaketak") +#define MSG_SET_LEDS_RED _UxGT("Gorria") +#define MSG_SET_LEDS_ORANGE _UxGT("Laranja") +#define MSG_SET_LEDS_YELLOW _UxGT("Horia") +#define MSG_SET_LEDS_GREEN _UxGT("Berdea") +#define MSG_SET_LEDS_BLUE _UxGT("Urdina") +#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") +#define MSG_SET_LEDS_VIOLET _UxGT("Bioleta") +#define MSG_SET_LEDS_WHITE _UxGT("Zuria") +#define MSG_SET_LEDS_DEFAULT _UxGT("Lehenetsia") +#define MSG_CUSTOM_LEDS _UxGT("Argi pertsonalizatuak") +#define MSG_INTENSITY_R _UxGT("Intentsitate gorria") +#define MSG_INTENSITY_G _UxGT("Intentsitate berdea") +#define MSG_INTENSITY_B _UxGT("Intentsitate urdina") +#define MSG_INTENSITY_W _UxGT("Intentsitate zuria") +#define MSG_LED_BRIGHTNESS _UxGT("Distira") +#define MSG_MOVING _UxGT("Mugitzen...") +#define MSG_FREE_XY _UxGT("Askatu XY") +#define MSG_MOVE_X _UxGT("Mugitu X") +#define MSG_MOVE_Y _UxGT("Mugitu Y") +#define MSG_MOVE_Z _UxGT("Mugitu Z") +#define MSG_MOVE_E _UxGT("Estrusorea") +#define MSG_MOVE_01MM _UxGT("Mugitu 0.1mm") +#define MSG_MOVE_1MM _UxGT("Mugitu 1mm") +#define MSG_MOVE_10MM _UxGT("Mugitu 10mm") +#define MSG_SPEED _UxGT("Abiadura") +#define MSG_BED_Z _UxGT("Z Ohea") +#define MSG_NOZZLE _UxGT("Pita") +#define MSG_BED _UxGT("Ohea") +#define MSG_FAN_SPEED _UxGT("Haizagailu abiadura") +#define MSG_EXTRA_FAN_SPEED _UxGT("Haiz.gehig. abiadura") +#define MSG_FLOW _UxGT("Fluxua") +#define MSG_CONTROL _UxGT("Kontrola") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fakt") +#define MSG_AUTOTEMP _UxGT("Auto tenperatura") +#define MSG_ON _UxGT("On ") +#define MSG_OFF _UxGT("Off") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Aukeratu") +#define MSG_ACC _UxGT("Azelerazioa") +#define MSG_JERK _UxGT("Astindua") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-astindua") + #define MSG_VB_JERK _UxGT("Vb-astindua") + #define MSG_VC_JERK _UxGT("Vc-astindua") +#else + #define MSG_VA_JERK _UxGT("Vx-astindua") + #define MSG_VB_JERK _UxGT("Vy-astindua") + #define MSG_VC_JERK _UxGT("Vz-astindua") +#endif +#define MSG_VE_JERK _UxGT("Ve-astindua") +//#define MSG_VELOCITY _UxGT("Velocity") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VBidaia min") +#define MSG_ACCELERATION MSG_ACC +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-retrakt") +#define MSG_A_TRAVEL _UxGT("A-bidaia") +#define MSG_STEPS_PER_MM _UxGT("Pausoak/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("A pausoak/mm") + #define MSG_BSTEPS _UxGT("B pausoak/mm") + #define MSG_CSTEPS _UxGT("C pausoak/mm") +#else + #define MSG_ASTEPS _UxGT("X pausoak/mm") + #define MSG_BSTEPS _UxGT("Y pausoak/mm") + #define MSG_CSTEPS _UxGT("Z pausoak/mm") +#endif +#define MSG_ESTEPS _UxGT("E pausoak/mm") +#define MSG_E1STEPS _UxGT("E1 pausoak/mm") +#define MSG_E2STEPS _UxGT("E2 pausoak/mm") +#define MSG_E3STEPS _UxGT("E3 pausoak/mm") +#define MSG_E4STEPS _UxGT("E4 pausoak/mm") +#define MSG_E5STEPS _UxGT("E5 pausoak/mm") +#define MSG_TEMPERATURE _UxGT("Tenperatura") +#define MSG_MOTION _UxGT("Mugimendua") +#define MSG_FILAMENT _UxGT("Harizpia") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E mm3-tan") +#define MSG_FILAMENT_DIAM _UxGT("Hariz. Dia.") +#define MSG_FILAMENT_UNLOAD _UxGT("Deskargatu mm") +#define MSG_FILAMENT_LOAD _UxGT("Kargatu mm") +#define MSG_ADVANCE_K _UxGT("K Aurrerapena") +#define MSG_CONTRAST _UxGT("LCD kontrastea") +#define MSG_STORE_EEPROM _UxGT("Gorde memoria") +#define MSG_LOAD_EEPROM _UxGT("Kargatu memoria") +#define MSG_RESTORE_FAILSAFE _UxGT("Larri. berriz.") +#define MSG_INIT_EEPROM _UxGT("EEPROM-a hasieratu") +#define MSG_REFRESH _UxGT("Berriz kargatu") +#define MSG_WATCH _UxGT("Pantaila info") +#define MSG_PREPARE _UxGT("Prestatu") +#define MSG_TUNE _UxGT("Doitu") +#define MSG_PAUSE_PRINT _UxGT("Pausatu inprimak.") +#define MSG_RESUME_PRINT _UxGT("Jarraitu inprima.") +#define MSG_STOP_PRINT _UxGT("Gelditu inprima.") +#define MSG_CARD_MENU _UxGT("SD-tik inprimatu") +#define MSG_NO_CARD _UxGT("Ez dago SD-rik") +#define MSG_DWELL _UxGT("Lo egin...") +#define MSG_USERWAIT _UxGT("Aginduak zain...") +#define MSG_PRINT_PAUSED _UxGT("Inprim. geldi.") +#define MSG_PRINT_ABORTED _UxGT("Inprim. deusezta.") +#define MSG_NO_MOVE _UxGT("Mugimendu gabe.") +#define MSG_KILLED _UxGT("AKABATUTA. ") +#define MSG_STOPPED _UxGT("GELDITUTA. ") +#define MSG_CONTROL_RETRACT _UxGT("Atzera egin mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Atzera mm") +#define MSG_CONTROL_RETRACTF _UxGT("Atzera egin V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Igo mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Atzera egin mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Swap Atzera mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Atzera egin V") +//#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") +#define MSG_AUTORETRACT _UxGT("Atzera egin") +#define MSG_FILAMENTCHANGE _UxGT("Aldatu harizpia") +#define MSG_FILAMENTLOAD _UxGT("Harizpia kargatu") +#define MSG_FILAMENTUNLOAD _UxGT("Harizpia deskargatu") +#define MSG_FILAMENTUNLOAD_ALL _UxGT("Erabat deskargatu") +#define MSG_INIT_SDCARD _UxGT("Hasieratu SD-a") +#define MSG_CNG_SDCARD _UxGT("Aldatu txartela") +#define MSG_ZPROBE_OUT _UxGT("Z zunda kanpora") +#define MSG_SKEW_FACTOR _UxGT("Okertze faktorea") +#define MSG_BLTOUCH _UxGT("BLTouch") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch AutoProba") +#define MSG_BLTOUCH_RESET _UxGT("BLTouch berrabia.") +#define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch jaitsi/luzatu") +#define MSG_BLTOUCH_STOW _UxGT("BLTouch igo/jaso") +#define MSG_HOME _UxGT("Etxera") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("lehenengo") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z Konpentsatu") +#define MSG_BABYSTEP_X _UxGT("Mikro-urratsa X") +#define MSG_BABYSTEP_Y _UxGT("Mikro-urratsa Y") +#define MSG_BABYSTEP_Z _UxGT("Mikro-urratsa Z") +#define MSG_ENDSTOP_ABORT _UxGT("Endstop deusezta.") +#define MSG_HEATING_FAILED_LCD _UxGT("Err: Beroketa") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: Tenperatura") +#define MSG_THERMAL_RUNAWAY _UxGT("TENP. KONTROL EZA") +#define MSG_ERR_MAXTEMP _UxGT("Err: Tenp Maximoa") +#define MSG_ERR_MINTEMP _UxGT("Err: Tenp Minimoa") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err: Ohe Tenp Max") +#define MSG_ERR_MINTEMP_BED _UxGT("Err: Ohe Tenp Min") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("INPRIMA. GELDIRIK") +#define MSG_PLEASE_RESET _UxGT("Berrabia. Mesedez") +#define MSG_SHORT_DAY _UxGT("d") // One character only +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("Berotzen...") +#define MSG_BED_HEATING _UxGT("Ohea Berotzen...") +#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibraketa") +#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibratu X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibratu Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibratu Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibratu Zentrua") +#define MSG_DELTA_SETTINGS _UxGT("Delta ezarpenak") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Kalibraketa") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Delta Alt. Ezar.") +#define MSG_DELTA_DIAG_ROD _UxGT("Barra diagonala") +#define MSG_DELTA_HEIGHT _UxGT("Altuera") +#define MSG_DELTA_RADIUS _UxGT("Erradioa") +#define MSG_INFO_MENU _UxGT("Inprimagailu Inf.") +#define MSG_INFO_PRINTER_MENU _UxGT("Inprimagailu Inf.") +#define MSG_3POINT_LEVELING _UxGT("3 puntuko berdinketa") +#define MSG_LINEAR_LEVELING _UxGT("Berdinketa lineala") +#define MSG_BILINEAR_LEVELING _UxGT("Berdinketa bilinearra") +#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") +#define MSG_MESH_LEVELING _UxGT("Sare berdinketa") +#define MSG_INFO_STATS_MENU _UxGT("Inprima. estatis.") +#define MSG_INFO_BOARD_MENU _UxGT("Txartelaren Info.") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistoreak") +#define MSG_INFO_EXTRUDERS _UxGT("Estrusoreak") +#define MSG_INFO_BAUDRATE _UxGT("Baudioak") +#define MSG_INFO_PROTOCOL _UxGT("Protokoloa") +#define MSG_CASE_LIGHT _UxGT("Kabina Argia") +//#define MSG_CASE_LIGHT_BRIGHTNESS +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Inprim. Zenbaketa") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Burututa") + #define MSG_INFO_PRINT_TIME _UxGT("Inprim. denbora") + #define MSG_INFO_PRINT_LONGEST _UxGT("Imprimatze luzeena") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Estruituta guztira") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Inprimatze") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Burututa") + #define MSG_INFO_PRINT_TIME _UxGT("Guztira") + #define MSG_INFO_PRINT_LONGEST _UxGT("Luzeena") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Estrusio") +#endif +#define MSG_INFO_MIN_TEMP _UxGT("Tenp. Minimoa") +#define MSG_INFO_MAX_TEMP _UxGT("Tenp. Maximoa") +#define MSG_INFO_PSU _UxGT("Elikadura-iturria") +#define MSG_DRIVE_STRENGTH _UxGT("Driver-aren potentzia") +#define MSG_DAC_PERCENT _UxGT("Driver %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Idatzi DAC EEPROM") +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("HARIZPIA ALDATU") +#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("HARIZPIA KARGATU") +#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("HARIZPIA DESKARGATU") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("ALDAKETA AUKERAK:") +//#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purge more") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Inprima. jarraitu") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Pita: ") +#define MSG_ERR_HOMING_FAILED _UxGT("Hasi. huts egin du") +#define MSG_ERR_PROBING_FAILED _UxGT("Neurketak huts egin du") +#define MSG_M600_TOO_COLD _UxGT("M600: hotzegi") +// +// Filament Change screens show up to 3 lines on a 4-line display +// ...or up to 2 lines on a 3-line display +// +#if LCD_HEIGHT >= 4 +// #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Wait for start") +// #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("of the filament") +// #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("change") +// #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wait for") +// #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament unload") +// #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert filament") +// #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("and press button") +// #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("to continue...") +// #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Press button to") +// #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("heat nozzle.") +// #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heating nozzle") +// #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Please wait...") +// #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Wait for") +// #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament load") +// #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Wait for") +// #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("filament purge") +// #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wait for print") +// #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("to resume") +#else // LCD_HEIGHT < 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Mesedez, itxaron...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Deskargatzen...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Sartu eta click egin") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Berotzen...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Kargatzen...") +// #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Purging...") +// #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Resuming...") +#endif // LCD_HEIGHT < 4 - constexpr uint8_t CHARSIZE = 1; - PROGMEM Language_Str LANGUAGE = _UxGT("Basque-Euskera"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" prest."); - PROGMEM Language_Str MSG_BACK = _UxGT("Atzera"); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Txartela sartuta"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Txartela kenduta"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menu nagusia"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto hasiera"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Itzali motoreak"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Arazketa Menua"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Prog. Barra Proba"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Hasierara joan"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X jatorrira"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y jatorrira"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z jatorrira"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ hasieraratzen"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klik egin hasteko"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Hurrengo Puntua"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Berdintzea eginda"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Etxe. offset eza."); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsetak ezarrita"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Hasiera ipini"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Berotu ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Berotu ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Guztia"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ohea"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ezarp."); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Berotu $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Berotu $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Berotu $ Amaia"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Berotu $ Amaia ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Berotu $ Guztia"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Berotu $ Ohea"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Berotu $ Ezarp."); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Hoztu"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Energia piztu"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Energia itzali"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Estruitu"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Atzera eragin"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Ardatzak mugitu"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ohe berdinketa"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Ohea berdindu"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Ertzak berdindu"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Hurrengo ertza"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Sarea editatu"); - - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 exekutatzen"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Tresnak"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Sarea eskuz sortu"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Neurtu"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktibatu"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL desaktibatu"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ohearen tenperatura"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Mutur beroaren tenp."); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Sarea editatu"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Sarea editatzea eginda"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Sarea sortu"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("$ sarea sortu"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("$ sarea balioetsi"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Sare hotza sortu"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Sarearen altuera doitu"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Sarea balioetsi"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Ohe sarea balioetsi"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Sare berdinketa"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3 puntuko berdinketa"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Lauki-sare berdinketa"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Sarea berdindu"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Mapa mota"); - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED ezarpenak"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Argiak"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Argi aurrehautaketak"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Gorria"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Laranja"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Horia"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Berdea"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Urdina"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Bioleta"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Zuria"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Lehenetsia"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Argi pertsonalizatuak"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intentsitate gorria"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intentsitate berdea"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intentsitate urdina"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intentsitate zuria"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Distira"); - - PROGMEM Language_Str MSG_MOVING = _UxGT("Mugitzen..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Askatu XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mugitu X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mugitu Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mugitu Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Estrusorea"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Estrusorea *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mugitu %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mugitu 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mugitu 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mugitu 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Abiadura"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Ohea"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Pita"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Pita ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Ohea"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Haizagailu abiadura"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Haizagailu abiadura ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Haiz.gehig. abiadura"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Haiz.gehig. abiadura ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxua"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Fluxua ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrola"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto tenperatura"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Aukeratu"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Aukeratu *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Azelerazioa"); - PROGMEM Language_Str MSG_JERK = _UxGT("Astindua"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-astindua"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-astindua"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-astindua"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-astindua"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VBidaia min"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retrakt"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-bidaia"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pausoak/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pausoak/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pausoak/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pausoak/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pausoak/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* pausoak/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Tenperatura"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Mugimendua"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Harizpia"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm3-tan"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Hariz. Dia."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Hariz. Dia. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Deskargatu mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Kargatu mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K Aurrerapena"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K Aurrerapena *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrastea"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Gorde memoria"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Kargatu memoria"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Larri. berriz."); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM-a hasieratu"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Berriz kargatu"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Pantaila info"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Prestatu"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Doitu"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausatu inprimak."); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Jarraitu inprima."); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Gelditu inprima."); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("SD-tik inprimatu"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Ez dago SD-rik"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Lo egin..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Aginduak zain..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Inprim. geldi."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Inprim. deusezta."); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Mugimendu gabe."); - PROGMEM Language_Str MSG_KILLED = _UxGT("AKABATUTA. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("GELDITUTA. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Atzera egin mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Atzera mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Atzera egin V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Igo mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Atzera egin mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap Atzera mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Atzera egin V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Atzera egin"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Aldatu harizpia"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Aldatu harizpia *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Harizpia kargatu"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Harizpia kargatu *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Harizpia deskargatu"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Harizpia deskargatu *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Erabat deskargatu"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Hasieratu SD-a"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Aldatu txartela"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z zunda kanpora"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Okertze faktorea"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch AutoProba"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch berrabia."); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch jaitsi/luzatu"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("BLTouch igo/jaso"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Etxera %s%s%s lehenengo"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Konpentsatu"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikro-urratsa X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikro-urratsa Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Mikro-urratsa Z"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop deusezta."); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Err: Beroketa"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: Tenperatura"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TENP. KONTROL EZA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: Tenp Maximoa"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Tenp Minimoa"); - PROGMEM Language_Str MSG_HALTED = _UxGT("INPRIMA. GELDIRIK"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Berrabia. Mesedez"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Berotzen..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ohea Berotzen..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibraketa"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibratu X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibratu Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibratu Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibratu Zentrua"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta ezarpenak"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibraketa"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Alt. Ezar."); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra diagonala"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altuera"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Erradioa"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Inprimagailu Inf."); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Inprimagailu Inf."); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3 puntuko berdinketa"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Berdinketa lineala"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Berdinketa bilinearra"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Sare berdinketa"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Inprima. estatis."); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Txartelaren Info."); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistoreak"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Estrusoreak"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudioak"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoloa"); - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Kabina Argia"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Argiaren Distira"); - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Inprim. Zenbaketa"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Burututa"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Inprim. denbora"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Imprimatze luzeena"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Estruituta guztira"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Inprimatze"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Burututa"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Guztira"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Luzeena"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Estrusio"); - #endif - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Tenp. Minimoa"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Tenp. Maximoa"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Elikadura-iturria"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Driver-aren potentzia"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Idatzi DAC EEPROM"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("HARIZPIA ALDATU"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("HARIZPIA KARGATU"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("HARIZPIA DESKARGATU"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ALDAKETA AUKERAK:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Inprima. jarraitu"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Pita: "); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Hasi. huts egin du"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Neurketak huts egin du"); - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Inprimagailu okerra"); - - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Mesedez, itxaron...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Deskargatzen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Sartu eta click egin")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Berotzen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Kargatzen...")); -} +#endif // LANGUAGE_EU_H diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index e8621377d9..4a79946f94 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,115 +16,157 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Finnish * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_FI_H +#define LANGUAGE_FI_H #define DISPLAY_CHARSET_ISO10646_1 +#define CHARSIZE 2 -namespace Language_fi { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" valmis.") +#define MSG_SD_INSERTED _UxGT("Kortti asetettu") +#define MSG_SD_REMOVED _UxGT("Kortti poistettu") +#define MSG_MAIN _UxGT("Palaa") +#define MSG_AUTOSTART _UxGT("Automaatti") +#define MSG_DISABLE_STEPPERS _UxGT("Vapauta moottorit") +#define MSG_AUTO_HOME _UxGT("Aja referenssiin") +#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibroi Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Homing XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Click to Begin") +#define MSG_LEVEL_BED_DONE _UxGT("Leveling Done!") +#define MSG_SET_HOME_OFFSETS _UxGT("Set home offsets") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets applied") +#define MSG_SET_ORIGIN _UxGT("Aseta origo") +#define MSG_PREHEAT_1 _UxGT("Esilämmitä PLA") +#define MSG_PREHEAT_1_N _UxGT("Esilämmitä PLA ") +#define MSG_PREHEAT_1_ALL _UxGT("Esilä. PLA Kaikki") +#define MSG_PREHEAT_1_BEDONLY _UxGT("Esilä. PLA Alusta") +#define MSG_PREHEAT_1_SETTINGS _UxGT("Esilämm. PLA konf") +#define MSG_PREHEAT_2 _UxGT("Esilämmitä ABS") +#define MSG_PREHEAT_2_N _UxGT("Esilämmitä ABS ") +#define MSG_PREHEAT_2_ALL _UxGT("Esilä. ABS Kaikki") +#define MSG_PREHEAT_2_BEDONLY _UxGT("Esilä. ABS Alusta") +#define MSG_PREHEAT_2_SETTINGS _UxGT("Esilämm. ABS konf") +#define MSG_COOLDOWN _UxGT("Jäähdytä") +#define MSG_SWITCH_PS_ON _UxGT("Virta päälle") +#define MSG_SWITCH_PS_OFF _UxGT("Virta pois") +#define MSG_EXTRUDE _UxGT("Pursota") +#define MSG_RETRACT _UxGT("Vedä takaisin") +#define MSG_MOVE_AXIS _UxGT("Liikuta akseleita") +#define MSG_MOVE_X _UxGT("Liikuta X") +#define MSG_MOVE_Y _UxGT("Liikuta Y") +#define MSG_MOVE_Z _UxGT("Liikuta Z") +#define MSG_MOVE_E _UxGT("Extruder") +#define MSG_MOVE_01MM _UxGT("Liikuta 0.1mm") +#define MSG_MOVE_1MM _UxGT("Liikuta 1mm") +#define MSG_MOVE_10MM _UxGT("Liikuta 10mm") +#define MSG_SPEED _UxGT("Nopeus") +#define MSG_NOZZLE _UxGT("Suutin") +#define MSG_BED _UxGT("Alusta") +#define MSG_FAN_SPEED _UxGT("Tuul. nopeus") +#define MSG_FLOW _UxGT("Virtaus") +#define MSG_CONTROL _UxGT("Kontrolli") +#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Kerr") +#define MSG_AUTOTEMP _UxGT("Autotemp") +#define MSG_ON _UxGT("On ") +#define MSG_OFF _UxGT("Off") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_ACC _UxGT("Kiihtyv") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VLiike min") +#define MSG_ACCELERATION MSG_ACC +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-peruuta") +#define MSG_STEPS_PER_MM _UxGT("Steps/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Asteps/mm") + #define MSG_BSTEPS _UxGT("Bsteps/mm") + #define MSG_CSTEPS _UxGT("Csteps/mm") +#else + #define MSG_ASTEPS _UxGT("Xsteps/mm") + #define MSG_BSTEPS _UxGT("Ysteps/mm") + #define MSG_CSTEPS _UxGT("Zsteps/mm") +#endif +#define MSG_ESTEPS _UxGT("Esteps/mm") +#define MSG_E1STEPS _UxGT("E1steps/mm") +#define MSG_E2STEPS _UxGT("E2steps/mm") +#define MSG_E3STEPS _UxGT("E3steps/mm") +#define MSG_E4STEPS _UxGT("E4steps/mm") +#define MSG_E5STEPS _UxGT("E5steps/mm") +#define MSG_TEMPERATURE _UxGT("Lämpötila") +#define MSG_MOTION _UxGT("Liike") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm³") +#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") +#define MSG_CONTRAST _UxGT("LCD kontrasti") +#define MSG_STORE_EEPROM _UxGT("Tallenna muistiin") +#define MSG_LOAD_EEPROM _UxGT("Lataa muistista") +#define MSG_RESTORE_FAILSAFE _UxGT("Palauta oletus") +#define MSG_REFRESH _UxGT("Päivitä") +#define MSG_WATCH _UxGT("Seuraa") +#define MSG_PREPARE _UxGT("Valmistele") +#define MSG_TUNE _UxGT("Säädä") +#define MSG_PAUSE_PRINT _UxGT("Keskeytä tulostus") +#define MSG_RESUME_PRINT _UxGT("Jatka tulostusta") +#define MSG_STOP_PRINT _UxGT("Pysäytä tulostus") +#define MSG_CARD_MENU _UxGT("Korttivalikko") +#define MSG_NO_CARD _UxGT("Ei korttia") +#define MSG_DWELL _UxGT("Nukkumassa...") +#define MSG_USERWAIT _UxGT("Odotet. valintaa") +#define MSG_PRINT_ABORTED _UxGT("Print aborted") +#define MSG_NO_MOVE _UxGT("Ei liiketta.") +#define MSG_KILLED _UxGT("KILLED. ") +#define MSG_STOPPED _UxGT("STOPPED. ") +#define MSG_CONTROL_RETRACT _UxGT("Vedä mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Va. Vedä mm") +#define MSG_CONTROL_RETRACTF _UxGT("Vedä V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Z mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Va. UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_AUTORETRACT _UxGT("AutoVeto.") +#define MSG_FILAMENTCHANGE _UxGT("Change filament") +#define MSG_INIT_SDCARD _UxGT("Init. SD-Card") +#define MSG_CNG_SDCARD _UxGT("Change SD-Card") +#define MSG_ZPROBE_OUT _UxGT("Z probe out. bed") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("first") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") +#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrointi") +#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibroi X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibroi Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibroi Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibroi Center") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Finnish"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" valmis."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kortti asetettu"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kortti poistettu"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Palaa"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Automaatti"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Vapauta moottorit"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Aja referenssiin"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Aseta origo"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Kaikki"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Alusta"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Esilämm. ") PREHEAT_1_LABEL _UxGT(" konf"); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Esilämmitä $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Esilämmitä $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Esilä. $Suutin"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Esilä. $Suutin ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Esilä. $ Kaikki"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Esilä. $ Alusta"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Esilämm. $ konf"); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Jäähdytä"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Virta päälle"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Virta pois"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Pursota"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Vedä takaisin"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Liikuta akseleita"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Liikuta X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Liikuta Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Liikuta Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Liikuta %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Liikuta 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Liikuta 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Liikuta 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Nopeus"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Suutin"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Suutin ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Alusta"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Tuul. nopeus"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Tuul. nopeus ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Virtaus"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Virtaus ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrolli"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Kerr"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); - PROGMEM Language_Str MSG_ACC = _UxGT("Kiihtyv"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VLiike min"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-peruuta"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Lämpötila"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Liike"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrasti"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Tallenna muistiin"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Lataa muistista"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Palauta oletus"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Päivitä"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Seuraa"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Valmistele"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Säädä"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Keskeytä tulostus"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Jatka tulostusta"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Pysäytä tulostus"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Korttivalikko"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Ei korttia"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Nukkumassa..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Odotet. valintaa"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Ei liiketta."); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Vedä mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Va. Vedä mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Vedä V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Va. Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVeto."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrointi"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibroi X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibroi Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibroi Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibroi Center"); - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Väärä tulostin"); -} +#endif // LANGUAGE_FI_H diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 714feeee99..0973f64132 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,558 +16,380 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * French * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_FR_UTF_H +#define LANGUAGE_FR_UTF_H #define DISPLAY_CHARSET_ISO10646_1 +#define CHARSIZE 2 -namespace Language_fr { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" prête.") +#define MSG_BACK _UxGT("Retour") +#define MSG_SD_INSERTED _UxGT("Carte insérée") +#define MSG_SD_REMOVED _UxGT("Carte retirée") +#define MSG_LCD_ENDSTOPS _UxGT("Butées") // Max length 8 characters +#define MSG_MAIN _UxGT("Menu principal") +#define MSG_AUTOSTART _UxGT("Demarrage auto") +#define MSG_DISABLE_STEPPERS _UxGT("Arrêter moteurs") +#define MSG_DEBUG_MENU _UxGT("Menu debug") +#define MSG_PROGRESS_BAR_TEST _UxGT("Test barre progress.") +#define MSG_AUTO_HOME _UxGT("Origine auto.") +#define MSG_AUTO_HOME_X _UxGT("Origine X Auto.") +#define MSG_AUTO_HOME_Y _UxGT("Origine Y Auto.") +#define MSG_AUTO_HOME_Z _UxGT("Origine Z Auto.") +#define MSG_TMC_Z_CALIBRATION _UxGT("Calibrer Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Origine XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Clic pour commencer") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Point suivant") +#define MSG_LEVEL_BED_DONE _UxGT("Mise à niveau OK!") +#define MSG_Z_FADE_HEIGHT _UxGT("Hauteur lissée") +#define MSG_SET_HOME_OFFSETS _UxGT("Régl. décal. origine") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Décalages appliqués") +#define MSG_SET_ORIGIN _UxGT("Régler origine") +#define MSG_PREHEAT_1 _UxGT("Préchauffage PLA") +#define MSG_PREHEAT_1_N _UxGT("Préchauff. PLA ") +#define MSG_PREHEAT_1_ALL _UxGT("Préch. PLA Tout") +#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" buse") +#define MSG_PREHEAT_1_BEDONLY _UxGT("Préch. PLA lit") +#define MSG_PREHEAT_1_SETTINGS _UxGT("Régl. prech. PLA") +#define MSG_PREHEAT_2 _UxGT("Préchauffage ABS") +#define MSG_PREHEAT_2_N _UxGT("Préchauff. ABS ") +#define MSG_PREHEAT_2_ALL _UxGT("Préch. ABS Tout") +#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" buse") +#define MSG_PREHEAT_2_BEDONLY _UxGT("Préch. ABS lit") +#define MSG_PREHEAT_2_SETTINGS _UxGT("Régl. prech. ABS") +#define MSG_COOLDOWN _UxGT("Refroidir") +#define MSG_SWITCH_PS_ON _UxGT("Allumer alim.") +#define MSG_SWITCH_PS_OFF _UxGT("Eteindre alim.") +#define MSG_EXTRUDE _UxGT("Extrusion") +#define MSG_RETRACT _UxGT("Retrait") +#define MSG_MOVE_AXIS _UxGT("Déplacer un axe") +#define MSG_BED_LEVELING _UxGT("Régl. Niv. lit") +#define MSG_LEVEL_BED _UxGT("Régl. Niv. lit") +#define MSG_LEVEL_CORNERS _UxGT("Niveau coins") +#define MSG_NEXT_CORNER _UxGT("Coin suivant") +#define MSG_EDITING_STOPPED _UxGT("Arrêt édit. maillage") +#define MSG_USER_MENU _UxGT("Commandes perso") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Français"); +#define MSG_UBL_DOING_G29 _UxGT("G29 en cours") +#define MSG_UBL_UNHOMED _UxGT("Origine XYZ d'abord") +#define MSG_UBL_TOOLS _UxGT("Outils UBL") +#define MSG_UBL_LEVEL_BED _UxGT("Niveau lit unifié") +#define MSG_UBL_MANUAL_MESH _UxGT("Maillage manuel") +#define MSG_UBL_BC_INSERT _UxGT("Poser câle & mesurer") +#define MSG_UBL_BC_INSERT2 _UxGT("Mesure") +#define MSG_UBL_BC_REMOVE _UxGT("ôter et mesurer lit") +#define MSG_UBL_MOVING_TO_NEXT _UxGT("Aller au suivant") +#define MSG_UBL_ACTIVATE_MESH _UxGT("Activer l'UBL") +#define MSG_UBL_DEACTIVATE_MESH _UxGT("Désactiver l'UBL") +#define MSG_UBL_SET_BED_TEMP _UxGT("Température lit") +#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Température buse") +#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP +#define MSG_UBL_MESH_EDIT _UxGT("Editer maille") +#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Editer maille perso") +#define MSG_UBL_FINE_TUNE_MESH _UxGT("Réglage fin maille") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Terminer maille") +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Créer maille perso") +#define MSG_UBL_BUILD_MESH_MENU _UxGT("Créer maille") +#define MSG_UBL_BUILD_PLA_MESH _UxGT("Créer maille PLA") +#define MSG_UBL_BUILD_ABS_MESH _UxGT("Créer maille ABS") +#define MSG_UBL_BUILD_COLD_MESH _UxGT("Créer maille froide") +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Ajuster haut. maille") +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Hauteur") +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Valider maille") +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Valider maille PLA") +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Valider maille ABS") +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Valider maille perso") +#define MSG_UBL_CONTINUE_MESH _UxGT("Continuer maille") +#define MSG_UBL_MESH_LEVELING _UxGT("Niveau par maille") +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Niveau à 3 points") +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Niveau grille") +#define MSG_UBL_MESH_LEVEL _UxGT("Maille de niveau") +#define MSG_UBL_SIDE_POINTS _UxGT("Point latéral") +#define MSG_UBL_MAP_TYPE _UxGT("Type de carte") +#define MSG_UBL_OUTPUT_MAP _UxGT("Voir maille") +#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Voir pour hôte") +#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Voir pour CSV") +#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Voir pour sauveg.") +#define MSG_UBL_INFO_UBL _UxGT("Voir info UBL") +#define MSG_UBL_EDIT_MESH_MENU _UxGT("Modifier maille") +#define MSG_UBL_FILLIN_AMOUNT _UxGT("Taux de remplissage") +#define MSG_UBL_MANUAL_FILLIN _UxGT("Remplissage manuel") +#define MSG_UBL_SMART_FILLIN _UxGT("Remplissage auto") +#define MSG_UBL_FILLIN_MESH _UxGT("Maille remplissage") +#define MSG_UBL_INVALIDATE_ALL _UxGT("Tout annuler") +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Annuler le plus près") +#define MSG_UBL_FINE_TUNE_ALL _UxGT("Réglage fin (tous)") +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Réglage fin (proche)") +#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Stockage maille") +#define MSG_UBL_STORAGE_SLOT _UxGT("Slot mémoire") +#define MSG_UBL_LOAD_MESH _UxGT("Charger maille") +#define MSG_UBL_SAVE_MESH _UxGT("Sauver maille") +#define MSG_MESH_LOADED _UxGT("Maille %i charg.") +#define MSG_MESH_SAVED _UxGT("Maille %i enreg.") +#define MSG_NO_STORAGE _UxGT("Pas de mémoire") +#define MSG_UBL_SAVE_ERROR _UxGT("Err: Enreg. UBL") +#define MSG_UBL_RESTORE_ERROR _UxGT("Err: Ouvrir UBL") +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Décal. Z arrêté") +#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL Pas à pas") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" prête."); - PROGMEM Language_Str MSG_YES = _UxGT("Oui"); - PROGMEM Language_Str MSG_NO = _UxGT("Non"); - PROGMEM Language_Str MSG_BACK = _UxGT("Retour"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Annulation..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Média inséré"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Média retiré"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Attente média"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Err lecture média"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB débranché"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Erreur média USB"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Butées"); - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Butées SW"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Config. avancée"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuration"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Exéc. auto.gcode"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Arrêter moteurs"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu debug"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barre progress."); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Origine auto"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Origine X auto"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Origine Y auto"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Origine Z auto"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Align. Z auto"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origine XYZ..."); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Clic pour commencer"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Point suivant"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Mise à niveau OK!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Hauteur lissée"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Régl. décal origine"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Décalages appliqués"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Régler origine"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Préchauffage ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Préchauffage ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" Tout"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" lit"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Régler préch. ") PREHEAT_1_LABEL; +#define MSG_LED_CONTROL _UxGT("Contrôle LED") +#define MSG_LEDS _UxGT("Lumière") +#define MSG_LED_PRESETS _UxGT("Préregl. LED") +#define MSG_SET_LEDS_RED _UxGT("Rouge") +#define MSG_SET_LEDS_ORANGE _UxGT("Orange") +#define MSG_SET_LEDS_YELLOW _UxGT("Jaune") +#define MSG_SET_LEDS_GREEN _UxGT("Vert") +#define MSG_SET_LEDS_BLUE _UxGT("Bleu") +#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") +#define MSG_SET_LEDS_VIOLET _UxGT("Violet") +#define MSG_SET_LEDS_WHITE _UxGT("Blanc") +#define MSG_SET_LEDS_DEFAULT _UxGT("Defaut") +#define MSG_CUSTOM_LEDS _UxGT("Lum. perso.") +#define MSG_INTENSITY_R _UxGT("Intensité rouge") +#define MSG_INTENSITY_G _UxGT("Intensité vert") +#define MSG_INTENSITY_B _UxGT("Intensité bleu") +#define MSG_INTENSITY_W _UxGT("Intensité blanc") +#define MSG_LED_BRIGHTNESS _UxGT("Luminosité") - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Préchauffage $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Préchauffage $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Préch. $ buse"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Préch. $ buse ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Préch. $ Tout"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Préch. $ lit"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Régler préch. $"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Préchauf. perso"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Refroidir"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Contrôle Laser"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Puissance"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverser broches"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Allumer alim."); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Eteindre alim."); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrusion"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Rétractation"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Déplacer un axe"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Régler Niv. lit"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveau du lit"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Niveau des coins"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Coin suivant"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Modif. maille"); // 13 car. max - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifier grille"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Modification arrêtée"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Mesure point"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valeur Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Commandes perso"); +#define MSG_MOVING _UxGT("Déplacement...") +#define MSG_FREE_XY _UxGT("Débloquer XY") +#define MSG_MOVE_X _UxGT("Dépl. X") +#define MSG_MOVE_Y _UxGT("Dépl. Y") +#define MSG_MOVE_Z _UxGT("Dépl. Z") +#define MSG_MOVE_E _UxGT("Extrudeur") +#define MSG_MOVE_01MM _UxGT("Dépl. 0.1mm") +#define MSG_MOVE_1MM _UxGT("Dépl. 1mm") +#define MSG_MOVE_10MM _UxGT("Dépl. 10mm") +#define MSG_SPEED _UxGT("Vitesse") +#define MSG_BED_Z _UxGT("Lit Z") +#define MSG_NOZZLE _UxGT("Buse") +#define MSG_BED _UxGT("Lit") +#define MSG_FAN_SPEED _UxGT("Vitesse ventil.") +#define MSG_EXTRA_FAN_SPEED _UxGT("Extra V ventil.") - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Mesure point"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("Ecart sonde Z M48"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Ecart"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("Point M48"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Mode IDEX"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copie miroir"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Contrôle complet"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Offsets Outil"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("Buse 2 X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("Buse 2 Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("Buse 2 Z"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26: Chauffage du lit"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("Buse en chauffe..."); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Amorce manuelle..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Amorce longueur fixe"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Amorce terminée"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 annulé"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Sortie G26"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 en cours"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Outils UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Niveau lit unifié"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Maillage manuel"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Poser câle & mesurer"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mesure"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("ôter et mesurer lit"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Aller au suivant"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activer l'UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Désactiver l'UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Température lit"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Température lit"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Température buse"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Température buse"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Modifier grille"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Modif. grille perso"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Réglage fin"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Terminer"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Créer la grille"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Créer grille $"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Impr. grille $"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Créer grille ..."); - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Mesure à froid"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajuster haut. couche"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Hauteur (x0.1mm)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Vérifier grille"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Impr. grille ..."); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continuer grille"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Niveau par mailles"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Niveau à 3 points"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Niveau par grille"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Effectuer mesures"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Points latéraux"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Type de carte"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Exporter grille"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Export pour hôte"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Export en CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Export sauvegarde"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Infos debug UBL"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Nombre de points"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Remplissage manuel"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Remplissage auto"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Remplissage grille"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Tout effacer"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Effacer le + près"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Réglage fin (tous)"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Réglage fin + près"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Stockage grille"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot mémoire"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Charger la grille"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Stocker la grille"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Grille %i chargée"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Grille %i enreg."); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Pas de mémoire"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: Enreg. UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: Ouvrir UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Décal. Z arrêté"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Assistant UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Mesure à froid"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Compléter auto."); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Vérifier grille"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Réglage fin"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Vérifier grille"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Réglage fin"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Stocker grille"); +#define MSG_FLOW _UxGT("Flux") +#define MSG_CONTROL _UxGT("Contrôler") +#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Facteur") +#define MSG_AUTOTEMP _UxGT("Temp. Auto.") +#define MSG_ON _UxGT("Marche ") +#define MSG_OFF _UxGT("Arrêt") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Sélectionner") +#define MSG_ACC _UxGT("Accélération") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va jerk") + #define MSG_VB_JERK _UxGT("Vb jerk") + #define MSG_VC_JERK _UxGT("Vc jerk") +#else + #define MSG_VA_JERK _UxGT("Vx jerk") + #define MSG_VB_JERK _UxGT("Vy jerk") + #define MSG_VC_JERK _UxGT("Vz jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve jerk") +#define MSG_VELOCITY _UxGT("Vélocité") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin ") +#define MSG_VTRAV_MIN _UxGT("V dépl. min") +#define MSG_ACCELERATION _UxGT("Accélération") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A retrait") +#define MSG_A_TRAVEL _UxGT("A dépl.") +#define MSG_STEPS_PER_MM _UxGT("Pas/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("A pas/mm") + #define MSG_BSTEPS _UxGT("B pas/mm") + #define MSG_CSTEPS _UxGT("C pas/mm") +#else + #define MSG_ASTEPS _UxGT("X pas/mm") + #define MSG_BSTEPS _UxGT("Y pas/mm") + #define MSG_CSTEPS _UxGT("Z pas/mm") +#endif +#define MSG_ESTEPS _UxGT("E pas/mm") +#define MSG_E1STEPS _UxGT("E1 pas/mm") +#define MSG_E2STEPS _UxGT("E2 pas/mm") +#define MSG_E3STEPS _UxGT("E3 pas/mm") +#define MSG_E4STEPS _UxGT("E4 pas/mm") +#define MSG_E5STEPS _UxGT("E5 pas/mm") +#define MSG_TEMPERATURE _UxGT("Température") +#define MSG_MOTION _UxGT("Mouvement") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E en mm3") +#define MSG_FILAMENT_DIAM _UxGT("Diam. Fil.") +#define MSG_FILAMENT_UNLOAD _UxGT("Décharger mm") +#define MSG_FILAMENT_LOAD _UxGT("Charger mm") +#define MSG_ADVANCE_K _UxGT("Avance K") +#define MSG_CONTRAST _UxGT("Contraste LCD") +#define MSG_STORE_EEPROM _UxGT("Sauver config") +#define MSG_LOAD_EEPROM _UxGT("Lire config") +#define MSG_RESTORE_FAILSAFE _UxGT("Restaurer défauts") +#define MSG_INIT_EEPROM _UxGT("Initialiser EEPROM") +#define MSG_REFRESH _UxGT("Actualiser") +#define MSG_WATCH _UxGT("Surveiller") +#define MSG_PREPARE _UxGT("Préparer") +#define MSG_TUNE _UxGT("Régler") +#define MSG_PAUSE_PRINT _UxGT("Interrompre impr.") +#define MSG_RESUME_PRINT _UxGT("Reprendre impr.") +#define MSG_STOP_PRINT _UxGT("Arrêter impr.") +#define MSG_CARD_MENU _UxGT("Impr. depuis SD") +#define MSG_NO_CARD _UxGT("Pas de carte") +#define MSG_DWELL _UxGT("Repos...") +#define MSG_USERWAIT _UxGT("Atten. de l'util.") +#define MSG_PRINT_PAUSED _UxGT("Impr. en pause") +#define MSG_PRINT_ABORTED _UxGT("Impr. Annulée") +#define MSG_NO_MOVE _UxGT("Moteurs bloqués.") +#define MSG_KILLED _UxGT("MORT.") +#define MSG_STOPPED _UxGT("STOPPÉ.") +#define MSG_CONTROL_RETRACT _UxGT("Retrait mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Ech. Retr. mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retrait V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Saut Z mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Rappel mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Ech. Rappel mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Rappel V") +#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("Ech. Rappel V") +#define MSG_AUTORETRACT _UxGT("Retrait. Auto.") +#define MSG_FILAMENTCHANGE _UxGT("Changer filament") +#define MSG_FILAMENTLOAD _UxGT("Charger fil.") +#define MSG_FILAMENTUNLOAD _UxGT("Décharger fil.") +#define MSG_FILAMENTUNLOAD_ALL _UxGT("Décharger tout") +#define MSG_INIT_SDCARD _UxGT("Init. la carte SD") +#define MSG_CNG_SDCARD _UxGT("Changer de carte") +#define MSG_ZPROBE_OUT _UxGT("Z sonde hors lit") +#define MSG_SKEW_FACTOR _UxGT("Facteur écart") +#define MSG_BLTOUCH _UxGT("BLTouch") +#define MSG_BLTOUCH_SELFTEST _UxGT("Autotest BLTouch") +#define MSG_BLTOUCH_RESET _UxGT("RaZ BLTouch") +#define MSG_BLTOUCH_DEPLOY _UxGT("Déployer BLTouch") +#define MSG_BLTOUCH_STOW _UxGT("Ranger BLTouch") +#define MSG_HOME _UxGT("Origine") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("Premier") +#define MSG_ZPROBE_ZOFFSET _UxGT("Décalage Z") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Butée abandon") +#define MSG_HEATING_FAILED_LCD _UxGT("Erreur de chauffe") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP. REDONDANTE") +#define MSG_THERMAL_RUNAWAY _UxGT("EMBALLEMENT THERM.") +#define MSG_ERR_MAXTEMP _UxGT("Err: TEMP. MAX") +#define MSG_ERR_MINTEMP _UxGT("Err: TEMP. MIN") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMP. MAX LIT") +#define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMP. MIN LIT") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Contrôle LED"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Lumière"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Préregl. LED"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rouge"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Jaune"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Vert"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Bleu"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violet"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Blanc"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Defaut"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("LEDs perso."); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensité rouge"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensité vert"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensité bleu"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensité blanc"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Luminosité"); +#define MSG_HALTED _UxGT("IMPR. STOPPÉE") +#define MSG_PLEASE_RESET _UxGT("RàZ. SVP") +#define MSG_SHORT_DAY _UxGT("j") // One character only +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only - PROGMEM Language_Str MSG_MOVING = _UxGT("Déplacement..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Débloquer XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Déplacer X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Déplacer Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Déplacer Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudeur"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudeur *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Buse trop froide"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Déplacer %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Déplacer 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Déplacer 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Déplacer 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Vitesse"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Lit Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Buse"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Buse ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Lit"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Caisson"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vit. ventil. "); // 15 car. max - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vit. ventil. ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Vit. enreg. ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra ventil. "); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra ventil. ~"); +#define MSG_HEATING _UxGT("En chauffe...") +#define MSG_BED_HEATING _UxGT("Lit en chauffe...") +#define MSG_DELTA_CALIBRATE _UxGT("Calibration Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrer X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrer Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrer Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrer centre") +#define MSG_DELTA_SETTINGS _UxGT("Réglages Delta") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Calibration Auto") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Hauteur Delta") +#define MSG_DELTA_DIAG_ROD _UxGT("Diagonale") +#define MSG_DELTA_HEIGHT _UxGT("Hauteur") +#define MSG_DELTA_RADIUS _UxGT("Rayon") - PROGMEM Language_Str MSG_FLOW = _UxGT("Flux"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flux ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Contrôler"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Facteur"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temp. Auto."); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Marche"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Arrêt"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Tuning PID terminé"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Echec Autotune! E incorrect"); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Echec Autotune! Temp. trop haute"); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Echec Autotune! Opér. expirée"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Sélectionner"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Sélectionner *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Accélération"); - PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT(" jerk"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT(" jerk"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT(" jerk"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve jerk"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Vélocité"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Déviat. jonct."); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vmin course"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accélération"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Acc.rétraction"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Acc.course"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Fréquence max"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Vitesse min"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pas/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pas/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pas/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pas/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pas/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* pas/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Température"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Mouvement"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("Limite en mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("Limite *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diamètre fil."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diamètre fil. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Retrait mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Charger mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avance K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Avance K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Enregistrer config."); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Charger config."); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restaurer défauts"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initialiser EEPROM"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Config. enregistrée"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("MaJ Firmware SD"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("RaZ imprimante"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualiser"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Surveiller"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Préparer"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Régler"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Démarrer impression"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Suivant"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Init."); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimer"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignorer"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Annuler"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Terminé"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Retour"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Procéder"); - PROGMEM Language_Str MSG_PAUSING = _UxGT("Mise en pause..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause impression"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Reprendre impr."); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Arrêter impr."); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Impression objet"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Annuler objet"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Annuler objet ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Récup. coup."); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Impression SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Pas de média"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Repos..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Attente utilis."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impr. en pause"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Impression"); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impr. annulée"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Moteurs bloqués"); - PROGMEM Language_Str MSG_KILLED = _UxGT("KILLED"); - PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPÉ"); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Rétractation mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Ech. rétr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Vit. rétract°"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Saut Z mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Rét.reprise mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ech.reprise mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("V.rét. reprise"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("V.éch. reprise"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Rétraction auto"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Changement outil"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Augmenter Z"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Vitesse primaire"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Vitesse rétract°"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Garer Extrudeur"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Vitesse reprise"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Vit. ventil."); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Temps ventil."); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Migration d'outil"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Migration auto"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Extrudeur Final"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrer vers *"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Attente buse"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Longueur retrait"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Longueur Extra"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Longueur de purge"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Changer filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Changer filament *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Charger filament"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Charger filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Retrait filament"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Retrait filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Retirer tout"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Charger le média"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Actualiser média"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Retirer le média"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonde Z hors lit"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Facteur écart"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Ranger"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Déployer"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Mode SW"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Mode 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Mode OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Appliquer Mode"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Mise en 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Mise en OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Afficher Mode"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init. TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test décalage Z"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Sauvegarde"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Déployer TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Déployer Sonde Z"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Ranger Sonde Z"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Origine %s%s%s Premier"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Position sonde Z"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Décalage X"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Décalage Y"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Décalage Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Butée abandon"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Err de chauffe"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err TEMP. REDONDANTE"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Err THERMIQUE"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err TEMP. MAX"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err TEMP. MIN"); +#define MSG_INFO_MENU _UxGT("Infos imprimante") +#define MSG_INFO_PRINTER_MENU _UxGT("Infos imprimante") +#define MSG_3POINT_LEVELING _UxGT("Niveau à 3 points") +#define MSG_LINEAR_LEVELING _UxGT("Niveau linéaire") +#define MSG_BILINEAR_LEVELING _UxGT("Niveau bilinéaire") +#define MSG_UBL_LEVELING _UxGT("Niveau lit unifié") +#define MSG_MESH_LEVELING _UxGT("Niveau maillage") +#define MSG_INFO_STATS_MENU _UxGT("Stats. imprimante") +#define MSG_INFO_BOARD_MENU _UxGT("Infos carte") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") +#define MSG_INFO_EXTRUDERS _UxGT("Extrudeurs") +#define MSG_INFO_BAUDRATE _UxGT("Baud") +#define MSG_INFO_PROTOCOL _UxGT("Protocole") +#define MSG_CASE_LIGHT _UxGT("Lumière caisson") +#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Luminosité") - PROGMEM Language_Str MSG_HALTED = _UxGT("IMPR. STOPPÉE"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Redémarrer SVP"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("j"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Nbre impressions") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Terminées") + #define MSG_INFO_PRINT_TIME _UxGT("Tps impr. total") + #define MSG_INFO_PRINT_LONGEST _UxGT("Impr. la + longue") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Total filament") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Impressions") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Terminées") + #define MSG_INFO_PRINT_TIME _UxGT("Total") + #define MSG_INFO_PRINT_LONGEST _UxGT("+ long") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Filament") +#endif - PROGMEM Language_Str MSG_HEATING = _UxGT("en chauffe..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Refroidissement"); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Lit en chauffe..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Refroid. du lit..."); - PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Probe en chauffe..."); - PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Refroid. Probe..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chauffe caisson..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Refroid. caisson..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibration Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrer X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrer Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrer Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrer centre"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Réglages Delta"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Calibration Auto"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Hauteur Delta"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Delta Z sonde"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diagonale"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Hauteur"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Rayon"); +#define MSG_INFO_MIN_TEMP _UxGT("Temp Min") +#define MSG_INFO_MAX_TEMP _UxGT("Temp Max") +#define MSG_INFO_PSU _UxGT("Alimentation") +#define MSG_DRIVE_STRENGTH _UxGT("Puiss. moteur ") +#define MSG_DAC_PERCENT _UxGT("Driver %") +#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM sauv.") - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Infos imprimante"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Infos imprimante"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Niveau à 3 points"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Niveau linéaire"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Niveau bilinéaire"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Niveau lit unifié"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Niveau par grille"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Stats. imprimante"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Infos carte"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistances"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudeurs"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Bauds"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocole"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Protection inactive"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Protection active"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout"); +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("IMPR. PAUSE") +#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("CHARGER FIL") +#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("DECHARGER FIL") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPTIONS REPRISE:") +#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Purger encore") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Reprendre impr.") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Buse: ") +#define MSG_ERR_HOMING_FAILED _UxGT("Echec origine") +#define MSG_ERR_PROBING_FAILED _UxGT("Echec sonde") +#define MSG_M600_TOO_COLD _UxGT("M600: Trop froid") - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Lumière caisson"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Luminosité"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Imprimante incorrecte"); +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Attente Démarrage") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("du filament") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("changer") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Attente de") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("décharger filament") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insérer filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("et app. bouton") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("pour continuer...") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Presser le bouton...") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Pr chauffer la buse") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Buse en chauffe") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Patientez SVP...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Attente de") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Chargement filament") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Attente") + #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("Purger filament") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Attente impression") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("pour reprendre") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Patientez...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejection...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insérer et clic") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Chargement...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Reprise...") +#endif // LCD_HEIGHT < 4 - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nbre impressions"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Terminées"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tps impr. total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impr. la + longue"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total filament"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impressions"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Terminées"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("+ long"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Filament"); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp Min"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp Max"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Alim."); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Puiss. moteur "); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM sauv."); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ERREUR CONNEXION TMC"); - - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CHANGER FILAMENT"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPR. PAUSE"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CHARGER FIL"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DECHARGER FIL"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPTIONS REPRISE:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purger encore"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Reprendre impr."); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Buse: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Capteur fil."); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Echec origine"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Echec sonde"); - - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MAJ firmware MMU!!"); - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOISIR FILAMENT"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU ne répond plus"); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Continuer Imp. MMU"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Reprise MMU..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Charge dans MMU"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Charger tous dans MMU"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Charger dans buse"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Ejecter fil. du MMU"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Ejecter fil. ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Retrait filament"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Chargem. fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejection fil..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Retrait fil...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Tous"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Réinit. MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Réinit. MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Retrait, click"); - - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Composante ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Mixeur"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Dégradé"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Dégradé complet"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Toggle mix"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cycle mix"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Mix dégradé"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Inverser dégradé"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Active V-tool"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Début V-tool"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Fin V-tool"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Réinit. V-tools"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Valider Mix V-tool"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools réinit. ok"); - PROGMEM Language_Str MSG_START_Z = _UxGT("Début Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" Fin Z:"); - PROGMEM Language_Str MSG_GAMES = _UxGT("Jeux"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Casse-briques"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Labyrinthe"); - - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Erreur index page"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Erreur vitesse page"); - - #if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Presser bouton", "pour reprendre")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parking...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Attente filament", "pour démarrer")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insérer filament", "et app. bouton", "pour continuer...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Presser le bouton", "pour chauffer...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Buse en chauffe", "Patienter SVP...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Attente", "retrait du filament")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Attente", "chargement filament")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Attente", "Purge filament")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Presser pour finir", "la purge du filament")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Attente reprise", "impression")); - #else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Clic pour continuer")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Patience...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insérer fil.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Chauffer ?")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Chauffage...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Retrait fil...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Chargement...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purge...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Terminer ?")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reprise...")); - #endif // LCD_HEIGHT < 4 - - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Courant driver"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Mode pas à pas"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop activé"); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Réinit."); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" dans:"); - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correction"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Lissage"); -} +#endif // LANGUAGE_FR_UTF_H diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 2fd4bf6975..960cc8cace 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,602 +16,239 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Galician language (ISO "gl") * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_GL_H +#define LANGUAGE_GL_H #define DISPLAY_CHARSET_ISO10646_1 +#define NOT_EXTENDED_ISO10646_1_5X7 -namespace Language_gl { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" lista.") +#define MSG_SD_INSERTED _UxGT("Tarxeta inserida") +#define MSG_SD_REMOVED _UxGT("Tarxeta retirada") +#define MSG_LCD_ENDSTOPS _UxGT("FinCarro") +#define MSG_MAIN _UxGT("Menu principal") +#define MSG_AUTOSTART _UxGT("Autoarranque") +#define MSG_DISABLE_STEPPERS _UxGT("Apagar motores") +#define MSG_AUTO_HOME _UxGT("Ir a orixe") +#define MSG_AUTO_HOME_X _UxGT("Ir orixe X") +#define MSG_AUTO_HOME_Y _UxGT("Ir orixe Y") +#define MSG_AUTO_HOME_Z _UxGT("Ir orixe Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Calibrar Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Ir orixes XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Prema pulsador") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Seguinte punto") +#define MSG_LEVEL_BED_DONE _UxGT("Nivelado feito") +#define MSG_SET_HOME_OFFSETS _UxGT("Offsets na orixe") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets fixados") +#define MSG_SET_ORIGIN _UxGT("Fixar orixe") +#define MSG_PREHEAT_1 _UxGT("Prequentar PLA") +#define MSG_PREHEAT_1_N _UxGT("Prequentar PLA ") +#define MSG_PREHEAT_1_ALL _UxGT("Preque. PLA Todo") +#define MSG_PREHEAT_1_BEDONLY _UxGT("Preque. PLA Cama") +#define MSG_PREHEAT_1_SETTINGS _UxGT("Preque. PLA conf") +#define MSG_PREHEAT_2 _UxGT("Prequentar ABS") +#define MSG_PREHEAT_2_N _UxGT("Prequentar ABS ") +#define MSG_PREHEAT_2_ALL _UxGT("Preque. ABS Todo") +#define MSG_PREHEAT_2_BEDONLY _UxGT("Preque. ABS Cama") +#define MSG_PREHEAT_2_SETTINGS _UxGT("Preque. ABS conf") +#define MSG_COOLDOWN _UxGT("Arrefriar") +#define MSG_SWITCH_PS_ON _UxGT("Acender") +#define MSG_SWITCH_PS_OFF _UxGT("Apagar") +#define MSG_EXTRUDE _UxGT("Extrudir") +#define MSG_RETRACT _UxGT("Retraer") +#define MSG_MOVE_AXIS _UxGT("Mover eixe") +#define MSG_BED_LEVELING _UxGT("Nivelar cama") +#define MSG_LEVEL_BED _UxGT("Nivelar cama") +#define MSG_MOVE_X _UxGT("Mover X") +#define MSG_MOVE_Y _UxGT("Mover Y") +#define MSG_MOVE_Z _UxGT("Mover Z") +#define MSG_MOVE_E _UxGT("Extrusor") +#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") +#define MSG_MOVE_1MM _UxGT("Mover 1mm") +#define MSG_MOVE_10MM _UxGT("Mover 10mm") +#define MSG_SPEED _UxGT("Velocidade") +#define MSG_BED_Z _UxGT("Cama Z") +#define MSG_NOZZLE _UxGT("Bico") +#define MSG_BED _UxGT("Cama") +#define MSG_FAN_SPEED _UxGT("Velocidade vent.") +#define MSG_FLOW _UxGT("Fluxo") +#define MSG_CONTROL _UxGT("Control") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Autotemp") +#define MSG_ON _UxGT("On ") +#define MSG_OFF _UxGT("Off") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Escolla") +#define MSG_ACC _UxGT("Acel") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VTrav min") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-retract") +#define MSG_A_TRAVEL _UxGT("A-travel") +#define MSG_STEPS_PER_MM _UxGT("Pasos/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("A pasos/mm") + #define MSG_BSTEPS _UxGT("B pasos/mm") + #define MSG_CSTEPS _UxGT("C pasos/mm") +#else + #define MSG_ASTEPS _UxGT("X pasos/mm") + #define MSG_BSTEPS _UxGT("Y pasos/mm") + #define MSG_CSTEPS _UxGT("Z pasos/mm") +#endif +#define MSG_ESTEPS _UxGT("E pasos/mm") +#define MSG_E1STEPS _UxGT("E1 pasos/mm") +#define MSG_E2STEPS _UxGT("E2 pasos/mm") +#define MSG_E3STEPS _UxGT("E3 pasos/mm") +#define MSG_E4STEPS _UxGT("E4 pasos/mm") +#define MSG_E5STEPS _UxGT("E5 pasos/mm") +#define MSG_TEMPERATURE _UxGT("Temperatura") +#define MSG_MOTION _UxGT("Movemento") +#define MSG_FILAMENT _UxGT("Filamento") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E en mm3") +#define MSG_FILAMENT_DIAM _UxGT("Diam. fil.") +#define MSG_CONTRAST _UxGT("Constraste LCD") +#define MSG_STORE_EEPROM _UxGT("Gardar en memo.") +#define MSG_LOAD_EEPROM _UxGT("Cargar de memo.") +#define MSG_RESTORE_FAILSAFE _UxGT("Cargar de firm.") +#define MSG_REFRESH _UxGT("Volver a cargar") +#define MSG_WATCH _UxGT("Monitorizacion") +#define MSG_PREPARE _UxGT("Preparar") +#define MSG_TUNE _UxGT("Axustar") +#define MSG_PAUSE_PRINT _UxGT("Pausar impres.") +#define MSG_RESUME_PRINT _UxGT("Seguir impres.") +#define MSG_STOP_PRINT _UxGT("Deter impres.") +#define MSG_CARD_MENU _UxGT("Tarxeta SD") +#define MSG_NO_CARD _UxGT("Sen tarxeta SD") +#define MSG_DWELL _UxGT("En repouso...") +#define MSG_USERWAIT _UxGT("A espera...") +#define MSG_PRINT_ABORTED _UxGT("Impre. cancelada") +#define MSG_NO_MOVE _UxGT("Sen movemento.") +#define MSG_KILLED _UxGT("PROGRAMA MORTO") +#define MSG_STOPPED _UxGT("PROGRAMA PARADO") +#define MSG_CONTROL_RETRACT _UxGT("Retraccion mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Cambio retra. mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retraccion V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Alzar Z mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Recup. retra. mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Cambio recup. mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Recuperacion V") +#define MSG_AUTORETRACT _UxGT("Retraccion auto.") +#define MSG_FILAMENTCHANGE _UxGT("Cambiar filamen.") +#define MSG_INIT_SDCARD _UxGT("Iniciando SD") +#define MSG_CNG_SDCARD _UxGT("Cambiar SD") +#define MSG_ZPROBE_OUT _UxGT("Sonda-Z sen cama") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_BLTOUCH_SELFTEST _UxGT("Comprobar BLTouch") +#define MSG_BLTOUCH_RESET _UxGT("Iniciar BLTouch") +#define MSG_FIRST _UxGT("first") +#define MSG_ZPROBE_ZOFFSET _UxGT("Offset Z") +#define MSG_BABYSTEP_X _UxGT("Micropaso X") +#define MSG_BABYSTEP_Y _UxGT("Micropaso Y") +#define MSG_BABYSTEP_Z _UxGT("Micropaso Z") +#define MSG_ENDSTOP_ABORT _UxGT("Erro fin carro") +#define MSG_HEATING_FAILED_LCD _UxGT("Fallo quentando") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Erro temperatura") +#define MSG_THERMAL_RUNAWAY _UxGT("Temp. excesiva") +#define MSG_ERR_MAXTEMP _UxGT("Err: temp. max.") +#define MSG_ERR_MINTEMP _UxGT("Err: temp. min.") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err: MAXTEMP BED") +#define MSG_ERR_MINTEMP_BED _UxGT("Err: MINTEMP BED") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("SISTEMA MORTO") +#define MSG_PLEASE_RESET _UxGT("Debe reiniciar!") +#define MSG_SHORT_DAY _UxGT("d") // One character only +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("Quentando...") +#define MSG_BED_HEATING _UxGT("Quentando cama...") +#define MSG_DELTA_CALIBRATE _UxGT("Calibracion Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") +#define MSG_INFO_MENU _UxGT("Acerca de...") +#define MSG_INFO_PRINTER_MENU _UxGT("Informacion") +#define MSG_INFO_STATS_MENU _UxGT("Estadisticas") +#define MSG_INFO_BOARD_MENU _UxGT("Placa nai") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistores") +#define MSG_INFO_EXTRUDERS _UxGT("Extrusores") +#define MSG_INFO_BAUDRATE _UxGT("Baudios") +#define MSG_INFO_PROTOCOL _UxGT("Protocolo") +#define MSG_CASE_LIGHT _UxGT("Luz") +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Total traballos") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Total completos") + #define MSG_INFO_PRINT_TIME _UxGT("Tempo impresion") + #define MSG_INFO_PRINT_LONGEST _UxGT("Traballo +longo") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Total extruido") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Traballos") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completos") + #define MSG_INFO_PRINT_TIME _UxGT("Tempo") + #define MSG_INFO_PRINT_LONGEST _UxGT("O +longo") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extruido") +#endif +#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") +#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") +#define MSG_INFO_PSU _UxGT("Fonte alime.") +#define MSG_DRIVE_STRENGTH _UxGT("Potencia motor") +#define MSG_DAC_PERCENT _UxGT("Motor %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Garda DAC EEPROM") - constexpr uint8_t CHARSIZE = 1; - PROGMEM Language_Str LANGUAGE = _UxGT("Galician"); +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Segue traballo") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" lista."); - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("SI"); - PROGMEM Language_Str MSG_NO = _UxGT("NON"); - PROGMEM Language_Str MSG_BACK = _UxGT("Atrás"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Cancelando..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tarxeta inserida"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tarxeta retirada"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Agardando ao SD/USB"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Erro lectura SD/USB"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido"); - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Desbord. Subch."); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("FinCarro"); - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("FinCarro SW"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Axustes avanzados"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuración"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoarranque"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Apagar motores"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menú depuración"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra progreso"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ir a orixe"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Ir orixe X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Ir orixe Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Ir orixe Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Autoaliñar Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Ir orixes XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Prema pulsador"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Seguinte punto"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Fin Nivelación!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Compensación Altura"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Axustar Desfases"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfases aplicados"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Fixar orixe"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Prequentar ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Prequentar ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Todo"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Cama"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" conf"); +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Agarde para") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("iniciar troco") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("de filamento") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Agarde pola") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("descarga do") + #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("filamento") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Introduza o") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("filamento e") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("faga click") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Agarde pola") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("carga do") + #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("filamento") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Agarde para") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("seguir co") + #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("traballo") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Agarde...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Descargando...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Introduza e click") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Cargando...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Seguindo...") +#endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Prequentar $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Prequentar $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preque. $ Bico"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preque. $ Bico ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preque. $ Todo"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preque. $ Cama"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preque. $ conf"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Preque. Personali."); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Arrefriar"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecuencia"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Láser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Láser Apagado"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Láser Aceso"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potencia Láser"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Control Fuso"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Fuso Apagado"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Fuso Aceso"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potencia Fuso"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverter xiro"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Acender"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Apagar"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruír"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Retraer"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover eixe"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelando Cama"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar Cama"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Nivelar Cantos"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Seguinte Canto"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mallado"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editar Mallado"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Ed. Mallado Detida"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punto de Proba"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Índice X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Índice Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandos Personaliz."); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probar Sonda"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punto"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Desviación"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ferramentas Compens"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Estacionar"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicación"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia Espello"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Control Total"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2º Bico X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2º Bico Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2º Bico Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Executando G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Ferramentas UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto de inclinación"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Facer Malla Manual"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Colocar Calzo e Medir"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Medir"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Quitar e Medir Cama"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Mover ao Seguinte"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activar UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Desactivar UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp Cama"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp Cama"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp Bico"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp Bico"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Editar Malla"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit. Malla Person."); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Axuste Fino da Malla"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Fin Edición da Malla"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crear Malla Person."); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Crear Malla"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Crear Malla ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Validar Malla ($)"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Crear Malla Fría"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Axustar Altura Malla"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Altura"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validar Malla"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validar Malla perso."); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Quentando Cama"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Quentando Bico"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Traballo manual..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Traballo Lonxit Fixa"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Fin Traballo"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Cancelado"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Saíndo de G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continuar Malla"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Nivelación Malla"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelación 3Puntos"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Nivelación Grid"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Nivelar Malla"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Puntos Laterais"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo de Mapa "); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Gardar Mapa"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Enviar ao Host"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Gardar en CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Backup Externo"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Info do UBL"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Cantidade de Recheo"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Recheo Manual"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Recheo Intelixente"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Recheo da Malla"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar todo"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar cercanos"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Axustar Fino Todo"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Axustar Fino Cerc"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Almacenamento Malla"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Rañura Memoria"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Cargar Malla Cama"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Gardar Malla Cama"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Malla %i Cargada"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Malla %i Gardada"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Sen Gardar"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Erro: Gardadado UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Erro: Recuperación UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Desfase de Z: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Desfase de Z Detido"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Paso a Paso"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Crear Malla Fría"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Recheo Intelixente"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validar Malla"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Axustar Fino Todo"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validar Malla"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Axustar Fino Todo"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Gardar Malla Cama"); - - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Control LED"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Luces"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Axustes Luz"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Vermello"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Laranxa"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Amarelo"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Verde"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Azul"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Índigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violeta"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Branco"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Por defecto"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luces personalizadas"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensidade Vermello"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensidade Verde"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensidade Azul"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensidade Branco"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brillo"); - - PROGMEM Language_Str MSG_MOVING = _UxGT("Movendo..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Libre XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Bico moi frío"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Cama Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Bico"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Bico ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Bico Estacionado"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Bico Standby"); - PROGMEM Language_Str MSG_BED = _UxGT("Cama"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Cámara"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. Ventilador"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. Ventilador ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Ventilador Mem. ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Vel. Vent. Extra"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Vel. Vent. Extra ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Controlador Vent."); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Velocidade Repouso"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo Auto"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Velocidade Activa"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Tempo Repouso"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxo"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Fluxo ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temperatura Auto."); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Acender"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Apagar"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("Auto-Sint. PID"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("Auto-Sint. PID *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Fin Auto-Sint PID"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Auto-Sint. fallida. Extrusor danado."); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Auto-Sint. fallida. Temperatura moi alta."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Auto-Sint. fallida. Tempo excedido."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Escolla"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Escolla *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Acel"); - PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Jerk"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Desvío Unión"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocidade"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("V-viaxe min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Aceleración"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retrac."); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-viaxe"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frecuencia max"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Avance min"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pasos/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pasos/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pasos/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pasos/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pasos/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* pasos/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Movemento"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. fil."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diam. fil. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarga mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carga mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avance K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Avance K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Constraste LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Gardar Configuración"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Cargar Configuración"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Rest. Defecto"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inicializar EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Erro: CRC EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Erro: Índice EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Erro: Versión EEPROM"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Config Gardada"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Actualizar SD/USB"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reiniciar Impresora"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Información"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Axustar"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Comezar impresión"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Seguinte"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Comezar"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Deter"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimir"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reiniciar"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancelar"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Listo"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Atrás"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Proceder"); - PROGMEM Language_Str MSG_PAUSING = _UxGT("Pausando..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impresión"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Retomar impresión"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Deter impresión"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Imprimindo Obxecto"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancelar Obxecto"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancelar Obxecto ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Recuperar Impresión"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Tarxeta SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Sen tarxeta SD"); - PROGMEM Language_Str MSG_DWELL = _UxGT("En repouso..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Prema para Retomar.."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impresión Pausada"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Imprimindo..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impresión Cancelada"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Fin Impresión"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sen movemento."); - PROGMEM Language_Str MSG_KILLED = _UxGT("MORTO."); - PROGMEM Language_Str MSG_STOPPED = _UxGT("DETIDO."); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retraer mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Cambio retra. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraer V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Alzar Z mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Recup. retra. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Cambio recup. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Recuperacion V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retracción"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Lonxitude Retracción"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Cambio Extra"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Lonxitude de Purga"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Cambiar Ferramenta"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Levantar Z"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Velocidade prim."); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Vel. de Retracción"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Extrusor Est."); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Vel. Recuperación"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Vel. Ventilador"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Tempo Ventilador"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Cambio Ferramenta"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Cambio Automático"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Último Extrusor"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Cambio a *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambiar Filamento"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Cambiar Filamento *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Cargar Filamento"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Cargar Filamento *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Descargar Filamento"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Descargar Filamento *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Descargar Todo"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Iniciar SD/USB"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambiar SD/USB"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Lanzar SD/USB"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda-Z fóra Cama"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Factor de Desviación"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Auto-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reiniciar"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Recoller"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Estender"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Modo Software"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Modo 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Modo OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Modo Almacenar"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Axustar BLTouch a 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Axustar BLTouch a OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Modo de Informe"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PERIGO: Unha mala configuración pode producir daños! Proceder igualmente?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Iniciar TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test de Desfase Z"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Gardar"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Estender TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Estender Sonda Z"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Recoller Sonda Z"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Orixe %s%s%s Primeiro"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Desfases Sonda"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Desfase Sonda X"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Desfase Sonda Y"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desfase Z"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropaso X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropaso Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropaso Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Erro FinCarro"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fallo Quentando"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FUGA TÉRMICA"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("FUGA TÉRMICA CAMA"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("FUGA TÉRMICA CÁMARA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Erro:TEMP MÁX"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Erro:TEMP MÍN"); - PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESORA DETIDA"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Debe reiniciar!"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Quentando..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Arrefriando..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Quentando cama..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Enfriando Cama..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Quentando Cámara..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Arrefriando Cámara..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibracion Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Configuración Delta"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibración"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Ax. Altura Delta"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Axustar Sonda Z"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonal"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altura"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radio"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Acerca de..."); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Información"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelación 3puntos"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelación Lineal"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelación Bilineal"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelación UBL"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelación en Malla"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estatísticas"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Placa nai"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusores"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudios"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Reloxo Traballo: OFF"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Reloxo Traballo: ON"); - - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz da Caixa"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Brillo Luces"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("IMPRESORA INCORRECTA"); - - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total Impresións"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo Total Imp."); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impresión máis longa"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruído"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impresións"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Máis Longa"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruido"); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp Mín"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp Máx"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Fonte Alimentación"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Forza do Motor"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ERRO CONEX. TMC"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escribe DAC EEPROM"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIAR FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESIÓN PAUSADA"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARGAR FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARGAR FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPCIÓN DE RETOMAR:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar máis"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Retomar traballo"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Bico: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sensor Filamento"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm Sensor Fil"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Fallo ao ir á Orixe"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Fallo ao Sondar"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ESCOLLE FILAMENTO"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Actualizar FW MMU!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Precisa Atención."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Retomar impr."); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Retomando..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Cargar Filamento"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Cargar Todo"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Cargar até bico"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Expulsar Filamento"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Expulsar Filamento ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Descargar Filamento"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Cargando Fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Expulsando Fil. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Descargando Fil..."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Todo"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reiniciar MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Reiniciando MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Expulsar, premer"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Mestura"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Compoñente ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Mesturadora"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Degradado"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Degradado Total"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Mestura Conmutada"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Mestura Cíclica"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Mestura de Degradado"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Degradado Inverso"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Activar Ferr-V"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Inicio Ferr-V"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Fin Ferr-V"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias Ferr-V"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reiniciar Ferr-V"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit mest. Ferr-V"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ferr-V reiniciadas"); - PROGMEM Language_Str MSG_START_Z = _UxGT("Inicio Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" Fin Z:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Xogos"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Labirinto"); - - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Preme o botón para", "continuar impresión")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Estacionando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Agarde para", "comezar cambio", "de filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Introduza o", "filamento e", "faga click")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Prema o botón para", "quentar o bico")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Quentando bico", "Agarde, por favor...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Agarde pola", "descarga do", "filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Agarde pola", "carga do", "filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Agarde para", "purgar o filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Prema para finalizar", "a purga do filamen.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Agarde a que", "se retome", "a impresión")); - #else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Premer para continuar")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Estacionando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Agarde...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Introduza e click")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Prema para quentar")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Quentando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Descargando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Cargando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Prema para finalizar")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Retomando...")); - #endif - - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Controladores TMC"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Controlador Actual"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Limiar Hibrido"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Orixe sen Sensores"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reiniciar"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" dentro:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Reacción"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Corrección"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Suavizado"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Nivel Eixe X"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrar"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Tempo exc. Quent."); - PROGMEM Language_Str MSG_REHEAT = _UxGT("Requentar"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Requentando..."); -} +#endif // LANGUAGE_GL_H diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index 1b2ae41fce..efdeae8b5b 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,155 +16,238 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Croatian (Hrvatski) * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_HR_H +#define LANGUAGE_HR_H #define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays. +#define CHARSIZE 2 -namespace Language_hr { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" spreman.") +#define MSG_SD_INSERTED _UxGT("SD kartica umetnuta") +#define MSG_SD_REMOVED _UxGT("SD kartica uklonjena") +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters +#define MSG_MAIN _UxGT("Main") +#define MSG_AUTOSTART _UxGT("Auto pokretanje") +#define MSG_DISABLE_STEPPERS _UxGT("Ugasi steppere") +#define MSG_AUTO_HOME _UxGT("Automatski homing") +#define MSG_AUTO_HOME_X _UxGT("Home-aj X") +#define MSG_AUTO_HOME_Y _UxGT("Home-aj Y") +#define MSG_AUTO_HOME_Z _UxGT("Home-aj Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibriraj Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Home-aj XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Klikni za početak") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Sljedeća točka") +#define MSG_LEVEL_BED_DONE _UxGT("Niveliranje gotovo!") +#define MSG_SET_HOME_OFFSETS _UxGT("Postavi home offsete") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets postavljeni") +#define MSG_SET_ORIGIN _UxGT("Postavi ishodište") +#define MSG_PREHEAT_1 _UxGT("Predgrij PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Sve") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Bed") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" conf") +#define MSG_PREHEAT_2 _UxGT("Predgrij ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Sve") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Bed") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" conf") +#define MSG_COOLDOWN _UxGT("Hlađenje") +#define MSG_SWITCH_PS_ON _UxGT("Uključi napajanje") +#define MSG_SWITCH_PS_OFF _UxGT("Isključi napajanje") +#define MSG_EXTRUDE _UxGT("Extrude") +#define MSG_RETRACT _UxGT("Retract") +#define MSG_MOVE_AXIS _UxGT("Miči os") +#define MSG_BED_LEVELING _UxGT("Niveliraj bed") +#define MSG_LEVEL_BED _UxGT("Niveliraj bed") +#define MSG_MOVE_X _UxGT("Miči X") +#define MSG_MOVE_Y _UxGT("Miči Y") +#define MSG_MOVE_Z _UxGT("Miči Z") +#define MSG_MOVE_E _UxGT("Extruder") +#define MSG_MOVE_01MM _UxGT("Miči 0.1mm") +#define MSG_MOVE_1MM _UxGT("Miči 1mm") +#define MSG_MOVE_10MM _UxGT("Miči 10mm") +#define MSG_SPEED _UxGT("Brzina") +#define MSG_BED_Z _UxGT("Bed Z") +#define MSG_NOZZLE _UxGT("Dizna") +#define MSG_BED _UxGT("Bed") +#define MSG_FAN_SPEED _UxGT("Brzina ventilatora") +#define MSG_FLOW _UxGT("Flow") +#define MSG_CONTROL _UxGT("Control") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Autotemp") +#define MSG_ON _UxGT("On ") +#define MSG_OFF _UxGT("Off") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Odaberi") +#define MSG_ACC _UxGT("Accel") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VTrav min") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-retract") +#define MSG_A_TRAVEL _UxGT("A-travel") +#define MSG_STEPS_PER_MM _UxGT("Steps/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Asteps/mm") + #define MSG_BSTEPS _UxGT("Bsteps/mm") + #define MSG_CSTEPS _UxGT("Csteps/mm") +#else + #define MSG_ASTEPS _UxGT("Xsteps/mm") + #define MSG_BSTEPS _UxGT("Ysteps/mm") + #define MSG_CSTEPS _UxGT("Zsteps/mm") +#endif +#define MSG_ESTEPS _UxGT("Esteps/mm") +#define MSG_E1STEPS _UxGT("E1steps/mm") +#define MSG_E2STEPS _UxGT("E2steps/mm") +#define MSG_E3STEPS _UxGT("E3steps/mm") +#define MSG_E4STEPS _UxGT("E4steps/mm") +#define MSG_E5STEPS _UxGT("E5steps/mm") +#define MSG_TEMPERATURE _UxGT("Temperature") +#define MSG_MOTION _UxGT("Gibanje") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") +#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") +#define MSG_CONTRAST _UxGT("Kontrast LCD-a") +#define MSG_STORE_EEPROM _UxGT("Pohrani u memoriju") +#define MSG_LOAD_EEPROM _UxGT("Učitaj memoriju") +#define MSG_RESTORE_FAILSAFE _UxGT("Učitaj failsafe") +#define MSG_REFRESH _UxGT("Osvježi") +#define MSG_WATCH _UxGT("Info screen") +#define MSG_PREPARE _UxGT("Pripremi") +#define MSG_TUNE _UxGT("Tune") +#define MSG_PAUSE_PRINT _UxGT("Pauziraj print") +#define MSG_RESUME_PRINT _UxGT("Nastavi print") +#define MSG_STOP_PRINT _UxGT("Zaustavi print") +#define MSG_CARD_MENU _UxGT("Printaj s SD kartice") +#define MSG_NO_CARD _UxGT("Nema SD kartice") +#define MSG_DWELL _UxGT("Sleep...") +#define MSG_USERWAIT _UxGT("Čekaj korisnika...") +#define MSG_PRINT_ABORTED _UxGT("Print otkazan") +#define MSG_NO_MOVE _UxGT("No move.") +#define MSG_KILLED _UxGT("KILLED. ") +#define MSG_STOPPED _UxGT("ZAUSTAVLJEN. ") +#define MSG_CONTROL_RETRACT _UxGT("Retract mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Re.mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retract V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Hop mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_AUTORETRACT _UxGT("AutoRetr.") +#define MSG_FILAMENTCHANGE _UxGT("Promijeni filament") +#define MSG_INIT_SDCARD _UxGT("Init. SD karticu") +#define MSG_CNG_SDCARD _UxGT("Promijeni SD karticu") +#define MSG_ZPROBE_OUT _UxGT("Z probe out. bed") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") +#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("first") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Endstop abort") +#define MSG_HEATING_FAILED_LCD _UxGT("Grijanje neuspješno") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: REDUNDANT TEMP") +#define MSG_THERMAL_RUNAWAY _UxGT("THERMAL RUNAWAY") +#define MSG_ERR_MAXTEMP _UxGT("Err: MAXTEMP") +#define MSG_ERR_MINTEMP _UxGT("Err: MINTEMP") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err: MAXTEMP BED") +#define MSG_ERR_MINTEMP_BED _UxGT("Err: MINTEMP BED") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("PRINTER HALTED") +#define MSG_PLEASE_RESET _UxGT("Please reset") +#define MSG_SHORT_DAY _UxGT("d") // One character only +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("Grijanje...") +#define MSG_BED_HEATING _UxGT("Grijanje Bed-a...") +#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibracija") +#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibriraj X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibriraj Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibriraj Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibriraj Središte") +#define MSG_INFO_MENU _UxGT("O printeru") +#define MSG_INFO_PRINTER_MENU _UxGT("Podaci o printeru") +#define MSG_INFO_STATS_MENU _UxGT("Statistika printera") +#define MSG_INFO_BOARD_MENU _UxGT("Podaci o elektronici") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistori") +#define MSG_INFO_EXTRUDERS _UxGT("Extruderi") +#define MSG_INFO_BAUDRATE _UxGT("Baud") +#define MSG_INFO_PROTOCOL _UxGT("Protokol") +#define MSG_CASE_LIGHT _UxGT("Osvjetljenje") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Croatian"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Broj printova") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Završeni") + #define MSG_INFO_PRINT_TIME _UxGT("Ukupno printanja") + #define MSG_INFO_PRINT_LONGEST _UxGT("Najduži print") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrudirano ukupno") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Printovi") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Završeni") + #define MSG_INFO_PRINT_TIME _UxGT("Ukupno") + #define MSG_INFO_PRINT_LONGEST _UxGT("Najduži") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrudirano") +#endif - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" spreman."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD kartica umetnuta"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD kartica uklonjena"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters - PROGMEM Language_Str MSG_MAIN = _UxGT("Main"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto pokretanje"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Ugasi steppere"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Automatski homing"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home-aj X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home-aj Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home-aj Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Home-aj XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klikni za početak"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Sljedeća točka"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Niveliranje gotovo!"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Postavi home offsete"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets postavljeni"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Postavi ishodište"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Predgrij ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Predgrij ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Sve"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Bed"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" conf"); +#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") +#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") +#define MSG_INFO_PSU _UxGT("Napajanje") +#define MSG_DRIVE_STRENGTH _UxGT("Drive Strength") +#define MSG_DAC_PERCENT _UxGT("Driver %") +#define MSG_DAC_EEPROM_WRITE _UxGT("DAC EEPROM Write") - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Predgrij $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Predgrij $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Predgrij $ Dizna"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Predgrij $ Dizna ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Predgrij $ Sve"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Predgrij $ Bed"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Predgrij $ conf"); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Hlađenje"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Uključi napajanje"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Isključi napajanje"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Miči os"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Niveliraj bed"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveliraj bed"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Miči X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Miči Y"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Miči %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Miči 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Miči 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Miči 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Brzina"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dizna"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Dizna ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Bed"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Brzina ventilatora"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Brzina ventilatora ~"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Odaberi"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Odaberi *"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Gibanje"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD-a"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Pohrani u memoriju"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Učitaj memoriju"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Učitaj Defaults"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Osvježi"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info screen"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Pripremi"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pauziraj print"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Nastavi print"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zaustavi print"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Printaj s SD kartice"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Nema SD kartice"); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Čekaj korisnika..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print otkazan"); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ZAUSTAVLJEN. "); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Promijeni filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Promijeni filament *"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Init. SD karticu"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Promijeni SD karticu"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Grijanje neuspješno"); - PROGMEM Language_Str MSG_HEATING = _UxGT("Grijanje..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Grijanje Bed-a..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibracija"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibriraj X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibriraj Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibriraj Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibriraj Središte"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O printeru"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Podaci o printeru"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistika printera"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Podaci o elektronici"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistori"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruderi"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Osvjetljenje"); +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Nastavi print") - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Neispravan pisač"); +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čekaj početak") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("filamenta") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("promijeni") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Čekaj") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament unload") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Umetni filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("i pritisni tipku") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("za nastavak...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Pričekaj") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament load") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wait for print") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("to resume") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Pričekaj...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejecting...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insert and Click") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Loading...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Nastavljam...") +#endif // LCD_HEIGHT < 4 - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Broj printova"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Završeni"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Ukupno printanja"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najduži print"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudirano ukupno"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Printovi"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Završeni"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Ukupno"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najduži"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudirano"); - #endif - - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Napajanje"); - - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Nastavi print"); - - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Čekaj", "filament unload")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Pričekaj", "filament load")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Nastavljam...")); - - #if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čekaj početak", "filamenta", "promijeni")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Umetni filament", "i pritisni tipku", "za nastavak...")); - #else - // Up to 2 lines allowed - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT("Pričekaj..."); - //PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("?", "?")); - #endif -} +#endif // LANGUAGE_HR_H diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h deleted file mode 100644 index 6e1b30c180..0000000000 --- a/Marlin/src/lcd/language/language_hu.h +++ /dev/null @@ -1,630 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Magyar - * - * LCD Menü Üzenetek. Lásd még https://marlinfw.org/docs/development/lcd_language.html - * Marlin 2.0.x bugfix Magyar fordítása. A fordítást folyamatosan javítom és frissítem. - * A Magyar fordítást készítette: AntoszHUN - * - * - */ - -namespace Language_hu { - using namespace Language_en; // A fordítás az örökölt Amerikai Angol (English) karakterláncokat használja. - - - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Magyar"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Kész."); - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("IGEN"); - PROGMEM Language_Str MSG_NO = _UxGT("NEM"); - PROGMEM Language_Str MSG_BACK = _UxGT("Vissza"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Megszakítás..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló Behelyezve"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló Eltávolítva"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB eltávolítva"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba"); - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Túlfolyás"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Végállás"); // Maximum 8 karakter - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Szoft. Végállás"); - PROGMEM Language_Str MSG_MAIN = _UxGT(""); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("További Beállítások"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguráció"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoinditás"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hiba Menü"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("XYZ Auto kezdöpont"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X Kezdöpont"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Kezdöpont"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Kezdöpont"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Igazítás"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ Kezdöpont"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kattints a kezdéshez."); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö Pont"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Szintezés Kész!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Szint Csökkentés"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Kezdöpont eltolás"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Eltolás beállítva."); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Eredeti Be"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Fütés ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Fütés ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Fej"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Fej ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Mind"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Ágy"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Beáll"); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Fütés $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Fütés $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Fütés $ Fej"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Fütés $ Fej ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Fütés $ Mind"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Fütés $ Ágy"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Fütés $ Beáll"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Egyedi Elömelegítés"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Visszahütés"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lézer Vezérlés"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lézer Ki"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lézer Be"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lézer Teljesítmény"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Orsó Vezérlés"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Orsó Ki"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Orsó Be"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó Teljesítmény"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó Hátra"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bekapcsolás"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Kikapcsolás"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudál"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Visszahúz"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Tengelyek Mozgatása"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ágy Szintezés"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Ágy szintezése"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Sarok szint"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Következö sarok"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Háló Szerkesztö"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Háló Szerkesztése"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Háló Szerk. Állj"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Próbapont"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Érték"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni Parancs"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Teszt"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Pont"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Eltérés"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mód"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Eszköz Eltolás"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkolás"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikálás"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Tükrözött másolás"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Teljes felügyelet"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. fúvóka X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. fúvóka Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fúvóka Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Szintezz! G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Eszköz"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Egységes Ágy Szint"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Döntési Pont"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Kézi Háló Építés"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Tégy alátétet és mérj"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mérés"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Üres ágyat mérj"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Továbblépés"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL Aktivál"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL Deaktivál"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ágy Höfok"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Ágy Höfok"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fúvóka Höfok"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fúvóka Höfok"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Háló Szerkesztés"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Egyéni Háló Szerkesztés"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Finomított Háló"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Háló Kész"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Egyéni Háló Építés"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Háló Építés"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló Építés ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló Elfogadás ($)"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Hideg Háló Építés"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("AHáló Magasság Állítása"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Összmagasság"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló Elfogadás"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi Háló Elfogadása"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ágy Fűtés"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka Fűtés"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Kézi alapozás..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fix hosszúságú alap"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Alapozás Kész"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Törölve"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Kilépö G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Ágy Háló Folyt."); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Háló Szintezés"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Pontos Szintezés"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Rács Szintezés"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Háló Szint"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Oldal pontok"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Térkép Típus"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Háló Térkép Kimenet"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host Kimenet"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV Kimenet"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Nyomtató Backup Ki"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Infó Kimenet"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Kitöltési Költség"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Kézi Kitöltés"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Okos Kitöltés"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Háló Kitöltés"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Minden Érvénytelen"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Közelebbi Érvénytelen"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Mindet Finomhangolja"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Közelebbi Finomhangolása"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Háló Tárolás"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memória Foglalat"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ágy háló Betöltés"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Ágy háló Mentés"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Háló %i Betöltve"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Háló %i Mentve"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nincs tároló"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hiba: UBL Mentés"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hiba: UBL Visszaáll"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Eltolás: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Eltolás Leállítva"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Lépésröl Lépésre UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Hideg Háló Készítés"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligens Kitöltés"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Háló Érvényesítés"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Minden Finomítása"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Háló Érvényesítés"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Minden Finomítása"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Ágy Háló Mentése"); - - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Vezérlés"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Világítás"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Beállított Színek"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Piros"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Narancs"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Sárga"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zöld"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Kék"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigó"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Viola"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Fehér"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Alapérték"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni Szín"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros Intenzitás"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zöld Intenzitás"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Kék Intenzitás"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Fehér Intenzitás"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Fényerö"); - - PROGMEM Language_Str MSG_MOVING = _UxGT("Mozgás..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY Szabad"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("X Mozgás"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Y Mozgás"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Z Mozgás"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Adagoló"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Adagoló *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fúvóka túl hideg"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mozgás %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mozgás 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Sebesség"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Z ágy"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Fúvóka"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Fúvóka ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Fej Parkolva"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Fej Készenlétbe"); - PROGMEM Language_Str MSG_BED = _UxGT("Ágy"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Burkolat"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Hütés sebesség"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Hütés sebesség ="); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Tárolt Hütés ="); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra hütés sebesség"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra hütés sebesség ="); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Hűtésvezérlés"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Alapjárat"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Automatikus Mód"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív Sebesség"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Készenlét"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Folyás"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Folyás ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Konfiguráció"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Minimum"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Maximum"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Tényezö"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Automata Höfok"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Be"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Ki"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Hangolás"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Hangolás *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID hangolás kész"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba. Rossz Adagoló."); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Hangolási hiba. Magas hömérséklet."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Hangolási hiba! Idötúllépés."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Kiválaszt"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Kiválaszt *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Gyorsítás"); - PROGMEM Language_Str MSG_JERK = _UxGT("Rántás"); - PROGMEM Language_Str MSG_VA_JERK = LCD_STR_A _UxGT(" Ránt. Seb."); - PROGMEM Language_Str MSG_VB_JERK = LCD_STR_B _UxGT(" Ránt. Seb."); - PROGMEM Language_Str MSG_VC_JERK = LCD_STR_C _UxGT(" Ránt. Seb."); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("E Ránt. Seb."); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Csomopont Eltérés"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Sebesség"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Max Sebesség ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Max Sebesség ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Max Sebesség ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Max Sebesség ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Max Sebesség *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Min Sebesség"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Min Utazó.seb."); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Gyorsulás"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Max Gyors. ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Max Gyors. ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Max Gyors. ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Max Gyors. ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Max Gyorsulás *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Visszahúzás"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Utazás"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Max Frekvencia"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min Elötolás"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Lépés/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" lépés/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" lépés/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" lépés/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E lépés/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*lépés/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Höfok"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Mozgatások"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Nyomtatószál"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm³-ben"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Szál. Átm."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Szál. Átm. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Kiadás mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Betöltés mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Haladó K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Haladó K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontraszt"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Mentés EEPROM"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Betöltés EEPROM"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Alapértelmezett"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM Inicializálás"); - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Hiba: EEPROM CRC"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM Index"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM Verzió"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Beállítások Mentve"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Tároló Frissítés"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Nyomtató Újraindítása"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Frissítés"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(""); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Vezérlés"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Hangolás"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Nyomtatás Indítása"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Tovább"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Kezdet"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Állj"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Nyomtatás"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Újraindítás"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Mégse"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Kész"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Vissza"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Folytatás"); - PROGMEM Language_Str MSG_PAUSING = _UxGT("Szüneteltetve..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Nyomtatás Szünetelés"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Nyomtatás folytatása"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Nyomtatás leállítása"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objektum Nyomtatása"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objektum Törlése"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Objektum Törlése ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Kiesés Helyreáll."); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Nyomtatás Tárolóról"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Nincs Tároló"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Alvás..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Katt a folytatáshoz..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Nyomtatás szünetelve"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Nyomtatás..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Nyomtatás leállítva"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Nyomtatás Kész"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Nincs mozgás."); - PROGMEM Language_Str MSG_KILLED = _UxGT("HALOTT! "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("MEGÁLLT! "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Visszahúzás mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Visszahúzás Cs. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Viszahúzás"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVisszah."); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás Távolság"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Csere"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tisztítási Távolság"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Szerszámcsere"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Emelés"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Fösebesség"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Visszah. Sebesség"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Fej Parkolás"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Visszahúzás Sebesség"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("FAN Sebesség"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("FAN idö"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto BE"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto KI"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Szerszámcsere"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Automata Csere"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Utolsó Adagoló"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Csere *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Szál csere"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Szál csere *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Szál betöltés"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Szál betöltés *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Szál eltávolítás"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Szál eltávolítás *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Mindet Eltávolít"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Tároló"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Tároló csere"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Tároló Kiadása"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z szonda tálcán kivül"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Ferdeség Faktor"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Önteszt"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Visszaállítás"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Elhelyez"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Telepít"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mód"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mód"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mód"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Módok"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V Mód"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD Mód"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Jelentés"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Teszt"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Mentés"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Használ"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Használ"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe Elhelyezés"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s Kell"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda Eltolások"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Szonda X Eltolás"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Szonda Y Eltolás"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Szonda Z Eltolás"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikrolépés X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikrolépés Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Mikrolépés Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Teljes"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Végállás megszakítva!"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Fütés hiba!"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hiba: SZÜKSÉGTELEN HÖFOK"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÜTÉS KIMARADÁS"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÁGY FÜTÉS KIMARADÁS"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÜTÉS KIMARADÁS"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX Höfok"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN Höfok"); - PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEFAGYOTT"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Indítsd újra!"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("n"); // Csak egy karakter - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("ó"); // Csak egy karakter - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("p"); // Csak egy karakter - PROGMEM Language_Str MSG_HEATING = _UxGT("Fütés..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Hütés..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ágy fütés..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Ágy hütés..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Kamra fütés..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Kamra hütés..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibráció"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("X Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Y Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Z Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Központ Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Beállítások"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibráció"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Magasság Kalib."); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Szonda Eltolás"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rúd"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Magasság"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Sugár"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("A Nyomtatóról"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Nyomtató Infó"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Pontos Szintezés"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineáris Szintezés"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineáris Szintezés"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Egységes Ágy Szintezés"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Háló Szintezés"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statisztikák"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Alaplap Infó"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termisztorok"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Adagolók"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Átviteli sebesség"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Futáselemzés: KI"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Futáselemzés: BE"); - - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Munkalámpa"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Fényerösség"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("HELYTELEN NYOMTATÓ"); - - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatás Számláló"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Befejezett"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Összes nyomtatási idö"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Leghosszabb munkaidö"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Összes anyag"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatások"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Befejezett"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Összes"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Leghosszabb"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Kiadott"); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Höfok"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Höfok"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Meghajtási Erö"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Meghajtó %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Meghajtó %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Meghajtó %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Meghajtó %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CSATLAKOZÁSI HIBA"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Írása"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("NYOMTATÓSZÁL CSERE"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("NYOMTATÁS SZÜNETEL"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("SZÁL BETÖLTÉS"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("SZÁL ELTÁVOLÍTÁS"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("FOLYTATÁSI OPCIÓ:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Tisztítsd meg"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Folytatás"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Fúvóka: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Túlfutás Szenzor"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás Táv. mm"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Tájolási hiba"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Szondázás hiba"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SZÁLVÁLASZTÁS"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Szoftver Feltöltése!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Figyelmeztetés."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Nyomtatás Folytatása"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Folytatás..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Szál Betöltése"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Összes Betöltése"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fúvóka Betöltése"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Szál Kiadása"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Szál Kiadása ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Kiadja a szálat"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Szál betölt. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Szál kiadás...."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Szál kiadása...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Mind"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Nyomtatószál ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU Újraindítás"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Újraindul..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Eltávolít, kattint"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Kever"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Összetevö ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Keverö"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Színátm."); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Teljes Színátm."); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Váltás Keverésre"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Ciklikus Keverés"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Színátm. Keverés"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Fordított Színátm."); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktív V-szerszám"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Kezdés V-szerszám"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Vége V-szerszám"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Ál V-szerszám"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Újra V-szerszám"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Gyors V-szerszám Kev."); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-szersz. visszaáll."); - PROGMEM Language_Str MSG_START_Z = _UxGT("Kezdés Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" Vége Z:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Játékok"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); - - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nyomj gombot", "nyomtatás folytatáshoz")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Várj míg", "szál csere", "indítás")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Szál behelyezés", "majd nyomj gombot", "a folytatáshoz")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nyomj gombot", "a fúvóka fűtéséhez")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Fúvóka fűtése", "Kérlek várj...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Várj a", "szál kiadására")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Várj a", "szál betöltésére")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Várj a", "szál tisztításra")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kattints a készre", "szál tiszta")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Várj a nyomtatóra", "majd foltyat...")); - #else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Katt a folytatáshoz")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Kérlek Várj...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Behelyez majd katt")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Katt a fűtéshez")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Fűtés...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Kiadás...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Betöltés...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Tisztítás...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Katt ha kész")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Folytatás...")); - #endif - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Meghajtók"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Meghajtó áram"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrid Küszöbérték"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Motoros Kezdöpont"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Léptetö Mód"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Mód"); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Újraindítás"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" be:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Holtjáték"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korrekció"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Simítás"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Tengely Szint"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Önkalibrálás"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fűtéskimaradás"); - PROGMEM Language_Str MSG_REHEAT = _UxGT("Újrafűt"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafűtés..."); -} - -#if FAN_COUNT == 1 - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED -#else - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N -#endif diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 38fffcb73b..d19f8a20b5 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,640 +16,386 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Italian * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_IT_H +#define LANGUAGE_IT_H #define DISPLAY_CHARSET_ISO10646_1 -namespace Language_it { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" pronto.") +#define MSG_BACK _UxGT("Indietro") +#define MSG_SD_INSERTED _UxGT("SD Card inserita") +#define MSG_SD_REMOVED _UxGT("SD Card rimossa") +#define MSG_LCD_ENDSTOPS _UxGT("Endstop") +#define MSG_MAIN _UxGT("Menu principale") +#define MSG_AUTOSTART _UxGT("Autostart") +#define MSG_DISABLE_STEPPERS _UxGT("Disabilita Motori") +#define MSG_DEBUG_MENU _UxGT("Menu di debug") +#define MSG_PROGRESS_BAR_TEST _UxGT("Test barra avanzamento") +#define MSG_AUTO_HOME _UxGT("Auto Home") +#define MSG_AUTO_HOME_X _UxGT("Home asse X") +#define MSG_AUTO_HOME_Y _UxGT("Home asse Y") +#define MSG_AUTO_HOME_Z _UxGT("Home asse Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Calibra Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Home assi XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Premi per iniziare") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Punto successivo") +#define MSG_LEVEL_BED_DONE _UxGT("Livel. terminato!") +#define MSG_Z_FADE_HEIGHT _UxGT("Fade Height") +#define MSG_SET_HOME_OFFSETS _UxGT("Imp. offset home") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offset applicato") +#define MSG_SET_ORIGIN _UxGT("Imposta Origine") +#define MSG_PREHEAT_1 _UxGT("Preriscalda PLA") +#define MSG_PREHEAT_1_N _UxGT("Preris.PLA ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1_N _UxGT("Tutto") +#define MSG_PREHEAT_1_END MSG_PREHEAT_1_N _UxGT("Ugello") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1_N _UxGT("Piatto") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1_N _UxGT("conf") +#define MSG_PREHEAT_2 _UxGT("Preriscalda ABS") +#define MSG_PREHEAT_2_N _UxGT("Preris.ABS ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2_N _UxGT("Tutto") +#define MSG_PREHEAT_2_END MSG_PREHEAT_2_N _UxGT("Ugello") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2_N _UxGT("Piatto") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2_N _UxGT("conf") +#define MSG_COOLDOWN _UxGT("Raffredda") +#define MSG_SWITCH_PS_ON _UxGT("Accendi aliment.") +#define MSG_SWITCH_PS_OFF _UxGT("Spegni aliment.") +#define MSG_EXTRUDE _UxGT("Estrudi") +#define MSG_RETRACT _UxGT("Ritrai") +#define MSG_MOVE_AXIS _UxGT("Muovi Asse") +#define MSG_BED_LEVELING _UxGT("Livella piano") +#define MSG_LEVEL_BED _UxGT("Livella piano") +#define MSG_LEVEL_CORNERS _UxGT("Livella spigoli") +#define MSG_NEXT_CORNER _UxGT("Prossimo spigolo") +#define MSG_EDITING_STOPPED _UxGT("Modifica Mesh Fermata") +#define MSG_USER_MENU _UxGT("Comandi Utente") - constexpr uint8_t CHARSIZE = 1; - PROGMEM Language_Str LANGUAGE = _UxGT("Italian"); +#define MSG_UBL_DOING_G29 _UxGT("G29 in corso") +#define MSG_UBL_UNHOMED _UxGT("Home XYZ prima") +#define MSG_UBL_TOOLS _UxGT("Strumenti UBL") +#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") +#define MSG_UBL_MANUAL_MESH _UxGT("Mesh Manuale") +#define MSG_UBL_BC_INSERT _UxGT("Metti spessore & misura") +#define MSG_UBL_BC_INSERT2 _UxGT("Misura") +#define MSG_UBL_BC_REMOVE _UxGT("Rimuovi e misura piatto") +#define MSG_UBL_MOVING_TO_NEXT _UxGT("Spostamento sucessivo") +#define MSG_UBL_ACTIVATE_MESH _UxGT("Attiva UBL") +#define MSG_UBL_DEACTIVATE_MESH _UxGT("Disattiva UBL") +#define MSG_UBL_SET_BED_TEMP _UxGT("Temp Piatto") +#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Temp Ugello") +#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP +#define MSG_UBL_MESH_EDIT _UxGT("Modifica Mesh") +#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Modif Custom Mesh") +#define MSG_UBL_FINE_TUNE_MESH _UxGT("Ritocca Mesh") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Done Editing Mesh") +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Crea Custom Mesh") +#define MSG_UBL_BUILD_MESH_MENU _UxGT("Crea Mesh") +#define MSG_UBL_BUILD_PLA_MESH _UxGT("Crea PLA Mesh") +#define MSG_UBL_BUILD_ABS_MESH _UxGT("Crea ABS Mesh") +#define MSG_UBL_BUILD_COLD_MESH _UxGT("Crea Cold Mesh") +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Aggiusta Altezza Mesh") +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Altezza") +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Valida Mesh") +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Valida PLA Mesh") +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Valida ABS Mesh") +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Valida Custom Mesh") +#define MSG_UBL_CONTINUE_MESH _UxGT("Continua Mesh") +#define MSG_UBL_MESH_LEVELING _UxGT("Livell. Mesh") +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Livell. 3 Punti") +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Livell. Griglia Mesh") +#define MSG_UBL_MESH_LEVEL _UxGT("Livella Mesh") +#define MSG_UBL_SIDE_POINTS _UxGT("Punti laterali") +#define MSG_UBL_MAP_TYPE _UxGT("Tipo di Mappa") +#define MSG_UBL_OUTPUT_MAP _UxGT("Esporta Mappa") +#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Esporta per Host") +#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Esporta in CSV") +#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Backup esterno") +#define MSG_UBL_INFO_UBL _UxGT("Esporta Info UBL") +#define MSG_UBL_EDIT_MESH_MENU _UxGT("Modifica Mesh") +#define MSG_UBL_FILLIN_AMOUNT _UxGT("Riempimento") +#define MSG_UBL_MANUAL_FILLIN _UxGT("Riempimento Manuale") +#define MSG_UBL_SMART_FILLIN _UxGT("Riempimento Smart") +#define MSG_UBL_FILLIN_MESH _UxGT("Riempimento Mesh") +#define MSG_UBL_INVALIDATE_ALL _UxGT("Invalida Tutto") +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalida Punto Vicino") +#define MSG_UBL_FINE_TUNE_ALL _UxGT("Ritocca All") +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Ritocca Punto Vicino") +#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Mesh Salvate") +#define MSG_UBL_STORAGE_SLOT _UxGT("Slot di memoria") +#define MSG_UBL_LOAD_MESH _UxGT("Carica Mesh Piatto") +#define MSG_UBL_SAVE_MESH _UxGT("Salva Mesh Piatto") +#define MSG_MESH_LOADED _UxGT("Mesh %i caricata") +#define MSG_MESH_SAVED _UxGT("Mesh %i salvata") +#define MSG_NO_STORAGE _UxGT("Nessuna memoria") +#define MSG_UBL_SAVE_ERROR _UxGT("Err: Salvataggio UBL") +#define MSG_UBL_RESTORE_ERROR _UxGT("Err: Ripristino UBL") +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Offset Fermato") +#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL passo passo") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronto."); - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("SI"); - PROGMEM Language_Str MSG_NO = _UxGT("NO"); - PROGMEM Language_Str MSG_BACK = _UxGT("Indietro"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Annullando..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media inserito"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media rimosso"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Aspettando media"); - PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Inizial.SD fallita"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Err.leggendo media"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Dispos.USB rimosso"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Avvio USB fallito"); - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Overflow subchiamate"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Finecor."); // Max 8 characters - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Finecorsa Soft"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principale"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Impostaz. avanzate"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configurazione"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Disabilita Motori"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu di debug"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra avanzam."); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home asse X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home asse Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home asse Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z"); - PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Tramming assistito"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Home assi XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Premi per iniziare"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Punto successivo"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Livel. terminato!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Height"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Imp. offset home"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offset applicato"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Imposta Origine"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preriscalda ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preriscalda ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Tutto"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Piatto"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" conf"); +#define MSG_LED_CONTROL _UxGT("Controllo LED") +#define MSG_LEDS _UxGT("Luci") +#define MSG_LED_PRESETS _UxGT("Preset luci") +#define MSG_SET_LEDS_RED _UxGT("Rosso") +#define MSG_SET_LEDS_ORANGE _UxGT("Arancione") +#define MSG_SET_LEDS_YELLOW _UxGT("Giallo") +#define MSG_SET_LEDS_GREEN _UxGT("Verde") +#define MSG_SET_LEDS_BLUE _UxGT("Blu") +#define MSG_SET_LEDS_INDIGO _UxGT("Indaco") +#define MSG_SET_LEDS_VIOLET _UxGT("Viola") +#define MSG_SET_LEDS_WHITE _UxGT("Bianco") +#define MSG_SET_LEDS_DEFAULT _UxGT("Predefinito") +#define MSG_CUSTOM_LEDS _UxGT("Luci personalizzate") +#define MSG_INTENSITY_R _UxGT("Intensita rosso") +#define MSG_INTENSITY_G _UxGT("Intensita verde") +#define MSG_INTENSITY_B _UxGT("Intensita blu") +#define MSG_INTENSITY_W _UxGT("Intensita bianco") +#define MSG_LED_BRIGHTNESS _UxGT("Luminosita") - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Preriscalda $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Preriscalda $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preris.$ Ugello"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preris.$ Ugello ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preris.$ Tutto"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preris.$ Piatto"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preris.$ conf"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Prerisc.personal."); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Raffredda"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frequenza"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Controllo laser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Off"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser On"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potenza laser"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Controllo mandrino"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Mandrino Off"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Mandrino On"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potenza mandrino"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Accendi aliment."); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Spegni aliment."); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Estrudi"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Ritrai"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Muovi Asse"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Livella piano"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Livella piano"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Livella spigoli"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Prossimo spigolo"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mesh"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifica Mesh"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Modif. Mesh Fermata"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punto sondato"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Indice X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indice Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valore di Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandi personaliz."); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto inclinaz."); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("Test sonda M48"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("Punto M48"); - PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviazione"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Strumenti Offsets"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicazione"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia speculare"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Pieno controllo"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2° ugello X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2° ugello Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2° ugello Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 in corso"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Strumenti UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Mesh Manuale"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Metti spes. e misura"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Misura"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Rimuovi e mis.piatto"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Spostamento succes."); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Attiva UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Disattiva UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Piatto"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Piatto"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Ugello"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Ugello"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Modifica Mesh"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Modif.Mesh personal."); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ritocca Mesh"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Modif.Mesh fatta"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crea Mesh personal."); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Crea Mesh"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Crea Mesh ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Valida Mesh ($)"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Crea Mesh a freddo"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Aggiusta Alt. Mesh"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Altezza"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valida Mesh"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 riscald.letto"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 riscald.ugello"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Priming manuale..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Prime a lung.fissa"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Priming terminato"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Annullato"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Uscita da G26"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valida Mesh pers."); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continua Mesh"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Livell. Mesh"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Livell. 3 Punti"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Livell. Griglia Mesh"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Livella Mesh"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Punti laterali"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo di Mappa"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Esporta Mappa"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Esporta per Host"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Esporta in CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Backup esterno"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Esporta Info UBL"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Riempimento"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Riempimento Manuale"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Riempimento Smart"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Riempimento Mesh"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalida Tutto"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalid.Punto Vicino"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ritocca All"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ritocca Punto Vicino"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Salvate"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot di memoria"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Carica Mesh Piatto"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Salva Mesh Piatto"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Mesh %i caricata"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Mesh %i salvata"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nessuna memoria"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: Salvataggio UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: Ripristino UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Fermato"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL passo passo"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crea Mesh a freddo"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Riempimento Smart"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valida Mesh"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ritocca All"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valida Mesh"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ritocca All"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Salva Mesh Piatto"); +#define MSG_MOVING _UxGT("In movimento...") +#define MSG_FREE_XY _UxGT("XY liberi") +#define MSG_MOVE_X _UxGT("Muovi X") +#define MSG_MOVE_Y _UxGT("Muovi Y") +#define MSG_MOVE_Z _UxGT("Muovi Z") +#define MSG_MOVE_E _UxGT("Estrusore") +#define MSG_MOVE_01MM _UxGT("Muovi di 0.1mm") +#define MSG_MOVE_1MM _UxGT("Muovi di 1mm") +#define MSG_MOVE_10MM _UxGT("Muovi di 10mm") +#define MSG_SPEED _UxGT("Velocità") +#define MSG_BED_Z _UxGT("piatto Z") +#define MSG_NOZZLE _UxGT("Ugello") +#define MSG_BED _UxGT("Piatto") +#define MSG_FAN_SPEED _UxGT("Velocita ventola") +#define MSG_EXTRA_FAN_SPEED _UxGT("Magg vel ventola") +#define MSG_FLOW _UxGT("Flusso") +#define MSG_CONTROL _UxGT("Controllo") +#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Autotemp") +#define MSG_ON _UxGT("On ") +#define MSG_OFF _UxGT("Off") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Seleziona") +#define MSG_ACC _UxGT("Accel") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VELOCITY _UxGT("Velocità") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VTrav min") +#define MSG_ACCELERATION _UxGT("Accelerazione") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-retract") +#define MSG_A_TRAVEL _UxGT("A-Spostamento") +#define MSG_STEPS_PER_MM _UxGT("Passi/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Apassi/mm") + #define MSG_BSTEPS _UxGT("Bpassi/mm") + #define MSG_CSTEPS _UxGT("Cpassi/mm") +#else + #define MSG_ASTEPS _UxGT("Xpassi/mm") + #define MSG_BSTEPS _UxGT("Ypassi/mm") + #define MSG_CSTEPS _UxGT("Zpassi/mm") +#endif +#define MSG_ESTEPS _UxGT("Epassi/mm") +#define MSG_E1STEPS _UxGT("E1passi/mm") +#define MSG_E2STEPS _UxGT("E2passi/mm") +#define MSG_E3STEPS _UxGT("E3passi/mm") +#define MSG_E4STEPS _UxGT("E4passi/mm") +#define MSG_E5STEPS _UxGT("E5passi/mm") +#define MSG_TEMPERATURE _UxGT("Temperatura") +#define MSG_MOTION _UxGT("Movimento") +#define MSG_FILAMENT _UxGT("Filamento") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") +#define MSG_FILAMENT_DIAM _UxGT("Diam. filo") +#define MSG_FILAMENT_UNLOAD _UxGT("Rimuovi mm") +#define MSG_FILAMENT_LOAD _UxGT("Carica mm") +#define MSG_ADVANCE_K _UxGT("K Avanzamento") +#define MSG_CONTRAST _UxGT("Contrasto LCD") +#define MSG_STORE_EEPROM _UxGT("Salva in memoria") +#define MSG_LOAD_EEPROM _UxGT("Carica da memoria") +#define MSG_RESTORE_FAILSAFE _UxGT("Ripristina imp.") +#define MSG_INIT_EEPROM _UxGT("Inizializza EEPROM") +#define MSG_REFRESH _UxGT("Aggiorna") +#define MSG_WATCH _UxGT("Guarda") +#define MSG_PREPARE _UxGT("Prepara") +#define MSG_TUNE _UxGT("Regola") +#define MSG_PAUSE_PRINT _UxGT("Pausa") +#define MSG_RESUME_PRINT _UxGT("Riprendi stampa") +#define MSG_STOP_PRINT _UxGT("Arresta stampa") +#define MSG_CARD_MENU _UxGT("Stampa da SD") +#define MSG_NO_CARD _UxGT("SD non presente") +#define MSG_DWELL _UxGT("Sospensione...") +#define MSG_USERWAIT _UxGT("Premi tasto..") +#define MSG_PRINT_PAUSED _UxGT("Stampa sospesa") +#define MSG_PRINT_ABORTED _UxGT("Stampa annullata") +#define MSG_NO_MOVE _UxGT("Nessun Movimento") +#define MSG_KILLED _UxGT("UCCISO. ") +#define MSG_STOPPED _UxGT("ARRESTATO. ") +#define MSG_CONTROL_RETRACT _UxGT("Ritrai mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Scamb. Ritrai mm") +#define MSG_CONTROL_RETRACTF _UxGT("Ritrai V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Salta mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Scamb. UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") +#define MSG_AUTORETRACT _UxGT("AutoRitrai") +#define MSG_FILAMENTCHANGE _UxGT("Cambia filamento") +#define MSG_FILAMENTLOAD _UxGT("Carica filamento") +#define MSG_FILAMENTUNLOAD _UxGT("Rimuovi filamento") +#define MSG_FILAMENTUNLOAD_ALL _UxGT("Rimuovi tutto") +#define MSG_INIT_SDCARD _UxGT("Iniz. SD-Card") +#define MSG_CNG_SDCARD _UxGT("Cambia SD-Card") +#define MSG_ZPROBE_OUT _UxGT("Z probe out. bed") +#define MSG_SKEW_FACTOR _UxGT("Fattore distorsione") +#define MSG_BLTOUCH _UxGT("BLTouch") +#define MSG_BLTOUCH_SELFTEST _UxGT("Autotest BLTouch") +#define MSG_BLTOUCH_RESET _UxGT("Resetta BLTouch") +#define MSG_BLTOUCH_DEPLOY _UxGT("Estendi BLTouch") +#define MSG_BLTOUCH_STOW _UxGT("Ritrai BLTouch") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("prima") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Finecorsa abort") +#define MSG_HEATING_FAILED_LCD _UxGT("Riscald. Fallito") +#define MSG_HEATING_FAILED_LCD_BED _UxGT("Risc. piatto fallito") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: TEMP RIDONDANTI") +#define MSG_THERMAL_RUNAWAY _UxGT("TEMP FUORI CONTROLLO") +#define MSG_ERR_MAXTEMP _UxGT("Err: TEMP MASSIMA") +#define MSG_ERR_MINTEMP _UxGT("Err: TEMP MINIMA") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err: TEMP MASSIMA PIATTO") +#define MSG_ERR_MINTEMP_BED _UxGT("Err: TEMP MINIMA PIATTO") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("STAMPANTE FERMATA") +#define MSG_PLEASE_RESET _UxGT("Riavviare prego") +#define MSG_SHORT_DAY _UxGT("g") // One character only +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("Riscaldamento...") +#define MSG_COOLING _UxGT("Raffreddamento..") +#define MSG_COOLING_COMPLETE _UxGT("Raff.completato.") +#define MSG_BED_HEATING _UxGT("Risc. piatto...") +#define MSG_BED_COOLING _UxGT("Raffr. piatto...") +#define MSG_DELTA_CALIBRATE _UxGT("Calibraz. Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Calibra X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibra Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibra Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibra Center") +#define MSG_DELTA_SETTINGS _UxGT("Impostaz. Delta") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto calibrazione") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Imp. altezza Delta") +#define MSG_DELTA_DIAG_ROD _UxGT("Barra Diagonale") +#define MSG_DELTA_HEIGHT _UxGT("Altezza") +#define MSG_DELTA_RADIUS _UxGT("Raggio") +#define MSG_INFO_MENU _UxGT("Riguardo stampante") +#define MSG_INFO_PRINTER_MENU _UxGT("Info. stampante") +#define MSG_3POINT_LEVELING _UxGT("Livel. a 3 punti") +#define MSG_LINEAR_LEVELING _UxGT("Livel. Lineare") +#define MSG_BILINEAR_LEVELING _UxGT("Livel. Biliniare") +#define MSG_UBL_LEVELING _UxGT("Livel. UBL") +#define MSG_MESH_LEVELING _UxGT("Livel. Mesh") +#define MSG_INFO_STATS_MENU _UxGT("Statistiche") +#define MSG_INFO_BOARD_MENU _UxGT("Info. scheda") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistori") +#define MSG_INFO_EXTRUDERS _UxGT("Estrusori") +#define MSG_INFO_BAUDRATE _UxGT("Baud") +#define MSG_INFO_PROTOCOL _UxGT("Protocollo") +#define MSG_CASE_LIGHT _UxGT("Luci Case") +#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Luminosità Luci") - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Controllo LED"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Luci"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Preset luce"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rosso"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Arancione"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Giallo"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Verde"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blu"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indaco"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Viola"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Bianco"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Predefinito"); - PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Canale ="); - PROGMEM Language_Str MSG_LEDS2 = _UxGT("Luci #2"); - PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Luce #2 Presets"); - PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Luminosità"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luci personalizzate"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensità rosso"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensità verde"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensità blu"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensità bianco"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Luminosità"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Contat. stampa") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completati") + #define MSG_INFO_PRINT_TIME _UxGT("Tempo totale") + #define MSG_INFO_PRINT_LONGEST _UxGT("Lavoro più lungo") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Totale estruso") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Stampe") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completati") + #define MSG_INFO_PRINT_TIME _UxGT("Durata") + #define MSG_INFO_PRINT_LONGEST _UxGT("Più lungo") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Estruso") +#endif +#define MSG_INFO_MIN_TEMP _UxGT("Temp min") +#define MSG_INFO_MAX_TEMP _UxGT("Temp max") +#define MSG_INFO_PSU _UxGT("Alimentatore") - PROGMEM Language_Str MSG_MOVING = _UxGT("In movimento..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY liberi"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Muovi X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Muovi Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Muovi Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Estrusore"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Estrusore *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Ugello freddo"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Muovi di %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Muovi di 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Muovi di 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Muovi di 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Velocità"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Piatto Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ugello"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Ugello ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Ugello parcheggiato"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Ugello in pausa"); - PROGMEM Language_Str MSG_BED = _UxGT("Piatto"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Camera"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. ventola"); // Max 15 characters - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. ventola ~"); // Max 15 characters - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Ventola mem. ~"); // Max 15 characters - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra vel.vent."); // Max 15 characters - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra v.vent. ~"); // Max 15 characters - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Controller vent."); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Vel. inattivo"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo autom."); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Vel. attivo"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Tempo inattivo"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Flusso"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flusso ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Controllo"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("On"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Off"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("Calibrazione PID"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("Calibraz. PID *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Calibr.PID eseguita"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Calibrazione fallita. Estrusore errato."); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Calibrazione fallita. Temperatura troppo alta."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Calibrazione fallita! Tempo scaduto."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Seleziona"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Seleziona *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Accel"); - PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-jerk"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-jerk"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-jerk"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-jerk"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Deviaz. giunzioni"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocità"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VTrav min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accelerazione"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-Ritrazione"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-Spostamento"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frequenza max"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Feed min"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passi/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("passi/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("passi/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("passi/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Epassi/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*passi/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("Limite E in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("Limite E *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. filo"); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diam. filo *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Rimuovi mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carica mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K Avanzamento"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K Avanzamento *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contrasto LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Salva impostazioni"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Carica impostazioni"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Ripristina imp."); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inizializza EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Err: CRC EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Err: Indice EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Err: Versione EEPROM"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Impostazioni mem."); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Aggiorna media"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetta stampante"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aggiorna"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Schermata info"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepara"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Regola"); - PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Controllo aliment."); - PROGMEM Language_Str MSG_CURRENT = _UxGT("Corrente"); - PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Tensione"); - PROGMEM Language_Str MSG_POWER = _UxGT("Potenza"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Avvia stampa"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Prossimo"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inizializza"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Stampa"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetta"); - PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignora"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Annulla"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Fatto"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Indietro"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Procedi"); - PROGMEM Language_Str MSG_PAUSING = _UxGT("Messa in pausa..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausa stampa"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Riprendi stampa"); - PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Host Avvio"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Arresta stampa"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Stampa Oggetto"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancella Oggetto"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Canc. Oggetto ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Ripresa da PowerLoss"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Stampa da media"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Media non presente"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Sospensione..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Premi tasto.."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Stampa sospesa"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Stampa..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Stampa Annullata"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Stampa Eseguita"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Nessun Movimento"); - PROGMEM Language_Str MSG_KILLED = _UxGT("UCCISO. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ARRESTATO. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ritrai mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Scamb. Ritrai mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ritrai V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Salta mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Avanza mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Scamb. Avanza mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Avanza V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Scamb. Avanza V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRitrai"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Lunghezza scambio"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra scambio"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Lunghezza spurgo"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Cambio utensile"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Risalita Z"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Velocità innesco"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Velocità ritrazione"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Parcheggia testa"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Velocità ventola"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Tempo ventola"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Migrazione utensile"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migrazione"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Ultimo estrusore"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migra a *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambia filamento"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Cambia filam. *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Carica filamento"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Carica filamento *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Rimuovi filamento"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Rimuovi filam. *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Rimuovi tutto"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Collega media"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambia media"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Rilascia media"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z probe fuori piatto"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Fattore distorsione"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Autotest BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Resetta BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Estendi BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("BLTouch modo SW"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("BLTouch modo 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("BLTouch modo OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("BLTouch modo mem."); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Metti BLTouch a 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Metti BLTouch a OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Segnala modo"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PERICOLO: Impostazioni errate possono cause danni! Procedo comunque?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Inizializ.TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z offset"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Memorizzare"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Estendi TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Estendi Sonda-Z"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Ritrai BLTouch"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Ritrai Sonda-Z"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s prima"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Offsets sonda"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Offset X sonda"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Offset Y sonda"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Offset Z sonda"); - PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Muovi ugel.su letto"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Totali"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Finecorsa annullati"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Risc.Fallito"); // Max 12 caratteri - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP RIDONDANTE"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEMP FUORI CONTROLLO"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEMP PIAT.FUORI CTRL"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("T.CAMERA FUORI CTRL"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MASSIMA"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA"); - PROGMEM Language_Str MSG_HALTED = _UxGT("STAMPANTE FERMATA"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Riavviare prego"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("g"); // Un solo carattere - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // Un solo carattere - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // Un solo carattere - PROGMEM Language_Str MSG_HEATING = _UxGT("Riscaldamento..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Raffreddamento.."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Risc. piatto..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Raffr. piatto..."); - PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Risc. sonda..."); - PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Raffr. sonda..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Risc. camera..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Raffr. camera..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibraz. Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibra centro"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Impostaz. Delta"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto calibrazione"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Imp. altezza Delta"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Offset sonda-Z"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonale"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altezza"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Raggio"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Riguardo stampante"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info. stampante"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Livel. a 3 punti"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Livel. Lineare"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Livel. Bilineare"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Livel.piatto unific."); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Livel. Mesh"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistiche"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. scheda"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistori"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Estrusori"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocollo"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Controllo fuga: OFF"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Controllo fuga: ON"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Timeout inatt.ugello"); +#define MSG_DRIVE_STRENGTH _UxGT("Potenza Drive") +#define MSG_DAC_PERCENT _UxGT("Driver %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Scrivi DAC EEPROM") - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luci Case"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Luminosità Luci"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("STAMPANTE ERRATA"); +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("STAMPA IN PAUSA") +#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("CARICA FILAMENTO") +#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("RIMUOVI FILAMENTO") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPZIONI:") +#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Libera di piu") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Riprendi stampa") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Ugello: ") +#define MSG_ERR_HOMING_FAILED _UxGT("Home fallito") +#define MSG_ERR_PROBING_FAILED _UxGT("Probing fallito") +#define MSG_M600_TOO_COLD _UxGT("M600:Troppo freddo") - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Contat. stampa"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completati"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo totale"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Lavoro più lungo"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Totale estruso"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Stampe"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completati"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Durata"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Più lungo"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Estruso"); - #endif - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp min"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp max"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Alimentatore"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Potenza Drive"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ERR.CONNESSIONE TMC"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Scrivi DAC EEPROM"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIO FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("STAMPA IN PAUSA"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARICA FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("RIMUOVI FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPZIONI RIPRESA:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Spurga di più"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Riprendi stampa"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Ugello: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sens.filo termin."); // Max 17 characters - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm filo term."); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Home fallito"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondaggio fallito"); +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Attendere avvio") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del cambio") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("di filamento") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Attendere") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("l'espulsione") + #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("del filamento") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserisci il") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("filamento e") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("premi per cont") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Premi per") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("riscald ugello.") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Riscald. ugello") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Attendere...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Attendere") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("il caricamento") + #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("del filamento") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Attendere") + #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("lo spurgo") + #define MSG_FILAMENT_CHANGE_PURGE_3 _UxGT("del filamento") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Attendere") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("la ripresa") + #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("della stampa") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Attendere...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Espulsione...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserisci e premi") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Riscalda ugello") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Riscaldamento...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Caricamento...") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Spurgo filamento") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Ripresa...") +#endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SCELTA FILAMENTO"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Agg.firmware MMU!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU chiede attenz."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Riprendi stampa"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Ripresa..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Carica filamento"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Carica tutto"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Carica fino ugello"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Espelli filamento"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Espelli filam.~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Scarica filamento"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Caric.fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Esplus.filam. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Scaric.filam. ..."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Tutto"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Azzera MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Azzeramento MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Rimuovi, click"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Miscela"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Componente ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Miscelatore"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradiente"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Gradiente pieno"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Alterna miscela"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Ciclo miscela"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Miscela gradiente"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Inverti gradiente"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("V-tool attivo"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("V-tool iniziale"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("V-tool finale"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("V-tool alias"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ripristina V-tools"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit mix V-tool"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools ripristin."); - PROGMEM Language_Str MSG_START_Z = _UxGT("Z inizio:"); - PROGMEM Language_Str MSG_END_Z = _UxGT("Z fine:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Giochi"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); - - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Indice pag. errato"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Vel. pag. errata"); - - PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Modif.password"); - PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login richiesto"); - PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Impostaz.password"); - PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Inserisci cifra"); - PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Imp./Modif.password"); - PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Elimina password"); - PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("La password è "); - PROGMEM Language_Str MSG_START_OVER = _UxGT("Ricominciare"); - PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Ricordati di mem.!"); - PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Password eliminata"); - - // - // Le schermate di Cambio Filamento possono visualizzare fino a 3 linee su un display a 4 righe - // ...o fino a 2 linee su un display a 3 righe. - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Premi per", "riprendere", "la stampa")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcheggiando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Attendere avvio", "del cambio", "di filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Inserisci il", "filamento e premi", "per continuare")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Premi per", "riscaldare ugello")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Riscaldam. ugello", "Attendere prego...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Attendere", "l'espulsione", "del filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Attendere", "il caricamento", "del filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Attendere", "lo spurgo", "del filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Premi x terminare", "lo spurgo", "del filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Attendere", "la ripresa", "della stampa...")); - #else // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Premi x continuare")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Attendere...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Inserisci e premi")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Riscalda ugello")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Riscaldamento...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Espulsione...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Caricamento...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spurgo filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Premi x terminare")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Ripresa...")); - #endif // LCD_HEIGHT < 4 - - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Drivers TMC"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver in uso"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Soglia modo ibrido"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Azzer. senza sens."); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Modo stepping"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop abil."); - - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Resetta"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" tra:"); - - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Gioco"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correzione"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Appianamento"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Livello asse X"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibra"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Timeout riscaldatore"); - PROGMEM Language_Str MSG_REHEAT = _UxGT("Riscalda"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Riscaldando..."); - - PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Proc.guid.sonda Z"); -} +#endif // LANGUAGE_IT_H diff --git a/Marlin/src/lcd/language/language_jp-kana.h b/Marlin/src/lcd/language/language_jp-kana.h new file mode 100644 index 0000000000..eedfa20cd6 --- /dev/null +++ b/Marlin/src/lcd/language/language_jp-kana.h @@ -0,0 +1,224 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Japanese (Kana) + * UTF-8 for Graphical Display + * + * LCD Menu Messages + * See also http://marlinfw.org/docs/development/lcd_language.html + * + */ + +#ifndef LANGUAGE_KANA_UTF_H +#define LANGUAGE_KANA_UTF_H + +#define DISPLAY_CHARSET_ISO10646_KANA +#define CHARSIZE 3 + +// This just to show the potential benefit of unicode. +// This translation can be improved by using the full charset of unicode codeblock U+30A0 to U+30FF. + +// 片仮名表示定義 +#define WELCOME_MSG MACHINE_NAME _UxGT(" ready.") +#define MSG_SD_INSERTED _UxGT("カードガソウニュウサレマシタ") // "Card inserted" +#define MSG_SD_REMOVED _UxGT("カードガアリマセン") // "Card removed" +#define MSG_LCD_ENDSTOPS _UxGT("エンドストップ") // "Endstops" // Max length 8 characters +#define MSG_MAIN _UxGT("メイン") // "Main" +#define MSG_AUTOSTART _UxGT("ジドウカイシ") // "Autostart" +#define MSG_DISABLE_STEPPERS _UxGT("モーターデンゲン オフ") // "Disable steppers" +#define MSG_DEBUG_MENU _UxGT("デバッグメニュー") // "Debug Menu" +#define MSG_PROGRESS_BAR_TEST _UxGT("プログレスバー テスト") // "Progress Bar Test" +#define MSG_AUTO_HOME _UxGT("ゲンテンフッキ") // "Auto home" +#define MSG_AUTO_HOME_X _UxGT("Xジク ゲンテンフッキ") // "Home X" +#define MSG_AUTO_HOME_Y _UxGT("Yジク ゲンテンフッキ") // "Home Y" +#define MSG_AUTO_HOME_Z _UxGT("Zジク ゲンテンフッキ") // "Home Z" +#define MSG_TMC_Z_CALIBRATION _UxGT("Zジク コウセイ") +#define MSG_LEVEL_BED_HOMING _UxGT("ゲンテンフッキチュウ") // "Homing XYZ" +#define MSG_LEVEL_BED_WAITING _UxGT("レベリングカイシ") // "Click to Begin" +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("ツギノソクテイテンヘ") // "Next Point" +#define MSG_LEVEL_BED_DONE _UxGT("レベリングカンリョウ") // "Leveling Done!" +#define MSG_SET_HOME_OFFSETS _UxGT("キジュンオフセットセッテイ") // "Set home offsets" +#define MSG_HOME_OFFSETS_APPLIED _UxGT("オフセットガテキヨウサレマシタ") // "Offsets applied" +#define MSG_SET_ORIGIN _UxGT("キジュンセット") // "Set origin" +#define MSG_PREHEAT_1 _UxGT("PLA ヨネツ") // "Preheat PLA" +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL _UxGT("PLA スベテヨネツ") // " All" +#define MSG_PREHEAT_1_BEDONLY _UxGT("PLA ベッドヨネツ") // " Bed" +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT("セッテイ") // " conf" +#define MSG_PREHEAT_2 _UxGT("ABS ヨネツ") // "Preheat ABS" +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL _UxGT("ABS スベテヨネツ") // " All" +#define MSG_PREHEAT_2_BEDONLY _UxGT("ABS ベッドヨネツ") // " Bed" +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT("セッテイ") // " conf" +#define MSG_COOLDOWN _UxGT("カネツテイシ") // "Cooldown" +#define MSG_SWITCH_PS_ON _UxGT("デンゲン オン") // "Switch power on" +#define MSG_SWITCH_PS_OFF _UxGT("デンゲン オフ") // "Switch power off" +#define MSG_EXTRUDE _UxGT("オシダシ") // "Extrude" +#define MSG_RETRACT _UxGT("ヒキコミセッテイ") // "Retract" +#define MSG_MOVE_AXIS _UxGT("ジクイドウ") // "Move axis" +#define MSG_BED_LEVELING _UxGT("ベッドレベリング") // "Bed leveling" +#define MSG_LEVEL_BED _UxGT("ベッドレベリング") // "Level bed" +#define MSG_MOVING _UxGT("イドウチュウ") // "Moving..." +#define MSG_FREE_XY _UxGT("XYジク カイホウ") // "Free XY" +#define MSG_MOVE_X _UxGT("Xジク イドウ") // "Move X" +#define MSG_MOVE_Y _UxGT("Yジク イドウ") // "Move Y" +#define MSG_MOVE_Z _UxGT("Zジク イドウ") // "Move Z" +#define MSG_MOVE_E _UxGT("エクストルーダー") // "Extruder" +#define MSG_MOVE_01MM _UxGT("0.1mm イドウ") // "Move 0.1mm" +#define MSG_MOVE_1MM _UxGT(" 1mm イドウ") // "Move 1mm" +#define MSG_MOVE_10MM _UxGT(" 10mm イドウ") // "Move 10mm" +#define MSG_SPEED _UxGT("ソクド") // "Speed" +#define MSG_BED_Z _UxGT("Zオフセット") // "Bed Z" +#define MSG_NOZZLE _UxGT("ノズル") // "Nozzle" +#define MSG_BED _UxGT("ベッド") // "Bed" +#define MSG_FAN_SPEED _UxGT("ファンソクド") // "Fan speed" +#define MSG_FLOW _UxGT("トシュツリョウ") // "Flow" +#define MSG_CONTROL _UxGT("セイギョ") // "Control" +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" サイテイ") // " Min" +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" サイコウ") // " Max" +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" ファクター") // " Fact" +#define MSG_AUTOTEMP _UxGT("ジドウオンドセイギョ") // "Autotemp" +#define MSG_ON _UxGT("オン ") // "On " +#define MSG_OFF _UxGT("オフ ") // "Off" +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("センタク") // "Select" +#define MSG_ACC _UxGT("カソクド mm/s2") // "Accel" +#define MSG_JERK _UxGT("ヤクド mm/s") // "Jerk" +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Aジク ヤクド mm/s") // "Va-jerk" + #define MSG_VB_JERK _UxGT("Bジク ヤクド mm/s") // "Vb-jerk" + #define MSG_VC_JERK _UxGT("Cジク ヤクド mm/s") // "Vc-jerk" +#else + #define MSG_VA_JERK _UxGT("Xジク ヤクド mm/s") // "Vx-jerk" + #define MSG_VB_JERK _UxGT("Yジク ヤクド mm/s") // "Vy-jerk" + #define MSG_VC_JERK _UxGT("Zジク ヤクド mm/s") // "Vz-jerk" +#endif +#define MSG_VE_JERK _UxGT("エクストルーダー ヤクド") // "Ve-jerk" +#define MSG_VMAX _UxGT("サイダイオクリソクド ") // "Vmax " +#define MSG_VMIN _UxGT("サイショウオクリソクド") // "Vmin" +#define MSG_VTRAV_MIN _UxGT("サイショウイドウソクド") // "VTrav min" +#define MSG_ACCELERATION MSG_ACC +#define MSG_AMAX _UxGT("サイダイカソクド ") // "Amax " +#define MSG_A_RETRACT _UxGT("ヒキコミカソクド") // "A-retract" +#define MSG_A_TRAVEL _UxGT("イドウカソクド") // "A-travel" +#define MSG_TEMPERATURE _UxGT("オンド") // "Temperature" +#define MSG_MOTION _UxGT("ウゴキセッテイ") // "Motion" +#define MSG_FILAMENT _UxGT("フィラメント") // "Filament" +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") +#define MSG_FILAMENT_DIAM _UxGT("フィラメントチョッケイ") // "Fil. Dia." +#define MSG_CONTRAST _UxGT("LCDコントラスト") // "LCD contrast" +#define MSG_STORE_EEPROM _UxGT("メモリヘカクノウ") // "Store memory" +#define MSG_LOAD_EEPROM _UxGT("メモリカラヨミコミ") // "Load memory" +#define MSG_RESTORE_FAILSAFE _UxGT("セッテイリセット") // "Restore failsafe" +#define MSG_REFRESH _UxGT("リフレッシュ") // "Refresh" +#define MSG_WATCH _UxGT("ジョウホウガメン") // "Info screen" +#define MSG_PREPARE _UxGT("ジュンビセッテイ") // "Prepare" +#define MSG_TUNE _UxGT("チョウセイ") // "Tune" +#define MSG_PAUSE_PRINT _UxGT("イチジテイシ") // "Pause print" +#define MSG_RESUME_PRINT _UxGT("プリントサイカイ") // "Resume print" +#define MSG_STOP_PRINT _UxGT("プリントテイシ") // "Stop print" +#define MSG_CARD_MENU _UxGT("SDカードカラプリント") // "Print from SD" +#define MSG_NO_CARD _UxGT("SDカードガアリマセン") // "No SD card" +#define MSG_DWELL _UxGT("キュウシ") // "Sleep..." +#define MSG_USERWAIT _UxGT("シバラクオマチクダサイ") // "Wait for user..." +#define MSG_PRINT_ABORTED _UxGT("プリントガチュウシサレマシタ") // "Print aborted" +#define MSG_NO_MOVE _UxGT("ウゴキマセン") // "No move." +#define MSG_KILLED _UxGT("ヒジョウテイシ") // "KILLED. " +#define MSG_STOPPED _UxGT("テイシシマシタ") // "STOPPED. " +#define MSG_CONTROL_RETRACT _UxGT("ヒキコミリョウ mm") // "Retract mm" +#define MSG_CONTROL_RETRACT_SWAP _UxGT("ヒキコミリョウS mm") // "Swap Re.mm" +#define MSG_CONTROL_RETRACTF _UxGT("ヒキコミソクド mm/s") // "Retract V" +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("ノズルタイヒ mm") // "Hop mm" +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("ホショウリョウ mm") // "UnRet mm" +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("ホショウリョウS mm") // "S UnRet mm" +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("ホショウソクド mm/s") // "UnRet V" +#define MSG_AUTORETRACT _UxGT("ジドウヒキコミ") // "AutoRetr." +#define MSG_FILAMENTCHANGE _UxGT("フィラメントコウカン") // "Change filament" +#define MSG_INIT_SDCARD _UxGT("SDカードサイヨミコミ") // "Init. SD card" +#define MSG_CNG_SDCARD _UxGT("SDカードコウカン") // "Change SD card" +#define MSG_ZPROBE_OUT _UxGT("Zプローブ ベッドガイ") // "Z probe out. bed" +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch ジコシンダン") // "BLTouch Self-Test" +#define MSG_BLTOUCH_RESET _UxGT("BLTouch リセット") // "Reset BLTouch" +#define MSG_HOME _UxGT("サキニ") // "Home" // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("ヲフッキサセテクダサイ") // "first" +#define MSG_ZPROBE_ZOFFSET _UxGT("Zオフセット") // "Z Offset" +#define MSG_BABYSTEP_X _UxGT("Xジク ビドウ") // "Babystep X" +#define MSG_BABYSTEP_Y _UxGT("Yジク ビドウ") // "Babystep Y" +#define MSG_BABYSTEP_Z _UxGT("Zジク ビドウ") // "Babystep Z" +#define MSG_ENDSTOP_ABORT _UxGT("イドウゲンカイケンチキノウ") // "Endstop abort" +#define MSG_HEATING_FAILED_LCD _UxGT("カネツシッパイ") // "Heating failed" +#define MSG_ERR_REDUNDANT_TEMP _UxGT("エラー:ジョウチョウサーミスターキノウ") // "Err: REDUNDANT TEMP" +#define MSG_THERMAL_RUNAWAY _UxGT("ネツボウソウ") // "THERMAL RUNAWAY" +#define MSG_ERR_MAXTEMP _UxGT("エラー:サイコウオンチョウカ") // "Err: MAXTEMP" +#define MSG_ERR_MINTEMP _UxGT("エラー:サイテイオンミマン") // "Err: MINTEMP" +#define MSG_ERR_MAXTEMP_BED _UxGT("エラー:ベッド サイコウオンチョウカ") // "Err: MAXTEMP BED" +#define MSG_ERR_MINTEMP_BED _UxGT("エラー:ベッド サイテイオンミマン") // "Err: MINTEMP BED" +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST // "Home XY first" +#define MSG_HALTED _UxGT("プリンターハテイシシマシタ") // "PRINTER HALTED" +#define MSG_PLEASE_RESET _UxGT("リセットシテクダサイ") // "Please reset" +#define MSG_SHORT_DAY _UxGT("d") // One character only +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("カネツチュウ") // "Heating..." +#define MSG_BED_HEATING _UxGT("ベッド カネツチュウ") // "Bed Heating..." +#define MSG_DELTA_CALIBRATE _UxGT("デルタ コウセイ") // "Delta Calibration" +#define MSG_DELTA_CALIBRATE_X _UxGT("Xジク コウセイ") // "Calibrate X" +#define MSG_DELTA_CALIBRATE_Y _UxGT("Yジク コウセイ") // "Calibrate Y" +#define MSG_DELTA_CALIBRATE_Z _UxGT("Zジク コウセイ") // "Calibrate Z" +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("チュウシン コウセイ") // "Calibrate Center" +#define MSG_INFO_MENU _UxGT("コノプリンターニツイテ") // "About Printer" +#define MSG_INFO_PRINTER_MENU _UxGT("プリンタージョウホウ") // "Printer Info" +#define MSG_INFO_STATS_MENU _UxGT("プリントジョウキョウ") // "Printer Stats" +#define MSG_INFO_BOARD_MENU _UxGT("セイギョケイジョウホウ") // "Board Info" +#define MSG_INFO_THERMISTOR_MENU _UxGT("サーミスター") // "Thermistors" +#define MSG_INFO_EXTRUDERS _UxGT("エクストルーダースウ") // "Extruders" +#define MSG_INFO_BAUDRATE _UxGT("ボーレート") // "Baud" +#define MSG_INFO_PROTOCOL _UxGT("プロトコル") // "Protocol" +#define MSG_CASE_LIGHT _UxGT("キョウタイナイショウメイ") // "Case light" +#define MSG_INFO_PRINT_COUNT _UxGT("プリントスウ ") // "Print Count" +#define MSG_INFO_COMPLETED_PRINTS _UxGT("カンリョウスウ") // "Completed" +#define MSG_INFO_PRINT_TIME _UxGT("プリントジカンルイケイ") // "Total print time" +#define MSG_INFO_PRINT_LONGEST _UxGT("サイチョウプリントジカン") // "Longest job time" +#define MSG_INFO_PRINT_FILAMENT _UxGT("フィラメントシヨウリョウルイケイ") // "Extruded total" +#define MSG_INFO_MIN_TEMP _UxGT("セッテイサイテイオン") // "Min Temp" +#define MSG_INFO_MAX_TEMP _UxGT("セッテイサイコウオン") // "Max Temp" +#define MSG_INFO_PSU _UxGT("デンゲンシュベツ") // "Power Supply" +#define MSG_DRIVE_STRENGTH _UxGT("モータークドウリョク") // "Drive Strength" +#define MSG_DAC_PERCENT _UxGT("DACシュツリョク %") // "Driver %" +#define MSG_DAC_EEPROM_WRITE MSG_STORE_EEPROM // "DAC EEPROM Write" +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("プリントサイカイ") // "Resume print" +#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("コウカンヲカイシシマス") // "Wait for start" +#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("シバラクオマチクダサイ") // "of the filament" +#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("フィラメントヌキダシチュウ") // "Wait for" +#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("シバラクオマチクダサイ") // "filament unload" +#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("フィラメントヲソウニュウシ,") // "Insert filament" +#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("クリックスルトゾッコウシマス") // "and press button" +#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("フィラメントソウテンチュウ") // "Wait for" +#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("シバラクオマチクダサイ") // "filament load" +#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("プリントヲサイカイシマス") // "Wait for print" +#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("シバラクオマチクダサイ") // "to resume" + +#endif // LANGUAGE_KANA_UTF_H diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h deleted file mode 100644 index 32b12f50cb..0000000000 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ /dev/null @@ -1,252 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Japanese (Kana) - * UTF-8 for Graphical Display - * - * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html - */ - -//#define DISPLAY_CHARSET_ISO10646_KANA - -namespace Language_jp_kana { - using namespace Language_en; // Inherit undefined strings from English - - constexpr uint8_t CHARSIZE = 3; - PROGMEM Language_Str LANGUAGE = _UxGT("Japanese"); - - // This is just to show the potential benefit of Unicode. - // This translation can be improved by using the full charset of unicode codeblock U+30A0 to U+30FF. - - // 片仮名表示定義 - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" ジュンビカンリョウ"); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("メディアガソウニュウサレマシタ"); // "Card inserted" - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("メディアガアリマセン"); // "Card removed" - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("メディアノトリダシ"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("エンドストップ"); // "Endstops" // Max length 8 characters - PROGMEM Language_Str MSG_MAIN = _UxGT("メイン"); // "Main" - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ジドウカイシ"); // "Autostart" - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("モーターデンゲン オフ"); // "Disable steppers" - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("デバッグメニュー"); // "Debug Menu" - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("プログレスバー テスト"); // "Progress Bar Test" - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("ゲンテンフッキ"); // "Auto home" - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Xジク ゲンテンフッキ"); // "Home X" - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Yジク ゲンテンフッキ"); // "Home Y" - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Zジク ゲンテンフッキ"); // "Home Z" - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("ゲンテンフッキチュウ"); // "Homing XYZ" - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("レベリングカイシ"); // "Click to Begin" - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("ツギノソクテイテンヘ"); // "Next Point" - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("レベリングカンリョウ"); // "Leveling Done!" - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("キジュンオフセットセッテイ"); // "Set home offsets" - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("オフセットガテキヨウサレマシタ"); // "Offsets applied" - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("キジュンセット"); // "Set origin" - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" ヨネツ"); // "Preheat " PREHEAT_1_LABEL - PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" ヨネツ ~"); // "Preheat " PREHEAT_1_LABEL - PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" ヨネツノズル"); // " Nozzle" - PROGMEM Language_Str MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ~"); // " Nozzle" - PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" スベテヨネツ"); // " All" - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" ベッドヨネツ"); // " Bed" - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" ヨネツセッテイ"); // " conf" - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("$ ヨネツ"); // "Preheat " PREHEAT_1_LABEL - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("$ ヨネツ ~"); // "Preheat " PREHEAT_1_LABEL - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("$ ヨネツノズル"); // " Nozzle" - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("$ ヨネツノズル ~"); // " Nozzle" - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("$ スベテヨネツ"); // " All" - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("$ ベッドヨネツ"); // " Bed" - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("$ ヨネツセッテイ"); // " conf" - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("カネツテイシ"); // "Cooldown" - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("デンゲン オン"); // "Switch power on" - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("デンゲン オフ"); // "Switch power off" - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("オシダシ"); // "Extrude" - PROGMEM Language_Str MSG_RETRACT = _UxGT("ヒキコミセッテイ"); // "Retract" - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("ジクイドウ"); // "Move axis" - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("ベッドレベリング"); // "Bed leveling" - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("ベッドレベリング"); // "Level bed" - - PROGMEM Language_Str MSG_MOVING = _UxGT("イドウチュウ"); // "Moving..." - PROGMEM Language_Str MSG_FREE_XY = _UxGT("XYジク カイホウ"); // "Free XY" - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Xジク イドウ"); // "Move X" - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Yジク イドウ"); // "Move Y" - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Zジク イドウ"); // "Move Z" - PROGMEM Language_Str MSG_MOVE_E = _UxGT("エクストルーダー"); // "Extruder" - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("%smm イドウ"); // "Move 0.025mm" - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("0.1mm イドウ"); // "Move 0.1mm" - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1mm イドウ"); // "Move 1mm" - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT(" 10mm イドウ"); // "Move 10mm" - PROGMEM Language_Str MSG_SPEED = _UxGT("ソクド"); // "Speed" - PROGMEM Language_Str MSG_BED_Z = _UxGT("Zオフセット"); // "Bed Z" - PROGMEM Language_Str MSG_NOZZLE = _UxGT("ノズル"); // "Nozzle" - PROGMEM Language_Str MSG_BED = _UxGT("ベッド"); // "Bed" - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("ファンソクド"); // "Fan speed" - PROGMEM Language_Str MSG_FLOW = _UxGT("トシュツリョウ"); // "Flow" - PROGMEM Language_Str MSG_CONTROL = _UxGT("セイギョ"); // "Control" - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" サイテイ"); // " Min" - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" サイコウ"); // " Max" - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" ファクター"); // " Fact" - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("ジドウオンドセイギョ"); // "Autotemp" - PROGMEM Language_Str MSG_LCD_ON = _UxGT("オン"); // "On" - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("オフ"); // "Off" - PROGMEM Language_Str MSG_SELECT = _UxGT("センタク"); // "Select" - PROGMEM Language_Str MSG_SELECT_E = _UxGT("センタク *"); - PROGMEM Language_Str MSG_ACC = _UxGT("カソクド mm/s²"); // "Accel" - PROGMEM Language_Str MSG_JERK = _UxGT("ヤクドウ mm/s"); // "Jerk" - PROGMEM Language_Str MSG_VA_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_A; // "Va-jerk" - PROGMEM Language_Str MSG_VB_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_B; // "Vb-jerk" - PROGMEM Language_Str MSG_VC_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_C; // "Vc-jerk" - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("ステップ/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("ステップ/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("ステップ/mm"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("エクストルーダー ヤクド"); // "Ve-jerk" - PROGMEM Language_Str MSG_VMAX_A = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax A" - PROGMEM Language_Str MSG_VMAX_B = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax B" - PROGMEM Language_Str MSG_VMAX_C = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax C" - PROGMEM Language_Str MSG_VMAX_E = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax E" - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("サイダイオクリソクド *"); // "Vmax E1" - PROGMEM Language_Str MSG_VMIN = _UxGT("サイショウオクリソクド"); // "Vmin" - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("サイショウイドウソクド"); // "VTrav min" - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("カソクド mm/s²"); // "Accel" - PROGMEM Language_Str MSG_AMAX = _UxGT("サイダイカソクド "); // "Amax " - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("ヒキコミカソクド"); // "A-retract" - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("イドウカソクド"); // "A-travel" - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("オンド"); // "Temperature" - PROGMEM Language_Str MSG_MOTION = _UxGT("ウゴキセッテイ"); // "Motion" - PROGMEM Language_Str MSG_FILAMENT = _UxGT("フィラメント"); // "Filament" - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("フィラメントチョッケイ"); // "Fil. Dia." - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("フィラメントチョッケイ *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCDコントラスト"); // "LCD contrast" - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("EEPROMヘホゾン"); // "Store memory" - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("EEPROMカラヨミコミ"); // "Load memory" - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("セッテイリセット"); // "Restore Defaults" - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("リフレッシュ"); // "Refresh" - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("ジョウホウガメン"); // "Info screen" - PROGMEM Language_Str MSG_PREPARE = _UxGT("ジュンビセッテイ"); // "Prepare" - PROGMEM Language_Str MSG_TUNE = _UxGT("チョウセイ"); // "Tune" - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("イチジテイシ"); // "Pause print" - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("プリントサイカイ"); // "Resume print" - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("プリントテイシ"); // "Stop print" - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("メディアカラプリント"); // "Print from SD" - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("メディアガアリマセン"); // "Card removed" - PROGMEM Language_Str MSG_DWELL = _UxGT("キュウシ"); // "Sleep..." - PROGMEM Language_Str MSG_USERWAIT = _UxGT("ツヅケルニハクリックシテクダサイ"); // "Wait for user..." - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("プリントガチュウシサレマシタ"); // "Print aborted" - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("ウゴキマセン"); // "No move." - PROGMEM Language_Str MSG_KILLED = _UxGT("ヒジョウテイシ"); // "KILLED. " - PROGMEM Language_Str MSG_STOPPED = _UxGT("テイシシマシタ"); // "STOPPED. " - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("ヒキコミリョウ mm"); // "Retract mm" - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("ヒキコミリョウS mm"); // "Swap Re.mm" - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("ヒキコミソクド mm/s"); // "Retract V" - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("ノズルタイヒ mm"); // "Hop mm" - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("ホショウリョウ mm"); // "Unretr. mm" - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("ホショウリョウS mm"); // "S Unretr. mm" - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ホショウソクド mm/s"); // "Unretract V" - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ジドウヒキコミ"); // "Auto-Retract" - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("フィラメントコウカン"); // "Change filament" - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("メディアサイヨミコミ"); // "Init. SD card" - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("メディアコウカン"); // "Change SD card" - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Zプローブ ベッドガイ"); // "Z probe out. bed" - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch ジコシンダン"); // "BLTouch Self-Test" - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch リセット"); // "Reset BLTouch" - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("サキニ %s%s%s ヲフッキサセテクダサイ"); // "Home ... first" - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Zオフセット"); // "Z Offset" - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Xジク ビドウ"); // "Babystep X" - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Yジク ビドウ"); // "Babystep Y" - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Zジク ビドウ"); // "Babystep Z" - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("イドウゲンカイケンチキノウ"); // "Endstop abort" - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("カネツシッパイ"); // "Heating failed" - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("エラー:ジョウチョウサーミスターキノウ"); // "Err: REDUNDANT TEMP" - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ネツボウソウ"); // "THERMAL RUNAWAY" - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("エラー:サイコウオンチョウカ"); // "Err: MAXTEMP" - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("エラー:サイテイオンミマン"); // "Err: MINTEMP" - PROGMEM Language_Str MSG_HALTED = _UxGT("プリンターハテイシシマシタ"); // "PRINTER HALTED" - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("リセットシテクダサイ"); // "Please reset" - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("カネツチュウ"); // "Heating..." - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("ベッド カネツチュウ"); // "Bed Heating..." - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("デルタ コウセイ"); // "Delta Calibration" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Xジク コウセイ"); // "Calibrate X" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Yジク コウセイ"); // "Calibrate Y" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Zジク コウセイ"); // "Calibrate Z" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("チュウシン コウセイ"); // "Calibrate Center" - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("コノプリンターニツイテ"); // "About Printer" - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("プリンタージョウホウ"); // "Printer Info" - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("プリントジョウキョウ"); // "Printer Stats" - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("セイギョケイジョウホウ"); // "Board Info" - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("サーミスター"); // "Thermistors" - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("エクストルーダースウ"); // "Extruders" - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("ボーレート"); // "Baud" - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("プロトコル"); // "Protocol" - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("キョウタイナイショウメイ"); // "Case light" - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("プリントスウ "); // "Print Count" - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("カンリョウスウ"); // "Completed" - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("プリントジカンルイケイ"); // "Total print time" - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("サイチョウプリントジカン"); // "Longest job time" - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("フィラメントシヨウリョウルイケイ"); // "Extruded total" - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("セッテイサイテイオン"); // "Min Temp" - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("セッテイサイコウオン"); // "Max Temp" - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("デンゲンシュベツ"); // "Power Supply" - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("モータークドウリョク"); // "Drive Strength" - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X DACシュツリョク %"); // "X Driver %" - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y DACシュツリョク %"); // "Y Driver %" - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z DACシュツリョク %"); // "Z Driver %" - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E DACシュツリョク %"); // "E Driver %" - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("EEPROMヘホゾン"); // "Store memory" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("イチジテイシ"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("プリントサイカイ"); // "Resume print" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("コウカンヲカイシシマス", "シバラクオマチクダサイ")); // "Wait for start of the filament" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("フィラメントヌキダシチュウ", "シバラクオマチクダサイ")); // "Wait for filament unload" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("フィラメントヲソウニュウシ,", "クリックスルトゾッコウシマス")); // "Insert filament and press button" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("フィラメントソウテンチュウ", "シバラクオマチクダサイ")); // "Wait for filament load" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("プリントヲサイカイシマス", "シバラクオマチクダサイ")); // "Wait for print to resume" - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("マチガッタプリンター"); // "Wrong printer" - - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("セッテイカンリ"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("ショウサイセッテイ"); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("コショカイフク"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROMショキカ"); - - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("ツギヘ"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("ショキカ"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("ストップ"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("プリント"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("リセット"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("キャンセル"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("カンリョウ"); - - PROGMEM Language_Str MSG_YES = _UxGT("ハイ"); - PROGMEM Language_Str MSG_NO = _UxGT("イイエ"); - PROGMEM Language_Str MSG_BACK = _UxGT("モドリ"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("ソクド"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("ステップ/mm"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("ユーザーコマンド"); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("プリントガイチジテイシサレマシタ"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("プリントチュウ..."); -} diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h deleted file mode 100644 index 1ab03dcf57..0000000000 --- a/Marlin/src/lcd/language/language_ko_KR.h +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Korean - * - * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html - */ -namespace Language_ko_KR { - using namespace Language_en; // Inherit undefined strings from English - - constexpr uint8_t CHARSIZE = 1; - PROGMEM Language_Str LANGUAGE = _UxGT("Korean"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" 준비."); - PROGMEM Language_Str MSG_BACK = _UxGT("뒤로"); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("카드 삽입됨"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("카드 제거됨"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("엔드스탑"); - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("소프트 엔드스탑"); - PROGMEM Language_Str MSG_MAIN = _UxGT("뒤로"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("고급 설정"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("설정"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("자동 시작"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("모터 정지"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("디버깅 메뉴"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("프로그레스바 테스트"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("오토홈"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X 홈으로"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y 홈으로"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z 홈으로"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ 홈으로"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("누르면 시작합니다"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("다음 Point"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("레벨링 완료!"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("예열하기 - ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("예열하기 - ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐 ~"); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("예열하기 - $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("예열하기 - $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("예열하기 - $ 노즐"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("예열하기 - $ 노즐 ~"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Custom 예열"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("식히기"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("스위치 전원 켜기"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("스위치 전원 끄기"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("밀어내기"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("당기기"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("축 이동"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("베드 레벨링"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("미러 사본"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("오토레벨링 하기"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("노즐"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("노즐 ~"); - PROGMEM Language_Str MSG_BED = _UxGT("베드"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("펜 속도"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("펜 속도 ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("엑스트라 펜 속도"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("엑스트라 펜 속도 ~"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("온도"); - PROGMEM Language_Str MSG_MOTION = _UxGT("동작"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("설정 저장하기"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("설정 읽어오기"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("설정 되돌리기"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM 초기화"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("새로고침"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("처음으로"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("준비하기"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("일시정지"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("재시작"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("출력중지"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("SD 카드출력"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD 카드없음"); - PROGMEM Language_Str MSG_DWELL = _UxGT("슬립모드..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("일시 정지됨"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("출력중..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("취소됨"); - PROGMEM Language_Str MSG_KILLED = _UxGT("죽음. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("멈춤. "); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("잘못된 프린터"); -} diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index c142c5c9bf..128bceaf41 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,216 +16,268 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Dutch * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_NL_H +#define LANGUAGE_NL_H #define DISPLAY_CHARSET_ISO10646_1 #define NOT_EXTENDED_ISO10646_1_5X7 -namespace Language_nl { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" gereed.") +#define MSG_BACK _UxGT("Terug") +#define MSG_SD_INSERTED _UxGT("Kaart ingestoken") +#define MSG_SD_REMOVED _UxGT("Kaart verwijderd") +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters +#define MSG_MAIN _UxGT("Hoofdmenu") +#define MSG_AUTOSTART _UxGT("Autostart") +#define MSG_DISABLE_STEPPERS _UxGT("Motoren uit") +#define MSG_DEBUG_MENU _UxGT("Debug Menu") //accepted English terms +#define MSG_PROGRESS_BAR_TEST _UxGT("Vooruitgang Test") +#define MSG_AUTO_HOME _UxGT("Auto home") +#define MSG_AUTO_HOME_X _UxGT("Home X") +#define MSG_AUTO_HOME_Y _UxGT("Home Y") +#define MSG_AUTO_HOME_Z _UxGT("Home Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibreer Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Homing XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Klik voor begin") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Volgende Plaats") +#define MSG_LEVEL_BED_DONE _UxGT("Bed level kompl.") +#define MSG_SET_HOME_OFFSETS _UxGT("Zet home offsets") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("H offset toegep.") +#define MSG_SET_ORIGIN _UxGT("Nulpunt instellen") +#define MSG_PREHEAT_1 _UxGT("PLA voorverwarmen") +#define MSG_PREHEAT_1_N _UxGT("PLA voorverw. ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1_N _UxGT("aan") +#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" Einde") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1_N _UxGT("Bed") +#define MSG_PREHEAT_1_SETTINGS _UxGT("PLA verw. conf") +#define MSG_PREHEAT_2 _UxGT("ABS voorverwarmen") +#define MSG_PREHEAT_2_N _UxGT("ABS voorverw. ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2_N _UxGT("aan") +#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" Einde") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2_N _UxGT("Bed") +#define MSG_PREHEAT_2_SETTINGS _UxGT("ABS verw. conf") +#define MSG_COOLDOWN _UxGT("Afkoelen") +#define MSG_SWITCH_PS_ON _UxGT("Stroom aan") +#define MSG_SWITCH_PS_OFF _UxGT("Stroom uit") +#define MSG_EXTRUDE _UxGT("Extrude") +#define MSG_RETRACT _UxGT("Retract") +#define MSG_MOVE_AXIS _UxGT("As verplaatsen") +#define MSG_BED_LEVELING _UxGT("Bed Leveling") +#define MSG_LEVEL_BED _UxGT("Level bed") +#define MSG_MOVING _UxGT("Verplaatsen...") +#define MSG_FREE_XY _UxGT("Vrij XY") +#define MSG_MOVE_X _UxGT("Verplaats X") +#define MSG_MOVE_Y _UxGT("Verplaats Y") +#define MSG_MOVE_Z _UxGT("Verplaats Z") +#define MSG_MOVE_E _UxGT("Extruder") +#define MSG_MOVE_01MM _UxGT("Verplaats 0.1mm") +#define MSG_MOVE_1MM _UxGT("Verplaats 1mm") +#define MSG_MOVE_10MM _UxGT("Verplaats 10mm") +#define MSG_SPEED _UxGT("Snelheid") +#define MSG_BED_Z _UxGT("Bed Z") +#define MSG_NOZZLE _UxGT("Nozzle") +#define MSG_BED _UxGT("Bed") +#define MSG_FAN_SPEED _UxGT("Fan snelheid") +#define MSG_FLOW _UxGT("Flow") +#define MSG_CONTROL _UxGT("Control") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Autotemp") +#define MSG_ON _UxGT("Aan ") +#define MSG_OFF _UxGT("Uit") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Selecteer") +#define MSG_ACC _UxGT("Versn") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VTrav min") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-retract") +#define MSG_A_TRAVEL _UxGT("A-travel") +#define MSG_STEPS_PER_MM _UxGT("Steps/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Asteps/mm") + #define MSG_BSTEPS _UxGT("Bsteps/mm") + #define MSG_CSTEPS _UxGT("Csteps/mm") +#else + #define MSG_ASTEPS _UxGT("Xsteps/mm") + #define MSG_BSTEPS _UxGT("Ysteps/mm") + #define MSG_CSTEPS _UxGT("Zsteps/mm") +#endif +#define MSG_ESTEPS _UxGT("Esteps/mm") +#define MSG_E1STEPS _UxGT("E1steps/mm") +#define MSG_E2STEPS _UxGT("E2steps/mm") +#define MSG_E3STEPS _UxGT("E3steps/mm") +#define MSG_E4STEPS _UxGT("E4steps/mm") +#define MSG_E5STEPS _UxGT("E5steps/mm") +#define MSG_TEMPERATURE _UxGT("Temperatuur") +#define MSG_MOTION _UxGT("Beweging") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_ADVANCE_K _UxGT("Advance K") //accepted english dutch +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") +#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") +#define MSG_CONTRAST _UxGT("LCD contrast") +#define MSG_STORE_EEPROM _UxGT("Geheugen opslaan") +#define MSG_LOAD_EEPROM _UxGT("Geheugen laden") +#define MSG_RESTORE_FAILSAFE _UxGT("Noodstop reset") +#define MSG_REFRESH _UxGT("Ververs") +#define MSG_WATCH _UxGT("Info scherm") +#define MSG_PREPARE _UxGT("Voorbereiden") +#define MSG_TUNE _UxGT("Afstellen") +#define MSG_PAUSE_PRINT _UxGT("Print pauzeren") +#define MSG_RESUME_PRINT _UxGT("Print hervatten") +#define MSG_STOP_PRINT _UxGT("Print stoppen") +#define MSG_CARD_MENU _UxGT("Print van SD") +#define MSG_NO_CARD _UxGT("Geen SD kaart") +#define MSG_DWELL _UxGT("Slapen...") +#define MSG_USERWAIT _UxGT("Wachten...") +#define MSG_PRINT_ABORTED _UxGT("Print afgebroken") +#define MSG_NO_MOVE _UxGT("Geen beweging.") +#define MSG_KILLED _UxGT("Afgebroken. ") +#define MSG_STOPPED _UxGT("Gestopt. ") +#define MSG_CONTROL_RETRACT _UxGT("Retract mm") //accepted English term in Dutch +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Ruil Retract mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retract F") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Hop mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Ruil UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet F") +#define MSG_AUTORETRACT _UxGT("AutoRetr.") +#define MSG_FILAMENTCHANGE _UxGT("Verv. Filament") +#define MSG_INIT_SDCARD _UxGT("Init. SD kaart") +#define MSG_CNG_SDCARD _UxGT("Verv. SD Kaart") +#define MSG_ZPROBE_OUT _UxGT("Z probe uit. bed") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Zelf-Test") +#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("Eerst") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") //accepted English term in Dutch +#define MSG_BABYSTEP_X _UxGT("Babystap X") +#define MSG_BABYSTEP_Y _UxGT("Babystap Y") +#define MSG_BABYSTEP_Z _UxGT("Babystap Z") +#define MSG_ENDSTOP_ABORT _UxGT("Endstop afbr.") +#define MSG_HEATING_FAILED_LCD _UxGT("Voorverw. fout") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Redun. temp fout") +#define MSG_THERMAL_RUNAWAY _UxGT("Therm. wegloop") +#define MSG_ERR_MAXTEMP _UxGT("Err: Max. temp") +#define MSG_ERR_MINTEMP _UxGT("Err: Min. temp") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err: Max.tmp bed") +#define MSG_ERR_MINTEMP_BED _UxGT("Err: Min.tmp bed") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("PRINTER GESTOPT") +#define MSG_PLEASE_RESET _UxGT("Reset A.U.B.") +#define MSG_SHORT_DAY _UxGT("d") // One character only. Keep English standard +#define MSG_SHORT_HOUR _UxGT("h") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("Voorwarmen...") +#define MSG_BED_HEATING _UxGT("Bed voorverw...") +#define MSG_DELTA_CALIBRATE _UxGT("Delta Calibratie") +#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibreer X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibreer Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibreer Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibreer Midden") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibratie") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Zet Delta Hoogte") - constexpr uint8_t CHARSIZE = 1; - PROGMEM Language_Str LANGUAGE = _UxGT("Dutch"); +#define MSG_INFO_STATS_MENU _UxGT("Printer Stats") +#define MSG_INFO_BOARD_MENU _UxGT("Board Info") //accepted English term in Dutch +#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") +#define MSG_INFO_EXTRUDERS _UxGT("Extruders") +#define MSG_INFO_BAUDRATE _UxGT("Baud") +#define MSG_INFO_MENU _UxGT("Over Printer") +#define MSG_INFO_PRINTER_MENU _UxGT("Printer Info") +#define MSG_INFO_PROTOCOL _UxGT("Protocol") +#define MSG_CASE_LIGHT _UxGT("Case licht") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" gereed."); - PROGMEM Language_Str MSG_BACK = _UxGT("Terug"); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kaart ingestoken"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kaart verwijderd"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters - PROGMEM Language_Str MSG_MAIN = _UxGT("Hoofdmenu"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motoren uit"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug Menu"); // accepted English terms - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Vooruitgang Test"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Printed Aantal") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Totaal Voltooid") + #define MSG_INFO_PRINT_TIME _UxGT("Totale Printtijd") + #define MSG_INFO_PRINT_LONGEST _UxGT("Langste Printtijd") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Totaal Extrudeert") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Aantal") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Voltooid") + #define MSG_INFO_PRINT_TIME _UxGT("Printtijd ") + #define MSG_INFO_PRINT_LONGEST _UxGT("Langste") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrud.") +#endif - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klik voor begin"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Volgende Plaats"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Bed level kompl."); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Zet home offsets"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("H offset toegep."); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Nulpunt instellen"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" voorverwarmen"); - PROGMEM Language_Str MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" voorverw. ~"); - PROGMEM Language_Str MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" voorverw. Einde"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" voorverw. aan"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" voorverw. Bed"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" verw. conf"); +#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") +#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") +#define MSG_INFO_PSU _UxGT("PSU") //accepted English term in Dutch - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("$ voorverwarmen"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("$ voorverw. ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("$ voorverw. Einde"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("$ voorverw. Einde ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("$ voorverw. aan"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("$ voorverw. Bed"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("$ verw. conf"); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Afkoelen"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Stroom aan"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Stroom uit"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrude"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Retract"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("As verplaatsen"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bed Leveling"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Level bed"); +#define MSG_DRIVE_STRENGTH _UxGT("Motorstroom") +#define MSG_DAC_PERCENT _UxGT("Driver %") //accepted English term in Dutch +#define MSG_DAC_EEPROM_WRITE _UxGT("DAC Opslaan") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Hervat print") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Nozzle: ") //accepeted English term +// +// Filament Change screens show up to 3 lines on a 4-line display +// ...or up to 2 lines on a 3-line display +// +#if LCD_HEIGHT >= 4 + // Up to 3 lines + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Wacht voor start") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("filament te") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("verwisselen") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wacht voor") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filament uit") + #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("te laden") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Klik knop om...") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("verw. nozzle.") //nozzle accepted English term + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Nozzle verw.") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Wacht a.u.b.") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Laad filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("en druk knop") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("om verder...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Wacht voor") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filament te") + #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("laden") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wacht voor print") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("om verder") + #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("te gaan") +#else // LCD_HEIGHT < 4 + // Up to 2 lines + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Wacht voor") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("start...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wacht voor") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("uitladen...") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Klik knop om...") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("verw. nozzle.") //nozzle accepted English term + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Verwarmen...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Laad filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("en druk knop") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Wacht voor") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("inladen...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wacht voor") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("printing...") +#endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_MOVING = _UxGT("Verplaatsen..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Vrij XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Verplaats X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Verplaats Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Verplaats Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Verplaats %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Verplaats 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Verplaats 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Verplaats 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Snelheid"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Nozzle ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Bed"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan snelheid"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan snelheid ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Flow"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flow ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Aan"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Uit"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Selecteer"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Selecteer *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Versn"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatuur"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Beweging"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); // accepted english dutch - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advance K *"); // accepted english dutch - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD contrast"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Geheugen opslaan"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Geheugen laden"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Noodstop reset"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ververs"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info scherm"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Voorbereiden"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Afstellen"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Print pauzeren"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Print hervatten"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Print stoppen"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print van SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Geen SD kaart"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Slapen..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Wachten..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print afgebroken"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Geen beweging."); - PROGMEM Language_Str MSG_KILLED = _UxGT("Afgebroken. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("Gestopt. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retract mm"); // accepted English term in Dutch - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Ruil Retract mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract F"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ruil Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretr. FR"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Verv. Filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Verv. Filament *"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Init. SD kaart"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Verv. SD Kaart"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z probe uit. bed"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Zelf-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s Eerst"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Offset"); // accepted English term in Dutch - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystap X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystap Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystap Z"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop afbr."); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Voorverw. fout"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Redun. temp fout"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Therm. wegloop"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: Max. temp"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Min. temp"); - PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER GESTOPT"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reset A.U.B."); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only. Keep English standard - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Voorwarmen..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bed voorverw..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibratie"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibreer X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibreer Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibreer Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibreer Midden"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibratie"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Zet Delta Hoogte"); - - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Case licht"); - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Onjuiste printer"); - - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Printed Aantal"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Totaal Voltooid"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Totale Printtijd"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Langste Printtijd"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Totaal Extrudeert"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Aantal"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Voltooid"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Printtijd "); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Langste"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrud."); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); // accepted English term in Dutch - - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Motorstroom"); - - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC Opslaan"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Hervat print"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: "); // accepted English term - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - // Up to 3 lines - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Wacht voor start", "filament te", "verwisselen")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Wacht voor", "filament uit", "te laden")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klik knop om...", "verw. nozzle.")); //nozzle accepted English term - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle verw.", "Wacht a.u.b.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Laad filament", "en druk knop", "om verder...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Wacht voor", "filament te", "laden")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Wacht voor print", "om verder", "te gaan")); - #else - // Up to 2 lines - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Wacht voor", "start...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wacht voor", "uitladen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klik knop om...", "verw. nozzle.")); //nozzle accepted English term - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Verwarmen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("Laad filament", "en druk knop")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wacht voor", "inladen...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wacht voor", "printing...")); - #endif -} +#endif // LANGUAGE_NL_H diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 770c872a40..6ac55ff47e 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,518 +16,241 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** - * Polish - includes accented characters - * - * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * Polish for DOGM display - includes accented characters */ +#ifndef LANGUAGE_PL_DOGM_H +#define LANGUAGE_PL_DOGM_H + #define DISPLAY_CHARSET_ISO10646_PL -namespace Language_pl { - using namespace Language_en; // Inherit undefined strings from English +#define CHARSIZE 2 - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Polish"); +#define WELCOME_MSG MACHINE_NAME _UxGT(" gotowy.") +#define MSG_SD_INSERTED _UxGT("Karta włożona") +#define MSG_SD_REMOVED _UxGT("Karta usunięta") +#define MSG_LCD_ENDSTOPS _UxGT("Kranców.") // Max length 8 characters +#define MSG_MAIN _UxGT("Menu główne") +#define MSG_AUTOSTART _UxGT("Autostart") +#define MSG_DISABLE_STEPPERS _UxGT("Wyłącz silniki") +#define MSG_AUTO_HOME _UxGT("Pozycja zerowa") +#define MSG_AUTO_HOME_X _UxGT("Zeruj X") +#define MSG_AUTO_HOME_Y _UxGT("Zeruj Y") +#define MSG_AUTO_HOME_Z _UxGT("Zeruj Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibruj Z") +#define MSG_LEVEL_BED _UxGT("Poziom. stołu") +#define MSG_LEVEL_BED_HOMING _UxGT("Pozycja zerowa") +#define MSG_LEVEL_BED_WAITING _UxGT("Kliknij by rozp.") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Następny punkt") +#define MSG_LEVEL_BED_DONE _UxGT("Wypoziomowano!") +#define MSG_USER_MENU _UxGT("Własne Polecenia") +#define MSG_SET_HOME_OFFSETS _UxGT("Ust. poz. zer.") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Poz. zerowa ust.") +#define MSG_SET_ORIGIN _UxGT("Ustaw punkt zero") +#define MSG_PREHEAT_1 _UxGT("Rozgrzej PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" wsz.") +#define MSG_PREHEAT_1_BEDONLY _UxGT("Rozgrzej stół PLA") +#define MSG_PREHEAT_1_SETTINGS _UxGT("Ustaw. rozg. PLA") +#define MSG_PREHEAT_2 _UxGT("Rozgrzej ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" wsz.") +#define MSG_PREHEAT_2_BEDONLY _UxGT("Rozgrzej stół ABS") +#define MSG_PREHEAT_2_SETTINGS _UxGT("Ustaw. rozg. ABS") +#define MSG_COOLDOWN _UxGT("Chłodzenie") +#define MSG_SWITCH_PS_ON _UxGT("Włącz zasilacz") +#define MSG_SWITCH_PS_OFF _UxGT("Wyłącz zasilacz") +#define MSG_EXTRUDE _UxGT("Ekstruzja") +#define MSG_RETRACT _UxGT("Wycofanie") +#define MSG_MOVE_AXIS _UxGT("Ruch osi") +#define MSG_BED_LEVELING _UxGT("Poziom. stołu") +#define MSG_MOVE_X _UxGT("Przesuń w X") +#define MSG_MOVE_Y _UxGT("Przesuń w Y") +#define MSG_MOVE_Z _UxGT("Przesuń w Z") +#define MSG_MOVE_E _UxGT("Ekstruzja (os E)") +#define MSG_MOVE_01MM _UxGT("Przesuń co .1mm") +#define MSG_MOVE_1MM _UxGT("Przesuń co 1mm") +#define MSG_MOVE_10MM _UxGT("Przesuń co 10mm") +#define MSG_SPEED _UxGT("Predkość") +#define MSG_BED_Z _UxGT("Stół Z") +#define MSG_NOZZLE _UxGT("Dysza") +#define MSG_BED _UxGT("Stół") +#define MSG_FAN_SPEED _UxGT("Obroty wiatraka") +#define MSG_FLOW _UxGT("Przepływ") +#define MSG_CONTROL _UxGT("Ustawienia") +#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Mnożnik") +#define MSG_AUTOTEMP _UxGT("Auto. temperatura") +#define MSG_ON _UxGT("Wł. ") +#define MSG_OFF _UxGT("Wył.") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Select") +#define MSG_ACC _UxGT("Przyśpieszenie") +#define MSG_JERK _UxGT("Zryw") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Zryw Va") + #define MSG_VB_JERK _UxGT("Zryw Vb") + #define MSG_VC_JERK _UxGT("Zryw Vc") +#else + #define MSG_VA_JERK _UxGT("Zryw Vx") + #define MSG_VB_JERK _UxGT("Zryw Vy") + #define MSG_VC_JERK _UxGT("Zryw Vz") +#endif +#define MSG_VE_JERK _UxGT("Zryw Ve") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("Vskok min") +#define MSG_ACCELERATION MSG_ACC +#define MSG_AMAX _UxGT("Amax") +#define MSG_A_RETRACT _UxGT("A-wycofanie") +#define MSG_A_TRAVEL _UxGT("A-przesuń.") +#define MSG_STEPS_PER_MM _UxGT("kroki/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("krokiA/mm") + #define MSG_BSTEPS _UxGT("krokiB/mm") + #define MSG_CSTEPS _UxGT("krokiC/mm") +#else + #define MSG_ASTEPS _UxGT("krokiX/mm") + #define MSG_BSTEPS _UxGT("krokiY/mm") + #define MSG_CSTEPS _UxGT("krokiZ/mm") +#endif +#define MSG_ESTEPS _UxGT("krokiE/mm") +#define MSG_E1STEPS _UxGT("krokiE1/mm") +#define MSG_E2STEPS _UxGT("krokiE2/mm") +#define MSG_E3STEPS _UxGT("krokiE3/mm") +#define MSG_E4STEPS _UxGT("krokiE4/mm") +#define MSG_E5STEPS _UxGT("krokiE5/mm") +#define MSG_TEMPERATURE _UxGT("Temperatura") +#define MSG_MOTION _UxGT("Ruch") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E w mm3") +#define MSG_FILAMENT_DIAM _UxGT("Śr. fil.") +#define MSG_CONTRAST _UxGT("Kontrast LCD") +#define MSG_STORE_EEPROM _UxGT("Zapisz w pamięci") +#define MSG_LOAD_EEPROM _UxGT("Wczytaj z pamięci") +#define MSG_RESTORE_FAILSAFE _UxGT("Ustaw. fabryczne") +#define MSG_REFRESH _UxGT("Odswież") +#define MSG_WATCH _UxGT("Ekran główny") +#define MSG_PREPARE _UxGT("Przygotuj") +#define MSG_TUNE _UxGT("Strojenie") +#define MSG_PAUSE_PRINT _UxGT("Pauza") +#define MSG_RESUME_PRINT _UxGT("Wznowienie") +#define MSG_STOP_PRINT _UxGT("Stop") +#define MSG_CARD_MENU _UxGT("Karta SD") +#define MSG_NO_CARD _UxGT("Brak karty") +#define MSG_DWELL _UxGT("Uśpij...") +#define MSG_USERWAIT _UxGT("Oczekiwanie...") +#define MSG_PRINT_ABORTED _UxGT("Druk przerwany") +#define MSG_NO_MOVE _UxGT("Brak ruchu") +#define MSG_KILLED _UxGT("Ubity. ") +#define MSG_STOPPED _UxGT("Zatrzymany. ") +#define MSG_CONTROL_RETRACT _UxGT("Wycofaj mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Z Wycof. mm") +#define MSG_CONTROL_RETRACTF _UxGT("Wycofaj V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Skok Z mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Cof. wycof. mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Z Cof. wyc. mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Cof. wycof. V") +#define MSG_AUTORETRACT _UxGT("Auto. wycofanie") +#define MSG_FILAMENTCHANGE _UxGT("Zmień filament") +#define MSG_INIT_SDCARD _UxGT("Inicjal. karty SD") +#define MSG_CNG_SDCARD _UxGT("Zmiana karty SD") +#define MSG_ZPROBE_OUT _UxGT("Sonda Z za stołem") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") +#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("first") +#define MSG_ZPROBE_ZOFFSET _UxGT("Offset Z") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Błąd krańcówki") +#define MSG_HEATING_FAILED_LCD _UxGT("Rozgrz. nieudane") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Błąd temperatury") +#define MSG_THERMAL_RUNAWAY _UxGT("Zanik temp.") +#define MSG_ERR_MAXTEMP _UxGT("Err max temp") +#define MSG_ERR_MINTEMP _UxGT("Err min temp") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err max temp stołu") +#define MSG_ERR_MINTEMP_BED _UxGT("Err min temp stołu") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("Drukarka zatrzym.") +#define MSG_PLEASE_RESET _UxGT("Proszę zresetować") +#define MSG_SHORT_DAY _UxGT("d") // One character only +#define MSG_SHORT_HOUR _UxGT("g") // One character only +#define MSG_SHORT_MINUTE _UxGT("m") // One character only +#define MSG_HEATING _UxGT("Rozgrzewanie...") +#define MSG_BED_HEATING _UxGT("Rozgrzewanie stołu...") +#define MSG_DELTA_CALIBRATE _UxGT("Kalibrowanie Delty") +#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibruj X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibruj Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibruj Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibruj środek") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" gotowy."); - PROGMEM Language_Str MSG_YES = _UxGT("TAK"); - PROGMEM Language_Str MSG_NO = _UxGT("NIE"); - PROGMEM Language_Str MSG_BACK = _UxGT("Wstecz"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Przerywanie..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Karta włożona"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Karta usunięta"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Oczekiwanie na kartę"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Bład odczytu karty"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Urządzenie USB usunięte"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Błąd uruchomienia USB"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Krańców."); // Max length 8 characters - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Progr. Krańcówki"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menu główne"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Ustawienie zaawansowane"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguracja"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Wyłącz silniki"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu Debugowania"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Testowy pasek postępu"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Pozycja zerowa"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Zeruj X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Zeruj Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Zeruj Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Autowyrównanie Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Pozycja zerowa"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknij by rozp."); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Następny punkt"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Wypoziomowano!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Wys. zanikania"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ust. poz. zer."); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Poz. zerowa ust."); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ustaw punkt zero"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" wsz."); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" stół"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" ustaw."); +#define MSG_INFO_MENU _UxGT("O drukarce") +#define MSG_INFO_PRINTER_MENU _UxGT("Info drukarki") +#define MSG_INFO_STATS_MENU _UxGT("Statystyki") +#define MSG_INFO_BOARD_MENU _UxGT("Board Info") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistory") +#define MSG_INFO_EXTRUDERS _UxGT("Ekstrudery") +#define MSG_INFO_BAUDRATE _UxGT("Predkość USB") +#define MSG_INFO_PROTOCOL _UxGT("Protokół") +#define MSG_CASE_LIGHT _UxGT("Oświetlenie") - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Rozgrzej $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Rozgrzej $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Rozgrzej $ Dysza"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Rozgrzej $ Dysza ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Rozgrzej $ wsz."); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Rozgrzej $ stół"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Rozgrzej $ ustaw."); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Rozgrzej własne ust."); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Chłodzenie"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Sterowanie Lasera"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Wyłącz Laser"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Włącz Laser"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Zasilanie Lasera"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Sterowanie wrzeciona"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Wyłącz wrzeciono"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Włącz wrzeciono"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Zasilanie wrzeciona"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Rewers wrzeciona"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Włącz zasilacz"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Wyłącz zasilacz"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Ekstruzja"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Wycofanie"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Ruch osi"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Poziomowanie stołu"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Wypoziomuj stół"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Narożniki poziomowania"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Nastepny narożnik"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Edytor siatki"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Edycja siatki"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Edycja siatki zatrzymana"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punkt pomiarowy"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Indeks X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indeks Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Wartość Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Własne Polecenia"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punky"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchylenie"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Tryb IDEX"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Przesunięcie narzędzia"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkowanie"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikowanie"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Kopia lustrzana"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Pełne sterowanie"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2ga dysza X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2ga dysza Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2ga dysza Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Wykonywanie G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Narzędzia UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punkt pochylenia"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ręczne Budowanie Siatki"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Umieść podkładkę i zmierz"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Zmierz"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Usuń & Zmierz Stół"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Przesuwanie do następnego"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktywacja UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Dezaktywacja UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temperatura stołu"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temperatura stołu"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temperatura dyszy"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temperatura dyszy"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Edycja siatki"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edycja własnej siatki"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Dostrajanie siatki"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec edycji siati"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Buduj własna siatkę"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Buduj siatkę"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Buduj siatkę ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Sprawdzenie siatki ($)"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Buduj siatkę na zimno"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Dostrojenie wysokości siatki"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Wartość wysokości"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Sprawdzenie siatki"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Sprawdzenie własnej siatki"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Nagrzewanie stołu"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Nagrzewanie dyszy"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Napełnianie ręczne..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Napełnij kreśloną długością"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Napełnianie zakończone"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Przewane"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Opuszczanie G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Kontynuuj tworzenie siatki"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Poziomowanie siatką"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Poziomowaie 3-punktowe"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Poziomowaie według siatki"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Poziomuj siatkę"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Punkty boczne"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Rodzaj mapy"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Wyslij mapę siatki"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Wyslij do Hosta"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Wyslij do CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Kopia poza drukarką"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Wyslij info UBL"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Stopień wypełnienia"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ręczne wypełnienie"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Inteligentne wypełnienie"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Wypełnienie siatki"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Unieważnij wszystko"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Unieważnij najbliższy"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Dostrajaj wszystko"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Dostrajaj najbliższy"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Przechowywanie siatki"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot Pamięci"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Załaduj siatkę stołu"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Zapisz siatkę stołu"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Siatka %i załadowana"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Siatka %i zapisana"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Brak magazynu"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Błąd: Zapis UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Bład: Odczyt UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Przesunięcie Z: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Przesunięcie Z zatrzymane"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Krok po kroku"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Tworzenie zimnej siatki"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligentne wypełnienie"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Sprawdzenie siatki"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Dostrojenie wszystkiego"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Sprawdzenie siatki"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Dostrojenie wszystkiego"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Zapis siatki stołu"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Wydrukowano") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Ukończono") + #define MSG_INFO_PRINT_TIME _UxGT("Czas druku") + #define MSG_INFO_PRINT_LONGEST _UxGT("Najdł. druk") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Użyty fil.") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Wydrukowano") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Ukończono") + #define MSG_INFO_PRINT_TIME _UxGT("Razem") + #define MSG_INFO_PRINT_LONGEST _UxGT("Najdł. druk") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Użyty fil.") +#endif - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Sterowanie LED"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Światła"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Ustawienia świateł"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Czerwony"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Pomarańczowy"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Zółty"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zielony"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Niebieski"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indygo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fioletowy"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Biały"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Domyślny"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Własne światła"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Czerwony"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zielony"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Niebieski"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Biały"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Jasność"); +#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") +#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") +#define MSG_INFO_PSU _UxGT("Zasilacz") - PROGMEM Language_Str MSG_MOVING = _UxGT("Ruch..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Swobodne XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Przesuń w X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Przesuń w Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Przesuń w Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Ekstruzja (os E)"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Ekstruzja (os E) *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Dysza za zimna"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Przesuń co %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Przesuń co .1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Przesuń co 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Przesuń co 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Predkość"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Stół Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dysza"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Dysza ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Stół"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Obudowa"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Obroty wiatraka"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Obroty wiatraka ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Obroty dodatkowego wiatraka"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Obroty dodatkowego wiatraka ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Przepływ"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Przepływ ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Ustawienia"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Mnożnik"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto. temperatura"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Wł."); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Wył."); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autostrojenie"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autostrojenie *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Wybierz"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Wybierz *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Przyspieszenie"); - PROGMEM Language_Str MSG_JERK = _UxGT("Zryw"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("Zryw V") LCD_STR_A; - PROGMEM Language_Str MSG_VB_JERK = _UxGT("Zryw V") LCD_STR_B; - PROGMEM Language_Str MSG_VC_JERK = _UxGT("Zryw V") LCD_STR_C; - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Zryw Ve"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Prędkość (V)"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vskok min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Przyspieszenie (A)"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-wycofanie"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-przesuń."); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("kroki/mm"); - PROGMEM Language_Str MSG_A_STEPS = _UxGT("kroki") LCD_STR_A _UxGT("/mm"); - PROGMEM Language_Str MSG_B_STEPS = _UxGT("kroki") LCD_STR_B _UxGT("/mm"); - PROGMEM Language_Str MSG_C_STEPS = _UxGT("kroki") LCD_STR_C _UxGT("/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("krokiE/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("kroki */mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Ruch"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E w mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Śr. fil."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Śr. fil. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Wysuń mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Wsuń mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advance K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Zapisz w pamięci"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Wczytaj z pamięci"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Ustaw. fabryczne"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initializuj EEPROM"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Uaktualnij kartę"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetuj drukarkę"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Odswież"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Ekran główny"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Przygotuj"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Strojenie"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Start wydruku"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Następny"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inic."); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Drukuj"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetuj"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Przerwij"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Gotowe"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Wstrzymaj druk"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Wznowienie"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop"); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Odzyskiwanie po awarii"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Karta SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Brak karty"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Uśpij..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Oczekiwanie..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Druk wstrzymany"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Drukowanie..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Druk przerwany"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Brak ruchu"); - PROGMEM Language_Str MSG_KILLED = _UxGT("Ubity. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("Zatrzymany. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Wycofaj mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Z Wycof. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Wycofaj V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Skok Z mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Cof. wycof. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Z Cof. wyc. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Cof. wycof. V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto. wycofanie"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Długość zmiany"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Długość oczyszczania"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Zmiana narzędzia"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Podniesienie Z"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prędkość napełniania"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Prędkość wycofania"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Dysza w oczekiwaniu"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Zmień filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Zmień filament *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Wsuń Filament"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Wsuń Filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Wysuń Filament"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Wysuń Filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Wysuń wszystkie"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Inicjal. karty SD"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Zmiana karty SD"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Zwolnienie karty"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z za stołem"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Współczynik skrzywienia"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Self-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Stow"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Deploy"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("UWAGA: Złe ustawienia mogą uszkodzić drukarkę. Kontynuować?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Save"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Deploy TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Deploy Z-Probe"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Stow Z-Probe"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Najpierw Home %s%s%s"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Offset Z"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Łącznie"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Błąd krańcówki"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Rozgrz. nieudane"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Błąd temperatury"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ZANIK TEMPERATURY"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ZANIK TEMP. STOŁU"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ZANIK TEMP.KOMORY"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Błąd: MAXTEMP"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Błąd: MINTEMP"); - PROGMEM Language_Str MSG_HALTED = _UxGT("Drukarka zatrzym."); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Proszę zresetować"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("g"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Rozgrzewanie..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Chłodzenie..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Rozgrzewanie stołu..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Chłodzenie stołu..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Rozgrzewanie komory..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chłodzenie komory..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Kalibrowanie Delty"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibruj X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibruj Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibruj Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibruj środek"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Ustawienia delty"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto kalibrowanie"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Ustaw wysokość delty"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Przesun. Z sondy"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Ukośne ramię"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Wysokość"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Promień"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O drukarce"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info drukarki"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Poziomowanie 3-punktowe"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Poziomowanie liniowe"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Poziomowanie biliniowe"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Poziomowanie siatką"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statystyki"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info płyty"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Ekstrudery"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Predkość USB"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokół"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Zegar pracy: OFF"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Zegar pracy: ON"); +#define MSG_DRIVE_STRENGTH _UxGT("Siła silnika") +#define MSG_DAC_PERCENT _UxGT("Siła %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Zapisz DAC EEPROM") - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Oświetlenie obudowy"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jasność oświetlenia"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Niepoprawna drukarka"); +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("ZMIEŃ FILAMENT") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("ZMIEŃ OPCJE:") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Wznów drukowanie") - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Wydrukowano"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Ukończono"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Czas druku"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdł. druk"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Użyty fil."); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Wydrukowano"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Ukończono"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Razem"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdł. druk"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Użyty fil."); - #endif +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Czekam na ") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("zmianę filamentu") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Czekam na") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("wyjęcie filamentu") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Włóz filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("i naciśnij przycisk") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("aby kontynuować...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Czekam na") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("włożenie filamentu") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Czekam na") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("wznowienie druku") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Proszę czekać...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Wysuwanie...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Włóż i naciśnij prz.") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Ładowanie...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Wznowienie...") +#endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Zasilacz"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Siła silnika"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Siła %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Siła %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Siła %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Siła %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC BŁĄD POŁĄCZENIA"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Zapisz DAC EEPROM"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("ZMIEŃ FILAMENT"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("WYDRUK WSTRZYMANY"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("WSUŃ FILAMENT"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("WYSUŃ FILAMENT"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPCJE WZNOWIENIA:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Oczyść więcej"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Kontynuuj"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Dysza: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Czujnik filamentu"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dystans do czujnika mm"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Zerowanie nieudane"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondowanie nieudane"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("WYBIERZ FILAMENT"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Uaktualnij firmware MMU!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU wymaga uwagi."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Wznów wydruk"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Wznawianie..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Wsuń filament"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Wsuń wszystko"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Wsuń do dyszy"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Wysuń filament"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Wysuń filament ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Wysuń filament"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Wsuwanie fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Wysuwanie fil. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Wysuwanie fil...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Wszystko"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Resetuj MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Resetowanie MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Usuń, kliknij"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Miks"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Komponent ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Mikser"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Pełny gradient"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Przełacz miks"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cycle Mix"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Odwrotny gradient"); - - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nacisnik przycisk", "by wznowić drukowanie")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkowanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Czekam na", "zmianę filamentu", "by wystartować")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Włóż filament", "i naciśnij przycisk", "by kontynuować")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Naciśnij przycisk", "by nagrzać dyszę")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nagrzewanie dyszy", "Proszę czekać...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Czekam na", "wyjęcie filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Czekam na", "włożenie filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Czekam na", "oczyszczenie filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kliknij by zakończyć", "oczyszczanie filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Czekam na", "wznowienie wydruku...")); - #else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Kliknij by kontynuować")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkowanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Proszę czekać...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Włóż i kliknij")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Kliknij by nagrzać")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Nagrzewanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Wysuwanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Wsuwanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Oczyszczanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Kliknij by zakończyć")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Wznawianie...")); - #endif -} +#endif // LANGUAGE_PL_DOGM_H diff --git a/Marlin/src/lcd/language/language_pt-br.h b/Marlin/src/lcd/language/language_pt-br.h new file mode 100644 index 0000000000..0d7ffe84c4 --- /dev/null +++ b/Marlin/src/lcd/language/language_pt-br.h @@ -0,0 +1,385 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Portuguese (Brazil) + * UTF-8 for Graphical Display + * + * LCD Menu Messages + * See also http://marlinfw.org/docs/development/lcd_language.html + * + */ +#ifndef LANGUAGE_PT_BR_UTF_H +#define LANGUAGE_PT_BR_UTF_H + +// Put characters here that should be displayed with M117 +//_UxGT("áãàçÉéêíóõ") + +#define CHARSIZE 2 + +#define WELCOME_MSG MACHINE_NAME _UxGT(" pronto.") + +#define MSG_BACK _UxGT("Voltar") +#define MSG_SD_INSERTED _UxGT("Cartão inserido") +#define MSG_SD_REMOVED _UxGT("Cartão removido") +#define MSG_LCD_ENDSTOPS _UxGT("Finais") +#define MSG_MAIN _UxGT("Menu principal") +#define MSG_AUTOSTART _UxGT("Autostart") +#define MSG_DISABLE_STEPPERS _UxGT("Desabi. motores") +#define MSG_DEBUG_MENU _UxGT("Menu Debug") +#define MSG_PROGRESS_BAR_TEST _UxGT("Testar Barra de Prog")//resso +#define MSG_AUTO_HOME_X _UxGT("Ir na origem X") +#define MSG_AUTO_HOME_Y _UxGT("Ir na origem Y") +#define MSG_AUTO_HOME_Z _UxGT("Ir na origem Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Calibrar Z") +#define MSG_AUTO_HOME _UxGT("Ir na origem XYZ") +#define MSG_LEVEL_BED_HOMING _UxGT("Indo para origem") +#define MSG_LEVEL_BED_WAITING _UxGT("Clique para Iniciar") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Próximo Ponto") +#define MSG_LEVEL_BED_DONE _UxGT("Fim nivelação!") +#define MSG_Z_FADE_HEIGHT _UxGT("Suavizar altura") +#define MSG_SET_HOME_OFFSETS _UxGT("Compensar origem") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Alteração feita") +#define MSG_SET_ORIGIN _UxGT("Ajustar Origem") +#define MSG_PREHEAT_1 _UxGT("Pre-aquecer PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL _UxGT("Pre-aq.Todo PLA") +#define MSG_PREHEAT_1_END _UxGT("Pre-aq.Extrusora") +#define MSG_PREHEAT_1_BEDONLY _UxGT("Pre-aq.Mesa PLA") +#define MSG_PREHEAT_1_SETTINGS _UxGT("Ajustar PLA") +#define MSG_PREHEAT_2 _UxGT("Pre-aquecer ABS") +#define MSG_PREHEAT_2_N _UxGT("Pre-aquecer ABS") +#define MSG_PREHEAT_2_ALL _UxGT("Pre-aq.Todo ABS") +#define MSG_PREHEAT_2_BEDONLY _UxGT("Pre-aq.Mesa ABS") +#define MSG_PREHEAT_2_END _UxGT("Pre-aq.Extrusora") +#define MSG_PREHEAT_2_SETTINGS _UxGT("Ajustar ABS") +#define MSG_COOLDOWN _UxGT("Esfriar") +#define MSG_SWITCH_PS_ON _UxGT("Ligar") +#define MSG_SWITCH_PS_OFF _UxGT("Desligar") +#define MSG_EXTRUDE _UxGT("Extrusar") +#define MSG_RETRACT _UxGT("Retrair") +#define MSG_MOVE_AXIS _UxGT("Mover eixo") +#define MSG_BED_LEVELING _UxGT("Nivelação Mesa") +#define MSG_LEVEL_BED _UxGT("Nivelar Mesa") +#define MSG_LEVEL_CORNERS _UxGT("Nivelar Cantos") +#define MSG_NEXT_CORNER _UxGT("Próximo Canto") +#define MSG_EDITING_STOPPED _UxGT("Fim da Edição") + +#define MSG_USER_MENU _UxGT("Comando customizado") +#define MSG_UBL_DOING_G29 _UxGT("Executando G29") +#define MSG_UBL_UNHOMED _UxGT("Fora da Origam") +#define MSG_UBL_TOOLS _UxGT("Ferramentas UBL") +#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") +#define MSG_UBL_MANUAL_MESH _UxGT("Fazer malha manual") +#define MSG_UBL_BC_INSERT _UxGT("Calçar e calibrar") +#define MSG_UBL_BC_INSERT2 _UxGT("Medir") +#define MSG_UBL_BC_REMOVE _UxGT("Remover e calibrar") + +#define MSG_UBL_MOVING_TO_NEXT _UxGT("Indo para o Próximo") +#define MSG_UBL_ACTIVATE_MESH _UxGT("Ativar UBL") +#define MSG_UBL_DEACTIVATE_MESH _UxGT("Desativar UBL") +#define MSG_UBL_SET_BED_TEMP _UxGT("Temp. Mesa") +#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Temp. Extrusora") +#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP +#define MSG_UBL_MESH_EDIT _UxGT("Editar Malha") +#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Editar Malha Custom") +#define MSG_UBL_FINE_TUNE_MESH _UxGT("Ajuste Fino da Malha") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Fim da Edição") +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Montar Customi") +#define MSG_UBL_BUILD_MESH_MENU _UxGT("Montar ") +#define MSG_UBL_BUILD_PLA_MESH _UxGT("Montar PLA") +#define MSG_UBL_BUILD_ABS_MESH _UxGT("Montar ABS") +#define MSG_UBL_BUILD_COLD_MESH _UxGT("Montar fria") +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Ajustar Altura") +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Tamanho da Elevação") +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Validar Malha") +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Checar PLA") +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Checar ABS") +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Validar Malha Custom") +#define MSG_UBL_CONTINUE_MESH _UxGT("Continuar Malha") +#define MSG_UBL_MESH_LEVELING _UxGT("Nivelação da Malha") +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Nivelação 3 pontos") +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Nivelação Grid") +#define MSG_UBL_MESH_LEVEL _UxGT("Nivelar Malha") +#define MSG_UBL_SIDE_POINTS _UxGT("Cantos") +#define MSG_UBL_MAP_TYPE _UxGT("Tipo de Mapa") +#define MSG_UBL_OUTPUT_MAP _UxGT("Salvar Mapa da Malha") +#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Enviar Para Host") +#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Salvar Malha CSV") +#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Salvar Backup") +#define MSG_UBL_INFO_UBL _UxGT("Informação do UBL") +#define MSG_UBL_EDIT_MESH_MENU _UxGT("Editar Malha") +#define MSG_UBL_FILLIN_AMOUNT _UxGT("Qtd de Enchimento") +#define MSG_UBL_MANUAL_FILLIN _UxGT("Enchimento Manual") +#define MSG_UBL_SMART_FILLIN _UxGT("Enchimento Smart") +#define MSG_UBL_FILLIN_MESH _UxGT("Preencher malha") +#define MSG_UBL_INVALIDATE_ALL _UxGT("Invalidar tudo") +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Invalidar próximo") +#define MSG_UBL_FINE_TUNE_ALL _UxGT("Ajuste Fino de Todos") +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Ajuar Mais Próximo") +#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Armazenamento Malha") +#define MSG_UBL_STORAGE_SLOT _UxGT("Slot de Memória") +#define MSG_UBL_LOAD_MESH _UxGT("Ler Malha") +#define MSG_UBL_SAVE_MESH _UxGT("Salvar Malha") +#define MSG_MESH_LOADED _UxGT("Malha %i carregada") +#define MSG_MESH_SAVED _UxGT("Malha %i salva") +#define MSG_NO_STORAGE _UxGT("Sem armazenamento") +#define MSG_UBL_SAVE_ERROR _UxGT("Erro ao salvar UBL") +#define MSG_UBL_RESTORE_ERROR _UxGT("Erro no restauro UBL") +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Compensação Z parou") +#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("UBL passo a passo") +#define MSG_LED_CONTROL _UxGT("Controle do LED") +#define MSG_LEDS _UxGT("Luz") +#define MSG_LED_PRESETS _UxGT("Configuração da Luz") +#define MSG_SET_LEDS_RED _UxGT("Luz Vermelha") +#define MSG_SET_LEDS_ORANGE _UxGT("Luz Laranja") +#define MSG_SET_LEDS_YELLOW _UxGT("Luz Amarela") +#define MSG_SET_LEDS_GREEN _UxGT("Luz Verde") +#define MSG_SET_LEDS_BLUE _UxGT("Luz Azul") +#define MSG_SET_LEDS_INDIGO _UxGT("Luz Indigo") +#define MSG_SET_LEDS_VIOLET _UxGT("Luz Violeta") +#define MSG_SET_LEDS_WHITE _UxGT("Luz Branca") +#define MSG_SET_LEDS_DEFAULT _UxGT("Luz Padrão") +#define MSG_CUSTOM_LEDS _UxGT("Luz Customizada") +#define MSG_INTENSITY_R _UxGT("Intensidade Vermelho") +#define MSG_INTENSITY_G _UxGT("Intensidade Verde") +#define MSG_INTENSITY_B _UxGT("Intensidade Azul") +#define MSG_INTENSITY_W _UxGT("Intensidade Branco") +#define MSG_LED_BRIGHTNESS _UxGT("Brilho") + +#define MSG_MOVING _UxGT("Movendo...") +#define MSG_FREE_XY _UxGT("Liberar XY") +#define MSG_MOVE_X _UxGT("Mover X") +#define MSG_MOVE_Y _UxGT("Mover Y") +#define MSG_MOVE_Z _UxGT("Mover Z") +#define MSG_MOVE_E _UxGT("Mover Extrusor") +#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") +#define MSG_MOVE_1MM _UxGT("Mover 1mm") +#define MSG_MOVE_10MM _UxGT("Mover 10mm") +#define MSG_SPEED _UxGT("Velocidade") +#define MSG_BED_Z _UxGT("Base Z") +#define MSG_NOZZLE _UxGT("Bocal") +#define MSG_BED _UxGT("Mesa") +#define MSG_FAN_SPEED _UxGT("Vel. Ventoinha") +#define MSG_FLOW _UxGT("Vazão") +#define MSG_CONTROL _UxGT("Controle") +#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Fator") +#define MSG_AUTOTEMP _UxGT("Temp. Automática") +#define MSG_ON _UxGT("Ligado ") +#define MSG_OFF _UxGT("Desligado") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Selecionar") +#define MSG_ACC _UxGT("Acel.") +#define MSG_JERK _UxGT("Jogo") +#if IS_SCARA + #define MSG_VA_JERK _UxGT("jogo VA") + #define MSG_VB_JERK _UxGT("jogo VB") + #define MSG_VC_JERK _UxGT("jogo VZ") +#elif IS_DELTA + #define MSG_VA_JERK _UxGT("jogo VA") + #define MSG_VB_JERK _UxGT("jogo VB") + #define MSG_VC_JERK _UxGT("jogo VC") +#else + #define MSG_VA_JERK _UxGT("jogo VX") + #define MSG_VB_JERK _UxGT("jogo VY") + #define MSG_VC_JERK _UxGT("jogo VZ") +#endif +#define MSG_VE_JERK _UxGT("jogo VE") +#define MSG_VELOCITY _UxGT("Velocidade") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VDeslocamento min") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("Retrair A") +#define MSG_A_TRAVEL _UxGT("Movimento A") +#define MSG_STEPS_PER_MM _UxGT("Passo/mm") +#if IS_SCARA + #define MSG_ASTEPS _UxGT("Passo A/deg") + #define MSG_BSTEPS _UxGT("Passo B/deg") + #define MSG_CSTEPS _UxGT("Passo Z/mm") +#elif IS_DELTA + #define MSG_ASTEPS _UxGT("Passo A/mm") + #define MSG_BSTEPS _UxGT("Passo B/mm") + #define MSG_CSTEPS _UxGT("Passo C/mm") +#else + #define MSG_ASTEPS _UxGT("Passo X/mm") + #define MSG_BSTEPS _UxGT("Passo Y/mm") + #define MSG_CSTEPS _UxGT("Passo Z/mm") +#endif +#define MSG_ESTEPS _UxGT("E/mm") +#define MSG_E1STEPS _UxGT("E1/mm") +#define MSG_E2STEPS _UxGT("E2/mm") +#define MSG_E3STEPS _UxGT("E3/mm") +#define MSG_E4STEPS _UxGT("E4/mm") +#define MSG_E5STEPS _UxGT("E5/mm") +#define MSG_TEMPERATURE _UxGT("Temperatura") +#define MSG_MOTION _UxGT("Movimento") +#define MSG_FILAMENT _UxGT("Filamento") +#define MSG_VOLUMETRIC_ENABLED _UxGT("Extrusão em mm3") +#define MSG_FILAMENT_DIAM _UxGT("Diâmetro Fil.") +#define MSG_ADVANCE_K _UxGT("Avançar K") +#define MSG_CONTRAST _UxGT("Contraste") +#define MSG_STORE_EEPROM _UxGT("Salvar Configuração") +#define MSG_LOAD_EEPROM _UxGT("Ler Configuração") +#define MSG_RESTORE_FAILSAFE _UxGT("Restauro seguro") +#define MSG_INIT_EEPROM _UxGT("Iniciar EEPROM") +#define MSG_REFRESH LCD_STR_REFRESH _UxGT(" Atualização") +#define MSG_WATCH _UxGT("Informações") +#define MSG_PREPARE _UxGT("Preparar") +#define MSG_TUNE _UxGT("Ajustar") +#define MSG_PAUSE_PRINT _UxGT("Pausar impressão") +#define MSG_RESUME_PRINT _UxGT("Resumir impressão") +#define MSG_STOP_PRINT _UxGT("Parar impressão") +#define MSG_CARD_MENU _UxGT("Imprimir do SD") +#define MSG_NO_CARD _UxGT("Sem cartão SD") +#define MSG_DWELL _UxGT("ZzZzZz...") +#define MSG_USERWAIT _UxGT("Clique para retomar") +#define MSG_PRINT_ABORTED _UxGT("Impressão Abortada") +#define MSG_NO_MOVE _UxGT("Sem movimento") +#define MSG_KILLED _UxGT("PARADA DE EMERGÊNCIA") +#define MSG_STOPPED _UxGT("PAROU. ") +#define MSG_CONTROL_RETRACT _UxGT("Retrair mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Retrair Troca mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retrair V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Saltar mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Des-Retrair mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Des-RetTroca mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Des-Retrair V") +#define MSG_AUTORETRACT _UxGT("Retração Automática") +#define MSG_FILAMENTCHANGE _UxGT("Trocar Filamento") +#define MSG_INIT_SDCARD _UxGT("Iniciar SD") +#define MSG_CNG_SDCARD _UxGT("Trocar SD") +#define MSG_ZPROBE_OUT _UxGT("Sonda fora da mesa") +#define MSG_SKEW_FACTOR _UxGT("Fator de Cisalho") +#define MSG_BLTOUCH _UxGT("BLTouch") +#define MSG_BLTOUCH_SELFTEST _UxGT("Testar BLTouch") +#define MSG_BLTOUCH_RESET _UxGT("Reiniciar BLTouch") +#define MSG_BLTOUCH_DEPLOY _UxGT("Implantar BLTouch") +#define MSG_BLTOUCH_STOW _UxGT("Condicionar BLTouch") + +#define MSG_HOME _UxGT("Home") +#define MSG_FIRST _UxGT("Primeiro") +#define MSG_ZPROBE_ZOFFSET _UxGT("Compensar Sonda em Z") +#define MSG_BABYSTEP_X _UxGT("Passinho X") +#define MSG_BABYSTEP_Y _UxGT("Passinho Y") +#define MSG_BABYSTEP_Z _UxGT("Passinho Z") +#define MSG_ENDSTOP_ABORT _UxGT("Fim de Curso") +#define MSG_HEATING_FAILED_LCD _UxGT("Aquecimento falhou") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Erro:Temp Redundante") +#define MSG_THERMAL_RUNAWAY _UxGT("ESCAPE TÉRMICO") +#define MSG_ERR_MAXTEMP _UxGT("Erro:Temp Máxima") +#define MSG_ERR_MINTEMP _UxGT("Erro:Temp Mínima") +#define MSG_ERR_MAXTEMP_BED _UxGT("Erro:Temp Mesa Máx") +#define MSG_ERR_MINTEMP_BED _UxGT("Erro:Temp Mesa Mín") +#define MSG_HEATING _UxGT("Aquecendo...") +#define MSG_BED_HEATING _UxGT("Aquecendo base...") +#define MSG_DELTA_CALIBRATE _UxGT("Calibrar Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") + +#define MSG_DELTA_SETTINGS _UxGT("Configuração Delta") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto-Calibração") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Calibrar Altura") +#define MSG_DELTA_DIAG_ROD _UxGT("Haste Diagonal") +#define MSG_DELTA_HEIGHT _UxGT("Altura") +#define MSG_DELTA_RADIUS _UxGT("Raio") +#define MSG_INFO_MENU _UxGT("Sobre") +#define MSG_INFO_PRINTER_MENU _UxGT("Impressora") +#define MSG_3POINT_LEVELING _UxGT("Nivelamento 3 pontos") +#define MSG_LINEAR_LEVELING _UxGT("Nivelamento Linear") +#define MSG_BILINEAR_LEVELING _UxGT("Nivelamento Bilinear") +#define MSG_UBL_LEVELING _UxGT("Nivelamento UBL") +#define MSG_MESH_LEVELING _UxGT("Nivelamento da Malha") +#define MSG_INFO_STATS_MENU _UxGT("Estatísticas") +#define MSG_INFO_BOARD_MENU _UxGT("Info. da Placa") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistors") +#define MSG_INFO_EXTRUDERS _UxGT("Extrusoras") +#define MSG_INFO_BAUDRATE _UxGT("Frequência Baud") +#define MSG_INFO_PROTOCOL _UxGT("Protocolo") +#define MSG_CASE_LIGHT _UxGT("Luz da Estrutura") +#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Intensidade Brilho") +#define MSG_INFO_PRINT_COUNT _UxGT("Qtd de Impressões") +#define MSG_INFO_COMPLETED_PRINTS _UxGT("Fim") +#define MSG_INFO_PRINT_TIME _UxGT("Tempo de Impressão") +#define MSG_INFO_PRINT_LONGEST _UxGT("Trabalho Mais longo") +#define MSG_INFO_PRINT_FILAMENT _UxGT("Total Depositado") +#define MSG_INFO_MIN_TEMP _UxGT("Temp Min") +#define MSG_INFO_MAX_TEMP _UxGT("Temp Max") +#define MSG_INFO_PSU _UxGT("PSU") +#define MSG_DRIVE_STRENGTH _UxGT("Força do Motor") +#define MSG_DAC_PERCENT _UxGT("Driver %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Escrever Eeprom DAC") + +#define MSG_FILAMENT_CHANGE_HEADER _UxGT("Troca de Filamento") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("Config. de Retomada") +#define MSG_FILAMENT_CHANGE_OPTION_EXTRUDE _UxGT("Extrusar Mais") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Continuar Impressão") +#define MSG_FILAMENT_CHANGE_MINTEMP _UxGT("Temp. Mínima é ") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Bocal: ") +#define MSG_ERR_HOMING_FAILED _UxGT("Falha ao ir à origem") +#define MSG_ERR_PROBING_FAILED _UxGT("Falha ao sondar") + +#if LCD_HEIGHT >= 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando o") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("inicio da") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("troca de Filamento") + + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperando") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("remoção de filamento") + + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Coloque Filamento") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("pressione o botão") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") + + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Pressione o botão") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("p/ Aquecer o Bocal") + + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo o Bocal") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Aguarde...") + + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperando") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filamento") + + #define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Esperando extrusão") + #define MSG_FILAMENT_CHANGE_EXTRUDE_2 _UxGT("de filamento") + + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando impressão") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("continuar") +#else // LCD_HEIGHT < 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Aguarde...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejetando...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insira e Clique") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Aquecendo...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Carregando...") + #define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Extrusando...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Continuando...") +#endif + +#endif // LANGUAGE_PT_BR_UTF_H diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 37da621624..a3e1256f6a 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,148 +16,174 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Portuguese * UTF-8 for Graphical Display * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_PT_UTF_H +#define LANGUAGE_PT_UTF_H - #define DISPLAY_CHARSET_ISO10646_1 +#define DISPLAY_CHARSET_ISO10646_1 +#define CHARSIZE 2 -namespace Language_pt { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" pronta.") +#define MSG_SD_INSERTED _UxGT("Cartão inserido") +#define MSG_SD_REMOVED _UxGT("Cartão removido") +#define MSG_MAIN _UxGT("Menu principal") +#define MSG_AUTOSTART _UxGT("Autostart") +#define MSG_DISABLE_STEPPERS _UxGT("Desactivar motores") +#define MSG_AUTO_HOME _UxGT("Ir para origem") +#define MSG_AUTO_HOME_X _UxGT("Ir para origem X") +#define MSG_AUTO_HOME_Y _UxGT("Ir para origem Y") +#define MSG_AUTO_HOME_Z _UxGT("Ir para origem Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Calibrar Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Indo para origem") +#define MSG_LEVEL_BED_WAITING _UxGT("Click para iniciar") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Próximo ponto") +#define MSG_LEVEL_BED_DONE _UxGT("Pronto !") +#define MSG_SET_HOME_OFFSETS _UxGT("Definir desvio") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsets aplicados") +#define MSG_SET_ORIGIN _UxGT("Definir origem") +#define MSG_PREHEAT_1 _UxGT("Pre-aquecer PLA") +#define MSG_PREHEAT_1_N _UxGT("Pre-aquecer PLA") +#define MSG_PREHEAT_1_ALL _UxGT("Pre-aq. PLA Tudo") +#define MSG_PREHEAT_1_BEDONLY _UxGT("Pre-aq. PLA ") LCD_STR_THERMOMETER _UxGT("Base") +#define MSG_PREHEAT_1_SETTINGS _UxGT("Definições PLA") +#define MSG_PREHEAT_2 _UxGT("Pre-aquecer ABS") +#define MSG_PREHEAT_2_N _UxGT("Pre-aquecer ABS ") +#define MSG_PREHEAT_2_ALL _UxGT("Pre-aq. ABS Tudo") +#define MSG_PREHEAT_2_BEDONLY _UxGT("Pre-aq. ABS ") LCD_STR_THERMOMETER _UxGT("Base") +#define MSG_PREHEAT_2_SETTINGS _UxGT("Definições ABS") +#define MSG_COOLDOWN _UxGT("Arrefecer") +#define MSG_SWITCH_PS_ON _UxGT("Ligar") +#define MSG_SWITCH_PS_OFF _UxGT("Desligar") +#define MSG_EXTRUDE _UxGT("Extrudir") +#define MSG_RETRACT _UxGT("Retrair") +#define MSG_MOVE_AXIS _UxGT("Mover eixo") +#define MSG_MOVE_X _UxGT("Mover X") +#define MSG_MOVE_Y _UxGT("Mover Y") +#define MSG_MOVE_Z _UxGT("Mover Z") +#define MSG_MOVE_E _UxGT("Mover Extrusor") +#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") +#define MSG_MOVE_1MM _UxGT("Mover 1mm") +#define MSG_MOVE_10MM _UxGT("Mover 10mm") +#define MSG_SPEED _UxGT("Velocidade") +#define MSG_BED_Z _UxGT("Base Z") +#define MSG_NOZZLE _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Bico") +#define MSG_BED _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Base") +#define MSG_FAN_SPEED _UxGT("Vel. ventoinha") +#define MSG_FLOW _UxGT("Fluxo") +#define MSG_CONTROL _UxGT("Controlo") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") +#define MSG_AUTOTEMP _UxGT("Temp. Automática") +#define MSG_ON _UxGT("On ") +#define MSG_OFF _UxGT("Off") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_ACC _UxGT("Acc") +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") +#else + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") +#endif +#define MSG_VE_JERK _UxGT("Ve-jerk") +#define MSG_VMAX _UxGT(" Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VTrav min") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-retracção") +#define MSG_A_TRAVEL _UxGT("A-movimento") +#define MSG_STEPS_PER_MM _UxGT("Passo/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("A passo/mm") + #define MSG_BSTEPS _UxGT("B passo/mm") + #define MSG_CSTEPS _UxGT("C passo/mm") +#else + #define MSG_ASTEPS _UxGT("X passo/mm") + #define MSG_BSTEPS _UxGT("Y passo/mm") + #define MSG_CSTEPS _UxGT("Z passo/mm") +#endif +#define MSG_ESTEPS _UxGT("E passo/mm") +#define MSG_E1STEPS _UxGT("E1 passo/mm") +#define MSG_E2STEPS _UxGT("E2 passo/mm") +#define MSG_E3STEPS _UxGT("E3 passo/mm") +#define MSG_E4STEPS _UxGT("E4 passo/mm") +#define MSG_E5STEPS _UxGT("E5 passo/mm") +#define MSG_TEMPERATURE _UxGT("Temperatura") +#define MSG_MOTION _UxGT("Movimento") +#define MSG_FILAMENT _UxGT("Filamento") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E em mm3") +#define MSG_FILAMENT_DIAM _UxGT("Fil. Diam.") +#define MSG_CONTRAST _UxGT("Contraste") +#define MSG_STORE_EEPROM _UxGT("Guardar na memoria") +#define MSG_LOAD_EEPROM _UxGT("Carregar da memoria") +#define MSG_RESTORE_FAILSAFE _UxGT("Rest. de emergen.") +#define MSG_REFRESH LCD_STR_REFRESH _UxGT(" Recarregar") +#define MSG_WATCH _UxGT("Monitorizar") +#define MSG_PREPARE _UxGT("Preparar") +#define MSG_TUNE _UxGT("Afinar") +#define MSG_PAUSE_PRINT _UxGT("Pausar impressão") +#define MSG_RESUME_PRINT _UxGT("Retomar impressão") +#define MSG_STOP_PRINT _UxGT("Parar impressão") +#define MSG_CARD_MENU _UxGT("Imprimir do SD") +#define MSG_NO_CARD _UxGT("Sem cartão SD") +#define MSG_DWELL _UxGT("Em espera...") +#define MSG_USERWAIT _UxGT("Á espera de ordem") +#define MSG_PRINT_ABORTED _UxGT("Impressão cancelada") +#define MSG_NO_MOVE _UxGT("Sem movimento") +#define MSG_KILLED _UxGT("EMERGÊNCIA. ") +#define MSG_STOPPED _UxGT("PARADO. ") +#define MSG_CONTROL_RETRACT _UxGT(" Retrair mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Troca Retrair mm") +#define MSG_CONTROL_RETRACTF _UxGT(" Retrair V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT(" Levantar mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT(" DesRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Troca DesRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT(" DesRet V") +#define MSG_AUTORETRACT _UxGT(" AutoRetr.") +#define MSG_FILAMENTCHANGE _UxGT("Trocar filamento") +#define MSG_INIT_SDCARD _UxGT("Inici. cartão SD") +#define MSG_CNG_SDCARD _UxGT("Trocar cartão SD") +#define MSG_ZPROBE_OUT _UxGT("Sensor fora/base") +#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("first") +#define MSG_ZPROBE_ZOFFSET _UxGT("Desvio Z") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Fim de curso") +#define MSG_HEATING_FAILED_LCD _UxGT("Aquecimento falhou") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Err: REDUNDANT TEMP") +#define MSG_THERMAL_RUNAWAY _UxGT("THERMAL RUNAWAY") +#define MSG_ERR_MAXTEMP _UxGT("Err: T Máxima") +#define MSG_ERR_MINTEMP _UxGT("Err: T Mínima") +#define MSG_ERR_MAXTEMP_BED _UxGT("Err: T Base Máxima") +#define MSG_ERR_MINTEMP_BED _UxGT("Err: T Base Mínima") +#define MSG_HEATING _UxGT("Aquecendo...") +#define MSG_BED_HEATING _UxGT("Aquecendo base...") +#define MSG_DELTA_CALIBRATE _UxGT("Calibração Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Portuguese"); +#define MSG_LCD_ENDSTOPS _UxGT("Fim de curso") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronta."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Cartão inserido"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Cartão removido"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desactivar motores"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ir para origem"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Ir para origem X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Ir para origem Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Ir para origem Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Indo para origem"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click para iniciar"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Próximo ponto"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Pronto !"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Definir desvio"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets aplicados"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Definir origem"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" Tudo"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" ") LCD_STR_THERMOMETER _UxGT("Base"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Definições ") PREHEAT_1_LABEL; - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Pre-aquecer $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Pre-aquecer $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Pre-aquecer $ Bico"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Pre-aquecer $ Bico ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Pre-aq. $ Tudo"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Pre-aq. $ ") LCD_STR_THERMOMETER _UxGT("Base"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Definições $"); - #endif - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Arrefecer"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ligar"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Desligar"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudir"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Retrair"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover eixo"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Mover Extrusor"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Mover Extrusor *"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z"); - PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Bico"); - PROGMEM Language_Str MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" Bico ~"); - PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" Base"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. ventoinha"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. ventoinha ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxo"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Fluxo ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Controlo"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retracção"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-movimento"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passo/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" passo/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" passo/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" passo/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E passo/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* passo/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E em mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Diam."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Diam. *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Guardar na memoria"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Carregar da memoria"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Rest. de emergen."); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Recarregar"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Monitorizar"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Afinar"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impressão"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Retomar impressão"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Parar impressão"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprimir do SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Sem cartão SD"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Em espera..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Á espera de ordem"); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impressão cancelada"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sem movimento"); - PROGMEM Language_Str MSG_KILLED = _UxGT("EMERGÊNCIA. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("PARADO. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT(" Retrair mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Troca Retrair mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT(" Retrair V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT(" Levantar mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT(" DesRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Troca DesRet mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT(" DesRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT(" Auto-Retract"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Trocar filamento"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Trocar filamento *"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Inici. cartão SD"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Trocar cartão SD"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sensor fora/base"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desvio Z"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Fim de curso"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: T Máxima"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: T Mínima"); - PROGMEM Language_Str MSG_HEATING = _UxGT("Aquecendo..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Aquecendo base..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibração Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); - - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Fim de curso"); - - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora Incorreta"); -} +#endif // LANGUAGE_PT_UTF_H diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h deleted file mode 100644 index cf2f7a0cce..0000000000 --- a/Marlin/src/lcd/language/language_pt_br.h +++ /dev/null @@ -1,481 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Portuguese (Brazil) - * UTF-8 for Graphical Display - * - * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html - */ -namespace Language_pt_br { - using namespace Language_en; // Inherit undefined strings from English - - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Portuguese (BR)"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronto."); - PROGMEM Language_Str MSG_YES = _UxGT("SIM"); - PROGMEM Language_Str MSG_NO = _UxGT("NÃO"); - PROGMEM Language_Str MSG_BACK = _UxGT("Voltar"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Abortando..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Cartão inserido"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Cartão removido"); - PROGMEM Language_Str MSG_MEDIA_RELEASED = _UxGT("Cartão liberado"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Aguardando cartão"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Erro de leitura"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB removido"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB falhou"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Fins de curso"); - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Fins curso"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Config. Avançada"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuração"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Início automático"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desabilit. motores"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu Debug"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Testar Barra Progres"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ir a origem XYZ"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Ir na origem X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Ir na origem Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Ir na origem Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto alinhar Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Indo para origem"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Clique para Iniciar"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Próximo Ponto"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Fim nivelação!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Suavizar altura"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Compensar origem"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Alteração aplicada"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Ajustar Origem"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Extrusora ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Extrusora ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Pre-aq.Todo ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq.Mesa ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ajustar ") PREHEAT_1_LABEL; - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Pre-aquecer $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Pre-aquecer $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Extrusora $"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Extrusora $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Pre-aq.Todo $"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Pre-aq.Mesa $"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Ajustar $"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Customizar Pre-aq."); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Esfriar"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Ligar"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Desligar"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrusar"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Retrair"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover eixo"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelação Mesa"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar Mesa"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Nivelar Cantos"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Próximo Canto"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor de Malha"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editar Malha"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Fim da Edição"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Sondando ponto"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Índice X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Índice Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comando customizado"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Teste de sonda"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Ponto"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Estacionar"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicação"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Cópia espelhada"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Controle Total"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2o bico X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2o bico Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2o bico Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Executando G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Ferramentas UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Nivel. Mesa Unif."); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Fazer malha manual"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Calçar e calibrar"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Medir"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Remover e calibrar"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Movendo para Próximo"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Ativar UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Desativar UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Mesa"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Mesa"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Extrusora"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Extrusora"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Editar Malha"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Editar Malha Custom"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ajuste Fino da Malha"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Fim da Edição"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Montar Malha Custom"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Montar "); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Montar $"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Checar $"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Montar Malha fria"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajustar Altura"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Quant. de Altura"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validar Malha"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validar Malha Custom"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Aquecendo Mesa"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Aquecendo Ext."); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Cancelado"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("G26 Saindo"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continuar Malha"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Nivelação da Malha"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelação 3 pontos"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Nivelação Grid"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Nivelar Malha"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Cantos"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo de Mapa"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Salvar Mapa da Malha"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Enviar Para Host"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Salvar Malha CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Salvar Backup"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Informação do UBL"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Qtd de Enchimento"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Enchimento Manual"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Enchimento Smart"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Preencher malha"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar tudo"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar próximo"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ajuste Fino de Todos"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ajustar Mais Próximo"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Armazenamento Malha"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot de Memória"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ler Malha"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Salvar Malha"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Malha %i carregada"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Malha %i salva"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Sem armazenamento"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Erro ao salvar UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Erro no restauro UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Compensação Z: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Compensação Z parou"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL passo a passo"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Montar Malha fria"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Enchimento Smart"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Validar Malha"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ajuste Fino de Todos"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Validar Malha"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ajuste Fino de Todos"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Salvar Malha"); - - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Controle do LED"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Luz"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Configuração da Luz"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Luz Vermelha"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Luz Laranja"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Luz Amarela"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Luz Verde"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Luz Azul"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Luz Indigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Luz Violeta"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Luz Branca"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Luz Padrão"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luz Customizada"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensidade Vermelho"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensidade Verde"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensidade Azul"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensidade Branco"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brilho"); - - PROGMEM Language_Str MSG_MOVING = _UxGT("Movendo..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Liberar XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Mover Extrusor"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Mover Extrusor *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Extrus. mto fria"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Bocal"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Bocal ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Mesa"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. Ventoinha"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. Ventoinha ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("+Vel. Ventoinha"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("+Vel. Ventoinha ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Vazão"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Vazão ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Controle"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Máx"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fator"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temp. Automática"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Ligado"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Desligado"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Selecionar"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Selecionar *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Acel."); - PROGMEM Language_Str MSG_JERK = _UxGT("Arrancada"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("arrancada V") LCD_STR_A; - PROGMEM Language_Str MSG_VB_JERK = _UxGT("arrancada V") LCD_STR_B; - PROGMEM Language_Str MSG_VC_JERK = _UxGT("arrancada V") LCD_STR_C; - PROGMEM Language_Str MSG_VE_JERK = _UxGT("arrancada VE"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Desv. Junção"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocidade"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VDeslocamento min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Aceleração"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Retrair A"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Movimento A"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passo/mm"); - PROGMEM Language_Str MSG_A_STEPS = _UxGT("Passo ") LCD_STR_A _UxGT("/mm"); - PROGMEM Language_Str MSG_B_STEPS = _UxGT("Passo ") LCD_STR_B _UxGT("/mm"); - PROGMEM Language_Str MSG_C_STEPS = _UxGT("Passo ") LCD_STR_C _UxGT("/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Extrusão em mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diâmetro Fil."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diâmetro Fil. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarr. mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carregar mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avanço K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Avanço K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Salvar Configuração"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Ler Configuração"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restauro seguro"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Iniciar EEPROM"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Atualiz. SD"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetar Impressora"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Atualização"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Informações"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Ajustar"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Iniciar Impressão"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Prox."); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Iniciar"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Parar"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimir"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetar"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancelar"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Pronto"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Voltar"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Continuar"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impressão"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Continuar impressão"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Parar impressão"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Imprimindo objeto"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancelar Objeto"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancelar Objeto ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Recuperar Impressão"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprimir do SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Sem cartão SD"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Dormindo..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Clique para retomar"); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impressão Pausada"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Imprimindo..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impressão Abortada"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sem movimento"); - PROGMEM Language_Str MSG_KILLED = _UxGT("PARADA DE EMERGÊNCIA"); - PROGMEM Language_Str MSG_STOPPED = _UxGT("PAROU. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrair mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Retrair Troca mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retrair V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Saltar mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Des-Retrair mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Des-RetTroca mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Des-Retrair V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Des-RetTroca V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retração Automática"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Distancia Retração"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Distancia Purga"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Mudar Ferramenta"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Levantar Z"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Preparar Veloc."); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Veloc. Retração"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Standby bico"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Trocar Filamento"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Trocar Filamento *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Carregar Filamento"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Carregar Filamento *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Descarreg. Filamento"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Descarreg. Filamento *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Descarregar Todos"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Iniciar SD"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Trocar SD"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Liberar SD"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda fora da mesa"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Fator de Cisalho"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Testar BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reiniciar BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Recolher BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Estender BLTouch"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Estender Sonda-Z"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Recolher Sonda-Z"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s Primeiro"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Compensar Sonda"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Compensar Sonda em X"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Compensar Sonda em Y"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Compensar Sonda em Z"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Passinho X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Passinho Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Passinho Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Abortar Fim de Curso"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ESCAPE TÉRMICO"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ESCAPE TÉRMICO MESA"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ESCAPE TÉRMICO CAMARA"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Erro:Temp Máxima"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Erro:Temp Mínima"); - PROGMEM Language_Str MSG_HALTED = _UxGT("IMPRESSORA PAROU"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Favor resetar"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); - PROGMEM Language_Str MSG_HEATING = _UxGT("Aquecendo..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Resfriando..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Aquecendo mesa..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Esfriando mesa..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Aquecendo Câmara..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Esfriando Câmara..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibrar Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Configuração Delta"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto-Calibração"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Calibrar Altura"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Desloc. Sonda Z"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Haste Diagonal"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altura"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Raio"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Sobre"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Impressora"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelamento 3 pontos"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelamento Linear"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelamento Bilinear"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelamento UBL"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelamento da Malha"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estatísticas"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. da Placa"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusoras"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Taxa de Transmissão"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); - - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz da Impressora"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Intensidade Brilho"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora Incorreta"); - - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total de Impressões"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Realizadas"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo de Impressão"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Trabalho Mais longo"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total de Extrusão"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Qtd de Impressões"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Realizadas"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo de Impressão"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Maior trabalho"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("T. Extrusão"); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp Mín"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp Máx"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Força do Motor"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escrever EEPROM DAC"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("TROCA DE FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESSÃO PAUSADA"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARREGAR FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARREG. FILAMENTO"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Config. de Retomada"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar mais"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continuar Impressão"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Bocal: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sensor filamento"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Falha ao ir à origem"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Falha ao sondar"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ESCOLHER FILAMENTO"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Continuar Impressão"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Continuando..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Carregar Filamento"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Carregar Todos"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Carregar para bocal"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Ejetar Filamento"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Ejetar Filamento ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Liberar Filamento"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Carregando Fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejetando Fil. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Carregando Fil...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Todos"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Resetar MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Resetando MMU..."); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Jogos"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Labirinto"); - - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Aperte o botão para", "continuar impressão")); - PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Estacionando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperando o", "inicio da", "troca de filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Coloque filamento", "pressione o botão", "para continuar...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Pressione o botão", "p/ aquecer o bocal")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Aquecendo o bocal", "Aguarde...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Esperando", "remoção de filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Esperando", "filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Espere pela", "purga de filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Clique para finaliz.", "purga de filamento")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperando impressão", "continuar")); - #else // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Clique p. continuar")); - PROGMEM Language_Str MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Estacionando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Aguarde...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insira e Clique")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Clique para Aquecer")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Aquecendo...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejetando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Carregando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Clique p. finalizar")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Continuando...")); - #endif -} diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h deleted file mode 100644 index 7b54f24abf..0000000000 --- a/Marlin/src/lcd/language/language_ro.h +++ /dev/null @@ -1,638 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - - /** - * Romanian - * - * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html - * - * Translation by cristyanul - */ -namespace Language_ro { - using namespace Language_en; // Inherit undefined strings from English - - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Romanian"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Pregatit."); - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("DA"); - PROGMEM Language_Str MSG_NO = _UxGT("NU"); - PROGMEM Language_Str MSG_BACK = _UxGT("Inapoi"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Abandon..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media Introdus"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media Inlaturat"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Astept Media"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Eroare Citire Media"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Dispozitiv USB Inlaturat"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Pornire USB Esuata"); - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Eroare:Subcall Overflow"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Principal"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Setari Avansate"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configurare"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Dezactivare Motoare"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Meniu Debug"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test Bara Progres"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Acasa"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Acasa X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Acasa Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Acasa Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Aliniere-Z"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Acasa XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click pentru a incepe"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Urmatorul Punct"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivelare Terminata!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Inaltime"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Seteaza Offseturile Acasa"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Offseturi Aplicate"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Seteaza Originea"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Preincalzeste ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Preincalzeste ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Tot"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Patul"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Conf"); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Preincalzeste $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Preincalzeste $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Preincalzeste $ Capatul"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Preincalzeste $ Capatul ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Preincalzeste $ Tot"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Preincalzeste $ Patul"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Preincalzeste $ Conf"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Preincalzeste Personalizat"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Racire"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecventa"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Laser"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Oprit"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser Pornit"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Puterea Laserului"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Controlul Spindle"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Oprit"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle Pornit"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Puterea Spindle"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Invers"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Porneste"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Opreste"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudeaza"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Retracteaza"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Muta Axa"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelarea Patului"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveleaza Patul"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Niveleaza Colturile"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Urmatorul Colt"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mesh"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editeaza Mesh"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Editarea Meshului Oprita"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punctul de Probare"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valoare Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comenzi Personalizate"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviation"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mode"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Mirrored Copy"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2nd Nozzle X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2nd Nozzle Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2nd Nozzle Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Doing G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Tools"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Tilting Point"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manually Build Mesh"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Place Shim & Measure"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Measure"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Remove & Measure Bed"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Moving to next"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activate UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deactivate UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Bed Temp"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hotend Temp"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Mesh Edit"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit Custom Mesh"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Fine Tuning Mesh"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Done Editing Mesh"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Build Custom Mesh"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Build Mesh"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Build Mesh ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Validate Mesh ($)"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Build Cold Mesh"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Adjust Mesh Height"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Height Amount"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validate Mesh"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validate Custom Mesh"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Heating Bed"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Heating Nozzle"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manual priming..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fixed Length Prime"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Done Priming"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Canceled"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Leaving G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continue Bed Mesh"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Mesh Leveling"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Point Leveling"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Grid Mesh Leveling"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Level Mesh"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Side Points"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Map Type"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Output Mesh Map"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Output for Host"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Output for CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Off Imprimanta Backup"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Output UBL Info"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Fill-in Amount"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manual Fill-in"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Smart Fill-in"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Fill-in Mesh"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidate All"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidate Closest"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Fine Tune All"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Fine Tune Closest"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Storage"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memory Slot"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Load Bed Mesh"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Save Bed Mesh"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Mesh %i Loaded"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Mesh %i Saved"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("No Storage"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: UBL Save"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: UBL Restore"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Stopped"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Step-By-Step UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Build Cold Mesh"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Smart Fill-in"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validate Mesh"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Fine Tune All"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validate Mesh"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Fine Tune All"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Save Bed Mesh"); - - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Control"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Lights"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Light Presets"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Red"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Yellow"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Green"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blue"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violet"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("White"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Default"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Custom Lights"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Red Intensity"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Green Intensity"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Blue Intensity"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("White Intensity"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brightness"); - - PROGMEM Language_Str MSG_MOVING = _UxGT("Moving..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Free XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Move X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Move Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Move Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Capat Prea Rece"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Move %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Move 0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Move 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Move 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Speed"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Nozzle ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Nozzle Parked"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Nozzle Standby"); - PROGMEM Language_Str MSG_BED = _UxGT("Bed"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Enclosure"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Speed"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan Speed ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Stored Fan ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra Fan Speed"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra Fan Speed ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Controller Fan"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Idle Speed"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto Mode"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Active Speed"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Idle Period"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Flow"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flow ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("On"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Off"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autotune"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune failed. Bad extruder."); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed. Temperature too high."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout."); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Select"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Select *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Accel"); - PROGMEM Language_Str MSG_JERK = _UxGT("Jerk"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Jerk"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Jerk"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocity"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VTrav Min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Acceleration"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-Retract"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-Travel"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frequency max"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Feed min"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Steps/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("steps/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("steps/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("steps/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Esteps/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*steps/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Motion"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Unload mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Load mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advance K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Contrast"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Store Settings"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Load Settings"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restore Defaults"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initialize EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Error"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Error"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Error"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Settings Stored"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Media Update"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reset Imprimanta"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info Screen"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepare"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Tune"); - PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Power monitor"); - PROGMEM Language_Str MSG_CURRENT = _UxGT("Intensitate"); - PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Voltaj"); - PROGMEM Language_Str MSG_POWER = _UxGT("Putere"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Start Imprimare"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Urmatorul"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Initiere"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimeaza"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reseteaza"); - PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignora"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Anuleaza"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("OK"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Inapoi"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Proceed"); - PROGMEM Language_Str MSG_PAUSING = _UxGT("Pausing..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause Print"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Resume Print"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop Print"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Printing Object"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancel Object"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancel Object ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Outage Recovery"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print from Media"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No Media"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Sleep..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Click to Resume..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Print Paused"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Printing..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print Aborted"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Print Done"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("No Move."); - PROGMEM Language_Str MSG_KILLED = _UxGT("KILLED. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPED. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retract mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Swap Length"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Swap Extra"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purge Length"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Tool Inlocuire"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Raise"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prime Speed"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Retract Speed"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Park Head"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Fan Speed"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Fan Time"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto Pornit"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto Oprit"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Tool Migration"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migrare"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Last Extruder"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrate to *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Inlocuire Filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Inlocuire Filament *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Incarcare Filament"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Incarcare Filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Scoatere Filament"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Scoatere Filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Scoate Tot"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Atasare Media"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Inlocuire Media"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Eliberare Media"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Probe Past Bed"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Skew Factor"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Stow"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Deploy"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mode"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("DANGER: Bad settings can cause damage! Proceed anyway?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Save"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Deploy TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Deploy Z-Probe"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Stow Z-Probe"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s First"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Probe Offsets"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Probe X Offset"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Probe Y Offset"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Probe Z Offset"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP"); - PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Please Reset"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Heating..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Cooling..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bed Heating..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Bed Cooling..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chamber Heating..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chamber Cooling..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibration"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrate X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrate Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrate Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrate Center"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Settings"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibration"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Set Delta Height"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Probe Z-offset"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Inaltime"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radius"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Despre Imprimanta"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info Imprimanta"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelare in 3 puncte"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelare Lineara"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelare Bilineara"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelarea Patului Unificata"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelare Mesh"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Status Imprimanta"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Informatii Placa"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistoare"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudere"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocol"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: OFF"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: ON"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout"); - - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Case Light"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Light Brightness"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("INCORRECT PRINTER"); - -#if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total Printuri"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completat"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Timp Imprimare Total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extrudat"); -#else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Prints"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Longest"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded"); -#endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temperatura Minima"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temperatura Maxima"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Drive Strength"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driver %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driver %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CONNECTION ERROR"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Write"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT CHANGE"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PRINT PAUSED"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("LOAD FILAMENT"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("UNLOAD FILAMENT"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("RESUME OPTIONS:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purge more"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continue"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout Sensor"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout Dist mm"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Homing Failed"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing Failed"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOOSE FILAMENT"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Update MMU Firmware!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Needs Attention."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("MMU Resume"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("MMU Resuming..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU Load"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("MMU Load All"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Load to Nozzle"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Eject"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Eject ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Unload"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Loading Fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejecting Fil. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Unloading Fil...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("All"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reset MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Resetting..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Remove, click"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Component ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Mixer"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Full Gradient"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Toggle Mix"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cycle Mix"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Reverse Gradient"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Active V-tool"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Start V-tool"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" End V-tool"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reset V-tools"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit V-tool Mix"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools Were Reset"); - PROGMEM Language_Str MSG_START_Z = _UxGT("Start Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" End Z:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Jocuri"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); - - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Bad page index"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Bad page speed"); - - // - // Filament Inlocuire screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // -#if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Apasa Butonul", "pentru a reveni la print")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcare...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Astept ca", "inlocuirea filamentului", "sa inceapa")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insert filament", "and press button", "to continue")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Press button", "to heat nozzle")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle heating", "Please wait...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wait for", "filament unload")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wait for", "filament load")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Wait for", "filament purge")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Click to finish", "filament purge")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wait for print", "to resume...")); -#else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Click to continue")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcare...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Va rog asteptati...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insert and Click")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Click pentru incalzire")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Incalzire...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejectare...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Incarcare...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Curatare...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click pentru a termina")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Se Reia...")); -#endif - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver Current"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" in:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Backlash"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Corectare"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Nivelare Axa X"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrare"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Timeout Incalzitor"); - PROGMEM Language_Str MSG_REHEAT = _UxGT("Reincalzire"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Reincalzire..."); -} - -#if FAN_COUNT == 1 - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED -#else - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N -#endif diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 2a2f568573..1f419607bd 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,759 +16,386 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Russian * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_RU_H +#define LANGUAGE_RU_H + #define DISPLAY_CHARSET_ISO10646_5 +#define CHARSIZE 2 -namespace Language_ru { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" готов.") +#define MSG_BACK _UxGT("Назад") +#define MSG_SD_INSERTED _UxGT("Карта вставлена") +#define MSG_SD_REMOVED _UxGT("Карта извлечена") +#define MSG_LCD_ENDSTOPS _UxGT("Эндстопы") // Max length 8 characters +#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Прогр. эндстопы") +#define MSG_MAIN _UxGT("Меню") +#define MSG_AUTOSTART _UxGT("Автостарт") +#define MSG_DISABLE_STEPPERS _UxGT("Выкл. двигатели") +#define MSG_DEBUG_MENU _UxGT("Меню отладки") +#define MSG_PROGRESS_BAR_TEST _UxGT("Тест индикатора") +#define MSG_AUTO_HOME _UxGT("Авто парковка") +#define MSG_AUTO_HOME_X _UxGT("Парковка X") +#define MSG_AUTO_HOME_Y _UxGT("Парковка Y") +#define MSG_AUTO_HOME_Z _UxGT("Парковка Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Калибровать Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Нулевое положение") +#define MSG_LEVEL_BED_WAITING _UxGT("Нажмите чтобы начать") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Следующая точка") +#define MSG_LEVEL_BED_DONE _UxGT("Выравнивание готово!") +#define MSG_Z_FADE_HEIGHT _UxGT("Высота спада") +#define MSG_SET_HOME_OFFSETS _UxGT("Запомнить парковку") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Коррекции применены") +#define MSG_SET_ORIGIN _UxGT("Запомнить ноль") +#define MSG_PREHEAT_1 _UxGT("Преднагрев PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" всё") +#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" сопло") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" стол") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" настр.") +#define MSG_PREHEAT_2 _UxGT("Преднагрев ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" всё") +#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" сопло") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" стол") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" настр.") +#define MSG_COOLDOWN _UxGT("Охлаждение") +#define MSG_SWITCH_PS_ON _UxGT("Включить питание") +#define MSG_SWITCH_PS_OFF _UxGT("Выключить питание") +#define MSG_EXTRUDE _UxGT("Экструзия") +#define MSG_RETRACT _UxGT("Втягивание") +#define MSG_MOVE_AXIS _UxGT("Движение по осям") +#define MSG_BED_LEVELING _UxGT("Калибровка стола") +#define MSG_LEVEL_BED _UxGT("Калибровать стол") +#define MSG_LEVEL_CORNERS _UxGT("Выровнять углы") +#define MSG_NEXT_CORNER _UxGT("Следующий угол") +#define MSG_EDITING_STOPPED _UxGT("Ред. сетки завершено") +#define MSG_USER_MENU _UxGT("Свои комманды") +#define MSG_UBL_DOING_G29 _UxGT("Выполняем G29") +#define MSG_UBL_UNHOMED _UxGT("Паркуем сначала XYZ") +#define MSG_UBL_TOOLS _UxGT("Утилиты UBL") +#define MSG_UBL_LEVEL_BED _UxGT("Калибровка UBL") +#define MSG_UBL_MANUAL_MESH _UxGT("Постр. сетку от руки") +#define MSG_UBL_BC_INSERT _UxGT("Пост. шимм и измер.") +#define MSG_UBL_BC_INSERT2 _UxGT("Измерение") +#define MSG_UBL_BC_REMOVE _UxGT("Удал. и измер. стол") +#define MSG_UBL_MOVING_TO_NEXT _UxGT("Двигаемся дальше") +#define MSG_UBL_ACTIVATE_MESH _UxGT("Активировать UBL") +#define MSG_UBL_DEACTIVATE_MESH _UxGT("Деактивировать UBL") +#define MSG_UBL_SET_BED_TEMP _UxGT("Температура стола") +#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Температура сопла") +#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP +#define MSG_UBL_MESH_EDIT _UxGT("Редактор сеток") +#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Редакт. свою сетку") +#define MSG_UBL_FINE_TUNE_MESH _UxGT("Точная настр. сетки") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Ред. сетки завершено") +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Построить свою сетку") +#define MSG_UBL_BUILD_MESH_MENU _UxGT("Построить сетку") +#define MSG_UBL_BUILD_PLA_MESH _UxGT("Построить сетку PLA") +#define MSG_UBL_BUILD_ABS_MESH _UxGT("Построить сетку ABS") +#define MSG_UBL_BUILD_COLD_MESH _UxGT("Построить хол. сетку") +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Устан. высоту сетки") +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Высота") +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Проверить сетку") +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Проверить сетку PLA") +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Проверить сетку ABS") +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Проверить свою сетку") +#define MSG_UBL_CONTINUE_MESH _UxGT("Продолжить сетку") +#define MSG_UBL_MESH_LEVELING _UxGT("Калибровка сетки") +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("Калибровка 3-х точек") +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Калибровка растера") +#define MSG_UBL_MESH_LEVEL _UxGT("Выровнить сетку") +#define MSG_UBL_SIDE_POINTS _UxGT("Крайние точки") +#define MSG_UBL_MAP_TYPE _UxGT("Тип карты") +#define MSG_UBL_OUTPUT_MAP _UxGT("Вывести карту сетки") +#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Вывести на хост") +#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Вывести в CSV") +#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Забекапить сетку") +#define MSG_UBL_INFO_UBL _UxGT("Вывод информации UBL") +#define MSG_UBL_EDIT_MESH_MENU _UxGT("Редактировать сетку") +#define MSG_UBL_FILLIN_AMOUNT _UxGT("Кол-во заполнителя") +#define MSG_UBL_MANUAL_FILLIN _UxGT("Ручное заполнение") +#define MSG_UBL_SMART_FILLIN _UxGT("Умное заполнение") +#define MSG_UBL_FILLIN_MESH _UxGT("Заполнить сетку") +#define MSG_UBL_INVALIDATE_ALL _UxGT("Аннулировать всё") +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Аннулир. ближ. точку") +#define MSG_UBL_FINE_TUNE_ALL _UxGT("Точная настр. всего") +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Настр. ближ. точки") +#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Хранилище сетей") +#define MSG_UBL_STORAGE_SLOT _UxGT("Слот памяти") +#define MSG_UBL_LOAD_MESH _UxGT("Загрузить сетку стола") +#define MSG_UBL_SAVE_MESH _UxGT("Сохранить сетку стола") +#define MSG_MESH_LOADED _UxGT("Сетка %i загружена") +#define MSG_MESH_SAVED _UxGT("Сетка %i сохранена") +#define MSG_NO_STORAGE _UxGT("Нет хранилища") +#define MSG_UBL_SAVE_ERROR _UxGT("Ошибка: Сохран. UBL") +#define MSG_UBL_RESTORE_ERROR _UxGT("Ошибка: Восстан. UBL") +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Смещение Z останов.") +#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Пошаговое UBL") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Russian"); +#define MSG_LED_CONTROL _UxGT("Настройки LED") +#define MSG_LEDS _UxGT("Подсветку") +#define MSG_LED_PRESETS _UxGT("Предустановки света") +#define MSG_SET_LEDS_RED _UxGT("Красный свет") +#define MSG_SET_LEDS_ORANGE _UxGT("Оранжевый свет") +#define MSG_SET_LEDS_YELLOW _UxGT("Жёлтый свет") +#define MSG_SET_LEDS_GREEN _UxGT("Зелёный свет") +#define MSG_SET_LEDS_BLUE _UxGT("Синий свет") +#define MSG_SET_LEDS_INDIGO _UxGT("Индиго свет") +#define MSG_SET_LEDS_VIOLET _UxGT("Фиолетовый свет") +#define MSG_SET_LEDS_WHITE _UxGT("Белый свет") +#define MSG_SET_LEDS_DEFAULT _UxGT("Свет по умолчанию") +#define MSG_CUSTOM_LEDS _UxGT("Свои настр. света") +#define MSG_INTENSITY_R _UxGT("Интенсивн. красного") +#define MSG_INTENSITY_G _UxGT("Интенсивн. зелёного") +#define MSG_INTENSITY_B _UxGT("Интенсивн. синего") +#define MSG_INTENSITY_W _UxGT("Интенсивн. белого") +#define MSG_LED_BRIGHTNESS _UxGT("Яркость") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Готов."); - PROGMEM Language_Str MSG_YES = _UxGT("Да"); - PROGMEM Language_Str MSG_NO = _UxGT("Нет"); - PROGMEM Language_Str MSG_BACK = _UxGT("Назад"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Прерывание..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD-карта вставлена"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD-карта извлечена"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Вставьте SD-карту"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Ошибка считывания"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB диск удалён"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Ошибка USB диска"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переполнение вызова"); - #else - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переполн. вызова"); - #endif - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр. эндстопы"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Эндстопы"); // Max length 8 characters - PROGMEM Language_Str MSG_MAIN = _UxGT("Основное меню"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Другие настройки"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Конфигурация"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Автостарт"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Выключить двигатели"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Меню отладки"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Тест индикатора"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Парковка XYZ"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Парковка X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Парковка Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Парковка Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Авто Z-выравнивание"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Нулевое положение"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Нажмите чтобы начать"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Следующая точка"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Выравнивание готово!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Высота спада"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Установ. смещения дома"); - #else - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Установ.смещ.дома"); - #endif - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Смещения применены"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Установить ноль"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Нагрев ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" сопло"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" сопло ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" всё"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" стол"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" правка"); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Преднагрев $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Нагрев $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Нагрев $ сопло"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Нагрев $ сопло ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Нагрев $ всё"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Нагрев $ стол"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Нагрев $ правка"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Нагрев Свой"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Охлаждение"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Частота"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Управление лазером"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Выключить лазер"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Включить лазер"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Мощность лазера"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Управление шпинделем"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Выключить шпиндель"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Включить шпиндель"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Мощность шпинделя"); - #else - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Мощн.шпинделя"); - #endif - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Инверсия шпинделя"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Включить питание"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Выключить питание"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Экструзия"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Втягивание"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Движение по осям"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Выравнивание стола"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Выровнять стол"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Выровнять углы"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Следующий угол"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Смещение по Z"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Правка сетки окончена"); - #else - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Смещение Z"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Правка окончена"); - #endif - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Редактировать сетку"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Точка сетки"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Индекс X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Индекс Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Значение Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Свои команды"); - - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 тест Z-зонда"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Отклонение"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 точка"); - - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Меню IDEX"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Авто парковка"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Размножение"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Зеркальная копия"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Полный контроль"); - - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Размещение сопел"); - - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2-е сопло X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2-е сопло Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2-е сопло Z"); - - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Выполняем G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Инструменты UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Настройка UBL"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Точка разворота"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ручной ввод сетки"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Разместить шайбу и измерить"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Убрать и замерить стол"); - #else - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Разм.шайбу,измерить"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Убрать, измер. стол"); - #endif - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Измерение"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Двигаемся дальше"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Активировать UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивировать UBL"); - - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Редактор сеток"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Править свою сетку"); - - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Температура стола"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура стола"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Температура сопла"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Температура сопла"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Построить свою сетку"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Правка сетки завершена"); - #else - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = LCD_STR_THERMOMETER _UxGT(" стола, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" стола, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Построить свою"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Правка завершена"); - #endif - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точная правка сетки"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Построить сетку"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Построить сетку $"); - #endif - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Построить холодную сетку"); - #else - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Строить холод.сетку"); - #endif - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Правка высоты сетки"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Высота"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Проверить сетку"); - #if LCD_WIDTH > 21 - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Проверить сетку $"); - #endif - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Проверить свою сетку"); - #else - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Провер. сетку $"); - #endif - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Провер. свою сетку"); - #endif - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрев стола"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрев сопла"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ручная грунтовка"); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Грунт фикс. длины"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Грунтовка сделана"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 завершена"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Выйти из G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Продолжить сетку"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Выравнивание сетки"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-х точечное выравнивание"); - #else - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-точечное выравн."); - #endif - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Калибровка растера"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Выровнять сетку"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Крайние точки"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Тип карты"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Вывести карту сетки"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Вывести на хост"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Вывести в CSV"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Сохранить сетку снаружи"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Вывод информации UBL"); - #else - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Сохранить снаружи"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Информация UBL"); - #endif - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Кол-во заполнителя"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ручное заполнение"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Умное заполнение"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Заполнить сетку"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Аннулировать всё"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Аннулир. ближайшую"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно править всё"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Настр. ближ. точку"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Хранилище сеток"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Слот памяти"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Загрузить сетку"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Сохранить сетку"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Сетка %i загружена"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Сетка %i сохранена"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Нет хранилища"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Ошибка: Сохран. UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Ошибка: Восстан.UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Смещение Z останов."); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL пошагово"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Строить холодную"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Умное заполнение"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Проверить сетку"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Точно настр. всё"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Проверить сетку"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Точно настр. всё"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Сохранить сетку"); - - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Настройка подсветки"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Подсветка"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Предустановки света"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Красный"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Оранжевый"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Жёлтый"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Зелёный"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Синий"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Индиго"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Фиолетовый"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Белый"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Свет по умолчанию"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Свой цвет подсветки"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Уровень красного"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Уровень зелёного"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Уровень синего"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Уровень белого"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Яркость"); - - PROGMEM Language_Str MSG_MOVING = _UxGT("Движемся..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Освободить XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Движение по X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Движение по Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Движение по Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Экструдер"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Экструдер *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Сопло не нагрето"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Движение %sмм"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Движение 0.1мм"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Движение 1мм"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Движение 10мм"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Скорость"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Z стола"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Сопло ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Сопло запарковано"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Сопло ожидает"); - PROGMEM Language_Str MSG_BED = _UxGT("Стол, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Камера,") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Кулер"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Кулер ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Сохранённый кулер ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Дополн. кулер"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Дополн. кулер ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Контроллер кулера"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Холостые обороты"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Автовключение"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Рабочие обороты"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Период простоя"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Поток"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Поток ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Настройки"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С мин"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С макс"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Автотемпер."); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Вкл"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Выкл"); - - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("Автоподбор PID"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("Автоподбор PID *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Подбор PID выполнен"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Сбой автоподбора. Плохой экструдер."); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Сбой автоподбора. Температура повышена."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Сбой автоподбора! Завершение времени."); - - PROGMEM Language_Str MSG_SELECT = _UxGT("Выбор"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Выбор *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Ускорение"); - PROGMEM Language_Str MSG_JERK = _UxGT("Рывок"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-рывок"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-рывок"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-рывок"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-рывок"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Отклонение узла"); - #else - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Отклон. узла"); - #endif - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Скорость, мм/с"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Скор.макс ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Скор.макс ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Скор.макс ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Скор.макс ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Скор.макс *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Скор.мин"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Перемещение мин"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Ускорение, мм/с2"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Ускор.макс ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Ускор.макс ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Ускор.макс ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Ускор.макс ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Ускор.макс *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Ускор.втягив."); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Ускор.путеш."); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Частота макс."); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Подача мин."); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Шагов/мм"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" шаг/мм"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" шаг/мм"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" шаг/мм"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E шаг/мм"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* шаг/мм"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Движение"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Филамент"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E огран.,мм³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E огран. *"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диам. филамента"); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Диам. филамента *"); - #else - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Диам. филам."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Диам. филам. *"); - #endif - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Загрузка, мм"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Выгрузка, мм"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Kоэф. продвиж."); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Kоэф. продвиж. *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Контраст экрана"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Сохранить настройки"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Загрузить настройки"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("На базовые параметры"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Инициализация EEPROM"); - #else - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Инициализ. EEPROM"); - #endif - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Сбой EEPROM: CRC"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Сбой EEPROM: индекс"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Сбой EEPROM: версия"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Параметры сохранены"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Обновление прошивки"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Сброс принтера"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Обновить"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Главный экран"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Подготовить"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Настроить"); - PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Монитор питания"); - PROGMEM Language_Str MSG_CURRENT = _UxGT("Ток"); - PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Напряжение"); - PROGMEM Language_Str MSG_POWER = _UxGT("Мощность"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Начало печати"); - - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Дальше"); //short text for buttons - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Иниц-я"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Стоп"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Печать"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Сброс"); - PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Игнорир."); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Отмена"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Готово"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Назад"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Продолжить"); - - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Пауза печати"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Продолжить печать"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Остановить печать"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Печать объекта"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Завершить объект"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Завершить объект ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Восстановение сбоя"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Печать с SD карты"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Нет SD карты"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Сон..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Продолжить..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Печать на паузе"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Печать..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Печать отменена"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Печать завершена"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Нет движения."); - PROGMEM Language_Str MSG_KILLED = _UxGT("УБИТО. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ОСТАНОВЛЕНО. "); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Втягивание, мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Смена втягив., мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Возврат смены, мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Возврат смены, V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Автовтягивание"); - #else - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Втягив., мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Смена втяг.,мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Возвр.смены,мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Возвр.смены V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Автовтягив."); - #endif - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Подскок, мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Втягивание V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Возврат, мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Возврат V"); - - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Поменять длины"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Поменять дополнительно"); - #else - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Поменять дополнит."); - #endif - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Очистить длину"); - - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Смена сопел"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Поднятие по Z"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Начальная скор."); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Скорость втягив."); - #else - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Началь.скор."); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Скор.втягив."); - #endif - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Парковать голову"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Вернуть скорость"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Обороти кулера"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Время кулера"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Авто Вкл."); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Авто Выкл."); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Замена инструмента"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Авто замена"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Последний экструдер"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Замена на *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Смена филамента"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Смена филамента *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Загрузить филамент"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Загрузить филамент *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Выгрузить филамент *"); - #else - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Подать филамент *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Убрать филамент *"); - #endif - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Выгрузить всё"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Установить SD карту"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Сменить SD карту"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Освободить SD карту"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-зонд вне стола"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Фактор наклона"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("Z-зонд BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Тестирование BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Сброс BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Поднять BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Опустить BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Режим SW"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Режим 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Режим OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Режим сохранения"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Установить на 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Установить на OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Слив отчёта"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("ОПАСНОСТЬ: Неправильные параметры приводят к повреждениям! Продолжить?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("Z-Зонд TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Инициализация"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Тест Z-смещения"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Сохранить"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Установить TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Установить зонд"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Загрузить зонд"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Сначала паркуй %s%s%s"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Смещения Z-зонда"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Смещение X"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Смещение Y"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Смещение Z"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Микрошаг X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Микрошаг Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Микрошаг Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Сработал концевик"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Разогрев не удался"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Ошибка:Избыточная Т"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("УТЕЧКА ТЕПЛА"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("УТЕЧКА ТЕПЛА СТОЛА"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("УТЕЧКА ТЕПЛА КАМЕРЫ"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Ошибка: Т макс."); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Ошибка: Т мин."); - PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИНТЕР ОСТАНОВЛЕН"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Сделайте сброс"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("д"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("ч"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("м"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Нагрев..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Охлаждение..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Нагрев стола..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Нагрев камеры..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охлаждение стола..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охладжение камеры..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калибровка Delta"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калибровать X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калибровать Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Калибровать Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калибровать центр"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Настройки Delta"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Авто калибровка"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Высота Delta"); - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондировать Z-смещение"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стержень диагонали"); - #else - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондир. Z-смещения"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стержень диаг."); - #endif - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Высота"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Радиус"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("О принтере"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Данные принтера"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точечное выравнивание"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Линейное выравнивание"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Билинейное выравнивание"); - #else - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точ. выравнив."); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Линейное выравн."); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Билин. выравнив."); - #endif - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Управление UBL"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Выравнивание сетки"); - - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Статистика принтера"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Данные платы"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Термисторы"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Экструдеры"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Скорость,БОД"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Протокол"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контроль утечки Т: Выкл"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Контроль утечки Т: Вкл"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Время простоя хотенда"); - #else - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контр.утечки Т:Выкл"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Контр.утечки Т:Вкл"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Время прост.хот-а"); - #endif - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Подсветка корпуса"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Яркость подсветки"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Неверный принтер"); - - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Счётчик печати"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Общее время печати"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Наидольшее задание"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Длина филамента"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Отпечатков"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Всего"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Наидольшее"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Выдавлено"); - #endif - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено"); - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Мин. ") LCD_STR_THERMOMETER; - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Макс. ") LCD_STR_THERMOMETER; - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("БП"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Сила привода"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Привод, %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Привод, %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Привод, %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Привод, %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("СБОЙ СВЯЗИ С TMC"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Запись DAC в EEPROM"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("ЗАМЕНА ФИЛАМЕНТА"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("ПЕЧАТЬ НА ПАУЗЕ"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ЗАГРУЗКА ФИЛАМЕНТА"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("ВЫГРУЗКА ФИЛАМЕНТА"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ОПЦИИ ПРОДОЛЖЕНИЯ:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Выдавить ещё"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Возобновить печать"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Сопла: "); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Датчик оконч. филамента"); - #else - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Датчик оконч.филам."); - #endif - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("До конца, мм"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Ошибка парковки"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Ошибка зондирования"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ВЫБИРЕТЕ ФИЛАМЕНТ"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("Настройки MMU"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Обновить прошивку MMU!"); - #else - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Обнови прошивку MMU"); - #endif - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU требует внимания"); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Продолжить печать"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Продолжение..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Загрузить филамент"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Загрузить всё"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Загрузить в сопло"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Извлечь филамент"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Извлечь филамент ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Выгрузить филамент"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Загрузка %i..."); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Извлечение филамента..."); - #else - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Извлеч.филамента..."); - #endif - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Выгрузка...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Всё"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Филамент ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Перезапуск MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Перезапуск MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Удалите и нажмите"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_MIX = _UxGT("Смешивание"); - #else - PROGMEM Language_Str MSG_MIX = _UxGT("Смешив."); - #endif - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Компонент ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Смеситель"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Градиент"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Полний градиент"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Цикличное смешивание"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Градиент смешивания"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Сменить градиент"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Переключить смешивание"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Активация В-инструм."); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Начало В-инструмента"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Конец В-инструмента"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Псевдоним В-инструмента"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Сброс В-инструментов"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("В-инструменти сброшены"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Смешать В-инструменти"); - #else - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перекл. смешивание"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Актив.В-инструм."); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("В-инструм.нач."); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("В-инструм.кон."); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Псевдоним В-инстр."); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Сброс В-инструм."); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("В-инструм. сброшены"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Смешать В-инструм."); - #endif - PROGMEM Language_Str MSG_START_Z = _UxGT("Начало Z"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" Конец Z"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Игры"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Кирпичи"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Вторжение"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Змейка"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Лабиринт"); - - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Плохой индекс страницы"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Полохая скорость страницы"); - #else - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Полохая страница"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Полохая скор.стран."); - #endif - - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Парковка...")); - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Нажмите кнопку", "для продолжения", "печати")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Ожидайте начала", "смены филамента")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Вставьте филамент", "и нажмите кнопку", "для продолжения")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_3_LINE("Нажмите кнопку", "для нагрева", "сопла...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Нагрев сопла", "Ждите...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Ожидайте", "выгрузки", "филамента")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Ожидайте", "загрузки", "филамента")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Ожидайте", "экструзии", "филамента")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Нажмите кнопку", "для завершения", "очистки филамента")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Ожидайте", "возобновления", "печати")); - #else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Продолжить печать")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Ожидайте...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Вставь и нажми")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Нагреть сопло")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Нагрев...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Выгрузка...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Загрузка...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Выдавливание...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Завершить очистку")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Возобновление...")); - #endif - - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Драйвера TMC"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Текущие настройки"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Гибридный режим"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Режим без эндстопов"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Режим шага"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл"); - - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Сброс"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" в:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Люфт"); - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Исправление"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Сглаживание"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Уровень оси X"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Авто калибровка"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Время нагревателя вышло"); - #else - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Время нагрев. вышло"); - #endif - PROGMEM Language_Str MSG_REHEAT = _UxGT("Возобновить нагрев"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Нагрев..."); -} - -#if FAN_COUNT == 1 - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#define MSG_MOVING _UxGT("Движемся...") +#define MSG_FREE_XY _UxGT("Освобождаем XY") +#define MSG_MOVE_X _UxGT("Движение по X") +#define MSG_MOVE_Y _UxGT("Движение по Y") +#define MSG_MOVE_Z _UxGT("Движение по Z") +#define MSG_MOVE_E _UxGT("Экструдер") +#define MSG_MOVE_01MM _UxGT("Движение 0.1мм") +#define MSG_MOVE_1MM _UxGT("Движение 1мм") +#define MSG_MOVE_10MM _UxGT("Движение 10мм") +#define MSG_SPEED _UxGT("Скорость") +#define MSG_BED_Z _UxGT("Z стола") +#define MSG_NOZZLE _UxGT("Сопло") +#define MSG_BED _UxGT("Стол") +#define MSG_FAN_SPEED _UxGT("Кулер") +#define MSG_EXTRA_FAN_SPEED _UxGT("Кулер доп.") +#define MSG_FLOW _UxGT("Поток") +#define MSG_CONTROL _UxGT("Настройки") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Мин") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Макс") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Фактор") +#define MSG_AUTOTEMP _UxGT("Автотемпература") +#define MSG_ON _UxGT("Вкл.") +#define MSG_OFF _UxGT("Выкл.") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Выбор") +#define MSG_ACC _UxGT("Ускорение") +#define MSG_JERK _UxGT("Рывок") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-рывок") + #define MSG_VB_JERK _UxGT("Vb-рывок") + #define MSG_VC_JERK _UxGT("Vc-рывок") #else - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_VX_JERK _UxGT("Vx-рывок") + #define MSG_VY_JERK _UxGT("Vy-рывок") + #define MSG_VZ_JERK _UxGT("Vz-рывок") #endif +#define MSG_VE_JERK _UxGT("Ve-рывок") +#define MSG_VELOCITY _UxGT("Быстрота") +#define MSG_VMAX _UxGT("Vмакс ") +#define MSG_VMIN _UxGT("Vмин") +#define MSG_VTRAV_MIN _UxGT("Vпутеш. мин") +#define MSG_ACCELERATION _UxGT("Ускорение") +#define MSG_AMAX _UxGT("Aмакс ") +#define MSG_A_RETRACT _UxGT("A-втягивание") +#define MSG_A_TRAVEL _UxGT("A-путеш.") +#define MSG_STEPS_PER_MM _UxGT("Шаг/мм") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Aшаг/мм") + #define MSG_BSTEPS _UxGT("Bшаг/мм") + #define MSG_CSTEPS _UxGT("Cшаг/мм") +#else + #define MSG_ASTEPS _UxGT("Xшаг/мм") + #define MSG_BSTEPS _UxGT("Yшаг/мм") + #define MSG_CSTEPS _UxGT("Zшаг/мм") +#endif +#define MSG_ESTEPS _UxGT("Eшаг/мм") +#define MSG_E1STEPS _UxGT("E1шаг/мм") +#define MSG_E2STEPS _UxGT("E2шаг/мм") +#define MSG_E3STEPS _UxGT("E3шаг/мм") +#define MSG_E4STEPS _UxGT("E4шаг/мм") +#define MSG_E5STEPS _UxGT("E5шаг/мм") +#define MSG_TEMPERATURE _UxGT("Температура") +#define MSG_MOTION _UxGT("Движение") +#define MSG_FILAMENT _UxGT("Филамент") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E в мм3") +#define MSG_FILAMENT_DIAM _UxGT("Диаметр филамента") +#define MSG_FILAMENT_UNLOAD _UxGT("Загрузка мм") +#define MSG_FILAMENT_LOAD _UxGT("Выгрузка мм") +#define MSG_ADVANCE_K _UxGT("K продвижения") +#define MSG_CONTRAST _UxGT("Контраст LCD") +#define MSG_STORE_EEPROM _UxGT("Сохранить настройки") +#define MSG_LOAD_EEPROM _UxGT("Загрузить настройки") +#define MSG_RESTORE_FAILSAFE _UxGT("Восстановить настр.") +#define MSG_INIT_EEPROM _UxGT("Инициализация EEPROM") +#define MSG_REFRESH _UxGT("Обновить") +#define MSG_WATCH _UxGT("Информационный экран") +#define MSG_PREPARE _UxGT("Подготовить") +#define MSG_TUNE _UxGT("Настроить") +#define MSG_PAUSE_PRINT _UxGT("Пауза печати") +#define MSG_RESUME_PRINT _UxGT("Продолжить печать") +#define MSG_STOP_PRINT _UxGT("Остановить печать") +#define MSG_CARD_MENU _UxGT("Печать с SD карты") +#define MSG_NO_CARD _UxGT("Нет SD карты") +#define MSG_DWELL _UxGT("Сон...") +#define MSG_USERWAIT _UxGT("Продолжить...") +#define MSG_PRINT_PAUSED _UxGT("Печать на паузе") +#define MSG_PRINT_ABORTED _UxGT("Печать отменена") +#define MSG_NO_MOVE _UxGT("Нет движения.") +#define MSG_KILLED _UxGT("УБИТО. ") +#define MSG_STOPPED _UxGT("ОСТАНОВЛЕНО. ") +#define MSG_CONTROL_RETRACT _UxGT("Втягивание мм") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Втягивание смены мм") +#define MSG_CONTROL_RETRACTF _UxGT("Втягивание V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Втяг. прыжка мм") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("Возврат мм") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Возврат смены мм") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("Возврат V") +#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("Возврат смены V") +#define MSG_AUTORETRACT _UxGT("Авто Втягивание") +#define MSG_FILAMENTCHANGE _UxGT("Смена филамента") +#define MSG_FILAMENTLOAD _UxGT("Загрузка филамента") +#define MSG_FILAMENTUNLOAD _UxGT("Выгрузка филамента") +#define MSG_FILAMENTUNLOAD_ALL _UxGT("Выгрузить всё") +#define MSG_INIT_SDCARD _UxGT("Иниц. SD карту") +#define MSG_CNG_SDCARD _UxGT("Сменить SD карту") +#define MSG_ZPROBE_OUT _UxGT("Z датчик вне стола") +#define MSG_SKEW_FACTOR _UxGT("Фактор наклона") +#define MSG_BLTOUCH _UxGT("BLTouch") +#define MSG_BLTOUCH_SELFTEST _UxGT("Тестирование BLTouch") +#define MSG_BLTOUCH_RESET _UxGT("Сброс BLTouch") +#define MSG_BLTOUCH_DEPLOY _UxGT("Установка BLTouch") +#define MSG_BLTOUCH_STOW _UxGT("Набивка BLTouch") +#define MSG_HOME _UxGT("Паркуй") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("первый") +#define MSG_ZPROBE_ZOFFSET _UxGT("Смещение Z") +#define MSG_BABYSTEP_X _UxGT("Микрошаг X") +#define MSG_BABYSTEP_Y _UxGT("Микрошаг Y") +#define MSG_BABYSTEP_Z _UxGT("Микрошаг Z") +#define MSG_ENDSTOP_ABORT _UxGT("Сработал концевик") +#define MSG_HEATING_FAILED_LCD _UxGT("Разогрев не удался") +#define MSG_HEATING_FAILED_LCD_BED _UxGT("Разогр. стола не уд.") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Ошибка: Избыточная Т") +#define MSG_THERMAL_RUNAWAY _UxGT("УБЕГАНИЕ ТЕПЛА") +#define MSG_THERMAL_RUNAWAY_BED _UxGT("УБЕГАНИЕ ТЕПЛА СТОЛА") +#define MSG_ERR_MAXTEMP _UxGT("Ошибка: Т макс.") +#define MSG_ERR_MINTEMP _UxGT("Ошибка: Т мин.") +#define MSG_ERR_MAXTEMP_BED _UxGT("Ошибка: Т стола макс") +#define MSG_ERR_MINTEMP_BED _UxGT("Ошибка: Т стола мин.") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("ПРИНТЕР ОСТАНОВЛЕН") +#define MSG_PLEASE_RESET _UxGT("Сделайте сброс") +#define MSG_SHORT_DAY _UxGT("д") // One character only +#define MSG_SHORT_HOUR _UxGT("ч") // One character only +#define MSG_SHORT_MINUTE _UxGT("м") // One character only +#define MSG_HEATING _UxGT("Нагрев...") +#define MSG_COOLING _UxGT("Охлаждение...") +#define MSG_COOLING_COMPLETE _UxGT("Охлаждение выполнено") +#define MSG_BED_HEATING _UxGT("Нагрев стола...") +#define MSG_BED_COOLING _UxGT("Охлаждение стола...") +#define MSG_DELTA_CALIBRATE _UxGT("Калибровка Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Калибровать X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Калибровать Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Калибровать Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Калибровать центр") +#define MSG_DELTA_SETTINGS _UxGT("Настройки Delta") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Авто калибровка") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Задать высоту Delta") +#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Задать Z-смещение") +#define MSG_DELTA_DIAG_ROD _UxGT("Диаг. стержень") +#define MSG_DELTA_HEIGHT _UxGT("Высота") +#define MSG_DELTA_RADIUS _UxGT("Радиус") +#define MSG_INFO_MENU _UxGT("О принтере") +#define MSG_INFO_PRINTER_MENU _UxGT("Инф. о принтере") +#define MSG_3POINT_LEVELING _UxGT("Калибровка 3-х точек") +#define MSG_LINEAR_LEVELING _UxGT("Линейная калибровка") +#define MSG_BILINEAR_LEVELING _UxGT("Билинейная калибр.") +#define MSG_UBL_LEVELING _UxGT("Калибровка UBL") +#define MSG_MESH_LEVELING _UxGT("Калибровка сетки") +#define MSG_INFO_STATS_MENU _UxGT("Статистика принтера") +#define MSG_INFO_BOARD_MENU _UxGT("Информация о плате") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Термисторы") +#define MSG_INFO_EXTRUDERS _UxGT("Экструдеры") +#define MSG_INFO_BAUDRATE _UxGT("Бод") +#define MSG_INFO_PROTOCOL _UxGT("Протокол") +#define MSG_CASE_LIGHT _UxGT("Подсветка корпуса") +#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Яркость подсветки") +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Счётчик печати") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Закончено") + #define MSG_INFO_PRINT_TIME _UxGT("Общее время печати") + #define MSG_INFO_PRINT_LONGEST _UxGT("Наидольшее задание") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Длинна филамента") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Отпечатков") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Закончено") + #define MSG_INFO_PRINT_TIME _UxGT("Всего") + #define MSG_INFO_PRINT_LONGEST _UxGT("Наидольшее") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Выдавлено") +#endif +#define MSG_INFO_MIN_TEMP _UxGT("Мин. Т") +#define MSG_INFO_MAX_TEMP _UxGT("Макс. Т") +#define MSG_INFO_PSU _UxGT("Блок питания") +#define MSG_DRIVE_STRENGTH _UxGT("Сила привода") +#define MSG_DAC_PERCENT _UxGT("Привод %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Запись DAC EEPROM") +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("ПЕЧАТЬ НА ПАУЗЕ") +#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("ЗАГРУЗКА ФИЛАМЕНТА") +#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("ВЫГРУЗКА ФИЛАМЕНТА") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("ОПЦИИ ВОЗОБНОВЛЕНИЯ:") +#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Выдавить ещё") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Возобновить печать") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Сопла: ") +#define MSG_ERR_HOMING_FAILED _UxGT("Возврат не удался") +#define MSG_ERR_PROBING_FAILED _UxGT("Не удалось прощупать") +#define MSG_M600_TOO_COLD _UxGT("M600: Низкая Т") + +// +// Filament Change screens show up to 3 lines on a 4-line display +// ...or up to 2 lines on a 3-line display +// +#if LCD_HEIGHT >= 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Ожидайте") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("начала смены") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("филамента") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ожидайте") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("выгрузки") + #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("филамента") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Вставьте пруток") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("и нажмите кнопку") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("для продолжения") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Нажмите кнопку для") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("нагрева сопла...") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Нагрев сопла") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Ждите...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Ожидайте") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("загрузки прутка") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Ожидайте") + #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("экструзии") + #define MSG_FILAMENT_CHANGE_PURGE_3 _UxGT("филамента") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Ожидайте") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("возобновления") + #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("печати") +#else // LCD_HEIGHT < 4 + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Ожидайте...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Выгрузка...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Вставь и нажми") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Нагрев...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Загрузка...") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Выдавливание...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Возобновление...") +#endif // LCD_HEIGHT < 4 + +#endif // LANGUAGE_RU_H diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index d0fdf5749c..80ff332462 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,631 +16,403 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Slovak * UTF-8 for Graphical Display * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html * * Translated by Michal Holeš, Farma MaM - * https://www.facebook.com/farmamam + * http://www.facebook.com/farmamam + * */ +#ifndef LANGUAGE_SK_UTF_H +#define LANGUAGE_SK_UTF_H + +// Put characters here that should be displayed with M117 +//_UxGT("aäAÄaáAÁeéEÉiíIÍlĺLĹ") +//_UxGT("oóOÓoôOÔrŕRŔuúUÚyýYÝ") +//_UxGT("cčCČdďDĎlľLĽnňNŇsšSŠ") +//_UxGT("tťTŤzžZŽ") + #define DISPLAY_CHARSET_ISO10646_SK +#define CHARSIZE 2 -namespace Language_sk { - using namespace Language_en; // Inherit undefined strings from English +#define WELCOME_MSG MACHINE_NAME _UxGT(" pripravená.") +#define MSG_BACK _UxGT("Naspäť") +#define MSG_SD_INSERTED _UxGT("Karta vložená") +#define MSG_SD_REMOVED _UxGT("Karta vybraná") +#define MSG_LCD_ENDSTOPS _UxGT("Endstopy") // max 8 znakov +#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Soft. endstopy") +#define MSG_MAIN _UxGT("Hlavná ponuka") +#define MSG_ADVANCED_SETTINGS _UxGT("Pokročilé nastav.") +#define MSG_CONFIGURATION _UxGT("Konfigurácia") +#define MSG_AUTOSTART _UxGT("Auto-štart") +#define MSG_DISABLE_STEPPERS _UxGT("Uvolniť motory") +#define MSG_DEBUG_MENU _UxGT("Ponuka ladenia") +#define MSG_PROGRESS_BAR_TEST _UxGT("Test uk. priebehu") +#define MSG_AUTO_HOME _UxGT("Domovská pozícia") +#define MSG_AUTO_HOME_X _UxGT("Domov os X") +#define MSG_AUTO_HOME_Y _UxGT("Domov os Y") +#define MSG_AUTO_HOME_Z _UxGT("Domov os Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibrovať Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Meranie podložky") +#define MSG_LEVEL_BED_WAITING _UxGT("Kliknutím spusťte") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Ďalší bod") +#define MSG_LEVEL_BED_DONE _UxGT("Meranie hotové!") +#define MSG_Z_FADE_HEIGHT _UxGT("Výška merania") +#define MSG_SET_HOME_OFFSETS _UxGT("Nastaviť offsety") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offsety nastavené") +#define MSG_SET_ORIGIN _UxGT("Nastaviť začiatok") +#define MSG_PREHEAT_1 _UxGT("Zahriať PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" všetko") +#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" hotend") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" podlož") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" nast") +#define MSG_PREHEAT_2 _UxGT("Zahriať ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" všetko") +#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" hotend") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" podlož") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" nast") +#define MSG_COOLDOWN _UxGT("Schladiť") +#define MSG_SWITCH_PS_ON _UxGT("Zapnúť napájanie") +#define MSG_SWITCH_PS_OFF _UxGT("Vypnúť napájanie") +#define MSG_EXTRUDE _UxGT("Vytlačiť (extr.)") +#define MSG_RETRACT _UxGT("Vytiahnuť (retr.)") +#define MSG_MOVE_AXIS _UxGT("Posunúť osy") +#define MSG_BED_LEVELING _UxGT("Vyrovnanie podložky") +#define MSG_LEVEL_BED _UxGT("Vyrovnať podložku") +#define MSG_LEVEL_CORNERS _UxGT("Vyrovnať rohy") +#define MSG_NEXT_CORNER _UxGT("Ďalší roh") +#define MSG_EDITING_STOPPED _UxGT("Koniec úprav siete") - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Slovak"); +#define MSG_UBL_DOING_G29 _UxGT("Vykonávam G29") +#define MSG_UBL_UNHOMED _UxGT("Prejdite domov") +#define MSG_UBL_TOOLS _UxGT("UBL nástroje") +#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling") +#define MSG_UBL_MANUAL_MESH _UxGT("Manuálna sieť bodov") +#define MSG_UBL_BC_INSERT _UxGT("Položte a zmerajte") +#define MSG_UBL_BC_INSERT2 _UxGT("Zmerajte") +#define MSG_UBL_BC_REMOVE _UxGT("Odstráňte a zmerajte") +#define MSG_UBL_MOVING_TO_NEXT _UxGT("Presun na ďalší") +#define MSG_UBL_ACTIVATE_MESH _UxGT("Aktivovať UBL") +#define MSG_UBL_DEACTIVATE_MESH _UxGT("Deaktivovať UBL") +#define MSG_UBL_SET_BED_TEMP _UxGT("Teplota podložky") +#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Teplota hotendu") +#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP +#define MSG_UBL_MESH_EDIT _UxGT("Úprava siete bodov") +#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Upraviť vlastnú sieť") +#define MSG_UBL_FINE_TUNE_MESH _UxGT("Doladiť sieť bodov") +#define MSG_UBL_DONE_EDITING_MESH _UxGT("Koniec úprav siete") +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Vlastná sieť") +#define MSG_UBL_BUILD_MESH_MENU _UxGT("Vytvoriť sieť") +#define MSG_UBL_BUILD_PLA_MESH _UxGT("Sieť bodov PLA") +#define MSG_UBL_BUILD_ABS_MESH _UxGT("Sieť bodov ABS") +#define MSG_UBL_BUILD_COLD_MESH _UxGT("Studená sieť bodov") +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Upraviť výšku siete") +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Výška") +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Skontrolovať sieť") +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Kontrola siete PLA") +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Kontrola siete ABS") +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Kontrola vlast.siete") +#define MSG_UBL_CONTINUE_MESH _UxGT("Pokračovať v sieti") +#define MSG_UBL_MESH_LEVELING _UxGT("Sieťové rovnanie") +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-bodové rovnanie") +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Mriežkové rovnanie") +#define MSG_UBL_MESH_LEVEL _UxGT("Vyrovnať podložku") +#define MSG_UBL_SIDE_POINTS _UxGT("Postranné body") +#define MSG_UBL_MAP_TYPE _UxGT("Typ siete bodov") +#define MSG_UBL_OUTPUT_MAP _UxGT("Exportovať sieť") +#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Exportovať do PC") +#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Exportovať do CSV") +#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Záloha do PC") +#define MSG_UBL_INFO_UBL _UxGT("Info o UBL do PC") +#define MSG_UBL_EDIT_MESH_MENU _UxGT("Upraviť sieť bodov") +#define MSG_UBL_FILLIN_AMOUNT _UxGT("Hustota mriežky") +#define MSG_UBL_MANUAL_FILLIN _UxGT("Ručná hustota") +#define MSG_UBL_SMART_FILLIN _UxGT("Chytrá hustota") +#define MSG_UBL_FILLIN_MESH _UxGT("Zaplniť mriežku") +#define MSG_UBL_INVALIDATE_ALL _UxGT("Zrušiť všetko") +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Zrušiť najbližší") +#define MSG_UBL_FINE_TUNE_ALL _UxGT("Upraviť všetky") +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Upraviť najbližší") +#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Úložisko sietí") +#define MSG_UBL_STORAGE_SLOT _UxGT("Pamäťový slot") +#define MSG_UBL_LOAD_MESH _UxGT("Načítať sieť bodov") +#define MSG_UBL_SAVE_MESH _UxGT("Uložiť sieť bodov") +#define MSG_MESH_LOADED _UxGT("Sieť %i načítaná") +#define MSG_MESH_SAVED _UxGT("Sieť %i uložená") +#define MSG_NO_STORAGE _UxGT("Nedostatok miesta") +#define MSG_UBL_SAVE_ERROR _UxGT("Chyba: Ukladanie UBL") +#define MSG_UBL_RESTORE_ERROR _UxGT("Chyba: Obnovenie UBL") +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Koniec Z-Offsetu") +#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Postupné UBL") - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pripravená."); - PROGMEM Language_Str MSG_YES = _UxGT("ÁNO"); - PROGMEM Language_Str MSG_NO = _UxGT("NIE"); - PROGMEM Language_Str MSG_BACK = _UxGT("Naspäť"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Ruším..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Karta vložená"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Karta vybraná"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Čakám na kartu"); - PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Inicial. SD zlyhala"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Chyba čítania karty"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB zaria. odstrán."); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Chyba spúšťania USB"); - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Preteč. podprogramu"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znakov - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft. endstopy"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Hlavná ponuka"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Pokročilé nastav."); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfigurácia"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto-štart"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Uvolniť motory"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Ponuka ladenia"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. priebehu"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Domovská pozícia"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Domov os X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Domov os Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Domov os Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto-zarovn. Z"); - PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Asist. vyrovnanie"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Parkovanie XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím začnete"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Ďalší bod"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Vyrovnanie hotové!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Výška rovnania"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Nastaviť ofsety"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastavené"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Nastaviť začiatok"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Zahriať ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Zahriať ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" všetko"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" podlož"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" nast."); +#define MSG_LED_CONTROL _UxGT("Nastavenie LED") +#define MSG_LEDS _UxGT("Svetlo") +#define MSG_LED_PRESETS _UxGT("Prednastavené farby") +#define MSG_SET_LEDS_RED _UxGT("Červená") +#define MSG_SET_LEDS_ORANGE _UxGT("Oranžová") +#define MSG_SET_LEDS_YELLOW _UxGT("Žltá") +#define MSG_SET_LEDS_GREEN _UxGT("Zelená") +#define MSG_SET_LEDS_BLUE _UxGT("Modrá") +#define MSG_SET_LEDS_INDIGO _UxGT("Indigo") +#define MSG_SET_LEDS_VIOLET _UxGT("Fialová") +#define MSG_SET_LEDS_WHITE _UxGT("Biela") +#define MSG_SET_LEDS_DEFAULT _UxGT("Obnoviť nastavenie") +#define MSG_CUSTOM_LEDS _UxGT("Vlastná farba") +#define MSG_INTENSITY_R _UxGT("Inten. červenej") +#define MSG_INTENSITY_G _UxGT("Inten. zelenej") +#define MSG_INTENSITY_B _UxGT("Inten. modrej") +#define MSG_INTENSITY_W _UxGT("Inten. bielej") +#define MSG_LED_BRIGHTNESS _UxGT("Jas") - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Zahriať $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Zahriať $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Zahriať $ hotend"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Zahriať $ hotend ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Zahriať $ všetko"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Zahriať $ podlož"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Zahriať $ nast."); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Vlastná teplota"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Schladiť"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Nastavenie lasera"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Vypnúť laser"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Zapnúť laser"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon lasera"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Nastavenie vretena"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Vypnúť vreteno"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Zapnúť vreteno"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Výkon vretena"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spätný chod"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnúť napájanie"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Vypnúť napájanie"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Vytlačiť (extr.)"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Vytiahnuť (retr.)"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Posunúť osy"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Vyrovnanie podložky"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Vyrovnať podložku"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Vyrovnať rohy"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Ďalší roh"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor sieťe bodov"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Upraviť sieť bodov"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Koniec úprav siete"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Skúšam bod"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Hodnota Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastné príkazy"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Bod"); - PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda mimo hraníc"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchýlka"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX režim"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ofset nástrojov"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-parkovanie"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikácia"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Zrkadlená kópia"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Plná kontrola"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. tryska X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. tryska Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. tryska Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Vykonávam G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Nástroje UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("UBL rovnanie"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Vyrovnávam bod"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manuálna sieť bodov"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Položte a zmerajte"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Zmerajte"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Odstráňte a zmerajte"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Presun na ďalší"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivovať UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deaktivovať UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Teplota podložky"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Teplota podložky"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Teplota hotendu"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Teplota hotendu"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Úprava siete bodov"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Upraviť vlastnú sieť"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Doladiť sieť bodov"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec úprav siete"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastná sieť"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Vytvoriť sieť"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Sieť bodov ($)"); - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená sieť bodov"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Upraviť výšku siete"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Skontrolovať sieť"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola siete ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast.siete"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 ohrev podlž."); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 ohrev trysky"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ručné čistenie..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Čistenie pevn. dĺž."); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Čistenie dokončené"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 zrušený"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Opúšťam G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Pokračovať v sieti"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Sieťové rovnanie"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-bodové rovnanie"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Mriežkové rovnanie"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Vyrovnať podložku"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Postranné body"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Typ siete bodov"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Exportovať sieť"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Export do hosta"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Export do CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Externá záloha"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Info. o výst. UBL"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Hustota mriežky"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ručné vyplnenie"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Chytré vyplnenie"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Vyplniť mriežku"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Zrušiť všetko"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Zrušiť najbližší"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Upraviť všetky"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Upraviť najbližší"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Úložisko sietí"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Pamäťový slot"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Načítať sieť bodov"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Uložiť sieť bodov"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Sieť %i načítaná"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Sieť %i uložená"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nedostatok miesta"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Chyba: Ukladanie UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Chyba: Obnovenie UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Ofset: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Koniec kompenz. Z"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Postupné UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Studená sieť bodov"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Chytré vyplnenie"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Skontrolovať sieť"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Upraviť všetky"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Skontrolovať sieť"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Upraviť všetky"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Uložiť sieť bodov"); +#define MSG_USER_MENU _UxGT("Vlastné príkazy") +#define MSG_MOVING _UxGT("Posúvam...") +#define MSG_FREE_XY _UxGT("Uvolniť XY") +#define MSG_MOVE_X _UxGT("Posunúť X") +#define MSG_MOVE_Y _UxGT("Posunúť Y") +#define MSG_MOVE_Z _UxGT("Posunúť Z") +#define MSG_MOVE_E _UxGT("Extrudér") +#define MSG_MOVE_01MM _UxGT("Posunúť o 0,1mm") +#define MSG_MOVE_1MM _UxGT("Posunúť o 1mm") +#define MSG_MOVE_10MM _UxGT("Posunúť o 10mm") +#define MSG_SPEED _UxGT("Rýchlosť") +#define MSG_BED_Z _UxGT("Výška podl.") +#define MSG_NOZZLE _UxGT("Tryska") +#define MSG_BED _UxGT("Podložka") +#define MSG_FAN_SPEED _UxGT("Rýchlosť vent.") +#define MSG_EXTRA_FAN_SPEED _UxGT("Rýchlosť ex. vent.") +#define MSG_FLOW _UxGT("Prietok") +#define MSG_CONTROL _UxGT("Ovládanie") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fakt") +#define MSG_AUTOTEMP _UxGT("Auto-teplota") +#define MSG_ON _UxGT("Zap") +#define MSG_OFF _UxGT("Vyp") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Vybrať") +#define MSG_ACC _UxGT("Zrýchl") +#define MSG_JERK _UxGT("Skok") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-skok") + #define MSG_VB_JERK _UxGT("Vb-skok") + #define MSG_VC_JERK _UxGT("Vc-skok") +#else + #define MSG_VA_JERK _UxGT("Vx-skok") + #define MSG_VB_JERK _UxGT("Vy-skok") + #define MSG_VC_JERK _UxGT("Vz-skok") +#endif +#define MSG_VE_JERK _UxGT("Ve-skok") +#define MSG_JUNCTION_DEVIATION _UxGT("Junction Dev") +#define MSG_VELOCITY _UxGT("Rýchlosť") +#define MSG_VMAX _UxGT("Vmax ") +#define MSG_VMIN _UxGT("Vmin") +#define MSG_VTRAV_MIN _UxGT("VTrav min") +#define MSG_ACCELERATION _UxGT("Akcelerácia") +#define MSG_AMAX _UxGT("Amax ") +#define MSG_A_RETRACT _UxGT("A-retrakt") +#define MSG_A_TRAVEL _UxGT("A-prejazd") +#define MSG_STEPS_PER_MM _UxGT("Krokov/mm") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Akrokov/mm") + #define MSG_BSTEPS _UxGT("Bkrokov/mm") + #define MSG_CSTEPS _UxGT("Ckrokov/mm") +#else + #define MSG_ASTEPS _UxGT("Xkrokov/mm") + #define MSG_BSTEPS _UxGT("Ykrokov/mm") + #define MSG_CSTEPS _UxGT("Zkrokov/mm") +#endif +#define MSG_ESTEPS _UxGT("Ekrokov/mm") +#define MSG_E1STEPS _UxGT("E1krokov/mm") +#define MSG_E2STEPS _UxGT("E2krokov/mm") +#define MSG_E3STEPS _UxGT("E3krokov/mm") +#define MSG_E4STEPS _UxGT("E4krokov/mm") +#define MSG_E5STEPS _UxGT("E5krokov/mm") +#define MSG_TEMPERATURE _UxGT("Teplota") +#define MSG_MOTION _UxGT("Pohyb") +#define MSG_FILAMENT _UxGT("Filament") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E na mm3") +#define MSG_FILAMENT_DIAM _UxGT("Priem. fil.") +#define MSG_FILAMENT_UNLOAD _UxGT("Vysunúť mm") +#define MSG_FILAMENT_LOAD _UxGT("Zaviesť mm") +#define MSG_ADVANCE_K _UxGT("K pre posun") +#define MSG_CONTRAST _UxGT("Kontrast LCD") +#define MSG_STORE_EEPROM _UxGT("Uložiť nastavenie") +#define MSG_LOAD_EEPROM _UxGT("Načítať nastavenie") +#define MSG_RESTORE_FAILSAFE _UxGT("Obnoviť nastavenie") +#define MSG_INIT_EEPROM _UxGT("Inicializácia EEPROM") +#define MSG_REFRESH _UxGT("Obnoviť") +#define MSG_WATCH _UxGT("Info. obrazovka") +#define MSG_PREPARE _UxGT("Príprava tlače") +#define MSG_TUNE _UxGT("Doladenie tlače") +#define MSG_PAUSE_PRINT _UxGT("Pozastaviť tlač") +#define MSG_RESUME_PRINT _UxGT("Obnoviť tlač") +#define MSG_STOP_PRINT _UxGT("Zastaviť tlač") +#define MSG_POWER_LOSS_RECOVERY _UxGT("Obnova po výp. nap.") +#define MSG_CARD_MENU _UxGT("Tlačiť z SD") +#define MSG_NO_CARD _UxGT("Žiadna SD karta") +#define MSG_DWELL _UxGT("Spím...") +#define MSG_USERWAIT _UxGT("Pokrač. kliknutím...") +#define MSG_PRINT_PAUSED _UxGT("Tlač pozastavená") +#define MSG_PRINTING _UxGT("Tlačím...") +#define MSG_PRINT_ABORTED _UxGT("Tlač zrušená") +#define MSG_NO_MOVE _UxGT("Žiadny pohyb.") +#define MSG_KILLED _UxGT("PRERUŠENÉ. ") +#define MSG_STOPPED _UxGT("ZASTAVENÉ. ") +#define MSG_CONTROL_RETRACT _UxGT("Retrakt mm") +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Výmena Re.mm") +#define MSG_CONTROL_RETRACTF _UxGT("Retraktovať V") +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Zdvih Z mm") +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") +#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") +#define MSG_AUTORETRACT _UxGT("AutoRetr.") +#define MSG_FILAMENTCHANGE _UxGT("Vymeniť filament") +#define MSG_FILAMENTLOAD _UxGT("Zaviesť filament") +#define MSG_FILAMENTUNLOAD _UxGT("Vysunúť filament") +#define MSG_FILAMENTUNLOAD_ALL _UxGT("Vysunúť všetko") - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Nastavenie LED"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Svetlo"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Predvolby svetla"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Červená"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Oranžová"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Žltá"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zelená"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Modrá"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fialová"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Biela"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Obnoviť nastavenie"); - PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Kanál ="); - PROGMEM Language_Str MSG_LEDS2 = _UxGT("Svetlo #2"); - PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Predvolby svetla #2"); - PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Jas"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Vlastná farba"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Inten. červenej"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Inten. zelenej"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Inten. modrej"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Inten. bielej"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Jas"); +#define MSG_INIT_SDCARD _UxGT("Načítať SD kartu") +#define MSG_CNG_SDCARD _UxGT("Vymeniť SD kartu") +#define MSG_ZPROBE_OUT _UxGT("Sonda Z mimo podl.") +#define MSG_SKEW_FACTOR _UxGT("Faktor skosenia") +#define MSG_BLTOUCH _UxGT("BLTouch") +#define MSG_BLTOUCH_SELFTEST _UxGT("Self-Test BLTouch") +#define MSG_BLTOUCH_RESET _UxGT("Reset BLTouch") +#define MSG_BLTOUCH_DEPLOY _UxGT("Vysunúť BLTouch") +#define MSG_BLTOUCH_STOW _UxGT("Zasunúť BLTouch") +#define MSG_HOME _UxGT("Najskôr os") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("domov") +#define MSG_ZPROBE_ZOFFSET _UxGT("Z offset sondy") +#define MSG_BABYSTEP_X _UxGT("Babystep X") +#define MSG_BABYSTEP_Y _UxGT("Babystep Y") +#define MSG_BABYSTEP_Z _UxGT("Babystep Z") +#define MSG_ENDSTOP_ABORT _UxGT("Zastavenie Endstop") +#define MSG_HEATING_FAILED_LCD _UxGT("Chyba ohrevu") +#define MSG_HEATING_FAILED_LCD_BED _UxGT("Chyba ohrevu podl.") +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Chyba: REDUND. TEP.") +#define MSG_THERMAL_RUNAWAY _UxGT("TEPLOTNÝ SKOK") +#define MSG_THERMAL_RUNAWAY_BED _UxGT("TEPLOTNÝ SKOK PODL.") +#define MSG_ERR_MAXTEMP _UxGT("Chyba: MAXTEMP") +#define MSG_ERR_MINTEMP _UxGT("Chyba: MINTEMP") +#define MSG_ERR_MAXTEMP_BED _UxGT("Chyba: MAXTEMP PODL.") +#define MSG_ERR_MINTEMP_BED _UxGT("Chyba: MINTEMP PODL.") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("TLAČIAREŇ ZASTAVENÁ") +#define MSG_PLEASE_RESET _UxGT("Spravte reset") +#define MSG_SHORT_DAY _UxGT("d") +#define MSG_SHORT_HOUR _UxGT("h") +#define MSG_SHORT_MINUTE _UxGT("m") +#define MSG_HEATING _UxGT("Ohrev...") +#define MSG_COOLING _UxGT("Ochladzovanie...") +#define MSG_BED_HEATING _UxGT("Ohrev podl...") +#define MSG_BED_COOLING _UxGT("Ochladzovanie podl..") +#define MSG_DELTA_CALIBRATE _UxGT("Delta kalibrácia") +#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibrovať X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibrovať Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Kalibrovať Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Kalibrovať stred") +#define MSG_DELTA_SETTINGS _UxGT("Delta nastavenia") +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto-kalibrácia") +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Nast. výšku delty") +#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Offset sondy Z") +#define MSG_DELTA_DIAG_ROD _UxGT("Diag. rameno") +#define MSG_DELTA_HEIGHT _UxGT("Výška") +#define MSG_DELTA_RADIUS _UxGT("Polomer") +#define MSG_INFO_MENU _UxGT("O tlačiarni") +#define MSG_INFO_PRINTER_MENU _UxGT("Info. o tlačiarni") +#define MSG_3POINT_LEVELING _UxGT("3-bodové rovnanie") +#define MSG_LINEAR_LEVELING _UxGT("Lineárne rovnanie") +#define MSG_BILINEAR_LEVELING _UxGT("Bilineárne rovnanie") +#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") +#define MSG_MESH_LEVELING _UxGT("Mriežkové rovnanie") +#define MSG_INFO_STATS_MENU _UxGT("Štatistika") +#define MSG_INFO_BOARD_MENU _UxGT("Info. o doske") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistory") +#define MSG_INFO_EXTRUDERS _UxGT("Extrudéry") +#define MSG_INFO_BAUDRATE _UxGT("Rýchlosť") +#define MSG_INFO_PROTOCOL _UxGT("Protokol") +#define MSG_CASE_LIGHT _UxGT("Osvetlenie") +#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Jas svetla") - PROGMEM Language_Str MSG_MOVING = _UxGT("Posúvam..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Uvolniť XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Posunúť X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Posunúť Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Posunúť Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudér"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudér *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Posunúť o %smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunúť o 0,1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunúť o 1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunúť o 10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Rýchlosť"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl."); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Tryska ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Tryska zaparkovná"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Záložná tryska"); - PROGMEM Language_Str MSG_BED = _UxGT("Podložka"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Komora"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Rýchlosť vent."); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Rýchlosť vent. ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Ulož. vent. ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Rýchlosť ex. vent."); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Rýchlosť ex. vent. ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Vent. riad. jedn."); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Voľno. rýchl."); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto-režím"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív. rýchl."); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Doba nečinnosti"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Prietok"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Prietok ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Ovládanie"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto-teplota"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Zap"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Vyp"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID kalibrácia"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID kalibrácia *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID kal. dokončená"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Auto-kal. zlyhala. Zlý extrúder."); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Auto-kal. zlyhala. Príliš vysoká tepl."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Auto-kal. zlyhala! Čas vypršal."); - PROGMEM Language_Str MSG_SELECT = _UxGT("Vybrať"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Vybrať *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Zrýchlenie"); - PROGMEM Language_Str MSG_JERK = _UxGT("Skok"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-skok"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-skok"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-skok"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-skok"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Rýchlosť"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vmax ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vmax ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vmax ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vmax ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vmax *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Vmin"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VPrej Min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Akcelerácia"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Amax ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Amax ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Amax ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Amax ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Amax *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retrakt"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-prejazd"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Max. frekvencia"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min. posun"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Kroky/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("krokov/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("krokov/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("krokov/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("Ekrokov/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*krokov/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Teplota"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Pohyb"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E v mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit v mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Priem. fil."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Priem. fil. *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Vysunúť mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Zaviesť mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K pre posun"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K pre posun *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Uložiť nastavenie"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Načítať nastavenie"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Obnoviť nastavenie"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inicializ. EEPROM"); - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Chyba: EEPROM CRC"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Chyba: EEPROM Index"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Chyba: Verzia EEPROM"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Nastavenie uložené"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Aktualizovať z SD"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reštart. tlačiar."); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnoviť"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info. obrazovka"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Príprava tlače"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Doladenie tlače"); - PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Monitor napájania"); - PROGMEM Language_Str MSG_CURRENT = _UxGT("Prúd"); - PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Napätie"); - PROGMEM Language_Str MSG_POWER = _UxGT("Výkon"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Spustiť tlač"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Ďalší"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inicial."); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Zastaviť"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Tlačiť"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Vynulovať"); - PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignorovať"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Zrušiť"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Hotovo"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Naspäť"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Pokračovať"); - PROGMEM Language_Str MSG_PAUSING = _UxGT("Pozastavujem..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pozastaviť tlač"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Obnoviť tlač"); - PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Spustiť z hosta"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zastaviť tlač"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Tlačím objekt"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Zrušiť objekt"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Zrušiť objekt ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Obnova po výp. nap."); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Tlačiť z SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Žiadna SD karta"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Spím..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Pokrač. kliknutím..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Tlač pozastavená"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Tlačím..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Tlač zrušená"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Tlač dokončená"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Žiadny pohyb."); - PROGMEM Language_Str MSG_KILLED = _UxGT("PRERUŠENÉ. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ZASTAVENÉ. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrakt mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Výmena Re.mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraktovať V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zdvih Z mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Dĺžka výmeny"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Vymeniť naviac"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Dĺžka vytlačenia"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Výmena nástroja"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Zdvihnúť Z"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Primárna rýchl."); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Rýchl. retrakcie"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Parkovať hlavu"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Rýchl. obnovenia"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Rýchlosť vent."); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Doba fúkania"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto-Zap"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto-Vyp"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Výmena nástroja"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-výmena"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Posl. extruder"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Vymeniť za *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Vymeniť filament"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Vymeniť filament *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Zaviesť filament"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Zaviesť filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Vysunúť filament"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Vysunúť filament *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Vysunúť všetko"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Načítať SD kartu"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Vymeniť SD kartu"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Odpojiť SD kartu"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z mimo podl."); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Faktor skosenia"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Zasunúť"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Vysunúť"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Režim SW"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Režim 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Režim OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Ulož. režim"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Prepnúť do 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Prepnúť do OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Zobraziť režim"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("POZOR: Zlé nastav. môže spôsobiť poškoden. Pokračovať?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Inicializ. TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z ofsetu"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Uložiť"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Zasunúť TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Zasunúť sondu Z"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Vysunúť sondu Z"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Najskôr os %s%s%s domov"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Ofsety sondy Z"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X ofset"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y ofset"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z ofset"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystep X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystep Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystep Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Celkom"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Zastavenie Endstop"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba ohrevu"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Chyba: REDUND. TEP."); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNÝ SKOK"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPLOTNÝ SKOK PODL."); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("TEPLOTNÝ SKOK KOMO."); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Chyba: MAXTEMP"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Chyba: MINTEMP"); - PROGMEM Language_Str MSG_HALTED = _UxGT("TLAČIAREŇ ZASTAVENÁ"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reštartuje ju"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); - PROGMEM Language_Str MSG_HEATING = _UxGT("Ohrev..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Ochladzovanie..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ohrev podložky..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Ochladz. podložky..."); - PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Ohrev sondy..."); - PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Ochladz. sondy..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ohrev komory..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Ochladz. komory..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrácia"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrovať X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrovať Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrovať Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrovať stred"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta nastavenia"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto-kalibrácia"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Nast. výšku delty"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Ofset sondy Z"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag. rameno"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Výška"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Polomer"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O tlačiarni"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info. o tlačiarni"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-bodové rovnanie"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineárne rovnanie"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineárne rovnanie"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("UBL rovnanie"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mriežkové rovnanie"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Štatistika"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. o doske"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudéry"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Rýchlosť"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Tepl. ochrana: VYP"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Tepl. ochrana: ZAP"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Vypr.čas nečinnosti"); +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Počet tlačí") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Dokončené") + #define MSG_INFO_PRINT_TIME _UxGT("Celkový čas") + #define MSG_INFO_PRINT_LONGEST _UxGT("Najdlhšia tlač") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Celkom vytlačené") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Tlače") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Hotovo") + #define MSG_INFO_PRINT_TIME _UxGT("Čas") + #define MSG_INFO_PRINT_LONGEST _UxGT("Najdlhšia") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Vytlačené") +#endif - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Osvetlenie"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jas svetla"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Nesprávna tlačiareň"); +#define MSG_INFO_MIN_TEMP _UxGT("Teplota min") +#define MSG_INFO_MAX_TEMP _UxGT("Teplota max") +#define MSG_INFO_PSU _UxGT("Nap. zdroj") +#define MSG_DRIVE_STRENGTH _UxGT("Budenie motorov") +#define MSG_DAC_PERCENT _UxGT("Motor %") +#define MSG_DAC_EEPROM_WRITE _UxGT("Uložiť do EEPROM") - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Počet tlačí"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Dokončené"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Celkový čas"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdlhšia tlač"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Celkom vytlačené"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Tlače"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Hotovo"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Čas"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdlhšia"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Vytlačené"); - #endif +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("PAUZA TLAČE") +#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("ZAVEDENIE FILAMENTU") +#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("VYSUNUTIE FILAMENTU") +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("MOŽNOSTI POKRAČ.:") +#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Vytlačiť viacej") +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Obnoviť tlač") +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Tryska: ") +#define MSG_ERR_HOMING_FAILED _UxGT("Parkovanie zlyhalo") +#define MSG_ERR_PROBING_FAILED _UxGT("Kalibrácia zlyhala") +#define MSG_M600_TOO_COLD _UxGT("M600: Príliš studený") - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Teplota min"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Teplota max"); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Nap. zdroj"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Budenie motorov"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Motor %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Motor %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Motor %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Motor %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("CHYBA KOMUNIKÁ. TMC"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Uložiť do EEPROM"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("VÝMENA FILAMENTU"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PAUZA TLAČE"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ZAVEDENIE FILAMENTU"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("VYSUNUTIE FILAMENTU"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("MOŽNOSTI POKRAČ.:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Vytlačiť viacej"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Obnoviť tlač"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Tryska: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Senzor filamentu"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Vzd. mm fil. senz."); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Parkovanie zlyhalo"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Kalibrácia zlyhala"); +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čakajte prosím") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("na spustenie") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("výmeny filamentu") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Čakajte prosím") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("na vysunutie") + #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("filamentu") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vložte filament") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("a stlačte") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("tlačidlo...") + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Kliknite pre") + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("ohrev trysky") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Čakajte prosím") + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("na teplotu trysky") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Čakajte prosím") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("na zavedenie") + #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("filamentu") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Čakajte na") + #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("vytlačenie") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Čakajte prosím") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("na pokračovanie") + #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("tlače") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Čakajte prosím...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Vysúvanie...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Vložte a kliknite") + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Ohrev...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Zavádzanie...") + #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Vytlačovanie...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Pokračovanie...") +#endif // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU2"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Aktualizujte FW MMU!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU potrebuje zásah."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Obnoviť tlač"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Obnovovanie..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Zaviesť filament"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Zaviesť všetky"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Zaviesť po trysku"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Vysunúť filament"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Vysunúť filament ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Vyňať filament"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Zavádzanie fil. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Vysúvanie fil. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Vysúvanie fil. ..."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Všetky"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reštartovať MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Reštart MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Odstráňte, kliknite"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Mix"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Zložka ~"); - PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Plný gradient"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Prepnúť mix"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cyklický mix"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradientný mix"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Otočiť gradient"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktívny V-tool"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Počiat. V-tool"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Konečn. V-tool"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Vynulovať V-tools"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Uložiť V-tool Mix"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools vynulované"); - PROGMEM Language_Str MSG_START_Z = _UxGT("Počiat.Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT("Konečn.Z:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Hry"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Nájazdníci"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Had"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Bludisko"); - - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Chyb. index stránky"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Chyb. rých. stránky"); - - PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Zmeniť heslo"); - PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Vyžad. sa prihl."); - PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Nastavenie hesla"); - PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Zvoľte číslo"); - PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Zmeniť heslo"); - PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Odstrániť heslo"); - PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Heslo je "); - PROGMEM Language_Str MSG_START_OVER = _UxGT("Začať odznova"); - PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Nezabudnite uložiť!"); - PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Heslo odstránene"); - - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stlačte tlačidlo", "pre obnovu tlače")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkovanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čakajte prosím", "na spustenie", "výmeny filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Vložte filament", "a stlačte tlačidlo", "pre pokračovanie")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Stlačte tlačidlo", "pre ohrev trysky")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Ohrev trysky", "Čakajte prosím...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Čakajte prosím", "na vysunutie", "filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Čakajte prosím", "na zavedenie", "filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Čakajte prosím", "na vytlačenie", "filamentu")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Stlačte tlačidlo", "pre dokončenie", "vytláčania filam.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Čakajte prosím na", "obnovenie tlače...")); - #else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Kliknite pre pokr.")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkovanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Čakajte prosím...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Vložte a kliknite")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Kliknite pre ohrev")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Ohrev...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Vysúvanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Zavádzanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Vytlačovanie...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Klik. pre dokonč.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Pokračovanie...")); - #endif - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Ovládače TMC"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Prúd ovládača"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybridný prah"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Bezsenzor. domov"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Režim krokovania"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop zapnutý"); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Vynulovať"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT("za:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Kompenz. vôle"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korekcia"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Vyhladzovanie"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Vyrovnať os X"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto-kalibrovať"); - #if ENABLED(TOUCH_UI_FTDI_EVE) - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Vypršal čas ohrevu, znížená teplota. Stlačte OK pre ohrev a ešte raz pre obnovu."); - #else - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Vypršal čas ohrevu"); - #endif - PROGMEM Language_Str MSG_REHEAT = _UxGT("Zohriať"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Zohrievanie..."); -} +#endif // LANGUAGE_SK_UTF_H diff --git a/Marlin/src/lcd/language/language_test.h b/Marlin/src/lcd/language/language_test.h index 16cafbebbe..32805f11a3 100644 --- a/Marlin/src/lcd/language/language_test.h +++ b/Marlin/src/lcd/language/language_test.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,19 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * TEST * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_TEST_H +#define LANGUAGE_TEST_H // Select ONE of the following Mappers. // They decide what to do with a symbol in the area of [0x80:0xFF]. They take a symbol of this language file and make them point @@ -65,7 +67,7 @@ #define STRG_ASCII_2 _UxGT(" !\"#$%&'()*+,-./") #define STRG_ASCII_3 _UxGT("0123456789:;<=>?") #define STRG_ASCII_4 _UxGT("@ABCDEFGHIJKLMNO") -#define STRG_ASCII_5 _UxGT("PQRSTUVWXYZ[\\]^_") +#define STRG_ASCII_5 _UxGT("PQRSTUVWXYZ[\]^_") #define STRG_ASCII_6 _UxGT("`abcdefghijklmno") #define STRG_ASCII_7 _UxGT("pqrstuvwxyz{|}~") @@ -113,124 +115,116 @@ #define STRG_OKTAL_e "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357" #define STRG_OKTAL_f "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" -namespace Language_test { - using namespace Language_en; // Inherit undefined strings from English +#if ENABLED(DISPLAYTEST) + #define WELCOME_MSG _UxGT("Language TEST") - constexpr uint8_t CHARSIZE = 1; + #define MSG_WATCH _UxGT("Display test") + #define MSG_PREPARE STRG_OKTAL_b + #define MSG_CONTROL STRG_OKTAL_c +#endif - #if ENABLED(DISPLAYTEST) - PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); +#if ENABLED(WEST) + #define WELCOME_MSG _UxGT("Language TEST") - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Display test"); - PROGMEM Language_Str MSG_PREPARE = STRG_OKTAL_b; - PROGMEM Language_Str MSG_CONTROL = STRG_OKTAL_c; - #endif + #define MSG_WATCH _UxGT("\001\002\003\004\005\006\007\010\011") + #define MSG_PREPARE _UxGT("UTF8") + #define MSG_CONTROL _UxGT("ASCII") - #if ENABLED(WEST) - PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); + //#define MSG_MAIN _UxGT("..") + #define MSG_DISABLE_STEPPERS STRG_C2_8 + #define MSG_AUTO_HOME STRG_C2_9 + #define MSG_SET_HOME_OFFSETS STRG_C2_a + #define MSG_PREHEAT_1 STRG_C2_b + #define MSG_PREHEAT_2 STRG_C3_8 + #define MSG_COOLDOWN STRG_C3_9 + #define MSG_SWITCH_PS_OFF STRG_C3_a + #define MSG_MOVE_AXIS STRG_C3_b - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("\001\002\003\004\005\006\007\010\011"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("UTF8"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("ASCII"); + #define MSG_MAIN STRG_OKTAL_2 + #define MSG_TEMPERATURE STRG_OKTAL_3 + #define MSG_MOTION STRG_OKTAL_4 + #define MSG_FILAMENT STRG_OKTAL_5 + #define MSG_CONTRAST STRG_OKTAL_6 + #define MSG_RESTORE_FAILSAFE STRG_OKTAL_7 - PROGMEM Language_Str MSG_MAIN = _UxGT(".."); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = STRG_C2_8; - PROGMEM Language_Str MSG_AUTO_HOME = STRG_C2_9; - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = STRG_C2_a; - PROGMEM Language_Str MSG_PREHEAT_1 = STRG_C2_b; - PROGMEM Language_Str MSG_PREHEAT_2 = STRG_C3_8; - PROGMEM Language_Str MSG_COOLDOWN = STRG_C3_9; - PROGMEM Language_Str MSG_SWITCH_PS_OFF = STRG_C3_a; - PROGMEM Language_Str MSG_MOVE_AXIS = STRG_C3_b; + #define MSG_NOZZLE STRG_OKTAL_8 + #define MSG_FAN_SPEED STRG_OKTAL_9 + #define MSG_AUTOTEMP STRG_OKTAL_a + #define MSG_MIN STRG_OKTAL_b + #define MSG_MAX STRG_OKTAL_c + #define MSG_FACTOR STRG_OKTAL_d + #define MSG_PID_P STRG_OKTAL_e + #define MSG_PID_I STRG_OKTAL_f - PROGMEM Language_Str MSG_MAIN = STRG_OKTAL_2; - PROGMEM Language_Str MSG_TEMPERATURE = STRG_OKTAL_3; - PROGMEM Language_Str MSG_MOTION = STRG_OKTAL_4; - PROGMEM Language_Str MSG_FILAMENT = STRG_OKTAL_5; - PROGMEM Language_Str MSG_CONTRAST = STRG_OKTAL_6; - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = STRG_OKTAL_7; +#endif - PROGMEM Language_Str MSG_NOZZLE = STRG_OKTAL_8; - PROGMEM Language_Str MSG_NOZZLE_N = STRG_OKTAL_8 " ~"; - PROGMEM Language_Str MSG_FAN_SPEED = STRG_OKTAL_9; - PROGMEM Language_Str MSG_FAN_SPEED_N = STRG_OKTAL_9; - PROGMEM Language_Str MSG_AUTOTEMP = STRG_OKTAL_a; - PROGMEM Language_Str MSG_MIN = STRG_OKTAL_b; - PROGMEM Language_Str MSG_MAX = STRG_OKTAL_c; - PROGMEM Language_Str MSG_FACTOR = STRG_OKTAL_d; - PROGMEM Language_Str MSG_PID_P = STRG_OKTAL_e; - PROGMEM Language_Str MSG_PID_I = STRG_OKTAL_f; +#if ENABLED(CYRIL) + #define WELCOME_MSG _UxGT("Language TEST") - #endif + #define MSG_WATCH _UxGT("\001\002\003\004\005\006\007\010\011") + #define MSG_PREPARE _UxGT("UTF8") + #define MSG_CONTROL _UxGT("ASCII") - #if ENABLED(CYRIL) - PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); + //#define MSG_MAIN _UxGT("..") + #define MSG_DISABLE_STEPPERS STRG_D0_8 + #define MSG_AUTO_HOME STRG_D0_9 + #define MSG_SET_HOME_OFFSETS STRG_D0_a + #define MSG_PREHEAT_1 STRG_D0_b + #define MSG_PREHEAT_2 STRG_D1_8 + #define MSG_COOLDOWN STRG_D1_9 + #define MSG_SWITCH_PS_OFF STRG_D1_a + #define MSG_MOVE_AXIS STRG_D1_b - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("\001\002\003\004\005\006\007\010\011"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("UTF8"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("ASCII"); + #define MSG_MAIN STRG_OKTAL_2 + #define MSG_TEMPERATURE STRG_OKTAL_3 + #define MSG_MOTION STRG_OKTAL_4 + #define MSG_FILAMENT STRG_OKTAL_5 + #define MSG_CONTRAST STRG_OKTAL_6 + #define MSG_RESTORE_FAILSAFE STRG_OKTAL_7 - PROGMEM Language_Str MSG_MAIN = _UxGT(".."); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = STRG_D0_8; - PROGMEM Language_Str MSG_AUTO_HOME = STRG_D0_9; - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = STRG_D0_a; - PROGMEM Language_Str MSG_PREHEAT_1 = STRG_D0_b; - PROGMEM Language_Str MSG_PREHEAT_2 = STRG_D1_8; - PROGMEM Language_Str MSG_COOLDOWN = STRG_D1_9; - PROGMEM Language_Str MSG_SWITCH_PS_OFF = STRG_D1_a; - PROGMEM Language_Str MSG_MOVE_AXIS = STRG_D1_b; + #define MSG_NOZZLE STRG_OKTAL_8 + #define MSG_FAN_SPEED STRG_OKTAL_9 + #define MSG_AUTOTEMP STRG_OKTAL_a + #define MSG_MIN STRG_OKTAL_b + #define MSG_MAX STRG_OKTAL_c + #define MSG_FACTOR STRG_OKTAL_d + #define MSG_PID_P STRG_OKTAL_e + #define MSG_PID_I STRG_OKTAL_f - PROGMEM Language_Str MSG_MAIN = STRG_OKTAL_2; - PROGMEM Language_Str MSG_TEMPERATURE = STRG_OKTAL_3; - PROGMEM Language_Str MSG_MOTION = STRG_OKTAL_4; - PROGMEM Language_Str MSG_FILAMENT = STRG_OKTAL_5; - PROGMEM Language_Str MSG_CONTRAST = STRG_OKTAL_6; - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = STRG_OKTAL_7; +#endif - PROGMEM Language_Str MSG_NOZZLE = STRG_OKTAL_8; - PROGMEM Language_Str MSG_NOZZLE_N = STRG_OKTAL_8 " ~"; - PROGMEM Language_Str MSG_FAN_SPEED_N = STRG_OKTAL_9; - PROGMEM Language_Str MSG_AUTOTEMP = STRG_OKTAL_a; - PROGMEM Language_Str MSG_MIN = STRG_OKTAL_b; - PROGMEM Language_Str MSG_MAX = STRG_OKTAL_c; - PROGMEM Language_Str MSG_FACTOR = STRG_OKTAL_d; - PROGMEM Language_Str MSG_PID_P = STRG_OKTAL_e; - PROGMEM Language_Str MSG_PID_I = STRG_OKTAL_f; +#if ENABLED(KANA) + #define WELCOME_MSG _UxGT("Language TEST") - #endif + #define MSG_WATCH _UxGT("\001\002\003\004\005\006\007\010\011") + #define MSG_PREPARE _UxGT("UTF8") + #define MSG_CONTROL _UxGT("ASCII") - #if ENABLED(KANA) - PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); + //#define MSG_MAIN _UxGT("..") + #define MSG_DISABLE_STEPPERS STRG_E382_8 + #define MSG_AUTO_HOME STRG_E382_9 + #define MSG_SET_HOME_OFFSETS STRG_E382_a + #define MSG_PREHEAT_1 STRG_E382_b + #define MSG_PREHEAT_2 STRG_E383_8 + #define MSG_COOLDOWN STRG_E383_9 + #define MSG_SWITCH_PS_OFF STRG_E383_a + #define MSG_MOVE_AXIS STRG_E383_b - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("\001\002\003\004\005\006\007\010\011"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("UTF8"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("ASCII"); + #define MSG_MAIN STRG_OKTAL_2 + #define MSG_TEMPERATURE STRG_OKTAL_3 + #define MSG_MOTION STRG_OKTAL_4 + #define MSG_FILAMENT STRG_OKTAL_5 + #define MSG_CONTRAST STRG_OKTAL_6 + #define MSG_RESTORE_FAILSAFE STRG_OKTAL_7 - PROGMEM Language_Str MSG_MAIN = _UxGT(".."); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = STRG_E382_8; - PROGMEM Language_Str MSG_AUTO_HOME = STRG_E382_9; - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = STRG_E382_a; - PROGMEM Language_Str MSG_PREHEAT_1 = STRG_E382_b; - PROGMEM Language_Str MSG_PREHEAT_2 = STRG_E383_8; - PROGMEM Language_Str MSG_COOLDOWN = STRG_E383_9; - PROGMEM Language_Str MSG_SWITCH_PS_OFF = STRG_E383_a; - PROGMEM Language_Str MSG_MOVE_AXIS = STRG_E383_b; + #define MSG_NOZZLE STRG_OKTAL_8 + #define MSG_FAN_SPEED STRG_OKTAL_9 + #define MSG_AUTOTEMP STRG_OKTAL_a + #define MSG_MIN STRG_OKTAL_b + #define MSG_MAX STRG_OKTAL_c + #define MSG_FACTOR STRG_OKTAL_d + #define MSG_PID_P STRG_OKTAL_e + #define MSG_PID_I STRG_OKTAL_f +#endif - PROGMEM Language_Str MSG_MAIN = STRG_OKTAL_2; - PROGMEM Language_Str MSG_TEMPERATURE = STRG_OKTAL_3; - PROGMEM Language_Str MSG_MOTION = STRG_OKTAL_4; - PROGMEM Language_Str MSG_FILAMENT = STRG_OKTAL_5; - PROGMEM Language_Str MSG_CONTRAST = STRG_OKTAL_6; - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = STRG_OKTAL_7; - - PROGMEM Language_Str MSG_NOZZLE = STRG_OKTAL_8; - PROGMEM Language_Str MSG_NOZZLE_N = STRG_OKTAL_8 " ~"; - PROGMEM Language_Str MSG_FAN_SPEED_N = STRG_OKTAL_9; - PROGMEM Language_Str MSG_AUTOTEMP = STRG_OKTAL_a; - PROGMEM Language_Str MSG_MIN = STRG_OKTAL_b; - PROGMEM Language_Str MSG_MAX = STRG_OKTAL_c; - PROGMEM Language_Str MSG_FACTOR = STRG_OKTAL_d; - PROGMEM Language_Str MSG_PID_P = STRG_OKTAL_e; - PROGMEM Language_Str MSG_PID_I = STRG_OKTAL_f; - #endif -} +#endif // LANGUAGE_TEST_H diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index f81f153789..7b15a57000 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,582 +16,253 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Turkish * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html * - * Bu çeviri dosyasındaki sorunlar ve düzeltmeler için iletişim; - * Contact for issues and corrections in this translation file; - * Yücel Temel - (info@elektromanyetix.com) - https://elektromanyetix.com/ */ +#ifndef LANGUAGE_TR_H +#define LANGUAGE_TR_H #define DISPLAY_CHARSET_ISO10646_TR +#define CHARSIZE 2 -namespace Language_tr { - using namespace Language_en; // Inherit undefined strings from English - - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Turkish"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" hazır."); - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("EVET"); - PROGMEM Language_Str MSG_NO = _UxGT("HAYIR"); - PROGMEM Language_Str MSG_BACK = _UxGT("Geri"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Durduruluyor..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD K. Yerleştirildi."); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD Kart Çıkarıldı."); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("SD Kart Bekleniyor"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Kart Okuma Hatası"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB Çıkarıldı"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB Başlat. Hatası"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Enstops"); // Max length 8 characters - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Yazılımsal Endstops"); - PROGMEM Language_Str MSG_MAIN = _UxGT("Ana"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Gelişmiş Ayarlar"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Yapılandırma"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Oto. Başlat"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorları Durdur"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hata Ayıklama"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Durum Çubuğu Testi"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Eksenleri Sıfırla"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X Sıfırla"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Sıfırla"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Sıfırla"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Oto. Z-Hizalama"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ Sıfırlanıyor"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Başlatmak için tıkla"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Sonraki Nokta"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Hizalama Tamam!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Kaçınma Yüksekliği"); - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Ofset Ayarla"); - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofset Tamam"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Sıfır Belirle"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tüm"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tabla"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Ayarlar"); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Ön Isınma $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Ön Isınma $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Ön Isınma $ Nozul"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Ön Isınma $ Nozul ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Ön Isınma $ Tüm"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Ön Isınma $ Tabla"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Ön Isınma $ Ayarlar"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Özel Ön Isınma"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Soğut/(Durdur)"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lazer Kontrolü"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lazeri Kapat"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lazeri Aç"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lazer Gücü"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindle Kontrolü"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Kapat"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle Aç"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Gücü"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Ters Yön"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Gücü Aç"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Gücü Kapat"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Ekstrüzyon"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Geri Çek"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Eksen Hareketleri"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Tabla Hizalama"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Tabla Hizası"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Hizalama Köşeleri"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Sonraki Köşe"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Mesh Editörü"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Mesh Düzenle"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Mesh Düzenleme Durdu"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Prop Noktası"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("İndeks X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("İndeks Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Değeri"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Özel Komutlar"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Prob Testi"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Nokta"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Sapma"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Modu"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Takım Ofsetleri"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Oto-Park"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Kopyala"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Yansıtılmış kopya"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Tam Kontrol"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. nozul X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. nozul Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. nozul Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 Çalışıyor"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Araçları"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("UBL Yatak Hizalama"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Eğim Noktası"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Elle Mesh Oluştur"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Altlık & Ölçü Ver"); - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Ölçü"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Yataktan Ölçü Kaldır"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Sonrakine Git"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL'yi Etkinleştir"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL'yi Etkisizleştir"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Yatak Sıcaklığı"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Yatak Sıcaklığı"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Nozul Sıcaklığı"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Nozul Sıcaklığı"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Mesh Düzenleme"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Özel Mesh Düzenleme"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("İnce Ayar Mesh"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Mesh Düzenleme Tamam"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Özel Mesh Oluştur"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Mesh Oluştur"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Mesh Oluştur ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Doğrulama Mesh ($)"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Soğuk Mesh Oluştur"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Mesh Yükseklik Ayarı"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Yükseklik miktarı"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Doğrulama Mesh"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Özel Mesh Doğrulama"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Isıtma Tablası"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Isıtma Memesi"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manuel çalışma..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Birincil Sabit Uzunluk"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Çalışma Tamamlandı"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 İptal edildi"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Çıkış G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Tabla Mesh Devam et"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Mesh Hizalama"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Nokta Hizalama"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Kafes Mesh Hizalama"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Mesh Seviyesi"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Yan Noktalar"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Haritalama Türü"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Mesh Çıkış Haritası"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host için Çıktı"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV için Çıktı"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Yazıcıda Yedek Kpalı"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Çıkış Bilgisi"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Dolgu Miktarı"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manuel Dolgu"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Akıllı Dogu"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Mesh Dolgu"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Tümünü Geçersiz Kıl"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Yakını Geçersiz Kıl"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Tümünü İnce Ayarla"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Yakını İnce Ayarla"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Depolama"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Bellek Yuvası"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Yatak Mesh Yükle"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Yatak Mesh Kayıt Et"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Mesh %i yüklendi"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Mesh %i kayıtlandı"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Depolama Yok"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hata: UBL Kayıt"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hata: UBL Yenileme"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Ofset: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Ofset Durduruldu"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Adım Adım UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Soğuk Mesh Oluştur"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Akıllı Dogu"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Doğrulama Mesh"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Tümünü İnce Ayarla"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Doğrulama Mesh"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Tümünü İnce Ayarla"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Yatak Mesh Kayıt Et"); - - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Kontrolü"); - PROGMEM Language_Str MSG_LEDS = _UxGT("LEDler"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("LED Hazır Ayarları"); - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Kırmızı"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Turuncu"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Sarı"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Yeşil"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Mavi"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Lacivert"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Menekşe"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Beyaz"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Varsayılan"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Özel Işıklar"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Kırmızı Şiddeti"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Yeşil Şiddeti"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Mavi Şiddeti"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Beyaz Şiddeti"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Parlaklık"); - - PROGMEM Language_Str MSG_MOVING = _UxGT("Hareket Ediyor.."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Durdur XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("X Hareketi"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Y Hareketi"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Z Hareketi"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Ekstruder"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Ekstruder *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Nozul Çok Soğuk"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("%smm"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("0.1mm"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("1mm"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("10mm"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Hız"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Mesafesi"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozul"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Nozul ~"); - PROGMEM Language_Str MSG_BED = _UxGT("Tabla"); - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Çevirme"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Hızı"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan Hızı ~"); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Depolanan Fan ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Ekstra Fan Hızı"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Ekstra Fan Hızı ~"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Akış"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Akış ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrol"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Çarpan"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Oto. Sıcaklık"); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Açık"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Kapalı"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Kalibrasyon"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Kalibrasyon *"); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("Seç"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Seç *"); - PROGMEM Language_Str MSG_ACC = _UxGT("İvme"); - - PROGMEM Language_Str MSG_JERK = _UxGT("Sarsım"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Sarsım"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Sarsım"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Sarsım"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Sarsım"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Jonksiyon Sapması"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Hız Vektörü"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("HızVektör.max ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("HızVektör.max ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("HızVektör.max ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("HızVektör.max ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("HızVektör.max *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("HızVektör.min"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("HV.gezinme min"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Ivme"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Max. ivme ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Max. ivme ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Max. ivme ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Max. ivme ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Max. ivme *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Ivme-geri çekme"); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Ivme-gezinme"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Adım/mm"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" adım/mm"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" adım/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" adım/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E adım/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* adım/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Sıcaklık"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Hareket"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filaman"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ekstrüzyon/mm³"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Filaman Çapı"); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Filaman Çapı *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Çıkart mm"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Yükle mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K İlerlet"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K İlerlet *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Kontrast"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Hafızaya Al"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Hafızadan Yükle"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Fabrika Ayarları"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM'u başlat"); - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Hata: EEPROM CRC"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hata: EEPROM Indeks"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hata: EEPROM Versiyonu"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("SD Güncellemesi"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Yazıcıyı Resetle"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Yenile"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Bilgi Ekranı"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Hazırlık"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Ayar"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Yaz. Başlat"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("İleri"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("İçinde"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Durdur"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Yazdır"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetle"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("İptal"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Tamamlandı"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Geri"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Devam ediyor"); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Duraklat"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Sürdür"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Durdur"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Yazdırma Nesnesi"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Nesneyi İptal Et"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Nesneyi İptal Et ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Kesinti Kurtarma"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("SD Karttan Yazdır"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD Kart Yok!"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Uyku..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Operatör bekleniyor."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Baskı Duraklatıldı"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Baskı Yapılıyor..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Baskı Durduruldu!"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("İşlem yok."); - PROGMEM Language_Str MSG_KILLED = _UxGT("Kilitlendi. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("Durdu. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Geri Çek mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Geri Çekme V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Atlama mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Oto. Geri Çekme"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("G.Çekme Boyu"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tasfiye uzunluğu"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Takım Değişimi"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Yükselt"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Birincil Hız"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Geri Çekme Hızı"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Nozul Beklemede"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Filaman Değiştir"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Filaman Değiştir *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Filaman Yükle"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Filaman Yükle *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Filaman Çıkart"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Filaman Çıkart *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Tümünü Çıkart"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("SD Kart Başlatılıyor"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("SD Kart Değiştir"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("SD Kart Çıkart"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Prob Açık. Tabla"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Çarpıklık Faktörü"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch K. Test"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Kapat"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Aç"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW-Modu"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Modu"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Modu"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V Ayarla"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD Ayarla"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Drenaj Raporu"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("TEHLIKE: Kötü ayarlar hasara neden olabilir! Yine de devam edilsin mi?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Ofset Testi"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Kaydet"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Aç"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Aç"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe Kapat"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Önce %s%s%s Sıfırla"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Prob Ofsetleri"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X Prob Ofset"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y Prob Ofset"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Prob Ofset"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Miniadım X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Miniadım Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Miniadım Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Toplam"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop iptal"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Isınma başarısız"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Hata: Sıcaklık Aşımı"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TERMAL PROBLEM"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("TABLA TERMAL PROBLEM"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ODA TERMAL PROBLEM"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hata: MAX.SICAKLIK"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hata: MIN.SICAKLIK"); - PROGMEM Language_Str MSG_HALTED = _UxGT("YAZICI DURDURULDU"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Lütfen Resetleyin"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("G"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("S"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("D"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Isınıyor..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Soğuyor..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Tabla Isınıyor..."); - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Tabla Soğuyor..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Oda Isınıyor..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Oda Soğuyor..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrasyonu"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Ayarla X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Ayarla Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Ayarla Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Ayarla Merkez"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Ayarları"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Oto Kalibrasyon"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Yük. Ayarla"); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Prob Ofseti"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Çapral Mil"); - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Yükseklik"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Yarıçap"); - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Yazıcı Hakkında"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Yazıcı Bilgisi"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Nokta Hizalama"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Doğrusal Hizalama"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("İki Yönlü Doğ. Hiza."); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Birleşik Tabla Hiza."); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mesh Hizalama"); - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("İstatistikler"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Kontrolcü Bilgisi"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistörler"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Ekstruderler"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("İletişim Hızı"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Aydınlatmayı Aç"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Aydınlatma Parlaklğı"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Yanlış Yazıcı"); - - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Baskı Sayısı"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Tamamlanan"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Toplam Baskı Süresi"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("En Uzun Baskı Süresi"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Toplam Filaman"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Baskı"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Tamamlanan"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Süre"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("En Uzun"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Filaman"); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Sıc."); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Sıc."); - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Güç Kaynağı"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Sürücü Gücü"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Sürücü %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Sürücü %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Sürücü %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Sürücü %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC BAĞLANTI HATASI"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Yaz"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMAN DEGISTIR"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("BASKI DURAKLATILDI"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("FILAMAN YüKLE"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("FILAMAN ÇIKART"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Seçenekler:"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Daha Fazla Tasviye"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Baskıyı sürdür"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozul: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout Sensörü"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Aşınma Farkı mm"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Sıfırlama Başarısız"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing Başarısız"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("FILAMAN SEÇ"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Yaz. Güncelle!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Dikkat Gerektirir."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Yaz. Devam Et"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Sürdürülüyor..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Filaman Yükle"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Tümünü Yükle"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Nozula Yükle"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Filaman Çıkart"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Filaman Çıkart ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Filamenti Boşalt"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Fil. Yükleniyor %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Fil Çıkartılıyor. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Fil. Boşaltılıyor...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Tümü"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filaman ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU Resetle"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Resetleniyot..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Kaldır, tıkla"); - - PROGMEM Language_Str MSG_MIX = _UxGT("Karışım"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Bileşen ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Karıştırıcı"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradyan"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Tam Gradyan"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Karışım Geçişi"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Döngü Karışımı"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradyan Karışımı"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Ters Gradyan"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktif V-tool"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Başlat V-tool"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Bitir V-tool"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reset V-tools"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("V-tool Karışıö Yap"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools Resetlendi"); - PROGMEM Language_Str MSG_START_Z = _UxGT("Başlat Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" Bitir Z:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Oyunlar"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Maze"); - - // - // Filament Değişim ekranları 4 satırlı ekranda 3 satıra kadar gösterilir - // ...veya 3 satırlı ekranda 2 satıra kadar - // - #if LCD_HEIGHT >= 4 - - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Baskıya devam etmek", "için Butona bas")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Park Ediliyor...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Filaman değişimi", "için başlama", "bekleniyor")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Filamanı yükle", "ve devam için", "tuşa bas...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nozulü Isıtmak için", "Butona Bas.")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozul Isınıyor", "Lütfen Bekleyin...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Filamanın çıkması", "bekleniyor")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Filamanın yüklenmesi", "bekleniyor..")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Filaman Temizlemesi", "için bekle")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Filaman Temizlemesi", "bitirmek için tıkla")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Baskının devam ", "etmesi için bekle")); - #else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Sürdürmek İçin Tıkla")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Park Ediliyor...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Lütfen bekleyiniz...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Yükle ve bas")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Isıtmak için Tıkla")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Isınıyor...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Çıkartılıyor...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Yüklüyor...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Temizleniyor...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Bitirmek için Tıkla")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Sürdürülüyor...")); - #endif - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Sürücüleri"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Sürücü Akımı"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrit Eşiği"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensörsüz Sıfırlama"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Adım Modu"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Aktif"); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Resetle"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" içinde:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Ters Tepki"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Düzeltme"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Yumuşatma"); -} - -#if FAN_COUNT == 1 - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#define WELCOME_MSG MACHINE_NAME _UxGT(" hazır.") // hazır. +#define MSG_SD_INSERTED _UxGT("SD Yerleşti.") // SD Yerleşti. +#define MSG_SD_REMOVED _UxGT("SD Çıkarıldı.") // SD Çıkarıldı. +#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters // Endstops +#define MSG_MAIN _UxGT("Ana") // Ana +#define MSG_BACK _UxGT("Geri") // Geri +#define MSG_AUTOSTART _UxGT("Otobaşlat") // Otobaşlat +#define MSG_DISABLE_STEPPERS _UxGT("Motorları Durdur") // Motorları Durdur +#define MSG_DEBUG_MENU _UxGT("Hata Ayıklama") // Hata Ayıklama +#define MSG_PROGRESS_BAR_TEST _UxGT("Durum Çubuğu Testi") // Durum Çubuğu Testi +#define MSG_AUTO_HOME _UxGT("Eksenleri Sıfırla") // Eksenleri Sıfırla +#define MSG_AUTO_HOME_X _UxGT("X Sıfırla") // X Sıfırla +#define MSG_AUTO_HOME_Y _UxGT("Y Sıfırla") // Y Sıfırla +#define MSG_AUTO_HOME_Z _UxGT("Z Sıfırla") // Z Sıfırla +#define MSG_TMC_Z_CALIBRATION _UxGT("Ayarla Z") +#define MSG_LEVEL_BED_HOMING _UxGT("XYZ Sıfırlanıyor") // XYZ Sıfırlanıyor +#define MSG_LEVEL_BED_WAITING _UxGT("Başlatmak için tıkla") // Başlatmak için tıkla +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Sıradaki Nokta") // Sıradaki Nokta +#define MSG_LEVEL_BED_DONE _UxGT("Seviyeleme Tamam!") // Seviyeleme Tamam! +#define MSG_SET_HOME_OFFSETS _UxGT("Offset Ayarla") // Offset Ayarla +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Offset Tamam") // Offset Tamam +#define MSG_SET_ORIGIN _UxGT("Sıfır Belirle") // Sıfır Belirle +#define MSG_PREHEAT_1 _UxGT("Ön Isınma PLA") // Ön Isınma PLA +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") // +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Tüm") // Tüm +#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" Nozül") // Nozül +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Tabla") // Tabla +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Ayar") // Ayar +#define MSG_PREHEAT_2 _UxGT("Ön Isınma ABS") // Ön Isınma ABS +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") // +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Tüm") // Tüm +#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" Nozül") // Nozül +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Tabla") // Tabla +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Ayar") // Ayar +#define MSG_COOLDOWN _UxGT("Soğut") // Soğut +#define MSG_SWITCH_PS_ON _UxGT("Gücü Aç") // Gücü Aç +#define MSG_SWITCH_PS_OFF _UxGT("Gücü Kapat") // Gücü Kapat +#define MSG_EXTRUDE _UxGT("Extrude") // Extrude +#define MSG_RETRACT _UxGT("Geri Çek") // Geri Çek +#define MSG_MOVE_AXIS _UxGT("Eksen Yönet") // Eksenleri Yönet +#define MSG_BED_LEVELING _UxGT("Tabla Seviyele") // Tabla Seviyele +#define MSG_LEVEL_BED _UxGT("Tabla Seviyele") // Tabla Seviyele +#define MSG_MOVING _UxGT("Konumlanıyor...") // Konumlanıyor... +#define MSG_FREE_XY _UxGT("Durdur XY") // Durdur XY +#define MSG_MOVE_X _UxGT("X") // X +#define MSG_MOVE_Y _UxGT("Y") // Y +#define MSG_MOVE_Z _UxGT("Z") // Z +#define MSG_MOVE_E _UxGT("Ekstruder") // Ekstruder +#define MSG_MOVE_01MM _UxGT("0.1mm") // 0.1mm +#define MSG_MOVE_1MM _UxGT("1mm") // 1mm +#define MSG_MOVE_10MM _UxGT("10mm") // 10mm +#define MSG_SPEED _UxGT("Hız") // Hız +#define MSG_BED_Z _UxGT("Z Mesafesi") // Z Mesafesi +#define MSG_NOZZLE _UxGT("Nozül") // Nozül +#define MSG_BED _UxGT("Tabla") // Tabla +#define MSG_FAN_SPEED _UxGT("Fan Hızı") // Fan Hızı +#define MSG_FLOW _UxGT("Akış") // Akış +#define MSG_CONTROL _UxGT("Kontrol") // Kontrol +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") // Min +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") // Max +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Çarpan") // Çarpan +#define MSG_AUTOTEMP _UxGT("Autotemp") // Autotemp +#define MSG_ON _UxGT("On ") // On +#define MSG_OFF _UxGT("Off") // Off +#define MSG_PID_P _UxGT("PID-P") // PID-P +#define MSG_PID_I _UxGT("PID-I") // PID-I +#define MSG_PID_D _UxGT("PID-D") // PID-D +#define MSG_PID_C _UxGT("PID-C") // PID-C +#define MSG_SELECT _UxGT("Seç") // Seç +#define MSG_ACC _UxGT("İvme") // İvme +#define MSG_JERK _UxGT("Jerk") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-jerk") + #define MSG_VB_JERK _UxGT("Vb-jerk") + #define MSG_VC_JERK _UxGT("Vc-jerk") #else - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_VA_JERK _UxGT("Vx-jerk") + #define MSG_VB_JERK _UxGT("Vy-jerk") + #define MSG_VC_JERK _UxGT("Vz-jerk") #endif +#define MSG_VE_JERK _UxGT("Ve-jerk") // Ve-Jerk +#define MSG_VMAX _UxGT("Vmax ") // Vmax +#define MSG_VMIN _UxGT("Vmin") // Vmin +#define MSG_VTRAV_MIN _UxGT("VTrav min") // Vtrav min +#define MSG_AMAX _UxGT("Amax ") // Amax +#define MSG_A_RETRACT _UxGT("A-retract") // A-retract +#define MSG_A_TRAVEL _UxGT("A-travel") // A-travel +#define MSG_STEPS_PER_MM _UxGT("Steps/mm") // Steps/mm +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Asteps/mm") + #define MSG_BSTEPS _UxGT("Bsteps/mm") + #define MSG_CSTEPS _UxGT("Csteps/mm") +#else + #define MSG_ASTEPS _UxGT("Xsteps/mm") + #define MSG_BSTEPS _UxGT("Ysteps/mm") + #define MSG_CSTEPS _UxGT("Zsteps/mm") +#endif +#define MSG_ESTEPS _UxGT("Esteps/mm") // Esteps/mm +#define MSG_E1STEPS _UxGT("E1steps/mm") // E1steps/mm +#define MSG_E2STEPS _UxGT("E2steps/mm") // E2steps/mm +#define MSG_E3STEPS _UxGT("E3steps/mm") // E3steps/mm +#define MSG_E4STEPS _UxGT("E4steps/mm") // E4steps/mm +#define MSG_E5STEPS _UxGT("E5steps/mm") // E4steps/mm +#define MSG_TEMPERATURE _UxGT("Sıcaklık") // Sıcaklık +#define MSG_MOTION _UxGT("Hareket") // Hareket +#define MSG_FILAMENT _UxGT("Filaman") // Filaman +#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") // E in mm3 +#define MSG_FILAMENT_DIAM _UxGT("Fil. Çap") // Fil. Çap +#define MSG_ADVANCE_K _UxGT("K İlerlet") // K İlerlet +#define MSG_CONTRAST _UxGT("LCD Kontrast") // LCD Kontrast +#define MSG_STORE_EEPROM _UxGT("Hafızaya Al") // Hafızaya Al +#define MSG_LOAD_EEPROM _UxGT("Hafızadan Yükle") // Hafızadan Yükle +#define MSG_RESTORE_FAILSAFE _UxGT("Fabrika Ayarları") // Fabrika Ayarları +#define MSG_REFRESH _UxGT("Yenile") // Yenile +#define MSG_WATCH _UxGT("Bilgi Ekranı") // Bilgi Ekranı +#define MSG_PREPARE _UxGT("Hazırlık") // Hazırlık +#define MSG_TUNE _UxGT("Ayar") // Ayar +#define MSG_PAUSE_PRINT _UxGT("Duraklat") // Duraklat +#define MSG_RESUME_PRINT _UxGT("Sürdür") // Sürdür +#define MSG_STOP_PRINT _UxGT("Durdur") // Durdur +#define MSG_CARD_MENU _UxGT("SD den Yazdır") // SD den Yazdır +#define MSG_NO_CARD _UxGT("SD Kart Yok") // SD Kart Yok +#define MSG_DWELL _UxGT("Uyku...") // Uyku... +#define MSG_USERWAIT _UxGT("Operatör bekleniyor...") // Operatör bekleniyor... +#define MSG_PRINT_ABORTED _UxGT("Baskı Durduruldu") // Baskı Durduruldu +#define MSG_NO_MOVE _UxGT("İşlem yok.") // İşlem yok. +#define MSG_KILLED _UxGT("Kilitlendi. ") // Kilitlendi. +#define MSG_STOPPED _UxGT("Durdu. ") // Durdu. +#define MSG_CONTROL_RETRACT _UxGT("Geri Çek mm") // Geri Çek mm +#define MSG_CONTROL_RETRACT_SWAP _UxGT("Swap Re.mm") // Swap Re.mm +#define MSG_CONTROL_RETRACTF _UxGT("Geri Çekme V") // Geri Çekme V +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Hop mm") // Hop mm +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") // UnRet mm +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("S UnRet mm") // S UnRetmm +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") // UnRet V +#define MSG_AUTORETRACT _UxGT("AutoRetr.") // AutoRetr. +#define MSG_FILAMENTCHANGE _UxGT("Filaman Değiştir") // Filaman Değiştir +#define MSG_INIT_SDCARD _UxGT("Init. SD") // Init. SD +#define MSG_CNG_SDCARD _UxGT("SD Değiştir") // SD Değiştir +#define MSG_ZPROBE_OUT _UxGT("Z Prob Açık. Tabla") // Z Prob Açık. Tabla +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") // BLTouch Self-Test +#define MSG_BLTOUCH_RESET _UxGT("Sıfırla BLTouch") // Sıfırla BLTouch +#define MSG_HOME _UxGT("Sıfırla") // Sıfırla +#define MSG_FIRST _UxGT("önce") // Önce +#define MSG_ZPROBE_ZOFFSET _UxGT("Z Offset") // Z Offset +#define MSG_BABYSTEP_X _UxGT("Miniadım X") // Miniadım X +#define MSG_BABYSTEP_Y _UxGT("Miniadım Y") // Miniadım Y +#define MSG_BABYSTEP_Z _UxGT("Miniadım Z") // Miniadım Z +#define MSG_ENDSTOP_ABORT _UxGT("Endstop iptal") // Endstop iptal +#define MSG_HEATING_FAILED_LCD _UxGT("Isınma başarısız") // Isınma başarısız +#define MSG_ERR_REDUNDANT_TEMP _UxGT("Hata: Geçersiz Sıcaklık") // Hata: Geçersiz Sıcaklık +#define MSG_THERMAL_RUNAWAY _UxGT("TERMAL PROBLEM") // TERMAL PROBLEM +#define MSG_ERR_MAXTEMP _UxGT("Hata: MAXSICAKLIK") // Hata: MAXSICAKLIK +#define MSG_ERR_MINTEMP _UxGT("Hata: MINSICAKLIK") // Hata: MINSICAKLIK +#define MSG_ERR_MAXTEMP_BED _UxGT("Hata: MAXSIC. TABLA") // Hata: MAXSIC. TABLA +#define MSG_ERR_MINTEMP_BED _UxGT("Hata: MINSIC. TABLA") // Hata: MINSIC. TABLA +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("YAZICI DURDURULDU") // YAZICI DURDURULDU +#define MSG_PLEASE_RESET _UxGT("Lütfen resetleyin") // Lütfen resetleyin +#define MSG_SHORT_DAY _UxGT("G") // One character only // G +#define MSG_SHORT_HOUR _UxGT("S") // One character only // S +#define MSG_SHORT_MINUTE _UxGT("D") // One character only // D +#define MSG_HEATING _UxGT("Isınıyor...") // Isınıyor... +#define MSG_BED_HEATING _UxGT("Tabla Isınıyor...") // Tabla Isınıyor... +#define MSG_DELTA_CALIBRATE _UxGT("Delta Kalibrasyonu") // Delta Kalibrasyonu +#define MSG_DELTA_CALIBRATE_X _UxGT("Ayarla X") // Ayarla X +#define MSG_DELTA_CALIBRATE_Y _UxGT("Ayarla Y") // Ayarla Y +#define MSG_DELTA_CALIBRATE_Z _UxGT("Ayarla Z") // Ayarla Z +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Ayarla Merkez") // Ayarla Merkez +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Oto Kalibrasyon") // Oto Kalibrasyon +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Delta Yük. Ayarla") // Delta Yük. Ayarla +#define MSG_INFO_MENU _UxGT("Yazıcı Hakkında") // Yazıcı Hakkında +#define MSG_INFO_PRINTER_MENU _UxGT("Yazıcı Bilgisi") // Yazıcı Bilgisi +#define MSG_INFO_STATS_MENU _UxGT("İstatistikler") // İstatistikler +#define MSG_INFO_BOARD_MENU _UxGT("Kontrolör Bilgisi") // Kontrol Bilgisi +#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistörler") // Termistörler +#define MSG_INFO_EXTRUDERS _UxGT("Ekstruderler") // Ekstruderler +#define MSG_INFO_BAUDRATE _UxGT("İletişim Hızı") // İletişim Hızı +#define MSG_INFO_PROTOCOL _UxGT("Protokol") // Protokol +#define MSG_CASE_LIGHT _UxGT("Aydınlatmayı") // Aydınlatmayı Aç + +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("Baskı Sayısı") // Baskı Sayısı + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Tamamlanan") // Tamamlanan + #define MSG_INFO_PRINT_TIME _UxGT("Toplam Baskı Süresi") // Toplam Baskı Süresi + #define MSG_INFO_PRINT_LONGEST _UxGT("En Uzun Baskı Süresi") // En Uzun Baskı Süresi + #define MSG_INFO_PRINT_FILAMENT _UxGT("Toplam Filaman") // Toplam Filaman +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Baskı") // Baskı + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Tamamlanan") // Tamamlanan + #define MSG_INFO_PRINT_TIME _UxGT("Süre") // Süre + #define MSG_INFO_PRINT_LONGEST _UxGT("En Uzun") // En Uzun + #define MSG_INFO_PRINT_FILAMENT _UxGT("Filaman") // Filaman +#endif + +#define MSG_INFO_MIN_TEMP _UxGT("Min Sıc.") // Min Sıcak. +#define MSG_INFO_MAX_TEMP _UxGT("Max Sıc.") // Max Sıcak. +#define MSG_INFO_PSU _UxGT("Güç Kaynağı") // Güç Kaynağı + +#define MSG_DRIVE_STRENGTH _UxGT("Sürücü Gücü") // Sürücü Gücü +#define MSG_DAC_PERCENT _UxGT("Sürücü %") // Sürücü % +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("Seçenekler:") // Seçenekler: +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Baskıyı sürdür") // Baskıyı sürdür +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Nozül: ") // Nozül: + +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Başlama bekleniyor") // Başlama bekleniyor + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("filamanın") // filamanın + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("değişimi") // değişimi + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Bekleniyor") // Bekleniyor + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filamanın çıkması") // filamanın çıkması + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Filamanı yükle") // Filamanı yükle + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("ve devam için") // ve devam için + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("tuşa bas...") // tuşa bas... + #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Nozülü Isıtmak için") // Nozülü Isıtmak için + #define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Butona Bas.") // Butona Bas. + #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Nozül Isınıyor") // Nozül Isınıyor + #define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Lütfen Bekleyin...") // Lütfen Bekleyin... + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Bekleniyor") // Bekleniyor + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("filamanın yüklenmesi") // filamanın yüklenmesi + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Baskının sürdürülmesini") // Baskının sürdürülmesini + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("bekle") // bekle +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Lütfen bekleyiniz...") // Lütfen bekleyiniz... + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Çıkartılıyor...") // Çıkartılıyor... + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Yükle ve bas") // Yükle ve bas + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Yüklüyor...") // Yüklüyor... + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Sürdürülüyor...") // Sürdürülüyor... +#endif // LCD_HEIGHT < 4 + +#endif // LANGUAGE_TR_H diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 9cc1002964..384a90c669 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,754 +16,228 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Ukrainian * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ +#ifndef LANGUAGE_UK_H +#define LANGUAGE_UK_H #define DISPLAY_CHARSET_ISO10646_5 +#define CHARSIZE 2 -namespace Language_uk { - using namespace Language_en; // Inherit undefined strings from English - - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Ukranian"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Готовий."); - PROGMEM Language_Str MSG_YES = _UxGT("ТАК"); - PROGMEM Language_Str MSG_NO = _UxGT("НІ"); - PROGMEM Language_Str MSG_BACK = _UxGT("Назад"); - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Переривання..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD-картка вставлена"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD-картка видалена"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Вставте SD-картку"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Помилка зчитування"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB диск видалений"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Помилка USB диску"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переповнення виклику"); - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Програмні кінцевики"); - #else - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переповн. виклику"); - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр.кінцевики"); - #endif - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Кінцевик"); // Max length 8 characters - PROGMEM Language_Str MSG_MAIN = _UxGT("Основне меню"); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Інші налаштування"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Конфігурація"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Автостарт"); - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Вимкнути двигуни"); - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Меню Debug"); - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Тест Progress Bar"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Авто паркування"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Паркування X"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Паркування Y"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Паркування Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Авто Z-вирівнювання"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Паркування XYZ"); - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Почати"); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Наступна точка"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Завершено!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Висота спаду"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Встанов. зміщення дому"); - #else - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Встанов.зміщ.дому"); - #endif - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Зміщення прийняті"); - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Встановити ноль"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Нагрів ") PREHEAT_1_LABEL; - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Нагрів ") PREHEAT_1_LABEL " ~"; - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" сопло"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" сопло ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" все"); - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" стіл"); - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" налашт"); - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Нагрів $"); - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Нагрів $ ~"); - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Нагрів $ сопло"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Нагрів $ сопло ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Нагрів $ все"); - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Нагрів $ стіл"); - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Нагрів $ налашт"); - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Нагрів Свій"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Вимкнути нагрів"); - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Частота"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Керування лазером"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Вимкнути лазер"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Увімкнути лазер"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Потужність лазера"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Керування шпінделем"); - #else - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Потуж.лазера"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Керув. шпінделем"); - #endif - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Вимкнути шпіндель"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Увімкнути шпіндель"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінделя"); - #else - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Потуж. шпінд."); - #endif - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Напрямок шпінделя"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Увімкнути живлення"); - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Вимкнути живлення"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Екструзія"); - PROGMEM Language_Str MSG_RETRACT = _UxGT("Втягування"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Рух по осям"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Вирівнювання столу"); - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Вирівняти стіл"); - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Вирівняти кути"); - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Наступний кут"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Зміщення по Z"); - #else - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Зміщення Z"); - #endif - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Редагувати сітку"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Редагув. зупинено"); - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Точка сітки"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("Індекс X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Індекс Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Значення Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Власні команди"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 тест зонду"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 точка"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Відхилення"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Меню IDEX"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Зміщення сопел"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Авто паркування"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Розмноження"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Дзеркальна копія"); - PROGMEM Language_Str MSG_IDEX_MODE_FU1L_CTRL = _UxGT("Повний контроль"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("Друге сопло X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("Друге сопло Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("Друге сопло Z"); - - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Виконується G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Інструменти UBL"); - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Налаштування UBL"); - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Точка розвороту"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ручне введення сітки"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Розмістити шайбу і вимір."); - #else - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ручне введ. сітки"); - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Розм. шайбу і вимір."); - #endif - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Вимірювання"); - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Видалити і виміряти"); - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("До наступної точки"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Активувати UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивувати UBL"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Температура столу"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура столу"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Температура сопла"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Температура сопла"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редагувати свою сітку"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точне редагування сітки"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Будувати свою сітку"); - #else - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = LCD_STR_THERMOMETER _UxGT(" столу, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" столу, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редагувати свою"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Точне редаг. сітки"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Будувати свою"); - #endif - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Редагування сітки"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Сітка побудована"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Будувати сітку"); - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Будувати сітку $"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Підтвердити $"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Буд. холодну сітку"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Встан.висоту сітки"); - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Висота"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Підтвердити сітку"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Підтвердити свою"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 нагрів столу"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрів сопла"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ручне грунтування"); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Грунт фікс. довж."); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Грунтув. виконане"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 завершена"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Вийти з G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Продовжити сітку"); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Вирівнювання сітки"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-точкове вирівн."); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Вирівнювання растру"); - #else - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Вирівнюв. растру"); - #endif - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Вирівняти сітку"); - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Крайні точки"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Тип мапи сітки"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Вивести мапу сітки"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Вивести на хост"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Вивести в CSV"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Зберегти зовні"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Інформація по UBL"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Обсяг заповнювача"); - #else - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Обсяг заповн."); - #endif - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ручне заповнення"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Розумне заповнення"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Заповнити сітку"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Анулювати все"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Анулювати найближчу"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налашт. все"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Точно налашт.найближчу"); - #else - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Точно найближчу"); - #endif - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Збереження сітки"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Слот пам'яті"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Завантажити сітку"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Зберегти сітку"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Сітка %i завантажена"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Сітка %i збережена"); - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Немає носія"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Збій: збереж. UBL"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Збій: відновл. UBL"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Зміщення Z: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Зміщення Z зупинено"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL покроково"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Будувати холодну"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Розумне заповн-я"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Затвердити сітку"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Точно налашт.все"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Затвердити сітку"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Точно налашт.все"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Зберегти сітку"); - - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Керування світлом"); - PROGMEM Language_Str MSG_LEDS = _UxGT("Підсвітка"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Передустановки світла"); - #else - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Передустан. світла"); - #endif - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Червоний"); - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Оранжевий"); - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Жовтий"); - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Зелений"); - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Синій"); - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Індіго"); - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Фіолетовий"); - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Білий"); - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("За умовчанням"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Свої кольори"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Рівень червоного"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Рівень зеленого"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Рівень синього"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Рівень білого"); - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Яскравість"); - - PROGMEM Language_Str MSG_MOVING = _UxGT("Переміщення..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Звільнити XY"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Рух по X"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Рух по Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Рух по Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Екструдер"); - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Екструдер *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Сопло дуже холодне"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Рух по %sмм"); - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Рух по 0.1мм"); - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Рух по 1мм"); - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Рух по 10мм"); - PROGMEM Language_Str MSG_SPEED = _UxGT("Швидкість"); - PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Столу"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Сопло ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Сопло запарковане"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Сопло очикує"); - PROGMEM Language_Str MSG_BED = _UxGT("Стіл, ") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Камера,") LCD_STR_DEGREE "C"; - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Охолодження"); - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Охолодження ~"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Збережене охолодж. ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Додаткове охолодж."); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Додаткове охолодж. ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Контролер охолодження"); - #else - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Збереж.охолодж. ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Додат. охолодж."); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Додат.охолодж ~"); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Контролер охолодж."); - #endif - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Холості оберти"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Робочі оберти"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Авто-режим"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Період простою"); - PROGMEM Language_Str MSG_FLOW = _UxGT("Потік"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Потік ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Налаштування"); - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С мін"); - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С макс"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Автотемпер."); - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Увімк"); - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Вимк."); - - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("Автопідбір PID"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("Автопідбір PID *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Підбір PID виконано"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Збій автопідбору. Поганий екструдер."); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Збій автопідбору. Температура завищена."); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Збій автопідбору! Завершення часу."); - - PROGMEM Language_Str MSG_SELECT = _UxGT("Вибрати"); - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Вибрати *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Прискорорення"); - PROGMEM Language_Str MSG_JERK = _UxGT("Ривок"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-ривок"); - PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-ривок"); - PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-ривок"); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-ривок"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Відхилення вузла"); - #else - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Відхил.вузла"); - #endif - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Швидкість, мм/с"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Швидк.макс ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Швидк.макс ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Швидк.макс ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Швидк.макс ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Швидк.макс *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Швидк.мін"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Переміщення мін"); - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Прискорення, мм/с2"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Приск.макс ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Приск.макс ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Приск.макс ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Приск.макс ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Приск.макс *"); - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Приск.втягув."); - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Приск.переміщ."); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Частота макс."); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Подача мін."); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Кроків на мм"); - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" кроків/мм"); - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" кроків/мм"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" кроків/мм"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E кроків/мм"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* кроків/мм"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Температура"); - PROGMEM Language_Str MSG_MOTION = _UxGT("Рух"); - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Пруток"); - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E обмеж.,мм³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E обмеж. *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Діам. прутка"); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Діам. прутка *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Вивантаж., мм"); - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Завантаж., мм"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Kоеф. просув."); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Kоеф. просув. *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Контраст екрану"); - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Зберегти в EEPROM"); - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Зчитати з EEPROM"); - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("На базові параметри"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Ініціалізація EEPROM"); - #else - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Ініціаліз. EEPROM"); - #endif - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Збій EEPROM: CRC"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Збій EEPROM: індекс"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Збій EEPROM: версія"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Параметри збережені"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Оновити SD-картку"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Зкинути принтер"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Поновити"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Головний екран"); - PROGMEM Language_Str MSG_PREPARE = _UxGT("Підготувати"); - PROGMEM Language_Str MSG_TUNE = _UxGT("Підлаштування"); - PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Монітор живлення"); - PROGMEM Language_Str MSG_CURRENT = _UxGT("Струм"); - PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Напруга"); - PROGMEM Language_Str MSG_POWER = _UxGT("Потужність"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Почати друк"); - - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Далі"); //short text for buttons - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Ініц-я"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Зупинка"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Друк"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Зкинути"); - PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ігнорув."); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Відміна"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Готово"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Назад"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Продовжити"); - - PROGMEM Language_Str MSG_PAUSING = _UxGT("Призупинення..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Призупинити друк"); - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Відновити друк"); - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Скасувати друк"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Друк об'єкта"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Завершити об'єкт"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Завершити об'єкт ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Віднов. після збою"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Друкувати з SD"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD-картки немає"); - PROGMEM Language_Str MSG_DWELL = _UxGT("Сплячка..."); - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Продовжити..."); - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Друк призупинено"); - PROGMEM Language_Str MSG_PRINTING = _UxGT("Друк..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Друк скасовано"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Друк завершено"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Немає руху."); - PROGMEM Language_Str MSG_KILLED = _UxGT("ПЕРЕРВАНО. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ЗУПИНЕНО. "); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Втягування, мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Зміна втягув.,мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Повернення, мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Поверн.зміни, мм"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Автовтягування"); - #else - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Втягув., мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Зміна втяг.мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Поверн., мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Повер.зміни,мм"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Автовтягув."); - #endif - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Втягування V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Підскок, мм"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Повернення V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Поверн.зміни V"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Поміняти довжини"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Поміняти додатково"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Очистити довжину"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Зміна сопла"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Підняти по Z"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Початк.швидкість"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Швидкість втягув."); - #else - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Початк.швидк."); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Швидк.втягув."); - #endif - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Паркувати голову"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Відновити швидкість"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти охолодження"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Час охолодження"); - #else - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти охолодж."); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Час охолодж."); - #endif - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Авто Увімк."); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Авто Вимкн."); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Заміна інструменту"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Авто заміна"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Останній екструдер"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Заміна на *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Заміна прутка"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Заміна прутка *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Подати пруток"); - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Подати пруток *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Видалити пруток"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Видалити пруток *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Видалити все"); - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Вставити SD-картку"); - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Заміна SD-картки"); - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Звільніть SD-картку"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-Зонд поза столом"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Фактор нахилу"); - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("Z-зонд BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Само-Тест"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Зкинути BLTouch"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Підняти зонд"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Опустити зонд"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("Режим SW"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("Режим 5V"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("Режим OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Режим збереження"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Встановити на 5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Встановити на OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Злив звіту"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("НЕБЕЗПЕКА: Неправильні параметри приводять до пошкоджень! Продовжувати?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("Z-Зонд TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Ініціалізація"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Тест Z-зміщення"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Зберегти"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Установити TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Установити зонд"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Завантажити зонд"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Дім %s%s%s перший"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Зміщення зонду"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Тест зміщення X"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Тест зміщення Y"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Тест зміщення Z"); - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Мікрокрок X"); - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Мікрокрок Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Мікрокрок Z"); - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Сумарно"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Кінцевик спрацював"); - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Збій нагріву"); - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("ЗАВИЩЕНА Т") LCD_STR_DEGREE; - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ВИТІК ТЕПЛА"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ВИТІК ТЕПЛА СТОЛУ"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ВИТІК ТЕПЛА КАМЕРИ"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("ПЕРЕГРІВ"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("МІНІМАЛЬНА Т") LCD_STR_DEGREE; - PROGMEM Language_Str MSG_HALTED = _UxGT("ПРИНТЕР ЗУПИНЕНО"); - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Перезавантажте"); - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("д"); // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("г"); // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("х"); // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Нагрівання..."); - PROGMEM Language_Str MSG_COOLING = _UxGT("Охолодження..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Нагрів столу..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Нагрів камери..."); - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охолодження столу..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охолодження камери..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калібрування Delta"); - #else - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охол. столу..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Охол. камери..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Калібрув. Delta"); - #endif - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Калібрувати X"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Калібрувати Y"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Калібрувати Z"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калібр. центр"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Параметри Delta"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Автокалібрування"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Висота Delta"); - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондування Z-зміщ."); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стрижень діагоналі"); - #else - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Зондув. Z-зміщ."); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Стрижень діаг."); - #endif - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Висота"); - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Радіус"); - - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Про принтер"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Данні принтера"); - - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точкове вирівнювання"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівнювання"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білінійне вирівнювання"); - #elif LCD_WIDTH == 20 - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точкове вирівнюв."); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівнюван."); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білінійне вирівнюв."); - #else - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-точк. вирівн."); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівн."); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Білін. вирівнюв."); - #endif - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Керування UBL"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Вирівнювання сітки"); - - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Статистика принтера"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Про плату"); - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Термістори"); - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Екструдери"); - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Біт/секунду"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Протокол"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контроль витіку ") LCD_STR_THERMOMETER _UxGT(" Вимк"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Контроль витіку ") LCD_STR_THERMOMETER _UxGT(" Увімк"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Час простою хотенду"); - #else - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Контр.витіку ") LCD_STR_THERMOMETER _UxGT(" Вимк"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Контр.витіку ") LCD_STR_THERMOMETER _UxGT(" Увімк"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Час прост. хот-у"); - #endif - - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Підсвітка"); - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Яскравість світла"); - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("НЕ ТОЙ ПРИНТЕР"); - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено"); - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Екструдовано"); - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Кількість друків"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Весь час друку"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Найдовший час"); - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Друків"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Загалом"); - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Найдовше"); - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Мін. ") LCD_STR_THERMOMETER; - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Макс. ") LCD_STR_THERMOMETER; - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Блок жив-ня"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Сила мотору"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("Драйвер X, %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Драйвер Y, %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Драйвер Z, %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("Драйвер E, %"); - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ЗБІЙ ЗВ'ЯЗКУ З TMC"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Запис ЦАП у EEPROM"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("ЗАМІНА ПРУТКА"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("ЗУПИНКА ДРУКУ"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ЗАВАНТАЖИТИ ПРУТОК"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("ВИВАНТАЖИТИ ПРУТОК"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ПАРАМЕТРИ ПРОДОВЖЕННЯ:"); - #else - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ПАРАМ.ПРОДОВЖЕННЯ:"); - #endif - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Видавити ще"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Відновити друк"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Сопло: "); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Датчик закінчення прутка"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Відстань закінч.,мм"); - #else - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Датчик закінч.прутка"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("До закінч.,мм"); - #endif - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Помилка паркування"); - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Помилка зондування"); - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ОБЕРІТЬ ПРУТОК"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("Налаштування MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Понови прошивку MMU!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU потребує уваги"); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Продовжити друк"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Продовження..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Завантажити пруток"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Завантажити все"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Завантажити в сопло"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Звільнити пруток"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Звільнити пруток ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Вивантажити пруток"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Завантаження %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Звільнення прутка..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Вивантаження ...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Все"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Пруток ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Перезапуск MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Перезапуск MMU..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Видаліть, натисніть"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_MIX = _UxGT("Змішування"); - #else - PROGMEM Language_Str MSG_MIX = _UxGT("Змішув."); - #endif - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Компонент ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("Змішувач"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("Градієнт"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Повний градієнт"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Циклічне змішування"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Градієнт змішування"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Змінити градієнт"); - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перемкнути змішування"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Активація В-інструменту"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Початок В-інструменту"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Кінець В-інструменту"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Псевдонім В-інструменту"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Зкидання В-інструментів"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("В-інструменти зкинуті"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати В-інструменти"); - #else - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Перемкнути змішув."); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Актив.В-інструм."); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("В-інструм. поч."); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT("В-інструм. кін."); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Псевдонім В-інстр."); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Зкидання В-інструм"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("В-інструм. зкинуті"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Змішати В-інструм."); - #endif - PROGMEM Language_Str MSG_START_Z = _UxGT("Початок Z"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" Кінець Z"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("Ігри"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Цеглини"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("Вторгнення"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("Змійка"); - PROGMEM Language_Str MSG_MAZE = _UxGT("Лабіринт"); - - #if LCD_WIDTH > 21 - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Поганий індекс сторінки"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Погана швидкість сторінки"); - #else - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Погана сторінка"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Погана швидк.стор"); - #endif - - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Паркування...")); - #if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Натисніть кнопку", "для продовження", "друку")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Зачекайте", "на початок", "заміни прутка")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Вставте пруток", "та натисніть", "для продовження...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Натисніть кнопку", "для нагріву сопла")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Сопло нагрівається", "зачекайте...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Зачекайте", "на вивід прутка")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Зачекайте", "на ввід прутка")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Дочекайтесь", "очищення прутка")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Натисніть кнопку", "для завершення", "очищення прутка")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Зачекайте", "на відновлення", "друку")); - #else - // Up to 2 lines allowed - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Продовжити друк")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Зачекайте...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Вставте і натисніть")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Нагріти сопло")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Нагрів сопла...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Вивід прутка...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Ввід прутка...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Очищення прутка...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Завершити очищення")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Поновлення друку...")); - #endif - - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Драйвери TMC"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Струм драйвера"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Гібридний поріг"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Дім без кінцевиків"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Режим мікрокроку"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим увімк."); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Зкидання"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" в:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("Люфт"); - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Виправлення"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Зглажування"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Рівень вісі X"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Авто калібрування"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Час нагрівача збіг"); - PROGMEM Language_Str MSG_REHEAT = _UxGT("Поновити нагрів"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Нагрівання..."); -} - -#if FAN_COUNT == 1 - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#define WELCOME_MSG MACHINE_NAME _UxGT(" готовий.") +#define MSG_SD_INSERTED _UxGT("Картка вставлена") +#define MSG_SD_REMOVED _UxGT("Картка видалена") +#define MSG_LCD_ENDSTOPS _UxGT("Кінцевик") // Max length 8 characters +#define MSG_MAIN _UxGT("Меню") +#define MSG_AUTOSTART _UxGT("Автостарт") +#define MSG_DISABLE_STEPPERS _UxGT("Вимк. двигуни") +#define MSG_AUTO_HOME _UxGT("Авто паркування") +#define MSG_AUTO_HOME_X _UxGT("Паркування X") +#define MSG_AUTO_HOME_Y _UxGT("Паркування Y") +#define MSG_AUTO_HOME_Z _UxGT("Паркування Z") +#define MSG_TMC_Z_CALIBRATION _UxGT("Калібрування Z") +#define MSG_LEVEL_BED_HOMING _UxGT("Паркування XYZ") +#define MSG_LEVEL_BED_WAITING _UxGT("Почати") +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Слідуюча Точка") +#define MSG_LEVEL_BED_DONE _UxGT("Завершено!") +#define MSG_SET_HOME_OFFSETS _UxGT("Зберегти паркув.") +#define MSG_HOME_OFFSETS_APPLIED _UxGT("Зміщення застос.") +#define MSG_SET_ORIGIN _UxGT("Встанов. початок") +#define MSG_PREHEAT_1 _UxGT("Нагрів PLA") +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Все") +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Стіл") +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" нал.") +#define MSG_PREHEAT_2 _UxGT("Нагрів ABS") +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Все") +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Стіл") +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" нал.") +#define MSG_COOLDOWN _UxGT("Охолодження") +#define MSG_SWITCH_PS_ON _UxGT("Увімкнути живлення") +#define MSG_SWITCH_PS_OFF _UxGT("Вимкнути живлення") +#define MSG_EXTRUDE _UxGT("Екструзія") +#define MSG_RETRACT _UxGT("Втягування") +#define MSG_MOVE_AXIS _UxGT("Рух по осям") +#define MSG_BED_LEVELING _UxGT("Нівелювання столу") +#define MSG_LEVEL_BED _UxGT("Нівелювання столу") +#define MSG_MOVE_X _UxGT("Рух по X") +#define MSG_MOVE_Y _UxGT("Рух по Y") +#define MSG_MOVE_Z _UxGT("Рух по Z") +#define MSG_MOVE_E _UxGT("Екструдер") +#define MSG_MOVE_01MM _UxGT("Рух по 0.1mm") +#define MSG_MOVE_1MM _UxGT("Рух по 1mm") +#define MSG_MOVE_10MM _UxGT("Рух по 10mm") +#define MSG_SPEED _UxGT("Швидкість") +#define MSG_BED_Z _UxGT("Z Столу") +#define MSG_NOZZLE _UxGT("Сопло") +#define MSG_BED _UxGT("Стіл") +#define MSG_FAN_SPEED _UxGT("Охолодж.") +#define MSG_FLOW _UxGT("Потік") +#define MSG_CONTROL _UxGT("Налаштування") +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Мін") +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Макс") +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Факт") +#define MSG_AUTOTEMP _UxGT("Автотемпер.") +#define MSG_ON _UxGT("Увімк.") +#define MSG_OFF _UxGT("Вимк. ") +#define MSG_PID_P _UxGT("PID-P") +#define MSG_PID_I _UxGT("PID-I") +#define MSG_PID_D _UxGT("PID-D") +#define MSG_PID_C _UxGT("PID-C") +#define MSG_SELECT _UxGT("Вибрати") +#define MSG_ACC _UxGT("Приск.") +#define MSG_JERK _UxGT("Ривок") +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("Va-ривок") + #define MSG_VB_JERK _UxGT("Vb-ривок") + #define MSG_VC_JERK _UxGT("Vc-ривок") #else - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_VA_JERK _UxGT("Vx-ривок") + #define MSG_VB_JERK _UxGT("Vy-ривок") + #define MSG_VC_JERK _UxGT("Vz-ривок") #endif +#define MSG_VE_JERK _UxGT("Ve-ривок") +#define MSG_VMAX _UxGT("Vмакс") +#define MSG_VMIN _UxGT("Vмін") +#define MSG_VTRAV_MIN _UxGT("Vруху мін") +#define MSG_AMAX _UxGT("Aмакс ") +#define MSG_A_RETRACT _UxGT("A-втягув.") +#define MSG_A_TRAVEL _UxGT("A-руху") +#define MSG_STEPS_PER_MM _UxGT("Кроків/мм") +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("Aкроків/мм") + #define MSG_BSTEPS _UxGT("Bкроків/мм") + #define MSG_CSTEPS _UxGT("Cкроків/мм") +#else + #define MSG_ASTEPS _UxGT("Xкроків/мм") + #define MSG_BSTEPS _UxGT("Yкроків/мм") + #define MSG_CSTEPS _UxGT("Zкроків/мм") +#endif +#define MSG_ESTEPS _UxGT("Eкроків/мм") +#define MSG_E1STEPS _UxGT("E1кроків/мм") +#define MSG_E2STEPS _UxGT("E2кроків/мм") +#define MSG_E3STEPS _UxGT("E3кроків/мм") +#define MSG_E4STEPS _UxGT("E4кроків/мм") +#define MSG_E5STEPS _UxGT("E5кроків/мм") +#define MSG_TEMPERATURE _UxGT("Температура") +#define MSG_MOTION _UxGT("Рух") +#define MSG_FILAMENT _UxGT("Волокно") +#define MSG_VOLUMETRIC_ENABLED _UxGT("E в мм3") +#define MSG_FILAMENT_DIAM _UxGT("Діам. волок.") +#define MSG_CONTRAST _UxGT("контраст LCD") +#define MSG_STORE_EEPROM _UxGT("Зберегти в ПЗП") +#define MSG_LOAD_EEPROM _UxGT("Зчитати з ПЗП") +#define MSG_RESTORE_FAILSAFE _UxGT("Відновити базові") +#define MSG_REFRESH _UxGT("Поновити") +#define MSG_WATCH _UxGT("Інформація") +#define MSG_PREPARE _UxGT("Підготувати") +#define MSG_TUNE _UxGT("Підлаштування") +#define MSG_PAUSE_PRINT _UxGT("Призупинити друк") +#define MSG_RESUME_PRINT _UxGT("Відновити друк") +#define MSG_STOP_PRINT _UxGT("Скасувати друк") +#define MSG_CARD_MENU _UxGT("Друкувати з SD") +#define MSG_NO_CARD _UxGT("Відсутня SD карт.") +#define MSG_DWELL _UxGT("Сплячка...") +#define MSG_USERWAIT _UxGT("Очікування дій...") +#define MSG_PRINT_ABORTED _UxGT("Друк скасовано") +#define MSG_NO_MOVE _UxGT("Немає руху.") +#define MSG_KILLED _UxGT("ПЕРЕРВАНО. ") +#define MSG_STOPPED _UxGT("ЗУПИНЕНО. ") +#define MSG_FILAMENTCHANGE _UxGT("Зміна волокна") +#define MSG_INIT_SDCARD _UxGT("Старт SD картки") +#define MSG_CNG_SDCARD _UxGT("Заміна SD карти") +#define MSG_ZPROBE_OUT _UxGT("Z дет. не в межах") +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Само-Тест") +#define MSG_BLTOUCH_RESET _UxGT("Скинути BLTouch") +#define MSG_HOME _UxGT("Дім") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("перший") +#define MSG_ZPROBE_ZOFFSET _UxGT("Зміщення Z") +#define MSG_BABYSTEP_X _UxGT("Мікрокрок X") +#define MSG_BABYSTEP_Y _UxGT("Мікрокрок Y") +#define MSG_BABYSTEP_Z _UxGT("Мікрокрок Z") +#define MSG_ENDSTOP_ABORT _UxGT("невдача кінцевика") +#define MSG_HEATING_FAILED_LCD _UxGT("Невдалий нагрів") +#define MSG_THERMAL_RUNAWAY _UxGT("ЗБІЙ ТЕМПЕРАТУРИ") +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("ПРИНТЕР ЗУПИНЕНО") +#define MSG_PLEASE_RESET _UxGT("Перезавантажте") +#define MSG_SHORT_DAY _UxGT("д") // One character only +#define MSG_SHORT_HOUR _UxGT("г") // One character only +#define MSG_SHORT_MINUTE _UxGT("х") // One character only +#define MSG_HEATING _UxGT("Нагрівання...") +#define MSG_BED_HEATING _UxGT("Нагрівання столу...") +#define MSG_DELTA_CALIBRATE _UxGT("Калібр. Delta") +#define MSG_DELTA_CALIBRATE_X _UxGT("Калібрування X") +#define MSG_DELTA_CALIBRATE_Y _UxGT("Калібрування Y") +#define MSG_DELTA_CALIBRATE_Z _UxGT("Калібрування Z") +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Калібр. Центру") + +#define MSG_INFO_MENU _UxGT("Про принтер") +#define MSG_INFO_PRINTER_MENU _UxGT("Інформація") +#define MSG_INFO_STATS_MENU _UxGT("Статистика") +#define MSG_INFO_BOARD_MENU _UxGT("Про плату") +#define MSG_INFO_THERMISTOR_MENU _UxGT("Термістори") +#define MSG_INFO_EXTRUDERS _UxGT("Екструдери") +#define MSG_INFO_BAUDRATE _UxGT("біт/с") +#define MSG_INFO_PROTOCOL _UxGT("Протокол") +#define MSG_CASE_LIGHT _UxGT("Підсвітка") + +#if LCD_WIDTH >= 20 + #define MSG_INFO_PRINT_COUNT _UxGT("К-сть друків") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Завершено") + #define MSG_INFO_PRINT_TIME _UxGT("Весь час друку") + #define MSG_INFO_PRINT_LONGEST _UxGT("Найдовший час") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Екструдовано") +#else + #define MSG_INFO_PRINT_COUNT _UxGT("Друків") + #define MSG_INFO_COMPLETED_PRINTS _UxGT("Завершено") + #define MSG_INFO_PRINT_TIME _UxGT("Загалом") + #define MSG_INFO_PRINT_LONGEST _UxGT("Найдовший") + #define MSG_INFO_PRINT_FILAMENT _UxGT("Ексдруд.") +#endif + +#define MSG_INFO_MIN_TEMP _UxGT("Мін Темп.") +#define MSG_INFO_MAX_TEMP _UxGT("Макс Темп.") +#define MSG_INFO_PSU _UxGT("Джерело жив.") + +#define MSG_DRIVE_STRENGTH _UxGT("Сила мотору") +#define MSG_DAC_PERCENT _UxGT("% мотору") +#define MSG_DAC_EEPROM_WRITE _UxGT("Запис ЦАП на ПЗП") + +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Відновити друк") + +#if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Зачекайте на") + #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("початок заміни") + #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("волокна") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Зачекайте на") + #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("вивід волокна") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Вставте волокно") + #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("та натисніть для") + #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("продовження...") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Зачекайте на") + #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("ввід волокна") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Зачекайте на") + #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("відновлення") + #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("друку") +#else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Зачекайте...") + #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Вивід...") + #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Вставте і нат.") + #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Ввід...") + #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Відновлення...") +#endif // LCD_HEIGHT < 4 + +#endif // LANGUAGE_UK_H diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h deleted file mode 100644 index f7cf606575..0000000000 --- a/Marlin/src/lcd/language/language_vi.h +++ /dev/null @@ -1,440 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Vietnamese - * - * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html - */ -namespace Language_vi { - using namespace Language_en; // Inherit undefined strings from English - - constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Vietnamese"); - - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Sẵn sàng."); // Ready - PROGMEM Language_Str MSG_BACK = _UxGT("Trở lại"); // Back - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Đang hủy bỏ..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Phương tiện được cắm vào"); // Media inserted - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Phương tiện được rút ra"); - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Chờ đợi phương tiện"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Lỗi đọc phương tiện"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB được rút ra"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB khởi thất bại"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Công tắc"); // Endstops - công tắc hành trình - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Công tắc mềm"); // soft Endstops - PROGMEM Language_Str MSG_MAIN = _UxGT("Chính"); // Main - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Thiết lập cấp cao"); // Advanced Settings - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Cấu hình"); // Configuration - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Khởi chạy tự động"); // Autostart - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Tắt động cơ bước"); // Disable steppers - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu gỡ lỗi"); // Debug Menu - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Kiểm tra tiến độ"); // Progress bar test - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Về nhà tự động"); // Auto home - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Về nhà X"); // home x - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Về nhà Y"); // home y - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Về nhà Z"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Chỉnh canh Z tự động"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Đang về nhà XYZ"); // Homing XYZ - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Nhấn để bắt đầu"); // Click to Begin - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Điểm tiếp theo"); // Next Point - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("San lấp được hoàn thành"); // Leveling Done! - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Chiều cao mờ dần"); // Fade Height - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Đặt bù đắp nhà"); // Set home offsets - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Bù đắp được áp dụng"); // Offsets applied - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Đặt nguồn gốc"); // Set origin - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước"); // Preheat - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ~"); // Preheat - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu"); - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu ~"); - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Tất cả"); // all - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Bàn"); // bed -- using vietnamese term for 'table' instead - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Cấu hình"); // conf - - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("Làm nóng $ trước"); // Preheat - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("Làm nóng $ trước ~"); // Preheat - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("Làm nóng $ Đầu"); - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("Làm nóng $ Đầu ~"); - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("Làm nóng $ Tất cả"); // all - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Làm nóng $ Bàn"); // bed -- using vietnamese term for 'table' instead - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Làm nóng $ Cấu hình"); // conf - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Sự nóng trước tự chọn"); // Preheat Custom - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Nguội xuống"); // Cooldown - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bật nguồn"); // Switch power on - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Tắt nguồn"); // Switch power off - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Ép đùn"); // Extrude - PROGMEM Language_Str MSG_RETRACT = _UxGT("Rút lại"); // Retract - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Di chuyển trục"); // Move axis - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("San Lấp Bàn"); // Bed Leveling - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Làm bằng mặt bàn"); // Level bed - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Làm bằng góc bàn"); // Level corners - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Góc tiếp theo"); // Next corner - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Chỉnh lưới đã dừng"); // Mesh Editing Stopped - PROGMEM Language_Str MSG_MESH_X = _UxGT("Mục lục X"); // Index X - PROGMEM Language_Str MSG_MESH_Y = _UxGT("Mục lục Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Giá trị Z"); // Z Value - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Các lệnh tự chọn"); // Custom Commands - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Đang chạy G29"); // Doing G29 - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Công cụ UBL"); // UBL tools - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("San Lấp Bàn Thống Nhất (UBL)"); // Unified Bed Leveling - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("chế độ IDEX"); // IDEX Mode - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Đậu tự động"); // Auto-Park - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Sự gấp đôi"); // Duplication - PROGMEM Language_Str MSG_IDEX_MODE_SCALED_COPY = _UxGT("Bản sao thu nhỏ"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Toàn quyền điều khiển"); // Full control - PROGMEM Language_Str MSG_IDEX_X_OFFSET = _UxGT("Đầu phun X nhì"); // 2nd nozzle X - PROGMEM Language_Str MSG_IDEX_Y_OFFSET = _UxGT("Đầu phun Y nhì"); - PROGMEM Language_Str MSG_IDEX_Z_OFFSET = _UxGT("Đầu phun Z nhì"); - PROGMEM Language_Str MSG_IDEX_SAVE_OFFSETS = _UxGT("Lưu bù đắp"); // Save offsets - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Tự xây dựng lưới"); // Manually Build Mesh - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Đặt chêm và đo"); // Place shim & measure - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Đo"); // Measure - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Tháo và đo bàn"); // Remove & measure bed - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Chuyển sang tiếp theo"); // moving to next - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Bật UBL"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Tắt UBL"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Nhiệt độ bàn"); // Bed Temp - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Nhiệt độ đầu phun"); // Hotend Temp - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Chỉnh sửa lưới"); // Mesh Edit - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Chỉnh sửa lưới tự chọn"); // Edit Custom Mesh - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Chỉnh lưới chính xác"); // Fine tuning mesh - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Chỉnh sửa xong lưới"); // Done Editing Mesh - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Xây dựng lưới tự chọn"); // Build Custom Mesh - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Xây dựng lưới"); // Build Mesh - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Xây dựng lưới ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Thẩm tra lưới ($)"); - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Xây dựng lưới lạnh"); // Build cold mesh - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Điều chỉnh chiều cao lưới"); // Adjust Mesh Height - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Số lượng chiều cao"); // Height Amount - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Thẩm tra lưới"); // Validate Mesh - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Thẩm tra lưới tự chọn"); // validate custom mesh - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Tiếp tục xây lưới bàn"); // Continue Bed Mesh - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Đang san lấp lưới"); // Mesh Leveling - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Đang san lấp 3-điểm"); // 3-Point Leveling - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Đang san lấp lưới phẳng"); // Grid (planar) Mesh Leveling - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Làm bằng lưới"); // Level Mesh - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Điểm bên cạnh"); // Side Points - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Loại bản đồ"); // Map Type - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Đầu ra bản đồ lưới"); // Output Mesh Map - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Đầu ra cho máy chủ"); // Output for Host - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Đầu ra cho CSV"); // Output for CSV - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Hỗ trợ lưới"); // Off Printer Backup | backup mesh - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Đầu ra thông tin UBL"); // Output UBL Info - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Chỉnh sửa lưới"); // Edit mesh - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Số lượng lấp đầy"); // Fill-in Amount - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Tự lấp đầy"); // Manual Fill-in - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Lấp đầy thông minh"); // Smart Fill-in - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Lưới lấp đầy"); // Fill-in Mesh - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Bác bỏ tất cả"); // Invalidate All - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Bác bỏ gần nhất"); // Invalidate Closest - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Chỉnh chính xác tất cả"); // Fine Tune ALl - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Chỉnh chính xác gần nhất"); // Fine Tune Closest - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Lưu trữ lưới"); // Mesh Storage - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Khe nhớ"); // Memory Slot - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Tải lưới bàn"); // Load Bed Mesh - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Lưu lưới bàn"); // Save Bed Mesh - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("%i lưới được nạp"); // Mesh %i loaded - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("%i lưới đã lưu"); - PROGMEM Language_Str MSG_NO_STORAGE = _UxGT("Không lưu trữ"); // No Storage - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Điều sai: Lưu UBL"); // Err: UBL Save - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Điều Sai: Khôi Phục UBL"); // Err: UBL Restore - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Đầu Dò-Z Đã Ngừng"); // Z-Offset Stopped - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Bước-Từng-Bước UBL"); // Step-By-Step UBL - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Xây dựng lưới lạnh"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Lấp đầy thông minh"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Thẩm tra lưới"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Chỉnh chính xác tất cả"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Thẩm tra lưới"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Chỉnh chính xác tất cả"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Lưu lưới bàn"); - - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Điều khiển LED"); // LED Control - PROGMEM Language_Str MSG_LEDS = _UxGT("Đèn"); // Lights - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Đèn định sẵn"); // Light Presets - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Đỏ"); // Red - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Cam"); // Orange - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Vàng"); // Yellow - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Xanh Lá"); // Green - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Xanh"); // Blue - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Xanh Đậm"); // Indigo - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Tím"); // Violet - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Trắng"); // White - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Mặc định"); // Default - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Đèn Tự Chọn"); // Custom Lights - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Cường Độ Đỏ"); // Red Intensity - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Cường Độ Xanh Lá"); // Green Intensity - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Cường Độ Xanh"); // Blue Intensity - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Cường Độ Trắng"); // White Intensity - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("độ sáng"); // Brightness - - PROGMEM Language_Str MSG_MOVING = _UxGT("Di chuyển..."); // Moving - PROGMEM Language_Str MSG_FREE_XY = _UxGT("Giải phóng XY"); // Free XY - PROGMEM Language_Str MSG_MOVE_X = _UxGT("Di chuyển X"); // Move X - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Di chuyển Y"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Di chuyển Z"); - PROGMEM Language_Str MSG_MOVE_E = _UxGT("Máy đùn"); // Extruder - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Máy đùn *"); // Extruder - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Đầu nóng quá lạnh"); // Hotend too cold - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Di chuyển 0.1mm"); // Move 0.1mm - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Di chuyển 1mm"); // Move 1mm - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Di chuyển 10mm"); // Move 10mm - PROGMEM Language_Str MSG_SPEED = _UxGT("Tốc độ"); // Speed - PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Bàn"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Đầu phun"); // Nozzle - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Đầu phun ~"); // Nozzle - PROGMEM Language_Str MSG_BED = _UxGT("Bàn"); // bed - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Tốc độ quạt"); // fan speed - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Tốc độ quạt ~"); // fan speed - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Tốc độ quạt phụ"); // Extra fan speed - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Tốc độ quạt phụ ~"); // Extra fan speed - PROGMEM Language_Str MSG_FLOW = _UxGT("Lưu Lượng"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("Lưu Lượng ~"); - PROGMEM Language_Str MSG_CONTROL = _UxGT("Điều khiển"); // Control - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Đa"); // min - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Thiểu"); - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Hệ Số"); // factor - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Nhiệt độ tự động"); // Autotemp - PROGMEM Language_Str MSG_LCD_ON = _UxGT("Bật"); // on - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Tắt"); // off - PROGMEM Language_Str MSG_SELECT = _UxGT("Lựa"); // Select - PROGMEM Language_Str MSG_SELECT_E = _UxGT("Lựa *"); - PROGMEM Language_Str MSG_ACC = _UxGT("Tăng Tốc"); - PROGMEM Language_Str MSG_JERK = _UxGT("Giật"); - PROGMEM Language_Str MSG_VA_JERK = _UxGT("Giật-V") LCD_STR_A; - PROGMEM Language_Str MSG_VB_JERK = _UxGT("Giật-V") LCD_STR_B; - PROGMEM Language_Str MSG_VC_JERK = _UxGT("Giật-V") LCD_STR_C; - PROGMEM Language_Str MSG_VE_JERK = _UxGT("Giật-Ve"); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Độ Lệch Chỗ Giao"); // Junction Dev - PROGMEM Language_Str MSG_VELOCITY = _UxGT("Vận tốc"); // velocity - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vđa") LCD_STR_A; // Vmax - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vđa") LCD_STR_B; // Vmax - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vđa") LCD_STR_C; // Vmax - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vđa") LCD_STR_E; // Vmax - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vđa *"); // Vmax - PROGMEM Language_Str MSG_VMIN = _UxGT("Vthiểu"); // Vmin - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vchuyển thiểu"); // VTrav min - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Sự tăng tốc"); // Acceleration - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Tăng tốc ca") LCD_STR_A; // Amax - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Tăng tốc ca") LCD_STR_B; // Amax - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Tăng tốc ca") LCD_STR_C; // Amax - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Tăng tốc ca") LCD_STR_E; // Amax - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Tăng tốc ca *"); // Amax - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("TT-Rút"); // A-retract - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("TT-Chuyển"); // A-travel - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Bước/mm"); // Steps - PROGMEM Language_Str MSG_A_STEPS = _UxGT("Bước") LCD_STR_A _UxGT("/mm"); // Asteps/mm - PROGMEM Language_Str MSG_B_STEPS = _UxGT("Bước") LCD_STR_B _UxGT("/mm"); - PROGMEM Language_Str MSG_C_STEPS = _UxGT("Bước") LCD_STR_C _UxGT("/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("BướcE/mm"); - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("Bước */mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Nhiệt độ"); // Temperature - PROGMEM Language_Str MSG_MOTION = _UxGT("Chuyển động"); // Motion - PROGMEM Language_Str MSG_FILAMENT = _UxGT("Vật liệu in"); // dây nhựa - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E bằng mm³"); // E in mm - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Đường kính nhựa"); // Fil. Dai. - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Đường kính nhựa *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Dỡ mm"); // unload mm - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Nạp mm"); - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K Cấp Cao"); // Advance K - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K Cấp Cao *"); // Advance K - PROGMEM Language_Str MSG_CONTRAST = _UxGT("Độ tương phản LCD"); // LCD contrast - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Lưu các thiết lập"); // Store settings - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Tải các cài đặt"); // Load settings - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Khôi phục phòng hư"); // Restore Defaults - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Khởi Tạo EEPROM"); // Initialize EEPROM - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Cập Nhật phương tiện"); // Update media - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Bặt Lại Máy In"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Cập Nhật"); // Refresh - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Màn Hình Thông Tin"); // Info screen - PROGMEM Language_Str MSG_PREPARE = _UxGT("Chuẩn bị"); // Prepare - PROGMEM Language_Str MSG_TUNE = _UxGT("Điều Chỉnh"); // Tune - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Tạm dừng in"); // Pause print - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Tiếp tục in"); // Resume print - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Ngừng in"); // Stop print - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Phục Hồi Mất Điện"); // Outage Recovery - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("In từ phương tiện"); // Print from media - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Không có phương tiện"); // No media - PROGMEM Language_Str MSG_DWELL = _UxGT("Ngủ..."); // Sleep - PROGMEM Language_Str MSG_USERWAIT = _UxGT("Nhấn để tiếp tục..."); // Click to resume (same as 'continue') - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("In tạm dừng"); // print paused - PROGMEM Language_Str MSG_PRINTING = _UxGT("Đang in..."); // printing - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("In đã hủy bỏ"); // Print aborted - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Không di chuyển."); // No move. - PROGMEM Language_Str MSG_KILLED = _UxGT("ĐÃ CHẾT. "); - PROGMEM Language_Str MSG_STOPPED = _UxGT("ĐÃ NGỪNG. "); - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Rút mm"); // Retract mm - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Rút Trao.mm"); // Swap Re.mm - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Rút V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Nhảy mm"); // hop - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("BỏRút mm"); // Unretr. mm - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("BỏRút T mm"); // S Unretr. mm - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("BỏRút V"); // UnRet V - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("BỏRút T V"); // S UnRet V - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("RútTựĐộng"); // Auto-Retract - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Khoảng Cách Rút"); // Retract Distance - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Thay Đổi Công Cụ"); // Tool Change - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Đưa Lên Z"); // Z Raise - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Tốc Độ Tuôn Ra"); // Prime Speed - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Tốc Độ Rút Lại"); // Retract Speed - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Thay dây nhựa"); // change filament - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Thay dây nhựa *"); // change filament - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Nạp dây nhựa"); // load filament - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Nạp dây nhựa *"); // load filament - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Dỡ dây nhựa"); // unload filament - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Dỡ dây nhựa *"); // unload filament - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Dỡ tất cả"); // Unload All - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Khởi tạo phương tiện"); // Attach media - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Thay phương tiện"); // Change midea - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Phát hành phương tiện"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Đầu Dò Z qua bàn"); // Z Probe past bed - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Hệ số nghiêng"); // Skew Factor - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTOUCH"); // BLTouch - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Tự kiểm tra BLTOUCH "); // BLTouch Self-Test - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Bặt lại BLTouch"); // Reset BLTouch - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Đem BLTouch"); // Deploy BLTouch - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cất BLTouch"); // Stow BLTouch - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Đem Đầu Dò-Z"); // Deploy Z-Probe - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Cất Đầu Dò-Z"); // Stow Z-Probe - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Về nhà %s%s%s Trước"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Đầu Dò Bù Đắp Z"); // Probe Z Offset - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Nhít X"); // Babystep X - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Nhít Y"); - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Nhít Z"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Hủy bỏ công tắc"); // Endstop abort - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Sưởi đầu phun không thành công"); // Heating failed - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Điều sai: nhiệt độ dư"); // Err: REDUNDANT TEMP - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Vấn đề nhiệt"); // THERMAL RUNAWAY | problem - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("Vấn đề nhiệt bàn"); // BED THERMAL RUNAWAY - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Điều sai: nhiệt độ tối đa"); // Err: MAXTEMP - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Điều sai: nhiệt độ tối thiểu"); // Err: MINTEMP - PROGMEM Language_Str MSG_HALTED = _UxGT("MÁY IN ĐÃ DỪNG LẠI"); // PRINTER HALTED - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Xin bặt lại"); // Please reset - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("g"); // h - giờ - One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("p"); // m - phút - One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("Đang sưởi nóng..."); // heating - PROGMEM Language_Str MSG_COOLING = _UxGT("Đang làm nguội..."); // cooling - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Đang sưởi nong bàn..."); // bed heating - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Đang làm nguội bàn..."); // bed cooling - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Cân Chỉnh Delta"); // Delta calibration - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Chỉnh X lại"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Chỉnh Y lại"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Chỉnh Z lại"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Chỉnh Z Center"); // Calibrate Center - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Cài Đặt Delta"); // Delta Settings - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Cân Chỉnh Tự Động"); // Auto Calibration - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Đặt Chiều Cao Delta"); // Set Delta Height - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Đầu Dò Z-Bù Đắp"); // Probe Z-offset - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Gậy Chéo"); // Diag Rod - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Chiều Cao"); // Height - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Bán Kính"); // Radius - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Về Máy In"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Thông Tin Máy In"); // Printer Info - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("San lấp 3-Điểm"); // 3-Point Leveling - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("San Lấp Tuyến Tính"); // Linear Leveling - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("San Lấp Song Tuyến"); // Bilinear Leveling - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("San Lấp Bàn Thống Nhất"); // Unified Bed Leveling - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Lưới San Lấp"); // Mesh Leveling - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Thống Kê Máy In"); // Printer Stats - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Thông Tin Bo Mạch"); // Board Info - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Điện Trở Nhiệt"); // Thermistors - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Máy đùn"); // Extruders - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); // Baud - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Giao Thức"); // Protocol - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Đèn Khuông"); // Case light - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Độ Sáng"); // Light Brightness - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Số In"); // Print Count - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tổng số thời gian in"); // Total print time - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Thời gian việc lâu nhất"); // Longest job time - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Tổng số đùn"); // Extruded total - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("In"); // prints - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); // Completed - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tổng số"); // total - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Dài nhất"); // Longest - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Đã ép đùn"); - #endif - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Nhiệt độ tối thiểu"); // Min Temp - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Nhiệt độ tối đa"); // Max temp - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Bộ nguồn"); // PSU - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Sức mạnh ổ đĩa"); // Drive Strength - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X % trình điều khiển"); // X Driver % - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y % trình điều khiển"); // Y Driver % - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z % trình điều khiển"); // Z Driver % - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E % trình điều khiển"); // E Driver % - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Ghi DAC EEPROM"); // DAC EEPROM Write - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("In tạm dừng"); // PRINT PAUSED - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("Nạp dây nhựa"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("Dỡ dây nhựa"); // unload filament - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Tùy chọn hồi phục:"); // RESUME OPTIONS - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Xả thêm"); // Purge more - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Tiếp tục"); // continue - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Đầu Phun: "); // Nozzle - PROGMEM Language_Str MSG_RUNOUT_SENSOR_ENABLE = _UxGT("Cảm Biến Hết"); // Runout Sensor - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Sự nhà không thành công"); // Homing failed - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT(" không thành công"); // Probing failed - - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nhấn nút", "để tiếp tục in")); // Press button to resume print - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Chờ cho sự", "thay đổi dây nhựa", "bắt đầu")); // wait for filament change to start - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Đút dây nhựa vào", "và nhấn nút", "để tiếp tục")); // insert filament and press button to continue // - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nhấn nút", "để làm nóng đầu phun")); // Press button to heat nozzle - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Đầu phun đang nóng lên", "Xin chờ...")); // Nozzle heating Please wait - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa ra")); // Wait for filament unload - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa vào")); // Wait for filament load - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Chờ tro", "xả dây nhựa")); // wait for filament purge - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Nhấn nút để kết thúc", "xả dây nhựa")); // Click to finish dây nhựa purge - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Chờ tro in", "tiếp tục...")); // Wait for print to resume - #else // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Nhấn nút để tiếp tục")); // Click to continue - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Xin chờ...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Chèn và nhấn")); // Insert and Click - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Nhấn để sưởi")); // Click to heat - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Đang sưởi nóng")); // Heating - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Đang dỡ ra...")); // Ejecting - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Đang nạp...")); // Loading - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Đang xả...")); // Purging - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Nhấn nút để kết thúc")); // Click to finish - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Đang tiếp tục...")); // Resuming - #endif // LCD_HEIGHT < 4 - - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Trình điều khiển TMC"); // TMC drivers - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Dòng điện trình điều khiển"); // Driver current - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Ngưỡng Hỗn Hợp"); // Hybrid threshold - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Vô cảm biến"); // Sensorless homing - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Chế độ từng bước"); // Stepping mode - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("CắtTàngHình được kích hoạt"); // StealthChop enabled -} diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 3bebe12fda..6cf63f6e1d 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,622 +16,375 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Simplified Chinese * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ -namespace Language_zh_CN { - using namespace Language_en; // Inherit undefined strings from English +#ifndef LANGUAGE_ZH_CN_H +#define LANGUAGE_ZH_CN_H - constexpr uint8_t CHARSIZE = 3; - PROGMEM Language_Str LANGUAGE = _UxGT("简体中文"); +//#define TALL_FONT_CORRECTION (1) - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT("已就绪."); //" ready." - PROGMEM Language_Str MSG_MARLIN = _UxGT("马林"); - PROGMEM Language_Str MSG_YES = _UxGT("是"); - PROGMEM Language_Str MSG_NO = _UxGT("否"); - PROGMEM Language_Str MSG_BACK = _UxGT("返回"); // ”Back“ - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("放弃中..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("存储卡已插入"); //"Card inserted" - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("存储卡被拔出"); //"Card removed" - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("等待存储器"); - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("存储器读取错误"); - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB设备已弹出"); - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB启动错误"); - PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("子响应溢出"); - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("挡块"); //"Endstops" // Max length 8 characters - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("软挡块"); - PROGMEM Language_Str MSG_MAIN = _UxGT("主菜单"); //"Main" - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("高级设置"); - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("配置"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("自动开始"); //"Autostart" - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("关闭步进电机"); //"Disable steppers" - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("调试菜单"); // "Debug Menu" - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("进度条测试"); // "Progress Bar Test" - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("自动回原点"); //"Auto home" - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("回X原位"); //"Home X" - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("回Y原位"); //"Home Y" - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("回Z原位"); //"Home Z" - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("自动Z对齐"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("平台调平XYZ归原位"); //"Homing XYZ" - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("单击开始热床调平"); //"Click to Begin" - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("下个热床调平点"); //"Next Point" - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("完成热床调平"); //"Leveling Done!" - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("设置原点偏移"); //"Set home offsets" - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已启用"); //"Offsets applied" - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("设置原点"); //"Set origin" - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("预热 ") PREHEAT_1_LABEL; //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("预热 ") PREHEAT_1_LABEL " ~"; //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ~"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 热床"); //MSG_PREHEAT_1 " Bed" - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 设置"); //MSG_PREHEAT_1 " conf" +#define CHARSIZE 3 - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("预热 $"); //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("预热 $ ~"); //"Preheat PREHEAT_2_LABEL" - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("预热 $ 喷嘴"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("预热 $ 喷嘴 ~"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("预热 $ 全部"); //MSG_PREHEAT_1 " All" - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("预热 $ 热床"); //MSG_PREHEAT_1 " Bed" - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("预热 $ 设置"); //MSG_PREHEAT_1 " conf" - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("预热自定义"); - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("降温"); //"Cooldown" - PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("切割频率"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("激光控制"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("激光关"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("激光开"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("激光电源"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("主轴控制"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("主轴关"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("主轴开"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("主轴电源"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("主轴反转"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("电源打开"); //"Switch power on" - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("电源关闭"); //"Switch power off" - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("挤出"); //"Extrude" - PROGMEM Language_Str MSG_RETRACT = _UxGT("回抽"); //"Retract" - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("移动轴"); //"Move axis" - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("调平热床"); //"Bed leveling" - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("调平热床"); //"Level bed" - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("调平边角"); // "Level corners" - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("下个边角"); // "Next corner" - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("网格编辑器"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("编辑网格"); // "Edit Mesh" - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("网格编辑已停止"); // "Mesh Editing Stopped" - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("探测点"); - PROGMEM Language_Str MSG_MESH_X = _UxGT("索引X"); - PROGMEM Language_Str MSG_MESH_Y = _UxGT("索引Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z 值"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("定制命令"); // "Custom Commands" - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48探测"); - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48点"); - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("M48偏差"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX模式"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("工具偏移量"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("自动停靠"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("复制"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("镜像复制"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("完全控制"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("第二喷头是X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("第二喷头是Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("第二喷头是Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("执行G29"); // "Doing G29" - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("倾斜點"); - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("手工创设网格"); // "Manually Build Mesh" - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("放置垫片并测量"); // "Place shim & measure" - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("测量"); // "Measure" - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("移除并测量热床"); // "Remove & measure bed" - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("移动到下一个"); // "Moving to next" - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("激活UBL"); // "Activate UBL" - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("关闭UBL"); // "Deactivate UBL" - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("热床温度"); // "Bed Temp" - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("热床温度"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("热端温度"); // "Hotend Temp" - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("热端温度"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("网格编辑"); // "Mesh Edit" - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("编辑客户网格"); // "Edit Custom Mesh" - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("细调网格"); // "Fine Tuning Mesh" - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("完成编辑网格"); // "Done Editing Mesh" - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("创设客户网格"); // "Build Custom Mesh" - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("创设网格"); // "Build Mesh" - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("创设 $ 网格"); // "Build PREHEAT_1_LABEL Mesh" - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 网格"); // "Validate PREHEAT_1_LABEL Mesh" - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("创设冷网格"); // "Build Cold Mesh" - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("调整网格高度"); // "Adjust Mesh Height" - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合计"); // "Height Amount" - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准网格"); // "Validate Mesh" - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客户网格"); // "Validate Custom Mesh" - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26加热热床"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26加热喷嘴"); - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("手动填装中..."); - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("固定距离填装"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("填装完成"); - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26已取消"); - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("离开G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("继续热床网格"); // "Continue Bed Mesh" - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling" - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三点调平"); // "3-Point Leveling" - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子网格调平"); // "Grid Mesh Leveling" - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("调平网格"); // "Level Mesh" - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("边点"); // "Side Points" - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("图类型"); // "Map Type" - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("输出网格图"); // "Output Mesh Map" - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("输出到主机"); // "Output for Host" - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("输出到CSV"); // "Output for CSV" - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("输出到备份"); // "Off Printer Backup" - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("输出UBL信息"); // "Output UBL Info" - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合计"); // "Fill-in Amount" - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in" - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("聪明填充"); // "Smart Fill-in" - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("填充网格"); // "Fill-in Mesh" - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("作废所有的"); // "Invalidate All" - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作废最近的"); // "Invalidate Closest" - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("细调所有的"); // "Fine Tune All" - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("细调最近的"); // "Fine Tune Closest" - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("网格存储"); // "Mesh Storage" - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("存储槽"); // "Memory Slot" - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("装载热床网格"); // "Load Bed Mesh" - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("保存热床网格"); // "Save Bed Mesh" - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("网格 %i 已装载"); // "Mesh %i loaded" - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("网格 %i 已保存"); // "Mesh %i saved" - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("没有存储"); // "No storage" - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("错误: UBL保存"); // "Err: UBL Save" - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("错误: UBL还原"); // "Err: UBL Restore" - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z偏移量: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL" - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. 创设冷网格"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. 聪明填充"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. 批准网格"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. 细调所有的"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. 批准网格"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. 细调所有的"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. 保存热床网格"); +#define WELCOME_MSG MACHINE_NAME _UxGT("已就绪.") //" ready." +#define MSG_BACK _UxGT("返回") // ”Back“ +#define MSG_SD_INSERTED _UxGT("存储卡已插入") //"Card inserted" +#define MSG_SD_REMOVED _UxGT("存储卡被拔出") //"Card removed" +#define MSG_LCD_ENDSTOPS _UxGT("挡块") //"Endstops" // Max length 8 characters +#define MSG_MAIN _UxGT("主菜单") //"Main" +#define MSG_AUTOSTART _UxGT("自动开始") //"Autostart" +#define MSG_DISABLE_STEPPERS _UxGT("关闭步进电机") //"Disable steppers" +#define MSG_DEBUG_MENU _UxGT("调试菜单") // "Debug Menu" +#define MSG_PROGRESS_BAR_TEST _UxGT("进度条测试") // "Progress Bar Test" +#define MSG_AUTO_HOME _UxGT("回原点") //"Auto home" +#define MSG_AUTO_HOME_X _UxGT("回X原位") //"Home X" +#define MSG_AUTO_HOME_Y _UxGT("回Y原位") //"Home Y" +#define MSG_AUTO_HOME_Z _UxGT("回Z原位") //"Home Z" +#define MSG_TMC_Z_CALIBRATION _UxGT("⊿校准Z") +#define MSG_LEVEL_BED_HOMING _UxGT("平台调平XYZ归原位") //"Homing XYZ" +#define MSG_LEVEL_BED_WAITING _UxGT("单击开始热床调平") //"Click to Begin" +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("下个热床调平点") //"Next Point" +#define MSG_LEVEL_BED_DONE _UxGT("完成热床调平") //"Leveling Done!" +#define MSG_Z_FADE_HEIGHT _UxGT("淡出高度") // "Fade Height" +#define MSG_SET_HOME_OFFSETS _UxGT("设置原点偏移") //"Set home offsets" +#define MSG_HOME_OFFSETS_APPLIED _UxGT("偏移已启用") //"Offsets applied" +#define MSG_SET_ORIGIN _UxGT("设置原点") //"Set origin" +#define MSG_PREHEAT_1 _UxGT("预热PLA") //"Preheat PLA" +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") //MSG_PREHEAT_1 " " +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" 全部") //MSG_PREHEAT_1 " All" +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" 热床") //MSG_PREHEAT_1 " Bed" +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" 设置") //MSG_PREHEAT_1 " conf" +#define MSG_PREHEAT_2 _UxGT("预热ABS") //"Preheat ABS" +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") //MSG_PREHEAT_2 " " +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" 全部") //MSG_PREHEAT_2 " All" +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" 热床") //MSG_PREHEAT_2 " Bed" +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" 设置") //MSG_PREHEAT_2 " conf" +#define MSG_COOLDOWN _UxGT("降温") //"Cooldown" +#define MSG_SWITCH_PS_ON _UxGT("电源打开") //"Switch power on" +#define MSG_SWITCH_PS_OFF _UxGT("电源关闭") //"Switch power off" +#define MSG_EXTRUDE _UxGT("挤出") //"Extrude" +#define MSG_RETRACT _UxGT("回抽") //"Retract" +#define MSG_MOVE_AXIS _UxGT("移动轴") //"Move axis" +#define MSG_BED_LEVELING _UxGT("调平热床") //"Bed leveling" +#define MSG_LEVEL_BED _UxGT("调平热床") //"Level bed" +#define MSG_LEVEL_CORNERS _UxGT("调平边角") // "Level corners" - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED控制"); // "LED Control") - PROGMEM Language_Str MSG_LEDS = _UxGT("灯"); // "Lights") - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("灯预置"); // "Light Presets") - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("红"); // "Red") - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange") - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("黄"); // "Yellow") - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("绿"); // "Green") - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("蓝"); // "Blue") - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo") - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet") - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("白"); // "White") - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("缺省"); // "Default") - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("定制灯"); // "Custom Lights") - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("红饱和度"); // "Red Intensity") - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("绿饱和度"); // "Green Intensity") - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("蓝饱和度"); // "Blue Intensity") - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("白饱和度"); // "White Intensity") - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness") +#define MSG_NEXT_CORNER _UxGT("下个边角") // "Next corner" +#define MSG_EDITING_STOPPED _UxGT("网格编辑已停止") // "Mesh Editing Stopped" - PROGMEM Language_Str MSG_MOVING = _UxGT("移动..."); // "Moving...") - PROGMEM Language_Str MSG_FREE_XY = _UxGT("释放 XY"); // "Free XY") - PROGMEM Language_Str MSG_MOVE_X = _UxGT("移动X"); //"Move X" - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("移动Y"); //"Move Y" - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("移动Z"); //"Move Z" - PROGMEM Language_Str MSG_MOVE_E = _UxGT("挤出机"); //"Extruder" - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("挤出机 *"); //"Extruder" - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("热端太冷"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("移动 %s mm"); //"Move 0.025mm" - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移动 0.1 mm"); //"Move 0.1mm" - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移动 1 mm"); //"Move 1mm" - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("移动 10 mm"); //"Move 10mm" - PROGMEM Language_Str MSG_SPEED = _UxGT("速率"); //"Speed" - PROGMEM Language_Str MSG_BED_Z = _UxGT("热床Z"); //"Bed Z" - PROGMEM Language_Str MSG_NOZZLE = _UxGT("喷嘴"); //"Nozzle" 噴嘴 - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("喷嘴 ~"); //"Nozzle" 噴嘴 - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("喷嘴已停靠"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("喷嘴待命中"); - PROGMEM Language_Str MSG_BED = _UxGT("热床"); //"Bed" - PROGMEM Language_Str MSG_CHAMBER = _UxGT("机箱壳"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("风扇速率"); //"Fan speed" - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("风扇速率 ~"); //"Fan speed" - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("存储的风扇 ~"); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("额外风扇速率"); // "Extra fan speed" - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("额外风扇速率 ~"); // "Extra fan speed" - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("控制器风扇"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("空闲速度"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("自动模式"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("工作速度"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("空闲周期"); - PROGMEM Language_Str MSG_FLOW = _UxGT("挤出速率"); //"Flow" - PROGMEM Language_Str MSG_FLOW_N = _UxGT("挤出速率 ~"); //"Flow" - PROGMEM Language_Str MSG_CONTROL = _UxGT("控制"); //"Control" - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); //" " LCD_STR_THERMOMETER " Min" - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); //" " LCD_STR_THERMOMETER " Max" - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 因数"); //" " LCD_STR_THERMOMETER " Fact" - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("自动控温"); //"Autotemp" - PROGMEM Language_Str MSG_LCD_ON = _UxGT("开"); //"On" - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("关"); //"Off" - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("自动PID"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("自动PID *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID调整完成"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("自动调失败. 坏的挤出机"); - PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("自动调失败. 温度太高"); - PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("自动调失败! 超时"); - PROGMEM Language_Str MSG_PID_P = _UxGT("PID-P"); - PROGMEM Language_Str MSG_PID_P_E = _UxGT("PID-P *"); - PROGMEM Language_Str MSG_PID_I = _UxGT("PID-I"); - PROGMEM Language_Str MSG_PID_I_E = _UxGT("PID-I *"); - PROGMEM Language_Str MSG_PID_D = _UxGT("PID-D"); - PROGMEM Language_Str MSG_PID_D_E = _UxGT("PID-D *"); - PROGMEM Language_Str MSG_PID_C = _UxGT("PID-C"); - PROGMEM Language_Str MSG_PID_C_E = _UxGT("PID-C *"); - PROGMEM Language_Str MSG_PID_F = _UxGT("PID-F"); - PROGMEM Language_Str MSG_PID_F_E = _UxGT("PID-F *"); - PROGMEM Language_Str MSG_SELECT = _UxGT("选择"); //"Select" - PROGMEM Language_Str MSG_SELECT_E = _UxGT("选择 *"); - PROGMEM Language_Str MSG_ACC = _UxGT("加速度"); //"Accel" acceleration - PROGMEM Language_Str MSG_JERK = _UxGT("抖动速率"); // "Jerk" - PROGMEM Language_Str MSG_VA_JERK = _UxGT("轴抖动速率") LCD_STR_A; //"Va-jerk" - PROGMEM Language_Str MSG_VB_JERK = _UxGT("轴抖动速率") LCD_STR_B; //"Vb-jerk" - PROGMEM Language_Str MSG_VC_JERK = _UxGT("轴抖动速率") LCD_STR_C; //"Vc-jerk" - PROGMEM Language_Str MSG_VE_JERK = _UxGT("挤出机抖动速率"); //"Ve-jerk" - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("接点差"); - PROGMEM Language_Str MSG_VELOCITY = _UxGT("速度"); // "Velocity" - PROGMEM Language_Str MSG_VMAX_A = _UxGT("最大进料速率") LCD_STR_A; //"Vmax " max_feedrate_mm_s - PROGMEM Language_Str MSG_VMAX_B = _UxGT("最大进料速率") LCD_STR_B; //"Vmax " max_feedrate_mm_s - PROGMEM Language_Str MSG_VMAX_C = _UxGT("最大进料速率") LCD_STR_C; //"Vmax " max_feedrate_mm_s - PROGMEM Language_Str MSG_VMAX_E = _UxGT("最大进料速率") LCD_STR_E; //"Vmax " max_feedrate_mm_s - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("最大进料速率 *"); //"Vmax " max_feedrate_mm_s - PROGMEM Language_Str MSG_VMIN = _UxGT("最小进料速率"); //"Vmin" min_feedrate_mm_s - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("最小移动速率"); //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" - PROGMEM Language_Str MSG_AMAX_A = _UxGT("最大打印加速度") LCD_STR_A; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves - PROGMEM Language_Str MSG_AMAX_B = _UxGT("最大打印加速度") LCD_STR_B; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves - PROGMEM Language_Str MSG_AMAX_C = _UxGT("最大打印加速度") LCD_STR_C; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves - PROGMEM Language_Str MSG_AMAX_E = _UxGT("最大打印加速度") LCD_STR_E; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("最大打印加速度 *"); //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("收进加速度"); //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("非打印移动加速度"); //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("频率最大"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("进给速度"); - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("轴步数/mm"); //"Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("步数/mm"); //"Asteps/mm" - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("步数/mm"); //"Bsteps/mm" - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("步数/mm"); //"Csteps/mm" - PROGMEM Language_Str MSG_E_STEPS = _UxGT("E 步数/mm"); //"Esteps/mm" - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* 步数/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("温度"); //"Temperature" - PROGMEM Language_Str MSG_MOTION = _UxGT("运动"); //"Motion" - PROGMEM Language_Str MSG_FILAMENT = _UxGT("料丝"); //"Filament" menu_advanced_filament - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E 在 mm³"); //"E in mm3" volumetric_enabled - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E 限制 在 mm³"); - PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E 限制 *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("丝料直径"); //"Fil. Dia." - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("丝料直径 *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("卸载 mm"); // "Unload mm" - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("装载 mm"); // "Load mm" - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advance K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD对比度"); //"LCD contrast" - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("保存设置"); //"Store memory" - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("装载设置"); //"Load memory" - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("恢复安全值"); //"Restore Defaults" - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("初始化设置"); // "Initialize EEPROM" - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC 错误"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index 错误"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version 错误"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("设置已保存"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("存储器更新"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("复位打印机"); - PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("刷新"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("信息屏"); //"Info screen" - PROGMEM Language_Str MSG_PREPARE = _UxGT("准备"); //"Prepare" - PROGMEM Language_Str MSG_TUNE = _UxGT("调整"); //"Tune" - PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("电源监控"); - PROGMEM Language_Str MSG_CURRENT = _UxGT("电流"); - PROGMEM Language_Str MSG_VOLTAGE = _UxGT("电压"); - PROGMEM Language_Str MSG_POWER = _UxGT("功率"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("开始打印"); - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("下一个"); - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("初始"); - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("停止"); - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("打印"); - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("复位"); - PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("忽略"); - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("取消"); - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("完成"); - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("返回"); - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("继续"); - PROGMEM Language_Str MSG_PAUSING = _UxGT("暂停中..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("暂停打印"); //"Pause print" - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("恢复打印"); //"Resume print" - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("停止打印"); //"Stop print" - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("打印物体"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("取消物体"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("取消物体 ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("中断恢复"); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("从存储卡上打印"); //"Print from SD" - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("无存储卡"); //"No SD card" - PROGMEM Language_Str MSG_DWELL = _UxGT("休眠中 ..."); //"Sleep..." - PROGMEM Language_Str MSG_USERWAIT = _UxGT("点击继续 ..."); //"Click to resume..." - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("暫停打印"); // "Print paused" - PROGMEM Language_Str MSG_PRINTING = _UxGT("打印中..."); - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("已取消打印"); //"Print aborted" - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("打印已完成"); - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("无移动"); //"No move." - PROGMEM Language_Str MSG_KILLED = _UxGT("已杀掉"); //"KILLED. " - PROGMEM Language_Str MSG_STOPPED = _UxGT("已停止"); //"STOPPED. " - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("回抽长度mm"); //"Retract mm" retract_length, retract length (positive mm) - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("换手回抽长度mm"); //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回抽速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); //"Hop mm" retract_zraise, retract Z-lift - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("回抽恢复长度mm"); //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("换手回抽恢复长度mm"); //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回抽恢复后进料速率mm/s"); //"Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自动抽回"); //"Auto-Retract" autoretract_enabled, - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("交换长度"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("额外的交换"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("清洗长度"); - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("换工具"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z抬起"); - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("进给速度"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("回抽速度"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("停靠头"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("恢复速度"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("风扇速度"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("风扇时间"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("自动开"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("自动关"); - PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("工具迁移"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("自动迁移"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("上一个挤出机"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("迁移至 *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("更换丝料"); //"Change filament" - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("更换丝料 *"); //"Change filament" - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("装载丝料"); // "Load filament" - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("装载丝料 *"); // "Load filament" - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("卸载丝料"); // "Unload filament" - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("卸载丝料 *"); // "Unload filament" - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("卸载全部"); // "Unload All" - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("初始化存储卡"); //"Init. SD card" - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("更换存储卡"); //"Change SD card" - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("释放存储卡"); - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z探针在热床之外"); //"Z probe out. bed" Z probe is not within the physical limits - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("偏斜因数"); // "Skew Factor" - PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); // "BLTouch" - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("自检"); - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("重置"); - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("装载"); - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("部署"); - PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW模式"); - PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V模式"); - PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD模式"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("模式保存"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("设置BLTouch为5V"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("设置BLTouch为OD"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("报告开漏"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("危险: 错误的设置将引起损坏! 是否继续?"); - PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("初始化TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z偏移量测试"); - PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("保存"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("部署TouchMI"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("部署Z探针"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("收好Z探针"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("归位 %s%s%s 先"); //"Home ... first" - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("探针偏移量"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("探针X偏移"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("探针Y偏移"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("探针Z偏移"); //"Z Offset" - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("微量调整X轴"); //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("微量调整Y轴"); //"Babystep Y" - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("微量调整Z轴"); //"Babystep Z" - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("总计"); - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("挡块终止"); //"Endstop abort" - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("加热失败"); //"Heating failed" - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("错误:冗余温度"); //"Err: REDUNDANT TEMP" - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("温控失控"); //"THERMAL RUNAWAY" - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("热床热量失控"); - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("机箱热量失控"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("错误:最高温度"); //"Err: MAXTEMP" - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("错误:最低温度"); //"Err: MINTEMP" - PROGMEM Language_Str MSG_HALTED = _UxGT("打印停机"); //"PRINTER HALTED" - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("请重置"); //"Please reset" - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("天"); //"d" // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("时"); //"h" // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("分"); //"m" // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("加热中 ..."); //"Heating..." - PROGMEM Language_Str MSG_COOLING = _UxGT("冷却中 ..."); - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("加热热床中 ..."); //"Bed Heating..." - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("热床冷却中 ..."); - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("机箱加热中 ..."); - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("机箱冷却中 ..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("⊿校准"); //"Delta Calibration" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("⊿校准X"); //"Calibrate X" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校准Y"); //"Calibrate Y" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校准Z"); //"Calibrate Z" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校准中心"); //"Calibrate Center" - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("⊿设置"); // "Delta Settings" - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自动校准"); // "Auto Calibration" - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("设置⊿高度"); // "Set Delta Height" - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("探针Z偏移量"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("⊿半径"); // "Radius" - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("关于打印机"); //"About Printer" - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("打印机信息"); //"Printer Info" - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("三点调平"); // "3-Point Leveling" - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("线性调平"); // "Linear Leveling" - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("双线性调平"); // "Bilinear Leveling" - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling" - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("打印机统计"); //"Printer Stats" - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("主板信息"); //"Board Info" - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("温度计"); //"Thermistors" - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("挤出机"); //"Extruders" - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("波特率"); //"Baud" - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("协议"); //"Protocol" - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("监控温度失控:关"); - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("监控温度失控:开"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("热端空闲超时"); +#define MSG_USER_MENU _UxGT("定制命令") // "Custom Commands" +#define MSG_UBL_DOING_G29 _UxGT("执行G29") // "Doing G29" +#define MSG_UBL_UNHOMED _UxGT("先回XYZ原点") // "Home XYZ first" +#define MSG_UBL_TOOLS _UxGT("UBL工具") // "UBL Tools" +#define MSG_UBL_LEVEL_BED _UxGT("统一热床调平(UBL)") // "Unified Bed Leveling" +#define MSG_UBL_MANUAL_MESH _UxGT("手工创设网格") // "Manually Build Mesh" - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("外壳灯"); // "Case light" - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("灯亮度"); // "Light BRIGHTNESS" +#define MSG_UBL_BC_INSERT _UxGT("放置垫片并测量") // "Place shim & measure" +#define MSG_UBL_BC_INSERT2 _UxGT("测量") // "Measure" +#define MSG_UBL_BC_REMOVE _UxGT("移除并测量热床") // "Remove & measure bed" +#define MSG_UBL_MOVING_TO_NEXT _UxGT("移动到下一个") // "Moving to next" +#define MSG_UBL_ACTIVATE_MESH _UxGT("激活UBL") // "Activate UBL" +#define MSG_UBL_DEACTIVATE_MESH _UxGT("关闭UBL") // "Deactivate UBL" +#define MSG_UBL_SET_BED_TEMP _UxGT("设置热床温度") // "Bed Temp" +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("热端温度") // "Hotend Temp" +#define MSG_UBL_MESH_EDIT _UxGT("网格编辑") // "Mesh Edit" +#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("编辑客户网格") // "Edit Custom Mesh" +#define MSG_UBL_FINE_TUNE_MESH _UxGT("细调网格") // "Fine Tuning Mesh" +#define MSG_UBL_DONE_EDITING_MESH _UxGT("完成编辑网格") // "Done Editing Mesh" +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("创设客户网格") // "Build Custom Mesh" +#define MSG_UBL_BUILD_MESH_MENU _UxGT("创设网格") // "Build Mesh" +#define MSG_UBL_BUILD_PLA_MESH _UxGT("创设PLA网格") // "Build PLA Mesh" +#define MSG_UBL_BUILD_ABS_MESH _UxGT("创设ABS网格") // "Build ABS Mesh" +#define MSG_UBL_BUILD_COLD_MESH _UxGT("创设冷网格") // "Build Cold Mesh" +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("调整网格高度") // "Adjust Mesh Height" +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("高度合计") // "Height Amount" +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("批准网格") // "Validate Mesh" +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("批准PLA网格") // "Validate PLA Mesh" +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("批准ABS网格") // "Validate ABS Mesh" +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("批准客户网格") // "Validate Custom Mesh" +#define MSG_UBL_CONTINUE_MESH _UxGT("继续热床网格") // "Continue Bed Mesh" +#define MSG_UBL_MESH_LEVELING _UxGT("网格调平") // "Mesh Leveling" +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("三点调平") // "3-Point Leveling" +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("格子网格调平") // "Grid Mesh Leveling" +#define MSG_UBL_MESH_LEVEL _UxGT("调平网格") // "Level Mesh" +#define MSG_UBL_SIDE_POINTS _UxGT("边点") // "Side Points" +#define MSG_UBL_MAP_TYPE _UxGT("图类型") // "Map Type" +#define MSG_UBL_OUTPUT_MAP _UxGT("输出网格图") // "Output Mesh Map" +#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("输出到主机") // "Output for Host" +#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("输出到CSV") // "Output for CSV" +#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("输出到备份") // "Off Printer Backup" +#define MSG_UBL_INFO_UBL _UxGT("输出UBL信息") // "Output UBL Info" +#define MSG_UBL_EDIT_MESH_MENU _UxGT("编辑网格") // "Edit Mesh" +#define MSG_UBL_FILLIN_AMOUNT _UxGT("填充合计") // "Fill-in Amount" +#define MSG_UBL_MANUAL_FILLIN _UxGT("手工填充") // "Manual Fill-in" +#define MSG_UBL_SMART_FILLIN _UxGT("聪明填充") // "Smart Fill-in" +#define MSG_UBL_FILLIN_MESH _UxGT("填充网格") // "Fill-in Mesh" +#define MSG_UBL_INVALIDATE_ALL _UxGT("作废所有的") // "Invalidate All" +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("作废最近的") // "Invalidate Closest" +#define MSG_UBL_FINE_TUNE_ALL _UxGT("细调所有的") // "Fine Tune All" +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("细调最近的") // "Fine Tune Closest" +#define MSG_UBL_STORAGE_MESH_MENU _UxGT("网格存储") // "Mesh Storage" +#define MSG_UBL_STORAGE_SLOT _UxGT("存储槽") // "Memory Slot" +#define MSG_UBL_LOAD_MESH _UxGT("装载热床网格") // "Load Bed Mesh" +#define MSG_UBL_SAVE_MESH _UxGT("保存热床网格") // "Save Bed Mesh" +#define MSG_MESH_LOADED _UxGT("网格 %i 已装载") // "Mesh %i loaded" +#define MSG_MESH_SAVED _UxGT("网格 %i 已保存") // "Mesh %i saved" +#define MSG_NO_STORAGE _UxGT("没有存储") // "No storage" +#define MSG_UBL_SAVE_ERROR _UxGT("错误: UBL保存") // "Err: UBL Save" +#define MSG_UBL_RESTORE_ERROR _UxGT("错误: UBL还原") // "Err: UBL Restore" +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z偏移已停止") // "Z-Offset Stopped" +#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("一步步UBL") // "Step-By-Step UBL" - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("打印机不正确"); // "The printer is incorrect" +#define MSG_LED_CONTROL _UxGT("灯管控制") // "LED Control") +#define MSG_LEDS _UxGT("灯") // "Lights") +#define MSG_LED_PRESETS _UxGT("灯预置") // "Light Presets") +#define MSG_SET_LEDS_RED _UxGT("红") // "Red") +#define MSG_SET_LEDS_ORANGE _UxGT("橙") // "Orange") +#define MSG_SET_LEDS_YELLOW _UxGT("黄") // "Yellow") +#define MSG_SET_LEDS_GREEN _UxGT("绿") // "Green") +#define MSG_SET_LEDS_BLUE _UxGT("蓝") // "Blue") +#define MSG_SET_LEDS_INDIGO _UxGT("青") // "Indigo") +#define MSG_SET_LEDS_VIOLET _UxGT("紫") // "Violet") +#define MSG_SET_LEDS_WHITE _UxGT("白") // "White") +#define MSG_SET_LEDS_DEFAULT _UxGT("缺省") // "Default") +#define MSG_CUSTOM_LEDS _UxGT("定制灯") // "Custom Lights") +#define MSG_INTENSITY_R _UxGT("红饱和度") // "Red Intensity") +#define MSG_INTENSITY_G _UxGT("绿饱和度") // "Green Intensity") +#define MSG_INTENSITY_B _UxGT("蓝饱和度") // "Blue Intensity") +#define MSG_INTENSITY_W _UxGT("白饱和度") // "White Intensity") +#define MSG_LED_BRIGHTNESS _UxGT("亮度") // "Brightness") +#define MSG_MOVING _UxGT("移动 ...") // "Moving...") +#define MSG_FREE_XY _UxGT("释放 XY") // "Free XY") - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("打印计数"); //"Print Count" - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("完成了"); //"Completed" - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("总打印时间"); //"Total print time" - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("最长工作时间"); //"Longest job time" - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("总计挤出"); //"Extruded total" - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("打印数"); //"Prints" - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); //"Completed" - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("总共"); //"Total" - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("最长"); //"Longest" - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("已挤出"); //"Extruded" - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("最低温度"); //"Min Temp" - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("最高温度"); //"Max Temp" - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("电源供应"); //"Power Supply" - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("驱动力度"); // "Drive Strength" - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X 驱动 %"); // "X Driver %" - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y 驱动 %"); // "Y Driver %" - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z 驱动 %"); // "Z Driver %" - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E 驱动 %"); // "E Driver %" - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC 连接错误"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("保存驱动设置"); // "DAC EEPROM Write" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("更换料"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("打印已暂停"); // "PRINT PAUSED" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("装载丝料"); // "LOAD FILAMENT" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸载丝料"); // "UNLOAD FILAMENT" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢复选项:"); // "RESUME OPTIONS:" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢复打印"); //"Resume print" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 喷嘴: "); // " Nozzle: " - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("断料传感器"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("断料距离mm"); - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("归原位失败"); // "Homing failed" - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("探针探测失败"); // "Probing failed" - - PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("选择料"); - PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("升级MMU固件!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU需要专注."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("MMU恢复"); - PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("MMU恢复中..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU加载"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("MMU加载全部"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU加载到喷嘴"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU弹出"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU弹出 ~"); - PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU卸载"); - PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("加载填充. %i..."); - PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("弹出填充. ..."); - PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("卸载填充...."); - PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("全部"); - PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("料 ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("复位MMU"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU复位中..."); - PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("移出, 按下"); - - PROGMEM Language_Str MSG_MIX = _UxGT("混合"); - PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("器件 ="); - PROGMEM Language_Str MSG_MIXER = _UxGT("混合器"); - PROGMEM Language_Str MSG_GRADIENT = _UxGT("梯度"); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("全梯度"); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("开关混合"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("循环混合"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("梯度混合"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("反向梯度"); - PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("激活 V-tool"); - PROGMEM Language_Str MSG_START_VTOOL = _UxGT("开始 V-tool"); - PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" 结束 V-tool"); - PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("别名 V-tool"); - PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("复位 V-tools"); - PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("提交 V-tool Mix"); - PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools 已复位"); - PROGMEM Language_Str MSG_START_Z = _UxGT("开始 Z:"); - PROGMEM Language_Str MSG_END_Z = _UxGT(" 结束 Z:"); - - PROGMEM Language_Str MSG_GAMES = _UxGT("游戏"); - PROGMEM Language_Str MSG_BRICKOUT = _UxGT("敲方块"); - PROGMEM Language_Str MSG_INVADERS = _UxGT("入侵者"); - PROGMEM Language_Str MSG_SNAKE = _UxGT("贪吃蛇"); - PROGMEM Language_Str MSG_MAZE = _UxGT("迷宫"); - - PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("错误页面索引"); - PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("错误页面速度"); - - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("按下按钮", "恢复打印")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停靠中...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待开始", "丝料", "变更")); // "Wait for start of the filament change" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入料", "并按下", "以继续")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按钮来", "加热喷嘴.")); // "Press button to heat nozzle." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加热喷嘴", "请等待 ...")); // "Heating nozzle Please wait..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下丝料")); // "Wait for filament unload" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "进料")); // "Wait for filament load" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "丝料清除")); // "Wait for filament purge" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("按下已完成", "料的清洗")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待打印", "恢复")); // "Wait for print to resume" - #else - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("按下继续")); - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停靠中...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("请等待 ...")); //"Please wait..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入并单击")); //"Insert and Click" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("按下加热")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加热中 ...")); // "Heating..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); //"Ejecting..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("装载中 ...")); //"Loading..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("按下完成")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢复中 ...")); //"Resuming..." - #endif - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC驱动器"); - PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("驱动电流"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("混合阈值"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("无感回零"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("步进模式"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop已使能"); - PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("复位"); - PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" 在:"); - PROGMEM Language_Str MSG_BACKLASH = _UxGT("回差"); - PROGMEM Language_Str MSG_BACKLASH_A = LCD_STR_A; - PROGMEM Language_Str MSG_BACKLASH_B = LCD_STR_B; - PROGMEM Language_Str MSG_BACKLASH_C = LCD_STR_C; - PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("校正"); - PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("平滑的"); - - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X轴调平"); - PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("自动校准"); - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("加热器超时"); - PROGMEM Language_Str MSG_REHEAT = _UxGT("重新加热"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("重新加热中..."); -} - -#if FAN_COUNT == 1 - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#define MSG_MOVE_X _UxGT("移动X") //"Move X" +#define MSG_MOVE_Y _UxGT("移动Y") //"Move Y" +#define MSG_MOVE_Z _UxGT("移动Z") //"Move Z" +#define MSG_MOVE_E _UxGT("挤出机") //"Extruder" +#define MSG_MOVE_01MM _UxGT("移动 0.1 mm") //"Move 0.1mm" +#define MSG_MOVE_1MM _UxGT("移动 1 mm") //"Move 1mm" +#define MSG_MOVE_10MM _UxGT("移动 10 mm") //"Move 10mm" +#define MSG_SPEED _UxGT("速率") //"Speed" +#define MSG_BED_Z _UxGT("热床Z") //"Bed Z" +#define MSG_NOZZLE _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 喷嘴") //"Nozzle" 噴嘴 +#define MSG_BED _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 热床") //"Bed" +#define MSG_FAN_SPEED _UxGT("风扇速率") //"Fan speed" +#define MSG_EXTRA_FAN_SPEED _UxGT("额外风扇速率") // "Extra fan speed" +#define MSG_FLOW _UxGT("挤出速率") //"Flow" +#define MSG_CONTROL _UxGT("控制") //"Control" +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 最小") //" " LCD_STR_THERMOMETER " Min" +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 最大") //" " LCD_STR_THERMOMETER " Max" +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 因数") //" " LCD_STR_THERMOMETER " Fact" +#define MSG_AUTOTEMP _UxGT("自动控温") //"Autotemp" +#define MSG_ON _UxGT("开 ") //"On " +#define MSG_OFF _UxGT("关 ") //"Off" +#define MSG_PID_P _UxGT("PID-P") //"PID-P" +#define MSG_PID_I _UxGT("PID-I") //"PID-I" +#define MSG_PID_D _UxGT("PID-D") //"PID-D" +#define MSG_PID_C _UxGT("PID-C") //"PID-C" +#define MSG_SELECT _UxGT("选择") //"Select" +#define MSG_ACC _UxGT("加速度") //"Accel" acceleration +#define MSG_JERK _UxGT("抖动速率") // "Jerk" +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("A轴抖动速率") //"Va-jerk" + #define MSG_VB_JERK _UxGT("B轴抖动速率") //"Vb-jerk" + #define MSG_VC_JERK _UxGT("C轴抖动速率") //"Vc-jerk" #else - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_VA_JERK _UxGT("X轴抖动速率") //"Vx-jerk" + #define MSG_VB_JERK _UxGT("Y轴抖动速率") //"Vy-jerk" + #define MSG_VC_JERK _UxGT("Z轴抖动速率") //"Vz-jerk" #endif +#define MSG_VE_JERK _UxGT("挤出机抖动速率") //"Ve-jerk" +#define MSG_VELOCITY _UxGT("速度") // "Velocity" +#define MSG_VMAX _UxGT("最大进料速率") //"Vmax " max_feedrate_mm_s +#define MSG_VMIN _UxGT("最小进料速率") //"Vmin" min_feedrate_mm_s +#define MSG_VTRAV_MIN _UxGT("最小移动速率") //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move +#define MSG_ACCELERATION _UxGT("加速度") // "Acceleration" +#define MSG_AMAX _UxGT("最大打印加速度") //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves +#define MSG_A_RETRACT _UxGT("收进加速度") //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts +#define MSG_A_TRAVEL _UxGT("非打印移动加速度") //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves +#define MSG_STEPS_PER_MM _UxGT("轴步数/mm") //"Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("A轴步数/mm") //"Asteps/mm" + #define MSG_BSTEPS _UxGT("B轴步数/mm") //"Bsteps/mm" + #define MSG_CSTEPS _UxGT("C轴步数/mm") //"Csteps/mm" +#else + #define MSG_ASTEPS _UxGT("X轴步数/mm") //"Xsteps/mm" + #define MSG_BSTEPS _UxGT("Y轴步数/mm") //"Ysteps/mm" + #define MSG_CSTEPS _UxGT("Z轴步数/mm") //"Zsteps/mm" +#endif +#define MSG_ESTEPS _UxGT("挤出机步数/mm") //"Esteps/mm" +#define MSG_E1STEPS _UxGT("挤出机1步数/mm") //"E1steps/mm" +#define MSG_E2STEPS _UxGT("挤出机2步数/mm") //"E2steps/mm" +#define MSG_E3STEPS _UxGT("挤出机3步数/mm") //"E3steps/mm" +#define MSG_E4STEPS _UxGT("挤出机4步数/mm") //"E4steps/mm" +#define MSG_E5STEPS _UxGT("挤出机5步数/mm") //"E5steps/mm" +#define MSG_TEMPERATURE _UxGT("温度") //"Temperature" +#define MSG_MOTION _UxGT("运动") //"Motion" +#define MSG_FILAMENT _UxGT("丝料测容") //"Filament" lcd_control_volumetric_menu +#define MSG_VOLUMETRIC_ENABLED _UxGT("测容积mm³") //"E in mm3" volumetric_enabled +#define MSG_FILAMENT_DIAM _UxGT("丝料直径") //"Fil. Dia." +#define MSG_FILAMENT_UNLOAD _UxGT("卸载 mm") // "Unload mm" +#define MSG_FILAMENT_LOAD _UxGT("装载 mm") // "Load mm" +#define MSG_ADVANCE_K _UxGT("Advance K") // "Advance K" +#define MSG_CONTRAST _UxGT("LCD对比度") //"LCD contrast" +#define MSG_STORE_EEPROM _UxGT("保存设置") //"Store memory" +#define MSG_LOAD_EEPROM _UxGT("装载设置") //"Load memory" +#define MSG_RESTORE_FAILSAFE _UxGT("恢复安全值") //"Restore failsafe" +#define MSG_INIT_EEPROM _UxGT("初始化设置") // "Initialize EEPROM" +#define MSG_REFRESH _UxGT("刷新") //"Refresh" +#define MSG_WATCH _UxGT("信息屏") //"Info screen" +#define MSG_PREPARE _UxGT("准备") //"Prepare" +#define MSG_TUNE _UxGT("调整") //"Tune" +#define MSG_PAUSE_PRINT _UxGT("暂停打印") //"Pause print" +#define MSG_RESUME_PRINT _UxGT("恢复打印") //"Resume print" +#define MSG_STOP_PRINT _UxGT("停止打印") //"Stop print" +#define MSG_CARD_MENU _UxGT("从存储卡上打印") //"Print from SD" +#define MSG_NO_CARD _UxGT("无存储卡") //"No SD card" +#define MSG_DWELL _UxGT("休眠中 ...") //"Sleep..." +#define MSG_USERWAIT _UxGT("点击继续 ...") //"Click to resume..." +#define MSG_PRINT_PAUSED _UxGT("暫停打印") // "Print paused" +#define MSG_PRINT_ABORTED _UxGT("已取消打印") //"Print aborted" +#define MSG_NO_MOVE _UxGT("无移动") //"No move." +#define MSG_KILLED _UxGT("已杀掉") //"KILLED. " +#define MSG_STOPPED _UxGT("已停止") //"STOPPED. " +#define MSG_CONTROL_RETRACT _UxGT("回抽长度mm") //"Retract mm" retract_length, retract length (positive mm) +#define MSG_CONTROL_RETRACT_SWAP _UxGT("换手回抽长度mm") //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change +#define MSG_CONTROL_RETRACTF _UxGT("回抽速率mm/s") //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Hop mm") //"Hop mm" retract_zlift, retract Z-lift +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("回抽恢复长度mm") //"UnRet +mm" retract_recover_length, additional recover length (mm, added to retract length when recovering) +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("换手回抽恢复长度mm") //"S UnRet+mm" swap_retract_recover_length, additional swap recover length (mm, added to retract length when recovering from extruder change) +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("回抽恢复后进料速率mm/s") //"UnRet V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) +#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") // "S UnRet V" +#define MSG_AUTORETRACT _UxGT("自动抽回") //"AutoRetr." autoretract_enabled, +#define MSG_FILAMENTCHANGE _UxGT("更换丝料") //"Change filament" +#define MSG_FILAMENTLOAD _UxGT("装载丝料") // "Load filament" +#define MSG_FILAMENTUNLOAD _UxGT("卸载丝料") // "Unload filament" +#define MSG_FILAMENTUNLOAD_ALL _UxGT("卸载全部") // "Unload All" +#define MSG_INIT_SDCARD _UxGT("初始化存储卡") //"Init. SD card" +#define MSG_CNG_SDCARD _UxGT("更换存储卡") //"Change SD card" +#define MSG_ZPROBE_OUT _UxGT("Z探针在热床之外") //"Z probe out. bed" Z probe is not within the physical limits +#define MSG_SKEW_FACTOR _UxGT("偏斜因数") // "Skew Factor" +#define MSG_BLTOUCH _UxGT("BLTouch") // "BLTouch" +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch 自检") // "BLTouch Self-Test" +#define MSG_BLTOUCH_RESET _UxGT("重置BLTouch") // "Reset BLTouch" +#define MSG_BLTOUCH_DEPLOY _UxGT("部署BLTouch") // "Deploy BLTouch" +#define MSG_BLTOUCH_STOW _UxGT("装载BLTouch") // "Stow BLTouch" +#define MSG_HOME _UxGT("归位") //"Home" // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("先") //"first" +#define MSG_ZPROBE_ZOFFSET _UxGT("Z偏移") //"Z Offset" +#define MSG_BABYSTEP_X _UxGT("微量调整X轴") //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts +#define MSG_BABYSTEP_Y _UxGT("微量调整Y轴") //"Babystep Y" +#define MSG_BABYSTEP_Z _UxGT("微量调整Z轴") //"Babystep Z" +#define MSG_ENDSTOP_ABORT _UxGT("挡块终止") //"Endstop abort" +#define MSG_HEATING_FAILED_LCD _UxGT("加热失败") //"Heating failed" +#define MSG_ERR_REDUNDANT_TEMP _UxGT("错误:REDUNDANT TEMP") //"Err: REDUNDANT TEMP" +#define MSG_THERMAL_RUNAWAY _UxGT("温控失控") //"THERMAL RUNAWAY" +#define MSG_ERR_MAXTEMP _UxGT("错误:最高温度") //"Err: MAXTEMP" +#define MSG_ERR_MINTEMP _UxGT("错误:最低温度") //"Err: MINTEMP" +#define MSG_ERR_MAXTEMP_BED _UxGT("错误:最高热床温度") //"Err: MAXTEMP BED" +#define MSG_ERR_MINTEMP_BED _UxGT("错误:最低热床温度") //"Err: MINTEMP BED" +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("打印停机") //"PRINTER HALTED" +#define MSG_PLEASE_RESET _UxGT("请重置") //"Please reset" +#define MSG_SHORT_DAY _UxGT("天") //"d" // One character only +#define MSG_SHORT_HOUR _UxGT("时") //"h" // One character only +#define MSG_SHORT_MINUTE _UxGT("分") //"m" // One character only +#define MSG_HEATING _UxGT("加热中 ...") //"Heating..." +#define MSG_BED_HEATING _UxGT("加热热床中 ...") //"Bed Heating..." +#define MSG_DELTA_CALIBRATE _UxGT("⊿校准") //"Delta Calibration" +#define MSG_DELTA_CALIBRATE_X _UxGT("⊿校准X") //"Calibrate X" +#define MSG_DELTA_CALIBRATE_Y _UxGT("⊿校准Y") //"Calibrate Y" +#define MSG_DELTA_CALIBRATE_Z _UxGT("⊿校准Z") //"Calibrate Z" +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("⊿校准中心") //"Calibrate Center" +#define MSG_DELTA_SETTINGS _UxGT("⊿设置") // "Delta Settings" +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("⊿自动校准") // "Auto Calibration" +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("设置⊿高度") // "Set Delta Height" +#define MSG_DELTA_DIAG_ROD _UxGT("⊿斜柱") // "Diag Rod" +#define MSG_DELTA_HEIGHT _UxGT("⊿高度") // "Height" +#define MSG_DELTA_RADIUS _UxGT("⊿半径") // "Radius" +#define MSG_INFO_MENU _UxGT("关于打印机") //"About Printer" +#define MSG_INFO_PRINTER_MENU _UxGT("打印机信息") //"Printer Info" +#define MSG_3POINT_LEVELING _UxGT("三点调平") // "3-Point Leveling" +#define MSG_LINEAR_LEVELING _UxGT("线性调平") // "Linear Leveling" +#define MSG_BILINEAR_LEVELING _UxGT("双线性调平") // "Bilinear Leveling" +#define MSG_UBL_LEVELING _UxGT("统一热床调平(UBL)") // "Unified Bed Leveling" +#define MSG_MESH_LEVELING _UxGT("网格调平") // "Mesh Leveling" +#define MSG_INFO_STATS_MENU _UxGT("打印机统计") //"Printer Stats" +#define MSG_INFO_BOARD_MENU _UxGT("主板信息") //"Board Info" +#define MSG_INFO_THERMISTOR_MENU _UxGT("温度计") //"Thermistors" +#define MSG_INFO_EXTRUDERS _UxGT("挤出机") //"Extruders" +#define MSG_INFO_BAUDRATE _UxGT("波特率") //"Baud" +#define MSG_INFO_PROTOCOL _UxGT("协议") //"Protocol" +#define MSG_CASE_LIGHT _UxGT("外壳灯") // "Case light" +#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("灯亮度") // "Light BRIGHTNESS" + +#if LCD_WIDTH > 19 +#define MSG_INFO_PRINT_COUNT _UxGT("打印计数") //"Print Count" +#define MSG_INFO_COMPLETED_PRINTS _UxGT("完成了") //"Completed" +#define MSG_INFO_PRINT_TIME _UxGT("总打印时间") //"Total print time" +#define MSG_INFO_PRINT_LONGEST _UxGT("最长工作时间") //"Longest job time" +#define MSG_INFO_PRINT_FILAMENT _UxGT("总计挤出") //"Extruded total" +#else +#define MSG_INFO_PRINT_COUNT _UxGT("打印数") //"Prints" +#define MSG_INFO_COMPLETED_PRINTS _UxGT("完成") //"Completed" +#define MSG_INFO_PRINT_TIME _UxGT("总共") //"Total" +#define MSG_INFO_PRINT_LONGEST _UxGT("最长") //"Longest" +#define MSG_INFO_PRINT_FILAMENT _UxGT("已挤出") //"Extruded" +#endif + +#define MSG_INFO_MIN_TEMP _UxGT("最低温度") //"Min Temp" +#define MSG_INFO_MAX_TEMP _UxGT("最高温度") //"Max Temp" +#define MSG_INFO_PSU _UxGT("电源供应") //"Power Supply" +#define MSG_DRIVE_STRENGTH _UxGT("驱动力度") // "Drive Strength" +#define MSG_DAC_PERCENT _UxGT("驱动 %") // "Driver %" +#define MSG_DAC_EEPROM_WRITE _UxGT("保存驱动设置") // "DAC EEPROM Write" +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("打印已暂停") // "PRINT PAUSED" +#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("装载丝料") // "LOAD FILAMENT" +#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("卸载丝料") // "UNLOAD FILAMENT" +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("恢复选项:") // "RESUME OPTIONS:" +#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("清除更多") // "Purge more" +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("恢复打印") //"Resume print" +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" 喷嘴: ") // " Nozzle: " +#define MSG_ERR_HOMING_FAILED _UxGT("归原位失败") // "Homing failed" +#define MSG_ERR_PROBING_FAILED _UxGT("探针探测失败") // "Probing failed" +#define MSG_M600_TOO_COLD _UxGT("M600: 太凉") // "M600: Too cold" + +#if LCD_HEIGHT >= 4 +#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("等待开始") //"Wait for start" +#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("丝料") //"of the filament" +#define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("变更") //"change" +#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("等待") //"Wait for" +#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("卸下丝料") //"filament unload" +#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入丝料") //"Insert filament" +#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("并按键") //"and press button" +#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("来继续 ...") //"to continue..." +#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("按下按钮来") // "Press button to" +#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("加热喷嘴.") // "heat nozzle." +#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加热喷嘴") // "Heating nozzle" +#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("请等待 ...") // "Please wait..." +#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("等待") //"Wait for" +#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("进料") //"filament load" +#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("等待") // "Wait for" +#define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("丝料清除") // "filament purge" +#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("等待打印") //"Wait for print" +#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("恢复") //"to resume" + +#else // LCD_HEIGHT < 4 +#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("请等待 ...") //"Please wait..." +#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("退出中 ...") //"Ejecting..." +#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入并单击") //"Insert and Click" +#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加热中 ...") // "Heating..." +#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("装载中 ...") //"Loading..." +#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("清除中 ...") // "Purging..." +#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("恢复中 ...") //"Resuming..." +#endif // LCD_HEIGHT < 4 + +#endif // LANGUAGE_ZH_CN_H diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 7abf895d54..8455843773 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,493 +16,375 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Traditional Chinese * * LCD Menu Messages - * See also https://marlinfw.org/docs/development/lcd_language.html + * See also http://marlinfw.org/docs/development/lcd_language.html + * */ -namespace Language_zh_TW { - using namespace Language_en; // Inherit undefined strings from English +#ifndef LANGUAGE_ZH_TW_H +#define LANGUAGE_ZH_TW_H - constexpr uint8_t CHARSIZE = 3; - PROGMEM Language_Str LANGUAGE = _UxGT("Traditional Chinese"); +//#define TALL_FONT_CORRECTION (1) - PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT("已就緒."); //" ready." - PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); - PROGMEM Language_Str MSG_YES = _UxGT("是"); //"YES" - PROGMEM Language_Str MSG_NO = _UxGT("否"); //"NO" - PROGMEM Language_Str MSG_BACK = _UxGT("返回"); // "Back" - PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("正在中止..."); //"Aborting..." - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("記憶卡已插入"); //"Card inserted" - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("記憶卡被拔出"); //"Card removed" - PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("等待記憶卡"); //"Waiting for media" - PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("記憶卡讀取錯誤"); //"Media read error" - PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB裝置已移除"); //"USB device removed" - PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB啟動失敗"); //"USB start failed" - PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("擋塊"); //"Endstops" // Max length 8 characters - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("軟體擋塊"); //"Soft Endstops" - PROGMEM Language_Str MSG_MAIN = _UxGT("主選單"); //"Main" - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("進階設置"); //"Advanced Settings" - PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("設置"); //Configuration - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("自動開始"); //"Autostart" - PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("關閉步進馬達"); //"Disable steppers" - PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("除錯選單"); // "Debug Menu" - PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("進度條測試"); // "Progress Bar Test" - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("自動回原點"); //"Auto home" - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("回X原點"); //"Home X" - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("回Y原點"); //"Home Y" - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("回Z原點"); //"Home Z" - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("自動Z對齊"); //"Auto Z-Align" - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("平台調平XYZ歸原點"); //"Homing XYZ" - PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("單擊開始熱床調平"); //"Click to Begin" - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("下個熱床調平點"); //"Next Point" - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("完成熱床調平"); //"Leveling Done!" - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" - PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("設置原點偏移"); //"Set home offsets" - PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已啟用"); //"Offsets applied" - PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("設置原點"); //"Set origin" - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("預熱 ") PREHEAT_1_LABEL; //"Preheat PREHEAT_1_LABEL" - PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("預熱 ") PREHEAT_1_LABEL " ~"; //"Preheat PREHEAT_1_LABEL" - PROGMEM Language_Str MSG_PREHEAT_1_END = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_1_END_E = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ~"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_1_ALL = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" - PROGMEM Language_Str MSG_PREHEAT_1_BEDONLY = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 熱床"); //MSG_PREHEAT_1 " Bed" - PROGMEM Language_Str MSG_PREHEAT_1_SETTINGS = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 設置"); //MSG_PREHEAT_1 " conf" +#define CHARSIZE 3 - PROGMEM Language_Str MSG_PREHEAT_M = _UxGT("預熱 $"); //"Preheat PREHEAT_1_LABEL" - PROGMEM Language_Str MSG_PREHEAT_M_H = _UxGT("預熱 $ ~"); //"Preheat PREHEAT_1_LABEL" - PROGMEM Language_Str MSG_PREHEAT_M_END = _UxGT("預熱 $ 噴嘴"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_M_END_E = _UxGT("預熱 $ 噴嘴 ~"); //MSG_PREHEAT_1 " " - PROGMEM Language_Str MSG_PREHEAT_M_ALL = _UxGT("預熱 $ 全部"); //MSG_PREHEAT_1 " All" - PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("預熱 $ 熱床"); //MSG_PREHEAT_1 " Bed" - PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("預熱 $ 設置"); //MSG_PREHEAT_1 " conf" - #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("自定預熱"); //"Preheat Custom" - PROGMEM Language_Str MSG_COOLDOWN = _UxGT("降溫"); //"Cooldown" - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("激光控制"); //"Laser Control" - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("激光 關"); //"Laser Off" - PROGMEM Language_Str MSG_LASER_ON = _UxGT("激光 開"); //"Laser On" - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("激光電源"); //"Laser Power" - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("主軸控告制"); //"Spindle Control" - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("主軸 關"); //"Spindle Off" - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("主軸 開"); //"Spindle On" - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("主軸電源"); //"Spindle Power" - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("主軸反轉"); //"Spindle Reverse" - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("電源打開"); //"Switch power on" - PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("電源關閉"); //"Switch power off" - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("擠出"); //"Extrude" - PROGMEM Language_Str MSG_RETRACT = _UxGT("回縮"); //"Retract" - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("移動軸"); //"Move axis" - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("調平熱床"); //"Bed leveling" - PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("調平熱床"); //"Level bed" - PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("調平邊角"); // "Level corners" - PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("下個邊角"); // "Next corner" - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("網格編輯器"); //"Mesh Editor" - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("編輯網格"); // "Edit Mesh" - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("網格編輯已停止"); // "Mesh Editing Stopped" - PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("探測點"); //"Probing Point" - PROGMEM Language_Str MSG_MESH_X = _UxGT("索引 X"); //"Index X" - PROGMEM Language_Str MSG_MESH_Y = _UxGT("索引 Y"); //"Index Y" - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z 值"); //"Z Value" - PROGMEM Language_Str MSG_USER_MENU = _UxGT("自定命令"); // "Custom Commands" - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 探測測試"); //"M48 Probe Test" - PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 探測點"); //"M48 Point" - PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("偏差"); //"Deviation" - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mode"); - PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); - PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication"); - PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Mirrored Copy"); - PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2nd Nozzle X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2nd Nozzle Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2nd Nozzle Z"); - PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("執行G29"); // "Doing G29" - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" - PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling" - PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("傾斜點"); //"Tilting Point" - PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("手工建網"); // "Manually Build Mesh" - PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("放置墊片並測量"); // "Place shim & measure" - PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("測量"); // "Measure" - PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("移除並測量熱床"); // "Remove & measure bed" - PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("移動到下一個"); // "Moving to next" - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("啟動UBL"); // "Activate UBL" - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("關閉UBL"); // "Deactivate UBL" - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("置設熱床溫度"); // "Bed Temp" - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("置設熱床溫度"); //"Bed Temp") - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("置設噴嘴溫度"); // "Hotend Temp" - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("熱端溫度"); //"Hotend Temp" - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("網格編輯"); // "Mesh Edit" - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("編輯客戶網格"); // "Edit Custom Mesh" - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("細調網格"); // "Fine Tuning Mesh" - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("完成編輯網格"); // "Done Editing Mesh" - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("創設客戶網格"); // "Build Custom Mesh" - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("創設網格"); // "Build Mesh" - #if PREHEAT_COUNT - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("創設 $ 網格"); // "Build PREHEAT_1_LABEL Mesh" - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 網格"); // "Validate PREHEAT_1_LABEL Mesh" - #endif - PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("創設冷網格"); // "Build Cold Mesh" - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("調整網格高度"); // "Adjust Mesh Height" - PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合計"); // "Height Amount" - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准網格"); // "Validate Mesh" - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客戶網格"); // "Validate Custom Mesh" - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 加熱熱床"); //"G26 Heating Bed" - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 加熱噴嘴"); //"G26 Heating Nozzle" - PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("手動填裝"); //"Manual priming..." - PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("固定距離填裝"); //"Fixed Length Prime" - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("完成填裝"); //"Done Priming" - PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26已取消"); //"G26 Canceled" - PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("離開 G26"); //"Leaving G26" - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("繼續熱床網格"); // "Continue Bed Mesh" - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling" - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三點調平"); // "3-Point Leveling" - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子網格調平"); // "Grid Mesh Leveling" - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("調平網格"); // "Level Mesh" - PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("邊點"); // "Side Points" - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("圖類型"); // "Map Type" - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("輸出網格圖"); // "Output Mesh Map" - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("輸出到主機"); // "Output for Host" - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("輸出到CSV"); // "Output for CSV" - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("輸出到備份"); // "Off Printer Backup" - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("輸出UBL信息"); // "Output UBL Info" - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合計"); // "Fill-in Amount" - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in" - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("聰明填充"); // "Smart Fill-in" - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("填充網格"); // "Fill-in Mesh" - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("作廢所有的"); // "Invalidate All" - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作廢最近的"); // "Invalidate Closest" - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("細調所有的"); // "Fine Tune All" - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("細調最近的"); // "Fine Tune Closest" - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("網格存儲"); // "Mesh Storage" - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("存儲槽"); // "Memory Slot" - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("裝載熱床網格"); // "Load Bed Mesh" - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("保存熱床網格"); // "Save Bed Mesh" - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("網格 %i 已裝載"); // "Mesh %i loaded" - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("網格 %i 已保存"); // "Mesh %i saved" - PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("沒有存儲"); // "No storage" - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("錯誤: UBL保存"); // "Err: UBL Save" - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("錯誤: UBL還原"); // "Err: UBL Restore" - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-偏移:"); //"Z-Offset: " - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL" - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. 創設冷網格"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. 聰明填充"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. 批准網格"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. 細調所有的"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. 批准網格"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. 細調所有的"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. 保存熱床網格"); +#define WELCOME_MSG MACHINE_NAME _UxGT("已就緒.") //" ready." +#define MSG_BACK _UxGT("返回") // ”Back“ +#define MSG_SD_INSERTED _UxGT("記憶卡已插入") //"Card inserted" +#define MSG_SD_REMOVED _UxGT("記憶卡被拔出") //"Card removed" +#define MSG_LCD_ENDSTOPS _UxGT("擋塊") //"Endstops" // Max length 8 characters +#define MSG_MAIN _UxGT("主選單") //"Main" +#define MSG_AUTOSTART _UxGT("自動開始") //"Autostart" +#define MSG_DISABLE_STEPPERS _UxGT("關閉步進馬達") //"Disable steppers" +#define MSG_DEBUG_MENU _UxGT("除錯選單") // "Debug Menu" +#define MSG_PROGRESS_BAR_TEST _UxGT("進度條測試") // "Progress Bar Test" +#define MSG_AUTO_HOME _UxGT("自動回原點") //"Auto home" +#define MSG_AUTO_HOME_X _UxGT("回X原點") //"Home X" +#define MSG_AUTO_HOME_Y _UxGT("回Y原點") //"Home Y" +#define MSG_AUTO_HOME_Z _UxGT("回Z原點") //"Home Z" +#define MSG_TMC_Z_CALIBRATION _UxGT("⊿校準Z") +#define MSG_LEVEL_BED_HOMING _UxGT("平台調平XYZ歸原點") //"Homing XYZ" +#define MSG_LEVEL_BED_WAITING _UxGT("單擊開始熱床調平") //"Click to Begin" +#define MSG_LEVEL_BED_NEXT_POINT _UxGT("下個熱床調平點") //"Next Point" +#define MSG_LEVEL_BED_DONE _UxGT("完成熱床調平") //"Leveling Done!" +#define MSG_Z_FADE_HEIGHT _UxGT("淡出高度") // "Fade Height" +#define MSG_SET_HOME_OFFSETS _UxGT("設置原點偏移") //"Set home offsets" +#define MSG_HOME_OFFSETS_APPLIED _UxGT("偏移已啟用") //"Offsets applied" +#define MSG_SET_ORIGIN _UxGT("設置原點") //"Set origin" +#define MSG_PREHEAT_1 _UxGT("預熱PLA") //"Preheat PLA" +#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") //MSG_PREHEAT_1 " " +#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" 全部") //MSG_PREHEAT_1 " All" +#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" 熱床") //MSG_PREHEAT_1 " Bed" +#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" 設置") //MSG_PREHEAT_1 " conf" +#define MSG_PREHEAT_2 _UxGT("預熱ABS") //"Preheat ABS" +#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") //MSG_PREHEAT_2 " " +#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" 全部") //MSG_PREHEAT_2 " All" +#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" 熱床") //MSG_PREHEAT_2 " Bed" +#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" 設置") //MSG_PREHEAT_2 " conf" +#define MSG_COOLDOWN _UxGT("降溫") //"Cooldown" +#define MSG_SWITCH_PS_ON _UxGT("電源打開") //"Switch power on" +#define MSG_SWITCH_PS_OFF _UxGT("電源關閉") //"Switch power off" +#define MSG_EXTRUDE _UxGT("擠出") //"Extrude" +#define MSG_RETRACT _UxGT("回縮") //"Retract" +#define MSG_MOVE_AXIS _UxGT("移動軸") //"Move axis" +#define MSG_BED_LEVELING _UxGT("調平熱床") //"Bed leveling" +#define MSG_LEVEL_BED _UxGT("調平熱床") //"Level bed" +#define MSG_LEVEL_CORNERS _UxGT("調平邊角") // "Level corners" - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("燈管控制"); // "LED Control") - PROGMEM Language_Str MSG_LEDS = _UxGT("燈"); // "Lights") - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("燈預置"); // "Light Presets") - PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("红"); // "Red") - PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange") - PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("黃"); // "Yellow") - PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("綠"); // "Green") - PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("藍"); // "Blue") - PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo") - PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet") - PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("白"); // "White") - PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("復歸"); // "Default") - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("定制燈"); // "Custom Lights") - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("紅飽和度"); // "Red Intensity") - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("綠飽和度"); // "Green Intensity") - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("藍飽和度"); // "Blue Intensity") - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("白飽和度"); // "White Intensity") - PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness") +#define MSG_NEXT_CORNER _UxGT("下个邊角") // "Next corner" +#define MSG_EDITING_STOPPED _UxGT("網格編輯已停止") // "Mesh Editing Stopped" - PROGMEM Language_Str MSG_MOVING = _UxGT("移動 ..."); // "Moving...") - PROGMEM Language_Str MSG_FREE_XY = _UxGT("釋放 XY"); // "Free XY") - PROGMEM Language_Str MSG_MOVE_X = _UxGT("移動X"); //"Move X" - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("移動Y"); //"Move Y" - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("移動Z"); //"Move Z" - PROGMEM Language_Str MSG_MOVE_E = _UxGT("擠出機"); //"Extruder" - PROGMEM Language_Str MSG_MOVE_EN = _UxGT("擠出機 *"); //"Extruder *" - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("噴嘴溫度不夠"); //"Hotend too cold" - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("移動 %s mm"); //"Move 0.025mm" - PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移動 0.1 mm"); //"Move 0.1mm" - PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移動 1 mm"); //"Move 1mm" - PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("移動 10 mm"); //"Move 10mm" - PROGMEM Language_Str MSG_SPEED = _UxGT("速率"); //"Speed" - PROGMEM Language_Str MSG_BED_Z = _UxGT("熱床Z"); //"Bed Z" - PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴"); //"Nozzle" 噴嘴 - PROGMEM Language_Str MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴 ~"); - PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" 熱床"); //"Bed" - PROGMEM Language_Str MSG_CHAMBER = _UxGT("Enclosure"); - PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("風扇速率"); //"Fan speed" - PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("風扇速率 ="); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Stored Fan ="); - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("額外風扇速率"); // "Extra fan speed" - PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("額外風扇速率 ="); - PROGMEM Language_Str MSG_FLOW = _UxGT("擠出速率"); - PROGMEM Language_Str MSG_FLOW_N = _UxGT("擠出速率 ~"); //"Flow" - PROGMEM Language_Str MSG_CONTROL = _UxGT("控制"); //"Control" - PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); //" " LCD_STR_THERMOMETER " Min" - PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); //" " LCD_STR_THERMOMETER " Max" - PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 系數"); //" " LCD_STR_THERMOMETER " Fact" - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("自動控溫"); //"Autotemp" - PROGMEM Language_Str MSG_LCD_ON = _UxGT("開 "); //"On" - PROGMEM Language_Str MSG_LCD_OFF = _UxGT("關 "); //"Off" +#define MSG_USER_MENU _UxGT("客制命令") // "Custom Commands" +#define MSG_UBL_DOING_G29 _UxGT("执行G29") // "Doing G29" +#define MSG_UBL_UNHOMED _UxGT("先回XYZ原點") // "Home XYZ first" +#define MSG_UBL_TOOLS _UxGT("UBL工具") // "UBL Tools" +#define MSG_UBL_LEVEL_BED _UxGT("統一熱床調平(UBL)") // "Unified Bed Leveling" +#define MSG_UBL_MANUAL_MESH _UxGT("手工建网") // "Manually Build Mesh" - PROGMEM Language_Str MSG_SELECT = _UxGT("選擇"); //"Select" - PROGMEM Language_Str MSG_SELECT_E = _UxGT("選擇 *"); - PROGMEM Language_Str MSG_ACC = _UxGT("加速度"); //"Accel" acceleration - PROGMEM Language_Str MSG_JERK = _UxGT("抖動速率"); //"Jerk" - PROGMEM Language_Str MSG_VA_JERK = _UxGT("軸抖動速率") LCD_STR_A; //"Va-jerk" - PROGMEM Language_Str MSG_VB_JERK = _UxGT("軸抖動速率") LCD_STR_B; //"Vb-jerk" - PROGMEM Language_Str MSG_VC_JERK = _UxGT("軸抖動速率") LCD_STR_C; //"Vc-jerk" - PROGMEM Language_Str MSG_VE_JERK = _UxGT("擠出機抖動速率"); //"Ve-jerk" +#define MSG_UBL_BC_INSERT _UxGT("放置墊片並測量") // "Place shim & measure" +#define MSG_UBL_BC_INSERT2 _UxGT("測量") // "Measure" +#define MSG_UBL_BC_REMOVE _UxGT("移除並測量熱床") // "Remove & measure bed" +#define MSG_UBL_MOVING_TO_NEXT _UxGT("移動到下一個") // "Moving to next" +#define MSG_UBL_ACTIVATE_MESH _UxGT("激活UBL") // "Activate UBL" +#define MSG_UBL_DEACTIVATE_MESH _UxGT("關閉UBL") // "Deactivate UBL" +#define MSG_UBL_SET_BED_TEMP _UxGT("設置熱床溫度") // "Bed Temp" +#define MSG_UBL_SET_HOTEND_TEMP _UxGT("熱端溫度") // "Hotend Temp" +#define MSG_UBL_MESH_EDIT _UxGT("網格編輯") // "Mesh Edit" +#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("編輯客戶網格") // "Edit Custom Mesh" +#define MSG_UBL_FINE_TUNE_MESH _UxGT("細調網格") // "Fine Tuning Mesh" +#define MSG_UBL_DONE_EDITING_MESH _UxGT("完成編輯網格") // "Done Editing Mesh" +#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("創設客戶網格") // "Build Custom Mesh" +#define MSG_UBL_BUILD_MESH_MENU _UxGT("創設網格") // "Build Mesh" +#define MSG_UBL_BUILD_PLA_MESH _UxGT("創設PLA網格") // "Build PLA Mesh" +#define MSG_UBL_BUILD_ABS_MESH _UxGT("創設ABS網格") // "Build ABS Mesh" +#define MSG_UBL_BUILD_COLD_MESH _UxGT("創設冷網格") // "Build Cold Mesh" +#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("調整網格高度") // "Adjust Mesh Height" +#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("高度合計") // "Height Amount" +#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("批准網格") // "Validate Mesh" +#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("批准PLA網格") // "Validate PLA Mesh" +#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("批准ABS網格") // "Validate ABS Mesh" +#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("批准客戶網格") // "Validate Custom Mesh" +#define MSG_UBL_CONTINUE_MESH _UxGT("繼續熱床網格") // "Continue Bed Mesh" +#define MSG_UBL_MESH_LEVELING _UxGT("網格調平") // "Mesh Leveling" +#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("三點調平") // "3-Point Leveling" +#define MSG_UBL_GRID_MESH_LEVELING _UxGT("格子網格調平") // "Grid Mesh Leveling" +#define MSG_UBL_MESH_LEVEL _UxGT("調平網格") // "Level Mesh" +#define MSG_UBL_SIDE_POINTS _UxGT("邊點") // "Side Points" +#define MSG_UBL_MAP_TYPE _UxGT("圖類型") // "Map Type" +#define MSG_UBL_OUTPUT_MAP _UxGT("輸出網格圖") // "Output Mesh Map" +#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("輸出到主機") // "Output for Host" +#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("輸出到CSV") // "Output for CSV" +#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("輸出到備份") // "Off Printer Backup" +#define MSG_UBL_INFO_UBL _UxGT("輸出UBL信息") // "Output UBL Info" +#define MSG_UBL_EDIT_MESH_MENU _UxGT("編輯網格") // "Edit Mesh" +#define MSG_UBL_FILLIN_AMOUNT _UxGT("填充合計") // "Fill-in Amount" +#define MSG_UBL_MANUAL_FILLIN _UxGT("手工填充") // "Manual Fill-in" +#define MSG_UBL_SMART_FILLIN _UxGT("聰明填充") // "Smart Fill-in" +#define MSG_UBL_FILLIN_MESH _UxGT("填充網格") // "Fill-in Mesh" +#define MSG_UBL_INVALIDATE_ALL _UxGT("作廢所有的") // "Invalidate All" +#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("作廢最近的") // "Invalidate Closest" +#define MSG_UBL_FINE_TUNE_ALL _UxGT("細調所有的") // "Fine Tune All" +#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("細調最近的") // "Fine Tune Closest" +#define MSG_UBL_STORAGE_MESH_MENU _UxGT("網格存儲") // "Mesh Storage" +#define MSG_UBL_STORAGE_SLOT _UxGT("存儲槽") // "Memory Slot" +#define MSG_UBL_LOAD_MESH _UxGT("裝載熱床網格") // "Load Bed Mesh" +#define MSG_UBL_SAVE_MESH _UxGT("保存熱床網格") // "Save Bed Mesh" +#define MSG_MESH_LOADED _UxGT("網格 %i 已裝載") // "Mesh %i loaded" +#define MSG_MESH_SAVED _UxGT("網格 %i 已保存") // "Mesh %i saved" +#define MSG_NO_STORAGE _UxGT("沒有存儲") // "No storage" +#define MSG_UBL_SAVE_ERROR _UxGT("錯誤: UBL保存") // "Err: UBL Save" +#define MSG_UBL_RESTORE_ERROR _UxGT("錯誤: UBL還原") // "Err: UBL Restore" +#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z偏移已停止") // "Z-Offset Stopped" +#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("一步步UBL") // "Step-By-Step UBL" - PROGMEM Language_Str MSG_VELOCITY = _UxGT("速度"); // "Velocity" - PROGMEM Language_Str MSG_VMAX_A = _UxGT("最大進料速率") LCD_STR_A; //"Vmax " max_feedrate_mm_s - PROGMEM Language_Str MSG_VMAX_B = _UxGT("最大進料速率") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("最大進料速率") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("最大進料速率") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("最大進料速率 *"); //"Vmax " max_feedrate_mm_s - PROGMEM Language_Str MSG_VMIN = _UxGT("最小進料速率"); //"Vmin" min_feedrate_mm_s - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("最小移動速率"); //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move - PROGMEM Language_Str MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" - PROGMEM Language_Str MSG_AMAX_A = _UxGT("最大列印加速度") LCD_STR_A; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves - PROGMEM Language_Str MSG_AMAX_B = _UxGT("最大列印加速度") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("最大列印加速度") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("最大列印加速度") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("最大列印加速度 *"); //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves - PROGMEM Language_Str MSG_A_RETRACT = _UxGT("回縮加速度"); //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts - PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("非列印移動加速度"); //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves - PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("軸步數/mm"); //"Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 - PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("軸步數/mm"); //"Asteps/mm" axis_steps_per_mm, axis steps-per-unit G92 - PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("軸步數/mm"); - PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("軸步數/mm"); - PROGMEM Language_Str MSG_E_STEPS = _UxGT("擠出機步數/mm"); //"Esteps/mm" - PROGMEM Language_Str MSG_EN_STEPS = _UxGT("擠出機~步數/mm"); - PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("溫度"); //"Temperature" - PROGMEM Language_Str MSG_MOTION = _UxGT("運作"); //"Motion" - PROGMEM Language_Str MSG_FILAMENT = _UxGT("絲料測容"); //"Filament" menu_control_volumetric - PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("測容積mm³"); //"E in mm3" volumetric_enabled - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("絲料直徑"); //"Fil. Dia." - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("絲料直徑 *"); - PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("卸載 mm"); // "Unload mm" - PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("装載 mm"); // "Load mm" - PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); - PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advance K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD對比度"); //"LCD contrast" - PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("保存設置"); //"Store memory" - PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("載入設置"); //"Load memory" - PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("恢復安全值"); //"Restore failsafe" - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("初始化設置"); // "Initialize EEPROM" - PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("錯誤: EEPROM CRC"); //"Err: EEPROM CRC" - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("錯誤: EEPROM Index"); //"Err: EEPROM Index" - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("錯誤: EEPROM Version"); //"EEPROM Version" - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("媒體更新"); //"Media Update" - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("重置打印機"); //"Reset Printer - PROGMEM Language_Str MSG_REFRESH = _UxGT("刷新"); //"Refresh" - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("資訊界面"); //"Info screen" - PROGMEM Language_Str MSG_PREPARE = _UxGT("準備"); //"Prepare" - PROGMEM Language_Str MSG_TUNE = _UxGT("調整"); //"Tune" - PROGMEM Language_Str MSG_START_PRINT = _UxGT("開始列印"); //"Start Print" - PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("下一個"); //"Next" - PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("初始 "); //"Init" - PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("停止 "); //"Stop" - PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("列印 "); //"Print" - PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("復歸 "); //"Reset" - PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("放棄 "); //"Cancel" - PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("確認 "); //"Done" - PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("返回 "); //"Back" - PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("繼續 "); //"Proceed" - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("暫停列印"); //"Pause print" - PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("恢復列印"); //"Resume print" - PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("停止列印"); //"Stop print" - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("列印物件"); //"Printing Object" - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("中止物件"); //"Cancel Object" - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("中止物件 ="); //"Cancel Object =" - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("中斷恢復"); //"Outage Recovery" - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("從記憶卡上列印"); //"Print from SD" - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("無記憶卡"); //"No SD card" - PROGMEM Language_Str MSG_DWELL = _UxGT("休眠 ..."); //"Sleep..." - PROGMEM Language_Str MSG_USERWAIT = _UxGT("點擊繼續 ..."); //"Click to resume..." - PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("列印已暫停"); // "Print paused" - PROGMEM Language_Str MSG_PRINTING = _UxGT("列印中 ..."); //"Printing..." - PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("已取消列印"); //"Print aborted" - PROGMEM Language_Str MSG_NO_MOVE = _UxGT("無移動"); //"No move." - PROGMEM Language_Str MSG_KILLED = _UxGT("已砍掉"); //"KILLED. " - PROGMEM Language_Str MSG_STOPPED = _UxGT("已停止"); //"STOPPED. " - PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("回縮長度mm"); //"Retract mm" retract_length, retract length (positive mm) - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("換手回抽長度mm"); //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change - PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回縮速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) - PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); //"Hop mm" retract_zraise, retract Z-lift - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("回縮恢復長度mm"); //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("換手回縮恢復長度mm"); //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回縮恢復後進料速率mm/s"); //"Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自動回縮"); //"Auto-Retract" autoretract_enabled, - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("交換長度"); //"Swap Length" - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("清除長度"); //"Purge Length" - PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("交換工具"); //"Tool Change" - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z軸提昇"); //"Z Raise" - PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("最高速度"); //"Prime Speed" - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("收回速度"); //"Retract Speed" - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("噴嘴待機"); //"Nozzle Standby" - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("更換絲料"); //"Change filament" - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("更換絲料 *"); - PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("裝載絲料"); // "Load filament" - PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("裝載絲料 *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("卸載絲料"); // "Unload filament" - PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("卸載絲料 *"); // "Unload filament" - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("卸載全部"); // "Unload All" - PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("初始化記憶卡"); //"Init. SD card" - PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("連接記憶卡"); //"Attach Media - PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("更換記憶卡"); //"Change SD card" - PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("釋放媒體"); //"Release Media" - PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z探針在熱床之外"); //"Z probe out. bed" Z probe is not within the physical limits - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("偏斜因數"); // "Skew Factor" +#define MSG_LED_CONTROL _UxGT("灯管控制") // "LED Control") +#define MSG_LEDS _UxGT("灯") // "Lights") +#define MSG_LED_PRESETS _UxGT("灯预置") // "Light Presets") +#define MSG_SET_LEDS_RED _UxGT("红") // "Red") +#define MSG_SET_LEDS_ORANGE _UxGT("橙") // "Orange") +#define MSG_SET_LEDS_YELLOW _UxGT("黄") // "Yellow") +#define MSG_SET_LEDS_GREEN _UxGT("绿") // "Green") +#define MSG_SET_LEDS_BLUE _UxGT("蓝") // "Blue") +#define MSG_SET_LEDS_INDIGO _UxGT("青") // "Indigo") +#define MSG_SET_LEDS_VIOLET _UxGT("紫") // "Violet") +#define MSG_SET_LEDS_WHITE _UxGT("白") // "White") +#define MSG_SET_LEDS_DEFAULT _UxGT("缺省") // "Default") +#define MSG_CUSTOM_LEDS _UxGT("定制灯") // "Custom Lights") +#define MSG_INTENSITY_R _UxGT("红飽和度") // "Red Intensity") +#define MSG_INTENSITY_G _UxGT("绿飽和度") // "Green Intensity") +#define MSG_INTENSITY_B _UxGT("蓝飽和度") // "Blue Intensity") +#define MSG_INTENSITY_W _UxGT("白飽和度") // "White Intensity") +#define MSG_LED_BRIGHTNESS _UxGT("亮度") // "Brightness") +#define MSG_MOVING _UxGT("移动 ...") // "Moving...") +#define MSG_FREE_XY _UxGT("释放 XY") // "Free XY") - PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch 自檢"); // "BLTouch Self-Test" - PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("重置BLTouch"); // "Reset BLTouch" - PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("裝載BLTouch"); // "Stow BLTouch" - PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("部署BLTouch"); // "Deploy BLTouch" - - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("歸位 %s%s%s 先"); //"Home ... first" - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("探針偏移"); //Probe Offsets - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("探針X偏移量"); //Probe X Offset - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("探針Y偏移量"); //Probe Y Offset - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("探針Z偏移量"); //Probe Z Offset - PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("微量調整X軸"); //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts - PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("微量調整Y軸"); //"Babystep Y" - PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("微量調整Z軸"); //"Babystep Z" - PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("總計"); //"Total" - PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("擋塊終止"); //"Endstop abort" - PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("加熱失敗"); //"Heating failed" - PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("錯誤:冗餘溫度"); //"Err: REDUNDANT TEMP" - PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("溫度失控"); //"THERMAL RUNAWAY" - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("熱床溫度失控"); //"BED THERMAL RUNAWAY" - PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("機箱溫度失控"); //"CHAMBER T. RUNAWAY" - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("錯誤:最高溫度"); //"Err: MAXTEMP" - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("錯誤:最低溫度"); //"Err: MINTEMP" - PROGMEM Language_Str MSG_HALTED = _UxGT("印表機停機"); //"PRINTER HALTED" - PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("請重置"); //"Please reset" - PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("天"); //"d" // One character only - PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("時"); //"h" // One character only - PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("分"); //"m" // One character only - PROGMEM Language_Str MSG_HEATING = _UxGT("加熱中 ..."); //"Heating..." - PROGMEM Language_Str MSG_COOLING = _UxGT("冷卻中 ..."); //"Cooling..." - PROGMEM Language_Str MSG_BED_HEATING = _UxGT("加熱熱床中 ..."); //"Bed Heating..." - PROGMEM Language_Str MSG_BED_COOLING = _UxGT("熱床冷卻中 ..."); //"Bed Cooling..." - PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("機箱加熱中 .."); //"Chamber Heating..." - PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("機箱冷卻中 ..."); //Chamber Cooling... - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("⊿校準"); //"Delta Calibration" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("⊿校準X"); //"Calibrate X" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校準Y"); //"Calibrate Y" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校準Z"); //"Calibrate Z" - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校準中心"); //"Calibrate Center" - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("⊿設置"); // "Delta Settings" - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自動校準"); // "Auto Calibration" - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("設置⊿高度"); // "Set Delta Height" - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z偏移"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" - PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" - PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("⊿半徑"); // "Radius" - PROGMEM Language_Str MSG_INFO_MENU = _UxGT("關於印表機"); //"About Printer" - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("印表機訊息"); //"Printer Info" - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("三點調平"); // "3-Point Leveling" - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("線性調平"); // "Linear Leveling" - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT(" 雙線性調平"); // "Bilinear Leveling" - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling" - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling" - PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("印表機統計"); //"Printer Stats" - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("主板訊息"); //"Board Info" - PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("溫度計"); //"Thermistors" - PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT(" 擠出機"); //"Extruders" - PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("傳輸率"); //"Baud" - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("協議"); //"Protocol" - PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("監測溫度失控:關"); //"Runaway Watch: OFF" - PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("監測溫度失控:開"); //"Runaway Watch: ON" - - PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("外殼燈"); // "Case light" - PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("燈亮度"); // "Light BRIGHTNESS" - PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("打印機不正確"); // "The printer is incorrect" - - #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("列印計數"); //"Print Count" - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("已完成"); //"Completed" - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("總列印時間"); //"Total print time" - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("最長工作時間"); //"Longest job time" - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("總計擠出"); //"Extruded total" - #else - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("列印數"); //"Prints" - PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); //"Completed" - PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("總共"); //"Total" - PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("最長"); //"Longest" - PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("已擠出"); //"Extruded" - #endif - - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("最低溫度"); //"Min Temp" - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("最高溫度"); //"Max Temp" - PROGMEM Language_Str MSG_INFO_PSU = _UxGT("電源供應"); //"Power Supply" - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("驅動力度"); // "Drive Strength" - PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("驅動 %"); // "Driver %" - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X 驅動 %"); //X Driver % - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y 驅動 %"); //Y Driver % - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z 驅動 %"); //Z Driver % - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E 驅動 %"); //E Driver % - PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC連接錯誤"); //"TMC CONNECTION ERROR" - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("保存驅動設置"); // "DAC EEPROM Write" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("更換絲料"); //"FILAMENT CHANGE" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("列印已暫停"); // "PRINT PAUSED" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("裝載絲料"); // "LOAD FILAMENT" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸載絲料"); // "UNLOAD FILAMENT" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢複選項:"); // "RESUME OPTIONS:" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢復列印"); //"Resume print" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 噴嘴: "); // " Nozzle: " - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("斷絲偵測"); //"Runout Sensor" - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("絲距離mm"); //"Runout Dist mm" - PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("歸原位失敗"); // "Homing failed" - PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("探針探測失敗"); // "Probing failed" - - // - // Filament Change screens show up to 3 lines on a 4-line display - // ...or up to 2 lines on a 3-line display - // - #if LCD_HEIGHT >= 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("按下按鈕", "恢復列印")); //"Press Button to resume print" - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停車中 ...")); //"Parking..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待開始", "絲料", "變更")); //"Wait for start of the filament change" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下絲料")); //"Wait for filament unload" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入絲料", "並按鍵", "繼續 ...")); //"Insert filament and press button to continue..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按鈕", "加熱噴嘴.")); // "Press button to heat nozzle." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加熱噴嘴", "請等待 ...")); // "Heating nozzle Please wait..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "進料")); //"Wait for filament load" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "絲料清除")); // "Wait for filament purge" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("按下完成","絲料清除")); //"Press button to filament purge" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待列印", "恢復")); //"Wait for print to resume" - #else // LCD_HEIGHT < 4 - PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("按下繼續..")); //"Click to continue" - PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停車中 ...")); //"Parking..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("請等待 ...")); //"Please wait..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入並點擊")); //"Insert and Click" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("按下加熱..")); //"Click to heat" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加熱中 ...")); //"Heating..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); //"Ejecting..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("載入中 ...")); //"Loading..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); //"Purging..." - PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("按下完成..")); //"Click to finish" - PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢復中 ...")); //"Resuming..." - #endif // LCD_HEIGHT < 4 -} - -#if FAN_COUNT == 1 - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#define MSG_MOVE_X _UxGT("移動X") //"Move X" +#define MSG_MOVE_Y _UxGT("移動Y") //"Move Y" +#define MSG_MOVE_Z _UxGT("移動Z") //"Move Z" +#define MSG_MOVE_E _UxGT("擠出機") //"Extruder" +#define MSG_MOVE_01MM _UxGT("移動 0.1 mm") //"Move 0.1mm" +#define MSG_MOVE_1MM _UxGT("移動 1 mm") //"Move 1mm" +#define MSG_MOVE_10MM _UxGT("移動 10 mm") //"Move 10mm" +#define MSG_SPEED _UxGT("速率") //"Speed" +#define MSG_BED_Z _UxGT("熱床Z") //"Bed Z" +#define MSG_NOZZLE _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 噴嘴") //"Nozzle" 噴嘴 +#define MSG_BED _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 熱床") //"Bed" +#define MSG_FAN_SPEED _UxGT("風扇速率") //"Fan speed" +#define MSG_EXTRA_FAN_SPEED _UxGT("額外風扇速率") // "Extra fan speed" +#define MSG_FLOW _UxGT("擠出速率") //"Flow" +#define MSG_CONTROL _UxGT("控制") //"Control" +#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 最小") //" " LCD_STR_THERMOMETER " Min" +#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 最大") //" " LCD_STR_THERMOMETER " Max" +#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" 系數") //" " LCD_STR_THERMOMETER " Fact" +#define MSG_AUTOTEMP _UxGT("自動控溫") //"Autotemp" +#define MSG_ON _UxGT("開 ") //"On " +#define MSG_OFF _UxGT("關 ") //"Off" +#define MSG_PID_P _UxGT("PID-P") //"PID-P" +#define MSG_PID_I _UxGT("PID-I") //"PID-I" +#define MSG_PID_D _UxGT("PID-D") //"PID-D" +#define MSG_PID_C _UxGT("PID-C") //"PID-C" +#define MSG_SELECT _UxGT("選擇") //"Select" +#define MSG_ACC _UxGT("加速度") //"Accel" acceleration +#define MSG_JERK _UxGT("抖動速率") //"Jerk" +#if IS_KINEMATIC + #define MSG_VA_JERK _UxGT("A軸抖動速率") //"Va-jerk" + #define MSG_VB_JERK _UxGT("B軸抖動速率") //"Vb-jerk" + #define MSG_VC_JERK _UxGT("C軸抖動速率") //"Vc-jerk" #else - #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N - #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N + #define MSG_VA_JERK _UxGT("X軸抖動速率") //"Vx-jerk" + #define MSG_VB_JERK _UxGT("Y軸抖動速率") //"Vy-jerk" + #define MSG_VC_JERK _UxGT("Z軸抖動速率") //"Vz-jerk" #endif +#define MSG_VE_JERK _UxGT("擠出機抖動速率") //"Ve-jerk" +#define MSG_VELOCITY _UxGT("速度") // "Velocity" +#define MSG_VMAX _UxGT("最大進料速率") //"Vmax " max_feedrate_mm_s +#define MSG_VMIN _UxGT("最小進料速率") //"Vmin" min_feedrate_mm_s +#define MSG_VTRAV_MIN _UxGT("最小移動速率") //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move +#define MSG_ACCELERATION _UxGT("加速度") // "Acceleration" +#define MSG_AMAX _UxGT("最大列印加速度") //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves +#define MSG_A_RETRACT _UxGT("回縮加速度") //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts +#define MSG_A_TRAVEL _UxGT("非列印移動加速度") //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves +#define MSG_STEPS_PER_MM _UxGT("軸步數/mm") //"Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 +#if IS_KINEMATIC + #define MSG_ASTEPS _UxGT("A軸步數/mm") //"Asteps/mm" axis_steps_per_mm, axis steps-per-unit G92 + #define MSG_BSTEPS _UxGT("B軸步數/mm") //"Bsteps/mm" + #define MSG_CSTEPS _UxGT("C軸步數/mm") //"Csteps/mm" +#else + #define MSG_ASTEPS _UxGT("X軸步數/mm") //"Xsteps/mm" axis_steps_per_mm, axis steps-per-unit G92 + #define MSG_BSTEPS _UxGT("Y軸步數/mm") //"Ysteps/mm" + #define MSG_CSTEPS _UxGT("Z軸步數/mm") //"Zsteps/mm" +#endif +#define MSG_ESTEPS _UxGT("擠出機步數/mm") //"Esteps/mm" +#define MSG_E1STEPS _UxGT("擠出機1步數/mm") //"E1steps/mm" +#define MSG_E2STEPS _UxGT("擠出機2步數/mm") //"E2steps/mm" +#define MSG_E3STEPS _UxGT("擠出機3步數/mm") //"E3steps/mm" +#define MSG_E4STEPS _UxGT("擠出機4步數/mm") //"E4steps/mm" +#define MSG_E5STEPS _UxGT("擠出機5步數/mm") //"E5steps/mm" +#define MSG_TEMPERATURE _UxGT("溫度") //"Temperature" +#define MSG_MOTION _UxGT("運作") //"Motion" +#define MSG_FILAMENT _UxGT("絲料測容") //"Filament" lcd_control_volumetric_menu +#define MSG_VOLUMETRIC_ENABLED _UxGT("測容積mm³") //"E in mm3" volumetric_enabled +#define MSG_FILAMENT_DIAM _UxGT("絲料直徑") //"Fil. Dia." +#define MSG_FILAMENT_UNLOAD _UxGT("卸載 mm") // "Unload mm" +#define MSG_FILAMENT_LOAD _UxGT("装載 mm") // "Load mm" +#define MSG_ADVANCE_K _UxGT("Advance K") // "Advance K" +#define MSG_CONTRAST _UxGT("LCD對比度") //"LCD contrast" +#define MSG_STORE_EEPROM _UxGT("保存設置") //"Store memory" +#define MSG_LOAD_EEPROM _UxGT("載入設置") //"Load memory" +#define MSG_RESTORE_FAILSAFE _UxGT("恢復安全值") //"Restore failsafe" +#define MSG_INIT_EEPROM _UxGT("初始化設置") // "Initialize EEPROM" +#define MSG_REFRESH _UxGT("刷新") //"Refresh" +#define MSG_WATCH _UxGT("資訊界面") //"Info screen" +#define MSG_PREPARE _UxGT("準備") //"Prepare" +#define MSG_TUNE _UxGT("調整") //"Tune" +#define MSG_PAUSE_PRINT _UxGT("暫停列印") //"Pause print" +#define MSG_RESUME_PRINT _UxGT("恢復列印") //"Resume print" +#define MSG_STOP_PRINT _UxGT("停止列印") //"Stop print" +#define MSG_CARD_MENU _UxGT("從記憶卡上列印") //"Print from SD" +#define MSG_NO_CARD _UxGT("無記憶卡") //"No SD card" +#define MSG_DWELL _UxGT("休眠 ...") //"Sleep..." +#define MSG_USERWAIT _UxGT("點擊繼續 ...") //"Click to resume..." +#define MSG_PRINT_PAUSED _UxGT("列印已暫停") // "Print paused" +#define MSG_PRINT_ABORTED _UxGT("已取消列印") //"Print aborted" +#define MSG_NO_MOVE _UxGT("無移動") //"No move." +#define MSG_KILLED _UxGT("已砍掉") //"KILLED. " +#define MSG_STOPPED _UxGT("已停止") //"STOPPED. " +#define MSG_CONTROL_RETRACT _UxGT("回縮長度mm") //"Retract mm" retract_length, retract length (positive mm) +#define MSG_CONTROL_RETRACT_SWAP _UxGT("換手回抽長度mm") //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change +#define MSG_CONTROL_RETRACTF _UxGT("回縮速率mm/s") //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) +#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Hop mm") //"Hop mm" retract_zlift, retract Z-lift +#define MSG_CONTROL_RETRACT_RECOVER _UxGT("回縮恢復長度mm") //"UnRet +mm" retract_recover_length, additional recover length (mm, added to retract length when recovering) +#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("換手回縮恢復長度mm") //"S UnRet+mm" swap_retract_recover_length, additional swap recover length (mm, added to retract length when recovering from extruder change) +#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("回縮恢復後進料速率mm/s") //"UnRet V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) +#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") // "S UnRet V" +#define MSG_AUTORETRACT _UxGT("自動回縮") //"AutoRetr." autoretract_enabled, +#define MSG_FILAMENTCHANGE _UxGT("更換絲料") //"Change filament" +#define MSG_FILAMENTLOAD _UxGT("裝載絲料") // "Load filament" +#define MSG_FILAMENTUNLOAD _UxGT("卸載絲料") // "Unload filament" +#define MSG_FILAMENTUNLOAD_ALL _UxGT("卸載全部") // "Unload All" +#define MSG_INIT_SDCARD _UxGT("初始化記憶卡") //"Init. SD card" +#define MSG_CNG_SDCARD _UxGT("更換記憶卡") //"Change SD card" +#define MSG_ZPROBE_OUT _UxGT("Z探針在熱床之外") //"Z probe out. bed" Z probe is not within the physical limits +#define MSG_SKEW_FACTOR _UxGT("偏斜因數") // "Skew Factor" +#define MSG_BLTOUCH _UxGT("BLTouch") // "BLTouch" +#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch 自檢") // "BLTouch Self-Test" +#define MSG_BLTOUCH_RESET _UxGT("重置BLTouch") // "Reset BLTouch" +#define MSG_BLTOUCH_DEPLOY _UxGT("部署BLTouch") // "Deploy BLTouch" +#define MSG_BLTOUCH_STOW _UxGT("裝載BLTouch") // "Stow BLTouch" +#define MSG_HOME _UxGT("歸位") //"Home" // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST +#define MSG_FIRST _UxGT("先") //"first" +#define MSG_ZPROBE_ZOFFSET _UxGT("Z偏移") //"Z Offset" +#define MSG_BABYSTEP_X _UxGT("微量調整X軸") //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts +#define MSG_BABYSTEP_Y _UxGT("微量調整Y軸") //"Babystep Y" +#define MSG_BABYSTEP_Z _UxGT("微量調整Z軸") //"Babystep Z" +#define MSG_ENDSTOP_ABORT _UxGT("擋塊終止") //"Endstop abort" +#define MSG_HEATING_FAILED_LCD _UxGT("加熱失敗") //"Heating failed" +#define MSG_ERR_REDUNDANT_TEMP _UxGT("錯誤:REDUNDANT TEMP") //"Err: REDUNDANT TEMP" +#define MSG_THERMAL_RUNAWAY _UxGT("溫控失控") //"THERMAL RUNAWAY" +#define MSG_ERR_MAXTEMP _UxGT("錯誤:最高溫度") //"Err: MAXTEMP" +#define MSG_ERR_MINTEMP _UxGT("錯誤:最低溫度") //"Err: MINTEMP" +#define MSG_ERR_MAXTEMP_BED _UxGT("錯誤:最高熱床溫度") //"Err: MAXTEMP BED" +#define MSG_ERR_MINTEMP_BED _UxGT("錯誤:最低熱床溫度") //"Err: MINTEMP BED" +#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST +#define MSG_HALTED _UxGT("印表機停機") //"PRINTER HALTED" +#define MSG_PLEASE_RESET _UxGT("請重置") //"Please reset" +#define MSG_SHORT_DAY _UxGT("天") //"d" // One character only +#define MSG_SHORT_HOUR _UxGT("時") //"h" // One character only +#define MSG_SHORT_MINUTE _UxGT("分") //"m" // One character only +#define MSG_HEATING _UxGT("加熱中 ...") //"Heating..." +#define MSG_BED_HEATING _UxGT("加熱熱床中 ...") //"Bed Heating..." +#define MSG_DELTA_CALIBRATE _UxGT("⊿校準") //"Delta Calibration" +#define MSG_DELTA_CALIBRATE_X _UxGT("⊿校準X") //"Calibrate X" +#define MSG_DELTA_CALIBRATE_Y _UxGT("⊿校準Y") //"Calibrate Y" +#define MSG_DELTA_CALIBRATE_Z _UxGT("⊿校準Z") //"Calibrate Z" +#define MSG_DELTA_CALIBRATE_CENTER _UxGT("⊿校準中心") //"Calibrate Center" +#define MSG_DELTA_SETTINGS _UxGT("⊿設置") // "Delta Settings" +#define MSG_DELTA_AUTO_CALIBRATE _UxGT("⊿自動校準") // "Auto Calibration" +#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("設置⊿高度") // "Set Delta Height" +#define MSG_DELTA_DIAG_ROD _UxGT("⊿斜柱") // "Diag Rod" +#define MSG_DELTA_HEIGHT _UxGT("⊿高度") // "Height" +#define MSG_DELTA_RADIUS _UxGT("⊿半徑") // "Radius" +#define MSG_INFO_MENU _UxGT("關於印表機") //"About Printer" +#define MSG_INFO_PRINTER_MENU _UxGT("印表機訊息") //"Printer Info" +#define MSG_3POINT_LEVELING _UxGT("三點調平") // "3-Point Leveling" +#define MSG_LINEAR_LEVELING _UxGT("線性調平") // "Linear Leveling" +#define MSG_BILINEAR_LEVELING _UxGT("雙線性調平") // "Bilinear Leveling" +#define MSG_UBL_LEVELING _UxGT("統一熱床調平(UBL)") // "Unified Bed Leveling" +#define MSG_MESH_LEVELING _UxGT("網格調平") // "Mesh Leveling" +#define MSG_INFO_STATS_MENU _UxGT("印表機統計") //"Printer Stats" +#define MSG_INFO_BOARD_MENU _UxGT("主板訊息") //"Board Info" +#define MSG_INFO_THERMISTOR_MENU _UxGT("溫度計") //"Thermistors" +#define MSG_INFO_EXTRUDERS _UxGT("擠出機") //"Extruders" +#define MSG_INFO_BAUDRATE _UxGT("傳輸率") //"Baud" +#define MSG_INFO_PROTOCOL _UxGT("協議") //"Protocol" +#define MSG_CASE_LIGHT _UxGT("外殼燈") // "Case light" +#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("燈亮度") // "Light BRIGHTNESS" + +#if LCD_WIDTH > 19 +#define MSG_INFO_PRINT_COUNT _UxGT("列印計數") //"Print Count" +#define MSG_INFO_COMPLETED_PRINTS _UxGT("已完成") //"Completed" +#define MSG_INFO_PRINT_TIME _UxGT("總列印時間") //"Total print time" +#define MSG_INFO_PRINT_LONGEST _UxGT("最長工作時間") //"Longest job time" +#define MSG_INFO_PRINT_FILAMENT _UxGT("總計擠出") //"Extruded total" +#else +#define MSG_INFO_PRINT_COUNT _UxGT("列印數") //"Prints" +#define MSG_INFO_COMPLETED_PRINTS _UxGT("完成") //"Completed" +#define MSG_INFO_PRINT_TIME _UxGT("總共") //"Total" +#define MSG_INFO_PRINT_LONGEST _UxGT("最長") //"Longest" +#define MSG_INFO_PRINT_FILAMENT _UxGT("已擠出") //"Extruded" +#endif + +#define MSG_INFO_MIN_TEMP _UxGT("最低溫度") //"Min Temp" +#define MSG_INFO_MAX_TEMP _UxGT("最高溫度") //"Max Temp" +#define MSG_INFO_PSU _UxGT("電源供應") //"Power Supply" +#define MSG_DRIVE_STRENGTH _UxGT("驅動力度") // "Drive Strength" +#define MSG_DAC_PERCENT _UxGT("驅動 %") // "Driver %" +#define MSG_DAC_EEPROM_WRITE _UxGT("保存驅動設置") // "DAC EEPROM Write" +#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("列印已暫停") // "PRINT PAUSED" +#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("裝載絲料") // "LOAD FILAMENT" +#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("卸載絲料") // "UNLOAD FILAMENT" +#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("恢複選項:") // "RESUME OPTIONS:" +#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("清除更多") // "Purge more" +#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("恢復列印") //"Resume print" +#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" 噴嘴: ") // " Nozzle: " +#define MSG_ERR_HOMING_FAILED _UxGT("歸原位失敗") // "Homing failed" +#define MSG_ERR_PROBING_FAILED _UxGT("探針探測失敗") // "Probing failed" +#define MSG_M600_TOO_COLD _UxGT("M600: 太涼") // "M600: Too cold" + +#if LCD_HEIGHT >= 4 +#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("等待開始") //"Wait for start" +#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("絲料") //"of the filament" +#define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("變更") //"change" +#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("等待") //"Wait for" +#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("卸下絲料") //"filament unload" +#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入絲料") //"Insert filament" +#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("並按鍵") //"and press button" +#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("繼續 ...") //"to continue..." +#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("按下按鈕來") // "Press button to" +#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("加熱噴嘴.") // "heat nozzle." +#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加熱噴嘴") // "Heating nozzle" +#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("請等待 ...") // "Please wait..." +#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("等待") //"Wait for" +#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("進料") //"filament load" +#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("等待") // "Wait for" +#define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("絲料清除") // "filament purge" +#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("等待列印") //"Wait for print" +#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("恢復") //"to resume" + +#else // LCD_HEIGHT < 4 +#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("請等待 ...") //"Please wait..." +#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("退出中 ...") //"Ejecting..." +#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("插入並點擊") //"Insert and Click" +#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("加熱中 ...") // "Heating..." +#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("載入中 ...") //"Loading..." +#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("清除中 ...") // "Purging..." +#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("恢復中 ...") //"Resuming..." +#endif // LCD_HEIGHT < 4 + +#endif // LANGUAGE_ZH_TW_H diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp deleted file mode 100644 index e381c590f5..0000000000 --- a/Marlin/src/lcd/lcdprint.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * lcdprint.cpp - */ - -#include "../inc/MarlinConfigPre.h" - -#if HAS_WIRED_LCD - -#include "lcdprint.h" - -/** - * lcd_put_u8str_ind_P - * Print a string with an index substituted within it - */ -lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const inStr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { - uint8_t *p = (uint8_t*)pstr; - int8_t n = maxlen; - while (n > 0) { - wchar_t ch; - p = get_utf8_value_cb(p, read_byte_rom, &ch); - if (!ch) break; - if (ch == '=' || ch == '~' || ch == '*') { - if (ind >= 0) { - if (ch == '*') { lcd_put_wchar('E'); n--; } - if (n) { - int8_t inum = ind + ((ch == '=') ? 0 : LCD_FIRST_TOOL); - if (inum >= 10) { - lcd_put_wchar('0' + (inum / 10)); n--; - inum %= 10; - } - if (n) { lcd_put_wchar('0' + inum); n--; } - } - } - else { - PGM_P const b = ind == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED); - n -= lcd_put_u8str_max_P(b, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); - } - if (n) { - n -= lcd_put_u8str_max_P((PGM_P)p, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); - break; - } - } - else if (ch == '$' && inStr) { - n -= lcd_put_u8str_max_P(inStr, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); - } - else { - lcd_put_wchar(ch); - n--; - } - } - return n; -} - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index cf34a7ade9..c266401652 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -1,25 +1,3 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - /** * @file lcdprint.h * @brief LCD print api @@ -28,82 +6,20 @@ * @date 2016-08-19 * @copyright GPL/BSD */ -#pragma once +#ifndef _LCDPRINT_H +#define _LCDPRINT_H #include "fontutils.h" -#include "../inc/MarlinConfig.h" - -#if HAS_MARLINUI_U8GLIB - - #include "dogm/u8g_fontutf8.h" - typedef u8g_uint_t lcd_uint_t; - typedef u8g_int_t lcd_int_t; - - // Only Western languages support big / small fonts - #if DISABLED(DISPLAY_CHARSET_ISO10646_1) - #undef USE_BIG_EDIT_FONT - #undef USE_SMALL_INFOFONT - #endif - - #define MENU_FONT_NAME ISO10646_1_5x7 - #define MENU_FONT_WIDTH 6 - #define MENU_FONT_ASCENT 10 - #define MENU_FONT_DESCENT 2 - #define MENU_FONT_HEIGHT (MENU_FONT_ASCENT + MENU_FONT_DESCENT) - - #if ENABLED(USE_BIG_EDIT_FONT) - #define EDIT_FONT_NAME u8g_font_9x18 - #define EDIT_FONT_WIDTH 9 - #define EDIT_FONT_ASCENT 10 - #define EDIT_FONT_DESCENT 3 - #else - #define EDIT_FONT_NAME MENU_FONT_NAME - #define EDIT_FONT_WIDTH MENU_FONT_WIDTH - #define EDIT_FONT_ASCENT MENU_FONT_ASCENT - #define EDIT_FONT_DESCENT MENU_FONT_DESCENT - #endif - #define EDIT_FONT_HEIGHT (EDIT_FONT_ASCENT + EDIT_FONT_DESCENT) - - // Get the Ascent, Descent, and total Height for the Info Screen font - #if ENABLED(USE_SMALL_INFOFONT) - extern const u8g_fntpgm_uint8_t u8g_font_6x9[]; - #define INFO_FONT_ASCENT 7 - #else - #define INFO_FONT_ASCENT 8 - #endif - #define INFO_FONT_DESCENT 2 - #define INFO_FONT_HEIGHT (INFO_FONT_ASCENT + INFO_FONT_DESCENT) - #define INFO_FONT_WIDTH 6 - - #define SETCURSOR(col, row) lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) - #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT)) - -#else - +#if DISABLED(DOGLCD) #define _UxGT(a) a - typedef uint8_t lcd_uint_t; - typedef int8_t lcd_int_t; - - #define MENU_FONT_WIDTH 1 - #define MENU_FONT_HEIGHT 1 - #define EDIT_FONT_WIDTH 1 - #define EDIT_FONT_HEIGHT 1 - #define INFO_FONT_WIDTH 1 - #define INFO_FONT_HEIGHT 1 - #define LCD_PIXEL_WIDTH LCD_WIDTH - #define LCD_PIXEL_HEIGHT LCD_HEIGHT - - #define SETCURSOR(col, row) lcd_moveto(col, row) - #define SETCURSOR_RJ(len, row) SETCURSOR(LCD_WIDTH - (len), row) - +#else + #include "u8g_fontutf8.h" #endif -#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) -#define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr) -#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) +#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80u) -int lcd_glyph_height(); +int lcd_glyph_height(void); int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length); @@ -119,11 +35,6 @@ int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length); */ int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length); -/** - * Set the print baseline position - */ -void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row); - /** * @brief Draw a ROM UTF-8 string * @@ -134,38 +45,14 @@ void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row); * * Draw a ROM UTF-8 string */ -int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length); -inline int lcd_put_u8str_max_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P utf8_str_P, pixel_len_t max_length) { - lcd_moveto(col, row); - return lcd_put_u8str_max_P(utf8_str_P, max_length); -} +int lcd_put_u8str_max_P(const char * utf8_str_P, pixel_len_t max_length); -void lcd_put_int(const int i); -inline void lcd_put_int(const lcd_uint_t col, const lcd_uint_t row, const int i) { - lcd_moveto(col, row); - lcd_put_int(i); -} +void lcd_moveto(int col, int row); -inline int lcd_put_u8str_P(PGM_P const pstr) { return lcd_put_u8str_max_P(pstr, PIXEL_LEN_NOLIMIT); } -inline int lcd_put_u8str_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P const pstr) { - lcd_moveto(col, row); - return lcd_put_u8str_P(pstr); -} - -lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const inStr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH); -inline lcd_uint_t lcd_put_u8str_ind_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P const pstr, const int8_t ind, PGM_P const inStr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH) { - lcd_moveto(col, row); - return lcd_put_u8str_ind_P(pstr, ind, inStr, maxlen); -} +inline int lcd_put_u8str_P(const char *str) { return lcd_put_u8str_max_P(str, PIXEL_LEN_NOLIMIT); } inline int lcd_put_u8str(const char* str) { return lcd_put_u8str_max(str, PIXEL_LEN_NOLIMIT); } -inline int lcd_put_u8str(const lcd_uint_t col, const lcd_uint_t row, PGM_P const str) { - lcd_moveto(col, row); - return lcd_put_u8str(str); -} -inline int lcd_put_wchar(const wchar_t c) { return lcd_put_wchar_max(c, PIXEL_LEN_NOLIMIT); } -inline int lcd_put_wchar(const lcd_uint_t col, const lcd_uint_t row, const wchar_t c) { - lcd_moveto(col, row); - return lcd_put_wchar(c); -} +inline int lcd_put_wchar(wchar_t c) { return lcd_put_wchar_max(c, PIXEL_LEN_NOLIMIT); } + +#endif // _LCDPRINT_H diff --git a/Marlin/src/lcd/lcdprint_hd44780.cpp b/Marlin/src/lcd/lcdprint_hd44780.cpp new file mode 100644 index 0000000000..03bc70fd32 --- /dev/null +++ b/Marlin/src/lcd/lcdprint_hd44780.cpp @@ -0,0 +1,1044 @@ +/** + * @file lcdprint_hd44780.c + * @brief LCD print api for HD44780 + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +/** + * Due to the limitation of the HD44780 hardware, the current available LCD modules can only support + * Western(English), Cyrillic(Russian), Kana(Japanese) charsets. + */ + +#include "../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfig.h" + +#if ENABLED(ULTRA_LCD) +#include "ultralcd.h" +#include "../Marlin.h" + +#if DISABLED(DOGLCD) +#include +#include "fontutils.h" +#include "lcdprint.h" + +#include "ultralcd_common_HD44780.h" +#ifndef LCD_CLASS + #include + #define LCD_CLASS LiquidCrystal +#endif +extern LCD_CLASS lcd; +LCD_CLASS *plcd = &lcd; + +int lcd_glyph_height(void) { return 1; } + +//////////////////////////////////////////////////////////// +typedef struct _hd44780_charmap_t { + wchar_t uchar; // the unicode char + uint8_t idx; // the glyph of the char in the ROM + uint8_t idx2; // the char used to be combined with the idx to simulate a single char +} hd44780_charmap_t; + +#if defined(__AVR__) + #define IV(a) U##a +#else + #define IV(a) L##a +#endif + +static const hd44780_charmap_t g_hd44780_charmap_device[] PROGMEM = { + // sorted by uchar: + #if DISPLAY_CHARSET_HD44780 == JAPANESE + + {IV('¢'), 0xEC, 0}, // A2 + {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + {IV('ä'), 0xE1, 0}, // E4 + {IV('ö'), 0xEF, 0}, // F6 + {IV('÷'), 0xFD, 0}, // 00F7 + {IV('ü'), 0xF5, 0}, // 00FC + {IV('ˣ'), 0xEB, 0}, // 02E3 + + {IV('·'), 0xA5, 0}, // 0387 + {IV('Ώ'), 0xF4, 0}, // 038F + {IV('Θ'), 0xF2, 0}, // 0398, Theta + {IV('Ξ'), 0xE3, 0}, // 039E, Xi + {IV('Σ'), 0xF6, 0}, // 03A3, Sigma + {IV('Ω'), 0xF4, 0}, // 03A9, Omega + {IV('ά'), 0xE0, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('α'), 0xE0, 0}, // 03B1, alpha + {IV('β'), 0xE2, 0}, // 03B2, beta + {IV('ε'), 0xE3, 0}, // 03B5, epsilon + {IV('θ'), 0xF2, 0}, // 03B8, theta + {IV('μ'), 0xE4, 0}, // 03BC, mu + {IV('ξ'), 0xE3, 0}, // 03BE, xi + {IV('π'), 0xF7, 0}, // 03C0, pi + {IV('ρ'), 0xE6, 0}, // 03C1, rho + {IV('σ'), 0xE5, 0}, // 03C3, sigma + + {IV('←'), 0x7F, 0}, // 2190 + {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03) + {IV('√'), 0xE8, 0}, // 221A + {IV('∞'), 0xF3, 0}, // 221E + {IV('█'), 0xFF, 0}, // 2588 + + //{IV(''), 0xA0, 0}, + {IV('。'), 0xA1, 0}, + {IV('「'), 0xA2, 0}, + {IV('」'), 0xA3, 0}, + {IV('゛'), 0xDE, 0}, // ‶ + {IV('゜'), 0xDF, 0}, // '〫' + {IV('゠'), '=', 0}, + {IV('ァ'), 0xA7, 0}, + {IV('ア'), 0xB1, 0}, + {IV('ィ'), 0xA8, 0}, + {IV('イ'), 0xB2, 0}, + {IV('ゥ'), 0xA9, 0}, + {IV('ウ'), 0xB3, 0}, + {IV('ェ'), 0xAA, 0}, + {IV('エ'), 0xB4, 0}, + {IV('ォ'), 0xAB, 0}, + + {IV('オ'), 0xB5, 0}, + {IV('カ'), 0xB6, 0}, + {IV('ガ'), 0xB6, 0xDE}, + {IV('キ'), 0xB7, 0}, + {IV('ギ'), 0xB7, 0xDE}, // + {IV('ク'), 0xB8, 0}, + {IV('グ'), 0xB8, 0xDE}, + {IV('ケ'), 0xB9, 0}, + {IV('ゲ'), 0xB9, 0xDE}, + {IV('コ'), 0xBA, 0}, + {IV('ゴ'), 0xBA, 0xDE}, + {IV('サ'), 0xBB, 0}, + {IV('ザ'), 0xBB, 0xDE}, + {IV('シ'), 0xBC, 0}, + {IV('ジ'), 0xBC, 0xDE}, + {IV('ス'), 0xBD, 0}, + {IV('ズ'), 0xBD, 0xDE}, + {IV('セ'), 0xBE, 0}, + {IV('ゼ'), 0xBE, 0xDE}, + {IV('ソ'), 0xBF, 0}, + {IV('ゾ'), 0xBF, 0xDE}, + + {IV('タ'), 0xC0, 0}, + {IV('ダ'), 0xC0, 0xDE}, + {IV('チ'), 0xC1, 0}, + {IV('ヂ'), 0xC1, 0xDE}, + {IV('ッ'), 0xAF, 0}, + {IV('ツ'), 0xC2, 0}, + {IV('ヅ'), 0xC2, 0xDE}, + {IV('テ'), 0xC3, 0}, + {IV('デ'), 0xC3, 0xDE}, + {IV('ト'), 0xC4, 0}, + {IV('ド'), 0xC4, 0xDE}, + {IV('ナ'), 0xC5, 0}, + {IV('ニ'), 0xC6, 0}, + {IV('ヌ'), 0xC7, 0}, + {IV('ネ'), 0xC8, 0}, + {IV('ノ'), 0xC9, 0}, + {IV('ハ'), 0xCA, 0}, + {IV('バ'), 0xCA, 0xDE}, + {IV('パ'), 0xCA, 0xDF}, + {IV('ヒ'), 0xCB, 0}, + {IV('ビ'), 0xCB, 0xDE}, + {IV('ピ'), 0xCB, 0xDF}, + {IV('フ'), 0xCC, 0}, + {IV('ブ'), 0xCC, 0xDE}, + {IV('プ'), 0xCC, 0xDF}, + {IV('ヘ'), 0xCD, 0}, + {IV('ベ'), 0xCD, 0xDE}, + {IV('ペ'), 0xCD, 0xDF}, + {IV('ホ'), 0xCE, 0}, + {IV('ボ'), 0xCE, 0xDE}, + {IV('ポ'), 0xCE, 0xDF}, + {IV('マ'), 0xCF, 0}, + + {IV('ミ'), 0xD0, 0}, + {IV('ム'), 0xD1, 0}, + {IV('メ'), 0xD2, 0}, + {IV('モ'), 0xD3, 0}, + {IV('ャ'), 0xAC, 0}, + {IV('ヤ'), 0xD4, 0}, + {IV('ュ'), 0xAD, 0}, + {IV('ユ'), 0xD5, 0}, + {IV('ョ'), 0xAE, 0}, + {IV('ヨ'), 0xD6, 0}, + {IV('ラ'), 0xD7, 0}, + {IV('リ'), 0xD8, 0}, + {IV('ル'), 0xD9, 0}, + {IV('レ'), 0xDA, 0}, + {IV('ロ'), 0xDB, 0}, + {IV('ワ'), 0xDC, 0}, + {IV('ヲ'), 0xA6, 0}, + {IV('ン'), 0xDD, 0}, + {IV('ヴ'), 0xB3, 0xDE}, + {IV('ヷ'), 0xDC, 0xDE}, + {IV('ヺ'), 0xA6, 0xDE}, + {IV('・'), 0xA5, 0}, + {IV('ー'), 0xB0, 0}, + {IV('ヽ'), 0xA4, 0}, + + //{IV('g'), 0xE7, 0}, // error + //{IV(''), 0xE9, 0}, + //{IV('j'), 0xEA, 0}, // error + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + + //{IV('p'), 0xF0, 0}, // error + //{IV('q'), 0xF1, 0}, // error + //{IV(''), 0xF8, 0}, + //{IV('y'), 0xF9, 0}, // error + {IV('万'), 0xFB, 0}, + {IV('円'), 0xFC, 0}, + {IV('千'), 0xFA, 0}, + //{IV(''), 0xFE, 0}, + + //、・ヲァィゥェォャュョッー + {IV('、'), 0xA4, 0}, //ヽ + {IV('・'), 0xA5, 0}, //・ + {IV('ヲ'), 0xA6, 0}, //ヲ + {IV('ァ'), 0xA7, 0}, //ァ + {IV('ィ'), 0xA8, 0}, //ィ + {IV('ゥ'), 0xA9, 0}, //ゥ + {IV('ェ'), 0xAA, 0}, //ェ + {IV('ォ'), 0xAB, 0}, //ォ + {IV('ャ'), 0xAC, 0}, //ャ + {IV('ュ'), 0xAD, 0}, //ュ + {IV('ョ'), 0xAE, 0}, //ョ + {IV('ッ'), 0xAF, 0}, //ッ + {IV('ー'), 0xB0, 0}, //ー + + //アイウエオカキクケコサシスセ + {IV('ア'), 0xB1, 0}, //ア + {IV('イ'), 0xB2, 0}, //イ + {IV('ウ'), 0xB3, 0}, //ウ + {IV('エ'), 0xB4, 0}, //エ + {IV('オ'), 0xB5, 0}, //オ + {IV('カ'), 0xB6, 0}, //カ + {IV('キ'), 0xB7, 0}, //キ + {IV('ク'), 0xB8, 0}, //ク + {IV('ケ'), 0xB9, 0}, //ケ + {IV('コ'), 0xBA, 0}, //コ + {IV('サ'), 0xBB, 0}, //サ + {IV('シ'), 0xBC, 0}, //シ + {IV('ス'), 0xBD, 0}, //ス + {IV('セ'), 0xBE, 0}, //セ + + //ソタチツテトナニヌネノハヒフ + {IV('ソ'), 0xBF, 0}, //ソ + {IV('タ'), 0xC0, 0}, //タ + {IV('チ'), 0xC1, 0}, //チ + {IV('ツ'), 0xC2, 0}, //ツ + {IV('テ'), 0xC3, 0}, //テ + {IV('ト'), 0xC4, 0}, //ト + {IV('ナ'), 0xC5, 0}, //ナ + {IV('ニ'), 0xC6, 0}, //ニ + {IV('ヌ'), 0xC7, 0}, //ヌ + {IV('ネ'), 0xC8, 0}, //ネ + {IV('ノ'), 0xC9, 0}, //ノ + {IV('ハ'), 0xCA, 0}, //ハ + {IV('ヒ'), 0xCB, 0}, //ヒ + {IV('フ'), 0xCC, 0}, //フ + + //ヘホマミムメモヤユヨラリルレロワン゙゚ + {IV('ヘ'), 0xCD, 0}, //ヘ + {IV('ホ'), 0xCE, 0}, //ホ + {IV('マ'), 0xCF, 0}, //マ + {IV('ミ'), 0xD0, 0}, //ミ + {IV('ム'), 0xD1, 0}, //ム + {IV('メ'), 0xD2, 0}, //メ + {IV('モ'), 0xD3, 0}, //モ + {IV('ヤ'), 0xD4, 0}, //ヤ + {IV('ユ'), 0xD5, 0}, //ユ + {IV('ヨ'), 0xD6, 0}, //ヨ + {IV('ラ'), 0xD7, 0}, //ラ + {IV('リ'), 0xD8, 0}, //リ + {IV('ル'), 0xD9, 0}, //ル + {IV('レ'), 0xDA, 0}, //レ + {IV('ロ'), 0xDB, 0}, //ロ + {IV('ワ'), 0xDC, 0}, //ワ + {IV('ン'), 0xDD, 0}, //ン + {IV('゙'), 0xDE, 0}, // ゛ + {IV('゚'), 0xDF, 0}, // ゜ + + {IV('¥'), 0x5C, 0}, + + #elif DISPLAY_CHARSET_HD44780 == WESTERN + // 0x10 -- 0x1F (except 0x1C) + // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF) + + {IV('¡'), 0xA9, 0}, + {IV('¢'), 0xA4, 0}, + {IV('£'), 0xA5, 0}, + {IV('¥'), 0xA6, 0}, + {IV('§'), 0xD2, 0}, // section sign + {IV('©'), 0xCF, 0}, + + {IV('ª'), 0x9D, 0}, + {IV('«'), 0xBB, 0}, + {IV('®'), 0xCE, 0}, + + {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09) + //{IV(''), 0xD1, 0}, + {IV('±'), 0x10, 0}, //∓± + //{'='), 0x1C, 0}, // error + {IV('²'), 0x1E, 0}, + {IV('³'), 0x1F, 0}, + {IV('¶'), 0xD3, 0}, // pilcrow sign + {IV('º'), 0x9E, 0}, + {IV('»'), 0xBC, 0}, // 00BB + //{IV(''), 0xB3, 0}, // error + //{IV(''), 0xB4, 0}, // error + {IV('¼'), 0xB6, 0}, // 00BC + {IV('½'), 0xB5, 0}, // 00BD + //{IV('¾'), '3', 0}, // 00BE + {IV('¿'), 0x9F, 0}, // 00BF + + {IV('Â'), 0x8F, 0}, + {IV('Ã'), 0xAA, 0}, + {IV('Ä'), 0x8E, 0}, + {IV('Æ'), 0x92, 0}, + {IV('Ç'), 0x80, 0}, + {IV('É'), 0x90, 0}, + {IV('Ñ'), 0x9C, 0}, + {IV('Õ'), 0xAC, 0}, + {IV('Ö'), 0x99, 0}, + {IV('×'), 0xB7, 0}, + {IV('Ø'), 0xAE, 0}, + {IV('Ü'), 0x9A, 0}, + {IV('à'), 0x85, 0}, + {IV('á'), 0xA0, 0}, + {IV('â'), 0x83, 0}, + {IV('ã'), 0xAB, 0}, + {IV('ä'), 0x84, 0}, + {IV('å'), 0x86, 0}, + {IV('æ'), 0x91, 0}, + {IV('ç'), 0x87, 0}, + {IV('è'), 0x8A, 0}, + {IV('é'), 0x82, 0}, + {IV('ê'), 0x88, 0}, + {IV('ë'), 0x89, 0}, + {IV('ì'), 0x8D, 0}, + {IV('í'), 0xA1, 0}, + {IV('î'), 0x8C, 0}, + {IV('ï'), 0x8B, 0}, + + {IV('ñ'), 0x9B, 0}, + {IV('ò'), 0x95, 0}, + {IV('ó'), 0xA2, 0}, + {IV('ô'), 0x93, 0}, + {IV('õ'), 0xAD, 0}, + {IV('ö'), 0x94, 0}, + {IV('÷'), 0xB8, 0}, + {IV('ø'), 0xAF, 0}, + {IV('ù'), 0x97, 0}, + {IV('ú'), 0xA3, 0}, + {IV('û'), 0x96, 0}, + {IV('ü'), 0x81, 0}, + {IV('ÿ'), 0x98, 0}, + + //{IV(''), 0xB0, 0}, // error + //{IV(''), 0xB1, 0}, // error + {IV('ƒ'), 0xA8, 0}, // 0192 + + {IV('Ύ'), 0xDB, 0}, // 038E + {IV('Ώ'), 0xDE, 0}, // 038F + {IV('ΐ'), 0xE7, 0}, // 0390 + + {IV('Γ'), 0xD4, 0}, // 0393, Gamma + {IV('Δ'), 0xD5, 0}, // 0394, Delta, ◿ + {IV('Θ'), 0xD6, 0}, // 0398, Theta + {IV('Λ'), 0xD7, 0}, // 039B, Lambda + {IV('Ξ'), 0xD8, 0}, // 039E, Xi + {IV('Π'), 0xD9, 0}, // Pi + {IV('Σ'), 0xDA, 0}, // Sigma + {IV('Υ'), 0xDB, 0}, // Upsilon + {IV('Φ'), 0xDC, 0}, // Phi + {IV('Ψ'), 0xDD, 0}, // Psi + {IV('Ω'), 0xDE, 0}, // Omega + + {IV('ά'), 0xDF, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('ή'), 0xE5, 0}, // 03AE + {IV('ί'), 0xE7, 0}, // 03AF + {IV('ΰ'), 0xF1, 0}, // 03B0 + + {IV('α'), 0xDF, 0}, // alpha + {IV('β'), 0xE0, 0}, // beta + {IV('γ'), 0xE1, 0}, // gamma + {IV('δ'), 0xE2, 0}, // delta + {IV('ε'), 0xE3, 0}, // epsilon + {IV('ζ'), 0xE4, 0}, // zeta + {IV('η'), 0xE5, 0}, // eta + {IV('θ'), 0xE6, 0}, // theta + {IV('ι'), 0xE7, 0}, // lota + {IV('κ'), 0xE8, 0}, // kappa + {IV('λ'), 0xE9, 0}, // lambda + {IV('μ'), 0xEA, 0}, // mu + {IV('ν'), 0xEB, 0}, // nu + {IV('ξ'), 0xEC, 0}, // xi + {IV('π'), 0xED, 0}, // pi + {IV('ρ'), 0xEE, 0}, // rho + {IV('σ'), 0xEF, 0}, // sigma + + {IV('τ'), 0xF0, 0}, // tau + {IV('υ'), 0xF1, 0}, // upsilon + {IV('χ'), 0xF2, 0}, // chi + {IV('ψ'), 0xF3, 0}, // psi + {IV('ω'), 0xF4, 0}, // 03C9, omega + {IV('ϊ'), 0xE7, 0}, // 03CA + {IV('ϋ'), 0xF1, 0}, // 03CB + {IV('ύ'), 0xF1, 0}, // 03CD + {IV('ώ'), 0xF4, 0}, // 03CE + + {IV('•'), 0xCD, 0}, // · + {IV('℞'), 0xA7, 0}, // ℞ Pt ASCII 158 + {IV('™'), 0xD0, 0}, + {IV('↤'), 0xF9, 0}, // ⟻ + {IV('↵'), 0xC4, 0}, + {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('⇥'), 0xFB, 0}, + {IV('√'), 0xBE, 0}, // √ + {IV('∞'), 0xC2, 0}, // infinity + {IV('∫'), 0x1B, 0}, + {IV('∼'), 0x1D, 0}, + {IV('≈'), 0x1A, 0}, + {IV('≠'), 0xBD, 0}, + {IV('≡'), 0x11, 0}, + {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾ + {IV('≥'), 0xBA, 0}, + //{IV(''), 0xBF, 0}, // error + + {IV('⌠'), 0xC0, 0}, + {IV('⌡'), 0xC1, 0}, + + {IV('⎧'), 0x14, 0}, + {IV('⎩'), 0x15, 0}, + {IV('⎫'), 0x16, 0}, + {IV('⎭'), 0x17, 0}, + {IV('⎰'), 0x18, 0}, + {IV('⎱'), 0x19, 0}, + {IV('⎲'), 0x12, 0}, + {IV('⎳'), 0x13, 0}, + + {IV('⏱'), 0x07, 0}, // Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) + {IV('┌'), 0xC9, 0}, + {IV('┐'), 0xCA, 0}, + {IV('└'), 0xCB, 0}, + {IV('┘'), 0xCC, 0}, + {IV('◸'), 0xC3, 0}, // ◿ + {IV('⭠'), 0xC8, 0}, + {IV('⭡'), 0xC5, 0}, + {IV('⭢'), 0xC7, 0}, + {IV('⭣'), 0xC6, 0}, + + + {IV('⯆'), 0xF5, 0}, + {IV('⯇'), 0xF7, 0}, // ⯅ + {IV('⯈'), 0xF6, 0}, + //{IV(''), 0xF8, 0}, // error + //{IV(''), 0xFA, 0}, // error + //{IV(''), 0xFC, 0}, // error + //{IV(''), 0xFD, 0}, // error + //{IV(''), 0xFE, 0}, // error + //{IV(''), 0xFF, 0}, // error + + #elif DISPLAY_CHARSET_HD44780 == CYRILLIC + + {IV('¢'), 0x5C, 0}, // 00A2 + {IV('£'), 0xCF, 0}, // 00A3 + {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + + //{IV(''), 0x80, 0}, + //{IV(''), 0x81, 0}, + //{IV(''), 0x82, 0}, + //{IV(''), 0x83, 0}, + //{IV(''), 0x84, 0}, + //{IV(''), 0x85, 0}, + //{IV(''), 0x86, 0}, + //{IV(''), 0x87, 0}, + //{IV(''), 0x88, 0}, + //{IV(''), 0x89, 0}, + //{IV(''), 0x8A, 0}, + //{IV(''), 0x8B, 0}, + //{IV(''), 0x8C, 0}, + //{IV(''), 0x8D, 0}, + //{IV(''), 0x8E, 0}, + //{IV(''), 0x8F, 0}, + + //{IV(''), 0x90, 0}, + //{IV(''), 0x91, 0}, + //{IV(''), 0x92, 0}, + //{IV(''), 0x93, 0}, + //{IV(''), 0x94, 0}, + //{IV(''), 0x95, 0}, + //{IV(''), 0x96, 0}, + //{IV(''), 0x97, 0}, + //{IV(''), 0x98, 0}, + //{IV(''), 0x99, 0}, + //{IV(''), 0x9A, 0}, + //{IV(''), 0x9B, 0}, + //{IV(''), 0x9C, 0}, + //{IV(''), 0x9D, 0}, + //{IV(''), 0x9E, 0}, + //{IV(''), 0x9F, 0}, + + + {IV('¼'), 0xF0, 0}, // 00BC + {IV('⅓'), 0xF1, 0}, + {IV('½'), 0xF2, 0}, // 00BD + {IV('¾'), 0xF3, 0}, // 00BE + {IV('¿'), 0xCD, 0}, // 00BF + + {IV('Ё'), 0xA2, 0}, // 0401 + {IV('А'), 'A', 0}, // 0410 + {IV('Б'), 0xA0, 0}, + {IV('В'), 'B', 0}, + {IV('Г'), 0xA1, 0}, + {IV('Д'), 0xE0, 0}, + {IV('Е'), 'E', 0}, + {IV('Ж'), 0xA3, 0}, + {IV('З'), 0xA4, 0}, + {IV('И'), 0xA5, 0}, + {IV('Й'), 0xA6, 0}, + {IV('К'), 'K', 0}, + {IV('Л'), 0xA7, 0}, + {IV('М'), 'M', 0}, + {IV('Н'), 'H', 0}, + {IV('О'), 'O', 0}, + {IV('П'), 0xA8, 0}, + {IV('Р'), 'P', 0}, + {IV('С'), 'C', 0}, + {IV('Т'), 'T', 0}, + {IV('У'), 0xA9, 0}, + {IV('Ф'), 0xAA, 0}, + {IV('Х'), 'X', 0}, + {IV('Ц'), 0xE1, 0}, + {IV('Ч'), 0xAB, 0}, + {IV('Ш'), 0xAC, 0}, + {IV('Щ'), 0xE2, 0}, + {IV('Ъ'), 0xAD, 0}, + {IV('Ы'), 0xAE, 0}, + {IV('Ь'), 'b', 0}, + {IV('Э'), 0xAF, 0}, + {IV('Ю'), 0xB0, 0}, + {IV('Я'), 0xB1, 0}, + {IV('а'), 'a', 0}, + + {IV('б'), 0xB2, 0}, + {IV('в'), 0xB3, 0}, + {IV('г'), 0xB4, 0}, + {IV('д'), 0xE3, 0}, + {IV('е'), 'e', 0}, + {IV('ж'), 0xB6, 0}, + {IV('з'), 0xB7, 0}, + {IV('и'), 0xB8, 0}, + {IV('й'), 0xB9, 0}, + {IV('к'), 0xBA, 0}, //клмноп + {IV('л'), 0xBB, 0}, + {IV('м'), 0xBC, 0}, + {IV('н'), 0xBD, 0}, + {IV('о'), 'o', 0}, + {IV('п'), 0xBE, 0}, + {IV('р'), 'p', 0}, + {IV('с'), 'c', 0}, + {IV('т'), 0xBF, 0}, + + {IV('у'), 'y', 0}, + {IV('ф'), 0xE4, 0}, + {IV('х'), 'x', 0}, + {IV('ц'), 0xE5, 0}, + {IV('ч'), 0xC0, 0}, + {IV('ш'), 0xC1, 0}, + {IV('щ'), 0xE6, 0}, + {IV('ъ'), 0xC2, 0}, + {IV('ы'), 0xC3, 0}, + {IV('ь'), 0xC4, 0}, + {IV('э'), 0xC5, 0}, + {IV('ю'), 0xC6, 0}, + {IV('я'), 0xC7, 0}, // 044F + {IV('ё'), 0xB5, 0}, // 0451 + //{IV(''), 0xC8, 0}, + //{IV(''), 0xC9, 0}, + //{IV(''), 0xCA, 0}, + //{IV(''), 0xCB, 0}, + //{IV(''), 0xCC, 0}, + //{IV(''), 0xCD, 0}, + //{IV(''), 0xCE, 0}, + + //{IV(''), 0xD0, 0}, + //{IV(''), 0xD1, 0}, + //{IV(''), 0xD2, 0}, + //{IV(''), 0xD3, 0}, + //{IV(''), 0xD4, 0}, + //{IV(''), 0xD5, 0}, + //{IV(''), 0xD6, 0}, + //{IV(''), 0xD7, 0}, + //{IV(''), 0xD8, 0}, + //{IV(''), 0xDB, 0}, + //{IV(''), 0xDC, 0}, + //{IV(''), 0xDD, 0}, + //{IV(''), 0xDE, 0}, + //{IV(''), 0xDF, 0}, + + //{IV(''), 0xE7, 0}, + //{IV(''), 0xE8, 0}, + //{IV(''), 0xE9, 0}, + //{IV(''), 0xEA, 0}, + //{IV(''), 0xEB, 0}, + //{IV(''), 0xEC, 0}, + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + //{IV(''), 0xEF, 0}, + + //{IV(''), 0xF4, 0}, + //{IV(''), 0xF5, 0}, + //{IV(''), 0xF6, 0}, + //{IV(''), 0xF7, 0}, + //{IV(''), 0xF8, 0}, + //{IV(''), 0xF9, 0}, + //{IV(''), 0xFA, 0}, + //{IV(''), 0xFB, 0}, + //{IV(''), 0xFC, 0}, + //{IV(''), 0xFD, 0}, + //{IV(''), 0xFE, 0}, + //{IV(''), 0xFF, 0}, + + {IV('↑'), 0xD9, 0}, // 2191 ←↑→↓ + {IV('↓'), 0xDA, 0}, // 2193 + #endif +}; + +// the plain ASCII replacement for various char +static const hd44780_charmap_t g_hd44780_charmap_common[] PROGMEM = { + {IV('¡'), 'i', 0}, // A1 + {IV('¢'), 'c', 0}, // A2 + {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09) + + // map WESTERN code to the plain ASCII + {IV('Á'), 'A', 0}, // C1 + {IV('Â'), 'A', 0}, // C2 + {IV('Ã'), 'A', 0}, // C3 + {IV('Ä'), 'A', 0}, // C4 + {IV('Å'), 'A', 0}, // C5 + {IV('Æ'), 'A', 'E'}, // C6 + {IV('Ç'), 'C', 0}, // C7 + {IV('È'), 'E', 0}, // C8 + {IV('É'), 'E', 0}, // C9 + {IV('Í'), 'I', 0}, // CD + {IV('Ñ'), 'N', 0}, // D1 + {IV('Õ'), 'O', 0}, // D5 + {IV('Ö'), 'O', 0}, // D6 + {IV('×'), 'x', 0}, // D7 + {IV('Ü'), 'U', 0}, // DC + {IV('Ý'), 'Y', 0}, // DD + {IV('à'), 'a', 0}, // E0 + {IV('á'), 'a', 0}, + {IV('â'), 'a', 0}, + {IV('ã'), 'a', 0}, + {IV('ä'), 'a', 0}, + {IV('å'), 'a', 0}, + {IV('æ'), 'a', 'e'}, + {IV('ç'), 'c', 0}, + {IV('è'), 'e', 0}, // 00E8 + {IV('é'), 'e', 0}, + {IV('ê'), 'e', 0}, + {IV('ë'), 'e', 0}, + {IV('ì'), 'i', 0}, // 00EC + {IV('í'), 'i', 0}, + {IV('î'), 'i', 0}, + {IV('ï'), 'i', 0}, // 00EF + + {IV('ñ'), 'n', 0}, // 00F1 + {IV('ò'), 'o', 0}, + {IV('ó'), 'o', 0}, + {IV('ô'), 'o', 0}, + {IV('õ'), 'o', 0}, + {IV('ö'), 'o', 0}, + //{IV('÷'), 0xB8, 0}, + {IV('ø'), 'o', 0}, + {IV('ù'), 'u', 0}, + {IV('ú'), 'u', 0}, + {IV('û'), 'u', 0}, + {IV('ü'), 'u', 0}, // FC + {IV('ý'), 'y', 0}, // FD + {IV('ÿ'), 'y', 0}, // FF + + {IV('Ą'), 'A', 0}, // 0104 + {IV('ą'), 'a', 0}, // 0105 + {IV('Ć'), 'C', 0}, // 0106 + {IV('ć'), 'c', 0}, // 0107 + {IV('Č'), 'C', 0}, // 010C + {IV('č'), 'c', 0}, // 010D + {IV('Ď'), 'D', 0}, // 010E + {IV('ď'), 'd', 0}, // 010F + {IV('đ'), 'd', 0}, // 0111 + {IV('ę'), 'e', 0}, // 0119 + {IV('ğ'), 'g', 0}, // 011F + {IV('İ'), 'I', 0}, // 0130 + {IV('ı'), 'i', 0}, // 0131 + + {IV('Ł'), 'L', 0}, // 0141 + {IV('ł'), 'l', 0}, // 0142 + {IV('Ń'), 'N', 0}, // 0143 + {IV('ń'), 'n', 0}, // 0144 + {IV('ň'), 'n', 0}, // 0148 + + {IV('ř'), 'r', 0}, // 0159 + {IV('Ś'), 'S', 0}, // 015A + {IV('ś'), 's', 0}, // 015B + {IV('ş'), 's', 0}, // 015F + {IV('Š'), 'S', 0}, // 0160 + {IV('š'), 's', 0}, // 0161 + {IV('ť'), 't', 0}, // 0165 + {IV('ů'), 'u', 0}, // 016F + {IV('ż'), 'z', 0}, // 017C + {IV('Ž'), 'Z', 0}, // 017D + {IV('ž'), 'z', 0}, // 017E + {IV('ƒ'), 'f', 0}, // 0192 + + {IV('ˣ'), 'x', 0}, // 02E3 + + {IV('΄'), '\'', 0}, // 0384 + {IV('΅'), '\'', 0}, // 0385 + {IV('Ά'), 'A', 0}, // 0386 + {IV('·'), '.', 0}, // 0387 + {IV('Έ'), 'E', 0}, // 0388 + {IV('Ή'), 'H', 0}, // 0389 + {IV('Ί'), 'I', 0}, // 038A + {IV('Ό'), 'O', 0}, // 038C + {IV('Ύ'), 'Y', 0}, // 038E + {IV('Ώ'), 'O', 0}, // 038F + {IV('ΐ'), 'i', 0}, // 0390 + {IV('Α'), 'A', 0}, // 0391 + {IV('Β'), 'B', 0}, // 0392 + {IV('Γ'), 'T', 0}, // 0393, Gamma + {IV('Δ'), '4', 0}, // 0394, Delta, ◿ + {IV('Ε'), 'E', 0}, // 0395 + {IV('Ζ'), 'Z', 0}, // 0396 + {IV('Η'), 'H', 0}, // 0397 + {IV('Θ'), '0', 0}, // 0398, Theta + {IV('Ι'), 'I', 0}, // 0399 + {IV('Κ'), 'K', 0}, // 039A + {IV('Λ'), '^', 0}, // 039B, Lambda + {IV('Μ'), 'M', 0}, // 039C + {IV('Ν'), 'N', 0}, // 039D + {IV('Ξ'), '3', 0}, // 039E, Xi + {IV('Ο'), 'O', 0}, // 039F + {IV('Π'), 'n', 0}, // 03A0, Pi + {IV('Ρ'), 'P', 0}, // 03A1 + {IV('Σ'), 'E', 0}, // 03A3, Sigma + {IV('Τ'), 'T', 0}, // 03A4 + {IV('Υ'), 'Y', 0}, // 03A5, Upsilon + {IV('Φ'), 'p', 0}, // 03A6, Phi + {IV('Χ'), 'X', 0}, // 03A7 + {IV('Ψ'), 'P', 0}, // 03A8, Psi + {IV('Ω'), 'O', 0}, // 03A9, Omega + {IV('Ϊ'), 'I', 0}, // 03AA + {IV('Ϋ'), 'Y', 0}, // 03AB + {IV('ά'), 'a', 0}, // 03AC + {IV('έ'), 'e', 0}, // 03AD + {IV('ή'), 'n', 0}, // 03AE + {IV('ί'), 'i', 0}, // 03AF + {IV('ΰ'), 'v', 0}, // 03B0 + {IV('α'), 'a', 0}, // 03B1, alpha + {IV('β'), 'B', 0}, // 03B2, beta + {IV('γ'), 'v', 0}, // 03B3, gamma + {IV('δ'), 'd', 0}, // 03B4, delta + {IV('ε'), 'e', 0}, // 03B5, epsilon + {IV('ζ'), 'Z', 0}, // 03B6, zeta + {IV('η'), 'n', 0}, // 03B7, eta + {IV('θ'), '0', 0}, // 03B8, theta + {IV('ι'), 'i', 0}, // 03B9, lota + {IV('κ'), 'k', 0}, // 03BA, kappa + {IV('λ'), 'L', 0}, // 03BB, lambda + {IV('μ'), 'u', 0}, // 03BC, mu + {IV('ν'), 'v', 0}, // 03BD, nu + {IV('ξ'), 'e', 0}, // 03BE, xi + {IV('ο'), 'o', 0}, // 03BF + {IV('π'), 'n', 0}, // 03C0, pi + {IV('ρ'), 'p', 0}, // 03C1, rho + {IV('ς'), 'c', 0}, // 03C2 + {IV('σ'), 'o', 0}, // 03C3, sigma + {IV('τ'), 't', 0}, // 03C4, tau + {IV('υ'), 'v', 0}, // 03C5, upsilon + {IV('φ'), 'p', 0}, // 03C6 + {IV('χ'), 'X', 0}, // 03C7, chi + {IV('ψ'), 'W', 0}, // 03C8, psi + {IV('ω'), 'w', 0}, // 03C9, omega + {IV('ϊ'), 'i', 0}, // 03CA + {IV('ϋ'), 'v', 0}, // 03CB + {IV('ό'), 'o', 0}, // 03CC + {IV('ύ'), 'v', 0}, // 03CD + {IV('ώ'), 'w', 0}, // 03CE + + // map CYRILLIC code to the plain ASCII + {IV('Ё'), 'E', 0}, // 0401 + {IV('А'), 'A', 0}, // 0410 + {IV('Б'), 'b', 0}, // 0411 + {IV('В'), 'B', 0}, // 0412 + {IV('Г'), 'T', 0}, // 0413 + {IV('Д'), 'Q', 0}, // 0414 + {IV('Е'), 'E', 0}, // 0415 + {IV('Ж'), '*', 0}, // 0416 + {IV('З'), 'E', 0}, // 0417 + {IV('И'), 'N', 0}, // 0418 + {IV('Й'), 'N', 0}, // 0419 + {IV('К'), 'K', 0}, // 041A + {IV('Л'), 'T', 0}, // 041B + {IV('М'), 'M', 0}, // 041C + {IV('Н'), 'H', 0}, // 041D + {IV('О'), 'O', 0}, // 041E + {IV('П'), 'n', 0}, // 041F + {IV('Р'), 'P', 0}, // 0420 + {IV('С'), 'C', 0}, // 0421 + {IV('Т'), 'T', 0}, // 0422 + {IV('У'), 'Y', 0}, + {IV('Ф'), 'o', 0}, + {IV('Х'), 'X', 0}, + {IV('Ц'), 'U', 0}, + {IV('Ч'), 'y', 0}, + {IV('Ш'), 'W', 0}, + {IV('Щ'), 'W', 0}, + {IV('Ъ'), 'b', 0}, + {IV('Ы'), 'b', '|'}, + {IV('Ь'), 'b'}, + {IV('Э'), 'e'}, + {IV('Ю'), '|', 'O'}, + {IV('Я'), '9', '|'}, // 042F + + {IV('а'), 'a', 0}, // 0430 + {IV('б'), '6', 0}, // 0431 + {IV('в'), 'B', 0}, // 0432, + {IV('г'), 'r', 0}, // 0433 + {IV('д'), 'a', 0}, // 0434, + {IV('е'), 'e', 0}, // 0435 + {IV('ж'), '*', 0}, // 0436 + {IV('з'), 'e', 0}, // 0437, + {IV('и'), 'u', 0}, // 0438 + {IV('й'), 'u', 0}, // 0439, + {IV('к'), 'k', 0}, // 043A + {IV('л'), 'n', 0}, + {IV('м'), 'm', 0}, + {IV('н'), 'H', 0}, + {IV('о'), 'o', 0}, + {IV('п'), 'n', 0}, + {IV('р'), 'p', 0}, + {IV('с'), 'c', 0}, + {IV('т'), 't', 0}, + {IV('у'), 'y', 0}, + {IV('ф'), 'q', 'p'}, + {IV('х'), 'x', 0}, + {IV('ц'), 'u', 0}, + {IV('ч'), 'y', 0}, + {IV('ш'), 'w', 0}, + {IV('щ'), 'w', 0}, + {IV('ъ'), 'b', 0}, + {IV('ы'), 'b', '|'}, + {IV('ь'), 'b', 0}, + {IV('э'), 'e', 0}, + {IV('ю'), '|', 'o'}, + {IV('я'), 'g', 0}, // 044F + {IV('ё'), 'e', 0}, // 0451 + + {IV('•'), '.', 0}, // 2022 · + {IV('℞'), 'P', 'x'}, // 211E ℞ Pt ASCII 158 + {IV('™'), 'T', 'M'}, // 2122 + {IV('←'), '<', '-'}, // 2190 + {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→⏵➟➠➡' LCD_STR_ARROW_RIGHT (0x03) + //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('∼'), '~', 0}, // 223C + {IV('≈'), '~', '='}, // 2248 + {IV('≠'), '!', '='}, // 2260 + {IV('≡'), '=', 0}, // 2261 + {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾ + {IV('≥'), '>', '='}, // 2265 + {IV('⏱'), 0x07, 0}, // 23F1, Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) + + {IV('゠'), '=', 0}, // 30A0 + + // ⏰⏱⏲⏳◴◵◶◷ + // ⏻⏼♁♂ + //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07) + {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08) + {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: '📁📂' LCD_STR_FOLDER (0x02) + //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06) +}; + +/* return v1 - v2 */ +static int hd44780_charmap_compare(hd44780_charmap_t * v1, hd44780_charmap_t * v2) { + if (v1->uchar < v2->uchar) + return -1; + else if (v1->uchar > v2->uchar) + return 1; + return 0; +} + +static int pf_bsearch_cb_comp_hd4map_pgm(void *userdata, size_t idx, void * data_pin) { + hd44780_charmap_t localval; + hd44780_charmap_t *p_hd44780_charmap = (hd44780_charmap_t *)userdata; + memcpy_P(&localval, p_hd44780_charmap + idx, sizeof(localval)); + return hd44780_charmap_compare(&localval, (hd44780_charmap_t *)data_pin); +} + +#if DEBUG + +int test_hd44780_charmap(hd44780_charmap_t *data, size_t size, char *name, char flg_show_contents) { + int ret; + size_t idx = 0; + hd44780_charmap_t preval = {0, 0, 0}; + hd44780_charmap_t pinval = {0, 0, 0}; + char flg_error = 0; + + int i; + + TRACE("Test %s\n", name); + + for (i = 0; i < size; i ++) { + memcpy_P (&pinval, &(data[i]), sizeof(pinval)); + + if (flg_show_contents) { + #if 1 + TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #else + TRACE("[% 4d]", i); + TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar); + TRACE("0x%02X,", (unsigned int)(pinval.idx)); + TRACE("0x%02X,", (unsigned int)(pinval.idx2)); + TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #endif + } + if (preval.uchar >= pinval.uchar) { + flg_error = 1; + // TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + // return -1; + } + memcpy (&preval, &pinval, sizeof(pinval)); + + ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret < 0) { + flg_error = 1; + TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + if (idx != i) { + flg_error = 1; + TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + } + if (flg_error) { + TRACE("\nError: in array %s\n\n", name); + return -1; + } + TRACE("\nPASS array %s\n\n", name); + return 0; +} + +int test_hd44780_charmap_all(void) { + int flg_error = 0; + if (test_hd44780_charmap(g_hd44780_charmap_device, NUM_ARRAY(g_hd44780_charmap_device), "g_hd44780_charmap_device", 0) < 0) { + flg_error = 1; + test_hd44780_charmap(g_hd44780_charmap_device, NUM_ARRAY(g_hd44780_charmap_device), "g_hd44780_charmap_device", 1); + } + if (test_hd44780_charmap(g_hd44780_charmap_common, NUM_ARRAY(g_hd44780_charmap_common), "g_hd44780_charmap_common", 0) < 0) { + flg_error = 1; + test_hd44780_charmap(g_hd44780_charmap_common, NUM_ARRAY(g_hd44780_charmap_common), "g_hd44780_charmap_common", 1); + } + if (flg_error) { + TRACE("\nFAILED in hd44780 tests!\n"); + return -1; + } + TRACE("\nPASS in hd44780 tests.\n"); + return 0; +} + +#endif // DEBUG + +void lcd_moveto(int col, int row) { + plcd->setCursor(col, row); +} + +// return < 0 on error +// return the advanced cols +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + + // find the HD44780 internal ROM first + int ret; + size_t idx = 0; + hd44780_charmap_t pinval; + hd44780_charmap_t *copy_address = NULL; + pinval.uchar = c; + pinval.idx = -1; + + if (max_length < 1) return 0; + + // TODO: fix the '\\' that doesnt exist in the HD44870 + if (c < 128) { + plcd->write((uint8_t)c); + return 1; + } + copy_address = NULL; + ret = pf_bsearch_r((void *)g_hd44780_charmap_device, NUM_ARRAY(g_hd44780_charmap_device), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) { + copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_device + idx); + } + else { + ret = pf_bsearch_r((void *)g_hd44780_charmap_common, NUM_ARRAY(g_hd44780_charmap_common), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_common + idx); + } + + if (ret >= 0) { + hd44780_charmap_t localval; + // found + memcpy_P(&localval, copy_address, sizeof(localval)); + plcd->write(localval.idx); + if (max_length >= 2 && localval.idx2 > 0) { + plcd->write(localval.idx2); + return 2; + } + return 1; + } + + // Not found, print '?' instead + plcd->write((uint8_t)'?'); + return 1; +} + +/** +* @brief Draw a UTF-8 string +* +* @param utf8_str : the UTF-8 string +* @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM) +* @param max_length : the pixel length of the string allowed (or number of slots in HD44780) +* +* @return the number of pixels advanced +* +* Draw a UTF-8 string +*/ +static int lcd_put_u8str_max_cb(const char * utf8_str, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) { + pixel_len_t ret = 0; + uint8_t *p = (uint8_t *)utf8_str; + while (ret < max_length) { + wchar_t ch = 0; + p = get_utf8_value_cb(p, cb_read_byte, &ch); + if (!ch) break; + ret += lcd_put_wchar_max(ch, max_length - ret); + } + return (int)ret; +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str, read_byte_ram, max_length); +} + +int lcd_put_u8str_max_P(const char * utf8_str_P, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str_P, read_byte_rom, max_length); +} + +#endif // DOGLCD +#endif // ULTRA_LCD diff --git a/Marlin/src/lcd/lcdprint_u8g.cpp b/Marlin/src/lcd/lcdprint_u8g.cpp new file mode 100644 index 0000000000..39ac8acc30 --- /dev/null +++ b/Marlin/src/lcd/lcdprint_u8g.cpp @@ -0,0 +1,65 @@ +/** + * @file lcdprint_u8g.c + * @brief LCD print api for u8glib + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(DOGLCD) + +#include +extern U8GLIB *pu8g; +#define _lcd_write(a) pu8g->print(a) +#define _lcd_setcursor(col, row) pu8g->setPrintPos((col), (row)); + +#include "ultralcd.h" +#include "../Marlin.h" + +#include "fontutils.h" +#include "u8g_fontutf8.h" +#include "lcdprint.h" + +int lcd_glyph_height(void) { + return u8g_GetFontBBXHeight(pu8g->getU8g()); +} + +void lcd_moveto(int col, int row) { + _lcd_setcursor(col, row); +} + +// return < 0 on error +// return the advanced pixels +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + if (c < 256) { + _lcd_write((char)c); + return u8g_GetFontBBXWidth(pu8g->getU8g()); + } + unsigned int x = pu8g->getPrintCol(), + y = pu8g->getPrintRow(), + ret = uxg_DrawWchar(pu8g->getU8g(), x, y, c, max_length); + pu8g->setPrintPos(x + ret, y); + + return ret; +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + unsigned int x = pu8g->getPrintCol(), + y = pu8g->getPrintRow(), + ret = uxg_DrawUtf8Str(pu8g->getU8g(), x, y, utf8_str, max_length); + pu8g->setPrintPos(x + ret, y); + return ret; +} + +int lcd_put_u8str_max_P(const char * utf8_str_P, pixel_len_t max_length) { + unsigned int x = pu8g->getPrintCol(), + y = pu8g->getPrintRow(), + ret = uxg_DrawUtf8StrP(pu8g->getU8g(), x, y, utf8_str_P, max_length); + pu8g->setPrintPos(x + ret, y); + return ret; +} + +#endif // DOGLCD diff --git a/Marlin/src/lcd/malyanlcd.cpp b/Marlin/src/lcd/malyanlcd.cpp new file mode 100644 index 0000000000..d02a330244 --- /dev/null +++ b/Marlin/src/lcd/malyanlcd.cpp @@ -0,0 +1,490 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * malyanlcd.cpp + * + * LCD implementation for Malyan's LCD, a separate ESP8266 MCU running + * on Serial1 for the M200 board. This module outputs a pseudo-gcode + * wrapped in curly braces which the LCD implementation translates into + * actual G-code commands. + * + * Added to Marlin for Mini/Malyan M200 + * Unknown commands as of Jan 2018: {H:} + * Not currently implemented: + * {E:} when sent by LCD. Meaning unknown. + * + * Notes for connecting to boards that are not Malyan: + * The LCD is 3.3v, so if powering from a RAMPS 1.4 board or + * other 5v/12v board, use a buck converter to power the LCD and + * the 3.3v side of a logic level shifter. Aux1 on the RAMPS board + * has Serial1 and 12v, making it perfect for this. + * Copyright (c) 2017 Jason Nelson (xC0000005) + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(MALYAN_LCD) + +#include "../module/temperature.h" +#include "../module/planner.h" +#include "../module/stepper.h" +#include "../module/motion.h" +#include "../module/probe.h" +#include "../libs/duration_t.h" +#include "../module/printcounter.h" +#include "../gcode/gcode.h" +#include "../gcode/queue.h" +#include "../module/configuration_store.h" + +#include "../Marlin.h" + +#if ENABLED(SDSUPPORT) + #include "../sd/cardreader.h" + #include "../sd/SdFatConfig.h" +#else + #define LONG_FILENAME_LENGTH 0 +#endif + +// On the Malyan M200, this will be Serial1. On a RAMPS board, +// it might not be. +#define LCD_SERIAL Serial1 + +// This is based on longest sys command + a filename, plus some buffer +// in case we encounter some data we don't recognize +// There is no evidence a line will ever be this long, but better safe than sorry +#define MAX_CURLY_COMMAND (32 + LONG_FILENAME_LENGTH) * 2 + +// Track incoming command bytes from the LCD +int inbound_count; + +// For sending print completion messages +bool last_printing_status = false; + +// Everything written needs the high bit set. +void write_to_lcd_P(const char * const message) { + char encoded_message[MAX_CURLY_COMMAND]; + uint8_t message_length = MIN(strlen_P(message), sizeof(encoded_message)); + + for (uint8_t i = 0; i < message_length; i++) + encoded_message[i] = pgm_read_byte(&message[i]) | 0x80; + + LCD_SERIAL.Print::write(encoded_message, message_length); +} + +void write_to_lcd(const char * const message) { + char encoded_message[MAX_CURLY_COMMAND]; + const uint8_t message_length = MIN(strlen(message), sizeof(encoded_message)); + + for (uint8_t i = 0; i < message_length; i++) + encoded_message[i] = message[i] | 0x80; + + LCD_SERIAL.Print::write(encoded_message, message_length); +} + +/** + * Process an LCD 'C' command. + * These are currently all temperature commands + * {C:T0190} + * Set temp for hotend to 190 + * {C:P050} + * Set temp for bed to 50 + * + * {C:S09} set feedrate to 90 %. + * {C:S12} set feedrate to 120 %. + * + * the command portion begins after the : + */ +void process_lcd_c_command(const char* command) { + switch (command[0]) { + case 'C': { + int raw_feedrate = atoi(command + 1); + feedrate_percentage = raw_feedrate * 10; + feedrate_percentage = constrain(feedrate_percentage, 10, 999); + } break; + case 'T': { + thermalManager.setTargetHotend(atoi(command + 1), 0); + } break; + case 'P': { + thermalManager.setTargetBed(atoi(command + 1)); + } break; + + default: + SERIAL_ECHOLNPAIR("UNKNOWN C COMMAND", command); + return; + } +} + +/** + * Process an LCD 'B' command. + * {B:0} results in: {T0:008/195}{T1:000/000}{TP:000/000}{TQ:000C}{TT:000000} + * T0/T1 are hot end temperatures, TP is bed, TQ is percent, and TT is probably + * time remaining (HH:MM:SS). The UI can't handle displaying a second hotend, + * but the stock firmware always sends it, and it's always zero. + */ +void process_lcd_eb_command(const char* command) { + char elapsed_buffer[10]; + duration_t elapsed; + switch (command[0]) { + case '0': { + elapsed = print_job_timer.duration(); + sprintf_P(elapsed_buffer, PSTR("%02u%02u%02u"), uint16_t(elapsed.hour()), uint16_t(elapsed.minute()) % 60UL, elapsed.second()); + + char message_buffer[MAX_CURLY_COMMAND]; + sprintf_P(message_buffer, + PSTR("{T0:%03.0f/%03i}{T1:000/000}{TP:%03.0f/%03i}{TQ:%03i}{TT:%s}"), + thermalManager.degHotend(0), + thermalManager.degTargetHotend(0), + #if HAS_HEATED_BED + thermalManager.degBed(), + thermalManager.degTargetBed(), + #else + 0, 0, + #endif + #if ENABLED(SDSUPPORT) + card.percentDone(), + #else + 0, + #endif + elapsed_buffer); + write_to_lcd(message_buffer); + } break; + + default: + SERIAL_ECHOLNPAIR("UNKNOWN E/B COMMAND", command); + return; + } +} + +/** + * Process an LCD 'J' command. + * These are currently all movement commands. + * The command portion begins after the : + * Move X Axis + * + * {J:E}{J:X-200}{J:E} + * {J:E}{J:X+200}{J:E} + * X, Y, Z, A (extruder) + */ +void process_lcd_j_command(const char* command) { + static bool steppers_enabled = false; + char axis = command[0]; + + switch (axis) { + case 'E': + // enable or disable steppers + // switch to relative + enqueue_and_echo_commands_now_P(PSTR("G91")); + enqueue_and_echo_commands_now_P(steppers_enabled ? PSTR("M18") : PSTR("M17")); + steppers_enabled = !steppers_enabled; + break; + case 'A': + axis = 'E'; + // fallthru + case 'Y': + case 'Z': + case 'X': { + // G0 + // The M200 class UI seems to send movement in .1mm values. + char cmd[20]; + sprintf_P(cmd, PSTR("G1 %c%03.1f"), axis, atof(command + 1) / 10.0); + enqueue_and_echo_command_now(cmd); + } break; + default: + SERIAL_ECHOLNPAIR("UNKNOWN J COMMAND", command); + return; + } +} + +/** + * Process an LCD 'P' command, related to homing and printing. + * Cancel: + * {P:X} + * + * Home all axes: + * {P:H} + * + * Print a file: + * {P:000} + * The File number is specified as a three digit value. + * Printer responds with: + * {PRINTFILE:Mini_SNES_Bottom.gcode} + * {SYS:BUILD}echo:Now fresh file: Mini_SNES_Bottom.gcode + * File opened: Mini_SNES_Bottom.gcode Size: 5805813 + * File selected + * {SYS:BUILD} + * T:-2526.8 E:0 + * T:-2533.0 E:0 + * T:-2537.4 E:0 + * Note only the curly brace stuff matters. + */ +void process_lcd_p_command(const char* command) { + + switch (command[0]) { + case 'X': + #if ENABLED(SDSUPPORT) + // cancel print + write_to_lcd_P(PSTR("{SYS:CANCELING}")); + last_printing_status = false; + card.stopSDPrint( + #if SD_RESORT + true + #endif + ); + clear_command_queue(); + quickstop_stepper(); + print_job_timer.stop(); + thermalManager.disable_all_heaters(); + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; + #endif + wait_for_heatup = false; + write_to_lcd_P(PSTR("{SYS:STARTED}")); + #endif + break; + case 'H': + // Home all axis + enqueue_and_echo_commands_now_P(PSTR("G28")); + break; + default: { + #if ENABLED(SDSUPPORT) + // Print file 000 - a three digit number indicating which + // file to print in the SD card. If it's a directory, + // then switch to the directory. + + // Find the name of the file to print. + // It's needed to echo the PRINTFILE option. + // The {S:L} command should've ensured the SD card was mounted. + card.getfilename(atoi(command)); + + // There may be a difference in how V1 and V2 LCDs handle subdirectory + // prints. Investigate more. This matches the V1 motion controller actions + // but the V2 LCD switches to "print" mode on {SYS:DIR} response. + if (card.filenameIsDir) { + card.chdir(card.filename); + write_to_lcd_P(PSTR("{SYS:DIR}")); + } + else { + char message_buffer[MAX_CURLY_COMMAND]; + sprintf_P(message_buffer, PSTR("{PRINTFILE:%s}"), card.longest_filename()); + write_to_lcd(message_buffer); + write_to_lcd_P(PSTR("{SYS:BUILD}")); + card.openAndPrintFile(card.filename); + } + #endif + } break; // default + } // switch +} + +/** + * Handle an lcd 'S' command + * {S:I} - Temperature request + * {T0:999/000}{T1:000/000}{TP:004/000} + * + * {S:L} - File Listing request + * Printer Response: + * {FILE:buttons.gcode} + * {FILE:update.bin} + * {FILE:nupdate.bin} + * {FILE:fcupdate.flg} + * {SYS:OK} + */ +void process_lcd_s_command(const char* command) { + switch (command[0]) { + case 'I': { + // temperature information + char message_buffer[MAX_CURLY_COMMAND]; + sprintf_P(message_buffer, PSTR("{T0:%03.0f/%03i}{T1:000/000}{TP:%03.0f/%03i}"), + thermalManager.degHotend(0), thermalManager.degTargetHotend(0), + #if HAS_HEATED_BED + thermalManager.degBed(), thermalManager.degTargetBed() + #else + 0, 0 + #endif + ); + write_to_lcd(message_buffer); + } break; + + case 'H': + // Home all axis + enqueue_and_echo_command("G28"); + break; + + case 'L': { + #if ENABLED(SDSUPPORT) + if (!card.cardOK) card.initsd(); + + // A more efficient way to do this would be to + // implement a callback in the ls_SerialPrint code, but + // that requires changes to the core cardreader class that + // would not benefit the majority of users. Since one can't + // select a file for printing during a print, there's + // little reason not to do it this way. + char message_buffer[MAX_CURLY_COMMAND]; + uint16_t file_count = card.get_num_Files(); + for (uint16_t i = 0; i < file_count; i++) { + card.getfilename(i); + sprintf_P(message_buffer, card.filenameIsDir ? PSTR("{DIR:%s}") : PSTR("{FILE:%s}"), card.longest_filename()); + write_to_lcd(message_buffer); + } + + write_to_lcd_P(PSTR("{SYS:OK}")); + #endif + } break; + + default: + SERIAL_ECHOLNPAIR("UNKNOWN S COMMAND", command); + return; + } +} + +/** + * Receive a curly brace command and translate to G-code. + * Currently {E:0} is not handled. Its function is unknown, + * but it occurs during the temp window after a sys build. + */ +void process_lcd_command(const char* command) { + const char *current = command; + + current++; // skip the leading {. The trailing one is already gone. + byte command_code = *current++; + if (*current != ':') { + SERIAL_ECHOLNPAIR("UNKNOWN COMMAND FORMAT", command); + return; + } + + current++; // skip the : + + switch (command_code) { + case 'S': + process_lcd_s_command(current); + break; + case 'J': + process_lcd_j_command(current); + break; + case 'P': + process_lcd_p_command(current); + break; + case 'C': + process_lcd_c_command(current); + break; + case 'B': + case 'E': + process_lcd_eb_command(current); + break; + default: + SERIAL_ECHOLNPAIR("UNKNOWN COMMAND", command); + return; + } +} + +/** + * UC means connected. + * UD means disconnected + * The stock firmware considers USB initialized as "connected." + */ +void update_usb_status(const bool forceUpdate) { + static bool last_usb_connected_status = false; + // This is mildly different than stock, which + // appears to use the usb discovery status. + // This is more logical. + if (last_usb_connected_status != Serial || forceUpdate) { + last_usb_connected_status = Serial; + write_to_lcd_P(last_usb_connected_status ? PSTR("{R:UC}\r\n") : PSTR("{R:UD}\r\n")); + } +} + +/** + * - from printer on startup: + * {SYS:STARTED}{VER:29}{SYS:STARTED}{R:UD} + * The optimize attribute fixes a register Compile + * error for amtel. + */ +void lcd_update() { + static char inbound_buffer[MAX_CURLY_COMMAND]; + + // First report USB status. + update_usb_status(false); + + // now drain commands... + while (LCD_SERIAL.available()) { + const byte b = (byte)LCD_SERIAL.read() & 0x7F; + inbound_buffer[inbound_count++] = b; + if (b == '}' || inbound_count == sizeof(inbound_buffer) - 1) { + inbound_buffer[inbound_count - 1] = '\0'; + process_lcd_command(inbound_buffer); + inbound_count = 0; + inbound_buffer[0] = 0; + } + } + + #if ENABLED(SDSUPPORT) + // The way last printing status works is simple: + // The UI needs to see at least one TQ which is not 100% + // and then when the print is complete, one which is. + static uint8_t last_percent_done = 100; + + // If there was a print in progress, we need to emit the final + // print status as {TQ:100}. Reset last percent done so a new print will + // issue a percent of 0. + const uint8_t percent_done = card.sdprinting ? card.percentDone() : last_printing_status ? 100 : 0; + if (percent_done != last_percent_done) { + char message_buffer[10]; + sprintf_P(message_buffer, PSTR("{TQ:%03i}"), percent_done); + write_to_lcd(message_buffer); + last_percent_done = percent_done; + last_printing_status = card.sdprinting; + } + #endif +} + +/** + * The Malyan LCD actually runs as a separate MCU on Serial 1. + * This code's job is to siphon the weird curly-brace commands from + * it and translate into gcode, which then gets injected into + * the command queue where possible. + */ +void lcd_init() { + inbound_count = 0; + LCD_SERIAL.begin(500000); + + // Signal init + write_to_lcd_P(PSTR("{SYS:STARTED}\r\n")); + + // send a version that says "unsupported" + write_to_lcd_P(PSTR("{VER:99}\r\n")); + + // No idea why it does this twice. + write_to_lcd_P(PSTR("{SYS:STARTED}\r\n")); + update_usb_status(true); +} + +/** + * Set an alert. + */ +void lcd_setalertstatusPGM(const char* message) { + char message_buffer[MAX_CURLY_COMMAND]; + sprintf_P(message_buffer, PSTR("{E:%s}"), message); + write_to_lcd(message_buffer); +} + +#endif // MALYAN_LCD diff --git a/Marlin/src/lcd/menu/game/brickout.cpp b/Marlin/src/lcd/menu/game/brickout.cpp deleted file mode 100644 index 4bdc924380..0000000000 --- a/Marlin/src/lcd/menu/game/brickout.cpp +++ /dev/null @@ -1,207 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(MARLIN_BRICKOUT) - -#include "game.h" - -#define BRICK_H 5 -#define BRICK_TOP MENU_FONT_ASCENT - -#define PADDLE_H 2 -#define PADDLE_VEL 3 -#define PADDLE_W ((LCD_PIXEL_WIDTH) / 8) -#define PADDLE_Y (LCD_PIXEL_HEIGHT - 1 - PADDLE_H) - -#define BRICK_W ((LCD_PIXEL_WIDTH) / (BRICK_COLS)) -#define BRICK_BOT (BRICK_TOP + BRICK_H * BRICK_ROWS - 1) - -#define BRICK_COL(X) ((X) / (BRICK_W)) -#define BRICK_ROW(Y) ((Y - (BRICK_TOP)) / (BRICK_H)) - -brickout_data_t &bdat = marlin_game_data.brickout; - -inline void reset_bricks(const uint16_t v) { - bdat.brick_count = (BRICK_COLS) * (BRICK_ROWS); - LOOP_L_N(i, BRICK_ROWS) bdat.bricks[i] = v; -} - -void reset_ball() { - constexpr uint8_t ball_dist = 24; - bdat.bally = BTOF(PADDLE_Y - ball_dist); - bdat.ballv = FTOP(1.3f); - bdat.ballh = -FTOP(1.25f); - uint8_t bx = bdat.paddle_x + (PADDLE_W) / 2 + ball_dist; - if (bx >= LCD_PIXEL_WIDTH - 10) { bx -= ball_dist * 2; bdat.ballh = -bdat.ballh; } - bdat.ballx = BTOF(bx); - bdat.hit_dir = -1; -} - -void BrickoutGame::game_screen() { - if (game_frame()) { // Run logic twice for finer resolution - // Update Paddle Position - bdat.paddle_x = constrain(int8_t(ui.encoderPosition), 0, (LCD_PIXEL_WIDTH - (PADDLE_W)) / (PADDLE_VEL)); - ui.encoderPosition = bdat.paddle_x; - bdat.paddle_x *= (PADDLE_VEL); - - // Run the ball logic - if (game_state) do { - - // Provisionally update the ball position - const fixed_t newx = bdat.ballx + bdat.ballh, newy = bdat.bally + bdat.ballv; // current next position - if (!WITHIN(newx, 0, BTOF(LCD_PIXEL_WIDTH - 1))) { // out in x? - bdat.ballh = -bdat.ballh; _BUZZ(5, 220); // bounce x - } - if (newy < 0) { // out in y? - bdat.ballv = -bdat.ballv; _BUZZ(5, 280); // bounce v - bdat.hit_dir = 1; - } - // Did the ball go below the bottom? - else if (newy > BTOF(LCD_PIXEL_HEIGHT)) { - _BUZZ(500, 75); - if (--bdat.balls_left) reset_ball(); else game_state = 0; - break; // done - } - - // Is the ball colliding with a brick? - if (WITHIN(newy, BTOF(BRICK_TOP), BTOF(BRICK_BOT))) { - const int8_t bit = BRICK_COL(FTOB(newx)), row = BRICK_ROW(FTOB(newy)); - const uint16_t mask = _BV(bit); - if (bdat.bricks[row] & mask) { - // Yes. Remove it! - bdat.bricks[row] &= ~mask; - // Score! - score += BRICK_ROWS - row; - // If bricks are gone, go to reset state - if (!--bdat.brick_count) game_state = 2; - // Bounce the ball cleverly - if ((bdat.ballv < 0) == (bdat.hit_dir < 0)) { bdat.ballv = -bdat.ballv; bdat.ballh += fixed_t(random(-16, 16)); _BUZZ(5, 880); } - else { bdat.ballh = -bdat.ballh; bdat.ballv += fixed_t(random(-16, 16)); _BUZZ(5, 640); } - } - } - // Is the ball moving down and in paddle range? - else if (bdat.ballv > 0 && WITHIN(newy, BTOF(PADDLE_Y), BTOF(PADDLE_Y + PADDLE_H))) { - // Ball actually hitting paddle - const int8_t diff = FTOB(newx) - bdat.paddle_x; - if (WITHIN(diff, 0, PADDLE_W - 1)) { - - // Reverse Y direction - bdat.ballv = -bdat.ballv; _BUZZ(3, 880); - bdat.hit_dir = -1; - - // Near edges affects X velocity - const bool is_left_edge = (diff <= 1); - if (is_left_edge || diff >= PADDLE_W-1 - 1) { - if ((bdat.ballh > 0) == is_left_edge) bdat.ballh = -bdat.ballh; - } - else if (diff <= 3) { - bdat.ballh += fixed_t(random(-64, 0)); - NOLESS(bdat.ballh, BTOF(-2)); - NOMORE(bdat.ballh, BTOF(2)); - } - else if (diff >= PADDLE_W-1 - 3) { - bdat.ballh += fixed_t(random( 0, 64)); - NOLESS(bdat.ballh, BTOF(-2)); - NOMORE(bdat.ballh, BTOF(2)); - } - - // Paddle hit after clearing the board? Reset the board. - if (game_state == 2) { reset_bricks(0xFFFF); game_state = 1; } - } - } - - bdat.ballx += bdat.ballh; bdat.bally += bdat.ballv; // update with new velocity - - } while (false); - } - - u8g.setColorIndex(1); - - // Draw bricks - if (PAGE_CONTAINS(BRICK_TOP, BRICK_BOT)) { - LOOP_L_N(y, BRICK_ROWS) { - const uint8_t yy = y * BRICK_H + BRICK_TOP; - if (PAGE_CONTAINS(yy, yy + BRICK_H - 1)) { - LOOP_L_N(x, BRICK_COLS) { - if (TEST(bdat.bricks[y], x)) { - const uint8_t xx = x * BRICK_W; - LOOP_L_N(v, BRICK_H - 1) - if (PAGE_CONTAINS(yy + v, yy + v)) - u8g.drawHLine(xx, yy + v, BRICK_W - 1); - } - } - } - } - } - - // Draw paddle - if (PAGE_CONTAINS(PADDLE_Y-1, PADDLE_Y)) { - u8g.drawHLine(bdat.paddle_x, PADDLE_Y, PADDLE_W); - #if PADDLE_H > 1 - u8g.drawHLine(bdat.paddle_x, PADDLE_Y-1, PADDLE_W); - #if PADDLE_H > 2 - u8g.drawHLine(bdat.paddle_x, PADDLE_Y-2, PADDLE_W); - #endif - #endif - } - - // Draw ball while game is running - if (game_state) { - const uint8_t by = FTOB(bdat.bally); - if (PAGE_CONTAINS(by, by+1)) - u8g.drawFrame(FTOB(bdat.ballx), by, 2, 2); - } - // Or draw GAME OVER - else - draw_game_over(); - - if (PAGE_UNDER(MENU_FONT_ASCENT)) { - // Score Digits - //const uint8_t sx = (LCD_PIXEL_WIDTH - (score >= 10 ? score >= 100 ? score >= 1000 ? 4 : 3 : 2 : 1) * MENU_FONT_WIDTH) / 2; - constexpr uint8_t sx = 0; - lcd_put_int(sx, MENU_FONT_ASCENT - 1, score); - - // Balls Left - lcd_moveto(LCD_PIXEL_WIDTH - MENU_FONT_WIDTH * 3, MENU_FONT_ASCENT - 1); - PGM_P const ohs = PSTR("ooo\0\0"); - lcd_put_u8str_P(ohs + 3 - bdat.balls_left); - } - - // A click always exits this game - if (ui.use_click()) exit_game(); -} - -#define SCREEN_M ((LCD_PIXEL_WIDTH) / 2) - -void BrickoutGame::enter_game() { - init_game(2, game_screen); // 2 = reset bricks on paddle hit - constexpr uint8_t paddle_start = SCREEN_M - (PADDLE_W) / 2; - bdat.paddle_x = paddle_start; - bdat.balls_left = 3; - reset_bricks(0x0000); - reset_ball(); - ui.encoderPosition = paddle_start / (PADDLE_VEL); -} - -#endif // MARLIN_BRICKOUT diff --git a/Marlin/src/lcd/menu/game/brickout.h b/Marlin/src/lcd/menu/game/brickout.h deleted file mode 100644 index cf1fbc6d98..0000000000 --- a/Marlin/src/lcd/menu/game/brickout.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "types.h" - -#define BRICK_ROWS 4 -#define BRICK_COLS 16 - -typedef struct { - uint8_t balls_left, brick_count; - uint16_t bricks[BRICK_ROWS]; - int8_t paddle_x, hit_dir; - fixed_t ballx, bally, ballh, ballv; -} brickout_data_t; - -class BrickoutGame : MarlinGame { public: static void enter_game(), game_screen(); }; - -extern BrickoutGame brickout; diff --git a/Marlin/src/lcd/menu/game/game.cpp b/Marlin/src/lcd/menu/game/game.cpp deleted file mode 100644 index c14bd2a68d..0000000000 --- a/Marlin/src/lcd/menu/game/game.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GAMES - -#include "game.h" - -int MarlinGame::score; -uint8_t MarlinGame::game_state; -millis_t MarlinGame::next_frame; - -MarlinGameData marlin_game_data; - -bool MarlinGame::game_frame() { - static int8_t slew; - if (ui.first_page) slew = 2; - ui.refresh(LCDVIEW_CALL_NO_REDRAW); // Refresh as often as possible - return (game_state && slew-- > 0); -} - -void MarlinGame::draw_game_over() { - constexpr int8_t gowide = (MENU_FONT_WIDTH) * 9, - gohigh = MENU_FONT_ASCENT - 3, - lx = (LCD_PIXEL_WIDTH - gowide) / 2, - ly = (LCD_PIXEL_HEIGHT + gohigh) / 2; - if (PAGE_CONTAINS(ly - gohigh - 1, ly + 1)) { - u8g.setColorIndex(0); - u8g.drawBox(lx - 1, ly - gohigh - 1, gowide + 2, gohigh + 2); - u8g.setColorIndex(1); - if (ui.get_blink()) lcd_put_u8str_P(lx, ly, PSTR("GAME OVER")); - } -} - -void MarlinGame::init_game(const uint8_t init_state, const screenFunc_t screen) { - score = 0; - game_state = init_state; - ui.goto_screen(screen); - ui.defer_status_screen(); -} - -void MarlinGame::exit_game() { - ui.goto_previous_screen_no_defer(); -} - -#endif // HAS_GAMES diff --git a/Marlin/src/lcd/menu/game/game.h b/Marlin/src/lcd/menu/game/game.h deleted file mode 100644 index e788f29805..0000000000 --- a/Marlin/src/lcd/menu/game/game.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../../inc/MarlinConfigPre.h" -#include "../../dogm/ultralcd_DOGM.h" -#include "../../lcdprint.h" -#include "../../ultralcd.h" - -//#define MUTE_GAMES - -#if ENABLED(MUTE_GAMES) || !HAS_BUZZER - #define _BUZZ(D,F) NOOP -#else - #define _BUZZ(D,F) BUZZ(D,F) -#endif - -#if HAS_GAME_MENU - void menu_game(); -#endif - -#if ENABLED(MARLIN_BRICKOUT) - #include "brickout.h" -#endif -#if ENABLED(MARLIN_INVADERS) - #include "invaders.h" -#endif -#if ENABLED(MARLIN_MAZE) - #include "maze.h" -#endif -#if ENABLED(MARLIN_SNAKE) - #include "snake.h" -#endif - -// Pool game data to save SRAM -union MarlinGameData { - TERN_(MARLIN_BRICKOUT, brickout_data_t brickout); - TERN_(MARLIN_INVADERS, invaders_data_t invaders); - TERN_(MARLIN_SNAKE, snake_data_t snake); - TERN_(MARLIN_MAZE, maze_data_t maze); -}; - -extern MarlinGameData marlin_game_data; diff --git a/Marlin/src/lcd/menu/game/invaders.cpp b/Marlin/src/lcd/menu/game/invaders.cpp deleted file mode 100644 index 56e4c224dd..0000000000 --- a/Marlin/src/lcd/menu/game/invaders.cpp +++ /dev/null @@ -1,438 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(MARLIN_INVADERS) - -#include "game.h" - -#define CANNON_W 11 -#define CANNON_H 8 -#define CANNON_VEL 4 -#define CANNON_Y (LCD_PIXEL_HEIGHT - 1 - CANNON_H) - -#define INVADER_VEL 3 - -#define INVADER_TOP MENU_FONT_ASCENT -#define INVADERS_WIDE ((INVADER_COL_W) * (INVADER_COLS)) -#define INVADERS_HIGH ((INVADER_ROW_H) * (INVADER_ROWS)) - -#define UFO_H 5 -#define UFO_W 13 - -#define LASER_H 4 -#define SHOT_H 3 -#define EXPL_W 11 -#define LIFE_W 8 -#define LIFE_H 5 - -#define INVADER_RIGHT ((INVADER_COLS) * (INVADER_COL_W)) - -// 11x8 -const unsigned char invader[3][2][16] PROGMEM = { - { { B00000110,B00000000, - B00001111,B00000000, - B00011111,B10000000, - B00110110,B11000000, - B00111111,B11000000, - B00001001,B00000000, - B00010110,B10000000, - B00101001,B01000000 - }, { - B00000110,B00000000, - B00001111,B00000000, - B00011111,B10000000, - B00110110,B11000000, - B00111111,B11000000, - B00010110,B10000000, - B00100000,B01000000, - B00010000,B10000000 - } - }, { - { B00010000,B01000000, - B00001000,B10000000, - B00011111,B11000000, - B00110111,B01100000, - B01111111,B11110000, - B01011111,B11010000, - B01010000,B01010000, - B00001101,B10000000 - }, { - B00010000,B01000000, - B01001000,B10010000, - B01011111,B11010000, - B01110111,B01110000, - B01111111,B11110000, - B00011111,B11000000, - B00010000,B01000000, - B00100000,B00100000 - } - }, { - { B00001111,B00000000, - B01111111,B11100000, - B11111111,B11110000, - B11100110,B01110000, - B11111111,B11110000, - B00011001,B10000000, - B00110110,B11000000, - B11000000,B00110000 - }, { - B00001111,B00000000, - B01111111,B11100000, - B11111111,B11110000, - B11100110,B01110000, - B11111111,B11110000, - B00011001,B10000000, - B00110110,B11000000, - B00011001,B10000000 - } - } -}; -const unsigned char cannon[] PROGMEM = { - B00000100,B00000000, - B00001110,B00000000, - B00001110,B00000000, - B01111111,B11000000, - B11111111,B11100000, - B11111111,B11100000, - B11111111,B11100000, - B11111111,B11100000 -}; -const unsigned char life[] PROGMEM = { - B00010000, - B01111100, - B11111110, - B11111110, - B11111110 -}; -const unsigned char explosion[] PROGMEM = { - B01000100,B01000000, - B00100100,B10000000, - B00000000,B00000000, - B00110001,B10000000, - B00000000,B00000000, - B00100100,B10000000, - B01000100,B01000000 -}; -const unsigned char ufo[] PROGMEM = { - B00011111,B11000000, - B01111111,B11110000, - B11011101,B11011000, - B11111111,B11111000, - B01111111,B11110000 -}; - -constexpr uint8_t inv_type[] = { - #if INVADER_ROWS == 5 - 0, 1, 1, 2, 2 - #elif INVADER_ROWS == 4 - 0, 1, 1, 2 - #elif INVADER_ROWS == 3 - 0, 1, 2 - #else - #error "INVASION_SIZE must be 3, 4, or 5." - #endif -}; - -invaders_data_t &idat = marlin_game_data.invaders; - -#define INV_X_LEFT(C,T) (idat.pos.x + (C) * (INVADER_COL_W) + inv_off[T]) -#define INV_X_CTR(C,T) (INV_X_LEFT(C,T) + inv_wide[T] / 2) -#define INV_Y_BOT(R) (idat.pos.y + (R + 1) * (INVADER_ROW_H) - 2) - -constexpr uint8_t inv_off[] = { 2, 1, 0 }, inv_wide[] = { 8, 11, 12 }; - -inline void update_invader_data() { - uint8_t inv_mask = 0; - // Get a list of all active invaders - uint8_t sc = 0; - LOOP_L_N(y, INVADER_ROWS) { - uint8_t m = idat.bugs[y]; - if (m) idat.botmost = y + 1; - inv_mask |= m; - LOOP_L_N(x, INVADER_COLS) - if (TEST(m, x)) idat.shooters[sc++] = (y << 4) | x; - } - idat.leftmost = 0; - LOOP_L_N(i, INVADER_COLS) { if (TEST(inv_mask, i)) break; idat.leftmost -= INVADER_COL_W; } - idat.rightmost = LCD_PIXEL_WIDTH - (INVADERS_WIDE); - for (uint8_t i = INVADER_COLS; i--;) { if (TEST(inv_mask, i)) break; idat.rightmost += INVADER_COL_W; } - if (idat.count == 2) idat.dir = idat.dir > 0 ? INVADER_VEL + 1 : -(INVADER_VEL + 1); -} - -inline void reset_bullets() { - LOOP_L_N(i, COUNT(idat.bullet)) idat.bullet[i].v = 0; -} - -inline void reset_invaders() { - idat.pos.x = 0; idat.pos.y = INVADER_TOP; - idat.dir = INVADER_VEL; - idat.count = (INVADER_COLS) * (INVADER_ROWS); - LOOP_L_N(i, INVADER_ROWS) idat.bugs[i] = _BV(INVADER_COLS) - 1; - update_invader_data(); - reset_bullets(); -} - - -inline void spawn_ufo() { - idat.ufov = random(0, 2) ? 1 : -1; - idat.ufox = idat.ufov > 0 ? -(UFO_W) : LCD_PIXEL_WIDTH - 1; -} - -inline void reset_player() { - idat.cannon_x = 0; - ui.encoderPosition = 0; -} - -inline void fire_cannon() { - idat.laser.x = idat.cannon_x + CANNON_W / 2; - idat.laser.y = LCD_PIXEL_HEIGHT - CANNON_H - (LASER_H); - idat.laser.v = -(LASER_H); -} - -inline void explode(const int8_t x, const int8_t y, const int8_t v=4) { - idat.explod.x = x - (EXPL_W) / 2; - idat.explod.y = y; - idat.explod.v = v; -} - -inline void kill_cannon(uint8_t &game_state, const uint8_t st) { - reset_bullets(); - explode(idat.cannon_x + (CANNON_W) / 2, CANNON_Y, 6); - _BUZZ(1000, 10); - if (--idat.cannons_left) { - idat.laser.v = 0; - game_state = st; - reset_player(); - } - else - game_state = 0; -} - -void InvadersGame::game_screen() { - ui.refresh(LCDVIEW_CALL_NO_REDRAW); // Call as often as possible - - // Run game logic once per full screen - if (ui.first_page) { - - // Update Cannon Position - int16_t ep = constrain(int16_t(ui.encoderPosition), 0, (LCD_PIXEL_WIDTH - (CANNON_W)) / (CANNON_VEL)); - ui.encoderPosition = ep; - - ep *= (CANNON_VEL); - if (ep > idat.cannon_x) { idat.cannon_x += CANNON_VEL - 1; if (ep - idat.cannon_x < 2) idat.cannon_x = ep; } - if (ep < idat.cannon_x) { idat.cannon_x -= CANNON_VEL - 1; if (idat.cannon_x - ep < 2) idat.cannon_x = ep; } - - // Run the game logic - if (game_state) do { - - // Move the UFO, if any - if (idat.ufov) { idat.ufox += idat.ufov; if (!WITHIN(idat.ufox, -(UFO_W), LCD_PIXEL_WIDTH - 1)) idat.ufov = 0; } - - if (game_state > 1) { if (--game_state == 2) { reset_invaders(); } else if (game_state == 100) { game_state = 1; } break; } - - const bool did_blink = (++idat.blink_count > idat.count >> 1); - if (did_blink) { - idat.game_blink = !idat.game_blink; - idat.blink_count = 0; - } - - if (idat.count && did_blink) { - const int8_t newx = idat.pos.x + idat.dir; - if (!WITHIN(newx, idat.leftmost, idat.rightmost)) { // Invaders reached the edge? - idat.dir *= -1; // Invaders change direction - idat.pos.y += (INVADER_ROW_H) / 2; // Invaders move down - idat.pos.x -= idat.dir; // ...and only move down this time. - if (idat.pos.y + idat.botmost * (INVADER_ROW_H) - 2 >= CANNON_Y) // Invaders reached the bottom? - kill_cannon(game_state, 20); // Kill the cannon. Reset invaders. - } - - idat.pos.x += idat.dir; // Invaders take one step left/right - - // Randomly shoot if invaders are listed - if (idat.count && !random(0, 20)) { - - // Find a free bullet - laser_t *b = nullptr; - LOOP_L_N(i, COUNT(idat.bullet)) if (!idat.bullet[i].v) { b = &idat.bullet[i]; break; } - if (b) { - // Pick a random shooter and update the bullet - //SERIAL_ECHOLNPGM("free bullet found"); - const uint8_t inv = idat.shooters[random(0, idat.count + 1)], col = inv & 0x0F, row = inv >> 4, type = inv_type[row]; - b->x = INV_X_CTR(col, type); - b->y = INV_Y_BOT(row); - b->v = 2 + random(0, 2); - } - } - } - - // Update the laser position - if (idat.laser.v) { - idat.laser.y += idat.laser.v; - if (idat.laser.y < 0) idat.laser.v = 0; - } - - // Did the laser collide with an invader? - if (idat.laser.v && WITHIN(idat.laser.y, idat.pos.y, idat.pos.y + INVADERS_HIGH - 1)) { - const int8_t col = idat.laser_col(); - if (WITHIN(col, 0, INVADER_COLS - 1)) { - const int8_t row = idat.laser_row(); - if (WITHIN(row, 0, INVADER_ROWS - 1)) { - const uint8_t mask = _BV(col); - if (idat.bugs[row] & mask) { - const uint8_t type = inv_type[row]; - const int8_t invx = INV_X_LEFT(col, type); - if (WITHIN(idat.laser.x, invx, invx + inv_wide[type] - 1)) { - // Turn off laser - idat.laser.v = 0; - // Remove the invader! - idat.bugs[row] &= ~mask; - // Score! - score += INVADER_ROWS - row; - // Explode sound! - _BUZZ(40, 10); - // Explosion bitmap! - explode(invx + inv_wide[type] / 2, idat.pos.y + row * (INVADER_ROW_H)); - // If invaders are gone, go to reset invaders state - if (--idat.count) update_invader_data(); else { game_state = 20; reset_bullets(); } - } // laser x hit - } // invader exists - } // good row - } // good col - } // laser in invader zone - - // Handle alien bullets - LOOP_L_N(s, COUNT(idat.bullet)) { - laser_t *b = &idat.bullet[s]; - if (b->v) { - // Update alien bullet position - b->y += b->v; - if (b->y >= LCD_PIXEL_HEIGHT) - b->v = 0; // Offscreen - else if (b->y >= CANNON_Y && WITHIN(b->x, idat.cannon_x, idat.cannon_x + CANNON_W - 1)) - kill_cannon(game_state, 120); // Hit the cannon - } - } - - // Randomly spawn a UFO - if (!idat.ufov && !random(0,500)) spawn_ufo(); - - // Did the laser hit a ufo? - if (idat.laser.v && idat.ufov && idat.laser.y < UFO_H + 2 && WITHIN(idat.laser.x, idat.ufox, idat.ufox + UFO_W - 1)) { - // Turn off laser and UFO - idat.laser.v = idat.ufov = 0; - // Score! - score += 10; - // Explode! - _BUZZ(40, 10); - // Explosion bitmap - explode(idat.ufox + (UFO_W) / 2, 1); - } - - } while (false); - - } - - // Click-and-hold to abort - if (ui.button_pressed()) --idat.quit_count; else idat.quit_count = 10; - - // Click to fire or exit - if (ui.use_click()) { - if (!game_state) - idat.quit_count = 0; - else if (game_state == 1 && !idat.laser.v) - fire_cannon(); - } - - if (!idat.quit_count) exit_game(); - - u8g.setColorIndex(1); - - // Draw invaders - if (PAGE_CONTAINS(idat.pos.y, idat.pos.y + idat.botmost * (INVADER_ROW_H) - 2 - 1)) { - int8_t yy = idat.pos.y; - LOOP_L_N(y, INVADER_ROWS) { - const uint8_t type = inv_type[y]; - if (PAGE_CONTAINS(yy, yy + INVADER_H - 1)) { - int8_t xx = idat.pos.x; - LOOP_L_N(x, INVADER_COLS) { - if (TEST(idat.bugs[y], x)) - u8g.drawBitmapP(xx, yy, 2, INVADER_H, invader[type][idat.game_blink]); - xx += INVADER_COL_W; - } - } - yy += INVADER_ROW_H; - } - } - - // Draw UFO - if (idat.ufov && PAGE_UNDER(UFO_H + 2)) - u8g.drawBitmapP(idat.ufox, 2, 2, UFO_H, ufo); - - // Draw cannon - if (game_state && PAGE_CONTAINS(CANNON_Y, CANNON_Y + CANNON_H - 1) && (game_state < 2 || (game_state & 0x02))) - u8g.drawBitmapP(idat.cannon_x, CANNON_Y, 2, CANNON_H, cannon); - - // Draw laser - if (idat.laser.v && PAGE_CONTAINS(idat.laser.y, idat.laser.y + LASER_H - 1)) - u8g.drawVLine(idat.laser.x, idat.laser.y, LASER_H); - - // Draw invader bullets - LOOP_L_N (i, COUNT(idat.bullet)) { - if (idat.bullet[i].v && PAGE_CONTAINS(idat.bullet[i].y - (SHOT_H - 1), idat.bullet[i].y)) - u8g.drawVLine(idat.bullet[i].x, idat.bullet[i].y - (SHOT_H - 1), SHOT_H); - } - - // Draw explosion - if (idat.explod.v && PAGE_CONTAINS(idat.explod.y, idat.explod.y + 7 - 1)) { - u8g.drawBitmapP(idat.explod.x, idat.explod.y, 2, 7, explosion); - --idat.explod.v; - } - - // Blink GAME OVER when game is over - if (!game_state) draw_game_over(); - - if (PAGE_UNDER(MENU_FONT_ASCENT - 1)) { - // Draw Score - //const uint8_t sx = (LCD_PIXEL_WIDTH - (score >= 10 ? score >= 100 ? score >= 1000 ? 4 : 3 : 2 : 1) * MENU_FONT_WIDTH) / 2; - constexpr uint8_t sx = 0; - lcd_put_int(sx, MENU_FONT_ASCENT - 1, score); - - // Draw lives - if (idat.cannons_left) - for (uint8_t i = 1; i <= idat.cannons_left; ++i) - u8g.drawBitmapP(LCD_PIXEL_WIDTH - i * (LIFE_W), 6 - (LIFE_H), 1, LIFE_H, life); - } - -} - -void InvadersGame::enter_game() { - init_game(20, game_screen); // countdown to reset invaders - idat.cannons_left = 3; - idat.quit_count = 10; - idat.laser.v = 0; - reset_invaders(); - reset_player(); -} - -#endif // MARLIN_INVADERS diff --git a/Marlin/src/lcd/menu/game/invaders.h b/Marlin/src/lcd/menu/game/invaders.h deleted file mode 100644 index c99e6c16ae..0000000000 --- a/Marlin/src/lcd/menu/game/invaders.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "types.h" - -#define INVASION_SIZE 3 - -#if INVASION_SIZE == 3 - #define INVADER_COLS 5 -#elif INVASION_SIZE == 4 - #define INVADER_COLS 6 -#else - #define INVADER_COLS 8 - #undef INVASION_SIZE - #define INVASION_SIZE 5 -#endif - -#define INVADER_ROWS INVASION_SIZE - -#define INVADER_COL_W 14 -#define INVADER_H 8 -#define INVADER_ROW_H (INVADER_H + 2) - -typedef struct { int8_t x, y, v; } laser_t; - -typedef struct { - pos_t pos; - uint8_t cannons_left; - int8_t cannon_x; - laser_t bullet[10], laser, explod; - int8_t dir, leftmost, rightmost, botmost; - uint8_t count, quit_count, blink_count; - uint8_t bugs[INVADER_ROWS], shooters[(INVADER_ROWS) * (INVADER_COLS)]; - int8_t ufox, ufov; - bool game_blink; - int8_t laser_col() { return ((laser.x - pos.x) / (INVADER_COL_W)); }; - int8_t laser_row() { return ((laser.y - pos.y + 2) / (INVADER_ROW_H)); }; -} invaders_data_t; - -class InvadersGame : MarlinGame { public: static void enter_game(), game_screen(); }; - -extern InvadersGame invaders; diff --git a/Marlin/src/lcd/menu/game/maze.cpp b/Marlin/src/lcd/menu/game/maze.cpp deleted file mode 100644 index 85f752ee7d..0000000000 --- a/Marlin/src/lcd/menu/game/maze.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(MARLIN_MAZE) - -#include "game.h" - -int8_t move_dir, last_move_dir, // NESW0 - prizex, prizey, prize_cnt, old_encoder; -fixed_t playerx, playery; - -// Up to 50 lines, then you win! -typedef struct { int8_t x, y; } pos_t; -uint8_t head_ind; -pos_t maze_walls[50] = { - { 0, 0 } -}; - -// Turn the player cw or ccw -inline void turn_player(const bool cw) { - if (move_dir == 4) move_dir = last_move_dir; - move_dir += cw ? 1 : -1; - move_dir &= 0x03; - last_move_dir = move_dir; -} - -// Reset the player for a new game -void player_reset() { - // Init position - playerx = BTOF(1); - playery = BTOF(GAME_H / 2); - - // Init motion with a ccw turn - move_dir = 0; - turn_player(false); - - // Clear prize flag - prize_cnt = 255; - - // Clear the controls - ui.encoderPosition = 0; - old_encoder = 0; -} - -void MazeGame::game_screen() { - // Run the sprite logic - if (game_frame()) do { // Run logic twice for finer resolution - - // Move the man one unit in the current direction - // Direction index 4 is for the stopped man - const int8_t oldx = FTOB(playerx), oldy = FTOB(playery); - pos_t dir_add[] = { { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, 0 } }; - playerx += dir_add[move_dir].x; - playery += dir_add[move_dir].y; - const int8_t x = FTOB(playerx), y = FTOB(playery); - - } while(0); - - u8g.setColorIndex(1); - - // Draw Score - if (PAGE_UNDER(HEADER_H)) lcd_put_int(0, HEADER_H - 1, score); - - // Draw the maze - // LOOP_L_N(n, head_ind) { - // const pos_t &p = maze_walls[n], &q = maze_walls[n + 1]; - // if (p.x == q.x) { - // const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); - // if (PAGE_CONTAINS(y1, y2)) - // u8g.drawVLine(GAMEX(p.x), y1, y2 - y1 + 1); - // } - // else if (PAGE_CONTAINS(GAMEY(p.y), GAMEY(p.y))) { - // const int8_t x1 = GAMEX(_MIN(p.x, q.x)), x2 = GAMEX(_MAX(p.x, q.x)); - // u8g.drawHLine(x1, GAMEY(p.y), x2 - x1 + 1); - // } - // } - - // Draw Man - // const int8_t fy = GAMEY(foody); - // if (PAGE_CONTAINS(fy, fy + FOOD_WH - 1)) { - // const int8_t fx = GAMEX(foodx); - // u8g.drawFrame(fx, fy, FOOD_WH, FOOD_WH); - // if (FOOD_WH == 5) u8g.drawPixel(fx + 2, fy + 2); - // } - - // Draw Ghosts - // const int8_t fy = GAMEY(foody); - // if (PAGE_CONTAINS(fy, fy + FOOD_WH - 1)) { - // const int8_t fx = GAMEX(foodx); - // u8g.drawFrame(fx, fy, FOOD_WH, FOOD_WH); - // if (FOOD_WH == 5) u8g.drawPixel(fx + 2, fy + 2); - // } - - // Draw Prize - // if (PAGE_CONTAINS(prizey, prizey + PRIZE_WH - 1)) { - // u8g.drawFrame(prizex, prizey, PRIZE_WH, PRIZE_WH); - // if (PRIZE_WH == 5) u8g.drawPixel(prizex + 2, prizey + 2); - // } - - // Draw GAME OVER - if (!game_state) draw_game_over(); - - // A click always exits this game - if (ui.use_click()) exit_game(); -} - -void MazeGame::enter_game() { - init_game(1, game_screen); // Game running - reset_player(); - reset_enemies(); -} - -#endif // MARLIN_MAZE diff --git a/Marlin/src/lcd/menu/game/maze.h b/Marlin/src/lcd/menu/game/maze.h deleted file mode 100644 index ff5dde09f5..0000000000 --- a/Marlin/src/lcd/menu/game/maze.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "types.h" - -typedef struct { pos_t pos; } maze_data_t; - -class MazeGame : MarlinGame { public: static void enter_game(), game_screen(); }; - -extern MazeGame maze; diff --git a/Marlin/src/lcd/menu/game/snake.cpp b/Marlin/src/lcd/menu/game/snake.cpp deleted file mode 100644 index f8892a4e7a..0000000000 --- a/Marlin/src/lcd/menu/game/snake.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(MARLIN_SNAKE) - -#include "game.h" - -#define SNAKE_BOX 4 - -#define HEADER_H (MENU_FONT_ASCENT - 2) -#define SNAKE_WH (SNAKE_BOX + 1) - -#define IDEAL_L 2 -#define IDEAL_R (LCD_PIXEL_WIDTH - 1 - 2) -#define IDEAL_T (HEADER_H + 2) -#define IDEAL_B (LCD_PIXEL_HEIGHT - 1 - 2) -#define IDEAL_W (IDEAL_R - (IDEAL_L) + 1) -#define IDEAL_H (IDEAL_B - (IDEAL_T) + 1) - -#define GAME_W int((IDEAL_W) / (SNAKE_WH)) -#define GAME_H int((IDEAL_H) / (SNAKE_WH)) - -#define BOARD_W ((SNAKE_WH) * (GAME_W) + 1) -#define BOARD_H ((SNAKE_WH) * (GAME_H) + 1) -#define BOARD_L ((LCD_PIXEL_WIDTH - (BOARD_W) + 1) / 2) -#define BOARD_R (BOARD_L + BOARD_W - 1) -#define BOARD_T (((LCD_PIXEL_HEIGHT + IDEAL_T) - (BOARD_H)) / 2) -#define BOARD_B (BOARD_T + BOARD_H - 1) - -#define GAMEX(X) (BOARD_L + ((X) * (SNAKE_WH))) -#define GAMEY(Y) (BOARD_T + ((Y) * (SNAKE_WH))) - -#if SNAKE_BOX > 2 - #define FOOD_WH SNAKE_BOX -#else - #define FOOD_WH 2 -#endif - -#if SNAKE_BOX < 1 - #define SNAKE_SIZ 1 -#else - #define SNAKE_SIZ SNAKE_BOX -#endif - -constexpr fixed_t snakev = FTOP(0.20); - -snake_data_t &sdat = marlin_game_data.snake; - -// Remove the first pixel from the tail. -// If needed, shift out the first segment. -void shorten_tail() { - pos_t &p = sdat.snake_tail[0], &q = sdat.snake_tail[1]; - bool shift = false; - if (p.x == q.x) { - // Vertical line - p.y += (q.y > p.y) ? 1 : -1; - shift = p.y == q.y; - } - else { - // Horizontal line - p.x += (q.x > p.x) ? 1 : -1; - shift = p.x == q.x; - } - if (shift) { - sdat.head_ind--; - LOOP_LE_N(i, sdat.head_ind) - sdat.snake_tail[i] = sdat.snake_tail[i + 1]; - } -} - -// The food is on a line -inline bool food_on_line() { - LOOP_L_N(n, sdat.head_ind) { - pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; - if (p.x == q.x) { - if ((sdat.foodx == p.x - 1 || sdat.foodx == p.x) && WITHIN(sdat.foody, _MIN(p.y, q.y), _MAX(p.y, q.y))) - return true; - } - else if ((sdat.foody == p.y - 1 || sdat.foody == p.y) && WITHIN(sdat.foodx, _MIN(p.x, q.x), _MAX(p.x, q.x))) - return true; - } - return false; -} - -// Add a new food blob -void food_reset() { - do { - sdat.foodx = random(0, GAME_W); - sdat.foody = random(0, GAME_H); - } while (food_on_line()); -} - -// Turn the snake cw or ccw -inline void turn_snake(const bool cw) { - sdat.snake_dir += cw ? 1 : -1; - sdat.snake_dir &= 0x03; - sdat.head_ind++; - sdat.snake_tail[sdat.head_ind].x = FTOB(sdat.snakex); - sdat.snake_tail[sdat.head_ind].y = FTOB(sdat.snakey); -} - -// Reset the snake for a new game -void snake_reset() { - // Init the head and velocity - sdat.snakex = BTOF(1); - sdat.snakey = BTOF(GAME_H / 2); - //snakev = FTOP(0.25); - - // Init the tail with a cw turn - sdat.snake_dir = 0; - sdat.head_ind = 0; - sdat.snake_tail[0].x = 0; - sdat.snake_tail[0].y = GAME_H / 2; - turn_snake(true); - - // Clear food flag - sdat.food_cnt = 5; - - // Clear the controls - ui.encoderPosition = 0; - sdat.old_encoder = 0; -} - -// Check if head segment overlaps another -bool snake_overlap() { - // 4 lines must exist before a collision is possible - if (sdat.head_ind < 4) return false; - // Is the last segment crossing any others? - const pos_t &h1 = sdat.snake_tail[sdat.head_ind - 1], &h2 = sdat.snake_tail[sdat.head_ind]; - // VERTICAL head segment? - if (h1.x == h2.x) { - // Loop from oldest to segment two away from head - LOOP_L_N(n, sdat.head_ind - 2) { - // Segment p to q - const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; - if (p.x != q.x) { - // Crossing horizontal segment - if (WITHIN(h1.x, _MIN(p.x, q.x), _MAX(p.x, q.x)) && (h1.y <= p.y) == (h2.y >= p.y)) return true; - } // Overlapping vertical segment - else if (h1.x == p.x && _MIN(h1.y, h2.y) <= _MAX(p.y, q.y) && _MAX(h1.y, h2.y) >= _MIN(p.y, q.y)) return true; - } - } - else { - // Loop from oldest to segment two away from head - LOOP_L_N(n, sdat.head_ind - 2) { - // Segment p to q - const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; - if (p.y != q.y) { - // Crossing vertical segment - if (WITHIN(h1.y, _MIN(p.y, q.y), _MAX(p.y, q.y)) && (h1.x <= p.x) == (h2.x >= p.x)) return true; - } // Overlapping horizontal segment - else if (h1.y == p.y && _MIN(h1.x, h2.x) <= _MAX(p.x, q.x) && _MAX(h1.x, h2.x) >= _MIN(p.x, q.x)) return true; - } - } - return false; -} - -void SnakeGame::game_screen() { - // Run the snake logic - if (game_frame()) do { // Run logic twice for finer resolution - - // Move the snake's head one unit in the current direction - const int8_t oldx = FTOB(sdat.snakex), oldy = FTOB(sdat.snakey); - switch (sdat.snake_dir) { - case 0: sdat.snakey -= snakev; break; - case 1: sdat.snakex += snakev; break; - case 2: sdat.snakey += snakev; break; - case 3: sdat.snakex -= snakev; break; - } - const int8_t x = FTOB(sdat.snakex), y = FTOB(sdat.snakey); - - // If movement took place... - if (oldx != x || oldy != y) { - - if (!WITHIN(x, 0, GAME_W - 1) || !WITHIN(y, 0, GAME_H - 1)) { - game_state = 0; // Game Over - _BUZZ(400, 40); // Bzzzt! - break; // ...out of do-while - } - - sdat.snake_tail[sdat.head_ind].x = x; - sdat.snake_tail[sdat.head_ind].y = y; - - // Change snake direction if set - const int8_t enc = int8_t(ui.encoderPosition), diff = enc - sdat.old_encoder; - if (diff) { - sdat.old_encoder = enc; - turn_snake(diff > 0); - } - - if (sdat.food_cnt) --sdat.food_cnt; else shorten_tail(); - - // Did the snake collide with itself or go out of bounds? - if (snake_overlap()) { - game_state = 0; // Game Over - _BUZZ(400, 40); // Bzzzt! - } - // Is the snake at the food? - else if (x == sdat.foodx && y == sdat.foody) { - _BUZZ(5, 220); - _BUZZ(5, 280); - score++; - sdat.food_cnt = 2; - food_reset(); - } - } - - } while(0); - - u8g.setColorIndex(1); - - // Draw Score - if (PAGE_UNDER(HEADER_H)) lcd_put_int(0, HEADER_H - 1, score); - - // DRAW THE PLAYFIELD BORDER - u8g.drawFrame(BOARD_L - 2, BOARD_T - 2, BOARD_R - BOARD_L + 4, BOARD_B - BOARD_T + 4); - - // Draw the snake (tail) - #if SNAKE_WH < 2 - - // At this scale just draw a line - LOOP_L_N(n, sdat.head_ind) { - const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; - if (p.x == q.x) { - const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); - if (PAGE_CONTAINS(y1, y2)) - u8g.drawVLine(GAMEX(p.x), y1, y2 - y1 + 1); - } - else if (PAGE_CONTAINS(GAMEY(p.y), GAMEY(p.y))) { - const int8_t x1 = GAMEX(_MIN(p.x, q.x)), x2 = GAMEX(_MAX(p.x, q.x)); - u8g.drawHLine(x1, GAMEY(p.y), x2 - x1 + 1); - } - } - - #elif SNAKE_WH == 2 - - // At this scale draw two lines - LOOP_L_N(n, sdat.head_ind) { - const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; - if (p.x == q.x) { - const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); - if (PAGE_CONTAINS(y1, y2 + 1)) - u8g.drawFrame(GAMEX(p.x), y1, 2, y2 - y1 + 1 + 1); - } - else { - const int8_t py = GAMEY(p.y); - if (PAGE_CONTAINS(py, py + 1)) { - const int8_t x1 = GAMEX(_MIN(p.x, q.x)), x2 = GAMEX(_MAX(p.x, q.x)); - u8g.drawFrame(x1, py, x2 - x1 + 1 + 1, 2); - } - } - } - - #else - - // Draw a series of boxes - LOOP_L_N(n, sdat.head_ind) { - const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; - if (p.x == q.x) { - const int8_t y1 = _MIN(p.y, q.y), y2 = _MAX(p.y, q.y); - if (PAGE_CONTAINS(GAMEY(y1), GAMEY(y2) + SNAKE_SIZ - 1)) { - for (int8_t i = y1; i <= y2; ++i) { - const int8_t y = GAMEY(i); - if (PAGE_CONTAINS(y, y + SNAKE_SIZ - 1)) - u8g.drawBox(GAMEX(p.x), y, SNAKE_SIZ, SNAKE_SIZ); - } - } - } - else { - const int8_t py = GAMEY(p.y); - if (PAGE_CONTAINS(py, py + SNAKE_SIZ - 1)) { - const int8_t x1 = _MIN(p.x, q.x), x2 = _MAX(p.x, q.x); - for (int8_t i = x1; i <= x2; ++i) - u8g.drawBox(GAMEX(i), py, SNAKE_SIZ, SNAKE_SIZ); - } - } - } - - #endif - - // Draw food - const int8_t fy = GAMEY(sdat.foody); - if (PAGE_CONTAINS(fy, fy + FOOD_WH - 1)) { - const int8_t fx = GAMEX(sdat.foodx); - u8g.drawFrame(fx, fy, FOOD_WH, FOOD_WH); - if (FOOD_WH == 5) u8g.drawPixel(fx + 2, fy + 2); - } - - // Draw GAME OVER - if (!game_state) draw_game_over(); - - // A click always exits this game - if (ui.use_click()) exit_game(); -} - -void SnakeGame::enter_game() { - init_game(1, game_screen); // 1 = Game running - snake_reset(); - food_reset(); -} - -#endif // MARLIN_SNAKE diff --git a/Marlin/src/lcd/menu/game/snake.h b/Marlin/src/lcd/menu/game/snake.h deleted file mode 100644 index 09a3a722de..0000000000 --- a/Marlin/src/lcd/menu/game/snake.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "types.h" - -typedef struct { - int8_t snake_dir, // NESW - foodx, foody, - food_cnt, - old_encoder; - pos_t snake_tail[50]; - fixed_t snakex, snakey; - uint8_t head_ind; -} snake_data_t; - -class SnakeGame : MarlinGame { public: static void enter_game(), game_screen(); }; - -extern SnakeGame snake; diff --git a/Marlin/src/lcd/menu/game/types.h b/Marlin/src/lcd/menu/game/types.h deleted file mode 100644 index f6e6c78aa0..0000000000 --- a/Marlin/src/lcd/menu/game/types.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -typedef struct { int8_t x, y; } pos_t; - -// Simple 8:8 fixed-point -typedef int16_t fixed_t; -#define FTOP(F) fixed_t((F)*256.0f) -#define PTOF(P) (float(P)*(1.0f/256.0f)) -#define BTOF(X) (fixed_t(X)<<8) -#define FTOB(X) int8_t(fixed_t(X)>>8) - -class MarlinGame { -protected: - static int score; - static uint8_t game_state; - static millis_t next_frame; - - static bool game_frame(); - static void draw_game_over(); - static void exit_game(); -public: - static void init_game(const uint8_t init_state, const screenFunc_t screen); -}; diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp deleted file mode 100644 index 5d67410351..0000000000 --- a/Marlin/src/lcd/menu/menu.cpp +++ /dev/null @@ -1,386 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU - -#include "menu.h" -#include "../../module/planner.h" -#include "../../module/motion.h" -#include "../../module/printcounter.h" -#include "../../gcode/queue.h" - -#if HAS_BUZZER - #include "../../libs/buzzer.h" -#endif - -#if ENABLED(BABYSTEP_ZPROBE_OFFSET) - #include "../../module/probe.h" -#endif - -#if EITHER(ENABLE_LEVELING_FADE_HEIGHT, AUTO_BED_LEVELING_UBL) - #include "../../feature/bedlevel/bedlevel.h" -#endif - -//////////////////////////////////////////// -///////////// Global Variables ///////////// -//////////////////////////////////////////// - -// Menu Navigation -int8_t encoderTopLine, encoderLine, screen_items; - -typedef struct { - screenFunc_t menu_function; - uint32_t encoder_position; - int8_t top_line, items; -} menuPosition; -menuPosition screen_history[6]; -uint8_t screen_history_depth = 0; - -int8_t MenuItemBase::itemIndex; // Index number for draw and action -PGM_P MenuItemBase::itemString; // A PSTR for substitution -chimera_t editable; // Value Editing - -// Menu Edit Items -PGM_P MenuEditItemBase::editLabel; -void* MenuEditItemBase::editValue; -int32_t MenuEditItemBase::minEditValue, - MenuEditItemBase::maxEditValue; -screenFunc_t MenuEditItemBase::callbackFunc; -bool MenuEditItemBase::liveEdit; - -//////////////////////////////////////////// -//////// Menu Navigation & History ///////// -//////////////////////////////////////////// - -void MarlinUI::return_to_status() { goto_screen(status_screen); } - -void MarlinUI::save_previous_screen() { - if (screen_history_depth < COUNT(screen_history)) - screen_history[screen_history_depth++] = { currentScreen, encoderPosition, encoderTopLine, screen_items }; -} - -void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back/*=false*/)) { - TERN(TURBO_BACK_MENU_ITEM,,constexpr bool is_back = false); - TERN_(HAS_TOUCH_XPT2046, on_edit_screen = false); - if (screen_history_depth > 0) { - menuPosition &sh = screen_history[--screen_history_depth]; - goto_screen(sh.menu_function, - is_back ? 0 : sh.encoder_position, - is_back ? 0 : sh.top_line, - sh.items - ); - } - else - return_to_status(); -} - -//////////////////////////////////////////// -/////////// Menu Editing Actions /////////// -//////////////////////////////////////////// - -/** - * Functions for editing single values - * - * The "DEFINE_MENU_EDIT_ITEM" macro generates the classes needed to edit a numerical value. - * - * The prerequisite is that in the header the type was already declared: - * - * DEFINE_MENU_EDIT_ITEM_TYPE(int3, int16_t, i16tostr3rj, 1) - * - * For example, DEFINE_MENU_EDIT_ITEM(int3) expands into: - * - * template class TMenuEditItem - * - * You can then use one of the menu macros to present the edit interface: - * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999) - * - * This expands into a more primitive menu item: - * _MENU_ITEM_P(int3, false, GET_TEXT(MSG_SPEED), &feedrate_percentage, 10, 999) - * - * ...which calls: - * MenuItem_int3::action(plabel, &feedrate_percentage, 10, 999) - * MenuItem_int3::draw(encoderLine == _thisItemNr, _lcdLineNr, plabel, &feedrate_percentage, 10, 999) - */ -void MenuEditItemBase::edit_screen(strfunc_t strfunc, loadfunc_t loadfunc) { - TERN_(HAS_TOUCH_XPT2046, ui.repeat_delay = BUTTON_DELAY_EDIT); - if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = 0; - if (int32_t(ui.encoderPosition) > maxEditValue) ui.encoderPosition = maxEditValue; - if (ui.should_draw()) - draw_edit_screen(strfunc(ui.encoderPosition + minEditValue)); - if (ui.lcd_clicked || (liveEdit && ui.should_draw())) { - if (editValue != nullptr) loadfunc(editValue, ui.encoderPosition + minEditValue); - if (callbackFunc && (liveEdit || ui.lcd_clicked)) (*callbackFunc)(); - if (ui.use_click()) ui.goto_previous_screen(); - } -} - -void MenuEditItemBase::goto_edit_screen( - PGM_P const el, // Edit label - void * const ev, // Edit value pointer - const int32_t minv, // Encoder minimum - const int32_t maxv, // Encoder maximum - const uint16_t ep, // Initial encoder value - const screenFunc_t cs, // MenuItem_type::draw_edit_screen => MenuEditItemBase::edit() - const screenFunc_t cb, // Callback after edit - const bool le // Flag to call cb() during editing -) { - TERN_(HAS_TOUCH_XPT2046, ui.on_edit_screen = true); - ui.screen_changed = true; - ui.save_previous_screen(); - ui.refresh(); - editLabel = el; - editValue = ev; - minEditValue = minv; - maxEditValue = maxv; - ui.encoderPosition = ep; - ui.currentScreen = cs; - callbackFunc = cb; - liveEdit = le; -} - -//////////////////////////////////////////// -///////////////// Menu Tree //////////////// -//////////////////////////////////////////// - -#include "../../MarlinCore.h" - -bool printer_busy() { - return planner.movesplanned() || printingIsActive(); -} - -/** - * General function to go directly to a screen - */ -void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, const uint8_t top/*=0*/, const uint8_t items/*=0*/) { - if (currentScreen != screen) { - - TERN_(HAS_TOUCH_XPT2046, repeat_delay = BUTTON_DELAY_MENU); - - TERN_(LCD_SET_PROGRESS_MANUALLY, progress_reset()); - - #if BOTH(DOUBLECLICK_FOR_Z_BABYSTEPPING, BABYSTEPPING) - static millis_t doubleclick_expire_ms = 0; - // Going to menu_main from status screen? Remember first click time. - // Going back to status screen within a very short time? Go to Z babystepping. - if (screen == menu_main) { - if (on_status_screen()) - doubleclick_expire_ms = millis() + DOUBLECLICK_MAX_INTERVAL; - } - else if (screen == status_screen && currentScreen == menu_main && PENDING(millis(), doubleclick_expire_ms)) { - if ( (ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_known()) - && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy()) ) - screen = TERN(BABYSTEP_ZPROBE_OFFSET, lcd_babystep_zoffset, lcd_babystep_z); - else { - #if ENABLED(MOVE_Z_WHEN_IDLE) - ui.manual_move.menu_scale = MOVE_Z_IDLE_MULTIPLICATOR; - screen = lcd_move_z; - #endif - } - } - #endif - - currentScreen = screen; - encoderPosition = encoder; - encoderTopLine = top; - screen_items = items; - if (on_status_screen()) { - defer_status_screen(false); - TERN_(AUTO_BED_LEVELING_UBL, ubl.lcd_map_control = false); - screen_history_depth = 0; - } - - clear_lcd(); - - // Re-initialize custom characters that may be re-used - #if HAS_MARLINUI_HD44780 - if (TERN1(AUTO_BED_LEVELING_UBL, !ubl.lcd_map_control)) - set_custom_characters(on_status_screen() ? CHARSET_INFO : CHARSET_MENU); - #endif - - refresh(LCDVIEW_CALL_REDRAW_NEXT); - screen_changed = true; - TERN_(HAS_MARLINUI_U8GLIB, drawing_screen = false); - - TERN_(HAS_LCD_MENU, encoder_direction_normal()); - - set_selection(false); - } -} - -//////////////////////////////////////////// -///////////// Manual Movement ////////////// -//////////////////////////////////////////// - -// -// Display a "synchronize" screen with a custom message until -// all moves are finished. Go back to calling screen when done. -// -void MarlinUI::synchronize(PGM_P const msg/*=nullptr*/) { - static PGM_P sync_message = msg ?: GET_TEXT(MSG_MOVING); - save_previous_screen(); - goto_screen([]{ - if (should_draw()) MenuItem_static::draw(LCD_HEIGHT >= 4, sync_message); - }); - defer_status_screen(); - planner.synchronize(); // idle() is called until moves complete - goto_previous_screen_no_defer(); -} - -/** - * Scrolling for menus and other line-based screens - * - * encoderLine is the position based on the encoder - * encoderTopLine is the top menu line to display - * _lcdLineNr is the index of the LCD line (e.g., 0-3) - * _menuLineNr is the menu item to draw and process - * _thisItemNr is the index of each MENU_ITEM or STATIC_ITEM - * screen_items is the total number of items in the menu (after one call) - */ -void scroll_screen(const uint8_t limit, const bool is_menu) { - ui.encoder_direction_menus(); - ENCODER_RATE_MULTIPLY(false); - if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = 0; - if (ui.first_page) { - encoderLine = ui.encoderPosition / (ENCODER_STEPS_PER_MENU_ITEM); - ui.screen_changed = false; - } - if (screen_items > 0 && encoderLine >= screen_items - limit) { - encoderLine = _MAX(0, screen_items - limit); - ui.encoderPosition = encoderLine * (ENCODER_STEPS_PER_MENU_ITEM); - } - if (is_menu) { - NOMORE(encoderTopLine, encoderLine); - if (encoderLine >= encoderTopLine + LCD_HEIGHT) - encoderTopLine = encoderLine - LCD_HEIGHT + 1; - } - else - encoderTopLine = encoderLine; -} - -#if HAS_BUZZER - void MarlinUI::completion_feedback(const bool good/*=true*/) { - if (good) { - BUZZ(100, 659); - BUZZ(100, 698); - } - else BUZZ(20, 440); - } -#endif - -#if HAS_LINE_TO_Z - - void line_to_z(const float &z) { - current_position.z = z; - line_to_current_position(manual_feedrate_mm_s.z); - } - -#endif - -#if ENABLED(BABYSTEP_ZPROBE_OFFSET) - - #include "../../feature/babystep.h" - - void lcd_babystep_zoffset() { - if (ui.use_click()) return ui.goto_previous_screen_no_defer(); - ui.defer_status_screen(); - const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; - if (ui.encoderPosition) { - const int16_t babystep_increment = int16_t(ui.encoderPosition) * (BABYSTEP_SIZE_Z); - ui.encoderPosition = 0; - - const float diff = planner.steps_to_mm[Z_AXIS] * babystep_increment, - new_probe_offset = probe.offset.z + diff, - new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET - , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - diff - , new_probe_offset - ); - if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { - - babystep.add_steps(Z_AXIS, babystep_increment); - - if (do_probe) - probe.offset.z = new_offs; - else - TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); - - ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); - } - } - if (ui.should_draw()) { - if (do_probe) { - MenuEditItemBase::draw_edit_screen(GET_TEXT(MSG_ZPROBE_ZOFFSET), BABYSTEP_TO_STR(probe.offset.z)); - TERN_(BABYSTEP_ZPROBE_GFX_OVERLAY, _lcd_zoffset_overlay_gfx(probe.offset.z)); - } - else { - #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) - MenuEditItemBase::draw_edit_screen(GET_TEXT(MSG_HOTEND_OFFSET_Z), ftostr54sign(hotend_offset[active_extruder].z)); - #endif - } - } - } - -#endif // BABYSTEP_ZPROBE_OFFSET - -void _lcd_draw_homing() { - if (ui.should_draw()) { - constexpr uint8_t line = (LCD_HEIGHT - 1) / 2; - MenuItem_static::draw(line, GET_TEXT(MSG_LEVEL_BED_HOMING)); - } -} - -#if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) - #include "../../feature/bedlevel/bedlevel.h" - void _lcd_toggle_bed_leveling() { set_bed_leveling_enabled(!planner.leveling_active); } -#endif - -// -// Selection screen presents a prompt and two options -// -bool MarlinUI::selection; // = false -bool MarlinUI::update_selection() { - encoder_direction_select(); - if (encoderPosition) { - selection = int16_t(encoderPosition) > 0; - encoderPosition = 0; - } - return selection; -} - -void MenuItem_confirm::select_screen( - PGM_P const yes, PGM_P const no, - selectFunc_t yesFunc, selectFunc_t noFunc, - PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/ -) { - const bool ui_selection = ui.update_selection(), got_click = ui.use_click(); - if (got_click || ui.should_draw()) { - draw_select_screen(yes, no, ui_selection, pref, string, suff); - if (got_click) { - selectFunc_t callFunc = ui_selection ? yesFunc : noFunc; - if (callFunc) callFunc(); else ui.goto_previous_screen(); - } - ui.defer_status_screen(); - } -} - -#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h deleted file mode 100644 index 89970225ad..0000000000 --- a/Marlin/src/lcd/menu/menu.h +++ /dev/null @@ -1,251 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../ultralcd.h" -#include "../../libs/numtostr.h" -#include "../../inc/MarlinConfig.h" - -#include "limits.h" - -extern int8_t encoderLine, encoderTopLine, screen_items; - -void scroll_screen(const uint8_t limit, const bool is_menu); -bool printer_busy(); - -typedef void (*selectFunc_t)(); - -#define SS_LEFT 0x00 -#define SS_CENTER 0x01 -#define SS_INVERT 0x02 -#define SS_DEFAULT SS_CENTER - -#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) - void _lcd_zoffset_overlay_gfx(const float zvalue); -#endif - -#if ENABLED(BABYSTEP_ZPROBE_OFFSET) && Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 - #define BABYSTEP_TO_STR(N) ftostr43sign(N) -#elif ENABLED(BABYSTEPPING) - #define BABYSTEP_TO_STR(N) ftostr53sign(N) -#endif - -//////////////////////////////////////////// -///////////// Base Menu Items ////////////// -//////////////////////////////////////////// - -class MenuItemBase { - public: - // Index to interject in the item label and/or for use by its action. - static int8_t itemIndex; - - // An optional pointer for use in display or by the action - static PGM_P itemString; - - // Store the index of the item ahead of use by indexed items - FORCE_INLINE static void init(const int8_t ind=0, PGM_P const pstr=nullptr) { itemIndex = ind; itemString = pstr; } - - // Draw an item either selected (pre_char) or not (space) with post_char - static void _draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char); - - // Draw an item either selected ('>') or not (space) with post_char - FORCE_INLINE static void _draw(const bool sel, const uint8_t row, PGM_P const pstr, const char post_char) { - _draw(sel, row, pstr, '>', post_char); - } -}; - -// STATIC_ITEM(LABEL,...) -class MenuItem_static : public MenuItemBase { - public: - static void draw(const uint8_t row, PGM_P const pstr, const uint8_t style=SS_DEFAULT, const char * const vstr=nullptr); -}; - -// BACK_ITEM(LABEL) -class MenuItem_back : public MenuItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr) { - _draw(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]); - } - // Back Item action goes back one step in history - FORCE_INLINE static void action(PGM_P const=nullptr) { ui.go_back(); } -}; - -// CONFIRM_ITEM(LABEL,Y,N,FY,FN,...), -// YESNO_ITEM(LABEL,FY,FN,...) -class MenuItem_confirm : public MenuItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]); - } - // Implemented for HD44780 and DOGM - // Draw the prompt, buttons, and state - static void draw_select_screen( - PGM_P const yes, // Right option label - PGM_P const no, // Left option label - const bool yesno, // Is "yes" selected? - PGM_P const pref, // Prompt prefix - const char * const string, // Prompt runtime string - PGM_P const suff // Prompt suffix - ); - static void select_screen( - PGM_P const yes, PGM_P const no, - selectFunc_t yesFunc, selectFunc_t noFunc, - PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr - ); - static inline void select_screen( - PGM_P const yes, PGM_P const no, - selectFunc_t yesFunc, selectFunc_t noFunc, - PGM_P const pref, const progmem_str string, PGM_P const suff=nullptr - ) { - char str[strlen_P((PGM_P)string) + 1]; - strcpy_P(str, (PGM_P)string); - select_screen(yes, no, yesFunc, noFunc, pref, str, suff); - } - // Shortcut for prompt with "NO"/ "YES" labels - FORCE_INLINE static void confirm_screen(selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr) { - select_screen(GET_TEXT(MSG_YES), GET_TEXT(MSG_NO), yesFunc, noFunc, pref, string, suff); - } -}; - -//////////////////////////////////////////// -///////////// Edit Menu Items ////////////// -//////////////////////////////////////////// - -// The Menu Edit shadow value -typedef union { - bool state; - float decimal; - int8_t int8; - int16_t int16; - int32_t int32; - uint8_t uint8; - uint16_t uint16; - uint32_t uint32; -} chimera_t; -extern chimera_t editable; - -// Base class for Menu Edit Items -class MenuEditItemBase : public MenuItemBase { - private: - // These values are statically constructed by init() via action() - // The action() method acts like the instantiator. The entire lifespan - // of a menu item is within its declaration, so all these values decompose - // into behavior and unused items get optimized out. - static PGM_P editLabel; - static void *editValue; - static int32_t minEditValue, maxEditValue; // Encoder value range - static screenFunc_t callbackFunc; - static bool liveEdit; - protected: - typedef const char* (*strfunc_t)(const int32_t); - typedef void (*loadfunc_t)(void *, const int32_t); - static void goto_edit_screen( - PGM_P const el, // Edit label - void * const ev, // Edit value pointer - const int32_t minv, // Encoder minimum - const int32_t maxv, // Encoder maximum - const uint16_t ep, // Initial encoder value - const screenFunc_t cs, // MenuItem_type::draw_edit_screen => MenuEditItemBase::edit() - const screenFunc_t cb, // Callback after edit - const bool le // Flag to call cb() during editing - ); - static void edit_screen(strfunc_t, loadfunc_t); // Edit value handler - public: - // Implemented for HD44780 and DOGM - // Draw the current item at specified row with edit data - static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm=false); - - // Implemented for HD44780 and DOGM - // This low-level method is good to draw from anywhere - static void draw_edit_screen(PGM_P const pstr, const char* const value); - - // This method is for the current menu item - static inline void draw_edit_screen(const char* const value) { draw_edit_screen(editLabel, value); } -}; - -#if ENABLED(SDSUPPORT) - class CardReader; - class MenuItem_sdbase { - public: - // Implemented for HD44780 and DOGM - static void draw(const bool sel, const uint8_t row, PGM_P const pstr, CardReader &theCard, const bool isDir); - }; -#endif - -//////////////////////////////////////////// -/////////////// Menu Screens /////////////// -//////////////////////////////////////////// - -void menu_main(); -void menu_move(); - -#if ENABLED(SDSUPPORT) - void menu_media(); -#endif - -//////////////////////////////////////////// -//////// Menu Item Helper Functions //////// -//////////////////////////////////////////// - -void lcd_move_z(); -void _lcd_draw_homing(); - -#define HAS_LINE_TO_Z ANY(DELTA, PROBE_MANUALLY, MESH_BED_LEVELING, LEVEL_BED_CORNERS) - -#if HAS_LINE_TO_Z - void line_to_z(const float &z); -#endif - -#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) - void _lcd_zoffset_overlay_gfx(const float zvalue); -#endif - -#if ENABLED(PROBE_OFFSET_WIZARD) - void goto_probe_offset_wizard(); -#endif - -#if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) - void _lcd_toggle_bed_leveling(); -#endif - -#if ENABLED(BABYSTEPPING) - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - void lcd_babystep_zoffset(); - #else - void lcd_babystep_z(); - #endif - - #if ENABLED(BABYSTEP_MILLIMETER_UNITS) - #define BABYSTEP_SIZE_X int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[X_AXIS]) - #define BABYSTEP_SIZE_Y int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[Y_AXIS]) - #define BABYSTEP_SIZE_Z int32_t((BABYSTEP_MULTIPLICATOR_Z) * planner.settings.axis_steps_per_mm[Z_AXIS]) - #else - #define BABYSTEP_SIZE_X BABYSTEP_MULTIPLICATOR_XY - #define BABYSTEP_SIZE_Y BABYSTEP_MULTIPLICATOR_XY - #define BABYSTEP_SIZE_Z BABYSTEP_MULTIPLICATOR_Z - #endif - -#endif - -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - void touch_screen_calibration(); -#endif diff --git a/Marlin/src/lcd/menu/menu_addon.h b/Marlin/src/lcd/menu/menu_addon.h deleted file mode 100644 index 73e7061bf3..0000000000 --- a/Marlin/src/lcd/menu/menu_addon.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../lcdprint.h" - -#define _MENU_ITEM_ADDON_START(N,X) do{ \ - if (ui.should_draw() && _menuLineNr == _thisItemNr - 1) { \ - N(X) - -#define MENU_ITEM_ADDON_START(X) _MENU_ITEM_ADDON_START(SETCURSOR_X, X) -#define MENU_ITEM_ADDON_START_RJ(X) _MENU_ITEM_ADDON_START(SETCURSOR_X_RJ, X) - -#define MENU_ITEM_ADDON_END() } }while(0) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp deleted file mode 100644 index 642d9d84d9..0000000000 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ /dev/null @@ -1,630 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Advanced Settings Menus -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU - -#include "menu_item.h" -#include "../../module/planner.h" - -#if DISABLED(NO_VOLUMETRICS) - #include "../../gcode/parser.h" -#endif - -#if HAS_BED_PROBE - #include "../../module/probe.h" -#endif - -#if ENABLED(PIDTEMP) - #include "../../module/temperature.h" -#endif - -#if HAS_FILAMENT_RUNOUT_DISTANCE - #include "../../feature/runout.h" -#endif - -#if ENABLED(SD_FIRMWARE_UPDATE) - #include "../../module/settings.h" -#endif - -#if ENABLED(PASSWORD_FEATURE) - #include "../../feature/password/password.h" -#endif - -void menu_tmc(); -void menu_backlash(); - -#if ENABLED(HAS_MOTOR_CURRENT_DAC) - - #include "../../feature/dac/stepper_dac.h" - - void menu_dac() { - static xyze_uint8_t driverPercent; - LOOP_XYZE(i) driverPercent[i] = stepper_dac.get_current_percent((AxisEnum)i); - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - #define EDIT_DAC_PERCENT(A) EDIT_ITEM(uint8, MSG_DAC_PERCENT_##A, &driverPercent[_AXIS(A)], 0, 100, []{ stepper_dac.set_current_percents(driverPercent); }) - EDIT_DAC_PERCENT(X); - EDIT_DAC_PERCENT(Y); - EDIT_DAC_PERCENT(Z); - EDIT_DAC_PERCENT(E); - ACTION_ITEM(MSG_DAC_EEPROM_WRITE, dac_commit_eeprom); - END_MENU(); - } - -#endif - -#if HAS_MOTOR_CURRENT_PWM - - #include "../../module/stepper.h" - - void menu_pwm() { - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - #define EDIT_CURRENT_PWM(LABEL,I) EDIT_ITEM_P(long5, PSTR(LABEL), &stepper.motor_current_setting[I], 100, 2000, stepper.refresh_motor_power) - #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y) - EDIT_CURRENT_PWM(STR_X STR_Y, 0); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - EDIT_CURRENT_PWM(STR_Z, 1); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - EDIT_CURRENT_PWM(STR_E, 2); - #endif - END_MENU(); - } - -#endif - -#if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) - // - // Advanced Settings > Filament - // - void menu_advanced_filament() { - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - - #if ENABLED(LIN_ADVANCE) - #if EXTRUDERS == 1 - EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); - #elif HAS_MULTI_EXTRUDER - LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); - #endif - #endif - - #if DISABLED(NO_VOLUMETRICS) - EDIT_ITEM(bool, MSG_VOLUMETRIC_ENABLED, &parser.volumetric_enabled, planner.calculate_volumetric_multipliers); - - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - EDIT_ITEM_FAST(float42_52, MSG_VOLUMETRIC_LIMIT, &planner.volumetric_extruder_limit[active_extruder], 0.0f, 20.0f, planner.calculate_volumetric_extruder_limits); - #if HAS_MULTI_EXTRUDER - LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_FAST_N(float42_52, n, MSG_VOLUMETRIC_LIMIT_E, &planner.volumetric_extruder_limit[n], 0.0f, 20.00f, planner.calculate_volumetric_extruder_limits); - #endif - #endif - - if (parser.volumetric_enabled) { - EDIT_ITEM_FAST(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); - #if HAS_MULTI_EXTRUDER - LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_FAST_N(float43, n, MSG_FILAMENT_DIAM_E, &planner.filament_size[n], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); - #endif - } - #endif - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - constexpr float extrude_maxlength = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 999); - - EDIT_ITEM_FAST(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength); - #if HAS_MULTI_EXTRUDER - LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTUNLOAD_E, &fc_settings[n].unload_length, 0, extrude_maxlength); - #endif - - EDIT_ITEM_FAST(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength); - #if HAS_MULTI_EXTRUDER - LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTLOAD_E, &fc_settings[n].load_length, 0, extrude_maxlength); - #endif - #endif - - #if HAS_FILAMENT_RUNOUT_DISTANCE - editable.decimal = runout.runout_distance(); - EDIT_ITEM(float3, MSG_RUNOUT_DISTANCE_MM, &editable.decimal, 1, float(FILAMENT_RUNOUT_DISTANCE_MM) * 1.5f, - []{ runout.set_runout_distance(editable.decimal); }, true - ); - #endif - - END_MENU(); - } - -#endif // !NO_VOLUMETRICS || ADVANCED_PAUSE_FEATURE - -// -// Advanced Settings > Temperature helpers -// - -#if ENABLED(PID_AUTOTUNE_MENU) - - #if ENABLED(PIDTEMP) - int16_t autotune_temp[HOTENDS] = ARRAY_BY_HOTENDS1(PREHEAT_1_TEMP_HOTEND); - #endif - #if ENABLED(PIDTEMPBED) - int16_t autotune_temp_bed = PREHEAT_1_TEMP_BED; - #endif - - #include "../../gcode/queue.h" - - void _lcd_autotune(const int16_t e) { - char cmd[30]; - sprintf_P(cmd, PSTR("M303 U1 E%i S%i"), e, - #if HAS_PID_FOR_BOTH - e < 0 ? autotune_temp_bed : autotune_temp[e] - #else - TERN(PIDTEMPBED, autotune_temp_bed, autotune_temp[e]) - #endif - ); - queue.inject(cmd); - ui.return_to_status(); - } - -#endif // PID_AUTOTUNE_MENU - -#if ENABLED(PID_EDIT_MENU) - - float raw_Ki, raw_Kd; // place-holders for Ki and Kd edits - - // Helpers for editing PID Ki & Kd values - // grab the PID value out of the temp variable; scale it; then update the PID driver - void copy_and_scalePID_i(int16_t e) { - TERN(PID_PARAMS_PER_HOTEND,,UNUSED(e)); - PID_PARAM(Ki, e) = scalePID_i(raw_Ki); - thermalManager.updatePID(); - } - void copy_and_scalePID_d(int16_t e) { - TERN(PID_PARAMS_PER_HOTEND,,UNUSED(e)); - PID_PARAM(Kd, e) = scalePID_d(raw_Kd); - thermalManager.updatePID(); - } - - #define _DEFINE_PIDTEMP_BASE_FUNCS(N) \ - void copy_and_scalePID_i_E##N() { copy_and_scalePID_i(N); } \ - void copy_and_scalePID_d_E##N() { copy_and_scalePID_d(N); } - -#else - - #define _DEFINE_PIDTEMP_BASE_FUNCS(N) // - -#endif - -#if ENABLED(PID_AUTOTUNE_MENU) - #define DEFINE_PIDTEMP_FUNCS(N) \ - _DEFINE_PIDTEMP_BASE_FUNCS(N); \ - void lcd_autotune_callback_E##N() { _lcd_autotune(N); } -#else - #define DEFINE_PIDTEMP_FUNCS(N) _DEFINE_PIDTEMP_BASE_FUNCS(N); -#endif - -#if HAS_HOTEND - DEFINE_PIDTEMP_FUNCS(0); - #if ENABLED(PID_PARAMS_PER_HOTEND) - REPEAT_S(1, HOTENDS, DEFINE_PIDTEMP_FUNCS) - #endif -#endif - -#if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) || EITHER(PID_AUTOTUNE_MENU, PID_EDIT_MENU) - #define SHOW_MENU_ADVANCED_TEMPERATURE 1 -#endif - -// -// Advanced Settings > Temperature -// -#if SHOW_MENU_ADVANCED_TEMPERATURE - - void menu_advanced_temperature() { - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - // - // Autotemp, Min, Max, Fact - // - #if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) - EDIT_ITEM(bool, MSG_AUTOTEMP, &planner.autotemp_enabled); - EDIT_ITEM(float3, MSG_MIN, &planner.autotemp_min, 0, float(HEATER_0_MAXTEMP) - HOTEND_OVERSHOOT); - EDIT_ITEM(float3, MSG_MAX, &planner.autotemp_max, 0, float(HEATER_0_MAXTEMP) - HOTEND_OVERSHOOT); - EDIT_ITEM(float42_52, MSG_FACTOR, &planner.autotemp_factor, 0, 10); - #endif - - // - // PID-P, PID-I, PID-D, PID-C, PID Autotune - // PID-P E1, PID-I E1, PID-D E1, PID-C E1, PID Autotune E1 - // PID-P E2, PID-I E2, PID-D E2, PID-C E2, PID Autotune E2 - // PID-P E3, PID-I E3, PID-D E3, PID-C E3, PID Autotune E3 - // PID-P E4, PID-I E4, PID-D E4, PID-C E4, PID Autotune E4 - // PID-P E5, PID-I E5, PID-D E5, PID-C E5, PID Autotune E5 - // - - #if ENABLED(PID_EDIT_MENU) - #define __PID_BASE_MENU_ITEMS(N) \ - raw_Ki = unscalePID_i(TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Ki, PID_PARAM(Ki, N))); \ - raw_Kd = unscalePID_d(TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Kd, PID_PARAM(Kd, N))); \ - EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Kp, PID_PARAM(Kp, N)), 1, 9990); \ - EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \ - EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); }) - - #if ENABLED(PID_EXTRUSION_SCALING) - #define _PID_BASE_MENU_ITEMS(N) \ - __PID_BASE_MENU_ITEMS(N); \ - EDIT_ITEM_N(float3, N, MSG_PID_C_E, &PID_PARAM(Kc, N), 1, 9990) - #else - #define _PID_BASE_MENU_ITEMS(N) __PID_BASE_MENU_ITEMS(N) - #endif - - #if ENABLED(PID_FAN_SCALING) - #define _PID_EDIT_MENU_ITEMS(N) \ - _PID_BASE_MENU_ITEMS(N); \ - EDIT_ITEM_N(float3, N, MSG_PID_F_E, &PID_PARAM(Kf, N), 1, 9990) - #else - #define _PID_EDIT_MENU_ITEMS(N) _PID_BASE_MENU_ITEMS(N) - #endif - - #else - - #define _PID_EDIT_MENU_ITEMS(N) NOOP - - #endif - - #if ENABLED(PID_AUTOTUNE_MENU) - #define PID_EDIT_MENU_ITEMS(N) \ - _PID_EDIT_MENU_ITEMS(N); \ - EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.heater_maxtemp[N] - HOTEND_OVERSHOOT, []{ _lcd_autotune(MenuItemBase::itemIndex); }); - #else - #define PID_EDIT_MENU_ITEMS(N) _PID_EDIT_MENU_ITEMS(N); - #endif - - PID_EDIT_MENU_ITEMS(0); - #if ENABLED(PID_PARAMS_PER_HOTEND) - REPEAT_S(1, HOTENDS, PID_EDIT_MENU_ITEMS) - #endif - - #if ENABLED(PIDTEMPBED) - #if ENABLED(PID_EDIT_MENU) - #define PID_BED_MENU_SECTION - __PID_BASE_MENU_ITEMS(-1); - #undef PID_BED_MENU_SECTION - #endif - #if ENABLED(PID_AUTOTUNE_MENU) - EDIT_ITEM_FAST_N(int3, -1, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, PREHEAT_1_TEMP_BED, BED_MAX_TARGET, []{ _lcd_autotune(-1); }); - #endif - #endif - - END_MENU(); - } - -#endif // SHOW_MENU_ADVANCED_TEMPERATURE - -#if DISABLED(SLIM_LCD_MENUS) - - #if ENABLED(DISTINCT_E_FACTORS) - inline void _reset_e_acceleration_rate(const uint8_t e) { if (e == active_extruder) planner.reset_acceleration_rates(); } - inline void _planner_refresh_e_positioning(const uint8_t e) { - if (e == active_extruder) - planner.refresh_positioning(); - else - planner.steps_to_mm[E_AXIS_N(e)] = 1.0f / planner.settings.axis_steps_per_mm[E_AXIS_N(e)]; - } - #endif - - // M203 / M205 Velocity options - void menu_advanced_velocity() { - // M203 Max Feedrate - constexpr xyze_feedrate_t max_fr_edit = - #ifdef MAX_FEEDRATE_EDIT_VALUES - MAX_FEEDRATE_EDIT_VALUES - #elif ENABLED(LIMITED_MAX_FR_EDITING) - DEFAULT_MAX_FEEDRATE - #else - { 999, 999, 999, 999 } - #endif - ; - #if ENABLED(LIMITED_MAX_FR_EDITING) && !defined(MAX_FEEDRATE_EDIT_VALUES) - const xyze_feedrate_t max_fr_edit_scaled = max_fr_edit * 2; - #else - const xyze_feedrate_t &max_fr_edit_scaled = max_fr_edit; - #endif - - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - - #define EDIT_VMAX(N) EDIT_ITEM_FAST(float3, MSG_VMAX_##N, &planner.settings.max_feedrate_mm_s[_AXIS(N)], 1, max_fr_edit_scaled[_AXIS(N)]) - EDIT_VMAX(A); - EDIT_VMAX(B); - EDIT_VMAX(C); - - #if E_STEPPERS - EDIT_ITEM_FAST(float3, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e); - #endif - #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(n, E_STEPPERS) - EDIT_ITEM_FAST_N(float3, n, MSG_VMAX_EN, &planner.settings.max_feedrate_mm_s[E_AXIS_N(n)], 1, max_fr_edit_scaled.e); - #endif - - // M205 S Min Feedrate - EDIT_ITEM_FAST(float3, MSG_VMIN, &planner.settings.min_feedrate_mm_s, 0, 999); - - // M205 T Min Travel Feedrate - EDIT_ITEM_FAST(float3, MSG_VTRAV_MIN, &planner.settings.min_travel_feedrate_mm_s, 0, 999); - - END_MENU(); - } - - // M201 / M204 Accelerations - void menu_advanced_acceleration() { - const float max_accel = _MAX(planner.settings.max_acceleration_mm_per_s2[A_AXIS], planner.settings.max_acceleration_mm_per_s2[B_AXIS], planner.settings.max_acceleration_mm_per_s2[C_AXIS]); - - // M201 settings - constexpr xyze_ulong_t max_accel_edit = - #ifdef MAX_ACCEL_EDIT_VALUES - MAX_ACCEL_EDIT_VALUES - #elif ENABLED(LIMITED_MAX_ACCEL_EDITING) - DEFAULT_MAX_ACCELERATION - #else - { 99000, 99000, 99000, 99000 } - #endif - ; - #if ENABLED(LIMITED_MAX_ACCEL_EDITING) && !defined(MAX_ACCEL_EDIT_VALUES) - const xyze_ulong_t max_accel_edit_scaled = max_accel_edit * 2; - #else - const xyze_ulong_t &max_accel_edit_scaled = max_accel_edit; - #endif - - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - - // M204 P Acceleration - EDIT_ITEM_FAST(float5_25, MSG_ACC, &planner.settings.acceleration, 25, max_accel); - - // M204 R Retract Acceleration - EDIT_ITEM_FAST(float5, MSG_A_RETRACT, &planner.settings.retract_acceleration, 100, planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)]); - - // M204 T Travel Acceleration - EDIT_ITEM_FAST(float5_25, MSG_A_TRAVEL, &planner.settings.travel_acceleration, 25, max_accel); - - #define EDIT_AMAX(Q,L) EDIT_ITEM_FAST(long5_25, MSG_AMAX_##Q, &planner.settings.max_acceleration_mm_per_s2[_AXIS(Q)], L, max_accel_edit_scaled[_AXIS(Q)], []{ planner.reset_acceleration_rates(); }) - EDIT_AMAX(A, 100); - EDIT_AMAX(B, 100); - EDIT_AMAX(C, 10); - - #if ENABLED(DISTINCT_E_FACTORS) - EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)], 100, max_accel_edit_scaled.e, []{ planner.reset_acceleration_rates(); }); - LOOP_L_N(n, E_STEPPERS) - EDIT_ITEM_FAST_N(long5_25, n, MSG_AMAX_EN, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(n)], 100, max_accel_edit_scaled.e, []{ _reset_e_acceleration_rate(MenuItemBase::itemIndex); }); - #elif E_STEPPERS - EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, max_accel_edit_scaled.e, []{ planner.reset_acceleration_rates(); }); - #endif - - #ifdef XY_FREQUENCY_LIMIT - EDIT_ITEM(int8, MSG_XY_FREQUENCY_LIMIT, &planner.xy_freq_limit_hz, 0, 100, planner.refresh_frequency_limit, true); - editable.uint8 = uint8_t(LROUND(planner.xy_freq_min_speed_factor * 255)); // percent to u8 - EDIT_ITEM(percent, MSG_XY_FREQUENCY_FEEDRATE, &editable.uint8, 3, 255, []{ planner.set_min_speed_factor_u8(editable.uint8); }, true); - #endif - - END_MENU(); - } - - #if HAS_CLASSIC_JERK - - void menu_advanced_jerk() { - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - - #if HAS_JUNCTION_DEVIATION - #if ENABLED(LIN_ADVANCE) - EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.3f, planner.recalculate_max_e_jerk); - #else - EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.5f); - #endif - #endif - - constexpr xyze_float_t max_jerk_edit = - #ifdef MAX_JERK_EDIT_VALUES - MAX_JERK_EDIT_VALUES - #elif ENABLED(LIMITED_JERK_EDITING) - { (DEFAULT_XJERK) * 2, (DEFAULT_YJERK) * 2, (DEFAULT_ZJERK) * 2, (DEFAULT_EJERK) * 2 } - #else - { 990, 990, 990, 990 } - #endif - ; - #define EDIT_JERK(N) EDIT_ITEM_FAST(float3, MSG_V##N##_JERK, &planner.max_jerk[_AXIS(N)], 1, max_jerk_edit[_AXIS(N)]) - EDIT_JERK(A); - EDIT_JERK(B); - #if ENABLED(DELTA) - EDIT_JERK(C); - #else - EDIT_ITEM_FAST(float52sign, MSG_VC_JERK, &planner.max_jerk.c, 0.1f, max_jerk_edit.c); - #endif - #if HAS_CLASSIC_E_JERK - EDIT_ITEM_FAST(float52sign, MSG_VE_JERK, &planner.max_jerk.e, 0.1f, max_jerk_edit.e); - #endif - - END_MENU(); - } - - #endif - - // M851 - Z Probe Offsets - #if HAS_BED_PROBE - void menu_probe_offsets() { - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - #if HAS_PROBE_XY_OFFSET - EDIT_ITEM(float31sign, MSG_ZPROBE_XOFFSET, &probe.offset.x, -(X_BED_SIZE), X_BED_SIZE); - EDIT_ITEM(float31sign, MSG_ZPROBE_YOFFSET, &probe.offset.y, -(Y_BED_SIZE), Y_BED_SIZE); - #endif - EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); - - #if ENABLED(PROBE_OFFSET_WIZARD) - SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); - #endif - - END_MENU(); - } - #endif - -#endif // !SLIM_LCD_MENUS - -// M92 Steps-per-mm -void menu_advanced_steps_per_mm() { - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - - #define EDIT_QSTEPS(Q) EDIT_ITEM_FAST(float51, MSG_##Q##_STEPS, &planner.settings.axis_steps_per_mm[_AXIS(Q)], 5, 9999, []{ planner.refresh_positioning(); }) - EDIT_QSTEPS(A); - EDIT_QSTEPS(B); - EDIT_QSTEPS(C); - - #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(n, E_STEPPERS) - EDIT_ITEM_FAST_N(float51, n, MSG_EN_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(n)], 5, 9999, []{ _planner_refresh_e_positioning(MenuItemBase::itemIndex); }); - #elif E_STEPPERS - EDIT_ITEM_FAST(float51, MSG_E_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, []{ planner.refresh_positioning(); }); - #endif - - END_MENU(); -} - -void menu_advanced_settings() { - const bool is_busy = printer_busy(); - - #if ENABLED(SD_FIRMWARE_UPDATE) - bool sd_update_state = settings.sd_update_status(); - #endif - - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - - #if DISABLED(SLIM_LCD_MENUS) - - #if HAS_M206_COMMAND - // - // Set Home Offsets - // - ACTION_ITEM(MSG_SET_HOME_OFFSETS, []{ queue.inject_P(PSTR("M428")); ui.return_to_status(); }); - #endif - - // M203 / M205 - Feedrate items - SUBMENU(MSG_VELOCITY, menu_advanced_velocity); - - // M201 - Acceleration items - SUBMENU(MSG_ACCELERATION, menu_advanced_acceleration); - - #if HAS_CLASSIC_JERK - // M205 - Max Jerk - SUBMENU(MSG_JERK, menu_advanced_jerk); - #elif HAS_JUNCTION_DEVIATION - EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.3f - #if ENABLED(LIN_ADVANCE) - , planner.recalculate_max_e_jerk - #endif - ); - #endif - - // M851 - Z Probe Offsets - #if HAS_BED_PROBE - if (!is_busy) SUBMENU(MSG_ZPROBE_OFFSETS, menu_probe_offsets); - #endif - - #endif // !SLIM_LCD_MENUS - - // M92 - Steps Per mm - if (!is_busy) - SUBMENU(MSG_STEPS_PER_MM, menu_advanced_steps_per_mm); - - #if ENABLED(BACKLASH_GCODE) - SUBMENU(MSG_BACKLASH, menu_backlash); - #endif - - #if ENABLED(HAS_MOTOR_CURRENT_DAC) - SUBMENU(MSG_DRIVE_STRENGTH, menu_dac); - #endif - #if HAS_MOTOR_CURRENT_PWM - SUBMENU(MSG_DRIVE_STRENGTH, menu_pwm); - #endif - - #if HAS_TRINAMIC_CONFIG - SUBMENU(MSG_TMC_DRIVERS, menu_tmc); - #endif - - #if SHOW_MENU_ADVANCED_TEMPERATURE - SUBMENU(MSG_TEMPERATURE, menu_advanced_temperature); - #endif - - #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) - SUBMENU(MSG_FILAMENT, menu_advanced_filament); - #elif ENABLED(LIN_ADVANCE) - #if EXTRUDERS == 1 - EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); - #elif HAS_MULTI_EXTRUDER - LOOP_L_N(n, E_STEPPERS) - EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); - #endif - #endif - - // M540 S - Abort on endstop hit when SD printing - #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) - EDIT_ITEM(bool, MSG_ENDSTOP_ABORT, &planner.abort_on_endstop_hit); - #endif - - #if ENABLED(SD_FIRMWARE_UPDATE) - EDIT_ITEM(bool, MSG_MEDIA_UPDATE, &sd_update_state, []{ - // - // Toggle the SD Firmware Update state in EEPROM - // - const bool new_state = !settings.sd_update_status(), - didset = settings.set_sd_update_status(new_state); - ui.completion_feedback(didset); - ui.return_to_status(); - if (new_state) LCD_MESSAGEPGM(MSG_RESET_PRINTER); else ui.reset_status(); - }); - #endif - - #if ENABLED(PASSWORD_FEATURE) - SUBMENU(MSG_PASSWORD_SETTINGS, password.access_menu_password); - #endif - - #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS) - CONFIRM_ITEM(MSG_INIT_EEPROM, - MSG_BUTTON_INIT, MSG_BUTTON_CANCEL, - ui.init_eeprom, nullptr, - GET_TEXT(MSG_INIT_EEPROM), (const char *)nullptr, PSTR("?") - ); - #endif - - END_MENU(); -} - -#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_backlash.cpp b/Marlin/src/lcd/menu/menu_backlash.cpp deleted file mode 100644 index 9d0b970ae1..0000000000 --- a/Marlin/src/lcd/menu/menu_backlash.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Backlash Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, BACKLASH_GCODE) - -#include "menu_item.h" - -#include "../../feature/backlash.h" - -void menu_backlash() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - - EDIT_ITEM_FAST(percent, MSG_BACKLASH_CORRECTION, &backlash.correction, all_off, all_on); - - #define EDIT_BACKLASH_DISTANCE(N) EDIT_ITEM_FAST(float43, MSG_BACKLASH_##N, &backlash.distance_mm[_AXIS(N)], 0.0f, 9.9f); - if (AXIS_CAN_CALIBRATE(A)) EDIT_BACKLASH_DISTANCE(A); - if (AXIS_CAN_CALIBRATE(B)) EDIT_BACKLASH_DISTANCE(B); - if (AXIS_CAN_CALIBRATE(C)) EDIT_BACKLASH_DISTANCE(C); - - #ifdef BACKLASH_SMOOTHING_MM - EDIT_ITEM_FAST(float43, MSG_BACKLASH_SMOOTHING, &backlash.smoothing_mm, 0.0f, 9.9f); - #endif - - END_MENU(); -} - -#endif // HAS_LCD_MENU && BACKLASH_GCODE diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp deleted file mode 100644 index 16f9992c18..0000000000 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Level Bed Corners menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, LEVEL_BED_CORNERS) - -#include "menu_item.h" -#include "../../module/motion.h" -#include "../../module/planner.h" - -#if HAS_LEVELING - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#ifndef LEVEL_CORNERS_Z_HOP - #define LEVEL_CORNERS_Z_HOP 4.0 -#endif - -#ifndef LEVEL_CORNERS_HEIGHT - #define LEVEL_CORNERS_HEIGHT 0.0 -#endif - -static_assert(LEVEL_CORNERS_Z_HOP >= 0, "LEVEL_CORNERS_Z_HOP must be >= 0. Please update your configuration."); - -#if HAS_LEVELING - static bool leveling_was_active = false; -#endif - -/** - * Level corners, starting in the front-left corner. - */ -static int8_t bed_corner; -static inline void _lcd_goto_next_corner() { - constexpr float lfrb[4] = LEVEL_CORNERS_INSET_LFRB; - constexpr xy_pos_t lf { (X_MIN_BED) + lfrb[0], (Y_MIN_BED) + lfrb[1] }, - rb { (X_MAX_BED) - lfrb[2], (Y_MAX_BED) - lfrb[3] }; - line_to_z(LEVEL_CORNERS_Z_HOP); - switch (bed_corner) { - case 0: current_position = lf; break; // copy xy - case 1: current_position.x = rb.x; break; - case 2: current_position.y = rb.y; break; - case 3: current_position.x = lf.x; break; - #if ENABLED(LEVEL_CENTER_TOO) - case 4: current_position.set(X_CENTER, Y_CENTER); break; - #endif - } - line_to_current_position(manual_feedrate_mm_s.x); - line_to_z(LEVEL_CORNERS_HEIGHT); - if (++bed_corner > 3 + ENABLED(LEVEL_CENTER_TOO)) bed_corner = 0; -} - -static inline void _lcd_level_bed_corners_homing() { - _lcd_draw_homing(); - if (all_axes_homed()) { - bed_corner = 0; - ui.goto_screen([]{ - MenuItem_confirm::select_screen( - GET_TEXT(MSG_BUTTON_NEXT), GET_TEXT(MSG_BUTTON_DONE) - , _lcd_goto_next_corner - , []{ - TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); - ui.goto_previous_screen_no_defer(); - } - , GET_TEXT(TERN(LEVEL_CENTER_TOO, MSG_LEVEL_BED_NEXT_POINT, MSG_NEXT_CORNER)) - , (const char*)nullptr, PSTR("?") - ); - }); - ui.set_selection(true); - _lcd_goto_next_corner(); - } -} - -void _lcd_level_bed_corners() { - ui.defer_status_screen(); - if (!all_axes_known()) { - set_all_unhomed(); - queue.inject_P(G28_STR); - } - - // Disable leveling so the planner won't mess with us - #if HAS_LEVELING - leveling_was_active = planner.leveling_active; - set_bed_leveling_enabled(false); - #endif - - ui.goto_screen(_lcd_level_bed_corners_homing); -} - -#endif // HAS_LCD_MENU && LEVEL_BED_CORNERS diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp deleted file mode 100644 index e19b04ccb5..0000000000 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Bed Leveling Menus -// - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(LCD_BED_LEVELING) - -#include "menu_item.h" -#include "../../module/planner.h" -#include "../../feature/bedlevel/bedlevel.h" - -#if HAS_BED_PROBE && DISABLED(BABYSTEP_ZPROBE_OFFSET) - #include "../../module/probe.h" -#endif - -#if HAS_GRAPHICAL_TFT - #include "../tft/touch.h" - #include "../tft/tft.h" -#endif - -#if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) - - #include "../../module/motion.h" - #include "../../gcode/queue.h" - - // - // Motion > Level Bed handlers - // - - static uint8_t manual_probe_index; - - // LCD probed points are from defaults - constexpr uint8_t total_probe_points = TERN(AUTO_BED_LEVELING_3POINT, 3, GRID_MAX_POINTS); - - // - // Bed leveling is done. Wait for G29 to complete. - // A flag is used so that this can release control - // and allow the command queue to be processed. - // - // When G29 finishes the last move: - // - Raise Z to the "manual probe height" - // - Don't return until done. - // - // ** This blocks the command queue! ** - // - void _lcd_level_bed_done() { - if (!ui.wait_for_move) { - #if MANUAL_PROBE_HEIGHT > 0 && DISABLED(MESH_BED_LEVELING) - // Display "Done" screen and wait for moves to complete - line_to_z(MANUAL_PROBE_HEIGHT); - ui.synchronize(GET_TEXT(MSG_LEVEL_BED_DONE)); - #endif - ui.goto_previous_screen_no_defer(); - ui.completion_feedback(); - } - if (ui.should_draw()) MenuItem_static::draw(LCD_HEIGHT >= 4, GET_TEXT(MSG_LEVEL_BED_DONE)); - ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); - } - - void _lcd_level_goto_next_point(); - - // - // Step 7: Get the Z coordinate, click goes to the next point or exits - // - void _lcd_level_bed_get_z() { - - if (ui.use_click()) { - - // - // Save the current Z position and move - // - - // If done... - if (++manual_probe_index >= total_probe_points) { - // - // The last G29 records the point and enables bed leveling - // - ui.wait_for_move = true; - ui.goto_screen(_lcd_level_bed_done); - #if ENABLED(MESH_BED_LEVELING) - queue.inject_P(PSTR("G29 S2")); - #elif ENABLED(PROBE_MANUALLY) - queue.inject_P(PSTR("G29 V1")); - #endif - } - else - _lcd_level_goto_next_point(); - - return; - } - - // - // Encoder knob or keypad buttons adjust the Z position - // - if (ui.encoderPosition) { - const float z = current_position.z + float(int32_t(ui.encoderPosition)) * (MESH_EDIT_Z_STEP); - line_to_z(constrain(z, -(LCD_PROBE_Z_RANGE) * 0.5f, (LCD_PROBE_Z_RANGE) * 0.5f)); - ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); - ui.encoderPosition = 0; - } - - // - // Draw on first display, then only on Z change - // - if (ui.should_draw()) { - const float v = current_position.z; - MenuEditItemBase::draw_edit_screen(GET_TEXT(MSG_MOVE_Z), ftostr43sign(v + (v < 0 ? -0.0001f : 0.0001f), '+')); - } - } - - // - // Step 6: Display "Next point: 1 / 9" while waiting for move to finish - // - void _lcd_level_bed_moving() { - if (ui.should_draw()) { - char msg[10]; - sprintf_P(msg, PSTR("%i / %u"), int(manual_probe_index + 1), total_probe_points); - MenuEditItemBase::draw_edit_screen(GET_TEXT(MSG_LEVEL_BED_NEXT_POINT), msg); - } - ui.refresh(LCDVIEW_CALL_NO_REDRAW); - if (!ui.wait_for_move) ui.goto_screen(_lcd_level_bed_get_z); - } - - // - // Step 5: Initiate a move to the next point - // - void _lcd_level_goto_next_point() { - ui.goto_screen(_lcd_level_bed_moving); - - // G29 Records Z, moves, and signals when it pauses - ui.wait_for_move = true; - #if ENABLED(MESH_BED_LEVELING) - queue.inject_P(manual_probe_index ? PSTR("G29 S2") : PSTR("G29 S1")); - #elif ENABLED(PROBE_MANUALLY) - queue.inject_P(PSTR("G29 V1")); - #endif - } - - // - // Step 4: Display "Click to Begin", wait for click - // Move to the first probe position - // - void _lcd_level_bed_homing_done() { - if (ui.should_draw()) { - MenuItem_static::draw(1, GET_TEXT(MSG_LEVEL_BED_WAITING)); - // Color UI needs a control to detect a touch - TERN_(HAS_GRAPHICAL_TFT, touch.add_control(CLICK, 0, 0, TFT_WIDTH, TFT_HEIGHT)); - } - if (ui.use_click()) { - manual_probe_index = 0; - _lcd_level_goto_next_point(); - } - } - - // - // Step 3: Display "Homing XYZ" - Wait for homing to finish - // - void _lcd_level_bed_homing() { - _lcd_draw_homing(); - if (all_axes_homed()) ui.goto_screen(_lcd_level_bed_homing_done); - } - - #if ENABLED(PROBE_MANUALLY) - extern bool g29_in_progress; - #endif - - // - // Step 2: Continue Bed Leveling... - // - void _lcd_level_bed_continue() { - ui.defer_status_screen(); - set_all_unhomed(); - ui.goto_screen(_lcd_level_bed_homing); - queue.inject_P(G28_STR); - } - -#endif // PROBE_MANUALLY || MESH_BED_LEVELING - -#if ENABLED(MESH_EDIT_MENU) - - inline void refresh_planner() { - set_current_from_steppers_for_axis(ALL_AXES); - sync_plan_position(); - } - - void menu_edit_mesh() { - static uint8_t xind, yind; // =0 - START_MENU(); - BACK_ITEM(MSG_BED_LEVELING); - EDIT_ITEM(uint8, MSG_MESH_X, &xind, 0, GRID_MAX_POINTS_X - 1); - EDIT_ITEM(uint8, MSG_MESH_Y, &yind, 0, GRID_MAX_POINTS_Y - 1); - EDIT_ITEM_FAST(float43, MSG_MESH_EDIT_Z, &Z_VALUES(xind, yind), -(LCD_PROBE_Z_RANGE) * 0.5, (LCD_PROBE_Z_RANGE) * 0.5, refresh_planner); - END_MENU(); - } - -#endif // MESH_EDIT_MENU - -/** - * Step 1: Bed Level entry-point - * - * << Motion - * Auto Home (if homing needed) - * Leveling On/Off (if data exists, and homed) - * Fade Height: --- (Req: ENABLE_LEVELING_FADE_HEIGHT) - * Mesh Z Offset: --- (Req: MESH_BED_LEVELING) - * Z Probe Offset: --- (Req: HAS_BED_PROBE, Opt: BABYSTEP_ZPROBE_OFFSET) - * Level Bed > - * Level Corners > (if homed) - * Load Settings (Req: EEPROM_SETTINGS) - * Save Settings (Req: EEPROM_SETTINGS) - */ -void menu_bed_leveling() { - const bool is_homed = all_axes_known(), - is_valid = leveling_is_valid(); - - START_MENU(); - BACK_ITEM(MSG_MOTION); - - // Auto Home if not using manual probing - #if NONE(PROBE_MANUALLY, MESH_BED_LEVELING) - if (!is_homed) GCODES_ITEM(MSG_AUTO_HOME, G28_STR); - #endif - - // Level Bed - #if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) - // Manual leveling uses a guided procedure - SUBMENU(MSG_LEVEL_BED, _lcd_level_bed_continue); - #else - // Automatic leveling can just run the G-code - GCODES_ITEM(MSG_LEVEL_BED, is_homed ? PSTR("G29") : PSTR("G28\nG29")); - #endif - - #if ENABLED(MESH_EDIT_MENU) - if (is_valid) SUBMENU(MSG_EDIT_MESH, menu_edit_mesh); - #endif - - // Homed and leveling is valid? Then leveling can be toggled. - if (is_homed && is_valid) { - bool show_state = planner.leveling_active; - EDIT_ITEM(bool, MSG_BED_LEVELING, &show_state, _lcd_toggle_bed_leveling); - } - - // Z Fade Height - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - // Shadow for editing the fade height - editable.decimal = planner.z_fade_height; - EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); }); - #endif - - // - // Mesh Bed Leveling Z-Offset - // - #if ENABLED(MESH_BED_LEVELING) - EDIT_ITEM(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); - #endif - - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); - #elif HAS_BED_PROBE - EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); - #endif - - #if ENABLED(LEVEL_BED_CORNERS) - SUBMENU(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); - #endif - - #if ENABLED(EEPROM_SETTINGS) - ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings); - ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); - #endif - END_MENU(); -} - -#endif // LCD_BED_LEVELING diff --git a/Marlin/src/lcd/menu/menu_cancelobject.cpp b/Marlin/src/lcd/menu/menu_cancelobject.cpp deleted file mode 100644 index a8ced05759..0000000000 --- a/Marlin/src/lcd/menu/menu_cancelobject.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Cancel Object Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, CANCEL_OBJECTS) - -#include "menu_item.h" -#include "menu_addon.h" - -#include "../../feature/cancel_object.h" - -static void lcd_cancel_object_confirm() { - const int8_t v = MenuItemBase::itemIndex; - const char item_num[] = { - ' ', - char((v > 9) ? '0' + (v / 10) : ' '), - char('0' + (v % 10)), - '\0' - }; - MenuItem_confirm::confirm_screen( - []{ - cancelable.cancel_object(MenuItemBase::itemIndex); - ui.completion_feedback(); - ui.goto_previous_screen(); - }, - ui.goto_previous_screen, - GET_TEXT(MSG_CANCEL_OBJECT), item_num, PSTR("?") - ); -} - -void menu_cancelobject() { - const int8_t ao = cancelable.active_object; - - START_MENU(); - BACK_ITEM(MSG_MAIN); - - // Draw cancelable items in a loop - for (int8_t i = -1; i < cancelable.object_count; i++) { - if (i == ao) continue; // Active is drawn on -1 index - const int8_t j = i < 0 ? ao : i; // Active or index item - if (!cancelable.is_canceled(j)) { // Not canceled already? - SUBMENU_N(j, MSG_CANCEL_OBJECT_N, lcd_cancel_object_confirm); // Offer the option. - if (i < 0) SKIP_ITEM(); // Extra line after active - } - } - - END_MENU(); -} - -#endif // HAS_LCD_MENU && CANCEL_OBJECTS diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp deleted file mode 100644 index 22947ee514..0000000000 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ /dev/null @@ -1,425 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Configuration Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU - -#include "menu_item.h" - -#if HAS_FILAMENT_SENSOR - #include "../../feature/runout.h" -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../../feature/powerloss.h" -#endif - -#if HAS_BED_PROBE - #include "../../module/probe.h" - #if ENABLED(BLTOUCH) - #include "../../feature/bltouch.h" - #endif -#endif - -#define HAS_DEBUG_MENU ENABLED(LCD_PROGRESS_BAR_TEST) - -void menu_advanced_settings(); -#if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) - void menu_delta_calibrate(); -#endif - -#if ENABLED(LCD_PROGRESS_BAR_TEST) - - #include "../lcdprint.h" - - static void progress_bar_test() { - static int8_t bar_percent = 0; - if (ui.use_click()) { - ui.goto_previous_screen(); - #if HAS_MARLINUI_HD44780 - ui.set_custom_characters(CHARSET_MENU); - #endif - return; - } - bar_percent += (int8_t)ui.encoderPosition; - LIMIT(bar_percent, 0, 100); - ui.encoderPosition = 0; - MenuItem_static::draw(0, GET_TEXT(MSG_PROGRESS_BAR_TEST), SS_DEFAULT|SS_INVERT); - lcd_put_int((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2, bar_percent); lcd_put_wchar('%'); - lcd_moveto(0, LCD_HEIGHT - 1); ui.draw_progress_bar(bar_percent); - } - - void _progress_bar_test() { - ui.goto_screen(progress_bar_test); - #if HAS_MARLINUI_HD44780 - ui.set_custom_characters(CHARSET_INFO); - #endif - } - -#endif // LCD_PROGRESS_BAR_TEST - -#if HAS_DEBUG_MENU - - void menu_debug() { - START_MENU(); - - BACK_ITEM(MSG_CONFIGURATION); - - #if ENABLED(LCD_PROGRESS_BAR_TEST) - SUBMENU(MSG_PROGRESS_BAR_TEST, _progress_bar_test); - #endif - - END_MENU(); - } - -#endif - -#if HAS_MULTI_EXTRUDER - - #include "../../module/tool_change.h" - - void menu_tool_change() { - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - static constexpr float max_extrude = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 500); - #if ENABLED(TOOLCHANGE_PARK) - EDIT_ITEM(bool, MSG_FILAMENT_PARK_ENABLED, &toolchange_settings.enable_park); - #endif - EDIT_ITEM(float3, MSG_FILAMENT_SWAP_LENGTH, &toolchange_settings.swap_length, 0, max_extrude); - EDIT_ITEM(float41sign, MSG_FILAMENT_SWAP_EXTRA, &toolchange_settings.extra_resume, -10, 10); - EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_RETRACT_SPEED, &toolchange_settings.retract_speed, 10, 5400); - EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_UNRETRACT_SPEED, &toolchange_settings.unretract_speed, 10, 5400); - EDIT_ITEM(float3, MSG_FILAMENT_PURGE_LENGTH, &toolchange_settings.extra_prime, 0, max_extrude); - EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_PRIME_SPEED, &toolchange_settings.prime_speed, 10, 5400); - EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_FAN_SPEED, &toolchange_settings.fan_speed, 0, 255); - EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_FAN_TIME, &toolchange_settings.fan_time, 1, 30); - #endif - EDIT_ITEM(float3, MSG_TOOL_CHANGE_ZLIFT, &toolchange_settings.z_raise, 0, 10); - END_MENU(); - } - - #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - - #include "../../module/motion.h" // for active_extruder - - void menu_toolchange_migration() { - PGM_P const msg_migrate = GET_TEXT(MSG_TOOL_MIGRATION_SWAP); - - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - - // Auto mode ON/OFF - EDIT_ITEM(bool, MSG_TOOL_MIGRATION_AUTO, &migration.automode); - EDIT_ITEM(uint8, MSG_TOOL_MIGRATION_END, &migration.last, 0, EXTRUDERS - 1); - - // Migrate to a chosen extruder - LOOP_L_N(s, EXTRUDERS) { - if (s != active_extruder) { - ACTION_ITEM_N_P(s, msg_migrate, []{ - char cmd[12]; - sprintf_P(cmd, PSTR("M217 T%i"), int(MenuItemBase::itemIndex)); - queue.inject(cmd); - }); - } - } - END_MENU(); - } - #endif - -#endif - -#if HAS_HOTEND_OFFSET - #include "../../module/motion.h" - #include "../../gcode/queue.h" - - void menu_tool_offsets() { - - auto _recalc_offsets = []{ - if (active_extruder && all_axes_known()) { // For the 2nd extruder re-home so the next tool-change gets the new offsets. - queue.inject_P(G28_STR); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary. - active_extruder = 0; - } - }; - - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - #if ENABLED(DUAL_X_CARRIAGE) - EDIT_ITEM_FAST(float42_52, MSG_HOTEND_OFFSET_X, &hotend_offset[1].x, float(X2_HOME_POS - 25), float(X2_HOME_POS + 25), _recalc_offsets); - #else - EDIT_ITEM_FAST(float42_52, MSG_HOTEND_OFFSET_X, &hotend_offset[1].x, -99.0, 99.0, _recalc_offsets); - #endif - EDIT_ITEM_FAST(float42_52, MSG_HOTEND_OFFSET_Y, &hotend_offset[1].y, -99.0, 99.0, _recalc_offsets); - EDIT_ITEM_FAST(float42_52, MSG_HOTEND_OFFSET_Z, &hotend_offset[1].z, Z_PROBE_LOW_POINT, 10.0, _recalc_offsets); - #if ENABLED(EEPROM_SETTINGS) - ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); - #endif - END_MENU(); - } -#endif - -#if ENABLED(DUAL_X_CARRIAGE) - - void menu_idex() { - const bool need_g28 = axes_should_home(_BV(Y_AXIS)|_BV(Z_AXIS)); - - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - - GCODES_ITEM(MSG_IDEX_MODE_AUTOPARK, PSTR("M605 S1\nG28 X\nG1 X100")); - GCODES_ITEM(MSG_IDEX_MODE_DUPLICATE, need_g28 - ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100") // If Y or Z is not homed, do a full G28 first - : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100") - ); - GCODES_ITEM(MSG_IDEX_MODE_MIRRORED_COPY, need_g28 - ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") // If Y or Z is not homed, do a full G28 first - : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") - ); - GCODES_ITEM(MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X")); - END_MENU(); - } - -#endif - -#if ENABLED(BLTOUCH) - - #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU) - void bltouch_report() { - SERIAL_ECHOLNPAIR("EEPROM Last BLTouch Mode - ", (int)bltouch.last_written_mode); - SERIAL_ECHOLNPGM("Configuration BLTouch Mode - " TERN(BLTOUCH_SET_5V_MODE, "5V", "OD")); - char mess[21]; - strcpy_P(mess, PSTR("BLTouch Mode - ")); - strcpy_P(&mess[15], bltouch.last_written_mode ? PSTR("5V") : PSTR("OD")); - ui.set_status(mess); - ui.return_to_status(); - } - #endif - - void menu_bltouch() { - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - ACTION_ITEM(MSG_BLTOUCH_RESET, bltouch._reset); - ACTION_ITEM(MSG_BLTOUCH_SELFTEST, bltouch._selftest); - ACTION_ITEM(MSG_BLTOUCH_DEPLOY, bltouch._deploy); - ACTION_ITEM(MSG_BLTOUCH_STOW, bltouch._stow); - ACTION_ITEM(MSG_BLTOUCH_SW_MODE, bltouch._set_SW_mode); - #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU) - CONFIRM_ITEM(MSG_BLTOUCH_5V_MODE, MSG_BLTOUCH_5V_MODE, MSG_BUTTON_CANCEL, bltouch._set_5V_mode, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); - CONFIRM_ITEM(MSG_BLTOUCH_OD_MODE, MSG_BLTOUCH_OD_MODE, MSG_BUTTON_CANCEL, bltouch._set_OD_mode, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); - ACTION_ITEM(MSG_BLTOUCH_MODE_STORE, bltouch._mode_store); - CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_5V, MSG_BLTOUCH_MODE_STORE_5V, MSG_BUTTON_CANCEL, bltouch.mode_conv_5V, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); - CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_OD, MSG_BLTOUCH_MODE_STORE_OD, MSG_BUTTON_CANCEL, bltouch.mode_conv_OD, nullptr, GET_TEXT(MSG_BLTOUCH_MODE_CHANGE)); - ACTION_ITEM(MSG_BLTOUCH_MODE_ECHO, bltouch_report); - #endif - END_MENU(); - } - -#endif - -#if ENABLED(TOUCH_MI_PROBE) - - void menu_touchmi() { - ui.defer_status_screen(); - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - GCODES_ITEM(MSG_TOUCHMI_INIT, PSTR("M851 Z0\nG28\nG1 F200 Z0")); - SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); - GCODES_ITEM(MSG_TOUCHMI_SAVE, PSTR("M500\nG1 F200 Z10")); - GCODES_ITEM(MSG_TOUCHMI_ZTEST, PSTR("G28\nG1 F200 Z0")); - END_MENU(); - } - -#endif - -#if ENABLED(CONTROLLER_FAN_MENU) - - #include "../../feature/controllerfan.h" - - void menu_controller_fan() { - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - EDIT_ITEM_FAST(percent, MSG_CONTROLLER_FAN_IDLE_SPEED, &controllerFan.settings.idle_speed, _MAX(1, CONTROLLERFAN_SPEED_MIN) - 1, 255); - EDIT_ITEM(bool, MSG_CONTROLLER_FAN_AUTO_ON, &controllerFan.settings.auto_mode); - if (controllerFan.settings.auto_mode) { - EDIT_ITEM_FAST(percent, MSG_CONTROLLER_FAN_SPEED, &controllerFan.settings.active_speed, _MAX(1, CONTROLLERFAN_SPEED_MIN) - 1, 255); - EDIT_ITEM(uint16_4, MSG_CONTROLLER_FAN_DURATION, &controllerFan.settings.duration, 0, 4800); - } - END_MENU(); - } - -#endif - -#if ENABLED(FWRETRACT) - - #include "../../feature/fwretract.h" - - void menu_config_retract() { - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - #if ENABLED(FWRETRACT_AUTORETRACT) - EDIT_ITEM(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract); - #endif - EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100); - #if HAS_MULTI_EXTRUDER - EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100); - #endif - EDIT_ITEM(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999); - EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999); - EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_extra, -100, 100); - #if HAS_MULTI_EXTRUDER - EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_extra, -100, 100); - #endif - EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999); - #if HAS_MULTI_EXTRUDER - EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999); - #endif - END_MENU(); - } - -#endif - -#if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) - - void _menu_configuration_preheat_settings() { - #define _MINTEMP_ITEM(N) HEATER_##N##_MINTEMP, - #define _MAXTEMP_ITEM(N) HEATER_##N##_MAXTEMP, - #define MINTEMP_ALL _MIN(REPEAT(HOTENDS, _MINTEMP_ITEM) 999) - #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0) - const uint8_t m = MenuItemBase::itemIndex; - START_MENU(); - STATIC_ITEM_P(ui.get_preheat_label(m), SS_DEFAULT|SS_INVERT); - BACK_ITEM(MSG_CONFIGURATION); - #if HAS_FAN - editable.uint8 = uint8_t(ui.material_preset[m].fan_speed); - EDIT_ITEM_N(percent, m, MSG_FAN_SPEED, &editable.uint8, 0, 255, []{ ui.material_preset[MenuItemBase::itemIndex].fan_speed = editable.uint8; }); - #endif - #if HAS_TEMP_HOTEND - EDIT_ITEM(uint16_3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT); - #endif - #if HAS_HEATED_BED - EDIT_ITEM(uint16_3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET); - #endif - #if ENABLED(EEPROM_SETTINGS) - ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); - #endif - END_MENU(); - } - -#endif - -void menu_configuration() { - const bool busy = printer_busy(); - - START_MENU(); - BACK_ITEM(MSG_MAIN); - - // - // Debug Menu when certain options are enabled - // - #if HAS_DEBUG_MENU - SUBMENU(MSG_DEBUG_MENU, menu_debug); - #endif - - SUBMENU(MSG_ADVANCED_SETTINGS, menu_advanced_settings); - - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); - #elif HAS_BED_PROBE - EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); - #endif - - // - // Set Fan Controller speed - // - #if ENABLED(CONTROLLER_FAN_MENU) - SUBMENU(MSG_CONTROLLER_FAN, menu_controller_fan); - #endif - - if (!busy) { - #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) - SUBMENU(MSG_DELTA_CALIBRATE, menu_delta_calibrate); - #endif - - #if HAS_HOTEND_OFFSET - SUBMENU(MSG_OFFSETS_MENU, menu_tool_offsets); - #endif - - #if ENABLED(DUAL_X_CARRIAGE) - SUBMENU(MSG_IDEX_MENU, menu_idex); - #endif - - #if ENABLED(BLTOUCH) - SUBMENU(MSG_BLTOUCH, menu_bltouch); - #endif - - #if ENABLED(TOUCH_MI_PROBE) - SUBMENU(MSG_TOUCHMI_PROBE, menu_touchmi); - #endif - } - - // - // Set single nozzle filament retract and prime length - // - #if HAS_MULTI_EXTRUDER - SUBMENU(MSG_TOOL_CHANGE, menu_tool_change); - #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - SUBMENU(MSG_TOOL_MIGRATION, menu_toolchange_migration); - #endif - #endif - - #if HAS_LCD_CONTRAST - EDIT_ITEM(int3, MSG_CONTRAST, &ui.contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, ui.refresh_contrast, true); - #endif - #if ENABLED(FWRETRACT) - SUBMENU(MSG_RETRACT, menu_config_retract); - #endif - - #if HAS_FILAMENT_SENSOR - EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset); - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - EDIT_ITEM(bool, MSG_OUTAGE_RECOVERY, &recovery.enabled, recovery.changed); - #endif - - // Preheat configurations - #if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) - LOOP_L_N(m, PREHEAT_COUNT) - SUBMENU_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M_SETTINGS, _menu_configuration_preheat_settings); - #endif - - #if ENABLED(EEPROM_SETTINGS) - ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); - if (!busy) ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings); - #endif - - if (!busy) ACTION_ITEM(MSG_RESTORE_DEFAULTS, ui.reset_settings); - - END_MENU(); -} - -#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp deleted file mode 100644 index 7c54ec6e26..0000000000 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Custom User Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, CUSTOM_USER_MENUS) - -#include "menu_item.h" -#include "../../gcode/queue.h" - -#ifdef USER_SCRIPT_DONE - #define _DONE_SCRIPT "\n" USER_SCRIPT_DONE -#else - #define _DONE_SCRIPT "" -#endif - -void _lcd_user_gcode(PGM_P const cmd) { - queue.inject_P(cmd); - TERN_(USER_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); - TERN_(USER_SCRIPT_RETURN, ui.return_to_status()); -} - -void menu_user() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - #define HAS_USER_ITEM(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) - #define USER_ITEM(N) ACTION_ITEM_P(PSTR(USER_DESC_##N), []{ _lcd_user_gcode(PSTR(USER_GCODE_##N _DONE_SCRIPT)); }); - #if HAS_USER_ITEM(1) - USER_ITEM(1); - #endif - #if HAS_USER_ITEM(2) - USER_ITEM(2); - #endif - #if HAS_USER_ITEM(3) - USER_ITEM(3); - #endif - #if HAS_USER_ITEM(4) - USER_ITEM(4); - #endif - #if HAS_USER_ITEM(5) - USER_ITEM(5); - #endif - #if HAS_USER_ITEM(6) - USER_ITEM(6); - #endif - #if HAS_USER_ITEM(7) - USER_ITEM(7); - #endif - #if HAS_USER_ITEM(8) - USER_ITEM(8); - #endif - #if HAS_USER_ITEM(9) - USER_ITEM(9); - #endif - #if HAS_USER_ITEM(10) - USER_ITEM(10); - #endif - #if HAS_USER_ITEM(11) - USER_ITEM(11); - #endif - #if HAS_USER_ITEM(12) - USER_ITEM(12); - #endif - #if HAS_USER_ITEM(13) - USER_ITEM(13); - #endif - #if HAS_USER_ITEM(14) - USER_ITEM(14); - #endif - #if HAS_USER_ITEM(15) - USER_ITEM(15); - #endif - #if HAS_USER_ITEM(16) - USER_ITEM(16); - #endif - #if HAS_USER_ITEM(17) - USER_ITEM(17); - #endif - #if HAS_USER_ITEM(18) - USER_ITEM(18); - #endif - #if HAS_USER_ITEM(19) - USER_ITEM(19); - #endif - #if HAS_USER_ITEM(20) - USER_ITEM(20); - #endif - #if HAS_USER_ITEM(21) - USER_ITEM(21); - #endif - #if HAS_USER_ITEM(22) - USER_ITEM(22); - #endif - #if HAS_USER_ITEM(23) - USER_ITEM(23); - #endif - #if HAS_USER_ITEM(24) - USER_ITEM(24); - #endif - #if HAS_USER_ITEM(25) - USER_ITEM(25); - #endif - END_MENU(); -} - -#endif // HAS_LCD_MENU && CUSTOM_USER_MENUS diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp deleted file mode 100644 index 4efcb7c8ed..0000000000 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Delta Calibrate Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU && EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) - -#include "menu_item.h" -#include "../../module/delta.h" -#include "../../module/motion.h" - -#if HAS_LEVELING - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../../lcd/extui/ui_api.h" -#endif - -void _man_probe_pt(const xy_pos_t &xy) { - if (!ui.wait_for_move) { - ui.wait_for_move = true; - do_blocking_move_to_xy_z(xy, Z_CLEARANCE_BETWEEN_PROBES); - ui.wait_for_move = false; - ui.synchronize(); - ui.manual_move.menu_scale = _MAX(PROBE_MANUALLY_STEP, MIN_STEPS_PER_SEGMENT / float(DEFAULT_XYZ_STEPS_PER_UNIT)); - ui.goto_screen(lcd_move_z); - } -} - -#if ENABLED(DELTA_AUTO_CALIBRATION) - - #include "../../gcode/gcode.h" - - #if ENABLED(HOST_PROMPT_SUPPORT) - #include "../../feature/host_actions.h" // for host_prompt_do - #endif - - float lcd_probe_pt(const xy_pos_t &xy) { - _man_probe_pt(xy); - ui.defer_status_screen(); - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Delta Calibration in progress"), CONTINUE_STR)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Delta Calibration in progress"))); - wait_for_user_response(); - ui.goto_previous_screen_no_defer(); - return current_position.z; - } - -#endif - -#if ENABLED(DELTA_CALIBRATION_MENU) - - #include "../../gcode/queue.h" - - void _lcd_calibrate_homing() { - _lcd_draw_homing(); - if (all_axes_homed()) ui.goto_previous_screen(); - } - - void _lcd_delta_calibrate_home() { - queue.inject_P(G28_STR); - ui.goto_screen(_lcd_calibrate_homing); - } - - void _goto_tower_a(const float &a) { - xy_pos_t tower_vec = { cos(RADIANS(a)), sin(RADIANS(a)) }; - _man_probe_pt(tower_vec * delta_calibration_radius()); - } - void _goto_tower_x() { _goto_tower_a(210); } - void _goto_tower_y() { _goto_tower_a(330); } - void _goto_tower_z() { _goto_tower_a( 90); } - void _goto_center() { xy_pos_t ctr{0}; _man_probe_pt(ctr); } - -#endif - -void lcd_delta_settings() { - auto _recalc_delta_settings = []{ - TERN_(HAS_LEVELING, reset_bed_level()); // After changing kinematics bed-level data is no longer valid - recalc_delta_settings(); - }; - START_MENU(); - BACK_ITEM(MSG_DELTA_CALIBRATE); - EDIT_ITEM(float52sign, MSG_DELTA_HEIGHT, &delta_height, delta_height - 10, delta_height + 10, _recalc_delta_settings); - #define EDIT_ENDSTOP_ADJ(LABEL,N) EDIT_ITEM_P(float43, PSTR(LABEL), &delta_endstop_adj.N, -5, 5, _recalc_delta_settings) - EDIT_ENDSTOP_ADJ("Ex", a); - EDIT_ENDSTOP_ADJ("Ey", b); - EDIT_ENDSTOP_ADJ("Ez", c); - EDIT_ITEM(float52sign, MSG_DELTA_RADIUS, &delta_radius, delta_radius - 5, delta_radius + 5, _recalc_delta_settings); - #define EDIT_ANGLE_TRIM(LABEL,N) EDIT_ITEM_P(float43, PSTR(LABEL), &delta_tower_angle_trim.N, -5, 5, _recalc_delta_settings) - EDIT_ANGLE_TRIM("Tx", a); - EDIT_ANGLE_TRIM("Ty", b); - EDIT_ANGLE_TRIM("Tz", c); - EDIT_ITEM(float52sign, MSG_DELTA_DIAG_ROD, &delta_diagonal_rod, delta_diagonal_rod - 5, delta_diagonal_rod + 5, _recalc_delta_settings); - END_MENU(); -} - -void menu_delta_calibrate() { - TERN_(DELTA_CALIBRATION_MENU, const bool all_homed = all_axes_homed()); // Acquire ahead of loop - - START_MENU(); - BACK_ITEM(MSG_MAIN); - - #if ENABLED(DELTA_AUTO_CALIBRATION) - GCODES_ITEM(MSG_DELTA_AUTO_CALIBRATE, PSTR("G33")); - #if ENABLED(EEPROM_SETTINGS) - ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); - ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings); - #endif - #endif - - SUBMENU(MSG_DELTA_SETTINGS, lcd_delta_settings); - - #if ENABLED(DELTA_CALIBRATION_MENU) - SUBMENU(MSG_AUTO_HOME, _lcd_delta_calibrate_home); - if (all_homed) { - SUBMENU(MSG_DELTA_CALIBRATE_X, _goto_tower_x); - SUBMENU(MSG_DELTA_CALIBRATE_Y, _goto_tower_y); - SUBMENU(MSG_DELTA_CALIBRATE_Z, _goto_tower_z); - SUBMENU(MSG_DELTA_CALIBRATE_CENTER, _goto_center); - } - #endif - - END_MENU(); -} - -#endif // HAS_LCD_MENU && (DELTA_CALIBRATION_MENU || DELTA_AUTO_CALIBRATION) diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp deleted file mode 100644 index d116a6a398..0000000000 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Filament Change Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) - -#include "menu_item.h" -#include "../../module/temperature.h" -#include "../../feature/pause.h" -#include "../../gcode/queue.h" -#if HAS_FILAMENT_SENSOR - #include "../../feature/runout.h" -#endif - -// -// Change Filament > Change/Unload/Load Filament -// -static PauseMode _change_filament_mode; // = PAUSE_MODE_PAUSE_PRINT -static int8_t _change_filament_extruder; // = 0 - -inline PGM_P _change_filament_command() { - switch (_change_filament_mode) { - case PAUSE_MODE_LOAD_FILAMENT: return PSTR("M701 T%d"); - case PAUSE_MODE_UNLOAD_FILAMENT: return _change_filament_extruder >= 0 - ? PSTR("M702 T%d") : PSTR("M702 ;%d"); - case PAUSE_MODE_CHANGE_FILAMENT: - case PAUSE_MODE_PAUSE_PRINT: - default: break; - } - return PSTR("M600 B0 T%d"); -} - -// Initiate Filament Load/Unload/Change at the specified temperature -static void _change_filament_with_temp(const uint16_t celsius) { - char cmd[11]; - sprintf_P(cmd, _change_filament_command(), _change_filament_extruder); - thermalManager.setTargetHotend(celsius, _change_filament_extruder); - queue.inject(cmd); -} - -static void _change_filament_with_preset() { - _change_filament_with_temp(ui.material_preset[MenuItemBase::itemIndex].hotend_temp); -} - -static void _change_filament_with_custom() { - _change_filament_with_temp(thermalManager.temp_hotend[MenuItemBase::itemIndex].target); -} - -// -// Menu to choose the temperature and start Filament Change -// - -inline PGM_P change_filament_header(const PauseMode mode) { - switch (mode) { - case PAUSE_MODE_LOAD_FILAMENT: return GET_TEXT(MSG_FILAMENTLOAD); - case PAUSE_MODE_UNLOAD_FILAMENT: return GET_TEXT(MSG_FILAMENTUNLOAD); - default: break; - } - return GET_TEXT(MSG_FILAMENTCHANGE); -} - -void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { - _change_filament_mode = mode; - _change_filament_extruder = extruder; - START_MENU(); - if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), SS_DEFAULT|SS_INVERT); - BACK_ITEM(MSG_BACK); - #if PREHEAT_COUNT - LOOP_L_N(m, PREHEAT_COUNT) - ACTION_ITEM_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); - #endif - EDIT_ITEM_FAST_N(int3, extruder, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[extruder].target, - EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, - _change_filament_with_custom - ); - END_MENU(); -} - -/** - * "Change Filament" submenu - */ -#if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) - - void menu_change_filament() { - // Say "filament change" when no print is active - editable.int8 = printingIsPaused() ? PAUSE_MODE_PAUSE_PRINT : PAUSE_MODE_CHANGE_FILAMENT; - - #if E_STEPPERS > 1 && ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) - bool too_cold = false; - for (uint8_t s = 0; !too_cold && s < E_STEPPERS; s++) - too_cold = thermalManager.targetTooColdToExtrude(s); - #endif - - #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) - const bool is_busy = printer_busy(); - #endif - - START_MENU(); - BACK_ITEM(MSG_MAIN); - - // Change filament - #if E_STEPPERS == 1 - PGM_P const msg = GET_TEXT(MSG_FILAMENTCHANGE); - if (thermalManager.targetTooColdToExtrude(active_extruder)) - SUBMENU_P(msg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, 0); }); - else - GCODES_ITEM_P(msg, PSTR("M600 B0")); - #else - PGM_P const msg = GET_TEXT(MSG_FILAMENTCHANGE_E); - LOOP_L_N(s, E_STEPPERS) { - if (thermalManager.targetTooColdToExtrude(s)) - SUBMENU_N_P(s, msg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, MenuItemBase::itemIndex); }); - else { - ACTION_ITEM_N_P(s, msg, []{ - PGM_P const cmdpstr = PSTR("M600 B0 T%i"); - char cmd[strlen_P(cmdpstr) + 3 + 1]; - sprintf_P(cmd, cmdpstr, int(MenuItemBase::itemIndex)); - queue.inject(cmd); - }); - } - } - #endif - - #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) - if (!is_busy) { - // Load filament - #if E_STEPPERS == 1 - PGM_P const msg_load = GET_TEXT(MSG_FILAMENTLOAD); - if (thermalManager.targetTooColdToExtrude(active_extruder)) - SUBMENU_P(msg_load, []{ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 0); }); - else - GCODES_ITEM_P(msg_load, PSTR("M701")); - #else - PGM_P const msg_load = GET_TEXT(MSG_FILAMENTLOAD_E); - LOOP_L_N(s, E_STEPPERS) { - if (thermalManager.targetTooColdToExtrude(s)) - SUBMENU_N_P(s, msg_load, []{ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, MenuItemBase::itemIndex); }); - else { - ACTION_ITEM_N_P(s, msg_load, []{ - char cmd[12]; - sprintf_P(cmd, PSTR("M701 T%i"), int(MenuItemBase::itemIndex)); - queue.inject(cmd); - }); - } - } - #endif - - // Unload filament - #if E_STEPPERS == 1 - PGM_P const msg_unload = GET_TEXT(MSG_FILAMENTUNLOAD); - if (thermalManager.targetTooColdToExtrude(active_extruder)) - SUBMENU_P(msg_unload, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 0); }); - else - GCODES_ITEM_P(msg_unload, PSTR("M702")); - #else - #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) - if (too_cold) - SUBMENU(MSG_FILAMENTUNLOAD_ALL, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, -1); }); - else - GCODES_ITEM(MSG_FILAMENTUNLOAD_ALL, PSTR("M702")); - #endif - PGM_P const msg_unload = GET_TEXT(MSG_FILAMENTUNLOAD_E); - LOOP_L_N(s, E_STEPPERS) { - if (thermalManager.targetTooColdToExtrude(s)) - SUBMENU_N_P(s, msg_unload, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, MenuItemBase::itemIndex); }); - else { - ACTION_ITEM_N_P(s, msg_unload, []{ - char cmd[12]; - sprintf_P(cmd, PSTR("M702 T%i"), int(MenuItemBase::itemIndex)); - queue.inject(cmd); - }); - } - } - #endif - } // !printer_busy - #endif - - END_MENU(); - } -#endif - -static uint8_t hotend_status_extruder = 0; - -static PGM_P pause_header() { - switch (pause_mode) { - case PAUSE_MODE_CHANGE_FILAMENT: return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER); - case PAUSE_MODE_LOAD_FILAMENT: return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER_LOAD); - case PAUSE_MODE_UNLOAD_FILAMENT: return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER_UNLOAD); - default: break; - } - return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER_PAUSE); -} - -// Portions from STATIC_ITEM... -#define HOTEND_STATUS_ITEM() do { \ - if (_menuLineNr == _thisItemNr) { \ - if (ui.should_draw()) { \ - TERN(HAS_GRAPHICAL_TFT,, MenuItem_static::draw(_lcdLineNr, GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT)); \ - ui.draw_hotend_status(_lcdLineNr, hotend_status_extruder); \ - } \ - if (_skipStatic && encoderLine <= _thisItemNr) { \ - ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ - ++encoderLine; \ - } \ - ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); \ - } \ - ++_thisItemNr; \ -}while(0) - -void menu_pause_option() { - START_MENU(); - #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_FILAMENT_CHANGE_OPTION_HEADER); - #endif - ACTION_ITEM(MSG_FILAMENT_CHANGE_OPTION_PURGE, []{ pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; }); - - #if HAS_FILAMENT_SENSOR - const bool still_out = runout.filament_ran_out; - if (still_out) - EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset); - #else - constexpr bool still_out = false; - #endif - - if (!still_out) - ACTION_ITEM(MSG_FILAMENT_CHANGE_OPTION_RESUME, []{ pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; }); - - END_MENU(); -} - -// -// ADVANCED_PAUSE_FEATURE message screens -// -// Warning: msg must have three null bytes to delimit lines! -// -void _lcd_pause_message(PGM_P const msg) { - PGM_P const msg1 = msg; - PGM_P const msg2 = msg1 + strlen_P(msg1) + 1; - PGM_P const msg3 = msg2 + strlen_P(msg2) + 1; - const bool has2 = msg2[0], has3 = msg3[0], - skip1 = !has2 && (LCD_HEIGHT) >= 5; - - START_SCREEN(); - STATIC_ITEM_P(pause_header(), SS_DEFAULT|SS_INVERT); // 1: Header - if (skip1) SKIP_ITEM(); // Move a single-line message down - STATIC_ITEM_P(msg1); // 2: Message Line 1 - if (has2) STATIC_ITEM_P(msg2); // 3: Message Line 2 - if (has3 && (LCD_HEIGHT) >= 5) STATIC_ITEM_P(msg3); // 4: Message Line 3 (if LCD has 5 lines) - if (skip1 + 1 + has2 + has3 < (LCD_HEIGHT) - 2) SKIP_ITEM(); // Push Hotend Status down, if needed - HOTEND_STATUS_ITEM(); // 5: Hotend Status - END_SCREEN(); -} - -void lcd_pause_parking_message() { _lcd_pause_message(GET_TEXT(MSG_PAUSE_PRINT_PARKING)); } -void lcd_pause_changing_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_INIT)); } -void lcd_pause_unload_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_UNLOAD)); } -void lcd_pause_heating_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_HEATING)); } -void lcd_pause_heat_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_HEAT)); } -void lcd_pause_insert_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_INSERT)); } -void lcd_pause_load_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_LOAD)); } -void lcd_pause_waiting_message() { _lcd_pause_message(GET_TEXT(MSG_ADVANCED_PAUSE_WAITING)); } -void lcd_pause_resume_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_RESUME)); } - -void lcd_pause_purge_message() { - #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_CONT_PURGE)); - #else - _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_PURGE)); - #endif -} - -FORCE_INLINE screenFunc_t ap_message_screen(const PauseMessage message) { - switch (message) { - case PAUSE_MESSAGE_PARKING: return lcd_pause_parking_message; - case PAUSE_MESSAGE_CHANGING: return lcd_pause_changing_message; - case PAUSE_MESSAGE_UNLOAD: return lcd_pause_unload_message; - case PAUSE_MESSAGE_WAITING: return lcd_pause_waiting_message; - case PAUSE_MESSAGE_INSERT: return lcd_pause_insert_message; - case PAUSE_MESSAGE_LOAD: return lcd_pause_load_message; - case PAUSE_MESSAGE_PURGE: return lcd_pause_purge_message; - case PAUSE_MESSAGE_RESUME: return lcd_pause_resume_message; - case PAUSE_MESSAGE_HEAT: return lcd_pause_heat_message; - case PAUSE_MESSAGE_HEATING: return lcd_pause_heating_message; - case PAUSE_MESSAGE_OPTION: pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; - return menu_pause_option; - case PAUSE_MESSAGE_STATUS: - default: break; - } - return nullptr; -} - -void lcd_pause_show_message( - const PauseMessage message, - const PauseMode mode/*=PAUSE_MODE_SAME*/, - const uint8_t extruder/*=active_extruder*/ -) { - if (mode != PAUSE_MODE_SAME) pause_mode = mode; - hotend_status_extruder = extruder; - const screenFunc_t next_screen = ap_message_screen(message); - if (next_screen) { - ui.defer_status_screen(); - ui.goto_screen(next_screen); - } - else - ui.return_to_status(); -} - -#endif // HAS_LCD_MENU && ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/lcd/menu/menu_game.cpp b/Marlin/src/lcd/menu/menu_game.cpp deleted file mode 100644 index fa56d7eee2..0000000000 --- a/Marlin/src/lcd/menu/menu_game.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_GAME_MENU - -#include "menu_item.h" -#include "game/game.h" - -void menu_game() { - START_MENU(); - BACK_ITEM(TERN(LCD_INFO_MENU, MSG_INFO_MENU, MSG_MAIN)); - #if ENABLED(MARLIN_BRICKOUT) - SUBMENU(MSG_BRICKOUT, brickout.enter_game); - #endif - #if ENABLED(MARLIN_INVADERS) - SUBMENU(MSG_INVADERS, invaders.enter_game); - #endif - #if ENABLED(MARLIN_SNAKE) - SUBMENU(MSG_SNAKE, snake.enter_game); - #endif - #if ENABLED(MARLIN_MAZE) - SUBMENU(MSG_MAZE, maze.enter_game); - #endif - END_MENU(); -} - -#endif // HAS_GAME_MENU diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp deleted file mode 100644 index a4cbc31d8b..0000000000 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ /dev/null @@ -1,306 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Info Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, LCD_INFO_MENU) - -#include "menu_item.h" - -#if HAS_GAMES - #include "game/game.h" -#endif - -#define VALUE_ITEM(MSG, VALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy(msg + 2, VALUE); STATIC_ITEM(MSG, STYL, msg); }while(0) -#define VALUE_ITEM_P(MSG, PVALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy_P(msg + 2, PSTR(PVALUE)); STATIC_ITEM(MSG, STYL, msg); }while(0) - -#if ENABLED(PRINTCOUNTER) - - #include "../../module/printcounter.h" - - // - // About Printer > Printer Stats - // - void menu_info_stats() { - if (ui.use_click()) return ui.go_back(); - - printStatistics stats = print_job_timer.getStats(); - - char buffer[21]; - - START_SCREEN(); // 12345678901234567890 - VALUE_ITEM(MSG_INFO_PRINT_COUNT, i16tostr3left(stats.totalPrints), SS_LEFT); // Print Count: 999 - VALUE_ITEM(MSG_INFO_COMPLETED_PRINTS, i16tostr3left(stats.finishedPrints), SS_LEFT); // Completed : 666 - - STATIC_ITEM(MSG_INFO_PRINT_TIME, SS_LEFT); // Total print Time: - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.printTime).toString(buffer)); // > 99y 364d 23h 59m 59s - - STATIC_ITEM(MSG_INFO_PRINT_LONGEST, SS_LEFT); // Longest job time: - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.longestPrint).toString(buffer)); // > 99y 364d 23h 59m 59s - - STATIC_ITEM(MSG_INFO_PRINT_FILAMENT, SS_LEFT); // Extruded total: - sprintf_P(buffer, PSTR("%ld.%im") - , long(stats.filamentUsed / 1000) - , int16_t(stats.filamentUsed / 100) % 10 - ); - STATIC_ITEM_P(PSTR("> "), SS_LEFT, buffer); // > 125m - - #if SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0 - strcpy_P(buffer, GET_TEXT(MSG_SERVICE_IN)); - #endif - - #if SERVICE_INTERVAL_1 > 0 - STATIC_ITEM_P(PSTR(SERVICE_NAME_1 " "), SS_LEFT, buffer); // Service X in: - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService1).toString(buffer)); // > 7d 12h 11m 10s - #endif - - #if SERVICE_INTERVAL_2 > 0 - STATIC_ITEM_P(PSTR(SERVICE_NAME_2 " "), SS_LEFT, buffer); - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService2).toString(buffer)); - #endif - - #if SERVICE_INTERVAL_3 > 0 - STATIC_ITEM_P(PSTR(SERVICE_NAME_3 " "), SS_LEFT, buffer); - STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService3).toString(buffer)); - #endif - - END_SCREEN(); - } - -#endif - -// -// About Printer > Thermistors -// -void menu_info_thermistors() { - if (ui.use_click()) return ui.go_back(); - - START_SCREEN(); - - #if EXTRUDERS - #define THERMISTOR_ID TEMP_SENSOR_0 - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR(LCD_STR_E0 ": " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_0_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_0_MAXTEMP), SS_LEFT); - #endif - - #if TEMP_SENSOR_1 != 0 - #undef THERMISTOR_ID - #define THERMISTOR_ID TEMP_SENSOR_1 - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR(LCD_STR_E1 ": " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_1_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_1_MAXTEMP), SS_LEFT); - #endif - - #if TEMP_SENSOR_2 != 0 - #undef THERMISTOR_ID - #define THERMISTOR_ID TEMP_SENSOR_2 - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR(LCD_STR_E2 ": " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_2_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_2_MAXTEMP), SS_LEFT); - #endif - - #if TEMP_SENSOR_3 != 0 - #undef THERMISTOR_ID - #define THERMISTOR_ID TEMP_SENSOR_3 - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR(LCD_STR_E3 ": " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_3_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_3_MAXTEMP), SS_LEFT); - #endif - - #if TEMP_SENSOR_4 != 0 - #undef THERMISTOR_ID - #define THERMISTOR_ID TEMP_SENSOR_4 - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR(LCD_STR_E4 ": " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_4_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_4_MAXTEMP), SS_LEFT); - #endif - - #if TEMP_SENSOR_5 != 0 - #undef THERMISTOR_ID - #define THERMISTOR_ID TEMP_SENSOR_5 - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR(LCD_STR_E5 ": " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_5_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_5_MAXTEMP), SS_LEFT); - #endif - - #if TEMP_SENSOR_6 != 0 - #undef THERMISTOR_ID - #define THERMISTOR_ID TEMP_SENSOR_6 - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR(LCD_STR_E6 ": " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_6_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_6_MAXTEMP), SS_LEFT); - #endif - - #if TEMP_SENSOR_7 != 0 - #undef THERMISTOR_ID - #define THERMISTOR_ID TEMP_SENSOR_7 - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR(LCD_STR_E7 ": " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_7_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_7_MAXTEMP), SS_LEFT); - #endif - - #if EXTRUDERS - STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); - #endif - - #if HAS_HEATED_BED - #undef THERMISTOR_ID - #define THERMISTOR_ID TEMP_SENSOR_BED - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR("BED: " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(BED_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(BED_MAXTEMP), SS_LEFT); - STATIC_ITEM(TERN(WATCH_BED, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); - #endif - - #if HAS_HEATED_CHAMBER - #undef THERMISTOR_ID - #define THERMISTOR_ID TEMP_SENSOR_CHAMBER - #include "../thermistornames.h" - STATIC_ITEM_P(PSTR("CHAM: " THERMISTOR_NAME), SS_INVERT); - PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(CHAMBER_MINTEMP), SS_LEFT); - PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(CHAMBER_MAXTEMP), SS_LEFT); - STATIC_ITEM(TERN(WATCH_CHAMBER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); - #endif - - END_SCREEN(); -} - -// -// About Printer > Board Info -// -void menu_info_board() { - if (ui.use_click()) return ui.go_back(); - - START_SCREEN(); - STATIC_ITEM_P(PSTR(BOARD_INFO_NAME), SS_DEFAULT|SS_INVERT); // MyPrinterController - #ifdef BOARD_WEBSITE_URL - STATIC_ITEM_P(PSTR(BOARD_WEBSITE_URL), SS_LEFT); // www.my3dprinter.com - #endif - PSTRING_ITEM(MSG_INFO_BAUDRATE, STRINGIFY(BAUDRATE), SS_CENTER); // Baud: 250000 - PSTRING_ITEM(MSG_INFO_PROTOCOL, PROTOCOL_VERSION, SS_CENTER); // Protocol: 1.0 - PSTRING_ITEM(MSG_INFO_PSU, PSU_NAME, SS_CENTER); - END_SCREEN(); -} - -// -// About Printer > Printer Info -// -#if ENABLED(LCD_PRINTER_INFO_IS_BOOTSCREEN) - - void menu_show_marlin_bootscreen() { - if (ui.use_click()) { ui.goto_previous_screen_no_defer(); } - ui.draw_marlin_bootscreen(); - } - - #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) - void menu_show_custom_bootscreen() { - if (ui.use_click()) { ui.goto_screen(menu_show_marlin_bootscreen); } - ui.draw_custom_bootscreen(); - } - #endif - -#else - - void menu_info_printer() { - if (ui.use_click()) return ui.go_back(); - START_SCREEN(); - STATIC_ITEM(MSG_MARLIN, SS_DEFAULT|SS_INVERT); // Marlin - STATIC_ITEM_P(PSTR(SHORT_BUILD_VERSION)); // x.x.x-Branch - STATIC_ITEM_P(PSTR(STRING_DISTRIBUTION_DATE)); // YYYY-MM-DD HH:MM - STATIC_ITEM_P(PSTR(MACHINE_NAME)); // My3DPrinter - STATIC_ITEM_P(PSTR(WEBSITE_URL)); // www.my3dprinter.com - PSTRING_ITEM(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2 - #if HAS_LEVELING - STATIC_ITEM( - TERN_(AUTO_BED_LEVELING_3POINT, MSG_3POINT_LEVELING) // 3-Point Leveling - TERN_(AUTO_BED_LEVELING_LINEAR, MSG_LINEAR_LEVELING) // Linear Leveling - TERN_(AUTO_BED_LEVELING_BILINEAR, MSG_BILINEAR_LEVELING) // Bi-linear Leveling - TERN_(AUTO_BED_LEVELING_UBL, MSG_UBL_LEVELING) // Unified Bed Leveling - TERN_(MESH_BED_LEVELING, MSG_MESH_LEVELING) // Mesh Leveling - ); - #endif - END_SCREEN(); - } - -#endif - -// -// "About Printer" submenu -// -void menu_info() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - #if ENABLED(LCD_PRINTER_INFO_IS_BOOTSCREEN) - SUBMENU(MSG_INFO_PRINTER_MENU, TERN(SHOW_CUSTOM_BOOTSCREEN, menu_show_custom_bootscreen, menu_show_marlin_bootscreen)); - #else - SUBMENU(MSG_INFO_PRINTER_MENU, menu_info_printer); // Printer Info > - SUBMENU(MSG_INFO_BOARD_MENU, menu_info_board); // Board Info > - #if EXTRUDERS - SUBMENU(MSG_INFO_THERMISTOR_MENU, menu_info_thermistors); // Thermistors > - #endif - #endif - - #if ENABLED(PRINTCOUNTER) - SUBMENU(MSG_INFO_STATS_MENU, menu_info_stats); // Printer Stats > - #endif - - #if HAS_GAMES - { - #if ENABLED(GAMES_EASTER_EGG) - SKIP_ITEM(); SKIP_ITEM(); SKIP_ITEM(); - #endif - - // Game sub-menu or the individual game - SUBMENU( - #if HAS_GAME_MENU - MSG_GAMES, menu_game - #elif ENABLED(MARLIN_BRICKOUT) - MSG_BRICKOUT, brickout.enter_game - #elif ENABLED(MARLIN_INVADERS) - MSG_INVADERS, invaders.enter_game - #elif ENABLED(MARLIN_SNAKE) - MSG_SNAKE, snake.enter_game - #elif ENABLED(MARLIN_MAZE) - MSG_MAZE, maze.enter_game - #endif - ); - } - #endif - - END_MENU(); -} - -#endif // HAS_LCD_MENU && LCD_INFO_MENU diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h deleted file mode 100644 index bd3af0cec6..0000000000 --- a/Marlin/src/lcd/menu/menu_item.h +++ /dev/null @@ -1,492 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "menu.h" -#include "../ultralcd.h" -#include "../../gcode/queue.h" // for inject_P - -#include "../../inc/MarlinConfigPre.h" - -void lcd_move_z(); - -//////////////////////////////////////////// -///////////// Base Menu Items ////////////// -//////////////////////////////////////////// - -// SUBMENU(LABEL, screen_handler) -class MenuItem_submenu : public MenuItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]); - } - static inline void action(PGM_P const, const screenFunc_t func) { ui.save_previous_screen(); ui.goto_screen(func); } -}; - -// Any menu item that invokes an immediate action -class MenuItem_button : public MenuItemBase { - public: - // Button-y Items are selectable lines with no other indicator - static inline void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', ' '); - } -}; - -// ACTION_ITEM(LABEL, FUNC) -class MenuItem_function : public MenuItem_button { - public: - //static inline void action(PGM_P const, const uint8_t, const menuAction_t func) { (*func)(); }; - static inline void action(PGM_P const, const menuAction_t func) { (*func)(); }; -}; - -// GCODES_ITEM(LABEL, GCODES) -class MenuItem_gcode : public MenuItem_button { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, ...) { - _draw(sel, row, pstr, '>', ' '); - } - static void action(PGM_P const, PGM_P const pgcode) { queue.inject_P(pgcode); } - static inline void action(PGM_P const pstr, const uint8_t, const char * const pgcode) { action(pstr, pgcode); } -}; - -//////////////////////////////////////////// -///////////// Edit Menu Items ////////////// -//////////////////////////////////////////// - -// Template for specific Menu Edit Item Types -template -class TMenuEditItem : MenuEditItemBase { - private: - typedef typename NAME::type_t type_t; - static inline float scale(const float value) { return NAME::scale(value); } - static inline float unscale(const float value) { return NAME::unscale(value); } - static const char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); } - static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscale(value); } - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t * const data, ...) { - MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(*(data))); - } - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, type_t (*pget)(), ...) { - MenuEditItemBase::draw(sel, row, pstr, NAME::strfunc(pget())); - } - // Edit screen for this type of item - static void edit_screen() { MenuEditItemBase::edit_screen(to_string, load); } - static void action( - PGM_P const pstr, // Edit label - type_t * const ptr, // Value pointer - const type_t minValue, // Value range - const type_t maxValue, - const screenFunc_t callback=nullptr, // Value update callback - const bool live=false // Callback during editing - ) { - // Make sure minv and maxv fit within int32_t - const int32_t minv = _MAX(scale(minValue), INT32_MIN), - maxv = _MIN(scale(maxValue), INT32_MAX); - goto_edit_screen(pstr, ptr, minv, maxv - minv, scale(*ptr) - minv, - edit_screen, callback, live); - } -}; - -// Provide a set of Edit Item Types which encompass a primitive -// type, a string function, and a scale factor for edit and display. -// These items call the Edit Item draw method passing the prepared string. -#define __DOFIXfloat PROBE() -#define _DOFIX(TYPE,V) TYPE(TERN(IS_PROBE(__DOFIX##TYPE),FIXFLOAT(V),(V))) -#define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, V...) \ - struct MenuEditItemInfo_##NAME { \ - typedef TYPE type_t; \ - static inline float scale(const float value) { return value * (SCALE) + (V+0); } \ - static inline float unscale(const float value) { return value / (SCALE) + (V+0); } \ - static inline const char* strfunc(const float value) { return STRFUNC(_DOFIX(TYPE,value)); } \ - }; \ - typedef TMenuEditItem MenuItem_##NAME - -// NAME TYPE STRFUNC SCALE +ROUND -DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, 0.5f); // 100% right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int8 ,int8_t ,i8tostr3rj , 1 ); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint8 ,uint8_t ,ui8tostr3rj , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_3 ,uint16_t ,ui16tostr3rj , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_4 ,uint16_t ,ui16tostr4rj , 0.1f ); // 1234 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3 , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 ); // _2.34, 12.34, -2.34 or 123.45, -23.45 -DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 ); // -1.234, _1.234, +1.234 -DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) -DEFINE_MENU_EDIT_ITEM_TYPE(float51 ,float ,ftostr51rj , 10 ); // 1234.5 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 ); // +12.3 -DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 ); // +123.4 -DEFINE_MENU_EDIT_ITEM_TYPE(float51sign ,float ,ftostr51sign , 10 ); // +1234.5 -DEFINE_MENU_EDIT_ITEM_TYPE(float52sign ,float ,ftostr52sign , 100 ); // +123.45 -DEFINE_MENU_EDIT_ITEM_TYPE(long5 ,uint32_t ,ftostr5rj , 0.01f ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(long5_25 ,uint32_t ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) - -#if HAS_BED_PROBE - #if Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 - #define LCD_Z_OFFSET_TYPE float43 // Values from -9.000 to +9.000 - #else - #define LCD_Z_OFFSET_TYPE float42_52 // Values from -99.99 to 99.99 - #endif -#endif - -class MenuItem_bool : public MenuEditItemBase { - public: - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const bool onoff) { - MenuEditItemBase::draw(sel, row, pstr, onoff ? GET_TEXT(MSG_LCD_ON) : GET_TEXT(MSG_LCD_OFF), true); - } - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, bool * const data, ...) { - draw(sel, row, pstr, *data); - } - FORCE_INLINE static void draw(const bool sel, const uint8_t row, PGM_P const pstr, PGM_P const, bool (*pget)(), ...) { - draw(sel, row, pstr, pget()); - } - static void action(PGM_P const pstr, bool * const ptr, const screenFunc_t callbackFunc=nullptr) { - *ptr ^= true; ui.refresh(); - if (callbackFunc) (*callbackFunc)(); - } -}; - -/** - * //////////////////////////////////////////// - * //////////// Menu System Macros //////////// - * //////////////////////////////////////////// - * - * Marlin's native menu screens work by running a loop from the top visible line index - * to the bottom visible line index (according to how much the screen has been scrolled). - * This complete loop is done on every menu screen call. - * - * The menu system is highly dynamic, so it doesn't know ahead of any menu loop which - * items will be visible or hidden, so menu items don't have a fixed index number. - * - * During the loop, each menu item checks to see if its line is the current one. If it is, - * then it checks to see if a click has arrived so it can run its action. If the action - * doesn't redirect to another screen then the menu item calls its draw method. - * - * Menu item add-ons can do whatever they like. - * - * This mixture of drawing and processing inside a loop has the advantage that a single - * line can be used to represent a menu item, and that is the rationale for this design. - * - * One of the pitfalls of this method is that DOGM displays call the screen handler 2x, - * 4x, or 8x per screen update to draw just one segment of the screen. As a result, any - * menu item that exists in two screen segments is drawn and processed twice per screen - * update. With each item processed 5, 10, 20, or 40 times the logic has to be simple. - * - * To avoid repetition and side-effects, function calls for testing menu item conditions - * should be done before the menu loop (START_MENU / START_SCREEN). - */ - -/** - * SCREEN_OR_MENU_LOOP generates header code for a screen or menu - * - * encoderTopLine is the top menu line to display - * _lcdLineNr is the index of the LCD line (e.g., 0-3) - * _menuLineNr is the menu item to draw and process - * _thisItemNr is the index of each MENU_ITEM or STATIC_ITEM - */ -#define SCREEN_OR_MENU_LOOP(IS_MENU) \ - scroll_screen(IS_MENU ? 1 : LCD_HEIGHT, IS_MENU); \ - int8_t _menuLineNr = encoderTopLine, _thisItemNr = 0; \ - bool _skipStatic = IS_MENU; UNUSED(_thisItemNr); \ - for (int8_t _lcdLineNr = 0; _lcdLineNr < LCD_HEIGHT; _lcdLineNr++, _menuLineNr++) { \ - _thisItemNr = 0 - -/** - * START_SCREEN Opening code for a screen having only static items. - * Do simplified scrolling of the entire screen. - * - * START_MENU Opening code for a screen with menu items. - * Scroll as-needed to keep the selected line in view. - */ -#define START_SCREEN() SCREEN_OR_MENU_LOOP(false) -#define START_MENU() SCREEN_OR_MENU_LOOP(true) -#define NEXT_ITEM() (++_thisItemNr) -#define SKIP_ITEM() NEXT_ITEM() -#define END_SCREEN() } screen_items = _thisItemNr -#define END_MENU() END_SCREEN(); UNUSED(_skipStatic) - -/** - * MENU_ITEM generates draw & handler code for a menu item, potentially calling: - * - * MenuItem_::draw(sel, row, label, arg3...) - * MenuItem_::action(arg3...) - * - * Examples: - * BACK_ITEM(MSG_INFO_SCREEN) - * MenuItem_back::action(plabel, ...) - * MenuItem_back::draw(sel, row, plabel, ...) - * - * ACTION_ITEM(MSG_PAUSE_PRINT, lcd_sdcard_pause) - * MenuItem_function::action(plabel, lcd_sdcard_pause) - * MenuItem_function::draw(sel, row, plabel, lcd_sdcard_pause) - * - * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999) - * MenuItem_int3::action(plabel, &feedrate_percentage, 10, 999) - * MenuItem_int3::draw(sel, row, plabel, &feedrate_percentage, 10, 999) - */ - -#if ENABLED(ENCODER_RATE_MULTIPLIER) - #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) do{ if (USE_MULTIPLIER) ui.enable_encoder_multiplier(true); }while(0) -#else - #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) -#endif - -#define _MENU_INNER_P(TYPE, USE_MULTIPLIER, PLABEL, V...) do { \ - PGM_P const plabel = PLABEL; \ - if (encoderLine == _thisItemNr && ui.use_click()) { \ - _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \ - MenuItem_##TYPE::action(plabel, ##V); \ - if (ui.screen_changed) return; \ - } \ - if (ui.should_draw()) \ - MenuItem_##TYPE::draw \ - (encoderLine == _thisItemNr, _lcdLineNr, plabel, ##V); \ -}while(0) - -#define _MENU_ITEM_P(TYPE, V...) do { \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value and optional data -#define _MENU_ITEM_N_S_P(TYPE, N, S, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::init(N, S); \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value -#define _MENU_ITEM_N_P(TYPE, N, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::itemIndex = N; \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Items with a unique string -#define _MENU_ITEM_S_P(TYPE, S, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::itemString = S; \ - _MENU_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// STATIC_ITEM draws a styled string with no highlight. -// Parameters: label [, style [, char *value] ] - -#define STATIC_ITEM_INNER_P(PLABEL, V...) do{ \ - if (_skipStatic && encoderLine <= _thisItemNr) { \ - ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ - ++encoderLine; \ - } \ - if (ui.should_draw()) \ - MenuItem_static::draw(_lcdLineNr, PLABEL, ##V); \ -} while(0) - -#define STATIC_ITEM_P(PLABEL, V...) do{ \ - if (_menuLineNr == _thisItemNr) \ - STATIC_ITEM_INNER_P(PLABEL, ##V); \ - NEXT_ITEM(); \ -} while(0) - -#define STATIC_ITEM_N_P(PLABEL, N, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - MenuItemBase::init(N); \ - STATIC_ITEM_INNER_P(PLABEL, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// PSTRING_ITEM is like STATIC_ITEM but it takes -// two PSTRs with the style as the last parameter. - -#define PSTRING_ITEM_P(PLABEL, PVAL, STYL) do{ \ - constexpr int m = 20; \ - char msg[m+1]; \ - msg[0] = ':'; msg[1] = ' '; \ - strncpy_P(msg+2, PSTR(PVAL), m-2); \ - if (msg[m-1] & 0x80) msg[m-1] = '\0'; \ - STATIC_ITEM_P(PLABEL, STYL, msg); \ -}while(0) - -#define PSTRING_ITEM(LABEL, V...) PSTRING_ITEM_P(GET_TEXT(LABEL), ##V) - -#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_P(GET_TEXT(LABEL), ##V) -#define STATIC_ITEM_N(LABEL, N, V...) STATIC_ITEM_N_P(GET_TEXT(LABEL), N, ##V) - -#define MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, false, PLABEL, ##V) -#define MENU_ITEM_N_S(TYPE, N, S, LABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) -#define MENU_ITEM_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, false, PLABEL, ##V) -#define MENU_ITEM_S(TYPE, S, LABEL, V...) MENU_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) -#define MENU_ITEM_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, false, PLABEL, ##V) -#define MENU_ITEM_N(TYPE, N, LABEL, V...) MENU_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) -#define MENU_ITEM_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, false, PLABEL, ##V) -#define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) - -#define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL) - -#define ACTION_ITEM_N_S_P(N, S, PLABEL, ACTION) MENU_ITEM_N_S_P(function, N, S, PLABEL, ACTION) -#define ACTION_ITEM_N_S(N, S, LABEL, ACTION) ACTION_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ACTION) -#define ACTION_ITEM_S_P(S, PLABEL, ACTION) MENU_ITEM_S_P(function, S, PLABEL, ACTION) -#define ACTION_ITEM_S(S, LABEL, ACTION) ACTION_ITEM_S_P(S, GET_TEXT(LABEL), ACTION) -#define ACTION_ITEM_N_P(N, PLABEL, ACTION) MENU_ITEM_N_P(function, N, PLABEL, ACTION) -#define ACTION_ITEM_N(N, LABEL, ACTION) ACTION_ITEM_N_P(N, GET_TEXT(LABEL), ACTION) -#define ACTION_ITEM_P(PLABEL, ACTION) MENU_ITEM_P(function, PLABEL, ACTION) -#define ACTION_ITEM(LABEL, ACTION) ACTION_ITEM_P(GET_TEXT(LABEL), ACTION) - -#define GCODES_ITEM_N_S_P(N, S, PLABEL, GCODES) MENU_ITEM_N_S_P(gcode, N, S, PLABEL, GCODES) -#define GCODES_ITEM_N_S(N, S, LABEL, GCODES) GCODES_ITEM_N_S_P(N, S, GET_TEXT(LABEL), GCODES) -#define GCODES_ITEM_S_P(S, PLABEL, GCODES) MENU_ITEM_S_P(gcode, S, PLABEL, GCODES) -#define GCODES_ITEM_S(S, LABEL, GCODES) GCODES_ITEM_S_P(S, GET_TEXT(LABEL), GCODES) -#define GCODES_ITEM_N_P(N, PLABEL, GCODES) MENU_ITEM_N_P(gcode, N, PLABEL, GCODES) -#define GCODES_ITEM_N(N, LABEL, GCODES) GCODES_ITEM_N_P(N, GET_TEXT(LABEL), GCODES) -#define GCODES_ITEM_P(PLABEL, GCODES) MENU_ITEM_P(gcode, PLABEL, GCODES) -#define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_P(GET_TEXT(LABEL), GCODES) - -#define SUBMENU_N_S_P(N, S, PLABEL, DEST) MENU_ITEM_N_S_P(submenu, N, S, PLABEL, DEST) -#define SUBMENU_N_S(N, S, LABEL, DEST) SUBMENU_N_S_P(N, S, GET_TEXT(LABEL), DEST) -#define SUBMENU_S_P(S, PLABEL, DEST) MENU_ITEM_S_P(submenu, S, PLABEL, DEST) -#define SUBMENU_S(S, LABEL, DEST) SUBMENU_S_P(S, GET_TEXT(LABEL), DEST) -#define SUBMENU_N_P(N, PLABEL, DEST) MENU_ITEM_N_P(submenu, N, PLABEL, DEST) -#define SUBMENU_N(N, LABEL, DEST) SUBMENU_N_P(N, GET_TEXT(LABEL), DEST) -#define SUBMENU_P(PLABEL, DEST) MENU_ITEM_P(submenu, PLABEL, DEST) -#define SUBMENU(LABEL, DEST) SUBMENU_P(GET_TEXT(LABEL), DEST) - -#define EDIT_ITEM_N_S_P(TYPE, N, S, PLABEL, V...) MENU_ITEM_N_S_P(TYPE, N, S, PLABEL, ##V) -#define EDIT_ITEM_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_N_S_P(TYPE, N, S, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_S_P(TYPE, S, PLABEL, V...) MENU_ITEM_S_P(TYPE, S, PLABEL, ##V) -#define EDIT_ITEM_S(TYPE, S, LABEL, V...) EDIT_ITEM_S_P(TYPE, S, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_N_P(TYPE, N, PLABEL, V...) MENU_ITEM_N_P(TYPE, N, PLABEL, ##V) -#define EDIT_ITEM_N(TYPE, N, LABEL, V...) EDIT_ITEM_N_P(TYPE, N, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_P(TYPE, PLABEL, V...) MENU_ITEM_P(TYPE, PLABEL, ##V) -#define EDIT_ITEM(TYPE, LABEL, V...) EDIT_ITEM_P(TYPE, GET_TEXT(LABEL), ##V) - -#define EDIT_ITEM_FAST_N_S_P(TYPE, N, S, PLABEL, V...) _MENU_ITEM_N_S_P(TYPE, N, S, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_FAST_N_S_P(TYPE, N, S, true, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_FAST_S_P(TYPE, S, PLABEL, V...) _MENU_ITEM_S_P(TYPE, S, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_S(TYPE, S, LABEL, V...) EDIT_ITEM_FAST_S_P(TYPE, S, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_FAST_N_P(TYPE, N, PLABEL, V...) _MENU_ITEM_N_P(TYPE, N, true, PLABEL, ##V) -#define EDIT_ITEM_FAST_N(TYPE, N, LABEL, V...) EDIT_ITEM_FAST_N_P(TYPE, N, GET_TEXT(LABEL), ##V) -#define EDIT_ITEM_FAST_P(TYPE, PLABEL, V...) _MENU_ITEM_P(TYPE, true, PLABEL, ##V) -#define EDIT_ITEM_FAST(TYPE, LABEL, V...) EDIT_ITEM_FAST_P(TYPE, GET_TEXT(LABEL), ##V) - -#define _CONFIRM_ITEM_INNER_P(PLABEL, V...) do { \ - if (encoderLine == _thisItemNr && ui.use_click()) { \ - ui.save_previous_screen(); \ - ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \ - return; \ - } \ - if (ui.should_draw()) MenuItem_confirm::draw \ - (encoderLine == _thisItemNr, _lcdLineNr, PLABEL, ##V); \ -}while(0) - -// Indexed items set a global index value and optional data -#define _CONFIRM_ITEM_P(PLABEL, V...) do { \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - _CONFIRM_ITEM_INNER_P(PLABEL, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value -#define _CONFIRM_ITEM_N_S_P(N, S, V...) do{ \ - if (_menuLineNr == _thisItemNr) { \ - _skipStatic = false; \ - MenuItemBase::init(N, S); \ - _CONFIRM_ITEM_INNER_P(TYPE, ##V); \ - } \ - NEXT_ITEM(); \ -}while(0) - -// Indexed items set a global index value -#define _CONFIRM_ITEM_N_P(N, V...) _CONFIRM_ITEM_N_S_P(N, nullptr, V) - -#define CONFIRM_ITEM_P(PLABEL,A,B,V...) _CONFIRM_ITEM_P(PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM(LABEL, V...) CONFIRM_ITEM_P(GET_TEXT(LABEL), ##V) - -#define YESNO_ITEM_P(PLABEL, V...) _CONFIRM_ITEM_P(PLABEL, ##V) -#define YESNO_ITEM(LABEL, V...) YESNO_ITEM_P(GET_TEXT(LABEL), ##V) - -#define CONFIRM_ITEM_N_S_P(N,S,PLABEL,A,B,V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM_N_S(N,S,LABEL,V...) CONFIRM_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) -#define CONFIRM_ITEM_N_P(N,PLABEL,A,B,V...) _CONFIRM_ITEM_N_P(N, PLABEL, GET_TEXT(A), GET_TEXT(B), ##V) -#define CONFIRM_ITEM_N(N,LABEL, V...) CONFIRM_ITEM_N_P(N, GET_TEXT(LABEL), ##V) - -#define YESNO_ITEM_N_S_P(N,S,PLABEL, V...) _CONFIRM_ITEM_N_S_P(N, S, PLABEL, ##V) -#define YESNO_ITEM_N_S(N,S,LABEL, V...) YESNO_ITEM_N_S_P(N, S, GET_TEXT(LABEL), ##V) -#define YESNO_ITEM_N_P(N,PLABEL, V...) _CONFIRM_ITEM_N_P(N, PLABEL, ##V) -#define YESNO_ITEM_N(N,LABEL, V...) YESNO_ITEM_N_P(N, GET_TEXT(LABEL), ##V) - -#if ENABLED(LEVEL_BED_CORNERS) - void _lcd_level_bed_corners(); -#endif - -#if HAS_FAN - - #include "../../module/temperature.h" - - inline void on_fan_update() { - thermalManager.set_fan_speed(MenuItemBase::itemIndex, editable.uint8); - } - - #if ENABLED(EXTRA_FAN_SPEED) - #define EDIT_EXTRA_FAN_SPEED(V...) EDIT_ITEM_FAST_N(V) - #else - #define EDIT_EXTRA_FAN_SPEED(...) - #endif - - #define _FAN_EDIT_ITEMS(F,L) do{ \ - editable.uint8 = thermalManager.fan_speed[F]; \ - EDIT_ITEM_FAST_N(percent, F, MSG_##L, &editable.uint8, 0, 255, on_fan_update); \ - EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_##L, &thermalManager.new_fan_speed[F], 3, 255); \ - }while(0) - - #if FAN_COUNT > 1 - #define FAN_EDIT_ITEMS(F) _FAN_EDIT_ITEMS(F,FAN_SPEED_N) - #endif - - #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && EXTRUDERS > N) - - #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7) - #define DEFINE_SINGLENOZZLE_ITEM() \ - auto singlenozzle_item = [&](const uint8_t f) { \ - editable.uint8 = singlenozzle_fan_speed[f]; \ - EDIT_ITEM_FAST_N(percent, f, MSG_STORED_FAN_N, &editable.uint8, 0, 255, on_fan_update); \ - } - #else - #define DEFINE_SINGLENOZZLE_ITEM() NOOP - #endif - -#endif // HAS_FAN diff --git a/Marlin/src/lcd/menu/menu_job_recovery.cpp b/Marlin/src/lcd/menu/menu_job_recovery.cpp deleted file mode 100644 index 7cd2949d62..0000000000 --- a/Marlin/src/lcd/menu/menu_job_recovery.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Job Recovery Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, POWER_LOSS_RECOVERY) - -#include "menu_item.h" -#include "../../gcode/queue.h" -#include "../../sd/cardreader.h" -#include "../../feature/powerloss.h" - -static void lcd_power_loss_recovery_resume() { - ui.return_to_status(); - queue.inject_P(PSTR("M1000")); -} - -void lcd_power_loss_recovery_cancel() { - recovery.cancel(); - ui.return_to_status(); -} - -// TODO: Display long filename with Cancel/Resume buttons -// Requires supporting methods in PLR class. -void menu_job_recovery() { - ui.defer_status_screen(); - START_MENU(); - STATIC_ITEM(MSG_OUTAGE_RECOVERY); - ACTION_ITEM(MSG_RESUME_PRINT, lcd_power_loss_recovery_resume); - ACTION_ITEM(MSG_STOP_PRINT, lcd_power_loss_recovery_cancel); - END_MENU(); -} - -#endif // HAS_LCD_MENU && POWER_LOSS_RECOVERY diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp deleted file mode 100644 index 386a4d799a..0000000000 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// LED Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU && EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) - -#include "menu_item.h" - -#if ENABLED(LED_CONTROL_MENU) - #include "../../feature/leds/leds.h" - - #if ENABLED(LED_COLOR_PRESETS) - - void menu_led_presets() { - START_MENU(); - #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_LED_PRESETS, SS_DEFAULT|SS_INVERT); - #endif - BACK_ITEM(MSG_LED_CONTROL); - ACTION_ITEM(MSG_SET_LEDS_WHITE, leds.set_white); - ACTION_ITEM(MSG_SET_LEDS_RED, leds.set_red); - ACTION_ITEM(MSG_SET_LEDS_ORANGE, leds.set_orange); - ACTION_ITEM(MSG_SET_LEDS_YELLOW, leds.set_yellow); - ACTION_ITEM(MSG_SET_LEDS_GREEN, leds.set_green); - ACTION_ITEM(MSG_SET_LEDS_BLUE, leds.set_blue); - ACTION_ITEM(MSG_SET_LEDS_INDIGO, leds.set_indigo); - ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds.set_violet); - END_MENU(); - } - - #endif - - #if ENABLED(NEO2_COLOR_PRESETS) - - void menu_leds2_presets() { - START_MENU(); - #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_NEO2_PRESETS, SS_DEFAULT|SS_INVERT); - #endif - BACK_ITEM(MSG_LED_CONTROL); - ACTION_ITEM(MSG_SET_LEDS_WHITE, leds2.set_white); - ACTION_ITEM(MSG_SET_LEDS_RED, leds2.set_red); - ACTION_ITEM(MSG_SET_LEDS_ORANGE, leds2.set_orange); - ACTION_ITEM(MSG_SET_LEDS_YELLOW, leds2.set_yellow); - ACTION_ITEM(MSG_SET_LEDS_GREEN, leds2.set_green); - ACTION_ITEM(MSG_SET_LEDS_BLUE, leds2.set_blue); - ACTION_ITEM(MSG_SET_LEDS_INDIGO, leds2.set_indigo); - ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds2.set_violet); - END_MENU(); - } - - #endif - - void menu_led_custom() { - START_MENU(); - BACK_ITEM(MSG_LED_CONTROL); - #if ENABLED(NEOPIXEL2_SEPARATE) - STATIC_ITEM_N(MSG_LED_CHANNEL_N, 1, SS_DEFAULT|SS_INVERT); - #endif - EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds.color.r, 0, 255, leds.update, true); - EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds.color.g, 0, 255, leds.update, true); - EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds.color.b, 0, 255, leds.update, true); - #if EITHER(RGBW_LED, NEOPIXEL_LED) - EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds.color.w, 0, 255, leds.update, true); - #if ENABLED(NEOPIXEL_LED) - EDIT_ITEM(uint8, MSG_LED_BRIGHTNESS, &leds.color.i, 0, 255, leds.update, true); - #endif - #endif - #if ENABLED(NEOPIXEL2_SEPARATE) - STATIC_ITEM_N(MSG_LED_CHANNEL_N, 2, SS_DEFAULT|SS_INVERT); - EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds2.color.r, 0, 255, leds2.update, true); - EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds2.color.g, 0, 255, leds2.update, true); - EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds2.color.b, 0, 255, leds2.update, true); - EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds2.color.w, 0, 255, leds2.update, true); - EDIT_ITEM(uint8, MSG_NEO2_BRIGHTNESS, &leds2.color.i, 0, 255, leds2.update, true); - #endif - END_MENU(); - } -#endif - -#if ENABLED(CASE_LIGHT_MENU) - #include "../../feature/caselight.h" - - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - void menu_case_light() { - START_MENU(); - BACK_ITEM(MSG_CONFIGURATION); - EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &caselight.brightness, 0, 255, caselight.update_brightness, true); - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); - END_MENU(); - } - #endif -#endif - -void menu_led() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - - #if ENABLED(LED_CONTROL_MENU) - editable.state = leds.lights_on; - EDIT_ITEM(bool, MSG_LEDS, &editable.state, leds.toggle); - ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds.set_default); - #if ENABLED(NEOPIXEL2_SEPARATE) - editable.state = leds2.lights_on; - EDIT_ITEM(bool, MSG_LEDS2, &editable.state, leds2.toggle); - ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds2.set_default); - #endif - #if ENABLED(LED_COLOR_PRESETS) - SUBMENU(MSG_LED_PRESETS, menu_led_presets); - #endif - #if ENABLED(NEO2_COLOR_PRESETS) - SUBMENU(MSG_NEO2_PRESETS, menu_leds2_presets); - #endif - SUBMENU(MSG_CUSTOM_LEDS, menu_led_custom); - #endif - - // - // Set Case light on/off/brightness - // - #if ENABLED(CASE_LIGHT_MENU) - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - if (TERN1(CASE_LIGHT_USE_NEOPIXEL, PWM_PIN(CASE_LIGHT_PIN))) - SUBMENU(MSG_CASE_LIGHT, menu_case_light); - else - #endif - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); - #endif - END_MENU(); -} - -#endif // HAS_LCD_MENU && LED_CONTROL_MENU diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp deleted file mode 100644 index 5b98382559..0000000000 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Main Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU - -#include "menu_item.h" -#include "../../module/temperature.h" -#include "../../gcode/queue.h" -#include "../../module/printcounter.h" -#include "../../module/stepper.h" -#include "../../sd/cardreader.h" - -#if HAS_GAMES && DISABLED(LCD_INFO_MENU) - #include "game/game.h" -#endif - -#if EITHER(SDSUPPORT, HOST_PROMPT_SUPPORT) || defined(ACTION_ON_CANCEL) - #define MACHINE_CAN_STOP 1 -#endif -#if ANY(SDSUPPORT, HOST_PROMPT_SUPPORT, PARK_HEAD_ON_PAUSE) || defined(ACTION_ON_PAUSE) - #define MACHINE_CAN_PAUSE 1 -#endif - -#if ENABLED(PRUSA_MMU2) - #include "../../lcd/menu/menu_mmu2.h" -#endif - -#if ENABLED(PASSWORD_FEATURE) - #include "../../feature/password/password.h" -#endif - -#if ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START) - #include "../../feature/host_actions.h" -#endif - -void menu_tune(); -void menu_cancelobject(); -void menu_motion(); -void menu_temperature(); -void menu_configuration(); - -#if ENABLED(CUSTOM_USER_MENUS) - void menu_user(); -#endif - -#if HAS_POWER_MONITOR - void menu_power_monitor(); -#endif - -#if ENABLED(MIXING_EXTRUDER) - void menu_mixer(); -#endif - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - void _menu_temp_filament_op(const PauseMode, const int8_t); - void menu_change_filament(); -#endif - -#if ENABLED(LCD_INFO_MENU) - void menu_info(); -#endif - -#if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) - void menu_led(); -#endif - -#if HAS_CUTTER - void menu_spindle_laser(); -#endif - -extern const char M21_STR[]; - -void menu_main() { - const bool busy = printingIsActive() - #if ENABLED(SDSUPPORT) - , card_detected = card.isMounted() - , card_open = card_detected && card.isFileOpen() - #endif - ; - - START_MENU(); - BACK_ITEM(MSG_INFO_SCREEN); - - if (busy) { - #if MACHINE_CAN_PAUSE - ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print); - #endif - #if MACHINE_CAN_STOP - SUBMENU(MSG_STOP_PRINT, []{ - MenuItem_confirm::select_screen( - GET_TEXT(MSG_BUTTON_STOP), GET_TEXT(MSG_BACK), - ui.abort_print, ui.goto_previous_screen, - GET_TEXT(MSG_STOP_PRINT), (const char *)nullptr, PSTR("?") - ); - }); - #endif - - SUBMENU(MSG_TUNE, menu_tune); - - #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) - SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); - #endif - } - else { - - #if !HAS_ENCODER_WHEEL && ENABLED(SDSUPPORT) - - // *** IF THIS SECTION IS CHANGED, REPRODUCE BELOW *** - - // - // Autostart - // - #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_AUTOSTART, card.beginautostart); - #endif - - if (card_detected) { - if (!card_open) { - SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); - #if PIN_EXISTS(SD_DETECT) - GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); - #else - GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); - #endif - } - } - else { - #if PIN_EXISTS(SD_DETECT) - ACTION_ITEM(MSG_NO_MEDIA, nullptr); - #else - GCODES_ITEM(MSG_ATTACH_MEDIA, M21_STR); - #endif - } - - #endif // !HAS_ENCODER_WHEEL && SDSUPPORT - - if (TERN0(MACHINE_CAN_PAUSE, printingIsPaused())) - ACTION_ITEM(MSG_RESUME_PRINT, ui.resume_print); - - #if ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START) - ACTION_ITEM(MSG_HOST_START_PRINT, host_action_start); - #endif - - SUBMENU(MSG_MOTION, menu_motion); - } - - #if HAS_CUTTER - SUBMENU(MSG_CUTTER(MENU), menu_spindle_laser); - #endif - - #if HAS_TEMPERATURE - SUBMENU(MSG_TEMPERATURE, menu_temperature); - #endif - - #if HAS_POWER_MONITOR - SUBMENU(MSG_POWER_MONITOR, menu_power_monitor); - #endif - - #if ENABLED(MIXING_EXTRUDER) - SUBMENU(MSG_MIXER, menu_mixer); - #endif - - #if ENABLED(MMU2_MENUS) - if (!busy) SUBMENU(MSG_MMU2_MENU, menu_mmu2); - #endif - - SUBMENU(MSG_CONFIGURATION, menu_configuration); - - #if ENABLED(CUSTOM_USER_MENUS) - #ifdef CUSTOM_USER_MENU_TITLE - SUBMENU_P(PSTR(CUSTOM_USER_MENU_TITLE), menu_user); - #else - SUBMENU(MSG_USER_MENU, menu_user); - #endif - #endif - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) - if (thermalManager.targetHotEnoughToExtrude(active_extruder)) - GCODES_ITEM(MSG_FILAMENTCHANGE, PSTR("M600 B0")); - else - SUBMENU(MSG_FILAMENTCHANGE, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, 0); }); - #else - SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament); - #endif - #endif - - #if ENABLED(LCD_INFO_MENU) - SUBMENU(MSG_INFO_MENU, menu_info); - #endif - - #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) - SUBMENU(MSG_LEDS, menu_led); - #endif - - // - // Switch power on/off - // - #if ENABLED(PSU_CONTROL) - if (powersupply_on) - GCODES_ITEM(MSG_SWITCH_PS_OFF, PSTR("M81")); - else - GCODES_ITEM(MSG_SWITCH_PS_ON, PSTR("M80")); - #endif - - #if BOTH(HAS_ENCODER_WHEEL, SDSUPPORT) - - if (!busy) { - - // *** IF THIS SECTION IS CHANGED, REPRODUCE ABOVE *** - - // - // Autostart - // - #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_AUTOSTART, card.beginautostart); - #endif - - if (card_detected) { - if (!card_open) { - #if PIN_EXISTS(SD_DETECT) - GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); - #else - GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); - #endif - SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); - } - } - else { - #if PIN_EXISTS(SD_DETECT) - ACTION_ITEM(MSG_NO_MEDIA, nullptr); - #else - GCODES_ITEM(MSG_ATTACH_MEDIA, M21_STR); - #endif - } - } - - #endif // HAS_ENCODER_WHEEL && SDSUPPORT - - #if HAS_SERVICE_INTERVALS - static auto _service_reset = [](const int index) { - print_job_timer.resetServiceInterval(index); - ui.completion_feedback(); - ui.reset_status(); - ui.return_to_status(); - }; - #if SERVICE_INTERVAL_1 > 0 - CONFIRM_ITEM_P(PSTR(SERVICE_NAME_1), - MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, - []{ _service_reset(1); }, ui.goto_previous_screen, - GET_TEXT(MSG_SERVICE_RESET), F(SERVICE_NAME_1), PSTR("?") - ); - #endif - #if SERVICE_INTERVAL_2 > 0 - CONFIRM_ITEM_P(PSTR(SERVICE_NAME_2), - MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, - []{ _service_reset(2); }, ui.goto_previous_screen, - GET_TEXT(MSG_SERVICE_RESET), F(SERVICE_NAME_2), PSTR("?") - ); - #endif - #if SERVICE_INTERVAL_3 > 0 - CONFIRM_ITEM_P(PSTR(SERVICE_NAME_3), - MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, - []{ _service_reset(3); }, ui.goto_previous_screen, - GET_TEXT(MSG_SERVICE_RESET), F(SERVICE_NAME_3), PSTR("?") - ); - #endif - #endif - - #if HAS_GAMES && DISABLED(LCD_INFO_MENU) - #if ENABLED(GAMES_EASTER_EGG) - SKIP_ITEM(); - SKIP_ITEM(); - SKIP_ITEM(); - #endif - // Game sub-menu or the individual game - { - SUBMENU( - #if HAS_GAME_MENU - MSG_GAMES, menu_game - #elif ENABLED(MARLIN_BRICKOUT) - MSG_BRICKOUT, brickout.enter_game - #elif ENABLED(MARLIN_INVADERS) - MSG_INVADERS, invaders.enter_game - #elif ENABLED(MARLIN_SNAKE) - MSG_SNAKE, snake.enter_game - #elif ENABLED(MARLIN_MAZE) - MSG_MAZE, maze.enter_game - #endif - ); - } - #endif - - END_MENU(); -} - -#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp deleted file mode 100644 index 93ecc49d98..0000000000 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// SD Card Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, SDSUPPORT) - -#include "menu_item.h" -#include "../../sd/cardreader.h" - -void lcd_sd_updir() { - ui.encoderPosition = card.cdup() ? ENCODER_STEPS_PER_MENU_ITEM : 0; - encoderTopLine = 0; - ui.screen_changed = true; - ui.refresh(); -} - -#if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - - uint16_t sd_encoder_position = 0xFFFF; - int8_t sd_top_line, sd_items; - - void MarlinUI::reselect_last_file() { - if (sd_encoder_position == 0xFFFF) return; - goto_screen(menu_media, sd_encoder_position, sd_top_line, sd_items); - sd_encoder_position = 0xFFFF; - defer_status_screen(); - } - -#endif - -inline void sdcard_start_selected_file() { - card.openAndPrintFile(card.filename); - ui.return_to_status(); - ui.reset_status(); -} - -class MenuItem_sdfile : public MenuItem_sdbase { - public: - static inline void draw(const bool sel, const uint8_t row, PGM_P const pstr, CardReader &theCard) { - MenuItem_sdbase::draw(sel, row, pstr, theCard, false); - } - static void action(PGM_P const pstr, CardReader &) { - #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - // Save menu state for the selected file - sd_encoder_position = ui.encoderPosition; - sd_top_line = encoderTopLine; - sd_items = screen_items; - #endif - #if ENABLED(SD_MENU_CONFIRM_START) - MenuItem_submenu::action(pstr, []{ - char * const longest = card.longest_filename(); - char buffer[strlen(longest) + 2]; - buffer[0] = ' '; - strcpy(buffer + 1, longest); - MenuItem_confirm::select_screen( - GET_TEXT(MSG_BUTTON_PRINT), GET_TEXT(MSG_BUTTON_CANCEL), - sdcard_start_selected_file, ui.goto_previous_screen, - GET_TEXT(MSG_START_PRINT), buffer, PSTR("?") - ); - }); - #else - sdcard_start_selected_file(); - UNUSED(pstr); - #endif - } -}; - -class MenuItem_sdfolder : public MenuItem_sdbase { - public: - static inline void draw(const bool sel, const uint8_t row, PGM_P const pstr, CardReader &theCard) { - MenuItem_sdbase::draw(sel, row, pstr, theCard, true); - } - static void action(PGM_P const, CardReader &theCard) { - card.cd(theCard.filename); - encoderTopLine = 0; - ui.encoderPosition = 2 * (ENCODER_STEPS_PER_MENU_ITEM); - ui.screen_changed = true; - TERN_(HAS_MARLINUI_U8GLIB, ui.drawing_screen = false); - ui.refresh(); - } -}; - -void menu_media() { - ui.encoder_direction_menus(); - - #if HAS_MARLINUI_U8GLIB - static uint16_t fileCnt; - if (ui.first_page) fileCnt = card.get_num_Files(); - #else - const uint16_t fileCnt = card.get_num_Files(); - #endif - - START_MENU(); - BACK_ITEM(MSG_MAIN); - if (card.flag.workDirIsRoot) { - #if !PIN_EXISTS(SD_DETECT) - ACTION_ITEM(MSG_REFRESH, []{ encoderTopLine = 0; card.mount(); }); - #endif - } - else if (card.isMounted()) - ACTION_ITEM_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); - - if (ui.should_draw()) for (uint16_t i = 0; i < fileCnt; i++) { - if (_menuLineNr == _thisItemNr) { - card.getfilename_sorted(SD_ORDER(i, fileCnt)); - if (card.flag.filenameIsDir) - MENU_ITEM(sdfolder, MSG_MEDIA_MENU, card); - else - MENU_ITEM(sdfile, MSG_MEDIA_MENU, card); - } - else - SKIP_ITEM(); - } - END_MENU(); -} - -#endif // HAS_LCD_MENU && SDSUPPORT diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp deleted file mode 100644 index 8010239336..0000000000 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Mixer Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, MIXING_EXTRUDER) - -#include "menu_item.h" -#include "menu_addon.h" - -#include "../../feature/mixing.h" - -#define CHANNEL_MIX_EDITING !HAS_DUAL_MIXING - -#if ENABLED(GRADIENT_MIX) - - void _lcd_mixer_gradient_z_edit(const bool isend) { - ui.defer_status_screen(); - ENCODER_RATE_MULTIPLY(true); - - float &zvar = isend ? mixer.gradient.end_z : mixer.gradient.start_z; - - if (ui.encoderPosition) { - zvar += float(int32_t(ui.encoderPosition)) * 0.1; - ui.encoderPosition = 0; - NOLESS(zvar, 0); - NOMORE(zvar, Z_MAX_POS); - } - - if (ui.should_draw()) { - char tmp[16]; - SETCURSOR(1, (LCD_HEIGHT - 1) / 2); - lcd_put_u8str_P(isend ? GET_TEXT(MSG_END_Z) : GET_TEXT(MSG_START_Z)); - sprintf_P(tmp, PSTR("%4d.%d mm"), int(zvar), int(zvar * 10) % 10); - SETCURSOR_RJ(9, (LCD_HEIGHT - 1) / 2); - lcd_put_u8str(tmp); - } - - if (ui.lcd_clicked) { - if (isend && zvar < mixer.gradient.start_z) - mixer.gradient.start_z = zvar; - else if (!isend && zvar > mixer.gradient.end_z) - mixer.gradient.end_z = zvar; - mixer.refresh_gradient(); - ui.goto_previous_screen(); - } - } - - void lcd_mixer_edit_gradient_menu() { - START_MENU(); - BACK_ITEM(MSG_MIXER); - - EDIT_ITEM(int8, MSG_START_VTOOL, &mixer.gradient.start_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); - EDIT_ITEM(int8, MSG_END_VTOOL, &mixer.gradient.end_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); - - #if ENABLED(GRADIENT_VTOOL) - EDIT_ITEM(int8, MSG_GRADIENT_ALIAS, &mixer.gradient.vtool_index, -1, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); - #endif - - char tmp[18]; - - PGM_P const slabel = GET_TEXT(MSG_START_Z); - SUBMENU_P(slabel, []{ _lcd_mixer_gradient_z_edit(false); }); - MENU_ITEM_ADDON_START_RJ(11); - sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.start_z), int(mixer.gradient.start_z * 10) % 10); - lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); - - PGM_P const elabel = GET_TEXT(MSG_END_Z); - SUBMENU_P(elabel, []{ _lcd_mixer_gradient_z_edit(true); }); - MENU_ITEM_ADDON_START_RJ(11); - sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.end_z), int(mixer.gradient.end_z * 10) % 10); - lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); - - END_MENU(); - } - -#endif // GRADIENT_MIX - -static uint8_t v_index; - -#if HAS_DUAL_MIXING - void _lcd_draw_mix(const uint8_t y) { - char tmp[20]; // "100%_100%" - sprintf_P(tmp, PSTR("%3d%% %3d%%"), int(mixer.mix[0]), int(mixer.mix[1])); - SETCURSOR(2, y); lcd_put_u8str_P(GET_TEXT(MSG_MIX)); - SETCURSOR_RJ(10, y); lcd_put_u8str(tmp); - } -#endif - -void _lcd_mixer_select_vtool() { - mixer.T(v_index); - TERN_(HAS_DUAL_MIXING, _lcd_draw_mix(LCD_HEIGHT - 1)); -} - -#if CHANNEL_MIX_EDITING - - void _lcd_mixer_cycle_mix() { - uint16_t bits = 0; - MIXER_STEPPER_LOOP(i) if (mixer.collector[i]) SBI(bits, i); - bits = (bits + 1) & (_BV(MIXING_STEPPERS) - 1); - if (!bits) ++bits; - MIXER_STEPPER_LOOP(i) mixer.collector[i] = TEST(bits, i) ? 10.0f : 0.0f; - ui.refresh(); - } - - void _lcd_mixer_commit_vtool() { - mixer.normalize(); - ui.goto_previous_screen(); - } - -#endif - -void lcd_mixer_mix_edit() { - - #if HAS_DUAL_MIXING && !CHANNEL_MIX_EDITING - - // Adjust 2-channel mix from the encoder - if (ui.encoderPosition) { - mixer.mix[0] += int32_t(ui.encoderPosition); - ui.encoderPosition = 0; - if (mixer.mix[0] < 0) mixer.mix[0] += 101; - if (mixer.mix[0] > 100) mixer.mix[0] -= 101; - mixer.mix[1] = 100 - mixer.mix[0]; - } - _lcd_draw_mix((LCD_HEIGHT - 1) / 2); - - // Click to commit the change - if (ui.lcd_clicked) { - mixer.update_vtool_from_mix(); - ui.goto_previous_screen(); - } - - #else - - START_MENU(); - BACK_ITEM(MSG_MIXER); - - #if CHANNEL_MIX_EDITING - - LOOP_S_LE_N(n, 1, MIXING_STEPPERS) - EDIT_ITEM_FAST_N(float42_52, n, MSG_MIX_COMPONENT_N, &mixer.collector[n-1], 0, 10); - - ACTION_ITEM(MSG_CYCLE_MIX, _lcd_mixer_cycle_mix); - ACTION_ITEM(MSG_COMMIT_VTOOL, _lcd_mixer_commit_vtool); - - #endif - - END_MENU(); - - #endif -} - -#if HAS_DUAL_MIXING - - // - // Toggle Dual-Mix - // - inline void _lcd_mixer_toggle_mix() { - mixer.mix[0] = mixer.mix[0] == 100 ? 0 : 100; - mixer.mix[1] = 100 - mixer.mix[0]; - mixer.update_vtool_from_mix(); - ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); - } - -#endif - -#if CHANNEL_MIX_EDITING - - // - // Prepare and Edit Mix - // - inline void _lcd_goto_mix_edit() { - mixer.refresh_collector(10, v_index); - ui.goto_screen(lcd_mixer_mix_edit); - lcd_mixer_mix_edit(); - } - -#endif - -#if ENABLED(GRADIENT_MIX) - // - // Reverse Gradient - // - inline void _lcd_mixer_reverse_gradient() { - const uint8_t sv = mixer.gradient.start_vtool; - mixer.gradient.start_vtool = mixer.gradient.end_vtool; - mixer.gradient.end_vtool = sv; - mixer.refresh_gradient(); - ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); - } -#endif - -void menu_mixer() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - - v_index = mixer.get_current_vtool(); - EDIT_ITEM(uint8, MSG_ACTIVE_VTOOL, &v_index, 0, MIXING_VIRTUAL_TOOLS - 1, _lcd_mixer_select_vtool, ENABLED(HAS_DUAL_MIXING)); - - #if HAS_DUAL_MIXING - { - char tmp[11]; - SUBMENU(MSG_MIX, lcd_mixer_mix_edit); - MENU_ITEM_ADDON_START_RJ(9); - mixer.update_mix_from_vtool(); - sprintf_P(tmp, PSTR("%3d;%3d%%"), int(mixer.mix[0]), int(mixer.mix[1])); - lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); - ACTION_ITEM(MSG_TOGGLE_MIX, _lcd_mixer_toggle_mix); - } - #else - SUBMENU(MSG_MIX, _lcd_goto_mix_edit); - #endif - - // - // Reset All V-Tools - // - CONFIRM_ITEM(MSG_RESET_VTOOLS, - MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, - []{ - mixer.reset_vtools(); - LCD_MESSAGEPGM(MSG_VTOOLS_RESET); - ui.return_to_status(); - }, - nullptr, - GET_TEXT(MSG_RESET_VTOOLS), (const char *)nullptr, PSTR("?") - ); - - #if ENABLED(GRADIENT_MIX) - { - char tmp[13]; - SUBMENU(MSG_GRADIENT, lcd_mixer_edit_gradient_menu); - MENU_ITEM_ADDON_START_RJ(9); - sprintf_P(tmp, PSTR("T%i->T%i"), mixer.gradient.start_vtool, mixer.gradient.end_vtool); - lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); - ACTION_ITEM(MSG_REVERSE_GRADIENT, _lcd_mixer_reverse_gradient); - } - #endif - - END_MENU(); -} - -#endif // HAS_LCD_MENU && MIXING_EXTRUDER diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp deleted file mode 100644 index 0a63d90c63..0000000000 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if BOTH(HAS_LCD_MENU, MMU2_MENUS) - -#include "../../feature/mmu2/mmu2.h" -#include "menu_mmu2.h" -#include "menu_item.h" - -uint8_t currentTool; -bool mmuMenuWait; - -// -// Load Filament -// - -void _mmu2_load_filamentToNozzle(uint8_t index) { - ui.reset_status(); - ui.return_to_status(); - ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); - if (mmu2.load_filament_to_nozzle(index)) ui.reset_status(); -} - -inline void action_mmu2_load_filament_to_nozzle(const uint8_t tool) { - _mmu2_load_filamentToNozzle(tool); - ui.return_to_status(); -} - -void _mmu2_load_filament(uint8_t index) { - ui.return_to_status(); - ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); - mmu2.load_filament(index); - ui.reset_status(); -} -void action_mmu2_load_all() { - LOOP_L_N(i, EXTRUDERS) _mmu2_load_filament(i); - ui.return_to_status(); -} - -void menu_mmu2_load_filament() { - START_MENU(); - BACK_ITEM(MSG_MMU2_MENU); - ACTION_ITEM(MSG_MMU2_ALL, action_mmu2_load_all); - LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ _mmu2_load_filament(MenuItemBase::itemIndex); }); - END_MENU(); -} - -void menu_mmu2_load_to_nozzle() { - START_MENU(); - BACK_ITEM(MSG_MMU2_MENU); - LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_load_filament_to_nozzle(MenuItemBase::itemIndex); }); - END_MENU(); -} - -// -// Eject Filament -// - -void _mmu2_eject_filament(uint8_t index) { - ui.reset_status(); - ui.return_to_status(); - ui.status_printf_P(0, GET_TEXT(MSG_MMU2_EJECTING_FILAMENT), int(index + 1)); - if (mmu2.eject_filament(index, true)) ui.reset_status(); -} - -void action_mmu2_unload_filament() { - ui.reset_status(); - ui.return_to_status(); - LCD_MESSAGEPGM(MSG_MMU2_UNLOADING_FILAMENT); - idle(); - if (mmu2.unload()) ui.reset_status(); -} - -void menu_mmu2_eject_filament() { - START_MENU(); - BACK_ITEM(MSG_MMU2_MENU); - LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ _mmu2_eject_filament(MenuItemBase::itemIndex); }); - END_MENU(); -} - -// -// MMU2 Menu -// - -void action_mmu2_reset() { - mmu2.init(); - ui.reset_status(); -} - -void menu_mmu2() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - SUBMENU(MSG_MMU2_LOAD_FILAMENT, menu_mmu2_load_filament); - SUBMENU(MSG_MMU2_LOAD_TO_NOZZLE, menu_mmu2_load_to_nozzle); - SUBMENU(MSG_MMU2_EJECT_FILAMENT, menu_mmu2_eject_filament); - ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, action_mmu2_unload_filament); - ACTION_ITEM(MSG_MMU2_RESET, action_mmu2_reset); - END_MENU(); -} - -// -// T* Choose Filament -// - -inline void action_mmu2_choose(const uint8_t tool) { - currentTool = tool; - mmuMenuWait = false; -} - -void menu_mmu2_choose_filament() { - START_MENU(); - #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_MMU2_CHOOSE_FILAMENT_HEADER, SS_DEFAULT|SS_INVERT); - #endif - LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_choose(MenuItemBase::itemIndex); }); - END_MENU(); -} - -// -// MMU2 Filament Runout -// - -void menu_mmu2_pause() { - currentTool = mmu2.get_current_tool(); - START_MENU(); - #if LCD_HEIGHT > 2 - STATIC_ITEM(MSG_FILAMENT_CHANGE_HEADER, SS_DEFAULT|SS_INVERT); - #endif - ACTION_ITEM(MSG_MMU2_RESUME, []{ mmuMenuWait = false; }); - ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, []{ mmu2.unload(); }); - ACTION_ITEM(MSG_MMU2_LOAD_FILAMENT, []{ mmu2.load_filament(currentTool); }); - ACTION_ITEM(MSG_MMU2_LOAD_TO_NOZZLE, []{ mmu2.load_filament_to_nozzle(currentTool); }); - END_MENU(); -} - -void mmu2_M600() { - ui.defer_status_screen(); - ui.goto_screen(menu_mmu2_pause); - mmuMenuWait = true; - while (mmuMenuWait) idle(); -} - -uint8_t mmu2_choose_filament() { - ui.defer_status_screen(); - ui.goto_screen(menu_mmu2_choose_filament); - mmuMenuWait = true; - while (mmuMenuWait) idle(); - ui.return_to_status(); - return currentTool; -} - -#endif // HAS_LCD_MENU && MMU2_MENUS diff --git a/Marlin/src/lcd/menu/menu_mmu2.h b/Marlin/src/lcd/menu/menu_mmu2.h deleted file mode 100644 index 4230c01464..0000000000 --- a/Marlin/src/lcd/menu/menu_mmu2.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -void menu_mmu2(); -void mmu2_M600(); -uint8_t mmu2_choose_filament(); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp deleted file mode 100644 index 2972920f34..0000000000 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ /dev/null @@ -1,399 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Motion Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU - -#include "menu_item.h" -#include "menu_addon.h" - -#include "../../module/motion.h" - -#if ENABLED(DELTA) - #include "../../module/delta.h" -#endif - -#if ENABLED(PREVENT_COLD_EXTRUSION) - #include "../../module/temperature.h" -#endif - -#if HAS_LEVELING - #include "../../module/planner.h" - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#if ENABLED(MANUAL_E_MOVES_RELATIVE) - float manual_move_e_origin = 0; -#endif - -// -// "Motion" > "Move Axis" submenu -// - -static void _lcd_move_xyz(PGM_P const name, const AxisEnum axis) { - if (ui.use_click()) return ui.goto_previous_screen_no_defer(); - if (ui.encoderPosition && !ui.manual_move.processing) { - // Get motion limit from software endstops, if any - float min, max; - soft_endstop.get_manual_axis_limits(axis, min, max); - - // Delta limits XY based on the current offset from center - // This assumes the center is 0,0 - #if ENABLED(DELTA) - if (axis != Z_AXIS) { - max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis - min = -max; - } - #endif - - // Get the new position - const float diff = float(int32_t(ui.encoderPosition)) * ui.manual_move.menu_scale; - #if IS_KINEMATIC - ui.manual_move.offset += diff; - if (int32_t(ui.encoderPosition) < 0) - NOLESS(ui.manual_move.offset, min - current_position[axis]); - else - NOMORE(ui.manual_move.offset, max - current_position[axis]); - #else - current_position[axis] += diff; - if (int32_t(ui.encoderPosition) < 0) - NOLESS(current_position[axis], min); - else - NOMORE(current_position[axis], max); - #endif - - ui.manual_move.soon(axis); - ui.refresh(LCDVIEW_REDRAW_NOW); - } - ui.encoderPosition = 0; - if (ui.should_draw()) { - const float pos = NATIVE_TO_LOGICAL( - ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), - axis - ); - MenuEditItemBase::draw_edit_screen(name, ui.manual_move.menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr63(pos)); - } -} -void lcd_move_x() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_X), X_AXIS); } -void lcd_move_y() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Y), Y_AXIS); } -void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } - -#if E_MANUAL - - static void lcd_move_e(TERN_(MULTI_MANUAL, const int8_t eindex=-1)) { - if (ui.use_click()) return ui.goto_previous_screen_no_defer(); - if (ui.encoderPosition) { - if (!ui.manual_move.processing) { - const float diff = float(int32_t(ui.encoderPosition)) * ui.manual_move.menu_scale; - TERN(IS_KINEMATIC, ui.manual_move.offset, current_position.e) += diff; - ui.manual_move.soon(E_AXIS - #if MULTI_MANUAL - , eindex - #endif - ); - ui.refresh(LCDVIEW_REDRAW_NOW); - } - ui.encoderPosition = 0; - } - if (ui.should_draw()) { - TERN_(MULTI_MANUAL, MenuItemBase::init(eindex)); - MenuEditItemBase::draw_edit_screen( - GET_TEXT(TERN(MULTI_MANUAL, MSG_MOVE_EN, MSG_MOVE_E)), - ftostr41sign(current_position.e - + TERN0(IS_KINEMATIC, ui.manual_move.offset) - - TERN0(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin) - ) - ); - } // should_draw - } - -#endif // E_MANUAL - -// -// "Motion" > "Move Xmm" > "Move XYZ" submenu -// - -#ifndef SHORT_MANUAL_Z_MOVE - #define SHORT_MANUAL_Z_MOVE 0.025 -#endif - -screenFunc_t _manual_move_func_ptr; - -void _goto_manual_move(const float scale) { - ui.defer_status_screen(); - ui.manual_move.menu_scale = scale; - ui.goto_screen(_manual_move_func_ptr); -} - -void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int8_t eindex=-1) { - _manual_move_func_ptr = func; - START_MENU(); - if (LCD_HEIGHT >= 4) { - switch (axis) { - case X_AXIS: STATIC_ITEM(MSG_MOVE_X, SS_DEFAULT|SS_INVERT); break; - case Y_AXIS: STATIC_ITEM(MSG_MOVE_Y, SS_DEFAULT|SS_INVERT); break; - case Z_AXIS: STATIC_ITEM(MSG_MOVE_Z, SS_DEFAULT|SS_INVERT); break; - default: - TERN_(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin = current_position.e); - STATIC_ITEM(MSG_MOVE_E, SS_DEFAULT|SS_INVERT); - break; - } - } - - BACK_ITEM(MSG_MOVE_AXIS); - SUBMENU(MSG_MOVE_10MM, []{ _goto_manual_move(10); }); - SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); }); - SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); }); - if (axis == Z_AXIS && (SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - // Determine digits needed right of decimal - constexpr uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - PGM_P const label = GET_TEXT(MSG_MOVE_Z_DIST); - char tmp[strlen_P(label) + 10 + 1], numstr[10]; - sprintf_P(tmp, label, dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); - - #if DISABLED(HAS_GRAPHICAL_TFT) - extern const char NUL_STR[]; - SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); - lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); - #else - SUBMENU_P(tmp, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); - #endif - } - END_MENU(); -} - -#if E_MANUAL - - inline void _goto_menu_move_distance_e() { - ui.goto_screen([]{ _menu_move_distance(E_AXIS, []{ lcd_move_e(); }, -1); }); - } - - inline void _menu_move_distance_e_maybe() { - #if ENABLED(PREVENT_COLD_EXTRUSION) - const bool too_cold = thermalManager.tooColdToExtrude(active_extruder); - if (too_cold) { - ui.goto_screen([]{ - MenuItem_confirm::select_screen( - GET_TEXT(MSG_BUTTON_PROCEED), GET_TEXT(MSG_BACK), - _goto_menu_move_distance_e, ui.goto_previous_screen, - GET_TEXT(MSG_HOTEND_TOO_COLD), (const char *)nullptr, PSTR("!") - ); - }); - return; - } - #endif - _goto_menu_move_distance_e(); - } - -#endif // E_MANUAL - -void menu_move() { - START_MENU(); - BACK_ITEM(MSG_MOTION); - - #if BOTH(HAS_SOFTWARE_ENDSTOPS, SOFT_ENDSTOPS_MENU_ITEM) - EDIT_ITEM(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstop._enabled); - #endif - - if (NONE(IS_KINEMATIC, NO_MOTION_BEFORE_HOMING) || all_axes_homed()) { - if (TERN1(DELTA, current_position.z <= delta_clip_start_height)) { - SUBMENU(MSG_MOVE_X, []{ _menu_move_distance(X_AXIS, lcd_move_x); }); - SUBMENU(MSG_MOVE_Y, []{ _menu_move_distance(Y_AXIS, lcd_move_y); }); - } - #if ENABLED(DELTA) - else - ACTION_ITEM(MSG_FREE_XY, []{ line_to_z(delta_clip_start_height); ui.synchronize(); }); - #endif - - SUBMENU(MSG_MOVE_Z, []{ _menu_move_distance(Z_AXIS, lcd_move_z); }); - } - else - GCODES_ITEM(MSG_AUTO_HOME, G28_STR); - - #if ANY(SWITCHING_EXTRUDER, SWITCHING_NOZZLE, MAGNETIC_SWITCHING_TOOLHEAD) - - #if EXTRUDERS >= 4 - switch (active_extruder) { - case 0: GCODES_ITEM_N(1, MSG_SELECT_E, PSTR("T1")); break; - case 1: GCODES_ITEM_N(0, MSG_SELECT_E, PSTR("T0")); break; - case 2: GCODES_ITEM_N(3, MSG_SELECT_E, PSTR("T3")); break; - case 3: GCODES_ITEM_N(2, MSG_SELECT_E, PSTR("T2")); break; - #if EXTRUDERS == 6 - case 4: GCODES_ITEM_N(5, MSG_SELECT_E, PSTR("T5")); break; - case 5: GCODES_ITEM_N(4, MSG_SELECT_E, PSTR("T4")); break; - #endif - } - #elif EXTRUDERS == 3 - if (active_extruder < 2) { - if (active_extruder) - GCODES_ITEM_N(0, MSG_SELECT_E, PSTR("T0")); - else - GCODES_ITEM_N(1, MSG_SELECT_E, PSTR("T1")); - } - #else - if (active_extruder) - GCODES_ITEM_N(0, MSG_SELECT_E, PSTR("T0")); - else - GCODES_ITEM_N(1, MSG_SELECT_E, PSTR("T1")); - #endif - - #elif ENABLED(DUAL_X_CARRIAGE) - - if (active_extruder) - GCODES_ITEM_N(0, MSG_SELECT_E, PSTR("T0")); - else - GCODES_ITEM_N(1, MSG_SELECT_E, PSTR("T1")); - - #endif - - #if E_MANUAL - - // The current extruder - SUBMENU(MSG_MOVE_E, []{ _menu_move_distance_e_maybe(); }); - - #define SUBMENU_MOVE_E(N) SUBMENU_N(N, MSG_MOVE_EN, []{ _menu_move_distance(E_AXIS, []{ lcd_move_e(MenuItemBase::itemIndex); }, MenuItemBase::itemIndex); }); - - #if EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE) - - // ...and the non-switching - #if E_MANUAL == 7 || E_MANUAL == 5 || E_MANUAL == 3 - SUBMENU_MOVE_E(E_MANUAL - 1); - #endif - - #elif MULTI_MANUAL - - // Independent extruders with one E-stepper per hotend - LOOP_L_N(n, E_MANUAL) SUBMENU_MOVE_E(n); - - #endif - - #endif // E_MANUAL - - END_MENU(); -} - -#if ENABLED(AUTO_BED_LEVELING_UBL) - void _lcd_ubl_level_bed(); -#elif ENABLED(LCD_BED_LEVELING) - void menu_bed_leveling(); -#endif - -void menu_motion() { - START_MENU(); - - // - // ^ Main - // - BACK_ITEM(MSG_MAIN); - - // - // Move Axis - // - if (TERN1(DELTA, all_axes_homed())) - SUBMENU(MSG_MOVE_AXIS, menu_move); - - // - // Auto Home - // - GCODES_ITEM(MSG_AUTO_HOME, G28_STR); - #if ENABLED(INDIVIDUAL_AXIS_HOMING_MENU) - GCODES_ITEM(MSG_AUTO_HOME_X, PSTR("G28X")); - GCODES_ITEM(MSG_AUTO_HOME_Y, PSTR("G28Y")); - GCODES_ITEM(MSG_AUTO_HOME_Z, PSTR("G28Z")); - #endif - - // - // Auto-calibration - // - #if ENABLED(CALIBRATION_GCODE) - GCODES_ITEM(MSG_AUTO_CALIBRATE, PSTR("G425")); - #endif - - // - // Auto Z-Align - // - #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) - GCODES_ITEM(MSG_AUTO_Z_ALIGN, PSTR("G34")); - #endif - - // - // Assisted Bed Tramming - // - #if ENABLED(ASSISTED_TRAMMING_MENU_ITEM) - GCODES_ITEM(MSG_ASSISTED_TRAMMING, PSTR("G35")); - #endif - - // - // Level Bed - // - #if ENABLED(AUTO_BED_LEVELING_UBL) - - SUBMENU(MSG_UBL_LEVEL_BED, _lcd_ubl_level_bed); - - #elif ENABLED(LCD_BED_LEVELING) - - if (!g29_in_progress) - SUBMENU(MSG_BED_LEVELING, menu_bed_leveling); - - #elif HAS_LEVELING && DISABLED(SLIM_LCD_MENUS) - - #if DISABLED(PROBE_MANUALLY) - GCODES_ITEM(MSG_LEVEL_BED, PSTR("G28\nG29")); - #endif - - if (all_axes_homed() && leveling_is_valid()) { - bool show_state = planner.leveling_active; - EDIT_ITEM(bool, MSG_BED_LEVELING, &show_state, _lcd_toggle_bed_leveling); - } - - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - editable.decimal = planner.z_fade_height; - EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); }); - #endif - - #endif - - #if ENABLED(LEVEL_BED_CORNERS) && DISABLED(LCD_BED_LEVELING) - ACTION_ITEM(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); - #endif - - #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) - GCODES_ITEM(MSG_M48_TEST, PSTR("G28 O\nM48 P10")); - #endif - - // - // Disable Steppers - // - GCODES_ITEM(MSG_DISABLE_STEPPERS, PSTR("M84")); - - END_MENU(); -} - -#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp deleted file mode 100644 index c3924b5686..0000000000 --- a/Marlin/src/lcd/menu/menu_password.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Advanced Settings Menus -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, PASSWORD_FEATURE) - -#include "../../feature/password/password.h" - -#include "menu_item.h" -#include "menu_addon.h" - -void menu_advanced_settings(); - -screenFunc_t success_screen, fail_screen; -bool authenticating; // = false -char string[(PASSWORD_LENGTH) + 1]; -static uint8_t digit_no; - -// -// Screen for both editing and setting the password -// -void Password::menu_password_entry() { - START_MENU(); - - // "Login" or "New Code" - STATIC_ITEM_P(authenticating ? GET_TEXT(MSG_LOGIN_REQUIRED) : GET_TEXT(MSG_EDIT_PASSWORD), SS_CENTER|SS_INVERT); - - STATIC_ITEM_P(PSTR(""), SS_CENTER|SS_INVERT, string); - - // Make the digit edit item look like a sub-menu - PGM_P const label = GET_TEXT(MSG_ENTER_DIGIT); - EDIT_ITEM_P(uint8, label, &editable.uint8, 0, 9, digit_entered); - MENU_ITEM_ADDON_START(utf8_strlen_P(label) + 1); - lcd_put_wchar(' '); - lcd_put_wchar('1' + digit_no); - SETCURSOR_X(LCD_WIDTH - 1); - lcd_put_wchar('>'); - MENU_ITEM_ADDON_END(); - - ACTION_ITEM(MSG_START_OVER, start_over); - - if (!authenticating) BACK_ITEM(MSG_BUTTON_CANCEL); - - END_MENU(); -} - -// -// Authentication check -// -void Password::authentication_done() { - ui.goto_screen(is_locked ? fail_screen : success_screen); - ui.completion_feedback(!is_locked); -} - -// A single digit was completed -void Password::digit_entered() { - uint32_t multiplier = CAT(1e, PASSWORD_LENGTH); // 1e5 = 100000 - LOOP_LE_N(i, digit_no) multiplier /= 10; - value_entry += editable.uint8 * multiplier; - string[digit_no++] = '0' + editable.uint8; - - // Exit edit screen menu and go to another screen - ui.goto_previous_screen(); - ui.use_click(); - ui.goto_screen(menu_password_entry); - - // After password has been keyed in - if (digit_no == PASSWORD_LENGTH) { - if (authenticating) - authentication_check(); - else - set_password_done(); - } -} - -// -// Set/Change Password -// -void Password::screen_password_entry() { - value_entry = 0; - digit_no = 0; - editable.uint8 = 0; - memset(string, '-', PASSWORD_LENGTH); - string[PASSWORD_LENGTH] = '\0'; - menu_password_entry(); -} - -void Password::screen_set_password() { - authenticating = false; - screen_password_entry(); -} - -void Password::authenticate_user(const screenFunc_t in_succ_scr, const screenFunc_t in_fail_scr) { - success_screen = in_succ_scr; - fail_screen = in_fail_scr; - if (is_set) { - authenticating = true; - ui.goto_screen(screen_password_entry); - ui.defer_status_screen(); - ui.update(); - } - else { - ui.goto_screen(in_succ_scr); - is_locked = false; - } -} - -void Password::access_menu_password() { - authenticate_user(menu_password, menu_advanced_settings); -} - -#if ENABLED(PASSWORD_ON_SD_PRINT_MENU) - void Password::media_gatekeeper() { - authenticate_user(menu_media, menu_main); - } -#endif - -void Password::start_over() { - ui.goto_previous_screen(); // Goto previous screen, if any - ui.goto_screen(screen_password_entry); -} - -void Password::menu_password_report() { - START_SCREEN(); - BACK_ITEM(MSG_PASSWORD_SETTINGS); - STATIC_ITEM(MSG_PASSWORD_SET, SS_LEFT, string); - STATIC_ITEM(MSG_REMINDER_SAVE_SETTINGS, SS_LEFT); - END_SCREEN(); -} - -void Password::set_password_done() { - is_set = true; - value = value_entry; - ui.completion_feedback(true); - ui.goto_screen(menu_password_report); -} - -void Password::remove_password() { - is_set = false; - string[0] = '0'; - string[1] = '\0'; - ui.completion_feedback(true); - ui.goto_screen(menu_password_report); -} - -// -// Password Menu -// -void Password::menu_password() { - START_MENU(); - BACK_ITEM(MSG_ADVANCED_SETTINGS); - SUBMENU(MSG_CHANGE_PASSWORD, screen_set_password); - ACTION_ITEM(MSG_REMOVE_PASSWORD, []{ ui.save_previous_screen(); remove_password(); } ); - #if ENABLED(EEPROM_SETTINGS) - ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); - #endif - END_MENU(); -} - -#endif // HAS_LCD_MENU && PASSWORD_FEATURE diff --git a/Marlin/src/lcd/menu/menu_power_monitor.cpp b/Marlin/src/lcd/menu/menu_power_monitor.cpp deleted file mode 100644 index e88bdb28d8..0000000000 --- a/Marlin/src/lcd/menu/menu_power_monitor.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Power Monitor Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU && HAS_POWER_MONITOR - -#include "menu_item.h" -#include "../../feature/power_monitor.h" - -void menu_power_monitor() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - - #if ENABLED(POWER_MONITOR_CURRENT) - { - bool ena = power_monitor.current_display_enabled(); - EDIT_ITEM(bool, MSG_CURRENT, &ena, power_monitor.toggle_current_display); - } - #endif - - #if HAS_POWER_MONITOR_VREF - { - bool ena = power_monitor.voltage_display_enabled(); - EDIT_ITEM(bool, MSG_VOLTAGE, &ena, power_monitor.toggle_voltage_display); - } - #endif - - #if HAS_POWER_MONITOR_WATTS - { - bool ena = power_monitor.power_display_enabled(); - EDIT_ITEM(bool, MSG_POWER, &ena, power_monitor.toggle_power_display); - } - #endif - - END_MENU(); -} - -#endif // HAS_LCD_MENU && HAS_POWER_MONITOR diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp deleted file mode 100644 index 6b7830b853..0000000000 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Calibrate Probe offset menu. -// - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(PROBE_OFFSET_WIZARD) - -#ifndef PROBE_OFFSET_START - #error "PROBE_OFFSET_WIZARD requires a PROBE_OFFSET_START with a negative value." -#else - static_assert(PROBE_OFFSET_START < 0, "PROBE_OFFSET_START must be < 0. Please update your configuration."); -#endif - -#include "menu_item.h" -#include "menu_addon.h" -#include "../../module/motion.h" -#include "../../module/planner.h" -#include "../../module/probe.h" - -#if HAS_LEVELING - #include "../../feature/bedlevel/bedlevel.h" -#endif - -// Global storage -float z_offset_backup, calculated_z_offset; - -TERN_(HAS_LEVELING, bool leveling_was_active); - -void prepare_for_calibration() { - z_offset_backup = probe.offset.z; - - // Disable soft endstops for free Z movement - SET_SOFT_ENDSTOP_LOOSE(true); - - // Disable leveling for raw planner motion - #if HAS_LEVELING - leveling_was_active = planner.leveling_active; - set_bed_leveling_enabled(false); - #endif -} - -void set_offset_and_go_back(const float &z) { - probe.offset.z = z; - SET_SOFT_ENDSTOP_LOOSE(false); - TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); - ui.goto_previous_screen_no_defer(); -} - -void _goto_manual_move_z(const float scale) { - ui.manual_move.menu_scale = scale; - ui.goto_screen(lcd_move_z); -} - -void probe_offset_wizard_menu() { - START_MENU(); - calculated_z_offset = probe.offset.z + current_position.z; - - if (LCD_HEIGHT >= 4) - STATIC_ITEM(MSG_MOVE_NOZZLE_TO_BED, SS_CENTER|SS_INVERT); - - STATIC_ITEM_P(PSTR("Z="), SS_CENTER, ftostr42_52(current_position.z)); - STATIC_ITEM(MSG_ZPROBE_ZOFFSET, SS_LEFT, ftostr42_52(calculated_z_offset)); - - SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move_z( 1); }); - SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move_z( 0.1f); }); - - if ((SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { - extern const char NUL_STR[]; - SUBMENU_P(NUL_STR, []{ _goto_manual_move_z(float(SHORT_MANUAL_Z_MOVE)); }); - MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); - char tmp[20], numstr[10]; - // Determine digits needed right of decimal - const uint8_t digs = !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 1000 - int((SHORT_MANUAL_Z_MOVE) * 1000)) ? 4 : - !UNEAR_ZERO((SHORT_MANUAL_Z_MOVE) * 100 - int((SHORT_MANUAL_Z_MOVE) * 100)) ? 3 : 2; - sprintf_P(tmp, GET_TEXT(MSG_MOVE_Z_DIST), dtostrf(SHORT_MANUAL_Z_MOVE, 1, digs, numstr)); - lcd_put_u8str(tmp); - MENU_ITEM_ADDON_END(); - } - - ACTION_ITEM(MSG_BUTTON_DONE, []{ - set_offset_and_go_back(calculated_z_offset); - do_z_clearance(20.0 - #ifdef Z_AFTER_HOMING - - 20.0 + Z_AFTER_HOMING - #endif - ); - }); - - ACTION_ITEM(MSG_BUTTON_CANCEL, []{ - set_offset_and_go_back(z_offset_backup); - }); - - END_MENU(); -} - -void goto_probe_offset_wizard() { - ui.defer_status_screen(); - - prepare_for_calibration(); - - probe.offset.z = PROBE_OFFSET_START; - - set_all_unhomed(); - queue.inject_P(G28_STR); - - ui.goto_screen([]{ - _lcd_draw_homing(); - if (all_axes_homed()) { - ui.goto_screen(probe_offset_wizard_menu); - ui.defer_status_screen(); - } - }); -} - -#endif // PROBE_OFFSET_WIZARD diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp deleted file mode 100644 index 04b999eaf6..0000000000 --- a/Marlin/src/lcd/menu/menu_spindle_laser.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Spindle / Laser Menu -// - -#include "../../inc/MarlinConfig.h" - -#if HAS_LCD_MENU && HAS_CUTTER - - #include "menu_item.h" - - #include "../../feature/spindle_laser.h" - - void menu_spindle_laser() { - - const bool is_enabled = cutter.enabled() && cutter.isReady; - - START_MENU(); - BACK_ITEM(MSG_MAIN); - - #if ENABLED(SPINDLE_LASER_PWM) - // Change the cutter's "current power" value without turning the cutter on or off - // Power is displayed and set in units and range according to CUTTER_POWER_UNIT - EDIT_ITEM_FAST(CUTTER_MENU_POWER_TYPE, MSG_CUTTER(POWER), &cutter.menuPower, - cutter.mpower_min(), cutter.mpower_max(), cutter.update_from_mpower); - #endif - - if (is_enabled) - ACTION_ITEM(MSG_CUTTER(OFF), cutter.disable); - else { - ACTION_ITEM(MSG_CUTTER(ON), cutter.enable_forward); - #if ENABLED(SPINDLE_CHANGE_DIR) - ACTION_ITEM(MSG_SPINDLE_REVERSE, cutter.enable_reverse); - #endif - } - - #if ENABLED(MARLIN_DEV_MODE) - #if ENABLED(HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) - EDIT_ITEM_FAST(CUTTER_MENU_FREQUENCY_TYPE, MSG_CUTTER_FREQUENCY, &cutter.frequency, 2000, 50000, cutter.refresh_frequency); - #endif - #endif - END_MENU(); - } - -#endif // HAS_LCD_MENU && HAS_CUTTER diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp deleted file mode 100644 index 0c70cd7e18..0000000000 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Temperature Menu -// - -#include "../../inc/MarlinConfig.h" - -#if HAS_LCD_MENU && HAS_TEMPERATURE - -#include "menu_item.h" -#include "../../module/temperature.h" - -#if FAN_COUNT > 1 || ENABLED(SINGLENOZZLE) - #include "../../module/motion.h" -#endif - -#if ENABLED(SINGLENOZZLE) - #include "../../module/tool_change.h" -#endif - -// -// "Temperature" submenu items -// - -void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb) { - #if HAS_HOTEND - if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) - setTargetHotend(_MIN(thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, ui.material_preset[indh].hotend_temp), e); - #else - UNUSED(e); UNUSED(indh); - #endif - #if HAS_HEATED_BED - if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); - #else - UNUSED(indb); - #endif - #if HAS_FAN - set_fan_speed(( - #if FAN_COUNT > 1 - active_extruder < FAN_COUNT ? active_extruder : - #endif - 0), ui.material_preset[indh].fan_speed - ); - #endif - ui.return_to_status(); -} - -#if PREHEAT_COUNT - - #if HAS_TEMP_HOTEND - inline void _preheat_end(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } - #if HAS_HEATED_BED - inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } - #endif - #endif - #if HAS_HEATED_BED - inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(-1, -1, m); } - #endif - - #if HAS_TEMP_HOTEND && HAS_HEATED_BED - - // Indexed "Preheat ABC" and "Heat Bed" items - #define PREHEAT_ITEMS(M,E) do{ \ - ACTION_ITEM_N_S(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_both(M, MenuItemBase::itemIndex); }); \ - ACTION_ITEM_N_S(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ - }while(0) - - #elif HAS_MULTI_HOTEND - - // No heated bed, so just indexed "Preheat ABC" items - #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_S(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(M, MenuItemBase::itemIndex); }) - - #endif - - void do_preheat_end_m() { _preheat_end(editable.int8, 0); } - - #if HAS_MULTI_HOTEND || HAS_HEATED_BED - - // Set editable.int8 to the Material index before entering this menu - // because MenuItemBase::itemIndex will be re-used by PREHEAT_ITEMS - void menu_preheat_m() { - const uint8_t m = editable.int8; // Don't re-use 'editable' in this menu - - START_MENU(); - BACK_ITEM(MSG_TEMPERATURE); - - #if HOTENDS == 1 - - #if HAS_HEATED_BED - ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_both(editable.int8, 0); }); - ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_END, do_preheat_end_m); - #else - ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); - #endif - - #elif HAS_MULTI_HOTEND - - HOTEND_LOOP() PREHEAT_ITEMS(editable.int8, e); - ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_ALL, []() { - TERN_(HAS_HEATED_BED, []{ _preheat_bed(editable.int8); }); - HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[editable.int8].hotend_temp, e); - }); - - #endif - - #if HAS_HEATED_BED - ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_BEDONLY, []{ _preheat_bed(editable.int8); }); - #endif - - END_MENU(); - } - - #endif // HAS_MULTI_HOTEND || HAS_HEATED_BED - -#endif // PREHEAT_COUNT - -#if HAS_TEMP_HOTEND || HAS_HEATED_BED - - void lcd_cooldown() { - thermalManager.zero_fan_speeds(); - thermalManager.disable_all_heaters(); - ui.return_to_status(); - } - -#endif // HAS_TEMP_HOTEND || HAS_HEATED_BED - -void menu_temperature() { - #if HAS_TEMP_HOTEND || HAS_HEATED_BED - bool has_heat = false; - #if HAS_TEMP_HOTEND - HOTEND_LOOP() if (thermalManager.temp_hotend[HOTEND_INDEX].target) { has_heat = true; break; } - #endif - #endif - - START_MENU(); - BACK_ITEM(MSG_MAIN); - - // - // Nozzle: - // Nozzle [1-5]: - // - #if HOTENDS == 1 - EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - (HOTEND_OVERSHOOT), []{ thermalManager.start_watching_hotend(0); }); - #elif HAS_MULTI_HOTEND - HOTEND_LOOP() - EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.heater_maxtemp[e] - (HOTEND_OVERSHOOT), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); - #endif - - #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - LOOP_S_L_N(e, 1, EXTRUDERS) - EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - (HOTEND_OVERSHOOT)); - #endif - - // - // Bed: - // - #if HAS_HEATED_BED - EDIT_ITEM_FAST(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed); - #endif - - // - // Chamber: - // - #if HAS_HEATED_CHAMBER - EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); - #endif - - // - // Fan Speed: - // - #if HAS_FAN - - DEFINE_SINGLENOZZLE_ITEM(); - - #if HAS_FAN0 - _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); - #endif - #if HAS_FAN1 - FAN_EDIT_ITEMS(1); - #elif SNFAN(1) - singlenozzle_item(1); - #endif - #if HAS_FAN2 - FAN_EDIT_ITEMS(2); - #elif SNFAN(2) - singlenozzle_item(2); - #endif - #if HAS_FAN3 - FAN_EDIT_ITEMS(3); - #elif SNFAN(3) - singlenozzle_item(3); - #endif - #if HAS_FAN4 - FAN_EDIT_ITEMS(4); - #elif SNFAN(4) - singlenozzle_item(4); - #endif - #if HAS_FAN5 - FAN_EDIT_ITEMS(5); - #elif SNFAN(5) - singlenozzle_item(5); - #endif - #if HAS_FAN6 - FAN_EDIT_ITEMS(6); - #elif SNFAN(6) - singlenozzle_item(6); - #endif - #if HAS_FAN7 - FAN_EDIT_ITEMS(7); - #elif SNFAN(7) - singlenozzle_item(7); - #endif - - #endif // HAS_FAN - - #if PREHEAT_COUNT - // - // Preheat for Materials 1 to 5 - // - LOOP_L_N(m, PREHEAT_COUNT) { - editable.int8 = m; - #if HOTENDS > 1 || HAS_HEATED_BED - SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); - #else - ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); - #endif - } - #endif - - #if HAS_TEMP_HOTEND || HAS_HEATED_BED - // - // Cooldown - // - if (TERN0(HAS_HEATED_BED, thermalManager.temp_bed.target)) has_heat = true; - if (has_heat) ACTION_ITEM(MSG_COOLDOWN, lcd_cooldown); - #endif - - END_MENU(); -} - -#endif // HAS_LCD_MENU && HAS_TEMPERATURE diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp deleted file mode 100644 index 402ee41a1b..0000000000 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// TMC Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU && HAS_TRINAMIC_CONFIG - -#include "menu_item.h" -#include "../../module/stepper/indirection.h" -#include "../../feature/tmc_util.h" - -#define TMC_EDIT_STORED_I_RMS(ST,STR) EDIT_ITEM_P(uint16_4, PSTR(STR), &stepper##ST.val_mA, 100, 3000, []{ stepper##ST.refresh_stepper_current(); }) - -void menu_tmc_current() { - START_MENU(); - BACK_ITEM(MSG_TMC_DRIVERS); - #if AXIS_IS_TMC(X) - TMC_EDIT_STORED_I_RMS(X, STR_X); - #endif - #if AXIS_IS_TMC(Y) - TMC_EDIT_STORED_I_RMS(Y, STR_Y); - #endif - #if AXIS_IS_TMC(Z) - TMC_EDIT_STORED_I_RMS(Z, STR_Z); - #endif - #if AXIS_IS_TMC(X2) - TMC_EDIT_STORED_I_RMS(X2, STR_X2); - #endif - #if AXIS_IS_TMC(Y2) - TMC_EDIT_STORED_I_RMS(Y2, STR_Y2); - #endif - #if AXIS_IS_TMC(Z2) - TMC_EDIT_STORED_I_RMS(Z2, STR_Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_EDIT_STORED_I_RMS(Z3, STR_Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_EDIT_STORED_I_RMS(Z4, STR_Z4); - #endif - #if AXIS_IS_TMC(E0) - TMC_EDIT_STORED_I_RMS(E0, LCD_STR_E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_EDIT_STORED_I_RMS(E1, LCD_STR_E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_EDIT_STORED_I_RMS(E2, LCD_STR_E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_EDIT_STORED_I_RMS(E3, LCD_STR_E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_EDIT_STORED_I_RMS(E4, LCD_STR_E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_EDIT_STORED_I_RMS(E5, LCD_STR_E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_EDIT_STORED_I_RMS(E6, LCD_STR_E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_EDIT_STORED_I_RMS(E7, LCD_STR_E7); - #endif - END_MENU(); -} - -#if ENABLED(HYBRID_THRESHOLD) - - #define TMC_EDIT_STORED_HYBRID_THRS(ST, STR) EDIT_ITEM_P(uint8, PSTR(STR), &stepper##ST.stored.hybrid_thrs, 0, 255, []{ stepper##ST.refresh_hybrid_thrs(); }); - - void menu_tmc_hybrid_thrs() { - START_MENU(); - BACK_ITEM(MSG_TMC_DRIVERS); - #if AXIS_HAS_STEALTHCHOP(X) - TMC_EDIT_STORED_HYBRID_THRS(X, STR_X); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - TMC_EDIT_STORED_HYBRID_THRS(Y, STR_Y); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - TMC_EDIT_STORED_HYBRID_THRS(Z, STR_Z); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - TMC_EDIT_STORED_HYBRID_THRS(X2, STR_X2); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - TMC_EDIT_STORED_HYBRID_THRS(Y2, STR_Y2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - TMC_EDIT_STORED_HYBRID_THRS(Z2, STR_Z2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - TMC_EDIT_STORED_HYBRID_THRS(Z3, STR_Z3); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - TMC_EDIT_STORED_HYBRID_THRS(Z4, STR_Z4); - #endif - #if AXIS_HAS_STEALTHCHOP(E0) - TMC_EDIT_STORED_HYBRID_THRS(E0, LCD_STR_E0); - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - TMC_EDIT_STORED_HYBRID_THRS(E1, LCD_STR_E1); - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - TMC_EDIT_STORED_HYBRID_THRS(E2, LCD_STR_E2); - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - TMC_EDIT_STORED_HYBRID_THRS(E3, LCD_STR_E3); - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - TMC_EDIT_STORED_HYBRID_THRS(E4, LCD_STR_E4); - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - TMC_EDIT_STORED_HYBRID_THRS(E5, LCD_STR_E5); - #endif - #if AXIS_HAS_STEALTHCHOP(E6) - TMC_EDIT_STORED_HYBRID_THRS(E6, LCD_STR_E6); - #endif - #if AXIS_HAS_STEALTHCHOP(E7) - TMC_EDIT_STORED_HYBRID_THRS(E7, LCD_STR_E7); - #endif - END_MENU(); - } - -#endif - -#if ENABLED(SENSORLESS_HOMING) - - #define TMC_EDIT_STORED_SGT(ST) EDIT_ITEM_P(int4, PSTR(STR_##ST), &stepper##ST.stored.homing_thrs, stepper##ST.sgt_min, stepper##ST.sgt_max, []{ stepper##ST.refresh_homing_thrs(); }); - - void menu_tmc_homing_thrs() { - START_MENU(); - BACK_ITEM(MSG_TMC_DRIVERS); - #if X_SENSORLESS - TMC_EDIT_STORED_SGT(X); - #if X2_SENSORLESS - TMC_EDIT_STORED_SGT(X2); - #endif - #endif - #if Y_SENSORLESS - TMC_EDIT_STORED_SGT(Y); - #if Y2_SENSORLESS - TMC_EDIT_STORED_SGT(Y2); - #endif - #endif - #if Z_SENSORLESS - TMC_EDIT_STORED_SGT(Z); - #if Z2_SENSORLESS - TMC_EDIT_STORED_SGT(Z2); - #endif - #if Z3_SENSORLESS - TMC_EDIT_STORED_SGT(Z3); - #endif - #if Z4_SENSORLESS - TMC_EDIT_STORED_SGT(Z4); - #endif - #endif - END_MENU(); - } - -#endif - -#if HAS_STEALTHCHOP - - #define TMC_EDIT_STEP_MODE(ST, STR) EDIT_ITEM_P(bool, PSTR(STR), &stepper##ST.stored.stealthChop_enabled, []{ stepper##ST.refresh_stepping_mode(); }) - - void menu_tmc_step_mode() { - START_MENU(); - STATIC_ITEM(MSG_TMC_STEALTH_ENABLED); - BACK_ITEM(MSG_TMC_DRIVERS); - #if AXIS_HAS_STEALTHCHOP(X) - TMC_EDIT_STEP_MODE(X, STR_X); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - TMC_EDIT_STEP_MODE(Y, STR_Y); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - TMC_EDIT_STEP_MODE(Z, STR_Z); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - TMC_EDIT_STEP_MODE(X2, STR_X2); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - TMC_EDIT_STEP_MODE(Y2, STR_Y2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - TMC_EDIT_STEP_MODE(Z2, STR_Z2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - TMC_EDIT_STEP_MODE(Z3, STR_Z3); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - TMC_EDIT_STEP_MODE(Z4, STR_Z4); - #endif - #if AXIS_HAS_STEALTHCHOP(E0) - TMC_EDIT_STEP_MODE(E0, LCD_STR_E0); - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - TMC_EDIT_STEP_MODE(E1, LCD_STR_E1); - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - TMC_EDIT_STEP_MODE(E2, LCD_STR_E2); - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - TMC_EDIT_STEP_MODE(E3, LCD_STR_E3); - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - TMC_EDIT_STEP_MODE(E4, LCD_STR_E4); - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - TMC_EDIT_STEP_MODE(E5, LCD_STR_E5); - #endif - #if AXIS_HAS_STEALTHCHOP(E6) - TMC_EDIT_STEP_MODE(E6, LCD_STR_E6); - #endif - #if AXIS_HAS_STEALTHCHOP(E7) - TMC_EDIT_STEP_MODE(E7, LCD_STR_E7); - #endif - END_MENU(); - } - -#endif - -void menu_tmc() { - START_MENU(); - BACK_ITEM(MSG_CONTROL); - SUBMENU(MSG_TMC_CURRENT, menu_tmc_current); - #if ENABLED(HYBRID_THRESHOLD) - SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs); - #endif - #if ENABLED(SENSORLESS_HOMING) - SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs); - #endif - #if HAS_STEALTHCHOP - SUBMENU(MSG_TMC_STEPPING_MODE, menu_tmc_step_mode); - #endif - END_MENU(); -} - -#endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp deleted file mode 100644 index 96eae2298e..0000000000 --- a/Marlin/src/lcd/menu/menu_touch_screen.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) - -#include "menu_item.h" -#include "../ultralcd.h" - -void touch_screen_calibration() { - - ui.touch_calibration(); - -} - -#endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp deleted file mode 100644 index 6bf5c3a15d..0000000000 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Tune Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_LCD_MENU - -#include "menu_item.h" -#include "../../module/motion.h" -#include "../../module/planner.h" -#include "../../module/temperature.h" -#include "../../MarlinCore.h" - -#if HAS_LEVELING - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#if ENABLED(SINGLENOZZLE) - #include "../../module/tool_change.h" -#endif - -#if ENABLED(BABYSTEPPING) - - #include "../../feature/babystep.h" - #include "../lcdprint.h" - #if HAS_MARLINUI_U8GLIB - #include "../dogm/ultralcd_DOGM.h" - #endif - - void _lcd_babystep(const AxisEnum axis, PGM_P const msg) { - if (ui.use_click()) return ui.goto_previous_screen_no_defer(); - if (ui.encoderPosition) { - const int16_t steps = int16_t(ui.encoderPosition) * ( - #if ENABLED(BABYSTEP_XY) - axis == X_AXIS ? BABYSTEP_SIZE_X : - axis == Y_AXIS ? BABYSTEP_SIZE_Y : - #endif - BABYSTEP_SIZE_Z - ); - ui.encoderPosition = 0; - ui.refresh(LCDVIEW_REDRAW_NOW); - babystep.add_steps(axis, steps); - } - if (ui.should_draw()) { - const float spm = planner.steps_to_mm[axis]; - MenuEditItemBase::draw_edit_screen(msg, BABYSTEP_TO_STR(spm * babystep.accum)); - #if ENABLED(BABYSTEP_DISPLAY_TOTAL) - const bool in_view = TERN1(HAS_MARLINUI_U8GLIB, PAGE_CONTAINS(LCD_PIXEL_HEIGHT - MENU_FONT_HEIGHT, LCD_PIXEL_HEIGHT - 1)); - if (in_view) { - TERN_(HAS_MARLINUI_U8GLIB, ui.set_font(FONT_MENU)); - lcd_moveto(0, TERN(HAS_MARLINUI_U8GLIB, LCD_PIXEL_HEIGHT - MENU_FONT_DESCENT, LCD_HEIGHT - 1)); - lcd_put_u8str_P(GET_TEXT(MSG_BABYSTEP_TOTAL)); - lcd_put_wchar(':'); - lcd_put_u8str(BABYSTEP_TO_STR(spm * babystep.axis_total[BS_TOTAL_IND(axis)])); - } - #endif - } - } - - inline void _lcd_babystep_go(const screenFunc_t screen) { - ui.goto_screen(screen); - ui.defer_status_screen(); - babystep.accum = 0; - } - - #if ENABLED(BABYSTEP_XY) - void _lcd_babystep_x() { _lcd_babystep(X_AXIS, GET_TEXT(MSG_BABYSTEP_X)); } - void _lcd_babystep_y() { _lcd_babystep(Y_AXIS, GET_TEXT(MSG_BABYSTEP_Y)); } - #endif - - #if DISABLED(BABYSTEP_ZPROBE_OFFSET) - void _lcd_babystep_z() { _lcd_babystep(Z_AXIS, GET_TEXT(MSG_BABYSTEP_Z)); } - void lcd_babystep_z() { _lcd_babystep_go(_lcd_babystep_z); } - #endif - -#endif // BABYSTEPPING - -void menu_tune() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - - // - // Speed: - // - EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999); - - // - // Manual bed leveling, Bed Z: - // - #if BOTH(MESH_BED_LEVELING, LCD_BED_LEVELING) - EDIT_ITEM(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); - #endif - - // - // Nozzle: - // Nozzle [1-4]: - // - #if HOTENDS == 1 - EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT, []{ thermalManager.start_watching_hotend(0); }); - #elif HAS_MULTI_HOTEND - HOTEND_LOOP() - EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); - #endif - - #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - LOOP_S_L_N(e, 1, EXTRUDERS) - EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - HOTEND_OVERSHOOT); - #endif - - // - // Bed: - // - #if HAS_HEATED_BED - EDIT_ITEM_FAST(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed); - #endif - - // - // Fan Speed: - // - #if HAS_FAN - - DEFINE_SINGLENOZZLE_ITEM(); - - #if HAS_FAN0 - _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); - #endif - #if HAS_FAN1 - FAN_EDIT_ITEMS(1); - #elif SNFAN(1) - singlenozzle_item(1); - #endif - #if HAS_FAN2 - FAN_EDIT_ITEMS(2); - #elif SNFAN(2) - singlenozzle_item(2); - #endif - #if HAS_FAN3 - FAN_EDIT_ITEMS(3); - #elif SNFAN(3) - singlenozzle_item(3); - #endif - #if HAS_FAN4 - FAN_EDIT_ITEMS(4); - #elif SNFAN(4) - singlenozzle_item(4); - #endif - #if HAS_FAN5 - FAN_EDIT_ITEMS(5); - #elif SNFAN(5) - singlenozzle_item(5); - #endif - #if HAS_FAN6 - FAN_EDIT_ITEMS(6); - #elif SNFAN(6) - singlenozzle_item(6); - #endif - #if HAS_FAN7 - FAN_EDIT_ITEMS(7); - #elif SNFAN(7) - singlenozzle_item(7); - #endif - - #endif // HAS_FAN - - // - // Flow: - // - #if EXTRUDERS - EDIT_ITEM(int3, MSG_FLOW, &planner.flow_percentage[active_extruder], 10, 999, []{ planner.refresh_e_factor(active_extruder); }); - // Flow En: - #if HAS_MULTI_EXTRUDER - LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_N(int3, n, MSG_FLOW_N, &planner.flow_percentage[n], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); - #endif - #endif - - // - // Advance K: - // - #if ENABLED(LIN_ADVANCE) && DISABLED(SLIM_LCD_MENUS) - #if EXTRUDERS == 1 - EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); - #elif HAS_MULTI_EXTRUDER - LOOP_L_N(n, EXTRUDERS) - EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); - #endif - #endif - - // - // Babystep X: - // Babystep Y: - // Babystep Z: - // - #if ENABLED(BABYSTEPPING) - #if ENABLED(BABYSTEP_XY) - SUBMENU(MSG_BABYSTEP_X, []{ _lcd_babystep_go(_lcd_babystep_x); }); - SUBMENU(MSG_BABYSTEP_Y, []{ _lcd_babystep_go(_lcd_babystep_y); }); - #endif - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); - #else - SUBMENU(MSG_BABYSTEP_Z, lcd_babystep_z); - #endif - #endif - - END_MENU(); -} - -#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp deleted file mode 100644 index f0f5c21bec..0000000000 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ /dev/null @@ -1,637 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// -// Unified Bed Leveling Menus -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) - -#include "menu_item.h" -#include "../../gcode/gcode.h" -#include "../../gcode/queue.h" -#include "../../module/motion.h" -#include "../../module/planner.h" -#include "../../module/settings.h" -#include "../../feature/bedlevel/bedlevel.h" - -static int16_t ubl_storage_slot = 0, - custom_hotend_temp = 190, - side_points = 3, - ubl_fillin_amount = 5, - ubl_height_amount = 1; - -static uint8_t n_edit_pts = 1; -static int8_t x_plot = 0, y_plot = 0; // May be negative during move - -#if HAS_HEATED_BED - static int16_t custom_bed_temp = 50; -#endif - -float mesh_edit_accumulator; // Rounded to 2.5 decimal places on use - -inline float rounded_mesh_value() { - const int32_t rounded = int32_t(mesh_edit_accumulator * 1000); - return float(rounded - (rounded % 5L)) / 1000; -} - -static void _lcd_mesh_fine_tune(PGM_P const msg) { - ui.defer_status_screen(); - if (ubl.encoder_diff) { - mesh_edit_accumulator += TERN(IS_TFTGLCD_PANEL, - ubl.encoder_diff * 0.005f / ENCODER_PULSES_PER_STEP, - ubl.encoder_diff > 0 ? 0.005f : -0.005f - ); - ubl.encoder_diff = 0; - TERN(IS_TFTGLCD_PANEL,,ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); - } - TERN_(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); - - if (ui.should_draw()) { - const float rounded_f = rounded_mesh_value(); - MenuEditItemBase::draw_edit_screen(msg, ftostr43sign(rounded_f)); - TERN_(MESH_EDIT_GFX_OVERLAY, _lcd_zoffset_overlay_gfx(rounded_f)); - TERN_(HAS_GRAPHICAL_TFT, ui.refresh(LCDVIEW_NONE)); - } -} - -// -// Called external to the menu system to acquire the result of an edit. -// -float lcd_mesh_edit() { return rounded_mesh_value(); } - -void lcd_mesh_edit_setup(const float &initial) { - TERN_(HAS_GRAPHICAL_TFT, ui.clear_lcd()); - mesh_edit_accumulator = initial; - ui.goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); -} - -void _lcd_z_offset_edit() { - _lcd_mesh_fine_tune(GET_TEXT(MSG_UBL_Z_OFFSET)); -} - -float lcd_z_offset_edit() { - ui.goto_screen(_lcd_z_offset_edit); - return rounded_mesh_value(); -} - -void lcd_z_offset_edit_setup(const float &initial) { - mesh_edit_accumulator = initial; - ui.goto_screen(_lcd_z_offset_edit); -} - -/** - * UBL Build Custom Mesh Command - */ -void _lcd_ubl_build_custom_mesh() { - char ubl_lcd_gcode[64]; - #if HAS_HEATED_BED - sprintf_P(ubl_lcd_gcode, PSTR("G28\nM190 S%i\nM109 S%i\nG29 P1"), custom_bed_temp, custom_hotend_temp); - #else - sprintf_P(ubl_lcd_gcode, PSTR("G28\nM109 S%i\nG29 P1"), custom_hotend_temp); - #endif - queue.inject(ubl_lcd_gcode); -} - -/** - * UBL Custom Mesh submenu - * - * << Build Mesh - * Hotend Temp: --- - * Bed Temp: --- - * Build Custom Mesh - */ -void _lcd_ubl_custom_mesh() { - START_MENU(); - BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); - #if HAS_HOTEND - EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT); - #endif - #if HAS_HEATED_BED - EDIT_ITEM(int3, MSG_UBL_BED_TEMP_CUSTOM, &custom_bed_temp, BED_MINTEMP, BED_MAX_TARGET); - #endif - ACTION_ITEM(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_build_custom_mesh); - END_MENU(); -} - -/** - * UBL Adjust Mesh Height Command - */ -void _lcd_ubl_adjust_height_cmd() { - char ubl_lcd_gcode[16]; - const int ind = ubl_height_amount > 0 ? 9 : 10; - strcpy_P(ubl_lcd_gcode, PSTR("G29 P6 C -")); - sprintf_P(&ubl_lcd_gcode[ind], PSTR(".%i"), ABS(ubl_height_amount)); - queue.inject(ubl_lcd_gcode); -} - -/** - * UBL Adjust Mesh Height submenu - * - * << Edit Mesh - * Height Amount: --- - * Adjust Mesh Height - * << Info Screen - */ -void _menu_ubl_height_adjust() { - START_MENU(); - BACK_ITEM(MSG_EDIT_MESH); - EDIT_ITEM(int3, MSG_UBL_MESH_HEIGHT_AMOUNT, &ubl_height_amount, -9, 9, _lcd_ubl_adjust_height_cmd); - ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); - END_MENU(); -} - -/** - * UBL Edit Mesh submenu - * - * << UBL Tools - * Fine Tune All - * Fine Tune Closest - * - Adjust Mesh Height >> - * << Info Screen - */ -void _lcd_ubl_edit_mesh() { - START_MENU(); - BACK_ITEM(MSG_UBL_TOOLS); - GCODES_ITEM(MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); - GCODES_ITEM(MSG_UBL_FINE_TUNE_CLOSEST, PSTR("G29 P4 T")); - SUBMENU(MSG_UBL_MESH_HEIGHT_ADJUST, _menu_ubl_height_adjust); - ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); - END_MENU(); -} - -#if ENABLED(G26_MESH_VALIDATION) - - /** - * UBL Validate Custom Mesh Command - */ - void _lcd_ubl_validate_custom_mesh() { - char ubl_lcd_gcode[24]; - sprintf_P(ubl_lcd_gcode, PSTR("G28\nG26 C P H%" PRIi16 TERN_(HAS_HEATED_BED, " B%" PRIi16)) - , custom_hotend_temp - #if HAS_HEATED_BED - , custom_bed_temp - #endif - ); - queue.inject(ubl_lcd_gcode); - } - - /** - * UBL Validate Mesh submenu - * - * << UBL Tools - * Mesh Validation with Material 1 up to 5 - * Validate Custom Mesh - * << Info Screen - */ - void _lcd_ubl_validate_mesh() { - START_MENU(); - BACK_ITEM(MSG_UBL_TOOLS); - #if PREHEAT_COUNT - #if HAS_HEATED_BED - #define VALIDATE_MESH_GCODE_ITEM(M) \ - GCODES_ITEM_N_S(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, PSTR("G28\nG26 C P I" STRINGIFY(M))) - #else - #define VALIDATE_MESH_GCODE_ITEM(M) \ - GCODES_ITEM_N_S(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, PSTR("G28\nG26 C P B0 I" STRINGIFY(M))) - #endif - - VALIDATE_MESH_GCODE_ITEM(0); - #if PREHEAT_COUNT > 1 - VALIDATE_MESH_GCODE_ITEM(1); - #if PREHEAT_COUNT > 2 - VALIDATE_MESH_GCODE_ITEM(2); - #if PREHEAT_COUNT > 3 - VALIDATE_MESH_GCODE_ITEM(3); - #if PREHEAT_COUNT > 4 - VALIDATE_MESH_GCODE_ITEM(4); - #endif - #endif - #endif - #endif - #endif // PREHEAT_COUNT - ACTION_ITEM(MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh); - ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); - END_MENU(); - } - -#endif - -/** - * UBL Grid Leveling submenu - * - * << UBL Tools - * Side points: --- - * Level Mesh - */ -void _lcd_ubl_grid_level() { - START_MENU(); - BACK_ITEM(MSG_UBL_TOOLS); - EDIT_ITEM(int3, MSG_UBL_SIDE_POINTS, &side_points, 2, 6); - ACTION_ITEM(MSG_UBL_MESH_LEVEL, []{ - char ubl_lcd_gcode[12]; - sprintf_P(ubl_lcd_gcode, PSTR("G29 J%i"), side_points); - queue.inject(ubl_lcd_gcode); - }); - END_MENU(); -} - -/** - * UBL Mesh Leveling submenu - * - * << UBL Tools - * 3-Point Mesh Leveling - * - Grid Mesh Leveling >> - * << Info Screen - */ -void _lcd_ubl_mesh_leveling() { - START_MENU(); - BACK_ITEM(MSG_UBL_TOOLS); - GCODES_ITEM(MSG_UBL_3POINT_MESH_LEVELING, PSTR("G29 J0")); - SUBMENU(MSG_UBL_GRID_MESH_LEVELING, _lcd_ubl_grid_level); - ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); - END_MENU(); -} - -/** - * UBL Fill-in Amount Mesh Command - */ -void _lcd_ubl_fillin_amount_cmd() { - char ubl_lcd_gcode[18]; - sprintf_P(ubl_lcd_gcode, PSTR("G29 P3 R C.%i"), ubl_fillin_amount); - gcode.process_subcommands_now(ubl_lcd_gcode); -} - -/** - * UBL Fill-in Mesh submenu - * - * << Build Mesh - * Fill-in Amount: --- - * Fill-in Mesh - * Smart Fill-in - * Manual Fill-in - * << Info Screen - */ -void _menu_ubl_fillin() { - START_MENU(); - BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); - EDIT_ITEM(int3, MSG_UBL_FILLIN_AMOUNT, &ubl_fillin_amount, 0, 9, _lcd_ubl_fillin_amount_cmd); - GCODES_ITEM(MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); - GCODES_ITEM(MSG_UBL_MANUAL_FILLIN, PSTR("G29 P2 B T0")); - ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); - END_MENU(); -} - -void _lcd_ubl_invalidate() { - ubl.invalidate(); - SERIAL_ECHOLNPGM("Mesh invalidated."); -} - -/** - * UBL Build Mesh submenu - * - * << UBL Tools - * Build Mesh with Material 1 up to 5 - * - Build Custom Mesh >> - * Build Cold Mesh - * - Fill-in Mesh >> - * Continue Bed Mesh - * Invalidate All - * Invalidate Closest - * << Info Screen - */ -void _lcd_ubl_build_mesh() { - START_MENU(); - BACK_ITEM(MSG_UBL_TOOLS); - #if PREHEAT_COUNT - #if HAS_HEATED_BED - #define PREHEAT_BED_GCODE(M) "M190 I" STRINGIFY(M) "\n" - #else - #define PREHEAT_BED_GCODE(M) "" - #endif - #define BUILD_MESH_GCODE_ITEM(M) GCODES_ITEM_S(ui.get_preheat_label(M), MSG_UBL_BUILD_MESH_M, \ - PSTR( \ - "G28\n" \ - PREHEAT_BED_GCODE(M) \ - "M109 I" STRINGIFY(M) "\n" \ - "G29 P1\n" \ - "M104 S0\n" \ - "M140 S0" \ - ) ) - BUILD_MESH_GCODE_ITEM(0); - #if PREHEAT_COUNT > 1 - BUILD_MESH_GCODE_ITEM(1); - #if PREHEAT_COUNT > 2 - BUILD_MESH_GCODE_ITEM(2); - #if PREHEAT_COUNT > 3 - BUILD_MESH_GCODE_ITEM(3); - #if PREHEAT_COUNT > 4 - BUILD_MESH_GCODE_ITEM(4); - #endif - #endif - #endif - #endif - #endif // PREHEAT_COUNT - - SUBMENU(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_custom_mesh); - GCODES_ITEM(MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); - SUBMENU(MSG_UBL_FILLIN_MESH, _menu_ubl_fillin); - GCODES_ITEM(MSG_UBL_CONTINUE_MESH, PSTR("G29 P1 C")); - ACTION_ITEM(MSG_UBL_INVALIDATE_ALL, _lcd_ubl_invalidate); - GCODES_ITEM(MSG_UBL_INVALIDATE_CLOSEST, PSTR("G29 I")); - ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); - END_MENU(); -} - -/** - * UBL Load / Save Mesh Commands - */ -inline void _lcd_ubl_load_save_cmd(const char loadsave, PGM_P const msg) { - char ubl_lcd_gcode[40]; - sprintf_P(ubl_lcd_gcode, PSTR("G29 %c%i\nM117 "), loadsave, ubl_storage_slot); - sprintf_P(&ubl_lcd_gcode[strlen(ubl_lcd_gcode)], msg, ubl_storage_slot); - gcode.process_subcommands_now(ubl_lcd_gcode); -} -void _lcd_ubl_load_mesh_cmd() { _lcd_ubl_load_save_cmd('L', GET_TEXT(MSG_MESH_LOADED)); } -void _lcd_ubl_save_mesh_cmd() { _lcd_ubl_load_save_cmd('S', GET_TEXT(MSG_MESH_SAVED)); } - -/** - * UBL Mesh Storage submenu - * - * << Unified Bed Leveling - * Memory Slot: --- - * Load Bed Mesh - * Save Bed Mesh - */ -void _lcd_ubl_storage_mesh() { - int16_t a = settings.calc_num_meshes(); - START_MENU(); - BACK_ITEM(MSG_UBL_LEVEL_BED); - if (!WITHIN(ubl_storage_slot, 0, a - 1)) - STATIC_ITEM(MSG_UBL_NO_STORAGE); - else { - EDIT_ITEM(int3, MSG_UBL_STORAGE_SLOT, &ubl_storage_slot, 0, a - 1); - ACTION_ITEM(MSG_UBL_LOAD_MESH, _lcd_ubl_load_mesh_cmd); - ACTION_ITEM(MSG_UBL_SAVE_MESH, _lcd_ubl_save_mesh_cmd); - } - END_MENU(); -} - -/** - * UBL LCD "radar" map point editing - */ -void _lcd_ubl_map_edit_cmd() { - char ubl_lcd_gcode[50], str[10], str2[10]; - dtostrf(ubl.mesh_index_to_xpos(x_plot), 0, 2, str); - dtostrf(ubl.mesh_index_to_ypos(y_plot), 0, 2, str2); - snprintf_P(ubl_lcd_gcode, sizeof(ubl_lcd_gcode), PSTR("G29 P4 X%s Y%s R%i"), str, str2, int(n_edit_pts)); - queue.inject(ubl_lcd_gcode); -} - -/** - * UBL LCD Map Movement - */ -void ubl_map_move_to_xy() { - - #if ENABLED(DELTA) - if (current_position.z > delta_clip_start_height) { // Make sure the delta has fully free motion - destination = current_position; - destination.z = delta_clip_start_height; - prepare_internal_fast_move_to_destination(homing_feedrate(Z_AXIS)); // Set current_position from destination - } - #endif - - // Set the nozzle position to the mesh point - current_position.set(ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot)); - - // Use the built-in manual move handler - ui.manual_move.soon(ALL_AXES); -} - -inline int32_t grid_index(const uint8_t x, const uint8_t y) { - return (GRID_MAX_POINTS_X) * y + x; -} - -/** - * UBL LCD "radar" map - */ -void ubl_map_screen() { - // static millis_t next_move = 0; - // const millis_t ms = millis(); - - uint8_t x, y; - - if (ui.first_page) { - - // On click send "G29 P4 ..." to edit the Z value - if (ui.use_click()) { - _lcd_ubl_map_edit_cmd(); - return; - } - - ui.defer_status_screen(); - - #if IS_KINEMATIC - // Index of the mesh point upon entry - const int32_t old_pos_index = grid_index(x_plot, y_plot); - // Direction from new (unconstrained) encoder value - const int8_t step_dir = int32_t(ui.encoderPosition) < old_pos_index ? -1 : 1; - #endif - - do { - // Now, keep the encoder position within range - if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = GRID_MAX_POINTS + TERN(TOUCH_SCREEN, ui.encoderPosition, -1); - if (int32_t(ui.encoderPosition) > GRID_MAX_POINTS - 1) ui.encoderPosition = TERN(TOUCH_SCREEN, ui.encoderPosition - GRID_MAX_POINTS, 0); - - // Draw the grid point based on the encoder - x = ui.encoderPosition % (GRID_MAX_POINTS_X); - y = ui.encoderPosition / (GRID_MAX_POINTS_X); - - // Validate if needed - #if IS_KINEMATIC - const xy_pos_t xy = { ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) }; - if (position_is_reachable(xy)) break; // Found a valid point - ui.encoderPosition += step_dir; // Test the next point - #endif - } while(ENABLED(IS_KINEMATIC)); - - // Determine number of points to edit - #if IS_KINEMATIC - n_edit_pts = 9; // TODO: Delta accessible edit points - #else - const bool xc = WITHIN(x, 1, GRID_MAX_POINTS_X - 2), - yc = WITHIN(y, 1, GRID_MAX_POINTS_Y - 2); - n_edit_pts = yc ? (xc ? 9 : 6) : (xc ? 6 : 4); // Corners - #endif - - // Refresh is also set by encoder movement - //if (int32_t(ui.encoderPosition) != grid_index(x, y)) - // ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); - } - - // Draw the grid point based on the encoder - x = ui.encoderPosition % (GRID_MAX_POINTS_X); - y = ui.encoderPosition / (GRID_MAX_POINTS_X); - - if (ui.should_draw()) ui.ubl_plot(x, y); - - // Add a move if needed to match the grid point - if (x != x_plot || y != y_plot) { - x_plot = x; y_plot = y; // The move is always posted, so update the grid point now - ubl_map_move_to_xy(); // Sets up a "manual move" - ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); // Clean up a half drawn box - } -} - -/** - * UBL LCD "radar" map homing - */ -void _ubl_map_screen_homing() { - ui.defer_status_screen(); - _lcd_draw_homing(); - if (all_axes_homed()) { - ubl.lcd_map_control = true; // Return to the map screen after editing Z - ui.goto_screen(ubl_map_screen, grid_index(x_plot, y_plot)); // Pre-set the encoder value - ui.manual_move.menu_scale = 0; // Immediate move - ubl_map_move_to_xy(); // Move to current mesh point - ui.manual_move.menu_scale = 1; // Delayed moves - } -} - -/** - * UBL Homing before LCD map - */ -void _ubl_goto_map_screen() { - if (planner.movesplanned()) return; // The ACTION_ITEM will do nothing - if (!all_axes_known()) { - set_all_unhomed(); - queue.inject_P(G28_STR); - } - ui.goto_screen(_ubl_map_screen_homing); // Go to the "Homing" screen -} - -/** - * UBL Output map submenu - * - * << Unified Bed Leveling - * Output for Host - * Output for CSV - * Off Printer Backup - */ -void _lcd_ubl_output_map() { - START_MENU(); - BACK_ITEM(MSG_UBL_LEVEL_BED); - GCODES_ITEM(MSG_UBL_OUTPUT_MAP_HOST, PSTR("G29 T0")); - GCODES_ITEM(MSG_UBL_OUTPUT_MAP_CSV, PSTR("G29 T1")); - GCODES_ITEM(MSG_UBL_OUTPUT_MAP_BACKUP, PSTR("G29 S-1")); - END_MENU(); -} - -/** - * UBL Tools submenu - * - * << Unified Bed Leveling - * - Build Mesh >> - * - Validate Mesh >> - * - Edit Mesh >> - * - Mesh Leveling >> - */ -void _menu_ubl_tools() { - START_MENU(); - BACK_ITEM(MSG_UBL_LEVEL_BED); - SUBMENU(MSG_UBL_BUILD_MESH_MENU, _lcd_ubl_build_mesh); - GCODES_ITEM(MSG_UBL_MANUAL_MESH, PSTR("G29 I999\nG29 P2 B T0")); - #if ENABLED(G26_MESH_VALIDATION) - SUBMENU(MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - #endif - SUBMENU(MSG_EDIT_MESH, _lcd_ubl_edit_mesh); - SUBMENU(MSG_UBL_MESH_LEVELING, _lcd_ubl_mesh_leveling); - END_MENU(); -} - -#if ENABLED(G26_MESH_VALIDATION) - - /** - * UBL Step-By-Step submenu - * - * << Unified Bed Leveling - * 1 Build Cold Mesh - * 2 Smart Fill-in - * - 3 Validate Mesh >> - * 4 Fine Tune All - * - 5 Validate Mesh >> - * 6 Fine Tune All - * 7 Save Bed Mesh - */ - void _lcd_ubl_step_by_step() { - START_MENU(); - BACK_ITEM(MSG_UBL_LEVEL_BED); - GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); - GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, PSTR("G29 P3 T0")); - SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); - SUBMENU(MSG_UBL_5_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); - GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); - ACTION_ITEM(MSG_UBL_7_SAVE_MESH, _lcd_ubl_save_mesh_cmd); - END_MENU(); - } - -#endif - -/** - * UBL System submenu - * - * << Motion - * - Manually Build Mesh >> - * - Activate UBL >> - * - Deactivate UBL >> - * - Step-By-Step UBL >> - * - Mesh Storage >> - * - Output Map >> - * - UBL Tools >> - * - Output UBL Info >> - */ -void _lcd_ubl_level_bed() { - START_MENU(); - BACK_ITEM(MSG_MOTION); - if (planner.leveling_active) - GCODES_ITEM(MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D")); - else - GCODES_ITEM(MSG_UBL_ACTIVATE_MESH, PSTR("G29 A")); - #if ENABLED(G26_MESH_VALIDATION) - SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step); - #endif - ACTION_ITEM(MSG_UBL_MESH_EDIT, _ubl_goto_map_screen); - SUBMENU(MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh); - SUBMENU(MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map); - SUBMENU(MSG_UBL_TOOLS, _menu_ubl_tools); - GCODES_ITEM(MSG_UBL_INFO_UBL, PSTR("G29 W")); - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - editable.decimal = planner.z_fade_height; - EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); }); - #endif - END_MENU(); -} - -#endif // HAS_LCD_MENU && AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/lcd/scaled_tft.h b/Marlin/src/lcd/scaled_tft.h deleted file mode 100644 index 2c05e5f26d..0000000000 --- a/Marlin/src/lcd/scaled_tft.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfig.h" - -#ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 2 -#endif - -#ifndef TFT_WIDTH - #if GRAPHICAL_TFT_UPSCALE == 3 - #define TFT_WIDTH 480 - #else - #define TFT_WIDTH 320 - #endif -#endif -#ifndef TFT_HEIGHT - #if GRAPHICAL_TFT_UPSCALE == 3 - #define TFT_HEIGHT 320 - #else - #define TFT_HEIGHT 240 - #endif -#endif - -#ifndef TFT_PIXEL_OFFSET_X - #if GRAPHICAL_TFT_UPSCALE == 2 - #define TFT_PIXEL_OFFSET_X 32 - #else - #define TFT_PIXEL_OFFSET_X 48 - #endif -#endif -#ifndef TFT_PIXEL_OFFSET_Y - // 32 is better for both 320x240 and 480x320 - #define TFT_PIXEL_OFFSET_Y 32 -#endif diff --git a/Marlin/src/lcd/tft/bitmaps/back.bmp b/Marlin/src/lcd/tft/bitmaps/back.bmp deleted file mode 100644 index 5ad1f82542..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/back.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/bed.bmp b/Marlin/src/lcd/tft/bitmaps/bed.bmp deleted file mode 100644 index 842174f820..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/bed.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/bed_heated.bmp b/Marlin/src/lcd/tft/bitmaps/bed_heated.bmp deleted file mode 100644 index f029ec5322..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/bed_heated.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp b/Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp deleted file mode 100644 index 04e879dbb0..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/cancel.bmp b/Marlin/src/lcd/tft/bitmaps/cancel.bmp deleted file mode 100644 index 4a2b1e4854..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/cancel.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/chamber.bmp b/Marlin/src/lcd/tft/bitmaps/chamber.bmp deleted file mode 100644 index d840b5f19f..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/chamber.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp b/Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp deleted file mode 100644 index 3d23370ad0..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/confirm.bmp b/Marlin/src/lcd/tft/bitmaps/confirm.bmp deleted file mode 100644 index 076fa57897..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/confirm.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/decrease.bmp b/Marlin/src/lcd/tft/bitmaps/decrease.bmp deleted file mode 100644 index ec371537c8..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/decrease.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/directory.bmp b/Marlin/src/lcd/tft/bitmaps/directory.bmp deleted file mode 100644 index 994abc70db..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/directory.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/down.bmp b/Marlin/src/lcd/tft/bitmaps/down.bmp deleted file mode 100644 index 42ff4e5caf..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/down.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/fan0.bmp b/Marlin/src/lcd/tft/bitmaps/fan0.bmp deleted file mode 100644 index 558dbe4f8f..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/fan0.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/fan1.bmp b/Marlin/src/lcd/tft/bitmaps/fan1.bmp deleted file mode 100644 index 6da6f3294e..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/fan1.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp b/Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp deleted file mode 100644 index bd0de9a1eb..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp b/Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp deleted file mode 100644 index 6da67fa44e..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp b/Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp deleted file mode 100644 index 45bc8e3316..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp b/Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp deleted file mode 100644 index 79d284b722..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/feedrate.bmp b/Marlin/src/lcd/tft/bitmaps/feedrate.bmp deleted file mode 100644 index dcc50bcbee..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/feedrate.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/flowrate.bmp b/Marlin/src/lcd/tft/bitmaps/flowrate.bmp deleted file mode 100644 index 739375bd72..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/flowrate.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/home.bmp b/Marlin/src/lcd/tft/bitmaps/home.bmp deleted file mode 100644 index 03d3d82a87..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/home.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/hotend.bmp b/Marlin/src/lcd/tft/bitmaps/hotend.bmp deleted file mode 100644 index ed24b6011e..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/hotend.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/increase.bmp b/Marlin/src/lcd/tft/bitmaps/increase.bmp deleted file mode 100644 index 53d71d0c5a..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/increase.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/left.bmp b/Marlin/src/lcd/tft/bitmaps/left.bmp deleted file mode 100644 index 3a2b8c3345..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/left.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/leveling.bmp b/Marlin/src/lcd/tft/bitmaps/leveling.bmp deleted file mode 100644 index 3486640270..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/leveling.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png deleted file mode 100644 index d94d3efd2c..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-195x59.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-195x59.png deleted file mode 100644 index d3cd15ff14..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-195x59.png and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png deleted file mode 100644 index f68708a8a2..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255.png deleted file mode 100644 index e623175873..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255.png and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-280x200.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-280x200.png deleted file mode 100644 index da61c1af69..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-280x200.png and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png deleted file mode 100644 index 744ba0e8b3..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png deleted file mode 100644 index 4959ca6722..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x320.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x320.png deleted file mode 100644 index ed30e04b8a..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x320.png and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/menu.bmp b/Marlin/src/lcd/tft/bitmaps/menu.bmp deleted file mode 100644 index b4ecc4858c..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/menu.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/pause.bmp b/Marlin/src/lcd/tft/bitmaps/pause.bmp deleted file mode 100644 index 9c42f006d3..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/pause.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/refresh.bmp b/Marlin/src/lcd/tft/bitmaps/refresh.bmp deleted file mode 100644 index 421b765c03..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/refresh.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/right.bmp b/Marlin/src/lcd/tft/bitmaps/right.bmp deleted file mode 100644 index 0e2cd82959..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/right.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/sd.bmp b/Marlin/src/lcd/tft/bitmaps/sd.bmp deleted file mode 100644 index dff13a291f..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/sd.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/settings.bmp b/Marlin/src/lcd/tft/bitmaps/settings.bmp deleted file mode 100644 index c6c5bc426e..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/settings.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/bitmaps/up.bmp b/Marlin/src/lcd/tft/bitmaps/up.bmp deleted file mode 100644 index 94afd1255b..0000000000 Binary files a/Marlin/src/lcd/tft/bitmaps/up.bmp and /dev/null differ diff --git a/Marlin/src/lcd/tft/canvas.cpp b/Marlin/src/lcd/tft/canvas.cpp deleted file mode 100644 index f6a5046b8d..0000000000 --- a/Marlin/src/lcd/tft/canvas.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_GRAPHICAL_TFT - -#include "canvas.h" - -uint16_t CANVAS::width, CANVAS::height; -uint16_t CANVAS::startLine, CANVAS::endLine; -uint16_t *CANVAS::buffer = TFT::buffer; - -void CANVAS::New(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { - CANVAS::width = width; - CANVAS::height = height; - startLine = 0; - endLine = 0; - - tft.set_window(x, y, x + width - 1, y + height - 1); -} - -void CANVAS::Continue() { - startLine = endLine; - endLine = TFT_BUFFER_SIZE < width * (height - startLine) ? startLine + TFT_BUFFER_SIZE / width : height; -} - -bool CANVAS::ToScreen() { - tft.write_sequence(buffer, width * (endLine - startLine)); - return endLine == height; -} - -void CANVAS::SetBackground(uint16_t color) { - /* TODO: test and optimize perfomance */ - /* - uint32_t count = (endLine - startLine) * width; - uint16_t *pixel = buffer; - while (count--) - *pixel++ = color; - */ - const uint32_t two_pixels = (((uint32_t )color) << 16) | color; - uint32_t count = ((endLine - startLine) * width + 1) >> 1; - uint32_t *pointer = (uint32_t *)buffer; - while (count--) *pointer++ = two_pixels; -} - -void CANVAS::AddText(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth) { - if (endLine < y || startLine > y + GetFontHeight()) return; - - if (maxWidth == 0) maxWidth = width - x; - - uint16_t stringWidth = 0; - for (uint16_t i = 0 ; *(string + i) ; i++) { - glyph_t *glyph = Glyph(string + i); - if (stringWidth + glyph->BBXWidth > maxWidth) break; - AddImage(x + stringWidth + glyph->BBXOffsetX, y + Font()->FontAscent - glyph->BBXHeight - glyph->BBXOffsetY, glyph->BBXWidth, glyph->BBXHeight, GREYSCALE1, ((uint8_t *)glyph) + sizeof(glyph_t), &color); - stringWidth += glyph->DWidth; - } -} - -void CANVAS::AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { - uint16_t *data = (uint16_t *)Images[image].data; - if (data == NULL) return; - - uint16_t image_width = Images[image].width, - image_height = Images[image].height; - colorMode_t color_mode = Images[image].colorMode; - - if (color_mode != HIGHCOLOR) - return AddImage(x, y, image_width, image_height, color_mode, (uint8_t *)data, colors); - - // HIGHCOLOR - 16 bits per pixel - - for (int16_t i = 0; i < image_height; i++) { - int16_t line = y + i; - if (line >= startLine && line < endLine) { - uint16_t *pixel = buffer + x + (line - startLine) * width; - for (int16_t j = 0; j < image_width; j++) { - if ((x + j >= 0) && (x + j < width)) *pixel = *data; - pixel++; - data++; - } - } - else - data += image_width; - } -} - -void CANVAS::AddImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors) { - uint8_t bitsPerPixel; - switch (color_mode) { - case GREYSCALE1: bitsPerPixel = 1; break; - case GREYSCALE2: bitsPerPixel = 2; break; - case GREYSCALE4: bitsPerPixel = 4; break; - default: return; - } - - uint8_t mask = 0xFF >> (8 - bitsPerPixel), - pixelsPerByte = 8 / bitsPerPixel; - - colors--; - - for (int16_t i = 0; i < image_height; i++) { - int16_t line = y + i; - if (line >= startLine && line < endLine) { - uint16_t *pixel = buffer + x + (line - startLine) * width; - uint8_t offset = 8 - bitsPerPixel; - for (int16_t j = 0; j < image_width; j++) { - if (offset > 8) { - data++; - offset = 8 - bitsPerPixel; - } - if ((x + j >= 0) && (x + j < width)) { - const uint8_t color = ((*data) >> offset) & mask; - if (color) *pixel = *(colors + color); - } - pixel++; - offset -= bitsPerPixel; - } - data++; - } - else - data += (image_width + pixelsPerByte - 1) / pixelsPerByte; - } -} - -void CANVAS::AddRectangle(uint16_t x, uint16_t y, uint16_t rectangleWidth, uint16_t rectangleHeight, uint16_t color) { - if (endLine < y || startLine > y + rectangleHeight) return; - - for (uint16_t i = 0; i < rectangleHeight; i++) { - uint16_t line = y + i; - if (line >= startLine && line < endLine) { - uint16_t *pixel = buffer + x + (line - startLine) * width; - if (i == 0 || i == rectangleHeight - 1) { - for (uint16_t j = 0; j < rectangleWidth; j++) *pixel++ = color; - } - else { - *pixel = color; - pixel += rectangleWidth - 1; - *pixel = color; - } - } - } -} - -void CANVAS::AddBar(uint16_t x, uint16_t y, uint16_t barWidth, uint16_t barHeight, uint16_t color) { - if (endLine < y || startLine > y + barHeight) return; - - for (uint16_t i = 0; i < barHeight; i++) { - uint16_t line = y + i; - if (line >= startLine && line < endLine) { - uint16_t *pixel = buffer + x + (line - startLine) * width; - for (uint16_t j = 0; j < barWidth; j++) *pixel++ = color; - } - } -} - -CANVAS Canvas; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/canvas.h b/Marlin/src/lcd/tft/canvas.h deleted file mode 100644 index 295ea038e3..0000000000 --- a/Marlin/src/lcd/tft/canvas.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_color.h" -#include "tft_string.h" -#include "tft_image.h" -#include "tft.h" - -#include "../../inc/MarlinConfig.h" - -class CANVAS { - private: - static uint16_t width, height; - static uint16_t startLine, endLine; - static uint16_t *buffer; - - inline static font_t *Font() { return TFT_String::font(); } - inline static glyph_t *Glyph(uint8_t *character) { return TFT_String::glyph(character); } - inline static uint16_t GetFontHeight() { return TFT_String::font_height(); } - - static void AddImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors); - static void AddImage(uint16_t x, uint16_t y, uint16_t imageWidth, uint16_t imageHeight, uint16_t color, uint16_t bgColor, uint8_t *image); - - public: - static void New(uint16_t x, uint16_t y, uint16_t width, uint16_t height); - static void Continue(); - static bool ToScreen(); - - static void SetBackground(uint16_t color); - static void AddText(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth); - static void AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors); - - static void AddRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); - static void AddBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); -}; - -extern CANVAS Canvas; diff --git a/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp b/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp deleted file mode 100644 index cc328e885d..0000000000 --- a/Marlin/src/lcd/tft/fontdata/fontdata_10x20.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* - Fontname: -Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO10646-1 - Copyright: Public domain font. Share and enjoy. - Capital A Height: 13, '1' Height: 13 - Calculated Max Values w= 9 h=17 x= 4 y=16 dx=10 dy= 0 ascent=16 len=26 - Font Bounding box w=10 h=20 x= 0 y=-4 - Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 - Pure Font ascent =13 descent=-4 - X Font ascent =13 descent=-4 - Max Font ascent =16 descent=-4 -*/ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -#include - -extern const uint8_t font10x20[3453] = { - 0,10,20,0,252,13,2,74,4,153,32,255,252,16,252,13, - 252,0,0,0,10,0,16,2,13,13,10,4,0,192,192,192, - 192,192,192,192,192,192,192,0,192,192,6,4,4,10,2,9, - 204,204,204,72,9,11,22,10,1,1,27,0,27,0,27,0, - 127,128,54,0,54,0,54,0,255,0,108,0,108,0,108,0, - 8,13,13,10,1,0,24,126,219,216,216,216,126,27,27,27, - 219,126,24,9,12,24,10,1,0,115,0,219,0,222,0,118, - 0,12,0,12,0,24,0,24,0,55,0,61,128,109,128,103, - 0,9,13,26,10,1,0,56,0,108,0,108,0,108,0,120, - 0,48,0,112,0,216,0,205,128,199,0,198,0,239,0,121, - 128,2,5,5,10,4,8,192,192,192,192,128,5,13,13,10, - 3,0,24,48,96,96,192,192,192,192,192,96,96,48,24,5, - 13,13,10,2,0,192,96,48,48,24,24,24,24,24,48,48, - 96,192,8,7,7,10,1,3,102,102,60,255,60,102,102,8, - 7,7,10,1,3,24,24,24,255,24,24,24,4,3,3,10, - 3,255,112,112,224,8,1,1,10,1,6,255,3,3,3,10, - 4,0,224,224,224,7,12,12,10,2,0,6,6,12,12,24, - 24,48,48,96,96,192,192,8,13,13,10,1,0,24,60,102, - 102,195,195,195,195,195,102,102,60,24,8,13,13,10,1,0, - 24,56,120,216,24,24,24,24,24,24,24,24,255,8,13,13, - 10,1,0,60,102,195,195,3,3,6,28,48,96,192,192,255, - 8,13,13,10,1,0,60,102,195,195,3,6,28,6,3,195, - 195,102,60,8,13,13,10,1,0,2,6,14,30,54,102,198, - 198,255,6,6,6,6,8,13,13,10,1,0,255,192,192,192, - 192,220,230,3,3,3,195,102,60,8,13,13,10,1,0,60, - 102,194,192,192,220,230,195,195,195,195,102,60,8,13,13,10, - 1,0,255,3,3,6,6,12,12,24,24,48,48,96,96,8, - 13,13,10,1,0,60,102,195,195,195,102,60,102,195,195,195, - 102,60,8,13,13,10,1,0,60,102,195,195,195,195,103,59, - 3,3,67,102,60,3,8,8,10,4,0,224,224,0,0,0, - 0,224,224,4,9,9,10,3,255,112,112,0,0,0,0,112, - 112,224,7,13,13,10,1,0,2,6,12,24,48,96,192,96, - 48,24,12,6,2,8,6,6,10,1,3,255,0,0,0,0, - 255,7,13,13,10,2,0,128,192,96,48,24,12,6,12,24, - 48,96,192,128,8,13,13,10,1,0,60,102,195,195,195,6, - 12,24,24,24,0,24,24,8,13,13,10,1,0,60,102,195, - 207,223,219,219,219,222,204,192,99,62,8,13,13,10,1,0, - 24,60,102,102,195,195,195,255,195,195,195,195,195,8,13,13, - 10,1,0,248,204,198,198,198,204,252,198,195,195,195,198,252, - 8,13,13,10,1,0,60,102,195,192,192,192,192,192,192,192, - 195,102,60,8,13,13,10,1,0,252,198,195,195,195,195,195, - 195,195,195,195,198,252,8,13,13,10,1,0,255,192,192,192, - 192,192,252,192,192,192,192,192,255,8,13,13,10,1,0,255, - 192,192,192,192,192,252,192,192,192,192,192,192,8,13,13,10, - 1,0,60,102,195,192,192,192,207,195,195,195,195,103,61,8, - 13,13,10,1,0,195,195,195,195,195,195,255,195,195,195,195, - 195,195,8,13,13,10,1,0,255,24,24,24,24,24,24,24, - 24,24,24,24,255,9,13,26,10,1,0,31,128,6,0,6, - 0,6,0,6,0,6,0,6,0,6,0,6,0,198,0,198, - 0,108,0,56,0,8,13,13,10,1,0,195,195,198,198,204, - 204,248,204,204,198,198,195,195,8,13,13,10,1,0,192,192, - 192,192,192,192,192,192,192,192,192,192,255,8,13,13,10,1, - 0,195,195,231,231,255,219,219,219,219,195,195,195,195,8,13, - 13,10,1,0,195,227,227,243,243,219,219,207,207,199,199,195, - 195,8,13,13,10,1,0,60,102,195,195,195,195,195,195,195, - 195,195,102,60,8,13,13,10,1,0,252,198,195,195,195,195, - 198,252,192,192,192,192,192,8,14,14,10,1,255,60,102,195, - 195,195,195,195,195,195,219,207,102,62,3,8,13,13,10,1, - 0,252,198,195,195,195,195,198,252,204,198,198,195,195,8,13, - 13,10,1,0,60,102,195,192,192,96,60,6,3,3,195,102, - 60,8,13,13,10,1,0,255,24,24,24,24,24,24,24,24, - 24,24,24,24,8,13,13,10,1,0,195,195,195,195,195,195, - 195,195,195,195,195,102,60,8,13,13,10,1,0,195,195,195, - 195,102,102,102,60,60,60,24,24,24,8,13,13,10,1,0, - 195,195,195,195,195,219,219,219,219,231,231,195,195,8,13,13, - 10,1,0,195,195,102,102,60,60,24,60,60,102,102,195,195, - 8,13,13,10,1,0,195,195,102,102,60,60,24,24,24,24, - 24,24,24,8,13,13,10,1,0,255,3,3,6,12,12,24, - 48,48,96,192,192,255,6,13,13,10,2,0,252,192,192,192, - 192,192,192,192,192,192,192,192,252,7,12,12,10,2,0,192, - 192,96,96,48,48,24,24,12,12,6,6,6,13,13,10,2, - 0,252,12,12,12,12,12,12,12,12,12,12,12,252,8,4, - 4,10,1,9,24,60,102,195,9,1,2,10,1,255,255,128, - 4,3,3,10,3,10,192,96,48,8,8,8,10,1,0,62, - 99,3,127,195,195,195,125,8,13,13,10,1,0,192,192,192, - 192,192,220,230,195,195,195,195,230,220,8,8,8,10,1,0, - 62,99,192,192,192,192,99,62,8,13,13,10,1,0,3,3, - 3,3,3,59,103,195,195,195,195,103,59,8,8,8,10,1, - 0,60,102,195,255,192,192,99,62,8,13,13,10,1,0,30, - 51,51,48,48,252,48,48,48,48,48,48,48,8,12,12,10, - 1,252,125,199,198,198,198,124,192,126,195,195,195,126,8,13, - 13,10,1,0,192,192,192,192,192,220,230,195,195,195,195,195, - 195,8,11,11,10,1,0,24,24,0,120,24,24,24,24,24, - 24,255,7,15,15,10,2,252,6,6,0,30,6,6,6,6, - 6,6,6,198,198,198,124,8,13,13,10,1,0,192,192,192, - 192,192,198,204,216,240,248,204,198,195,8,13,13,10,1,0, - 120,24,24,24,24,24,24,24,24,24,24,24,255,8,8,8, - 10,1,0,182,255,219,219,219,219,219,219,8,8,8,10,1, - 0,220,230,195,195,195,195,195,195,8,8,8,10,1,0,60, - 102,195,195,195,195,102,60,8,12,12,10,1,252,220,230,195, - 195,195,195,230,220,192,192,192,192,8,12,12,10,1,252,59, - 103,195,195,195,195,103,59,3,3,3,3,8,8,8,10,1, - 0,222,115,96,96,96,96,96,96,8,8,8,10,1,0,126, - 195,192,126,3,3,195,126,8,11,11,10,1,0,48,48,48, - 252,48,48,48,48,48,51,30,8,8,8,10,1,0,195,195, - 195,195,195,195,103,59,8,8,8,10,1,0,195,195,102,102, - 60,60,24,24,8,8,8,10,1,0,195,195,195,219,219,219, - 255,102,8,8,8,10,1,0,195,102,60,24,24,60,102,195, - 8,12,12,10,1,252,195,195,195,195,195,195,103,59,3,195, - 102,60,7,8,8,10,2,0,254,6,12,24,48,96,192,254, - 8,13,13,10,1,0,15,24,24,24,24,24,240,24,24,24, - 24,24,15,2,13,13,10,4,0,192,192,192,192,192,192,192, - 192,192,192,192,192,192,8,13,13,10,1,0,240,24,24,24, - 24,24,15,24,24,24,24,24,240,8,3,3,10,1,10,115, - 219,206,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,0,0,0,10,0,16,2,13,13,10,4,0,192, - 192,0,192,192,192,192,192,192,192,192,192,192,7,12,12,10, - 1,0,24,24,60,102,194,192,192,194,102,60,24,24,9,12, - 24,10,1,0,30,0,51,0,51,0,48,0,48,0,252,0, - 48,0,48,0,48,0,248,0,173,128,231,0,9,9,18,10, - 0,1,128,128,221,128,127,0,99,0,99,0,99,0,127,0, - 221,128,128,128,8,11,11,10,1,0,129,195,102,60,126,24, - 126,24,24,24,24,2,13,13,10,4,0,192,192,192,192,192, - 0,0,0,192,192,192,192,192,8,13,13,10,1,0,60,102, - 198,96,120,204,102,51,30,6,99,102,60,6,2,2,10,2, - 11,204,204,8,11,11,10,1,0,60,102,195,189,165,161,165, - 189,195,102,60,8,9,9,10,1,4,62,67,3,127,195,195, - 125,0,255,9,11,22,10,0,0,4,128,13,128,27,0,54, - 0,108,0,216,0,108,0,54,0,27,0,13,128,4,128,8, - 4,4,10,1,4,255,255,3,3,6,1,1,10,2,6,252, - 8,11,11,10,1,0,60,102,195,189,165,189,169,173,195,102, - 60,8,1,1,10,1,13,255,6,6,6,10,2,7,48,120, - 204,204,120,48,8,7,7,10,1,2,24,24,255,24,24,0, - 255,5,7,7,10,2,6,112,216,24,48,96,192,248,5,7, - 7,10,2,6,112,216,24,48,24,216,112,4,3,3,10,3, - 10,48,96,192,7,10,10,10,1,253,198,198,198,198,198,238, - 250,192,192,192,8,13,13,10,1,0,127,255,251,251,251,123, - 27,27,27,27,27,27,27,3,3,3,10,4,5,224,224,224, - 5,4,4,10,2,252,48,24,216,112,4,7,7,10,2,6, - 96,224,96,96,96,96,240,7,9,9,10,1,4,56,108,198, - 198,198,108,56,0,254,9,11,22,10,1,0,144,0,216,0, - 108,0,54,0,27,0,13,128,27,0,54,0,108,0,216,0, - 144,0,8,12,12,10,1,1,64,192,65,66,228,8,18,38, - 74,158,2,2,8,12,12,10,1,1,64,192,65,66,228,8, - 22,41,65,130,4,15,8,12,12,10,1,1,224,16,97,18, - 228,8,18,38,74,159,2,2,8,13,13,10,1,0,24,24, - 0,24,24,24,48,96,195,195,195,102,60,8,15,15,10,1, - 0,96,48,24,0,24,60,102,195,195,195,255,195,195,195,195, - 8,15,15,10,1,0,6,12,24,0,24,60,102,195,195,195, - 255,195,195,195,195,8,15,15,10,1,0,24,60,102,0,24, - 60,102,195,195,195,255,195,195,195,195,8,15,15,10,1,0, - 50,126,76,0,24,60,102,195,195,195,255,195,195,195,195,8, - 15,15,10,1,0,102,102,0,24,60,102,102,195,195,195,255, - 195,195,195,195,8,16,16,10,1,0,60,102,102,60,0,24, - 60,102,195,195,195,255,195,195,195,195,8,13,13,10,1,0, - 31,60,108,108,204,204,255,204,204,204,204,204,207,8,17,17, - 10,1,252,60,102,195,192,192,192,192,192,192,192,195,102,60, - 24,12,108,56,8,15,15,10,1,0,96,48,24,0,255,192, - 192,192,192,252,192,192,192,192,255,8,15,15,10,1,0,12, - 24,48,0,255,192,192,192,192,252,192,192,192,192,255,8,15, - 15,10,1,0,24,60,102,0,255,192,192,192,192,252,192,192, - 192,192,255,8,15,15,10,1,0,102,102,0,0,255,192,192, - 192,192,252,192,192,192,192,255,6,15,15,10,2,0,96,48, - 24,0,252,48,48,48,48,48,48,48,48,48,252,6,15,15, - 10,2,0,24,48,96,0,252,48,48,48,48,48,48,48,48, - 48,252,6,15,15,10,2,0,48,120,204,0,252,48,48,48, - 48,48,48,48,48,48,252,6,15,15,10,2,0,204,204,0, - 252,48,48,48,48,48,48,48,48,48,48,252,9,13,26,10, - 0,0,126,0,99,0,97,128,97,128,97,128,97,128,249,128, - 97,128,97,128,97,128,97,128,99,0,126,0,8,15,15,10, - 1,0,50,126,76,0,195,227,243,243,219,219,207,207,199,195, - 195,8,15,15,10,1,0,48,24,12,0,60,102,195,195,195, - 195,195,195,195,102,60,8,15,15,10,1,0,12,24,48,0, - 60,102,195,195,195,195,195,195,195,102,60,8,15,15,10,1, - 0,24,60,102,0,60,102,195,195,195,195,195,195,195,102,60, - 8,15,15,10,1,0,50,126,76,0,60,102,195,195,195,195, - 195,195,195,102,60,8,15,15,10,1,0,102,102,0,60,102, - 195,195,195,195,195,195,195,195,102,60,7,8,8,10,1,0, - 130,198,108,56,56,108,198,130,8,15,15,10,1,255,1,62, - 102,199,199,203,203,203,211,211,211,227,102,124,128,8,15,15, - 10,1,0,48,24,12,0,195,195,195,195,195,195,195,195,195, - 102,60,8,15,15,10,1,0,12,24,48,0,195,195,195,195, - 195,195,195,195,195,102,60,8,15,15,10,1,0,24,60,102, - 0,195,195,195,195,195,195,195,195,195,102,60,8,15,15,10, - 1,0,102,102,0,195,195,195,195,195,195,195,195,195,195,102, - 60,8,15,15,10,1,0,12,24,48,0,195,195,102,102,60, - 60,24,24,24,24,24,7,13,13,10,2,0,192,192,192,252, - 198,198,198,198,198,252,192,192,192,8,13,13,10,1,0,28, - 54,99,99,102,236,108,102,99,99,99,102,108,8,12,12,10, - 1,0,48,24,12,0,126,195,3,127,195,195,195,125,8,12, - 12,10,1,0,12,24,48,0,126,195,3,127,195,195,195,125, - 8,12,12,10,1,0,24,60,102,0,126,195,3,127,195,195, - 195,125,8,12,12,10,1,0,50,126,76,0,126,195,3,127, - 195,195,195,125,8,11,11,10,1,0,102,102,0,126,195,3, - 127,195,195,195,125,8,13,13,10,1,0,60,102,102,60,0, - 126,195,3,127,195,195,195,125,8,8,8,10,1,0,118,155, - 27,30,120,216,217,110,8,12,12,10,1,252,62,99,192,192, - 192,192,99,62,24,12,108,56,8,12,12,10,1,0,96,48, - 24,0,60,102,195,255,192,192,99,62,8,12,12,10,1,0, - 6,12,24,0,60,102,195,255,192,192,99,62,8,12,12,10, - 1,0,24,60,102,0,60,102,195,255,192,192,99,62,8,11, - 11,10,1,0,102,102,0,60,102,195,255,192,192,99,62,8, - 12,12,10,1,0,96,48,24,0,120,24,24,24,24,24,24, - 255,8,12,12,10,1,0,12,24,48,0,120,24,24,24,24, - 24,24,255,8,12,12,10,1,0,24,60,102,0,120,24,24, - 24,24,24,24,255,8,11,11,10,1,0,102,102,0,120,24, - 24,24,24,24,24,255,8,13,13,10,1,0,136,216,112,112, - 216,140,62,103,195,195,195,102,60,8,12,12,10,1,0,50, - 126,76,0,220,230,195,195,195,195,195,195,8,12,12,10,1, - 0,96,48,24,0,60,102,195,195,195,195,102,60,8,12,12, - 10,1,0,6,12,24,0,60,102,195,195,195,195,102,60,8, - 12,12,10,1,0,24,60,102,0,60,102,195,195,195,195,102, - 60,8,12,12,10,1,0,50,126,76,0,60,102,195,195,195, - 195,102,60,8,11,11,10,1,0,102,102,0,60,102,195,195, - 195,195,102,60,8,10,10,10,1,1,24,24,0,0,255,255, - 0,0,24,24,8,10,10,10,1,255,1,62,102,203,203,211, - 211,102,124,128,8,12,12,10,1,0,48,24,12,0,195,195, - 195,195,195,195,103,59,8,12,12,10,1,0,6,12,24,0, - 195,195,195,195,195,195,103,59,8,12,12,10,1,0,24,60, - 102,0,195,195,195,195,195,195,103,59,8,11,11,10,1,0, - 102,102,0,195,195,195,195,195,195,103,59,8,16,16,10,1, - 252,12,24,48,0,195,195,195,195,195,195,103,59,3,195,102, - 60,7,17,17,10,2,252,192,192,192,192,192,192,248,204,198, - 198,198,204,248,192,192,192,192,8,15,15,10,1,252,102,102, - 0,195,195,195,195,195,195,103,59,3,195,102,60 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp b/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp deleted file mode 100644 index ade8bf23b8..0000000000 --- a/Marlin/src/lcd/tft/fontdata/fontdata_ISO10646_1.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -#include - -#define STM32_NOT_EXTENDED_ISO10646_1_5X7 - -#if ENABLED(STM32_NOT_EXTENDED_ISO10646_1_5X7) - // reduced font (only symbols 1 - 127) - saves about 1278 bytes of FLASH - -/* - Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 - Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 5 h=10 x= 5 y= 5 dx= 6 dy= 0 ascent= 8 len=10 - Font Bounding box w=12 h=13 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-2 - X Font ascent = 8 descent=-2 - Max Font ascent = 8 descent=-2 -*/ -extern const uint8_t ISO10646_1_5x7[1325] = { - 0x00,0x0C,0x0D,0x00,0xFE,0x07,0x02,0x26,0x03,0xBC,0x01,0x7F,0xFE,0x0A,0xFE,0x08, - 0xFE,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xF0,0xC8,0x88,0x88,0x98,0x78,0x10,0x05, - 0x08,0x08,0x06,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, - 0xF8,0x20,0x20,0x20,0x20,0xE0,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA8, - 0xB8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xE0,0x8C,0xEA,0x8C,0x8A, - 0x0A,0x05,0x09,0x09,0x06,0x00,0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0x88,0xA8,0xF8, - 0x05,0x0A,0x0A,0x06,0x00,0xFE,0x20,0x50,0x50,0x50,0x50,0x88,0xA8,0xA8,0x88,0x70, - 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, - 0x00,0x00,0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, - 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xA0,0xA0,0xA0,0x05,0x06,0x06,0x06,0x00, - 0x00,0x50,0xF8,0x50,0x50,0xF8,0x50,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8, - 0xA0,0x70,0x28,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xC8,0xC8,0x10,0x20, - 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68, - 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x20, - 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40, - 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xA8,0x70, - 0x20,0x70,0xA8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xF8,0x20,0x20,0x02, - 0x03,0x03,0x06,0x01,0xFF,0xC0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xF8,0x02, - 0x02,0x02,0x06,0x01,0x00,0xC0,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, - 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xA8,0xC8,0x88, - 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0xE0,0x05,0x07, - 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xF8,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, - 0x50,0x90,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0xF0,0x08,0x08, - 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xF0,0x88,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xC0,0xC0,0x00,0xC0, - 0xC0,0x02,0x06,0x06,0x06,0x01,0xFF,0xC0,0xC0,0x00,0xC0,0x40,0x80,0x03,0x05,0x05, - 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xF8,0x00, - 0xF8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0xB8,0xA8,0xB8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8, - 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0xF0, - 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x05,0x07,0x07,0x06,0x00,0x00, - 0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80, - 0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00, - 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, - 0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, - 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF0, - 0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, - 0xA8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88, - 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, - 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, - 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8, - 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, - 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0xE0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, - 0x00,0xFE,0xF8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0, - 0x88,0x88,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, - 0xE0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x88,0x88,0x78,0x08, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x04,0x09,0x09,0x06,0x01, - 0xFE,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, - 0x80,0x80,0x88,0x90,0xE0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xC0,0x40,0x40, - 0x40,0x40,0x40,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x05, - 0x05,0x05,0x06,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0, - 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, - 0x05,0x05,0x06,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0x78,0x80,0x70,0x08,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20, - 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, - 0xA8,0xA8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, - 0x00,0xF8,0x10,0x20,0x40,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40,0x40,0x40, - 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40,0x40,0x20,0x40, - 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xA8,0x90,0xFF -}; - -#else // !STM32_NOT_EXTENDED_ISO10646_1_5X7 - - // extended (original) font (symbols 1 - 255) - -/* - Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 - Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 - Capital A Height: 7, '1' Height: 7 - Calculated Max Values w= 6 h=10 x= 5 y= 7 dx= 6 dy= 0 ascent=10 len=10 - Font Bounding box w=12 h=13 x= 0 y=-2 - Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 - Pure Font ascent = 7 descent=-2 - X Font ascent = 8 descent=-2 - Max Font ascent =10 descent=-2 -*/ -extern const uint8_t ISO10646_1_5x7[2648] = { - 0x00,0x0C,0x0D,0x00,0xFE,0x07,0x02,0x26,0x03,0xBC,0x01,0xFF,0xFE,0x0A,0xFE,0x08, - 0xFE,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xF0,0xC8,0x88,0x88,0x98,0x78,0x10,0x05, - 0x08,0x08,0x06,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70, - 0xF8,0x20,0x20,0x20,0x20,0xE0,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA8, - 0xB8,0x88,0x88,0x70,0x20,0x07,0x06,0x06,0x08,0x00,0x01,0xE0,0x8C,0xEA,0x8C,0x8A, - 0x0A,0x05,0x09,0x09,0x06,0x00,0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0x88,0xA8,0xF8, - 0x05,0x0A,0x0A,0x06,0x00,0xFE,0x20,0x50,0x50,0x50,0x50,0x88,0xA8,0xA8,0x88,0x70, - 0x03,0x03,0x03,0x06,0x00,0x06,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, - 0x00,0x00,0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80, - 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xA0,0xA0,0xA0,0x05,0x06,0x06,0x06,0x00, - 0x00,0x50,0xF8,0x50,0x50,0xF8,0x50,0x05,0x09,0x09,0x06,0x00,0xFF,0x20,0x70,0xA8, - 0xA0,0x70,0x28,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xC8,0xC8,0x10,0x20, - 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68, - 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x20, - 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40, - 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xA8,0x70, - 0x20,0x70,0xA8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xF8,0x20,0x20,0x02, - 0x03,0x03,0x06,0x01,0xFF,0xC0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xF8,0x02, - 0x02,0x02,0x06,0x01,0x00,0xC0,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10, - 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xA8,0xC8,0x88, - 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0xE0,0x05,0x07, - 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xF8,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30, - 0x50,0x90,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0xF0,0x08,0x08, - 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xF0,0x88,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xC0,0xC0,0x00,0xC0, - 0xC0,0x02,0x06,0x06,0x06,0x01,0xFF,0xC0,0xC0,0x00,0xC0,0x40,0x80,0x03,0x05,0x05, - 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xF8,0x00, - 0xF8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70, - 0x88,0xB8,0xA8,0xB8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8, - 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0xF0, - 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x05,0x07,0x07,0x06,0x00,0x00, - 0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80, - 0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00, - 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90, - 0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80, - 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05, - 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x07,0x07,0x06, - 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF0, - 0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88, - 0xA8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88, - 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00, - 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88, - 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8, - 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07, - 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, - 0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40, - 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xFF,0xE0,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0xE0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06, - 0x00,0xFE,0xF8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0, - 0x88,0x88,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05, - 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06, - 0x00,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40, - 0xE0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x88,0x88,0x78,0x08, - 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x03,0x07, - 0x07,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x04,0x09,0x09,0x06,0x01, - 0xFE,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00, - 0x80,0x80,0x88,0x90,0xE0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xC0,0x40,0x40, - 0x40,0x40,0x40,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x05, - 0x05,0x05,0x06,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00, - 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0, - 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05, - 0x05,0x05,0x06,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00, - 0x78,0x80,0x70,0x08,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20, - 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05, - 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88, - 0xA8,0xA8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, - 0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00, - 0x00,0xF8,0x10,0x20,0x40,0xF8,0x03,0x09,0x09,0x06,0x01,0xFF,0x20,0x40,0x40,0x40, - 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xFF,0x80,0x40,0x40,0x40,0x20,0x40, - 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xA8,0x90,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, - 0x06,0x05,0xFF,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80, - 0x05,0x07,0x07,0x06,0x00,0xFF,0x20,0x70,0xA8,0xA0,0xA8,0x70,0x20,0x05,0x07,0x07, - 0x06,0x00,0x00,0x30,0x48,0x40,0xE0,0x40,0x48,0xB0,0x05,0x05,0x05,0x06,0x00,0x00, - 0xA8,0x50,0x88,0x50,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xF8,0x20,0xF8, - 0x20,0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04, - 0x08,0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xE0,0x03,0x01,0x01, - 0x06,0x01,0x07,0xA0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xB4,0xA4,0xB4,0x84, - 0x78,0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xA0,0x60,0x00,0xE0,0x05,0x05,0x05,0x06, - 0x00,0x00,0x28,0x50,0xA0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xF8,0x08,0x08, - 0x03,0x01,0x01,0x06,0x01,0x03,0xE0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xB4, - 0xA4,0xA4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xF8,0x04,0x04,0x04,0x06,0x01, - 0x05,0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20, - 0x00,0xF8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xA0,0x20,0x40,0xE0,0x03,0x05,0x05, - 0x06,0x01,0x04,0xC0,0x20,0x40,0x20,0xC0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40, - 0x80,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x08, - 0x08,0x06,0x00,0x00,0x78,0xE8,0xE8,0xE8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06, - 0x02,0x03,0xC0,0xC0,0x03,0x02,0x02,0x06,0x01,0xFE,0x20,0xC0,0x03,0x05,0x05,0x06, - 0x01,0x04,0x40,0xC0,0x40,0x40,0xE0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xA0,0x40, - 0x00,0xE0,0x05,0x05,0x05,0x06,0x00,0x00,0xA0,0x50,0x28,0x50,0xA0,0x05,0x0A,0x0A, - 0x06,0x00,0x00,0x40,0xC0,0x48,0x50,0x60,0x50,0xB0,0x50,0x78,0x10,0x05,0x0A,0x0A, - 0x06,0x00,0x00,0x40,0xC0,0x48,0x50,0x60,0x50,0xA8,0x08,0x10,0x38,0x05,0x0A,0x0A, - 0x06,0x00,0x00,0xC0,0x20,0x48,0x30,0xE0,0x50,0xB0,0x50,0x78,0x10,0x05,0x07,0x07, - 0x06,0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00, - 0x40,0x20,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00, - 0x10,0x20,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00, - 0x20,0x50,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00, - 0x68,0xB0,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00, - 0x50,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20, - 0x50,0x20,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78, - 0xA0,0xA0,0xF0,0xA0,0xA0,0xB8,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x80,0x80, - 0x80,0x88,0x70,0x10,0x60,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0xF8,0x80, - 0x80,0xF0,0x80,0x80,0xF8,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0xF8,0x80, - 0x80,0xF0,0x80,0x80,0xF8,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50,0x00,0xF8,0x80, - 0x80,0xF0,0x80,0x80,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xF8,0x80,0x80, - 0xF0,0x80,0x80,0xF8,0x03,0x0A,0x0A,0x06,0x01,0x00,0x80,0x40,0x00,0xE0,0x40,0x40, - 0x40,0x40,0x40,0xE0,0x03,0x0A,0x0A,0x06,0x01,0x00,0x20,0x40,0x00,0xE0,0x40,0x40, - 0x40,0x40,0x40,0xE0,0x03,0x0A,0x0A,0x06,0x01,0x00,0x40,0xA0,0x00,0xE0,0x40,0x40, - 0x40,0x40,0x40,0xE0,0x03,0x09,0x09,0x06,0x01,0x00,0xA0,0x00,0xE0,0x40,0x40,0x40, - 0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xE8,0x48,0x48,0x70, - 0x05,0x0A,0x0A,0x06,0x00,0x00,0x68,0xB0,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88, - 0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x0A,0x0A,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x0A,0x0A,0x06,0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70, - 0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, - 0x05,0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xFF, - 0x08,0x70,0x98,0xA8,0xA8,0xA8,0xC8,0x70,0x80,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40, - 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10, - 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x20, - 0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50, - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20, - 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xE0, - 0x90,0x90,0x90,0xE0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xA0,0x90, - 0x88,0xB0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78, - 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08, - 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06, - 0x00,0x00,0x68,0xB0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00, - 0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20, - 0x70,0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xA0,0x78, - 0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08, - 0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x08,0x08,0x06,0x00, - 0x00,0x10,0x20,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20, - 0x50,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70, - 0x88,0xF0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xC0,0x40,0x40, - 0x40,0xE0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0, - 0x03,0x08,0x08,0x06,0x01,0x00,0x40,0xA0,0x00,0xC0,0x40,0x40,0x40,0xE0,0x03,0x07, - 0x07,0x06,0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0x40,0xE0,0x05,0x09,0x09,0x06,0x00, - 0x00,0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00, - 0x68,0xB0,0x00,0xB0,0xC8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20, - 0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70, - 0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88, - 0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x70, - 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05, - 0x06,0x00,0x01,0x20,0x00,0xF8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98, - 0xA8,0xC8,0xF0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88, - 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05, - 0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07, - 0x06,0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE, - 0x10,0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xFE, - 0x80,0x80,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xFE,0x50, - 0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80 -}; - -#endif // !STM32_NOT_EXTENDED_ISO10646_1_5X7 - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp deleted file mode 100644 index 12efb3ba49..0000000000 --- a/Marlin/src/lcd/tft/fontdata/helvetica_12_bold.cpp +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* - Fontname: Helvetica - Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. - Capital A Height: 12, '1' Height: 12 - Calculated Max Values w=14 h=17 x= 2 y=10 dx=16 dy= 0 ascent=14 len=32 - Font Bounding box w=16 h=17 x= 0 y=-4 - Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 - Pure Font ascent =12 descent=-4 - X Font ascent =12 descent=-4 - Max Font ascent =14 descent=-4 -*/ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -#include - -extern const uint8_t Helvetica12Bold[4172] = { - 0,16,17,0,252,12,2,74,5,106,32,255,252,14,252,12, - 252,0,0,0,5,0,0,2,12,12,6,2,0,192,192,192, - 192,192,192,192,192,192,0,192,192,5,4,4,8,1,8,216, - 216,216,72,9,12,24,9,0,0,27,0,27,0,27,0,127, - 128,127,128,54,0,54,0,255,0,255,0,108,0,108,0,108, - 0,7,14,14,9,1,255,16,124,254,214,208,240,120,60,30, - 22,214,254,124,16,13,12,24,14,0,0,48,64,120,128,204, - 128,205,0,121,0,50,0,2,96,4,240,5,152,9,152,8, - 240,16,96,10,12,24,12,1,0,60,0,126,0,102,0,102, - 0,60,0,56,192,125,192,207,128,199,0,199,0,127,128,57, - 192,2,4,4,4,1,8,192,192,192,64,4,15,15,6,1, - 253,48,112,96,192,192,192,192,192,192,192,192,192,96,112,48, - 4,15,15,6,0,253,192,224,96,48,48,48,48,48,48,48, - 48,48,96,224,192,5,5,5,6,0,7,32,168,112,112,136, - 8,8,8,10,1,0,24,24,24,255,255,24,24,24,2,5, - 5,4,1,253,192,192,64,64,128,4,2,2,5,0,3,240, - 240,2,2,2,4,1,0,192,192,4,12,12,5,0,0,16, - 16,48,32,32,96,64,64,192,128,128,128,8,12,12,9,0, - 0,60,126,231,195,195,195,195,195,195,231,126,60,5,12,12, - 9,1,0,8,24,248,248,24,24,24,24,24,24,24,24,8, - 12,12,9,0,0,60,126,231,195,195,7,14,28,56,112,255, - 255,8,12,12,9,0,0,60,126,231,195,7,30,30,7,195, - 231,126,60,8,12,12,9,0,0,14,30,54,54,102,102,198, - 255,255,6,6,6,8,12,12,9,0,0,63,63,48,48,124, - 126,71,3,3,231,126,60,8,12,12,9,0,0,60,126,231, - 192,220,254,231,195,195,231,126,60,8,12,12,9,0,0,255, - 255,6,6,12,12,24,24,24,48,48,48,8,12,12,9,0, - 0,60,126,231,195,102,60,126,231,195,231,126,60,8,12,12, - 9,0,0,60,126,231,195,195,231,127,59,3,231,126,60,2, - 8,8,5,2,0,192,192,0,0,0,0,192,192,2,11,11, - 5,2,253,192,192,0,0,0,0,192,192,64,64,128,8,8, - 8,10,1,0,3,15,60,224,224,60,15,3,8,6,6,10, - 1,1,255,255,0,0,255,255,8,8,8,10,1,0,192,240, - 60,7,7,60,240,192,7,12,12,10,1,0,124,254,198,198, - 6,14,12,24,24,0,24,24,13,14,28,16,1,254,15,192, - 56,96,96,16,71,216,204,72,136,200,152,200,152,136,153,152, - 201,144,70,96,96,0,56,192,15,128,11,12,24,12,0,0, - 14,0,14,0,31,0,27,0,59,128,49,128,113,192,96,192, - 127,192,255,224,192,96,192,96,9,12,24,11,1,0,254,0, - 255,0,195,128,193,128,195,128,255,0,255,0,195,128,193,128, - 195,128,255,0,254,0,10,12,24,12,1,0,31,0,63,128, - 113,192,96,192,224,0,192,0,192,0,224,0,96,192,113,192, - 63,128,31,0,10,12,24,12,1,0,252,0,255,0,195,128, - 193,128,193,192,192,192,192,192,193,192,193,128,195,128,255,0, - 252,0,8,12,12,10,1,0,255,255,192,192,192,254,254,192, - 192,192,255,255,8,12,12,10,1,0,255,255,192,192,192,254, - 254,192,192,192,192,192,10,12,24,12,1,0,31,0,63,128, - 113,192,96,192,224,0,192,0,195,192,227,192,96,192,113,192, - 63,192,30,192,10,12,24,12,1,0,192,192,192,192,192,192, - 192,192,255,192,255,192,192,192,192,192,192,192,192,192,192,192, - 192,192,2,12,12,4,1,0,192,192,192,192,192,192,192,192, - 192,192,192,192,7,12,12,9,1,0,6,6,6,6,6,6, - 6,6,198,198,254,124,10,12,24,12,1,0,193,192,195,128, - 199,0,206,0,220,0,248,0,252,0,206,0,199,0,195,128, - 193,192,192,192,8,12,12,10,1,0,192,192,192,192,192,192, - 192,192,192,192,255,255,11,12,24,13,1,0,224,224,224,224, - 224,224,241,224,241,224,209,96,219,96,219,96,202,96,206,96, - 206,96,196,96,10,12,24,12,1,0,224,192,240,192,240,192, - 216,192,216,192,204,192,204,192,198,192,198,192,195,192,195,192, - 193,192,11,12,24,13,1,0,31,0,63,128,113,192,96,192, - 224,224,192,96,192,96,224,224,96,192,113,192,63,128,31,0, - 9,12,24,11,1,0,254,0,255,0,195,128,193,128,193,128, - 195,128,255,0,254,0,192,0,192,0,192,0,192,0,11,13, - 26,13,1,255,31,0,63,128,113,192,96,192,224,224,192,96, - 192,96,226,96,103,192,115,192,63,128,31,192,0,128,10,12, - 24,12,1,0,255,0,255,128,193,128,193,128,195,128,255,0, - 255,0,195,128,193,128,193,128,193,192,193,192,9,12,24,11, - 1,0,62,0,127,0,227,128,193,128,240,0,126,0,31,0, - 3,128,193,128,227,128,127,0,62,0,10,12,24,10,0,0, - 255,192,255,192,12,0,12,0,12,0,12,0,12,0,12,0, - 12,0,12,0,12,0,12,0,10,12,24,12,1,0,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 225,192,127,128,63,0,10,12,24,11,0,0,192,192,192,192, - 97,128,97,128,97,128,51,0,51,0,51,0,30,0,30,0, - 12,0,12,0,14,12,24,15,0,0,195,12,195,12,195,12, - 99,24,103,152,103,152,52,176,60,240,60,240,24,96,24,96, - 24,96,9,12,24,11,1,0,193,128,227,128,99,0,54,0, - 62,0,28,0,28,0,62,0,54,0,99,0,227,128,193,128, - 10,12,24,11,0,0,192,192,225,192,97,128,51,0,51,0, - 30,0,30,0,12,0,12,0,12,0,12,0,12,0,8,12, - 12,10,1,0,255,255,7,6,12,28,56,48,96,224,255,255, - 4,15,15,6,1,253,240,240,192,192,192,192,192,192,192,192, - 192,192,192,240,240,4,12,12,5,0,0,128,128,192,64,64, - 96,32,32,48,16,16,16,4,15,15,6,0,253,240,240,48, - 48,48,48,48,48,48,48,48,48,48,240,240,8,7,7,10, - 1,5,24,24,60,102,102,195,195,9,1,2,9,0,253,255, - 128,3,3,3,6,2,10,128,192,32,8,9,9,9,1,0, - 124,254,198,14,126,230,198,254,119,8,12,12,10,1,0,192, - 192,192,220,254,231,195,195,195,231,254,220,8,9,9,9,1, - 0,60,126,231,192,192,192,231,126,60,8,12,12,10,1,0, - 3,3,3,63,127,231,195,195,195,231,127,59,8,9,9,10, - 1,0,60,126,195,255,255,192,231,126,60,4,12,12,6,1, - 0,48,112,96,240,240,96,96,96,96,96,96,96,8,13,13, - 10,1,252,59,127,231,195,195,195,231,127,59,3,231,126,60, - 8,12,12,10,1,0,192,192,192,222,255,227,195,195,195,195, - 195,195,2,12,12,4,1,0,192,192,0,192,192,192,192,192, - 192,192,192,192,3,16,16,5,1,252,96,96,0,96,96,96, - 96,96,96,96,96,96,96,96,224,192,8,12,12,9,1,0, - 192,192,192,199,206,220,248,252,236,206,198,199,2,12,12,4, - 1,0,192,192,192,192,192,192,192,192,192,192,192,192,12,9, - 18,14,1,0,222,224,255,240,231,48,198,48,198,48,198,48, - 198,48,198,48,198,48,8,9,9,10,1,0,222,255,227,195, - 195,195,195,195,195,8,9,9,10,1,0,60,126,231,195,195, - 195,231,126,60,8,13,13,10,1,252,220,254,231,195,195,195, - 231,254,220,192,192,192,192,8,13,13,10,1,252,59,127,231, - 195,195,195,231,127,59,3,3,3,3,5,9,9,6,1,0, - 216,248,224,192,192,192,192,192,192,7,9,9,9,1,0,124, - 254,198,240,124,14,198,254,124,4,11,11,6,1,0,96,96, - 240,240,96,96,96,96,96,112,48,8,9,9,10,1,0,195, - 195,195,195,195,195,199,255,123,8,9,9,9,0,0,195,195, - 102,102,102,60,60,24,24,12,9,18,13,0,0,198,48,198, - 48,102,96,102,96,111,96,63,192,57,192,25,128,25,128,7, - 9,9,9,1,0,198,198,108,124,56,124,108,198,198,8,13, - 13,9,0,252,195,195,99,102,54,54,60,28,24,24,24,112, - 96,7,9,9,8,0,0,254,254,14,28,24,56,112,254,254, - 4,15,15,6,1,253,48,112,96,96,96,96,96,192,96,96, - 96,96,96,112,48,1,16,16,4,1,252,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128,128,128,4,15,15,6,1, - 253,192,224,96,96,96,96,96,48,96,96,96,96,96,224,192, - 8,3,3,10,1,3,113,153,142,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,5,0,0,2,12,12,6,1,253,192,192,0,64,64, - 64,192,192,192,192,192,192,8,11,11,9,0,255,4,60,126, - 239,200,216,208,247,126,60,32,8,12,12,9,0,0,28,62, - 99,99,96,48,124,48,48,32,127,255,7,7,7,9,1,2, - 186,124,198,198,198,124,186,8,12,12,9,0,0,195,195,102, - 102,60,24,126,24,126,24,24,24,1,16,16,5,2,252,128, - 128,128,128,128,128,128,0,0,128,128,128,128,128,128,128,8, - 15,15,9,0,253,60,126,102,96,120,126,199,195,243,126,30, - 6,102,126,60,5,2,2,6,0,10,216,216,12,12,24,12, - 0,0,15,0,57,192,96,96,79,32,217,176,144,16,144,16, - 217,176,79,32,96,32,57,192,15,0,5,7,7,6,1,5, - 96,144,112,144,120,0,248,8,6,6,9,0,2,51,102,204, - 204,102,51,8,5,5,10,0,2,255,255,3,3,3,4,2, - 2,5,0,3,240,240,12,12,24,12,0,0,15,0,57,192, - 96,96,95,32,217,176,153,144,158,16,219,48,91,32,96,96, - 57,192,15,0,5,1,1,6,0,10,248,4,5,5,7,1, - 7,96,144,144,144,96,8,11,11,10,1,0,24,24,24,255, - 255,24,24,24,0,255,255,5,7,7,6,0,5,112,216,216, - 48,96,248,248,5,7,7,6,0,5,112,216,24,48,24,216, - 112,3,3,3,6,1,10,32,96,128,8,12,12,10,1,253, - 195,195,195,195,195,195,199,255,251,192,192,192,8,15,15,9, - 0,253,127,242,242,242,242,242,114,18,18,18,18,18,18,18, - 18,2,2,2,5,1,4,192,192,5,4,4,6,0,252,32, - 48,152,112,4,7,7,6,1,5,48,240,240,48,48,48,48, - 5,7,7,6,0,5,112,216,136,216,112,0,248,8,6,6, - 9,1,2,204,102,51,51,102,204,13,12,24,14,1,0,48, - 192,240,128,241,128,49,0,51,48,50,112,54,240,4,176,13, - 176,9,248,24,48,16,48,12,12,24,14,0,0,48,128,241, - 128,241,0,51,0,50,0,54,224,53,176,13,176,8,96,24, - 192,17,240,49,240,13,12,24,14,0,0,112,64,216,192,24, - 128,49,128,25,48,219,112,114,240,6,176,5,176,13,248,8, - 48,24,48,7,12,12,10,1,253,48,48,0,48,48,96,224, - 192,198,198,254,124,11,14,28,12,0,0,4,0,0,0,14, - 0,14,0,31,0,27,0,59,128,49,128,113,192,96,192,127, - 192,255,224,192,96,192,96,11,14,28,12,0,0,8,0,0, - 0,14,0,14,0,31,0,27,0,59,128,49,128,113,192,96, - 192,127,192,255,224,192,96,192,96,11,14,28,12,0,0,17, - 0,0,0,14,0,14,0,31,0,27,0,59,128,49,128,113, - 192,96,192,127,192,255,224,192,96,192,96,11,14,28,12,0, - 0,23,0,0,0,14,0,14,0,31,0,27,0,59,128,49, - 128,113,192,96,192,127,192,255,224,192,96,192,96,11,14,28, - 12,0,0,49,128,0,0,14,0,14,0,31,0,27,0,59, - 128,49,128,113,192,96,192,127,192,255,224,192,96,192,96,11, - 14,28,12,0,0,18,0,12,0,14,0,14,0,31,0,27, - 0,59,128,49,128,113,192,96,192,127,192,255,224,192,96,192, - 96,14,12,24,15,0,0,31,252,31,252,27,0,51,0,51, - 0,51,248,99,248,127,0,127,0,195,0,195,252,195,252,10, - 16,32,12,1,252,31,0,63,128,113,192,96,192,224,0,192, - 0,192,0,224,0,96,192,113,192,63,128,31,0,4,0,6, - 0,19,0,14,0,8,14,14,10,1,0,8,0,255,255,192, - 192,192,254,254,192,192,192,255,255,8,14,14,10,1,0,16, - 0,255,255,192,192,192,254,254,192,192,192,255,255,8,14,14, - 10,1,0,34,0,255,255,192,192,192,254,254,192,192,192,255, - 255,8,14,14,10,1,0,102,0,255,255,192,192,192,254,254, - 192,192,192,255,255,2,14,14,4,1,0,64,0,192,192,192, - 192,192,192,192,192,192,192,192,192,2,14,14,4,1,0,128, - 0,192,192,192,192,192,192,192,192,192,192,192,192,5,14,14, - 5,0,0,136,0,96,96,96,96,96,96,96,96,96,96,96, - 96,5,14,14,5,0,0,152,0,96,96,96,96,96,96,96, - 96,96,96,96,96,12,12,24,12,0,0,63,0,63,192,48, - 224,48,96,48,112,252,48,252,48,48,112,48,96,48,224,63, - 192,63,0,10,14,28,12,1,0,46,0,0,0,224,192,240, - 192,240,192,216,192,216,192,204,192,204,192,198,192,198,192,195, - 192,195,192,193,192,11,14,28,13,1,0,2,0,0,0,31, - 0,63,128,113,192,96,192,224,224,192,96,192,96,224,224,96, - 192,113,192,63,128,31,0,11,14,28,13,1,0,4,0,0, - 0,31,0,63,128,113,192,96,192,224,224,192,96,192,96,224, - 224,96,192,113,192,63,128,31,0,11,14,28,13,1,0,17, - 0,0,0,31,0,63,128,113,192,96,192,224,224,192,96,192, - 96,224,224,96,192,113,192,63,128,31,0,11,14,28,13,1, - 0,23,0,0,0,31,0,63,128,113,192,96,192,224,224,192, - 96,192,96,224,224,96,192,113,192,63,128,31,0,11,14,28, - 13,1,0,25,128,0,0,31,0,63,128,113,192,96,192,224, - 224,192,96,192,96,224,224,96,192,113,192,63,128,31,0,9, - 9,18,10,0,0,65,0,227,128,119,0,62,0,28,0,62, - 0,119,0,227,128,65,0,11,12,24,13,1,0,31,32,63, - 192,112,192,97,192,227,96,198,96,204,96,216,224,112,192,97, - 192,127,128,159,0,10,14,28,12,1,0,4,0,0,0,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,225,192,127,128,63,0,10,14,28,12,1,0,8,0,0, - 0,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,225,192,127,128,63,0,10,14,28,12,1,0,17, - 0,0,0,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,225,192,127,128,63,0,10,14,28,12,1, - 0,51,0,0,0,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,225,192,127,128,63,0,10,14,28, - 11,0,0,8,0,0,0,192,192,225,192,97,128,51,0,51, - 0,30,0,30,0,12,0,12,0,12,0,12,0,12,0,9, - 12,24,11,1,0,192,0,254,0,255,0,195,128,193,128,193, - 128,195,128,255,0,254,0,192,0,192,0,192,0,8,12,12, - 10,1,0,124,254,198,198,220,222,195,195,195,195,222,220,8, - 13,13,9,1,0,32,48,8,0,124,254,198,14,126,230,198, - 254,119,8,13,13,9,1,0,4,12,16,0,124,254,198,14, - 126,230,198,254,119,8,13,13,9,1,0,16,56,68,0,124, - 254,198,14,126,230,198,254,119,8,12,12,9,1,0,58,92, - 0,124,254,198,14,126,230,198,254,119,8,12,12,9,1,0, - 108,108,0,124,254,198,14,126,230,198,254,119,8,13,13,9, - 1,0,24,36,36,24,124,254,198,14,126,230,198,254,119,13, - 9,18,15,1,0,125,224,255,240,198,24,15,248,127,248,230, - 0,207,56,255,240,121,224,8,13,13,9,1,252,60,126,231, - 192,192,192,231,126,60,16,24,76,56,8,13,13,10,1,0, - 32,48,8,0,60,126,195,255,255,192,231,126,60,8,13,13, - 10,1,0,4,12,16,0,60,126,195,255,255,192,231,126,60, - 8,13,13,10,1,0,8,28,34,0,60,126,195,255,255,192, - 231,126,60,8,12,12,10,1,0,54,54,0,60,126,195,255, - 255,192,231,126,60,3,13,13,4,0,0,128,192,32,0,96, - 96,96,96,96,96,96,96,96,3,13,13,4,1,0,32,96, - 128,0,192,192,192,192,192,192,192,192,192,5,13,13,5,0, - 0,32,112,136,0,96,96,96,96,96,96,96,96,96,5,12, - 12,5,0,0,216,216,0,96,96,96,96,96,96,96,96,96, - 8,12,12,10,1,0,96,124,248,28,126,231,195,195,195,231, - 126,60,8,12,12,10,1,0,58,92,0,222,255,227,195,195, - 195,195,195,195,8,13,13,10,1,0,32,48,8,0,60,126, - 231,195,195,195,231,126,60,8,13,13,10,1,0,8,24,32, - 0,60,126,231,195,195,195,231,126,60,8,13,13,10,1,0, - 16,56,68,0,60,126,231,195,195,195,231,126,60,8,12,12, - 10,1,0,58,92,0,60,126,231,195,195,195,231,126,60,8, - 12,12,10,1,0,108,108,0,60,126,231,195,195,195,231,126, - 60,8,8,8,10,1,0,24,24,0,255,255,0,24,24,8, - 9,9,10,1,0,61,127,231,207,219,243,231,254,188,8,13, - 13,10,1,0,32,48,8,0,195,195,195,195,195,195,199,255, - 123,8,13,13,10,1,0,8,24,32,0,195,195,195,195,195, - 195,199,255,123,8,13,13,10,1,0,16,56,68,0,195,195, - 195,195,195,195,199,255,123,8,12,12,10,1,0,108,108,0, - 195,195,195,195,195,195,199,255,123,8,17,17,9,0,252,4, - 12,16,0,195,195,99,102,54,54,60,28,24,24,24,112,96, - 8,16,16,10,1,252,192,192,192,220,254,231,195,195,195,231, - 254,220,192,192,192,192,8,16,16,9,0,252,54,54,0,195, - 195,99,102,54,54,60,28,24,24,24,112,96 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp deleted file mode 100644 index a27ea43697..0000000000 --- a/Marlin/src/lcd/tft/fontdata/helvetica_14.cpp +++ /dev/null @@ -1,378 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* - Fontname: Helvetica - Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. - Capital A Height: 14, '1' Height: 13 - Calculated Max Values w=16 h=18 x= 2 y=12 dx=18 dy= 0 ascent=16 len=36 - Font Bounding box w=18 h=19 x= 0 y=-4 - Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 - Pure Font ascent =14 descent=-4 - X Font ascent =14 descent=-4 - Max Font ascent =16 descent=-4 -*/ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -#include - -/* -typedef struct __attribute__((__packed__)) { - uint8_t BBXWidth; - uint8_t BBXHeight; - uint8_t DataSize; - int8_t DWidth; - int8_t BBXOffsetX; - int8_t BBXOffsetY; -} tGlyph; -*/ - -extern const uint8_t Helvetica14_symbols[63] = { - 0,18,19,0,252,14,0,0,0,0,1,9,252,16,252,14,252, // tFont - 0,0,0,0,0,0, // 0x01 - LCD_STR_REFRESH - 0,0,0,0,0,0, // 0x02 - LCD_STR_FOLDER - 255, // 0x03 - LCD_STR_ARROW_RIGHT - 255, // 0x04 - LCD_STR_UPLEVEL - 255, // 0x05 - LCD_STR_CLOCK - 255, // 0x06 - LCD_STR_FEEDRATE - 255, // 0x07 - LCD_STR_BEDTEMP - 5,12,12,6,0,1,32,80,80,80,80,80,80,80,136,136,136,112, // 0x08 - LCD_STR_THERMOMETER - 5,5,5,5,0,11,112,216,136,216,112, // 0x09 - LCD_STR_DEGREE -}; - -extern const uint8_t Helvetica14[5005] = { - 0,18,19,0,252,14,2,150,6,83,32,255,252,16,252,14,252, // tFont - 0,0,0,5,0,0,2,14,14,6,2,0,192,192,192, - 192,192,192,192,192,192,192,0,0,192,192,5,5,5,5,0, - 9,216,216,216,216,216,10,13,26,10,0,0,9,0,9,0, - 9,0,127,192,127,192,18,0,18,0,18,0,255,128,255,128, - 36,0,36,0,36,0,9,16,32,10,1,254,8,0,62,0, - 127,0,203,0,200,0,232,0,120,0,62,0,15,0,9,128, - 201,128,235,128,127,0,62,0,8,0,8,0,14,13,26,16, - 1,0,120,96,204,192,204,192,205,128,205,128,123,0,3,0, - 6,120,6,204,12,204,12,204,24,204,24,120,12,13,26,13, - 1,0,60,0,126,0,102,0,102,0,60,0,124,0,238,192, - 198,192,195,192,195,128,231,192,126,224,60,112,2,5,5,4, - 1,9,192,192,192,192,192,4,18,18,6,0,252,16,48,96, - 96,192,192,192,192,192,192,192,192,192,192,96,96,48,16,4, - 18,18,6,1,252,128,192,96,96,48,48,48,48,48,48,48, - 48,48,48,96,96,192,128,5,7,7,7,1,7,32,168,248, - 32,248,168,32,8,10,10,10,1,0,24,24,24,24,255,255, - 24,24,24,24,2,5,5,5,1,253,192,192,64,64,128,5, - 2,2,6,0,4,248,248,2,2,2,5,1,0,192,192,5, - 14,14,5,0,0,24,24,24,24,48,48,48,96,96,96,192, - 192,192,192,8,13,13,10,1,0,60,126,102,195,195,195,195, - 195,195,195,102,126,60,5,13,13,10,2,0,24,248,248,24, - 24,24,24,24,24,24,24,24,24,8,13,13,10,1,0,60, - 254,195,3,7,14,28,56,112,224,192,255,255,8,13,13,10, - 1,0,62,127,195,195,6,28,30,7,3,195,199,126,60,9, - 13,26,10,0,0,3,0,7,0,15,0,27,0,51,0,51, - 0,99,0,195,0,255,128,255,128,3,0,3,0,3,0,8, - 13,13,10,1,0,254,254,192,192,252,254,199,3,3,195,199, - 254,124,8,13,13,10,1,0,60,127,99,192,192,220,254,195, - 195,195,227,126,60,8,13,13,10,1,0,255,255,3,6,12, - 12,24,24,48,48,96,96,96,8,13,13,10,1,0,60,126, - 231,195,195,102,126,231,195,195,231,126,60,8,13,13,10,1, - 0,60,126,199,195,195,195,127,59,3,3,198,254,124,2,10, - 10,5,1,0,192,192,0,0,0,0,0,0,192,192,2,13, - 13,5,1,253,192,192,0,0,0,0,0,0,192,192,64,64, - 128,8,9,9,10,1,0,3,15,60,112,192,112,60,15,3, - 7,5,5,11,2,2,254,254,0,254,254,8,9,9,10,1, - 0,192,240,60,14,3,14,60,240,192,7,14,14,10,1,0, - 124,254,198,198,14,28,56,48,48,48,0,0,48,48,16,17, - 34,18,1,253,3,240,15,252,28,14,48,6,99,211,103,115, - 198,51,204,99,204,102,204,102,204,204,207,248,103,112,112,0, - 56,0,31,240,7,224,12,14,28,13,0,0,6,0,6,0, - 15,0,15,0,25,128,25,128,48,192,48,192,63,192,127,224, - 96,96,96,96,192,48,192,48,11,14,28,13,1,0,255,0, - 255,128,193,192,192,192,192,192,193,128,255,128,255,192,192,224, - 192,96,192,96,192,224,255,192,255,128,12,14,28,14,1,0, - 15,128,63,224,112,112,96,48,224,0,192,0,192,0,192,0, - 192,0,224,0,96,48,112,112,63,224,15,128,12,14,28,14, - 1,0,255,128,255,192,192,224,192,96,192,48,192,48,192,48, - 192,48,192,48,192,48,192,96,192,224,255,192,255,128,10,14, - 28,13,2,0,255,192,255,192,192,0,192,0,192,0,192,0, - 255,128,255,128,192,0,192,0,192,0,192,0,255,192,255,192, - 9,14,28,12,2,0,255,128,255,128,192,0,192,0,192,0, - 192,0,255,0,255,0,192,0,192,0,192,0,192,0,192,0, - 192,0,13,14,28,15,1,0,15,192,63,240,112,56,96,24, - 224,24,192,0,192,0,192,248,192,248,224,24,96,24,112,56, - 63,248,15,216,11,14,28,14,1,0,192,96,192,96,192,96, - 192,96,192,96,192,96,255,224,255,224,192,96,192,96,192,96, - 192,96,192,96,192,96,2,14,14,6,2,0,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,8,14,14,10,0,0, - 3,3,3,3,3,3,3,3,3,195,195,231,126,60,11,14, - 28,14,2,0,192,224,193,192,195,128,199,0,206,0,220,0, - 248,0,252,0,206,0,199,0,195,128,193,192,192,224,192,96, - 9,14,28,11,1,0,192,0,192,0,192,0,192,0,192,0, - 192,0,192,0,192,0,192,0,192,0,192,0,192,0,255,128, - 255,128,14,14,28,16,1,0,192,12,192,12,224,28,224,28, - 240,60,240,60,216,108,216,108,204,204,204,204,196,140,199,140, - 195,12,195,12,11,14,28,14,1,0,192,96,224,96,240,96, - 240,96,216,96,204,96,204,96,198,96,198,96,195,96,193,224, - 193,224,192,224,192,96,13,14,28,15,1,0,15,128,63,224, - 112,112,96,48,224,56,192,24,192,24,192,24,192,24,224,56, - 96,48,112,112,63,224,15,128,10,14,28,13,2,0,255,0, - 255,128,193,192,192,192,192,192,193,192,255,128,255,0,192,0, - 192,0,192,0,192,0,192,0,192,0,13,15,30,15,1,255, - 15,128,63,224,112,112,96,48,224,56,192,24,192,24,192,24, - 192,24,225,184,97,176,112,240,63,224,15,176,0,48,11,14, - 28,14,1,0,255,128,255,192,192,224,192,96,192,96,192,224, - 255,192,255,128,192,192,192,192,192,96,192,96,192,96,192,96, - 10,14,28,13,1,0,30,0,127,128,225,192,192,192,224,0, - 124,0,31,0,3,128,1,192,0,192,192,192,225,192,127,128, - 63,0,10,14,28,12,1,0,255,192,255,192,12,0,12,0, - 12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, - 12,0,12,0,11,14,28,14,1,0,192,96,192,96,192,96, - 192,96,192,96,192,96,192,96,192,96,192,96,192,96,192,96, - 96,192,127,192,31,0,12,14,28,13,0,0,192,48,192,48, - 96,96,96,96,96,96,48,192,48,192,48,192,25,128,25,128, - 25,128,15,0,15,0,6,0,16,14,28,18,1,0,193,131, - 193,131,193,131,195,195,99,198,98,70,102,102,102,102,54,108, - 54,108,52,44,28,56,24,24,24,24,11,14,28,13,1,0, - 192,96,192,96,96,192,113,192,49,128,27,0,14,0,14,0, - 27,0,49,128,113,192,96,192,192,96,192,96,12,14,28,13, - 0,0,192,48,192,48,96,96,96,96,48,192,57,192,25,128, - 15,0,6,0,6,0,6,0,6,0,6,0,6,0,10,14, - 28,12,1,0,255,192,255,192,0,192,1,128,3,0,6,0, - 12,0,28,0,24,0,48,0,96,0,192,0,255,192,255,192, - 4,18,18,5,0,252,240,240,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,240,240,5,14,14,5,0,0,192,192, - 192,96,96,96,48,48,48,48,24,24,24,24,4,18,18,5, - 0,252,240,240,48,48,48,48,48,48,48,48,48,48,48,48, - 48,48,240,240,7,6,6,9,1,7,16,56,108,108,198,198, - 11,2,4,11,0,252,255,224,255,224,4,3,3,4,0,11, - 192,96,48,9,10,20,11,1,0,126,0,231,0,195,0,7, - 0,127,0,227,0,195,0,195,0,231,128,121,128,9,14,28, - 11,1,0,192,0,192,0,192,0,192,0,222,0,255,0,227, - 0,193,128,193,128,193,128,193,128,227,0,255,0,222,0,8, - 10,10,10,1,0,62,127,99,192,192,192,192,99,127,62,9, - 14,28,11,1,0,1,128,1,128,1,128,1,128,61,128,127, - 128,99,128,193,128,193,128,193,128,193,128,99,128,127,128,61, - 128,8,10,10,10,1,0,60,126,195,195,255,192,192,227,127, - 60,6,14,14,6,0,0,28,60,48,48,252,252,48,48,48, - 48,48,48,48,48,9,14,28,11,1,252,61,128,127,128,97, - 128,193,128,193,128,193,128,193,128,99,128,127,128,61,128,1, - 128,99,0,127,0,28,0,8,14,14,10,1,0,192,192,192, - 192,222,255,227,195,195,195,195,195,195,195,2,14,14,4,1, - 0,192,192,0,0,192,192,192,192,192,192,192,192,192,192,3, - 18,18,4,0,252,96,96,0,0,96,96,96,96,96,96,96, - 96,96,96,96,96,224,192,8,14,14,9,1,0,192,192,192, - 192,198,204,216,240,248,216,204,206,198,199,2,14,14,4,1, - 0,192,192,192,192,192,192,192,192,192,192,192,192,192,192,14, - 10,20,16,1,0,222,120,255,252,227,140,195,12,195,12,195, - 12,195,12,195,12,195,12,195,12,8,10,10,10,1,0,222, - 255,227,195,195,195,195,195,195,195,9,10,20,11,1,0,62, - 0,127,0,99,0,193,128,193,128,193,128,193,128,99,0,127, - 0,62,0,9,14,28,11,1,252,222,0,255,0,227,0,193, - 128,193,128,193,128,193,128,227,0,255,0,222,0,192,0,192, - 0,192,0,192,0,9,14,28,11,1,252,61,128,127,128,99, - 128,193,128,193,128,193,128,193,128,99,128,127,128,61,128,1, - 128,1,128,1,128,1,128,5,10,10,6,1,0,216,216,224, - 192,192,192,192,192,192,192,7,10,10,9,1,0,60,126,198, - 192,252,62,6,198,252,120,6,13,13,6,0,0,48,48,48, - 252,252,48,48,48,48,48,48,60,28,8,10,10,10,1,0, - 195,195,195,195,195,195,195,199,255,123,8,10,10,10,1,0, - 195,195,195,102,102,102,36,60,24,24,12,10,20,14,1,0, - 198,48,198,48,198,48,102,96,102,96,105,96,41,64,57,192, - 25,128,25,128,8,10,10,10,1,0,195,231,102,60,24,24, - 60,102,231,195,8,14,14,10,1,252,195,195,195,102,102,102, - 36,60,24,24,24,24,112,112,7,10,10,9,1,0,254,254, - 6,12,24,48,96,192,254,254,5,18,18,6,0,252,24,48, - 96,96,96,96,96,192,128,192,96,96,96,96,96,96,48,24, - 2,18,18,5,1,252,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,6,18,18,6,0,252,192,96, - 48,48,48,48,48,24,12,24,48,48,48,48,48,48,96,192, - 8,3,3,10,1,4,115,255,206,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,5,0,0,2,14,14,6,2,252,192,192,0,0,64, - 64,192,192,192,192,192,192,192,192,8,14,14,10,1,254,4, - 4,62,127,107,200,200,200,200,107,127,62,16,16,9,13,26, - 10,0,0,30,0,63,0,97,128,97,128,96,0,48,0,126, - 0,24,0,24,0,48,0,96,128,255,128,223,0,8,7,7, - 10,1,3,195,255,102,102,102,255,195,8,13,13,10,1,0, - 195,195,102,102,102,60,255,24,255,24,24,24,24,2,18,18, - 5,1,252,192,192,192,192,192,192,192,0,0,0,0,192,192, - 192,192,192,192,192,8,18,18,10,1,252,60,126,195,195,240, - 124,110,199,195,227,115,62,14,7,195,195,126,60,5,2,2, - 6,0,12,216,216,13,14,28,15,1,0,15,128,48,96,64, - 16,71,16,136,136,144,136,144,8,144,8,144,8,136,136,71, - 16,64,16,48,96,15,128,5,8,8,7,1,6,112,152,56, - 72,216,104,0,248,7,6,6,9,1,2,54,108,216,216,108, - 54,9,5,10,11,1,3,255,128,255,128,1,128,1,128,1, - 128,5,1,1,6,0,5,248,13,14,28,14,0,0,15,128, - 48,96,64,16,79,144,136,72,136,72,136,72,143,136,137,8, - 136,136,72,80,64,16,48,96,15,128,5,1,1,5,0,12, - 248,5,5,5,7,1,8,112,216,136,216,112,8,11,11,10, - 1,0,24,24,24,255,255,24,24,24,0,255,255,5,8,8, - 6,0,5,112,248,152,24,48,96,248,248,5,8,8,6,0, - 5,112,248,152,48,48,152,248,112,4,3,3,4,0,11,48, - 96,192,8,14,14,10,1,252,195,195,195,195,195,195,195,231, - 255,219,192,192,192,192,8,18,18,10,1,252,63,114,242,242, - 242,242,242,114,50,18,18,18,18,18,18,18,18,18,2,2, - 2,4,1,4,192,192,5,5,5,5,0,252,96,112,24,216, - 240,4,8,8,6,0,5,48,240,240,48,48,48,48,48,5, - 8,8,7,1,6,112,216,136,136,216,112,0,248,7,6,6, - 9,1,2,216,108,54,54,108,216,14,13,26,15,0,0,48, - 48,240,48,240,96,48,192,48,192,49,136,49,24,51,56,6, - 120,6,216,12,252,24,24,24,24,14,13,26,15,0,0,48, - 48,240,48,240,96,48,192,48,192,49,184,49,124,51,76,6, - 12,6,24,12,48,24,124,24,124,14,13,26,15,0,0,112, - 48,248,48,152,96,48,192,48,192,153,136,249,24,115,56,6, - 120,6,216,12,252,24,24,24,24,7,14,14,10,1,252,24, - 24,0,0,24,24,24,56,112,224,198,198,254,124,12,16,32, - 13,0,0,6,0,0,0,6,0,6,0,15,0,15,0,25, - 128,25,128,48,192,48,192,63,192,127,224,96,96,96,96,192, - 48,192,48,12,16,32,13,0,0,6,0,0,0,6,0,6, - 0,15,0,15,0,25,128,25,128,48,192,48,192,63,192,127, - 224,96,96,96,96,192,48,192,48,12,16,32,13,0,0,25, - 128,0,0,6,0,6,0,15,0,15,0,25,128,25,128,48, - 192,48,192,63,192,127,224,96,96,96,96,192,48,192,48,12, - 16,32,13,0,0,19,0,0,0,6,0,6,0,15,0,15, - 0,25,128,25,128,48,192,48,192,63,192,127,224,96,96,96, - 96,192,48,192,48,12,16,32,13,0,0,25,128,0,0,6, - 0,6,0,15,0,15,0,25,128,25,128,48,192,48,192,63, - 192,127,224,96,96,96,96,192,48,192,48,12,16,32,13,0, - 0,9,0,9,0,6,0,6,0,15,0,15,0,25,128,25, - 128,48,192,48,192,63,192,127,224,96,96,96,96,192,48,192, - 48,16,14,28,18,1,0,7,255,7,255,13,128,13,128,25, - 128,25,128,49,254,49,254,63,128,127,128,97,128,97,128,193, - 255,193,255,12,18,36,14,1,252,15,128,63,224,112,112,96, - 48,224,0,192,0,192,0,192,0,192,0,224,0,96,48,112, - 112,63,224,15,128,6,0,3,0,27,0,30,0,10,16,32, - 13,2,0,12,0,0,0,255,192,255,192,192,0,192,0,192, - 0,192,0,255,128,255,128,192,0,192,0,192,0,192,0,255, - 192,255,192,10,16,32,13,2,0,12,0,0,0,255,192,255, - 192,192,0,192,0,192,0,192,0,255,128,255,128,192,0,192, - 0,192,0,192,0,255,192,255,192,10,16,32,13,2,0,51, - 0,0,0,255,192,255,192,192,0,192,0,192,0,192,0,255, - 128,255,128,192,0,192,0,192,0,192,0,255,192,255,192,10, - 16,32,13,2,0,51,0,0,0,255,192,255,192,192,0,192, - 0,192,0,192,0,255,128,255,128,192,0,192,0,192,0,192, - 0,255,192,255,192,2,16,16,6,2,0,192,0,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,2,16,16,6,2, - 0,192,0,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,6,16,16,6,0,0,132,0,48,48,48,48,48,48,48, - 48,48,48,48,48,48,48,6,16,16,6,0,0,204,0,48, - 48,48,48,48,48,48,48,48,48,48,48,48,48,13,14,28, - 14,0,0,127,192,127,224,96,112,96,48,96,24,96,24,252, - 24,252,24,96,24,96,24,96,48,96,112,127,224,127,192,11, - 16,32,14,1,0,19,0,0,0,192,96,224,96,240,96,240, - 96,216,96,204,96,204,96,198,96,198,96,195,96,193,224,193, - 224,192,224,192,96,13,16,32,15,1,0,6,0,0,0,15, - 128,63,224,112,112,96,48,224,56,192,24,192,24,192,24,192, - 24,224,56,96,48,112,112,63,224,15,128,13,16,32,15,1, - 0,6,0,0,0,15,128,63,224,112,112,96,48,224,56,192, - 24,192,24,192,24,192,24,224,56,96,48,112,112,63,224,15, - 128,13,16,32,15,1,0,12,192,0,0,15,128,63,224,112, - 112,96,48,224,56,192,24,192,24,192,24,192,24,224,56,96, - 48,112,112,63,224,15,128,13,16,32,15,1,0,9,128,0, - 0,15,128,63,224,112,112,96,48,224,56,192,24,192,24,192, - 24,192,24,224,56,96,48,112,112,63,224,15,128,13,16,32, - 15,1,0,12,192,0,0,15,128,63,224,112,112,96,48,224, - 56,192,24,192,24,192,24,192,24,224,56,96,48,112,112,63, - 224,15,128,10,9,18,10,0,0,192,192,97,128,51,0,30, - 0,12,0,30,0,51,0,97,128,192,192,14,14,28,15,0, - 0,7,204,31,248,56,48,48,120,112,220,97,140,99,12,98, - 12,102,12,108,28,56,24,56,56,111,240,199,192,11,16,32, - 14,1,0,6,0,0,0,192,96,192,96,192,96,192,96,192, - 96,192,96,192,96,192,96,192,96,192,96,192,96,96,192,127, - 192,31,0,11,16,32,14,1,0,12,0,0,0,192,96,192, - 96,192,96,192,96,192,96,192,96,192,96,192,96,192,96,192, - 96,192,96,96,192,127,192,31,0,11,16,32,14,1,0,25, - 128,0,0,192,96,192,96,192,96,192,96,192,96,192,96,192, - 96,192,96,192,96,192,96,192,96,96,192,127,192,31,0,11, - 16,32,14,1,0,49,128,0,0,192,96,192,96,192,96,192, - 96,192,96,192,96,192,96,192,96,192,96,192,96,192,96,96, - 192,127,192,31,0,12,16,32,13,0,0,6,0,0,0,192, - 48,192,48,96,96,96,96,48,192,57,192,25,128,15,0,6, - 0,6,0,6,0,6,0,6,0,6,0,10,14,28,12,1, - 0,192,0,192,0,192,0,255,0,255,128,193,192,192,192,192, - 192,193,192,255,128,255,0,192,0,192,0,192,0,7,14,14, - 9,1,0,56,124,198,198,198,198,220,220,198,198,198,198,222, - 220,9,14,28,11,1,0,48,0,24,0,12,0,0,0,126, - 0,231,0,195,0,7,0,127,0,227,0,195,0,195,0,231, - 128,121,128,9,14,28,11,1,0,12,0,24,0,48,0,0, - 0,126,0,231,0,195,0,7,0,127,0,227,0,195,0,195, - 0,231,128,121,128,9,14,28,11,1,0,24,0,60,0,102, - 0,0,0,126,0,231,0,195,0,7,0,127,0,227,0,195, - 0,195,0,231,128,121,128,9,14,28,11,1,0,50,0,90, - 0,76,0,0,0,126,0,231,0,195,0,7,0,127,0,227, - 0,195,0,195,0,231,128,121,128,9,14,28,11,1,0,102, - 0,102,0,0,0,0,0,126,0,231,0,195,0,7,0,127, - 0,227,0,195,0,195,0,231,128,121,128,9,14,28,11,1, - 0,24,0,36,0,36,0,24,0,126,0,231,0,195,0,7, - 0,127,0,227,0,195,0,195,0,231,128,121,128,14,10,20, - 17,2,0,126,240,231,248,195,12,7,12,127,252,227,0,195, - 0,195,140,231,252,122,240,8,14,14,10,1,252,62,127,99, - 192,192,192,192,99,127,62,24,12,108,120,8,14,14,10,1, - 0,48,24,12,0,60,126,195,195,255,192,192,227,127,60,8, - 14,14,10,1,0,12,24,48,0,60,126,195,195,255,192,192, - 227,127,60,8,14,14,10,1,0,24,60,102,0,60,126,195, - 195,255,192,192,227,127,60,8,14,14,10,1,0,102,102,0, - 0,60,126,195,195,255,192,192,227,127,60,4,14,14,4,0, - 0,192,96,48,0,96,96,96,96,96,96,96,96,96,96,4, - 14,14,4,0,0,48,96,192,0,96,96,96,96,96,96,96, - 96,96,96,5,14,14,5,0,0,96,240,152,0,96,96,96, - 96,96,96,96,96,96,96,5,14,14,5,0,0,216,216,0, - 0,96,96,96,96,96,96,96,96,96,96,9,14,28,11,1, - 0,96,0,54,0,56,0,76,0,62,0,127,0,99,0,193, - 128,193,128,193,128,193,128,99,0,127,0,62,0,8,14,14, - 10,1,0,50,90,76,0,222,255,227,195,195,195,195,195,195, - 195,9,14,28,11,1,0,48,0,24,0,12,0,0,0,62, - 0,127,0,99,0,193,128,193,128,193,128,193,128,99,0,127, - 0,62,0,9,14,28,11,1,0,6,0,12,0,24,0,0, - 0,62,0,127,0,99,0,193,128,193,128,193,128,193,128,99, - 0,127,0,62,0,9,14,28,11,1,0,24,0,60,0,102, - 0,0,0,62,0,127,0,99,0,193,128,193,128,193,128,193, - 128,99,0,127,0,62,0,9,14,28,11,1,0,50,0,90, - 0,76,0,0,0,62,0,127,0,99,0,193,128,193,128,193, - 128,193,128,99,0,127,0,62,0,9,14,28,11,1,0,51, - 0,51,0,0,0,0,0,62,0,127,0,99,0,193,128,193, - 128,193,128,193,128,99,0,127,0,62,0,8,8,8,10,1, - 1,24,24,0,255,255,0,24,24,11,10,20,11,0,0,14, - 96,63,192,49,128,99,192,102,192,108,192,120,192,49,128,127, - 128,206,0,8,14,14,10,1,0,48,24,12,0,195,195,195, - 195,195,195,195,199,255,123,8,14,14,10,1,0,6,12,24, - 0,195,195,195,195,195,195,195,199,255,123,8,14,14,10,1, - 0,24,60,102,0,195,195,195,195,195,195,195,199,255,123,8, - 14,14,10,1,0,102,102,0,0,195,195,195,195,195,195,195, - 199,255,123,8,18,18,10,1,252,6,12,24,0,195,195,195, - 102,102,102,36,60,24,24,24,24,112,112,9,18,36,11,1, - 252,192,0,192,0,192,0,192,0,222,0,255,0,227,0,193, - 128,193,128,193,128,193,128,227,0,255,0,222,0,192,0,192, - 0,192,0,192,0,8,18,18,10,1,252,102,102,0,0,195, - 195,195,102,102,102,36,60,24,24,24,24,112,112 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/helvetica_18.cpp b/Marlin/src/lcd/tft/fontdata/helvetica_18.cpp deleted file mode 100644 index bb5f6ccf40..0000000000 --- a/Marlin/src/lcd/tft/fontdata/helvetica_18.cpp +++ /dev/null @@ -1,492 +0,0 @@ -/* - Fontname: -Adobe-Helvetica-Medium-R-Normal--25-180-100-100-P-130-ISO10646-1 - Copyright: Copyright (c) 1984, 1987 Adobe Systems Incorporated. All Rights Reserved. Copyright (c) 1988, 1991 Digital Equipment Corporation. All Rights Reserved. - Capital A Height: 19, '1' Height: 18 - Calculated Max Values w=22 h=24 x= 3 y=16 dx=25 dy= 0 ascent=24 len=69 - Font Bounding box w=28 h=37 x=-3 y=-8 - Calculated Min Values x=-1 y=-5 dx= 0 dy= 0 - Pure Font ascent =19 descent=-5 - X Font ascent =19 descent=-5 - Max Font ascent =24 descent=-5 -*/ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -#include - -extern const uint8_t Helvetica18_symbols[71] = { - 0,28,37,253,248,19,4,37,9,49,1,9,251,24,251,19,251, // tFont - 0,0,0,0,0,0, // 0x01 - LCD_STR_REFRESH - 0,0,0,0,0,0, // 0x02 - LCD_STR_FOLDER - 255, // 0x03 - LCD_STR_ARROW_RIGHT - 255, // 0x04 - LCD_STR_UPLEVEL - 255, // 0x05 - LCD_STR_CLOCK - 255, // 0x06 - LCD_STR_FEEDRATE - 255, // 0x07 - LCD_STR_BEDTEMP - 7,18,18,8,0,1, 0,56, 68,68,68,68,68,84,84,84,84,84, 214,186,186,186,198,124, // 0x08 - LCD_STR_THERMOMETER - 7,7,7,7,0,15,56,124,198,198,198,124,56, // 0x09 - LCD_STR_DEGREE -}; - -extern const uint8_t Helvetica18[7307] = { - 0,28,37,253,248,19,4,37,9,49,32,255,251,24,251,19,251, // tFont - 0,0,0,6,0,1,2,19,19,6,2,0,192,192,192, - 192,192,192,192,192,192,192,192,192,128,128,0,0,192,192,192, - 6,6,6,8,1,13,204,204,204,204,204,68,11,17,34,14, - 2,0,12,192,12,192,12,192,25,128,255,224,255,224,25,128, - 25,128,51,0,51,0,255,224,255,224,51,0,51,0,102,0, - 102,0,102,0,11,22,44,13,1,254,6,0,6,0,31,128, - 63,192,118,224,102,96,102,96,102,0,118,0,62,0,62,0, - 15,128,7,192,6,224,6,96,198,96,198,96,230,224,127,192, - 63,128,6,0,6,0,19,18,54,22,1,0,0,6,0,60, - 12,0,126,12,0,195,24,0,195,24,0,195,48,0,195,48, - 0,126,96,0,60,96,0,0,192,0,0,199,128,1,143,192, - 1,152,96,3,24,96,3,24,96,6,24,96,6,15,192,4, - 7,128,14,18,36,17,2,0,15,0,31,128,57,192,48,192, - 48,192,48,192,25,128,15,0,30,0,63,24,115,152,97,216, - 192,240,192,96,192,240,225,216,127,156,30,0,2,6,6,6, - 2,13,192,192,192,192,192,64,5,24,24,8,2,251,24,24, - 48,48,96,96,96,192,192,192,192,192,192,192,192,192,192,96, - 96,96,48,48,24,24,5,24,24,8,1,251,192,192,96,96, - 48,48,48,24,24,24,24,24,24,24,24,24,24,48,48,48, - 96,96,192,192,7,7,7,10,1,12,16,16,214,124,56,108, - 68,12,12,24,14,1,1,6,0,6,0,6,0,6,0,6, - 0,255,240,255,240,6,0,6,0,6,0,6,0,6,0,2, - 6,6,6,2,253,192,192,192,64,64,128,6,2,2,8,1, - 6,252,252,2,3,3,6,2,0,192,192,192,7,19,19,7, - 0,0,6,4,12,12,8,24,24,16,16,48,48,32,96,96, - 64,192,192,128,128,11,18,36,13,1,0,31,0,63,128,113, - 192,96,192,96,192,224,224,192,96,192,96,192,96,192,96,192, - 96,192,96,224,224,96,192,96,192,113,192,63,128,31,0,6, - 18,18,13,2,0,12,12,28,252,252,12,12,12,12,12,12, - 12,12,12,12,12,12,12,11,18,36,13,1,0,30,0,127, - 128,97,192,192,192,192,96,192,96,0,224,0,192,1,192,3, - 128,15,0,28,0,56,0,112,0,224,0,192,0,255,224,255, - 224,11,18,36,13,1,0,31,0,127,128,97,128,192,192,192, - 192,192,192,0,192,1,128,15,0,15,192,0,192,0,96,0, - 96,192,96,192,192,97,192,127,128,31,0,11,18,36,13,1, - 0,1,128,3,128,3,128,7,128,15,128,13,128,25,128,57, - 128,49,128,97,128,225,128,193,128,255,224,255,224,1,128,1, - 128,1,128,1,128,11,18,36,13,1,0,127,192,127,192,96, - 0,96,0,96,0,96,0,126,0,127,128,113,192,0,192,0, - 224,0,96,0,96,192,224,192,192,225,192,127,128,30,0,11, - 18,36,13,1,0,15,0,63,192,112,192,96,96,224,96,192, - 0,192,0,207,0,223,128,241,192,224,192,192,96,192,96,192, - 96,224,224,113,192,127,192,31,0,11,18,36,13,1,0,255, - 224,255,224,0,224,0,192,1,128,1,128,3,0,3,0,6, - 0,6,0,12,0,12,0,28,0,24,0,24,0,56,0,48, - 0,48,0,11,18,36,13,1,0,14,0,63,128,49,128,96, - 192,96,192,96,192,49,128,31,0,63,128,113,192,96,192,192, - 96,192,96,192,96,192,96,96,192,127,192,31,0,11,18,36, - 13,1,0,31,0,127,192,113,192,224,192,192,96,192,96,192, - 96,192,96,224,224,113,224,127,96,30,96,0,96,0,224,192, - 192,225,192,127,128,30,0,2,14,14,6,2,0,192,192,192, - 0,0,0,0,0,0,0,0,192,192,192,2,17,17,6,2, - 253,192,192,192,0,0,0,0,0,0,0,0,192,192,192,64, - 64,128,12,12,24,15,1,1,0,48,0,240,3,192,15,0, - 60,0,224,0,224,0,60,0,15,0,3,192,0,240,0,48, - 10,5,10,15,2,5,255,192,255,192,0,0,255,192,255,192, - 12,12,24,15,1,1,192,0,240,0,60,0,15,0,3,192, - 0,112,0,112,3,192,15,0,60,0,240,0,192,0,10,19, - 38,12,1,0,31,0,127,128,113,192,224,192,192,192,193,192, - 1,128,3,128,7,0,6,0,12,0,12,0,12,0,12,0, - 0,0,0,0,12,0,12,0,12,0,22,23,69,25,2,252, - 0,255,0,3,255,192,15,1,224,28,0,112,56,0,24,48, - 0,24,96,115,12,96,251,12,193,199,12,195,134,12,195,6, - 12,198,6,12,198,12,28,198,12,24,198,12,56,231,28,112, - 99,247,224,113,227,128,56,0,0,28,0,0,15,3,0,7, - 255,0,0,252,0,15,19,38,17,1,0,3,128,3,128,6, - 192,6,192,12,64,12,96,12,96,24,48,24,48,24,48,48, - 24,63,248,63,248,96,12,96,12,96,12,192,6,192,6,192, - 6,14,19,38,17,2,0,255,192,255,240,192,112,192,24,192, - 24,192,24,192,24,192,48,255,224,255,240,192,24,192,12,192, - 12,192,12,192,12,192,28,192,120,255,240,255,192,15,19,38, - 18,1,0,7,224,31,248,60,60,112,14,96,6,224,6,192, - 0,192,0,192,0,192,0,192,0,192,0,192,0,224,6,96, - 6,112,14,60,60,31,248,7,224,15,19,38,18,2,0,255, - 192,255,240,192,120,192,28,192,12,192,14,192,6,192,6,192, - 6,192,6,192,6,192,6,192,6,192,14,192,12,192,28,192, - 120,255,240,255,192,12,19,38,16,2,0,255,240,255,240,192, - 0,192,0,192,0,192,0,192,0,192,0,255,224,255,224,192, - 0,192,0,192,0,192,0,192,0,192,0,192,0,255,240,255, - 240,11,19,38,14,2,0,255,224,255,224,192,0,192,0,192, - 0,192,0,192,0,192,0,255,192,255,192,192,0,192,0,192, - 0,192,0,192,0,192,0,192,0,192,0,192,0,16,19,38, - 19,1,0,7,224,31,248,60,60,112,14,96,6,224,6,192, - 0,192,0,192,0,192,127,192,127,192,3,192,3,224,3,96, - 7,112,15,60,63,31,251,7,227,14,19,38,18,2,0,192, - 12,192,12,192,12,192,12,192,12,192,12,192,12,192,12,255, - 252,255,252,192,12,192,12,192,12,192,12,192,12,192,12,192, - 12,192,12,192,12,2,19,19,8,3,0,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,10,19, - 38,13,1,0,0,192,0,192,0,192,0,192,0,192,0,192, - 0,192,0,192,0,192,0,192,0,192,0,192,192,192,192,192, - 192,192,192,192,97,128,127,128,63,0,13,19,38,18,3,0, - 192,56,192,112,192,224,193,192,195,128,199,0,206,0,220,0, - 252,0,254,0,231,0,195,128,193,128,193,192,192,224,192,96, - 192,112,192,56,192,24,11,19,38,14,2,0,192,0,192,0, - 192,0,192,0,192,0,192,0,192,0,192,0,192,0,192,0, - 192,0,192,0,192,0,192,0,192,0,192,0,192,0,255,224, - 255,224,17,19,57,21,2,0,192,1,128,224,3,128,224,3, - 128,240,7,128,240,7,128,216,13,128,216,13,128,216,13,128, - 204,25,128,204,25,128,204,25,128,198,49,128,198,49,128,198, - 49,128,195,97,128,195,97,128,195,97,128,193,193,128,193,193, - 128,14,19,38,18,2,0,224,12,240,12,240,12,216,12,220, - 12,204,12,206,12,198,12,199,12,195,12,195,140,193,140,193, - 204,192,204,192,236,192,108,192,60,192,60,192,28,16,19,38, - 18,1,0,7,224,31,248,60,60,112,14,96,6,224,7,192, - 3,192,3,192,3,192,3,192,3,192,3,192,3,224,7,96, - 6,112,14,60,60,31,248,7,224,13,19,38,16,2,0,255, - 224,255,240,192,48,192,24,192,24,192,24,192,24,192,48,255, - 240,255,224,192,0,192,0,192,0,192,0,192,0,192,0,192, - 0,192,0,192,0,16,19,38,18,1,0,7,224,31,248,60, - 60,112,14,96,6,224,7,192,3,192,3,192,3,192,3,192, - 3,192,3,192,3,224,7,96,230,112,126,60,28,31,254,7, - 231,13,19,38,17,2,0,255,224,255,240,192,48,192,24,192, - 24,192,24,192,24,192,48,255,240,255,224,192,112,192,48,192, - 24,192,24,192,24,192,24,192,24,192,24,192,24,13,19,38, - 16,2,0,15,128,63,224,96,96,192,48,192,48,192,0,224, - 0,124,0,63,128,7,224,0,240,0,56,0,24,0,24,192, - 24,192,56,240,112,127,224,31,128,14,19,38,16,1,0,255, - 252,255,252,3,0,3,0,3,0,3,0,3,0,3,0,3, - 0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3, - 0,3,0,3,0,14,19,38,18,2,0,192,12,192,12,192, - 12,192,12,192,12,192,12,192,12,192,12,192,12,192,12,192, - 12,192,12,192,12,192,12,192,12,96,24,112,56,63,240,15, - 192,15,19,38,17,1,0,192,6,192,6,224,14,96,12,112, - 28,48,24,48,24,56,56,24,48,24,48,28,112,12,96,12, - 96,14,224,6,192,6,192,3,128,3,128,3,128,20,19,57, - 22,1,0,192,96,48,192,96,48,192,96,48,192,240,48,96, - 240,96,97,152,96,97,152,96,97,152,96,97,152,96,49,152, - 192,51,12,192,51,12,192,51,12,192,27,13,128,27,13,128, - 30,7,128,14,7,0,12,3,0,12,3,0,15,19,38,17, - 1,0,192,6,224,14,112,28,48,24,24,48,28,112,14,224, - 7,192,3,128,3,128,7,192,14,224,12,96,28,112,56,56, - 48,24,96,12,224,14,192,6,14,19,38,16,1,0,192,12, - 224,28,96,24,112,56,48,48,56,112,24,96,28,224,12,192, - 15,192,7,128,7,128,3,0,3,0,3,0,3,0,3,0, - 3,0,3,0,13,19,38,15,1,0,255,248,255,248,0,56, - 0,112,0,224,1,192,1,192,3,128,7,0,7,0,14,0, - 28,0,28,0,56,0,112,0,112,0,224,0,255,248,255,248, - 4,24,24,7,2,251,240,240,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,240,240,8,19, - 19,7,0,0,192,64,64,96,32,32,48,16,16,16,24,8, - 8,12,4,4,6,2,3,4,24,24,7,1,251,240,240,48, - 48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48, - 48,48,48,240,240,10,9,18,12,1,10,12,0,12,0,30, - 0,18,0,51,0,97,128,97,128,192,192,192,192,14,2,4, - 14,0,251,255,252,255,252,5,4,4,7,1,15,192,96,48, - 24,11,14,28,13,1,0,31,0,63,128,97,192,96,192,0, - 192,7,192,63,192,120,192,224,192,192,192,193,192,227,192,126, - 224,60,96,11,19,38,14,2,0,192,0,192,0,192,0,192, - 0,192,0,207,0,223,128,241,192,224,192,192,224,192,96,192, - 96,192,96,192,96,192,224,224,192,241,192,223,128,207,0,10, - 14,28,12,1,0,31,0,63,128,113,192,96,192,224,0,192, - 0,192,0,192,0,192,0,224,0,96,192,113,192,63,128,31, - 0,11,19,38,14,1,0,0,96,0,96,0,96,0,96,0, - 96,30,96,63,96,113,224,96,224,224,96,192,96,192,96,192, - 96,192,96,224,96,96,224,113,224,63,96,30,96,11,14,28, - 13,1,0,14,0,63,128,113,192,96,192,192,96,192,96,255, - 224,255,224,192,0,192,0,96,96,112,224,63,192,15,0,6, - 19,19,8,1,0,28,60,48,48,48,252,252,48,48,48,48, - 48,48,48,48,48,48,48,48,11,19,38,14,1,251,30,96, - 63,96,113,224,96,224,224,96,192,96,192,96,192,96,192,96, - 224,96,96,224,113,224,63,96,30,96,0,96,192,96,224,192, - 127,192,31,0,10,19,38,13,2,0,192,0,192,0,192,0, - 192,0,192,0,206,0,223,128,241,128,224,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 2,19,19,6,2,0,192,192,192,0,0,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,4,24,24,6,0,251,48, - 48,48,0,0,48,48,48,48,48,48,48,48,48,48,48,48, - 48,48,48,48,48,240,224,10,19,38,12,2,0,192,0,192, - 0,192,0,192,0,192,0,193,128,195,128,199,0,206,0,220, - 0,248,0,252,0,206,0,198,0,199,0,195,128,193,128,193, - 192,192,192,2,19,19,6,2,0,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,16,14,28,20, - 2,0,206,60,255,126,227,199,193,131,193,131,193,131,193,131, - 193,131,193,131,193,131,193,131,193,131,193,131,193,131,10,14, - 28,14,2,0,206,0,223,128,241,128,224,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 11,14,28,13,1,0,31,0,63,128,113,192,96,192,224,224, - 192,96,192,96,192,96,192,96,224,224,96,192,113,192,63,128, - 31,0,11,19,38,14,2,251,207,0,223,128,241,192,224,192, - 192,224,192,96,192,96,192,96,192,96,192,224,224,192,241,192, - 223,128,207,0,192,0,192,0,192,0,192,0,192,0,11,19, - 38,14,1,251,30,96,63,96,113,224,96,224,224,96,192,96, - 192,96,192,96,192,96,224,96,96,224,113,224,63,96,30,96, - 0,96,0,96,0,96,0,96,0,96,6,14,14,9,2,0, - 204,220,248,240,224,192,192,192,192,192,192,192,192,192,10,14, - 28,12,1,0,63,0,127,128,225,192,192,192,192,0,248,0, - 127,0,15,128,1,192,192,192,192,192,225,192,127,128,63,0, - 6,18,18,8,1,0,48,48,48,48,252,252,48,48,48,48, - 48,48,48,48,48,48,60,28,10,14,28,14,2,0,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,192,193,192,99,192,126,192,28,192,11,14,28,13,1,0, - 192,96,192,96,192,96,96,192,96,192,113,192,49,128,49,128, - 27,0,27,0,27,0,14,0,14,0,14,0,18,14,42,18, - 0,0,192,192,192,192,192,192,97,225,128,97,225,128,97,225, - 128,49,35,0,51,51,0,51,51,0,27,54,0,26,22,0, - 30,30,0,14,28,0,12,12,0,12,12,0,10,14,28,12, - 1,0,192,192,225,192,97,128,51,0,30,0,30,0,12,0, - 30,0,30,0,51,0,115,128,97,128,192,192,192,192,12,19, - 38,13,0,251,192,48,192,48,96,48,112,96,48,96,56,224, - 24,192,24,192,13,128,13,128,7,128,7,0,3,0,3,0, - 6,0,6,0,12,0,60,0,56,0,10,14,28,12,1,0, - 255,192,255,192,1,128,3,0,7,0,14,0,12,0,28,0, - 56,0,48,0,96,0,224,0,255,192,255,192,6,24,24,8, - 1,251,12,24,48,48,48,48,48,48,48,48,96,192,192,96, - 48,48,48,48,48,48,48,48,24,12,1,24,24,6,2,251, - 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,6,24,24,8,1,251,192,96, - 48,48,48,48,48,48,48,48,24,12,12,24,48,48,48,48, - 48,48,48,48,96,192,10,4,8,14,2,5,112,192,252,192, - 207,192,195,128,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,0,0,0,6,0,1,2,19,19,6,2, - 251,192,192,192,0,0,64,64,192,192,192,192,192,192,192,192, - 192,192,192,192,10,18,36,13,1,254,1,128,1,128,31,0, - 63,128,115,192,102,192,198,0,204,0,204,0,204,0,216,0, - 216,0,216,192,113,192,127,128,63,0,96,0,96,0,12,18, - 36,14,1,0,31,128,63,224,112,112,96,48,96,0,112,0, - 48,0,24,0,255,128,255,128,24,0,24,0,24,0,48,0, - 48,0,103,48,255,240,240,224,11,12,24,13,1,3,192,96, - 238,224,127,192,49,128,96,192,96,192,96,192,96,192,49,128, - 127,192,238,224,192,96,14,18,36,14,0,0,224,28,96,24, - 112,56,48,48,56,112,24,96,28,224,12,192,63,240,63,240, - 3,0,63,240,63,240,3,0,3,0,3,0,3,0,3,0, - 2,24,24,6,2,251,192,192,192,192,192,192,192,192,192,192, - 0,0,0,0,192,192,192,192,192,192,192,192,192,192,11,24, - 48,13,1,251,31,0,63,128,113,192,96,192,112,192,56,0, - 28,0,126,0,231,0,195,128,193,192,192,192,96,96,112,96, - 56,96,28,192,15,128,7,0,3,128,97,192,96,192,113,192, - 63,128,31,0,6,2,2,8,1,16,204,204,19,19,57,19, - 1,0,3,248,0,14,14,0,48,1,128,96,0,192,65,240, - 64,195,24,96,134,12,32,132,0,32,132,0,32,132,0,32, - 132,0,32,134,12,32,195,24,96,65,240,64,96,0,192,48, - 1,128,24,3,0,14,14,0,3,248,0,7,12,12,9,1, - 7,120,204,204,28,108,204,204,220,118,0,254,254,9,8,16, - 14,2,3,25,128,51,0,102,0,204,0,204,0,102,0,51, - 0,25,128,13,8,16,15,1,2,255,248,255,248,0,24,0, - 24,0,24,0,24,0,24,0,24,6,2,2,8,1,6,252, - 252,18,19,57,19,1,0,7,248,0,28,14,0,48,3,0, - 96,1,128,67,240,128,194,24,192,130,8,64,130,8,64,130, - 8,64,130,16,64,131,240,64,130,32,64,130,16,64,194,16, - 192,66,8,128,96,1,128,48,3,0,28,14,0,7,248,0, - 6,2,2,8,1,16,252,252,8,7,7,9,0,11,60,102, - 195,195,195,102,60,12,13,26,14,1,0,6,0,6,0,6, - 0,6,0,255,240,255,240,6,0,6,0,6,0,6,0,0, - 0,255,240,255,240,7,10,10,7,0,8,60,126,198,6,12, - 24,48,96,254,254,7,10,10,7,0,8,124,254,198,6,60, - 60,6,198,254,124,5,4,4,7,1,15,24,48,96,192,10, - 19,38,14,2,251,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,193,192,227,192,254,192,220, - 192,192,0,192,0,192,0,192,0,192,0,10,24,48,12,1, - 251,31,192,127,192,125,128,253,128,253,128,253,128,253,128,253, - 128,253,128,125,128,125,128,61,128,13,128,13,128,13,128,13, - 128,13,128,13,128,13,128,13,128,13,128,13,128,13,128,13, - 128,2,3,3,6,2,6,192,192,192,5,6,6,7,1,251, - 96,112,24,24,248,112,4,10,10,7,0,8,48,48,240,240, - 48,48,48,48,48,48,7,12,12,9,1,7,56,108,198,198, - 198,198,198,108,56,0,254,254,9,8,16,14,3,3,204,0, - 102,0,51,0,25,128,25,128,51,0,102,0,204,0,18,18, - 54,19,1,0,48,24,0,48,24,0,240,48,0,240,48,0, - 48,96,0,48,96,0,48,192,0,48,192,0,49,131,0,49, - 135,0,3,15,0,3,15,0,6,27,0,6,51,0,12,127, - 192,12,127,192,24,3,0,24,3,0,18,18,54,19,1,0, - 48,24,0,48,24,0,240,48,0,240,48,0,48,96,0,48, - 96,0,48,192,0,48,192,0,49,135,128,49,143,192,3,24, - 192,3,0,192,6,1,128,6,3,0,12,6,0,12,12,0, - 24,31,192,24,31,192,19,18,54,19,0,0,124,12,0,254, - 12,0,198,24,0,6,24,0,60,48,0,60,48,0,6,96, - 0,198,96,0,254,193,128,124,195,128,1,135,128,1,135,128, - 3,13,128,3,25,128,6,63,224,6,63,224,12,1,128,12, - 1,128,10,19,38,12,1,251,12,0,12,0,12,0,0,0, - 0,0,12,0,12,0,12,0,12,0,24,0,56,0,112,0, - 96,0,224,192,192,192,193,192,227,128,127,128,62,0,15,24, - 48,17,1,0,12,0,6,0,3,0,1,128,0,0,3,128, - 3,128,6,192,6,192,12,64,12,96,12,96,24,48,24,48, - 24,48,48,24,63,248,63,248,96,12,96,12,96,12,192,6, - 192,6,192,6,15,24,48,17,1,0,0,96,0,192,1,128, - 3,0,0,0,3,128,3,128,6,192,6,192,12,64,12,96, - 12,96,24,48,24,48,24,48,48,24,63,248,63,248,96,12, - 96,12,96,12,192,6,192,6,192,6,15,24,48,17,1,0, - 1,128,3,192,6,96,12,48,0,0,3,128,3,128,6,192, - 6,192,12,64,12,96,12,96,24,48,24,48,24,48,48,24, - 63,248,63,248,96,12,96,12,96,12,192,6,192,6,192,6, - 15,23,46,17,1,0,7,16,13,176,8,224,0,0,3,128, - 3,128,6,192,6,192,12,64,12,96,12,96,24,48,24,48, - 24,48,48,24,63,248,63,248,96,12,96,12,96,12,192,6, - 192,6,192,6,15,23,46,17,1,0,12,96,12,96,0,0, - 0,0,3,128,3,128,6,192,6,192,12,64,12,96,12,96, - 24,48,24,48,24,48,48,24,63,248,63,248,96,12,96,12, - 96,12,192,6,192,6,192,6,15,24,48,17,1,0,3,128, - 4,64,4,64,3,128,0,0,3,128,3,128,6,192,6,192, - 12,64,12,96,12,96,24,48,24,48,24,48,48,24,63,248, - 63,248,96,12,96,12,96,12,192,6,192,6,192,6,21,19, - 57,23,1,0,3,255,248,3,255,248,6,96,0,6,96,0, - 12,96,0,12,96,0,12,96,0,24,96,0,24,127,248,24, - 127,248,48,96,0,63,224,0,63,224,0,96,96,0,96,96, - 0,96,96,0,192,96,0,192,127,248,192,127,248,15,24,48, - 18,1,251,7,224,31,248,60,60,112,14,96,6,224,6,192, - 0,192,0,192,0,192,0,192,0,192,0,192,0,224,6,96, - 6,112,14,60,60,31,248,7,224,1,128,0,192,0,192,7, - 192,3,128,12,24,48,16,2,0,48,0,24,0,12,0,6, - 0,0,0,255,240,255,240,192,0,192,0,192,0,192,0,192, - 0,192,0,255,224,255,224,192,0,192,0,192,0,192,0,192, - 0,192,0,192,0,255,240,255,240,12,24,48,16,2,0,1, - 128,3,0,6,0,12,0,0,0,255,240,255,240,192,0,192, - 0,192,0,192,0,192,0,192,0,255,224,255,224,192,0,192, - 0,192,0,192,0,192,0,192,0,192,0,255,240,255,240,12, - 24,48,16,2,0,6,0,15,0,25,128,48,192,0,0,255, - 240,255,240,192,0,192,0,192,0,192,0,192,0,192,0,255, - 224,255,224,192,0,192,0,192,0,192,0,192,0,192,0,192, - 0,255,240,255,240,12,23,46,16,2,0,24,192,24,192,0, - 0,0,0,255,240,255,240,192,0,192,0,192,0,192,0,192, - 0,192,0,255,224,255,224,192,0,192,0,192,0,192,0,192, - 0,192,0,192,0,255,240,255,240,5,24,24,8,1,0,192, - 96,48,24,0,48,48,48,48,48,48,48,48,48,48,48,48, - 48,48,48,48,48,48,48,5,24,24,8,2,0,24,48,96, - 192,0,96,96,96,96,96,96,96,96,96,96,96,96,96,96, - 96,96,96,96,96,8,24,24,8,0,0,24,60,102,195,0, - 24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24, - 24,24,24,6,23,23,8,1,0,204,204,0,0,48,48,48, - 48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48, - 18,19,57,18,255,0,31,248,0,31,254,0,24,15,0,24, - 3,128,24,1,128,24,1,192,24,0,192,24,0,192,255,128, - 192,255,128,192,24,0,192,24,0,192,24,0,192,24,1,192, - 24,1,128,24,3,128,24,15,0,31,254,0,31,248,0,14, - 23,46,18,2,0,14,32,27,96,17,192,0,0,224,12,240, - 12,240,12,216,12,220,12,204,12,206,12,198,12,199,12,195, - 12,195,140,193,140,193,204,192,204,192,236,192,108,192,60,192, - 60,192,28,16,24,48,18,1,0,12,0,6,0,3,0,1, - 128,0,0,7,224,31,248,60,60,112,14,96,6,224,7,192, - 3,192,3,192,3,192,3,192,3,192,3,192,3,224,7,96, - 6,112,14,60,60,31,248,7,224,16,24,48,18,1,0,0, - 48,0,96,0,192,1,128,0,0,7,224,31,248,60,60,112, - 14,96,6,224,7,192,3,192,3,192,3,192,3,192,3,192, - 3,192,3,224,7,96,6,112,14,60,60,31,248,7,224,16, - 24,48,18,1,0,0,192,1,224,3,48,6,24,0,0,7, - 224,31,248,60,60,112,14,96,6,224,7,192,3,192,3,192, - 3,192,3,192,3,192,3,192,3,224,7,96,6,112,14,60, - 60,31,248,7,224,16,23,46,18,1,0,3,136,6,216,4, - 112,0,0,7,224,31,248,60,60,112,14,96,6,224,7,192, - 3,192,3,192,3,192,3,192,3,192,3,192,3,224,7,96, - 6,112,14,60,60,31,248,7,224,16,23,46,18,1,0,6, - 48,6,48,0,0,0,0,7,224,31,248,60,60,112,14,96, - 6,224,7,192,3,192,3,192,3,192,3,192,3,192,3,192, - 3,224,7,96,6,112,14,60,60,31,248,7,224,13,12,24, - 14,0,1,192,24,96,48,48,96,24,192,13,128,7,0,7, - 0,13,128,24,192,48,96,96,48,192,24,18,19,57,18,0, - 0,3,240,192,15,253,192,30,31,128,56,7,0,48,15,0, - 112,29,128,96,57,128,96,113,128,96,225,128,97,193,128,99, - 129,128,103,1,128,110,1,128,124,3,128,56,3,0,56,7, - 0,126,30,0,239,252,0,195,240,0,14,24,48,18,2,0, - 24,0,12,0,6,0,3,0,0,0,192,12,192,12,192,12, - 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, - 192,12,192,12,192,12,192,12,96,24,112,56,63,240,15,192, - 14,24,48,18,2,0,0,96,0,192,1,128,3,0,0,0, - 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, - 192,12,192,12,192,12,192,12,192,12,192,12,192,12,96,24, - 112,56,63,240,15,192,14,24,48,18,2,0,3,0,7,128, - 12,192,24,96,0,0,192,12,192,12,192,12,192,12,192,12, - 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, - 192,12,192,12,96,24,112,56,63,240,15,192,14,23,46,18, - 2,0,24,192,24,192,0,0,0,0,192,12,192,12,192,12, - 192,12,192,12,192,12,192,12,192,12,192,12,192,12,192,12, - 192,12,192,12,192,12,192,12,96,24,112,56,63,240,15,192, - 14,24,48,16,1,0,0,96,0,192,1,128,3,0,0,0, - 192,12,224,28,96,24,112,56,48,48,56,112,24,96,28,224, - 12,192,15,192,7,128,7,128,3,0,3,0,3,0,3,0, - 3,0,3,0,3,0,13,19,38,16,2,0,192,0,192,0, - 192,0,192,0,255,224,255,240,192,48,192,24,192,24,192,24, - 192,24,192,48,255,240,255,224,192,0,192,0,192,0,192,0, - 192,0,10,19,38,15,3,0,28,0,127,0,227,0,193,128, - 193,128,193,128,195,0,199,0,206,0,207,0,195,128,193,128, - 192,192,192,192,192,192,193,128,195,128,207,0,206,0,11,19, - 38,13,1,0,24,0,12,0,6,0,3,0,0,0,31,0, - 63,128,97,192,96,192,0,192,7,192,63,192,120,192,224,192, - 192,192,193,192,227,192,126,224,60,96,11,19,38,13,1,0, - 1,128,3,0,6,0,12,0,0,0,31,0,63,128,97,192, - 96,192,0,192,7,192,63,192,120,192,224,192,192,192,193,192, - 227,192,126,224,60,96,11,19,38,13,1,0,12,0,30,0, - 51,0,97,128,0,0,31,0,63,128,97,192,96,192,0,192, - 7,192,63,192,120,192,224,192,192,192,193,192,227,192,126,224, - 60,96,11,18,36,13,1,0,28,64,54,192,35,128,0,0, - 31,0,63,128,97,192,96,192,0,192,7,192,63,192,120,192, - 224,192,192,192,193,192,227,192,126,224,60,96,11,18,36,13, - 1,0,51,0,51,0,0,0,0,0,31,0,63,128,97,192, - 96,192,0,192,7,192,63,192,120,192,224,192,192,192,193,192, - 227,192,126,224,60,96,11,19,38,13,1,0,6,0,9,0, - 9,0,6,0,0,0,31,0,63,128,97,192,96,192,0,192, - 7,192,63,192,120,192,224,192,192,192,193,192,227,192,126,224, - 60,96,19,14,42,21,1,0,31,14,0,63,191,128,97,241, - 192,96,224,192,0,192,96,7,192,96,63,255,224,120,255,224, - 224,192,0,192,192,0,193,224,96,227,240,224,126,63,192,60, - 15,0,10,19,38,12,1,251,31,0,63,128,113,192,96,192, - 224,0,192,0,192,0,192,0,192,0,224,0,96,192,113,192, - 63,128,31,0,12,0,6,0,6,0,62,0,28,0,11,19, - 38,13,1,0,24,0,12,0,6,0,3,0,0,0,14,0, - 63,128,113,192,96,192,192,96,192,96,255,224,255,224,192,0, - 192,0,96,96,112,224,63,192,15,0,11,19,38,13,1,0, - 3,0,6,0,12,0,24,0,0,0,14,0,63,128,113,192, - 96,192,192,96,192,96,255,224,255,224,192,0,192,0,96,96, - 112,224,63,192,15,0,11,19,38,13,1,0,12,0,30,0, - 51,0,97,128,0,0,14,0,63,128,113,192,96,192,192,96, - 192,96,255,224,255,224,192,0,192,0,96,96,112,224,63,192, - 15,0,11,18,36,13,1,0,51,0,51,0,0,0,0,0, - 14,0,63,128,113,192,96,192,192,96,192,96,255,224,255,224, - 192,0,192,0,96,96,112,224,63,192,15,0,5,19,19,6, - 0,0,192,96,48,24,0,48,48,48,48,48,48,48,48,48, - 48,48,48,48,48,5,19,19,6,1,0,24,48,96,192,0, - 96,96,96,96,96,96,96,96,96,96,96,96,96,96,8,19, - 19,6,255,0,24,60,102,195,0,24,24,24,24,24,24,24, - 24,24,24,24,24,24,24,6,18,18,6,0,0,204,204,0, - 0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,11, - 19,38,13,1,0,96,0,57,128,14,0,30,0,99,0,31, - 128,63,128,113,192,96,192,224,224,192,96,192,96,192,96,192, - 96,224,224,96,192,113,192,63,128,31,0,10,18,36,14,2, - 0,56,128,109,128,71,0,0,0,206,0,223,128,241,128,224, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,11,19,38,13,1,0,24,0,12,0,6, - 0,3,0,0,0,31,0,63,128,113,192,96,192,224,224,192, - 96,192,96,192,96,192,96,224,224,96,192,113,192,63,128,31, - 0,11,19,38,13,1,0,3,0,6,0,12,0,24,0,0, - 0,31,0,63,128,113,192,96,192,224,224,192,96,192,96,192, - 96,192,96,224,224,96,192,113,192,63,128,31,0,11,19,38, - 13,1,0,12,0,30,0,51,0,97,128,0,0,31,0,63, - 128,113,192,96,192,224,224,192,96,192,96,192,96,192,96,224, - 224,96,192,113,192,63,128,31,0,11,18,36,13,1,0,28, - 64,54,192,35,128,0,0,31,0,63,128,113,192,96,192,224, - 224,192,96,192,96,192,96,192,96,224,224,96,192,113,192,63, - 128,31,0,11,18,36,13,1,0,51,0,51,0,0,0,0, - 0,31,0,63,128,113,192,96,192,224,224,192,96,192,96,192, - 96,192,96,224,224,96,192,113,192,63,128,31,0,12,12,24, - 14,1,1,6,0,6,0,6,0,0,0,0,0,255,240,255, - 240,0,0,0,0,6,0,6,0,6,0,13,14,28,13,0, - 0,15,152,31,248,56,112,48,224,113,240,99,176,99,48,102, - 48,108,48,124,112,56,96,112,224,255,192,207,128,10,19,38, - 14,2,0,48,0,24,0,12,0,6,0,0,0,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,193,192,99,192,126,192,28,192,10,19,38,14,2,0,3, - 0,6,0,12,0,24,0,0,0,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,193,192,99, - 192,126,192,28,192,10,19,38,14,2,0,12,0,30,0,51, - 0,97,128,0,0,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,193,192,99,192,126,192,28, - 192,10,18,36,14,2,0,51,0,51,0,0,0,0,0,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,193,192,99,192,126,192,28,192,12,24,48,13,0, - 251,0,192,1,128,3,0,6,0,0,0,192,48,192,48,96, - 48,112,96,48,96,56,224,24,192,24,192,13,128,13,128,7, - 128,7,0,3,0,3,0,6,0,6,0,12,0,60,0,56, - 0,11,24,48,14,2,251,192,0,192,0,192,0,192,0,192, - 0,207,0,223,128,241,192,224,192,192,224,192,96,192,96,192, - 96,192,96,192,224,224,192,241,192,223,128,207,0,192,0,192, - 0,192,0,192,0,192,0,12,23,46,13,0,251,25,128,25, - 128,0,0,0,0,192,48,192,48,96,48,112,96,48,96,56, - 224,24,192,24,192,13,128,13,128,7,128,7,0,3,0,3, - 0,6,0,6,0,12,0,60,0,56,0 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/fontdata/profont_22.cpp b/Marlin/src/lcd/tft/fontdata/profont_22.cpp deleted file mode 100644 index 1d02ebb069..0000000000 --- a/Marlin/src/lcd/tft/fontdata/profont_22.cpp +++ /dev/null @@ -1,426 +0,0 @@ -/* - Fontname: ProFont22 - Copyright: ProFont Distribution 2.2 Generated by Fontographer 4.1.5 - Capital A Height: 14, '1' Height: 14 - Calculated Max Values w=12 h=22 x= 6 y=12 dx=12 dy= 0 ascent=18 len=44 - Font Bounding box w=12 h=21 x= 0 y=-4 - Calculated Min Values x= 0 y=-4 dx= 0 dy= 0 - Pure Font ascent =14 descent=-4 - X Font ascent =16 descent=-4 - Max Font ascent =18 descent=-4 -*/ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -#include - -extern const uint8_t ProFont22[6454] = { - 0,12,21,0,252,14,3,117,7,113,32,255,252,18,252,16, - 252,0,0,0,12,0,0,2,14,14,12,4,0,192,192,192, - 192,192,192,192,192,192,192,0,0,192,192,6,6,6,12,2, - 10,204,204,204,204,204,204,10,10,20,12,0,4,51,0,51, - 0,255,192,255,192,51,0,51,0,255,192,255,192,51,0,51, - 0,10,18,36,12,0,254,12,0,12,0,63,0,127,128,237, - 192,204,192,204,0,236,0,127,0,63,128,13,192,12,192,204, - 192,237,192,127,128,63,0,12,0,12,0,10,14,28,12,0, - 0,63,192,127,192,204,192,205,192,207,128,207,0,127,0,63, - 128,60,192,124,192,236,192,204,192,199,128,195,0,10,14,28, - 12,0,0,62,0,127,0,227,0,199,0,206,0,252,0,120, - 0,120,0,252,192,207,192,199,128,231,128,127,192,60,192,2, - 6,6,12,4,10,192,192,192,192,192,192,6,18,18,12,2, - 254,12,28,56,112,224,192,192,192,192,192,192,192,192,224,112, - 56,28,12,6,18,18,12,2,254,192,224,112,56,28,12,12, - 12,12,12,12,12,12,28,56,112,224,192,10,10,20,12,0, - 4,12,0,12,0,204,192,255,192,63,0,63,0,255,192,204, - 192,12,0,12,0,10,10,20,12,0,2,12,0,12,0,12, - 0,12,0,255,192,255,192,12,0,12,0,12,0,12,0,5, - 9,9,12,2,252,48,120,120,56,24,56,112,224,64,6,2, - 2,12,2,6,252,252,4,4,4,12,3,1,96,240,240,96, - 11,20,40,12,0,252,0,96,0,96,0,192,0,192,1,128, - 1,128,3,0,3,0,6,0,6,0,12,0,12,0,24,0, - 24,0,48,0,48,0,96,0,96,0,192,0,192,0,10,14, - 28,12,0,0,63,0,127,128,225,192,193,192,195,192,199,192, - 206,192,220,192,248,192,240,192,224,192,225,192,127,128,63,0, - 10,14,28,12,0,0,12,0,12,0,124,0,124,0,12,0, - 12,0,12,0,12,0,12,0,12,0,12,0,12,0,255,192, - 255,192,10,14,28,12,0,0,63,0,127,128,225,192,192,192, - 0,192,1,192,3,128,7,0,14,0,28,0,56,0,112,0, - 255,192,255,192,10,14,28,12,0,0,63,0,127,128,225,192, - 192,192,0,192,1,128,15,0,15,128,1,192,0,192,192,192, - 225,192,127,128,63,0,10,14,28,12,0,0,3,0,7,0, - 15,0,31,0,59,0,115,0,227,0,195,0,255,192,255,192, - 3,0,3,0,15,192,15,192,10,14,28,12,0,0,255,192, - 255,192,192,0,192,0,255,0,255,128,1,192,0,192,0,192, - 0,192,192,192,225,192,127,128,63,0,10,14,28,12,0,0, - 63,0,127,0,224,0,192,0,255,0,255,128,193,192,192,192, - 192,192,192,192,192,192,225,192,127,128,63,0,10,14,28,12, - 0,0,255,192,255,192,0,192,0,192,0,192,1,192,3,128, - 7,0,14,0,12,0,12,0,12,0,12,0,12,0,10,14, - 28,12,0,0,63,0,127,128,225,192,192,192,192,192,97,128, - 63,0,127,128,225,192,192,192,192,192,225,192,127,128,63,0, - 10,14,28,12,0,0,63,0,127,128,225,192,192,192,192,192, - 192,192,192,192,224,192,127,192,63,192,0,192,1,192,63,128, - 63,0,4,10,10,12,3,1,96,240,240,96,0,0,96,240, - 240,96,5,15,15,12,2,252,48,120,120,48,0,0,48,120, - 120,56,24,56,112,224,64,8,14,14,12,2,0,3,7,14, - 28,56,112,224,224,112,56,28,14,7,3,10,6,12,12,0, - 4,255,192,255,192,0,0,0,0,255,192,255,192,8,14,14, - 12,2,0,192,224,112,56,28,14,7,7,14,28,56,112,224, - 192,10,14,28,12,0,0,63,0,127,128,225,192,192,192,0, - 192,1,192,3,128,7,0,14,0,12,0,0,0,0,0,12, - 0,12,0,10,14,28,12,0,0,63,0,127,128,225,192,192, - 192,199,192,207,192,204,192,204,192,207,192,199,128,192,0,224, - 0,127,192,63,192,10,14,28,12,0,0,12,0,30,0,30, - 0,51,0,51,0,97,128,97,128,192,192,255,192,255,192,192, - 192,192,192,192,192,192,192,10,14,28,12,0,0,255,0,255, - 128,193,192,192,192,192,192,193,128,255,0,255,128,193,192,192, - 192,192,192,193,192,255,128,255,0,10,14,28,12,0,0,63, - 0,127,128,225,192,192,192,192,0,192,0,192,0,192,0,192, - 0,192,0,192,192,225,192,127,128,63,0,10,14,28,12,0, - 0,255,0,255,128,193,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,193,192,255,128,255,0,10,14,28, - 12,0,0,255,192,255,192,192,0,192,0,192,0,192,0,255, - 0,255,0,192,0,192,0,192,0,192,0,255,192,255,192,10, - 14,28,12,0,0,255,192,255,192,192,0,192,0,192,0,192, - 0,255,0,255,0,192,0,192,0,192,0,192,0,192,0,192, - 0,10,14,28,12,0,0,63,0,127,128,225,192,192,192,192, - 0,192,0,195,192,195,192,192,192,192,192,192,192,225,192,127, - 128,63,0,10,14,28,12,0,0,192,192,192,192,192,192,192, - 192,192,192,192,192,255,192,255,192,192,192,192,192,192,192,192, - 192,192,192,192,192,10,14,28,12,0,0,255,192,255,192,12, - 0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12, - 0,12,0,255,192,255,192,10,14,28,12,0,0,0,192,0, - 192,0,192,0,192,0,192,0,192,0,192,0,192,192,192,192, - 192,192,192,225,192,127,128,63,0,10,14,28,12,0,0,193, - 192,195,128,199,0,206,0,220,0,248,0,240,0,248,0,220, - 0,206,0,199,0,195,128,193,192,192,192,10,14,28,12,0, - 0,192,0,192,0,192,0,192,0,192,0,192,0,192,0,192, - 0,192,0,192,0,192,0,192,0,255,192,255,192,10,14,28, - 12,0,0,192,192,225,192,243,192,255,192,222,192,204,192,204, - 192,204,192,192,192,192,192,192,192,192,192,192,192,192,192,10, - 14,28,12,0,0,192,192,224,192,240,192,248,192,220,192,206, - 192,199,192,195,192,193,192,192,192,192,192,192,192,192,192,192, - 192,10,14,28,12,0,0,63,0,127,128,225,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,225,192,127, - 128,63,0,10,14,28,12,0,0,255,0,255,128,193,192,192, - 192,192,192,193,192,255,128,255,0,192,0,192,0,192,0,192, - 0,192,0,192,0,10,16,32,12,0,254,63,0,127,128,225, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,204, - 192,239,192,127,128,63,128,1,192,0,192,10,14,28,12,0, - 0,255,0,255,128,193,192,192,192,192,192,193,128,255,0,255, - 128,193,192,192,192,192,192,192,192,192,192,192,192,10,14,28, - 12,0,0,63,0,127,128,225,192,192,192,192,0,224,0,127, - 0,63,128,1,192,0,192,192,192,225,192,127,128,63,0,10, - 14,28,12,0,0,255,192,255,192,12,0,12,0,12,0,12, - 0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12, - 0,10,14,28,12,0,0,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,225,192,127, - 128,63,0,10,14,28,12,0,0,192,192,192,192,192,192,192, - 192,192,192,192,192,97,128,97,128,51,0,51,0,30,0,30, - 0,12,0,12,0,10,14,28,12,0,0,192,192,192,192,192, - 192,192,192,192,192,192,192,204,192,204,192,204,192,222,192,255, - 192,243,192,225,192,192,192,10,14,28,12,0,0,192,192,192, - 192,192,192,225,192,115,128,63,0,30,0,30,0,63,0,115, - 128,225,192,192,192,192,192,192,192,10,14,28,12,0,0,192, - 192,192,192,192,192,192,192,192,192,225,192,115,128,63,0,30, - 0,12,0,12,0,12,0,12,0,12,0,10,14,28,12,0, - 0,255,192,255,192,0,192,1,192,3,128,7,0,14,0,28, - 0,56,0,112,0,224,0,192,0,255,192,255,192,4,18,18, - 12,4,254,240,240,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,240,240,11,20,40,12,1,252,192,0,192,0,96, - 0,96,0,48,0,48,0,24,0,24,0,12,0,12,0,6, - 0,6,0,3,0,3,0,1,128,1,128,0,192,0,192,0, - 96,0,96,4,18,18,12,2,254,240,240,48,48,48,48,48, - 48,48,48,48,48,48,48,48,48,240,240,10,6,12,12,0, - 8,12,0,30,0,63,0,115,128,225,192,64,128,12,2,4, - 12,0,252,255,240,255,240,4,4,4,12,2,12,192,224,112, - 48,10,10,20,12,0,0,63,192,127,192,224,192,192,192,192, - 192,193,192,195,192,231,192,126,192,60,192,10,14,28,12,0, - 0,192,0,192,0,192,0,192,0,255,0,255,128,193,192,192, - 192,192,192,192,192,192,192,193,192,255,128,255,0,10,10,20, - 12,0,0,63,0,127,128,225,192,192,192,192,0,192,0,192, - 0,224,0,127,192,63,192,10,14,28,12,0,0,0,192,0, - 192,0,192,0,192,63,192,127,192,224,192,192,192,192,192,192, - 192,192,192,224,192,127,192,63,192,10,10,20,12,0,0,63, - 0,127,128,225,192,192,192,255,192,255,192,192,0,224,0,127, - 192,63,192,8,14,14,12,2,0,15,31,56,48,252,252,48, - 48,48,48,48,48,48,48,10,14,28,12,0,252,63,192,127, - 192,224,192,192,192,192,192,192,192,192,192,224,192,127,192,63, - 192,0,192,1,192,63,128,63,0,10,14,28,12,0,0,192, - 0,192,0,192,0,192,0,255,0,255,128,193,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,6,14,14,12,2, - 0,48,48,0,0,240,240,48,48,48,48,48,48,252,252,6, - 18,18,12,0,252,12,12,0,0,60,60,12,12,12,12,12, - 12,12,12,12,28,248,240,10,14,28,12,0,0,192,0,192, - 0,192,0,192,0,195,128,199,0,206,0,220,0,252,0,254, - 0,231,0,195,128,193,192,192,192,6,14,14,12,2,0,240, - 240,48,48,48,48,48,48,48,48,48,48,252,252,10,10,20, - 12,0,0,255,0,255,128,205,192,204,192,204,192,204,192,204, - 192,204,192,204,192,204,192,10,10,20,12,0,0,207,0,223, - 128,249,192,240,192,224,192,192,192,192,192,192,192,192,192,192, - 192,10,10,20,12,0,0,63,0,127,128,225,192,192,192,192, - 192,192,192,192,192,225,192,127,128,63,0,10,14,28,12,0, - 252,255,0,255,128,193,192,192,192,192,192,192,192,192,192,193, - 192,255,128,255,0,192,0,192,0,192,0,192,0,10,14,28, - 12,0,252,63,192,127,192,224,192,192,192,192,192,192,192,192, - 192,224,192,127,192,63,192,0,192,0,192,0,192,0,192,10, - 10,20,12,0,0,207,0,223,128,249,192,240,192,224,0,192, - 0,192,0,192,0,192,0,192,0,10,10,20,12,0,0,63, - 192,127,192,192,0,192,0,127,0,63,128,0,192,0,192,255, - 128,255,0,8,14,14,12,2,0,48,48,48,48,252,252,48, - 48,48,48,48,56,31,15,10,10,20,12,0,0,192,192,192, - 192,192,192,192,192,192,192,193,192,195,192,231,192,126,192,60, - 192,10,10,20,12,0,0,192,192,192,192,192,192,97,128,97, - 128,51,128,51,0,30,0,30,0,12,0,10,10,20,12,0, - 0,204,192,204,192,204,192,204,192,204,192,204,192,204,192,204, - 192,127,128,51,0,10,10,20,12,0,0,192,192,225,192,115, - 128,63,0,30,0,30,0,63,0,115,128,225,192,192,192,10, - 14,28,12,0,252,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,224,192,127,192,63,192,0,192,1,192,63,128,63, - 0,10,10,20,12,0,0,255,192,255,192,3,128,7,0,14, - 0,28,0,56,0,112,0,255,192,255,192,6,22,22,12,2, - 252,12,28,56,48,48,48,48,48,48,112,224,224,112,48,48, - 48,48,48,48,56,28,12,2,18,18,12,4,254,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,6, - 22,22,12,2,252,192,224,112,48,48,48,48,48,48,56,28, - 28,56,48,48,48,48,48,48,112,224,192,10,4,8,12,0, - 6,48,192,124,192,207,128,195,0,0,0,0,12,0,0,0, - 0,0,12,0,0,0,0,0,12,0,0,4,7,7,12,0, - 253,48,48,48,48,112,224,64,10,22,44,12,0,252,3,192, - 7,192,14,0,12,0,12,0,12,0,12,0,12,0,63,0, - 63,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, - 12,0,12,0,28,0,248,0,240,0,8,7,7,12,0,253, - 51,51,51,51,119,238,68,10,2,4,12,0,0,204,192,204, - 192,6,10,10,12,2,4,48,48,252,252,48,48,48,48,48, - 48,6,10,10,12,2,4,48,48,252,252,48,48,252,252,48, - 48,6,4,4,12,2,12,48,120,252,204,12,16,32,12,0, - 0,63,240,127,240,204,224,205,192,207,128,207,0,126,0,60, - 0,60,192,127,224,243,48,243,48,179,48,51,48,31,224,12, - 192,10,18,36,12,0,0,51,0,63,0,30,0,12,0,63, - 0,127,128,225,192,192,192,192,0,224,0,127,0,63,128,1, - 192,0,192,192,192,225,192,127,128,63,0,4,10,10,12,0, - 255,48,112,96,224,192,192,224,96,112,48,10,14,28,12,0, - 0,63,192,127,192,236,0,204,0,204,0,204,0,207,0,207, - 0,204,0,204,0,204,0,236,0,127,192,63,192,0,0,0, - 12,0,0,0,0,0,12,0,0,0,0,0,12,0,0,0, - 0,0,12,0,0,4,7,7,12,4,8,32,112,224,192,192, - 192,192,4,7,7,12,4,7,48,48,48,48,112,224,64,8, - 7,7,12,2,8,34,119,238,204,204,204,204,8,7,7,12, - 2,7,51,51,51,51,119,238,68,10,10,20,12,0,2,30, - 0,127,128,127,128,255,192,255,192,255,192,255,192,127,128,127, - 128,30,0,6,2,2,12,2,6,252,252,12,2,4,12,0, - 6,255,240,255,240,10,4,8,12,0,12,48,192,124,192,207, - 128,195,0,12,6,12,12,0,8,255,48,255,240,51,240,51, - 240,51,48,51,48,10,16,32,12,0,0,51,0,63,0,30, - 0,12,0,0,0,0,0,63,192,127,192,192,0,192,0,127, - 0,63,128,0,192,0,192,255,128,255,0,4,10,10,12,0, - 255,192,224,96,112,48,48,112,96,224,192,10,10,20,12,0, - 0,51,0,127,128,204,192,204,192,207,192,207,192,204,0,204, - 0,127,192,51,192,0,0,0,12,0,0,0,0,0,12,0, - 0,10,18,36,12,0,0,51,0,51,0,0,0,0,0,192, - 192,192,192,192,192,192,192,192,192,225,192,115,128,63,0,30, - 0,12,0,12,0,12,0,12,0,12,0,0,0,0,12,0, - 0,2,14,14,12,6,0,192,192,0,0,192,192,192,192,192, - 192,192,192,192,192,10,14,28,12,0,254,12,0,12,0,63, - 0,127,128,237,192,204,192,204,0,204,0,204,0,236,0,127, - 192,63,192,12,0,12,0,10,16,32,12,0,0,60,0,126, - 0,231,0,195,0,192,0,192,0,252,0,252,0,192,0,192, - 0,192,0,192,0,192,192,193,192,255,128,255,0,10,10,20, - 12,0,0,64,128,225,192,127,128,63,0,51,0,51,0,63, - 0,127,128,225,192,64,128,10,14,28,12,0,0,192,192,225, - 192,115,128,63,0,255,192,255,192,12,0,12,0,255,192,255, - 192,12,0,12,0,12,0,12,0,2,18,18,12,4,254,192, - 192,192,192,192,192,192,192,0,0,192,192,192,192,192,192,192, - 192,10,20,40,12,0,254,31,0,127,128,97,192,224,192,112, - 192,56,192,220,0,206,0,199,0,227,128,113,192,56,192,28, - 192,14,192,199,0,195,128,193,192,225,128,127,128,62,0,6, - 2,2,12,2,12,204,204,10,14,28,12,0,0,120,0,254, - 0,135,0,1,128,61,128,124,192,192,192,192,192,124,192,61, - 128,1,128,135,0,254,0,120,0,8,12,12,12,2,6,63, - 127,227,195,195,227,127,63,0,0,255,255,10,10,20,12,0, - 255,48,192,113,192,97,128,227,128,195,0,195,0,227,128,97, - 128,113,192,48,192,10,6,12,12,0,2,255,192,255,192,0, - 192,0,192,0,192,0,192,10,2,4,12,0,6,255,192,255, - 192,10,12,24,12,0,2,120,0,254,0,135,0,1,128,241, - 128,248,192,204,192,204,192,248,192,249,192,223,128,207,0,6, - 2,2,12,2,12,252,252,8,8,8,12,2,8,60,126,231, - 195,195,231,126,60,10,12,24,12,0,0,12,0,12,0,12, - 0,12,0,255,192,255,192,12,0,12,0,12,0,12,0,255, - 192,255,192,5,7,7,12,3,11,112,136,8,16,32,64,248, - 5,7,7,12,3,11,112,136,8,48,8,136,112,4,4,4, - 12,4,12,48,112,224,192,10,14,28,12,0,252,195,0,195, - 0,195,0,195,0,195,0,195,0,195,0,199,128,255,192,252, - 192,192,0,192,0,192,0,192,0,10,16,32,12,0,0,31, - 192,127,192,124,192,236,192,204,192,204,192,236,192,124,192,127, - 192,31,192,12,192,12,192,12,192,12,192,12,192,12,192,4, - 4,4,12,4,4,96,240,240,96,4,6,6,12,2,252,240, - 240,48,112,224,64,5,7,7,12,3,11,32,224,32,32,32, - 32,248,8,12,12,12,2,6,60,126,231,195,195,231,126,60, - 0,0,255,255,10,10,20,12,0,255,195,0,227,128,97,128, - 113,192,48,192,48,192,113,192,97,128,227,128,195,0,12,18, - 36,12,0,0,16,0,112,0,16,0,16,0,16,16,16,32, - 124,64,0,128,1,0,2,0,4,0,8,64,16,192,33,64, - 66,64,131,224,0,64,0,224,12,18,36,12,0,0,16,0, - 112,0,16,0,16,0,16,16,16,32,124,64,0,128,1,0, - 2,0,4,0,9,192,18,32,32,32,64,64,128,128,1,0, - 3,224,12,18,36,12,0,0,56,0,68,0,4,0,24,0, - 4,16,68,32,56,64,0,128,1,0,2,0,4,0,8,64, - 16,192,33,64,66,64,131,224,0,64,0,224,10,14,28,12, - 0,0,12,0,12,0,0,0,0,0,12,0,28,0,56,0, - 112,0,224,0,192,0,192,192,225,192,127,128,63,0,10,18, - 36,12,0,0,48,0,56,0,28,0,12,0,12,0,30,0, - 30,0,51,0,51,0,97,128,97,128,192,192,255,192,255,192, - 192,192,192,192,192,192,192,192,10,18,36,12,0,0,3,0, - 7,0,14,0,12,0,12,0,30,0,30,0,51,0,51,0, - 97,128,97,128,192,192,255,192,255,192,192,192,192,192,192,192, - 192,192,10,18,36,12,0,0,12,0,30,0,63,0,51,0, - 12,0,30,0,30,0,51,0,51,0,97,128,97,128,192,192, - 255,192,255,192,192,192,192,192,192,192,192,192,10,18,36,12, - 0,0,48,192,124,192,207,128,195,0,12,0,30,0,30,0, - 51,0,51,0,97,128,97,128,192,192,255,192,255,192,192,192, - 192,192,192,192,192,192,10,18,36,12,0,0,51,0,51,0, - 0,0,0,0,12,0,30,0,30,0,51,0,51,0,97,128, - 97,128,192,192,255,192,255,192,192,192,192,192,192,192,192,192, - 10,18,36,12,0,0,12,0,30,0,51,0,51,0,30,0, - 30,0,30,0,51,0,51,0,97,128,97,128,192,192,255,192, - 255,192,192,192,192,192,192,192,192,192,10,14,28,12,0,0, - 63,192,127,192,236,0,204,0,204,0,204,0,255,0,255,0, - 204,0,204,0,204,0,204,0,207,192,207,192,10,18,36,12, - 0,252,63,0,127,128,225,192,192,192,192,0,192,0,192,0, - 192,0,192,0,192,0,192,192,225,192,127,128,63,0,12,0, - 28,0,56,0,16,0,10,18,36,12,0,0,48,0,56,0, - 28,0,12,0,255,192,255,192,192,0,192,0,192,0,192,0, - 255,0,255,0,192,0,192,0,192,0,192,0,255,192,255,192, - 10,18,36,12,0,0,3,0,7,0,14,0,12,0,255,192, - 255,192,192,0,192,0,192,0,192,0,255,0,255,0,192,0, - 192,0,192,0,192,0,255,192,255,192,10,18,36,12,0,0, - 12,0,30,0,63,0,51,0,255,192,255,192,192,0,192,0, - 192,0,192,0,255,0,255,0,192,0,192,0,192,0,192,0, - 255,192,255,192,10,18,36,12,0,0,51,0,51,0,0,0, - 0,0,255,192,255,192,192,0,192,0,192,0,192,0,255,0, - 255,0,192,0,192,0,192,0,192,0,255,192,255,192,10,18, - 36,12,0,0,48,0,56,0,28,0,12,0,255,192,255,192, - 12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, - 12,0,12,0,255,192,255,192,10,18,36,12,0,0,3,0, - 7,0,14,0,12,0,255,192,255,192,12,0,12,0,12,0, - 12,0,12,0,12,0,12,0,12,0,12,0,12,0,255,192, - 255,192,10,18,36,12,0,0,12,0,30,0,63,0,51,0, - 255,192,255,192,12,0,12,0,12,0,12,0,12,0,12,0, - 12,0,12,0,12,0,12,0,255,192,255,192,10,18,36,12, - 0,0,51,0,51,0,0,0,0,0,255,192,255,192,12,0, - 12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0, - 12,0,255,192,255,192,10,14,28,12,0,0,63,0,63,128, - 49,192,48,192,48,192,48,192,252,192,252,192,48,192,48,192, - 48,192,49,192,63,128,63,0,10,18,36,12,0,0,48,192, - 124,192,207,128,199,0,192,192,224,192,240,192,248,192,220,192, - 206,192,199,192,195,192,193,192,192,192,192,192,192,192,192,192, - 192,192,10,18,36,12,0,0,48,0,56,0,28,0,12,0, - 63,0,127,128,225,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,225,192,127,128,63,0,10,18,36,12, - 0,0,3,0,7,0,14,0,12,0,63,0,127,128,225,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 225,192,127,128,63,0,10,18,36,12,0,0,12,0,30,0, - 63,0,51,0,0,0,63,0,127,128,225,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,225,192,127,128,63,0, - 10,18,36,12,0,0,48,192,124,192,207,128,199,0,63,0, - 127,128,225,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,225,192,127,128,63,0,10,18,36,12,0,0, - 51,0,51,0,0,0,0,0,63,0,127,128,225,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,225,192, - 127,128,63,0,10,10,20,12,0,2,64,128,225,192,115,128, - 63,0,30,0,30,0,63,0,115,128,225,192,64,128,10,14, - 28,12,0,0,63,0,127,128,225,192,193,192,195,192,199,192, - 206,192,220,192,248,192,240,192,224,192,225,192,127,128,63,0, - 10,18,36,12,0,0,48,0,56,0,28,0,12,0,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,225,192,127,128,63,0,10,18,36,12,0,0, - 3,0,7,0,14,0,12,0,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,225,192, - 127,128,63,0,10,18,36,12,0,0,12,0,30,0,63,0, - 51,0,0,0,192,192,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,225,192,127,128,63,0,10,18, - 36,12,0,0,51,0,51,0,0,0,0,0,192,192,192,192, - 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, - 192,192,225,192,127,128,63,0,10,18,36,12,0,0,3,0, - 7,0,14,0,12,0,192,192,192,192,192,192,192,192,192,192, - 225,192,115,128,63,0,30,0,12,0,12,0,12,0,12,0, - 12,0,10,14,28,12,0,0,192,0,192,0,255,0,255,128, - 193,192,192,192,192,192,193,192,255,128,255,0,192,0,192,0, - 192,0,192,0,10,18,36,12,0,254,15,0,31,128,57,192, - 112,192,224,192,193,192,195,128,195,0,195,0,195,128,193,192, - 192,192,192,192,193,192,207,128,207,0,192,0,192,0,10,16, - 32,12,0,0,12,0,14,0,7,0,3,0,0,0,0,0, - 63,192,127,192,224,192,192,192,192,192,193,192,195,192,231,192, - 126,192,60,192,10,16,32,12,0,0,3,0,7,0,14,0, - 12,0,0,0,0,0,63,192,127,192,224,192,192,192,192,192, - 193,192,195,192,231,192,126,192,60,192,10,16,32,12,0,0, - 12,0,30,0,63,0,51,0,0,0,0,0,63,192,127,192, - 224,192,192,192,192,192,193,192,195,192,231,192,126,192,60,192, - 10,16,32,12,0,0,48,192,124,192,207,128,199,0,0,0, - 0,0,63,192,127,192,224,192,192,192,192,192,193,192,195,192, - 231,192,126,192,60,192,10,14,28,12,0,0,51,0,51,0, - 0,0,0,0,63,192,127,192,224,192,192,192,192,192,193,192, - 195,192,231,192,126,192,60,192,10,16,32,12,0,0,12,0, - 30,0,51,0,51,0,30,0,12,0,63,192,127,192,224,192, - 192,192,192,192,193,192,195,192,231,192,126,192,60,192,10,10, - 20,12,0,0,63,0,127,128,237,192,204,192,207,192,207,192, - 204,0,236,0,127,192,63,192,10,14,28,12,0,252,63,0, - 127,128,225,192,192,192,192,0,192,0,192,0,224,0,127,192, - 63,192,12,0,28,0,56,0,16,0,10,16,32,12,0,0, - 48,0,56,0,28,0,12,0,0,0,0,0,63,0,127,128, - 225,192,192,192,255,192,255,192,192,0,224,0,127,192,63,192, - 10,16,32,12,0,0,3,0,7,0,14,0,12,0,0,0, - 0,0,63,0,127,128,225,192,192,192,255,192,255,192,192,0, - 224,0,127,192,63,192,10,16,32,12,0,0,12,0,30,0, - 63,0,51,0,0,0,0,0,63,0,127,128,225,192,192,192, - 255,192,255,192,192,0,224,0,127,192,63,192,10,14,28,12, - 0,0,51,0,51,0,0,0,0,0,63,0,127,128,225,192, - 192,192,255,192,255,192,192,0,224,0,127,192,63,192,6,16, - 16,12,2,0,192,224,112,48,0,0,240,240,48,48,48,48, - 48,48,252,252,6,16,16,12,2,0,12,28,56,48,0,0, - 240,240,48,48,48,48,48,48,252,252,6,16,16,12,2,0, - 48,120,252,204,0,0,240,240,48,48,48,48,48,48,252,252, - 6,14,14,12,2,0,204,204,0,0,240,240,48,48,48,48, - 48,48,252,252,10,17,34,12,0,0,36,0,126,0,60,0, - 60,0,126,0,39,0,3,128,63,192,127,192,225,192,192,192, - 192,192,192,192,192,192,225,192,127,128,63,0,10,16,32,12, - 0,0,48,192,124,192,207,128,199,0,0,0,0,0,207,0, - 223,128,249,192,240,192,224,192,192,192,192,192,192,192,192,192, - 192,192,10,16,32,12,0,0,48,0,56,0,28,0,12,0, - 0,0,0,0,63,0,127,128,225,192,192,192,192,192,192,192, - 192,192,225,192,127,128,63,0,10,16,32,12,0,0,3,0, - 7,0,14,0,12,0,0,0,0,0,63,0,127,128,225,192, - 192,192,192,192,192,192,192,192,225,192,127,128,63,0,10,16, - 32,12,0,0,12,0,30,0,63,0,51,0,0,0,0,0, - 63,0,127,128,225,192,192,192,192,192,192,192,192,192,225,192, - 127,128,63,0,10,16,32,12,0,0,48,192,124,192,207,128, - 199,0,0,0,0,0,63,0,127,128,225,192,192,192,192,192, - 192,192,192,192,225,192,127,128,63,0,10,14,28,12,0,0, - 51,0,51,0,0,0,0,0,63,0,127,128,225,192,192,192, - 192,192,192,192,192,192,225,192,127,128,63,0,10,10,20,12, - 0,2,12,0,12,0,0,0,0,0,255,192,255,192,0,0, - 0,0,12,0,12,0,10,10,20,12,0,0,63,0,127,128, - 227,192,199,192,206,192,220,192,248,192,241,192,127,128,63,0, - 10,16,32,12,0,0,48,0,56,0,28,0,12,0,0,0, - 0,0,192,192,192,192,192,192,192,192,192,192,193,192,195,192, - 231,192,126,192,60,192,10,16,32,12,0,0,3,0,7,0, - 14,0,12,0,0,0,0,0,192,192,192,192,192,192,192,192, - 192,192,193,192,195,192,231,192,126,192,60,192,10,16,32,12, - 0,0,12,0,30,0,63,0,51,0,0,0,0,0,192,192, - 192,192,192,192,192,192,192,192,193,192,195,192,231,192,126,192, - 60,192,10,14,28,12,0,0,51,0,51,0,0,0,0,0, - 192,192,192,192,192,192,192,192,192,192,193,192,195,192,231,192, - 126,192,60,192,10,20,40,12,0,252,3,0,7,0,14,0, - 12,0,0,0,0,0,192,192,192,192,192,192,192,192,192,192, - 192,192,192,192,224,192,127,192,63,192,0,192,1,192,63,128, - 63,0,10,18,36,12,0,252,192,0,192,0,192,0,192,0, - 255,0,255,128,193,192,192,192,192,192,192,192,192,192,193,192, - 255,128,255,0,192,0,192,0,192,0,192,0,10,18,36,12, - 0,252,51,0,51,0,0,0,0,0,192,192,192,192,192,192, - 192,192,192,192,192,192,192,192,224,192,127,192,63,192,0,192, - 1,192,63,128,63,0 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/back_32x32x4.cpp b/Marlin/src/lcd/tft/images/back_32x32x4.cpp deleted file mode 100644 index 84a6e3aba6..0000000000 --- a/Marlin/src/lcd/tft/images/back_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t back_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x6F, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x76, 0xFF, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x6E, 0xFF, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x76, 0xEF, 0xFF, 0xE5, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x6E, 0xFF, 0xFF, 0xD5, 0x55, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x76, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x85, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x76, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, - 0x87, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x66, 0x88, 0x88, 0x88, - 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x56, 0x78, 0x88, 0x88, - 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x67, 0x88, 0x88, - 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x56, 0x78, 0x88, - 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x68, 0x88, - 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0x88, - 0x88, 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, - 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xD5, 0x67, 0x77, 0x8A, 0xDF, 0xFF, 0xFF, 0xFF, 0x56, 0x78, - 0x88, 0x88, 0x88, 0x77, 0xEF, 0xFF, 0xE5, 0x78, 0x87, 0x77, 0x77, 0xAE, 0xFF, 0xFF, 0x95, 0x68, - 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xF5, 0x58, - 0x88, 0x88, 0x88, 0x88, 0x77, 0xEF, 0xE5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0xDF, 0xF8, 0x57, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x7F, 0xE6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFC, 0x56, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xD7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0x66, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7D, 0x97, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x97, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/background_320x30x16.cpp b/Marlin/src/lcd/tft/images/background_320x30x16.cpp deleted file mode 100644 index 49c4a84a0c..0000000000 --- a/Marlin/src/lcd/tft/images/background_320x30x16.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint16_t background_320x30x16[9600] = { - 0x10F2, 0x18D2, 0x18D2, 0x10D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x20F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2112, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F2, 0x20F3, 0x20F2, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x28F3, 0x2113, 0x20F3, 0x2113, 0x28F3, 0x20F3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x20F3, 0x28F3, 0x2113, 0x20F3, 0x2113, 0x28F3, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F2, 0x20F3, 0x20F2, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2112, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x20F2, 0x18F3, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, - 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x259C, 0x1DBC, 0x1D9D, 0x259D, 0x1D9C, 0x259C, 0x259C, 0x259C, 0x259C, 0x259C, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x1DDD, 0x25DD, 0x25DD, 0x25DD, 0x25BD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x25FD, 0x2DFE, 0x2DFD, 0x2DFD, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3E, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3E, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2DFD, 0x2DFD, 0x2DFE, 0x25FD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25BD, 0x25DD, 0x25DD, 0x25DD, 0x1DDD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, - 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7B, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x249C, 0x1C9C, 0x1D9D, 0x1D7C, 0x1CFC, 0x1C9C, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24DC, 0x24DC, 0x24DC, 0x253D, 0x25BD, 0x253D, 0x24DD, 0x24BC, 0x24BC, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24FD, 0x24DC, 0x24DC, 0x24FD, 0x24FD, 0x24FC, 0x24DD, 0x24FD, 0x251C, 0x25FD, 0x255D, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FC, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x251D, 0x24FD, 0x24FD, 0x251D, 0x2D1D, 0x24FD, 0x2CFD, 0x25BD, 0x25BD, 0x253C, 0x2CFC, 0x2D1D, 0x251D, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1C, 0x2D5D, 0x2DDE, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2E1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2DDE, 0x2D5D, 0x2D1C, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x251D, 0x2D1D, 0x2CFC, 0x253C, 0x25BD, 0x25BD, 0x2CFD, 0x24FD, 0x2D1D, 0x251D, 0x24FD, 0x24FD, 0x251D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FC, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x255D, 0x25FD, 0x251C, 0x24FD, 0x24DD, 0x24FC, 0x24FD, 0x24FD, 0x24DC, 0x24DC, 0x24FD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24BC, 0x24BC, 0x24DD, 0x253D, 0x25BD, 0x253D, 0x24DC, 0x24DC, 0x24DC, 0x1CBC, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, - 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1B3B, 0x1CFC, 0x157C, 0x1C1C, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x22FB, 0x231C, 0x1D1C, 0x1D5C, 0x235B, 0x22DC, 0x22DB, 0x22DC, 0x22FB, 0x22FC, 0x22DC, 0x22DC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FB, 0x22FB, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231B, 0x22FC, 0x233C, 0x253C, 0x1CFD, 0x22FC, 0x22FC, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x2AFC, 0x2AFC, 0x231C, 0x2B1C, 0x2B1C, 0x259C, 0x247C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x25BD, 0x2BBC, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x25DD, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2BBC, 0x25BD, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x247C, 0x259C, 0x2B1C, 0x2B1C, 0x231C, 0x2AFC, 0x2AFC, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FC, 0x22FC, 0x1CFD, 0x253C, 0x233C, 0x22FC, 0x231B, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FB, 0x22FB, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22DC, 0x22DC, 0x22FC, 0x22FB, 0x22DC, 0x22DB, 0x22DC, 0x235B, 0x1D5C, 0x1D1C, 0x231C, 0x22FB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, - 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x137B, 0x1B5B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x139B, 0x1BBB, 0x14FB, 0x153C, 0x13FB, 0x1B7B, 0x139B, 0x1B7B, 0x1B7C, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, 0x139C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1D3C, 0x1D5C, 0x1BFB, 0x1B9C, 0x1BBB, 0x1B9B, 0x1BBC, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1CDC, 0x1D7D, 0x23FC, 0x1BDC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x1BBC, 0x1BBC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x247C, 0x1D9C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x241C, 0x259D, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x259D, 0x241C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1D9C, 0x247C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1BBC, 0x1BBC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BDC, 0x23FC, 0x1D7D, 0x1CDC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1B9B, 0x1BBC, 0x1B9B, 0x1BBB, 0x1B9C, 0x1BFB, 0x1D5C, 0x1D3C, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x139C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, - 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x137B, 0x135A, 0x135A, 0x137B, 0x135A, 0x135B, 0x139B, 0x14BB, 0x14FB, 0x13FB, 0x137B, 0x137B, 0x135B, 0x137B, 0x137A, 0x137A, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1BBB, 0x153C, 0x151C, 0x1B7B, 0x139B, 0x137B, 0x139B, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x13BB, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1C3B, 0x1D5C, 0x1C3C, 0x1B9B, 0x1BBB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1C9C, 0x1D1C, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BDB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1CFC, 0x1C7C, 0x1BBB, 0x1BDB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BDC, 0x23BC, 0x1BBB, 0x1D7C, 0x1BBB, 0x1BBB, 0x23BC, 0x1BDC, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BDB, 0x1BBB, 0x1C7C, 0x1CFC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BDB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1D1C, 0x1C9C, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BBB, 0x1B9B, 0x1C3C, 0x1D5C, 0x1C3B, 0x1B9C, 0x1B9B, 0x1B9B, 0x139B, 0x1B9B, 0x139B, 0x13BB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x1B9B, 0x1B9B, 0x139B, 0x1B9B, 0x139B, 0x139B, 0x137B, 0x139B, 0x1B7B, 0x151C, 0x153C, 0x1BBB, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x137B, - 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11BA, 0x11BA, 0x11B9, 0x09B9, 0x11BA, 0x1199, 0x11BA, 0x11BA, 0x1199, 0x11DA, 0x0B3A, 0x0C9B, 0x0BFB, 0x127A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x12BA, 0x14BB, 0x13FB, 0x11DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BB, 0x11BA, 0x11DA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x127A, 0x14DB, 0x137B, 0x11DA, 0x19BA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x19DB, 0x11DA, 0x19DA, 0x1A3B, 0x14FB, 0x1AFB, 0x19DA, 0x11DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x1A1B, 0x153C, 0x1A3B, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x153B, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x1A3B, 0x153C, 0x1A1B, 0x19DA, 0x19DB, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x11DB, 0x19DA, 0x1AFB, 0x14FB, 0x1A3B, 0x19DA, 0x11DA, 0x19DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19BA, 0x11DA, 0x137B, 0x14DB, 0x127A, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11DA, 0x11BA, 0x11BB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DB, 0x13FB, 0x14BB, 0x12BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, - 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0C3A, 0x0C9A, 0x0BDA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDB, 0x14BB, 0x0BFA, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x131A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133B, 0x133B, 0x133A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x0B3A, 0x137A, 0x0CDB, 0x0C5B, 0x133B, 0x133B, 0x0B3A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x135B, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x135A, 0x0B5B, 0x133B, 0x143A, 0x147B, 0x135B, 0x135A, 0x133B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x13BB, 0x14DB, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x14FB, 0x135A, 0x133B, 0x135B, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x14DB, 0x13BB, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x133B, 0x135A, 0x135B, 0x147B, 0x143A, 0x133B, 0x0B5B, 0x135A, 0x133B, 0x133B, 0x135B, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x0B3A, 0x133B, 0x133B, 0x0C5B, 0x0CDB, 0x137A, 0x0B3A, 0x133A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x133B, 0x133B, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B3A, 0x131A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0BFA, 0x14BB, 0x0BDB, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, - 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02F9, 0x02D9, 0x02DA, 0x0ADA, 0x0AFA, 0x0BFA, 0x0C5B, 0x0BFA, 0x0AD9, 0x02FA, 0x02F9, 0x02F9, 0x0AF9, 0x02F9, 0x0AF9, 0x02D9, 0x02F9, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0C1A, 0x0C7B, 0x0B5A, 0x0AFA, 0x0AF9, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x031A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0C3A, 0x0C5A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0C5B, 0x0C1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0C7B, 0x0B7A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0CBB, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B7A, 0x0C7B, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0C1A, 0x0C5B, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0C5A, 0x0C3A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x031A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AF9, 0x0AFA, 0x0B5A, 0x0C7B, 0x0C1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, - 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03B9, 0x03DA, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01B9, 0x037A, 0x0BDA, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033A, 0x041A, 0x01F9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0A79, 0x043A, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09B9, 0x0C3B, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0C7A, 0x0979, 0x0179, 0x0979, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0979, 0x0179, 0x0C3B, 0x09B9, 0x0179, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0959, 0x0199, 0x043A, 0x0A79, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0959, 0x0958, 0x0179, 0x0959, 0x01F9, 0x041A, 0x033A, 0x0958, 0x0159, 0x0178, 0x0159, 0x0979, 0x0958, 0x0179, 0x0979, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0179, 0x0159, 0x0158, 0x0959, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0159, 0x0159, 0x0958, 0x0218, 0x0BDA, 0x037A, 0x01B9, 0x0159, 0x0158, 0x0158, 0x0178, 0x0138, 0x0158, 0x0158, 0x0158, - 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01D8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03D9, 0x02B9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01D9, 0x03F9, 0x01F9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02D9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041A, 0x0959, 0x0159, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0319, 0x02D9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01F9, 0x03F9, 0x01D9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0178, 0x0399, 0x0339, 0x0178, 0x0158, 0x0158, 0x0158, 0x0938, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0178, 0x02B9, 0x03D9, 0x0278, 0x0138, 0x0157, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, - 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01D7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01D7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02F8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03B9, 0x01B8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03F9, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x01B8, 0x03B9, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0278, 0x0359, 0x0158, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0157, 0x02F8, 0x0359, 0x0157, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0136, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x01D7, 0x0379, 0x0318, 0x0177, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, - 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02F7, 0x0358, 0x0378, 0x02F7, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D7, 0x02F8, 0x02F8, 0x0398, 0x0378, 0x02F8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0398, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F7, 0x02F8, 0x02F8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03B8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03B8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x03B8, 0x0338, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x02F8, 0x0318, 0x0399, 0x0358, 0x0318, 0x02F8, 0x02F8, 0x02F7, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0398, 0x0378, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D8, 0x02F8, 0x0378, 0x0398, 0x02F8, 0x02F8, 0x02D7, 0x02F8, 0x02F8, - 0x0176, 0x01B6, 0x02F8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01F7, 0x0337, 0x02D7, 0x01B6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01B6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x02F7, 0x0257, 0x0197, 0x01B6, 0x01B7, 0x01B6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x01B6, 0x01B7, 0x0378, 0x01B7, 0x01B7, 0x01B6, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x01B7, 0x01B6, 0x0197, 0x0257, 0x02F7, 0x01B6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x01B6, 0x0318, 0x0277, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0217, 0x0358, 0x0237, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0197, 0x01B6, 0x02D7, 0x0337, 0x01F7, 0x0196, 0x0196, - 0x0236, 0x0317, 0x0256, 0x00F4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x01F6, 0x0317, 0x01F6, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x01B6, 0x0337, 0x01B6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x0155, 0x0337, 0x0156, 0x00D5, 0x00D5, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00D6, 0x00D6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00D5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x0115, 0x0338, 0x0115, 0x00F6, 0x00F5, 0x00F6, 0x00F5, 0x00D6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F6, 0x00D5, 0x00F5, 0x0357, 0x00F5, 0x00F5, 0x00D5, 0x00F6, 0x00D5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D6, 0x00F5, 0x00F6, 0x00F5, 0x00F6, 0x0115, 0x0338, 0x0115, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00F6, 0x00D5, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00D6, 0x00D6, 0x00F5, 0x00F6, 0x00F6, 0x00F6, 0x00D5, 0x00D5, 0x0156, 0x0337, 0x0155, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x01B6, 0x0337, 0x01B6, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x01F6, 0x0317, 0x01F6, 0x00F5, - 0x01F4, 0x0113, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00D3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00D3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00D3, 0x00B3, 0x00D3, 0x00D3, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x01D4, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00F4, 0x02B5, 0x01B5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01B5, 0x0255, 0x00D5, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x02F6, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D5, 0x0255, 0x01B5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01B5, 0x02B5, 0x00F4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x0134, 0x02B5, 0x01D4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D3, 0x00D3, 0x00B3, 0x00D3, 0x0134, 0x0255, 0x0275, - 0x00B1, 0x0091, 0x0091, 0x0091, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x00D2, 0x01B2, 0x0273, 0x0172, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x01D3, 0x0253, 0x0112, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0213, 0x01D3, 0x0092, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0253, 0x0153, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0294, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0153, 0x0253, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0092, 0x01D3, 0x0213, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0112, 0x0253, 0x01D3, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x0172, - 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01D1, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01D2, 0x01F2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0171, 0x0212, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00F1, 0x0252, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0272, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x0090, 0x00B0, 0x0252, 0x00F1, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0212, 0x0171, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F2, 0x01D2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F2, 0x01D1, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01B1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0191, 0x01B1, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00D0, 0x0252, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01D1, 0x01F2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x00D0, 0x0212, 0x01D2, 0x00D0, 0x0090, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x00F0, 0x0232, 0x01B1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0232, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00D0, 0x0232, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0130, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x01B1, 0x0232, 0x00F0, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, - 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0171, 0x0232, 0x0151, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x00F0, 0x0212, 0x0151, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x01F1, 0x01B1, 0x0070, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0130, 0x01F1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x01F1, 0x0130, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0070, 0x01B1, 0x01F1, 0x0090, 0x0070, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0151, 0x0212, 0x00F0, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0070, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, - 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0070, 0x008F, 0x006F, 0x008F, 0x0110, 0x0232, 0x01B1, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0110, 0x0252, 0x0130, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0170, 0x01F2, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x01D2, 0x0130, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0130, 0x01D2, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x01F2, 0x0170, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x0130, 0x0252, 0x0110, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, - 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x01B1, 0x0232, 0x010F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0232, 0x00CF, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x010F, 0x0212, 0x00AF, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x00AF, 0x0212, 0x00AF, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x0252, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x00AF, 0x0212, 0x00AF, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x00AF, 0x0212, 0x010F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x00CF, 0x0232, 0x0150, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0110, 0x0212, 0x01B1, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x008F, 0x006E, 0x006E, 0x006F, 0x006F, 0x008E, 0x006E, 0x0191, 0x01F1, 0x00CF, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006E, 0x006E, 0x006F, 0x00CF, 0x0212, 0x0110, 0x008F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0191, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0232, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0191, 0x0150, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006F, 0x008F, 0x006E, 0x006F, 0x008F, 0x0110, 0x0212, 0x00CF, 0x006F, 0x006E, 0x006E, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006F, 0x006F, 0x00CF, 0x01F1, 0x0191, 0x006E, 0x008E, 0x006F, 0x006F, 0x006E, 0x006E, 0x008F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x008E, 0x01D1, 0x01F1, 0x008F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x01F1, 0x0170, 0x006F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0211, 0x00CF, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008F, 0x00CF, 0x0211, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006F, 0x0170, 0x01F1, 0x00AE, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x008F, 0x01F1, 0x01D1, 0x008E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0130, 0x0212, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01D1, 0x0190, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01F1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0211, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0211, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x01F1, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0190, 0x01D1, 0x00AF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x01F2, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x0212, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x008E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x008E, 0x0212, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x0191, 0x0212, 0x00AF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x004D, 0x0130, 0x01F2, 0x0150, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x00EF, 0x0212, 0x010F, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x00AF, 0x0212, 0x00CF, 0x004E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x008E, 0x0232, 0x008E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x008E, 0x0232, 0x008E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x004E, 0x00CF, 0x0212, 0x00AF, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x010F, 0x0212, 0x00EF, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006D, 0x004D, 0x004D, 0x004E, 0x004D, 0x004D, 0x006D, 0x006D, 0x008E, 0x01B1, 0x01D1, 0x00CE, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006E, 0x004D, 0x006E, 0x006E, 0x004E, 0x006D, 0x010F, 0x0212, 0x00EF, 0x006D, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x004D, 0x006E, 0x01D1, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0130, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0232, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x0191, 0x0130, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x01D1, 0x006E, 0x004D, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006D, 0x00EF, 0x0212, 0x010F, 0x006D, 0x004E, 0x006E, 0x006E, 0x004D, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, - 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x0150, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004E, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x00AE, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x0170, 0x01B1, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x006E, 0x01D1, 0x010F, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004E, 0x0212, 0x004D, 0x004E, 0x006E, 0x006D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x010F, 0x01D1, 0x006E, 0x004E, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x01B1, 0x0170, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x00AE, 0x01F1, 0x0150, 0x004D, 0x004D, 0x004D, 0x004E, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp b/Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp deleted file mode 100644 index 2308917b13..0000000000 --- a/Marlin/src/lcd/tft/images/bootscreen_112x38x1.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -#include "../../../inc/MarlinConfig.h" - -extern const uint8_t marlin_logo_112x38x1[532] = { - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111,B11111111, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111,B11111111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111, - B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00111111,B11111111, - B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00011000,B00000000,B00011111,B11111111, - B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00001111,B11111111, - B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000111,B11111111, - B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00111100,B00000000,B00000011,B11111111, - B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000001,B11111111, - B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000000,B11111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000011,B11100000,B01111000,B00111100,B00000011,B11110000,B01111111, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B01111000,B00111100,B00000111,B11111100,B00111111, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B01111000,B00111100,B00001111,B11111110,B00011111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B01111000,B00111100,B00011111,B11111110,B00001111, - B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B01111000,B00111100,B00111111,B00111111,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B01111000,B00111100,B00111110,B00011111,B00000111, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B01111100,B00111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B01111111,B10111100,B00111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00111111,B10111111,B11111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00011111,B10111111,B11111100,B00001111,B00000011, - B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00001111,B10111111,B11111100,B00001111,B00000011, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, - B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, - B01110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001110, - B00111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100, - B00011110,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000, - B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11110000, - B00000001,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B10000000 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp deleted file mode 100644 index 2545f845a8..0000000000 --- a/Marlin/src/lcd/tft/images/bootscreen_195x59x16.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint16_t marlin_logo_195x59x16[11505] = { - 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0x7A32, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, - 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, - 0x18AD, 0x20AB, 0x18AD, 0x18AD, 0x18AD, 0x20EE, 0x8252, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, - 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD4F8, 0xD65C, 0xD6DD, 0xD6FD, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, - 0x18AD, 0x20AD, 0x18AE, 0x28EE, 0xCB55, 0xD375, 0xD395, 0xD395, 0xD3D6, 0xD5DB, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, - 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD477, 0xD77E, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, - 0x18AD, 0x18CD, 0x8252, 0xD395, 0xD395, 0xD396, 0xD4B8, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, - 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD457, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCF3E, 0xC67C, 0xC53A, 0xACB8, 0xACB8, 0xACB8, 0xACB8, 0xACB8, 0xACB8, 0xC53A, 0xC67C, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD65B, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0xD395, - 0x20AE, 0xA2D3, 0xD395, 0xD395, 0xD3D6, 0xD75E, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFDF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7DF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCFFF, 0xD7DF, 0xACD8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xBE3B, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD65C, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, - 0x310E, 0xD395, 0xD375, 0xD375, 0xD5BA, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5B, 0xBE3C, 0xB57A, 0xACB8, 0xBDBB, 0xC63C, 0xBE3B, 0xC71E, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5C, 0xB5DB, 0xACB8, 0xAC98, 0xBD5A, 0xBE3C, 0xC61C, 0xC69D, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xACB9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA111, 0xBE3B, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCF5E, 0xBE5C, 0xBE5C, 0xC63C, 0xC61C, 0xCEFD, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFFF, 0xCFDF, 0xD63B, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD395, - 0x79F1, 0xD355, 0xD355, 0xD355, 0xCF7E, 0xC7DF, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xCFBF, 0xBEFD, 0xACB8, 0x8A52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA192, 0xAB96, 0xBE7D, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xCFDF, 0xCFBF, 0xC75E, 0xAD19, 0x92B4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xA111, 0x9931, 0xA111, 0x9911, 0xAB36, 0xBD5A, 0xC75E, 0xCFDF, 0xC7BF, 0xC7BF, 0xCFDF, 0xC7DF, 0xC7BF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xC7BF, 0xCFBF, 0xC7DF, 0xA4B8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xBE3B, 0xCFBF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xB5DA, 0x8A12, 0x8971, 0x9931, 0x9931, 0xA111, 0x9931, 0xAB35, 0xC75E, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFBF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCE1B, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, - 0xA293, 0xD335, 0xD335, 0xCC98, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC75E, 0xA4B8, 0x8191, 0x9151, 0x9911, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xAB35, 0xBEFE, 0xC7BF, 0xC7BE, 0xC7BF, 0xB5DB, 0x89F1, 0x8971, 0x9931, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA132, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA172, 0xBD3A, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BE, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xAC98, 0x8191, 0x9151, 0x9931, 0xA111, 0xA131, 0xA111, 0xA131, 0xA111, 0x9931, 0xBE1B, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xBEFD, 0x89F2, 0x8991, 0x9931, 0xA112, 0xA131, 0xA111, 0xA111, 0xA111, 0xAB97, 0xC7BF, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC6DD, 0xD375, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, - 0xD315, 0xD315, 0xD314, 0xC5FB, 0xC79F, 0xC79E, 0xC7BF, 0xC7BF, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xBF9E, 0xBFBF, 0xBFBE, 0xB67C, 0x8A53, 0x8971, 0xA131, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA172, 0xB539, 0xBF9F, 0x9BF6, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xAB15, 0xBF3D, 0xC79F, 0xC7BE, 0xC79F, 0xC79F, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79F, 0xC79E, 0xC79F, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xA4B8, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xBDFB, 0xC79F, 0xC79E, 0xC7BE, 0xC79F, 0xACF9, 0x8191, 0x9171, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA131, 0xA111, 0xBF3E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xC7BF, 0xC79E, 0xC79E, 0xC79E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xBF9E, 0xC79F, 0xC79E, 0xBFBE, 0xC79E, 0xC6BD, 0xD355, 0xD2F5, 0xD315, 0xCB14, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD315, 0xD315, 0xD314, - 0xD2F4, 0xCAF4, 0xD2F4, 0xC65C, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF7F, 0xB67C, 0x8A12, 0x8971, 0xA111, 0xA111, 0xA911, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA912, 0xA911, 0xA1F3, 0x8191, 0x9931, 0xA111, 0xA111, 0xA912, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA112, 0xA911, 0xAA54, 0xBF1D, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xB79E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xB5FB, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA911, 0xB5FB, 0xBF7E, 0xBF9E, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBEBD, 0xD335, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F5, 0xCAF4, - 0xD2D4, 0xD2D4, 0xD2D4, 0xBE5C, 0xB77E, 0xB79E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xB77E, 0xB79E, 0xBF7E, 0xAE7B, 0x89F2, 0x8971, 0xA111, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA912, 0xA911, 0xA911, 0xA111, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA111, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA912, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xAA34, 0xB71E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7F, 0xB77E, 0x9C97, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xB5DB, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xA478, 0x8191, 0x9951, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xB5DB, 0xB77F, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xBE9D, 0xCB75, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D5, - 0xD2B4, 0xD2B4, 0xD2B4, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB71D, 0x8A53, 0x8191, 0xA111, 0xA8F1, 0xB0F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F2, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB2F5, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C78, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C77, 0x8191, 0x9151, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB71D, 0xCB96, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCA94, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, - 0xD294, 0xD294, 0xCA94, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0x9416, 0x8991, 0x9951, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xACF9, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF7E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5D, 0xB75E, 0xAF5E, 0xAF5E, 0x9C77, 0x8191, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xB75E, 0xB75E, 0xB75E, 0xB75E, 0x9C78, 0x8991, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB5BB, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF1D, 0xCB75, 0xCA93, 0xD294, 0xCA74, 0xCA94, 0xCA74, 0xD274, 0xCA74, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA93, 0xCA94, 0xD293, 0xCA74, - 0xD274, 0xD274, 0xCA53, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF5D, 0xAF3D, 0xAF3E, 0xA69C, 0x8191, 0x8191, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0D1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xAA13, 0xB418, 0xA438, 0x9AB4, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xAA74, 0xAC78, 0xACF9, 0x9B35, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F2, 0xB0D1, 0xB0F1, 0xA9B3, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0x9C77, 0x8191, 0x9931, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xAF3E, 0xAF3E, 0xAF5D, 0xAF3E, 0x9477, 0x8191, 0x9951, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xADBA, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAEFD, 0xCB56, 0xCA53, 0xCA74, 0xD253, 0xD274, 0xD274, 0xD273, 0xCA73, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD254, 0xCA74, 0xCA54, 0xCA54, 0xCA74, - 0xCA53, 0xCA53, 0xCA53, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0x9457, 0x8191, 0x9931, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB1B3, 0xAD9A, 0xAF3D, 0xAF3D, 0xA73D, 0xA73D, 0x9DDA, 0x89D1, 0x9951, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB213, 0xAD9B, 0xA73E, 0xA73D, 0xAF3E, 0xAF3E, 0x9DDA, 0x81F2, 0x9171, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D2, 0xB0F1, 0xAD39, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3E, 0xAF1E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xAF3E, 0xA73E, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xA73E, 0x9478, 0x8191, 0x9931, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xAD9A, 0xA73E, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xAF3D, 0xAF3D, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xAEDD, 0xC376, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xD253, 0xCA53, 0xCA53, - 0xCA13, 0xCA33, 0xCA13, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0x8A53, 0x8191, 0xA8F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB213, 0xA6BD, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0x9E1B, 0x81F1, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB1F3, 0xA6BD, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0x9E1B, 0x89F2, 0x8991, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB336, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71E, 0xA71D, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA73E, 0xA71D, 0xA73E, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA73E, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0x9477, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA59A, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71E, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71E, 0xA71D, 0xA73D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xBBF7, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA14, 0xD233, 0xCA33, - 0xCA13, 0xCA13, 0xCA13, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x8191, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9EFD, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB932, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1E, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E1B, 0x9457, 0x92D4, 0xA1F3, 0xA911, 0xB0F1, 0xB0F1, 0xA911, 0xB274, 0xB254, 0xB254, 0xABF7, 0xA5DB, 0xA6FD, 0xA6FD, 0xA71D, 0xA71D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E7C, 0x9498, 0x8B14, 0x9A13, 0xA131, 0xA912, 0xB0F1, 0xA8F1, 0xB255, 0xB274, 0xB254, 0xAB97, 0xAD1A, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9457, 0x8191, 0xA131, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA57A, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9E7C, 0x9DBA, 0xA59A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA69C, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E5C, 0x94B8, 0x8AF4, 0x9A13, 0xA131, 0xA8F1, 0xB0F1, 0xB0F1, 0xB932, 0xB274, 0xB254, 0xB336, 0xACB9, 0xA63C, 0x9F1D, 0xBBF7, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, - 0xC9D3, 0xC9D3, 0xC9D3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x959A, 0x8191, 0x9151, 0xC0B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB2B5, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8252, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB1F3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9F1D, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8A93, 0x8191, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xA63C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x94F8, 0x8A53, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8B1, 0xC0B1, 0xC0D1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB992, 0xACB9, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E5C, 0x8B96, 0x8991, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB932, 0xABF7, 0x9E9C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E9C, 0x8B96, 0x8971, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB335, 0xA63C, 0xBBD7, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, - 0xC9B3, 0xC9B3, 0xC9B3, 0x9EDD, 0x96FD, 0x9EDD, 0x96FD, 0x9EFC, 0x96FD, 0x96FD, 0x9599, 0x8991, 0x9171, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xABD7, 0x9EFC, 0x96FD, 0x96FD, 0x96DD, 0x96FD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x9EFD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xAB76, 0x9EDD, 0x9EFD, 0x9EFD, 0x9EDD, 0x9EDD, 0x96DD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x8C37, 0x8191, 0xA131, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xA55A, 0x96FD, 0x9EDD, 0x9EFD, 0x96FD, 0x963B, 0x8AF4, 0x8991, 0xA911, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xB992, 0xA55A, 0x9EDD, 0x9EFC, 0x96FD, 0x9EDD, 0x96FD, 0x9EFD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x94F9, 0x81F1, 0x9171, 0xB8D2, 0xC0B1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB992, 0x9DBB, 0x96FD, 0x9EDD, 0x96FD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x9EDD, 0x96FD, 0x96FD, 0x9EFD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x96FD, 0x9EFD, 0x96FD, 0x9EFD, 0x9EFD, 0x96FD, 0x9EFD, 0x96FD, 0x9539, 0x81F1, 0x9171, 0xB0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB911, 0xACFA, 0xB458, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B3, - 0xC993, 0xC993, 0xC992, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8D79, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x95DA, 0x89F2, 0x8971, 0xB8D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0x9931, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DC, 0x96DD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8CD8, 0x8191, 0x9951, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xAC79, 0xACF9, 0xC992, 0xC993, 0xC9B2, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0xC992, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, - 0xC972, 0xC972, 0xC972, 0x8EBC, 0x8EBD, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8D7A, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D39, 0x8EBD, 0x8EDD, 0x8DBA, 0x81F2, 0x9171, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B2, 0xC8B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xA437, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBD, 0x8EBD, 0x8CD8, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0xA4D9, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0x9D3A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8CD8, 0x8191, 0x9951, 0xC8B1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC8B1, 0xC8D1, 0xA478, 0xA4D9, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, - 0xC952, 0xC952, 0xC952, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D59, 0x8191, 0x9171, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xABD7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA931, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC0F2, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8437, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D3A, 0x8EBC, 0x8E1B, 0x81F2, 0x8971, 0xB912, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC112, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F1, 0xA498, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8DBA, 0x8991, 0x8991, 0xC0F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC8F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC132, 0x8E5C, 0x8C17, 0x8191, 0xA931, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C17, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8DBA, 0x81F2, 0x8991, 0xC111, 0xC8F1, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8D2, 0xC8F1, 0xC8F2, 0xC0F1, 0xC0F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC152, 0x95FB, 0xA4B8, 0xC152, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, - 0xC932, 0xC932, 0xC932, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D79, 0x8191, 0x9171, 0xC132, 0xC131, 0xC912, 0xC912, 0xC132, 0xC911, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC911, 0xC912, 0xC912, 0xC112, 0xC912, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8AD4, 0x8191, 0xB152, 0xC912, 0xC131, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC912, 0xC912, 0xC911, 0xC112, 0xC932, 0xC912, 0xC912, 0xC932, 0xC911, 0xC912, 0xC912, 0xC932, 0xC131, 0x9DBA, 0x8EBC, 0x96BC, 0x8EBC, 0x8EDC, 0x96BB, 0x8EBC, 0x8EDC, 0x82D4, 0x8191, 0xB932, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC131, 0xC912, 0xC132, 0xC131, 0xC912, 0xC912, 0xC911, 0xC911, 0xC131, 0xC912, 0xC912, 0xB356, 0x8C36, 0x8191, 0xA151, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC112, 0x9D59, 0x8EBC, 0x96BC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8EBC, 0x82F4, 0x8991, 0xB151, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC131, 0xC932, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC912, 0xC911, 0xC932, 0xC932, 0xC112, 0xC911, 0xC132, 0xC912, 0xC912, 0xC932, 0xB336, 0x96BC, 0xA4F9, 0xC192, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, - 0xC912, 0xC912, 0xC912, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9EDB, 0x9578, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xB417, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA518, 0x9EDB, 0x96DB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x94D8, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC253, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xBAB5, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9599, 0x8191, 0x91B1, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B5, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC972, 0xC1B2, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x8C36, 0x8991, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9598, 0x8191, 0x9191, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC172, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA61A, 0x9EDC, 0xA5DA, 0xC172, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0xC111, 0xC912, 0xC912, 0xC912, - 0xC8F1, 0xC8F1, 0xC8F2, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6DA, 0xA6FA, 0x9D98, 0x8191, 0x9191, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC992, 0xB436, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD99, 0x8A32, 0x8991, 0xC192, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC973, 0xC992, 0xC992, 0xC992, 0xBC36, 0xA69A, 0xA6FA, 0xA6FA, 0xA69A, 0x9395, 0x8991, 0xB992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0xAD98, 0xA6DB, 0xA6DA, 0xA6FA, 0xA6FB, 0xA6FA, 0x9395, 0x8191, 0xB192, 0xC992, 0xC992, 0xC992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC972, 0xC233, 0xAD98, 0xA6FA, 0xA6FB, 0xA639, 0x8A93, 0x9992, 0xC192, 0xC972, 0xC992, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0x9A93, 0x8191, 0xA992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6DA, 0x8B95, 0x8191, 0xB192, 0xC972, 0xC992, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC294, 0xADF9, 0xA6FA, 0xA6DA, 0xA69A, 0x9334, 0x9191, 0xB992, 0xC992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xB497, 0xAEFB, 0xAEFB, 0xB5D9, 0xC952, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, - 0xC0D1, 0xC0D1, 0xC8D2, 0xB71A, 0xB71A, 0xB71A, 0xAEFA, 0xB71A, 0xAF1A, 0xAEFA, 0xA598, 0x8191, 0x9191, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9D3, 0xBC76, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0x9C55, 0x8191, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xC9D3, 0xB5B8, 0xB71A, 0xAF1A, 0xB71A, 0xB6FA, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB6FA, 0xAF1A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xA3B5, 0x8191, 0x9992, 0xC9B2, 0xC9B3, 0xC9D2, 0xC9B2, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xCA13, 0xBDB8, 0xAEFA, 0xAF1A, 0xB71A, 0xB6FA, 0xAEFA, 0xAF19, 0xA4F7, 0x8991, 0xB1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9B3, 0xC9B3, 0xC314, 0xAF1A, 0xAF1A, 0xAEF9, 0xAF1A, 0xAF1A, 0x89F1, 0x8191, 0xC1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B2, 0xC9D3, 0xC9B3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xAEFA, 0xB71A, 0xB6B9, 0x8A93, 0x8991, 0xC1D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B2, 0xA992, 0x8191, 0xA9B2, 0xC9D3, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B2, 0xC9B2, 0xC9B3, 0xB5B8, 0xAF1A, 0xAEFA, 0xAF1A, 0xB71A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xB5B8, 0xB6FA, 0xAF1A, 0xAF1A, 0xB6FA, 0x89F2, 0x8191, 0xC1B2, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xB71A, 0xB6FA, 0xB71A, 0x92F3, 0x89B1, 0xC1B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9D3, 0xC315, 0xB71A, 0xB71A, 0xB71A, 0xBDD9, 0xC132, 0xC0D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, - 0xC0B1, 0xC8B1, 0xC0B1, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA4B5, 0x8191, 0xA1B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0xC496, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF39, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0x99F2, 0x8991, 0xB1D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC577, 0xBF19, 0xBF39, 0xBF39, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9BF5, 0x8191, 0xB1D2, 0xC9F3, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF19, 0xBF19, 0xB6B9, 0x8191, 0x8991, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9D3, 0xC9F3, 0xC9F3, 0xBED8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xAD57, 0x8191, 0x99B2, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x8191, 0xA9B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9C75, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xB6B8, 0x8191, 0x8191, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xADB7, 0x8191, 0x91B1, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC71A, 0xBF1A, 0xC73A, 0xBF3A, 0xC659, 0xC9D3, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, - 0xC0B1, 0xC0B1, 0xC0B1, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8991, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA34, 0xCA13, 0xCA33, 0xCA33, 0xCCB6, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA455, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0x91B1, 0x8191, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA13, 0xC455, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0x8A52, 0x8991, 0xC213, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCD56, 0xC738, 0xC738, 0xC739, 0xB5D7, 0x8191, 0x91B1, 0xCA13, 0xCA13, 0xCA13, 0xD233, 0xCA33, 0xCA33, 0xCA33, 0xCB55, 0xCF38, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0x8191, 0x8191, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xD233, 0xCA13, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCDF7, 0xC738, 0xC738, 0xC738, 0xC739, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xB5D6, 0x8191, 0x99B2, 0xCA33, 0xCA33, 0xD213, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCB74, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0x8AB2, 0x8191, 0xBA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA13, 0xCF39, 0xC739, 0xC759, 0xCF3A, 0xCF39, 0xCED9, 0xC9F3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, - 0xC0B1, 0xC0B1, 0xC0B1, 0xCF57, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA54, 0xCCD6, 0xCF58, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF58, 0xAC75, 0x8191, 0xA9F2, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCE17, 0xCF57, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0x99D2, 0x89B1, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xD6B7, 0xD758, 0xCF58, 0xCF57, 0xCF58, 0xD758, 0xD757, 0xD758, 0xD757, 0xD758, 0xCF58, 0xB535, 0x8191, 0xA1D2, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCA73, 0xCA53, 0xCA53, 0xCC95, 0xD758, 0xD758, 0xCF58, 0xBDD6, 0x8191, 0x99D2, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD254, 0xCA54, 0xD435, 0xD758, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF57, 0xD738, 0xCF58, 0x9AF3, 0x8991, 0xC213, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA54, 0xCA73, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xD253, 0xCA54, 0xD253, 0xCA53, 0xCA54, 0xCE17, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xD617, 0xD758, 0xCF58, 0xCF58, 0xBDD6, 0x8191, 0x91B2, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xD253, 0xD253, 0xCCD6, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF57, 0xD757, 0xCF58, 0xD758, 0x9AF3, 0x8191, 0xBA33, 0xCA54, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xD758, 0xD758, 0xDF59, 0xD779, 0xD759, 0xD759, 0xD6F9, 0xC1F2, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, - 0xC0B1, 0xC0B1, 0xC0B1, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0x99D2, 0x91D2, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xD3D4, 0xDF77, 0xDF77, 0xDF77, 0xDF76, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0x8191, 0x8992, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xCA94, 0xD3D5, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xCA94, 0xCA94, 0xD273, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xD515, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xD294, 0xCA94, 0x8191, 0xAA12, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA93, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xE779, 0xDF19, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, - 0xB8D1, 0xB8D1, 0xC0D1, 0xE776, 0xE796, 0xE797, 0xE797, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2D4, 0xD2B4, 0xD2B4, 0xDD35, 0xE776, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xB474, 0x8191, 0xAA33, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2D4, 0xE656, 0xEF96, 0xE776, 0xE797, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0x99D2, 0x99F2, 0xCAB4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD3F5, 0xE777, 0xE797, 0xEF97, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xE777, 0xEF97, 0x8191, 0x8191, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD3D5, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xCAD4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xDD35, 0xE777, 0xEF76, 0xE796, 0xE797, 0xE797, 0xE776, 0xE796, 0xE776, 0xC534, 0xB494, 0xCC15, 0xD3F5, 0xDBF4, 0xDBF4, 0xDBF5, 0xD3F5, 0xD3F4, 0xCB34, 0x8191, 0xAA32, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xE656, 0xE776, 0xE796, 0xE796, 0xE776, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xDE56, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2D4, 0xCAD4, 0xCAD4, 0xDD15, 0xE796, 0xE796, 0xE776, 0xE796, 0xEF96, 0xE796, 0xE796, 0xE796, 0x9B13, 0x8191, 0xBA73, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xE797, 0xEF97, 0xEF77, 0xEF97, 0xEF78, 0xEF98, 0xEF98, 0xEF98, 0xC992, 0xB8D1, 0xC0D1, 0xC0B1, - 0xB8D1, 0xB8D1, 0xB8D1, 0xF796, 0xF7B6, 0xF796, 0xF795, 0xF795, 0xF796, 0xEFB6, 0xBC93, 0x8191, 0xAA52, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2F4, 0xDD55, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xEFB6, 0xBC93, 0x8191, 0xAA53, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xE675, 0xF796, 0xF795, 0xF796, 0xF796, 0xF796, 0xF7B6, 0xF7B5, 0xF7B5, 0xEF96, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0x99F2, 0x99F2, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2F4, 0xD2F4, 0xDC75, 0xF795, 0xF795, 0xF795, 0xF796, 0xF7B5, 0xF796, 0xF796, 0xF796, 0xF796, 0xEFB6, 0xF7B5, 0xF796, 0x8191, 0x8991, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xDC15, 0xF796, 0xF796, 0xF796, 0xD615, 0x8191, 0x99F2, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xE535, 0xF7B6, 0xF7B5, 0xF796, 0xEFB6, 0xF796, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xF795, 0xF796, 0xF796, 0xF795, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xBC93, 0x8191, 0xAA53, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF796, 0xF7B5, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF7B5, 0xF795, 0xD634, 0x8191, 0x99F2, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2D4, 0xE555, 0xF796, 0xF7B5, 0xF7B6, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xA311, 0x8191, 0xBA94, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xF796, 0xF796, 0xF797, 0xF797, 0xF797, 0xF7B7, 0xF798, 0xF798, 0xD273, 0xB8D1, 0xB8D1, 0xB8D1, - 0xB8D1, 0xB8D1, 0xB8D1, 0xFF94, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD315, 0xD335, 0xD335, 0xD335, 0xD334, 0xD315, 0xD335, 0xE575, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xF675, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB5, 0xFF95, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0x99F2, 0x99F2, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD315, 0xD335, 0xDC54, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0x8191, 0x8191, 0xD334, 0xD315, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xDC34, 0xFFB4, 0xFFB5, 0xFFB5, 0xDE34, 0x8191, 0x99F2, 0xD314, 0xD335, 0xD315, 0xD334, 0xD334, 0xD335, 0xD335, 0xE574, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xC4B3, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xEDF5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0xF694, 0xFFB5, 0xFFB5, 0xFFB5, 0xDE14, 0x8191, 0x99F2, 0xD335, 0xD335, 0xD314, 0xD334, 0xD314, 0xD334, 0xD315, 0xE555, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xA332, 0x8191, 0xBAB4, 0xD335, 0xD335, 0xD335, 0xD315, 0xD334, 0xD335, 0xD335, 0xFFB5, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB7, 0xFFB8, 0xDBD4, 0xB8D2, 0xB8D1, 0xB8D1, - 0xB8D1, 0xB8D1, 0xB8D1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xC3F0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xF590, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x9A12, 0x91F2, 0xD355, 0xD354, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDBD4, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0x8191, 0x8191, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDC13, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x99F2, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xC3CF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xE4D1, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xC3D0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xF590, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x9A12, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD2, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE2F, 0xA2B0, 0x8191, 0xC2F4, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xFE2F, 0xFE50, 0xFE50, 0xFE50, 0xFE51, 0xFE51, 0xFE52, 0xFE52, 0xE3D2, 0xB8D2, 0xB8D1, 0xB8D1, - 0xB8D1, 0xB0D1, 0xB0D2, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xC30F, 0x81B1, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD396, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0x9A12, 0x8191, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xDBD3, 0xFC8D, 0xFC6D, 0xFC6D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC8D, 0xFC6D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD375, 0xD395, 0xD376, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFC8E, 0xFC8F, 0xFC8F, 0xFC8F, 0xFCB0, 0xFCB0, 0xFCB1, 0xFCB1, 0xF3B2, 0xB8D1, 0xB0F1, 0xB8D1, - 0xB0F1, 0xB0F1, 0xB0D1, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9A12, 0x8191, 0xC334, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFC8E, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFC8D, 0xFC8D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB2F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB6F, 0x8191, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFC8E, 0xFC8F, 0xFCAF, 0xFCAF, 0xFCB0, 0xFCB0, 0xFCB0, 0xFCB2, 0xF451, 0xB0D1, 0xB0D1, 0xB0D1, - 0xB0F1, 0xB0F1, 0xB0D1, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xCB4E, 0x8191, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xBB11, 0x8191, 0xAA73, 0xD396, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFCAE, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFCAD, 0xFCCD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD3, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCAD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA94, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xFCAD, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFCCE, 0xFCCF, 0xFCCF, 0xFCEF, 0xFCD0, 0xFCF0, 0xFCF1, 0xFCF1, 0xFCF2, 0xB0F1, 0xB0F1, 0xB0F2, - 0xB0F1, 0xA8F1, 0xB0F1, 0xFD0D, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFD0D, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC6F, 0x91D1, 0x89D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xDBB4, 0xEC70, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFCED, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBF3, 0xFCED, 0xFCED, 0xFCED, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xEC6E, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xF4AF, 0xFD0D, 0xFCED, 0xFD0D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD0E, 0xFD0F, 0xFD0F, 0xFD0F, 0xFD10, 0xFD10, 0xFD31, 0xFD31, 0xFD32, 0xB0F1, 0xB0F1, 0xB0F1, - 0xB0F1, 0xA8F1, 0xB0F1, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xE44E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xC34F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xE431, 0xEC71, 0xEC71, 0xDBF0, 0xE450, 0xF4CF, 0xFD0E, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xF4AF, 0xF4CF, 0xF4AF, 0xDC10, 0x9A12, 0xAA73, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2C, 0xFD2C, 0x9211, 0x8191, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFCEE, 0xFD2D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC10, 0xE44E, 0xDC2E, 0xE44E, 0xB2F0, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD2E, 0xFD2F, 0xFD2F, 0xFD4F, 0xFD50, 0xFD50, 0xFD51, 0xFD51, 0xFD71, 0xA8F1, 0xB0F1, 0xB0F2, - 0xA8F1, 0xA8F1, 0xA8F2, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xE46E, 0x8191, 0x9212, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD2D, 0x9211, 0x89B2, 0xCB75, 0xD396, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xBB2F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD6E, 0xFD6F, 0xFD6F, 0xFD8F, 0xFD90, 0xFD90, 0xFD91, 0xFD91, 0xFD92, 0xA8F1, 0xA8F1, 0xA8F1, - 0xA8F1, 0xA8F1, 0xA8F1, 0xEC6F, 0xFD8D, 0xFDAD, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xE48E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFDAD, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFD8D, 0xE4AE, 0x8991, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xE491, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFDAD, 0xF52D, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFD8D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFDAF, 0xFDAF, 0xFDAD, 0xFDAD, 0xFDAD, 0xFD8D, 0xFDAD, 0xFD8D, 0xEC6F, 0xA8F1, 0xA8F1, 0xA8F1, - 0xA911, 0xA911, 0xA911, 0xEC8E, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xE4CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDED, 0xFDCD, 0xD44F, 0x8191, 0xB2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0x8991, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xBB6F, 0x8191, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDED, 0xFDED, 0xFDED, 0xFDED, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFDEE, 0xFDEF, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xFDED, 0xEC8E, 0xA911, 0xA911, 0xA911, - 0xA911, 0xA911, 0xA111, 0xE42E, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xE4EE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xD44F, 0x8191, 0xBAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xECD1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xF5AD, 0x9A70, 0x89B1, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0E, 0xFE0D, 0xFE0E, 0xFE0E, 0xFE0E, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE0F, 0xFE0F, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xE42E, 0xA111, 0xA911, 0xA911, - 0x80F0, 0xA111, 0xA111, 0xC2B0, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x89D1, 0xA253, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xF60E, 0x9A70, 0x91F2, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF2, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE4E, 0xFE4F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC2B0, 0xA111, 0xA111, 0x80F0, - 0x60EF, 0xA111, 0xA111, 0xA112, 0xFE2D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xE54E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xF5CF, 0xFE6D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE6D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5CE, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6C, 0xFE8D, 0xF62D, 0xC40F, 0x9A12, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE8D, 0xFE6D, 0xFE2D, 0xBBCF, 0x89B1, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE8F, 0xFE8F, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE2D, 0xA112, 0xA111, 0xA111, 0x60EF, - 0x28CD, 0xA111, 0xA111, 0xA111, 0xCBCF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xF5ED, 0x89D1, 0x91D2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xED11, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xC42F, 0x81B1, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFECC, 0xFEAD, 0xC42F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF64D, 0xD4CE, 0xBBD0, 0xC3B2, 0xC314, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xED31, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xEE0D, 0xCC6F, 0xBB51, 0xBAD4, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xC334, 0x8191, 0xB294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFEAE, 0xFECE, 0xFEAD, 0xFEAE, 0xFEAD, 0xFECE, 0xFEAE, 0xFEAE, 0xA2F0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC34, 0xFEAF, 0xFED0, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xCBCF, 0xA111, 0xA111, 0xA111, 0x28CD, - 0x18AD, 0x8110, 0x9911, 0xA111, 0xA171, 0xF5ED, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE6D, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5CF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE4E, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EE, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE8D, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xF64D, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE6E, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF60E, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF64E, 0xFEAC, 0xFEAD, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE6D, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5CF, 0xFEAD, 0xF62E, 0xF5EF, 0xF5D0, 0xF5EF, 0xF5CF, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xFE4F, 0xFECE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAF, 0xF610, 0xF5D0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF610, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xF5ED, 0xA171, 0xA111, 0x9911, 0x8110, 0x18AD, - 0x20AC, 0x38CE, 0x9931, 0x9931, 0x9931, 0xAA31, 0xFE2D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFEAC, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFEAC, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8E, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAF, 0xFEAE, 0xFEAE, 0xFEAF, 0xFE8E, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFE8F, 0xFEB0, 0xFEAF, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE2D, 0xAA31, 0x9931, 0x9931, 0x9931, 0x38CE, 0x20AC, - 0x20AD, 0x20AC, 0x60EF, 0x9912, 0x9931, 0x9931, 0xB270, 0xF62D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE6D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFEB0, 0xFE8C, 0xFE8C, 0xF62D, 0xB270, 0x9931, 0x9931, 0x9912, 0x60EF, 0x20AC, 0x20AD, - 0x18AC, 0x20AC, 0x28AD, 0x8110, 0x9931, 0x9931, 0x9911, 0xAA31, 0xF5CD, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE6E, 0xFE8D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE90, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFE8C, 0xF5CD, 0xAA31, 0x9911, 0x9931, 0x9931, 0x8110, 0x28AD, 0x20AC, 0x18AC, - 0x20AC, 0x20AC, 0x18AC, 0x28AD, 0x9111, 0x9931, 0x9931, 0x9931, 0xA171, 0xCBCF, 0xF60D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE70, 0xFE70, 0xFE6F, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE90, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xE471, 0xCBCF, 0xA171, 0x9931, 0x9931, 0x9931, 0x9111, 0x28AD, 0x18AC, 0x20AC, 0x20AC, - 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x28CD, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xBAB0, 0xDC6F, 0xE50F, 0xE50E, 0xFE4E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6F, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xF612, 0xE531, 0xE512, 0xD472, 0xB271, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x8111, 0x28CD, 0x20AC, 0x18AC, 0x18AC, 0x18AC, - 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x28CC, 0x610F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9911, 0x610F, 0x28CC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, - 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x40CE, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7910, 0x40CE, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, - 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x30CC, 0x58CF, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9932, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x7910, 0x58CF, 0x30CC, 0x18AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp b/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp deleted file mode 100644 index 0899407153..0000000000 --- a/Marlin/src/lcd/tft/images/bootscreen_228x255x2.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t marlin_logo_228x255x2[14535] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFE, 0x90, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x2F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x01, 0xFF, 0xFF, 0xF9, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0x80, 0x02, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xFF, 0xF8, 0x00, 0x6F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xAA, 0x50, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x1F, 0xFF, 0xFF, 0xF9, 0xBD, 0x00, 0xBF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0xBF, 0xFF, 0xFF, 0x00, 0x0B, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x46, 0xFF, 0xFF, 0xD0, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x2F, 0xFF, 0xF8, 0x06, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0xFF, 0xFC, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x2F, 0xFF, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xFF, 0xC2, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xF0, 0x2F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0xFC, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x55, 0x55, 0x56, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0xFF, 0x40, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xBF, 0xFF, 0xFF, 0xFD, 0xBF, 0xC0, 0x2F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6F, 0xFF, 0xFF, 0xDF, 0xE0, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xF7, 0xF8, 0x02, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFD, 0xFD, 0x00, 0xBF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0x7F, 0x00, 0x1F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xDF, 0x80, 0x07, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF7, 0xD0, 0x01, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFD, 0xF0, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7C, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xED, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0xBF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x87, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xF9, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0x40, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x07, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x2F, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xBF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0B, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0xAA, 0xA9, 0x55, 0x55, 0x40, 0x55, 0x56, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xD0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xF0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5A, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x90, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x7F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0B, 0xFF, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0xBF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x07, 0xFF, 0xFD, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xBF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xBF, 0xFF, 0xFF, 0xE0, 0x2F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xBF, 0xFF, 0xFE, 0x0B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xBF, 0xFF, 0xD0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xD0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x2F, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x02, 0xF8, 0x00, 0x00, 0x2F, 0xFF, 0xF0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x80, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x1F, 0xFF, 0xF8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x40, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x0B, 0xFF, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xD0, 0x00, 0x00, 0x00, 0x2F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xD0, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x02, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFD, 0x00, 0x05, 0xAB, 0xFF, 0xE4, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x3F, 0x40, 0x00, 0x02, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFD, 0x6B, 0xFF, 0xFF, 0xE4, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x02, 0xFF, 0xFF, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x00, 0x2F, 0xC0, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x2F, 0xC0, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xE0, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0xBF, 0xFF, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x0F, 0xD0, 0x00, 0x00, 0xBF, 0xFF, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x0B, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0xD0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFD, 0x00, 0x06, 0xFF, 0xFF, 0xAA, 0xA5, 0x40, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFC, 0x00, 0x0B, 0xE0, 0x00, 0x00, 0x3F, 0xFF, 0xD0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xD0, 0x00, 0x2B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x0B, 0xE0, 0x00, 0x00, 0x3F, 0xFF, 0xE0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFD, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x6A, 0x81, 0x6A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x2F, 0xFF, 0xE0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0xFF, 0xD1, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x69, 0x55, 0x00, 0x00, 0x02, 0xFF, 0x80, 0x03, 0xF0, 0x00, 0x00, 0x2F, 0xFF, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xD0, 0xBF, 0xF8, 0x00, 0x00, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xA4, 0x01, 0xFF, 0xC0, 0x02, 0xF0, 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x0B, 0xFF, 0xC0, 0x3F, 0xFC, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0xFF, 0xD0, 0x02, 0xF4, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFE, 0x40, 0x0F, 0xFF, 0x80, 0x3F, 0xFD, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x01, 0xF4, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBE, 0x90, 0x00, 0x2F, 0xFF, 0x80, 0x7F, 0xFD, 0x0A, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0xBF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x16, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0xF8, 0x00, 0x00, 0x0B, 0xFF, 0xF4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x78, 0x00, 0x00, 0x0B, 0xFF, 0xF4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3C, 0x00, 0x00, 0x07, 0xFF, 0xF4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFD, 0x02, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFC, 0x00, 0x3C, 0x00, 0x00, 0x07, 0xFF, 0xF4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFC, 0x02, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFC, 0x00, 0x2C, 0x00, 0x00, 0x03, 0xFF, 0xF4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x6F, 0xFF, 0xFC, 0x07, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFD, 0x00, 0x1C, 0x00, 0x00, 0x03, 0xFF, 0xF4, 0x00, - 0x00, 0x00, 0x05, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBF, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x03, 0xFF, 0xF4, 0x00, - 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x03, 0xFF, 0xF4, 0x00, - 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x02, 0xFF, 0xF4, 0x00, - 0x00, 0x7F, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA, 0xA5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x6A, 0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFA, 0x55, 0x55, 0x55, 0x55, 0x5A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xF4, 0x00, - 0x01, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xF4, 0x00, - 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xF0, 0x00, - 0x0F, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, - 0x2F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, - 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, - 0xBF, 0x00, 0x00, 0x00, 0x00, 0x06, 0xAA, 0x90, 0x00, 0x00, 0x01, 0xAA, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, - 0xFE, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xFE, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x02, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, - 0xFC, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x01, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x07, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF0, 0x00, - 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x05, 0x00, 0x00, 0x01, 0xFF, 0xE0, 0x00, - 0xFC, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xBF, 0xC0, 0x00, 0x01, 0xFF, 0xE4, 0x00, - 0xFC, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xED, 0x00, - 0xFC, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xBF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xDF, 0x00, - 0xFC, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xEA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xBF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xDF, 0x80, - 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xF8, 0x00, 0x2F, 0xFF, 0xFF, 0xFE, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x01, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xEF, 0xC0, - 0xFC, 0x00, 0x00, 0x7F, 0xFF, 0xD0, 0x00, 0x07, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xEF, 0xD0, - 0xFC, 0x00, 0x00, 0xBF, 0xFF, 0x40, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xEF, 0xF0, - 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x2F, 0xFF, 0xC0, 0x00, 0x00, 0x6F, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x06, 0xAA, 0xA0, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xF9, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xBF, 0xF0, - 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xD0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFE, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xD0, 0x7F, 0xFF, 0xFF, 0xF8, 0x02, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xBF, 0x54, - 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xD0, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xF4, 0x1F, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xD0, 0x00, 0x01, 0xFF, 0x7F, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFE, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xD0, 0x00, 0x01, 0xFF, 0x3F, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0xFF, 0xFF, 0xF8, 0x00, 0xFF, 0xD0, 0x00, 0x01, 0xFF, 0x3E, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xF8, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xFE, 0x3E, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xF8, 0x00, 0x2F, 0xF0, 0x00, 0x01, 0xFE, 0x7D, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xFE, 0x40, 0x7F, 0xFF, 0xFD, 0x00, 0x00, 0xBF, 0xFF, 0xF4, 0x07, 0xFF, 0xFF, 0x82, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x1F, 0xFF, 0xFE, 0x01, 0xBF, 0xFF, 0xF0, 0x03, 0xFF, 0xF8, 0x00, 0x2F, 0xF0, 0x00, 0x01, 0xFD, 0x7D, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x7F, 0xFF, 0xF4, 0x00, 0x0B, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0xBF, 0xFF, 0xC2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x2F, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xF4, 0x00, 0xBF, 0xF8, 0x00, 0x2F, 0xF4, 0x00, 0x01, 0xFC, 0x7C, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0xBF, 0xFF, 0xC0, 0x00, 0x02, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xC2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xC0, 0x00, 0x0B, 0xFF, 0xF8, 0x00, 0x3F, 0xF8, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0xFC, 0x3C, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0xBF, 0xFF, 0x40, 0x01, 0xFF, 0xFD, 0x00, 0x00, 0x1F, 0xFF, 0xD2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xFC, 0x00, 0x02, 0xFC, 0x3E, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE1, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xD2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x40, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x02, 0xFC, 0x00, 0x02, 0xF8, 0x1F, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x40, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xFE, 0x00, 0x02, 0xF4, 0x0B, 0x80, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x7F, 0x00, 0x03, 0xF4, 0x03, 0xC0, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0xE0, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x0B, 0xC0, 0x03, 0xF0, 0x00, 0x34, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x02, 0xE0, 0x03, 0xE0, 0x00, 0x0C, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE2, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x74, 0x07, 0xD0, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE1, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x08, 0x07, 0xC0, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xC0, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0xBF, 0xFF, 0xE0, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFD, 0x00, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x80, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x7F, 0xFF, 0xFD, 0x00, 0x00, 0x1F, 0xFF, 0xC0, 0x02, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x40, 0x0B, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x40, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xFA, 0xA8, 0x1F, 0xFF, 0xEA, 0xAB, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE9, 0x0B, 0xFF, 0xF5, 0x55, 0xBF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x02, 0xFF, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0xFC, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0xFD, 0x00, 0x00, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x40, 0x00, 0x00, 0x0F, 0xFF, 0xE0, 0x00, 0x01, 0xBF, 0xFF, 0xFC, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xFC, 0x00, 0x07, 0xF0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFE, 0x00, 0x00, 0x6A, 0xA9, 0x00, 0x00, 0x00, 0x2A, 0xAA, 0x40, 0x00, 0x00, 0x0A, 0xAA, 0x90, 0x00, 0x00, 0x06, 0xAA, 0xA8, 0x0A, 0xAA, 0xAA, 0xAA, 0xAA, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6A, 0x46, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x00, 0x00, 0x02, 0xAA, 0xA0, 0x00, 0x0B, 0xF2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xD3, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC7, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0B, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x07, 0xD0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x02, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF8, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xBF, 0xFA, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x56, 0xFF, 0xE0, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x07, 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x0B, 0x80, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAB, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xA5, 0x55, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFA, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xD0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEA, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFD, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x02, 0xFF, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x01, 0xFF, 0xD0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xBF, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xBF, 0xF8, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xF0, 0x00, 0x7F, 0xFC, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFC, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFE, 0x00, 0x3F, 0xFE, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x40, 0x2F, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF4, 0x0F, 0xFF, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFC, 0x0F, 0xFF, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFE, 0x0B, 0xFF, 0xD0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0x0B, 0xFF, 0xE0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xCB, 0xFF, 0xF0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xD7, 0xFF, 0xF0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xF7, 0xFF, 0xF4, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFD, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFD, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFD, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFD, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF4, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xF0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xD0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp b/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp deleted file mode 100644 index 3ed61a1b20..0000000000 --- a/Marlin/src/lcd/tft/images/bootscreen_228x255x4.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t marlin_logo_228x255x4[29070] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8C, 0xEF, 0xFF, 0xFF, 0xFF, 0xD8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xDF, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x84, 0x32, 0x10, 0x00, 0x46, 0x89, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x28, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x10, 0x00, 0x00, 0x18, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x00, 0x04, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x10, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x00, 0x00, 0x38, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x22, 0x11, 0x11, 0x12, 0x35, 0x57, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x00, 0x00, 0x4B, 0xEF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xEF, 0xFF, 0xFF, 0xFF, 0xED, 0xBA, 0x98, 0x64, 0x00, 0x05, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDF, 0xFF, 0xFF, 0xC5, 0x00, 0x01, 0x6C, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x97, 0x30, 0x37, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x9F, 0xE7, 0x10, 0x01, 0x8D, 0xFF, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x23, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x10, 0x01, 0x8E, 0xFF, 0xFF, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x60, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x0E, 0xFF, 0xFF, 0xF8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x7B, 0xFE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x07, 0xFF, 0xFF, 0xFF, 0xF3, 0x88, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x19, 0xFF, 0xFF, 0xFE, 0x37, 0xDF, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3C, 0xFF, 0xFF, 0xE3, 0x08, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7F, 0xFF, 0xFE, 0x30, 0x3A, 0xFF, 0xF8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xDF, 0xFF, 0xE3, 0x00, 0x7F, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x76, 0x54, 0x44, 0x44, 0x55, 0x66, 0x68, 0x89, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x2A, 0xFF, 0xFF, 0x50, 0x03, 0xDF, 0xFF, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x58, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x8F, 0xFF, 0xE0, 0x00, 0x1B, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFF, 0xF9, 0x00, 0x00, 0x8F, 0xFF, 0xFC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9F, 0xFF, 0xFF, 0xFF, 0xFE, 0x6E, 0xFF, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xF7, 0xCF, 0xF6, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xFF, 0xFF, 0xFF, 0x5C, 0xFF, 0x20, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0xFF, 0xF4, 0xDF, 0xB0, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0xFE, 0x4F, 0xF7, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xEB, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFF, 0xE6, 0xFF, 0x30, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xC8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFD, 0x6F, 0xD0, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xCA, 0xF5, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9A, 0xCE, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xEF, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2F, 0x80, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0x89, 0x91, 0x7F, 0xE7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF2, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6B, 0xEF, 0xFE, 0xB7, 0x18, 0xFB, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCA, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8E, 0xFF, 0xEA, 0x51, 0x01, 0x8B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x40, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x8E, 0xFF, 0xE8, 0x20, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xCF, 0xFF, 0xFA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xDF, 0xFF, 0xFD, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x8C, 0xFF, 0xFF, 0xFF, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x50, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x47, 0x9C, 0xEF, 0xFF, 0xFF, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x68, 0x9C, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x57, 0x8B, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFE, 0xDB, 0xAA, 0x98, 0x88, 0x87, 0x66, 0x55, 0x54, 0x44, 0x43, 0x33, 0x44, 0x55, 0x67, 0x78, 0x89, 0xBC, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x89, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x56, 0x88, 0x9B, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x35, 0x68, 0x8B, 0xBD, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0x56, 0x78, 0x9B, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x68, 0x9B, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x20, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xAE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x20, 0x08, 0xFF, 0xFF, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x8F, 0xFE, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8E, 0xB1, 0x00, 0x00, 0x07, 0xEF, 0xFF, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8E, 0xF8, 0x10, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xFF, 0xFF, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xDF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8F, 0xFF, 0xF7, 0x00, 0x00, 0x13, 0x57, 0x8A, 0xBC, 0xDE, 0xFF, 0xEB, 0x50, 0x6D, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xC4, 0x58, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xCA, 0x63, 0x00, 0x00, 0x00, 0x8F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAF, 0xFF, 0xFF, 0xFF, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xDF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0xBF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xD7, 0x10, 0x00, 0x01, 0x7B, 0xCE, 0xEE, 0xEE, 0xDD, 0xBA, 0x98, 0x88, 0x65, 0x43, 0x32, 0x21, 0x12, 0x33, 0x57, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x8F, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xE7, 0x10, 0x00, 0x00, 0x2A, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x8F, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xE7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x8B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x78, 0x88, 0x82, 0x04, 0x78, 0x98, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x4F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x09, 0xFF, 0xFF, 0xF7, 0x07, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x35, 0x77, 0x78, 0x87, 0x65, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x0D, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFE, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x30, 0x4F, 0xFF, 0xFF, 0xF5, 0x00, 0x8F, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x78, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x98, 0x52, 0x00, 0x06, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x08, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x71, 0x00, 0xAF, 0xFF, 0xFF, 0xE1, 0x00, 0x2F, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x37, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x65, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x08, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x71, 0x00, 0x02, 0xEF, 0xFF, 0xFF, 0xB0, 0x00, 0x3F, 0xFF, 0xFF, 0xF5, 0x00, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x05, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xFF, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x89, 0xBC, 0xCA, 0x84, 0x10, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xFF, 0xF4, 0x01, 0x89, 0xAB, 0xBC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x9F, 0xFF, 0xFF, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x35, 0x68, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0xDF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFA, 0x00, 0x03, 0xFF, 0xFF, 0xFE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x58, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x1F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xF6, 0x00, 0x08, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x0B, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x08, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x23, 0x55, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x5F, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x05, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCC, 0xCC, 0xCC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xFB, 0xA9, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xA8, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, - 0x00, 0x06, 0xEF, 0xFF, 0xE8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, - 0x00, 0x6E, 0xFF, 0xFB, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, - 0x03, 0xEF, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, - 0x0B, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, - 0x5F, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, - 0xAF, 0xFE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x9B, 0xBA, 0x85, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x89, 0xBA, 0xA9, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x48, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xAE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x20, 0x00, 0x00, 0x00, 0x18, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, - 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x07, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, - 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x01, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x01, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, - 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x02, 0x8D, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF9, 0x50, 0x00, 0x00, - 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x04, 0xCE, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF8, 0xD6, 0x00, 0x00, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x8E, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF7, 0xFE, 0x20, 0x00, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF7, 0xFF, 0x80, 0x00, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x00, 0x00, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x31, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x35, 0x55, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEF, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF8, 0xFF, 0xE0, 0x00, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x70, 0x00, 0x00, 0x00, 0x03, 0xEF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x05, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFA, 0xFF, 0xF6, 0x00, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x34, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x35, 0x44, 0x20, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x9F, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xDA, 0xFF, 0xFD, 0x00, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x49, 0xEF, 0xFF, 0xFF, 0xFF, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xCF, 0xFF, 0xFF, 0xFF, 0xC8, 0x20, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x68, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4A, 0xEF, 0xFF, 0xFF, 0xFF, 0xA6, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x5F, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xAD, 0xFF, 0xFF, 0x20, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x09, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x8D, 0xFF, 0x47, 0x60, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x05, 0xFF, 0xFF, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0x5F, 0xFE, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x01, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0x3F, 0xFC, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x03, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0xEF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFE, 0x3F, 0xF9, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x5F, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFB, 0x3F, 0xF8, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x0A, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xF8, 0x4F, 0xF5, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x43, 0x23, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xFF, 0xFE, 0x73, 0x32, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x33, 0x35, 0x8F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xF5, 0x4F, 0xF4, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x40, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFD, 0x20, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF2, 0x4F, 0xF2, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFA, 0x10, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xF2, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xE0, 0x1F, 0xF3, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF4, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x01, 0xDF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xC0, 0x0D, 0xF8, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF7, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0x90, 0x04, 0xFE, 0x00, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x08, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x01, 0xDF, 0xF9, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x60, 0x00, 0x9F, 0x80, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x09, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFE, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x50, 0x00, 0x0C, 0xE2, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x0A, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0x10, 0x00, 0x01, 0xDA, 0x00, - 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xF2, 0x00, 0x00, 0x2F, 0xFC, 0x00, 0x00, 0x00, 0x3E, 0x50, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFB, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x03, 0xD2, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x08, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x50, 0x00, 0x5F, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x11, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x06, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x7F, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFE, 0x50, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBA, 0xA9, 0x80, 0x06, 0xFF, 0xFF, 0xFF, 0xF9, 0x88, 0x88, 0x8C, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFF, 0xF9, 0x84, 0x10, 0x9F, 0xFF, 0xFF, 0xFE, 0x66, 0x66, 0x66, 0xAF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xF1, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x03, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0xFF, 0xFF, 0x70, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0x30, 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAA, 0xAA, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xAA, 0xAA, 0xAA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x89, 0x9A, 0xAA, 0x90, 0x03, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x78, 0xAA, 0x60, 0x6A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xAA, 0xAA, 0xA8, 0x30, 0x00, 0x00, 0x00, 0xBF, 0xFC, 0x08, 0xEF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8F, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF6, 0x3F, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1F, 0xFF, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xD1, 0x4F, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x07, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0x60, 0x6F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xBF, 0xFF, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, 0xF8, 0x00, 0x6F, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0A, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0x90, 0x00, 0x6F, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9F, 0xFF, 0xFD, 0x88, 0x64, 0x44, 0x33, 0x22, 0x22, 0x21, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, 0x12, 0x22, 0x22, 0x33, 0x45, 0x56, 0x79, 0xEF, 0xFF, 0xF8, 0x10, 0x00, 0x6F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x50, 0x00, 0x00, 0x7F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x82, 0x00, 0x00, 0x00, 0x8F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x38, 0xBD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x71, 0x00, 0x00, 0x00, 0x04, 0xEF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x66, 0x66, 0x66, 0x77, 0x78, 0x88, 0x89, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xBB, 0xBC, 0xDF, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEC, 0xCA, 0x98, 0x88, 0x77, 0x77, 0x77, 0x88, 0x9A, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xB9, 0x86, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x56, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7B, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xFF, 0xFF, 0xFB, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x8C, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xD8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFE, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFE, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xE9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xEA, 0x98, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFA, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0xFF, 0xFF, 0xFF, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xA7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0x90, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x10, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF2, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xF8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x00, 0x08, 0xFF, 0xFF, 0xFE, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x01, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x00, 0xDF, 0xFF, 0xFF, 0xF2, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xFA, 0x00, 0xBF, 0xFF, 0xFF, 0xF7, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x8F, 0xFF, 0xFF, 0xFA, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xC0, 0x8F, 0xFF, 0xFF, 0xFE, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0xFF, 0xFF, 0xFF, 0xF5, 0x5F, 0xFF, 0xFF, 0xFF, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFE, 0x6F, 0xFF, 0xFF, 0xFF, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0xFF, 0xFB, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0xFF, 0xF8, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xFF, 0xF6, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xF5, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xF2, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xC0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0xFF, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFE, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xF9, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF4, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFA, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp deleted file mode 100644 index cad6f1fef1..0000000000 --- a/Marlin/src/lcd/tft/images/bootscreen_320x240x16.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint16_t marlin_logo_320x240x16[76800] = { - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x28EE, 0x8252, 0xCB54, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x394F, 0xB313, 0xD395, 0x7211, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18CD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x496F, 0xCB55, 0xD395, 0xBB54, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x208D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00FA, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x61D0, 0xD395, 0xD395, 0xD395, 0x69F1, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x61D0, 0xD395, 0xD395, 0xD396, 0xD375, 0x310E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x011A, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18CE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x392F, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10F2, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x8252, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x5190, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AF, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18EE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F9, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10F2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x08D5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x8252, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x412F, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0355, 0x190F, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F4, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0x496F, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x11D1, 0x03B7, 0x0A93, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x28EE, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9AB3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x00F9, 0x00F9, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x10AF, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x208D, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0356, 0x03B7, 0x03B7, 0x190F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x7A31, 0xD395, 0xD395, 0xD375, 0xDB95, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x11D1, 0x03B8, 0x03B7, 0x03B8, 0x0A94, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x00F9, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x08F5, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0xD395, 0xD395, 0xB313, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0356, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x190E, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0xA2D3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xA2D3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x11D1, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0A94, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAAD3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0356, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x190F, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x61D0, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0397, 0x03B8, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x59D0, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x011A, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D1, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAAD3, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x61B1, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x8A92, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x188D, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x03B8, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0xAAD3, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0x310E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x10D1, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03D7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B8, 0x0397, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0x7231, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x10D3, 0x08D3, 0x10D2, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x20AE, 0x8A92, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x7A31, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x28EE, 0xC374, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xA2D3, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CE, 0x194F, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B8, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x61D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0x69F1, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1930, 0x02F5, 0x03B7, 0x03B8, 0x0356, 0x114F, 0x18AD, 0x18AD, 0x18AD, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x03B7, 0x03B8, 0x03B7, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F4, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x9AB3, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0x412F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x190F, 0x0377, 0x0397, 0x03B8, 0x0398, 0x0397, 0x0B77, 0x18CE, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B8, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x0BB7, 0x0398, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0xC355, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x4970, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x1253, 0x0B78, 0x0B98, 0x0B78, 0x0B98, 0x0B98, 0x1378, 0x11F2, 0x18AD, 0x18AD, 0x0B98, 0x0B78, 0x0B78, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0B98, 0x1378, 0x0B78, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x4970, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0x8252, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x1AB5, 0x1B78, 0x1B58, 0x1358, 0x1B78, 0x1378, 0x1358, 0x1A13, 0x18AE, 0x18AE, 0x1358, 0x1358, 0x1378, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x1358, 0x1358, 0x1358, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x7A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD395, 0xC354, 0x5990, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1A54, 0x1B38, 0x1B38, 0x2338, 0x1B38, 0x1B58, 0x2338, 0x21D2, 0x18AD, 0x18AD, 0x2338, 0x2338, 0x2358, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1930, 0x2339, 0x2358, 0x2338, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0xA2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0x4970, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x2150, 0x2B18, 0x2B39, 0x2B18, 0x2B19, 0x2B19, 0x2AF8, 0x18CE, 0x18AD, 0x18AD, 0x2B19, 0x2B18, 0x2B19, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x2192, 0x2B19, 0x2B19, 0x2B18, 0x2338, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0xBB34, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x4970, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x2192, 0x2B19, 0x3319, 0x32F9, 0x2A15, 0x18EF, 0x20AD, 0x18AD, 0x18AD, 0x32F9, 0x3319, 0x32F9, 0x18AD, 0x18AD, 0x18AD, 0x2191, 0x3319, 0x2AF9, 0x3319, 0x2AF9, 0x2A97, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x20CF, 0x28CF, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x71D1, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20CD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, - 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x3AD9, 0x3AD9, 0x3AD9, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x3AF9, 0x3AD9, 0x3AD9, 0x18AD, 0x20AD, 0x3215, 0x3AD9, 0x3AF9, 0x3ADA, 0x3AD9, 0x3277, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x20CD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x4950, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD374, 0xD375, 0xD355, 0xD355, 0xAAB3, 0x20CE, 0x18CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0398, 0x0398, 0x0398, 0x0398, 0x03B7, 0x0397, - 0x18AD, 0x18AD, 0x08F5, 0x0139, 0x011A, 0x0117, 0x00F7, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x42D9, 0x42B9, 0x42B9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x42B9, 0x42B9, 0x42BA, 0x18AE, 0x31F5, 0x42DA, 0x42D9, 0x42B9, 0x42D9, 0x3A77, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x5991, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD374, 0xD375, 0xD355, 0xD355, 0xD355, 0x9252, 0x30EF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, - 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x10F3, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4A99, 0x4AB9, 0x4A9A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4ABA, 0x4ABA, 0x4A9A, 0x4257, 0x4A99, 0x4A9A, 0x4A9A, 0x4ABA, 0x4237, 0x20CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x0119, 0x0119, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x69F1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xCB14, 0x4130, 0x20AF, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x42B9, 0x4A99, 0x42B9, 0x42BA, 0x18AD, 0x18AD, - 0x18AD, 0x18AF, 0x011A, 0x00F9, 0x10D0, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x527A, 0x527A, 0x527A, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x527A, 0x527A, 0x529A, 0x527A, 0x527A, 0x527A, 0x527A, 0x4A18, 0x20CE, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18D2, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x8253, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xD355, 0x7A11, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x6A3B, 0x6A3B, 0x6A3B, 0x621A, 0x6A3B, 0x6A3B, - 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x20AE, 0x08F3, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x5A5B, 0x5A5A, 0x5A7A, 0x2910, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x5A5A, 0x5A7B, 0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A, 0x4A18, 0x20CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x091A, 0x18F2, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x8232, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xA293, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x89BC, 0x89BC, 0x89BC, 0x91BC, 0x89BC, 0x899C, - 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x623A, 0x623B, 0x625A, 0x621A, 0x2910, 0x18CD, 0x18AD, 0x18AD, 0x623B, 0x623A, 0x625A, 0x623B, 0x623B, 0x51F8, 0x20CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0119, 0x0917, 0x18D2, 0x18D2, 0x0918, 0x091A, 0x0918, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30D0, 0x30F0, 0x30F0, 0x8252, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD335, 0x9253, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA93D, 0xA93D, 0xA93D, 0xB13D, 0xA93D, 0xA93D, - 0x18AD, 0x20AD, 0x18AE, 0x0117, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x59D8, 0x6A1B, 0x6A1B, 0x6A1B, 0x6A1B, 0x4133, 0x18AD, 0x18AD, 0x6A3B, 0x6A1B, 0x6A1B, 0x6A1B, 0x51B6, 0x20CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10D3, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18D1, 0x20CE, 0x20CE, 0x18D1, 0x093A, 0x093A, 0x28EF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x9273, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD334, 0xD335, 0xD334, 0xD334, 0xD314, 0xD315, 0xAA93, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20CE, 0x61B8, 0x721B, 0x71FB, 0x721B, 0x721B, 0x4133, 0x20AD, 0x71FB, 0x721B, 0x71FB, 0x4174, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0119, 0x011A, 0x18D1, 0x20AE, 0x20CE, 0x20F1, 0x093A, 0x093A, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0xAAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AE, 0x20AD, 0x20AD, 0x20AE, 0x30EE, 0x6150, 0x81B1, 0xA1F2, 0xC233, 0xCA53, 0xCA54, 0xCA53, 0xC233, 0xA1F2, 0x8191, 0x512F, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x20CE, 0x69B9, 0x81FB, 0x79DB, 0x79DC, 0x81FC, 0x5976, 0x79DB, 0x79DC, 0x81DC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0918, 0x0119, 0x0917, 0x18D0, 0x20D0, 0x0917, 0x093A, 0x1138, 0x28CF, 0x30CF, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x3911, 0xAAD4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD315, 0xD315, 0xD314, 0x69B2, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x410F, 0x6990, 0x99F2, 0xC253, 0xCA74, 0xD274, 0xCA74, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xD253, 0xCA53, 0xD233, 0xCA33, 0xC213, 0x8991, 0x410F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0917, 0x0119, 0x0119, 0x10CF, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AE, 0x7199, 0x89DB, 0x89BC, 0x81BC, 0x89BC, 0x89BC, 0x89BC, 0x89BC, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D2, 0x0119, 0x0119, 0x093A, 0x093A, 0x093A, 0x093A, 0x20F2, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x3111, 0x3911, 0x3911, 0xB2F5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD314, 0xD314, 0xD2F4, 0xD2F5, 0xCAD4, 0x5971, 0x30F0, 0x30D0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x38EF, 0x79B1, 0xBA53, 0xCA94, 0xCA94, 0xCA74, 0xD273, 0xD273, 0xCA73, 0xCA54, 0xCA53, 0xCA54, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xCA13, 0xCA13, 0xA1B2, 0x490F, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CE, 0x7979, 0x919C, 0x919C, 0x91BC, 0x919C, 0x899C, 0x89BC, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x18F2, 0x0919, 0x091A, 0x091A, 0x0919, 0x20F3, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x4112, 0xB2F5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD314, 0xD2F5, 0xD2F4, 0xD2F4, 0x4930, 0x30F0, 0x30EF, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x4130, 0x89F1, 0xD294, 0xD294, 0xCA93, 0xCA74, 0xD274, 0xCA74, 0xCA74, 0xCA53, 0xCA73, 0xD253, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xC274, 0x9B36, 0x83B8, 0x6419, 0x6C39, 0x6439, 0x6C1A, 0x8B57, 0xB295, 0xCA13, 0x9191, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x28AE, 0x8159, 0x917C, 0x997C, 0x997C, 0x999C, 0x999C, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20D0, 0x20D1, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD314, 0xD2F4, 0xD2F4, 0xD315, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2D5, 0x79D2, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x30D0, 0x28EF, 0x28F0, 0x28CF, 0x5150, 0xAA32, 0xD293, 0xD294, 0xD294, 0xCA93, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0xD274, 0xD254, 0xCA53, 0xCA54, 0xB2D5, 0x83B8, 0x44FC, 0x1DBE, 0x063F, 0x0CDB, 0x0B76, 0x1377, 0x1377, 0x0B76, 0x1356, 0x0B76, 0x0B77, 0x23F8, 0x6991, 0x510F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x8939, 0xA17C, 0xA17C, 0xA15D, 0xA15D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8A54, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2D4, 0xCAD4, 0x5951, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x4130, 0x91F2, 0xD294, 0xD294, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA74, 0xD274, 0xD274, 0xD274, 0xD253, 0xB2D5, 0x7419, 0x257D, 0x063F, 0x061F, 0x057D, 0x12B5, 0x190F, 0x18CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CE, 0x913A, 0xA93D, 0xA95D, 0xA95C, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xCAB4, 0x5172, 0x3911, 0x38F1, 0x38F0, 0x30F0, 0x81D2, 0xC294, 0xD294, 0xD293, 0xD294, 0xD294, 0xCA93, 0xCA93, 0xD274, 0xD274, 0xCA73, 0xD274, 0x83D8, 0x353D, 0x061F, 0x063F, 0x063F, 0x063F, 0x4C5A, 0x4970, 0x20AE, 0x20AE, 0x20AD, 0x18CD, 0x20AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xB11D, 0xB11D, 0xB11D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6B36, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D5, 0xD2D4, 0xCAD4, 0xCAB4, 0x5972, 0x3911, 0x5151, 0xB253, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xD274, 0xC294, 0x645A, 0x1DBE, 0x063F, 0x063F, 0x063F, 0x1DBE, 0x6459, 0xC274, 0x99D2, 0x28CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18CE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0xB8FE, 0xB8FD, 0xB8FE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253B, 0x465C, 0x6D7B, 0x6D9A, 0x6D9A, 0x6D7A, 0x84F9, 0x9C78, 0x9C77, 0x9C78, 0x9C78, 0x9C57, 0x9C78, 0x9C58, 0x9C58, 0xBBB6, 0xD334, 0xD315, 0xD334, 0xD315, 0xD314, 0xD315, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2D4, 0x91F3, 0x5972, 0xCA74, 0xD2B4, 0xD2B4, 0xD294, 0xCA94, 0xD294, 0xD294, 0xCA94, 0xCA74, 0xC2B4, 0x6C5A, 0x0DFF, 0x063F, 0x063F, 0x063F, 0x353D, 0x83B8, 0xCA53, 0xCA33, 0x89B1, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0xC0DE, 0xC0FE, 0xC0DD, 0x18AE, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x00FA, 0x08F4, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x38F1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4D1A, 0x6D9A, 0x94B9, 0x9C98, 0x9C77, 0x9C78, 0x9C78, 0x9C78, 0x94B8, 0x6D7A, 0x6D7A, 0x6D7B, 0x367C, 0x367D, 0x1EFE, 0x077F, 0x075F, 0x1EDE, 0x363D, 0x6D3A, 0x9C17, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2B4, 0xCAD4, 0xD2B3, 0xCAB4, 0xC294, 0xCAB4, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0x7BD8, 0x0DFF, 0x063F, 0x061F, 0x063F, 0x4CBB, 0x9B57, 0xD233, 0xCA33, 0xCA53, 0x6150, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0917, 0x0119, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC8BE, 0xC8DE, 0xC8BE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xA2B5, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD334, 0xD335, 0xD335, 0xD335, 0xD335, 0xBB96, 0xA437, 0x74F9, 0x4DBC, 0x2E7E, 0x0EDF, 0x559B, 0x8498, 0xC335, 0xD2F4, 0xD2D4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2B5, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xBAB4, 0xBAF6, 0xCA94, 0xD294, 0xCA94, 0xD273, 0x9B76, 0x1DBE, 0x061F, 0x063F, 0x0DDF, 0x643A, 0xB2D5, 0xCA54, 0xD253, 0xCA53, 0xC294, 0x59B1, 0x28CE, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x40B0, 0xA09A, 0xD0BE, 0xD09E, 0xD0BE, 0xB89C, 0x78B5, 0x28AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xBB15, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD335, 0xD315, 0xD314, 0xD315, 0xD2F5, 0xD2F5, 0xD2F4, 0x9BF7, 0x6D1A, 0x2E3D, 0x45BC, 0x9418, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xC2D4, 0x4CDB, 0x7BD8, 0x9B57, 0x44FC, 0x063F, 0x063F, 0x1DBE, 0x83D8, 0xC294, 0xCA53, 0xCA54, 0xCA33, 0xCA53, 0xB2B5, 0x33B8, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188E, 0x20CD, 0x10D1, 0x0119, 0x011A, 0x10D1, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x40B0, 0xD07D, 0xD87E, 0xD89F, 0xD89F, 0xE07F, 0xD89E, 0xD89F, 0xB87B, 0x28AE, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xBB14, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD314, 0xD335, 0xD315, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xC335, 0x8478, 0x4D7B, 0x4D5B, 0xAB96, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCA94, 0xCAB4, 0xD294, 0xD294, 0xD273, 0xC2B4, 0x5C9A, 0x061F, 0x061F, 0x063F, 0x7419, 0xD273, 0xD273, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xAAF6, 0x153C, 0x2951, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x10B0, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x208D, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB07A, 0xE85F, 0xE85F, 0xE07F, 0xE85F, 0xE87F, 0xE07F, 0xE85F, 0xE07F, 0x9898, 0x20AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xBB15, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD354, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD315, 0xCB34, 0xD315, 0xD314, 0xD314, 0xD315, 0xD314, 0xD2F4, 0xD2F5, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D5, 0xD2D4, 0xD2D4, 0xBB55, 0x7499, 0x35DC, 0x8439, 0xC2F4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xCA93, 0xD294, 0xD274, 0xCA74, 0x9B76, 0x061F, 0x061F, 0x83D8, 0xC295, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0x7BB8, 0x063F, 0x2A34, 0x30F0, 0x30F0, 0x30EF, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x38B0, 0xF05F, 0xE83F, 0xF03F, 0xF05F, 0xF05F, 0xF03F, 0xF03F, 0xF03F, 0xF05F, 0xE83F, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xBB35, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xCB35, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xCAD4, 0xD2F4, 0xCAD4, 0xD2D4, 0xD2D4, 0xCAB4, 0xD2B4, 0xCAB4, 0xCAB4, 0x8BF8, 0x3D5C, 0x6499, 0xC2D4, 0xD294, 0xD294, 0xCA74, 0xCA74, 0xD274, 0xCA74, 0xCA74, 0x54BB, 0x5C9A, 0x353D, 0x1DBE, 0x4CBB, 0x9377, 0x9B36, 0x44FC, 0x061F, 0x1BF9, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F4, 0x10F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x5092, 0xF83F, 0xF83F, 0xF03F, 0xF83F, 0xF83F, 0xF83F, 0xF83F, 0xF81F, 0xF03F, 0xF83F, 0x5092, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69B3, 0xC355, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD335, 0xD335, 0xD314, 0xD314, 0xD314, 0xD2F5, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0x9B97, 0x453C, 0x6C59, 0xC2B4, 0xCA74, 0xD274, 0xD273, 0xCA73, 0xD273, 0xC294, 0x6C39, 0xC294, 0xCA53, 0x8B98, 0x4CBB, 0x0DFF, 0x063F, 0x0D7E, 0x3972, 0x3911, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x5092, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x5092, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA94, 0x9B77, 0x44DC, 0x73F9, 0xCA73, 0xCA74, 0xD254, 0xCA73, 0xCA53, 0xC294, 0x351C, 0x6C3A, 0xC294, 0xD253, 0xCA34, 0x83B8, 0x5A55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4090, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x28AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69D3, 0xC355, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xCB55, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAD4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA94, 0xD274, 0xCA74, 0x8B78, 0x447C, 0xA316, 0xD253, 0xD253, 0xCA54, 0xCA53, 0xC294, 0x257D, 0x0DDF, 0x83B8, 0xD233, 0xCA33, 0xCA33, 0xBA13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x30D0, 0x30D0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x00F9, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x00F9, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x011A, 0x0119, 0x011A, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0xD03C, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xD03C, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xAAD4, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD294, 0xD2B4, 0xCA94, 0xCA94, 0xD294, 0xCA74, 0xCA73, 0xCA74, 0xD274, 0xC295, 0x6BB9, 0x6B99, 0xCA54, 0xCA53, 0xD254, 0xCA33, 0xC294, 0x24FD, 0x063F, 0x351D, 0xB295, 0xCA13, 0xCA13, 0xCA13, 0xB9F3, 0x7992, 0x4111, 0x4112, 0x38F1, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CF, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x0118, 0x00F9, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00FA, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x4090, 0xF03F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x6073, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20CD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xCB55, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD314, 0xD335, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xCA73, 0xCA53, 0xCA53, 0xCA74, 0xAAB6, 0x5B7A, 0xBA74, 0xCA53, 0xCA33, 0xCA33, 0xC254, 0x4BFB, 0x059F, 0x0D7F, 0x8B57, 0xC9F3, 0xCA13, 0xC9F3, 0xC9F3, 0xA9B3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0118, 0x10CF, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4091, 0xE01D, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x7074, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x10D2, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AE, 0x18CD, 0x20AE, 0x20CD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xB2F4, 0xD395, 0xDB95, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD334, 0x84F9, 0x467D, 0x1F5E, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x079F, 0x1F1E, 0x367D, 0x367C, 0x4DDB, 0x653A, 0x8498, 0x9BF7, 0xC2F5, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA73, 0xD253, 0xD254, 0xCA74, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0x72D9, 0xAA76, 0xCA33, 0xD233, 0xCA13, 0xCA33, 0x1C7E, 0x059F, 0x05FF, 0x5C7A, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10B0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x7074, 0x9077, 0x8856, 0x8876, 0x388F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18CD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x3111, 0x38F1, 0x3911, 0x4111, 0x4132, 0x6193, 0xC355, 0xD396, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xB3D6, 0x271D, 0x07FF, 0x07FF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x079F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x075F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x079F, 0x079F, 0x1EFE, 0x461C, 0x6D1A, 0x9BD6, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xD274, 0xCA74, 0xCA53, 0xD254, 0xCA54, 0xD253, 0xCA53, 0xCA33, 0xA275, 0x9A76, 0xCA33, 0xCA13, 0xCA33, 0x9AD6, 0x04FF, 0x05BF, 0x063F, 0x357C, 0xC254, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F8, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F9, 0x08F5, 0x18AE, 0x20AD, 0x18AD, 0x08F4, 0x0119, 0x011A, 0x00F7, 0x0117, 0x0119, 0x011A, 0x08F5, 0x20AE, 0x20AE, 0x20AD, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xCB55, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xCB55, 0xD334, 0xCB55, 0xAC17, 0x0FBF, 0x07FF, 0x07FF, 0x07BF, 0x07BF, 0x077F, 0x075F, 0x075F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x075F, 0x075F, 0x077F, 0x077F, 0x079F, 0x07BF, 0x365C, 0x74B9, 0xB315, 0xCA73, 0xCA54, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xD233, 0xCA33, 0xB235, 0xAA16, 0xCA33, 0xCA13, 0xCA13, 0x7B37, 0x055F, 0x05FF, 0x067F, 0x25DD, 0xA2F5, 0xD1D3, 0xC9F3, 0xC9D3, 0xC9D2, 0xC9D3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x0119, 0x00F9, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D3, 0x18CE, 0x20AD, 0x10F4, 0x011A, 0x0119, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61B3, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0x8CB8, 0x0FBF, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06DF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x071F, 0x071F, 0x071F, 0x073F, 0x073F, 0x073F, 0x073F, 0x075F, 0x075F, 0x071F, 0x2DFD, 0x7419, 0xB2B5, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xD233, 0xCA14, 0xA215, 0xCA13, 0xCA13, 0xC9F3, 0x8338, 0x05BF, 0x063F, 0x06BF, 0x0E9F, 0xAAD5, 0xC9D3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B2, 0xB1B2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18CF, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x20AE, 0x18D0, 0x0119, 0x0119, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3111, 0x38F1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD354, 0xD355, 0xD355, 0xC395, 0x5DFA, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06DF, 0x06BF, 0x06BF, 0x069F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x06BF, 0x06DF, 0x06DF, 0x06FF, 0x06FF, 0x06FF, 0x071F, 0x071F, 0x06FF, 0x06BF, 0x065F, 0x05BF, 0x443C, 0x8AF7, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA13, 0x99B6, 0xC9F3, 0xCA13, 0xC9F3, 0x4C3B, 0x061F, 0x069F, 0x06FF, 0x0EBE, 0xA2D5, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9B2, 0xC1B3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30F0, 0x28F0, 0x30D0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x20AE, 0x20AD, 0x18CE, 0x0119, 0x0119, 0x10D3, 0x20CE, 0x20AE, 0x10F4, 0x0119, 0x011A, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xBB35, 0xD395, 0xD396, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xBBD6, 0x5DFB, 0x0FBF, 0x07FF, 0x07DF, 0x07BF, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06DF, 0x06BF, 0x069F, 0x069F, 0x067F, 0x067F, 0x067F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x067F, 0x065F, 0x065F, 0x067F, 0x067F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x06DF, 0x06BF, 0x069F, 0x065F, 0x05FF, 0x053F, 0x049F, 0x1BBE, 0x8298, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xD1F3, 0x99B6, 0xC9F3, 0xC9F3, 0xB254, 0x0D9F, 0x067F, 0x06DF, 0x06FF, 0x0EBF, 0xA2D5, 0xC9D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011A, 0x10F5, 0x20CE, 0x20CF, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xBB35, 0xD395, 0xD396, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xAC37, 0x6D9A, 0x2EFE, 0x07FF, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x075F, 0x073F, 0x071F, 0x06DF, 0x06BF, 0x069F, 0x067F, 0x065F, 0x065F, 0x063F, 0x063F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x05FF, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x063F, 0x063F, 0x063F, 0x065F, 0x065F, 0x065F, 0x065F, 0x067F, 0x067F, 0x063F, 0x05DF, 0x055F, 0x04BF, 0x043F, 0x037F, 0x1ABE, 0x7A18, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC1F4, 0x7178, 0xC9F2, 0xD1F3, 0x8338, 0x061F, 0x06BF, 0x06FF, 0x071F, 0x0EDF, 0xA2D5, 0xC9B3, 0xC9B3, 0xC9B2, 0xC992, 0xC992, 0xC993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x20AD, 0x20AE, 0x20AE, 0x18CE, 0x0918, 0x011A, 0x011A, 0x0919, 0x011A, 0x0917, 0x20CF, 0x28AE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xA2B4, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xC3B6, 0x8519, 0x4E3C, 0x0F9F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x06FF, 0x06BF, 0x069F, 0x067F, 0x065F, 0x063F, 0x061F, 0x061F, 0x05FF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05FF, 0x05FF, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x05DF, 0x057F, 0x04FF, 0x047F, 0x03DF, 0x031F, 0x025F, 0x19DE, 0x79B8, 0xC9F3, 0xCA13, 0xC9F3, 0xB9D3, 0xA1B5, 0xC9D3, 0xC9F3, 0x4C5B, 0x065F, 0x06DF, 0x071F, 0x071F, 0x0EDF, 0xA2B5, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC993, 0xC992, 0xB172, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30EF, 0x28EF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x10F3, 0x10F3, 0x10D2, 0x20AE, 0x18AE, 0x20AE, 0x18CE, 0x20CE, 0x20CE, 0x20CE, 0x18F2, 0x10F4, 0x1114, 0x18F3, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xA2B5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xC3B5, 0x7D59, 0x36BD, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x071F, 0x06DE, 0x069E, 0x067E, 0x065E, 0x063F, 0x063F, 0x061E, 0x05FF, 0x05DF, 0x05BF, 0x05BF, 0x059F, 0x059F, 0x059F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x059F, 0x059F, 0x059F, 0x05BF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x057F, 0x04FF, 0x049F, 0x03FF, 0x037F, 0x02BF, 0x021F, 0x017F, 0x213D, 0x9996, 0xC9F3, 0xC9F3, 0xB9D4, 0x99B6, 0xC9D3, 0xC213, 0x0DBF, 0x069F, 0x06FF, 0x071F, 0x073F, 0x0EFF, 0xA2B5, 0xC992, 0xC992, 0xC992, 0xC992, 0xC972, 0xC972, 0xA972, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AE, 0x18CE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AF, 0x20CE, 0x28CE, 0x28CF, 0x28EF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xAAB5, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0x94D8, 0x467C, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x06DE, 0x06BE, 0x067E, 0x067E, 0x065E, 0x063E, 0x061E, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x059F, 0x057F, 0x057F, 0x055F, 0x055F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x055F, 0x055F, 0x055F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x055F, 0x04FF, 0x04BF, 0x041F, 0x039F, 0x031F, 0x025F, 0x01BF, 0x013F, 0x00BF, 0x40FB, 0xB1B5, 0xC9D2, 0xB1D5, 0xB1D4, 0xC9B3, 0x6399, 0x061F, 0x06DF, 0x071F, 0x073F, 0x073F, 0x0EFF, 0xA2B5, 0xC992, 0xC992, 0xC972, 0xC972, 0xC992, 0xC972, 0xB152, 0x4111, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CF, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30D0, 0x28F0, 0x3110, 0x30F0, 0x30F0, 0x30F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4A16, 0xA2B5, 0xD395, 0xD395, 0xD395, 0xD375, 0x8539, 0x1F5E, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x07BF, 0x075F, 0x06BE, 0x069D, 0x067D, 0x065D, 0x063D, 0x063D, 0x061D, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055F, 0x053F, 0x053F, 0x051F, 0x051F, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x051F, 0x051F, 0x051F, 0x051F, 0x051F, 0x051F, 0x053F, 0x053F, 0x051F, 0x04DF, 0x04BF, 0x043F, 0x03DF, 0x035F, 0x02BF, 0x021F, 0x017F, 0x00FF, 0x009F, 0x087F, 0x7119, 0xC9D3, 0xB1D4, 0xB9D3, 0xC9B3, 0x1CFE, 0x065F, 0x06FF, 0x071F, 0x073F, 0x073F, 0x1EBE, 0xB9F3, 0xC993, 0xC972, 0xC992, 0xC972, 0xC973, 0xC952, 0xB152, 0x4111, 0x3910, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20CD, 0x20CE, 0x20AE, 0x20AE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4A15, 0x3439, 0x16BD, 0x8519, 0xD395, 0xD395, 0xD395, 0x94D8, 0x1F5E, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x071E, 0x069D, 0x069D, 0x067D, 0x065D, 0x063D, 0x063D, 0x061D, 0x05FD, 0x05DD, 0x05BD, 0x059D, 0x059E, 0x057E, 0x055E, 0x053E, 0x051E, 0x04FF, 0x04FF, 0x04DF, 0x04BF, 0x04BF, 0x04BF, 0x049F, 0x049F, 0x049F, 0x049F, 0x049F, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04DF, 0x04BF, 0x04DF, 0x04DF, 0x04DF, 0x04BF, 0x049F, 0x043F, 0x03DF, 0x035F, 0x02FF, 0x025F, 0x01BF, 0x013F, 0x00DF, 0x007F, 0x005F, 0x185E, 0x8957, 0x61B9, 0xC9D3, 0x9A96, 0x059F, 0x067F, 0x06FF, 0x071F, 0x073F, 0x075F, 0x267D, 0xB9D3, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC952, 0xB152, 0x4111, 0x38F1, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18CF, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x00F6, 0x18CE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x38F1, 0x38F1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69B4, 0x6336, 0x6CD9, 0x4E5B, 0x07DF, 0x8539, 0xD395, 0xD395, 0xBC17, 0x3E9C, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07DF, 0x06BD, 0x069C, 0x069C, 0x067C, 0x065C, 0x065C, 0x063C, 0x061C, 0x05FC, 0x05DC, 0x05BC, 0x05BD, 0x059D, 0x057D, 0x055D, 0x053E, 0x051E, 0x04FE, 0x04DE, 0x04BE, 0x04BF, 0x049F, 0x047F, 0x047F, 0x047F, 0x045F, 0x045F, 0x045F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x049F, 0x047F, 0x045F, 0x041F, 0x03DF, 0x037F, 0x031F, 0x029F, 0x021F, 0x017F, 0x011F, 0x00BF, 0x005F, 0x001F, 0x001F, 0x00FF, 0x89B7, 0xC9B3, 0x447B, 0x065F, 0x06BF, 0x071F, 0x073F, 0x073F, 0x075F, 0x3D9B, 0xC972, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xA132, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x20CD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x011A, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3931, 0x40F1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61B3, 0x9274, 0xB2F5, 0xC355, 0xD395, 0xD395, 0xD395, 0xBC16, 0x469D, 0x8539, 0xD376, 0xD375, 0x6DBA, 0x0F9F, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x077F, 0x06BC, 0x06BB, 0x069B, 0x067B, 0x065B, 0x063B, 0x063B, 0x061B, 0x05FB, 0x05DB, 0x05BB, 0x059C, 0x059C, 0x057C, 0x055C, 0x053D, 0x051D, 0x04FD, 0x04DD, 0x04BE, 0x049E, 0x047F, 0x047F, 0x045F, 0x043F, 0x043F, 0x041F, 0x041F, 0x041F, 0x041F, 0x041F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x041F, 0x03FF, 0x03BF, 0x037F, 0x033F, 0x02BF, 0x023F, 0x01DF, 0x015F, 0x00DF, 0x009F, 0x005F, 0x001F, 0x005F, 0x097F, 0xB9B3, 0xB214, 0x0DBF, 0x06FF, 0x075F, 0x073F, 0x073F, 0x075F, 0x077F, 0x6479, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC932, 0x9132, 0x3911, 0x3111, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F4, 0x20CD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x28F0, 0x30F0, 0x3110, 0x38F0, 0x38F1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xC335, 0xD395, 0xD395, 0xD395, 0xD395, 0xAC57, 0x7D7A, 0x469C, 0x0F9F, 0xA4B8, 0xD395, 0x8539, 0x1F5E, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x075D, 0x06BB, 0x06BB, 0x069A, 0x067A, 0x065A, 0x065A, 0x063A, 0x061A, 0x05FA, 0x05DA, 0x05DB, 0x05BB, 0x059B, 0x057B, 0x055B, 0x053C, 0x053C, 0x051C, 0x04FC, 0x04DD, 0x04BD, 0x047E, 0x047E, 0x045E, 0x043F, 0x041F, 0x03FF, 0x03FF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03BF, 0x035F, 0x031F, 0x02DF, 0x027F, 0x01FF, 0x019F, 0x011F, 0x00BF, 0x007F, 0x003F, 0x001F, 0x009F, 0x39DB, 0xC992, 0x6399, 0x069F, 0x079F, 0x07FF, 0x07DF, 0x07BF, 0x077F, 0x079F, 0x9AF6, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC932, 0x7112, 0x3110, 0x30F0, 0x30EF, 0x28F0, 0x28EF, 0x28CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20AE, 0x18CF, 0x00F9, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08D3, 0x10D2, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xCB75, 0xD395, 0xD395, 0xD395, 0xC3D6, 0x6DBA, 0x1F7E, 0x07FF, 0x07FF, 0x36DD, 0xBC17, 0x8539, 0x1F5E, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x071B, 0x06DA, 0x06BA, 0x06BA, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05F9, 0x05DA, 0x05BA, 0x059A, 0x057A, 0x055A, 0x055B, 0x053B, 0x051B, 0x04FC, 0x04DC, 0x04BC, 0x049D, 0x047D, 0x045D, 0x043E, 0x041E, 0x03FE, 0x03DF, 0x03DF, 0x03BF, 0x03BF, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x037F, 0x035F, 0x031F, 0x02DF, 0x027F, 0x023F, 0x01BF, 0x015F, 0x00FF, 0x009F, 0x005F, 0x001F, 0x003F, 0x011F, 0x99B6, 0xB9D3, 0x0D9F, 0x06DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F7E, 0xB9B3, 0xC952, 0xC952, 0xC952, 0xC952, 0xC931, 0xC932, 0xC132, 0x6111, 0x38F0, 0x30F0, 0x28F0, 0x30EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18CE, 0x08F5, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xA2B4, 0xD395, 0xD375, 0xD395, 0xD395, 0xC3D6, 0x6DBA, 0x0FBF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x1F7E, 0x07DF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x06F9, 0x06F9, 0x06D9, 0x06B8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05F8, 0x05D8, 0x05B8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051A, 0x04FA, 0x04DB, 0x04BB, 0x049C, 0x047C, 0x045D, 0x043D, 0x041E, 0x03FE, 0x03DE, 0x03BF, 0x039F, 0x039F, 0x037F, 0x037F, 0x037F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02BF, 0x027F, 0x023F, 0x01FF, 0x019F, 0x013F, 0x00BF, 0x007F, 0x003F, 0x001F, 0x005F, 0x197E, 0xB993, 0x6379, 0x063F, 0x073F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x3DFB, 0xC952, 0xC952, 0xC932, 0xC932, 0xC932, 0xC932, 0xC912, 0xB912, 0x4111, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x08F6, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79F3, 0xB2F4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x94F9, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x079D, 0x0719, 0x06F8, 0x06F8, 0x06D7, 0x06B7, 0x06B7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05F7, 0x05D7, 0x05B7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04F9, 0x04DA, 0x04BB, 0x049B, 0x047C, 0x043C, 0x041D, 0x041D, 0x03FE, 0x03DE, 0x03BE, 0x039E, 0x037F, 0x035F, 0x035F, 0x033F, 0x031F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02DF, 0x02BF, 0x029F, 0x027F, 0x023F, 0x01FF, 0x019F, 0x015F, 0x00FF, 0x009F, 0x005F, 0x003F, 0x001F, 0x00BF, 0x59BA, 0xB9B3, 0x0D3F, 0x06BF, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7438, 0xC952, 0xC132, 0xC932, 0xC932, 0xC932, 0xC911, 0xC912, 0xA111, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x08F5, 0x011A, 0x0119, 0x00FA, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x5151, 0x79F3, 0xA2B4, 0xCB75, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xC3D6, 0x469C, 0x07FF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0xC335, 0x45D7, 0x0738, 0x0717, 0x06F6, 0x06F6, 0x06D6, 0x06B5, 0x06B5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05F5, 0x05F5, 0x05D6, 0x05B6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04F9, 0x04D9, 0x049A, 0x047B, 0x045B, 0x043C, 0x041C, 0x03DD, 0x03DD, 0x03BE, 0x039E, 0x037E, 0x035F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x027F, 0x025F, 0x021F, 0x01FF, 0x01BF, 0x017F, 0x011F, 0x00DF, 0x009F, 0x003F, 0x001F, 0x003F, 0x013F, 0xB174, 0x6339, 0x05FF, 0x071F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xB992, 0xC932, 0xC932, 0xC931, 0xC912, 0xC912, 0xC912, 0xC911, 0x8111, 0x30F0, 0x30F0, 0x28EF, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20D0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08F5, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F9, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x59B2, 0x7A13, 0x9A94, 0xBB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xAC77, 0x2F1E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BC, 0x0759, 0xABB5, 0xC314, 0x1E97, 0x0736, 0x0716, 0x0715, 0x06F4, 0x06F4, 0x06F3, 0x06D3, 0x06B3, 0x06B2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05F4, 0x05D4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04F8, 0x04B9, 0x0499, 0x045A, 0x043B, 0x041B, 0x03FC, 0x03DD, 0x03BD, 0x039D, 0x037E, 0x035E, 0x033E, 0x033F, 0x031F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x029F, 0x027F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x021F, 0x01DF, 0x019F, 0x017F, 0x013F, 0x00FF, 0x009F, 0x007F, 0x003F, 0x001F, 0x007F, 0x399B, 0xB993, 0x055F, 0x067F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x45DB, 0xC132, 0xC932, 0xC912, 0xC132, 0xC912, 0xC912, 0xC911, 0xC912, 0x5111, 0x38F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18CE, 0x10D3, 0x10F4, 0x18D0, 0x18AD, 0x18AE, 0x20CD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F9, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x20CD, 0x20AE, 0x20AD, 0x20AE, 0x18CE, 0x20AE, 0x20CE, 0x20CE, 0x28AE, 0x20CE, 0x28EE, 0x5171, 0x69D2, 0x8232, 0xAAF4, 0xC334, 0xD375, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x757A, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BD, 0x079B, 0x077A, 0x0779, 0x74D6, 0xD2D4, 0x9BF5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06F0, 0x06F0, 0x06D0, 0x06AF, 0x06AF, 0x066F, 0x0650, 0x0631, 0x0611, 0x05D2, 0x0594, 0x0554, 0x0515, 0x04F7, 0x04B8, 0x0478, 0x0459, 0x043A, 0x03FB, 0x03BC, 0x03BC, 0x039D, 0x037D, 0x035E, 0x033E, 0x031F, 0x031F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x027F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x013F, 0x011F, 0x00BF, 0x007F, 0x005F, 0x001F, 0x001F, 0x00DF, 0xA175, 0x33BC, 0x05DF, 0x06FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x92D5, 0xC911, 0xC132, 0xC912, 0xC912, 0xC8F2, 0xC112, 0xC912, 0xA8F1, 0x3110, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x10CF, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x390F, 0x4970, 0x59B0, 0x7A32, 0x9293, 0xAAD3, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0x9CB8, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DE, 0x07DD, 0x07BC, 0x079B, 0x079A, 0x079A, 0x0779, 0x55B7, 0xD2B4, 0xD2B4, 0x4DB5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074F, 0x074E, 0x074D, 0x074D, 0x074C, 0x072B, 0x072B, 0x072A, 0x070A, 0x06EA, 0x06AC, 0x064D, 0x05D0, 0x0573, 0x04F5, 0x04B6, 0x0478, 0x0438, 0x041A, 0x03FB, 0x03BC, 0x039C, 0x037C, 0x033D, 0x033D, 0x031E, 0x02FE, 0x02FF, 0x02DF, 0x02BF, 0x029F, 0x029F, 0x027F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x009F, 0x005F, 0x003F, 0x001F, 0x003F, 0x213D, 0x1B1E, 0x051F, 0x065F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F3D, 0xC912, 0xC912, 0xC112, 0xC112, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0x80F1, 0x30F0, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F7, 0x00F9, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x392F, 0xD395, 0xC374, 0xA2D3, 0xAAD3, 0x7A31, 0x7A31, 0x7A11, 0x7231, 0x5190, 0x496F, 0x496F, 0x4970, 0x496F, 0x494F, 0x412F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4970, 0x494F, 0x496F, 0x496F, 0x69F1, 0x7A31, 0x7A31, 0x9272, 0xA2D3, 0xAAF3, 0xC355, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD375, 0xD395, 0xAC57, 0x565C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DE, 0x07BD, 0x07BC, 0x07BC, 0x07BB, 0x079A, 0x079A, 0x0799, 0x26B8, 0xCAD4, 0xD2B4, 0xC314, 0x0F35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078F, 0x078E, 0x078E, 0x078D, 0x078C, 0x07AA, 0x07A9, 0x07A9, 0x07A8, 0x07C7, 0x07C5, 0x07C4, 0x07E4, 0x07A4, 0x0727, 0x068A, 0x05AF, 0x0496, 0x0438, 0x03F9, 0x03BA, 0x039B, 0x035C, 0x035D, 0x031D, 0x031D, 0x02FE, 0x02DF, 0x02BF, 0x02BF, 0x029F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x00FF, 0x00DF, 0x00BF, 0x007F, 0x005F, 0x001F, 0x001F, 0x007F, 0x023F, 0x041F, 0x05BF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6498, 0xC911, 0xC912, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8D1, 0x50F1, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0117, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC3D6, 0x8539, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DE, 0x07BD, 0x07BD, 0x07BC, 0x07BC, 0x07BB, 0x07BA, 0x07BA, 0x07B9, 0xD2B4, 0xD2B4, 0xD2B4, 0x6535, 0x07B5, 0x07B5, 0x07B4, 0x07B3, 0x07B2, 0x07B1, 0x07B0, 0x07AF, 0x07CE, 0x07CD, 0x07CC, 0x07CB, 0x07CA, 0x07CA, 0x07C9, 0x07E8, 0x07E7, 0x07E6, 0x07E5, 0x07E5, 0x07E3, 0x07E3, 0x07E2, 0x07E1, 0x0726, 0x060C, 0x04B4, 0x03B9, 0x037B, 0x035C, 0x033D, 0x031D, 0x02DE, 0x02DF, 0x02BE, 0x029F, 0x029F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x019F, 0x019F, 0x015F, 0x015F, 0x013F, 0x00FF, 0x00DF, 0x00BF, 0x007F, 0x007F, 0x003F, 0x001F, 0x001F, 0x011F, 0x02FF, 0x04DF, 0x063F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xB972, 0xC8F2, 0xC8F2, 0xC0F1, 0xC8F2, 0xC0F2, 0xC0F1, 0xC8D1, 0xA0F1, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x412F, 0x8A72, 0xC334, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xAC57, 0x469C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x467C, 0x8519, 0x8519, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DE, 0x07DE, 0x07DE, 0x07DD, 0x07DC, 0x07DC, 0x07DB, 0x07DB, 0x07DA, 0x07DA, 0x9BF5, 0xD2B4, 0xD2B4, 0xC2F4, 0x0F77, 0x07D6, 0x07D5, 0x07D4, 0x07D4, 0x07D3, 0x07D2, 0x07D1, 0x07D0, 0x07EF, 0x07EE, 0x07ED, 0x07EC, 0x07EC, 0x07EA, 0x07E9, 0x07E9, 0x07E7, 0x07E6, 0x07E6, 0x07E5, 0x07E5, 0x07E4, 0x07E4, 0x07E3, 0x07E3, 0x07E2, 0x0785, 0x060C, 0x04D3, 0x035B, 0x031C, 0x02DE, 0x02DE, 0x02BE, 0x029F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x001F, 0x001F, 0x003F, 0x01DF, 0x03BF, 0x059F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D7A, 0xC111, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0D1, 0xC8D1, 0x68F1, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x414F, 0x61D1, 0x8251, 0xA2D3, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xBC16, 0x8539, 0x469C, 0x17BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8518, 0xD355, 0xD355, 0xD335, 0xD335, 0x84F8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DE, 0x07FE, 0x07DD, 0x07DD, 0x07BC, 0x07DC, 0x07DB, 0x07DB, 0x07DA, 0x8C56, 0xCAB4, 0xCAB4, 0xD294, 0x4DF7, 0x07D7, 0x07D7, 0x07D6, 0x07F5, 0x07D5, 0x07F3, 0x07F3, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EE, 0x07ED, 0x07EC, 0x07EB, 0x07EB, 0x07EA, 0x07E9, 0x07E8, 0x07E8, 0x07E7, 0x07E7, 0x07E6, 0x07E6, 0x07E5, 0x07E5, 0x07E5, 0x07E5, 0x07E4, 0x07A6, 0x060E, 0x03F8, 0x02DE, 0x02BE, 0x029F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x003F, 0x001F, 0x001F, 0x00BF, 0x029F, 0x049F, 0x063F, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB1D3, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8D1, 0xC8D1, 0xC0F1, 0xC8D1, 0xB8D1, 0x40F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0x496F, 0x5990, 0x7A12, 0x7A32, 0x9272, 0xA2D3, 0xA2D3, 0xC375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAC77, 0x757A, 0x36FD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4E3C, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD334, 0x7539, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07DD, 0x07DD, 0x07DD, 0x07DC, 0x07FC, 0x07DC, 0x07DB, 0x6D38, 0xCAB4, 0xD294, 0xD294, 0xAB95, 0x07D8, 0x07D8, 0x07F7, 0x07F7, 0x07F6, 0x07F5, 0x07F5, 0x07F4, 0x07F3, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EE, 0x07ED, 0x07ED, 0x07EC, 0x07EC, 0x07EB, 0x07EA, 0x07EA, 0x07EA, 0x07E9, 0x07E9, 0x07E8, 0x07E8, 0x07E8, 0x07E8, 0x07E7, 0x07E7, 0x07E8, 0x07C8, 0x06EB, 0x0514, 0x033C, 0x027F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x005F, 0x005F, 0x003F, 0x001F, 0x001F, 0x015F, 0x037F, 0x057F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D5A, 0xC8F1, 0xC8D1, 0xC0F1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0xC8B1, 0x78D1, 0x3110, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x496F, 0x496F, 0x4970, 0x7A12, 0x7A31, 0x8252, 0xAAD3, 0xA2D3, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCBD6, 0x94F8, 0x565B, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB3F6, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD334, 0x1F7E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DE, 0x07DD, 0x07FD, 0x07FD, 0x07FD, 0x07DD, 0x07DC, 0x6D38, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0x1F39, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F6, 0x07F5, 0x07F4, 0x07F3, 0x07F2, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EF, 0x07EE, 0x07EE, 0x07ED, 0x07ED, 0x07EC, 0x07ED, 0x07EC, 0x07EB, 0x07EC, 0x07EB, 0x07EB, 0x07EA, 0x07EA, 0x07EA, 0x07CA, 0x07AB, 0x076C, 0x070D, 0x05B2, 0x039B, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00DF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x001F, 0x60D9, 0x0A3F, 0x047F, 0x063F, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA9D3, 0xC0D1, 0xC8D1, 0xC0F1, 0xC8B1, 0xC0D1, 0xC8B1, 0xC0B1, 0xB8B1, 0x48F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18CD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4970, 0x4970, 0x5990, 0x7A31, 0x7231, 0x7A31, 0x7A31, 0x9AB3, 0xAAD4, 0xA2D4, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0x94F8, 0x565C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD315, 0x5DDB, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x6D58, 0xD294, 0xD293, 0xCA94, 0xD274, 0x4DF8, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F8, 0x07F7, 0x07F6, 0x07F6, 0x07F5, 0x07F5, 0x07F4, 0x07F3, 0x07F3, 0x07F2, 0x07F1, 0x07F1, 0x07F0, 0x07F0, 0x07F0, 0x07EF, 0x07EF, 0x07EF, 0x07EF, 0x07EF, 0x07EE, 0x07EE, 0x07EE, 0x07EE, 0x07EE, 0x07ED, 0x07CD, 0x078E, 0x076E, 0x0710, 0x06B1, 0x0574, 0x037B, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x017F, 0x013F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x001F, 0x88D6, 0x6159, 0x031F, 0x053F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D5B, 0xC0D1, 0xC8D1, 0xC8D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B1, 0x90D1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CF, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x011A, 0x10D1, 0x18AD, 0x18AD, 0x10D1, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x10CF, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18CE, 0x18AD, 0x20AE, 0x20AD, 0x20CE, 0x20CE, 0x290F, 0x5170, 0x5170, 0x69F1, 0x7A32, 0x8232, 0xAAF3, 0xAAF4, 0xCB75, 0xD395, 0xD396, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xC3B6, 0x8539, 0x1F7F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD315, 0xD314, 0xD314, 0x659A, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x6D39, 0xD294, 0xCA94, 0xD274, 0xCA74, 0x7C96, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F6, 0x07F6, 0x07F5, 0x07F4, 0x07F4, 0x07F3, 0x07F3, 0x07F3, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F1, 0x07F1, 0x07F1, 0x07F1, 0x07F0, 0x07F1, 0x07D0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02DD, 0x01BF, 0x019F, 0x017F, 0x015F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x00BF, 0x007F, 0x005F, 0x005F, 0x003F, 0x003F, 0x001F, 0x60B8, 0xB8F3, 0x09BF, 0x041F, 0x061F, 0x073F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB1B3, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0x48F1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x00F9, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x00F7, 0x011A, 0x011A, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x5172, 0x61B2, 0x8A54, 0x9A94, 0xB335, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0x9C97, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xAC17, 0xD335, 0xD314, 0xD335, 0xD314, 0xD315, 0xD315, 0xD2F4, 0x467C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6D59, 0xD274, 0xCA94, 0xD274, 0xCA74, 0xB334, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FB, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F6, 0x07F6, 0x07F6, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F4, 0x07F4, 0x07F4, 0x07D3, 0x07B3, 0x0793, 0x0753, 0x0714, 0x06B5, 0x5516, 0x0538, 0x037C, 0x01FF, 0x017F, 0x015F, 0x013F, 0x011F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x6099, 0xC911, 0x491A, 0x02DF, 0x051F, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6459, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x90D1, 0x30F1, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69D3, 0x9274, 0xB2F5, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xA478, 0x36DD, 0x07FF, 0x07FF, 0x563C, 0xD335, 0xD334, 0xD315, 0xD315, 0xD2F4, 0xCB15, 0xBB96, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8498, 0xCA94, 0xCA94, 0xD274, 0xCA74, 0xCA74, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F6, 0x07F6, 0x07D6, 0x07B6, 0x0796, 0x0756, 0x0716, 0xA456, 0xBBD6, 0x3479, 0x02FD, 0x023F, 0x019F, 0x015F, 0x011F, 0x00FF, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x003F, 0x78B7, 0xC111, 0xA114, 0x01FF, 0x041F, 0x05FF, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xC0B1, 0xC0D2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x48F1, 0x30F0, 0x30EF, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18CE, 0x08F7, 0x0119, 0x00F8, 0x10CF, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x20CD, 0x20CD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71F4, 0x9A75, 0xB2F5, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0x9C78, 0x36DD, 0x07FF, 0x9C57, 0xD335, 0xD315, 0xD334, 0xD314, 0xC355, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9BF7, 0xCA94, 0xD274, 0xCA73, 0xCA74, 0xD253, 0x2EFD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F9, 0x07F8, 0x07D8, 0x07B8, 0x0797, 0x0758, 0x0EF8, 0xBBF6, 0xD395, 0x6B99, 0x025F, 0x021F, 0x01BF, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x98D5, 0xC8F2, 0xC911, 0x195E, 0x033F, 0x053F, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7B76, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0x88D1, 0x30F1, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00FA, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8A16, 0xAAD5, 0xCB55, 0xD375, 0xD355, 0xD354, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xCB35, 0x84F9, 0x0FBF, 0x5DDB, 0xA457, 0x9C58, 0x84D8, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9BD6, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FC, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07DA, 0x07DA, 0x07BA, 0x079A, 0x0779, 0x2E99, 0xC3D6, 0xD395, 0x8339, 0x0A3E, 0x01DF, 0x019F, 0x015F, 0x011F, 0x00FF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x007F, 0x003F, 0x003F, 0x003F, 0x90D5, 0xC912, 0xC0F1, 0x7117, 0x027F, 0x049F, 0x065F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x269D, 0xC891, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8B1, 0x3110, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18CE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28EF, 0x28CF, 0x28EF, 0x28D0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8B14, 0x4AD3, 0x7A94, 0xAB14, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD315, 0xD314, 0xD335, 0xC355, 0x467C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xC2D4, 0xCA74, 0xCA74, 0xD274, 0xCA74, 0xD253, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07DB, 0x07BB, 0x07BB, 0x077B, 0x2EBA, 0xC3D6, 0xD395, 0xB337, 0x09DF, 0x01BF, 0x017F, 0x013F, 0x011F, 0x00DF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x003F, 0x7896, 0xC0F1, 0xC8F1, 0xA8F3, 0x01DF, 0x03DF, 0x05BF, 0x071F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA214, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0x68F1, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20EF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9A75, 0xCB55, 0xCB75, 0x5BB4, 0x3B34, 0x42B3, 0x4A33, 0x6253, 0x9AB4, 0xD335, 0xD335, 0xD315, 0xD334, 0xD314, 0xD315, 0xD314, 0xD314, 0x5DDB, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F5E, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xCA53, 0x369D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07DD, 0x07DD, 0x07BD, 0x079C, 0x561A, 0xD395, 0xD395, 0xAB37, 0x099F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x005F, 0x003F, 0x003F, 0x305C, 0xC0F1, 0xC8F1, 0xC8D1, 0x215D, 0x033F, 0x051F, 0x06DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5CD9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x98D1, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F8, 0x011A, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xCB55, 0xD375, 0xBB95, 0x5474, 0x3C34, 0x3BB4, 0x4333, 0x42B3, 0x4A13, 0x49F3, 0x5A32, 0x9AB4, 0xD334, 0xD335, 0xD314, 0xD314, 0xD315, 0xD314, 0xD2F4, 0x84D8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4DDB, 0xD274, 0xCA74, 0xCA73, 0xD274, 0xCA54, 0xCA54, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07DD, 0x07DE, 0x079D, 0x6D99, 0xD395, 0xD395, 0xAB17, 0x097F, 0x011F, 0x011F, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x003F, 0x003F, 0x003F, 0xC8F1, 0xC8F1, 0xC8D1, 0x5119, 0x02DF, 0x04FF, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F1E, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x4910, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xCB55, 0xD375, 0xD375, 0xB3D5, 0x3D55, 0x3515, 0x3495, 0x3C14, 0x3B94, 0x3B13, 0x4293, 0x4212, 0x49F3, 0x49F3, 0x5A13, 0x9AB4, 0xD314, 0xD315, 0xCB15, 0xD2F4, 0xD2F5, 0xD2F4, 0x7539, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8C37, 0xCA74, 0xD273, 0xD253, 0xCA54, 0xCA53, 0xD253, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DF, 0x07DF, 0x94D8, 0xD396, 0xD395, 0x8299, 0x00FF, 0x00FF, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0xC8D1, 0xC0F1, 0xC0D1, 0xA0D4, 0x027F, 0x04BF, 0x069F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8315, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x70F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0117, 0x18AE, 0x20CD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xB2F4, 0xD375, 0xD375, 0xD375, 0x9435, 0x3D55, 0x2D55, 0x2D75, 0x3515, 0x3C94, 0x3414, 0x3B94, 0x4313, 0x4293, 0x4A13, 0x41F3, 0x49F2, 0x4A13, 0x5A33, 0xA2B4, 0xD314, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2F4, 0x4E1B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x179F, 0xD274, 0xCA53, 0xCA73, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9E, 0xBC16, 0xD395, 0xD395, 0x725A, 0x00BF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x90B5, 0xC8D1, 0xC8D1, 0xC0D1, 0x123E, 0x047F, 0x067F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0x90D1, 0x38F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F9, 0x00F9, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x38F0, 0x30F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xCB55, 0xD375, 0xD375, 0xD355, 0x9435, 0x3575, 0x3575, 0x2D75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3BF4, 0x3B73, 0x42F4, 0x4273, 0x4A13, 0x4213, 0x49F2, 0x49F3, 0x49F3, 0x6A33, 0xBAD4, 0xD2F5, 0xD2F4, 0xD2D4, 0xC335, 0x177E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5D9A, 0xCA54, 0xD273, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0x9BB6, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x077F, 0x077E, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x36DD, 0xD395, 0xD395, 0xD395, 0x51BC, 0x009F, 0x009F, 0x007F, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x7077, 0xC0D2, 0xC8D1, 0xC0D1, 0x49FA, 0x049F, 0x069F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F1E, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0x3910, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18CE, 0x08F7, 0x0119, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4952, 0xAAB4, 0xD375, 0xD375, 0xD375, 0xD355, 0x9435, 0x3575, 0x3575, 0x2D75, 0x2D75, 0x2D75, 0x3555, 0x54D5, 0x6475, 0x83B5, 0x8B74, 0x9B34, 0xAB14, 0xAAD4, 0xB2D4, 0xAAD4, 0xAAB4, 0xAAB4, 0xB2B4, 0x6B15, 0x8A94, 0xC2D4, 0xD2F4, 0xD2D4, 0x84B8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB315, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0x653A, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x075F, 0x075F, 0x073F, 0x073F, 0x071F, 0x071E, 0x071E, 0x073E, 0x079F, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7D7A, 0xD395, 0xD395, 0xC375, 0x28FE, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x005F, 0x003F, 0x003F, 0x183E, 0xC0D1, 0xC0D1, 0xC0D2, 0x7996, 0x04BF, 0x067F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA214, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0x58F1, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AD, 0x18CD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0117, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x5972, 0xCB55, 0xD375, 0xD375, 0xD375, 0xD375, 0xABD5, 0x4515, 0x54F5, 0x7C75, 0x8C35, 0xABD5, 0xCB55, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xC355, 0x9C37, 0x659A, 0x467C, 0x0FBF, 0x07FF, 0x07FF, 0x269D, 0x9C17, 0xD2D4, 0x9C17, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5D9A, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0x26DD, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x071E, 0x071E, 0x06FE, 0x06FE, 0x06FF, 0x06DE, 0x06DE, 0x06BE, 0x06BE, 0x06DE, 0x073E, 0x079F, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x079F, 0x077F, 0x079F, 0x079F, 0x077F, 0x079F, 0x079F, 0x079F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0xC3F6, 0xD395, 0xD395, 0xAAF7, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x001F, 0x001F, 0xA094, 0xC0D1, 0xC8B1, 0xA8F3, 0x04BF, 0x069F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x73D8, 0xB8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0x78F1, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x10CF, 0x0119, 0x00F9, 0x0117, 0x18CE, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x71F2, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xD355, 0xD335, 0xD335, 0xCB14, 0xD334, 0xD334, 0xAC16, 0x753A, 0x467D, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x369C, 0x4E1B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x26FD, 0xC2B4, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA33, 0xCA33, 0xA356, 0x07FF, 0x07FF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x071F, 0x071F, 0x06FF, 0x06FE, 0x06FE, 0x06DE, 0x06BE, 0x06BE, 0x069E, 0x069E, 0x069E, 0x067E, 0x067E, 0x065E, 0x065E, 0x06BE, 0x073E, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x077F, 0x077F, 0x077F, 0x077F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07DF, 0x6DDA, 0xD395, 0xD376, 0xD375, 0x79FA, 0x003F, 0x003F, 0x001F, 0x003F, 0x001F, 0x001F, 0x001F, 0x001F, 0x8896, 0xC0B1, 0xC0B1, 0xC8B1, 0x0C9F, 0x069F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x3DBB, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0x98D1, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x9A93, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD355, 0xD335, 0xD335, 0xC375, 0x84F9, 0x4E3C, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xAB75, 0xCA54, 0xD253, 0xCA53, 0xCA33, 0xCA33, 0xD233, 0xCA33, 0x4DBB, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x075F, 0x073F, 0x071F, 0x071F, 0x06FF, 0x06DE, 0x06DE, 0x06DE, 0x06BE, 0x06BE, 0x069E, 0x067E, 0x067E, 0x067E, 0x065E, 0x063E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05FD, 0x067D, 0x06DE, 0x06FE, 0x06FE, 0x06FE, 0x06FE, 0x071E, 0x073F, 0x073F, 0x073F, 0x073E, 0x075F, 0x077F, 0x079F, 0x079F, 0x07BF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x0FBF, 0xC3D6, 0xD375, 0xD375, 0xD355, 0x30FD, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x001F, 0x6058, 0xC0B1, 0xC0B1, 0xC0B1, 0x33FC, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9E, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xC0B1, 0xB8D1, 0xB8D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x3910, 0xAAF4, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xB3D6, 0x7539, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x2EFD, 0xB315, 0xCA53, 0xCA54, 0xCA33, 0xCA53, 0xCA34, 0xCA34, 0xCA33, 0xA335, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DE, 0x06BF, 0x06BE, 0x069E, 0x069E, 0x069E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05BD, 0x05BE, 0x059D, 0x055E, 0x055E, 0x05BE, 0x05FE, 0x061D, 0x067E, 0x06BE, 0x06FE, 0x06FE, 0x071F, 0x071E, 0x073F, 0x073F, 0x075F, 0x077F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x8539, 0xD375, 0xD355, 0xD355, 0xBAF6, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x403B, 0xC8B1, 0xC0B1, 0xC0B1, 0x6318, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA9B3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8D1, 0x4910, 0x3910, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x10D3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x011A, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x30CF, 0x3910, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD354, 0xD355, 0xD355, 0xCB96, 0x8518, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBE, 0x653A, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x2E9D, 0x077F, 0x077F, 0x075F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FE, 0x06DF, 0x06DE, 0x06BF, 0x06BE, 0x06BF, 0x069E, 0x067E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05BE, 0x05BE, 0x059E, 0x057E, 0x053E, 0x051E, 0x04FE, 0x04BE, 0x049E, 0x041E, 0x03DD, 0x04DE, 0x065E, 0x06BE, 0x06DE, 0x06DE, 0x06FE, 0x071F, 0x073E, 0x077F, 0x079F, 0x079F, 0x07BF, 0x07DF, 0x07DF, 0x07FF, 0x36DD, 0xD355, 0xD355, 0xD355, 0xD335, 0x699A, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0xB8B2, 0xC091, 0xC0B1, 0x7A96, 0x06BF, 0x079F, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x82F5, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0x60F1, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x08F7, 0x18CE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CF, 0x28CF, 0x28EF, 0x3910, 0xB314, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xBBD6, 0x5DFB, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0x5D9A, 0xB315, 0xD254, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA33, 0xD233, 0xCA33, 0xCA33, 0x64D9, 0x077F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06BF, 0x06BE, 0x069F, 0x069F, 0x067E, 0x065E, 0x065E, 0x063E, 0x063E, 0x061E, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x055E, 0x055E, 0x051E, 0x04FE, 0x04DE, 0x049E, 0x043D, 0x03DE, 0x03BE, 0x039E, 0x037E, 0x03FE, 0x05FE, 0x069E, 0x069E, 0x06BE, 0x06FE, 0x071E, 0x073F, 0x075F, 0x079F, 0x079F, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0xBBF6, 0xD355, 0xD335, 0xD335, 0xC2F5, 0x083F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x9095, 0xC8B1, 0xC8B1, 0x91F5, 0x067F, 0x06FF, 0x073F, 0x075F, 0x077F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0x80F2, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20CD, 0x20AE, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x08F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x3110, 0xB314, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0x9C77, 0x563B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F7E, 0x65DB, 0x7CF9, 0x9C57, 0x9C57, 0x9C57, 0x9C57, 0x9C37, 0x9C37, 0x9C37, 0x9C37, 0x7539, 0x6D7A, 0x6579, 0x5DBB, 0x36BD, 0x36BD, 0x36BC, 0x2EFD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0x36BD, 0x5D9A, 0x8C37, 0xD274, 0xD273, 0xD254, 0xCA53, 0xD254, 0xD253, 0xCA33, 0xD233, 0xCA34, 0xCA13, 0xCA33, 0x8418, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06BF, 0x06BF, 0x069E, 0x069F, 0x067E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x05BE, 0x057E, 0x055E, 0x051E, 0x051E, 0x04FE, 0x04BE, 0x045E, 0x03FE, 0x03BE, 0x039E, 0x037E, 0x037E, 0x035E, 0x033E, 0x035E, 0x061D, 0x067E, 0x067E, 0x069E, 0x06BE, 0x06FE, 0x073F, 0x075F, 0x077F, 0x079F, 0x07DF, 0x07DF, 0x07FF, 0x7D59, 0xD335, 0xD335, 0xD335, 0xD314, 0x699A, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x60D8, 0xC0B1, 0xC0B1, 0xB8F2, 0x05DF, 0x061F, 0x065F, 0x06DF, 0x073F, 0x077F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x363C, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0x90D1, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CE, 0x30EF, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0x9C77, 0x3EDD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x659A, 0xD315, 0xD314, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2F4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA73, 0xCA73, 0xD274, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xAB15, 0x0EDF, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06BF, 0x06BF, 0x06DF, 0x06BF, 0x069F, 0x069F, 0x067E, 0x067F, 0x067E, 0x065E, 0x063F, 0x061E, 0x061E, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x055E, 0x053E, 0x051E, 0x04FE, 0x04DE, 0x049E, 0x043E, 0x03BE, 0x039E, 0x039E, 0x035E, 0x035E, 0x033E, 0x033E, 0x031E, 0x02FE, 0x037E, 0x05FE, 0x065E, 0x067E, 0x069E, 0x06DE, 0x06FE, 0x075F, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0x271D, 0xD335, 0xD314, 0xD315, 0xD315, 0xC2D5, 0x083F, 0x001F, 0x001F, 0x001F, 0x001F, 0x009F, 0x60D8, 0xC0B1, 0xC0B2, 0xC0B1, 0x04BF, 0x053F, 0x05BF, 0x067F, 0x06DF, 0x075F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0x98D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18CE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CE, 0x30EF, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xAC37, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x0EBD, 0x1D7B, 0x1C99, 0x32F5, 0x3A75, 0x6193, 0x69B3, 0x79F4, 0x8A14, 0xB294, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xD274, 0xCA53, 0xCA54, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x8B97, 0x35FD, 0x5D7B, 0x6D3A, 0x6D3A, 0x5D5B, 0x35FD, 0x06BF, 0x0E7E, 0x457C, 0x6C99, 0x6479, 0x6459, 0x4CBA, 0x0E1E, 0x063E, 0x063E, 0x061E, 0x05FE, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055E, 0x051E, 0x051E, 0x04FE, 0x04DE, 0x047E, 0x03DE, 0x03BE, 0x037E, 0x037F, 0x035E, 0x033E, 0x033E, 0x031E, 0x02FE, 0x02FE, 0x02FE, 0x02DE, 0x03FE, 0x05BE, 0x063E, 0x065E, 0x069E, 0x06DE, 0x071F, 0x073E, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0xBBB6, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0x697A, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x48FA, 0xC0B1, 0xC0B1, 0xC0B1, 0x331C, 0x047F, 0x053F, 0x05FF, 0x069F, 0x073F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9A14, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20AE, 0x18CF, 0x08F6, 0x011A, 0x0119, 0x0119, 0x08F4, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x9273, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xC3B6, 0x5DFB, 0x07FF, 0x0E3B, 0x1C98, 0x2AD5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79D3, 0x9A54, 0xC294, 0xD2F4, 0xD2D5, 0xCAD4, 0xD2D4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x99D4, 0x6358, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD375, 0x06BF, 0x5CFA, 0xD2B4, 0xCA94, 0xCA33, 0xCA13, 0xC9D3, 0xB9D3, 0x4C5A, 0x061E, 0x061E, 0x05DE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x057E, 0x053E, 0x051E, 0x051D, 0x04DE, 0x04BE, 0x043E, 0x03BE, 0x03BE, 0x037F, 0x0B7E, 0x337C, 0x333C, 0x335C, 0x333C, 0x333C, 0x331C, 0x331C, 0x32FC, 0x32FC, 0x32DC, 0x2B7C, 0x05DE, 0x061E, 0x065E, 0x069E, 0x06DE, 0x071F, 0x073F, 0x077F, 0x07BF, 0x07DF, 0x07DF, 0x84F9, 0xD314, 0xCB14, 0xCAF4, 0xD2D5, 0xB275, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x08DF, 0xB8D2, 0xC0B1, 0xC0B1, 0x3A7B, 0x03FF, 0x04DF, 0x05BF, 0x067F, 0x071F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7B77, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x4111, 0x38F1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20AE, 0x20CF, 0x0918, 0x013A, 0x011A, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0139, 0x00F9, 0x10D2, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x7A32, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x9C78, 0x261B, 0x1B96, 0x3171, 0x30F0, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81F3, 0xAA73, 0xCAD4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xD274, 0xCA54, 0xD274, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA33, 0xCA33, 0xD233, 0xC234, 0x7994, 0x5975, 0xB315, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xC375, 0x067F, 0x067F, 0x6C79, 0xCA33, 0xCA13, 0xC9D3, 0xC992, 0xC952, 0xC912, 0x34BB, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x055E, 0x055E, 0x053E, 0x051E, 0x04FE, 0x249D, 0x347B, 0x6BFA, 0x7B99, 0x9B98, 0xAB97, 0xDB95, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0xD395, 0xBBD6, 0x9C37, 0x8499, 0x6D1A, 0x363C, 0x1EDD, 0x079F, 0x07BF, 0x07DF, 0x4E1B, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0x40FC, 0x001F, 0x001F, 0x001F, 0x003F, 0x009F, 0x78D7, 0xC0B1, 0xC0B1, 0x61D8, 0x03BF, 0x049F, 0x057F, 0x065F, 0x071F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xB8D1, 0xB8B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x4111, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CF, 0x20AE, 0x10F3, 0x013A, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011A, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x5170, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0x6519, 0x22B3, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79B3, 0xA233, 0xD2B4, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xCA54, 0xD274, 0xD253, 0xCA54, 0xCA54, 0xCA33, 0xD233, 0xCA34, 0xCA33, 0xCA33, 0xA1D3, 0x5954, 0x5954, 0x79F5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD335, 0x8C18, 0x067F, 0x065F, 0x063F, 0xA2D5, 0xC9D3, 0xC972, 0xC952, 0xC111, 0xC8D1, 0x8A55, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055E, 0x34DC, 0x6C5A, 0xA3F7, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xBBB6, 0x84D9, 0x4E1B, 0x465C, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0x81D8, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x6098, 0xC0B1, 0xC0D1, 0x59B8, 0x035F, 0x045F, 0x055F, 0x063F, 0x06FF, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x363C, 0xC0D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x58F1, 0x3911, 0x30F0, 0x3110, 0x30CF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x08F6, 0x013A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F8, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20CE, 0x20AE, 0x28EE, 0xCB55, 0xD375, 0xD375, 0xD375, 0xBB14, 0x34F9, 0x2930, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91F2, 0xC254, 0xCA93, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xCA73, 0xD273, 0xCA73, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xCA33, 0xCA34, 0xA1F3, 0x6973, 0x4953, 0x5134, 0x5154, 0xAAF5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD335, 0xD314, 0x5CDA, 0x065F, 0x063F, 0x063F, 0xB254, 0xC972, 0xC952, 0xC112, 0xC8D1, 0xC0B1, 0xC0B1, 0x05BE, 0x059E, 0x2D1C, 0x9438, 0xCBB6, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCA94, 0x087F, 0x003F, 0x001F, 0x001F, 0x001F, 0x385B, 0xC0B1, 0xC0B1, 0x9135, 0x031F, 0x043F, 0x053F, 0x063F, 0x071F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB8D1, 0x5911, 0x3911, 0x38F0, 0x30F0, 0x30CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x0917, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0118, 0x011A, 0x00F9, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18CD, 0x20AE, 0x18AD, 0x20AE, 0x20CE, 0x20CE, 0x8252, 0xD375, 0xD375, 0xD375, 0x9A93, 0x30EF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81D2, 0xAA13, 0xBA33, 0xCA54, 0xCA74, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xB213, 0xA1F3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xD395, 0xD395, 0xD396, 0xD375, 0xD334, 0xD2F5, 0xD2B4, 0x2D9D, 0x063F, 0x063F, 0x061F, 0xC993, 0xC952, 0xC911, 0xC8F1, 0xC0B1, 0xC0B1, 0xB8D1, 0x059E, 0x057E, 0xABF7, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD315, 0xD335, 0xCB15, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0x411C, 0x003F, 0x003F, 0x001F, 0x001F, 0x203C, 0xC0B1, 0xC0B1, 0x9135, 0x02FF, 0x041F, 0x051F, 0x061F, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA1B3, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x68F1, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x10F3, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20CE, 0x412F, 0xD375, 0xD375, 0xD375, 0x71D1, 0x20CE, 0x28CF, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3110, 0x38F0, 0x30F0, 0x3111, 0x3111, 0x38F1, 0x38F1, 0x38F0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8A34, 0xD395, 0xD395, 0xD375, 0xD335, 0xD2F4, 0xCAD4, 0xB2F6, 0x065F, 0x061F, 0x061F, 0x34DC, 0xC952, 0xC912, 0xC8D2, 0xC0B1, 0xC0D1, 0xB8D1, 0x89B4, 0x2BBA, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71D4, 0x69F4, 0x71D3, 0x69D4, 0x71D3, 0x7A14, 0x8A75, 0x9274, 0x9254, 0x9254, 0x9A95, 0xB315, 0xBB14, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD315, 0xD2F4, 0xCB14, 0xD2F4, 0xD2F4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2B4, 0xCAB4, 0xCA94, 0xCA94, 0x81B8, 0x005F, 0x005F, 0x003F, 0x001F, 0x001F, 0xA8B3, 0xC0B1, 0xB0D2, 0x02DF, 0x03FF, 0x051F, 0x061F, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8A95, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F2, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CF, 0x0918, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x20CD, 0x20AE, 0x20CD, 0x9272, 0xD375, 0xC334, 0x61D1, 0x20CF, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x30F0, 0x3110, 0x3110, 0x30F0, 0x3110, 0x38F0, 0x30F0, 0x38F0, 0x3111, 0x38F0, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xB2F5, 0xD395, 0xD375, 0xD355, 0xD2F4, 0xD2B4, 0xD274, 0x83B8, 0x063F, 0x061F, 0x061E, 0x6398, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8B1, 0xB8D1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61B3, 0x7A34, 0x9A95, 0xB2F5, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD274, 0xCA74, 0xC254, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x5878, 0xB8D1, 0xC0B1, 0x02BF, 0x03BF, 0x04FF, 0x05FF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6478, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CF, 0x0917, 0x011A, 0x011A, 0x0119, 0x08F4, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20CD, 0x18CE, 0x20AE, 0x390F, 0xD375, 0xCB35, 0x414F, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30F0, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x30F0, 0x30EF, 0x3110, 0x30F0, 0x30D0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F1, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3910, 0x3911, 0x38F1, 0x3911, 0x3912, 0x4952, 0xD395, 0xD375, 0xD335, 0xD2F4, 0xD2B4, 0xD274, 0xCA33, 0x4C9A, 0x05FF, 0x061F, 0x05FF, 0xA1F4, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA0F1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xA274, 0xC315, 0xD335, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xCA54, 0x20FD, 0x009F, 0x007F, 0x005F, 0x003F, 0x105D, 0xC0B1, 0xC0D1, 0x029F, 0x03BF, 0x04DF, 0x05FF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CF, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x61D0, 0xBB14, 0x412F, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x28CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28CF, 0x28F0, 0x30D0, 0x28EF, 0x28CF, 0x30CF, 0x30F0, 0x30D0, 0x30D0, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x30D0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x61B2, 0xD375, 0xD335, 0xD2F4, 0xCAD4, 0xCA74, 0xD233, 0xCA13, 0x1D9D, 0x05FF, 0x05FF, 0x1D3D, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8A14, 0xAA74, 0xCAF4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD294, 0xCA94, 0xCA73, 0xD274, 0xD253, 0xD254, 0x597A, 0x00BF, 0x00BF, 0x009F, 0x009F, 0x005F, 0xA8B3, 0xC0B1, 0x31FC, 0x039F, 0x04DF, 0x05DF, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x2E3C, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18CE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AF, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x390F, 0x28CE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x71F2, 0xD335, 0xD2F4, 0xD2B4, 0xCA74, 0xD233, 0xCA13, 0xA295, 0x05FF, 0x05FF, 0x05FF, 0x5399, 0xC0D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9A34, 0xC2B4, 0xD2B5, 0xD2B3, 0xCAB4, 0xD294, 0xD294, 0xCA93, 0xD274, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0x81D8, 0x00DF, 0x00DF, 0x00DF, 0x00BF, 0x00BF, 0x68B7, 0xB8D1, 0x31DC, 0x033F, 0x049F, 0x05DF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x26BD, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D2, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F1, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x011A, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x28F0, 0x30F0, 0x30F0, 0x38F0, 0x8213, 0xD2F5, 0xCAD4, 0xD274, 0xCA53, 0xC9F3, 0xC9D2, 0x7398, 0x05FF, 0x05FF, 0x05DF, 0xA953, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x98F2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F0, 0x38F0, 0x38F0, 0x38F0, 0x3911, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xCA94, 0xD294, 0xCA94, 0xD274, 0xCA74, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA34, 0x99F6, 0x011F, 0x011F, 0x00FF, 0x00FF, 0x00FF, 0x38DB, 0xC0B1, 0x28FC, 0x02DF, 0x047F, 0x059F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18CD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0x7A32, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD335, 0xD2B4, 0xCA94, 0xCA33, 0xD1F3, 0xC9D3, 0xC993, 0xC972, 0xC992, 0xC972, 0xC932, 0xC0D1, 0xC0B1, 0xB8D1, 0xB0D2, 0xB9F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x015F, 0x013F, 0x013F, 0x013F, 0x011F, 0x093F, 0xC0B1, 0x311C, 0x01BF, 0x03FF, 0x059F, 0x069F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD2F4, 0xCA74, 0xCA33, 0xCA13, 0xC9D3, 0xC992, 0xC952, 0xC111, 0xC0D1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xCA53, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x097F, 0x017F, 0x015F, 0x017F, 0x015F, 0x015F, 0x88F5, 0x293C, 0x013F, 0x02DF, 0x053E, 0x067F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9234, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x10D0, 0x0118, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20EE, 0x8252, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD2B4, 0xD233, 0xCA13, 0xC9B3, 0xC992, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8B1, 0xB8D1, 0xB8D1, 0xC253, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x31BC, 0x01BF, 0x019F, 0x019F, 0x019F, 0x019F, 0x5139, 0x315C, 0x017F, 0x01BF, 0x045E, 0x063E, 0x077F, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8A95, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x10D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD4F8, 0xD65C, 0xD6DD, 0xD6FD, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xCB15, 0xCA13, 0xC9D3, 0xC992, 0xC932, 0xC911, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC397, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xC9F3, 0x31FC, 0x01DF, 0x01DF, 0x01DF, 0x01DF, 0x01DF, 0x01BF, 0x01DF, 0x01BF, 0x01BF, 0x02DF, 0x05FD, 0x073E, 0x07FE, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8AB5, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x10D0, 0x00F8, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x28EE, 0xCB55, 0xD375, 0xD395, 0xD395, 0xD3D6, 0xD5DB, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xCA13, 0xC9B3, 0xC992, 0xC952, 0xC912, 0xC0D1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB0F1, 0xBA95, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9F3, 0x31FD, 0x021F, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01DF, 0x01FF, 0x051D, 0x071D, 0x07FD, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6BF7, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD477, 0xD77E, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xC9D3, 0xC992, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB152, 0xD79E, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9D3, 0x323C, 0x023F, 0x023F, 0x021F, 0x023F, 0x023F, 0x021F, 0x021F, 0x021F, 0x021F, 0x021F, 0x037E, 0x06DC, 0x07FD, 0x07FD, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0F1, 0x7911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x011A, 0x00F9, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x8252, 0xD395, 0xD395, 0xD396, 0xD4B8, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xC972, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xD63C, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9D3, 0x325C, 0x027F, 0x025F, 0x025F, 0x025F, 0x023F, 0x025F, 0x025F, 0x023F, 0x023F, 0x023F, 0x029F, 0x067C, 0x07FC, 0x07FC, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB8D1, 0x70F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD457, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCF3E, 0xC67C, 0xC53A, 0xC951, 0xC912, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0F1, 0xBB97, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD65B, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0xD395, 0xC9B3, 0x327C, 0x029F, 0x029F, 0x029F, 0x029F, 0x027F, 0x027F, 0x027F, 0x027F, 0x027F, 0x025F, 0x027F, 0x05BC, 0x07DB, 0x07FC, 0x07FD, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x58F1, 0x3911, 0x3111, 0x30F0, 0x28F0, 0x28F0, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x011A, 0x0119, 0x0119, 0x011A, 0x0117, 0x18CE, 0x18AE, 0x18D0, 0x0118, 0x00F9, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xA2D3, 0xD395, 0xD395, 0xD3D6, 0xD75E, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFDF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7DF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCFFF, 0xD7DF, 0xACD8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA8F1, 0xA972, 0xD77E, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD65C, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC193, 0x0A7F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x029F, 0x027F, 0x029F, 0x027F, 0x04DD, 0x07BB, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x07FF, 0x3DBB, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0x5911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F9, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0xD395, 0xD375, 0xD375, 0xD5BA, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5B, 0xBE3C, 0xB57A, 0xACB8, 0xBDBB, 0xC63C, 0xBE3B, 0xC71E, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5C, 0xB5DB, 0xACB8, 0xAC98, 0xBD5A, 0xBE3C, 0xC61C, 0xC69D, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xACB9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA111, 0xA911, 0xBC78, 0xCFDF, 0xCFDF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCF5E, 0xBE5C, 0xBE5C, 0xC63C, 0xC61C, 0xCEFD, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFFF, 0xCFDF, 0xD63B, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD395, 0x089F, 0x011F, 0x031F, 0x02FF, 0x02FF, 0x02DF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x03FD, 0x079A, 0x07FA, 0x07FC, 0x07FE, 0x07FF, 0x07FF, 0x2E5C, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB8D1, 0x5912, 0x3911, 0x38F1, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x0118, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x79F1, 0xD355, 0xD355, 0xD355, 0xCF7E, 0xC7DF, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xCFBF, 0xBEFD, 0xACB8, 0x8A52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA192, 0xAB96, 0xBE7D, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xCFDF, 0xCFBF, 0xC75E, 0xAD19, 0x92B4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xA111, 0x9931, 0xA111, 0x9911, 0xAB36, 0xBD5A, 0xC75E, 0xCFDF, 0xC7BF, 0xC7BF, 0xCFDF, 0xC7DF, 0xC7BF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xC7BF, 0xCFBF, 0xC7DF, 0xA4B8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xBE3B, 0xCFBF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xB5DA, 0x8A12, 0x8971, 0x9931, 0x9931, 0xA111, 0x9931, 0xAB35, 0xC75E, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFBF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCE1B, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x007F, 0x009E, 0x023F, 0x033F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x031F, 0x02FF, 0x02DF, 0x02DF, 0x02DF, 0x039E, 0x075A, 0x07F9, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x2E3C, 0xB8D2, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xA293, 0xD335, 0xD335, 0xCC98, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC75E, 0xA4B8, 0x8191, 0x9151, 0x9911, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xAB35, 0xBEFE, 0xC7BF, 0xC7BE, 0xC7BF, 0xB5DB, 0x89F1, 0x8971, 0x9931, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA132, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA172, 0xBD3A, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BE, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xAC98, 0x8191, 0x9151, 0x9931, 0xA111, 0xA131, 0xA111, 0xA131, 0xA111, 0x9931, 0xBE1B, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xBEFD, 0x89F2, 0x8991, 0x9931, 0xA112, 0xA131, 0xA111, 0xA111, 0xA111, 0xAB97, 0xC7BF, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC6DD, 0xD375, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0x009F, 0x009F, 0x013F, 0x033F, 0x037F, 0x035F, 0x033F, 0x031F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x02FF, 0x033F, 0x06F9, 0x07F9, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x2E3C, 0xB8D2, 0xB0F1, 0xB8D1, 0xB0D1, 0xB0F1, 0xB0D1, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x3110, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xD315, 0xD315, 0xD314, 0xC5FB, 0xC79F, 0xC79E, 0xC7BF, 0xC7BF, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xBF9E, 0xBFBF, 0xBFBE, 0xB67C, 0x8A53, 0x8971, 0xA131, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA172, 0xB539, 0xBF9F, 0x9BF6, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xAB15, 0xBF3D, 0xC79F, 0xC7BE, 0xC79F, 0xC79F, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79F, 0xC79E, 0xC79F, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xA4B8, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xBDFB, 0xC79F, 0xC79E, 0xC7BE, 0xC79F, 0xACF9, 0x8191, 0x9171, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA131, 0xA111, 0xBF3E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xC7BF, 0xC79E, 0xC79E, 0xC79E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xBF9E, 0xC79F, 0xC79E, 0xBFBE, 0xC79E, 0xC6BD, 0xD355, 0xD2F5, 0xD315, 0xCB14, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD315, 0xD315, 0xD314, 0x007F, 0x007F, 0x00FF, 0x027F, 0x039F, 0x039F, 0x037F, 0x231D, 0x5259, 0x5A3A, 0x033F, 0x033F, 0x031F, 0x031F, 0x0699, 0x07F8, 0x07FA, 0x07FD, 0x07FF, 0x07FF, 0x363C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0x4112, 0x38F1, 0x3911, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x0915, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2F4, 0xCAF4, 0xD2F4, 0xC65C, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF7F, 0xB67C, 0x8A12, 0x8971, 0xA111, 0xA111, 0xA911, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA912, 0xA911, 0xA1F3, 0x8191, 0x9931, 0xA111, 0xA111, 0xA912, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA112, 0xA911, 0xAA54, 0xBF1D, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xB79E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xB5FB, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA911, 0xB5FB, 0xBF7E, 0xBF9E, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBEBD, 0xD335, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F5, 0xCAF4, 0x007F, 0x007F, 0x00BF, 0x021F, 0x2ABD, 0x7A36, 0xB953, 0xC112, 0xC911, 0xC912, 0x0B3F, 0x035F, 0x035F, 0x033F, 0x05FA, 0x07F7, 0x07F9, 0x07FC, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0D1, 0xA0F1, 0x68F1, 0x4111, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2D4, 0xD2D4, 0xD2D4, 0xBE5C, 0xB77E, 0xB79E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xB77E, 0xB79E, 0xBF7E, 0xAE7B, 0x89F2, 0x8971, 0xA111, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA912, 0xA911, 0xA911, 0xA111, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA111, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA912, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xAA34, 0xB71E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7F, 0xB77E, 0x9C97, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xB5DB, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xA478, 0x8191, 0x9951, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xB5DB, 0xB77F, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xBE9D, 0xCB75, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D5, 0x007F, 0x007F, 0x30BB, 0x9955, 0xC931, 0xC932, 0xC932, 0xC912, 0xC0F2, 0xC8F2, 0x32FC, 0x037F, 0x037F, 0x037F, 0x059B, 0x07F7, 0x07F9, 0x07FC, 0x07FE, 0x07FF, 0x2E3C, 0xB8D1, 0xB0D1, 0xB0D2, 0xB0D1, 0xB0F1, 0x98F1, 0xB0F1, 0x88F1, 0x3110, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2B4, 0xD2B4, 0xD2B4, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB71D, 0x8A53, 0x8191, 0xA111, 0xA8F1, 0xB0F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F2, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB2F5, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C78, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C77, 0x8191, 0x9151, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB71D, 0xCB96, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCA94, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0x087E, 0x70F8, 0xC952, 0xC932, 0xC912, 0xC932, 0xC111, 0xC8F1, 0xC8F1, 0xC8D1, 0x331C, 0x03BF, 0x039F, 0x039F, 0x051B, 0x07D6, 0x07F7, 0x07FB, 0x07FE, 0x07FF, 0x2E3C, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xA0F1, 0xB0F1, 0xB0D1, 0x50F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD294, 0xD294, 0xCA94, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0x9416, 0x8991, 0x9951, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xACF9, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF7E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5D, 0xB75E, 0xAF5E, 0xAF5E, 0x9C77, 0x8191, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xB75E, 0xB75E, 0xB75E, 0xB75E, 0x9C78, 0x8991, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB5BB, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF1D, 0xCB75, 0xCA93, 0xD294, 0xCA74, 0xCA94, 0xCA74, 0xD274, 0xCA74, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA93, 0xCA94, 0xD293, 0xCA74, 0x9915, 0xC932, 0xC932, 0xC932, 0xC912, 0xC111, 0xC8F2, 0xC0F2, 0xC8D1, 0xC8D1, 0x333C, 0x03FF, 0x03DF, 0x03BF, 0x04DC, 0x07D6, 0x07F7, 0x07FB, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0x90F1, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD274, 0xD274, 0xCA53, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF5D, 0xAF3D, 0xAF3E, 0xA69C, 0x8191, 0x8191, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0D1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xAA13, 0xB418, 0xA438, 0x9AB4, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xAA74, 0xAC78, 0xACF9, 0x9B35, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F2, 0xB0D1, 0xB0F1, 0xA9B3, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0x9C77, 0x8191, 0x9931, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xAF3E, 0xAF3E, 0xAF5D, 0xAF3E, 0x9477, 0x8191, 0x9951, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xADBA, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAEFD, 0xCB56, 0xCA53, 0xCA74, 0xD253, 0xD274, 0xD274, 0xD273, 0xCA73, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD254, 0xCA74, 0xCA54, 0xCA54, 0xCA74, 0xC932, 0xC932, 0xC932, 0xC912, 0xC912, 0xC912, 0xC0F1, 0xC8D1, 0xC8D1, 0xC8D1, 0x335C, 0x041F, 0x03FF, 0x03FF, 0x047D, 0x0795, 0x07F6, 0x07FA, 0x07FE, 0x07FF, 0x2E3C, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0D1, 0xB0F1, 0x40F0, 0x28CF, 0x28EF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA53, 0xCA53, 0xCA53, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0x9457, 0x8191, 0x9931, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB1B3, 0xAD9A, 0xAF3D, 0xAF3D, 0xA73D, 0xA73D, 0x9DDA, 0x89D1, 0x9951, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB213, 0xAD9B, 0xA73E, 0xA73D, 0xAF3E, 0xAF3E, 0x9DDA, 0x81F2, 0x9171, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D2, 0xB0F1, 0xAD39, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3E, 0xAF1E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xAF3E, 0xA73E, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xA73E, 0x9478, 0x8191, 0x9931, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xAD9A, 0xA73E, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xAF3D, 0xAF3D, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xAEDD, 0xC376, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0x309C, 0x005F, 0x58B9, 0xC912, 0xC111, 0xC8F1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0x337C, 0x045F, 0x041F, 0x041F, 0x045E, 0x0775, 0x07F5, 0x07FA, 0x07FE, 0x07FF, 0x2E3C, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0x80F1, 0x28EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA13, 0xCA33, 0xCA13, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0x8A53, 0x8191, 0xA8F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB213, 0xA6BD, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0x9E1B, 0x81F1, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB1F3, 0xA6BD, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0x9E1B, 0x89F2, 0x8991, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB336, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71E, 0xA71D, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA73E, 0xA71D, 0xA73E, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA73E, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0x9477, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA59A, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71E, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71E, 0xA71D, 0xA73D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xBBF7, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA14, 0xD233, 0xCA33, 0x003F, 0x003F, 0x005F, 0x78D7, 0xC0F2, 0xC8F1, 0xC0D1, 0xC0D1, 0xC0D1, 0xC8B1, 0x4B1A, 0x047F, 0x045F, 0x043F, 0x045F, 0x0735, 0x07F4, 0x07F9, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xA8F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xA0F1, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA13, 0xCA13, 0xCA13, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x8191, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9EFD, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB932, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1E, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E1B, 0x9457, 0x92D4, 0xA1F3, 0xA911, 0xB0F1, 0xB0F1, 0xA911, 0xB274, 0xB254, 0xB254, 0xABF7, 0xA5DB, 0xA6FD, 0xA6FD, 0xA71D, 0xA71D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E7C, 0x9498, 0x8B14, 0x9A13, 0xA131, 0xA912, 0xB0F1, 0xA8F1, 0xB255, 0xB274, 0xB254, 0xAB97, 0xAD1A, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9457, 0x8191, 0xA131, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA57A, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9E7C, 0x9DBA, 0xA59A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA69C, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E5C, 0x94B8, 0x8AF4, 0x9A13, 0xA131, 0xA8F1, 0xB0F1, 0xB0F1, 0xB932, 0xB274, 0xB254, 0xB336, 0xACB9, 0xA63C, 0x9F1D, 0xBBF7, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0x003F, 0x003F, 0x005F, 0x58B9, 0xC0F1, 0xC0D1, 0xC8D1, 0xC8B2, 0xC0B1, 0xC0B1, 0x62B8, 0x04BF, 0x047F, 0x047F, 0x045F, 0x0715, 0x07F4, 0x07F9, 0x07FD, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xA8F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0x58F0, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC9D3, 0xC9D3, 0xC9D3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x959A, 0x8191, 0x9151, 0xC0B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB2B5, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8252, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB1F3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9F1D, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8A93, 0x8191, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xA63C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x94F8, 0x8A53, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8B1, 0xC0B1, 0xC0D1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB992, 0xACB9, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E5C, 0x8B96, 0x8991, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB932, 0xABF7, 0x9E9C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E9C, 0x8B96, 0x8971, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB335, 0xA63C, 0xBBD7, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0x001F, 0x003F, 0x003F, 0x00DF, 0x88F6, 0xC8D1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0x62D9, 0x04FF, 0x04BF, 0x049F, 0x047F, 0x06B6, 0x07F3, 0x07F8, 0x07FD, 0x07FF, 0x2E3C, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0x98F2, 0xB0F1, 0xB0F1, 0xB0F1, 0x78F0, 0x90F1, 0x80D1, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0xC9B3, 0xC9B3, 0xC9B3, 0x9EDD, 0x96FD, 0x9EDD, 0x96FD, 0x9EFC, 0x96FD, 0x96FD, 0x9599, 0x8991, 0x9171, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xABD7, 0x9EFC, 0x96FD, 0x96FD, 0x96DD, 0x96FD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x9EFD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xAB76, 0x9EDD, 0x9EFD, 0x9EFD, 0x9EDD, 0x9EDD, 0x96DD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x8C37, 0x8191, 0xA131, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xA55A, 0x96FD, 0x9EDD, 0x9EFD, 0x96FD, 0x963B, 0x8AF4, 0x8991, 0xA911, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xB992, 0xA55A, 0x9EDD, 0x9EFC, 0x96FD, 0x9EDD, 0x96FD, 0x9EFD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x94F9, 0x81F1, 0x9171, 0xB8D2, 0xC0B1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB992, 0x9DBB, 0x96FD, 0x9EDD, 0x96FD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x9EDD, 0x96FD, 0x96FD, 0x9EFD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x96FD, 0x9EFD, 0x96FD, 0x9EFD, 0x9EFD, 0x96FD, 0x9EFD, 0x96FD, 0x9539, 0x81F1, 0x9171, 0xB0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB911, 0xACFA, 0xB458, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B3, 0x001F, 0x003F, 0x003F, 0x00BF, 0x311C, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x6278, 0x053F, 0x04FF, 0x04BF, 0x049F, 0x0696, 0x07F2, 0x07F7, 0x07FC, 0x07FF, 0x2E3C, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x8912, 0xB0F1, 0xB0F1, 0xB0D1, 0x48F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC993, 0xC993, 0xC992, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8D79, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x95DA, 0x89F2, 0x8971, 0xB8D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0x9931, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DC, 0x96DD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8CD8, 0x8191, 0x9951, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xAC79, 0xACF9, 0xC992, 0xC993, 0xC9B2, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0xC992, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0x003F, 0x003F, 0x003F, 0x00BF, 0x011F, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x79D6, 0x051F, 0x051F, 0x04FF, 0x04BF, 0x0638, 0x07F1, 0x07F7, 0x07FC, 0x07FF, 0x2E3C, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0F1, 0x80F2, 0xB0F1, 0xB0F1, 0xB0F2, 0x3110, 0x30F0, 0x28CF, 0x28EF, 0x20CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x10D2, 0x08F3, 0x10F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC972, 0xC972, 0xC972, 0x8EBC, 0x8EBD, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8D7A, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D39, 0x8EBD, 0x8EDD, 0x8DBA, 0x81F2, 0x9171, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B2, 0xC8B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xA437, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBD, 0x8EBD, 0x8CD8, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0xA4D9, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0x9D3A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8CD8, 0x8191, 0x9951, 0xC8B1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC8B1, 0xC8D1, 0xA478, 0xA4D9, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0x003F, 0x003F, 0x001F, 0x009F, 0x00DF, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9174, 0x049F, 0x057F, 0x051F, 0x04FF, 0x0619, 0x07F1, 0x07F6, 0x07FC, 0x07FF, 0x35BB, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x6912, 0xB0F1, 0xB0F1, 0x98F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28EF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00FA, 0x011A, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC952, 0xC952, 0xC952, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D59, 0x8191, 0x9171, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xABD7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA931, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC0F2, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8437, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D3A, 0x8EBC, 0x8E1B, 0x81F2, 0x8971, 0xB912, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC112, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F1, 0xA498, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8DBA, 0x8991, 0x8991, 0xC0F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC8F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC132, 0x8E5C, 0x8C17, 0x8191, 0xA931, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C17, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8DBA, 0x81F2, 0x8991, 0xC111, 0xC8F1, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8D2, 0xC8F1, 0xC8F2, 0xC0F1, 0xC0F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC152, 0x95FB, 0xA4B8, 0xC152, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0x001F, 0x001F, 0x001F, 0x007F, 0x00DF, 0x68B7, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA8F3, 0x041F, 0x057F, 0x053F, 0x051F, 0x05F9, 0x07F0, 0x07F6, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x5912, 0xB0F1, 0xB0F1, 0x90F1, 0x30F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC932, 0xC932, 0xC932, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D79, 0x8191, 0x9171, 0xC132, 0xC131, 0xC912, 0xC912, 0xC132, 0xC911, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC911, 0xC912, 0xC912, 0xC112, 0xC912, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8AD4, 0x8191, 0xB152, 0xC912, 0xC131, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC912, 0xC912, 0xC911, 0xC112, 0xC932, 0xC912, 0xC912, 0xC932, 0xC911, 0xC912, 0xC912, 0xC932, 0xC131, 0x9DBA, 0x8EBC, 0x96BC, 0x8EBC, 0x8EDC, 0x96BB, 0x8EBC, 0x8EDC, 0x82D4, 0x8191, 0xB932, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC131, 0xC912, 0xC132, 0xC131, 0xC912, 0xC912, 0xC911, 0xC911, 0xC131, 0xC912, 0xC912, 0xB356, 0x8C36, 0x8191, 0xA151, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC112, 0x9D59, 0x8EBC, 0x96BC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8EBC, 0x82F4, 0x8991, 0xB151, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC131, 0xC932, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC912, 0xC911, 0xC932, 0xC932, 0xC112, 0xC911, 0xC132, 0xC912, 0xC912, 0xC932, 0xB336, 0x96BC, 0xA4F9, 0xC192, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0x001F, 0x001F, 0x001F, 0x007F, 0x00BF, 0x009F, 0x90B5, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x0B9E, 0x053F, 0x057F, 0x053F, 0x05DA, 0x07EF, 0x07F5, 0x07FB, 0x07FF, 0x5478, 0xB0D1, 0xB0F1, 0xB0F1, 0x9111, 0x5912, 0xA8F1, 0xB0F1, 0x70F1, 0x30F0, 0x28EF, 0x20EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC912, 0xC912, 0xC912, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9EDB, 0x9578, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xB417, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA518, 0x9EDB, 0x96DB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x94D8, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC253, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xBAB5, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9599, 0x8191, 0x91B1, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B5, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC972, 0xC1B2, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x8C36, 0x8991, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9598, 0x8191, 0x9191, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC172, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA61A, 0x9EDC, 0xA5DA, 0xC172, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0xC111, 0xC912, 0xC912, 0xC912, 0x001F, 0x001F, 0x001F, 0x005F, 0x007F, 0x007F, 0x6098, 0xC0B1, 0xB8B1, 0xC0B1, 0xC0B1, 0x2AFC, 0x04FF, 0x05BF, 0x055F, 0x05FB, 0x07CF, 0x07F4, 0x07FC, 0x07FF, 0x5C79, 0xB0F1, 0xB0F1, 0xB0F1, 0x8112, 0x5912, 0xB0F1, 0xB0F1, 0x68F1, 0x30F0, 0x30EF, 0x30CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC8F1, 0xC8F1, 0xC8F2, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6DA, 0xA6FA, 0x9D98, 0x8191, 0x9191, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC992, 0xB436, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD99, 0x8A32, 0x8991, 0xC192, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC973, 0xC992, 0xC992, 0xC992, 0xBC36, 0xA69A, 0xA6FA, 0xA6FA, 0xA69A, 0x9395, 0x8991, 0xB992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0xAD98, 0xA6DB, 0xA6DA, 0xA6FA, 0xA6FB, 0xA6FA, 0x9395, 0x8191, 0xB192, 0xC992, 0xC992, 0xC992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC972, 0xC233, 0xAD98, 0xA6FA, 0xA6FB, 0xA639, 0x8A93, 0x9992, 0xC192, 0xC972, 0xC992, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0x9A93, 0x8191, 0xA992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6DA, 0x8B95, 0x8191, 0xB192, 0xC972, 0xC992, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC294, 0xADF9, 0xA6FA, 0xA6DA, 0xA69A, 0x9334, 0x9191, 0xB992, 0xC992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xB497, 0xAEFB, 0xAEFB, 0xB5D9, 0xC952, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x005F, 0x7897, 0xC0B1, 0xC0D1, 0xC0B1, 0xB8D1, 0x6238, 0x04DF, 0x05BF, 0x059F, 0x05FA, 0x07CE, 0x07F4, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0F1, 0xB0F1, 0x7112, 0x5912, 0xB0F1, 0xA8F1, 0x5110, 0x30F0, 0x30CF, 0x28CF, 0x28CF, 0x28CF, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0xC0D1, 0xC0D1, 0xC8D2, 0xB71A, 0xB71A, 0xB71A, 0xAEFA, 0xB71A, 0xAF1A, 0xAEFA, 0xA598, 0x8191, 0x9191, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9D3, 0xBC76, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0x9C55, 0x8191, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xC9D3, 0xB5B8, 0xB71A, 0xAF1A, 0xB71A, 0xB6FA, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB6FA, 0xAF1A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xA3B5, 0x8191, 0x9992, 0xC9B2, 0xC9B3, 0xC9D2, 0xC9B2, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xCA13, 0xBDB8, 0xAEFA, 0xAF1A, 0xB71A, 0xB6FA, 0xAEFA, 0xAF19, 0xA4F7, 0x8991, 0xB1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9B3, 0xC9B3, 0xC314, 0xAF1A, 0xAF1A, 0xAEF9, 0xAF1A, 0xAF1A, 0x89F1, 0x8191, 0xC1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B2, 0xC9D3, 0xC9B3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xAEFA, 0xB71A, 0xB6B9, 0x8A93, 0x8991, 0xC1D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B2, 0xA992, 0x8191, 0xA9B2, 0xC9D3, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B2, 0xC9B2, 0xC9B3, 0xB5B8, 0xAF1A, 0xAEFA, 0xAF1A, 0xB71A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xB5B8, 0xB6FA, 0xAF1A, 0xAF1A, 0xB6FA, 0x89F2, 0x8191, 0xC1B2, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xB71A, 0xB6FA, 0xB71A, 0x92F3, 0x89B1, 0xC1B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9D3, 0xC315, 0xB71A, 0xB71A, 0xB71A, 0xBDD9, 0xC132, 0xC0D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x007F, 0x6878, 0xB8B1, 0xC0B1, 0xC0D1, 0xB8D1, 0x9954, 0x047F, 0x05BF, 0x05BF, 0x061A, 0x07CE, 0x07F2, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0F1, 0xB0F1, 0x6112, 0x5912, 0xA8F1, 0xA8F1, 0x60F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xC0B1, 0xC8B1, 0xC0B1, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA4B5, 0x8191, 0xA1B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0xC496, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF39, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0x99F2, 0x8991, 0xB1D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC577, 0xBF19, 0xBF39, 0xBF39, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9BF5, 0x8191, 0xB1D2, 0xC9F3, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF19, 0xBF19, 0xB6B9, 0x8191, 0x8991, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9D3, 0xC9F3, 0xC9F3, 0xBED8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xAD57, 0x8191, 0x99B2, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x8191, 0xA9B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9C75, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xB6B8, 0x8191, 0x8191, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xADB7, 0x8191, 0x91B1, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC71A, 0xBF1A, 0xC73A, 0xBF3A, 0xC659, 0xC9D3, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x003F, 0x001F, 0x7076, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x0BFF, 0x05DF, 0x05BF, 0x0639, 0x07CD, 0x07F2, 0x07FC, 0x07FF, 0x63F7, 0xB0F1, 0xB0F1, 0xB0F1, 0x4132, 0x4111, 0xA0F1, 0xB0F1, 0x90F1, 0x30F0, 0x28EF, 0x28CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xC0B1, 0xC0B1, 0xC0B1, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8991, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA34, 0xCA13, 0xCA33, 0xCA33, 0xCCB6, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA455, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0x91B1, 0x8191, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA13, 0xC455, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0x8A52, 0x8991, 0xC213, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCD56, 0xC738, 0xC738, 0xC739, 0xB5D7, 0x8191, 0x91B1, 0xCA13, 0xCA13, 0xCA13, 0xD233, 0xCA33, 0xCA33, 0xCA33, 0xCB55, 0xCF38, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0x8191, 0x8191, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xD233, 0xCA13, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCDF7, 0xC738, 0xC738, 0xC738, 0xC739, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xB5D6, 0x8191, 0x99B2, 0xCA33, 0xCA33, 0xD213, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCB74, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0x8AB2, 0x8191, 0xBA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA13, 0xCF39, 0xC739, 0xC759, 0xCF3A, 0xCF39, 0xCED9, 0xC9F3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x001F, 0x001F, 0x9894, 0xB8D1, 0xB8D1, 0xB8D1, 0x42DA, 0x059F, 0x05FF, 0x0678, 0x07CC, 0x07F1, 0x07FC, 0x07FF, 0x82B5, 0xA8F1, 0xB0F1, 0x98F2, 0x4132, 0x3912, 0x70F1, 0xA8F1, 0xA8F1, 0x50F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC0B1, 0xC0B1, 0xC0B1, 0xCF57, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA54, 0xCCD6, 0xCF58, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF58, 0xAC75, 0x8191, 0xA9F2, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCE17, 0xCF57, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0x99D2, 0x89B1, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xD6B7, 0xD758, 0xCF58, 0xCF57, 0xCF58, 0xD758, 0xD757, 0xD758, 0xD757, 0xD758, 0xCF58, 0xB535, 0x8191, 0xA1D2, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCA73, 0xCA53, 0xCA53, 0xCC95, 0xD758, 0xD758, 0xCF58, 0xBDD6, 0x8191, 0x99D2, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD254, 0xCA54, 0xD435, 0xD758, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF57, 0xD738, 0xCF58, 0x9AF3, 0x8991, 0xC213, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA54, 0xCA73, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xD253, 0xCA54, 0xD253, 0xCA53, 0xCA54, 0xCE17, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xD617, 0xD758, 0xCF58, 0xCF58, 0xBDD6, 0x8191, 0x91B2, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xD253, 0xD253, 0xCCD6, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF57, 0xD757, 0xCF58, 0xD758, 0x9AF3, 0x8191, 0xBA33, 0xCA54, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xD758, 0xD758, 0xDF59, 0xD779, 0xD759, 0xD759, 0xD6F9, 0xC1F2, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x001F, 0x001F, 0x001F, 0x183E, 0xB0D2, 0xB8D1, 0xB8D1, 0x9974, 0x059F, 0x061F, 0x0698, 0x07CC, 0x07F0, 0x07FC, 0x07FF, 0x82B5, 0xB0F1, 0xB0F1, 0x88F1, 0x4132, 0x4111, 0x3910, 0x98F1, 0xA8F2, 0x88F1, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC0B1, 0xC0B1, 0xC0B1, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0x99D2, 0x91D2, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xD3D4, 0xDF77, 0xDF77, 0xDF77, 0xDF76, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0x8191, 0x8992, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xCA94, 0xD3D5, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xCA94, 0xCA94, 0xD273, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xD515, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xD294, 0xCA94, 0x8191, 0xAA12, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA93, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xE779, 0xDF19, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x385B, 0xB8D1, 0xB8D1, 0xB8D1, 0x2C3C, 0x061F, 0x06B7, 0x07CB, 0x07F0, 0x07FB, 0x07FF, 0xB0F1, 0xB0F1, 0xA8F1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xA0F1, 0xA8F1, 0x48EF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xC0D1, 0xE776, 0xE796, 0xE797, 0xE797, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2D4, 0xD2B4, 0xD2B4, 0xDD35, 0xE776, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xB474, 0x8191, 0xAA33, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2D4, 0xE656, 0xEF96, 0xE776, 0xE797, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0x99D2, 0x99F2, 0xCAB4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD3F5, 0xE777, 0xE797, 0xEF97, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xE777, 0xEF97, 0x8191, 0x8191, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD3D5, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xCAD4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xDD35, 0xE777, 0xEF76, 0xE796, 0xE797, 0xE797, 0xE776, 0xE796, 0xE776, 0xC534, 0xB494, 0xCC15, 0xD3F5, 0xDBF4, 0xDBF4, 0xDBF5, 0xD3F5, 0xD3F4, 0xCB34, 0x8191, 0xAA32, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xE656, 0xE776, 0xE796, 0xE796, 0xE776, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xDE56, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2D4, 0xCAD4, 0xCAD4, 0xDD15, 0xE796, 0xE796, 0xE776, 0xE796, 0xEF96, 0xE796, 0xE796, 0xE796, 0x9B13, 0x8191, 0xBA73, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xE797, 0xEF97, 0xEF77, 0xEF97, 0xEF78, 0xEF98, 0xEF98, 0xEF98, 0xC992, 0xB8D1, 0xC0D1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x7096, 0xB8D1, 0xB8D1, 0x8A35, 0x063F, 0x06D6, 0x07EA, 0x07F1, 0x07FC, 0x07FF, 0xA8F1, 0xA8F1, 0xA8F1, 0x6132, 0x4132, 0x4111, 0x38F1, 0x3110, 0x48F0, 0xA8F1, 0x98F1, 0x30CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xF796, 0xF7B6, 0xF796, 0xF795, 0xF795, 0xF796, 0xEFB6, 0xBC93, 0x8191, 0xAA52, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2F4, 0xDD55, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xEFB6, 0xBC93, 0x8191, 0xAA53, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xE675, 0xF796, 0xF795, 0xF796, 0xF796, 0xF796, 0xF7B6, 0xF7B5, 0xF7B5, 0xEF96, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0x99F2, 0x99F2, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2F4, 0xD2F4, 0xDC75, 0xF795, 0xF795, 0xF795, 0xF796, 0xF7B5, 0xF796, 0xF796, 0xF796, 0xF796, 0xEFB6, 0xF7B5, 0xF796, 0x8191, 0x8991, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xDC15, 0xF796, 0xF796, 0xF796, 0xD615, 0x8191, 0x99F2, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xE535, 0xF7B6, 0xF7B5, 0xF796, 0xEFB6, 0xF796, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xF795, 0xF796, 0xF796, 0xF795, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xBC93, 0x8191, 0xAA53, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF796, 0xF7B5, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF7B5, 0xF795, 0xD634, 0x8191, 0x99F2, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2D4, 0xE555, 0xF796, 0xF7B5, 0xF7B6, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xA311, 0x8191, 0xBA94, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xF796, 0xF796, 0xF797, 0xF797, 0xF797, 0xF7B7, 0xF798, 0xF798, 0xD273, 0xB8D1, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x98B4, 0xB8D1, 0xB8D1, 0x3C9B, 0x06F5, 0x07E9, 0x07F1, 0x07FD, 0x26BD, 0xB0F1, 0xB0F2, 0xB0F1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30F0, 0x60F0, 0xA911, 0x70F0, 0x20CE, 0x20CF, 0x20AE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xFF94, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD315, 0xD335, 0xD335, 0xD335, 0xD334, 0xD315, 0xD335, 0xE575, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xF675, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB5, 0xFF95, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0x99F2, 0x99F2, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD315, 0xD335, 0xDC54, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0x8191, 0x8191, 0xD334, 0xD315, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xDC34, 0xFFB4, 0xFFB5, 0xFFB5, 0xDE34, 0x8191, 0x99F2, 0xD314, 0xD335, 0xD315, 0xD334, 0xD334, 0xD335, 0xD335, 0xE574, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xC4B3, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xEDF5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0xF694, 0xFFB5, 0xFFB5, 0xFFB5, 0xDE14, 0x8191, 0x99F2, 0xD335, 0xD335, 0xD314, 0xD334, 0xD314, 0xD334, 0xD315, 0xE555, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xA332, 0x8191, 0xBAB4, 0xD335, 0xD335, 0xD335, 0xD315, 0xD334, 0xD335, 0xD335, 0xFFB5, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB7, 0xFFB8, 0xDBD4, 0xB8D2, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x083F, 0x70F7, 0xB8D1, 0xA952, 0x0E94, 0x07C9, 0x07F2, 0x07FD, 0x2E3C, 0xA8F1, 0xA8F1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30EF, 0x58F0, 0xA8F1, 0x40CF, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x00F9, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xC3F0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xF590, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x9A12, 0x91F2, 0xD355, 0xD354, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDBD4, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0x8191, 0x8191, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDC13, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x99F2, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xC3CF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xE4D1, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xC3D0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xF590, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x9A12, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD2, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE2F, 0xA2B0, 0x8191, 0xC2F4, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xFE2F, 0xFE50, 0xFE50, 0xFE50, 0xFE51, 0xFE51, 0xFE52, 0xFE52, 0xE3D2, 0xB8D2, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x003F, 0x00DF, 0x59F8, 0xB8D1, 0x8291, 0x07C9, 0x07F2, 0x07FE, 0x455A, 0xB0F1, 0xA8F1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x50CF, 0x48EF, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xB8D1, 0xB0D1, 0xB0D2, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xC30F, 0x81B1, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD396, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0x9A12, 0x8191, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xDBD3, 0xFC8D, 0xFC6D, 0xFC6D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC8D, 0xFC6D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD375, 0xD395, 0xD376, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFC8E, 0xFC8F, 0xFC8F, 0xFC8F, 0xFCB0, 0xFCB0, 0xFCB1, 0xFCB1, 0xF3B2, 0xB8D1, 0xB0F1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x031F, 0x2D3B, 0x99B2, 0x454B, 0x07F3, 0x07FE, 0x5498, 0xB0F1, 0xA8F1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30F0, 0x30EF, 0x30CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xB0F1, 0xB0D1, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9A12, 0x8191, 0xC334, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFC8E, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFC8D, 0xFC8D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB2F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB6F, 0x8191, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFC8E, 0xFC8F, 0xFCAF, 0xFCAF, 0xFCB0, 0xFCB0, 0xFCB0, 0xFCB2, 0xF451, 0xB0D1, 0xB0D1, 0xB0D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x003F, 0x005F, 0x025F, 0x06FD, 0x0770, 0x0F88, 0x07F4, 0x07FF, 0x5478, 0xA8F1, 0xA8F1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xB0F1, 0xB0D1, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xCB4E, 0x8191, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xBB11, 0x8191, 0xAA73, 0xD396, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFCAE, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFCAD, 0xFCCD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD3, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCAD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA94, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xFCAD, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFCCE, 0xFCCF, 0xFCCF, 0xFCEF, 0xFCD0, 0xFCF0, 0xFCF1, 0xFCF1, 0xFCF2, 0xB0F1, 0xB0F1, 0xB0F2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x007F, 0x021F, 0x06FC, 0x078D, 0x07E7, 0x07F6, 0x07FF, 0x82B5, 0xA8F1, 0xA111, 0x4932, 0x4132, 0x4111, 0x38F1, 0x38F0, 0x30F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xA8F1, 0xB0F1, 0xFD0D, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFD0D, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC6F, 0x91D1, 0x89D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xDBB4, 0xEC70, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFCED, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBF3, 0xFCED, 0xFCED, 0xFCED, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xEC6E, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xF4AF, 0xFD0D, 0xFCED, 0xFD0D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD0E, 0xFD0F, 0xFD0F, 0xFD0F, 0xFD10, 0xFD10, 0xFD31, 0xFD31, 0xFD32, 0xB0F1, 0xB0F1, 0xB0F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x005F, 0x021F, 0x073B, 0x07AC, 0x07E7, 0x07F7, 0x07FF, 0x82B5, 0xA8F1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x10CF, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xA8F1, 0xB0F1, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xE44E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xC34F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xE431, 0xEC71, 0xEC71, 0xDBF0, 0xE450, 0xF4CF, 0xFD0E, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xF4AF, 0xF4CF, 0xF4AF, 0xDC10, 0x9A12, 0xAA73, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2C, 0xFD2C, 0x9211, 0x8191, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFCEE, 0xFD2D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC10, 0xE44E, 0xDC2E, 0xE44E, 0xB2F0, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD2E, 0xFD2F, 0xFD2F, 0xFD4F, 0xFD50, 0xFD50, 0xFD51, 0xFD51, 0xFD71, 0xA8F1, 0xB0F1, 0xB0F2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x007F, 0x023F, 0x073B, 0x07AB, 0x07E8, 0x07F9, 0x07FF, 0xA152, 0xA8F1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA8F1, 0xA8F1, 0xA8F2, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xE46E, 0x8191, 0x9212, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD2D, 0x9211, 0x89B2, 0xCB75, 0xD396, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xBB2F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD6E, 0xFD6F, 0xFD6F, 0xFD8F, 0xFD90, 0xFD90, 0xFD91, 0xFD91, 0xFD92, 0xA8F1, 0xA8F1, 0xA8F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x005F, 0x007F, 0x009F, 0x023F, 0x0779, 0x07AA, 0x07E8, 0x07FB, 0x07FF, 0xA8F1, 0xA8F1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x0116, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xA8F1, 0xA8F1, 0xA8F1, 0xEC6F, 0xFD8D, 0xFDAD, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xE48E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFDAD, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFD8D, 0xE4AE, 0x8991, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xE491, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFDAD, 0xF52D, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFD8D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFDAF, 0xFDAF, 0xFDAF, 0xFDAF, 0xFDB0, 0xFDB0, 0xFDB1, 0xFDD1, 0xE4B2, 0xA911, 0xA8F1, 0xA8F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x007F, 0x009F, 0x02BF, 0x0778, 0x07C8, 0x07E9, 0x07FD, 0x173E, 0xA8F1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA911, 0xA911, 0xA911, 0xEC8E, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xE4CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDED, 0xFDCD, 0xD44F, 0x8191, 0xB2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0x8991, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xBB6F, 0x8191, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDED, 0xFDED, 0xFDED, 0xFDED, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFDEE, 0xFDEF, 0xFDEF, 0xFDF0, 0xFDF0, 0xFDF0, 0xFDF1, 0xFDF1, 0xECB1, 0xA0F1, 0xA911, 0xA911, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x005F, 0x005F, 0x007F, 0x009F, 0x009F, 0x041F, 0x0797, 0x07C7, 0x07EB, 0x07FE, 0x2E5C, 0xA8F1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0118, 0x0117, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA911, 0xA911, 0xA111, 0xE42E, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xE4EE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xD44F, 0x8191, 0xBAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xECD1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xF5AD, 0x9A70, 0x89B1, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0E, 0xFE0D, 0xFE0E, 0xFE0E, 0xFE0E, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE0F, 0xFE0F, 0xFE0F, 0xFE30, 0xFE30, 0xFE30, 0xFE31, 0xFE31, 0xDC32, 0xA111, 0xA911, 0xA111, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x005F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x043F, 0x0794, 0x07E6, 0x07EC, 0x07FE, 0x35DB, 0xA911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AC, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x00F8, 0x18CF, 0x20AD, 0x18AD, 0x20AD, 0x18AC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x80F0, 0xA111, 0xA111, 0xC2B0, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x89D1, 0xA253, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xF60E, 0x9A70, 0x91F2, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF2, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE4E, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE50, 0xFE71, 0xFE51, 0xBA52, 0xA111, 0xA111, 0x78D5, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x00BF, 0x043F, 0x07B3, 0x07C5, 0x07EE, 0x07FF, 0x5478, 0x6AD6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x00F6, 0x0118, 0x00F8, 0x18CF, 0x18AC, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x60EF, 0xA111, 0xA111, 0xA112, 0xFE2D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xE54E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xF5CF, 0xFE6D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE6D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5CE, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6C, 0xFE8D, 0xF62D, 0xC40F, 0x9A12, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE8D, 0xFE6D, 0xFE2D, 0xBBCF, 0x89B1, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFE90, 0xFE91, 0xE471, 0xA111, 0xA112, 0xA111, 0x60D5, 0x001F, 0x283C, 0x7097, 0x405A, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x009F, 0x00BF, 0x00BF, 0x00DF, 0x045F, 0x07D2, 0x07E4, 0x07EF, 0x07FF, 0x2E3C, 0x2D1A, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x00F6, 0x0118, 0x00F7, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x28CD, 0xA111, 0xA111, 0xA111, 0xCBCF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xF5ED, 0x89D1, 0x91D2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xED11, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xC42F, 0x81B1, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFECC, 0xFEAD, 0xC42F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF64D, 0xD4CE, 0xBBD0, 0xC3B2, 0xC314, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xED31, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xEE0D, 0xCC6F, 0xBB51, 0xBAD4, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xC334, 0x8191, 0xB294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFEAE, 0xFECE, 0xFEAD, 0xFEAE, 0xFEAD, 0xFECE, 0xFEAE, 0xFEAE, 0xA2F0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC34, 0xFEAF, 0xFED0, 0xFEAF, 0xFED0, 0xFEB0, 0xFED1, 0xE491, 0xA911, 0xA111, 0x9931, 0xA111, 0x58D6, 0x88B5, 0xB8D1, 0xB8D1, 0x5059, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x009F, 0x00BF, 0x00FF, 0x00DF, 0x047F, 0x07D2, 0x07E3, 0x07F1, 0x07FF, 0x07FF, 0x2CBA, 0x4933, 0x4132, 0x4131, 0x4111, 0x38F0, 0x38F0, 0x30F0, 0x30EF, 0x28EF, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F6, 0x0118, 0x0118, 0x18CF, 0x20AD, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x20AD, 0x18AD, 0x8110, 0x9911, 0xA111, 0xA171, 0xF5ED, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE6D, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5CF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE4E, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EE, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE8D, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xF64D, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE6E, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF60E, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF64E, 0xFEAC, 0xFEAD, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE6D, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5CF, 0xFEAD, 0xF62E, 0xF5EF, 0xF5D0, 0xF5EF, 0xF5CF, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xFE4F, 0xFECE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAF, 0xF610, 0xF5D0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF610, 0xFEAF, 0xFEAF, 0xFEAF, 0xFED0, 0xFEB0, 0xFEB1, 0xE471, 0xB8D1, 0xA111, 0x9931, 0x9931, 0x9912, 0x6933, 0xB0F1, 0xB0D1, 0xB0D1, 0x283C, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x00BF, 0x00DF, 0x00FF, 0x011F, 0x047F, 0x07D1, 0x07E3, 0x07F3, 0x07FF, 0x07FF, 0x3B77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38F0, 0x38F0, 0x30EF, 0x30EF, 0x28EF, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0118, 0x0117, 0x18CF, 0x18AD, 0x18AC, 0x18AC, 0x18AD, 0x18AC, 0x20AD, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18CD, 0x18AC, 0x20AC, 0x38CE, 0x9931, 0x9931, 0x9931, 0xAA31, 0xFE2D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFEAC, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFEAC, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8E, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAF, 0xFEAE, 0xFEAE, 0xFEAF, 0xFE8E, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFE8F, 0xFEB0, 0xFEAF, 0xFEB0, 0xFE90, 0xE471, 0xB8D2, 0xA111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xB0F1, 0xB0D1, 0xB0D2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x00DF, 0x00DF, 0x011F, 0x011F, 0x049F, 0x07F0, 0x07E2, 0x07F4, 0x07FF, 0x07FF, 0x3AF6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28EE, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x18AC, 0x20AC, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, - 0x0117, 0x18CF, 0x20AC, 0x20AC, 0x20AD, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AD, 0x20AC, 0x60EF, 0x9912, 0x9931, 0x9931, 0xB270, 0xF62D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE6D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFEB0, 0xFEB0, 0xE471, 0xB8D1, 0xA111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xB0F1, 0xB0D1, 0x90B4, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x049F, 0x07F1, 0x07E2, 0x07F6, 0x07FF, 0x0F9F, 0x4A35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CE, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, - 0x18CE, 0x18AC, 0x20CC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AD, 0x18CC, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x28AD, 0x8110, 0x9931, 0x9931, 0x9911, 0xAA31, 0xF5CD, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE6E, 0xFE8D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE90, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xE471, 0xB0D1, 0xA111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xB0D1, 0xB0D1, 0x7896, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x00BF, 0x011F, 0x011F, 0x013F, 0x017F, 0x04BF, 0x07F2, 0x07E2, 0x07F5, 0x07FF, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30EF, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AD, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x28AD, 0x9111, 0x9931, 0x9931, 0x9931, 0xA171, 0xCBCF, 0xF60D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE70, 0xFE70, 0xFE6F, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE90, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xE471, 0xA8F1, 0xA111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xB0D1, 0xB0D1, 0x5878, 0x001F, 0x001F, 0x003F, 0x007F, 0x009F, 0x00FF, 0x013F, 0x013F, 0x017F, 0x019F, 0x033F, 0x07F3, 0x07E2, 0x07F3, 0x07FF, 0xA8F1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x18CC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x28CD, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xBAB0, 0xDC6F, 0xE50F, 0xE50E, 0xFE4E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6F, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xF612, 0xE531, 0xE512, 0xD472, 0xB271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xB0F1, 0xB0F1, 0x285C, 0x003F, 0x005F, 0x007F, 0x00BF, 0x00FF, 0x013F, 0x015F, 0x017F, 0x019F, 0x01BF, 0x02FF, 0x07F4, 0x07E3, 0x07F1, 0x2E5C, 0xA911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AC, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, - 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x28CC, 0x610F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xB0F1, 0xB0D1, 0x087F, 0x009F, 0x00BF, 0x00DF, 0x011F, 0x015F, 0x019F, 0x019F, 0x019F, 0x01DF, 0x01DF, 0x01FF, 0x07F7, 0x07E3, 0x07EF, 0x5498, 0xA8F1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30EF, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x40CE, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xA111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xB0F1, 0x98F3, 0x00DF, 0x00FF, 0x011F, 0x013F, 0x017F, 0x01BF, 0x01BF, 0x01DF, 0x01DF, 0x01FF, 0x01FF, 0x021F, 0x06D9, 0x07E5, 0x07EC, 0x7355, 0xA8F1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390F, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x28CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x30CC, 0x58CF, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xA111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xA8F1, 0xB0F1, 0x80F5, 0x013F, 0x017F, 0x019F, 0x01BF, 0x01DF, 0x01FF, 0x01DF, 0x01FF, 0x021F, 0x023F, 0x023F, 0x023F, 0x057D, 0x07E8, 0x07E9, 0x82D5, 0xA0F1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38F0, 0x38EF, 0x30EF, 0x30EE, 0x28CE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20AD, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CE, 0x28EE, 0x28EE, 0x30EE, 0x30EF, 0x30EF, 0x30EE, 0x38EF, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xA932, 0xA131, 0xB131, 0xC912, 0xC911, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0x5158, 0x01BF, 0x01DF, 0x01FF, 0x021F, 0x023F, 0x023F, 0x021F, 0x023F, 0x025F, 0x025F, 0x025F, 0x025F, 0x041F, 0x07ED, 0x07E4, 0x7AB4, 0xA911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38EF, 0x30EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x20CC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AB, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28AD, 0x28CE, 0x30CE, 0x30CE, 0x30EE, 0x8151, 0xB192, 0xC9B3, 0xC9B2, 0xC992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC932, 0xC912, 0xC912, 0xC111, 0xC8F1, 0xC8F1, 0xC8D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D2, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0x39BB, 0x021F, 0x023F, 0x025F, 0x027F, 0x027F, 0x025F, 0x025F, 0x027F, 0x027F, 0x027F, 0x027F, 0x027F, 0x029F, 0x07F3, 0x07E2, 0x9972, 0xA911, 0xA112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38EF, 0x30EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18CC, 0x18AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x18AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CC, 0x20CC, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x30CD, 0x28EE, 0x30EE, 0x490E, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC932, 0xC932, 0xC912, 0xC912, 0xC912, 0xC0F2, 0xC8D1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB8D2, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0x123E, 0x029F, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x029F, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x02DF, 0x06B9, 0x07E3, 0xA111, 0xA911, 0xA111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390F, 0x38EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x18AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x30ED, 0x692F, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC132, 0xC912, 0xC912, 0xC8F2, 0xC8F1, 0xC8D1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0x9933, 0x02DF, 0x02DF, 0x02FF, 0x02FF, 0x02DF, 0x02BF, 0x02DF, 0x02DF, 0x02DF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02FF, 0x051E, 0x07E8, 0xA912, 0xA111, 0xA111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410F, 0x390F, 0x38EE, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x28AC, 0x20CC, 0x28CC, 0x28CC, 0x28CC, 0x28CD, 0x28CD, 0x28ED, 0x28CD, 0x30CD, 0x9191, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC912, 0xC932, 0xC912, 0xC112, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8D1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88B4, 0x88B5, 0x88B5, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0x69D6, 0x033F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02DF, 0x02FF, 0x035F, 0x03FF, 0x07F0, 0x8A4F, 0xA111, 0xA111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410F, 0x390F, 0x30EE, 0x30EE, 0x30CD, 0x30CD, 0x28CD, 0x28CD, 0x28CC, 0x28CC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CC, 0x20AC, 0x28CC, 0x28CC, 0x28CC, 0x20CC, 0x28CC, 0x28CC, 0x28CD, 0x40EE, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC932, 0xC932, 0x90D5, 0x88D6, 0x6098, 0x5879, 0x303C, 0x305C, 0x081E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00BF, 0x00DF, 0x291C, 0x411A, 0x6118, 0x8915, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0x429A, 0x039F, 0x039F, 0x035F, 0x035F, 0x033F, 0x033F, 0x033F, 0x033F, 0x033F, 0x033F, 0x031F, 0x031F, 0x031F, 0x037F, 0x03FF, 0x06D7, 0x7ACF, 0xA111, 0xA111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410F, 0x40EF, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x28CD, 0x28CD, 0x28CC, 0x28CC, 0x20CC, 0x20CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x28CC, 0x28CC, 0x28CC, 0x28CD, 0x28CC, 0x490E, 0xC1D3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC952, 0x98F5, 0x60B8, 0x407B, 0x183E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x00FF, 0x011F, 0x013F, 0x017F, 0x019F, 0x01DF, 0x021F, 0x21FD, 0x49D9, 0x7996, 0xA112, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0x139E, 0x03DF, 0x03BF, 0x039F, 0x039F, 0x037F, 0x037F, 0x037F, 0x037F, 0x035F, 0x035F, 0x033F, 0x033F, 0x035F, 0x03BF, 0x041F, 0x05DE, 0x7AD1, 0xA111, 0xA111, 0xA111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40EF, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x692F, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC992, 0xC9B2, 0xC972, 0xB973, 0x80F7, 0x387B, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00BF, 0x00DF, 0x00FF, 0x013F, 0x015F, 0x019F, 0x01BF, 0x01FF, 0x023F, 0x025F, 0x029F, 0x02DF, 0x02FF, 0x033F, 0x2ADC, 0x5A58, 0x8994, 0xA8F1, 0xA8F1, 0x81D4, 0x041F, 0x041F, 0x03FF, 0x03DF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, 0x037F, 0x035F, 0x037F, 0x039F, 0x03FF, 0x047F, 0x04FF, 0x6375, 0xA112, 0xA111, 0xA111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390F, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28AC, 0x28CC, 0x28CC, 0x28CC, 0x692E, 0xC9F3, 0xC9D2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC993, 0x80F7, 0x389B, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x083C, 0x085B, 0x105B, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187A, 0x105B, 0x085D, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x017F, 0x01BF, 0x01FF, 0x021F, 0x025F, 0x029F, 0x02DF, 0x02FF, 0x033F, 0x037F, 0x03BF, 0x03DF, 0x041F, 0x043F, 0x0C3F, 0x2BBC, 0x0C3F, 0x045F, 0x043F, 0x041F, 0x041F, 0x03FF, 0x03FF, 0x03FF, 0x03DF, 0x03DF, 0x03BF, 0x039F, 0x037F, 0x039F, 0x03DF, 0x043F, 0x04BF, 0x053F, 0x5398, 0xA111, 0xA111, 0xA111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30CD, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CB, 0x28CB, 0x28CC, 0x28CB, 0x614E, 0xD1F3, 0xC9F3, 0xC9D3, 0xC9B2, 0xC9B3, 0xB173, 0x60D9, 0x081E, 0x003D, 0x083B, 0x1878, 0x1877, 0x28D2, 0x28D2, 0x40EE, 0x38EE, 0x390F, 0x390F, 0x390F, 0x410E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x4910, 0x4130, 0x38F3, 0x28B6, 0x189A, 0x003E, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x00BF, 0x00DF, 0x00FF, 0x013F, 0x015F, 0x019F, 0x01DF, 0x021F, 0x023F, 0x027F, 0x029F, 0x02FF, 0x033F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x047F, 0x04BF, 0x04DF, 0x04DF, 0x04BF, 0x04BF, 0x047F, 0x047F, 0x043F, 0x043F, 0x043F, 0x041F, 0x041F, 0x03FF, 0x03DF, 0x03BF, 0x03BF, 0x03DF, 0x043F, 0x047F, 0x04DF, 0x057F, 0x3C1A, 0xA111, 0xA111, 0xA111, 0xA111, 0x5931, 0x4910, 0x4110, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CB, 0x20CB, 0x28AB, 0x692E, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9B3, 0xB1B2, 0x58F3, 0x1895, 0x28B2, 0x30ED, 0x38ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x390E, 0x390E, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390E, 0x410F, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x492F, 0x4930, 0x4910, 0x38F3, 0x20B8, 0x087D, 0x007F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x017F, 0x019F, 0x01DF, 0x021F, 0x025F, 0x02BF, 0x02DF, 0x031F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x049F, 0x04DF, 0x04FF, 0x051F, 0x051F, 0x053F, 0x04FF, 0x04DF, 0x04BF, 0x049F, 0x047F, 0x047F, 0x045F, 0x045F, 0x043F, 0x041F, 0x03FF, 0x03DF, 0x03FF, 0x043F, 0x045F, 0x04BF, 0x053F, 0x05BF, 0x2CDC, 0xA112, 0xA111, 0xA111, 0xA111, 0x7131, 0x4930, 0x4130, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28CB, 0x28CB, 0x612E, 0xC9F3, 0xC9D3, 0xC9D3, 0xB992, 0x692E, 0x28CC, 0x28EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x30ED, 0x38ED, 0x38ED, 0x390E, 0x38EE, 0x38EE, 0x38EE, 0x390F, 0x38EE, 0x40EE, 0x40EE, 0x390F, 0x390E, 0x410E, 0x40EF, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4910, 0x4910, 0x4930, 0x4113, 0x28F8, 0x08FE, 0x013F, 0x015F, 0x019F, 0x01DF, 0x021F, 0x023F, 0x029F, 0x02BF, 0x031F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x049F, 0x04DF, 0x051F, 0x053F, 0x057F, 0x059F, 0x057F, 0x055F, 0x053F, 0x04FF, 0x04FF, 0x04DF, 0x04BF, 0x049F, 0x049F, 0x047F, 0x045F, 0x043F, 0x041F, 0x041F, 0x043F, 0x045F, 0x04BF, 0x04FF, 0x055F, 0x05DF, 0x0E1F, 0xA111, 0xA111, 0xA111, 0xA112, 0x8931, 0x4930, 0x4130, 0x410F, 0x410E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x20CB, 0x612E, 0xD1F3, 0xC9F3, 0xC1B2, 0x612E, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197A, 0x01DE, 0x021F, 0x027F, 0x02BF, 0x02FF, 0x033F, 0x037F, 0x03BF, 0x03FF, 0x045F, 0x049F, 0x04DF, 0x051F, 0x057F, 0x059F, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x059F, 0x055F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04DF, 0x04BF, 0x047F, 0x045F, 0x043F, 0x043F, 0x047F, 0x04BF, 0x04FF, 0x053F, 0x05BF, 0x061F, 0x069F, 0x9972, 0xA111, 0xA111, 0xA111, 0xA111, 0x5130, 0x4910, 0x410F, 0x390F, 0x390E, 0x38ED, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x510D, 0xD1F3, 0xC9D2, 0x816F, 0x30CC, 0x28AC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31B6, 0x0A9D, 0x02FF, 0x035F, 0x039F, 0x03FF, 0x043F, 0x047F, 0x04BF, 0x051F, 0x055F, 0x05BF, 0x05DF, 0x061F, 0x063F, 0x063F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04BF, 0x047F, 0x047F, 0x047F, 0x049F, 0x04DF, 0x053F, 0x057F, 0x05FF, 0x065F, 0x06DF, 0x7A95, 0xA111, 0xA111, 0xA111, 0xA111, 0x6911, 0x4930, 0x410F, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x40EC, 0xC1D2, 0xC1B3, 0x490D, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39D5, 0x131C, 0x041F, 0x047F, 0x04BF, 0x051F, 0x055F, 0x059F, 0x05DF, 0x061F, 0x067F, 0x069F, 0x069F, 0x067F, 0x065F, 0x061F, 0x05FF, 0x05FF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04BF, 0x04BF, 0x04BF, 0x04DF, 0x051F, 0x057F, 0x05BF, 0x063F, 0x069F, 0x071F, 0x5438, 0xA111, 0xA111, 0xA111, 0xA111, 0x8111, 0x4930, 0x410F, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x30CB, 0xA992, 0xA9B1, 0x30CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CC, 0x30EC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3A15, 0x237B, 0x053F, 0x059F, 0x5358, 0x349B, 0x0E1F, 0x06BF, 0x06FF, 0x06FF, 0x06DF, 0x06BF, 0x069F, 0x065F, 0x063F, 0x061F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x051F, 0x04FF, 0x04DF, 0x04DF, 0x04FF, 0x051F, 0x055F, 0x059F, 0x05FF, 0x065F, 0x06DF, 0x073F, 0x359B, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x4930, 0x4910, 0x412F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x692F, 0x816F, 0x20AB, 0x20CB, 0x20AB, 0x28CB, 0x28CB, 0x28CB, 0x28AB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49D4, 0x243A, 0xA132, 0xA8F1, 0xA8F1, 0xA8F1, 0x8295, 0x8295, 0x5418, 0x351B, 0x06DF, 0x069F, 0x067F, 0x065F, 0x063F, 0x05FF, 0x05FF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x051F, 0x053F, 0x057F, 0x059F, 0x05DF, 0x063F, 0x069F, 0x06FF, 0x077F, 0x0F5F, 0xA111, 0xA111, 0xA111, 0xA111, 0x9931, 0x6911, 0x4930, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20CB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x28CB, 0x28AB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30EE, 0x38ED, 0x38ED, 0x390E, 0x390E, 0x390E, 0x410E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA172, 0x4C39, 0x2D5C, 0x069F, 0x065F, 0x063F, 0x061F, 0x05FF, 0x05DF, 0x059F, 0x057F, 0x055F, 0x055F, 0x055F, 0x057F, 0x059F, 0x05DF, 0x061F, 0x067F, 0x06DF, 0x073F, 0x079F, 0x07DF, 0x8254, 0xA111, 0xA131, 0xA111, 0x9911, 0x8131, 0x4910, 0x410F, 0x410E, 0x38EE, 0x38ED, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30EC, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xA111, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA111, 0xA911, 0xA0F1, 0x9972, 0x4419, 0x067F, 0x065F, 0x061F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x059F, 0x05BF, 0x05BF, 0x05DF, 0x061F, 0x065F, 0x06BF, 0x06FF, 0x075F, 0x07BF, 0x07FF, 0x5498, 0xA131, 0xA111, 0xA111, 0xA111, 0x9911, 0x4930, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x28CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30EC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390F, 0x410F, 0x410F, 0x490F, 0x412F, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA111, 0x7A55, 0x34BB, 0x065F, 0x061F, 0x05FF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05FF, 0x063F, 0x065F, 0x069F, 0x06DF, 0x071F, 0x077F, 0x07BF, 0x07FF, 0x2E3C, 0x9911, 0xA111, 0xA111, 0x9931, 0x9931, 0x6910, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xA111, 0xA111, 0xA111, 0x91B3, 0x62F6, 0x347B, 0x061F, 0x061F, 0x063F, 0x063F, 0x065F, 0x067F, 0x06BF, 0x071F, 0x073F, 0x079F, 0x07DF, 0x07FF, 0x07FF, 0xA111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410F, 0x410E, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x91B3, 0x349B, 0x065F, 0x067F, 0x069F, 0x06BF, 0x06FF, 0x073F, 0x077F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x7AD4, 0xA111, 0x9911, 0xA111, 0x9931, 0x9931, 0x4930, 0x410F, 0x390E, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA911, 0xA112, 0xA111, 0xA911, 0xA111, 0xA112, 0xA0F1, 0xA111, 0xA111, 0xA111, 0x7A75, 0x15FD, 0x06BF, 0x06FF, 0x071F, 0x075F, 0x079F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410F, 0x390E, 0x390E, 0x38EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x20AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x40EE, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x5931, 0x90F1, 0xA911, 0xA912, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0x9972, 0x353B, 0x071F, 0x073F, 0x077F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x2E3C, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x412F, 0x4130, 0x4930, 0x4930, 0x8111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA112, 0xA111, 0xA111, 0x4499, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9931, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490F, 0x410F, 0x38EE, 0x30EE, 0x38ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x28AB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x310E, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x7131, 0xA111, 0xA111, 0xA112, 0xA111, 0xA0F1, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA131, 0x6397, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7AD4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390F, 0x38EE, 0x38EE, 0x38ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30EC, 0x30ED, 0x38EE, 0x30ED, 0x38ED, 0x390E, 0x38EE, 0x410E, 0x410F, 0x410F, 0x4930, 0x4930, 0x6931, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0x9931, 0x9911, 0x6397, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x5C14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410F, 0x390E, 0x390E, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x30EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x9931, 0xA111, 0x9931, 0x5498, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x35F5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510F, 0x390E, 0x390E, 0x38ED, 0x30ED, 0x30CC, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x28CB, 0x20CB, 0x28AB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x390E, 0x410F, 0x410F, 0x412F, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xA111, 0xA111, 0xA111, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA111, 0xA111, 0xA111, 0x3D7A, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07F6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390E, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28AB, 0x28AB, 0x20AB, 0x20AB, 0x20CA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x18AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28CB, 0x20AB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xA111, 0xA111, 0xA111, 0x9931, 0xA111, 0xA111, 0xA112, 0x9931, 0x9911, 0x9192, 0x1EBD, 0x07FF, 0x07FF, 0x07FE, 0x07F6, 0x7A71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410E, 0x38EE, 0x30ED, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20AB, 0x28AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AC, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CC, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x28CE, 0x28CE, 0x28CE, 0x28EE, 0x28CE, 0x28EE, 0x30EE, 0x30EF, 0x30EF, 0x30EF, 0x390F, 0x390F, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xA111, 0xA111, 0xA111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07FF, 0x07FF, 0x07FD, 0x07F6, 0x5C32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390F, 0x30EF, 0x30EF, 0x30EE, 0x30CE, 0x28CD, 0x28EE, 0x28ED, 0x28CD, 0x20CD, 0x20AC, 0x20CD, 0x20CD, 0x20AD, 0x20CD, 0x20AD, 0x20CC, 0x20CC, 0x20AD, 0x20CC, 0x20AC, 0x20CC, 0x20CC, 0x20AC, 0x20AC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, - 0x18D2, 0x10F2, 0x18D2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F2, 0x20F2, 0x18F2, 0x18F2, 0x20F2, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F2, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x28F3, 0x28F3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28F3, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xA111, 0xA111, 0x9931, 0x9911, 0xA111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5C38, 0x07FF, 0x07FD, 0x07F6, 0x44F2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x1912, 0x18F2, 0x20F3, 0x18F2, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, - 0x10F2, 0x18D2, 0x18D2, 0x10D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x20F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2112, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F2, 0x20F3, 0x20F2, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x28F3, 0x2113, 0x20F3, 0x2113, 0x28F3, 0x20F3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28F3, 0x28F3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28F3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xA111, 0xA112, 0xA111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2E5C, 0x07FC, 0x07F6, 0x2E53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20F3, 0x2112, 0x20F3, 0x20D3, 0x1912, 0x18F2, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x20F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, - 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x259C, 0x1DBC, 0x1D9D, 0x259D, 0x1D9C, 0x259C, 0x259C, 0x259C, 0x259C, 0x259C, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x1DDD, 0x25DD, 0x25DD, 0x25DD, 0x25BD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x25FD, 0x2DFE, 0x2DFD, 0x2DFD, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3E, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x365E, 0x365E, 0x2E5D, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3D, 0x363D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x361D, 0x361D, 0x361D, 0x361D, 0x361D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1E, 0x461E, 0x461D, 0x4DFE, 0x4DFD, 0x4E3E, 0x4DFE, 0x55DD, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7A74, 0x07FB, 0x07F6, 0x07F6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4CFB, 0x3DFE, 0x35DD, 0x35DD, 0x2DDD, 0x2DDD, 0x2DDD, 0x2DDD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25DC, 0x25BD, 0x25BD, 0x25BD, 0x1DBD, 0x25BC, 0x1DBD, 0x1DBD, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, - 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7B, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x249C, 0x1C9C, 0x1D9D, 0x1D7C, 0x1CFC, 0x1C9C, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24DC, 0x24DC, 0x24DC, 0x253D, 0x25BD, 0x253D, 0x24DD, 0x24BC, 0x24BC, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24FD, 0x24DC, 0x24DC, 0x24FD, 0x24FD, 0x24FC, 0x24DD, 0x24FD, 0x251C, 0x25FD, 0x255D, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FC, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x251D, 0x24FD, 0x24FD, 0x251D, 0x2D1D, 0x24FD, 0x2CFD, 0x25BD, 0x25BD, 0x253C, 0x2CFC, 0x2D1D, 0x251D, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1C, 0x2D5D, 0x2DDE, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2E1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2DDD, 0x2D5D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2DBD, 0x2DBD, 0x2CFD, 0x2D1D, 0x251C, 0x251C, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x34FD, 0x34FD, 0x34FD, 0x34FD, 0x34FD, 0x3CFD, 0x3CFD, 0x3CFD, 0x3CFD, 0x3D1D, 0x451D, 0x451D, 0x451D, 0x4D1D, 0x4D1D, 0x553D, 0x91B3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA112, 0x9931, 0x9931, 0x5496, 0x07F7, 0x07F7, 0x8A13, 0xA111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34DD, 0x34DD, 0x2CDD, 0x2CDC, 0x2CDD, 0x2CBC, 0x24DC, 0x24BC, 0x24BC, 0x253C, 0x25BD, 0x253C, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, - 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1B3B, 0x1CFC, 0x157C, 0x1C1C, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x22FB, 0x231C, 0x1D1C, 0x1D5C, 0x235B, 0x22DC, 0x22DB, 0x22DC, 0x22FB, 0x22FC, 0x22DC, 0x22DC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FB, 0x22FB, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231B, 0x22FC, 0x233C, 0x253C, 0x1CFD, 0x22FC, 0x22FC, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x2AFC, 0x2AFC, 0x231C, 0x2B1C, 0x2B1C, 0x259C, 0x247C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x25BD, 0x2BBC, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x25DD, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B7C, 0x259D, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x245D, 0x259C, 0x22FC, 0x2AFC, 0x231C, 0x2AFC, 0x22FC, 0x231C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2AFC, 0x2B1C, 0x2B1C, 0x2B1C, 0x331C, 0x331C, 0x331C, 0x331C, 0x331C, 0x3B1C, 0x3B3D, 0x3B3D, 0x3B3D, 0x433C, 0x433D, 0x4B3D, 0x435D, 0x5A9A, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07F9, 0x72D4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331C, 0x32FC, 0x2AFB, 0x2AFC, 0x2AFB, 0x22FB, 0x22DC, 0x22DC, 0x22FB, 0x22DB, 0x22DB, 0x235C, 0x1D5C, 0x1D1D, 0x231B, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, - 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x137B, 0x1B5B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x139B, 0x1BBB, 0x14FB, 0x153C, 0x13FB, 0x1B7B, 0x139B, 0x1B7B, 0x1B7C, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, 0x139C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1D3C, 0x1D5C, 0x1BFB, 0x1B9C, 0x1BBB, 0x1B9B, 0x1BBC, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1CDC, 0x1D7D, 0x23FC, 0x1BDC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x1BBC, 0x1BBC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x247C, 0x1D9C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x241C, 0x259D, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x243C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x259C, 0x247C, 0x23BC, 0x23BC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23BC, 0x23BC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x2BDC, 0x2BDC, 0x2BDC, 0x2BDC, 0x2BDC, 0x33DC, 0x33DC, 0x33DC, 0x33DC, 0x3BDC, 0x3BFC, 0x3BFC, 0x3BDC, 0x43FC, 0x43FD, 0x6B18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6B53, 0x07FA, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2BBC, 0x2BBC, 0x2BBC, 0x2BBB, 0x23BB, 0x23BB, 0x239B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BDB, 0x1D5C, 0x1D1C, 0x1B9B, 0x1B9B, 0x139B, 0x139C, 0x1B9B, 0x1B7B, 0x1B7B, 0x139B, 0x1B9B, 0x1B9B, 0x1B7B, 0x1B9B, 0x139B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, - 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x137B, 0x135A, 0x135A, 0x137B, 0x135A, 0x135B, 0x139B, 0x14BB, 0x14FB, 0x13FB, 0x137B, 0x137B, 0x135B, 0x137B, 0x137A, 0x137A, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1BBB, 0x153C, 0x151C, 0x1B7B, 0x139B, 0x137B, 0x139B, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x13BB, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1C3B, 0x1D5C, 0x1C3C, 0x1B9B, 0x1BBB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1C9C, 0x1D1C, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BDB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1CFC, 0x1C7C, 0x1BBB, 0x1BDB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BDC, 0x23BC, 0x1BBB, 0x1D7C, 0x1BBB, 0x1BDC, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1B9C, 0x1BDC, 0x1BBB, 0x1C5B, 0x1CFB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1D3C, 0x1CBC, 0x1BBB, 0x1BBB, 0x1B9B, 0x1B9C, 0x1B9C, 0x1B9B, 0x1B9B, 0x1BBB, 0x1B9C, 0x1B9B, 0x1BBB, 0x239B, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x2BBC, 0x2BBC, 0x2BBC, 0x2BBC, 0x33BC, 0x33BC, 0x33DC, 0x3BDC, 0x3BDC, 0x3BDC, 0x3BDC, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4C98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4B19, 0x23BC, 0x239B, 0x239B, 0x239B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x14BB, 0x151B, 0x13DB, 0x137B, 0x137A, 0x137B, 0x137B, 0x137A, 0x137B, 0x137B, 0x137B, 0x135B, 0x137B, 0x135B, 0x135B, 0x135B, 0x137B, - 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11BA, 0x11BA, 0x11B9, 0x09B9, 0x11BA, 0x1199, 0x11BA, 0x11BA, 0x1199, 0x11DA, 0x0B3A, 0x0C9B, 0x0BFB, 0x127A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x12BA, 0x14BB, 0x13FB, 0x11DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BB, 0x11BA, 0x11DA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x127A, 0x14DB, 0x137B, 0x11DA, 0x19BA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x19DB, 0x11DA, 0x19DA, 0x1A3B, 0x14FB, 0x1AFB, 0x19DA, 0x11DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x1A1B, 0x153C, 0x1A3B, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x153B, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x11DB, 0x19DB, 0x19DA, 0x19DB, 0x19FB, 0x153C, 0x123A, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x11DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x19DB, 0x19BA, 0x11DA, 0x11BA, 0x1ABB, 0x14FB, 0x1A5B, 0x19BA, 0x19BA, 0x11DA, 0x11DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19BA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x21DB, 0x21DB, 0x21DB, 0x21FB, 0x21FB, 0x29FB, 0x29FB, 0x29FB, 0x29FB, 0x31FB, 0x321B, 0x31FB, 0x321B, 0x41FA, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72D4, 0x4C98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21DB, 0x21DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11D9, 0x137A, 0x149B, 0x131A, 0x11BA, 0x119A, 0x11B9, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, - 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0C3A, 0x0C9A, 0x0BDA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDB, 0x14BB, 0x0BFA, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x131A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133B, 0x133B, 0x133A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x0B3A, 0x137A, 0x0CDB, 0x0C5B, 0x133B, 0x133B, 0x0B3A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x135B, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x135A, 0x0B5B, 0x133B, 0x143A, 0x147B, 0x135B, 0x135A, 0x133B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x13BB, 0x14DB, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x14FB, 0x135A, 0x135B, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x133A, 0x135B, 0x135A, 0x135B, 0x135B, 0x149B, 0x13FB, 0x133A, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133A, 0x133B, 0x133A, 0x135A, 0x133A, 0x143B, 0x147B, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133A, 0x133A, 0x133B, 0x133A, 0x133A, 0x133A, 0x135B, 0x133B, 0x133B, 0x1B3B, 0x1B5B, 0x1B5B, 0x1B3B, 0x1B5B, 0x235B, 0x235B, 0x235B, 0x235B, 0x2B5B, 0x2B5B, 0x2B7B, 0x2B7B, 0x335B, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72D5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71B4, 0x1B3B, 0x1B3B, 0x133A, 0x133B, 0x133A, 0x131A, 0x131A, 0x131A, 0x131A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0BDA, 0x0CBB, 0x0BDA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, - 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02F9, 0x02D9, 0x02DA, 0x0ADA, 0x0AFA, 0x0BFA, 0x0C5B, 0x0BFA, 0x0AD9, 0x02FA, 0x02F9, 0x02F9, 0x0AF9, 0x02F9, 0x0AF9, 0x02D9, 0x02F9, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0C1A, 0x0C7B, 0x0B5A, 0x0AFA, 0x0AF9, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x031A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0C3A, 0x0C5A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0C5B, 0x0C1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0C7B, 0x0B7A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0CBB, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B7A, 0x0CBB, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDA, 0x0C7B, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x131A, 0x131A, 0x131A, 0x131A, 0x131A, 0x1B1A, 0x1B3A, 0x1B3A, 0x1B3A, 0x1B3A, 0x233A, 0x233A, 0x233B, 0x2B3B, 0x2B5B, 0x3AD9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1B1A, 0x131A, 0x131A, 0x12FA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x02FA, 0x0AFA, 0x035A, 0x045A, 0x0C3A, 0x0AFA, 0x02DA, 0x0AFA, 0x0AF9, 0x02F9, 0x0AFA, 0x0AFA, 0x0AFA, 0x02D9, 0x02D9, - 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03B9, 0x03DA, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01B9, 0x037A, 0x0BDA, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033A, 0x041A, 0x01F9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0A79, 0x043A, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09B9, 0x0C3B, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0C7A, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0BFA, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0BDA, 0x02D9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199A, 0x1999, 0x2199, 0x219A, 0x21BA, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01D8, 0x0399, 0x0399, 0x01D9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, - 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01D8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03D9, 0x02B9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01D9, 0x03F9, 0x01F9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02D9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041A, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02B9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01D8, 0x03F9, 0x01F8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03F9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, - 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01D7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01D7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02F8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03B9, 0x01B8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03F9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03F9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03B9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01B7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, - 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02F7, 0x0358, 0x0378, 0x02F7, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D7, 0x02F8, 0x02F8, 0x0398, 0x0378, 0x02F8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0398, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F7, 0x02F8, 0x02F8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03B8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03B8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0378, 0x0338, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0338, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0AF8, 0x0AF8, 0x0AF8, 0x0AF8, 0x0B18, 0x0B18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1B18, 0x2AF8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0AF8, 0x0AF8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D8, 0x02D8, 0x0378, 0x0378, 0x02D7, 0x02D8, 0x02D7, 0x02D7, 0x02D8, - 0x0176, 0x01B6, 0x02F8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01F7, 0x0337, 0x02D7, 0x01B6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01B6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x02F7, 0x0257, 0x0197, 0x01B6, 0x01B7, 0x01B6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x01B6, 0x01B7, 0x0378, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x01F7, 0x0358, 0x0196, 0x0196, 0x01B6, 0x0196, 0x01B6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02F7, 0x02F7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01B6, 0x01B6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09B7, 0x0997, 0x09B7, 0x09B7, 0x09B7, 0x11B7, 0x11B7, 0x11D7, 0x11B7, 0x11B7, 0x11B7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09B6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02B7, 0x0337, 0x0216, 0x0196, 0x0196, - 0x0236, 0x0317, 0x0256, 0x00F4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x01F6, 0x0317, 0x01F6, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x01B6, 0x0337, 0x01B6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x0155, 0x0337, 0x0156, 0x00D5, 0x00D5, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00D6, 0x00D6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00D5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x0115, 0x0338, 0x0115, 0x00F6, 0x00F5, 0x00F6, 0x00F5, 0x00D6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F6, 0x00D5, 0x00F5, 0x0357, 0x00F5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00F5, 0x00D5, 0x00D5, 0x00D6, 0x00D6, 0x00D5, 0x00F5, 0x02F7, 0x0176, 0x00F5, 0x00D5, 0x00F5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x0116, 0x02F7, 0x01D6, 0x00D6, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x08F6, 0x08F6, 0x08F6, 0x08F6, 0x0916, 0x0916, 0x10F6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08F5, 0x08F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x01D6, 0x02F7, 0x0236, 0x0114, - 0x01F4, 0x0113, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00D3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00D3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00D3, 0x00B3, 0x00D3, 0x00D3, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x01D4, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00F4, 0x02B5, 0x01B5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01B5, 0x0255, 0x00D5, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x02F6, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01F5, 0x0235, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x0154, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x08D4, 0x08D4, 0x08D4, 0x08F4, 0x08F4, 0x08F4, 0x08F5, 0x10F4, 0x10D5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00D4, 0x00D4, 0x00D4, 0x00D3, 0x00D3, 0x00D3, 0x00D3, 0x00D3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B3, 0x00D3, 0x00D3, 0x0214, 0x0295, - 0x00B1, 0x0091, 0x0091, 0x0091, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x00D2, 0x01B2, 0x0273, 0x0172, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x01D3, 0x0253, 0x0112, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0213, 0x01D3, 0x0092, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0253, 0x0153, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0294, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00F2, 0x0293, 0x00D2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x0172, 0x0253, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x08B2, 0x08B2, 0x08B2, 0x08D2, 0x08B2, 0x08D2, 0x08D3, 0x10D3, 0x40F2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00D2, 0x00B2, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0131, - 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01D1, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01D2, 0x01F2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0171, 0x0212, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00F1, 0x0252, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0272, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01D1, 0x0171, 0x0091, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01D1, 0x01D1, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F2, 0x01D1, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01B1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F1, 0x0171, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00B0, 0x00B0, 0x00B1, 0x08B1, 0x08B0, 0x08B1, 0x08B1, 0x50F1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, - 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x00D0, 0x0212, 0x01D2, 0x00D0, 0x0090, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x00F0, 0x0232, 0x01B1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0232, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00F0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00F0, 0x0232, 0x00F1, 0x00B0, 0x008F, 0x008F, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0890, 0x08B0, 0x0891, 0x10B0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, - 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0171, 0x0232, 0x0151, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x00F0, 0x0212, 0x0151, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x01F1, 0x01B1, 0x0070, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0130, 0x01F1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0191, 0x01B1, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x008F, 0x0090, 0x006F, 0x008F, 0x0131, 0x0232, 0x00D0, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60F1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006F, 0x0090, 0x006F, 0x008F, 0x008F, 0x0070, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, - 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0070, 0x008F, 0x006F, 0x008F, 0x0110, 0x0232, 0x01B1, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0110, 0x0252, 0x0130, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0170, 0x01F2, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x01D2, 0x0130, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x00CF, 0x0232, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x0191, 0x0212, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x18AF, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xA111, 0x9931, 0xA111, 0x29D2, 0x01B1, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, - 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x01B1, 0x0232, 0x010F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0232, 0x00CF, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x010F, 0x0212, 0x00AF, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x00AF, 0x0212, 0x00AF, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x0252, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x01D1, 0x0130, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x01F1, 0x01B1, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28D0, 0x01F2, 0x01D1, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0110, 0x0212, 0x01B1, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x008F, 0x006E, 0x006E, 0x006F, 0x006F, 0x008E, 0x006E, 0x0191, 0x01F1, 0x00CF, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006E, 0x006E, 0x006F, 0x00CF, 0x0212, 0x0110, 0x008F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0191, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0232, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0110, 0x01F1, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x00AF, 0x0212, 0x0110, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x48D0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008E, 0x008F, 0x01B1, 0x01F2, 0x00AF, 0x006F, 0x006E, 0x008F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x008E, 0x01D1, 0x01F1, 0x008F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x01F1, 0x0170, 0x006F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0211, 0x00CF, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008F, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x108F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006E, 0x006F, 0x006E, 0x0190, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0130, 0x0212, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01D1, 0x0190, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01F1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0211, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0170, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x01F1, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x68F0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x01F2, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x0212, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x008E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0211, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01B1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x38B0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x010F, 0x0212, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x004D, 0x0130, 0x01F2, 0x0150, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x00EF, 0x0212, 0x010F, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x00AF, 0x0212, 0x00CF, 0x004E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x008E, 0x0232, 0x008E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x01D1, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x008E, 0x01F1, 0x012F, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x086E, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004E, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x0211, 0x0190, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006D, 0x004D, 0x004D, 0x004E, 0x004D, 0x004D, 0x006D, 0x006D, 0x008E, 0x01B1, 0x01D1, 0x00CE, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006E, 0x004D, 0x006E, 0x006E, 0x004E, 0x006D, 0x010F, 0x0212, 0x00EF, 0x006D, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x004D, 0x006E, 0x01D1, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0130, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0232, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004D, 0x004D, 0x004E, 0x010F, 0x01D1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x004E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x00CE, 0x0212, 0x00CE, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004D, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x70F0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006E, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x008E, 0x01D1, 0x0190, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, - 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x0150, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004E, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x00AE, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x0170, 0x01B1, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x006E, 0x01D1, 0x010F, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004E, 0x0212, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006E, 0x01F1, 0x008E, 0x006D, 0x006E, 0x004D, 0x004D, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x010F, 0x01F1, 0x006D, 0x006D, 0x004D, 0x006E, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004E, 0x006D, 0x006D, 0x004D, 0x40CF, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70F0, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x004D, 0x004D, 0x006D, 0x0191, 0x01B1, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp b/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp deleted file mode 100644 index b90228af03..0000000000 --- a/Marlin/src/lcd/tft/images/bootscreen_480x320x16.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint16_t marlin_logo_480x320x16[153600] = { - 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x10AE, 0x00F8, 0x00F9, 0x00D6, 0x18AD, 0x188C, 0x188C, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188D, 0x188D, 0x188D, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AC, 0x18AC, 0x188D, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188D, 0x18AC, 0x18AC, 0x00F9, 0x00F9, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x18AB, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, - 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x10AE, 0x00F7, 0x00F9, 0x00F6, 0x188D, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x188D, 0x18AC, 0x18AC, 0x188D, 0x188D, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x00F9, 0x00F9, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, - 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x10AF, 0x00F8, 0x00F8, 0x00F7, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188D, 0x18AC, 0x18AD, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x00F9, 0x00F9, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, - 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x10AF, 0x00F7, 0x00F8, 0x00F6, 0x18AD, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, - 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x10AF, 0x00F8, 0x00F9, 0x00D6, 0x18AD, 0x18AD, 0x188C, 0x18AC, 0x18AD, 0x18AC, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208D, 0x18AD, 0x18AD, 0x208D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, - 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x188D, 0x18AC, 0x18AD, 0x18AF, 0x00F8, 0x00F9, 0x00F6, 0x18AE, 0x188D, 0x18AC, 0x188D, 0x18AC, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x10D3, 0x10D3, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, - 0x188B, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x188C, 0x18AC, 0x188D, 0x10AF, 0x00F8, 0x0119, 0x00D7, 0x18AE, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, - 0x188B, 0x188C, 0x188C, 0x188C, 0x188B, 0x188B, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, - 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x188C, - 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x00F9, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AF, 0x011A, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x08B2, 0x08D2, - 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F9, 0x0119, 0x00F8, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08F6, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08D3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x00F8, 0x00F8, - 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18B0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0117, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x00F9, 0x00F9, - 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x011A, 0x0119, 0x00F6, 0x10F2, 0x10D1, 0x10D0, 0x10D1, 0x10D3, 0x08F6, 0x00F9, 0x00F9, 0x0119, 0x10D2, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x00F8, 0x00F8, - 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18D0, 0x0118, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x00F9, 0x00F9, - 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18CD, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x00F9, 0x00F8, - 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08D5, 0x011A, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x011A, 0x10D2, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188D, 0x00F9, 0x00F8, - 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0118, 0x10D1, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x188C, 0x00F9, 0x00F9, - 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x00F9, 0x0119, 0x011A, 0x0119, 0x08F4, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18CD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x18AC, 0x188C, 0x00F9, 0x00F9, - 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0118, 0x0119, 0x0119, 0x0118, 0x10D1, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F3, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F3, 0x011A, 0x0119, 0x08F3, 0x10D1, 0x00F7, 0x0119, 0x00F9, 0x18AF, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F7, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F3, 0x10D0, 0x10F4, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x0117, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x00F9, 0x00F9, - 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x188C, 0x188C, 0x188C, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x08F5, 0x0139, 0x00FA, 0x011A, 0x0119, 0x08F5, 0x18AF, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x011A, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x08F4, 0x20AD, 0x18AE, 0x18AE, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08D4, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x00F7, 0x011A, 0x10D3, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x00F9, 0x00F9, - 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x188C, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0118, 0x18CF, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x0118, 0x0119, 0x08F7, 0x10D1, 0x10D1, 0x00F7, 0x0119, 0x0118, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x00F6, 0x011A, 0x08F3, 0x18AE, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08D4, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x00F7, 0x011A, 0x10D3, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x011A, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x00F9, - 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D1, 0x18CD, 0x18AD, 0x10D1, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08F4, 0x011A, 0x011A, 0x10F1, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D0, 0x18AE, 0x08D5, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F7, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F3, 0x10D0, 0x10F4, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x0117, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x10F2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, - 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x10B1, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AE, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, - 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x0118, 0x0119, 0x00F7, 0x10D1, 0x10D1, 0x00F7, 0x0119, 0x00F8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F8, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, - 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10F1, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10F1, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08D5, 0x011A, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, - 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x10D1, 0x00F8, 0x0119, 0x0119, 0x00F8, 0x10D1, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x18CD, 0x18AD, 0x20AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0118, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D3, 0x10D3, - 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18CD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x0119, 0x10D1, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x011A, 0x0119, 0x00F6, 0x10F2, 0x10D1, 0x10D0, 0x10D1, 0x10D3, 0x08F6, 0x011A, 0x0119, 0x0119, 0x10D2, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10CF, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x0119, 0x011A, 0x08F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x013A, 0x00F8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18B0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CF, 0x0119, 0x00F9, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08F5, 0x10D1, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x00F9, 0x011A, 0x10D2, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x10D0, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x08D5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10F3, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x011A, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D0, 0x10D3, 0x08F4, 0x08F3, 0x08F3, 0x10F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x10D3, 0x10D3, 0x08F3, 0x08F3, 0x08D4, 0x10D3, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CF, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x011A, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18CD, 0x10F3, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, - 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D1, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x00F9, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18CD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AE, 0x18AE, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x08F4, - 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F7, 0x18AE, 0x18CD, 0x18AF, 0x0119, 0x011A, 0x00F9, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, - 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0118, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x00F9, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, - 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x011A, 0x10D0, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x011A, 0x10D2, - 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F9, 0x00F9, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x00F9, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x08D3, 0x18AD, 0x18AD, 0x08D3, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D3, 0x18AD, - 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x10B0, 0x0119, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0139, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x20CE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0139, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, - 0x18AE, 0x18AD, 0x18AD, 0x08D5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0116, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x10D1, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, - 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00FA, 0x18D1, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x10F3, 0x08D3, 0x10D2, 0x0117, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x08F5, 0x18CE, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0116, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AF, 0x00F8, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x011A, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08D5, 0x0119, 0x00F9, 0x18AD, 0x18AE, 0x208D, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x00F7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AF, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18CD, 0x20AD, 0x18AE, 0x18AE, 0x00F7, - 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x08F6, 0x0119, 0x0119, 0x011A, 0x0119, 0x0116, 0x18CF, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CF, 0x00F9, 0x011A, 0x08F5, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x011A, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18D0, 0x0118, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x00F8, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F9, - 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x18CF, - 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x18D0, 0x18AD, - 0x011A, 0x0119, 0x08F5, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x20AE, - 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00FA, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, - 0x08F7, 0x00F9, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x08F3, 0x08F3, 0x10F3, 0x08F3, 0x10D3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x08F3, 0x10F2, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x08F3, 0x0119, 0x0119, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x310E, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x10F2, 0x0119, 0x0119, 0x10D2, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00FA, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18D0, - 0x18AE, 0x0117, 0x00F9, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x28EE, 0x8252, 0xCB54, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, - 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x394F, 0xB313, 0xD395, 0x7211, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18CD, 0x18CD, 0x20AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18CD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x496F, 0xCB55, 0xD395, 0xBB54, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x011A, 0x00F7, - 0x188D, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x208D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00FA, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x61D0, 0xD395, 0xD395, 0xD395, 0x69F1, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20CD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18D0, 0x00F9, 0x011A, 0x00F7, 0x18AE, - 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x61D0, 0xD395, 0xD395, 0xD396, 0xD375, 0x310E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x011A, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, - 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x392F, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, - 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10F2, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x8252, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, - 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x08F7, 0x00F9, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x5190, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18EE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F9, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10F2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x08D5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x8252, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x412F, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x10F3, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0118, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0355, 0x190F, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F4, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0x496F, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x011A, 0x0117, 0x0117, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18B0, 0x0119, 0x00F9, 0x0119, 0x011A, 0x10D1, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x11D1, 0x03B7, 0x0A93, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x28EE, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9AB3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x00F9, 0x00F9, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x10AF, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x10D0, 0x0118, 0x011A, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x10F2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x208D, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0356, 0x03B7, 0x03B7, 0x190F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x7A31, 0xD395, 0xD395, 0xD375, 0xDB95, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F4, 0x10D2, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18CD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x0117, 0x00FA, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x11D1, 0x03B8, 0x03B7, 0x03B8, 0x0A94, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x00F9, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x00F9, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x08F5, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0xD395, 0xD395, 0xB313, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x011A, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18CD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0356, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x190E, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0xA2D3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xA2D3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x11D1, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0A94, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAAD3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0356, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x190F, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x61D0, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0397, 0x03B8, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x59D0, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x011A, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AE, 0x00F7, 0x011A, 0x011A, 0x011A, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x10D1, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAAD3, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x10D2, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x011A, 0x10D2, 0x18CD, 0x18AE, 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x08F5, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x61B1, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x8A92, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x188D, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x03B8, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0xAAD3, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0x310E, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x10D1, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03D7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B8, 0x0397, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x496F, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0x7231, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x10D3, 0x08D3, 0x10D2, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x10D2, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x20AE, 0x8A92, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x7A31, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x28EE, 0xC374, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xA2D3, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CE, 0x194F, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B8, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x61D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0x69F1, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x011A, 0x011A, 0x00F9, 0x08F7, 0x18CE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x10CF, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1930, 0x02F5, 0x03B7, 0x03B8, 0x0356, 0x114F, 0x18AD, 0x18AD, 0x18AD, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x03B7, 0x03B8, 0x03B7, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x0119, 0x08F4, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x9AB3, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0x412F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x0A32, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0356, 0x18AD, 0x18AD, 0x0A32, 0x03B7, 0x03B8, 0x03B8, 0x03B8, 0x0376, 0x18EE, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x00F9, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x190F, 0x0377, 0x0397, 0x03B8, 0x0398, 0x0397, 0x0B77, 0x18CE, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B8, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x03B7, 0x0BB7, 0x0398, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0xC355, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x4970, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18EE, 0x0377, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0A33, 0x190E, 0x0397, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x11D1, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x11B0, 0x0A93, 0x0356, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x1253, 0x0B78, 0x0B98, 0x0B78, 0x0B98, 0x0B98, 0x1378, 0x11F2, 0x18AD, 0x18AD, 0x0B98, 0x0B78, 0x0B78, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0B98, 0x1378, 0x0B78, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x4970, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0x8252, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x11D1, 0x03B8, 0x03B7, 0x03B7, 0x03B8, 0x0377, 0x0AD4, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x02F5, 0x18AE, 0x18AD, 0x03B7, 0x03B8, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x192F, 0x03B7, 0x03B7, 0x03B8, 0x03B8, 0x03B7, 0x03B7, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x1AB5, 0x1B78, 0x1B58, 0x1358, 0x1B78, 0x1378, 0x1358, 0x1A13, 0x18AE, 0x18AE, 0x1358, 0x1358, 0x1378, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x1358, 0x1358, 0x1358, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x7A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD395, 0xC354, 0x5990, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0356, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x194F, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F8, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10CF, 0x0119, 0x011A, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F9, 0x0119, 0x00F9, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1A54, 0x1B38, 0x1B38, 0x2338, 0x1B38, 0x1B58, 0x2338, 0x21D2, 0x18AD, 0x18AD, 0x2338, 0x2338, 0x2358, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x1930, 0x2339, 0x2358, 0x2338, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0xA2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0x4970, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x011A, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x1170, 0x03B8, 0x03B8, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x0A53, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x0396, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x2150, 0x2B18, 0x2B39, 0x2B18, 0x2B19, 0x2B19, 0x2AF8, 0x18CE, 0x18AD, 0x18AD, 0x2B19, 0x2B18, 0x2B19, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x2192, 0x2B19, 0x2B19, 0x2B18, 0x2338, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0xBB34, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x4970, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0AF5, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0377, 0x18EE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B8, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x11B0, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x0117, 0x011A, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x10CF, 0x0118, 0x0119, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x2192, 0x2B19, 0x3319, 0x32F9, 0x2A15, 0x18EF, 0x20AD, 0x18AD, 0x18AD, 0x32F9, 0x3319, 0x32F9, 0x18AD, 0x18AD, 0x18AD, 0x2191, 0x3319, 0x2AF9, 0x3319, 0x2AF9, 0x2A97, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x20CF, 0x28CF, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x71D1, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20CD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x190F, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x11D1, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x03B7, 0x0397, 0x03B7, 0x03B7, 0x03B7, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x18D0, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x3AD9, 0x3AD9, 0x3AD9, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x3AF9, 0x3AD9, 0x3AD9, 0x18AD, 0x20AD, 0x3215, 0x3AD9, 0x3AF9, 0x3ADA, 0x3AD9, 0x3277, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x20CD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x4950, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD374, 0xD375, 0xD355, 0xD355, 0xAAB3, 0x20CE, 0x18CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0398, 0x0398, 0x0398, 0x0398, 0x03B7, 0x0397, 0x0397, 0x03B7, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0AD5, 0x0397, 0x0398, 0x03B8, 0x0398, 0x03B8, 0x18EE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0398, 0x0398, 0x03B8, 0x0398, 0x0398, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0398, 0x0398, 0x0398, 0x0398, 0x0398, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0139, 0x011A, 0x0117, 0x00F7, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x42D9, 0x42B9, 0x42B9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x42B9, 0x42B9, 0x42BA, 0x18AE, 0x31F5, 0x42DA, 0x42D9, 0x42B9, 0x42D9, 0x3A77, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x5991, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD374, 0xD375, 0xD355, 0xD355, 0xD355, 0x9252, 0x30EF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x2338, 0x2338, 0x2318, 0x2319, 0x2338, 0x2338, 0x2338, 0x2338, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x2150, 0x2318, 0x2338, 0x2338, 0x2318, 0x2318, 0x2338, 0x21F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x2339, 0x2318, 0x2318, 0x2339, 0x2338, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x2338, 0x2338, 0x2338, 0x2338, 0x2338, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x00F7, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x10F3, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4A99, 0x4AB9, 0x4A9A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4ABA, 0x4ABA, 0x4A9A, 0x4257, 0x4A99, 0x4A9A, 0x4A9A, 0x4ABA, 0x4237, 0x20CE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x0119, 0x0119, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x69F1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xCB14, 0x4130, 0x20AF, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x42B9, 0x4A99, 0x42B9, 0x42BA, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4257, 0x4ABA, 0x4A9A, 0x4A99, 0x42B9, 0x4A9A, 0x42B9, 0x4A9A, 0x20EF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4A9A, 0x42B9, 0x42B9, 0x4ABA, 0x4AB9, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4A99, 0x42B9, 0x4ABA, 0x4A99, 0x4A99, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x011A, 0x00F9, 0x10D0, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x527A, 0x527A, 0x527A, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x527A, 0x527A, 0x529A, 0x527A, 0x527A, 0x527A, 0x527A, 0x4A18, 0x20CE, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D1, 0x0117, 0x0119, 0x0119, 0x0917, 0x18D2, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x8253, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xD355, 0x7A11, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x6A3B, 0x6A3B, 0x6A3B, 0x621A, 0x6A3B, 0x6A3B, 0x6A1B, 0x6A3B, 0x6A3B, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x3932, 0x6A3B, 0x6A3B, 0x6A1B, 0x6A3B, 0x6A3B, 0x6A3B, 0x6A3B, 0x6A3B, 0x59D7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x6A3B, 0x6A3B, 0x6A3B, 0x6A3B, 0x6A3B, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x6A1B, 0x6A3B, 0x6A3B, 0x6A1B, 0x6A3B, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x10F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x011A, 0x00F7, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AE, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x20AE, 0x08F3, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x5A5B, 0x5A5A, 0x5A7A, 0x2910, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x5A5A, 0x5A7B, 0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A, 0x4A18, 0x20CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x091A, 0x18F2, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x8232, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xA293, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x89BC, 0x89BC, 0x89BC, 0x91BC, 0x89BC, 0x899C, 0x89BC, 0x89BC, 0x89BB, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x899B, 0x89BC, 0x89BC, 0x89BC, 0x799A, 0x7179, 0x89BB, 0x899C, 0x89BC, 0x89BC, 0x38F1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x89BC, 0x899C, 0x899C, 0x89BC, 0x89BC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x89BC, 0x899C, 0x89BC, 0x899C, 0x89BC, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0117, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x623A, 0x623B, 0x625A, 0x621A, 0x2910, 0x18CD, 0x18AD, 0x18AD, 0x623B, 0x623A, 0x625A, 0x623B, 0x623B, 0x51F8, 0x20CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0119, 0x0917, 0x18D2, 0x18D2, 0x0918, 0x091A, 0x0918, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30D0, 0x30F0, 0x30F0, 0x8252, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD335, 0x9253, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA93D, 0xA93D, 0xA93D, 0xB13D, 0xA93D, 0xA93D, 0xA93D, 0xB13D, 0xB11D, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x60F5, 0xA93D, 0xA93D, 0xB13D, 0xA93D, 0x60F5, 0x40D1, 0xB11D, 0xB13D, 0xA93D, 0xA93D, 0x991B, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA93D, 0xA93D, 0xA93D, 0xA93D, 0xA93D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA93D, 0xA93D, 0xA93D, 0xB13D, 0xA93D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x00F7, 0x00F7, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0117, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x59D8, 0x6A1B, 0x6A1B, 0x6A1B, 0x6A1B, 0x4133, 0x18AD, 0x18AD, 0x6A3B, 0x6A1B, 0x6A1B, 0x6A1B, 0x51B6, 0x20CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x00F9, 0x10D3, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18D1, 0x20CE, 0x20CE, 0x18D1, 0x093A, 0x093A, 0x28EF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x9273, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD334, 0xD335, 0xD334, 0xD334, 0xD314, 0xD315, 0xAA93, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD09E, 0xD0BE, 0xD0BE, 0x18AD, 0x18AD, 0x18AD, 0x30B0, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0x20AE, 0x18AD, 0xB8BC, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0x68B5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0xD0BE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0118, 0x011A, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20CE, 0x61B8, 0x721B, 0x71FB, 0x721B, 0x721B, 0x4133, 0x20AD, 0x71FB, 0x721B, 0x71FB, 0x4174, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0119, 0x011A, 0x18D1, 0x20AE, 0x20CE, 0x20F1, 0x093A, 0x093A, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0xAAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AE, 0x20AD, 0x20AD, 0x20AE, 0x30EE, 0x6150, 0x81B1, 0xA1F2, 0xC233, 0xCA53, 0xCA54, 0xCA53, 0xC233, 0xA1F2, 0x8191, 0x512F, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0x18AD, 0x20AD, 0x18AD, 0xB079, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xA058, 0x18AD, 0x18AD, 0x7095, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xE83E, 0x28AE, 0x20AD, 0x18AD, 0x18AD, 0xF03F, 0xF01F, 0xF03F, 0xF03F, 0xF03F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F9, 0x0119, 0x18D0, 0x18AD, 0x18AE, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x00F9, 0x0119, 0x0119, 0x10D0, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x20CE, 0x69B9, 0x81FB, 0x79DB, 0x79DC, 0x81FC, 0x5976, 0x79DB, 0x79DC, 0x81DC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x0918, 0x0119, 0x0917, 0x18D0, 0x20D0, 0x0917, 0x093A, 0x1138, 0x28CF, 0x30CF, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x3911, 0xAAD4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD315, 0xD315, 0xD314, 0x69B2, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x410F, 0x6990, 0x99F2, 0xC253, 0xCA74, 0xD274, 0xCA74, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xD253, 0xCA53, 0xD233, 0xCA33, 0xC213, 0x8991, 0x410F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x00F9, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0917, 0x0119, 0x0119, 0x10CF, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AE, 0x7199, 0x89DB, 0x89BC, 0x81BC, 0x89BC, 0x89BC, 0x89BC, 0x89BC, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D2, 0x0119, 0x0119, 0x093A, 0x093A, 0x093A, 0x093A, 0x20F2, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x3111, 0x3911, 0x3911, 0xB2F5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD314, 0xD314, 0xD2F4, 0xD2F5, 0xCAD4, 0x5971, 0x30F0, 0x30D0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x38EF, 0x79B1, 0xBA53, 0xCA94, 0xCA94, 0xCA74, 0xD273, 0xD273, 0xCA73, 0xCA54, 0xCA53, 0xCA54, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xCA13, 0xCA13, 0xA1B2, 0x490F, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CE, 0x7979, 0x919C, 0x919C, 0x91BC, 0x919C, 0x899C, 0x89BC, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x18F2, 0x0919, 0x091A, 0x091A, 0x0919, 0x20F3, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x4112, 0xB2F5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD314, 0xD2F5, 0xD2F4, 0xD2F4, 0x4930, 0x30F0, 0x30EF, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x4130, 0x89F1, 0xD294, 0xD294, 0xCA93, 0xCA74, 0xD274, 0xCA74, 0xCA74, 0xCA53, 0xCA73, 0xD253, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xC274, 0x9B36, 0x83B8, 0x6419, 0x6C39, 0x6439, 0x6C1A, 0x8B57, 0xB295, 0xCA13, 0x9191, 0x28CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CF, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x28AE, 0x8159, 0x917C, 0x997C, 0x997C, 0x999C, 0x999C, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x00F9, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20D0, 0x20D1, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x4111, 0x4112, 0x4112, 0x9294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD314, 0xD2F4, 0xD2F4, 0xD315, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2D5, 0x79D2, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x30D0, 0x28EF, 0x28F0, 0x28CF, 0x5150, 0xAA32, 0xD293, 0xD294, 0xD294, 0xCA93, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0xD274, 0xD254, 0xCA53, 0xCA54, 0xB2D5, 0x83B8, 0x44FC, 0x1DBE, 0x063F, 0x0CDB, 0x0B76, 0x1377, 0x1377, 0x0B76, 0x1356, 0x0B76, 0x0B77, 0x23F8, 0x6991, 0x510F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x8939, 0xA17C, 0xA17C, 0xA15D, 0xA15D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x8A54, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2D4, 0xCAD4, 0x5951, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x4130, 0x91F2, 0xD294, 0xD294, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA74, 0xD274, 0xD274, 0xD274, 0xD253, 0xB2D5, 0x7419, 0x257D, 0x063F, 0x061F, 0x057D, 0x12B5, 0x190F, 0x18CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CE, 0x913A, 0xA93D, 0xA95D, 0xA95C, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x9255, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xCAB4, 0x5172, 0x3911, 0x38F1, 0x38F0, 0x30F0, 0x81D2, 0xC294, 0xD294, 0xD293, 0xD294, 0xD294, 0xCA93, 0xCA93, 0xD274, 0xD274, 0xCA73, 0xD274, 0x83D8, 0x353D, 0x061F, 0x063F, 0x063F, 0x063F, 0x4C5A, 0x4970, 0x20AE, 0x20AE, 0x20AD, 0x18CD, 0x20AD, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x10D2, 0x08F3, 0x08D4, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xB11D, 0xB11D, 0xB11D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x08D5, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x6B36, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D5, 0xD2D4, 0xCAD4, 0xCAB4, 0x5972, 0x3911, 0x5151, 0xB253, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xD274, 0xC294, 0x645A, 0x1DBE, 0x063F, 0x063F, 0x063F, 0x1DBE, 0x6459, 0xC274, 0x99D2, 0x28CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18CE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0xB8FE, 0xB8FD, 0xB8FE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x4933, 0x4953, 0x253B, 0x465C, 0x6D7B, 0x6D9A, 0x6D9A, 0x6D7A, 0x84F9, 0x9C78, 0x9C77, 0x9C78, 0x9C78, 0x9C57, 0x9C78, 0x9C58, 0x9C58, 0xBBB6, 0xD334, 0xD315, 0xD334, 0xD315, 0xD314, 0xD315, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2D4, 0x91F3, 0x5972, 0xCA74, 0xD2B4, 0xD2B4, 0xD294, 0xCA94, 0xD294, 0xD294, 0xCA94, 0xCA74, 0xC2B4, 0x6C5A, 0x0DFF, 0x063F, 0x063F, 0x063F, 0x353D, 0x83B8, 0xCA53, 0xCA33, 0x89B1, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x011A, 0x0119, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x00F9, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x18D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0xC0DE, 0xC0FE, 0xC0DD, 0x18AE, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x00FA, 0x08F4, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x38F1, 0x3911, 0x4112, 0x4132, 0x4932, 0x4953, 0x5153, 0x4D1A, 0x6D9A, 0x94B9, 0x9C98, 0x9C77, 0x9C78, 0x9C78, 0x9C78, 0x94B8, 0x6D7A, 0x6D7A, 0x6D7B, 0x367C, 0x367D, 0x1EFE, 0x077F, 0x075F, 0x1EDE, 0x363D, 0x6D3A, 0x9C17, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2B4, 0xCAD4, 0xD2B3, 0xCAB4, 0xC294, 0xCAB4, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0x7BD8, 0x0DFF, 0x063F, 0x061F, 0x063F, 0x4CBB, 0x9B57, 0xD233, 0xCA33, 0xCA53, 0x6150, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x08F3, 0x08F3, 0x08F3, 0x10D2, 0x20AE, 0x10D2, 0x10D3, 0x08F3, 0x08F3, 0x18D0, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x08F3, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x08F3, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x08F3, 0x18D0, 0x18AE, 0x10D2, 0x08F3, 0x08F3, 0x08F3, 0x10D1, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x08F3, 0x10D1, 0x18AD, 0x10D2, 0x08F3, 0x10F3, 0x08F3, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0917, 0x0119, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC8BE, 0xC8DE, 0xC8BE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x4933, 0x5153, 0xA2B5, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD334, 0xD335, 0xD335, 0xD335, 0xD335, 0xBB96, 0xA437, 0x74F9, 0x4DBC, 0x2E7E, 0x0EDF, 0x559B, 0x8498, 0xC335, 0xD2F4, 0xD2D4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2B5, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xBAB4, 0xBAF6, 0xCA94, 0xD294, 0xCA94, 0xD273, 0x9B76, 0x1DBE, 0x061F, 0x063F, 0x0DDF, 0x643A, 0xB2D5, 0xCA54, 0xD253, 0xCA53, 0xC294, 0x59B1, 0x28CE, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x0116, 0x00F9, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D3, 0x011A, 0x0119, 0x00F9, 0x00F6, 0x18AD, 0x08F6, 0x011A, 0x011A, 0x0119, 0x10D3, 0x18CD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x0119, 0x08F7, 0x18AE, 0x00F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18CD, 0x00F7, 0x011A, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x10D2, 0x08F3, 0x08F3, 0x10D1, 0x18CE, 0x00F7, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x40B0, 0xA09A, 0xD0BE, 0xD09E, 0xD0BE, 0xB89C, 0x78B5, 0x28AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4112, 0x4932, 0x4933, 0x5173, 0xBB15, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD335, 0xD315, 0xD314, 0xD315, 0xD2F5, 0xD2F5, 0xD2F4, 0x9BF7, 0x6D1A, 0x2E3D, 0x45BC, 0x9418, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xC2D4, 0x4CDB, 0x7BD8, 0x9B57, 0x44FC, 0x063F, 0x063F, 0x1DBE, 0x83D8, 0xC294, 0xCA53, 0xCA54, 0xCA33, 0xCA53, 0xB2B5, 0x33B8, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x188E, 0x20CD, 0x10D1, 0x0119, 0x011A, 0x10D1, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x011A, 0x0119, 0x00F6, 0x18AD, 0x08F6, 0x011A, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x00F7, 0x0119, 0x0139, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x011A, 0x0139, 0x0119, 0x08F7, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x08F7, 0x011A, 0x0119, 0x011A, 0x10D3, 0x20AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x08F6, 0x011A, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x08F7, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AE, 0x18AE, 0x18CF, 0x00F8, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F9, 0x10D0, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x40B0, 0xD07D, 0xD87E, 0xD89F, 0xD89F, 0xE07F, 0xD89E, 0xD89F, 0xB87B, 0x28AE, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4933, 0x5174, 0xBB14, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD314, 0xD335, 0xD315, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xC335, 0x8478, 0x4D7B, 0x4D5B, 0xAB96, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCA94, 0xCAB4, 0xD294, 0xD294, 0xD273, 0xC2B4, 0x5C9A, 0x061F, 0x061F, 0x063F, 0x7419, 0xD273, 0xD273, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xAAF6, 0x153C, 0x2951, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D3, 0x011A, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x08F3, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x08F6, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x011A, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0118, 0x10CF, 0x20AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x10B0, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x208D, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB07A, 0xE85F, 0xE85F, 0xE07F, 0xE85F, 0xE87F, 0xE07F, 0xE85F, 0xE07F, 0x9898, 0x20AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x5153, 0xBB15, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD354, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD315, 0xCB34, 0xD315, 0xD314, 0xD314, 0xD315, 0xD314, 0xD2F4, 0xD2F5, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D5, 0xD2D4, 0xD2D4, 0xBB55, 0x7499, 0x35DC, 0x8439, 0xC2F4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xCA93, 0xD294, 0xD274, 0xCA74, 0x9B76, 0x061F, 0x061F, 0x83D8, 0xC295, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0x7BB8, 0x063F, 0x2A34, 0x30F0, 0x30F0, 0x30EF, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x08F7, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x0119, 0x00F6, 0x18AD, 0x00F6, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x00F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x011A, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0118, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x38B0, 0xF05F, 0xE83F, 0xF03F, 0xF05F, 0xF05F, 0xF03F, 0xF03F, 0xF03F, 0xF05F, 0xE83F, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4933, 0x5173, 0xBB35, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xCB35, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xCAD4, 0xD2F4, 0xCAD4, 0xD2D4, 0xD2D4, 0xCAB4, 0xD2B4, 0xCAB4, 0xCAB4, 0x8BF8, 0x3D5C, 0x6499, 0xC2D4, 0xD294, 0xD294, 0xCA74, 0xCA74, 0xD274, 0xCA74, 0xCA74, 0x54BB, 0x5C9A, 0x353D, 0x1DBE, 0x4CBB, 0x9377, 0x9B36, 0x44FC, 0x061F, 0x1BF9, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AD, 0x08F7, 0x0119, 0x011A, 0x011A, 0x10D3, 0x18AD, 0x08F6, 0x0119, 0x00F9, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F9, 0x0119, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AE, 0x00F6, 0x0119, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x10D3, 0x0119, 0x011A, 0x011A, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x20AD, 0x08F6, 0x011A, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D0, 0x011A, 0x011A, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x00F9, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F4, 0x10F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x5092, 0xF83F, 0xF83F, 0xF03F, 0xF83F, 0xF83F, 0xF83F, 0xF83F, 0xF81F, 0xF03F, 0xF83F, 0x5092, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4932, 0x69B3, 0xC355, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD335, 0xD335, 0xD314, 0xD314, 0xD314, 0xD2F5, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0x9B97, 0x453C, 0x6C59, 0xC2B4, 0xCA74, 0xD274, 0xD273, 0xCA73, 0xD273, 0xC294, 0x6C39, 0xC294, 0xCA53, 0x8B98, 0x4CBB, 0x0DFF, 0x063F, 0x0D7E, 0x3972, 0x3911, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x011A, 0x00F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x00F6, 0x011A, 0x0119, 0x0119, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D3, 0x0119, 0x0119, 0x011A, 0x08F6, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x00F6, 0x0119, 0x00F9, 0x011A, 0x08F3, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AD, 0x00F6, 0x00F9, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x00F6, 0x0119, 0x011A, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x5092, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x5092, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4933, 0x9254, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA94, 0x9B77, 0x44DC, 0x73F9, 0xCA73, 0xCA74, 0xD254, 0xCA73, 0xCA53, 0xC294, 0x351C, 0x6C3A, 0xC294, 0xD253, 0xCA34, 0x83B8, 0x5A55, 0x4132, 0x4132, 0x3912, 0x3911, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x00FA, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AE, 0x08F6, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x08F3, 0x0119, 0x0119, 0x011A, 0x08F7, 0x18AD, 0x0116, 0x011A, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x08F6, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x011A, 0x0119, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x00F9, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18B0, 0x0119, 0x011A, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4090, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x28AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x69D3, 0xC355, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xCB55, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAD4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA94, 0xD274, 0xCA74, 0x8B78, 0x447C, 0xA316, 0xD253, 0xD253, 0xCA54, 0xCA53, 0xC294, 0x257D, 0x0DDF, 0x83B8, 0xD233, 0xCA33, 0xCA33, 0xBA13, 0x7993, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x30D0, 0x30D0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x00F9, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x08F6, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x0116, 0x20AD, 0x08F6, 0x011A, 0x00F9, 0x0119, 0x10F3, 0x18AD, 0x0116, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x10D4, 0x011A, 0x011A, 0x0119, 0x08F6, 0x20AD, 0x00F6, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x08F7, 0x0119, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F7, 0x011A, 0x011A, 0x0119, 0x0119, 0x08F4, 0x20CD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x00F9, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x011A, 0x0119, 0x011A, 0x00F9, 0x0119, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0xD03C, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xD03C, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x5193, 0xAAD4, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD294, 0xD2B4, 0xCA94, 0xCA94, 0xD294, 0xCA74, 0xCA73, 0xCA74, 0xD274, 0xC295, 0x6BB9, 0x6B99, 0xCA54, 0xCA53, 0xD254, 0xCA33, 0xC294, 0x24FD, 0x063F, 0x351D, 0xB295, 0xCA13, 0xCA13, 0xCA13, 0xB9F3, 0x7992, 0x4111, 0x4112, 0x38F1, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CF, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x00F9, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x00F6, 0x011A, 0x0119, 0x011A, 0x10D3, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x0119, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D3, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AD, 0x00F7, 0x0119, 0x0119, 0x011A, 0x08F3, 0x18AE, 0x00F6, 0x011A, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x011A, 0x08F6, 0x18AD, 0x08F6, 0x011A, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x08F6, 0x011A, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x10D2, 0x10F3, 0x08F3, 0x10D1, 0x18AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x0118, 0x00F9, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00FA, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x4090, 0xF03F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x6073, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20CD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3912, 0x4112, 0x4112, 0x8233, 0xCB55, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD314, 0xD335, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD294, 0xD294, 0xD294, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xCA73, 0xCA53, 0xCA53, 0xCA74, 0xAAB6, 0x5B7A, 0xBA74, 0xCA53, 0xCA33, 0xCA33, 0xC254, 0x4BFB, 0x059F, 0x0D7F, 0x8B57, 0xC9F3, 0xCA13, 0xC9F3, 0xC9F3, 0xA9B3, 0x5952, 0x4112, 0x3931, 0x3911, 0x3111, 0x3110, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x10D3, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x08F3, 0x18D1, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D3, 0x10B0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10B0, 0x10D3, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D3, 0x10D0, 0x18AD, 0x10D2, 0x08F3, 0x10D3, 0x08F3, 0x10D0, 0x18AD, 0x10D0, 0x08F3, 0x08F3, 0x10D3, 0x10D2, 0x18AD, 0x10D2, 0x10D4, 0x08F3, 0x08F3, 0x18D1, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D3, 0x18D1, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0118, 0x10CF, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4091, 0xE01D, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0xF81F, 0x7074, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x08F3, 0x10D2, 0x20CD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x10D1, 0x0119, 0x0119, 0x10D2, 0x20AD, 0x18AD, 0x20AE, 0x18CD, 0x20AE, 0x20CD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4953, 0xB2F4, 0xD395, 0xDB95, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD334, 0x84F9, 0x467D, 0x1F5E, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x079F, 0x1F1E, 0x367D, 0x367C, 0x4DDB, 0x653A, 0x8498, 0x9BF7, 0xC2F5, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA73, 0xD253, 0xD254, 0xCA74, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0x72D9, 0xAA76, 0xCA33, 0xD233, 0xCA13, 0xCA33, 0x1C7E, 0x059F, 0x05FF, 0x5C7A, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0x9193, 0x4911, 0x3911, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208D, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AD, 0x18CD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10B0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x7074, 0x9077, 0x8856, 0x8876, 0x388F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18CD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x3111, 0x38F1, 0x3911, 0x4111, 0x4132, 0x6193, 0xC355, 0xD396, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xB3D6, 0x271D, 0x07FF, 0x07FF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x079F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x075F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x077F, 0x079F, 0x079F, 0x1EFE, 0x461C, 0x6D1A, 0x9BD6, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xD274, 0xCA74, 0xCA53, 0xD254, 0xCA54, 0xD253, 0xCA53, 0xCA33, 0xA275, 0x9A76, 0xCA33, 0xCA13, 0xCA33, 0x9AD6, 0x04FF, 0x05BF, 0x063F, 0x357C, 0xC254, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x6152, 0x4111, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F8, 0x10D0, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F9, 0x08F5, 0x18AE, 0x20AD, 0x18AD, 0x08F4, 0x0119, 0x011A, 0x00F7, 0x0117, 0x0119, 0x011A, 0x08F5, 0x20AE, 0x20AE, 0x20AD, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3910, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x6193, 0xCB55, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xCB55, 0xD334, 0xCB55, 0xAC17, 0x0FBF, 0x07FF, 0x07FF, 0x07BF, 0x07BF, 0x077F, 0x075F, 0x075F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x073F, 0x075F, 0x075F, 0x077F, 0x077F, 0x079F, 0x07BF, 0x365C, 0x74B9, 0xB315, 0xCA73, 0xCA54, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xD233, 0xCA33, 0xB235, 0xAA16, 0xCA33, 0xCA13, 0xCA13, 0x7B37, 0x055F, 0x05FF, 0x067F, 0x25DD, 0xA2F5, 0xD1D3, 0xC9F3, 0xC9D3, 0xC9D2, 0xC9D3, 0x9193, 0x4932, 0x4111, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x0119, 0x00F9, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D3, 0x18CE, 0x20AD, 0x10F4, 0x011A, 0x0119, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4132, 0x4132, 0x61B3, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0x8CB8, 0x0FBF, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x06DF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06FF, 0x06FF, 0x06FF, 0x06FF, 0x071F, 0x071F, 0x071F, 0x073F, 0x073F, 0x073F, 0x073F, 0x075F, 0x075F, 0x071F, 0x2DFD, 0x7419, 0xB2B5, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xD233, 0xCA14, 0xA215, 0xCA13, 0xCA13, 0xC9F3, 0x8338, 0x05BF, 0x063F, 0x06BF, 0x0E9F, 0xAAD5, 0xC9D3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B2, 0xB1B2, 0x5931, 0x3911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18CF, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x20AE, 0x18D0, 0x0119, 0x0119, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3111, 0x38F1, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x6193, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD354, 0xD355, 0xD355, 0xC395, 0x5DFA, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06DF, 0x06BF, 0x06BF, 0x069F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x06BF, 0x06DF, 0x06DF, 0x06FF, 0x06FF, 0x06FF, 0x071F, 0x071F, 0x06FF, 0x06BF, 0x065F, 0x05BF, 0x443C, 0x8AF7, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA13, 0x99B6, 0xC9F3, 0xCA13, 0xC9F3, 0x4C3B, 0x061F, 0x069F, 0x06FF, 0x0EBE, 0xA2D5, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9B2, 0xC1B3, 0x7152, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30F0, 0x28F0, 0x30D0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x20AE, 0x20AD, 0x18CE, 0x0119, 0x0119, 0x10D3, 0x20CE, 0x20AE, 0x10F4, 0x0119, 0x011A, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x3912, 0x4112, 0x4132, 0x4133, 0x5153, 0xBB35, 0xD395, 0xD396, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xBBD6, 0x5DFB, 0x0FBF, 0x07FF, 0x07DF, 0x07BF, 0x077F, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06DF, 0x06BF, 0x069F, 0x069F, 0x067F, 0x067F, 0x067F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x065F, 0x067F, 0x065F, 0x065F, 0x067F, 0x067F, 0x069F, 0x069F, 0x069F, 0x06BF, 0x06BF, 0x06DF, 0x06BF, 0x069F, 0x065F, 0x05FF, 0x053F, 0x049F, 0x1BBE, 0x8298, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xD1F3, 0x99B6, 0xC9F3, 0xC9F3, 0xB254, 0x0D9F, 0x067F, 0x06DF, 0x06FF, 0x0EBF, 0xA2D5, 0xC9D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B3, 0x8152, 0x3911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x20AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0918, 0x0917, 0x0139, 0x011A, 0x10F5, 0x20CE, 0x20CF, 0x28CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4132, 0x4932, 0x4133, 0x4933, 0xBB35, 0xD395, 0xD396, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xAC37, 0x6D9A, 0x2EFE, 0x07FF, 0x07FF, 0x07DF, 0x07BF, 0x079F, 0x075F, 0x073F, 0x071F, 0x06DF, 0x06BF, 0x069F, 0x067F, 0x065F, 0x065F, 0x063F, 0x063F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x05FF, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x063F, 0x063F, 0x063F, 0x065F, 0x065F, 0x065F, 0x065F, 0x067F, 0x067F, 0x063F, 0x05DF, 0x055F, 0x04BF, 0x043F, 0x037F, 0x1ABE, 0x7A18, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC1F4, 0x7178, 0xC9F2, 0xD1F3, 0x8338, 0x061F, 0x06BF, 0x06FF, 0x071F, 0x0EDF, 0xA2D5, 0xC9B3, 0xC9B3, 0xC9B2, 0xC992, 0xC992, 0xC993, 0x9172, 0x3911, 0x3910, 0x3110, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x20AD, 0x20AE, 0x20AE, 0x18CE, 0x0918, 0x011A, 0x011A, 0x0919, 0x011A, 0x0917, 0x20CF, 0x28AE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4932, 0x4933, 0x4933, 0x4953, 0xA2B4, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xC3B6, 0x8519, 0x4E3C, 0x0F9F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x06FF, 0x06BF, 0x069F, 0x067F, 0x065F, 0x063F, 0x061F, 0x061F, 0x05FF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05FF, 0x05FF, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x061F, 0x05DF, 0x057F, 0x04FF, 0x047F, 0x03DF, 0x031F, 0x025F, 0x19DE, 0x79B8, 0xC9F3, 0xCA13, 0xC9F3, 0xB9D3, 0xA1B5, 0xC9D3, 0xC9F3, 0x4C5B, 0x065F, 0x06DF, 0x071F, 0x071F, 0x0EDF, 0xA2B5, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC993, 0xC992, 0xB172, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x30EF, 0x28EF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x10F3, 0x10F3, 0x10D2, 0x20AE, 0x18AE, 0x20AE, 0x18CE, 0x20CE, 0x20CE, 0x20CE, 0x18F2, 0x10F4, 0x1114, 0x18F3, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3912, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x4953, 0xA2B5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xC3B5, 0x7D59, 0x36BD, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x071F, 0x06DE, 0x069E, 0x067E, 0x065E, 0x063F, 0x063F, 0x061E, 0x05FF, 0x05DF, 0x05BF, 0x05BF, 0x059F, 0x059F, 0x059F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x059F, 0x059F, 0x059F, 0x05BF, 0x05BF, 0x05BF, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x057F, 0x04FF, 0x049F, 0x03FF, 0x037F, 0x02BF, 0x021F, 0x017F, 0x213D, 0x9996, 0xC9F3, 0xC9F3, 0xB9D4, 0x99B6, 0xC9D3, 0xC213, 0x0DBF, 0x069F, 0x06FF, 0x071F, 0x073F, 0x0EFF, 0xA2B5, 0xC992, 0xC992, 0xC992, 0xC992, 0xC972, 0xC972, 0xA972, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AE, 0x18CE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AF, 0x20CE, 0x28CE, 0x28CF, 0x28EF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4131, 0x4112, 0x4132, 0x4913, 0x4933, 0x4933, 0x4953, 0x5154, 0xAAB5, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0x94D8, 0x467C, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x06DE, 0x06BE, 0x067E, 0x067E, 0x065E, 0x063E, 0x061E, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x059F, 0x057F, 0x057F, 0x055F, 0x055F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x053F, 0x055F, 0x055F, 0x055F, 0x057F, 0x057F, 0x057F, 0x057F, 0x057F, 0x055F, 0x04FF, 0x04BF, 0x041F, 0x039F, 0x031F, 0x025F, 0x01BF, 0x013F, 0x00BF, 0x40FB, 0xB1B5, 0xC9D2, 0xB1D5, 0xB1D4, 0xC9B3, 0x6399, 0x061F, 0x06DF, 0x071F, 0x073F, 0x073F, 0x0EFF, 0xA2B5, 0xC992, 0xC992, 0xC972, 0xC972, 0xC992, 0xC972, 0xB152, 0x4111, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CF, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30D0, 0x28F0, 0x3110, 0x30F0, 0x30F0, 0x30F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4953, 0x5153, 0x4A16, 0xA2B5, 0xD395, 0xD395, 0xD395, 0xD375, 0x8539, 0x1F5E, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x07BF, 0x075F, 0x06BE, 0x069D, 0x067D, 0x065D, 0x063D, 0x063D, 0x061D, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055F, 0x053F, 0x053F, 0x051F, 0x051F, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x04FF, 0x051F, 0x051F, 0x051F, 0x051F, 0x051F, 0x051F, 0x053F, 0x053F, 0x051F, 0x04DF, 0x04BF, 0x043F, 0x03DF, 0x035F, 0x02BF, 0x021F, 0x017F, 0x00FF, 0x009F, 0x087F, 0x7119, 0xC9D3, 0xB1D4, 0xB9D3, 0xC9B3, 0x1CFE, 0x065F, 0x06FF, 0x071F, 0x073F, 0x073F, 0x1EBE, 0xB9F3, 0xC993, 0xC972, 0xC992, 0xC972, 0xC973, 0xC952, 0xB152, 0x4111, 0x3910, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0139, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20CD, 0x20CE, 0x20AE, 0x20AE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x3911, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x4932, 0x4933, 0x4933, 0x4933, 0x4953, 0x4A15, 0x3439, 0x16BD, 0x8519, 0xD395, 0xD395, 0xD395, 0x94D8, 0x1F5E, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x071E, 0x069D, 0x069D, 0x067D, 0x065D, 0x063D, 0x063D, 0x061D, 0x05FD, 0x05DD, 0x05BD, 0x059D, 0x059E, 0x057E, 0x055E, 0x053E, 0x051E, 0x04FF, 0x04FF, 0x04DF, 0x04BF, 0x04BF, 0x04BF, 0x049F, 0x049F, 0x049F, 0x049F, 0x049F, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04BF, 0x04DF, 0x04BF, 0x04DF, 0x04DF, 0x04DF, 0x04BF, 0x049F, 0x043F, 0x03DF, 0x035F, 0x02FF, 0x025F, 0x01BF, 0x013F, 0x00DF, 0x007F, 0x005F, 0x185E, 0x8957, 0x61B9, 0xC9D3, 0x9A96, 0x059F, 0x067F, 0x06FF, 0x071F, 0x073F, 0x075F, 0x267D, 0xB9D3, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC952, 0xB152, 0x4111, 0x38F1, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18CF, 0x00F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x00F6, 0x18CE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x38F1, 0x38F1, 0x3911, 0x3911, 0x4111, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x4933, 0x4933, 0x69B4, 0x6336, 0x6CD9, 0x4E5B, 0x07DF, 0x8539, 0xD395, 0xD395, 0xBC17, 0x3E9C, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07DF, 0x06BD, 0x069C, 0x069C, 0x067C, 0x065C, 0x065C, 0x063C, 0x061C, 0x05FC, 0x05DC, 0x05BC, 0x05BD, 0x059D, 0x057D, 0x055D, 0x053E, 0x051E, 0x04FE, 0x04DE, 0x04BE, 0x04BF, 0x049F, 0x047F, 0x047F, 0x047F, 0x045F, 0x045F, 0x045F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x047F, 0x049F, 0x047F, 0x045F, 0x041F, 0x03DF, 0x037F, 0x031F, 0x029F, 0x021F, 0x017F, 0x011F, 0x00BF, 0x005F, 0x001F, 0x001F, 0x00FF, 0x89B7, 0xC9B3, 0x447B, 0x065F, 0x06BF, 0x071F, 0x073F, 0x073F, 0x075F, 0x3D9B, 0xC972, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xA132, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x20CD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x011A, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x3110, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3931, 0x40F1, 0x4111, 0x4132, 0x4132, 0x4132, 0x61B3, 0x9274, 0xB2F5, 0xC355, 0xD395, 0xD395, 0xD395, 0xBC16, 0x469D, 0x8539, 0xD376, 0xD375, 0x6DBA, 0x0F9F, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x077F, 0x06BC, 0x06BB, 0x069B, 0x067B, 0x065B, 0x063B, 0x063B, 0x061B, 0x05FB, 0x05DB, 0x05BB, 0x059C, 0x059C, 0x057C, 0x055C, 0x053D, 0x051D, 0x04FD, 0x04DD, 0x04BE, 0x049E, 0x047F, 0x047F, 0x045F, 0x043F, 0x043F, 0x041F, 0x041F, 0x041F, 0x041F, 0x041F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x043F, 0x041F, 0x03FF, 0x03BF, 0x037F, 0x033F, 0x02BF, 0x023F, 0x01DF, 0x015F, 0x00DF, 0x009F, 0x005F, 0x001F, 0x005F, 0x097F, 0xB9B3, 0xB214, 0x0DBF, 0x06FF, 0x075F, 0x073F, 0x073F, 0x075F, 0x077F, 0x6479, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC932, 0x9132, 0x3911, 0x3111, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x08F4, 0x20CD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x08F5, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x30EF, 0x30F0, 0x28F0, 0x30F0, 0x3110, 0x38F0, 0x38F1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0x5152, 0x8234, 0xC335, 0xD395, 0xD395, 0xD395, 0xD395, 0xAC57, 0x7D7A, 0x469C, 0x0F9F, 0xA4B8, 0xD395, 0x8539, 0x1F5E, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x075D, 0x06BB, 0x06BB, 0x069A, 0x067A, 0x065A, 0x065A, 0x063A, 0x061A, 0x05FA, 0x05DA, 0x05DB, 0x05BB, 0x059B, 0x057B, 0x055B, 0x053C, 0x053C, 0x051C, 0x04FC, 0x04DD, 0x04BD, 0x047E, 0x047E, 0x045E, 0x043F, 0x041F, 0x03FF, 0x03FF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03DF, 0x03BF, 0x035F, 0x031F, 0x02DF, 0x027F, 0x01FF, 0x019F, 0x011F, 0x00BF, 0x007F, 0x003F, 0x001F, 0x009F, 0x39DB, 0xC992, 0x6399, 0x069F, 0x079F, 0x07FF, 0x07DF, 0x07BF, 0x077F, 0x079F, 0x9AF6, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC932, 0x7112, 0x3110, 0x30F0, 0x30EF, 0x28F0, 0x28EF, 0x28CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20AE, 0x18CF, 0x00F9, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08D3, 0x10D2, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4112, 0x4132, 0x4132, 0x5193, 0x9274, 0xCB75, 0xD395, 0xD395, 0xD395, 0xC3D6, 0x6DBA, 0x1F7E, 0x07FF, 0x07FF, 0x36DD, 0xBC17, 0x8539, 0x1F5E, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x071B, 0x06DA, 0x06BA, 0x06BA, 0x0699, 0x0679, 0x0659, 0x0639, 0x0619, 0x0619, 0x05F9, 0x05DA, 0x05BA, 0x059A, 0x057A, 0x055A, 0x055B, 0x053B, 0x051B, 0x04FC, 0x04DC, 0x04BC, 0x049D, 0x047D, 0x045D, 0x043E, 0x041E, 0x03FE, 0x03DF, 0x03DF, 0x03BF, 0x03BF, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x037F, 0x035F, 0x031F, 0x02DF, 0x027F, 0x023F, 0x01BF, 0x015F, 0x00FF, 0x009F, 0x005F, 0x001F, 0x003F, 0x011F, 0x99B6, 0xB9D3, 0x0D9F, 0x06DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F7E, 0xB9B3, 0xC952, 0xC952, 0xC952, 0xC952, 0xC931, 0xC932, 0xC132, 0x6111, 0x38F0, 0x30F0, 0x28F0, 0x30EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18CE, 0x08F5, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3910, 0x3911, 0x3911, 0x3912, 0x4132, 0x4132, 0x6173, 0xA2B4, 0xD395, 0xD375, 0xD395, 0xD395, 0xC3D6, 0x6DBA, 0x0FBF, 0x07FF, 0x07DF, 0x07FF, 0x07DF, 0x1F7E, 0x07DF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x06F9, 0x06F9, 0x06D9, 0x06B8, 0x0698, 0x0698, 0x0678, 0x0658, 0x0638, 0x0638, 0x0618, 0x05F8, 0x05D8, 0x05B8, 0x0598, 0x0579, 0x0559, 0x0559, 0x051A, 0x04FA, 0x04DB, 0x04BB, 0x049C, 0x047C, 0x045D, 0x043D, 0x041E, 0x03FE, 0x03DE, 0x03BF, 0x039F, 0x039F, 0x037F, 0x037F, 0x037F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x035F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02BF, 0x027F, 0x023F, 0x01FF, 0x019F, 0x013F, 0x00BF, 0x007F, 0x003F, 0x001F, 0x005F, 0x197E, 0xB993, 0x6379, 0x063F, 0x073F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x3DFB, 0xC952, 0xC952, 0xC932, 0xC932, 0xC932, 0xC932, 0xC912, 0xB912, 0x4111, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x08F6, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x20AE, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x4111, 0x4952, 0x79F3, 0xB2F4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x94F9, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x079D, 0x0719, 0x06F8, 0x06F8, 0x06D7, 0x06B7, 0x06B7, 0x0697, 0x0676, 0x0656, 0x0637, 0x0636, 0x0617, 0x05F7, 0x05D7, 0x05B7, 0x0597, 0x0578, 0x0578, 0x0538, 0x0519, 0x04F9, 0x04DA, 0x04BB, 0x049B, 0x047C, 0x043C, 0x041D, 0x041D, 0x03FE, 0x03DE, 0x03BE, 0x039E, 0x037F, 0x035F, 0x035F, 0x033F, 0x031F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02DF, 0x02BF, 0x029F, 0x027F, 0x023F, 0x01FF, 0x019F, 0x015F, 0x00FF, 0x009F, 0x005F, 0x003F, 0x001F, 0x00BF, 0x59BA, 0xB9B3, 0x0D3F, 0x06BF, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7438, 0xC952, 0xC132, 0xC932, 0xC932, 0xC932, 0xC911, 0xC912, 0xA111, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x08F5, 0x011A, 0x0119, 0x00FA, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x5151, 0x79F3, 0xA2B4, 0xCB75, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xC3D6, 0x469C, 0x07FF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0xC335, 0x45D7, 0x0738, 0x0717, 0x06F6, 0x06F6, 0x06D6, 0x06B5, 0x06B5, 0x0695, 0x0675, 0x0655, 0x0635, 0x0615, 0x05F5, 0x05F5, 0x05D6, 0x05B6, 0x0597, 0x0557, 0x0538, 0x0518, 0x04F9, 0x04D9, 0x049A, 0x047B, 0x045B, 0x043C, 0x041C, 0x03DD, 0x03DD, 0x03BE, 0x039E, 0x037E, 0x035F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x027F, 0x025F, 0x021F, 0x01FF, 0x01BF, 0x017F, 0x011F, 0x00DF, 0x009F, 0x003F, 0x001F, 0x003F, 0x013F, 0xB174, 0x6339, 0x05FF, 0x071F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xB992, 0xC932, 0xC932, 0xC931, 0xC912, 0xC912, 0xC912, 0xC911, 0x8111, 0x30F0, 0x30F0, 0x28EF, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20D0, 0x0119, 0x0119, 0x0119, 0x0139, 0x08F5, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F9, 0x0119, 0x18D0, 0x18CD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x59B2, 0x7A13, 0x9A94, 0xBB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xAC77, 0x2F1E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BC, 0x0759, 0xABB5, 0xC314, 0x1E97, 0x0736, 0x0716, 0x0715, 0x06F4, 0x06F4, 0x06F3, 0x06D3, 0x06B3, 0x06B2, 0x0692, 0x0672, 0x0653, 0x0633, 0x0613, 0x05F4, 0x05D4, 0x0595, 0x0575, 0x0556, 0x0517, 0x04F8, 0x04B9, 0x0499, 0x045A, 0x043B, 0x041B, 0x03FC, 0x03DD, 0x03BD, 0x039D, 0x037E, 0x035E, 0x033E, 0x033F, 0x031F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x029F, 0x027F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x021F, 0x01DF, 0x019F, 0x017F, 0x013F, 0x00FF, 0x009F, 0x007F, 0x003F, 0x001F, 0x007F, 0x399B, 0xB993, 0x055F, 0x067F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x45DB, 0xC132, 0xC932, 0xC912, 0xC132, 0xC912, 0xC912, 0xC911, 0xC912, 0x5111, 0x38F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18CE, 0x10D3, 0x10F4, 0x18D0, 0x18AD, 0x18AE, 0x20CD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x20CD, 0x20AE, 0x20AD, 0x20AE, 0x18CE, 0x20AE, 0x20CE, 0x20CE, 0x28AE, 0x20CE, 0x28EE, 0x5171, 0x69D2, 0x8232, 0xAAF4, 0xC334, 0xD375, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x757A, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07BD, 0x079B, 0x077A, 0x0779, 0x74D6, 0xD2D4, 0x9BF5, 0x0756, 0x0735, 0x0734, 0x0734, 0x0733, 0x0712, 0x0711, 0x0711, 0x06F0, 0x06F0, 0x06D0, 0x06AF, 0x06AF, 0x066F, 0x0650, 0x0631, 0x0611, 0x05D2, 0x0594, 0x0554, 0x0515, 0x04F7, 0x04B8, 0x0478, 0x0459, 0x043A, 0x03FB, 0x03BC, 0x03BC, 0x039D, 0x037D, 0x035E, 0x033E, 0x031F, 0x031F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x027F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x013F, 0x011F, 0x00BF, 0x007F, 0x005F, 0x001F, 0x001F, 0x00DF, 0xA175, 0x33BC, 0x05DF, 0x06FF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x92D5, 0xC911, 0xC132, 0xC912, 0xC912, 0xC8F2, 0xC112, 0xC912, 0xA8F1, 0x3110, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x10CF, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x390F, 0x4970, 0x59B0, 0x7A32, 0x9293, 0xAAD3, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0x9CB8, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DE, 0x07DD, 0x07BC, 0x079B, 0x079A, 0x079A, 0x0779, 0x55B7, 0xD2B4, 0xD2B4, 0x4DB5, 0x0775, 0x0774, 0x0753, 0x0773, 0x0752, 0x0750, 0x0750, 0x074F, 0x074E, 0x074D, 0x074D, 0x074C, 0x072B, 0x072B, 0x072A, 0x070A, 0x06EA, 0x06AC, 0x064D, 0x05D0, 0x0573, 0x04F5, 0x04B6, 0x0478, 0x0438, 0x041A, 0x03FB, 0x03BC, 0x039C, 0x037C, 0x033D, 0x033D, 0x031E, 0x02FE, 0x02FF, 0x02DF, 0x02BF, 0x029F, 0x029F, 0x027F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x009F, 0x005F, 0x003F, 0x001F, 0x003F, 0x213D, 0x1B1E, 0x051F, 0x065F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F3D, 0xC912, 0xC912, 0xC112, 0xC112, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0x80F1, 0x30F0, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x00F9, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x392F, 0xD395, 0xC374, 0xA2D3, 0xAAD3, 0x7A31, 0x7A31, 0x7A11, 0x7231, 0x5190, 0x496F, 0x496F, 0x4970, 0x496F, 0x494F, 0x412F, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4970, 0x494F, 0x496F, 0x496F, 0x69F1, 0x7A31, 0x7A31, 0x9272, 0xA2D3, 0xAAF3, 0xC355, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD375, 0xD395, 0xAC57, 0x565C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DE, 0x07BD, 0x07BC, 0x07BC, 0x07BB, 0x079A, 0x079A, 0x0799, 0x26B8, 0xCAD4, 0xD2B4, 0xC314, 0x0F35, 0x0794, 0x0794, 0x0792, 0x0792, 0x0791, 0x0790, 0x078F, 0x078E, 0x078E, 0x078D, 0x078C, 0x07AA, 0x07A9, 0x07A9, 0x07A8, 0x07C7, 0x07C5, 0x07C4, 0x07E4, 0x07A4, 0x0727, 0x068A, 0x05AF, 0x0496, 0x0438, 0x03F9, 0x03BA, 0x039B, 0x035C, 0x035D, 0x031D, 0x031D, 0x02FE, 0x02DF, 0x02BF, 0x02BF, 0x029F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x00FF, 0x00DF, 0x00BF, 0x007F, 0x005F, 0x001F, 0x001F, 0x007F, 0x023F, 0x041F, 0x05BF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6498, 0xC911, 0xC912, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8D1, 0x50F1, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x0117, 0x10D2, 0x08F3, 0x10D3, 0x10D2, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC3D6, 0x8539, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DE, 0x07BD, 0x07BD, 0x07BC, 0x07BC, 0x07BB, 0x07BA, 0x07BA, 0x07B9, 0xD2B4, 0xD2B4, 0xD2B4, 0x6535, 0x07B5, 0x07B5, 0x07B4, 0x07B3, 0x07B2, 0x07B1, 0x07B0, 0x07AF, 0x07CE, 0x07CD, 0x07CC, 0x07CB, 0x07CA, 0x07CA, 0x07C9, 0x07E8, 0x07E7, 0x07E6, 0x07E5, 0x07E5, 0x07E3, 0x07E3, 0x07E2, 0x07E1, 0x0726, 0x060C, 0x04B4, 0x03B9, 0x037B, 0x035C, 0x033D, 0x031D, 0x02DE, 0x02DF, 0x02BE, 0x029F, 0x029F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x019F, 0x019F, 0x015F, 0x015F, 0x013F, 0x00FF, 0x00DF, 0x00BF, 0x007F, 0x007F, 0x003F, 0x001F, 0x001F, 0x011F, 0x02FF, 0x04DF, 0x063F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xB972, 0xC8F2, 0xC8F2, 0xC0F1, 0xC8F2, 0xC0F2, 0xC0F1, 0xC8D1, 0xA0F1, 0x30F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CE, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x10CF, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x412F, 0x8A72, 0xC334, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xAC57, 0x469C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x467C, 0x8519, 0x8519, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DE, 0x07DE, 0x07DE, 0x07DD, 0x07DC, 0x07DC, 0x07DB, 0x07DB, 0x07DA, 0x07DA, 0x9BF5, 0xD2B4, 0xD2B4, 0xC2F4, 0x0F77, 0x07D6, 0x07D5, 0x07D4, 0x07D4, 0x07D3, 0x07D2, 0x07D1, 0x07D0, 0x07EF, 0x07EE, 0x07ED, 0x07EC, 0x07EC, 0x07EA, 0x07E9, 0x07E9, 0x07E7, 0x07E6, 0x07E6, 0x07E5, 0x07E5, 0x07E4, 0x07E4, 0x07E3, 0x07E3, 0x07E2, 0x0785, 0x060C, 0x04D3, 0x035B, 0x031C, 0x02DE, 0x02DE, 0x02BE, 0x029F, 0x027F, 0x025F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x001F, 0x001F, 0x003F, 0x01DF, 0x03BF, 0x059F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D7A, 0xC111, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0D1, 0xC8D1, 0x68F1, 0x30F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x414F, 0x61D1, 0x8251, 0xA2D3, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xBC16, 0x8539, 0x469C, 0x17BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8518, 0xD355, 0xD355, 0xD335, 0xD335, 0x84F8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DE, 0x07FE, 0x07DD, 0x07DD, 0x07BC, 0x07DC, 0x07DB, 0x07DB, 0x07DA, 0x8C56, 0xCAB4, 0xCAB4, 0xD294, 0x4DF7, 0x07D7, 0x07D7, 0x07D6, 0x07F5, 0x07D5, 0x07F3, 0x07F3, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EE, 0x07ED, 0x07EC, 0x07EB, 0x07EB, 0x07EA, 0x07E9, 0x07E8, 0x07E8, 0x07E7, 0x07E7, 0x07E6, 0x07E6, 0x07E5, 0x07E5, 0x07E5, 0x07E5, 0x07E4, 0x07A6, 0x060E, 0x03F8, 0x02DE, 0x02BE, 0x029F, 0x027F, 0x025F, 0x023F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00DF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x003F, 0x001F, 0x001F, 0x00BF, 0x029F, 0x049F, 0x063F, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB1D3, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8D1, 0xC8D1, 0xC0F1, 0xC8D1, 0xB8D1, 0x40F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x08F7, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0x496F, 0x5990, 0x7A12, 0x7A32, 0x9272, 0xA2D3, 0xA2D3, 0xC375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xAC77, 0x757A, 0x36FD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4E3C, 0xD355, 0xD335, 0xD355, 0xD335, 0xD335, 0xD334, 0x7539, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07DD, 0x07DD, 0x07DD, 0x07DC, 0x07FC, 0x07DC, 0x07DB, 0x6D38, 0xCAB4, 0xD294, 0xD294, 0xAB95, 0x07D8, 0x07D8, 0x07F7, 0x07F7, 0x07F6, 0x07F5, 0x07F5, 0x07F4, 0x07F3, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EE, 0x07ED, 0x07ED, 0x07EC, 0x07EC, 0x07EB, 0x07EA, 0x07EA, 0x07EA, 0x07E9, 0x07E9, 0x07E8, 0x07E8, 0x07E8, 0x07E8, 0x07E7, 0x07E7, 0x07E8, 0x07C8, 0x06EB, 0x0514, 0x033C, 0x027F, 0x025F, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x019F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x005F, 0x005F, 0x003F, 0x001F, 0x001F, 0x015F, 0x037F, 0x057F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D5A, 0xC8F1, 0xC8D1, 0xC0F1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0xC8B1, 0x78D1, 0x3110, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x496F, 0x496F, 0x4970, 0x7A12, 0x7A31, 0x8252, 0xAAD3, 0xA2D3, 0xBB34, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCBD6, 0x94F8, 0x565B, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB3F6, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD334, 0x1F7E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DE, 0x07DD, 0x07FD, 0x07FD, 0x07FD, 0x07DD, 0x07DC, 0x6D38, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0x1F39, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F6, 0x07F5, 0x07F4, 0x07F3, 0x07F2, 0x07F2, 0x07F1, 0x07F0, 0x07EF, 0x07EF, 0x07EE, 0x07EE, 0x07ED, 0x07ED, 0x07EC, 0x07ED, 0x07EC, 0x07EB, 0x07EC, 0x07EB, 0x07EB, 0x07EA, 0x07EA, 0x07EA, 0x07CA, 0x07AB, 0x076C, 0x070D, 0x05B2, 0x039B, 0x023F, 0x021F, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x017F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00DF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x001F, 0x60D9, 0x0A3F, 0x047F, 0x063F, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA9D3, 0xC0D1, 0xC8D1, 0xC0F1, 0xC8B1, 0xC0D1, 0xC8B1, 0xC0B1, 0xB8B1, 0x48F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F9, 0x10D0, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18CD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x4970, 0x4970, 0x5990, 0x7A31, 0x7231, 0x7A31, 0x7A31, 0x9AB3, 0xAAD4, 0xA2D4, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0x94F8, 0x565C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xD335, 0xD334, 0xD335, 0xD335, 0xD335, 0xD335, 0xD314, 0xD315, 0x5DDB, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x6D58, 0xD294, 0xD293, 0xCA94, 0xD274, 0x4DF8, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F8, 0x07F7, 0x07F6, 0x07F6, 0x07F5, 0x07F5, 0x07F4, 0x07F3, 0x07F3, 0x07F2, 0x07F1, 0x07F1, 0x07F0, 0x07F0, 0x07F0, 0x07EF, 0x07EF, 0x07EF, 0x07EF, 0x07EF, 0x07EE, 0x07EE, 0x07EE, 0x07EE, 0x07EE, 0x07ED, 0x07CD, 0x078E, 0x076E, 0x0710, 0x06B1, 0x0574, 0x037B, 0x01FF, 0x01DF, 0x01BF, 0x019F, 0x017F, 0x017F, 0x013F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x001F, 0x88D6, 0x6159, 0x031F, 0x053F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4D5B, 0xC0D1, 0xC8D1, 0xC8D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B1, 0x90D1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CF, 0x20CE, 0x20AE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x011A, 0x10D1, 0x18AD, 0x18AD, 0x10D1, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x10CF, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18CE, 0x18AD, 0x20AE, 0x20AD, 0x20CE, 0x20CE, 0x290F, 0x5170, 0x5170, 0x69F1, 0x7A32, 0x8232, 0xAAF3, 0xAAF4, 0xCB75, 0xD395, 0xD396, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xC3B6, 0x8539, 0x1F7F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xD335, 0xD335, 0xD335, 0xD315, 0xD314, 0xD315, 0xD314, 0xD314, 0x659A, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x6D39, 0xD294, 0xCA94, 0xD274, 0xCA74, 0x7C96, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F6, 0x07F6, 0x07F5, 0x07F4, 0x07F4, 0x07F3, 0x07F3, 0x07F3, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F2, 0x07F1, 0x07F1, 0x07F1, 0x07F1, 0x07F0, 0x07F1, 0x07D0, 0x0791, 0x0751, 0x0712, 0x0693, 0x0634, 0x0517, 0x02DD, 0x01BF, 0x019F, 0x017F, 0x015F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x00BF, 0x007F, 0x005F, 0x005F, 0x003F, 0x003F, 0x001F, 0x60B8, 0xB8F3, 0x09BF, 0x041F, 0x061F, 0x073F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB1B3, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0x48F1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F9, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x00F9, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AE, 0x00F7, 0x011A, 0x011A, 0x011A, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x5172, 0x61B2, 0x8A54, 0x9A94, 0xB335, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0x9C97, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xAC17, 0xD335, 0xD314, 0xD335, 0xD314, 0xD315, 0xD315, 0xD2F4, 0x467C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6D59, 0xD274, 0xCA94, 0xD274, 0xCA74, 0xB334, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FB, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F6, 0x07F6, 0x07F6, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F5, 0x07F4, 0x07F4, 0x07F4, 0x07D3, 0x07B3, 0x0793, 0x0753, 0x0714, 0x06B5, 0x5516, 0x0538, 0x037C, 0x01FF, 0x017F, 0x015F, 0x013F, 0x011F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x6099, 0xC911, 0x491A, 0x02DF, 0x051F, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6459, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x90D1, 0x30F1, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x3911, 0x3911, 0x4132, 0x4132, 0x5152, 0x69D3, 0x9274, 0xB2F5, 0xD395, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xA478, 0x36DD, 0x07FF, 0x07FF, 0x563C, 0xD335, 0xD334, 0xD315, 0xD315, 0xD2F4, 0xCB15, 0xBB96, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8498, 0xCA94, 0xCA94, 0xD274, 0xCA74, 0xCA74, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F8, 0x07F8, 0x07F8, 0x07F8, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F7, 0x07F6, 0x07F6, 0x07D6, 0x07B6, 0x0796, 0x0756, 0x0716, 0xA456, 0xBBD6, 0x3479, 0x02FD, 0x023F, 0x019F, 0x015F, 0x011F, 0x00FF, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x003F, 0x003F, 0x003F, 0x78B7, 0xC111, 0xA114, 0x01FF, 0x041F, 0x05FF, 0x075F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xC0B1, 0xC0D2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x48F1, 0x30F0, 0x30EF, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10D0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18CE, 0x08F7, 0x0119, 0x00F8, 0x10CF, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x20CD, 0x20CD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x5154, 0x5154, 0x71F4, 0x9A75, 0xB2F5, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0x9C78, 0x36DD, 0x07FF, 0x9C57, 0xD335, 0xD315, 0xD334, 0xD314, 0xC355, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9BF7, 0xCA94, 0xD274, 0xCA73, 0xCA74, 0xD253, 0x2EFD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07F9, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07FA, 0x07F9, 0x07F9, 0x07F9, 0x07F8, 0x07D8, 0x07B8, 0x0797, 0x0758, 0x0EF8, 0xBBF6, 0xD395, 0x6B99, 0x025F, 0x021F, 0x01BF, 0x013F, 0x011F, 0x00FF, 0x00DF, 0x00BF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x98D5, 0xC8F2, 0xC911, 0x195E, 0x033F, 0x053F, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7B76, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0x88D1, 0x30F1, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x10D2, 0x00F6, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x08D5, 0x10D0, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00FA, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x3111, 0x3910, 0x3911, 0x4111, 0x4912, 0x4133, 0x4932, 0x4933, 0x5154, 0x5154, 0x5955, 0x5955, 0x5975, 0x6996, 0x8A16, 0xAAD5, 0xCB55, 0xD375, 0xD355, 0xD354, 0xD355, 0xD335, 0xD335, 0xD335, 0xD335, 0xCB35, 0x84F9, 0x0FBF, 0x5DDB, 0xA457, 0x9C58, 0x84D8, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9BD6, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0xCA74, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07FC, 0x07FC, 0x07FC, 0x07FC, 0x07FB, 0x07FB, 0x07FB, 0x07FB, 0x07DA, 0x07DA, 0x07BA, 0x079A, 0x0779, 0x2E99, 0xC3D6, 0xD395, 0x8339, 0x0A3E, 0x01DF, 0x019F, 0x015F, 0x011F, 0x00FF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x007F, 0x003F, 0x003F, 0x003F, 0x90D5, 0xC912, 0xC0F1, 0x7117, 0x027F, 0x049F, 0x065F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x269D, 0xC891, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8B1, 0x3110, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x011A, 0x00F9, 0x10D0, 0x18AD, 0x20AD, 0x20AD, 0x10D1, 0x00F8, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x10D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0139, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18CE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28EF, 0x28CF, 0x28EF, 0x28D0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3931, 0x4132, 0x4132, 0x4933, 0x5133, 0x5153, 0x5154, 0x5154, 0x5975, 0x6175, 0x6195, 0x9255, 0x8B14, 0x4AD3, 0x7A94, 0xAB14, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD315, 0xD314, 0xD335, 0xC355, 0x467C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xC2D4, 0xCA74, 0xCA74, 0xD274, 0xCA74, 0xD253, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07FC, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FD, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07FD, 0x07FD, 0x07FC, 0x07FC, 0x07DB, 0x07BB, 0x07BB, 0x077B, 0x2EBA, 0xC3D6, 0xD395, 0xB337, 0x09DF, 0x01BF, 0x017F, 0x013F, 0x011F, 0x00DF, 0x009F, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x003F, 0x7896, 0xC0F1, 0xC8F1, 0xA8F3, 0x01DF, 0x03DF, 0x05BF, 0x071F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA214, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0x68F1, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0139, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x20AD, 0x18AD, 0x08F4, 0x0119, 0x011A, 0x0119, 0x08F6, 0x10D2, 0x10D0, 0x18CF, 0x18D0, 0x10D3, 0x0118, 0x0119, 0x011A, 0x00F9, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20EF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30EF, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4132, 0x4932, 0x4933, 0x5133, 0x5153, 0x5154, 0x5954, 0x6195, 0x9A75, 0xCB55, 0xCB75, 0x5BB4, 0x3B34, 0x42B3, 0x4A33, 0x6253, 0x9AB4, 0xD335, 0xD335, 0xD315, 0xD334, 0xD314, 0xD315, 0xD314, 0xD314, 0x5DDB, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F5E, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xCA53, 0x369D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07FE, 0x07FD, 0x07DD, 0x07DD, 0x07BD, 0x079C, 0x561A, 0xD395, 0xD395, 0xAB37, 0x099F, 0x015F, 0x013F, 0x011F, 0x00FF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x005F, 0x003F, 0x003F, 0x305C, 0xC0F1, 0xC8F1, 0xC8D1, 0x215D, 0x033F, 0x051F, 0x06DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5CD9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x98D1, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0117, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x08F3, 0x0118, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F8, 0x011A, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18CD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4111, 0x4131, 0x4132, 0x4933, 0x4933, 0x5154, 0x5974, 0x9255, 0xCB55, 0xD375, 0xBB95, 0x5474, 0x3C34, 0x3BB4, 0x4333, 0x42B3, 0x4A13, 0x49F3, 0x5A32, 0x9AB4, 0xD334, 0xD335, 0xD314, 0xD314, 0xD315, 0xD314, 0xD2F4, 0x84D8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x4DDB, 0xD274, 0xCA74, 0xCA73, 0xD274, 0xCA54, 0xCA54, 0x369C, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07FE, 0x07DD, 0x07DE, 0x079D, 0x6D99, 0xD395, 0xD395, 0xAB17, 0x097F, 0x011F, 0x011F, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x003F, 0x003F, 0x003F, 0xC8F1, 0xC8F1, 0xC8D1, 0x5119, 0x02DF, 0x04FF, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F1E, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x4910, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x20AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18D0, 0x00F8, 0x0119, 0x00F8, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AE, 0x10D2, 0x08F3, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3910, 0x3911, 0x4112, 0x4132, 0x4132, 0x4933, 0x5133, 0x8214, 0xCB55, 0xD375, 0xD375, 0xB3D5, 0x3D55, 0x3515, 0x3495, 0x3C14, 0x3B94, 0x3B13, 0x4293, 0x4212, 0x49F3, 0x49F3, 0x5A13, 0x9AB4, 0xD314, 0xD315, 0xCB15, 0xD2F4, 0xD2F5, 0xD2F4, 0x7539, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8C37, 0xCA74, 0xD273, 0xD253, 0xCA54, 0xCA53, 0xD253, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07DF, 0x07DF, 0x94D8, 0xD396, 0xD395, 0x8299, 0x00FF, 0x00FF, 0x00FF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0xC8D1, 0xC0F1, 0xC0D1, 0xA0D4, 0x027F, 0x04BF, 0x069F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8315, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x70F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0117, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x10D3, 0x08F3, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x0117, 0x0119, 0x0119, 0x10CF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x0118, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x011A, 0x0118, 0x10D0, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0117, 0x18AE, 0x20CD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x28CF, 0x28CF, 0x28CF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x4132, 0x4132, 0x4132, 0x5973, 0xB2F4, 0xD375, 0xD375, 0xD375, 0x9435, 0x3D55, 0x2D55, 0x2D75, 0x3515, 0x3C94, 0x3414, 0x3B94, 0x4313, 0x4293, 0x4A13, 0x41F3, 0x49F2, 0x4A13, 0x5A33, 0xA2B4, 0xD314, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2F4, 0x4E1B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x179F, 0xD274, 0xCA53, 0xCA73, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9E, 0xBC16, 0xD395, 0xD395, 0x725A, 0x00BF, 0x00BF, 0x00BF, 0x009F, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x90B5, 0xC8D1, 0xC8D1, 0xC0D1, 0x123E, 0x047F, 0x067F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0x90D1, 0x38F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x08F6, 0x011A, 0x0119, 0x0118, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0118, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x00F7, 0x011A, 0x00F8, 0x10D0, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F9, 0x00F9, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x30F0, 0x38F0, 0x30F0, 0x3911, 0x3911, 0x4112, 0x4132, 0x8234, 0xCB55, 0xD375, 0xD375, 0xD355, 0x9435, 0x3575, 0x3575, 0x2D75, 0x3555, 0x3555, 0x3514, 0x3474, 0x3BF4, 0x3B73, 0x42F4, 0x4273, 0x4A13, 0x4213, 0x49F2, 0x49F3, 0x49F3, 0x6A33, 0xBAD4, 0xD2F5, 0xD2F4, 0xD2D4, 0xC335, 0x177E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5D9A, 0xCA54, 0xD273, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0x9BB6, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x077F, 0x077E, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x36DD, 0xD395, 0xD395, 0xD395, 0x51BC, 0x009F, 0x009F, 0x007F, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x7077, 0xC0D2, 0xC8D1, 0xC0D1, 0x49FA, 0x049F, 0x069F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F1E, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0x3910, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x20AD, 0x10D0, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x08F5, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D3, 0x011A, 0x0118, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F8, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x08F5, 0x20AD, 0x18CD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08F3, 0x10F3, 0x10D2, 0x20AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18CE, 0x08F7, 0x0119, 0x00F8, 0x18B0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x4952, 0xAAB4, 0xD375, 0xD375, 0xD375, 0xD355, 0x9435, 0x3575, 0x3575, 0x2D75, 0x2D75, 0x2D75, 0x3555, 0x54D5, 0x6475, 0x83B5, 0x8B74, 0x9B34, 0xAB14, 0xAAD4, 0xB2D4, 0xAAD4, 0xAAB4, 0xAAB4, 0xB2B4, 0x6B15, 0x8A94, 0xC2D4, 0xD2F4, 0xD2D4, 0x84B8, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB315, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0x653A, 0x07FF, 0x07FF, 0x07DF, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x075F, 0x075F, 0x073F, 0x073F, 0x071F, 0x071E, 0x071E, 0x073E, 0x079F, 0x07DF, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7D7A, 0xD395, 0xD395, 0xC375, 0x28FE, 0x007F, 0x007F, 0x005F, 0x005F, 0x003F, 0x005F, 0x003F, 0x003F, 0x183E, 0xC0D1, 0xC0D1, 0xC0D2, 0x7996, 0x04BF, 0x067F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA214, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0x58F1, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AF, 0x0119, 0x0119, 0x08F6, 0x20AE, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0118, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F7, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0139, 0x0119, 0x10F3, 0x18D0, 0x08F5, 0x0119, 0x0119, 0x18D0, 0x18AE, 0x18AE, 0x18CD, 0x0119, 0x011A, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x011A, 0x00F8, 0x18D0, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AD, 0x18CD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F9, 0x0119, 0x0117, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x5972, 0xCB55, 0xD375, 0xD375, 0xD375, 0xD375, 0xABD5, 0x4515, 0x54F5, 0x7C75, 0x8C35, 0xABD5, 0xCB55, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0xD315, 0xD314, 0xD314, 0xC355, 0x9C37, 0x659A, 0x467C, 0x0FBF, 0x07FF, 0x07FF, 0x269D, 0x9C17, 0xD2D4, 0x9C17, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x5D9A, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0x26DD, 0x07FF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07BF, 0x079F, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x071E, 0x071E, 0x06FE, 0x06FE, 0x06FF, 0x06DE, 0x06DE, 0x06BE, 0x06BE, 0x06DE, 0x073E, 0x079F, 0x07BF, 0x07BF, 0x079F, 0x079F, 0x079F, 0x077F, 0x079F, 0x079F, 0x077F, 0x079F, 0x079F, 0x079F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0xC3F6, 0xD395, 0xD395, 0xAAF7, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x003F, 0x001F, 0x001F, 0xA094, 0xC0D1, 0xC8B1, 0xA8F3, 0x04BF, 0x069F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x73D8, 0xB8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0x78F1, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18CF, 0x18AE, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x00F6, 0x0119, 0x08F3, 0x18AD, 0x20AD, 0x20AD, 0x00F6, 0x00F9, 0x08D4, 0x18AD, 0x18AD, 0x18AD, 0x00F8, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x00F6, 0x0119, 0x10D3, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18CD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18CD, 0x10CF, 0x0119, 0x00F9, 0x0117, 0x18CE, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x3111, 0x71F2, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xD355, 0xD335, 0xD335, 0xCB14, 0xD334, 0xD334, 0xAC16, 0x753A, 0x467D, 0x1F5E, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x369C, 0x4E1B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x26FD, 0xC2B4, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA33, 0xCA33, 0xA356, 0x07FF, 0x07FF, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x077F, 0x075F, 0x073F, 0x071F, 0x071F, 0x06FF, 0x06FE, 0x06FE, 0x06DE, 0x06BE, 0x06BE, 0x069E, 0x069E, 0x069E, 0x067E, 0x067E, 0x065E, 0x065E, 0x06BE, 0x073E, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x075F, 0x077F, 0x077F, 0x077F, 0x077F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07DF, 0x6DDA, 0xD395, 0xD376, 0xD375, 0x79FA, 0x003F, 0x003F, 0x001F, 0x003F, 0x001F, 0x001F, 0x001F, 0x001F, 0x8896, 0xC0B1, 0xC0B1, 0xC8B1, 0x0C9F, 0x069F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x3DBB, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0x98D1, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x08F6, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x00F6, 0x011A, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x011A, 0x08F3, 0x20AD, 0x18AD, 0x18AD, 0x08F7, 0x0119, 0x08F3, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x9A93, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD355, 0xD355, 0xD335, 0xD335, 0xC375, 0x84F9, 0x4E3C, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9F, 0xAB75, 0xCA54, 0xD253, 0xCA53, 0xCA33, 0xCA33, 0xD233, 0xCA33, 0x4DBB, 0x07DF, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x075F, 0x073F, 0x071F, 0x071F, 0x06FF, 0x06DE, 0x06DE, 0x06DE, 0x06BE, 0x06BE, 0x069E, 0x067E, 0x067E, 0x067E, 0x065E, 0x063E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05FD, 0x067D, 0x06DE, 0x06FE, 0x06FE, 0x06FE, 0x06FE, 0x071E, 0x073F, 0x073F, 0x073F, 0x073E, 0x075F, 0x077F, 0x079F, 0x079F, 0x07BF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x0FBF, 0xC3D6, 0xD375, 0xD375, 0xD355, 0x30FD, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x001F, 0x6058, 0xC0B1, 0xC0B1, 0xC0B1, 0x33FC, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0F9E, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xC0B1, 0xB8D1, 0xB8D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18CD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F6, 0x0119, 0x08D5, 0x18CD, 0x18AE, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x10D3, 0x10D0, 0x08F4, 0x0119, 0x0119, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30F0, 0x3910, 0xAAF4, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xB3D6, 0x7539, 0x271D, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x2EFD, 0xB315, 0xCA53, 0xCA54, 0xCA33, 0xCA53, 0xCA34, 0xCA34, 0xCA33, 0xA335, 0x07BF, 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DE, 0x06BF, 0x06BE, 0x069E, 0x069E, 0x069E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05BD, 0x05BE, 0x059D, 0x055E, 0x055E, 0x05BE, 0x05FE, 0x061D, 0x067E, 0x06BE, 0x06FE, 0x06FE, 0x071F, 0x071E, 0x073F, 0x073F, 0x075F, 0x077F, 0x079F, 0x07BF, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x8539, 0xD375, 0xD355, 0xD355, 0xBAF6, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x403B, 0xC8B1, 0xC0B1, 0xC0B1, 0x6318, 0x06BF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA9B3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8D1, 0x4910, 0x3910, 0x30F0, 0x30F0, 0x28CF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x10D3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F3, 0x011A, 0x0118, 0x18AD, 0x18CD, 0x18AD, 0x18CE, 0x00F8, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x08F5, 0x18AD, 0x20CD, 0x18AD, 0x10D0, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x0117, 0x011A, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x30CF, 0x3910, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD354, 0xD355, 0xD355, 0xCB96, 0x8518, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBE, 0x653A, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x2E9D, 0x077F, 0x077F, 0x075F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FE, 0x06DF, 0x06DE, 0x06BF, 0x06BE, 0x06BF, 0x069E, 0x067E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05BE, 0x05BE, 0x059E, 0x057E, 0x053E, 0x051E, 0x04FE, 0x04BE, 0x049E, 0x041E, 0x03DD, 0x04DE, 0x065E, 0x06BE, 0x06DE, 0x06DE, 0x06FE, 0x071F, 0x073E, 0x077F, 0x079F, 0x079F, 0x07BF, 0x07DF, 0x07DF, 0x07FF, 0x36DD, 0xD355, 0xD355, 0xD355, 0xD335, 0x699A, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0xB8B2, 0xC091, 0xC0B1, 0x7A96, 0x06BF, 0x079F, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x82F5, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0x60F1, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x20CD, 0x10D2, 0x08D4, 0x08F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x011A, 0x0119, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AF, 0x08F6, 0x0119, 0x0119, 0x00F9, 0x08F4, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x00F8, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x08F7, 0x18CE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CF, 0x28CF, 0x28EF, 0x3910, 0xB314, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD355, 0xBBD6, 0x5DFB, 0x0FBF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0x5D9A, 0xB315, 0xD254, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA33, 0xD233, 0xCA33, 0xCA33, 0x64D9, 0x077F, 0x073F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06BF, 0x06BE, 0x069F, 0x069F, 0x067E, 0x065E, 0x065E, 0x063E, 0x063E, 0x061E, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x055E, 0x055E, 0x051E, 0x04FE, 0x04DE, 0x049E, 0x043D, 0x03DE, 0x03BE, 0x039E, 0x037E, 0x03FE, 0x05FE, 0x069E, 0x069E, 0x06BE, 0x06FE, 0x071E, 0x073F, 0x075F, 0x079F, 0x079F, 0x07DF, 0x07DF, 0x07DF, 0x07FF, 0xBBF6, 0xD355, 0xD335, 0xD335, 0xC2F5, 0x083F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x9095, 0xC8B1, 0xC8B1, 0x91F5, 0x067F, 0x06FF, 0x073F, 0x075F, 0x077F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0x80F2, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20CD, 0x20AE, 0x18AD, 0x18AE, 0x20AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AE, 0x0117, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x00F6, 0x011A, 0x0117, 0x18CE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18D0, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CE, 0x08F7, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x3110, 0xB314, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0x9C77, 0x563B, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x1F7E, 0x65DB, 0x7CF9, 0x9C57, 0x9C57, 0x9C57, 0x9C57, 0x9C37, 0x9C37, 0x9C37, 0x9C37, 0x7539, 0x6D7A, 0x6579, 0x5DBB, 0x36BD, 0x36BD, 0x36BC, 0x2EFD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x0FBF, 0x36BD, 0x5D9A, 0x8C37, 0xD274, 0xD273, 0xD254, 0xCA53, 0xD254, 0xD253, 0xCA33, 0xD233, 0xCA34, 0xCA13, 0xCA33, 0x8418, 0x075F, 0x073F, 0x071F, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06DF, 0x06BF, 0x06BF, 0x069E, 0x069F, 0x067E, 0x067E, 0x065E, 0x065E, 0x063E, 0x061E, 0x061E, 0x05FE, 0x05DE, 0x05DE, 0x05BE, 0x05BE, 0x057E, 0x055E, 0x051E, 0x051E, 0x04FE, 0x04BE, 0x045E, 0x03FE, 0x03BE, 0x039E, 0x037E, 0x037E, 0x035E, 0x033E, 0x035E, 0x061D, 0x067E, 0x067E, 0x069E, 0x06BE, 0x06FE, 0x073F, 0x075F, 0x077F, 0x079F, 0x07DF, 0x07DF, 0x07FF, 0x7D59, 0xD335, 0xD335, 0xD335, 0xD314, 0x699A, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x60D8, 0xC0B1, 0xC0B1, 0xB8F2, 0x05DF, 0x061F, 0x065F, 0x06DF, 0x073F, 0x077F, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x363C, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0x90D1, 0x3911, 0x30F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x00F8, 0x011A, 0x00F8, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F9, 0x0119, 0x0119, 0x011A, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x28CE, 0x28CE, 0x30EF, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xD355, 0x9C77, 0x3EDD, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x659A, 0xD315, 0xD314, 0xD315, 0xD314, 0xD314, 0xD314, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2F4, 0xCAD4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA73, 0xCA73, 0xD274, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xAB15, 0x0EDF, 0x06FF, 0x06FF, 0x06DF, 0x06DF, 0x06BF, 0x06BF, 0x06DF, 0x06BF, 0x069F, 0x069F, 0x067E, 0x067F, 0x067E, 0x065E, 0x063F, 0x061E, 0x061E, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x055E, 0x053E, 0x051E, 0x04FE, 0x04DE, 0x049E, 0x043E, 0x03BE, 0x039E, 0x039E, 0x035E, 0x035E, 0x033E, 0x033E, 0x031E, 0x02FE, 0x037E, 0x05FE, 0x065E, 0x067E, 0x069E, 0x06DE, 0x06FE, 0x075F, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0x271D, 0xD335, 0xD314, 0xD315, 0xD315, 0xC2D5, 0x083F, 0x001F, 0x001F, 0x001F, 0x001F, 0x009F, 0x60D8, 0xC0B1, 0xC0B2, 0xC0B1, 0x04BF, 0x053F, 0x05BF, 0x067F, 0x06DF, 0x075F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0x98D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18CE, 0x20AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x011A, 0x08F7, 0x10D0, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D2, 0x0118, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CE, 0x20CE, 0x30EF, 0xB314, 0xD375, 0xD375, 0xD375, 0xD375, 0xD355, 0xD375, 0xAC37, 0x36DD, 0x07FF, 0x07FF, 0x07FF, 0x0EBD, 0x1D7B, 0x1C99, 0x32F5, 0x3A75, 0x6193, 0x69B3, 0x79F4, 0x8A14, 0xB294, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xD274, 0xCA53, 0xCA54, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x8B97, 0x35FD, 0x5D7B, 0x6D3A, 0x6D3A, 0x5D5B, 0x35FD, 0x06BF, 0x0E7E, 0x457C, 0x6C99, 0x6479, 0x6459, 0x4CBA, 0x0E1E, 0x063E, 0x063E, 0x061E, 0x05FE, 0x05FE, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055E, 0x051E, 0x051E, 0x04FE, 0x04DE, 0x047E, 0x03DE, 0x03BE, 0x037E, 0x037F, 0x035E, 0x033E, 0x033E, 0x031E, 0x02FE, 0x02FE, 0x02FE, 0x02DE, 0x03FE, 0x05BE, 0x063E, 0x065E, 0x069E, 0x06DE, 0x071F, 0x073E, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0xBBB6, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0x697A, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x48FA, 0xC0B1, 0xC0B1, 0xC0B1, 0x331C, 0x047F, 0x053F, 0x05FF, 0x069F, 0x073F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9A14, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x20CF, 0x20AE, 0x18CF, 0x08F6, 0x011A, 0x0119, 0x0119, 0x08F4, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0119, 0x0119, 0x0119, 0x08F6, 0x10D2, 0x10D0, 0x18D0, 0x18D1, 0x10D2, 0x00F8, 0x0119, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x9273, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xC3B6, 0x5DFB, 0x07FF, 0x0E3B, 0x1C98, 0x2AD5, 0x3911, 0x3911, 0x3912, 0x4111, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4933, 0x5173, 0x79D3, 0x9A54, 0xC294, 0xD2F4, 0xD2D5, 0xCAD4, 0xD2D4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xCA73, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0x99D4, 0x6358, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD375, 0x06BF, 0x5CFA, 0xD2B4, 0xCA94, 0xCA33, 0xCA13, 0xC9D3, 0xB9D3, 0x4C5A, 0x061E, 0x061E, 0x05DE, 0x05DE, 0x05BE, 0x059E, 0x059E, 0x057E, 0x053E, 0x051E, 0x051D, 0x04DE, 0x04BE, 0x043E, 0x03BE, 0x03BE, 0x037F, 0x0B7E, 0x337C, 0x333C, 0x335C, 0x333C, 0x333C, 0x331C, 0x331C, 0x32FC, 0x32FC, 0x32DC, 0x2B7C, 0x05DE, 0x061E, 0x065E, 0x069E, 0x06DE, 0x071F, 0x073F, 0x077F, 0x07BF, 0x07DF, 0x07DF, 0x84F9, 0xD314, 0xCB14, 0xCAF4, 0xD2D5, 0xB275, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x08DF, 0xB8D2, 0xC0B1, 0xC0B1, 0x3A7B, 0x03FF, 0x04DF, 0x05BF, 0x067F, 0x071F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7B77, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x4111, 0x38F1, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CF, 0x20CF, 0x20AE, 0x20CF, 0x0918, 0x013A, 0x011A, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AE, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0118, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x08F6, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0139, 0x00F9, 0x10D2, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x7A32, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0x9C78, 0x261B, 0x1B96, 0x3171, 0x30F0, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x3912, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4132, 0x4912, 0x4132, 0x6172, 0x81F3, 0xAA73, 0xCAD4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xD274, 0xCA54, 0xD274, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA33, 0xCA33, 0xD233, 0xC234, 0x7994, 0x5975, 0xB315, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xC375, 0x067F, 0x067F, 0x6C79, 0xCA33, 0xCA13, 0xC9D3, 0xC992, 0xC952, 0xC912, 0x34BB, 0x05FE, 0x05DE, 0x05BE, 0x059E, 0x055E, 0x055E, 0x053E, 0x051E, 0x04FE, 0x249D, 0x347B, 0x6BFA, 0x7B99, 0x9B98, 0xAB97, 0xDB95, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD396, 0xD395, 0xBBD6, 0x9C37, 0x8499, 0x6D1A, 0x363C, 0x1EDD, 0x079F, 0x07BF, 0x07DF, 0x4E1B, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0x40FC, 0x001F, 0x001F, 0x001F, 0x003F, 0x009F, 0x78D7, 0xC0B1, 0xC0B1, 0x61D8, 0x03BF, 0x049F, 0x057F, 0x065F, 0x071F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xB8D1, 0xB8B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x4111, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CF, 0x20AE, 0x10F3, 0x013A, 0x0119, 0x0139, 0x0119, 0x0119, 0x0119, 0x011A, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18CE, 0x10D2, 0x08F3, 0x08F4, 0x10D1, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x10F2, 0x00F7, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F5, 0x10D0, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x5170, 0xD395, 0xD375, 0xD375, 0xD375, 0xD355, 0x6519, 0x22B3, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4132, 0x4112, 0x4952, 0x79B3, 0xA233, 0xD2B4, 0xCAB4, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA74, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xCA54, 0xD274, 0xD253, 0xCA54, 0xCA54, 0xCA33, 0xD233, 0xCA34, 0xCA33, 0xCA33, 0xA1D3, 0x5954, 0x5954, 0x79F5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD335, 0x8C18, 0x067F, 0x065F, 0x063F, 0xA2D5, 0xC9D3, 0xC972, 0xC952, 0xC111, 0xC8D1, 0x8A55, 0x05DE, 0x05BE, 0x059E, 0x057E, 0x055E, 0x34DC, 0x6C5A, 0xA3F7, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD335, 0xD335, 0xD335, 0xBBB6, 0x84D9, 0x4E1B, 0x465C, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0x81D8, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x6098, 0xC0B1, 0xC0D1, 0x59B8, 0x035F, 0x045F, 0x055F, 0x063F, 0x06FF, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x363C, 0xC0D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x58F1, 0x3911, 0x30F0, 0x3110, 0x30CF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x08F6, 0x013A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x00F9, 0x08F8, 0x0118, 0x18AD, 0x18AD, 0x18AD, 0x00F8, 0x00F8, 0x08F8, 0x0118, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00FA, 0x00F8, 0x08F7, 0x08F7, 0x18B0, 0x18AD, 0x18AE, 0x08F4, 0x0119, 0x08F8, 0x08F8, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x10D4, 0x10D0, 0x18AD, 0x20AD, 0x08F8, 0x10D3, 0x18AD, 0x18AD, 0x10F4, 0x10D1, 0x18AD, 0x18AD, 0x08F8, 0x00F7, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F8, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AE, 0x20CE, 0x20AE, 0x28EE, 0xCB55, 0xD375, 0xD375, 0xD375, 0xBB14, 0x34F9, 0x2930, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4111, 0x3931, 0x4112, 0x4111, 0x6993, 0x91F2, 0xC254, 0xCA93, 0xCA94, 0xCA94, 0xCA74, 0xCA74, 0xD274, 0xCA73, 0xD273, 0xCA73, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xCA33, 0xCA34, 0xA1F3, 0x6973, 0x4953, 0x5134, 0x5154, 0xAAF5, 0xD395, 0xD395, 0xD395, 0xD375, 0xD335, 0xD314, 0x5CDA, 0x065F, 0x063F, 0x063F, 0xB254, 0xC972, 0xC952, 0xC112, 0xC8D1, 0xC0B1, 0xC0B1, 0x05BE, 0x059E, 0x2D1C, 0x9438, 0xCBB6, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCA94, 0x087F, 0x003F, 0x001F, 0x001F, 0x001F, 0x385B, 0xC0B1, 0xC0B1, 0x9135, 0x031F, 0x043F, 0x053F, 0x063F, 0x071F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB8D1, 0x5911, 0x3911, 0x38F0, 0x30F0, 0x30CF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x0917, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x011A, 0x08F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18CE, 0x0118, 0x0119, 0x011A, 0x00F7, 0x08F7, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x20AD, 0x10D1, 0x10D0, 0x18AD, 0x08D5, 0x10D1, 0x18AD, 0x20AE, 0x00F7, 0x18AD, 0x18AE, 0x18AD, 0x08F7, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F8, 0x18AE, 0x18AD, 0x18AE, 0x0118, 0x18AE, 0x18AD, 0x08F4, 0x18D0, 0x18AD, 0x18AD, 0x10D1, 0x10D5, 0x18AE, 0x18AD, 0x08F5, 0x10D1, 0x20AD, 0x18AD, 0x00F8, 0x08F7, 0x18AF, 0x18AD, 0x08D4, 0x10D1, 0x18AD, 0x18AE, 0x18AD, 0x20AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0118, 0x011A, 0x00F9, 0x0119, 0x00F9, 0x10D2, 0x20AD, 0x18CD, 0x20AE, 0x18AD, 0x20AE, 0x20CE, 0x20CE, 0x8252, 0xD375, 0xD375, 0xD375, 0x9A93, 0x30EF, 0x20CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x6972, 0x81D2, 0xAA13, 0xBA33, 0xCA54, 0xCA74, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xB213, 0xA1F3, 0x8193, 0x5152, 0x4932, 0x4933, 0x4933, 0x4933, 0x5174, 0xD395, 0xD395, 0xD396, 0xD375, 0xD334, 0xD2F5, 0xD2B4, 0x2D9D, 0x063F, 0x063F, 0x061F, 0xC993, 0xC952, 0xC911, 0xC8F1, 0xC0B1, 0xC0B1, 0xB8D1, 0x059E, 0x057E, 0xABF7, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD315, 0xD335, 0xCB15, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0x411C, 0x003F, 0x003F, 0x001F, 0x001F, 0x203C, 0xC0B1, 0xC0B1, 0x9135, 0x02FF, 0x041F, 0x051F, 0x061F, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xA1B3, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x68F1, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CF, 0x20CE, 0x10F3, 0x0119, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x00F9, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x10F4, 0x08F7, 0x18AD, 0x18AE, 0x18AD, 0x08F8, 0x20AE, 0x18AD, 0x18AD, 0x10D1, 0x10F4, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F7, 0x18AD, 0x18AD, 0x10D1, 0x08F6, 0x18AD, 0x20AD, 0x08F4, 0x10D3, 0x18D1, 0x18D1, 0x08F5, 0x18D2, 0x18AD, 0x20AD, 0x08F4, 0x10D1, 0x18AD, 0x18AD, 0x08F7, 0x18AF, 0x08F7, 0x18AD, 0x08F4, 0x10D1, 0x18AD, 0x18AD, 0x208E, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x10D2, 0x00F9, 0x0119, 0x0119, 0x011A, 0x011A, 0x10D2, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x20CE, 0x412F, 0xD375, 0xD375, 0xD375, 0x71D1, 0x20CE, 0x28CF, 0x20CF, 0x28CE, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3110, 0x3110, 0x38F0, 0x30F0, 0x3111, 0x3111, 0x38F1, 0x38F1, 0x38F0, 0x3910, 0x3910, 0x3910, 0x3911, 0x3911, 0x3911, 0x3910, 0x6152, 0x6152, 0x5131, 0x3911, 0x3911, 0x3911, 0x3912, 0x4112, 0x4132, 0x4112, 0x4932, 0x4932, 0x8A34, 0xD395, 0xD395, 0xD375, 0xD335, 0xD2F4, 0xCAD4, 0xB2F6, 0x065F, 0x061F, 0x061F, 0x34DC, 0xC952, 0xC912, 0xC8D2, 0xC0B1, 0xC0D1, 0xB8D1, 0x89B4, 0x2BBA, 0x4216, 0x5154, 0x5154, 0x4954, 0x5154, 0x6194, 0x71D4, 0x69F4, 0x71D3, 0x69D4, 0x71D3, 0x7A14, 0x8A75, 0x9274, 0x9254, 0x9254, 0x9A95, 0xB315, 0xBB14, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD315, 0xD2F4, 0xCB14, 0xD2F4, 0xD2F4, 0xD2D4, 0xCAD4, 0xCAB4, 0xD2B4, 0xCAB4, 0xCA94, 0xCA94, 0x81B8, 0x005F, 0x005F, 0x003F, 0x001F, 0x001F, 0xA8B3, 0xC0B1, 0xB0D2, 0x02DF, 0x03FF, 0x051F, 0x061F, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8A95, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F2, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CF, 0x0918, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AD, 0x10D0, 0x00FA, 0x0119, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x08F7, 0x18D1, 0x18AD, 0x20AD, 0x08F8, 0x18AD, 0x18AD, 0x18AD, 0x18D1, 0x08D4, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AE, 0x00FA, 0x08F8, 0x00F7, 0x08F6, 0x18AE, 0x18AD, 0x18AD, 0x08F4, 0x08F6, 0x08D4, 0x08F6, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x10D1, 0x18AE, 0x18AE, 0x08F8, 0x18AD, 0x08F3, 0x10D3, 0x10D5, 0x10D0, 0x18AD, 0x18AD, 0x20AE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x20AE, 0x20CD, 0x20AE, 0x20CD, 0x9272, 0xD375, 0xC334, 0x61D1, 0x20CF, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x30F0, 0x3110, 0x3110, 0x30F0, 0x3110, 0x38F0, 0x30F0, 0x38F0, 0x3111, 0x38F0, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3912, 0x4111, 0x4132, 0x4132, 0xB2F5, 0xD395, 0xD375, 0xD355, 0xD2F4, 0xD2B4, 0xD274, 0x83B8, 0x063F, 0x061F, 0x061E, 0x6398, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8B1, 0xB8D1, 0x7933, 0x5153, 0x5134, 0x5154, 0x5133, 0x4953, 0x4933, 0x4933, 0x4933, 0x4133, 0x4933, 0x4932, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4933, 0x4933, 0x4933, 0x61B3, 0x7A34, 0x9A95, 0xB2F5, 0xD375, 0xD375, 0xD355, 0xD355, 0xD355, 0xD335, 0xD335, 0xD314, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xD294, 0xD294, 0xD274, 0xCA74, 0xC254, 0x007F, 0x005F, 0x005F, 0x003F, 0x001F, 0x5878, 0xB8D1, 0xC0B1, 0x02BF, 0x03BF, 0x04FF, 0x05FF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6478, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CF, 0x0917, 0x011A, 0x011A, 0x0119, 0x08F4, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x10F3, 0x0119, 0x0119, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18CE, 0x10D1, 0x18CF, 0x18AD, 0x10D1, 0x10F4, 0x18AD, 0x18AD, 0x08F7, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F8, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x18D1, 0x18AD, 0x18AD, 0x08F6, 0x18CF, 0x18AE, 0x20AE, 0x10D4, 0x18D1, 0x18AD, 0x20AE, 0x00F8, 0x18AD, 0x18AD, 0x08F7, 0x08F6, 0x18B1, 0x18AE, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20CD, 0x18CE, 0x20AE, 0x390F, 0xD375, 0xCB35, 0x414F, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30EF, 0x30F0, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x28F0, 0x30F0, 0x30EF, 0x3110, 0x30F0, 0x30D0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F1, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3910, 0x3911, 0x38F1, 0x3911, 0x3912, 0x4952, 0xD395, 0xD375, 0xD335, 0xD2F4, 0xD2B4, 0xD274, 0xCA33, 0x4C9A, 0x05FF, 0x061F, 0x05FF, 0xA1F4, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA0F1, 0x5134, 0x4933, 0x4933, 0x4933, 0x4933, 0x4933, 0x4932, 0x4932, 0x4932, 0x4132, 0x4132, 0x4132, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4132, 0x4132, 0x4132, 0x4133, 0x4933, 0x4932, 0x4953, 0x6193, 0x8214, 0xA274, 0xC315, 0xD335, 0xD314, 0xD315, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xCAB4, 0xCAB4, 0xCA94, 0xCA74, 0xCA74, 0xCA74, 0xCA54, 0x20FD, 0x009F, 0x007F, 0x005F, 0x003F, 0x105D, 0xC0B1, 0xC0D1, 0x029F, 0x03BF, 0x04DF, 0x05FF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x54D9, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CF, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x00F7, 0x00F9, 0x0117, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x011A, 0x0119, 0x08D4, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AF, 0x0117, 0x10F4, 0x00F8, 0x18AF, 0x18AD, 0x18AD, 0x08F7, 0x08F4, 0x10D5, 0x00F7, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08F8, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x10D1, 0x18AD, 0x18CD, 0x10D1, 0x10D3, 0x18AD, 0x18AD, 0x08F4, 0x10D1, 0x18AD, 0x18AD, 0x08F8, 0x18AE, 0x18AD, 0x18AF, 0x00FA, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x10D2, 0x011A, 0x0119, 0x00FA, 0x0119, 0x011A, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AE, 0x61D0, 0xBB14, 0x412F, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x28CE, 0x20CE, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28CF, 0x28F0, 0x30D0, 0x28EF, 0x28CF, 0x30CF, 0x30F0, 0x30D0, 0x30D0, 0x28F0, 0x30F0, 0x30F0, 0x30F0, 0x30D0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x61B2, 0xD375, 0xD335, 0xD2F4, 0xCAD4, 0xCA74, 0xD233, 0xCA13, 0x1D9D, 0x05FF, 0x05FF, 0x1D3D, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0x6132, 0x4933, 0x4933, 0x4932, 0x4132, 0x4112, 0x4112, 0x4112, 0x4132, 0x4112, 0x4111, 0x4111, 0x4112, 0x4112, 0x4111, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x3912, 0x4132, 0x4112, 0x4112, 0x4112, 0x4912, 0x4132, 0x4132, 0x4932, 0x4933, 0x4953, 0x4933, 0x6173, 0x8A14, 0xAA74, 0xCAF4, 0xD2F5, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD294, 0xCA94, 0xCA73, 0xD274, 0xD253, 0xD254, 0x597A, 0x00BF, 0x00BF, 0x009F, 0x009F, 0x005F, 0xA8B3, 0xC0B1, 0x31FC, 0x039F, 0x04DF, 0x05DF, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x2E3C, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18CE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x00F9, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18B1, 0x18CE, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x10D0, 0x10D1, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x10D0, 0x18AE, 0x18AD, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x188D, 0x18AD, 0x18AE, 0x10D0, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10D2, 0x00F9, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AF, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AF, 0x18AF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AE, 0x390F, 0x28CE, 0x20AE, 0x20CE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28EF, 0x28EF, 0x28CF, 0x28EF, 0x28EF, 0x30EF, 0x28EF, 0x28EF, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x30F0, 0x3911, 0x71F2, 0xD335, 0xD2F4, 0xD2B4, 0xCA74, 0xD233, 0xCA13, 0xA295, 0x05FF, 0x05FF, 0x05FF, 0x5399, 0xC0D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0x7912, 0x4952, 0x4132, 0x4112, 0x4132, 0x4132, 0x4132, 0x4112, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F1, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4111, 0x4112, 0x4112, 0x4112, 0x4112, 0x4132, 0x4932, 0x4932, 0x4933, 0x4933, 0x5133, 0x6194, 0x9A34, 0xC2B4, 0xD2B5, 0xD2B3, 0xCAB4, 0xD294, 0xD294, 0xCA93, 0xD274, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0x81D8, 0x00DF, 0x00DF, 0x00DF, 0x00BF, 0x00BF, 0x68B7, 0xB8D1, 0x31DC, 0x033F, 0x049F, 0x05DF, 0x06FF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x26BD, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D2, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F1, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x08D3, 0x08F3, 0x10D2, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F7, 0x011A, 0x0119, 0x0118, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18B0, 0x0118, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x011A, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x20CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28CF, 0x28EF, 0x28F0, 0x28F0, 0x30F0, 0x30F0, 0x38F0, 0x8213, 0xD2F5, 0xCAD4, 0xD274, 0xCA53, 0xC9F3, 0xC9D2, 0x7398, 0x05FF, 0x05FF, 0x05DF, 0xA953, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x98F2, 0x4132, 0x4132, 0x4112, 0x4111, 0x4111, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x38F0, 0x38F0, 0x38F0, 0x38F0, 0x3911, 0x38F0, 0x38F0, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x3911, 0x4112, 0x4112, 0x4112, 0x4132, 0x4132, 0x4933, 0x4933, 0x4933, 0x5153, 0x5974, 0x9214, 0xCA94, 0xD294, 0xCA94, 0xD274, 0xCA74, 0xD274, 0xCA53, 0xCA54, 0xCA53, 0xCA34, 0x99F6, 0x011F, 0x011F, 0x00FF, 0x00FF, 0x00FF, 0x38DB, 0xC0B1, 0x28FC, 0x02DF, 0x047F, 0x059F, 0x06DF, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x38F0, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x011A, 0x011A, 0x00F9, 0x011A, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x0117, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x00F9, 0x0119, 0x00F9, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x310E, 0x7A32, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD335, 0xD2B4, 0xCA94, 0xCA33, 0xD1F3, 0xC9D3, 0xC993, 0xC972, 0xC992, 0xC972, 0xC932, 0xC0D1, 0xC0B1, 0xB8D1, 0xB0D2, 0xB9F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x015F, 0x013F, 0x013F, 0x013F, 0x011F, 0x093F, 0xC0B1, 0x311C, 0x01BF, 0x03FF, 0x059F, 0x069F, 0x079F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x10F2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x18AF, 0x18AD, 0x18AD, 0x18AE, 0x18B0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x20AD, 0x18AD, 0x496F, 0xAAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD2F4, 0xCA74, 0xCA33, 0xCA13, 0xC9D3, 0xC992, 0xC952, 0xC111, 0xC0D1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xCA53, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x097F, 0x017F, 0x015F, 0x017F, 0x015F, 0x015F, 0x88F5, 0x293C, 0x013F, 0x02DF, 0x053E, 0x067F, 0x077F, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9234, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x18AF, 0x18CD, 0x18AE, 0x10D0, 0x0118, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20EE, 0x8252, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD3B5, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD2B4, 0xD233, 0xCA13, 0xC9B3, 0xC992, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8B1, 0xB8D1, 0xB8D1, 0xC253, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCA13, 0x31BC, 0x01BF, 0x019F, 0x019F, 0x019F, 0x019F, 0x5139, 0x315C, 0x017F, 0x01BF, 0x045E, 0x063E, 0x077F, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8A95, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F9, 0x08F7, 0x18AD, 0x20AD, 0x10D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x00FA, 0x0119, 0x0119, 0x011A, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD4F8, 0xD65C, 0xD6DD, 0xD6FD, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xCB15, 0xCA13, 0xC9D3, 0xC992, 0xC932, 0xC911, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC397, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xC9F3, 0x31FC, 0x01DF, 0x01DF, 0x01DF, 0x01DF, 0x01DF, 0x01BF, 0x01DF, 0x01BF, 0x01BF, 0x02DF, 0x05FD, 0x073E, 0x07FE, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x8AB5, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB8D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08D5, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F9, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18B0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x10D0, 0x00F8, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AE, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x28EE, 0xCB55, 0xD375, 0xD395, 0xD395, 0xD3D6, 0xD5DB, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xDFFF, 0xCA13, 0xC9B3, 0xC992, 0xC952, 0xC912, 0xC0D1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB0F1, 0xBA95, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9F3, 0x31FD, 0x021F, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01FF, 0x01DF, 0x01FF, 0x051D, 0x071D, 0x07FD, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x6BF7, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x78F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00F7, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x0119, 0x011A, 0x00F8, 0x18B0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x28EE, 0xB314, 0xD395, 0xD395, 0xD395, 0xD477, 0xD77E, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xC9D3, 0xC992, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB152, 0xD79E, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9D3, 0x323C, 0x023F, 0x023F, 0x021F, 0x023F, 0x023F, 0x021F, 0x021F, 0x021F, 0x021F, 0x021F, 0x037E, 0x06DC, 0x07FD, 0x07FD, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0F1, 0x7911, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AE, 0x18AE, 0x011A, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x00F9, 0x18AF, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D5, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x8252, 0xD395, 0xD395, 0xD396, 0xD4B8, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xC972, 0xC952, 0xC912, 0xC8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xD63C, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xDFFF, 0xDFFF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xDFFF, 0xD7FF, 0xDFFF, 0xD539, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC9D3, 0x325C, 0x027F, 0x025F, 0x025F, 0x025F, 0x023F, 0x025F, 0x025F, 0x023F, 0x023F, 0x023F, 0x029F, 0x067C, 0x07FC, 0x07FC, 0x07FE, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB8D1, 0x70F1, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x011A, 0x011A, 0x0118, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x10D0, 0x0118, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x10CF, 0x0119, 0x0119, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x496F, 0xD395, 0xD395, 0xD395, 0xD457, 0xD7BF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCF3E, 0xC67C, 0xC53A, 0xC951, 0xC912, 0xC0D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0F1, 0xBB97, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD65B, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD396, 0xD395, 0xC9B3, 0x327C, 0x029F, 0x029F, 0x029F, 0x029F, 0x027F, 0x027F, 0x027F, 0x027F, 0x027F, 0x025F, 0x027F, 0x05BC, 0x07DB, 0x07FC, 0x07FD, 0x07FF, 0x07FF, 0x07FF, 0x5C78, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0x58F1, 0x3911, 0x3111, 0x30F0, 0x28F0, 0x28F0, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D1, 0x18AD, 0x18AE, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F9, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18D0, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18CF, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x0117, 0x18CE, 0x18AE, 0x18D0, 0x0118, 0x00F9, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xA2D3, 0xD395, 0xD395, 0xD3D6, 0xD75E, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFDF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7DF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xCFFF, 0xCFFF, 0xD7FF, 0xCFFF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xCFFF, 0xD7FF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCFFF, 0xD7DF, 0xACD8, 0x8191, 0x9151, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA8F1, 0xA972, 0xD77E, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xCFFF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7DF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD7FF, 0xD7DF, 0xD65C, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC193, 0x0A7F, 0x02FF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x029F, 0x027F, 0x029F, 0x027F, 0x04DD, 0x07BB, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x07FF, 0x3DBB, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0x5911, 0x3911, 0x30F0, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x20AD, 0x08F5, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x18D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x10D0, 0x00F8, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x20AD, 0x10D0, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x310E, 0xD395, 0xD375, 0xD375, 0xD5BA, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5B, 0xBE3C, 0xB57A, 0xACB8, 0xBDBB, 0xC63C, 0xBE3B, 0xC71E, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC77E, 0xBE5C, 0xB5DB, 0xACB8, 0xAC98, 0xBD5A, 0xBE3C, 0xC61C, 0xC69D, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xACB9, 0x8191, 0x9151, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA111, 0xA911, 0xBC78, 0xCFDF, 0xCFDF, 0xCFDF, 0xD7DF, 0xCFDF, 0xCF5E, 0xBE5C, 0xBE5C, 0xC63C, 0xC61C, 0xCEFD, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFFF, 0xCFDF, 0xD63B, 0xD375, 0xD395, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD375, 0xD395, 0xD375, 0xD375, 0xD375, 0xD395, 0x089F, 0x011F, 0x031F, 0x02FF, 0x02FF, 0x02DF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x02BF, 0x03FD, 0x079A, 0x07FA, 0x07FC, 0x07FE, 0x07FF, 0x07FF, 0x2E5C, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB8D1, 0x5912, 0x3911, 0x38F1, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x08F5, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D0, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AE, 0x0117, 0x011A, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18CE, 0x18AD, 0x18AD, 0x0118, 0x011A, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x79F1, 0xD355, 0xD355, 0xD355, 0xCF7E, 0xC7DF, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xCFBF, 0xBEFD, 0xACB8, 0x8A52, 0x9151, 0x9131, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0xA192, 0xAB96, 0xBE7D, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xCFDF, 0xCFBF, 0xC75E, 0xAD19, 0x92B4, 0x8971, 0x9151, 0x9931, 0x9931, 0x9911, 0x9911, 0xA111, 0x9931, 0xA111, 0x9911, 0xAB36, 0xBD5A, 0xC75E, 0xCFDF, 0xC7BF, 0xC7BF, 0xCFDF, 0xC7DF, 0xC7BF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFBF, 0xC7DF, 0xC7BF, 0xCFBF, 0xC7DF, 0xA4B8, 0x8191, 0x9151, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0xBE3B, 0xCFBF, 0xCFDF, 0xCFBF, 0xCFDF, 0xCFDF, 0xB5DA, 0x8A12, 0x8971, 0x9931, 0x9931, 0xA111, 0x9931, 0xAB35, 0xC75E, 0xCFBF, 0xCFDF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFBF, 0xC7DF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xC7DF, 0xCFDF, 0xCFDF, 0xCFDF, 0xCE1B, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x007F, 0x009E, 0x023F, 0x033F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x031F, 0x02FF, 0x02DF, 0x02DF, 0x02DF, 0x039E, 0x075A, 0x07F9, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x2E3C, 0xB8D2, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0x4911, 0x3911, 0x38F0, 0x30F0, 0x28F0, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x20AD, 0x20AD, 0x08F5, 0x00F9, 0x00FA, 0x0119, 0x011A, 0x0119, 0x10D2, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D0, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x00F9, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18CD, 0x0119, 0x00F9, 0x011A, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xA293, 0xD335, 0xD335, 0xCC98, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC75E, 0xA4B8, 0x8191, 0x9151, 0x9911, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xAB35, 0xBEFE, 0xC7BF, 0xC7BE, 0xC7BF, 0xB5DB, 0x89F1, 0x8971, 0x9931, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA132, 0x9911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA172, 0xBD3A, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BE, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xAC98, 0x8191, 0x9151, 0x9931, 0xA111, 0xA131, 0xA111, 0xA131, 0xA111, 0x9931, 0xBE1B, 0xC79F, 0xC7BF, 0xC7BF, 0xC7BF, 0xBEFD, 0x89F2, 0x8991, 0x9931, 0xA112, 0xA131, 0xA111, 0xA111, 0xA111, 0xAB97, 0xC7BF, 0xC7BF, 0xC7BE, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC7BF, 0xC6DD, 0xD375, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD335, 0xD334, 0xD335, 0xD335, 0x009F, 0x009F, 0x013F, 0x033F, 0x037F, 0x035F, 0x033F, 0x031F, 0x031F, 0x031F, 0x031F, 0x02FF, 0x02FF, 0x033F, 0x06F9, 0x07F9, 0x07FB, 0x07FD, 0x07FF, 0x07FF, 0x2E3C, 0xB8D2, 0xB0F1, 0xB8D1, 0xB0D1, 0xB0F1, 0xB0D1, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x3110, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18B0, 0x10F2, 0x10D3, 0x08D3, 0x08F3, 0x10F3, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x08F5, 0x0119, 0x00F9, 0x011A, 0x0119, 0x011A, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x011A, 0x011A, 0x00F9, 0x10CF, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x0119, 0x00F9, 0x011A, 0x011A, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F9, 0x0119, 0x0119, 0x0139, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xD315, 0xD315, 0xD314, 0xC5FB, 0xC79F, 0xC79E, 0xC7BF, 0xC7BF, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xBF9E, 0xBFBF, 0xBFBE, 0xB67C, 0x8A53, 0x8971, 0xA131, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA172, 0xB539, 0xBF9F, 0x9BF6, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xAB15, 0xBF3D, 0xC79F, 0xC7BE, 0xC79F, 0xC79F, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79E, 0xC79F, 0xC79E, 0xC79F, 0xC79E, 0xC79E, 0xC7BF, 0xC79F, 0xA4B8, 0x8191, 0x9151, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xBDFB, 0xC79F, 0xC79E, 0xC7BE, 0xC79F, 0xACF9, 0x8191, 0x9171, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA131, 0xA111, 0xBF3E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xC7BF, 0xC79E, 0xC79E, 0xC79E, 0xBFBF, 0xC79E, 0xC79E, 0xC79E, 0xBF9E, 0xC79F, 0xC79E, 0xBFBE, 0xC79E, 0xC6BD, 0xD355, 0xD2F5, 0xD315, 0xCB14, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD314, 0xD315, 0xD315, 0xD315, 0xD314, 0x007F, 0x007F, 0x00FF, 0x027F, 0x039F, 0x039F, 0x037F, 0x231D, 0x5259, 0x5A3A, 0x033F, 0x033F, 0x031F, 0x031F, 0x0699, 0x07F8, 0x07FA, 0x07FD, 0x07FF, 0x07FF, 0x363C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0x4112, 0x38F1, 0x3911, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x08F7, 0x011A, 0x011A, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x00F7, 0x10D1, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10F2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0118, 0x18B0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0915, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x0915, 0x00F9, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2F4, 0xCAF4, 0xD2F4, 0xC65C, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF7F, 0xB67C, 0x8A12, 0x8971, 0xA111, 0xA111, 0xA911, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA912, 0xA911, 0xA1F3, 0x8191, 0x9931, 0xA111, 0xA111, 0xA912, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA112, 0xA911, 0xAA54, 0xBF1D, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xB79E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA911, 0xB5FB, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9F, 0xA498, 0x8191, 0x9951, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA111, 0xA911, 0xB5FB, 0xBF7E, 0xBF9E, 0xBF9E, 0xBF9F, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBF9E, 0xBEBD, 0xD335, 0xCAF4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xCAF4, 0xD2F4, 0xD2F5, 0xCAF4, 0x007F, 0x007F, 0x00BF, 0x021F, 0x2ABD, 0x7A36, 0xB953, 0xC112, 0xC911, 0xC912, 0x0B3F, 0x035F, 0x035F, 0x033F, 0x05FA, 0x07F7, 0x07F9, 0x07FC, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0D1, 0xA0F1, 0x68F1, 0x4111, 0x30F0, 0x30F0, 0x28EF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x0119, 0x0119, 0x0118, 0x08F7, 0x08F6, 0x00F7, 0x0118, 0x0119, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x10D2, 0x00F9, 0x011A, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D4, 0x0118, 0x0119, 0x08F6, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x011A, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2D4, 0xD2D4, 0xD2D4, 0xBE5C, 0xB77E, 0xB79E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xB77E, 0xB79E, 0xBF7E, 0xAE7B, 0x89F2, 0x8971, 0xA111, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA912, 0xA911, 0xA911, 0xA111, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA111, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA912, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xAA34, 0xB71E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7F, 0xB77E, 0x9C97, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xB5DB, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xA478, 0x8191, 0x9951, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA8F1, 0xA911, 0xB5DB, 0xB77F, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xB77E, 0xBF7E, 0xBF7E, 0xB77E, 0xB77E, 0xBF7E, 0xBE9D, 0xCB75, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2D5, 0x007F, 0x007F, 0x30BB, 0x9955, 0xC931, 0xC932, 0xC932, 0xC912, 0xC0F2, 0xC8F2, 0x32FC, 0x037F, 0x037F, 0x037F, 0x059B, 0x07F7, 0x07F9, 0x07FC, 0x07FE, 0x07FF, 0x2E3C, 0xB8D1, 0xB0D1, 0xB0D2, 0xB0D1, 0xB0F1, 0x98F1, 0xB0F1, 0x88F1, 0x3110, 0x30F0, 0x30F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x0119, 0x00F7, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x00F7, 0x011A, 0x0119, 0x00F7, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x011A, 0x011A, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD2B4, 0xD2B4, 0xD2B4, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB71D, 0x8A53, 0x8191, 0xA111, 0xA8F1, 0xB0F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F2, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB2F5, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C78, 0x8191, 0x9951, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0x9C77, 0x8191, 0x9151, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xB5DB, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB77E, 0xB75E, 0xB71D, 0xCB96, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xCAB4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xCA94, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0x087E, 0x70F8, 0xC952, 0xC932, 0xC912, 0xC932, 0xC111, 0xC8F1, 0xC8F1, 0xC8D1, 0x331C, 0x03BF, 0x039F, 0x039F, 0x051B, 0x07D6, 0x07F7, 0x07FB, 0x07FE, 0x07FF, 0x2E3C, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xA0F1, 0xB0F1, 0xB0D1, 0x50F0, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0116, 0x0119, 0x0119, 0x08D5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D3, 0x00FA, 0x0119, 0x08F6, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AE, 0x10D2, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x011A, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x188D, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD294, 0xD294, 0xCA94, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0x9416, 0x8991, 0x9951, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xACF9, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF7E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5D, 0xB75E, 0xAF5E, 0xAF5E, 0x9C77, 0x8191, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xB75E, 0xB75E, 0xB75E, 0xB75E, 0x9C78, 0x8991, 0x9951, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB5BB, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xB75E, 0xB75E, 0xB75E, 0xAF5E, 0xAF5E, 0xB75E, 0xAF5E, 0xAF1D, 0xCB75, 0xCA93, 0xD294, 0xCA74, 0xCA94, 0xCA74, 0xD274, 0xCA74, 0xD294, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA93, 0xCA94, 0xD293, 0xCA74, 0x9915, 0xC932, 0xC932, 0xC932, 0xC912, 0xC111, 0xC8F2, 0xC0F2, 0xC8D1, 0xC8D1, 0x333C, 0x03FF, 0x03DF, 0x03BF, 0x04DC, 0x07D6, 0x07F7, 0x07FB, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0x90F1, 0x30F0, 0x28F0, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08D3, 0x0119, 0x0119, 0x10D1, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xD274, 0xD274, 0xCA53, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF5D, 0xAF3D, 0xAF3E, 0xA69C, 0x8191, 0x8191, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0D1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xAA13, 0xB418, 0xA438, 0x9AB4, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xAA74, 0xAC78, 0xACF9, 0x9B35, 0x9931, 0xA8F1, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F2, 0xB0D1, 0xB0F1, 0xA9B3, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0x9C77, 0x8191, 0x9931, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xADBB, 0xAF3E, 0xAF3E, 0xAF5D, 0xAF3E, 0x9477, 0x8191, 0x9951, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xADBA, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3D, 0xAF5E, 0xAF5E, 0xAF5E, 0xAF3D, 0xAF3D, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF5E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAF3E, 0xAEFD, 0xCB56, 0xCA53, 0xCA74, 0xD253, 0xD274, 0xD274, 0xD273, 0xCA73, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD274, 0xD254, 0xCA74, 0xCA54, 0xCA54, 0xCA74, 0xC932, 0xC932, 0xC932, 0xC912, 0xC912, 0xC912, 0xC0F1, 0xC8D1, 0xC8D1, 0xC8D1, 0x335C, 0x041F, 0x03FF, 0x03FF, 0x047D, 0x0795, 0x07F6, 0x07FA, 0x07FE, 0x07FF, 0x2E3C, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0D1, 0xB0F1, 0x40F0, 0x28CF, 0x28EF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CD, 0x00F8, 0x011A, 0x08F6, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x08D3, 0x08F3, 0x08F3, 0x18AF, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x00F6, 0x0119, 0x0118, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA53, 0xCA53, 0xCA53, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0x9457, 0x8191, 0x9931, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB1B3, 0xAD9A, 0xAF3D, 0xAF3D, 0xA73D, 0xA73D, 0x9DDA, 0x89D1, 0x9951, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB213, 0xAD9B, 0xA73E, 0xA73D, 0xAF3E, 0xAF3E, 0x9DDA, 0x81F2, 0x9171, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB8D1, 0xB8D2, 0xB0F1, 0xAD39, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3D, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73E, 0xAF3E, 0xAF1E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xA73E, 0xAF3E, 0xA73E, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xA73E, 0xA73D, 0xAF3D, 0xA73D, 0xAF3D, 0xA73E, 0xA73E, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xA73E, 0x9478, 0x8191, 0x9931, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB8D1, 0xAD9A, 0xA73E, 0xA73D, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xA73D, 0xA73D, 0xAF3E, 0xA73E, 0xA73D, 0xA73D, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xAF3D, 0xAF3E, 0xA73D, 0xA73D, 0xAF3D, 0xA73E, 0xAF3D, 0xAF3D, 0xAF3D, 0xA73E, 0xA73D, 0xA73D, 0xAF3D, 0xA73D, 0xAEDD, 0xC376, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA33, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD233, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0x309C, 0x005F, 0x58B9, 0xC912, 0xC111, 0xC8F1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0x337C, 0x045F, 0x041F, 0x041F, 0x045E, 0x0775, 0x07F5, 0x07FA, 0x07FE, 0x07FF, 0x2E3C, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0D1, 0x80F1, 0x28EF, 0x28CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x011A, 0x011A, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA13, 0xCA33, 0xCA13, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0x8A53, 0x8191, 0xA8F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB213, 0xA6BD, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0x9E1B, 0x81F1, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB1F3, 0xA6BD, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0x9E1B, 0x89F2, 0x8991, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB336, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71E, 0xA71D, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA73E, 0xA71D, 0xA73E, 0xA73D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA73D, 0xA73E, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA73E, 0xA73D, 0xA73D, 0xA71D, 0xA71D, 0x9477, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA59A, 0xA71D, 0xA73D, 0xA73E, 0xA71D, 0xA71D, 0xA71E, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71E, 0xA71D, 0xA73D, 0xA71D, 0xA73D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73D, 0xA73D, 0xA71D, 0xA73E, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xA71D, 0xBBF7, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA14, 0xD233, 0xCA33, 0x003F, 0x003F, 0x005F, 0x78D7, 0xC0F2, 0xC8F1, 0xC0D1, 0xC0D1, 0xC0D1, 0xC8B1, 0x4B1A, 0x047F, 0x045F, 0x043F, 0x045F, 0x0735, 0x07F4, 0x07F9, 0x07FE, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xA8F1, 0xB0F1, 0xB0D1, 0xB0F1, 0xA0F1, 0x28CF, 0x28EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x10D1, 0x08F3, 0x10F3, 0x10D2, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x10D3, 0x0119, 0x0119, 0x18CD, 0x18AD, 0x18AD, 0x18AF, 0x011A, 0x0119, 0x00F9, 0x08F6, 0x0119, 0x0119, 0x0119, 0x18AF, 0x20AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x10D3, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xCA13, 0xCA13, 0xCA13, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x8191, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9EFD, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xA5DB, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0x9F1D, 0x94F9, 0x8191, 0x9931, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB932, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1E, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E1B, 0x9457, 0x92D4, 0xA1F3, 0xA911, 0xB0F1, 0xB0F1, 0xA911, 0xB274, 0xB254, 0xB254, 0xABF7, 0xA5DB, 0xA6FD, 0xA6FD, 0xA71D, 0xA71D, 0x9F1D, 0x9F1D, 0xA6FD, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E7C, 0x9498, 0x8B14, 0x9A13, 0xA131, 0xA912, 0xB0F1, 0xA8F1, 0xB255, 0xB274, 0xB254, 0xAB97, 0xAD1A, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9457, 0x8191, 0xA131, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xA57A, 0x9F1D, 0xA71D, 0x9F1D, 0xA71D, 0x9E7C, 0x9DBA, 0xA59A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA57A, 0xA69C, 0x9F1D, 0x9F1D, 0x9F1D, 0xA71D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9F1D, 0x9E5C, 0x94B8, 0x8AF4, 0x9A13, 0xA131, 0xA8F1, 0xB0F1, 0xB0F1, 0xB932, 0xB274, 0xB254, 0xB336, 0xACB9, 0xA63C, 0x9F1D, 0xBBF7, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0x003F, 0x003F, 0x005F, 0x58B9, 0xC0F1, 0xC0D1, 0xC8D1, 0xC8B2, 0xC0B1, 0xC0B1, 0x62B8, 0x04BF, 0x047F, 0x047F, 0x045F, 0x0715, 0x07F4, 0x07F9, 0x07FD, 0x07FF, 0x2E3C, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xA8F1, 0xA8F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0x58F0, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x0117, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F6, 0x20AD, 0x20CD, 0x18AE, 0x08F3, 0x0119, 0x00F9, 0x18AE, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x10D4, 0x18AD, 0x18AD, 0x18AD, 0x00F6, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC9D3, 0xC9D3, 0xC9D3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x959A, 0x8191, 0x9151, 0xC0B1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB2B5, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8252, 0x8191, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB1F3, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9F1D, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x8A93, 0x8191, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xA63C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x94F8, 0x8A53, 0x9171, 0xB0F1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8B1, 0xB8B1, 0xC0B1, 0xC0D1, 0xC0D1, 0xB8D1, 0xC0D1, 0xB8B1, 0xB992, 0xACB9, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E5C, 0x8B96, 0x8991, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB932, 0xABF7, 0x9E9C, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9437, 0x8191, 0xA131, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xB8D1, 0xA57A, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9EFD, 0x9E9C, 0x8B96, 0x8971, 0xA131, 0xB8D1, 0xB8D1, 0xC0B1, 0xB8D1, 0xC0B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB8D1, 0xB8D1, 0xC0D1, 0xB335, 0xA63C, 0xBBD7, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9F3, 0xC9D3, 0x001F, 0x003F, 0x003F, 0x00DF, 0x88F6, 0xC8D1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0x62D9, 0x04FF, 0x04BF, 0x049F, 0x047F, 0x06B6, 0x07F3, 0x07F8, 0x07FD, 0x07FF, 0x2E3C, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0x98F2, 0xB0F1, 0xB0F1, 0xB0F1, 0x78F0, 0x90F1, 0x80D1, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x08F7, 0x0119, 0x011A, 0x08F4, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x08F3, 0x0119, 0x00F6, 0x18AD, 0x18AD, 0x18CD, 0x08F3, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x08F7, 0x0119, 0x08F5, 0x18CD, 0x18AD, 0x18AD, 0x08F6, 0x011A, 0x08F6, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0xC9B3, 0xC9B3, 0xC9B3, 0x9EDD, 0x96FD, 0x9EDD, 0x96FD, 0x9EFC, 0x96FD, 0x96FD, 0x9599, 0x8991, 0x9171, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xABD7, 0x9EFC, 0x96FD, 0x96FD, 0x96DD, 0x96FD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x9EFD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xAB76, 0x9EDD, 0x9EFD, 0x9EFD, 0x9EDD, 0x9EDD, 0x96DD, 0x9EFD, 0x9EDD, 0x96FD, 0x9EDD, 0x8C37, 0x8191, 0xA131, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xA55A, 0x96FD, 0x9EDD, 0x9EFD, 0x96FD, 0x963B, 0x8AF4, 0x8991, 0xA911, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xB992, 0xA55A, 0x9EDD, 0x9EFC, 0x96FD, 0x9EDD, 0x96FD, 0x9EFD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x96FD, 0x94F9, 0x81F1, 0x9171, 0xB8D2, 0xC0B1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB992, 0x9DBB, 0x96FD, 0x9EDD, 0x96FD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x9EDD, 0x96FD, 0x96FD, 0x9EFD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA55A, 0x96FD, 0x9EFD, 0x96FD, 0x9EFD, 0x9EFD, 0x96FD, 0x9EFD, 0x96FD, 0x9539, 0x81F1, 0x9171, 0xB0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB911, 0xACFA, 0xB458, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9D3, 0xC9D3, 0xC9B3, 0x001F, 0x003F, 0x003F, 0x00BF, 0x311C, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x6278, 0x053F, 0x04FF, 0x04BF, 0x049F, 0x0696, 0x07F2, 0x07F7, 0x07FC, 0x07FF, 0x2E3C, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x8912, 0xB0F1, 0xB0F1, 0xB0D1, 0x48F0, 0x28F0, 0x28EF, 0x28CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x011A, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x10D3, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x00F6, 0x18AD, 0x18AD, 0x208D, 0x08F3, 0x0119, 0x00F9, 0x18AE, 0x18AE, 0x18CE, 0x00F9, 0x0119, 0x08F3, 0x18AD, 0x20AE, 0x18AD, 0x08F6, 0x011A, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18CF, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC993, 0xC993, 0xC992, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8D79, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xABD7, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x95DA, 0x89F2, 0x8971, 0xB8D1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DC, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0x9931, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA499, 0x96DC, 0x96DD, 0x8C37, 0x8191, 0xA111, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x96DD, 0x8CD8, 0x8191, 0x9951, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xAC79, 0xACF9, 0xC992, 0xC993, 0xC9B2, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0xC992, 0xC992, 0xC992, 0xC993, 0xC993, 0xC993, 0x003F, 0x003F, 0x003F, 0x00BF, 0x011F, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x79D6, 0x051F, 0x051F, 0x04FF, 0x04BF, 0x0638, 0x07F1, 0x07F7, 0x07FC, 0x07FF, 0x2E3C, 0xB0F1, 0xB0F2, 0xB0F1, 0xB0F1, 0x80F2, 0xB0F1, 0xB0F1, 0xB0F2, 0x3110, 0x30F0, 0x28CF, 0x28EF, 0x20CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x011A, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18D1, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0118, 0x18AE, 0x18AD, 0x18AD, 0x18CE, 0x0119, 0x0119, 0x0118, 0x08F5, 0x00F8, 0x0119, 0x0119, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x00F8, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18D0, 0x0119, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CE, 0x0117, 0x011A, 0x0119, 0x0119, 0x011A, 0x00F7, 0x18CE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x10D2, 0x08F3, 0x10F3, 0x10D2, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC972, 0xC972, 0xC972, 0x8EBC, 0x8EBD, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8D7A, 0x8191, 0x9151, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D39, 0x8EBD, 0x8EDD, 0x8DBA, 0x81F2, 0x9171, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC0B1, 0xC8B2, 0xC8B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xA437, 0x8EBC, 0x8EDD, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBC, 0x8EBD, 0x8EBC, 0x8EBD, 0x8EBD, 0x8CD8, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC8B1, 0xA4D9, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC8B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0x9D3A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA131, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EDC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8CD8, 0x8191, 0x9951, 0xC8B1, 0xC0B1, 0xC8B1, 0xC8B2, 0xC8B1, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC8B1, 0xC8B1, 0xC8D1, 0xA478, 0xA4D9, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0xC972, 0x003F, 0x003F, 0x001F, 0x009F, 0x00DF, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x9174, 0x049F, 0x057F, 0x051F, 0x04FF, 0x0619, 0x07F1, 0x07F6, 0x07FC, 0x07FF, 0x35BB, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x6912, 0xB0F1, 0xB0F1, 0x98F1, 0x30F0, 0x30F0, 0x28EF, 0x28CF, 0x28EF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x10D3, 0x20AD, 0x18AD, 0x10D3, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18D0, 0x011A, 0x011A, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x10D2, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x18B0, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0119, 0x00F9, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F5, 0x011A, 0x0119, 0x0117, 0x00F7, 0x00F9, 0x0119, 0x08F5, 0x20AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x011A, 0x00FA, 0x011A, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x20AD, 0x18AE, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC952, 0xC952, 0xC952, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D59, 0x8191, 0x9171, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xABD7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA931, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC0F2, 0xABB7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8437, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D3A, 0x8EBC, 0x8E1B, 0x81F2, 0x8971, 0xB912, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8D1, 0xC112, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8F2, 0xC8D1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F1, 0xA498, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8DBA, 0x8991, 0x8991, 0xC0F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC8F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC0F2, 0xC8F1, 0xC0F1, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC132, 0x8E5C, 0x8C17, 0x8191, 0xA931, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F2, 0xC8F2, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C17, 0x8191, 0xA951, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC8F1, 0x9D5A, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBD, 0x8DBA, 0x81F2, 0x8991, 0xC111, 0xC8F1, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8F1, 0xC8F1, 0xC0F2, 0xC8D2, 0xC8F1, 0xC8F2, 0xC0F1, 0xC0F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F2, 0xC8F2, 0xC8F1, 0xC8F1, 0xC8F2, 0xC152, 0x95FB, 0xA4B8, 0xC152, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0x001F, 0x001F, 0x001F, 0x007F, 0x00DF, 0x68B7, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xA8F3, 0x041F, 0x057F, 0x053F, 0x051F, 0x05F9, 0x07F0, 0x07F6, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0x5912, 0xB0F1, 0xB0F1, 0x90F1, 0x30F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20AE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F4, 0x0119, 0x011A, 0x00F7, 0x00F8, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x0117, 0x0119, 0x08F6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x08F3, 0x00F6, 0x08F3, 0x18AF, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18CD, 0x20AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x0117, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0119, 0x0119, 0x08F3, 0x18CD, 0x20AE, 0x10D3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC932, 0xC932, 0xC932, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8D79, 0x8191, 0x9171, 0xC132, 0xC131, 0xC912, 0xC912, 0xC132, 0xC911, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC911, 0xC912, 0xC912, 0xC112, 0xC912, 0xC912, 0xABF7, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8EBC, 0x8C36, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8AD4, 0x8191, 0xB152, 0xC912, 0xC131, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC912, 0xC912, 0xC911, 0xC112, 0xC932, 0xC912, 0xC912, 0xC932, 0xC911, 0xC912, 0xC912, 0xC932, 0xC131, 0x9DBA, 0x8EBC, 0x96BC, 0x8EBC, 0x8EDC, 0x96BB, 0x8EBC, 0x8EDC, 0x82D4, 0x8191, 0xB932, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC112, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC131, 0xC912, 0xC132, 0xC131, 0xC912, 0xC912, 0xC911, 0xC911, 0xC131, 0xC912, 0xC912, 0xB356, 0x8C36, 0x8191, 0xA151, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC912, 0xC112, 0x9D59, 0x8EBC, 0x96BC, 0x8EBC, 0x8EBC, 0x8C37, 0x8191, 0xA951, 0xC912, 0xC912, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0x9D59, 0x8EBC, 0x8EBC, 0x8EBC, 0x96BC, 0x8EBC, 0x82F4, 0x8991, 0xB151, 0xC912, 0xC912, 0xC932, 0xC912, 0xC912, 0xC131, 0xC932, 0xC912, 0xC911, 0xC911, 0xC932, 0xC911, 0xC912, 0xC911, 0xC932, 0xC932, 0xC112, 0xC911, 0xC132, 0xC912, 0xC912, 0xC932, 0xB336, 0x96BC, 0xA4F9, 0xC192, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0xC932, 0x001F, 0x001F, 0x001F, 0x007F, 0x00BF, 0x009F, 0x90B5, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x0B9E, 0x053F, 0x057F, 0x053F, 0x05DA, 0x07EF, 0x07F5, 0x07FB, 0x07FF, 0x5478, 0xB0D1, 0xB0F1, 0xB0F1, 0x9111, 0x5912, 0xA8F1, 0xB0F1, 0x70F1, 0x30F0, 0x28EF, 0x20EF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x011A, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AE, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F8, 0x0119, 0x08F7, 0x18AE, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18D0, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x10D0, 0x20AE, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC912, 0xC912, 0xC912, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9EDB, 0x9578, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xB417, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA518, 0x9EDB, 0x96DB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9436, 0x8191, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x94D8, 0x8191, 0x9991, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC253, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xBAB5, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x9599, 0x8191, 0x91B1, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B5, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC972, 0xC952, 0xC952, 0xC972, 0xC1B2, 0x9436, 0x8191, 0xA972, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDB, 0x9EDB, 0x9EDB, 0x8C36, 0x8991, 0xA171, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA579, 0x9EDB, 0x9EDC, 0x9EDB, 0x9EDB, 0x9598, 0x8191, 0x9191, 0xC952, 0xC952, 0xC952, 0xC952, 0xC152, 0xC952, 0xC172, 0xC952, 0xC952, 0xC952, 0xC1F3, 0xC2B4, 0xB952, 0xC152, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xC952, 0xA61A, 0x9EDC, 0xA5DA, 0xC172, 0xC912, 0xC911, 0xC911, 0xC912, 0xC912, 0xC111, 0xC912, 0xC912, 0xC912, 0x001F, 0x001F, 0x001F, 0x005F, 0x007F, 0x007F, 0x6098, 0xC0B1, 0xB8B1, 0xC0B1, 0xC0B1, 0x2AFC, 0x04FF, 0x05BF, 0x055F, 0x05FB, 0x07CF, 0x07F4, 0x07FC, 0x07FF, 0x5C79, 0xB0F1, 0xB0F1, 0xB0F1, 0x8112, 0x5912, 0xB0F1, 0xB0F1, 0x68F1, 0x30F0, 0x30EF, 0x30CF, 0x28CF, 0x20CF, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AE, 0x18AD, 0x10D2, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AE, 0x18AD, 0x0119, 0x011A, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x00F6, 0x0119, 0x0119, 0x10D2, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x10D3, 0x0119, 0x0119, 0x08D6, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0x18AD, 0x18AE, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x20AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AE, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x20AD, 0x18AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x18D0, 0x18AD, 0x18AD, 0x10D0, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xC8F1, 0xC8F1, 0xC8F2, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6DA, 0xA6FA, 0x9D98, 0x8191, 0x9191, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC992, 0xB436, 0xA6FB, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD99, 0x8A32, 0x8991, 0xC192, 0xC992, 0xC992, 0xC972, 0xC992, 0xC992, 0xC973, 0xC992, 0xC992, 0xC992, 0xBC36, 0xA69A, 0xA6FA, 0xA6FA, 0xA69A, 0x9395, 0x8991, 0xB992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0xAD98, 0xA6DB, 0xA6DA, 0xA6FA, 0xA6FB, 0xA6FA, 0x9395, 0x8191, 0xB192, 0xC992, 0xC992, 0xC992, 0xC993, 0xC972, 0xC972, 0xC992, 0xC972, 0xC233, 0xAD98, 0xA6FA, 0xA6FB, 0xA639, 0x8A93, 0x9992, 0xC192, 0xC972, 0xC992, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC972, 0x9A93, 0x8191, 0xA992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6FA, 0xA6FB, 0xA6FA, 0xA6FA, 0x9436, 0x8191, 0xA992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xAD98, 0xA6DA, 0xA6DA, 0xA6FA, 0xA6DA, 0x8B95, 0x8191, 0xB192, 0xC972, 0xC992, 0xC972, 0xC992, 0xC992, 0xC972, 0xC992, 0xC972, 0xC294, 0xADF9, 0xA6FA, 0xA6DA, 0xA69A, 0x9334, 0x9191, 0xB992, 0xC992, 0xC993, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xC992, 0xB497, 0xAEFB, 0xAEFB, 0xB5D9, 0xC952, 0xC8F1, 0xC8F2, 0xC0F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0xC8F1, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x005F, 0x7897, 0xC0B1, 0xC0D1, 0xC0B1, 0xB8D1, 0x6238, 0x04DF, 0x05BF, 0x059F, 0x05FA, 0x07CE, 0x07F4, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0F1, 0xB0F1, 0x7112, 0x5912, 0xB0F1, 0xA8F1, 0x5110, 0x30F0, 0x30CF, 0x28CF, 0x28CF, 0x28CF, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x20AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x08F6, 0x18D0, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x08F6, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18D0, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x00F7, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F5, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x011A, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F3, 0x18AD, 0x18AD, 0x08F3, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0xC0D1, 0xC0D1, 0xC8D2, 0xB71A, 0xB71A, 0xB71A, 0xAEFA, 0xB71A, 0xAF1A, 0xAEFA, 0xA598, 0x8191, 0x9191, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC9D3, 0xBC76, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0x9C55, 0x8191, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xC9D3, 0xB5B8, 0xB71A, 0xAF1A, 0xB71A, 0xB6FA, 0xB71A, 0xB71A, 0xB71A, 0xB71A, 0xB6FA, 0xAF1A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xA3B5, 0x8191, 0x9992, 0xC9B2, 0xC9B3, 0xC9D2, 0xC9B2, 0xC9B3, 0xC9B2, 0xC9B3, 0xC9D3, 0xCA13, 0xBDB8, 0xAEFA, 0xAF1A, 0xB71A, 0xB6FA, 0xAEFA, 0xAF19, 0xA4F7, 0x8991, 0xB1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9D2, 0xC9B3, 0xC9B3, 0xC314, 0xAF1A, 0xAF1A, 0xAEF9, 0xAF1A, 0xAF1A, 0x89F1, 0x8191, 0xC1B2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9B2, 0xC9D3, 0xC9B3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xAEFA, 0xB71A, 0xB6B9, 0x8A93, 0x8991, 0xC1D2, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B2, 0xA992, 0x8191, 0xA9B2, 0xC9D3, 0xC9B3, 0xC9D3, 0xC9B2, 0xC9B2, 0xC9B2, 0xC9B3, 0xB5B8, 0xAF1A, 0xAEFA, 0xAF1A, 0xB71A, 0x9C56, 0x8191, 0xA992, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xB5B8, 0xB6FA, 0xAF1A, 0xAF1A, 0xB6FA, 0x89F2, 0x8191, 0xC1B2, 0xC9B3, 0xC9B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B2, 0xC9D3, 0xCAB4, 0xB6B9, 0xAF1A, 0xB71A, 0xB71A, 0xB6FA, 0xB71A, 0x92F3, 0x89B1, 0xC1B2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9D3, 0xC315, 0xB71A, 0xB71A, 0xB71A, 0xBDD9, 0xC132, 0xC0D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC8D1, 0xC0D1, 0xC0D1, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x007F, 0x6878, 0xB8B1, 0xC0B1, 0xC0D1, 0xB8D1, 0x9954, 0x047F, 0x05BF, 0x05BF, 0x061A, 0x07CE, 0x07F2, 0x07FC, 0x07FF, 0x5C78, 0xB0F1, 0xB0F1, 0xB0F1, 0x6112, 0x5912, 0xA8F1, 0xA8F1, 0x60F0, 0x30F0, 0x28EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x08F6, 0x0119, 0x0119, 0x0119, 0x0118, 0x00F6, 0x10D3, 0x08F6, 0x0118, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x208D, 0x18B0, 0x00F8, 0x0139, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x00F8, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x00F7, 0x00F7, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xC0B1, 0xC8B1, 0xC0B1, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA4B5, 0x8191, 0xA1B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xD1F3, 0xC496, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF39, 0xA455, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0x99F2, 0x8991, 0xB1D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC577, 0xBF19, 0xBF39, 0xBF39, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9BF5, 0x8191, 0xB1D2, 0xC9F3, 0xC9F3, 0xD1F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF19, 0xBF19, 0xB6B9, 0x8191, 0x8991, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9D3, 0xC9F3, 0xC9F3, 0xBED8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0xBF39, 0xAD57, 0x8191, 0x99B2, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xB9D3, 0x8191, 0xA9B2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xBF19, 0x9C75, 0x8191, 0xA9D2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBDD8, 0xBF19, 0xBF19, 0xBF19, 0xB6B8, 0x8191, 0x8191, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xBE78, 0xBF19, 0xBF39, 0xBF19, 0xBF39, 0xBF19, 0xBF19, 0xADB7, 0x8191, 0x91B1, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F2, 0xC9F3, 0xC9F3, 0xC9F3, 0xC9F3, 0xC71A, 0xBF1A, 0xC73A, 0xBF3A, 0xC659, 0xC9D3, 0xC0B1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC8B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x003F, 0x001F, 0x7076, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0x0BFF, 0x05DF, 0x05BF, 0x0639, 0x07CD, 0x07F2, 0x07FC, 0x07FF, 0x63F7, 0xB0F1, 0xB0F1, 0xB0F1, 0x4132, 0x4111, 0xA0F1, 0xB0F1, 0x90F1, 0x30F0, 0x28EF, 0x28CE, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x00F9, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D1, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F8, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x10D1, 0x08F3, 0x08F3, 0x10D2, 0x18CD, 0x20AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CE, 0x00F7, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18CD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AE, 0xC0B1, 0xC0B1, 0xC0B1, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8991, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA34, 0xCA13, 0xCA33, 0xCA33, 0xCCB6, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA455, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xD213, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0x91B1, 0x8191, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xCA13, 0xC455, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0xC738, 0x8A52, 0x8991, 0xC213, 0xCA13, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCD56, 0xC738, 0xC738, 0xC739, 0xB5D7, 0x8191, 0x91B1, 0xCA13, 0xCA13, 0xCA13, 0xD233, 0xCA33, 0xCA33, 0xCA33, 0xCB55, 0xCF38, 0xC738, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0x8191, 0x8191, 0xCA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xD233, 0xCA13, 0x8191, 0xA9D2, 0xCA33, 0xCA33, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCDF7, 0xC738, 0xC738, 0xC738, 0xC739, 0xA475, 0x8191, 0xA9D2, 0xCA13, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCA13, 0xCA33, 0xC5F7, 0xC738, 0xC738, 0xC738, 0xB5D6, 0x8191, 0x99B2, 0xCA33, 0xCA33, 0xD213, 0xCA33, 0xCA33, 0xCA33, 0xCA33, 0xCB74, 0xC739, 0xC738, 0xC738, 0xC738, 0xC738, 0xC739, 0xC738, 0xC738, 0x8AB2, 0x8191, 0xBA13, 0xCA13, 0xCA13, 0xCA33, 0xCA13, 0xCA33, 0xCA33, 0xCA13, 0xCF39, 0xC739, 0xC759, 0xCF3A, 0xCF39, 0xCED9, 0xC9F3, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x001F, 0x001F, 0x9894, 0xB8D1, 0xB8D1, 0xB8D1, 0x42DA, 0x059F, 0x05FF, 0x0678, 0x07CC, 0x07F1, 0x07FC, 0x07FF, 0x82B5, 0xA8F1, 0xB0F1, 0x98F2, 0x4132, 0x3912, 0x70F1, 0xA8F1, 0xA8F1, 0x50F0, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x10D4, 0x08F5, 0x08F6, 0x08F4, 0x08D3, 0x10CF, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D2, 0x10D3, 0x08F3, 0x10D2, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC0B1, 0xC0B1, 0xC0B1, 0xCF57, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xCA53, 0xCA53, 0xCA54, 0xCCD6, 0xCF58, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF58, 0xAC75, 0x8191, 0xA9F2, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCE17, 0xCF57, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0x99D2, 0x89B1, 0xCA53, 0xCA53, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xD6B7, 0xD758, 0xCF58, 0xCF57, 0xCF58, 0xD758, 0xD757, 0xD758, 0xD757, 0xD758, 0xCF58, 0xB535, 0x8191, 0xA1D2, 0xCA53, 0xCA53, 0xCA53, 0xD254, 0xCA73, 0xCA53, 0xCA53, 0xCC95, 0xD758, 0xD758, 0xCF58, 0xBDD6, 0x8191, 0x99D2, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xCA53, 0xD254, 0xCA54, 0xD435, 0xD758, 0xD758, 0xCF58, 0xD758, 0xD758, 0xCF57, 0xD738, 0xCF58, 0x9AF3, 0x8991, 0xC213, 0xCA54, 0xCA53, 0xCA53, 0xD253, 0xCA53, 0xCA54, 0xCA73, 0x8191, 0xA9F2, 0xCA53, 0xD253, 0xD253, 0xCA54, 0xD253, 0xCA53, 0xCA54, 0xCE17, 0xCF58, 0xD758, 0xD758, 0xCF58, 0xAC74, 0x8191, 0xA9F2, 0xCA53, 0xCA54, 0xD253, 0xCA53, 0xCA53, 0xCA54, 0xCA53, 0xD617, 0xD758, 0xCF58, 0xCF58, 0xBDD6, 0x8191, 0x91B2, 0xCA53, 0xD254, 0xCA53, 0xCA53, 0xCA54, 0xD253, 0xD253, 0xCCD6, 0xD758, 0xD758, 0xD758, 0xD758, 0xCF57, 0xD757, 0xCF58, 0xD758, 0x9AF3, 0x8191, 0xBA33, 0xCA54, 0xCA53, 0xD253, 0xCA54, 0xCA53, 0xD253, 0xCA53, 0xD758, 0xD758, 0xDF59, 0xD779, 0xD759, 0xD759, 0xD6F9, 0xC1F2, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x001F, 0x001F, 0x001F, 0x183E, 0xB0D2, 0xB8D1, 0xB8D1, 0x9974, 0x059F, 0x061F, 0x0698, 0x07CC, 0x07F0, 0x07FC, 0x07FF, 0x82B5, 0xB0F1, 0xB0F1, 0x88F1, 0x4132, 0x4111, 0x3910, 0x98F1, 0xA8F2, 0x88F1, 0x28EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x10D0, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0118, 0x10D0, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0xC0B1, 0xC0B1, 0xC0B1, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xCA74, 0xCA94, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xB494, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0x99D2, 0x91D2, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xD3D4, 0xDF77, 0xDF77, 0xDF77, 0xDF76, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xDF77, 0x8191, 0x8992, 0xCA94, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xCA94, 0xD3D5, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xCA94, 0xCA94, 0xD273, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xD515, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA93, 0xD294, 0xCA94, 0x8191, 0xAA12, 0xD294, 0xD294, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF57, 0xDF77, 0xB474, 0x8191, 0xAA12, 0xCA94, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xD294, 0xDE36, 0xDF77, 0xDF77, 0xDF77, 0xC5F5, 0x8191, 0x99D2, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xCA94, 0xCA93, 0xD4F5, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0xDF77, 0x9B12, 0x8191, 0xBA53, 0xD294, 0xCA94, 0xCA94, 0xD294, 0xCA94, 0xD294, 0xCA94, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xDF78, 0xE779, 0xDF19, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x385B, 0xB8D1, 0xB8D1, 0xB8D1, 0x2C3C, 0x061F, 0x06B7, 0x07CB, 0x07F0, 0x07FB, 0x07FF, 0xB0F1, 0xB0F1, 0xA8F1, 0x7912, 0x4132, 0x4111, 0x3911, 0x4110, 0xA0F1, 0xA8F1, 0x48EF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x00F9, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F9, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x208E, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xC0D1, 0xE776, 0xE796, 0xE797, 0xE797, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2D4, 0xD2B4, 0xD2B4, 0xDD35, 0xE776, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xE796, 0xB474, 0x8191, 0xAA33, 0xD2D4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2D4, 0xE656, 0xEF96, 0xE776, 0xE797, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0x99D2, 0x99F2, 0xCAB4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD2B4, 0xD3F5, 0xE777, 0xE797, 0xEF97, 0xE796, 0xE796, 0xE776, 0xE777, 0xE796, 0xE796, 0xE796, 0xE777, 0xEF97, 0x8191, 0x8191, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAD4, 0xD3D5, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xCAD4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2B4, 0xCAB4, 0xD2B4, 0xDD35, 0xE777, 0xEF76, 0xE796, 0xE797, 0xE797, 0xE776, 0xE796, 0xE776, 0xC534, 0xB494, 0xCC15, 0xD3F5, 0xDBF4, 0xDBF4, 0xDBF5, 0xD3F5, 0xD3F4, 0xCB34, 0x8191, 0xAA32, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xCAB4, 0xE656, 0xE776, 0xE796, 0xE796, 0xE776, 0xB494, 0x8191, 0xAA33, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xDE56, 0xE796, 0xE796, 0xE796, 0xCE15, 0x8191, 0x99F2, 0xD2B4, 0xD2B4, 0xD2D4, 0xD2B4, 0xD2D4, 0xCAD4, 0xCAD4, 0xDD15, 0xE796, 0xE796, 0xE776, 0xE796, 0xEF96, 0xE796, 0xE796, 0xE796, 0x9B13, 0x8191, 0xBA73, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xD2B4, 0xE797, 0xEF97, 0xEF77, 0xEF97, 0xEF78, 0xEF98, 0xEF98, 0xEF98, 0xC992, 0xB8D1, 0xC0D1, 0xC0B1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x7096, 0xB8D1, 0xB8D1, 0x8A35, 0x063F, 0x06D6, 0x07EA, 0x07F1, 0x07FC, 0x07FF, 0xA8F1, 0xA8F1, 0xA8F1, 0x6132, 0x4132, 0x4111, 0x38F1, 0x3110, 0x48F0, 0xA8F1, 0x98F1, 0x30CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10D0, 0x00F9, 0x0119, 0x08F7, 0x18AE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xF796, 0xF7B6, 0xF796, 0xF795, 0xF795, 0xF796, 0xEFB6, 0xBC93, 0x8191, 0xAA52, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2F4, 0xDD55, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xF7B6, 0xEFB6, 0xBC93, 0x8191, 0xAA53, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xE675, 0xF796, 0xF795, 0xF796, 0xF796, 0xF796, 0xF7B6, 0xF7B5, 0xF7B5, 0xEF96, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0x99F2, 0x99F2, 0xD2F5, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2D4, 0xD2F4, 0xD2F4, 0xDC75, 0xF795, 0xF795, 0xF795, 0xF796, 0xF7B5, 0xF796, 0xF796, 0xF796, 0xF796, 0xEFB6, 0xF7B5, 0xF796, 0x8191, 0x8991, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xDC15, 0xF796, 0xF796, 0xF796, 0xD615, 0x8191, 0x99F2, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xE535, 0xF7B6, 0xF7B5, 0xF796, 0xEFB6, 0xF796, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xF795, 0xF796, 0xF796, 0xF795, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xBC93, 0x8191, 0xAA53, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF796, 0xF7B5, 0xF796, 0xBC93, 0x8191, 0xAA33, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xEE75, 0xF796, 0xF7B5, 0xF795, 0xD634, 0x8191, 0x99F2, 0xD2F4, 0xD2F5, 0xD2F4, 0xD2F5, 0xD2F5, 0xD2F5, 0xD2D4, 0xE555, 0xF796, 0xF7B5, 0xF7B6, 0xF7B6, 0xF795, 0xF7B6, 0xF796, 0xF7B6, 0xA311, 0x8191, 0xBA94, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xD2F4, 0xF796, 0xF796, 0xF797, 0xF797, 0xF797, 0xF7B7, 0xF798, 0xF798, 0xD273, 0xB8D1, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x98B4, 0xB8D1, 0xB8D1, 0x3C9B, 0x06F5, 0x07E9, 0x07F1, 0x07FD, 0x26BD, 0xB0F1, 0xB0F2, 0xB0F1, 0x4932, 0x4132, 0x4111, 0x3911, 0x3110, 0x30F0, 0x60F0, 0xA911, 0x70F0, 0x20CE, 0x20CF, 0x20AE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x00F8, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x18AD, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x0118, 0x18D0, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xFF94, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD315, 0xD335, 0xD335, 0xD335, 0xD334, 0xD315, 0xD335, 0xE575, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xF675, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB5, 0xFF95, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0x99F2, 0x99F2, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD315, 0xD335, 0xDC54, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0x8191, 0x8191, 0xD334, 0xD315, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xDC34, 0xFFB4, 0xFFB5, 0xFFB5, 0xDE34, 0x8191, 0x99F2, 0xD314, 0xD335, 0xD315, 0xD334, 0xD334, 0xD335, 0xD335, 0xE574, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB4, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xC4B3, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD314, 0xD315, 0xD335, 0xD335, 0xD335, 0xEDF5, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xC493, 0x8191, 0xAA53, 0xD335, 0xD335, 0xD335, 0xD335, 0xD315, 0xD315, 0xD335, 0xF694, 0xFFB5, 0xFFB5, 0xFFB5, 0xDE14, 0x8191, 0x99F2, 0xD335, 0xD335, 0xD314, 0xD334, 0xD314, 0xD334, 0xD315, 0xE555, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB4, 0xFFB5, 0xFFB5, 0xFFB5, 0xFFB5, 0xA332, 0x8191, 0xBAB4, 0xD335, 0xD335, 0xD335, 0xD315, 0xD334, 0xD335, 0xD335, 0xFFB5, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB6, 0xFFB7, 0xFFB8, 0xDBD4, 0xB8D2, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x083F, 0x70F7, 0xB8D1, 0xA952, 0x0E94, 0x07C9, 0x07F2, 0x07FD, 0x2E3C, 0xA8F1, 0xA8F1, 0x9911, 0x4132, 0x4132, 0x3911, 0x3910, 0x30F0, 0x30F0, 0x30EF, 0x58F0, 0xA8F1, 0x40CF, 0x20AE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18B0, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18CF, 0x00F8, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x00F9, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB8D1, 0xB8D1, 0xB8D1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xC3F0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xF590, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xC3EF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0x9A12, 0x91F2, 0xD355, 0xD354, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDBD4, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0x8191, 0x8191, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xDC13, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x99F2, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD354, 0xECD1, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE2E, 0xFE2E, 0xC3CF, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xE4D1, 0xFE4E, 0xFE2E, 0xFE2E, 0xFE4E, 0xC3D0, 0x8191, 0xAA73, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xF590, 0xFE4E, 0xFE2E, 0xFE2E, 0xE50F, 0x8191, 0x9A12, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xECD2, 0xFE2E, 0xFE4E, 0xFE2E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE2F, 0xA2B0, 0x8191, 0xC2F4, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xD355, 0xFE2F, 0xFE50, 0xFE50, 0xFE50, 0xFE51, 0xFE51, 0xFE52, 0xFE52, 0xE3D2, 0xB8D2, 0xB8D1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x001F, 0x003F, 0x00DF, 0x59F8, 0xB8D1, 0x8291, 0x07C9, 0x07F2, 0x07FE, 0x455A, 0xB0F1, 0xA8F1, 0x8112, 0x4132, 0x4132, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28EF, 0x28CF, 0x50CF, 0x48EF, 0x20AE, 0x20AE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AF, 0x00F8, 0x0139, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AF, 0x0118, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0119, 0x00F8, 0x10CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xB8D1, 0xB0D1, 0xB0D2, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xC30F, 0x81B1, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD375, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD375, 0xD395, 0xD395, 0xD375, 0xD395, 0xD396, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0x9A12, 0x8191, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xDBD3, 0xFC8D, 0xFC6D, 0xFC6D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC8D, 0xFC6D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD375, 0xD395, 0xF42F, 0xFC6D, 0xFC6D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD375, 0xD395, 0xD376, 0xD395, 0xD395, 0xEBF1, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC8D, 0xFC6D, 0xFC6D, 0xFC6D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFC8E, 0xFC8F, 0xFC8F, 0xFC8F, 0xFCB0, 0xFCB0, 0xFCB1, 0xFCB1, 0xF3B2, 0xB8D1, 0xB0F1, 0xB8D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x031F, 0x2D3B, 0x99B2, 0x454B, 0x07F3, 0x07FE, 0x5498, 0xB0F1, 0xA8F1, 0x6912, 0x4912, 0x4112, 0x3911, 0x3110, 0x30F0, 0x30EF, 0x30CF, 0x28CF, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18CD, 0x10D1, 0x08F3, 0x08D3, 0x10D1, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x00F8, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xB0F1, 0xB0D1, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0x9A12, 0x8191, 0xC334, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFC8E, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFC8D, 0xFC8D, 0xFC8D, 0xE3CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB2F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xC30F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF44F, 0xFC8D, 0xFC8D, 0xFC8D, 0xCB6F, 0x8191, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC11, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xFC8D, 0xA250, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFC8E, 0xFC8F, 0xFCAF, 0xFCAF, 0xFCB0, 0xFCB0, 0xFCB0, 0xFCB2, 0xF451, 0xB0D1, 0xB0D1, 0xB0D1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x003F, 0x005F, 0x025F, 0x06FD, 0x0770, 0x0F88, 0x07F4, 0x07FF, 0x5478, 0xA8F1, 0xA8F1, 0x5932, 0x4132, 0x4111, 0x3911, 0x3911, 0x30F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F9, 0x0119, 0x0119, 0x00F7, 0x18AE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CF, 0x0118, 0x0119, 0x00F7, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F9, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x00F6, 0x18CE, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F7, 0x0119, 0x00F8, 0x18CF, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xB0F1, 0xB0D1, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xCB4E, 0x8191, 0xAA73, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xBB11, 0x8191, 0xAA73, 0xD396, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xDBB4, 0xFCAE, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCAD, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xDBD3, 0xFCAD, 0xFCCD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCCD, 0xDBEE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD3, 0xFCCD, 0xFCCD, 0xFCCD, 0xFCCD, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF46F, 0xFCAD, 0xFCCD, 0xFCCD, 0xC32F, 0x8991, 0xAA94, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC31, 0xFCCD, 0xFCCD, 0xFCAD, 0xFCCD, 0xFCAD, 0xFCAD, 0xFCAD, 0xFCAD, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFCCE, 0xFCCF, 0xFCCF, 0xFCEF, 0xFCD0, 0xFCF0, 0xFCF1, 0xFCF1, 0xFCF2, 0xB0F1, 0xB0F1, 0xB0F2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x007F, 0x021F, 0x06FC, 0x078D, 0x07E7, 0x07F6, 0x07FF, 0x82B5, 0xA8F1, 0xA111, 0x4932, 0x4132, 0x4111, 0x38F1, 0x38F0, 0x30F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x08F5, 0x0119, 0x0119, 0x0117, 0x0117, 0x0119, 0x0119, 0x08F4, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x10CF, 0x0118, 0x0119, 0x0117, 0x18AE, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xA8F1, 0xB0F1, 0xFD0D, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFD0D, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xC32F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC6F, 0x91D1, 0x89D1, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xDBB4, 0xEC70, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xFCED, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBF3, 0xFCED, 0xFCED, 0xFCED, 0xE42E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFD0D, 0xFCED, 0xEC6E, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xF4AF, 0xFD0D, 0xFCED, 0xFD0D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF48F, 0xFCED, 0xFCED, 0xFCED, 0xC34F, 0x8191, 0xAA93, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC51, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xFCED, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD0E, 0xFD0F, 0xFD0F, 0xFD0F, 0xFD10, 0xFD10, 0xFD31, 0xFD31, 0xFD32, 0xB0F1, 0xB0F1, 0xB0F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x005F, 0x021F, 0x073B, 0x07AC, 0x07E7, 0x07F7, 0x07FF, 0x82B5, 0xA8F1, 0x8912, 0x4932, 0x4112, 0x3911, 0x3911, 0x3110, 0x30F0, 0x30EF, 0x28CF, 0x28CF, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x10F3, 0x18AD, 0x18AD, 0x10F3, 0x0119, 0x0119, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x0117, 0x0119, 0x00F7, 0x18AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x208D, 0x18AD, 0x20AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x10CF, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xB0F1, 0xA8F1, 0xB0F1, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xE44E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xC34F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4CF, 0xC34F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xE431, 0xEC71, 0xEC71, 0xDBF0, 0xE450, 0xF4CF, 0xFD0E, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDBD4, 0xF4AF, 0xF4CF, 0xF4AF, 0xDC10, 0x9A12, 0xAA73, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2C, 0xFD2C, 0x9211, 0x8191, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFCEE, 0xFD2D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC10, 0xE44E, 0xDC2E, 0xE44E, 0xB2F0, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xFD2D, 0xA270, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD2E, 0xFD2F, 0xFD2F, 0xFD4F, 0xFD50, 0xFD50, 0xFD51, 0xFD51, 0xFD71, 0xA8F1, 0xB0F1, 0xB0F2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x007F, 0x023F, 0x073B, 0x07AB, 0x07E8, 0x07F9, 0x07FF, 0xA152, 0xA8F1, 0x7132, 0x4132, 0x4131, 0x3911, 0x3910, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18CE, 0x0119, 0x0119, 0x10D0, 0x18AD, 0x18AD, 0x18D0, 0x0119, 0x0119, 0x0119, 0x0118, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x08F7, 0x18AD, 0x20AD, 0x18AD, 0x20CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AC, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA8F1, 0xA8F1, 0xA8F2, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xE46E, 0x8191, 0x9212, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xC36F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF4EF, 0xFD2D, 0x9211, 0x89B2, 0xCB75, 0xD396, 0xD375, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xCB95, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD4D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xBB2F, 0x8191, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC71, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xFD6D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFD6E, 0xFD6F, 0xFD6F, 0xFD8F, 0xFD90, 0xFD90, 0xFD91, 0xFD91, 0xFD92, 0xA8F1, 0xA8F1, 0xA8F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x005F, 0x007F, 0x009F, 0x023F, 0x0779, 0x07AA, 0x07E8, 0x07FB, 0x07FF, 0xA8F1, 0xA8F1, 0x5932, 0x4932, 0x4131, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AC, 0x0119, 0x0119, 0x10D3, 0x18AD, 0x18AD, 0x10D3, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x00F6, 0x20AE, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x0116, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0xA8F1, 0xA8F1, 0xA8F1, 0xEC6F, 0xFD8D, 0xFDAD, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xE48E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFDAD, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xC38F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF52F, 0xFD8D, 0xE4AE, 0x8991, 0x9A32, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xE491, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFD8D, 0xFDAD, 0xF52D, 0x8191, 0x91F2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xEC91, 0xFD8D, 0xFD8D, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFDAD, 0xFD8D, 0xA290, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFDAF, 0xFDAF, 0xFDAF, 0xFDAF, 0xFDB0, 0xFDB0, 0xFDB1, 0xFDD1, 0xE4B2, 0xA911, 0xA8F1, 0xA8F1, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x007F, 0x009F, 0x02BF, 0x0778, 0x07C8, 0x07E9, 0x07FD, 0x173E, 0xA8F1, 0x9912, 0x4932, 0x4932, 0x4131, 0x4111, 0x3911, 0x38F0, 0x30EF, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x08F4, 0x0119, 0x0119, 0x00F7, 0x08F6, 0x0119, 0x0119, 0x08F4, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x00F7, 0x0119, 0x0118, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18CD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA911, 0xA911, 0xA911, 0xEC8E, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xE4CE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDED, 0xFDCD, 0xC3AF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF54F, 0xFDED, 0xFDCD, 0xD44F, 0x8191, 0xB2B3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0x8991, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xFDCD, 0xBB6F, 0x8191, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECB1, 0xFDED, 0xFDED, 0xFDCD, 0xFDCD, 0xFDED, 0xFDED, 0xFDED, 0xFDED, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xFDEE, 0xFDEF, 0xFDEF, 0xFDF0, 0xFDF0, 0xFDF0, 0xFDF1, 0xFDF1, 0xECB1, 0xA0F1, 0xA911, 0xA911, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x005F, 0x005F, 0x007F, 0x009F, 0x009F, 0x041F, 0x0797, 0x07C7, 0x07EB, 0x07FE, 0x2E5C, 0xA8F1, 0x7932, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AE, 0x00F6, 0x0118, 0x0118, 0x0119, 0x0119, 0x00F6, 0x18CE, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AC, 0x18AD, 0x18AC, 0x20AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x20AD, 0x18AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F7, 0x0118, 0x0117, 0x18CF, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0xA911, 0xA911, 0xA111, 0xE42E, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xE4EE, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xC3CF, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF56F, 0xFE0D, 0xFE0D, 0xFE0D, 0xD44F, 0x8191, 0xBAD3, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xECD1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0D, 0xF5AD, 0x9A70, 0x89B1, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECD1, 0xFE0D, 0xFE0D, 0xFE0D, 0xFE0E, 0xFE0D, 0xFE0E, 0xFE0E, 0xFE0E, 0xA2B0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE0F, 0xFE0F, 0xFE0F, 0xFE30, 0xFE30, 0xFE30, 0xFE31, 0xFE31, 0xDC32, 0xA111, 0xA911, 0xA111, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x005F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x043F, 0x0794, 0x07E6, 0x07EC, 0x07FE, 0x35DB, 0xA911, 0x5133, 0x4932, 0x4132, 0x4111, 0x4111, 0x3910, 0x30F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CE, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x20AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0119, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x10D1, 0x10D3, 0x10F2, 0x10D1, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x20AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AE, 0x00F6, 0x0119, 0x00F8, 0x18CF, 0x20AD, 0x18AD, 0x20AD, 0x18AC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x80F0, 0xA111, 0xA111, 0xC2B0, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8991, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xC3EF, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF58F, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xE50E, 0x89D1, 0xA253, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD376, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xF60E, 0x9A70, 0x91F2, 0xCB75, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF2, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xFE4D, 0xFE4E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE4E, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE50, 0xFE71, 0xFE51, 0xBA52, 0xA111, 0xA111, 0x78D5, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x005F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x00BF, 0x043F, 0x07B3, 0x07C5, 0x07EE, 0x07FF, 0x5478, 0x6AD6, 0x4953, 0x4932, 0x4912, 0x4111, 0x3911, 0x3910, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0118, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0119, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AC, 0x18AD, 0x20AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x00F6, 0x0118, 0x00F8, 0x18CF, 0x18AC, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x60EF, 0xA111, 0xA111, 0xA112, 0xFE2D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xE54E, 0x8191, 0x9A12, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xF5CF, 0xFE6D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE6D, 0xC40F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5CE, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6C, 0xFE8D, 0xF62D, 0xC40F, 0x9A12, 0xB2D4, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xECF1, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED11, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE8D, 0xFE6D, 0xFE2D, 0xBBCF, 0x89B1, 0xBAF4, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD396, 0xC314, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xA2D0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFE90, 0xFE91, 0xE471, 0xA111, 0xA112, 0xA111, 0x60D5, 0x001F, 0x283C, 0x7097, 0x405A, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x009F, 0x00BF, 0x00BF, 0x00DF, 0x045F, 0x07D2, 0x07E4, 0x07EF, 0x07FF, 0x2E3C, 0x2D1A, 0x5133, 0x4932, 0x4132, 0x3911, 0x3911, 0x38F0, 0x30F0, 0x30EF, 0x28CF, 0x28CE, 0x28CE, 0x20CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0118, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x0119, 0x0118, 0x18AD, 0x18AC, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18CC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x18AE, 0x18AD, 0x20AD, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x20AD, 0x18AD, 0x20AD, 0x18CD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x00F6, 0x0118, 0x00F7, 0x18CF, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x20AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x28CD, 0xA111, 0xA111, 0xA111, 0xCBCF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xF5ED, 0x89D1, 0x91D2, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD396, 0xD395, 0xED11, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xC42F, 0x81B1, 0xAA93, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFECC, 0xFEAD, 0xC42F, 0x8191, 0xAA93, 0xD395, 0xD395, 0xD396, 0xD395, 0xD395, 0xD395, 0xD395, 0xF5EF, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF64D, 0xD4CE, 0xBBD0, 0xC3B2, 0xC314, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xED12, 0x8191, 0x8191, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xD395, 0xD395, 0xED31, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xEE0D, 0xCC6F, 0xBB51, 0xBAD4, 0xCB55, 0xD395, 0xD395, 0xD395, 0xD395, 0xC334, 0x8191, 0xB294, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD375, 0xD395, 0xED11, 0xFEAE, 0xFECE, 0xFEAD, 0xFEAE, 0xFEAD, 0xFECE, 0xFEAE, 0xFEAE, 0xA2F0, 0x8191, 0xC314, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xD395, 0xDC34, 0xFEAF, 0xFED0, 0xFEAF, 0xFED0, 0xFEB0, 0xFED1, 0xE491, 0xA911, 0xA111, 0x9931, 0xA111, 0x58D6, 0x88B5, 0xB8D1, 0xB8D1, 0x5059, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x009F, 0x00BF, 0x00FF, 0x00DF, 0x047F, 0x07D2, 0x07E3, 0x07F1, 0x07FF, 0x07FF, 0x2CBA, 0x4933, 0x4132, 0x4131, 0x4111, 0x38F0, 0x38F0, 0x30F0, 0x30EF, 0x28EF, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x0118, 0x0118, 0x18AD, 0x18AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x0118, 0x0118, 0x18AD, 0x18AD, 0x18AD, 0x20AD, 0x18CD, 0x20AD, 0x20AD, 0x18AC, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x00F6, 0x18AD, 0x18AD, 0x18AC, 0x20AC, 0x18AC, 0x18AD, 0x18AC, 0x18AC, 0x18AD, 0x18AC, 0x20AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x18AC, 0x18AD, 0x00F6, 0x0118, 0x0118, 0x18CF, 0x20AD, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x20AC, 0x20AD, 0x18AD, 0x8110, 0x9911, 0xA111, 0xA171, 0xF5ED, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE6D, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5CF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE4E, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EE, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE8D, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xF64D, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xFE6E, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xF60E, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF64E, 0xFEAC, 0xFEAD, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5EF, 0xF5EF, 0xF5EF, 0xF5CF, 0xFE4D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE6D, 0xF5EF, 0xF5EF, 0xF5CF, 0xF5CF, 0xFEAD, 0xF62E, 0xF5EF, 0xF5D0, 0xF5EF, 0xF5CF, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5EF, 0xF5F0, 0xFE4F, 0xFECE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAF, 0xF610, 0xF5D0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF5F0, 0xF610, 0xFEAF, 0xFEAF, 0xFEAF, 0xFED0, 0xFEB0, 0xFEB1, 0xE471, 0xB8D1, 0xA111, 0x9931, 0x9931, 0x9912, 0x6933, 0xB0F1, 0xB0D1, 0xB0D1, 0x283C, 0x001F, 0x001F, 0x001F, 0x003F, 0x007F, 0x00BF, 0x00DF, 0x00FF, 0x011F, 0x047F, 0x07D1, 0x07E3, 0x07F3, 0x07FF, 0x07FF, 0x3B77, 0x4932, 0x4932, 0x4131, 0x4111, 0x38F0, 0x38F0, 0x30EF, 0x30EF, 0x28EF, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AC, 0x18AD, 0x0118, 0x0118, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AD, 0x20AD, 0x0118, 0x0118, 0x20AD, 0x20AC, 0x20AC, 0x18AD, 0x18AD, 0x18AC, 0x20AC, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, 0x18AD, - 0x0118, 0x00F6, 0x18CD, 0x18AC, 0x18AD, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18CC, 0x20AC, 0x18AD, 0x00F6, 0x0118, 0x0117, 0x18CF, 0x18AD, 0x18AC, 0x18AC, 0x18AD, 0x18AC, 0x20AD, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18CD, 0x18AC, 0x20AC, 0x38CE, 0x9931, 0x9931, 0x9931, 0xAA31, 0xFE2D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAC, 0xFEAC, 0xFEAD, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAC, 0xFEAC, 0xFE8C, 0xFE8C, 0xFEAC, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8C, 0xFEAD, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFEAC, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFEAC, 0xFE8D, 0xFE8C, 0xFEAD, 0xFEAD, 0xFE8C, 0xFE8C, 0xFE8C, 0xFEAD, 0xFE8C, 0xFEAC, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAC, 0xFE8D, 0xFEAC, 0xFEAD, 0xFEAD, 0xFE8C, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAC, 0xFE8C, 0xFEAD, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFEAD, 0xFEAD, 0xFEAD, 0xFEAD, 0xFE8D, 0xFE8E, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAD, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFEAE, 0xFEAE, 0xFEAE, 0xFE8E, 0xFE8E, 0xFEAE, 0xFEAF, 0xFEAE, 0xFEAE, 0xFEAF, 0xFE8E, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFEAF, 0xFE8F, 0xFEB0, 0xFEAF, 0xFEB0, 0xFE90, 0xE471, 0xB8D2, 0xA111, 0x9911, 0x9931, 0x9931, 0x7132, 0x7133, 0xB0F1, 0xB0D1, 0xB0D2, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x007F, 0x00DF, 0x00DF, 0x011F, 0x011F, 0x049F, 0x07F0, 0x07E2, 0x07F4, 0x07FF, 0x07FF, 0x3AF6, 0x4932, 0x4932, 0x4111, 0x3911, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28EE, 0x28CE, 0x28CE, 0x20CE, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x18AC, 0x20AC, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x20AD, 0x18AD, 0x0118, 0x0118, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AD, 0x18AD, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, - 0x00F8, 0x0118, 0x00F5, 0x18AD, 0x20AC, 0x18AD, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AD, 0x18CD, 0x0116, 0x0118, 0x0117, 0x18CF, 0x20AC, 0x20AC, 0x20AD, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AD, 0x20AC, 0x60EF, 0x9912, 0x9931, 0x9931, 0xB270, 0xF62D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE6D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8C, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8D, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8E, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xFEB0, 0xFEB0, 0xE471, 0xB8D1, 0xA111, 0x9931, 0x9931, 0x9912, 0x8911, 0x5174, 0x6953, 0xB0F1, 0xB0D1, 0x90B4, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x049F, 0x07F1, 0x07E2, 0x07F6, 0x07FF, 0x0F9F, 0x4A35, 0x4933, 0x4932, 0x4131, 0x3910, 0x3910, 0x38F0, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CE, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AD, 0x20AD, 0x0118, 0x0118, 0x18CE, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AD, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, - 0x18CE, 0x0117, 0x0118, 0x0115, 0x18AD, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AD, 0x00F6, 0x0118, 0x0117, 0x18CE, 0x18AC, 0x20CC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AD, 0x18CC, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x28AD, 0x8110, 0x9931, 0x9931, 0x9911, 0xAA31, 0xF5CD, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE8C, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE8E, 0xFE8D, 0xFE8D, 0xFE6E, 0xFE8D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE6F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE8F, 0xFE8F, 0xFE6F, 0xFE90, 0xFE8F, 0xFE8F, 0xFE90, 0xFE90, 0xE471, 0xB0D1, 0xA111, 0x9931, 0x9931, 0x9931, 0x9912, 0x5953, 0x5153, 0x7133, 0xB0D1, 0xB0D1, 0x7896, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x00BF, 0x011F, 0x011F, 0x013F, 0x017F, 0x04BF, 0x07F2, 0x07E2, 0x07F5, 0x07FF, 0x7336, 0x5153, 0x4933, 0x4932, 0x4131, 0x4110, 0x3910, 0x30EF, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AD, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x00F5, 0x0117, 0x00F7, 0x18CE, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x20AC, 0x18AE, 0x0117, 0x0118, 0x08F5, 0x18AD, 0x18AC, 0x18CD, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x08F3, 0x0118, 0x0117, 0x18CE, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x28AD, 0x9111, 0x9931, 0x9931, 0x9931, 0xA171, 0xCBCF, 0xF60D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6C, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6D, 0xFE6D, 0xFE6D, 0xFE4D, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6E, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE70, 0xFE70, 0xFE6F, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE90, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xE471, 0xA8F1, 0xA111, 0x9931, 0x9932, 0x9931, 0x9931, 0x6933, 0x5153, 0x5953, 0x7153, 0xB0D1, 0xB0D1, 0x5878, 0x001F, 0x001F, 0x003F, 0x007F, 0x009F, 0x00FF, 0x013F, 0x013F, 0x017F, 0x019F, 0x033F, 0x07F3, 0x07E2, 0x07F3, 0x07FF, 0xA8F1, 0x6932, 0x4932, 0x4932, 0x4931, 0x4111, 0x3910, 0x3110, 0x30EF, 0x30EF, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AD, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AD, 0x20AC, 0x18AC, 0x18AD, 0x00F5, 0x0118, 0x0117, 0x18CE, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x18AC, 0x20AC, 0x18CE, 0x08F5, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0117, 0x00F7, 0x18CE, 0x20AC, 0x18CC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x28CD, 0x8111, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0xBAB0, 0xDC6F, 0xE50F, 0xE50E, 0xFE4E, 0xFE6E, 0xFE4E, 0xFE6D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4D, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE4E, 0xFE4E, 0xFE6E, 0xFE6E, 0xFE4E, 0xFE6F, 0xFE6E, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE6F, 0xFE4F, 0xFE6F, 0xFE70, 0xFE50, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE70, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xFE71, 0xF612, 0xE531, 0xE512, 0xD472, 0xB271, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x6153, 0x5153, 0x5954, 0x5954, 0x7154, 0xB0F1, 0xB0F1, 0x285C, 0x003F, 0x005F, 0x007F, 0x00BF, 0x00FF, 0x013F, 0x015F, 0x017F, 0x019F, 0x01BF, 0x02FF, 0x07F4, 0x07E3, 0x07F1, 0x2E5C, 0xA911, 0x6932, 0x5132, 0x4931, 0x4132, 0x4110, 0x3910, 0x3910, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AC, 0x20AD, 0x20AD, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x0118, 0x0118, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18CC, 0x20AC, 0x18AD, 0x0115, 0x0118, 0x00F7, 0x18AE, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x10D0, 0x10D2, 0x08D2, 0x18AE, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, - 0x18AC, 0x20AC, 0x20AC, 0x18CD, 0x0116, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0118, 0x0118, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x18CE, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x28CC, 0x610F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x8912, 0x5153, 0x5953, 0x5153, 0x5974, 0x5974, 0x7953, 0xB0F1, 0xB0D1, 0x087F, 0x009F, 0x00BF, 0x00DF, 0x011F, 0x015F, 0x019F, 0x019F, 0x019F, 0x01DF, 0x01DF, 0x01FF, 0x07F7, 0x07E3, 0x07EF, 0x5498, 0xA8F1, 0x7132, 0x4952, 0x4931, 0x4131, 0x4110, 0x3910, 0x30EF, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x20CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x0117, 0x0117, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x18AD, 0x0115, 0x0117, 0x00F7, 0x18AE, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AD, 0x00F5, 0x0117, 0x0118, 0x0117, 0x0117, 0x08F3, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20CC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, - 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x40CE, 0x7910, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xA111, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7132, 0x5153, 0x5153, 0x5153, 0x5974, 0x5974, 0x6174, 0x9113, 0xB0F1, 0x98F3, 0x00DF, 0x00FF, 0x011F, 0x013F, 0x017F, 0x01BF, 0x01BF, 0x01DF, 0x01DF, 0x01FF, 0x01FF, 0x021F, 0x06D9, 0x07E5, 0x07EC, 0x7355, 0xA8F1, 0x7932, 0x4932, 0x4931, 0x4131, 0x4110, 0x3910, 0x390F, 0x30EF, 0x30EE, 0x28CE, 0x28CE, 0x28CD, 0x28CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x0117, 0x00F7, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AD, 0x00F5, 0x0117, 0x0116, 0x18CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x00F5, 0x0117, 0x0118, 0x08F5, 0x0116, 0x0117, 0x0117, 0x10F2, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x18AC, 0x20AB, 0x20AC, 0x20AC, - 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x30CC, 0x58CF, 0x7910, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0xA111, 0x9911, 0x8932, 0x6932, 0x5152, 0x5153, 0x5953, 0x5953, 0x5974, 0x6174, 0x6175, 0x7954, 0xA8F1, 0xB0F1, 0x80F5, 0x013F, 0x017F, 0x019F, 0x01BF, 0x01DF, 0x01FF, 0x01DF, 0x01FF, 0x021F, 0x023F, 0x023F, 0x023F, 0x057D, 0x07E8, 0x07E9, 0x82D5, 0xA0F1, 0x8132, 0x5132, 0x4931, 0x4131, 0x4110, 0x38F0, 0x38EF, 0x30EF, 0x30EE, 0x28CE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CD, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x00F7, 0x0117, 0x10D0, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18CD, 0x00F5, 0x0117, 0x08F5, 0x18AD, 0x20AC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AD, 0x0117, 0x0117, 0x10D0, 0x20AC, 0x20AC, 0x08F3, 0x0117, 0x0115, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, - 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20AD, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CE, 0x28EE, 0x28EE, 0x30EE, 0x30EF, 0x30EF, 0x30EE, 0x38EF, 0x5110, 0x6110, 0x5910, 0x6930, 0x7931, 0x8131, 0x8130, 0x9931, 0xA932, 0xA131, 0xB131, 0xC912, 0xC911, 0xC8F2, 0xC8F2, 0xC8F2, 0xC8D1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xC0D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0x5158, 0x01BF, 0x01DF, 0x01FF, 0x021F, 0x023F, 0x023F, 0x021F, 0x023F, 0x025F, 0x025F, 0x025F, 0x025F, 0x041F, 0x07ED, 0x07E4, 0x7AB4, 0xA911, 0x9112, 0x5132, 0x4931, 0x4111, 0x4110, 0x3910, 0x38EF, 0x30EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x10D0, 0x0117, 0x00F7, 0x10D0, 0x20AC, 0x20CC, 0x18AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x00F5, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x20AC, 0x20AC, 0x20AC, 0x10EF, 0x0117, 0x0117, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, - 0x20AC, 0x18AC, 0x18AC, 0x18CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AB, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28AD, 0x28CE, 0x30CE, 0x30CE, 0x30EE, 0x8151, 0xB192, 0xC9B3, 0xC9B2, 0xC992, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC932, 0xC912, 0xC912, 0xC111, 0xC8F1, 0xC8F1, 0xC8D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0D1, 0xB8B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D2, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0x39BB, 0x021F, 0x023F, 0x025F, 0x027F, 0x027F, 0x025F, 0x025F, 0x027F, 0x027F, 0x027F, 0x027F, 0x027F, 0x029F, 0x07F3, 0x07E2, 0x9972, 0xA911, 0xA112, 0x4952, 0x4932, 0x4131, 0x4110, 0x3910, 0x38EF, 0x30EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x08F2, 0x0117, 0x0116, 0x10D0, 0x20AC, 0x20AB, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AD, 0x00F4, 0x00F7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x18CF, 0x20AC, 0x20AC, 0x10D1, 0x00F7, 0x0115, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, - 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x18CC, 0x18AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x18AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CC, 0x20CC, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x30CD, 0x28EE, 0x30EE, 0x490E, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC932, 0xC932, 0xC912, 0xC912, 0xC912, 0xC0F2, 0xC8D1, 0xC0D1, 0xC0D1, 0xC8B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB0D1, 0xB8D2, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0F2, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0x123E, 0x029F, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x029F, 0x02BF, 0x02BF, 0x02BF, 0x029F, 0x029F, 0x02DF, 0x06B9, 0x07E3, 0xA111, 0xA911, 0xA111, 0x5932, 0x4931, 0x4911, 0x4110, 0x4110, 0x390F, 0x38EF, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x08D3, 0x0116, 0x0117, 0x10CF, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x18AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x00F4, 0x0117, 0x0116, 0x08F2, 0x08F2, 0x0117, 0x0116, 0x08F2, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, - 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x18AC, 0x20AC, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x30ED, 0x692F, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC132, 0xC912, 0xC912, 0xC8F2, 0xC8F1, 0xC8D1, 0xC0D1, 0xC0D1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xC0B1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0D1, 0xB8D1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0x9933, 0x02DF, 0x02DF, 0x02FF, 0x02FF, 0x02DF, 0x02BF, 0x02DF, 0x02DF, 0x02DF, 0x02DF, 0x02DF, 0x02BF, 0x02BF, 0x02FF, 0x051E, 0x07E8, 0xA912, 0xA111, 0xA111, 0x6932, 0x4931, 0x4931, 0x4130, 0x410F, 0x390F, 0x38EE, 0x30EE, 0x30EE, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x08F2, 0x0116, 0x0117, 0x10D0, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x18CB, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AB, 0x20AB, 0x18AE, 0x0115, 0x0117, 0x0116, 0x0116, 0x0116, 0x00F4, 0x18CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B8, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AC, 0x20AC, 0x28AC, 0x20CC, 0x28CC, 0x28CC, 0x28CC, 0x28CD, 0x28CD, 0x28ED, 0x28CD, 0x30CD, 0x9191, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC952, 0xC952, 0xC932, 0xC932, 0xC912, 0xC932, 0xC912, 0xC112, 0xC8F2, 0xC8F2, 0xC8D1, 0xC8D1, 0x9095, 0x9095, 0x9075, 0x8875, 0x6078, 0x6059, 0x6059, 0x6058, 0x6058, 0x6078, 0x6078, 0x6059, 0x6078, 0x6078, 0x5878, 0x6078, 0x88B4, 0x88B5, 0x88B5, 0xB8D1, 0xB8D1, 0xB8D1, 0xB8D1, 0xB0F1, 0xB0F1, 0xB0D1, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0x69D6, 0x033F, 0x033F, 0x033F, 0x031F, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02FF, 0x02DF, 0x02FF, 0x035F, 0x03FF, 0x07F0, 0x8A4F, 0xA111, 0xA111, 0x8132, 0x4931, 0x4931, 0x4110, 0x410F, 0x390F, 0x30EE, 0x30EE, 0x30CD, 0x30CD, 0x28CD, 0x28CD, 0x28CC, 0x28CC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x08F2, 0x0116, 0x0116, 0x10CF, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20CC, 0x08D1, 0x08F3, 0x08F3, 0x10D0, 0x20AB, 0x20AC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B7, 0x03B8, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CC, 0x20AC, 0x28CC, 0x28CC, 0x28CC, 0x20CC, 0x28CC, 0x28CC, 0x28CD, 0x40EE, 0xA9B2, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B2, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC972, 0xC952, 0xC952, 0xC952, 0xC932, 0xC932, 0x90D5, 0x88D6, 0x6098, 0x5879, 0x303C, 0x305C, 0x081E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00BF, 0x00DF, 0x291C, 0x411A, 0x6118, 0x8915, 0xB0D1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F1, 0xB0F2, 0xA8F1, 0xB0F1, 0x429A, 0x039F, 0x039F, 0x035F, 0x035F, 0x033F, 0x033F, 0x033F, 0x033F, 0x033F, 0x033F, 0x031F, 0x031F, 0x031F, 0x037F, 0x03FF, 0x06D7, 0x7ACF, 0xA111, 0xA111, 0x9912, 0x5131, 0x4931, 0x4110, 0x410F, 0x40EF, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x28CD, 0x28CD, 0x28CC, 0x28CC, 0x20CC, 0x20CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x08F2, 0x0116, 0x0116, 0x10CF, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x20AB, 0x20AB, 0x20AB, 0x20AB, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x28CC, 0x28CC, 0x28CC, 0x28CD, 0x28CC, 0x490E, 0xC1D3, 0xC9D3, 0xC9D3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC9B3, 0xC992, 0xC992, 0xC972, 0xC952, 0x98F5, 0x60B8, 0x407B, 0x183E, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x007F, 0x007F, 0x009F, 0x00BF, 0x00FF, 0x011F, 0x013F, 0x017F, 0x019F, 0x01DF, 0x021F, 0x21FD, 0x49D9, 0x7996, 0xA112, 0xA8F1, 0xB0F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0x139E, 0x03DF, 0x03BF, 0x039F, 0x039F, 0x037F, 0x037F, 0x037F, 0x037F, 0x035F, 0x035F, 0x033F, 0x033F, 0x035F, 0x03BF, 0x041F, 0x05DE, 0x7AD1, 0xA111, 0xA111, 0xA111, 0x5931, 0x4931, 0x4130, 0x4130, 0x40EF, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x08F2, 0x0115, 0x0115, 0x10CF, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x18AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B8, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x692F, 0xC9F3, 0xC9D3, 0xC9D3, 0xC9B2, 0xC9B3, 0xC992, 0xC9B2, 0xC972, 0xB973, 0x80F7, 0x387B, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00BF, 0x00DF, 0x00FF, 0x013F, 0x015F, 0x019F, 0x01BF, 0x01FF, 0x023F, 0x025F, 0x029F, 0x02DF, 0x02FF, 0x033F, 0x2ADC, 0x5A58, 0x8994, 0xA8F1, 0xA8F1, 0x81D4, 0x041F, 0x041F, 0x03FF, 0x03DF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, 0x037F, 0x035F, 0x037F, 0x039F, 0x03FF, 0x047F, 0x04FF, 0x6375, 0xA112, 0xA111, 0xA111, 0x7111, 0x4931, 0x4110, 0x4110, 0x390F, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x08F1, 0x0115, 0x0115, 0x10CF, 0x20AB, 0x20AB, 0x20AB, 0x20CA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28AC, 0x28CC, 0x28CC, 0x28CC, 0x692E, 0xC9F3, 0xC9D2, 0xC9D3, 0xC9B3, 0xC9B3, 0xC992, 0xC993, 0x80F7, 0x389B, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x083C, 0x085B, 0x105B, 0x2078, 0x2098, 0x2097, 0x2097, 0x2097, 0x2097, 0x2097, 0x2098, 0x187A, 0x105B, 0x085D, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x001F, 0x003F, 0x005F, 0x007F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x017F, 0x01BF, 0x01FF, 0x021F, 0x025F, 0x029F, 0x02DF, 0x02FF, 0x033F, 0x037F, 0x03BF, 0x03DF, 0x041F, 0x043F, 0x0C3F, 0x2BBC, 0x0C3F, 0x045F, 0x043F, 0x041F, 0x041F, 0x03FF, 0x03FF, 0x03FF, 0x03DF, 0x03DF, 0x03BF, 0x039F, 0x037F, 0x039F, 0x03DF, 0x043F, 0x04BF, 0x053F, 0x5398, 0xA111, 0xA111, 0xA111, 0x9111, 0x4931, 0x4910, 0x4110, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30CD, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x08F1, 0x0115, 0x0115, 0x10CE, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x1378, 0x1378, 0x1358, 0x1358, 0x1378, 0x1378, 0x1358, 0x1378, 0x1358, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CB, 0x28CB, 0x28CC, 0x28CB, 0x614E, 0xD1F3, 0xC9F3, 0xC9D3, 0xC9B2, 0xC9B3, 0xB173, 0x60D9, 0x081E, 0x003D, 0x083B, 0x1878, 0x1877, 0x28D2, 0x28D2, 0x40EE, 0x38EE, 0x390F, 0x390F, 0x390F, 0x410E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x4910, 0x4130, 0x38F3, 0x28B6, 0x189A, 0x003E, 0x001F, 0x001F, 0x003F, 0x005F, 0x005F, 0x007F, 0x00BF, 0x00DF, 0x00FF, 0x013F, 0x015F, 0x019F, 0x01DF, 0x021F, 0x023F, 0x027F, 0x029F, 0x02FF, 0x033F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x047F, 0x04BF, 0x04DF, 0x04DF, 0x04BF, 0x04BF, 0x047F, 0x047F, 0x043F, 0x043F, 0x043F, 0x041F, 0x041F, 0x03FF, 0x03DF, 0x03BF, 0x03BF, 0x03DF, 0x043F, 0x047F, 0x04DF, 0x057F, 0x3C1A, 0xA111, 0xA111, 0xA111, 0xA111, 0x5931, 0x4910, 0x4110, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x08F1, 0x0115, 0x0115, 0x10CF, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x3AF9, 0x3AD9, 0x3AD9, 0x3AD9, 0x3AD9, 0x3AD9, 0x3AF9, 0x3AF9, 0x3AF9, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28CB, 0x20CB, 0x28AB, 0x692E, 0xC9D3, 0xC9D3, 0xC9D3, 0xC9B3, 0xB1B2, 0x58F3, 0x1895, 0x28B2, 0x30ED, 0x38ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x390E, 0x390E, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390E, 0x410F, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x492F, 0x4930, 0x4910, 0x38F3, 0x20B8, 0x087D, 0x007F, 0x009F, 0x00DF, 0x00FF, 0x011F, 0x015F, 0x017F, 0x019F, 0x01DF, 0x021F, 0x025F, 0x02BF, 0x02DF, 0x031F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x049F, 0x04DF, 0x04FF, 0x051F, 0x051F, 0x053F, 0x04FF, 0x04DF, 0x04BF, 0x049F, 0x047F, 0x047F, 0x045F, 0x045F, 0x043F, 0x041F, 0x03FF, 0x03DF, 0x03FF, 0x043F, 0x045F, 0x04BF, 0x053F, 0x05BF, 0x2CDC, 0xA112, 0xA111, 0xA111, 0xA111, 0x7131, 0x4930, 0x4130, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x08F1, 0x0115, 0x0114, 0x10CE, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x625A, 0x625B, 0x5A5A, 0x5A5A, 0x625B, 0x20CA, 0x20AA, 0x20AA, 0x20AA, - 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28CB, 0x28CB, 0x612E, 0xC9F3, 0xC9D3, 0xC9D3, 0xB992, 0x692E, 0x28CC, 0x28EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x30ED, 0x38ED, 0x38ED, 0x390E, 0x38EE, 0x38EE, 0x38EE, 0x390F, 0x38EE, 0x40EE, 0x40EE, 0x390F, 0x390E, 0x410E, 0x40EF, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4910, 0x4910, 0x4930, 0x4113, 0x28F8, 0x08FE, 0x013F, 0x015F, 0x019F, 0x01DF, 0x021F, 0x023F, 0x029F, 0x02BF, 0x031F, 0x035F, 0x039F, 0x03DF, 0x041F, 0x045F, 0x049F, 0x04DF, 0x051F, 0x053F, 0x057F, 0x059F, 0x057F, 0x055F, 0x053F, 0x04FF, 0x04FF, 0x04DF, 0x04BF, 0x049F, 0x049F, 0x047F, 0x045F, 0x043F, 0x041F, 0x041F, 0x043F, 0x045F, 0x04BF, 0x04FF, 0x055F, 0x05DF, 0x0E1F, 0xA111, 0xA111, 0xA111, 0xA112, 0x8931, 0x4930, 0x4130, 0x410F, 0x410E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x08F1, 0x0115, 0x0114, 0x10CF, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20CB, 0x10CF, 0x10EF, 0x10EF, 0x18CE, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x81DB, 0x81DC, 0x81DB, 0x81DB, 0x81BC, 0x81BB, 0x81BC, 0x81DC, 0x81DC, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x20CB, 0x612E, 0xD1F3, 0xC9F3, 0xC1B2, 0x612E, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x4931, 0x4930, 0x4133, 0x197A, 0x01DE, 0x021F, 0x027F, 0x02BF, 0x02FF, 0x033F, 0x037F, 0x03BF, 0x03FF, 0x045F, 0x049F, 0x04DF, 0x051F, 0x057F, 0x059F, 0x05DF, 0x05DF, 0x05DF, 0x05BF, 0x059F, 0x055F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04DF, 0x04BF, 0x047F, 0x045F, 0x043F, 0x043F, 0x047F, 0x04BF, 0x04FF, 0x053F, 0x05BF, 0x061F, 0x069F, 0x9972, 0xA111, 0xA111, 0xA111, 0xA111, 0x5130, 0x4910, 0x410F, 0x390F, 0x390E, 0x38ED, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x08F1, 0x0115, 0x00F4, 0x18CC, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x18CC, 0x00F3, 0x0115, 0x0114, 0x0115, 0x00F4, 0x00F2, 0x20CB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0xA93D, 0xA93D, 0xA95C, 0xA93D, 0xA95C, 0xA95D, 0xA93C, 0xA95D, 0xA93D, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x510D, 0xD1F3, 0xC9D2, 0x816F, 0x30CC, 0x28AC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4110, 0x410F, 0x4910, 0x4930, 0x4930, 0x4930, 0x4931, 0x4932, 0x31B6, 0x0A9D, 0x02FF, 0x035F, 0x039F, 0x03FF, 0x043F, 0x047F, 0x04BF, 0x051F, 0x055F, 0x05BF, 0x05DF, 0x061F, 0x063F, 0x063F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04BF, 0x047F, 0x047F, 0x047F, 0x049F, 0x04DF, 0x053F, 0x057F, 0x05FF, 0x065F, 0x06DF, 0x7A95, 0xA111, 0xA111, 0xA111, 0xA111, 0x6911, 0x4930, 0x410F, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x08F1, 0x0114, 0x0114, 0x18CD, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x08F2, 0x0115, 0x0114, 0x0115, 0x0114, 0x0115, 0x0114, 0x10EF, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20CB, 0x20AB, 0xC8BE, 0xD0BE, 0xC8BE, 0xC8BE, 0xD0BE, 0xC8BE, 0xD0BE, 0xD0BE, 0xC8BE, - 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x40EC, 0xC1D2, 0xC1B3, 0x490D, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390F, 0x410F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4910, 0x4930, 0x4931, 0x4951, 0x4951, 0x39D5, 0x131C, 0x041F, 0x047F, 0x04BF, 0x051F, 0x055F, 0x059F, 0x05DF, 0x061F, 0x067F, 0x069F, 0x069F, 0x067F, 0x065F, 0x061F, 0x05FF, 0x05FF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x04FF, 0x04DF, 0x04BF, 0x04BF, 0x04BF, 0x04DF, 0x051F, 0x057F, 0x05BF, 0x063F, 0x069F, 0x071F, 0x5438, 0xA111, 0xA111, 0xA111, 0xA111, 0x8111, 0x4930, 0x410F, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x08F1, 0x0115, 0x00F4, 0x18CC, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x18CC, 0x00F5, 0x0115, 0x00F4, 0x0115, 0x0115, 0x0114, 0x0115, 0x00F4, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, 0xF03F, - 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x30CB, 0xA992, 0xA9B1, 0x30CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CC, 0x30EC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38ED, 0x38ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x5130, 0x4931, 0x5131, 0x3A15, 0x237B, 0x053F, 0x059F, 0x5358, 0x349B, 0x0E1F, 0x06BF, 0x06FF, 0x06FF, 0x06DF, 0x06BF, 0x069F, 0x065F, 0x063F, 0x061F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x051F, 0x04FF, 0x04DF, 0x04DF, 0x04FF, 0x051F, 0x055F, 0x059F, 0x05FF, 0x065F, 0x06DF, 0x073F, 0x359B, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x4930, 0x4910, 0x412F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x00F3, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x0115, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x0114, 0x0114, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20CA, - 0x790F, 0x68EE, 0x50ED, 0x38CC, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x692F, 0x816F, 0x20AB, 0x20CB, 0x20AB, 0x28CB, 0x28CB, 0x28CB, 0x28AB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x4930, 0x4931, 0x4931, 0x5131, 0x49D4, 0x243A, 0xA132, 0xA8F1, 0xA8F1, 0xA8F1, 0x8295, 0x8295, 0x5418, 0x351B, 0x06DF, 0x069F, 0x067F, 0x065F, 0x063F, 0x05FF, 0x05FF, 0x05BF, 0x059F, 0x057F, 0x055F, 0x053F, 0x051F, 0x051F, 0x053F, 0x057F, 0x059F, 0x05DF, 0x063F, 0x069F, 0x06FF, 0x077F, 0x0F5F, 0xA111, 0xA111, 0xA111, 0xA111, 0x9931, 0x6911, 0x4930, 0x410F, 0x390E, 0x38EE, 0x30ED, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x18CB, 0x00F2, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x00F5, 0x0114, 0x0115, 0x0114, 0x0115, 0x0115, 0x0115, 0x0115, 0x0114, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, - 0x8130, 0x8930, 0x8930, 0x8910, 0x8930, 0x790F, 0x690E, 0x48CD, 0x38CC, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20CB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x28CB, 0x28AB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30EE, 0x38ED, 0x38ED, 0x390E, 0x390E, 0x390E, 0x410E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x4930, 0x5131, 0x5131, 0x6992, 0xA8F1, 0xA911, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA8F1, 0xA172, 0x4C39, 0x2D5C, 0x069F, 0x065F, 0x063F, 0x061F, 0x05FF, 0x05DF, 0x059F, 0x057F, 0x055F, 0x055F, 0x055F, 0x057F, 0x059F, 0x05DF, 0x061F, 0x067F, 0x06DF, 0x073F, 0x079F, 0x07DF, 0x8254, 0xA111, 0xA131, 0xA111, 0x9911, 0x8131, 0x4910, 0x410F, 0x410E, 0x38EE, 0x38ED, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x08F2, 0x00F5, 0x0114, 0x0114, 0x0115, 0x0115, 0x0114, 0x10F0, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, - 0x8930, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8910, 0x8130, 0x710F, 0x60EE, 0x48ED, 0x38CC, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30EC, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x390F, 0x410F, 0x410F, 0x410F, 0x412F, 0x4930, 0x4910, 0x4930, 0x5131, 0x5131, 0x6931, 0xA111, 0xA8F1, 0xA8F1, 0xA8F1, 0xA8F1, 0xA911, 0xA111, 0xA911, 0xA0F1, 0x9972, 0x4419, 0x067F, 0x065F, 0x061F, 0x05FF, 0x05DF, 0x05BF, 0x059F, 0x059F, 0x05BF, 0x05BF, 0x05DF, 0x061F, 0x065F, 0x06BF, 0x06FF, 0x075F, 0x07BF, 0x07FF, 0x5498, 0xA131, 0xA111, 0xA111, 0xA111, 0x9911, 0x4930, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AB, 0x20CC, 0x00F3, 0x00F4, 0x0114, 0x0114, 0x0114, 0x08F2, 0x20CB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, - 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710F, 0x58ED, 0x48CC, 0x30CB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x28CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CC, 0x30EC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x390E, 0x390E, 0x390E, 0x390F, 0x410F, 0x410F, 0x490F, 0x412F, 0x4910, 0x4930, 0x4931, 0x4931, 0x5931, 0x9111, 0xA8F1, 0xA8F1, 0xA911, 0xA8F1, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA111, 0x7A55, 0x34BB, 0x065F, 0x061F, 0x05FF, 0x05DF, 0x05DF, 0x05DF, 0x05DF, 0x05FF, 0x063F, 0x065F, 0x069F, 0x06DF, 0x071F, 0x077F, 0x07BF, 0x07FF, 0x2E3C, 0x9911, 0xA111, 0xA111, 0x9931, 0x9931, 0x6910, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20CB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20CB, 0x10CF, 0x10D0, 0x10EF, 0x10CE, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, - 0x8910, 0x8910, 0x8910, 0x810F, 0x890F, 0x890F, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x690F, 0x58EE, 0x40CD, 0x30CC, 0x20AB, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390E, 0x410F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4930, 0x4931, 0x5131, 0x7931, 0xA911, 0xA8F1, 0xA911, 0xA911, 0xA911, 0xA911, 0xA8F1, 0xA111, 0xA111, 0xA111, 0xA111, 0x91B3, 0x62F6, 0x347B, 0x061F, 0x061F, 0x063F, 0x063F, 0x065F, 0x067F, 0x06BF, 0x071F, 0x073F, 0x079F, 0x07DF, 0x07FF, 0x07FF, 0xA111, 0x9912, 0x9911, 0x9931, 0x9932, 0x8131, 0x4130, 0x410F, 0x410E, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x810F, 0x810F, 0x810F, 0x890F, 0x8910, 0x8910, 0x8110, 0x8110, 0x8110, 0x8110, 0x8910, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x810F, 0x710F, 0x50ED, 0x40CC, 0x28AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x38EE, 0x38EE, 0x390F, 0x410F, 0x410F, 0x410F, 0x4910, 0x4930, 0x4930, 0x4930, 0x7111, 0xA911, 0xA911, 0xA911, 0xA911, 0xA111, 0xA911, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x91B3, 0x349B, 0x065F, 0x067F, 0x069F, 0x06BF, 0x06FF, 0x073F, 0x077F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x7AD4, 0xA111, 0x9911, 0xA111, 0x9931, 0x9931, 0x4930, 0x410F, 0x390E, 0x38EE, 0x30EE, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x8910, 0x8910, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x810F, 0x710F, 0x50ED, 0x38CC, 0x28AB, 0x20AB, 0x20AB, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28AB, 0x28AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x4110, 0x4930, 0x4930, 0x5130, 0x8111, 0xA111, 0xA911, 0xA111, 0xA111, 0xA911, 0xA112, 0xA111, 0xA911, 0xA111, 0xA112, 0xA0F1, 0xA111, 0xA111, 0xA111, 0x7A75, 0x15FD, 0x06BF, 0x06FF, 0x071F, 0x075F, 0x079F, 0x07BF, 0x07FF, 0x07FF, 0x07FF, 0x5499, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x6930, 0x410F, 0x390E, 0x390E, 0x38EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x790F, 0x690E, 0x50ED, 0x38CC, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x20AB, 0x28AB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x40EE, 0x410F, 0x410F, 0x410F, 0x4130, 0x4930, 0x4930, 0x5931, 0x90F1, 0xA911, 0xA912, 0xA111, 0xA111, 0xA111, 0xA911, 0xA911, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0x9972, 0x353B, 0x071F, 0x073F, 0x077F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x2E3C, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x8931, 0x410F, 0x410F, 0x38EE, 0x38EE, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x810F, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8130, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8130, 0x8130, 0x8930, 0x8930, 0x790F, 0x690E, 0x50ED, 0x38CC, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x390E, 0x390E, 0x390E, 0x410F, 0x410F, 0x412F, 0x4130, 0x4930, 0x4930, 0x8111, 0xA911, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0xA112, 0xA111, 0xA111, 0x4499, 0x077F, 0x079F, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x9931, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x490F, 0x410F, 0x38EE, 0x30EE, 0x38ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x90EF, 0x88EF, 0x80EF, 0x810F, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x810F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x810F, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710F, 0x60EE, 0x48ED, 0x38EC, 0x20AA, 0x20AA, 0x20CB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x28AB, 0x28AB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CC, 0x30CD, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x310E, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x412F, 0x4930, 0x4930, 0x7131, 0xA111, 0xA111, 0xA112, 0xA111, 0xA0F1, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA131, 0x6397, 0x07BF, 0x07DF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x7AD4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x7130, 0x390F, 0x38EE, 0x38EE, 0x38ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x990F, 0x990F, 0x910F, 0x910F, 0x890F, 0x88EF, 0x810F, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8930, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x710F, 0x58EE, 0x48ED, 0x30CB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30EC, 0x30ED, 0x38EE, 0x30ED, 0x38ED, 0x390E, 0x38EE, 0x410E, 0x410F, 0x410F, 0x4930, 0x4930, 0x6931, 0xA111, 0xA111, 0xA112, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA112, 0x9931, 0x9911, 0x6397, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x5C14, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9131, 0x410F, 0x390E, 0x390E, 0x30ED, 0x30ED, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x910F, 0x98EF, 0x910F, 0x910F, 0x98EF, 0x990F, 0x910F, 0x890F, 0x88EF, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x810F, 0x810F, 0x8110, 0x8910, 0x8910, 0x8110, 0x8110, 0x8910, 0x8110, 0x8110, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x710F, 0x58ED, 0x40ED, 0x30CB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x30EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x4130, 0x4930, 0x5931, 0x7911, 0x9131, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0xA111, 0x9931, 0xA111, 0x9931, 0x5498, 0x07FF, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x35F5, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x510F, 0x390E, 0x390E, 0x38ED, 0x30ED, 0x30CC, 0x30CC, 0x28CC, 0x28CB, 0x28CB, 0x28AB, 0x20CB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x890F, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x88EF, 0x890F, 0x810F, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x810F, 0x810F, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x890F, 0x8910, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8130, 0x68EF, 0x50ED, 0x40CC, 0x28CB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20CB, 0x28AB, 0x28CB, 0x20CB, 0x28AB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30CD, 0x30ED, 0x30ED, 0x38ED, 0x38EE, 0x38EE, 0x390E, 0x410F, 0x410F, 0x412F, 0x4130, 0x4930, 0x4930, 0x6131, 0x8931, 0xA111, 0xA111, 0xA111, 0xA131, 0xA111, 0xA111, 0x9931, 0xA111, 0xA111, 0xA111, 0xA111, 0x3D7A, 0x07FF, 0x07FF, 0x07FF, 0x07FE, 0x07F6, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7911, 0x390E, 0x38EE, 0x30EE, 0x30ED, 0x30CD, 0x30CC, 0x28CC, 0x28CC, 0x28CB, 0x28AB, 0x28AB, 0x20AB, 0x20AB, 0x20CA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x18AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x78EE, 0x78EE, 0x80EE, 0x80EE, 0x80EE, 0x78EE, 0x80EE, 0x80EE, 0x80EF, 0x80EF, 0x80EF, 0x80EE, 0x80EF, 0x810F, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x8910, 0x8110, 0x8130, 0x8910, 0x810F, 0x8110, 0x810F, 0x8910, 0x8910, 0x8910, 0x8930, 0x8930, 0x8910, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8930, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8930, 0x8110, 0x690F, 0x50ED, 0x38CC, 0x28AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20CB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x18AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20CA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x28CB, 0x20AB, 0x20CB, 0x20CB, 0x28CB, 0x28CB, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x28CC, 0x30CC, 0x30EC, 0x30ED, 0x30ED, 0x30ED, 0x38EE, 0x38EE, 0x390E, 0x390E, 0x410F, 0x410F, 0x410F, 0x4930, 0x4930, 0x5131, 0x6131, 0x9911, 0xA111, 0xA111, 0xA111, 0x9931, 0xA111, 0xA111, 0xA112, 0x9931, 0x9911, 0x9192, 0x1EBD, 0x07FF, 0x07FF, 0x07FE, 0x07F6, 0x7A71, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x9111, 0x410E, 0x38EE, 0x30ED, 0x30ED, 0x30ED, 0x28CC, 0x28CC, 0x28CB, 0x28CB, 0x20AB, 0x28AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20CA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x208A, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, - 0x78EE, 0x78EE, 0x78EE, 0x78EE, 0x80EE, 0x78EE, 0x78EE, 0x80EE, 0x80EE, 0x80EF, 0x80EF, 0x80EE, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x810E, 0x810F, 0x80EF, 0x80EF, 0x80EF, 0x80EF, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x810F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x890F, 0x8110, 0x810F, 0x890F, 0x890F, 0x810F, 0x810F, 0x810F, 0x890F, 0x8910, 0x8910, 0x8910, 0x8910, 0x8910, 0x8130, 0x8910, 0x8930, 0x8130, 0x8930, 0x8930, 0x8910, 0x8910, 0x8130, 0x8930, 0x8930, 0x8930, 0x8930, 0x8130, 0x8130, 0x8930, 0x710F, 0x690E, 0x50ED, 0x38CC, 0x28AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20CB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AA, 0x20CA, 0x20AA, 0x20AB, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AA, 0x20AB, 0x20AA, 0x20AB, 0x20AB, 0x20AC, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CC, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x20CD, 0x28CD, 0x28CD, 0x28CD, 0x28CD, 0x20CD, 0x28CE, 0x28CE, 0x28CE, 0x28EE, 0x28CE, 0x28EE, 0x30EE, 0x30EF, 0x30EF, 0x30EF, 0x390F, 0x390F, 0x3910, 0x3910, 0x4110, 0x4131, 0x4931, 0x4931, 0x4932, 0x4952, 0x5152, 0x9132, 0xA111, 0xA111, 0xA111, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x8274, 0x07FF, 0x07FF, 0x07FD, 0x07F6, 0x5C32, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5910, 0x390F, 0x30EF, 0x30EF, 0x30EE, 0x30CE, 0x28CD, 0x28EE, 0x28ED, 0x28CD, 0x20CD, 0x20AC, 0x20CD, 0x20CD, 0x20AD, 0x20CD, 0x20AD, 0x20CC, 0x20CC, 0x20AD, 0x20CC, 0x20AC, 0x20CC, 0x20CC, 0x20AC, 0x20AC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20CD, 0x20AD, 0x18CC, 0x20CC, 0x20AC, 0x20CC, 0x20AD, 0x20CC, 0x20AC, 0x20AC, 0x20CC, 0x18CC, 0x18CC, 0x20CC, 0x20CC, 0x20CC, 0x20CC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x20AC, 0x18AC, 0x20AC, 0x20AC, 0x20AC, 0x20CC, 0x18AC, 0x18AC, 0x20AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AC, 0x18AB, 0x18AB, 0x18AB, 0x18AC, 0x18AC, 0x18AC, 0x18AB, - 0x78D0, 0x78D0, 0x78D0, 0x78F0, 0x78F0, 0x78F1, 0x78F0, 0x78F0, 0x78F0, 0x78F1, 0x78F1, 0x80F0, 0x78F1, 0x78F0, 0x80F1, 0x80D1, 0x80F1, 0x80F1, 0x80F1, 0x80F1, 0x80F0, 0x80F0, 0x80F0, 0x80F0, 0x80F0, 0x80F0, 0x80F0, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8111, 0x8111, 0x8111, 0x8111, 0x8110, 0x8110, 0x8110, 0x8111, 0x8911, 0x8110, 0x8110, 0x8111, 0x8110, 0x8911, 0x8911, 0x8911, 0x8111, 0x8911, 0x8911, 0x8910, 0x8911, 0x8911, 0x8911, 0x8911, 0x8111, 0x8131, 0x8131, 0x8931, 0x8911, 0x8911, 0x8911, 0x8911, 0x8931, 0x8911, 0x8131, 0x8131, 0x8931, 0x8130, 0x8131, 0x8911, 0x8931, 0x7931, 0x6111, 0x4911, 0x30D2, 0x18F2, 0x10F2, 0x18D2, 0x18D2, 0x10F2, 0x18D2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F2, 0x20F2, 0x18F2, 0x18F2, 0x20F2, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F2, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x2113, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F3, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x28F3, 0x28F3, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2914, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x28F3, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2113, 0x2913, 0x2914, 0x2913, 0x2913, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3134, 0x3134, 0x3934, 0x3934, 0x3935, 0x3955, 0x4155, 0x4155, 0x4176, 0x4176, 0x4976, 0x4977, 0x5176, 0x9132, 0xA111, 0xA111, 0x9931, 0x9911, 0xA111, 0x9931, 0x9931, 0x9912, 0x9931, 0x5C38, 0x07FF, 0x07FD, 0x07F6, 0x44F2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x7933, 0x3955, 0x3135, 0x3134, 0x3114, 0x2133, 0x2113, 0x2113, 0x20F3, 0x20F3, 0x2113, 0x1912, 0x18F2, 0x20F3, 0x18F2, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18D2, 0x10F2, 0x18F2, 0x18D2, 0x10F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x10F2, 0x10F2, 0x18F2, 0x18F2, 0x10F2, 0x10F2, 0x10F2, 0x10D2, 0x10D2, 0x10D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x10D2, 0x10D2, 0x10D2, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10B1, 0x10B1, 0x10B1, 0x10B1, 0x10D0, 0x10B0, 0x10D0, 0x10B0, 0x10B0, 0x10D0, 0x10B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, - 0x0051, 0x0071, 0x0071, 0x0071, 0x0071, 0x0051, 0x0071, 0x0070, 0x0870, 0x0870, 0x0071, 0x0071, 0x0091, 0x0870, 0x0071, 0x0091, 0x0071, 0x0871, 0x0871, 0x0891, 0x0871, 0x0871, 0x0871, 0x0871, 0x0891, 0x0891, 0x0891, 0x0891, 0x0871, 0x0871, 0x0871, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0892, 0x0891, 0x0891, 0x0891, 0x0892, 0x0891, 0x0891, 0x08B1, 0x08B1, 0x08B1, 0x08B2, 0x10B2, 0x08B1, 0x08B2, 0x08B1, 0x08B2, 0x08B2, 0x08B2, 0x10B2, 0x10B2, 0x10B2, 0x10B2, 0x10B2, 0x08B2, 0x10B2, 0x10B2, 0x08B2, 0x08B2, 0x10B2, 0x10B2, 0x10B2, 0x10B2, 0x10B2, 0x10D2, 0x10D2, 0x10D2, 0x10F2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x18D2, 0x18D2, 0x10F2, 0x18D2, 0x18D2, 0x10D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F2, 0x18F3, 0x18F3, 0x20F2, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x18F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2112, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x20F2, 0x20F3, 0x20F2, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x20F3, 0x2113, 0x28F3, 0x2113, 0x20F3, 0x2113, 0x28F3, 0x20F3, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x28F3, 0x28F3, 0x2113, 0x2113, 0x2113, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x28F3, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2913, 0x2913, 0x2914, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2913, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2113, 0x2913, 0x28F3, 0x28F3, 0x2913, 0x2113, 0x2913, 0x2913, 0x2113, 0x2113, 0x28F3, 0x2913, 0x2113, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x2914, 0x3134, 0x3134, 0x3134, 0x3135, 0x3935, 0x3935, 0x3955, 0x3955, 0x4155, 0x4156, 0x4176, 0x4976, 0x4956, 0x5176, 0x9132, 0xA111, 0xA112, 0xA111, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9911, 0x2E5C, 0x07FC, 0x07F6, 0x2E53, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9931, 0x9132, 0x3134, 0x3134, 0x3134, 0x2934, 0x2914, 0x2913, 0x2113, 0x2113, 0x20F3, 0x2112, 0x20F3, 0x20D3, 0x1912, 0x18F2, 0x18F3, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x20F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18D2, 0x18D2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x18F2, 0x18F2, 0x18F2, 0x10F2, 0x10F2, 0x18F2, 0x18F2, 0x18D2, 0x18F2, 0x10F2, 0x18F2, 0x18D2, 0x10F2, 0x18F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10F2, 0x10D2, 0x10D2, 0x10F2, 0x10F2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D2, 0x10D1, 0x10D1, 0x10D2, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10D1, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x10B0, 0x08B0, 0x10B0, 0x10B0, 0x08B0, 0x08B0, 0x10B0, 0x10D0, 0x08D0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, - 0x0CDC, 0x0CDC, 0x0CDB, 0x0CDC, 0x0CFB, 0x0CDC, 0x14DC, 0x14FC, 0x0CDC, 0x14FC, 0x14DC, 0x0CFC, 0x0CFC, 0x14FC, 0x0CFC, 0x14FC, 0x14FC, 0x14FC, 0x14FC, 0x14FC, 0x14FC, 0x14FC, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x153C, 0x153C, 0x153C, 0x153C, 0x151C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x155C, 0x153C, 0x153C, 0x1D5C, 0x1D5C, 0x1D5C, 0x155C, 0x155C, 0x155C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x155C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x157C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x259C, 0x1DBC, 0x1D9D, 0x259D, 0x1D9C, 0x259C, 0x259C, 0x259C, 0x259C, 0x259C, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x1DDD, 0x25DD, 0x25DD, 0x25DD, 0x25BD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25DD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x25FD, 0x25FD, 0x25FD, 0x25FD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x2DFD, 0x25FD, 0x2DFE, 0x2DFD, 0x2DFD, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3E, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x365E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x365E, 0x365E, 0x2E5D, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E5E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3E, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3E, 0x2E3D, 0x2E3E, 0x2E3D, 0x363D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E3D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x2E1D, 0x361D, 0x361D, 0x361D, 0x361D, 0x361D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1D, 0x3E1E, 0x461E, 0x461D, 0x4DFE, 0x4DFD, 0x4E3E, 0x4DFE, 0x55DD, 0x9214, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9911, 0x9931, 0x7A74, 0x07FB, 0x07F6, 0x07F6, 0x9931, 0x9931, 0x9911, 0x9932, 0x9931, 0x9931, 0x9931, 0x4CFB, 0x3DFE, 0x35DD, 0x35DD, 0x2DDD, 0x2DDD, 0x2DDD, 0x2DDD, 0x25DD, 0x25DD, 0x25BD, 0x25BD, 0x25DD, 0x25DD, 0x25BD, 0x25DC, 0x25BD, 0x25BD, 0x25BD, 0x1DBD, 0x25BC, 0x1DBD, 0x1DBD, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1DBC, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9D, 0x1D9C, 0x1D9C, 0x1DBC, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9C, 0x1D9D, 0x1D9C, 0x1D9D, 0x1D9C, 0x1D7C, 0x1D7C, 0x1D7D, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D7C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x157C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x1D5C, 0x155C, 0x155C, 0x155C, 0x1D5C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x153C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151B, 0x151B, 0x151B, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, 0x151C, - 0x0BFB, 0x0BFB, 0x0BFB, 0x0BFB, 0x0BFB, 0x0C1B, 0x0C1B, 0x0C1B, 0x0C1B, 0x141B, 0x141B, 0x145B, 0x14DC, 0x0CDB, 0x14BC, 0x143B, 0x141B, 0x0C1B, 0x0C1B, 0x141C, 0x141B, 0x141B, 0x141B, 0x141B, 0x141B, 0x141B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143C, 0x143B, 0x145B, 0x151C, 0x0D1B, 0x151C, 0x145B, 0x143B, 0x145C, 0x143B, 0x145C, 0x1C5B, 0x143B, 0x145C, 0x145C, 0x145C, 0x145C, 0x145C, 0x145B, 0x145C, 0x145B, 0x145B, 0x1C5C, 0x145C, 0x147C, 0x147C, 0x147C, 0x145C, 0x1C7C, 0x1C5C, 0x147C, 0x147C, 0x1C7C, 0x1CDC, 0x1D5C, 0x155C, 0x1CBC, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7B, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x249C, 0x1C9C, 0x1D9D, 0x1D7C, 0x1CFC, 0x1C9C, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24DC, 0x24DC, 0x24DC, 0x253D, 0x25BD, 0x253D, 0x24DD, 0x24BC, 0x24BC, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24DD, 0x24FD, 0x24DC, 0x24DC, 0x24FD, 0x24FD, 0x24FC, 0x24DD, 0x24FD, 0x251C, 0x25FD, 0x255D, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FC, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x24FD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x251D, 0x24FD, 0x24FD, 0x251D, 0x2D1D, 0x24FD, 0x2CFD, 0x25BD, 0x25BD, 0x253C, 0x2CFC, 0x2D1D, 0x251D, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1C, 0x2D5D, 0x2DDE, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2E1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D3D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2DDD, 0x2D5D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2D1D, 0x2D1D, 0x2CFD, 0x2CFD, 0x2CFD, 0x2DBD, 0x2DBD, 0x2CFD, 0x2D1D, 0x251C, 0x251C, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x2CFD, 0x34FD, 0x34FD, 0x34FD, 0x34FD, 0x34FD, 0x3CFD, 0x3CFD, 0x3CFD, 0x3CFD, 0x3D1D, 0x451D, 0x451D, 0x451D, 0x4D1D, 0x4D1D, 0x553D, 0x91B3, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA112, 0x9931, 0x9931, 0x5496, 0x07F7, 0x07F7, 0x8A13, 0xA111, 0x9931, 0x9931, 0x9912, 0x9932, 0x9911, 0x6318, 0x34DD, 0x34DD, 0x2CDD, 0x2CDC, 0x2CDD, 0x2CBC, 0x24DC, 0x24BC, 0x24BC, 0x253C, 0x25BD, 0x253C, 0x24BC, 0x24BC, 0x24BC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x24BC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1CBC, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C7C, 0x1C9C, 0x1CDC, 0x1D7C, 0x1D5C, 0x1C9C, 0x1C9C, 0x1C7B, 0x1C7C, 0x1C9C, 0x1C7B, 0x1C9C, 0x1C9C, 0x1C9C, 0x1C7C, 0x1C9C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x147C, 0x147C, 0x147C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C7C, 0x1C5C, 0x1C9C, 0x153C, 0x155C, 0x14BC, 0x145B, 0x145B, 0x1C5C, 0x147B, 0x145B, 0x145B, 0x145B, 0x145B, 0x145B, 0x145B, 0x145B, 0x145C, 0x145C, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x143B, 0x151C, 0x14FB, 0x14FC, 0x145B, 0x143B, 0x143B, 0x141B, 0x141B, 0x141B, 0x141B, 0x141B, 0x141B, - 0x0A5A, 0x0A5A, 0x0A5A, 0x0A5A, 0x0A7A, 0x0A5A, 0x0AFA, 0x0C1B, 0x0CBB, 0x0C9B, 0x0B9B, 0x0A9A, 0x125A, 0x0A7A, 0x0A7A, 0x0A7A, 0x0A7A, 0x127A, 0x127A, 0x0A7A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x127A, 0x129A, 0x129A, 0x129A, 0x133B, 0x145B, 0x0D1C, 0x149C, 0x131B, 0x129B, 0x129B, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129B, 0x129A, 0x129B, 0x129B, 0x129B, 0x129B, 0x129B, 0x129B, 0x129A, 0x129B, 0x1ABB, 0x129B, 0x131B, 0x147C, 0x153B, 0x145C, 0x12FB, 0x1ABB, 0x12BA, 0x1ABB, 0x1ABB, 0x12BB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1B3B, 0x1CFC, 0x157C, 0x1C1C, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x22DB, 0x22FB, 0x231C, 0x1D1C, 0x1D5C, 0x235B, 0x22DC, 0x22DB, 0x22DC, 0x22FB, 0x22FC, 0x22DC, 0x22DC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FB, 0x22FB, 0x22FB, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231B, 0x22FC, 0x233C, 0x253C, 0x1CFD, 0x22FC, 0x22FC, 0x22FB, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x22FC, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x2AFC, 0x2AFC, 0x231C, 0x2B1C, 0x2B1C, 0x259C, 0x247C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x231C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x25BD, 0x2BBC, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x25DD, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B7C, 0x259D, 0x2B1C, 0x2B1C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x231C, 0x245D, 0x259C, 0x22FC, 0x2AFC, 0x231C, 0x2AFC, 0x22FC, 0x231C, 0x231C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2B1C, 0x2AFC, 0x2B1C, 0x2B1C, 0x2B1C, 0x331C, 0x331C, 0x331C, 0x331C, 0x331C, 0x3B1C, 0x3B3D, 0x3B3D, 0x3B3D, 0x433C, 0x433D, 0x4B3D, 0x435D, 0x5A9A, 0x9932, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1737, 0x07F9, 0x72D4, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8194, 0x331C, 0x32FC, 0x2AFB, 0x2AFC, 0x2AFB, 0x22FB, 0x22DC, 0x22DC, 0x22FB, 0x22DB, 0x22DB, 0x235C, 0x1D5C, 0x1D1D, 0x231B, 0x1ADB, 0x1ADB, 0x1ADB, 0x22DB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ADB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ADB, 0x1BFC, 0x1D5C, 0x14DC, 0x1B3B, 0x1ABB, 0x1ADB, 0x1ABB, 0x1ABB, 0x12DB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x1ABB, 0x129B, 0x12BB, 0x129A, 0x12BA, 0x129A, 0x12DB, 0x143B, 0x151B, 0x14BB, 0x1AFB, 0x12BA, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x129A, 0x127A, 0x127A, 0x127A, 0x131B, 0x147C, 0x14DB, 0x145B, 0x131A, 0x127A, 0x127A, 0x127A, 0x127A, - 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B5A, 0x0C1B, 0x0C9B, 0x0C9B, 0x0BBA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3B, 0x0B3A, 0x0B3A, 0x0B3B, 0x133B, 0x0B3B, 0x0B3B, 0x0B3B, 0x133A, 0x0B3A, 0x0C3B, 0x14DC, 0x14BC, 0x13FB, 0x0B3A, 0x133B, 0x133B, 0x133B, 0x135B, 0x0B5B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x135B, 0x0B5A, 0x135B, 0x135B, 0x135B, 0x135B, 0x0B5B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x13FB, 0x151C, 0x14FC, 0x13DB, 0x135B, 0x137B, 0x137B, 0x137B, 0x137B, 0x135B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x137B, 0x1B5B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x139B, 0x1BBB, 0x14FB, 0x153C, 0x13FB, 0x1B7B, 0x139B, 0x1B7B, 0x1B7C, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1B9B, 0x1B9B, 0x139C, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1B9B, 0x1D3C, 0x1D5C, 0x1BFB, 0x1B9C, 0x1BBB, 0x1B9B, 0x1BBC, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBC, 0x1BBB, 0x1CDC, 0x1D7D, 0x23FC, 0x1BDC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x1BBC, 0x1BBC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x247C, 0x1D9C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x241C, 0x259D, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x1DBD, 0x243C, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x259C, 0x247C, 0x23BC, 0x23BC, 0x23DC, 0x23BC, 0x23DC, 0x23DC, 0x23BC, 0x23BC, 0x23BC, 0x23DC, 0x23DC, 0x23DC, 0x23DC, 0x2BDC, 0x2BDC, 0x2BDC, 0x2BDC, 0x2BDC, 0x33DC, 0x33DC, 0x33DC, 0x33DC, 0x3BDC, 0x3BFC, 0x3BFC, 0x3BDC, 0x43FC, 0x43FD, 0x6B18, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x6B53, 0x07FA, 0x5437, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9912, 0x9931, 0x2BBC, 0x2BBC, 0x2BBC, 0x2BBB, 0x23BB, 0x23BB, 0x239B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BDB, 0x1D5C, 0x1D1C, 0x1B9B, 0x1B9B, 0x139B, 0x139C, 0x1B9B, 0x1B7B, 0x1B7B, 0x139B, 0x1B9B, 0x1B9B, 0x1B7B, 0x1B9B, 0x139B, 0x1B7B, 0x1B7B, 0x1B9B, 0x1B9B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B9B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x139B, 0x1BBB, 0x151C, 0x151C, 0x13DB, 0x137B, 0x137B, 0x135B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x135B, 0x135B, 0x135B, 0x137B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x13DA, 0x14FB, 0x0CFB, 0x141B, 0x133A, 0x135B, 0x133B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133A, 0x133B, 0x0B5B, 0x133B, 0x133A, 0x0B3A, 0x133A, 0x133A, 0x0B3B, 0x0B3B, 0x0B3B, 0x0B3A, 0x133A, 0x0B1A, 0x0B3B, 0x0B3A, 0x0BDA, 0x14BB, 0x0CBB, 0x0C1B, 0x0B3A, 0x0B3B, 0x0B3A, - 0x0BDB, 0x0C7B, 0x0C7B, 0x0C1A, 0x0B3A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0C1B, 0x0CBB, 0x0C9B, 0x0BBB, 0x0B5A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x133A, 0x133A, 0x0B3A, 0x133B, 0x0B3A, 0x133A, 0x0B3A, 0x133A, 0x0B3A, 0x135A, 0x133A, 0x133B, 0x133A, 0x133B, 0x0B3A, 0x0C7B, 0x0CFB, 0x147B, 0x137B, 0x0B5B, 0x0B5B, 0x135A, 0x135A, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x137B, 0x135A, 0x135A, 0x137B, 0x135A, 0x135B, 0x139B, 0x14BB, 0x14FB, 0x13FB, 0x137B, 0x137B, 0x135B, 0x137B, 0x137A, 0x137A, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x1BBB, 0x153C, 0x151C, 0x1B7B, 0x139B, 0x137B, 0x139B, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x13BB, 0x139B, 0x1B9B, 0x139B, 0x1B9B, 0x1B9B, 0x1B9C, 0x1C3B, 0x1D5C, 0x1C3C, 0x1B9B, 0x1BBB, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBB, 0x1BBB, 0x1C9C, 0x1D1C, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BDB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1CFC, 0x1C7C, 0x1BBB, 0x1BDB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BDC, 0x23BC, 0x1BBB, 0x1D7C, 0x1BBB, 0x1BDC, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1B9C, 0x1BDC, 0x1BBB, 0x1C5B, 0x1CFB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBB, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBC, 0x1BBB, 0x1BBB, 0x1BBB, 0x1B9B, 0x1D3C, 0x1CBC, 0x1BBB, 0x1BBB, 0x1B9B, 0x1B9C, 0x1B9C, 0x1B9B, 0x1B9B, 0x1BBB, 0x1B9C, 0x1B9B, 0x1BBB, 0x239B, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x23BC, 0x2BBC, 0x2BBC, 0x2BBC, 0x2BBC, 0x33BC, 0x33BC, 0x33DC, 0x3BDC, 0x3BDC, 0x3BDC, 0x3BDC, 0x8194, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9911, 0x9931, 0x2659, 0x4C98, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x4B19, 0x23BC, 0x239B, 0x239B, 0x239B, 0x1B9B, 0x1B9B, 0x1B9B, 0x1B7B, 0x1B7B, 0x1B7B, 0x1B7B, 0x137B, 0x137B, 0x137B, 0x14BB, 0x151B, 0x13DB, 0x137B, 0x137A, 0x137B, 0x137B, 0x137A, 0x137B, 0x137B, 0x137B, 0x135B, 0x137B, 0x135B, 0x135B, 0x135B, 0x137B, 0x137B, 0x137B, 0x137B, 0x137B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x135A, 0x13BB, 0x14DB, 0x14BB, 0x137B, 0x135A, 0x135B, 0x0B5A, 0x135B, 0x135B, 0x135A, 0x0B5A, 0x135A, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x0B5A, 0x0B5A, 0x135A, 0x133A, 0x135A, 0x133A, 0x0B3A, 0x133B, 0x133A, 0x0B3A, 0x133B, 0x133B, 0x133A, 0x0B3A, 0x0B3A, 0x0C5B, 0x0CBB, 0x0C5B, 0x0B7A, 0x0B3A, 0x0B3B, 0x0B1A, 0x133B, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B9A, 0x0C9B, 0x0C9B, - 0x0BDA, 0x02F9, 0x01F9, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0178, 0x0178, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0178, 0x0979, 0x0978, 0x0979, 0x0979, 0x0979, 0x0979, 0x0A1A, 0x0B1A, 0x0C3A, 0x0C1B, 0x0ADA, 0x09F9, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x09F9, 0x0B1A, 0x0C7B, 0x0C1B, 0x0ABA, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x1199, 0x11BA, 0x11BA, 0x11B9, 0x09B9, 0x11BA, 0x1199, 0x11BA, 0x11BA, 0x1199, 0x11DA, 0x0B3A, 0x0C9B, 0x0BFB, 0x127A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x12BA, 0x14BB, 0x13FB, 0x11DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BB, 0x11BA, 0x11DA, 0x11BA, 0x11DA, 0x11BA, 0x11BA, 0x11DA, 0x11BA, 0x127A, 0x14DB, 0x137B, 0x11DA, 0x19BA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x11DB, 0x19DB, 0x11DA, 0x19DA, 0x1A3B, 0x14FB, 0x1AFB, 0x19DA, 0x11DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x1A1B, 0x153C, 0x1A3B, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x153B, 0x19DB, 0x19DA, 0x19DB, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x19DA, 0x11DB, 0x19DB, 0x19DA, 0x19DB, 0x19FB, 0x153C, 0x123A, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x11DA, 0x19DA, 0x11DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x19DB, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x19DB, 0x19BA, 0x11DA, 0x11BA, 0x1ABB, 0x14FB, 0x1A5B, 0x19BA, 0x19BA, 0x11DA, 0x11DA, 0x19DB, 0x19DB, 0x19DA, 0x19DB, 0x19BA, 0x19DA, 0x19DA, 0x19DB, 0x19DB, 0x19DB, 0x21DB, 0x21DB, 0x21DB, 0x21FB, 0x21FB, 0x29FB, 0x29FB, 0x29FB, 0x29FB, 0x31FB, 0x321B, 0x31FB, 0x321B, 0x41FA, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x72D4, 0x4C98, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x5996, 0x21DB, 0x21DA, 0x19DA, 0x19DA, 0x19DA, 0x11DA, 0x11DA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11D9, 0x137A, 0x149B, 0x131A, 0x11BA, 0x119A, 0x11B9, 0x11BA, 0x11BA, 0x119A, 0x11BA, 0x119A, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x11BA, 0x0999, 0x1199, 0x1199, 0x1199, 0x1199, 0x11BA, 0x11BA, 0x1199, 0x0999, 0x09B9, 0x0999, 0x0A1A, 0x0BFB, 0x0C9B, 0x131A, 0x09DA, 0x119A, 0x0999, 0x0999, 0x0999, 0x1199, 0x099A, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0ABA, 0x0BDA, 0x0C5B, 0x0B3A, 0x09F9, 0x0999, 0x0979, 0x0999, 0x0999, 0x0999, 0x0999, 0x0999, 0x0979, 0x0979, 0x0979, 0x0999, 0x0979, 0x0999, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0978, 0x0979, 0x0979, 0x0178, 0x0199, 0x0179, 0x0979, 0x0999, 0x02B9, - 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x0AB9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x0AB9, 0x02B9, 0x02B9, 0x02D9, 0x02D9, 0x02B9, 0x0AB9, 0x0AD9, 0x02D9, 0x0AD9, 0x0AB9, 0x0AB9, 0x03BA, 0x043A, 0x043A, 0x0359, 0x02D9, 0x0AD9, 0x02D9, 0x0AD9, 0x02D9, 0x02D9, 0x0AD9, 0x0AD9, 0x0AD9, 0x02D9, 0x0AD9, 0x02D9, 0x02D9, 0x0ADA, 0x0AFA, 0x02FA, 0x02FA, 0x02D9, 0x02FA, 0x0ADA, 0x0AFA, 0x02FA, 0x0AFA, 0x0AFA, 0x0AD9, 0x0AFA, 0x0ADA, 0x0AFA, 0x0B5A, 0x0C5B, 0x047A, 0x0BBA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0C3A, 0x0C9A, 0x0BDA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDB, 0x14BB, 0x0BFA, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0B3A, 0x131A, 0x0B3A, 0x0B1A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133B, 0x133B, 0x133A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x0B3A, 0x133A, 0x0B3A, 0x137A, 0x0CDB, 0x0C5B, 0x133B, 0x133B, 0x0B3A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x135B, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x135A, 0x0B5B, 0x133B, 0x143A, 0x147B, 0x135B, 0x135A, 0x133B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x13BB, 0x14DB, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135B, 0x133B, 0x14FB, 0x135A, 0x135B, 0x135A, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x135A, 0x133A, 0x135B, 0x135A, 0x135B, 0x135B, 0x149B, 0x13FB, 0x133A, 0x135B, 0x135B, 0x135A, 0x135A, 0x135A, 0x135B, 0x135B, 0x135B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133B, 0x133A, 0x133B, 0x133A, 0x135A, 0x133A, 0x143B, 0x147B, 0x133A, 0x133A, 0x133A, 0x133A, 0x133B, 0x133A, 0x133A, 0x133B, 0x133A, 0x133A, 0x133A, 0x135B, 0x133B, 0x133B, 0x1B3B, 0x1B5B, 0x1B5B, 0x1B3B, 0x1B5B, 0x235B, 0x235B, 0x235B, 0x235B, 0x2B5B, 0x2B5B, 0x2B7B, 0x2B7B, 0x335B, 0x7235, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x72D5, 0x9932, 0x9932, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x71B4, 0x1B3B, 0x1B3B, 0x133A, 0x133B, 0x133A, 0x131A, 0x131A, 0x131A, 0x131A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0AFA, 0x0B1A, 0x0AFA, 0x0BDA, 0x0CBB, 0x0BDA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0BBA, 0x049B, 0x0C3A, 0x0B3A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x02FA, 0x0AFA, 0x0ADA, 0x0ADA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x02DA, 0x0ADA, 0x0ADA, 0x0ADA, 0x02D9, 0x02D9, 0x02DA, 0x02FA, 0x02D9, 0x0AD9, 0x0AD9, 0x0B5A, 0x045A, 0x045A, 0x033A, 0x0AD9, 0x02D9, 0x02D9, 0x02DA, 0x0ADA, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x0AB9, 0x0AB9, 0x02D9, 0x02D9, 0x0AB9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x0AB9, 0x02B9, 0x02D9, 0x02B9, 0x02D9, 0x0AB9, - 0x0299, 0x0299, 0x0298, 0x0298, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0298, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02B8, 0x02B9, 0x0299, 0x02B8, 0x039A, 0x041A, 0x03FA, 0x0339, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02D9, 0x02B9, 0x02B9, 0x02D9, 0x02B9, 0x02D9, 0x03BA, 0x043A, 0x03FA, 0x02F9, 0x02D9, 0x02D9, 0x0AB9, 0x0AB9, 0x02D9, 0x02B9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x0AD9, 0x0AD9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02F9, 0x02D9, 0x02DA, 0x0ADA, 0x0AFA, 0x0BFA, 0x0C5B, 0x0BFA, 0x0AD9, 0x02FA, 0x02F9, 0x02F9, 0x0AF9, 0x02F9, 0x0AF9, 0x02D9, 0x02F9, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AF9, 0x0AFA, 0x0AFA, 0x0AFA, 0x0C1A, 0x0C7B, 0x0B5A, 0x0AFA, 0x0AF9, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0B1A, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x031A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0AFA, 0x0C3A, 0x0C5A, 0x0B1A, 0x0AFA, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0C5B, 0x0C1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B3A, 0x0C7B, 0x0B7A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0CBB, 0x0B1A, 0x0B3A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B7A, 0x0CBB, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0BDA, 0x0C7B, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x0B1A, 0x131A, 0x131A, 0x131A, 0x131A, 0x131A, 0x1B1A, 0x1B3A, 0x1B3A, 0x1B3A, 0x1B3A, 0x233A, 0x233A, 0x233B, 0x2B3B, 0x2B5B, 0x3AD9, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x8993, 0x1B1A, 0x131A, 0x131A, 0x12FA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x0AFA, 0x02FA, 0x0AFA, 0x035A, 0x045A, 0x0C3A, 0x0AFA, 0x02DA, 0x0AFA, 0x0AF9, 0x02F9, 0x0AFA, 0x0AFA, 0x0AFA, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x0AD9, 0x02D9, 0x02DA, 0x0AD9, 0x0AD9, 0x02BA, 0x02D9, 0x039A, 0x043A, 0x03DA, 0x02D9, 0x0AB9, 0x02D9, 0x0AB9, 0x02B9, 0x02D9, 0x02B9, 0x02B9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02D9, 0x02B9, 0x0AB9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02D9, 0x02B9, 0x02D9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x02D9, 0x03FA, 0x041A, 0x03B9, 0x02B9, 0x02B9, 0x0299, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x0299, 0x02B9, 0x02B9, 0x02B9, 0x02B9, 0x0299, 0x02B9, 0x02B9, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x0299, 0x02B8, 0x02B8, - 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0198, 0x02B8, 0x0399, 0x0359, 0x0258, 0x0198, 0x0137, 0x0137, 0x0117, 0x0158, 0x0137, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0158, 0x0259, 0x0399, 0x0399, 0x0258, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0158, 0x0137, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0238, 0x03B9, 0x03DA, 0x0259, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0178, 0x0158, 0x0158, 0x0159, 0x01B9, 0x037A, 0x0BDA, 0x0218, 0x0958, 0x0159, 0x0159, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0959, 0x0158, 0x0159, 0x0179, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0979, 0x0179, 0x0958, 0x0979, 0x0159, 0x0178, 0x0159, 0x0958, 0x033A, 0x041A, 0x01F9, 0x0959, 0x0179, 0x0958, 0x0959, 0x0158, 0x0159, 0x0159, 0x0159, 0x0159, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0959, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0A79, 0x043A, 0x0199, 0x0959, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0179, 0x09B9, 0x0C3B, 0x0179, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0979, 0x0179, 0x0C7A, 0x0979, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0979, 0x0979, 0x0979, 0x0979, 0x0BFA, 0x0259, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0179, 0x0958, 0x0979, 0x0178, 0x0958, 0x0159, 0x0999, 0x0BDA, 0x02D9, 0x0159, 0x0959, 0x0159, 0x0979, 0x0959, 0x0979, 0x0959, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x0979, 0x1179, 0x1179, 0x1179, 0x1179, 0x1179, 0x1999, 0x1999, 0x199A, 0x1999, 0x2199, 0x219A, 0x21BA, 0x7154, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x1179, 0x1179, 0x1179, 0x0979, 0x0979, 0x0958, 0x0958, 0x0958, 0x0958, 0x0158, 0x0158, 0x0158, 0x0958, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x01D8, 0x0399, 0x0399, 0x01D9, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x0158, 0x0157, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0218, 0x0379, 0x03B9, 0x0258, 0x0158, 0x0138, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0137, 0x0238, 0x0359, 0x0399, 0x0298, 0x0178, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, - 0x0116, 0x0116, 0x0116, 0x00F7, 0x00F6, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0238, 0x0318, 0x0379, 0x0297, 0x0197, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0177, 0x02D8, 0x0399, 0x0318, 0x01D7, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x01D8, 0x0339, 0x0399, 0x0238, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0157, 0x0138, 0x0278, 0x03D9, 0x02B9, 0x0178, 0x0158, 0x0138, 0x0138, 0x0158, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0158, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0138, 0x0138, 0x0938, 0x0158, 0x0158, 0x0158, 0x0178, 0x0339, 0x0399, 0x0178, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x01D9, 0x03F9, 0x01F9, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02D9, 0x0319, 0x0158, 0x0158, 0x0158, 0x0159, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0959, 0x0158, 0x0158, 0x0159, 0x041A, 0x0959, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x02B9, 0x0319, 0x0158, 0x0158, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0138, 0x0158, 0x01D8, 0x03F9, 0x01F8, 0x0138, 0x0138, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0958, 0x0958, 0x0958, 0x0958, 0x0958, 0x1158, 0x1158, 0x1158, 0x1178, 0x1179, 0x1979, 0x1979, 0x1979, 0x1979, 0x1999, 0x2179, 0x3178, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x3157, 0x0958, 0x1158, 0x0958, 0x0958, 0x0938, 0x0938, 0x0938, 0x0938, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0298, 0x03F9, 0x0298, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0138, 0x0117, 0x0137, 0x0238, 0x0379, 0x0379, 0x0238, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0136, 0x0117, 0x0117, 0x0117, 0x0136, 0x0137, 0x01B7, 0x02B8, 0x0399, 0x02B8, 0x0197, 0x0137, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, - 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x0116, 0x00F6, 0x0116, 0x01B7, 0x02B7, 0x0378, 0x02B7, 0x01D6, 0x0116, 0x00F7, 0x00F6, 0x0116, 0x00F6, 0x0116, 0x0116, 0x00F6, 0x00F6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0136, 0x0197, 0x02F8, 0x0378, 0x0297, 0x0177, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0116, 0x0116, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x01D7, 0x0318, 0x0379, 0x0238, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0117, 0x0117, 0x0177, 0x0318, 0x0379, 0x01D7, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0136, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0138, 0x0137, 0x0117, 0x0157, 0x0359, 0x02F8, 0x0157, 0x0117, 0x0137, 0x0117, 0x0137, 0x0117, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0158, 0x0359, 0x0278, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x03B9, 0x01B8, 0x0137, 0x0138, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x03F9, 0x0137, 0x0138, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0138, 0x0118, 0x0138, 0x0138, 0x0178, 0x03F9, 0x0158, 0x0137, 0x0137, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0137, 0x0137, 0x0137, 0x0138, 0x0138, 0x0137, 0x0137, 0x0118, 0x0238, 0x03B9, 0x0177, 0x0137, 0x0138, 0x0137, 0x0117, 0x0137, 0x0138, 0x0137, 0x0137, 0x0137, 0x0137, 0x0937, 0x0938, 0x0938, 0x0938, 0x0938, 0x0938, 0x0958, 0x1158, 0x1158, 0x1158, 0x1158, 0x1158, 0x1958, 0x1958, 0x1959, 0x1978, 0x6934, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x4135, 0x0938, 0x0957, 0x0937, 0x0937, 0x0937, 0x0937, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0137, 0x0137, 0x0117, 0x0117, 0x0117, 0x0117, 0x0197, 0x0318, 0x0338, 0x01B7, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0117, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x0116, 0x0117, 0x00F7, 0x0217, 0x0339, 0x02F8, 0x0197, 0x0136, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0117, 0x0116, 0x0116, 0x0116, 0x0156, 0x0237, 0x0358, 0x02D8, 0x01F7, 0x0116, 0x00F6, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x00F6, 0x00F6, 0x0116, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x0116, - 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x0297, 0x02B7, 0x0297, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x0318, 0x0357, 0x0338, 0x02D7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B8, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B8, 0x02B8, 0x02B7, 0x0317, 0x0358, 0x0338, 0x02F7, 0x02D7, 0x02B7, 0x02B7, 0x02B7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D7, 0x02D8, 0x02D7, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02F7, 0x0358, 0x0378, 0x02F7, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D7, 0x02F8, 0x02F8, 0x0398, 0x0378, 0x02F8, 0x02D8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0398, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F7, 0x02F8, 0x02F8, 0x0318, 0x0358, 0x0399, 0x0318, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0338, 0x03B8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x03B8, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x0318, 0x0378, 0x0338, 0x02F8, 0x02F8, 0x0318, 0x02F8, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0318, 0x0318, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0378, 0x0338, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x0AF8, 0x0AF8, 0x0AF8, 0x0AF8, 0x0B18, 0x0B18, 0x1318, 0x1319, 0x1319, 0x1319, 0x1319, 0x1319, 0x1B18, 0x2AF8, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9932, 0x9931, 0x9911, 0x9931, 0x9932, 0x9931, 0x9931, 0x9931, 0x5215, 0x0AF8, 0x0AF8, 0x02F8, 0x02F8, 0x02F8, 0x02F8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D8, 0x02D7, 0x02D8, 0x02D8, 0x0378, 0x0378, 0x02D7, 0x02D8, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D8, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02D7, 0x02B7, 0x02D7, 0x02D7, 0x02D7, 0x02B7, 0x02B7, 0x02F7, 0x0358, 0x0358, 0x02F7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02D7, 0x0338, 0x0357, 0x02F7, 0x0297, 0x0297, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x02B7, 0x0297, 0x0297, 0x0297, 0x02B7, 0x0297, 0x0297, 0x02B7, 0x0297, - 0x0175, 0x0155, 0x0155, 0x0156, 0x0175, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x01B6, 0x0257, 0x02F7, 0x02D7, 0x0216, 0x0176, 0x0155, 0x0175, 0x0156, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0176, 0x0155, 0x0176, 0x0176, 0x0176, 0x0175, 0x0176, 0x0175, 0x0156, 0x0176, 0x0176, 0x0176, 0x0155, 0x01B6, 0x0296, 0x0337, 0x0296, 0x01D6, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0196, 0x0176, 0x01B6, 0x02F8, 0x0317, 0x0217, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x01F7, 0x0337, 0x02D7, 0x01B6, 0x0197, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0237, 0x0358, 0x0217, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x0196, 0x0196, 0x0277, 0x0318, 0x01B6, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x02F7, 0x0257, 0x0197, 0x01B6, 0x01B7, 0x01B6, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B7, 0x01B6, 0x01B7, 0x0378, 0x01B7, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01B6, 0x01F7, 0x0358, 0x0196, 0x0196, 0x01B6, 0x0196, 0x01B6, 0x0197, 0x0196, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0196, 0x0196, 0x0197, 0x0197, 0x02F7, 0x02F7, 0x0196, 0x0196, 0x0196, 0x0196, 0x0197, 0x0196, 0x0197, 0x01B6, 0x01B6, 0x0196, 0x0196, 0x0196, 0x0197, 0x0197, 0x0197, 0x09B7, 0x0997, 0x09B7, 0x09B7, 0x09B7, 0x11B7, 0x11B7, 0x11D7, 0x11B7, 0x11B7, 0x11B7, 0x7153, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x6174, 0x09B6, 0x0196, 0x0197, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0176, 0x0196, 0x0196, 0x0196, 0x0196, 0x0177, 0x0196, 0x02B7, 0x0337, 0x0216, 0x0196, 0x0196, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0196, 0x0196, 0x0176, 0x0176, 0x0196, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0196, 0x0195, 0x0216, 0x02F7, 0x0317, 0x0216, 0x0176, 0x0176, 0x0176, 0x0176, 0x0175, 0x0175, 0x0176, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0176, 0x0175, 0x0155, 0x0196, 0x0256, 0x0317, 0x02B7, 0x01B6, 0x0176, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0155, 0x0155, 0x0175, 0x0155, 0x0155, 0x0155, - 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B4, 0x00D3, 0x00D3, 0x00B4, 0x00D4, 0x0174, 0x0235, 0x02D6, 0x0235, 0x0174, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x0135, 0x0235, 0x02D6, 0x0236, 0x0134, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D4, 0x00D4, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x0115, 0x0236, 0x0317, 0x0256, 0x00F4, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x01F6, 0x0317, 0x01F6, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x01B6, 0x0337, 0x01B6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x0155, 0x0337, 0x0156, 0x00D5, 0x00D5, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00D6, 0x00D6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00D5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x0115, 0x0338, 0x0115, 0x00F6, 0x00F5, 0x00F6, 0x00F5, 0x00D6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F6, 0x00D5, 0x00F5, 0x0357, 0x00F5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F6, 0x00F5, 0x00D5, 0x00D5, 0x00D6, 0x00D6, 0x00D5, 0x00F5, 0x02F7, 0x0176, 0x00F5, 0x00D5, 0x00F5, 0x00F6, 0x00F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00F5, 0x00D5, 0x0116, 0x02F7, 0x01D6, 0x00D6, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00F5, 0x00D5, 0x00D5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x08F6, 0x08F6, 0x08F6, 0x08F6, 0x0916, 0x0916, 0x10F6, 0x1117, 0x1116, 0x3135, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9912, 0x9931, 0x9931, 0x9931, 0x9931, 0x7113, 0x08F5, 0x08F6, 0x00F5, 0x00F5, 0x00F5, 0x00F5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D5, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x01D6, 0x02F7, 0x0236, 0x0114, 0x00D5, 0x00D5, 0x00D4, 0x00D5, 0x00D5, 0x00D5, 0x00D4, 0x00D5, 0x00D4, 0x00D5, 0x00D5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00F4, 0x01D5, 0x02D6, 0x0236, 0x0114, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D3, 0x0114, 0x01F5, 0x02B5, 0x0235, 0x0154, 0x00D3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, - 0x00B1, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00F2, 0x01D3, 0x0253, 0x0234, 0x0173, 0x00D2, 0x0092, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0092, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B3, 0x00B2, 0x0153, 0x0234, 0x0274, 0x01B3, 0x00F3, 0x00B2, 0x00B2, 0x00B3, 0x00B3, 0x00B2, 0x00B3, 0x00B3, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x01B4, 0x02B5, 0x01F4, 0x0113, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00D3, 0x00B3, 0x00D3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00B3, 0x00D4, 0x00B3, 0x00D3, 0x0133, 0x0275, 0x0255, 0x0134, 0x00D3, 0x00B3, 0x00D3, 0x00D3, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x01D4, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00F4, 0x02B5, 0x01B5, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01B5, 0x0255, 0x00D5, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x02F6, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x01F5, 0x0235, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00B4, 0x0154, 0x02B5, 0x0134, 0x00D4, 0x00B4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00B4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x00D4, 0x08D4, 0x08D4, 0x08D4, 0x08F4, 0x08F4, 0x08F4, 0x08F5, 0x10F4, 0x10D5, 0x7912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x8132, 0x00D4, 0x00D4, 0x00D4, 0x00D3, 0x00D3, 0x00D3, 0x00D3, 0x00D3, 0x00B3, 0x00D3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B3, 0x00D3, 0x00D3, 0x0214, 0x0295, 0x0153, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B2, 0x00B2, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B3, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00D2, 0x01B3, 0x0274, 0x01D3, 0x00F2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x0092, 0x00B2, 0x00B1, 0x0172, 0x0253, 0x0233, 0x0152, 0x00B1, 0x0091, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x00B1, - 0x0090, 0x0090, 0x0090, 0x00B0, 0x0151, 0x0212, 0x0232, 0x0191, 0x00F0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0090, 0x0091, 0x00B1, 0x0171, 0x0232, 0x0213, 0x0151, 0x0090, 0x00B0, 0x0090, 0x0091, 0x00B1, 0x00B0, 0x0090, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x0091, 0x00D1, 0x0172, 0x0253, 0x01B2, 0x00D1, 0x00B1, 0x0091, 0x0091, 0x0091, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x00D2, 0x01B2, 0x0273, 0x0172, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x01D3, 0x0253, 0x0112, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0213, 0x01D3, 0x0092, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0253, 0x0153, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x0294, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00F2, 0x0293, 0x00D2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B2, 0x0172, 0x0253, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B1, 0x00B1, 0x00B1, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x00B2, 0x08B2, 0x08B2, 0x08B2, 0x08D2, 0x08B2, 0x08D2, 0x08D3, 0x10D3, 0x40F2, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x00D2, 0x00B2, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0131, 0x0252, 0x01F2, 0x00B1, 0x00B1, 0x00B1, 0x0091, 0x0091, 0x00B1, 0x0091, 0x0091, 0x00B0, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x00B1, 0x0090, 0x00B0, 0x0091, 0x00B0, 0x01B2, 0x0252, 0x01B1, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x01D1, 0x0232, 0x0191, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, - 0x008F, 0x0130, 0x01B1, 0x0232, 0x01B1, 0x0110, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00D0, 0x0191, 0x0232, 0x01D1, 0x00F0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0171, 0x0232, 0x01D1, 0x00F1, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0111, 0x0212, 0x01D1, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01D2, 0x01F2, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0171, 0x0212, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x00F1, 0x0252, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0272, 0x00B0, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x01D1, 0x0171, 0x0091, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01D1, 0x01D1, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x0091, 0x0091, 0x0091, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x08B1, 0x8912, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9911, 0x9912, 0x9931, 0x0091, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01B1, 0x0252, 0x0131, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01B1, 0x0232, 0x0191, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0191, 0x0252, 0x01B1, 0x0110, 0x0090, 0x0090, 0x0090, - 0x0212, 0x01F1, 0x0150, 0x00AF, 0x008F, 0x008F, 0x006F, 0x0090, 0x0090, 0x0070, 0x006F, 0x006F, 0x008F, 0x008F, 0x0070, 0x0070, 0x006F, 0x008F, 0x006F, 0x008F, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x006F, 0x008F, 0x008F, 0x008F, 0x0130, 0x01D1, 0x0212, 0x0191, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x008F, 0x0090, 0x0151, 0x0211, 0x01D1, 0x00F0, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0191, 0x0232, 0x0151, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F2, 0x01D1, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0110, 0x0252, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x01B1, 0x0191, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0151, 0x0232, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x01F1, 0x0171, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0091, 0x00B0, 0x00B0, 0x00B1, 0x08B1, 0x08B0, 0x08B1, 0x08B1, 0x50F1, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x00F1, 0x0211, 0x01D2, 0x00D0, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x0090, 0x00B0, 0x01B1, 0x0232, 0x0151, 0x00B0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x0090, 0x008F, 0x00B0, 0x0151, 0x0211, 0x0212, 0x0130, 0x00AF, - 0x00CF, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x00AF, 0x0130, 0x01F2, 0x0212, 0x0131, 0x00AF, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x0090, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0130, 0x0212, 0x01F2, 0x00F0, 0x0070, 0x008F, 0x006F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x00D0, 0x0212, 0x01D2, 0x00D0, 0x0090, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x00F0, 0x0232, 0x01B1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x0130, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x0232, 0x00D0, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0252, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0232, 0x00F0, 0x0090, 0x0070, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00F0, 0x0232, 0x00F1, 0x00B0, 0x008F, 0x008F, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x0890, 0x08B0, 0x0891, 0x10B0, 0x9931, 0x9911, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0090, 0x0191, 0x0212, 0x0150, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x006F, 0x008F, 0x006F, 0x0070, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x00D0, 0x01D2, 0x0212, 0x0150, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x0110, 0x01D1, 0x0212, - 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x00AF, 0x0171, 0x0212, 0x01D1, 0x0110, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x0110, 0x01F2, 0x0212, 0x0130, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0171, 0x0232, 0x0151, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x00F0, 0x0212, 0x0151, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x0070, 0x0090, 0x01F1, 0x01B1, 0x0070, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x008F, 0x008F, 0x0130, 0x01F1, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0191, 0x01B1, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x0090, 0x0090, 0x008F, 0x0090, 0x006F, 0x008F, 0x0131, 0x0232, 0x00D0, 0x0090, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x60F1, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x0150, 0x0090, 0x0090, 0x0090, 0x006F, 0x0090, 0x006F, 0x008F, 0x008F, 0x0070, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0110, 0x01F2, 0x01D1, 0x00CF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x006F, 0x00F0, 0x01B2, 0x0232, 0x0150, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x00F0, - 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006E, 0x00EF, 0x01B1, 0x0212, 0x0191, 0x00D0, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x00EF, 0x01D1, 0x01F1, 0x0130, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0070, 0x008F, 0x006F, 0x008F, 0x0110, 0x0232, 0x01B1, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0110, 0x0252, 0x0130, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0170, 0x01F2, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x01D2, 0x0130, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x0252, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x00CF, 0x0232, 0x00AF, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x0191, 0x0212, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x008F, 0x18AF, 0x9911, 0x9912, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0xA111, 0x9931, 0xA111, 0x29D2, 0x01B1, 0x008F, 0x006F, 0x008F, 0x006F, 0x008F, 0x008F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x0150, 0x0232, 0x0150, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x00F0, 0x01D1, 0x01F1, 0x0130, 0x008F, 0x006F, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006E, 0x008F, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x0130, 0x01D1, 0x0212, 0x0150, 0x00AF, 0x006E, 0x006E, 0x008E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006F, 0x006F, 0x00CF, 0x01B1, 0x0212, 0x0130, 0x006E, 0x006E, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x01B1, 0x0232, 0x010F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0232, 0x00CF, 0x006F, 0x006F, 0x008E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x010F, 0x0212, 0x00AF, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x008F, 0x00AF, 0x0212, 0x00AF, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006F, 0x006F, 0x0252, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x01D1, 0x0130, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x01F1, 0x01B1, 0x008F, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x0090, 0x8111, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9932, 0x9931, 0x9931, 0x28D0, 0x01F2, 0x01D1, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x006F, 0x00CF, 0x01F1, 0x01F1, 0x00CF, 0x006F, 0x006F, 0x006F, 0x006E, 0x006E, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006F, 0x00F0, 0x01D1, 0x01F1, 0x0110, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0150, 0x0212, 0x01D1, 0x0110, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01D1, 0x0212, 0x0150, 0x008F, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0110, 0x0212, 0x01B1, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x008F, 0x006E, 0x006E, 0x006F, 0x006F, 0x008E, 0x006E, 0x0191, 0x01F1, 0x00CF, 0x006F, 0x006F, 0x006E, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x006E, 0x006E, 0x006F, 0x00CF, 0x0212, 0x0110, 0x008F, 0x006F, 0x006E, 0x008F, 0x006F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0150, 0x0191, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0232, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x0110, 0x01F1, 0x008F, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x00AF, 0x0212, 0x0110, 0x006F, 0x006F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x008F, 0x008F, 0x008F, 0x008F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x48D0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x008E, 0x008F, 0x01B1, 0x01F2, 0x00AF, 0x006F, 0x006E, 0x008F, 0x006E, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x0232, 0x0150, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x0110, 0x01F1, 0x01F1, 0x0110, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x0190, 0x0212, 0x0190, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x0170, 0x0212, 0x0150, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x008E, 0x01D1, 0x01F1, 0x008F, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x01F1, 0x0170, 0x006F, 0x006E, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0211, 0x00CF, 0x008F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008F, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006F, 0x006E, 0x108F, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x006E, 0x006F, 0x006E, 0x0190, 0x0212, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01B1, 0x01F2, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x01F1, 0x01B1, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, - 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x00EF, 0x01B1, 0x01F1, 0x0150, 0x008F, 0x006E, 0x006E, 0x004E, 0x004E, 0x004E, 0x004E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0170, 0x0212, 0x0171, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0130, 0x0212, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x01D1, 0x0190, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01F1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00EF, 0x0211, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0170, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0150, 0x01F1, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x68F0, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x00EF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x0130, 0x01F2, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x01D1, 0x01B1, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, - 0x006E, 0x006D, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x0130, 0x01D1, 0x01D1, 0x010F, 0x006E, 0x006D, 0x006D, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006D, 0x006E, 0x006E, 0x0170, 0x0212, 0x0170, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x01F2, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AF, 0x0212, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x010F, 0x0212, 0x008E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x0211, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0190, 0x01B1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x38B0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x9912, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x010F, 0x0212, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x01B1, 0x01D1, 0x00CF, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006D, 0x004D, 0x008E, 0x0150, 0x01F1, 0x01B1, 0x00CF, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x006E, 0x006D, - 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x008E, 0x0170, 0x01F1, 0x01B1, 0x00EF, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x008E, 0x012F, 0x01F1, 0x0170, 0x008E, 0x006D, 0x006D, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x004D, 0x004D, 0x006D, 0x006E, 0x006E, 0x004E, 0x004D, 0x006E, 0x006E, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x004D, 0x0130, 0x01F2, 0x0150, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x00EF, 0x0212, 0x010F, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x00AF, 0x0212, 0x00CF, 0x004E, 0x006E, 0x004E, 0x004E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x008E, 0x0232, 0x008E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x0232, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x01D1, 0x010F, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x008E, 0x01F1, 0x012F, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x004E, 0x006E, 0x086E, 0x9911, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9931, 0x9931, 0x9911, 0x9931, 0x004E, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x00AE, 0x0211, 0x0190, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004D, 0x00EF, 0x01F2, 0x0190, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x004D, 0x006E, 0x006E, 0x006D, 0x004E, 0x006E, 0x012F, 0x01F1, 0x0190, 0x008E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x004D, 0x006D, 0x006D, - 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x00CE, 0x0190, 0x0211, 0x0170, 0x008E, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004E, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x0150, 0x01F1, 0x01B1, 0x00CE, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006D, 0x004D, 0x004D, 0x004E, 0x004D, 0x004D, 0x006D, 0x006D, 0x008E, 0x01B1, 0x01D1, 0x00CE, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006E, 0x004D, 0x006E, 0x006E, 0x004E, 0x006D, 0x010F, 0x0212, 0x00EF, 0x006D, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x004D, 0x006E, 0x004D, 0x006E, 0x01D1, 0x0150, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0130, 0x0191, 0x006E, 0x006E, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x0232, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x006E, 0x004D, 0x004D, 0x004E, 0x010F, 0x01D1, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x004E, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x00CE, 0x0212, 0x00CE, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004D, 0x004D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004E, 0x70F0, 0x9932, 0x9931, 0x9931, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x8110, 0x006E, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x008E, 0x01D1, 0x0190, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006E, 0x0171, 0x01F2, 0x00EF, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x008E, 0x012F, 0x01F1, 0x0170, 0x008E, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, - 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x00EF, 0x01D1, 0x01D1, 0x012F, 0x008D, 0x004D, 0x006D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x00EF, 0x01F1, 0x01B0, 0x00CE, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x0150, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004E, 0x004D, 0x004D, 0x004D, 0x0150, 0x01F1, 0x00AE, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x0170, 0x01B1, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x004E, 0x006E, 0x01D1, 0x010F, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006E, 0x004E, 0x0212, 0x004D, 0x004D, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x004D, 0x006D, 0x006D, 0x006D, 0x006E, 0x01F1, 0x008E, 0x006D, 0x006E, 0x004D, 0x004D, 0x006D, 0x006D, 0x004E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006E, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x010F, 0x01F1, 0x006D, 0x006D, 0x004D, 0x006E, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004E, 0x006D, 0x006D, 0x004D, 0x40CF, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x70F0, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x004D, 0x004D, 0x006D, 0x0191, 0x01B1, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x006D, 0x00EE, 0x01F1, 0x0190, 0x008E, 0x004D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x004D, 0x004D, 0x006D, 0x0150, 0x0212, 0x0170, 0x008E, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, - 0x0211, 0x0211, 0x0212, 0x01F2, 0x0212, 0x01F2, 0x01F1, 0x0211, 0x0211, 0x01F1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01F1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01F1, 0x0211, 0x0211, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x01F1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0211, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0211, 0x0232, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0232, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x11F1, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0x9932, 0x9931, 0x9931, 0x5991, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x01F1, 0x0212, 0x0211, 0x0212, 0x0212, 0x01F2, 0x0212, 0x0211, 0x01F1, 0x0211, 0x0211, 0x01F1, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, - 0x004D, 0x004D, 0x004C, 0x004C, 0x004D, 0x00AE, 0x0170, 0x01F1, 0x0170, 0x00CE, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x00EF, 0x01D1, 0x01D1, 0x00EE, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x012F, 0x0212, 0x012F, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x01B1, 0x01D1, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x00AE, 0x0212, 0x00AE, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x0150, 0x014F, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x0212, 0x004D, 0x004D, 0x004D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x00AE, 0x01F1, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x01B1, 0x0150, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x88F0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9912, 0x9911, 0x9931, 0x40AF, 0x004D, 0x006D, 0x004D, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x010F, 0x0212, 0x00AE, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004C, 0x006D, 0x00CE, 0x01D1, 0x0190, 0x008E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x0170, 0x01F1, 0x012F, 0x006D, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, - 0x004C, 0x004C, 0x004C, 0x00EE, 0x0190, 0x01D1, 0x012F, 0x008D, 0x004C, 0x004C, 0x004C, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x00AE, 0x0190, 0x01D1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x00AE, 0x01B1, 0x01B1, 0x008D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x008D, 0x01B1, 0x0170, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x01D1, 0x010F, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x01F1, 0x008E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x0212, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x01D1, 0x00EE, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x006D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x008D, 0x01F1, 0x00EF, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x50CF, 0x9911, 0x9931, 0x9911, 0x9931, 0x9931, 0x9931, 0xA111, 0x186E, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x00EF, 0x01F1, 0x00EF, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004D, 0x006D, 0x0150, 0x01F1, 0x010F, 0x004D, 0x004C, 0x004C, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x008E, 0x0190, 0x01D1, 0x012F, 0x006D, 0x004C, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, - 0x006D, 0x010F, 0x01B1, 0x01D1, 0x00EE, 0x006D, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x00AE, 0x0190, 0x01D1, 0x00EE, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x012F, 0x01F1, 0x012F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004C, 0x004C, 0x004C, 0x008E, 0x01F1, 0x014F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x006D, 0x0170, 0x0190, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x010F, 0x01D1, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004C, 0x004D, 0x004D, 0x0212, 0x004D, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x010E, 0x01B0, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AE, 0x01F1, 0x00AD, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x308E, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x9111, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x01F1, 0x012F, 0x006D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004D, 0x004D, 0x004D, 0x004D, 0x008D, 0x01B0, 0x01B1, 0x008D, 0x004D, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00CD, 0x0191, 0x01D1, 0x012F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, - 0x01D1, 0x0170, 0x00AE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x0190, 0x01D1, 0x010F, 0x006D, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AE, 0x01D1, 0x0190, 0x008D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00EE, 0x01F1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x012F, 0x01B0, 0x006D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0170, 0x010F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004D, 0x004C, 0x004C, 0x004C, 0x0212, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x006D, 0x01F1, 0x008D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x006C, 0x004C, 0x012F, 0x01B0, 0x006D, 0x004C, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x084D, 0x9931, 0x9931, 0x9931, 0x9931, 0x9911, 0x9931, 0x68F0, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x01B0, 0x016F, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x012F, 0x0211, 0x010F, 0x004D, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x0190, 0x01D1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, - 0x006C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x002C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x0150, 0x01F1, 0x012F, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x006D, 0x014F, 0x01D1, 0x010F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x00EE, 0x01D1, 0x00CE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AE, 0x01F1, 0x008E, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x0211, 0x004D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0212, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0150, 0x012F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0170, 0x0170, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x80F0, 0x9931, 0x9931, 0x9931, 0x9931, 0x9931, 0x388E, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x006D, 0x01B0, 0x01B1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008E, 0x01B0, 0x01B0, 0x00AD, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x01B0, 0x01B1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, - 0x004C, 0x004C, 0x002C, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002C, 0x002C, 0x002C, 0x002C, 0x002B, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x002C, 0x004C, 0x008D, 0x0150, 0x01D1, 0x012F, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x01B0, 0x0190, 0x006C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0150, 0x01F1, 0x008D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x01D1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x010F, 0x016F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01F1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x01F1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x006C, 0x01D1, 0x010E, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x50CF, 0xA111, 0x9931, 0x9931, 0x9931, 0x9931, 0x084C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x014F, 0x01B1, 0x008D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x010E, 0x01D1, 0x014F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x00CE, 0x01B1, 0x01B1, 0x00EE, 0x004C, 0x002C, 0x004C, - 0x004B, 0x002B, 0x004C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004C, 0x004B, 0x004C, 0x004C, 0x004C, 0x002B, 0x004C, 0x004B, 0x004B, 0x002B, 0x002B, 0x004C, 0x002C, 0x004C, 0x004C, 0x012F, 0x01F1, 0x014F, 0x006C, 0x004B, 0x004C, 0x002C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x002C, 0x002C, 0x002C, 0x002C, 0x002C, 0x002C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x014F, 0x01D1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0150, 0x01B0, 0x006D, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x0190, 0x014F, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01B1, 0x00CE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01F1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01B1, 0x00EE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x008D, 0x01F1, 0x00AE, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x388E, 0x9931, 0x9931, 0x9931, 0x9931, 0x68D0, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x012E, 0x01D1, 0x008D, 0x004C, 0x004C, 0x004B, 0x004C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x002C, 0x004C, 0x008C, 0x0170, 0x01B1, 0x00AD, 0x004C, 0x004C, 0x002B, 0x002B, 0x004C, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002C, 0x00EE, 0x01B1, 0x0190, 0x00AD, 0x002B, - 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004C, 0x004C, 0x004B, 0x002B, 0x004C, 0x004B, 0x004B, 0x004B, 0x006C, 0x010E, 0x01D1, 0x014F, 0x006C, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x002C, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x00CD, 0x01B1, 0x0170, 0x008C, 0x004B, 0x002C, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x002C, 0x004B, 0x004B, 0x004C, 0x0190, 0x0190, 0x004C, 0x004B, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x012F, 0x0190, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00AD, 0x01D1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01F2, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x010E, 0x0170, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x00CE, 0x01D1, 0x004C, 0x004C, 0x004C, 0x002B, 0x004C, 0x004C, 0x004C, 0x002C, 0x002C, 0x004C, 0x002C, 0x004C, 0x004C, 0x004C, 0x004C, 0x104C, 0xA111, 0x9931, 0x9931, 0x9931, 0x288D, 0x004B, 0x004C, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x002B, 0x004B, 0x004C, 0x002B, 0x004B, 0x00EE, 0x01F2, 0x00CD, 0x004B, 0x004C, 0x002B, 0x004C, 0x004C, 0x002B, 0x004B, 0x002B, 0x002B, 0x002C, 0x004B, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004C, 0x002B, 0x00EE, 0x01D1, 0x012F, 0x004C, 0x002B, 0x004C, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004C, 0x002B, 0x004C, 0x00EE, 0x01B1, 0x0170, - 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x004C, 0x010E, 0x01B1, 0x0170, 0x008C, 0x002B, 0x004B, 0x002B, 0x004B, 0x002C, 0x002C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x006C, 0x0170, 0x01D1, 0x00CD, 0x004B, 0x004B, 0x004C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004C, 0x004B, 0x004B, 0x008D, 0x0190, 0x014F, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x004B, 0x002B, 0x004C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x002B, 0x00CD, 0x01D1, 0x008C, 0x004C, 0x004C, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004C, 0x002B, 0x004B, 0x004B, 0x004B, 0x002B, 0x014F, 0x012E, 0x002C, 0x004B, 0x004C, 0x004B, 0x004C, 0x002B, 0x002B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x01F1, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002B, 0x004C, 0x01F1, 0x006C, 0x002B, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x002C, 0x004C, 0x004C, 0x002B, 0x004C, 0x014F, 0x01B0, 0x004C, 0x004C, 0x004C, 0x004C, 0x004B, 0x004B, 0x004C, 0x004B, 0x004B, 0x002B, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x9931, 0x9931, 0x9931, 0x8910, 0x002C, 0x004B, 0x004C, 0x002B, 0x004B, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x004C, 0x002C, 0x002B, 0x004C, 0x002B, 0x004C, 0x002B, 0x002B, 0x004C, 0x004C, 0x004B, 0x00AC, 0x01D1, 0x010F, 0x004B, 0x002C, 0x004C, 0x002C, 0x004C, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x004C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004C, 0x004B, 0x002B, 0x004C, 0x002B, 0x006C, 0x014F, 0x01D1, 0x00CD, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x002B, 0x004B, 0x002B, 0x004C, 0x010E, - 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x00ED, 0x01B1, 0x0170, 0x008D, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x00AD, 0x01D1, 0x016F, 0x004C, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x002B, 0x008D, 0x01D1, 0x012F, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004C, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x006C, 0x01D1, 0x00CD, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004C, 0x002B, 0x004C, 0x004B, 0x004C, 0x004B, 0x004C, 0x01D1, 0x006C, 0x004C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x01F1, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x014F, 0x010E, 0x004B, 0x004B, 0x002C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004C, 0x004B, 0x004B, 0x0190, 0x012F, 0x004B, 0x004C, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004C, 0x004B, 0x004B, 0x002B, 0x70F0, 0x9931, 0x9931, 0x48AE, 0x004B, 0x004B, 0x004C, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x008C, 0x01B1, 0x014F, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x00CD, 0x01D1, 0x0150, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, - 0x002A, 0x002A, 0x004A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002A, 0x004A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x00CD, 0x01B0, 0x0170, 0x00AC, 0x002A, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x004B, 0x016F, 0x01D1, 0x00AD, 0x002B, 0x002A, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x00CE, 0x01D1, 0x00CD, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x0190, 0x012F, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x00EE, 0x0190, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x01F2, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x00AD, 0x01B1, 0x002B, 0x002C, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x002B, 0x006C, 0x01D1, 0x00CE, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x60CF, 0x9931, 0x9931, 0x104C, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x0190, 0x0190, 0x004C, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x014F, 0x01B1, 0x00AD, 0x002B, 0x002B, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002A, 0x004B, 0x004B, 0x002B, 0x002B, 0x004A, 0x002A, - 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00CD, 0x0190, 0x01B0, 0x00CD, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x004A, 0x002A, 0x004A, 0x002A, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002A, 0x004B, 0x00CD, 0x01D1, 0x012F, 0x004B, 0x004B, 0x002A, 0x004B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x004B, 0x002B, 0x004B, 0x00CE, 0x01D1, 0x00AD, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x004B, 0x014F, 0x0190, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x0190, 0x00CD, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x01D1, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x01B0, 0x00AD, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x004B, 0x00AD, 0x01D1, 0x008C, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x48AE, 0x9931, 0x68F0, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x014F, 0x0190, 0x006C, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004A, 0x004B, 0x004B, 0x002A, 0x002B, 0x004B, 0x002B, 0x002B, 0x002A, 0x002B, 0x004A, 0x00AC, 0x0190, 0x0170, 0x006C, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, - 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x008C, 0x0170, 0x0190, 0x00CD, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x006B, 0x016F, 0x0190, 0x008C, 0x002A, 0x004A, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x012F, 0x01B1, 0x006C, 0x004B, 0x002B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002B, 0x002B, 0x002A, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x00CD, 0x01B1, 0x004B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x006C, 0x01D1, 0x004B, 0x002B, 0x004B, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x01D1, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x002B, 0x010E, 0x014F, 0x004B, 0x004B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x010E, 0x0190, 0x004B, 0x002A, 0x002B, 0x002A, 0x002B, 0x002B, 0x002A, 0x002B, 0x004B, 0x002B, 0x002B, 0x004B, 0x308D, 0x9911, 0x206C, 0x004B, 0x002B, 0x002B, 0x002A, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x002B, 0x004B, 0x004B, 0x002A, 0x004B, 0x004A, 0x004B, 0x004A, 0x002A, 0x002B, 0x002B, 0x004B, 0x002A, 0x002A, 0x002A, 0x002B, 0x010E, 0x01B1, 0x008C, 0x002A, 0x004A, 0x002B, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x004B, 0x010E, 0x01B0, 0x00ED, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, - 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x0029, 0x008B, 0x016F, 0x01B0, 0x00CD, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00ED, 0x01B1, 0x010E, 0x004A, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x004B, 0x014F, 0x016F, 0x004B, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x002A, 0x008B, 0x01B1, 0x008C, 0x002B, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x002B, 0x002A, 0x002A, 0x012E, 0x012F, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x01D2, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x004B, 0x01D1, 0x006B, 0x002A, 0x002B, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002B, 0x002A, 0x014F, 0x014F, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x186B, 0x88F1, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00CD, 0x01B1, 0x00CD, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x00AC, 0x0190, 0x016F, 0x006B, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, - 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008B, 0x014F, 0x0190, 0x00ED, 0x004A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x006A, 0x014F, 0x0190, 0x00AB, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x004A, 0x0170, 0x016F, 0x004A, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x004A, 0x0170, 0x00ED, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0190, 0x008C, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x01D1, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x012F, 0x010E, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x004B, 0x0190, 0x00ED, 0x002A, 0x002A, 0x002A, 0x002A, 0x004A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x286B, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00AC, 0x01B1, 0x00ED, 0x0029, 0x002A, 0x0029, 0x0029, 0x002A, 0x002A, 0x0029, 0x002A, 0x0029, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x00EE, 0x01B1, 0x010D, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0049, 0x012E, 0x0190, 0x00ED, 0x004A, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00CC, 0x01B0, 0x010E, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006B, 0x0190, 0x012E, 0x0049, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x0029, 0x0029, 0x012E, 0x016F, 0x002A, 0x0029, 0x002A, 0x002A, 0x0029, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x00AC, 0x0190, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x01D1, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x0029, 0x00AC, 0x0190, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x002A, 0x0029, 0x002A, 0x008B, 0x01B1, 0x008B, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x002A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006B, 0x01B0, 0x012E, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x008B, 0x0170, 0x014F, 0x006A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0009, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x010D, 0x01B1, 0x00ED, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x006A, 0x014F, 0x016F, 0x008B, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x006A, 0x01B0, 0x00ED, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x00CD, 0x01B0, 0x004A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x014F, 0x00CD, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01D1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x002A, 0x0029, 0x0029, 0x0029, 0x002A, 0x0190, 0x00AB, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004A, 0x0029, 0x0029, 0x00CC, 0x01B1, 0x0049, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0049, 0x016F, 0x012E, 0x004A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0009, 0x00ED, 0x01B1, 0x00ED, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x010E, 0x0191, 0x010E, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x01B1, 0x00EC, 0x0008, 0x0028, 0x0028, 0x0029, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x00AB, 0x01B1, 0x00AC, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x006A, 0x01B1, 0x006A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x004A, 0x01B1, 0x006A, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01B1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x00ED, 0x012E, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x012E, 0x016F, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0029, 0x0049, 0x012E, 0x016F, 0x0029, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0009, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x006A, 0x014F, 0x0170, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00ED, 0x0190, 0x010E, 0x004A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0029, 0x006A, 0x016F, 0x014F, 0x006A, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00CC, 0x0190, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x00CC, 0x012E, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x01B1, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x004A, 0x01B1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x016F, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x0029, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x010D, 0x0190, 0x006A, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00CC, 0x0190, 0x00ED, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0049, 0x00ED, 0x0190, 0x012F, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x00EC, 0x01B0, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010E, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x012E, 0x012E, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x016F, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012E, 0x00EC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0190, 0x00AB, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00CC, 0x0190, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0049, 0x014E, 0x0170, 0x008B, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00CC, 0x0190, 0x014F, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008A, 0x014F, 0x012F, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012E, 0x014F, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00CC, 0x016F, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x008B, 0x018F, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x00AB, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00AC, 0x0190, 0x00AC, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00AC, 0x0190, 0x012E, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00CB, 0x0170, 0x014F, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0009, 0x0028, 0x0049, 0x00ED, 0x0190, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x014F, 0x014F, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010E, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0170, 0x008A, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x014F, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x010D, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012E, 0x0190, 0x00AB, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x00AC, 0x0170, 0x0170, 0x008B, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x008A, 0x016F, 0x014E, 0x0069, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0029, 0x0028, 0x006A, 0x0170, 0x010E, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x0190, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00CD, 0x010D, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012F, 0x012E, 0x0008, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014F, 0x010E, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00AB, 0x0190, 0x010E, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x008A, 0x016F, 0x016F, 0x00AC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0048, 0x010D, 0x0190, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014F, 0x010D, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00CB, 0x016F, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0069, 0x01B1, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x0170, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0029, 0x014F, 0x014F, 0x0049, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x010D, 0x01B0, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x008B, 0x014F, 0x0170, 0x00AB, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x008B, 0x0170, 0x014E, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00AB, 0x0191, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00EC, 0x016F, 0x0049, 0x0008, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x012E, 0x00CC, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x012E, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0191, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x010E, 0x0170, 0x006A, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x008A, 0x0170, 0x014F, 0x004A, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x012F, 0x0190, 0x00EC, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012E, 0x0190, 0x00AB, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x0190, 0x006A, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00AA, 0x0190, 0x008A, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x01B1, 0x0049, 0x0008, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x00AB, 0x0170, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00AC, 0x0190, 0x0048, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x00EC, 0x0190, 0x008B, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0048, 0x00ED, 0x0190, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x00EC, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0008, 0x00AB, 0x0190, 0x012E, 0x0049, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010E, 0x0170, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0069, 0x0190, 0x008B, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x010E, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0190, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x010D, 0x014F, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0029, 0x0008, 0x00CB, 0x0191, 0x00CC, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x006B, 0x014F, 0x014E, 0x006A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x012E, 0x0190, 0x00AB, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x012F, 0x014F, 0x0029, 0x0028, 0x0029, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x014F, 0x00ED, 0x0029, 0x0028, 0x0008, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0170, 0x008A, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x01B1, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x0029, 0x0028, 0x00ED, 0x010E, 0x0028, 0x0028, 0x0028, 0x0029, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0049, 0x014F, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x006A, 0x0190, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0008, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x00ED, 0x0191, 0x00ED, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp b/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp deleted file mode 100644 index 4768f7e5fc..0000000000 --- a/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t btn_rounded_64x52x4[1664] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, - 0x88, 0x88, 0x79, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x87, 0x77, 0x78, - 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x66, 0x78, - 0x88, 0x8D, 0xFF, 0xB8, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x7B, 0xFF, 0xC6, 0x67, - 0x87, 0xBF, 0xF7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6F, 0xF9, 0x56, - 0x87, 0xEF, 0x84, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x58, 0xFD, 0x46, - 0x87, 0xFF, 0x54, 0x44, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xFF, 0x45, - 0x87, 0xFF, 0x44, 0x45, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xFF, 0x45, - 0x87, 0xFF, 0x44, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xFF, 0x44, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xFF, 0x44, - 0x87, 0xEF, 0x84, 0x56, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFE, 0x44, - 0x87, 0xAF, 0xF6, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xF9, 0x44, - 0x87, 0x7D, 0xFF, 0xB8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9C, 0xFF, 0xD4, 0x45, - 0x87, 0x76, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x54, 0x45, - 0x87, 0x76, 0x56, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x64, 0x44, 0x46, - 0x87, 0x77, 0x65, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x56, - 0x88, 0x77, 0x76, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x67, - 0x88, 0x77, 0x77, 0x66, 0x65, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x66, 0x78, - 0x88, 0x88, 0x77, 0x77, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x77, 0x78, -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp b/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp deleted file mode 100644 index a315e2df1c..0000000000 --- a/Marlin/src/lcd/tft/images/cancel_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t cancel_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDD, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xBA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x76, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x77, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x66, 0x67, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xFF, 0xC7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFF, 0xFD, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xFF, 0xFC, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xFF, 0xD7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0xFF, 0xD7, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x9F, 0xDD, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xA9, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x68, 0x77, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp b/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp deleted file mode 100644 index 23722f616d..0000000000 --- a/Marlin/src/lcd/tft/images/chamber_64x64x4.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t chamber_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8F, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -extern const uint8_t chamber_heated_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8F, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x77, 0x9B, 0x97, 0x88, 0x88, 0x87, 0x8B, 0xA8, 0x78, 0x88, 0x87, 0x8B, 0xB8, 0x78, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x79, 0xFF, 0xF9, 0x78, 0x88, 0x78, 0xDF, 0xFB, 0x78, 0x88, 0x77, 0xCF, 0xFC, 0x87, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x7A, 0xFF, 0xFD, 0x77, 0x88, 0x79, 0xFF, 0xFF, 0x87, 0x88, 0x78, 0xDF, 0xFF, 0x97, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0x86, 0x88, 0x78, 0xDF, 0xFF, 0xB6, 0x88, 0x77, 0xCF, 0xFF, 0xC6, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xB6, 0x78, 0x87, 0x9F, 0xFF, 0xD6, 0x78, 0x87, 0x8E, 0xFF, 0xF7, 0x68, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x7D, 0xFF, 0xE5, 0x67, 0x87, 0x7B, 0xFF, 0xF7, 0x57, 0x88, 0x79, 0xFF, 0xFA, 0x57, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xE6, 0x57, 0x87, 0x8C, 0xFF, 0xF7, 0x57, 0x88, 0x7A, 0xFF, 0xFA, 0x56, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xD5, 0x57, 0x87, 0x8E, 0xFF, 0xE6, 0x57, 0x88, 0x7C, 0xFF, 0xF8, 0x56, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xA5, 0x57, 0x87, 0xAF, 0xFF, 0xD5, 0x57, 0x87, 0x9F, 0xFF, 0xE6, 0x56, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0x75, 0x57, 0x78, 0xEF, 0xFF, 0xA5, 0x57, 0x87, 0xCF, 0xFF, 0xB5, 0x56, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x87, 0x7C, 0xFF, 0xFB, 0x55, 0x67, 0x7B, 0xFF, 0xFE, 0x65, 0x57, 0x79, 0xFF, 0xFF, 0x85, 0x57, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x87, 0x9F, 0xFF, 0xF7, 0x55, 0x67, 0x8E, 0xFF, 0xF8, 0x55, 0x67, 0x7D, 0xFF, 0xFB, 0x55, 0x67, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x87, 0xCF, 0xFF, 0xB5, 0x55, 0x77, 0x9F, 0xFF, 0xD6, 0x55, 0x77, 0x8F, 0xFF, 0xE7, 0x55, 0x68, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x77, 0xDF, 0xFF, 0x75, 0x56, 0x87, 0xBF, 0xFF, 0xA5, 0x56, 0x77, 0xAF, 0xFF, 0xB5, 0x55, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x78, 0xEF, 0xFD, 0x65, 0x67, 0x77, 0xCF, 0xFF, 0x85, 0x57, 0x87, 0xBF, 0xFF, 0x95, 0x56, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x78, 0xEF, 0xFD, 0x55, 0x68, 0x77, 0xCF, 0xFF, 0x75, 0x68, 0x87, 0xBF, 0xFF, 0x95, 0x67, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x78, 0xDF, 0xFF, 0x65, 0x78, 0x77, 0xBF, 0xFF, 0x95, 0x68, 0x87, 0xAF, 0xFF, 0xB5, 0x68, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x87, 0x9F, 0xFF, 0xF8, 0x68, 0x87, 0x8E, 0xFF, 0xF9, 0x68, 0x87, 0x7C, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x7B, 0xFF, 0xFA, 0x58, 0x88, 0x7B, 0xFF, 0xFC, 0x57, 0x88, 0x78, 0xFF, 0xFE, 0x67, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x77, 0xDF, 0xD7, 0x57, 0x88, 0x87, 0xBF, 0xF8, 0x56, 0x88, 0x87, 0xAF, 0xFA, 0x56, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x87, 0x69, 0x75, 0x56, 0x88, 0x87, 0x68, 0x85, 0x56, 0x78, 0x87, 0x68, 0x85, 0x55, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x56, 0x88, 0x88, 0x88, 0x65, 0x55, 0x57, 0x88, 0x88, 0x75, 0x55, 0x56, 0x88, 0x88, 0x75, 0x55, 0x56, 0x78, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x57, 0x77, 0x77, 0x77, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xF9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0xBF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp b/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp deleted file mode 100644 index ff623ed349..0000000000 --- a/Marlin/src/lcd/tft/images/confirm_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t confirm_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFC, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xC7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x55, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x76, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xBF, 0xFF, 0xFF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFF, 0xFF, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xBF, 0xFF, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x4B, 0xFA, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x75, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp b/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp deleted file mode 100644 index b586700986..0000000000 --- a/Marlin/src/lcd/tft/images/decrease_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t decrease_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0x94, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/directory_32x32x4.cpp b/Marlin/src/lcd/tft/images/directory_32x32x4.cpp deleted file mode 100644 index 5fa55c8468..0000000000 --- a/Marlin/src/lcd/tft/images/directory_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t directory_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x88, - 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x68, 0x88, - 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x68, 0x88, - 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/down_32x32x4.cpp b/Marlin/src/lcd/tft/images/down_32x32x4.cpp deleted file mode 100644 index eabf6f97fe..0000000000 --- a/Marlin/src/lcd/tft/images/down_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t down_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x78, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x98, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x8F, 0xB4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xFA, 0x48, 0x88, 0x88, - 0x88, 0x78, 0xFF, 0xFA, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0x84, 0x88, 0x88, - 0x88, 0x7F, 0xFF, 0xFF, 0xA3, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xFF, 0xFF, 0xFA, 0x47, 0x88, - 0x88, 0x7A, 0xFF, 0xFF, 0xFA, 0x38, 0x88, 0x88, 0x88, 0x77, 0x8F, 0xFF, 0xFF, 0xC5, 0x35, 0x88, - 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xA3, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFC, 0x43, 0x46, 0x88, - 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFA, 0x47, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xC4, 0x34, 0x78, 0x88, - 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xA4, 0x78, 0x79, 0xFF, 0xFF, 0xFC, 0x43, 0x47, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xF9, 0x47, 0x9F, 0xFF, 0xFF, 0xC3, 0x34, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0x96, 0xFF, 0xFF, 0xFC, 0x33, 0x47, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x44, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xFD, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFF, 0xC3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFC, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xC3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAC, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x86, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/fan_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_64x64x4.cpp deleted file mode 100644 index 1a154a6ea4..0000000000 --- a/Marlin/src/lcd/tft/images/fan_64x64x4.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t fan0_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x9A, 0xCC, 0xCB, 0xBA, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xED, 0xB9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9B, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x64, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x44, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x45, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x74, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x64, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0x84, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFE, 0xA7, 0x67, 0xBF, 0xF9, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xC6, 0x44, 0x44, 0x48, 0x94, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8A, 0x64, 0x44, 0x44, 0x44, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x87, 0x54, 0x6A, 0xCB, 0x86, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9A, 0xBB, 0xBB, 0xBA, 0x98, 0x87, 0x77, 0x87, 0x46, 0xEF, 0xFF, 0xFA, 0x76, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0xA9, 0x87, 0x7C, 0xFF, 0xFF, 0xFD, 0x77, 0xAC, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0x75, 0x9F, 0xEA, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x8F, 0xFF, 0xFF, 0xFF, 0x74, 0x8E, 0xFF, 0xDA, 0x98, 0x87, 0x78, 0x89, 0xAB, 0xCD, 0xDA, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x54, 0x7C, 0xFF, 0xFF, 0xFC, 0x54, 0x8F, 0xFF, 0xFF, 0xEE, 0xDC, 0xDD, 0xEE, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x74, 0x78, 0xCF, 0xFF, 0xD6, 0x44, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x77, 0x58, 0xA9, 0x54, 0x45, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x64, 0x44, 0x44, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x74, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x86, 0x54, 0x59, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x54, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x76, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x44, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x66, 0x78, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x45, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x44, 0x44, 0x57, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x45, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x64, 0x44, 0x45, 0x68, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x44, 0x45, 0x67, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x47, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x45, 0x57, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x64, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x44, 0x46, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x44, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x44, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x74, 0x45, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x44, 0x46, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x8F, 0xFF, 0xFF, 0xFF, 0xFD, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x44, 0x68, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xFF, 0xFF, 0xFF, 0xFB, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x54, 0x45, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x9F, 0xFF, 0xFF, 0xF7, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xFF, 0xFF, 0xD5, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x57, 0xDF, 0xFF, 0xFF, 0xD8, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x8D, 0xFF, 0x84, 0x46, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xCC, 0xC9, 0x64, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x76, 0x44, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x55, 0x54, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x44, 0x44, 0x45, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -extern const uint8_t fan1_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x44, 0x44, 0x46, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x55, 0x54, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x46, 0x75, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x69, 0xCC, 0xC9, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8F, 0xFD, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x48, 0xDF, 0xFF, 0xFF, 0xD7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xDF, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x45, 0xAF, 0xFF, 0xFF, 0xFF, 0xFE, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x47, 0xFF, 0xFF, 0xFF, 0x95, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x4B, 0xFF, 0xFF, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x44, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x75, 0x44, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x64, 0x45, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x64, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x86, 0x44, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x54, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x87, 0x55, 0x44, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x44, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x87, 0x65, 0x44, 0x46, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x44, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x65, 0x44, 0x44, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x46, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x54, 0x44, 0x48, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x88, 0x76, 0x67, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x64, 0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x76, 0x78, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x64, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x54, 0x56, 0x8A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x64, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x54, 0x44, 0x44, 0x67, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x64, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x44, 0x59, 0xA8, 0x57, 0x75, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x46, 0xDF, 0xFF, 0xC8, 0x74, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFE, 0xED, 0xDC, 0xDE, 0xEF, 0xFF, 0xFF, 0x84, 0x5C, 0xFF, 0xFF, 0xFC, 0x74, 0x5E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8A, 0xDD, 0xCB, 0xA9, 0x88, 0x77, 0x88, 0x9A, 0xDF, 0xFE, 0x84, 0x7F, 0xFF, 0xFF, 0xFF, 0x86, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8A, 0xEF, 0x95, 0x7F, 0xFF, 0xFF, 0xFF, 0x97, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8C, 0xA7, 0x7D, 0xFF, 0xFF, 0xFC, 0x77, 0x89, 0xAB, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xA8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x86, 0x7A, 0xFF, 0xFF, 0xE6, 0x47, 0x87, 0x77, 0x88, 0x9A, 0xBB, 0xBB, 0xBA, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x56, 0x8B, 0xCA, 0x64, 0x57, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6A, 0x87, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x44, 0x98, 0x44, 0x44, 0x46, 0xCC, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x49, 0xFF, 0xB7, 0x67, 0xAE, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x44, 0x8F, 0xFF, 0xFF, 0xEF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x47, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x44, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0x45, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x54, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x45, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x54, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xBD, 0xEF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x9A, 0xBB, 0xCC, 0xCA, 0x98, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp deleted file mode 100644 index 4586954ccf..0000000000 --- a/Marlin/src/lcd/tft/images/fan_fast_64x64x4.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t fan_fast0_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x89, 0x98, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x8A, 0xBD, 0xEF, 0xFE, 0xEC, 0xBA, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x89, 0xAC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x79, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9C, 0xED, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xDE, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xBD, 0xED, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xDD, 0xDD, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAC, 0xDD, 0xDD, 0xDD, 0xDD, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x68, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xCB, 0xCD, 0xDD, 0xDD, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x68, 0x88, 0x78, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCA, 0xAC, 0xDD, 0xDD, 0xDD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x55, 0x68, 0x87, 0x8A, 0xBA, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xAC, 0xBA, 0xAA, 0xBC, 0xDD, 0xDD, 0xDD, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x55, 0x78, 0x78, 0xAC, 0xBB, 0x97, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x79, 0xCB, 0xAA, 0xAA, 0xAA, 0xBC, 0xDD, 0xDD, 0xDC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x56, 0x78, 0x8A, 0xCB, 0xAA, 0xA8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCA, 0xAA, 0xAA, 0xAA, 0xAA, 0xCD, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x57, 0x87, 0x9C, 0xBA, 0xAA, 0xB9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9B, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xDD, 0xDD, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x55, 0x67, 0x79, 0xBB, 0xBA, 0xAA, 0xAA, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9C, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x55, 0x77, 0x9B, 0xCB, 0xAA, 0xAA, 0xAA, 0x96, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x89, 0xAA, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x55, 0x56, 0x79, 0xBC, 0xBA, 0xAA, 0xAA, 0xAA, 0xA6, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xCD, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x55, 0x68, 0xAB, 0xCB, 0xAA, 0xAA, 0xAA, 0xAB, 0xB8, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x56, 0x78, 0x9A, 0xAA, 0xAA, 0xBD, 0xCE, 0xFF, 0xFD, 0xDE, 0xFF, 0xFC, 0x65, 0x56, 0x9B, 0xCB, 0xBA, 0xAA, 0xAA, 0xAB, 0xCD, 0xDB, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x65, 0x55, 0x55, 0x57, 0x9A, 0xAA, 0xAC, 0xDE, 0xFB, 0x86, 0x67, 0x8C, 0xE8, 0x77, 0x8A, 0xCC, 0xBA, 0xAA, 0xAA, 0xAA, 0xCD, 0xDD, 0xDD, 0x86, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x65, 0x55, 0x58, 0xAA, 0xAB, 0xDD, 0x95, 0x55, 0x55, 0x56, 0x68, 0xAA, 0xBB, 0xBB, 0xAA, 0xAA, 0xAA, 0xCD, 0xDD, 0xDD, 0xDD, 0x95, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x76, 0x55, 0x7A, 0xAB, 0xC8, 0x55, 0x57, 0x87, 0x55, 0x56, 0xAC, 0xAA, 0xAA, 0xAA, 0xAB, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xB5, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x76, 0x56, 0xAB, 0x95, 0x55, 0xAE, 0xFF, 0xB7, 0x65, 0x7C, 0xDC, 0xCB, 0xCC, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xC6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xCD, 0xEE, 0xEE, 0xED, 0xCB, 0x96, 0x89, 0x65, 0x5A, 0xFF, 0xFF, 0xFC, 0x77, 0x9C, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xC6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x79, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0x65, 0x6E, 0xFF, 0xFF, 0xFE, 0x77, 0x9E, 0xEC, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0xCC, 0xCD, 0xC6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x8F, 0xFF, 0xFF, 0xFF, 0x75, 0x9F, 0xFF, 0xDD, 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xC6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x65, 0x8E, 0xFF, 0xFF, 0xFE, 0x65, 0x8F, 0xFF, 0xFF, 0xEE, 0xDD, 0xDD, 0xEE, 0xEF, 0xFF, 0xFF, 0xD6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x7A, 0xFF, 0xFF, 0xFA, 0x55, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x77, 0x9D, 0xFD, 0xA5, 0x55, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x66, 0x66, 0x55, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x97, 0x75, 0x55, 0x56, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x57, 0x88, - 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xA8, 0x66, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x65, 0x67, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xCB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x67, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xCB, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x55, 0x68, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xCD, 0xDB, 0xA9, 0x57, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x55, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCC, 0xDD, 0xBA, 0xA8, 0x55, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xDD, 0xDC, 0xAA, 0xA7, 0x55, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDB, 0xAA, 0xA7, 0x56, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDD, 0xCA, 0xAA, 0xA7, 0x56, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x55, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, 0xDD, 0xCA, 0xAA, 0xA7, 0x56, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x55, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xDD, 0xDD, 0xBA, 0xAA, 0xA8, 0x56, 0x87, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x56, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDD, 0xBA, 0xAA, 0xB9, 0x56, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x55, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xDD, 0xDD, 0xBA, 0xAA, 0xA9, 0x56, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x85, 0x55, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0xEF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0x76, 0x88, 0x76, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x7E, 0xFF, 0xFF, 0xFD, 0xCD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0x85, 0x78, 0x87, 0x6B, 0xFF, 0xFF, 0xFF, 0xFD, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x67, 0xDF, 0xFF, 0xEC, 0xDD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0xA6, 0x68, 0x88, 0x76, 0xAE, 0xFF, 0xFE, 0xA6, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x6B, 0xFF, 0xDC, 0xDD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0xA7, 0x68, 0x88, 0x86, 0x56, 0x89, 0x86, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8B, 0xDD, 0xDD, 0xDD, 0xDD, 0xBA, 0xAA, 0xAA, 0xA9, 0x57, 0x88, 0x88, 0x65, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x8B, 0xDD, 0xDD, 0xDD, 0xAA, 0xAA, 0xAA, 0xAA, 0x66, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x56, 0x8B, 0xDD, 0xDC, 0xAA, 0xAA, 0xAA, 0xBA, 0x65, 0x78, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x79, 0x99, 0x99, 0xAA, 0xAA, 0x97, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x55, 0x56, 0x66, 0x66, 0x65, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -extern const uint8_t fan_fast1_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x66, 0x66, 0x66, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x57, 0x9A, 0xAA, 0xA9, 0x99, 0x99, 0x75, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x75, 0x6A, 0xBA, 0xAA, 0xAA, 0xAC, 0xDD, 0xDB, 0x86, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x67, 0x88, 0x88, 0x86, 0x6A, 0xAA, 0xAA, 0xAA, 0xAD, 0xDD, 0xDD, 0xDB, 0x85, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x68, 0x88, 0x87, 0x59, 0xAA, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xDD, 0xDB, 0x85, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x56, 0x89, 0x86, 0x56, 0x88, 0x88, 0x67, 0xAA, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xDC, 0xDF, 0xFB, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x56, 0xAE, 0xFF, 0xFE, 0xA6, 0x78, 0x88, 0x66, 0xAA, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xDC, 0xEF, 0xFF, 0xD7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x7D, 0xFF, 0xFF, 0xFF, 0xFB, 0x67, 0x88, 0x75, 0x8A, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xCD, 0xFF, 0xFF, 0xFE, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x58, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x86, 0x7A, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xE7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x86, 0x59, 0xAA, 0xAA, 0xBD, 0xDD, 0xDD, 0xCF, 0xFF, 0xFF, 0xFF, 0xFE, 0x76, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x86, 0x59, 0xBA, 0xAA, 0xBD, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x55, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x86, 0x58, 0xAA, 0xAA, 0xBD, 0xDD, 0xDC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x75, 0x55, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x76, 0x57, 0xAA, 0xAA, 0xCD, 0xDD, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x65, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x57, 0xAA, 0xAA, 0xCD, 0xDD, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x65, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x57, 0xAA, 0xAB, 0xDD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x55, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x57, 0xAA, 0xAC, 0xDD, 0xDC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x55, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x58, 0xAA, 0xBD, 0xDC, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x56, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x59, 0xAB, 0xDD, 0xCD, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x65, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x7B, 0xCD, 0xDC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x65, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBB, 0xCC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x65, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x86, 0x68, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x55, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x96, 0x55, 0x55, 0x77, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x55, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x55, 0x56, 0x66, 0x67, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x55, 0xAD, 0xFD, 0x97, 0x75, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x5A, 0xFF, 0xFF, 0xFA, 0x75, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xDF, 0xFF, 0xFF, 0xEE, 0xED, 0xDD, 0xDE, 0xEF, 0xFF, 0xFF, 0x85, 0x6E, 0xFF, 0xFF, 0xFE, 0x85, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xCD, 0xDD, 0xDD, 0xDC, 0xCC, 0xCC, 0xCC, 0xCD, 0xDF, 0xFF, 0x95, 0x7F, 0xFF, 0xFF, 0xFF, 0x85, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xCD, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, 0xEE, 0x97, 0x7E, 0xFF, 0xFF, 0xFE, 0x65, 0x6B, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDC, 0x97, 0x7C, 0xFF, 0xFF, 0xFA, 0x55, 0x69, 0x86, 0x9B, 0xCD, 0xEE, 0xEE, 0xED, 0xCA, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x56, 0xCD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xCC, 0xCB, 0xCC, 0xDC, 0x75, 0x67, 0xBF, 0xFE, 0xA5, 0x55, 0x9B, 0xA6, 0x56, 0x78, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x65, 0xBD, 0xDD, 0xDD, 0xDD, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA, 0xAC, 0xA6, 0x55, 0x57, 0x87, 0x55, 0x58, 0xCB, 0xAA, 0x75, 0x56, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x75, 0x9D, 0xDD, 0xDD, 0xDD, 0xCA, 0xAA, 0xAA, 0xAB, 0xBB, 0xBA, 0xA8, 0x66, 0x55, 0x55, 0x55, 0x9D, 0xDB, 0xAA, 0xA8, 0x55, 0x55, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x8D, 0xDD, 0xDD, 0xCA, 0xAA, 0xAA, 0xAA, 0xBC, 0xCA, 0x87, 0x78, 0xEC, 0x87, 0x66, 0x8B, 0xFE, 0xDC, 0xAA, 0xAA, 0x97, 0x55, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x6B, 0xDD, 0xCB, 0xAA, 0xAA, 0xAA, 0xBB, 0xCB, 0x96, 0x55, 0x6C, 0xFF, 0xFE, 0xDD, 0xFF, 0xFE, 0xCD, 0xBA, 0xAA, 0xAA, 0x98, 0x76, 0x55, 0x55, 0x57, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x68, 0xBB, 0xAA, 0xAA, 0xAA, 0xAB, 0xCB, 0xA8, 0x65, 0x55, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xCA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x87, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x66, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0xB9, 0x76, 0x55, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAB, 0xAA, 0xA9, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x76, 0x9A, 0xAA, 0xAA, 0xAB, 0xCB, 0x97, 0x75, 0x55, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDD, 0xBA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBC, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7A, 0xAA, 0xAA, 0xBB, 0xB9, 0x77, 0x65, 0x57, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xDD, 0xDB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x69, 0xBA, 0xAA, 0xBC, 0x97, 0x87, 0x55, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDD, 0xCA, 0xAA, 0xAA, 0xAA, 0xAA, 0xCB, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xAA, 0xAB, 0xCA, 0x88, 0x76, 0x55, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xDD, 0xDD, 0xDC, 0xBA, 0xAA, 0xAA, 0xAB, 0xC9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9B, 0xBC, 0xA8, 0x78, 0x75, 0x56, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xDD, 0xDD, 0xDC, 0xBA, 0xAA, 0xBC, 0xA8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xBA, 0x87, 0x88, 0x65, 0x5A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDD, 0xDD, 0xDD, 0xDC, 0xAA, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x78, 0x88, 0x65, 0x6D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDD, 0xDD, 0xDD, 0xCB, 0xC9, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x65, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xCD, 0xDD, 0xDD, 0xDD, 0xDC, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDD, 0xDD, 0xDD, 0xDA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xDD, 0xDD, 0xED, 0xB8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCD, 0xDE, 0xDA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xEC, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xB8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9C, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xA9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x8A, 0xBC, 0xEE, 0xFF, 0xED, 0xBA, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x99, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp b/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp deleted file mode 100644 index 7bbd149ae7..0000000000 --- a/Marlin/src/lcd/tft/images/fan_slow_64x64x4.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t fan_slow0_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9A, 0xBB, 0xBB, 0xAA, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xAB, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xAE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xAC, 0xCB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xBC, 0xBB, 0xBB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xCB, 0xBB, 0xBB, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xBB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8A, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9B, 0xCB, 0xBB, 0xBB, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xAC, 0xCB, 0xBB, 0xBB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xBC, 0xBB, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8A, 0xBC, 0xBB, 0xBB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x9B, 0xCB, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xBC, 0xBB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9B, 0xCB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xCB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xAC, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xAB, 0xA8, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9B, 0xBE, 0xFF, 0xCA, 0xAB, 0xCE, 0xFD, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xAB, 0xCC, 0xCA, 0x78, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCF, 0xD9, 0x77, 0x77, 0x79, 0xC8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9B, 0xCC, 0xBB, 0xCB, 0x87, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8A, 0xCC, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9B, 0xCC, 0xBB, 0xBB, 0xCB, 0x87, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x79, 0xB8, 0x77, 0x8A, 0xCB, 0x97, 0x77, 0x8A, 0xA9, 0x88, 0x88, 0x89, 0xAB, 0xCC, 0xBB, 0xBB, 0xBB, 0xBC, 0x97, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x99, 0xAA, 0x99, 0x98, 0x87, 0x77, 0x79, 0x97, 0x78, 0xDF, 0xFF, 0xEA, 0x77, 0x8A, 0xCB, 0xBB, 0xBB, 0xBB, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0x97, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7A, 0xCE, 0xFF, 0xFF, 0xFF, 0xEE, 0xDC, 0xA9, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFE, 0x97, 0x8C, 0xCB, 0xBC, 0xCC, 0xCB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0x97, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xB7, 0x7C, 0xFD, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0x97, 0x88, - 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xC7, 0x7B, 0xFF, 0xEC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCD, 0xCC, 0x97, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x8E, 0xFF, 0xFF, 0xFF, 0xA7, 0x7B, 0xFF, 0xFF, 0xED, 0xDC, 0xCC, 0xCD, 0xDE, 0xFF, 0xFF, 0xFE, 0x97, 0x88, - 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x7B, 0xFF, 0xFF, 0xFD, 0x87, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, - 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x78, 0xBE, 0xFF, 0xC8, 0x77, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, - 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x77, 0x79, 0x99, 0x87, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, - 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x77, 0x77, 0x77, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x97, 0x88, - 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x97, 0x78, 0x7B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, - 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x98, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x78, 0x88, - 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xCC, 0xA8, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBB, 0xCA, 0x87, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, - 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBB, 0xBC, 0xA8, 0x78, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBB, 0x87, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xCA, 0x78, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xBC, 0xB8, 0x78, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBC, 0xA8, 0x78, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xBB, 0xBC, 0x97, 0x88, 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xBB, 0xBC, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xBB, 0xBB, 0x87, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xEF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xDB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xEF, 0xFF, 0xFF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAE, 0xFF, 0xFF, 0xCB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9D, 0xFF, 0xFF, 0xFD, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xDF, 0xFD, 0xBB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xAC, 0xCB, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xCC, 0xBB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8A, 0xBC, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x8A, 0xBC, 0xCB, 0xCA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x8A, 0xBB, 0xB9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -extern const uint8_t fan_slow1_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xBB, 0xBA, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xCB, 0xCC, 0xBA, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBC, 0xBA, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xBC, 0xCA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x9B, 0xCC, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xBD, 0xFF, 0xD9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9D, 0xFF, 0xFF, 0xFD, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xCF, 0xFF, 0xFE, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xDF, 0xFF, 0xFF, 0xFA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x88, 0x88, 0x88, 0x87, 0x8B, 0xBB, 0xBB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x97, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x78, 0xAC, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0x88, 0x88, 0x78, 0xBC, 0xBB, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x7A, 0xCB, 0xBB, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x87, 0x8B, 0xBB, 0xBB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x78, 0xAC, 0xBB, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, - 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x77, 0x8A, 0xCB, 0xBC, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x88, 0x88, - 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x78, 0xAC, 0xCC, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x78, 0x88, - 0x88, 0x88, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x78, 0x9A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, - 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x78, 0x77, 0x9B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, - 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x87, 0x77, 0x77, 0x77, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, - 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x77, 0x89, 0x99, 0x77, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, - 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x78, 0xCF, 0xFE, 0xB8, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, - 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x77, 0x8D, 0xFF, 0xFF, 0xFB, 0x77, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, - 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFE, 0xDD, 0xCC, 0xCC, 0xDD, 0xEF, 0xFF, 0xFB, 0x77, 0xAF, 0xFF, 0xFF, 0xFE, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x88, 0x88, - 0x88, 0x87, 0x9C, 0xCD, 0xCC, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xEF, 0xFB, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0x97, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x87, 0x88, 0x88, - 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBD, 0xFC, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0x97, 0x7B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC, 0xBB, 0xCC, 0x87, 0x9E, 0xFF, 0xFF, 0xFC, 0x87, 0x88, 0x89, 0xAC, 0xDE, 0xEF, 0xFF, 0xFF, 0xFE, 0xCA, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCB, 0xBB, 0xBB, 0xBB, 0xCA, 0x87, 0x7A, 0xEF, 0xFF, 0xD8, 0x77, 0x99, 0x77, 0x77, 0x88, 0x99, 0x9A, 0xA9, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x9C, 0xBB, 0xBB, 0xBB, 0xBC, 0xCB, 0xA9, 0x88, 0x88, 0x89, 0xAA, 0x87, 0x77, 0x9B, 0xCA, 0x87, 0x78, 0xB9, 0x78, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x8B, 0xCB, 0xBB, 0xBC, 0xCB, 0x98, 0x77, 0x77, 0x77, 0x77, 0x78, 0x87, 0x77, 0x77, 0x77, 0x77, 0x8C, 0xCA, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x8B, 0xCB, 0xBC, 0xCB, 0x98, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xC9, 0x77, 0x77, 0x79, 0xDF, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x7A, 0xCC, 0xCB, 0xA8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFE, 0xCB, 0xAA, 0xCF, 0xFE, 0xBB, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x78, 0xAB, 0xA8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBC, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xC9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xCB, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBB, 0xBC, 0xB9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xCB, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xBB, 0xBC, 0xBA, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBB, 0xBC, 0xB9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xBB, 0xCC, 0xA8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xBB, 0xBB, 0xCB, 0x98, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xBB, 0xBB, 0xBB, 0xBC, 0xCA, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xBB, 0xBB, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBB, 0xBB, 0xBB, 0xCA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBB, 0xBB, 0xBC, 0xB8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBB, 0xBB, 0xCB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xCC, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xB9, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xA8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xC9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9B, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xDB, 0xA8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x89, 0x9A, 0xAB, 0xBB, 0xBA, 0x99, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp b/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp deleted file mode 100644 index 52f9124fdb..0000000000 --- a/Marlin/src/lcd/tft/images/feedrate_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t feedrate_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x78, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x8A, 0xCD, 0xA8, 0xCC, 0xB9, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x9C, 0xEF, 0xFF, 0xA8, 0xFF, 0xFF, 0xDA, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x8B, 0xEF, 0xFF, 0xFF, 0x97, 0xFF, 0xFF, 0xFF, 0xD9, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xEC, 0x76, 0xBD, 0xEF, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xC9, 0x65, 0x55, 0x65, 0x6A, 0xEF, 0xFB, 0x67, 0x87, 0x88, 0x88, - 0x88, 0x77, 0xCF, 0xFF, 0xE9, 0x55, 0x55, 0x55, 0x65, 0x55, 0x6B, 0xB5, 0x7D, 0xB7, 0x78, 0x88, - 0x87, 0x7A, 0xFF, 0xFE, 0x85, 0x55, 0x56, 0x67, 0x77, 0x66, 0x55, 0x57, 0xDF, 0xF8, 0x78, 0x88, - 0x87, 0x8E, 0xFF, 0xF8, 0x55, 0x56, 0x67, 0x88, 0x88, 0x87, 0x76, 0x58, 0xFF, 0xFC, 0x67, 0x88, - 0x77, 0xBF, 0xFF, 0xA5, 0x55, 0x67, 0x88, 0x88, 0x87, 0x78, 0xB9, 0x66, 0xBF, 0xFF, 0x86, 0x88, - 0x78, 0xDF, 0xFD, 0x65, 0x56, 0x78, 0x88, 0x87, 0x77, 0xAE, 0xD8, 0x77, 0x7E, 0xFF, 0xB5, 0x78, - 0x79, 0xFF, 0xFA, 0x55, 0x67, 0x88, 0x88, 0x77, 0x9C, 0xFF, 0x86, 0x56, 0x7B, 0xFF, 0xE6, 0x68, - 0x7A, 0xFF, 0xF7, 0x55, 0x78, 0x88, 0x87, 0x8B, 0xFF, 0xFB, 0x55, 0x67, 0x79, 0xFF, 0xF8, 0x68, - 0x7B, 0xFF, 0xE6, 0x56, 0x78, 0x88, 0x78, 0xDF, 0xFF, 0xE7, 0x55, 0x78, 0x79, 0xEE, 0xE8, 0x57, - 0x7C, 0xFF, 0xD6, 0x57, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xA5, 0x56, 0x78, 0x78, 0x77, 0x76, 0x57, - 0x7C, 0xFF, 0xD6, 0x57, 0x88, 0x87, 0x7C, 0xFF, 0xFD, 0x65, 0x57, 0x88, 0x78, 0x98, 0x86, 0x57, - 0x7B, 0xFF, 0xD6, 0x57, 0x88, 0x88, 0x79, 0xEF, 0xE8, 0x55, 0x67, 0x88, 0x79, 0xFF, 0xF9, 0x67, - 0x7B, 0xFF, 0xF7, 0x57, 0x88, 0x88, 0x87, 0x78, 0x75, 0x55, 0x78, 0x88, 0x7A, 0xFF, 0xF8, 0x67, - 0x79, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x65, 0x55, 0x56, 0x88, 0x87, 0x7C, 0xFF, 0xD6, 0x56, - 0x78, 0xEF, 0xFD, 0x57, 0x88, 0x88, 0x88, 0x76, 0x55, 0x67, 0x88, 0x87, 0x8F, 0xFF, 0xB5, 0x57, - 0x77, 0xBF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x77, 0xCF, 0xFF, 0x85, 0x67, - 0x87, 0x8E, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFC, 0x55, 0x67, - 0x88, 0x7A, 0xFF, 0xFD, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9E, 0xFF, 0xF7, 0x55, 0x68, - 0x88, 0x77, 0xBF, 0xFF, 0xEA, 0x77, 0x77, 0x88, 0x87, 0x77, 0x7A, 0xFF, 0xFF, 0x95, 0x56, 0x78, - 0x88, 0x87, 0x6C, 0xFF, 0xFF, 0xC9, 0x87, 0x77, 0x77, 0x89, 0xDF, 0xFF, 0xFB, 0x55, 0x56, 0x88, - 0x88, 0x88, 0x76, 0xCF, 0xFF, 0xFF, 0xDC, 0xBB, 0xBC, 0xEF, 0xFF, 0xFF, 0xA5, 0x55, 0x67, 0x88, - 0x88, 0x88, 0x86, 0x6A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x55, 0x55, 0x78, 0x88, - 0x88, 0x88, 0x87, 0x65, 0x7B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x65, 0x55, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x55, 0x79, 0xBD, 0xDE, 0xDC, 0xB9, 0x65, 0x55, 0x56, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x56, 0x66, 0x66, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x55, 0x55, 0x55, 0x55, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp b/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp deleted file mode 100644 index 2259472f79..0000000000 --- a/Marlin/src/lcd/tft/images/flowrate_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t flowrate_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0x78, 0xCE, 0xEB, 0x77, 0x77, 0x87, 0x7C, 0xEA, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x89, 0x77, 0xEF, 0xFD, 0x67, 0xA8, 0x77, 0x7E, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x78, 0xDF, 0xBA, 0xFF, 0xFE, 0x8B, 0xFD, 0x87, 0x7D, 0xFA, 0x56, 0x87, 0x77, 0x88, 0x88, - 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x7D, 0xFA, 0x56, 0x77, 0x87, 0x77, 0x88, - 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x7D, 0xFA, 0x56, 0x9C, 0xDC, 0x97, 0x78, - 0x87, 0x78, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x6D, 0xFA, 0x59, 0xFF, 0xFF, 0xFB, 0x77, - 0x88, 0x89, 0xEF, 0xFF, 0xA7, 0x7B, 0xFF, 0xFD, 0x76, 0x5D, 0xF9, 0x7F, 0xFF, 0xFF, 0xFF, 0x97, - 0x7A, 0xDF, 0xFF, 0xFA, 0x55, 0x55, 0xCF, 0xFF, 0xEC, 0x9C, 0xF9, 0x9F, 0xFF, 0xFF, 0xFF, 0xC6, - 0x7C, 0xFF, 0xFF, 0xF7, 0x55, 0x55, 0x8F, 0xFF, 0xFF, 0xAC, 0xF9, 0xBF, 0xFD, 0x6C, 0xFF, 0xE5, - 0x7C, 0xFF, 0xFF, 0xF7, 0x56, 0x77, 0xAF, 0xFF, 0xFF, 0x9B, 0xF9, 0xBF, 0xFE, 0x8D, 0xFF, 0xE5, - 0x7A, 0xDE, 0xFF, 0xFB, 0x56, 0x77, 0xDF, 0xFF, 0xED, 0x8C, 0xF9, 0x8F, 0xFF, 0xFF, 0xFF, 0xB5, - 0x87, 0x67, 0xEF, 0xFF, 0xA8, 0x9C, 0xFF, 0xFD, 0x76, 0x5D, 0xF9, 0x6D, 0xFF, 0xFF, 0xFE, 0x75, - 0x88, 0x66, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x5C, 0xFA, 0x57, 0xDF, 0xFF, 0xD8, 0x55, - 0x87, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x6D, 0xFA, 0x55, 0x68, 0xA9, 0x65, 0x55, - 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x7D, 0xFA, 0x56, 0x65, 0x55, 0x55, 0x56, - 0x88, 0x78, 0xDF, 0xA8, 0xFF, 0xFE, 0x8A, 0xFC, 0x65, 0x6D, 0xFA, 0x56, 0x77, 0x65, 0x56, 0x67, - 0x88, 0x87, 0x78, 0x55, 0xEF, 0xFD, 0x55, 0x86, 0x55, 0x5D, 0xFA, 0x56, 0x88, 0x77, 0x77, 0x88, - 0x88, 0x88, 0x65, 0x55, 0xBE, 0xEA, 0x55, 0x55, 0x55, 0x6B, 0xD8, 0x56, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0x66, 0x76, 0x65, 0x56, 0x76, 0x68, 0xA9, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x77, 0x76, 0x55, 0x56, 0x87, 0x7B, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x67, 0x88, 0x78, 0xEF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x87, 0xAF, 0xFF, 0x95, 0x56, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7D, 0xFD, 0x65, 0x56, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xF8, 0x55, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x96, 0x55, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp b/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp deleted file mode 100644 index 5382ff7558..0000000000 --- a/Marlin/src/lcd/tft/images/heated_bed_64x64x4.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t bed_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -extern const uint8_t bed_heated_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9B, 0x97, 0x88, 0x88, 0x87, 0x8B, 0xA8, 0x78, 0x88, 0x87, 0x8B, 0xB8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xF9, 0x78, 0x88, 0x78, 0xDF, 0xFB, 0x78, 0x88, 0x77, 0xCF, 0xFC, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFD, 0x77, 0x88, 0x79, 0xFF, 0xFF, 0x87, 0x88, 0x78, 0xDF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0x86, 0x88, 0x78, 0xDF, 0xFF, 0xB6, 0x88, 0x77, 0xCF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xB6, 0x78, 0x87, 0x9F, 0xFF, 0xD6, 0x78, 0x87, 0x8E, 0xFF, 0xF7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7D, 0xFF, 0xE6, 0x68, 0x87, 0x7D, 0xFF, 0xE7, 0x68, 0x88, 0x7A, 0xFF, 0xF9, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7D, 0xFF, 0xE5, 0x67, 0x87, 0x7B, 0xFF, 0xF7, 0x57, 0x88, 0x79, 0xFF, 0xFA, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xE6, 0x57, 0x87, 0x8C, 0xFF, 0xF7, 0x57, 0x88, 0x7A, 0xFF, 0xFA, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xD5, 0x57, 0x87, 0x8E, 0xFF, 0xE6, 0x57, 0x88, 0x7C, 0xFF, 0xF8, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xA5, 0x57, 0x87, 0xAF, 0xFF, 0xD5, 0x57, 0x87, 0x9F, 0xFF, 0xE6, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0x75, 0x57, 0x78, 0xEF, 0xFF, 0xA5, 0x57, 0x87, 0xCF, 0xFF, 0xB5, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFB, 0x55, 0x67, 0x7B, 0xFF, 0xFE, 0x65, 0x57, 0x79, 0xFF, 0xFF, 0x85, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xF7, 0x55, 0x67, 0x8E, 0xFF, 0xF8, 0x55, 0x67, 0x7D, 0xFF, 0xFB, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xB5, 0x55, 0x77, 0x9F, 0xFF, 0xD6, 0x55, 0x77, 0x8F, 0xFF, 0xE7, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xDF, 0xFF, 0x75, 0x56, 0x87, 0xBF, 0xFF, 0xA5, 0x56, 0x77, 0xAF, 0xFF, 0xB5, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFD, 0x65, 0x67, 0x77, 0xCF, 0xFF, 0x85, 0x57, 0x87, 0xBF, 0xFF, 0x95, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xEF, 0xFD, 0x55, 0x68, 0x77, 0xCF, 0xFF, 0x75, 0x68, 0x87, 0xBF, 0xFF, 0x95, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0x65, 0x78, 0x77, 0xBF, 0xFF, 0x95, 0x68, 0x87, 0xAF, 0xFF, 0xB5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xCF, 0xFF, 0xB5, 0x78, 0x87, 0xAF, 0xFF, 0xD6, 0x68, 0x87, 0x9F, 0xFF, 0xE7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xF8, 0x68, 0x87, 0x8E, 0xFF, 0xF9, 0x68, 0x87, 0x7C, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFA, 0x58, 0x88, 0x7B, 0xFF, 0xFC, 0x57, 0x88, 0x78, 0xFF, 0xFE, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xDF, 0xD7, 0x57, 0x88, 0x87, 0xBF, 0xF8, 0x56, 0x88, 0x87, 0xAF, 0xFA, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x69, 0x75, 0x56, 0x88, 0x87, 0x68, 0x85, 0x56, 0x78, 0x87, 0x68, 0x85, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x65, 0x55, 0x57, 0x88, 0x88, 0x75, 0x55, 0x56, 0x88, 0x88, 0x75, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x67, 0x77, 0x77, 0x76, 0x55, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x78, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x46, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x89, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/home_64x64x4.cpp b/Marlin/src/lcd/tft/images/home_64x64x4.cpp deleted file mode 100644 index 27384c99c0..0000000000 --- a/Marlin/src/lcd/tft/images/home_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t home_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0x88, 0x76, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9D, 0xFF, 0xEA, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xEB, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x40, 0xBF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF6, 0x54, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x57, 0xFF, 0x80, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xBF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, - 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, - 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, - 0x87, 0x7F, 0xFF, 0xFF, 0xFF, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xBF, 0xFF, 0xFF, 0xFB, 0x68, 0x88, - 0x87, 0x7F, 0xFF, 0xFF, 0xF7, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xB, 0xFF, 0xFF, 0xFD, 0x67, 0x88, - 0x87, 0x3D, 0xFF, 0xFF, 0x75, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x30, 0xBF, 0xFF, 0xFA, 0x68, 0x88, - 0x88, 0x44, 0xCE, 0xD7, 0x58, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x74, 0x19, 0xEE, 0xA6, 0x88, 0x88, - 0x88, 0x73, 0x24, 0x56, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x52, 0x35, 0x68, 0x88, 0x88, - 0x88, 0x87, 0x66, 0x78, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x87, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x55, 0x55, 0x55, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x44, 0x44, 0x44, 0x12, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x88, 0x88, 0x88, 0x72, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x4C, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x84, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x32, 0x44, 0x44, 0x44, 0x44, 0x33, 0x57, 0x88, 0x88, 0x88, 0x88, 0x86, 0x43, 0x34, 0x44, 0x44, 0x44, 0x34, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp b/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp deleted file mode 100644 index 7b068aa7e4..0000000000 --- a/Marlin/src/lcd/tft/images/hotend_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t hotend_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xA7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x67, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x8A, 0xAA, 0xAA, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x9A, 0xAA, 0x97, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xEE, 0xA5, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x77, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x55, 0x57, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x55, 0x55, 0x55, 0x68, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x65, 0x6C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x75, 0x55, 0x55, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x65, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x55, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x58, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x85, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x55, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x95, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0xCF, 0xFF, 0xFF, 0xFF, 0xD7, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x5A, 0xFF, 0xFF, 0xFB, 0x65, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x8D, 0xFE, 0xA5, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x87, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x55, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/increase_64x64x4.cpp b/Marlin/src/lcd/tft/images/increase_64x64x4.cpp deleted file mode 100644 index 710fe8e78e..0000000000 --- a/Marlin/src/lcd/tft/images/increase_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t increase_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xBC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x96, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xEE, 0xEE, 0xEE, 0xEE, 0xA6, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/left_32x32x4.cpp b/Marlin/src/lcd/tft/images/left_32x32x4.cpp deleted file mode 100644 index 486518d508..0000000000 --- a/Marlin/src/lcd/tft/images/left_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t left_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xF7, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFB, 0x46, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xA3, 0x34, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFB, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xB3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFB, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xA3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFA, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xA3, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFA, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xF6, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x76, 0xBF, 0xFF, 0xFF, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x3B, 0xFF, 0xFF, 0xF8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x73, 0xCF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x3C, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xCF, 0xFF, 0xFF, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3B, 0xFF, 0xFF, 0xF7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xBF, 0xFF, 0xFF, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4B, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xBF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4B, 0xFF, 0xF9, 0x46, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0xCF, 0x93, 0x34, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x4B, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0x34, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp b/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp deleted file mode 100644 index 3243d7f27f..0000000000 --- a/Marlin/src/lcd/tft/images/leveling_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t leveling_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x89, 0x99, 0x99, 0x99, 0x99, 0x87, 0x78, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x88, 0x87, 0x7B, 0x77, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x88, 0x87, 0x8F, 0x97, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x88, 0x77, 0xEF, 0xF5, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x88, 0x7A, 0xFF, 0xFC, 0x78, 0x88, 0x88, - 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x7A, 0x88, 0x88, 0x58, 0x88, 0x88, - 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x66, 0x87, 0x45, 0x55, 0x57, 0x88, 0x88, - 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x76, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x85, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x56, 0x7C, 0xFF, 0xFE, 0x67, 0x88, 0x88, - 0x88, 0x88, 0x86, 0x55, 0xEF, 0xFF, 0xFF, 0xF9, 0x45, 0x57, 0x86, 0xFF, 0xF5, 0x57, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x4C, 0xFF, 0xFF, 0x74, 0x57, 0x88, 0x87, 0x8F, 0xA4, 0x68, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x84, 0x9F, 0xD5, 0x45, 0x78, 0x88, 0x88, 0x7C, 0x55, 0x88, 0x88, 0x88, - 0x87, 0x77, 0x77, 0x77, 0x88, 0x65, 0x55, 0x68, 0x87, 0x77, 0x77, 0x86, 0x57, 0x87, 0x77, 0x78, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x56, 0x77, 0x77, 0x77, 0x77, 0x77, 0x67, 0x77, 0x77, 0x77, - 0x7B, 0xFE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEF, 0xB7, - 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, - 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, - 0x78, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x66, - 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/menu_64x64x4.cpp b/Marlin/src/lcd/tft/images/menu_64x64x4.cpp deleted file mode 100644 index bbbe66ab1b..0000000000 --- a/Marlin/src/lcd/tft/images/menu_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t menu_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x9A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x98, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFA, 0x78, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xFB, 0x66, 0x88, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFA, 0x66, 0x88, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x8A, 0xBB, 0xA7, 0x67, 0x88, 0x88, 0xAB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xA6, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x67, 0x88, 0x88, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/pause_64x64x4.cpp b/Marlin/src/lcd/tft/images/pause_64x64x4.cpp deleted file mode 100644 index 3079b22a17..0000000000 --- a/Marlin/src/lcd/tft/images/pause_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t pause_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x78, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x78, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x67, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x67, 0x88, 0x88, 0x87, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x76, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x66, 0x66, 0x66, 0x66, 0x77, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x66, 0x66, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp b/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp deleted file mode 100644 index f8548d2837..0000000000 --- a/Marlin/src/lcd/tft/images/refresh_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t refresh_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0x57, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0x9A, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFE, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xFF, 0xCE, 0xFF, 0xFD, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x88, 0x6A, 0xFF, 0x55, 0x5C, 0xFF, 0xD7, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xA7, 0x78, 0x86, 0x9F, 0x57, 0x75, 0x8F, 0xFB, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xFC, 0x78, 0x88, 0x69, 0x67, 0x88, 0x69, 0xFF, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7C, 0xFF, 0x58, 0x88, 0x87, 0x58, 0x88, 0x86, 0xFF, 0xA7, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7E, 0xFA, 0x58, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xE5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7F, 0xF8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xF5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7F, 0xF8, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAF, 0xF5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7E, 0xFA, 0x68, 0x88, 0x88, 0x88, 0x88, 0x87, 0xCF, 0xE5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7C, 0xFF, 0x68, 0x88, 0x87, 0x78, 0x88, 0x77, 0xFF, 0xA5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x78, 0xFF, 0xA7, 0x88, 0x78, 0xB7, 0x88, 0x77, 0xBF, 0x66, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0xBF, 0xF9, 0x77, 0x77, 0xFB, 0x78, 0x88, 0x68, 0x57, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x6D, 0xFF, 0xD8, 0x77, 0xFF, 0xB7, 0x78, 0x87, 0x68, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x85, 0xCF, 0xFF, 0xFD, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x57, 0xEF, 0xFF, 0xFF, 0xFF, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x89, 0xFF, 0xF8, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0xFF, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xF7, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/right_32x32x4.cpp b/Marlin/src/lcd/tft/images/right_32x32x4.cpp deleted file mode 100644 index ab9c36eae0..0000000000 --- a/Marlin/src/lcd/tft/images/right_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t right_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x8F, 0xA7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x78, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x84, 0xAF, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x3A, 0xFF, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xAF, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x3A, 0xFF, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xAF, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x4A, 0xFF, 0xFF, 0xF9, 0x77, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x9F, 0xFF, 0xFF, 0x97, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x49, 0xFF, 0xFF, 0xFA, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xC4, 0x36, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFC, 0x33, 0x46, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xC3, 0x34, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFD, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xD3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xFF, 0xFF, 0xFC, 0x34, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x8F, 0xFF, 0xFF, 0xC3, 0x44, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x78, 0xFF, 0xFF, 0xFC, 0x33, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xC4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x8A, 0xFF, 0xFC, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x84, 0x8F, 0xC4, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x4A, 0x53, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x34, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/sd_64x64x4.cpp b/Marlin/src/lcd/tft/images/sd_64x64x4.cpp deleted file mode 100644 index 3f786f46ca..0000000000 --- a/Marlin/src/lcd/tft/images/sd_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t sd_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xFF, 0xFE, 0xDF, 0xFF, 0xFD, 0xEF, 0xFF, 0xDE, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0xBF, 0xFA, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x59, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xBF, 0xF9, 0x3A, 0xFF, 0xA3, 0x9F, 0xFB, 0x48, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xBF, 0xF9, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x49, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xCF, 0xF9, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x49, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xCF, 0xF9, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x49, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xCF, 0xF9, 0x4B, 0xFF, 0xA4, 0xAF, 0xFB, 0x49, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0xBF, 0xF9, 0x3A, 0xFF, 0xA3, 0xAF, 0xFB, 0x39, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xCF, 0xFA, 0x5B, 0xFF, 0xB5, 0xBF, 0xFC, 0x5A, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFE, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/settings_64x64x4.cpp b/Marlin/src/lcd/tft/images/settings_64x64x4.cpp deleted file mode 100644 index 093e7ff61e..0000000000 --- a/Marlin/src/lcd/tft/images/settings_64x64x4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t settings_64x64x4[2048] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0xAD, 0xDD, 0xDD, 0xD9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x88, 0x77, 0xEF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x87, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x87, 0x78, 0x79, 0xFF, 0xFF, 0xFF, 0xFD, 0x67, 0x87, 0x78, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8D, 0xEB, 0x87, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0x75, 0x78, 0xCE, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xEA, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xBF, 0xFF, 0xFB, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x98, 0x8A, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFB, 0x65, 0x55, 0x55, 0x57, 0xDF, 0xFF, 0xFF, 0xFF, 0xB5, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x6C, 0xFF, 0xFF, 0xFF, 0x95, 0x56, 0x66, 0x66, 0x65, 0x5B, 0xFF, 0xFF, 0xFF, 0x95, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0xAF, 0xFF, 0xFF, 0xFA, 0x56, 0x66, 0x67, 0x77, 0x77, 0x65, 0xDF, 0xFF, 0xFF, 0xD7, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x89, 0xCE, 0xFF, 0xFF, 0xFF, 0xD5, 0x56, 0x67, 0x88, 0x88, 0x88, 0x86, 0x7F, 0xFF, 0xFF, 0xFF, 0xDB, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0x95, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x6C, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFE, 0x75, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFD, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0x75, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8C, 0xEF, 0xFF, 0xFF, 0xFF, 0xA5, 0x78, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7E, 0xFF, 0xFF, 0xFF, 0xFE, 0xA5, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x66, 0x79, 0xCF, 0xFF, 0xE7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xFC, 0x96, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x55, 0x55, 0x58, 0xDF, 0xFD, 0x77, 0x78, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFF, 0xA5, 0x56, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x9C, 0xDD, 0xDB, 0x96, 0x55, 0x5B, 0xFF, 0xD8, 0x77, 0x77, 0x77, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0x95, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAD, 0xFF, 0xFF, 0xFF, 0xFE, 0xB7, 0x55, 0xBF, 0xFE, 0xB9, 0x77, 0x78, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x67, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x86, 0x6D, 0xFF, 0xFF, 0xED, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x77, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0xB7, 0x56, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xC6, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x8C, 0xEF, 0xFF, 0xFF, 0xFF, 0xFD, 0xEF, 0xFF, 0xFE, 0x75, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x7A, 0xFF, 0xFF, 0xFC, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x66, 0x68, 0xBD, 0xFF, 0xFF, 0xA5, 0x7B, 0xFF, 0xE7, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x7B, 0xFF, 0xFF, 0xFD, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x66, 0x55, 0x56, 0x8A, 0xEE, 0x65, 0x55, 0x7A, 0x75, 0x66, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xFF, 0x75, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x97, 0x55, 0x55, 0x66, 0x66, 0x66, 0x55, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x78, 0xFF, 0xFF, 0xFE, 0x65, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xCA, 0x76, 0x55, 0x56, 0x78, 0x76, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0x97, 0x9D, 0xFF, 0xD5, 0x6B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x97, 0x66, 0x77, 0x88, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x7B, 0xFD, 0xA7, 0x9A, 0x68, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x97, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x79, 0xFF, 0xFF, 0xC9, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xB8, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x98, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x76, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x89, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x87, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x59, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x55, 0x57, 0x9B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x87, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x75, 0x6A, 0xDF, 0xFF, 0xFE, 0xB8, 0x55, 0x66, 0x65, 0x55, 0x69, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x85, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x55, 0x67, 0x77, 0x76, 0x55, 0x66, 0x67, 0x76, 0x66, 0x55, 0x56, 0x7B, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x65, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x66, 0x66, 0x78, 0x88, 0x87, 0x76, 0x65, 0x55, 0x68, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x88, 0x76, 0x66, 0x66, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x77, 0x66, 0x55, 0x55, 0x8A, 0xDF, 0xFF, 0xFF, 0xFF, 0xF8, 0x56, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x65, 0x55, 0x67, 0x9C, 0xEF, 0xFF, 0xB5, 0x66, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x55, 0x55, 0x79, 0xB9, 0x56, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x66, 0x55, 0x55, 0x66, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x76, 0x56, 0x66, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/slider_8x16x4.cpp b/Marlin/src/lcd/tft/images/slider_8x16x4.cpp deleted file mode 100644 index 2839cd9806..0000000000 --- a/Marlin/src/lcd/tft/images/slider_8x16x4.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t slider_8x16x4[64] = { - 0x88, 0xFF, 0xFF, 0x88, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x8F, 0xFF, 0xFF, 0xF8, - 0x88, 0xFF, 0xFF, 0x88, -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/up_32x32x4.cpp b/Marlin/src/lcd/tft/images/up_32x32x4.cpp deleted file mode 100644 index b36a028cc9..0000000000 --- a/Marlin/src/lcd/tft/images/up_32x32x4.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if HAS_GRAPHICAL_TFT - -extern const uint8_t up_32x32x4[512] = { - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x78, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0xAD, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xB3, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x9F, 0xFF, 0xFB, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x87, 0x79, 0xFF, 0xFF, 0xFF, 0xC3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xFF, 0xFF, 0xFF, 0xFC, 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x78, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xA6, 0xFF, 0xFF, 0xFB, 0x47, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFA, 0x33, 0x6F, 0xFF, 0xFF, 0xB4, 0x78, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xA3, 0x34, 0x78, 0xFF, 0xFF, 0xFB, 0x47, 0x88, 0x88, 0x88, - 0x88, 0x87, 0x7A, 0xFF, 0xFF, 0xFA, 0x33, 0x47, 0x87, 0x8F, 0xFF, 0xFF, 0xB4, 0x78, 0x88, 0x88, - 0x88, 0x77, 0xAF, 0xFF, 0xFF, 0xB3, 0x44, 0x78, 0x87, 0x78, 0xFF, 0xFF, 0xFB, 0x47, 0x88, 0x88, - 0x88, 0x7A, 0xFF, 0xFF, 0xFB, 0x34, 0x47, 0x88, 0x88, 0x87, 0x7F, 0xFF, 0xFF, 0xC4, 0x78, 0x88, - 0x88, 0x7F, 0xFF, 0xFF, 0xB3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x77, 0xFF, 0xFF, 0xFB, 0x37, 0x88, - 0x88, 0x78, 0xFF, 0xFA, 0x34, 0x48, 0x88, 0x88, 0x88, 0x88, 0x87, 0x8F, 0xFF, 0x93, 0x34, 0x88, - 0x88, 0x77, 0x7F, 0xB3, 0x44, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0xF9, 0x34, 0x47, 0x88, - 0x88, 0x87, 0x78, 0x43, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x84, 0x34, 0x88, 0x88, - 0x88, 0x88, 0x87, 0x64, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x47, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 -}; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft.cpp b/Marlin/src/lcd/tft/tft.cpp deleted file mode 100644 index fa3c2c241f..0000000000 --- a/Marlin/src/lcd/tft/tft.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_GRAPHICAL_TFT - -#include "tft.h" - -//#define DEBUG_GRAPHICAL_TFT -#define DEBUG_OUT ENABLED(DEBUG_GRAPHICAL_TFT) -#include "../../core/debug_out.h" - -uint16_t TFT::buffer[]; - -void TFT::init() { - io.Init(); - io.InitTFT(); -} - -TFT tft; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h deleted file mode 100644 index ed3d5e35c1..0000000000 --- a/Marlin/src/lcd/tft/tft.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_queue.h" -#include "canvas.h" -#include "tft_color.h" -#include "tft_string.h" -#include "tft_image.h" -#include "../tft_io/tft_io.h" - -#include "../../inc/MarlinConfig.h" - -#if HAS_UI_320x240 - #define TFT_WIDTH 320 - #define TFT_HEIGHT 240 -#elif HAS_UI_480x320 - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 -#else - #error "Unsupported display resolution!" -#endif - -#ifndef TFT_BUFFER_SIZE - #ifdef STM32F103xB - #define TFT_BUFFER_SIZE 1024 - #elif defined(STM32F103xE) - #define TFT_BUFFER_SIZE 19200 // 320 * 60 - #elif defined(STM32F1) - #define TFT_BUFFER_SIZE 8192 - #else - #define TFT_BUFFER_SIZE 19200 // 320 * 60 - #endif -#endif - -#if TFT_BUFFER_SIZE > 65535 - // DMA Count parameter is uint16_t - #error "TFT_BUFFER_SIZE can not exceed 65535" -#endif - -class TFT { - private: - static TFT_String string; - static TFT_IO io; - - public: - static TFT_Queue queue; - - static uint16_t buffer[TFT_BUFFER_SIZE]; - - static void init(); - static inline void set_font(const uint8_t *Font) { string.set_font(Font); } - static inline void add_glyphs(const uint8_t *Font) { string.add_glyphs(Font); } - - static inline bool is_busy() { return io.isBusy(); } - static inline void abort() { io.Abort(); } - static inline void write_multiple(uint16_t Data, uint16_t Count) { io.WriteMultiple(Data, Count); } - static inline void write_sequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); } - static inline void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { io.set_window(Xmin, Ymin, Xmax, Ymax); } - - static inline void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.fill(x, y, width, height, color); } - static inline void canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { queue.canvas(x, y, width, height); } - static inline void set_background(uint16_t color) { queue.set_background(color); } - static inline void add_text(uint16_t x, uint16_t y, uint16_t color, TFT_String tft_string, uint16_t maxWidth = 0) { queue.add_text(x, y, color, tft_string.string(), maxWidth); } - static inline void add_text(uint16_t x, uint16_t y, uint16_t color, const char *string, uint16_t maxWidth = 0) { queue.add_text(x, y, color, (uint8_t *)string, maxWidth); } - static inline void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { queue.add_image(x, y, image, colors); } - static inline void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main = COLOR_WHITE, uint16_t color_background = COLOR_BACKGROUND, uint16_t color_shadow = COLOR_BLACK) { queue.add_image(x, y, image, color_main, color_background, color_shadow); } - static inline void add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.add_bar(x, y, width, height, color); } - static inline void add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.add_rectangle(x, y, width, height, color); } -}; - -extern TFT tft; diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h deleted file mode 100644 index a72a079f6e..0000000000 --- a/Marlin/src/lcd/tft/tft_color.h +++ /dev/null @@ -1,176 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfigPre.h" - -#define RED(color) ((color >> 8) & 0xF8) -#define GREEN(color) ((color >> 3) & 0xFC) -#define BLUE(color) ((color << 3) & 0xF8) -#define RGB(red, green, blue) (((red << 8) & 0xF800) | ((green << 3) & 0x07E0) | ((blue >> 3) & 0x001F)) -#define COLOR(color) RGB(((color >> 16) & 0xFF), ((color >> 8) & 0xFF), (color & 0xFF)) -#define HALF(color) RGB(RED(color) >> 1, GREEN(color) >> 1, BLUE(color) >> 1) - -// see https://ee-programming-notepad.blogspot.com/2016/10/16-bit-color-generator-picker.html - -#define COLOR_BLACK 0x0000 // #000000 -#define COLOR_WHITE 0xFFFF // #FFFFFF -#define COLOR_SILVER 0xC618 // #C0C0C0 -#define COLOR_GREY 0x7BEF // #808080 -#define COLOR_DARKGREY 0x4208 // #404040 -#define COLOR_DARKGREY2 0x39E7 // #303030 -#define COLOR_DARK 0x0003 // Some dark color - -#define COLOR_RED 0xF800 // #FF0000 -#define COLOR_SCARLET 0xF904 // #FF2020 -#define COLOR_LIME 0x7E00 // #00FF00 -#define COLOR_BLUE 0x001F // #0000FF -#define COLOR_LIGHT_BLUE 0x061F // #00C3FF -#define COLOR_YELLOW 0xFFE0 // #FFFF00 -#define COLOR_MAGENTA 0xF81F // #FF00FF -#define COLOR_FUCHSIA 0xF81F // #FF00FF -#define COLOR_CYAN 0x07FF // #00FFFF -#define COLOR_AQUA 0x07FF // #00FFFF -#define COLOR_DODGER_BLUE 0x041F // #0080FF -#define COLOR_VIVID_VIOLET 0x7933 // #772399 - -#define COLOR_DARK_PURPLE 0x9930 // #992380 - -#define COLOR_MAROON 0x7800 // #800000 -#define COLOR_GREEN 0x03E0 // #008000 -#define COLOR_NAVY 0x000F // #000080 -#define COLOR_OLIVE 0x8400 // #808000 -#define COLOR_PURPLE 0x8010 // #800080 -#define COLOR_TEAL 0x0410 // #008080 - -#define COLOR_ORANGE 0xFC00 // #FF7F00 -#define COLOR_VIVID_GREEN 0x7FE0 // #7FFF00 -#define COLOR_DARK_ORANGE 0xFC40 // #FF8C00 -#define COLOR_CORAL_RED 0xF9E7 // #FF3F3F - -#define COLOR_DARK_PURPLE 0x9930 // #992380 - -#ifndef COLOR_BACKGROUND - #define COLOR_BACKGROUND 0x20AC // #1E156E -#endif -#ifndef COLOR_SELECTION_BG - #define COLOR_SELECTION_BG 0x9930 // #992380 -#endif -#ifndef COLOR_WEBSITE_URL - #define COLOR_WEBSITE_URL 0x03B7 -#endif - -#ifndef COLOR_INACTIVE - #define COLOR_INACTIVE COLOR_GREY -#endif -#ifndef COLOR_COLD - #define COLOR_COLD COLOR_AQUA -#endif -#ifndef COLOR_HOTEND - #define COLOR_HOTEND COLOR_SCARLET -#endif -#ifndef COLOR_HEATED_BED - #define COLOR_HEATED_BED COLOR_DARK_ORANGE -#endif -#ifndef COLOR_CHAMBER - #define COLOR_CHAMBER COLOR_DARK_ORANGE -#endif -#ifndef COLOR_FAN - #define COLOR_FAN COLOR_AQUA -#endif - -#ifndef COLOR_AXIS_HOMED - #define COLOR_AXIS_HOMED COLOR_WHITE -#endif -#ifndef COLOR_AXIS_NOT_HOMED - #define COLOR_AXIS_NOT_HOMED COLOR_YELLOW -#endif - -#ifndef COLOR_RATE_100 - #define COLOR_RATE_100 COLOR_VIVID_GREEN -#endif -#ifndef COLOR_RATE_ALTERED - #define COLOR_RATE_ALTERED COLOR_YELLOW -#endif - -#ifndef COLOR_PRINT_TIME - #define COLOR_PRINT_TIME COLOR_AQUA -#endif - -#ifndef COLOR_PROGRESS_FRAME - #define COLOR_PROGRESS_FRAME COLOR_WHITE -#endif -#ifndef COLOR_PROGRESS_BAR - #define COLOR_PROGRESS_BAR COLOR_BLUE -#endif -#ifndef COLOR_PROGRESS_BG - #define COLOR_PROGRESS_BG COLOR_BLACK -#endif - -#ifndef COLOR_STATUS_MESSAGE - #define COLOR_STATUS_MESSAGE COLOR_YELLOW -#endif - -#ifndef COLOR_CONTROL_ENABLED - #define COLOR_CONTROL_ENABLED COLOR_WHITE -#endif -#ifndef COLOR_CONTROL_DISABLED - #define COLOR_CONTROL_DISABLED COLOR_GREY -#endif -#ifndef COLOR_CONTROL_CANCEL - #define COLOR_CONTROL_CANCEL COLOR_SCARLET -#endif -#ifndef COLOR_CONTROL_CONFIRM - #define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN -#endif -#ifndef COLOR_BUSY - #define COLOR_BUSY COLOR_SILVER -#endif - -#ifndef COLOR_MENU_TEXT - #define COLOR_MENU_TEXT COLOR_YELLOW -#endif -#ifndef COLOR_MENU_VALUE - #define COLOR_MENU_VALUE COLOR_WHITE -#endif - -#ifndef COLOR_SLIDER - #define COLOR_SLIDER COLOR_WHITE -#endif -#ifndef COLOR_SLIDER_INACTIVE - #define COLOR_SLIDER_INACTIVE COLOR_GREY -#endif - -#ifndef COLOR_UBL - #define COLOR_UBL COLOR_WHITE -#endif - -#ifndef COLOR_TOUCH_CALIBRATION - #define COLOR_TOUCH_CALIBRATION COLOR_WHITE -#endif - -#ifndef COLOR_KILL_SCREEN_BG - #define COLOR_KILL_SCREEN_BG COLOR_MAROON -#endif -#ifndef COLOR_KILL_SCREEN_TEXT - #define COLOR_KILL_SCREEN_TEXT COLOR_WHITE -#endif diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp deleted file mode 100644 index 27749cb7f3..0000000000 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "tft_image.h" -#include - -const tImage NoLogo = { (void *)NULL, 0, 0, NOCOLORS }; - -const tImage MarlinLogo112x38x1 = { (void *)marlin_logo_112x38x1, 112, 38, GREYSCALE1 }; -const tImage MarlinLogo228x255x2 = { (void *)marlin_logo_228x255x2, 228, 255, GREYSCALE2 }; -const tImage MarlinLogo228x255x4 = { (void *)marlin_logo_228x255x4, 228, 255, GREYSCALE4 }; -const tImage MarlinLogo195x59x16 = { (void *)marlin_logo_195x59x16, 195, 59, HIGHCOLOR }; -const tImage MarlinLogo320x240x16 = { (void *)marlin_logo_320x240x16, 320, 240, HIGHCOLOR }; -const tImage MarlinLogo480x320x16 = { (void *)marlin_logo_480x320x16, 480, 320, HIGHCOLOR }; -const tImage Background320x30x16 = { (void *)background_320x30x16, 320, 30, HIGHCOLOR }; - -const tImage HotEnd_64x64x4 = { (void *)hotend_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Bed_64x64x4 = { (void *)bed_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Bed_Heated_64x64x4 = { (void *)bed_heated_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Chamber_64x64x4 = { (void *)chamber_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Chamber_Heated_64x64x4 = { (void *)chamber_heated_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Fan0_64x64x4 = { (void *)fan0_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Fan1_64x64x4 = { (void *)fan1_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Fan_Slow0_64x64x4 = { (void *)fan_slow0_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Fan_Slow1_64x64x4 = { (void *)fan_slow1_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Fan_Fast0_64x64x4 = { (void *)fan_fast0_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Fan_Fast1_64x64x4 = { (void *)fan_fast1_64x64x4, 64, 64, GREYSCALE4 }; -const tImage SD_64x64x4 = { (void *)sd_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Home_64x64x4 = { (void *)home_64x64x4, 64, 64, GREYSCALE4 }; -const tImage BtnRounded_64x52x4 = { (void *)btn_rounded_64x52x4, 64, 52, GREYSCALE4 }; -const tImage Menu_64x64x4 = { (void *)menu_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Settings_64x64x4 = { (void *)settings_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Confirm_64x64x4 = { (void *)confirm_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Cancel_64x64x4 = { (void *)cancel_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Increase_64x64x4 = { (void *)increase_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Decrease_64x64x4 = { (void *)decrease_64x64x4, 64, 64, GREYSCALE4 }; -const tImage Pause_64x64x4 = { (void *)pause_64x64x4, 64, 64, GREYSCALE4 }; - -const tImage Feedrate_32x32x4 = { (void *)feedrate_32x32x4, 32, 32, GREYSCALE4 }; -const tImage Flowrate_32x32x4 = { (void *)flowrate_32x32x4, 32, 32, GREYSCALE4 }; -const tImage Directory_32x32x4 = { (void *)directory_32x32x4, 32, 32, GREYSCALE4 }; -const tImage Back_32x32x4 = { (void *)back_32x32x4, 32, 32, GREYSCALE4 }; -const tImage Up_32x32x4 = { (void *)up_32x32x4, 32, 32, GREYSCALE4 }; -const tImage Down_32x32x4 = { (void *)down_32x32x4, 32, 32, GREYSCALE4 }; -const tImage Left_32x32x4 = { (void *)left_32x32x4, 32, 32, GREYSCALE4 }; -const tImage Right_32x32x4 = { (void *)right_32x32x4, 32, 32, GREYSCALE4 }; -const tImage Refresh_32x32x4 = { (void *)refresh_32x32x4, 32, 32, GREYSCALE4 }; -const tImage Leveling_32x32x4 = { (void *)leveling_32x32x4, 32, 32, GREYSCALE4 }; - -const tImage Slider8x16x4 = { (void *)slider_8x16x4, 8, 16, GREYSCALE4 }; - -extern const tImage Images[imgCount]; diff --git a/Marlin/src/lcd/tft/tft_image.h b/Marlin/src/lcd/tft/tft_image.h deleted file mode 100644 index 1f13967ba2..0000000000 --- a/Marlin/src/lcd/tft/tft_image.h +++ /dev/null @@ -1,166 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "stdint.h" - - -extern const uint8_t marlin_logo_112x38x1[]; -extern const uint8_t marlin_logo_228x255x2[]; -extern const uint8_t marlin_logo_228x255x4[]; -extern const uint16_t marlin_logo_195x59x16[]; -extern const uint16_t marlin_logo_320x240x16[]; -extern const uint16_t marlin_logo_480x320x16[]; -extern const uint16_t background_320x30x16[]; - -extern const uint8_t hotend_64x64x4[]; -extern const uint8_t bed_64x64x4[], bed_heated_64x64x4[]; -extern const uint8_t chamber_64x64x4[], chamber_heated_64x64x4[]; -extern const uint8_t fan0_64x64x4[], fan1_64x64x4[]; -extern const uint8_t fan_slow0_64x64x4[], fan_slow1_64x64x4[]; -extern const uint8_t fan_fast0_64x64x4[], fan_fast1_64x64x4[]; -extern const uint8_t sd_64x64x4[]; -extern const uint8_t home_64x64x4[]; -extern const uint8_t btn_rounded_64x52x4[]; -extern const uint8_t menu_64x64x4[]; -extern const uint8_t settings_64x64x4[]; -extern const uint8_t confirm_64x64x4[]; -extern const uint8_t cancel_64x64x4[]; -extern const uint8_t increase_64x64x4[]; -extern const uint8_t decrease_64x64x4[]; -extern const uint8_t pause_64x64x4[]; - -extern const uint8_t feedrate_32x32x4[]; -extern const uint8_t flowrate_32x32x4[]; -extern const uint8_t directory_32x32x4[]; -extern const uint8_t back_32x32x4[]; -extern const uint8_t up_32x32x4[]; -extern const uint8_t down_32x32x4[]; -extern const uint8_t left_32x32x4[]; -extern const uint8_t right_32x32x4[]; -extern const uint8_t refresh_32x32x4[]; -extern const uint8_t leveling_32x32x4[]; - -extern const uint8_t slider_8x16x4[]; - -enum MarlinImage : uint8_t { - imgBootScreen = 0x00, - imgHotEnd, - imgBed, - imgBedHeated, - imgChamber, - imgChamberHeated, - imgFanIdle, - imgFanSlow0, - imgFanSlow1, - imgFanFast0, - imgFanFast1, - imgFeedRate, - imgFlowRate, - imgSD, - imgMenu, - imgSettings, - imgDirectory, - imgConfirm, - imgCancel, - imgIncrease, - imgDecrease, - imgBack, - imgUp, - imgDown, - imgLeft, - imgRight, - imgRefresh, - imgLeveling, - imgSlider, - imgHome, - imgBtn52Rounded, - imgCount, - noImage = imgCount, - imgPageUp = imgLeft, - imgPageDown = imgRight -}; - -enum colorMode_t : uint8_t { - NOCOLORS = 0x00, - MONOCHROME = 0x01, // 1 bit per pixel - GREYSCALE1 = 0x01, // 1 bit per pixel - GREYSCALE2, // 2 bits per pixel - GREYSCALE4, // 4 bits per pixel - HIGHCOLOR // 16 bits per pixel -}; - -typedef colorMode_t ColorMode; - -typedef struct __attribute__((__packed__)) { - void *data; - uint16_t width; - uint16_t height; - colorMode_t colorMode; -} tImage; - -extern const tImage NoLogo; - -extern const tImage MarlinLogo112x38x1; -extern const tImage MarlinLogo228x255x2; -extern const tImage MarlinLogo228x255x4; -extern const tImage MarlinLogo195x59x16; -extern const tImage MarlinLogo320x240x16; -extern const tImage MarlinLogo480x320x16; -extern const tImage Background320x30x16; - -extern const tImage HotEnd_64x64x4; -extern const tImage Bed_64x64x4; -extern const tImage Bed_Heated_64x64x4; -extern const tImage Chamber_64x64x4; -extern const tImage Chamber_Heated_64x64x4; -extern const tImage Fan0_64x64x4; -extern const tImage Fan1_64x64x4; -extern const tImage Fan_Slow0_64x64x4; -extern const tImage Fan_Slow1_64x64x4; -extern const tImage Fan_Fast0_64x64x4; -extern const tImage Fan_Fast1_64x64x4; -extern const tImage SD_64x64x4; -extern const tImage Home_64x64x4; -extern const tImage BtnRounded_64x52x4; -extern const tImage Menu_64x64x4; -extern const tImage Settings_64x64x4; -extern const tImage Confirm_64x64x4; -extern const tImage Cancel_64x64x4; -extern const tImage Increase_64x64x4; -extern const tImage Decrease_64x64x4; -extern const tImage Pause_64x64x4; - -extern const tImage Feedrate_32x32x4; -extern const tImage Flowrate_32x32x4; -extern const tImage Directory_32x32x4; -extern const tImage Back_32x32x4; -extern const tImage Up_32x32x4; -extern const tImage Down_32x32x4; -extern const tImage Left_32x32x4; -extern const tImage Right_32x32x4; -extern const tImage Refresh_32x32x4; -extern const tImage Leveling_32x32x4; - -extern const tImage Slider8x16x4; - -extern const tImage Images[imgCount]; diff --git a/Marlin/src/lcd/tft/tft_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp deleted file mode 100644 index e77afaf716..0000000000 --- a/Marlin/src/lcd/tft/tft_queue.cpp +++ /dev/null @@ -1,346 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_GRAPHICAL_TFT - -#include "tft_queue.h" -#include "tft.h" -#include "tft_image.h" - -uint8_t TFT_Queue::queue[]; -uint8_t *TFT_Queue::end_of_queue = queue; -uint8_t *TFT_Queue::current_task = NULL; -uint8_t *TFT_Queue::last_task = NULL; - -void TFT_Queue::reset() { - tft.abort(); - - end_of_queue = queue; - current_task = NULL; - last_task = NULL; -} - -void TFT_Queue::async() { - if (current_task == NULL) return; - queueTask_t *task = (queueTask_t *)current_task; - - // Check IO busy status - if (tft.is_busy()) return; - - if (task->state == TASK_STATE_COMPLETED) { - task = (queueTask_t *)task->nextTask; - current_task = (uint8_t *)task; - } - - finish_sketch(); - - switch (task->type) { - case TASK_END_OF_QUEUE: reset(); break; - case TASK_FILL: fill(task); break; - case TASK_CANVAS: canvas(task); break; - } -} - -void TFT_Queue::finish_sketch() { - if (last_task == NULL) return; - queueTask_t *task = (queueTask_t *)last_task; - - if (task->state == TASK_STATE_SKETCH) { - *end_of_queue = TASK_END_OF_QUEUE; - task->nextTask = end_of_queue; - task->state = TASK_STATE_READY; - - if (current_task == NULL) current_task = (uint8_t *)task; - } -} - -void TFT_Queue::fill(queueTask_t *task) { - uint16_t count; - parametersFill_t *task_parameters = (parametersFill_t *)(((uint8_t *)task) + sizeof(queueTask_t)); - - if (task->state == TASK_STATE_READY) { - tft.set_window(task_parameters->x, task_parameters->y, task_parameters->x + task_parameters->width - 1, task_parameters->y + task_parameters->height - 1); - task->state = TASK_STATE_IN_PROGRESS; - } - - if (task_parameters->count > 65535) { - count = 65535; - task_parameters->count -= 65535; - } - else { - count = task_parameters->count; - task_parameters->count = 0; - task->state = TASK_STATE_COMPLETED; - } - - tft.write_multiple(task_parameters->color, count); -} - -void TFT_Queue::canvas(queueTask_t *task) { - parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)task) + sizeof(queueTask_t)); - - uint16_t i; - uint8_t *item = ((uint8_t *)task_parameters) + sizeof(parametersCanvas_t); - - if (task->state == TASK_STATE_READY) { - task->state = TASK_STATE_IN_PROGRESS; - Canvas.New(task_parameters->x, task_parameters->y, task_parameters->width, task_parameters->height); - } - Canvas.Continue(); - - for (i = 0; i < task_parameters->count; i++) { - switch (*item) { - case CANVAS_SET_BACKGROUND: - Canvas.SetBackground(((parametersCanvasBackground_t *)item)->color); - item += sizeof(parametersCanvasBackground_t); - break; - case CANVAS_ADD_TEXT: - Canvas.AddText(((parametersCanvasText_t *)item)->x, ((parametersCanvasText_t *)item)->y, ((parametersCanvasText_t *)item)->color, item + sizeof(parametersCanvasText_t), ((parametersCanvasText_t *)item)->maxWidth); - item += sizeof(parametersCanvasText_t) + ((parametersCanvasText_t *)item)->stringLength; - break; - - case CANVAS_ADD_IMAGE: - MarlinImage image; - uint16_t *colors; - colorMode_t color_mode; - - image = ((parametersCanvasImage_t *)item)->image; - colors = (uint16_t *)(item + sizeof(parametersCanvasImage_t)); - Canvas.AddImage(((parametersCanvasImage_t *)item)->x, ((parametersCanvasImage_t *)item)->y, image, colors); - - item = (uint8_t *)colors; - color_mode = Images[image].colorMode; - - switch (color_mode) { - case GREYSCALE1: - item += sizeof(uint16_t); - break; - case GREYSCALE2: - item += sizeof(uint16_t) * 3; - break; - case GREYSCALE4: - item += sizeof(uint16_t) * 15; - break; - default: - break; - } - break; - - case CANVAS_ADD_BAR: - Canvas.AddBar(((parametersCanvasBar_t *)item)->x, ((parametersCanvasBar_t *)item)->y, ((parametersCanvasBar_t *)item)->width, ((parametersCanvasBar_t *)item)->height, ((parametersCanvasBar_t *)item)->color); - item += sizeof(parametersCanvasBar_t); - break; - case CANVAS_ADD_RECTANGLE: - Canvas.AddRectangle(((parametersCanvasRectangle_t *)item)->x, ((parametersCanvasRectangle_t *)item)->y, ((parametersCanvasRectangle_t *)item)->width, ((parametersCanvasRectangle_t *)item)->height, ((parametersCanvasRectangle_t *)item)->color); - item += sizeof(parametersCanvasRectangle_t); - break; - } - } - - if (Canvas.ToScreen()) task->state = TASK_STATE_COMPLETED; -} - - -void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { - finish_sketch(); - - queueTask_t *task = (queueTask_t *)end_of_queue; - last_task = (uint8_t *)task; - - end_of_queue += sizeof(queueTask_t); - parametersFill_t *task_parameters = (parametersFill_t *)end_of_queue; - end_of_queue += sizeof(parametersFill_t); - - task_parameters->x = x; - task_parameters->y = y; - task_parameters->width = width; - task_parameters->height = height; - task_parameters->color = color; - task_parameters->count = width * height; - - *end_of_queue = TASK_END_OF_QUEUE; - task->nextTask = end_of_queue; - task->state = TASK_STATE_READY; - task->type = TASK_FILL; - - if (current_task == NULL) current_task = (uint8_t *)task; -} - -void TFT_Queue::canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { - finish_sketch(); - - queueTask_t *task = (queueTask_t *)end_of_queue; - last_task = (uint8_t *) task; - - task->state = TASK_STATE_SKETCH; - task->type = TASK_CANVAS; - task->nextTask = NULL; - - end_of_queue += sizeof(queueTask_t); - parametersCanvas_t *task_parameters = (parametersCanvas_t *)end_of_queue; - end_of_queue += sizeof(parametersCanvas_t); - - task_parameters->x = x; - task_parameters->y = y; - task_parameters->width = width; - task_parameters->height = height; - task_parameters->count = 0; - - if (current_task == NULL) current_task = (uint8_t *)task; -} - -void TFT_Queue::set_background(uint16_t color) { - parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); - parametersCanvasBackground_t *parameters = (parametersCanvasBackground_t *)end_of_queue; - - parameters->type = CANVAS_SET_BACKGROUND; - parameters->color = color; - - end_of_queue += sizeof(parametersCanvasBackground_t); - task_parameters->count++; -} - -void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth) { - parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); - parametersCanvasText_t *parameters = (parametersCanvasText_t *)end_of_queue; - - uint8_t *pointer = string; - - parameters->type = CANVAS_ADD_TEXT; - parameters->x = x; - parameters->y = y; - parameters->color = color; - parameters->stringLength = 0; - parameters->maxWidth = maxWidth; - - end_of_queue += sizeof(parametersCanvasText_t); - - /* TODO: Deal with maxWidth */ - while ((*(end_of_queue++) = *pointer++) != 0x00); - - parameters->stringLength = pointer - string; - task_parameters->count++; -} - -void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { - parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); - parametersCanvasImage_t *parameters = (parametersCanvasImage_t *)end_of_queue; - - parameters->type = CANVAS_ADD_IMAGE; - parameters->x = x; - parameters->y = y; - parameters->image = image; - - end_of_queue += sizeof(parametersCanvasImage_t); - task_parameters->count++; - - colorMode_t color_mode = Images[image].colorMode; - - if (color_mode == HIGHCOLOR) return; - - uint16_t *color = (uint16_t *)end_of_queue; - uint8_t number_of_color = 0; - - switch (color_mode) { - case GREYSCALE1: number_of_color = 1; break; - case GREYSCALE2: number_of_color = 3; break; - case GREYSCALE4: number_of_color = 15; break; - default: - break; - } - - while (number_of_color--) { - *color++ = *colors++; - } - - end_of_queue = (uint8_t *)color; -} - -uint16_t gradient(uint16_t colorA, uint16_t colorB, uint16_t factor) { - uint16_t red, green, blue; - - red = ( RED(colorA) * factor + RED(colorB) * (256 - factor)) >> 8; - green = (GREEN(colorA) * factor + GREEN(colorB) * (256 - factor)) >> 8; - blue = ( BLUE(colorA) * factor + BLUE(colorB) * (256 - factor)) >> 8; - - return RGB(red, green, blue); -} - -void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main, uint16_t color_background, uint16_t color_shadow) { - uint16_t colors[16]; - colorMode_t color_mode = Images[image].colorMode; - uint16_t i; - - switch (color_mode) { - case GREYSCALE1: - colors[1] = color_main; - break; - case GREYSCALE2: - for (i = 1; i < 4; i++) - colors[i] = gradient(color_main, color_background, (i << 8) / 3); - break; - case GREYSCALE4: - for (i = 1; i < 8; i++) - colors[i] = gradient(color_background, color_shadow, i << 5); - for (i = 8; i < 16; i++) - colors[i] = gradient(color_main, color_background, ((i - 8) << 8) / 7); - break; - default: - break; - } - - add_image(x, y, image, colors + 1); -} - -void TFT_Queue::add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { - parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); - parametersCanvasBar_t *parameters = (parametersCanvasBar_t *)end_of_queue; - - parameters->type = CANVAS_ADD_BAR; - parameters->x = x; - parameters->y = y; - parameters->width = width; - parameters->height = height; - parameters->color = color; - - end_of_queue += sizeof(parametersCanvasBar_t); - task_parameters->count++; -} - -void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { - parametersCanvas_t *task_parameters = (parametersCanvas_t *)(((uint8_t *)last_task) + sizeof(queueTask_t)); - parametersCanvasRectangle_t *parameters = (parametersCanvasRectangle_t *)end_of_queue; - - parameters->type = CANVAS_ADD_RECTANGLE; - parameters->x = x; - parameters->y = y; - parameters->width = width; - parameters->height = height; - parameters->color = color; - - end_of_queue += sizeof(parametersCanvasRectangle_t); - task_parameters->count++; -} - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_queue.h b/Marlin/src/lcd/tft/tft_queue.h deleted file mode 100644 index 9aa0d5b6c9..0000000000 --- a/Marlin/src/lcd/tft/tft_queue.h +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfig.h" -#include "tft_string.h" -#include "tft_image.h" - -#define QUEUE_SIZE 8192 - -enum QueueTaskType : uint8_t { - TASK_END_OF_QUEUE = 0x00, - TASK_FILL, - TASK_CANVAS, -}; - -enum QueueTaskState : uint8_t { - TASK_STATE_READY = 0x00, - TASK_STATE_IN_PROGRESS, - TASK_STATE_COMPLETED, - TASK_STATE_SKETCH = 0xFF, -}; - -enum CanvasSubtype : uint8_t { - CANVAS_SET_BACKGROUND = 0x00, - CANVAS_ADD_TEXT, - CANVAS_ADD_IMAGE, - CANVAS_ADD_BAR, - CANVAS_ADD_RECTANGLE, -}; - -typedef struct __attribute__((__packed__)) { - QueueTaskType type; - QueueTaskState state; - uint8_t *nextTask; -} queueTask_t; - -typedef struct __attribute__((__packed__)) { - uint16_t x; - uint16_t y; - uint16_t width; - uint16_t height; - uint16_t color; - uint32_t count; -} parametersFill_t; - -typedef struct __attribute__((__packed__)) { - uint16_t x; - uint16_t y; - uint16_t width; - uint16_t height; - uint32_t count; -} parametersCanvas_t; - -typedef struct __attribute__((__packed__)) { - CanvasSubtype type; - uint16_t color; -} parametersCanvasBackground_t; - -typedef struct __attribute__((__packed__)) { - CanvasSubtype type; - uint16_t x; - uint16_t y; - uint16_t color; - uint32_t count; - uint16_t maxWidth; - uint16_t stringLength; -} parametersCanvasText_t; - -typedef struct __attribute__((__packed__)) { - CanvasSubtype type; - int16_t x; - int16_t y; - MarlinImage image; -} parametersCanvasImage_t; - -typedef struct __attribute__((__packed__)) { - CanvasSubtype type; - uint16_t x; - uint16_t y; - uint16_t width; - uint16_t height; - uint16_t color; -} parametersCanvasBar_t; - -typedef struct __attribute__((__packed__)) { - CanvasSubtype type; - uint16_t x; - uint16_t y; - uint16_t width; - uint16_t height; - uint16_t color; -} parametersCanvasRectangle_t; - -class TFT_Queue { - private: - static uint8_t queue[QUEUE_SIZE]; - static uint8_t *end_of_queue; - static uint8_t *current_task; - static uint8_t *last_task; - - static void finish_sketch(); - static void fill(queueTask_t *task); - static void canvas(queueTask_t *task); - - public: - static void reset(); - static void async(); - static void sync() { while (current_task != NULL) async(); } - - static void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); - static void canvas(uint16_t x, uint16_t y, uint16_t width, uint16_t height); - static void set_background(uint16_t color); - static void add_text(uint16_t x, uint16_t y, uint16_t color, uint8_t *string, uint16_t maxWidth); - - static void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *colors); - static void add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main, uint16_t color_background, uint16_t color_shadow); - - static void add_bar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); - static void add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); -}; diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp deleted file mode 100644 index 663ed97c36..0000000000 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_GRAPHICAL_TFT - -#include "tft_string.h" -#include "../fontutils.h" - -//#define DEBUG_TFT_FONT -#define DEBUG_OUT ENABLED(DEBUG_TFT_FONT) -#include "../../core/debug_out.h" - -glyph_t *TFT_String::glyphs[256]; -font_t *TFT_String::font_header; - -uint8_t TFT_String::data[]; -uint16_t TFT_String::span; -uint16_t TFT_String::length; - -void TFT_String::set_font(const uint8_t *font) { - font_header = (font_t *)font; - uint32_t glyph; - - for (glyph = 0; glyph < 256; glyph++) glyphs[glyph] = NULL; - - DEBUG_ECHOLNPAIR("Format: ", font_header->Format); - DEBUG_ECHOLNPAIR("BBXWidth: ", font_header->BBXWidth); - DEBUG_ECHOLNPAIR("BBXHeight: ", font_header->BBXHeight); - DEBUG_ECHOLNPAIR("BBXOffsetX: ", font_header->BBXOffsetX); - DEBUG_ECHOLNPAIR("BBXOffsetY: ", font_header->BBXOffsetY); - DEBUG_ECHOLNPAIR("CapitalAHeight: ", font_header->CapitalAHeight); - DEBUG_ECHOLNPAIR("Encoding65Pos: ", font_header->Encoding65Pos); - DEBUG_ECHOLNPAIR("Encoding97Pos: ", font_header->Encoding97Pos); - DEBUG_ECHOLNPAIR("FontStartEncoding: ", font_header->FontStartEncoding); - DEBUG_ECHOLNPAIR("FontEndEncoding: ", font_header->FontEndEncoding); - DEBUG_ECHOLNPAIR("LowerGDescent: ", font_header->LowerGDescent); - DEBUG_ECHOLNPAIR("FontAscent: ", font_header->FontAscent); - DEBUG_ECHOLNPAIR("FontDescent: ", font_header->FontDescent); - DEBUG_ECHOLNPAIR("FontXAscent: ", font_header->FontXAscent); - DEBUG_ECHOLNPAIR("FontXDescent: ", font_header->FontXDescent); - - add_glyphs(font); -} - -void TFT_String::add_glyphs(const uint8_t *font) { - uint32_t glyph; - uint8_t *pointer = (uint8_t *)font + sizeof(font_t); - - for (glyph = ((font_t *)font)->FontStartEncoding; glyph <= ((font_t *)font)->FontEndEncoding; glyph++) { - if (*pointer != NO_GLYPH) { - glyphs[glyph] = (glyph_t *)pointer; - pointer += sizeof(glyph_t) + ((glyph_t *)pointer)->DataSize; - } - else { - pointer++; - } - } -} - -void TFT_String::set() { - *data = 0x00; - span = 0; - length = 0; -} - -uint8_t read_byte(uint8_t *byte) { return *byte; } - -void TFT_String::add(uint8_t *string, int8_t index, uint8_t *itemString) { - wchar_t wchar; - - while (*string) { - string = get_utf8_value_cb(string, read_byte, &wchar); - if (wchar > 255) wchar |= 0x0080; - uint8_t ch = uint8_t(wchar & 0x00FF); - - if (ch == '=' || ch == '~' || ch == '*') { - if (index >= 0) { - int8_t inum = index + ((ch == '=') ? 0 : LCD_FIRST_TOOL); - if (ch == '*') add_character('E'); - if (inum >= 10) { add_character('0' + (inum / 10)); inum %= 10; } - add_character('0' + inum); - } - else { - add(index == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED)); - } - continue; - } - else if (ch == '$' && itemString) { - add(itemString); - continue; - } - - add_character(ch); - } - eol(); -} - -void TFT_String::add(uint8_t *string) { - wchar_t wchar; - while (*string) { - string = get_utf8_value_cb(string, read_byte, &wchar); - if (wchar > 255) wchar |= 0x0080; - uint8_t ch = uint8_t(wchar & 0x00FF); - add_character(ch); - } - eol(); -} - -void TFT_String::add_character(uint8_t character) { - if (length < MAX_STRING_LENGTH) { - data[length] = character; - length++; - span += glyph(character)->DWidth; - } -} - -void TFT_String::rtrim(uint8_t character) { - while (length) { - if (data[length - 1] == 0x20 || data[length - 1] == character) { - length--; - span -= glyph(data[length])->DWidth; - eol(); - } - else { - break; - } - } -} - -void TFT_String::ltrim(uint8_t character) { - uint16_t i, j; - for (i = 0; (i < length) && (data[i] == 0x20 || data[i] == character); i++) { - span -= glyph(data[i])->DWidth; - } - if (i == 0) return; - for (j = 0; i < length; data[j++] = data[i++]); - length = j; - eol(); -} - -void TFT_String::trim(uint8_t character) { - rtrim(character); - ltrim(character); -} - -TFT_String tft_string; - -#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h deleted file mode 100644 index 924d6de430..0000000000 --- a/Marlin/src/lcd/tft/tft_string.h +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -extern const uint8_t ISO10646_1_5x7[]; -extern const uint8_t font10x20[]; - -extern const uint8_t Helvetica12Bold[]; - -extern const uint8_t Helvetica14[], Helvetica14_symbols[]; -extern const uint8_t Helvetica18[], Helvetica18_symbols[]; - -#define NO_GLYPH 0xFF - -typedef struct __attribute__((__packed__)) { - uint8_t Format; - uint8_t BBXWidth; - uint8_t BBXHeight; - int8_t BBXOffsetX; - int8_t BBXOffsetY; - uint8_t CapitalAHeight; - uint16_t Encoding65Pos; - uint16_t Encoding97Pos; - uint8_t FontStartEncoding; - uint8_t FontEndEncoding; - int8_t LowerGDescent; - int8_t FontAscent; - int8_t FontDescent; - int8_t FontXAscent; - int8_t FontXDescent; -} font_t; - -typedef struct __attribute__((__packed__)) { - uint8_t BBXWidth; - uint8_t BBXHeight; - uint8_t DataSize; - int8_t DWidth; - int8_t BBXOffsetX; - int8_t BBXOffsetY; -} glyph_t; - -#define MAX_STRING_LENGTH 64 - -class TFT_String { - private: - static glyph_t *glyphs[256]; - static font_t *font_header; - - static uint8_t data[MAX_STRING_LENGTH + 1]; - static uint16_t span; // in pixels - static uint16_t length; // in characters - - static void add_character(uint8_t character); - static void eol() { data[length] = 0x00; } - - public: - static void set_font(const uint8_t *font); - static void add_glyphs(const uint8_t *font); - - static font_t *font() { return font_header; }; - static uint16_t font_height() { return font_header->FontAscent - font_header->FontDescent; } - static glyph_t *glyph(uint8_t character) { return glyphs[character] == NULL ? glyphs[0x3F] : glyphs[character]; } /* Use '?' for unknown glyphs */ - static inline glyph_t *glyph(uint8_t *character) { return glyph(*character); } - - static void set(); - static void add(uint8_t character) { add_character(character); eol(); } - static void add(uint8_t *string); - static void add(uint8_t *string, int8_t index, uint8_t *itemString = NULL); - static void set(uint8_t *string) { set(); add(string); }; - static void set(uint8_t *string, int8_t index, const char *itemString = NULL) { set(); add(string, index, (uint8_t *)itemString); }; - static inline void set(const char *string) { set((uint8_t *)string); } - static inline void set(const char *string, int8_t index, const char *itemString = NULL) { set((uint8_t *)string, index, itemString); } - static inline void add(const char *string) { add((uint8_t *)string); } - - static void trim(uint8_t character = 0x20); - static void rtrim(uint8_t character = 0x20); - static void ltrim(uint8_t character = 0x20); - static uint16_t width() { return span; } - static uint8_t *string() { return data; } - static uint16_t center(uint16_t width) { return span > width ? 0 : (width - span) / 2; } -}; - -extern TFT_String tft_string; diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp deleted file mode 100644 index 80c65f074a..0000000000 --- a/Marlin/src/lcd/tft/touch.cpp +++ /dev/null @@ -1,316 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if ENABLED(TOUCH_SCREEN) - -#include "touch.h" - -#include "../ultralcd.h" // for ui methods -#include "../menu/menu_item.h" // for touch_screen_calibration - -#include "../../module/temperature.h" -#include "../../module/planner.h" - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#include "tft.h" - -bool Touch::enabled = true; -int16_t Touch::x, Touch::y; -touch_control_t Touch::controls[]; -touch_control_t *Touch::current_control; -uint16_t Touch::controls_count; -millis_t Touch::now = 0; -millis_t Touch::time_to_hold; -millis_t Touch::repeat_delay; -millis_t Touch::touch_time; -TouchControlType Touch::touch_control_type = NONE; -touch_calibration_t Touch::calibration; -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - calibrationState Touch::calibration_state = CALIBRATION_NONE; - touch_calibration_point_t Touch::calibration_points[4]; -#endif -#if HAS_RESUME_CONTINUE - extern bool wait_for_user; -#endif - -void Touch::init() { - calibration_reset(); - reset(); - io.Init(); - enable(); -} - -void Touch::add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data) { - if (controls_count == MAX_CONTROLS) return; - - controls[controls_count].type = type; - controls[controls_count].x = x; - controls[controls_count].y = y; - controls[controls_count].width = width; - controls[controls_count].height = height; - controls[controls_count].data = data; - controls_count++; -} - -void Touch::idle() { - uint16_t i; - int16_t _x, _y; - - if (!enabled) return; - - if (now == millis()) return; - now = millis(); - - if (get_point(&_x, &_y)) { - #if HAS_RESUME_CONTINUE - // UI is waiting for a click anywhere? - if (wait_for_user) { - touch_control_type = CLICK; - ui.lcd_clicked = true; - return; - } - #endif - - #if LCD_TIMEOUT_TO_STATUS - ui.return_to_status_ms = now + LCD_TIMEOUT_TO_STATUS; - #endif - - if (touch_time) { - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - if (touch_control_type == NONE && ELAPSED(now, touch_time + TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) - ui.goto_screen(touch_screen_calibration); - #endif - return; - } - - if (time_to_hold == 0) time_to_hold = now + MINIMUM_HOLD_TIME; - if (PENDING(now, time_to_hold)) return; - - if (x != 0 && y != 0) { - if (current_control) { - if (WITHIN(x, current_control->x - FREE_MOVE_RANGE, current_control->x + current_control->width + FREE_MOVE_RANGE) && WITHIN(y, current_control->y - FREE_MOVE_RANGE, current_control->y + current_control->height + FREE_MOVE_RANGE)) { - NOLESS(x, current_control->x); - NOMORE(x, current_control->x + current_control->width); - NOLESS(y, current_control->y); - NOMORE(y, current_control->y + current_control->height); - touch(current_control); - } - else { - current_control = NULL; - } - } - else { - for (i = 0; i < controls_count; i++) { - if ((WITHIN(x, controls[i].x, controls[i].x + controls[i].width) && WITHIN(y, controls[i].y, controls[i].y + controls[i].height)) || (TERN(TOUCH_SCREEN_CALIBRATION, controls[i].type == CALIBRATE, false))) { - touch_control_type = controls[i].type; - touch(&controls[i]); - break; - } - } - } - - if (current_control == NULL) - touch_time = now; - } - x = _x; - y = _y; - } - else { - x = y = 0; - current_control = NULL; - touch_time = 0; - touch_control_type = NONE; - time_to_hold = 0; - repeat_delay = TOUCH_REPEAT_DELAY; - } -} - -void Touch::touch(touch_control_t *control) { - switch (control->type) { - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - case CALIBRATE: - ui.refresh(); - - if (calibration_state < CALIBRATION_SUCCESS) { - calibration_points[calibration_state].x = int16_t(control->data >> 16); - calibration_points[calibration_state].y = int16_t(control->data & 0xFFFF); - calibration_points[calibration_state].raw_x = x; - calibration_points[calibration_state].raw_y = y; - } - - switch (calibration_state) { - case CALIBRATION_POINT_1: calibration_state = CALIBRATION_POINT_2; break; - case CALIBRATION_POINT_2: calibration_state = CALIBRATION_POINT_3; break; - case CALIBRATION_POINT_3: calibration_state = CALIBRATION_POINT_4; break; - case CALIBRATION_POINT_4: - if (validate_precision_x(0, 1) && validate_precision_x(2, 3) && validate_precision_y(0, 2) && validate_precision_y(1, 3)) { - calibration_state = CALIBRATION_SUCCESS; - calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_x + calibration_points[2].raw_x - calibration_points[1].raw_x - calibration_points[0].raw_x); - calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_y - calibration_points[2].raw_y + calibration_points[1].raw_y - calibration_points[0].raw_y); - calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_x + calibration_points[1].raw_x) * calibration.x) >> 17); - calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_y + calibration_points[2].raw_y) * calibration.y) >> 17); - calibration.orientation = TOUCH_LANDSCAPE; - } - else if (validate_precision_y(0, 1) && validate_precision_y(2, 3) && validate_precision_x(0, 2) && validate_precision_x(1, 3)) { - calibration_state = CALIBRATION_SUCCESS; - calibration.x = ((calibration_points[2].x - calibration_points[0].x) << 17) / (calibration_points[3].raw_y + calibration_points[2].raw_y - calibration_points[1].raw_y - calibration_points[0].raw_y); - calibration.y = ((calibration_points[1].y - calibration_points[0].y) << 17) / (calibration_points[3].raw_x - calibration_points[2].raw_x + calibration_points[1].raw_x - calibration_points[0].raw_x); - calibration.offset_x = calibration_points[0].x - int16_t(((calibration_points[0].raw_y + calibration_points[1].raw_y) * calibration.x) >> 17); - calibration.offset_y = calibration_points[0].y - int16_t(((calibration_points[0].raw_x + calibration_points[2].raw_x) * calibration.y) >> 17); - calibration.orientation = TOUCH_PORTRAIT; - } - else { - calibration_state = CALIBRATION_FAIL; - calibration_reset(); - } - - if (calibration_state == CALIBRATION_SUCCESS) { - SERIAL_ECHOLN("Touch screen calibration completed"); - SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_X ", calibration.x); - SERIAL_ECHOLNPAIR("TOUCH_CALIBRATION_Y ", calibration.y); - SERIAL_ECHOLNPAIR("TOUCH_OFFSET_X ", calibration.offset_x); - SERIAL_ECHOLNPAIR("TOUCH_OFFSET_Y ", calibration.offset_y); - SERIAL_ECHO("TOUCH_ORIENTATION "); if (calibration.orientation == TOUCH_LANDSCAPE) SERIAL_ECHOLN("TOUCH_LANDSCAPE"); else SERIAL_ECHOLN("TOUCH_PORTRAIT"); - } - break; - default: break; - } - break; - #endif // TOUCH_SCREEN_CALIBRATION - - case MENU_SCREEN: ui.goto_screen((screenFunc_t)control->data); break; - case BACK: ui.goto_previous_screen(); break; - case CLICK: ui.lcd_clicked = true; break; - #if HAS_RESUME_CONTINUE - case RESUME_CONTINUE: extern bool wait_for_user; wait_for_user = false; break; - #endif - case CANCEL: ui.encoderPosition = 0; ui.selection = false; ui.lcd_clicked = true; break; - case CONFIRM: ui.encoderPosition = 1; ui.selection = true; ui.lcd_clicked = true; break; - case MENU_ITEM: ui.encoderPosition = control->data; ui.refresh(); break; - case PAGE_UP: - encoderTopLine = encoderTopLine > LCD_HEIGHT ? encoderTopLine - LCD_HEIGHT : 0; - ui.encoderPosition = ui.encoderPosition > LCD_HEIGHT ? ui.encoderPosition - LCD_HEIGHT : 0; - ui.refresh(); - break; - case PAGE_DOWN: - encoderTopLine = encoderTopLine + 2 * LCD_HEIGHT < screen_items ? encoderTopLine + LCD_HEIGHT : screen_items - LCD_HEIGHT; - ui.encoderPosition = ui.encoderPosition + LCD_HEIGHT < (uint32_t)screen_items ? ui.encoderPosition + LCD_HEIGHT : screen_items; - ui.refresh(); - break; - case SLIDER: hold(control); ui.encoderPosition = (x - control->x) * control->data / control->width; break; - case INCREASE: hold(control, repeat_delay - 5); TERN(AUTO_BED_LEVELING_UBL, ui.external_control ? ubl.encoder_diff++ : ui.encoderPosition++, ui.encoderPosition++); break; - case DECREASE: hold(control, repeat_delay - 5); TERN(AUTO_BED_LEVELING_UBL, ui.external_control ? ubl.encoder_diff-- : ui.encoderPosition--, ui.encoderPosition--); break; - case HEATER: - int8_t heater; - heater = control->data; - ui.clear_lcd(); - if (heater >= 0) { // HotEnd - #if HOTENDS == 1 - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.heater_maxtemp[0] - 15, []{ thermalManager.start_watching_hotend(0); }); - #else - MenuItemBase::itemIndex = heater; - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.heater_maxtemp[heater] - 15, []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); - #endif - } - #if HAS_HEATED_BED - else if (heater == H_BED) { - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAXTEMP - 10, thermalManager.start_watching_bed); - } - #endif - #if HAS_HEATED_CHAMBER - else if (heater == H_CHAMBER) { - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); - } - #endif - break; - case FAN: - ui.clear_lcd(); - static uint8_t fan, fan_speed; - fan = 0; - fan_speed = thermalManager.fan_speed[fan]; - MenuItem_percent::action((const char *)GET_TEXT_F(MSG_FIRST_FAN_SPEED), &fan_speed, 0, 255, []{ thermalManager.set_fan_speed(fan, fan_speed); }); - break; - case FEEDRATE: - ui.clear_lcd(); - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_SPEED), &feedrate_percentage, 10, 999); - break; - case FLOWRATE: - ui.clear_lcd(); - MenuItemBase::itemIndex = control->data; - #if EXTRUDERS == 1 - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_FLOW), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); - #else - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_FLOW_N), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); - #endif - break; - - #if ENABLED(AUTO_BED_LEVELING_UBL) - case UBL: hold(control, UBL_REPEAT_DELAY); ui.encoderPosition += control->data; break; - #endif - - case MOVE_AXIS: - ui.goto_screen((screenFunc_t)ui.move_axis_screen); - break; - - // TODO: TOUCH could receive data to pass to the callback - case BUTTON: ((screenFunc_t)control->data)(); break; - - default: break; - } -} - -void Touch::hold(touch_control_t *control, millis_t delay) { - current_control = control; - if (delay) { - repeat_delay = delay > MIN_REPEAT_DELAY ? delay : MIN_REPEAT_DELAY; - time_to_hold = now + repeat_delay; - } - ui.refresh(); -} - -bool Touch::get_point(int16_t *x, int16_t *y) { - bool is_touched = (calibration.orientation == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); - - if (is_touched && calibration.orientation != TOUCH_ORIENTATION_NONE) { - *x = int16_t((int32_t(*x) * calibration.x) >> 16) + calibration.offset_x; - *y = int16_t((int32_t(*y) * calibration.y) >> 16) + calibration.offset_y; - } - return is_touched; -} -Touch touch; - -bool MarlinUI::touch_pressed() { - return touch.is_clicked(); -} - -void add_control(uint16_t x, uint16_t y, TouchControlType control_type, int32_t data, MarlinImage image, bool is_enabled, uint16_t color_enabled, uint16_t color_disabled) { - uint16_t width = Images[image].width; - uint16_t height = Images[image].height; - tft.canvas(x, y, width, height); - tft.add_image(0, 0, image, is_enabled ? color_enabled : color_disabled); - if (is_enabled) - touch.add_control(control_type, x, y, width, height, data); -} - -#endif // TOUCH_SCREEN diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h deleted file mode 100644 index 7d8f222918..0000000000 --- a/Marlin/src/lcd/tft/touch.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(TOUCH_SCREEN) - -#include "tft_color.h" -#include "tft_image.h" - -#include HAL_PATH(../../HAL, tft/xpt2046.h) -#define TOUCH_DRIVER XPT2046 - -#ifndef TOUCH_SCREEN_CALIBRATION_PRECISION - #define TOUCH_SCREEN_CALIBRATION_PRECISION 80 -#endif - -#ifndef TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS - #define TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS 2500 -#endif - -#define TOUCH_ORIENTATION_NONE 0 -#define TOUCH_LANDSCAPE 1 -#define TOUCH_PORTRAIT 2 - -#if !(defined(TOUCH_CALIBRATION_X) || defined(TOUCH_CALIBRATION_Y) || defined(TOUCH_OFFSET_X) || defined(TOUCH_OFFSET_Y) || defined(TOUCH_ORIENTATION)) - #if defined(XPT2046_X_CALIBRATION) && defined(XPT2046_Y_CALIBRATION) && defined(XPT2046_X_OFFSET) && defined(XPT2046_Y_OFFSET) - #define TOUCH_CALIBRATION_X XPT2046_X_CALIBRATION - #define TOUCH_CALIBRATION_Y XPT2046_Y_CALIBRATION - #define TOUCH_OFFSET_X XPT2046_X_OFFSET - #define TOUCH_OFFSET_Y XPT2046_Y_OFFSET - #define TOUCH_ORIENTATION TOUCH_LANDSCAPE - #else - #define TOUCH_CALIBRATION_X 0 - #define TOUCH_CALIBRATION_Y 0 - #define TOUCH_OFFSET_X 0 - #define TOUCH_OFFSET_Y 0 - #define TOUCH_ORIENTATION TOUCH_ORIENTATION_NONE - #endif -#endif - -// Menu Navigation -extern int8_t encoderTopLine, encoderLine, screen_items; - -enum TouchControlType : uint16_t { - NONE = 0x0000, - CALIBRATE, - MENU_SCREEN, - MENU_ITEM, - BACK, - PAGE_UP, - PAGE_DOWN, - CLICK, - RESUME_CONTINUE, - SLIDER, - INCREASE, - DECREASE, - CANCEL, - CONFIRM, - HEATER, - FAN, - FEEDRATE, - FLOWRATE, - UBL, - MOVE_AXIS, - BUTTON, -}; - -typedef void (*screenFunc_t)(); - -void add_control(uint16_t x, uint16_t y, TouchControlType control_type, int32_t data, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED); -inline void add_control(uint16_t x, uint16_t y, TouchControlType control_type, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED) { add_control(x, y, control_type, 0, image, is_enabled, color_enabled, color_disabled); } -inline void add_control(uint16_t x, uint16_t y, screenFunc_t screen, MarlinImage image, bool is_enabled = true, uint16_t color_enabled = COLOR_CONTROL_ENABLED, uint16_t color_disabled = COLOR_CONTROL_DISABLED) { add_control(x, y, MENU_SCREEN, (int32_t)screen, image, is_enabled, color_enabled, color_disabled); } - -typedef struct __attribute__((__packed__)) { - TouchControlType type; - uint16_t x; - uint16_t y; - uint16_t width; - uint16_t height; - int32_t data; -} touch_control_t; - -typedef struct __attribute__((__packed__)) { - int32_t x; - int32_t y; - int16_t offset_x; - int16_t offset_y; - uint8_t orientation; -} touch_calibration_t; - -typedef struct __attribute__((__packed__)) { - uint16_t x; - uint16_t y; - int16_t raw_x; - int16_t raw_y; -} touch_calibration_point_t; - -enum calibrationState : uint8_t { - CALIBRATION_POINT_1 = 0x00, - CALIBRATION_POINT_2, - CALIBRATION_POINT_3, - CALIBRATION_POINT_4, - CALIBRATION_SUCCESS, - CALIBRATION_FAIL, - CALIBRATION_NONE, -}; - -#define MAX_CONTROLS 16 -#define MINIMUM_HOLD_TIME 15 -#define TOUCH_REPEAT_DELAY 75 -#define MIN_REPEAT_DELAY 25 -#define UBL_REPEAT_DELAY 125 -#define FREE_MOVE_RANGE 32 - -class Touch { - private: - static TOUCH_DRIVER io; - static int16_t x, y; - static bool enabled; - - static touch_control_t controls[MAX_CONTROLS]; - static touch_control_t *current_control; - static uint16_t controls_count; - - static millis_t now; - static millis_t time_to_hold; - static millis_t repeat_delay; - static millis_t touch_time; - static TouchControlType touch_control_type; - - static inline bool get_point(int16_t *x, int16_t *y); - static void touch(touch_control_t *control); - static void hold(touch_control_t *control, millis_t delay = 0); - - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - static calibrationState calibration_state; - static touch_calibration_point_t calibration_points[4]; - - static bool validate_precision(int32_t a, int32_t b) { return (a > b ? (100 * b) / a : (100 * a) / b) > TOUCH_SCREEN_CALIBRATION_PRECISION; } - static bool validate_precision_x(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_x, calibration_points[b].raw_x); } - static bool validate_precision_y(uint8_t a, uint8_t b) { return validate_precision(calibration_points[a].raw_y, calibration_points[b].raw_y); } - #endif // TOUCH_SCREEN_CALIBRATION - - public: - static void init(); - static void reset() { controls_count = 0; touch_time = -1; current_control = NULL; } - static void clear() { controls_count = 0; } - static void idle(); - static bool is_clicked() { return touch_control_type == CLICK; } - static void disable() { enabled = false; } - static void enable() { enabled = true; } - - static void add_control(TouchControlType type, uint16_t x, uint16_t y, uint16_t width, uint16_t height, int32_t data = 0); - - static touch_calibration_t calibration; - static void calibration_reset() { calibration = {TOUCH_CALIBRATION_X, TOUCH_CALIBRATION_Y, TOUCH_OFFSET_X, TOUCH_OFFSET_Y, TOUCH_ORIENTATION}; } - - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - static calibrationState calibration_start() { calibration = {0, 0, 0, 0, TOUCH_ORIENTATION_NONE}; return calibration_state = CALIBRATION_POINT_1; } - static void calibration_end() { calibration_state = CALIBRATION_NONE; } - static calibrationState get_calibration_state() { return calibration_state; } - #endif // TOUCH_SCREEN_CALIBRATION -}; - -extern Touch touch; - -#endif // TOUCH_SCREEN diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp deleted file mode 100644 index de8498c5ff..0000000000 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ /dev/null @@ -1,656 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_UI_320x240 - -#include "ui_320x240.h" - -#include "../ultralcd.h" -#include "../menu/menu.h" -#include "../../libs/numtostr.h" - -#include "../../sd/cardreader.h" -#include "../../module/temperature.h" -#include "../../module/printcounter.h" -#include "../../module/planner.h" -#include "../../module/motion.h" - -#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - #include "../../feature/filwidth.h" - #include "../../gcode/parser.h" -#endif - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#if !HAS_LCD_MENU - #error "Seriously? High resolution TFT screen without menu?" -#endif - -static bool draw_menu_navigation = false; - -void MarlinUI::tft_idle() { - #if ENABLED(TOUCH_SCREEN) - if (draw_menu_navigation) { - add_control(48, 206, PAGE_UP, imgPageUp, encoderTopLine > 0); - add_control(240, 206, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); - add_control(144, 206, BACK, imgBack); - draw_menu_navigation = false; - } - #endif - - tft.queue.async(); - TERN_(TOUCH_SCREEN, touch.idle()); -} - -void MarlinUI::init_lcd() { - tft.init(); - tft.set_font(MENU_FONT_NAME); - #ifdef SYMBOLS_FONT_NAME - tft.add_glyphs(SYMBOLS_FONT_NAME); - #endif - TERN_(TOUCH_SCREEN, touch.init()); - clear_lcd(); -} - -bool MarlinUI::detected() { return true; } - -void MarlinUI::clear_lcd() { - #if ENABLED(TOUCH_SCREEN) - touch.reset(); - draw_menu_navigation = false; - #endif - - tft.queue.reset(); - tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BACKGROUND); -} - -#if ENABLED(SHOW_BOOTSCREEN) - #ifndef BOOTSCREEN_TIMEOUT - #define BOOTSCREEN_TIMEOUT 1500 - #endif - - void MarlinUI::show_bootscreen() { - tft.queue.reset(); - - tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); - tft.add_image(0, 0, imgBootScreen); // MarlinLogo320x240x16 - - #ifdef WEBSITE_URL - tft.add_text(4, 188, COLOR_WEBSITE_URL, WEBSITE_URL); - #endif - - tft.queue.sync(); - safe_delay(BOOTSCREEN_TIMEOUT); - clear_lcd(); - } -#endif // SHOW_BOOTSCREEN - -void MarlinUI::draw_kill_screen() { - tft.queue.reset(); - tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_KILL_SCREEN_BG); - - tft.canvas(0, 60, TFT_WIDTH, 20); - tft.set_background(COLOR_KILL_SCREEN_BG); - tft_string.set(status_message); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_KILL_SCREEN_TEXT, tft_string); - - tft.canvas(0, 120, TFT_WIDTH, 20); - tft.set_background(COLOR_KILL_SCREEN_BG); - tft_string.set(GET_TEXT(MSG_HALTED)); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_KILL_SCREEN_TEXT, tft_string); - - tft.canvas(0, 160, TFT_WIDTH, 20); - tft.set_background(COLOR_KILL_SCREEN_BG); - tft_string.set(GET_TEXT(MSG_PLEASE_RESET)); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_KILL_SCREEN_TEXT, tft_string); - - tft.queue.sync(); -} - -void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { - MarlinImage image = imgHotEnd; - uint16_t Color; - float currentTemperature, targetTemperature; - - if (Heater >= 0) { // HotEnd - currentTemperature = thermalManager.degHotend(Heater); - targetTemperature = thermalManager.degTargetHotend(Heater); - } -#if HAS_HEATED_BED - else if (Heater == H_BED) { - currentTemperature = thermalManager.degBed(); - targetTemperature = thermalManager.degTargetBed(); - } -#endif // HAS_HEATED_BED -#if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - currentTemperature = thermalManager.degChamber(); - #if HAS_HEATED_CHAMBER - targetTemperature = thermalManager.degTargetChamber(); - #else - targetTemperature = ABSOLUTE_ZERO; - #endif - } -#endif // HAS_TEMP_CHAMBER - else return; - - TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 64, 100, Heater)); - tft.canvas(x, y, 64, 100); - tft.set_background(COLOR_BACKGROUND); - - Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; - - if (Heater >= 0) { // HotEnd - if (currentTemperature >= 50) Color = COLOR_HOTEND; - } - #if HAS_HEATED_BED - else if (Heater == H_BED) { - if (currentTemperature >= 50) Color = COLOR_HEATED_BED; - image = targetTemperature > 0 ? imgBedHeated : imgBed; - } - #endif // HAS_HEATED_BED - #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - if (currentTemperature >= 50) Color = COLOR_CHAMBER; - image = targetTemperature > 0 ? imgChamberHeated : imgChamber; - } - #endif // HAS_TEMP_CHAMBER - - tft.add_image(0, 18, image, Color); - - tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); - tft_string.add(LCD_STR_DEGREE); - tft_string.trim(); - tft.add_text(tft_string.center(64) + 2, 72, Color, tft_string); - - if (targetTemperature >= 0) { - tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); - tft_string.add(LCD_STR_DEGREE); - tft_string.trim(); - tft.add_text(tft_string.center(64) + 2, 8, Color, tft_string); - - } -} - -void draw_fan_status(uint16_t x, uint16_t y, const bool blink) { - TERN_(TOUCH_SCREEN, touch.add_control(FAN, x, y, 64, 100)); - tft.canvas(x, y, 64, 100); - tft.set_background(COLOR_BACKGROUND); - - uint8_t fanSpeed = thermalManager.fan_speed[0]; - MarlinImage image; - - if (fanSpeed >= 127) - image = blink ? imgFanFast1 : imgFanFast0; - else if (fanSpeed > 0) - image = blink ? imgFanSlow1 : imgFanSlow0; - else - image = imgFanIdle; - - tft.add_image(0, 10, image, COLOR_FAN); - - tft_string.set((uint8_t *)ui8tostr4pctrj(thermalManager.fan_speed[0])); - tft_string.trim(); - tft.add_text(tft_string.center(64) + 6, 72, COLOR_FAN, tft_string); -} - -void MarlinUI::draw_status_screen() { - const bool blink = get_blink(); - - TERN_(TOUCH_SCREEN, touch.clear()); - - // heaters and fan - uint16_t i, x, y = POS_Y; - - for (i = 0 ; i < ITEMS_COUNT; i++) { - x = (320 / ITEMS_COUNT - 64) / 2 + (320 * i / ITEMS_COUNT); - switch (i) { - #ifdef ITEM_E0 - case ITEM_E0: draw_heater_status(x, y, H_E0); break; - #endif - #ifdef ITEM_E1 - case ITEM_E1: draw_heater_status(x, y, H_E1); break; - #endif - #ifdef ITEM_E2 - case ITEM_E2: draw_heater_status(x, y, H_E2); break; - #endif - #ifdef ITEM_BED - case ITEM_BED: draw_heater_status(x, y, H_BED); break; - #endif - #ifdef ITEM_CHAMBER - case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; - #endif - #ifdef ITEM_FAN - case ITEM_FAN: draw_fan_status(x, y, blink); break; - #endif - } - } - - // coordinates - tft.canvas(4, 103, 312, 24); - tft.set_background(COLOR_BACKGROUND); - tft.add_rectangle(0, 0, 312, 24, COLOR_AXIS_HOMED); - - uint16_t color; - uint16_t offset; - bool is_homed; - - tft.add_text( 10, 3, COLOR_AXIS_HOMED , "X"); - tft.add_text(127, 3, COLOR_AXIS_HOMED , "Y"); - tft.add_text(219, 3, COLOR_AXIS_HOMED , "Z"); - - is_homed = TEST(axis_homed, X_AXIS); - tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); - tft.add_text( 68 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); - - is_homed = TEST(axis_homed, Y_AXIS); - tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); - tft.add_text(185 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); - - is_homed = TEST(axis_homed, Z_AXIS); - if (blink & !is_homed) { - tft_string.set("?"); - offset = 25; // ".00" - } - else { - const float z = LOGICAL_Z_POSITION(current_position.z); - tft_string.set(ftostr52sp((int16_t)z)); - tft_string.rtrim(); - offset = tft_string.width(); - - tft_string.set(ftostr52sp(z)); - offset += 25 - tft_string.width(); - } - tft.add_text(301 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); - - // feed rate - tft.canvas(70, 136, 80, 32); - tft.set_background(COLOR_BACKGROUND); - color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; - tft.add_image(0, 0, imgFeedRate, color); - tft_string.set(i16tostr3rj(feedrate_percentage)); - tft_string.add('%'); - tft.add_text(32, 6, color , tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 70, 136, 80, 32)); - - // flow rate - tft.canvas(170, 136, 80, 32); - tft.set_background(COLOR_BACKGROUND); - color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; - tft.add_image(0, 0, imgFlowRate, color); - tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); - tft_string.add('%'); - tft.add_text(32, 6, color , tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 170, 136, 80, 32, active_extruder)); - - // print duration - char buffer[14]; - duration_t elapsed = print_job_timer.duration(); - elapsed.toDigital(buffer); - - tft.canvas(96, 176, 128, 20); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(buffer); - tft.add_text(tft_string.center(128), 0, COLOR_PRINT_TIME, tft_string); - - // progress bar - const uint8_t progress = ui.get_progress_percent(); - tft.canvas(4, 198, 312, 9); - tft.set_background(COLOR_PROGRESS_BG); - tft.add_rectangle(0, 0, 312, 9, COLOR_PROGRESS_FRAME); - if (progress) - tft.add_bar(1, 1, (310 * progress) / 100, 7, COLOR_PROGRESS_BAR); - - // status message - tft.canvas(0, 216, 320, 20); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(status_message); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); - - #if ENABLED(TOUCH_SCREEN) - add_control(256, 130, menu_main, imgSettings); - TERN_(SDSUPPORT, add_control(0, 130, menu_media, imgSD, card.isMounted() && !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); - #endif -} - -// Draw a static item with no left-right margin required. Centered by default. -void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { - menu_item(row); - tft_string.set(pstr, itemIndex, itemString); - if (vstr) - tft_string.add(vstr); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); -} - -// Draw a generic menu item with pre_char (if selected) and post_char -void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { - menu_item(row, sel); - - uint8_t *string = (uint8_t *)pstr; - MarlinImage image = noImage; - switch (*string) { - case 0x01: image = imgRefresh; break; // LCD_STR_REFRESH - case 0x02: image = imgDirectory; break; // LCD_STR_FOLDER - } - - uint8_t offset = MENU_TEXT_X_OFFSET; - if (image != noImage) { - string++; - offset = 32; - tft.add_image(0, 0, image, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - } - - tft_string.set(string, itemIndex, itemString); - tft.add_text(offset, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); -} - -// Draw a menu item with a (potentially) editable value -void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { - menu_item(row, sel); - - tft_string.set(pstr, itemIndex, itemString); - tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - if (data) { - tft_string.set(data); - tft.add_text(TFT_WIDTH - MENU_TEXT_X_OFFSET - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - } -} - -// Low-level draw_edit_screen can be used to draw an edit screen from anyplace -void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { - ui.encoder_direction_normal(); - TERN_(TOUCH_SCREEN, touch.clear()); - - uint16_t line = 1; - - menu_line(line++); - tft_string.set(pstr, itemIndex, itemString); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - - TERN_(AUTO_BED_LEVELING_UBL, if (ui.external_control) line++); // ftostr52() will overwrite *value so *value has to be displayed first - - menu_line(line); - tft_string.set(value); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - #if ENABLED(AUTO_BED_LEVELING_UBL) - if (ui.external_control) { - menu_line(line - 1); - - tft_string.set(X_LBL); - tft.add_text(52, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.x))); - tft_string.trim(); - tft.add_text(144 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft_string.set(Y_LBL); - tft.add_text(176, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.y))); - tft_string.trim(); - tft.add_text(268 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - } - #endif - - extern screenFunc_t _manual_move_func_ptr; - if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { - - #define SLIDER_LENGHT 224 - #define SLIDER_Y_POSITION 140 - - tft.canvas((TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION, SLIDER_LENGHT, 16); - tft.set_background(COLOR_BACKGROUND); - - int16_t position = (SLIDER_LENGHT - 2) * ui.encoderPosition / maxEditValue; - tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); - tft.add_bar(1, 6, position, 4, COLOR_SLIDER); - tft.add_bar(position + 1, 6, SLIDER_LENGHT - 2 - position, 4, COLOR_SLIDER_INACTIVE); - tft.add_bar(SLIDER_LENGHT - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); - - #if ENABLED(TOUCH_SCREEN) - tft.add_image((SLIDER_LENGHT - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); - touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGHT, 32, maxEditValue); - #endif - } - - #if ENABLED(TOUCH_SCREEN) - add_control(32, 176, DECREASE, imgDecrease); - add_control(224, 176, INCREASE, imgIncrease); - add_control(128, 176, CLICK, imgConfirm); - #endif -} - -// The Select Screen presents a prompt and two "buttons" -void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { - uint16_t line = 1; - - if (string == NULL) line++; - - menu_line(line++); - tft_string.set(pref); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - - if (string) { - menu_line(line++); - tft_string.set(string); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - } - - if (suff) { - menu_line(line); - tft_string.set(suff); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - } - #if ENABLED(TOUCH_SCREEN) - add_control(48, 176, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); - add_control(208, 176, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); - #endif -} - -#if ENABLED(SDSUPPORT) - void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { - menu_item(row, sel); - if (isDir) - tft.add_image(0, 0, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - tft.add_text(32, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); - } -#endif - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { - #if ENABLED(TOUCH_SCREEN) - touch.clear(); - draw_menu_navigation = false; - touch.add_control(RESUME_CONTINUE , 0, 0, 320, 240); - #endif - - menu_line(row); - tft_string.set(GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE)); - tft_string.add('E'); - tft_string.add((char)('1' + extruder)); - tft_string.add(' '); - tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); - tft_string.add(LCD_STR_DEGREE); - tft_string.add(" / "); - tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); - tft_string.add(LCD_STR_DEGREE); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - } -#endif // ADVANCED_PAUSE_FEATURE - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #define GRID_OFFSET_X 8 - #define GRID_OFFSET_Y 8 - #define GRID_WIDTH 144 - #define GRID_HEIGHT 144 - #define CONTROL_OFFSET 8 - - void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { - - tft.canvas(GRID_OFFSET_X, GRID_OFFSET_Y, GRID_WIDTH, GRID_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); - - for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) - for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) - if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) - tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); - - tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); - - const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, - lpos = pos.asLogical(); - - tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2 - 32, 96, 32); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(X_LBL); - tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ftostr52(lpos.x)); - tft_string.trim(); - tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2, 96, 32); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(Y_LBL); - tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ftostr52(lpos.y)); - tft_string.trim(); - tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft.canvas(216, GRID_OFFSET_Y + (GRID_HEIGHT - 32) / 2 + 32, 96, 32); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(Z_LBL); - tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); - tft_string.trim(); - tft.add_text(96 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - - tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 32) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 1, 32, 32); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(ui8tostr3rj(x_plot)); - tft_string.trim(); - tft.add_text(tft_string.center(32), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + (GRID_HEIGHT - 27) / 2, 32, 32); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(ui8tostr3rj(y_plot)); - tft_string.trim(); - tft.add_text(tft_string.center(32), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - #if ENABLED(TOUCH_SCREEN) - touch.clear(); - draw_menu_navigation = false; - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); - add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); - add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); - add_control(224, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); - add_control(144, 206, BACK, imgBack); - #endif - } -#endif // AUTO_BED_LEVELING_UBL - -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - void MarlinUI::touch_calibration() { - static uint16_t x, y; - - calibrationState calibration_stage = touch.get_calibration_state(); - - if (calibration_stage == CALIBRATION_NONE) { - defer_status_screen(true); - clear_lcd(); - calibration_stage = touch.calibration_start(); - } - else { - tft.canvas(x - 15, y - 15, 31, 31); - tft.set_background(COLOR_BACKGROUND); - } - - x = 20; y = 20; - touch.clear(); - - if (calibration_stage < CALIBRATION_SUCCESS) { - switch (calibration_stage) { - case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; - case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; - case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; - case CALIBRATION_POINT_4: x = TFT_WIDTH - 21; y = TFT_HEIGHT - 21; tft_string.set("Bottom Right"); break; - default: break; - } - - tft.canvas(x - 15, y - 15, 31, 31); - tft.set_background(COLOR_BACKGROUND); - tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); - tft.add_bar(15, 0, 1, 31, COLOR_TOUCH_CALIBRATION); - - touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); - } - else { - tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? "Calibration Completed" : "Calibration Failed"); - defer_status_screen(false); - touch.calibration_end(); - touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); - } - - tft.canvas(0, (TFT_HEIGHT - tft_string.font_height()) >> 1, TFT_WIDTH, tft_string.font_height()); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - } -#endif // TOUCH_SCREEN_CALIBRATION - -void menu_line(const uint8_t row, uint16_t color) { - tft.canvas(0, 2 + 34 * row, TFT_WIDTH, 32); - tft.set_background(color); -} - -void menu_pause_option(); - -void menu_item(const uint8_t row, bool sel ) { - #if ENABLED(TOUCH_SCREEN) - if (row == 0) { - touch.clear(); - draw_menu_navigation = TERN(ADVANCED_PAUSE_FEATURE, ui.currentScreen != menu_pause_option, true); - } - #endif - - menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 2 + 34 * row, 320, 32, encoderTopLine + row)); -} - -void MarlinUI::move_axis_screen() { -} - -#endif // HAS_UI_320x240 diff --git a/Marlin/src/lcd/tft/ui_320x240.h b/Marlin/src/lcd/tft/ui_320x240.h deleted file mode 100644 index c9822f11cc..0000000000 --- a/Marlin/src/lcd/tft/ui_320x240.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfigPre.h" - -#include "tft.h" -#include "tft_image.h" - -#if ENABLED(TOUCH_SCREEN) - #include "touch.h" -#endif - -void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); -void draw_fan_status(uint16_t x, uint16_t y, const bool blink); - -#define MENU_TEXT_X_OFFSET 10 -#define MENU_TEXT_Y_OFFSET 7 -void menu_line(const uint8_t row, uint16_t color = COLOR_BACKGROUND); -void menu_item(const uint8_t row, bool sel = false); - -#define MENU_FONT_NAME Helvetica14 -#define SYMBOLS_FONT_NAME Helvetica14_symbols - -#define ABSOLUTE_ZERO -273.15 - -const tImage Images[imgCount] = { - MarlinLogo320x240x16, - HotEnd_64x64x4, - Bed_64x64x4, - Bed_Heated_64x64x4, - Chamber_64x64x4, - Chamber_Heated_64x64x4, - Fan0_64x64x4, - Fan_Slow0_64x64x4, - Fan_Slow1_64x64x4, - Fan_Fast0_64x64x4, - Fan_Fast1_64x64x4, - Feedrate_32x32x4, - Flowrate_32x32x4, - SD_64x64x4, - Menu_64x64x4, - Settings_64x64x4, - Directory_32x32x4, - Confirm_64x64x4, - Cancel_64x64x4, - Increase_64x64x4, - Decrease_64x64x4, - Back_32x32x4, - Up_32x32x4, - Down_32x32x4, - Left_32x32x4, - Right_32x32x4, - Refresh_32x32x4, - Leveling_32x32x4, - Slider8x16x4, - Home_64x64x4, - BtnRounded_64x52x4, -}; - -#if HAS_TEMP_CHAMBER && HOTENDS > 1 - #define ITEM_E0 0 - #define ITEM_E1 1 - #define ITEM_BED 2 - #define ITEM_CHAMBER 3 - #define ITEM_FAN 4 - #define ITEMS_COUNT 5 - #define POS_Y 0 -#elif HAS_TEMP_CHAMBER - #define ITEM_E0 0 - #define ITEM_BED 1 - #define ITEM_CHAMBER 2 - #define ITEM_FAN 3 - #define ITEMS_COUNT 4 - #define POS_Y 0 -#elif HOTENDS > 1 - #define ITEM_E0 0 - #define ITEM_E1 1 - #define ITEM_BED 2 - #define ITEM_FAN 3 - #define ITEMS_COUNT 4 - #define POS_Y 0 -#else - #define ITEM_E0 0 - #define ITEM_BED 1 - #define ITEM_FAN 2 - #define ITEMS_COUNT 3 - #define POS_Y 0 -#endif diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp deleted file mode 100644 index 3dab9418f5..0000000000 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ /dev/null @@ -1,1068 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if HAS_UI_480x320 - -#include "ui_480x320.h" - -#include "../ultralcd.h" -#include "../menu/menu.h" -#include "../../libs/numtostr.h" - -#include "../../sd/cardreader.h" -#include "../../module/temperature.h" -#include "../../module/printcounter.h" -#include "../../module/planner.h" -#include "../../module/motion.h" - -#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - #include "../../feature/filwidth.h" - #include "../../gcode/parser.h" -#endif - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../../feature/bedlevel/bedlevel.h" -#endif - -#if !HAS_LCD_MENU - #error "Seriously? High resolution TFT screen without menu?" -#endif - -static bool draw_menu_navigation = false; - -void MarlinUI::tft_idle() { - #if ENABLED(TOUCH_SCREEN) - if (draw_menu_navigation) { - add_control(104, 286, PAGE_UP, imgPageUp, encoderTopLine > 0); - add_control(344, 286, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); - add_control(224, 286, BACK, imgBack); - draw_menu_navigation = false; - } - #endif - - tft.queue.async(); - TERN_(TOUCH_SCREEN, touch.idle()); -} - -void MarlinUI::init_lcd() { - tft.init(); - tft.set_font(MENU_FONT_NAME); - #ifdef SYMBOLS_FONT_NAME - tft.add_glyphs(SYMBOLS_FONT_NAME); - #endif - TERN_(TOUCH_SCREEN, touch.init()); - clear_lcd(); -} - -bool MarlinUI::detected() { return true; } - -void MarlinUI::clear_lcd() { - #if ENABLED(TOUCH_SCREEN) - touch.reset(); - draw_menu_navigation = false; - #endif - - tft.queue.reset(); - tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BACKGROUND); -} - -#if ENABLED(SHOW_BOOTSCREEN) - #ifndef BOOTSCREEN_TIMEOUT - #define BOOTSCREEN_TIMEOUT 1500 - #endif - - #undef BOOTSCREEN_TIMEOUT - #define BOOTSCREEN_TIMEOUT 5000 - - void MarlinUI::show_bootscreen() { - tft.queue.reset(); - - tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft.add_image(142, 130, imgBootScreen); // MarlinLogo195x59x16 - - #ifdef WEBSITE_URL - tft.add_text(8, 250, COLOR_WEBSITE_URL, WEBSITE_URL); - #endif - - tft.queue.sync(); - safe_delay(BOOTSCREEN_TIMEOUT); - clear_lcd(); - } -#endif // SHOW_BOOTSCREEN - -void MarlinUI::draw_kill_screen() { - tft.queue.reset(); - tft.fill(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_KILL_SCREEN_BG); - - uint16_t line = 2; - - menu_line(line++, COLOR_KILL_SCREEN_BG); - tft_string.set(status_message); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - - line++; - menu_line(line++, COLOR_KILL_SCREEN_BG); - tft_string.set(GET_TEXT(MSG_HALTED)); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - - menu_line(line++, COLOR_KILL_SCREEN_BG); - tft_string.set(GET_TEXT(MSG_PLEASE_RESET)); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - - tft.queue.sync(); -} - -void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { - MarlinImage image = imgHotEnd; - uint16_t Color; - float currentTemperature, targetTemperature; - - if (Heater >= 0) { // HotEnd - currentTemperature = thermalManager.degHotend(Heater); - targetTemperature = thermalManager.degTargetHotend(Heater); - } -#if HAS_HEATED_BED - else if (Heater == H_BED) { - currentTemperature = thermalManager.degBed(); - targetTemperature = thermalManager.degTargetBed(); - } -#endif // HAS_HEATED_BED -#if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - currentTemperature = thermalManager.degChamber(); - #if HAS_HEATED_CHAMBER - targetTemperature = thermalManager.degTargetChamber(); - #else - targetTemperature = ABSOLUTE_ZERO; - #endif - } -#endif // HAS_TEMP_CHAMBER - else return; - - TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 80, 120, Heater)); - tft.canvas(x, y, 80, 120); - tft.set_background(COLOR_BACKGROUND); - - Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; - - if (Heater >= 0) { // HotEnd - if (currentTemperature >= 50) Color = COLOR_HOTEND; - } - #if HAS_HEATED_BED - else if (Heater == H_BED) { - if (currentTemperature >= 50) Color = COLOR_HEATED_BED; - image = targetTemperature > 0 ? imgBedHeated : imgBed; - } - #endif // HAS_HEATED_BED - #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - if (currentTemperature >= 50) Color = COLOR_CHAMBER; - image = targetTemperature > 0 ? imgChamberHeated : imgChamber; - } - #endif // HAS_TEMP_CHAMBER - - tft.add_image(8, 28, image, Color); - - tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); - tft_string.add(LCD_STR_DEGREE); - tft_string.trim(); - tft.add_text(tft_string.center(80) + 2, 82, Color, tft_string); - - if (targetTemperature >= 0) { - tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); - tft_string.add(LCD_STR_DEGREE); - tft_string.trim(); - tft.add_text(tft_string.center(80) + 2, 8, Color, tft_string); - } -} - -void draw_fan_status(uint16_t x, uint16_t y, const bool blink) { - TERN_(TOUCH_SCREEN, touch.add_control(FAN, x, y, 80, 120)); - tft.canvas(x, y, 80, 120); - tft.set_background(COLOR_BACKGROUND); - - uint8_t fanSpeed = thermalManager.fan_speed[0]; - MarlinImage image; - - if (fanSpeed >= 127) - image = blink ? imgFanFast1 : imgFanFast0; - else if (fanSpeed > 0) - image = blink ? imgFanSlow1 : imgFanSlow0; - else - image = imgFanIdle; - - tft.add_image(8, 20, image, COLOR_FAN); - - tft_string.set((uint8_t *)ui8tostr4pctrj(thermalManager.fan_speed[0])); - tft_string.trim(); - tft.add_text(tft_string.center(80) + 6, 82, COLOR_FAN, tft_string); -} - -void MarlinUI::draw_status_screen() { - const bool blink = get_blink(); - - TERN_(TOUCH_SCREEN, touch.clear()); - - // heaters and fan - uint16_t i, x, y = POS_Y; - - for (i = 0 ; i < ITEMS_COUNT; i++) { - x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); - switch (i) { - #ifdef ITEM_E0 - case ITEM_E0: draw_heater_status(x, y, H_E0); break; - #endif - #ifdef ITEM_E1 - case ITEM_E1: draw_heater_status(x, y, H_E1); break; - #endif - #ifdef ITEM_E2 - case ITEM_E2: draw_heater_status(x, y, H_E2); break; - #endif - #ifdef ITEM_BED - case ITEM_BED: draw_heater_status(x, y, H_BED); break; - #endif - #ifdef ITEM_CHAMBER - case ITEM_CHAMBER: draw_heater_status(x, y, H_CHAMBER); break; - #endif - #ifdef ITEM_FAN - case ITEM_FAN: draw_fan_status(x, y, blink); break; - #endif - } - } - - // coordinates - tft.canvas(4, 132, TFT_WIDTH - 8, 34); - tft.set_background(COLOR_BACKGROUND); - tft.add_rectangle(0, 0, TFT_WIDTH - 8, 34, COLOR_AXIS_HOMED); - - uint16_t color; - uint16_t offset; - bool is_homed; - - tft.add_text( 16, 3, COLOR_AXIS_HOMED , "X"); - tft.add_text(192, 3, COLOR_AXIS_HOMED , "Y"); - tft.add_text(330, 3, COLOR_AXIS_HOMED , "Z"); - - is_homed = TEST(axis_homed, X_AXIS); - tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); - tft.add_text(102 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); - - is_homed = TEST(axis_homed, Y_AXIS); - tft_string.set(blink & !is_homed ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); - tft.add_text(280 - tft_string.width(), 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); - - is_homed = TEST(axis_homed, Z_AXIS); - if (blink & !is_homed) { - tft_string.set("?"); - offset = 32; // ".00" - } - else { - const float z = LOGICAL_Z_POSITION(current_position.z); - tft_string.set(ftostr52sp((int16_t)z)); - tft_string.rtrim(); - offset = tft_string.width(); - - tft_string.set(ftostr52sp(z)); - offset += 32 - tft_string.width(); - } - tft.add_text(455 - tft_string.width() - offset, 3, is_homed ? COLOR_AXIS_HOMED : COLOR_AXIS_NOT_HOMED, tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, 132, TFT_WIDTH - 8, 34)); - - // feed rate - tft.canvas(96, 180, 100, 32); - tft.set_background(COLOR_BACKGROUND); - color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; - tft.add_image(0, 0, imgFeedRate, color); - tft_string.set(i16tostr3rj(feedrate_percentage)); - tft_string.add('%'); - tft.add_text(36, 1, color , tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 96, 176, 100, 32)); - - // flow rate - tft.canvas(284, 180, 100, 32); - tft.set_background(COLOR_BACKGROUND); - color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; - tft.add_image(0, 0, imgFlowRate, color); - tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); - tft_string.add('%'); - tft.add_text(36, 1, color , tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 284, 176, 100, 32, active_extruder)); - - // print duration - char buffer[14]; - duration_t elapsed = print_job_timer.duration(); - elapsed.toDigital(buffer); - - tft.canvas((TFT_WIDTH - 128) / 2, 224, 128, 29); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(buffer); - tft.add_text(tft_string.center(128), 0, COLOR_PRINT_TIME, tft_string); - - // progress bar - const uint8_t progress = ui.get_progress_percent(); - tft.canvas(4, 260, TFT_WIDTH - 8, 9); - tft.set_background(COLOR_PROGRESS_BG); - tft.add_rectangle(0, 0, TFT_WIDTH - 8, 9, COLOR_PROGRESS_FRAME); - if (progress) - tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress) / 100, 7, COLOR_PROGRESS_BAR); - - // status message - tft.canvas(0, 280, TFT_WIDTH, 29); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(status_message); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); - - - #if ENABLED(TOUCH_SCREEN) - add_control(404, 180, menu_main, imgSettings); - TERN_(SDSUPPORT, add_control(12, 180, menu_media, imgSD, card.isMounted() && !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); - #endif -} - -// Draw a static item with no left-right margin required. Centered by default. -void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const vstr/*=nullptr*/) { - menu_item(row); - tft_string.set(pstr, itemIndex, itemString); - if (vstr) - tft_string.add(vstr); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_YELLOW, tft_string); -} - -// Draw a generic menu item with pre_char (if selected) and post_char -void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) { - menu_item(row, sel); - - uint8_t *string = (uint8_t *)pstr; - MarlinImage image = noImage; - switch (*string) { - case 0x01: image = imgRefresh; break; // LCD_STR_REFRESH - case 0x02: image = imgDirectory; break; // LCD_STR_FOLDER - } - - uint8_t offset = MENU_TEXT_X_OFFSET; - if (image != noImage) { - string++; - offset = 42; - tft.add_image(5, 5, image, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - } - - tft_string.set(string, itemIndex, itemString); - tft.add_text(offset, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); -} - -// Draw a menu item with a (potentially) editable value -void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { - menu_item(row, sel); - - tft_string.set(pstr, itemIndex, itemString); - tft.add_text(MENU_TEXT_X_OFFSET, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - if (data) { - tft_string.set(data); - tft.add_text(TFT_WIDTH - MENU_TEXT_X_OFFSET - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - } -} - -// Low-level draw_edit_screen can be used to draw an edit screen from anyplace -void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { - ui.encoder_direction_normal(); - TERN_(TOUCH_SCREEN, touch.clear()); - - uint16_t line = 1; - - menu_line(line++); - tft_string.set(pstr, itemIndex, itemString); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - - TERN_(AUTO_BED_LEVELING_UBL, if (ui.external_control) line++); // ftostr52() will overwrite *value so *value has to be displayed first - - menu_line(line); - tft_string.set(value); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - #if ENABLED(AUTO_BED_LEVELING_UBL) - if (ui.external_control) { - menu_line(line - 1); - - tft_string.set(X_LBL); - tft.add_text((TFT_WIDTH / 2 - 120), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.x))); - tft_string.trim(); - tft.add_text((TFT_WIDTH / 2 - 16) - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft_string.set(Y_LBL); - tft.add_text((TFT_WIDTH / 2 + 16), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ftostr52(LOGICAL_X_POSITION(current_position.y))); - tft_string.trim(); - tft.add_text((TFT_WIDTH / 2 + 120) - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - } - #endif - - extern screenFunc_t _manual_move_func_ptr; - if (ui.currentScreen != _manual_move_func_ptr && !ui.external_control) { - - #define SLIDER_LENGHT 336 - #define SLIDER_Y_POSITION 186 - - tft.canvas((TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION, SLIDER_LENGHT, 16); - tft.set_background(COLOR_BACKGROUND); - - int16_t position = (SLIDER_LENGHT - 2) * ui.encoderPosition / maxEditValue; - tft.add_bar(0, 7, 1, 2, ui.encoderPosition == 0 ? COLOR_SLIDER_INACTIVE : COLOR_SLIDER); - tft.add_bar(1, 6, position, 4, COLOR_SLIDER); - tft.add_bar(position + 1, 6, SLIDER_LENGHT - 2 - position, 4, COLOR_SLIDER_INACTIVE); - tft.add_bar(SLIDER_LENGHT - 1, 7, 1, 2, int32_t(ui.encoderPosition) == maxEditValue ? COLOR_SLIDER : COLOR_SLIDER_INACTIVE); - - #if ENABLED(TOUCH_SCREEN) - tft.add_image((SLIDER_LENGHT - 8) * ui.encoderPosition / maxEditValue, 0, imgSlider, COLOR_SLIDER); - touch.add_control(SLIDER, (TFT_WIDTH - SLIDER_LENGHT) / 2, SLIDER_Y_POSITION - 8, SLIDER_LENGHT, 32, maxEditValue); - #endif - } - - #if ENABLED(TOUCH_SCREEN) - add_control(64, 256, DECREASE, imgDecrease); - add_control(352, 256, INCREASE, imgIncrease); - add_control(208, 256, CLICK, imgConfirm); - #endif -} - -// The Select Screen presents a prompt and two "buttons" -void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { - uint16_t line = 1; - - if (string == NULL) line++; - - menu_line(line++); - tft_string.set(pref); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - - if (string) { - menu_line(line++); - tft_string.set(string); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - } - - if (suff) { - menu_line(line); - tft_string.set(suff); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - } - #if ENABLED(TOUCH_SCREEN) - add_control(88, 256, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); - add_control(328, 256, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); - #endif -} - -#if ENABLED(SDSUPPORT) - void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { - menu_item(row, sel); - if (isDir) - tft.add_image(5, 5, imgDirectory, COLOR_MENU_TEXT, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - tft.add_text(42, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, theCard.longest_filename()); - } -#endif - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { - #if ENABLED(TOUCH_SCREEN) - touch.clear(); - draw_menu_navigation = false; - touch.add_control(RESUME_CONTINUE , 0, 0, TFT_WIDTH, TFT_HEIGHT); - #endif - - menu_line(row); - tft_string.set(GET_TEXT(MSG_FILAMENT_CHANGE_NOZZLE)); - tft_string.add('E'); - tft_string.add((char)('1' + extruder)); - tft_string.add(' '); - tft_string.add(i16tostr3rj(thermalManager.degHotend(extruder))); - tft_string.add(LCD_STR_DEGREE); - tft_string.add(" / "); - tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder))); - tft_string.add(LCD_STR_DEGREE); - tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - } -#endif // ADVANCED_PAUSE_FEATURE - -#if ENABLED(AUTO_BED_LEVELING_UBL) - #define GRID_OFFSET_X 8 - #define GRID_OFFSET_Y 8 - #define GRID_WIDTH 192 - #define GRID_HEIGHT 192 - #define CONTROL_OFFSET 16 - - void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { - - tft.canvas(GRID_OFFSET_X, GRID_OFFSET_Y, GRID_WIDTH, GRID_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); - - for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) - for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) - if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) - tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); - - tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); - - const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, - lpos = pos.asLogical(); - - tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2 - 43, 120, 43); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(X_LBL); - tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ftostr52(lpos.x)); - tft_string.trim(); - tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2, 120, 43); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(Y_LBL); - tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(ftostr52(lpos.y)); - tft_string.trim(); - tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft.canvas(320, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2 + 43, 120, 43); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(Z_LBL); - tft.add_text(0, MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); - tft_string.set(isnan(ubl.z_values[x_plot][y_plot]) ? "-----" : ftostr43sign(ubl.z_values[x_plot][y_plot])); - tft_string.trim(); - tft.add_text(120 - tft_string.width(), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - - tft.canvas(GRID_OFFSET_X + (GRID_WIDTH - 48) / 2, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET - 5, 48, 43); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(ui8tostr3rj(x_plot)); - tft_string.trim(); - tft.add_text(tft_string.center(48), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - tft.canvas(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET + 16 - 24, GRID_OFFSET_Y + (GRID_HEIGHT - 43) / 2, 48, 43); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(ui8tostr3rj(y_plot)); - tft_string.trim(); - tft.add_text(tft_string.center(48), MENU_TEXT_Y_OFFSET, COLOR_MENU_VALUE, tft_string); - - #if ENABLED(TOUCH_SCREEN) - touch.clear(); - draw_menu_navigation = false; - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); - add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); - add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); - add_control(320, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); - add_control(224, 286, BACK, imgBack); - #endif - } -#endif // AUTO_BED_LEVELING_UBL - -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - void MarlinUI::touch_calibration() { - static uint16_t x, y; - - calibrationState calibration_stage = touch.get_calibration_state(); - - if (calibration_stage == CALIBRATION_NONE) { - defer_status_screen(true); - clear_lcd(); - calibration_stage = touch.calibration_start(); - } - else { - tft.canvas(x - 15, y - 15, 31, 31); - tft.set_background(COLOR_BACKGROUND); - } - - x = 20; y = 20; - touch.clear(); - - if (calibration_stage < CALIBRATION_SUCCESS) { - switch (calibration_stage) { - case CALIBRATION_POINT_1: tft_string.set("Top Left"); break; - case CALIBRATION_POINT_2: y = TFT_HEIGHT - 21; tft_string.set("Bottom Left"); break; - case CALIBRATION_POINT_3: x = TFT_WIDTH - 21; tft_string.set("Top Right"); break; - case CALIBRATION_POINT_4: x = TFT_WIDTH - 21; y = TFT_HEIGHT - 21; tft_string.set("Bottom Right"); break; - default: break; - } - - tft.canvas(x - 15, y - 15, 31, 31); - tft.set_background(COLOR_BACKGROUND); - tft.add_bar(0, 15, 31, 1, COLOR_TOUCH_CALIBRATION); - tft.add_bar(15, 0, 1, 31, COLOR_TOUCH_CALIBRATION); - - touch.add_control(CALIBRATE, 0, 0, TFT_WIDTH, TFT_HEIGHT, uint32_t(x) << 16 | uint32_t(y)); - } - else { - tft_string.set(calibration_stage == CALIBRATION_SUCCESS ? "Calibration Completed" : "Calibration Failed"); - defer_status_screen(false); - touch.calibration_end(); - touch.add_control(BACK, 0, 0, TFT_WIDTH, TFT_HEIGHT); - } - - tft.canvas(0, (TFT_HEIGHT - tft_string.font_height()) >> 1, TFT_WIDTH, tft_string.font_height()); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); - } -#endif // TOUCH_SCREEN_CALIBRATION - -void menu_line(const uint8_t row, uint16_t color) { - tft.canvas(0, 4 + 45 * row, TFT_WIDTH, 43); - tft.set_background(color); -} - -void menu_pause_option(); - -void menu_item(const uint8_t row, bool sel ) { - #if ENABLED(TOUCH_SCREEN) - if (row == 0) { - touch.clear(); - draw_menu_navigation = TERN(ADVANCED_PAUSE_FEATURE, ui.currentScreen != menu_pause_option, true); - } - #endif - - menu_line(row, sel ? COLOR_SELECTION_BG : COLOR_BACKGROUND); - TERN_(TOUCH_SCREEN, touch.add_control(sel ? CLICK : MENU_ITEM, 0, 4 + 45 * row, TFT_WIDTH, 43, encoderTopLine + row)); -} - -#if ENABLED(BABYSTEP_ZPROBE_OFFSET) - #include "../../feature/babystep.h" -#endif - -#if HAS_BED_PROBE - #include "../../module/probe.h" -#endif - -#define Z_SELECTION_Z 1 -#define Z_SELECTION_Z_PROBE -1 - -struct MotionAxisState { - xy_int_t xValuePos, yValuePos, zValuePos, eValuePos, stepValuePos, zTypePos, eNamePos; - float currentStepSize = 10.0; - int z_selection = Z_SELECTION_Z; - uint8_t e_selection = 0; - bool homming = false; - bool blocked = false; - char message[32]; -}; - -MotionAxisState motionAxisState; - -#define E_BTN_COLOR COLOR_YELLOW -#define X_BTN_COLOR COLOR_CORAL_RED -#define Y_BTN_COLOR COLOR_VIVID_GREEN -#define Z_BTN_COLOR COLOR_LIGHT_BLUE - -#define BTN_WIDTH 64 -#define BTN_HEIGHT 52 -#define X_MARGIN 20 -#define Y_MARGIN 15 - -static void quick_feedback() { - #if HAS_CHIRP - ui.chirp(); // Buzz and wait. Is the delay needed for buttons to settle? - #if BOTH(HAS_LCD_MENU, USE_BEEPER) - for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } - #elif HAS_LCD_MENU - delay(10); - #endif - #endif -} - -#define CUR_STEP_VALUE_WIDTH 104 -static void drawCurStepValue() { - tft_string.set((uint8_t *)ftostr52sp(motionAxisState.currentStepSize)); - tft_string.add("mm"); - tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string); -} - -static void drawCurZSelection() { - tft_string.set("Z"); - tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(0, 0, Z_BTN_COLOR, tft_string); - tft.queue.sync(); - tft_string.set("Offset"); - tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34); - tft.set_background(COLOR_BACKGROUND); - if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { - tft.add_text(0, 0, Z_BTN_COLOR, tft_string); - } -} - -static void drawCurESelection() { - tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft_string.set("E"); - tft.add_text(0, 0, E_BTN_COLOR , tft_string); - tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); -} - -static void drawMessage(const char *msg) { - tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 34, TFT_HEIGHT / 2, 34); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(0, 0, COLOR_YELLOW, msg); -} - -static void drawAxisValue(AxisEnum axis) { - const float value = - #if HAS_BED_PROBE - axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? - probe.offset.z : - #endif - NATIVE_TO_LOGICAL( - ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), - axis - ); - xy_int_t pos; - uint16_t color; - switch (axis) { - case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; - case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; - case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; - case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; - default: return; - } - tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, BTN_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(ftostr52sp(value)); - tft.add_text(0, 0, color, tft_string); -} - -static void moveAxis(AxisEnum axis, const int8_t direction) { - quick_feedback(); - - if (axis == E_AXIS && thermalManager.temp_hotend[motionAxisState.e_selection].celsius < EXTRUDE_MINTEMP) { - drawMessage("Too cold"); - return; - } - - const float diff = motionAxisState.currentStepSize * direction; - - if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; - const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; - const float bsDiff = planner.steps_to_mm[Z_AXIS] * babystep_increment, - new_probe_offset = probe.offset.z + bsDiff, - new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET - , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff - , new_probe_offset - ); - if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { - babystep.add_steps(Z_AXIS, babystep_increment); - if (do_probe) - probe.offset.z = new_offs; - else - TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); - drawMessage(""); // clear the error - drawAxisValue(axis); - } - else { - drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); - } - #elif HAS_BED_PROBE - // only change probe.offset.z - probe.offset.z += diff; - if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) { - current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN; - drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); - } - else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) { - current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX; - drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); - } - else { - drawMessage(""); // clear the error - } - drawAxisValue(axis); - #endif - return; - } - - if (!ui.manual_move.processing) { - // Get motion limit from software endstops, if any - float min, max; - soft_endstop.get_manual_axis_limits(axis, min, max); - - // Delta limits XY based on the current offset from center - // This assumes the center is 0,0 - #if ENABLED(DELTA) - if (axis != Z_AXIS && axis != E_AXIS) { - max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis - min = -max; - } - #endif - - // Get the new position - #if IS_KINEMATIC - ui.manual_move.offset += diff; - if (direction < 0) - NOLESS(ui.manual_move.offset, min - current_position[axis]); - else - NOMORE(ui.manual_move.offset, max - current_position[axis]); - #else - current_position[axis] += diff; - if (direction < 0 && current_position[axis] < min) { - current_position[axis] = min; - drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); - } - else if (direction > 0 && current_position[axis] > max) { - current_position[axis] = max; - drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); - } - else { - drawMessage(""); // clear the error - } - #endif - - ui.manual_move.soon(axis - #if MULTI_MANUAL - , motionAxisState.e_selection - #endif - ); - } - - drawAxisValue(axis); -} - -static void e_plus() { - moveAxis(E_AXIS, 1); -} - -static void e_minus() { - moveAxis(E_AXIS, -1); -} - -static void x_minus() { - moveAxis(X_AXIS, -1); -} - -static void x_plus() { - moveAxis(X_AXIS, 1); -} - -static void y_plus() { - moveAxis(Y_AXIS, 1); -} - -static void y_minus() { - moveAxis(Y_AXIS, -1); -} - -static void z_plus() { - moveAxis(Z_AXIS, 1); -} - -static void z_minus() { - moveAxis(Z_AXIS, -1); -} - -static void e_select() { - motionAxisState.e_selection++; - if (motionAxisState.e_selection >= EXTRUDERS) { - motionAxisState.e_selection = 0; - } - - quick_feedback(); - drawCurESelection(); - drawAxisValue(E_AXIS); -} - -static void do_home() { - quick_feedback(); - drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING)); - queue.inject_P(G28_STR); - // Disable touch until home is done - TERN_(HAS_TFT_XPT2046, touch.disable()); - drawAxisValue(E_AXIS); - drawAxisValue(X_AXIS); - drawAxisValue(Y_AXIS); - drawAxisValue(Z_AXIS); -} - -static void step_size() { - motionAxisState.currentStepSize = motionAxisState.currentStepSize / 10.0; - if (motionAxisState.currentStepSize < 0.0015) motionAxisState.currentStepSize = 10.0; - quick_feedback(); - drawCurStepValue(); -} - -#if HAS_BED_PROBE - static void z_select() { - motionAxisState.z_selection *= -1; - quick_feedback(); - drawCurZSelection(); - drawAxisValue(Z_AXIS); - } -#endif - -static void disable_steppers() { - quick_feedback(); - queue.inject_P(PSTR("M84")); -} - -static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { - uint16_t width = Images[imgBtn52Rounded].width; - uint16_t height = Images[imgBtn52Rounded].height; - - if (!enabled) bgColor = COLOR_CONTROL_DISABLED; - - tft.canvas(x, y, width, height); - tft.set_background(COLOR_BACKGROUND); - tft.add_image(0, 0, imgBtn52Rounded, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); - - // TODO: Make an add_text() taking a font arg - if (label != NULL) { - tft_string.set(label); - tft_string.trim(); - tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string); - } - else { - tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); - } - - TERN_(HAS_TFT_XPT2046, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); -} - -void MarlinUI::move_axis_screen() { - // Reset - defer_status_screen(true); - motionAxisState.blocked = false; - TERN_(HAS_TFT_XPT2046, touch.enable()); - - ui.clear_lcd(); - - TERN_(TOUCH_SCREEN, touch.clear()); - - const bool busy = printingIsActive(); - - // if we have baby step and we are printing, select baby step - if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) motionAxisState.z_selection = Z_SELECTION_Z_PROBE; - - // ROW 1 -> E- Y- CurY Z+ - int x = X_MARGIN, y = Y_MARGIN, spacing = 0; - - drawBtn(x, y, "E+", (int32_t)e_plus, imgUp, E_BTN_COLOR, !busy); - - spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; - x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y+", (int32_t)y_plus, imgUp, Y_BTN_COLOR, !busy); - - // Cur Y - x += BTN_WIDTH; - motionAxisState.yValuePos.x = x + 2; - motionAxisState.yValuePos.y = y; - drawAxisValue(Y_AXIS); - - x += spacing; - drawBtn(x, y, "Z+", (int32_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step - - // ROW 2 -> "Ex" X- HOME X+ "Z" - y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; - x = X_MARGIN; - spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; - - motionAxisState.eNamePos.x = x; - motionAxisState.eNamePos.y = y; - drawCurESelection(); - TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (int32_t)e_select)); - - x += BTN_WIDTH + spacing; - drawBtn(x, y, "X-", (int32_t)x_minus, imgLeft, X_BTN_COLOR, !busy); - - x += BTN_WIDTH + spacing; //imgHome is 64x64 - TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (int32_t)do_home, imgHome, !busy)); - - x += BTN_WIDTH + spacing; - uint16_t xplus_x = x; - drawBtn(x, y, "X+", (int32_t)x_plus, imgRight, X_BTN_COLOR, !busy); - - x += BTN_WIDTH + spacing; - motionAxisState.zTypePos.x = x; - motionAxisState.zTypePos.y = y; - drawCurZSelection(); - #if HAS_BED_PROBE - if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (int32_t)z_select); - #endif - - // ROW 3 -> E- CurX Y- Z- - y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; - x = X_MARGIN; - spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; - - drawBtn(x, y, "E-", (int32_t)e_minus, imgDown, E_BTN_COLOR, !busy); - - // Cur E - motionAxisState.eValuePos.x = x; - motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(E_AXIS); - - // Cur X - motionAxisState.xValuePos.x = BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; //X- pos - motionAxisState.xValuePos.y = y - 10; - drawAxisValue(X_AXIS); - - x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y-", (int32_t)y_minus, imgDown, Y_BTN_COLOR, !busy); - - x += BTN_WIDTH + spacing; - drawBtn(x, y, "Z-", (int32_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step - - // Cur Z - motionAxisState.zValuePos.x = x; - motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(Z_AXIS); - - // ROW 4 -> step_size disable steppers back - y = TFT_HEIGHT - Y_MARGIN - 32; // - x = TFT_WIDTH / 2 - CUR_STEP_VALUE_WIDTH / 2; - motionAxisState.stepValuePos.x = x; - motionAxisState.stepValuePos.y = y; - if (!busy) { - drawCurStepValue(); - TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (int32_t)step_size)); - } - - // alinged with x+ - drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (int32_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); - - TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); -} - -#undef BTN_WIDTH -#undef BTN_HEIGHT - -#endif // HAS_UI_480x320 diff --git a/Marlin/src/lcd/tft/ui_480x320.h b/Marlin/src/lcd/tft/ui_480x320.h deleted file mode 100644 index 053ee78158..0000000000 --- a/Marlin/src/lcd/tft/ui_480x320.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfigPre.h" - -#include "tft.h" -#include "tft_image.h" - -#if ENABLED(TOUCH_SCREEN) - #include "touch.h" -#endif - -void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater); -void draw_fan_status(uint16_t x, uint16_t y, const bool blink); - -#define MENU_TEXT_X_OFFSET 16 -#define MENU_TEXT_Y_OFFSET 7 -void menu_line(const uint8_t row, uint16_t color = COLOR_BACKGROUND); -void menu_item(const uint8_t row, bool sel = false); - -#define MENU_FONT_NAME Helvetica18 -#define SYMBOLS_FONT_NAME Helvetica18_symbols - -#define ABSOLUTE_ZERO -273.15 - -const tImage Images[imgCount] = { - MarlinLogo195x59x16, - HotEnd_64x64x4, - Bed_64x64x4, - Bed_Heated_64x64x4, - Chamber_64x64x4, - Chamber_Heated_64x64x4, - Fan0_64x64x4, - Fan_Slow0_64x64x4, - Fan_Slow1_64x64x4, - Fan_Fast0_64x64x4, - Fan_Fast1_64x64x4, - Feedrate_32x32x4, - Flowrate_32x32x4, - SD_64x64x4, - Menu_64x64x4, - Settings_64x64x4, - Directory_32x32x4, - Confirm_64x64x4, - Cancel_64x64x4, - Increase_64x64x4, - Decrease_64x64x4, - Back_32x32x4, - Up_32x32x4, - Down_32x32x4, - Left_32x32x4, - Right_32x32x4, - Refresh_32x32x4, - Leveling_32x32x4, - Slider8x16x4, - Home_64x64x4, - BtnRounded_64x52x4, -}; - -#if HAS_TEMP_CHAMBER && HOTENDS > 1 - #define ITEM_E0 0 - #define ITEM_E1 1 - #define ITEM_BED 2 - #define ITEM_CHAMBER 3 - #define ITEM_FAN 4 - #define ITEMS_COUNT 5 - #define POS_Y 4 -#elif HAS_TEMP_CHAMBER - #define ITEM_E0 0 - #define ITEM_BED 1 - #define ITEM_CHAMBER 2 - #define ITEM_FAN 3 - #define ITEMS_COUNT 4 - #define POS_Y 4 -#elif HOTENDS > 1 - #define ITEM_E0 0 - #define ITEM_E1 1 - #define ITEM_BED 2 - #define ITEM_FAN 3 - #define ITEMS_COUNT 4 - #define POS_Y 4 -#else - #define ITEM_E0 0 - #define ITEM_BED 1 - #define ITEM_FAN 2 - #define ITEMS_COUNT 3 - #define POS_Y 4 -#endif diff --git a/Marlin/src/lcd/tft_io/ili9328.h b/Marlin/src/lcd/tft_io/ili9328.h deleted file mode 100644 index b50517adfe..0000000000 --- a/Marlin/src/lcd/tft_io/ili9328.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_io.h" - -#include "../../inc/MarlinConfig.h" - -#define ILI9328_DRVCTL_SM 0x0400 -#define ILI9328_DRVCTL_SS 0x0100 // Select the shift direction of outputs from the source driver. 0 - from S1 to S720 / 1 - from S720 to S1 - -#define ILI9328_GATE_SCANCTL_GS 0x8000 // Sets the direction of scan by the gate driver in the range determined by SCN[4:0] and NL[4:0]. - -#define ILI9328_ETMOD_TRI 0x8000 -#define ILI9328_ETMOD_DFM 0x4000 -#define ILI9328_ETMOD_BGR 0x1000 // RGB-BGR ORDER -#define ILI9328_ETMOD_RGB 0x0000 -#define ILI9328_ETMOD_ORG 0x0080 -#define ILI9328_ETMOD_ID1 0x0020 // 0 - Vertical Decrement / 1 - Vertical Increment -#define ILI9328_ETMOD_ID0 0x0010 // 0 - Horizontal Decrement / 1 - Horizontal Increment -#define ILI9328_ETMOD_AM 0x0008 // 0 - Horizontal / 1 - Vertical - -// MKS Robin TFT v1.1 - 320x240 ; Cable on the left side - -#if TFT_ROTATION == TFT_ROTATE_180 - #define ILI9328_DRVCTL_DATA 0x0000 - #define ILI9328_GATE_SCANCTL1_DATA 0xA700 -#else - #define ILI9328_DRVCTL_DATA ILI9328_DRVCTL_SS - #define ILI9328_GATE_SCANCTL1_DATA 0x2700 -#endif - -/* -#define ILI9328_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9328_ETMOD_AM) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9328_ETMOD_ID1) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9328_ETMOD_ID0) -*/ - -#define ILI9328_ETMOD_ORIENTATION (ILI9328_ETMOD_AM | ILI9328_ETMOD_ID1 | ILI9328_ETMOD_ID0) - -#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR - #define ILI9328_ETMOD_COLOR ILI9328_ETMOD_BGR -#elif TFT_COLOR == TFT_COLOR_RGB - #define ILI9328_ETMOD_COLOR ILI9328_ETMOD_RGB -#endif - -#define ILI9328_ETMOD_DATA (ILI9328_ETMOD_ORIENTATION) | (ILI9328_ETMOD_COLOR) - - -#define ILI9328_RDDID 0x00 // ID code - 0x9328 -#define ILI9328_DRVCTL 0x01 // Driver Output Control -#define ILI9328_LCDCTL 0x02 // LCD Driving Wave Control -#define ILI9328_ETMOD 0x03 // Entry Mode - Control the GRAM update direction -#define ILI9328_RESIZECTL 0x04 // Resizing Control Register -#define ILI9328_DISCTRL1 0x07 // Display Control 1 -#define ILI9328_DISCTRL2 0x08 // Display Control 2 -#define ILI9328_DISCTRL3 0x09 // Display Control 3 -#define ILI9328_DISCTRL4 0x0A // Display Control 4 -#define ILI9328_RGBCTRL1 0x0C // RGB Display Interface Control 1 -#define ILI9328_FMARKERPOS 0x0D // Frame Marker Position -#define ILI9328_RGBCTRL2 0x0F // RGB Display Interface Control 2 -#define ILI9328_PWCTRL1 0x10 // Power Control 1 -#define ILI9328_PWCTRL2 0x11 // Power Control 2 -#define ILI9328_PWCTRL3 0x12 // Power Control 3 -#define ILI9328_PWCTRL4 0x13 // Power Control 4 - -// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X -#define ILI9328_HASET 0x20 // GRAM Horizontal Address Set (0-255) -#define ILI9328_VASET 0x21 // GRAM Vertical Address Set (0-511) -#define ILI9328_RAMWR 0x22 // Write data to GRAM -#define ILI9328_RAMRD 0x22 // Read Data from GRAM - -#define ILI9328_PWCTRL7 0x29 // Power Control 7 -#define ILI9328_FRMCTR 0x2B // Frame Rate and Color Control -#define ILI9328_GAMCTRL1 0x30 // Gamma Control -#define ILI9328_GAMCTRL2 0x31 // Gamma Control -#define ILI9328_GAMCTRL3 0x32 // Gamma Control -#define ILI9328_GAMCTRL4 0x35 // Gamma Control -#define ILI9328_GAMCTRL5 0x36 // Gamma Control -#define ILI9328_GAMCTRL6 0x37 // Gamma Control -#define ILI9328_GAMCTRL7 0x38 // Gamma Control -#define ILI9328_GAMCTRL8 0x39 // Gamma Control -#define ILI9328_GAMCTRL9 0x3C // Gamma Control -#define ILI9328_GAMCTRLA 0x3D // Gamma Control - -// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X -#define ILI9328_HASTART 0x50 // Horizontal Address Start Position (0-255) -#define ILI9328_HAEND 0x51 // Horizontal Address End Position (0-255) -#define ILI9328_VASTART 0x52 // Vertical Address Start Position (0-511) -#define ILI9328_VAEND 0x53 // Vertical Address End Position (0-511) - -#define ILI9328_GATE_SCANCTL1 0x60 // Gate Scan Control -#define ILI9328_GATE_SCANCTL2 0x61 // Gate Scan Control -#define ILI9328_GATE_SCANCTL3 0x6A // Gate Scan Control - -#define ILI9328_PLTPOS1 0x80 // Partial Image 1 Display Position -#define ILI9328_PLTSTART1 0x81 // Partial Image 1 RAM Start Address -#define ILI9328_PLTEND1 0x82 // Partial Image 1 RAM End Address -#define ILI9328_PLTPOS2 0x83 // Partial Image 2 Display Position -#define ILI9328_PLTSTART2 0x84 // Partial Image 2 RAM Start Address -#define ILI9328_PLTEND2 0x85 // Partial Image 2 RAM End Address - -#define ILI9328_IFCTL1 0x90 // Panel Interface Control 1 -#define ILI9328_IFCTL2 0x92 // Panel Interface Control 2 -#define ILI9328_IFCTL4 0x95 // Panel Interface Control 4 -#define ILI9328_IFCTL5 0x97 // Panel Interface Control 5 - -#define ILI9328_OTPWR 0xA1 // OTP VCM Programming Control -#define ILI9328_RDOTP 0xA2 // OTP VCM Status and Enable -#define ILI9328_OTPPKEY 0xA5 // OTP Programming ID Key - - -static const uint16_t ili9328_init[] = { - DATASIZE_16BIT, - ESC_REG(ILI9328_DRVCTL), ILI9328_DRVCTL_DATA, - ESC_REG(ILI9328_LCDCTL), 0x0400, // LCD Driving Wave Control - ESC_REG(ILI9328_ETMOD), ILI9328_ETMOD_DATA, - - ESC_REG(ILI9328_RESIZECTL), 0x0000, - ESC_REG(ILI9328_DISCTRL2), 0x0202, - ESC_REG(ILI9328_DISCTRL3), 0x0000, - ESC_REG(ILI9328_DISCTRL4), 0x0000, - ESC_REG(ILI9328_RGBCTRL1), 0x0000, - ESC_REG(ILI9328_FMARKERPOS), 0x0000, - ESC_REG(ILI9328_RGBCTRL2), 0x0000, - ESC_REG(ILI9328_PWCTRL1), 0x0000, - ESC_REG(ILI9328_PWCTRL2), 0x0007, - ESC_REG(ILI9328_PWCTRL3), 0x0000, - ESC_REG(ILI9328_PWCTRL4), 0x0000, - ESC_REG(ILI9328_DISCTRL1), 0x0001, - ESC_DELAY(200), - ESC_REG(ILI9328_PWCTRL1), 0x1690, - ESC_REG(ILI9328_PWCTRL2), 0x0227, - ESC_DELAY(50), - ESC_REG(ILI9328_PWCTRL3), 0x008C, - ESC_DELAY(50), - ESC_REG(ILI9328_PWCTRL4), 0x1500, - ESC_REG(ILI9328_PWCTRL7), 0x0004, - ESC_REG(ILI9328_FRMCTR), 0x000D, - ESC_DELAY(50), - ESC_REG(ILI9328_GATE_SCANCTL1), ILI9328_GATE_SCANCTL1_DATA, - ESC_REG(ILI9328_GATE_SCANCTL2), 0x0001, - ESC_REG(ILI9328_GATE_SCANCTL3), 0x0000, - ESC_REG(ILI9328_PLTPOS1), 0x0000, - ESC_REG(ILI9328_PLTSTART1), 0x0000, - ESC_REG(ILI9328_PLTEND1), 0x0000, - ESC_REG(ILI9328_PLTPOS2), 0x0000, - ESC_REG(ILI9328_PLTSTART2), 0x0000, - ESC_REG(ILI9328_PLTEND2), 0x0000, - ESC_REG(ILI9328_IFCTL1), 0x0010, - ESC_REG(ILI9328_IFCTL2), 0x0600, - ESC_REG(ILI9328_DISCTRL1), 0x0133, - ESC_END -}; diff --git a/Marlin/src/lcd/tft_io/ili9341.h b/Marlin/src/lcd/tft_io/ili9341.h deleted file mode 100644 index dda326df6d..0000000000 --- a/Marlin/src/lcd/tft_io/ili9341.h +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_io.h" - -#include "../../inc/MarlinConfig.h" - -#define ILI9341_MADCTL_MY 0x80 // Row Address Order -#define ILI9341_MADCTL_MX 0x40 // Column Address Order -#define ILI9341_MADCTL_MV 0x20 // Row/Column Exchange -#define ILI9341_MADCTL_ML 0x10 // Vertical Refresh Order -#define ILI9341_MADCTL_BGR 0x08 // RGB-BGR ORDER -#define ILI9341_MADCTL_RGB 0x00 -#define ILI9341_MADCTL_MH 0x04 // Horizontal Refresh Order - -#define ILI9341_ORIENTATION_UP ILI9341_MADCTL_MY // 240x320 ; Cable on the upper side -#define ILI9341_ORIENTATION_RIGHT ILI9341_MADCTL_MV // 320x240 ; Cable on the right side -#define ILI9341_ORIENTATION_LEFT ILI9341_MADCTL_MY | ILI9341_MADCTL_MX | ILI9341_MADCTL_MV // 320x240 ; Cable on the left side -#define ILI9341_ORIENTATION_DOWN ILI9341_MADCTL_MX // 240x320 ; Cable on the upper side - -#define ILI9341_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9341_MADCTL_MV) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9341_MADCTL_MX) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9341_MADCTL_MY) - -#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR - #define ILI9341_COLOR ILI9341_MADCTL_BGR -#elif TFT_COLOR == TFT_COLOR_RGB - #define ILI9341_COLOR ILI9341_MADCTL_RGB -#endif - -#define ILI9341_MADCTL_DATA (ILI9341_ORIENTATION) | (ILI9341_COLOR) - -#define ILI9341_NOP 0x00 // No Operation -#define ILI9341_SWRESET 0x01 // Software Reset -#define ILI9341_RDDIDIF 0x04 // Read display identification information -#define ILI9341_RDDST 0x09 // Read Display Status -#define ILI9341_RDDPM 0x0A // Read Display Power Mode -#define ILI9341_RDDMADCTL 0x0B // Read Display MADCTL -#define ILI9341_RDDCOLMOD 0x0C // Read Display Pixel Format -#define ILI9341_RDDIM 0x0D // Read Display Image Format -#define ILI9341_RDDSM 0x0E // Read Display Signal Mode -#define ILI9341_RDDSDR 0x0F // Read Display Self-Diagnostic Result -#define ILI9341_SPLIN 0x10 // Enter Sleep Mode -#define ILI9341_SLPOUT 0x11 // Sleep Out -#define ILI9341_PTLON 0x12 // Partial Mode ON -#define ILI9341_NORON 0x13 // Normal Display Mode ON -#define ILI9341_DINVOFF 0x20 // Display Inversion OFF -#define ILI9341_DINVON 0x21 // Display Inversion ON -#define ILI9341_GAMSET 0x26 // Gamma Set -#define ILI9341_DISPOFF 0x28 // Display OFF -#define ILI9341_DISPON 0x29 // Display ON -#define ILI9341_CASET 0x2A // Column Address Set -#define ILI9341_PASET 0x2B // Page Address Set -#define ILI9341_RAMWR 0x2C // Memory Write -#define ILI9341_RGBSET 0x2D // Color Set -#define ILI9341_RAMRD 0x2E // Memory Read -#define ILI9341_PLTAR 0x30 // Partial Area -#define ILI9341_VSCRDEF 0x33 // Vertical Scrolling Definition -#define ILI9341_TEOFF 0x34 // Tearing Effect Line OFF -#define ILI9341_TEON 0x35 // Tearing Effect Line ON -#define ILI9341_MADCTL 0x36 // Memory Access Control -#define ILI9341_VSCRSADD 0x37 // Vertical Scrolling Start Address -#define ILI9341_IDMOFF 0x38 // Idle Mode OFF -#define ILI9341_IDMON 0x39 // Idle Mode ON -#define ILI9341_PIXSET 0x3A // COLMOD: Pixel Format Set -#define ILI9341_WRMEMC 0x3C // Write Memory Continue -#define ILI9341_RDMEMC 0x3E // Read Memory Continue -#define ILI9341_STE 0x44 // Set Tear Scanline -#define ILI9341_GSCAN 0x45 // Get Scanline -#define ILI9341_WRDISBV 0x51 // Write Display Brightness -#define ILI9341_RDDISBV 0x52 // Read Display Brightness -#define ILI9341_WRCTRLD 0x53 // Write CTRL Display -#define ILI9341_RDCTRLD 0x54 // Read CTRL Display -#define ILI9341_WRCABC 0x55 // Write Content Adaptive Brightness Control -#define ILI9341_RDCABC 0x56 // Read Content Adaptive Brightness Control -#define ILI9341_WRCABCMB 0x5E // Write CABC Minimum Brightness / Backlight Control 1 -#define ILI9341_RDCABCMB 0x5F // Read CABC Minimum Brightness / Backlight Control 1 -#define ILI9341_RDID1 0xDA // Read ID1 -#define ILI9341_RDID2 0xDB // Read ID2 -#define ILI9341_RDID3 0xDC // Read ID3 - -#define ILI9341_IFMODE 0xB0 // RGB Interface Signal Control -#define ILI9341_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) -#define ILI9341_FRMCTR2 0xB2 // Frame Rate Control (In Idle Mode/8 colors) -#define ILI9341_FRMCTR3 0xB3 // Frame Rate control (In Partial Mode/Full Colors) -#define ILI9341_INVTR 0xB4 // Display Inversion Control -#define ILI9341_PRCTR 0xB5 // Blanking Porch Control -#define ILI9341_DISCTRL 0xB6 // Display Function Control -#define ILI9341_ETMOD 0xB7 // Entry Mode Set -#define ILI9341_BLCTL1 0xB8 // Backlight Control 1 -#define ILI9341_BLCTL2 0xB9 // Backlight Control 2 -#define ILI9341_BLCTL3 0xBA // Backlight Control 3 -#define ILI9341_BLCTL4 0xBB // Backlight Control 4 -#define ILI9341_BLCTL5 0xBC // Backlight Control 5 -#define ILI9341_BLCTL7 0xBE // Backlight Control 7 -#define ILI9341_BLCTL8 0xBF // Backlight Control 8 -#define ILI9341_PWCTRL1 0xC0 // Power Control 1 -#define ILI9341_PWCTRL2 0xC1 // Power Control 2 -#define ILI9341_VMCTRL1 0xC5 // VCOM Control 1 -#define ILI9341_VMCTRL2 0xC7 // VCOM Control 2 -#define ILI9341_PWCTRLA 0xCB // Power control A -#define ILI9341_PWCTRLB 0xCF // Power control B -#define ILI9341_NVMWR 0xD0 // NV Memory Write -#define ILI9341_NVMPKEY 0xD1 // NV Memory Protection Key -#define ILI9341_RDNVM 0xD2 // NV Memory Status Read -#define ILI9341_RDID4 0xD3 // Read ID4 - 0x009341 -#define ILI9341_PGAMCTRL 0xE0 // Positive Gamma Correction -#define ILI9341_NGAMCTRL 0xE1 // Negative Gamma Correction -#define ILI9341_DGAMCTRL1 0xE2 // Digital Gamma Control 1 -#define ILI9341_DGAMCTRL2 0xE3 // Digital Gamma Control 2 -#define ILI9341_DRVTCTLA1 0xE8 // Driver timing control A -#define ILI9341_DRVTCTLA2 0xE9 // Driver timing control A -#define ILI9341_DRVTCTLB 0xEA // Driver timing control B -#define ILI9341_PONSEQCTL 0xED // Power on sequence control -#define ILI9341_EN3G 0xF2 // Enable 3G - 3 gamma control -#define ILI9341_IFCTL 0xF6 // Interface Control -#define ILI9341_PUMPRCTL 0xF7 // Pump ratio control - - -static const uint16_t ili9341_init[] = { - DATASIZE_8BIT, - ESC_REG(ILI9341_SWRESET), ESC_DELAY(100), - ESC_REG(ILI9341_SLPOUT), ESC_DELAY(20), -/* - ESC_REG(ILI9341_PWCTRLA), 0x0039, 0x002C, 0x0000, 0x0034, 0x0002, // Power control A - ESC_REG(ILI9341_PWCTRLB), 0x0000, 0x00C1, 0x0030, // Power control B - ESC_REG(ILI9341_DRVTCTLA1), 0x0085, 0x0000, 0x0078, // Driver timing control A - ESC_REG(ILI9341_DRVTCTLB), 0x0000, 0x0000, // Driver timing control B - ESC_REG(ILI9341_PONSEQCTL), 0x0064, 0x0003, 0x0012, 0x0081, // Power on sequence control - ESC_REG(ILI9341_DISCTRL), 0x0008, 0x0082, 0x0027, // Display Function Control - ESC_REG(ILI9341_PUMPRCTL), 0x0020, // Pump ratio control - ESC_REG(ILI9341_VMCTRL1), 0x003E, 0x0028, // VCOM Control 1 - ESC_REG(ILI9341_VMCTRL2), 0x0086, // VCOM Control 2 - ESC_REG(ILI9341_FRMCTR1), 0x0000, 0x0018, // Frame Rate Control (In Normal Mode/Full Colors) - ESC_REG(ILI9341_PWCTRL1), 0x0023, // Power Control 1 - ESC_REG(ILI9341_PWCTRL2), 0x0010, // Power Control 2 -*/ - ESC_REG(ILI9341_MADCTL), ILI9341_MADCTL_DATA, - ESC_REG(ILI9341_PIXSET), 0x0055, - - /* Gamma Correction */ - ESC_REG(ILI9341_EN3G), 0x0000, // 3Gamma Function Disable - ESC_REG(ILI9341_GAMSET), 0x0001, // Gamma curve selected - ESC_REG(ILI9341_PGAMCTRL), 0x000F, 0x0031, 0x002B, 0x000C, 0x000E, 0x0008, 0x004E, 0x00F1, 0x0037, 0x0007, 0x0010, 0x0003, 0x000E, 0x0009, 0x0000, - ESC_REG(ILI9341_NGAMCTRL), 0x0000, 0x000E, 0x0014, 0x0003, 0x0011, 0x0007, 0x0031, 0x00C1, 0x0048, 0x0008, 0x000F, 0x000C, 0x0031, 0x0036, 0x000F, - - ESC_REG(ILI9341_NORON), - ESC_REG(ILI9341_DISPON), - ESC_END -}; diff --git a/Marlin/src/lcd/tft_io/ili9488.h b/Marlin/src/lcd/tft_io/ili9488.h deleted file mode 100644 index e71c0d16d7..0000000000 --- a/Marlin/src/lcd/tft_io/ili9488.h +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_io.h" - -#include "../../inc/MarlinConfig.h" - -#define ILI9488_MADCTL_MY 0x80 // Row Address Order -#define ILI9488_MADCTL_MX 0x40 // Column Address Order -#define ILI9488_MADCTL_MV 0x20 // Row/Column Exchange -#define ILI9488_MADCTL_ML 0x10 // Vertical Refresh Order -#define ILI9488_MADCTL_BGR 0x08 // RGB-BGR ORDER -#define ILI9488_MADCTL_RGB 0x00 -#define ILI9488_MADCTL_MH 0x04 // Horizontal Refresh Order - -#define ILI9488_ORIENTATION_UP ILI9488_MADCTL_MY // 320x480 ; Cable on the upper side -#define ILI9488_ORIENTATION_RIGHT ILI9488_MADCTL_MV // 480x320 ; Cable on the right side -#define ILI9488_ORIENTATION_LEFT ILI9488_MADCTL_MY | ILI9488_MADCTL_MX | ILI9488_MADCTL_MV // 480x320 ; Cable on the left side -#define ILI9488_ORIENTATION_DOWN ILI9488_MADCTL_MX // 320x480 ; Cable on the upper side - -#define ILI9488_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9488_MADCTL_MV) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9488_MADCTL_MX) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9488_MADCTL_MY) - -#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR - #define ILI9488_COLOR ILI9488_MADCTL_BGR -#elif TFT_COLOR == TFT_COLOR_RGB - #define ILI9488_COLOR ILI9488_MADCTL_RGB -#endif - -#define ILI9488_MADCTL_DATA (ILI9488_ORIENTATION) | (ILI9488_COLOR) - -#define ILI9488_NOP 0x00 // No Operation -#define ILI9488_SWRESET 0x01 // Software Reset -#define ILI9488_RDDIDIF 0x04 // Read Display Identification Information -#define ILI9488_RDNUMED 0x05 // Read Number of the Errors on DSI -#define ILI9488_RDDST 0x09 // Read Display Status -#define ILI9488_RDDPM 0x0A // Read Display Power Mode -#define ILI9488_RDDMADCTL 0x0B // Read Display MADCTL -#define ILI9488_RDDCOLMOD 0x0C // Read Display COLMOD -#define ILI9488_RDDIM 0x0D // Read Display Image Mode -#define ILI9488_RDDSM 0x0E // Read Display Signal Mode -#define ILI9488_RDDSDR 0x0F // Read Display Self-Diagnostic Result -#define ILI9488_SLPIN 0x10 // Sleep IN -#define ILI9488_SLPOUT 0x11 // Sleep OUT -#define ILI9488_PTLON 0x12 // Partial Mode ON -#define ILI9488_NORON 0x13 // Normal Display Mode ON -#define ILI9488_INVOFF 0x20 // Display Inversion OFF -#define ILI9488_INVON 0x21 // Display Inversion ON -#define ILI9488_ALLPOFF 0x22 // All Pixels OFF -#define ILI9488_ALLPON 0x23 // All Pixels ON -#define ILI9488_DISOFF 0x28 // Display OFF -#define ILI9488_DISON 0x29 // Display ON -#define ILI9488_CASET 0x2A // Column Address Set -#define ILI9488_PASET 0x2B // Page Address Set -#define ILI9488_RAMWR 0x2C // Memory Write -#define ILI9488_RAMRD 0x2E // Memory Read -#define ILI9488_PLTAR 0x30 // Partial Area -#define ILI9488_VSCRDEF 0x33 // Vertical Scrolling Definition -#define ILI9488_TEOFF 0x34 // Tearing Effect Line OFF -#define ILI9488_TEON 0x35 // Tearing Effect Line ON -#define ILI9488_MADCTL 0x36 // Memory Access Control -#define ILI9488_VSCRSADD 0x37 // Vertical Scrolling Start Address -#define ILI9488_IDMOFF 0x38 // Idle Mode OFF -#define ILI9488_IDMON 0x39 // Idle Mode ON -#define ILI9488_COLMOD 0x3A // Interface Pixel Format -#define ILI9488_RAMWRC 0x3C // Memory Write Continue -#define ILI9488_RAMRDRC 0x3E // Memory Read Continue -#define ILI9488_TESLWR 0x44 // Write Tear Scan Line -#define ILI9488_TESLRD 0x45 // Read Scan Line -#define ILI9488_WRDISBV 0x51 // Write Display Brightness Value -#define ILI9488_RDDISBV 0x52 // Read Display Brightness Value -#define ILI9488_WRCTRLD 0x53 // Write Control Display Value -#define ILI9488_RDCTRLD 0x54 // Read Control Display Value -#define ILI9488_WRCABC 0x55 // Write Content Adaptive Brightness Control Value -#define ILI9488_RDCABC 0x56 // Read Content Adaptive Brightness Control Value -#define ILI9488_WRCABCMB 0x5E // Write CABC Minimum Brightness -#define ILI9488_RDCABCMB 0x5F // Read CABC Minimum Brightness -#define ILI9488_RDABCSDR 0x68 // Read Automatic Brightness Control Self-diagnostic Result -#define ILI9488_RDID1 0xDA // Read ID1 -#define ILI9488_RDID2 0xDB // Read ID2 -#define ILI9488_RDID3 0xDC // Read ID3 - -#define ILI9488_IFMODE 0xB0 // Interface Mode Control -#define ILI9488_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) -#define ILI9488_FRMCTR2 0xB2 // Frame Rate Control (In Idle Mode/8 Colors) -#define ILI9488_FRMCTR3 0xB3 // Frame Rate Control (In Partial Mode/Full Colors) -#define ILI9488_INVTR 0xB4 // Display Inversion Control -#define ILI9488_PRCTR 0xB5 // Blanking Porch Control -#define ILI9488_DISCTRL 0xB6 // Display Function Control -#define ILI9488_ETMOD 0xB7 // Entry Mode Set -#define ILI9488_CECTRL1 0xB9 // Color Enhancement Control 1 -#define ILI9488_CECTRL2 0xBA // Color Enhancement Control 2 -#define ILI9488_HSLCTRL 0xBE // HS Lanes Control -#define ILI9488_PWCTRL1 0xC0 // Power Control 1 -#define ILI9488_PWCTRL2 0xC1 // Power Control 2 -#define ILI9488_PWCTRL3 0xC2 // Power Control 3 (For Normal Mode) -#define ILI9488_PWCTRL4 0xC3 // Power Control 4 (For Idle Mode) -#define ILI9488_PWCTRL5 0xC4 // Power Control 5 (For Partial Mode) -#define ILI9488_VMCTRL 0xC5 // VCOM Control -#define ILI9488_CABCCTRL1 0xC6 // CABC Control 1 -#define ILI9488_CABCCTRL2 0xC8 // CABC Control 2 -#define ILI9488_CABCCTRL3 0xC9 // CABC Control 3 -#define ILI9488_CABCCTRL4 0xCA // CABC Control 4 -#define ILI9488_CABCCTRL5 0xCB // CABC Control 5 -#define ILI9488_CABCCTRL6 0xCC // CABC Control 6 -#define ILI9488_CABCCTRL7 0xCD // CABC Control 7 -#define ILI9488_CABCCTRL8 0xCE // CABC Control 8 -#define ILI9488_CABCCTRL9 0xCF // CABC Control 9 -#define ILI9488_NVMWR 0xD0 // NV Memory Write -#define ILI9488_NVMPKEY 0xD1 // NV Memory Protection Key -#define ILI9488_RDNVM 0xD2 // NV Memory Status Read -#define ILI9488_RDID4 0xD3 // Read ID4 - 0x009488 -#define ILI9488_ADJCTL1 0xD7 // Adjust Control 1 -#define ILI9488_RDIDV 0xD8 // Read ID Version -#define ILI9488_PGAMCTRL 0xE0 // Positive Gamma Control -#define ILI9488_NGAMCTRL 0xE1 // Negative Gamma Control -#define ILI9488_DGAMCTRL1 0xE2 // Ditigal Gamma Control 1 -#define ILI9488_DGAMCTRL2 0xE3 // Ditigal Gamma Control 2 -#define ILI9488_SETIMAGE 0xE9 // Set Image Function -#define ILI9488_ADJCTL2 0xF2 // Adjust Control 2 -#define ILI9488_ADJCTL3 0xF7 // Adjust Control 3 -#define ILI9488_ADJCTL4 0xF8 // Adjust Control 4 -#define ILI9488_ADJCTL5 0xF9 // Adjust Control 5 -#define ILI9488_RDEXTC 0xFB // Read EXTC command is SPI mode -#define ILI9488_ADJCTL6 0xFC // Adjust Control 6 -#define ILI9488_ADJCTL7 0xFF // Adjust Control 7 - -static const uint16_t ili9488_init[] = { - DATASIZE_8BIT, - ESC_REG(ILI9488_SWRESET), ESC_DELAY(120), - ESC_REG(ILI9488_SLPOUT), ESC_DELAY(20), - - ESC_REG(ILI9488_MADCTL), ILI9488_MADCTL_DATA, - ESC_REG(ILI9488_COLMOD), 0x0055, - - /* Gamma Correction. */ - ESC_REG(ILI9488_PGAMCTRL), 0x0000, 0x0003, 0x0009, 0x0008, 0x0016, 0x000A, 0x003F, 0x0078, 0x004C, 0x0009, 0x000A, 0x0008, 0x0016, 0x001A, 0x000F, - ESC_REG(ILI9488_NGAMCTRL), 0x0000, 0x0016, 0x0019, 0x0003, 0x000F, 0x0005, 0x0032, 0x0045, 0x0046, 0x0004, 0x000E, 0x000D, 0x0035, 0x0037, 0x000F, - - ESC_REG(ILI9488_NORON), - ESC_REG(ILI9488_DISON), - ESC_END -}; diff --git a/Marlin/src/lcd/tft_io/r65105.h b/Marlin/src/lcd/tft_io/r65105.h deleted file mode 100644 index 8be2afe442..0000000000 --- a/Marlin/src/lcd/tft_io/r65105.h +++ /dev/null @@ -1,176 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_io.h" - -#include "../../inc/MarlinConfig.h" - -#define R61505_DRVCTL_SM 0x0400 -#define R61505_DRVCTL_SS 0x0100 // Select the shift direction of outputs from the source driver. 0 - from S1 to S720 / 1 - from S720 to S1 - -#define R61505_ETMOD_TRIGGER 0x8000 // 18-bit RAM when set; 16-bit RAM when not set -#define R61505_ETMOD_DFM 0x4000 -#define R61505_ETMOD_BGR 0x1000 // RGB-BGR ORDER -#define R61505_ETMOD_RGB 0x0000 - -#define R61505_ETMOD_HWM 0x0020 -#define R61505_ETMOD_ORG 0x0080 -#define R61505_ETMOD_ID1 0x0020 // 0 - Vertical Decrement / 1 - Vertical Increment -#define R61505_ETMOD_ID0 0x0010 // 0 - Horizontal Decrement / 1 - Horizontal Increment -#define R61505_ETMOD_AM 0x0008 // 0 - Horizontal / 1 - Vertical - -#define R61505_DRVCTRL_GS 0x8000 // Gate Scan direction - -// MKS Robin TFT v1.1 - 320x240 ; Cable on the left side - -#if TFT_ROTATION == TFT_ROTATE_180 - #define R61505_DRVCTL_DATA 0x0000 - #define R61505_DRVCTRL_DATA (0x2700 | R61505_DRVCTRL_GS) -#else - #define R61505_DRVCTL_DATA R61505_DRVCTL_SS - #define R61505_DRVCTRL_DATA 0x2700 -#endif - -/* -#define R61505_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, R61505_ETMOD_AM) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_X, R61505_ETMOD_ID0) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, R61505_ETMOD_ID1) -*/ - -#define R61505_ETMOD_ORIENTATION (R61505_ETMOD_AM | R61505_ETMOD_ID0 | R61505_ETMOD_ID1) - -#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR - #define R61505_ETMOD_COLOR R61505_ETMOD_BGR -#elif TFT_COLOR == TFT_COLOR_RGB - #define R61505_ETMOD_COLOR R61505_ETMOD_RGB -#endif - -#define R61505_ETMOD_DATA (R61505_ETMOD_ORIENTATION) | (R61505_ETMOD_COLOR) - - -#define R61505_RDDID 0x00 // ID code - 0x1505 -#define R61505_DRVCTL 0x01 // Driver Output Control -#define R61505_LCDCTL 0x02 // LCD Driving Wave Control -#define R61505_ETMOD 0x03 // Entry Mode - Control the GRAM update direction -#define R61505_RESIZECTL 0x04 // Resizing Control Register -#define R61505_DISCTRL1 0x07 // Display Control 1 -#define R61505_DISCTRL2 0x08 // Display Control 2 -#define R61505_DISCTRL3 0x09 // Display Control 3 -#define R61505_DISCTRL4 0x0A // Display Control 4 -#define R61505_RGBCTRL1 0x0C // RGB Display Interface Control 1 -#define R61505_FMARKERPOS 0x0D // Frame Marker Position -#define R61505_RGBCTRL2 0x0F // RGB Display Interface Control 2 -#define R61505_PWCTRL1 0x10 // Power Control 1 -#define R61505_PWCTRL2 0x11 // Power Control 2 -#define R61505_PWCTRL3 0x12 // Power Control 3 -#define R61505_PWCTRL4 0x13 // Power Control 4 - -// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X -#define R61505_HASET 0x20 // GRAM Horizontal Address Set (0-255) -#define R61505_VASET 0x21 // GRAM Vertical Address Set (0-511) -#define R61505_RAMWR 0x22 // Write data to GRAM -#define R61505_RAMRD 0x22 // Read Data from GRAM - -#define R61505_PWCTRL7 0x29 // Power Control 7 -#define R61505_GAMCTRL1 0x30 // Gamma Control -#define R61505_GAMCTRL2 0x31 // Gamma Control -#define R61505_GAMCTRL3 0x32 // Gamma Control -#define R61505_GAMCTRL4 0x35 // Gamma Control -#define R61505_GAMCTRL5 0x36 // Gamma Control -#define R61505_GAMCTRL6 0x37 // Gamma Control -#define R61505_GAMCTRL7 0x38 // Gamma Control -#define R61505_GAMCTRL8 0x39 // Gamma Control -#define R61505_GAMCTRL9 0x3C // Gamma Control -#define R61505_GAMCTRLA 0x3D // Gamma Control - -// With landscape screen orientation 'Horizontal' is Y and 'Vertical' is X -#define R61505_HASTART 0x50 // Horizontal Address Start Position (0-255) -#define R61505_HAEND 0x51 // Horizontal Address End Position (0-255) -#define R61505_VASTART 0x52 // Vertical Address Start Position (0-511) -#define R61505_VAEND 0x53 // Vertical Address End Position (0-511) - -#define R61505_DRVCTRL 0x60 // Driver Output Control -#define R61505_BASE_IMAGE_CTRL 0x61 // Base Image Display Control -#define R61505_VSCROLL_CTRL 0x6A // Vertical Scroll Control - -#define R61505_PLTPOS1 0x80 // Partial Image 1 Display Position -#define R61505_PLTSTART1 0x81 // Partial Image 1 RAM Start Address -#define R61505_PLTEND1 0x82 // Partial Image 1 RAM End Address -#define R61505_PLTPOS2 0x83 // Partial Image 2 Display Position -#define R61505_PLTSTART2 0x84 // Partial Image 2 RAM Start Address -#define R61505_PLTEND2 0x85 // Partial Image 2 RAM End Address - -#define R61505_IFCTL1 0x90 // Panel Interface Control 1 -#define R61505_IFCTL2 0x92 // Panel Interface Control 2 -#define R61505_IFCTL3 0x93 // Panel Interface Control 3 -#define R61505_IFCTL4 0x95 // Panel Interface Control 4 -#define R61505_IFCTL5 0x97 // Panel Interface Control 5 -#define R61505_IFCTL6 0x98 // Panel Interface Control 6 - -#define R61505_OSC_CTRL 0xA4 // Oscillation Control - - -static const uint16_t r61505_init[] = { - DATASIZE_16BIT, - ESC_REG(R61505_DRVCTL), R61505_DRVCTL_DATA, - ESC_REG(R61505_LCDCTL), 0x0700, // LCD Driving Wave Control - ESC_REG(R61505_ETMOD), R61505_ETMOD_DATA, - - ESC_REG(R61505_RESIZECTL), 0x0000, - ESC_REG(R61505_DISCTRL1), 0x0173, - ESC_REG(R61505_DISCTRL2), 0x0202, - ESC_REG(R61505_DISCTRL3), 0x0000, - ESC_REG(R61505_DISCTRL4), 0x0000, - ESC_REG(R61505_RGBCTRL1), 0x0000, - ESC_REG(R61505_FMARKERPOS), 0x0000, - ESC_REG(R61505_RGBCTRL2), 0x0000, - - ESC_REG(R61505_PWCTRL1), 0x17B0, - ESC_REG(R61505_PWCTRL2), 0x0037, - ESC_REG(R61505_PWCTRL3), 0x0138, - ESC_REG(R61505_PWCTRL4), 0x1700, - ESC_REG(R61505_PWCTRL7), 0x000D, - - ESC_REG(R61505_GAMCTRL1), 0x0001, - ESC_REG(R61505_GAMCTRL2), 0x0606, - ESC_REG(R61505_GAMCTRL3), 0x0304, - ESC_REG(R61505_GAMCTRL4), 0x0103, - ESC_REG(R61505_GAMCTRL5), 0x011D, - ESC_REG(R61505_GAMCTRL6), 0x0404, - ESC_REG(R61505_GAMCTRL7), 0x0404, - ESC_REG(R61505_GAMCTRL8), 0x0404, - ESC_REG(R61505_GAMCTRL9), 0x0700, - ESC_REG(R61505_GAMCTRLA), 0x0A1F, - - ESC_REG(R61505_DRVCTRL), R61505_DRVCTRL_DATA, - ESC_REG(R61505_BASE_IMAGE_CTRL), 0x0001, - ESC_REG(R61505_VSCROLL_CTRL), 0x0000, - - ESC_REG(R61505_IFCTL1), 0x0010, - ESC_REG(R61505_IFCTL2), 0x0000, - ESC_REG(R61505_IFCTL3), 0x0003, - ESC_REG(R61505_IFCTL4), 0x0101, - ESC_REG(R61505_IFCTL5), 0x0000, - ESC_REG(R61505_IFCTL6), 0x0000, - ESC_END -}; diff --git a/Marlin/src/lcd/tft_io/ssd1963.h b/Marlin/src/lcd/tft_io/ssd1963.h deleted file mode 100644 index 4953a96233..0000000000 --- a/Marlin/src/lcd/tft_io/ssd1963.h +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_io.h" - -#include "../../inc/MarlinConfig.h" - -#define SSD1963_MADCTL_MY 0x80 // Row Address Order -#define SSD1963_MADCTL_MX 0x40 // Column Address Order -#define SSD1963_MADCTL_MV 0x20 // Row/Column Exchange -#define SSD1963_MADCTL_MH 0x10 // Horizontal Refresh Order -#define SSD1963_MADCTL_BGR 0x08 // RGB-BGR ORDER -#define SSD1963_MADCTL_RGB 0x00 -#define SSD1963_MADCTL_ML 0x04 // Vertical Refresh Order -#define SSD1963_MADCTL_FH 0x02 // Flip Horizontal -#define SSD1963_MADCTL_FV 0x01 // Flip Vertical - -#define SSD1963_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, SSD1963_MADCTL_MV) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_X, SSD1963_MADCTL_FH) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, SSD1963_MADCTL_FV) - -#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR - #define SSD1963_COLOR SSD1963_MADCTL_BGR -#elif TFT_COLOR == TFT_COLOR_RGB - #define SSD1963_COLOR SSD1963_MADCTL_RGB -#endif - -#define SSD1963_MADCTL_DATA (SSD1963_ORIENTATION) | (SSD1963_COLOR) - -#define SSD1963_NOP 0x00 // No Operation -#define SSD1963_SWRESET 0x01 // Software reset -#define SSD1963_RDDPM 0x0A // Read Display Power Mode -#define SSD1963_RDDMADCTL 0x0B // Read Display MADCTL -#define SSD1963_RDDCOLMOD 0x0C // Read Display Pixel Format -#define SSD1963_RDDIM 0x0D // Read Display Image Mode -#define SSD1963_RDDSM 0x0E // Read Display Signal Mode -#define SSD1963_SLPIN 0x10 // Sleep In -#define SSD1963_SLPOUT 0x11 // Sleep Out -#define SSD1963_PTLON 0x12 // Partial Display Mode On -#define SSD1963_NORON 0x13 // Normal Display Mode On -#define SSD1963_INVOFF 0x20 // Display Inversion Off -#define SSD1963_INVON 0x21 // Display Inversion On -#define SSD1963_GAMSET 0x26 // Gamma Set -#define SSD1963_DISPOFF 0x28 // Display Off -#define SSD1963_DISPON 0x29 // Display On -#define SSD1963_CASET 0x2A // Column Address Set -#define SSD1963_RASET 0x2B // Row Address Set -#define SSD1963_RAMWR 0x2C // Memory Write -#define SSD1963_RAMRD 0x2E // Memory Read -#define SSD1963_PTLAR 0x30 // Partial Area -#define SSD1963_VSCRDEF 0x33 // Vertical Scrolling Definition -#define SSD1963_TEOFF 0x34 // Tearing Effect Line OFF -#define SSD1963_TEON 0x35 // Tearing Effect Line ON -#define SSD1963_MADCTL 0x36 // Memory Data Access Control -#define SSD1963_VSCSAD 0x37 // Vertical Scroll Start Address of RAM -#define SSD1963_IDMOFF 0x38 // Idle Mode Off -#define SSD1963_IDMON 0x39 // Idle Mode On -#define SSD1963_WRMEMC 0x3C // Write Memory Continue -#define SSD1963_RDMEMC 0x3E // Read Memory Continue -#define SSD1963_STE 0x44 // Set Tear Scanline -#define SSD1963_GSCAN 0x45 // Get Scanline -#define SSD1963_WRDISBV 0x51 // Write Display Brightness -#define SSD1963_RDDISBV 0x52 // Read Display Brightness -#define SSD1963_WRCTRLD 0x53 // Write CTRL Display -#define SSD1963_RDCTRLD 0x54 // Read CTRL Value Display -#define SSD1963_WRCACE 0x55 // Write Content Adaptive Brightness Control and Color Enhancement -#define SSD1963_RDCABC 0x56 // Read Content Adaptive Brightness Control -#define SSD1963_WRCABCMB 0x5E // Write CABC Minimum Brightness -#define SSD1963_RDCABCMB 0x5F // Read CABC Minimum Brightness -#define SSD1963_RDABCSDR 0x68 // Read Automatic Brightness Control Self-Diagnostic Result -#define SSD1963_RDDDB 0xA1 // Read Device Descriptor Block -#define SSD1963_SLCDMODE 0xB0 // Set the LCD panel mode and resolution -#define SSD1963_SHSYNC 0xB4 // Set HSYNC -#define SSD1963_GHSYNC 0xB5 // Get HSYNC -#define SSD1963_SVSYNC 0xB6 // Set VSYNC -#define SSD1963_GVSYNC 0xB7 // Get VSYNC -#define SSD1963_SGPIOCFG 0xB8 // Set GPIO Conf -#define SSD1963_SGPIOV 0xBA // Set GPIO Value -#define SSD1963_SPWMCFG 0xBE // Set PWM Conf -#define SSD1963_GPWMCFG 0xBF // Get PWM Conf -#define SSD1963_SDBCCFG 0xD0 // Set Dynamic Back Light Config -#define SSD1963_GDBCCFG 0xD1 // Get Dynamic Back Light Config -#define SSD1963_PLLON 0xE0 // PLL Enable -#define SSD1963_PLLMN 0xE2 // Set PLL Multiplier -#define SSD1963_SLSHIFT 0xE6 // Set the LSHIFT (pixel clock) frequency -#define SSD1963_COLMOD 0xF0 // Interface Pixel Format - -static const uint16_t ssd1963_init[] = { - DATASIZE_8BIT, - ESC_REG(SSD1963_PLLMN), 0x0023, 0x0002, 0x0054, - ESC_REG(SSD1963_PLLON), 0x0001, ESC_DELAY(10), - ESC_REG(SSD1963_PLLON), 0x0003, ESC_DELAY(10), - ESC_REG(SSD1963_SWRESET), ESC_DELAY(100), - - ESC_REG(SSD1963_SLSHIFT), 0x0001, 0x001F, 0x00FF, - ESC_REG(SSD1963_SLCDMODE), 0x0020, 0x0000, 0x0001, 0x00DF, 0x0001, 0x000F, 0x0000, - ESC_REG(SSD1963_SHSYNC), 0x0002, 0x0013, 0x0000, 0x0008, 0x002B, 0x0000, 0x0002, 0x0000, - ESC_REG(SSD1963_SVSYNC), 0x0001, 0x0020, 0x0000, 0x0004, 0x000C, 0x0000, 0x0002, - ESC_REG(SSD1963_SGPIOV), 0x000F, - ESC_REG(SSD1963_SGPIOCFG), 0x0007, 0x0001, - - ESC_REG(SSD1963_MADCTL), SSD1963_MADCTL_DATA, - ESC_REG(SSD1963_COLMOD), 0x0003, ESC_DELAY(1),//RBG 565 - - ESC_REG(SSD1963_NORON), - ESC_REG(SSD1963_DISPON), - - ESC_REG(SSD1963_SPWMCFG), 0x0006, 0x00f0, 0x0001, 0x00f0, 0x0000, 0x0000, - ESC_REG(SSD1963_SDBCCFG), 0x000D, - ESC_END -}; diff --git a/Marlin/src/lcd/tft_io/st7735.h b/Marlin/src/lcd/tft_io/st7735.h deleted file mode 100644 index 1b0d23b6c4..0000000000 --- a/Marlin/src/lcd/tft_io/st7735.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_io.h" - -#include "../../inc/MarlinConfig.h" - -#define ST7735_MADCTL_MY 0x80 // Row Address Order -#define ST7735_MADCTL_MX 0x40 // Column Address Order -#define ST7735_MADCTL_MV 0x20 // Row/Column Exchange -#define ST7735_MADCTL_ML 0x10 // Vertical Refresh Order -#define ST7735_MADCTL_BGR 0x08 // RGB-BGR ORDER -#define ST7735_MADCTL_RGB 0x00 -#define ST7735_MADCTL_MH 0x04 // Horizontal Refresh Order - -#define ST7735_ORIENTATION_UP 0x00 // 128x160 ; Cable on the upper side -#define ST7735_ORIENTATION_RIGHT ST7735_MADCTL_MV | ST7735_MADCTL_MY // 160x128 ; Cable on the right side -#define ST7735_ORIENTATION_LEFT ST7735_MADCTL_MV | ST7735_MADCTL_MX // 160x128 ; Cable on the left side -#define ST7735_ORIENTATION_DOWN ST7735_MADCTL_MX | ST7735_MADCTL_MY // 128x160 ; Cable on the lower side - -#define ST7735_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ST7735_MADCTL_MV) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ST7735_MADCTL_MX) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ST7735_MADCTL_MY) - -#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_RGB - #define ST7735_COLOR ST7735_MADCTL_RGB -#elif TFT_COLOR == TFT_COLOR_BGR - #define ST7735_COLOR ST7735_MADCTL_BGR -#endif - -#define ST7735_MADCTL_DATA (ST7735_ORIENTATION) | (ST7735_COLOR) - -#define ST7735_NOP 0x00 // No Operation -#define ST7735_SWRESET 0x01 // Software reset -#define ST7735_RDDID 0x04 // Read Display ID -#define ST7735_RDDST 0x09 // Read Display Status -#define ST7735_RDDPM 0x0A // Read Display Power Mode -#define ST7735_RDDMADCTL 0x0B // Read Display MADCTL -#define ST7735_RDDCOLMOD 0x0C // Read Display Pixel Format -#define ST7735_RDDIM 0x0D // Read Display Image Mode -#define ST7735_RDDSM 0x0E // Read Display Signal Mode -#define ST7735_SLPIN 0x10 // Sleep In -#define ST7735_SLPOUT 0x11 // Sleep Out -#define ST7735_PTLON 0x12 // Partial Display Mode On -#define ST7735_NORON 0x13 // Normal Display Mode On -#define ST7735_INVOFF 0x20 // Display Inversion Off -#define ST7735_INVON 0x21 // Display Inversion On -#define ST7735_GAMSET 0x26 // Gamma Set -#define ST7735_DISPOFF 0x28 // Display Off // The delay time between DISPON and DISPOFF needs 120ms at least. -#define ST7735_DISPON 0x29 // Display On -#define ST7735_CASET 0x2A // Column Address Set -#define ST7735_RASET 0x2B // Row Address Set -#define ST7735_RAMWR 0x2C // Memory Write -#define ST7735_RAMRD 0x2E // Memory Read -#define ST7735_PTLAR 0x30 // Partial Area -#define ST7735_TEOFF 0x34 // Tearing Effect Line OFF -#define ST7735_TEON 0x35 // Tearing Effect Line ON -#define ST7735_MADCTL 0x36 // Memory Data Access Control -#define ST7735_IDMOFF 0x38 // Idle Mode Off -#define ST7735_IDMON 0x39 // Idle Mode On -#define ST7735_COLMOD 0x3A // Interface Pixel Format -#define ST7735_RDID1 0xDA // Read ID1 Value -#define ST7735_RDID2 0xDB // Read ID2 Value -#define ST7735_RDID3 0xDC // Read ID3 Value - -#define ST7735_FRMCTR1 0xB1 // Frame Rate Control (In normal mode/ Full colors) -#define ST7735_FRMCTR2 0xB2 // Frame Rate Control (In Idle mode/ 8-colors) -#define ST7735_FRMCTR3 0xB3 // Frame Rate Control (In Partial mode/ full colors) -#define ST7735_INVCTR 0xB4 // Display Inversion Control -#define ST7735_DISSET5 0xB6 // Display Function set 5 -#define ST7735_PWCTR1 0xC0 // Power Control 1 -#define ST7735_PWCTR2 0xC1 // Power Control 2 -#define ST7735_PWCTR3 0xC2 // Power Control 3 (in Normal mode/ Full colors) -#define ST7735_PWCTR4 0xC3 // Power Control 4 (in Idle mode/ 8-colors) -#define ST7735_PWCTR5 0xC4 // Power Control 5 (in Partial mode/ full-colors) -#define ST7735_VMCTR1 0xC5 // VCOM Control 1 -#define ST7735_VMOFCTR 0xC7 // VCOM Offset Control -#define ST7735_WRID2 0xD1 // Write ID2 Value -#define ST7735_WRID3 0xD2 // Write ID3 Value -#define ST7735_PWCTR6 0xFC // Power Control 5 (in Partial mode + Idle mode) -#define ST7735_NVFCTR1 0xD9 // EEPROM Control Status -#define ST7735_NVFCTR2 0xDE // EEPROM Read Command -#define ST7735_NVFCTR3 0xDF // EEPROM Write Command -#define ST7735_GMCTRP1 0xE0 // Gamma (‘+’polarity) Correction Characteristics Setting -#define ST7735_GMCTRN1 0xE1 // GMCTRN1 (E1h): Gamma ‘-’polarity Correction Characteristics Setting -#define ST7735_EXTCTRL 0xF0 // Extension Command Control -#define ST7735_VCOM4L 0xFF // Vcom 4 Level Control - -static const uint16_t st7735_init[] = { - DATASIZE_8BIT, - ESC_REG(ST7735_SWRESET), ESC_DELAY(100), - ESC_REG(ST7735_SLPOUT), ESC_DELAY(20), -/* - ESC_REG(ST7735_FRMCTR1), 0x0001, 0x002C, 0x002D, - ESC_REG(ST7735_FRMCTR2), 0x0001, 0x002C, 0x002D, - ESC_REG(ST7735_FRMCTR3), 0x0001, 0x002C, 0x002D, 0x0001, 0x002C, 0x002D, - ESC_REG(ST7735_INVCTR), 0x0007, - ESC_REG(ST7735_PWCTR1), 0x00A2, 0x0002, 0x0084, - ESC_REG(ST7735_PWCTR2), 0x00C5, - ESC_REG(ST7735_PWCTR3), 0x000A, 0x0000, - ESC_REG(ST7735_PWCTR4), 0x008A, 0x002A, - ESC_REG(ST7735_PWCTR5), 0x008A, 0x00EE, - ESC_REG(ST7735_VMCTR1), 0x000E, - ESC_REG(ST7735_INVOFF), -*/ - ESC_REG(ST7735_MADCTL), ST7735_MADCTL_DATA, - ESC_REG(ST7735_COLMOD), 0x0005, - - /* Gamma Correction. Colors with 'after-reset' settings are bleak */ - ESC_REG(ST7735_GMCTRP1), 0x0002, 0x001C, 0x0007, 0x0012, 0x0037, 0x0032, 0x0029, 0x002D, 0x0029, 0x0025, 0x002B, 0x0039, 0x0000, 0x0001, 0x0003, 0x0010, - ESC_REG(ST7735_GMCTRN1), 0x0003, 0x001D, 0x0007, 0x0006, 0x002E, 0x002C, 0x0029, 0x002D, 0x002E, 0x002E, 0x0037, 0x003F, 0x0000, 0x0000, 0x0002, 0x0010, - - ESC_REG(ST7735_NORON), - ESC_REG(ST7735_DISPON), - ESC_END -}; diff --git a/Marlin/src/lcd/tft_io/st7789v.h b/Marlin/src/lcd/tft_io/st7789v.h deleted file mode 100644 index d0cf969c66..0000000000 --- a/Marlin/src/lcd/tft_io/st7789v.h +++ /dev/null @@ -1,156 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_io.h" - -#include "../../inc/MarlinConfig.h" - -#define ST7789V_MADCTL_MY 0x80 // Row Address Order -#define ST7789V_MADCTL_MX 0x40 // Column Address Order -#define ST7789V_MADCTL_MV 0x20 // Row/Column Exchange -#define ST7789V_MADCTL_ML 0x10 // Vertical Refresh Order -#define ST7789V_MADCTL_BGR 0x08 // RGB-BGR ORDER -#define ST7789V_MADCTL_RGB 0x00 -#define ST7789V_MADCTL_MH 0x04 // Horizontal Refresh Order - -#define ST7789V_ORIENTATION_UP ST7789V_MADCTL_MX | ST7789V_MADCTL_MY // 240x320 ; Cable on the upper side -#define ST7789V_ORIENTATION_RIGHT ST7789V_MADCTL_MX | ST7789V_MADCTL_MV // 320x240 ; Cable on the right side -#define ST7789V_ORIENTATION_LEFT ST7789V_MADCTL_MY | ST7789V_MADCTL_MV // 320x240 ; Cable on the left side -#define ST7789V_ORIENTATION_DOWN 0 // 240x320 ; Cable on the lower side - -#define ST7789V_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ST7789V_MADCTL_MV) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ST7789V_MADCTL_MX) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ST7789V_MADCTL_MY) - -#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_RGB - #define ST7789V_COLOR ST7789V_MADCTL_RGB -#elif TFT_COLOR == TFT_COLOR_BGR - #define ST7789V_COLOR ST7789V_MADCTL_BGR -#endif - -#define ST7789V_MADCTL_DATA (ST7789V_ORIENTATION) | (ST7789V_COLOR) - -#define ST7789V_NOP 0x00 // No Operation -#define ST7789V_SWRESET 0x01 // Software reset -#define ST7789V_RDDID 0x04 // Read Display ID -#define ST7789V_RDDST 0x09 // Read Display Status -#define ST7789V_RDDPM 0x0A // Read Display Power Mode -#define ST7789V_RDDMADCTL 0x0B // Read Display MADCTL -#define ST7789V_RDDCOLMOD 0x0C // Read Display Pixel Format -#define ST7789V_RDDIM 0x0D // Read Display Image Mode -#define ST7789V_RDDSM 0x0E // Read Display Signal Mode -#define ST7789V_RDDSDR 0x0F // Read Display Self-Diagnostic Result -#define ST7789V_SLPIN 0x10 // Sleep In -#define ST7789V_SLPOUT 0x11 // Sleep Out -#define ST7789V_PTLON 0x12 // Partial Display Mode On -#define ST7789V_NORON 0x13 // Normal Display Mode On -#define ST7789V_INVOFF 0x20 // Display Inversion Off -#define ST7789V_INVON 0x21 // Display Inversion On -#define ST7789V_GAMSET 0x26 // Gamma Set -#define ST7789V_DISPOFF 0x28 // Display Off -#define ST7789V_DISPON 0x29 // Display On -#define ST7789V_CASET 0x2A // Column Address Set -#define ST7789V_RASET 0x2B // Row Address Set -#define ST7789V_RAMWR 0x2C // Memory Write -#define ST7789V_RAMRD 0x2E // Memory Read -#define ST7789V_PTLAR 0x30 // Partial Area -#define ST7789V_VSCRDEF 0x33 // Vertical Scrolling Definition -#define ST7789V_TEOFF 0x34 // Tearing Effect Line OFF -#define ST7789V_TEON 0x35 // Tearing Effect Line ON -#define ST7789V_MADCTL 0x36 // Memory Data Access Control -#define ST7789V_VSCSAD 0x37 // Vertical Scroll Start Address of RAM -#define ST7789V_IDMOFF 0x38 // Idle Mode Off -#define ST7789V_IDMON 0x39 // Idle Mode On -#define ST7789V_COLMOD 0x3A // Interface Pixel Format -#define ST7789V_WRMEMC 0x3C // Write Memory Continue -#define ST7789V_RDMEMC 0x3E // Read Memory Continue -#define ST7789V_STE 0x44 // Set Tear Scanline -#define ST7789V_GSCAN 0x45 // Get Scanline -#define ST7789V_WRDISBV 0x51 // Write Display Brightness -#define ST7789V_RDDISBV 0x52 // Read Display Brightness -#define ST7789V_WRCTRLD 0x53 // Write CTRL Display -#define ST7789V_RDCTRLD 0x54 // Read CTRL Value Display -#define ST7789V_WRCACE 0x55 // Write Content Adaptive Brightness Control and Color Enhancement -#define ST7789V_RDCABC 0x56 // Read Content Adaptive Brightness Control -#define ST7789V_WRCABCMB 0x5E // Write CABC Minimum Brightness -#define ST7789V_RDCABCMB 0x5F // Read CABC Minimum Brightness -#define ST7789V_RDABCSDR 0x68 // Read Automatic Brightness Control Self-Diagnostic Result -#define ST7789V_RDID1 0xDA // Read ID1 Value -#define ST7789V_RDID2 0xDB // Read ID2 Value -#define ST7789V_RDID3 0xDC // Read ID3 Value - -#define ST7789V_RAMCTRL 0xB0 // RAM Control -#define ST7789V_RGBCTRL 0xB1 // RGB Interface Control -#define ST7789V_PORCTRL 0xB2 // Porch Setting -#define ST7789V_FRCTRL1 0xB3 // Frame Rate Control 1 (In partial mode/ idle colors) -#define ST7789V_GCTRL 0xB7 // Gate Control -#define ST7789V_DGMEN 0xBA // Digital Gamma Enable -#define ST7789V_VCOMS 0xBB // VCOM Setting -#define ST7789V_LCMCTRL 0xC0 // LCM Control -#define ST7789V_IDSET 0xC1 // ID Code Setting -#define ST7789V_VDVVRHEN 0xC2 // VDV and VRH Command Enable -#define ST7789V_VRHS 0xC3 // VRH Set -#define ST7789V_VDVS 0xC4 // VDV Set -#define ST7789V_VCMOFSET 0xC5 // VCOM Offset Set -#define ST7789V_FRCTRL2 0xC6 // Frame Rate Control in Normal Mode -#define ST7789V_CABCCTRL 0xC7 // CABC Control -#define ST7789V_REGSEL1 0xC8 // Register Value Selection 1 -#define ST7789V_REGSEL2 0xCA // Register Value Selection 2 -#define ST7789V_PWMFRSEL 0xCC // PWM Frequency Selection -#define ST7789V_PWCTRL1 0xD0 // Power Control 1 -#define ST7789V_VAPVANEN 0xD2 // Enable VAP/VAN signal output -#define ST7789V_CMD2EN 0xDF // Command 2 Enable -#define ST7789V_PVGAMCTRL 0xE0 // Positive Voltage Gamma Control -#define ST7789V_NVGAMCTRL 0xE1 // Negative Voltage Gamma Control -#define ST7789V_DGMLUTR 0xE2 // Digital Gamma Look-up Table for Red -#define ST7789V_DGMLUTB 0xE3 // Digital Gamma Look-up Table for Blue -#define ST7789V_GATECTRL 0xE4 // Gate Control -#define ST7789V_SPI2EN 0xE7 // SPI2 Enable -#define ST7789V_PWCTRL2 0xE8 // Power Control 2 -#define ST7789V_EQCTRL 0xE9 // Equalize time control -#define ST7789V_PROMCTRL 0xEC // Program Mode Control -#define ST7789V_PROMEN 0xFA // Program Mode Enable -#define ST7789V_NVMSET 0xFC // NVM Setting -#define ST7789V_PROMACT 0xFE // Program action - -static const uint16_t st7789v_init[] = { - DATASIZE_8BIT, - ESC_REG(ST7789V_SWRESET), ESC_DELAY(100), - ESC_REG(ST7789V_SLPOUT), ESC_DELAY(20), - - ESC_REG(ST7789V_PORCTRL), 0x000C, 0x000C, 0x0000, 0x0033, 0x0033, - ESC_REG(ST7789V_GCTRL), 0x0035, - ESC_REG(ST7789V_VCOMS), 0x001F, - ESC_REG(ST7789V_LCMCTRL), 0x002C, - ESC_REG(ST7789V_VDVVRHEN), 0x0001, 0x00C3, - ESC_REG(ST7789V_VDVS), 0x0020, - ESC_REG(ST7789V_FRCTRL2), 0x000F, - ESC_REG(ST7789V_PWCTRL1), 0x00A4, 0x00A1, - - ESC_REG(ST7789V_MADCTL), ST7789V_MADCTL_DATA, - ESC_REG(ST7789V_COLMOD), 0x0055, - - ESC_REG(ST7789V_NORON), - ESC_REG(ST7789V_DISPON), - ESC_END -}; diff --git a/Marlin/src/lcd/tft_io/st7796s.h b/Marlin/src/lcd/tft_io/st7796s.h deleted file mode 100644 index 8653a49ca2..0000000000 --- a/Marlin/src/lcd/tft_io/st7796s.h +++ /dev/null @@ -1,183 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "tft_io.h" - -#include "../../inc/MarlinConfig.h" - -#define ST7796S_MADCTL_MY 0x80 // Row Address Order -#define ST7796S_MADCTL_MX 0x40 // Column Address Order -#define ST7796S_MADCTL_MV 0x20 // Row/Column Exchange -#define ST7796S_MADCTL_ML 0x10 // Vertical Refresh Order -#define ST7796S_MADCTL_BGR 0x08 // RGB-BGR ORDER -#define ST7796S_MADCTL_RGB 0x00 -#define ST7796S_MADCTL_MH 0x04 // Horizontal Refresh Order - -#define ST7796S_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ST7796S_MADCTL_MV) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ST7796S_MADCTL_MX) | \ - IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ST7796S_MADCTL_MY) - -#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR - #define ST7796S_COLOR ST7796S_MADCTL_BGR -#elif TFT_COLOR == TFT_COLOR_RGB - #define ST7796S_COLOR ST7796S_MADCTL_RGB -#endif - -#define ST7796S_MADCTL_DATA (ST7796S_ORIENTATION) | (ST7796S_COLOR) - -#define ST7796S_NOP 0x00 // No Operation -#define ST7796S_SWRESET 0x01 // Software reset -#define ST7796S_RDDID 0x04 // Read Display ID -#define ST7796S_RDNUMED 0x05 // Read Number of the Errors on DSI -#define ST7796S_RDDST 0x09 // Read Display Status -#define ST7796S_RDDPM 0x0A // Read Display Power Mode -#define ST7796S_RDDMADCTL 0x0B // Read Display MADCTL -#define ST7796S_RDDCOLMOD 0x0C // Read Display Pixel Format -#define ST7796S_RDDIM 0x0D // Read Display Image Mode -#define ST7796S_RDDSM 0x0E // Read Display Signal Status -#define ST7796S_RDDSDR 0x0F // Read Display Self-Diagnostic Result -#define ST7796S_SLPIN 0x10 // Sleep In -#define ST7796S_SLPOUT 0x11 // Sleep Out -#define ST7796S_PTLON 0x12 // Partial Display Mode On -#define ST7796S_NORON 0x13 // Normal Display Mode On -#define ST7796S_INVOFF 0x20 // Display Inversion Off -#define ST7796S_INVON 0x21 // Display Inversion On -#define ST7796S_DISPOFF 0x28 // Display Off -#define ST7796S_DISPON 0x29 // Display On -#define ST7796S_CASET 0x2A // Column Address Set -#define ST7796S_RASET 0x2B // Row Address Set -#define ST7796S_RAMWR 0x2C // Memory Write -#define ST7796S_RAMRD 0x2E // Memory Read -#define ST7796S_PTLAR 0x30 // Partial Area -#define ST7796S_VSCRDEF 0x33 // Vertical Scrolling Definition -#define ST7796S_TEOFF 0x34 // Tearing Effect Line OFF -#define ST7796S_TEON 0x35 // Tearing Effect Line On -#define ST7796S_MADCTL 0x36 // Memory Data Access Control -#define ST7796S_VSCSAD 0x37 // Vertical Scroll Start Address of RAM -#define ST7796S_IDMOFF 0x38 // Idle Mode Off -#define ST7796S_IDMON 0x39 // Idle Mode On -#define ST7796S_COLMOD 0x3A // Interface Pixel Format -#define ST7796S_WRMEMC 0x3C // Write Memory Continue -#define ST7796S_RDMEMC 0x3E // Read Memory Continue -#define ST7796S_STE 0x44 // Set Tear ScanLine -#define ST7796S_GSCAN 0x45 // Get ScanLine -#define ST7796S_WRDISBV 0x51 // Write Display Brightness -#define ST7796S_RDDISBV 0x52 // Read Display Brightness Value -#define ST7796S_WRCTRLD 0x53 // Write CTRL Display -#define ST7796S_RDCTRLD 0x54 // Read CTRL value Display -#define ST7796S_WRCABC 0x55 // Write Adaptive Brightness Control -#define ST7796S_RDCABC 0x56 // Read Content Adaptive Brightness Control -#define ST7796S_WRCABCMB 0x5E // Write CABC Minimum Brightness -#define ST7796S_RDCABCMB 0x5F // Read CABC Minimum Brightness -#define ST7796S_RDFCS 0xAA // Read First Checksum -#define ST7796S_RDCFCS 0xAF // Read Continue Checksum -#define ST7796S_RDID1 0xDA // Read ID1 -#define ST7796S_RDID2 0xDB // Read ID2 -#define ST7796S_RDID3 0xDC // Read ID3 - -#define ST7796S_IFMODE 0xB0 // Interface Mode Control -#define ST7796S_FRMCTR1 0xB1 // Frame Rate Control (In Normal Mode/Full Colors) -#define ST7796S_FRMCTR2 0xB2 // Frame Rate Control 2 (In Idle Mode/8 colors) -#define ST7796S_FRMCTR3 0xB3 // Frame Rate Control 3(In Partial Mode/Full Colors) -#define ST7796S_DIC 0xB4 // Display Inversion Control -#define ST7796S_BPC 0xB5 // Blanking Porch Control -#define ST7796S_DFC 0xB6 // Display Function Control -#define ST7796S_EM 0xB7 // Entry Mode Set -#define ST7796S_PWR1 0xC0 // Power Control 1 -#define ST7796S_PWR2 0xC1 // Power Control 2 -#define ST7796S_PWR3 0xC2 // Power Control 3 -#define ST7796S_VCMPCTL 0xC5 // VCOM Control -#define ST7796S_VCMOST 0xC6 // VCOM Offset Register -#define ST7796S_NVMADW 0xD0 // NVM Address/Data Write -#define ST7796S_NVMBPROG 0xD1 // NVM Byte Program -#define ST7796S_NVMSTRD 0xD2 // NVM Status Read -#define ST7796S_RDID4 0xD3 // Read ID4 -#define ST7796S_PGC 0xE0 // Positive Gamma Control -#define ST7796S_NGC 0xE1 // Negative Gamma Control -#define ST7796S_DGC1 0xE2 // Digital Gamma Control 1 -#define ST7796S_DGC2 0xE3 // Digital Gamma Control 2 -#define ST7796S_DOCA 0xE8 // Display Output Ctrl Adjust -#define ST7796S_CSCON 0xF0 // Command Set Control -#define ST7796S_SPIRC 0xFB // SPI Read Control - -static const uint16_t st7796s_init[] = { - DATASIZE_8BIT, - ESC_REG(ST7796S_SWRESET), ESC_DELAY(100), - ESC_REG(ST7796S_SLPOUT), ESC_DELAY(20), - - ESC_REG(ST7796S_CSCON), 0x00C3, // enable command 2 part I - ESC_REG(ST7796S_CSCON), 0x0096, // enable command 2 part II - - ESC_REG(ST7796S_MADCTL), ST7796S_MADCTL_DATA, - ESC_REG(ST7796S_COLMOD), 0x0055, - - ESC_REG(ST7796S_DIC), 0x0001, // 1-dot inversion - ESC_REG(ST7796S_EM), 0x00C6, - - ESC_REG(ST7796S_PWR2), 0x0015, - ESC_REG(ST7796S_PWR3), 0x00AF, - ESC_REG(ST7796S_VCMPCTL), 0x0022, - ESC_REG(ST7796S_VCMOST), 0x0000, - ESC_REG(ST7796S_DOCA), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, - - /* Gamma Correction. */ - ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, - ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, - - ESC_REG(ST7796S_NORON), - ESC_REG(ST7796S_WRCTRLD), 0x0024, - ESC_REG(ST7796S_CSCON), 0x003C, // disable command 2 part I - ESC_REG(ST7796S_CSCON), 0x0069, // disable command 2 part II - ESC_REG(ST7796S_DISPON), - ESC_END -}; - -static const uint16_t lerdge_st7796s_init[] = { - DATASIZE_8BIT, - ESC_REG(ST7796S_CSCON), 0x00C3, // enable command 2 part I - ESC_REG(ST7796S_CSCON), 0x0096, // enable command 2 part II - - ESC_REG(ST7796S_MADCTL), ST7796S_MADCTL_DATA, - ESC_REG(ST7796S_COLMOD), 0x0055, - - ESC_REG(ST7796S_DIC), 0x0001, // 1-dot inversion - ESC_REG(ST7796S_EM), 0x00C6, - - ESC_REG(ST7796S_PWR2), 0x0015, - ESC_REG(ST7796S_PWR3), 0x00AF, - ESC_REG(0xC3), 0x0009, // Register not documented in datasheet - ESC_REG(ST7796S_VCMPCTL), 0x0022, - ESC_REG(ST7796S_VCMOST), 0x0000, - ESC_REG(ST7796S_DOCA), 0x0040, 0x008A, 0x0000, 0x0000, 0x0029, 0x0019, 0x00A5, 0x0033, - - /* Gamma Correction. */ - ESC_REG(ST7796S_PGC), 0x00F0, 0x0004, 0x0008, 0x0009, 0x0008, 0x0015, 0x002F, 0x0042, 0x0046, 0x0028, 0x0015, 0x0016, 0x0029, 0x002D, - ESC_REG(ST7796S_NGC), 0x00F0, 0x0004, 0x0009, 0x0009, 0x0008, 0x0015, 0x002E, 0x0046, 0x0046, 0x0028, 0x0015, 0x0015, 0x0029, 0x002D, - - ESC_REG(ST7796S_INVON), // Display inversion ON - ESC_REG(ST7796S_WRCTRLD), 0x0024, - ESC_REG(ST7796S_CSCON), 0x003C, // disable command 2 part I - ESC_REG(ST7796S_CSCON), 0x0069, // disable command 2 part II - ESC_REG(ST7796S_DISPON), - ESC_END -}; diff --git a/Marlin/src/lcd/tft_io/tft_io.cpp b/Marlin/src/lcd/tft_io/tft_io.cpp deleted file mode 100644 index cd535458a1..0000000000 --- a/Marlin/src/lcd/tft_io/tft_io.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "tft_io.h" - -#if HAS_SPI_TFT || HAS_FSMC_TFT - -#include "st7735.h" -#include "st7789v.h" -#include "st7796s.h" -#include "r65105.h" -#include "ili9328.h" -#include "ili9341.h" -#include "ili9488.h" -#include "ssd1963.h" - -#define DEBUG_OUT ENABLED(DEBUG_GRAPHICAL_TFT) -#include "../../core/debug_out.h" - -TFT_IO_DRIVER TFT_IO::io; -uint32_t TFT_IO::lcd_id = 0xFFFFFFFF; - -void TFT_IO::InitTFT() { -if (lcd_id != 0xFFFFFFFF) return; - - #if PIN_EXISTS(TFT_BACKLIGHT) - OUT_WRITE(TFT_BACKLIGHT_PIN, LOW); - #endif - - #if PIN_EXISTS(TFT_RESET) - OUT_WRITE(TFT_RESET_PIN, HIGH); - delay(10); - OUT_WRITE(TFT_RESET_PIN, LOW); - delay(10); - OUT_WRITE(TFT_RESET_PIN, HIGH); - #endif - - #if PIN_EXISTS(TFT_BACKLIGHT) - OUT_WRITE(TFT_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); - #endif - - // io.Init(); - delay(100); - - #if TFT_DRIVER != AUTO - lcd_id = TFT_DRIVER; - #endif - - #if TFT_DRIVER == ST7735 - write_esc_sequence(st7735_init); - #elif TFT_DRIVER == SSD1963 - write_esc_sequence(ssd1963_init); - #elif TFT_DRIVER == ST7789 - write_esc_sequence(st7789v_init); - #elif TFT_DRIVER == ST7796 - write_esc_sequence(st7796s_init); - #elif TFT_DRIVER == R61505 - write_esc_sequence(r61505_init); - #elif TFT_DRIVER == ILI9328 - write_esc_sequence(ili9328_init); - #elif TFT_DRIVER == ILI9341 - write_esc_sequence(ili9341_init); - #elif TFT_DRIVER == ILI9488 - write_esc_sequence(ili9488_init); - #elif TFT_DRIVER == LERDGE_ST7796 - lcd_id = ST7796; - write_esc_sequence(lerdge_st7796s_init); - - #elif TFT_DRIVER == AUTO // autodetect - - lcd_id = io.GetID() & 0xFFFF; - - switch (lcd_id) { - case ST7796: // ST7796S 480x320 - DEBUG_ECHO_MSG(" ST7796S"); - write_esc_sequence(st7796s_init); - break; - case ST7789: // ST7789V 320x240 - DEBUG_ECHO_MSG(" ST7789V"); - write_esc_sequence(st7789v_init); - break; - case SSD1963: // SSD1963 - DEBUG_ECHO_MSG(" SSD1963"); - write_esc_sequence(ssd1963_init); - break; - case ST7735: // ST7735 160x128 - DEBUG_ECHO_MSG(" ST7735"); - write_esc_sequence(st7735_init); - break; - case R61505: // R61505U 320x240 - DEBUG_ECHO_MSG(" R61505U"); - write_esc_sequence(r61505_init); - break; - case ILI9328: // ILI9328 320x240 - DEBUG_ECHO_MSG(" ILI9328"); - write_esc_sequence(ili9328_init); - break; - case ILI9341: // ILI9341 320x240 - DEBUG_ECHO_MSG(" ILI9341"); - write_esc_sequence(ili9341_init); - break; - case ILI9488: // ILI9488 480x320 - case ILI9488_ID1: // 0x8066 ILI9488 480x320 - DEBUG_ECHO_MSG(" ILI9488"); - write_esc_sequence(ili9488_init); - break; - default: - lcd_id = 0; - } - #else - #error Unsupported TFT driver - #endif - - #if PIN_EXISTS(TFT_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) - OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); - #endif -} - -void TFT_IO::set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { - #ifdef OFFSET_X - Xmin += OFFSET_X; Xmax += OFFSET_X; - #endif - #ifdef OFFSET_Y - Ymin += OFFSET_Y; Ymax += OFFSET_Y; - #endif - - switch (lcd_id) { - case ST7735: // ST7735 160x128 - case ST7789: // ST7789V 320x240 - case ST7796: // ST7796 480x320 - case ILI9341: // ILI9341 320x240 - case ILI9488: // ILI9488 480x320 - case SSD1963: // SSD1963 - case ILI9488_ID1: // 0x8066 ILI9488 480x320 - io.DataTransferBegin(DATASIZE_8BIT); - - // CASET: Column Address Set - io.WriteReg(ILI9341_CASET); - io.WriteData((Xmin >> 8) & 0xFF); - io.WriteData(Xmin & 0xFF); - io.WriteData((Xmax >> 8) & 0xFF); - io.WriteData(Xmax & 0xFF); - - // RASET: Row Address Set - io.WriteReg(ILI9341_PASET); - io.WriteData((Ymin >> 8) & 0xFF); - io.WriteData(Ymin & 0xFF); - io.WriteData((Ymax >> 8) & 0xFF); - io.WriteData(Ymax & 0xFF); - - // RAMWR: Memory Write - io.WriteReg(ILI9341_RAMWR); - break; - case R61505: // R61505U 320x240 - case ILI9328: // ILI9328 320x240 - io.DataTransferBegin(DATASIZE_16BIT); - - // Mind the mess: with landscape screen orientation 'Horizontal' is Y and 'Vertical' is X - io.WriteReg(ILI9328_HASTART); - io.WriteData(Ymin); - io.WriteReg(ILI9328_HAEND); - io.WriteData(Ymax); - io.WriteReg(ILI9328_VASTART); - io.WriteData(Xmin); - io.WriteReg(ILI9328_VAEND); - io.WriteData(Xmax); - - io.WriteReg(ILI9328_HASET); - io.WriteData(Ymin); - io.WriteReg(ILI9328_VASET); - io.WriteData(Xmin); - - io.WriteReg(ILI9328_RAMWR); - break; - default: - break; - } - - io.DataTransferEnd(); -} - -void TFT_IO::write_esc_sequence(const uint16_t *Sequence) { - uint16_t dataWidth, data; - - dataWidth = *Sequence++; - io.DataTransferBegin(dataWidth); - - for (;;) { - data = *Sequence++; - if (data != 0xFFFF) { - io.WriteData(data); - continue; - } - data = *Sequence++; - if (data == 0x7FFF) return; - if (data == 0xFFFF) - io.WriteData(0xFFFF); - else if (data & 0x8000) - delay(data & 0x7FFF); - else if ((data & 0xFF00) == 0) - io.WriteReg(data); - } - - io.DataTransferEnd(); -} - -#endif // HAS_SPI_TFT || HAS_FSMC_TFT diff --git a/Marlin/src/lcd/tft_io/tft_io.h b/Marlin/src/lcd/tft_io/tft_io.h deleted file mode 100644 index 63d6936ac0..0000000000 --- a/Marlin/src/lcd/tft_io/tft_io.h +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfig.h" - -#if HAS_SPI_TFT || HAS_FSMC_TFT - -#if HAS_SPI_TFT - #include HAL_PATH(../../HAL, tft/tft_spi.h) -#elif HAS_FSMC_TFT - #include HAL_PATH(../../HAL, tft/tft_fsmc.h) -#else - #error "TFT IO only supports SPI or FSMC interface" -#endif - -#define TFT_EXCHANGE_XY (1UL << 1) -#define TFT_INVERT_X (1UL << 2) -#define TFT_INVERT_Y (1UL << 3) - -#define TFT_NO_ROTATION (0x00) -#define TFT_ROTATE_90 (TFT_EXCHANGE_XY | TFT_INVERT_X) -#define TFT_ROTATE_180 (TFT_INVERT_X | TFT_INVERT_Y) -#define TFT_ROTATE_270 (TFT_EXCHANGE_XY | TFT_INVERT_Y) - -#define TFT_MIRROR_X (TFT_INVERT_Y) -#define TFT_MIRROR_Y (TFT_INVERT_X) - -#define TFT_ROTATE_90_MIRROR_X (TFT_ROTATE_90 ^ TFT_INVERT_Y) -#define TFT_ROTATE_90_MIRROR_Y (TFT_ROTATE_90 ^ TFT_INVERT_X) - -#define TFT_ROTATE_180_MIRROR_X (TFT_ROTATE_180 ^ TFT_INVERT_Y) -#define TFT_ROTATE_180_MIRROR_Y (TFT_ROTATE_180 ^ TFT_INVERT_X) - -#define TFT_ROTATE_270_MIRROR_X (TFT_ROTATE_270 ^ TFT_INVERT_Y) -#define TFT_ROTATE_270_MIRROR_Y (TFT_ROTATE_270 ^ TFT_INVERT_X) - -// TFT_ROTATION is user configurable -#ifndef TFT_ROTATION - #define TFT_ROTATION TFT_NO_ROTATION -#endif - - -// TFT_ORIENTATION is the "sum" of TFT_DEFAULT_ORIENTATION plus user TFT_ROTATION -#define TFT_ORIENTATION ((TFT_DEFAULT_ORIENTATION) ^ (TFT_ROTATION)) - -#define TFT_COLOR_RGB (1UL << 3) -#define TFT_COLOR_BGR (1UL << 4) - -// Each TFT Driver is responsible for its default color mode. -// #ifndef TFT_COLOR -// #define TFT_COLOR TFT_COLOR_RGB -// #endif - -#define SSD1963 0x5761 -#define ST7735 0x89F0 -#define ST7789 0x8552 -#define ST7796 0x7796 -#define R61505 0x1505 -#define ILI9328 0x9328 -#define ILI9341 0x9341 -#define ILI9488 0x9488 -#define ILI9488_ID1 0x8066 //Some ILI9488 have 0x8066 in the 0x04 -#define LERDGE_ST7796 0xFFFE -#define AUTO 0xFFFF - -#ifndef TFT_DRIVER - #define TFT_DRIVER AUTO -#endif - -#define ESC_REG(x) 0xFFFF, 0x00FF & (uint16_t)x -#define ESC_DELAY(x) 0xFFFF, 0x8000 | (x & 0x7FFF) -#define ESC_END 0xFFFF, 0x7FFF -#define ESC_FFFF 0xFFFF, 0xFFFF - -class TFT_IO { -public: - static TFT_IO_DRIVER io; - - static void InitTFT(); - static void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax); - static void write_esc_sequence(const uint16_t *Sequence); - - // Deletaged methods - inline static void Init() { io.Init(); }; - inline static bool isBusy() { return io.isBusy(); }; - inline static void Abort() { io.Abort(); }; - inline static uint32_t GetID() { return io.GetID(); }; - - inline static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) { io.DataTransferBegin(DataWidth); } - inline static void DataTransferEnd() { io.DataTransferEnd(); }; - // inline static void DataTransferAbort() { io.DataTransferAbort(); }; - - inline static void WriteData(uint16_t Data) { io.WriteData(Data); }; - inline static void WriteReg(uint16_t Reg) { io.WriteReg(Reg); }; - - inline static void WriteSequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); }; - // static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } - inline static void WriteMultiple(uint16_t Color, uint32_t Count) { io.WriteMultiple(Color, Count); }; - -protected: - static uint32_t lcd_id; -}; - -#endif // HAS_SPI_TFT || HAS_FSMC_TFT diff --git a/Marlin/src/lcd/thermistornames.h b/Marlin/src/lcd/thermistornames.h index 37f285d483..02f2bfe0a9 100644 --- a/Marlin/src/lcd/thermistornames.h +++ b/Marlin/src/lcd/thermistornames.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -31,14 +31,8 @@ #undef THERMISTOR_NAME -// User-specified thermistor parameters -#if THERMISTOR_ID == 1000 - #define THERMISTOR_NAME "User Parameters" - // Thermcouples -#elif THERMISTOR_ID == -5 - #define THERMISTOR_NAME "MAX31865" -#elif THERMISTOR_ID == -4 +#if THERMISTOR_ID == -4 #define THERMISTOR_NAME "AD8495" #elif THERMISTOR_ID == -3 #define THERMISTOR_NAME "MAX31855" @@ -50,26 +44,14 @@ // Standard thermistors #elif THERMISTOR_ID == 1 #define THERMISTOR_NAME "EPCOS 100K" -#elif THERMISTOR_ID == 331 - #define THERMISTOR_NAME "3.3V EPCOS 100K (MEGA)" -#elif THERMISTOR_ID == 332 - #define THERMISTOR_NAME "3.3V EPCOS 100K (DUE)" #elif THERMISTOR_ID == 2 #define THERMISTOR_NAME "ATC 204GT-2" -#elif THERMISTOR_ID == 202 - #define THERMISTOR_NAME "200k Copymaster 3D" #elif THERMISTOR_ID == 3 #define THERMISTOR_NAME "Mendel-parts" #elif THERMISTOR_ID == 4 #define THERMISTOR_NAME "Generic 10K" #elif THERMISTOR_ID == 5 #define THERMISTOR_NAME "ATC 104GT-2" -#elif THERMISTOR_ID == 501 - #define THERMISTOR_NAME "Zonestar (Tronxy X3A)" -#elif THERMISTOR_ID == 502 - #define THERMISTOR_NAME "Zonestar (P802M Hot Bed)" -#elif THERMISTOR_ID == 512 - #define THERMISTOR_NAME "RPW-Ultra" #elif THERMISTOR_ID == 6 #define THERMISTOR_NAME "EPCOS (alt)" #elif THERMISTOR_ID == 7 @@ -88,28 +70,16 @@ #define THERMISTOR_NAME "E3104FXT (alt)" #elif THERMISTOR_ID == 13 #define THERMISTOR_NAME "Hisens 3950" -#elif THERMISTOR_ID == 15 - #define THERMISTOR_NAME "100k JGAurora A5" -#elif THERMISTOR_ID == 18 - #define THERMISTOR_NAME "ATC Semitec 204GT-2" #elif THERMISTOR_ID == 20 - #define THERMISTOR_NAME "Pt100 UltiMB 5v" -#elif THERMISTOR_ID == 21 - #define THERMISTOR_NAME "Pt100 UltiMB 3.3v" -#elif THERMISTOR_ID == 201 - #define THERMISTOR_NAME "Pt100 OverLord" + #define THERMISTOR_NAME "PT100 UltiMB" #elif THERMISTOR_ID == 60 #define THERMISTOR_NAME "Makers Tool" #elif THERMISTOR_ID == 70 #define THERMISTOR_NAME "Hephestos 2" #elif THERMISTOR_ID == 75 #define THERMISTOR_NAME "MGB18" -#elif THERMISTOR_ID == 99 - #define THERMISTOR_NAME "100k with 10k pull-up" // Modified thermistors -#elif THERMISTOR_ID == 30 - #define THERMISTOR_NAME "Kis3d EN AW NTC100K/3950" #elif THERMISTOR_ID == 51 #define THERMISTOR_NAME "EPCOS 1K" #elif THERMISTOR_ID == 52 @@ -121,26 +91,20 @@ #elif THERMISTOR_ID == 1010 #define THERMISTOR_NAME "PT1000 1K" #elif THERMISTOR_ID == 147 - #define THERMISTOR_NAME "Pt100 4K7" + #define THERMISTOR_NAME "PT100 4K7" #elif THERMISTOR_ID == 110 - #define THERMISTOR_NAME "Pt100 1K" + #define THERMISTOR_NAME "PT100 1K" #elif THERMISTOR_ID == 666 #define THERMISTOR_NAME "Einstart S" // High Temperature thermistors -#elif THERMISTOR_ID == 61 - #define THERMISTOR_NAME "Formbot 350°C" #elif THERMISTOR_ID == 66 #define THERMISTOR_NAME "Dyze 4.7M" -#elif THERMISTOR_ID == 67 - #define THERMISTOR_NAME "SliceEng 450°C" // Dummies for dev testing #elif THERMISTOR_ID == 998 #define THERMISTOR_NAME "Dummy 1" #elif THERMISTOR_ID == 999 #define THERMISTOR_NAME "Dummy 2" -#elif THERMISTOR_ID == 1000 - #define THERMISTOR_NAME "Custom" #endif // THERMISTOR_ID diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp deleted file mode 100644 index 7d25c0df7e..0000000000 --- a/Marlin/src/lcd/touch/touch_buttons.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_TOUCH_XPT2046 - -#include "touch_buttons.h" -#include "../scaled_tft.h" - -#include HAL_PATH(../../HAL, tft/xpt2046.h) -XPT2046 touchIO; - -#include "../../lcd/ultralcd.h" // For EN_C bit mask - -/** - * Draw and Touch processing - * - * LCD_PIXEL_WIDTH/HEIGHT (128x64) is the (emulated DOGM) Pixel Drawing resolution. - * TOUCH_SENSOR_WIDTH/HEIGHT (320x240) is the Touch Area resolution. - * TFT_WIDTH/HEIGHT (320x240 or 480x320) is the Actual (FSMC) Display resolution. - * - * - All native (u8g) drawing is done in LCD_PIXEL_* (128x64) - * - The DOGM pixels are is upscaled 2-3x (as needed) for display. - * - Touch coordinates use TOUCH_SENSOR_* resolution and are converted to - * click and scroll-wheel events (emulating of a common DOGM display). - * - * TOUCH_SCREEN resolution exists to fit our calibration values. The original touch code was made - * and originally calibrated for 320x240. If you decide to change the resolution of the touch code, - * new calibration values will be needed. - * - * The Marlin menus are drawn scaled in the upper region of the screen. The bottom region (in a - * fixed location in TOUCH_SCREEN* coordinate space) is used for 4 general-purpose buttons to - * navigate and select menu items. Both regions are touchable. - * - * The Marlin screen touchable area starts at TFT_PIXEL_OFFSET_X/Y (translated to SCREEN_PCT_LEFT/TOP) - * and spans LCD_PIXEL_WIDTH/HEIGHT (scaled to SCREEN_PCT_WIDTH/HEIGHT). - */ - -// Touch sensor resolution independent of display resolution -#define TOUCH_SENSOR_WIDTH 320 -#define TOUCH_SENSOR_HEIGHT 240 - -#define SCREEN_PCT_WIDE(X) ((X) * (TOUCH_SENSOR_WIDTH) / (TFT_WIDTH)) -#define SCREEN_PCT_HIGH(Y) ((Y) * (TOUCH_SENSOR_HEIGHT) / (TFT_HEIGHT)) - -#define SCREEN_PCT_LEFT SCREEN_PCT_WIDE(TFT_PIXEL_OFFSET_X) -#define SCREEN_PCT_TOP SCREEN_PCT_HIGH(TFT_PIXEL_OFFSET_Y) -#define SCREEN_PCT_WIDTH SCREEN_PCT_WIDE((GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_WIDTH)) -#define SCREEN_PCT_HEIGHT SCREEN_PCT_HIGH((GRAPHICAL_TFT_UPSCALE) * (LCD_PIXEL_HEIGHT)) - -// Coordinates in terms of 240-unit-tall touch area -#define BUTTON_AREA_TOP 175 -#define BUTTON_AREA_BOT 234 - -TouchButtons touch; - -void TouchButtons::init() { touchIO.Init(); } - -uint8_t TouchButtons::read_buttons() { - #ifdef HAS_WIRED_LCD - int16_t x, y; - - if (!touchIO.getRawPoint(&x, &y)) return 0; - - x = uint16_t((uint32_t(x) * XPT2046_X_CALIBRATION) >> 16) + XPT2046_X_OFFSET; - y = uint16_t((uint32_t(y) * XPT2046_Y_CALIBRATION) >> 16) + XPT2046_Y_OFFSET; - - #if (TFT_ROTATION & TFT_ROTATE_180) - x = TOUCH_SENSOR_WIDTH - x; - y = TOUCH_SENSOR_HEIGHT - y; - #endif - - // Touch within the button area simulates an encoder button - if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT) - return WITHIN(x, 14, 77) ? EN_D - : WITHIN(x, 90, 153) ? EN_A - : WITHIN(x, 166, 229) ? EN_B - : WITHIN(x, 242, 305) ? EN_C - : 0; - - if ( !WITHIN(x, SCREEN_PCT_LEFT, SCREEN_PCT_LEFT + SCREEN_PCT_WIDTH) - || !WITHIN(y, SCREEN_PCT_TOP, SCREEN_PCT_TOP + SCREEN_PCT_HEIGHT) - ) return 0; - - // Column and row above BUTTON_AREA_TOP - int8_t col = (x - (SCREEN_PCT_LEFT)) * (LCD_WIDTH) / (SCREEN_PCT_WIDTH), - row = (y - (SCREEN_PCT_TOP)) * (LCD_HEIGHT) / (SCREEN_PCT_HEIGHT); - - // Send the touch to the UI (which will simulate the encoder wheel) - MarlinUI::screen_click(row, col, x, y); - #endif - return 0; -} - -#endif // HAS_TOUCH_XPT2046 diff --git a/Marlin/src/lcd/touch/touch_buttons.h b/Marlin/src/lcd/touch/touch_buttons.h deleted file mode 100644 index 451e5a5a37..0000000000 --- a/Marlin/src/lcd/touch/touch_buttons.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -class TouchButtons { -public: - static void init(); - static uint8_t read_buttons(); -}; - -extern TouchButtons touch; diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp b/Marlin/src/lcd/u8g_fontutf8.cpp similarity index 91% rename from Marlin/src/lcd/dogm/u8g_fontutf8.cpp rename to Marlin/src/lcd/u8g_fontutf8.cpp index 89bdb09e1b..b79d9906eb 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp +++ b/Marlin/src/lcd/u8g_fontutf8.cpp @@ -7,14 +7,15 @@ * @copyright GPL/BSD */ -#include "../../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_U8GLIB +#if ENABLED(DOGLCD) #include -#include "../fontutils.h" +#include "fontutils.h" #include "u8g_fontutf8.h" +//////////////////////////////////////////////////////////// typedef void font_t; /** @@ -30,6 +31,7 @@ typedef void font_t; */ typedef int (* fontgroup_cb_draw_t)(void *userdata, const font_t *fnt_current, const char *msg); +//////////////////////////////////////////////////////////// /* return v1 - v2 */ static int fontinfo_compare(uxg_fontinfo_t * v1, uxg_fontinfo_t * v2) { if (v1->page < v2->page) return -1; @@ -64,10 +66,10 @@ static const font_t* fontgroup_find(font_group_t * root, wchar_t val) { uxg_fontinfo_t vcmp = {(uint16_t)(val / 128), (uint8_t)(val % 128 + 128), (uint8_t)(val % 128 + 128), 0, 0}; size_t idx = 0; - if (val < 256) return nullptr; + if (val < 256) return NULL; if (pf_bsearch_r((void*)root->m_fntifo, root->m_fntinfo_num, pf_bsearch_cb_comp_fntifo_pgm, (void*)&vcmp, &idx) < 0) - return nullptr; + return NULL; memcpy_P(&vcmp, root->m_fntifo + idx, sizeof(vcmp)); return vcmp.fntdata; @@ -97,7 +99,7 @@ static void fontgroup_drawwchar(font_group_t *group, const font_t *fnt_default, * @param utf8_msg : the UTF-8 string * @param cb_read_byte : how to read the utf8_msg, from RAM or ROM (call read_byte_ram or pgm_read_byte) * @param userdata : User's data - * @param cb_draw_ram : the callback function of userdata to draw a !RAM! string (actually it is to draw a one byte string in RAM) + * @param cb_draw_ram : the callback function of userdata to draw a !RAM! string (actural it is to draw a one byte string in RAM) * * @return N/A * @@ -113,13 +115,14 @@ static void fontgroup_drawstring(font_group_t *group, const font_t *fnt_default, } } +//////////////////////////////////////////////////////////// static bool flag_fontgroup_was_inited = false; -static font_group_t g_fontgroup_root = { nullptr, 0 }; +static font_group_t g_fontgroup_root = {NULL, 0}; /** * @brief check if font is loaded */ -static inline bool uxg_Utf8FontIsInited() { return flag_fontgroup_was_inited; } +static inline bool uxg_Utf8FontIsInited(void) { return flag_fontgroup_was_inited; } int uxg_SetUtf8Fonts (const uxg_fontinfo_t * fntinfo, int number) { flag_fontgroup_was_inited = 1; @@ -140,6 +143,7 @@ static int fontgroup_cb_draw_u8g(void *userdata, const font_t *fnt_current, cons if (pdata->fnt_prev != fnt_current) { u8g_SetFont(pdata->pu8g, (const u8g_fntpgm_uint8_t*)fnt_current); + //u8g_SetFontPosBottom(pdata->pu8g); pdata->fnt_prev = fnt_current; } if ((pdata->max_width != PIXEL_LEN_NOLIMIT) && (pdata->adv + u8g_GetStrPixelWidth(pdata->pu8g, (char*)msg) > pdata->max_width)) @@ -175,7 +179,7 @@ unsigned int uxg_DrawWchar(u8g_t *pu8g, unsigned int x, unsigned int y, wchar_t data.y = y; data.adv = 0; data.max_width = max_width; - data.fnt_prev = nullptr; + data.fnt_prev = NULL; fontgroup_drawwchar(group, fnt_default, ch, (void*)&data, fontgroup_cb_draw_u8g); u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); @@ -209,7 +213,7 @@ unsigned int uxg_DrawUtf8Str(u8g_t *pu8g, unsigned int x, unsigned int y, const data.y = y; data.adv = 0; data.max_width = max_width; - data.fnt_prev = nullptr; + data.fnt_prev = NULL; fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_ram, (void*)&data, fontgroup_cb_draw_u8g); u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); @@ -229,7 +233,7 @@ unsigned int uxg_DrawUtf8Str(u8g_t *pu8g, unsigned int x, unsigned int y, const * * Draw a ROM UTF-8 string at the specified position */ -unsigned int uxg_DrawUtf8StrP(u8g_t *pu8g, unsigned int x, unsigned int y, PGM_P utf8_msg, pixel_len_t max_width) { +unsigned int uxg_DrawUtf8StrP(u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_width) { struct _uxg_drawu8_data_t data; font_group_t *group = &g_fontgroup_root; const font_t *fnt_default = uxg_GetFont(pu8g); @@ -243,7 +247,7 @@ unsigned int uxg_DrawUtf8StrP(u8g_t *pu8g, unsigned int x, unsigned int y, PGM_P data.y = y; data.adv = 0; data.max_width = max_width; - data.fnt_prev = nullptr; + data.fnt_prev = NULL; fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_rom, (void*)&data, fontgroup_cb_draw_u8g); u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); @@ -255,6 +259,7 @@ static int fontgroup_cb_draw_u8gstrlen(void *userdata, const font_t *fnt_current if (pdata->fnt_prev != fnt_current) { u8g_SetFont(pdata->pu8g, (const u8g_fntpgm_uint8_t*)fnt_current); + u8g_SetFontPosBottom(pdata->pu8g); pdata->fnt_prev = fnt_current; } pdata->adv += u8g_GetStrPixelWidth(pdata->pu8g, (char*)msg); @@ -297,7 +302,7 @@ int uxg_GetUtf8StrPixelWidth(u8g_t *pu8g, const char *utf8_msg) { * * Get the screen pixel width of a ROM UTF-8 string */ -int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, PGM_P utf8_msg) { +int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, const char *utf8_msg) { struct _uxg_drawu8_data_t data; font_group_t *group = &g_fontgroup_root; const font_t *fnt_default = uxg_GetFont(pu8g); @@ -312,4 +317,4 @@ int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, PGM_P utf8_msg) { return data.adv; } -#endif // HAS_MARLINUI_U8GLIB +#endif // DOGLCD diff --git a/Marlin/src/lcd/u8g_fontutf8.h b/Marlin/src/lcd/u8g_fontutf8.h new file mode 100644 index 0000000000..80522784c0 --- /dev/null +++ b/Marlin/src/lcd/u8g_fontutf8.h @@ -0,0 +1,40 @@ +/** + * @file fontutf8.h + * @brief font api for u8g lib + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2015-02-19 + * @copyright GPL/BSD + */ +#ifndef _UXG_FONTUTF8_H +#define _UXG_FONTUTF8_H 1 + +#include +#include "fontutils.h" + +// the macro to indicate a UTF-8 string +// You should to save the C/C++ source in UTF-8 encoding! +// Once you change your UTF-8 strings, you need to call the script uxggenpages.sh to create the font data file fontutf8-data.h +#define _UxGT(a) a + +typedef struct _uxg_fontinfo_t { + uint16_t page; + uint8_t begin; + uint8_t end; + uint16_t size; + const u8g_fntpgm_uint8_t *fntdata; +} uxg_fontinfo_t; + +int uxg_SetUtf8Fonts (const uxg_fontinfo_t * fntinfo, int number); // fntinfo is type of PROGMEM + +unsigned int uxg_DrawWchar (u8g_t *pu8g, unsigned int x, unsigned int y, wchar_t ch, pixel_len_t max_length); + +unsigned int uxg_DrawUtf8Str (u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_length); +unsigned int uxg_DrawUtf8StrP (u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_length); + +int uxg_GetUtf8StrPixelWidth(u8g_t *pu8g, const char *utf8_msg); +int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, const char *utf8_msg); + +#define uxg_GetFont(puxg) ((puxg)->font) + +#endif // _UXG_FONTUTF8_H diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 7003d13fdd..20d642962d 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,317 +16,5032 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#include "../inc/MarlinConfig.h" +#include "../inc/MarlinConfigPre.h" -#ifdef LED_BACKLIGHT_TIMEOUT - #include "../feature/leds/leds.h" -#endif +#if ENABLED(ULTRA_LCD) -#if ENABLED(HOST_ACTION_COMMANDS) - #include "../feature/host_actions.h" -#endif +#include -// All displays share the MarlinUI class #include "ultralcd.h" -MarlinUI ui; - -#if HAS_DISPLAY - #include "../module/printcounter.h" - #include "../MarlinCore.h" - #include "../gcode/queue.h" - #include "fontutils.h" - #include "../sd/cardreader.h" - #if EITHER(EXTENSIBLE_UI, DWIN_CREALITY_LCD) - #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) - #endif -#endif - -#if LCD_HAS_WAIT_FOR_MOVE - bool MarlinUI::wait_for_move; // = false -#endif - -constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; - -#if HAS_WIRED_LCD - #if ENABLED(STATUS_MESSAGE_SCROLLING) - uint8_t MarlinUI::status_scroll_offset; // = 0 - constexpr uint8_t MAX_MESSAGE_LENGTH = _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)); - #else - constexpr uint8_t MAX_MESSAGE_LENGTH = MAX_LANG_CHARSIZE * (LCD_WIDTH); - #endif -#elif EITHER(EXTENSIBLE_UI, DWIN_CREALITY_LCD) - constexpr uint8_t MAX_MESSAGE_LENGTH = 63; -#endif - -#if EITHER(HAS_WIRED_LCD, EXTENSIBLE_UI) - uint8_t MarlinUI::alert_level; // = 0 - char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1]; -#endif - -#if ENABLED(LCD_SET_PROGRESS_MANUALLY) - MarlinUI::progress_t MarlinUI::progress_override; // = 0 - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - uint32_t MarlinUI::remaining_time; - #endif -#endif - -#if EITHER(PCA9632_BUZZER, USE_BEEPER) - #include "../libs/buzzer.h" // for BUZZ() macro - #if ENABLED(PCA9632_BUZZER) - #include "../feature/leds/pca9632.h" - #endif - void MarlinUI::buzz(const long duration, const uint16_t freq) { - #if ENABLED(PCA9632_BUZZER) - PCA9632_buzz(duration, freq); - #elif USE_BEEPER - buzzer.tone(duration, freq); - #endif - } -#endif - -#if PREHEAT_COUNT - preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load() - PGM_P MarlinUI::get_preheat_label(const uint8_t m) { - #ifdef PREHEAT_1_LABEL - static PGMSTR(preheat_0_label, PREHEAT_1_LABEL); - #endif - #ifdef PREHEAT_2_LABEL - static PGMSTR(preheat_1_label, PREHEAT_2_LABEL); - #endif - #ifdef PREHEAT_3_LABEL - static PGMSTR(preheat_2_label, PREHEAT_3_LABEL); - #endif - #ifdef PREHEAT_4_LABEL - static PGMSTR(preheat_3_label, PREHEAT_4_LABEL); - #endif - #ifdef PREHEAT_5_LABEL - static PGMSTR(preheat_4_label, PREHEAT_5_LABEL); - #endif - - #define _PLBL(N) preheat_##N##_label, - static PGM_P const preheat_labels[PREHEAT_COUNT] PROGMEM = { REPEAT(PREHEAT_COUNT, _PLBL) }; - - return (PGM_P)pgm_read_ptr(&preheat_labels[m]); - } -#endif - -#if HAS_WIRED_LCD - -#if HAS_MARLINUI_U8GLIB - #include "dogm/ultralcd_DOGM.h" -#endif - -#include "lcdprint.h" #include "../sd/cardreader.h" - #include "../module/temperature.h" #include "../module/planner.h" +#include "../module/stepper.h" #include "../module/motion.h" +#include "../module/probe.h" +#include "../module/printcounter.h" +#include "../gcode/gcode.h" +#include "../gcode/queue.h" +#include "../module/configuration_store.h" -#if HAS_LCD_MENU - #include "../module/settings.h" +#include "../Marlin.h" + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" #endif -#if ENABLED(AUTO_BED_LEVELING_UBL) +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../feature/power_loss_recovery.h" +#endif + +#if ENABLED(PRINTCOUNTER) && ENABLED(LCD_INFO_MENU) + #include "../libs/duration_t.h" +#endif + +#if ENABLED(FILAMENT_LCD_DISPLAY) + #include "../feature/filwidth.h" +#endif + +#if ENABLED(BLTOUCH) + #include "../module/endstops.h" +#endif + +#if HAS_LEVELING #include "../feature/bedlevel/bedlevel.h" #endif -#if HAS_TRINAMIC_CONFIG - #include "../feature/tmc_util.h" +#if ENABLED(LED_CONTROL_MENU) + #include "../feature/leds/leds.h" #endif -#if HAS_ADC_BUTTONS - #include "../module/thermistor/thermistors.h" +// For i2c define BUZZ to use lcd_buzz +#if DISABLED(LCD_USE_I2C_BUZZER) + #include "../libs/buzzer.h" #endif -#if HAS_POWER_MONITOR - #include "../feature/power_monitor.h" -#endif - -#if HAS_ENCODER_ACTION - volatile uint8_t MarlinUI::buttons; - #if HAS_SLOW_BUTTONS - volatile uint8_t MarlinUI::slow_buttons; - #endif - #if HAS_TOUCH_XPT2046 - #include "touch/touch_buttons.h" - bool MarlinUI::on_edit_screen = false; +#if ENABLED(STATUS_MESSAGE_SCROLLING) + #if LONG_FILENAME_LENGTH > CHARSIZE * 2 * (LCD_WIDTH) + #define MAX_MESSAGE_LENGTH LONG_FILENAME_LENGTH + #else + #define MAX_MESSAGE_LENGTH CHARSIZE * 2 * (LCD_WIDTH) #endif + uint8_t status_scroll_offset = 0; +#else + #define MAX_MESSAGE_LENGTH CHARSIZE * (LCD_WIDTH) #endif -#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 - bool MarlinUI::defer_return_to_status; +char lcd_status_message[MAX_MESSAGE_LENGTH + 1]; +uint8_t lcd_status_update_delay = 1, // First update one loop delayed + lcd_status_message_level; // Higher level blocks lower level + +#if ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) + millis_t previous_lcd_status_ms = 0; #endif -uint8_t MarlinUI::lcd_status_update_delay = 1; // First update one loop delayed - -#if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - millis_t MarlinUI::next_filament_display; // = 0 +#if ENABLED(ULTIPANEL) && ENABLED(SCROLL_LONG_FILENAMES) + uint8_t filename_scroll_pos, filename_scroll_max, filename_scroll_hash; #endif -millis_t MarlinUI::next_button_update_ms; // = 0 - -#if HAS_MARLINUI_U8GLIB - bool MarlinUI::drawing_screen, MarlinUI::first_page; // = false +#if ENABLED(LCD_SET_PROGRESS_MANUALLY) + uint8_t progress_bar_percent; #endif -// Encoder Handling -#if HAS_ENCODER_ACTION - uint32_t MarlinUI::encoderPosition; - volatile int8_t encoderDiff; // Updated in update_buttons, added to encoderPosition every LCD update +#if ENABLED(DOGLCD) + #include "ultralcd_impl_DOGM.h" + bool drawing_screen, first_page; // = false +#else + #include "ultralcd_impl_HD44780.h" + constexpr bool first_page = true; #endif -#if ENABLED(SDSUPPORT) +// The main status screen +void lcd_status_screen(); - #include "../sd/cardreader.h" +millis_t next_lcd_update_ms; - #if MARLINUI_SCROLL_NAME - uint8_t MarlinUI::filename_scroll_pos, MarlinUI::filename_scroll_max; +uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to draw, decrements after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial) +uint16_t max_display_update_time = 0; + +#if ENABLED(ULTIPANEL) + + #define DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(_type, _name, _strFunc) \ + inline void lcd_implementation_drawmenu_setting_edit_ ## _name (const bool sel, const uint8_t row, const char* pstr, const char* pstr2, _type * const data, ...) { \ + UNUSED(pstr2); \ + DRAWMENU_SETTING_EDIT_GENERIC(_strFunc(*(data))); \ + } \ + inline void lcd_implementation_drawmenu_setting_edit_callback_ ## _name (const bool sel, const uint8_t row, const char* pstr, const char* pstr2, _type * const data, ...) { \ + UNUSED(pstr2); \ + DRAWMENU_SETTING_EDIT_GENERIC(_strFunc(*(data))); \ + } \ + inline void lcd_implementation_drawmenu_setting_edit_accessor_ ## _name (const bool sel, const uint8_t row, const char* pstr, const char* pstr2, _type (*pget)(), void (*pset)(_type), ...) { \ + UNUSED(pstr2); UNUSED(pset); \ + DRAWMENU_SETTING_EDIT_GENERIC(_strFunc(pget())); \ + } \ + typedef void _name##_void + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(int16_t, int3, itostr3); + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(uint8_t, int8, i8tostr3); + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(float, float3, ftostr3); + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(float, float52, ftostr52); + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(float, float43, ftostr43sign); + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(float, float5, ftostr5rj); + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(float, float51, ftostr51sign); + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(float, float52sign, ftostr52sign); + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(float, float62, ftostr62rj); + DEFINE_LCD_IMPLEMENTATION_DRAWMENU_SETTING_EDIT_TYPE(uint32_t, long5, ftostr5rj); + #define lcd_implementation_drawmenu_setting_edit_bool(sel, row, pstr, pstr2, data) DRAW_BOOL_SETTING(sel, row, pstr, data) + #define lcd_implementation_drawmenu_setting_edit_callback_bool(sel, row, pstr, pstr2, data, callback) DRAW_BOOL_SETTING(sel, row, pstr, data) + #define lcd_implementation_drawmenu_setting_edit_accessor_bool(sel, row, pstr, pstr2, pget, pset) DRAW_BOOL_SETTING(sel, row, pstr, data) + + #ifndef TALL_FONT_CORRECTION + #define TALL_FONT_CORRECTION 0 #endif - const char * MarlinUI::scrolled_filename(CardReader &theCard, const uint8_t maxlen, uint8_t hash, const bool doScroll) { - const char *outstr = theCard.longest_filename(); - if (theCard.longFilename[0]) { - #if MARLINUI_SCROLL_NAME - if (doScroll) { - for (uint8_t l = FILENAME_LENGTH; l--;) - hash = ((hash << 1) | (hash >> 7)) ^ theCard.filename[l]; // rotate, xor - static uint8_t filename_scroll_hash; - if (filename_scroll_hash != hash) { // If the hash changed... - filename_scroll_hash = hash; // Save the new hash - filename_scroll_max = _MAX(0, utf8_strlen(theCard.longFilename) - maxlen); // Update the scroll limit - filename_scroll_pos = 0; // Reset scroll to the start - lcd_status_update_delay = 8; // Don't scroll right away - } - outstr += filename_scroll_pos; - } - #else - theCard.longFilename[maxlen] = '\0'; // cutoff at screen edge - #endif - } - return outstr; - } + bool no_reentry = false; + constexpr int8_t menu_bottom = LCD_HEIGHT - (TALL_FONT_CORRECTION); -#endif + // Initialized by settings.load() + int16_t lcd_preheat_hotend_temp[2], lcd_preheat_bed_temp[2], lcd_preheat_fan_speed[2]; -#if HAS_LCD_MENU - #include "menu/menu.h" + #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION) + bool lcd_external_control; // = false + #endif - screenFunc_t MarlinUI::currentScreen; // Initialized in CTOR - bool MarlinUI::screen_changed; + #if ENABLED(BABYSTEPPING) + long babysteps_done = 0; + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + static void lcd_babystep_zoffset(); + #else + static void lcd_babystep_z(); + #endif + #endif + + #if ENABLED(DAC_STEPPER_CURRENT) + #include "../feature/dac/stepper_dac.h" //was dac_mcp4728.h MarlinMain uses stepper dac for the m-codes + uint8_t driverPercent[XYZE]; + #endif + + //////////////////////////////////////////// + ///////////////// Menu Tree //////////////// + //////////////////////////////////////////// + + void lcd_main_menu(); + void lcd_tune_menu(); + void lcd_movement_menu(); + void lcd_move_menu(); + void lcd_configuration_menu(); + void lcd_temperature_menu(); + void lcd_advanced_settings_menu(); + + #if DISABLED(SLIM_LCD_MENUS) + void lcd_configuration_temperature_preheat_material1_settings_menu(); + void lcd_configuration_temperature_preheat_material2_settings_menu(); + #endif + + #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) + void lcd_advanced_filament_menu(); + #endif + + #if ENABLED(LCD_INFO_MENU) + #if ENABLED(PRINTCOUNTER) + void lcd_info_stats_menu(); + #endif + void lcd_info_thermistors_menu(); + void lcd_info_board_menu(); + void lcd_info_menu(); + #endif // LCD_INFO_MENU + + #if ENABLED(LED_CONTROL_MENU) + void lcd_led_menu(); + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + void lcd_change_filament_menu(); + #else + void lcd_temp_menu_e0_filament_change(); + #endif + #endif + + #if ENABLED(DAC_STEPPER_CURRENT) + void dac_driver_commit(); + void dac_driver_getValues(); + void lcd_dac_menu(); + void lcd_dac_write_eeprom(); + #endif + + #if ENABLED(FWRETRACT) + #include "../feature/fwretract.h" + void lcd_config_retract_menu(); + #endif + + #if ENABLED(DELTA_CALIBRATION_MENU) || ENABLED(DELTA_AUTO_CALIBRATION) + void lcd_delta_calibrate_menu(); + #endif + + #if ENABLED(MESH_BED_LEVELING) && ENABLED(LCD_BED_LEVELING) + #include "../feature/bedlevel/mbl/mesh_bed_leveling.h" + #endif + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + static float new_z_fade_height; + void _lcd_set_z_fade_height() { set_z_fade_height(new_z_fade_height); } + #endif + + //////////////////////////////////////////// + //////////// Menu System Actions /////////// + //////////////////////////////////////////// + + #define menu_action_back(dummy) _menu_action_back() + void _menu_action_back(); + void menu_action_submenu(screenFunc_t data); + void menu_action_gcode(const char* pgcode); + void menu_action_function(menuAction_t data); + + #define DECLARE_MENU_EDIT_TYPE(_type, _name) \ + bool _menu_edit_ ## _name(); \ + void menu_edit_ ## _name(); \ + void menu_edit_callback_ ## _name(); \ + void _menu_action_setting_edit_ ## _name(const char * const pstr, _type* const ptr, const _type minValue, const _type maxValue); \ + void menu_action_setting_edit_ ## _name(const char * const pstr, _type * const ptr, const _type minValue, const _type maxValue); \ + void menu_action_setting_edit_callback_ ## _name(const char * const pstr, _type * const ptr, const _type minValue, const _type maxValue, const screenFunc_t callback=NULL, const bool live=false); \ + typedef void _name##_void + + DECLARE_MENU_EDIT_TYPE(int16_t, int3); + DECLARE_MENU_EDIT_TYPE(uint8_t, int8); + DECLARE_MENU_EDIT_TYPE(float, float3); + DECLARE_MENU_EDIT_TYPE(float, float52); + DECLARE_MENU_EDIT_TYPE(float, float43); + DECLARE_MENU_EDIT_TYPE(float, float5); + DECLARE_MENU_EDIT_TYPE(float, float51); + DECLARE_MENU_EDIT_TYPE(float, float52sign); + DECLARE_MENU_EDIT_TYPE(float, float62); + DECLARE_MENU_EDIT_TYPE(uint32_t, long5); + + void menu_action_setting_edit_bool(const char* pstr, bool* ptr); + void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, screenFunc_t callbackFunc); + + #if ENABLED(SDSUPPORT) + void lcd_sdcard_menu(); + void menu_action_sdfile(CardReader &theCard); + void menu_action_sddirectory(CardReader &theCard); + #endif + + //////////////////////////////////////////// + //////////// Menu System Macros //////////// + //////////////////////////////////////////// + + /** + * MENU_ITEM generates draw & handler code for a menu item, potentially calling: + * + * lcd_implementation_drawmenu_[type](sel, row, label, arg3...) + * menu_action_[type](arg3...) + * + * Examples: + * MENU_ITEM(back, MSG_WATCH, 0 [dummy parameter] ) + * or + * MENU_BACK(MSG_WATCH) + * lcd_implementation_drawmenu_back(sel, row, PSTR(MSG_WATCH)) + * menu_action_back() + * + * MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause) + * lcd_implementation_drawmenu_function(sel, row, PSTR(MSG_PAUSE_PRINT), lcd_sdcard_pause) + * menu_action_function(lcd_sdcard_pause) + * + * MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_percentage, 10, 999) + * MENU_ITEM(setting_edit_int3, MSG_SPEED, PSTR(MSG_SPEED), &feedrate_percentage, 10, 999) + * lcd_implementation_drawmenu_setting_edit_int3(sel, row, PSTR(MSG_SPEED), PSTR(MSG_SPEED), &feedrate_percentage, 10, 999) + * menu_action_setting_edit_int3(PSTR(MSG_SPEED), &feedrate_percentage, 10, 999) + * + */ + #define _MENU_ITEM_PART_1(TYPE, ...) \ + if (_menuLineNr == _thisItemNr) { \ + if (encoderLine == _thisItemNr && lcd_clicked) { \ + lcd_clicked = false + + #define _MENU_ITEM_PART_2(TYPE, PLABEL, ...) \ + menu_action_ ## TYPE(__VA_ARGS__); \ + if (screen_changed) return; \ + } \ + if (lcdDrawUpdate) \ + lcd_implementation_drawmenu_ ## TYPE(encoderLine == _thisItemNr, _lcdLineNr, PLABEL, ## __VA_ARGS__); \ + } \ + ++_thisItemNr + + #define MENU_ITEM_P(TYPE, PLABEL, ...) do { \ + _skipStatic = false; \ + _MENU_ITEM_PART_1(TYPE, ## __VA_ARGS__); \ + _MENU_ITEM_PART_2(TYPE, PLABEL, ## __VA_ARGS__); \ + }while(0) + + #define MENU_ITEM(TYPE, LABEL, ...) MENU_ITEM_P(TYPE, PSTR(LABEL), ## __VA_ARGS__) + + #define MENU_BACK(LABEL) MENU_ITEM(back, LABEL, 0) + + // Used to print static text with no visible cursor. + // Parameters: label [, bool center [, bool invert [, char *value] ] ] + #define STATIC_ITEM_P(LABEL, ...) \ + if (_menuLineNr == _thisItemNr) { \ + if (_skipStatic && encoderLine <= _thisItemNr) { \ + encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ + ++encoderLine; \ + } \ + if (lcdDrawUpdate) \ + lcd_implementation_drawmenu_static(_lcdLineNr, LABEL, ## __VA_ARGS__); \ + } \ + ++_thisItemNr + + #define STATIC_ITEM(LABEL, ...) STATIC_ITEM_P(PSTR(LABEL), ## __VA_ARGS__) #if ENABLED(ENCODER_RATE_MULTIPLIER) - bool MarlinUI::encoderRateMultiplierEnabled; - millis_t MarlinUI::lastEncoderMovementMillis = 0; - void MarlinUI::enable_encoder_multiplier(const bool onoff) { - encoderRateMultiplierEnabled = onoff; - lastEncoderMovementMillis = 0; - } + + bool encoderRateMultiplierEnabled; + #define ENCODER_RATE_MULTIPLY(F) (encoderRateMultiplierEnabled = F) + + //#define ENCODER_RATE_MULTIPLIER_DEBUG // If defined, output the encoder steps per second value + + /** + * MENU_MULTIPLIER_ITEM generates drawing and handling code for a multiplier menu item + */ + #define MENU_MULTIPLIER_ITEM(TYPE, LABEL, ...) do { \ + _MENU_ITEM_PART_1(TYPE, ## __VA_ARGS__); \ + encoderRateMultiplierEnabled = true; \ + lastEncoderMovementMillis = 0; \ + _MENU_ITEM_PART_2(TYPE, PSTR(LABEL), ## __VA_ARGS__); \ + }while(0) + + #else // !ENCODER_RATE_MULTIPLIER + #define ENCODER_RATE_MULTIPLY(F) NOOP + #endif // !ENCODER_RATE_MULTIPLIER + + #define MENU_ITEM_DUMMY() do { _thisItemNr++; }while(0) + #define MENU_ITEM_EDIT(TYPE, LABEL, ...) MENU_ITEM(setting_edit_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__) + #define MENU_ITEM_EDIT_CALLBACK(TYPE, LABEL, ...) MENU_ITEM(setting_edit_callback_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__) + #if ENABLED(ENCODER_RATE_MULTIPLIER) + #define MENU_MULTIPLIER_ITEM_EDIT(TYPE, LABEL, ...) MENU_MULTIPLIER_ITEM(setting_edit_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__) + #define MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(TYPE, LABEL, ...) MENU_MULTIPLIER_ITEM(setting_edit_callback_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__) + #else // !ENCODER_RATE_MULTIPLIER + #define MENU_MULTIPLIER_ITEM_EDIT(TYPE, LABEL, ...) MENU_ITEM(setting_edit_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__) + #define MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(TYPE, LABEL, ...) MENU_ITEM(setting_edit_callback_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__) + #endif // !ENCODER_RATE_MULTIPLIER + + #define SCREEN_OR_MENU_LOOP() \ + int8_t _menuLineNr = encoderTopLine, _thisItemNr; \ + for (int8_t _lcdLineNr = 0; _lcdLineNr < menu_bottom; _lcdLineNr++, _menuLineNr++) { \ + _thisItemNr = 0 + + /** + * START_SCREEN Opening code for a screen having only static items. + * Do simplified scrolling of the entire screen. + * + * START_MENU Opening code for a screen with menu items. + * Scroll as-needed to keep the selected line in view. + */ + #define START_SCREEN() \ + scroll_screen(menu_bottom, false); \ + bool _skipStatic = false; \ + SCREEN_OR_MENU_LOOP() + + #define START_MENU() \ + scroll_screen(1, true); \ + bool _skipStatic = true; \ + SCREEN_OR_MENU_LOOP() + + #define END_SCREEN() \ + } \ + screen_items = _thisItemNr + + #define END_MENU() \ + } \ + screen_items = _thisItemNr; \ + UNUSED(_skipStatic) + + //////////////////////////////////////////// + ///////////// Global Variables ///////////// + //////////////////////////////////////////// + + /** + * REVERSE_MENU_DIRECTION + * + * To reverse the menu direction we need a general way to reverse + * the direction of the encoder everywhere. So encoderDirection is + * added to allow the encoder to go the other way. + * + * This behavior is limited to scrolling Menus and SD card listings, + * and is disabled in other contexts. + */ + #if ENABLED(REVERSE_MENU_DIRECTION) + int8_t encoderDirection = 1; + #define ENCODER_DIRECTION_NORMAL() (encoderDirection = 1) + #define ENCODER_DIRECTION_MENUS() (encoderDirection = -1) + #else + #define ENCODER_DIRECTION_NORMAL() ; + #define ENCODER_DIRECTION_MENUS() ; #endif - #if EITHER(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) - int8_t MarlinUI::encoderDirection = ENCODERBASE; + // Encoder Movement + volatile int8_t encoderDiff; // Updated in lcd_buttons_update, added to encoderPosition every LCD update + uint32_t encoderPosition; + millis_t lastEncoderMovementMillis = 0; + + // Button States + bool lcd_clicked, wait_for_unclick; + volatile uint8_t buttons; + millis_t next_button_update_ms; + #if ENABLED(REPRAPWORLD_KEYPAD) + volatile uint8_t buttons_reprapworld_keypad; + #endif + #if ENABLED(LCD_HAS_SLOW_BUTTONS) + volatile uint8_t slow_buttons; #endif - #if HAS_TOUCH_XPT2046 - uint8_t MarlinUI::touch_buttons; - uint8_t MarlinUI::repeat_delay; + // Menu System Navigation + screenFunc_t currentScreen = lcd_status_screen; + int8_t encoderTopLine; + typedef struct { + screenFunc_t menu_function; + uint32_t encoder_position; + } menuPosition; + menuPosition screen_history[6]; + uint8_t screen_history_depth = 0; + bool screen_changed, defer_return_to_status; + + // Value Editing + const char *editLabel; + void *editValue; + int32_t minEditValue, maxEditValue; + screenFunc_t callbackFunc; + bool liveEdit; + + // Manual Moves + const float manual_feedrate_mm_m[] = MANUAL_FEEDRATE; + millis_t manual_move_start_time = 0; + int8_t manual_move_axis = (int8_t)NO_AXIS; + #if EXTRUDERS > 1 + int8_t manual_move_e_index = 0; + #else + #define manual_move_e_index 0 #endif - bool MarlinUI::lcd_clicked; + #if ENABLED(MANUAL_E_MOVES_RELATIVE) + float manual_move_e_origin = 0; + #endif - bool MarlinUI::use_click() { + #if IS_KINEMATIC + bool processing_manual_move = false; + float manual_move_offset = 0; + #else + constexpr bool processing_manual_move = false; + #endif + + #if PIN_EXISTS(SD_DETECT) + uint8_t lcd_sd_status; + #endif + + #if ENABLED(PIDTEMP) + float raw_Ki, raw_Kd; // place-holders for Ki and Kd edits + #endif + + inline bool use_click() { const bool click = lcd_clicked; lcd_clicked = false; return click; } - #if EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) + /** + * General function to go directly to a screen + */ + void lcd_goto_screen(screenFunc_t screen, const uint32_t encoder/*=0*/) { + if (currentScreen != screen) { - bool MarlinUI::external_control; // = false + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + // Shadow for editing the fade height + new_z_fade_height = planner.z_fade_height; + #endif - void MarlinUI::wait_for_release() { - while (button_pressed()) safe_delay(50); - safe_delay(50); + #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) && ENABLED(BABYSTEPPING) + static millis_t doubleclick_expire_ms = 0; + // Going to lcd_main_menu from status screen? Remember first click time. + // Going back to status screen within a very short time? Go to Z babystepping. + if (screen == lcd_main_menu) { + if (currentScreen == lcd_status_screen) + doubleclick_expire_ms = millis() + DOUBLECLICK_MAX_INTERVAL; + } + else if (screen == lcd_status_screen && currentScreen == lcd_main_menu && PENDING(millis(), doubleclick_expire_ms) && (planner.movesplanned() || IS_SD_PRINTING)) + screen = + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + lcd_babystep_zoffset + #else + lcd_babystep_z + #endif + ; + #endif + + currentScreen = screen; + encoderPosition = encoder; + if (screen == lcd_status_screen) { + defer_return_to_status = false; + #if ENABLED(AUTO_BED_LEVELING_UBL) + ubl.lcd_map_control = false; + #endif + screen_history_depth = 0; + } + lcd_implementation_clear(); + // Re-initialize custom characters that may be re-used + #if DISABLED(DOGLCD) && ENABLED(AUTO_BED_LEVELING_UBL) + if (!ubl.lcd_map_control) { + lcd_set_custom_characters( + #if ENABLED(LCD_PROGRESS_BAR) + screen == lcd_status_screen ? CHARSET_INFO : CHARSET_MENU + #endif + ); + } + #elif ENABLED(LCD_PROGRESS_BAR) + lcd_set_custom_characters(screen == lcd_status_screen ? CHARSET_INFO : CHARSET_MENU); + #endif + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + screen_changed = true; + #if ENABLED(DOGLCD) + drawing_screen = false; + #endif + } + } + + /** + * Show "Moving..." till moves are done, then revert to previous display. + */ + static const char moving[] PROGMEM = MSG_MOVING; + static const char *sync_message = moving; + + // + // Display the synchronize screen until moves are + // finished, and don't return to the caller until + // done. ** This blocks the command queue! ** + // + void _lcd_synchronize() { + if (lcdDrawUpdate) lcd_implementation_drawmenu_static(LCD_HEIGHT >= 4 ? 1 : 0, sync_message); + if (no_reentry) return; + // Make this the current handler till all moves are done + no_reentry = true; + const screenFunc_t old_screen = currentScreen; + lcd_goto_screen(_lcd_synchronize); + planner.synchronize(); // idle() is called until moves complete + no_reentry = false; + lcd_goto_screen(old_screen); + } + + // Display the synchronize screen with a custom message + // ** This blocks the command queue! ** + void lcd_synchronize(const char * const msg=NULL) { + sync_message = msg ? msg : moving; + _lcd_synchronize(); + } + + void lcd_return_to_status() { lcd_goto_screen(lcd_status_screen); } + + void lcd_save_previous_screen() { + if (screen_history_depth < COUNT(screen_history)) { + screen_history[screen_history_depth].menu_function = currentScreen; + screen_history[screen_history_depth].encoder_position = encoderPosition; + ++screen_history_depth; + } + } + + void lcd_goto_previous_menu() { + if (screen_history_depth > 0) { + --screen_history_depth; + lcd_goto_screen( + screen_history[screen_history_depth].menu_function, + screen_history[screen_history_depth].encoder_position + ); + } + else + lcd_return_to_status(); + } + + void lcd_goto_previous_menu_no_defer() { + defer_return_to_status = false; + lcd_goto_previous_menu(); + } + + /** + * Scrolling for menus and other line-based screens + * + * encoderLine is the position based on the encoder + * encoderTopLine is the top menu line to display + * _lcdLineNr is the index of the LCD line (e.g., 0-3) + * _menuLineNr is the menu item to draw and process + * _thisItemNr is the index of each MENU_ITEM or STATIC_ITEM + * screen_items is the total number of items in the menu (after one call) + */ + int8_t encoderLine, screen_items; + void scroll_screen(const uint8_t limit, const bool is_menu) { + ENCODER_DIRECTION_MENUS(); + ENCODER_RATE_MULTIPLY(false); + if (encoderPosition > 0x8000) encoderPosition = 0; + if (first_page) { + encoderLine = encoderPosition / (ENCODER_STEPS_PER_MENU_ITEM); + screen_changed = false; + } + if (screen_items > 0 && encoderLine >= screen_items - limit) { + encoderLine = MAX(0, screen_items - limit); + encoderPosition = encoderLine * (ENCODER_STEPS_PER_MENU_ITEM); + } + if (is_menu) { + NOMORE(encoderTopLine, encoderLine); + if (encoderLine >= encoderTopLine + menu_bottom) + encoderTopLine = encoderLine - menu_bottom + 1; + } + else + encoderTopLine = encoderLine; + } + +#endif // ULTIPANEL + +/** + * + * "Info Screen" + * + * This is very display-dependent, so the lcd implementation draws this. + */ + +void lcd_status_screen() { + + #if ENABLED(ULTIPANEL) + ENCODER_DIRECTION_NORMAL(); + ENCODER_RATE_MULTIPLY(false); + #endif + + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) && ENABLED(SDSUPPORT) && (ENABLED(LCD_PROGRESS_BAR) || ENABLED(DOGLCD)) + // Progress bar % comes from SD when actively printing + if (IS_SD_PRINTING) + progress_bar_percent = card.percentDone(); + #endif + + #if ENABLED(LCD_PROGRESS_BAR) + + // + // HD44780 implements the following message blinking and + // message expiration because Status Line and Progress Bar + // share the same line on the display. + // + + millis_t ms = millis(); + + // If the message will blink rather than expire... + #if DISABLED(PROGRESS_MSG_ONCE) + if (ELAPSED(ms, progress_bar_ms + PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME)) + progress_bar_ms = ms; + #endif + + #if PROGRESS_MSG_EXPIRE > 0 + + // Handle message expire + if (expire_status_ms > 0) { + + #if DISABLED(LCD_SET_PROGRESS_MANUALLY) + const uint8_t progress_bar_percent = card.percentDone(); + #endif + + // Expire the message if a job is active and the bar has ticks + if (progress_bar_percent > 2 && !print_job_timer.isPaused()) { + if (ELAPSED(ms, expire_status_ms)) { + lcd_status_message[0] = '\0'; + expire_status_ms = 0; + } + } + else { + // Defer message expiration before bar appears + // and during any pause (not just SD) + expire_status_ms += LCD_UPDATE_INTERVAL; + } + } + + #endif // PROGRESS_MSG_EXPIRE + + #endif // LCD_PROGRESS_BAR + + #if ENABLED(ULTIPANEL) + + if (use_click()) { + #if ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) + previous_lcd_status_ms = millis(); // get status message to show up for a while + #endif + lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. + #if ENABLED(LCD_PROGRESS_BAR) + CHARSET_MENU + #endif + ); + lcd_goto_screen(lcd_main_menu); + return; + } + + #if ENABLED(ULTIPANEL_FEEDMULTIPLY) + const int16_t new_frm = feedrate_percentage + (int32_t)encoderPosition; + // Dead zone at 100% feedrate + if ((feedrate_percentage < 100 && new_frm > 100) || (feedrate_percentage > 100 && new_frm < 100)) { + feedrate_percentage = 100; + encoderPosition = 0; + } + else if (feedrate_percentage == 100) { + if ((int32_t)encoderPosition > ENCODER_FEEDRATE_DEADZONE) { + feedrate_percentage += (int32_t)encoderPosition - (ENCODER_FEEDRATE_DEADZONE); + encoderPosition = 0; + } + else if ((int32_t)encoderPosition < -(ENCODER_FEEDRATE_DEADZONE)) { + feedrate_percentage += (int32_t)encoderPosition + ENCODER_FEEDRATE_DEADZONE; + encoderPosition = 0; + } + } + else { + feedrate_percentage = new_frm; + encoderPosition = 0; + } + #endif // ULTIPANEL_FEEDMULTIPLY + + feedrate_percentage = constrain(feedrate_percentage, 10, 999); + + #endif // ULTIPANEL + + lcd_implementation_status_screen(); +} + +/** + * Reset the status message + */ +void lcd_reset_status() { + static const char paused[] PROGMEM = MSG_PRINT_PAUSED; + static const char printing[] PROGMEM = MSG_PRINTING; + static const char welcome[] PROGMEM = WELCOME_MSG; + const char *msg; + if (print_job_timer.isPaused()) + msg = paused; + #if ENABLED(SDSUPPORT) + else if (card.sdprinting) + return lcd_setstatus(card.longest_filename(), true); + #endif + else if (print_job_timer.isRunning()) + msg = printing; + else + msg = welcome; + + lcd_setstatusPGM(msg, -1); +} + +/** + * + * draw the kill screen + * + */ +void kill_screen(const char* lcd_msg) { + lcd_init(); + lcd_setalertstatusPGM(lcd_msg); + lcd_kill_screen(); +} + +/** + * + * Audio feedback for controller clicks + * + */ +void lcd_buzz(const long duration, const uint16_t freq) { + #if ENABLED(LCD_USE_I2C_BUZZER) + lcd.buzz(duration, freq); + #elif PIN_EXISTS(BEEPER) + buzzer.tone(duration, freq); + #else + UNUSED(duration); UNUSED(freq); + #endif +} + +void lcd_quick_feedback(const bool clear_buttons) { + + #if ENABLED(ULTIPANEL) + lcd_refresh(); + if (clear_buttons) buttons = 0; + next_button_update_ms = millis() + 500; + #else + UNUSED(clear_buttons); + #endif + + // Buzz and wait. The delay is needed for buttons to settle! + lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ); + + #if ENABLED(ULTIPANEL) + #if ENABLED(LCD_USE_I2C_BUZZER) + delay(10); + #elif PIN_EXISTS(BEEPER) + for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } + #endif + #endif +} + +#if ENABLED(ULTIPANEL) + + void lcd_completion_feedback(const bool good/*=true*/) { + if (good) { + lcd_buzz(100, 659); + lcd_buzz(100, 698); + } + else lcd_buzz(20, 440); + } + + inline void line_to_current_z() { + planner.buffer_line_kinematic(current_position, MMM_TO_MMS(manual_feedrate_mm_m[Z_AXIS]), active_extruder); + } + + inline void line_to_z(const float &z) { + current_position[Z_AXIS] = z; + line_to_current_z(); + } + + #if ENABLED(SDSUPPORT) + + void lcd_sdcard_pause() { + card.pauseSDPrint(); + print_job_timer.pause(); + #if ENABLED(PARK_HEAD_ON_PAUSE) + enqueue_and_echo_commands_P(PSTR("M125")); + #endif + lcd_reset_status(); + } + + void lcd_sdcard_resume() { + #if ENABLED(PARK_HEAD_ON_PAUSE) + enqueue_and_echo_commands_P(PSTR("M24")); + #else + card.startFileprint(); + print_job_timer.start(); + #endif + lcd_reset_status(); + } + + bool abort_sd_printing; // =false + + void lcd_sdcard_stop() { + wait_for_heatup = wait_for_user = false; + abort_sd_printing = true; + lcd_setstatusPGM(PSTR(MSG_PRINT_ABORTED), -1); + lcd_return_to_status(); + } + + #endif // SDSUPPORT + + #if ENABLED(POWER_LOSS_RECOVERY) + + static void lcd_power_loss_recovery_resume() { + char cmd[20]; + + // Return to status now + lcd_return_to_status(); + + // Turn leveling off and home + enqueue_and_echo_commands_P(PSTR("M420 S0\nG28 R0" + #if ENABLED(MARLIN_DEV_MODE) + " S" + #elif !IS_KINEMATIC + " X Y" + #endif + )); + + #if HAS_HEATED_BED + const int16_t bt = job_recovery_info.target_temperature_bed; + if (bt) { + // Restore the bed temperature + sprintf_P(cmd, PSTR("M190 S%i"), bt); + enqueue_and_echo_command(cmd); + } + #endif + + // Restore all hotend temperatures + HOTEND_LOOP() { + const int16_t et = job_recovery_info.target_temperature[e]; + if (et) { + #if HOTENDS > 1 + sprintf_P(cmd, PSTR("T%i"), e); + enqueue_and_echo_command(cmd); + #endif + sprintf_P(cmd, PSTR("M109 S%i"), et); + enqueue_and_echo_command(cmd); + } + } + + #if HOTENDS > 1 + sprintf_P(cmd, PSTR("T%i"), job_recovery_info.active_hotend); + enqueue_and_echo_command(cmd); + #endif + + // Restore print cooling fan speeds + for (uint8_t i = 0; i < FAN_COUNT; i++) { + int16_t f = job_recovery_info.fanSpeeds[i]; + if (f) { + sprintf_P(cmd, PSTR("M106 P%i S%i"), i, f); + enqueue_and_echo_command(cmd); + } + } + + // Start draining the job recovery command queue + job_recovery_phase = JOB_RECOVERY_YES; + } + + static void lcd_power_loss_recovery_cancel() { + card.removeJobRecoveryFile(); + card.autostart_index = 0; + lcd_return_to_status(); + } + + static void lcd_job_recovery_menu() { + defer_return_to_status = true; + START_MENU(); + STATIC_ITEM(MSG_POWER_LOSS_RECOVERY); + MENU_ITEM(function, MSG_RESUME_PRINT, lcd_power_loss_recovery_resume); + MENU_ITEM(function, MSG_STOP_PRINT, lcd_power_loss_recovery_cancel); + END_MENU(); + } + + #endif // POWER_LOSS_RECOVERY + + #if ENABLED(MENU_ITEM_CASE_LIGHT) + + #include "../feature/caselight.h" + + void case_light_menu() { + START_MENU(); + // + // ^ Main + // + MENU_BACK(MSG_MAIN); + MENU_ITEM_EDIT_CALLBACK(int8, MSG_CASE_LIGHT_BRIGHTNESS, &case_light_brightness, 0, 255, update_case_light, true); + MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); + END_MENU(); + } + #endif // MENU_ITEM_CASE_LIGHT + + #if ENABLED(BLTOUCH) + + /** + * + * "BLTouch" submenu + * + */ + static void bltouch_menu() { + START_MENU(); + // + // ^ Main + // + MENU_BACK(MSG_MAIN); + MENU_ITEM(gcode, MSG_BLTOUCH_RESET, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_RESET))); + MENU_ITEM(gcode, MSG_BLTOUCH_SELFTEST, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_SELFTEST))); + MENU_ITEM(gcode, MSG_BLTOUCH_DEPLOY, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_DEPLOY))); + MENU_ITEM(gcode, MSG_BLTOUCH_STOW, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_STOW))); + END_MENU(); + } + + #endif // BLTOUCH + + #if ENABLED(LCD_PROGRESS_BAR_TEST) + + static void progress_bar_test() { + static int8_t bar_percent = 0; + if (use_click()) { + lcd_goto_previous_menu(); + lcd_set_custom_characters(CHARSET_MENU); + return; + } + bar_percent += (int8_t)encoderPosition; + bar_percent = constrain(bar_percent, 0, 100); + encoderPosition = 0; + lcd_implementation_drawmenu_static(0, PSTR(MSG_PROGRESS_BAR_TEST), true, true); + lcd_moveto((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2); + lcd_put_u8str(int(bar_percent)); lcd_put_wchar('%'); + lcd_moveto(0, LCD_HEIGHT - 1); lcd_draw_progress_bar(bar_percent); + } + + void _progress_bar_test() { + lcd_goto_screen(progress_bar_test); + lcd_set_custom_characters(); + } + + #endif // LCD_PROGRESS_BAR_TEST + + #if HAS_DEBUG_MENU + + void lcd_debug_menu() { + START_MENU(); + + MENU_BACK(MSG_MAIN); // ^ Main + + #if ENABLED(LCD_PROGRESS_BAR_TEST) + MENU_ITEM(submenu, MSG_PROGRESS_BAR_TEST, _progress_bar_test); + #endif + + END_MENU(); + } + + #endif // HAS_DEBUG_MENU + + /** + * IDEX submenu + */ + #if ENABLED(DUAL_X_CARRIAGE) + static void IDEX_menu() { + START_MENU(); + MENU_BACK(MSG_MAIN); + MENU_ITEM(gcode, MSG_IDEX_MODE_AUTOPARK, PSTR("M605 S1\nG28 X\nG1 X100")); + if (!TEST(axis_known_position, Y_AXIS) || !TEST(axis_known_position, Z_AXIS)) + MENU_ITEM(gcode, MSG_IDEX_MODE_DUPLICATE, PSTR("T0\nG28\nM605 S2 X200\nG28 X\nG1 X100")); // If Y or Z is not homed, a full G28 is done first. + else + MENU_ITEM(gcode, MSG_IDEX_MODE_DUPLICATE, PSTR("T0\nM605 S2 X200\nG28 X\nG1 X100")); // If Y and Z is homed, a full G28 is not needed first. + MENU_ITEM(gcode, MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X")); + END_MENU(); + } + #endif // DUAL_X_CARRIAGE + + #if ENABLED(CUSTOM_USER_MENUS) + + #ifdef USER_SCRIPT_DONE + #define _DONE_SCRIPT "\n" USER_SCRIPT_DONE + #else + #define _DONE_SCRIPT "" + #endif + + void _lcd_user_gcode(const char * const cmd) { + enqueue_and_echo_commands_P(cmd); + #if ENABLED(USER_SCRIPT_AUDIBLE_FEEDBACK) + lcd_completion_feedback(); + #endif + #if ENABLED(USER_SCRIPT_RETURN) + lcd_return_to_status(); + #endif + } + + #if defined(USER_DESC_1) && defined(USER_GCODE_1) + void lcd_user_gcode_1() { _lcd_user_gcode(PSTR(USER_GCODE_1 _DONE_SCRIPT)); } + #endif + #if defined(USER_DESC_2) && defined(USER_GCODE_2) + void lcd_user_gcode_2() { _lcd_user_gcode(PSTR(USER_GCODE_2 _DONE_SCRIPT)); } + #endif + #if defined(USER_DESC_3) && defined(USER_GCODE_3) + void lcd_user_gcode_3() { _lcd_user_gcode(PSTR(USER_GCODE_3 _DONE_SCRIPT)); } + #endif + #if defined(USER_DESC_4) && defined(USER_GCODE_4) + void lcd_user_gcode_4() { _lcd_user_gcode(PSTR(USER_GCODE_4 _DONE_SCRIPT)); } + #endif + #if defined(USER_DESC_5) && defined(USER_GCODE_5) + void lcd_user_gcode_5() { _lcd_user_gcode(PSTR(USER_GCODE_5 _DONE_SCRIPT)); } + #endif + + void _lcd_user_menu() { + START_MENU(); + MENU_BACK(MSG_MAIN); + #if defined(USER_DESC_1) && defined(USER_GCODE_1) + MENU_ITEM(function, USER_DESC_1, lcd_user_gcode_1); + #endif + #if defined(USER_DESC_2) && defined(USER_GCODE_2) + MENU_ITEM(function, USER_DESC_2, lcd_user_gcode_2); + #endif + #if defined(USER_DESC_3) && defined(USER_GCODE_3) + MENU_ITEM(function, USER_DESC_3, lcd_user_gcode_3); + #endif + #if defined(USER_DESC_4) && defined(USER_GCODE_4) + MENU_ITEM(function, USER_DESC_4, lcd_user_gcode_4); + #endif + #if defined(USER_DESC_5) && defined(USER_GCODE_5) + MENU_ITEM(function, USER_DESC_5, lcd_user_gcode_5); + #endif + END_MENU(); } #endif - void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, bool wordwrap/*=false*/) { - SETCURSOR(col, row); - if (!string) return; + /** + * + * "Main" menu + * + */ - auto _newline = [&col, &row]{ - col = 0; row++; // Move col to string len (plus space) - SETCURSOR(0, row); // Simulate carriage return - }; + #if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART) - uint8_t *p = (uint8_t*)string; - wchar_t ch; - if (wordwrap) { - uint8_t *wrd = nullptr, c = 0; - // find the end of the part - for (;;) { - if (!wrd) wrd = p; // Get word start /before/ advancing - p = get_utf8_value_cb(p, cb_read_byte, &ch); - const bool eol = !ch; // zero ends the string - // End or a break between phrases? - if (eol || ch == ' ' || ch == '-' || ch == '+' || ch == '.') { - if (!c && ch == ' ') { if (wrd) wrd++; continue; } // collapse extra spaces - // Past the right and the word is not too long? - if (col + c > LCD_WIDTH && col >= (LCD_WIDTH) / 4) _newline(); // should it wrap? - c += !eol; // +1 so the space will be printed - col += c; // advance col to new position - while (c) { // character countdown - --c; // count down to zero - wrd = get_utf8_value_cb(wrd, cb_read_byte, &ch); // get characters again - lcd_put_wchar(ch); // character to the LCD - } - if (eol) break; // all done! - wrd = nullptr; // set up for next word + void lcd_autostart_sd() { card.beginautostart(); } + + #endif + + void lcd_main_menu() { + START_MENU(); + MENU_BACK(MSG_WATCH); + + #if ENABLED(CUSTOM_USER_MENUS) + MENU_ITEM(submenu, MSG_USER_MENU, _lcd_user_menu); + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + MENU_ITEM(submenu, MSG_IDEX_MENU, IDEX_menu); + #endif + + // + // Debug Menu when certain options are enabled + // + #if HAS_DEBUG_MENU + MENU_ITEM(submenu, MSG_DEBUG_MENU, lcd_debug_menu); + #endif + + // + // Set Case light on/off/brightness + // + #if ENABLED(MENU_ITEM_CASE_LIGHT) + if (USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN)) { + MENU_ITEM(submenu, MSG_CASE_LIGHT, case_light_menu); + } + else + MENU_ITEM_EDIT_CALLBACK(bool, MSG_CASE_LIGHT, (bool*)&case_light_on, update_case_light); + #endif + + #if ENABLED(SDSUPPORT) + if (card.cardOK) { + if (card.isFileOpen()) { + if (card.sdprinting) + MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause); + else + MENU_ITEM(function, MSG_RESUME_PRINT, lcd_sdcard_resume); + MENU_ITEM(function, MSG_STOP_PRINT, lcd_sdcard_stop); + } + else { + MENU_ITEM(submenu, MSG_CARD_MENU, lcd_sdcard_menu); + #if !PIN_EXISTS(SD_DETECT) + MENU_ITEM(gcode, MSG_CNG_SDCARD, PSTR("M21")); // SD-card changed by user + #endif } - else c++; // count word characters } - } + else { + MENU_ITEM(submenu, MSG_NO_CARD, lcd_sdcard_menu); + #if !PIN_EXISTS(SD_DETECT) + MENU_ITEM(gcode, MSG_INIT_SDCARD, PSTR("M21")); // Manually initialize the SD-card via user interface + #endif + } + #endif // SDSUPPORT + + if (planner.movesplanned() || IS_SD_PRINTING) + MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu); else { - for (;;) { - p = get_utf8_value_cb(p, cb_read_byte, &ch); - if (!ch) break; - lcd_put_wchar(ch); - col++; - if (col >= LCD_WIDTH) _newline(); + MENU_ITEM(submenu, MSG_MOTION, lcd_movement_menu); + MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_temperature_menu); + MENU_ITEM(submenu, MSG_CONFIGURATION, lcd_configuration_menu); + } + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) + if (thermalManager.targetHotEnoughToExtrude(active_extruder)) + MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600 B0")); + else + MENU_ITEM(submenu, MSG_FILAMENTCHANGE, lcd_temp_menu_e0_filament_change); + #else + MENU_ITEM(submenu, MSG_FILAMENTCHANGE, lcd_change_filament_menu); + #endif + #endif + + #if ENABLED(LCD_INFO_MENU) + MENU_ITEM(submenu, MSG_INFO_MENU, lcd_info_menu); + #endif + + #if ENABLED(LED_CONTROL_MENU) + MENU_ITEM(submenu, MSG_LED_CONTROL, lcd_led_menu); + #endif + + // + // Switch power on/off + // + #if HAS_POWER_SWITCH + if (powersupply_on) + MENU_ITEM(gcode, MSG_SWITCH_PS_OFF, PSTR("M81")); + else + MENU_ITEM(gcode, MSG_SWITCH_PS_ON, PSTR("M80")); + #endif + + // + // Autostart + // + #if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART) + MENU_ITEM(function, MSG_AUTOSTART, lcd_autostart_sd); + #endif + + END_MENU(); + } + + /** + * + * "Tune" submenu items + * + */ + + #if ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) || ENABLED(MESH_EDIT_GFX_OVERLAY) + + void _lcd_zoffset_overlay_gfx(const float zvalue) { + // Determine whether the user is raising or lowering the nozzle. + static int8_t dir; + static float old_zvalue; + if (zvalue != old_zvalue) { + dir = zvalue ? zvalue < old_zvalue ? -1 : 1 : 0; + old_zvalue = zvalue; + } + + #if ENABLED(OVERLAY_GFX_REVERSE) + const unsigned char *rot_up = ccw_bmp, *rot_down = cw_bmp; + #else + const unsigned char *rot_up = cw_bmp, *rot_down = ccw_bmp; + #endif + + #if ENABLED(USE_BIG_EDIT_FONT) + const int left = 0, right = 45, nozzle = 95; + #else + const int left = 5, right = 90, nozzle = 60; + #endif + + // Draw a representation of the nozzle + if (PAGE_CONTAINS(3, 16)) u8g.drawBitmapP(nozzle + 6, 4 - dir, 2, 12, nozzle_bmp); + if (PAGE_CONTAINS(20, 20)) u8g.drawBitmapP(nozzle + 0, 20, 3, 1, offset_bedline_bmp); + + // Draw cw/ccw indicator and up/down arrows. + if (PAGE_CONTAINS(47, 62)) { + u8g.drawBitmapP(left + 0, 47, 3, 16, rot_down); + u8g.drawBitmapP(right + 0, 47, 3, 16, rot_up); + u8g.drawBitmapP(right + 20, 48 - dir, 2, 13, up_arrow_bmp); + u8g.drawBitmapP(left + 20, 49 - dir, 2, 13, down_arrow_bmp); } } + + #endif // BABYSTEP_ZPROBE_GFX_OVERLAY || MESH_EDIT_GFX_OVERLAY + + #if ENABLED(BABYSTEPPING) + + void _lcd_babystep(const AxisEnum axis, const char* msg) { + if (use_click()) { return lcd_goto_previous_menu_no_defer(); } + ENCODER_DIRECTION_NORMAL(); + if (encoderPosition) { + const int16_t babystep_increment = (int32_t)encoderPosition * (BABYSTEP_MULTIPLICATOR); + encoderPosition = 0; + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; + thermalManager.babystep_axis(axis, babystep_increment); + babysteps_done += babystep_increment; + } + if (lcdDrawUpdate) + lcd_implementation_drawedit(msg, ftostr43sign(planner.steps_to_mm[axis] * babysteps_done)); + } + + #if ENABLED(BABYSTEP_XY) + void _lcd_babystep_x() { _lcd_babystep(X_AXIS, PSTR(MSG_BABYSTEP_X)); } + void _lcd_babystep_y() { _lcd_babystep(Y_AXIS, PSTR(MSG_BABYSTEP_Y)); } + void lcd_babystep_x() { lcd_goto_screen(_lcd_babystep_x); babysteps_done = 0; defer_return_to_status = true; } + void lcd_babystep_y() { lcd_goto_screen(_lcd_babystep_y); babysteps_done = 0; defer_return_to_status = true; } + #endif + + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + + void lcd_babystep_zoffset() { + if (use_click()) { return lcd_goto_previous_menu_no_defer(); } + defer_return_to_status = true; + ENCODER_DIRECTION_NORMAL(); + if (encoderPosition) { + const int16_t babystep_increment = (int32_t)encoderPosition * (BABYSTEP_MULTIPLICATOR); + encoderPosition = 0; + + const float new_zoffset = zprobe_zoffset + planner.steps_to_mm[Z_AXIS] * babystep_increment; + if (WITHIN(new_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + thermalManager.babystep_axis(Z_AXIS, babystep_increment); + zprobe_zoffset = new_zoffset; + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + } + } + if (lcdDrawUpdate) { + lcd_implementation_drawedit(PSTR(MSG_ZPROBE_ZOFFSET), ftostr43sign(zprobe_zoffset)); + #if ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) + _lcd_zoffset_overlay_gfx(zprobe_zoffset); + #endif + } + } + + #else // !BABYSTEP_ZPROBE_OFFSET + + void _lcd_babystep_z() { _lcd_babystep(Z_AXIS, PSTR(MSG_BABYSTEP_Z)); } + void lcd_babystep_z() { lcd_goto_screen(_lcd_babystep_z); babysteps_done = 0; defer_return_to_status = true; } + + #endif // !BABYSTEP_ZPROBE_OFFSET + + #endif // BABYSTEPPING + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + float mesh_edit_value, mesh_edit_accumulator; // We round mesh_edit_value to 2.5 decimal places. So we keep a + // separate value that doesn't lose precision. + static int16_t ubl_encoderPosition = 0; + + static void _lcd_mesh_fine_tune(const char* msg) { + defer_return_to_status = true; + if (ubl.encoder_diff) { + ubl_encoderPosition = (ubl.encoder_diff > 0) ? 1 : -1; + ubl.encoder_diff = 0; + + mesh_edit_accumulator += float(ubl_encoderPosition) * 0.005f * 0.5f; + mesh_edit_value = mesh_edit_accumulator; + encoderPosition = 0; + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + + const int32_t rounded = (int32_t)(mesh_edit_value * 1000); + mesh_edit_value = float(rounded - (rounded % 5L)) / 1000; + } + + if (lcdDrawUpdate) { + lcd_implementation_drawedit(msg, ftostr43sign(mesh_edit_value)); + #if ENABLED(MESH_EDIT_GFX_OVERLAY) + _lcd_zoffset_overlay_gfx(mesh_edit_value); + #endif + } + } + + void _lcd_mesh_edit_NOP() { + defer_return_to_status = true; + } + + float lcd_mesh_edit() { + lcd_goto_screen(_lcd_mesh_edit_NOP); + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + _lcd_mesh_fine_tune(PSTR("Mesh Editor")); + return mesh_edit_value; + } + + void lcd_mesh_edit_setup(const float &initial) { + mesh_edit_value = mesh_edit_accumulator = initial; + lcd_goto_screen(_lcd_mesh_edit_NOP); + } + + void _lcd_z_offset_edit() { + _lcd_mesh_fine_tune(PSTR("Z-Offset: ")); + } + + float lcd_z_offset_edit() { + lcd_goto_screen(_lcd_z_offset_edit); + return mesh_edit_value; + } + + void lcd_z_offset_edit_setup(const float &initial) { + mesh_edit_value = mesh_edit_accumulator = initial; + lcd_goto_screen(_lcd_z_offset_edit); + } + + #endif // AUTO_BED_LEVELING_UBL + + + /** + * Watch temperature callbacks + */ + #if HAS_TEMP_HOTEND + #if WATCH_HOTENDS + #define _WATCH_FUNC(N) thermalManager.start_watching_heater(N) + #else + #define _WATCH_FUNC(N) NOOP + #endif + void watch_temp_callback_E0() { _WATCH_FUNC(0); } + #if HOTENDS > 1 + void watch_temp_callback_E1() { _WATCH_FUNC(1); } + #if HOTENDS > 2 + void watch_temp_callback_E2() { _WATCH_FUNC(2); } + #if HOTENDS > 3 + void watch_temp_callback_E3() { _WATCH_FUNC(3); } + #if HOTENDS > 4 + void watch_temp_callback_E4() { _WATCH_FUNC(4); } + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 + #endif // HAS_TEMP_HOTEND + + void watch_temp_callback_bed() { + #if WATCH_THE_BED + thermalManager.start_watching_bed(); + #endif } - void MarlinUI::draw_select_screen_prompt(PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { - const uint8_t plen = utf8_strlen_P(pref), slen = suff ? utf8_strlen_P(suff) : 0; - uint8_t col = 0, row = 0; - if (!string && plen + slen <= LCD_WIDTH) { - col = (LCD_WIDTH - plen - slen) / 2; - row = LCD_HEIGHT > 3 ? 1 : 0; - } - wrap_string_P(col, row, pref, true); - if (string) { - if (col) { col = 0; row++; } // Move to the start of the next line - wrap_string(col, row, string); - } - if (suff) wrap_string_P(col, row, suff); + // First Fan Speed title in "Tune" and "Control>Temperature" menus + #if FAN_COUNT > 0 && HAS_FAN0 + #if FAN_COUNT > 1 + #define FAN_SPEED_1_SUFFIX " 1" + #else + #define FAN_SPEED_1_SUFFIX "" + #endif + #endif + + // Refresh the E factor after changing flow + inline void _lcd_refresh_e_factor_0() { planner.refresh_e_factor(0); } + #if EXTRUDERS > 1 + inline void _lcd_refresh_e_factor() { planner.refresh_e_factor(active_extruder); } + inline void _lcd_refresh_e_factor_1() { planner.refresh_e_factor(1); } + #if EXTRUDERS > 2 + inline void _lcd_refresh_e_factor_2() { planner.refresh_e_factor(2); } + #if EXTRUDERS > 3 + inline void _lcd_refresh_e_factor_3() { planner.refresh_e_factor(3); } + #if EXTRUDERS > 4 + inline void _lcd_refresh_e_factor_4() { planner.refresh_e_factor(4); } + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + + /** + * + * "Tune" submenu + * + */ + void lcd_tune_menu() { + START_MENU(); + + // + // ^ Main + // + MENU_BACK(MSG_MAIN); + + // + // Speed: + // + MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_percentage, 10, 999); + + // + // Manual bed leveling, Bed Z: + // + #if ENABLED(MESH_BED_LEVELING) && ENABLED(LCD_BED_LEVELING) + MENU_ITEM_EDIT(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); + #endif + + // + // Leveling Fade Height + // + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) && DISABLED(SLIM_LCD_MENUS) + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float3, MSG_Z_FADE_HEIGHT, &new_z_fade_height, 0, 100, _lcd_set_z_fade_height); + #endif + + // + // Nozzle: + // Nozzle [1-4]: + // + #if HOTENDS == 1 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE, &thermalManager.target_temperature[0], 0, HEATER_0_MAXTEMP - 15, watch_temp_callback_E0); + #else // HOTENDS > 1 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N1, &thermalManager.target_temperature[0], 0, HEATER_0_MAXTEMP - 15, watch_temp_callback_E0); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N2, &thermalManager.target_temperature[1], 0, HEATER_1_MAXTEMP - 15, watch_temp_callback_E1); + #if HOTENDS > 2 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N3, &thermalManager.target_temperature[2], 0, HEATER_2_MAXTEMP - 15, watch_temp_callback_E2); + #if HOTENDS > 3 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N4, &thermalManager.target_temperature[3], 0, HEATER_3_MAXTEMP - 15, watch_temp_callback_E3); + #if HOTENDS > 4 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N5, &thermalManager.target_temperature[4], 0, HEATER_4_MAXTEMP - 15, watch_temp_callback_E4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 + + // + // Bed: + // + #if HAS_HEATED_BED + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_BED, &thermalManager.target_temperature_bed, 0, BED_MAXTEMP - 15, watch_temp_callback_bed); + #endif + + // + // Fan Speed: + // + #if FAN_COUNT > 0 + #if HAS_FAN0 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED FAN_SPEED_1_SUFFIX, &fanSpeeds[0], 0, 255); + #if ENABLED(EXTRA_FAN_SPEED) + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED FAN_SPEED_1_SUFFIX, &new_fanSpeeds[0], 3, 255); + #endif + #endif + #if HAS_FAN1 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 2", &fanSpeeds[1], 0, 255); + #if ENABLED(EXTRA_FAN_SPEED) + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED " 2", &new_fanSpeeds[1], 3, 255); + #endif + #endif + #if HAS_FAN2 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 3", &fanSpeeds[2], 0, 255); + #if ENABLED(EXTRA_FAN_SPEED) + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED " 3", &new_fanSpeeds[2], 3, 255); + #endif + #endif + #endif // FAN_COUNT > 0 + + // + // Flow: + // Flow [1-5]: + // + #if EXTRUDERS == 1 + MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW, &planner.flow_percentage[0], 10, 999, _lcd_refresh_e_factor_0); + #else // EXTRUDERS > 1 + MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW, &planner.flow_percentage[active_extruder], 10, 999, _lcd_refresh_e_factor); + MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N1, &planner.flow_percentage[0], 10, 999, _lcd_refresh_e_factor_0); + MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N2, &planner.flow_percentage[1], 10, 999, _lcd_refresh_e_factor_1); + #if EXTRUDERS > 2 + MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N3, &planner.flow_percentage[2], 10, 999, _lcd_refresh_e_factor_2); + #if EXTRUDERS > 3 + MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N4, &planner.flow_percentage[3], 10, 999, _lcd_refresh_e_factor_3); + #if EXTRUDERS > 4 + MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N5, &planner.flow_percentage[4], 10, 999, _lcd_refresh_e_factor_4); + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + + // + // Babystep X: + // Babystep Y: + // Babystep Z: + // + #if ENABLED(BABYSTEPPING) + #if ENABLED(BABYSTEP_XY) + MENU_ITEM(submenu, MSG_BABYSTEP_X, lcd_babystep_x); + MENU_ITEM(submenu, MSG_BABYSTEP_Y, lcd_babystep_y); + #endif + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + #else + MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z); + #endif + #endif + + END_MENU(); } -#endif // HAS_LCD_MENU + /** + * + * "Driver current control" submenu items + * + */ + #if ENABLED(DAC_STEPPER_CURRENT) -void MarlinUI::init() { + void dac_driver_getValues() { LOOP_XYZE(i) driverPercent[i] = dac_current_get_percent((AxisEnum)i); } - init_lcd(); + void dac_driver_commit() { dac_current_set_percents(driverPercent); } - #if HAS_DIGITAL_BUTTONS + void dac_driver_eeprom_write() { dac_commit_eeprom(); } + void lcd_dac_menu() { + dac_driver_getValues(); + START_MENU(); + MENU_BACK(MSG_CONTROL); + MENU_ITEM_EDIT_CALLBACK(int8, MSG_X " " MSG_DAC_PERCENT, &driverPercent[X_AXIS], 0, 100, dac_driver_commit); + MENU_ITEM_EDIT_CALLBACK(int8, MSG_Y " " MSG_DAC_PERCENT, &driverPercent[Y_AXIS], 0, 100, dac_driver_commit); + MENU_ITEM_EDIT_CALLBACK(int8, MSG_Z " " MSG_DAC_PERCENT, &driverPercent[Z_AXIS], 0, 100, dac_driver_commit); + MENU_ITEM_EDIT_CALLBACK(int8, MSG_E " " MSG_DAC_PERCENT, &driverPercent[E_AXIS], 0, 100, dac_driver_commit); + MENU_ITEM(function, MSG_DAC_EEPROM_WRITE, dac_driver_eeprom_write); + END_MENU(); + } + + #endif // DAC_STEPPER_CURRENT + + #if HAS_MOTOR_CURRENT_PWM + + void lcd_pwm_menu() { + START_MENU(); + MENU_BACK(MSG_CONTROL); + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + MENU_ITEM_EDIT_CALLBACK(long5, MSG_X MSG_Y, &stepper.motor_current_setting[0], 100, 2000, Stepper::refresh_motor_power); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + MENU_ITEM_EDIT_CALLBACK(long5, MSG_Z, &stepper.motor_current_setting[1], 100, 2000, Stepper::refresh_motor_power); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + MENU_ITEM_EDIT_CALLBACK(long5, MSG_E, &stepper.motor_current_setting[2], 100, 2000, Stepper::refresh_motor_power); + #endif + END_MENU(); + } + + #endif // HAS_MOTOR_CURRENT_PWM + + constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP); + + /** + * + * "Temperature" submenu items + * + */ + void _lcd_preheat(const int16_t endnum, const int16_t temph, const int16_t tempb, const int16_t fan) { + if (temph > 0) thermalManager.setTargetHotend(MIN(heater_maxtemp[endnum], temph), endnum); + #if HAS_HEATED_BED + if (tempb >= 0) thermalManager.setTargetBed(tempb); + #else + UNUSED(tempb); + #endif + #if FAN_COUNT > 0 + #if FAN_COUNT > 1 + fanSpeeds[active_extruder < FAN_COUNT ? active_extruder : 0] = fan; + #else + fanSpeeds[0] = fan; + #endif + #else + UNUSED(fan); + #endif + lcd_return_to_status(); + } + + #if HAS_TEMP_HOTEND + void lcd_preheat_m1_e0_only() { _lcd_preheat(0, lcd_preheat_hotend_temp[0], -1, lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e0_only() { _lcd_preheat(0, lcd_preheat_hotend_temp[1], -1, lcd_preheat_fan_speed[1]); } + #if HAS_HEATED_BED + void lcd_preheat_m1_e0() { _lcd_preheat(0, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e0() { _lcd_preheat(0, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); } + #endif + #endif + + #if HOTENDS > 1 + void lcd_preheat_m1_e1_only() { _lcd_preheat(1, lcd_preheat_hotend_temp[0], -1, lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e1_only() { _lcd_preheat(1, lcd_preheat_hotend_temp[1], -1, lcd_preheat_fan_speed[1]); } + #if HAS_HEATED_BED + void lcd_preheat_m1_e1() { _lcd_preheat(1, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e1() { _lcd_preheat(1, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); } + #endif + #if HOTENDS > 2 + void lcd_preheat_m1_e2_only() { _lcd_preheat(2, lcd_preheat_hotend_temp[0], -1, lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e2_only() { _lcd_preheat(2, lcd_preheat_hotend_temp[1], -1, lcd_preheat_fan_speed[1]); } + #if HAS_HEATED_BED + void lcd_preheat_m1_e2() { _lcd_preheat(2, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e2() { _lcd_preheat(2, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); } + #endif + #if HOTENDS > 3 + void lcd_preheat_m1_e3_only() { _lcd_preheat(3, lcd_preheat_hotend_temp[0], -1, lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e3_only() { _lcd_preheat(3, lcd_preheat_hotend_temp[1], -1, lcd_preheat_fan_speed[1]); } + #if HAS_HEATED_BED + void lcd_preheat_m1_e3() { _lcd_preheat(3, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e3() { _lcd_preheat(3, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); } + #endif + #if HOTENDS > 4 + void lcd_preheat_m1_e4_only() { _lcd_preheat(4, lcd_preheat_hotend_temp[0], -1, lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e4_only() { _lcd_preheat(4, lcd_preheat_hotend_temp[1], -1, lcd_preheat_fan_speed[1]); } + #if HAS_HEATED_BED + void lcd_preheat_m1_e4() { _lcd_preheat(4, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_e4() { _lcd_preheat(4, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); } + #endif + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + + void lcd_preheat_m1_all() { + #if HOTENDS > 1 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 1); + #if HOTENDS > 2 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 2); + #if HOTENDS > 3 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 3); + #if HOTENDS > 4 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 + #if HAS_HEATED_BED + lcd_preheat_m1_e0(); + #else + lcd_preheat_m1_e0_only(); + #endif + } + void lcd_preheat_m2_all() { + #if HOTENDS > 1 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 1); + #if HOTENDS > 2 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 2); + #if HOTENDS > 3 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 3); + #if HOTENDS > 4 + thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 + #if HAS_HEATED_BED + lcd_preheat_m2_e0(); + #else + lcd_preheat_m2_e0_only(); + #endif + } + + #endif // HOTENDS > 1 + + #if HAS_HEATED_BED + void lcd_preheat_m1_bedonly() { _lcd_preheat(0, 0, lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); } + void lcd_preheat_m2_bedonly() { _lcd_preheat(0, 0, lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); } + #endif + + #if HAS_TEMP_HOTEND || HAS_HEATED_BED + + void lcd_preheat_m1_menu() { + START_MENU(); + MENU_BACK(MSG_TEMPERATURE); + #if HOTENDS == 1 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_1, lcd_preheat_m1_e0); + MENU_ITEM(function, MSG_PREHEAT_1_END, lcd_preheat_m1_e0_only); + #else + MENU_ITEM(function, MSG_PREHEAT_1, lcd_preheat_m1_e0_only); + #endif + #elif HOTENDS > 1 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H1, lcd_preheat_m1_e0); + MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E1, lcd_preheat_m1_e0_only); + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H2, lcd_preheat_m1_e1); + MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E2, lcd_preheat_m1_e1_only); + #else + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H1, lcd_preheat_m1_e0_only); + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H2, lcd_preheat_m1_e1_only); + #endif + #if HOTENDS > 2 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H3, lcd_preheat_m1_e2); + MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E3, lcd_preheat_m1_e2_only); + #else + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H3, lcd_preheat_m1_e2_only); + #endif + #if HOTENDS > 3 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H4, lcd_preheat_m1_e3); + MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E4, lcd_preheat_m1_e3_only); + #else + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H4, lcd_preheat_m1_e3_only); + #endif + #if HOTENDS > 4 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H5, lcd_preheat_m1_e4); + MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E5, lcd_preheat_m1_e4_only); + #else + MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H5, lcd_preheat_m1_e4_only); + #endif + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + MENU_ITEM(function, MSG_PREHEAT_1_ALL, lcd_preheat_m1_all); + #endif // HOTENDS > 1 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_1_BEDONLY, lcd_preheat_m1_bedonly); + #endif + END_MENU(); + } + + void lcd_preheat_m2_menu() { + START_MENU(); + MENU_BACK(MSG_TEMPERATURE); + #if HOTENDS == 1 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_2, lcd_preheat_m2_e0); + MENU_ITEM(function, MSG_PREHEAT_2_END, lcd_preheat_m2_e0_only); + #else + MENU_ITEM(function, MSG_PREHEAT_2, lcd_preheat_m2_e0_only); + #endif + #elif HOTENDS > 1 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H1, lcd_preheat_m2_e0); + MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E1, lcd_preheat_m2_e0_only); + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H2, lcd_preheat_m2_e1); + MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E2, lcd_preheat_m2_e1_only); + #else + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H1, lcd_preheat_m2_e0_only); + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H2, lcd_preheat_m2_e1_only); + #endif + #if HOTENDS > 2 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H3, lcd_preheat_m2_e2); + MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E3, lcd_preheat_m2_e2_only); + #else + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H3, lcd_preheat_m2_e2_only); + #endif + #if HOTENDS > 3 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H4, lcd_preheat_m2_e3); + MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E4, lcd_preheat_m2_e3_only); + #else + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H4, lcd_preheat_m2_e3_only); + #endif + #if HOTENDS > 4 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H5, lcd_preheat_m2_e4); + MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E5, lcd_preheat_m2_e4_only); + #else + MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H5, lcd_preheat_m2_e4_only); + #endif + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + MENU_ITEM(function, MSG_PREHEAT_2_ALL, lcd_preheat_m2_all); + #endif // HOTENDS > 1 + #if HAS_HEATED_BED + MENU_ITEM(function, MSG_PREHEAT_2_BEDONLY, lcd_preheat_m2_bedonly); + #endif + END_MENU(); + } + + #endif // HAS_TEMP_HOTEND || HAS_HEATED_BED + + void lcd_cooldown() { + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; + #endif + thermalManager.disable_all_heaters(); + lcd_return_to_status(); + } + + #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(PID_AUTOTUNE_MENU) || ENABLED(ADVANCED_PAUSE_FEATURE) + + /** + * If the queue is full, the command will fail, so we have to loop + * with idle() to make sure the command has been enqueued. + */ + void lcd_enqueue_command(char * const cmd) { + no_reentry = true; + enqueue_and_echo_command_now(cmd); + no_reentry = false; + } + + void lcd_enqueue_commands_P(const char * const cmd) { + no_reentry = true; + enqueue_and_echo_commands_now_P(cmd); + no_reentry = false; + } + + #endif + + #if ENABLED(EEPROM_SETTINGS) + static void lcd_store_settings() { lcd_completion_feedback(settings.save()); } + static void lcd_load_settings() { lcd_completion_feedback(settings.load()); } + #endif + + #if ENABLED(LEVEL_BED_CORNERS) + + /** + * Level corners, starting in the front-left corner. + */ + static int8_t bed_corner; + void _lcd_goto_next_corner() { + line_to_z(4.0); + switch (bed_corner) { + case 0: + current_position[X_AXIS] = X_MIN_BED + LEVEL_CORNERS_INSET; + current_position[Y_AXIS] = Y_MIN_BED + LEVEL_CORNERS_INSET; + break; + case 1: + current_position[X_AXIS] = X_MAX_BED - LEVEL_CORNERS_INSET; + break; + case 2: + current_position[Y_AXIS] = Y_MAX_BED - LEVEL_CORNERS_INSET; + break; + case 3: + current_position[X_AXIS] = X_MIN_BED + LEVEL_CORNERS_INSET; + break; + #if ENABLED(LEVEL_CENTER_TOO) + case 4: + current_position[X_AXIS] = X_CENTER; + current_position[Y_AXIS] = Y_CENTER; + break; + #endif + } + planner.buffer_line_kinematic(current_position, MMM_TO_MMS(manual_feedrate_mm_m[X_AXIS]), active_extruder); + line_to_z(0.0); + if (++bed_corner > 3 + #if ENABLED(LEVEL_CENTER_TOO) + + 1 + #endif + ) bed_corner = 0; + } + + void _lcd_corner_submenu() { + START_MENU(); + MENU_ITEM(function, + #if ENABLED(LEVEL_CENTER_TOO) + MSG_LEVEL_BED_NEXT_POINT + #else + MSG_NEXT_CORNER + #endif + , _lcd_goto_next_corner); + MENU_ITEM(function, MSG_BACK, lcd_goto_previous_menu_no_defer); + END_MENU(); + } + + void _lcd_level_bed_corners() { + defer_return_to_status = true; + lcd_goto_screen(_lcd_corner_submenu); + bed_corner = 0; + _lcd_goto_next_corner(); + } + + #endif // LEVEL_BED_CORNERS + + #if ENABLED(LCD_BED_LEVELING) && (ENABLED(PROBE_MANUALLY) || ENABLED(MESH_BED_LEVELING)) + + /** + * + * "Motion" > "Level Bed" handlers + * + */ + + static uint8_t manual_probe_index; + + // LCD probed points are from defaults + constexpr uint8_t total_probe_points = ( + #if ENABLED(AUTO_BED_LEVELING_3POINT) + 3 + #elif ABL_GRID || ENABLED(MESH_BED_LEVELING) + GRID_MAX_POINTS + #endif + ); + + bool lcd_wait_for_move; + + // + // Bed leveling is done. Wait for G29 to complete. + // A flag is used so that this can release control + // and allow the command queue to be processed. + // + // When G29 finishes the last move: + // - Raise Z to the "manual probe height" + // - Don't return until done. + // + // ** This blocks the command queue! ** + // + void _lcd_level_bed_done() { + if (!lcd_wait_for_move) { + #if MANUAL_PROBE_HEIGHT > 0 && DISABLED(MESH_BED_LEVELING) + // Display "Done" screen and wait for moves to complete + line_to_z(MANUAL_PROBE_HEIGHT); + lcd_synchronize(PSTR(MSG_LEVEL_BED_DONE)); + #endif + lcd_goto_previous_menu_no_defer(); + lcd_completion_feedback(); + } + if (lcdDrawUpdate) lcd_implementation_drawmenu_static(LCD_HEIGHT >= 4 ? 1 : 0, PSTR(MSG_LEVEL_BED_DONE)); + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + } + + void _lcd_level_goto_next_point(); + + /** + * Step 7: Get the Z coordinate, click goes to the next point or exits + */ + void _lcd_level_bed_get_z() { + ENCODER_DIRECTION_NORMAL(); + + if (use_click()) { + + // + // Save the current Z position and move + // + + // If done... + if (++manual_probe_index >= total_probe_points) { + // + // The last G29 records the point and enables bed leveling + // + lcd_wait_for_move = true; + lcd_goto_screen(_lcd_level_bed_done); + #if ENABLED(MESH_BED_LEVELING) + enqueue_and_echo_commands_P(PSTR("G29 S2")); + #elif ENABLED(PROBE_MANUALLY) + enqueue_and_echo_commands_P(PSTR("G29 V1")); + #endif + } + else + _lcd_level_goto_next_point(); + + return; + } + + // + // Encoder knob or keypad buttons adjust the Z position + // + if (encoderPosition) { + const float z = current_position[Z_AXIS] + float((int32_t)encoderPosition) * (MBL_Z_STEP); + line_to_z(constrain(z, -(LCD_PROBE_Z_RANGE) * 0.5f, (LCD_PROBE_Z_RANGE) * 0.5f)); + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + encoderPosition = 0; + } + + // + // Draw on first display, then only on Z change + // + if (lcdDrawUpdate) { + const float v = current_position[Z_AXIS]; + lcd_implementation_drawedit(PSTR(MSG_MOVE_Z), ftostr43sign(v + (v < 0 ? -0.0001f : 0.0001f), '+')); + } + } + + /** + * Step 6: Display "Next point: 1 / 9" while waiting for move to finish + */ + void _lcd_level_bed_moving() { + if (lcdDrawUpdate) { + char msg[10]; + sprintf_P(msg, PSTR("%i / %u"), (int)(manual_probe_index + 1), total_probe_points); + lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_NEXT_POINT), msg); + } + lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW; + if (!lcd_wait_for_move) lcd_goto_screen(_lcd_level_bed_get_z); + } + + /** + * Step 5: Initiate a move to the next point + */ + void _lcd_level_goto_next_point() { + lcd_goto_screen(_lcd_level_bed_moving); + + // G29 Records Z, moves, and signals when it pauses + lcd_wait_for_move = true; + #if ENABLED(MESH_BED_LEVELING) + enqueue_and_echo_commands_P(manual_probe_index ? PSTR("G29 S2") : PSTR("G29 S1")); + #elif ENABLED(PROBE_MANUALLY) + enqueue_and_echo_commands_P(PSTR("G29 V1")); + #endif + } + + /** + * Step 4: Display "Click to Begin", wait for click + * Move to the first probe position + */ + void _lcd_level_bed_homing_done() { + if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING)); + if (use_click()) { + manual_probe_index = 0; + _lcd_level_goto_next_point(); + } + } + + /** + * Step 3: Display "Homing XYZ" - Wait for homing to finish + */ + void _lcd_level_bed_homing() { + if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_HOMING), NULL); + lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW; + if (all_axes_homed()) lcd_goto_screen(_lcd_level_bed_homing_done); + } + + #if ENABLED(PROBE_MANUALLY) + extern bool g29_in_progress; + #endif + + /** + * Step 2: Continue Bed Leveling... + */ + void _lcd_level_bed_continue() { + defer_return_to_status = true; + axis_homed = 0; + lcd_goto_screen(_lcd_level_bed_homing); + enqueue_and_echo_commands_P(PSTR("G28")); + } + + #elif ENABLED(AUTO_BED_LEVELING_UBL) + + void _lcd_ubl_level_bed(); + + static int16_t ubl_storage_slot = 0, + custom_hotend_temp = 190, + side_points = 3, + ubl_fillin_amount = 5, + ubl_height_amount = 1, + n_edit_pts = 1, + x_plot = 0, + y_plot = 0; + + #if HAS_HEATED_BED + static int16_t custom_bed_temp = 50; + #endif + + /** + * UBL Build Custom Mesh Command + */ + void _lcd_ubl_build_custom_mesh() { + char UBL_LCD_GCODE[20]; + enqueue_and_echo_commands_P(PSTR("G28")); + #if HAS_HEATED_BED + sprintf_P(UBL_LCD_GCODE, PSTR("M190 S%i"), custom_bed_temp); + lcd_enqueue_command(UBL_LCD_GCODE); + #endif + sprintf_P(UBL_LCD_GCODE, PSTR("M109 S%i"), custom_hotend_temp); + lcd_enqueue_command(UBL_LCD_GCODE); + enqueue_and_echo_commands_P(PSTR("G29 P1")); + } + + /** + * UBL Custom Mesh submenu + * + * << Build Mesh + * Hotend Temp: --- + * Bed Temp: --- + * Build Custom Mesh + */ + void _lcd_ubl_custom_mesh() { + START_MENU(); + MENU_BACK(MSG_UBL_BUILD_MESH_MENU); + MENU_ITEM_EDIT(int3, MSG_UBL_CUSTOM_HOTEND_TEMP, &custom_hotend_temp, EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP - 10)); + #if HAS_HEATED_BED + MENU_ITEM_EDIT(int3, MSG_UBL_CUSTOM_BED_TEMP, &custom_bed_temp, BED_MINTEMP, (BED_MAXTEMP - 15)); + #endif + MENU_ITEM(function, MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_build_custom_mesh); + END_MENU(); + } + + /** + * UBL Adjust Mesh Height Command + */ + void _lcd_ubl_adjust_height_cmd() { + char UBL_LCD_GCODE[16]; + const int ind = ubl_height_amount > 0 ? 9 : 10; + strcpy_P(UBL_LCD_GCODE, PSTR("G29 P6 C -")); + sprintf_P(&UBL_LCD_GCODE[ind], PSTR(".%i"), ABS(ubl_height_amount)); + lcd_enqueue_command(UBL_LCD_GCODE); + } + + /** + * UBL Adjust Mesh Height submenu + * + * << Edit Mesh + * Height Amount: --- + * Adjust Mesh Height + * << Info Screen + */ + void _lcd_ubl_height_adjust_menu() { + START_MENU(); + MENU_BACK(MSG_UBL_EDIT_MESH_MENU); + MENU_ITEM_EDIT_CALLBACK(int3, MSG_UBL_MESH_HEIGHT_AMOUNT, &ubl_height_amount, -9, 9, _lcd_ubl_adjust_height_cmd); + MENU_ITEM(function, MSG_WATCH, lcd_return_to_status); + END_MENU(); + } + + /** + * UBL Edit Mesh submenu + * + * << UBL Tools + * Fine Tune All + * Fine Tune Closest + * - Adjust Mesh Height >> + * << Info Screen + */ + void _lcd_ubl_edit_mesh() { + START_MENU(); + MENU_BACK(MSG_UBL_TOOLS); + MENU_ITEM(gcode, MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + MENU_ITEM(gcode, MSG_UBL_FINE_TUNE_CLOSEST, PSTR("G29 P4 T")); + MENU_ITEM(submenu, MSG_UBL_MESH_HEIGHT_ADJUST, _lcd_ubl_height_adjust_menu); + MENU_ITEM(function, MSG_WATCH, lcd_return_to_status); + END_MENU(); + } + + /** + * UBL Validate Custom Mesh Command + */ + void _lcd_ubl_validate_custom_mesh() { + char UBL_LCD_GCODE[24]; + const int temp = + #if HAS_HEATED_BED + custom_bed_temp + #else + 0 + #endif + ; + sprintf_P(UBL_LCD_GCODE, PSTR("G26 C B%i H%i P"), temp, custom_hotend_temp); + lcd_enqueue_commands_P(PSTR("G28")); + lcd_enqueue_command(UBL_LCD_GCODE); + } + + /** + * UBL Validate Mesh submenu + * + * << UBL Tools + * PLA Mesh Validation + * ABS Mesh Validation + * Validate Custom Mesh + * << Info Screen + */ + void _lcd_ubl_validate_mesh() { + START_MENU(); + MENU_BACK(MSG_UBL_TOOLS); + #if HAS_HEATED_BED + MENU_ITEM(gcode, MSG_UBL_VALIDATE_PLA_MESH, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_1_TEMP_BED) " H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); + MENU_ITEM(gcode, MSG_UBL_VALIDATE_ABS_MESH, PSTR("G28\nG26 C B" STRINGIFY(PREHEAT_2_TEMP_BED) " H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); + #else + MENU_ITEM(gcode, MSG_UBL_VALIDATE_PLA_MESH, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_1_TEMP_HOTEND) " P")); + MENU_ITEM(gcode, MSG_UBL_VALIDATE_ABS_MESH, PSTR("G28\nG26 C B0 H" STRINGIFY(PREHEAT_2_TEMP_HOTEND) " P")); + #endif + MENU_ITEM(function, MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh); + MENU_ITEM(function, MSG_WATCH, lcd_return_to_status); + END_MENU(); + } + + /** + * UBL Grid Leveling Command + */ + void _lcd_ubl_grid_level_cmd() { + char UBL_LCD_GCODE[10]; + sprintf_P(UBL_LCD_GCODE, PSTR("G29 J%i"), side_points); + lcd_enqueue_command(UBL_LCD_GCODE); + } + + /** + * UBL Grid Leveling submenu + * + * << UBL Tools + * Side points: --- + * Level Mesh + */ + void _lcd_ubl_grid_level() { + START_MENU(); + MENU_BACK(MSG_UBL_TOOLS); + MENU_ITEM_EDIT(int3, MSG_UBL_SIDE_POINTS, &side_points, 2, 6); + MENU_ITEM(function, MSG_UBL_MESH_LEVEL, _lcd_ubl_grid_level_cmd); + END_MENU(); + } + + /** + * UBL Mesh Leveling submenu + * + * << UBL Tools + * 3-Point Mesh Leveling + * - Grid Mesh Leveling >> + * << Info Screen + */ + void _lcd_ubl_mesh_leveling() { + START_MENU(); + MENU_BACK(MSG_UBL_TOOLS); + MENU_ITEM(gcode, MSG_UBL_3POINT_MESH_LEVELING, PSTR("G29 J0")); + MENU_ITEM(submenu, MSG_UBL_GRID_MESH_LEVELING, _lcd_ubl_grid_level); + MENU_ITEM(function, MSG_WATCH, lcd_return_to_status); + END_MENU(); + } + + /** + * UBL Fill-in Amount Mesh Command + */ + void _lcd_ubl_fillin_amount_cmd() { + char UBL_LCD_GCODE[16]; + sprintf_P(UBL_LCD_GCODE, PSTR("G29 P3 R C.%i"), ubl_fillin_amount); + lcd_enqueue_command(UBL_LCD_GCODE); + } + + /** + * UBL Fill-in Mesh submenu + * + * << Build Mesh + * Fill-in Amount: --- + * Fill-in Mesh + * Smart Fill-in + * Manual Fill-in + * << Info Screen + */ + void _lcd_ubl_fillin_menu() { + START_MENU(); + MENU_BACK(MSG_UBL_BUILD_MESH_MENU); + MENU_ITEM_EDIT_CALLBACK(int3, MSG_UBL_FILLIN_AMOUNT, &ubl_fillin_amount, 0, 9, _lcd_ubl_fillin_amount_cmd); + MENU_ITEM(gcode, MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); + MENU_ITEM(gcode, MSG_UBL_MANUAL_FILLIN, PSTR("G29 P2 B T0")); + MENU_ITEM(function, MSG_WATCH, lcd_return_to_status); + END_MENU(); + } + + void _lcd_ubl_invalidate() { + ubl.invalidate(); + SERIAL_PROTOCOLLNPGM("Mesh invalidated."); + } + + /** + * UBL Build Mesh submenu + * + * << UBL Tools + * Build PLA Mesh + * Build ABS Mesh + * - Build Custom Mesh >> + * Build Cold Mesh + * - Fill-in Mesh >> + * Continue Bed Mesh + * Invalidate All + * Invalidate Closest + * << Info Screen + */ + void _lcd_ubl_build_mesh() { + START_MENU(); + MENU_BACK(MSG_UBL_TOOLS); + #if HAS_HEATED_BED + MENU_ITEM(gcode, MSG_UBL_BUILD_PLA_MESH, PSTR( + "G28\n" + "M190 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\n" + "M109 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) "\n" + "G29 P1\n" + "M104 S0\n" + "M140 S0" + )); + MENU_ITEM(gcode, MSG_UBL_BUILD_ABS_MESH, PSTR( + "G28\n" + "M190 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\n" + "M109 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) "\n" + "G29 P1\n" + "M104 S0\n" + "M140 S0" + )); + #else + MENU_ITEM(gcode, MSG_UBL_BUILD_PLA_MESH, PSTR( + "G28\n" + "M109 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) "\n" + "G29 P1\n" + "M104 S0" + )); + MENU_ITEM(gcode, MSG_UBL_BUILD_ABS_MESH, PSTR( + "G28\n" + "M109 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) "\n" + "G29 P1\n" + "M104 S0" + )); + #endif + MENU_ITEM(submenu, MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_custom_mesh); + MENU_ITEM(gcode, MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); + MENU_ITEM(submenu, MSG_UBL_FILLIN_MESH, _lcd_ubl_fillin_menu); + MENU_ITEM(gcode, MSG_UBL_CONTINUE_MESH, PSTR("G29 P1 C")); + MENU_ITEM(function, MSG_UBL_INVALIDATE_ALL, _lcd_ubl_invalidate); + MENU_ITEM(gcode, MSG_UBL_INVALIDATE_CLOSEST, PSTR("G29 I")); + MENU_ITEM(function, MSG_WATCH, lcd_return_to_status); + END_MENU(); + } + + /** + * UBL Load Mesh Command + */ + void _lcd_ubl_load_mesh_cmd() { + char UBL_LCD_GCODE[25]; + sprintf_P(UBL_LCD_GCODE, PSTR("G29 L%i"), ubl_storage_slot); + lcd_enqueue_command(UBL_LCD_GCODE); + sprintf_P(UBL_LCD_GCODE, PSTR("M117 " MSG_MESH_LOADED), ubl_storage_slot); + lcd_enqueue_command(UBL_LCD_GCODE); + } + + /** + * UBL Save Mesh Command + */ + void _lcd_ubl_save_mesh_cmd() { + char UBL_LCD_GCODE[25]; + sprintf_P(UBL_LCD_GCODE, PSTR("G29 S%i"), ubl_storage_slot); + lcd_enqueue_command(UBL_LCD_GCODE); + sprintf_P(UBL_LCD_GCODE, PSTR("M117 " MSG_MESH_SAVED), ubl_storage_slot); + lcd_enqueue_command(UBL_LCD_GCODE); + } + + /** + * UBL Mesh Storage submenu + * + * << Unified Bed Leveling + * Memory Slot: --- + * Load Bed Mesh + * Save Bed Mesh + */ + void _lcd_ubl_storage_mesh() { + int16_t a = settings.calc_num_meshes(); + START_MENU(); + MENU_BACK(MSG_UBL_LEVEL_BED); + if (!WITHIN(ubl_storage_slot, 0, a - 1)) { + STATIC_ITEM(MSG_NO_STORAGE); + } + else { + MENU_ITEM_EDIT(int3, MSG_UBL_STORAGE_SLOT, &ubl_storage_slot, 0, a - 1); + MENU_ITEM(function, MSG_UBL_LOAD_MESH, _lcd_ubl_load_mesh_cmd); + MENU_ITEM(function, MSG_UBL_SAVE_MESH, _lcd_ubl_save_mesh_cmd); + } + END_MENU(); + } + + /** + * UBL LCD "radar" map homing + */ + void _lcd_ubl_output_map_lcd(); + + void _lcd_ubl_map_homing() { + defer_return_to_status = true; + if (lcdDrawUpdate) lcd_implementation_drawmenu_static(LCD_HEIGHT < 3 ? 0 : (LCD_HEIGHT > 4 ? 2 : 1), PSTR(MSG_LEVEL_BED_HOMING)); + lcdDrawUpdate = LCDVIEW_CALL_NO_REDRAW; + if (all_axes_homed()) { + ubl.lcd_map_control = true; // Return to the map screen + lcd_goto_screen(_lcd_ubl_output_map_lcd); + } + } + + /** + * UBL LCD "radar" map point editing + */ + void _lcd_ubl_map_lcd_edit_cmd() { + char UBL_LCD_GCODE[50], str[10], str2[10]; + dtostrf(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]), 0, 2, str); + dtostrf(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]), 0, 2, str2); + snprintf_P(UBL_LCD_GCODE, sizeof(UBL_LCD_GCODE), PSTR("G29 P4 X%s Y%s R%i"), str, str2, n_edit_pts); + lcd_enqueue_command(UBL_LCD_GCODE); + } + + /** + * UBL LCD Map Movement + */ + void ubl_map_move_to_xy() { + current_position[X_AXIS] = pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]); + current_position[Y_AXIS] = pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]); + planner.buffer_line_kinematic(current_position, MMM_TO_MMS(XY_PROBE_SPEED), active_extruder); + } + + /** + * UBL LCD "radar" map + */ + void set_current_from_steppers_for_axis(const AxisEnum axis); + void sync_plan_position(); + + void _lcd_do_nothing() {} + void _lcd_hard_stop() { + const screenFunc_t old_screen = currentScreen; + currentScreen = _lcd_do_nothing; + planner.quick_stop(); + currentScreen = old_screen; + set_current_from_steppers_for_axis(ALL_AXES); + sync_plan_position(); + } + + void _lcd_ubl_output_map_lcd() { + static int16_t step_scaler = 0; + + if (use_click()) return _lcd_ubl_map_lcd_edit_cmd(); + ENCODER_DIRECTION_NORMAL(); + + if (encoderPosition) { + step_scaler += (int32_t)encoderPosition; + x_plot += step_scaler / (ENCODER_STEPS_PER_MENU_ITEM); + if (ABS(step_scaler) >= ENCODER_STEPS_PER_MENU_ITEM) step_scaler = 0; + encoderPosition = 0; + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; + } + + // Encoder to the right (++) + if (x_plot >= GRID_MAX_POINTS_X) { x_plot = 0; y_plot++; } + if (y_plot >= GRID_MAX_POINTS_Y) y_plot = 0; + + // Encoder to the left (--) + if (x_plot <= GRID_MAX_POINTS_X - (GRID_MAX_POINTS_X + 1)) { x_plot = GRID_MAX_POINTS_X - 1; y_plot--; } + if (y_plot <= GRID_MAX_POINTS_Y - (GRID_MAX_POINTS_Y + 1)) y_plot = GRID_MAX_POINTS_Y - 1; + + // Prevent underrun/overrun of plot numbers + x_plot = constrain(x_plot, GRID_MAX_POINTS_X - (GRID_MAX_POINTS_X + 1), GRID_MAX_POINTS_X + 1); + y_plot = constrain(y_plot, GRID_MAX_POINTS_Y - (GRID_MAX_POINTS_Y + 1), GRID_MAX_POINTS_Y + 1); + + // Determine number of points to edit + #if IS_KINEMATIC + n_edit_pts = 9; //TODO: Delta accessible edit points + #else + const bool xc = WITHIN(x_plot, 1, GRID_MAX_POINTS_X - 2), + yc = WITHIN(y_plot, 1, GRID_MAX_POINTS_Y - 2); + n_edit_pts = yc ? (xc ? 9 : 6) : (xc ? 6 : 4); // Corners + #endif + + if (lcdDrawUpdate) { + lcd_implementation_ubl_plot(x_plot, y_plot); + + if (planner.movesplanned()) // If the nozzle is already moving, cancel the move. + _lcd_hard_stop(); + + ubl_map_move_to_xy(); // Move to new location + } + } + + /** + * UBL Homing before LCD map + */ + void _lcd_ubl_output_map_lcd_cmd() { + if (!all_axes_known()) { + axis_homed = 0; + enqueue_and_echo_commands_P(PSTR("G28")); + } + lcd_goto_screen(_lcd_ubl_map_homing); + } + + /** + * UBL Output map submenu + * + * << Unified Bed Leveling + * Output for Host + * Output for CSV + * Off Printer Backup + * Output Mesh Map + */ + void _lcd_ubl_output_map() { + START_MENU(); + MENU_BACK(MSG_UBL_LEVEL_BED); + MENU_ITEM(gcode, MSG_UBL_OUTPUT_MAP_HOST, PSTR("G29 T0")); + MENU_ITEM(gcode, MSG_UBL_OUTPUT_MAP_CSV, PSTR("G29 T1")); + MENU_ITEM(gcode, MSG_UBL_OUTPUT_MAP_BACKUP, PSTR("G29 S-1")); + MENU_ITEM(function, MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map_lcd_cmd); + END_MENU(); + } + + /** + * UBL Tools submenu + * + * << Unified Bed Leveling + * - Build Mesh >> + * - Validate Mesh >> + * - Edit Mesh >> + * - Mesh Leveling >> + */ + void _lcd_ubl_tools_menu() { + START_MENU(); + MENU_BACK(MSG_UBL_LEVEL_BED); + MENU_ITEM(submenu, MSG_UBL_BUILD_MESH_MENU, _lcd_ubl_build_mesh); + MENU_ITEM(gcode, MSG_UBL_MANUAL_MESH, PSTR("G29 I999\nG29 P2 B T0")); + MENU_ITEM(submenu, MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + MENU_ITEM(submenu, MSG_UBL_EDIT_MESH_MENU, _lcd_ubl_edit_mesh); + MENU_ITEM(submenu, MSG_UBL_MESH_LEVELING, _lcd_ubl_mesh_leveling); + END_MENU(); + } + + /** + * UBL Step-By-Step submenu + * + * << Unified Bed Leveling + * 1 Build Cold Mesh + * 2 Smart Fill-in + * - 3 Validate Mesh >> + * 4 Fine Tune All + * - 5 Validate Mesh >> + * 6 Fine Tune All + * 7 Save Bed Mesh + */ + void _lcd_ubl_step_by_step() { + START_MENU(); + MENU_BACK(MSG_UBL_LEVEL_BED); + MENU_ITEM(gcode, "1 " MSG_UBL_BUILD_COLD_MESH, PSTR("G28\nG29 P1")); + MENU_ITEM(gcode, "2 " MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); + MENU_ITEM(submenu, "3 " MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + MENU_ITEM(gcode, "4 " MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + MENU_ITEM(submenu, "5 " MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh); + MENU_ITEM(gcode, "6 " MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + MENU_ITEM(function, "7 " MSG_UBL_SAVE_MESH, _lcd_ubl_save_mesh_cmd); + END_MENU(); + } + + /** + * UBL System submenu + * + * << Motion + * - Manually Build Mesh >> + * - Activate UBL >> + * - Deactivate UBL >> + * - Step-By-Step UBL >> + * - Mesh Storage >> + * - Output Map >> + * - UBL Tools >> + * - Output UBL Info >> + */ + + void _lcd_ubl_level_bed() { + START_MENU(); + MENU_BACK(MSG_MOTION); + MENU_ITEM(gcode, MSG_UBL_ACTIVATE_MESH, PSTR("G29 A")); + MENU_ITEM(gcode, MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D")); + MENU_ITEM(submenu, MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step); + MENU_ITEM(function, MSG_UBL_MESH_EDIT, _lcd_ubl_output_map_lcd_cmd); + MENU_ITEM(submenu, MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh); + MENU_ITEM(submenu, MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map); + MENU_ITEM(submenu, MSG_UBL_TOOLS, _lcd_ubl_tools_menu); + MENU_ITEM(gcode, MSG_UBL_INFO_UBL, PSTR("G29 W")); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float3, MSG_Z_FADE_HEIGHT, &new_z_fade_height, 0, 100, _lcd_set_z_fade_height); + #endif + END_MENU(); + } + + #endif // AUTO_BED_LEVELING_UBL + + + #if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) + void _lcd_toggle_bed_leveling() { set_bed_leveling_enabled(!planner.leveling_active); } + #endif + + #if ENABLED(LCD_BED_LEVELING) + + /** + * Step 1: Bed Level entry-point + * + * << Motion + * Auto Home (if homing needed) + * Leveling On/Off (if data exists, and homed) + * Fade Height: --- (Req: ENABLE_LEVELING_FADE_HEIGHT) + * Mesh Z Offset: --- (Req: MESH_BED_LEVELING) + * Z Probe Offset: --- (Req: HAS_BED_PROBE, Opt: BABYSTEP_ZPROBE_OFFSET) + * Level Bed > + * Level Corners > (if homed) + * Load Settings (Req: EEPROM_SETTINGS) + * Save Settings (Req: EEPROM_SETTINGS) + */ + void lcd_bed_leveling() { + START_MENU(); + MENU_BACK(MSG_MOTION); + + const bool is_homed = all_axes_known(); + + // Auto Home if not using manual probing + #if DISABLED(PROBE_MANUALLY) && DISABLED(MESH_BED_LEVELING) + if (!is_homed) MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); + #endif + + // Level Bed + #if ENABLED(PROBE_MANUALLY) || ENABLED(MESH_BED_LEVELING) + // Manual leveling uses a guided procedure + MENU_ITEM(submenu, MSG_LEVEL_BED, _lcd_level_bed_continue); + #else + // Automatic leveling can just run the G-code + MENU_ITEM(gcode, MSG_LEVEL_BED, is_homed ? PSTR("G29") : PSTR("G28\nG29")); + #endif + + // Homed and leveling is valid? Then leveling can be toggled. + if (is_homed && leveling_is_valid()) { + bool new_level_state = planner.leveling_active; + MENU_ITEM_EDIT_CALLBACK(bool, MSG_BED_LEVELING, &new_level_state, _lcd_toggle_bed_leveling); + } + + // Z Fade Height + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float3, MSG_Z_FADE_HEIGHT, &new_z_fade_height, 0, 100, _lcd_set_z_fade_height); + #endif + + // + // MBL Z Offset + // + #if ENABLED(MESH_BED_LEVELING) + MENU_ITEM_EDIT(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); + #endif + + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + #elif HAS_BED_PROBE + MENU_ITEM_EDIT(float52, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); + #endif + + #if ENABLED(LEVEL_BED_CORNERS) + // Move to the next corner for leveling + if (all_axes_homed()) MENU_ITEM(submenu, MSG_LEVEL_CORNERS, _lcd_level_bed_corners); + #endif + + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(function, MSG_LOAD_EEPROM, lcd_load_settings); + MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); + #endif + END_MENU(); + } + + #endif // LCD_BED_LEVELING + + /** + * + * "Movement" submenu + * + */ + + void lcd_movement_menu() { + START_MENU(); + + // + // ^ Main + // + MENU_BACK(MSG_MAIN); + + // + // Move Axis + // + #if ENABLED(DELTA) + if (all_axes_homed()) + #endif + MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu); + + // + // Auto Home + // + MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); + #if ENABLED(INDIVIDUAL_AXIS_HOMING_MENU) + MENU_ITEM(gcode, MSG_AUTO_HOME_X, PSTR("G28 X")); + MENU_ITEM(gcode, MSG_AUTO_HOME_Y, PSTR("G28 Y")); + MENU_ITEM(gcode, MSG_AUTO_HOME_Z, PSTR("G28 Z")); + #endif + + // + // TMC Z Calibration + // + #if ENABLED(TMC_Z_CALIBRATION) + MENU_ITEM(gcode, MSG_TMC_Z_CALIBRATION, PSTR("G28\nM915")); + #endif + + // + // Level Bed + // + #if ENABLED(AUTO_BED_LEVELING_UBL) + + MENU_ITEM(submenu, MSG_UBL_LEVEL_BED, _lcd_ubl_level_bed); + + #elif ENABLED(LCD_BED_LEVELING) + + #if ENABLED(PROBE_MANUALLY) + if (!g29_in_progress) + #endif + MENU_ITEM(submenu, MSG_BED_LEVELING, lcd_bed_leveling); + + #elif HAS_LEVELING && DISABLED(SLIM_LCD_MENUS) + + #if DISABLED(PROBE_MANUALLY) + MENU_ITEM(gcode, MSG_LEVEL_BED, PSTR("G28\nG29")); + #endif + if (leveling_is_valid()) { + bool new_level_state = planner.leveling_active; + MENU_ITEM_EDIT_CALLBACK(bool, MSG_BED_LEVELING, &new_level_state, _lcd_toggle_bed_leveling); + } + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float3, MSG_Z_FADE_HEIGHT, &new_z_fade_height, 0, 100, _lcd_set_z_fade_height); + #endif + + #endif + + #if ENABLED(LEVEL_BED_CORNERS) && DISABLED(LCD_BED_LEVELING) + if (all_axes_homed()) + MENU_ITEM(function, MSG_LEVEL_CORNERS, _lcd_level_bed_corners); + #endif + + // + // Disable Steppers + // + MENU_ITEM(gcode, MSG_DISABLE_STEPPERS, PSTR("M84")); + + END_MENU(); + } + + float move_menu_scale; + + #if ENABLED(DELTA_CALIBRATION_MENU) || ENABLED(DELTA_AUTO_CALIBRATION) + + void lcd_move_z(); + + void _man_probe_pt(const float &rx, const float &ry) { + do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES); + do_blocking_move_to_xy(rx, ry); + + lcd_synchronize(); + move_menu_scale = MAX(PROBE_MANUALLY_STEP, MIN_STEPS_PER_SEGMENT / float(DEFAULT_XYZ_STEPS_PER_UNIT)); + lcd_goto_screen(lcd_move_z); + } + + #endif // DELTA_CALIBRATION_MENU || DELTA_AUTO_CALIBRATION + + #if ENABLED(DELTA_AUTO_CALIBRATION) + + float lcd_probe_pt(const float &rx, const float &ry) { + _man_probe_pt(rx, ry); + KEEPALIVE_STATE(PAUSED_FOR_USER); + defer_return_to_status = true; + wait_for_user = true; + while (wait_for_user) idle(); + KEEPALIVE_STATE(IN_HANDLER); + lcd_goto_previous_menu_no_defer(); + return current_position[Z_AXIS]; + } + + #endif // DELTA_AUTO_CALIBRATION + + #if ENABLED(DELTA_CALIBRATION_MENU) + + void _lcd_calibrate_homing() { + if (lcdDrawUpdate) lcd_implementation_drawmenu_static(LCD_HEIGHT >= 4 ? 1 : 0, PSTR(MSG_LEVEL_BED_HOMING)); + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + if (all_axes_homed()) + lcd_goto_previous_menu(); + } + + void _lcd_delta_calibrate_home() { + enqueue_and_echo_commands_P(PSTR("G28")); + lcd_goto_screen(_lcd_calibrate_homing); + } + + void _goto_tower_x() { _man_probe_pt(cos(RADIANS(210)) * delta_calibration_radius, sin(RADIANS(210)) * delta_calibration_radius); } + void _goto_tower_y() { _man_probe_pt(cos(RADIANS(330)) * delta_calibration_radius, sin(RADIANS(330)) * delta_calibration_radius); } + void _goto_tower_z() { _man_probe_pt(cos(RADIANS( 90)) * delta_calibration_radius, sin(RADIANS( 90)) * delta_calibration_radius); } + void _goto_center() { _man_probe_pt(0,0); } + + #endif // DELTA_CALIBRATION_MENU + + #if ENABLED(DELTA_CALIBRATION_MENU) || ENABLED(DELTA_AUTO_CALIBRATION) + + void _recalc_delta_settings() { + #if HAS_LEVELING + reset_bed_level(); // After changing kinematics bed-level data is no longer valid + #endif + recalc_delta_settings(); + } + + void lcd_delta_settings() { + START_MENU(); + MENU_BACK(MSG_DELTA_CALIBRATE); + MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_DELTA_HEIGHT, &delta_height, delta_height - 10, delta_height + 10, _recalc_delta_settings); + MENU_ITEM_EDIT_CALLBACK(float43, "Ex", &delta_endstop_adj[A_AXIS], -5, 5, _recalc_delta_settings); + MENU_ITEM_EDIT_CALLBACK(float43, "Ey", &delta_endstop_adj[B_AXIS], -5, 5, _recalc_delta_settings); + MENU_ITEM_EDIT_CALLBACK(float43, "Ez", &delta_endstop_adj[C_AXIS], -5, 5, _recalc_delta_settings); + MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_DELTA_RADIUS, &delta_radius, delta_radius - 5, delta_radius + 5, _recalc_delta_settings); + MENU_ITEM_EDIT_CALLBACK(float43, "Tx", &delta_tower_angle_trim[A_AXIS], -5, 5, _recalc_delta_settings); + MENU_ITEM_EDIT_CALLBACK(float43, "Ty", &delta_tower_angle_trim[B_AXIS], -5, 5, _recalc_delta_settings); + MENU_ITEM_EDIT_CALLBACK(float43, "Tz", &delta_tower_angle_trim[C_AXIS], -5, 5, _recalc_delta_settings); + MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_DELTA_DIAG_ROD, &delta_diagonal_rod, delta_diagonal_rod - 5, delta_diagonal_rod + 5, _recalc_delta_settings); + END_MENU(); + } + + void lcd_delta_calibrate_menu() { + START_MENU(); + MENU_BACK(MSG_MAIN); + #if ENABLED(DELTA_AUTO_CALIBRATION) + MENU_ITEM(gcode, MSG_DELTA_AUTO_CALIBRATE, PSTR("G33")); + MENU_ITEM(gcode, MSG_DELTA_HEIGHT_CALIBRATE, PSTR("G33 P1")); + MENU_ITEM(gcode, MSG_DELTA_Z_OFFSET_CALIBRATE, PSTR("G33 P-1")); + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); + MENU_ITEM(function, MSG_LOAD_EEPROM, lcd_load_settings); + #endif + #endif + MENU_ITEM(submenu, MSG_DELTA_SETTINGS, lcd_delta_settings); + #if ENABLED(DELTA_CALIBRATION_MENU) + MENU_ITEM(submenu, MSG_AUTO_HOME, _lcd_delta_calibrate_home); + if (all_axes_homed()) { + MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_X, _goto_tower_x); + MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_Y, _goto_tower_y); + MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_Z, _goto_tower_z); + MENU_ITEM(submenu, MSG_DELTA_CALIBRATE_CENTER, _goto_center); + } + #endif + END_MENU(); + } + + #endif // DELTA_CALIBRATION_MENU || DELTA_AUTO_CALIBRATION + + /** + * If the most recent manual move hasn't been fed to the planner yet, + * and the planner can accept one, send immediately + */ + inline void manage_manual_move() { + + if (processing_manual_move) return; + + if (manual_move_axis != (int8_t)NO_AXIS && ELAPSED(millis(), manual_move_start_time) && !planner.is_full()) { + + #if IS_KINEMATIC + + const float old_feedrate = feedrate_mm_s; + feedrate_mm_s = MMM_TO_MMS(manual_feedrate_mm_m[manual_move_axis]); + + #if EXTRUDERS > 1 + const int8_t old_extruder = active_extruder; + if (manual_move_axis == E_AXIS) active_extruder = manual_move_e_index; + #endif + + // Set movement on a single axis + set_destination_from_current(); + destination[manual_move_axis] += manual_move_offset; + + // Reset for the next move + manual_move_offset = 0; + manual_move_axis = (int8_t)NO_AXIS; + + // DELTA and SCARA machines use segmented moves, which could fill the planner during the call to + // move_to_destination. This will cause idle() to be called, which can then call this function while the + // previous invocation is being blocked. Modifications to manual_move_offset shouldn't be made while + // processing_manual_move is true or the planner will get out of sync. + processing_manual_move = true; + prepare_move_to_destination(); // will call set_current_from_destination() + processing_manual_move = false; + + feedrate_mm_s = old_feedrate; + #if EXTRUDERS > 1 + active_extruder = old_extruder; + #endif + + #else + + planner.buffer_line_kinematic(current_position, MMM_TO_MMS(manual_feedrate_mm_m[manual_move_axis]), manual_move_axis == E_AXIS ? manual_move_e_index : active_extruder); + manual_move_axis = (int8_t)NO_AXIS; + + #endif + } + } + + /** + * Set a flag that lcd_update() should start a move + * to "current_position" after a short delay. + */ + inline void manual_move_to_current(AxisEnum axis + #if E_MANUAL > 1 + , const int8_t eindex=-1 + #endif + ) { + #if ENABLED(DUAL_X_CARRIAGE) || E_MANUAL > 1 + #if E_MANUAL > 1 + if (axis == E_AXIS) + #endif + manual_move_e_index = eindex >= 0 ? eindex : active_extruder; + #endif + manual_move_start_time = millis() + (move_menu_scale < 0.99f ? 0UL : 250UL); // delay for bigger moves + manual_move_axis = (int8_t)axis; + } + + /** + * + * "Motion" > "Move Axis" submenu + * + */ + + void _lcd_move_xyz(const char* name, AxisEnum axis) { + if (use_click()) { return lcd_goto_previous_menu_no_defer(); } + ENCODER_DIRECTION_NORMAL(); + if (encoderPosition && !processing_manual_move) { + + // Start with no limits to movement + float min = current_position[axis] - 1000, + max = current_position[axis] + 1000; + + // Limit to software endstops, if enabled + #if ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS) + if (soft_endstops_enabled) switch (axis) { + case X_AXIS: + #if ENABLED(MIN_SOFTWARE_ENDSTOP_X) + min = soft_endstop_min[X_AXIS]; + #endif + #if ENABLED(MAX_SOFTWARE_ENDSTOP_X) + max = soft_endstop_max[X_AXIS]; + #endif + break; + case Y_AXIS: + #if ENABLED(MIN_SOFTWARE_ENDSTOP_Y) + min = soft_endstop_min[Y_AXIS]; + #endif + #if ENABLED(MAX_SOFTWARE_ENDSTOP_Y) + max = soft_endstop_max[Y_AXIS]; + #endif + break; + case Z_AXIS: + #if ENABLED(MIN_SOFTWARE_ENDSTOP_Z) + min = soft_endstop_min[Z_AXIS]; + #endif + #if ENABLED(MAX_SOFTWARE_ENDSTOP_Z) + max = soft_endstop_max[Z_AXIS]; + #endif + default: break; + } + #endif // MIN_SOFTWARE_ENDSTOPS || MAX_SOFTWARE_ENDSTOPS + + // Delta limits XY based on the current offset from center + // This assumes the center is 0,0 + #if ENABLED(DELTA) + if (axis != Z_AXIS) { + max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis + min = -max; + } + #endif + + // Get the new position + const float diff = float((int32_t)encoderPosition) * move_menu_scale; + #if IS_KINEMATIC + manual_move_offset += diff; + if ((int32_t)encoderPosition < 0) + NOLESS(manual_move_offset, min - current_position[axis]); + else + NOMORE(manual_move_offset, max - current_position[axis]); + #else + current_position[axis] += diff; + if ((int32_t)encoderPosition < 0) + NOLESS(current_position[axis], min); + else + NOMORE(current_position[axis], max); + #endif + + manual_move_to_current(axis); + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; + } + encoderPosition = 0; + if (lcdDrawUpdate) { + const float pos = NATIVE_TO_LOGICAL(processing_manual_move ? destination[axis] : current_position[axis] + #if IS_KINEMATIC + + manual_move_offset + #endif + , axis); + lcd_implementation_drawedit(name, move_menu_scale >= 0.1f ? ftostr41sign(pos) : ftostr43sign(pos)); + } + } + void lcd_move_x() { _lcd_move_xyz(PSTR(MSG_MOVE_X), X_AXIS); } + void lcd_move_y() { _lcd_move_xyz(PSTR(MSG_MOVE_Y), Y_AXIS); } + void lcd_move_z() { _lcd_move_xyz(PSTR(MSG_MOVE_Z), Z_AXIS); } + void _lcd_move_e( + #if E_MANUAL > 1 + const int8_t eindex=-1 + #endif + ) { + if (use_click()) { return lcd_goto_previous_menu_no_defer(); } + ENCODER_DIRECTION_NORMAL(); + if (encoderPosition) { + if (!processing_manual_move) { + const float diff = float((int32_t)encoderPosition) * move_menu_scale; + #if IS_KINEMATIC + manual_move_offset += diff; + #else + current_position[E_AXIS] += diff; + #endif + manual_move_to_current(E_AXIS + #if E_MANUAL > 1 + , eindex + #endif + ); + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; + } + encoderPosition = 0; + } + if (lcdDrawUpdate) { + PGM_P pos_label; + #if E_MANUAL == 1 + pos_label = PSTR(MSG_MOVE_E); + #else + switch (eindex) { + default: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E1); break; + case 1: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E2); break; + #if E_MANUAL > 2 + case 2: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E3); break; + #if E_MANUAL > 3 + case 3: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E4); break; + #if E_MANUAL > 4 + case 4: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E5); break; + #endif // E_MANUAL > 4 + #endif // E_MANUAL > 3 + #endif // E_MANUAL > 2 + } + #endif // E_MANUAL > 1 + lcd_implementation_drawedit(pos_label, ftostr41sign(current_position[E_AXIS] + #if IS_KINEMATIC + + manual_move_offset + #endif + #if ENABLED(MANUAL_E_MOVES_RELATIVE) + - manual_move_e_origin + #endif + )); + } + } + + void lcd_move_e() { _lcd_move_e(); } + #if E_MANUAL > 1 + void lcd_move_e0() { _lcd_move_e(0); } + void lcd_move_e1() { _lcd_move_e(1); } + #if E_MANUAL > 2 + void lcd_move_e2() { _lcd_move_e(2); } + #if E_MANUAL > 3 + void lcd_move_e3() { _lcd_move_e(3); } + #if E_MANUAL > 4 + void lcd_move_e4() { _lcd_move_e(4); } + #endif // E_MANUAL > 4 + #endif // E_MANUAL > 3 + #endif // E_MANUAL > 2 + #endif // E_MANUAL > 1 + + /** + * + * "Motion" > "Move Xmm" > "Move XYZ" submenu + * + */ + + screenFunc_t _manual_move_func_ptr; + + void _goto_manual_move(const float scale) { + defer_return_to_status = true; + move_menu_scale = scale; + lcd_goto_screen(_manual_move_func_ptr); + } + void lcd_move_menu_10mm() { _goto_manual_move(10); } + void lcd_move_menu_1mm() { _goto_manual_move( 1); } + void lcd_move_menu_01mm() { _goto_manual_move( 0.1f); } + + void _lcd_move_distance_menu(const AxisEnum axis, const screenFunc_t func) { + _manual_move_func_ptr = func; + START_MENU(); + if (LCD_HEIGHT >= 4) { + switch (axis) { + case X_AXIS: + STATIC_ITEM(MSG_MOVE_X, true, true); break; + case Y_AXIS: + STATIC_ITEM(MSG_MOVE_Y, true, true); break; + case Z_AXIS: + STATIC_ITEM(MSG_MOVE_Z, true, true); break; + default: + #if ENABLED(MANUAL_E_MOVES_RELATIVE) + manual_move_e_origin = current_position[E_AXIS]; + #endif + STATIC_ITEM(MSG_MOVE_E, true, true); + break; + } + } + MENU_BACK(MSG_MOVE_AXIS); + MENU_ITEM(submenu, MSG_MOVE_10MM, lcd_move_menu_10mm); + MENU_ITEM(submenu, MSG_MOVE_1MM, lcd_move_menu_1mm); + MENU_ITEM(submenu, MSG_MOVE_01MM, lcd_move_menu_01mm); + END_MENU(); + } + void lcd_move_get_x_amount() { _lcd_move_distance_menu(X_AXIS, lcd_move_x); } + void lcd_move_get_y_amount() { _lcd_move_distance_menu(Y_AXIS, lcd_move_y); } + void lcd_move_get_z_amount() { _lcd_move_distance_menu(Z_AXIS, lcd_move_z); } + void lcd_move_get_e_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e); } + #if E_MANUAL > 1 + void lcd_move_get_e0_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e0); } + void lcd_move_get_e1_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e1); } + #if E_MANUAL > 2 + void lcd_move_get_e2_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e2); } + #if E_MANUAL > 3 + void lcd_move_get_e3_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e3); } + #if E_MANUAL > 4 + void lcd_move_get_e4_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e4); } + #endif // E_MANUAL > 4 + #endif // E_MANUAL > 3 + #endif // E_MANUAL > 2 + #endif // E_MANUAL > 1 + + /** + * + * "Motion" > "Move Axis" submenu + * + */ + + #if IS_KINEMATIC || ENABLED(NO_MOTION_BEFORE_HOMING) + #define _MOVE_XYZ_ALLOWED (all_axes_homed()) + #else + #define _MOVE_XYZ_ALLOWED true + #endif + + #if ENABLED(DELTA) + #define _MOVE_XY_ALLOWED (current_position[Z_AXIS] <= delta_clip_start_height) + void lcd_lower_z_to_clip_height() { + line_to_z(delta_clip_start_height); + lcd_synchronize(); + } + #else + #define _MOVE_XY_ALLOWED true + #endif + + void lcd_move_menu() { + START_MENU(); + MENU_BACK(MSG_MOTION); + + #if HAS_SOFTWARE_ENDSTOPS && ENABLED(SOFT_ENDSTOPS_MENU_ITEM) + MENU_ITEM_EDIT(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstops_enabled); + #endif + + if (_MOVE_XYZ_ALLOWED) { + if (_MOVE_XY_ALLOWED) { + MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_get_x_amount); + MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_get_y_amount); + } + #if ENABLED(DELTA) + else + MENU_ITEM(function, MSG_FREE_XY, lcd_lower_z_to_clip_height); + #endif + + MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_get_z_amount); + } + else + MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); + + #if ENABLED(SWITCHING_EXTRUDER) || ENABLED(SWITCHING_NOZZLE) + + #if EXTRUDERS == 4 + switch (active_extruder) { + case 0: MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); break; + case 1: MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); break; + case 2: MENU_ITEM(gcode, MSG_SELECT " " MSG_E4, PSTR("T3")); break; + case 3: MENU_ITEM(gcode, MSG_SELECT " " MSG_E3, PSTR("T2")); break; + } + #elif EXTRUDERS == 3 + if (active_extruder < 2) { + if (active_extruder) + MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); + else + MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); + } + #else + if (active_extruder) + MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); + else + MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); + #endif + + #elif ENABLED(DUAL_X_CARRIAGE) + + if (active_extruder) + MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); + else + MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); + + #endif + + #if ENABLED(SWITCHING_EXTRUDER) || ENABLED(SWITCHING_NOZZLE) + + // Only the current... + MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_get_e_amount); + // ...and the non-switching + #if E_MANUAL == 5 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount); + #elif E_MANUAL == 3 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E3, lcd_move_get_e2_amount); + #endif + + #else + + // Independent extruders with one E-stepper per hotend + MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_get_e_amount); + #if E_MANUAL > 1 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E1, lcd_move_get_e0_amount); + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E2, lcd_move_get_e1_amount); + #if E_MANUAL > 2 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E3, lcd_move_get_e2_amount); + #if E_MANUAL > 3 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E4, lcd_move_get_e3_amount); + #if E_MANUAL > 4 + MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount); + #endif // E_MANUAL > 4 + #endif // E_MANUAL > 3 + #endif // E_MANUAL > 2 + #endif // E_MANUAL > 1 + + #endif + + END_MENU(); + } + + /** + * + * "Configuration" submenu + * + */ + + #if HAS_LCD_CONTRAST + void lcd_callback_set_contrast() { set_lcd_contrast(lcd_contrast); } + #endif + + static void lcd_factory_settings() { + settings.reset(); + lcd_completion_feedback(); + } + + #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS) + + static void lcd_init_eeprom() { + lcd_completion_feedback(settings.init_eeprom()); + lcd_goto_previous_menu(); + } + + static void lcd_init_eeprom_confirm() { + START_MENU(); + MENU_BACK(MSG_ADVANCED_SETTINGS); + MENU_ITEM(function, MSG_INIT_EEPROM, lcd_init_eeprom); + END_MENU(); + } + + #endif + + void lcd_configuration_menu() { + START_MENU(); + MENU_BACK(MSG_MAIN); + + MENU_ITEM(submenu, MSG_ADVANCED_SETTINGS, lcd_advanced_settings_menu); + + // + // Delta Calibration + // + #if ENABLED(DELTA_CALIBRATION_MENU) || ENABLED(DELTA_AUTO_CALIBRATION) + MENU_ITEM(submenu, MSG_DELTA_CALIBRATE, lcd_delta_calibrate_menu); + #endif + + #if HAS_LCD_CONTRAST + MENU_ITEM_EDIT_CALLBACK(int3, MSG_CONTRAST, &lcd_contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, lcd_callback_set_contrast, true); + #endif + #if ENABLED(FWRETRACT) + MENU_ITEM(submenu, MSG_RETRACT, lcd_config_retract_menu); + #endif + #if ENABLED(DAC_STEPPER_CURRENT) + MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, lcd_dac_menu); + #endif + #if HAS_MOTOR_CURRENT_PWM + MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, lcd_pwm_menu); + #endif + + #if ENABLED(BLTOUCH) + MENU_ITEM(submenu, MSG_BLTOUCH, bltouch_menu); + #endif + + #if DISABLED(SLIM_LCD_MENUS) + // Preheat configurations + MENU_ITEM(submenu, MSG_PREHEAT_1_SETTINGS, lcd_configuration_temperature_preheat_material1_settings_menu); + MENU_ITEM(submenu, MSG_PREHEAT_2_SETTINGS, lcd_configuration_temperature_preheat_material2_settings_menu); + #endif + + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); + MENU_ITEM(function, MSG_LOAD_EEPROM, lcd_load_settings); + #endif + + MENU_ITEM(function, MSG_RESTORE_FAILSAFE, lcd_factory_settings); + + END_MENU(); + } + + /** + * + * "Temperature" submenu + * + */ + + #if ENABLED(PID_AUTOTUNE_MENU) + + #if ENABLED(PIDTEMP) + int16_t autotune_temp[HOTENDS] = ARRAY_BY_HOTENDS1(150); + #endif + + #if ENABLED(PIDTEMPBED) + int16_t autotune_temp_bed = 70; + #endif + + void _lcd_autotune(int16_t e) { + char cmd[30]; + sprintf_P(cmd, PSTR("M303 U1 E%i S%i"), e, + #if HAS_PID_FOR_BOTH + e < 0 ? autotune_temp_bed : autotune_temp[e] + #elif ENABLED(PIDTEMPBED) + autotune_temp_bed + #else + autotune_temp[e] + #endif + ); + lcd_enqueue_command(cmd); + } + + #endif // PID_AUTOTUNE_MENU + + #if ENABLED(PIDTEMP) + + // Helpers for editing PID Ki & Kd values + // grab the PID value out of the temp variable; scale it; then update the PID driver + void copy_and_scalePID_i(int16_t e) { + #if DISABLED(PID_PARAMS_PER_HOTEND) || HOTENDS == 1 + UNUSED(e); + #endif + PID_PARAM(Ki, e) = scalePID_i(raw_Ki); + thermalManager.updatePID(); + } + void copy_and_scalePID_d(int16_t e) { + #if DISABLED(PID_PARAMS_PER_HOTEND) || HOTENDS == 1 + UNUSED(e); + #endif + PID_PARAM(Kd, e) = scalePID_d(raw_Kd); + thermalManager.updatePID(); + } + #define _DEFINE_PIDTEMP_BASE_FUNCS(N) \ + void copy_and_scalePID_i_E ## N() { copy_and_scalePID_i(N); } \ + void copy_and_scalePID_d_E ## N() { copy_and_scalePID_d(N); } + + #if ENABLED(PID_AUTOTUNE_MENU) + #define DEFINE_PIDTEMP_FUNCS(N) \ + _DEFINE_PIDTEMP_BASE_FUNCS(N); \ + void lcd_autotune_callback_E ## N() { _lcd_autotune(N); } typedef void _pid_##N##_void + #else + #define DEFINE_PIDTEMP_FUNCS(N) _DEFINE_PIDTEMP_BASE_FUNCS(N) typedef void _pid_##N##_void + #endif + + DEFINE_PIDTEMP_FUNCS(0); + #if ENABLED(PID_PARAMS_PER_HOTEND) + #if HOTENDS > 1 + DEFINE_PIDTEMP_FUNCS(1); + #if HOTENDS > 2 + DEFINE_PIDTEMP_FUNCS(2); + #if HOTENDS > 3 + DEFINE_PIDTEMP_FUNCS(3); + #if HOTENDS > 4 + DEFINE_PIDTEMP_FUNCS(4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 + #endif // PID_PARAMS_PER_HOTEND + + #endif // PIDTEMP + + /** + * + * "Temperature" submenu + * + */ + void lcd_temperature_menu() { + START_MENU(); + MENU_BACK(MSG_MAIN); + + // + // Nozzle: + // Nozzle [1-5]: + // + #if HOTENDS == 1 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE, &thermalManager.target_temperature[0], 0, HEATER_0_MAXTEMP - 15, watch_temp_callback_E0); + #else // HOTENDS > 1 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N1, &thermalManager.target_temperature[0], 0, HEATER_0_MAXTEMP - 15, watch_temp_callback_E0); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N2, &thermalManager.target_temperature[1], 0, HEATER_1_MAXTEMP - 15, watch_temp_callback_E1); + #if HOTENDS > 2 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N3, &thermalManager.target_temperature[2], 0, HEATER_2_MAXTEMP - 15, watch_temp_callback_E2); + #if HOTENDS > 3 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N4, &thermalManager.target_temperature[3], 0, HEATER_3_MAXTEMP - 15, watch_temp_callback_E3); + #if HOTENDS > 4 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N5, &thermalManager.target_temperature[4], 0, HEATER_4_MAXTEMP - 15, watch_temp_callback_E4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 + + // + // Bed: + // + #if HAS_HEATED_BED + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_BED, &thermalManager.target_temperature_bed, 0, BED_MAXTEMP - 15, watch_temp_callback_bed); + #endif + + // + // Fan Speed: + // + #if FAN_COUNT > 0 + #if HAS_FAN0 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED FAN_SPEED_1_SUFFIX, &fanSpeeds[0], 0, 255); + #if ENABLED(EXTRA_FAN_SPEED) + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED FAN_SPEED_1_SUFFIX, &new_fanSpeeds[0], 3, 255); + #endif + #endif + #if HAS_FAN1 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 2", &fanSpeeds[1], 0, 255); + #if ENABLED(EXTRA_FAN_SPEED) + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED " 2", &new_fanSpeeds[1], 3, 255); + #endif + #endif + #if HAS_FAN2 + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED " 3", &fanSpeeds[2], 0, 255); + #if ENABLED(EXTRA_FAN_SPEED) + MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_EXTRA_FAN_SPEED " 3", &new_fanSpeeds[2], 3, 255); + #endif + #endif + #endif // FAN_COUNT > 0 + + #if HAS_TEMP_HOTEND + + // + // Cooldown + // + bool has_heat = false; + HOTEND_LOOP() if (thermalManager.target_temperature[HOTEND_INDEX]) { has_heat = true; break; } + #if HAS_TEMP_BED + if (thermalManager.target_temperature_bed) has_heat = true; + #endif + if (has_heat) MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown); + + // + // Preheat for Material 1 and 2 + // + #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 || TEMP_SENSOR_4 != 0 || HAS_HEATED_BED + MENU_ITEM(submenu, MSG_PREHEAT_1, lcd_preheat_m1_menu); + MENU_ITEM(submenu, MSG_PREHEAT_2, lcd_preheat_m2_menu); + #else + MENU_ITEM(function, MSG_PREHEAT_1, lcd_preheat_m1_e0_only); + MENU_ITEM(function, MSG_PREHEAT_2, lcd_preheat_m2_e0_only); + #endif + + #endif // HAS_TEMP_HOTEND + + END_MENU(); + } + + /** + * + * "Advanced Settings" -> "Temperature" submenu + * + */ + void lcd_advanced_temperature_menu() { + START_MENU(); + MENU_BACK(MSG_ADVANCED_SETTINGS); + // + // Autotemp, Min, Max, Fact + // + #if ENABLED(AUTOTEMP) && HAS_TEMP_HOTEND + MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &planner.autotemp_enabled); + MENU_ITEM_EDIT(float3, MSG_MIN, &planner.autotemp_min, 0, float(HEATER_0_MAXTEMP) - 15); + MENU_ITEM_EDIT(float3, MSG_MAX, &planner.autotemp_max, 0, float(HEATER_0_MAXTEMP) - 15); + MENU_ITEM_EDIT(float52, MSG_FACTOR, &planner.autotemp_factor, 0, 1); + #endif + + // + // PID-P, PID-I, PID-D, PID-C, PID Autotune + // PID-P E1, PID-I E1, PID-D E1, PID-C E1, PID Autotune E1 + // PID-P E2, PID-I E2, PID-D E2, PID-C E2, PID Autotune E2 + // PID-P E3, PID-I E3, PID-D E3, PID-C E3, PID Autotune E3 + // PID-P E4, PID-I E4, PID-D E4, PID-C E4, PID Autotune E4 + // PID-P E5, PID-I E5, PID-D E5, PID-C E5, PID Autotune E5 + // + #if ENABLED(PIDTEMP) + + #define _PID_BASE_MENU_ITEMS(ELABEL, eindex) \ + raw_Ki = unscalePID_i(PID_PARAM(Ki, eindex)); \ + raw_Kd = unscalePID_d(PID_PARAM(Kd, eindex)); \ + MENU_ITEM_EDIT(float52sign, MSG_PID_P ELABEL, &PID_PARAM(Kp, eindex), 1, 9990); \ + MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_PID_I ELABEL, &raw_Ki, 0.01f, 9990, copy_and_scalePID_i_E ## eindex); \ + MENU_ITEM_EDIT_CALLBACK(float52sign, MSG_PID_D ELABEL, &raw_Kd, 1, 9990, copy_and_scalePID_d_E ## eindex) + + #if ENABLED(PID_EXTRUSION_SCALING) + #define _PID_MENU_ITEMS(ELABEL, eindex) \ + _PID_BASE_MENU_ITEMS(ELABEL, eindex); \ + MENU_ITEM_EDIT(float3, MSG_PID_C ELABEL, &PID_PARAM(Kc, eindex), 1, 9990) + #else + #define _PID_MENU_ITEMS(ELABEL, eindex) _PID_BASE_MENU_ITEMS(ELABEL, eindex) + #endif + + #if ENABLED(PID_AUTOTUNE_MENU) + #define PID_MENU_ITEMS(ELABEL, eindex) \ + _PID_MENU_ITEMS(ELABEL, eindex); \ + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_PID_AUTOTUNE ELABEL, &autotune_temp[eindex], 150, heater_maxtemp[eindex] - 15, lcd_autotune_callback_E ## eindex) + #else + #define PID_MENU_ITEMS(ELABEL, eindex) _PID_MENU_ITEMS(ELABEL, eindex) + #endif + + #if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1 + PID_MENU_ITEMS(" " MSG_E1, 0); + PID_MENU_ITEMS(" " MSG_E2, 1); + #if HOTENDS > 2 + PID_MENU_ITEMS(" " MSG_E3, 2); + #if HOTENDS > 3 + PID_MENU_ITEMS(" " MSG_E4, 3); + #if HOTENDS > 4 + PID_MENU_ITEMS(" " MSG_E5, 4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #else // !PID_PARAMS_PER_HOTEND || HOTENDS == 1 + PID_MENU_ITEMS("", 0); + #endif // !PID_PARAMS_PER_HOTEND || HOTENDS == 1 + + #endif // PIDTEMP + + END_MENU(); + } + + #if DISABLED(SLIM_LCD_MENUS) + + void _lcd_configuration_temperature_preheat_settings_menu(const uint8_t material) { + #if HOTENDS > 4 + #define MINTEMP_ALL MIN5(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP) + #define MAXTEMP_ALL MAX5(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP) + #elif HOTENDS > 3 + #define MINTEMP_ALL MIN4(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP) + #define MAXTEMP_ALL MAX4(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP) + #elif HOTENDS > 2 + #define MINTEMP_ALL MIN3(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP) + #define MAXTEMP_ALL MAX3(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP) + #elif HOTENDS > 1 + #define MINTEMP_ALL MIN(HEATER_0_MINTEMP, HEATER_1_MINTEMP) + #define MAXTEMP_ALL MAX(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP) + #else + #define MINTEMP_ALL HEATER_0_MINTEMP + #define MAXTEMP_ALL HEATER_0_MAXTEMP + #endif + START_MENU(); + MENU_BACK(MSG_CONFIGURATION); + MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &lcd_preheat_fan_speed[material], 0, 255); + #if HAS_TEMP_HOTEND + MENU_ITEM_EDIT(int3, MSG_NOZZLE, &lcd_preheat_hotend_temp[material], MINTEMP_ALL, MAXTEMP_ALL - 15); + #endif + #if HAS_HEATED_BED + MENU_ITEM_EDIT(int3, MSG_BED, &lcd_preheat_bed_temp[material], BED_MINTEMP, BED_MAXTEMP - 15); + #endif + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(function, MSG_STORE_EEPROM, lcd_store_settings); + #endif + END_MENU(); + } + + /** + * + * "Temperature" > "Preheat Material 1 conf" submenu + * + */ + void lcd_configuration_temperature_preheat_material1_settings_menu() { _lcd_configuration_temperature_preheat_settings_menu(0); } + + /** + * + * "Temperature" > "Preheat Material 2 conf" submenu + * + */ + void lcd_configuration_temperature_preheat_material2_settings_menu() { _lcd_configuration_temperature_preheat_settings_menu(1); } + + void _reset_acceleration_rates() { planner.reset_acceleration_rates(); } + #if ENABLED(DISTINCT_E_FACTORS) + void _reset_e_acceleration_rate(const uint8_t e) { if (e == active_extruder) _reset_acceleration_rates(); } + void _reset_e0_acceleration_rate() { _reset_e_acceleration_rate(0); } + void _reset_e1_acceleration_rate() { _reset_e_acceleration_rate(1); } + #if E_STEPPERS > 2 + void _reset_e2_acceleration_rate() { _reset_e_acceleration_rate(2); } + #if E_STEPPERS > 3 + void _reset_e3_acceleration_rate() { _reset_e_acceleration_rate(3); } + #if E_STEPPERS > 4 + void _reset_e4_acceleration_rate() { _reset_e_acceleration_rate(4); } + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif + + void _planner_refresh_positioning() { planner.refresh_positioning(); } + #if ENABLED(DISTINCT_E_FACTORS) + void _planner_refresh_e_positioning(const uint8_t e) { + if (e == active_extruder) + _planner_refresh_positioning(); + else + planner.steps_to_mm[E_AXIS + e] = 1.0f / planner.axis_steps_per_mm[E_AXIS + e]; + } + void _planner_refresh_e0_positioning() { _planner_refresh_e_positioning(0); } + void _planner_refresh_e1_positioning() { _planner_refresh_e_positioning(1); } + #if E_STEPPERS > 2 + void _planner_refresh_e2_positioning() { _planner_refresh_e_positioning(2); } + #if E_STEPPERS > 3 + void _planner_refresh_e3_positioning() { _planner_refresh_e_positioning(3); } + #if E_STEPPERS > 4 + void _planner_refresh_e4_positioning() { _planner_refresh_e_positioning(4); } + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif + + // M203 / M205 Velocity options + void lcd_advanced_velocity_menu() { + START_MENU(); + MENU_BACK(MSG_ADVANCED_SETTINGS); + + // M203 Max Feedrate + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_A, &planner.max_feedrate_mm_s[A_AXIS], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_B, &planner.max_feedrate_mm_s[B_AXIS], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_C, &planner.max_feedrate_mm_s[C_AXIS], 1, 999); + + #if ENABLED(DISTINCT_E_FACTORS) + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.max_feedrate_mm_s[E_AXIS + active_extruder], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E1, &planner.max_feedrate_mm_s[E_AXIS], 1, 999); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E2, &planner.max_feedrate_mm_s[E_AXIS + 1], 1, 999); + #if E_STEPPERS > 2 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E3, &planner.max_feedrate_mm_s[E_AXIS + 2], 1, 999); + #if E_STEPPERS > 3 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E4, &planner.max_feedrate_mm_s[E_AXIS + 3], 1, 999); + #if E_STEPPERS > 4 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E5, &planner.max_feedrate_mm_s[E_AXIS + 4], 1, 999); + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #else + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.max_feedrate_mm_s[E_AXIS], 1, 999); + #endif + + // M205 S Min Feedrate + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMIN, &planner.min_feedrate_mm_s, 0, 999); + + // M205 T Min Travel Feedrate + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VTRAV_MIN, &planner.min_travel_feedrate_mm_s, 0, 999); + + END_MENU(); + } + + // M201 / M204 Accelerations + void lcd_advanced_acceleration_menu() { + START_MENU(); + MENU_BACK(MSG_ADVANCED_SETTINGS); + + // M204 P Acceleration + MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_ACC, &planner.acceleration, 10, 99000); + + // M204 R Retract Acceleration + MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_A_RETRACT, &planner.retract_acceleration, 100, 99000); + + // M204 T Travel Acceleration + MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_A_TRAVEL, &planner.travel_acceleration, 100, 99000); + + // M201 settings + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_A, &planner.max_acceleration_mm_per_s2[A_AXIS], 100, 99000, _reset_acceleration_rates); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_B, &planner.max_acceleration_mm_per_s2[B_AXIS], 100, 99000, _reset_acceleration_rates); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_C, &planner.max_acceleration_mm_per_s2[C_AXIS], 10, 99000, _reset_acceleration_rates); + + #if ENABLED(DISTINCT_E_FACTORS) + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.max_acceleration_mm_per_s2[E_AXIS + active_extruder], 100, 99000, _reset_acceleration_rates); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E1, &planner.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_e0_acceleration_rate); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E2, &planner.max_acceleration_mm_per_s2[E_AXIS + 1], 100, 99000, _reset_e1_acceleration_rate); + #if E_STEPPERS > 2 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E3, &planner.max_acceleration_mm_per_s2[E_AXIS + 2], 100, 99000, _reset_e2_acceleration_rate); + #if E_STEPPERS > 3 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E4, &planner.max_acceleration_mm_per_s2[E_AXIS + 3], 100, 99000, _reset_e3_acceleration_rate); + #if E_STEPPERS > 4 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E5, &planner.max_acceleration_mm_per_s2[E_AXIS + 4], 100, 99000, _reset_e4_acceleration_rate); + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #else + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_acceleration_rates); + #endif + + END_MENU(); + } + + // M205 Jerk + void lcd_advanced_jerk_menu() { + START_MENU(); + MENU_BACK(MSG_ADVANCED_SETTINGS); + + #if ENABLED(JUNCTION_DEVIATION) + MENU_ITEM_EDIT_CALLBACK(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.01f, 0.3f, planner.recalculate_max_e_jerk); + #else + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VA_JERK, &planner.max_jerk[A_AXIS], 1, 990); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VB_JERK, &planner.max_jerk[B_AXIS], 1, 990); + #if ENABLED(DELTA) + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 1, 990); + #else + MENU_MULTIPLIER_ITEM_EDIT(float52sign, MSG_VC_JERK, &planner.max_jerk[C_AXIS], 0.1f, 990); + #endif + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VE_JERK, &planner.max_jerk[E_AXIS], 1, 990); + #endif + + END_MENU(); + } + + // M92 Steps-per-mm + void lcd_advanced_steps_per_mm_menu() { + START_MENU(); + MENU_BACK(MSG_ADVANCED_SETTINGS); + + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ASTEPS, &planner.axis_steps_per_mm[A_AXIS], 5, 9999, _planner_refresh_positioning); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_BSTEPS, &planner.axis_steps_per_mm[B_AXIS], 5, 9999, _planner_refresh_positioning); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_CSTEPS, &planner.axis_steps_per_mm[C_AXIS], 5, 9999, _planner_refresh_positioning); + + #if ENABLED(DISTINCT_E_FACTORS) + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ESTEPS, &planner.axis_steps_per_mm[E_AXIS + active_extruder], 5, 9999, _planner_refresh_positioning); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E1STEPS, &planner.axis_steps_per_mm[E_AXIS], 5, 9999, _planner_refresh_e0_positioning); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E2STEPS, &planner.axis_steps_per_mm[E_AXIS + 1], 5, 9999, _planner_refresh_e1_positioning); + #if E_STEPPERS > 2 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E3STEPS, &planner.axis_steps_per_mm[E_AXIS + 2], 5, 9999, _planner_refresh_e2_positioning); + #if E_STEPPERS > 3 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E4STEPS, &planner.axis_steps_per_mm[E_AXIS + 3], 5, 9999, _planner_refresh_e3_positioning); + #if E_STEPPERS > 4 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E5STEPS, &planner.axis_steps_per_mm[E_AXIS + 4], 5, 9999, _planner_refresh_e4_positioning); + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #else + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ESTEPS, &planner.axis_steps_per_mm[E_AXIS], 5, 9999, _planner_refresh_positioning); + #endif + + END_MENU(); + } + + #endif // !SLIM_LCD_MENUS + + /** + * + * "Advanced Settings" submenu + * + */ + + #if HAS_M206_COMMAND + /** + * Set the home offset based on the current_position + */ + void lcd_set_home_offsets() { + // M428 Command + enqueue_and_echo_commands_P(PSTR("M428")); + lcd_return_to_status(); + } + #endif + + void lcd_advanced_settings_menu() { + START_MENU(); + MENU_BACK(MSG_CONFIGURATION); + + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + MENU_ITEM(submenu, MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + #elif HAS_BED_PROBE + MENU_ITEM_EDIT(float52, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); + #endif + + #if DISABLED(SLIM_LCD_MENUS) + + #if HAS_M206_COMMAND + // + // Set Home Offsets + // + MENU_ITEM(function, MSG_SET_HOME_OFFSETS, lcd_set_home_offsets); + #endif + + // M203 / M205 - Feedrate items + MENU_ITEM(submenu, MSG_VELOCITY, lcd_advanced_velocity_menu); + + // M201 - Acceleration items + MENU_ITEM(submenu, MSG_ACCELERATION, lcd_advanced_acceleration_menu); + + // M205 - Max Jerk + MENU_ITEM(submenu, MSG_JERK, lcd_advanced_jerk_menu); + + // M92 - Steps Per mm + MENU_ITEM(submenu, MSG_STEPS_PER_MM, lcd_advanced_steps_per_mm_menu); + + #endif // !SLIM_LCD_MENUS + + MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_advanced_temperature_menu); + + #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) + MENU_ITEM(submenu, MSG_FILAMENT, lcd_advanced_filament_menu); + #elif ENABLED(LIN_ADVANCE) + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K, &planner.extruder_advance_K, 0, 999); + #endif + + // M540 S - Abort on endstop hit when SD printing + #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + MENU_ITEM_EDIT(bool, MSG_ENDSTOP_ABORT, &planner.abort_on_endstop_hit); + #endif + + // + // BLTouch Self-Test and Reset + // + #if ENABLED(BLTOUCH) + MENU_ITEM(gcode, MSG_BLTOUCH_SELFTEST, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_SELFTEST))); + if (!endstops.z_probe_enabled && TEST_BLTOUCH()) + MENU_ITEM(gcode, MSG_BLTOUCH_RESET, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_RESET))); + #endif + + #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS) + MENU_ITEM(submenu, MSG_INIT_EEPROM, lcd_init_eeprom_confirm); + #endif + + END_MENU(); + } + + #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) + /** + * + * "Advanced Settings" > "Filament" submenu + * + */ + void lcd_advanced_filament_menu() { + START_MENU(); + MENU_BACK(MSG_ADVANCED_SETTINGS); + + #if ENABLED(LIN_ADVANCE) + MENU_ITEM_EDIT(float52, MSG_ADVANCE_K, &planner.extruder_advance_K, 0, 999); + #endif + + #if DISABLED(NO_VOLUMETRICS) + MENU_ITEM_EDIT_CALLBACK(bool, MSG_VOLUMETRIC_ENABLED, &parser.volumetric_enabled, planner.calculate_volumetric_multipliers); + + if (parser.volumetric_enabled) { + #if EXTRUDERS == 1 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM, &planner.filament_size[0], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #else // EXTRUDERS > 1 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E1, &planner.filament_size[0], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E2, &planner.filament_size[1], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #if EXTRUDERS > 2 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E3, &planner.filament_size[2], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #if EXTRUDERS > 3 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E4, &planner.filament_size[3], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #if EXTRUDERS > 4 + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E5, &planner.filament_size[4], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + } + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + const float extrude_maxlength = + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + EXTRUDE_MAXLENGTH + #else + 999 + #endif + ; + + #if EXTRUDERS == 1 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &filament_change_unload_length[0], 0, extrude_maxlength); + #else // EXTRUDERS > 1 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &filament_change_unload_length[active_extruder], 0, extrude_maxlength); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E1, &filament_change_unload_length[0], 0, extrude_maxlength); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E2, &filament_change_unload_length[1], 0, extrude_maxlength); + #if EXTRUDERS > 2 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E3, &filament_change_unload_length[2], 0, extrude_maxlength); + #if EXTRUDERS > 3 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E4, &filament_change_unload_length[3], 0, extrude_maxlength); + #if EXTRUDERS > 4 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E5, &filament_change_unload_length[4], 0, extrude_maxlength); + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + + #if EXTRUDERS == 1 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &filament_change_load_length[0], 0, extrude_maxlength); + #else // EXTRUDERS > 1 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &filament_change_load_length[active_extruder], 0, extrude_maxlength); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E1, &filament_change_load_length[0], 0, extrude_maxlength); + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E2, &filament_change_load_length[1], 0, extrude_maxlength); + #if EXTRUDERS > 2 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E3, &filament_change_load_length[2], 0, extrude_maxlength); + #if EXTRUDERS > 3 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E4, &filament_change_load_length[3], 0, extrude_maxlength); + #if EXTRUDERS > 4 + MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E5, &filament_change_load_length[4], 0, extrude_maxlength); + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + #endif + + END_MENU(); + } + #endif // !NO_VOLUMETRICS || ADVANCED_PAUSE_FEATURE + + /** + * + * "Configuration" > "Retract" submenu + * + */ + #if ENABLED(FWRETRACT) + + void lcd_config_retract_menu() { + START_MENU(); + MENU_BACK(MSG_CONTROL); + MENU_ITEM_EDIT_CALLBACK(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract); + MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT, &fwretract.retract_length, 0, 100); + #if EXTRUDERS > 1 + MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.swap_retract_length, 0, 100); + #endif + MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &fwretract.retract_feedrate_mm_s, 1, 999); + MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_ZLIFT, &fwretract.retract_zlift, 0, 999); + MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.retract_recover_length, -100, 100); + #if EXTRUDERS > 1 + MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.swap_retract_recover_length, -100, 100); + #endif + MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.retract_recover_feedrate_mm_s, 1, 999); + #if EXTRUDERS > 1 + MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.swap_retract_recover_feedrate_mm_s, 1, 999); + #endif + END_MENU(); + } + + #endif // FWRETRACT + + #if ENABLED(SDSUPPORT) + + #if !PIN_EXISTS(SD_DETECT) + void lcd_sd_refresh() { + card.initsd(); + encoderTopLine = 0; + } + #endif + + void lcd_sd_updir() { + encoderPosition = card.updir() ? ENCODER_STEPS_PER_MENU_ITEM : 0; + encoderTopLine = 0; + screen_changed = true; + lcd_refresh(); + } + + /** + * + * "Print from SD" submenu + * + */ + + #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) + uint32_t last_sdfile_encoderPosition = 0xFFFF; + + void lcd_reselect_last_file() { + if (last_sdfile_encoderPosition == 0xFFFF) return; + #if ENABLED(DOGLCD) + // Some of this is a hack to force the screen update to work. + // TODO: Fix the real issue that causes this! + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + _lcd_synchronize(); + safe_delay(50); + _lcd_synchronize(); + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + drawing_screen = screen_changed = true; + #endif + + lcd_goto_screen(lcd_sdcard_menu, last_sdfile_encoderPosition); + defer_return_to_status = true; + last_sdfile_encoderPosition = 0xFFFF; + + #if ENABLED(DOGLCD) + lcd_update(); + #endif + } + #endif + + void lcd_sdcard_menu() { + ENCODER_DIRECTION_MENUS(); + + const uint16_t fileCnt = card.get_num_Files(); + + START_MENU(); + MENU_BACK(MSG_MAIN); + card.getWorkDirName(); + if (card.filename[0] == '/') { + #if !PIN_EXISTS(SD_DETECT) + MENU_ITEM(function, LCD_STR_REFRESH MSG_REFRESH, lcd_sd_refresh); + #endif + } + else { + MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir); + } + + for (uint16_t i = 0; i < fileCnt; i++) { + if (_menuLineNr == _thisItemNr) { + const uint16_t nr = + #if ENABLED(SDCARD_RATHERRECENTFIRST) && DISABLED(SDCARD_SORT_ALPHA) + fileCnt - 1 - + #endif + i; + + #if ENABLED(SDCARD_SORT_ALPHA) + card.getfilename_sorted(nr); + #else + card.getfilename(nr); + #endif + + if (card.filenameIsDir) + MENU_ITEM(sddirectory, MSG_CARD_MENU, card); + else + MENU_ITEM(sdfile, MSG_CARD_MENU, card); + } + else { + MENU_ITEM_DUMMY(); + } + } + END_MENU(); + } + + #endif // SDSUPPORT + + #if ENABLED(LCD_INFO_MENU) + + #if ENABLED(PRINTCOUNTER) + /** + * + * About Printer > Statistics submenu + * + */ + void lcd_info_stats_menu() { + if (use_click()) { return lcd_goto_previous_menu(); } + + char buffer[21]; + printStatistics stats = print_job_timer.getStats(); + + START_SCREEN(); // 12345678901234567890 + STATIC_ITEM(MSG_INFO_PRINT_COUNT ": ", false, false, itostr3left(stats.totalPrints)); // Print Count: 999 + STATIC_ITEM(MSG_INFO_COMPLETED_PRINTS": ", false, false, itostr3left(stats.finishedPrints)); // Completed : 666 + + duration_t elapsed = stats.printTime; + elapsed.toString(buffer); + + STATIC_ITEM(MSG_INFO_PRINT_TIME ": ", false, false); // Total print Time: + STATIC_ITEM("", false, false, buffer); // 99y 364d 23h 59m 59s + + elapsed = stats.longestPrint; + elapsed.toString(buffer); + + STATIC_ITEM(MSG_INFO_PRINT_LONGEST ": ", false, false); // Longest job time: + STATIC_ITEM("", false, false, buffer); // 99y 364d 23h 59m 59s + + sprintf_P(buffer, PSTR("%ld.%im"), long(stats.filamentUsed / 1000), int16_t(stats.filamentUsed / 100) % 10); + STATIC_ITEM(MSG_INFO_PRINT_FILAMENT ": ", false, false); // Extruded total: + STATIC_ITEM("", false, false, buffer); // 125m + END_SCREEN(); + } + #endif // PRINTCOUNTER + + /** + * + * About Printer > Thermistors + * + */ + void lcd_info_thermistors_menu() { + if (use_click()) { return lcd_goto_previous_menu(); } + START_SCREEN(); + #define THERMISTOR_ID TEMP_SENSOR_0 + #include "thermistornames.h" + STATIC_ITEM("T0: " THERMISTOR_NAME, false, true); + STATIC_ITEM(MSG_INFO_MIN_TEMP ": " STRINGIFY(HEATER_0_MINTEMP), false); + STATIC_ITEM(MSG_INFO_MAX_TEMP ": " STRINGIFY(HEATER_0_MAXTEMP), false); + + #if TEMP_SENSOR_1 != 0 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_1 + #include "thermistornames.h" + STATIC_ITEM("T1: " THERMISTOR_NAME, false, true); + STATIC_ITEM(MSG_INFO_MIN_TEMP ": " STRINGIFY(HEATER_1_MINTEMP), false); + STATIC_ITEM(MSG_INFO_MAX_TEMP ": " STRINGIFY(HEATER_1_MAXTEMP), false); + #endif + + #if TEMP_SENSOR_2 != 0 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_2 + #include "thermistornames.h" + STATIC_ITEM("T2: " THERMISTOR_NAME, false, true); + STATIC_ITEM(MSG_INFO_MIN_TEMP ": " STRINGIFY(HEATER_2_MINTEMP), false); + STATIC_ITEM(MSG_INFO_MAX_TEMP ": " STRINGIFY(HEATER_2_MAXTEMP), false); + #endif + + #if TEMP_SENSOR_3 != 0 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_3 + #include "thermistornames.h" + STATIC_ITEM("T3: " THERMISTOR_NAME, false, true); + STATIC_ITEM(MSG_INFO_MIN_TEMP ": " STRINGIFY(HEATER_3_MINTEMP), false); + STATIC_ITEM(MSG_INFO_MAX_TEMP ": " STRINGIFY(HEATER_3_MAXTEMP), false); + #endif + + #if TEMP_SENSOR_4 != 0 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_4 + #include "thermistornames.h" + STATIC_ITEM("T4: " THERMISTOR_NAME, false, true); + STATIC_ITEM(MSG_INFO_MIN_TEMP ": " STRINGIFY(HEATER_4_MINTEMP), false); + STATIC_ITEM(MSG_INFO_MAX_TEMP ": " STRINGIFY(HEATER_4_MAXTEMP), false); + #endif + + #if HAS_HEATED_BED + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_BED + #include "thermistornames.h" + STATIC_ITEM("TBed:" THERMISTOR_NAME, false, true); + STATIC_ITEM(MSG_INFO_MIN_TEMP ": " STRINGIFY(BED_MINTEMP), false); + STATIC_ITEM(MSG_INFO_MAX_TEMP ": " STRINGIFY(BED_MAXTEMP), false); + #endif + END_SCREEN(); + } + + /** + * + * About Printer > Board Info + * + */ + void lcd_info_board_menu() { + if (use_click()) { return lcd_goto_previous_menu(); } + START_SCREEN(); + STATIC_ITEM(BOARD_NAME, true, true); // MyPrinterController + STATIC_ITEM(MSG_INFO_BAUDRATE ": " STRINGIFY(BAUDRATE), true); // Baud: 250000 + STATIC_ITEM(MSG_INFO_PROTOCOL ": " PROTOCOL_VERSION, true); // Protocol: 1.0 + #if POWER_SUPPLY == 0 + STATIC_ITEM(MSG_INFO_PSU ": Generic", true); + #elif POWER_SUPPLY == 1 + STATIC_ITEM(MSG_INFO_PSU ": ATX", true); // Power Supply: ATX + #elif POWER_SUPPLY == 2 + STATIC_ITEM(MSG_INFO_PSU ": XBox", true); // Power Supply: XBox + #endif + END_SCREEN(); + } + + /** + * + * About Printer > Printer Info + * + */ + void lcd_info_printer_menu() { + if (use_click()) { return lcd_goto_previous_menu(); } + START_SCREEN(); + STATIC_ITEM(MSG_MARLIN, true, true); // Marlin + STATIC_ITEM(SHORT_BUILD_VERSION, true); // x.x.x-Branch + STATIC_ITEM(STRING_DISTRIBUTION_DATE, true); // YYYY-MM-DD HH:MM + STATIC_ITEM(MACHINE_NAME, true); // My3DPrinter + STATIC_ITEM(WEBSITE_URL, true); // www.my3dprinter.com + STATIC_ITEM(MSG_INFO_EXTRUDERS ": " STRINGIFY(EXTRUDERS), true); // Extruders: 2 + #if ENABLED(AUTO_BED_LEVELING_3POINT) + STATIC_ITEM(MSG_3POINT_LEVELING, true); // 3-Point Leveling + #elif ENABLED(AUTO_BED_LEVELING_LINEAR) + STATIC_ITEM(MSG_LINEAR_LEVELING, true); // Linear Leveling + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + STATIC_ITEM(MSG_BILINEAR_LEVELING, true); // Bi-linear Leveling + #elif ENABLED(AUTO_BED_LEVELING_UBL) + STATIC_ITEM(MSG_UBL_LEVELING, true); // Unified Bed Leveling + #elif ENABLED(MESH_BED_LEVELING) + STATIC_ITEM(MSG_MESH_LEVELING, true); // Mesh Leveling + #endif + END_SCREEN(); + } + + /** + * + * "About Printer" submenu + * + */ + void lcd_info_menu() { + START_MENU(); + MENU_BACK(MSG_MAIN); + MENU_ITEM(submenu, MSG_INFO_PRINTER_MENU, lcd_info_printer_menu); // Printer Info > + MENU_ITEM(submenu, MSG_INFO_BOARD_MENU, lcd_info_board_menu); // Board Info > + MENU_ITEM(submenu, MSG_INFO_THERMISTOR_MENU, lcd_info_thermistors_menu); // Thermistors > + #if ENABLED(PRINTCOUNTER) + MENU_ITEM(submenu, MSG_INFO_STATS_MENU, lcd_info_stats_menu); // Printer Statistics > + #endif + END_MENU(); + } + #endif // LCD_INFO_MENU + + /** + * + * LED Menu + * + */ + + #if ENABLED(LED_CONTROL_MENU) + + #if ENABLED(LED_COLOR_PRESETS) + + void lcd_led_presets_menu() { + START_MENU(); + #if LCD_HEIGHT > 2 + STATIC_ITEM(MSG_LED_PRESETS, true, true); + #endif + MENU_BACK(MSG_LED_CONTROL); + MENU_ITEM(function, MSG_SET_LEDS_WHITE, leds.set_white); + MENU_ITEM(function, MSG_SET_LEDS_RED, leds.set_red); + MENU_ITEM(function, MSG_SET_LEDS_ORANGE, leds.set_orange); + MENU_ITEM(function, MSG_SET_LEDS_YELLOW,leds.set_yellow); + MENU_ITEM(function, MSG_SET_LEDS_GREEN, leds.set_green); + MENU_ITEM(function, MSG_SET_LEDS_BLUE, leds.set_blue); + MENU_ITEM(function, MSG_SET_LEDS_INDIGO, leds.set_indigo); + MENU_ITEM(function, MSG_SET_LEDS_VIOLET, leds.set_violet); + END_MENU(); + } + #endif // LED_COLOR_PRESETS + + void lcd_led_custom_menu() { + START_MENU(); + MENU_BACK(MSG_LED_CONTROL); + MENU_ITEM_EDIT_CALLBACK(int8, MSG_INTENSITY_R, &leds.color.r, 0, 255, leds.update, true); + MENU_ITEM_EDIT_CALLBACK(int8, MSG_INTENSITY_G, &leds.color.g, 0, 255, leds.update, true); + MENU_ITEM_EDIT_CALLBACK(int8, MSG_INTENSITY_B, &leds.color.b, 0, 255, leds.update, true); + #if ENABLED(RGBW_LED) || ENABLED(NEOPIXEL_LED) + MENU_ITEM_EDIT_CALLBACK(int8, MSG_INTENSITY_W, &leds.color.w, 0, 255, leds.update, true); + #if ENABLED(NEOPIXEL_LED) + MENU_ITEM_EDIT_CALLBACK(int8, MSG_LED_BRIGHTNESS, &leds.color.i, 0, 255, leds.update, true); + #endif + #endif + END_MENU(); + } + + void lcd_led_menu() { + START_MENU(); + MENU_BACK(MSG_MAIN); + bool led_on = leds.lights_on; + MENU_ITEM_EDIT_CALLBACK(bool, MSG_LEDS, &led_on, leds.toggle); + MENU_ITEM(function, MSG_SET_LEDS_DEFAULT, leds.set_default); + #if ENABLED(LED_COLOR_PRESETS) + MENU_ITEM(submenu, MSG_LED_PRESETS, lcd_led_presets_menu); + #endif + MENU_ITEM(submenu, MSG_CUSTOM_LEDS, lcd_led_custom_menu); + END_MENU(); + } + + #endif // LED_CONTROL_MENU + + /** + * + * Filament Change Feature Screens + * + */ + #if ENABLED(ADVANCED_PAUSE_FEATURE) + + /** + * + * "Change Filament" > "Change/Unload/Load Filament" submenu + * + */ + static AdvancedPauseMode _change_filament_temp_mode; + static int8_t _change_filament_temp_extruder; + + static const char* _change_filament_temp_command() { + switch (_change_filament_temp_mode) { + case ADVANCED_PAUSE_MODE_LOAD_FILAMENT: + return PSTR("M701 T%d"); + case ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT: + return _change_filament_temp_extruder >= 0 ? PSTR("M702 T%d") : PSTR("M702 ;%d"); + case ADVANCED_PAUSE_MODE_PAUSE_PRINT: + default: + return PSTR("M600 B0 T%d"); + } + return PSTR(MSG_FILAMENTCHANGE); + } + + void _change_filament_temp(const uint16_t temperature) { + char cmd[11]; + sprintf_P(cmd, _change_filament_temp_command(), _change_filament_temp_extruder); + thermalManager.setTargetHotend(temperature, _change_filament_temp_extruder); + lcd_enqueue_command(cmd); + } + void _lcd_change_filament_temp_1_menu() { _change_filament_temp(PREHEAT_1_TEMP_HOTEND); } + void _lcd_change_filament_temp_2_menu() { _change_filament_temp(PREHEAT_2_TEMP_HOTEND); } + void _lcd_change_filament_temp_custom_menu() { _change_filament_temp(thermalManager.target_temperature[_change_filament_temp_extruder]); } + + static const char* change_filament_header(const AdvancedPauseMode mode) { + switch (mode) { + case ADVANCED_PAUSE_MODE_LOAD_FILAMENT: + return PSTR(MSG_FILAMENTLOAD); + case ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT: + return PSTR(MSG_FILAMENTUNLOAD); + default: break; + } + return PSTR(MSG_FILAMENTCHANGE); + } + + void _lcd_temp_menu_filament_op(const AdvancedPauseMode mode, const int8_t extruder) { + _change_filament_temp_mode = mode; + _change_filament_temp_extruder = extruder; + START_MENU(); + if (LCD_HEIGHT >= 4) STATIC_ITEM_P(change_filament_header(mode), true, true); + MENU_BACK(MSG_FILAMENTCHANGE); + MENU_ITEM(submenu, MSG_PREHEAT_1, _lcd_change_filament_temp_1_menu); + MENU_ITEM(submenu, MSG_PREHEAT_2, _lcd_change_filament_temp_2_menu); + uint16_t max_temp; + switch (extruder) { + default: max_temp = HEATER_0_MAXTEMP; + #if HOTENDS > 1 + case 1: max_temp = HEATER_1_MAXTEMP; break; + #if HOTENDS > 2 + case 2: max_temp = HEATER_2_MAXTEMP; break; + #if HOTENDS > 3 + case 3: max_temp = HEATER_3_MAXTEMP; break; + #if HOTENDS > 4 + case 4: max_temp = HEATER_4_MAXTEMP; break; + #endif + #endif + #endif + #endif + } + MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_PREHEAT_CUSTOM, &thermalManager.target_temperature[_change_filament_temp_extruder], EXTRUDE_MINTEMP, max_temp - 15, _lcd_change_filament_temp_custom_menu); + END_MENU(); + } + void lcd_temp_menu_e0_filament_change() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 0); } + void lcd_temp_menu_e0_filament_load() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 0); } + void lcd_temp_menu_e0_filament_unload() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 0); } + #if E_STEPPERS > 1 + void lcd_temp_menu_e1_filament_change() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 1); } + void lcd_temp_menu_e1_filament_load() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 1); } + void lcd_temp_menu_e1_filament_unload() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 1); } + #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) + void lcd_unload_filament_all_temp_menu() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, -1); } + #endif + #if E_STEPPERS > 2 + void lcd_temp_menu_e2_filament_change() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 2); } + void lcd_temp_menu_e2_filament_load() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 2); } + void lcd_temp_menu_e2_filament_unload() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 2); } + #if E_STEPPERS > 3 + void lcd_temp_menu_e3_filament_change() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 3); } + void lcd_temp_menu_e3_filament_load() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 3); } + void lcd_temp_menu_e3_filament_unload() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 3); } + #if E_STEPPERS > 4 + void lcd_temp_menu_e4_filament_change() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_PAUSE_PRINT, 4); } + void lcd_temp_menu_e4_filament_load() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_LOAD_FILAMENT, 4); } + void lcd_temp_menu_e4_filament_unload() { _lcd_temp_menu_filament_op(ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT, 4); } + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + + /** + * + * "Change Filament" submenu + * + */ + #if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + void lcd_change_filament_menu() { + START_MENU(); + MENU_BACK(MSG_MAIN); + + // Change filament + #if E_STEPPERS == 1 + PGM_P msg0 = PSTR(MSG_FILAMENTCHANGE); + if (thermalManager.targetTooColdToExtrude(active_extruder)) + MENU_ITEM_P(submenu, msg0, lcd_temp_menu_e0_filament_change); + else + MENU_ITEM_P(gcode, msg0, PSTR("M600 B0")); + #else + PGM_P msg0 = PSTR(MSG_FILAMENTCHANGE " " MSG_E1); + PGM_P msg1 = PSTR(MSG_FILAMENTCHANGE " " MSG_E2); + if (thermalManager.targetTooColdToExtrude(0)) + MENU_ITEM_P(submenu, msg0, lcd_temp_menu_e0_filament_change); + else + MENU_ITEM_P(gcode, msg0, PSTR("M600 B0 T0")); + if (thermalManager.targetTooColdToExtrude(1)) + MENU_ITEM_P(submenu, msg1, lcd_temp_menu_e1_filament_change); + else + MENU_ITEM_P(gcode, msg1, PSTR("M600 B0 T1")); + #if E_STEPPERS > 2 + PGM_P msg2 = PSTR(MSG_FILAMENTCHANGE " " MSG_E3); + if (thermalManager.targetTooColdToExtrude(2)) + MENU_ITEM_P(submenu, msg2, lcd_temp_menu_e2_filament_change); + else + MENU_ITEM_P(gcode, msg2, PSTR("M600 B0 T2")); + #if E_STEPPERS > 3 + PGM_P msg3 = PSTR(MSG_FILAMENTCHANGE " " MSG_E4); + if (thermalManager.targetTooColdToExtrude(3)) + MENU_ITEM_P(submenu, msg3, lcd_temp_menu_e3_filament_change); + else + MENU_ITEM_P(gcode, msg3, PSTR("M600 B0 T3")); + #if E_STEPPERS > 4 + PGM_P msg4 = PSTR(MSG_FILAMENTCHANGE " " MSG_E5); + if (thermalManager.targetTooColdToExtrude(4)) + MENU_ITEM_P(submenu, msg4, lcd_temp_menu_e4_filament_change); + else + MENU_ITEM_P(gcode, msg4, PSTR("M600 B0 T4")); + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS == 1 + + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + if (!planner.movesplanned() && !IS_SD_FILE_OPEN) { + // Load filament + #if E_STEPPERS == 1 + PGM_P msg0 = PSTR(MSG_FILAMENTLOAD); + if (thermalManager.targetTooColdToExtrude(active_extruder)) + MENU_ITEM_P(submenu, msg0, lcd_temp_menu_e0_filament_load); + else + MENU_ITEM_P(gcode, msg0, PSTR("M701")); + #else + PGM_P msg0 = PSTR(MSG_FILAMENTLOAD " " MSG_E1); + PGM_P msg1 = PSTR(MSG_FILAMENTLOAD " " MSG_E2); + if (thermalManager.targetTooColdToExtrude(0)) + MENU_ITEM_P(submenu, msg0, lcd_temp_menu_e0_filament_load); + else + MENU_ITEM_P(gcode, msg0, PSTR("M701 T0")); + if (thermalManager.targetTooColdToExtrude(1)) + MENU_ITEM_P(submenu, msg1, lcd_temp_menu_e1_filament_load); + else + MENU_ITEM_P(gcode, msg1, PSTR("M701 T1")); + #if E_STEPPERS > 2 + PGM_P msg2 = PSTR(MSG_FILAMENTLOAD " " MSG_E3); + if (thermalManager.targetTooColdToExtrude(2)) + MENU_ITEM_P(submenu, msg2, lcd_temp_menu_e2_filament_load); + else + MENU_ITEM_P(gcode, msg2, PSTR("M701 T2")); + #if E_STEPPERS > 3 + PGM_P msg3 = PSTR(MSG_FILAMENTLOAD " " MSG_E4); + if (thermalManager.targetTooColdToExtrude(3)) + MENU_ITEM_P(submenu, msg3, lcd_temp_menu_e3_filament_load); + else + MENU_ITEM_P(gcode, msg3, PSTR("M701 T3")); + #if E_STEPPERS > 4 + PGM_P msg4 = PSTR(MSG_FILAMENTLOAD " " MSG_E5); + if (thermalManager.targetTooColdToExtrude(4)) + MENU_ITEM_P(submenu, msg4, lcd_temp_menu_e4_filament_load); + else + MENU_ITEM_P(gcode, msg4, PSTR("M701 T4")); + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS == 1 + + // Unload filament + #if E_STEPPERS == 1 + if (thermalManager.targetHotEnoughToExtrude(active_extruder)) + MENU_ITEM(gcode, MSG_FILAMENTUNLOAD, PSTR("M702")); + else + MENU_ITEM(submenu, MSG_FILAMENTUNLOAD, lcd_temp_menu_e0_filament_unload); + #else + #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) + if (thermalManager.targetHotEnoughToExtrude(0) + #if E_STEPPERS > 1 + && thermalManager.targetHotEnoughToExtrude(1) + #if E_STEPPERS > 2 + && thermalManager.targetHotEnoughToExtrude(2) + #if E_STEPPERS > 3 + && thermalManager.targetHotEnoughToExtrude(3) + #if E_STEPPERS > 4 + && thermalManager.targetHotEnoughToExtrude(4) + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + ) + MENU_ITEM(gcode, MSG_FILAMENTUNLOAD_ALL, PSTR("M702")); + else + MENU_ITEM(submenu, MSG_FILAMENTUNLOAD_ALL, lcd_unload_filament_all_temp_menu); + #endif + if (thermalManager.targetHotEnoughToExtrude(0)) + MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E1, PSTR("M702 T0")); + else + MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E1, lcd_temp_menu_e0_filament_unload); + if (thermalManager.targetHotEnoughToExtrude(1)) + MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E2, PSTR("M702 T1")); + else + MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E2, lcd_temp_menu_e1_filament_unload); + #if E_STEPPERS > 2 + if (thermalManager.targetHotEnoughToExtrude(2)) + MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E3, PSTR("M702 T2")); + else + MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E3, lcd_temp_menu_e2_filament_unload); + #if E_STEPPERS > 3 + if (thermalManager.targetHotEnoughToExtrude(3)) + MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E4, PSTR("M702 T3")); + else + MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E4, lcd_temp_menu_e3_filament_unload); + #if E_STEPPERS > 4 + if (thermalManager.targetHotEnoughToExtrude(4)) + MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E5, PSTR("M702 T4")); + else + MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E5, lcd_temp_menu_e4_filament_unload); + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS == 1 + } + #endif + + END_MENU(); + } + #endif + + static AdvancedPauseMode advanced_pause_mode = ADVANCED_PAUSE_MODE_PAUSE_PRINT; + static uint8_t hotend_status_extruder = 0; + + static const char* advanced_pause_header() { + switch (advanced_pause_mode) { + case ADVANCED_PAUSE_MODE_LOAD_FILAMENT: + return PSTR(MSG_FILAMENT_CHANGE_HEADER_LOAD); + case ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT: + return PSTR(MSG_FILAMENT_CHANGE_HEADER_UNLOAD); + default: break; + } + return PSTR(MSG_FILAMENT_CHANGE_HEADER_PAUSE); + } + + // Portions from STATIC_ITEM... + #define HOTEND_STATUS_ITEM() do { \ + if (_menuLineNr == _thisItemNr) { \ + if (lcdDrawUpdate) { \ + lcd_implementation_drawmenu_static(_lcdLineNr, PSTR(MSG_FILAMENT_CHANGE_NOZZLE), false, true); \ + lcd_implementation_hotend_status(_lcdLineNr, hotend_status_extruder); \ + } \ + if (_skipStatic && encoderLine <= _thisItemNr) { \ + encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ + ++encoderLine; \ + } \ + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; \ + } \ + ++_thisItemNr; \ + }while(0) + + void lcd_advanced_pause_resume_print() { + advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_RESUME_PRINT; + } + + void lcd_advanced_pause_extrude_more() { + advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_EXTRUDE_MORE; + } + + void lcd_advanced_pause_option_menu() { + START_MENU(); + #if LCD_HEIGHT > 2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_OPTION_HEADER, true, false); + #endif + MENU_ITEM(function, MSG_FILAMENT_CHANGE_OPTION_RESUME, lcd_advanced_pause_resume_print); + MENU_ITEM(function, MSG_FILAMENT_CHANGE_OPTION_PURGE, lcd_advanced_pause_extrude_more); + END_MENU(); + } + + void lcd_advanced_pause_init_message() { + START_SCREEN(); + STATIC_ITEM_P(advanced_pause_header(), true, true); + STATIC_ITEM(MSG_FILAMENT_CHANGE_INIT_1); + #ifdef MSG_FILAMENT_CHANGE_INIT_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_INIT_2); + #define __FC_LINES_A 3 + #else + #define __FC_LINES_A 2 + #endif + #ifdef MSG_FILAMENT_CHANGE_INIT_3 + STATIC_ITEM(MSG_FILAMENT_CHANGE_INIT_3); + #define _FC_LINES_A (__FC_LINES_A + 1) + #else + #define _FC_LINES_A __FC_LINES_A + #endif + #if LCD_HEIGHT > _FC_LINES_A + 1 + STATIC_ITEM(" "); + #endif + HOTEND_STATUS_ITEM(); + END_SCREEN(); + } + + void lcd_advanced_pause_unload_message() { + START_SCREEN(); + STATIC_ITEM_P(advanced_pause_header(), true, true); + STATIC_ITEM(MSG_FILAMENT_CHANGE_UNLOAD_1); + #ifdef MSG_FILAMENT_CHANGE_UNLOAD_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_UNLOAD_2); + #define __FC_LINES_B 3 + #else + #define __FC_LINES_B 2 + #endif + #ifdef MSG_FILAMENT_CHANGE_UNLOAD_3 + STATIC_ITEM(MSG_FILAMENT_CHANGE_UNLOAD_3); + #define _FC_LINES_B (__FC_LINES_B + 1) + #else + #define _FC_LINES_B __FC_LINES_B + #endif + #if LCD_HEIGHT > _FC_LINES_B + 1 + STATIC_ITEM(" "); + #endif + HOTEND_STATUS_ITEM(); + END_SCREEN(); + } + + void lcd_advanced_pause_wait_for_nozzles_to_heat() { + START_SCREEN(); + STATIC_ITEM_P(advanced_pause_header(), true, true); + STATIC_ITEM(MSG_FILAMENT_CHANGE_HEATING_1); + #ifdef MSG_FILAMENT_CHANGE_HEATING_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_HEATING_2); + #define _FC_LINES_C 3 + #else + #define _FC_LINES_C 2 + #endif + #if LCD_HEIGHT > _FC_LINES_C + 1 + STATIC_ITEM(" "); + #endif + HOTEND_STATUS_ITEM(); + END_SCREEN(); + } + + void lcd_advanced_pause_heat_nozzle() { + START_SCREEN(); + STATIC_ITEM_P(advanced_pause_header(), true, true); + STATIC_ITEM(MSG_FILAMENT_CHANGE_HEAT_1); + #ifdef MSG_FILAMENT_CHANGE_INSERT_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_HEAT_2); + #define _FC_LINES_D 3 + #else + #define _FC_LINES_D 2 + #endif + #if LCD_HEIGHT > _FC_LINES_D + 1 + STATIC_ITEM(" "); + #endif + HOTEND_STATUS_ITEM(); + END_SCREEN(); + } + + void lcd_advanced_pause_insert_message() { + START_SCREEN(); + STATIC_ITEM_P(advanced_pause_header(), true, true); + STATIC_ITEM(MSG_FILAMENT_CHANGE_INSERT_1); + #ifdef MSG_FILAMENT_CHANGE_INSERT_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_INSERT_2); + #define __FC_LINES_E 3 + #else + #define __FC_LINES_E 2 + #endif + #ifdef MSG_FILAMENT_CHANGE_INSERT_3 + STATIC_ITEM(MSG_FILAMENT_CHANGE_INSERT_3); + #define _FC_LINES_E (__FC_LINES_E + 1) + #else + #define _FC_LINES_E __FC_LINES_E + #endif + #if LCD_HEIGHT > _FC_LINES_E + 1 + STATIC_ITEM(" "); + #endif + HOTEND_STATUS_ITEM(); + END_SCREEN(); + } + + void lcd_advanced_pause_load_message() { + START_SCREEN(); + STATIC_ITEM_P(advanced_pause_header(), true, true); + STATIC_ITEM(MSG_FILAMENT_CHANGE_LOAD_1); + #ifdef MSG_FILAMENT_CHANGE_LOAD_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_LOAD_2); + #define __FC_LINES_F 3 + #else + #define __FC_LINES_F 2 + #endif + #ifdef MSG_FILAMENT_CHANGE_LOAD_3 + STATIC_ITEM(MSG_FILAMENT_CHANGE_LOAD_3); + #define _FC_LINES_F (__FC_LINES_F + 1) + #else + #define _FC_LINES_F __FC_LINES_F + #endif + #if LCD_HEIGHT > _FC_LINES_F + 1 + STATIC_ITEM(" "); + #endif + HOTEND_STATUS_ITEM(); + END_SCREEN(); + } + + void lcd_advanced_pause_purge_message() { + START_SCREEN(); + STATIC_ITEM_P(advanced_pause_header(), true, true); + STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_1); + #ifdef MSG_FILAMENT_CHANGE_PURGE_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_2); + #define __FC_LINES_G 3 + #else + #define __FC_LINES_G 2 + #endif + #ifdef MSG_FILAMENT_CHANGE_PURGE_3 + STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_3); + #define _FC_LINES_G (__FC_LINES_G + 1) + #else + #define _FC_LINES_G __FC_LINES_G + #endif + #if LCD_HEIGHT > _FC_LINES_G + 1 + STATIC_ITEM(" "); + #endif + HOTEND_STATUS_ITEM(); + END_SCREEN(); + } + + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + void lcd_advanced_pause_continuous_purge_menu() { + START_SCREEN(); + STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_1); + #ifdef MSG_FILAMENT_CHANGE_PURGE_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_2); + #define __FC_LINES_G 3 + #else + #define __FC_LINES_G 2 + #endif + #ifdef MSG_FILAMENT_CHANGE_PURGE_3 + STATIC_ITEM(MSG_FILAMENT_CHANGE_PURGE_3); + #define _FC_LINES_G (__FC_LINES_G + 1) + #else + #define _FC_LINES_G __FC_LINES_G + #endif + #if LCD_HEIGHT > _FC_LINES_G + 1 + STATIC_ITEM(" "); + #endif + HOTEND_STATUS_ITEM(); + STATIC_ITEM(MSG_USERWAIT); + END_SCREEN(); + } + #endif + + void lcd_advanced_pause_resume_message() { + START_SCREEN(); + STATIC_ITEM_P(advanced_pause_header(), true, true); + STATIC_ITEM(MSG_FILAMENT_CHANGE_RESUME_1); + #ifdef MSG_FILAMENT_CHANGE_RESUME_2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_RESUME_2); + #endif + #ifdef MSG_FILAMENT_CHANGE_RESUME_3 + STATIC_ITEM(MSG_FILAMENT_CHANGE_RESUME_3); + #endif + END_SCREEN(); + } + + FORCE_INLINE screenFunc_t ap_message_screen(const AdvancedPauseMessage message) { + switch (message) { + case ADVANCED_PAUSE_MESSAGE_INIT: return lcd_advanced_pause_init_message; + case ADVANCED_PAUSE_MESSAGE_UNLOAD: return lcd_advanced_pause_unload_message; + case ADVANCED_PAUSE_MESSAGE_INSERT: return lcd_advanced_pause_insert_message; + case ADVANCED_PAUSE_MESSAGE_LOAD: return lcd_advanced_pause_load_message; + case ADVANCED_PAUSE_MESSAGE_PURGE: return lcd_advanced_pause_purge_message; + case ADVANCED_PAUSE_MESSAGE_RESUME: return lcd_advanced_pause_resume_message; + case ADVANCED_PAUSE_MESSAGE_CLICK_TO_HEAT_NOZZLE: return lcd_advanced_pause_heat_nozzle; + case ADVANCED_PAUSE_MESSAGE_WAIT_FOR_NOZZLES_TO_HEAT: return lcd_advanced_pause_wait_for_nozzles_to_heat; + case ADVANCED_PAUSE_MESSAGE_OPTION: advanced_pause_menu_response = ADVANCED_PAUSE_RESPONSE_WAIT_FOR; + return lcd_advanced_pause_option_menu; + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + case ADVANCED_PAUSE_MESSAGE_CONTINUOUS_PURGE: return lcd_advanced_pause_continuous_purge_menu; + #endif + case ADVANCED_PAUSE_MESSAGE_STATUS: + default: break; + } + return NULL; + } + + void lcd_advanced_pause_show_message( + const AdvancedPauseMessage message, + const AdvancedPauseMode mode/*=ADVANCED_PAUSE_MODE_PAUSE_PRINT*/, + const uint8_t extruder/*=active_extruder*/ + ) { + advanced_pause_mode = mode; + hotend_status_extruder = extruder; + const screenFunc_t next_screen = ap_message_screen(message); + if (next_screen) { + defer_return_to_status = true; + lcd_goto_screen(next_screen); + } + else + lcd_return_to_status(); + } + + #endif // ADVANCED_PAUSE_FEATURE + + /** + * + * Functions for editing single values + * + * The "DEFINE_MENU_EDIT_TYPE" macro generates the functions needed to edit a numerical value. + * + * For example, DEFINE_MENU_EDIT_TYPE(int16_t, int3, itostr3, 1) expands into these functions: + * + * bool _menu_edit_int3(); + * void menu_edit_int3(); // edit int16_t (interactively) + * void menu_edit_callback_int3(); // edit int16_t (interactively) with callback on completion + * void _menu_action_setting_edit_int3(const char * const pstr, int16_t * const ptr, const int16_t minValue, const int16_t maxValue); + * void menu_action_setting_edit_int3(const char * const pstr, int16_t * const ptr, const int16_t minValue, const int16_t maxValue); + * void menu_action_setting_edit_callback_int3(const char * const pstr, int16_t * const ptr, const int16_t minValue, const int16_t maxValue, const screenFunc_t callback, const bool live); // edit int16_t with callback + * + * You can then use one of the menu macros to present the edit interface: + * MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_percentage, 10, 999) + * + * This expands into a more primitive menu item: + * MENU_ITEM(setting_edit_int3, MSG_SPEED, PSTR(MSG_SPEED), &feedrate_percentage, 10, 999) + * + * ...which calls: + * menu_action_setting_edit_int3(PSTR(MSG_SPEED), &feedrate_percentage, 10, 999) + */ + #define DEFINE_MENU_EDIT_TYPE(_type, _name, _strFunc, _scale) \ + bool _menu_edit_ ## _name() { \ + ENCODER_DIRECTION_NORMAL(); \ + if ((int32_t)encoderPosition < 0) encoderPosition = 0; \ + if ((int32_t)encoderPosition > maxEditValue) encoderPosition = maxEditValue; \ + if (lcdDrawUpdate) \ + lcd_implementation_drawedit(editLabel, _strFunc(((_type)((int32_t)encoderPosition + minEditValue)) * (1.0f / _scale))); \ + if (lcd_clicked || (liveEdit && lcdDrawUpdate)) { \ + _type value = ((_type)((int32_t)encoderPosition + minEditValue)) * (1.0f / _scale); \ + if (editValue != NULL) *((_type*)editValue) = value; \ + if (callbackFunc && (liveEdit || lcd_clicked)) (*callbackFunc)(); \ + if (lcd_clicked) lcd_goto_previous_menu(); \ + } \ + return use_click(); \ + } \ + void menu_edit_ ## _name() { _menu_edit_ ## _name(); } \ + void _menu_action_setting_edit_ ## _name(const char * const pstr, _type* const ptr, const _type minValue, const _type maxValue) { \ + lcd_save_previous_screen(); \ + lcd_refresh(); \ + \ + editLabel = pstr; \ + editValue = ptr; \ + minEditValue = minValue * _scale; \ + maxEditValue = maxValue * _scale - minEditValue; \ + encoderPosition = (*ptr) * _scale - minEditValue; \ + } \ + void menu_action_setting_edit_callback_ ## _name(const char * const pstr, _type * const ptr, const _type minValue, const _type maxValue, const screenFunc_t callback, const bool live) { \ + _menu_action_setting_edit_ ## _name(pstr, ptr, minValue, maxValue); \ + currentScreen = menu_edit_ ## _name; \ + callbackFunc = callback; \ + liveEdit = live; \ + } \ + FORCE_INLINE void menu_action_setting_edit_ ## _name(const char * const pstr, _type * const ptr, const _type minValue, const _type maxValue) { \ + menu_action_setting_edit_callback_ ## _name(pstr, ptr, minValue, maxValue); \ + } \ + typedef void _name##_void + + DEFINE_MENU_EDIT_TYPE(int16_t, int3, itostr3, 1); + DEFINE_MENU_EDIT_TYPE(uint8_t, int8, i8tostr3, 1); + DEFINE_MENU_EDIT_TYPE(float, float3, ftostr3, 1); + DEFINE_MENU_EDIT_TYPE(float, float52, ftostr52, 100); + DEFINE_MENU_EDIT_TYPE(float, float43, ftostr43sign, 1000); + DEFINE_MENU_EDIT_TYPE(float, float5, ftostr5rj, 0.01f); + DEFINE_MENU_EDIT_TYPE(float, float51, ftostr51sign, 10); + DEFINE_MENU_EDIT_TYPE(float, float52sign, ftostr52sign, 100); + DEFINE_MENU_EDIT_TYPE(float, float62, ftostr62rj, 100); + DEFINE_MENU_EDIT_TYPE(uint32_t, long5, ftostr5rj, 0.01f); + + /** + * + * Handlers for Keypad input + * + */ + #if ENABLED(ADC_KEYPAD) + + inline bool handle_adc_keypad() { + #define ADC_MIN_KEY_DELAY 100 + if (buttons_reprapworld_keypad) { + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; + if (encoderDirection == -1) { // side effect which signals we are inside a menu + if (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_DOWN) encoderPosition -= ENCODER_STEPS_PER_MENU_ITEM; + else if (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_UP) encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; + else if (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_LEFT) { menu_action_back(); lcd_quick_feedback(true); } + else if (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_RIGHT) { lcd_return_to_status(); lcd_quick_feedback(true); } + } + else { + if (buttons_reprapworld_keypad & (EN_REPRAPWORLD_KEYPAD_DOWN|EN_REPRAPWORLD_KEYPAD_UP|EN_REPRAPWORLD_KEYPAD_RIGHT)) { + if (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_DOWN) encoderPosition += ENCODER_PULSES_PER_STEP; + else if (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_UP) encoderPosition -= ENCODER_PULSES_PER_STEP; + else if (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_RIGHT) encoderPosition = 0; + } + } + #if ENABLED(ADC_KEYPAD_DEBUG) + SERIAL_PROTOCOLLNPAIR("buttons_reprapworld_keypad = ", (uint32_t)buttons_reprapworld_keypad); + SERIAL_PROTOCOLLNPAIR("encoderPosition = ", (uint32_t)encoderPosition); + #endif + next_button_update_ms = millis() + ADC_MIN_KEY_DELAY; + return true; + } + + return false; + } + + #elif ENABLED(REPRAPWORLD_KEYPAD) + + void _reprapworld_keypad_move(const AxisEnum axis, const int16_t dir) { + move_menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; + encoderPosition = dir; + switch (axis) { + case X_AXIS: lcd_move_x(); break; + case Y_AXIS: lcd_move_y(); break; + case Z_AXIS: lcd_move_z(); + default: break; + } + } + void reprapworld_keypad_move_z_up() { _reprapworld_keypad_move(Z_AXIS, 1); } + void reprapworld_keypad_move_z_down() { _reprapworld_keypad_move(Z_AXIS, -1); } + void reprapworld_keypad_move_x_left() { _reprapworld_keypad_move(X_AXIS, -1); } + void reprapworld_keypad_move_x_right() { _reprapworld_keypad_move(X_AXIS, 1); } + void reprapworld_keypad_move_y_up() { _reprapworld_keypad_move(Y_AXIS, -1); } + void reprapworld_keypad_move_y_down() { _reprapworld_keypad_move(Y_AXIS, 1); } + void reprapworld_keypad_move_home() { enqueue_and_echo_commands_P(PSTR("G28")); } // move all axes home and wait + void reprapworld_keypad_move_menu() { lcd_goto_screen(lcd_move_menu); } + + inline void handle_reprapworld_keypad() { + + static uint8_t keypad_debounce = 0; + + if (!REPRAPWORLD_KEYPAD_PRESSED) { + if (keypad_debounce > 0) keypad_debounce--; + } + else if (!keypad_debounce) { + keypad_debounce = 2; + + if (REPRAPWORLD_KEYPAD_MOVE_MENU) reprapworld_keypad_move_menu(); + + #if DISABLED(DELTA) && Z_HOME_DIR == -1 + if (REPRAPWORLD_KEYPAD_MOVE_Z_UP) reprapworld_keypad_move_z_up(); + #endif + + if (all_axes_homed()) { + #if ENABLED(DELTA) || Z_HOME_DIR != -1 + if (REPRAPWORLD_KEYPAD_MOVE_Z_UP) reprapworld_keypad_move_z_up(); + #endif + if (REPRAPWORLD_KEYPAD_MOVE_Z_DOWN) reprapworld_keypad_move_z_down(); + if (REPRAPWORLD_KEYPAD_MOVE_X_LEFT) reprapworld_keypad_move_x_left(); + if (REPRAPWORLD_KEYPAD_MOVE_X_RIGHT) reprapworld_keypad_move_x_right(); + if (REPRAPWORLD_KEYPAD_MOVE_Y_DOWN) reprapworld_keypad_move_y_down(); + if (REPRAPWORLD_KEYPAD_MOVE_Y_UP) reprapworld_keypad_move_y_up(); + } + else { + if (REPRAPWORLD_KEYPAD_MOVE_HOME) reprapworld_keypad_move_home(); + } + } + } + + #endif // REPRAPWORLD_KEYPAD + + /** + * + * Menu actions + * + */ + void _menu_action_back() { lcd_goto_previous_menu(); } + void menu_action_submenu(screenFunc_t func) { lcd_save_previous_screen(); lcd_goto_screen(func); } + void menu_action_gcode(const char* pgcode) { enqueue_and_echo_commands_P(pgcode); } + void menu_action_function(screenFunc_t func) { (*func)(); } + + #if ENABLED(SDSUPPORT) + + void menu_action_sdfile(CardReader &theCard) { + #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) + last_sdfile_encoderPosition = encoderPosition; // Save which file was selected for later use + #endif + card.openAndPrintFile(theCard.filename); + lcd_return_to_status(); + lcd_reset_status(); + } + + void menu_action_sddirectory(CardReader &theCard) { + card.chdir(theCard.filename); + encoderTopLine = 0; + encoderPosition = 2 * ENCODER_STEPS_PER_MENU_ITEM; + screen_changed = true; + #if ENABLED(DOGLCD) + drawing_screen = false; + #endif + lcd_refresh(); + } + + #endif // SDSUPPORT + + void menu_action_setting_edit_bool(const char* pstr, bool* ptr) { UNUSED(pstr); *ptr ^= true; lcd_refresh(); } + void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, screenFunc_t callback) { + menu_action_setting_edit_bool(pstr, ptr); + (*callback)(); + } + +#endif // ULTIPANEL + +void lcd_init() { + + lcd_implementation_init(); + + #if ENABLED(NEWPANEL) #if BUTTON_EXISTS(EN1) SET_INPUT_PULLUP(BTN_EN1); #endif @@ -337,8 +5052,10 @@ void MarlinUI::init() { SET_INPUT_PULLUP(BTN_ENC); #endif - #if BUTTON_EXISTS(BACK) - SET_INPUT_PULLUP(BTN_BACK); + #if ENABLED(REPRAPWORLD_KEYPAD) && DISABLED(ADC_KEYPAD) + SET_OUTPUT(SHIFT_CLK); + OUT_WRITE(SHIFT_LD, HIGH); + SET_INPUT_PULLUP(SHIFT_OUT); #endif #if BUTTON_EXISTS(UP) @@ -354,38 +5071,37 @@ void MarlinUI::init() { SET_INPUT(BTN_RT); #endif - #endif // !HAS_DIGITAL_BUTTONS - - #if HAS_SHIFT_ENCODER + #else // !NEWPANEL #if ENABLED(SR_LCD_2W_NL) // Non latching 2 wire shift register - SET_OUTPUT(SR_DATA_PIN); SET_OUTPUT(SR_CLK_PIN); - #elif defined(SHIFT_CLK) - SET_OUTPUT(SHIFT_CLK); OUT_WRITE(SHIFT_LD, HIGH); - #if defined(SHIFT_EN) && SHIFT_EN >= 0 - OUT_WRITE(SHIFT_EN, LOW); - #endif + OUT_WRITE(SHIFT_EN, LOW); SET_INPUT_PULLUP(SHIFT_OUT); + #endif // SR_LCD_2W_NL - #endif + #endif // !NEWPANEL - #endif // HAS_SHIFT_ENCODER + #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) + SET_INPUT_PULLUP(SD_DETECT_PIN); + lcd_sd_status = 2; // UNKNOWN + #endif - #if BOTH(HAS_ENCODER_ACTION, HAS_SLOW_BUTTONS) + #if ENABLED(LCD_HAS_SLOW_BUTTONS) slow_buttons = 0; #endif - update_buttons(); + lcd_buttons_update(); - TERN_(HAS_ENCODER_ACTION, encoderDiff = 0); + #if ENABLED(ULTIPANEL) + encoderDiff = 0; + #endif } -bool MarlinUI::get_blink() { +bool lcd_blink() { static uint8_t blink = 0; static millis_t next_blink_ms = 0; millis_t ms = millis(); @@ -396,375 +5112,6 @@ bool MarlinUI::get_blink() { return blink != 0; } -//////////////////////////////////////////// -///////////// Keypad Handling ////////////// -//////////////////////////////////////////// - -#if BOTH(REPRAPWORLD_KEYPAD, HAS_ENCODER_ACTION) - - volatile uint8_t MarlinUI::keypad_buttons; - - #if HAS_LCD_MENU && !HAS_ADC_BUTTONS - - void lcd_move_x(); - void lcd_move_y(); - void lcd_move_z(); - - void _reprapworld_keypad_move(const AxisEnum axis, const int16_t dir) { - ui.manual_move.menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; - ui.encoderPosition = dir; - switch (axis) { - case X_AXIS: lcd_move_x(); break; - case Y_AXIS: lcd_move_y(); break; - case Z_AXIS: lcd_move_z(); - default: break; - } - } - - #endif - - bool MarlinUI::handle_keypad() { - - #if HAS_ADC_BUTTONS - - #define ADC_MIN_KEY_DELAY 100 - if (keypad_buttons) { - #if HAS_ENCODER_ACTION - refresh(LCDVIEW_REDRAW_NOW); - #if HAS_LCD_MENU - if (encoderDirection == -(ENCODERBASE)) { // ADC_KEYPAD forces REVERSE_MENU_DIRECTION, so this indicates menu navigation - if (RRK(EN_KEYPAD_UP)) encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; - else if (RRK(EN_KEYPAD_DOWN)) encoderPosition -= ENCODER_STEPS_PER_MENU_ITEM; - else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } - else if (RRK(EN_KEYPAD_RIGHT)) { return_to_status(); quick_feedback(); } - } - else - #endif - { - #if HAS_LCD_MENU - if (RRK(EN_KEYPAD_UP)) encoderPosition -= epps; - else if (RRK(EN_KEYPAD_DOWN)) encoderPosition += epps; - else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } - else if (RRK(EN_KEYPAD_RIGHT)) encoderPosition = 0; - #else - if (RRK(EN_KEYPAD_UP) || RRK(EN_KEYPAD_LEFT)) encoderPosition -= epps; - else if (RRK(EN_KEYPAD_DOWN) || RRK(EN_KEYPAD_RIGHT)) encoderPosition += epps; - #endif - } - #endif - next_button_update_ms = millis() + ADC_MIN_KEY_DELAY; - return true; - } - - #else // !HAS_ADC_BUTTONS - - static uint8_t keypad_debounce = 0; - - if (!RRK( EN_KEYPAD_F1 | EN_KEYPAD_F2 - | EN_KEYPAD_F3 | EN_KEYPAD_DOWN - | EN_KEYPAD_RIGHT | EN_KEYPAD_MIDDLE - | EN_KEYPAD_UP | EN_KEYPAD_LEFT ) - ) { - if (keypad_debounce > 0) keypad_debounce--; - } - else if (!keypad_debounce) { - keypad_debounce = 2; - - const bool homed = all_axes_homed(); - - #if HAS_LCD_MENU - - if (RRK(EN_KEYPAD_MIDDLE)) goto_screen(menu_move); - - #if DISABLED(DELTA) && Z_HOME_DIR < 0 - if (RRK(EN_KEYPAD_F2)) _reprapworld_keypad_move(Z_AXIS, 1); - #endif - - if (homed) { - #if ENABLED(DELTA) || Z_HOME_DIR != -1 - if (RRK(EN_KEYPAD_F2)) _reprapworld_keypad_move(Z_AXIS, 1); - #endif - if (RRK(EN_KEYPAD_F3)) _reprapworld_keypad_move(Z_AXIS, -1); - if (RRK(EN_KEYPAD_LEFT)) _reprapworld_keypad_move(X_AXIS, -1); - if (RRK(EN_KEYPAD_RIGHT)) _reprapworld_keypad_move(X_AXIS, 1); - if (RRK(EN_KEYPAD_DOWN)) _reprapworld_keypad_move(Y_AXIS, 1); - if (RRK(EN_KEYPAD_UP)) _reprapworld_keypad_move(Y_AXIS, -1); - } - - #endif // HAS_LCD_MENU - - if (!homed && RRK(EN_KEYPAD_F1)) queue.inject_P(G28_STR); - return true; - } - - #endif // !ADC_KEYPAD - - return false; - } - -#endif // REPRAPWORLD_KEYPAD - -/** - * Status Screen - * - * This is very display-dependent, so the lcd implementation draws this. - */ - -#if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL - millis_t MarlinUI::progress_bar_ms; // = 0 - #if PROGRESS_MSG_EXPIRE > 0 - millis_t MarlinUI::expire_status_ms; // = 0 - #endif -#endif - -void MarlinUI::status_screen() { - - TERN_(HAS_LCD_MENU, ENCODER_RATE_MULTIPLY(false)); - - #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL - - // - // HD44780 implements the following message blinking and - // message expiration because Status Line and Progress Bar - // share the same line on the display. - // - - #if DISABLED(PROGRESS_MSG_ONCE) || (PROGRESS_MSG_EXPIRE > 0) - #define GOT_MS - const millis_t ms = millis(); - #endif - - // If the message will blink rather than expire... - #if DISABLED(PROGRESS_MSG_ONCE) - if (ELAPSED(ms, progress_bar_ms + PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME)) - progress_bar_ms = ms; - #endif - - #if PROGRESS_MSG_EXPIRE > 0 - - // Handle message expire - if (expire_status_ms) { - - // Expire the message if a job is active and the bar has ticks - if (get_progress_percent() > 2 && !print_job_timer.isPaused()) { - if (ELAPSED(ms, expire_status_ms)) { - status_message[0] = '\0'; - expire_status_ms = 0; - } - } - else { - // Defer message expiration before bar appears - // and during any pause (not just SD) - expire_status_ms += LCD_UPDATE_INTERVAL; - } - } - - #endif // PROGRESS_MSG_EXPIRE - - #endif // LCD_PROGRESS_BAR - - #if HAS_LCD_MENU - if (use_click()) { - #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - next_filament_display = millis() + 5000UL; // Show status message for 5s - #endif - goto_screen(menu_main); - #if DISABLED(NO_LCD_REINIT) - init_lcd(); // May revive the LCD if static electricity killed it - #endif - return; - } - - #endif - - #if ENABLED(ULTIPANEL_FEEDMULTIPLY) - - const int16_t old_frm = feedrate_percentage; - int16_t new_frm = old_frm + int16_t(encoderPosition); - - // Dead zone at 100% feedrate - if (old_frm == 100) { - if (int16_t(encoderPosition) > ENCODER_FEEDRATE_DEADZONE) - new_frm -= ENCODER_FEEDRATE_DEADZONE; - else if (int16_t(encoderPosition) < -(ENCODER_FEEDRATE_DEADZONE)) - new_frm += ENCODER_FEEDRATE_DEADZONE; - else - new_frm = old_frm; - } - else if ((old_frm < 100 && new_frm > 100) || (old_frm > 100 && new_frm < 100)) - new_frm = 100; - - LIMIT(new_frm, 10, 999); - - if (old_frm != new_frm) { - feedrate_percentage = new_frm; - encoderPosition = 0; - #if BOTH(HAS_BUZZER, BEEP_ON_FEEDRATE_CHANGE) - static millis_t next_beep; - #ifndef GOT_MS - const millis_t ms = millis(); - #endif - if (ELAPSED(ms, next_beep)) { - buzz(FEEDRATE_CHANGE_BEEP_DURATION, FEEDRATE_CHANGE_BEEP_FREQUENCY); - next_beep = ms + 500UL; - } - #endif - } - - #endif // ULTIPANEL_FEEDMULTIPLY - - draw_status_screen(); -} - -void MarlinUI::kill_screen(PGM_P lcd_error, PGM_P lcd_component) { - init(); - status_printf_P(1, PSTR(S_FMT ": " S_FMT), lcd_error, lcd_component); - TERN_(HAS_LCD_MENU, return_to_status()); - - // RED ALERT. RED ALERT. - #ifdef LED_BACKLIGHT_TIMEOUT - leds.set_color(LEDColorRed()); - #ifdef NEOPIXEL_BKGD_LED_INDEX - neo.set_pixel_color(NEOPIXEL_BKGD_LED_INDEX, 255, 0, 0, 0); - neo.show(); - #endif - #endif - - draw_kill_screen(); -} - -void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { - - TERN_(HAS_LCD_MENU, refresh()); - - #if HAS_ENCODER_ACTION - if (clear_buttons) buttons = 0; - next_button_update_ms = millis() + 500; - #else - UNUSED(clear_buttons); - #endif - - #if HAS_CHIRP - chirp(); // Buzz and wait. Is the delay needed for buttons to settle? - #if BOTH(HAS_LCD_MENU, USE_BEEPER) - for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } - #elif HAS_LCD_MENU - delay(10); - #endif - #endif -} - -//////////////////////////////////////////// -/////////////// Manual Move //////////////// -//////////////////////////////////////////// - -#if HAS_LCD_MENU - - ManualMove MarlinUI::manual_move{}; - - millis_t ManualMove::start_time = 0; - float ManualMove::menu_scale = 1; - TERN_(IS_KINEMATIC, float ManualMove::offset = 0); - TERN_(IS_KINEMATIC, bool ManualMove::processing = false); - TERN_(MULTI_MANUAL, int8_t ManualMove::e_index = 0); - uint8_t ManualMove::axis = (uint8_t)NO_AXIS; - - /** - * If a manual move has been posted and its time has arrived, and if the planner - * has a space for it, then add a linear move to current_position the planner. - * - * If any manual move needs to be interrupted, make sure to force a manual move - * by setting manual_move.start_time to millis() after updating current_position. - * - * To post a manual move: - * - Update current_position to the new place you want to go. - * - Set manual_move.axis to an axis like X_AXIS. Use ALL_AXES for diagonal moves. - * - Set manual_move.start_time to a point in the future (in ms) when the move should be done. - * - * For kinematic machines: - * - Set manual_move.offset to modify one axis and post the move. - * This is used to achieve more rapid stepping on kinematic machines. - * - * Currently used by the _lcd_move_xyz function in menu_motion.cpp - * and the ubl_map_move_to_xy funtion in menu_ubl.cpp. - */ - void ManualMove::task() { - - if (processing) return; // Prevent re-entry from idle() calls - - // Add a manual move to the queue? - if (axis != (uint8_t)NO_AXIS && ELAPSED(millis(), start_time) && !planner.is_full()) { - - const feedRate_t fr_mm_s = (uint8_t(axis) <= E_AXIS) ? manual_feedrate_mm_s[axis] : XY_PROBE_FEEDRATE_MM_S; - - #if IS_KINEMATIC - - #if HAS_MULTI_EXTRUDER - const int8_t old_extruder = active_extruder; - if (axis == E_AXIS) active_extruder = e_index; - #endif - - // Apply a linear offset to a single axis - destination = current_position; - if (axis <= XYZE) destination[axis] += offset; - - // Reset for the next move - offset = 0; - axis = (uint8_t)NO_AXIS; - - // DELTA and SCARA machines use segmented moves, which could fill the planner during the call to - // move_to_destination. This will cause idle() to be called, which can then call this function while the - // previous invocation is being blocked. Modifications to offset shouldn't be made while - // processing is true or the planner will get out of sync. - processing = true; - prepare_internal_move_to_destination(fr_mm_s); // will set current_position from destination - processing = false; - - TERN_(HAS_MULTI_EXTRUDER, active_extruder = old_extruder); - - #else - - // For Cartesian / Core motion simply move to the current_position - planner.buffer_line(current_position, fr_mm_s, axis == E_AXIS ? e_index : active_extruder); - - //SERIAL_ECHOLNPAIR("Add planner.move with Axis ", int(axis), " at FR ", fr_mm_s); - - axis = (uint8_t)NO_AXIS; - - #endif - } - } - - // - // Tell ui.update() to start a move to current_position after a short delay. - // - void ManualMove::soon(AxisEnum move_axis - #if MULTI_MANUAL - , const int8_t eindex/*=-1*/ - #endif - ) { - #if MULTI_MANUAL - if (move_axis == E_AXIS) e_index = eindex >= 0 ? eindex : active_extruder; - #endif - start_time = millis() + (menu_scale < 0.99f ? 0UL : 250UL); // delay for bigger moves - axis = (uint8_t)move_axis; - //SERIAL_ECHOLNPAIR("Post Move with Axis ", int(axis), " soon."); - } - - #if ENABLED(AUTO_BED_LEVELING_UBL) - - void MarlinUI::external_encoder() { - if (external_control && encoderDiff) { - ubl.encoder_diff += encoderDiff; // Encoder for UBL G29 mesh editing - encoderDiff = 0; // Hide encoder events from the screen handler - refresh(LCDVIEW_REDRAW_NOW); // ...but keep the refresh. - } - } - - #endif - -#endif // HAS_LCD_MENU - /** * Update the LCD, read encoder buttons, etc. * - Read button states @@ -772,7 +5119,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { * - Act on RepRap World keypad input * - Update the encoder position * - Apply acceleration to the encoder position - * - Do refresh(LCDVIEW_CALL_REDRAW_NOW) on controller events + * - Set lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NOW on controller events * - Reset the Info Screen timeout if there's any input * - Update status indicators, if any * @@ -782,7 +5129,7 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { * - Call the menu handler. Menu handlers should do the following: * - If a value changes, set lcdDrawUpdate to LCDVIEW_REDRAW_NOW and draw the value * (Encoder events automatically set lcdDrawUpdate for you.) - * - if (should_draw()) { redraw } + * - if (lcdDrawUpdate) { redraw } * - Before exiting the handler set lcdDrawUpdate to: * - LCDVIEW_CLEAR_CALL_REDRAW to clear screen and set LCDVIEW_CALL_REDRAW_NEXT. * - LCDVIEW_REDRAW_NOW to draw now (including remaining stripes). @@ -795,149 +5142,134 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { * - Clear the LCD if lcdDrawUpdate == LCDVIEW_CLEAR_CALL_REDRAW * - Update lcdDrawUpdate for the next loop (i.e., move one state down, usually) * - * This function is only called from the main thread. + * No worries. This function is only called from the main thread. */ +void lcd_update() { -LCDViewAction MarlinUI::lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; -millis_t next_lcd_update_ms; -#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS - millis_t MarlinUI::return_to_status_ms = 0; -#endif - -void MarlinUI::update() { - - static uint16_t max_display_update_time = 0; - millis_t ms = millis(); - - #if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 - #define RESET_STATUS_TIMEOUT() (return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS) - #else - #define RESET_STATUS_TIMEOUT() NOOP - #endif - - #ifdef LED_BACKLIGHT_TIMEOUT - leds.update_timeout(powersupply_on); - #endif - - #if HAS_LCD_MENU + #if ENABLED(ULTIPANEL) + static millis_t return_to_status_ms = 0; // Handle any queued Move Axis motion - manual_move.task(); + manage_manual_move(); - // Update button states for button_pressed(), etc. - // If the state changes the next update may be delayed 300-500ms. - update_buttons(); + // Update button states for LCD_CLICKED, etc. + // After state changes the next button update + // may be delayed 300-500ms. + lcd_buttons_update(); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + // Don't run the debouncer if UBL owns the display + #define UBL_CONDITION !lcd_external_control + #else + #define UBL_CONDITION true + #endif // If the action button is pressed... - static bool wait_for_unclick; // = false - - auto do_click = [&]{ - wait_for_unclick = true; // - Set debounce flag to ignore continous clicks - lcd_clicked = !wait_for_user; // - Keep the click if not waiting for a user-click - wait_for_user = false; // - Any click clears wait for user - quick_feedback(); // - Always make a click sound - }; - - #if HAS_TOUCH_XPT2046 - if (touch_buttons) { - RESET_STATUS_TIMEOUT(); - if (touch_buttons & (EN_A | EN_B)) { // Menu arrows, in priority - if (ELAPSED(ms, next_button_update_ms)) { - encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * epps * encoderDirection; - if (touch_buttons & EN_A) encoderDiff *= -1; - TERN_(AUTO_BED_LEVELING_UBL, external_encoder()); - next_button_update_ms = ms + repeat_delay; // Assume the repeat delay - if (!wait_for_unclick) { - next_button_update_ms += 250; // Longer delay on first press - wait_for_unclick = true; // Avoid Back/Select click while repeating - chirp(); - } - } - } - else if (!wait_for_unclick && (buttons & EN_C)) // OK button, if not waiting for a debounce release: - do_click(); + if (UBL_CONDITION && LCD_CLICKED) { + if (!wait_for_unclick) { // If not waiting for a debounce release: + wait_for_unclick = true; // Set debounce flag to ignore continous clicks + lcd_clicked = !wait_for_user && !no_reentry; // Keep the click if not waiting for a user-click + wait_for_user = false; // Any click clears wait for user + lcd_quick_feedback(true); // Always make a click sound } - else // keep wait_for_unclick value + } + else wait_for_unclick = false; - #endif // HAS_TOUCH_XPT2046 + #if BUTTON_EXISTS(BACK) + if (LCD_BACK_CLICKED) { + lcd_quick_feedback(true); + lcd_goto_previous_menu(); + } + #endif - { - // Integrated LCD click handling via button_pressed - if (!external_control && button_pressed()) { - if (!wait_for_unclick) do_click(); // Handle the click - } + #endif // ULTIPANEL + + #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) + + const uint8_t sd_status = (uint8_t)IS_SD_INSERTED; + if (sd_status != lcd_sd_status && lcd_detected()) { + + uint8_t old_sd_status = lcd_sd_status; // prevent re-entry to this block! + lcd_sd_status = sd_status; + + if (sd_status) { + safe_delay(500); // Some boards need a delay to get settled + card.initsd(); + if (old_sd_status == 2) + card.beginautostart(); // Initial boot else - wait_for_unclick = false; + LCD_MESSAGEPGM(MSG_SD_INSERTED); + } + else { + card.release(); + if (old_sd_status != 2) LCD_MESSAGEPGM(MSG_SD_REMOVED); } - if (LCD_BACK_CLICKED()) { - quick_feedback(); - goto_previous_screen(); + lcd_refresh(); + lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. + #if ENABLED(LCD_PROGRESS_BAR) + currentScreen == lcd_status_screen ? CHARSET_INFO : CHARSET_MENU + #endif + ); } - #endif // HAS_LCD_MENU + #endif // SDSUPPORT && SD_DETECT_PIN - if (ELAPSED(ms, next_lcd_update_ms) || TERN0(HAS_MARLINUI_U8GLIB, drawing_screen)) { + #if ENABLED(POWER_LOSS_RECOVERY) + if (job_recovery_commands_count && job_recovery_phase == JOB_RECOVERY_IDLE) { + lcd_goto_screen(lcd_job_recovery_menu); + job_recovery_phase = JOB_RECOVERY_MAYBE; // Waiting for a response + } + #endif + + const millis_t ms = millis(); + if (ELAPSED(ms, next_lcd_update_ms) + #if ENABLED(DOGLCD) + || drawing_screen + #endif + ) { next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; - #if HAS_TOUCH_XPT2046 - - if (on_status_screen()) next_lcd_update_ms += (LCD_UPDATE_INTERVAL) * 2; - - TERN_(HAS_ENCODER_ACTION, touch_buttons = touch.read_buttons()); - + #if ENABLED(LCD_HAS_STATUS_INDICATORS) + lcd_implementation_update_indicators(); #endif - TERN_(LCD_HAS_STATUS_INDICATORS, update_indicators()); + #if ENABLED(ULTIPANEL) - #if HAS_ENCODER_ACTION - - TERN_(HAS_SLOW_BUTTONS, slow_buttons = read_slow_buttons()); // Buttons that take too long to read in interrupt context - - if (TERN0(REPRAPWORLD_KEYPAD, handle_keypad())) - RESET_STATUS_TIMEOUT(); - - uint8_t abs_diff = ABS(encoderDiff); - - #if ENCODER_PULSES_PER_STEP > 1 - // When reversing the encoder direction, a movement step can be missed because - // encoderDiff has a non-zero residual value, making the controller unresponsive. - // The fix clears the residual value when the encoder is idle. - // Also check if past half the threshold to compensate for missed single steps. - static int8_t lastEncoderDiff; - - // Timeout? No decoder change since last check. 10 or 20 times per second. - if (encoderDiff == lastEncoderDiff && abs_diff <= epps / 2) // Same direction & size but not over a half-step? - encoderDiff = 0; // Clear residual pulses. - else if (WITHIN(abs_diff, epps / 2 + 1, epps - 1)) { // Past half of threshold? - abs_diff = epps; // Treat as a full step size - encoderDiff = (encoderDiff < 0 ? -1 : 1) * abs_diff; // ...in the spin direction. - } - lastEncoderDiff = encoderDiff; + #if ENABLED(LCD_HAS_SLOW_BUTTONS) + slow_buttons = lcd_implementation_read_slow_buttons(); // buttons which take too long to read in interrupt context #endif - const bool encoderPastThreshold = (abs_diff >= epps); + #if ENABLED(ADC_KEYPAD) + + if (handle_adc_keypad()) + return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS; + + #elif ENABLED(REPRAPWORLD_KEYPAD) + + handle_reprapworld_keypad(); + + #endif + + const bool encoderPastThreshold = (ABS(encoderDiff) >= ENCODER_PULSES_PER_STEP); if (encoderPastThreshold || lcd_clicked) { - if (encoderPastThreshold && TERN1(IS_TFTGLCD_PANEL, !external_control)) { + if (encoderPastThreshold) { + int32_t encoderMultiplier = 1; - #if BOTH(HAS_LCD_MENU, ENCODER_RATE_MULTIPLIER) - - int32_t encoderMultiplier = 1; + #if ENABLED(ENCODER_RATE_MULTIPLIER) if (encoderRateMultiplierEnabled) { - const float encoderMovementSteps = float(abs_diff) / epps; + int32_t encoderMovementSteps = ABS(encoderDiff) / ENCODER_PULSES_PER_STEP; if (lastEncoderMovementMillis) { // Note that the rate is always calculated between two passes through the // loop and that the abs of the encoderDiff value is tracked. - const float encoderStepRate = encoderMovementSteps / float(ms - lastEncoderMovementMillis) * 1000; + float encoderStepRate = float(encoderMovementSteps) / float(ms - lastEncoderMovementMillis) * 1000; if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100; else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; - // Enable to output the encoder steps per second value - //#define ENCODER_RATE_MULTIPLIER_DEBUG #if ENABLED(ENCODER_RATE_MULTIPLIER_DEBUG) SERIAL_ECHO_START(); SERIAL_ECHOPAIR("Enc Step Rate: ", encoderStepRate); @@ -945,134 +5277,143 @@ void MarlinUI::update() { SERIAL_ECHOPAIR(" ENCODER_10X_STEPS_PER_SEC: ", ENCODER_10X_STEPS_PER_SEC); SERIAL_ECHOPAIR(" ENCODER_100X_STEPS_PER_SEC: ", ENCODER_100X_STEPS_PER_SEC); SERIAL_EOL(); - #endif + #endif // ENCODER_RATE_MULTIPLIER_DEBUG } lastEncoderMovementMillis = ms; } // encoderRateMultiplierEnabled - - #else - - constexpr int32_t encoderMultiplier = 1; - #endif // ENCODER_RATE_MULTIPLIER - encoderPosition += (encoderDiff * encoderMultiplier) / epps; + encoderPosition += (encoderDiff * encoderMultiplier) / ENCODER_PULSES_PER_STEP; encoderDiff = 0; } - - RESET_STATUS_TIMEOUT(); - - refresh(LCDVIEW_REDRAW_NOW); - - #ifdef LED_BACKLIGHT_TIMEOUT - leds.reset_timeout(ms); - #endif + return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS; + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; } + #endif // ULTIPANEL - #endif - - // This runs every ~100ms when idling often enough. - // Instead of tracking changes just redraw the Status Screen once per second. - if (on_status_screen() && !lcd_status_update_delay--) { - lcd_status_update_delay = TERN(HAS_MARLINUI_U8GLIB, 12, 9); - if (max_display_update_time) max_display_update_time--; // Be sure never go to a very big number - refresh(LCDVIEW_REDRAW_NOW); + // We arrive here every ~100ms when idling often enough. + // Instead of tracking the changes simply redraw the Info Screen ~1 time a second. + if ( + #if ENABLED(ULTIPANEL) + currentScreen == lcd_status_screen && + #endif + !lcd_status_update_delay-- + ) { + lcd_status_update_delay = 9 + #if ENABLED(DOGLCD) + + 3 + #endif + ; + max_display_update_time--; + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; } - #if BOTH(HAS_LCD_MENU, SCROLL_LONG_FILENAMES) + #if ENABLED(ULTIPANEL) && ENABLED(SCROLL_LONG_FILENAMES) // If scrolling of long file names is enabled and we are in the sd card menu, // cause a refresh to occur until all the text has scrolled into view. - if (currentScreen == menu_media && !lcd_status_update_delay--) { - lcd_status_update_delay = 4; - if (++filename_scroll_pos > filename_scroll_max) { - filename_scroll_pos = 0; - lcd_status_update_delay = 12; - } - refresh(LCDVIEW_REDRAW_NOW); - RESET_STATUS_TIMEOUT(); + if (currentScreen == lcd_sdcard_menu && filename_scroll_pos < filename_scroll_max && !lcd_status_update_delay--) { + lcd_status_update_delay = 6; + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; + filename_scroll_pos++; + return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS; } #endif - // Then we want to use only 50% of the time - const uint16_t bbr2 = planner.block_buffer_runtime() >> 1; + // then we want to use 1/2 of the time only. + uint16_t bbr2 = planner.block_buffer_runtime() >> 1; - if ((should_draw() || drawing_screen) && (!bbr2 || bbr2 > max_display_update_time)) { + #if ENABLED(DOGLCD) + #define IS_DRAWING drawing_screen + #else + #define IS_DRAWING false + #endif + + if ((lcdDrawUpdate || IS_DRAWING) && (!bbr2 || bbr2 > max_display_update_time)) { // Change state of drawing flag between screen updates - if (!drawing_screen) switch (lcdDrawUpdate) { + if (!IS_DRAWING) switch (lcdDrawUpdate) { case LCDVIEW_CALL_NO_REDRAW: - refresh(LCDVIEW_NONE); + lcdDrawUpdate = LCDVIEW_NONE; break; case LCDVIEW_CLEAR_CALL_REDRAW: case LCDVIEW_CALL_REDRAW_NEXT: - refresh(LCDVIEW_REDRAW_NOW); + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; case LCDVIEW_REDRAW_NOW: // set above, or by a handler through LCDVIEW_CALL_REDRAW_NEXT case LCDVIEW_NONE: break; } // switch - TERN_(HAS_ADC_BUTTONS, keypad_buttons = 0); + #if ENABLED(ADC_KEYPAD) + buttons_reprapworld_keypad = 0; + #endif - #if HAS_MARLINUI_U8GLIB + #if ENABLED(ULTIPANEL) + #define CURRENTSCREEN() (*currentScreen)() + #else + #define CURRENTSCREEN() lcd_status_screen() + #endif + #if ENABLED(DOGLCD) #if ENABLED(LIGHTWEIGHT_UI) - const bool in_status = on_status_screen(), - do_u8g_loop = !in_status; + #if ENABLED(ULTIPANEL) + const bool in_status = currentScreen == lcd_status_screen; + #else + constexpr bool in_status = true; + #endif + const bool do_u8g_loop = !in_status; lcd_in_status(in_status); - if (in_status) status_screen(); + if (in_status) lcd_status_screen(); #else constexpr bool do_u8g_loop = true; #endif - if (do_u8g_loop) { - if (!drawing_screen) { // If not already drawing pages - u8g.firstPage(); // Start the first page - drawing_screen = first_page = true; // Flag as drawing pages + if (!drawing_screen) { // If not already drawing pages + u8g.firstPage(); // Start the first page + drawing_screen = first_page = true; // Flag as drawing pages } - set_font(FONT_MENU); // Setup font for every page draw - u8g.setColorIndex(1); // And reset the color - run_current_screen(); // Draw and process the current screen + lcd_setFont(FONT_MENU); // Setup font for every page draw + u8g.setColorIndex(1); // And reset the color + CURRENTSCREEN(); // Draw and process the current screen first_page = false; // The screen handler can clear drawing_screen for an action that changes the screen. // If still drawing and there's another page, update max-time and return now. // The nextPage will already be set up on the next call. if (drawing_screen && (drawing_screen = u8g.nextPage())) { - if (on_status_screen()) - NOLESS(max_display_update_time, millis() - ms); + NOLESS(max_display_update_time, millis() - ms); return; } } - #else - - run_current_screen(); - + CURRENTSCREEN(); #endif - TERN_(HAS_LCD_MENU, lcd_clicked = false); + #if ENABLED(ULTIPANEL) + lcd_clicked = false; + #endif // Keeping track of the longest time for an individual LCD update. // Used to do screen throttling when the planner starts to fill up. - if (on_status_screen()) - NOLESS(max_display_update_time, millis() - ms); + NOLESS(max_display_update_time, millis() - ms); } - #if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 + #if ENABLED(ULTIPANEL) + // Return to Status Screen after a timeout - if (on_status_screen() || defer_return_to_status) - RESET_STATUS_TIMEOUT(); + if (currentScreen == lcd_status_screen || defer_return_to_status) + return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS; else if (ELAPSED(ms, return_to_status_ms)) - return_to_status(); - #endif + lcd_return_to_status(); + + #endif // ULTIPANEL // Change state of drawing flag between screen updates - if (!drawing_screen) switch (lcdDrawUpdate) { + if (!IS_DRAWING) switch (lcdDrawUpdate) { case LCDVIEW_CLEAR_CALL_REDRAW: - clear_lcd(); break; + lcd_implementation_clear(); break; case LCDVIEW_REDRAW_NOW: - refresh(LCDVIEW_NONE); + lcdDrawUpdate = LCDVIEW_NONE; case LCDVIEW_NONE: case LCDVIEW_CALL_REDRAW_NEXT: case LCDVIEW_CALL_NO_REDRAW: @@ -1080,68 +5421,333 @@ void MarlinUI::update() { } // switch } // ELAPSED(ms, next_lcd_update_ms) - - TERN_(HAS_GRAPHICAL_TFT, tft_idle()); } -#if HAS_ADC_BUTTONS +void lcd_finishstatus(const bool persist=false) { + + #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE > 0)) + UNUSED(persist); + #endif + + #if ENABLED(LCD_PROGRESS_BAR) + progress_bar_ms = millis(); + #if PROGRESS_MSG_EXPIRE > 0 + expire_status_ms = persist ? 0 : progress_bar_ms + PROGRESS_MSG_EXPIRE; + #endif + #endif + lcd_refresh(); + + #if ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) + previous_lcd_status_ms = millis(); //get status message to show up for a while + #endif + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + status_scroll_offset = 0; + #endif +} + +#if ENABLED(LCD_PROGRESS_BAR) && PROGRESS_MSG_EXPIRE > 0 + void dontExpireStatus() { expire_status_ms = 0; } +#endif + +bool lcd_hasstatus() { return (lcd_status_message[0] != '\0'); } + +void lcd_setstatus(const char * const message, const bool persist) { + if (lcd_status_message_level > 0) return; + + // Here we have a problem. The message is encoded in UTF8, so + // arbitrarily cutting it will be a problem. We MUST be sure + // that there is no cutting in the middle of a multibyte character! + + // Get a pointer to the null terminator + const char* pend = message + strlen(message); + + // If length of supplied UTF8 string is greater than + // our buffer size, start cutting whole UTF8 chars + while ((pend - message) > MAX_MESSAGE_LENGTH) { + --pend; + while (!START_OF_UTF8_CHAR(*pend)) --pend; + }; + + // At this point, we have the proper cut point. Use it + uint8_t maxLen = pend - message; + strncpy(lcd_status_message, message, maxLen); + lcd_status_message[maxLen] = '\0'; + + lcd_finishstatus(persist); +} + +void lcd_setstatusPGM(const char * const message, int8_t level) { + if (level < 0) level = lcd_status_message_level = 0; + if (level < lcd_status_message_level) return; + lcd_status_message_level = level; + + // Here we have a problem. The message is encoded in UTF8, so + // arbitrarily cutting it will be a problem. We MUST be sure + // that there is no cutting in the middle of a multibyte character! + + // Get a pointer to the null terminator + const char* pend = message + strlen_P(message); + + // If length of supplied UTF8 string is greater than + // our buffer size, start cutting whole UTF8 chars + while ((pend - message) > MAX_MESSAGE_LENGTH) { + --pend; + while (!START_OF_UTF8_CHAR(pgm_read_byte(pend))) --pend; + }; + + // At this point, we have the proper cut point. Use it + uint8_t maxLen = pend - message; + strncpy_P(lcd_status_message, message, maxLen); + lcd_status_message[maxLen] = '\0'; + + lcd_finishstatus(level > 0); +} + +void lcd_status_printf_P(const uint8_t level, const char * const fmt, ...) { + if (level < lcd_status_message_level) return; + lcd_status_message_level = level; + va_list args; + va_start(args, fmt); + vsnprintf_P(lcd_status_message, MAX_MESSAGE_LENGTH, fmt, args); + va_end(args); + lcd_finishstatus(level > 0); +} + +void lcd_setalertstatusPGM(const char * const message) { + lcd_setstatusPGM(message, 1); + #if ENABLED(ULTIPANEL) + lcd_return_to_status(); + #endif +} + +void lcd_reset_alert_level() { lcd_status_message_level = 0; } + +#if HAS_LCD_CONTRAST + + void set_lcd_contrast(const int16_t value) { + lcd_contrast = constrain(value, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX); + u8g.setContrast(lcd_contrast); + } + +#endif + +#if ENABLED(ULTIPANEL) + + /** + * Setup Rotary Encoder Bit Values (for two pin encoders to indicate movement) + * These values are independent of which pins are used for EN_A and EN_B indications + * The rotary encoder part is also independent to the chipset used for the LCD + */ + #if defined(EN_A) && defined(EN_B) + #define encrot0 0 + #define encrot1 2 + #define encrot2 3 + #define encrot3 1 + #endif + + #define GET_SHIFT_BUTTON_STATES(DST) \ + uint8_t new_##DST = 0; \ + WRITE(SHIFT_LD, LOW); \ + WRITE(SHIFT_LD, HIGH); \ + for (int8_t i = 0; i < 8; i++) { \ + new_##DST >>= 1; \ + if (READ(SHIFT_OUT)) SBI(new_##DST, 7); \ + WRITE(SHIFT_CLK, HIGH); \ + WRITE(SHIFT_CLK, LOW); \ + } \ + DST = ~new_##DST; //invert it, because a pressed switch produces a logical 0 + + + /** + * Read encoder buttons from the hardware registers + * Warning: This function is called from interrupt context! + */ + void lcd_buttons_update() { + static uint8_t lastEncoderBits; + const millis_t now = millis(); + if (ELAPSED(now, next_button_update_ms)) { + + #if ENABLED(NEWPANEL) + uint8_t newbutton = 0; + + #if BUTTON_EXISTS(EN1) + if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; + #endif + #if BUTTON_EXISTS(EN2) + if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; + #endif + #if BUTTON_EXISTS(ENC) + if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; + #endif + #if BUTTON_EXISTS(BACK) + if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; + #endif + + // + // Directional buttons + // + #if LCD_HAS_DIRECTIONAL_BUTTONS + + #if ENABLED(REVERSE_MENU_DIRECTION) + #define _ENCODER_UD_STEPS (ENCODER_STEPS_PER_MENU_ITEM * encoderDirection) + #else + #define _ENCODER_UD_STEPS ENCODER_STEPS_PER_MENU_ITEM + #endif + #if ENABLED(REVERSE_ENCODER_DIRECTION) + #define ENCODER_UD_STEPS _ENCODER_UD_STEPS + #define ENCODER_LR_PULSES ENCODER_PULSES_PER_STEP + #else + #define ENCODER_UD_STEPS -(_ENCODER_UD_STEPS) + #define ENCODER_LR_PULSES -(ENCODER_PULSES_PER_STEP) + #endif + + if (false) { + // for the else-ifs below + } + #if BUTTON_EXISTS(UP) + else if (BUTTON_PRESSED(UP)) { + encoderDiff = -(ENCODER_UD_STEPS); + next_button_update_ms = now + 300; + } + #endif + #if BUTTON_EXISTS(DWN) + else if (BUTTON_PRESSED(DWN)) { + encoderDiff = ENCODER_UD_STEPS; + next_button_update_ms = now + 300; + } + #endif + #if BUTTON_EXISTS(LFT) + else if (BUTTON_PRESSED(LFT)) { + encoderDiff = -(ENCODER_LR_PULSES); + next_button_update_ms = now + 300; + } + #endif + #if BUTTON_EXISTS(RT) + else if (BUTTON_PRESSED(RT)) { + encoderDiff = ENCODER_LR_PULSES; + next_button_update_ms = now + 300; + } + #endif + + #endif // LCD_HAS_DIRECTIONAL_BUTTONS + + buttons = newbutton; + #if ENABLED(LCD_HAS_SLOW_BUTTONS) + buttons |= slow_buttons; + #endif + + #if ENABLED(ADC_KEYPAD) + + uint8_t newbutton_reprapworld_keypad = 0; + buttons = 0; + if (buttons_reprapworld_keypad == 0) { + newbutton_reprapworld_keypad = get_ADC_keyValue(); + if (WITHIN(newbutton_reprapworld_keypad, 1, 8)) + buttons_reprapworld_keypad = _BV(newbutton_reprapworld_keypad - 1); + } + + #elif ENABLED(REPRAPWORLD_KEYPAD) + + GET_SHIFT_BUTTON_STATES(buttons_reprapworld_keypad); + + #endif + + #else // !NEWPANEL + + GET_SHIFT_BUTTON_STATES(buttons); + + #endif + + } // next_button_update_ms + + // Manage encoder rotation + #if ENABLED(REVERSE_MENU_DIRECTION) && ENABLED(REVERSE_ENCODER_DIRECTION) + #define ENCODER_DIFF_CW (encoderDiff -= encoderDirection) + #define ENCODER_DIFF_CCW (encoderDiff += encoderDirection) + #elif ENABLED(REVERSE_MENU_DIRECTION) + #define ENCODER_DIFF_CW (encoderDiff += encoderDirection) + #define ENCODER_DIFF_CCW (encoderDiff -= encoderDirection) + #elif ENABLED(REVERSE_ENCODER_DIRECTION) + #define ENCODER_DIFF_CW (encoderDiff--) + #define ENCODER_DIFF_CCW (encoderDiff++) + #else + #define ENCODER_DIFF_CW (encoderDiff++) + #define ENCODER_DIFF_CCW (encoderDiff--) + #endif + #define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: ENCODER_DIFF_CW; break; case _E2: ENCODER_DIFF_CCW; } + + uint8_t enc = 0; + if (buttons & EN_A) enc |= B01; + if (buttons & EN_B) enc |= B10; + if (enc != lastEncoderBits) { + switch (enc) { + case encrot0: ENCODER_SPIN(encrot3, encrot1); break; + case encrot1: ENCODER_SPIN(encrot0, encrot2); break; + case encrot2: ENCODER_SPIN(encrot1, encrot3); break; + case encrot3: ENCODER_SPIN(encrot2, encrot0); break; + } + #if ENABLED(AUTO_BED_LEVELING_UBL) + if (lcd_external_control) { + ubl.encoder_diff = encoderDiff; // Make encoder rotation available to UBL G29 mesh editing. + encoderDiff = 0; // Hide the encoder event from the current screen handler. + } + #endif + lastEncoderBits = enc; + } + } + + #if (ENABLED(LCD_I2C_TYPE_MCP23017) || ENABLED(LCD_I2C_TYPE_MCP23008)) && ENABLED(DETECT_DEVICE) + bool lcd_detected() { return lcd.LcdDetected() == 1; } + #else + bool lcd_detected() { return true; } + #endif + + #if ENABLED(G26_MESH_VALIDATION) + void lcd_chirp() { + lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ); + } + #endif + + #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION) + bool is_lcd_clicked() { return LCD_CLICKED; } + void wait_for_release() { + while (is_lcd_clicked()) safe_delay(50); + safe_delay(50); + } + #endif + +#endif // ULTIPANEL + +#if ENABLED(ADC_KEYPAD) typedef struct { uint16_t ADCKeyValueMin, ADCKeyValueMax; uint8_t ADCKeyNo; } _stADCKeypadTable_; - #ifndef ADC_BUTTONS_VALUE_SCALE - #define ADC_BUTTONS_VALUE_SCALE 1.0 // for the power voltage equal to the reference voltage - #endif - #ifndef ADC_BUTTONS_R_PULLUP - #define ADC_BUTTONS_R_PULLUP 4.7 // common pull-up resistor in the voltage divider - #endif - #ifndef ADC_BUTTONS_LEFT_R_PULLDOWN - #define ADC_BUTTONS_LEFT_R_PULLDOWN 0.47 // pull-down resistor for LEFT button voltage divider - #endif - #ifndef ADC_BUTTONS_RIGHT_R_PULLDOWN - #define ADC_BUTTONS_RIGHT_R_PULLDOWN 4.7 // pull-down resistor for RIGHT button voltage divider - #endif - #ifndef ADC_BUTTONS_UP_R_PULLDOWN - #define ADC_BUTTONS_UP_R_PULLDOWN 1.0 // pull-down resistor for UP button voltage divider - #endif - #ifndef ADC_BUTTONS_DOWN_R_PULLDOWN - #define ADC_BUTTONS_DOWN_R_PULLDOWN 10.0 // pull-down resistor for DOWN button voltage divider - #endif - #ifndef ADC_BUTTONS_MIDDLE_R_PULLDOWN - #define ADC_BUTTONS_MIDDLE_R_PULLDOWN 2.2 // pull-down resistor for MIDDLE button voltage divider - #endif - - // Calculate the ADC value for the voltage divider with specified pull-down resistor value - #define ADC_BUTTON_VALUE(r) int(HAL_ADC_RANGE * (ADC_BUTTONS_VALUE_SCALE) * r / (r + ADC_BUTTONS_R_PULLUP)) - - static constexpr uint16_t adc_button_tolerance = HAL_ADC_RANGE * 25 / 1024, - adc_other_button = HAL_ADC_RANGE * 1000 / 1024; static const _stADCKeypadTable_ stADCKeyTable[] PROGMEM = { // VALUE_MIN, VALUE_MAX, KEY - { adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F1 }, // F1 - { adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F2 }, // F2 - { adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F3 }, // F3 - { ADC_BUTTON_VALUE(ADC_BUTTONS_LEFT_R_PULLDOWN) - adc_button_tolerance, - ADC_BUTTON_VALUE(ADC_BUTTONS_LEFT_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_LEFT }, // LEFT ( 272 ... 472) - { ADC_BUTTON_VALUE(ADC_BUTTONS_RIGHT_R_PULLDOWN) - adc_button_tolerance, - ADC_BUTTON_VALUE(ADC_BUTTONS_RIGHT_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_RIGHT }, // RIGHT (1948 ... 2148) - { ADC_BUTTON_VALUE(ADC_BUTTONS_UP_R_PULLDOWN) - adc_button_tolerance, - ADC_BUTTON_VALUE(ADC_BUTTONS_UP_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_UP }, // UP ( 618 ... 818) - { ADC_BUTTON_VALUE(ADC_BUTTONS_DOWN_R_PULLDOWN) - adc_button_tolerance, - ADC_BUTTON_VALUE(ADC_BUTTONS_DOWN_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_DOWN }, // DOWN (2686 ... 2886) - { ADC_BUTTON_VALUE(ADC_BUTTONS_MIDDLE_R_PULLDOWN) - adc_button_tolerance, - ADC_BUTTON_VALUE(ADC_BUTTONS_MIDDLE_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_MIDDLE }, // ENTER (1205 ... 1405) + { 4000, 4096, BLEN_REPRAPWORLD_KEYPAD_F1 + 1 }, // F1 + { 4000, 4096, BLEN_REPRAPWORLD_KEYPAD_F2 + 1 }, // F2 + { 4000, 4096, BLEN_REPRAPWORLD_KEYPAD_F3 + 1 }, // F3 + { 300, 500, BLEN_REPRAPWORLD_KEYPAD_LEFT + 1 }, // LEFT + { 1900, 2200, BLEN_REPRAPWORLD_KEYPAD_RIGHT + 1 }, // RIGHT + { 570, 870, BLEN_REPRAPWORLD_KEYPAD_UP + 1 }, // UP + { 2670, 2870, BLEN_REPRAPWORLD_KEYPAD_DOWN + 1 }, // DOWN + { 1150, 1450, BLEN_REPRAPWORLD_KEYPAD_MIDDLE + 1 }, // ENTER }; - uint8_t get_ADC_keyValue() { + uint8_t get_ADC_keyValue(void) { if (thermalManager.ADCKey_count >= 16) { - const uint16_t currentkpADCValue = thermalManager.current_ADCKey_raw; - thermalManager.current_ADCKey_raw = HAL_ADC_RANGE; + const uint16_t currentkpADCValue = thermalManager.current_ADCKey_raw >> 2; + #if ENABLED(ADC_KEYPAD_DEBUG) + SERIAL_PROTOCOLLN(currentkpADCValue); + #endif + thermalManager.current_ADCKey_raw = 0; thermalManager.ADCKey_count = 0; - if (currentkpADCValue < adc_other_button) - LOOP_L_N(i, ADC_KEY_NUM) { + if (currentkpADCValue < 4000) + for (uint8_t i = 0; i < ADC_KEY_NUM; i++) { const uint16_t lo = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMin), hi = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMax); if (WITHIN(currentkpADCValue, lo, hi)) return pgm_read_byte(&stADCKeyTable[i].ADCKeyNo); @@ -1149,544 +5755,6 @@ void MarlinUI::update() { } return 0; } - -#endif // HAS_ADC_BUTTONS - -#if HAS_ENCODER_ACTION - - /** - * Read encoder buttons from the hardware registers - * Warning: This function is called from interrupt context! - */ - void MarlinUI::update_buttons() { - const millis_t now = millis(); - if (ELAPSED(now, next_button_update_ms)) { - - #if HAS_DIGITAL_BUTTONS - - #if ANY_BUTTON(EN1, EN2, ENC, BACK) - - uint8_t newbutton = 0; - - #if BUTTON_EXISTS(EN1) - if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; - #endif - #if BUTTON_EXISTS(EN2) - if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; - #endif - #if BUTTON_EXISTS(ENC) - if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; - #endif - #if BUTTON_EXISTS(BACK) - if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; - #endif - - #else - - constexpr uint8_t newbutton = 0; - - #endif - - // - // Directional buttons - // - #if ANY_BUTTON(UP, DWN, LFT, RT) - - const int8_t pulses = epps * encoderDirection; - - if (false) { - // for the else-ifs below - } - #if BUTTON_EXISTS(UP) - else if (BUTTON_PRESSED(UP)) { - encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses; - next_button_update_ms = now + 300; - } - #endif - #if BUTTON_EXISTS(DWN) - else if (BUTTON_PRESSED(DWN)) { - encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses; - next_button_update_ms = now + 300; - } - #endif - #if BUTTON_EXISTS(LFT) - else if (BUTTON_PRESSED(LFT)) { - encoderDiff = -pulses; - next_button_update_ms = now + 300; - } - #endif - #if BUTTON_EXISTS(RT) - else if (BUTTON_PRESSED(RT)) { - encoderDiff = pulses; - next_button_update_ms = now + 300; - } - #endif - - #endif // UP || DWN || LFT || RT - - buttons = (newbutton - #if HAS_SLOW_BUTTONS - | slow_buttons - #endif - #if BOTH(HAS_TOUCH_XPT2046, HAS_ENCODER_ACTION) - | (touch_buttons & TERN(HAS_ENCODER_WHEEL, ~(EN_A | EN_B), 0xFF)) - #endif - ); - - #elif HAS_ADC_BUTTONS - - buttons = 0; - - #endif - - #if HAS_ADC_BUTTONS - if (keypad_buttons == 0) { - const uint8_t b = get_ADC_keyValue(); - if (WITHIN(b, 1, 8)) keypad_buttons = _BV(b - 1); - } - #endif - - #if HAS_SHIFT_ENCODER - /** - * Set up Rotary Encoder bit values (for two pin encoders to indicate movement). - * These values are independent of which pins are used for EN_A / EN_B indications. - * The rotary encoder part is also independent of the LCD chipset. - */ - uint8_t val = 0; - WRITE(SHIFT_LD, LOW); - WRITE(SHIFT_LD, HIGH); - LOOP_L_N(i, 8) { - val >>= 1; - if (READ(SHIFT_OUT)) SBI(val, 7); - WRITE(SHIFT_CLK, HIGH); - WRITE(SHIFT_CLK, LOW); - } - TERN(REPRAPWORLD_KEYPAD, keypad_buttons, buttons) = ~val; - #endif - - #if IS_TFTGLCD_PANEL - next_button_update_ms = now + (LCD_UPDATE_INTERVAL / 2); - buttons = slow_buttons; - TERN_(AUTO_BED_LEVELING_UBL, external_encoder()); - #endif - - } // next_button_update_ms - - #if HAS_ENCODER_WHEEL - static uint8_t lastEncoderBits; - - #define encrot0 0 - #define encrot1 2 - #define encrot2 3 - #define encrot3 1 - - // Manage encoder rotation - #define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: encoderDiff += encoderDirection; break; case _E2: encoderDiff -= encoderDirection; } - - uint8_t enc = 0; - if (buttons & EN_A) enc |= B01; - if (buttons & EN_B) enc |= B10; - if (enc != lastEncoderBits) { - switch (enc) { - case encrot0: ENCODER_SPIN(encrot3, encrot1); break; - case encrot1: ENCODER_SPIN(encrot0, encrot2); break; - case encrot2: ENCODER_SPIN(encrot1, encrot3); break; - case encrot3: ENCODER_SPIN(encrot2, encrot0); break; - } - #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) - external_encoder(); - #endif - lastEncoderBits = enc; - } - - #endif // HAS_ENCODER_WHEEL - } - -#endif // HAS_ENCODER_ACTION - -#endif // HAS_WIRED_LCD - -#if HAS_DISPLAY - - #if ENABLED(EXTENSIBLE_UI) - #include "extui/ui_api.h" - #endif - - //////////////////////////////////////////// - /////////////// Status Line //////////////// - //////////////////////////////////////////// - - #if ENABLED(STATUS_MESSAGE_SCROLLING) - void MarlinUI::advance_status_scroll() { - // Advance by one UTF8 code-word - if (status_scroll_offset < utf8_strlen(status_message)) - while (!START_OF_UTF8_CHAR(status_message[++status_scroll_offset])); - else - status_scroll_offset = 0; - } - char* MarlinUI::status_and_len(uint8_t &len) { - char *out = status_message + status_scroll_offset; - len = utf8_strlen(out); - return out; - } - #endif - - void MarlinUI::finish_status(const bool persist) { - - #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE) > 0) - UNUSED(persist); - #endif - - #if ENABLED(LCD_PROGRESS_BAR) || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - const millis_t ms = millis(); - #endif - - #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL - progress_bar_ms = ms; - #if PROGRESS_MSG_EXPIRE > 0 - expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE; - #endif - #endif - - #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - next_filament_display = ms + 5000UL; // Show status message for 5s - #endif - - #if BOTH(HAS_WIRED_LCD, STATUS_MESSAGE_SCROLLING) - status_scroll_offset = 0; - #endif - - TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); - } - - bool MarlinUI::has_status() { return (status_message[0] != '\0'); } - - void MarlinUI::set_status(const char * const message, const bool persist) { - if (alert_level) return; - - TERN_(HOST_PROMPT_SUPPORT, host_action_notify(message)); - - // Here we have a problem. The message is encoded in UTF8, so - // arbitrarily cutting it will be a problem. We MUST be sure - // that there is no cutting in the middle of a multibyte character! - - // Get a pointer to the null terminator - const char* pend = message + strlen(message); - - // If length of supplied UTF8 string is greater than - // our buffer size, start cutting whole UTF8 chars - while ((pend - message) > MAX_MESSAGE_LENGTH) { - --pend; - while (!START_OF_UTF8_CHAR(*pend)) --pend; - }; - - // At this point, we have the proper cut point. Use it - uint8_t maxLen = pend - message; - strncpy(status_message, message, maxLen); - status_message[maxLen] = '\0'; - - finish_status(persist); - } - - #include - - void MarlinUI::status_printf_P(const uint8_t level, PGM_P const fmt, ...) { - if (level < alert_level) return; - alert_level = level; - va_list args; - va_start(args, fmt); - vsnprintf_P(status_message, MAX_MESSAGE_LENGTH, fmt, args); - va_end(args); - finish_status(level > 0); - } - - void MarlinUI::set_status_P(PGM_P const message, int8_t level) { - if (level < 0) level = alert_level = 0; - if (level < alert_level) return; - alert_level = level; - - TERN_(HOST_PROMPT_SUPPORT, host_action_notify_P(message)); - - // Since the message is encoded in UTF8 it must - // only be cut on a character boundary. - - // Get a pointer to the null terminator - PGM_P pend = message + strlen_P(message); - - // If length of supplied UTF8 string is greater than - // the buffer size, start cutting whole UTF8 chars - while ((pend - message) > MAX_MESSAGE_LENGTH) { - --pend; - while (!START_OF_UTF8_CHAR(pgm_read_byte(pend))) --pend; - }; - - // At this point, we have the proper cut point. Use it - uint8_t maxLen = pend - message; - strncpy_P(status_message, message, maxLen); - status_message[maxLen] = '\0'; - - finish_status(level > 0); - } - - void MarlinUI::set_alert_status_P(PGM_P const message) { - set_status_P(message, 1); - TERN_(HAS_LCD_MENU, return_to_status()); - } - - PGM_P print_paused = GET_TEXT(MSG_PRINT_PAUSED); - - /** - * Reset the status message - */ - void MarlinUI::reset_status(const bool no_welcome) { - PGM_P printing = GET_TEXT(MSG_PRINTING); - PGM_P welcome = GET_TEXT(WELCOME_MSG); - #if SERVICE_INTERVAL_1 > 0 - static PGMSTR(service1, "> " SERVICE_NAME_1 "!"); - #endif - #if SERVICE_INTERVAL_2 > 0 - static PGMSTR(service2, "> " SERVICE_NAME_2 "!"); - #endif - #if SERVICE_INTERVAL_3 > 0 - static PGMSTR(service3, "> " SERVICE_NAME_3 "!"); - #endif - PGM_P msg; - if (printingIsPaused()) - msg = print_paused; - #if ENABLED(SDSUPPORT) - else if (IS_SD_PRINTING()) - return set_status(card.longest_filename(), true); - #endif - else if (print_job_timer.isRunning()) - msg = printing; - - #if SERVICE_INTERVAL_1 > 0 - else if (print_job_timer.needsService(1)) msg = service1; - #endif - #if SERVICE_INTERVAL_2 > 0 - else if (print_job_timer.needsService(2)) msg = service2; - #endif - #if SERVICE_INTERVAL_3 > 0 - else if (print_job_timer.needsService(3)) msg = service3; - #endif - - else if (!no_welcome) - msg = welcome; - else - return; - - set_status_P(msg, -1); - } - - #if ENABLED(SDSUPPORT) - extern bool wait_for_user, wait_for_heatup; - #endif - - void MarlinUI::abort_print() { - #if ENABLED(SDSUPPORT) - wait_for_heatup = wait_for_user = false; - card.flag.abort_sd_printing = true; - #endif - #ifdef ACTION_ON_CANCEL - host_action_cancel(); - #endif - TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("UI Aborted"), DISMISS_STR)); - print_job_timer.stop(); - set_status_P(GET_TEXT(MSG_PRINT_ABORTED)); - TERN_(HAS_LCD_MENU, return_to_status()); - } - - #if ANY(PARK_HEAD_ON_PAUSE, SDSUPPORT) - #include "../gcode/queue.h" - #endif - - void MarlinUI::pause_print() { - #if HAS_LCD_MENU - synchronize(GET_TEXT(MSG_PAUSING)); - defer_status_screen(); - #endif - - TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("UI Pause"), PSTR("Resume"))); - - set_status_P(print_paused); - - #if ENABLED(PARK_HEAD_ON_PAUSE) - TERN_(HAS_WIRED_LCD, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); // Show message immediately to let user know about pause in progress - queue.inject_P(PSTR("M25 P\nM24")); - #elif ENABLED(SDSUPPORT) - queue.inject_P(PSTR("M25")); - #elif defined(ACTION_ON_PAUSE) - host_action_pause(); - #endif - } - - void MarlinUI::resume_print() { - reset_status(); - TERN_(PARK_HEAD_ON_PAUSE, wait_for_heatup = wait_for_user = false); - if (IS_SD_PAUSED()) queue.inject_P(M24_STR); - #ifdef ACTION_ON_RESUME - host_action_resume(); - #endif - print_job_timer.start(); // Also called by M24 - } - - #if HAS_PRINT_PROGRESS - - MarlinUI::progress_t MarlinUI::_get_progress() { - return ( - TERN0(LCD_SET_PROGRESS_MANUALLY, (progress_override & PROGRESS_MASK)) - #if ENABLED(SDSUPPORT) - ?: TERN(HAS_PRINT_PROGRESS_PERMYRIAD, card.permyriadDone(), card.percentDone()) - #endif - ); - } - - #endif - - #if HAS_TOUCH_XPT2046 - - // - // Screen Click - // - On menu screens move directly to the touched item - // - On menu screens, right side (last 3 cols) acts like a scroll - half up => prev page, half down = next page - // - On select screens (and others) touch the Right Half for +, Left Half for - - // - On edit screens, touch Up Half for -, Bottom Half to + - // - void MarlinUI::screen_click(const uint8_t row, const uint8_t col, const uint8_t, const uint8_t) { - const millis_t now = millis(); - if (PENDING(now, next_button_update_ms)) return; - next_button_update_ms = now + repeat_delay; // Assume the repeat delay - const int8_t xdir = col < (LCD_WIDTH ) / 2 ? -1 : 1, - ydir = row < (LCD_HEIGHT) / 2 ? -1 : 1; - if (on_edit_screen) - encoderDiff = epps * ydir; - else if (screen_items > 0) { - // Last 5 cols act as a scroll :-) - if (col > (LCD_WIDTH) - 5) - // 2 * LCD_HEIGHT to scroll to bottom of next page. (LCD_HEIGHT would only go 1 item down.) - encoderDiff = epps * (encoderLine - encoderTopLine + 2 * (LCD_HEIGHT)) * ydir; - else - encoderDiff = epps * (row - encoderPosition + encoderTopLine); - } - else if (!on_status_screen()) - encoderDiff = epps * xdir; - } - - #endif - -#else // !HAS_DISPLAY - - // - // Send the status line as a host notification - // - void MarlinUI::set_status(const char * const message, const bool) { - TERN(HOST_PROMPT_SUPPORT, host_action_notify(message), UNUSED(message)); - } - void MarlinUI::set_status_P(PGM_P message, const int8_t) { - TERN(HOST_PROMPT_SUPPORT, host_action_notify_P(message), UNUSED(message)); - } - void MarlinUI::status_printf_P(const uint8_t, PGM_P const message, ...) { - TERN(HOST_PROMPT_SUPPORT, host_action_notify_P(message), UNUSED(message)); - } - -#endif // !HAS_DISPLAY - -#if ENABLED(SDSUPPORT) - - void MarlinUI::media_changed(const uint8_t old_status, const uint8_t status) { - if (old_status == status) { - TERN_(EXTENSIBLE_UI, ExtUI::onMediaError()); // Failed to mount/unmount - return; - } - - if (status) { - if (old_status < 2) { - TERN_(EXTENSIBLE_UI, ExtUI::onMediaInserted()); // ExtUI response - set_status_P(GET_TEXT(MSG_MEDIA_INSERTED)); - } - } - else { - if (old_status < 2) { - TERN_(EXTENSIBLE_UI, ExtUI::onMediaRemoved()); // ExtUI response - #if PIN_EXISTS(SD_DETECT) - set_status_P(GET_TEXT(MSG_MEDIA_REMOVED)); - #if HAS_LCD_MENU - if (!defer_return_to_status) return_to_status(); - #endif - #endif - } - } - - #if PIN_EXISTS(SD_DETECT) && DISABLED(NO_LCD_REINIT) - init_lcd(); // Revive a noisy shared SPI LCD - #endif - - refresh(); - - #if HAS_WIRED_LCD || defined(LED_BACKLIGHT_TIMEOUT) - const millis_t ms = millis(); - #endif - - TERN_(HAS_WIRED_LCD, next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL); // Delay LCD update for SD activity - - #ifdef LED_BACKLIGHT_TIMEOUT - leds.reset_timeout(ms); - #endif - } - -#endif // SDSUPPORT - -#if HAS_LCD_MENU - void MarlinUI::reset_settings() { settings.reset(); completion_feedback(); } #endif -#if ENABLED(EEPROM_SETTINGS) - - #if HAS_LCD_MENU - void MarlinUI::init_eeprom() { - const bool good = settings.init_eeprom(); - completion_feedback(good); - return_to_status(); - } - void MarlinUI::load_settings() { - const bool good = settings.load(); - completion_feedback(good); - } - void MarlinUI::store_settings() { - const bool good = settings.save(); - completion_feedback(good); - } - #endif - - #if DISABLED(EEPROM_AUTO_INIT) - - static inline PGM_P eeprom_err(const uint8_t msgid) { - switch (msgid) { - default: - case 0: return GET_TEXT(MSG_ERR_EEPROM_CRC); - case 1: return GET_TEXT(MSG_ERR_EEPROM_INDEX); - case 2: return GET_TEXT(MSG_ERR_EEPROM_VERSION); - } - } - - void MarlinUI::eeprom_alert(const uint8_t msgid) { - #if HAS_LCD_MENU - editable.uint8 = msgid; - goto_screen([]{ - PGM_P const restore_msg = GET_TEXT(MSG_INIT_EEPROM); - char msg[utf8_strlen_P(restore_msg) + 1]; - strcpy_P(msg, restore_msg); - MenuItem_confirm::select_screen( - GET_TEXT(MSG_BUTTON_RESET), GET_TEXT(MSG_BUTTON_IGNORE), - init_eeprom, return_to_status, - eeprom_err(editable.uint8), msg, PSTR("?") - ); - }); - #else - set_status_P(eeprom_err(msgid)); - #endif - } - - #endif // EEPROM_AUTO_INIT - -#endif // EEPROM_SETTINGS +#endif // ULTRA_LCD diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index c7ef41596d..229f4cbce1 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,702 +16,263 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef ULTRALCD_H +#define ULTRALCD_H #include "../inc/MarlinConfig.h" -#if HAS_BUZZER - #include "../libs/buzzer.h" +#if ENABLED(ULTRA_LCD) || ENABLED(MALYAN_LCD) + void lcd_init(); + bool lcd_detected(); + void lcd_update(); + void lcd_setalertstatusPGM(const char* message); +#else + inline void lcd_init() {} + inline bool lcd_detected() { return true; } + inline void lcd_update() {} + inline void lcd_setalertstatusPGM(const char* message) { UNUSED(message); } #endif -#if ENABLED(SDSUPPORT) - #include "../sd/cardreader.h" -#endif +#if ENABLED(ULTRA_LCD) -#if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY) - #define HAS_ENCODER_ACTION 1 -#endif -#if ((!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL - #define HAS_ENCODER_WHEEL 1 -#endif -#if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT) - #define HAS_DIGITAL_BUTTONS 1 -#endif -#if !HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_WIRED_LCD && DISABLED(NEWPANEL))) - #define HAS_SHIFT_ENCODER 1 -#endif - -// I2C buttons must be read in the main thread -#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL) - #define HAS_SLOW_BUTTONS 1 -#endif - -#if E_MANUAL > 1 - #define MULTI_MANUAL 1 -#endif - -#if HAS_WIRED_LCD - - #include "../MarlinCore.h" + #include "../Marlin.h" #if ENABLED(ADVANCED_PAUSE_FEATURE) #include "../feature/pause.h" - #include "../module/motion.h" // for active_extruder #endif - enum LCDViewAction : uint8_t { - LCDVIEW_NONE, - LCDVIEW_REDRAW_NOW, - LCDVIEW_CALL_REDRAW_NEXT, - LCDVIEW_CLEAR_CALL_REDRAW, - LCDVIEW_CALL_NO_REDRAW - }; + bool lcd_hasstatus(); + void lcd_setstatus(const char* message, const bool persist=false); + void lcd_setstatusPGM(const char* message, const int8_t level=0); + void lcd_setalertstatusPGM(const char* message); + void lcd_reset_alert_level(); + void lcd_reset_status(); + void lcd_status_printf_P(const uint8_t level, const char * const fmt, ...); + void lcd_kill_screen(); + void kill_screen(const char* lcd_msg); - #if HAS_ADC_BUTTONS + extern uint8_t lcdDrawUpdate; + inline void lcd_refresh() { lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; } + + #if HAS_BUZZER + void lcd_buzz(const long duration, const uint16_t freq); + #endif + + void lcd_quick_feedback(const bool clear_buttons); // Audible feedback for a button click - could also be visual + + #if ENABLED(LCD_PROGRESS_BAR) && PROGRESS_MSG_EXPIRE > 0 + void dontExpireStatus(); + #endif + + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + extern uint8_t progress_bar_percent; + #endif + + #if ENABLED(ADC_KEYPAD) uint8_t get_ADC_keyValue(); #endif - #define LCD_UPDATE_INTERVAL TERN(HAS_TOUCH_XPT2046, 50, 100) + #if ENABLED(DOGLCD) + extern int16_t lcd_contrast; + void set_lcd_contrast(const int16_t value); + #endif - #if HAS_LCD_MENU + #if ENABLED(SHOW_BOOTSCREEN) + void lcd_bootscreen(); + #endif - #include "lcdprint.h" + #define LCD_UPDATE_INTERVAL 100 + #define BUTTON_EXISTS(BN) (defined(BTN_## BN) && BTN_## BN >= 0) + #define BUTTON_PRESSED(BN) !READ(BTN_## BN) - void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, const bool wordwrap=false); - inline void wrap_string_P(uint8_t &col, uint8_t &row, PGM_P const pstr, const bool wordwrap=false) { _wrap_string(col, row, pstr, read_byte_rom, wordwrap); } - inline void wrap_string(uint8_t &col, uint8_t &row, const char * const string, const bool wordwrap=false) { _wrap_string(col, row, string, read_byte_ram, wordwrap); } + #if ENABLED(ULTIPANEL) // LCD with a click-wheel input - #if ENABLED(SDSUPPORT) - #include "../sd/cardreader.h" - #endif + extern bool defer_return_to_status; + // Function pointer to menu functions. typedef void (*screenFunc_t)(); typedef void (*menuAction_t)(); + extern int16_t lcd_preheat_hotend_temp[2], lcd_preheat_bed_temp[2], lcd_preheat_fan_speed[2]; + + #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION) + extern bool lcd_external_control; + #else + constexpr bool lcd_external_control = false; + #endif + + #if ENABLED(LCD_BED_LEVELING) + extern bool lcd_wait_for_move; + #else + constexpr bool lcd_wait_for_move = false; + #endif + + void lcd_goto_screen(screenFunc_t screen, const uint32_t encoder=0); + + void lcd_completion_feedback(const bool good=true); + #if ENABLED(ADVANCED_PAUSE_FEATURE) - void lcd_pause_show_message(const PauseMessage message, - const PauseMode mode=PAUSE_MODE_SAME, - const uint8_t extruder=active_extruder); + extern uint8_t active_extruder; + void lcd_advanced_pause_show_message(const AdvancedPauseMessage message, + const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT, + const uint8_t extruder=active_extruder); + #endif + + #if ENABLED(G26_MESH_VALIDATION) + void lcd_chirp(); #endif #if ENABLED(AUTO_BED_LEVELING_UBL) void lcd_mesh_edit_setup(const float &initial); float lcd_mesh_edit(); + void lcd_z_offset_edit_setup(const float &initial); + float lcd_z_offset_edit(); #endif - #endif // HAS_LCD_MENU + #endif -#endif // HAS_WIRED_LCD + #if ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) + extern millis_t previous_lcd_status_ms; + #endif + + bool lcd_blink(); + + #if ENABLED(REPRAPWORLD_KEYPAD) // is also ULTIPANEL and NEWPANEL + + #define REPRAPWORLD_BTN_OFFSET 0 // bit offset into buttons for shift register values + + #define BLEN_REPRAPWORLD_KEYPAD_F3 0 + #define BLEN_REPRAPWORLD_KEYPAD_F2 1 + #define BLEN_REPRAPWORLD_KEYPAD_F1 2 + #define BLEN_REPRAPWORLD_KEYPAD_DOWN 3 + #define BLEN_REPRAPWORLD_KEYPAD_RIGHT 4 + #define BLEN_REPRAPWORLD_KEYPAD_MIDDLE 5 + #define BLEN_REPRAPWORLD_KEYPAD_UP 6 + #define BLEN_REPRAPWORLD_KEYPAD_LEFT 7 + + #define EN_REPRAPWORLD_KEYPAD_F3 (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_F3)) + #define EN_REPRAPWORLD_KEYPAD_F2 (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_F2)) + #define EN_REPRAPWORLD_KEYPAD_F1 (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_F1)) + #define EN_REPRAPWORLD_KEYPAD_DOWN (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_DOWN)) + #define EN_REPRAPWORLD_KEYPAD_RIGHT (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_RIGHT)) + #define EN_REPRAPWORLD_KEYPAD_MIDDLE (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_MIDDLE)) + #define EN_REPRAPWORLD_KEYPAD_UP (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_UP)) + #define EN_REPRAPWORLD_KEYPAD_LEFT (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_LEFT)) + + #define REPRAPWORLD_KEYPAD_MOVE_Z_DOWN (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_F3) + #define REPRAPWORLD_KEYPAD_MOVE_Z_UP (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_F2) + #define REPRAPWORLD_KEYPAD_MOVE_Y_DOWN (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_DOWN) + #define REPRAPWORLD_KEYPAD_MOVE_X_RIGHT (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_RIGHT) + #define REPRAPWORLD_KEYPAD_MOVE_Y_UP (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_UP) + #define REPRAPWORLD_KEYPAD_MOVE_X_LEFT (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_LEFT) + + #if ENABLED(ADC_KEYPAD) + #define KEYPAD_HOME EN_REPRAPWORLD_KEYPAD_F1 + #define KEYPAD_EN_C EN_REPRAPWORLD_KEYPAD_MIDDLE + #else + #define KEYPAD_HOME EN_REPRAPWORLD_KEYPAD_MIDDLE + #define KEYPAD_EN_C EN_REPRAPWORLD_KEYPAD_F1 + #endif + #define REPRAPWORLD_KEYPAD_MOVE_HOME (buttons_reprapworld_keypad & KEYPAD_HOME) + #define REPRAPWORLD_KEYPAD_MOVE_MENU (buttons_reprapworld_keypad & KEYPAD_EN_C) + + #define REPRAPWORLD_KEYPAD_PRESSED (buttons_reprapworld_keypad & ( \ + EN_REPRAPWORLD_KEYPAD_F3 | \ + EN_REPRAPWORLD_KEYPAD_F2 | \ + EN_REPRAPWORLD_KEYPAD_F1 | \ + EN_REPRAPWORLD_KEYPAD_DOWN | \ + EN_REPRAPWORLD_KEYPAD_RIGHT | \ + EN_REPRAPWORLD_KEYPAD_MIDDLE | \ + EN_REPRAPWORLD_KEYPAD_UP | \ + EN_REPRAPWORLD_KEYPAD_LEFT) \ + ) + + #endif + + #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION) + bool is_lcd_clicked(); + void wait_for_release(); + #endif + +#else // MALYAN_LCD or no LCD + + constexpr bool lcd_wait_for_move = false; + + inline void lcd_refresh() {} + inline bool lcd_hasstatus() { return false; } + inline void lcd_setstatus(const char* const message, const bool persist=false) { UNUSED(message); UNUSED(persist); } + inline void lcd_setstatusPGM(const char* const message, const int8_t level=0) { UNUSED(message); UNUSED(level); } + inline void lcd_status_printf_P(const uint8_t level, const char * const fmt, ...) { UNUSED(level); UNUSED(fmt); } + inline void lcd_reset_alert_level() {} + inline void lcd_reset_status() {} + +#endif // ULTRA_LCD + +#if ENABLED(ULTIPANEL) + + #if ENABLED(NEWPANEL) // Uses digital switches, not a shift register + + // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes) + #define BLEN_A 0 + #define BLEN_B 1 + + #define EN_A _BV(BLEN_A) + #define EN_B _BV(BLEN_B) + + #if BUTTON_EXISTS(ENC) + #define BLEN_C 2 + #define EN_C _BV(BLEN_C) + #endif + + #if BUTTON_EXISTS(BACK) + #define BLEN_D 3 + #define EN_D _BV(BLEN_D) + #define LCD_BACK_CLICKED (buttons & EN_D) + #endif + + #endif // NEWPANEL + + extern volatile uint8_t buttons; // The last-checked buttons in a bit array. + void lcd_buttons_update(); + +#else + + inline void lcd_buttons_update() {} + +#endif -// REPRAPWORLD_KEYPAD (and ADC_KEYPAD) #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_OFFSET 0 // Bit offset into buttons for shift register values - - #define BLEN_KEYPAD_F3 0 - #define BLEN_KEYPAD_F2 1 - #define BLEN_KEYPAD_F1 2 - #define BLEN_KEYPAD_DOWN 3 - #define BLEN_KEYPAD_RIGHT 4 - #define BLEN_KEYPAD_MIDDLE 5 - #define BLEN_KEYPAD_UP 6 - #define BLEN_KEYPAD_LEFT 7 - - #define EN_KEYPAD_F1 _BV(BTN_OFFSET + BLEN_KEYPAD_F1) - #define EN_KEYPAD_F2 _BV(BTN_OFFSET + BLEN_KEYPAD_F2) - #define EN_KEYPAD_F3 _BV(BTN_OFFSET + BLEN_KEYPAD_F3) - #define EN_KEYPAD_DOWN _BV(BTN_OFFSET + BLEN_KEYPAD_DOWN) - #define EN_KEYPAD_RIGHT _BV(BTN_OFFSET + BLEN_KEYPAD_RIGHT) - #define EN_KEYPAD_MIDDLE _BV(BTN_OFFSET + BLEN_KEYPAD_MIDDLE) - #define EN_KEYPAD_UP _BV(BTN_OFFSET + BLEN_KEYPAD_UP) - #define EN_KEYPAD_LEFT _BV(BTN_OFFSET + BLEN_KEYPAD_LEFT) - - #define RRK(B) (keypad_buttons & (B)) - #ifdef EN_C - #define BUTTON_CLICK() ((buttons & EN_C) || RRK(EN_KEYPAD_MIDDLE)) + #define LCD_CLICKED ((buttons & EN_C) || REPRAPWORLD_KEYPAD_MOVE_MENU) #else - #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE) + #define LCD_CLICKED REPRAPWORLD_KEYPAD_MOVE_MENU #endif - -#endif - -#if HAS_DIGITAL_BUTTONS - - // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes) - #define BLEN_A 0 - #define BLEN_B 1 - - #define EN_A _BV(BLEN_A) - #define EN_B _BV(BLEN_B) - - #define BUTTON_PRESSED(BN) !READ(BTN_## BN) - - #if BUTTON_EXISTS(ENC) || HAS_TOUCH_XPT2046 - #define BLEN_C 2 - #define EN_C _BV(BLEN_C) - #endif - - #if ENABLED(LCD_I2C_VIKI) - - #include - - #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) - - // button and encoder bit positions within 'buttons' - #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C - #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET) - #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET) - #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET) - #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET) - - #if BUTTON_EXISTS(ENC) // The pause/stop/restart button is connected to BTN_ENC when used - #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name - #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented. - #else - #define BUTTON_CLICK() (buttons & (B_MI|B_RI)) - #endif - - // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin - - #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) - - #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later - - #define BUTTON_CLICK() (buttons & B_MI) - - #endif - - #endif - +#elif defined(EN_C) + #define LCD_CLICKED (buttons & EN_C) #else - - #undef BUTTON_EXISTS - #define BUTTON_EXISTS(...) false - - // Shift register bits correspond to buttons: - #define BL_LE 7 // Left - #define BL_UP 6 // Up - #define BL_MI 5 // Middle - #define BL_DW 4 // Down - #define BL_RI 3 // Right - #define BL_ST 2 // Red Button - #define B_LE _BV(BL_LE) - #define B_UP _BV(BL_UP) - #define B_MI _BV(BL_MI) - #define B_DW _BV(BL_DW) - #define B_RI _BV(BL_RI) - #define B_ST _BV(BL_ST) - - #ifndef BUTTON_CLICK - #define BUTTON_CLICK() (buttons & (B_MI|B_ST)) - #endif - + #define LCD_CLICKED false #endif -#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_XPT2046, IS_TFTGLCD_PANEL) - #define BLEN_D 3 - #define EN_D _BV(BLEN_D) - #define LCD_BACK_CLICKED() (buttons & EN_D) +#define LCD_MESSAGEPGM(x) lcd_setstatusPGM(PSTR(x)) +#define LCD_ALERTMESSAGEPGM(x) lcd_setalertstatusPGM(PSTR(x)) + +// For i2c define BUZZ to use lcd_buzz +#if ENABLED(LCD_USE_I2C_BUZZER) + #define BUZZ(d,f) lcd_buzz(d, f) +#endif + +#if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) + void lcd_reselect_last_file(); +#endif + +#if ENABLED(ULTIPANEL) && ENABLED(SDSUPPORT) + extern bool abort_sd_printing; #else - #define LCD_BACK_CLICKED() false + constexpr bool abort_sd_printing = false; #endif -#ifndef BUTTON_CLICK - #ifdef EN_C - #define BUTTON_CLICK() (buttons & EN_C) - #else - #define BUTTON_CLICK() false - #endif -#endif - -#if HAS_MARLINUI_U8GLIB - enum MarlinFont : uint8_t { - FONT_STATUSMENU = 1, - FONT_EDIT, - FONT_MENU - }; -#else - enum HD44780CharSet : uint8_t { - CHARSET_MENU, - CHARSET_INFO, - CHARSET_BOOT - }; -#endif - -#if PREHEAT_COUNT - typedef struct { - TERN_(HAS_HOTEND, uint16_t hotend_temp); - TERN_(HAS_HEATED_BED, uint16_t bed_temp ); - TERN_(HAS_FAN, uint16_t fan_speed ); - } preheat_t; -#endif - -#if HAS_LCD_MENU - - // Manual Movement class - class ManualMove { - public: - static millis_t start_time; - static float menu_scale; - TERN_(IS_KINEMATIC, static float offset); - #if IS_KINEMATIC - static bool processing; - #else - static bool constexpr processing = false; - #endif - #if MULTI_MANUAL - static int8_t e_index; - #else - static int8_t constexpr e_index = 0; - #endif - static uint8_t axis; - static void task(); - static void soon(AxisEnum axis - #if MULTI_MANUAL - , const int8_t eindex=-1 - #endif - ); - }; - -#endif - -//////////////////////////////////////////// -//////////// MarlinUI Singleton //////////// -//////////////////////////////////////////// - -class MarlinUI { -public: - - MarlinUI() { - TERN_(HAS_LCD_MENU, currentScreen = status_screen); - } - - #if HAS_BUZZER - static void buzz(const long duration, const uint16_t freq); - #endif - - FORCE_INLINE static void chirp() { - TERN_(HAS_CHIRP, buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ)); - } - - #if ENABLED(LCD_HAS_STATUS_INDICATORS) - static void update_indicators(); - #endif - - // LCD implementations - static void clear_lcd(); - - #if ENABLED(SDSUPPORT) - static void media_changed(const uint8_t old_stat, const uint8_t stat); - #endif - - #if ENABLED(DWIN_CREALITY_LCD) - static void refresh(); - #else - FORCE_INLINE static void refresh() { - TERN_(HAS_WIRED_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW)); - } - #endif - - #if HAS_WIRED_LCD - static bool detected(); - static void init_lcd(); - #else - static inline bool detected() { return true; } - static inline void init_lcd() {} - #endif - - #if HAS_PRINT_PROGRESS - #if HAS_PRINT_PROGRESS_PERMYRIAD - typedef uint16_t progress_t; - #define PROGRESS_SCALE 100U - #define PROGRESS_MASK 0x7FFF - #else - typedef uint8_t progress_t; - #define PROGRESS_SCALE 1U - #define PROGRESS_MASK 0x7F - #endif - #if ENABLED(LCD_SET_PROGRESS_MANUALLY) - static progress_t progress_override; - static void set_progress(const progress_t p) { progress_override = _MIN(p, 100U * (PROGRESS_SCALE)); } - static void set_progress_done() { progress_override = (PROGRESS_MASK + 1U) + 100U * (PROGRESS_SCALE); } - static void progress_reset() { if (progress_override & (PROGRESS_MASK + 1U)) set_progress(0); } - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) - static uint32_t remaining_time; - FORCE_INLINE static void set_remaining_time(const uint32_t r) { remaining_time = r; } - FORCE_INLINE static uint32_t get_remaining_time() { return remaining_time; } - FORCE_INLINE static void reset_remaining_time() { set_remaining_time(0); } - #endif - #endif - static progress_t _get_progress(); - #if HAS_PRINT_PROGRESS_PERMYRIAD - FORCE_INLINE static uint16_t get_progress_permyriad() { return _get_progress(); } - #endif - static uint8_t get_progress_percent() { return uint8_t(_get_progress() / (PROGRESS_SCALE)); } - #else - static constexpr uint8_t get_progress_percent() { return 0; } - #endif - - #if HAS_DISPLAY - - static void init(); - static void update(); - static void set_alert_status_P(PGM_P const message); - - static char status_message[]; - static bool has_status(); - - static uint8_t alert_level; // Higher levels block lower levels - static inline void reset_alert_level() { alert_level = 0; } - - #if ENABLED(STATUS_MESSAGE_SCROLLING) - static uint8_t status_scroll_offset; - static void advance_status_scroll(); - static char* status_and_len(uint8_t &len); - #endif - - static void abort_print(); - static void pause_print(); - static void resume_print(); - - #if HAS_WIRED_LCD - - static millis_t next_button_update_ms; - - static LCDViewAction lcdDrawUpdate; - FORCE_INLINE static bool should_draw() { return bool(lcdDrawUpdate); } - FORCE_INLINE static void refresh(const LCDViewAction type) { lcdDrawUpdate = type; } - - #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) - static void draw_custom_bootscreen(const uint8_t frame=0); - static void show_custom_bootscreen(); - #endif - - #if ENABLED(SHOW_BOOTSCREEN) - #ifndef BOOTSCREEN_TIMEOUT - #define BOOTSCREEN_TIMEOUT 2500 - #endif - static void draw_marlin_bootscreen(const bool line2=false); - static void show_marlin_bootscreen(); - static void show_bootscreen(); - #endif - - #if HAS_MARLINUI_U8GLIB - - static void set_font(const MarlinFont font_nr); - - #else - - static void set_custom_characters(const HD44780CharSet screen_charset=CHARSET_INFO); - - #if ENABLED(LCD_PROGRESS_BAR) - static millis_t progress_bar_ms; // Start time for the current progress bar cycle - static void draw_progress_bar(const uint8_t percent); - #if PROGRESS_MSG_EXPIRE > 0 - static millis_t expire_status_ms; // = 0 - FORCE_INLINE static void reset_progress_bar_timeout() { expire_status_ms = 0; } - #endif - #endif - - #endif - - static uint8_t lcd_status_update_delay; - - #if HAS_LCD_CONTRAST - static int16_t contrast; - static void set_contrast(const int16_t value); - FORCE_INLINE static void refresh_contrast() { set_contrast(contrast); } - #endif - - #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) - static millis_t next_filament_display; - #endif - - static void quick_feedback(const bool clear_buttons=true); - #if HAS_BUZZER - static void completion_feedback(const bool good=true); - #else - static inline void completion_feedback(const bool=true) {} - #endif - - #if DISABLED(LIGHTWEIGHT_UI) - static void draw_status_message(const bool blink); - #endif - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - static void draw_hotend_status(const uint8_t row, const uint8_t extruder); - #endif - - #if HAS_TOUCH_XPT2046 - static bool on_edit_screen; - static void screen_click(const uint8_t row, const uint8_t col, const uint8_t x, const uint8_t y); - #endif - - static void status_screen(); - - #endif - - #if HAS_MARLINUI_U8GLIB - static bool drawing_screen, first_page; - #else - static constexpr bool drawing_screen = false, first_page = true; - #endif - - static bool get_blink(); - static void kill_screen(PGM_P const lcd_error, PGM_P const lcd_component); - static void draw_kill_screen(); - static void set_status(const char* const message, const bool persist=false); - static void set_status_P(PGM_P const message, const int8_t level=0); - static void status_printf_P(const uint8_t level, PGM_P const fmt, ...); - static void reset_status(const bool no_welcome=false); - - #else // No LCD - - // Send status to host as a notification - static void set_status(const char* message, const bool=false); - static void set_status_P(PGM_P message, const int8_t=0); - static void status_printf_P(const uint8_t, PGM_P message, ...); - - static inline void init() {} - static inline void update() {} - static inline void return_to_status() {} - static inline void set_alert_status_P(PGM_P const) {} - static inline void reset_status(const bool=false) {} - static inline void reset_alert_level() {} - static constexpr bool has_status() { return false; } - - #endif - - #if ENABLED(SDSUPPORT) - #if BOTH(SCROLL_LONG_FILENAMES, HAS_LCD_MENU) - #define MARLINUI_SCROLL_NAME 1 - #endif - #if MARLINUI_SCROLL_NAME - static uint8_t filename_scroll_pos, filename_scroll_max; - #endif - static const char * scrolled_filename(CardReader &theCard, const uint8_t maxlen, uint8_t hash, const bool doScroll); - #endif - - #if PREHEAT_COUNT - static preheat_t material_preset[PREHEAT_COUNT]; - static PGM_P get_preheat_label(const uint8_t m); - #endif - - #if HAS_LCD_MENU - #if LCD_TIMEOUT_TO_STATUS - static millis_t return_to_status_ms; - #endif - - #if HAS_TOUCH_XPT2046 - static uint8_t touch_buttons; - static uint8_t repeat_delay; - #endif - - #if ENABLED(ENCODER_RATE_MULTIPLIER) - static bool encoderRateMultiplierEnabled; - static millis_t lastEncoderMovementMillis; - static void enable_encoder_multiplier(const bool onoff); - #define ENCODER_RATE_MULTIPLY(F) (ui.encoderRateMultiplierEnabled = F) - #else - #define ENCODER_RATE_MULTIPLY(F) NOOP - #endif - - // Manual Movement - static ManualMove manual_move; - - // Select Screen (modal NO/YES style dialog) - static bool selection; - static void set_selection(const bool sel) { selection = sel; } - static bool update_selection(); - - static bool lcd_clicked; - static bool use_click(); - - static void synchronize(PGM_P const msg=nullptr); - - static screenFunc_t currentScreen; - static bool screen_changed; - static void goto_screen(const screenFunc_t screen, const uint16_t encoder=0, const uint8_t top=0, const uint8_t items=0); - static void save_previous_screen(); - - // goto_previous_screen and go_back may also be used as menu item callbacks - static void _goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back)); - static inline void goto_previous_screen() { _goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, false)); } - static inline void go_back() { _goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, true)); } - - static void return_to_status(); - static inline bool on_status_screen() { return currentScreen == status_screen; } - FORCE_INLINE static void run_current_screen() { (*currentScreen)(); } - - #if ENABLED(LIGHTWEIGHT_UI) - static void lcd_in_status(const bool inStatus); - #endif - - FORCE_INLINE static void defer_status_screen(const bool defer=true) { - #if LCD_TIMEOUT_TO_STATUS > 0 - defer_return_to_status = defer; - #else - UNUSED(defer); - #endif - } - - static inline void goto_previous_screen_no_defer() { - defer_status_screen(false); - goto_previous_screen(); - } - - #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - static void reselect_last_file(); - #endif - - #if ENABLED(AUTO_BED_LEVELING_UBL) - static void ubl_plot(const uint8_t x_plot, const uint8_t y_plot); - #endif - - static void draw_select_screen_prompt(PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr); - - #elif HAS_WIRED_LCD - - static constexpr bool lcd_clicked = false; - static constexpr bool on_status_screen() { return true; } - FORCE_INLINE static void run_current_screen() { status_screen(); } - - #endif - - // - // EEPROM: Reset / Init / Load / Store - // - #if HAS_LCD_MENU - static void reset_settings(); - #endif - - #if ENABLED(EEPROM_SETTINGS) - #if HAS_LCD_MENU - static void init_eeprom(); - static void load_settings(); - static void store_settings(); - #endif - #if DISABLED(EEPROM_AUTO_INIT) - static void eeprom_alert(const uint8_t msgid); - static inline void eeprom_alert_crc() { eeprom_alert(0); } - static inline void eeprom_alert_index() { eeprom_alert(1); } - static inline void eeprom_alert_version() { eeprom_alert(2); } - #endif - #endif - - // - // Special handling if a move is underway - // - #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) || (ENABLED(LCD_BED_LEVELING) && EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)) - #define LCD_HAS_WAIT_FOR_MOVE 1 - static bool wait_for_move; - #else - static constexpr bool wait_for_move = false; - #endif - - // - // Block interaction while under external control - // - #if HAS_LCD_MENU && EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) - static bool external_control; - FORCE_INLINE static void capture() { external_control = true; } - FORCE_INLINE static void release() { external_control = false; } - #if ENABLED(AUTO_BED_LEVELING_UBL) - static void external_encoder(); - #endif - #else - static constexpr bool external_control = false; - #endif - - #if HAS_ENCODER_ACTION - - static volatile uint8_t buttons; - #if ENABLED(REPRAPWORLD_KEYPAD) - static volatile uint8_t keypad_buttons; - static bool handle_keypad(); - #endif - #if HAS_SLOW_BUTTONS - static volatile uint8_t slow_buttons; - static uint8_t read_slow_buttons(); - #endif - - static void update_buttons(); - static inline bool button_pressed() { return BUTTON_CLICK() || TERN(TOUCH_SCREEN, touch_pressed(), false); } - #if EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) - static void wait_for_release(); - #endif - - static uint32_t encoderPosition; - - #define ENCODERBASE (TERN(REVERSE_ENCODER_DIRECTION, -1, +1)) - - #if EITHER(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) - static int8_t encoderDirection; - #else - static constexpr int8_t encoderDirection = ENCODERBASE; - #endif - - FORCE_INLINE static void encoder_direction_normal() { - #if EITHER(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) - encoderDirection = ENCODERBASE; - #endif - } - - FORCE_INLINE static void encoder_direction_menus() { - TERN_(REVERSE_MENU_DIRECTION, encoderDirection = -(ENCODERBASE)); - } - - FORCE_INLINE static void encoder_direction_select() { - TERN_(REVERSE_SELECT_DIRECTION, encoderDirection = -(ENCODERBASE)); - } - - #else - - static inline void update_buttons() {} - - #endif - - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - static void touch_calibration(); - #endif - - #if HAS_GRAPHICAL_TFT - static void move_axis_screen(); - #endif - -private: - - #if HAS_DISPLAY - static void finish_status(const bool persist); - #endif - - #if HAS_WIRED_LCD - #if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 - static bool defer_return_to_status; - #else - static constexpr bool defer_return_to_status = false; - #endif - static void draw_status_screen(); - #if HAS_GRAPHICAL_TFT - static void tft_idle(); - #if ENABLED(TOUCH_SCREEN) - static bool touch_pressed(); - #endif - #endif - #endif -}; - -extern MarlinUI ui; - -#define LCD_MESSAGEPGM_P(x) ui.set_status_P(x) -#define LCD_ALERTMESSAGEPGM_P(x) ui.set_alert_status_P(x) - -#define LCD_MESSAGEPGM(x) LCD_MESSAGEPGM_P(GET_TEXT(x)) -#define LCD_ALERTMESSAGEPGM(x) LCD_ALERTMESSAGEPGM_P(GET_TEXT(x)) +#endif // ULTRALCD_H diff --git a/Marlin/src/lcd/ultralcd_common_HD44780.h b/Marlin/src/lcd/ultralcd_common_HD44780.h new file mode 100644 index 0000000000..970dbbf35a --- /dev/null +++ b/Marlin/src/lcd/ultralcd_common_HD44780.h @@ -0,0 +1,199 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef ULTRALCD_COMMON_HD44780_H +#define ULTRALCD_COMMON_HD44780_H + +/** + * Implementation of the LCD display routines for a Hitachi HD44780 display. + * These are the most common LCD character displays. + */ + +#include "../inc/MarlinConfig.h" + +#if LCD_HEIGHT > 3 + #include "../libs/duration_t.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../feature/bedlevel/ubl/ubl.h" + + #if ENABLED(ULTIPANEL) + #define ULTRA_X_PIXELS_PER_CHAR 5 + #define ULTRA_Y_PIXELS_PER_CHAR 8 + #define ULTRA_COLUMNS_FOR_MESH_MAP 7 + #define ULTRA_ROWS_FOR_MESH_MAP 4 + + #define N_USER_CHARS 8 + + #define TOP_LEFT _BV(0) + #define TOP_RIGHT _BV(1) + #define LOWER_LEFT _BV(2) + #define LOWER_RIGHT _BV(3) + #endif +#endif + +extern volatile uint8_t buttons; //an extended version of the last checked buttons in a bit array. + +//////////////////////////////////// +// Setup button and encode mappings for each panel (into 'buttons' variable +// +// This is just to map common functions (across different panels) onto the same +// macro name. The mapping is independent of whether the button is directly connected or +// via a shift/i2c register. + +#if ENABLED(ULTIPANEL) + + // + // Setup other button mappings of each panel + // + #if ENABLED(LCD_I2C_VIKI) + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + // button and encoder bit positions within 'buttons' + #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C + #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET) + #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET) + #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET) + #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET) + + #undef LCD_CLICKED + #if BUTTON_EXISTS(ENC) + // the pause/stop/restart button is connected to BTN_ENC when used + #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name + #define LCD_CLICKED (buttons & (B_MI|B_RI|B_ST)) // pause/stop button also acts as click until we implement proper pause/stop. + #else + #define LCD_CLICKED (buttons & (B_MI|B_RI)) + #endif + + // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update + #define LCD_HAS_SLOW_BUTTONS + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin + + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later + + #undef LCD_CLICKED + #define LCD_CLICKED (buttons & B_MI) + + // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update + #define LCD_HAS_SLOW_BUTTONS + + #endif + + #elif DISABLED(NEWPANEL) // old style ULTIPANEL + // Shift register bits correspond to buttons: + #define BL_LE 7 // Left + #define BL_UP 6 // Up + #define BL_MI 5 // Middle + #define BL_DW 4 // Down + #define BL_RI 3 // Right + #define BL_ST 2 // Red Button + #define B_LE (_BV(BL_LE)) + #define B_UP (_BV(BL_UP)) + #define B_MI (_BV(BL_MI)) + #define B_DW (_BV(BL_DW)) + #define B_RI (_BV(BL_RI)) + #define B_ST (_BV(BL_ST)) + #define LCD_CLICKED (buttons & (B_MI|B_ST)) + #endif + +#endif // ULTIPANEL + +//////////////////////////////////// +// Create LCD class instance and chipset-specific information +#if ENABLED(LCD_I2C_TYPE_PCF8575) + // NOTE: These are register-mapped pins on the PCF8575 controller, not Arduino pins. + #define LCD_I2C_PIN_BL 3 + #define LCD_I2C_PIN_EN 2 + #define LCD_I2C_PIN_RW 1 + #define LCD_I2C_PIN_RS 0 + #define LCD_I2C_PIN_D4 4 + #define LCD_I2C_PIN_D5 5 + #define LCD_I2C_PIN_D6 6 + #define LCD_I2C_PIN_D7 7 + + #include + #include + #include + #define LCD_CLASS LiquidCrystal_I2C + +#elif ENABLED(LCD_I2C_TYPE_MCP23017) + // For the LED indicators (which may be mapped to different events in lcd_implementation_update_indicators()) + #define LED_A 0x04 //100 + #define LED_B 0x02 //010 + #define LED_C 0x01 //001 + + #define LCD_HAS_STATUS_INDICATORS + + #include + #include + #define LCD_CLASS LiquidTWI2 + +#elif ENABLED(LCD_I2C_TYPE_MCP23008) + #include + #include + #define LCD_CLASS LiquidTWI2 + +#elif ENABLED(LCD_I2C_TYPE_PCA8574) + #include + #define LCD_CLASS LiquidCrystal_I2C + +// 2 wire Non-latching LCD SR from: +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection +#elif ENABLED(SR_LCD_2W_NL) + extern "C" void __cxa_pure_virtual() { while (1); } + #include + #include + #define LCD_CLASS LiquidCrystal_SR + +#elif ENABLED(LCM1602) + #include + #include + #include + #define LCD_CLASS LiquidCrystal_I2C + +#else + // Standard directly connected LCD implementations + #include + #define LCD_CLASS LiquidCrystal + +#endif + +#include "fontutils.h" +#include "lcdprint.h" + +#if ENABLED(LCD_PROGRESS_BAR) + #define LCD_STR_PROGRESS "\x03\x04\x05" +#endif + +enum HD44780CharSet : char { + CHARSET_MENU, + CHARSET_INFO, + CHARSET_BOOT +}; + +#endif // ULTRALCD_COMMON_HD44780_H diff --git a/Marlin/src/lcd/ultralcd_impl_DOGM.h b/Marlin/src/lcd/ultralcd_impl_DOGM.h new file mode 100644 index 0000000000..16d6c11991 --- /dev/null +++ b/Marlin/src/lcd/ultralcd_impl_DOGM.h @@ -0,0 +1,656 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * ultralcd_impl_DOGM.h + * + * Graphics LCD implementation for 128x64 pixel LCDs by STB for ErikZalm/Marlin + * Demonstrator: http://www.reprap.org/wiki/STB_Electronics + * License: http://opensource.org/licenses/BSD-3-Clause + * + * With the use of: + * u8glib by Oliver Kraus + * https://github.com/olikraus/U8glib_Arduino + * License: http://opensource.org/licenses/BSD-3-Clause + */ + +#ifndef ULTRALCD_IMPL_DOGM_H +#define ULTRALCD_IMPL_DOGM_H + +#include "../inc/MarlinConfig.h" + +/** + * Implementation of the LCD display routines for a DOGM128 graphic display. + * These are common LCD 128x64 pixel graphic displays. + */ +#include "ultralcd.h" + +/* +#if ENABLED(U8GLIB_ST7565_64128N) + #include "dogm/ultralcd_st7565_u8glib_VIKI.h" +#elif ENABLED(U8GLIB_ST7920) + #include "dogm/ultralcd_st7920_u8glib_rrd.h" +#endif +*/ + +#include "dogm/dogm_bitmaps.h" + +#if ENABLED(SDSUPPORT) + #include "../libs/duration_t.h" +#endif + +#include + +#include "fontutils.h" +#include "u8g_fontutf8.h" + +#include "dogm/HAL_LCD_class_defines.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../feature/bedlevel/ubl/ubl.h" +#endif + +// Only Western languages support big / small fonts +#if DISABLED(DISPLAY_CHARSET_ISO10646_1) + #undef USE_BIG_EDIT_FONT + #undef USE_SMALL_INFOFONT +#endif + +#if ENABLED(USE_SMALL_INFOFONT) + #include "dogm/dogm_font_data_6x9_marlin.h" + #define FONT_STATUSMENU_NAME u8g_font_6x9 + #define INFO_FONT_HEIGHT 7 +#else + #define FONT_STATUSMENU_NAME FONT_MENU_NAME + #define INFO_FONT_HEIGHT 8 +#endif + +// The Marlin special symbols is now in the dogm_font_data_ISO10646_1.h +#define FONT_SPECIAL_NAME ISO10646_1_5x7 + +#include LANGUAGE_DATA_INCL(LCD_LANGUAGE) + +#include "dogm/dogm_font_data_ISO10646_1.h" +#define FONT_MENU_NAME ISO10646_1_5x7 + +//#define FONT_STATUSMENU_NAME FONT_MENU_NAME + +#define FONT_STATUSMENU 1 +#define FONT_SPECIAL 2 +#define FONT_MENU_EDIT 3 +#define FONT_MENU 4 + +// DOGM parameters (size in pixels) +#define DOG_CHAR_WIDTH 6 +#define DOG_CHAR_HEIGHT 12 +#if ENABLED(USE_BIG_EDIT_FONT) + #define FONT_MENU_EDIT_NAME u8g_font_9x18 + #define DOG_CHAR_WIDTH_EDIT 9 + #define DOG_CHAR_HEIGHT_EDIT 18 +#else + #define FONT_MENU_EDIT_NAME FONT_MENU_NAME + #define DOG_CHAR_WIDTH_EDIT DOG_CHAR_WIDTH + #define DOG_CHAR_HEIGHT_EDIT DOG_CHAR_HEIGHT +#endif + +#ifndef TALL_FONT_CORRECTION + #define TALL_FONT_CORRECTION 0 +#endif + +#define START_COL 0 + +// LCD selection +#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) + U8GLIB_ST7920_128X64_4X u8g(LCD_PINS_RS); // 2 stripes, HW SPI (shared with SD card) + #else + U8GLIB_ST7920_128X64_4X u8g(LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS); // Original u8glib device. 2 stripes, SW SPI + #endif + +#elif ENABLED(U8GLIB_ST7920) + // RepRap Discount Full Graphics Smart Controller + #if DISABLED(SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN) && (LCD_PINS_ENABLE == MOSI_PIN) + U8GLIB_ST7920_128X64_4X_HAL u8g(LCD_PINS_RS); // 2 stripes, HW SPI (shared with SD card, on AVR does not use standard LCD adapter) + #else + //U8GLIB_ST7920_128X64_4X u8g(LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS); // Original u8glib device. 2 stripes, SW SPI + U8GLIB_ST7920_128X64_RRD u8g(LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS); // Number of stripes can be adjusted in ultralcd_st7920_u8glib_rrd.h with PAGE_HEIGHT + // AVR version ignores these pin settings + // HAL version uses these pin settings + #endif + +#elif ENABLED(CARTESIO_UI) + // The CartesioUI display + //U8GLIB_DOGM128_2X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 4 stripes + U8GLIB_DOGM128_2X u8g(DOGLCD_CS, DOGLCD_A0); // 4 stripes + +#elif ENABLED(U8GLIB_LM6059_AF) + // Based on the Adafruit ST7565 (http://www.adafruit.com/products/250) + //U8GLIB_LM6059 u8g(DOGLCD_CS, DOGLCD_A0); // 8 stripes + U8GLIB_LM6059_2X u8g(DOGLCD_CS, DOGLCD_A0); // 4 stripes + +#elif ENABLED(U8GLIB_ST7565_64128N) + // The MaKrPanel, Mini Viki, Viki 2.0 & AZSMZ 12864 ST7565 controller + #define SMART_RAMPS (MB(RAMPS_SMART_EFB) || MB(RAMPS_SMART_EEB) || MB(RAMPS_SMART_EFF) || MB(RAMPS_SMART_EEF) || MB(RAMPS_SMART_SF)) + #if DOGLCD_SCK == SCK_PIN && DOGLCD_MOSI == MOSI_PIN && !SMART_RAMPS + U8GLIB_64128N_2X_HAL u8g(DOGLCD_CS, DOGLCD_A0); // using HW-SPI + #else + U8GLIB_64128N_2X_HAL u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // using SW-SPI + #endif + +#elif ENABLED(MKS_12864OLED_SSD1306) + // MKS 128x64 (SSD1306) OLED I2C LCD + U8GLIB_SSD1306_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 8 stripes + //U8GLIB_SSD1306_128X64_2X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 4 stripes + +#elif ENABLED(U8GLIB_SSD1306) + // Generic support for SSD1306 OLED I2C LCDs + //U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes + U8GLIB_SSD1306_128X64_2X u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes + +#elif ENABLED(MKS_12864OLED) + // MKS 128x64 (SH1106) OLED I2C LCD + U8GLIB_SH1106_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 8 stripes + //U8GLIB_SH1106_128X64_2X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0); // 4 stripes +#elif ENABLED(U8GLIB_SH1106) + // Generic support for SH1106 OLED I2C LCDs + //U8GLIB_SH1106_128X64_2X_I2C_2_WIRE u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes + U8GLIB_SH1106_128X64_2X u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); // 4 stripes +#elif ENABLED(U8GLIB_SSD1309) + // Generic support for SSD1309 OLED I2C LCDs + U8GLIB_SSD1309_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST); +#elif ENABLED(MINIPANEL) + // The MINIPanel display + //U8GLIB_MINI12864 u8g(DOGLCD_CS, DOGLCD_A0); // 8 stripes + U8GLIB_MINI12864_2X u8g(DOGLCD_CS, DOGLCD_A0); // 4 stripes +#elif ENABLED(U8GLIB_SH1106_EINSTART) + // Connected via motherboard header + U8GLIB_SH1106_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS); +#else + // for regular DOGM128 display with HW-SPI + //U8GLIB_DOGM128 u8g(DOGLCD_CS, DOGLCD_A0); // HW-SPI Com: CS, A0 // 8 stripes + U8GLIB_DOGM128_2X u8g(DOGLCD_CS, DOGLCD_A0); // HW-SPI Com: CS, A0 // 4 stripes +#endif + +U8GLIB *pu8g = &u8g; + +#ifndef LCD_PIXEL_WIDTH + #define LCD_PIXEL_WIDTH 128 +#endif +#ifndef LCD_PIXEL_HEIGHT + #define LCD_PIXEL_HEIGHT 64 +#endif + +#include "lcdprint.h" + +int16_t lcd_contrast; // Initialized by settings.load() +static char currentfont = 0; + +// The current graphical page being rendered +u8g_page_t &page = ((u8g_pb_t *)((u8g.getU8g())->dev->dev_mem))->p; + +// For selective rendering within a Y range +#define PAGE_UNDER(yb) (u8g.getU8g()->current_page.y0 <= (yb)) +#define PAGE_CONTAINS(ya, yb) (PAGE_UNDER(yb) && u8g.getU8g()->current_page.y1 >= (ya)) + +static void lcd_setFont(const char font_nr) { + switch (font_nr) { + case FONT_STATUSMENU : {u8g.setFont(FONT_STATUSMENU_NAME); currentfont = FONT_STATUSMENU;}; break; + default: + case FONT_MENU : {u8g.setFont(FONT_MENU_NAME); currentfont = FONT_MENU;}; break; + case FONT_SPECIAL : {u8g.setFont(FONT_SPECIAL_NAME); currentfont = FONT_SPECIAL;}; break; + case FONT_MENU_EDIT : {u8g.setFont(FONT_MENU_EDIT_NAME); currentfont = FONT_MENU_EDIT;}; break; + } +} + +#if ENABLED(SHOW_BOOTSCREEN) + + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + + void lcd_custom_bootscreen() { + constexpr u8g_uint_t left = (LCD_PIXEL_WIDTH - (CUSTOM_BOOTSCREEN_BMPWIDTH)) / 2, + top = (LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT)) / 2; + #if ENABLED(CUSTOM_BOOTSCREEN_INVERTED) + constexpr u8g_uint_t right = left + CUSTOM_BOOTSCREEN_BMPWIDTH, + bottom = top + CUSTOM_BOOTSCREEN_BMPHEIGHT; + #endif + u8g.firstPage(); + do { + u8g.drawBitmapP( + left, top, + CEILING(CUSTOM_BOOTSCREEN_BMPWIDTH, 8), CUSTOM_BOOTSCREEN_BMPHEIGHT, custom_start_bmp + ); + #if ENABLED(CUSTOM_BOOTSCREEN_INVERTED) + u8g.setColorIndex(1); + if (top) u8g.drawBox(0, 0, LCD_PIXEL_WIDTH, top); + if (left) u8g.drawBox(0, top, left, CUSTOM_BOOTSCREEN_BMPHEIGHT); + if (right < LCD_PIXEL_WIDTH) u8g.drawBox(right, top, LCD_PIXEL_WIDTH - right, CUSTOM_BOOTSCREEN_BMPHEIGHT); + if (bottom < LCD_PIXEL_HEIGHT) u8g.drawBox(0, bottom, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT - bottom); + #endif + } while (u8g.nextPage()); + safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT); + } + + #endif // SHOW_CUSTOM_BOOTSCREEN + + void lcd_bootscreen() { + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + lcd_custom_bootscreen(); + #endif + + constexpr uint8_t offy = + #if ENABLED(START_BMPHIGH) + (LCD_PIXEL_HEIGHT - (START_BMPHEIGHT)) / 2 + #else + DOG_CHAR_HEIGHT + #endif + ; + + const uint8_t width = u8g.getWidth(), height = u8g.getHeight(), + offx = (width - (START_BMPWIDTH)) / 2; + + u8g.firstPage(); + do { + u8g.drawBitmapP(offx, offy, (START_BMPWIDTH + 7) / 8, START_BMPHEIGHT, start_bmp); + lcd_setFont(FONT_MENU); + #ifndef STRING_SPLASH_LINE2 + const uint8_t txt1X = width - (sizeof(STRING_SPLASH_LINE1) - 1) * (DOG_CHAR_WIDTH); + u8g.drawStr(txt1X, (height + DOG_CHAR_HEIGHT) / 2, STRING_SPLASH_LINE1); + #else + const uint8_t txt1X = (width - (sizeof(STRING_SPLASH_LINE1) - 1) * (DOG_CHAR_WIDTH)) / 2, + txt2X = (width - (sizeof(STRING_SPLASH_LINE2) - 1) * (DOG_CHAR_WIDTH)) / 2; + u8g.drawStr(txt1X, height - (DOG_CHAR_HEIGHT) * 3 / 2, STRING_SPLASH_LINE1); + u8g.drawStr(txt2X, height - (DOG_CHAR_HEIGHT) * 1 / 2, STRING_SPLASH_LINE2); + #endif + } while (u8g.nextPage()); + safe_delay(BOOTSCREEN_TIMEOUT); + } + +#endif // SHOW_BOOTSCREEN + +#if ENABLED(LIGHTWEIGHT_UI) + #include "dogm/status_screen_lite_ST7920.h" +#else + #include "dogm/status_screen_DOGM.h" +#endif + +// Initialize or re-initialize the LCD +static void lcd_implementation_init() { + + #if PIN_EXISTS(LCD_BACKLIGHT) // Enable LCD backlight + OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH); + #endif + + #if ENABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) + SET_OUTPUT(LCD_PINS_DC); + #if !defined(LCD_RESET_PIN) + #define LCD_RESET_PIN LCD_PINS_RS + #endif + #endif + + #if PIN_EXISTS(LCD_RESET) + OUT_WRITE(LCD_RESET_PIN, LOW); // perform a clean hardware reset + _delay_ms(5); + OUT_WRITE(LCD_RESET_PIN, HIGH); + _delay_ms(5); // delay to allow the display to initalize + #endif + + #if PIN_EXISTS(LCD_RESET) + u8g.begin(); + #endif + + #if DISABLED(MINIPANEL) // setContrast not working for Mini Panel + u8g.setContrast(lcd_contrast); + #endif + + #if ENABLED(LCD_SCREEN_ROT_90) + u8g.setRot90(); // Rotate screen by 90° + #elif ENABLED(LCD_SCREEN_ROT_180) + u8g.setRot180(); // Rotate screen by 180° + #elif ENABLED(LCD_SCREEN_ROT_270) + u8g.setRot270(); // Rotate screen by 270° + #endif + + uxg_SetUtf8Fonts (g_fontinfo, NUM_ARRAY(g_fontinfo)); +} + +// The kill screen is displayed for unrecoverable conditions +void lcd_kill_screen() { + #if ENABLED(LIGHTWEIGHT_UI) + ST7920_Lite_Status_Screen::clear_text_buffer(); + #endif + const uint8_t h4 = u8g.getHeight() / 4; + u8g.firstPage(); + do { + lcd_setFont(FONT_MENU); + lcd_moveto(0, h4 * 1); + lcd_put_u8str(lcd_status_message); + lcd_moveto(0, h4 * 2); + lcd_put_u8str_P(PSTR(MSG_HALTED)); + lcd_moveto(0, h4 * 3); + lcd_put_u8str_P(PSTR(MSG_PLEASE_RESET)); + } while (u8g.nextPage()); +} + +void lcd_implementation_clear() { } // Automatically cleared by Picture Loop + +#if ENABLED(ULTIPANEL) + + uint8_t row_y1, row_y2; + uint8_t constexpr row_height = DOG_CHAR_HEIGHT + 2 * (TALL_FONT_CORRECTION); + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + + static void lcd_implementation_hotend_status(const uint8_t row, const uint8_t extruder=active_extruder) { + row_y1 = row * row_height + 1; + row_y2 = row_y1 + row_height - 1; + + if (!PAGE_CONTAINS(row_y1 + 1, row_y2 + 2)) return; + + lcd_moveto(LCD_PIXEL_WIDTH - 11 * (DOG_CHAR_WIDTH), row_y2); + lcd_put_wchar('E'); + lcd_put_wchar((char)('1' + extruder)); + lcd_put_wchar(' '); + lcd_put_u8str(itostr3(thermalManager.degHotend(extruder))); + lcd_put_wchar('/'); + + if (lcd_blink() || !thermalManager.is_heater_idle(extruder)) + lcd_put_u8str(itostr3(thermalManager.degTargetHotend(extruder))); + } + + #endif // ADVANCED_PAUSE_FEATURE + + // Set the colors for a menu item based on whether it is selected + static bool lcd_implementation_mark_as_selected(const uint8_t row, const bool isSelected) { + row_y1 = row * row_height + 1; + row_y2 = row_y1 + row_height - 1; + + if (!PAGE_CONTAINS(row_y1 + 1, row_y2 + 2)) return false; + + if (isSelected) { + #if ENABLED(MENU_HOLLOW_FRAME) + u8g.drawHLine(0, row_y1 + 1, LCD_PIXEL_WIDTH); + u8g.drawHLine(0, row_y2 + 2, LCD_PIXEL_WIDTH); + #else + u8g.setColorIndex(1); // black on white + u8g.drawBox(0, row_y1 + 2, LCD_PIXEL_WIDTH, row_height - 1); + u8g.setColorIndex(0); // white on black + #endif + } + #if DISABLED(MENU_HOLLOW_FRAME) + else { + u8g.setColorIndex(1); // unmarked text is black on white + } + #endif + + if (!PAGE_CONTAINS(row_y1, row_y2)) return false; + + lcd_moveto((START_COL) * (DOG_CHAR_WIDTH), row_y2); + return true; + } + + // Draw a static line of text in the same idiom as a menu item + static void lcd_implementation_drawmenu_static(const uint8_t row, const char* pstr, const bool center=true, const bool invert=false, const char* valstr=NULL) { + + if (lcd_implementation_mark_as_selected(row, invert)) { + + uint8_t n = LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH) * (START_COL); // pixel width of string allowed + + if (center && !valstr) { + int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; + while (--pad >= 0) { lcd_put_wchar(' '); n--; } + } + n -= lcd_put_u8str_max_P(pstr, n); + if (NULL != valstr) { + n -= lcd_put_u8str_max(valstr, n); + } + + while (n - DOG_CHAR_WIDTH > 0) { n -= lcd_put_wchar(' '); } + } + } + + // Draw a generic menu item + static void lcd_implementation_drawmenu_generic(const bool isSelected, const uint8_t row, const char* pstr, const char pre_char, const char post_char) { + UNUSED(pre_char); + + if (lcd_implementation_mark_as_selected(row, isSelected)) { + uint8_t n = LCD_WIDTH - (START_COL) - 2; + n *= DOG_CHAR_WIDTH; + n -= lcd_put_u8str_max_P(pstr, n); + while (n - DOG_CHAR_WIDTH > 0) { n -= lcd_put_wchar(' '); } + lcd_moveto(LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH), row_y2); + lcd_put_wchar(post_char); + lcd_put_wchar(' '); + } + } + + // Macros for specific types of menu items + #define lcd_implementation_drawmenu_back(sel, row, pstr, dummy) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]) + #define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]) + #define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ') + #define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ') + + // Draw a menu item with an editable value + static void _drawmenu_setting_edit_generic(const bool isSelected, const uint8_t row, const char* pstr, const char* const data, const bool pgm) { + if (lcd_implementation_mark_as_selected(row, isSelected)) { + const uint8_t vallen = (pgm ? utf8_strlen_P(data) : utf8_strlen((char*)data)); + uint8_t n = LCD_WIDTH - (START_COL) - 2 - vallen; + n *= DOG_CHAR_WIDTH; + n -= lcd_put_u8str_max_P(pstr, n); + lcd_put_wchar(':'); + while (n - DOG_CHAR_WIDTH > 0) { n -= lcd_put_wchar(' '); } + lcd_moveto(LCD_PIXEL_WIDTH - (DOG_CHAR_WIDTH) * vallen, row_y2); + if (pgm) lcd_put_u8str_P(data); else lcd_put_u8str((char*)data); + } + } + + // Macros for edit items + #define lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, data) _drawmenu_setting_edit_generic(sel, row, pstr, data, false) + #define lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, data) _drawmenu_setting_edit_generic(sel, row, pstr, data, true) + + #define DRAWMENU_SETTING_EDIT_GENERIC(_src) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, _src) + #define DRAW_BOOL_SETTING(sel, row, pstr, data) lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) + + void lcd_implementation_drawedit(const char* const pstr, const char* const value=NULL) { + const uint8_t labellen = utf8_strlen_P(pstr), + vallen = utf8_strlen(value); + + uint8_t rows = (labellen > LCD_WIDTH - 2 - vallen) ? 2 : 1; + + #if ENABLED(USE_BIG_EDIT_FONT) + constexpr uint8_t lcd_width_edit = (LCD_PIXEL_WIDTH) / (DOG_CHAR_WIDTH_EDIT); + + uint8_t lcd_width, char_width; + if (labellen <= lcd_width_edit - 1) { + if (labellen + vallen + 2 >= lcd_width_edit) rows = 2; + lcd_width = lcd_width_edit + 1; + char_width = DOG_CHAR_WIDTH_EDIT; + lcd_setFont(FONT_MENU_EDIT); + } + else { + lcd_width = LCD_WIDTH - (START_COL); + char_width = DOG_CHAR_WIDTH; + lcd_setFont(FONT_MENU); + } + #else + constexpr uint8_t lcd_width = LCD_WIDTH - (START_COL), + char_width = DOG_CHAR_WIDTH; + #endif + + // Center either one or two rows + const uint8_t segmentHeight = u8g.getHeight() / (rows + 1); // 1 / (rows+1) = 1/2 or 1/3 + uint8_t baseline = segmentHeight + (DOG_CHAR_HEIGHT_EDIT + 1) / 2; + + bool onpage = PAGE_CONTAINS(baseline + 1 - (DOG_CHAR_HEIGHT_EDIT), baseline); + if (onpage) { + lcd_moveto(0, baseline); + lcd_put_u8str_P(pstr); + } + + if (value != NULL) { + lcd_put_wchar(':'); + if (rows == 2) { + baseline += segmentHeight; + onpage = PAGE_CONTAINS(baseline + 1 - (DOG_CHAR_HEIGHT_EDIT), baseline); + } + if (onpage) { + lcd_moveto(((lcd_width - 1) - (vallen + 1)) * char_width, baseline); // Right-justified, leaving padded by spaces + lcd_put_wchar(' '); // overwrite char if value gets shorter + lcd_put_u8str(value); + } + } + } + + #if ENABLED(SDSUPPORT) + + static void _drawmenu_sd(const bool isSelected, const uint8_t row, const char* const pstr, CardReader &theCard, const bool isDir) { + UNUSED(pstr); + + lcd_implementation_mark_as_selected(row, isSelected); + + if (!PAGE_CONTAINS(row_y1, row_y2)) return; + + constexpr uint8_t maxlen = LCD_WIDTH - (START_COL) - 1; + const char *outstr = theCard.longest_filename(); + if (theCard.longFilename[0]) { + #if ENABLED(SCROLL_LONG_FILENAMES) + if (isSelected) { + uint8_t name_hash = row; + for (uint8_t l = FILENAME_LENGTH; l--;) + name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ theCard.filename[l]; // rotate, xor + if (filename_scroll_hash != name_hash) { // If the hash changed... + filename_scroll_hash = name_hash; // Save the new hash + filename_scroll_max = MAX(0, utf8_strlen(theCard.longFilename) - maxlen); // Update the scroll limit + filename_scroll_pos = 0; // Reset scroll to the start + lcd_status_update_delay = 8; // Don't scroll right away + } + outstr += filename_scroll_pos; + } + #else + theCard.longFilename[maxlen] = '\0'; // cutoff at screen edge + #endif + } + + if (isDir) lcd_put_wchar(LCD_STR_FOLDER[0]); + + int n; + n = lcd_put_u8str_max(outstr, maxlen * (DOG_CHAR_WIDTH)); + n = maxlen * (DOG_CHAR_WIDTH) - n; + while (n - DOG_CHAR_WIDTH > 0) { n -= lcd_put_wchar(' '); } + } + + #define lcd_implementation_drawmenu_sdfile(sel, row, pstr, theCard) _drawmenu_sd(sel, row, pstr, theCard, false) + #define lcd_implementation_drawmenu_sddirectory(sel, row, pstr, theCard) _drawmenu_sd(sel, row, pstr, theCard, true) + + #endif // SDSUPPORT + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + /** + * UBL LCD "radar" map data + */ + #define MAP_UPPER_LEFT_CORNER_X 35 // These probably should be moved to the .h file But for now, + #define MAP_UPPER_LEFT_CORNER_Y 8 // it is easier to play with things having them here + #define MAP_MAX_PIXELS_X 53 + #define MAP_MAX_PIXELS_Y 49 + + void lcd_implementation_ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + // Scale the box pixels appropriately + uint8_t x_map_pixels = ((MAP_MAX_PIXELS_X - 4) / (GRID_MAX_POINTS_X)) * (GRID_MAX_POINTS_X), + y_map_pixels = ((MAP_MAX_PIXELS_Y - 4) / (GRID_MAX_POINTS_Y)) * (GRID_MAX_POINTS_Y), + + pixels_per_x_mesh_pnt = x_map_pixels / (GRID_MAX_POINTS_X), + pixels_per_y_mesh_pnt = y_map_pixels / (GRID_MAX_POINTS_Y), + + x_offset = MAP_UPPER_LEFT_CORNER_X + 1 + (MAP_MAX_PIXELS_X - x_map_pixels - 2) / 2, + y_offset = MAP_UPPER_LEFT_CORNER_Y + 1 + (MAP_MAX_PIXELS_Y - y_map_pixels - 2) / 2; + + // Clear the Mesh Map + + if (PAGE_CONTAINS(y_offset - 2, y_offset + y_map_pixels + 4)) { + u8g.setColorIndex(1); // First draw the bigger box in White so we have a border around the mesh map box + u8g.drawBox(x_offset - 2, y_offset - 2, x_map_pixels + 4, y_map_pixels + 4); + if (PAGE_CONTAINS(y_offset, y_offset + y_map_pixels)) { + u8g.setColorIndex(0); // Now actually clear the mesh map box + u8g.drawBox(x_offset, y_offset, x_map_pixels, y_map_pixels); + } + } + + // Display Mesh Point Locations + + u8g.setColorIndex(1); + const uint8_t sx = x_offset + pixels_per_x_mesh_pnt / 2; + uint8_t y = y_offset + pixels_per_y_mesh_pnt / 2; + for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++, y += pixels_per_y_mesh_pnt) + if (PAGE_CONTAINS(y, y)) + for (uint8_t i = 0, x = sx; i < GRID_MAX_POINTS_X; i++, x += pixels_per_x_mesh_pnt) + u8g.drawBox(x, y, 1, 1); + + // Fill in the Specified Mesh Point + + uint8_t inverted_y = GRID_MAX_POINTS_Y - y_plot - 1; // The origin is typically in the lower right corner. We need to + // invert the Y to get it to plot in the right location. + + const uint8_t by = y_offset + inverted_y * pixels_per_y_mesh_pnt; + if (PAGE_CONTAINS(by, by + pixels_per_y_mesh_pnt)) + u8g.drawBox( + x_offset + x_plot * pixels_per_x_mesh_pnt, by, + pixels_per_x_mesh_pnt, pixels_per_y_mesh_pnt + ); + + // Put Relevant Text on Display + + // Show X and Y positions at top of screen + u8g.setColorIndex(1); + if (PAGE_UNDER(7)) { + lcd_moveto(5, 7); + lcd_put_u8str("X:"); + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot])))); + lcd_moveto(74, 7); + lcd_put_u8str("Y:"); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot])))); + } + + // Print plot position + if (PAGE_CONTAINS(LCD_PIXEL_HEIGHT - (INFO_FONT_HEIGHT - 1), LCD_PIXEL_HEIGHT)) { + lcd_moveto(5, LCD_PIXEL_HEIGHT); + lcd_put_wchar('('); + u8g.print(x_plot); + lcd_put_wchar(','); + u8g.print(y_plot); + lcd_put_wchar(')'); + + // Show the location value + lcd_moveto(74, LCD_PIXEL_HEIGHT); + lcd_put_u8str("Z:"); + if (!isnan(ubl.z_values[x_plot][y_plot])) + lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); + else + lcd_put_u8str_P(PSTR(" -----")); + } + + } + + #endif // AUTO_BED_LEVELING_UBL + +#endif // ULTIPANEL + +#endif // __ULTRALCD_IMPL_DOGM_H diff --git a/Marlin/src/lcd/ultralcd_impl_HD44780.h b/Marlin/src/lcd/ultralcd_impl_HD44780.h new file mode 100644 index 0000000000..61437f5c3f --- /dev/null +++ b/Marlin/src/lcd/ultralcd_impl_HD44780.h @@ -0,0 +1,1472 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef ULTRALCD_IMPL_HD44780_H +#define ULTRALCD_IMPL_HD44780_H + +/** + * Implementation of the LCD display routines for a Hitachi HD44780 display. + * These are the most common LCD character displays. + */ + +#include "ultralcd_common_HD44780.h" + +//////////////////////////////////// +// Create LCD class instance and chipset-specific information +#if ENABLED(LCD_I2C_TYPE_PCF8575) + LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_I2C_PIN_EN, LCD_I2C_PIN_RW, LCD_I2C_PIN_RS, LCD_I2C_PIN_D4, LCD_I2C_PIN_D5, LCD_I2C_PIN_D6, LCD_I2C_PIN_D7); + +#elif ENABLED(LCD_I2C_TYPE_MCP23017) + #if ENABLED(DETECT_DEVICE) + LCD_CLASS lcd(LCD_I2C_ADDRESS, 1); + #else + LCD_CLASS lcd(LCD_I2C_ADDRESS); + #endif + +#elif ENABLED(LCD_I2C_TYPE_MCP23008) + #if ENABLED(DETECT_DEVICE) + LCD_CLASS lcd(LCD_I2C_ADDRESS, 1); + #else + LCD_CLASS lcd(LCD_I2C_ADDRESS); + #endif + +#elif ENABLED(LCD_I2C_TYPE_PCA8574) + LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_WIDTH, LCD_HEIGHT); + +// 2 wire Non-latching LCD SR from: +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection +#elif ENABLED(SR_LCD_2W_NL) + #if PIN_EXISTS(SR_STROBE) + LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN, SR_STROBE_PIN); + #else + LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN); + #endif + +#elif ENABLED(LCM1602) + LCD_CLASS lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); + +#else + // Standard directly connected LCD implementations + LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5, LCD_PINS_D6, LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7 +#endif + +#include "fontutils.h" +#include "lcdprint.h" + +#if ENABLED(LCD_PROGRESS_BAR) + static millis_t progress_bar_ms = 0; // Start millis of the current progress bar cycle + #if PROGRESS_MSG_EXPIRE > 0 + static millis_t expire_status_ms = 0; // millis at which to expire the status message + #endif +#endif + +#if ENABLED(LCD_HAS_STATUS_INDICATORS) + static void lcd_implementation_update_indicators(); +#endif + +static void createChar_P(const char c, const byte * const ptr) { + byte temp[8]; + for (uint8_t i = 0; i < 8; i++) + temp[i] = pgm_read_byte(&ptr[i]); + lcd.createChar(c, temp); +} + +static void lcd_set_custom_characters( + #if ENABLED(LCD_PROGRESS_BAR) || ENABLED(SHOW_BOOTSCREEN) + const uint8_t screen_charset=CHARSET_INFO + #endif +) { + // CHARSET_BOOT + #if ENABLED(SHOW_BOOTSCREEN) + const static PROGMEM byte corner[4][8] = { { + B00000, + B00000, + B00000, + B00000, + B00001, + B00010, + B00100, + B00100 + }, { + B00000, + B00000, + B00000, + B11100, + B11100, + B01100, + B00100, + B00100 + }, { + B00100, + B00010, + B00001, + B00000, + B00000, + B00000, + B00000, + B00000 + }, { + B00100, + B01000, + B10000, + B00000, + B00000, + B00000, + B00000, + B00000 + } }; + #endif // SHOW_BOOTSCREEN + + // CHARSET_INFO + const static PROGMEM byte bedTemp[8] = { + B00000, + B11111, + B10101, + B10001, + B10101, + B11111, + B00000, + B00000 + }; + + const static PROGMEM byte degree[8] = { + B01100, + B10010, + B10010, + B01100, + B00000, + B00000, + B00000, + B00000 + }; + + const static PROGMEM byte thermometer[8] = { + B00100, + B01010, + B01010, + B01010, + B01010, + B10001, + B10001, + B01110 + }; + + const static PROGMEM byte uplevel[8] = { + B00100, + B01110, + B11111, + B00100, + B11100, + B00000, + B00000, + B00000 + }; + + const static PROGMEM byte feedrate[8] = { + B11100, + B10000, + B11000, + B10111, + B00101, + B00110, + B00101, + B00000 + }; + + const static PROGMEM byte clock[8] = { + B00000, + B01110, + B10011, + B10101, + B10001, + B01110, + B00000, + B00000 + }; + + #if ENABLED(LCD_PROGRESS_BAR) + + // CHARSET_INFO + const static PROGMEM byte progress[3][8] = { { + B00000, + B10000, + B10000, + B10000, + B10000, + B10000, + B10000, + B00000 + }, { + B00000, + B10100, + B10100, + B10100, + B10100, + B10100, + B10100, + B00000 + }, { + B00000, + B10101, + B10101, + B10101, + B10101, + B10101, + B10101, + B00000 + } }; + + #endif // LCD_PROGRESS_BAR + + #if ENABLED(SDSUPPORT) + + // CHARSET_MENU + const static PROGMEM byte refresh[8] = { + B00000, + B00110, + B11001, + B11000, + B00011, + B10011, + B01100, + B00000, + }; + const static PROGMEM byte folder[8] = { + B00000, + B11100, + B11111, + B10001, + B10001, + B11111, + B00000, + B00000 + }; + + #endif // SDSUPPORT + + #if ENABLED(SHOW_BOOTSCREEN) + // Set boot screen corner characters + if (screen_charset == CHARSET_BOOT) { + for (uint8_t i = 4; i--;) + createChar_P(i, corner[i]); + } + else + #endif + { // Info Screen uses 5 special characters + createChar_P(LCD_BEDTEMP_CHAR, bedTemp); + createChar_P(LCD_DEGREE_CHAR, degree); + createChar_P(LCD_STR_THERMOMETER[0], thermometer); + createChar_P(LCD_FEEDRATE_CHAR, feedrate); + createChar_P(LCD_CLOCK_CHAR, clock); + + #if ENABLED(LCD_PROGRESS_BAR) + if (screen_charset == CHARSET_INFO) { // 3 Progress bar characters for info screen + for (int16_t i = 3; i--;) + createChar_P(LCD_STR_PROGRESS[i], progress[i]); + } + else + #endif + { + createChar_P(LCD_UPLEVEL_CHAR, uplevel); + #if ENABLED(SDSUPPORT) + // SD Card sub-menu special characters + createChar_P(LCD_STR_REFRESH[0], refresh); + createChar_P(LCD_STR_FOLDER[0], folder); + #endif + } + } + +} + +static void lcd_implementation_init( + #if ENABLED(LCD_PROGRESS_BAR) + const uint8_t screen_charset=CHARSET_INFO + #endif +) { + + #if ENABLED(LCD_I2C_TYPE_PCF8575) + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + #ifdef LCD_I2C_PIN_BL + lcd.setBacklightPin(LCD_I2C_PIN_BL, POSITIVE); + lcd.setBacklight(HIGH); + #endif + + #elif ENABLED(LCD_I2C_TYPE_MCP23017) + lcd.setMCPType(LTI_TYPE_MCP23017); + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + lcd_implementation_update_indicators(); + + #elif ENABLED(LCD_I2C_TYPE_MCP23008) + lcd.setMCPType(LTI_TYPE_MCP23008); + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + + #elif ENABLED(LCD_I2C_TYPE_PCA8574) + lcd.init(); + lcd.backlight(); + + #else + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + #endif + + lcd_set_custom_characters( + #if ENABLED(LCD_PROGRESS_BAR) + screen_charset + #endif + ); + + lcd.clear(); +} + +void lcd_implementation_clear() { lcd.clear(); } + +#if ENABLED(SHOW_BOOTSCREEN) + + void lcd_erase_line(const int16_t line) { + lcd_moveto(0, line); + for (uint8_t i = LCD_WIDTH + 1; --i;) + lcd_put_wchar(' '); + } + + // Scroll the PSTR 'text' in a 'len' wide field for 'time' milliseconds at position col,line + void lcd_scroll(const uint8_t col, const uint8_t line, const char* const text, const uint8_t len, const int16_t time) { + uint8_t slen = utf8_strlen_P(text); + if (slen < len) { + // Fits into, + lcd_moveto(col, line); + lcd_put_u8str_max_P(text, len); + while (slen < len) { + lcd_put_wchar(' '); + ++slen; + } + safe_delay(time); + } + else { + const char* p = text; + int dly = time / MAX(slen, 1); + for (uint8_t i = 0; i <= slen; i++) { + + // Go to the correct place + lcd_moveto(col, line); + + // Print the text + lcd_put_u8str_max_P(p, len); + + // Fill with spaces + uint8_t ix = slen - i; + while (ix < len) { + lcd_put_wchar(' '); + ++ix; + } + + // Delay + safe_delay(dly); + + // Advance to the next UTF8 valid position + p++; + while (!START_OF_UTF8_CHAR(pgm_read_byte(p))) p++; + } + } + } + + static void logo_lines(const char* const extra) { + int16_t indent = (LCD_WIDTH - 8 - utf8_strlen_P(extra)) / 2; + lcd_moveto(indent, 0); lcd_put_wchar('\x00'); lcd_put_u8str_P(PSTR( "------" )); lcd_put_wchar('\x01'); + lcd_moveto(indent, 1); lcd_put_u8str_P(PSTR("|Marlin|")); lcd_put_u8str_P(extra); + lcd_moveto(indent, 2); lcd_put_wchar('\x02'); lcd_put_u8str_P(PSTR( "------" )); lcd_put_wchar('\x03'); + } + + void lcd_bootscreen() { + lcd_set_custom_characters(CHARSET_BOOT); + lcd.clear(); + + #define LCD_EXTRA_SPACE (LCD_WIDTH-8) + + #define CENTER_OR_SCROLL(STRING,DELAY) \ + lcd_erase_line(3); \ + if (utf8_strlen(STRING) <= LCD_WIDTH) { \ + lcd_moveto((LCD_WIDTH - utf8_strlen_P(PSTR(STRING))) / 2, 3); \ + lcd_put_u8str_P(PSTR(STRING)); \ + safe_delay(DELAY); \ + } \ + else { \ + lcd_scroll(0, 3, PSTR(STRING), LCD_WIDTH, DELAY); \ + } + + #ifdef STRING_SPLASH_LINE1 + // + // Show the Marlin logo with splash line 1 + // + if (LCD_EXTRA_SPACE >= utf8_strlen(STRING_SPLASH_LINE1) + 1) { + // + // Show the Marlin logo, splash line1, and splash line 2 + // + logo_lines(PSTR(" " STRING_SPLASH_LINE1)); + #ifdef STRING_SPLASH_LINE2 + CENTER_OR_SCROLL(STRING_SPLASH_LINE2, 2000); + #else + safe_delay(2000); + #endif + } + else { + // + // Show the Marlin logo with splash line 1 + // After a delay show splash line 2, if it exists + // + #ifdef STRING_SPLASH_LINE2 + #define _SPLASH_WAIT_1 1500 + #else + #define _SPLASH_WAIT_1 2000 + #endif + logo_lines(PSTR("")); + CENTER_OR_SCROLL(STRING_SPLASH_LINE1, _SPLASH_WAIT_1); + #ifdef STRING_SPLASH_LINE2 + CENTER_OR_SCROLL(STRING_SPLASH_LINE2, 1500); + #endif + } + #elif defined(STRING_SPLASH_LINE2) + // + // Show splash line 2 only, alongside the logo if possible + // + if (LCD_EXTRA_SPACE >= utf8_strlen(STRING_SPLASH_LINE2) + 1) { + logo_lines(PSTR(" " STRING_SPLASH_LINE2)); + safe_delay(2000); + } + else { + logo_lines(PSTR("")); + CENTER_OR_SCROLL(STRING_SPLASH_LINE2, 2000); + } + #else + // + // Show only the Marlin logo + // + logo_lines(PSTR("")); + safe_delay(2000); + #endif + + lcd.clear(); + safe_delay(100); + lcd_set_custom_characters(); + lcd.clear(); + } + +#endif // SHOW_BOOTSCREEN + +void lcd_kill_screen() { + lcd_moveto(0, 0); + lcd_put_u8str(lcd_status_message); + #if LCD_HEIGHT < 4 + lcd_moveto(0, 2); + #else + lcd_moveto(0, 2); + lcd_put_u8str_P(PSTR(MSG_HALTED)); + lcd_moveto(0, 3); + #endif + lcd_put_u8str_P(PSTR(MSG_PLEASE_RESET)); +} + +// +// Before homing, blink '123' <-> '???'. +// Homed but unknown... '123' <-> ' '. +// Homed and known, display constantly. +// +FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { + lcd_put_wchar('X' + uint8_t(axis)); + if (blink) + lcd_put_u8str(value); + else { + if (!TEST(axis_homed, axis)) + while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); + else { + #if DISABLED(HOME_AFTER_DEACTIVATE) && DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) + if (!TEST(axis_known_position, axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); + else + #endif + lcd_put_u8str(value); + } + } +} + +FORCE_INLINE void _draw_heater_status(const int8_t heater, const char prefix, const bool blink) { + #if HAS_HEATED_BED + const bool isBed = heater < 0; + const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater)), + t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater)); + #else + const float t1 = thermalManager.degHotend(heater), t2 = thermalManager.degTargetHotend(heater); + #endif + + if (prefix >= 0) lcd_put_wchar(prefix); + + lcd_put_u8str(itostr3(t1 + 0.5)); + lcd_put_wchar('/'); + + #if !HEATER_IDLE_HANDLER + UNUSED(blink); + #else + const bool is_idle = ( + #if HAS_HEATED_BED + isBed ? thermalManager.is_bed_idle() : + #endif + thermalManager.is_heater_idle(heater) + ); + + if (!blink && is_idle) { + lcd_put_wchar(' '); + if (t2 >= 10) lcd_put_wchar(' '); + if (t2 >= 100) lcd_put_wchar(' '); + } + else + #endif + lcd_put_u8str(itostr3left(t2 + 0.5)); + + if (prefix >= 0) { + lcd_put_wchar(LCD_DEGREE_CHAR); + lcd_put_wchar(' '); + if (t2 < 10) lcd_put_wchar(' '); + } +} + +#if ENABLED(LCD_PROGRESS_BAR) + + inline void lcd_draw_progress_bar(const uint8_t percent) { + const int16_t tix = (int16_t)(percent * (LCD_WIDTH) * 3) / 100, + cel = tix / 3, + rem = tix % 3; + uint8_t i = LCD_WIDTH; + char msg[LCD_WIDTH + 1], b = ' '; + msg[LCD_WIDTH] = '\0'; + while (i--) { + if (i == cel - 1) + b = LCD_STR_PROGRESS[2]; + else if (i == cel && rem != 0) + b = LCD_STR_PROGRESS[rem - 1]; + msg[i] = b; + } + lcd_put_u8str(msg); + } + +#endif // LCD_PROGRESS_BAR + +/** +Possible status screens: +16x2 |000/000 B000/000| + |0123456789012345| + +16x4 |000/000 B000/000| + |SD100% Z 000.00| + |F100% T--:--| + |0123456789012345| + +20x2 |T000/000D B000/000D | + |01234567890123456789| + +20x4 |T000/000D B000/000D | + |X 000 Y 000 Z 000.00| + |F100% SD100% T--:--| + |01234567890123456789| + +20x4 |T000/000D B000/000D | + |T000/000D Z 000.00| + |F100% SD100% T--:--| + |01234567890123456789| +*/ +static void lcd_implementation_status_screen() { + const bool blink = lcd_blink(); + + // + // Line 1 + // + + lcd_moveto(0, 0); + + #if LCD_WIDTH < 20 + + // + // Hotend 0 Temperature + // + _draw_heater_status(0, -1, blink); + + // + // Hotend 1 or Bed Temperature + // + #if HOTENDS > 1 || HAS_HEATED_BED + + lcd_moveto(8, 0); + #if HOTENDS > 1 + lcd_put_wchar((char)LCD_STR_THERMOMETER[0]); + _draw_heater_status(1, -1, blink); + #else + lcd_put_wchar((char)LCD_BEDTEMP_CHAR); + _draw_heater_status(-1, -1, blink); + #endif + + #endif // HOTENDS > 1 || HAS_HEATED_BED + + #else // LCD_WIDTH >= 20 + + // + // Hotend 0 Temperature + // + _draw_heater_status(0, LCD_STR_THERMOMETER[0], blink); + + // + // Hotend 1 or Bed Temperature + // + #if HOTENDS > 1 || HAS_HEATED_BED + lcd_moveto(10, 0); + #if HOTENDS > 1 + _draw_heater_status(1, LCD_STR_THERMOMETER[0], blink); + #else + _draw_heater_status(-1, ( + #if HAS_LEVELING + planner.leveling_active && blink ? '_' : + #endif + LCD_BEDTEMP_CHAR + ), blink); + #endif + + #endif // HOTENDS > 1 || HAS_HEATED_BED + + #endif // LCD_WIDTH >= 20 + + // + // Line 2 + // + + #if LCD_HEIGHT > 2 + + #if LCD_WIDTH < 20 + + #if ENABLED(SDSUPPORT) + lcd_moveto(0, 2); + lcd_put_u8str_P(PSTR("SD")); + if (IS_SD_PRINTING) + lcd_put_u8str(itostr3(card.percentDone())); + else + lcd_put_u8str_P(PSTR("---")); + lcd_put_wchar('%'); + #endif // SDSUPPORT + + #else // LCD_WIDTH >= 20 + + lcd_moveto(0, 1); + + // If the first line has two extruder temps, + // show more temperatures on the next line + + #if HOTENDS > 2 || (HOTENDS > 1 && HAS_HEATED_BED) + + #if HOTENDS > 2 + _draw_heater_status(2, LCD_STR_THERMOMETER[0], blink); + lcd_moveto(10, 1); + #endif + + _draw_heater_status(-1, ( + #if HAS_LEVELING + planner.leveling_active && blink ? '_' : + #endif + LCD_BEDTEMP_CHAR + ), blink); + + #else // HOTENDS <= 2 && (HOTENDS <= 1 || !HAS_HEATED_BED) + + _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); + + lcd_put_wchar(' '); + + _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); + + #endif // HOTENDS <= 2 && (HOTENDS <= 1 || !HAS_HEATED_BED) + + #endif // LCD_WIDTH >= 20 + + lcd_moveto(LCD_WIDTH - 8, 1); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink); + + #if HAS_LEVELING && !HAS_HEATED_BED + lcd_put_wchar(planner.leveling_active || blink ? '_' : ' '); + #endif + + #endif // LCD_HEIGHT > 2 + + // + // Line 3 + // + + #if LCD_HEIGHT > 3 + + lcd_moveto(0, 2); + lcd_put_wchar(LCD_FEEDRATE_CHAR); + lcd_put_u8str(itostr3(feedrate_percentage)); + lcd_put_wchar('%'); + + #if LCD_WIDTH >= 20 && ENABLED(SDSUPPORT) + + lcd_moveto(7, 2); + lcd_put_u8str_P(PSTR("SD")); + if (IS_SD_PRINTING) + lcd_put_u8str(itostr3(card.percentDone())); + else + lcd_put_u8str_P(PSTR("---")); + lcd_put_wchar('%'); + + #endif // LCD_WIDTH >= 20 && SDSUPPORT + + char buffer[10]; + duration_t elapsed = print_job_timer.duration(); + uint8_t len = elapsed.toDigital(buffer); + + lcd_moveto(LCD_WIDTH - len - 1, 2); + lcd_put_wchar(LCD_CLOCK_CHAR); + lcd_put_u8str(buffer); + + #endif // LCD_HEIGHT > 3 + + // + // Last Line + // Status Message (which may be a Progress Bar or Filament display) + // + + lcd_moveto(0, LCD_HEIGHT - 1); + + #if ENABLED(LCD_PROGRESS_BAR) + + // Draw the progress bar if the message has shown long enough + // or if there is no message set. + #if DISABLED(LCD_SET_PROGRESS_MANUALLY) + const uint8_t progress_bar_percent = card.percentDone(); + #endif + if (progress_bar_percent > 2 && (ELAPSED(millis(), progress_bar_ms + PROGRESS_BAR_MSG_TIME) || !lcd_status_message[0])) + return lcd_draw_progress_bar(progress_bar_percent); + + #elif ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) + + // Show Filament Diameter and Volumetric Multiplier % + // After allowing lcd_status_message to show for 5 seconds + if (ELAPSED(millis(), previous_lcd_status_ms + 5000UL)) { + lcd_put_u8str_P(PSTR("Dia ")); + lcd_put_u8str(ftostr12ns(filament_width_meas)); + lcd_put_u8str_P(PSTR(" V")); + lcd_put_u8str(itostr3(100.0 * ( + parser.volumetric_enabled + ? planner.volumetric_area_nominal / planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + : planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + ) + )); + lcd_put_wchar('%'); + return; + } + + #endif // FILAMENT_LCD_DISPLAY && SDSUPPORT + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + static bool last_blink = false; + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(lcd_status_message); + + // If the string fits into the LCD, just print it and do not scroll it + if (slen <= LCD_WIDTH) { + + // The string isn't scrolling and may not fill the screen + lcd_put_u8str(lcd_status_message); + + // Fill the rest with spaces + while (slen < LCD_WIDTH) { + lcd_put_wchar(' '); + ++slen; + } + } + else { + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + const char *stat = lcd_status_message + status_scroll_offset; + + // Get the string remaining length + const uint8_t rlen = utf8_strlen(stat); + + // If we have enough characters to display + if (rlen >= LCD_WIDTH) { + // The remaining string fills the screen - Print it + lcd_put_u8str_max(stat, LCD_WIDTH); + } + else { + + // The remaining string does not completely fill the screen + lcd_put_u8str_max(stat, LCD_WIDTH); // The string leaves space + uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters + + lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot + if (--chars) { // Draw a second dot if there's space + lcd_put_wchar('.'); + if (--chars) + lcd_put_u8str_max(lcd_status_message, chars); // Print a second copy of the message + } + } + if (last_blink != blink) { + last_blink = blink; + + // Adjust by complete UTF8 characters + if (status_scroll_offset < slen) { + status_scroll_offset++; + while (!START_OF_UTF8_CHAR(lcd_status_message[status_scroll_offset])) + status_scroll_offset++; + } + else + status_scroll_offset = 0; + } + } + #else + UNUSED(blink); + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(lcd_status_message); + + // Just print the string to the LCD + lcd_put_u8str_max(lcd_status_message, LCD_WIDTH); + + // Fill the rest with spaces if there are missing spaces + while (slen < LCD_WIDTH) { + lcd_put_wchar(' '); + ++slen; + } + #endif +} + +#if ENABLED(ULTIPANEL) + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + + static void lcd_implementation_hotend_status(const uint8_t row, const uint8_t extruder=active_extruder) { + if (row < LCD_HEIGHT) { + lcd_moveto(LCD_WIDTH - 9, row); + _draw_heater_status(extruder, LCD_STR_THERMOMETER[0], lcd_blink()); + } + } + + #endif // ADVANCED_PAUSE_FEATURE + + static void lcd_implementation_drawmenu_static(const uint8_t row, const char* pstr, const bool center=true, const bool invert=false, const char *valstr=NULL) { + UNUSED(invert); + int8_t n = LCD_WIDTH; + lcd_moveto(0, row); + if (center && !valstr) { + int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; + while (--pad >= 0) { lcd_put_wchar(' '); n--; } + } + n -= lcd_put_u8str_max_P(pstr, n); + if (valstr) n -= lcd_put_u8str_max(valstr, n); + for (; n > 0; --n) lcd_put_wchar(' '); + } + + static void lcd_implementation_drawmenu_generic(const bool sel, const uint8_t row, const char* pstr, const char pre_char, const char post_char) { + uint8_t n = LCD_WIDTH - 2; + lcd_moveto(0, row); + lcd_put_wchar(sel ? pre_char : ' '); + n -= lcd_put_u8str_max_P(pstr, n); + while (n--) lcd_put_wchar(' '); + lcd_put_wchar(post_char); + } + + static void lcd_implementation_drawmenu_setting_edit_generic(const bool sel, const uint8_t row, const char* pstr, const char pre_char, const char* const data) { + uint8_t n = LCD_WIDTH - 2 - utf8_strlen(data); + lcd_moveto(0, row); + lcd_put_wchar(sel ? pre_char : ' '); + n -= lcd_put_u8str_max_P(pstr, n); + lcd_put_wchar(':'); + while (n--) lcd_put_wchar(' '); + lcd_put_u8str(data); + } + static void lcd_implementation_drawmenu_setting_edit_generic_P(const bool sel, const uint8_t row, const char* pstr, const char pre_char, const char* const data) { + uint8_t n = LCD_WIDTH - 2 - utf8_strlen_P(data); + lcd_moveto(0, row); + lcd_put_wchar(sel ? pre_char : ' '); + n -= lcd_put_u8str_max_P(pstr, n); + lcd_put_wchar(':'); + while (n--) lcd_put_wchar(' '); + lcd_put_u8str_P(data); + } + + #define DRAWMENU_SETTING_EDIT_GENERIC(_src) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, '>', _src) + #define DRAW_BOOL_SETTING(sel, row, pstr, data) lcd_implementation_drawmenu_setting_edit_generic_P(sel, row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) + + void lcd_implementation_drawedit(const char* pstr, const char* const value=NULL) { + lcd_moveto(1, 1); + lcd_put_u8str_P(pstr); + if (value != NULL) { + lcd_put_wchar(':'); + int len = utf8_strlen(value); + const uint8_t valrow = (utf8_strlen_P(pstr) + 1 + len + 1) > (LCD_WIDTH - 2) ? 2 : 1; // Value on the next row if it won't fit + lcd_moveto((LCD_WIDTH - 1) - (len + 1), valrow); // Right-justified, padded by spaces + lcd_put_wchar(' '); // overwrite char if value gets shorter + lcd_put_u8str(value); + } + } + + #if ENABLED(SDSUPPORT) + + static void lcd_implementation_drawmenu_sd(const bool sel, const uint8_t row, const char* const pstr, CardReader &theCard, const uint8_t concat, const char post_char) { + UNUSED(pstr); + lcd_moveto(0, row); + lcd_put_wchar(sel ? '>' : ' '); + + uint8_t n = LCD_WIDTH - concat; + const char *outstr = theCard.longest_filename(); + if (theCard.longFilename[0]) { + #if ENABLED(SCROLL_LONG_FILENAMES) + if (sel) { + uint8_t name_hash = row; + for (uint8_t l = FILENAME_LENGTH; l--;) + name_hash = ((name_hash << 1) | (name_hash >> 7)) ^ theCard.filename[l]; // rotate, xor + if (filename_scroll_hash != name_hash) { // If the hash changed... + filename_scroll_hash = name_hash; // Save the new hash + filename_scroll_max = MAX(0, utf8_strlen(theCard.longFilename) - n); // Update the scroll limit + filename_scroll_pos = 0; // Reset scroll to the start + lcd_status_update_delay = 8; // Don't scroll right away + } + outstr += filename_scroll_pos; + } + #else + theCard.longFilename[n] = '\0'; // cutoff at screen edge + #endif + } + + lcd_moveto(0, row); + lcd_put_wchar(sel ? '>' : ' '); + n -= lcd_put_u8str_max(outstr, n); + + while (n) { --n; lcd_put_wchar(' '); } + lcd_put_wchar(post_char); + } + + static void lcd_implementation_drawmenu_sdfile(const bool sel, const uint8_t row, const char* pstr, CardReader &theCard) { + lcd_implementation_drawmenu_sd(sel, row, pstr, theCard, 2, ' '); + } + + static void lcd_implementation_drawmenu_sddirectory(const bool sel, const uint8_t row, const char* pstr, CardReader &theCard) { + lcd_implementation_drawmenu_sd(sel, row, pstr, theCard, 2, LCD_STR_FOLDER[0]); + } + + #endif // SDSUPPORT + + #define lcd_implementation_drawmenu_back(sel, row, pstr, dummy) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_UPLEVEL_CHAR, LCD_UPLEVEL_CHAR) + #define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]) + #define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ') + #define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ') + + #if ENABLED(LCD_HAS_SLOW_BUTTONS) + + extern millis_t next_button_update_ms; + + static uint8_t lcd_implementation_read_slow_buttons() { + #if ENABLED(LCD_I2C_TYPE_MCP23017) + // Reading these buttons this is likely to be too slow to call inside interrupt context + // so they are called during normal lcd_update + uint8_t slow_bits = lcd.readButtons() << B_I2C_BTN_OFFSET; + #if ENABLED(LCD_I2C_VIKI) + if ((slow_bits & (B_MI | B_RI)) && PENDING(millis(), next_button_update_ms)) // LCD clicked + slow_bits &= ~(B_MI | B_RI); // Disable LCD clicked buttons if screen is updated + #endif // LCD_I2C_VIKI + return slow_bits; + #endif // LCD_I2C_TYPE_MCP23017 + } + + #endif // LCD_HAS_SLOW_BUTTONS + + #if ENABLED(LCD_HAS_STATUS_INDICATORS) + + static void lcd_implementation_update_indicators() { + // Set the LEDS - referred to as backlights by the LiquidTWI2 library + static uint8_t ledsprev = 0; + uint8_t leds = 0; + + if (thermalManager.degTargetBed() > 0) leds |= LED_A; + + if (thermalManager.degTargetHotend(0) > 0) leds |= LED_B; + + #if FAN_COUNT > 0 + if (0 + #if HAS_FAN0 + || fanSpeeds[0] + #endif + #if HAS_FAN1 + || fanSpeeds[1] + #endif + #if HAS_FAN2 + || fanSpeeds[2] + #endif + ) leds |= LED_C; + #endif // FAN_COUNT > 0 + + #if HOTENDS > 1 + if (thermalManager.degTargetHotend(1) > 0) leds |= LED_C; + #endif + + if (leds != ledsprev) { + lcd.setBacklight(leds); + ledsprev = leds; + } + } + + #endif // LCD_HAS_STATUS_INDICATORS + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + /** + Possible map screens: + + 16x2 |X000.00 Y000.00| + |(00,00) Z00.000| + + 20x2 | X:000.00 Y:000.00 | + | (00,00) Z:00.000 | + + 16x4 |+-------+(00,00)| + || |X000.00| + || |Y000.00| + |+-------+Z00.000| + + 20x4 | +-------+ (00,00) | + | | | X:000.00| + | | | Y:000.00| + | +-------+ Z:00.000| + */ + + typedef struct { + uint8_t custom_char_bits[ULTRA_Y_PIXELS_PER_CHAR]; + } custom_char; + + typedef struct { + uint8_t column, row; + uint8_t y_pixel_offset, x_pixel_offset; + uint8_t x_pixel_mask; + } coordinate; + + void add_edges_to_custom_char(custom_char * const custom, coordinate * const ul, coordinate * const lr, coordinate * const brc, const uint8_t cell_location); + FORCE_INLINE static void clear_custom_char(custom_char * const cc) { ZERO(cc->custom_char_bits); } + + /* + // This debug routine should be deleted by anybody that sees it. It doesn't belong here + // But I'm leaving it for now until we know the 20x4 Radar Map is working right. + // We may need it again if any funny lines show up on the mesh points. + void dump_custom_char(char *title, custom_char *c) { + SERIAL_PROTOCOLLN(title); + for (uint8_t j = 0; j < 8; j++) { + for (uint8_t i = 7; i >= 0; i--) + SERIAL_PROTOCOLCHAR(TEST(c->custom_char_bits[j], i) ? '1' : '0'); + SERIAL_EOL(); + } + SERIAL_EOL(); + } + //*/ + + coordinate pixel_location(int16_t x, int16_t y) { + coordinate ret_val; + int16_t xp, yp, r, c; + + x++; y++; // +1 because lines on the left and top + + c = x / (ULTRA_X_PIXELS_PER_CHAR); + r = y / (ULTRA_Y_PIXELS_PER_CHAR); + + ret_val.column = c; + ret_val.row = r; + + xp = x - c * (ULTRA_X_PIXELS_PER_CHAR); // get the pixel offsets into the character cell + xp = ULTRA_X_PIXELS_PER_CHAR - 1 - xp; // column within relevant character cell (0 on the right) + yp = y - r * (ULTRA_Y_PIXELS_PER_CHAR); + + ret_val.x_pixel_mask = _BV(xp); + ret_val.x_pixel_offset = xp; + ret_val.y_pixel_offset = yp; + return ret_val; + } + + inline coordinate pixel_location(const uint8_t x, const uint8_t y) { return pixel_location((int16_t)x, (int16_t)y); } + + void lcd_implementation_ubl_plot(const uint8_t x, const uint8_t inverted_y) { + + #if LCD_WIDTH >= 20 + #define _LCD_W_POS 12 + #define _PLOT_X 1 + #define _MAP_X 3 + #define _LABEL(C,X,Y) lcd_moveto(X, Y); lcd_put_u8str(C) + #define _XLABEL(X,Y) _LABEL("X:",X,Y) + #define _YLABEL(X,Y) _LABEL("Y:",X,Y) + #define _ZLABEL(X,Y) _LABEL("Z:",X,Y) + #else + #define _LCD_W_POS 8 + #define _PLOT_X 0 + #define _MAP_X 1 + #define _LABEL(X,Y,C) lcd_moveto(X, Y); lcd_put_wchar(C) + #define _XLABEL(X,Y) _LABEL('X',X,Y) + #define _YLABEL(X,Y) _LABEL('Y',X,Y) + #define _ZLABEL(X,Y) _LABEL('Z',X,Y) + #endif + + #if LCD_HEIGHT <= 3 // 16x2 or 20x2 display + + /** + * Show X and Y positions + */ + _XLABEL(_PLOT_X, 0); + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x])))); + + _YLABEL(_LCD_W_POS, 0); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[inverted_y])))); + + lcd_moveto(_PLOT_X, 0); + + #else // 16x4 or 20x4 display + + coordinate upper_left, lower_right, bottom_right_corner; + custom_char new_char; + uint8_t i, j, k, l, m, n, n_rows, n_cols, y, + bottom_line, right_edge, + x_map_pixels, y_map_pixels, + pixels_per_x_mesh_pnt, pixels_per_y_mesh_pnt, + suppress_x_offset = 0, suppress_y_offset = 0; + + y = GRID_MAX_POINTS_Y - inverted_y - 1; + + upper_left.column = 0; + upper_left.row = 0; + lower_right.column = 0; + lower_right.row = 0; + + lcd_implementation_clear(); + + x_map_pixels = (ULTRA_X_PIXELS_PER_CHAR) * (ULTRA_COLUMNS_FOR_MESH_MAP) - 2; // minus 2 because we are drawing a box around the map + y_map_pixels = (ULTRA_Y_PIXELS_PER_CHAR) * (ULTRA_ROWS_FOR_MESH_MAP) - 2; + + pixels_per_x_mesh_pnt = x_map_pixels / (GRID_MAX_POINTS_X); + pixels_per_y_mesh_pnt = y_map_pixels / (GRID_MAX_POINTS_Y); + + if (pixels_per_x_mesh_pnt >= ULTRA_X_PIXELS_PER_CHAR) { // There are only 2 custom characters available, so the X + pixels_per_x_mesh_pnt = ULTRA_X_PIXELS_PER_CHAR; // size of the mesh point needs to fit within them independent + suppress_x_offset = 1; // of where the starting pixel is located. + } + + if (pixels_per_y_mesh_pnt >= ULTRA_Y_PIXELS_PER_CHAR) { // There are only 2 custom characters available, so the Y + pixels_per_y_mesh_pnt = ULTRA_Y_PIXELS_PER_CHAR; // size of the mesh point needs to fit within them independent + suppress_y_offset = 1; // of where the starting pixel is located. + } + + x_map_pixels = pixels_per_x_mesh_pnt * (GRID_MAX_POINTS_X); // now we have the right number of pixels to make both + y_map_pixels = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y); // directions fit nicely + + right_edge = pixels_per_x_mesh_pnt * (GRID_MAX_POINTS_X) + 1; // find location of right edge within the character cell + bottom_line= pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y) + 1; // find location of bottome line within the character cell + + n_rows = bottom_line / (ULTRA_Y_PIXELS_PER_CHAR) + 1; + n_cols = right_edge / (ULTRA_X_PIXELS_PER_CHAR) + 1; + + for (i = 0; i < n_cols; i++) { + lcd_moveto(i, 0); + lcd_put_wchar((char)0x00); // top line of the box + + lcd_moveto(i, n_rows - 1); + lcd_put_wchar(0x01); // bottom line of the box + } + + for (j = 0; j < n_rows; j++) { + lcd_moveto(0, j); + lcd_put_wchar(0x02); // Left edge of the box + lcd_moveto(n_cols - 1, j); + lcd_put_wchar(0x03); // right edge of the box + } + + /** + * If the entire 4th row is not in use, do not put vertical bars all the way down to the bottom of the display + */ + + k = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y) + 2; + l = (ULTRA_Y_PIXELS_PER_CHAR) * n_rows; + if (l > k && l - k >= (ULTRA_Y_PIXELS_PER_CHAR) / 2) { + lcd_moveto(0, n_rows - 1); // left edge of the box + lcd_put_wchar(' '); + lcd_moveto(n_cols - 1, n_rows - 1); // right edge of the box + lcd_put_wchar(' '); + } + + clear_custom_char(&new_char); + new_char.custom_char_bits[0] = 0b11111U; // char #0 is used for the top line of the box + lcd.createChar(0, (uint8_t*)&new_char); + + clear_custom_char(&new_char); + k = (GRID_MAX_POINTS_Y) * pixels_per_y_mesh_pnt + 1; // row of pixels for the bottom box line + l = k % (ULTRA_Y_PIXELS_PER_CHAR); // row within relevant character cell + new_char.custom_char_bits[l] = 0b11111U; // char #1 is used for the bottom line of the box + lcd.createChar(1, (uint8_t*)&new_char); + + clear_custom_char(&new_char); + for (j = 0; j < ULTRA_Y_PIXELS_PER_CHAR; j++) + new_char.custom_char_bits[j] = 0b10000U; // char #2 is used for the left edge of the box + lcd.createChar(2, (uint8_t*)&new_char); + + clear_custom_char(&new_char); + m = (GRID_MAX_POINTS_X) * pixels_per_x_mesh_pnt + 1; // Column of pixels for the right box line + n = m % (ULTRA_X_PIXELS_PER_CHAR); // Column within relevant character cell + i = ULTRA_X_PIXELS_PER_CHAR - 1 - n; // Column within relevant character cell (0 on the right) + for (j = 0; j < ULTRA_Y_PIXELS_PER_CHAR; j++) + new_char.custom_char_bits[j] = (uint8_t)_BV(i); // Char #3 is used for the right edge of the box + lcd.createChar(3, (uint8_t*)&new_char); + + i = x * pixels_per_x_mesh_pnt - suppress_x_offset; + j = y * pixels_per_y_mesh_pnt - suppress_y_offset; + upper_left = pixel_location(i, j); + + k = (x + 1) * pixels_per_x_mesh_pnt - 1 - suppress_x_offset; + l = (y + 1) * pixels_per_y_mesh_pnt - 1 - suppress_y_offset; + lower_right = pixel_location(k, l); + + bottom_right_corner = pixel_location(x_map_pixels, y_map_pixels); + + /** + * First, handle the simple case where everything is within a single character cell. + * If part of the Mesh Plot is outside of this character cell, we will follow up + * and deal with that next. + */ + + //dump_custom_char("at entry:", &new_char); + + clear_custom_char(&new_char); + const uint8_t ypix = MIN(upper_left.y_pixel_offset + pixels_per_y_mesh_pnt, ULTRA_Y_PIXELS_PER_CHAR); + for (j = upper_left.y_pixel_offset; j < ypix; j++) { + i = upper_left.x_pixel_mask; + for (k = 0; k < pixels_per_x_mesh_pnt; k++) { + new_char.custom_char_bits[j] |= i; + i >>= 1; + } + } + //dump_custom_char("after loops:", &new_char); + + add_edges_to_custom_char(&new_char, &upper_left, &lower_right, &bottom_right_corner, TOP_LEFT); + //dump_custom_char("after add edges", &new_char); + lcd.createChar(4, (uint8_t*)&new_char); + + lcd_moveto(upper_left.column, upper_left.row); + lcd_put_wchar(0x04); + //dump_custom_char("after lcd update:", &new_char); + + /** + * Next, check for two side by side character cells being used to display the Mesh Point + * If found... do the right hand character cell next. + */ + if (upper_left.column == lower_right.column - 1) { + l = upper_left.x_pixel_offset; + clear_custom_char(&new_char); + for (j = upper_left.y_pixel_offset; j < ypix; j++) { + i = _BV(ULTRA_X_PIXELS_PER_CHAR - 1); // Fill in the left side of the right character cell + for (k = 0; k < pixels_per_x_mesh_pnt - 1 - l; k++) { + new_char.custom_char_bits[j] |= i; + i >>= 1; + } + } + add_edges_to_custom_char(&new_char, &upper_left, &lower_right, &bottom_right_corner, TOP_RIGHT); + + lcd.createChar(5, (uint8_t *) &new_char); + + lcd_moveto(lower_right.column, upper_left.row); + lcd_put_wchar(0x05); + } + + /** + * Next, check for two character cells stacked on top of each other being used to display the Mesh Point + */ + if (upper_left.row == lower_right.row - 1) { + l = ULTRA_Y_PIXELS_PER_CHAR - upper_left.y_pixel_offset; // Number of pixel rows in top character cell + k = pixels_per_y_mesh_pnt - l; // Number of pixel rows in bottom character cell + clear_custom_char(&new_char); + for (j = 0; j < k; j++) { + i = upper_left.x_pixel_mask; + for (m = 0; m < pixels_per_x_mesh_pnt; m++) { // Fill in the top side of the bottom character cell + new_char.custom_char_bits[j] |= i; + if (!(i >>= 1)) break; + } + } + add_edges_to_custom_char(&new_char, &upper_left, &lower_right, &bottom_right_corner, LOWER_LEFT); + lcd.createChar(6, (uint8_t *) &new_char); + + lcd_moveto(upper_left.column, lower_right.row); + lcd_put_wchar(0x06); + } + + /** + * Next, check for four character cells being used to display the Mesh Point. If that is + * what is here, we work to fill in the character cell that is down one and to the right one + * from the upper_left character cell. + */ + + if (upper_left.column == lower_right.column - 1 && upper_left.row == lower_right.row - 1) { + l = ULTRA_Y_PIXELS_PER_CHAR - upper_left.y_pixel_offset; // Number of pixel rows in top character cell + k = pixels_per_y_mesh_pnt - l; // Number of pixel rows in bottom character cell + clear_custom_char(&new_char); + for (j = 0; j < k; j++) { + l = upper_left.x_pixel_offset; + i = _BV(ULTRA_X_PIXELS_PER_CHAR - 1); // Fill in the left side of the right character cell + for (m = 0; m < pixels_per_x_mesh_pnt - 1 - l; m++) { // Fill in the top side of the bottom character cell + new_char.custom_char_bits[j] |= i; + i >>= 1; + } + } + add_edges_to_custom_char(&new_char, &upper_left, &lower_right, &bottom_right_corner, LOWER_RIGHT); + lcd.createChar(7, (uint8_t*)&new_char); + + lcd_moveto(lower_right.column, lower_right.row); + lcd_put_wchar(0x07); + } + + #endif + + /** + * Print plot position + */ + lcd_moveto(_LCD_W_POS, 0); + lcd_put_wchar('('); + lcd_put_u8str(itostr3(x)); + lcd_put_wchar(','); + lcd_put_u8str(itostr3(inverted_y)); + lcd_put_wchar(')'); + + #if LCD_HEIGHT <= 3 // 16x2 or 20x2 display + + /** + * Print Z values + */ + _ZLABEL(_LCD_W_POS, 1); + if (!isnan(ubl.z_values[x][inverted_y])) + lcd_put_u8str(ftostr43sign(ubl.z_values[x][inverted_y])); + else + lcd_put_u8str_P(PSTR(" -----")); + + #else // 16x4 or 20x4 display + + /** + * Show all values at right of screen + */ + _XLABEL(_LCD_W_POS, 1); + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x])))); + _YLABEL(_LCD_W_POS, 2); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[inverted_y])))); + + /** + * Show the location value + */ + _ZLABEL(_LCD_W_POS, 3); + if (!isnan(ubl.z_values[x][inverted_y])) + lcd_put_u8str(ftostr43sign(ubl.z_values[x][inverted_y])); + else + lcd_put_u8str_P(PSTR(" -----")); + + #endif // LCD_HEIGHT > 3 + } + + void add_edges_to_custom_char(custom_char * const custom, coordinate * const ul, coordinate * const lr, coordinate * const brc, uint8_t cell_location) { + uint8_t i, k; + int16_t n_rows = lr->row - ul->row + 1, + n_cols = lr->column - ul->column + 1; + + /** + * Check if Top line of box needs to be filled in + */ + if (ul->row == 0 && ((cell_location & TOP_LEFT) || (cell_location & TOP_RIGHT))) { // Only fill in the top line for the top character cells + + if (n_cols == 1) { + if (ul->column != brc->column) + custom->custom_char_bits[0] = 0xFF; // Single column in middle + else + for (i = brc->x_pixel_offset; i < ULTRA_X_PIXELS_PER_CHAR; i++) // Single column on right side + SBI(custom->custom_char_bits[0], i); + } + else if ((cell_location & TOP_LEFT) || lr->column != brc->column) // Multiple column in the middle or with right cell in middle + custom->custom_char_bits[0] = 0xFF; + else + for (i = brc->x_pixel_offset; i < ULTRA_X_PIXELS_PER_CHAR; i++) + SBI(custom->custom_char_bits[0], i); + } + + /** + * Check if left line of box needs to be filled in + */ + if ((cell_location & TOP_LEFT) || (cell_location & LOWER_LEFT)) { + if (ul->column == 0) { // Left column of characters on LCD Display + k = ul->row == brc->row ? brc->y_pixel_offset : ULTRA_Y_PIXELS_PER_CHAR; // If it isn't the last row... do the full character cell + for (i = 0; i < k; i++) + SBI(custom->custom_char_bits[i], ULTRA_X_PIXELS_PER_CHAR - 1); + } + } + + /** + * Check if bottom line of box needs to be filled in + */ + + // Single row of mesh plot cells + if (n_rows == 1 /* && (cell_location == TOP_LEFT || cell_location == TOP_RIGHT) */ && ul->row == brc->row) { + if (n_cols == 1) // Single row, single column case + k = ul->column == brc->column ? brc->x_pixel_mask : 0x01; + else if (cell_location & TOP_RIGHT) // Single row, multiple column case + k = lr->column == brc->column ? brc->x_pixel_mask : 0x01; + else // Single row, left of multiple columns + k = 0x01; + while (k < _BV(ULTRA_X_PIXELS_PER_CHAR)) { + custom->custom_char_bits[brc->y_pixel_offset] |= k; + k <<= 1; + } + } + + // Double row of characters on LCD Display + // And this is a bottom custom character + if (n_rows == 2 && (cell_location == LOWER_LEFT || cell_location == LOWER_RIGHT) && lr->row == brc->row) { + if (n_cols == 1) // Double row, single column case + k = ul->column == brc->column ? brc->x_pixel_mask : 0x01; + else if (cell_location & LOWER_RIGHT) // Double row, multiple column case + k = lr->column == brc->column ? brc->x_pixel_mask : 0x01; + else // Double row, left of multiple columns + k = 0x01; + while (k < _BV(ULTRA_X_PIXELS_PER_CHAR)) { + custom->custom_char_bits[brc->y_pixel_offset] |= k; + k <<= 1; + } + } + + /** + * Check if right line of box needs to be filled in + */ + // Nothing to do if the lower right part of the mesh pnt isn't in the same column as the box line + if (lr->column == brc->column) { + // This mesh point is in the same character cell as the right box line + if (ul->column == brc->column || (cell_location & TOP_RIGHT) || (cell_location & LOWER_RIGHT)) { + // If not the last row... do the full character cell + k = ul->row == brc->row ? brc->y_pixel_offset : ULTRA_Y_PIXELS_PER_CHAR; + for (i = 0; i < k; i++) custom->custom_char_bits[i] |= brc->x_pixel_mask; + } + } + } + + #endif // AUTO_BED_LEVELING_UBL + +#endif // ULTIPANEL + +#endif // ULTRALCD_IMPL_HD44780_H diff --git a/Marlin/src/libs/BL24CXX.cpp b/Marlin/src/libs/BL24CXX.cpp deleted file mode 100644 index d34ed8340f..0000000000 --- a/Marlin/src/libs/BL24CXX.cpp +++ /dev/null @@ -1,273 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfig.h" - -#if ENABLED(IIC_BL24CXX_EEPROM) - -/** - * PersistentStore for Arduino-style EEPROM interface - * with simple implementations supplied by Marlin. - */ - -#include "BL24CXX.h" -#include - -#ifndef EEPROM_WRITE_DELAY - #define EEPROM_WRITE_DELAY 10 -#endif -#ifndef EEPROM_DEVICE_ADDRESS - #define EEPROM_DEVICE_ADDRESS (0x50 << 1) -#endif - -// IO direction setting -#define SDA_IN() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0) -#define SDA_OUT() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 3 << 12; }while(0) - -// IO ops -#define IIC_SCL_0() WRITE(IIC_EEPROM_SCL, LOW) -#define IIC_SCL_1() WRITE(IIC_EEPROM_SCL, HIGH) -#define IIC_SDA_0() WRITE(IIC_EEPROM_SDA, LOW) -#define IIC_SDA_1() WRITE(IIC_EEPROM_SDA, HIGH) -#define READ_SDA() READ(IIC_EEPROM_SDA) - -// -// Simple IIC interface via libmaple -// - -// Initialize IIC -void IIC::init() { - SET_OUTPUT(IIC_EEPROM_SDA); - SET_OUTPUT(IIC_EEPROM_SCL); - IIC_SCL_1(); - IIC_SDA_1(); -} - -// Generate IIC start signal -void IIC::start() { - SDA_OUT(); // SDA line output - IIC_SDA_1(); - IIC_SCL_1(); - delay_us(4); - IIC_SDA_0(); // START:when CLK is high, DATA change from high to low - delay_us(4); - IIC_SCL_0(); // Clamp the I2C bus, ready to send or receive data -} - -// Generate IIC stop signal -void IIC::stop() { - SDA_OUT(); // SDA line output - IIC_SCL_0(); - IIC_SDA_0(); // STOP:when CLK is high DATA change from low to high - delay_us(4); - IIC_SCL_1(); - IIC_SDA_1(); // Send I2C bus end signal - delay_us(4); -} - -// Wait for the response signal to arrive -// 1 = failed to receive response -// 0 = response received -uint8_t IIC::wait_ack() { - uint8_t ucErrTime = 0; - SDA_IN(); // SDA is set as input - IIC_SDA_1(); delay_us(1); - IIC_SCL_1(); delay_us(1); - while (READ_SDA()) { - if (++ucErrTime > 250) { - stop(); - return 1; - } - } - IIC_SCL_0(); // Clock output 0 - return 0; -} - -// Generate ACK response -void IIC::ack() { - IIC_SCL_0(); - SDA_OUT(); - IIC_SDA_0(); - delay_us(2); - IIC_SCL_1(); - delay_us(2); - IIC_SCL_0(); -} - -// No ACK response -void IIC::nAck() { - IIC_SCL_0(); - SDA_OUT(); - IIC_SDA_1(); - delay_us(2); - IIC_SCL_1(); - delay_us(2); - IIC_SCL_0(); -} - -// Send one IIC byte -// Return whether the slave responds -// 1 = there is a response -// 0 = no response -void IIC::send_byte(uint8_t txd) { - SDA_OUT(); - IIC_SCL_0(); // Pull down the clock to start data transmission - LOOP_L_N(t, 8) { - // IIC_SDA = (txd & 0x80) >> 7; - if (txd & 0x80) IIC_SDA_1(); else IIC_SDA_0(); - txd <<= 1; - delay_us(2); // All three delays are necessary for TEA5767 - IIC_SCL_1(); - delay_us(2); - IIC_SCL_0(); - delay_us(2); - } -} - -// Read 1 byte, when ack=1, send ACK, ack=0, send nACK -uint8_t IIC::read_byte(unsigned char ack_chr) { - unsigned char receive = 0; - SDA_IN(); // SDA is set as input - LOOP_L_N(i, 8) { - IIC_SCL_0(); - delay_us(2); - IIC_SCL_1(); - receive <<= 1; - if (READ_SDA()) receive++; - delay_us(1); - } - ack_chr ? ack() : nAck(); // Send ACK / send nACK - return receive; -} - -/******************** EEPROM ********************/ - -// Initialize the IIC interface -void BL24CXX::init() { IIC::init(); } - -// Read a byte at the specified address -// ReadAddr: the address to start reading -// Return: the byte read -uint8_t BL24CXX::readOneByte(uint16_t ReadAddr) { - uint8_t temp = 0; - IIC::start(); - if (EE_TYPE > BL24C16) { - IIC::send_byte(EEPROM_DEVICE_ADDRESS); // Send write command - IIC::wait_ack(); - IIC::send_byte(ReadAddr >> 8); // Send high address - IIC::wait_ack(); - } - else - IIC::send_byte(EEPROM_DEVICE_ADDRESS + ((ReadAddr >> 8) << 1)); // Send device address 0xA0, write data - - IIC::wait_ack(); - IIC::send_byte(ReadAddr & 0xFF); // Send low address - IIC::wait_ack(); - IIC::start(); - IIC::send_byte(EEPROM_DEVICE_ADDRESS | 0x01); // Send byte - IIC::wait_ack(); - temp = IIC::read_byte(0); - IIC::stop(); // Generate a stop condition - return temp; -} - -// Write a data at the address specified by BL24CXX -// WriteAddr: The destination address for writing data -// DataToWrite: the data to be written -void BL24CXX::writeOneByte(uint16_t WriteAddr, uint8_t DataToWrite) { - IIC::start(); - if (EE_TYPE > BL24C16) { - IIC::send_byte(EEPROM_DEVICE_ADDRESS); // Send write command - IIC::wait_ack(); - IIC::send_byte(WriteAddr >> 8); // Send high address - } - else - IIC::send_byte(EEPROM_DEVICE_ADDRESS + ((WriteAddr >> 8) << 1)); // Send device address 0xA0, write data - - IIC::wait_ack(); - IIC::send_byte(WriteAddr & 0xFF); // Send low address - IIC::wait_ack(); - IIC::send_byte(DataToWrite); // Receiving mode - IIC::wait_ack(); - IIC::stop(); // Generate a stop condition - delay(10); -} - -// Start writing data of length Len at the specified address in BL24CXX -// This function is used to write 16bit or 32bit data. -// WriteAddr: the address to start writing -// DataToWrite: the first address of the data array -// Len: The length of the data to be written 2, 4 -void BL24CXX::writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len) { - LOOP_L_N(t, Len) - writeOneByte(WriteAddr + t, (DataToWrite >> (8 * t)) & 0xFF); -} - -// Start reading data of length Len from the specified address in BL24CXX -// This function is used to read 16bit or 32bit data. -// ReadAddr: the address to start reading -// Return value: data -// Len: The length of the data to be read 2,4 -uint32_t BL24CXX::readLenByte(uint16_t ReadAddr, uint8_t Len) { - uint32_t temp = 0; - LOOP_L_N(t, Len) { - temp <<= 8; - temp += readOneByte(ReadAddr + Len - t - 1); - } - return temp; -} - -// Check if BL24CXX is normal -// Return 1: Detection failed -// return 0: detection is successful -#define BL24CXX_TEST_ADDRESS 0x00 -#define BL24CXX_TEST_VALUE 0x55 - -bool BL24CXX::_check() { - return (readOneByte(BL24CXX_TEST_ADDRESS) != BL24CXX_TEST_VALUE); // false = success! -} - -bool BL24CXX::check() { - if (_check()) { // Value was written? Good EEPROM! - writeOneByte(BL24CXX_TEST_ADDRESS, BL24CXX_TEST_VALUE); // Write now and check. - return _check(); - } - return false; // success! -} - -// Start reading the specified number of data at the specified address in BL24CXX -// ReadAddr: The address to start reading is 0~255 for 24c02 -// pBuffer: the first address of the data array -// NumToRead: the number of data to be read -void BL24CXX::read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead) { - for (; NumToRead; NumToRead--) - *pBuffer++ = readOneByte(ReadAddr++); -} - -// Start writing the specified number of data at the specified address in BL24CXX -// WriteAddr: the address to start writing, 0~255 for 24c02 -// pBuffer: the first address of the data array -// NumToWrite: the number of data to be written -void BL24CXX::write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite) { - for (; NumToWrite; NumToWrite--, WriteAddr++) - writeOneByte(WriteAddr, *pBuffer++); -} - -#endif // IIC_BL24CXX_EEPROM diff --git a/Marlin/src/libs/BL24CXX.h b/Marlin/src/libs/BL24CXX.h deleted file mode 100644 index b069c196c0..0000000000 --- a/Marlin/src/libs/BL24CXX.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/******************************************************************************** - * @file BL24CXX.h - * @brief i2c EEPROM for Ender 3 v2 board (4.2.2) - ********************************************************************************/ - -/******************** IIC ********************/ - -class BL24CXX; - -// All operation functions of IIC -class IIC { -friend class BL24CXX; -protected: - static void init(); // Initialize the IO port of IIC - static void start(); // Send IIC start signal - static void stop(); // Send IIC stop signal - static void send_byte(uint8_t txd); // IIC sends a byte - static uint8_t read_byte(unsigned char ack); // IIC reads a byte - static uint8_t wait_ack(); // IIC waits for ACK signal - static void ack(); // IIC sends ACK signal - static void nAck(); // IIC does not send ACK signal -}; - -/******************** EEPROM ********************/ - -#define BL24C01 127 -#define BL24C02 255 -#define BL24C04 511 -#define BL24C08 1023 -#define BL24C16 2047 -#define BL24C32 4095 -#define BL24C64 8191 -#define BL24C128 16383 -#define BL24C256 32767 -#define EE_TYPE BL24C16 - -class BL24CXX { -private: - static bool _check(); // Check the device -public: - static void init(); // Initialize IIC - static bool check(); // Check / recheck the device - static uint8_t readOneByte(uint16_t ReadAddr); // Read a byte at the specified address - static void writeOneByte(uint16_t WriteAddr, uint8_t DataToWrite); // Write a byte at the specified address - static void writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len); // The specified address begins to write the data of the specified length - static uint32_t readLenByte(uint16_t ReadAddr, uint8_t Len); // The specified address starts to read the data of the specified length - static void write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite); // Write the specified length of data from the specified address - static void read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead); // Read the data of the specified length from the specified address -}; diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp deleted file mode 100644 index dd85473e98..0000000000 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ /dev/null @@ -1,936 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * The monitor_driver routines are a close copy of the TMC code - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_L64XX - -#include "L64XX_Marlin.h" - -L64XX_Marlin L64xxManager; - -#include "../../module/stepper/indirection.h" -#include "../../gcode/gcode.h" -#include "../../module/planner.h" -#include "../../HAL/shared/Delay.h" - -void echo_yes_no(const bool yes) { serialprintPGM(yes ? PSTR(" YES") : PSTR(" NO ")); } - -static const char str_X[] PROGMEM = "X ", str_Y[] PROGMEM = "Y ", str_Z[] PROGMEM = "Z ", - str_X2[] PROGMEM = "X2", str_Y2[] PROGMEM = "Y2", - str_Z2[] PROGMEM = "Z2", str_Z3[] PROGMEM = "Z3", str_Z4[] PROGMEM = "Z4", - str_E0[] PROGMEM = "E0", str_E1[] PROGMEM = "E1", - str_E2[] PROGMEM = "E2", str_E3[] PROGMEM = "E3", - str_E4[] PROGMEM = "E4", str_E5[] PROGMEM = "E5", - str_E6[] PROGMEM = "E6", str_E7[] PROGMEM = "E7" - ; - -PGM_P const L64XX_Marlin::index_to_axis[] PROGMEM = { - str_X, str_Y, str_Z, str_X2, str_Y2, str_Z2, str_Z3, str_Z4, - str_E0, str_E1, str_E2, str_E3, str_E4, str_E5, str_E6, str_E7 -}; - -#define DEBUG_OUT ENABLED(L6470_CHITCHAT) -#include "../../core/debug_out.h" - -uint8_t L64XX_Marlin::dir_commands[MAX_L64XX]; // array to hold direction command for each driver - -const uint8_t L64XX_Marlin::index_to_dir[MAX_L64XX] = { - INVERT_X_DIR, INVERT_Y_DIR, INVERT_Z_DIR - , (INVERT_X_DIR) // X2 - #if ENABLED(X_DUAL_STEPPER_DRIVERS) - ^ (INVERT_X2_VS_X_DIR) - #endif - , (INVERT_Y_DIR) // Y2 - #if ENABLED(Y_DUAL_STEPPER_DRIVERS) - ^ (INVERT_Y2_VS_Y_DIR) - #endif - , INVERT_Z_DIR, INVERT_Z_DIR, INVERT_Z_DIR // Z2,Z3,Z4 - - , INVERT_E0_DIR, INVERT_E1_DIR, INVERT_E2_DIR, INVERT_E3_DIR - , INVERT_E4_DIR, INVERT_E5_DIR, INVERT_E6_DIR, INVERT_E7_DIR -}; - -volatile uint8_t L64XX_Marlin::spi_abort = false; -uint8_t L64XX_Marlin::spi_active = false; - -L64XX_Marlin::L64XX_shadow_t L64XX_Marlin::shadow; - -//uint32_t UVLO_ADC = 0x0400; // ADC undervoltage event - -void L6470_populate_chain_array() { - - #define _L6470_INIT_SPI(Q) do{ stepper##Q.set_chain_info(Q, Q##_CHAIN_POS); }while(0) - - #if AXIS_IS_L64XX(X) - _L6470_INIT_SPI(X); - #endif - #if AXIS_IS_L64XX(X2) - _L6470_INIT_SPI(X2); - #endif - #if AXIS_IS_L64XX(Y) - _L6470_INIT_SPI(Y); - #endif - #if AXIS_IS_L64XX(Y2) - _L6470_INIT_SPI(Y2); - #endif - #if AXIS_IS_L64XX(Z) - _L6470_INIT_SPI(Z); - #endif - #if AXIS_IS_L64XX(Z2) - _L6470_INIT_SPI(Z2); - #endif - #if AXIS_IS_L64XX(Z3) - _L6470_INIT_SPI(Z3); - #endif - #if AXIS_IS_L64XX(Z4) - _L6470_INIT_SPI(Z4); - #endif - #if AXIS_IS_L64XX(E0) - _L6470_INIT_SPI(E0); - #endif - #if AXIS_IS_L64XX(E1) - _L6470_INIT_SPI(E1); - #endif - #if AXIS_IS_L64XX(E2) - _L6470_INIT_SPI(E2); - #endif - #if AXIS_IS_L64XX(E3) - _L6470_INIT_SPI(E3); - #endif - #if AXIS_IS_L64XX(E4) - _L6470_INIT_SPI(E4); - #endif - #if AXIS_IS_L64XX(E5) - _L6470_INIT_SPI(E5); - #endif - #if AXIS_IS_L64XX(E6) - _L6470_INIT_SPI(E6); - #endif - #if AXIS_IS_L64XX(E7) - _L6470_INIT_SPI(E7); - #endif -} - - -/** - * Some status bit positions & definitions differ per driver. - * Copy info to known locations to simplfy check/display logic. - * 1. Copy stepper status - * 2. Copy status bit definitions - * 3. Copy status layout - * 4. Make all error bits active low (as needed) - */ -uint16_t L64XX_Marlin::get_stepper_status(L64XX &st) { - shadow.STATUS_AXIS_RAW = st.getStatus(); - shadow.STATUS_AXIS = shadow.STATUS_AXIS_RAW; - shadow.STATUS_AXIS_LAYOUT = st.L6470_status_layout; - shadow.AXIS_OCD_TH_MAX = st.OCD_TH_MAX; - shadow.AXIS_STALL_TH_MAX = st.STALL_TH_MAX; - shadow.AXIS_OCD_CURRENT_CONSTANT_INV = st.OCD_CURRENT_CONSTANT_INV; - shadow.AXIS_STALL_CURRENT_CONSTANT_INV = st.STALL_CURRENT_CONSTANT_INV; - shadow.L6470_AXIS_CONFIG = st.L64XX_CONFIG; - shadow.L6470_AXIS_STATUS = st.L64XX_STATUS; - shadow.STATUS_AXIS_OCD = st.STATUS_OCD; - shadow.STATUS_AXIS_SCK_MOD = st.STATUS_SCK_MOD; - shadow.STATUS_AXIS_STEP_LOSS_A = st.STATUS_STEP_LOSS_A; - shadow.STATUS_AXIS_STEP_LOSS_B = st.STATUS_STEP_LOSS_B; - shadow.STATUS_AXIS_TH_SD = st.STATUS_TH_SD; - shadow.STATUS_AXIS_TH_WRN = st.STATUS_TH_WRN; - shadow.STATUS_AXIS_UVLO = st.STATUS_UVLO; - shadow.STATUS_AXIS_WRONG_CMD = st.STATUS_WRONG_CMD; - shadow.STATUS_AXIS_CMD_ERR = st.STATUS_CMD_ERR; - shadow.STATUS_AXIS_NOTPERF_CMD = st.STATUS_NOTPERF_CMD; - - switch (shadow.STATUS_AXIS_LAYOUT) { - case L6470_STATUS_LAYOUT: { // L6470 - shadow.L6470_ERROR_MASK = shadow.STATUS_AXIS_UVLO | shadow.STATUS_AXIS_TH_WRN | shadow.STATUS_AXIS_TH_SD | shadow.STATUS_AXIS_OCD | shadow.STATUS_AXIS_STEP_LOSS_A | shadow.STATUS_AXIS_STEP_LOSS_B; - shadow.STATUS_AXIS ^= (shadow.STATUS_AXIS_WRONG_CMD | shadow.STATUS_AXIS_NOTPERF_CMD); // invert just error bits that are active high - break; - } - case L6474_STATUS_LAYOUT: { // L6474 - shadow.L6470_ERROR_MASK = shadow.STATUS_AXIS_UVLO | shadow.STATUS_AXIS_TH_WRN | shadow.STATUS_AXIS_TH_SD | shadow.STATUS_AXIS_OCD ; - shadow.STATUS_AXIS ^= (shadow.STATUS_AXIS_WRONG_CMD | shadow.STATUS_AXIS_NOTPERF_CMD); // invert just error bits that are active high - break; - } - case L6480_STATUS_LAYOUT: { // L6480 & powerSTEP01 - shadow.L6470_ERROR_MASK = shadow.STATUS_AXIS_UVLO | shadow.STATUS_AXIS_TH_WRN | shadow.STATUS_AXIS_TH_SD | shadow.STATUS_AXIS_OCD | shadow.STATUS_AXIS_STEP_LOSS_A | shadow.STATUS_AXIS_STEP_LOSS_B; - shadow.STATUS_AXIS ^= (shadow.STATUS_AXIS_CMD_ERR | shadow.STATUS_AXIS_TH_WRN | shadow.STATUS_AXIS_TH_SD); // invert just error bits that are active high - break; - } - } - return shadow.STATUS_AXIS; -} - - -void L64XX_Marlin::init() { // Set up SPI and then init chips - ENABLE_RESET_L64XX_CHIPS(LOW); // hardware reset of drivers - DELAY_US(100); - ENABLE_RESET_L64XX_CHIPS(HIGH); - DELAY_US(1000); // need about 650µs for the chip(s) to fully start up - L6470_populate_chain_array(); // Set up array to control where in the SPI transfer sequence a particular stepper's data goes - - spi_init(); // Since L64XX SPI pins are unset we must init SPI here - - init_to_defaults(); // init the chips -} - -uint16_t L64XX_Marlin::get_status(const L64XX_axis_t axis) { - - #define STATUS_L6470(Q) get_stepper_status(stepper##Q) - - switch (axis) { - default: break; - #if AXIS_IS_L64XX(X) - case X : return STATUS_L6470(X); - #endif - #if AXIS_IS_L64XX(Y) - case Y : return STATUS_L6470(Y); - #endif - #if AXIS_IS_L64XX(Z) - case Z : return STATUS_L6470(Z); - #endif - #if AXIS_IS_L64XX(X2) - case X2: return STATUS_L6470(X2); - #endif - #if AXIS_IS_L64XX(Y2) - case Y2: return STATUS_L6470(Y2); - #endif - #if AXIS_IS_L64XX(Z2) - case Z2: return STATUS_L6470(Z2); - #endif - #if AXIS_IS_L64XX(Z3) - case Z3: return STATUS_L6470(Z3); - #endif - #if AXIS_IS_L64XX(Z4) - case Z4: return STATUS_L6470(Z4); - #endif - #if AXIS_IS_L64XX(E0) - case E0: return STATUS_L6470(E0); - #endif - #if AXIS_IS_L64XX(E1) - case E1: return STATUS_L6470(E1); - #endif - #if AXIS_IS_L64XX(E2) - case E2: return STATUS_L6470(E2); - #endif - #if AXIS_IS_L64XX(E3) - case E3: return STATUS_L6470(E3); - #endif - #if AXIS_IS_L64XX(E4) - case E4: return STATUS_L6470(E4); - #endif - #if AXIS_IS_L64XX(E5) - case E5: return STATUS_L6470(E5); - #endif - #if AXIS_IS_L64XX(E6) - case E6: return STATUS_L6470(E6); - #endif - #if AXIS_IS_L64XX(E7) - case E7: return STATUS_L6470(E7); - #endif - } - - return 0; // Not needed but kills a compiler warning -} - -uint32_t L64XX_Marlin::get_param(const L64XX_axis_t axis, const uint8_t param) { - - #define GET_L6470_PARAM(Q) L6470_GETPARAM(param, Q) - - switch (axis) { - default: break; - #if AXIS_IS_L64XX(X) - case X : return GET_L6470_PARAM(X); - #endif - #if AXIS_IS_L64XX(Y) - case Y : return GET_L6470_PARAM(Y); - #endif - #if AXIS_IS_L64XX(Z) - case Z : return GET_L6470_PARAM(Z); - #endif - #if AXIS_IS_L64XX(X2) - case X2: return GET_L6470_PARAM(X2); - #endif - #if AXIS_IS_L64XX(Y2) - case Y2: return GET_L6470_PARAM(Y2); - #endif - #if AXIS_IS_L64XX(Z2) - case Z2: return GET_L6470_PARAM(Z2); - #endif - #if AXIS_IS_L64XX(Z3) - case Z3: return GET_L6470_PARAM(Z3); - #endif - #if AXIS_IS_L64XX(Z4) - case Z4: return GET_L6470_PARAM(Z4); - #endif - #if AXIS_IS_L64XX(E0) - case E0: return GET_L6470_PARAM(E0); - #endif - #if AXIS_IS_L64XX(E1) - case E1: return GET_L6470_PARAM(E1); - #endif - #if AXIS_IS_L64XX(E2) - case E2: return GET_L6470_PARAM(E2); - #endif - #if AXIS_IS_L64XX(E3) - case E3: return GET_L6470_PARAM(E3); - #endif - #if AXIS_IS_L64XX(E4) - case E4: return GET_L6470_PARAM(E4); - #endif - #if AXIS_IS_L64XX(E5) - case E5: return GET_L6470_PARAM(E5); - #endif - #if AXIS_IS_L64XX(E6) - case E6: return GET_L6470_PARAM(E6); - #endif - #if AXIS_IS_L64XX(E7) - case E7: return GET_L6470_PARAM(E7); - #endif - } - - return 0; // not needed but kills a compiler warning -} - -void L64XX_Marlin::set_param(const L64XX_axis_t axis, const uint8_t param, const uint32_t value) { - - #define SET_L6470_PARAM(Q) stepper##Q.SetParam(param, value) - - switch (axis) { - default: break; - #if AXIS_IS_L64XX(X) - case X : SET_L6470_PARAM(X); break; - #endif - #if AXIS_IS_L64XX(Y) - case Y : SET_L6470_PARAM(Y); break; - #endif - #if AXIS_IS_L64XX(Z) - case Z : SET_L6470_PARAM(Z); break; - #endif - #if AXIS_IS_L64XX(X2) - case X2: SET_L6470_PARAM(X2); break; - #endif - #if AXIS_IS_L64XX(Y2) - case Y2: SET_L6470_PARAM(Y2); break; - #endif - #if AXIS_IS_L64XX(Z2) - case Z2: SET_L6470_PARAM(Z2); break; - #endif - #if AXIS_IS_L64XX(Z3) - case Z3: SET_L6470_PARAM(Z3); break; - #endif - #if AXIS_IS_L64XX(Z4) - case Z4: SET_L6470_PARAM(Z4); break; - #endif - #if AXIS_IS_L64XX(E0) - case E0: SET_L6470_PARAM(E0); break; - #endif - #if AXIS_IS_L64XX(E1) - case E1: SET_L6470_PARAM(E1); break; - #endif - #if AXIS_IS_L64XX(E2) - case E2: SET_L6470_PARAM(E2); break; - #endif - #if AXIS_IS_L64XX(E3) - case E3: SET_L6470_PARAM(E3); break; - #endif - #if AXIS_IS_L64XX(E4) - case E4: SET_L6470_PARAM(E4); break; - #endif - #if AXIS_IS_L64XX(E5) - case E5: SET_L6470_PARAM(E5); break; - #endif - #if AXIS_IS_L64XX(E6) - case E6: SET_L6470_PARAM(E6); break; - #endif - #if AXIS_IS_L64XX(E7) - case E7: SET_L6470_PARAM(E7); break; - #endif - } -} - -inline void echo_min_max(const char a, const float &min, const float &max) { - DEBUG_CHAR(' '); DEBUG_CHAR(a); - DEBUG_ECHOPAIR(" min = ", min); - DEBUG_ECHOLNPAIR(" max = ", max); -} -inline void echo_oct_used(const float &oct, const uint8_t stall) { - DEBUG_ECHOPAIR("over_current_threshold used : ", oct); - serialprintPGM(stall ? PSTR(" (Stall") : PSTR(" (OCD")); - DEBUG_ECHOLNPGM(" threshold)"); -} -inline void err_out_of_bounds() { DEBUG_ECHOLNPGM("Test aborted - motion out of bounds"); } - -uint8_t L64XX_Marlin::get_user_input(uint8_t &driver_count, L64XX_axis_t axis_index[3], char axis_mon[3][3], - float &position_max, float &position_min, float &final_feedrate, uint8_t &kval_hold, - uint8_t over_current_flag, uint8_t &OCD_TH_val, uint8_t &STALL_TH_val, uint16_t &over_current_threshold -) { - // Return TRUE if the calling routine needs to abort/kill - - uint16_t displacement = 0; // " = 0" to eliminate compiler warning - uint8_t j; // general purpose counter - - if (!all_axes_homed()) { - DEBUG_ECHOLNPGM("Test aborted - home all before running this command"); - return true; - } - - uint8_t found_displacement = false; - LOOP_XYZE(i) if (uint16_t _displacement = parser.intval(axis_codes[i])) { - found_displacement = true; - displacement = _displacement; - uint8_t axis_offset = parser.byteval('J'); - axis_mon[0][0] = axis_codes[i]; // Axis first character, one of XYZE - const bool single_or_e = axis_offset >= 2 || axis_mon[0][0] == 'E', - one_or_more = !single_or_e && axis_offset == 0; - uint8_t driver_count_local = 0; // Can't use "driver_count" directly as a subscript because it's passed by reference - if (single_or_e) // Single axis, E0, or E1 - axis_mon[0][1] = axis_offset + '0'; // Index given by 'J' parameter - - if (single_or_e || one_or_more) { - for (j = 0; j < MAX_L64XX; j++) { // Count up the drivers on this axis - PGM_P str = (PGM_P)pgm_read_ptr(&index_to_axis[j]); // Get a PGM_P from progmem - const char c = pgm_read_byte(str); // Get a char from progmem - if (axis_mon[0][0] == c) { // For each stepper on this axis... - char *mon = axis_mon[driver_count_local]; - *mon++ = c; // Copy the 3 letter axis name - *mon++ = pgm_read_byte(&str[1]); // to the axis_mon array - *mon = pgm_read_byte(&str[2]); - axis_index[driver_count_local] = (L64XX_axis_t)j; // And store the L64XX axis index - driver_count_local++; - } - } - if (one_or_more) driver_count = driver_count_local; - } - break; // only take first axis found - } - - if (!found_displacement) { - DEBUG_ECHOLNPGM("Test aborted - AXIS with displacement is required"); - return true; - } - - // - // Position calcs & checks - // - - const float X_center = LOGICAL_X_POSITION(current_position.x), - Y_center = LOGICAL_Y_POSITION(current_position.y), - Z_center = LOGICAL_Z_POSITION(current_position.z), - E_center = current_position.e; - - switch (axis_mon[0][0]) { - default: position_max = position_min = 0; break; - - case 'X': { - position_min = X_center - displacement; - position_max = X_center + displacement; - echo_min_max('X', position_min, position_max); - if (false - #ifdef X_MIN_POS - || position_min < (X_MIN_POS) - #endif - #ifdef X_MAX_POS - || position_max > (X_MAX_POS) - #endif - ) { - err_out_of_bounds(); - return true; - } - } break; - - case 'Y': { - position_min = Y_center - displacement; - position_max = Y_center + displacement; - echo_min_max('Y', position_min, position_max); - if (false - #ifdef Y_MIN_POS - || position_min < (Y_MIN_POS) - #endif - #ifdef Y_MAX_POS - || position_max > (Y_MAX_POS) - #endif - ) { - err_out_of_bounds(); - return true; - } - } break; - - case 'Z': { - position_min = Z_center - displacement; - position_max = Z_center + displacement; - echo_min_max('Z', position_min, position_max); - if (false - #ifdef Z_MIN_POS - || position_min < (Z_MIN_POS) - #endif - #ifdef Z_MAX_POS - || position_max > (Z_MAX_POS) - #endif - ) { - err_out_of_bounds(); - return true; - } - } break; - - case 'E': { - position_min = E_center - displacement; - position_max = E_center + displacement; - echo_min_max('E', position_min, position_max); - } break; - } - - // - // Work on the drivers - // - - LOOP_L_N(k, driver_count) { - uint8_t not_found = true; - for (j = 1; j <= L64XX::chain[0]; j++) { - PGM_P const str = (PGM_P)pgm_read_ptr(&index_to_axis[L64XX::chain[j]]); - if (pgm_read_byte(&str[0]) == axis_mon[k][0] && pgm_read_byte(&str[1]) == axis_mon[k][1]) { // See if a L6470 driver - not_found = false; - break; - } - } - if (not_found) { - driver_count = k; - axis_mon[k][0] = ' '; // mark this entry invalid - break; - } - } - - if (driver_count == 0) { - DEBUG_ECHOLNPGM("Test aborted - not a L6470 axis"); - return true; - } - - DEBUG_ECHOPGM("Monitoring:"); - for (j = 0; j < driver_count; j++) DEBUG_ECHOPAIR(" ", axis_mon[j]); - DEBUG_EOL(); - - // now have a list of driver(s) to monitor - - // - // TVAL & kVAL_HOLD checks & settings - // - const L64XX_shadow_t &sh = shadow; - get_status(axis_index[0]); // populate shadow array - - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // L6474 - use TVAL - uint16_t TVAL_current = parser.ushortval('T'); - if (TVAL_current) { - uint8_t TVAL_count = (TVAL_current / sh.AXIS_STALL_CURRENT_CONSTANT_INV) - 1; - LIMIT(TVAL_count, 0, sh.AXIS_STALL_TH_MAX); - for (j = 0; j < driver_count; j++) - set_param(axis_index[j], L6474_TVAL, TVAL_count); - } - // only print the tval from one of the drivers - kval_hold = get_param(axis_index[0], L6474_TVAL); - DEBUG_ECHOLNPAIR("TVAL current (mA) = ", (kval_hold + 1) * sh.AXIS_STALL_CURRENT_CONSTANT_INV); - } - else { - kval_hold = parser.byteval('K'); - if (kval_hold) { - DEBUG_ECHOLNPAIR("kval_hold = ", kval_hold); - for (j = 0; j < driver_count; j++) - set_param(axis_index[j], L6470_KVAL_HOLD, kval_hold); - } - else { - // only print the KVAL_HOLD from one of the drivers - kval_hold = get_param(axis_index[0], L6470_KVAL_HOLD); - DEBUG_ECHOLNPAIR("KVAL_HOLD = ", kval_hold); - } - } - - // - // Overcurrent checks & settings - // - - if (over_current_flag) { - - uint8_t OCD_TH_val_local = 0, // compiler thinks OCD_TH_val is unused if use it directly - STALL_TH_val_local = 0; // just in case ... - - over_current_threshold = parser.intval('I'); - - if (over_current_threshold) { - - OCD_TH_val_local = over_current_threshold/375; - LIMIT(OCD_TH_val_local, 0, 15); - STALL_TH_val_local = over_current_threshold/31.25; - LIMIT(STALL_TH_val_local, 0, 127); - uint16_t OCD_TH_actual = (OCD_TH_val_local + 1) * 375, - STALL_TH_actual = (STALL_TH_val_local + 1) * 31.25; - if (OCD_TH_actual < STALL_TH_actual) { - OCD_TH_val_local++; - OCD_TH_actual = (OCD_TH_val_local + 1) * 375; - } - - DEBUG_ECHOLNPAIR("over_current_threshold specified: ", over_current_threshold); - if (!(sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT)) echo_oct_used((STALL_TH_val_local + 1) * 31.25, true); - echo_oct_used((OCD_TH_val_local + 1) * 375, false); - - #define SET_OVER_CURRENT(Q) do { stepper##Q.SetParam(L6470_STALL_TH, STALL_TH_val_local); stepper##Q.SetParam(L6470_OCD_TH, OCD_TH_val_local);} while (0) - - for (j = 0; j < driver_count; j++) { - set_param(axis_index[j], L6470_STALL_TH, STALL_TH_val_local); - set_param(axis_index[j], L6470_OCD_TH, OCD_TH_val_local); - } - } - else { - // only get & print the OVER_CURRENT values from one of the drivers - STALL_TH_val_local = get_param(axis_index[0], L6470_STALL_TH); - OCD_TH_val_local = get_param(axis_index[0], L6470_OCD_TH); - - if (!(sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT)) echo_oct_used((STALL_TH_val_local + 1) * 31.25, true); - echo_oct_used((OCD_TH_val_local + 1) * 375, false); - } // over_current_threshold - - for (j = 0; j < driver_count; j++) { // set all drivers on axis the same - set_param(axis_index[j], L6470_STALL_TH, STALL_TH_val_local); - set_param(axis_index[j], L6470_OCD_TH, OCD_TH_val_local); - } - - OCD_TH_val = OCD_TH_val_local; // force compiler to update the main routine's copy - STALL_TH_val = STALL_TH_val_local; // force compiler to update the main routine's copy - } // end of overcurrent - - // - // Feedrate - // - - final_feedrate = parser.floatval('F'); - if (final_feedrate == 0) { - static constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; - const uint8_t num_feedrates = COUNT(default_max_feedrate); - for (j = 0; j < num_feedrates; j++) { - if (axis_codes[j] == axis_mon[0][0]) { - final_feedrate = default_max_feedrate[j]; - break; - } - } - if (j == 3 && num_feedrates > 4) { // have more than one extruder feedrate - uint8_t extruder_num = axis_mon[0][1] - '0'; - if (j <= num_feedrates - extruder_num) // have a feedrate specifically for this extruder - final_feedrate = default_max_feedrate[j + extruder_num]; - else - final_feedrate = default_max_feedrate[3]; // use E0 feedrate for this extruder - } - final_feedrate *= 60; // convert to mm/minute - } // end of feedrate - - return false; // FALSE indicates no user input problems -} - -void L64XX_Marlin::say_axis(const L64XX_axis_t axis, const uint8_t label/*=true*/) { - if (label) SERIAL_ECHOPGM("AXIS:"); - const char * const str = L64xxManager.index_to_axis[axis]; - SERIAL_CHAR(' ', str[0], str[1], ' '); -} - -#if ENABLED(L6470_CHITCHAT) - - // Assumes status bits have been inverted - void L64XX_Marlin::error_status_decode(const uint16_t status, const L64XX_axis_t axis, - const uint16_t _status_axis_th_sd, const uint16_t _status_axis_th_wrn, - const uint16_t _status_axis_step_loss_a, const uint16_t _status_axis_step_loss_b, - const uint16_t _status_axis_ocd, const uint8_t _status_axis_layout - ) { - say_axis(axis); - DEBUG_ECHOPGM(" THERMAL: "); - serialprintPGM((status & _status_axis_th_sd) ? PSTR("SHUTDOWN") : (status & _status_axis_th_wrn) ? PSTR("WARNING ") : PSTR("OK ")); - DEBUG_ECHOPGM(" OVERCURRENT: "); - echo_yes_no((status & _status_axis_ocd) != 0); - if (!(_status_axis_layout == L6474_STATUS_LAYOUT)) { // L6474 doesn't have these bits - DEBUG_ECHOPGM(" STALL: "); - echo_yes_no((status & (_status_axis_step_loss_a | _status_axis_step_loss_b)) != 0); - } - DEBUG_EOL(); - } - -#endif - -////////////////////////////////////////////////////////////////////////////////////////////////// -//// -//// MONITOR_L6470_DRIVER_STATUS routines -//// -////////////////////////////////////////////////////////////////////////////////////////////////// - -#if ENABLED(MONITOR_L6470_DRIVER_STATUS) - - bool L64XX_Marlin::monitor_paused = false; // Flag to skip monitor during M122, M906, M916, M917, M918, etc. - - struct L6470_driver_data { - uint8_t driver_index; - uint32_t driver_status; - uint8_t is_otw; - uint8_t otw_counter; - uint8_t is_ot; - uint8_t is_hi_Z; - uint8_t com_counter; - }; - - L6470_driver_data driver_L6470_data[] = { - #if AXIS_IS_L64XX(X) - { 0, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(Y) - { 1, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(Z) - { 2, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(X2) - { 3, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(Y2) - { 4, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(Z2) - { 5, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(Z3) - { 6, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(Z4) - { 7, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(E0) - { 8, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(E1) - { 9, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(E2) - { 10, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(E3) - { 11, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(E4) - { 12, 0, 0, 0, 0, 0, 0 }, - #endif - #if AXIS_IS_L64XX(E5) - { 13, 0, 0, 0, 0, 0, 0 } - #endif - #if AXIS_IS_L64XX(E6) - { 14, 0, 0, 0, 0, 0, 0 } - #endif - #if AXIS_IS_L64XX(E7) - { 16, 0, 0, 0, 0, 0, 0 } - #endif - }; - - void L64XX_Marlin::append_stepper_err(char* &p, const uint8_t stepper_index, const char * const err/*=nullptr*/) { - PGM_P const str = (PGM_P)pgm_read_ptr(&index_to_axis[stepper_index]); - p += sprintf_P(p, PSTR("Stepper %c%c "), pgm_read_byte(&str[0]), pgm_read_byte(&str[1])); - if (err) p += sprintf_P(p, err); - } - - void L64XX_Marlin::monitor_update(L64XX_axis_t stepper_index) { - if (spi_abort) return; // don't do anything if set_directions() has occurred - const L64XX_shadow_t &sh = shadow; - get_status(stepper_index); // get stepper status and details - uint16_t status = sh.STATUS_AXIS; - uint8_t kval_hold, tval; - char temp_buf[120], *p = temp_buf; - uint8_t j; - for (j = 0; j < L64XX::chain[0]; j++) // find the table for this stepper - if (driver_L6470_data[j].driver_index == stepper_index) break; - - driver_L6470_data[j].driver_status = status; - uint16_t _status = ~status; // all error bits are active low - - if (status == 0 || status == 0xFFFF) { // com problem - if (driver_L6470_data[j].com_counter == 0) { // warn user when it first happens - driver_L6470_data[j].com_counter++; - append_stepper_err(p, stepper_index, PSTR(" - communications lost\n")); - DEBUG_ECHO(temp_buf); - } - else { - driver_L6470_data[j].com_counter++; - if (driver_L6470_data[j].com_counter > 240) { // remind of com problem about every 2 minutes - driver_L6470_data[j].com_counter = 1; - append_stepper_err(p, stepper_index, PSTR(" - still no communications\n")); - DEBUG_ECHO(temp_buf); - } - } - } - else { - if (driver_L6470_data[j].com_counter) { // comms re-established - driver_L6470_data[j].com_counter = 0; - append_stepper_err(p, stepper_index, PSTR(" - communications re-established\n.. setting all drivers to default values\n")); - DEBUG_ECHO(temp_buf); - init_to_defaults(); - } - else { - // no com problems - do the usual checks - if (_status & sh.L6470_ERROR_MASK) { - append_stepper_err(p, stepper_index); - - if (status & STATUS_HIZ) { // The driver has shut down. HiZ is active high - driver_L6470_data[j].is_hi_Z = true; - p += sprintf_P(p, PSTR("%cIS SHUT DOWN"), ' '); - //if (_status & sh.STATUS_AXIS_TH_SD) { // strange - TH_SD never seems to go active, must be implied by the HiZ and TH_WRN - if (_status & sh.STATUS_AXIS_TH_WRN) { // over current shutdown - p += sprintf_P(p, PSTR("%cdue to over temperature"), ' '); - driver_L6470_data[j].is_ot = true; - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // L6474 - tval = get_param(stepper_index, L6474_TVAL) - 2 * KVAL_HOLD_STEP_DOWN; - set_param(stepper_index, L6474_TVAL, tval); // reduce TVAL - p += sprintf_P(p, PSTR(" - TVAL reduced by %d to %d mA"), uint16_t (2 * KVAL_HOLD_STEP_DOWN * sh.AXIS_STALL_CURRENT_CONSTANT_INV), uint16_t ((tval + 1) * sh.AXIS_STALL_CURRENT_CONSTANT_INV)); // let user know - } - else { - kval_hold = get_param(stepper_index, L6470_KVAL_HOLD) - 2 * KVAL_HOLD_STEP_DOWN; - set_param(stepper_index, L6470_KVAL_HOLD, kval_hold); // reduce KVAL_HOLD - p += sprintf_P(p, PSTR(" - KVAL_HOLD reduced by %d to %d"), 2 * KVAL_HOLD_STEP_DOWN, kval_hold); // let user know - } - } - else - driver_L6470_data[j].is_ot = false; - } - else { - driver_L6470_data[j].is_hi_Z = false; - - if (_status & sh.STATUS_AXIS_TH_WRN) { // have an over temperature warning - driver_L6470_data[j].is_otw = true; - driver_L6470_data[j].otw_counter++; - kval_hold = get_param(stepper_index, L6470_KVAL_HOLD); - if (driver_L6470_data[j].otw_counter > 4) { // otw present for 2 - 2.5 seconds, reduce KVAL_HOLD - driver_L6470_data[j].otw_counter = 0; - driver_L6470_data[j].is_otw = true; - if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // L6474 - tval = get_param(stepper_index, L6474_TVAL) - KVAL_HOLD_STEP_DOWN; - set_param(stepper_index, L6474_TVAL, tval); // reduce TVAL - p += sprintf_P(p, PSTR(" - TVAL reduced by %d to %d mA"), uint16_t (KVAL_HOLD_STEP_DOWN * sh.AXIS_STALL_CURRENT_CONSTANT_INV), uint16_t ((tval + 1) * sh.AXIS_STALL_CURRENT_CONSTANT_INV)); // let user know - } - else { - kval_hold = get_param(stepper_index, L6470_KVAL_HOLD) - KVAL_HOLD_STEP_DOWN; - set_param(stepper_index, L6470_KVAL_HOLD, kval_hold); // reduce KVAL_HOLD - p += sprintf_P(p, PSTR(" - KVAL_HOLD reduced by %d to %d"), KVAL_HOLD_STEP_DOWN, kval_hold); // let user know - } - } - else if (driver_L6470_data[j].otw_counter) - p += sprintf_P(p, PSTR("%c- thermal warning"), ' '); // warn user - } - } - - #if ENABLED(L6470_STOP_ON_ERROR) - if (_status & (sh.STATUS_AXIS_UVLO | sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD)) - kill(temp_buf); - #endif - - #if ENABLED(L6470_CHITCHAT) - if (_status & sh.STATUS_AXIS_OCD) - p += sprintf_P(p, PSTR("%c over current"), ' '); - - if (_status & (sh.STATUS_AXIS_STEP_LOSS_A | sh.STATUS_AXIS_STEP_LOSS_B)) - p += sprintf_P(p, PSTR("%c stall"), ' '); - - if (_status & sh.STATUS_AXIS_UVLO) - p += sprintf_P(p, PSTR("%c under voltage lock out"), ' '); - - p += sprintf_P(p, PSTR("%c\n"), ' '); - #endif - - DEBUG_ECHOLN(temp_buf); // print the error message - } - else { - driver_L6470_data[j].is_ot = false; - driver_L6470_data[j].otw_counter = 0; //clear out warning indicators - driver_L6470_data[j].is_otw = false; - } // end usual checks - - } // comms established but have errors - } // comms re-established - } // end monitor_update() - - - void L64XX_Marlin::monitor_driver() { - static millis_t next_cOT = 0; - if (ELAPSED(millis(), next_cOT)) { - next_cOT = millis() + 500; - - if (!monitor_paused) { // Skip during M122, M906, M916, M917 or M918 (could steal status result from test) - - spi_active = true; // Tell set_directions() a series of SPI transfers is underway - - #if AXIS_IS_L64XX(X) - monitor_update(X); - #endif - #if AXIS_IS_L64XX(Y) - monitor_update(Y); - #endif - #if AXIS_IS_L64XX(Z) - monitor_update(Z); - #endif - #if AXIS_IS_L64XX(X2) - monitor_update(X2); - #endif - #if AXIS_IS_L64XX(Y2) - monitor_update(Y2); - #endif - #if AXIS_IS_L64XX(Z2) - monitor_update(Z2); - #endif - #if AXIS_IS_L64XX(Z3) - monitor_update(Z3); - #endif - #if AXIS_IS_L64XX(Z4) - monitor_update(Z4); - #endif - #if AXIS_IS_L64XX(E0) - monitor_update(E0); - #endif - #if AXIS_IS_L64XX(E1) - monitor_update(E1); - #endif - #if AXIS_IS_L64XX(E2) - monitor_update(E2); - #endif - #if AXIS_IS_L64XX(E3) - monitor_update(E3); - #endif - #if AXIS_IS_L64XX(E4) - monitor_update(E4); - #endif - #if AXIS_IS_L64XX(E5) - monitor_update(E5); - #endif - - if (TERN0(L6470_DEBUG, report_L6470_status)) DEBUG_EOL(); - - spi_active = false; // done with all SPI transfers - clear handshake flags - spi_abort = false; - } - } - } - -#endif // MONITOR_L6470_DRIVER_STATUS - -#endif // HAS_L64XX diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.h b/Marlin/src/libs/L64XX/L64XX_Marlin.h deleted file mode 100644 index c8d273990f..0000000000 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../../inc/MarlinConfig.h" - -#include -#if !(L6470_LIBRARY_VERSION >= 0x000800) - #error 'L6470_LIBRARY_VERSION 0x000800 or later required' -#endif - -#define L6470_GETPARAM(P,Q) stepper##Q.GetParam(P) - -#define dSPIN_STEP_CLOCK 0x58 -#define dSPIN_STEP_CLOCK_FWD dSPIN_STEP_CLOCK -#define dSPIN_STEP_CLOCK_REV dSPIN_STEP_CLOCK+1 -#define HAS_L64XX_EXTRUDER (AXIS_IS_L64XX(E0) || AXIS_IS_L64XX(E1) || AXIS_IS_L64XX(E2) || AXIS_IS_L64XX(E3) || AXIS_IS_L64XX(E4) || AXIS_IS_L64XX(E5) || AXIS_IS_L64XX(E6) || AXIS_IS_L64XX(E7)) - -enum L64XX_axis_t : uint8_t { X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7, MAX_L64XX }; - -class L64XX_Marlin : public L64XXHelper { -public: - static PGM_P const index_to_axis[MAX_L64XX]; - - static const uint8_t index_to_dir[MAX_L64XX]; - - static uint8_t dir_commands[MAX_L64XX]; - - // Flags to guarantee graceful switch if stepper interrupts L6470 SPI transfer - static volatile uint8_t spi_abort; - static uint8_t spi_active; - - L64XX_Marlin() {} - - static void init(); - static void init_to_defaults(); - - static uint16_t get_stepper_status(L64XX &st); - - static uint16_t get_status(const L64XX_axis_t axis); - - static uint32_t get_param(const L64XX_axis_t axis, const uint8_t param); - - static void set_param(const L64XX_axis_t axis, const uint8_t param, const uint32_t value); - - //static void send_command(const L64XX_axis_t axis, uint8_t command); - - static uint8_t get_user_input(uint8_t &driver_count, L64XX_axis_t axis_index[3], char axis_mon[3][3], - float &position_max, float &position_min, float &final_feedrate, uint8_t &kval_hold, - uint8_t over_current_flag, uint8_t &OCD_TH_val, uint8_t &STALL_TH_val, uint16_t &over_current_threshold); - - static void transfer(uint8_t L6470_buf[], const uint8_t length); - - static void say_axis(const L64XX_axis_t axis, const uint8_t label=true); - #if ENABLED(L6470_CHITCHAT) - static void error_status_decode( - const uint16_t status, const L64XX_axis_t axis, - const uint16_t _status_axis_th_sd, const uint16_t _status_axis_th_wrn, - const uint16_t _status_axis_step_loss_a, const uint16_t _status_axis_step_loss_b, - const uint16_t _status_axis_ocd, const uint8_t _status_axis_layout - ); - #else - FORCE_INLINE static void error_status_decode( - const uint16_t, const L64XX_axis_t, - const uint16_t, const uint16_t, - const uint16_t, const uint16_t, - const uint16_t, const uint8_t - ){} - #endif - - // ~40 bytes SRAM to simplify status decode routines - typedef struct { - uint8_t STATUS_AXIS_LAYOUT; // Copy of L6470_status_layout - uint8_t AXIS_OCD_TH_MAX; // Size of OCD_TH field - uint8_t AXIS_STALL_TH_MAX; // Size of STALL_TH field - float AXIS_OCD_CURRENT_CONSTANT_INV; // mA per count - float AXIS_STALL_CURRENT_CONSTANT_INV; // mA per count - uint8_t L6470_AXIS_CONFIG, // Address of the CONFIG register - L6470_AXIS_STATUS; // Address of the STATUS register - uint16_t L6470_ERROR_MASK, // STATUS_UVLO | STATUS_TH_WRN | STATUS_TH_SD | STATUS_OCD | STATUS_STEP_LOSS_A | STATUS_STEP_LOSS_B - L6474_ERROR_MASK, // STATUS_UVLO | STATUS_TH_WRN | STATUS_TH_SD | STATUS_OCD - STATUS_AXIS_RAW, // Copy of status register contents - STATUS_AXIS, // Copy of status register contents but with all error bits active low - STATUS_AXIS_OCD, // Overcurrent detected bit position - STATUS_AXIS_SCK_MOD, // Step clock mode is active bit position - STATUS_AXIS_STEP_LOSS_A, // Stall detected on A bridge bit position - STATUS_AXIS_STEP_LOSS_B, // Stall detected on B bridge bit position - STATUS_AXIS_TH_SD, // Thermal shutdown bit position - STATUS_AXIS_TH_WRN, // Thermal warning bit position - STATUS_AXIS_UVLO, // Undervoltage lockout is active bit position - STATUS_AXIS_WRONG_CMD, // Last command not valid bit position - STATUS_AXIS_CMD_ERR, // Command error bit position - STATUS_AXIS_NOTPERF_CMD; // Last command not performed bit position - } L64XX_shadow_t; - - static L64XX_shadow_t shadow; - - #if ENABLED(MONITOR_L6470_DRIVER_STATUS) - static bool monitor_paused; - static inline void pause_monitor(const bool p) { monitor_paused = p; } - static void monitor_update(L64XX_axis_t stepper_index); - static void monitor_driver(); - #else - static inline void pause_monitor(const bool) {} - #endif - -//protected: - // L64XXHelper methods - static void spi_init(); - static uint8_t transfer_single(uint8_t data, int16_t ss_pin); - static uint8_t transfer_chain(uint8_t data, int16_t ss_pin, uint8_t chain_position); - -private: - static void append_stepper_err(char* &p, const uint8_t stepper_index, const char * const err=nullptr); - -}; - -void echo_yes_no(const bool yes); - -extern L64XX_Marlin L64xxManager; diff --git a/Marlin/src/libs/L64XX/README.md b/Marlin/src/libs/L64XX/README.md deleted file mode 100644 index c68d8ca0ed..0000000000 --- a/Marlin/src/libs/L64XX/README.md +++ /dev/null @@ -1,98 +0,0 @@ -### L64XX Stepper Driver - -*Arduino-L6470* library revision 0.8.0 or above is required. - -This software can be used with the L6470, L6474, L6480 and the powerSTEP01 (collectively referred to as "L64xx" from now on). Different drivers can be mixed within a system. - -These devices use voltage PWMs to drive the stepper phases. On the L6474 the phase current is controlled by the `TVAL` register. On all the other drivers the phase current is indirectly controlled via the `KVAL_HOLD` register which scales the PWM duty cycle. - -This software assumes that all drivers are in one SPI daisy chain. - -### Hardware Setup - -- MOSI from controller tied to SDI on the first device - -- SDO of the first device is tied to SDI of the next device - -- SDO of the last device is tied to MISO of the controller - -- All devices share the same `SCK` and `SS_PIN` pins. The user must supply a macro to control the `RESET_PIN`(s). - -- Each L6470 passes the data it saw on its SDI to its neighbor on the **NEXT** SPI cycle (8 bit delay). - -- Each L6470 acts on the **last** SPI data it saw when the `SS_PIN` **goes high**. - -The L6474 uses the standard STEP DIR interface. Phase currents are changed in response to step pulses. The direction is set by the DIR pin. Instead of an ENA pin, stepper power is controlled with SPI commands. - -The other drivers operate in `STEP_CLOCK` mode. In this mode the Direction / Enable functions are done with SPI commands and the phase currents are changed in response to STEP pulses. - -### Hardware / Software Interaction - -Except for the L6474, powering up a stepper and setting the direction are done by the same command. You can't do one without the other. - -**All** directions are set **every time** a new block is popped off the queue by the stepper ISR. - -When setting direction, SPI transfers are minimized by using arrays and a specialized SPI method. *Arduino-L6470* library calls are not used. For N L64xx drivers, this results in N bytes transferred. If library calls were used then N2 bytes would be sent. - -### Power-up (Reset) Sequence - -- Stepper objects are instantiated before the `setup()` entry point is reached. - -- In `setup()` (before stepper drivers are initialized) the `L6470_init()` method is called to do the following: - - - If present, pulse the hardware reset pin. - - - Populate the `L6470_chain` array, which maps positions in the SPI stream to commands/data for L64XX stepper drivers. - - - Initialize the L64XX Software SPI pin states. - - - Initialize L64XX drivers. They may be reset later by a call to `L6470_init_to_defaults()`. - -The steppers are **NOT** powered up (enabled) during this sequence. - -### `L6470_chain` array - -This array is used by all routines that transmit SPI data. For a chain with N devices, the array contains: - -Index|Value ------|----- -0|Number of drivers in chain -1|Axis index of the first device in the chain (closest to MOSI) -...| -N|Axis index of the last device chain (closest to MISO) - -### Set Direction and Enable - -The `DIR_WRITE` macros for the L64xx drivers are written so that the standard X, Y, Z and extruder logic used by the `set_directions()` routine is not altered. These macros write the correct forward/reverse command to the corresponding location in the array `L6470_dir_commands`. On the L6474 the array the command used just enables the stepper because direction is set by the DIR pin. - -At the end of the `set_directions()` routine, the array `L6470_chain` is used to grab the corresponding direction/enable commands out of the array `L6470_dir_commands` and put them in the correct sequence in the array `L6470_buf`. Array `L6470_buf` is then passed to the **`void`** `L6470_Transfer` function which actually sends the data to the devices. - -### Utilities, etc. - -The **absolute position** registers should accurately reflect Marlin’s stepper position counts. They are set to zero during initialization. `G28` sets them to the Marlin counts for the corresponding axis after homing. NOTE: These registers are often the negative of the Marlin counts. This is because the Marlin counts reflect the logical direction while the registers reflect the stepper direction. The register contents are displayed via the `M114 D` command. - -The `L6470_monitor` feature reads the status of each device every half second. It will report if there are any error conditions present or if communications has been lost/restored. The `KVAL_HOLD` value is reduced every 2 – 2.5 seconds if the thermal warning or thermal shutdown conditions are present. - -**M122** displays the settings of most of the bits in the status register plus a couple of other items. - -**M906** can be used to set the `KVAL_HOLD` register (`TVAL` on L6474) one driver at a time. If a setting is not included with the command then the contents of the registers that affect the phase current/voltage are displayed. - -**M916, M917 & M918** - -These utilities are used to tune the system. They can get you in the ballpark for acceptable jerk, acceleration, top speed and `KVAL_HOLD` settings (`TVAL` on L6474). In general they seem to provide an overly optimistic `KVAL_HOLD` (`TVAL`) setting because of the lag between setting `KVAL_HOLD` (`TVAL`) and the driver reaching final temperature. Enabling the `L6470_monitor` feature during prints will provide the **final useful setting**. - -The amount of power needed to move the stepper without skipping steps increases as jerk, acceleration, top speed, and micro-steps increase. The power dissipated by the driver increases as the power to the stepper increases. The net result is a balancing act between jerk, acceleration, top speed, micro-steps, and power dissipated by the driver. - -**M916** - Increases `KVAL_HOLD` (`TVAL`) while moving one axis until a thermal warning is generated. This routine is also useful for determining the approximate `KVAL_HOLD` (`TVAL`) where the stepper stops losing steps. The sound will get noticeably quieter as it stops losing steps. - -**M917** - Find minimum current thresholds. This is accomplished by doing the following steps while moving an axis: - -1. Decrease OCD current until overcurrent error. - -2. Increase OCD until overcurrent error goes away. - -3. Decrease stall threshold until stall error (not available on the L6474). - -4. Increase stall until stall error goes away (not available on the L6474). - -**M918** - Increase speed until error or max feedrate achieved. diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp deleted file mode 100644 index 03e002f66f..0000000000 --- a/Marlin/src/libs/W25Qxx.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfig.h" - -#if HAS_SPI_FLASH - -#include "W25Qxx.h" -#include - -W25QXXFlash W25QXX; - -#ifndef SPI_FLASH_MISO_PIN - #define SPI_FLASH_MISO_PIN W25QXX_MISO_PIN -#endif -#ifndef SPI_FLASH_MOSI_PIN - #define SPI_FLASH_MOSI_PIN W25QXX_MOSI_PIN -#endif -#ifndef SPI_FLASH_SCK_PIN - #define SPI_FLASH_SCK_PIN W25QXX_SCK_PIN -#endif -#ifndef SPI_FLASH_CS_PIN - #define SPI_FLASH_CS_PIN W25QXX_CS_PIN -#endif - -#define W25QXX_CS_H OUT_WRITE(SPI_FLASH_CS_PIN, HIGH) -#define W25QXX_CS_L OUT_WRITE(SPI_FLASH_CS_PIN, LOW) - -void W25QXXFlash::init(uint8_t spiRate) { - - OUT_WRITE(SPI_FLASH_CS_PIN, HIGH); - - /** - * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz - * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1 - * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2 - */ - #if SPI_DEVICE == 1 - #define SPI_CLOCK_MAX SPI_CLOCK_DIV4 - #else - #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 - #endif - uint8_t clock; - switch (spiRate) { - case SPI_FULL_SPEED: clock = SPI_CLOCK_MAX; break; - case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break; - case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break; - case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break; - case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break; - case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break; - default: clock = SPI_CLOCK_DIV2;// Default from the SPI library - } - SPI.setModule(SPI_DEVICE); - SPI.begin(); - SPI.setClockDivider(clock); - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); -} - -/** - * @brief Receive a single byte from the SPI port. - * - * @return Byte received - */ -uint8_t W25QXXFlash::spi_flash_Rec() { - const uint8_t returnByte = SPI.transfer(0xFF); - return returnByte; -} - -uint8_t W25QXXFlash::spi_flash_read_write_byte(uint8_t data) { - const uint8_t returnByte = SPI.transfer(data); - return returnByte; -} - -/** - * @brief Receive a number of bytes from the SPI port to a buffer - * - * @param buf Pointer to starting address of buffer to write to. - * @param nbyte Number of bytes to receive. - * @return Nothing - * - * @details Uses DMA - */ -void W25QXXFlash::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer(0, const_cast(buf), nbyte); } - -/** - * @brief Send a single byte on SPI port - * - * @param b Byte to send - * - * @details - */ -void W25QXXFlash::spi_flash_Send(uint8_t b) { SPI.send(b); } - -/** - * @brief Write token and then write from 512 byte buffer to SPI (for SD card) - * - * @param buf Pointer with buffer start address - * @return Nothing - * - * @details Use DMA - */ -void W25QXXFlash::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { - SPI.send(token); - SPI.dmaSend(const_cast(buf), 512); -} - -uint16_t W25QXXFlash::W25QXX_ReadID(void) { - uint16_t Temp = 0; - W25QXX_CS_L; - spi_flash_Send(0x90); - spi_flash_Send(0x00); - spi_flash_Send(0x00); - spi_flash_Send(0x00); - Temp |= spi_flash_Rec() << 8; - Temp |= spi_flash_Rec(); - W25QXX_CS_H; - return Temp; -} - -void W25QXXFlash::SPI_FLASH_WriteEnable(void) { - /* Select the FLASH: Chip Select low */ - W25QXX_CS_L; - /* Send "Write Enable" instruction */ - spi_flash_Send(W25X_WriteEnable); - /* Deselect the FLASH: Chip Select high */ - W25QXX_CS_H; -} - -/******************************************************************************* -* Function Name : SPI_FLASH_WaitForWriteEnd -* Description : Polls the status of the Write In Progress (WIP) flag in the -* FLASH's status register and loop until write opertaion -* has completed. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void W25QXXFlash::SPI_FLASH_WaitForWriteEnd(void) { - uint8_t FLASH_Status = 0; - - /* Select the FLASH: Chip Select low */ - W25QXX_CS_L; - /* Send "Read Status Register" instruction */ - spi_flash_Send(W25X_ReadStatusReg); - - /* Loop as long as the memory is busy with a write cycle */ - do - /* Send a dummy byte to generate the clock needed by the FLASH - and put the value of the status register in FLASH_Status variable */ - FLASH_Status = spi_flash_Rec(); - while ((FLASH_Status & WIP_Flag) == 0x01); /* Write in progress */ - - /* Deselect the FLASH: Chip Select high */ - W25QXX_CS_H; -} - -void W25QXXFlash::SPI_FLASH_SectorErase(uint32_t SectorAddr) { - /* Send write enable instruction */ - SPI_FLASH_WriteEnable(); - - /* Sector Erase */ - /* Select the FLASH: Chip Select low */ - W25QXX_CS_L; - /* Send Sector Erase instruction */ - spi_flash_Send(W25X_SectorErase); - /* Send SectorAddr high nibble address byte */ - spi_flash_Send((SectorAddr & 0xFF0000) >> 16); - /* Send SectorAddr medium nibble address byte */ - spi_flash_Send((SectorAddr & 0xFF00) >> 8); - /* Send SectorAddr low nibble address byte */ - spi_flash_Send(SectorAddr & 0xFF); - /* Deselect the FLASH: Chip Select high */ - - W25QXX_CS_H; - /* Wait the end of Flash writing */ - SPI_FLASH_WaitForWriteEnd(); -} - -void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) { - SPI_FLASH_WriteEnable(); - W25QXX_CS_L; - /* Send Sector Erase instruction */ - spi_flash_Send(W25X_BlockErase); - /* Send SectorAddr high nibble address byte */ - spi_flash_Send((BlockAddr & 0xFF0000) >> 16); - /* Send SectorAddr medium nibble address byte */ - spi_flash_Send((BlockAddr & 0xFF00) >> 8); - /* Send SectorAddr low nibble address byte */ - spi_flash_Send(BlockAddr & 0xFF); - - W25QXX_CS_H; - - SPI_FLASH_WaitForWriteEnd(); -} - -/******************************************************************************* -* Function Name : SPI_FLASH_BulkErase -* Description : Erases the entire FLASH. -* Input : None -* Output : None -* Return : None -*******************************************************************************/ -void W25QXXFlash::SPI_FLASH_BulkErase(void) { - /* Send write enable instruction */ - SPI_FLASH_WriteEnable(); - - /* Bulk Erase */ - /* Select the FLASH: Chip Select low */ - W25QXX_CS_L; - - /* Send Bulk Erase instruction */ - spi_flash_Send(W25X_ChipErase); - /* Deselect the FLASH: Chip Select high */ - W25QXX_CS_H; - /* Wait the end of Flash writing */ - SPI_FLASH_WaitForWriteEnd(); -} - -/******************************************************************************* -* Function Name : SPI_FLASH_PageWrite -* Description : Writes more than one byte to the FLASH with a single WRITE -* cycle(Page WRITE sequence). The number of byte can't exceed -* the FLASH page size. -* Input : - pBuffer : pointer to the buffer containing the data to be -* written to the FLASH. -* - WriteAddr : FLASH's internal address to write to. -* - NumByteToWrite : number of bytes to write to the FLASH, -* must be equal or less than "SPI_FLASH_PageSize" value. -* Output : None -* Return : None -*******************************************************************************/ -void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { - /* Enable the write access to the FLASH */ - SPI_FLASH_WriteEnable(); - - /* Select the FLASH: Chip Select low */ - W25QXX_CS_L; - /* Send "Write to Memory " instruction */ - spi_flash_Send(W25X_PageProgram); - /* Send WriteAddr high nibble address byte to write to */ - spi_flash_Send((WriteAddr & 0xFF0000) >> 16); - /* Send WriteAddr medium nibble address byte to write to */ - spi_flash_Send((WriteAddr & 0xFF00) >> 8); - /* Send WriteAddr low nibble address byte to write to */ - spi_flash_Send(WriteAddr & 0xFF); - - NOMORE(NumByteToWrite, SPI_FLASH_PerWritePageSize); - - /* while there is data to be written on the FLASH */ - while (NumByteToWrite--) { - /* Send the current byte */ - spi_flash_Send(*pBuffer); - /* Point on the next byte to be written */ - pBuffer++; - } - - /* Deselect the FLASH: Chip Select high */ - W25QXX_CS_H; - - /* Wait the end of Flash writing */ - SPI_FLASH_WaitForWriteEnd(); -} - -/******************************************************************************* -* Function Name : SPI_FLASH_BufferWrite -* Description : Writes block of data to the FLASH. In this function, the -* number of WRITE cycles are reduced, using Page WRITE sequence. -* Input : - pBuffer : pointer to the buffer containing the data to be -* written to the FLASH. -* - WriteAddr : FLASH's internal address to write to. -* - NumByteToWrite : number of bytes to write to the FLASH. -* Output : None -* Return : None -*******************************************************************************/ -void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { - uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; - - Addr = WriteAddr % SPI_FLASH_PageSize; - count = SPI_FLASH_PageSize - Addr; - NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; - NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; - - if (Addr == 0) { /* WriteAddr is SPI_FLASH_PageSize aligned */ - if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */ - SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); - } - else { /* NumByteToWrite > SPI_FLASH_PageSize */ - while (NumOfPage--) { - SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); - WriteAddr += SPI_FLASH_PageSize; - pBuffer += SPI_FLASH_PageSize; - } - SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); - } - } - else { /* WriteAddr is not SPI_FLASH_PageSize aligned */ - if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */ - if (NumOfSingle > count) { /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */ - temp = NumOfSingle - count; - SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); - WriteAddr += count; - pBuffer += count; - SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp); - } - else { - SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); - } - } - else { /* NumByteToWrite > SPI_FLASH_PageSize */ - NumByteToWrite -= count; - NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; - NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; - - SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); - WriteAddr += count; - pBuffer += count; - - while (NumOfPage--) { - SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); - WriteAddr += SPI_FLASH_PageSize; - pBuffer += SPI_FLASH_PageSize; - } - - if (NumOfSingle != 0) - SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); - } - } -} - -/******************************************************************************* -* Function Name : SPI_FLASH_BufferRead -* Description : Reads a block of data from the FLASH. -* Input : - pBuffer : pointer to the buffer that receives the data read -* from the FLASH. -* - ReadAddr : FLASH's internal address to read from. -* - NumByteToRead : number of bytes to read from the FLASH. -* Output : None -* Return : None -*******************************************************************************/ -void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { - /* Select the FLASH: Chip Select low */ - W25QXX_CS_L; - - /* Send "Read from Memory " instruction */ - spi_flash_Send(W25X_ReadData); - - /* Send ReadAddr high nibble address byte to read from */ - spi_flash_Send((ReadAddr & 0xFF0000) >> 16); - /* Send ReadAddr medium nibble address byte to read from */ - spi_flash_Send((ReadAddr & 0xFF00) >> 8); - /* Send ReadAddr low nibble address byte to read from */ - spi_flash_Send(ReadAddr & 0xFF); - - if (NumByteToRead < 33) { - while (NumByteToRead--) { /* while there is data to be read */ - /* Read a byte from the FLASH */ - *pBuffer = spi_flash_Rec(); - /* Point to the next location where the byte read will be saved */ - pBuffer++; - } - } - else { - spi_flash_Read(pBuffer, NumByteToRead); - } - W25QXX_CS_H; -} - -#endif // HAS_SPI_FLASH diff --git a/Marlin/src/libs/W25Qxx.h b/Marlin/src/libs/W25Qxx.h deleted file mode 100644 index ac3e8a169b..0000000000 --- a/Marlin/src/libs/W25Qxx.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -#define W25X_WriteEnable 0x06 -#define W25X_WriteDisable 0x04 -#define W25X_ReadStatusReg 0x05 -#define W25X_WriteStatusReg 0x01 -#define W25X_ReadData 0x03 -#define W25X_FastReadData 0x0B -#define W25X_FastReadDual 0x3B -#define W25X_PageProgram 0x02 -#define W25X_BlockErase 0xD8 -#define W25X_SectorErase 0x20 -#define W25X_ChipErase 0xC7 -#define W25X_PowerDown 0xB9 -#define W25X_ReleasePowerDown 0xAB -#define W25X_DeviceID 0xAB -#define W25X_ManufactDeviceID 0x90 -#define W25X_JedecDeviceID 0x9F - -#define WIP_Flag 0x01 /* Write In Progress (WIP) flag */ - -#define Dummy_Byte 0xA5 - -#define SPI_FLASH_SectorSize 4096 -#define SPI_FLASH_PageSize 256 -#define SPI_FLASH_PerWritePageSize 256 - -class W25QXXFlash { -public: - void init(uint8_t spiRate); - static uint8_t spi_flash_Rec(); - static uint8_t spi_flash_read_write_byte(uint8_t data); - static void spi_flash_Read(uint8_t* buf, uint16_t nbyte); - static void spi_flash_Send(uint8_t b); - static void spi_flash_SendBlock(uint8_t token, const uint8_t* buf); - static uint16_t W25QXX_ReadID(void); - static void SPI_FLASH_WriteEnable(void); - static void SPI_FLASH_WaitForWriteEnd(void); - static void SPI_FLASH_SectorErase(uint32_t SectorAddr); - static void SPI_FLASH_BlockErase(uint32_t BlockAddr); - static void SPI_FLASH_BulkErase(void); - static void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); - static void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); - static void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); -}; - -extern W25QXXFlash W25QXX; diff --git a/Marlin/src/libs/bresenham.h b/Marlin/src/libs/bresenham.h deleted file mode 100644 index ade231e26d..0000000000 --- a/Marlin/src/libs/bresenham.h +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../core/serial.h" - -/** - * bresenham_t.h - Bresenham algorithm template - * - * An array of values / counters that tick together - */ - -#define FORCE_INLINE __attribute__((always_inline)) inline -#define _O3 __attribute__((optimize("O3"))) - -template -struct BresenhamCfg { static constexpr uint8_t UID = uid, SIZE = size; }; - -template -class Bresenham { -private: - - static constexpr T signtest = -1; - static_assert(signtest < 0, "Bresenham type must be signed!"); - -public: - - static T divisor, value[Cfg::SIZE], dir[Cfg::SIZE], dividend[Cfg::SIZE], counter[Cfg::SIZE]; - - // Default: Instantiate all items with the identical parameters - Bresenham(const T &inDivisor=1, const int8_t &inDir=1, const T &inDividend=1, const T &inValue=0) { - for (uint8_t i = 0; i < Cfg::SIZE; i++) init(i, inDivisor, inDir, inDividend, inValue); - } - - // Instantiate all items with the same divisor - Bresenham(const T &inDivisor, const int8_t (&inDir)[Cfg::SIZE], const T (&inDividend)[Cfg::SIZE], const T (&inValue)[Cfg::SIZE]={0}) { - init(inDivisor, inDir, inDividend, inValue); - } - - // Instantiate all items with the same divisor and direction - Bresenham(const T &inDivisor, const int8_t &inDir, const T (&inDividend)[Cfg::SIZE], const T (&inValue)[Cfg::SIZE]={0}) { - init(inDivisor, inDir, inDividend, inValue); - } - - // Init all items with the same parameters - FORCE_INLINE static void init(const uint8_t index, const T &inDivisor=1, const int8_t &inDir=1, const T &inDividend=1, const T &inValue=0) { - divisor = inDivisor; - dir[index] = inDir; - dividend[index] = inDividend; - value[index] = inValue; - prime(index); - } - - // Init all items with the same divisor - FORCE_INLINE static void init(const T &inDivisor, const int8_t (&inDir)[Cfg::SIZE], const T (&inDividend)[Cfg::SIZE], const T (&inValue)[Cfg::SIZE]={0}) { - divisor = inDivisor; - for (uint8_t i = 0; i < Cfg::SIZE; i++) { - dir[i] = inDir[i]; - dividend[i] = inDividend[i]; - value[i] = inValue[i]; - } - prime(); - } - - // Init all items with the same divisor and direction - FORCE_INLINE static void init(const T &inDivisor, const int8_t &inDir, const T (&inDividend)[Cfg::SIZE], const T (&inValue)[Cfg::SIZE]={0}) { - divisor = inDivisor; - for (uint8_t i = 0; i < Cfg::SIZE; i++) { - dir[i] = inDir; - dividend[i] = inDividend[i]; - value[i] = inValue[i]; - } - prime(); - } - - // Reinit item with new dir, dividend, value keeping the same divisor - FORCE_INLINE static void reinit(const uint8_t index, const int8_t &inDir=1, const T &inDividend=1, const T &inValue=0) { - dir[index] = inDir; - dividend[index] = inDividend; - value[index] = inValue; - prime(); - } - - FORCE_INLINE static void prime(const uint8_t index) { counter[index] = -(divisor / 2); } - FORCE_INLINE static void prime() { for (uint8_t i = 0; i < Cfg::SIZE; i++) prime(i); } - - FORCE_INLINE static void back(const uint8_t index) { counter[index] -= divisor; } - - FORCE_INLINE static bool tick1(const uint8_t index) { - counter[index] += dividend[index]; - return counter[index] > 0; - } - - FORCE_INLINE static void tick(const uint8_t index) { - if (tick1(index)) { value[index] += dir[index]; back(index); } - } - - FORCE_INLINE static void tick1() _O3 { for (uint8_t i = 0; i < Cfg::SIZE; i++) (void)tick1(i); } - - FORCE_INLINE static void tick() _O3 { for (uint8_t i = 0; i < Cfg::SIZE; i++) (void)tick(i); } - - static void report(const uint8_t index) { - if (index < Cfg::SIZE) { - SERIAL_ECHOPAIR("bresenham ", int(index), " : (", dividend[index], "/", divisor, ") "); - if (counter[index] >= 0) SERIAL_CHAR(' '); - if (labs(counter[index]) < 100) { SERIAL_CHAR(' '); if (labs(counter[index]) < 10) SERIAL_CHAR(' '); } - SERIAL_ECHO(counter[index]); - SERIAL_ECHOLNPAIR(" ... ", value[index]); - } - } - - static void report() { for (uint8_t i = 0; i < Cfg::SIZE; i++) report(i); } -}; diff --git a/Marlin/src/libs/buzzer.cpp b/Marlin/src/libs/buzzer.cpp index 8459695359..117104001e 100644 --- a/Marlin/src/libs/buzzer.cpp +++ b/Marlin/src/libs/buzzer.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,21 +16,17 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../inc/MarlinConfig.h" -#if USE_BEEPER +#if DISABLED(LCD_USE_I2C_BUZZER) && PIN_EXISTS(BEEPER) #include "buzzer.h" #include "../module/temperature.h" -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif - Buzzer::state_t Buzzer::state; CircularQueue Buzzer::buffer; Buzzer buzzer; @@ -62,15 +58,10 @@ void Buzzer::tick() { state.endtime = now + state.tone.duration; if (state.tone.frequency > 0) { - #if ENABLED(EXTENSIBLE_UI) - CRITICAL_SECTION_START(); - ExtUI::onPlayTone(state.tone.frequency, state.tone.duration); - CRITICAL_SECTION_END(); - #endif - #if ENABLED(SPEAKER) && (DISABLED(EXTENSIBLE_UI) || ENABLED(EXTUI_LOCAL_BEEPER)) - CRITICAL_SECTION_START(); + #if ENABLED(SPEAKER) + CRITICAL_SECTION_START; ::tone(BEEPER_PIN, state.tone.frequency, state.tone.duration); - CRITICAL_SECTION_END(); + CRITICAL_SECTION_END; #else on(); #endif @@ -79,4 +70,4 @@ void Buzzer::tick() { else if (ELAPSED(now, state.endtime)) reset(); } -#endif // USE_BEEPER +#endif // !LCD_USE_I2C_BUZZER && BEEPER diff --git a/Marlin/src/libs/buzzer.h b/Marlin/src/libs/buzzer.h index e901660c87..2da9b8dee7 100644 --- a/Marlin/src/libs/buzzer.h +++ b/Marlin/src/libs/buzzer.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,113 +16,112 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __BUZZER_H__ +#define __BUZZER_H__ #include "../inc/MarlinConfig.h" -#if USE_BEEPER +// Make a buzzer and macro +#if ENABLED(LCD_USE_I2C_BUZZER) + // BUZZ() will be defined in ultralcd.h +#elif PIN_EXISTS(BEEPER) - #include "circularqueue.h" +#include "circularqueue.h" - #define TONE_QUEUE_LENGTH 4 +#define TONE_QUEUE_LENGTH 4 - /** - * @brief Tone structure - * @details Simple abstraction of a tone based on a duration and a frequency. - */ - struct tone_t { - uint16_t duration; - uint16_t frequency; - }; +/** + * @brief Tone structure + * @details Simple abstraction of a tone based on a duration and a frequency. + */ +struct tone_t { + uint16_t duration; + uint16_t frequency; +}; - /** - * @brief Buzzer class - */ - class Buzzer { - public: +/** + * @brief Buzzer class + */ +class Buzzer { + public: - typedef struct { - tone_t tone; - uint32_t endtime; - } state_t; + typedef struct { + tone_t tone; + uint32_t endtime; + } state_t; - private: - static state_t state; + private: + static state_t state; - protected: - static CircularQueue buffer; + protected: + static CircularQueue buffer; - /** - * @brief Inverts the sate of a digital PIN - * @details This will invert the current state of an digital IO pin. - */ - FORCE_INLINE static void invert() { TOGGLE(BEEPER_PIN); } + /** + * @brief Inverts the sate of a digital PIN + * @details This will invert the current state of an digital IO pin. + */ + FORCE_INLINE static void invert() { TOGGLE(BEEPER_PIN); } - /** - * @brief Turn off a digital PIN - * @details Alias of digitalWrite(PIN, LOW) using FastIO - */ - FORCE_INLINE static void off() { WRITE(BEEPER_PIN, LOW); } + /** + * @brief Turn off a digital PIN + * @details Alias of digitalWrite(PIN, LOW) using FastIO + */ + FORCE_INLINE static void off() { WRITE(BEEPER_PIN, LOW); } - /** - * @brief Turn on a digital PIN - * @details Alias of digitalWrite(PIN, HIGH) using FastIO - */ - FORCE_INLINE static void on() { WRITE(BEEPER_PIN, HIGH); } + /** + * @brief Turn on a digital PIN + * @details Alias of digitalWrite(PIN, HIGH) using FastIO + */ + FORCE_INLINE static void on() { WRITE(BEEPER_PIN, HIGH); } - /** - * @brief Resets the state of the class - * @details Brings the class state to a known one. - */ - static inline void reset() { - off(); - state.endtime = 0; - } + /** + * @brief Resets the state of the class + * @details Brings the class state to a known one. + */ + static inline void reset() { + off(); + state.endtime = 0; + } - public: - /** - * @brief Init Buzzer - */ - static inline void init() { - SET_OUTPUT(BEEPER_PIN); - reset(); - } + public: + /** + * @brief Class constructor + */ + Buzzer() { + SET_OUTPUT(BEEPER_PIN); + reset(); + } - /** - * @brief Add a tone to the queue - * @details Adds a tone_t structure to the ring buffer, will block IO if the - * queue is full waiting for one slot to get available. - * - * @param duration Duration of the tone in milliseconds - * @param frequency Frequency of the tone in hertz - */ - static void tone(const uint16_t duration, const uint16_t frequency=0); + /** + * @brief Add a tone to the queue + * @details Adds a tone_t structure to the ring buffer, will block IO if the + * queue is full waiting for one slot to get available. + * + * @param duration Duration of the tone in milliseconds + * @param frequency Frequency of the tone in hertz + */ + static void tone(const uint16_t duration, const uint16_t frequency=0); - /** - * @brief Tick function - * @details This function should be called at loop, it will take care of - * playing the tones in the queue. - */ - static void tick(); - }; + /** + * @brief Tick function + * @details This function should be called at loop, it will take care of + * playing the tones in the queue. + */ + static void tick(); +}; // Provide a buzzer instance extern Buzzer buzzer; - - // Buzz directly via the BEEPER pin tone queue #define BUZZ(d,f) buzzer.tone(d, f) -#elif HAS_BUZZER +#else // No buzz capability - // Buzz indirectly via the MarlinUI instance - #define BUZZ(d,f) ui.buzz(d,f) - -#else - - // No buzz capability #define BUZZ(d,f) NOOP #endif + +#endif diff --git a/Marlin/src/libs/circularqueue.h b/Marlin/src/libs/circularqueue.h index 4d4a464b9c..d10e79bac9 100644 --- a/Marlin/src/libs/circularqueue.h +++ b/Marlin/src/libs/circularqueue.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __CIRCULARQUEUE_H__ +#define __CIRCULARQUEUE_H__ #include @@ -52,8 +54,8 @@ class CircularQueue { * items that can be stored on the queue. */ CircularQueue() { - buffer.size = N; - buffer.count = buffer.head = buffer.tail = 0; + this->buffer.size = N; + this->buffer.count = this->buffer.head = this->buffer.tail = 0; } /** @@ -63,15 +65,15 @@ class CircularQueue { * @return type T item */ T dequeue() { - if (isEmpty()) return T(); + if (this->isEmpty()) return T(); - uint8_t index = buffer.head; + uint8_t index = this->buffer.head; - --buffer.count; - if (++buffer.head == buffer.size) - buffer.head = 0; + --this->buffer.count; + if (++this->buffer.head == this->buffer.size) + this->buffer.head = 0; - return buffer.queue[index]; + return this->buffer.queue[index]; } /** @@ -82,13 +84,13 @@ class CircularQueue { * @return true if the operation was successful */ bool enqueue(T const &item) { - if (isFull()) return false; + if (this->isFull()) return false; - buffer.queue[buffer.tail] = item; + this->buffer.queue[this->buffer.tail] = item; - ++buffer.count; - if (++buffer.tail == buffer.size) - buffer.tail = 0; + ++this->buffer.count; + if (++this->buffer.tail == this->buffer.size) + this->buffer.tail = 0; return true; } @@ -98,21 +100,27 @@ class CircularQueue { * @details Returns true if there are no items on the queue, false otherwise. * @return true if queue is empty */ - bool isEmpty() { return buffer.count == 0; } + bool isEmpty() { + return this->buffer.count == 0; + } /** * @brief Checks if the queue is full * @details Returns true if the queue is full, false otherwise. * @return true if queue is full */ - bool isFull() { return buffer.count == buffer.size; } + bool isFull() { + return this->buffer.count == this->buffer.size; + } /** * @brief Gets the queue size * @details Returns the maximum number of items a queue can have. * @return the queue size */ - uint8_t size() { return buffer.size; } + uint8_t size() { + return this->buffer.size; + } /** * @brief Gets the next item from the queue without removing it @@ -120,12 +128,18 @@ class CircularQueue { * or updating the pointers. * @return first item in the queue */ - T peek() { return buffer.queue[buffer.head]; } + T peek() { + return this->buffer.queue[this->buffer.head]; + } /** * @brief Gets the number of items on the queue * @details Returns the current number of items stored on the queue. * @return number of items in the queue */ - uint8_t count() { return buffer.count; } + uint8_t count() { + return this->buffer.count; + } }; + +#endif diff --git a/Marlin/src/libs/crc16.cpp b/Marlin/src/libs/crc16.cpp deleted file mode 100644 index c2195619c7..0000000000 --- a/Marlin/src/libs/crc16.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "crc16.h" - -void crc16(uint16_t *crc, const void * const data, uint16_t cnt) { - uint8_t *ptr = (uint8_t *)data; - while (cnt--) { - *crc = (uint16_t)(*crc ^ (uint16_t)(((uint16_t)*ptr++) << 8)); - for (uint8_t i = 0; i < 8; i++) - *crc = (uint16_t)((*crc & 0x8000) ? ((uint16_t)(*crc << 1) ^ 0x1021) : (*crc << 1)); - } -} diff --git a/Marlin/src/libs/crc16.h b/Marlin/src/libs/crc16.h deleted file mode 100644 index 1760ecd6f8..0000000000 --- a/Marlin/src/libs/crc16.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -void crc16(uint16_t *crc, const void * const data, uint16_t cnt); diff --git a/Marlin/src/libs/duration_t.h b/Marlin/src/libs/duration_t.h index 31d8bab385..f38ab0224d 100644 --- a/Marlin/src/libs/duration_t.h +++ b/Marlin/src/libs/duration_t.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include "../HAL/shared/Marduino.h" +#ifndef __DURATION_T__ +#define __DURATION_T__ struct duration_t { /** @@ -120,7 +120,7 @@ struct duration_t { * 59m 59s * 59s */ - char* toString(char * const buffer) const { + void toString(char *buffer) const { int y = this->year(), d = this->day() % 365, h = this->hour() % 24, @@ -132,7 +132,6 @@ struct duration_t { else if (h) sprintf_P(buffer, PSTR("%ih %im %is"), h, m, s); else if (m) sprintf_P(buffer, PSTR("%im %is"), m, s); else sprintf_P(buffer, PSTR("%is"), s); - return buffer; } /** @@ -151,16 +150,18 @@ struct duration_t { m = uint16_t(this->minute() % 60UL); if (with_days) { uint16_t d = this->day(); - sprintf_P(buffer, PSTR("%hud %02hu:%02hu"), d, h % 24, m); + sprintf_P(buffer, PSTR("%ud %02u:%02u"), d, h % 24, m); return d >= 10 ? 9 : 8; } else if (h < 100) { - sprintf_P(buffer, PSTR("%02hu:%02hu"), h, m); + sprintf_P(buffer, PSTR("%02u:%02u"), h, m); return 5; } else { - sprintf_P(buffer, PSTR("%hu:%02hu"), h, m); + sprintf_P(buffer, PSTR("%u:%02u"), h, m); return 6; } } }; + +#endif // __DURATION_T__ diff --git a/Marlin/src/libs/heatshrink/LICENSE b/Marlin/src/libs/heatshrink/LICENSE deleted file mode 100644 index a40fc72b91..0000000000 --- a/Marlin/src/libs/heatshrink/LICENSE +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (c) 2013-2015, Scott Vokes -All rights reserved. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Marlin/src/libs/heatshrink/heatshrink_common.h b/Marlin/src/libs/heatshrink/heatshrink_common.h deleted file mode 100644 index c8dc95406e..0000000000 --- a/Marlin/src/libs/heatshrink/heatshrink_common.h +++ /dev/null @@ -1,20 +0,0 @@ -/** - * libs/heatshrink/heatshrink_common.h - */ -#pragma once - -#define HEATSHRINK_AUTHOR "Scott Vokes " -#define HEATSHRINK_URL "https://github.com/atomicobject/heatshrink" - -/* Version 0.4.1 */ -#define HEATSHRINK_VERSION_MAJOR 0 -#define HEATSHRINK_VERSION_MINOR 4 -#define HEATSHRINK_VERSION_PATCH 1 - -#define HEATSHRINK_MIN_WINDOW_BITS 4 -#define HEATSHRINK_MAX_WINDOW_BITS 15 - -#define HEATSHRINK_MIN_LOOKAHEAD_BITS 3 - -#define HEATSHRINK_LITERAL_MARKER 0x01 -#define HEATSHRINK_BACKREF_MARKER 0x00 diff --git a/Marlin/src/libs/heatshrink/heatshrink_config.h b/Marlin/src/libs/heatshrink/heatshrink_config.h deleted file mode 100644 index 90520f1264..0000000000 --- a/Marlin/src/libs/heatshrink/heatshrink_config.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * libs/heatshrink/heatshrink_config.h - */ -#pragma once - -// Should functionality assuming dynamic allocation be used? -#ifndef HEATSHRINK_DYNAMIC_ALLOC - //#define HEATSHRINK_DYNAMIC_ALLOC 1 -#endif - -#if HEATSHRINK_DYNAMIC_ALLOC - // Optional replacement of malloc/free - #define HEATSHRINK_MALLOC(SZ) malloc(SZ) - #define HEATSHRINK_FREE(P, SZ) free(P) -#else - // Required parameters for static configuration - #define HEATSHRINK_STATIC_INPUT_BUFFER_SIZE 32 - #define HEATSHRINK_STATIC_WINDOW_BITS 8 - #define HEATSHRINK_STATIC_LOOKAHEAD_BITS 4 -#endif - -// Turn on logging for debugging -#define HEATSHRINK_DEBUGGING_LOGS 0 - -// Use indexing for faster compression. (This requires additional space.) -#define HEATSHRINK_USE_INDEX 1 diff --git a/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp b/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp deleted file mode 100644 index 3f0f828cd7..0000000000 --- a/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -#if ENABLED(BINARY_FILE_TRANSFER) - -/** - * libs/heatshrink/heatshrink_decoder.cpp - */ -#include "heatshrink_decoder.h" - -#include -#include - -#pragma GCC optimize ("O3") - -/* States for the polling state machine. */ -typedef enum { - HSDS_TAG_BIT, /* tag bit */ - HSDS_YIELD_LITERAL, /* ready to yield literal byte */ - HSDS_BACKREF_INDEX_MSB, /* most significant byte of index */ - HSDS_BACKREF_INDEX_LSB, /* least significant byte of index */ - HSDS_BACKREF_COUNT_MSB, /* most significant byte of count */ - HSDS_BACKREF_COUNT_LSB, /* least significant byte of count */ - HSDS_YIELD_BACKREF /* ready to yield back-reference */ -} HSD_state; - -#if HEATSHRINK_DEBUGGING_LOGS - #include - #include - #include - #define LOG(...) fprintf(stderr, __VA_ARGS__) - #define ASSERT(X) assert(X) - static const char *state_names[] = { - "tag_bit", - "yield_literal", - "backref_index_msb", - "backref_index_lsb", - "backref_count_msb", - "backref_count_lsb", - "yield_backref" - }; -#else - #define LOG(...) /* no-op */ - #define ASSERT(X) /* no-op */ -#endif - -typedef struct { - uint8_t *buf; /* output buffer */ - size_t buf_size; /* buffer size */ - size_t *output_size; /* bytes pushed to buffer, so far */ -} output_info; - -#define NO_BITS ((uint16_t)-1) - -/* Forward references. */ -static uint16_t get_bits(heatshrink_decoder *hsd, uint8_t count); -static void push_byte(heatshrink_decoder *hsd, output_info *oi, uint8_t byte); - -#if HEATSHRINK_DYNAMIC_ALLOC -heatshrink_decoder *heatshrink_decoder_alloc(uint16_t input_buffer_size, uint8_t window_sz2, uint8_t lookahead_sz2) { - if ((window_sz2 < HEATSHRINK_MIN_WINDOW_BITS) || - (window_sz2 > HEATSHRINK_MAX_WINDOW_BITS) || - (input_buffer_size == 0) || - (lookahead_sz2 < HEATSHRINK_MIN_LOOKAHEAD_BITS) || - (lookahead_sz2 >= window_sz2)) { - return nullptr; - } - size_t buffers_sz = (1 << window_sz2) + input_buffer_size; - size_t sz = sizeof(heatshrink_decoder) + buffers_sz; - heatshrink_decoder *hsd = HEATSHRINK_MALLOC(sz); - if (hsd == nullptr) return nullptr; - hsd->input_buffer_size = input_buffer_size; - hsd->window_sz2 = window_sz2; - hsd->lookahead_sz2 = lookahead_sz2; - heatshrink_decoder_reset(hsd); - LOG("-- allocated decoder with buffer size of %zu (%zu + %u + %u)\n", - sz, sizeof(heatshrink_decoder), (1 << window_sz2), input_buffer_size); - return hsd; -} - -void heatshrink_decoder_free(heatshrink_decoder *hsd) { - size_t buffers_sz = (1 << hsd->window_sz2) + hsd->input_buffer_size; - size_t sz = sizeof(heatshrink_decoder) + buffers_sz; - HEATSHRINK_FREE(hsd, sz); - (void)sz; /* may not be used by free */ -} -#endif - -void heatshrink_decoder_reset(heatshrink_decoder *hsd) { - size_t buf_sz = 1 << HEATSHRINK_DECODER_WINDOW_BITS(hsd); - size_t input_sz = HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd); - memset(hsd->buffers, 0, buf_sz + input_sz); - hsd->state = HSDS_TAG_BIT; - hsd->input_size = 0; - hsd->input_index = 0; - hsd->bit_index = 0x00; - hsd->current_byte = 0x00; - hsd->output_count = 0; - hsd->output_index = 0; - hsd->head_index = 0; -} - -/* Copy SIZE bytes into the decoder's input buffer, if it will fit. */ -HSD_sink_res heatshrink_decoder_sink(heatshrink_decoder *hsd, - uint8_t *in_buf, size_t size, size_t *input_size) { - if (hsd == nullptr || in_buf == nullptr || input_size == nullptr) - return HSDR_SINK_ERROR_NULL; - - size_t rem = HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd) - hsd->input_size; - if (rem == 0) { - *input_size = 0; - return HSDR_SINK_FULL; - } - - size = rem < size ? rem : size; - LOG("-- sinking %zd bytes\n", size); - /* copy into input buffer (at head of buffers) */ - memcpy(&hsd->buffers[hsd->input_size], in_buf, size); - hsd->input_size += size; - *input_size = size; - return HSDR_SINK_OK; -} - - -/***************** - * Decompression * - *****************/ - -#define BACKREF_COUNT_BITS(HSD) (HEATSHRINK_DECODER_LOOKAHEAD_BITS(HSD)) -#define BACKREF_INDEX_BITS(HSD) (HEATSHRINK_DECODER_WINDOW_BITS(HSD)) - -// States -static HSD_state st_tag_bit(heatshrink_decoder *hsd); -static HSD_state st_yield_literal(heatshrink_decoder *hsd, output_info *oi); -static HSD_state st_backref_index_msb(heatshrink_decoder *hsd); -static HSD_state st_backref_index_lsb(heatshrink_decoder *hsd); -static HSD_state st_backref_count_msb(heatshrink_decoder *hsd); -static HSD_state st_backref_count_lsb(heatshrink_decoder *hsd); -static HSD_state st_yield_backref(heatshrink_decoder *hsd, output_info *oi); - -HSD_poll_res heatshrink_decoder_poll(heatshrink_decoder *hsd, uint8_t *out_buf, size_t out_buf_size, size_t *output_size) { - if (hsd == nullptr || out_buf == nullptr || output_size == nullptr) - return HSDR_POLL_ERROR_NULL; - - *output_size = 0; - - output_info oi; - oi.buf = out_buf; - oi.buf_size = out_buf_size; - oi.output_size = output_size; - - while (1) { - LOG("-- poll, state is %d (%s), input_size %d\n", hsd->state, state_names[hsd->state], hsd->input_size); - uint8_t in_state = hsd->state; - switch (in_state) { - case HSDS_TAG_BIT: - hsd->state = st_tag_bit(hsd); - break; - case HSDS_YIELD_LITERAL: - hsd->state = st_yield_literal(hsd, &oi); - break; - case HSDS_BACKREF_INDEX_MSB: - hsd->state = st_backref_index_msb(hsd); - break; - case HSDS_BACKREF_INDEX_LSB: - hsd->state = st_backref_index_lsb(hsd); - break; - case HSDS_BACKREF_COUNT_MSB: - hsd->state = st_backref_count_msb(hsd); - break; - case HSDS_BACKREF_COUNT_LSB: - hsd->state = st_backref_count_lsb(hsd); - break; - case HSDS_YIELD_BACKREF: - hsd->state = st_yield_backref(hsd, &oi); - break; - default: - return HSDR_POLL_ERROR_UNKNOWN; - } - - // If the current state cannot advance, check if input or output - // buffer are exhausted. - if (hsd->state == in_state) - return (*output_size == out_buf_size) ? HSDR_POLL_MORE : HSDR_POLL_EMPTY; - } -} - -static HSD_state st_tag_bit(heatshrink_decoder *hsd) { - uint32_t bits = get_bits(hsd, 1); // get tag bit - if (bits == NO_BITS) - return HSDS_TAG_BIT; - else if (bits) - return HSDS_YIELD_LITERAL; - else if (HEATSHRINK_DECODER_WINDOW_BITS(hsd) > 8) - return HSDS_BACKREF_INDEX_MSB; - else { - hsd->output_index = 0; - return HSDS_BACKREF_INDEX_LSB; - } -} - -static HSD_state st_yield_literal(heatshrink_decoder *hsd, output_info *oi) { - /* Emit a repeated section from the window buffer, and add it (again) - * to the window buffer. (Note that the repetition can include - * itself.)*/ - if (*oi->output_size < oi->buf_size) { - uint16_t byte = get_bits(hsd, 8); - if (byte == NO_BITS) { return HSDS_YIELD_LITERAL; } /* out of input */ - uint8_t *buf = &hsd->buffers[HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd)]; - uint16_t mask = (1 << HEATSHRINK_DECODER_WINDOW_BITS(hsd)) - 1; - uint8_t c = byte & 0xFF; - LOG("-- emitting literal byte 0x%02x ('%c')\n", c, isprint(c) ? c : '.'); - buf[hsd->head_index++ & mask] = c; - push_byte(hsd, oi, c); - return HSDS_TAG_BIT; - } - return HSDS_YIELD_LITERAL; -} - -static HSD_state st_backref_index_msb(heatshrink_decoder *hsd) { - uint8_t bit_ct = BACKREF_INDEX_BITS(hsd); - ASSERT(bit_ct > 8); - uint16_t bits = get_bits(hsd, bit_ct - 8); - LOG("-- backref index (msb), got 0x%04x (+1)\n", bits); - if (bits == NO_BITS) { return HSDS_BACKREF_INDEX_MSB; } - hsd->output_index = bits << 8; - return HSDS_BACKREF_INDEX_LSB; -} - -static HSD_state st_backref_index_lsb(heatshrink_decoder *hsd) { - uint8_t bit_ct = BACKREF_INDEX_BITS(hsd); - uint16_t bits = get_bits(hsd, bit_ct < 8 ? bit_ct : 8); - LOG("-- backref index (lsb), got 0x%04x (+1)\n", bits); - if (bits == NO_BITS) { return HSDS_BACKREF_INDEX_LSB; } - hsd->output_index |= bits; - hsd->output_index++; - uint8_t br_bit_ct = BACKREF_COUNT_BITS(hsd); - hsd->output_count = 0; - return (br_bit_ct > 8) ? HSDS_BACKREF_COUNT_MSB : HSDS_BACKREF_COUNT_LSB; -} - -static HSD_state st_backref_count_msb(heatshrink_decoder *hsd) { - uint8_t br_bit_ct = BACKREF_COUNT_BITS(hsd); - ASSERT(br_bit_ct > 8); - uint16_t bits = get_bits(hsd, br_bit_ct - 8); - LOG("-- backref count (msb), got 0x%04x (+1)\n", bits); - if (bits == NO_BITS) { return HSDS_BACKREF_COUNT_MSB; } - hsd->output_count = bits << 8; - return HSDS_BACKREF_COUNT_LSB; -} - -static HSD_state st_backref_count_lsb(heatshrink_decoder *hsd) { - uint8_t br_bit_ct = BACKREF_COUNT_BITS(hsd); - uint16_t bits = get_bits(hsd, br_bit_ct < 8 ? br_bit_ct : 8); - LOG("-- backref count (lsb), got 0x%04x (+1)\n", bits); - if (bits == NO_BITS) { return HSDS_BACKREF_COUNT_LSB; } - hsd->output_count |= bits; - hsd->output_count++; - return HSDS_YIELD_BACKREF; -} - -static HSD_state st_yield_backref(heatshrink_decoder *hsd, output_info *oi) { - size_t count = oi->buf_size - *oi->output_size; - if (count > 0) { - size_t i = 0; - if (hsd->output_count < count) count = hsd->output_count; - uint8_t *buf = &hsd->buffers[HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd)]; - uint16_t mask = (1 << HEATSHRINK_DECODER_WINDOW_BITS(hsd)) - 1; - uint16_t neg_offset = hsd->output_index; - LOG("-- emitting %zu bytes from -%u bytes back\n", count, neg_offset); - ASSERT(neg_offset <= mask + 1); - ASSERT(count <= (size_t)(1 << BACKREF_COUNT_BITS(hsd))); - - for (i = 0; i < count; i++) { - uint8_t c = buf[(hsd->head_index - neg_offset) & mask]; - push_byte(hsd, oi, c); - buf[hsd->head_index & mask] = c; - hsd->head_index++; - LOG(" -- ++ 0x%02x\n", c); - } - hsd->output_count -= count; - if (hsd->output_count == 0) { return HSDS_TAG_BIT; } - } - return HSDS_YIELD_BACKREF; -} - -/* Get the next COUNT bits from the input buffer, saving incremental progress. - * Returns NO_BITS on end of input, or if more than 15 bits are requested. */ -static uint16_t get_bits(heatshrink_decoder *hsd, uint8_t count) { - uint16_t accumulator = 0; - int i = 0; - if (count > 15) return NO_BITS; - LOG("-- popping %u bit(s)\n", count); - - /* If we aren't able to get COUNT bits, suspend immediately, because we - * don't track how many bits of COUNT we've accumulated before suspend. */ - if (hsd->input_size == 0 && hsd->bit_index < (1 << (count - 1))) return NO_BITS; - - for (i = 0; i < count; i++) { - if (hsd->bit_index == 0x00) { - if (hsd->input_size == 0) { - LOG(" -- out of bits, suspending w/ accumulator of %u (0x%02x)\n", accumulator, accumulator); - return NO_BITS; - } - hsd->current_byte = hsd->buffers[hsd->input_index++]; - LOG(" -- pulled byte 0x%02x\n", hsd->current_byte); - if (hsd->input_index == hsd->input_size) { - hsd->input_index = 0; /* input is exhausted */ - hsd->input_size = 0; - } - hsd->bit_index = 0x80; - } - accumulator <<= 1; - if (hsd->current_byte & hsd->bit_index) { - accumulator |= 0x01; - if (0) { - LOG(" -- got 1, accumulator 0x%04x, bit_index 0x%02x\n", - accumulator, hsd->bit_index); - } - } - else if (0) { - LOG(" -- got 0, accumulator 0x%04x, bit_index 0x%02x\n", - accumulator, hsd->bit_index); - } - hsd->bit_index >>= 1; - } - - if (count > 1) LOG(" -- accumulated %08x\n", accumulator); - return accumulator; -} - -HSD_finish_res heatshrink_decoder_finish(heatshrink_decoder *hsd) { - if (hsd == nullptr) { return HSDR_FINISH_ERROR_NULL; } - switch (hsd->state) { - case HSDS_TAG_BIT: - return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; - - /* If we want to finish with no input, but are in these states, it's - * because the 0-bit padding to the last byte looks like a backref - * marker bit followed by all 0s for index and count bits. */ - case HSDS_BACKREF_INDEX_LSB: - case HSDS_BACKREF_INDEX_MSB: - case HSDS_BACKREF_COUNT_LSB: - case HSDS_BACKREF_COUNT_MSB: - return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; - - /* If the output stream is padded with 0xFFs (possibly due to being in - * flash memory), also explicitly check the input size rather than - * uselessly returning MORE but yielding 0 bytes when polling. */ - case HSDS_YIELD_LITERAL: - return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; - - default: return HSDR_FINISH_MORE; - } -} - -static void push_byte(heatshrink_decoder *hsd, output_info *oi, uint8_t byte) { - LOG(" -- pushing byte: 0x%02x ('%c')\n", byte, isprint(byte) ? byte : '.'); - oi->buf[(*oi->output_size)++] = byte; - (void)hsd; -} - -#endif // BINARY_FILE_TRANSFER diff --git a/Marlin/src/libs/heatshrink/heatshrink_decoder.h b/Marlin/src/libs/heatshrink/heatshrink_decoder.h deleted file mode 100644 index eb113aa5e5..0000000000 --- a/Marlin/src/libs/heatshrink/heatshrink_decoder.h +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * libs/heatshrink/heatshrink_decoder.h - */ -#pragma once - -#include "heatshrink_common.h" -#include "heatshrink_config.h" - -#include -#include - -typedef enum { - HSDR_SINK_OK, /* data sunk, ready to poll */ - HSDR_SINK_FULL, /* out of space in internal buffer */ - HSDR_SINK_ERROR_NULL=-1, /* NULL argument */ -} HSD_sink_res; - -typedef enum { - HSDR_POLL_EMPTY, /* input exhausted */ - HSDR_POLL_MORE, /* more data remaining, call again w/ fresh output buffer */ - HSDR_POLL_ERROR_NULL=-1, /* NULL arguments */ - HSDR_POLL_ERROR_UNKNOWN=-2, -} HSD_poll_res; - -typedef enum { - HSDR_FINISH_DONE, /* output is done */ - HSDR_FINISH_MORE, /* more output remains */ - HSDR_FINISH_ERROR_NULL=-1, /* NULL arguments */ -} HSD_finish_res; - -#if HEATSHRINK_DYNAMIC_ALLOC -#define HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(BUF) \ - ((BUF)->input_buffer_size) -#define HEATSHRINK_DECODER_WINDOW_BITS(BUF) \ - ((BUF)->window_sz2) -#define HEATSHRINK_DECODER_LOOKAHEAD_BITS(BUF) \ - ((BUF)->lookahead_sz2) -#else -#define HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(_) \ - HEATSHRINK_STATIC_INPUT_BUFFER_SIZE -#define HEATSHRINK_DECODER_WINDOW_BITS(_) \ - (HEATSHRINK_STATIC_WINDOW_BITS) -#define HEATSHRINK_DECODER_LOOKAHEAD_BITS(BUF) \ - (HEATSHRINK_STATIC_LOOKAHEAD_BITS) -#endif - -typedef struct { - uint16_t input_size; /* bytes in input buffer */ - uint16_t input_index; /* offset to next unprocessed input byte */ - uint16_t output_count; /* how many bytes to output */ - uint16_t output_index; /* index for bytes to output */ - uint16_t head_index; /* head of window buffer */ - uint8_t state; /* current state machine node */ - uint8_t current_byte; /* current byte of input */ - uint8_t bit_index; /* current bit index */ - -#if HEATSHRINK_DYNAMIC_ALLOC - /* Fields that are only used if dynamically allocated. */ - uint8_t window_sz2; /* window buffer bits */ - uint8_t lookahead_sz2; /* lookahead bits */ - uint16_t input_buffer_size; /* input buffer size */ - - /* Input buffer, then expansion window buffer */ - uint8_t buffers[]; -#else - /* Input buffer, then expansion window buffer */ - uint8_t buffers[(1 << HEATSHRINK_DECODER_WINDOW_BITS(_)) + HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(_)]; -#endif -} heatshrink_decoder; - -#if HEATSHRINK_DYNAMIC_ALLOC -/* Allocate a decoder with an input buffer of INPUT_BUFFER_SIZE bytes, - * an expansion buffer size of 2^WINDOW_SZ2, and a lookahead - * size of 2^lookahead_sz2. (The window buffer and lookahead sizes - * must match the settings used when the data was compressed.) - * Returns NULL on error. */ -heatshrink_decoder *heatshrink_decoder_alloc(uint16_t input_buffer_size, uint8_t expansion_buffer_sz2, uint8_t lookahead_sz2); - -/* Free a decoder. */ -void heatshrink_decoder_free(heatshrink_decoder *hsd); -#endif - -/* Reset a decoder. */ -void heatshrink_decoder_reset(heatshrink_decoder *hsd); - -/* Sink at most SIZE bytes from IN_BUF into the decoder. *INPUT_SIZE is set to - * indicate how many bytes were actually sunk (in case a buffer was filled). */ -HSD_sink_res heatshrink_decoder_sink(heatshrink_decoder *hsd, uint8_t *in_buf, size_t size, size_t *input_size); - -/* Poll for output from the decoder, copying at most OUT_BUF_SIZE bytes into - * OUT_BUF (setting *OUTPUT_SIZE to the actual amount copied). */ -HSD_poll_res heatshrink_decoder_poll(heatshrink_decoder *hsd, uint8_t *out_buf, size_t out_buf_size, size_t *output_size); - -/* Notify the dencoder that the input stream is finished. - * If the return value is HSDR_FINISH_MORE, there is still more output, so - * call heatshrink_decoder_poll and repeat. */ -HSD_finish_res heatshrink_decoder_finish(heatshrink_decoder *hsd); diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp deleted file mode 100644 index 0f746d6284..0000000000 --- a/Marlin/src/libs/hex_print.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../inc/MarlinConfigPre.h" - -#if NEED_HEX_PRINT - -#include "hex_print.h" -#include "../core/serial.h" - -#ifdef CPU_32_BIT - constexpr int byte_start = 4; - static char _hex[] = "0x00000000"; -#else - constexpr int byte_start = 0; - static char _hex[] = "0x0000"; -#endif - -char* hex_byte(const uint8_t b) { - _hex[byte_start + 4] = hex_nybble(b >> 4); - _hex[byte_start + 5] = hex_nybble(b); - return &_hex[byte_start + 4]; -} - -inline void _hex_word(const uint16_t w) { - _hex[byte_start + 2] = hex_nybble(w >> 12); - _hex[byte_start + 3] = hex_nybble(w >> 8); - _hex[byte_start + 4] = hex_nybble(w >> 4); - _hex[byte_start + 5] = hex_nybble(w); -} - -char* hex_word(const uint16_t w) { - _hex_word(w); - return &_hex[byte_start + 2]; -} - -#ifdef CPU_32_BIT - char* hex_long(const uintptr_t l) { - _hex[2] = hex_nybble(l >> 28); - _hex[3] = hex_nybble(l >> 24); - _hex[4] = hex_nybble(l >> 20); - _hex[5] = hex_nybble(l >> 16); - _hex_word((uint16_t)(l & 0xFFFF)); - return &_hex[2]; - } -#endif - -char* hex_address(const void * const w) { - #ifdef CPU_32_BIT - (void)hex_long((uintptr_t)w); - #else - (void)hex_word((uintptr_t)w); - #endif - return _hex; -} - -void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } -void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } -void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } -void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } - -void print_hex_long(const uint32_t w, const char delimiter) { - SERIAL_ECHOPGM("0x"); - for (int B = 24; B >= 8; B -= 8){ - print_hex_byte(w >> B); - SERIAL_CHAR(delimiter); - } - print_hex_byte(w); -} - -#endif // NEED_HEX_PRINT diff --git a/Marlin/src/libs/hex_print.h b/Marlin/src/libs/hex_print.h deleted file mode 100644 index 40baa15bcc..0000000000 --- a/Marlin/src/libs/hex_print.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// -// Utility functions to create and print hex strings as nybble, byte, and word. -// - -FORCE_INLINE char hex_nybble(const uint8_t n) { - return (n & 0xF) + ((n & 0xF) < 10 ? '0' : 'A' - 10); -} -char* hex_byte(const uint8_t b); -char* hex_word(const uint16_t w); -char* hex_address(const void * const w); - -void print_hex_nybble(const uint8_t n); -void print_hex_byte(const uint8_t b); -void print_hex_word(const uint16_t w); -void print_hex_address(const void * const w); -void print_hex_long(const uint32_t w, const char delimiter); diff --git a/Marlin/src/libs/hex_print_routines.cpp b/Marlin/src/libs/hex_print_routines.cpp new file mode 100644 index 0000000000..7baacbe287 --- /dev/null +++ b/Marlin/src/libs/hex_print_routines.cpp @@ -0,0 +1,84 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../inc/MarlinConfig.h" +#include "../gcode/parser.h" + +// Needed for M101 - RTOS Task Report. We can collapse this later, but for now it is nice to +// always have the hex print functions available. +// +//#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(M100_FREE_MEMORY_WATCHER) || ENABLED(DEBUG_GCODE_PARSER) + + #include "hex_print_routines.h" + + #ifdef CPU_32_BIT + constexpr int byte_start = 4; + static char _hex[] = "0x00000000"; + #else + constexpr int byte_start = 0; + static char _hex[] = "0x0000"; + #endif + + char* hex_byte(const uint8_t b) { + _hex[byte_start + 4] = hex_nybble(b >> 4); + _hex[byte_start + 5] = hex_nybble(b); + return &_hex[byte_start + 4]; + } + + inline void _hex_word(const uint16_t w) { + _hex[byte_start + 2] = hex_nybble(w >> 12); + _hex[byte_start + 3] = hex_nybble(w >> 8); + _hex[byte_start + 4] = hex_nybble(w >> 4); + _hex[byte_start + 5] = hex_nybble(w); + } + + char* hex_word(const uint16_t w) { + _hex_word(w); + return &_hex[byte_start + 2]; + } + + #ifdef CPU_32_BIT + char* hex_long(const uint32_t l) { + _hex[2] = hex_nybble(l >> 28); + _hex[3] = hex_nybble(l >> 24); + _hex[4] = hex_nybble(l >> 20); + _hex[5] = hex_nybble(l >> 16); + _hex_word((uint16_t)(l & 0xFFFF)); + return &_hex[2]; + } + #endif + + char* hex_address(const void * const w) { + #ifdef CPU_32_BIT + (void)hex_long((ptr_int_t)w); + #else + (void)hex_word((ptr_int_t)w); + #endif + return _hex; + } + + void print_hex_nybble(const uint8_t n) { SERIAL_CHAR(hex_nybble(n)); } + void print_hex_byte(const uint8_t b) { SERIAL_ECHO(hex_byte(b)); } + void print_hex_word(const uint16_t w) { SERIAL_ECHO(hex_word(w)); } + void print_hex_address(const void * const w) { SERIAL_ECHO(hex_address(w)); } + +//#endif // AUTO_BED_LEVELING_UBL || M100_FREE_MEMORY_WATCHER || DEBUG_GCODE_PARSER diff --git a/Marlin/src/libs/hex_print_routines.h b/Marlin/src/libs/hex_print_routines.h new file mode 100644 index 0000000000..859b79fe31 --- /dev/null +++ b/Marlin/src/libs/hex_print_routines.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef HEX_PRINT_ROUTINES_H +#define HEX_PRINT_ROUTINES_H + +#include + +// +// Utility functions to create and print hex strings as nybble, byte, and word. +// + +FORCE_INLINE char hex_nybble(const uint8_t n) { + return (n & 0xF) + ((n & 0xF) < 10 ? '0' : 'A' - 10); +} +char* hex_byte(const uint8_t b); +char* hex_word(const uint16_t w); +char* hex_address(const void * const w); + +void print_hex_nybble(const uint8_t n); +void print_hex_byte(const uint8_t b); +void print_hex_word(const uint16_t w); +void print_hex_address(const void * const w); + +#ifdef CPU_32_BIT + typedef uint32_t ptr_int_t; +#else + typedef uint16_t ptr_int_t; +#endif + +#endif // HEX_PRINT_ROUTINES_H diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp index c7593c049f..6d7fc580d8 100644 --- a/Marlin/src/libs/least_squares_fit.cpp +++ b/Marlin/src/libs/least_squares_fit.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -29,11 +29,12 @@ * it saves roughly 10K of program memory. It also does not require all of * coordinates to be present during the calculations. Each point can be * probed and then discarded. + * */ #include "../inc/MarlinConfig.h" -#if NEED_LSF +#if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(AUTO_BED_LEVELING_LINEAR) #include "least_squares_fit.h" @@ -66,4 +67,4 @@ int finish_incremental_LSF(struct linear_fit_data *lsf) { return 0; } -#endif // NEED_LSF +#endif // AUTO_BED_LEVELING_UBL || ENABLED(AUTO_BED_LEVELING_LINEAR) diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h index 44ca8afc76..cbd42d2c6b 100644 --- a/Marlin/src/libs/least_squares_fit.h +++ b/Marlin/src/libs/least_squares_fit.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Incremental Least Squares Best Fit By Roxy and Ed Williams @@ -30,8 +29,12 @@ * it saves roughly 10K of program memory. And even better... the data * fed into the algorithm does not need to all be present at the same time. * A point can be probed and its values fed into the algorithm and then discarded. + * */ +#ifndef _LEAST_SQUARES_FIT_H_ +#define _LEAST_SQUARES_FIT_H_ + #include "../inc/MarlinConfig.h" #include @@ -43,32 +46,28 @@ struct linear_fit_data { A, B, D, N; }; -inline void incremental_LSF_reset(struct linear_fit_data *lsf) { +void inline incremental_LSF_reset(struct linear_fit_data *lsf) { memset(lsf, 0, sizeof(linear_fit_data)); } -inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z, const float &w) { +void inline incremental_WLSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z, const float &w) { // weight each accumulator by factor w, including the "number" of samples // (analogous to calling inc_LSF twice with same values to weight it by 2X) - const float wx = w * x, wy = w * y, wz = w * z; - lsf->xbar += wx; - lsf->ybar += wy; - lsf->zbar += wz; - lsf->x2bar += wx * x; - lsf->y2bar += wy * y; - lsf->z2bar += wz * z; - lsf->xybar += wx * y; - lsf->xzbar += wx * z; - lsf->yzbar += wy * z; + lsf->xbar += w * x; + lsf->ybar += w * y; + lsf->zbar += w * z; + lsf->x2bar += w * x * x; // don't use sq(x) -- let compiler re-use w*x four times + lsf->y2bar += w * y * y; + lsf->z2bar += w * z * z; + lsf->xybar += w * x * y; + lsf->xzbar += w * x * z; + lsf->yzbar += w * y * z; lsf->N += w; - lsf->max_absx = _MAX(ABS(wx), lsf->max_absx); - lsf->max_absy = _MAX(ABS(wy), lsf->max_absy); -} -inline void incremental_WLSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z, const float &w) { - incremental_WLSF(lsf, pos.x, pos.y, z, w); + lsf->max_absx = MAX(ABS(w * x), lsf->max_absx); + lsf->max_absy = MAX(ABS(w * y), lsf->max_absy); } -inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z) { +void inline incremental_LSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z) { lsf->xbar += x; lsf->ybar += y; lsf->zbar += z; @@ -78,12 +77,11 @@ inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const f lsf->xybar += x * y; lsf->xzbar += x * z; lsf->yzbar += y * z; - lsf->max_absx = _MAX(ABS(x), lsf->max_absx); - lsf->max_absy = _MAX(ABS(y), lsf->max_absy); + lsf->max_absx = MAX(ABS(x), lsf->max_absx); + lsf->max_absy = MAX(ABS(y), lsf->max_absy); lsf->N += 1.0; } -inline void incremental_LSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z) { - incremental_LSF(lsf, pos.x, pos.y, z); -} int finish_incremental_LSF(struct linear_fit_data *); + +#endif // _LEAST_SQUARES_FIT_H_ diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index 10021005e5..fd845685d8 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,20 +16,19 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include "../inc/MarlinConfig.h" -#if EITHER(NOZZLE_CLEAN_FEATURE, NOZZLE_PARK_FEATURE) +#if ENABLED(NOZZLE_CLEAN_FEATURE) || ENABLED(NOZZLE_PARK_FEATURE) #include "nozzle.h" -Nozzle nozzle; - -#include "../MarlinCore.h" +#include "../Marlin.h" #include "../module/motion.h" +#include "point_t.h" #if ENABLED(NOZZLE_CLEAN_FEATURE) @@ -37,64 +36,53 @@ Nozzle nozzle; * @brief Stroke clean pattern * @details Wipes the nozzle back and forth in a linear movement * - * @param start xyz_pos_t defining the starting point - * @param end xyz_pos_t defining the ending point + * @param start point_t defining the starting point + * @param end point_t defining the ending point * @param strokes number of strokes to execute */ - void Nozzle::stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) { - TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t oldpos = current_position); - - // Move to the starting point - #if ENABLED(NOZZLE_CLEAN_NO_Z) - #if ENABLED(NOZZLE_CLEAN_NO_Y) - do_blocking_move_to_x(start.x); - #else - do_blocking_move_to_xy(start); - #endif - #else - do_blocking_move_to(start); + void Nozzle::stroke(const point_t &start, const point_t &end, const uint8_t &strokes) { + #if ENABLED(NOZZLE_CLEAN_GOBACK) + const float ix = current_position[X_AXIS], iy = current_position[Y_AXIS], iz = current_position[Z_AXIS]; #endif + // Move to the starting point + do_blocking_move_to(start.x, start.y, start.z); + // Start the stroke pattern - LOOP_L_N(i, strokes >> 1) { - #if ENABLED(NOZZLE_CLEAN_NO_Y) - do_blocking_move_to_x(end.x); - do_blocking_move_to_x(start.x); - #else - do_blocking_move_to_xy(end); - do_blocking_move_to_xy(start); - #endif + for (uint8_t i = 0; i < (strokes >> 1); i++) { + do_blocking_move_to_xy(end.x, end.y); + do_blocking_move_to_xy(start.x, start.y); } - TERN_(NOZZLE_CLEAN_GOBACK, do_blocking_move_to(oldpos)); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + do_blocking_move_to(ix, iy, iz); + #endif } /** * @brief Zig-zag clean pattern * @details Apply a zig-zag cleaning pattern * - * @param start xyz_pos_t defining the starting point - * @param end xyz_pos_t defining the ending point + * @param start point_t defining the starting point + * @param end point_t defining the ending point * @param strokes number of strokes to execute * @param objects number of triangles to do */ - void Nozzle::zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes, const uint8_t &objects) { - const xy_pos_t diff = end - start; - if (!diff.x || !diff.y) return; + void Nozzle::zigzag(const point_t &start, const point_t &end, const uint8_t &strokes, const uint8_t &objects) { + const float diffx = end.x - start.x, diffy = end.y - start.y; + if (!diffx || !diffy) return; - TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t back = current_position); - - #if ENABLED(NOZZLE_CLEAN_NO_Z) - do_blocking_move_to_xy(start); - #else - do_blocking_move_to(start); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + const float ix = current_position[X_AXIS], iy = current_position[Y_AXIS], iz = current_position[Z_AXIS]; #endif + do_blocking_move_to(start.x, start.y, start.z); + const uint8_t zigs = objects << 1; - const bool horiz = ABS(diff.x) >= ABS(diff.y); // Do a horizontal wipe? - const float P = (horiz ? diff.x : diff.y) / zigs; // Period of each zig / zag - const xyz_pos_t *side; - LOOP_L_N(j, strokes) { + const bool horiz = ABS(diffx) >= ABS(diffy); // Do a horizontal wipe? + const float P = (horiz ? diffx : diffy) / zigs; // Period of each zig / zag + const point_t *side; + for (uint8_t j = 0; j < strokes; j++) { for (int8_t i = 0; i < zigs; i++) { side = (i & 1) ? &end : &start; if (horiz) @@ -111,34 +99,41 @@ Nozzle nozzle; } } - TERN_(NOZZLE_CLEAN_GOBACK, do_blocking_move_to(back)); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + do_blocking_move_to(ix, iy, iz); + #endif } /** * @brief Circular clean pattern * @details Apply a circular cleaning pattern * - * @param start xyz_pos_t defining the middle of circle + * @param start point_t defining the middle of circle * @param strokes number of strokes to execute * @param radius radius of circle */ - void Nozzle::circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) { + void Nozzle::circle(const point_t &start, const point_t &middle, const uint8_t &strokes, const float &radius) { if (strokes == 0) return; - TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t back = current_position); - TERN(NOZZLE_CLEAN_NO_Z, do_blocking_move_to_xy, do_blocking_move_to)(start); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + const float ix = current_position[X_AXIS], iy = current_position[Y_AXIS], iz = current_position[Z_AXIS]; + #endif - LOOP_L_N(s, strokes) - LOOP_L_N(i, NOZZLE_CLEAN_CIRCLE_FN) + do_blocking_move_to(start.x, start.y, start.z); + + for (uint8_t s = 0; s < strokes; s++) + for (uint8_t i = 0; i < NOZZLE_CLEAN_CIRCLE_FN; i++) do_blocking_move_to_xy( middle.x + sin((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius, middle.y + cos((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius ); // Let's be safe - do_blocking_move_to_xy(start); + do_blocking_move_to_xy(start.x, start.y); - TERN_(NOZZLE_CLEAN_GOBACK, do_blocking_move_to(back)); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + do_blocking_move_to(ix, iy, iz); + #endif } /** @@ -148,53 +143,18 @@ Nozzle nozzle; * @param pattern one of the available patterns * @param argument depends on the cleaning pattern */ - void Nozzle::clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects, const uint8_t cleans) { - xyz_pos_t start[HOTENDS] = NOZZLE_CLEAN_START_POINT, end[HOTENDS] = NOZZLE_CLEAN_END_POINT, middle[HOTENDS] = NOZZLE_CLEAN_CIRCLE_MIDDLE; - - const uint8_t arrPos = ANY(SINGLENOZZLE, MIXING_EXTRUDER) ? 0 : active_extruder; - - #if HAS_SOFTWARE_ENDSTOPS - - #define LIMIT_AXIS(A) do{ \ - LIMIT( start[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \ - LIMIT(middle[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \ - LIMIT( end[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \ - }while(0) - - if (soft_endstop.enabled()) { - - LIMIT_AXIS(x); - LIMIT_AXIS(y); - LIMIT_AXIS(z); - const bool radiusOutOfRange = (middle[arrPos].x + radius > soft_endstop.max.x) - || (middle[arrPos].x - radius < soft_endstop.min.x) - || (middle[arrPos].y + radius > soft_endstop.max.y) - || (middle[arrPos].y - radius < soft_endstop.min.y); - if (radiusOutOfRange && pattern == 2) { - SERIAL_ECHOLNPGM("Warning: Radius Out of Range"); - return; - } - - } - - #endif - - if (pattern == 2) { - if (!(cleans & (_BV(X_AXIS) | _BV(Y_AXIS)))) { - SERIAL_ECHOLNPGM("Warning: Clean Circle requires XY"); - return; - } - } - else { - if (!TEST(cleans, X_AXIS)) start[arrPos].x = end[arrPos].x = current_position.x; - if (!TEST(cleans, Y_AXIS)) start[arrPos].y = end[arrPos].y = current_position.y; - } - if (!TEST(cleans, Z_AXIS)) start[arrPos].z = end[arrPos].z = current_position.z; - + void Nozzle::clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects/*=0*/) { switch (pattern) { - case 1: zigzag(start[arrPos], end[arrPos], strokes, objects); break; - case 2: circle(start[arrPos], middle[arrPos], strokes, radius); break; - default: stroke(start[arrPos], end[arrPos], strokes); + case 1: + zigzag(NOZZLE_CLEAN_START_POINT, NOZZLE_CLEAN_END_POINT, strokes, objects); + break; + + case 2: + circle(NOZZLE_CLEAN_START_POINT, NOZZLE_CLEAN_CIRCLE_MIDDLE, strokes, radius); + break; + + default: + stroke(NOZZLE_CLEAN_START_POINT, NOZZLE_CLEAN_END_POINT, strokes); } } @@ -202,8 +162,9 @@ Nozzle nozzle; #if ENABLED(NOZZLE_PARK_FEATURE) - void Nozzle::park(const uint8_t z_action, const xyz_pos_t &park/*=NOZZLE_PARK_POINT*/) { - constexpr feedRate_t fr_xy = NOZZLE_PARK_XY_FEEDRATE, fr_z = NOZZLE_PARK_Z_FEEDRATE; + void Nozzle::park(const uint8_t z_action, const point_t &park /*= NOZZLE_PARK_POINT*/) { + const float fr_xy = NOZZLE_PARK_XY_FEEDRATE; + const float fr_z = NOZZLE_PARK_Z_FEEDRATE; switch (z_action) { case 1: // Go to Z-park height @@ -211,27 +172,14 @@ Nozzle nozzle; break; case 2: // Raise by Z-park height - do_blocking_move_to_z(_MIN(current_position.z + park.z, Z_MAX_POS), fr_z); + do_blocking_move_to_z(MIN(current_position[Z_AXIS] + park.z, Z_MAX_POS), fr_z); break; - default: { - // Apply a minimum raise, overriding G27 Z - const float min_raised_z =_MIN(Z_MAX_POS, current_position.z - #ifdef NOZZLE_PARK_Z_RAISE_MIN - + NOZZLE_PARK_Z_RAISE_MIN - #endif - ); - do_blocking_move_to_z(_MAX(park.z, min_raised_z), fr_z); - } break; + default: // Raise to at least the Z-park height + do_blocking_move_to_z(MAX(park.z, current_position[Z_AXIS]), fr_z); } - do_blocking_move_to_xy( - TERN(NOZZLE_PARK_Y_ONLY, current_position, park).x, - TERN(NOZZLE_PARK_X_ONLY, current_position, park).y, - fr_xy - ); - - report_current_position(); + do_blocking_move_to_xy(park.x, park.y, fr_xy); } #endif // NOZZLE_PARK_FEATURE diff --git a/Marlin/src/libs/nozzle.h b/Marlin/src/libs/nozzle.h index 81594b1381..3adf6f3ac8 100644 --- a/Marlin/src/libs/nozzle.h +++ b/Marlin/src/libs/nozzle.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,15 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __NOZZLE_H__ +#define __NOZZLE_H__ #include "../inc/MarlinConfig.h" +#include "point_t.h" /** * @brief Nozzle class @@ -37,32 +40,32 @@ class Nozzle { * @brief Stroke clean pattern * @details Wipes the nozzle back and forth in a linear movement * - * @param start xyz_pos_t defining the starting point - * @param end xyz_pos_t defining the ending point + * @param start point_t defining the starting point + * @param end point_t defining the ending point * @param strokes number of strokes to execute */ - static void stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) _Os; + static void stroke(const point_t &start, const point_t &end, const uint8_t &strokes) _Os; /** * @brief Zig-zag clean pattern * @details Apply a zig-zag cleaning pattern * - * @param start xyz_pos_t defining the starting point - * @param end xyz_pos_t defining the ending point + * @param start point_t defining the starting point + * @param end point_t defining the ending point * @param strokes number of strokes to execute * @param objects number of objects to create */ - static void zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes, const uint8_t &objects) _Os; + static void zigzag(const point_t &start, const point_t &end, const uint8_t &strokes, const uint8_t &objects) _Os; /** * @brief Circular clean pattern * @details Apply a circular cleaning pattern * - * @param start xyz_pos_t defining the middle of circle + * @param start point_t defining the middle of circle * @param strokes number of strokes to execute * @param radius radius of circle */ - static void circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) _Os; + static void circle(const point_t &start, const point_t &middle, const uint8_t &strokes, const float &radius) _Os; #endif // NOZZLE_CLEAN_FEATURE @@ -77,15 +80,15 @@ class Nozzle { * @param pattern one of the available patterns * @param argument depends on the cleaning pattern */ - static void clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects, const uint8_t cleans) _Os; + static void clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects=0) _Os; #endif // NOZZLE_CLEAN_FEATURE #if ENABLED(NOZZLE_PARK_FEATURE) - static void park(const uint8_t z_action, const xyz_pos_t &park=NOZZLE_PARK_POINT) _Os; + static void park(const uint8_t z_action, const point_t &park=NOZZLE_PARK_POINT) _Os; #endif }; -extern Nozzle nozzle; +#endif // __NOZZLE_H__ diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp deleted file mode 100644 index c3efb2b25a..0000000000 --- a/Marlin/src/libs/numtostr.cpp +++ /dev/null @@ -1,404 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "numtostr.h" - -#include "../inc/MarlinConfigPre.h" -#include "../core/utility.h" - -char conv[8] = { 0 }; - -#define DIGIT(n) ('0' + (n)) -#define DIGIMOD(n, f) DIGIT((n)/(f) % 10) -#define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') -#define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) -#define INTFLOAT(V,N) (((V) * 10 * pow(10, N) + ((V) < 0 ? -5: 5)) / 10) // pow10? -#define UINTFLOAT(V,N) INTFLOAT((V) < 0 ? -(V) : (V), N) - -// Convert a full-range unsigned 8bit int to a percentage -const char* ui8tostr4pctrj(const uint8_t i) { - const uint8_t n = ui8_to_percent(i); - conv[3] = RJDIGIT(n, 100); - conv[4] = RJDIGIT(n, 10); - conv[5] = DIGIMOD(n, 1); - conv[6] = '%'; - return &conv[3]; -} - -// Convert unsigned 8bit int to string 123 format -const char* ui8tostr3rj(const uint8_t i) { - conv[4] = RJDIGIT(i, 100); - conv[5] = RJDIGIT(i, 10); - conv[6] = DIGIMOD(i, 1); - return &conv[4]; -} - -// Convert uint8_t to string with 12 format -const char* ui8tostr2(const uint8_t i) { - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return &conv[5]; -} - -// Convert signed 8bit int to rj string with 123 or -12 format -const char* i8tostr3rj(const int8_t x) { - int xx = x; - conv[4] = MINUSOR(xx, RJDIGIT(xx, 100)); - conv[5] = RJDIGIT(xx, 10); - conv[6] = DIGIMOD(xx, 1); - return &conv[4]; -} - -#if HAS_PRINT_PROGRESS_PERMYRIAD - // Convert unsigned 16-bit permyriad to percent with 100 / 23 / 23.4 / 3.45 format - const char* permyriadtostr4(const uint16_t xx) { - if (xx >= 10000) - return "100"; - else if (xx >= 1000) { - conv[3] = DIGIMOD(xx, 1000); - conv[4] = DIGIMOD(xx, 100); - conv[5] = '.'; - conv[6] = DIGIMOD(xx, 10); - return &conv[3]; - } - else if (xx % 100 == 0) { - conv[4] = ' '; - conv[5] = RJDIGIT(xx, 1000); - conv[6] = DIGIMOD(xx, 100); - return &conv[4]; - } - else { - conv[3] = DIGIMOD(xx, 100); - conv[4] = '.'; - conv[5] = DIGIMOD(xx, 10); - conv[6] = RJDIGIT(xx, 1); - return &conv[3]; - } - } -#endif - -// Convert unsigned 16bit int to string 12345 format -const char* ui16tostr5rj(const uint16_t xx) { - conv[2] = RJDIGIT(xx, 10000); - conv[3] = RJDIGIT(xx, 1000); - conv[4] = RJDIGIT(xx, 100); - conv[5] = RJDIGIT(xx, 10); - conv[6] = DIGIMOD(xx, 1); - return &conv[2]; -} - -// Convert unsigned 16bit int to string 1234 format -const char* ui16tostr4rj(const uint16_t xx) { - conv[3] = RJDIGIT(xx, 1000); - conv[4] = RJDIGIT(xx, 100); - conv[5] = RJDIGIT(xx, 10); - conv[6] = DIGIMOD(xx, 1); - return &conv[3]; -} - -// Convert unsigned 16bit int to string 123 format -const char* ui16tostr3rj(const uint16_t xx) { - conv[4] = RJDIGIT(xx, 100); - conv[5] = RJDIGIT(xx, 10); - conv[6] = DIGIMOD(xx, 1); - return &conv[4]; -} - -// Convert signed 16bit int to rj string with 123 or -12 format -const char* i16tostr3rj(const int16_t x) { - int xx = x; - conv[4] = MINUSOR(xx, RJDIGIT(xx, 100)); - conv[5] = RJDIGIT(xx, 10); - conv[6] = DIGIMOD(xx, 1); - return &conv[4]; -} - -// Convert unsigned 16bit int to lj string with 123 format -const char* i16tostr3left(const int16_t i) { - char *str = &conv[6]; - *str = DIGIMOD(i, 1); - if (i >= 10) { - *(--str) = DIGIMOD(i, 10); - if (i >= 100) - *(--str) = DIGIMOD(i, 100); - } - return str; -} - -// Convert signed 16bit int to rj string with 1234, _123, -123, _-12, or __-1 format -const char* i16tostr4signrj(const int16_t i) { - const bool neg = i < 0; - const int ii = neg ? -i : i; - if (i >= 1000) { - conv[3] = DIGIMOD(ii, 1000); - conv[4] = DIGIMOD(ii, 100); - conv[5] = DIGIMOD(ii, 10); - } - else if (ii >= 100) { - conv[3] = neg ? '-' : ' '; - conv[4] = DIGIMOD(ii, 100); - conv[5] = DIGIMOD(ii, 10); - } - else { - conv[3] = ' '; - conv[4] = ' '; - if (ii >= 10) { - conv[4] = neg ? '-' : ' '; - conv[5] = DIGIMOD(ii, 10); - } - else { - conv[5] = neg ? '-' : ' '; - } - } - conv[6] = DIGIMOD(ii, 1); - return &conv[3]; -} - -// Convert unsigned float to string with 1.23 format -const char* ftostr12ns(const float &f) { - const long i = UINTFLOAT(f, 2); - conv[3] = DIGIMOD(i, 100); - conv[4] = '.'; - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return &conv[3]; -} - -// Convert unsigned float to string with 12.3 format -const char* ftostr31ns(const float &f) { - const long i = UINTFLOAT(f, 1); - conv[3] = DIGIMOD(i, 100); - conv[4] = DIGIMOD(i, 10); - conv[5] = '.'; - conv[6] = DIGIMOD(i, 1); - return &conv[3]; -} - -// Convert unsigned float to string with 123.4 format -const char* ftostr41ns(const float &f) { - const long i = UINTFLOAT(f, 1); - conv[2] = DIGIMOD(i, 1000); - conv[3] = DIGIMOD(i, 100); - conv[4] = DIGIMOD(i, 10); - conv[5] = '.'; - conv[6] = DIGIMOD(i, 1); - return &conv[2]; -} - -// Convert signed float to fixed-length string with 12.34 / _2.34 / -2.34 or -23.45 / 123.45 format -const char* ftostr42_52(const float &f) { - if (f <= -10 || f >= 100) return ftostr52(f); // -23.45 / 123.45 - long i = INTFLOAT(f, 2); - conv[2] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 1000)); - conv[3] = DIGIMOD(i, 100); - conv[4] = '.'; - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return &conv[2]; -} - -// Convert signed float to fixed-length string with 023.45 / -23.45 format -const char* ftostr52(const float &f) { - long i = INTFLOAT(f, 2); - conv[1] = MINUSOR(i, DIGIMOD(i, 10000)); - conv[2] = DIGIMOD(i, 1000); - conv[3] = DIGIMOD(i, 100); - conv[4] = '.'; - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return &conv[1]; -} - -// Convert signed float to fixed-length string with 12.345 / _2.345 / -2.345 or -23.45 / 123.45 format -const char* ftostr53_63(const float &f) { - if (f <= -10 || f >= 100) return ftostr63(f); // -23.456 / 123.456 - long i = INTFLOAT(f, 3); - conv[1] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 10000)); - conv[2] = DIGIMOD(i, 1000); - conv[3] = '.'; - conv[4] = DIGIMOD(i, 100); - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return &conv[1]; -} - -// Convert signed float to fixed-length string with 023.456 / -23.456 format -const char* ftostr63(const float &f) { - long i = INTFLOAT(f, 3); - conv[0] = MINUSOR(i, DIGIMOD(i, 100000)); - conv[1] = DIGIMOD(i, 10000); - conv[2] = DIGIMOD(i, 1000); - conv[3] = '.'; - conv[4] = DIGIMOD(i, 100); - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return &conv[0]; -} - -#if ENABLED(LCD_DECIMAL_SMALL_XY) - - // Convert float to rj string with 1234, _123, -123, _-12, 12.3, _1.2, or -1.2 format - const char* ftostr4sign(const float &f) { - const int i = INTFLOAT(f, 1); - if (!WITHIN(i, -99, 999)) return i16tostr4signrj((int)f); - const bool neg = i < 0; - const int ii = neg ? -i : i; - conv[3] = neg ? '-' : (ii >= 100 ? DIGIMOD(ii, 100) : ' '); - conv[4] = DIGIMOD(ii, 10); - conv[5] = '.'; - conv[6] = DIGIMOD(ii, 1); - return &conv[3]; - } - -#endif - -// Convert float to fixed-length string with +12.3 / -12.3 format -const char* ftostr31sign(const float &f) { - int i = INTFLOAT(f, 1); - conv[2] = MINUSOR(i, '+'); - conv[3] = DIGIMOD(i, 100); - conv[4] = DIGIMOD(i, 10); - conv[5] = '.'; - conv[6] = DIGIMOD(i, 1); - return &conv[2]; -} - -// Convert float to fixed-length string with +123.4 / -123.4 format -const char* ftostr41sign(const float &f) { - int i = INTFLOAT(f, 1); - conv[1] = MINUSOR(i, '+'); - conv[2] = DIGIMOD(i, 1000); - conv[3] = DIGIMOD(i, 100); - conv[4] = DIGIMOD(i, 10); - conv[5] = '.'; - conv[6] = DIGIMOD(i, 1); - return &conv[1]; -} - -// Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format -const char* ftostr43sign(const float &f, char plus/*=' '*/) { - long i = INTFLOAT(f, 3); - conv[1] = i ? MINUSOR(i, plus) : ' '; - conv[2] = DIGIMOD(i, 1000); - conv[3] = '.'; - conv[4] = DIGIMOD(i, 100); - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return &conv[1]; -} - -// Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format -const char* ftostr54sign(const float &f, char plus/*=' '*/) { - long i = INTFLOAT(f, 4); - conv[0] = i ? MINUSOR(i, plus) : ' '; - conv[1] = DIGIMOD(i, 10000); - conv[2] = '.'; - conv[3] = DIGIMOD(i, 1000); - conv[4] = DIGIMOD(i, 100); - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return &conv[0]; -} - -// Convert unsigned float to rj string with 12345 format -const char* ftostr5rj(const float &f) { - const long i = UINTFLOAT(f, 0); - return ui16tostr5rj(i); -} - -// Convert signed float to string with +1234.5 format -const char* ftostr51sign(const float &f) { - long i = INTFLOAT(f, 1); - conv[0] = MINUSOR(i, '+'); - conv[1] = DIGIMOD(i, 10000); - conv[2] = DIGIMOD(i, 1000); - conv[3] = DIGIMOD(i, 100); - conv[4] = DIGIMOD(i, 10); - conv[5] = '.'; - conv[6] = DIGIMOD(i, 1); - return conv; -} - -// Convert signed float to string with +123.45 format -const char* ftostr52sign(const float &f) { - long i = INTFLOAT(f, 2); - conv[0] = MINUSOR(i, '+'); - conv[1] = DIGIMOD(i, 10000); - conv[2] = DIGIMOD(i, 1000); - conv[3] = DIGIMOD(i, 100); - conv[4] = '.'; - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return conv; -} - -// Convert signed float to string with +12.345 format -const char* ftostr53sign(const float &f) { - long i = INTFLOAT(f, 3); - conv[0] = MINUSOR(i, '+'); - conv[1] = DIGIMOD(i, 10000); - conv[2] = DIGIMOD(i, 1000); - conv[3] = '.'; - conv[4] = DIGIMOD(i, 100); - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIMOD(i, 1); - return conv; -} - -// Convert unsigned float to string with ____4.5, __34.5, _234.5, 1234.5 format -const char* ftostr51rj(const float &f) { - const long i = UINTFLOAT(f, 1); - conv[0] = ' '; - conv[1] = RJDIGIT(i, 10000); - conv[2] = RJDIGIT(i, 1000); - conv[3] = RJDIGIT(i, 100); - conv[4] = DIGIMOD(i, 10); - conv[5] = '.'; - conv[6] = DIGIMOD(i, 1); - return conv; -} - -// Convert signed float to space-padded string with -_23.4_ format -const char* ftostr52sp(const float &f) { - long i = INTFLOAT(f, 2); - uint8_t dig; - conv[0] = MINUSOR(i, ' '); - conv[1] = RJDIGIT(i, 10000); - conv[2] = RJDIGIT(i, 1000); - conv[3] = DIGIMOD(i, 100); - - if ((dig = i % 10)) { // second digit after decimal point? - conv[4] = '.'; - conv[5] = DIGIMOD(i, 10); - conv[6] = DIGIT(dig); - } - else { - if ((dig = (i / 10) % 10)) { // first digit after decimal point? - conv[4] = '.'; - conv[5] = DIGIT(dig); - } - else // nothing after decimal point - conv[4] = conv[5] = ' '; - conv[6] = ' '; - } - return conv; -} diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h deleted file mode 100644 index e7c1e67e12..0000000000 --- a/Marlin/src/libs/numtostr.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include - -// Convert a full-range unsigned 8bit int to a percentage -const char* ui8tostr4pctrj(const uint8_t i); - -// Convert uint8_t to string with 12 format -const char* ui8tostr2(const uint8_t x); - -// Convert uint8_t to string with 123 format -const char* ui8tostr3rj(const uint8_t i); - -// Convert int8_t to string with 123 format -const char* i8tostr3rj(const int8_t x); - -#if HAS_PRINT_PROGRESS_PERMYRIAD - // Convert 16-bit unsigned permyriad value to percent: 100 / 23 / 23.4 / 3.45 - const char* permyriadtostr4(const uint16_t xx); -#endif - -// Convert uint16_t to string with 12345 format -const char* ui16tostr5rj(const uint16_t x); - -// Convert uint16_t to string with 1234 format -const char* ui16tostr4rj(const uint16_t x); - -// Convert uint16_t to string with 123 format -const char* ui16tostr3rj(const uint16_t x); - -// Convert int16_t to string with 123 format -const char* i16tostr3rj(const int16_t x); - -// Convert unsigned int to lj string with 123 format -const char* i16tostr3left(const int16_t xx); - -// Convert signed int to rj string with _123, -123, _-12, or __-1 format -const char* i16tostr4signrj(const int16_t x); - -// Convert unsigned float to string with 1.23 format -const char* ftostr12ns(const float &x); - -// Convert unsigned float to string with 12.3 format -const char* ftostr31ns(const float &x); - -// Convert unsigned float to string with 123.4 format -const char* ftostr41ns(const float &x); - -// Convert signed float to fixed-length string with 12.34 / _2.34 / -2.34 or -23.45 / 123.45 format -const char* ftostr42_52(const float &x); - -// Convert signed float to fixed-length string with 023.45 / -23.45 format -const char* ftostr52(const float &x); - -// Convert signed float to fixed-length string with 12.345 / -2.345 or 023.456 / -23.456 format -const char* ftostr53_63(const float &x); - -// Convert signed float to fixed-length string with 023.456 / -23.456 format -const char* ftostr63(const float &x); - -// Convert float to fixed-length string with +12.3 / -12.3 format -const char* ftostr31sign(const float &x); - -// Convert float to fixed-length string with +123.4 / -123.4 format -const char* ftostr41sign(const float &x); - -// Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format -const char* ftostr43sign(const float &x, char plus=' '); - -// Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format -const char* ftostr54sign(const float &x, char plus=' '); - -// Convert unsigned float to rj string with 12345 format -const char* ftostr5rj(const float &x); - -// Convert signed float to string with +1234.5 format -const char* ftostr51sign(const float &x); - -// Convert signed float to space-padded string with -_23.4_ format -const char* ftostr52sp(const float &x); - -// Convert signed float to string with +123.45 format -const char* ftostr52sign(const float &x); - -// Convert signed float to string with +12.345 format -const char* ftostr53sign(const float &f); - -// Convert unsigned float to string with 1234.5 format omitting trailing zeros -const char* ftostr51rj(const float &x); - -#include "../core/macros.h" - -// Convert float to rj string with 123 or -12 format -FORCE_INLINE const char* ftostr3(const float &x) { return i16tostr3rj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(LCD_DECIMAL_SMALL_XY) - // Convert float to rj string with 1234, _123, 12.3, _1.2, -123, _-12, or -1.2 format - const char* ftostr4sign(const float &fx); -#else - // Convert float to rj string with 1234, _123, -123, __12, _-12, ___1, or __-1 format - FORCE_INLINE const char* ftostr4sign(const float &x) { return i16tostr4signrj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } -#endif diff --git a/Marlin/src/libs/point_t.h b/Marlin/src/libs/point_t.h new file mode 100644 index 0000000000..37ade7eba7 --- /dev/null +++ b/Marlin/src/libs/point_t.h @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef __POINT_T__ +#define __POINT_T__ + +/** + * @brief Cartesian Point + * @details Represents a three dimensional point on Cartesian coordinate system, + * using an additional fourth dimension for the extrusion length. + * + * @param x The x-coordinate of the point. + * @param y The y-coordinate of the point. + * @param z The z-coordinate of the point. + */ +struct point_t { + float x, y, z; + + /** + * @brief Three dimensional point constructor + * + * @param x The x-coordinate of the point. + * @param y The y-coordinate of the point. + * @param z The z-coordinate of the point. + */ + point_t(const float x, const float y, const float z) : x(x), y(y), z(z) {} + + /** + * @brief Two dimensional point constructor + * + * @param x The x-coordinate of the point. + * @param y The y-coordinate of the point. + */ + point_t(const float x, const float y) : point_t(x, y, NAN) {} + +}; + +#endif // __POINT_T__ diff --git a/Marlin/src/libs/private_spi.h b/Marlin/src/libs/private_spi.h index 9c0ffe7486..7998de7bea 100644 --- a/Marlin/src/libs/private_spi.h +++ b/Marlin/src/libs/private_spi.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef __PRIVATE_SPI_H__ +#define __PRIVATE_SPI_H__ #include "softspi.h" #include @@ -33,22 +35,23 @@ class SPIclass { FORCE_INLINE static uint8_t receive() { return softSPI.receive(); } }; + // Hardware SPI template<> class SPIclass { public: FORCE_INLINE static void init() { - OUT_WRITE(SCK_PIN, LOW); - OUT_WRITE(MOSI_PIN, HIGH); - SET_INPUT_PULLUP(MISO_PIN); + OUT_WRITE(SCK_PIN, LOW); + OUT_WRITE(MOSI_PIN, HIGH); + SET_INPUT(MISO_PIN); + WRITE(MISO_PIN, HIGH); } FORCE_INLINE static uint8_t receive() { - #if defined(__AVR__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__IMXRT1062__) - SPDR = 0; - for (;!TEST(SPSR, SPIF);); - return SPDR; - #else - return spiRec(); - #endif + SPDR = 0; + for (;!TEST(SPSR, SPIF);); + return SPDR; } + }; + +#endif // __PRIVATE_SPI_H__ diff --git a/Marlin/src/libs/softspi.h b/Marlin/src/libs/softspi.h index 5d48f9fd8c..e3a28fdc73 100644 --- a/Marlin/src/libs/softspi.h +++ b/Marlin/src/libs/softspi.h @@ -1,651 +1,655 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// -// Based on https://github.com/niteris/ArduinoSoftSpi -// - -#include "../HAL/shared/Marduino.h" - -#ifndef FORCE_INLINE - #define FORCE_INLINE inline __attribute__((always_inline)) -#endif - -#define nop __asm__ volatile ("nop") // NOP for timing +//https://github.com/niteris/ArduinoSoftSpi +#include #ifdef __arm__ - - #ifdef CORE_TEENSY - - /** - * Read pin value - * @param[in] pin Arduino pin number - * @return value read - */ - FORCE_INLINE static bool fastDigitalRead(uint8_t pin) { - return *portInputRegister(pin); - } - - /** - * Set pin value - * @param[in] pin Arduino pin number - * @param[in] level value to write - */ - FORCE_INLINE static void fastDigitalWrite(uint8_t pin, bool value) { - if (value) - *portSetRegister(pin) = 1; - else - *portClearRegister(pin) = 1; - } - - #else // !CORE_TEENSY - - /** - * Read pin value - * @param[in] pin Arduino pin number - * @return value read - */ - FORCE_INLINE static bool fastDigitalRead(uint8_t pin) { - return digitalRead(pin); - } - - /** - * Set pin value - * @param[in] pin Arduino pin number - * @param[in] level value to write - */ - FORCE_INLINE static void fastDigitalWrite(uint8_t pin, bool value) { - digitalWrite(pin, value); - } - - #endif // !CORE_TEENSY - - inline void fastDigitalToggle(uint8_t pin) { fastDigitalWrite(pin, !fastDigitalRead(pin)); } - - inline void fastPinMode(uint8_t pin, bool mode) { pinMode(pin, mode); } - -#else // !__arm__ - - #include - #include - - /** - * @class pin_map_t - * @brief struct for mapping digital pins - */ - struct pin_map_t { - volatile uint8_t* ddr; /**< address of DDR for this pin */ - volatile uint8_t* pin; /**< address of PIN for this pin */ - volatile uint8_t* port; /**< address of PORT for this pin */ - uint8_t bit; /**< bit number for this pin */ - }; - - #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) - - // 168 and 328 Arduinos - const static pin_map_t pinMap[] = { - {&DDRD, &PIND, &PORTD, 0}, // D0 0 - {&DDRD, &PIND, &PORTD, 1}, // D1 1 - {&DDRD, &PIND, &PORTD, 2}, // D2 2 - {&DDRD, &PIND, &PORTD, 3}, // D3 3 - {&DDRD, &PIND, &PORTD, 4}, // D4 4 - {&DDRD, &PIND, &PORTD, 5}, // D5 5 - {&DDRD, &PIND, &PORTD, 6}, // D6 6 - {&DDRD, &PIND, &PORTD, 7}, // D7 7 - {&DDRB, &PINB, &PORTB, 0}, // B0 8 - {&DDRB, &PINB, &PORTB, 1}, // B1 9 - {&DDRB, &PINB, &PORTB, 2}, // B2 10 - {&DDRB, &PINB, &PORTB, 3}, // B3 11 - {&DDRB, &PINB, &PORTB, 4}, // B4 12 - {&DDRB, &PINB, &PORTB, 5}, // B5 13 - {&DDRC, &PINC, &PORTC, 0}, // C0 14 - {&DDRC, &PINC, &PORTC, 1}, // C1 15 - {&DDRC, &PINC, &PORTC, 2}, // C2 16 - {&DDRC, &PINC, &PORTC, 3}, // C3 17 - {&DDRC, &PINC, &PORTC, 4}, // C4 18 - {&DDRC, &PINC, &PORTC, 5} // C5 19 - }; - - #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - - // Mega - static const pin_map_t pinMap[] = { - {&DDRE, &PINE, &PORTE, 0}, // E0 0 - {&DDRE, &PINE, &PORTE, 1}, // E1 1 - {&DDRE, &PINE, &PORTE, 4}, // E4 2 - {&DDRE, &PINE, &PORTE, 5}, // E5 3 - {&DDRG, &PING, &PORTG, 5}, // G5 4 - {&DDRE, &PINE, &PORTE, 3}, // E3 5 - {&DDRH, &PINH, &PORTH, 3}, // H3 6 - {&DDRH, &PINH, &PORTH, 4}, // H4 7 - {&DDRH, &PINH, &PORTH, 5}, // H5 8 - {&DDRH, &PINH, &PORTH, 6}, // H6 9 - {&DDRB, &PINB, &PORTB, 4}, // B4 10 - {&DDRB, &PINB, &PORTB, 5}, // B5 11 - {&DDRB, &PINB, &PORTB, 6}, // B6 12 - {&DDRB, &PINB, &PORTB, 7}, // B7 13 - {&DDRJ, &PINJ, &PORTJ, 1}, // J1 14 - {&DDRJ, &PINJ, &PORTJ, 0}, // J0 15 - {&DDRH, &PINH, &PORTH, 1}, // H1 16 - {&DDRH, &PINH, &PORTH, 0}, // H0 17 - {&DDRD, &PIND, &PORTD, 3}, // D3 18 - {&DDRD, &PIND, &PORTD, 2}, // D2 19 - {&DDRD, &PIND, &PORTD, 1}, // D1 20 - {&DDRD, &PIND, &PORTD, 0}, // D0 21 - {&DDRA, &PINA, &PORTA, 0}, // A0 22 - {&DDRA, &PINA, &PORTA, 1}, // A1 23 - {&DDRA, &PINA, &PORTA, 2}, // A2 24 - {&DDRA, &PINA, &PORTA, 3}, // A3 25 - {&DDRA, &PINA, &PORTA, 4}, // A4 26 - {&DDRA, &PINA, &PORTA, 5}, // A5 27 - {&DDRA, &PINA, &PORTA, 6}, // A6 28 - {&DDRA, &PINA, &PORTA, 7}, // A7 29 - {&DDRC, &PINC, &PORTC, 7}, // C7 30 - {&DDRC, &PINC, &PORTC, 6}, // C6 31 - {&DDRC, &PINC, &PORTC, 5}, // C5 32 - {&DDRC, &PINC, &PORTC, 4}, // C4 33 - {&DDRC, &PINC, &PORTC, 3}, // C3 34 - {&DDRC, &PINC, &PORTC, 2}, // C2 35 - {&DDRC, &PINC, &PORTC, 1}, // C1 36 - {&DDRC, &PINC, &PORTC, 0}, // C0 37 - {&DDRD, &PIND, &PORTD, 7}, // D7 38 - {&DDRG, &PING, &PORTG, 2}, // G2 39 - {&DDRG, &PING, &PORTG, 1}, // G1 40 - {&DDRG, &PING, &PORTG, 0}, // G0 41 - {&DDRL, &PINL, &PORTL, 7}, // L7 42 - {&DDRL, &PINL, &PORTL, 6}, // L6 43 - {&DDRL, &PINL, &PORTL, 5}, // L5 44 - {&DDRL, &PINL, &PORTL, 4}, // L4 45 - {&DDRL, &PINL, &PORTL, 3}, // L3 46 - {&DDRL, &PINL, &PORTL, 2}, // L2 47 - {&DDRL, &PINL, &PORTL, 1}, // L1 48 - {&DDRL, &PINL, &PORTL, 0}, // L0 49 - {&DDRB, &PINB, &PORTB, 3}, // B3 50 - {&DDRB, &PINB, &PORTB, 2}, // B2 51 - {&DDRB, &PINB, &PORTB, 1}, // B1 52 - {&DDRB, &PINB, &PORTB, 0}, // B0 53 - {&DDRF, &PINF, &PORTF, 0}, // F0 54 - {&DDRF, &PINF, &PORTF, 1}, // F1 55 - {&DDRF, &PINF, &PORTF, 2}, // F2 56 - {&DDRF, &PINF, &PORTF, 3}, // F3 57 - {&DDRF, &PINF, &PORTF, 4}, // F4 58 - {&DDRF, &PINF, &PORTF, 5}, // F5 59 - {&DDRF, &PINF, &PORTF, 6}, // F6 60 - {&DDRF, &PINF, &PORTF, 7}, // F7 61 - {&DDRK, &PINK, &PORTK, 0}, // K0 62 - {&DDRK, &PINK, &PORTK, 1}, // K1 63 - {&DDRK, &PINK, &PORTK, 2}, // K2 64 - {&DDRK, &PINK, &PORTK, 3}, // K3 65 - {&DDRK, &PINK, &PORTK, 4}, // K4 66 - {&DDRK, &PINK, &PORTK, 5}, // K5 67 - {&DDRK, &PINK, &PORTK, 6}, // K6 68 - {&DDRK, &PINK, &PORTK, 7}, // K7 69 - - // pins_MIGHTYBOARD_REVE.h - {&DDRG, &PING, &PORTG, 4}, // G4 70 - {&DDRG, &PING, &PORTG, 3}, // G3 71 - {&DDRJ, &PINJ, &PORTJ, 2}, // J2 72 - {&DDRJ, &PINJ, &PORTJ, 3}, // J3 73 - {&DDRJ, &PINJ, &PORTJ, 7}, // J7 74 - {&DDRJ, &PINJ, &PORTJ, 4}, // J4 75 - {&DDRJ, &PINJ, &PORTJ, 5}, // J5 76 - {&DDRJ, &PINJ, &PORTJ, 6}, // J6 77 - {&DDRE, &PINE, &PORTE, 2}, // E2 78 - {&DDRE, &PINE, &PORTE, 6} // E6 79 - }; - - #elif defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega1284__) \ - || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) \ - || defined(__AVR_ATmega64__) || defined(__AVR_ATmega32__) \ - || defined(__AVR_ATmega324__) || defined(__AVR_ATmega16__) - - #ifdef VARIANT_MIGHTY - - // Mighty Layout - static const pin_map_t pinMap[] = { - {&DDRB, &PINB, &PORTB, 0}, // B0 0 - {&DDRB, &PINB, &PORTB, 1}, // B1 1 - {&DDRB, &PINB, &PORTB, 2}, // B2 2 - {&DDRB, &PINB, &PORTB, 3}, // B3 3 - {&DDRB, &PINB, &PORTB, 4}, // B4 4 - {&DDRB, &PINB, &PORTB, 5}, // B5 5 - {&DDRB, &PINB, &PORTB, 6}, // B6 6 - {&DDRB, &PINB, &PORTB, 7}, // B7 7 - {&DDRD, &PIND, &PORTD, 0}, // D0 8 - {&DDRD, &PIND, &PORTD, 1}, // D1 9 - {&DDRD, &PIND, &PORTD, 2}, // D2 10 - {&DDRD, &PIND, &PORTD, 3}, // D3 11 - {&DDRD, &PIND, &PORTD, 4}, // D4 12 - {&DDRD, &PIND, &PORTD, 5}, // D5 13 - {&DDRD, &PIND, &PORTD, 6}, // D6 14 - {&DDRD, &PIND, &PORTD, 7}, // D7 15 - {&DDRC, &PINC, &PORTC, 0}, // C0 16 - {&DDRC, &PINC, &PORTC, 1}, // C1 17 - {&DDRC, &PINC, &PORTC, 2}, // C2 18 - {&DDRC, &PINC, &PORTC, 3}, // C3 19 - {&DDRC, &PINC, &PORTC, 4}, // C4 20 - {&DDRC, &PINC, &PORTC, 5}, // C5 21 - {&DDRC, &PINC, &PORTC, 6}, // C6 22 - {&DDRC, &PINC, &PORTC, 7}, // C7 23 - {&DDRA, &PINA, &PORTA, 0}, // A0 24 - {&DDRA, &PINA, &PORTA, 1}, // A1 25 - {&DDRA, &PINA, &PORTA, 2}, // A2 26 - {&DDRA, &PINA, &PORTA, 3}, // A3 27 - {&DDRA, &PINA, &PORTA, 4}, // A4 28 - {&DDRA, &PINA, &PORTA, 5}, // A5 29 - {&DDRA, &PINA, &PORTA, 6}, // A6 30 - {&DDRA, &PINA, &PORTA, 7} // A7 31 - }; - - #elif defined(VARIANT_BOBUINO) - - // Bobuino Layout - static const pin_map_t pinMap[] = { - {&DDRD, &PIND, &PORTD, 0}, // D0 0 - {&DDRD, &PIND, &PORTD, 1}, // D1 1 - {&DDRD, &PIND, &PORTD, 2}, // D2 2 - {&DDRD, &PIND, &PORTD, 3}, // D3 3 - {&DDRB, &PINB, &PORTB, 0}, // B0 4 - {&DDRB, &PINB, &PORTB, 1}, // B1 5 - {&DDRB, &PINB, &PORTB, 2}, // B2 6 - {&DDRB, &PINB, &PORTB, 3}, // B3 7 - {&DDRD, &PIND, &PORTD, 5}, // D5 8 - {&DDRD, &PIND, &PORTD, 6}, // D6 9 - {&DDRB, &PINB, &PORTB, 4}, // B4 10 - {&DDRB, &PINB, &PORTB, 5}, // B5 11 - {&DDRB, &PINB, &PORTB, 6}, // B6 12 - {&DDRB, &PINB, &PORTB, 7}, // B7 13 - {&DDRA, &PINA, &PORTA, 7}, // A7 14 - {&DDRA, &PINA, &PORTA, 6}, // A6 15 - {&DDRA, &PINA, &PORTA, 5}, // A5 16 - {&DDRA, &PINA, &PORTA, 4}, // A4 17 - {&DDRA, &PINA, &PORTA, 3}, // A3 18 - {&DDRA, &PINA, &PORTA, 2}, // A2 19 - {&DDRA, &PINA, &PORTA, 1}, // A1 20 - {&DDRA, &PINA, &PORTA, 0}, // A0 21 - {&DDRC, &PINC, &PORTC, 0}, // C0 22 - {&DDRC, &PINC, &PORTC, 1}, // C1 23 - {&DDRC, &PINC, &PORTC, 2}, // C2 24 - {&DDRC, &PINC, &PORTC, 3}, // C3 25 - {&DDRC, &PINC, &PORTC, 4}, // C4 26 - {&DDRC, &PINC, &PORTC, 5}, // C5 27 - {&DDRC, &PINC, &PORTC, 6}, // C6 28 - {&DDRC, &PINC, &PORTC, 7}, // C7 29 - {&DDRD, &PIND, &PORTD, 4}, // D4 30 - {&DDRD, &PIND, &PORTD, 7} // D7 31 - }; - - #elif defined(VARIANT_STANDARD) - - // Standard Layout - static const pin_map_t pinMap[] = { - {&DDRB, &PINB, &PORTB, 0}, // B0 0 - {&DDRB, &PINB, &PORTB, 1}, // B1 1 - {&DDRB, &PINB, &PORTB, 2}, // B2 2 - {&DDRB, &PINB, &PORTB, 3}, // B3 3 - {&DDRB, &PINB, &PORTB, 4}, // B4 4 - {&DDRB, &PINB, &PORTB, 5}, // B5 5 - {&DDRB, &PINB, &PORTB, 6}, // B6 6 - {&DDRB, &PINB, &PORTB, 7}, // B7 7 - {&DDRD, &PIND, &PORTD, 0}, // D0 8 - {&DDRD, &PIND, &PORTD, 1}, // D1 9 - {&DDRD, &PIND, &PORTD, 2}, // D2 10 - {&DDRD, &PIND, &PORTD, 3}, // D3 11 - {&DDRD, &PIND, &PORTD, 4}, // D4 12 - {&DDRD, &PIND, &PORTD, 5}, // D5 13 - {&DDRD, &PIND, &PORTD, 6}, // D6 14 - {&DDRD, &PIND, &PORTD, 7}, // D7 15 - {&DDRC, &PINC, &PORTC, 0}, // C0 16 - {&DDRC, &PINC, &PORTC, 1}, // C1 17 - {&DDRC, &PINC, &PORTC, 2}, // C2 18 - {&DDRC, &PINC, &PORTC, 3}, // C3 19 - {&DDRC, &PINC, &PORTC, 4}, // C4 20 - {&DDRC, &PINC, &PORTC, 5}, // C5 21 - {&DDRC, &PINC, &PORTC, 6}, // C6 22 - {&DDRC, &PINC, &PORTC, 7}, // C7 23 - {&DDRA, &PINA, &PORTA, 7}, // A7 24 - {&DDRA, &PINA, &PORTA, 6}, // A6 25 - {&DDRA, &PINA, &PORTA, 5}, // A5 26 - {&DDRA, &PINA, &PORTA, 4}, // A4 27 - {&DDRA, &PINA, &PORTA, 3}, // A3 28 - {&DDRA, &PINA, &PORTA, 2}, // A2 29 - {&DDRA, &PINA, &PORTA, 1}, // A1 30 - {&DDRA, &PINA, &PORTA, 0} // A0 31 - }; - - #else // !(VARIANT_MIGHTY || VARIANT_BOBUINO || VARIANT_STANDARD) - - #error Undefined variant 1284, 644, 324, 64, 32 - - #endif - - #elif defined(__AVR_ATmega32U4__) - - #ifdef CORE_TEENSY - - // Teensy 2.0 - static const pin_map_t pinMap[] = { - {&DDRB, &PINB, &PORTB, 0}, // B0 0 - {&DDRB, &PINB, &PORTB, 1}, // B1 1 - {&DDRB, &PINB, &PORTB, 2}, // B2 2 - {&DDRB, &PINB, &PORTB, 3}, // B3 3 - {&DDRB, &PINB, &PORTB, 7}, // B7 4 - {&DDRD, &PIND, &PORTD, 0}, // D0 5 - {&DDRD, &PIND, &PORTD, 1}, // D1 6 - {&DDRD, &PIND, &PORTD, 2}, // D2 7 - {&DDRD, &PIND, &PORTD, 3}, // D3 8 - {&DDRC, &PINC, &PORTC, 6}, // C6 9 - {&DDRC, &PINC, &PORTC, 7}, // C7 10 - {&DDRD, &PIND, &PORTD, 6}, // D6 11 - {&DDRD, &PIND, &PORTD, 7}, // D7 12 - {&DDRB, &PINB, &PORTB, 4}, // B4 13 - {&DDRB, &PINB, &PORTB, 5}, // B5 14 - {&DDRB, &PINB, &PORTB, 6}, // B6 15 - {&DDRF, &PINF, &PORTF, 7}, // F7 16 - {&DDRF, &PINF, &PORTF, 6}, // F6 17 - {&DDRF, &PINF, &PORTF, 5}, // F5 18 - {&DDRF, &PINF, &PORTF, 4}, // F4 19 - {&DDRF, &PINF, &PORTF, 1}, // F1 20 - {&DDRF, &PINF, &PORTF, 0}, // F0 21 - {&DDRD, &PIND, &PORTD, 4}, // D4 22 - {&DDRD, &PIND, &PORTD, 5}, // D5 23 - {&DDRE, &PINE, &PORTE, 6} // E6 24 - }; - - #else // !CORE_TEENSY - - // Leonardo - static const pin_map_t pinMap[] = { - {&DDRD, &PIND, &PORTD, 2}, // D2 0 - {&DDRD, &PIND, &PORTD, 3}, // D3 1 - {&DDRD, &PIND, &PORTD, 1}, // D1 2 - {&DDRD, &PIND, &PORTD, 0}, // D0 3 - {&DDRD, &PIND, &PORTD, 4}, // D4 4 - {&DDRC, &PINC, &PORTC, 6}, // C6 5 - {&DDRD, &PIND, &PORTD, 7}, // D7 6 - {&DDRE, &PINE, &PORTE, 6}, // E6 7 - {&DDRB, &PINB, &PORTB, 4}, // B4 8 - {&DDRB, &PINB, &PORTB, 5}, // B5 9 - {&DDRB, &PINB, &PORTB, 6}, // B6 10 - {&DDRB, &PINB, &PORTB, 7}, // B7 11 - {&DDRD, &PIND, &PORTD, 6}, // D6 12 - {&DDRC, &PINC, &PORTC, 7}, // C7 13 - {&DDRB, &PINB, &PORTB, 3}, // B3 14 - {&DDRB, &PINB, &PORTB, 1}, // B1 15 - {&DDRB, &PINB, &PORTB, 2}, // B2 16 - {&DDRB, &PINB, &PORTB, 0}, // B0 17 - {&DDRF, &PINF, &PORTF, 7}, // F7 18 - {&DDRF, &PINF, &PORTF, 6}, // F6 19 - {&DDRF, &PINF, &PORTF, 5}, // F5 20 - {&DDRF, &PINF, &PORTF, 4}, // F4 21 - {&DDRF, &PINF, &PORTF, 1}, // F1 22 - {&DDRF, &PINF, &PORTF, 0}, // F0 23 - {&DDRD, &PIND, &PORTD, 4}, // D4 24 - {&DDRD, &PIND, &PORTD, 7}, // D7 25 - {&DDRB, &PINB, &PORTB, 4}, // B4 26 - {&DDRB, &PINB, &PORTB, 5}, // B5 27 - {&DDRB, &PINB, &PORTB, 6}, // B6 28 - {&DDRD, &PIND, &PORTD, 6} // D6 29 - }; - - #endif // !CORE_TEENSY - - #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) - - // Teensy++ 1.0 & 2.0 - static const pin_map_t pinMap[] = { - {&DDRD, &PIND, &PORTD, 0}, // D0 0 - {&DDRD, &PIND, &PORTD, 1}, // D1 1 - {&DDRD, &PIND, &PORTD, 2}, // D2 2 - {&DDRD, &PIND, &PORTD, 3}, // D3 3 - {&DDRD, &PIND, &PORTD, 4}, // D4 4 - {&DDRD, &PIND, &PORTD, 5}, // D5 5 - {&DDRD, &PIND, &PORTD, 6}, // D6 6 - {&DDRD, &PIND, &PORTD, 7}, // D7 7 - {&DDRE, &PINE, &PORTE, 0}, // E0 8 - {&DDRE, &PINE, &PORTE, 1}, // E1 9 - {&DDRC, &PINC, &PORTC, 0}, // C0 10 - {&DDRC, &PINC, &PORTC, 1}, // C1 11 - {&DDRC, &PINC, &PORTC, 2}, // C2 12 - {&DDRC, &PINC, &PORTC, 3}, // C3 13 - {&DDRC, &PINC, &PORTC, 4}, // C4 14 - {&DDRC, &PINC, &PORTC, 5}, // C5 15 - {&DDRC, &PINC, &PORTC, 6}, // C6 16 - {&DDRC, &PINC, &PORTC, 7}, // C7 17 - {&DDRE, &PINE, &PORTE, 6}, // E6 18 - {&DDRE, &PINE, &PORTE, 7}, // E7 19 - {&DDRB, &PINB, &PORTB, 0}, // B0 20 - {&DDRB, &PINB, &PORTB, 1}, // B1 21 - {&DDRB, &PINB, &PORTB, 2}, // B2 22 - {&DDRB, &PINB, &PORTB, 3}, // B3 23 - {&DDRB, &PINB, &PORTB, 4}, // B4 24 - {&DDRB, &PINB, &PORTB, 5}, // B5 25 - {&DDRB, &PINB, &PORTB, 6}, // B6 26 - {&DDRB, &PINB, &PORTB, 7}, // B7 27 - {&DDRA, &PINA, &PORTA, 0}, // A0 28 - {&DDRA, &PINA, &PORTA, 1}, // A1 29 - {&DDRA, &PINA, &PORTA, 2}, // A2 30 - {&DDRA, &PINA, &PORTA, 3}, // A3 31 - {&DDRA, &PINA, &PORTA, 4}, // A4 32 - {&DDRA, &PINA, &PORTA, 5}, // A5 33 - {&DDRA, &PINA, &PORTA, 6}, // A6 34 - {&DDRA, &PINA, &PORTA, 7}, // A7 35 - {&DDRE, &PINE, &PORTE, 4}, // E4 36 - {&DDRE, &PINE, &PORTE, 5}, // E5 37 - {&DDRF, &PINF, &PORTF, 0}, // F0 38 - {&DDRF, &PINF, &PORTF, 1}, // F1 39 - {&DDRF, &PINF, &PORTF, 2}, // F2 40 - {&DDRF, &PINF, &PORTF, 3}, // F3 41 - {&DDRF, &PINF, &PORTF, 4}, // F4 42 - {&DDRF, &PINF, &PORTF, 5}, // F5 43 - {&DDRF, &PINF, &PORTF, 6}, // F6 44 - {&DDRF, &PINF, &PORTF, 7} // F7 45 - }; - - #else // CPU type - - #error "Unknown CPU type for Software SPI" - - #endif // CPU type - - /** count of pins */ - static constexpr uint8_t digitalPinCount = sizeof(pinMap) / sizeof(pin_map_t); - - /** generate bad pin number error */ - void badPinNumber() - __attribute__((error("Pin number is too large or not a constant"))); - - /** - * Check for valid pin number - * @param[in] pin Number of pin to be checked. - */ - FORCE_INLINE static void badPinCheck(const uint8_t pin) { - if (!__builtin_constant_p(pin) || pin >= digitalPinCount) badPinNumber(); +#ifdef CORE_TEENSY +//------------------------------------------------------------------------------ +/** read pin value + * @param[in] pin Arduino pin number + * @return value read + */ +static inline __attribute__((always_inline)) +bool fastDigitalRead(uint8_t pin) { + return *portInputRegister(pin); +} +//------------------------------------------------------------------------------ +/** Set pin value + * @param[in] pin Arduino pin number + * @param[in] level value to write + */ +static inline __attribute__((always_inline)) +void fastDigitalWrite(uint8_t pin, bool value) { + if (value) { + *portSetRegister(pin) = 1; + } else { + *portClearRegister(pin) = 1; } - - /** - * Fast write helper - * @param[in] address I/O register address - * @param[in] bit bit number to write - * @param[in] level value for bit - */ - FORCE_INLINE static void fastBitWriteSafe(volatile uint8_t* address, uint8_t bit, bool level) { - uint8_t oldSREG; - if (address > (uint8_t*)0x5F) { oldSREG = SREG; cli(); } - if (level) SBI(*address, bit); else CBI(*address, bit); - if (address > (uint8_t*)0x5F) SREG = oldSREG; +} +#else // CORE_TEENSY +//------------------------------------------------------------------------------ +/** read pin value + * @param[in] pin Arduino pin number + * @return value read + */ +static inline __attribute__((always_inline)) +bool fastDigitalRead(uint8_t pin){ + return g_APinDescription[pin].pPort->PIO_PDSR & g_APinDescription[pin].ulPin; +} +//------------------------------------------------------------------------------ +/** Set pin value + * @param[in] pin Arduino pin number + * @param[in] level value to write + */ +static inline __attribute__((always_inline)) +void fastDigitalWrite(uint8_t pin, bool value){ + if(value) { + g_APinDescription[pin].pPort->PIO_SODR = g_APinDescription[pin].ulPin; + } else { + g_APinDescription[pin].pPort->PIO_CODR = g_APinDescription[pin].ulPin; } - - /** - * Read pin value - * @param[in] pin Arduino pin number - * @return value read - */ - FORCE_INLINE static bool fastDigitalRead(uint8_t pin) { - badPinCheck(pin); - return (*pinMap[pin].pin >> pinMap[pin].bit) & 1; - } - - /** - * Toggle a pin - * @param[in] pin Arduino pin number - * - * If the pin is in output mode toggle the pin level. - * If the pin is in input mode toggle the state of the 20K pullup. - */ - FORCE_INLINE static void fastDigitalToggle(uint8_t pin) { - badPinCheck(pin); - if (pinMap[pin].pin > (uint8_t*)0x5F) - *pinMap[pin].pin = _BV(pinMap[pin].bit); // Must write bit to high address port - else - SBI(*pinMap[pin].pin, pinMap[pin].bit); // Compiles to sbi and PIN register will not be read - } - - /** - * Set pin value - * @param[in] pin Arduino pin number - * @param[in] level value to write - */ - FORCE_INLINE static void fastDigitalWrite(uint8_t pin, bool level) { - badPinCheck(pin); - fastBitWriteSafe(pinMap[pin].port, pinMap[pin].bit, level); - } - - /** - * Set pin mode - * @param[in] pin Arduino pin number - * @param[in] mode if true set output mode else input mode - * - * fastPinMode does not enable or disable the 20K pullup for input mode. - */ - FORCE_INLINE static void fastPinMode(uint8_t pin, bool mode) { - badPinCheck(pin); - fastBitWriteSafe(pinMap[pin].ddr, pinMap[pin].bit, mode); - } - -#endif // !__arm__ - +} +#endif // CORE_TEENSY +//------------------------------------------------------------------------------ +inline void fastDigitalToggle(uint8_t pin) { + fastDigitalWrite(pin, !fastDigitalRead(pin)); + } +//------------------------------------------------------------------------------ +inline void fastPinMode(uint8_t pin, bool mode) {pinMode(pin, mode);} +#else // __arm__ +#include +#include +//------------------------------------------------------------------------------ /** - * Set pin configuration + * @class pin_map_t + * @brief struct for mapping digital pins + */ +struct pin_map_t { + volatile uint8_t* ddr; /**< address of DDR for this pin */ + volatile uint8_t* pin; /**< address of PIN for this pin */ + volatile uint8_t* port; /**< address of PORT for this pin */ + uint8_t bit; /**< bit number for this pin */ +}; +//------------------------------------------------------------------------------ +#if defined(__AVR_ATmega168__)\ +||defined(__AVR_ATmega168P__)\ +||defined(__AVR_ATmega328P__) +// 168 and 328 Arduinos +const static pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRB, &PINB, &PORTB, 0}, // B0 8 + {&DDRB, &PINB, &PORTB, 1}, // B1 9 + {&DDRB, &PINB, &PORTB, 2}, // B2 10 + {&DDRB, &PINB, &PORTB, 3}, // B3 11 + {&DDRB, &PINB, &PORTB, 4}, // B4 12 + {&DDRB, &PINB, &PORTB, 5}, // B5 13 + {&DDRC, &PINC, &PORTC, 0}, // C0 14 + {&DDRC, &PINC, &PORTC, 1}, // C1 15 + {&DDRC, &PINC, &PORTC, 2}, // C2 16 + {&DDRC, &PINC, &PORTC, 3}, // C3 17 + {&DDRC, &PINC, &PORTC, 4}, // C4 18 + {&DDRC, &PINC, &PORTC, 5} // C5 19 +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega1280__)\ +|| defined(__AVR_ATmega2560__) +// Mega +static const pin_map_t pinMap[] = { + {&DDRE, &PINE, &PORTE, 0}, // E0 0 + {&DDRE, &PINE, &PORTE, 1}, // E1 1 + {&DDRE, &PINE, &PORTE, 4}, // E4 2 + {&DDRE, &PINE, &PORTE, 5}, // E5 3 + {&DDRG, &PING, &PORTG, 5}, // G5 4 + {&DDRE, &PINE, &PORTE, 3}, // E3 5 + {&DDRH, &PINH, &PORTH, 3}, // H3 6 + {&DDRH, &PINH, &PORTH, 4}, // H4 7 + {&DDRH, &PINH, &PORTH, 5}, // H5 8 + {&DDRH, &PINH, &PORTH, 6}, // H6 9 + {&DDRB, &PINB, &PORTB, 4}, // B4 10 + {&DDRB, &PINB, &PORTB, 5}, // B5 11 + {&DDRB, &PINB, &PORTB, 6}, // B6 12 + {&DDRB, &PINB, &PORTB, 7}, // B7 13 + {&DDRJ, &PINJ, &PORTJ, 1}, // J1 14 + {&DDRJ, &PINJ, &PORTJ, 0}, // J0 15 + {&DDRH, &PINH, &PORTH, 1}, // H1 16 + {&DDRH, &PINH, &PORTH, 0}, // H0 17 + {&DDRD, &PIND, &PORTD, 3}, // D3 18 + {&DDRD, &PIND, &PORTD, 2}, // D2 19 + {&DDRD, &PIND, &PORTD, 1}, // D1 20 + {&DDRD, &PIND, &PORTD, 0}, // D0 21 + {&DDRA, &PINA, &PORTA, 0}, // A0 22 + {&DDRA, &PINA, &PORTA, 1}, // A1 23 + {&DDRA, &PINA, &PORTA, 2}, // A2 24 + {&DDRA, &PINA, &PORTA, 3}, // A3 25 + {&DDRA, &PINA, &PORTA, 4}, // A4 26 + {&DDRA, &PINA, &PORTA, 5}, // A5 27 + {&DDRA, &PINA, &PORTA, 6}, // A6 28 + {&DDRA, &PINA, &PORTA, 7}, // A7 29 + {&DDRC, &PINC, &PORTC, 7}, // C7 30 + {&DDRC, &PINC, &PORTC, 6}, // C6 31 + {&DDRC, &PINC, &PORTC, 5}, // C5 32 + {&DDRC, &PINC, &PORTC, 4}, // C4 33 + {&DDRC, &PINC, &PORTC, 3}, // C3 34 + {&DDRC, &PINC, &PORTC, 2}, // C2 35 + {&DDRC, &PINC, &PORTC, 1}, // C1 36 + {&DDRC, &PINC, &PORTC, 0}, // C0 37 + {&DDRD, &PIND, &PORTD, 7}, // D7 38 + {&DDRG, &PING, &PORTG, 2}, // G2 39 + {&DDRG, &PING, &PORTG, 1}, // G1 40 + {&DDRG, &PING, &PORTG, 0}, // G0 41 + {&DDRL, &PINL, &PORTL, 7}, // L7 42 + {&DDRL, &PINL, &PORTL, 6}, // L6 43 + {&DDRL, &PINL, &PORTL, 5}, // L5 44 + {&DDRL, &PINL, &PORTL, 4}, // L4 45 + {&DDRL, &PINL, &PORTL, 3}, // L3 46 + {&DDRL, &PINL, &PORTL, 2}, // L2 47 + {&DDRL, &PINL, &PORTL, 1}, // L1 48 + {&DDRL, &PINL, &PORTL, 0}, // L0 49 + {&DDRB, &PINB, &PORTB, 3}, // B3 50 + {&DDRB, &PINB, &PORTB, 2}, // B2 51 + {&DDRB, &PINB, &PORTB, 1}, // B1 52 + {&DDRB, &PINB, &PORTB, 0}, // B0 53 + {&DDRF, &PINF, &PORTF, 0}, // F0 54 + {&DDRF, &PINF, &PORTF, 1}, // F1 55 + {&DDRF, &PINF, &PORTF, 2}, // F2 56 + {&DDRF, &PINF, &PORTF, 3}, // F3 57 + {&DDRF, &PINF, &PORTF, 4}, // F4 58 + {&DDRF, &PINF, &PORTF, 5}, // F5 59 + {&DDRF, &PINF, &PORTF, 6}, // F6 60 + {&DDRF, &PINF, &PORTF, 7}, // F7 61 + {&DDRK, &PINK, &PORTK, 0}, // K0 62 + {&DDRK, &PINK, &PORTK, 1}, // K1 63 + {&DDRK, &PINK, &PORTK, 2}, // K2 64 + {&DDRK, &PINK, &PORTK, 3}, // K3 65 + {&DDRK, &PINK, &PORTK, 4}, // K4 66 + {&DDRK, &PINK, &PORTK, 5}, // K5 67 + {&DDRK, &PINK, &PORTK, 6}, // K6 68 + {&DDRK, &PINK, &PORTK, 7}, // K7 69 + +//pins_MIGHTYBOARD_REVE.h + {&DDRG, &PING, &PORTG, 4}, // G4 70 + {&DDRG, &PING, &PORTG, 3}, // G3 71 + {&DDRJ, &PINJ, &PORTJ, 2}, // J2 72 + {&DDRJ, &PINJ, &PORTJ, 3}, // J3 73 + {&DDRJ, &PINJ, &PORTJ, 7}, // J7 74 + {&DDRJ, &PINJ, &PORTJ, 4}, // J4 75 + {&DDRJ, &PINJ, &PORTJ, 5}, // J5 76 + {&DDRJ, &PINJ, &PORTJ, 6}, // J6 77 + {&DDRE, &PINE, &PORTE, 2}, // E2 78 + {&DDRE, &PINE, &PORTE, 6} // E6 79 + +}; +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega1284P__)\ +|| defined(__AVR_ATmega1284__)\ +|| defined(__AVR_ATmega644P__)\ +|| defined(__AVR_ATmega644__)\ +|| defined(__AVR_ATmega64__)\ +|| defined(__AVR_ATmega32__)\ +|| defined(__AVR_ATmega324__)\ +|| defined(__AVR_ATmega16__) + +#ifdef VARIANT_MIGHTY +// Mighty Layout +static const pin_map_t pinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 4}, // B4 4 + {&DDRB, &PINB, &PORTB, 5}, // B5 5 + {&DDRB, &PINB, &PORTB, 6}, // B6 6 + {&DDRB, &PINB, &PORTB, 7}, // B7 7 + {&DDRD, &PIND, &PORTD, 0}, // D0 8 + {&DDRD, &PIND, &PORTD, 1}, // D1 9 + {&DDRD, &PIND, &PORTD, 2}, // D2 10 + {&DDRD, &PIND, &PORTD, 3}, // D3 11 + {&DDRD, &PIND, &PORTD, 4}, // D4 12 + {&DDRD, &PIND, &PORTD, 5}, // D5 13 + {&DDRD, &PIND, &PORTD, 6}, // D6 14 + {&DDRD, &PIND, &PORTD, 7}, // D7 15 + {&DDRC, &PINC, &PORTC, 0}, // C0 16 + {&DDRC, &PINC, &PORTC, 1}, // C1 17 + {&DDRC, &PINC, &PORTC, 2}, // C2 18 + {&DDRC, &PINC, &PORTC, 3}, // C3 19 + {&DDRC, &PINC, &PORTC, 4}, // C4 20 + {&DDRC, &PINC, &PORTC, 5}, // C5 21 + {&DDRC, &PINC, &PORTC, 6}, // C6 22 + {&DDRC, &PINC, &PORTC, 7}, // C7 23 + {&DDRA, &PINA, &PORTA, 0}, // A0 24 + {&DDRA, &PINA, &PORTA, 1}, // A1 25 + {&DDRA, &PINA, &PORTA, 2}, // A2 26 + {&DDRA, &PINA, &PORTA, 3}, // A3 27 + {&DDRA, &PINA, &PORTA, 4}, // A4 28 + {&DDRA, &PINA, &PORTA, 5}, // A5 29 + {&DDRA, &PINA, &PORTA, 6}, // A6 30 + {&DDRA, &PINA, &PORTA, 7} // A7 31 +}; +#elif defined(VARIANT_BOBUINO) +// Bobuino Layout +static const pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRB, &PINB, &PORTB, 0}, // B0 4 + {&DDRB, &PINB, &PORTB, 1}, // B1 5 + {&DDRB, &PINB, &PORTB, 2}, // B2 6 + {&DDRB, &PINB, &PORTB, 3}, // B3 7 + {&DDRD, &PIND, &PORTD, 5}, // D5 8 + {&DDRD, &PIND, &PORTD, 6}, // D6 9 + {&DDRB, &PINB, &PORTB, 4}, // B4 10 + {&DDRB, &PINB, &PORTB, 5}, // B5 11 + {&DDRB, &PINB, &PORTB, 6}, // B6 12 + {&DDRB, &PINB, &PORTB, 7}, // B7 13 + {&DDRA, &PINA, &PORTA, 7}, // A7 14 + {&DDRA, &PINA, &PORTA, 6}, // A6 15 + {&DDRA, &PINA, &PORTA, 5}, // A5 16 + {&DDRA, &PINA, &PORTA, 4}, // A4 17 + {&DDRA, &PINA, &PORTA, 3}, // A3 18 + {&DDRA, &PINA, &PORTA, 2}, // A2 19 + {&DDRA, &PINA, &PORTA, 1}, // A1 20 + {&DDRA, &PINA, &PORTA, 0}, // A0 21 + {&DDRC, &PINC, &PORTC, 0}, // C0 22 + {&DDRC, &PINC, &PORTC, 1}, // C1 23 + {&DDRC, &PINC, &PORTC, 2}, // C2 24 + {&DDRC, &PINC, &PORTC, 3}, // C3 25 + {&DDRC, &PINC, &PORTC, 4}, // C4 26 + {&DDRC, &PINC, &PORTC, 5}, // C5 27 + {&DDRC, &PINC, &PORTC, 6}, // C6 28 + {&DDRC, &PINC, &PORTC, 7}, // C7 29 + {&DDRD, &PIND, &PORTD, 4}, // D4 30 + {&DDRD, &PIND, &PORTD, 7} // D7 31 +}; +#elif defined(VARIANT_STANDARD) +// Standard Layout +static const pin_map_t pinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 4}, // B4 4 + {&DDRB, &PINB, &PORTB, 5}, // B5 5 + {&DDRB, &PINB, &PORTB, 6}, // B6 6 + {&DDRB, &PINB, &PORTB, 7}, // B7 7 + {&DDRD, &PIND, &PORTD, 0}, // D0 8 + {&DDRD, &PIND, &PORTD, 1}, // D1 9 + {&DDRD, &PIND, &PORTD, 2}, // D2 10 + {&DDRD, &PIND, &PORTD, 3}, // D3 11 + {&DDRD, &PIND, &PORTD, 4}, // D4 12 + {&DDRD, &PIND, &PORTD, 5}, // D5 13 + {&DDRD, &PIND, &PORTD, 6}, // D6 14 + {&DDRD, &PIND, &PORTD, 7}, // D7 15 + {&DDRC, &PINC, &PORTC, 0}, // C0 16 + {&DDRC, &PINC, &PORTC, 1}, // C1 17 + {&DDRC, &PINC, &PORTC, 2}, // C2 18 + {&DDRC, &PINC, &PORTC, 3}, // C3 19 + {&DDRC, &PINC, &PORTC, 4}, // C4 20 + {&DDRC, &PINC, &PORTC, 5}, // C5 21 + {&DDRC, &PINC, &PORTC, 6}, // C6 22 + {&DDRC, &PINC, &PORTC, 7}, // C7 23 + {&DDRA, &PINA, &PORTA, 7}, // A7 24 + {&DDRA, &PINA, &PORTA, 6}, // A6 25 + {&DDRA, &PINA, &PORTA, 5}, // A5 26 + {&DDRA, &PINA, &PORTA, 4}, // A4 27 + {&DDRA, &PINA, &PORTA, 3}, // A3 28 + {&DDRA, &PINA, &PORTA, 2}, // A2 29 + {&DDRA, &PINA, &PORTA, 1}, // A1 30 + {&DDRA, &PINA, &PORTA, 0} // A0 31 +}; +#else // VARIANT_MIGHTY +#error Undefined variant 1284, 644, 324, 64, 32 +#endif // VARIANT_MIGHTY +//------------------------------------------------------------------------------ +#elif defined(__AVR_ATmega32U4__) +#ifdef CORE_TEENSY +// Teensy 2.0 +static const pin_map_t pinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 7}, // B7 4 + {&DDRD, &PIND, &PORTD, 0}, // D0 5 + {&DDRD, &PIND, &PORTD, 1}, // D1 6 + {&DDRD, &PIND, &PORTD, 2}, // D2 7 + {&DDRD, &PIND, &PORTD, 3}, // D3 8 + {&DDRC, &PINC, &PORTC, 6}, // C6 9 + {&DDRC, &PINC, &PORTC, 7}, // C7 10 + {&DDRD, &PIND, &PORTD, 6}, // D6 11 + {&DDRD, &PIND, &PORTD, 7}, // D7 12 + {&DDRB, &PINB, &PORTB, 4}, // B4 13 + {&DDRB, &PINB, &PORTB, 5}, // B5 14 + {&DDRB, &PINB, &PORTB, 6}, // B6 15 + {&DDRF, &PINF, &PORTF, 7}, // F7 16 + {&DDRF, &PINF, &PORTF, 6}, // F6 17 + {&DDRF, &PINF, &PORTF, 5}, // F5 18 + {&DDRF, &PINF, &PORTF, 4}, // F4 19 + {&DDRF, &PINF, &PORTF, 1}, // F1 20 + {&DDRF, &PINF, &PORTF, 0}, // F0 21 + {&DDRD, &PIND, &PORTD, 4}, // D4 22 + {&DDRD, &PIND, &PORTD, 5}, // D5 23 + {&DDRE, &PINE, &PORTE, 6} // E6 24 +}; +//------------------------------------------------------------------------------ +#else // CORE_TEENSY +// Leonardo +static const pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 2}, // D2 0 + {&DDRD, &PIND, &PORTD, 3}, // D3 1 + {&DDRD, &PIND, &PORTD, 1}, // D1 2 + {&DDRD, &PIND, &PORTD, 0}, // D0 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRC, &PINC, &PORTC, 6}, // C6 5 + {&DDRD, &PIND, &PORTD, 7}, // D7 6 + {&DDRE, &PINE, &PORTE, 6}, // E6 7 + {&DDRB, &PINB, &PORTB, 4}, // B4 8 + {&DDRB, &PINB, &PORTB, 5}, // B5 9 + {&DDRB, &PINB, &PORTB, 6}, // B6 10 + {&DDRB, &PINB, &PORTB, 7}, // B7 11 + {&DDRD, &PIND, &PORTD, 6}, // D6 12 + {&DDRC, &PINC, &PORTC, 7}, // C7 13 + {&DDRB, &PINB, &PORTB, 3}, // B3 14 + {&DDRB, &PINB, &PORTB, 1}, // B1 15 + {&DDRB, &PINB, &PORTB, 2}, // B2 16 + {&DDRB, &PINB, &PORTB, 0}, // B0 17 + {&DDRF, &PINF, &PORTF, 7}, // F7 18 + {&DDRF, &PINF, &PORTF, 6}, // F6 19 + {&DDRF, &PINF, &PORTF, 5}, // F5 20 + {&DDRF, &PINF, &PORTF, 4}, // F4 21 + {&DDRF, &PINF, &PORTF, 1}, // F1 22 + {&DDRF, &PINF, &PORTF, 0}, // F0 23 + {&DDRD, &PIND, &PORTD, 4}, // D4 24 + {&DDRD, &PIND, &PORTD, 7}, // D7 25 + {&DDRB, &PINB, &PORTB, 4}, // B4 26 + {&DDRB, &PINB, &PORTB, 5}, // B5 27 + {&DDRB, &PINB, &PORTB, 6}, // B6 28 + {&DDRD, &PIND, &PORTD, 6} // D6 29 +}; +#endif // CORE_TEENSY +//------------------------------------------------------------------------------ +#elif defined(__AVR_AT90USB646__)\ +|| defined(__AVR_AT90USB1286__) +// Teensy++ 1.0 & 2.0 +static const pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRE, &PINE, &PORTE, 0}, // E0 8 + {&DDRE, &PINE, &PORTE, 1}, // E1 9 + {&DDRC, &PINC, &PORTC, 0}, // C0 10 + {&DDRC, &PINC, &PORTC, 1}, // C1 11 + {&DDRC, &PINC, &PORTC, 2}, // C2 12 + {&DDRC, &PINC, &PORTC, 3}, // C3 13 + {&DDRC, &PINC, &PORTC, 4}, // C4 14 + {&DDRC, &PINC, &PORTC, 5}, // C5 15 + {&DDRC, &PINC, &PORTC, 6}, // C6 16 + {&DDRC, &PINC, &PORTC, 7}, // C7 17 + {&DDRE, &PINE, &PORTE, 6}, // E6 18 + {&DDRE, &PINE, &PORTE, 7}, // E7 19 + {&DDRB, &PINB, &PORTB, 0}, // B0 20 + {&DDRB, &PINB, &PORTB, 1}, // B1 21 + {&DDRB, &PINB, &PORTB, 2}, // B2 22 + {&DDRB, &PINB, &PORTB, 3}, // B3 23 + {&DDRB, &PINB, &PORTB, 4}, // B4 24 + {&DDRB, &PINB, &PORTB, 5}, // B5 25 + {&DDRB, &PINB, &PORTB, 6}, // B6 26 + {&DDRB, &PINB, &PORTB, 7}, // B7 27 + {&DDRA, &PINA, &PORTA, 0}, // A0 28 + {&DDRA, &PINA, &PORTA, 1}, // A1 29 + {&DDRA, &PINA, &PORTA, 2}, // A2 30 + {&DDRA, &PINA, &PORTA, 3}, // A3 31 + {&DDRA, &PINA, &PORTA, 4}, // A4 32 + {&DDRA, &PINA, &PORTA, 5}, // A5 33 + {&DDRA, &PINA, &PORTA, 6}, // A6 34 + {&DDRA, &PINA, &PORTA, 7}, // A7 35 + {&DDRE, &PINE, &PORTE, 4}, // E4 36 + {&DDRE, &PINE, &PORTE, 5}, // E5 37 + {&DDRF, &PINF, &PORTF, 0}, // F0 38 + {&DDRF, &PINF, &PORTF, 1}, // F1 39 + {&DDRF, &PINF, &PORTF, 2}, // F2 40 + {&DDRF, &PINF, &PORTF, 3}, // F3 41 + {&DDRF, &PINF, &PORTF, 4}, // F4 42 + {&DDRF, &PINF, &PORTF, 5}, // F5 43 + {&DDRF, &PINF, &PORTF, 6}, // F6 44 + {&DDRF, &PINF, &PORTF, 7} // F7 45 +}; +//------------------------------------------------------------------------------ +#else // CPU type +#error unknown CPU type +#endif // CPU type +//------------------------------------------------------------------------------ +/** count of pins */ +static const uint8_t digitalPinCount = sizeof(pinMap)/sizeof(pin_map_t); +//============================================================================== +/** generate bad pin number error */ +void badPinNumber(void) + __attribute__((error("Pin number is too large or not a constant"))); +//------------------------------------------------------------------------------ +/** Check for valid pin number + * @param[in] pin Number of pin to be checked. + */ +static inline __attribute__((always_inline)) +void badPinCheck(uint8_t pin) { + if (!__builtin_constant_p(pin) || pin >= digitalPinCount) { + badPinNumber(); + } +} +//------------------------------------------------------------------------------ +/** fast write helper + * @param[in] address I/O register address + * @param[in] bit bit number to write + * @param[in] level value for bit + */ +static inline __attribute__((always_inline)) +void fastBitWriteSafe(volatile uint8_t* address, uint8_t bit, bool level) { + uint8_t oldSREG; + if (address > (uint8_t*)0x5F) { + oldSREG = SREG; + cli(); + } + if (level) { + *address |= 1 << bit; + } else { + *address &= ~(1 << bit); + } + if (address > (uint8_t*)0x5F) { + SREG = oldSREG; + } +} +//------------------------------------------------------------------------------ +/** read pin value + * @param[in] pin Arduino pin number + * @return value read + */ +static inline __attribute__((always_inline)) +bool fastDigitalRead(uint8_t pin) { + badPinCheck(pin); + return (*pinMap[pin].pin >> pinMap[pin].bit) & 1; +} +//------------------------------------------------------------------------------ +/** toggle a pin + * @param[in] pin Arduino pin number + * + * If the pin is in output mode toggle the pin level. + * If the pin is in input mode toggle the state of the 20K pullup. + */ +static inline __attribute__((always_inline)) +void fastDigitalToggle(uint8_t pin) { + badPinCheck(pin); + if (pinMap[pin].pin > (uint8_t*)0x5F) { + // must write bit to high address port + *pinMap[pin].pin = 1 << pinMap[pin].bit; + } else { + // will compile to sbi and PIN register will not be read. + *pinMap[pin].pin |= 1 << pinMap[pin].bit; + } +} +//------------------------------------------------------------------------------ +/** Set pin value + * @param[in] pin Arduino pin number + * @param[in] level value to write + */ +static inline __attribute__((always_inline)) +void fastDigitalWrite(uint8_t pin, bool level) { + badPinCheck(pin); + fastBitWriteSafe(pinMap[pin].port, pinMap[pin].bit, level); +} +//------------------------------------------------------------------------------ +/** set pin mode + * @param[in] pin Arduino pin number + * @param[in] mode if true set output mode else input mode + * + * fastPinMode does not enable or disable the 20K pullup for input mode. + */ +static inline __attribute__((always_inline)) +void fastPinMode(uint8_t pin, bool mode) { + badPinCheck(pin); + fastBitWriteSafe(pinMap[pin].ddr, pinMap[pin].bit, mode); +} + +#endif // __arm__ +//------------------------------------------------------------------------------ +/** set pin configuration * @param[in] pin Arduino pin number * @param[in] mode If true set output mode else input mode * @param[in] level If mode is output, set level high/low. * If mode is input, enable or disable the pin's 20K pullup. */ -FORCE_INLINE static void fastPinConfig(uint8_t pin, bool mode, bool level) { +static inline __attribute__((always_inline)) +void fastPinConfig(uint8_t pin, bool mode, bool level) { fastPinMode(pin, mode); fastDigitalWrite(pin, level); } - +//============================================================================== /** * @class DigitalPin * @brief Fast digital port I/O */ template class DigitalPin { -public: - + public: + //---------------------------------------------------------------------------- /** Constructor */ DigitalPin() {} - - /** - * Constructor + //---------------------------------------------------------------------------- + /** Constructor * @param[in] pinMode if true set output mode else input mode. */ - explicit DigitalPin(bool pinMode) { mode(pinMode); } - - /** - * Constructor + explicit DigitalPin(bool pinMode) { + mode(pinMode); + } + //---------------------------------------------------------------------------- + /** Constructor * @param[in] mode If true set output mode else input mode * @param[in] level If mode is output, set level high/low. * If mode is input, enable or disable the pin's 20K pullup. */ - DigitalPin(bool mode, bool level) { config(mode, level); } - - /** - * Assignment operator + DigitalPin(bool mode, bool level) { + config(mode, level); + } + //---------------------------------------------------------------------------- + /** Asignment operator * @param[in] value If true set the pin's level high else set the * pin's level low. * * @return This DigitalPin instance. */ - FORCE_INLINE DigitalPin & operator = (bool value) { write(value); return *this; } - - /** - * Parentheses operator + inline DigitalPin & operator = (bool value) __attribute__((always_inline)) { + write(value); + return *this; + } + //---------------------------------------------------------------------------- + /** Parenthesis operator * @return Pin's level */ - FORCE_INLINE operator bool () const { return read(); } - - /** - * Set pin configuration + inline operator bool () const __attribute__((always_inline)) { + return read(); + } + //---------------------------------------------------------------------------- + /** set pin configuration * @param[in] mode If true set output mode else input mode * @param[in] level If mode is output, set level high/low. * If mode is input, enable or disable the pin's 20K pullup. */ - FORCE_INLINE void config(bool mode, bool level) { fastPinConfig(PinNumber, mode, level); } - + inline __attribute__((always_inline)) + void config(bool mode, bool level) { + fastPinConfig(PinNumber, mode, level); + } + //---------------------------------------------------------------------------- /** * Set pin level high if output mode or enable 20K pullup if input mode. */ - FORCE_INLINE void high() { write(true); } - + inline __attribute__((always_inline)) + void high() {write(true);} + //---------------------------------------------------------------------------- /** * Set pin level low if output mode or disable 20K pullup if input mode. */ - FORCE_INLINE void low() { write(false); } - + inline __attribute__((always_inline)) + void low() {write(false);} + //---------------------------------------------------------------------------- /** * Set pin mode * @param[in] pinMode if true set output mode else input mode. * * mode() does not enable or disable the 20K pullup for input mode. */ - FORCE_INLINE void mode(bool pinMode) { fastPinMode(PinNumber, pinMode); } - + inline __attribute__((always_inline)) + void mode(bool pinMode) { + fastPinMode(PinNumber, pinMode); + } + //---------------------------------------------------------------------------- /** @return Pin's level */ - FORCE_INLINE bool read() const { return fastDigitalRead(PinNumber); } - - /** - * Toggle a pin + inline __attribute__((always_inline)) + bool read() const { + return fastDigitalRead(PinNumber); + } + //---------------------------------------------------------------------------- + /** toggle a pin + * * If the pin is in output mode toggle the pin's level. * If the pin is in input mode toggle the state of the 20K pullup. */ - FORCE_INLINE void toggle() { fastDigitalToggle(PinNumber); } - - /** - * Write the pin's level. + inline __attribute__((always_inline)) + void toggle() { + fastDigitalToggle(PinNumber); + } + //---------------------------------------------------------------------------- + /** Write the pin's level. * @param[in] value If true set the pin's level high else set the * pin's level low. */ - FORCE_INLINE void write(bool value) { fastDigitalWrite(PinNumber, value); } + inline __attribute__((always_inline)) + void write(bool value) { + fastDigitalWrite(PinNumber, value); + } }; -const bool MISO_MODE = false, // Pin Mode for MISO is input. - MISO_LEVEL = false, // Pullups disabled for MISO are disabled. - MOSI_MODE = true, // Pin Mode for MOSI is output. - SCK_MODE = true; // Pin Mode for SCK is output. - +//------------------------------------------------------------------------------ +/** Nop for timing. */ +#define nop __asm__ volatile ("nop") +//------------------------------------------------------------------------------ +/** Pin Mode for MISO is input.*/ +const bool MISO_MODE = false; +/** Pullups disabled for MISO are disabled. */ +const bool MISO_LEVEL = false; +/** Pin Mode for MOSI is output.*/ +const bool MOSI_MODE = true; +/** Pin Mode for SCK is output. */ +const bool SCK_MODE = true; +//------------------------------------------------------------------------------ /** * @class SoftSPI * @brief Fast software SPI. @@ -653,19 +657,19 @@ const bool MISO_MODE = false, // Pin Mode for MISO is input. template class SoftSPI { public: - + //---------------------------------------------------------------------------- /** Initialize SoftSPI pins. */ void begin() { fastPinConfig(MisoPin, MISO_MODE, MISO_LEVEL); fastPinConfig(MosiPin, MOSI_MODE, !MODE_CPHA(Mode)); fastPinConfig(SckPin, SCK_MODE, MODE_CPOL(Mode)); } - - /** - * Soft SPI receive byte. + //---------------------------------------------------------------------------- + /** Soft SPI receive byte. * @return Data byte received. */ - FORCE_INLINE uint8_t receive() { + inline __attribute__((always_inline)) + uint8_t receive() { uint8_t data = 0; receiveBit(7, &data); receiveBit(6, &data); @@ -677,12 +681,12 @@ class SoftSPI { receiveBit(0, &data); return data; } - - /** - * Soft SPI send byte. + //---------------------------------------------------------------------------- + /** Soft SPI send byte. * @param[in] data Data byte to send. */ - FORCE_INLINE void send(uint8_t data) { + inline __attribute__((always_inline)) + void send(uint8_t data) { sendBit(7, data); sendBit(6, data); sendBit(5, data); @@ -692,13 +696,13 @@ class SoftSPI { sendBit(1, data); sendBit(0, data); } - - /** - * Soft SPI transfer byte. + //---------------------------------------------------------------------------- + /** Soft SPI transfer byte. * @param[in] txData Data byte to send. * @return Data byte received. */ - FORCE_INLINE uint8_t transfer(uint8_t txData) { + inline __attribute__((always_inline)) + uint8_t transfer(uint8_t txData) { uint8_t rxData = 0; transferBit(7, &rxData, txData); transferBit(6, &rxData, txData); @@ -712,35 +716,53 @@ class SoftSPI { } private: - - FORCE_INLINE bool MODE_CPHA(uint8_t mode) { return bool(mode & 1); } - FORCE_INLINE bool MODE_CPOL(uint8_t mode) { return bool(mode & 2); } - FORCE_INLINE void receiveBit(uint8_t bit, uint8_t* data) { - if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + //---------------------------------------------------------------------------- + inline __attribute__((always_inline)) + bool MODE_CPHA(uint8_t mode) {return (mode & 1) != 0;} + inline __attribute__((always_inline)) + bool MODE_CPOL(uint8_t mode) {return (mode & 2) != 0;} + inline __attribute__((always_inline)) + void receiveBit(uint8_t bit, uint8_t* data) { + if (MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + } nop; nop; fastDigitalWrite(SckPin, MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); - if (fastDigitalRead(MisoPin)) SBI(*data, bit); - if (!MODE_CPHA(Mode)) fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + if (fastDigitalRead(MisoPin)) *data |= 1 << bit; + if (!MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + } } - - FORCE_INLINE void sendBit(uint8_t bit, uint8_t data) { - if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); - fastDigitalWrite(MosiPin, data & _BV(bit)); - fastDigitalWrite(SckPin, MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); - nop; - nop; - if (!MODE_CPHA(Mode)) fastDigitalWrite(SckPin, MODE_CPOL(Mode)); - } - - FORCE_INLINE void transferBit(uint8_t bit, uint8_t* rxData, uint8_t txData) { - if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); - fastDigitalWrite(MosiPin, txData & _BV(bit)); + //---------------------------------------------------------------------------- + inline __attribute__((always_inline)) + void sendBit(uint8_t bit, uint8_t data) { + if (MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + } + fastDigitalWrite(MosiPin, data & (1 << bit)); fastDigitalWrite(SckPin, MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); - if (fastDigitalRead(MisoPin)) SBI(*rxData, bit); - if (!MODE_CPHA(Mode)) fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + nop; + nop; + if (!MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + } } - + //---------------------------------------------------------------------------- + inline __attribute__((always_inline)) + void transferBit(uint8_t bit, uint8_t* rxData, uint8_t txData) { + if (MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + } + fastDigitalWrite(MosiPin, txData & (1 << bit)); + fastDigitalWrite(SckPin, + MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); + if (fastDigitalRead(MisoPin)) *rxData |= 1 << bit; + if (!MODE_CPHA(Mode)) { + fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + } + } + //---------------------------------------------------------------------------- }; diff --git a/Marlin/src/libs/stopwatch.cpp b/Marlin/src/libs/stopwatch.cpp index 601efe5517..2817190aa6 100644 --- a/Marlin/src/libs/stopwatch.cpp +++ b/Marlin/src/libs/stopwatch.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,20 +24,17 @@ #include "../inc/MarlinConfig.h" -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif - Stopwatch::State Stopwatch::state; millis_t Stopwatch::accumulator; millis_t Stopwatch::startTimestamp; millis_t Stopwatch::stopTimestamp; bool Stopwatch::stop() { - Stopwatch::debug(PSTR("stop")); + #if ENABLED(DEBUG_STOPWATCH) + Stopwatch::debug(PSTR("stop")); + #endif if (isRunning() || isPaused()) { - TERN_(EXTENSIBLE_UI, ExtUI::onPrintTimerStopped()); state = STOPPED; stopTimestamp = millis(); return true; @@ -46,10 +43,11 @@ bool Stopwatch::stop() { } bool Stopwatch::pause() { - Stopwatch::debug(PSTR("pause")); + #if ENABLED(DEBUG_STOPWATCH) + Stopwatch::debug(PSTR("pause")); + #endif if (isRunning()) { - TERN_(EXTENSIBLE_UI, ExtUI::onPrintTimerPaused()); state = PAUSED; stopTimestamp = millis(); return true; @@ -58,9 +56,9 @@ bool Stopwatch::pause() { } bool Stopwatch::start() { - Stopwatch::debug(PSTR("start")); - - TERN_(EXTENSIBLE_UI, ExtUI::onPrintTimerStarted()); + #if ENABLED(DEBUG_STOPWATCH) + Stopwatch::debug(PSTR("start")); + #endif if (!isRunning()) { if (isPaused()) accumulator = duration(); @@ -73,15 +71,19 @@ bool Stopwatch::start() { else return false; } -void Stopwatch::resume(const millis_t with_time) { - Stopwatch::debug(PSTR("resume")); +void Stopwatch::resume(const millis_t duration) { + #if ENABLED(DEBUG_STOPWATCH) + Stopwatch::debug(PSTR("resume")); + #endif reset(); - if ((accumulator = with_time)) state = RUNNING; + if ((accumulator = duration)) state = RUNNING; } void Stopwatch::reset() { - Stopwatch::debug(PSTR("reset")); + #if ENABLED(DEBUG_STOPWATCH) + Stopwatch::debug(PSTR("reset")); + #endif state = STOPPED; startTimestamp = 0; @@ -90,7 +92,8 @@ void Stopwatch::reset() { } millis_t Stopwatch::duration() { - return accumulator + MS_TO_SEC((isRunning() ? millis() : stopTimestamp) - startTimestamp); + return ((isRunning() ? millis() : stopTimestamp) + - startTimestamp) / 1000UL + accumulator; } #if ENABLED(DEBUG_STOPWATCH) diff --git a/Marlin/src/libs/stopwatch.h b/Marlin/src/libs/stopwatch.h index 6e8e95a9a5..69efe0c3a2 100644 --- a/Marlin/src/libs/stopwatch.h +++ b/Marlin/src/libs/stopwatch.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,18 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef STOPWATCH_H +#define STOPWATCH_H // Print debug messages with M111 S2 (Uses 156 bytes of PROGMEM) //#define DEBUG_STOPWATCH -#include "../core/macros.h" // for FORCE_INLINE - -#include -typedef uint32_t millis_t; +#include "../core/macros.h" +#include "../core/types.h" /** * @brief Stopwatch class @@ -36,7 +36,11 @@ typedef uint32_t millis_t; */ class Stopwatch { private: - enum State : char { STOPPED, RUNNING, PAUSED }; + enum State : char { + STOPPED, + RUNNING, + PAUSED + }; static Stopwatch::State state; static millis_t accumulator; @@ -77,7 +81,7 @@ class Stopwatch { * @brief Resume the stopwatch * @details Resume a timer from a given duration */ - static void resume(const millis_t with_time); + static void resume(const millis_t duration); /** * @brief Reset the stopwatch @@ -114,9 +118,7 @@ class Stopwatch { */ static void debug(const char func[]); - #else - - static inline void debug(const char[]) {} - #endif }; + +#endif // STOPWATCH_H diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index 75a30aef82..e4fe0afaac 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -47,78 +47,84 @@ #include -/** - * vector_3 - */ +vector_3::vector_3() : x(0), y(0), z(0) { } -vector_3 vector_3::cross(const vector_3 &left, const vector_3 &right) { - const xyz_float_t &lv = left, &rv = right; - return vector_3(lv.y * rv.z - lv.z * rv.y, // YZ cross - lv.z * rv.x - lv.x * rv.z, // ZX cross - lv.x * rv.y - lv.y * rv.x); // XY cross +vector_3::vector_3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) { } + +vector_3 vector_3::cross(vector_3 left, vector_3 right) { + return vector_3(left.y * right.z - left.z * right.y, + left.z * right.x - left.x * right.z, + left.x * right.y - left.y * right.x); } -vector_3 vector_3::get_normal() const { - vector_3 normalized = *this; +vector_3 vector_3::operator+(vector_3 v) { return vector_3((x + v.x), (y + v.y), (z + v.z)); } +vector_3 vector_3::operator-(vector_3 v) { return vector_3((x - v.x), (y - v.y), (z - v.z)); } + +vector_3 vector_3::get_normal() { + vector_3 normalized = vector_3(x, y, z); normalized.normalize(); return normalized; } +float vector_3::get_length() { return SQRT(sq(x) + sq(y) + sq(z)); } + void vector_3::normalize() { - *this *= RSQRT(sq(x) + sq(y) + sq(z)); + const float inv_length = RSQRT(sq(x) + sq(y) + sq(z)); + x *= inv_length; + y *= inv_length; + z *= inv_length; } -// Apply a rotation to the matrix -void vector_3::apply_rotation(const matrix_3x3 &matrix) { - const float _x = x, _y = y, _z = z; - *this = { matrix.vectors[0][0] * _x + matrix.vectors[1][0] * _y + matrix.vectors[2][0] * _z, - matrix.vectors[0][1] * _x + matrix.vectors[1][1] * _y + matrix.vectors[2][1] * _z, - matrix.vectors[0][2] * _x + matrix.vectors[1][2] * _y + matrix.vectors[2][2] * _z }; +void vector_3::apply_rotation(matrix_3x3 matrix) { + const float resultX = x * matrix.matrix[3 * 0 + 0] + y * matrix.matrix[3 * 1 + 0] + z * matrix.matrix[3 * 2 + 0], + resultY = x * matrix.matrix[3 * 0 + 1] + y * matrix.matrix[3 * 1 + 1] + z * matrix.matrix[3 * 2 + 1], + resultZ = x * matrix.matrix[3 * 0 + 2] + y * matrix.matrix[3 * 1 + 2] + z * matrix.matrix[3 * 2 + 2]; + x = resultX; + y = resultY; + z = resultZ; } -extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; - -void vector_3::debug(PGM_P const title) { +void vector_3::debug(const char * const title) { serialprintPGM(title); - SERIAL_ECHOPAIR_F_P(SP_X_STR, x, 6); - SERIAL_ECHOPAIR_F_P(SP_Y_STR, y, 6); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z, 6); + SERIAL_PROTOCOLPGM(" x: "); + SERIAL_PROTOCOL_F(x, 6); + SERIAL_PROTOCOLPGM(" y: "); + SERIAL_PROTOCOL_F(y, 6); + SERIAL_PROTOCOLPGM(" z: "); + SERIAL_PROTOCOL_F(z, 6); + SERIAL_EOL(); } -/** - * matrix_3x3 - */ - -void apply_rotation_xyz(const matrix_3x3 &matrix, float &_x, float &_y, float &_z) { - vector_3 vec = vector_3(_x, _y, _z); vec.apply_rotation(matrix); - _x = vec.x; _y = vec.y; _z = vec.z; +void apply_rotation_xyz(matrix_3x3 matrix, float &x, float &y, float &z) { + vector_3 vector = vector_3(x, y, z); + vector.apply_rotation(matrix); + x = vector.x; + y = vector.y; + z = vector.z; } -// Reset to identity. No rotate or translate. -void matrix_3x3::set_to_identity() { - LOOP_L_N(i, 3) - LOOP_L_N(j, 3) - vectors[i][j] = float(i == j); -} - -// Create a matrix from 3 vector_3 inputs -matrix_3x3 matrix_3x3::create_from_rows(const vector_3 &row_0, const vector_3 &row_1, const vector_3 &row_2) { +matrix_3x3 matrix_3x3::create_from_rows(vector_3 row_0, vector_3 row_1, vector_3 row_2) { //row_0.debug(PSTR("row_0")); //row_1.debug(PSTR("row_1")); //row_2.debug(PSTR("row_2")); matrix_3x3 new_matrix; - new_matrix.vectors[0] = row_0; - new_matrix.vectors[1] = row_1; - new_matrix.vectors[2] = row_2; + new_matrix.matrix[0] = row_0.x; new_matrix.matrix[1] = row_0.y; new_matrix.matrix[2] = row_0.z; + new_matrix.matrix[3] = row_1.x; new_matrix.matrix[4] = row_1.y; new_matrix.matrix[5] = row_1.z; + new_matrix.matrix[6] = row_2.x; new_matrix.matrix[7] = row_2.y; new_matrix.matrix[8] = row_2.z; //new_matrix.debug(PSTR("new_matrix")); return new_matrix; } -// Create a matrix rotated to point towards a target -matrix_3x3 matrix_3x3::create_look_at(const vector_3 &target) { - const vector_3 z_row = target.get_normal(), - x_row = vector_3(1, 0, -target.x / target.z).get_normal(), - y_row = vector_3::cross(z_row, x_row).get_normal(); +void matrix_3x3::set_to_identity() { + matrix[0] = 1; matrix[1] = 0; matrix[2] = 0; + matrix[3] = 0; matrix[4] = 1; matrix[5] = 0; + matrix[6] = 0; matrix[7] = 0; matrix[8] = 1; +} + +matrix_3x3 matrix_3x3::create_look_at(vector_3 target) { + vector_3 z_row = target.get_normal(); + vector_3 x_row = vector_3(1, 0, -target.x / target.z).get_normal(); + vector_3 y_row = vector_3::cross(z_row, x_row).get_normal(); // x_row.debug(PSTR("x_row")); // y_row.debug(PSTR("y_row")); @@ -131,28 +137,30 @@ matrix_3x3 matrix_3x3::create_look_at(const vector_3 &target) { return rot; } -// Get a transposed copy of the matrix -matrix_3x3 matrix_3x3::transpose(const matrix_3x3 &original) { +matrix_3x3 matrix_3x3::transpose(matrix_3x3 original) { matrix_3x3 new_matrix; - LOOP_L_N(i, 3) - LOOP_L_N(j, 3) - new_matrix.vectors[i][j] = original.vectors[j][i]; + new_matrix.matrix[0] = original.matrix[0]; new_matrix.matrix[1] = original.matrix[3]; new_matrix.matrix[2] = original.matrix[6]; + new_matrix.matrix[3] = original.matrix[1]; new_matrix.matrix[4] = original.matrix[4]; new_matrix.matrix[5] = original.matrix[7]; + new_matrix.matrix[6] = original.matrix[2]; new_matrix.matrix[7] = original.matrix[5]; new_matrix.matrix[8] = original.matrix[8]; return new_matrix; } -void matrix_3x3::debug(PGM_P const title) { - if (title != nullptr) { +void matrix_3x3::debug(const char * const title) { + if (title != NULL) { serialprintPGM(title); SERIAL_EOL(); } - LOOP_L_N(i, 3) { - LOOP_L_N(j, 3) { - if (vectors[i][j] >= 0.0) SERIAL_CHAR('+'); - SERIAL_ECHO_F(vectors[i][j], 6); - SERIAL_CHAR(' '); + uint8_t count = 0; + for (uint8_t i = 0; i < 3; i++) { + for (uint8_t j = 0; j < 3; j++) { + if (matrix[count] >= 0.0) SERIAL_PROTOCOLCHAR('+'); + SERIAL_PROTOCOL_F(matrix[count], 6); + SERIAL_PROTOCOLCHAR(' '); + count++; } SERIAL_EOL(); } } -#endif // HAS_ABL_OR_UBL +#endif // HAS_ABL + diff --git a/Marlin/src/libs/vector_3.h b/Marlin/src/libs/vector_3.h index 58428314d9..aed4364b91 100644 --- a/Marlin/src/libs/vector_3.h +++ b/Marlin/src/libs/vector_3.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * vector_3.cpp - Vector library for bed leveling @@ -40,51 +39,43 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "../core/types.h" +#ifndef VECTOR_3_H +#define VECTOR_3_H class matrix_3x3; -struct vector_3 : xyz_float_t { +struct vector_3 { + float x, y, z; - vector_3(const float &_x, const float &_y, const float &_z) { set(_x, _y, _z); } - vector_3(const xy_float_t &in) { set(in.x, in.y); } - vector_3(const xyz_float_t &in) { set(in.x, in.y, in.z); } - vector_3(const xyze_float_t &in) { set(in.x, in.y, in.z); } - vector_3() { reset(); } + vector_3(); + vector_3(float x, float y, float z); - // Factory method - static vector_3 cross(const vector_3 &a, const vector_3 &b); + static vector_3 cross(vector_3 a, vector_3 b); - // Modifiers + vector_3 operator+(vector_3 v); + vector_3 operator-(vector_3 v); void normalize(); - void apply_rotation(const matrix_3x3 &matrix); + float get_length(); + vector_3 get_normal(); - // Accessors - float get_length() const; - vector_3 get_normal() const; + void debug(const char * const title); - // Operators - FORCE_INLINE vector_3 operator+(const vector_3 &v) const { vector_3 o = *this; o += v; return o; } - FORCE_INLINE vector_3 operator-(const vector_3 &v) const { vector_3 o = *this; o -= v; return o; } - FORCE_INLINE vector_3 operator*(const float &v) const { vector_3 o = *this; o *= v; return o; } - - void debug(PGM_P const title); + void apply_rotation(matrix_3x3 matrix); }; struct matrix_3x3 { - abc_float_t vectors[3]; + float matrix[9]; - // Factory methods - static matrix_3x3 create_from_rows(const vector_3 &row_0, const vector_3 &row_1, const vector_3 &row_2); - static matrix_3x3 create_look_at(const vector_3 &target); - static matrix_3x3 transpose(const matrix_3x3 &original); + static matrix_3x3 create_from_rows(vector_3 row_0, vector_3 row_1, vector_3 row_2); + static matrix_3x3 create_look_at(vector_3 target); + static matrix_3x3 transpose(matrix_3x3 original); void set_to_identity(); - void debug(PGM_P const title); + void debug(const char * const title); }; -void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, float &x, float &y, float &z); -FORCE_INLINE void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, xyz_pos_t &pos) { - apply_rotation_xyz(rotationMatrix, pos.x, pos.y, pos.z); -} + +void apply_rotation_xyz(matrix_3x3 rotationMatrix, float &x, float &y, float &z); + +#endif // VECTOR_3_H diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp new file mode 100644 index 0000000000..9028df8a26 --- /dev/null +++ b/Marlin/src/module/configuration_store.cpp @@ -0,0 +1,2782 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * configuration_store.cpp + * + * Settings and EEPROM storage + * + * IMPORTANT: Whenever there are changes made to the variables stored in EEPROM + * in the functions below, also increment the version number. This makes sure that + * the default values are used whenever there is a change to the data, to prevent + * wrong data being written to the variables. + * + * ALSO: Variables in the Store and Retrieve sections must be in the same order. + * If a feature is disabled, some data must still be written that, when read, + * either sets a Sane Default, or results in No Change to the existing value. + * + */ + +// Change EEPROM version if the structure changes +#define EEPROM_VERSION "V56" +#define EEPROM_OFFSET 100 + +// Check the integrity of data offsets. +// Can be disabled for production build. +//#define DEBUG_EEPROM_READWRITE + +#include "configuration_store.h" + +#if ADD_PORT_ARG + #define PORTARG_SOLO const int8_t port + #define PORTARG_AFTER ,const int8_t port + #define PORTVAR_SOLO port +#else + #define PORTARG_SOLO + #define PORTARG_AFTER + #define PORTVAR_SOLO +#endif + +#include "endstops.h" +#include "planner.h" +#include "stepper.h" +#include "temperature.h" +#include "../lcd/ultralcd.h" +#include "../core/language.h" +#include "../libs/vector_3.h" +#include "../gcode/gcode.h" +#include "../Marlin.h" + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if HAS_SERVOS + #include "servo.h" +#endif + +#if HAS_BED_PROBE + #include "../module/probe.h" +#endif + +#if HAS_TRINAMIC + #include "stepper_indirection.h" + #include "../feature/tmc_util.h" + #define TMC_GET_PWMTHRS(A,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.axis_steps_per_mm[_AXIS(A)]) +#endif + +#if ENABLED(FWRETRACT) + #include "../feature/fwretract.h" +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" +#endif + +#if ENABLED(PID_EXTRUSION_SCALING) + #define LPQ_LEN thermalManager.lpq_len +#endif + +#pragma pack(push, 1) // No padding between variables + +typedef struct PID { float Kp, Ki, Kd; } PID; +typedef struct PIDC { float Kp, Ki, Kd, Kc; } PIDC; + +/** + * Current EEPROM Layout + * + * Keep this data structure up to date so + * EEPROM size is known at compile time! + */ +typedef struct SettingsDataStruct { + char version[4]; // Vnn\0 + uint16_t crc; // Data Checksum + + // + // DISTINCT_E_FACTORS + // + uint8_t esteppers; // XYZE_N - XYZ + + uint32_t planner_max_acceleration_mm_per_s2[XYZE_N], // M201 XYZE planner.max_acceleration_mm_per_s2[XYZE_N] + planner_min_segment_time_us; // M205 B planner.min_segment_time_us + float planner_axis_steps_per_mm[XYZE_N], // M92 XYZE planner.axis_steps_per_mm[XYZE_N] + planner_max_feedrate_mm_s[XYZE_N], // M203 XYZE planner.max_feedrate_mm_s[XYZE_N] + planner_acceleration, // M204 P planner.acceleration + planner_retract_acceleration, // M204 R planner.retract_acceleration + planner_travel_acceleration, // M204 T planner.travel_acceleration + planner_min_feedrate_mm_s, // M205 S planner.min_feedrate_mm_s + planner_min_travel_feedrate_mm_s, // M205 T planner.min_travel_feedrate_mm_s + planner_max_jerk[XYZE], // M205 XYZE planner.max_jerk[XYZE] + planner_junction_deviation_mm; // M205 J planner.junction_deviation_mm + + float home_offset[XYZ]; // M206 XYZ + + #if HAS_HOTEND_OFFSET + float hotend_offset[XYZ][HOTENDS - 1]; // M218 XYZ + #endif + + // + // ENABLE_LEVELING_FADE_HEIGHT + // + float planner_z_fade_height; // M420 Zn planner.z_fade_height + + // + // MESH_BED_LEVELING + // + float mbl_z_offset; // mbl.z_offset + uint8_t mesh_num_x, mesh_num_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y + #if ENABLED(MESH_BED_LEVELING) + float mbl_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; // mbl.z_values + #else + float mbl_z_values[3][3]; + #endif + + // + // HAS_BED_PROBE + // + float zprobe_zoffset; // M851 Z + + // + // ABL_PLANAR + // + matrix_3x3 planner_bed_level_matrix; // planner.bed_level_matrix + + // + // AUTO_BED_LEVELING_BILINEAR + // + uint8_t grid_max_x, grid_max_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y + int bilinear_grid_spacing[2], + bilinear_start[2]; // G29 L F + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + float z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; // G29 + #else + float z_values[3][3]; + #endif + + // + // AUTO_BED_LEVELING_UBL + // + bool planner_leveling_active; // M420 S planner.leveling_active + int8_t ubl_storage_slot; // ubl.storage_slot + + // + // SERVO_ANGLES + // + uint16_t servo_angles[MAX_SERVOS][2]; // M281 P L U + + // + // DELTA / [XYZ]_DUAL_ENDSTOPS + // + #if ENABLED(DELTA) + float delta_height, // M666 H + delta_endstop_adj[ABC], // M666 XYZ + delta_radius, // M665 R + delta_diagonal_rod, // M665 L + delta_segments_per_second, // M665 S + delta_calibration_radius, // M665 B + delta_tower_angle_trim[ABC]; // M665 XYZ + #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + float x_endstop_adj, // M666 X + y_endstop_adj, // M666 Y + z_endstop_adj; // M666 Z + #endif + + // + // ULTIPANEL + // + int16_t lcd_preheat_hotend_temp[2], // M145 S0 H + lcd_preheat_bed_temp[2], // M145 S0 B + lcd_preheat_fan_speed[2]; // M145 S0 F + + // + // PIDTEMP + // + PIDC hotendPID[MAX_EXTRUDERS]; // M301 En PIDC / M303 En U + + int16_t lpq_len; // M301 L + + // + // PIDTEMPBED + // + PID bedPID; // M304 PID / M303 E-1 U + + // + // HAS_LCD_CONTRAST + // + int16_t lcd_contrast; // M250 C + + // + // FWRETRACT + // + bool autoretract_enabled; // M209 S + float retract_length, // M207 S + retract_feedrate_mm_s, // M207 F + retract_zlift, // M207 Z + retract_recover_length, // M208 S + retract_recover_feedrate_mm_s, // M208 F + swap_retract_length, // M207 W + swap_retract_recover_length, // M208 W + swap_retract_recover_feedrate_mm_s; // M208 R + + // + // !NO_VOLUMETRIC + // + bool parser_volumetric_enabled; // M200 D parser.volumetric_enabled + float planner_filament_size[MAX_EXTRUDERS]; // M200 T D planner.filament_size[] + + // + // HAS_TRINAMIC + // + #define TMC_AXES (MAX_EXTRUDERS + 6) + uint16_t tmc_stepper_current[TMC_AXES]; // M906 X Y Z X2 Y2 Z2 E0 E1 E2 E3 E4 + uint32_t tmc_hybrid_threshold[TMC_AXES]; // M913 X Y Z X2 Y2 Z2 E0 E1 E2 E3 E4 + int16_t tmc_sgt[XYZ]; // M914 X Y Z + + // + // LIN_ADVANCE + // + float planner_extruder_advance_K; // M900 K planner.extruder_advance_K + + // + // HAS_MOTOR_CURRENT_PWM + // + uint32_t motor_current_setting[XYZ]; // M907 X Z E + + // + // CNC_COORDINATE_SYSTEMS + // + float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; // G54-G59.3 + + // + // SKEW_CORRECTION + // + float planner_xy_skew_factor, // M852 I planner.xy_skew_factor + planner_xz_skew_factor, // M852 J planner.xz_skew_factor + planner_yz_skew_factor; // M852 K planner.yz_skew_factor + + // + // ADVANCED_PAUSE_FEATURE + // + float filament_change_unload_length[MAX_EXTRUDERS], // M603 T U + filament_change_load_length[MAX_EXTRUDERS]; // M603 T L + +} SettingsData; + +#pragma pack(pop) + +MarlinSettings settings; + +uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); } + +/** + * Post-process after Retrieve or Reset + */ + +#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + float new_z_fade_height; +#endif + +void MarlinSettings::postprocess() { + const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] }; + + // steps per s2 needs to be updated to agree with units per s2 + planner.reset_acceleration_rates(); + + // Make sure delta kinematics are updated before refreshing the + // planner position so the stepper counts will be set correctly. + #if ENABLED(DELTA) + recalc_delta_settings(); + #endif + + #if ENABLED(PIDTEMP) + thermalManager.updatePID(); + #endif + + #if DISABLED(NO_VOLUMETRICS) + planner.calculate_volumetric_multipliers(); + #else + for (uint8_t i = COUNT(planner.e_factor); i--;) + planner.refresh_e_factor(i); + #endif + + #if HAS_HOME_OFFSET || ENABLED(DUAL_X_CARRIAGE) + // Software endstops depend on home_offset + LOOP_XYZ(i) update_software_endstops((AxisEnum)i); + #endif + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + set_z_fade_height(new_z_fade_height, false); // false = no report + #endif + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + refresh_bed_level(); + #endif + + #if HAS_MOTOR_CURRENT_PWM + stepper.refresh_motor_power(); + #endif + + #if ENABLED(FWRETRACT) + fwretract.refresh_autoretract(); + #endif + + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) + planner.recalculate_max_e_jerk(); + #endif + + // Refresh steps_to_mm with the reciprocal of axis_steps_per_mm + // and init stepper.count[], planner.position[] with current_position + planner.refresh_positioning(); + + // Various factors can change the current position + if (memcmp(oldpos, current_position, sizeof(oldpos))) + report_current_position(); +} + +#if ENABLED(EEPROM_SETTINGS) + #include "../HAL/shared/persistent_store_api.h" + + #define DUMMY_PID_VALUE 3000.0f + #define EEPROM_START() int eeprom_index = EEPROM_OFFSET; persistentStore.access_start() + #define EEPROM_FINISH() persistentStore.access_finish() + #define EEPROM_SKIP(VAR) eeprom_index += sizeof(VAR) + #define EEPROM_WRITE(VAR) persistentStore.write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc) + #define EEPROM_READ(VAR) persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, !validating) + #define EEPROM_READ_ALWAYS(VAR) persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc) + #define EEPROM_ASSERT(TST,ERR) if (!(TST)) do{ SERIAL_ERROR_START_P(port); SERIAL_ERRORLNPGM_P(port, ERR); eeprom_error = true; }while(0) + + #if ENABLED(DEBUG_EEPROM_READWRITE) + #define _FIELD_TEST(FIELD) \ + EEPROM_ASSERT( \ + eeprom_error || eeprom_index == offsetof(SettingsData, FIELD) + EEPROM_OFFSET, \ + "Field " STRINGIFY(FIELD) " mismatch." \ + ) + #else + #define _FIELD_TEST(FIELD) NOOP + #endif + + const char version[4] = EEPROM_VERSION; + + bool MarlinSettings::eeprom_error, MarlinSettings::validating; + + bool MarlinSettings::size_error(const uint16_t size PORTARG_AFTER) { + if (size != datasize()) { + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ERROR_START_P(port); + SERIAL_ERRORLNPGM_P(port, "EEPROM datasize error."); + #endif + return true; + } + return false; + } + + /** + * M500 - Store Configuration + */ + bool MarlinSettings::save(PORTARG_SOLO) { + float dummy = 0; + char ver[4] = "ERR"; + + uint16_t working_crc = 0; + + EEPROM_START(); + + eeprom_error = false; + #if ENABLED(FLASH_EEPROM_EMULATION) + EEPROM_SKIP(ver); // Flash doesn't allow rewriting without erase + #else + EEPROM_WRITE(ver); // invalidate data first + #endif + EEPROM_SKIP(working_crc); // Skip the checksum slot + + working_crc = 0; // clear before first "real data" + + _FIELD_TEST(esteppers); + + const uint8_t esteppers = COUNT(planner.axis_steps_per_mm) - XYZ; + EEPROM_WRITE(esteppers); + + EEPROM_WRITE(planner.max_acceleration_mm_per_s2); + EEPROM_WRITE(planner.min_segment_time_us); + EEPROM_WRITE(planner.axis_steps_per_mm); + EEPROM_WRITE(planner.max_feedrate_mm_s); + EEPROM_WRITE(planner.acceleration); + EEPROM_WRITE(planner.retract_acceleration); + EEPROM_WRITE(planner.travel_acceleration); + EEPROM_WRITE(planner.min_feedrate_mm_s); + EEPROM_WRITE(planner.min_travel_feedrate_mm_s); + + #if ENABLED(JUNCTION_DEVIATION) + const float planner_max_jerk[] = { float(DEFAULT_XJERK), float(DEFAULT_YJERK), float(DEFAULT_ZJERK), float(DEFAULT_EJERK) }; + EEPROM_WRITE(planner_max_jerk); + EEPROM_WRITE(planner.junction_deviation_mm); + #else + EEPROM_WRITE(planner.max_jerk); + dummy = 0.02f; + EEPROM_WRITE(dummy); + #endif + + _FIELD_TEST(home_offset); + + #if !HAS_HOME_OFFSET + const float home_offset[XYZ] = { 0 }; + #endif + EEPROM_WRITE(home_offset); + + #if HAS_HOTEND_OFFSET + // Skip hotend 0 which must be 0 + for (uint8_t e = 1; e < HOTENDS; e++) + LOOP_XYZ(i) EEPROM_WRITE(hotend_offset[i][e]); + #endif + + // + // Global Leveling + // + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + const float zfh = planner.z_fade_height; + #else + const float zfh = 10.0; + #endif + EEPROM_WRITE(zfh); + + // + // Mesh Bed Leveling + // + + #if ENABLED(MESH_BED_LEVELING) + // Compile time test that sizeof(mbl.z_values) is as expected + static_assert( + sizeof(mbl.z_values) == GRID_MAX_POINTS * sizeof(mbl.z_values[0][0]), + "MBL Z array is the wrong size." + ); + const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y; + EEPROM_WRITE(mbl.z_offset); + EEPROM_WRITE(mesh_num_x); + EEPROM_WRITE(mesh_num_y); + EEPROM_WRITE(mbl.z_values); + #else // For disabled MBL write a default mesh + dummy = 0; + const uint8_t mesh_num_x = 3, mesh_num_y = 3; + EEPROM_WRITE(dummy); // z_offset + EEPROM_WRITE(mesh_num_x); + EEPROM_WRITE(mesh_num_y); + for (uint8_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_WRITE(dummy); + #endif // MESH_BED_LEVELING + + _FIELD_TEST(zprobe_zoffset); + + #if !HAS_BED_PROBE + const float zprobe_zoffset = 0; + #endif + EEPROM_WRITE(zprobe_zoffset); + + // + // Planar Bed Leveling matrix + // + + #if ABL_PLANAR + EEPROM_WRITE(planner.bed_level_matrix); + #else + dummy = 0; + for (uint8_t q = 9; q--;) EEPROM_WRITE(dummy); + #endif + + // + // Bilinear Auto Bed Leveling + // + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + // Compile time test that sizeof(z_values) is as expected + static_assert( + sizeof(z_values) == GRID_MAX_POINTS * sizeof(z_values[0][0]), + "Bilinear Z array is the wrong size." + ); + const uint8_t grid_max_x = GRID_MAX_POINTS_X, grid_max_y = GRID_MAX_POINTS_Y; + EEPROM_WRITE(grid_max_x); // 1 byte + EEPROM_WRITE(grid_max_y); // 1 byte + EEPROM_WRITE(bilinear_grid_spacing); // 2 ints + EEPROM_WRITE(bilinear_start); // 2 ints + EEPROM_WRITE(z_values); // 9-256 floats + #else + // For disabled Bilinear Grid write an empty 3x3 grid + const uint8_t grid_max_x = 3, grid_max_y = 3; + const int bilinear_start[2] = { 0 }, bilinear_grid_spacing[2] = { 0 }; + dummy = 0; + EEPROM_WRITE(grid_max_x); + EEPROM_WRITE(grid_max_y); + EEPROM_WRITE(bilinear_grid_spacing); + EEPROM_WRITE(bilinear_start); + for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_WRITE(dummy); + #endif // AUTO_BED_LEVELING_BILINEAR + + _FIELD_TEST(planner_leveling_active); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + EEPROM_WRITE(planner.leveling_active); + EEPROM_WRITE(ubl.storage_slot); + #else + const bool ubl_active = false; + const int8_t storage_slot = -1; + EEPROM_WRITE(ubl_active); + EEPROM_WRITE(storage_slot); + #endif // AUTO_BED_LEVELING_UBL + + #if !HAS_SERVOS || DISABLED(EDITABLE_SERVO_ANGLES) + #if ENABLED(SWITCHING_EXTRUDER) + constexpr uint16_t sesa[][2] = SWITCHING_EXTRUDER_SERVO_ANGLES; + #endif + constexpr uint16_t servo_angles[MAX_SERVOS][2] = { + #if ENABLED(SWITCHING_EXTRUDER) + [SWITCHING_EXTRUDER_SERVO_NR] = { sesa[0], sesa[1] } + #if EXTRUDERS > 3 + , [SWITCHING_EXTRUDER_E23_SERVO_NR] = { sesa[2], sesa[3] } + #endif + #elif ENABLED(SWITCHING_NOZZLE) + [SWITCHING_NOZZLE_SERVO_NR] = SWITCHING_NOZZLE_SERVO_ANGLES + #elif defined(Z_SERVO_ANGLES) && defined(Z_PROBE_SERVO_NR) + [Z_PROBE_SERVO_NR] = Z_SERVO_ANGLES + #endif + }; + #endif + + EEPROM_WRITE(servo_angles); + + // 11 floats for DELTA / [XYZ]_DUAL_ENDSTOPS + #if ENABLED(DELTA) + + _FIELD_TEST(delta_height); + + EEPROM_WRITE(delta_height); // 1 float + EEPROM_WRITE(delta_endstop_adj); // 3 floats + EEPROM_WRITE(delta_radius); // 1 float + EEPROM_WRITE(delta_diagonal_rod); // 1 float + EEPROM_WRITE(delta_segments_per_second); // 1 float + EEPROM_WRITE(delta_calibration_radius); // 1 float + EEPROM_WRITE(delta_tower_angle_trim); // 3 floats + + #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + + _FIELD_TEST(x_endstop_adj); + + // Write dual endstops in X, Y, Z order. Unused = 0.0 + dummy = 0; + #if ENABLED(X_DUAL_ENDSTOPS) + EEPROM_WRITE(endstops.x_endstop_adj); // 1 float + #else + EEPROM_WRITE(dummy); + #endif + + #if ENABLED(Y_DUAL_ENDSTOPS) + EEPROM_WRITE(endstops.y_endstop_adj); // 1 float + #else + EEPROM_WRITE(dummy); + #endif + + #if ENABLED(Z_DUAL_ENDSTOPS) + EEPROM_WRITE(endstops.z_endstop_adj); // 1 float + #else + EEPROM_WRITE(dummy); + #endif + + #endif + + _FIELD_TEST(lcd_preheat_hotend_temp); + + #if DISABLED(ULTIPANEL) + constexpr int16_t lcd_preheat_hotend_temp[2] = { PREHEAT_1_TEMP_HOTEND, PREHEAT_2_TEMP_HOTEND }, + lcd_preheat_bed_temp[2] = { PREHEAT_1_TEMP_BED, PREHEAT_2_TEMP_BED }, + lcd_preheat_fan_speed[2] = { PREHEAT_1_FAN_SPEED, PREHEAT_2_FAN_SPEED }; + #endif + + EEPROM_WRITE(lcd_preheat_hotend_temp); + EEPROM_WRITE(lcd_preheat_bed_temp); + EEPROM_WRITE(lcd_preheat_fan_speed); + + for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) { + + #if ENABLED(PIDTEMP) + if (e < HOTENDS) { + EEPROM_WRITE(PID_PARAM(Kp, e)); + EEPROM_WRITE(PID_PARAM(Ki, e)); + EEPROM_WRITE(PID_PARAM(Kd, e)); + #if ENABLED(PID_EXTRUSION_SCALING) + EEPROM_WRITE(PID_PARAM(Kc, e)); + #else + dummy = 1.0f; // 1.0 = default kc + EEPROM_WRITE(dummy); + #endif + } + else + #endif // !PIDTEMP + { + dummy = DUMMY_PID_VALUE; // When read, will not change the existing value + EEPROM_WRITE(dummy); // Kp + dummy = 0; + for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc + } + + } // Hotends Loop + + _FIELD_TEST(lpq_len); + + #if DISABLED(PID_EXTRUSION_SCALING) + const int16_t LPQ_LEN = 20; + #endif + EEPROM_WRITE(LPQ_LEN); + + #if DISABLED(PIDTEMPBED) + dummy = DUMMY_PID_VALUE; + for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); + #else + EEPROM_WRITE(thermalManager.bedKp); + EEPROM_WRITE(thermalManager.bedKi); + EEPROM_WRITE(thermalManager.bedKd); + #endif + + _FIELD_TEST(lcd_contrast); + + #if !HAS_LCD_CONTRAST + const int16_t lcd_contrast = 32; + #endif + EEPROM_WRITE(lcd_contrast); + + #if DISABLED(FWRETRACT) + const bool autoretract_enabled = false; + const float autoretract_defaults[] = { 3, 45, 0, 0, 0, 13, 0, 8 }; + EEPROM_WRITE(autoretract_enabled); + EEPROM_WRITE(autoretract_defaults); + #else + EEPROM_WRITE(fwretract.autoretract_enabled); + EEPROM_WRITE(fwretract.retract_length); + EEPROM_WRITE(fwretract.retract_feedrate_mm_s); + EEPROM_WRITE(fwretract.retract_zlift); + EEPROM_WRITE(fwretract.retract_recover_length); + EEPROM_WRITE(fwretract.retract_recover_feedrate_mm_s); + EEPROM_WRITE(fwretract.swap_retract_length); + EEPROM_WRITE(fwretract.swap_retract_recover_length); + EEPROM_WRITE(fwretract.swap_retract_recover_feedrate_mm_s); + #endif + + // + // Volumetric & Filament Size + // + + _FIELD_TEST(parser_volumetric_enabled); + + #if DISABLED(NO_VOLUMETRICS) + + EEPROM_WRITE(parser.volumetric_enabled); + + // Save filament sizes + for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { + if (q < COUNT(planner.filament_size)) dummy = planner.filament_size[q]; + EEPROM_WRITE(dummy); + } + + #else + + const bool volumetric_enabled = false; + dummy = DEFAULT_NOMINAL_FILAMENT_DIA; + EEPROM_WRITE(volumetric_enabled); + for (uint8_t q = MAX_EXTRUDERS; q--;) EEPROM_WRITE(dummy); + + #endif + + // + // Save TMC2130 or TMC2208 Configuration, and placeholder values + // + + _FIELD_TEST(tmc_stepper_current); + + uint16_t tmc_stepper_current[TMC_AXES] = { + #if HAS_TRINAMIC + #if AXIS_IS_TMC(X) + stepperX.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(Y) + stepperY.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(Z) + stepperZ.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(X2) + stepperX2.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(Y2) + stepperY2.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(Z2) + stepperZ2.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(E0) + stepperE0.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(E1) + stepperE1.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(E2) + stepperE2.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(E3) + stepperE3.getCurrent(), + #else + 0, + #endif + #if AXIS_IS_TMC(E4) + stepperE4.getCurrent() + #else + 0 + #endif + #else + 0 + #endif + }; + EEPROM_WRITE(tmc_stepper_current); + + // + // Save TMC2130 or TMC2208 Hybrid Threshold, and placeholder values + // + + _FIELD_TEST(tmc_hybrid_threshold); + + uint32_t tmc_hybrid_threshold[TMC_AXES] = { + #if ENABLED(HYBRID_THRESHOLD) + #if AXIS_HAS_STEALTHCHOP(X) + TMC_GET_PWMTHRS(X, X), + #else + X_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + TMC_GET_PWMTHRS(Y, Y), + #else + Y_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + TMC_GET_PWMTHRS(Z, Z), + #else + Z_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + TMC_GET_PWMTHRS(X, X2), + #else + X2_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + TMC_GET_PWMTHRS(Y, Y2), + #else + Y2_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + TMC_GET_PWMTHRS(Z, Z2), + #else + Z2_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + TMC_GET_PWMTHRS(E, E0), + #else + E0_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + TMC_GET_PWMTHRS(E, E1), + #else + E1_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + TMC_GET_PWMTHRS(E, E2), + #else + E2_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + TMC_GET_PWMTHRS(E, E3), + #else + E3_HYBRID_THRESHOLD, + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + TMC_GET_PWMTHRS(E, E4) + #else + E4_HYBRID_THRESHOLD + #endif + #else + 100, 100, 3, // X, Y, Z + 100, 100, 3, // X2, Y2, Z2 + 30, 30, 30, 30, 30 // E0, E1, E2, E3, E4 + #endif + }; + EEPROM_WRITE(tmc_hybrid_threshold); + + // + // TMC2130 Sensorless homing threshold + // + int16_t tmc_sgt[XYZ] = { + #if ENABLED(SENSORLESS_HOMING) + #if X_SENSORLESS + stepperX.sgt(), + #else + 0, + #endif + #if Y_SENSORLESS + stepperY.sgt(), + #else + 0, + #endif + #if Z_SENSORLESS + stepperZ.sgt() + #else + 0 + #endif + #else + 0 + #endif + }; + EEPROM_WRITE(tmc_sgt); + + // + // Linear Advance + // + + _FIELD_TEST(planner_extruder_advance_K); + + #if ENABLED(LIN_ADVANCE) + EEPROM_WRITE(planner.extruder_advance_K); + #else + dummy = 0; + EEPROM_WRITE(dummy); + #endif + + _FIELD_TEST(motor_current_setting); + + #if HAS_MOTOR_CURRENT_PWM + for (uint8_t q = XYZ; q--;) EEPROM_WRITE(stepper.motor_current_setting[q]); + #else + const uint32_t dummyui32[XYZ] = { 0 }; + EEPROM_WRITE(dummyui32); + #endif + + // + // CNC Coordinate Systems + // + + _FIELD_TEST(coordinate_system); + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + EEPROM_WRITE(gcode.coordinate_system); // 27 floats + #else + dummy = 0; + for (uint8_t q = MAX_COORDINATE_SYSTEMS * XYZ; q--;) EEPROM_WRITE(dummy); + #endif + + // + // Skew correction factors + // + + _FIELD_TEST(planner_xy_skew_factor); + + #if ENABLED(SKEW_CORRECTION) + EEPROM_WRITE(planner.xy_skew_factor); + EEPROM_WRITE(planner.xz_skew_factor); + EEPROM_WRITE(planner.yz_skew_factor); + #else + dummy = 0; + for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); + #endif + + // + // Advanced Pause filament load & unload lengths + // + + _FIELD_TEST(filament_change_unload_length); + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { + if (q < COUNT(filament_change_unload_length)) dummy = filament_change_unload_length[q]; + EEPROM_WRITE(dummy); + } + for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { + if (q < COUNT(filament_change_load_length)) dummy = filament_change_load_length[q]; + EEPROM_WRITE(dummy); + } + #else + dummy = 0; + for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy); + #endif + + // + // Validate CRC and Data Size + // + if (!eeprom_error) { + const uint16_t eeprom_size = eeprom_index - (EEPROM_OFFSET), + final_crc = working_crc; + + // Write the EEPROM header + eeprom_index = EEPROM_OFFSET; + + EEPROM_WRITE(version); + EEPROM_WRITE(final_crc); + + // Report storage size + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPAIR_P(port, "Settings Stored (", eeprom_size); + SERIAL_ECHOPAIR_P(port, " bytes; crc ", (uint32_t)final_crc); + SERIAL_ECHOLNPGM_P(port, ")"); + #endif + + eeprom_error |= size_error(eeprom_size); + } + EEPROM_FINISH(); + + // + // UBL Mesh + // + #if ENABLED(UBL_SAVE_ACTIVE_ON_M500) + if (ubl.storage_slot >= 0) + store_mesh(ubl.storage_slot); + #endif + + return !eeprom_error; + } + + /** + * M501 - Retrieve Configuration + */ + bool MarlinSettings::_load(PORTARG_SOLO) { + uint16_t working_crc = 0; + + EEPROM_START(); + + char stored_ver[4]; + EEPROM_READ_ALWAYS(stored_ver); + + uint16_t stored_crc; + EEPROM_READ_ALWAYS(stored_crc); + + // Version has to match or defaults are used + if (strncmp(version, stored_ver, 3) != 0) { + if (stored_ver[3] != '\0') { + stored_ver[0] = '?'; + stored_ver[1] = '\0'; + } + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPGM_P(port, "EEPROM version mismatch "); + SERIAL_ECHOPAIR_P(port, "(EEPROM=", stored_ver); + SERIAL_ECHOLNPGM_P(port, " Marlin=" EEPROM_VERSION ")"); + #endif + eeprom_error = true; + } + else { + float dummy = 0; + #if DISABLED(AUTO_BED_LEVELING_UBL) || DISABLED(FWRETRACT) || ENABLED(NO_VOLUMETRICS) + bool dummyb; + #endif + + working_crc = 0; // Init to 0. Accumulated by EEPROM_READ + + _FIELD_TEST(esteppers); + + // Number of esteppers may change + uint8_t esteppers; + EEPROM_READ_ALWAYS(esteppers); + + // + // Planner Motion + // + + // Get only the number of E stepper parameters previously stored + // Any steppers added later are set to their defaults + const uint32_t def1[] = DEFAULT_MAX_ACCELERATION; + const float def2[] = DEFAULT_AXIS_STEPS_PER_UNIT, def3[] = DEFAULT_MAX_FEEDRATE; + + uint32_t tmp1[XYZ + esteppers]; + EEPROM_READ(tmp1); // max_acceleration_mm_per_s2 + EEPROM_READ(planner.min_segment_time_us); + + float tmp2[XYZ + esteppers], tmp3[XYZ + esteppers]; + EEPROM_READ(tmp2); // axis_steps_per_mm + EEPROM_READ(tmp3); // max_feedrate_mm_s + if (!validating) LOOP_XYZE_N(i) { + planner.max_acceleration_mm_per_s2[i] = i < XYZ + esteppers ? tmp1[i] : def1[i < COUNT(def1) ? i : COUNT(def1) - 1]; + planner.axis_steps_per_mm[i] = i < XYZ + esteppers ? tmp2[i] : def2[i < COUNT(def2) ? i : COUNT(def2) - 1]; + planner.max_feedrate_mm_s[i] = i < XYZ + esteppers ? tmp3[i] : def3[i < COUNT(def3) ? i : COUNT(def3) - 1]; + } + + EEPROM_READ(planner.acceleration); + EEPROM_READ(planner.retract_acceleration); + EEPROM_READ(planner.travel_acceleration); + EEPROM_READ(planner.min_feedrate_mm_s); + EEPROM_READ(planner.min_travel_feedrate_mm_s); + + #if ENABLED(JUNCTION_DEVIATION) + for (uint8_t q = 4; q--;) EEPROM_READ(dummy); + EEPROM_READ(planner.junction_deviation_mm); + #else + EEPROM_READ(planner.max_jerk); + EEPROM_READ(dummy); + #endif + + // + // Home Offset (M206) + // + + _FIELD_TEST(home_offset); + + #if !HAS_HOME_OFFSET + float home_offset[XYZ]; + #endif + EEPROM_READ(home_offset); + + // + // Hotend Offsets, if any + // + + #if HAS_HOTEND_OFFSET + // Skip hotend 0 which must be 0 + for (uint8_t e = 1; e < HOTENDS; e++) + LOOP_XYZ(i) EEPROM_READ(hotend_offset[i][e]); + #endif + + // + // Global Leveling + // + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + EEPROM_READ(new_z_fade_height); + #else + EEPROM_READ(dummy); + #endif + + // + // Mesh (Manual) Bed Leveling + // + + uint8_t mesh_num_x, mesh_num_y; + EEPROM_READ(dummy); + EEPROM_READ_ALWAYS(mesh_num_x); + EEPROM_READ_ALWAYS(mesh_num_y); + + #if ENABLED(MESH_BED_LEVELING) + if (!validating) mbl.z_offset = dummy; + if (mesh_num_x == GRID_MAX_POINTS_X && mesh_num_y == GRID_MAX_POINTS_Y) { + // EEPROM data fits the current mesh + EEPROM_READ(mbl.z_values); + } + else { + // EEPROM data is stale + if (!validating) mbl.reset(); + for (uint16_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_READ(dummy); + } + #else + // MBL is disabled - skip the stored data + for (uint16_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_READ(dummy); + #endif // MESH_BED_LEVELING + + _FIELD_TEST(zprobe_zoffset); + + #if !HAS_BED_PROBE + float zprobe_zoffset; + #endif + EEPROM_READ(zprobe_zoffset); + + // + // Planar Bed Leveling matrix + // + + #if ABL_PLANAR + EEPROM_READ(planner.bed_level_matrix); + #else + for (uint8_t q = 9; q--;) EEPROM_READ(dummy); + #endif + + // + // Bilinear Auto Bed Leveling + // + + uint8_t grid_max_x, grid_max_y; + EEPROM_READ_ALWAYS(grid_max_x); // 1 byte + EEPROM_READ_ALWAYS(grid_max_y); // 1 byte + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + if (grid_max_x == GRID_MAX_POINTS_X && grid_max_y == GRID_MAX_POINTS_Y) { + if (!validating) set_bed_leveling_enabled(false); + EEPROM_READ(bilinear_grid_spacing); // 2 ints + EEPROM_READ(bilinear_start); // 2 ints + EEPROM_READ(z_values); // 9 to 256 floats + } + else // EEPROM data is stale + #endif // AUTO_BED_LEVELING_BILINEAR + { + // Skip past disabled (or stale) Bilinear Grid data + int bgs[2], bs[2]; + EEPROM_READ(bgs); + EEPROM_READ(bs); + for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_READ(dummy); + } + + // + // Unified Bed Leveling active state + // + + _FIELD_TEST(planner_leveling_active); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + EEPROM_READ(planner.leveling_active); + EEPROM_READ(ubl.storage_slot); + #else + uint8_t dummyui8; + EEPROM_READ(dummyb); + EEPROM_READ(dummyui8); + #endif // AUTO_BED_LEVELING_UBL + + // + // SERVO_ANGLES + // + #if !HAS_SERVOS || DISABLED(EDITABLE_SERVO_ANGLES) + uint16_t servo_angles[MAX_SERVOS][2]; + #endif + EEPROM_READ(servo_angles); + + // + // DELTA Geometry or Dual Endstops offsets + // + + #if ENABLED(DELTA) + + _FIELD_TEST(delta_height); + + EEPROM_READ(delta_height); // 1 float + EEPROM_READ(delta_endstop_adj); // 3 floats + EEPROM_READ(delta_radius); // 1 float + EEPROM_READ(delta_diagonal_rod); // 1 float + EEPROM_READ(delta_segments_per_second); // 1 float + EEPROM_READ(delta_calibration_radius); // 1 float + EEPROM_READ(delta_tower_angle_trim); // 3 floats + + #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + + _FIELD_TEST(x_endstop_adj); + + #if ENABLED(X_DUAL_ENDSTOPS) + EEPROM_READ(endstops.x_endstop_adj); // 1 float + #else + EEPROM_READ(dummy); + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + EEPROM_READ(endstops.y_endstop_adj); // 1 float + #else + EEPROM_READ(dummy); + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + EEPROM_READ(endstops.z_endstop_adj); // 1 float + #else + EEPROM_READ(dummy); + #endif + + #endif + + // + // LCD Preheat settings + // + + _FIELD_TEST(lcd_preheat_hotend_temp); + + #if DISABLED(ULTIPANEL) + int16_t lcd_preheat_hotend_temp[2], lcd_preheat_bed_temp[2], lcd_preheat_fan_speed[2]; + #endif + EEPROM_READ(lcd_preheat_hotend_temp); // 2 floats + EEPROM_READ(lcd_preheat_bed_temp); // 2 floats + EEPROM_READ(lcd_preheat_fan_speed); // 2 floats + + //EEPROM_ASSERT( + // WITHIN(lcd_preheat_fan_speed, 0, 255), + // "lcd_preheat_fan_speed out of range" + //); + + // + // Hotend PID + // + + #if ENABLED(PIDTEMP) + for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) { + EEPROM_READ(dummy); // Kp + if (e < HOTENDS && dummy != DUMMY_PID_VALUE) { + // do not need to scale PID values as the values in EEPROM are already scaled + if (!validating) PID_PARAM(Kp, e) = dummy; + EEPROM_READ(PID_PARAM(Ki, e)); + EEPROM_READ(PID_PARAM(Kd, e)); + #if ENABLED(PID_EXTRUSION_SCALING) + EEPROM_READ(PID_PARAM(Kc, e)); + #else + EEPROM_READ(dummy); + #endif + } + else { + for (uint8_t q=3; q--;) EEPROM_READ(dummy); // Ki, Kd, Kc + } + } + #else // !PIDTEMP + // 4 x 4 = 16 slots for PID parameters + for (uint8_t q = MAX_EXTRUDERS * 4; q--;) EEPROM_READ(dummy); // Kp, Ki, Kd, Kc + #endif // !PIDTEMP + + // + // PID Extrusion Scaling + // + + _FIELD_TEST(lpq_len); + + #if DISABLED(PID_EXTRUSION_SCALING) + int16_t LPQ_LEN; + #endif + EEPROM_READ(LPQ_LEN); + + // + // Heated Bed PID + // + + #if ENABLED(PIDTEMPBED) + EEPROM_READ(dummy); // bedKp + if (dummy != DUMMY_PID_VALUE) { + if (!validating) thermalManager.bedKp = dummy; + EEPROM_READ(thermalManager.bedKi); + EEPROM_READ(thermalManager.bedKd); + } + #else + for (uint8_t q=3; q--;) EEPROM_READ(dummy); // bedKp, bedKi, bedKd + #endif + + // + // LCD Contrast + // + + _FIELD_TEST(lcd_contrast); + + #if !HAS_LCD_CONTRAST + int16_t lcd_contrast; + #endif + EEPROM_READ(lcd_contrast); + + // + // Firmware Retraction + // + + #if ENABLED(FWRETRACT) + EEPROM_READ(fwretract.autoretract_enabled); + EEPROM_READ(fwretract.retract_length); + EEPROM_READ(fwretract.retract_feedrate_mm_s); + EEPROM_READ(fwretract.retract_zlift); + EEPROM_READ(fwretract.retract_recover_length); + EEPROM_READ(fwretract.retract_recover_feedrate_mm_s); + EEPROM_READ(fwretract.swap_retract_length); + EEPROM_READ(fwretract.swap_retract_recover_length); + EEPROM_READ(fwretract.swap_retract_recover_feedrate_mm_s); + #else + EEPROM_READ(dummyb); + for (uint8_t q=8; q--;) EEPROM_READ(dummy); + #endif + + // + // Volumetric & Filament Size + // + + _FIELD_TEST(parser_volumetric_enabled); + + #if DISABLED(NO_VOLUMETRICS) + + EEPROM_READ(parser.volumetric_enabled); + + for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { + EEPROM_READ(dummy); + if (!validating && q < COUNT(planner.filament_size)) + planner.filament_size[q] = dummy; + } + + #else + + EEPROM_READ(dummyb); + for (uint8_t q=MAX_EXTRUDERS; q--;) EEPROM_READ(dummy); + + #endif + + if (!validating) reset_stepper_drivers(); + + // + // TMC2130 Stepper Settings + // + + _FIELD_TEST(tmc_stepper_current); + + #if HAS_TRINAMIC + + #define SET_CURR(Q) stepper##Q.setCurrent(currents[TMC_##Q] ? currents[TMC_##Q] : Q##_CURRENT, R_SENSE, HOLD_MULTIPLIER) + uint16_t currents[TMC_AXES]; + EEPROM_READ(currents); + if (!validating) { + #if AXIS_IS_TMC(X) + SET_CURR(X); + #endif + #if AXIS_IS_TMC(Y) + SET_CURR(Y); + #endif + #if AXIS_IS_TMC(Z) + SET_CURR(Z); + #endif + #if AXIS_IS_TMC(X2) + SET_CURR(X2); + #endif + #if AXIS_IS_TMC(Y2) + SET_CURR(Y2); + #endif + #if AXIS_IS_TMC(Z2) + SET_CURR(Z2); + #endif + #if AXIS_IS_TMC(E0) + SET_CURR(E0); + #endif + #if AXIS_IS_TMC(E1) + SET_CURR(E1); + #endif + #if AXIS_IS_TMC(E2) + SET_CURR(E2); + #endif + #if AXIS_IS_TMC(E3) + SET_CURR(E3); + #endif + #if AXIS_IS_TMC(E4) + SET_CURR(E4); + #endif + } + #else + uint16_t val; + for (uint8_t q=TMC_AXES; q--;) EEPROM_READ(val); + #endif + + #if ENABLED(HYBRID_THRESHOLD) + #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, tmc_hybrid_threshold[TMC_##Q], planner.axis_steps_per_mm[_AXIS(A)]) + uint32_t tmc_hybrid_threshold[TMC_AXES]; + EEPROM_READ(tmc_hybrid_threshold); + if (!validating) { + #if AXIS_HAS_STEALTHCHOP(X) + TMC_SET_PWMTHRS(X, X); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + TMC_SET_PWMTHRS(Y, Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + TMC_SET_PWMTHRS(Z, Z); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + TMC_SET_PWMTHRS(X, X2); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + TMC_SET_PWMTHRS(Y, Y2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + TMC_SET_PWMTHRS(Z, Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + TMC_SET_PWMTHRS(E, E0); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + TMC_SET_PWMTHRS(E, E1); + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + TMC_SET_PWMTHRS(E, E2); + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + TMC_SET_PWMTHRS(E, E3); + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + TMC_SET_PWMTHRS(E, E4); + #endif + } + #else + uint32_t thrs_val; + for (uint8_t q=TMC_AXES; q--;) EEPROM_READ(thrs_val); + #endif + + /* + * TMC2130 Sensorless homing threshold. + * X and X2 use the same value + * Y and Y2 use the same value + * Z and Z2 use the same value + */ + int16_t tmc_sgt[XYZ]; + EEPROM_READ(tmc_sgt); + #if ENABLED(SENSORLESS_HOMING) + if (!validating) { + #ifdef X_HOMING_SENSITIVITY + #if AXIS_HAS_STALLGUARD(X) + stepperX.sgt(tmc_sgt[0]); + #endif + #if AXIS_HAS_STALLGUARD(X2) + stepperX2.sgt(tmc_sgt[0]); + #endif + #endif + #ifdef Y_HOMING_SENSITIVITY + #if AXIS_HAS_STALLGUARD(Y) + stepperY.sgt(tmc_sgt[1]); + #endif + #if AXIS_HAS_STALLGUARD(Y2) + stepperY2.sgt(tmc_sgt[1]); + #endif + #endif + #ifdef Z_HOMING_SENSITIVITY + #if AXIS_HAS_STALLGUARD(Z) + stepperZ.sgt(tmc_sgt[2]); + #endif + #if AXIS_HAS_STALLGUARD(Z2) + stepperZ2.sgt(tmc_sgt[2]); + #endif + #endif + } + #endif + + // + // Linear Advance + // + + _FIELD_TEST(planner_extruder_advance_K); + + #if ENABLED(LIN_ADVANCE) + EEPROM_READ(planner.extruder_advance_K); + #else + EEPROM_READ(dummy); + #endif + + // + // Motor Current PWM + // + + _FIELD_TEST(motor_current_setting); + + #if HAS_MOTOR_CURRENT_PWM + for (uint8_t q = XYZ; q--;) EEPROM_READ(stepper.motor_current_setting[q]); + #else + uint32_t dummyui32[XYZ]; + EEPROM_READ(dummyui32); + #endif + + // + // CNC Coordinate System + // + + _FIELD_TEST(coordinate_system); + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + if (!validating) (void)gcode.select_coordinate_system(-1); // Go back to machine space + EEPROM_READ(gcode.coordinate_system); // 27 floats + #else + for (uint8_t q = MAX_COORDINATE_SYSTEMS * XYZ; q--;) EEPROM_READ(dummy); + #endif + + // + // Skew correction factors + // + + _FIELD_TEST(planner_xy_skew_factor); + + #if ENABLED(SKEW_CORRECTION_GCODE) + EEPROM_READ(planner.xy_skew_factor); + #if ENABLED(SKEW_CORRECTION_FOR_Z) + EEPROM_READ(planner.xz_skew_factor); + EEPROM_READ(planner.yz_skew_factor); + #else + EEPROM_READ(dummy); + EEPROM_READ(dummy); + #endif + #else + for (uint8_t q = 3; q--;) EEPROM_READ(dummy); + #endif + + // + // Advanced Pause filament load & unload lengths + // + + _FIELD_TEST(filament_change_unload_length); + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { + EEPROM_READ(dummy); + if (!validating && q < COUNT(filament_change_unload_length)) filament_change_unload_length[q] = dummy; + } + for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) { + EEPROM_READ(dummy); + if (!validating && q < COUNT(filament_change_load_length)) filament_change_load_length[q] = dummy; + } + #else + for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_READ(dummy); + #endif + + eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET)); + if (eeprom_error) { + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPAIR_P(port, "Index: ", int(eeprom_index - (EEPROM_OFFSET))); + SERIAL_ECHOLNPAIR_P(port, " Size: ", datasize()); + #endif + } + else if (working_crc != stored_crc) { + eeprom_error = true; + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ERROR_START_P(port); + SERIAL_ERRORPGM_P(port, "EEPROM CRC mismatch - (stored) "); + SERIAL_ERROR_P(port, stored_crc); + SERIAL_ERRORPGM_P(port, " != "); + SERIAL_ERROR_P(port, working_crc); + SERIAL_ERRORLNPGM_P(port, " (calculated)!"); + #endif + } + else if (!validating) { + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ECHO_START_P(port); + SERIAL_ECHO_P(port, version); + SERIAL_ECHOPAIR_P(port, " stored settings retrieved (", eeprom_index - (EEPROM_OFFSET)); + SERIAL_ECHOPAIR_P(port, " bytes; crc ", (uint32_t)working_crc); + SERIAL_ECHOLNPGM_P(port, ")"); + #endif + } + + if (!validating && !eeprom_error) postprocess(); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + if (!validating) { + ubl.report_state(); + + if (!ubl.sanity_check()) { + SERIAL_EOL_P(port); + #if ENABLED(EEPROM_CHITCHAT) + ubl.echo_name(); + SERIAL_ECHOLNPGM_P(port, " initialized.\n"); + #endif + } + else { + eeprom_error = true; + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_PROTOCOLPGM_P(port, "?Can't enable "); + ubl.echo_name(); + SERIAL_PROTOCOLLNPGM_P(port, "."); + #endif + ubl.reset(); + } + + if (ubl.storage_slot >= 0) { + load_mesh(ubl.storage_slot); + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ECHOPAIR_P(port, "Mesh ", ubl.storage_slot); + SERIAL_ECHOLNPGM_P(port, " loaded from storage."); + #endif + } + else { + ubl.reset(); + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ECHOLNPGM_P(port, "UBL System reset()"); + #endif + } + } + #endif + } + + #if ENABLED(EEPROM_CHITCHAT) && DISABLED(DISABLE_M503) + if (!validating) report(PORTVAR_SOLO); + #endif + EEPROM_FINISH(); + + return !eeprom_error; + } + + bool MarlinSettings::validate(PORTARG_SOLO) { + validating = true; + const bool success = _load(PORTVAR_SOLO); + validating = false; + return success; + } + + bool MarlinSettings::load(PORTARG_SOLO) { + if (validate(PORTVAR_SOLO)) return _load(PORTVAR_SOLO); + reset(); + return true; + } + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + #if ENABLED(EEPROM_CHITCHAT) + void ubl_invalid_slot(const int s) { + SERIAL_PROTOCOLLNPGM("?Invalid slot."); + SERIAL_PROTOCOL(s); + SERIAL_PROTOCOLLNPGM(" mesh slots available."); + } + #endif + + const uint16_t MarlinSettings::meshes_end = persistentStore.capacity() - 129; // 128 (+1 because of the change to capacity rather than last valid address) + // is a placeholder for the size of the MAT; the MAT will always + // live at the very end of the eeprom + + uint16_t MarlinSettings::meshes_start_index() { + return (datasize() + EEPROM_OFFSET + 32) & 0xFFF8; // Pad the end of configuration data so it can float up + // or down a little bit without disrupting the mesh data + } + + uint16_t MarlinSettings::calc_num_meshes() { + return (meshes_end - meshes_start_index()) / sizeof(ubl.z_values); + } + + int MarlinSettings::mesh_slot_offset(const int8_t slot) { + return meshes_end - (slot + 1) * sizeof(ubl.z_values); + } + + void MarlinSettings::store_mesh(const int8_t slot) { + + #if ENABLED(AUTO_BED_LEVELING_UBL) + const int16_t a = calc_num_meshes(); + if (!WITHIN(slot, 0, a - 1)) { + #if ENABLED(EEPROM_CHITCHAT) + ubl_invalid_slot(a); + SERIAL_PROTOCOLPAIR("E2END=", persistentStore.capacity() - 1); + SERIAL_PROTOCOLPAIR(" meshes_end=", meshes_end); + SERIAL_PROTOCOLLNPAIR(" slot=", slot); + SERIAL_EOL(); + #endif + return; + } + + int pos = mesh_slot_offset(slot); + uint16_t crc = 0; + + persistentStore.access_start(); + const bool status = persistentStore.write_data(pos, (uint8_t *)&ubl.z_values, sizeof(ubl.z_values), &crc); + persistentStore.access_finish(); + + if (status) + SERIAL_PROTOCOLPGM("?Unable to save mesh data.\n"); + + // Write crc to MAT along with other data, or just tack on to the beginning or end + + #if ENABLED(EEPROM_CHITCHAT) + if (!status) + SERIAL_PROTOCOLLNPAIR("Mesh saved in slot ", slot); + #endif + + #else + + // Other mesh types + + #endif + } + + void MarlinSettings::load_mesh(const int8_t slot, void * const into/*=NULL*/) { + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + const int16_t a = settings.calc_num_meshes(); + + if (!WITHIN(slot, 0, a - 1)) { + #if ENABLED(EEPROM_CHITCHAT) + ubl_invalid_slot(a); + #endif + return; + } + + int pos = mesh_slot_offset(slot); + uint16_t crc = 0; + uint8_t * const dest = into ? (uint8_t*)into : (uint8_t*)&ubl.z_values; + + persistentStore.access_start(); + const uint16_t status = persistentStore.read_data(pos, dest, sizeof(ubl.z_values), &crc); + persistentStore.access_finish(); + + if (status) + SERIAL_PROTOCOLPGM("?Unable to load mesh data.\n"); + + #if ENABLED(EEPROM_CHITCHAT) + else + SERIAL_PROTOCOLLNPAIR("Mesh loaded from slot ", slot); + #endif + EEPROM_FINISH(); + + #else + + // Other mesh types + + #endif + } + + //void MarlinSettings::delete_mesh() { return; } + //void MarlinSettings::defrag_meshes() { return; } + + #endif // AUTO_BED_LEVELING_UBL + +#else // !EEPROM_SETTINGS + + bool MarlinSettings::save(PORTARG_SOLO) { + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ERROR_START_P(port); + SERIAL_ERRORLNPGM_P(port, "EEPROM disabled"); + #endif + return false; + } + +#endif // !EEPROM_SETTINGS + +/** + * M502 - Reset Configuration + */ +void MarlinSettings::reset(PORTARG_SOLO) { + static const float tmp1[] PROGMEM = DEFAULT_AXIS_STEPS_PER_UNIT, tmp2[] PROGMEM = DEFAULT_MAX_FEEDRATE; + static const uint32_t tmp3[] PROGMEM = DEFAULT_MAX_ACCELERATION; + LOOP_XYZE_N(i) { + planner.axis_steps_per_mm[i] = pgm_read_float(&tmp1[i < COUNT(tmp1) ? i : COUNT(tmp1) - 1]); + planner.max_feedrate_mm_s[i] = pgm_read_float(&tmp2[i < COUNT(tmp2) ? i : COUNT(tmp2) - 1]); + planner.max_acceleration_mm_per_s2[i] = pgm_read_dword_near(&tmp3[i < COUNT(tmp3) ? i : COUNT(tmp3) - 1]); + } + + planner.min_segment_time_us = DEFAULT_MINSEGMENTTIME; + planner.acceleration = DEFAULT_ACCELERATION; + planner.retract_acceleration = DEFAULT_RETRACT_ACCELERATION; + planner.travel_acceleration = DEFAULT_TRAVEL_ACCELERATION; + planner.min_feedrate_mm_s = DEFAULT_MINIMUMFEEDRATE; + planner.min_travel_feedrate_mm_s = DEFAULT_MINTRAVELFEEDRATE; + + #if ENABLED(JUNCTION_DEVIATION) + planner.junction_deviation_mm = float(JUNCTION_DEVIATION_MM); + #else + planner.max_jerk[X_AXIS] = DEFAULT_XJERK; + planner.max_jerk[Y_AXIS] = DEFAULT_YJERK; + planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK; + planner.max_jerk[E_AXIS] = DEFAULT_EJERK; + #endif + + #if HAS_HOME_OFFSET + ZERO(home_offset); + #endif + + #if HAS_HOTEND_OFFSET + constexpr float tmp4[XYZ][HOTENDS] = { HOTEND_OFFSET_X, HOTEND_OFFSET_Y, HOTEND_OFFSET_Z }; + static_assert( + tmp4[X_AXIS][0] == 0 && tmp4[Y_AXIS][0] == 0 && tmp4[Z_AXIS][0] == 0, + "Offsets for the first hotend must be 0.0." + ); + LOOP_XYZ(i) HOTEND_LOOP() hotend_offset[i][e] = tmp4[i][e]; + #endif + + // + // Global Leveling + // + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + new_z_fade_height = 0.0; + #endif + + #if HAS_LEVELING + reset_bed_level(); + #endif + + #if HAS_BED_PROBE + zprobe_zoffset = Z_PROBE_OFFSET_FROM_EXTRUDER; + #endif + + // + // Servo Angles + // + + #if HAS_SERVOS && ENABLED(EDITABLE_SERVO_ANGLES) + + #if ENABLED(SWITCHING_EXTRUDER) + + #if EXTRUDERS > 3 + #define REQ_ANGLES 4 + #else + #define REQ_ANGLES 2 + #endif + constexpr uint16_t extruder_angles[] = SWITCHING_EXTRUDER_SERVO_ANGLES; + static_assert(COUNT(extruder_angles) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles."); + servo_angles[SWITCHING_EXTRUDER_SERVO_NR][0] = extruder_angles[0]; + servo_angles[SWITCHING_EXTRUDER_SERVO_NR][1] = extruder_angles[1]; + #if EXTRUDERS > 3 + servo_angles[SWITCHING_EXTRUDER_E23_SERVO_NR][0] = extruder_angles[2]; + servo_angles[SWITCHING_EXTRUDER_E23_SERVO_NR][1] = extruder_angles[3]; + #endif + + #elif ENABLED(SWITCHING_NOZZLE) + + constexpr uint16_t nozzle_angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES; + servo_angles[SWITCHING_NOZZLE_SERVO_NR][0] = nozzle_angles[0]; + servo_angles[SWITCHING_NOZZLE_SERVO_NR][1] = nozzle_angles[1]; + + #elif defined(Z_SERVO_ANGLES) && defined(Z_PROBE_SERVO_NR) + + constexpr uint16_t z_probe_angles[2] = Z_SERVO_ANGLES; + servo_angles[Z_PROBE_SERVO_NR][0] = z_probe_angles[0]; + servo_angles[Z_PROBE_SERVO_NR][1] = z_probe_angles[1]; + + #endif + + #endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES + + #if ENABLED(DELTA) + const float adj[ABC] = DELTA_ENDSTOP_ADJ, + dta[ABC] = DELTA_TOWER_ANGLE_TRIM; + delta_height = DELTA_HEIGHT; + COPY(delta_endstop_adj, adj); + delta_radius = DELTA_RADIUS; + delta_diagonal_rod = DELTA_DIAGONAL_ROD; + delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND; + delta_calibration_radius = DELTA_CALIBRATION_RADIUS; + COPY(delta_tower_angle_trim, dta); + + #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + + #if ENABLED(X_DUAL_ENDSTOPS) + endstops.x_endstop_adj = ( + #ifdef X_DUAL_ENDSTOPS_ADJUSTMENT + X_DUAL_ENDSTOPS_ADJUSTMENT + #else + 0 + #endif + ); + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + endstops.y_endstop_adj = ( + #ifdef Y_DUAL_ENDSTOPS_ADJUSTMENT + Y_DUAL_ENDSTOPS_ADJUSTMENT + #else + 0 + #endif + ); + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + endstops.z_endstop_adj = ( + #ifdef Z_DUAL_ENDSTOPS_ADJUSTMENT + Z_DUAL_ENDSTOPS_ADJUSTMENT + #else + 0 + #endif + ); + #endif + + #endif + + #if ENABLED(ULTIPANEL) + lcd_preheat_hotend_temp[0] = PREHEAT_1_TEMP_HOTEND; + lcd_preheat_hotend_temp[1] = PREHEAT_2_TEMP_HOTEND; + lcd_preheat_bed_temp[0] = PREHEAT_1_TEMP_BED; + lcd_preheat_bed_temp[1] = PREHEAT_2_TEMP_BED; + lcd_preheat_fan_speed[0] = PREHEAT_1_FAN_SPEED; + lcd_preheat_fan_speed[1] = PREHEAT_2_FAN_SPEED; + #endif + + #if ENABLED(PIDTEMP) + #if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1 + HOTEND_LOOP() + #endif + { + PID_PARAM(Kp, e) = float(DEFAULT_Kp); + PID_PARAM(Ki, e) = scalePID_i(DEFAULT_Ki); + PID_PARAM(Kd, e) = scalePID_d(DEFAULT_Kd); + #if ENABLED(PID_EXTRUSION_SCALING) + PID_PARAM(Kc, e) = DEFAULT_Kc; + #endif + } + #if ENABLED(PID_EXTRUSION_SCALING) + thermalManager.lpq_len = 20; // default last-position-queue size + #endif + #endif // PIDTEMP + + #if ENABLED(PIDTEMPBED) + thermalManager.bedKp = DEFAULT_bedKp; + thermalManager.bedKi = scalePID_i(DEFAULT_bedKi); + thermalManager.bedKd = scalePID_d(DEFAULT_bedKd); + #endif + + #if HAS_LCD_CONTRAST + lcd_contrast = DEFAULT_LCD_CONTRAST; + #endif + + #if ENABLED(FWRETRACT) + fwretract.reset(); + #endif + + #if DISABLED(NO_VOLUMETRICS) + + parser.volumetric_enabled = + #if ENABLED(VOLUMETRIC_DEFAULT_ON) + true + #else + false + #endif + ; + for (uint8_t q = 0; q < COUNT(planner.filament_size); q++) + planner.filament_size[q] = DEFAULT_NOMINAL_FILAMENT_DIA; + + #endif + + endstops.enable_globally( + #if ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT) + true + #else + false + #endif + ); + + reset_stepper_drivers(); + + #if ENABLED(LIN_ADVANCE) + planner.extruder_advance_K = LIN_ADVANCE_K; + #endif + + #if HAS_MOTOR_CURRENT_PWM + uint32_t tmp_motor_current_setting[XYZ] = PWM_MOTOR_CURRENT; + for (uint8_t q = XYZ; q--;) + stepper.digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q])); + #endif + + #if ENABLED(SKEW_CORRECTION_GCODE) + planner.xy_skew_factor = XY_SKEW_FACTOR; + #if ENABLED(SKEW_CORRECTION_FOR_Z) + planner.xz_skew_factor = XZ_SKEW_FACTOR; + planner.yz_skew_factor = YZ_SKEW_FACTOR; + #endif + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + for (uint8_t e = 0; e < EXTRUDERS; e++) { + filament_change_unload_length[e] = FILAMENT_CHANGE_UNLOAD_LENGTH; + filament_change_load_length[e] = FILAMENT_CHANGE_FAST_LOAD_LENGTH; + } + #endif + + postprocess(); + + #if ENABLED(EEPROM_CHITCHAT) + SERIAL_ECHO_START_P(port); + SERIAL_ECHOLNPGM_P(port, "Hardcoded Default Settings Loaded"); + #endif +} + +#if DISABLED(DISABLE_M503) + + #define CONFIG_ECHO_START do{ if (!forReplay) SERIAL_ECHO_START_P(port); }while(0) + + #if HAS_TRINAMIC + void say_M906(PORTARG_SOLO) { SERIAL_ECHOPGM_P(port, " M906"); } + #if ENABLED(HYBRID_THRESHOLD) + void say_M913(PORTARG_SOLO) { SERIAL_ECHOPGM_P(port, " M913"); } + #endif + #if ENABLED(SENSORLESS_HOMING) + void say_M914(PORTARG_SOLO) { SERIAL_ECHOPGM_P(port, " M914"); } + #endif + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void say_M603(PORTARG_SOLO) { SERIAL_ECHOPGM_P(port, " M603 "); } + #endif + + inline void say_units( + #if NUM_SERIAL > 1 + const int8_t port, + #endif + const bool colon + ) { + serialprintPGM_P(port, + #if ENABLED(INCH_MODE_SUPPORT) + parser.linear_unit_factor != 1.0 ? PSTR(" (in)") : + #endif + PSTR(" (mm)") + ); + if (colon) SERIAL_ECHOLNPGM_P(port, ":"); + } + #if NUM_SERIAL > 1 + #define SAY_UNITS_P(PORT, COLON) say_units(PORT, COLON) + #else + #define SAY_UNITS_P(PORT, COLON) say_units(COLON) + #endif + + /** + * M503 - Report current settings in RAM + * + * Unless specifically disabled, M503 is available even without EEPROM + */ + void MarlinSettings::report(const bool forReplay + #if NUM_SERIAL > 1 + , const int8_t port/*=-1*/ + #endif + ) { + /** + * Announce current units, in case inches are being displayed + */ + CONFIG_ECHO_START; + #if ENABLED(INCH_MODE_SUPPORT) + #define LINEAR_UNIT(N) (float(N) / parser.linear_unit_factor) + #define VOLUMETRIC_UNIT(N) (float(N) / (parser.volumetric_enabled ? parser.volumetric_unit_factor : parser.linear_unit_factor)) + SERIAL_ECHOPGM_P(port, " G2"); + SERIAL_CHAR_P(port, parser.linear_unit_factor == 1.0 ? '1' : '0'); + SERIAL_ECHOPGM_P(port, " ;"); + SAY_UNITS_P(port, false); + #else + #define LINEAR_UNIT(N) (N) + #define VOLUMETRIC_UNIT(N) (N) + SERIAL_ECHOPGM_P(port, " G21 ; Units in mm"); + SAY_UNITS_P(port, false); + #endif + SERIAL_EOL_P(port); + + #if ENABLED(ULTIPANEL) + + // Temperature units - for Ultipanel temperature options + + CONFIG_ECHO_START; + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + #define TEMP_UNIT(N) parser.to_temp_units(N) + SERIAL_ECHOPGM_P(port, " M149 "); + SERIAL_CHAR_P(port, parser.temp_units_code()); + SERIAL_ECHOPGM_P(port, " ; Units in "); + serialprintPGM_P(port, parser.temp_units_name()); + #else + #define TEMP_UNIT(N) (N) + SERIAL_ECHOLNPGM_P(port, " M149 C ; Units in Celsius"); + #endif + + #endif + + SERIAL_EOL_P(port); + + #if DISABLED(NO_VOLUMETRICS) + + /** + * Volumetric extrusion M200 + */ + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOPGM_P(port, "Filament settings:"); + if (parser.volumetric_enabled) + SERIAL_EOL_P(port); + else + SERIAL_ECHOLNPGM_P(port, " Disabled"); + } + + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M200 D", LINEAR_UNIT(planner.filament_size[0])); + SERIAL_EOL_P(port); + #if EXTRUDERS > 1 + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M200 T1 D", LINEAR_UNIT(planner.filament_size[1])); + SERIAL_EOL_P(port); + #if EXTRUDERS > 2 + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M200 T2 D", LINEAR_UNIT(planner.filament_size[2])); + SERIAL_EOL_P(port); + #if EXTRUDERS > 3 + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M200 T3 D", LINEAR_UNIT(planner.filament_size[3])); + SERIAL_EOL_P(port); + #if EXTRUDERS > 4 + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M200 T4 D", LINEAR_UNIT(planner.filament_size[4])); + SERIAL_EOL_P(port); + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + + if (!parser.volumetric_enabled) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, " M200 D0"); + } + + #endif // !NO_VOLUMETRICS + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Steps per unit:"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M92 X", LINEAR_UNIT(planner.axis_steps_per_mm[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.axis_steps_per_mm[Y_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.axis_steps_per_mm[Z_AXIS])); + #if DISABLED(DISTINCT_E_FACTORS) + SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS])); + #endif + SERIAL_EOL_P(port); + #if ENABLED(DISTINCT_E_FACTORS) + CONFIG_ECHO_START; + for (uint8_t i = 0; i < E_STEPPERS; i++) { + SERIAL_ECHOPAIR_P(port, " M92 T", (int)i); + SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS + i])); + } + #endif + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Maximum feedrates (units/s):"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M203 X", LINEAR_UNIT(planner.max_feedrate_mm_s[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_feedrate_mm_s[Y_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_feedrate_mm_s[Z_AXIS])); + #if DISABLED(DISTINCT_E_FACTORS) + SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS])); + #endif + SERIAL_EOL_P(port); + #if ENABLED(DISTINCT_E_FACTORS) + CONFIG_ECHO_START; + for (uint8_t i = 0; i < E_STEPPERS; i++) { + SERIAL_ECHOPAIR_P(port, " M203 T", (int)i); + SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS + i])); + } + #endif + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Maximum Acceleration (units/s2):"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M201 X", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Y_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Z_AXIS])); + #if DISABLED(DISTINCT_E_FACTORS) + SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS])); + #endif + SERIAL_EOL_P(port); + #if ENABLED(DISTINCT_E_FACTORS) + CONFIG_ECHO_START; + for (uint8_t i = 0; i < E_STEPPERS; i++) { + SERIAL_ECHOPAIR_P(port, " M201 T", (int)i); + SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS + i])); + } + #endif + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Acceleration (units/s2): P R T"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M204 P", LINEAR_UNIT(planner.acceleration)); + SERIAL_ECHOPAIR_P(port, " R", LINEAR_UNIT(planner.retract_acceleration)); + SERIAL_ECHOLNPAIR_P(port, " T", LINEAR_UNIT(planner.travel_acceleration)); + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOPGM_P(port, "Advanced: B S T"); + #if ENABLED(JUNCTION_DEVIATION) + SERIAL_ECHOPGM_P(port, " J"); + #else + SERIAL_ECHOPGM_P(port, " X Y Z"); + #endif + #if DISABLED(JUNCTION_DEVIATION) || ENABLED(LIN_ADVANCE) + SERIAL_ECHOPGM_P(port, " E"); + #endif + SERIAL_EOL_P(port); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M205 B", LINEAR_UNIT(planner.min_segment_time_us)); + SERIAL_ECHOPAIR_P(port, " S", LINEAR_UNIT(planner.min_feedrate_mm_s)); + SERIAL_ECHOPAIR_P(port, " T", LINEAR_UNIT(planner.min_travel_feedrate_mm_s)); + + #if ENABLED(JUNCTION_DEVIATION) + SERIAL_ECHOPAIR_P(port, " J", LINEAR_UNIT(planner.junction_deviation_mm)); + #else + SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(planner.max_jerk[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_jerk[Y_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_jerk[Z_AXIS])); + SERIAL_ECHOPAIR_P(port, " E", LINEAR_UNIT(planner.max_jerk[E_AXIS])); + #endif + + SERIAL_EOL_P(port); + + #if HAS_M206_COMMAND + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Home offset:"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M206 X", LINEAR_UNIT(home_offset[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(home_offset[Y_AXIS])); + SERIAL_ECHOLNPAIR_P(port, " Z", LINEAR_UNIT(home_offset[Z_AXIS])); + #endif + + #if HAS_HOTEND_OFFSET + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Hotend offsets:"); + } + CONFIG_ECHO_START; + for (uint8_t e = 1; e < HOTENDS; e++) { + SERIAL_ECHOPAIR_P(port, " M218 T", (int)e); + SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(hotend_offset[X_AXIS][e])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(hotend_offset[Y_AXIS][e])); + SERIAL_ECHO_P(port, " Z"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(hotend_offset[Z_AXIS][e]), 3); + SERIAL_EOL_P(port); + } + #endif + + /** + * Bed Leveling + */ + #if HAS_LEVELING + + #if ENABLED(MESH_BED_LEVELING) + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Mesh Bed Leveling:"); + } + + #elif ENABLED(AUTO_BED_LEVELING_UBL) + + if (!forReplay) { + CONFIG_ECHO_START; + ubl.echo_name(); + SERIAL_ECHOLNPGM_P(port, ":"); + } + + #elif HAS_ABL + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Auto Bed Leveling:"); + } + + #endif + + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M420 S", planner.leveling_active ? 1 : 0); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.z_fade_height)); + #endif + SERIAL_EOL_P(port); + + #if ENABLED(MESH_BED_LEVELING) + + if (leveling_is_valid()) { + for (uint8_t py = 0; py < GRID_MAX_POINTS_Y; py++) { + for (uint8_t px = 0; px < GRID_MAX_POINTS_X; px++) { + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " G29 S3 X", (int)px + 1); + SERIAL_ECHOPAIR_P(port, " Y", (int)py + 1); + SERIAL_ECHOPGM_P(port, " Z"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(mbl.z_values[px][py]), 5); + SERIAL_EOL_P(port); + } + } + } + + #elif ENABLED(AUTO_BED_LEVELING_UBL) + + if (!forReplay) { + SERIAL_EOL_P(port); + ubl.report_state(); + SERIAL_ECHOLNPAIR_P(port, "\nActive Mesh Slot: ", ubl.storage_slot); + SERIAL_ECHOPAIR_P(port, "EEPROM can hold ", calc_num_meshes()); + SERIAL_ECHOLNPGM_P(port, " meshes.\n"); + } + +// ubl.report_current_mesh(PORTVAR_SOLO); // This is too verbose for large mesh's. A better (more terse) + // solution needs to be found. + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + if (leveling_is_valid()) { + for (uint8_t py = 0; py < GRID_MAX_POINTS_Y; py++) { + for (uint8_t px = 0; px < GRID_MAX_POINTS_X; px++) { + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " G29 W I", (int)px); + SERIAL_ECHOPAIR_P(port, " J", (int)py); + SERIAL_ECHOPGM_P(port, " Z"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(z_values[px][py]), 5); + SERIAL_EOL_P(port); + } + } + } + + #endif + + #endif // HAS_LEVELING + + #if HAS_SERVOS && ENABLED(EDITABLE_SERVO_ANGLES) + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Servo Angles:"); + } + for (uint8_t i = 0; i < NUM_SERVOS; i++) { + switch (i) { + #if ENABLED(SWITCHING_EXTRUDER) + case SWITCHING_EXTRUDER_SERVO_NR: + #if EXTRUDERS > 3 + case SWITCHING_EXTRUDER_E23_SERVO_NR: + #endif + #elif ENABLED(SWITCHING_NOZZLE) + case SWITCHING_NOZZLE_SERVO_NR: + #elif defined(Z_SERVO_ANGLES) && defined(Z_PROBE_SERVO_NR) + case Z_PROBE_SERVO_NR: + #endif + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M281 P", int(i)); + SERIAL_ECHOPAIR_P(port, " L", servo_angles[i][0]); + SERIAL_ECHOPAIR_P(port, " U", servo_angles[i][1]); + SERIAL_EOL_P(port); + default: break; + } + } + + #endif // HAS_SERVOS && EDITABLE_SERVO_ANGLES + + #if ENABLED(DELTA) + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Endstop adjustment:"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M666 X", LINEAR_UNIT(delta_endstop_adj[X_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(delta_endstop_adj[Y_AXIS])); + SERIAL_ECHOLNPAIR_P(port, " Z", LINEAR_UNIT(delta_endstop_adj[Z_AXIS])); + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Delta settings: L R H S B XYZ"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M665 L", LINEAR_UNIT(delta_diagonal_rod)); + SERIAL_ECHOPAIR_P(port, " R", LINEAR_UNIT(delta_radius)); + SERIAL_ECHOPAIR_P(port, " H", LINEAR_UNIT(delta_height)); + SERIAL_ECHOPAIR_P(port, " S", delta_segments_per_second); + SERIAL_ECHOPAIR_P(port, " B", LINEAR_UNIT(delta_calibration_radius)); + SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(delta_tower_angle_trim[A_AXIS])); + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(delta_tower_angle_trim[B_AXIS])); + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(delta_tower_angle_trim[C_AXIS])); + SERIAL_EOL_P(port); + + #elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Endstop adjustment:"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPGM_P(port, " M666"); + #if ENABLED(X_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR_P(port, " X", LINEAR_UNIT(endstops.x_endstop_adj)); + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(endstops.y_endstop_adj)); + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(endstops.z_endstop_adj)); + #endif + SERIAL_EOL_P(port); + + #endif // [XYZ]_DUAL_ENDSTOPS + + #if ENABLED(ULTIPANEL) + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Material heatup parameters:"); + } + for (uint8_t i = 0; i < COUNT(lcd_preheat_hotend_temp); i++) { + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M145 S", (int)i); + SERIAL_ECHOPAIR_P(port, " H", TEMP_UNIT(lcd_preheat_hotend_temp[i])); + SERIAL_ECHOPAIR_P(port, " B", TEMP_UNIT(lcd_preheat_bed_temp[i])); + SERIAL_ECHOLNPAIR_P(port, " F", lcd_preheat_fan_speed[i]); + } + #endif // ULTIPANEL + + #if HAS_PID_HEATING + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "PID settings:"); + } + #if ENABLED(PIDTEMP) + #if HOTENDS > 1 + if (forReplay) { + HOTEND_LOOP() { + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M301 E", e); + SERIAL_ECHOPAIR_P(port, " P", PID_PARAM(Kp, e)); + SERIAL_ECHOPAIR_P(port, " I", unscalePID_i(PID_PARAM(Ki, e))); + SERIAL_ECHOPAIR_P(port, " D", unscalePID_d(PID_PARAM(Kd, e))); + #if ENABLED(PID_EXTRUSION_SCALING) + SERIAL_ECHOPAIR_P(port, " C", PID_PARAM(Kc, e)); + if (e == 0) SERIAL_ECHOPAIR_P(port, " L", thermalManager.lpq_len); + #endif + SERIAL_EOL_P(port); + } + } + else + #endif // HOTENDS > 1 + // !forReplay || HOTENDS == 1 + { + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M301 P", PID_PARAM(Kp, 0)); // for compatibility with hosts, only echo values for E0 + SERIAL_ECHOPAIR_P(port, " I", unscalePID_i(PID_PARAM(Ki, 0))); + SERIAL_ECHOPAIR_P(port, " D", unscalePID_d(PID_PARAM(Kd, 0))); + #if ENABLED(PID_EXTRUSION_SCALING) + SERIAL_ECHOPAIR_P(port, " C", PID_PARAM(Kc, 0)); + SERIAL_ECHOPAIR_P(port, " L", thermalManager.lpq_len); + #endif + SERIAL_EOL_P(port); + } + #endif // PIDTEMP + + #if ENABLED(PIDTEMPBED) + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M304 P", thermalManager.bedKp); + SERIAL_ECHOPAIR_P(port, " I", unscalePID_i(thermalManager.bedKi)); + SERIAL_ECHOPAIR_P(port, " D", unscalePID_d(thermalManager.bedKd)); + SERIAL_EOL_P(port); + #endif + + #endif // PIDTEMP || PIDTEMPBED + + #if HAS_LCD_CONTRAST + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "LCD Contrast:"); + } + CONFIG_ECHO_START; + SERIAL_ECHOLNPAIR_P(port, " M250 C", lcd_contrast); + #endif + + #if ENABLED(FWRETRACT) + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Retract: S F Z"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M207 S", LINEAR_UNIT(fwretract.retract_length)); + SERIAL_ECHOPAIR_P(port, " W", LINEAR_UNIT(fwretract.swap_retract_length)); + SERIAL_ECHOPAIR_P(port, " F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_feedrate_mm_s))); + SERIAL_ECHOLNPAIR_P(port, " Z", LINEAR_UNIT(fwretract.retract_zlift)); + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Recover: S F"); + } + CONFIG_ECHO_START; + SERIAL_ECHOPAIR_P(port, " M208 S", LINEAR_UNIT(fwretract.retract_recover_length)); + SERIAL_ECHOPAIR_P(port, " W", LINEAR_UNIT(fwretract.swap_retract_recover_length)); + SERIAL_ECHOLNPAIR_P(port, " F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_recover_feedrate_mm_s))); + + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); + } + CONFIG_ECHO_START; + SERIAL_ECHOLNPAIR_P(port, " M209 S", fwretract.autoretract_enabled ? 1 : 0); + + #endif // FWRETRACT + + /** + * Probe Offset + */ + #if HAS_BED_PROBE + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOPGM_P(port, "Z-Probe Offset (mm):"); + SAY_UNITS_P(port, true); + } + CONFIG_ECHO_START; + SERIAL_ECHOLNPAIR_P(port, " M851 Z", LINEAR_UNIT(zprobe_zoffset)); + #endif + + /** + * Bed Skew Correction + */ + #if ENABLED(SKEW_CORRECTION_GCODE) + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Skew Factor: "); + } + CONFIG_ECHO_START; + #if ENABLED(SKEW_CORRECTION_FOR_Z) + SERIAL_ECHOPGM_P(port, " M852 I"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.xy_skew_factor), 6); + SERIAL_ECHOPGM_P(port, " J"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.xz_skew_factor), 6); + SERIAL_ECHOPGM_P(port, " K"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.yz_skew_factor), 6); + SERIAL_EOL_P(port); + #else + SERIAL_ECHOPGM_P(port, " M852 S"); + SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.xy_skew_factor), 6); + SERIAL_EOL_P(port); + #endif + #endif + + #if HAS_TRINAMIC + + /** + * TMC2130 / TMC2208 stepper driver current + */ + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Stepper driver current:"); + } + CONFIG_ECHO_START; + #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + say_M906(PORTVAR_SOLO); + #endif + #if AXIS_IS_TMC(X) + SERIAL_ECHOPAIR_P(port, " X", stepperX.getCurrent()); + #endif + #if AXIS_IS_TMC(Y) + SERIAL_ECHOPAIR_P(port, " Y", stepperY.getCurrent()); + #endif + #if AXIS_IS_TMC(Z) + SERIAL_ECHOPAIR_P(port, " Z", stepperZ.getCurrent()); + #endif + #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + SERIAL_EOL_P(port); + #endif + #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) + say_M906(PORTVAR_SOLO); + SERIAL_ECHOPGM_P(port, " I1"); + #endif + #if AXIS_IS_TMC(X2) + SERIAL_ECHOPAIR_P(port, " X", stepperX2.getCurrent()); + #endif + #if AXIS_IS_TMC(Y2) + SERIAL_ECHOPAIR_P(port, " Y", stepperY2.getCurrent()); + #endif + #if AXIS_IS_TMC(Z2) + SERIAL_ECHOPAIR_P(port, " Z", stepperZ2.getCurrent()); + #endif + #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) + SERIAL_EOL_P(port); + #endif + #if AXIS_IS_TMC(E0) + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T0 E", stepperE0.getCurrent()); + #endif + #if E_STEPPERS > 1 && AXIS_IS_TMC(E1) + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T1 E", stepperE1.getCurrent()); + #endif + #if E_STEPPERS > 2 && AXIS_IS_TMC(E2) + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T2 E", stepperE2.getCurrent()); + #endif + #if E_STEPPERS > 3 && AXIS_IS_TMC(E3) + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T3 E", stepperE3.getCurrent()); + #endif + #if E_STEPPERS > 4 && AXIS_IS_TMC(E4) + say_M906(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getCurrent()); + #endif + SERIAL_EOL_P(port); + + /** + * TMC2130 / TMC2208 / TRAMS Hybrid Threshold + */ + #if ENABLED(HYBRID_THRESHOLD) + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Hybrid Threshold:"); + } + CONFIG_ECHO_START; + #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + say_M913(PORTVAR_SOLO); + #endif + #if AXIS_IS_TMC(X) + SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X)); + #endif + #if AXIS_IS_TMC(Y) + SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y)); + #endif + #if AXIS_IS_TMC(Z) + SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z)); + #endif + #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + SERIAL_EOL_P(port); + #endif + #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) + say_M913(PORTVAR_SOLO); + SERIAL_ECHOPGM_P(port, " I1"); + #endif + #if AXIS_IS_TMC(X2) + SERIAL_ECHOPAIR_P(port, " X", TMC_GET_PWMTHRS(X, X2)); + #endif + #if AXIS_IS_TMC(Y2) + SERIAL_ECHOPAIR_P(port, " Y", TMC_GET_PWMTHRS(Y, Y2)); + #endif + #if AXIS_IS_TMC(Z2) + SERIAL_ECHOPAIR_P(port, " Z", TMC_GET_PWMTHRS(Z, Z2)); + #endif + #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) + SERIAL_EOL_P(port); + #endif + #if AXIS_IS_TMC(E0) + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T0 E", TMC_GET_PWMTHRS(E, E0)); + #endif + #if E_STEPPERS > 1 && AXIS_IS_TMC(E1) + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T1 E", TMC_GET_PWMTHRS(E, E1)); + #endif + #if E_STEPPERS > 2 && AXIS_IS_TMC(E2) + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T2 E", TMC_GET_PWMTHRS(E, E2)); + #endif + #if E_STEPPERS > 3 && AXIS_IS_TMC(E3) + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T3 E", TMC_GET_PWMTHRS(E, E3)); + #endif + #if E_STEPPERS > 4 && AXIS_IS_TMC(E4) + say_M913(PORTVAR_SOLO); + SERIAL_ECHOLNPAIR_P(port, " T4 E", TMC_GET_PWMTHRS(E, E4)); + #endif + SERIAL_EOL_P(port); + #endif // HYBRID_THRESHOLD + + /** + * TMC2130 Sensorless homing thresholds + */ + #if ENABLED(SENSORLESS_HOMING) + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Sensorless homing threshold:"); + } + CONFIG_ECHO_START; + #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS + say_M914(PORTVAR_SOLO); + #if X_SENSORLESS + SERIAL_ECHOPAIR_P(port, " X", stepperX.sgt()); + #endif + #if Y_SENSORLESS + SERIAL_ECHOPAIR_P(port, " Y", stepperY.sgt()); + #endif + #if Z_SENSORLESS + SERIAL_ECHOPAIR_P(port, " Z", stepperZ.sgt()); + #endif + SERIAL_EOL_P(port); + #endif + + #define HAS_X2_SENSORLESS (defined(X_HOMING_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2)) + #define HAS_Y2_SENSORLESS (defined(Y_HOMING_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2)) + #define HAS_Z2_SENSORLESS (defined(Z_HOMING_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2)) + #if HAS_X2_SENSORLESS || HAS_Y2_SENSORLESS || HAS_Z2_SENSORLESS + say_M914(PORTVAR_SOLO); + SERIAL_ECHOPGM_P(port, " I1"); + #if HAS_X2_SENSORLESS + SERIAL_ECHOPAIR_P(port, " X", stepperX2.sgt()); + #endif + #if HAS_Y2_SENSORLESS + SERIAL_ECHOPAIR_P(port, " Y", stepperY2.sgt()); + #endif + #if HAS_Z2_SENSORLESS + SERIAL_ECHOPAIR_P(port, " Z", stepperZ2.sgt()); + #endif + SERIAL_EOL_P(port); + #endif + + #endif // SENSORLESS_HOMING + + #endif // HAS_TRINAMIC + + /** + * Linear Advance + */ + #if ENABLED(LIN_ADVANCE) + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Linear Advance:"); + } + CONFIG_ECHO_START; + SERIAL_ECHOLNPAIR_P(port, " M900 K", planner.extruder_advance_K); + #endif + + #if HAS_MOTOR_CURRENT_PWM + CONFIG_ECHO_START; + if (!forReplay) { + SERIAL_ECHOLNPGM_P(port, "Stepper motor currents:"); + CONFIG_ECHO_START; + } + SERIAL_ECHOPAIR_P(port, " M907 X", stepper.motor_current_setting[0]); + SERIAL_ECHOPAIR_P(port, " Z", stepper.motor_current_setting[1]); + SERIAL_ECHOPAIR_P(port, " E", stepper.motor_current_setting[2]); + SERIAL_EOL_P(port); + #endif + + /** + * Advanced Pause filament load & unload lengths + */ + #if ENABLED(ADVANCED_PAUSE_FEATURE) + if (!forReplay) { + CONFIG_ECHO_START; + SERIAL_ECHOLNPGM_P(port, "Filament load/unload lengths:"); + } + CONFIG_ECHO_START; + #if EXTRUDERS == 1 + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "L", LINEAR_UNIT(filament_change_load_length[0])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[0])); + #else + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T0 L", LINEAR_UNIT(filament_change_load_length[0])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[0])); + CONFIG_ECHO_START; + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T1 L", LINEAR_UNIT(filament_change_load_length[1])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[1])); + #if EXTRUDERS > 2 + CONFIG_ECHO_START; + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T2 L", LINEAR_UNIT(filament_change_load_length[2])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[2])); + #if EXTRUDERS > 3 + CONFIG_ECHO_START; + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T3 L", LINEAR_UNIT(filament_change_load_length[3])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[3])); + #if EXTRUDERS > 4 + CONFIG_ECHO_START; + say_M603(PORTVAR_SOLO); + SERIAL_ECHOPAIR_P(port, "T4 L", LINEAR_UNIT(filament_change_load_length[4])); + SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[4])); + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS == 1 + #endif // ADVANCED_PAUSE_FEATURE + } + +#endif // !DISABLE_M503 diff --git a/Marlin/src/module/configuration_store.h b/Marlin/src/module/configuration_store.h new file mode 100644 index 0000000000..84e90527b3 --- /dev/null +++ b/Marlin/src/module/configuration_store.h @@ -0,0 +1,119 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef CONFIGURATION_STORE_H +#define CONFIGURATION_STORE_H + +#include "../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + #include "../HAL/shared/persistent_store_api.h" +#endif + +#define ADD_PORT_ARG ENABLED(EEPROM_CHITCHAT) && NUM_SERIAL > 1 + +#if ADD_PORT_ARG + #define PORTINIT_SOLO const int8_t port=-1 + #define PORTINIT_AFTER ,const int8_t port=-1 +#else + #define PORTINIT_SOLO + #define PORTINIT_AFTER +#endif + +class MarlinSettings { + public: + MarlinSettings() { } + + static uint16_t datasize(); + + static void reset(PORTINIT_SOLO); + static bool save(PORTINIT_SOLO); // Return 'true' if data was saved + + FORCE_INLINE static bool init_eeprom() { + reset(); + #if ENABLED(EEPROM_SETTINGS) + const bool success = save(); + #if ENABLED(EEPROM_CHITCHAT) + if (success) report(); + #endif + return success; + #else + return true; + #endif + } + + #if ENABLED(EEPROM_SETTINGS) + static bool load(PORTINIT_SOLO); // Return 'true' if data was loaded ok + static bool validate(PORTINIT_SOLO); // Return 'true' if EEPROM data is ok + + #if ENABLED(AUTO_BED_LEVELING_UBL) // Eventually make these available if any leveling system + // That can store is enabled + static uint16_t meshes_start_index(); + FORCE_INLINE static uint16_t meshes_end_index() { return meshes_end; } + static uint16_t calc_num_meshes(); + static int mesh_slot_offset(const int8_t slot); + static void store_mesh(const int8_t slot); + static void load_mesh(const int8_t slot, void * const into=NULL); + + //static void delete_mesh(); // necessary if we have a MAT + //static void defrag_meshes(); // " + #endif + #else + FORCE_INLINE + static bool load() { reset(); report(); return true; } + #endif + + #if DISABLED(DISABLE_M503) + static void report(const bool forReplay=false + #if NUM_SERIAL > 1 + , const int8_t port=-1 + #endif + ); + #else + FORCE_INLINE + static void report(const bool forReplay=false) { UNUSED(forReplay); } + #endif + + private: + static void postprocess(); + + #if ENABLED(EEPROM_SETTINGS) + + static bool eeprom_error, validating; + + #if ENABLED(AUTO_BED_LEVELING_UBL) // Eventually make these available if any leveling system + // That can store is enabled + static const uint16_t meshes_end; // 128 is a placeholder for the size of the MAT; the MAT will always + // live at the very end of the eeprom + #endif + + static bool _load(PORTINIT_SOLO); + static bool size_error(const uint16_t size PORTINIT_AFTER); + #endif +}; + +extern MarlinSettings settings; + +#undef PORTINIT_SOLO +#undef PORTINIT_AFTER + +#endif // CONFIGURATION_STORE_H diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index df6cae6e0a..ba4c018f93 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -35,31 +35,24 @@ #include "planner.h" #include "endstops.h" #include "../lcd/ultralcd.h" -#include "../MarlinCore.h" - -#if HAS_BED_PROBE - #include "probe.h" -#endif +#include "../Marlin.h" #if ENABLED(SENSORLESS_HOMING) #include "../feature/tmc_util.h" - #include "stepper/indirection.h" #endif -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../core/debug_out.h" - // Initialized by settings.load() -float delta_height; -abc_float_t delta_endstop_adj{0}; -float delta_radius, +float delta_height, + delta_endstop_adj[ABC] = { 0 }, + delta_radius, delta_diagonal_rod, - delta_segments_per_second; -abc_float_t delta_tower_angle_trim; -xy_float_t delta_tower[ABC]; -abc_float_t delta_diagonal_rod_2_tower; -float delta_clip_start_height = Z_MAX_POS; -abc_float_t delta_diagonal_rod_trim; + delta_segments_per_second, + delta_calibration_radius, + delta_tower_angle_trim[ABC]; + +float delta_tower[ABC][2], + delta_diagonal_rod_2_tower[ABC], + delta_clip_start_height = Z_MAX_POS; float delta_safe_distance_from_top(); @@ -68,42 +61,21 @@ float delta_safe_distance_from_top(); * settings have been changed (e.g., by M665). */ void recalc_delta_settings() { - constexpr abc_float_t trt = DELTA_RADIUS_TRIM_TOWER; - delta_tower[A_AXIS].set(cos(RADIANS(210 + delta_tower_angle_trim.a)) * (delta_radius + trt.a), // front left tower - sin(RADIANS(210 + delta_tower_angle_trim.a)) * (delta_radius + trt.a)); - delta_tower[B_AXIS].set(cos(RADIANS(330 + delta_tower_angle_trim.b)) * (delta_radius + trt.b), // front right tower - sin(RADIANS(330 + delta_tower_angle_trim.b)) * (delta_radius + trt.b)); - delta_tower[C_AXIS].set(cos(RADIANS( 90 + delta_tower_angle_trim.c)) * (delta_radius + trt.c), // back middle tower - sin(RADIANS( 90 + delta_tower_angle_trim.c)) * (delta_radius + trt.c)); - delta_diagonal_rod_2_tower.set(sq(delta_diagonal_rod + delta_diagonal_rod_trim.a), - sq(delta_diagonal_rod + delta_diagonal_rod_trim.b), - sq(delta_diagonal_rod + delta_diagonal_rod_trim.c)); + const float trt[ABC] = DELTA_RADIUS_TRIM_TOWER, + drt[ABC] = DELTA_DIAGONAL_ROD_TRIM_TOWER; + delta_tower[A_AXIS][X_AXIS] = cos(RADIANS(210 + delta_tower_angle_trim[A_AXIS])) * (delta_radius + trt[A_AXIS]); // front left tower + delta_tower[A_AXIS][Y_AXIS] = sin(RADIANS(210 + delta_tower_angle_trim[A_AXIS])) * (delta_radius + trt[A_AXIS]); + delta_tower[B_AXIS][X_AXIS] = cos(RADIANS(330 + delta_tower_angle_trim[B_AXIS])) * (delta_radius + trt[B_AXIS]); // front right tower + delta_tower[B_AXIS][Y_AXIS] = sin(RADIANS(330 + delta_tower_angle_trim[B_AXIS])) * (delta_radius + trt[B_AXIS]); + delta_tower[C_AXIS][X_AXIS] = cos(RADIANS( 90 + delta_tower_angle_trim[C_AXIS])) * (delta_radius + trt[C_AXIS]); // back middle tower + delta_tower[C_AXIS][Y_AXIS] = sin(RADIANS( 90 + delta_tower_angle_trim[C_AXIS])) * (delta_radius + trt[C_AXIS]); + delta_diagonal_rod_2_tower[A_AXIS] = sq(delta_diagonal_rod + drt[A_AXIS]); + delta_diagonal_rod_2_tower[B_AXIS] = sq(delta_diagonal_rod + drt[B_AXIS]); + delta_diagonal_rod_2_tower[C_AXIS] = sq(delta_diagonal_rod + drt[C_AXIS]); update_software_endstops(Z_AXIS); - set_all_unhomed(); + axis_homed = 0; } -/** - * Get a safe radius for calibration - */ - -#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU) - - #if ENABLED(DELTA_AUTO_CALIBRATION) - float calibration_radius_factor = 1; - #endif - - float delta_calibration_radius() { - return calibration_radius_factor * ( - #if HAS_BED_PROBE - FLOOR((DELTA_PRINTABLE_RADIUS) - _MAX(HYPOT(probe.offset_xy.x, probe.offset_xy.y), PROBING_MARGIN)) - #else - DELTA_PRINTABLE_RADIUS - #endif - ); - } - -#endif - /** * Delta Inverse Kinematics * @@ -121,16 +93,22 @@ void recalc_delta_settings() { */ #define DELTA_DEBUG(VAR) do { \ - SERIAL_ECHOLNPAIR_P(PSTR("Cartesian X"), VAR.x, SP_Y_STR, VAR.y, SP_Z_STR, VAR.z); \ - SERIAL_ECHOLNPAIR_P(PSTR("Delta A"), delta.a, SP_B_STR, delta.b, SP_C_STR, delta.c); \ + SERIAL_ECHOPAIR("cartesian X:", VAR[X_AXIS]); \ + SERIAL_ECHOPAIR(" Y:", VAR[Y_AXIS]); \ + SERIAL_ECHOLNPAIR(" Z:", VAR[Z_AXIS]); \ + SERIAL_ECHOPAIR("delta A:", delta[A_AXIS]); \ + SERIAL_ECHOPAIR(" B:", delta[B_AXIS]); \ + SERIAL_ECHOLNPAIR(" C:", delta[C_AXIS]); \ }while(0) -void inverse_kinematics(const xyz_pos_t &raw) { +void inverse_kinematics(const float raw[XYZ]) { #if HAS_HOTEND_OFFSET // Delta hotend offsets must be applied in Cartesian space with no "spoofing" - xyz_pos_t pos = { raw.x - hotend_offset[active_extruder].x, - raw.y - hotend_offset[active_extruder].y, - raw.z }; + const float pos[XYZ] = { + raw[X_AXIS] - hotend_offset[X_AXIS][active_extruder], + raw[Y_AXIS] - hotend_offset[Y_AXIS][active_extruder], + raw[Z_AXIS] + }; DELTA_IK(pos); //DELTA_DEBUG(pos); #else @@ -144,12 +122,12 @@ void inverse_kinematics(const xyz_pos_t &raw) { * effector has the full range of XY motion. */ float delta_safe_distance_from_top() { - xyz_pos_t cartesian{0}; + float cartesian[XYZ] = { 0, 0, 0 }; inverse_kinematics(cartesian); - const float centered_extent = delta.a; - cartesian.y = DELTA_PRINTABLE_RADIUS; + float centered_extent = delta[A_AXIS]; + cartesian[Y_AXIS] = DELTA_PRINTABLE_RADIUS; inverse_kinematics(cartesian); - return ABS(centered_extent - delta.a); + return ABS(centered_extent - delta[A_AXIS]); } /** @@ -179,7 +157,7 @@ float delta_safe_distance_from_top() { */ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) { // Create a vector in old coordinates along x axis of new coordinate - const float p12[3] = { delta_tower[B_AXIS].x - delta_tower[A_AXIS].x, delta_tower[B_AXIS].y - delta_tower[A_AXIS].y, z2 - z1 }, + const float p12[3] = { delta_tower[B_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[B_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z2 - z1 }, // Get the reciprocal of Magnitude of vector. d2 = sq(p12[0]) + sq(p12[1]) + sq(p12[2]), inv_d = RSQRT(d2), @@ -188,7 +166,7 @@ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) ex[3] = { p12[0] * inv_d, p12[1] * inv_d, p12[2] * inv_d }, // Get the vector from the origin of the new system to the third point. - p13[3] = { delta_tower[C_AXIS].x - delta_tower[A_AXIS].x, delta_tower[C_AXIS].y - delta_tower[A_AXIS].y, z3 - z1 }, + p13[3] = { delta_tower[C_AXIS][X_AXIS] - delta_tower[A_AXIS][X_AXIS], delta_tower[C_AXIS][Y_AXIS] - delta_tower[A_AXIS][Y_AXIS], z3 - z1 }, // Use the dot product to find the component of this vector on the X axis. i = ex[0] * p13[0] + ex[1] * p13[1] + ex[2] * p13[2], @@ -216,47 +194,52 @@ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) // We now have the d, i and j values defined in Wikipedia. // Plug them into the equations defined in Wikipedia for Xnew, Ynew and Znew - Xnew = (delta_diagonal_rod_2_tower.a - delta_diagonal_rod_2_tower.b + d2) * inv_d * 0.5, - Ynew = ((delta_diagonal_rod_2_tower.a - delta_diagonal_rod_2_tower.c + sq(i) + j2) * 0.5 - i * Xnew) * inv_j, - Znew = SQRT(delta_diagonal_rod_2_tower.a - HYPOT2(Xnew, Ynew)); + Xnew = (delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[B_AXIS] + d2) * inv_d * 0.5, + Ynew = ((delta_diagonal_rod_2_tower[A_AXIS] - delta_diagonal_rod_2_tower[C_AXIS] + sq(i) + j2) * 0.5 - i * Xnew) * inv_j, + Znew = SQRT(delta_diagonal_rod_2_tower[A_AXIS] - HYPOT2(Xnew, Ynew)); // Start from the origin of the old coordinates and add vectors in the // old coords that represent the Xnew, Ynew and Znew to find the point // in the old system. - cartes.set(delta_tower[A_AXIS].x + ex[0] * Xnew + ey[0] * Ynew - ez[0] * Znew, - delta_tower[A_AXIS].y + ex[1] * Xnew + ey[1] * Ynew - ez[1] * Znew, - z1 + ex[2] * Xnew + ey[2] * Ynew - ez[2] * Znew); + cartes[X_AXIS] = delta_tower[A_AXIS][X_AXIS] + ex[0] * Xnew + ey[0] * Ynew - ez[0] * Znew; + cartes[Y_AXIS] = delta_tower[A_AXIS][Y_AXIS] + ex[1] * Xnew + ey[1] * Ynew - ez[1] * Znew; + cartes[Z_AXIS] = z1 + ex[2] * Xnew + ey[2] * Ynew - ez[2] * Znew; } +#if ENABLED(SENSORLESS_HOMING) + inline void delta_sensorless_homing(const bool on=true) { + sensorless_homing_per_axis(A_AXIS, on); + sensorless_homing_per_axis(B_AXIS, on); + sensorless_homing_per_axis(C_AXIS, on); + } +#endif + /** * A delta can only safely home all axes at the same time * This is like quick_home_xy() but for 3 towers. */ void home_delta() { - DEBUG_SECTION(log_home_delta, "home_delta", DEBUGGING(LEVELING)); - + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS(">>> home_delta", current_position); + #endif // Init the current position of all carriages to 0,0,0 - current_position.reset(); - destination.reset(); + ZERO(current_position); sync_plan_position(); // Disable stealthChop if used. Enable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - TERN_(X_SENSORLESS, sensorless_t stealth_states_x = start_sensorless_homing_per_axis(X_AXIS)); - TERN_(Y_SENSORLESS, sensorless_t stealth_states_y = start_sensorless_homing_per_axis(Y_AXIS)); - TERN_(Z_SENSORLESS, sensorless_t stealth_states_z = start_sensorless_homing_per_axis(Z_AXIS)); + delta_sensorless_homing(); #endif // Move all carriages together linearly until an endstop is hit. - current_position.z = (delta_height + 10 - TERN0(HAS_BED_PROBE, probe.offset.z)); - line_to_current_position(homing_feedrate(Z_AXIS)); + current_position[X_AXIS] = current_position[Y_AXIS] = current_position[Z_AXIS] = (delta_height + 10); + feedrate_mm_s = homing_feedrate(X_AXIS); + line_to_current_position(); planner.synchronize(); // Re-enable stealthChop if used. Disable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); - TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); - TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); + delta_sensorless_homing(false); #endif endstops.validate_homing_move(); @@ -273,14 +256,10 @@ void home_delta() { // give the impression that they are the same. LOOP_XYZ(i) set_axis_is_at_home((AxisEnum)i); - sync_plan_position(); + SYNC_PLAN_POSITION_KINEMATIC(); - #if DISABLED(DELTA_HOME_TO_SAFE_ZONE) && defined(HOMING_BACKOFF_POST_MM) - constexpr xyz_float_t endstop_backoff = HOMING_BACKOFF_POST_MM; - if (endstop_backoff.z) { - current_position.z -= ABS(endstop_backoff.z) * Z_HOME_DIR; - line_to_current_position(homing_feedrate(Z_AXIS)); - } + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("<<< home_delta", current_position); #endif } diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index 5e9a78bd86..2dde72f801 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,28 +16,28 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * delta.h - Delta-specific functions */ -#include "../core/types.h" -#include "../core/macros.h" +#ifndef __DELTA_H__ +#define __DELTA_H__ -extern float delta_height; -extern abc_float_t delta_endstop_adj; -extern float delta_radius, +extern float delta_height, + delta_endstop_adj[ABC], + delta_radius, delta_diagonal_rod, - delta_segments_per_second; -extern abc_float_t delta_tower_angle_trim; -extern xy_float_t delta_tower[ABC]; -extern abc_float_t delta_diagonal_rod_2_tower; -extern float delta_clip_start_height; -extern abc_float_t delta_diagonal_rod_trim; + delta_segments_per_second, + delta_calibration_radius, + delta_tower_angle_trim[ABC]; + +extern float delta_tower[ABC][2], + delta_diagonal_rod_2_tower[ABC], + delta_clip_start_height; /** * Recalculate factors used for delta kinematics whenever @@ -45,19 +45,6 @@ extern abc_float_t delta_diagonal_rod_trim; */ void recalc_delta_settings(); -/** - * Get a safe radius for calibration - */ -#if ENABLED(DELTA_AUTO_CALIBRATION) - extern float calibration_radius_factor; -#else - constexpr float calibration_radius_factor = 1; -#endif - -#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU) - float delta_calibration_radius(); -#endif - /** * Delta Inverse Kinematics * @@ -78,16 +65,20 @@ void recalc_delta_settings(); */ // Macro to obtain the Z position of an individual tower -#define DELTA_Z(V,T) V.z + SQRT( \ +#define DELTA_Z(V,T) V[Z_AXIS] + SQRT( \ delta_diagonal_rod_2_tower[T] - HYPOT2( \ - delta_tower[T].x - V.x, \ - delta_tower[T].y - V.y \ + delta_tower[T][X_AXIS] - V[X_AXIS], \ + delta_tower[T][Y_AXIS] - V[Y_AXIS] \ ) \ ) -#define DELTA_IK(V) delta.set(DELTA_Z(V, A_AXIS), DELTA_Z(V, B_AXIS), DELTA_Z(V, C_AXIS)) +#define DELTA_IK(V) do { \ + delta[A_AXIS] = DELTA_Z(V, A_AXIS); \ + delta[B_AXIS] = DELTA_Z(V, B_AXIS); \ + delta[C_AXIS] = DELTA_Z(V, C_AXIS); \ +}while(0) -void inverse_kinematics(const xyz_pos_t &raw); +void inverse_kinematics(const float raw[XYZ]); /** * Calculate the highest Z position where the @@ -122,8 +113,10 @@ float delta_safe_distance_from_top(); */ void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3); -FORCE_INLINE void forward_kinematics_DELTA(const abc_float_t &point) { - forward_kinematics_DELTA(point.a, point.b, point.c); +FORCE_INLINE void forward_kinematics_DELTA(const float (&point)[ABC]) { + forward_kinematics_DELTA(point[A_AXIS], point[B_AXIS], point[C_AXIS]); } void home_delta(); + +#endif // __DELTA_H__ diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 712182a0ea..68886eb84f 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -27,37 +27,25 @@ #include "endstops.h" #include "stepper.h" -#include "../MarlinCore.h" +#include "../Marlin.h" #include "../sd/cardreader.h" -#include "temperature.h" +#include "../module/temperature.h" #include "../lcd/ultralcd.h" #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) #include HAL_PATH(../HAL, endstop_interrupts.h) #endif -#if BOTH(SD_ABORT_ON_ENDSTOP_HIT, SDSUPPORT) - #include "printcounter.h" // for print_job_timer -#endif - -#if ENABLED(BLTOUCH) - #include "../feature/bltouch.h" -#endif - -#if ENABLED(JOYSTICK) - #include "../feature/joystick.h" -#endif - Endstops endstops; -// private: +// public: bool Endstops::enabled, Endstops::enabled_globally; // Initialized by settings.load() volatile uint8_t Endstops::hit_state; Endstops::esbits_t Endstops::live_state = 0; -#if ENDSTOP_NOISE_THRESHOLD +#if ENABLED(ENDSTOP_NOISE_FILTER) Endstops::esbits_t Endstops::validated_live_state; uint8_t Endstops::endstop_poll_count; #endif @@ -68,26 +56,13 @@ Endstops::esbits_t Endstops::live_state = 0; // Initialized by settings.load() #if ENABLED(X_DUAL_ENDSTOPS) - float Endstops::x2_endstop_adj; + float Endstops::x_endstop_adj; #endif #if ENABLED(Y_DUAL_ENDSTOPS) - float Endstops::y2_endstop_adj; + float Endstops::y_endstop_adj; #endif -#if ENABLED(Z_MULTI_ENDSTOPS) - float Endstops::z2_endstop_adj; - #if NUM_Z_STEPPER_DRIVERS >= 3 - float Endstops::z3_endstop_adj; - #if NUM_Z_STEPPER_DRIVERS >= 4 - float Endstops::z4_endstop_adj; - #endif - #endif -#endif - -#if ENABLED(SPI_ENDSTOPS) - Endstops::tmc_spi_homing_t Endstops::tmc_spi_homing; // = 0 -#endif -#if ENABLED(IMPROVE_HOMING_RELIABILITY) - millis_t sg_guard_period; // = 0 +#if ENABLED(Z_DUAL_ENDSTOPS) + float Endstops::z_endstop_adj; #endif /** @@ -156,26 +131,6 @@ void Endstops::init() { #endif #endif - #if HAS_Z3_MIN - #if ENABLED(ENDSTOPPULLUP_ZMIN) - SET_INPUT_PULLUP(Z3_MIN_PIN); - #elif ENABLED(ENDSTOPPULLDOWN_ZMIN) - SET_INPUT_PULLDOWN(Z3_MIN_PIN); - #else - SET_INPUT(Z3_MIN_PIN); - #endif - #endif - - #if HAS_Z4_MIN - #if ENABLED(ENDSTOPPULLUP_ZMIN) - SET_INPUT_PULLUP(Z4_MIN_PIN); - #elif ENABLED(ENDSTOPPULLDOWN_ZMIN) - SET_INPUT_PULLDOWN(Z4_MIN_PIN); - #else - SET_INPUT(Z4_MIN_PIN); - #endif - #endif - #if HAS_X_MAX #if ENABLED(ENDSTOPPULLUP_XMAX) SET_INPUT_PULLUP(X_MAX_PIN); @@ -236,37 +191,7 @@ void Endstops::init() { #endif #endif - #if HAS_Z3_MAX - #if ENABLED(ENDSTOPPULLUP_ZMAX) - SET_INPUT_PULLUP(Z3_MAX_PIN); - #elif ENABLED(ENDSTOPPULLDOWN_ZMAX) - SET_INPUT_PULLDOWN(Z3_MAX_PIN); - #else - SET_INPUT(Z3_MAX_PIN); - #endif - #endif - - #if HAS_Z4_MAX - #if ENABLED(ENDSTOPPULLUP_ZMAX) - SET_INPUT_PULLUP(Z4_MAX_PIN); - #elif ENABLED(ENDSTOPPULLDOWN_ZMAX) - SET_INPUT_PULLDOWN(Z4_MAX_PIN); - #else - SET_INPUT(Z4_MAX_PIN); - #endif - #endif - - #if PIN_EXISTS(CALIBRATION) - #if ENABLED(CALIBRATION_PIN_PULLUP) - SET_INPUT_PULLUP(CALIBRATION_PIN); - #elif ENABLED(CALIBRATION_PIN_PULLDOWN) - SET_INPUT_PULLDOWN(CALIBRATION_PIN); - #else - SET_INPUT(CALIBRATION_PIN); - #endif - #endif - - #if HAS_CUSTOM_PROBE_PIN + #if ENABLED(Z_MIN_PROBE_ENDSTOP) #if ENABLED(ENDSTOPPULLUP_ZMIN_PROBE) SET_INPUT_PULLUP(Z_MIN_PROBE_PIN); #elif ENABLED(ENDSTOPPULLDOWN_ZMIN_PROBE) @@ -276,46 +201,66 @@ void Endstops::init() { #endif #endif - TERN_(ENDSTOP_INTERRUPTS_FEATURE, setup_endstop_interrupts()); + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + setup_endstop_interrupts(); + #endif // Enable endstops - enable_globally(ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)); + enable_globally( + #if ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT) + true + #else + false + #endif + ); } // Endstops::init // Called at ~1KHz from Temperature ISR: Poll endstop state if required void Endstops::poll() { - TERN_(PINS_DEBUGGING, run_monitor()); // Report changes in endstop status + #if ENABLED(PINS_DEBUGGING) + run_monitor(); // report changes in endstop status + #endif - #if DISABLED(ENDSTOP_INTERRUPTS_FEATURE) - update(); - #elif ENDSTOP_NOISE_THRESHOLD + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) && ENABLED(ENDSTOP_NOISE_FILTER) if (endstop_poll_count) update(); + #elif DISABLED(ENDSTOP_INTERRUPTS_FEATURE) || ENABLED(ENDSTOP_NOISE_FILTER) + update(); #endif } void Endstops::enable_globally(const bool onoff) { enabled_globally = enabled = onoff; - resync(); + + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + update(); + #endif } // Enable / disable endstop checking void Endstops::enable(const bool onoff) { enabled = onoff; - resync(); + + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + update(); + #endif } // Disable / Enable endstops based on ENSTOPS_ONLY_FOR_HOMING and global enable void Endstops::not_homing() { enabled = enabled_globally; + + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + update(); + #endif } #if ENABLED(VALIDATE_HOMING_ENDSTOPS) // If the last move failed to trigger an endstop, call kill void Endstops::validate_homing_move() { if (trigger_state()) hit_on_purpose(); - else kill(GET_TEXT(MSG_KILL_HOMING_FAILED)); + else kill(PSTR(MSG_ERR_HOMING_FAILED)); } #endif @@ -323,19 +268,13 @@ void Endstops::not_homing() { #if HAS_BED_PROBE void Endstops::enable_z_probe(const bool onoff) { z_probe_enabled = onoff; - resync(); + + #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + update(); + #endif } #endif -// Get the stable endstop states when enabled -void Endstops::resync() { - if (!abort_enabled()) return; // If endstops/probes are disabled the loop below can hang - - // Wait for Temperature ISR to run at least once (runs at 1KHz) - TERN(ENDSTOP_INTERRUPTS_FEATURE, update(), safe_delay(2)); - while (TERN0(ENDSTOP_NOISE_THRESHOLD, endstop_poll_count)) safe_delay(1); -} - #if ENABLED(PINS_DEBUGGING) void Endstops::run_monitor() { if (!monitor_flag) return; @@ -348,10 +287,8 @@ void Endstops::resync() { void Endstops::event_handler() { static uint8_t prev_hit_state; // = 0 - if (hit_state == prev_hit_state) return; - prev_hit_state = hit_state; - if (hit_state) { - #if HAS_WIRED_LCD + if (hit_state && hit_state != prev_hit_state) { + #if ENABLED(ULTRA_LCD) char chrX = ' ', chrY = ' ', chrZ = ' ', chrP = ' '; #define _SET_STOP_CHAR(A,C) (chr## A = C) #else @@ -371,41 +308,39 @@ void Endstops::event_handler() { #define ENDSTOP_HIT_TEST_Z() _ENDSTOP_HIT_TEST(Z,'Z') SERIAL_ECHO_START(); - SERIAL_ECHOPGM(STR_ENDSTOPS_HIT); + SERIAL_ECHOPGM(MSG_ENDSTOPS_HIT); ENDSTOP_HIT_TEST_X(); ENDSTOP_HIT_TEST_Y(); ENDSTOP_HIT_TEST_Z(); - #if HAS_CUSTOM_PROBE_PIN + #if ENABLED(Z_MIN_PROBE_ENDSTOP) #define P_AXIS Z_AXIS if (TEST(hit_state, Z_MIN_PROBE)) _ENDSTOP_HIT_ECHO(P, 'P'); #endif SERIAL_EOL(); - TERN_(HAS_WIRED_LCD, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP)); + #if ENABLED(ULTRA_LCD) + lcd_status_printf_P(0, PSTR(MSG_LCD_ENDSTOPS " %c %c %c %c"), chrX, chrY, chrZ, chrP); + #endif - #if BOTH(SD_ABORT_ON_ENDSTOP_HIT, SDSUPPORT) + #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) && ENABLED(SDSUPPORT) if (planner.abort_on_endstop_hit) { - card.endFilePrint(); + card.sdprinting = false; + card.closefile(); quickstop_stepper(); - thermalManager.disable_all_heaters(); - print_job_timer.stop(); + thermalManager.disable_all_heaters(); // switch off all heaters. } #endif } -} + prev_hit_state = hit_state; +} // Endstops::report_state -static void print_es_state(const bool is_hit, PGM_P const label=nullptr) { - if (label) serialprintPGM(label); - SERIAL_ECHOPGM(": "); - serialprintPGM(is_hit ? PSTR(STR_ENDSTOP_HIT) : PSTR(STR_ENDSTOP_OPEN)); - SERIAL_EOL(); -} - -void _O2 Endstops::report_states() { - TERN_(BLTOUCH, bltouch._set_SW_mode()); - SERIAL_ECHOLNPGM(STR_M119_REPORT); - #define ES_REPORT(S) print_es_state(READ(S##_PIN) != S##_ENDSTOP_INVERTING, PSTR(STR_##S)) +void Endstops::M119() { + SERIAL_PROTOCOLLNPGM(MSG_M119_REPORT); + #define ES_REPORT(AXIS) do{ \ + SERIAL_PROTOCOLPGM(MSG_##AXIS); \ + SERIAL_PROTOCOLLN(((READ(AXIS##_PIN)^AXIS##_ENDSTOP_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); \ + }while(0) #if HAS_X_MIN ES_REPORT(X_MIN); #endif @@ -436,50 +371,21 @@ void _O2 Endstops::report_states() { #if HAS_Z2_MIN ES_REPORT(Z2_MIN); #endif - #if HAS_Z3_MIN - ES_REPORT(Z3_MIN); - #endif - #if HAS_Z4_MIN - ES_REPORT(Z4_MIN); - #endif #if HAS_Z_MAX ES_REPORT(Z_MAX); #endif #if HAS_Z2_MAX ES_REPORT(Z2_MAX); #endif - #if HAS_Z3_MAX - ES_REPORT(Z3_MAX); + #if ENABLED(Z_MIN_PROBE_ENDSTOP) + SERIAL_PROTOCOLPGM(MSG_Z_PROBE); + SERIAL_PROTOCOLLN(((READ(Z_MIN_PROBE_PIN)^Z_MIN_PROBE_ENDSTOP_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); #endif - #if HAS_Z4_MAX - ES_REPORT(Z4_MAX); + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + SERIAL_PROTOCOLPGM(MSG_FILAMENT_RUNOUT_SENSOR); + SERIAL_PROTOCOLLN(((READ(FIL_RUNOUT_PIN)^FIL_RUNOUT_INVERTING) ? MSG_ENDSTOP_HIT : MSG_ENDSTOP_OPEN)); #endif - #if HAS_CUSTOM_PROBE_PIN - print_es_state(READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING, PSTR(STR_Z_PROBE)); - #endif - #if HAS_FILAMENT_SENSOR - #if NUM_RUNOUT_SENSORS == 1 - print_es_state(READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); - #else - #define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; break; - LOOP_S_LE_N(i, 1, NUM_RUNOUT_SENSORS) { - pin_t pin; - switch (i) { - default: continue; - REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _CASE_RUNOUT) - } - SERIAL_ECHOPGM(STR_FILAMENT_RUNOUT_SENSOR); - if (i > 1) SERIAL_CHAR(' ', '0' + i); - print_es_state(extDigitalRead(pin) != FIL_RUNOUT_STATE); - } - #undef _CASE_RUNOUT - #endif - #endif - - TERN_(BLTOUCH, bltouch._reset_SW_mode()); - TERN_(JOYSTICK_DEBUG, joystick.report()); - -} // Endstops::report_states +} // Endstops::M119 // The following routines are called from an ISR context. It could be the temperature ISR, the // endstop ISR or the Stepper ISR. @@ -491,35 +397,35 @@ void _O2 Endstops::report_states() { // Check endstops - Could be called from Temperature ISR! void Endstops::update() { - #if !ENDSTOP_NOISE_THRESHOLD + #if DISABLED(ENDSTOP_NOISE_FILTER) if (!abort_enabled()) return; #endif #define UPDATE_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT_TO(live_state, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX))) #define COPY_LIVE_STATE(SRC_BIT, DST_BIT) SET_BIT_TO(live_state, DST_BIT, TEST(live_state, SRC_BIT)) - #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && NONE(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) + #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) // If G38 command is active check Z_MIN_PROBE for ALL movement if (G38_move) UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); #endif // With Dual X, endstops are only checked in the homing direction for the active extruder #if ENABLED(DUAL_X_CARRIAGE) - #define E0_ACTIVE stepper.last_moved_extruder == 0 - #define X_MIN_TEST() ((X_HOME_DIR < 0 && E0_ACTIVE) || (X2_HOME_DIR < 0 && !E0_ACTIVE)) - #define X_MAX_TEST() ((X_HOME_DIR > 0 && E0_ACTIVE) || (X2_HOME_DIR > 0 && !E0_ACTIVE)) + #define E0_ACTIVE stepper.movement_extruder() == 0 + #define X_MIN_TEST ((X_HOME_DIR < 0 && E0_ACTIVE) || (X2_HOME_DIR < 0 && !E0_ACTIVE)) + #define X_MAX_TEST ((X_HOME_DIR > 0 && E0_ACTIVE) || (X2_HOME_DIR > 0 && !E0_ACTIVE)) #else - #define X_MIN_TEST() true - #define X_MAX_TEST() true + #define X_MIN_TEST true + #define X_MAX_TEST true #endif // Use HEAD for core axes, AXIS for others - #if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) + #if CORE_IS_XY || CORE_IS_XZ #define X_AXIS_HEAD X_HEAD #else #define X_AXIS_HEAD X_AXIS #endif - #if ANY(CORE_IS_XY, CORE_IS_YZ, MARKFORGED_XY) + #if CORE_IS_XY || CORE_IS_YZ #define Y_AXIS_HEAD Y_HEAD #else #define Y_AXIS_HEAD Y_AXIS @@ -533,111 +439,94 @@ void Endstops::update() { /** * Check and update endstops */ - #if HAS_X_MIN && !X_SPI_SENSORLESS - UPDATE_ENDSTOP_BIT(X, MIN); + #if HAS_X_MIN #if ENABLED(X_DUAL_ENDSTOPS) + UPDATE_ENDSTOP_BIT(X, MIN); #if HAS_X2_MIN UPDATE_ENDSTOP_BIT(X2, MIN); #else COPY_LIVE_STATE(X_MIN, X2_MIN); #endif + #else + UPDATE_ENDSTOP_BIT(X, MIN); #endif #endif - #if HAS_X_MAX && !X_SPI_SENSORLESS - UPDATE_ENDSTOP_BIT(X, MAX); + #if HAS_X_MAX #if ENABLED(X_DUAL_ENDSTOPS) + UPDATE_ENDSTOP_BIT(X, MAX); #if HAS_X2_MAX UPDATE_ENDSTOP_BIT(X2, MAX); #else COPY_LIVE_STATE(X_MAX, X2_MAX); #endif + #else + UPDATE_ENDSTOP_BIT(X, MAX); #endif #endif - #if HAS_Y_MIN && !Y_SPI_SENSORLESS - UPDATE_ENDSTOP_BIT(Y, MIN); + #if HAS_Y_MIN #if ENABLED(Y_DUAL_ENDSTOPS) + UPDATE_ENDSTOP_BIT(Y, MIN); #if HAS_Y2_MIN UPDATE_ENDSTOP_BIT(Y2, MIN); #else COPY_LIVE_STATE(Y_MIN, Y2_MIN); #endif + #else + UPDATE_ENDSTOP_BIT(Y, MIN); #endif #endif - #if HAS_Y_MAX && !Y_SPI_SENSORLESS - UPDATE_ENDSTOP_BIT(Y, MAX); + #if HAS_Y_MAX #if ENABLED(Y_DUAL_ENDSTOPS) + UPDATE_ENDSTOP_BIT(Y, MAX); #if HAS_Y2_MAX UPDATE_ENDSTOP_BIT(Y2, MAX); #else COPY_LIVE_STATE(Y_MAX, Y2_MAX); #endif + #else + UPDATE_ENDSTOP_BIT(Y, MAX); #endif #endif - #if HAS_Z_MIN && !Z_SPI_SENSORLESS - UPDATE_ENDSTOP_BIT(Z, MIN); - #if ENABLED(Z_MULTI_ENDSTOPS) + #if HAS_Z_MIN + #if ENABLED(Z_DUAL_ENDSTOPS) + UPDATE_ENDSTOP_BIT(Z, MIN); #if HAS_Z2_MIN UPDATE_ENDSTOP_BIT(Z2, MIN); #else COPY_LIVE_STATE(Z_MIN, Z2_MIN); #endif - #if NUM_Z_STEPPER_DRIVERS >= 3 - #if HAS_Z3_MIN - UPDATE_ENDSTOP_BIT(Z3, MIN); - #else - COPY_LIVE_STATE(Z_MIN, Z3_MIN); - #endif - #endif - #if NUM_Z_STEPPER_DRIVERS >= 4 - #if HAS_Z4_MIN - UPDATE_ENDSTOP_BIT(Z4, MIN); - #else - COPY_LIVE_STATE(Z_MIN, Z4_MIN); - #endif - #endif + #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + UPDATE_ENDSTOP_BIT(Z, MIN); + #elif Z_HOME_DIR < 0 + UPDATE_ENDSTOP_BIT(Z, MIN); #endif #endif // When closing the gap check the enabled probe - #if HAS_CUSTOM_PROBE_PIN + #if ENABLED(Z_MIN_PROBE_ENDSTOP) UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); #endif - #if HAS_Z_MAX && !Z_SPI_SENSORLESS + #if HAS_Z_MAX // Check both Z dual endstops - #if ENABLED(Z_MULTI_ENDSTOPS) + #if ENABLED(Z_DUAL_ENDSTOPS) UPDATE_ENDSTOP_BIT(Z, MAX); #if HAS_Z2_MAX UPDATE_ENDSTOP_BIT(Z2, MAX); #else COPY_LIVE_STATE(Z_MAX, Z2_MAX); #endif - #if NUM_Z_STEPPER_DRIVERS >= 3 - #if HAS_Z3_MAX - UPDATE_ENDSTOP_BIT(Z3, MAX); - #else - COPY_LIVE_STATE(Z_MAX, Z3_MAX); - #endif - #endif - #if NUM_Z_STEPPER_DRIVERS >= 4 - #if HAS_Z4_MAX - UPDATE_ENDSTOP_BIT(Z4, MAX); - #else - COPY_LIVE_STATE(Z_MAX, Z4_MAX); - #endif - #endif - #elif !HAS_CUSTOM_PROBE_PIN || Z_MAX_PIN != Z_MIN_PROBE_PIN + #elif DISABLED(Z_MIN_PROBE_ENDSTOP) || Z_MAX_PIN != Z_MIN_PROBE_PIN // If this pin isn't the bed probe it's the Z endstop UPDATE_ENDSTOP_BIT(Z, MAX); #endif #endif - #if ENDSTOP_NOISE_THRESHOLD - + #if ENABLED(ENDSTOP_NOISE_FILTER) /** * Filtering out noise on endstops requires a delayed decision. Let's assume, due to noise, * that 50% of endstop signal samples are good and 50% are bad (assuming normal distribution @@ -650,7 +539,7 @@ void Endstops::update() { */ static esbits_t old_live_state; if (old_live_state != live_state) { - endstop_poll_count = ENDSTOP_NOISE_THRESHOLD; + endstop_poll_count = 7; old_live_state = live_state; } else if (endstop_poll_count && !--endstop_poll_count) @@ -667,118 +556,53 @@ void Endstops::update() { #define _ENDSTOP_HIT(AXIS, MINMAX) SBI(hit_state, _ENDSTOP(AXIS, MINMAX)) // Call the endstop triggered routine for single endstops - #define PROCESS_ENDSTOP(AXIS, MINMAX) do { \ + #define PROCESS_ENDSTOP(AXIS,MINMAX) do { \ if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX))) { \ _ENDSTOP_HIT(AXIS, MINMAX); \ planner.endstop_triggered(_AXIS(AXIS)); \ } \ }while(0) - // Core Sensorless Homing needs to test an Extra Pin - #define CORE_DIAG(QQ,A,MM) (CORE_IS_##QQ && A##_SENSORLESS && !A##_SPI_SENSORLESS && HAS_##A##_##MM) - #define PROCESS_CORE_ENDSTOP(A1,M1,A2,M2) do { \ - if (TEST_ENDSTOP(_ENDSTOP(A1,M1))) { \ - _ENDSTOP_HIT(A2,M2); \ - planner.endstop_triggered(_AXIS(A2)); \ - } \ - }while(0) - // Call the endstop triggered routine for dual endstops - #define PROCESS_DUAL_ENDSTOP(A, MINMAX) do { \ - const byte dual_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1); \ + #define PROCESS_DUAL_ENDSTOP(AXIS1, AXIS2, MINMAX) do { \ + const byte dual_hit = TEST_ENDSTOP(_ENDSTOP(AXIS1, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(AXIS2, MINMAX)) << 1); \ if (dual_hit) { \ - _ENDSTOP_HIT(A, MINMAX); \ + _ENDSTOP_HIT(AXIS1, MINMAX); \ /* if not performing home or if both endstops were trigged during homing... */ \ - if (!stepper.separate_multi_axis || dual_hit == 0b11) \ - planner.endstop_triggered(_AXIS(A)); \ + if (!stepper.homing_dual_axis || dual_hit == 0b11) \ + planner.endstop_triggered(_AXIS(AXIS1)); \ } \ }while(0) - #define PROCESS_TRIPLE_ENDSTOP(A, MINMAX) do { \ - const byte triple_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1) | (TEST_ENDSTOP(_ENDSTOP(A##3, MINMAX)) << 2); \ - if (triple_hit) { \ - _ENDSTOP_HIT(A, MINMAX); \ - /* if not performing home or if both endstops were trigged during homing... */ \ - if (!stepper.separate_multi_axis || triple_hit == 0b111) \ - planner.endstop_triggered(_AXIS(A)); \ - } \ - }while(0) - - #define PROCESS_QUAD_ENDSTOP(A, MINMAX) do { \ - const byte quad_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1) | (TEST_ENDSTOP(_ENDSTOP(A##3, MINMAX)) << 2) | (TEST_ENDSTOP(_ENDSTOP(A##4, MINMAX)) << 3); \ - if (quad_hit) { \ - _ENDSTOP_HIT(A, MINMAX); \ - /* if not performing home or if both endstops were trigged during homing... */ \ - if (!stepper.separate_multi_axis || quad_hit == 0b1111) \ - planner.endstop_triggered(_AXIS(A)); \ - } \ - }while(0) - - #if ENABLED(X_DUAL_ENDSTOPS) - #define PROCESS_ENDSTOP_X(MINMAX) PROCESS_DUAL_ENDSTOP(X, MINMAX) - #else - #define PROCESS_ENDSTOP_X(MINMAX) if (X_##MINMAX##_TEST()) PROCESS_ENDSTOP(X, MINMAX) - #endif - - #if ENABLED(Y_DUAL_ENDSTOPS) - #define PROCESS_ENDSTOP_Y(MINMAX) PROCESS_DUAL_ENDSTOP(Y, MINMAX) - #else - #define PROCESS_ENDSTOP_Y(MINMAX) PROCESS_ENDSTOP(Y, MINMAX) - #endif - - #if DISABLED(Z_MULTI_ENDSTOPS) - #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_ENDSTOP(Z, MINMAX) - #elif NUM_Z_STEPPER_DRIVERS == 4 - #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_QUAD_ENDSTOP(Z, MINMAX) - #elif NUM_Z_STEPPER_DRIVERS == 3 - #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_TRIPLE_ENDSTOP(Z, MINMAX) - #else - #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_DUAL_ENDSTOP(Z, MINMAX) - #endif - - #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && NONE(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY) - #if ENABLED(G38_PROBE_AWAY) - #define _G38_OPEN_STATE (G38_move >= 4) - #else - #define _G38_OPEN_STATE LOW - #endif + #if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) // If G38 command is active check Z_MIN_PROBE for ALL movement - if (G38_move && TEST_ENDSTOP(_ENDSTOP(Z, MIN_PROBE)) != _G38_OPEN_STATE) { - if (stepper.axis_is_moving(X_AXIS)) { _ENDSTOP_HIT(X, MIN); planner.endstop_triggered(X_AXIS); } - else if (stepper.axis_is_moving(Y_AXIS)) { _ENDSTOP_HIT(Y, MIN); planner.endstop_triggered(Y_AXIS); } - else if (stepper.axis_is_moving(Z_AXIS)) { _ENDSTOP_HIT(Z, MIN); planner.endstop_triggered(Z_AXIS); } - G38_did_trigger = true; + if (G38_move) { + if (TEST_ENDSTOP(_ENDSTOP(Z, MIN_PROBE))) { + if (stepper.axis_is_moving(X_AXIS)) { _ENDSTOP_HIT(X, MIN); planner.endstop_triggered(X_AXIS); } + else if (stepper.axis_is_moving(Y_AXIS)) { _ENDSTOP_HIT(Y, MIN); planner.endstop_triggered(Y_AXIS); } + else if (stepper.axis_is_moving(Z_AXIS)) { _ENDSTOP_HIT(Z, MIN); planner.endstop_triggered(Z_AXIS); } + G38_endstop_hit = true; + } } #endif - // Signal, after validation, if an endstop limit is pressed or not - + // Now, we must signal, after validation, if an endstop limit is pressed or not if (stepper.axis_is_moving(X_AXIS)) { if (stepper.motor_direction(X_AXIS_HEAD)) { // -direction - #if HAS_X_MIN || (X_SPI_SENSORLESS && X_HOME_DIR < 0) - PROCESS_ENDSTOP_X(MIN); - #if CORE_DIAG(XY, Y, MIN) - PROCESS_CORE_ENDSTOP(Y,MIN,X,MIN); - #elif CORE_DIAG(XY, Y, MAX) - PROCESS_CORE_ENDSTOP(Y,MAX,X,MIN); - #elif CORE_DIAG(XZ, Z, MIN) - PROCESS_CORE_ENDSTOP(Z,MIN,X,MIN); - #elif CORE_DIAG(XZ, Z, MAX) - PROCESS_CORE_ENDSTOP(Z,MAX,X,MIN); + #if HAS_X_MIN + #if ENABLED(X_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(X, X2, MIN); + #else + if (X_MIN_TEST) PROCESS_ENDSTOP(X, MIN); #endif #endif } else { // +direction - #if HAS_X_MAX || (X_SPI_SENSORLESS && X_HOME_DIR > 0) - PROCESS_ENDSTOP_X(MAX); - #if CORE_DIAG(XY, Y, MIN) - PROCESS_CORE_ENDSTOP(Y,MIN,X,MAX); - #elif CORE_DIAG(XY, Y, MAX) - PROCESS_CORE_ENDSTOP(Y,MAX,X,MAX); - #elif CORE_DIAG(XZ, Z, MIN) - PROCESS_CORE_ENDSTOP(Z,MIN,X,MAX); - #elif CORE_DIAG(XZ, Z, MAX) - PROCESS_CORE_ENDSTOP(Z,MAX,X,MAX); + #if HAS_X_MAX + #if ENABLED(X_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(X, X2, MAX); + #else + if (X_MAX_TEST) PROCESS_ENDSTOP(X, MAX); #endif #endif } @@ -786,30 +610,20 @@ void Endstops::update() { if (stepper.axis_is_moving(Y_AXIS)) { if (stepper.motor_direction(Y_AXIS_HEAD)) { // -direction - #if HAS_Y_MIN || (Y_SPI_SENSORLESS && Y_HOME_DIR < 0) - PROCESS_ENDSTOP_Y(MIN); - #if CORE_DIAG(XY, X, MIN) - PROCESS_CORE_ENDSTOP(X,MIN,Y,MIN); - #elif CORE_DIAG(XY, X, MAX) - PROCESS_CORE_ENDSTOP(X,MAX,Y,MIN); - #elif CORE_DIAG(YZ, Z, MIN) - PROCESS_CORE_ENDSTOP(Z,MIN,Y,MIN); - #elif CORE_DIAG(YZ, Z, MAX) - PROCESS_CORE_ENDSTOP(Z,MAX,Y,MIN); + #if HAS_Y_MIN + #if ENABLED(Y_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(Y, Y2, MIN); + #else + PROCESS_ENDSTOP(Y, MIN); #endif #endif } else { // +direction - #if HAS_Y_MAX || (Y_SPI_SENSORLESS && Y_HOME_DIR > 0) - PROCESS_ENDSTOP_Y(MAX); - #if CORE_DIAG(XY, X, MIN) - PROCESS_CORE_ENDSTOP(X,MIN,Y,MAX); - #elif CORE_DIAG(XY, X, MAX) - PROCESS_CORE_ENDSTOP(X,MAX,Y,MAX); - #elif CORE_DIAG(YZ, Z, MIN) - PROCESS_CORE_ENDSTOP(Z,MIN,Y,MAX); - #elif CORE_DIAG(YZ, Z, MAX) - PROCESS_CORE_ENDSTOP(Z,MAX,Y,MAX); + #if HAS_Y_MAX + #if ENABLED(Y_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(Y, Y2, MAX); + #else + PROCESS_ENDSTOP(Y, MAX); #endif #endif } @@ -817,111 +631,52 @@ void Endstops::update() { if (stepper.axis_is_moving(Z_AXIS)) { if (stepper.motor_direction(Z_AXIS_HEAD)) { // Z -direction. Gantry down, bed up. - - #if HAS_Z_MIN || (Z_SPI_SENSORLESS && Z_HOME_DIR < 0) - if ( TERN1(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, z_probe_enabled) - && TERN1(HAS_CUSTOM_PROBE_PIN, !z_probe_enabled) - ) PROCESS_ENDSTOP_Z(MIN); - #if CORE_DIAG(XZ, X, MIN) - PROCESS_CORE_ENDSTOP(X,MIN,Z,MIN); - #elif CORE_DIAG(XZ, X, MAX) - PROCESS_CORE_ENDSTOP(X,MAX,Z,MIN); - #elif CORE_DIAG(YZ, Y, MIN) - PROCESS_CORE_ENDSTOP(Y,MIN,Z,MIN); - #elif CORE_DIAG(YZ, Y, MAX) - PROCESS_CORE_ENDSTOP(Y,MAX,Z,MIN); + #if HAS_Z_MIN + #if ENABLED(Z_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(Z, Z2, MIN); + #else + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + if (z_probe_enabled) PROCESS_ENDSTOP(Z, MIN); + #elif ENABLED(Z_MIN_PROBE_ENDSTOP) + if (!z_probe_enabled) PROCESS_ENDSTOP(Z, MIN); + #else + PROCESS_ENDSTOP(Z, MIN); + #endif #endif #endif // When closing the gap check the enabled probe - #if HAS_CUSTOM_PROBE_PIN + #if ENABLED(Z_MIN_PROBE_ENDSTOP) if (z_probe_enabled) PROCESS_ENDSTOP(Z, MIN_PROBE); #endif } else { // Z +direction. Gantry up, bed down. - #if HAS_Z_MAX || (Z_SPI_SENSORLESS && Z_HOME_DIR > 0) - #if ENABLED(Z_MULTI_ENDSTOPS) - PROCESS_ENDSTOP_Z(MAX); - #elif !HAS_CUSTOM_PROBE_PIN || Z_MAX_PIN != Z_MIN_PROBE_PIN // No probe or probe is Z_MIN || Probe is not Z_MAX + #if HAS_Z_MAX + #if ENABLED(Z_DUAL_ENDSTOPS) + PROCESS_DUAL_ENDSTOP(Z, Z2, MAX); + #elif DISABLED(Z_MIN_PROBE_ENDSTOP) || Z_MAX_PIN != Z_MIN_PROBE_PIN + // If this pin is not hijacked for the bed probe + // then it belongs to the Z endstop PROCESS_ENDSTOP(Z, MAX); #endif - #if CORE_DIAG(XZ, X, MIN) - PROCESS_CORE_ENDSTOP(X,MIN,Z,MAX); - #elif CORE_DIAG(XZ, X, MAX) - PROCESS_CORE_ENDSTOP(X,MAX,Z,MAX); - #elif CORE_DIAG(YZ, Y, MIN) - PROCESS_CORE_ENDSTOP(Y,MIN,Z,MAX); - #elif CORE_DIAG(YZ, Y, MAX) - PROCESS_CORE_ENDSTOP(Y,MAX,Z,MAX); - #endif #endif } } } // Endstops::update() -#if ENABLED(SPI_ENDSTOPS) - - bool Endstops::tmc_spi_homing_check() { - bool hit = false; - #if X_SPI_SENSORLESS - if (tmc_spi_homing.x && (stepperX.test_stall_status() - #if ANY(CORE_IS_XY, MARKFORGED_XY) && Y_SPI_SENSORLESS - || stepperY.test_stall_status() - #elif CORE_IS_XZ && Z_SPI_SENSORLESS - || stepperZ.test_stall_status() - #endif - )) { - SBI(live_state, X_ENDSTOP); - hit = true; - } - #endif - #if Y_SPI_SENSORLESS - if (tmc_spi_homing.y && (stepperY.test_stall_status() - #if ANY(CORE_IS_XY, MARKFORGED_XY) && X_SPI_SENSORLESS - || stepperX.test_stall_status() - #elif CORE_IS_YZ && Z_SPI_SENSORLESS - || stepperZ.test_stall_status() - #endif - )) { - SBI(live_state, Y_ENDSTOP); - hit = true; - } - #endif - #if Z_SPI_SENSORLESS - if (tmc_spi_homing.z && (stepperZ.test_stall_status() - #if CORE_IS_XZ && X_SPI_SENSORLESS - || stepperX.test_stall_status() - #elif CORE_IS_YZ && Y_SPI_SENSORLESS - || stepperY.test_stall_status() - #endif - )) { - SBI(live_state, Z_ENDSTOP); - hit = true; - } - #endif - return hit; - } - - void Endstops::clear_endstop_state() { - TERN_(X_SPI_SENSORLESS, CBI(live_state, X_ENDSTOP)); - TERN_(Y_SPI_SENSORLESS, CBI(live_state, Y_ENDSTOP)); - TERN_(Z_SPI_SENSORLESS, CBI(live_state, Z_ENDSTOP)); - } - -#endif // SPI_ENDSTOPS - #if ENABLED(PINS_DEBUGGING) bool Endstops::monitor_flag = false; /** - * Monitor Endstops and Z Probe for changes + * monitors endstops & Z probe for changes * * If a change is detected then the LED is toggled and - * a message is sent out the serial port. + * a message is sent out the serial port * * Yes, we could miss a rapid back & forth change but * that won't matter because this is all manual. + * */ void Endstops::monitor() { @@ -929,117 +684,90 @@ void Endstops::update() { static uint8_t local_LED_status = 0; uint16_t live_state_local = 0; - #define ES_GET_STATE(S) if (READ(S##_PIN)) SBI(live_state_local, S) - #if HAS_X_MIN - ES_GET_STATE(X_MIN); + if (READ(X_MIN_PIN)) SBI(live_state_local, X_MIN); #endif #if HAS_X_MAX - ES_GET_STATE(X_MAX); + if (READ(X_MAX_PIN)) SBI(live_state_local, X_MAX); #endif #if HAS_Y_MIN - ES_GET_STATE(Y_MIN); + if (READ(Y_MIN_PIN)) SBI(live_state_local, Y_MIN); #endif #if HAS_Y_MAX - ES_GET_STATE(Y_MAX); + if (READ(Y_MAX_PIN)) SBI(live_state_local, Y_MAX); #endif #if HAS_Z_MIN - ES_GET_STATE(Z_MIN); + if (READ(Z_MIN_PIN)) SBI(live_state_local, Z_MIN); #endif #if HAS_Z_MAX - ES_GET_STATE(Z_MAX); + if (READ(Z_MAX_PIN)) SBI(live_state_local, Z_MAX); #endif #if HAS_Z_MIN_PROBE_PIN - ES_GET_STATE(Z_MIN_PROBE); + if (READ(Z_MIN_PROBE_PIN)) SBI(live_state_local, Z_MIN_PROBE); #endif #if HAS_X2_MIN - ES_GET_STATE(X2_MIN); + if (READ(X2_MIN_PIN)) SBI(live_state_local, X2_MIN); #endif #if HAS_X2_MAX - ES_GET_STATE(X2_MAX); + if (READ(X2_MAX_PIN)) SBI(live_state_local, X2_MAX); #endif #if HAS_Y2_MIN - ES_GET_STATE(Y2_MIN); + if (READ(Y2_MIN_PIN)) SBI(live_state_local, Y2_MIN); #endif #if HAS_Y2_MAX - ES_GET_STATE(Y2_MAX); + if (READ(Y2_MAX_PIN)) SBI(live_state_local, Y2_MAX); #endif #if HAS_Z2_MIN - ES_GET_STATE(Z2_MIN); + if (READ(Z2_MIN_PIN)) SBI(live_state_local, Z2_MIN); #endif #if HAS_Z2_MAX - ES_GET_STATE(Z2_MAX); - #endif - #if HAS_Z3_MIN - ES_GET_STATE(Z3_MIN); - #endif - #if HAS_Z3_MAX - ES_GET_STATE(Z3_MAX); - #endif - #if HAS_Z4_MIN - ES_GET_STATE(Z4_MIN); - #endif - #if HAS_Z4_MAX - ES_GET_STATE(Z4_MAX); + if (READ(Z2_MAX_PIN)) SBI(live_state_local, Z2_MAX); #endif uint16_t endstop_change = live_state_local ^ old_live_state_local; - #define ES_REPORT_CHANGE(S) if (TEST(endstop_change, S)) SERIAL_ECHOPAIR(" " STRINGIFY(S) ":", TEST(live_state_local, S)) if (endstop_change) { #if HAS_X_MIN - ES_REPORT_CHANGE(X_MIN); + if (TEST(endstop_change, X_MIN)) SERIAL_PROTOCOLPAIR(" X_MIN:", TEST(live_state_local, X_MIN)); #endif #if HAS_X_MAX - ES_REPORT_CHANGE(X_MAX); + if (TEST(endstop_change, X_MAX)) SERIAL_PROTOCOLPAIR(" X_MAX:", TEST(live_state_local, X_MAX)); #endif #if HAS_Y_MIN - ES_REPORT_CHANGE(Y_MIN); + if (TEST(endstop_change, Y_MIN)) SERIAL_PROTOCOLPAIR(" Y_MIN:", TEST(live_state_local, Y_MIN)); #endif #if HAS_Y_MAX - ES_REPORT_CHANGE(Y_MAX); + if (TEST(endstop_change, Y_MAX)) SERIAL_PROTOCOLPAIR(" Y_MAX:", TEST(live_state_local, Y_MAX)); #endif #if HAS_Z_MIN - ES_REPORT_CHANGE(Z_MIN); + if (TEST(endstop_change, Z_MIN)) SERIAL_PROTOCOLPAIR(" Z_MIN:", TEST(live_state_local, Z_MIN)); #endif #if HAS_Z_MAX - ES_REPORT_CHANGE(Z_MAX); + if (TEST(endstop_change, Z_MAX)) SERIAL_PROTOCOLPAIR(" Z_MAX:", TEST(live_state_local, Z_MAX)); #endif #if HAS_Z_MIN_PROBE_PIN - ES_REPORT_CHANGE(Z_MIN_PROBE); + if (TEST(endstop_change, Z_MIN_PROBE)) SERIAL_PROTOCOLPAIR(" PROBE:", TEST(live_state_local, Z_MIN_PROBE)); #endif #if HAS_X2_MIN - ES_REPORT_CHANGE(X2_MIN); + if (TEST(endstop_change, X2_MIN)) SERIAL_PROTOCOLPAIR(" X2_MIN:", TEST(live_state_local, X2_MIN)); #endif #if HAS_X2_MAX - ES_REPORT_CHANGE(X2_MAX); + if (TEST(endstop_change, X2_MAX)) SERIAL_PROTOCOLPAIR(" X2_MAX:", TEST(live_state_local, X2_MAX)); #endif #if HAS_Y2_MIN - ES_REPORT_CHANGE(Y2_MIN); + if (TEST(endstop_change, Y2_MIN)) SERIAL_PROTOCOLPAIR(" Y2_MIN:", TEST(live_state_local, Y2_MIN)); #endif #if HAS_Y2_MAX - ES_REPORT_CHANGE(Y2_MAX); + if (TEST(endstop_change, Y2_MAX)) SERIAL_PROTOCOLPAIR(" Y2_MAX:", TEST(live_state_local, Y2_MAX)); #endif #if HAS_Z2_MIN - ES_REPORT_CHANGE(Z2_MIN); + if (TEST(endstop_change, Z2_MIN)) SERIAL_PROTOCOLPAIR(" Z2_MIN:", TEST(live_state_local, Z2_MIN)); #endif #if HAS_Z2_MAX - ES_REPORT_CHANGE(Z2_MAX); + if (TEST(endstop_change, Z2_MAX)) SERIAL_PROTOCOLPAIR(" Z2_MAX:", TEST(live_state_local, Z2_MAX)); #endif - #if HAS_Z3_MIN - ES_REPORT_CHANGE(Z3_MIN); - #endif - #if HAS_Z3_MAX - ES_REPORT_CHANGE(Z3_MAX); - #endif - #if HAS_Z4_MIN - ES_REPORT_CHANGE(Z4_MIN); - #endif - #if HAS_Z4_MAX - ES_REPORT_CHANGE(Z4_MAX); - #endif - SERIAL_ECHOLNPGM("\n"); - analogWrite(pin_t(LED_PIN), local_LED_status); + SERIAL_PROTOCOLPGM("\n\n"); + analogWrite(LED_PIN, local_LED_status); local_LED_status ^= 255; old_live_state_local = live_state_local; } diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index 888d25a8bd..8e10579de0 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,55 +16,64 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * endstops.h - manages endstops */ +#ifndef __ENDSTOPS_H__ +#define __ENDSTOPS_H__ + #include "../inc/MarlinConfig.h" #include +#define VALIDATE_HOMING_ENDSTOPS + enum EndstopEnum : char { - X_MIN, Y_MIN, Z_MIN, Z_MIN_PROBE, - X_MAX, Y_MAX, Z_MAX, - X2_MIN, X2_MAX, - Y2_MIN, Y2_MAX, - Z2_MIN, Z2_MAX, - Z3_MIN, Z3_MAX, - Z4_MIN, Z4_MAX + X_MIN, + Y_MIN, + Z_MIN, + Z_MIN_PROBE, + X_MAX, + Y_MAX, + Z_MAX, + X2_MIN, + X2_MAX, + Y2_MIN, + Y2_MAX, + Z2_MIN, + Z2_MAX }; -#define X_ENDSTOP (X_HOME_DIR < 0 ? X_MIN : X_MAX) -#define Y_ENDSTOP (Y_HOME_DIR < 0 ? Y_MIN : Y_MAX) -#define Z_ENDSTOP (Z_HOME_DIR < 0 ? TERN(HOMING_Z_WITH_PROBE, Z_MIN, Z_MIN_PROBE) : Z_MAX) - class Endstops { + public: - #if HAS_EXTRA_ENDSTOPS + + static bool enabled, enabled_globally; + + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) typedef uint16_t esbits_t; - TERN_(X_DUAL_ENDSTOPS, static float x2_endstop_adj); - TERN_(Y_DUAL_ENDSTOPS, static float y2_endstop_adj); - TERN_(Z_MULTI_ENDSTOPS, static float z2_endstop_adj); - #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 - static float z3_endstop_adj; + #if ENABLED(X_DUAL_ENDSTOPS) + static float x_endstop_adj; #endif - #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 - static float z4_endstop_adj; + #if ENABLED(Y_DUAL_ENDSTOPS) + static float y_endstop_adj; + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + static float z_endstop_adj; #endif #else typedef uint8_t esbits_t; #endif private: - static bool enabled, enabled_globally; static esbits_t live_state; static volatile uint8_t hit_state; // Use X_MIN, Y_MIN, Z_MIN and Z_MIN_PROBE as BIT index - #if ENDSTOP_NOISE_THRESHOLD + #if ENABLED(ENDSTOP_NOISE_FILTER) static esbits_t validated_live_state; static uint8_t endstop_poll_count; // Countdown from threshold for polling #endif @@ -81,11 +90,13 @@ class Endstops { * Are endstops or the probe set to abort the move? */ FORCE_INLINE static bool abort_enabled() { - return enabled || TERN0(HAS_BED_PROBE, z_probe_enabled); + return (enabled + #if HAS_BED_PROBE + || z_probe_enabled + #endif + ); } - static inline bool global_enabled() { return enabled_globally; } - /** * Periodic call to poll endstops if required. Called from temperature ISR */ @@ -108,7 +119,7 @@ class Endstops { */ FORCE_INLINE static esbits_t state() { return - #if ENDSTOP_NOISE_THRESHOLD + #if ENABLED(ENDSTOP_NOISE_FILTER) validated_live_state #else live_state @@ -122,9 +133,9 @@ class Endstops { static void event_handler(); /** - * Report endstop states in response to M119 + * Report endstop positions in response to M119 */ - static void report_states(); + static void M119(); // Enable / disable endstop checking globally static void enable_globally(const bool onoff=true); @@ -151,40 +162,14 @@ class Endstops { static void enable_z_probe(const bool onoff=true); #endif - static void resync(); - // Debugging of endstops #if ENABLED(PINS_DEBUGGING) static bool monitor_flag; static void monitor(); static void run_monitor(); #endif - - #if ENABLED(SPI_ENDSTOPS) - typedef struct { - union { - bool any; - struct { bool x:1, y:1, z:1; }; - }; - } tmc_spi_homing_t; - static tmc_spi_homing_t tmc_spi_homing; - static void clear_endstop_state(); - static bool tmc_spi_homing_check(); - #endif }; extern Endstops endstops; -/** - * A class to save and change the endstop state, - * then restore it when it goes out of scope. - */ -class TemporaryGlobalEndstopsState { - bool saved; - - public: - TemporaryGlobalEndstopsState(const bool enable) : saved(endstops.global_enabled()) { - endstops.enable_globally(enable); - } - ~TemporaryGlobalEndstopsState() { endstops.enable_globally(saved); } -}; +#endif // __ENDSTOPS_H__ diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 5b3fab10b1..9c15d065a0 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -47,18 +47,10 @@ #include "../feature/bedlevel/bedlevel.h" #endif -#if ENABLED(BLTOUCH) - #include "../feature/bltouch.h" -#endif - -#if HAS_DISPLAY +#if HAS_AXIS_UNHOMED_ERR && ENABLED(ULTRA_LCD) #include "../lcd/ultralcd.h" #endif -#if HAS_FILAMENT_SENSOR - #include "../feature/runout.h" -#endif - #if ENABLED(SENSORLESS_HOMING) #include "../feature/tmc_util.h" #endif @@ -67,23 +59,14 @@ #include "../feature/fwretract.h" #endif -#if ENABLED(BABYSTEP_DISPLAY_TOTAL) - #include "../feature/babystep.h" -#endif +#define XYZ_CONSTS(type, array, CONFIG) const PROGMEM type array##_P[XYZ] = { X_##CONFIG, Y_##CONFIG, Z_##CONFIG } -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../core/debug_out.h" - -/** - * axis_homed - * Flags that each linear axis was homed. - * XYZ on cartesian, ABC on delta, ABZ on SCARA. - * - * axis_known_position - * Flags that the position is known in each linear axis. Set when homed. - * Cleared whenever a stepper powers off, potentially losing its position. - */ -uint8_t axis_homed, axis_known_position; // = 0 +XYZ_CONSTS(float, base_min_pos, MIN_POS); +XYZ_CONSTS(float, base_max_pos, MAX_POS); +XYZ_CONSTS(float, base_home_pos, HOME_POS); +XYZ_CONSTS(float, max_length, MAX_LENGTH); +XYZ_CONSTS(float, home_bump_mm, HOME_BUMP_MM); +XYZ_CONSTS(signed char, home_dir, HOME_DIR); // Relative Mode. Enable with G91, disable with G90. bool relative_mode; // = false; @@ -91,158 +74,96 @@ bool relative_mode; // = false; /** * Cartesian Current Position * Used to track the native machine position as moves are queued. - * Used by 'line_to_current_position' to do a move after changing it. - * Used by 'sync_plan_position' to update 'planner.position'. + * Used by 'buffer_line_to_current_position' to do a move after changing it. + * Used by 'SYNC_PLAN_POSITION_KINEMATIC' to update 'planner.position'. */ -xyze_pos_t current_position = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; +float current_position[XYZE] = { 0 }; /** * Cartesian Destination * The destination for a move, filled in by G-code movement commands, - * and expected by functions like 'prepare_line_to_destination'. - * G-codes can set destination using 'get_destination_from_command' + * and expected by functions like 'prepare_move_to_destination'. + * Set with 'get_destination_from_command' or 'set_destination_from_current'. */ -xyze_pos_t destination; // {0} +float destination[XYZE] = { 0 }; -// G60/G61 Position Save and Return -#if SAVED_POSITIONS - uint8_t saved_slots[(SAVED_POSITIONS + 7) >> 3]; - xyz_pos_t stored_position[SAVED_POSITIONS]; -#endif // The active extruder (tool). Set with T command. -#if HAS_MULTI_EXTRUDER - uint8_t active_extruder = 0; // = 0 -#endif - -#if ENABLED(LCD_SHOW_E_TOTAL) - float e_move_accumulator; // = 0 -#endif +uint8_t active_extruder; // = 0; // Extruder offsets #if HAS_HOTEND_OFFSET - xyz_pos_t hotend_offset[HOTENDS]; // Initialized by settings.load() - void reset_hotend_offsets() { - constexpr float tmp[XYZ][HOTENDS] = { HOTEND_OFFSET_X, HOTEND_OFFSET_Y, HOTEND_OFFSET_Z }; - static_assert( - !tmp[X_AXIS][0] && !tmp[Y_AXIS][0] && !tmp[Z_AXIS][0], - "Offsets for the first hotend must be 0.0." - ); - // Transpose from [XYZ][HOTENDS] to [HOTENDS][XYZ] - HOTEND_LOOP() LOOP_XYZ(a) hotend_offset[e][a] = tmp[a][e]; - #if ENABLED(DUAL_X_CARRIAGE) - hotend_offset[1].x = _MAX(X2_HOME_POS, X2_MAX_POS); - #endif - } + float hotend_offset[XYZ][HOTENDS]; // Initialized by settings.load() #endif // The feedrate for the current move, often used as the default if // no other feedrate is specified. Overridden for special moves. // Set by the last G0 through G5 command's "F" parameter. // Functions that override this for custom moves *must always* restore it! -feedRate_t feedrate_mm_s = MMM_TO_MMS(1500); +float feedrate_mm_s = MMM_TO_MMS(1500.0f); + int16_t feedrate_percentage = 100; // Homing feedrate is const progmem - compare to constexpr in the header -const feedRate_t homing_feedrate_mm_s[XYZ] PROGMEM = { +const float homing_feedrate_mm_s[4] PROGMEM = { #if ENABLED(DELTA) MMM_TO_MMS(HOMING_FEEDRATE_Z), MMM_TO_MMS(HOMING_FEEDRATE_Z), #else MMM_TO_MMS(HOMING_FEEDRATE_XY), MMM_TO_MMS(HOMING_FEEDRATE_XY), #endif - MMM_TO_MMS(HOMING_FEEDRATE_Z) + MMM_TO_MMS(HOMING_FEEDRATE_Z), 0 }; // Cartesian conversion result goes here: -xyz_pos_t cartes; +float cartes[XYZ]; +// Until kinematics.cpp is created, create this here #if IS_KINEMATIC - - abc_pos_t delta; - - #if HAS_SCARA_OFFSET - abc_pos_t scara_home_offset; - #endif - - #if HAS_SOFTWARE_ENDSTOPS - float delta_max_radius, delta_max_radius_2; - #elif IS_SCARA - constexpr float delta_max_radius = SCARA_PRINTABLE_RADIUS, - delta_max_radius_2 = sq(SCARA_PRINTABLE_RADIUS); - #else // DELTA - constexpr float delta_max_radius = DELTA_PRINTABLE_RADIUS, - delta_max_radius_2 = sq(DELTA_PRINTABLE_RADIUS); - #endif - + float delta[ABC]; #endif /** * The workspace can be offset by some commands, or * these offsets may be omitted to save on computation. */ -#if HAS_POSITION_SHIFT - // The distance that XYZ has been offset by G92. Reset by G28. - xyz_pos_t position_shift{0}; -#endif -#if HAS_HOME_OFFSET - // This offset is added to the configured home position. - // Set by M206, M428, or menu item. Saved to EEPROM. - xyz_pos_t home_offset{0}; -#endif -#if HAS_HOME_OFFSET && HAS_POSITION_SHIFT - // The above two are combined to save on computes - xyz_pos_t workspace_offset{0}; +#if HAS_WORKSPACE_OFFSET + #if HAS_POSITION_SHIFT + // The distance that XYZ has been offset by G92. Reset by G28. + float position_shift[XYZ] = { 0 }; + #endif + #if HAS_HOME_OFFSET + // This offset is added to the configured home position. + // Set by M206, M428, or menu item. Saved to EEPROM. + float home_offset[XYZ] = { 0 }; + #endif + #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + // The above two are combined to save on computes + float workspace_offset[XYZ] = { 0 }; + #endif #endif -#if HAS_ABL_NOT_UBL +#if OLDSCHOOL_ABL float xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); #endif /** * Output the current position to serial */ - -inline void report_more_positions() { - stepper.report_positions(); - TERN_(IS_SCARA, scara_report_positions()); -} - -// Report the logical position for a given machine position -inline void report_logical_position(const xyze_pos_t &rpos) { - const xyze_pos_t lpos = rpos.asLogical(); - SERIAL_ECHOPAIR_P(X_LBL, lpos.x, SP_Y_LBL, lpos.y, SP_Z_LBL, lpos.z, SP_E_LBL, lpos.e); -} - -// Report the real current position according to the steppers. -// Forward kinematics and un-leveling are applied. -void report_real_position() { - get_cartesian_from_steppers(); - xyze_pos_t npos = cartes; - npos.e = planner.get_axis_position_mm(E_AXIS); - - #if HAS_POSITION_MODIFIERS - planner.unapply_modifiers(npos, true); - #endif - - report_logical_position(npos); - report_more_positions(); -} - -// Report the logical current position according to the most recent G-code command void report_current_position() { - report_logical_position(current_position); - report_more_positions(); -} + SERIAL_PROTOCOLPGM("X:"); + SERIAL_PROTOCOL(LOGICAL_X_POSITION(current_position[X_AXIS])); + SERIAL_PROTOCOLPGM(" Y:"); + SERIAL_PROTOCOL(LOGICAL_Y_POSITION(current_position[Y_AXIS])); + SERIAL_PROTOCOLPGM(" Z:"); + SERIAL_PROTOCOL(LOGICAL_Z_POSITION(current_position[Z_AXIS])); + SERIAL_PROTOCOLPGM(" E:"); + SERIAL_PROTOCOL(current_position[E_AXIS]); -/** - * Report the logical current position according to the most recent G-code command. - * The planner.position always corresponds to the last G-code too. This makes M114 - * suitable for debugging kinematics and leveling while avoiding planner sync that - * definitively interrupts the printing flow. - */ -void report_current_position_projected() { - report_logical_position(current_position); - stepper.report_a_position(planner.position); + stepper.report_positions(); + + #if IS_SCARA + scara_report_positions(); + #endif } /** @@ -252,11 +173,13 @@ void report_current_position_projected() { * no kinematic translation. Used for homing axes and cartesian/core syncing. */ void sync_plan_position() { - if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position", current_position); - planner.set_position_mm(current_position); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position", current_position); + #endif + planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); } -void sync_plan_position_e() { planner.set_e_position_mm(current_position.e); } +void sync_plan_position_e() { planner.set_e_position_mm(current_position[E_AXIS]); } /** * Get the stepper positions in the cartes[] array. @@ -269,7 +192,11 @@ void sync_plan_position_e() { planner.set_e_position_mm(current_position.e); } */ void get_cartesian_from_steppers() { #if ENABLED(DELTA) - forward_kinematics_DELTA(planner.get_axis_positions_mm()); + forward_kinematics_DELTA( + planner.get_axis_position_mm(A_AXIS), + planner.get_axis_position_mm(B_AXIS), + planner.get_axis_position_mm(C_AXIS) + ); #else #if IS_SCARA forward_kinematics_SCARA( @@ -277,9 +204,10 @@ void get_cartesian_from_steppers() { planner.get_axis_position_degrees(B_AXIS) ); #else - cartes.set(planner.get_axis_position_mm(X_AXIS), planner.get_axis_position_mm(Y_AXIS)); + cartes[X_AXIS] = planner.get_axis_position_mm(X_AXIS); + cartes[Y_AXIS] = planner.get_axis_position_mm(Y_AXIS); #endif - cartes.z = planner.get_axis_position_mm(Z_AXIS); + cartes[Z_AXIS] = planner.get_axis_position_mm(Z_AXIS); #endif } @@ -289,343 +217,244 @@ void get_cartesian_from_steppers() { * may have been applied. * * To prevent small shifts in axis position always call - * sync_plan_position after updating axes with this. + * SYNC_PLAN_POSITION_KINEMATIC after updating axes with this. * * To keep hosts in sync, always call report_current_position * after updating the current_position. */ void set_current_from_steppers_for_axis(const AxisEnum axis) { get_cartesian_from_steppers(); - xyze_pos_t pos = cartes; - pos.e = planner.get_axis_position_mm(E_AXIS); - - #if HAS_POSITION_MODIFIERS - planner.unapply_modifiers(pos, true); + #if PLANNER_LEVELING + planner.unapply_leveling(cartes); #endif - if (axis == ALL_AXES) - current_position = pos; + COPY(current_position, cartes); else - current_position[axis] = pos[axis]; + current_position[axis] = cartes[axis]; } /** * Move the planner to the current position from wherever it last moved * (or from wherever it has been told it is located). */ -void line_to_current_position(const feedRate_t &fr_mm_s/*=feedrate_mm_s*/) { - planner.buffer_line(current_position, fr_mm_s, active_extruder); +void line_to_current_position() { + planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feedrate_mm_s, active_extruder); } -#if EXTRUDERS - void unscaled_e_move(const float &length, const feedRate_t &fr_mm_s) { - TERN_(HAS_FILAMENT_SENSOR, runout.reset()); - current_position.e += length / planner.e_factor[active_extruder]; - line_to_current_position(fr_mm_s); - planner.synchronize(); - } -#endif +/** + * Move the planner to the position stored in the destination array, which is + * used by G0/G1/G2/G3/G5 and many other functions to set a destination. + */ +void buffer_line_to_destination(const float fr_mm_s) { + planner.buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], fr_mm_s, active_extruder); +} #if IS_KINEMATIC + void sync_plan_position_kinematic() { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position_kinematic", current_position); + #endif + planner.set_position_mm_kinematic(current_position); + } + /** - * Buffer a fast move without interpolation. Set current_position to destination + * Calculate delta, start a line, and set current_position to destination */ - void prepare_fast_move_to_destination(const feedRate_t &scaled_fr_mm_s/*=MMS_SCALED(feedrate_mm_s)*/) { - if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_fast_move_to_destination", destination); - - #if UBL_SEGMENTED - // UBL segmented line will do Z-only moves in single segment - ubl.line_to_destination_segmented(scaled_fr_mm_s); - #else - if (current_position == destination) return; - - planner.buffer_line(destination, scaled_fr_mm_s, active_extruder); + void prepare_uninterpolated_move_to_destination(const float fr_mm_s/*=0.0*/) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_uninterpolated_move_to_destination", destination); #endif - current_position = destination; + #if UBL_SEGMENTED + // ubl segmented line will do z-only moves in single segment + ubl.prepare_segmented_line_to(destination, MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s)); + #else + if ( current_position[X_AXIS] == destination[X_AXIS] + && current_position[Y_AXIS] == destination[Y_AXIS] + && current_position[Z_AXIS] == destination[Z_AXIS] + && current_position[E_AXIS] == destination[E_AXIS] + ) return; + + planner.buffer_line_kinematic(destination, MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s), active_extruder); + #endif + + set_current_from_destination(); } #endif // IS_KINEMATIC /** - * Do a fast or normal move to 'destination' with an optional FR. - * - Move at normal speed regardless of feedrate percentage. - * - Extrude the specified length regardless of flow percentage. + * Plan a move to (X, Y, Z) and set the current_position + * The final current_position may not be the one that was requested */ -void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ - #if IS_KINEMATIC - , const bool is_fast/*=false*/ - #endif -) { - const feedRate_t old_feedrate = feedrate_mm_s; - if (fr_mm_s) feedrate_mm_s = fr_mm_s; +void do_blocking_move_to(const float rx, const float ry, const float rz, const float &fr_mm_s/*=0.0*/) { + const float old_feedrate_mm_s = feedrate_mm_s; - const uint16_t old_pct = feedrate_percentage; - feedrate_percentage = 100; - - #if EXTRUDERS - const float old_fac = planner.e_factor[active_extruder]; - planner.e_factor[active_extruder] = 1.0f; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) print_xyz(PSTR(">>> do_blocking_move_to"), NULL, rx, ry, rz); #endif - #if IS_KINEMATIC - if (is_fast) - prepare_fast_move_to_destination(); - else - #endif - prepare_line_to_destination(); - - feedrate_mm_s = old_feedrate; - feedrate_percentage = old_pct; - #if EXTRUDERS - planner.e_factor[active_extruder] = old_fac; - #endif -} - -/** - * Plan a move to (X, Y, Z) and set the current_position - */ -void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s/*=0.0*/) { - DEBUG_SECTION(log_move, "do_blocking_move_to", DEBUGGING(LEVELING)); - if (DEBUGGING(LEVELING)) DEBUG_XYZ("> ", rx, ry, rz); - - const feedRate_t z_feedrate = fr_mm_s ?: homing_feedrate(Z_AXIS), - xy_feedrate = fr_mm_s ?: feedRate_t(XY_PROBE_FEEDRATE_MM_S); + const float z_feedrate = fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS); #if ENABLED(DELTA) if (!position_is_reachable(rx, ry)) return; - REMEMBER(fr, feedrate_mm_s, xy_feedrate); + feedrate_mm_s = fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; - destination = current_position; // sync destination at the start + set_destination_from_current(); // sync destination at the start - if (DEBUGGING(LEVELING)) DEBUG_POS("destination = current_position", destination); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("set_destination_from_current", destination); + #endif // when in the danger zone - if (current_position.z > delta_clip_start_height) { + if (current_position[Z_AXIS] > delta_clip_start_height) { if (rz > delta_clip_start_height) { // staying in the danger zone - destination.set(rx, ry, rz); // move directly (uninterpolated) - prepare_internal_fast_move_to_destination(); // set current_position from destination - if (DEBUGGING(LEVELING)) DEBUG_POS("danger zone move", current_position); + destination[X_AXIS] = rx; // move directly (uninterpolated) + destination[Y_AXIS] = ry; + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("danger zone move", current_position); + #endif return; } - destination.z = delta_clip_start_height; - prepare_internal_fast_move_to_destination(); // set current_position from destination - if (DEBUGGING(LEVELING)) DEBUG_POS("zone border move", current_position); + destination[Z_AXIS] = delta_clip_start_height; + prepare_uninterpolated_move_to_destination(); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("zone border move", current_position); + #endif } - if (rz > current_position.z) { // raising? - destination.z = rz; - prepare_internal_fast_move_to_destination(z_feedrate); // set current_position from destination - if (DEBUGGING(LEVELING)) DEBUG_POS("z raise move", current_position); + if (rz > current_position[Z_AXIS]) { // raising? + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(z_feedrate); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("z raise move", current_position); + #endif } - destination.set(rx, ry); - prepare_internal_move_to_destination(); // set current_position from destination - if (DEBUGGING(LEVELING)) DEBUG_POS("xy move", current_position); + destination[X_AXIS] = rx; + destination[Y_AXIS] = ry; + prepare_move_to_destination(); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("xy move", current_position); + #endif - if (rz < current_position.z) { // lowering? - destination.z = rz; - prepare_internal_fast_move_to_destination(z_feedrate); // set current_position from destination - if (DEBUGGING(LEVELING)) DEBUG_POS("z lower move", current_position); + if (rz < current_position[Z_AXIS]) { // lowering? + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(z_feedrate); // set_current_from_destination() + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("z lower move", current_position); + #endif } #elif IS_SCARA if (!position_is_reachable(rx, ry)) return; - destination = current_position; + set_destination_from_current(); // If Z needs to raise, do it before moving XY - if (destination.z < rz) { - destination.z = rz; - prepare_internal_fast_move_to_destination(z_feedrate); + if (destination[Z_AXIS] < rz) { + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(z_feedrate); } - destination.set(rx, ry); - prepare_internal_fast_move_to_destination(xy_feedrate); + destination[X_AXIS] = rx; + destination[Y_AXIS] = ry; + prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S); // If Z needs to lower, do it after moving XY - if (destination.z > rz) { - destination.z = rz; - prepare_internal_fast_move_to_destination(z_feedrate); + if (destination[Z_AXIS] > rz) { + destination[Z_AXIS] = rz; + prepare_uninterpolated_move_to_destination(z_feedrate); } #else // If Z needs to raise, do it before moving XY - if (current_position.z < rz) { - current_position.z = rz; - line_to_current_position(z_feedrate); + if (current_position[Z_AXIS] < rz) { + feedrate_mm_s = z_feedrate; + current_position[Z_AXIS] = rz; + line_to_current_position(); } - current_position.set(rx, ry); - line_to_current_position(xy_feedrate); + feedrate_mm_s = fr_mm_s ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; + current_position[X_AXIS] = rx; + current_position[Y_AXIS] = ry; + line_to_current_position(); // If Z needs to lower, do it after moving XY - if (current_position.z > rz) { - current_position.z = rz; - line_to_current_position(z_feedrate); + if (current_position[Z_AXIS] > rz) { + feedrate_mm_s = z_feedrate; + current_position[Z_AXIS] = rz; + line_to_current_position(); } #endif + feedrate_mm_s = old_feedrate_mm_s; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< do_blocking_move_to"); + #endif + planner.synchronize(); } - -void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { - do_blocking_move_to(raw.x, raw.y, current_position.z, fr_mm_s); +void do_blocking_move_to_x(const float &rx, const float &fr_mm_s/*=0.0*/) { + do_blocking_move_to(rx, current_position[Y_AXIS], current_position[Z_AXIS], fr_mm_s); } -void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { - do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); +void do_blocking_move_to_z(const float &rz, const float &fr_mm_s/*=0.0*/) { + do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], rz, fr_mm_s); } -void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { - do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); -} - -void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s/*=0.0*/) { - do_blocking_move_to(rx, current_position.y, current_position.z, fr_mm_s); -} -void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { - do_blocking_move_to(current_position.x, ry, current_position.z, fr_mm_s); -} -void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s/*=0.0*/) { - do_blocking_move_to_xy_z(current_position, rz, fr_mm_s); -} - -void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { - do_blocking_move_to(rx, ry, current_position.z, fr_mm_s); -} -void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { - do_blocking_move_to_xy(raw.x, raw.y, fr_mm_s); -} - -void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s/*=0.0f*/) { - do_blocking_move_to(raw.x, raw.y, z, fr_mm_s); -} - -void do_z_clearance(const float &zclear, const bool z_known/*=true*/, const bool raise_on_unknown/*=true*/, const bool lower_allowed/*=false*/) { - const bool rel = raise_on_unknown && !z_known; - float zdest = zclear + (rel ? current_position.z : 0.0f); - if (!lower_allowed) NOLESS(zdest, current_position.z); - do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), MMM_TO_MMS(TERN(HAS_BED_PROBE, Z_PROBE_SPEED_FAST, HOMING_FEEDRATE_Z))); +void do_blocking_move_to_xy(const float &rx, const float &ry, const float &fr_mm_s/*=0.0*/) { + do_blocking_move_to(rx, ry, current_position[Z_AXIS], fr_mm_s); } // -// Prepare to do endstop or probe moves with custom feedrates. -// - Save / restore current feedrate and multiplier +// Prepare to do endstop or probe moves +// with custom feedrates. // -static float saved_feedrate_mm_s; -static int16_t saved_feedrate_percentage; -void remember_feedrate_and_scaling() { - saved_feedrate_mm_s = feedrate_mm_s; - saved_feedrate_percentage = feedrate_percentage; -} -void remember_feedrate_scaling_off() { - remember_feedrate_and_scaling(); - feedrate_percentage = 100; -} -void restore_feedrate_and_scaling() { - feedrate_mm_s = saved_feedrate_mm_s; - feedrate_percentage = saved_feedrate_percentage; +// - Save current feedrates +// - Reset the rate multiplier +// - Reset the command timeout +// - Enable the endstops (for endstop moves) +// +void bracket_probe_move(const bool before) { + static float saved_feedrate_mm_s; + static int16_t saved_feedrate_percentage; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("bracket_probe_move", current_position); + #endif + if (before) { + saved_feedrate_mm_s = feedrate_mm_s; + saved_feedrate_percentage = feedrate_percentage; + feedrate_percentage = 100; + } + else { + feedrate_mm_s = saved_feedrate_mm_s; + feedrate_percentage = saved_feedrate_percentage; + } } +void setup_for_endstop_or_probe_move() { bracket_probe_move(true); } +void clean_up_after_endstop_or_probe_move() { bracket_probe_move(false); } + +// Software Endstops are based on the configured limits. +float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, + soft_endstop_max[XYZ] = { X_MAX_BED, Y_MAX_BED, Z_MAX_POS }; + #if HAS_SOFTWARE_ENDSTOPS // Software Endstops are based on the configured limits. - soft_endstops_t soft_endstop = { - true, false, - { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, - { X_MAX_POS, Y_MAX_POS, Z_MAX_POS } - }; + bool soft_endstops_enabled = true; - /** - * Software endstops can be used to monitor the open end of - * an axis that has a hardware endstop on the other end. Or - * they can prevent axes from moving past endstops and grinding. - * - * To keep doing their job as the coordinate system changes, - * the software endstop positions must be refreshed to remain - * at the same positions relative to the machine. - */ - void update_software_endstops(const AxisEnum axis - #if HAS_HOTEND_OFFSET - , const uint8_t old_tool_index/*=0*/ - , const uint8_t new_tool_index/*=0*/ - #endif - ) { - - #if ENABLED(DUAL_X_CARRIAGE) - - if (axis == X_AXIS) { - - // In Dual X mode hotend_offset[X] is T1's home position - const float dual_max_x = _MAX(hotend_offset[1].x, X2_MAX_POS); - - if (new_tool_index != 0) { - // T1 can move from X2_MIN_POS to X2_MAX_POS or X2 home position (whichever is larger) - soft_endstop.min.x = X2_MIN_POS; - soft_endstop.max.x = dual_max_x; - } - else if (dxc_is_duplicating()) { - // In Duplication Mode, T0 can move as far left as X1_MIN_POS - // but not so far to the right that T1 would move past the end - soft_endstop.min.x = X1_MIN_POS; - soft_endstop.max.x = _MIN(X1_MAX_POS, dual_max_x - duplicate_extruder_x_offset); - } - else { - // In other modes, T0 can move from X1_MIN_POS to X1_MAX_POS - soft_endstop.min.x = X1_MIN_POS; - soft_endstop.max.x = X1_MAX_POS; - } - - } - - #elif ENABLED(DELTA) - - soft_endstop.min[axis] = base_min_pos(axis); - soft_endstop.max[axis] = (axis == Z_AXIS) ? delta_height - TERN0(HAS_BED_PROBE, probe.offset.z) : base_max_pos(axis); - - switch (axis) { - case X_AXIS: - case Y_AXIS: - // Get a minimum radius for clamping - delta_max_radius = _MIN(ABS(_MAX(soft_endstop.min.x, soft_endstop.min.y)), soft_endstop.max.x, soft_endstop.max.y); - delta_max_radius_2 = sq(delta_max_radius); - break; - case Z_AXIS: - delta_clip_start_height = soft_endstop.max[axis] - delta_safe_distance_from_top(); - default: break; - } - - #elif HAS_HOTEND_OFFSET - - // Software endstops are relative to the tool 0 workspace, so - // the movement limits must be shifted by the tool offset to - // retain the same physical limit when other tools are selected. - if (old_tool_index != new_tool_index) { - const float offs = hotend_offset[new_tool_index][axis] - hotend_offset[old_tool_index][axis]; - soft_endstop.min[axis] += offs; - soft_endstop.max[axis] += offs; - } - else { - const float offs = hotend_offset[active_extruder][axis]; - soft_endstop.min[axis] = base_min_pos(axis) + offs; - soft_endstop.max[axis] = base_max_pos(axis) + offs; - } - - #else - - soft_endstop.min[axis] = base_min_pos(axis); - soft_endstop.max[axis] = base_max_pos(axis); - - #endif - - if (DEBUGGING(LEVELING)) - SERIAL_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]); - } + #if IS_KINEMATIC + float soft_endstop_radius, soft_endstop_radius_2; + #endif /** * Constrain the given coordinates to the software endstops. @@ -633,77 +462,40 @@ void restore_feedrate_and_scaling() { * For DELTA/SCARA the XY constraint is based on the smallest * radius within the set software endstops. */ - void apply_motion_limits(xyz_pos_t &target) { - - if (!soft_endstop._enabled) return; - + void clamp_to_software_endstops(float target[XYZ]) { + if (!soft_endstops_enabled) return; #if IS_KINEMATIC - - if (TERN0(DELTA, !all_axes_homed())) return; - - #if BOTH(HAS_HOTEND_OFFSET, DELTA) - // The effector center position will be the target minus the hotend offset. - const xy_pos_t offs = hotend_offset[active_extruder]; - #else - // SCARA needs to consider the angle of the arm through the entire move, so for now use no tool offset. - constexpr xy_pos_t offs{0}; - #endif - - if (TERN1(IS_SCARA, TEST(axis_homed, X_AXIS) && TEST(axis_homed, Y_AXIS))) { - const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y); - if (dist_2 > delta_max_radius_2) - target *= float(delta_max_radius / SQRT(dist_2)); // 200 / 300 = 0.66 + const float dist_2 = HYPOT2(target[X_AXIS], target[Y_AXIS]); + if (dist_2 > soft_endstop_radius_2) { + const float ratio = soft_endstop_radius / SQRT(dist_2); // 200 / 300 = 0.66 + target[X_AXIS] *= ratio; + target[Y_AXIS] *= ratio; } - #else - - if (TEST(axis_homed, X_AXIS)) { - #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X) - NOLESS(target.x, soft_endstop.min.x); - #endif - #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X) - NOMORE(target.x, soft_endstop.max.x); - #endif - } - - if (TEST(axis_homed, Y_AXIS)) { - #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Y) - NOLESS(target.y, soft_endstop.min.y); - #endif - #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Y) - NOMORE(target.y, soft_endstop.max.y); - #endif - } - + #if ENABLED(MIN_SOFTWARE_ENDSTOP_X) + NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]); + #endif + #if ENABLED(MIN_SOFTWARE_ENDSTOP_Y) + NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]); + #endif + #if ENABLED(MAX_SOFTWARE_ENDSTOP_X) + NOMORE(target[X_AXIS], soft_endstop_max[X_AXIS]); + #endif + #if ENABLED(MAX_SOFTWARE_ENDSTOP_Y) + NOMORE(target[Y_AXIS], soft_endstop_max[Y_AXIS]); + #endif + #endif + #if ENABLED(MIN_SOFTWARE_ENDSTOP_Z) + NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]); + #endif + #if ENABLED(MAX_SOFTWARE_ENDSTOP_Z) + NOMORE(target[Z_AXIS], soft_endstop_max[Z_AXIS]); #endif - - if (TEST(axis_homed, Z_AXIS)) { - #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Z) - NOLESS(target.z, soft_endstop.min.z); - #endif - #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Z) - NOMORE(target.z, soft_endstop.max.z); - #endif - } } -#else // !HAS_SOFTWARE_ENDSTOPS - - soft_endstops_t soft_endstop; - -#endif // !HAS_SOFTWARE_ENDSTOPS +#endif #if !UBL_SEGMENTED - -FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { - const millis_t ms = millis(); - if (ELAPSED(ms, next_idle_ms)) { - next_idle_ms = ms + 200UL; - return idle(); - } - thermalManager.manage_heater(); // Returns immediately on most calls -} - #if IS_KINEMATIC #if IS_SCARA @@ -723,45 +515,50 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { /** * Prepare a linear move in a DELTA or SCARA setup. * - * Called from prepare_line_to_destination as the + * Called from prepare_move_to_destination as the * default Delta/SCARA segmenter. * * This calls planner.buffer_line several times, adding * small incremental moves for DELTA or SCARA. * * For Unified Bed Leveling (Delta or Segmented Cartesian) - * the ubl.line_to_destination_segmented method replaces this. + * the ubl.prepare_segmented_line_to method replaces this. * * For Auto Bed Leveling (Bilinear) with SEGMENT_LEVELED_MOVES * this is replaced by segmented_line_to_destination below. */ - inline bool line_to_destination_kinematic() { + inline bool prepare_kinematic_move_to(const float (&rtarget)[XYZE]) { // Get the top feedrate of the move in the XY plane - const float scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); + const float _feedrate_mm_s = MMS_SCALED(feedrate_mm_s); - const xyze_float_t diff = destination - current_position; + const float xdiff = rtarget[X_AXIS] - current_position[X_AXIS], + ydiff = rtarget[Y_AXIS] - current_position[Y_AXIS]; // If the move is only in Z/E don't split up the move - if (!diff.x && !diff.y) { - planner.buffer_line(destination, scaled_fr_mm_s, active_extruder); + if (!xdiff && !ydiff) { + planner.buffer_line_kinematic(rtarget, _feedrate_mm_s, active_extruder); return false; // caller will update current_position } // Fail if attempting move outside printable radius - if (!position_is_reachable(destination)) return true; + if (!position_is_reachable(rtarget[X_AXIS], rtarget[Y_AXIS])) return true; + + // Remaining cartesian distances + const float zdiff = rtarget[Z_AXIS] - current_position[Z_AXIS], + ediff = rtarget[E_AXIS] - current_position[E_AXIS]; // Get the linear distance in XYZ - float cartesian_mm = diff.magnitude(); + float cartesian_mm = SQRT(sq(xdiff) + sq(ydiff) + sq(zdiff)); // If the move is very short, check the E move distance - if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(diff.e); + if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(ediff); // No E move either? Game over. if (UNEAR_ZERO(cartesian_mm)) return true; // Minimum number of seconds to move the given distance - const float seconds = cartesian_mm / scaled_fr_mm_s; + const float seconds = cartesian_mm / _feedrate_mm_s; // The number of segments-per-second times the duration // gives the number of segments @@ -769,7 +566,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { // For SCARA enforce a minimum segment size #if IS_SCARA - NOMORE(segments, cartesian_mm * RECIPROCAL(SCARA_MIN_SEGMENT_LENGTH)); + NOMORE(segments, cartesian_mm * (1.0f / float(SCARA_MIN_SEGMENT_LENGTH))); #endif // At least one segment is required @@ -777,42 +574,145 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { // The approximate length of each segment const float inv_segments = 1.0f / float(segments), - cartesian_segment_mm = cartesian_mm * inv_segments; - const xyze_float_t segment_distance = diff * inv_segments; + segment_distance[XYZE] = { + xdiff * inv_segments, + ydiff * inv_segments, + zdiff * inv_segments, + ediff * inv_segments + }; - #if ENABLED(SCARA_FEEDRATE_SCALING) - const float inv_duration = scaled_fr_mm_s / cartesian_segment_mm; + #if !HAS_FEEDRATE_SCALING + const float cartesian_segment_mm = cartesian_mm * inv_segments; #endif /* SERIAL_ECHOPAIR("mm=", cartesian_mm); SERIAL_ECHOPAIR(" seconds=", seconds); SERIAL_ECHOPAIR(" segments=", segments); - SERIAL_ECHOPAIR(" segment_mm=", cartesian_segment_mm); + #if !HAS_FEEDRATE_SCALING + SERIAL_ECHOPAIR(" segment_mm=", cartesian_segment_mm); + #endif SERIAL_EOL(); //*/ - // Get the current position as starting point - xyze_pos_t raw = current_position; + #if HAS_FEEDRATE_SCALING + // SCARA needs to scale the feed rate from mm/s to degrees/s + // i.e., Complete the angular vector in the given time. + const float segment_length = cartesian_mm * inv_segments, + inv_segment_length = 1.0f / segment_length, // 1/mm/segs + inverse_secs = inv_segment_length * _feedrate_mm_s; + + float oldA = planner.position_float[A_AXIS], + oldB = planner.position_float[B_AXIS] + #if ENABLED(DELTA_FEEDRATE_SCALING) + , oldC = planner.position_float[C_AXIS] + #endif + ; + + /* + SERIAL_ECHOPGM("Scaled kinematic move: "); + SERIAL_ECHOPAIR(" segment_length (inv)=", segment_length); + SERIAL_ECHOPAIR(" (", inv_segment_length); + SERIAL_ECHOPAIR(") _feedrate_mm_s=", _feedrate_mm_s); + SERIAL_ECHOPAIR(" inverse_secs=", inverse_secs); + SERIAL_ECHOPAIR(" oldA=", oldA); + SERIAL_ECHOPAIR(" oldB=", oldB); + #if ENABLED(DELTA_FEEDRATE_SCALING) + SERIAL_ECHOPAIR(" oldC=", oldC); + #endif + SERIAL_EOL(); + safe_delay(5); + //*/ + #endif + + // Get the current position as starting point + float raw[XYZE]; + COPY(raw, current_position); // Calculate and execute the segments - millis_t next_idle_ms = millis() + 200UL; while (--segments) { - segment_idle(next_idle_ms); - raw += segment_distance; - if (!planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, cartesian_segment_mm - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - )) break; + + static millis_t next_idle_ms = millis() + 200UL; + thermalManager.manage_heater(); // This returns immediately if not really needed. + if (ELAPSED(millis(), next_idle_ms)) { + next_idle_ms = millis() + 200UL; + idle(); + } + + LOOP_XYZE(i) raw[i] += segment_distance[i]; + + #if ENABLED(DELTA) && HOTENDS < 2 + DELTA_IK(raw); // Delta can inline its kinematics + #else + inverse_kinematics(raw); + #endif + ADJUST_DELTA(raw); // Adjust Z if bed leveling is enabled + + #if ENABLED(SCARA_FEEDRATE_SCALING) + // For SCARA scale the feed rate from mm/s to degrees/s + // i.e., Complete the angular vector in the given time. + if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], raw[Z_AXIS], raw[E_AXIS], HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs, active_extruder, segment_length)) + break; + /* + SERIAL_ECHO(segments); + SERIAL_ECHOPAIR(": X=", raw[X_AXIS]); SERIAL_ECHOPAIR(" Y=", raw[Y_AXIS]); + SERIAL_ECHOPAIR(" A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); + SERIAL_ECHOLNPAIR(" F", HYPOT(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB) * inverse_secs * 60); + safe_delay(5); + //*/ + oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; + #elif ENABLED(DELTA_FEEDRATE_SCALING) + // For DELTA scale the feed rate from Effector mm/s to Carriage mm/s + // i.e., Complete the linear vector in the given time. + if (!planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs, active_extruder, segment_length)) + break; + /* + SERIAL_ECHO(segments); + SERIAL_ECHOPAIR(": X=", raw[X_AXIS]); SERIAL_ECHOPAIR(" Y=", raw[Y_AXIS]); + SERIAL_ECHOPAIR(" A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); SERIAL_ECHOPAIR(" C=", delta[C_AXIS]); + SERIAL_ECHOLNPAIR(" F", SQRT(sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC)) * inverse_secs * 60); + safe_delay(5); + //*/ + oldA = delta[A_AXIS]; oldB = delta[B_AXIS]; oldC = delta[C_AXIS]; + #else + if (!planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], raw[E_AXIS], _feedrate_mm_s, active_extruder, cartesian_segment_mm)) + break; + #endif } // Ensure last segment arrives at target location. - planner.buffer_line(destination, scaled_fr_mm_s, active_extruder, cartesian_segment_mm - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - ); + #if HAS_FEEDRATE_SCALING + inverse_kinematics(rtarget); + ADJUST_DELTA(rtarget); + #endif + + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float diff2 = HYPOT2(delta[A_AXIS] - oldA, delta[B_AXIS] - oldB); + if (diff2) { + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], rtarget[Z_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder, segment_length); + /* + SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); + SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB); + SERIAL_ECHOLNPAIR(" F", SQRT(diff2) * inverse_secs * 60); + SERIAL_EOL(); + safe_delay(5); + //*/ + } + #elif ENABLED(DELTA_FEEDRATE_SCALING) + const float diff2 = sq(delta[A_AXIS] - oldA) + sq(delta[B_AXIS] - oldB) + sq(delta[C_AXIS] - oldC); + if (diff2) { + planner.buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], rtarget[E_AXIS], SQRT(diff2) * inverse_secs, active_extruder, segment_length); + /* + SERIAL_ECHOPAIR("final: A=", delta[A_AXIS]); SERIAL_ECHOPAIR(" B=", delta[B_AXIS]); SERIAL_ECHOPAIR(" C=", delta[C_AXIS]); + SERIAL_ECHOPAIR(" adiff=", delta[A_AXIS] - oldA); SERIAL_ECHOPAIR(" bdiff=", delta[B_AXIS] - oldB); SERIAL_ECHOPAIR(" cdiff=", delta[C_AXIS] - oldC); + SERIAL_ECHOLNPAIR(" F", SQRT(diff2) * inverse_secs * 60); + SERIAL_EOL(); + safe_delay(5); + //*/ + } + #else + planner.buffer_line_kinematic(rtarget, _feedrate_mm_s, active_extruder, cartesian_segment_mm); + #endif return false; // caller will update current_position } @@ -828,21 +728,26 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { * small incremental moves. This allows the planner to * apply more detailed bed leveling to the full move. */ - inline void segmented_line_to_destination(const feedRate_t &fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { + inline void segmented_line_to_destination(const float &fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { - const xyze_float_t diff = destination - current_position; + const float xdiff = destination[X_AXIS] - current_position[X_AXIS], + ydiff = destination[Y_AXIS] - current_position[Y_AXIS]; // If the move is only in Z/E don't split up the move - if (!diff.x && !diff.y) { - planner.buffer_line(destination, fr_mm_s, active_extruder); + if (!xdiff && !ydiff) { + planner.buffer_line_kinematic(destination, fr_mm_s, active_extruder); return; } + // Remaining cartesian distances + const float zdiff = destination[Z_AXIS] - current_position[Z_AXIS], + ediff = destination[E_AXIS] - current_position[E_AXIS]; + // Get the linear distance in XYZ // If the move is very short, check the E move distance // No E move either? Game over. - float cartesian_mm = diff.magnitude(); - if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(diff.e); + float cartesian_mm = SQRT(sq(xdiff) + sq(ydiff) + sq(zdiff)); + if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(ediff); if (UNEAR_ZERO(cartesian_mm)) return; // The length divided by the segment size @@ -852,39 +757,38 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { // The approximate length of each segment const float inv_segments = 1.0f / float(segments), - cartesian_segment_mm = cartesian_mm * inv_segments; - const xyze_float_t segment_distance = diff * inv_segments; - - #if ENABLED(SCARA_FEEDRATE_SCALING) - const float inv_duration = scaled_fr_mm_s / cartesian_segment_mm; - #endif + cartesian_segment_mm = cartesian_mm * inv_segments, + segment_distance[XYZE] = { + xdiff * inv_segments, + ydiff * inv_segments, + zdiff * inv_segments, + ediff * inv_segments + }; // SERIAL_ECHOPAIR("mm=", cartesian_mm); // SERIAL_ECHOLNPAIR(" segments=", segments); // SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm); // Get the raw current position as starting point - xyze_pos_t raw = current_position; + float raw[XYZE]; + COPY(raw, current_position); // Calculate and execute the segments - millis_t next_idle_ms = millis() + 200UL; while (--segments) { - segment_idle(next_idle_ms); - raw += segment_distance; - if (!planner.buffer_line(raw, fr_mm_s, active_extruder, cartesian_segment_mm - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - )) break; + static millis_t next_idle_ms = millis() + 200UL; + thermalManager.manage_heater(); // This returns immediately if not really needed. + if (ELAPSED(millis(), next_idle_ms)) { + next_idle_ms = millis() + 200UL; + idle(); + } + LOOP_XYZE(i) raw[i] += segment_distance[i]; + if (!planner.buffer_line_kinematic(raw, fr_mm_s, active_extruder, cartesian_segment_mm)) + break; } // Since segment_distance is only approximate, // the final move must be to the exact destination. - planner.buffer_line(destination, fr_mm_s, active_extruder, cartesian_segment_mm - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - ); + planner.buffer_line_kinematic(destination, fr_mm_s, active_extruder, cartesian_segment_mm); } #endif // SEGMENT_LEVELED_MOVES @@ -895,28 +799,27 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { * When a mesh-based leveling system is active, moves are segmented * according to the configuration of the leveling system. * - * Return true if 'current_position' was set to 'destination' + * Returns true if current_position[] was set to destination[] */ - inline bool line_to_destination_cartesian() { - const float scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); + inline bool prepare_move_to_destination_cartesian() { #if HAS_MESH - if (planner.leveling_active && planner.leveling_active_at_z(destination.z)) { + if (planner.leveling_active && planner.leveling_active_at_z(destination[Z_AXIS])) { #if ENABLED(AUTO_BED_LEVELING_UBL) - ubl.line_to_destination_cartesian(scaled_fr_mm_s, active_extruder); // UBL's motion routine needs to know about - return true; // all moves, including Z-only moves. + ubl.line_to_destination_cartesian(MMS_SCALED(feedrate_mm_s), active_extruder); // UBL's motion routine needs to know about + return true; // all moves, including Z-only moves. #elif ENABLED(SEGMENT_LEVELED_MOVES) - segmented_line_to_destination(scaled_fr_mm_s); + segmented_line_to_destination(MMS_SCALED(feedrate_mm_s)); return false; // caller will update current_position #else /** * For MBL and ABL-BILINEAR only segment moves when X or Y are involved. * Otherwise fall through to do a direct single move. */ - if (xy_pos_t(current_position) != xy_pos_t(destination)) { + if (current_position[X_AXIS] != destination[X_AXIS] || current_position[Y_AXIS] != destination[Y_AXIS]) { #if ENABLED(MESH_BED_LEVELING) - mbl.line_to_destination(scaled_fr_mm_s); + mbl.line_to_destination(MMS_SCALED(feedrate_mm_s)); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - bilinear_line_to_destination(scaled_fr_mm_s); + bilinear_line_to_destination(MMS_SCALED(feedrate_mm_s)); #endif return true; } @@ -924,32 +827,29 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { } #endif // HAS_MESH - planner.buffer_line(destination, scaled_fr_mm_s, active_extruder); + buffer_line_to_destination(MMS_SCALED(feedrate_mm_s)); return false; // caller will update current_position } #endif // !IS_KINEMATIC #endif // !UBL_SEGMENTED -#if HAS_DUPLICATION_MODE - bool extruder_duplication_enabled, - mirrored_duplication_mode; - #if ENABLED(MULTI_NOZZLE_DUPLICATION) - uint8_t duplication_e_mask; // = 0 - #endif +#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + bool extruder_duplication_enabled = false, // Used in Dual X mode 2 & 3 + symmetric_duplication_mode = false; // Used in Dual X mode 2 & 3 #endif #if ENABLED(DUAL_X_CARRIAGE) DualXMode dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; float inactive_extruder_x_pos = X2_MAX_POS, // used in mode 0 & 1 + raised_parked_position[XYZE], // used in mode 1 duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // used in mode 2 - xyz_pos_t raised_parked_position; // used in mode 1 bool active_extruder_parked = false; // used in mode 1 & 2 millis_t delayed_move_time = 0; // used in mode 1 int16_t duplicate_extruder_temp_offset = 0; // used in mode 2 - float x_home_pos(const uint8_t extruder) { + float x_home_pos(const int extruder) { if (extruder == 0) return base_home_pos(X_AXIS); else @@ -959,7 +859,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { * This allows soft recalibration of the second extruder home position * without firmware reflash (through the M218 command). */ - return hotend_offset[1].x > 0 ? hotend_offset[1].x : X2_HOME_POS; + return hotend_offset[X_AXIS][1] > 0 ? hotend_offset[X_AXIS][1] : X2_HOME_POS; } /** @@ -973,57 +873,69 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { case DXC_FULL_CONTROL_MODE: break; case DXC_AUTO_PARK_MODE: - if (current_position.e == destination.e) { + if (current_position[E_AXIS] == destination[E_AXIS]) { // This is a travel move (with no extrusion) // Skip it, but keep track of the current position // (so it can be used as the start of the next non-travel move) if (delayed_move_time != 0xFFFFFFFFUL) { - current_position = destination; - NOLESS(raised_parked_position.z, destination.z); + set_current_from_destination(); + NOLESS(raised_parked_position[Z_AXIS], destination[Z_AXIS]); delayed_move_time = millis(); return true; } } // unpark extruder: 1) raise, 2) move into starting XY position, 3) lower - #define CUR_X current_position.x - #define CUR_Y current_position.y - #define CUR_Z current_position.z - #define CUR_E current_position.e - #define RAISED_X raised_parked_position.x - #define RAISED_Y raised_parked_position.y - #define RAISED_Z raised_parked_position.z + #define CUR_X current_position[X_AXIS] + #define CUR_Y current_position[Y_AXIS] + #define CUR_Z current_position[Z_AXIS] + #define CUR_E current_position[E_AXIS] + #define RAISED_X raised_parked_position[X_AXIS] + #define RAISED_Y raised_parked_position[Y_AXIS] + #define RAISED_Z raised_parked_position[Z_AXIS] - if ( planner.buffer_line(RAISED_X, RAISED_Y, RAISED_Z, CUR_E, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder)) + //SERIAL_ECHOLNPGM("dual_x_carriage_unpark()\n"); + + if ( planner.buffer_line(RAISED_X, RAISED_Y, RAISED_Z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder)) if (planner.buffer_line( CUR_X, CUR_Y, RAISED_Z, CUR_E, PLANNER_XY_FEEDRATE(), active_extruder)) - line_to_current_position(planner.settings.max_feedrate_mm_s[Z_AXIS]); + planner.buffer_line( CUR_X, CUR_Y, CUR_Z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); delayed_move_time = 0; active_extruder_parked = false; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Clear active_extruder_parked"); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Clear active_extruder_parked"); + #endif break; - case DXC_MIRRORED_MODE: case DXC_DUPLICATION_MODE: if (active_extruder == 0) { - xyze_pos_t new_pos = current_position; - if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) - new_pos.x += duplicate_extruder_x_offset; - else - new_pos.x = inactive_extruder_x_pos; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("Set planner X", inactive_extruder_x_pos); + SERIAL_ECHOLNPAIR(" ... Line to X", current_position[X_AXIS] + duplicate_extruder_x_offset); + } + #endif // move duplicate extruder into correct duplication position. - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Set planner X", inactive_extruder_x_pos, " ... Line to X", new_pos.x); - planner.set_position_mm(inactive_extruder_x_pos, current_position.y, current_position.z, current_position.e); - if (!planner.buffer_line(new_pos, planner.settings.max_feedrate_mm_s[X_AXIS], 1)) break; + planner.set_position_mm(inactive_extruder_x_pos, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); + if (!planner.buffer_line( + current_position[X_AXIS] + duplicate_extruder_x_offset, + current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], + planner.max_feedrate_mm_s[X_AXIS], 1) + ) break; planner.synchronize(); - sync_plan_position(); + SYNC_PLAN_POSITION_KINEMATIC(); extruder_duplication_enabled = true; active_extruder_parked = false; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Set extruder_duplication_enabled\nClear active_extruder_parked"); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Set extruder_duplication_enabled\nClear active_extruder_parked"); + #endif + } + else { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Active extruder not 0"); + #endif } - else if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Active extruder not 0"); break; } } - stepper.set_directions(); return false; } @@ -1035,100 +947,91 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { * This may result in several calls to planner.buffer_line to * do smaller moves for DELTA, SCARA, mesh moves, etc. * - * Make sure current_position.e and destination.e are good + * Make sure current_position[E] and destination[E] are good * before calling or cold/lengthy extrusion may get missed. - * - * Before exit, current_position is set to destination. */ -void prepare_line_to_destination() { - apply_motion_limits(destination); +void prepare_move_to_destination() { + clamp_to_software_endstops(destination); - #if EITHER(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) + #if ENABLED(PREVENT_COLD_EXTRUSION) || ENABLED(PREVENT_LENGTHY_EXTRUDE) - if (!DEBUGGING(DRYRUN) && destination.e != current_position.e) { - bool ignore_e = false; - - #if ENABLED(PREVENT_COLD_EXTRUSION) - ignore_e = thermalManager.tooColdToExtrude(active_extruder); - if (ignore_e) SERIAL_ECHO_MSG(STR_ERR_COLD_EXTRUDE_STOP); - #endif - - #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - const float e_delta = ABS(destination.e - current_position.e) * planner.e_factor[active_extruder]; - if (e_delta > (EXTRUDE_MAXLENGTH)) { - #if ENABLED(MIXING_EXTRUDER) - float collector[MIXING_STEPPERS]; - mixer.refresh_collector(1.0, mixer.get_current_vtool(), collector); - MIXER_STEPPER_LOOP(e) { - if (e_delta * collector[e] > (EXTRUDE_MAXLENGTH)) { - ignore_e = true; - SERIAL_ECHO_MSG(STR_ERR_LONG_EXTRUDE_STOP); - break; - } - } - #else - ignore_e = true; - SERIAL_ECHO_MSG(STR_ERR_LONG_EXTRUDE_STOP); - #endif - } - #endif - - if (ignore_e) { - current_position.e = destination.e; // Behave as if the E move really took place - planner.set_e_position_mm(destination.e); // Prevent the planner from complaining too + if (!DEBUGGING(DRYRUN)) { + if (destination[E_AXIS] != current_position[E_AXIS]) { + #if ENABLED(PREVENT_COLD_EXTRUSION) + if (thermalManager.tooColdToExtrude(active_extruder)) { + current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_COLD_EXTRUDE_STOP); + } + #endif // PREVENT_COLD_EXTRUSION + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + if (ABS(destination[E_AXIS] - current_position[E_AXIS]) * planner.e_factor[active_extruder] > (EXTRUDE_MAXLENGTH)) { + current_position[E_AXIS] = destination[E_AXIS]; // Behave as if the move really took place, but ignore E part + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_LONG_EXTRUDE_STOP); + } + #endif // PREVENT_LENGTHY_EXTRUDE } } #endif // PREVENT_COLD_EXTRUSION || PREVENT_LENGTHY_EXTRUDE - if (TERN0(DUAL_X_CARRIAGE, dual_x_carriage_unpark())) return; + #if ENABLED(DUAL_X_CARRIAGE) + if (dual_x_carriage_unpark()) return; + #endif if ( #if UBL_SEGMENTED - #if IS_KINEMATIC // UBL using Kinematic / Cartesian cases as a workaround for now. - ubl.line_to_destination_segmented(MMS_SCALED(feedrate_mm_s)) +// ubl.prepare_segmented_line_to(destination, MMS_SCALED(feedrate_mm_s)) // This does not seem to work correctly on UBL. + #if ENABLED(DELTA) // A Delta case and a Cartesian case can work + ubl.prepare_segmented_line_to(destination, MMS_SCALED(feedrate_mm_s)) // around the problem until it is fixed. #else - line_to_destination_cartesian() + prepare_move_to_destination_cartesian() #endif #elif IS_KINEMATIC - line_to_destination_kinematic() + prepare_kinematic_move_to(destination) #else - line_to_destination_cartesian() + prepare_move_to_destination_cartesian() #endif ) return; - current_position = destination; + set_current_from_destination(); } -uint8_t axes_should_home(uint8_t axis_bits/*=0x07*/) { - // Clear test bits that are trusted - if (TEST(axis_bits, X_AXIS) && TEST(axis_homed, X_AXIS)) CBI(axis_bits, X_AXIS); - if (TEST(axis_bits, Y_AXIS) && TEST(axis_homed, Y_AXIS)) CBI(axis_bits, Y_AXIS); - if (TEST(axis_bits, Z_AXIS) && TEST(axis_homed, Z_AXIS)) CBI(axis_bits, Z_AXIS); - return axis_bits; -} +#if HAS_AXIS_UNHOMED_ERR -bool homing_needed_error(uint8_t axis_bits/*=0x07*/) { - if ((axis_bits = axes_should_home(axis_bits))) { - PGM_P home_first = GET_TEXT(MSG_HOME_FIRST); - char msg[strlen_P(home_first)+1]; - sprintf_P(msg, home_first, - TEST(axis_bits, X_AXIS) ? "X" : "", - TEST(axis_bits, Y_AXIS) ? "Y" : "", - TEST(axis_bits, Z_AXIS) ? "Z" : "" - ); - SERIAL_ECHO_START(); - SERIAL_ECHOLN(msg); - TERN_(HAS_DISPLAY, ui.set_status(msg)); - return true; + bool axis_unhomed_error(const bool x/*=true*/, const bool y/*=true*/, const bool z/*=true*/) { + #if ENABLED(HOME_AFTER_DEACTIVATE) + const bool xx = x && !TEST(axis_known_position, X_AXIS), + yy = y && !TEST(axis_known_position, Y_AXIS), + zz = z && !TEST(axis_known_position, Z_AXIS); + #else + const bool xx = x && !TEST(axis_homed, X_AXIS), + yy = y && !TEST(axis_homed, Y_AXIS), + zz = z && !TEST(axis_homed, Z_AXIS); + #endif + if (xx || yy || zz) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(MSG_HOME " "); + if (xx) SERIAL_ECHOPGM(MSG_X); + if (yy) SERIAL_ECHOPGM(MSG_Y); + if (zz) SERIAL_ECHOPGM(MSG_Z); + SERIAL_ECHOLNPGM(" " MSG_FIRST); + + #if ENABLED(ULTRA_LCD) + lcd_status_printf_P(0, PSTR(MSG_HOME " %s%s%s " MSG_FIRST), xx ? MSG_X : "", yy ? MSG_Y : "", zz ? MSG_Z : ""); + #endif + return true; + } + return false; } - return false; -} + +#endif // HAS_AXIS_UNHOMED_ERR /** * Homing bump feedrate (mm/s) */ -feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { +inline float get_homing_bump_feedrate(const AxisEnum axis) { #if HOMING_Z_WITH_PROBE if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); #endif @@ -1136,139 +1039,51 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); if (hbd < 1) { hbd = 10; - SERIAL_ECHO_MSG("Warning: Homing Bump Divisor < 1"); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM("Warning: Homing Bump Divisor < 1"); } - return homing_feedrate(axis) / float(hbd); + return homing_feedrate(axis) / hbd; } #if ENABLED(SENSORLESS_HOMING) + /** * Set sensorless homing if the axis has it, accounting for Core Kinematics. */ - sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis) { - sensorless_t stealth_states { false }; - + void sensorless_homing_per_axis(const AxisEnum axis, const bool enable/*=true*/) { switch (axis) { default: break; #if X_SENSORLESS case X_AXIS: - stealth_states.x = tmc_enable_stallguard(stepperX); - #if AXIS_HAS_STALLGUARD(X2) - stealth_states.x2 = tmc_enable_stallguard(stepperX2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS - stealth_states.y = tmc_enable_stallguard(stepperY); + tmc_sensorless_homing(stepperX, enable); + #if CORE_IS_XY && Y_SENSORLESS + tmc_sensorless_homing(stepperY, enable); #elif CORE_IS_XZ && Z_SENSORLESS - stealth_states.z = tmc_enable_stallguard(stepperZ); + tmc_sensorless_homing(stepperZ, enable); #endif break; #endif #if Y_SENSORLESS case Y_AXIS: - stealth_states.y = tmc_enable_stallguard(stepperY); - #if AXIS_HAS_STALLGUARD(Y2) - stealth_states.y2 = tmc_enable_stallguard(stepperY2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS - stealth_states.x = tmc_enable_stallguard(stepperX); + tmc_sensorless_homing(stepperY, enable); + #if CORE_IS_XY && X_SENSORLESS + tmc_sensorless_homing(stepperX, enable); #elif CORE_IS_YZ && Z_SENSORLESS - stealth_states.z = tmc_enable_stallguard(stepperZ); + tmc_sensorless_homing(stepperZ, enable); #endif break; #endif #if Z_SENSORLESS case Z_AXIS: - stealth_states.z = tmc_enable_stallguard(stepperZ); - #if AXIS_HAS_STALLGUARD(Z2) - stealth_states.z2 = tmc_enable_stallguard(stepperZ2); - #endif - #if AXIS_HAS_STALLGUARD(Z3) - stealth_states.z3 = tmc_enable_stallguard(stepperZ3); - #endif - #if AXIS_HAS_STALLGUARD(Z4) - stealth_states.z4 = tmc_enable_stallguard(stepperZ4); - #endif + tmc_sensorless_homing(stepperZ, enable); #if CORE_IS_XZ && X_SENSORLESS - stealth_states.x = tmc_enable_stallguard(stepperX); + tmc_sensorless_homing(stepperX, enable); #elif CORE_IS_YZ && Y_SENSORLESS - stealth_states.y = tmc_enable_stallguard(stepperY); + tmc_sensorless_homing(stepperY, enable); #endif break; #endif } - - #if ENABLED(SPI_ENDSTOPS) - switch (axis) { - case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = true; break; - case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = true; break; - case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = true; break; - default: break; - } - #endif - - TERN_(IMPROVE_HOMING_RELIABILITY, sg_guard_period = millis() + default_sg_guard_duration); - - return stealth_states; - } - - void end_sensorless_homing_per_axis(const AxisEnum axis, sensorless_t enable_stealth) { - switch (axis) { - default: break; - #if X_SENSORLESS - case X_AXIS: - tmc_disable_stallguard(stepperX, enable_stealth.x); - #if AXIS_HAS_STALLGUARD(X2) - tmc_disable_stallguard(stepperX2, enable_stealth.x2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS - tmc_disable_stallguard(stepperY, enable_stealth.y); - #elif CORE_IS_XZ && Z_SENSORLESS - tmc_disable_stallguard(stepperZ, enable_stealth.z); - #endif - break; - #endif - #if Y_SENSORLESS - case Y_AXIS: - tmc_disable_stallguard(stepperY, enable_stealth.y); - #if AXIS_HAS_STALLGUARD(Y2) - tmc_disable_stallguard(stepperY2, enable_stealth.y2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS - tmc_disable_stallguard(stepperX, enable_stealth.x); - #elif CORE_IS_YZ && Z_SENSORLESS - tmc_disable_stallguard(stepperZ, enable_stealth.z); - #endif - break; - #endif - #if Z_SENSORLESS - case Z_AXIS: - tmc_disable_stallguard(stepperZ, enable_stealth.z); - #if AXIS_HAS_STALLGUARD(Z2) - tmc_disable_stallguard(stepperZ2, enable_stealth.z2); - #endif - #if AXIS_HAS_STALLGUARD(Z3) - tmc_disable_stallguard(stepperZ3, enable_stealth.z3); - #endif - #if AXIS_HAS_STALLGUARD(Z4) - tmc_disable_stallguard(stepperZ4, enable_stealth.z4); - #endif - #if CORE_IS_XZ && X_SENSORLESS - tmc_disable_stallguard(stepperX, enable_stealth.x); - #elif CORE_IS_YZ && Y_SENSORLESS - tmc_disable_stallguard(stepperY, enable_stealth.y); - #endif - break; - #endif - } - - #if ENABLED(SPI_ENDSTOPS) - switch (axis) { - case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = false; break; - case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = false; break; - case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = false; break; - default: break; - } - #endif } #endif // SENSORLESS_HOMING @@ -1276,70 +1091,65 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { /** * Home an individual linear axis */ -void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t fr_mm_s=0.0) { - DEBUG_SECTION(log_move, "do_homing_move", DEBUGGING(LEVELING)); +static void do_homing_move(const AxisEnum axis, const float distance, const float fr_mm_s=0.0) { - const feedRate_t real_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> do_homing_move(", axis_codes[axis]); + SERIAL_ECHOPAIR(", ", distance); + SERIAL_ECHOPGM(", "); + if (fr_mm_s) + SERIAL_ECHO(fr_mm_s); + else { + SERIAL_ECHOPAIR("[", homing_feedrate(axis)); + SERIAL_CHAR(']'); + } + SERIAL_ECHOLNPGM(")"); + } + #endif - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("...(", axis_codes[axis], ", ", distance, ", "); - if (fr_mm_s) - DEBUG_ECHO(fr_mm_s); - else - DEBUG_ECHOPAIR("[", real_fr_mm_s, "]"); - DEBUG_ECHOLNPGM(")"); - } - - #if ALL(HOMING_Z_WITH_PROBE, HAS_HEATED_BED, WAIT_FOR_BED_HEATER) + #if HOMING_Z_WITH_PROBE && HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) // Wait for bed to heat back up between probing points - if (axis == Z_AXIS && distance < 0) - thermalManager.wait_for_bed_heating(); + if (axis == Z_AXIS && distance < 0 && thermalManager.isHeatingBed()) { + serialprintPGM(msg_wait_for_bed_heating); + LCD_MESSAGEPGM(MSG_BED_HEATING); + while (thermalManager.isHeatingBed()) safe_delay(200); + lcd_reset_status(); + } #endif // Only do some things when moving towards an endstop - const int8_t axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) - ? x_home_dir(active_extruder) : home_dir(axis); + const int8_t axis_home_dir = + #if ENABLED(DUAL_X_CARRIAGE) + (axis == X_AXIS) ? x_home_dir(active_extruder) : + #endif + home_dir(axis); const bool is_home_dir = (axis_home_dir > 0) == (distance > 0); - #if ENABLED(SENSORLESS_HOMING) - sensorless_t stealth_states; - #endif - if (is_home_dir) { #if HOMING_Z_WITH_PROBE && QUIET_PROBING - if (axis == Z_AXIS) probe.set_probing_paused(true); + if (axis == Z_AXIS) probing_pause(true); #endif // Disable stealthChop if used. Enable diag1 pin on driver. - TERN_(SENSORLESS_HOMING, stealth_states = start_sensorless_homing_per_axis(axis)); + #if ENABLED(SENSORLESS_HOMING) + sensorless_homing_per_axis(axis); + #endif } + // Tell the planner the axis is at 0 + current_position[axis] = 0; + #if IS_SCARA - // Tell the planner the axis is at 0 - current_position[axis] = 0; - sync_plan_position(); + SYNC_PLAN_POSITION_KINEMATIC(); current_position[axis] = distance; - line_to_current_position(real_fr_mm_s); + inverse_kinematics(current_position); + planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder); #else - // Get the ABC or XYZ positions in mm - abce_pos_t target = planner.get_axis_positions_mm(); - - target[axis] = 0; // Set the single homing axis to 0 - planner.set_machine_position_mm(target); // Update the machine position - - #if HAS_DIST_MM_ARG - const xyze_float_t cart_dist_mm{0}; - #endif - - // Set delta/cartesian axes directly - target[axis] = distance; // The move will be towards the endstop - planner.buffer_segment(target - #if HAS_DIST_MM_ARG - , cart_dist_mm - #endif - , real_fr_mm_s, active_extruder - ); + sync_plan_position(); + current_position[axis] = distance; // Set delta/cartesian axes directly + planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder); #endif planner.synchronize(); @@ -1347,14 +1157,24 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t if (is_home_dir) { #if HOMING_Z_WITH_PROBE && QUIET_PROBING - if (axis == Z_AXIS) probe.set_probing_paused(false); + if (axis == Z_AXIS) probing_pause(false); #endif endstops.validate_homing_move(); // Re-enable stealthChop if used. Disable diag1 pin on driver. - TERN_(SENSORLESS_HOMING, end_sensorless_homing_per_axis(axis, stealth_states)); + #if ENABLED(SENSORLESS_HOMING) + sensorless_homing_per_axis(axis, false); + #endif } + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("<<< do_homing_move(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif } /** @@ -1376,14 +1196,25 @@ void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t * Callers must sync the planner position after calling this! */ void set_axis_is_at_home(const AxisEnum axis) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_is_at_home(", axis_codes[axis], ")"); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> set_axis_is_at_home(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif SBI(axis_known_position, axis); SBI(axis_homed, axis); + #if HAS_POSITION_SHIFT + position_shift[axis] = 0; + update_software_endstops(axis); + #endif + #if ENABLED(DUAL_X_CARRIAGE) if (axis == X_AXIS && (active_extruder == 1 || dual_x_carriage_mode == DXC_DUPLICATION_MODE)) { - current_position.x = x_home_pos(active_extruder); + current_position[X_AXIS] = x_home_pos(active_extruder); return; } #endif @@ -1391,7 +1222,7 @@ void set_axis_is_at_home(const AxisEnum axis) { #if ENABLED(MORGAN_SCARA) scara_set_axis_is_at_home(axis); #elif ENABLED(DELTA) - current_position[axis] = (axis == Z_AXIS) ? delta_height - TERN0(HAS_BED_PROBE, probe.offset.z) : base_home_pos(axis); + current_position[axis] = (axis == Z_AXIS ? delta_height : base_home_pos(axis)); #else current_position[axis] = base_home_pos(axis); #endif @@ -1403,126 +1234,40 @@ void set_axis_is_at_home(const AxisEnum axis) { if (axis == Z_AXIS) { #if HOMING_Z_WITH_PROBE - current_position.z -= probe.offset.z; + current_position[Z_AXIS] -= zprobe_zoffset; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***\n> probe.offset.z = ", probe.offset.z); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***"); + SERIAL_ECHOLNPAIR("> zprobe_zoffset = ", zprobe_zoffset); + } + #endif - #else + #elif ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("*** Z HOMED TO ENDSTOP ***"); + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("*** Z HOMED TO ENDSTOP (Z_MIN_PROBE_ENDSTOP) ***"); #endif } #endif - TERN_(I2C_POSITION_ENCODERS, I2CPEM.homed(axis)); - - TERN_(BABYSTEP_DISPLAY_TOTAL, babystep.reset_total(axis)); - - #if HAS_POSITION_SHIFT - position_shift[axis] = 0; - update_workspace_offset(axis); - #endif - - if (DEBUGGING(LEVELING)) { - #if HAS_HOME_OFFSET - DEBUG_ECHOLNPAIR("> home_offset[", axis_codes[axis], "] = ", home_offset[axis]); - #endif - DEBUG_POS("", current_position); - DEBUG_ECHOLNPAIR("<<< set_axis_is_at_home(", axis_codes[axis], ")"); - } -} - -/** - * Set an axis to be unhomed. - */ -void set_axis_never_homed(const AxisEnum axis) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", axis_codes[axis], ")"); - - CBI(axis_known_position, axis); - CBI(axis_homed, axis); - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", axis_codes[axis], ")"); - - TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); -} - -#ifdef TMC_HOME_PHASE - /** - * Move the axis back to its home_phase if set and driver is capable (TMC) - * - * Improves homing repeatability by homing to stepper coil's nearest absolute - * phase position. Trinamic drivers use a stepper phase table with 1024 values - * spanning 4 full steps with 256 positions each (ergo, 1024 positions). - */ - void backout_to_tmc_homing_phase(const AxisEnum axis) { - const xyz_long_t home_phase = TMC_HOME_PHASE; - - // check if home phase is disabled for this axis. - if (home_phase[axis] < 0) return; - - int16_t phasePerUStep, // TMC µsteps(phase) per Marlin µsteps - phaseCurrent, // The TMC µsteps(phase) count of the current position - effectorBackoutDir, // Direction in which the effector mm coordinates move away from endstop. - stepperBackoutDir; // Direction in which the TMC µstep count(phase) move away from endstop. - - switch (axis) { - #ifdef X_MICROSTEPS - case X_AXIS: - phasePerUStep = 256 / (X_MICROSTEPS); - phaseCurrent = stepperX.get_microstep_counter(); - effectorBackoutDir = -X_HOME_DIR; - stepperBackoutDir = INVERT_X_DIR ? effectorBackoutDir : -effectorBackoutDir; - break; - #endif - #ifdef Y_MICROSTEPS - case Y_AXIS: - phasePerUStep = 256 / (Y_MICROSTEPS); - phaseCurrent = stepperY.get_microstep_counter(); - effectorBackoutDir = -Y_HOME_DIR; - stepperBackoutDir = INVERT_Y_DIR ? effectorBackoutDir : -effectorBackoutDir; - break; - #endif - #ifdef Z_MICROSTEPS - case Z_AXIS: - phasePerUStep = 256 / (Z_MICROSTEPS); - phaseCurrent = stepperZ.get_microstep_counter(); - effectorBackoutDir = -Z_HOME_DIR; - stepperBackoutDir = INVERT_Z_DIR ? effectorBackoutDir : -effectorBackoutDir; - break; - #endif - default: return; - } - - // Phase distance to nearest home phase position when moving in the backout direction from endstop(may be negative). - int16_t phaseDelta = (home_phase[axis] - phaseCurrent) * stepperBackoutDir; - - // Check if home distance within endstop assumed repeatability noise of .05mm and warn. - if (ABS(phaseDelta) * planner.steps_to_mm[axis] / phasePerUStep < 0.05f) - SERIAL_ECHOLNPAIR("Selected home phase ", home_phase[axis], - " too close to endstop trigger phase ", phaseCurrent, - ". Pick a different phase for ", axis_codes[axis]); - - // Skip to next if target position is behind current. So it only moves away from endstop. - if (phaseDelta < 0) phaseDelta += 1024; - - // Convert TMC µsteps(phase) to whole Marlin µsteps to effector backout direction to mm - const float mmDelta = int16_t(phaseDelta / phasePerUStep) * effectorBackoutDir * planner.steps_to_mm[axis]; - - // Optional debug messages + #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR( - "Endstop ", axis_codes[axis], " hit at Phase:", phaseCurrent, - " Delta:", phaseDelta, " Distance:", mmDelta - ); + #if HAS_HOME_OFFSET + SERIAL_ECHOPAIR("> home_offset[", axis_codes[axis]); + SERIAL_ECHOLNPAIR("] = ", home_offset[axis]); + #endif + DEBUG_POS("", current_position); + SERIAL_ECHOPAIR("<<< set_axis_is_at_home(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); } + #endif - if (mmDelta != 0) { - // Retrace by the amount computed in mmDelta. - do_homing_move(axis, mmDelta, get_homing_bump_feedrate(axis)); - } - } -#endif + #if ENABLED(I2C_POSITION_ENCODERS) + I2CPEM.homed(axis); + #endif +} /** * Home an individual "raw axis" to its endstop. @@ -1541,106 +1286,110 @@ void homeaxis(const AxisEnum axis) { // Only Z homing (with probe) is permitted if (axis != Z_AXIS) { BUZZ(100, 880); return; } #else - #define _CAN_HOME(A) (axis == _AXIS(A) && ( \ - ENABLED(A##_SPI_SENSORLESS) \ - || (_AXIS(A) == Z_AXIS && ENABLED(HOMING_Z_WITH_PROBE)) \ - || (A##_MIN_PIN > -1 && A##_HOME_DIR < 0) \ - || (A##_MAX_PIN > -1 && A##_HOME_DIR > 0) \ - )) - if (!_CAN_HOME(X) && !_CAN_HOME(Y) && !_CAN_HOME(Z)) return; + #define CAN_HOME(A) \ + (axis == _AXIS(A) && ((A##_MIN_PIN > -1 && A##_HOME_DIR < 0) || (A##_MAX_PIN > -1 && A##_HOME_DIR > 0))) + if (!CAN_HOME(X) && !CAN_HOME(Y) && !CAN_HOME(Z)) return; #endif - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> homeaxis(", axis_codes[axis], ")"); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> homeaxis(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif - const int axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) - ? x_home_dir(active_extruder) : home_dir(axis); + const int axis_home_dir = ( + #if ENABLED(DUAL_X_CARRIAGE) + axis == X_AXIS ? x_home_dir(active_extruder) : + #endif + home_dir(axis) + ); // Homing Z towards the bed? Deploy the Z probe or endstop. - if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && probe.deploy())) - return; + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS && DEPLOY_PROBE()) return; + #endif // Set flags for X, Y, Z motor locking - #if HAS_EXTRA_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) switch (axis) { - TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) - TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) - TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) - stepper.set_separate_multi_axis(true); + #if ENABLED(X_DUAL_ENDSTOPS) + case X_AXIS: + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + case Y_AXIS: + #endif + #if ENABLED(Z_DUAL_ENDSTOPS) + case Z_AXIS: + #endif + stepper.set_homing_dual_axis(true); default: break; } #endif // Fast move towards endstop until triggered - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Home 1 Fast:"); - - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) - if (axis == Z_AXIS && bltouch.deploy()) return; // The initial DEPLOY + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Home 1 Fast:"); #endif - #if DISABLED(DELTA) && defined(SENSORLESS_BACKOFF_MM) - const xy_float_t backoff = SENSORLESS_BACKOFF_MM; - if (((ENABLED(X_SENSORLESS) && axis == X_AXIS) || (ENABLED(Y_SENSORLESS) && axis == Y_AXIS)) && backoff[axis]) - do_homing_move(axis, -ABS(backoff[axis]) * axis_home_dir, homing_feedrate(axis)); + #if HOMING_Z_WITH_PROBE && ENABLED(BLTOUCH) + // BLTOUCH needs to be deployed every time + if (axis == Z_AXIS && set_bltouch_deployed(true)) return; #endif - do_homing_move(axis, 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir); + do_homing_move(axis, 1.5f * max_length(axis) * axis_home_dir); - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) - if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) + #if HOMING_Z_WITH_PROBE && ENABLED(BLTOUCH) + // BLTOUCH needs to be stowed after trigger to rearm itself + if (axis == Z_AXIS) set_bltouch_deployed(false); #endif // When homing Z with probe respect probe clearance - const bool use_probe_bump = TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && home_bump_mm(Z_AXIS)); const float bump = axis_home_dir * ( - use_probe_bump ? _MAX(TERN0(HOMING_Z_WITH_PROBE, Z_CLEARANCE_BETWEEN_PROBES), home_bump_mm(Z_AXIS)) : home_bump_mm(axis) + #if HOMING_Z_WITH_PROBE + (axis == Z_AXIS && (Z_HOME_BUMP_MM)) ? MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_HOME_BUMP_MM) : + #endif + home_bump_mm(axis) ); // If a second homing move is configured... if (bump) { - // Move away from the endstop by the axis HOMING_BUMP_MM - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Move Away:"); + // Move away from the endstop by the axis HOME_BUMP_MM + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Move Away:"); + #endif do_homing_move(axis, -bump #if HOMING_Z_WITH_PROBE - , MMM_TO_MMS(axis == Z_AXIS ? Z_PROBE_SPEED_FAST : 0) + , axis == Z_AXIS ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0.0 #endif ); - #if ENABLED(DETECT_BROKEN_ENDSTOP) - // Check for a broken endstop - EndstopEnum es; - switch (axis) { - default: - case X_AXIS: es = X_ENDSTOP; break; - case Y_AXIS: es = Y_ENDSTOP; break; - case Z_AXIS: es = Z_ENDSTOP; break; - } - if (TEST(endstops.state(), es)) { - SERIAL_ECHO_MSG("Bad ", axis_codes[axis], " Endstop?"); - kill(GET_TEXT(MSG_KILL_HOMING_FAILED)); - } + // Slow move towards endstop until triggered + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Home 2 Slow:"); #endif - // Slow move towards endstop until triggered - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Home 2 Slow:"); - - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) - if (axis == Z_AXIS && bltouch.deploy()) return; // Intermediate DEPLOY (in LOW SPEED MODE) + #if HOMING_Z_WITH_PROBE && ENABLED(BLTOUCH) + // BLTOUCH needs to be deployed every time + if (axis == Z_AXIS && set_bltouch_deployed(true)) return; #endif do_homing_move(axis, 2 * bump, get_homing_bump_feedrate(axis)); - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) - if (axis == Z_AXIS) bltouch.stow(); // The final STOW + #if HOMING_Z_WITH_PROBE && ENABLED(BLTOUCH) + // BLTOUCH needs to be stowed after trigger to rearm itself + if (axis == Z_AXIS) set_bltouch_deployed(false); #endif } - #if HAS_EXTRA_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) const bool pos_dir = axis_home_dir > 0; #if ENABLED(X_DUAL_ENDSTOPS) if (axis == X_AXIS) { - const float adj = ABS(endstops.x2_endstop_adj); + const float adj = ABS(endstops.x_endstop_adj); if (adj) { - if (pos_dir ? (endstops.x2_endstop_adj > 0) : (endstops.x2_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); + if (pos_dir ? (endstops.x_endstop_adj > 0) : (endstops.x_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); do_homing_move(axis, pos_dir ? -adj : adj); stepper.set_x_lock(false); stepper.set_x2_lock(false); @@ -1649,134 +1398,33 @@ void homeaxis(const AxisEnum axis) { #endif #if ENABLED(Y_DUAL_ENDSTOPS) if (axis == Y_AXIS) { - const float adj = ABS(endstops.y2_endstop_adj); + const float adj = ABS(endstops.y_endstop_adj); if (adj) { - if (pos_dir ? (endstops.y2_endstop_adj > 0) : (endstops.y2_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); + if (pos_dir ? (endstops.y_endstop_adj > 0) : (endstops.y_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); do_homing_move(axis, pos_dir ? -adj : adj); stepper.set_y_lock(false); stepper.set_y2_lock(false); } } #endif - - #if ENABLED(Z_MULTI_ENDSTOPS) + #if ENABLED(Z_DUAL_ENDSTOPS) if (axis == Z_AXIS) { - - #if NUM_Z_STEPPER_DRIVERS == 2 - - const float adj = ABS(endstops.z2_endstop_adj); - if (adj) { - if (pos_dir ? (endstops.z2_endstop_adj > 0) : (endstops.z2_endstop_adj < 0)) stepper.set_z1_lock(true); else stepper.set_z2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - stepper.set_z1_lock(false); - stepper.set_z2_lock(false); - } - - #else - - // Handy arrays of stepper lock function pointers - - typedef void (*adjustFunc_t)(const bool); - - adjustFunc_t lock[] = { - stepper.set_z1_lock, stepper.set_z2_lock, stepper.set_z3_lock - #if NUM_Z_STEPPER_DRIVERS >= 4 - , stepper.set_z4_lock - #endif - }; - float adj[] = { - 0, endstops.z2_endstop_adj, endstops.z3_endstop_adj - #if NUM_Z_STEPPER_DRIVERS >= 4 - , endstops.z4_endstop_adj - #endif - }; - - adjustFunc_t tempLock; - float tempAdj; - - // Manual bubble sort by adjust value - if (adj[1] < adj[0]) { - tempLock = lock[0], tempAdj = adj[0]; - lock[0] = lock[1], adj[0] = adj[1]; - lock[1] = tempLock, adj[1] = tempAdj; - } - if (adj[2] < adj[1]) { - tempLock = lock[1], tempAdj = adj[1]; - lock[1] = lock[2], adj[1] = adj[2]; - lock[2] = tempLock, adj[2] = tempAdj; - } - #if NUM_Z_STEPPER_DRIVERS >= 4 - if (adj[3] < adj[2]) { - tempLock = lock[2], tempAdj = adj[2]; - lock[2] = lock[3], adj[2] = adj[3]; - lock[3] = tempLock, adj[3] = tempAdj; - } - if (adj[2] < adj[1]) { - tempLock = lock[1], tempAdj = adj[1]; - lock[1] = lock[2], adj[1] = adj[2]; - lock[2] = tempLock, adj[2] = tempAdj; - } - #endif - if (adj[1] < adj[0]) { - tempLock = lock[0], tempAdj = adj[0]; - lock[0] = lock[1], adj[0] = adj[1]; - lock[1] = tempLock, adj[1] = tempAdj; - } - - if (pos_dir) { - // normalize adj to smallest value and do the first move - (*lock[0])(true); - do_homing_move(axis, adj[1] - adj[0]); - // lock the second stepper for the final correction - (*lock[1])(true); - do_homing_move(axis, adj[2] - adj[1]); - #if NUM_Z_STEPPER_DRIVERS >= 4 - // lock the third stepper for the final correction - (*lock[2])(true); - do_homing_move(axis, adj[3] - adj[2]); - #endif - } - else { - #if NUM_Z_STEPPER_DRIVERS >= 4 - (*lock[3])(true); - do_homing_move(axis, adj[2] - adj[3]); - #endif - (*lock[2])(true); - do_homing_move(axis, adj[1] - adj[2]); - (*lock[1])(true); - do_homing_move(axis, adj[0] - adj[1]); - } - - stepper.set_z1_lock(false); + const float adj = ABS(endstops.z_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.z_endstop_adj > 0) : (endstops.z_endstop_adj < 0)) stepper.set_z_lock(true); else stepper.set_z2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_z_lock(false); stepper.set_z2_lock(false); - stepper.set_z3_lock(false); - #if NUM_Z_STEPPER_DRIVERS >= 4 - stepper.set_z4_lock(false); - #endif - - #endif + } } #endif - - // Reset flags for X, Y, Z motor locking - switch (axis) { - default: break; - TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) - TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) - TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) - stepper.set_separate_multi_axis(false); - } - #endif - - #ifdef TMC_HOME_PHASE - // move back to homing phase if configured and capable - backout_to_tmc_homing_phase(axis); + stepper.set_homing_dual_axis(false); #endif #if IS_SCARA set_axis_is_at_home(axis); - sync_plan_position(); + SYNC_PLAN_POSITION_KINEMATIC(); #elif ENABLED(DELTA) @@ -1784,51 +1432,32 @@ void homeaxis(const AxisEnum axis) { // so here it re-homes each tower in turn. // Delta homing treats the axes as normal linear axes. - const float adjDistance = delta_endstop_adj[axis], - minDistance = (MIN_STEPS_PER_SEGMENT) * planner.steps_to_mm[axis]; - - // Retrace by the amount specified in delta_endstop_adj if more than min steps. - if (adjDistance * (Z_HOME_DIR) < 0 && ABS(adjDistance) > minDistance) { // away from endstop, more than min distance - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("adjDistance:", adjDistance); - do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis)); + // retrace by the amount specified in delta_endstop_adj + additional dist in order to have minimum steps + if (delta_endstop_adj[axis] * Z_HOME_DIR <= 0) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("delta_endstop_adj:"); + #endif + do_homing_move(axis, delta_endstop_adj[axis] - (MIN_STEPS_PER_SEGMENT + 1) * planner.steps_to_mm[axis] * Z_HOME_DIR); } - #else // CARTESIAN / CORE / MARKFORGED_XY + #else + // For cartesian/core machines, + // set the axis to its home position set_axis_is_at_home(axis); sync_plan_position(); destination[axis] = current_position[axis]; - if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position); + #endif #endif // Put away the Z probe #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS && probe.stow()) return; - #endif - - #if DISABLED(DELTA) && defined(HOMING_BACKOFF_POST_MM) - const xyz_float_t endstop_backoff = HOMING_BACKOFF_POST_MM; - if (endstop_backoff[axis]) { - current_position[axis] -= ABS(endstop_backoff[axis]) * axis_home_dir; - line_to_current_position( - #if HOMING_Z_WITH_PROBE - (axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : - #endif - homing_feedrate(axis) - ); - - #if ENABLED(SENSORLESS_HOMING) - planner.synchronize(); - if (false - #if EITHER(IS_CORE, MARKFORGED_XY) - || axis != NORMAL_AXIS - #endif - ) safe_delay(200); // Short delay to allow belts to spring back - #endif - } + if (axis == Z_AXIS && STOW_PROBE()) return; #endif // Clear retracted status if homing the Z axis @@ -1836,16 +1465,94 @@ void homeaxis(const AxisEnum axis) { if (axis == Z_AXIS) fwretract.current_hop = 0.0; #endif - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< homeaxis(", axis_codes[axis], ")"); - + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("<<< homeaxis(", axis_codes[axis]); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif } // homeaxis() -#if HAS_WORKSPACE_OFFSET - void update_workspace_offset(const AxisEnum axis) { - workspace_offset[axis] = home_offset[axis] + position_shift[axis]; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " home_offset = ", home_offset[axis], " position_shift = ", position_shift[axis]); +#if HAS_WORKSPACE_OFFSET || ENABLED(DUAL_X_CARRIAGE) || ENABLED(DELTA) + + /** + * Software endstops can be used to monitor the open end of + * an axis that has a hardware endstop on the other end. Or + * they can prevent axes from moving past endstops and grinding. + * + * To keep doing their job as the coordinate system changes, + * the software endstop positions must be refreshed to remain + * at the same positions relative to the machine. + */ + void update_software_endstops(const AxisEnum axis) { + #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + workspace_offset[axis] = home_offset[axis] + position_shift[axis]; + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + if (axis == X_AXIS) { + + // In Dual X mode hotend_offset[X] is T1's home position + const float dual_max_x = MAX(hotend_offset[X_AXIS][1], X2_MAX_POS); + + if (active_extruder != 0) { + // T1 can move from X2_MIN_POS to X2_MAX_POS or X2 home position (whichever is larger) + soft_endstop_min[X_AXIS] = X2_MIN_POS; + soft_endstop_max[X_AXIS] = dual_max_x; + } + else if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) { + // In Duplication Mode, T0 can move as far left as X_MIN_POS + // but not so far to the right that T1 would move past the end + soft_endstop_min[X_AXIS] = base_min_pos(X_AXIS); + soft_endstop_max[X_AXIS] = MIN(base_max_pos(X_AXIS), dual_max_x - duplicate_extruder_x_offset); + } + else { + // In other modes, T0 can move from X_MIN_POS to X_MAX_POS + soft_endstop_min[axis] = base_min_pos(axis); + soft_endstop_max[axis] = base_max_pos(axis); + } + } + #elif ENABLED(DELTA) + soft_endstop_min[axis] = base_min_pos(axis); + soft_endstop_max[axis] = (axis == Z_AXIS ? delta_height : base_max_pos(axis)); + #else + soft_endstop_min[axis] = base_min_pos(axis); + soft_endstop_max[axis] = base_max_pos(axis); + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("For ", axis_codes[axis]); + #if HAS_HOME_OFFSET + SERIAL_ECHOPAIR(" axis:\n home_offset = ", home_offset[axis]); + #endif + #if HAS_POSITION_SHIFT + SERIAL_ECHOPAIR("\n position_shift = ", position_shift[axis]); + #endif + SERIAL_ECHOPAIR("\n soft_endstop_min = ", soft_endstop_min[axis]); + SERIAL_ECHOLNPAIR("\n soft_endstop_max = ", soft_endstop_max[axis]); + } + #endif + + #if ENABLED(DELTA) + switch (axis) { + #if HAS_SOFTWARE_ENDSTOPS + case X_AXIS: + case Y_AXIS: + // Get a minimum radius for clamping + soft_endstop_radius = MIN3(ABS(MAX(soft_endstop_min[X_AXIS], soft_endstop_min[Y_AXIS])), soft_endstop_max[X_AXIS], soft_endstop_max[Y_AXIS]); + soft_endstop_radius_2 = sq(soft_endstop_radius); + break; + #endif + case Z_AXIS: + delta_clip_start_height = soft_endstop_max[axis] - delta_safe_distance_from_top(); + default: break; + } + #endif } -#endif + +#endif // HAS_WORKSPACE_OFFSET || DUAL_X_CARRIAGE || DELTA #if HAS_M206_COMMAND /** @@ -1854,6 +1561,6 @@ void homeaxis(const AxisEnum axis) { */ void set_home_offset(const AxisEnum axis, const float v) { home_offset[axis] = v; - update_workspace_offset(axis); + update_software_endstops(axis); } #endif // HAS_M206_COMMAND diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 85b70c057a..5bceeaded4 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * motion.h @@ -28,48 +27,32 @@ * Some of these methods may migrate to the planner class. */ +#ifndef MOTION_H +#define MOTION_H + #include "../inc/MarlinConfig.h" #if IS_SCARA - #include "scara.h" + #include "../module/scara.h" #endif -// Axis homed and known-position states -extern uint8_t axis_homed, axis_known_position; -constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); -FORCE_INLINE bool no_axes_homed() { return !axis_homed; } -FORCE_INLINE bool all_axes_homed() { return (axis_homed & xyz_bits) == xyz_bits; } -FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) == xyz_bits; } -FORCE_INLINE void set_all_homed() { axis_homed = axis_known_position = xyz_bits; } -FORCE_INLINE void set_all_unhomed() { axis_homed = axis_known_position = 0; } - -FORCE_INLINE bool homing_needed() { - return !TERN(HOME_AFTER_DEACTIVATE, all_axes_known, all_axes_homed)(); -} - // Error margin to work around float imprecision -constexpr float fslop = 0.0001; +constexpr float slop = 0.0001; extern bool relative_mode; -extern xyze_pos_t current_position, // High-level current tool position - destination; // Destination for a move - -// G60/G61 Position Save and Return -#if SAVED_POSITIONS - extern uint8_t saved_slots[(SAVED_POSITIONS + 7) >> 3]; - extern xyz_pos_t stored_position[SAVED_POSITIONS]; -#endif +extern float current_position[XYZE], // High-level current tool position + destination[XYZE]; // Destination for a move // Scratch space for a cartesian result -extern xyz_pos_t cartes; +extern float cartes[XYZ]; // Until kinematics.cpp is created, declare this here #if IS_KINEMATIC - extern abc_pos_t delta; + extern float delta[ABC]; #endif -#if HAS_ABL_NOT_UBL +#if OLDSCHOOL_ABL extern float xy_probe_feedrate_mm_s; #define XY_PROBE_FEEDRATE_MM_S xy_probe_feedrate_mm_s #elif defined(XY_PROBE_SPEED) @@ -78,133 +61,56 @@ extern xyz_pos_t cartes; #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() #endif -#if ENABLED(Z_SAFE_HOMING) - constexpr xy_float_t safe_homing_xy = { Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT }; -#endif - /** * Feed rates are often configured with mm/m * but the planner and stepper like mm/s units. */ -extern const feedRate_t homing_feedrate_mm_s[XYZ]; -FORCE_INLINE feedRate_t homing_feedrate(const AxisEnum a) { return pgm_read_float(&homing_feedrate_mm_s[a]); } -feedRate_t get_homing_bump_feedrate(const AxisEnum axis); +extern const float homing_feedrate_mm_s[4]; +FORCE_INLINE float homing_feedrate(const AxisEnum a) { return pgm_read_float(&homing_feedrate_mm_s[a]); } -extern feedRate_t feedrate_mm_s; +extern float feedrate_mm_s; /** - * Feedrate scaling + * Feedrate scaling and conversion */ extern int16_t feedrate_percentage; +#define MMS_SCALED(MM_S) ((MM_S)*feedrate_percentage*0.01f) -// The active extruder (tool). Set with T command. -#if HAS_MULTI_EXTRUDER - extern uint8_t active_extruder; -#else - constexpr uint8_t active_extruder = 0; +extern uint8_t active_extruder; + +#if HAS_HOTEND_OFFSET + extern float hotend_offset[XYZ][HOTENDS]; #endif -#if ENABLED(LCD_SHOW_E_TOTAL) - extern float e_move_accumulator; -#endif +extern float soft_endstop_min[XYZ], soft_endstop_max[XYZ]; -#ifdef __IMXRT1062__ - #define DEFS_PROGMEM -#else - #define DEFS_PROGMEM PROGMEM -#endif +FORCE_INLINE float pgm_read_any(const float *p) { return pgm_read_float_near(p); } +FORCE_INLINE signed char pgm_read_any(const signed char *p) { return pgm_read_byte_near(p); } -inline float pgm_read_any(const float *p) { return TERN(__IMXRT1062__, *p, pgm_read_float(p)); } -inline int8_t pgm_read_any(const int8_t *p) { return TERN(__IMXRT1062__, *p, pgm_read_byte(p)); } +#define XYZ_DEFS(type, array, CONFIG) \ + extern const type array##_P[XYZ]; \ + FORCE_INLINE type array(AxisEnum axis) { return pgm_read_any(&array##_P[axis]); } \ + typedef void __void_##CONFIG##__ -#define XYZ_DEFS(T, NAME, OPT) \ - inline T NAME(const AxisEnum axis) { \ - static const XYZval NAME##_P DEFS_PROGMEM = { X_##OPT, Y_##OPT, Z_##OPT }; \ - return pgm_read_any(&NAME##_P[axis]); \ - } XYZ_DEFS(float, base_min_pos, MIN_POS); XYZ_DEFS(float, base_max_pos, MAX_POS); XYZ_DEFS(float, base_home_pos, HOME_POS); XYZ_DEFS(float, max_length, MAX_LENGTH); -XYZ_DEFS(int8_t, home_dir, HOME_DIR); - -inline float home_bump_mm(const AxisEnum axis) { - static const xyz_pos_t home_bump_mm_P DEFS_PROGMEM = HOMING_BUMP_MM; - return pgm_read_any(&home_bump_mm_P[axis]); -} - -#if HAS_WORKSPACE_OFFSET - void update_workspace_offset(const AxisEnum axis); -#else - inline void update_workspace_offset(const AxisEnum) {} -#endif - -#if HAS_HOTEND_OFFSET - extern xyz_pos_t hotend_offset[HOTENDS]; - void reset_hotend_offsets(); -#elif HOTENDS - constexpr xyz_pos_t hotend_offset[HOTENDS] = { { 0 } }; -#else - constexpr xyz_pos_t hotend_offset[1] = { { 0 } }; -#endif +XYZ_DEFS(float, home_bump_mm, HOME_BUMP_MM); +XYZ_DEFS(signed char, home_dir, HOME_DIR); #if HAS_SOFTWARE_ENDSTOPS + extern bool soft_endstops_enabled; + void clamp_to_software_endstops(float target[XYZ]); +#else + #define soft_endstops_enabled false + #define clamp_to_software_endstops(x) NOOP +#endif - typedef struct { - bool _enabled, _loose; - bool enabled() { return _enabled && !_loose; } - - xyz_pos_t min, max; - void get_manual_axis_limits(const AxisEnum axis, float &amin, float &amax) { - amin = -100000; amax = 100000; // "No limits" - #if HAS_SOFTWARE_ENDSTOPS - if (enabled()) switch (axis) { - case X_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_X, amin = min.x); - TERN_(MAX_SOFTWARE_ENDSTOP_X, amax = max.x); - break; - case Y_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_Y, amin = min.y); - TERN_(MAX_SOFTWARE_ENDSTOP_Y, amax = max.y); - break; - case Z_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_Z, amin = min.z); - TERN_(MAX_SOFTWARE_ENDSTOP_Z, amax = max.z); - default: break; - } - #endif - } - } soft_endstops_t; - - extern soft_endstops_t soft_endstop; - void apply_motion_limits(xyz_pos_t &target); - void update_software_endstops(const AxisEnum axis - #if HAS_HOTEND_OFFSET - , const uint8_t old_tool_index=0, const uint8_t new_tool_index=0 - #endif - ); - #define SET_SOFT_ENDSTOP_LOOSE(loose) (soft_endstop._loose = loose) - -#else // !HAS_SOFTWARE_ENDSTOPS - - typedef struct { - bool enabled() { return false; } - void get_manual_axis_limits(const AxisEnum axis, float &amin, float &amax) { - // No limits - amin = current_position[axis] - 1000; - amax = current_position[axis] + 1000; - } - } soft_endstops_t; - extern soft_endstops_t soft_endstop; - #define apply_motion_limits(V) NOOP - #define update_software_endstops(...) NOOP - #define SET_SOFT_ENDSTOP_LOOSE(V) NOOP - -#endif // !HAS_SOFTWARE_ENDSTOPS - -void report_real_position(); void report_current_position(); -void report_current_position_projected(); + +inline void set_current_from_destination() { COPY(current_position, destination); } +inline void set_destination_from_current() { COPY(destination, current_position); } void get_cartesian_from_steppers(); void set_current_from_steppers_for_axis(const AxisEnum axis); @@ -218,113 +124,106 @@ void set_current_from_steppers_for_axis(const AxisEnum axis); void sync_plan_position(); void sync_plan_position_e(); +#if IS_KINEMATIC + void sync_plan_position_kinematic(); + #define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position_kinematic() +#else + #define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position() +#endif + /** * Move the planner to the current position from wherever it last moved * (or from wherever it has been told it is located). */ -void line_to_current_position(const feedRate_t &fr_mm_s=feedrate_mm_s); +void line_to_current_position(); -#if EXTRUDERS - void unscaled_e_move(const float &length, const feedRate_t &fr_mm_s); -#endif - -void prepare_line_to_destination(); - -void _internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f - #if IS_KINEMATIC - , const bool is_fast=false - #endif -); - -inline void prepare_internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f) { - _internal_move_to_destination(fr_mm_s); -} +/** + * Move the planner to the position stored in the destination array, which is + * used by G0/G1/G2/G3/G5 and many other functions to set a destination. + */ +void buffer_line_to_destination(const float fr_mm_s); #if IS_KINEMATIC - void prepare_fast_move_to_destination(const feedRate_t &scaled_fr_mm_s=MMS_SCALED(feedrate_mm_s)); - - inline void prepare_internal_fast_move_to_destination(const feedRate_t &fr_mm_s=0.0f) { - _internal_move_to_destination(fr_mm_s, true); - } + void prepare_uninterpolated_move_to_destination(const float fr_mm_s=0); #endif +void prepare_move_to_destination(); + /** * Blocking movement and shorthand functions */ -void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to(const float rx, const float ry, const float rz, const float &fr_mm_s=0); +void do_blocking_move_to_x(const float &rx, const float &fr_mm_s=0); +void do_blocking_move_to_z(const float &rz, const float &fr_mm_s=0); +void do_blocking_move_to_xy(const float &rx, const float &ry, const float &fr_mm_s=0); -void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s=0.0f); +void setup_for_endstop_or_probe_move(); +void clean_up_after_endstop_or_probe_move(); -void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); -FORCE_INLINE void do_blocking_move_to_xy(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } -FORCE_INLINE void do_blocking_move_to_xy(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } - -void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f); -FORCE_INLINE void do_blocking_move_to_xy_z(const xyz_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } -FORCE_INLINE void do_blocking_move_to_xy_z(const xyze_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } - -void remember_feedrate_and_scaling(); -void remember_feedrate_scaling_off(); -void restore_feedrate_and_scaling(); - -void do_z_clearance(const float &zclear, const bool z_known=true, const bool raise_on_unknown=true, const bool lower_allowed=false); +void bracket_probe_move(const bool before); +void setup_for_endstop_or_probe_move(); +void clean_up_after_endstop_or_probe_move(); // // Homing // -void homeaxis(const AxisEnum axis); -void set_axis_is_at_home(const AxisEnum axis); -void set_axis_never_homed(const AxisEnum axis); -uint8_t axes_should_home(uint8_t axis_bits=0x07); -bool homing_needed_error(uint8_t axis_bits=0x07); + +#define HAS_AXIS_UNHOMED_ERR ( \ + ENABLED(Z_PROBE_ALLEN_KEY) \ + || ENABLED(Z_PROBE_SLED) \ + || HAS_PROBING_PROCEDURE \ + || HOTENDS > 1 \ + || ENABLED(NOZZLE_CLEAN_FEATURE) \ + || ENABLED(NOZZLE_PARK_FEATURE) \ + || (ENABLED(ADVANCED_PAUSE_FEATURE) && ENABLED(HOME_BEFORE_FILAMENT_CHANGE)) \ + || HAS_M206_COMMAND \ + ) || ENABLED(NO_MOTION_BEFORE_HOMING) + +#if HAS_AXIS_UNHOMED_ERR + bool axis_unhomed_error(const bool x=true, const bool y=true, const bool z=true); +#endif #if ENABLED(NO_MOTION_BEFORE_HOMING) - #define MOTION_CONDITIONS (IsRunning() && !homing_needed_error()) + #define MOTION_CONDITIONS (IsRunning() && !axis_unhomed_error()) #else #define MOTION_CONDITIONS IsRunning() #endif +void set_axis_is_at_home(const AxisEnum axis); + +void homeaxis(const AxisEnum axis); + +#if ENABLED(SENSORLESS_HOMING) + void sensorless_homing_per_axis(const AxisEnum axis, const bool enable=true); +#endif + +// +// Macros +// + /** * Workspace offsets */ -#if HAS_HOME_OFFSET || HAS_POSITION_SHIFT +#if HAS_WORKSPACE_OFFSET #if HAS_HOME_OFFSET - extern xyz_pos_t home_offset; + extern float home_offset[XYZ]; #endif #if HAS_POSITION_SHIFT - extern xyz_pos_t position_shift; + extern float position_shift[XYZ]; #endif #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT - extern xyz_pos_t workspace_offset; - #define _WS workspace_offset + extern float workspace_offset[XYZ]; + #define WORKSPACE_OFFSET(AXIS) workspace_offset[AXIS] #elif HAS_HOME_OFFSET - #define _WS home_offset - #else - #define _WS position_shift + #define WORKSPACE_OFFSET(AXIS) home_offset[AXIS] + #elif HAS_POSITION_SHIFT + #define WORKSPACE_OFFSET(AXIS) position_shift[AXIS] #endif - #define NATIVE_TO_LOGICAL(POS, AXIS) ((POS) + _WS[AXIS]) - #define LOGICAL_TO_NATIVE(POS, AXIS) ((POS) - _WS[AXIS]) - FORCE_INLINE void toLogical(xy_pos_t &raw) { raw += _WS; } - FORCE_INLINE void toLogical(xyz_pos_t &raw) { raw += _WS; } - FORCE_INLINE void toLogical(xyze_pos_t &raw) { raw += _WS; } - FORCE_INLINE void toNative(xy_pos_t &raw) { raw -= _WS; } - FORCE_INLINE void toNative(xyz_pos_t &raw) { raw -= _WS; } - FORCE_INLINE void toNative(xyze_pos_t &raw) { raw -= _WS; } + #define NATIVE_TO_LOGICAL(POS, AXIS) ((POS) + WORKSPACE_OFFSET(AXIS)) + #define LOGICAL_TO_NATIVE(POS, AXIS) ((POS) - WORKSPACE_OFFSET(AXIS)) #else #define NATIVE_TO_LOGICAL(POS, AXIS) (POS) #define LOGICAL_TO_NATIVE(POS, AXIS) (POS) - FORCE_INLINE void toLogical(xy_pos_t&) {} - FORCE_INLINE void toLogical(xyz_pos_t&) {} - FORCE_INLINE void toLogical(xyze_pos_t&) {} - FORCE_INLINE void toNative(xy_pos_t&) {} - FORCE_INLINE void toNative(xyz_pos_t&) {} - FORCE_INLINE void toNative(xyze_pos_t&) {} #endif #define LOGICAL_X_POSITION(POS) NATIVE_TO_LOGICAL(POS, X_AXIS) #define LOGICAL_Y_POSITION(POS) NATIVE_TO_LOGICAL(POS, Y_AXIS) @@ -339,14 +238,14 @@ bool homing_needed_error(uint8_t axis_bits=0x07); #if IS_KINEMATIC // (DELTA or SCARA) - #if HAS_SCARA_OFFSET - extern abc_pos_t scara_home_offset; // A and B angular offsets, Z mm offset + #if IS_SCARA + extern const float L1, L2; #endif // Return true if the given point is within the printable area inline bool position_is_reachable(const float &rx, const float &ry, const float inset=0) { #if ENABLED(DELTA) - return HYPOT2(rx, ry) <= sq(DELTA_PRINTABLE_RADIUS - inset + fslop); + return HYPOT2(rx, ry) <= sq(DELTA_PRINTABLE_RADIUS - inset); #elif IS_SCARA const float R2 = HYPOT2(rx - SCARA_OFFSET_X, ry - SCARA_OFFSET_Y); return ( @@ -358,37 +257,57 @@ bool homing_needed_error(uint8_t axis_bits=0x07); #endif } - inline bool position_is_reachable(const xy_pos_t &pos, const float inset=0) { - return position_is_reachable(pos.x, pos.y, inset); - } + #if HAS_BED_PROBE + // Return true if the both nozzle and the probe can reach the given point. + // Note: This won't work on SCARA since the probe offset rotates with the arm. + inline bool position_is_reachable_by_probe(const float &rx, const float &ry) { + return position_is_reachable(rx - (X_PROBE_OFFSET_FROM_EXTRUDER), ry - (Y_PROBE_OFFSET_FROM_EXTRUDER)) + && position_is_reachable(rx, ry, ABS(MIN_PROBE_EDGE)); + } + #endif #else // CARTESIAN // Return true if the given position is within the machine bounds. inline bool position_is_reachable(const float &rx, const float &ry) { - if (!WITHIN(ry, Y_MIN_POS - fslop, Y_MAX_POS + fslop)) return false; + if (!WITHIN(ry, Y_MIN_POS - slop, Y_MAX_POS + slop)) return false; #if ENABLED(DUAL_X_CARRIAGE) if (active_extruder) - return WITHIN(rx, X2_MIN_POS - fslop, X2_MAX_POS + fslop); + return WITHIN(rx, X2_MIN_POS - slop, X2_MAX_POS + slop); else - return WITHIN(rx, X1_MIN_POS - fslop, X1_MAX_POS + fslop); + return WITHIN(rx, X1_MIN_POS - slop, X1_MAX_POS + slop); #else - return WITHIN(rx, X_MIN_POS - fslop, X_MAX_POS + fslop); + return WITHIN(rx, X_MIN_POS - slop, X_MAX_POS + slop); #endif } - inline bool position_is_reachable(const xy_pos_t &pos) { return position_is_reachable(pos.x, pos.y); } + + #if HAS_BED_PROBE + /** + * Return whether the given position is within the bed, and whether the nozzle + * can reach the position required to put the probe at the given position. + * + * Example: For a probe offset of -10,+10, then for the probe to reach 0,0 the + * nozzle must be be able to reach +10,-10. + */ + inline bool position_is_reachable_by_probe(const float &rx, const float &ry) { + return position_is_reachable(rx - (X_PROBE_OFFSET_FROM_EXTRUDER), ry - (Y_PROBE_OFFSET_FROM_EXTRUDER)) + && WITHIN(rx, MIN_PROBE_X - slop, MAX_PROBE_X + slop) + && WITHIN(ry, MIN_PROBE_Y - slop, MAX_PROBE_Y + slop); + } + #endif #endif // CARTESIAN +#if !HAS_BED_PROBE + FORCE_INLINE bool position_is_reachable_by_probe(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } +#endif + /** - * Duplication mode + * Dual X Carriage / Dual Nozzle */ -#if HAS_DUPLICATION_MODE +#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) extern bool extruder_duplication_enabled, // Used in Dual X mode 2 - mirrored_duplication_mode; // Used in Dual X mode 3 - #if ENABLED(MULTI_NOZZLE_DUPLICATION) - extern uint8_t duplication_e_mask; - #endif + symmetric_duplication_mode; // Used in Dual X mode 2 #endif /** @@ -397,42 +316,53 @@ bool homing_needed_error(uint8_t axis_bits=0x07); #if ENABLED(DUAL_X_CARRIAGE) enum DualXMode : char { - DXC_FULL_CONTROL_MODE, - DXC_AUTO_PARK_MODE, - DXC_DUPLICATION_MODE, - DXC_MIRRORED_MODE + DXC_FULL_CONTROL_MODE, // DUAL_X_CARRIAGE only + DXC_AUTO_PARK_MODE, // DUAL_X_CARRIAGE only + DXC_DUPLICATION_MODE }; extern DualXMode dual_x_carriage_mode; - extern float inactive_extruder_x_pos, // Used in mode 0 & 1 - duplicate_extruder_x_offset; // Used in mode 2 & 3 - extern xyz_pos_t raised_parked_position; // Used in mode 1 - extern bool active_extruder_parked; // Used in mode 1, 2 & 3 - extern millis_t delayed_move_time; // Used in mode 1 - extern int16_t duplicate_extruder_temp_offset; // Used in mode 2 & 3 + extern float inactive_extruder_x_pos, // used in mode 0 & 1 + raised_parked_position[XYZE], // used in mode 1 + duplicate_extruder_x_offset; // used in mode 2 & 3 + extern bool active_extruder_parked; // used in mode 1, 2 & 3 + extern millis_t delayed_move_time; // used in mode 1 + extern int16_t duplicate_extruder_temp_offset; // used in mode 2 & 3 - FORCE_INLINE bool dxc_is_duplicating() { return dual_x_carriage_mode >= DXC_DUPLICATION_MODE; } - - float x_home_pos(const uint8_t extruder); + float x_home_pos(const int extruder); FORCE_INLINE int x_home_dir(const uint8_t extruder) { return extruder ? X2_HOME_DIR : X_HOME_DIR; } -#else +#elif ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) - #if ENABLED(MULTI_NOZZLE_DUPLICATION) - enum DualXMode : char { DXC_DUPLICATION_MODE = 2 }; - #endif + enum DualXMode : char { + DXC_DUPLICATION_MODE = 2 + }; - FORCE_INLINE int x_home_dir(const uint8_t) { return home_dir(X_AXIS); } +#endif +#if HAS_WORKSPACE_OFFSET || ENABLED(DUAL_X_CARRIAGE) || ENABLED(DELTA) + void update_software_endstops(const AxisEnum axis); #endif #if HAS_M206_COMMAND void set_home_offset(const AxisEnum axis, const float v); #endif -#if USE_SENSORLESS - struct sensorless_t; - sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis); - void end_sensorless_homing_per_axis(const AxisEnum axis, sensorless_t enable_stealth); +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + #if ENABLED(DELTA) + #define ADJUST_DELTA(V) \ + if (planner.leveling_active) { \ + const float zadj = bilinear_z_offset(V); \ + delta[A_AXIS] += zadj; \ + delta[B_AXIS] += zadj; \ + delta[C_AXIS] += zadj; \ + } + #else + #define ADJUST_DELTA(V) if (planner.leveling_active) { delta[Z_AXIS] += bilinear_z_offset(V); } + #endif +#else + #define ADJUST_DELTA(V) NOOP #endif + +#endif // MOTION_H diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 4ad7c4ccf0..4db6e58d48 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -65,11 +65,12 @@ #include "planner.h" #include "stepper.h" #include "motion.h" -#include "temperature.h" +#include "../module/temperature.h" #include "../lcd/ultralcd.h" +#include "../core/language.h" #include "../gcode/parser.h" -#include "../MarlinCore.h" +#include "../Marlin.h" #if HAS_LEVELING #include "../feature/bedlevel/bedlevel.h" @@ -91,33 +92,13 @@ #include "../feature/power.h" #endif -#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) - #include "../feature/closedloop.h" -#endif - -#if ENABLED(BACKLASH_COMPENSATION) - #include "../feature/backlash.h" -#endif - -#if ENABLED(CANCEL_OBJECTS) - #include "../feature/cancel_object.h" -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../feature/powerloss.h" -#endif - -#if HAS_CUTTER - #include "../feature/spindle_laser.h" -#endif - // Delay for delivery of first block to the stepper ISR, if the queue contains 2 or // fewer movements. The delay is measured in milliseconds, and must be less than 250ms #define BLOCK_DELAY_FOR_1ST_MOVE 100 Planner planner; -// public: + // public: /** * A ring buffer of moves described in steps @@ -130,44 +111,46 @@ volatile uint8_t Planner::block_buffer_head, // Index of the next block to be uint16_t Planner::cleaning_buffer_counter; // A counter to disable queuing of blocks uint8_t Planner::delay_before_delivering; // This counter delays delivery of blocks when queue becomes empty to allow the opportunity of merging blocks -planner_settings_t Planner::settings; // Initialized by settings.load() +uint32_t Planner::max_acceleration_mm_per_s2[XYZE_N], // (mm/s^2) M201 XYZE + Planner::max_acceleration_steps_per_s2[XYZE_N], // (steps/s^2) Derived from mm_per_s2 + Planner::min_segment_time_us; // (µs) M205 B -#if ENABLED(LASER_POWER_INLINE) - laser_state_t Planner::laser_inline; // Current state for blocks -#endif +float Planner::max_feedrate_mm_s[XYZE_N], // (mm/s) M203 XYZE - Max speeds + Planner::axis_steps_per_mm[XYZE_N], // (steps) M92 XYZE - Steps per millimeter + Planner::steps_to_mm[XYZE_N], // (mm) Millimeters per step + Planner::min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate + Planner::acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves. + Planner::retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes + Planner::travel_acceleration, // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves. + Planner::min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate -uint32_t Planner::max_acceleration_steps_per_s2[XYZE_N]; // (steps/s^2) Derived from mm_per_s2 - -float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step - -#if HAS_JUNCTION_DEVIATION - float Planner::junction_deviation_mm; // (mm) M205 J - #if HAS_LINEAR_E_JERK - float Planner::max_e_jerk[DISTINCT_E]; // Calculated from junction_deviation_mm +#if ENABLED(JUNCTION_DEVIATION) + float Planner::junction_deviation_mm; // (mm) M205 J + #if ENABLED(LIN_ADVANCE) + #if ENABLED(DISTINCT_E_FACTORS) + float Planner::max_e_jerk[EXTRUDERS]; // Calculated from junction_deviation_mm + #else + float Planner::max_e_jerk; + #endif #endif +#else + float Planner::max_jerk[XYZE]; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. #endif -#if HAS_CLASSIC_JERK - TERN(HAS_LINEAR_E_JERK, xyz_pos_t, xyze_pos_t) Planner::max_jerk; -#endif - -#if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) +#if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) bool Planner::abort_on_endstop_hit = false; #endif #if ENABLED(DISTINCT_E_FACTORS) uint8_t Planner::last_extruder = 0; // Respond to extruder change + #define _EINDEX (E_AXIS + active_extruder) +#else + #define _EINDEX E_AXIS #endif -#if ENABLED(DIRECT_STEPPING) - uint32_t Planner::last_page_step_rate = 0; - xyze_bool_t Planner::last_page_dir{0}; -#endif +int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder -#if EXTRUDERS - int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder - float Planner::e_factor[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(1.0f); // The flow percentage and volumetric multiplier combine to scale E movement -#endif +float Planner::e_factor[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(1.0f); // The flow percentage and volumetric multiplier combine to scale E movement #if DISABLED(NO_VOLUMETRICS) float Planner::filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder @@ -175,11 +158,6 @@ float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step Planner::volumetric_multiplier[EXTRUDERS]; // Reciprocal of cross-sectional area of filament (in mm^2). Pre-calculated to reduce computation in the planner #endif -#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - float Planner::volumetric_extruder_limit[EXTRUDERS], // max mm^3/sec the extruder is able to handle - Planner::volumetric_extruder_feedrate_limit[EXTRUDERS]; // pre calculated extruder feedrate limit based on volumetric_extruder_limit; pre-calculated to reduce computation in the planner -#endif - #if HAS_LEVELING bool Planner::leveling_active = false; // Flag that auto bed leveling is enabled #if ABL_PLANAR @@ -194,7 +172,18 @@ float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step constexpr bool Planner::leveling_active; #endif -skew_factor_t Planner::skew_factor; // Initialized by settings.load() +#if ENABLED(SKEW_CORRECTION) + #if ENABLED(SKEW_CORRECTION_GCODE) + float Planner::xy_skew_factor; + #else + constexpr float Planner::xy_skew_factor; + #endif + #if ENABLED(SKEW_CORRECTION_FOR_Z) && ENABLED(SKEW_CORRECTION_GCODE) + float Planner::xz_skew_factor, Planner::yz_skew_factor; + #else + constexpr float Planner::xz_skew_factor, Planner::yz_skew_factor; + #endif +#endif #if ENABLED(AUTOTEMP) float Planner::autotemp_max = 250, @@ -205,36 +194,33 @@ skew_factor_t Planner::skew_factor; // Initialized by settings.load() // private: -xyze_long_t Planner::position{0}; +int32_t Planner::position[NUM_AXIS] = { 0 }; uint32_t Planner::cutoff_long; -xyze_float_t Planner::previous_speed; -float Planner::previous_nominal_speed_sqr; +float Planner::previous_speed[NUM_AXIS], + Planner::previous_nominal_speed_sqr; #if ENABLED(DISABLE_INACTIVE_EXTRUDER) uint8_t Planner::g_uc_extruder_last_move[EXTRUDERS] = { 0 }; #endif #ifdef XY_FREQUENCY_LIMIT - int8_t Planner::xy_freq_limit_hz = XY_FREQUENCY_LIMIT; - float Planner::xy_freq_min_speed_factor = (XY_FREQUENCY_MIN_PERCENT) * 0.01f; - int32_t Planner::xy_freq_min_interval_us = LROUND(1000000.0 / (XY_FREQUENCY_LIMIT)); + // Old direction bits. Used for speed calculations + unsigned char Planner::old_direction_bits = 0; + // Segment times (in µs). Used for speed calculations + uint32_t Planner::axis_segment_time_us[2][3] = { { MAX_FREQ_TIME_US + 1, 0, 0 }, { MAX_FREQ_TIME_US + 1, 0, 0 } }; #endif #if ENABLED(LIN_ADVANCE) - float Planner::extruder_advance_K[EXTRUDERS]; // Initialized by settings.load() + float Planner::extruder_advance_K; // Initialized by settings.load() #endif #if HAS_POSITION_FLOAT - xyze_pos_t Planner::position_float; // Needed for accurate maths. Steps cannot be used! + float Planner::position_float[XYZE]; // Needed for accurate maths. Steps cannot be used! #endif -#if IS_KINEMATIC - xyze_pos_t Planner::position_cart; -#endif - -#if HAS_WIRED_LCD +#if ENABLED(ULTRA_LCD) volatile uint32_t Planner::block_buffer_runtime_us = 0; #endif @@ -245,21 +231,21 @@ float Planner::previous_nominal_speed_sqr; Planner::Planner() { init(); } void Planner::init() { - position.reset(); - TERN_(HAS_POSITION_FLOAT, position_float.reset()); - TERN_(IS_KINEMATIC, position_cart.reset()); - previous_speed.reset(); + ZERO(position); + #if HAS_POSITION_FLOAT + ZERO(position_float); + #endif + ZERO(previous_speed); previous_nominal_speed_sqr = 0; - TERN_(ABL_PLANAR, bed_level_matrix.set_to_identity()); + #if ABL_PLANAR + bed_level_matrix.set_to_identity(); + #endif clear_block_buffer(); delay_before_delivering = 0; - #if ENABLED(DIRECT_STEPPING) - last_page_step_rate = 0; - last_page_dir.reset(); - #endif } #if ENABLED(S_CURVE_ACCELERATION) + #ifdef __AVR__ /** * This routine returns 0x1000000 / d, getting the inverse as fast as possible. @@ -339,6 +325,7 @@ void Planner::init() { * const uint32_t r = _BV(24) - x * d; // Estimate remainder * if (r >= d) x++; // Check whether to adjust result * return uint32_t(x); // x holds the proper estimation + * */ static uint32_t get_period_inverse(uint32_t d) { @@ -377,11 +364,11 @@ void Planner::init() { // For small divisors, it is best to directly retrieve the results if (d <= 110) return pgm_read_dword(&small_inv_tab[d]); - uint8_t r8 = d & 0xFF, - r9 = (d >> 8) & 0xFF, - r10 = (d >> 16) & 0xFF, - r2,r3,r4,r5,r6,r7,r11,r12,r13,r14,r15,r16,r17,r18; - const uint8_t* ptab = inv_tab; + register uint8_t r8 = d & 0xFF, + r9 = (d >> 8) & 0xFF, + r10 = (d >> 16) & 0xFF, + r2,r3,r4,r5,r6,r7,r11,r12,r13,r14,r15,r16,r17,r18; + register const uint8_t* ptab = inv_tab; __asm__ __volatile__( // %8:%7:%6 = interval @@ -715,56 +702,6 @@ void Planner::init() { #define MINIMAL_STEP_RATE 120 -/** - * Get the current block for processing - * and mark the block as busy. - * Return nullptr if the buffer is empty - * or if there is a first-block delay. - * - * WARNING: Called from Stepper ISR context! - */ -block_t* Planner::get_current_block() { - // Get the number of moves in the planner queue so far - const uint8_t nr_moves = movesplanned(); - - // If there are any moves queued ... - if (nr_moves) { - - // If there is still delay of delivery of blocks running, decrement it - if (delay_before_delivering) { - --delay_before_delivering; - // If the number of movements queued is less than 3, and there is still time - // to wait, do not deliver anything - if (nr_moves < 3 && delay_before_delivering) return nullptr; - delay_before_delivering = 0; - } - - // If we are here, there is no excuse to deliver the block - block_t * const block = &block_buffer[block_buffer_tail]; - - // No trapezoid calculated? Don't execute yet. - if (TEST(block->flag, BLOCK_BIT_RECALCULATE)) return nullptr; - - // We can't be sure how long an active block will take, so don't count it. - TERN_(HAS_WIRED_LCD, block_buffer_runtime_us -= block->segment_time_us); - - // As this block is busy, advance the nonbusy block pointer - block_buffer_nonbusy = next_block_index(block_buffer_tail); - - // Push block_buffer_planned pointer, if encountered. - if (block_buffer_tail == block_buffer_planned) - block_buffer_planned = block_buffer_nonbusy; - - // Return the block - return block; - } - - // The queue became empty - TERN_(HAS_WIRED_LCD, clear_block_buffer_runtime()); // paranoia. Buffer is empty now - so reset accumulated time to zero. - - return nullptr; -} - /** * Calculate trapezoid parameters, multiplying the entry- and exit-speeds * by the provided factors. @@ -802,7 +739,7 @@ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &e // reach the final_rate exactly at the end of this block. if (plateau_steps < 0) { const float accelerate_steps_float = CEIL(intersection_distance(initial_rate, final_rate, accel, block->step_event_count)); - accelerate_steps = _MIN(uint32_t(_MAX(accelerate_steps_float, 0)), block->step_event_count); + accelerate_steps = MIN(uint32_t(MAX(accelerate_steps_float, 0)), block->step_event_count); plateau_steps = 0; #if ENABLED(S_CURVE_ACCELERATION) @@ -818,10 +755,11 @@ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &e #if ENABLED(S_CURVE_ACCELERATION) // Jerk controlled speed requires to express speed versus time, NOT steps uint32_t acceleration_time = ((float)(cruise_rate - initial_rate) / accel) * (STEPPER_TIMER_RATE), - deceleration_time = ((float)(cruise_rate - final_rate) / accel) * (STEPPER_TIMER_RATE), + deceleration_time = ((float)(cruise_rate - final_rate) / accel) * (STEPPER_TIMER_RATE); + // And to offload calculations from the ISR, we also calculate the inverse of those times here - acceleration_time_inverse = get_period_inverse(acceleration_time), - deceleration_time_inverse = get_period_inverse(deceleration_time); + uint32_t acceleration_time_inverse = get_period_inverse(acceleration_time); + uint32_t deceleration_time_inverse = get_period_inverse(deceleration_time); #endif // Store new block parameters @@ -836,47 +774,6 @@ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &e block->cruise_rate = cruise_rate; #endif block->final_rate = final_rate; - - /** - * Laser trapezoid calculations - * - * Approximate the trapezoid with the laser, incrementing the power every `entry_per` while accelerating - * and decrementing it every `exit_power_per` while decelerating, thus ensuring power is related to feedrate. - * - * LASER_POWER_INLINE_TRAPEZOID_CONT doesn't need this as it continuously approximates - * - * Note this may behave unreliably when running with S_CURVE_ACCELERATION - */ - #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) - if (block->laser.power > 0) { // No need to care if power == 0 - const uint8_t entry_power = block->laser.power * entry_factor; // Power on block entry - #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) - // Speedup power - const uint8_t entry_power_diff = block->laser.power - entry_power; - if (entry_power_diff) { - block->laser.entry_per = accelerate_steps / entry_power_diff; - block->laser.power_entry = entry_power; - } - else { - block->laser.entry_per = 0; - block->laser.power_entry = block->laser.power; - } - // Slowdown power - const uint8_t exit_power = block->laser.power * exit_factor, // Power on block entry - exit_power_diff = block->laser.power - exit_power; - if (exit_power_diff) { - block->laser.exit_per = (block->step_event_count - block->decelerate_after) / exit_power_diff; - block->laser.power_exit = exit_power; - } - else { - block->laser.exit_per = 0; - block->laser.power_exit = block->laser.power; - } - #else - block->laser.power_entry = entry_power; - #endif - } - #endif } /* PLANNER SPEED DEFINITION @@ -927,7 +824,7 @@ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &e streaming operating conditions. Use for planning optimizations by avoiding recomputing parts of the planner buffer that don't change with the addition of a new block, as describe above. In addition, this block can never be less than block_buffer_tail and will always be pushed forward and maintain - this requirement when encountered by the Planner::release_current_block() routine during a cycle. + this requirement when encountered by the Planner::discard_current_block() routine during a cycle. NOTE: Since the planner only computes on what's in the planner buffer, some motions with lots of short line segments, like G2/3 arcs or complex curves, may seem to move slow. This is because there simply isn't @@ -964,7 +861,7 @@ void Planner::reverse_pass_kernel(block_t* const current, const block_t * const const float new_entry_speed_sqr = TEST(current->flag, BLOCK_BIT_NOMINAL_LENGTH) ? max_entry_speed_sqr - : _MIN(max_entry_speed_sqr, max_allowable_speed_sqr(-current->acceleration, next ? next->entry_speed_sqr : sq(float(MINIMUM_PLANNER_SPEED)), current->millimeters)); + : MIN(max_entry_speed_sqr, max_allowable_speed_sqr(-current->acceleration, next ? next->entry_speed_sqr : sq(float(MINIMUM_PLANNER_SPEED)), current->millimeters)); if (current->entry_speed_sqr != new_entry_speed_sqr) { // Need to recalculate the block speed - Mark it now, so the stepper @@ -1009,14 +906,14 @@ void Planner::reverse_pass() { // Reverse Pass: Coarsely maximize all possible deceleration curves back-planning from the last // block in buffer. Cease planning when the last optimal planned or tail pointer is reached. // NOTE: Forward pass will later refine and correct the reverse pass to create an optimal plan. - const block_t *next = nullptr; + const block_t *next = NULL; while (block_index != planned_block_index) { // Perform the reverse pass block_t *current = &block_buffer[block_index]; - // Only consider non sync and page blocks - if (!TEST(current->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(current)) { + // Only consider non sync blocks + if (!TEST(current->flag, BLOCK_BIT_SYNC_POSITION)) { reverse_pass_kernel(current, next); next = current; } @@ -1103,23 +1000,23 @@ void Planner::forward_pass() { // pass will never modify the values at the tail. uint8_t block_index = block_buffer_planned; - block_t *block; - const block_t * previous = nullptr; + block_t *current; + const block_t * previous = NULL; while (block_index != block_buffer_head) { // Perform the forward pass - block = &block_buffer[block_index]; + current = &block_buffer[block_index]; - // Skip SYNC and page blocks - if (!TEST(block->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(block)) { + // Skip SYNC blocks + if (!TEST(current->flag, BLOCK_BIT_SYNC_POSITION)) { // If there's no previous block or the previous block is not // BUSY (thus, modifiable) run the forward_pass_kernel. Otherwise, // the previous block became BUSY, so assume the current block's // entry speed can't be altered (since that would also require // updating the exit speed of the previous block). if (!previous || !stepper.is_block_busy(previous)) - forward_pass_kernel(previous, block, block_index); - previous = block; + forward_pass_kernel(previous, current, block_index); + previous = current; } // Advance to the previous block_index = next_block_index(block_index); @@ -1154,51 +1051,51 @@ void Planner::recalculate_trapezoids() { } // Go from the tail (currently executed block) to the first block, without including it) - block_t *block = nullptr, *next = nullptr; + block_t *current = NULL, *next = NULL; float current_entry_speed = 0.0, next_entry_speed = 0.0; while (block_index != head_block_index) { next = &block_buffer[block_index]; - // Skip sync and page blocks - if (!TEST(next->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(next)) { + // Skip sync blocks + if (!TEST(next->flag, BLOCK_BIT_SYNC_POSITION)) { next_entry_speed = SQRT(next->entry_speed_sqr); - if (block) { + if (current) { // Recalculate if current block entry or exit junction speed has changed. - if (TEST(block->flag, BLOCK_BIT_RECALCULATE) || TEST(next->flag, BLOCK_BIT_RECALCULATE)) { + if (TEST(current->flag, BLOCK_BIT_RECALCULATE) || TEST(next->flag, BLOCK_BIT_RECALCULATE)) { // Mark the current block as RECALCULATE, to protect it from the Stepper ISR running it. // Note that due to the above condition, there's a chance the current block isn't marked as // RECALCULATE yet, but the next one is. That's the reason for the following line. - SBI(block->flag, BLOCK_BIT_RECALCULATE); + SBI(current->flag, BLOCK_BIT_RECALCULATE); // But there is an inherent race condition here, as the block maybe // became BUSY, just before it was marked as RECALCULATE, so check // if that is the case! - if (!stepper.is_block_busy(block)) { + if (!stepper.is_block_busy(current)) { // Block is not BUSY, we won the race against the Stepper ISR: // NOTE: Entry and exit factors always > 0 by all previous logic operations. - const float current_nominal_speed = SQRT(block->nominal_speed_sqr), + const float current_nominal_speed = SQRT(current->nominal_speed_sqr), nomr = 1.0f / current_nominal_speed; - calculate_trapezoid_for_block(block, current_entry_speed * nomr, next_entry_speed * nomr); + calculate_trapezoid_for_block(current, current_entry_speed * nomr, next_entry_speed * nomr); #if ENABLED(LIN_ADVANCE) - if (block->use_advance_lead) { - const float comp = block->e_D_ratio * extruder_advance_K[active_extruder] * settings.axis_steps_per_mm[E_AXIS]; - block->max_adv_steps = current_nominal_speed * comp; - block->final_adv_steps = next_entry_speed * comp; + if (current->use_advance_lead) { + const float comp = current->e_D_ratio * extruder_advance_K * axis_steps_per_mm[E_AXIS]; + current->max_adv_steps = current_nominal_speed * comp; + current->final_adv_steps = next_entry_speed * comp; } #endif } // Reset current only to ensure next trapezoid is computed - The // stepper is free to use the block from now on. - CBI(block->flag, BLOCK_BIT_RECALCULATE); + CBI(current->flag, BLOCK_BIT_RECALCULATE); } } - block = next; + current = next; current_entry_speed = next_entry_speed; } @@ -1216,7 +1113,7 @@ void Planner::recalculate_trapezoids() { // But there is an inherent race condition here, as the block maybe // became BUSY, just before it was marked as RECALCULATE, so check // if that is the case! - if (!stepper.is_block_busy(block)) { + if (!stepper.is_block_busy(current)) { // Block is not BUSY, we won the race against the Stepper ISR: const float next_nominal_speed = SQRT(next->nominal_speed_sqr), @@ -1224,7 +1121,7 @@ void Planner::recalculate_trapezoids() { calculate_trapezoid_for_block(next, next_entry_speed * nomr, float(MINIMUM_PLANNER_SPEED) * nomr); #if ENABLED(LIN_ADVANCE) if (next->use_advance_lead) { - const float comp = next->e_D_ratio * extruder_advance_K[active_extruder] * settings.axis_steps_per_mm[E_AXIS]; + const float comp = next->e_D_ratio * extruder_advance_K * axis_steps_per_mm[E_AXIS]; next->max_adv_steps = next_nominal_speed * comp; next->final_adv_steps = (MINIMUM_PLANNER_SPEED) * comp; } @@ -1259,14 +1156,14 @@ void Planner::recalculate() { float high = 0.0; for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { block_t* block = &block_buffer[b]; - if (block->steps.x || block->steps.y || block->steps.z) { - const float se = (float)block->steps.e / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; + if (block->steps[X_AXIS] || block->steps[Y_AXIS] || block->steps[Z_AXIS]) { + const float se = (float)block->steps[E_AXIS] / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; NOLESS(high, se); } } float t = autotemp_min + high * autotemp_factor; - LIMIT(t, autotemp_min, autotemp_max); + t = constrain(t, autotemp_min, autotemp_max); if (t < oldt) t = t * (1 - float(AUTOTEMP_OLDWEIGHT)) + oldt * float(AUTOTEMP_OLDWEIGHT); oldt = t; thermalManager.setTargetHotend(t, 0); @@ -1278,14 +1175,8 @@ void Planner::recalculate() { * Maintain fans, paste extruder pressure, */ void Planner::check_axes_activity() { - - #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) - xyze_bool_t axis_active = { false }; - #endif - - #if HAS_FAN - uint8_t tail_fan_speed[FAN_COUNT]; - #endif + unsigned char axis_active[NUM_AXIS] = { 0 }, + tail_fan_speed[FAN_COUNT]; #if ENABLED(BARICUDA) #if HAS_HEATER_1 @@ -1298,103 +1189,125 @@ void Planner::check_axes_activity() { if (has_blocks_queued()) { - #if HAS_FAN || ENABLED(BARICUDA) - block_t *block = &block_buffer[block_buffer_tail]; + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) + tail_fan_speed[i] = block_buffer[block_buffer_tail].fan_speed[i]; #endif - #if HAS_FAN - FANS_LOOP(i) - tail_fan_speed[i] = thermalManager.scaledFanSpeed(i, block->fan_speed[i]); - #endif + block_t* block; #if ENABLED(BARICUDA) - TERN_(HAS_HEATER_1, tail_valve_pressure = block->valve_pressure); - TERN_(HAS_HEATER_2, tail_e_to_p_pressure = block->e_to_p_pressure); + block = &block_buffer[block_buffer_tail]; + #if HAS_HEATER_1 + tail_valve_pressure = block->valve_pressure; + #endif + #if HAS_HEATER_2 + tail_e_to_p_pressure = block->e_to_p_pressure; + #endif #endif - #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) - for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { - block_t *block = &block_buffer[b]; - if (ENABLED(DISABLE_X) && block->steps.x) axis_active.x = true; - if (ENABLED(DISABLE_Y) && block->steps.y) axis_active.y = true; - if (ENABLED(DISABLE_Z) && block->steps.z) axis_active.z = true; - if (ENABLED(DISABLE_E) && block->steps.e) axis_active.e = true; - } - #endif + for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { + block = &block_buffer[b]; + LOOP_XYZE(i) if (block->steps[i]) axis_active[i]++; + } } else { - - TERN_(HAS_CUTTER, cutter.refresh()); - - #if HAS_FAN - FANS_LOOP(i) - tail_fan_speed[i] = thermalManager.scaledFanSpeed(i); + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) tail_fan_speed[i] = fanSpeeds[i]; #endif #if ENABLED(BARICUDA) - TERN_(HAS_HEATER_1, tail_valve_pressure = baricuda_valve_pressure); - TERN_(HAS_HEATER_2, tail_e_to_p_pressure = baricuda_e_to_p_pressure); + #if HAS_HEATER_1 + tail_valve_pressure = baricuda_valve_pressure; + #endif + #if HAS_HEATER_2 + tail_e_to_p_pressure = baricuda_e_to_p_pressure; + #endif #endif } - // - // Disable inactive axes - // - if (TERN0(DISABLE_X, !axis_active.x)) DISABLE_AXIS_X(); - if (TERN0(DISABLE_Y, !axis_active.y)) DISABLE_AXIS_Y(); - if (TERN0(DISABLE_Z, !axis_active.z)) DISABLE_AXIS_Z(); - if (TERN0(DISABLE_E, !axis_active.e)) disable_e_steppers(); + #if ENABLED(DISABLE_X) + if (!axis_active[X_AXIS]) disable_X(); + #endif + #if ENABLED(DISABLE_Y) + if (!axis_active[Y_AXIS]) disable_Y(); + #endif + #if ENABLED(DISABLE_Z) + if (!axis_active[Z_AXIS]) disable_Z(); + #endif + #if ENABLED(DISABLE_E) + if (!axis_active[E_AXIS]) disable_e_steppers(); + #endif - // - // Update Fan speeds - // - #if HAS_FAN + #if FAN_COUNT > 0 #if FAN_KICKSTART_TIME > 0 + static millis_t fan_kick_end[FAN_COUNT] = { 0 }; - #define KICKSTART_FAN(f) \ - if (tail_fan_speed[f]) { \ - millis_t ms = millis(); \ - if (fan_kick_end[f] == 0) { \ + + #define KICKSTART_FAN(f) \ + if (tail_fan_speed[f]) { \ + millis_t ms = millis(); \ + if (fan_kick_end[f] == 0) { \ fan_kick_end[f] = ms + FAN_KICKSTART_TIME; \ - tail_fan_speed[f] = 255; \ - } else if (PENDING(ms, fan_kick_end[f])) \ - tail_fan_speed[f] = 255; \ + tail_fan_speed[f] = 255; \ + } else if (PENDING(ms, fan_kick_end[f])) \ + tail_fan_speed[f] = 255; \ } else fan_kick_end[f] = 0 - #else - #define KICKSTART_FAN(f) NOOP - #endif + + #if HAS_FAN0 + KICKSTART_FAN(0); + #endif + #if HAS_FAN1 + KICKSTART_FAN(1); + #endif + #if HAS_FAN2 + KICKSTART_FAN(2); + #endif + + #endif // FAN_KICKSTART_TIME > 0 #if FAN_MIN_PWM != 0 || FAN_MAX_PWM != 255 - #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? map(tail_fan_speed[f], 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) + #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? map(tail_fan_speed[f], 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : 0) #else - #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ?: FAN_OFF_PWM) + #define CALC_FAN_SPEED(f) tail_fan_speed[f] #endif #if ENABLED(FAN_SOFT_PWM) - #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(F); - #elif ENABLED(FAST_PWM_FAN) - #define _FAN_SET(F) set_pwm_duty(FAN##F##_PIN, CALC_FAN_SPEED(F)); + #if HAS_FAN0 + thermalManager.soft_pwm_amount_fan[0] = CALC_FAN_SPEED(0); + #endif + #if HAS_FAN1 + thermalManager.soft_pwm_amount_fan[1] = CALC_FAN_SPEED(1); + #endif + #if HAS_FAN2 + thermalManager.soft_pwm_amount_fan[2] = CALC_FAN_SPEED(2); + #endif #else - #define _FAN_SET(F) analogWrite(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(F)); + #if HAS_FAN0 + analogWrite(FAN_PIN, CALC_FAN_SPEED(0)); + #endif + #if HAS_FAN1 + analogWrite(FAN1_PIN, CALC_FAN_SPEED(1)); + #endif + #if HAS_FAN2 + analogWrite(FAN2_PIN, CALC_FAN_SPEED(2)); + #endif #endif - #define FAN_SET(F) do{ KICKSTART_FAN(F); _FAN_SET(F); }while(0) - TERN_(HAS_FAN0, FAN_SET(0)); - TERN_(HAS_FAN1, FAN_SET(1)); - TERN_(HAS_FAN2, FAN_SET(2)); - TERN_(HAS_FAN3, FAN_SET(3)); - TERN_(HAS_FAN4, FAN_SET(4)); - TERN_(HAS_FAN5, FAN_SET(5)); - TERN_(HAS_FAN6, FAN_SET(6)); - TERN_(HAS_FAN7, FAN_SET(7)); - #endif // HAS_FAN + #endif // FAN_COUNT > 0 - TERN_(AUTOTEMP, getHighESpeed()); + #if ENABLED(AUTOTEMP) + getHighESpeed(); + #endif #if ENABLED(BARICUDA) - TERN_(HAS_HEATER_1, analogWrite(pin_t(HEATER_1_PIN), tail_valve_pressure)); - TERN_(HAS_HEATER_2, analogWrite(pin_t(HEATER_2_PIN), tail_e_to_p_pressure)); + #if HAS_HEATER_1 + analogWrite(HEATER_1_PIN, tail_valve_pressure); + #endif + #if HAS_HEATER_2 + analogWrite(HEATER_2_PIN, tail_e_to_p_pressure); + #endif #endif } @@ -1414,88 +1327,77 @@ void Planner::check_axes_activity() { * The multiplier converts a given E value into a length. */ void Planner::calculate_volumetric_multipliers() { - LOOP_L_N(i, COUNT(filament_size)) { + for (uint8_t i = 0; i < COUNT(filament_size); i++) { volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]); refresh_e_factor(i); } - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - calculate_volumetric_extruder_limits(); // update volumetric_extruder_limits as well. - #endif } #endif // !NO_VOLUMETRICS -#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - - /** - * Convert volumetric based limits into pre calculated extruder feedrate limits. - */ - void Planner::calculate_volumetric_extruder_limit(const uint8_t e) { - const float &lim = volumetric_extruder_limit[e], &siz = filament_size[e]; - volumetric_extruder_feedrate_limit[e] = (lim && siz) ? lim / CIRCLE_AREA(siz * 0.5f) : 0; - } - void Planner::calculate_volumetric_extruder_limits() { - LOOP_L_N(e, EXTRUDERS) calculate_volumetric_extruder_limit(e); - } - -#endif - #if ENABLED(FILAMENT_WIDTH_SENSOR) /** * Convert the ratio value given by the filament width sensor * into a volumetric multiplier. Conversion differs when using * linear extrusion vs volumetric extrusion. */ - void Planner::apply_filament_width_sensor(const int8_t encoded_ratio) { + void Planner::calculate_volumetric_for_width_sensor(const int8_t encoded_ratio) { // Reconstitute the nominal/measured ratio const float nom_meas_ratio = 1 + 0.01f * encoded_ratio, ratio_2 = sq(nom_meas_ratio); volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] = parser.volumetric_enabled - ? ratio_2 / CIRCLE_AREA(filwidth.nominal_mm * 0.5f) // Volumetric uses a true volumetric multiplier - : ratio_2; // Linear squares the ratio, which scales the volume + ? ratio_2 / CIRCLE_AREA(filament_width_nominal * 0.5f) // Volumetric uses a true volumetric multiplier + : ratio_2; // Linear squares the ratio, which scales the volume refresh_e_factor(FILAMENT_SENSOR_EXTRUDER_NUM); } #endif -#if HAS_LEVELING - - constexpr xy_pos_t level_fulcrum = { - TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_X_POINT, X_HOME_POS), - TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_Y_POINT, Y_HOME_POS) - }; - +#if PLANNER_LEVELING || HAS_UBL_AND_CURVES /** * rx, ry, rz - Cartesian positions in mm * Leveled XYZ on completion */ - void Planner::apply_leveling(xyz_pos_t &raw) { + void Planner::apply_leveling(float &rx, float &ry, float &rz) { + + #if ENABLED(SKEW_CORRECTION) + skew(rx, ry, rz); + #endif + if (!leveling_active) return; #if ABL_PLANAR - xy_pos_t d = raw - level_fulcrum; - apply_rotation_xyz(bed_level_matrix, d.x, d.y, raw.z); - raw = d + level_fulcrum; + float dx = rx - (X_TILT_FULCRUM), + dy = ry - (Y_TILT_FULCRUM); + + apply_rotation_xyz(bed_level_matrix, dx, dy, rz); + + rx = dx + X_TILT_FULCRUM; + ry = dy + Y_TILT_FULCRUM; #elif HAS_MESH #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - const float fade_scaling_factor = fade_scaling_factor_for_z(raw.z); - #elif DISABLED(MESH_BED_LEVELING) + const float fade_scaling_factor = fade_scaling_factor_for_z(rz); + #else constexpr float fade_scaling_factor = 1.0; #endif - raw.z += ( + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + const float raw[XYZ] = { rx, ry, 0 }; + #endif + + rz += ( #if ENABLED(MESH_BED_LEVELING) - mbl.get_z(raw + mbl.get_z(rx, ry #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) , fade_scaling_factor #endif ) #elif ENABLED(AUTO_BED_LEVELING_UBL) - fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(raw) : 0.0 + fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(rx, ry) : 0.0 #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) fade_scaling_factor ? fade_scaling_factor * bilinear_z_offset(raw) : 0.0 #endif @@ -1504,7 +1406,11 @@ void Planner::check_axes_activity() { #endif } - void Planner::unapply_leveling(xyz_pos_t &raw) { +#endif + +#if PLANNER_LEVELING + + void Planner::unapply_leveling(float raw[XYZ]) { if (leveling_active) { @@ -1512,27 +1418,31 @@ void Planner::check_axes_activity() { matrix_3x3 inverse = matrix_3x3::transpose(bed_level_matrix); - xy_pos_t d = raw - level_fulcrum; - apply_rotation_xyz(inverse, d.x, d.y, raw.z); - raw = d + level_fulcrum; + float dx = raw[X_AXIS] - (X_TILT_FULCRUM), + dy = raw[Y_AXIS] - (Y_TILT_FULCRUM); + + apply_rotation_xyz(inverse, dx, dy, raw[Z_AXIS]); + + raw[X_AXIS] = dx + X_TILT_FULCRUM; + raw[Y_AXIS] = dy + Y_TILT_FULCRUM; #elif HAS_MESH #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - const float fade_scaling_factor = fade_scaling_factor_for_z(raw.z); - #elif DISABLED(MESH_BED_LEVELING) + const float fade_scaling_factor = fade_scaling_factor_for_z(raw[Z_AXIS]); + #else constexpr float fade_scaling_factor = 1.0; #endif - raw.z -= ( + raw[Z_AXIS] -= ( #if ENABLED(MESH_BED_LEVELING) - mbl.get_z(raw + mbl.get_z(raw[X_AXIS], raw[Y_AXIS] #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) , fade_scaling_factor #endif ) #elif ENABLED(AUTO_BED_LEVELING_UBL) - fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(raw) : 0.0 + fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(raw[X_AXIS], raw[Y_AXIS]) : 0.0 #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) fade_scaling_factor ? fade_scaling_factor * bilinear_z_offset(raw) : 0.0 #endif @@ -1540,25 +1450,13 @@ void Planner::check_axes_activity() { #endif } + + #if ENABLED(SKEW_CORRECTION) + unskew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); + #endif } -#endif // HAS_LEVELING - -#if ENABLED(FWRETRACT) - /** - * rz, e - Cartesian positions in mm - */ - void Planner::apply_retract(float &rz, float &e) { - rz += fwretract.current_hop; - e -= fwretract.current_retract[active_extruder]; - } - - void Planner::unapply_retract(float &rz, float &e) { - rz -= fwretract.current_hop; - e += fwretract.current_retract[active_extruder]; - } - -#endif +#endif // PLANNER_LEVELING void Planner::quick_stop() { @@ -1568,7 +1466,8 @@ void Planner::quick_stop() { // must be handled: The tail could change between the read and the assignment // so this must be enclosed in a critical section - const bool was_enabled = stepper.suspend(); + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); // Drop all queue entries block_buffer_nonbusy = block_buffer_planned = block_buffer_head = block_buffer_tail; @@ -1577,16 +1476,16 @@ void Planner::quick_stop() { // forced to empty, there's no risk the ISR will touch this. delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; - #if HAS_WIRED_LCD + #if ENABLED(ULTRA_LCD) // Clear the accumulated runtime clear_block_buffer_runtime(); #endif - // Make sure to drop any attempt of queuing moves for 1 second - cleaning_buffer_counter = TEMP_TIMER_FREQUENCY; + // Make sure to drop any attempt of queuing moves for at least 1 second + cleaning_buffer_counter = 1000; // Reenable Stepper ISR - if (was_enabled) stepper.wake_up(); + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); // And stop the stepper ISR stepper.quick_stop(); @@ -1613,48 +1512,27 @@ void Planner::finish_and_disable() { float Planner::get_axis_position_mm(const AxisEnum axis) { float axis_steps; #if IS_CORE - // Requesting one of the "core" axes? if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) { // Protect the access to the position. - const bool was_enabled = stepper.suspend(); - - const int32_t p1 = stepper.position(CORE_AXIS_1), - p2 = stepper.position(CORE_AXIS_2); - - if (was_enabled) stepper.wake_up(); + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); // ((a1+a2)+(a1-a2))/2 -> (a1+a2+a1-a2)/2 -> (a1+a1)/2 -> a1 // ((a1+a2)-(a1-a2))/2 -> (a1+a2-a1+a2)/2 -> (a2+a2)/2 -> a2 - axis_steps = (axis == CORE_AXIS_2 ? CORESIGN(p1 - p2) : p1 + p2) * 0.5f; + axis_steps = 0.5f * ( + axis == CORE_AXIS_2 ? CORESIGN(stepper.position(CORE_AXIS_1) - stepper.position(CORE_AXIS_2)) + : stepper.position(CORE_AXIS_1) + stepper.position(CORE_AXIS_2) + ); + + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); } else axis_steps = stepper.position(axis); - - #elif ENABLED(MARKFORGED_XY) - - // Requesting one of the joined axes? - if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) { - // Protect the access to the position. - const bool was_enabled = stepper.suspend(); - - const int32_t p1 = stepper.position(CORE_AXIS_1), - p2 = stepper.position(CORE_AXIS_2); - - if (was_enabled) stepper.wake_up(); - - axis_steps = ((axis == CORE_AXIS_1) ? p1 - p2 : p2); - } - else - axis_steps = stepper.position(axis); - #else - axis_steps = stepper.position(axis); - #endif - return axis_steps * steps_to_mm[axis]; } @@ -1662,8 +1540,11 @@ float Planner::get_axis_position_mm(const AxisEnum axis) { * Block until all buffered steps are executed / cleaned */ void Planner::synchronize() { - while (has_blocks_queued() || cleaning_buffer_counter - || TERN0(EXTERNAL_CLOSED_LOOP_CONTROLLER, CLOSED_LOOP_WAITING()) + while ( + has_blocks_queued() || cleaning_buffer_counter + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + || !READ(CLOSED_LOOP_MOVE_COMPLETE_PIN) + #endif ) idle(); } @@ -1672,22 +1553,18 @@ void Planner::synchronize() { * * Add a new linear movement to the planner queue (in terms of steps). * - * target - target position in steps units - * target_float - target position in direct (mm, degrees) units. optional - * fr_mm_s - (target) speed of the move - * extruder - target extruder - * millimeters - the length of the movement, if known + * target - target position in steps units + * fr_mm_s - (target) speed of the move + * extruder - target extruder + * millimeters - the length of the movement, if known * - * Returns true if movement was properly queued, false otherwise (if cleaning) + * Returns true if movement was properly queued, false otherwise */ -bool Planner::_buffer_steps(const xyze_long_t &target +bool Planner::_buffer_steps(const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT - , const xyze_pos_t &target_float + , const float (&target_float)[XYZE] #endif - #if HAS_DIST_MM_ARG - , const xyze_float_t &cart_dist_mm - #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters + , float fr_mm_s, const uint8_t extruder, const float &millimeters ) { // If we are cleaning, do not accept queuing of movements @@ -1702,9 +1579,6 @@ bool Planner::_buffer_steps(const xyze_long_t &target #if HAS_POSITION_FLOAT , target_float #endif - #if HAS_DIST_MM_ARG - , cart_dist_mm - #endif , fr_mm_s, extruder, millimeters )) { // Movement was not queued, probably because it was too short. @@ -1741,69 +1615,57 @@ bool Planner::_buffer_steps(const xyze_long_t &target * fr_mm_s - (target) speed of the move * extruder - target extruder * - * Returns true if movement is acceptable, false otherwise + * Returns true is movement is acceptable, false otherwise */ bool Planner::_populate_block(block_t * const block, bool split_move, - const abce_long_t &target + const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT - , const xyze_pos_t &target_float + , const float (&target_float)[XYZE] #endif - #if HAS_DIST_MM_ARG - , const xyze_float_t &cart_dist_mm - #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ + , float fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ ) { - const int32_t da = target.a - position.a, - db = target.b - position.b, - dc = target.c - position.c; + const int32_t da = target[A_AXIS] - position[A_AXIS], + db = target[B_AXIS] - position[B_AXIS], + dc = target[C_AXIS] - position[C_AXIS]; - #if EXTRUDERS - int32_t de = target.e - position.e; - #else - constexpr int32_t de = 0; - #endif + int32_t de = target[E_AXIS] - position[E_AXIS]; /* <-- add a slash to enable - SERIAL_ECHOLNPAIR(" _populate_block FR:", fr_mm_s, - " A:", target.a, " (", da, " steps)" - " B:", target.b, " (", db, " steps)" - " C:", target.c, " (", dc, " steps)" - #if EXTRUDERS - " E:", target.e, " (", de, " steps)" - #endif - ); + SERIAL_ECHOPAIR(" _populate_block FR:", fr_mm_s); + SERIAL_ECHOPAIR(" A:", target[A_AXIS]); + SERIAL_ECHOPAIR(" (", da); + SERIAL_ECHOPAIR(" steps) B:", target[B_AXIS]); + SERIAL_ECHOPAIR(" (", db); + SERIAL_ECHOPAIR(" steps) C:", target[C_AXIS]); + SERIAL_ECHOPAIR(" (", dc); + SERIAL_ECHOPAIR(" steps) E:", target[E_AXIS]); + SERIAL_ECHOPAIR(" (", de); + SERIAL_ECHOLNPGM(" steps)"); //*/ - #if EITHER(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) + #if ENABLED(PREVENT_COLD_EXTRUSION) || ENABLED(PREVENT_LENGTHY_EXTRUDE) if (de) { #if ENABLED(PREVENT_COLD_EXTRUSION) if (thermalManager.tooColdToExtrude(extruder)) { - position.e = target.e; // Behave as if the move really took place, but ignore E part - TERN_(HAS_POSITION_FLOAT, position_float.e = target_float.e); + position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part + #if HAS_POSITION_FLOAT + position_float[E_AXIS] = target_float[E_AXIS]; + #endif de = 0; // no difference - SERIAL_ECHO_MSG(STR_ERR_COLD_EXTRUDE_STOP); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_COLD_EXTRUDE_STOP); } #endif // PREVENT_COLD_EXTRUSION #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - const float e_steps = ABS(de * e_factor[extruder]); - const float max_e_steps = settings.axis_steps_per_mm[E_AXIS_N(extruder)] * (EXTRUDE_MAXLENGTH); - if (e_steps > max_e_steps) { - #if ENABLED(MIXING_EXTRUDER) - bool ignore_e = false; - float collector[MIXING_STEPPERS]; - mixer.refresh_collector(1.0, mixer.get_current_vtool(), collector); - MIXER_STEPPER_LOOP(e) - if (e_steps * collector[e] > max_e_steps) { ignore_e = true; break; } - #else - constexpr bool ignore_e = true; + if (ABS(de * e_factor[extruder]) > (int32_t)axis_steps_per_mm[E_AXIS_N] * (EXTRUDE_MAXLENGTH)) { // It's not important to get max. extrusion length in a precision < 1mm, so save some cycles and cast to int + position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part + #if HAS_POSITION_FLOAT + position_float[E_AXIS] = target_float[E_AXIS]; #endif - if (ignore_e) { - position.e = target.e; // Behave as if the move really took place, but ignore E part - TERN_(HAS_POSITION_FLOAT, position_float.e = target_float.e); - de = 0; // no difference - SERIAL_ECHO_MSG(STR_ERR_LONG_EXTRUDE_STOP); - } + de = 0; // no difference + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_ERR_LONG_EXTRUDE_STOP); } #endif // PREVENT_LENGTHY_EXTRUDE } @@ -1829,12 +1691,6 @@ bool Planner::_populate_block(block_t * const block, bool split_move, if (dc < 0) SBI(dm, Z_HEAD); // ...and Z if (db + dc < 0) SBI(dm, B_AXIS); // Motor B direction if (CORESIGN(db - dc) < 0) SBI(dm, C_AXIS); // Motor C direction - #elif ENABLED(MARKFORGED_XY) - if (da < 0) SBI(dm, X_HEAD); // Save the real Extruder (head) direction in X Axis - if (db < 0) SBI(dm, Y_HEAD); // ...and Y - if (dc < 0) SBI(dm, Z_AXIS); - if (da + db < 0) SBI(dm, A_AXIS); // Motor A direction - if (db < 0) SBI(dm, B_AXIS); // Motor B direction #else if (da < 0) SBI(dm, X_AXIS); if (db < 0) SBI(dm, Y_AXIS); @@ -1842,12 +1698,8 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #endif if (de < 0) SBI(dm, E_AXIS); - #if EXTRUDERS - const float esteps_float = de * e_factor[extruder]; - const uint32_t esteps = ABS(esteps_float) + 0.5f; - #else - constexpr uint32_t esteps = 0; - #endif + const float esteps_float = de * e_factor[extruder]; + const uint32_t esteps = ABS(esteps_float) + 0.5f; // Clear all flags, including the "busy" bit block->flag = 0x00; @@ -1855,30 +1707,197 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Set direction bits block->direction_bits = dm; - // Update block laser power - #if ENABLED(LASER_POWER_INLINE) - laser_inline.status.isPlanned = true; - block->laser.status = laser_inline.status; - block->laser.power = laser_inline.power; - #endif - // Number of steps for each axis - // See https://www.corexy.com/theory.html + // See http://www.corexy.com/theory.html #if CORE_IS_XY - block->steps.set(ABS(da + db), ABS(da - db), ABS(dc)); + block->steps[A_AXIS] = ABS(da + db); + block->steps[B_AXIS] = ABS(da - db); + block->steps[Z_AXIS] = ABS(dc); #elif CORE_IS_XZ - block->steps.set(ABS(da + dc), ABS(db), ABS(da - dc)); + block->steps[A_AXIS] = ABS(da + dc); + block->steps[Y_AXIS] = ABS(db); + block->steps[C_AXIS] = ABS(da - dc); #elif CORE_IS_YZ - block->steps.set(ABS(da), ABS(db + dc), ABS(db - dc)); - #elif ENABLED(MARKFORGED_XY) - block->steps.set(ABS(da + db), ABS(db), ABS(dc)); + block->steps[X_AXIS] = ABS(da); + block->steps[B_AXIS] = ABS(db + dc); + block->steps[C_AXIS] = ABS(db - dc); #elif IS_SCARA - block->steps.set(ABS(da), ABS(db), ABS(dc)); + block->steps[A_AXIS] = ABS(da); + block->steps[B_AXIS] = ABS(db); + block->steps[Z_AXIS] = ABS(dc); #else // default non-h-bot planning - block->steps.set(ABS(da), ABS(db), ABS(dc)); + block->steps[A_AXIS] = ABS(da); + block->steps[B_AXIS] = ABS(db); + block->steps[C_AXIS] = ABS(dc); #endif + block->steps[E_AXIS] = esteps; + block->step_event_count = MAX4(block->steps[A_AXIS], block->steps[B_AXIS], block->steps[C_AXIS], esteps); + + // Bail if this is a zero-length block + if (block->step_event_count < MIN_STEPS_PER_SEGMENT) return false; + + // For a mixing extruder, get a magnified esteps for each + #if ENABLED(MIXING_EXTRUDER) + for (uint8_t i = 0; i < MIXING_STEPPERS; i++) + block->mix_steps[i] = mixing_factor[i] * ( + #if ENABLED(LIN_ADVANCE) + esteps + #else + block->step_event_count + #endif + ); + #endif + + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) block->fan_speed[i] = fanSpeeds[i]; + #endif + + #if ENABLED(BARICUDA) + block->valve_pressure = baricuda_valve_pressure; + block->e_to_p_pressure = baricuda_e_to_p_pressure; + #endif + + block->active_extruder = extruder; + + #if ENABLED(AUTO_POWER_CONTROL) + if (block->steps[X_AXIS] || block->steps[Y_AXIS] || block->steps[Z_AXIS]) + powerManager.power_on(); + #endif + + // Enable active axes + #if CORE_IS_XY + if (block->steps[A_AXIS] || block->steps[B_AXIS]) { + enable_X(); + enable_Y(); + } + #if DISABLED(Z_LATE_ENABLE) + if (block->steps[Z_AXIS]) enable_Z(); + #endif + #elif CORE_IS_XZ + if (block->steps[A_AXIS] || block->steps[C_AXIS]) { + enable_X(); + enable_Z(); + } + if (block->steps[Y_AXIS]) enable_Y(); + #elif CORE_IS_YZ + if (block->steps[B_AXIS] || block->steps[C_AXIS]) { + enable_Y(); + enable_Z(); + } + if (block->steps[X_AXIS]) enable_X(); + #else + if (block->steps[X_AXIS]) enable_X(); + if (block->steps[Y_AXIS]) enable_Y(); + #if DISABLED(Z_LATE_ENABLE) + if (block->steps[Z_AXIS]) enable_Z(); + #endif + #endif + + // Enable extruder(s) + if (esteps) { + #if ENABLED(AUTO_POWER_CONTROL) + powerManager.power_on(); + #endif + + #if ENABLED(DISABLE_INACTIVE_EXTRUDER) // Enable only the selected extruder + + #define DISABLE_IDLE_E(N) if (!g_uc_extruder_last_move[N]) disable_E##N(); + + for (uint8_t i = 0; i < EXTRUDERS; i++) + if (g_uc_extruder_last_move[i] > 0) g_uc_extruder_last_move[i]--; + + switch (extruder) { + case 0: + #if EXTRUDERS > 1 + DISABLE_IDLE_E(1); + #if EXTRUDERS > 2 + DISABLE_IDLE_E(2); + #if EXTRUDERS > 3 + DISABLE_IDLE_E(3); + #if EXTRUDERS > 4 + DISABLE_IDLE_E(4); + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + enable_E0(); + g_uc_extruder_last_move[0] = (BLOCK_BUFFER_SIZE) * 2; + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + if (extruder_duplication_enabled) { + enable_E1(); + g_uc_extruder_last_move[1] = (BLOCK_BUFFER_SIZE) * 2; + } + #endif + break; + #if EXTRUDERS > 1 + case 1: + DISABLE_IDLE_E(0); + #if EXTRUDERS > 2 + DISABLE_IDLE_E(2); + #if EXTRUDERS > 3 + DISABLE_IDLE_E(3); + #if EXTRUDERS > 4 + DISABLE_IDLE_E(4); + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + enable_E1(); + g_uc_extruder_last_move[1] = (BLOCK_BUFFER_SIZE) * 2; + break; + #if EXTRUDERS > 2 + case 2: + DISABLE_IDLE_E(0); + DISABLE_IDLE_E(1); + #if EXTRUDERS > 3 + DISABLE_IDLE_E(3); + #if EXTRUDERS > 4 + DISABLE_IDLE_E(4); + #endif + #endif + enable_E2(); + g_uc_extruder_last_move[2] = (BLOCK_BUFFER_SIZE) * 2; + break; + #if EXTRUDERS > 3 + case 3: + DISABLE_IDLE_E(0); + DISABLE_IDLE_E(1); + DISABLE_IDLE_E(2); + #if EXTRUDERS > 4 + DISABLE_IDLE_E(4); + #endif + enable_E3(); + g_uc_extruder_last_move[3] = (BLOCK_BUFFER_SIZE) * 2; + break; + #if EXTRUDERS > 4 + case 4: + DISABLE_IDLE_E(0); + DISABLE_IDLE_E(1); + DISABLE_IDLE_E(2); + DISABLE_IDLE_E(3); + enable_E4(); + g_uc_extruder_last_move[4] = (BLOCK_BUFFER_SIZE) * 2; + break; + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + } + #else + enable_E0(); + enable_E1(); + enable_E2(); + enable_E3(); + enable_E4(); + #endif + } + + if (esteps) + NOLESS(fr_mm_s, min_feedrate_mm_s); + else + NOLESS(fr_mm_s, min_travel_feedrate_mm_s); + /** * This part of the code calculates the total length of the movement. * For cartesian bots, the X_AXIS is the real X movement and same for Y_AXIS. @@ -1887,188 +1906,53 @@ bool Planner::_populate_block(block_t * const block, bool split_move, * So we need to create other 2 "AXIS", named X_HEAD and Y_HEAD, meaning the real displacement of the Head. * Having the real displacement of the head, we can calculate the total movement length and apply the desired speed. */ - struct DistanceMM : abce_float_t { - #if EITHER(IS_CORE, MARKFORGED_XY) - xyz_pos_t head; - #endif - } steps_dist_mm; #if IS_CORE + float delta_mm[Z_HEAD + 1]; #if CORE_IS_XY - steps_dist_mm.head.x = da * steps_to_mm[A_AXIS]; - steps_dist_mm.head.y = db * steps_to_mm[B_AXIS]; - steps_dist_mm.z = dc * steps_to_mm[Z_AXIS]; - steps_dist_mm.a = (da + db) * steps_to_mm[A_AXIS]; - steps_dist_mm.b = CORESIGN(da - db) * steps_to_mm[B_AXIS]; + delta_mm[X_HEAD] = da * steps_to_mm[A_AXIS]; + delta_mm[Y_HEAD] = db * steps_to_mm[B_AXIS]; + delta_mm[Z_AXIS] = dc * steps_to_mm[Z_AXIS]; + delta_mm[A_AXIS] = (da + db) * steps_to_mm[A_AXIS]; + delta_mm[B_AXIS] = CORESIGN(da - db) * steps_to_mm[B_AXIS]; #elif CORE_IS_XZ - steps_dist_mm.head.x = da * steps_to_mm[A_AXIS]; - steps_dist_mm.y = db * steps_to_mm[Y_AXIS]; - steps_dist_mm.head.z = dc * steps_to_mm[C_AXIS]; - steps_dist_mm.a = (da + dc) * steps_to_mm[A_AXIS]; - steps_dist_mm.c = CORESIGN(da - dc) * steps_to_mm[C_AXIS]; + delta_mm[X_HEAD] = da * steps_to_mm[A_AXIS]; + delta_mm[Y_AXIS] = db * steps_to_mm[Y_AXIS]; + delta_mm[Z_HEAD] = dc * steps_to_mm[C_AXIS]; + delta_mm[A_AXIS] = (da + dc) * steps_to_mm[A_AXIS]; + delta_mm[C_AXIS] = CORESIGN(da - dc) * steps_to_mm[C_AXIS]; #elif CORE_IS_YZ - steps_dist_mm.x = da * steps_to_mm[X_AXIS]; - steps_dist_mm.head.y = db * steps_to_mm[B_AXIS]; - steps_dist_mm.head.z = dc * steps_to_mm[C_AXIS]; - steps_dist_mm.b = (db + dc) * steps_to_mm[B_AXIS]; - steps_dist_mm.c = CORESIGN(db - dc) * steps_to_mm[C_AXIS]; + delta_mm[X_AXIS] = da * steps_to_mm[X_AXIS]; + delta_mm[Y_HEAD] = db * steps_to_mm[B_AXIS]; + delta_mm[Z_HEAD] = dc * steps_to_mm[C_AXIS]; + delta_mm[B_AXIS] = (db + dc) * steps_to_mm[B_AXIS]; + delta_mm[C_AXIS] = CORESIGN(db - dc) * steps_to_mm[C_AXIS]; #endif - #elif ENABLED(MARKFORGED_XY) - steps_dist_mm.head.x = da * steps_to_mm[A_AXIS]; - steps_dist_mm.head.y = db * steps_to_mm[B_AXIS]; - steps_dist_mm.z = dc * steps_to_mm[Z_AXIS]; - steps_dist_mm.a = (da - db) * steps_to_mm[A_AXIS]; - steps_dist_mm.b = db * steps_to_mm[B_AXIS]; #else - steps_dist_mm.a = da * steps_to_mm[A_AXIS]; - steps_dist_mm.b = db * steps_to_mm[B_AXIS]; - steps_dist_mm.c = dc * steps_to_mm[C_AXIS]; + float delta_mm[ABCE]; + delta_mm[A_AXIS] = da * steps_to_mm[A_AXIS]; + delta_mm[B_AXIS] = db * steps_to_mm[B_AXIS]; + delta_mm[C_AXIS] = dc * steps_to_mm[C_AXIS]; #endif + delta_mm[E_AXIS] = esteps_float * steps_to_mm[E_AXIS_N]; - #if EXTRUDERS - steps_dist_mm.e = esteps_float * steps_to_mm[E_AXIS_N(extruder)]; - #else - steps_dist_mm.e = 0.0f; - #endif - - TERN_(LCD_SHOW_E_TOTAL, e_move_accumulator += steps_dist_mm.e); - - if (block->steps.a < MIN_STEPS_PER_SEGMENT && block->steps.b < MIN_STEPS_PER_SEGMENT && block->steps.c < MIN_STEPS_PER_SEGMENT) { - block->millimeters = (0 - #if EXTRUDERS - + ABS(steps_dist_mm.e) + if (block->steps[A_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[B_AXIS] < MIN_STEPS_PER_SEGMENT && block->steps[C_AXIS] < MIN_STEPS_PER_SEGMENT) { + block->millimeters = ABS(delta_mm[E_AXIS]); + } + else if (!millimeters) { + block->millimeters = SQRT( + #if CORE_IS_XY + sq(delta_mm[X_HEAD]) + sq(delta_mm[Y_HEAD]) + sq(delta_mm[Z_AXIS]) + #elif CORE_IS_XZ + sq(delta_mm[X_HEAD]) + sq(delta_mm[Y_AXIS]) + sq(delta_mm[Z_HEAD]) + #elif CORE_IS_YZ + sq(delta_mm[X_AXIS]) + sq(delta_mm[Y_HEAD]) + sq(delta_mm[Z_HEAD]) + #else + sq(delta_mm[X_AXIS]) + sq(delta_mm[Y_AXIS]) + sq(delta_mm[Z_AXIS]) #endif ); } - else { - if (millimeters) - block->millimeters = millimeters; - else - block->millimeters = SQRT( - #if EITHER(CORE_IS_XY, MARKFORGED_XY) - sq(steps_dist_mm.head.x) + sq(steps_dist_mm.head.y) + sq(steps_dist_mm.z) - #elif CORE_IS_XZ - sq(steps_dist_mm.head.x) + sq(steps_dist_mm.y) + sq(steps_dist_mm.head.z) - #elif CORE_IS_YZ - sq(steps_dist_mm.x) + sq(steps_dist_mm.head.y) + sq(steps_dist_mm.head.z) - #else - sq(steps_dist_mm.x) + sq(steps_dist_mm.y) + sq(steps_dist_mm.z) - #endif - ); - - /** - * At this point at least one of the axes has more steps than - * MIN_STEPS_PER_SEGMENT, ensuring the segment won't get dropped as - * zero-length. It's important to not apply corrections - * to blocks that would get dropped! - * - * A correction function is permitted to add steps to an axis, it - * should *never* remove steps! - */ - TERN_(BACKLASH_COMPENSATION, backlash.add_correction_steps(da, db, dc, dm, block)); - } - - #if EXTRUDERS - block->steps.e = esteps; - #endif - - block->step_event_count = _MAX(block->steps.a, block->steps.b, block->steps.c, esteps); - - // Bail if this is a zero-length block - if (block->step_event_count < MIN_STEPS_PER_SEGMENT) return false; - - #if ENABLED(MIXING_EXTRUDER) - MIXER_POPULATE_BLOCK(); - #endif - - TERN_(HAS_CUTTER, block->cutter_power = cutter.power); - - #if HAS_FAN - FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; - #endif - - #if ENABLED(BARICUDA) - block->valve_pressure = baricuda_valve_pressure; - block->e_to_p_pressure = baricuda_e_to_p_pressure; - #endif - - #if HAS_MULTI_EXTRUDER - block->extruder = extruder; - #endif - - #if ENABLED(AUTO_POWER_CONTROL) - if (block->steps.x || block->steps.y || block->steps.z) - powerManager.power_on(); - #endif - - // Enable active axes - #if EITHER(CORE_IS_XY, MARKFORGED_XY) - if (block->steps.a || block->steps.b) { - ENABLE_AXIS_X(); - ENABLE_AXIS_Y(); - } - #if DISABLED(Z_LATE_ENABLE) - if (block->steps.z) ENABLE_AXIS_Z(); - #endif - #elif CORE_IS_XZ - if (block->steps.a || block->steps.c) { - ENABLE_AXIS_X(); - ENABLE_AXIS_Z(); - } - if (block->steps.y) ENABLE_AXIS_Y(); - #elif CORE_IS_YZ - if (block->steps.b || block->steps.c) { - ENABLE_AXIS_Y(); - ENABLE_AXIS_Z(); - } - if (block->steps.x) ENABLE_AXIS_X(); - #else - if (block->steps.x) ENABLE_AXIS_X(); - if (block->steps.y) ENABLE_AXIS_Y(); - #if DISABLED(Z_LATE_ENABLE) - if (block->steps.z) ENABLE_AXIS_Z(); - #endif - #endif - - // Enable extruder(s) - #if EXTRUDERS - if (esteps) { - TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); - - #if ENABLED(DISABLE_INACTIVE_EXTRUDER) // Enable only the selected extruder - - LOOP_L_N(i, EXTRUDERS) - if (g_uc_extruder_last_move[i] > 0) g_uc_extruder_last_move[i]--; - - #if HAS_DUPLICATION_MODE - if (extruder_duplication_enabled && extruder == 0) { - ENABLE_AXIS_E1(); - g_uc_extruder_last_move[1] = (BLOCK_BUFFER_SIZE) * 2; - } - #endif - - #define ENABLE_ONE_E(N) do{ \ - if (extruder == N) { \ - ENABLE_AXIS_E##N(); \ - g_uc_extruder_last_move[N] = (BLOCK_BUFFER_SIZE) * 2; \ - } \ - else if (!g_uc_extruder_last_move[N]) \ - DISABLE_AXIS_E##N(); \ - }while(0); - - #else - - #define ENABLE_ONE_E(N) ENABLE_AXIS_E##N(); - - #endif - - REPEAT(EXTRUDERS, ENABLE_ONE_E); // (ENABLE_ONE_E must end with semicolon) - } - #endif // EXTRUDERS - - if (esteps) - NOLESS(fr_mm_s, settings.min_feedrate_mm_s); else - NOLESS(fr_mm_s, settings.min_travel_feedrate_mm_s); + block->millimeters = millimeters; const float inverse_millimeters = 1.0f / block->millimeters; // Inverse millimeters to remove multiple divides @@ -2080,133 +1964,122 @@ bool Planner::_populate_block(block_t * const block, bool split_move, const uint8_t moves_queued = nonbusy_movesplanned(); // Slow down when the buffer starts to empty, rather than wait at the corner for a buffer refill - #if EITHER(SLOWDOWN, HAS_WIRED_LCD) || defined(XY_FREQUENCY_LIMIT) + #if ENABLED(SLOWDOWN) || ENABLED(ULTRA_LCD) || defined(XY_FREQUENCY_LIMIT) // Segment time im micro seconds - int32_t segment_time_us = LROUND(1000000.0f / inverse_secs); + uint32_t segment_time_us = LROUND(1000000.0f / inverse_secs); #endif #if ENABLED(SLOWDOWN) - #ifndef SLOWDOWN_DIVISOR - #define SLOWDOWN_DIVISOR 2 - #endif - if (WITHIN(moves_queued, 2, (BLOCK_BUFFER_SIZE) / (SLOWDOWN_DIVISOR) - 1)) { - const int32_t time_diff = settings.min_segment_time_us - segment_time_us; - if (time_diff > 0) { - // Buffer is draining so add extra time. The amount of time added increases if the buffer is still emptied more. - const int32_t nst = segment_time_us + LROUND(2 * time_diff / moves_queued); + if (WITHIN(moves_queued, 2, (BLOCK_BUFFER_SIZE) / 2 - 1)) { + if (segment_time_us < min_segment_time_us) { + // buffer is draining, add extra time. The amount of time added increases if the buffer is still emptied more. + const uint32_t nst = segment_time_us + LROUND(2 * (min_segment_time_us - segment_time_us) / moves_queued); inverse_secs = 1000000.0f / nst; - #if defined(XY_FREQUENCY_LIMIT) || HAS_WIRED_LCD + #if defined(XY_FREQUENCY_LIMIT) || ENABLED(ULTRA_LCD) segment_time_us = nst; #endif } } #endif - #if HAS_WIRED_LCD + #if ENABLED(ULTRA_LCD) // Protect the access to the position. - const bool was_enabled = stepper.suspend(); + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); block_buffer_runtime_us += segment_time_us; - block->segment_time_us = segment_time_us; - if (was_enabled) stepper.wake_up(); + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); #endif - block->nominal_speed_sqr = sq(block->millimeters * inverse_secs); // (mm/sec)^2 Always > 0 + block->nominal_speed_sqr = sq(block->millimeters * inverse_secs); // (mm/sec)^2 Always > 0 block->nominal_rate = CEIL(block->step_event_count * inverse_secs); // (step/sec) Always > 0 #if ENABLED(FILAMENT_WIDTH_SENSOR) - if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM) // Only for extruder with filament sensor - filwidth.advance_e(steps_dist_mm.e); + static float filwidth_e_count = 0, filwidth_delay_dist = 0; + + //FMM update ring buffer used for delay with filament measurements + if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM && filwidth_delay_index[1] >= 0) { //only for extruder with filament sensor and if ring buffer is initialized + + constexpr int MMD_CM = MAX_MEASUREMENT_DELAY + 1, MMD_MM = MMD_CM * 10; + + // increment counters with next move in e axis + filwidth_e_count += delta_mm[E_AXIS]; + filwidth_delay_dist += delta_mm[E_AXIS]; + + // Only get new measurements on forward E movement + if (!UNEAR_ZERO(filwidth_e_count)) { + + // Loop the delay distance counter (modulus by the mm length) + while (filwidth_delay_dist >= MMD_MM) filwidth_delay_dist -= MMD_MM; + + // Convert into an index into the measurement array + filwidth_delay_index[0] = int8_t(filwidth_delay_dist * 0.1f); + + // If the index has changed (must have gone forward)... + if (filwidth_delay_index[0] != filwidth_delay_index[1]) { + filwidth_e_count = 0; // Reset the E movement counter + const int8_t meas_sample = thermalManager.widthFil_to_size_ratio(); + do { + filwidth_delay_index[1] = (filwidth_delay_index[1] + 1) % MMD_CM; // The next unused slot + measurement_delay[filwidth_delay_index[1]] = meas_sample; // Store the measurement + } while (filwidth_delay_index[0] != filwidth_delay_index[1]); // More slots to fill? + } + } + } #endif - // Calculate and limit speed in mm/sec - - xyze_float_t current_speed; - float speed_factor = 1.0f; // factor <1 decreases speed - - // Linear axes first with less logic - LOOP_XYZ(i) { - current_speed[i] = steps_dist_mm[i] * inverse_secs; - const feedRate_t cs = ABS(current_speed[i]), - max_fr = settings.max_feedrate_mm_s[i]; - if (cs > max_fr) NOMORE(speed_factor, max_fr / cs); + // Calculate and limit speed in mm/sec for each axis + float current_speed[NUM_AXIS], speed_factor = 1.0f; // factor <1 decreases speed + LOOP_XYZE(i) { + const float cs = ABS((current_speed[i] = delta_mm[i] * inverse_secs)); + #if ENABLED(DISTINCT_E_FACTORS) + if (i == E_AXIS) i += extruder; + #endif + if (cs > max_feedrate_mm_s[i]) NOMORE(speed_factor, max_feedrate_mm_s[i] / cs); } - // Limit speed on extruders, if any - #if EXTRUDERS - { - current_speed.e = steps_dist_mm.e * inverse_secs; - #if HAS_MIXER_SYNC_CHANNEL - // Move all mixing extruders at the specified rate - if (mixer.get_current_vtool() == MIXER_AUTORETRACT_TOOL) - current_speed.e *= MIXING_STEPPERS; - #endif - - const feedRate_t cs = ABS(current_speed.e), - max_fr = settings.max_feedrate_mm_s[E_AXIS_N(extruder)] - * TERN(HAS_MIXER_SYNC_CHANNEL, MIXING_STEPPERS, 1); - - if (cs > max_fr) NOMORE(speed_factor, max_fr / cs); //respect max feedrate on any movement (doesn't matter if E axes only or not) - - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - const feedRate_t max_vfr = volumetric_extruder_feedrate_limit[extruder] - * TERN(HAS_MIXER_SYNC_CHANNEL, MIXING_STEPPERS, 1); - - // TODO: Doesn't work properly for joined segments. Set MIN_STEPS_PER_SEGMENT 1 as workaround. - - if (block->steps.a || block->steps.b || block->steps.c) { - - if (max_vfr > 0 && cs > max_vfr) { - NOMORE(speed_factor, max_vfr / cs); // respect volumetric extruder limit (if any) - /* <-- add a slash to enable - SERIAL_ECHOPAIR("volumetric extruder limit enforced: ", (cs * CIRCLE_AREA(filament_size[extruder] * 0.5f))); - SERIAL_ECHOPAIR(" mm^3/s (", cs); - SERIAL_ECHOPAIR(" mm/s) limited to ", (max_vfr * CIRCLE_AREA(filament_size[extruder] * 0.5f))); - SERIAL_ECHOPAIR(" mm^3/s (", max_vfr); - SERIAL_ECHOLNPGM(" mm/s)"); - //*/ - } - } - #endif - } - #endif - + // Max segment time in µs. #ifdef XY_FREQUENCY_LIMIT - static uint8_t old_direction_bits; // = 0 + // Check and limit the xy direction change frequency + const unsigned char direction_change = block->direction_bits ^ old_direction_bits; + old_direction_bits = block->direction_bits; + segment_time_us = LROUND((float)segment_time_us / speed_factor); - if (xy_freq_limit_hz) { - // Check and limit the xy direction change frequency - const uint8_t direction_change = block->direction_bits ^ old_direction_bits; - old_direction_bits = block->direction_bits; - segment_time_us = LROUND(float(segment_time_us) / speed_factor); + uint32_t xs0 = axis_segment_time_us[X_AXIS][0], + xs1 = axis_segment_time_us[X_AXIS][1], + xs2 = axis_segment_time_us[X_AXIS][2], + ys0 = axis_segment_time_us[Y_AXIS][0], + ys1 = axis_segment_time_us[Y_AXIS][1], + ys2 = axis_segment_time_us[Y_AXIS][2]; - static int32_t xs0, xs1, xs2, ys0, ys1, ys2; - if (segment_time_us > xy_freq_min_interval_us) - xs2 = xs1 = ys2 = ys1 = xy_freq_min_interval_us; - else { - xs2 = xs1; xs1 = xs0; - ys2 = ys1; ys1 = ys0; - } - xs0 = TEST(direction_change, X_AXIS) ? segment_time_us : xy_freq_min_interval_us; - ys0 = TEST(direction_change, Y_AXIS) ? segment_time_us : xy_freq_min_interval_us; - - if (segment_time_us < xy_freq_min_interval_us) { - const int32_t least_xy_segment_time = _MIN(_MAX(xs0, xs1, xs2), _MAX(ys0, ys1, ys2)); - if (least_xy_segment_time < xy_freq_min_interval_us) { - float freq_xy_feedrate = (speed_factor * least_xy_segment_time) / xy_freq_min_interval_us; - NOLESS(freq_xy_feedrate, xy_freq_min_speed_factor); - NOMORE(speed_factor, freq_xy_feedrate); - } - } + if (TEST(direction_change, X_AXIS)) { + xs2 = axis_segment_time_us[X_AXIS][2] = xs1; + xs1 = axis_segment_time_us[X_AXIS][1] = xs0; + xs0 = 0; } + xs0 = axis_segment_time_us[X_AXIS][0] = xs0 + segment_time_us; + if (TEST(direction_change, Y_AXIS)) { + ys2 = axis_segment_time_us[Y_AXIS][2] = axis_segment_time_us[Y_AXIS][1]; + ys1 = axis_segment_time_us[Y_AXIS][1] = axis_segment_time_us[Y_AXIS][0]; + ys0 = 0; + } + ys0 = axis_segment_time_us[Y_AXIS][0] = ys0 + segment_time_us; + + const uint32_t max_x_segment_time = MAX3(xs0, xs1, xs2), + max_y_segment_time = MAX3(ys0, ys1, ys2), + min_xy_segment_time = MIN(max_x_segment_time, max_y_segment_time); + if (min_xy_segment_time < MAX_FREQ_TIME_US) { + const float low_sf = speed_factor * min_xy_segment_time / (MAX_FREQ_TIME_US); + NOMORE(speed_factor, low_sf); + } #endif // XY_FREQUENCY_LIMIT // Correct the speed if (speed_factor < 1.0f) { - current_speed *= speed_factor; + LOOP_XYZE(i) current_speed[i] *= speed_factor; block->nominal_rate *= speed_factor; block->nominal_speed_sqr = block->nominal_speed_sqr * sq(speed_factor); } @@ -2214,10 +2087,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Compute and limit the acceleration rate for the trapezoid generator. const float steps_per_mm = block->step_event_count * inverse_millimeters; uint32_t accel; - if (!block->steps.a && !block->steps.b && !block->steps.c) { + if (!block->steps[A_AXIS] && !block->steps[B_AXIS] && !block->steps[C_AXIS]) { // convert to: acceleration steps/sec^2 - accel = CEIL(settings.retract_acceleration * steps_per_mm); - TERN_(LIN_ADVANCE, block->use_advance_lead = false); + accel = CEIL(retract_acceleration * steps_per_mm); + #if ENABLED(LIN_ADVANCE) + block->use_advance_lead = false; + #endif } else { #define LIMIT_ACCEL_LONG(AXIS,INDX) do{ \ @@ -2235,33 +2110,42 @@ bool Planner::_populate_block(block_t * const block, bool split_move, }while(0) // Start with print or travel acceleration - accel = CEIL((esteps ? settings.acceleration : settings.travel_acceleration) * steps_per_mm); + accel = CEIL((esteps ? acceleration : travel_acceleration) * steps_per_mm); #if ENABLED(LIN_ADVANCE) - #define MAX_E_JERK(N) TERN(HAS_LINEAR_E_JERK, max_e_jerk[E_INDEX_N(N)], max_jerk.e) + #if ENABLED(JUNCTION_DEVIATION) + #if ENABLED(DISTINCT_E_FACTORS) + #define MAX_E_JERK max_e_jerk[extruder] + #else + #define MAX_E_JERK max_e_jerk + #endif + #else + #define MAX_E_JERK max_jerk[E_AXIS] + #endif /** + * * Use LIN_ADVANCE for blocks if all these are true: * * esteps : This is a print move, because we checked for A, B, C steps before. * - * extruder_advance_K[active_extruder] : There is an advance factor set for this extruder. + * extruder_advance_K : There is an advance factor set. * * de > 0 : Extruder is running forward (e.g., for "Wipe while retracting" (Slic3r) or "Combing" (Cura) moves) */ block->use_advance_lead = esteps - && extruder_advance_K[active_extruder] + && extruder_advance_K && de > 0; if (block->use_advance_lead) { - block->e_D_ratio = (target_float.e - position_float.e) / + block->e_D_ratio = (target_float[E_AXIS] - position_float[E_AXIS]) / #if IS_KINEMATIC block->millimeters #else - SQRT(sq(target_float.x - position_float.x) - + sq(target_float.y - position_float.y) - + sq(target_float.z - position_float.z)) + SQRT(sq(target_float[X_AXIS] - position_float[X_AXIS]) + + sq(target_float[Y_AXIS] - position_float[Y_AXIS]) + + sq(target_float[Z_AXIS] - position_float[Z_AXIS])) #endif ; @@ -2270,26 +2154,33 @@ bool Planner::_populate_block(block_t * const block, bool split_move, if (block->e_D_ratio > 3.0f) block->use_advance_lead = false; else { - const uint32_t max_accel_steps_per_s2 = MAX_E_JERK(extruder) / (extruder_advance_K[active_extruder] * block->e_D_ratio) * steps_per_mm; - if (TERN0(LA_DEBUG, accel > max_accel_steps_per_s2)) - SERIAL_ECHOLNPGM("Acceleration limited."); + const uint32_t max_accel_steps_per_s2 = MAX_E_JERK / (extruder_advance_K * block->e_D_ratio) * steps_per_mm; + #if ENABLED(LA_DEBUG) + if (accel > max_accel_steps_per_s2) SERIAL_ECHOLNPGM("Acceleration limited."); + #endif NOMORE(accel, max_accel_steps_per_s2); } } #endif + #if ENABLED(DISTINCT_E_FACTORS) + #define ACCEL_IDX extruder + #else + #define ACCEL_IDX 0 + #endif + // Limit acceleration per axis if (block->step_event_count <= cutoff_long) { LIMIT_ACCEL_LONG(A_AXIS, 0); LIMIT_ACCEL_LONG(B_AXIS, 0); LIMIT_ACCEL_LONG(C_AXIS, 0); - LIMIT_ACCEL_LONG(E_AXIS, E_INDEX_N(extruder)); + LIMIT_ACCEL_LONG(E_AXIS, ACCEL_IDX); } else { LIMIT_ACCEL_FLOAT(A_AXIS, 0); LIMIT_ACCEL_FLOAT(B_AXIS, 0); LIMIT_ACCEL_FLOAT(C_AXIS, 0); - LIMIT_ACCEL_FLOAT(E_AXIS, E_INDEX_N(extruder)); + LIMIT_ACCEL_FLOAT(E_AXIS, ACCEL_IDX); } } block->acceleration_steps_per_s2 = accel; @@ -2299,9 +2190,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #endif #if ENABLED(LIN_ADVANCE) if (block->use_advance_lead) { - block->advance_speed = (STEPPER_TIMER_RATE) / (extruder_advance_K[active_extruder] * block->e_D_ratio * block->acceleration * settings.axis_steps_per_mm[E_AXIS_N(extruder)]); + block->advance_speed = (STEPPER_TIMER_RATE) / (extruder_advance_K * block->e_D_ratio * block->acceleration * axis_steps_per_mm[E_AXIS_N]); #if ENABLED(LA_DEBUG) - if (extruder_advance_K[active_extruder] * block->e_D_ratio * block->acceleration * 2 < SQRT(block->nominal_speed_sqr) * block->e_D_ratio) + if (extruder_advance_K * block->e_D_ratio * block->acceleration * 2 < SQRT(block->nominal_speed_sqr) * block->e_D_ratio) SERIAL_ECHOLNPGM("More than 2 steps per eISR loop executed."); if (block->advance_speed < 200) SERIAL_ECHOLNPGM("eISR running at > 10kHz."); @@ -2311,7 +2202,8 @@ bool Planner::_populate_block(block_t * const block, bool split_move, float vmax_junction_sqr; // Initial limit on the segment entry velocity (mm/s)^2 - #if HAS_JUNCTION_DEVIATION + #if ENABLED(JUNCTION_DEVIATION) + /** * Compute maximum allowable entry speed at junction by centripetal acceleration approximation. * Let a circle be tangent to both previous and current path line segments, where the junction @@ -2347,33 +2239,24 @@ bool Planner::_populate_block(block_t * const block, bool split_move, already calculated in a different place. */ // Unit vector of previous path line segment - static xyze_float_t prev_unit_vec; + static float previous_unit_vec[XYZE]; - xyze_float_t unit_vec = - #if HAS_DIST_MM_ARG - cart_dist_mm - #else - { steps_dist_mm.x, steps_dist_mm.y, steps_dist_mm.z, steps_dist_mm.e } - #endif - ; - - /** - * On CoreXY the length of the vector [A,B] is SQRT(2) times the length of the head movement vector [X,Y]. - * So taking Z and E into account, we cannot scale to a unit vector with "inverse_millimeters". - * => normalize the complete junction vector. - * Elsewise, when needed JD will factor-in the E component - */ - if (EITHER(IS_CORE, MARKFORGED_XY) || esteps > 0) - normalize_junction_vector(unit_vec); // Normalize with XYZE components - else - unit_vec *= inverse_millimeters; // Use pre-calculated (1 / SQRT(x^2 + y^2 + z^2)) + float unit_vec[] = { + delta_mm[A_AXIS] * inverse_millimeters, + delta_mm[B_AXIS] * inverse_millimeters, + delta_mm[C_AXIS] * inverse_millimeters, + delta_mm[E_AXIS] * inverse_millimeters + }; // Skip first block or when previous_nominal_speed is used as a flag for homing and offset cycles. if (moves_queued && !UNEAR_ZERO(previous_nominal_speed_sqr)) { // Compute cosine of angle between previous and current path. (prev_unit_vec is negative) // NOTE: Max junction velocity is computed without sin() or acos() by trig half angle identity. - float junction_cos_theta = (-prev_unit_vec.x * unit_vec.x) + (-prev_unit_vec.y * unit_vec.y) - + (-prev_unit_vec.z * unit_vec.z) + (-prev_unit_vec.e * unit_vec.e); + float junction_cos_theta = -previous_unit_vec[X_AXIS] * unit_vec[X_AXIS] + -previous_unit_vec[Y_AXIS] * unit_vec[Y_AXIS] + -previous_unit_vec[Z_AXIS] * unit_vec[Z_AXIS] + -previous_unit_vec[E_AXIS] * unit_vec[E_AXIS] + ; // NOTE: Computed without any expensive trig, sin() or acos(), by trig half angle identity of cos(theta). if (junction_cos_theta > 0.999999f) { @@ -2384,128 +2267,46 @@ bool Planner::_populate_block(block_t * const block, bool split_move, NOLESS(junction_cos_theta, -0.999999f); // Check for numerical round-off to avoid divide by zero. // Convert delta vector to unit vector - xyze_float_t junction_unit_vec = unit_vec - prev_unit_vec; + float junction_unit_vec[XYZE] = { + unit_vec[X_AXIS] - previous_unit_vec[X_AXIS], + unit_vec[Y_AXIS] - previous_unit_vec[Y_AXIS], + unit_vec[Z_AXIS] - previous_unit_vec[Z_AXIS], + unit_vec[E_AXIS] - previous_unit_vec[E_AXIS] + }; normalize_junction_vector(junction_unit_vec); const float junction_acceleration = limit_value_by_axis_maximum(block->acceleration, junction_unit_vec), sin_theta_d2 = SQRT(0.5f * (1.0f - junction_cos_theta)); // Trig half angle identity. Always positive. - vmax_junction_sqr = junction_acceleration * junction_deviation_mm * sin_theta_d2 / (1.0f - sin_theta_d2); + vmax_junction_sqr = (junction_acceleration * junction_deviation_mm * sin_theta_d2) / (1.0f - sin_theta_d2); + if (block->millimeters < 1) { - #if ENABLED(JD_HANDLE_SMALL_SEGMENTS) + // Fast acos approximation, minus the error bar to be safe + const float junction_theta = (RADIANS(-40) * sq(junction_cos_theta) - RADIANS(50)) * junction_cos_theta + RADIANS(90) - 0.18f; - // For small moves with >135° junction (octagon) find speed for approximate arc - if (block->millimeters < 1 && junction_cos_theta < -0.7071067812f) { - - #if ENABLED(JD_USE_MATH_ACOS) - - #error "TODO: Inline maths with the MCU / FPU." - - #elif ENABLED(JD_USE_LOOKUP_TABLE) - - // Fast acos approximation (max. error +-0.01 rads) - // Based on LUT table and linear interpolation - - /** - * // Generate the JD Lookup Table - * constexpr float c = 1.00751495f; // Correction factor to center error around 0 - * for (int i = 0; i < jd_lut_count - 1; ++i) { - * const float x0 = (sq(i) - 1) / sq(i), - * y0 = acos(x0) * (i == 0 ? 1 : c), - * x1 = i < jd_lut_count - 1 ? 0.5 * x0 + 0.5 : 0.999999f, - * y1 = acos(x1) * (i < jd_lut_count - 1 ? c : 1); - * jd_lut_k[i] = (y0 - y1) / (x0 - x1); - * jd_lut_b[i] = (y1 * x0 - y0 * x1) / (x0 - x1); - * } - * - * // Compute correction factor (Set c to 1.0f first!) - * float min = INFINITY, max = -min; - * for (float t = 0; t <= 1; t += 0.0003f) { - * const float e = acos(t) / approx(t); - * if (isfinite(e)) { - * if (e < min) min = e; - * if (e > max) max = e; - * } - * } - * fprintf(stderr, "%.9gf, ", (min + max) / 2); - */ - static constexpr int16_t jd_lut_count = 16; - static constexpr uint16_t jd_lut_tll = _BV(jd_lut_count - 1); - static constexpr int16_t jd_lut_tll0 = __builtin_clz(jd_lut_tll) + 1; // i.e., 16 - jd_lut_count + 1 - static constexpr float jd_lut_k[jd_lut_count] PROGMEM = { - -1.03145837f, -1.30760646f, -1.75205851f, -2.41705704f, - -3.37769222f, -4.74888992f, -6.69649887f, -9.45661736f, - -13.3640480f, -18.8928222f, -26.7136841f, -37.7754593f, - -53.4201813f, -75.5458374f, -106.836761f, -218.532821f }; - static constexpr float jd_lut_b[jd_lut_count] PROGMEM = { - 1.57079637f, 1.70887053f, 2.04220939f, 2.62408352f, - 3.52467871f, 4.85302639f, 6.77020454f, 9.50875854f, - 13.4009285f, 18.9188995f, 26.7321243f, 37.7885055f, - 53.4293975f, 75.5523529f, 106.841369f, 218.534011f }; - - const float neg = junction_cos_theta < 0 ? -1 : 1, - t = neg * junction_cos_theta; - - const int16_t idx = (t < 0.00000003f) ? 0 : __builtin_clz(uint16_t((1.0f - t) * jd_lut_tll)) - jd_lut_tll0; - - float junction_theta = t * pgm_read_float(&jd_lut_k[idx]) + pgm_read_float(&jd_lut_b[idx]); - if (neg > 0) junction_theta = RADIANS(180) - junction_theta; // acos(-t) - - #else - - // Fast acos(-t) approximation (max. error +-0.033rad = 1.89°) - // Based on MinMax polynomial published by W. Randolph Franklin, see - // https://wrf.ecse.rpi.edu/Research/Short_Notes/arcsin/onlyelem.html - // acos( t) = pi / 2 - asin(x) - // acos(-t) = pi - acos(t) ... pi / 2 + asin(x) - - const float neg = junction_cos_theta < 0 ? -1 : 1, - t = neg * junction_cos_theta, - asinx = 0.032843707f - + t * (-1.451838349f - + t * ( 29.66153956f - + t * (-131.1123477f - + t * ( 262.8130562f - + t * (-242.7199627f - + t * ( 84.31466202f ) ))))), - junction_theta = RADIANS(90) + neg * asinx; // acos(-t) - - // NOTE: junction_theta bottoms out at 0.033 which avoids divide by 0. - - #endif - - const float limit_sqr = (block->millimeters * junction_acceleration) / junction_theta; + // If angle is greater than 135 degrees (octagon), find speed for approximate arc + if (junction_theta > RADIANS(135)) { + const float limit_sqr = block->millimeters / (RADIANS(180) - junction_theta) * junction_acceleration; NOMORE(vmax_junction_sqr, limit_sqr); } - - #endif // JD_HANDLE_SMALL_SEGMENTS + } } // Get the lowest speed - vmax_junction_sqr = _MIN(vmax_junction_sqr, block->nominal_speed_sqr, previous_nominal_speed_sqr); + vmax_junction_sqr = MIN3(vmax_junction_sqr, block->nominal_speed_sqr, previous_nominal_speed_sqr); } else // Init entry speed to zero. Assume it starts from rest. Planner will correct this later. vmax_junction_sqr = 0; - prev_unit_vec = unit_vec; + COPY(previous_unit_vec, unit_vec); - #endif - - #ifdef USE_CACHED_SQRT - #define CACHED_SQRT(N, V) \ - static float saved_V, N; \ - if (V != saved_V) { N = SQRT(V); saved_V = V; } - #else - #define CACHED_SQRT(N, V) const float N = SQRT(V) - #endif - - #if HAS_CLASSIC_JERK + #else // Classic Jerk Limiting /** * Adapted from Průša MKS firmware * https://github.com/prusa3d/Prusa-Firmware */ - CACHED_SQRT(nominal_speed, block->nominal_speed_sqr); + const float nominal_speed = SQRT(block->nominal_speed_sqr); // Exit speed limited by a jerk to full halt of a previous last segment static float previous_safe_speed; @@ -2513,15 +2314,10 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Start with a safe speed (from which the machine may halt to stop immediately). float safe_speed = nominal_speed; - #ifndef TRAVEL_EXTRA_XYJERK - #define TRAVEL_EXTRA_XYJERK 0 - #endif - const float extra_xyjerk = (de <= 0) ? TRAVEL_EXTRA_XYJERK : 0; - uint8_t limited = 0; - TERN(HAS_LINEAR_E_JERK, LOOP_XYZ, LOOP_XYZE)(i) { + LOOP_XYZE(i) { const float jerk = ABS(current_speed[i]), // cs : Starting from zero, change in speed for this axis - maxj = (max_jerk[i] + (i == X_AXIS || i == Y_AXIS ? extra_xyjerk : 0.0f)); // mj : The max jerk setting for this axis + maxj = max_jerk[i]; // mj : The max jerk setting for this axis if (jerk > maxj) { // cs > mj : New current speed too fast? if (limited) { // limited already? const float mjerk = nominal_speed * maxj; // ns*mj @@ -2546,18 +2342,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum. // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. - CACHED_SQRT(previous_nominal_speed, previous_nominal_speed_sqr); - - float smaller_speed_factor = 1.0f; - if (nominal_speed < previous_nominal_speed) { - vmax_junction = nominal_speed; - smaller_speed_factor = vmax_junction / previous_nominal_speed; - } - else - vmax_junction = previous_nominal_speed; + const float previous_nominal_speed = SQRT(previous_nominal_speed_sqr); + vmax_junction = MIN(nominal_speed, previous_nominal_speed); // Now limit the jerk in all axes. - TERN(HAS_LINEAR_E_JERK, LOOP_XYZ, LOOP_XYZE)(axis) { + const float smaller_speed_factor = vmax_junction / previous_nominal_speed; + LOOP_XYZE(axis) { // Limit an axis. We have to differentiate: coasting, reversal of an axis, full stop. float v_exit = previous_speed[axis] * smaller_speed_factor, v_entry = current_speed[axis]; @@ -2569,14 +2359,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Calculate jerk depending on whether the axis is coasting in the same direction or reversing. const float jerk = (v_exit > v_entry) ? // coasting axis reversal - ( (v_entry > 0 || v_exit < 0) ? (v_exit - v_entry) : _MAX(v_exit, -v_entry) ) + ( (v_entry > 0 || v_exit < 0) ? (v_exit - v_entry) : MAX(v_exit, -v_entry) ) : // v_exit <= v_entry coasting axis reversal - ( (v_entry < 0 || v_exit > 0) ? (v_entry - v_exit) : _MAX(-v_exit, v_entry) ); + ( (v_entry < 0 || v_exit > 0) ? (v_entry - v_exit) : MAX(-v_exit, v_entry) ); - const float maxj = (max_jerk[axis] + (axis == X_AXIS || axis == Y_AXIS ? extra_xyjerk : 0.0f)); - - if (jerk > maxj) { - v_factor *= maxj / jerk; + if (jerk > max_jerk[axis]) { + v_factor *= max_jerk[axis] / jerk; ++limited; } } @@ -2591,12 +2379,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, vmax_junction = safe_speed; previous_safe_speed = safe_speed; - - #if HAS_JUNCTION_DEVIATION - NOMORE(vmax_junction_sqr, sq(vmax_junction)); // Throttle down to max speed - #else - vmax_junction_sqr = sq(vmax_junction); // Go up or down to the new speed - #endif + vmax_junction_sqr = sq(vmax_junction); #endif // Classic Jerk Limiting @@ -2608,7 +2391,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // If we are trying to add a split block, start with the // max. allowed speed to avoid an interrupted first move. - block->entry_speed_sqr = !split_move ? sq(float(MINIMUM_PLANNER_SPEED)) : _MIN(vmax_junction_sqr, v_allowable_sqr); + block->entry_speed_sqr = !split_move ? sq(float(MINIMUM_PLANNER_SPEED)) : MIN(vmax_junction_sqr, v_allowable_sqr); // Initialize planner efficiency flags // Set flag if block will always reach maximum junction speed regardless of entry/exit speeds. @@ -2621,17 +2404,18 @@ bool Planner::_populate_block(block_t * const block, bool split_move, block->flag |= block->nominal_speed_sqr <= v_allowable_sqr ? BLOCK_FLAG_RECALCULATE | BLOCK_FLAG_NOMINAL_LENGTH : BLOCK_FLAG_RECALCULATE; // Update previous path unit_vector and nominal speed - previous_speed = current_speed; + COPY(previous_speed, current_speed); previous_nominal_speed_sqr = block->nominal_speed_sqr; - position = target; // Update the position - - TERN_(HAS_POSITION_FLOAT, position_float = target_float); - TERN_(GRADIENT_MIX, mixer.gradient_control(target_float.z)); - TERN_(POWER_LOSS_RECOVERY, block->sdpos = recovery.command_sdpos()); - - return true; // Movement was accepted + // Update the position + static_assert(COUNT(target) > 1, "Parameter to _buffer_steps must be (&target)[XYZE]!"); + COPY(position, target); + #if HAS_POSITION_FLOAT + COPY(position_float, target_float); + #endif + // Movement was accepted + return true; } // _populate_block() /** @@ -2648,7 +2432,10 @@ void Planner::buffer_sync_block() { block->flag = BLOCK_FLAG_SYNC_POSITION; - block->position = position; + block->position[A_AXIS] = position[A_AXIS]; + block->position[B_AXIS] = position[B_AXIS]; + block->position[C_AXIS] = position[C_AXIS]; + block->position[E_AXIS] = position[E_AXIS]; // If this is the first added movement, reload the delay, otherwise, cancel it. if (block_buffer_head == block_buffer_tail) { @@ -2676,86 +2463,77 @@ void Planner::buffer_sync_block() { * fr_mm_s - (target) speed of the move * extruder - target extruder * millimeters - the length of the movement, if known - * - * Return 'false' if no segment was queued due to cleaning, cold extrusion, full queue, etc. */ -bool Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e - #if HAS_DIST_MM_ARG - , const xyze_float_t &cart_dist_mm - #endif - , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ -) { +bool Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e, const float &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/) { // If we are cleaning, do not accept queuing of movements if (cleaning_buffer_counter) return false; // When changing extruders recalculate steps corresponding to the E position #if ENABLED(DISTINCT_E_FACTORS) - if (last_extruder != extruder && settings.axis_steps_per_mm[E_AXIS_N(extruder)] != settings.axis_steps_per_mm[E_AXIS_N(last_extruder)]) { - position.e = LROUND(position.e * settings.axis_steps_per_mm[E_AXIS_N(extruder)] * steps_to_mm[E_AXIS_N(last_extruder)]); + if (last_extruder != extruder && axis_steps_per_mm[E_AXIS_N] != axis_steps_per_mm[E_AXIS + last_extruder]) { + position[E_AXIS] = LROUND(position[E_AXIS] * axis_steps_per_mm[E_AXIS_N] * steps_to_mm[E_AXIS + last_extruder]); last_extruder = extruder; } #endif // The target position of the tool in absolute steps // Calculate target position in absolute steps - const abce_long_t target = { - int32_t(LROUND(a * settings.axis_steps_per_mm[A_AXIS])), - int32_t(LROUND(b * settings.axis_steps_per_mm[B_AXIS])), - int32_t(LROUND(c * settings.axis_steps_per_mm[C_AXIS])), - int32_t(LROUND(e * settings.axis_steps_per_mm[E_AXIS_N(extruder)])) + const int32_t target[ABCE] = { + LROUND(a * axis_steps_per_mm[A_AXIS]), + LROUND(b * axis_steps_per_mm[B_AXIS]), + LROUND(c * axis_steps_per_mm[C_AXIS]), + LROUND(e * axis_steps_per_mm[E_AXIS_N]) }; #if HAS_POSITION_FLOAT - const xyze_pos_t target_float = { a, b, c, e }; + const float target_float[XYZE] = { a, b, c, e }; #endif // DRYRUN prevents E moves from taking place - if (DEBUGGING(DRYRUN) || TERN0(CANCEL_OBJECTS, cancelable.skipping)) { - position.e = target.e; - TERN_(HAS_POSITION_FLOAT, position_float.e = e); + if (DEBUGGING(DRYRUN)) { + position[E_AXIS] = target[E_AXIS]; + #if HAS_POSITION_FLOAT + position_float[E_AXIS] = e; + #endif } /* <-- add a slash to enable SERIAL_ECHOPAIR(" buffer_segment FR:", fr_mm_s); #if IS_KINEMATIC SERIAL_ECHOPAIR(" A:", a); - SERIAL_ECHOPAIR(" (", position.a); - SERIAL_ECHOPAIR("->", target.a); + SERIAL_ECHOPAIR(" (", position[A_AXIS]); + SERIAL_ECHOPAIR("->", target[A_AXIS]); SERIAL_ECHOPAIR(") B:", b); #else - SERIAL_ECHOPAIR_P(SP_X_LBL, a); - SERIAL_ECHOPAIR(" (", position.x); - SERIAL_ECHOPAIR("->", target.x); - SERIAL_CHAR(')'); - SERIAL_ECHOPAIR_P(SP_Y_LBL, b); + SERIAL_ECHOPAIR(" X:", a); + SERIAL_ECHOPAIR(" (", position[X_AXIS]); + SERIAL_ECHOPAIR("->", target[X_AXIS]); + SERIAL_ECHOPAIR(") Y:", b); #endif - SERIAL_ECHOPAIR(" (", position.y); - SERIAL_ECHOPAIR("->", target.y); + SERIAL_ECHOPAIR(" (", position[Y_AXIS]); + SERIAL_ECHOPAIR("->", target[Y_AXIS]); #if ENABLED(DELTA) SERIAL_ECHOPAIR(") C:", c); #else - SERIAL_CHAR(')'); - SERIAL_ECHOPAIR_P(SP_Z_LBL, c); + SERIAL_ECHOPAIR(") Z:", c); #endif - SERIAL_ECHOPAIR(" (", position.z); - SERIAL_ECHOPAIR("->", target.z); - SERIAL_CHAR(')'); - SERIAL_ECHOPAIR_P(SP_E_LBL, e); - SERIAL_ECHOPAIR(" (", position.e); - SERIAL_ECHOPAIR("->", target.e); + SERIAL_ECHOPAIR(" (", position[Z_AXIS]); + SERIAL_ECHOPAIR("->", target[Z_AXIS]); + SERIAL_ECHOPAIR(") E:", e); + SERIAL_ECHOPAIR(" (", position[E_AXIS]); + SERIAL_ECHOPAIR("->", target[E_AXIS]); SERIAL_ECHOLNPGM(")"); //*/ - // Queue the movement. Return 'false' if the move was not queued. - if (!_buffer_steps(target + // Queue the movement + if ( + !_buffer_steps(target #if HAS_POSITION_FLOAT , target_float #endif - #if HAS_DIST_MM_ARG - , cart_dist_mm - #endif - , fr_mm_s, extruder, millimeters) + , fr_mm_s, extruder, millimeters + ) ) return false; stepper.wake_up(); @@ -2763,338 +2541,111 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con } // buffer_segment() /** - * Add a new linear movement to the buffer. - * The target is cartesian. It's translated to - * delta/scara if needed. - * - * rx,ry,rz,e - target position in mm or degrees - * fr_mm_s - (target) speed of the move (mm/s) - * extruder - target extruder - * millimeters - the length of the movement, if known - * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) - */ -bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters - #if ENABLED(SCARA_FEEDRATE_SCALING) - , const float &inv_duration - #endif -) { - xyze_pos_t machine = { rx, ry, rz, e }; - TERN_(HAS_POSITION_MODIFIERS, apply_modifiers(machine)); - - #if IS_KINEMATIC - - #if HAS_JUNCTION_DEVIATION - const xyze_pos_t cart_dist_mm = { - rx - position_cart.x, ry - position_cart.y, - rz - position_cart.z, e - position_cart.e - }; - #else - const xyz_pos_t cart_dist_mm = { rx - position_cart.x, ry - position_cart.y, rz - position_cart.z }; - #endif - - float mm = millimeters; - if (mm == 0.0) - mm = (cart_dist_mm.x != 0.0 || cart_dist_mm.y != 0.0) ? cart_dist_mm.magnitude() : ABS(cart_dist_mm.z); - - // Cartesian XYZ to kinematic ABC, stored in global 'delta' - inverse_kinematics(machine); - - #if ENABLED(SCARA_FEEDRATE_SCALING) - // For SCARA scale the feed rate from mm/s to degrees/s - // i.e., Complete the angular vector in the given time. - const float duration_recip = inv_duration ?: fr_mm_s / mm; - const xyz_pos_t diff = delta - position_float; - const feedRate_t feedrate = diff.magnitude() * duration_recip; - #else - const feedRate_t feedrate = fr_mm_s; - #endif - if (buffer_segment(delta.a, delta.b, delta.c, machine.e - #if HAS_JUNCTION_DEVIATION - , cart_dist_mm - #endif - , feedrate, extruder, mm - )) { - position_cart.set(rx, ry, rz, e); - return true; - } - else - return false; - #else - return buffer_segment(machine, fr_mm_s, extruder, millimeters); - #endif -} // buffer_line() - -#if ENABLED(DIRECT_STEPPING) - - void Planner::buffer_page(const page_idx_t page_idx, const uint8_t extruder, const uint16_t num_steps) { - if (!last_page_step_rate) { - kill(GET_TEXT(MSG_BAD_PAGE_SPEED)); - return; - } - - uint8_t next_buffer_head; - block_t * const block = get_next_free_block(next_buffer_head); - - block->flag = BLOCK_FLAG_IS_PAGE; - - #if FAN_COUNT > 0 - FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; - #endif - - #if HAS_MULTI_EXTRUDER - block->extruder = extruder; - #endif - - block->page_idx = page_idx; - - block->step_event_count = num_steps; - block->initial_rate = - block->final_rate = - block->nominal_rate = last_page_step_rate; // steps/s - - block->accelerate_until = 0; - block->decelerate_after = block->step_event_count; - - // Will be set to last direction later if directional format. - block->direction_bits = 0; - - #define PAGE_UPDATE_DIR(AXIS) \ - if (!last_page_dir[_AXIS(AXIS)]) SBI(block->direction_bits, _AXIS(AXIS)); - - if (!DirectStepping::Config::DIRECTIONAL) { - PAGE_UPDATE_DIR(X); - PAGE_UPDATE_DIR(Y); - PAGE_UPDATE_DIR(Z); - PAGE_UPDATE_DIR(E); - } - - // If this is the first added movement, reload the delay, otherwise, cancel it. - if (block_buffer_head == block_buffer_tail) { - // If it was the first queued block, restart the 1st block delivery delay, to - // give the planner an opportunity to queue more movements and plan them - // As there are no queued movements, the Stepper ISR will not touch this - // variable, so there is no risk setting this here (but it MUST be done - // before the following line!!) - delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; - } - - // Move buffer head - block_buffer_head = next_buffer_head; - - enable_all_steppers(); - stepper.wake_up(); - } - -#endif // DIRECT_STEPPING - -/** - * Directly set the planner ABC position (and stepper positions) + * Directly set the planner XYZ position (and stepper positions) * converting mm (or angles for SCARA) into steps. * - * The provided ABC position is in machine units. + * On CORE machines stepper ABC will be translated from the given XYZ. */ -void Planner::set_machine_position_mm(const float &a, const float &b, const float &c, const float &e) { - TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); - TERN_(HAS_POSITION_FLOAT, position_float.set(a, b, c, e)); - position.set(LROUND(a * settings.axis_steps_per_mm[A_AXIS]), - LROUND(b * settings.axis_steps_per_mm[B_AXIS]), - LROUND(c * settings.axis_steps_per_mm[C_AXIS]), - LROUND(e * settings.axis_steps_per_mm[E_AXIS_N(active_extruder)])); +void Planner::_set_position_mm(const float &a, const float &b, const float &c, const float &e) { + #if ENABLED(DISTINCT_E_FACTORS) + last_extruder = active_extruder; + #endif + position[A_AXIS] = LROUND(a * axis_steps_per_mm[A_AXIS]); + position[B_AXIS] = LROUND(b * axis_steps_per_mm[B_AXIS]); + position[C_AXIS] = LROUND(axis_steps_per_mm[C_AXIS] * (c +( + #if !IS_KINEMATIC && ENABLED(AUTO_BED_LEVELING_UBL) + leveling_active ? ubl.get_z_correction(a, b) : + #endif + 0) + )); + position[E_AXIS] = LROUND(e * axis_steps_per_mm[_EINDEX]); + #if HAS_POSITION_FLOAT + position_float[A_AXIS] = a; + position_float[B_AXIS] = b; + position_float[C_AXIS] = c; + position_float[E_AXIS] = e; + #endif if (has_blocks_queued()) { //previous_nominal_speed_sqr = 0.0; // Reset planner junction speeds. Assume start from rest. - //previous_speed.reset(); + //ZERO(previous_speed); buffer_sync_block(); } else - stepper.set_position(position); + stepper.set_position(position[A_AXIS], position[B_AXIS], position[C_AXIS], position[E_AXIS]); } -void Planner::set_position_mm(const float &rx, const float &ry, const float &rz, const float &e) { - xyze_pos_t machine = { rx, ry, rz, e }; - #if HAS_POSITION_MODIFIERS - apply_modifiers(machine, true); +void Planner::set_position_mm_kinematic(const float (&cart)[XYZE]) { + #if PLANNER_LEVELING + float raw[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] }; + apply_leveling(raw); + #else + const float (&raw)[XYZE] = cart; #endif #if IS_KINEMATIC - position_cart.set(rx, ry, rz, e); - inverse_kinematics(machine); - set_machine_position_mm(delta.a, delta.b, delta.c, machine.e); + inverse_kinematics(raw); + _set_position_mm(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], cart[E_AXIS]); #else - set_machine_position_mm(machine); + _set_position_mm(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], cart[E_AXIS]); #endif } /** * Setters for planner position (also setting stepper position). */ -void Planner::set_e_position_mm(const float &e) { - const uint8_t axis_index = E_AXIS_N(active_extruder); - TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); - - const float e_new = e - TERN0(FWRETRACT, fwretract.current_retract[active_extruder]); - position.e = LROUND(settings.axis_steps_per_mm[axis_index] * e_new); - TERN_(HAS_POSITION_FLOAT, position_float.e = e_new); - TERN_(IS_KINEMATIC, position_cart.e = e); - +void Planner::set_position_mm(const AxisEnum axis, const float &v) { + #if ENABLED(DISTINCT_E_FACTORS) + const uint8_t axis_index = axis + (axis == E_AXIS ? active_extruder : 0); + last_extruder = active_extruder; + #else + const uint8_t axis_index = axis; + #endif + position[axis] = LROUND(axis_steps_per_mm[axis_index] * (v + ( + #if ENABLED(AUTO_BED_LEVELING_UBL) + axis == Z_AXIS && leveling_active ? ubl.get_z_correction(current_position[X_AXIS], current_position[Y_AXIS]) : + #endif + 0) + )); + #if HAS_POSITION_FLOAT + position_float[axis] = v; + #endif if (has_blocks_queued()) buffer_sync_block(); else - stepper.set_axis_position(E_AXIS, position.e); + stepper.set_position(axis, position[axis]); } // Recalculate the steps/s^2 acceleration rates, based on the mm/s^2 void Planner::reset_acceleration_rates() { #if ENABLED(DISTINCT_E_FACTORS) - #define AXIS_CONDITION (i < E_AXIS || i == E_AXIS_N(active_extruder)) + #define AXIS_CONDITION (i < E_AXIS || i == E_AXIS + active_extruder) #else #define AXIS_CONDITION true #endif uint32_t highest_rate = 1; LOOP_XYZE_N(i) { - max_acceleration_steps_per_s2[i] = settings.max_acceleration_mm_per_s2[i] * settings.axis_steps_per_mm[i]; + max_acceleration_steps_per_s2[i] = max_acceleration_mm_per_s2[i] * axis_steps_per_mm[i]; if (AXIS_CONDITION) NOLESS(highest_rate, max_acceleration_steps_per_s2[i]); } cutoff_long = 4294967295UL / highest_rate; // 0xFFFFFFFFUL - TERN_(HAS_LINEAR_E_JERK, recalculate_max_e_jerk()); + #if ENABLED(JUNCTION_DEVIATION) && ENABLED(LIN_ADVANCE) + recalculate_max_e_jerk(); + #endif } -// Recalculate position, steps_to_mm if settings.axis_steps_per_mm changes! +// Recalculate position, steps_to_mm if axis_steps_per_mm changes! void Planner::refresh_positioning() { - LOOP_XYZE_N(i) steps_to_mm[i] = 1.0f / settings.axis_steps_per_mm[i]; - set_position_mm(current_position); + LOOP_XYZE_N(i) steps_to_mm[i] = 1.0f / axis_steps_per_mm[i]; + set_position_mm_kinematic(current_position); reset_acceleration_rates(); } -inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_name, const xyze_float_t &max_limit) { - const uint8_t lim_axis = axis > E_AXIS ? E_AXIS : axis; - const float before = val; - LIMIT(val, 0.1, max_limit[lim_axis]); - if (before != val) { - SERIAL_CHAR(axis_codes[lim_axis]); - SERIAL_ECHOPGM(" Max "); - serialprintPGM(setting_name); - SERIAL_ECHOLNPAIR(" limited to ", val); - } -} - -void Planner::set_max_acceleration(const uint8_t axis, float targetValue) { - #if ENABLED(LIMITED_MAX_ACCEL_EDITING) - #ifdef MAX_ACCEL_EDIT_VALUES - constexpr xyze_float_t max_accel_edit = MAX_ACCEL_EDIT_VALUES; - const xyze_float_t &max_acc_edit_scaled = max_accel_edit; - #else - constexpr xyze_float_t max_accel_edit = DEFAULT_MAX_ACCELERATION; - const xyze_float_t max_acc_edit_scaled = max_accel_edit * 2; - #endif - limit_and_warn(targetValue, axis, PSTR("Acceleration"), max_acc_edit_scaled); - #endif - settings.max_acceleration_mm_per_s2[axis] = targetValue; - - // Update steps per s2 to agree with the units per s2 (since they are used in the planner) - reset_acceleration_rates(); -} - -void Planner::set_max_feedrate(const uint8_t axis, float targetValue) { - #if ENABLED(LIMITED_MAX_FR_EDITING) - #ifdef MAX_FEEDRATE_EDIT_VALUES - constexpr xyze_float_t max_fr_edit = MAX_FEEDRATE_EDIT_VALUES; - const xyze_float_t &max_fr_edit_scaled = max_fr_edit; - #else - constexpr xyze_float_t max_fr_edit = DEFAULT_MAX_FEEDRATE; - const xyze_float_t max_fr_edit_scaled = max_fr_edit * 2; - #endif - limit_and_warn(targetValue, axis, PSTR("Feedrate"), max_fr_edit_scaled); - #endif - settings.max_feedrate_mm_s[axis] = targetValue; -} - -void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { - #if HAS_CLASSIC_JERK - #if ENABLED(LIMITED_JERK_EDITING) - constexpr xyze_float_t max_jerk_edit = - #ifdef MAX_JERK_EDIT_VALUES - MAX_JERK_EDIT_VALUES - #else - { (DEFAULT_XJERK) * 2, (DEFAULT_YJERK) * 2, - (DEFAULT_ZJERK) * 2, (DEFAULT_EJERK) * 2 } - #endif - ; - limit_and_warn(targetValue, axis, PSTR("Jerk"), max_jerk_edit); - #endif - max_jerk[axis] = targetValue; - #else - UNUSED(axis); UNUSED(targetValue); - #endif -} - -#if HAS_WIRED_LCD - - uint16_t Planner::block_buffer_runtime() { - #ifdef __AVR__ - // Protect the access to the variable. Only required for AVR, as - // any 32bit CPU offers atomic access to 32bit variables - const bool was_enabled = stepper.suspend(); - #endif - - uint32_t bbru = block_buffer_runtime_us; - - #ifdef __AVR__ - // Reenable Stepper ISR - if (was_enabled) stepper.wake_up(); - #endif - - // To translate µs to ms a division by 1000 would be required. - // We introduce 2.4% error here by dividing by 1024. - // Doesn't matter because block_buffer_runtime_us is already too small an estimation. - bbru >>= 10; - // limit to about a minute. - NOMORE(bbru, 0x0000FFFFUL); - return bbru; - } - - void Planner::clear_block_buffer_runtime() { - #ifdef __AVR__ - // Protect the access to the variable. Only required for AVR, as - // any 32bit CPU offers atomic access to 32bit variables - const bool was_enabled = stepper.suspend(); - #endif - - block_buffer_runtime_us = 0; - - #ifdef __AVR__ - // Reenable Stepper ISR - if (was_enabled) stepper.wake_up(); - #endif - } - -#endif - #if ENABLED(AUTOTEMP) -void Planner::autotemp_update() { - #if ENABLED(AUTOTEMP_PROPORTIONAL) - const int16_t target = thermalManager.degTargetHotend(active_extruder); - autotemp_min = target + AUTOTEMP_MIN_P; - autotemp_max = target + AUTOTEMP_MAX_P; - #endif - autotemp_factor = TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); - autotemp_enabled = autotemp_factor != 0; -} - void Planner::autotemp_M104_M109() { - - #if ENABLED(AUTOTEMP_PROPORTIONAL) - const int16_t target = thermalManager.degTargetHotend(active_extruder); - autotemp_min = target + AUTOTEMP_MIN_P; - autotemp_max = target + AUTOTEMP_MAX_P; - #endif - - if (parser.seenval('S')) autotemp_min = parser.value_celsius(); - if (parser.seenval('B')) autotemp_max = parser.value_celsius(); - - // When AUTOTEMP_PROPORTIONAL is enabled, F0 disables autotemp. - // Normally, leaving off F also disables autotemp. - autotemp_factor = parser.seen('F') ? parser.value_float() : TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); - autotemp_enabled = autotemp_factor != 0; + if ((autotemp_enabled = parser.seen('F'))) autotemp_factor = parser.value_float(); + if (parser.seen('S')) autotemp_min = parser.value_celsius(); + if (parser.seen('B')) autotemp_max = parser.value_celsius(); } + #endif diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index c4e11490b1..c4baa5d790 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * planner.h @@ -30,18 +29,10 @@ * Copyright (c) 2009-2011 Simen Svale Skogsrud */ -#include "../MarlinCore.h" +#ifndef PLANNER_H +#define PLANNER_H -#if ENABLED(JD_HANDLE_SMALL_SEGMENTS) - // Enable this option for perfect accuracy but maximum - // computation. Should be fine on ARM processors. - //#define JD_USE_MATH_ACOS - - // Disable this option to save 120 bytes of PROGMEM, - // but incur increased computation and a reduction - // in accuracy. - #define JD_USE_LOOKUP_TABLE -#endif +#include "../Marlin.h" #include "motion.h" #include "../gcode/queue.h" @@ -51,36 +42,7 @@ #endif #if ABL_PLANAR - #include "../libs/vector_3.h" // for matrix_3x3 -#endif - -#if ENABLED(FWRETRACT) - #include "../feature/fwretract.h" -#endif - -#if ENABLED(MIXING_EXTRUDER) - #include "../feature/mixing.h" -#endif - -#if HAS_CUTTER - #include "../feature/spindle_laser_types.h" -#endif - -#if ENABLED(DIRECT_STEPPING) - #include "../feature/direct_stepping.h" - #define IS_PAGE(B) TEST(B->flag, BLOCK_BIT_IS_PAGE) -#else - #define IS_PAGE(B) false -#endif - -// Feedrate for manual moves -#ifdef MANUAL_FEEDRATE - constexpr xyze_feedrate_t _mf = MANUAL_FEEDRATE, - manual_feedrate_mm_s { _mf.x / 60.0f, _mf.y / 60.0f, _mf.z / 60.0f, _mf.e / 60.0f }; -#endif - -#if IS_KINEMATIC && HAS_JUNCTION_DEVIATION - #define HAS_DIST_MM_ARG 1 + #include "../libs/vector_3.h" #endif enum BlockFlagBit : char { @@ -97,47 +59,15 @@ enum BlockFlagBit : char { // Sync the stepper counts from the block BLOCK_BIT_SYNC_POSITION - - // Direct stepping page - #if ENABLED(DIRECT_STEPPING) - , BLOCK_BIT_IS_PAGE - #endif }; enum BlockFlag : char { - BLOCK_FLAG_RECALCULATE = _BV(BLOCK_BIT_RECALCULATE) - , BLOCK_FLAG_NOMINAL_LENGTH = _BV(BLOCK_BIT_NOMINAL_LENGTH) - , BLOCK_FLAG_CONTINUED = _BV(BLOCK_BIT_CONTINUED) - , BLOCK_FLAG_SYNC_POSITION = _BV(BLOCK_BIT_SYNC_POSITION) - #if ENABLED(DIRECT_STEPPING) - , BLOCK_FLAG_IS_PAGE = _BV(BLOCK_BIT_IS_PAGE) - #endif + BLOCK_FLAG_RECALCULATE = _BV(BLOCK_BIT_RECALCULATE), + BLOCK_FLAG_NOMINAL_LENGTH = _BV(BLOCK_BIT_NOMINAL_LENGTH), + BLOCK_FLAG_CONTINUED = _BV(BLOCK_BIT_CONTINUED), + BLOCK_FLAG_SYNC_POSITION = _BV(BLOCK_BIT_SYNC_POSITION) }; -#if ENABLED(LASER_POWER_INLINE) - - typedef struct { - bool isPlanned:1; - bool isEnabled:1; - bool dir:1; - bool Reserved:6; - } power_status_t; - - typedef struct { - power_status_t status; // See planner settings for meaning - uint8_t power; // Ditto; When in trapezoid mode this is nominal power - #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) - uint8_t power_entry; // Entry power for the laser - #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) - uint8_t power_exit; // Exit power for the laser - uint32_t entry_per, // Steps per power increment (to avoid floats in stepper calcs) - exit_per; // Steps per power decrement - #endif - #endif - } block_laser_t; - -#endif - /** * struct block_t * @@ -147,7 +77,7 @@ enum BlockFlag : char { * The "nominal" values are as-specified by gcode, and * may never actually be reached due to acceleration limits. */ -typedef struct block_t { +typedef struct { volatile uint8_t flag; // Block flags (See BlockFlag enum above) - Modified by ISR and main thread! @@ -159,18 +89,23 @@ typedef struct block_t { acceleration; // acceleration mm/sec^2 union { - abce_ulong_t steps; // Step count along each axis - abce_long_t position; // New position to force when this sync block is executed + // Data used by all move blocks + struct { + // Fields used by the Bresenham algorithm for tracing the line + uint32_t steps[NUM_AXIS]; // Step count along each axis + }; + // Data used by all sync blocks + struct { + int32_t position[NUM_AXIS]; // New position to force when this sync block is executed + }; }; uint32_t step_event_count; // The number of step events required to complete this block - #if HAS_MULTI_EXTRUDER - uint8_t extruder; // The extruder to move (if E move) - #else - static constexpr uint8_t extruder = 0; - #endif + uint8_t active_extruder; // The extruder to move (if E move) - TERN_(MIXING_EXTRUDER, MIXER_BLOCK_FIELD); // Normalized color for the mixing steppers + #if ENABLED(MIXING_EXTRUDER) + uint32_t mix_steps[MIXING_STEPPERS]; // Scaled steps[E_AXIS] for the mixing steppers + #endif // Settings for the trapezoid generator uint32_t accelerate_until, // The index of the step event on which to stop acceleration @@ -202,91 +137,22 @@ typedef struct block_t { final_rate, // The minimal rate at exit acceleration_steps_per_s2; // acceleration steps/sec^2 - #if ENABLED(DIRECT_STEPPING) - page_idx_t page_idx; // Page index used for direct stepping - #endif - - #if HAS_CUTTER - cutter_power_t cutter_power; // Power level for Spindle, Laser, etc. - #endif - - #if HAS_FAN - uint8_t fan_speed[FAN_COUNT]; + #if FAN_COUNT > 0 + uint16_t fan_speed[FAN_COUNT]; #endif #if ENABLED(BARICUDA) uint8_t valve_pressure, e_to_p_pressure; #endif - #if HAS_WIRED_LCD - uint32_t segment_time_us; - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - uint32_t sdpos; - #endif - - #if ENABLED(LASER_POWER_INLINE) - block_laser_t laser; - #endif + uint32_t segment_time_us; } block_t; -#if ANY(LIN_ADVANCE, SCARA_FEEDRATE_SCALING, GRADIENT_MIX, LCD_SHOW_E_TOTAL) - #define HAS_POSITION_FLOAT 1 -#endif +#define HAS_POSITION_FLOAT (ENABLED(LIN_ADVANCE) || HAS_FEEDRATE_SCALING) #define BLOCK_MOD(n) ((n)&(BLOCK_BUFFER_SIZE-1)) -#if ENABLED(LASER_POWER_INLINE) - typedef struct { - /** - * Laser status flags - */ - power_status_t status; - /** - * Laser power: 0 or 255 in case of PWM-less laser, - * or the OCR (oscillator count register) value; - * - * Using OCR instead of raw power, because it avoids - * floating point operations during the move loop. - */ - uint8_t power; - } laser_state_t; -#endif - -typedef struct { - uint32_t max_acceleration_mm_per_s2[XYZE_N], // (mm/s^2) M201 XYZE - min_segment_time_us; // (µs) M205 B - float axis_steps_per_mm[XYZE_N]; // (steps) M92 XYZE - Steps per millimeter - feedRate_t max_feedrate_mm_s[XYZE_N]; // (mm/s) M203 XYZE - Max speeds - float acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves. - retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes - travel_acceleration; // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves. - feedRate_t min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate - min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate -} planner_settings_t; - -#if DISABLED(SKEW_CORRECTION) - #define XY_SKEW_FACTOR 0 - #define XZ_SKEW_FACTOR 0 - #define YZ_SKEW_FACTOR 0 -#endif - -typedef struct { - #if ENABLED(SKEW_CORRECTION_GCODE) - float xy; - #if ENABLED(SKEW_CORRECTION_FOR_Z) - float xz, yz; - #else - const float xz = XZ_SKEW_FACTOR, yz = YZ_SKEW_FACTOR; - #endif - #else - const float xy = XY_SKEW_FACTOR, - xz = XZ_SKEW_FACTOR, yz = YZ_SKEW_FACTOR; - #endif -} skew_factor_t; - class Planner { public: @@ -316,15 +182,9 @@ class Planner { static uint8_t last_extruder; // Respond to extruder change #endif - #if ENABLED(DIRECT_STEPPING) - static uint32_t last_page_step_rate; // Last page step rate given - static xyze_bool_t last_page_dir; // Last page direction given - #endif + static int16_t flow_percentage[EXTRUDERS]; // Extrusion factor for each extruder - #if EXTRUDERS - static int16_t flow_percentage[EXTRUDERS]; // Extrusion factor for each extruder - static float e_factor[EXTRUDERS]; // The flow percentage and volumetric multiplier combine to scale E movement - #endif + static float e_factor[EXTRUDERS]; // The flow percentage and volumetric multiplier combine to scale E movement #if DISABLED(NO_VOLUMETRICS) static float filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder @@ -333,30 +193,29 @@ class Planner { // May be auto-adjusted by a filament width sensor #endif - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - static float volumetric_extruder_limit[EXTRUDERS], // Maximum mm^3/sec the extruder can handle - volumetric_extruder_feedrate_limit[EXTRUDERS]; // Feedrate limit (mm/s) calculated from volume limit - #endif + static uint32_t max_acceleration_mm_per_s2[XYZE_N], // (mm/s^2) M201 XYZE + max_acceleration_steps_per_s2[XYZE_N], // (steps/s^2) Derived from mm_per_s2 + min_segment_time_us; // (µs) M205 B + static float max_feedrate_mm_s[XYZE_N], // (mm/s) M203 XYZE - Max speeds + axis_steps_per_mm[XYZE_N], // (steps) M92 XYZE - Steps per millimeter + steps_to_mm[XYZE_N], // (mm) Millimeters per step + min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate + acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves. + retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes + travel_acceleration, // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves. + min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate - static planner_settings_t settings; - - #if ENABLED(LASER_POWER_INLINE) - static laser_state_t laser_inline; - #endif - - static uint32_t max_acceleration_steps_per_s2[XYZE_N]; // (steps/s^2) Derived from mm_per_s2 - static float steps_to_mm[XYZE_N]; // Millimeters per step - - #if HAS_JUNCTION_DEVIATION + #if ENABLED(JUNCTION_DEVIATION) static float junction_deviation_mm; // (mm) M205 J - #if HAS_LINEAR_E_JERK - static float max_e_jerk[DISTINCT_E]; // Calculated from junction_deviation_mm + #if ENABLED(LIN_ADVANCE) + #if ENABLED(DISTINCT_E_FACTORS) + static float max_e_jerk[EXTRUDERS]; // Calculated from junction_deviation_mm + #else + static float max_e_jerk; + #endif #endif - #endif - - #if HAS_CLASSIC_JERK - // (mm/s^2) M205 XYZ(E) - The largest speed change requiring no acceleration. - static TERN(HAS_LINEAR_E_JERK, xyz_pos_t, xyze_pos_t) max_jerk; + #else + static float max_jerk[XYZE]; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration. #endif #if HAS_LEVELING @@ -372,52 +231,46 @@ class Planner { #endif #if ENABLED(LIN_ADVANCE) - static float extruder_advance_K[EXTRUDERS]; + static float extruder_advance_K; #endif - /** - * The current position of the tool in absolute steps - * Recalculated if any axis_steps_per_mm are changed by gcode - */ - static xyze_long_t position; - #if HAS_POSITION_FLOAT - static xyze_pos_t position_float; + static float position_float[XYZE]; #endif - #if IS_KINEMATIC - static xyze_pos_t position_cart; + #if ENABLED(SKEW_CORRECTION) + #if ENABLED(SKEW_CORRECTION_GCODE) + static float xy_skew_factor; + #else + static constexpr float xy_skew_factor = XY_SKEW_FACTOR; + #endif + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #if ENABLED(SKEW_CORRECTION_GCODE) + static float xz_skew_factor, yz_skew_factor; + #else + static constexpr float xz_skew_factor = XZ_SKEW_FACTOR, yz_skew_factor = YZ_SKEW_FACTOR; + #endif + #else + static constexpr float xz_skew_factor = 0, yz_skew_factor = 0; + #endif #endif - static skew_factor_t skew_factor; - - #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) + #if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) static bool abort_on_endstop_hit; #endif - #ifdef XY_FREQUENCY_LIMIT - static int8_t xy_freq_limit_hz; // Minimum XY frequency setting - static float xy_freq_min_speed_factor; // Minimum speed factor setting - static int32_t xy_freq_min_interval_us; // Minimum segment time based on xy_freq_limit_hz - static inline void refresh_frequency_limit() { - //xy_freq_min_interval_us = xy_freq_limit_hz ?: LROUND(1000000.0f / xy_freq_limit_hz); - if (xy_freq_limit_hz) - xy_freq_min_interval_us = LROUND(1000000.0f / xy_freq_limit_hz); - } - static inline void set_min_speed_factor_u8(const uint8_t v255) { - xy_freq_min_speed_factor = float(ui8_to_percent(v255)) / 100; - } - static inline void set_frequency_limit(const uint8_t hz) { - xy_freq_limit_hz = constrain(hz, 0, 100); - refresh_frequency_limit(); - } - #endif private: + /** + * The current position of the tool in absolute steps + * Recalculated if any axis_steps_per_mm are changed by gcode + */ + static int32_t position[NUM_AXIS]; + /** * Speed of previous path line segment */ - static xyze_float_t previous_speed; + static float previous_speed[NUM_AXIS]; /** * Nominal speed of previous path line segment (mm/s)^2 @@ -434,12 +287,23 @@ class Planner { #endif #if ENABLED(DISABLE_INACTIVE_EXTRUDER) - // Counters to manage disabling inactive extruders + /** + * Counters to manage disabling inactive extruders + */ static uint8_t g_uc_extruder_last_move[EXTRUDERS]; + #endif // DISABLE_INACTIVE_EXTRUDER + + #ifdef XY_FREQUENCY_LIMIT + // Used for the frequency limit + #define MAX_FREQ_TIME_US (uint32_t)(1000000.0 / XY_FREQUENCY_LIMIT) + // Old direction bits. Used for speed calculations + static unsigned char old_direction_bits; + // Segment times (in µs). Used for speed calculations + static uint32_t axis_segment_time_us[2][3]; #endif - #if HAS_WIRED_LCD - volatile static uint32_t block_buffer_runtime_us; // Theoretical block buffer runtime in µs + #if ENABLED(ULTRA_LCD) + volatile static uint32_t block_buffer_runtime_us; //Theoretical block buffer runtime in µs #endif public: @@ -458,65 +322,36 @@ class Planner { static void reset_acceleration_rates(); static void refresh_positioning(); - static void set_max_acceleration(const uint8_t axis, float targetValue); - static void set_max_feedrate(const uint8_t axis, float targetValue); - static void set_max_jerk(const AxisEnum axis, float targetValue); - - #if EXTRUDERS - FORCE_INLINE static void refresh_e_factor(const uint8_t e) { - e_factor[e] = flow_percentage[e] * 0.01f * TERN(NO_VOLUMETRICS, 1.0f, volumetric_multiplier[e]); - } - - static inline void set_flow(const uint8_t e, const int16_t flow) { - flow_percentage[e] = flow; - refresh_e_factor(e); - } - - #endif + FORCE_INLINE static void refresh_e_factor(const uint8_t e) { + e_factor[e] = (flow_percentage[e] * 0.01f + #if DISABLED(NO_VOLUMETRICS) + * volumetric_multiplier[e] + #endif + ); + } // Manage fans, paste pressure, etc. static void check_axes_activity(); - #if ENABLED(FILAMENT_WIDTH_SENSOR) - void apply_filament_width_sensor(const int8_t encoded_ratio); + // Update multipliers based on new diameter measurements + static void calculate_volumetric_multipliers(); - static inline float volumetric_percent(const bool vol) { - return 100.0f * (vol - ? volumetric_area_nominal / volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] - : volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] - ); - } + #if ENABLED(FILAMENT_WIDTH_SENSOR) + void calculate_volumetric_for_width_sensor(const int8_t encoded_ratio); #endif #if DISABLED(NO_VOLUMETRICS) - // Update multipliers based on new diameter measurements - static void calculate_volumetric_multipliers(); - - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - // Update pre calculated extruder feedrate limits based on volumetric values - static void calculate_volumetric_extruder_limit(const uint8_t e); - static void calculate_volumetric_extruder_limits(); - #endif - FORCE_INLINE static void set_filament_size(const uint8_t e, const float &v) { filament_size[e] = v; - if (v > 0) volumetric_area_nominal = CIRCLE_AREA(v * 0.5); //TODO: should it be per extruder // make sure all extruders have some sane value for the filament size - LOOP_L_N(i, COUNT(filament_size)) + for (uint8_t i = 0; i < COUNT(filament_size); i++) if (!filament_size[i]) filament_size[i] = DEFAULT_NOMINAL_FILAMENT_DIA; } #endif - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - FORCE_INLINE static void set_volumetric_extruder_limit(const uint8_t e, const float &v) { - volumetric_extruder_limit[e] = v; - calculate_volumetric_extruder_limit(e); - } - #endif - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) /** @@ -528,13 +363,15 @@ class Planner { */ static inline float fade_scaling_factor_for_z(const float &rz) { static float z_fade_factor = 1; - if (!z_fade_height) return 1; - if (rz >= z_fade_height) return 0; - if (last_fade_z != rz) { - last_fade_z = rz; - z_fade_factor = 1 - rz * inverse_z_fade_height; + if (z_fade_height) { + if (rz >= z_fade_height) return 0; + if (last_fade_z != rz) { + last_fade_z = rz; + z_fade_factor = 1 - rz * inverse_z_fade_height; + } + return z_fade_factor; } - return z_fade_factor; + return 1; } FORCE_INLINE static void force_fade_recalc() { last_fade_z = -999.999f; } @@ -551,9 +388,12 @@ class Planner { #else - FORCE_INLINE static float fade_scaling_factor_for_z(const float&) { return 1; } + FORCE_INLINE static float fade_scaling_factor_for_z(const float &rz) { + UNUSED(rz); + return 1; + } - FORCE_INLINE static bool leveling_active_at_z(const float&) { return true; } + FORCE_INLINE static bool leveling_active_at_z(const float &rz) { UNUSED(rz); return true; } #endif @@ -561,66 +401,46 @@ class Planner { FORCE_INLINE static void skew(float &cx, float &cy, const float &cz) { if (WITHIN(cx, X_MIN_POS + 1, X_MAX_POS) && WITHIN(cy, Y_MIN_POS + 1, Y_MAX_POS)) { - const float sx = cx - cy * skew_factor.xy - cz * (skew_factor.xz - (skew_factor.xy * skew_factor.yz)), - sy = cy - cz * skew_factor.yz; + const float sx = cx - cy * xy_skew_factor - cz * (xz_skew_factor - (xy_skew_factor * yz_skew_factor)), + sy = cy - cz * yz_skew_factor; if (WITHIN(sx, X_MIN_POS, X_MAX_POS) && WITHIN(sy, Y_MIN_POS, Y_MAX_POS)) { cx = sx; cy = sy; } } } - FORCE_INLINE static void skew(xyz_pos_t &raw) { skew(raw.x, raw.y, raw.z); } FORCE_INLINE static void unskew(float &cx, float &cy, const float &cz) { if (WITHIN(cx, X_MIN_POS, X_MAX_POS) && WITHIN(cy, Y_MIN_POS, Y_MAX_POS)) { - const float sx = cx + cy * skew_factor.xy + cz * skew_factor.xz, - sy = cy + cz * skew_factor.yz; + const float sx = cx + cy * xy_skew_factor + cz * xz_skew_factor, + sy = cy + cz * yz_skew_factor; if (WITHIN(sx, X_MIN_POS, X_MAX_POS) && WITHIN(sy, Y_MIN_POS, Y_MAX_POS)) { cx = sx; cy = sy; } } } - FORCE_INLINE static void unskew(xyz_pos_t &raw) { unskew(raw.x, raw.y, raw.z); } #endif // SKEW_CORRECTION - #if HAS_LEVELING + #if PLANNER_LEVELING || HAS_UBL_AND_CURVES /** * Apply leveling to transform a cartesian position * as it will be given to the planner and steppers. */ - static void apply_leveling(xyz_pos_t &raw); - static void unapply_leveling(xyz_pos_t &raw); - FORCE_INLINE static void force_unapply_leveling(xyz_pos_t &raw) { - leveling_active = true; - unapply_leveling(raw); - leveling_active = false; - } + static void apply_leveling(float &rx, float &ry, float &rz); + FORCE_INLINE static void apply_leveling(float (&raw)[XYZ]) { apply_leveling(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); } + #endif + + #if PLANNER_LEVELING || HAS_UBL_AND_CURVES + #define ARG_X float rx + #define ARG_Y float ry + #define ARG_Z float rz + static void unapply_leveling(float raw[XYZ]); #else - FORCE_INLINE static void apply_leveling(xyz_pos_t&) {} - FORCE_INLINE static void unapply_leveling(xyz_pos_t&) {} + #define ARG_X const float &rx + #define ARG_Y const float &ry + #define ARG_Z const float &rz #endif - #if ENABLED(FWRETRACT) - static void apply_retract(float &rz, float &e); - FORCE_INLINE static void apply_retract(xyze_pos_t &raw) { apply_retract(raw.z, raw.e); } - static void unapply_retract(float &rz, float &e); - FORCE_INLINE static void unapply_retract(xyze_pos_t &raw) { unapply_retract(raw.z, raw.e); } - #endif - - #if HAS_POSITION_MODIFIERS - FORCE_INLINE static void apply_modifiers(xyze_pos_t &pos, bool leveling=ENABLED(PLANNER_LEVELING)) { - TERN_(SKEW_CORRECTION, skew(pos)); - if (leveling) apply_leveling(pos); - TERN_(FWRETRACT, apply_retract(pos)); - } - - FORCE_INLINE static void unapply_modifiers(xyze_pos_t &pos, bool leveling=ENABLED(PLANNER_LEVELING)) { - TERN_(FWRETRACT, unapply_retract(pos)); - if (leveling) unapply_leveling(pos); - TERN_(SKEW_CORRECTION, unskew(pos)); - } - #endif // HAS_POSITION_MODIFIERS - // Number of moves currently in the planner including the busy block, if any FORCE_INLINE static uint8_t movesplanned() { return BLOCK_MOD(block_buffer_head - block_buffer_tail); } @@ -665,14 +485,11 @@ class Planner { * * Returns true if movement was buffered, false otherwise */ - static bool _buffer_steps(const xyze_long_t &target + static bool _buffer_steps(const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT - , const xyze_pos_t &target_float + , const float (&target_float)[XYZE] #endif - #if HAS_DIST_MM_ARG - , const xyze_float_t &cart_dist_mm - #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , float fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 ); /** @@ -688,14 +505,11 @@ class Planner { * Returns true is movement is acceptable, false otherwise */ static bool _populate_block(block_t * const block, bool split_move, - const xyze_long_t &target + const int32_t (&target)[XYZE] #if HAS_POSITION_FLOAT - , const xyze_pos_t &target_float + , const float (&target_float)[XYZE] #endif - #if HAS_DIST_MM_ARG - , const xyze_float_t &cart_dist_mm - #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , float fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 ); /** @@ -704,13 +518,6 @@ class Planner { */ static void buffer_sync_block(); - #if IS_KINEMATIC - private: - - // Allow do_homing_move to access internal functions, such as buffer_segment. - friend void do_homing_move(const AxisEnum, const float, const feedRate_t); - #endif - /** * Planner::buffer_segment * @@ -723,86 +530,74 @@ class Planner { * extruder - target extruder * millimeters - the length of the movement, if known */ - static bool buffer_segment(const float &a, const float &b, const float &c, const float &e - #if HAS_DIST_MM_ARG - , const xyze_float_t &cart_dist_mm - #endif - , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 - ); + static bool buffer_segment(const float &a, const float &b, const float &c, const float &e, const float &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0); - FORCE_INLINE static bool buffer_segment(abce_pos_t &abce - #if HAS_DIST_MM_ARG - , const xyze_float_t &cart_dist_mm - #endif - , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 - ) { - return buffer_segment(abce.a, abce.b, abce.c, abce.e - #if HAS_DIST_MM_ARG - , cart_dist_mm - #endif - , fr_mm_s, extruder, millimeters); - } - - public: + static void _set_position_mm(const float &a, const float &b, const float &c, const float &e); /** * Add a new linear movement to the buffer. - * The target is cartesian. It's translated to - * delta/scara if needed. + * The target is NOT translated to delta/scara + * + * Leveling will be applied to input on cartesians. + * Kinematic machines should call buffer_line_kinematic (for leveled moves). + * (Cartesians may also call buffer_line_kinematic.) * * rx,ry,rz,e - target position in mm or degrees * fr_mm_s - (target) speed of the move (mm/s) * extruder - target extruder * millimeters - the length of the movement, if known - * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) */ - static bool buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 - #if ENABLED(SCARA_FEEDRATE_SCALING) - , const float &inv_duration=0.0 + FORCE_INLINE static bool buffer_line(ARG_X, ARG_Y, ARG_Z, const float &e, const float &fr_mm_s, const uint8_t extruder, const float millimeters = 0.0) { + #if PLANNER_LEVELING && IS_CARTESIAN + apply_leveling(rx, ry, rz); #endif - ); - - FORCE_INLINE static bool buffer_line(const xyze_pos_t &cart, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 - #if ENABLED(SCARA_FEEDRATE_SCALING) - , const float &inv_duration=0.0 - #endif - ) { - return buffer_line(cart.x, cart.y, cart.z, cart.e, fr_mm_s, extruder, millimeters - #if ENABLED(SCARA_FEEDRATE_SCALING) - , inv_duration - #endif - ); + return buffer_segment(rx, ry, rz, e, fr_mm_s, extruder, millimeters); } - #if ENABLED(DIRECT_STEPPING) - static void buffer_page(const page_idx_t page_idx, const uint8_t extruder, const uint16_t num_steps); - #endif + /** + * Add a new linear movement to the buffer. + * The target is cartesian, it's translated to delta/scara if + * needed. + * + * cart - x,y,z,e CARTESIAN target in mm + * fr_mm_s - (target) speed of the move (mm/s) + * extruder - target extruder + * millimeters - the length of the movement, if known + */ + FORCE_INLINE static bool buffer_line_kinematic(const float (&cart)[XYZE], const float &fr_mm_s, const uint8_t extruder, const float millimeters = 0.0) { + #if PLANNER_LEVELING + float raw[XYZ] = { cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS] }; + apply_leveling(raw); + #else + const float (&raw)[XYZE] = cart; + #endif + #if IS_KINEMATIC + inverse_kinematics(raw); + return buffer_segment(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters); + #else + return buffer_segment(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters); + #endif + } /** * Set the planner.position and individual stepper positions. * Used by G92, G28, G29, and other procedures. * - * The supplied position is in the cartesian coordinate space and is - * translated in to machine space as needed. Modifiers such as leveling - * and skew are also applied. - * * Multiplies by axis_steps_per_mm[] and does necessary conversion * for COREXY / COREXZ / COREYZ to set the corresponding stepper positions. * * Clears previous speed values. */ - static void set_position_mm(const float &rx, const float &ry, const float &rz, const float &e); - FORCE_INLINE static void set_position_mm(const xyze_pos_t &cart) { set_position_mm(cart.x, cart.y, cart.z, cart.e); } - static void set_e_position_mm(const float &e); - - /** - * Set the planner.position and individual stepper positions. - * - * The supplied position is in machine space, and no additional - * conversions are applied. - */ - static void set_machine_position_mm(const float &a, const float &b, const float &c, const float &e); - FORCE_INLINE static void set_machine_position_mm(const abce_pos_t &abce) { set_machine_position_mm(abce.a, abce.b, abce.c, abce.e); } + FORCE_INLINE static void set_position_mm(ARG_X, ARG_Y, ARG_Z, const float &e) { + #if PLANNER_LEVELING && IS_CARTESIAN + apply_leveling(rx, ry, rz); + #endif + _set_position_mm(rx, ry, rz, e); + } + static void set_position_mm_kinematic(const float (&cart)[XYZE]); + static void set_position_mm(const AxisEnum axis, const float &v); + FORCE_INLINE static void set_z_position_mm(const float &z) { set_position_mm(Z_AXIS, z); } + FORCE_INLINE static void set_e_position_mm(const float &e) { set_position_mm(E_AXIS, e); } /** * Get an axis position according to stepper position(s) @@ -810,23 +605,13 @@ class Planner { */ static float get_axis_position_mm(const AxisEnum axis); - static inline abce_pos_t get_axis_positions_mm() { - const abce_pos_t out = { - get_axis_position_mm(A_AXIS), - get_axis_position_mm(B_AXIS), - get_axis_position_mm(C_AXIS), - get_axis_position_mm(E_AXIS) - }; - return out; - } - // SCARA AB axes are in degrees, not mm #if IS_SCARA FORCE_INLINE static float get_axis_position_degrees(const AxisEnum axis) { return get_axis_position_mm(axis); } #endif - // Called to force a quick stop of the machine (for example, when - // a Full Shutdown is required, or when endstops are hit) + // Called to force a quick stop of the machine (for example, when an emergency + // stop is required, or when endstops are hit) static void quick_stop(); // Called when an endstop is triggered. Causes the machine to stop inmediately @@ -844,7 +629,12 @@ class Planner { // Periodic tick to handle cleaning timeouts // Called from the Temperature ISR at ~1kHz static void tick() { - if (cleaning_buffer_counter) --cleaning_buffer_counter; + if (cleaning_buffer_counter) { + --cleaning_buffer_counter; + #if ENABLED(SD_FINISHED_STEPPERRELEASE) && defined(SD_FINISHED_RELEASECOMMAND) + if (!cleaning_buffer_counter) enqueue_and_echo_commands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + #endif + } } /** @@ -853,27 +643,108 @@ class Planner { FORCE_INLINE static bool has_blocks_queued() { return (block_buffer_head != block_buffer_tail); } /** - * Get the current block for processing - * and mark the block as busy. - * Return nullptr if the buffer is empty - * or if there is a first-block delay. - * + * The current block. NULL if the buffer is empty. + * This also marks the block as busy. * WARNING: Called from Stepper ISR context! */ - static block_t* get_current_block(); + static block_t* get_current_block() { + + // Get the number of moves in the planner queue so far + const uint8_t nr_moves = movesplanned(); + + // If there are any moves queued ... + if (nr_moves) { + + // If there is still delay of delivery of blocks running, decrement it + if (delay_before_delivering) { + --delay_before_delivering; + // If the number of movements queued is less than 3, and there is still time + // to wait, do not deliver anything + if (nr_moves < 3 && delay_before_delivering) return NULL; + delay_before_delivering = 0; + } + + // If we are here, there is no excuse to deliver the block + block_t * const block = &block_buffer[block_buffer_tail]; + + // No trapezoid calculated? Don't execute yet. + if (TEST(block->flag, BLOCK_BIT_RECALCULATE)) return NULL; + + #if ENABLED(ULTRA_LCD) + block_buffer_runtime_us -= block->segment_time_us; // We can't be sure how long an active block will take, so don't count it. + #endif + + // As this block is busy, advance the nonbusy block pointer + block_buffer_nonbusy = next_block_index(block_buffer_tail); + + // Push block_buffer_planned pointer, if encountered. + if (block_buffer_tail == block_buffer_planned) + block_buffer_planned = block_buffer_nonbusy; + + // Return the block + return block; + } + + // The queue became empty + #if ENABLED(ULTRA_LCD) + clear_block_buffer_runtime(); // paranoia. Buffer is empty now - so reset accumulated time to zero. + #endif + + return NULL; + } /** - * "Release" the current block so its slot can be reused. + * "Discard" the block and "release" the memory. * Called when the current block is no longer needed. + * NB: There MUST be a current block to call this function!! */ - FORCE_INLINE static void release_current_block() { + FORCE_INLINE static void discard_current_block() { if (has_blocks_queued()) block_buffer_tail = next_block_index(block_buffer_tail); } - #if HAS_WIRED_LCD - static uint16_t block_buffer_runtime(); - static void clear_block_buffer_runtime(); + #if ENABLED(ULTRA_LCD) + + static uint16_t block_buffer_runtime() { + #ifdef __AVR__ + // Protect the access to the variable. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + millis_t bbru = block_buffer_runtime_us; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + // To translate µs to ms a division by 1000 would be required. + // We introduce 2.4% error here by dividing by 1024. + // Doesn't matter because block_buffer_runtime_us is already too small an estimation. + bbru >>= 10; + // limit to about a minute. + NOMORE(bbru, 0xFFFFul); + return bbru; + } + + static void clear_block_buffer_runtime() { + #ifdef __AVR__ + // Protect the access to the variable. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + block_buffer_runtime_us = 0; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + } + #endif #if ENABLED(AUTOTEMP) @@ -881,14 +752,19 @@ class Planner { static bool autotemp_enabled; static void getHighESpeed(); static void autotemp_M104_M109(); - static void autotemp_update(); #endif - #if HAS_LINEAR_E_JERK + #if ENABLED(JUNCTION_DEVIATION) FORCE_INLINE static void recalculate_max_e_jerk() { - const float prop = junction_deviation_mm * SQRT(0.5) / (1.0f - SQRT(0.5)); - LOOP_L_N(i, EXTRUDERS) - max_e_jerk[E_INDEX_N(i)] = SQRT(prop * settings.max_acceleration_mm_per_s2[E_INDEX_N(i)]); + #define GET_MAX_E_JERK(N) SQRT(SQRT(0.5) * junction_deviation_mm * (N) * RECIPROCAL(1.0 - SQRT(0.5))) + #if ENABLED(LIN_ADVANCE) + #if ENABLED(DISTINCT_E_FACTORS) + for (uint8_t i = 0; i < EXTRUDERS; i++) + max_e_jerk[i] = GET_MAX_E_JERK(max_acceleration_mm_per_s2[E_AXIS + i]); + #else + max_e_jerk = GET_MAX_E_JERK(max_acceleration_mm_per_s2[E_AXIS]); + #endif + #endif } #endif @@ -952,28 +828,27 @@ class Planner { static void recalculate(); - #if HAS_JUNCTION_DEVIATION + #if ENABLED(JUNCTION_DEVIATION) - FORCE_INLINE static void normalize_junction_vector(xyze_float_t &vector) { + FORCE_INLINE static void normalize_junction_vector(float (&vector)[XYZE]) { float magnitude_sq = 0; LOOP_XYZE(idx) if (vector[idx]) magnitude_sq += sq(vector[idx]); - vector *= RSQRT(magnitude_sq); + const float inv_magnitude = RSQRT(magnitude_sq); + LOOP_XYZE(idx) vector[idx] *= inv_magnitude; } - FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, xyze_float_t &unit_vec) { + FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, float (&unit_vec)[XYZE]) { float limit_value = max_value; - LOOP_XYZE(idx) { - if (unit_vec[idx]) { - if (limit_value * ABS(unit_vec[idx]) > settings.max_acceleration_mm_per_s2[idx]) - limit_value = ABS(settings.max_acceleration_mm_per_s2[idx] / unit_vec[idx]); - } - } + LOOP_XYZE(idx) if (unit_vec[idx]) // Avoid divide by zero + NOMORE(limit_value, ABS(max_acceleration_mm_per_s2[idx] / unit_vec[idx])); return limit_value; } - #endif // !CLASSIC_JERK + #endif // JUNCTION_DEVIATION }; -#define PLANNER_XY_FEEDRATE() (_MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS])) +#define PLANNER_XY_FEEDRATE() (MIN(planner.max_feedrate_mm_s[X_AXIS], planner.max_feedrate_mm_s[Y_AXIS])) extern Planner planner; + +#endif // PLANNER_H diff --git a/Marlin/src/module/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp index 02d878d5f5..6ff6808a79 100644 --- a/Marlin/src/module/planner_bezier.cpp +++ b/Marlin/src/module/planner_bezier.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,6 +24,7 @@ * planner_bezier.cpp * * Compute and buffer movement commands for bezier curves + * */ #include "../inc/MarlinConfig.h" @@ -34,7 +35,8 @@ #include "motion.h" #include "temperature.h" -#include "../MarlinCore.h" +#include "../Marlin.h" +#include "../core/language.h" #include "../gcode/queue.h" // See the meaning in the documentation of cubic_b_spline(). @@ -105,23 +107,22 @@ static inline float dist1(const float &x1, const float &y1, const float &x2, con * the mitigation offered by MIN_STEP and the small computational * power available on Arduino, I think it is not wise to implement it. */ -void cubic_b_spline( - const xyze_pos_t &position, // current position - const xyze_pos_t &target, // target position - const xy_pos_t (&offsets)[2], // a pair of offsets - const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % - const uint8_t extruder -) { +void cubic_b_spline(const float position[NUM_AXIS], const float target[NUM_AXIS], const float offset[4], float fr_mm_s, uint8_t extruder) { // Absolute first and second control points are recovered. - const xy_pos_t first = position + offsets[0], second = target + offsets[1]; + const float first0 = position[X_AXIS] + offset[0], + first1 = position[Y_AXIS] + offset[1], + second0 = target[X_AXIS] + offset[2], + second1 = target[Y_AXIS] + offset[3]; + float t = 0; - xyze_pos_t bez_target; - bez_target.set(position.x, position.y); + float bez_target[4]; + bez_target[X_AXIS] = position[X_AXIS]; + bez_target[Y_AXIS] = position[Y_AXIS]; float step = MAX_STEP; millis_t next_idle_ms = millis() + 200UL; - for (float t = 0; t < 1;) { + while (t < 1) { thermalManager.manage_heater(); millis_t now = millis(); @@ -135,15 +136,15 @@ void cubic_b_spline( bool did_reduce = false; float new_t = t + step; NOMORE(new_t, 1); - float new_pos0 = eval_bezier(position.x, first.x, second.x, target.x, new_t), - new_pos1 = eval_bezier(position.y, first.y, second.y, target.y, new_t); + float new_pos0 = eval_bezier(position[X_AXIS], first0, second0, target[X_AXIS], new_t), + new_pos1 = eval_bezier(position[Y_AXIS], first1, second1, target[Y_AXIS], new_t); for (;;) { if (new_t - t < (MIN_STEP)) break; const float candidate_t = 0.5f * (t + new_t), - candidate_pos0 = eval_bezier(position.x, first.x, second.x, target.x, candidate_t), - candidate_pos1 = eval_bezier(position.y, first.y, second.y, target.y, candidate_t), - interp_pos0 = 0.5f * (bez_target.x + new_pos0), - interp_pos1 = 0.5f * (bez_target.y + new_pos1); + candidate_pos0 = eval_bezier(position[X_AXIS], first0, second0, target[X_AXIS], candidate_t), + candidate_pos1 = eval_bezier(position[Y_AXIS], first1, second1, target[Y_AXIS], candidate_t), + interp_pos0 = 0.5f * (bez_target[X_AXIS] + new_pos0), + interp_pos1 = 0.5f * (bez_target[Y_AXIS] + new_pos1); if (dist1(candidate_pos0, candidate_pos1, interp_pos0, interp_pos1) <= (SIGMA)) break; new_t = candidate_t; new_pos0 = candidate_pos0; @@ -156,10 +157,10 @@ void cubic_b_spline( if (new_t - t > MAX_STEP) break; const float candidate_t = t + 2 * (new_t - t); if (candidate_t >= 1) break; - const float candidate_pos0 = eval_bezier(position.x, first.x, second.x, target.x, candidate_t), - candidate_pos1 = eval_bezier(position.y, first.y, second.y, target.y, candidate_t), - interp_pos0 = 0.5f * (bez_target.x + candidate_pos0), - interp_pos1 = 0.5f * (bez_target.y + candidate_pos1); + const float candidate_pos0 = eval_bezier(position[X_AXIS], first0, second0, target[X_AXIS], candidate_t), + candidate_pos1 = eval_bezier(position[Y_AXIS], first1, second1, target[Y_AXIS], candidate_t), + interp_pos0 = 0.5f * (bez_target[X_AXIS] + candidate_pos0), + interp_pos1 = 0.5f * (bez_target[Y_AXIS] + candidate_pos1); if (dist1(new_pos0, new_pos1, interp_pos0, interp_pos1) > (SIGMA)) break; new_t = candidate_t; new_pos0 = candidate_pos0; @@ -181,23 +182,23 @@ void cubic_b_spline( t = new_t; // Compute and send new position - xyze_pos_t new_bez = { - new_pos0, new_pos1, - interp(position.z, target.z, t), // FIXME. These two are wrong, since the parameter t is - interp(position.e, target.e, t) // not linear in the distance. - }; - apply_motion_limits(new_bez); - bez_target = new_bez; + bez_target[X_AXIS] = new_pos0; + bez_target[Y_AXIS] = new_pos1; + // FIXME. The following two are wrong, since the parameter t is + // not linear in the distance. + bez_target[Z_AXIS] = interp(position[Z_AXIS], target[Z_AXIS], t); + bez_target[E_AXIS] = interp(position[E_AXIS], target[E_AXIS], t); + clamp_to_software_endstops(bez_target); - #if HAS_LEVELING && !PLANNER_LEVELING - xyze_pos_t pos = bez_target; + #if HAS_UBL_AND_CURVES + float pos[XYZ] = { bez_target[X_AXIS], bez_target[Y_AXIS], bez_target[Z_AXIS] }; planner.apply_leveling(pos); + if (!planner.buffer_segment(pos[X_AXIS], pos[Y_AXIS], pos[Z_AXIS], bez_target[E_AXIS], fr_mm_s, active_extruder)) + break; #else - const xyze_pos_t &pos = bez_target; + if (!planner.buffer_line_kinematic(bez_target, fr_mm_s, extruder)) + break; #endif - - if (!planner.buffer_line(pos, scaled_fr_mm_s, active_extruder, step)) - break; } } diff --git a/Marlin/src/module/planner_bezier.h b/Marlin/src/module/planner_bezier.h index 72048c4273..7e4ea23657 100644 --- a/Marlin/src/module/planner_bezier.h +++ b/Marlin/src/module/planner_bezier.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,23 +16,28 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * planner_bezier.h * * Compute and buffer movement commands for Bézier curves + * */ -#include "../core/types.h" +#ifndef PLANNER_BEZIER_H +#define PLANNER_BEZIER_H + +#include "../inc/MarlinConfig.h" void cubic_b_spline( - const xyze_pos_t &position, // current position - const xyze_pos_t &target, // target position - const xy_pos_t (&offsets)[2], // a pair of offsets - const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % - const uint8_t extruder -); + const float position[NUM_AXIS], // current position + const float target[NUM_AXIS], // target position + const float offset[4], // a pair of offsets + float fr_mm_s, + uint8_t extruder + ); + +#endif // PLANNER_BEZIER_H diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index 86aedf2161..0c6934807b 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -29,55 +29,33 @@ Stopwatch print_job_timer; // Global Print Job Timer instance #else // PRINTCOUNTER -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif - #include "printcounter.h" -#include "../MarlinCore.h" -#include "../HAL/shared/eeprom_api.h" - -#if HAS_BUZZER && SERVICE_WARNING_BUZZES > 0 - #include "../libs/buzzer.h" -#endif - -// Service intervals -#if HAS_SERVICE_INTERVALS - #if SERVICE_INTERVAL_1 > 0 - #define SERVICE_INTERVAL_SEC_1 (3600UL * SERVICE_INTERVAL_1) - #else - #define SERVICE_INTERVAL_SEC_1 (3600UL * 100) - #endif - #if SERVICE_INTERVAL_2 > 0 - #define SERVICE_INTERVAL_SEC_2 (3600UL * SERVICE_INTERVAL_2) - #else - #define SERVICE_INTERVAL_SEC_2 (3600UL * 100) - #endif - #if SERVICE_INTERVAL_3 > 0 - #define SERVICE_INTERVAL_SEC_3 (3600UL * SERVICE_INTERVAL_3) - #else - #define SERVICE_INTERVAL_SEC_3 (3600UL * 100) - #endif -#endif +#include "../Marlin.h" +#include "../HAL/shared/persistent_store_api.h" PrintCounter print_job_timer; // Global Print Job Timer instance printStatistics PrintCounter::data; -const PrintCounter::eeprom_address_t PrintCounter::address = STATS_EEPROM_ADDRESS; +const PrintCounter::promdress PrintCounter::address = STATS_EEPROM_ADDRESS; millis_t PrintCounter::lastDuration; bool PrintCounter::loaded = false; millis_t PrintCounter::deltaDuration() { - TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("deltaDuration"))); + #if ENABLED(DEBUG_PRINTCOUNTER) + debug(PSTR("deltaDuration")); + #endif + millis_t tmp = lastDuration; lastDuration = duration(); return lastDuration - tmp; } void PrintCounter::incFilamentUsed(float const &amount) { - TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("incFilamentUsed"))); + #if ENABLED(DEBUG_PRINTCOUNTER) + debug(PSTR("incFilamentUsed")); + #endif // Refuses to update data if object is not loaded if (!isLoaded()) return; @@ -86,22 +64,12 @@ void PrintCounter::incFilamentUsed(float const &amount) { } void PrintCounter::initStats() { - TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("initStats"))); + #if ENABLED(DEBUG_PRINTCOUNTER) + debug(PSTR("initStats")); + #endif loaded = true; - data = { 0, 0, 0, 0, 0.0 - #if HAS_SERVICE_INTERVALS - #if SERVICE_INTERVAL_1 > 0 - , SERVICE_INTERVAL_SEC_1 - #endif - #if SERVICE_INTERVAL_2 > 0 - , SERVICE_INTERVAL_SEC_2 - #endif - #if SERVICE_INTERVAL_3 > 0 - , SERVICE_INTERVAL_SEC_3 - #endif - #endif - }; + data = { 0, 0, 0, 0, 0.0 }; saveStats(); persistentStore.access_start(); @@ -109,20 +77,10 @@ void PrintCounter::initStats() { persistentStore.access_finish(); } -#if HAS_SERVICE_INTERVALS - inline void _print_divider() { SERIAL_ECHO_MSG("============================================="); } - inline bool _service_warn(const char * const msg) { - _print_divider(); - SERIAL_ECHO_START(); - serialprintPGM(msg); - SERIAL_ECHOLNPGM("!"); - _print_divider(); - return true; - } -#endif - void PrintCounter::loadStats() { - TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("loadStats"))); + #if ENABLED(DEBUG_PRINTCOUNTER) + debug(PSTR("loadStats")); + #endif // Check if the EEPROM block is initialized uint8_t value = 0; @@ -134,28 +92,12 @@ void PrintCounter::loadStats() { persistentStore.read_data(address + sizeof(uint8_t), (uint8_t*)&data, sizeof(printStatistics)); persistentStore.access_finish(); loaded = true; - - #if HAS_SERVICE_INTERVALS - bool doBuzz = false; - #if SERVICE_INTERVAL_1 > 0 - if (data.nextService1 == 0) doBuzz = _service_warn(PSTR(" " SERVICE_NAME_1)); - #endif - #if SERVICE_INTERVAL_2 > 0 - if (data.nextService2 == 0) doBuzz = _service_warn(PSTR(" " SERVICE_NAME_2)); - #endif - #if SERVICE_INTERVAL_3 > 0 - if (data.nextService3 == 0) doBuzz = _service_warn(PSTR(" " SERVICE_NAME_3)); - #endif - #if HAS_BUZZER && SERVICE_WARNING_BUZZES > 0 - if (doBuzz) for (int i = 0; i < SERVICE_WARNING_BUZZES; i++) BUZZ(200, 404); - #else - UNUSED(doBuzz); - #endif - #endif // HAS_SERVICE_INTERVALS } void PrintCounter::saveStats() { - TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("saveStats"))); + #if ENABLED(DEBUG_PRINTCOUNTER) + debug(PSTR("saveStats")); + #endif // Refuses to save data if object is not loaded if (!isLoaded()) return; @@ -164,59 +106,58 @@ void PrintCounter::saveStats() { persistentStore.access_start(); persistentStore.write_data(address + sizeof(uint8_t), (uint8_t*)&data, sizeof(printStatistics)); persistentStore.access_finish(); - - TERN_(EXTENSIBLE_UI, ExtUI::onConfigurationStoreWritten(true)); } -#if HAS_SERVICE_INTERVALS - inline void _service_when(char buffer[], const char * const msg, const uint32_t when) { - SERIAL_ECHOPGM(STR_STATS); - serialprintPGM(msg); - SERIAL_ECHOLNPAIR(" in ", duration_t(when).toString(buffer)); - } -#endif - void PrintCounter::showStats() { char buffer[21]; - SERIAL_ECHOPGM(STR_STATS); - SERIAL_ECHOLNPAIR( - "Prints: ", data.totalPrints, - ", Finished: ", data.finishedPrints, - ", Failed: ", data.totalPrints - data.finishedPrints - - ((isRunning() || isPaused()) ? 1 : 0) // Remove 1 from failures with an active counter - ); + SERIAL_PROTOCOLPGM(MSG_STATS); + + SERIAL_ECHOPGM("Prints: "); + SERIAL_ECHO(data.totalPrints); + + SERIAL_ECHOPGM(", Finished: "); + SERIAL_ECHO(data.finishedPrints); + + SERIAL_ECHOPGM(", Failed: "); // Note: Removes 1 from failures with an active counter + SERIAL_ECHO(data.totalPrints - data.finishedPrints + - ((isRunning() || isPaused()) ? 1 : 0)); + + SERIAL_EOL(); + SERIAL_PROTOCOLPGM(MSG_STATS); - SERIAL_ECHOPGM(STR_STATS); duration_t elapsed = data.printTime; elapsed.toString(buffer); - SERIAL_ECHOPAIR("Total time: ", buffer); + + SERIAL_ECHOPGM("Total time: "); + SERIAL_ECHO(buffer); + #if ENABLED(DEBUG_PRINTCOUNTER) - SERIAL_ECHOPAIR(" (", data.printTime); + SERIAL_ECHOPGM(" ("); + SERIAL_ECHO(data.printTime); SERIAL_CHAR(')'); #endif elapsed = data.longestPrint; elapsed.toString(buffer); - SERIAL_ECHOPAIR(", Longest job: ", buffer); + + SERIAL_ECHOPGM(", Longest job: "); + SERIAL_ECHO(buffer); + #if ENABLED(DEBUG_PRINTCOUNTER) - SERIAL_ECHOPAIR(" (", data.longestPrint); + SERIAL_ECHOPGM(" ("); + SERIAL_ECHO(data.longestPrint); SERIAL_CHAR(')'); #endif - SERIAL_ECHOPAIR("\n" STR_STATS "Filament used: ", data.filamentUsed / 1000); - SERIAL_CHAR('m'); SERIAL_EOL(); + SERIAL_PROTOCOLPGM(MSG_STATS); - #if SERVICE_INTERVAL_1 > 0 - _service_when(buffer, PSTR(SERVICE_NAME_1), data.nextService1); - #endif - #if SERVICE_INTERVAL_2 > 0 - _service_when(buffer, PSTR(SERVICE_NAME_2), data.nextService2); - #endif - #if SERVICE_INTERVAL_3 > 0 - _service_when(buffer, PSTR(SERVICE_NAME_3), data.nextService3); - #endif + SERIAL_ECHOPGM("Filament used: "); + SERIAL_ECHO(data.filamentUsed / 1000); + SERIAL_CHAR('m'); + + SERIAL_EOL(); } void PrintCounter::tick() { @@ -226,20 +167,10 @@ void PrintCounter::tick() { static uint32_t update_next; // = 0 if (ELAPSED(now, update_next)) { - TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("tick"))); - millis_t delta = deltaDuration(); - data.printTime += delta; - - #if SERVICE_INTERVAL_1 > 0 - data.nextService1 -= _MIN(delta, data.nextService1); + #if ENABLED(DEBUG_PRINTCOUNTER) + debug(PSTR("tick")); #endif - #if SERVICE_INTERVAL_2 > 0 - data.nextService2 -= _MIN(delta, data.nextService2); - #endif - #if SERVICE_INTERVAL_3 > 0 - data.nextService3 -= _MIN(delta, data.nextService3); - #endif - + data.printTime += deltaDuration(); update_next = now + updateInterval * 1000; } @@ -252,7 +183,9 @@ void PrintCounter::tick() { // @Override bool PrintCounter::start() { - TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("start"))); + #if ENABLED(DEBUG_PRINTCOUNTER) + debug(PSTR("start")); + #endif bool paused = isPaused(); @@ -269,7 +202,9 @@ bool PrintCounter::start() { // @Override bool PrintCounter::stop() { - TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("stop"))); + #if ENABLED(DEBUG_PRINTCOUNTER) + debug(PSTR("stop")); + #endif if (super::stop()) { data.finishedPrints++; @@ -286,46 +221,14 @@ bool PrintCounter::stop() { // @Override void PrintCounter::reset() { - TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("stop"))); + #if ENABLED(DEBUG_PRINTCOUNTER) + debug(PSTR("stop")); + #endif super::reset(); lastDuration = 0; } -#if HAS_SERVICE_INTERVALS - - void PrintCounter::resetServiceInterval(const int index) { - switch (index) { - #if SERVICE_INTERVAL_1 > 0 - case 1: data.nextService1 = SERVICE_INTERVAL_SEC_1; - #endif - #if SERVICE_INTERVAL_2 > 0 - case 2: data.nextService2 = SERVICE_INTERVAL_SEC_2; - #endif - #if SERVICE_INTERVAL_3 > 0 - case 3: data.nextService3 = SERVICE_INTERVAL_SEC_3; - #endif - } - saveStats(); - } - - bool PrintCounter::needsService(const int index) { - switch (index) { - #if SERVICE_INTERVAL_1 > 0 - case 1: return data.nextService1 == 0; - #endif - #if SERVICE_INTERVAL_2 > 0 - case 2: return data.nextService2 == 0; - #endif - #if SERVICE_INTERVAL_3 > 0 - case 3: return data.nextService3 == 0; - #endif - default: return false; - } - } - -#endif // HAS_SERVICE_INTERVALS - #if ENABLED(DEBUG_PRINTCOUNTER) void PrintCounter::debug(const char func[]) { @@ -335,7 +238,6 @@ void PrintCounter::reset() { SERIAL_ECHOLNPGM("()"); } } - #endif #endif // PRINTCOUNTER diff --git a/Marlin/src/module/printcounter.h b/Marlin/src/module/printcounter.h index 66d8cbb7b3..461c689e51 100644 --- a/Marlin/src/module/printcounter.h +++ b/Marlin/src/module/printcounter.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef PRINTCOUNTER_H +#define PRINTCOUNTER_H #include "../libs/stopwatch.h" #include "../libs/duration_t.h" @@ -28,8 +30,12 @@ // Print debug messages with M111 S2 //#define DEBUG_PRINTCOUNTER -// Round up I2C / SPI address to next page boundary (assuming 32 byte pages) -#define STATS_EEPROM_ADDRESS TERN(USE_WIRED_EEPROM, 0x40, 0x32) +#if ENABLED(I2C_EEPROM) || ENABLED(SPI_EEPROM) + // round up address to next page boundary (assuming 32 byte pages) + #define STATS_EEPROM_ADDRESS 0x40 +#else + #define STATS_EEPROM_ADDRESS 0x32 +#endif struct printStatistics { // 16 bytes //const uint8_t magic; // Magic header, it will always be 0x16 @@ -38,25 +44,16 @@ struct printStatistics { // 16 bytes uint32_t printTime; // Accumulated printing time uint32_t longestPrint; // Longest successful print job float filamentUsed; // Accumulated filament consumed in mm - #if SERVICE_INTERVAL_1 > 0 - uint32_t nextService1; // Service intervals (or placeholders) - #endif - #if SERVICE_INTERVAL_2 > 0 - uint32_t nextService2; - #endif - #if SERVICE_INTERVAL_3 > 0 - uint32_t nextService3; - #endif }; class PrintCounter: public Stopwatch { private: typedef Stopwatch super; - #if EITHER(USE_WIRED_EEPROM, CPU_32_BIT) - typedef uint32_t eeprom_address_t; + #if ENABLED(I2C_EEPROM) || ENABLED(SPI_EEPROM) || defined(CPU_32_BIT) + typedef uint32_t promdress; #else - typedef uint16_t eeprom_address_t; + typedef uint16_t promdress; #endif static printStatistics data; @@ -65,7 +62,7 @@ class PrintCounter: public Stopwatch { * @brief EEPROM address * @details Defines the start offset address where the data is stored. */ - static const eeprom_address_t address; + static const promdress address; /** * @brief Interval in seconds between counter updates @@ -179,11 +176,6 @@ class PrintCounter: public Stopwatch { static bool stop(); static void reset(); - #if HAS_SERVICE_INTERVALS - static void resetServiceInterval(const int index); - static bool needsService(const int index); - #endif - #if ENABLED(DEBUG_PRINTCOUNTER) /** @@ -201,3 +193,5 @@ class PrintCounter: public Stopwatch { #else extern Stopwatch print_job_timer; #endif + +#endif // PRINTCOUNTER_H diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index defc22b1fe..ed2ff0b9aa 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ /** - * module/probe.cpp + * probe.cpp */ #include "../inc/MarlinConfig.h" @@ -29,8 +29,6 @@ #if HAS_BED_PROBE #include "probe.h" - -#include "../libs/buzzer.h" #include "motion.h" #include "temperature.h" #include "endstops.h" @@ -38,58 +36,24 @@ #include "../gcode/gcode.h" #include "../lcd/ultralcd.h" -#include "../MarlinCore.h" // for stop(), disable_e_steppers, wait_for_user +#include "../Marlin.h" #if HAS_LEVELING #include "../feature/bedlevel/bedlevel.h" #endif #if ENABLED(DELTA) - #include "delta.h" + #include "../module/delta.h" #endif #if ENABLED(BABYSTEP_ZPROBE_OFFSET) #include "planner.h" #endif -#if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) - #include "../feature/backlash.h" -#endif - -#if ENABLED(BLTOUCH) - #include "../feature/bltouch.h" -#endif - -#if ENABLED(HOST_PROMPT_SUPPORT) - #include "../feature/host_actions.h" // for PROMPT_USER_CONTINUE -#endif +float zprobe_zoffset; // Initialized by settings.load() #if HAS_Z_SERVO_PROBE - #include "servo.h" -#endif - -#if ENABLED(SENSORLESS_PROBING) - #include "stepper.h" - #include "../feature/tmc_util.h" -#endif - -#if QUIET_PROBING - #include "stepper/indirection.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif - -#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) -#include "../core/debug_out.h" - -Probe probe; - -xyz_pos_t Probe::offset; // Initialized by settings.load() - -#if HAS_PROBE_XY_OFFSET - const xyz_pos_t &Probe::offset_xy = Probe::offset; + #include "../module/servo.h" #endif #if ENABLED(Z_PROBE_SLED) @@ -104,8 +68,14 @@ xyz_pos_t Probe::offset; // Initialized by settings.load() * stow[in] If false, move to MAX_X and engage the solenoid * If true, move to MAX_X and release the solenoid */ - static void dock_sled(const bool stow) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("dock_sled(", stow, ")"); + static void dock_sled(bool stow) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("dock_sled(", stow); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif // Dock sled a bit closer to ensure proper capturing do_blocking_move_to_x(X_MAX_POS + SLED_DOCKING_OFFSET - ((stow) ? 1 : 0)); @@ -115,240 +85,299 @@ xyz_pos_t Probe::offset; // Initialized by settings.load() #endif } -#elif ENABLED(TOUCH_MI_PROBE) - - // Move to the magnet to unlock the probe - inline void run_deploy_moves_script() { - #ifndef TOUCH_MI_DEPLOY_XPOS - #define TOUCH_MI_DEPLOY_XPOS X_MIN_POS - #elif TOUCH_MI_DEPLOY_XPOS > X_MAX_BED - TemporaryGlobalEndstopsState unlock_x(false); - #endif - #if TOUCH_MI_DEPLOY_YPOS > Y_MAX_BED - TemporaryGlobalEndstopsState unlock_y(false); - #endif - - #if ENABLED(TOUCH_MI_MANUAL_DEPLOY) - - const screenFunc_t prev_screen = ui.currentScreen; - LCD_MESSAGEPGM(MSG_MANUAL_DEPLOY_TOUCHMI); - ui.return_to_status(); - - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Deploy TouchMI"), CONTINUE_STR)); - wait_for_user_response(); - ui.reset_status(); - ui.goto_screen(prev_screen); - - #elif defined(TOUCH_MI_DEPLOY_XPOS) && defined(TOUCH_MI_DEPLOY_YPOS) - do_blocking_move_to_xy(TOUCH_MI_DEPLOY_XPOS, TOUCH_MI_DEPLOY_YPOS); - #elif defined(TOUCH_MI_DEPLOY_XPOS) - do_blocking_move_to_x(TOUCH_MI_DEPLOY_XPOS); - #elif defined(TOUCH_MI_DEPLOY_YPOS) - do_blocking_move_to_y(TOUCH_MI_DEPLOY_YPOS); - #endif - } - - // Move down to the bed to stow the probe - inline void run_stow_moves_script() { - const xyz_pos_t oldpos = current_position; - endstops.enable_z_probe(false); - do_blocking_move_to_z(TOUCH_MI_RETRACT_Z, MMM_TO_MMS(HOMING_FEEDRATE_Z)); - do_blocking_move_to(oldpos, MMM_TO_MMS(HOMING_FEEDRATE_Z)); - } - #elif ENABLED(Z_PROBE_ALLEN_KEY) - inline void run_deploy_moves_script() { - #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_1 + FORCE_INLINE void do_blocking_move_to(const float (&raw)[XYZ], const float &fr_mm_s) { + do_blocking_move_to(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS], fr_mm_s); + } + + void run_deploy_moves_script() { + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE 0.0 #endif - constexpr xyz_pos_t deploy_1 = Z_PROBE_ALLEN_KEY_DEPLOY_1; + const float deploy_1[] = { Z_PROBE_ALLEN_KEY_DEPLOY_1_X, Z_PROBE_ALLEN_KEY_DEPLOY_1_Y, Z_PROBE_ALLEN_KEY_DEPLOY_1_Z }; do_blocking_move_to(deploy_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE)); #endif - #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_2 + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_2_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_2_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_2_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE 0.0 #endif - constexpr xyz_pos_t deploy_2 = Z_PROBE_ALLEN_KEY_DEPLOY_2; + const float deploy_2[] = { Z_PROBE_ALLEN_KEY_DEPLOY_2_X, Z_PROBE_ALLEN_KEY_DEPLOY_2_Y, Z_PROBE_ALLEN_KEY_DEPLOY_2_Z }; do_blocking_move_to(deploy_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE)); #endif - #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_3 + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_3_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_3_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_3_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE 0.0 #endif - constexpr xyz_pos_t deploy_3 = Z_PROBE_ALLEN_KEY_DEPLOY_3; + const float deploy_3[] = { Z_PROBE_ALLEN_KEY_DEPLOY_3_X, Z_PROBE_ALLEN_KEY_DEPLOY_3_Y, Z_PROBE_ALLEN_KEY_DEPLOY_3_Z }; do_blocking_move_to(deploy_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE)); #endif - #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_4 + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_4_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_4_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_4_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE 0.0 #endif - constexpr xyz_pos_t deploy_4 = Z_PROBE_ALLEN_KEY_DEPLOY_4; + const float deploy_4[] = { Z_PROBE_ALLEN_KEY_DEPLOY_4_X, Z_PROBE_ALLEN_KEY_DEPLOY_4_Y, Z_PROBE_ALLEN_KEY_DEPLOY_4_Z }; do_blocking_move_to(deploy_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE)); #endif - #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_5 + #if defined(Z_PROBE_ALLEN_KEY_DEPLOY_5_X) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_5_Y) || defined(Z_PROBE_ALLEN_KEY_DEPLOY_5_Z) + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_X + #define Z_PROBE_ALLEN_KEY_DEPLOY_5_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_Y + #define Z_PROBE_ALLEN_KEY_DEPLOY_5_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_Z + #define Z_PROBE_ALLEN_KEY_DEPLOY_5_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE #define Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE 0.0 #endif - constexpr xyz_pos_t deploy_5 = Z_PROBE_ALLEN_KEY_DEPLOY_5; + const float deploy_5[] = { Z_PROBE_ALLEN_KEY_DEPLOY_5_X, Z_PROBE_ALLEN_KEY_DEPLOY_5_Y, Z_PROBE_ALLEN_KEY_DEPLOY_5_Z }; do_blocking_move_to(deploy_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE)); #endif } - inline void run_stow_moves_script() { - #ifdef Z_PROBE_ALLEN_KEY_STOW_1 + void run_stow_moves_script() { + #if defined(Z_PROBE_ALLEN_KEY_STOW_1_X) || defined(Z_PROBE_ALLEN_KEY_STOW_1_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_1_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_1_X + #define Z_PROBE_ALLEN_KEY_STOW_1_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_1_Y + #define Z_PROBE_ALLEN_KEY_STOW_1_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_1_Z + #define Z_PROBE_ALLEN_KEY_STOW_1_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE 0.0 #endif - constexpr xyz_pos_t stow_1 = Z_PROBE_ALLEN_KEY_STOW_1; + const float stow_1[] = { Z_PROBE_ALLEN_KEY_STOW_1_X, Z_PROBE_ALLEN_KEY_STOW_1_Y, Z_PROBE_ALLEN_KEY_STOW_1_Z }; do_blocking_move_to(stow_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE)); #endif - #ifdef Z_PROBE_ALLEN_KEY_STOW_2 + #if defined(Z_PROBE_ALLEN_KEY_STOW_2_X) || defined(Z_PROBE_ALLEN_KEY_STOW_2_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_2_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_2_X + #define Z_PROBE_ALLEN_KEY_STOW_2_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_2_Y + #define Z_PROBE_ALLEN_KEY_STOW_2_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_2_Z + #define Z_PROBE_ALLEN_KEY_STOW_2_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE 0.0 #endif - constexpr xyz_pos_t stow_2 = Z_PROBE_ALLEN_KEY_STOW_2; + const float stow_2[] = { Z_PROBE_ALLEN_KEY_STOW_2_X, Z_PROBE_ALLEN_KEY_STOW_2_Y, Z_PROBE_ALLEN_KEY_STOW_2_Z }; do_blocking_move_to(stow_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE)); #endif - #ifdef Z_PROBE_ALLEN_KEY_STOW_3 + #if defined(Z_PROBE_ALLEN_KEY_STOW_3_X) || defined(Z_PROBE_ALLEN_KEY_STOW_3_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_3_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_3_X + #define Z_PROBE_ALLEN_KEY_STOW_3_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_3_Y + #define Z_PROBE_ALLEN_KEY_STOW_3_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_3_Z + #define Z_PROBE_ALLEN_KEY_STOW_3_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE 0.0 #endif - constexpr xyz_pos_t stow_3 = Z_PROBE_ALLEN_KEY_STOW_3; + const float stow_3[] = { Z_PROBE_ALLEN_KEY_STOW_3_X, Z_PROBE_ALLEN_KEY_STOW_3_Y, Z_PROBE_ALLEN_KEY_STOW_3_Z }; do_blocking_move_to(stow_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE)); #endif - #ifdef Z_PROBE_ALLEN_KEY_STOW_4 + #if defined(Z_PROBE_ALLEN_KEY_STOW_4_X) || defined(Z_PROBE_ALLEN_KEY_STOW_4_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_4_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_4_X + #define Z_PROBE_ALLEN_KEY_STOW_4_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_4_Y + #define Z_PROBE_ALLEN_KEY_STOW_4_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_4_Z + #define Z_PROBE_ALLEN_KEY_STOW_4_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE 0.0 #endif - constexpr xyz_pos_t stow_4 = Z_PROBE_ALLEN_KEY_STOW_4; + const float stow_4[] = { Z_PROBE_ALLEN_KEY_STOW_4_X, Z_PROBE_ALLEN_KEY_STOW_4_Y, Z_PROBE_ALLEN_KEY_STOW_4_Z }; do_blocking_move_to(stow_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE)); #endif - #ifdef Z_PROBE_ALLEN_KEY_STOW_5 + #if defined(Z_PROBE_ALLEN_KEY_STOW_5_X) || defined(Z_PROBE_ALLEN_KEY_STOW_5_Y) || defined(Z_PROBE_ALLEN_KEY_STOW_5_Z) + #ifndef Z_PROBE_ALLEN_KEY_STOW_5_X + #define Z_PROBE_ALLEN_KEY_STOW_5_X current_position[X_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_5_Y + #define Z_PROBE_ALLEN_KEY_STOW_5_Y current_position[Y_AXIS] + #endif + #ifndef Z_PROBE_ALLEN_KEY_STOW_5_Z + #define Z_PROBE_ALLEN_KEY_STOW_5_Z current_position[Z_AXIS] + #endif #ifndef Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE #define Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE 0.0 #endif - constexpr xyz_pos_t stow_5 = Z_PROBE_ALLEN_KEY_STOW_5; + const float stow_5[] = { Z_PROBE_ALLEN_KEY_STOW_5_X, Z_PROBE_ALLEN_KEY_STOW_5_Y, Z_PROBE_ALLEN_KEY_STOW_5_Z }; do_blocking_move_to(stow_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE)); #endif } #endif // Z_PROBE_ALLEN_KEY -#if QUIET_PROBING +#if ENABLED(PROBING_FANS_OFF) - void Probe::set_probing_paused(const bool p) { - TERN_(PROBING_HEATERS_OFF, thermalManager.pause(p)); - TERN_(PROBING_FANS_OFF, thermalManager.set_fans_paused(p)); - #if ENABLED(PROBING_STEPPERS_OFF) - disable_e_steppers(); - #if NONE(DELTA, HOME_AFTER_DEACTIVATE) - DISABLE_AXIS_X(); DISABLE_AXIS_Y(); - #endif + void fans_pause(const bool p) { + if (p != fans_paused) { + fans_paused = p; + if (p) + for (uint8_t x = 0; x < FAN_COUNT; x++) { + paused_fanSpeeds[x] = fanSpeeds[x]; + fanSpeeds[x] = 0; + } + else + for (uint8_t x = 0; x < FAN_COUNT; x++) + fanSpeeds[x] = paused_fanSpeeds[x]; + } + } + +#endif // PROBING_FANS_OFF + +#if QUIET_PROBING + void probing_pause(const bool p) { + #if ENABLED(PROBING_HEATERS_OFF) + thermalManager.pause(p); #endif - if (p) safe_delay(25 + #if ENABLED(PROBING_FANS_OFF) + fans_pause(p); + #endif + if (p) safe_delay( #if DELAY_BEFORE_PROBING > 25 - - 25 + DELAY_BEFORE_PROBING + DELAY_BEFORE_PROBING + #else + 25 #endif ); } - #endif // QUIET_PROBING +#if ENABLED(BLTOUCH) + + void bltouch_command(const int angle) { + MOVE_SERVO(Z_PROBE_SERVO_NR, angle); // Give the BL-Touch the command and wait + safe_delay(BLTOUCH_DELAY); + } + + bool set_bltouch_deployed(const bool deploy) { + if (deploy && TEST_BLTOUCH()) { // If BL-Touch says it's triggered + bltouch_command(BLTOUCH_RESET); // try to reset it. + bltouch_command(BLTOUCH_DEPLOY); // Also needs to deploy and stow to + bltouch_command(BLTOUCH_STOW); // clear the triggered condition. + safe_delay(1500); // Wait for internal self-test to complete. + // (Measured completion time was 0.65 seconds + // after reset, deploy, and stow sequence) + if (TEST_BLTOUCH()) { // If it still claims to be triggered... + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_STOP_BLTOUCH); + stop(); // punt! + return true; + } + } + + bltouch_command(deploy ? BLTOUCH_DEPLOY : BLTOUCH_STOW); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("set_bltouch_deployed(", deploy); + SERIAL_CHAR(')'); + SERIAL_EOL(); + } + #endif + + return false; + } + +#endif // BLTOUCH + /** * Raise Z to a minimum height to make room for a probe to move */ -void Probe::do_z_raise(const float z_raise) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Probe::do_z_raise(", z_raise, ")"); - float z_dest = z_raise; - if (offset.z < 0) z_dest -= offset.z; - do_z_clearance(z_dest); -} - -FORCE_INLINE void probe_specific_action(const bool deploy) { - #if ENABLED(PAUSE_BEFORE_DEPLOY_STOW) - do { - #if ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED) - if (deploy == ( - #if HAS_CUSTOM_PROBE_PIN - READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_INVERTING - #else - READ(Z_MIN_PIN) == Z_MIN_ENDSTOP_INVERTING - #endif - )) break; - #endif - - BUZZ(100, 659); - BUZZ(100, 698); - - PGM_P const ds_str = deploy ? GET_TEXT(MSG_MANUAL_DEPLOY) : GET_TEXT(MSG_MANUAL_STOW); - ui.return_to_status(); // To display the new status message - ui.set_status_P(ds_str, 99); - serialprintPGM(ds_str); +inline void do_probe_raise(const float z_raise) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("do_probe_raise(", z_raise); + SERIAL_CHAR(')'); SERIAL_EOL(); - - TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Stow Probe"), CONTINUE_STR)); - TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Stow Probe"))); - - wait_for_user_response(); - ui.reset_status(); - - } while (ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED)); - - #endif // PAUSE_BEFORE_DEPLOY_STOW - - #if ENABLED(SOLENOID_PROBE) - - #if HAS_SOLENOID_1 - WRITE(SOL1_PIN, deploy); - #endif - - #elif ENABLED(Z_PROBE_SLED) - - dock_sled(!deploy); - - #elif ENABLED(BLTOUCH) - - deploy ? bltouch.deploy() : bltouch.stow(); - - #elif HAS_Z_SERVO_PROBE - - MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][deploy ? 0 : 1]); - - #elif EITHER(TOUCH_MI_PROBE, Z_PROBE_ALLEN_KEY) - - deploy ? run_deploy_moves_script() : run_stow_moves_script(); - - #elif ENABLED(RACK_AND_PINION_PROBE) - - do_blocking_move_to_x(deploy ? Z_PROBE_DEPLOY_X : Z_PROBE_RETRACT_X); - - #elif DISABLED(PAUSE_BEFORE_DEPLOY_STOW) - - UNUSED(deploy); - + } #endif + + float z_dest = z_raise; + if (zprobe_zoffset < 0) z_dest -= zprobe_zoffset; + + NOMORE(z_dest, Z_MAX_POS); + + if (z_dest > current_position[Z_AXIS]) + do_blocking_move_to_z(z_dest); } -/** - * Attempt to deploy or stow the probe - * - * Return TRUE if the probe could not be deployed/stowed - */ -bool Probe::set_deployed(const bool deploy) { +// returns false for ok and true for failure +bool set_probe_deployed(const bool deploy) { - if (DEBUGGING(LEVELING)) { - DEBUG_POS("Probe::set_deployed", current_position); - DEBUG_ECHOLNPAIR("deploy: ", deploy); - } + // Can be extended to servo probes, if needed. + #if ENABLED(PROBE_IS_TRIGGERED_WHEN_STOWED_TEST) + #if ENABLED(Z_MIN_PROBE_ENDSTOP) + #define _TRIGGERED_WHEN_STOWED_TEST (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) + #else + #define _TRIGGERED_WHEN_STOWED_TEST (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) + #endif + #endif + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + DEBUG_POS("set_probe_deployed", current_position); + SERIAL_ECHOLNPAIR("deploy: ", deploy); + } + #endif if (endstops.z_probe_enabled == deploy) return false; // Make room for probe to deploy (or stow) // Fix-mounted probe should only raise for deploy - // unless PAUSE_BEFORE_DEPLOY_STOW is enabled - #if EITHER(FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE) && DISABLED(PAUSE_BEFORE_DEPLOY_STOW) + #if ENABLED(FIX_MOUNTED_PROBE) const bool deploy_stow_condition = deploy; #else constexpr bool deploy_stow_condition = true; @@ -362,55 +391,89 @@ bool Probe::set_deployed(const bool deploy) { #endif if (deploy_stow_condition && unknown_condition) - do_z_raise(_MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); + do_probe_raise(MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); - #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) - if (homing_needed_error(TERN_(Z_PROBE_SLED, _BV(X_AXIS)))) { - SERIAL_ERROR_MSG(STR_STOP_UNHOMED); + #if ENABLED(Z_PROBE_SLED) || ENABLED(Z_PROBE_ALLEN_KEY) + #if ENABLED(Z_PROBE_SLED) + #define _AUE_ARGS true, false, false + #else + #define _AUE_ARGS + #endif + if (axis_unhomed_error(_AUE_ARGS)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_STOP_UNHOMED); stop(); return true; } #endif - const xy_pos_t old_xy = current_position; + const float oldXpos = current_position[X_AXIS], + oldYpos = current_position[Y_AXIS]; - #if ENABLED(PROBE_TRIGGERED_WHEN_STOWED_TEST) - #if HAS_CUSTOM_PROBE_PIN - #define PROBE_STOWED() (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) - #else - #define PROBE_STOWED() (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) - #endif - #endif + #ifdef _TRIGGERED_WHEN_STOWED_TEST - #ifdef PROBE_STOWED + // If endstop is already false, the Z probe is deployed + if (_TRIGGERED_WHEN_STOWED_TEST == deploy) { // closed after the probe specific actions. + // Would a goto be less ugly? + //while (!_TRIGGERED_WHEN_STOWED_TEST) idle(); // would offer the opportunity + // for a triggered when stowed manual probe. - // Only deploy/stow if needed - if (PROBE_STOWED() == deploy) { if (!deploy) endstops.enable_z_probe(false); // Switch off triggered when stowed probes early // otherwise an Allen-Key probe can't be stowed. - probe_specific_action(deploy); - } + #endif + + #if ENABLED(SOLENOID_PROBE) + + #if HAS_SOLENOID_1 + WRITE(SOL1_PIN, deploy); + #endif + + #elif ENABLED(Z_PROBE_SLED) + + dock_sled(!deploy); + + #elif HAS_Z_SERVO_PROBE && DISABLED(BLTOUCH) + + MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][deploy ? 0 : 1]); + + #elif ENABLED(Z_PROBE_ALLEN_KEY) + + deploy ? run_deploy_moves_script() : run_stow_moves_script(); + + #endif + + #ifdef _TRIGGERED_WHEN_STOWED_TEST + } // _TRIGGERED_WHEN_STOWED_TEST == deploy + + if (_TRIGGERED_WHEN_STOWED_TEST == deploy) { // State hasn't changed? - if (PROBE_STOWED() == deploy) { // Unchanged after deploy/stow action? if (IsRunning()) { - SERIAL_ERROR_MSG("Z-Probe failed"); - LCD_ALERTMESSAGEPGM_P(PSTR("Err: ZPROBE")); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM("Z-Probe failed"); + LCD_ALERTMESSAGEPGM("Err: ZPROBE"); } stop(); return true; - } - #else - - probe_specific_action(deploy); + } // _TRIGGERED_WHEN_STOWED_TEST == deploy #endif - do_blocking_move_to(old_xy); + do_blocking_move_to(oldXpos, oldYpos, current_position[Z_AXIS]); // return to position before deploy endstops.enable_z_probe(deploy); return false; } +#ifdef Z_AFTER_PROBING + // After probing move to a preferred Z position + void move_z_after_probing() { + if (current_position[Z_AXIS] != Z_AFTER_PROBING) { + do_blocking_move_to_z(Z_AFTER_PROBING); + current_position[Z_AXIS] = Z_AFTER_PROBING; + } + } +#endif + /** * @brief Used by run_z_probe to do a single Z probe move. * @@ -419,225 +482,175 @@ bool Probe::set_deployed(const bool deploy) { * @return true to indicate an error */ -/** - * @brief Move down until the probe triggers or the low limit is reached - * - * @details Used by run_z_probe to get each bed Z height measurement. - * Sets current_position.z to the height where the probe triggered - * (according to the Z stepper count). The float Z is propagated - * back to the planner.position to preempt any rounding error. - * - * @return TRUE if the probe failed to trigger. - */ -bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { - DEBUG_SECTION(log_probe, "Probe::probe_down_to_z", DEBUGGING(LEVELING)); +#if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) + const char msg_wait_for_bed_heating[25] PROGMEM = "Wait for bed heating...\n"; +#endif - #if BOTH(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) - thermalManager.wait_for_bed_heating(); +static bool do_probe_move(const float z, const float fr_mm_s) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS(">>> do_probe_move", current_position); #endif - #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) - if (bltouch.deploy()) return true; // DEPLOY in LOW SPEED MODE on every probe action + #if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) + // Wait for bed to heat back up between probing points + if (thermalManager.isHeatingBed()) { + serialprintPGM(msg_wait_for_bed_heating); + LCD_MESSAGEPGM(MSG_BED_HEATING); + while (thermalManager.isHeatingBed()) safe_delay(200); + lcd_reset_status(); + } #endif - // Disable stealthChop if used. Enable diag1 pin on driver. - #if ENABLED(SENSORLESS_PROBING) - sensorless_t stealth_states { false }; - #if ENABLED(DELTA) - stealth_states.x = tmc_enable_stallguard(stepperX); - stealth_states.y = tmc_enable_stallguard(stepperY); - #endif - stealth_states.z = tmc_enable_stallguard(stepperZ); - endstops.enable(true); + // Deploy BLTouch at the start of any probe + #if ENABLED(BLTOUCH) + if (set_bltouch_deployed(true)) return true; #endif - TERN_(QUIET_PROBING, set_probing_paused(true)); + #if QUIET_PROBING + probing_pause(true); + #endif - // Move down until the probe is triggered + // Move down until probe triggered do_blocking_move_to_z(z, fr_mm_s); // Check to see if the probe was triggered - const bool probe_triggered = - #if BOTH(DELTA, SENSORLESS_PROBING) - endstops.trigger_state() & (_BV(X_MIN) | _BV(Y_MIN) | _BV(Z_MIN)) + const bool probe_triggered = TEST(endstops.trigger_state(), + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + Z_MIN #else - TEST(endstops.trigger_state(), TERN(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, Z_MIN, Z_MIN_PROBE)) + Z_MIN_PROBE #endif - ; + ); - TERN_(QUIET_PROBING, set_probing_paused(false)); - - // Re-enable stealthChop if used. Disable diag1 pin on driver. - #if ENABLED(SENSORLESS_PROBING) - endstops.not_homing(); - #if ENABLED(DELTA) - tmc_disable_stallguard(stepperX, stealth_states.x); - tmc_disable_stallguard(stepperY, stealth_states.y); - #endif - tmc_disable_stallguard(stepperZ, stealth_states.z); + #if QUIET_PROBING + probing_pause(false); #endif - #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) - if (probe_triggered && bltouch.stow()) return true; // STOW in LOW SPEED MODE on trigger on every probe action + // Retract BLTouch immediately after a probe if it was triggered + #if ENABLED(BLTOUCH) + if (probe_triggered && set_bltouch_deployed(false)) return true; #endif - // Clear endstop flags endstops.hit_on_purpose(); // Get Z where the steppers were interrupted set_current_from_steppers_for_axis(Z_AXIS); // Tell the planner where we actually are - sync_plan_position(); + SYNC_PLAN_POSITION_KINEMATIC(); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("<<< do_probe_move", current_position); + #endif return !probe_triggered; } /** - * @brief Probe at the current XY (possibly more than once) to find the bed Z. + * @details Used by probe_pt to do a single Z probe at the current position. + * Leaves current_position[Z_AXIS] at the height where the probe triggered. * - * @details Used by probe_at_point to get the bed Z height at the current XY. - * Leaves current_position.z at the height where the probe triggered. - * - * @return The Z position of the bed at the current XY or NAN on error. + * @return The raw Z position where the probe was triggered */ -float Probe::run_z_probe(const bool sanity_check/*=true*/) { - DEBUG_SECTION(log_probe, "Probe::run_z_probe", DEBUGGING(LEVELING)); +static float run_z_probe() { - auto try_to_probe = [&](PGM_P const plbl, const float &z_probe_low_point, const feedRate_t fr_mm_s, const bool scheck, const float clearance) { - // Do a first probe at the fast speed - const bool probe_fail = probe_down_to_z(z_probe_low_point, fr_mm_s), // No probe trigger? - early_fail = (scheck && current_position.z > -offset.z + clearance); // Probe triggered too high? - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING) && (probe_fail || early_fail)) { - DEBUG_PRINT_P(plbl); - DEBUG_ECHOPGM(" Probe fail! -"); - if (probe_fail) DEBUG_ECHOPGM(" No trigger."); - if (early_fail) DEBUG_ECHOPGM(" Triggered early."); - DEBUG_EOL(); - } - #else - UNUSED(plbl); - #endif - return probe_fail || early_fail; - }; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS(">>> run_z_probe", current_position); + #endif // Stop the probe before it goes too low to prevent damage. // If Z isn't known then probe to -10mm. - const float z_probe_low_point = TEST(axis_known_position, Z_AXIS) ? -offset.z + Z_PROBE_LOW_POINT : -10.0; + const float z_probe_low_point = TEST(axis_known_position, Z_AXIS) ? -zprobe_zoffset + Z_PROBE_LOW_POINT : -10.0; // Double-probing does a fast probe followed by a slow probe - #if TOTAL_PROBING == 2 + #if MULTIPLE_PROBING == 2 // Do a first probe at the fast speed - if (try_to_probe(PSTR("FAST"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_FAST), - sanity_check, Z_CLEARANCE_BETWEEN_PROBES) ) return NAN; + if (do_probe_move(z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("FAST Probe fail!"); + DEBUG_POS("<<< run_z_probe", current_position); + } + #endif + return NAN; + } - const float first_probe_z = current_position.z; + float first_probe_z = current_position[Z_AXIS]; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("1st Probe Z:", first_probe_z); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("1st Probe Z:", first_probe_z); + #endif - // Raise to give the probe clearance - do_blocking_move_to_z(current_position.z + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + // move up to make clearance for the probe + do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); - #elif Z_PROBE_SPEED_FAST != Z_PROBE_SPEED_SLOW + #else // If the nozzle is well over the travel height then // move down quickly before doing the slow probe - const float z = Z_CLEARANCE_DEPLOY_PROBE + 5.0 + (offset.z < 0 ? -offset.z : 0); - if (current_position.z > z) { - // Probe down fast. If the probe never triggered, raise for probe clearance - if (!probe_down_to_z(z, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) - do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + float z = Z_CLEARANCE_DEPLOY_PROBE + 5.0; + if (zprobe_zoffset < 0) z -= zprobe_zoffset; + + if (current_position[Z_AXIS] > z) { + // If we don't make it to the z position (i.e. the probe triggered), move up to make clearance for the probe + if (!do_probe_move(z, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) + do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); } #endif - #if EXTRA_PROBING > 0 - float probes[TOTAL_PROBING]; + #if MULTIPLE_PROBING > 2 + float probes_total = 0; + for (uint8_t p = MULTIPLE_PROBING + 1; --p;) { #endif - #if TOTAL_PROBING > 2 - float probes_z_sum = 0; - for ( - #if EXTRA_PROBING > 0 - uint8_t p = 0; p < TOTAL_PROBING; p++ - #else - uint8_t p = TOTAL_PROBING; p--; - #endif - ) - #endif - { - // Probe downward slowly to find the bed - if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_SLOW), - sanity_check, Z_CLEARANCE_MULTI_PROBE) ) return NAN; - - TERN_(MEASURE_BACKLASH_WHEN_PROBING, backlash.measure_with_probe()); - - const float z = current_position.z; - - #if EXTRA_PROBING > 0 - // Insert Z measurement into probes[]. Keep it sorted ascending. - LOOP_LE_N(i, p) { // Iterate the saved Zs to insert the new Z - if (i == p || probes[i] > z) { // Last index or new Z is smaller than this Z - for (int8_t m = p; --m >= i;) probes[m + 1] = probes[m]; // Shift items down after the insertion point - probes[i] = z; // Insert the new Z measurement - break; // Only one to insert. Done! + // move down slowly to find bed + if (do_probe_move(z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_SLOW))) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPGM("SLOW Probe fail!"); + DEBUG_POS("<<< run_z_probe", current_position); } - } - #elif TOTAL_PROBING > 2 - probes_z_sum += z; - #else - UNUSED(z); - #endif + #endif + return NAN; + } - #if TOTAL_PROBING > 2 - // Small Z raise after all but the last probe - if (p - #if EXTRA_PROBING > 0 - < TOTAL_PROBING - 1 - #endif - ) do_blocking_move_to_z(z + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); - #endif + #if MULTIPLE_PROBING > 2 + probes_total += current_position[Z_AXIS]; + if (p > 1) do_blocking_move_to_z(current_position[Z_AXIS] + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); } + #endif - #if TOTAL_PROBING > 2 + #if MULTIPLE_PROBING > 2 - #if EXTRA_PROBING > 0 - // Take the center value (or average the two middle values) as the median - static constexpr int PHALF = (TOTAL_PROBING - 1) / 2; - const float middle = probes[PHALF], - median = ((TOTAL_PROBING) & 1) ? middle : (middle + probes[PHALF + 1]) * 0.5f; + // Return the average value of all probes + const float measured_z = probes_total * (1.0f / (MULTIPLE_PROBING)); - // Remove values farthest from the median - uint8_t min_avg_idx = 0, max_avg_idx = TOTAL_PROBING - 1; - for (uint8_t i = EXTRA_PROBING; i--;) - if (ABS(probes[max_avg_idx] - median) > ABS(probes[min_avg_idx] - median)) - max_avg_idx--; else min_avg_idx++; + #elif MULTIPLE_PROBING == 2 - // Return the average value of all remaining probes. - LOOP_S_LE_N(i, min_avg_idx, max_avg_idx) - probes_z_sum += probes[i]; + const float z2 = current_position[Z_AXIS]; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("2nd Probe Z:", z2); + SERIAL_ECHOLNPAIR(" Discrepancy:", first_probe_z - z2); + } #endif - const float measured_z = probes_z_sum * RECIPROCAL(MULTIPLE_PROBING); - - #elif TOTAL_PROBING == 2 - - const float z2 = current_position.z; - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("2nd Probe Z:", z2, " Discrepancy:", first_probe_z - z2); - // Return a weighted average of the fast and slow probes const float measured_z = (z2 * 3.0 + first_probe_z * 2.0) * 0.2; #else // Return the single probe result - const float measured_z = current_position.z; + const float measured_z = current_position[Z_AXIS]; #endif + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("<<< run_z_probe", current_position); + #endif + return measured_z; } @@ -650,40 +663,34 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { * - Raise to the BETWEEN height * - Return the probed Z position */ -float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/, const bool sanity_check/*=true*/) { - DEBUG_SECTION(log_probe, "Probe::probe_at_point", DEBUGGING(LEVELING)); - - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR( - "...(", LOGICAL_X_POSITION(rx), ", ", LOGICAL_Y_POSITION(ry), - ", ", raise_after == PROBE_PT_RAISE ? "raise" : raise_after == PROBE_PT_STOW ? "stow" : "none", - ", ", int(verbose_level), - ", ", probe_relative ? "probe" : "nozzle", "_relative)" - ); - DEBUG_POS("", current_position); - } - - #if BOTH(BLTOUCH, BLTOUCH_HS_MODE) - if (bltouch.triggered()) bltouch._reset(); +float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR(">>> probe_pt(", LOGICAL_X_POSITION(rx)); + SERIAL_ECHOPAIR(", ", LOGICAL_Y_POSITION(ry)); + SERIAL_ECHOPAIR(", ", raise_after == PROBE_PT_RAISE ? "raise" : raise_after == PROBE_PT_STOW ? "stow" : "none"); + SERIAL_ECHOPAIR(", ", int(verbose_level)); + SERIAL_ECHOPAIR(", ", probe_relative ? "probe" : "nozzle"); + SERIAL_ECHOLNPGM("_relative)"); + DEBUG_POS("", current_position); + } #endif // TODO: Adapt for SCARA, where the offset rotates - xyz_pos_t npos = { rx, ry }; - if (probe_relative) { // The given position is in terms of the probe - if (!can_reach(npos)) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Position Not Reachable"); - return NAN; - } - npos -= offset_xy; // Get the nozzle position + float nx = rx, ny = ry; + if (probe_relative) { + if (!position_is_reachable_by_probe(rx, ry)) return NAN; // The given position is in terms of the probe + nx -= (X_PROBE_OFFSET_FROM_EXTRUDER); // Get the nozzle position + ny -= (Y_PROBE_OFFSET_FROM_EXTRUDER); } - else if (!position_is_reachable(npos)) return NAN; // The given position is in terms of the nozzle + else if (!position_is_reachable(nx, ny)) return NAN; // The given position is in terms of the nozzle - npos.z = + const float nz = #if ENABLED(DELTA) // Move below clip height or xy move will be aborted by do_blocking_move_to - _MIN(current_position.z, delta_clip_start_height) + MIN(current_position[Z_AXIS], delta_clip_start_height) #else - current_position.z + current_position[Z_AXIS] #endif ; @@ -691,37 +698,47 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise feedrate_mm_s = XY_PROBE_FEEDRATE_MM_S; // Move the probe to the starting XYZ - do_blocking_move_to(npos); + do_blocking_move_to(nx, ny, nz); float measured_z = NAN; - if (!deploy()) measured_z = run_z_probe(sanity_check) + offset.z; - if (!isnan(measured_z)) { + if (!DEPLOY_PROBE()) { + measured_z = run_z_probe() + zprobe_zoffset; + const bool big_raise = raise_after == PROBE_PT_BIG_RAISE; if (big_raise || raise_after == PROBE_PT_RAISE) - do_blocking_move_to_z(current_position.z + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + do_blocking_move_to_z(current_position[Z_AXIS] + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); else if (raise_after == PROBE_PT_STOW) - if (stow()) measured_z = NAN; // Error on stow? + if (STOW_PROBE()) measured_z = NAN; + } - if (verbose_level > 2) - SERIAL_ECHOLNPAIR("Bed X: ", LOGICAL_X_POSITION(rx), " Y: ", LOGICAL_Y_POSITION(ry), " Z: ", measured_z); + if (verbose_level > 2) { + SERIAL_PROTOCOLPGM("Bed X: "); + SERIAL_PROTOCOL_F(LOGICAL_X_POSITION(rx), 3); + SERIAL_PROTOCOLPGM(" Y: "); + SERIAL_PROTOCOL_F(LOGICAL_Y_POSITION(ry), 3); + SERIAL_PROTOCOLPGM(" Z: "); + SERIAL_PROTOCOL_F(measured_z, 3); + SERIAL_EOL(); } feedrate_mm_s = old_feedrate_mm_s; if (isnan(measured_z)) { - stow(); - LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); - #if DISABLED(G29_RETRY_AND_RECOVER) - SERIAL_ERROR_MSG(STR_ERR_PROBING_FAILED); - #endif + LCD_MESSAGEPGM(MSG_ERR_PROBING_FAILED); + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_ERR_PROBING_FAILED); } + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< probe_pt"); + #endif + return measured_z; } #if HAS_Z_SERVO_PROBE - void Probe::servo_probe_init() { + void servo_probe_init() { /** * Set position of Z Servo Endstop * @@ -729,6 +746,7 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise * when starting up the machine or rebooting the board. * There's no way to know where the nozzle is positioned until * homing has been done - no homing with z-probe without init! + * */ STOW_Z_SERVO(); } diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index f0f56ec191..f81482dcec 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,210 +16,62 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** - * module/probe.h - Move, deploy, enable, etc. + * probe.h - Move, deploy, enable, etc. */ +#ifndef PROBE_H +#define PROBE_H + #include "../inc/MarlinConfig.h" -#include "motion.h" - #if HAS_BED_PROBE - enum ProbePtRaise : uint8_t { - PROBE_PT_NONE, // No raise or stow after run_z_probe - PROBE_PT_STOW, // Do a complete stow after run_z_probe - PROBE_PT_RAISE, // Raise to "between" clearance after run_z_probe + extern float zprobe_zoffset; + bool set_probe_deployed(const bool deploy); + #ifdef Z_AFTER_PROBING + void move_z_after_probing(); + #endif + enum ProbePtRaise : unsigned char { + PROBE_PT_NONE, // No raise or stow after run_z_probe + PROBE_PT_STOW, // Do a complete stow after run_z_probe + PROBE_PT_RAISE, // Raise to "between" clearance after run_z_probe PROBE_PT_BIG_RAISE // Raise to big clearance after run_z_probe }; + float probe_pt(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true); + #define DEPLOY_PROBE() set_probe_deployed(true) + #define STOW_PROBE() set_probe_deployed(false) + #if HAS_HEATED_BED && ENABLED(WAIT_FOR_BED_HEATER) + extern const char msg_wait_for_bed_heating[25]; + #endif +#else + #define DEPLOY_PROBE() + #define STOW_PROBE() #endif -class Probe { -public: +#if HAS_Z_SERVO_PROBE + void servo_probe_init(); +#endif - #if HAS_BED_PROBE +#if QUIET_PROBING + void probing_pause(const bool p); +#endif - static xyz_pos_t offset; +#if ENABLED(PROBING_FANS_OFF) + void fans_pause(const bool p); +#endif - static bool set_deployed(const bool deploy); - - #if IS_KINEMATIC - - #if HAS_PROBE_XY_OFFSET - // Return true if the both nozzle and the probe can reach the given point. - // Note: This won't work on SCARA since the probe offset rotates with the arm. - static inline bool can_reach(const float &rx, const float &ry) { - return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) // The nozzle can go where it needs to go? - && position_is_reachable(rx, ry, ABS(PROBING_MARGIN)); // Can the nozzle also go near there? - } - #else - FORCE_INLINE static bool can_reach(const float &rx, const float &ry) { - return position_is_reachable(rx, ry, PROBING_MARGIN); - } - #endif - - #else - - /** - * Return whether the given position is within the bed, and whether the nozzle - * can reach the position required to put the probe at the given position. - * - * Example: For a probe offset of -10,+10, then for the probe to reach 0,0 the - * nozzle must be be able to reach +10,-10. - */ - static inline bool can_reach(const float &rx, const float &ry) { - return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) - && WITHIN(rx, min_x() - fslop, max_x() + fslop) - && WITHIN(ry, min_y() - fslop, max_y() + fslop); - } - - #endif - - static inline void move_z_after_probing() { - #ifdef Z_AFTER_PROBING - do_z_clearance(Z_AFTER_PROBING, true, true, true); // Move down still permitted - #endif - } - static float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); - static inline float probe_at_point(const xy_pos_t &pos, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true) { - return probe_at_point(pos.x, pos.y, raise_after, verbose_level, probe_relative, sanity_check); - } - - #else - - static constexpr xyz_pos_t offset = xyz_pos_t({ 0, 0, 0 }); // See #16767 - - static bool set_deployed(const bool) { return false; } - - FORCE_INLINE static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } - - #endif - - static inline void move_z_after_homing() { - #ifdef Z_AFTER_HOMING - do_z_clearance(Z_AFTER_HOMING, true, true, true); - #elif BOTH(Z_AFTER_PROBING,HAS_BED_PROBE) - move_z_after_probing(); - #endif +#if ENABLED(BLTOUCH) + void bltouch_command(int angle); + bool set_bltouch_deployed(const bool deploy); + FORCE_INLINE void bltouch_init() { + // Make sure any BLTouch error condition is cleared + bltouch_command(BLTOUCH_RESET); + set_bltouch_deployed(false); } +#endif - FORCE_INLINE static bool can_reach(const xy_pos_t &pos) { return can_reach(pos.x, pos.y); } - - FORCE_INLINE static bool good_bounds(const xy_pos_t &lf, const xy_pos_t &rb) { - return ( - #if IS_KINEMATIC - can_reach(lf.x, 0) && can_reach(rb.x, 0) && can_reach(0, lf.y) && can_reach(0, rb.y) - #else - can_reach(lf) && can_reach(rb) - #endif - ); - } - - // Use offset_xy for read only access - // More optimal the XY offset is known to always be zero. - #if HAS_PROBE_XY_OFFSET - static const xyz_pos_t &offset_xy; - #else - static constexpr xy_pos_t offset_xy = xy_pos_t({ 0, 0 }); // See #16767 - #endif - - static inline bool deploy() { return set_deployed(true); } - static inline bool stow() { return set_deployed(false); } - - #if HAS_BED_PROBE || HAS_LEVELING - #if IS_KINEMATIC - static constexpr float printable_radius = ( - #if ENABLED(DELTA) - DELTA_PRINTABLE_RADIUS - #elif IS_SCARA - SCARA_PRINTABLE_RADIUS - #endif - ); - - static inline float probe_radius() { - return printable_radius - _MAX(PROBING_MARGIN, HYPOT(offset_xy.x, offset_xy.y)); - } - #endif - - static inline float min_x() { - return ( - #if IS_KINEMATIC - (X_CENTER) - probe_radius() - #else - _MAX((X_MIN_BED) + (PROBING_MARGIN_LEFT), (X_MIN_POS) + offset_xy.x) - #endif - ); - } - static inline float max_x() { - return ( - #if IS_KINEMATIC - (X_CENTER) + probe_radius() - #else - _MIN((X_MAX_BED) - (PROBING_MARGIN_RIGHT), (X_MAX_POS) + offset_xy.x) - #endif - ); - } - static inline float min_y() { - return ( - #if IS_KINEMATIC - (Y_CENTER) - probe_radius() - #else - _MAX((Y_MIN_BED) + (PROBING_MARGIN_FRONT), (Y_MIN_POS) + offset_xy.y) - #endif - ); - } - static inline float max_y() { - return ( - #if IS_KINEMATIC - (Y_CENTER) + probe_radius() - #else - _MIN((Y_MAX_BED) - (PROBING_MARGIN_BACK), (Y_MAX_POS) + offset_xy.y) - #endif - ); - } - - #if NEEDS_THREE_PROBE_POINTS - // Retrieve three points to probe the bed. Any type exposing set(X,Y) may be used. - template - static inline void get_three_points(T points[3]) { - #if HAS_FIXED_3POINT - points[0].set(PROBE_PT_1_X, PROBE_PT_1_Y); - points[1].set(PROBE_PT_2_X, PROBE_PT_2_Y); - points[2].set(PROBE_PT_3_X, PROBE_PT_3_Y); - #else - #if IS_KINEMATIC - constexpr float SIN0 = 0.0, SIN120 = 0.866025, SIN240 = -0.866025, - COS0 = 1.0, COS120 = -0.5 , COS240 = -0.5; - points[0].set((X_CENTER) + probe_radius() * COS0, (Y_CENTER) + probe_radius() * SIN0); - points[1].set((X_CENTER) + probe_radius() * COS120, (Y_CENTER) + probe_radius() * SIN120); - points[2].set((X_CENTER) + probe_radius() * COS240, (Y_CENTER) + probe_radius() * SIN240); - #else - points[0].set(min_x(), min_y()); - points[1].set(max_x(), min_y()); - points[2].set((min_x() + max_x()) / 2, max_y()); - #endif - #endif - } - #endif - - #endif // HAS_BED_PROBE - - #if HAS_Z_SERVO_PROBE - static void servo_probe_init(); - #endif - - #if QUIET_PROBING - static void set_probing_paused(const bool p); - #endif - -private: - static bool probe_down_to_z(const float z, const feedRate_t fr_mm_s); - static void do_z_raise(const float z_raise); - static float run_z_probe(const bool sanity_check=true); -}; - -extern Probe probe; +#endif // PROBE_H diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index e4b2f0b75c..222bf9cbe4 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -36,38 +36,41 @@ float delta_segments_per_second = SCARA_SEGMENTS_PER_SECOND; void scara_set_axis_is_at_home(const AxisEnum axis) { if (axis == Z_AXIS) - current_position.z = Z_HOME_POS; + current_position[Z_AXIS] = Z_HOME_POS; else { /** * SCARA homes XY at the same time */ - xyz_pos_t homeposition; + float homeposition[XYZ]; LOOP_XYZ(i) homeposition[i] = base_home_pos((AxisEnum)i); - #if ENABLED(MORGAN_SCARA) - // MORGAN_SCARA uses arm angles for AB home position - // SERIAL_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); - inverse_kinematics(homeposition); - forward_kinematics_SCARA(delta.a, delta.b); - current_position[axis] = cartes[axis]; - #else - // MP_SCARA uses a Cartesian XY home position - // SERIAL_ECHOPGM("homeposition"); - // SERIAL_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); - current_position[axis] = homeposition[axis]; - #endif + // SERIAL_ECHOPAIR("homeposition X:", homeposition[X_AXIS]); + // SERIAL_ECHOLNPAIR(" Y:", homeposition[Y_AXIS]); - // SERIAL_ECHOPGM("Cartesian"); - // SERIAL_ECHOLNPAIR_P(SP_X_LBL, current_position.x, SP_Y_LBL, current_position.y); - update_software_endstops(axis); + /** + * Get Home position SCARA arm angles using inverse kinematics, + * and calculate homing offset using forward kinematics + */ + inverse_kinematics(homeposition); + forward_kinematics_SCARA(delta[A_AXIS], delta[B_AXIS]); + + // SERIAL_ECHOPAIR("Cartesian X:", cartes[X_AXIS]); + // SERIAL_ECHOLNPAIR(" Y:", cartes[Y_AXIS]); + + current_position[axis] = cartes[axis]; + + /** + * SCARA home positions are based on configuration since the actual + * limits are determined by the inverse kinematic transform. + */ + soft_endstop_min[axis] = base_min_pos(axis); // + (cartes[axis] - base_home_pos(axis)); + soft_endstop_max[axis] = base_max_pos(axis); // + (cartes[axis] - base_home_pos(axis)); } } -static constexpr xy_pos_t scara_offset = { SCARA_OFFSET_X, SCARA_OFFSET_Y }; - /** - * Morgan SCARA Forward Kinematics. Results in 'cartes'. + * Morgan SCARA Forward Kinematics. Results in cartes[]. * Maths and first version by QHARLEY. * Integrated into Marlin and slightly restructured by Joachim Cerny. */ @@ -78,86 +81,74 @@ void forward_kinematics_SCARA(const float &a, const float &b) { b_sin = sin(RADIANS(b)) * L2, b_cos = cos(RADIANS(b)) * L2; - cartes.set(a_cos + b_cos + scara_offset.x, // theta - a_sin + b_sin + scara_offset.y); // theta+phi + cartes[X_AXIS] = a_cos + b_cos + SCARA_OFFSET_X; //theta + cartes[Y_AXIS] = a_sin + b_sin + SCARA_OFFSET_Y; //theta+phi /* - SERIAL_ECHOLNPAIR( - "SCARA FK Angle a=", a, - " b=", b, - " a_sin=", a_sin, - " a_cos=", a_cos, - " b_sin=", b_sin, - " b_cos=", b_cos - ); - SERIAL_ECHOLNPAIR(" cartes (X,Y) = "(cartes.x, ", ", cartes.y, ")"); + SERIAL_ECHOPAIR("SCARA FK Angle a=", a); + SERIAL_ECHOPAIR(" b=", b); + SERIAL_ECHOPAIR(" a_sin=", a_sin); + SERIAL_ECHOPAIR(" a_cos=", a_cos); + SERIAL_ECHOPAIR(" b_sin=", b_sin); + SERIAL_ECHOLNPAIR(" b_cos=", b_cos); + SERIAL_ECHOPAIR(" cartes[X_AXIS]=", cartes[X_AXIS]); + SERIAL_ECHOLNPAIR(" cartes[Y_AXIS]=", cartes[Y_AXIS]); //*/ } -void inverse_kinematics(const xyz_pos_t &raw) { +/** + * Morgan SCARA Inverse Kinematics. Results in delta[]. + * + * See http://forums.reprap.org/read.php?185,283327 + * + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ +void inverse_kinematics(const float raw[XYZ]) { - #if ENABLED(MORGAN_SCARA) - /** - * Morgan SCARA Inverse Kinematics. Results in 'delta'. - * - * See https://reprap.org/forum/read.php?185,283327 - * - * Maths and first version by QHARLEY. - * Integrated into Marlin and slightly restructured by Joachim Cerny. - */ - float C2, S2, SK1, SK2, THETA, PSI; + static float C2, S2, SK1, SK2, THETA, PSI; - // Translate SCARA to standard XY with scaling factor - const xy_pos_t spos = raw - scara_offset; + float sx = raw[X_AXIS] - SCARA_OFFSET_X, // Translate SCARA to standard X Y + sy = raw[Y_AXIS] - SCARA_OFFSET_Y; // With scaling factor. - const float H2 = HYPOT2(spos.x, spos.y); - if (L1 == L2) - C2 = H2 / L1_2_2 - 1; - else - C2 = (H2 - (L1_2 + L2_2)) / (2.0f * L1 * L2); + if (L1 == L2) + C2 = HYPOT2(sx, sy) / L1_2_2 - 1; + else + C2 = (HYPOT2(sx, sy) - (L1_2 + L2_2)) / (2.0 * L1 * L2); - S2 = SQRT(1.0f - sq(C2)); + S2 = SQRT(1 - sq(C2)); - // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End - SK1 = L1 + L2 * C2; + // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End + SK1 = L1 + L2 * C2; - // Rotated Arm2 gives the distance from Arm1 to Arm2 - SK2 = L2 * S2; + // Rotated Arm2 gives the distance from Arm1 to Arm2 + SK2 = L2 * S2; - // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow - THETA = ATAN2(SK1, SK2) - ATAN2(spos.x, spos.y); + // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow + THETA = ATAN2(SK1, SK2) - ATAN2(sx, sy); - // Angle of Arm2 - PSI = ATAN2(S2, C2); + // Angle of Arm2 + PSI = ATAN2(S2, C2); - delta.set(DEGREES(THETA), DEGREES(THETA + PSI), raw.z); + delta[A_AXIS] = DEGREES(THETA); // theta is support arm angle + delta[B_AXIS] = DEGREES(THETA + PSI); // equal to sub arm angle (inverted motor) + delta[C_AXIS] = raw[Z_AXIS]; - /* - DEBUG_POS("SCARA IK", raw); - DEBUG_POS("SCARA IK", delta); - SERIAL_ECHOLNPAIR(" SCARA (x,y) ", sx, ",", sy, " C2=", C2, " S2=", S2, " Theta=", THETA, " Phi=", PHI); - //*/ - - #else // MP_SCARA - - const float x = raw.x, y = raw.y, c = HYPOT(x, y), - THETA3 = ATAN2(y, x), - THETA1 = THETA3 + ACOS((sq(c) + sq(L1) - sq(L2)) / (2.0f * c * L1)), - THETA2 = THETA3 - ACOS((sq(c) + sq(L2) - sq(L1)) / (2.0f * c * L2)); - - delta.set(DEGREES(THETA1), DEGREES(THETA2), raw.z); - - /* - DEBUG_POS("SCARA IK", raw); - DEBUG_POS("SCARA IK", delta); - SERIAL_ECHOLNPAIR(" SCARA (x,y) ", x, ",", y," Theta1=", THETA1, " Theta2=", THETA2); - //*/ - - #endif // MP_SCARA + /* + DEBUG_POS("SCARA IK", raw); + DEBUG_POS("SCARA IK", delta); + SERIAL_ECHOPAIR(" SCARA (x,y) ", sx); + SERIAL_ECHOPAIR(",", sy); + SERIAL_ECHOPAIR(" C2=", C2); + SERIAL_ECHOPAIR(" S2=", S2); + SERIAL_ECHOPAIR(" Theta=", THETA); + SERIAL_ECHOLNPAIR(" Phi=", PHI); + //*/ } void scara_report_positions() { - SERIAL_ECHOLNPAIR("SCARA Theta:", planner.get_axis_position_degrees(A_AXIS), " Psi+Theta:", planner.get_axis_position_degrees(B_AXIS)); + SERIAL_PROTOCOLPAIR("SCARA Theta:", planner.get_axis_position_degrees(A_AXIS)); + SERIAL_PROTOCOLLNPAIR(" Psi+Theta:", planner.get_axis_position_degrees(B_AXIS)); SERIAL_EOL(); } diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index e2acaf3082..501c46dc28 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,15 +16,17 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * scara.h - SCARA-specific functions */ +#ifndef __SCARA_H__ +#define __SCARA_H__ + #include "../core/macros.h" extern float delta_segments_per_second; @@ -36,7 +38,9 @@ float constexpr L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, void scara_set_axis_is_at_home(const AxisEnum axis); -void inverse_kinematics(const xyz_pos_t &raw); +void inverse_kinematics(const float raw[XYZ]); void forward_kinematics_SCARA(const float &a, const float &b); void scara_report_positions(); + +#endif // __SCARA_H__ diff --git a/Marlin/src/module/servo.cpp b/Marlin/src/module/servo.cpp index 27e5a2af2e..fbb3e6a764 100644 --- a/Marlin/src/module/servo.cpp +++ b/Marlin/src/module/servo.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -31,8 +31,7 @@ #include "servo.h" HAL_SERVO_LIB servo[NUM_SERVOS]; - -TERN_(EDITABLE_SERVO_ANGLES, uint16_t servo_angles[NUM_SERVOS][2]); +uint16_t servo_angles[NUM_SERVOS][2]; void servo_init() { #if NUM_SERVOS >= 1 && HAS_SERVO_0 diff --git a/Marlin/src/module/servo.h b/Marlin/src/module/servo.h index 29bd3b8798..bd7e2acf5c 100644 --- a/Marlin/src/module/servo.h +++ b/Marlin/src/module/servo.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,100 +16,30 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * module/servo.h */ -#include "../inc/MarlinConfig.h" +#ifndef _SERVO_H_ +#define _SERVO_H_ + #include "../HAL/shared/servo.h" -#if HAS_SERVO_ANGLES - - #if ENABLED(SWITCHING_EXTRUDER) - // Switching extruder can have 2 or 4 angles - #if EXTRUDERS > 3 - #define REQ_ANGLES 4 - #else - #define REQ_ANGLES 2 - #endif - constexpr uint16_t sase[] = SWITCHING_EXTRUDER_SERVO_ANGLES; - static_assert(COUNT(sase) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles."); - #else - constexpr uint16_t sase[4] = { 0 }; - #endif - - #if ENABLED(SWITCHING_NOZZLE) - constexpr uint16_t sasn[] = SWITCHING_NOZZLE_SERVO_ANGLES; - static_assert(COUNT(sasn) == 2, "SWITCHING_NOZZLE_SERVO_ANGLES needs 2 angles."); - #else - constexpr uint16_t sasn[2] = { 0 }; - #endif - - #ifdef Z_PROBE_SERVO_NR - #if ENABLED(BLTOUCH) - #include "../feature/bltouch.h" - #undef Z_SERVO_ANGLES - #define Z_SERVO_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW } - #endif - constexpr uint16_t sazp[] = Z_SERVO_ANGLES; - static_assert(COUNT(sazp) == 2, "Z_SERVO_ANGLES needs 2 angles."); - #else - constexpr uint16_t sazp[2] = { 0 }; - #endif - - #ifndef SWITCHING_EXTRUDER_SERVO_NR - #define SWITCHING_EXTRUDER_SERVO_NR -1 - #endif - #ifndef SWITCHING_EXTRUDER_E23_SERVO_NR - #define SWITCHING_EXTRUDER_E23_SERVO_NR -1 - #endif - #ifndef SWITCHING_NOZZLE_SERVO_NR - #define SWITCHING_NOZZLE_SERVO_NR -1 - #endif - #ifndef Z_PROBE_SERVO_NR - #define Z_PROBE_SERVO_NR -1 - #endif - - #define ASRC(N,I) ( \ - N == SWITCHING_EXTRUDER_SERVO_NR ? sase[I] \ - : N == SWITCHING_EXTRUDER_E23_SERVO_NR ? sase[I+2] \ - : N == SWITCHING_NOZZLE_SERVO_NR ? sasn[I] \ - : N == Z_PROBE_SERVO_NR ? sazp[I] \ - : 0 ) - - #if ENABLED(EDITABLE_SERVO_ANGLES) - extern uint16_t servo_angles[NUM_SERVOS][2]; - #define CONST_SERVO_ANGLES base_servo_angles - #else - #define CONST_SERVO_ANGLES servo_angles - #endif - - constexpr uint16_t CONST_SERVO_ANGLES [NUM_SERVOS][2] = { - { ASRC(0,0), ASRC(0,1) } - #if NUM_SERVOS > 1 - , { ASRC(1,0), ASRC(1,1) } - #if NUM_SERVOS > 2 - , { ASRC(2,0), ASRC(2,1) } - #if NUM_SERVOS > 3 - , { ASRC(3,0), ASRC(3,1) } - #endif - #endif - #endif - }; - - #if HAS_Z_SERVO_PROBE - #define DEPLOY_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][0]) - #define STOW_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][1]) - #endif - -#endif // HAS_SERVO_ANGLES +extern HAL_SERVO_LIB servo[NUM_SERVOS]; +extern uint16_t servo_angles[NUM_SERVOS][2]; +extern void servo_init(); #define MOVE_SERVO(I, P) servo[I].move(P) -extern HAL_SERVO_LIB servo[NUM_SERVOS]; -extern void servo_init(); +#include "../inc/MarlinConfig.h" + +#if HAS_Z_SERVO_PROBE + #define DEPLOY_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][0]) + #define STOW_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][1]) +#endif + +#endif // _SERVO_H_ diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp deleted file mode 100644 index 33e5c351ab..0000000000 --- a/Marlin/src/module/settings.cpp +++ /dev/null @@ -1,3785 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * settings.cpp - * - * Settings and EEPROM storage - * - * IMPORTANT: Whenever there are changes made to the variables stored in EEPROM - * in the functions below, also increment the version number. This makes sure that - * the default values are used whenever there is a change to the data, to prevent - * wrong data being written to the variables. - * - * ALSO: Variables in the Store and Retrieve sections must be in the same order. - * If a feature is disabled, some data must still be written that, when read, - * either sets a Sane Default, or results in No Change to the existing value. - */ - -// Change EEPROM version if the structure changes -#define EEPROM_VERSION "V82" -#define EEPROM_OFFSET 100 - -// Check the integrity of data offsets. -// Can be disabled for production build. -//#define DEBUG_EEPROM_READWRITE - -#include "settings.h" - -#include "endstops.h" -#include "planner.h" -#include "stepper.h" -#include "temperature.h" - -#if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/e3v2/dwin.h" -#endif - -#include "../lcd/ultralcd.h" -#include "../libs/vector_3.h" // for matrix_3x3 -#include "../gcode/gcode.h" -#include "../MarlinCore.h" - -#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) - #include "../HAL/shared/eeprom_api.h" -#endif - -#include "probe.h" - -#if HAS_LEVELING - #include "../feature/bedlevel/bedlevel.h" -#endif - -#if ENABLED(Z_STEPPER_AUTO_ALIGN) - #include "../feature/z_stepper_align.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif - -#if HAS_SERVOS - #include "servo.h" -#endif - -#if HAS_SERVOS && HAS_SERVO_ANGLES - #define EEPROM_NUM_SERVOS NUM_SERVOS -#else - #define EEPROM_NUM_SERVOS NUM_SERVO_PLUGS -#endif - -#include "../feature/fwretract.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../feature/powerloss.h" -#endif - -#if HAS_POWER_MONITOR - #include "../feature/power_monitor.h" -#endif - -#include "../feature/pause.h" - -#if ENABLED(BACKLASH_COMPENSATION) - #include "../feature/backlash.h" -#endif - -#if HAS_FILAMENT_SENSOR - #include "../feature/runout.h" - #ifndef FIL_RUNOUT_ENABLED_DEFAULT - #define FIL_RUNOUT_ENABLED_DEFAULT true - #endif -#endif - -#if ENABLED(EXTRA_LIN_ADVANCE_K) - extern float other_extruder_advance_K[EXTRUDERS]; -#endif - -#if HAS_MULTI_EXTRUDER - #include "tool_change.h" - void M217_report(const bool eeprom); -#endif - -#if ENABLED(BLTOUCH) - #include "../feature/bltouch.h" -#endif - -#if HAS_TRINAMIC_CONFIG - #include "stepper/indirection.h" - #include "../feature/tmc_util.h" -#endif - -#if ENABLED(PROBE_TEMP_COMPENSATION) - #include "../feature/probe_temp_comp.h" -#endif - -#include "../feature/controllerfan.h" -#if ENABLED(CONTROLLER_FAN_EDITABLE) - void M710_report(const bool forReplay); -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - #include "../feature/caselight.h" - #define HAS_CASE_LIGHT_BRIGHTNESS 1 -#endif - -#if ENABLED(PASSWORD_FEATURE) - #include "../feature/password/password.h" -#endif - -#if ENABLED(TOUCH_SCREEN_CALIBRATION) - #include "../lcd/tft/touch.h" -#endif - -#pragma pack(push, 1) // No padding between variables - -typedef struct { uint16_t X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_stepper_current_t; -typedef struct { uint32_t X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_hybrid_threshold_t; -typedef struct { int16_t X, Y, Z, X2, Y2, Z2, Z3, Z4; } tmc_sgt_t; -typedef struct { bool X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_stealth_enabled_t; - -// Limit an index to an array size -#define ALIM(I,ARR) _MIN(I, (signed)COUNT(ARR) - 1) - -// Defaults for reset / fill in on load -static const uint32_t _DMA[] PROGMEM = DEFAULT_MAX_ACCELERATION; -static const float _DASU[] PROGMEM = DEFAULT_AXIS_STEPS_PER_UNIT; -static const feedRate_t _DMF[] PROGMEM = DEFAULT_MAX_FEEDRATE; - -extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[], SP_E_STR[]; - -/** - * Current EEPROM Layout - * - * Keep this data structure up to date so - * EEPROM size is known at compile time! - */ -typedef struct SettingsDataStruct { - char version[4]; // Vnn\0 - uint16_t crc; // Data Checksum - - // - // DISTINCT_E_FACTORS - // - uint8_t esteppers; // XYZE_N - XYZ - - planner_settings_t planner_settings; - - xyze_float_t planner_max_jerk; // M205 XYZE planner.max_jerk - float planner_junction_deviation_mm; // M205 J planner.junction_deviation_mm - - xyz_pos_t home_offset; // M206 XYZ / M665 TPZ - - #if HAS_HOTEND_OFFSET - xyz_pos_t hotend_offset[HOTENDS - 1]; // M218 XYZ - #endif - - // - // FILAMENT_RUNOUT_SENSOR - // - bool runout_sensor_enabled; // M412 S - float runout_distance_mm; // M412 D - - // - // ENABLE_LEVELING_FADE_HEIGHT - // - float planner_z_fade_height; // M420 Zn planner.z_fade_height - - // - // MESH_BED_LEVELING - // - float mbl_z_offset; // mbl.z_offset - uint8_t mesh_num_x, mesh_num_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y - float mbl_z_values[TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_X, 3)] // mbl.z_values - [TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_Y, 3)]; - - // - // HAS_BED_PROBE - // - - xyz_pos_t probe_offset; - - // - // ABL_PLANAR - // - matrix_3x3 planner_bed_level_matrix; // planner.bed_level_matrix - - // - // AUTO_BED_LEVELING_BILINEAR - // - uint8_t grid_max_x, grid_max_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y - xy_pos_t bilinear_grid_spacing, bilinear_start; // G29 L F - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - bed_mesh_t z_values; // G29 - #else - float z_values[3][3]; - #endif - - // - // AUTO_BED_LEVELING_UBL - // - bool planner_leveling_active; // M420 S planner.leveling_active - int8_t ubl_storage_slot; // ubl.storage_slot - - // - // SERVO_ANGLES - // - uint16_t servo_angles[EEPROM_NUM_SERVOS][2]; // M281 P L U - - // - // Temperature first layer compensation values - // - #if ENABLED(PROBE_TEMP_COMPENSATION) - int16_t z_offsets_probe[COUNT(temp_comp.z_offsets_probe)], // M871 P I V - z_offsets_bed[COUNT(temp_comp.z_offsets_bed)] // M871 B I V - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - , z_offsets_ext[COUNT(temp_comp.z_offsets_ext)] // M871 E I V - #endif - ; - #endif - - // - // BLTOUCH - // - bool bltouch_last_written_mode; - - // - // DELTA / [XYZ]_DUAL_ENDSTOPS - // - #if ENABLED(DELTA) - float delta_height; // M666 H - abc_float_t delta_endstop_adj; // M666 X Y Z - float delta_radius, // M665 R - delta_diagonal_rod, // M665 L - delta_segments_per_second; // M665 S - abc_float_t delta_tower_angle_trim, // M665 X Y Z - delta_diagonal_rod_trim; // M665 A B C - #elif HAS_EXTRA_ENDSTOPS - float x2_endstop_adj, // M666 X - y2_endstop_adj, // M666 Y - z2_endstop_adj, // M666 (S2) Z - z3_endstop_adj, // M666 (S3) Z - z4_endstop_adj; // M666 (S4) Z - #endif - - // - // Z_STEPPER_AUTO_ALIGN, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS - // - #if ENABLED(Z_STEPPER_AUTO_ALIGN) - xy_pos_t z_stepper_align_xy[NUM_Z_STEPPER_DRIVERS]; // M422 S X Y - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - xy_pos_t z_stepper_align_stepper_xy[NUM_Z_STEPPER_DRIVERS]; // M422 W X Y - #endif - #endif - - // - // Material Presets - // - #if PREHEAT_COUNT - preheat_t ui_material_preset[PREHEAT_COUNT]; // M145 S0 H B F - #endif - - // - // PIDTEMP - // - PIDCF_t hotendPID[HOTENDS]; // M301 En PIDCF / M303 En U - int16_t lpq_len; // M301 L - - // - // PIDTEMPBED - // - PID_t bedPID; // M304 PID / M303 E-1 U - - // - // User-defined Thermistors - // - #if HAS_USER_THERMISTORS - user_thermistor_t user_thermistor[USER_THERMISTORS]; // M305 P0 R4700 T100000 B3950 - #endif - - // - // Power monitor - // - uint8_t power_monitor_flags; // M430 I V W - - // - // HAS_LCD_CONTRAST - // - int16_t lcd_contrast; // M250 C - - // - // Controller fan settings - // - controllerFan_settings_t controllerFan_settings; // M710 - - // - // POWER_LOSS_RECOVERY - // - bool recovery_enabled; // M413 S - - // - // FWRETRACT - // - fwretract_settings_t fwretract_settings; // M207 S F Z W, M208 S F W R - bool autoretract_enabled; // M209 S - - // - // !NO_VOLUMETRIC - // - bool parser_volumetric_enabled; // M200 S parser.volumetric_enabled - float planner_filament_size[EXTRUDERS]; // M200 T D planner.filament_size[] - float planner_volumetric_extruder_limit[EXTRUDERS]; // M200 T L planner.volumetric_extruder_limit[] - - // - // HAS_TRINAMIC_CONFIG - // - tmc_stepper_current_t tmc_stepper_current; // M906 X Y Z X2 Y2 Z2 Z3 Z4 E0 E1 E2 E3 E4 E5 - tmc_hybrid_threshold_t tmc_hybrid_threshold; // M913 X Y Z X2 Y2 Z2 Z3 Z4 E0 E1 E2 E3 E4 E5 - tmc_sgt_t tmc_sgt; // M914 X Y Z X2 Y2 Z2 Z3 Z4 - tmc_stealth_enabled_t tmc_stealth_enabled; // M569 X Y Z X2 Y2 Z2 Z3 Z4 E0 E1 E2 E3 E4 E5 - - // - // LIN_ADVANCE - // - float planner_extruder_advance_K[_MAX(EXTRUDERS, 1)]; // M900 K planner.extruder_advance_K - - // - // HAS_MOTOR_CURRENT_PWM - // - #ifndef MOTOR_CURRENT_COUNT - #define MOTOR_CURRENT_COUNT 3 - #endif - uint32_t motor_current_setting[MOTOR_CURRENT_COUNT]; // M907 X Z E - - // - // CNC_COORDINATE_SYSTEMS - // - xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; // G54-G59.3 - - // - // SKEW_CORRECTION - // - skew_factor_t planner_skew_factor; // M852 I J K planner.skew_factor - - // - // ADVANCED_PAUSE_FEATURE - // - #if EXTRUDERS - fil_change_settings_t fc_settings[EXTRUDERS]; // M603 T U L - #endif - - // - // Tool-change settings - // - #if HAS_MULTI_EXTRUDER - toolchange_settings_t toolchange_settings; // M217 S P R - #endif - - // - // BACKLASH_COMPENSATION - // - xyz_float_t backlash_distance_mm; // M425 X Y Z - uint8_t backlash_correction; // M425 F - float backlash_smoothing_mm; // M425 S - - // - // EXTENSIBLE_UI - // - #if ENABLED(EXTENSIBLE_UI) - // This is a significant hardware change; don't reserve space when not present - uint8_t extui_data[ExtUI::eeprom_data_size]; - #endif - - // - // HAS_CASE_LIGHT_BRIGHTNESS - // - #if HAS_CASE_LIGHT_BRIGHTNESS - uint8_t caselight_brightness; // M355 P - #endif - - // - // PASSWORD_FEATURE - // - #if ENABLED(PASSWORD_FEATURE) - bool password_is_set; - uint32_t password_value; - #endif - - // - // TOUCH_SCREEN_CALIBRATION - // - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - touch_calibration_t touch_calibration; - #endif - -} SettingsData; - -//static_assert(sizeof(SettingsData) <= MARLIN_EEPROM_SIZE, "EEPROM too small to contain SettingsData!"); - -MarlinSettings settings; - -uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); } - -/** - * Post-process after Retrieve or Reset - */ - -#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - float new_z_fade_height; -#endif - -void MarlinSettings::postprocess() { - xyze_pos_t oldpos = current_position; - - // steps per s2 needs to be updated to agree with units per s2 - planner.reset_acceleration_rates(); - - // Make sure delta kinematics are updated before refreshing the - // planner position so the stepper counts will be set correctly. - TERN_(DELTA, recalc_delta_settings()); - - TERN_(PIDTEMP, thermalManager.updatePID()); - - #if DISABLED(NO_VOLUMETRICS) - planner.calculate_volumetric_multipliers(); - #elif EXTRUDERS - for (uint8_t i = COUNT(planner.e_factor); i--;) - planner.refresh_e_factor(i); - #endif - - // Software endstops depend on home_offset - LOOP_XYZ(i) { - update_workspace_offset((AxisEnum)i); - update_software_endstops((AxisEnum)i); - } - - TERN_(ENABLE_LEVELING_FADE_HEIGHT, set_z_fade_height(new_z_fade_height, false)); // false = no report - - TERN_(AUTO_BED_LEVELING_BILINEAR, refresh_bed_level()); - - TERN_(HAS_MOTOR_CURRENT_PWM, stepper.refresh_motor_power()); - - TERN_(FWRETRACT, fwretract.refresh_autoretract()); - - TERN_(HAS_LINEAR_E_JERK, planner.recalculate_max_e_jerk()); - - TERN_(HAS_CASE_LIGHT_BRIGHTNESS, caselight.update_brightness()); - - // Refresh steps_to_mm with the reciprocal of axis_steps_per_mm - // and init stepper.count[], planner.position[] with current_position - planner.refresh_positioning(); - - // Various factors can change the current position - if (oldpos != current_position) - report_current_position(); -} - -#if BOTH(PRINTCOUNTER, EEPROM_SETTINGS) - #include "printcounter.h" - static_assert( - !WITHIN(STATS_EEPROM_ADDRESS, EEPROM_OFFSET, EEPROM_OFFSET + sizeof(SettingsData)) && - !WITHIN(STATS_EEPROM_ADDRESS + sizeof(printStatistics), EEPROM_OFFSET, EEPROM_OFFSET + sizeof(SettingsData)), - "STATS_EEPROM_ADDRESS collides with EEPROM settings storage." - ); -#endif - -#if ENABLED(SD_FIRMWARE_UPDATE) - - #if ENABLED(EEPROM_SETTINGS) - static_assert( - !WITHIN(SD_FIRMWARE_UPDATE_EEPROM_ADDR, EEPROM_OFFSET, EEPROM_OFFSET + sizeof(SettingsData)), - "SD_FIRMWARE_UPDATE_EEPROM_ADDR collides with EEPROM settings storage." - ); - #endif - - bool MarlinSettings::sd_update_status() { - uint8_t val; - persistentStore.read_data(SD_FIRMWARE_UPDATE_EEPROM_ADDR, &val); - return (val == SD_FIRMWARE_UPDATE_ACTIVE_VALUE); - } - - bool MarlinSettings::set_sd_update_status(const bool enable) { - if (enable != sd_update_status()) - persistentStore.write_data( - SD_FIRMWARE_UPDATE_EEPROM_ADDR, - enable ? SD_FIRMWARE_UPDATE_ACTIVE_VALUE : SD_FIRMWARE_UPDATE_INACTIVE_VALUE - ); - return true; - } - -#endif // SD_FIRMWARE_UPDATE - -#ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE - static_assert( - EEPROM_OFFSET + sizeof(SettingsData) < ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE, - "ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE is insufficient to capture all EEPROM data." - ); -#endif - -#define DEBUG_OUT ENABLED(EEPROM_CHITCHAT) -#include "../core/debug_out.h" - -#if ENABLED(EEPROM_SETTINGS) - - #define EEPROM_START() if (!persistentStore.access_start()) { SERIAL_ECHO_MSG("No EEPROM."); return false; } \ - int eeprom_index = EEPROM_OFFSET - #define EEPROM_FINISH() persistentStore.access_finish() - #define EEPROM_SKIP(VAR) (eeprom_index += sizeof(VAR)) - #define EEPROM_WRITE(VAR) do{ persistentStore.write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0) - #define EEPROM_READ(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, !validating); }while(0) - #define EEPROM_READ_ALWAYS(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0) - #define EEPROM_ASSERT(TST,ERR) do{ if (!(TST)) { SERIAL_ERROR_MSG(ERR); eeprom_error = true; } }while(0) - - #if ENABLED(DEBUG_EEPROM_READWRITE) - #define _FIELD_TEST(FIELD) \ - EEPROM_ASSERT( \ - eeprom_error || eeprom_index == offsetof(SettingsData, FIELD) + EEPROM_OFFSET, \ - "Field " STRINGIFY(FIELD) " mismatch." \ - ) - #else - #define _FIELD_TEST(FIELD) NOOP - #endif - - const char version[4] = EEPROM_VERSION; - - bool MarlinSettings::eeprom_error, MarlinSettings::validating; - - bool MarlinSettings::size_error(const uint16_t size) { - if (size != datasize()) { - DEBUG_ERROR_MSG("EEPROM datasize error."); - return true; - } - return false; - } - - /** - * M500 - Store Configuration - */ - bool MarlinSettings::save() { - float dummyf = 0; - char ver[4] = "ERR"; - - uint16_t working_crc = 0; - - EEPROM_START(); - - eeprom_error = false; - - // Write or Skip version. (Flash doesn't allow rewrite without erase.) - TERN(FLASH_EEPROM_EMULATION, EEPROM_SKIP, EEPROM_WRITE)(ver); - - EEPROM_SKIP(working_crc); // Skip the checksum slot - - working_crc = 0; // clear before first "real data" - - _FIELD_TEST(esteppers); - - const uint8_t esteppers = COUNT(planner.settings.axis_steps_per_mm) - XYZ; - EEPROM_WRITE(esteppers); - - // - // Planner Motion - // - { - EEPROM_WRITE(planner.settings); - - #if HAS_CLASSIC_JERK - EEPROM_WRITE(planner.max_jerk); - #if HAS_LINEAR_E_JERK - dummyf = float(DEFAULT_EJERK); - EEPROM_WRITE(dummyf); - #endif - #else - const xyze_pos_t planner_max_jerk = { 10, 10, 0.4, float(DEFAULT_EJERK) }; - EEPROM_WRITE(planner_max_jerk); - #endif - - TERN_(CLASSIC_JERK, dummyf = 0.02f); - EEPROM_WRITE(TERN(CLASSIC_JERK, dummyf, planner.junction_deviation_mm)); - } - - // - // Home Offset - // - { - _FIELD_TEST(home_offset); - - #if HAS_SCARA_OFFSET - EEPROM_WRITE(scara_home_offset); - #else - #if !HAS_HOME_OFFSET - const xyz_pos_t home_offset{0}; - #endif - EEPROM_WRITE(home_offset); - #endif - } - - // - // Hotend Offsets, if any - // - { - #if HAS_HOTEND_OFFSET - // Skip hotend 0 which must be 0 - LOOP_S_L_N(e, 1, HOTENDS) - EEPROM_WRITE(hotend_offset[e]); - #endif - } - - // - // Filament Runout Sensor - // - { - #if HAS_FILAMENT_SENSOR - const bool &runout_sensor_enabled = runout.enabled; - #else - constexpr int8_t runout_sensor_enabled = -1; - #endif - _FIELD_TEST(runout_sensor_enabled); - EEPROM_WRITE(runout_sensor_enabled); - - #if HAS_FILAMENT_RUNOUT_DISTANCE - const float &runout_distance_mm = runout.runout_distance(); - #else - constexpr float runout_distance_mm = 0; - #endif - EEPROM_WRITE(runout_distance_mm); - } - - // - // Global Leveling - // - { - const float zfh = TERN(ENABLE_LEVELING_FADE_HEIGHT, planner.z_fade_height, 10.0f); - EEPROM_WRITE(zfh); - } - - // - // Mesh Bed Leveling - // - { - #if ENABLED(MESH_BED_LEVELING) - static_assert( - sizeof(mbl.z_values) == (GRID_MAX_POINTS) * sizeof(mbl.z_values[0][0]), - "MBL Z array is the wrong size." - ); - #else - dummyf = 0; - #endif - - const uint8_t mesh_num_x = TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_X, 3), - mesh_num_y = TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_Y, 3); - - EEPROM_WRITE(TERN(MESH_BED_LEVELING, mbl.z_offset, dummyf)); - EEPROM_WRITE(mesh_num_x); - EEPROM_WRITE(mesh_num_y); - - #if ENABLED(MESH_BED_LEVELING) - EEPROM_WRITE(mbl.z_values); - #else - for (uint8_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_WRITE(dummyf); - #endif - } - - // - // Probe XYZ Offsets - // - { - _FIELD_TEST(probe_offset); - #if HAS_BED_PROBE - const xyz_pos_t &zpo = probe.offset; - #else - constexpr xyz_pos_t zpo{0}; - #endif - EEPROM_WRITE(zpo); - } - - // - // Planar Bed Leveling matrix - // - { - #if ABL_PLANAR - EEPROM_WRITE(planner.bed_level_matrix); - #else - dummyf = 0; - for (uint8_t q = 9; q--;) EEPROM_WRITE(dummyf); - #endif - } - - // - // Bilinear Auto Bed Leveling - // - { - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - static_assert( - sizeof(z_values) == (GRID_MAX_POINTS) * sizeof(z_values[0][0]), - "Bilinear Z array is the wrong size." - ); - #else - const xy_pos_t bilinear_start{0}, bilinear_grid_spacing{0}; - #endif - - const uint8_t grid_max_x = TERN(AUTO_BED_LEVELING_BILINEAR, GRID_MAX_POINTS_X, 3), - grid_max_y = TERN(AUTO_BED_LEVELING_BILINEAR, GRID_MAX_POINTS_Y, 3); - EEPROM_WRITE(grid_max_x); - EEPROM_WRITE(grid_max_y); - EEPROM_WRITE(bilinear_grid_spacing); - EEPROM_WRITE(bilinear_start); - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - EEPROM_WRITE(z_values); // 9-256 floats - #else - dummyf = 0; - for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_WRITE(dummyf); - #endif - } - - // - // Unified Bed Leveling - // - { - _FIELD_TEST(planner_leveling_active); - const bool ubl_active = TERN(AUTO_BED_LEVELING_UBL, planner.leveling_active, false); - const int8_t storage_slot = TERN(AUTO_BED_LEVELING_UBL, ubl.storage_slot, -1); - EEPROM_WRITE(ubl_active); - EEPROM_WRITE(storage_slot); - } - - // - // Servo Angles - // - { - _FIELD_TEST(servo_angles); - #if !HAS_SERVO_ANGLES - uint16_t servo_angles[EEPROM_NUM_SERVOS][2] = { { 0, 0 } }; - #endif - EEPROM_WRITE(servo_angles); - } - - // - // Thermal first layer compensation values - // - #if ENABLED(PROBE_TEMP_COMPENSATION) - EEPROM_WRITE(temp_comp.z_offsets_probe); - EEPROM_WRITE(temp_comp.z_offsets_bed); - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - EEPROM_WRITE(temp_comp.z_offsets_ext); - #endif - #else - // No placeholder data for this feature - #endif - - // - // BLTOUCH - // - { - _FIELD_TEST(bltouch_last_written_mode); - const bool bltouch_last_written_mode = TERN(BLTOUCH, bltouch.last_written_mode, false); - EEPROM_WRITE(bltouch_last_written_mode); - } - - // - // DELTA Geometry or Dual Endstops offsets - // - { - #if ENABLED(DELTA) - - _FIELD_TEST(delta_height); - - EEPROM_WRITE(delta_height); // 1 float - EEPROM_WRITE(delta_endstop_adj); // 3 floats - EEPROM_WRITE(delta_radius); // 1 float - EEPROM_WRITE(delta_diagonal_rod); // 1 float - EEPROM_WRITE(delta_segments_per_second); // 1 float - EEPROM_WRITE(delta_tower_angle_trim); // 3 floats - EEPROM_WRITE(delta_diagonal_rod_trim); // 3 floats - - #elif HAS_EXTRA_ENDSTOPS - - _FIELD_TEST(x2_endstop_adj); - - // Write dual endstops in X, Y, Z order. Unused = 0.0 - dummyf = 0; - EEPROM_WRITE(TERN(X_DUAL_ENDSTOPS, endstops.x2_endstop_adj, dummyf)); // 1 float - EEPROM_WRITE(TERN(Y_DUAL_ENDSTOPS, endstops.y2_endstop_adj, dummyf)); // 1 float - EEPROM_WRITE(TERN(Z_MULTI_ENDSTOPS, endstops.z2_endstop_adj, dummyf)); // 1 float - - #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 - EEPROM_WRITE(endstops.z3_endstop_adj); // 1 float - #else - EEPROM_WRITE(dummyf); - #endif - - #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 - EEPROM_WRITE(endstops.z4_endstop_adj); // 1 float - #else - EEPROM_WRITE(dummyf); - #endif - - #endif - } - - #if ENABLED(Z_STEPPER_AUTO_ALIGN) - EEPROM_WRITE(z_stepper_align.xy); - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - EEPROM_WRITE(z_stepper_align.stepper_xy); - #endif - #endif - - // - // LCD Preheat settings - // - #if PREHEAT_COUNT - _FIELD_TEST(ui_material_preset); - EEPROM_WRITE(ui.material_preset); - #endif - - // - // PIDTEMP - // - { - _FIELD_TEST(hotendPID); - HOTEND_LOOP() { - PIDCF_t pidcf = { - #if DISABLED(PIDTEMP) - NAN, NAN, NAN, - NAN, NAN - #else - PID_PARAM(Kp, e), - unscalePID_i(PID_PARAM(Ki, e)), - unscalePID_d(PID_PARAM(Kd, e)), - PID_PARAM(Kc, e), - PID_PARAM(Kf, e) - #endif - }; - EEPROM_WRITE(pidcf); - } - - _FIELD_TEST(lpq_len); - #if DISABLED(PID_EXTRUSION_SCALING) - const int16_t lpq_len = 20; - #endif - EEPROM_WRITE(TERN(PID_EXTRUSION_SCALING, thermalManager.lpq_len, lpq_len)); - } - - // - // PIDTEMPBED - // - { - _FIELD_TEST(bedPID); - - const PID_t bed_pid = { - #if DISABLED(PIDTEMPBED) - NAN, NAN, NAN - #else - // Store the unscaled PID values - thermalManager.temp_bed.pid.Kp, - unscalePID_i(thermalManager.temp_bed.pid.Ki), - unscalePID_d(thermalManager.temp_bed.pid.Kd) - #endif - }; - EEPROM_WRITE(bed_pid); - } - - // - // User-defined Thermistors - // - #if HAS_USER_THERMISTORS - { - _FIELD_TEST(user_thermistor); - EEPROM_WRITE(thermalManager.user_thermistor); - } - #endif - - // - // Power monitor - // - { - #if HAS_POWER_MONITOR - const uint8_t &power_monitor_flags = power_monitor.flags; - #else - constexpr uint8_t power_monitor_flags = 0x00; - #endif - _FIELD_TEST(power_monitor_flags); - EEPROM_WRITE(power_monitor_flags); - } - - // - // LCD Contrast - // - { - _FIELD_TEST(lcd_contrast); - - const int16_t lcd_contrast = - #if HAS_LCD_CONTRAST - ui.contrast - #else - 127 - #endif - ; - EEPROM_WRITE(lcd_contrast); - } - - // - // Controller Fan - // - { - _FIELD_TEST(controllerFan_settings); - #if ENABLED(USE_CONTROLLER_FAN) - const controllerFan_settings_t &cfs = controllerFan.settings; - #else - controllerFan_settings_t cfs = controllerFan_defaults; - #endif - EEPROM_WRITE(cfs); - } - - // - // Power-Loss Recovery - // - { - _FIELD_TEST(recovery_enabled); - const bool recovery_enabled = TERN(POWER_LOSS_RECOVERY, recovery.enabled, ENABLED(PLR_ENABLED_DEFAULT)); - EEPROM_WRITE(recovery_enabled); - } - - // - // Firmware Retraction - // - { - _FIELD_TEST(fwretract_settings); - #if DISABLED(FWRETRACT) - const fwretract_settings_t autoretract_defaults = { 3, 45, 0, 0, 0, 13, 0, 8 }; - #endif - EEPROM_WRITE(TERN(FWRETRACT, fwretract.settings, autoretract_defaults)); - - #if DISABLED(FWRETRACT_AUTORETRACT) - const bool autoretract_enabled = false; - #endif - EEPROM_WRITE(TERN(FWRETRACT_AUTORETRACT, fwretract.autoretract_enabled, autoretract_enabled)); - } - - // - // Volumetric & Filament Size - // - { - _FIELD_TEST(parser_volumetric_enabled); - - #if DISABLED(NO_VOLUMETRICS) - - EEPROM_WRITE(parser.volumetric_enabled); - EEPROM_WRITE(planner.filament_size); - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - EEPROM_WRITE(planner.volumetric_extruder_limit); - #else - dummyf = DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT; - for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummyf); - #endif - - #else - - const bool volumetric_enabled = false; - EEPROM_WRITE(volumetric_enabled); - dummyf = DEFAULT_NOMINAL_FILAMENT_DIA; - for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummyf); - dummyf = DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT; - for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummyf); - - #endif - } - - // - // TMC Configuration - // - { - _FIELD_TEST(tmc_stepper_current); - - tmc_stepper_current_t tmc_stepper_current = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - - #if HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(X) - tmc_stepper_current.X = stepperX.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y) - tmc_stepper_current.Y = stepperY.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z) - tmc_stepper_current.Z = stepperZ.getMilliamps(); - #endif - #if AXIS_IS_TMC(X2) - tmc_stepper_current.X2 = stepperX2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y2) - tmc_stepper_current.Y2 = stepperY2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z2) - tmc_stepper_current.Z2 = stepperZ2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z3) - tmc_stepper_current.Z3 = stepperZ3.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z4) - tmc_stepper_current.Z4 = stepperZ4.getMilliamps(); - #endif - #if MAX_EXTRUDERS - #if AXIS_IS_TMC(E0) - tmc_stepper_current.E0 = stepperE0.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 1 - #if AXIS_IS_TMC(E1) - tmc_stepper_current.E1 = stepperE1.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 2 - #if AXIS_IS_TMC(E2) - tmc_stepper_current.E2 = stepperE2.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 3 - #if AXIS_IS_TMC(E3) - tmc_stepper_current.E3 = stepperE3.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 4 - #if AXIS_IS_TMC(E4) - tmc_stepper_current.E4 = stepperE4.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 5 - #if AXIS_IS_TMC(E5) - tmc_stepper_current.E5 = stepperE5.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 6 - #if AXIS_IS_TMC(E6) - tmc_stepper_current.E6 = stepperE6.getMilliamps(); - #endif - #if MAX_EXTRUDERS > 7 - #if AXIS_IS_TMC(E7) - tmc_stepper_current.E7 = stepperE7.getMilliamps(); - #endif - #endif // MAX_EXTRUDERS > 7 - #endif // MAX_EXTRUDERS > 6 - #endif // MAX_EXTRUDERS > 5 - #endif // MAX_EXTRUDERS > 4 - #endif // MAX_EXTRUDERS > 3 - #endif // MAX_EXTRUDERS > 2 - #endif // MAX_EXTRUDERS > 1 - #endif // MAX_EXTRUDERS - #endif - EEPROM_WRITE(tmc_stepper_current); - } - - // - // TMC Hybrid Threshold, and placeholder values - // - { - _FIELD_TEST(tmc_hybrid_threshold); - - #if ENABLED(HYBRID_THRESHOLD) - tmc_hybrid_threshold_t tmc_hybrid_threshold = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - #if AXIS_HAS_STEALTHCHOP(X) - tmc_hybrid_threshold.X = stepperX.get_pwm_thrs(); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - tmc_hybrid_threshold.Y = stepperY.get_pwm_thrs(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - tmc_hybrid_threshold.Z = stepperZ.get_pwm_thrs(); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - tmc_hybrid_threshold.X2 = stepperX2.get_pwm_thrs(); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - tmc_hybrid_threshold.Y2 = stepperY2.get_pwm_thrs(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - tmc_hybrid_threshold.Z2 = stepperZ2.get_pwm_thrs(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - tmc_hybrid_threshold.Z3 = stepperZ3.get_pwm_thrs(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - tmc_hybrid_threshold.Z4 = stepperZ4.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS - #if AXIS_HAS_STEALTHCHOP(E0) - tmc_hybrid_threshold.E0 = stepperE0.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 1 - #if AXIS_HAS_STEALTHCHOP(E1) - tmc_hybrid_threshold.E1 = stepperE1.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 2 - #if AXIS_HAS_STEALTHCHOP(E2) - tmc_hybrid_threshold.E2 = stepperE2.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 3 - #if AXIS_HAS_STEALTHCHOP(E3) - tmc_hybrid_threshold.E3 = stepperE3.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 4 - #if AXIS_HAS_STEALTHCHOP(E4) - tmc_hybrid_threshold.E4 = stepperE4.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 5 - #if AXIS_HAS_STEALTHCHOP(E5) - tmc_hybrid_threshold.E5 = stepperE5.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 6 - #if AXIS_HAS_STEALTHCHOP(E6) - tmc_hybrid_threshold.E6 = stepperE6.get_pwm_thrs(); - #endif - #if MAX_EXTRUDERS > 7 - #if AXIS_HAS_STEALTHCHOP(E7) - tmc_hybrid_threshold.E7 = stepperE7.get_pwm_thrs(); - #endif - #endif // MAX_EXTRUDERS > 7 - #endif // MAX_EXTRUDERS > 6 - #endif // MAX_EXTRUDERS > 5 - #endif // MAX_EXTRUDERS > 4 - #endif // MAX_EXTRUDERS > 3 - #endif // MAX_EXTRUDERS > 2 - #endif // MAX_EXTRUDERS > 1 - #endif // MAX_EXTRUDERS - #else - const tmc_hybrid_threshold_t tmc_hybrid_threshold = { - .X = 100, .Y = 100, .Z = 3, - .X2 = 100, .Y2 = 100, .Z2 = 3, .Z3 = 3, .Z4 = 3, - .E0 = 30, .E1 = 30, .E2 = 30, - .E3 = 30, .E4 = 30, .E5 = 30 - }; - #endif - EEPROM_WRITE(tmc_hybrid_threshold); - } - - // - // TMC StallGuard threshold - // - { - tmc_sgt_t tmc_sgt{0}; - #if USE_SENSORLESS - TERN_(X_SENSORLESS, tmc_sgt.X = stepperX.homing_threshold()); - TERN_(X2_SENSORLESS, tmc_sgt.X2 = stepperX2.homing_threshold()); - TERN_(Y_SENSORLESS, tmc_sgt.Y = stepperY.homing_threshold()); - TERN_(Y2_SENSORLESS, tmc_sgt.Y2 = stepperY2.homing_threshold()); - TERN_(Z_SENSORLESS, tmc_sgt.Z = stepperZ.homing_threshold()); - TERN_(Z2_SENSORLESS, tmc_sgt.Z2 = stepperZ2.homing_threshold()); - TERN_(Z3_SENSORLESS, tmc_sgt.Z3 = stepperZ3.homing_threshold()); - TERN_(Z4_SENSORLESS, tmc_sgt.Z4 = stepperZ4.homing_threshold()); - #endif - EEPROM_WRITE(tmc_sgt); - } - - // - // TMC stepping mode - // - { - _FIELD_TEST(tmc_stealth_enabled); - - tmc_stealth_enabled_t tmc_stealth_enabled = { false, false, false, false, false, false, false, false, false, false, false, false, false }; - - #if HAS_STEALTHCHOP - #if AXIS_HAS_STEALTHCHOP(X) - tmc_stealth_enabled.X = stepperX.get_stored_stealthChop_status(); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - tmc_stealth_enabled.Y = stepperY.get_stored_stealthChop_status(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - tmc_stealth_enabled.Z = stepperZ.get_stored_stealthChop_status(); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - tmc_stealth_enabled.X2 = stepperX2.get_stored_stealthChop_status(); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - tmc_stealth_enabled.Y2 = stepperY2.get_stored_stealthChop_status(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - tmc_stealth_enabled.Z2 = stepperZ2.get_stored_stealthChop_status(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - tmc_stealth_enabled.Z3 = stepperZ3.get_stored_stealthChop_status(); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - tmc_stealth_enabled.Z4 = stepperZ4.get_stored_stealthChop_status(); - #endif - #if MAX_EXTRUDERS - #if AXIS_HAS_STEALTHCHOP(E0) - tmc_stealth_enabled.E0 = stepperE0.get_stored_stealthChop_status(); - #endif - #if MAX_EXTRUDERS > 1 - #if AXIS_HAS_STEALTHCHOP(E1) - tmc_stealth_enabled.E1 = stepperE1.get_stored_stealthChop_status(); - #endif - #if MAX_EXTRUDERS > 2 - #if AXIS_HAS_STEALTHCHOP(E2) - tmc_stealth_enabled.E2 = stepperE2.get_stored_stealthChop_status(); - #endif - #if MAX_EXTRUDERS > 3 - #if AXIS_HAS_STEALTHCHOP(E3) - tmc_stealth_enabled.E3 = stepperE3.get_stored_stealthChop_status(); - #endif - #if MAX_EXTRUDERS > 4 - #if AXIS_HAS_STEALTHCHOP(E4) - tmc_stealth_enabled.E4 = stepperE4.get_stored_stealthChop_status(); - #endif - #if MAX_EXTRUDERS > 5 - #if AXIS_HAS_STEALTHCHOP(E5) - tmc_stealth_enabled.E5 = stepperE5.get_stored_stealthChop_status(); - #endif - #if MAX_EXTRUDERS > 6 - #if AXIS_HAS_STEALTHCHOP(E6) - tmc_stealth_enabled.E6 = stepperE6.get_stored_stealthChop_status(); - #endif - #if MAX_EXTRUDERS > 7 - #if AXIS_HAS_STEALTHCHOP(E7) - tmc_stealth_enabled.E7 = stepperE7.get_stored_stealthChop_status(); - #endif - #endif // MAX_EXTRUDERS > 7 - #endif // MAX_EXTRUDERS > 6 - #endif // MAX_EXTRUDERS > 5 - #endif // MAX_EXTRUDERS > 4 - #endif // MAX_EXTRUDERS > 3 - #endif // MAX_EXTRUDERS > 2 - #endif // MAX_EXTRUDERS > 1 - #endif // MAX_EXTRUDERS - #endif - EEPROM_WRITE(tmc_stealth_enabled); - } - - // - // Linear Advance - // - { - _FIELD_TEST(planner_extruder_advance_K); - - #if ENABLED(LIN_ADVANCE) - EEPROM_WRITE(planner.extruder_advance_K); - #else - dummyf = 0; - for (uint8_t q = _MAX(EXTRUDERS, 1); q--;) EEPROM_WRITE(dummyf); - #endif - } - - // - // Motor Current PWM - // - { - _FIELD_TEST(motor_current_setting); - - #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM - EEPROM_WRITE(stepper.motor_current_setting); - #else - const uint32_t no_current[MOTOR_CURRENT_COUNT] = { 0 }; - EEPROM_WRITE(no_current); - #endif - } - - // - // CNC Coordinate Systems - // - - _FIELD_TEST(coordinate_system); - - #if DISABLED(CNC_COORDINATE_SYSTEMS) - const xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS] = { { 0 } }; - #endif - EEPROM_WRITE(TERN(CNC_COORDINATE_SYSTEMS, gcode.coordinate_system, coordinate_system)); - - // - // Skew correction factors - // - _FIELD_TEST(planner_skew_factor); - EEPROM_WRITE(planner.skew_factor); - - // - // Advanced Pause filament load & unload lengths - // - #if EXTRUDERS - { - #if DISABLED(ADVANCED_PAUSE_FEATURE) - const fil_change_settings_t fc_settings[EXTRUDERS] = { 0, 0 }; - #endif - _FIELD_TEST(fc_settings); - EEPROM_WRITE(fc_settings); - } - #endif - - // - // Multiple Extruders - // - - #if HAS_MULTI_EXTRUDER - _FIELD_TEST(toolchange_settings); - EEPROM_WRITE(toolchange_settings); - #endif - - // - // Backlash Compensation - // - { - #if ENABLED(BACKLASH_GCODE) - const xyz_float_t &backlash_distance_mm = backlash.distance_mm; - const uint8_t &backlash_correction = backlash.correction; - #else - const xyz_float_t backlash_distance_mm{0}; - const uint8_t backlash_correction = 0; - #endif - #if ENABLED(BACKLASH_GCODE) && defined(BACKLASH_SMOOTHING_MM) - const float &backlash_smoothing_mm = backlash.smoothing_mm; - #else - const float backlash_smoothing_mm = 3; - #endif - _FIELD_TEST(backlash_distance_mm); - EEPROM_WRITE(backlash_distance_mm); - EEPROM_WRITE(backlash_correction); - EEPROM_WRITE(backlash_smoothing_mm); - } - - // - // Extensible UI User Data - // - #if ENABLED(EXTENSIBLE_UI) - { - char extui_data[ExtUI::eeprom_data_size] = { 0 }; - ExtUI::onStoreSettings(extui_data); - _FIELD_TEST(extui_data); - EEPROM_WRITE(extui_data); - } - #endif - - // - // Case Light Brightness - // - #if HAS_CASE_LIGHT_BRIGHTNESS - EEPROM_WRITE(caselight.brightness); - #endif - - // - // Password feature - // - #if ENABLED(PASSWORD_FEATURE) - EEPROM_WRITE(password.is_set); - EEPROM_WRITE(password.value); - #endif - - // - // TOUCH_SCREEN_CALIBRATION - // - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - EEPROM_WRITE(touch.calibration); - #endif - - // - // Validate CRC and Data Size - // - if (!eeprom_error) { - const uint16_t eeprom_size = eeprom_index - (EEPROM_OFFSET), - final_crc = working_crc; - - // Write the EEPROM header - eeprom_index = EEPROM_OFFSET; - - EEPROM_WRITE(version); - EEPROM_WRITE(final_crc); - - // Report storage size - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("Settings Stored (", eeprom_size, " bytes; crc ", (uint32_t)final_crc, ")"); - - eeprom_error |= size_error(eeprom_size); - } - EEPROM_FINISH(); - - // - // UBL Mesh - // - #if ENABLED(UBL_SAVE_ACTIVE_ON_M500) - if (ubl.storage_slot >= 0) - store_mesh(ubl.storage_slot); - #endif - - if (!eeprom_error) LCD_MESSAGEPGM(MSG_SETTINGS_STORED); - - TERN_(EXTENSIBLE_UI, ExtUI::onConfigurationStoreWritten(!eeprom_error)); - - return !eeprom_error; - } - - /** - * M501 - Retrieve Configuration - */ - bool MarlinSettings::_load() { - uint16_t working_crc = 0; - - EEPROM_START(); - - char stored_ver[4]; - EEPROM_READ_ALWAYS(stored_ver); - - uint16_t stored_crc; - EEPROM_READ_ALWAYS(stored_crc); - - // Version has to match or defaults are used - if (strncmp(version, stored_ver, 3) != 0) { - if (stored_ver[3] != '\0') { - stored_ver[0] = '?'; - stored_ver[1] = '\0'; - } - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("EEPROM version mismatch (EEPROM=", stored_ver, " Marlin=" EEPROM_VERSION ")"); - TERN(EEPROM_AUTO_INIT,,ui.eeprom_alert_version()); - eeprom_error = true; - } - else { - float dummyf = 0; - working_crc = 0; // Init to 0. Accumulated by EEPROM_READ - - _FIELD_TEST(esteppers); - - // Number of esteppers may change - uint8_t esteppers; - EEPROM_READ_ALWAYS(esteppers); - - // - // Planner Motion - // - { - // Get only the number of E stepper parameters previously stored - // Any steppers added later are set to their defaults - uint32_t tmp1[XYZ + esteppers]; - float tmp2[XYZ + esteppers]; - feedRate_t tmp3[XYZ + esteppers]; - EEPROM_READ(tmp1); // max_acceleration_mm_per_s2 - EEPROM_READ(planner.settings.min_segment_time_us); - EEPROM_READ(tmp2); // axis_steps_per_mm - EEPROM_READ(tmp3); // max_feedrate_mm_s - - if (!validating) LOOP_XYZE_N(i) { - const bool in = (i < esteppers + XYZ); - planner.settings.max_acceleration_mm_per_s2[i] = in ? tmp1[i] : pgm_read_dword(&_DMA[ALIM(i, _DMA)]); - planner.settings.axis_steps_per_mm[i] = in ? tmp2[i] : pgm_read_float(&_DASU[ALIM(i, _DASU)]); - planner.settings.max_feedrate_mm_s[i] = in ? tmp3[i] : pgm_read_float(&_DMF[ALIM(i, _DMF)]); - } - - EEPROM_READ(planner.settings.acceleration); - EEPROM_READ(planner.settings.retract_acceleration); - EEPROM_READ(planner.settings.travel_acceleration); - EEPROM_READ(planner.settings.min_feedrate_mm_s); - EEPROM_READ(planner.settings.min_travel_feedrate_mm_s); - - #if HAS_CLASSIC_JERK - EEPROM_READ(planner.max_jerk); - #if HAS_LINEAR_E_JERK - EEPROM_READ(dummyf); - #endif - #else - for (uint8_t q = 4; q--;) EEPROM_READ(dummyf); - #endif - - EEPROM_READ(TERN(CLASSIC_JERK, dummyf, planner.junction_deviation_mm)); - } - - // - // Home Offset (M206 / M665) - // - { - _FIELD_TEST(home_offset); - - #if HAS_SCARA_OFFSET - EEPROM_READ(scara_home_offset); - #else - #if !HAS_HOME_OFFSET - xyz_pos_t home_offset; - #endif - EEPROM_READ(home_offset); - #endif - } - - // - // Hotend Offsets, if any - // - { - #if HAS_HOTEND_OFFSET - // Skip hotend 0 which must be 0 - LOOP_S_L_N(e, 1, HOTENDS) - EEPROM_READ(hotend_offset[e]); - #endif - } - - // - // Filament Runout Sensor - // - { - int8_t runout_sensor_enabled; - _FIELD_TEST(runout_sensor_enabled); - EEPROM_READ(runout_sensor_enabled); - #if HAS_FILAMENT_SENSOR - runout.enabled = runout_sensor_enabled < 0 ? FIL_RUNOUT_ENABLED_DEFAULT : runout_sensor_enabled; - #endif - - TERN_(HAS_FILAMENT_SENSOR, if (runout.enabled) runout.reset()); - - float runout_distance_mm; - EEPROM_READ(runout_distance_mm); - #if HAS_FILAMENT_RUNOUT_DISTANCE - if (!validating) runout.set_runout_distance(runout_distance_mm); - #endif - } - - // - // Global Leveling - // - EEPROM_READ(TERN(ENABLE_LEVELING_FADE_HEIGHT, new_z_fade_height, dummyf)); - - // - // Mesh (Manual) Bed Leveling - // - { - uint8_t mesh_num_x, mesh_num_y; - EEPROM_READ(dummyf); - EEPROM_READ_ALWAYS(mesh_num_x); - EEPROM_READ_ALWAYS(mesh_num_y); - - #if ENABLED(MESH_BED_LEVELING) - if (!validating) mbl.z_offset = dummyf; - if (mesh_num_x == GRID_MAX_POINTS_X && mesh_num_y == GRID_MAX_POINTS_Y) { - // EEPROM data fits the current mesh - EEPROM_READ(mbl.z_values); - } - else { - // EEPROM data is stale - if (!validating) mbl.reset(); - for (uint16_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_READ(dummyf); - } - #else - // MBL is disabled - skip the stored data - for (uint16_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_READ(dummyf); - #endif // MESH_BED_LEVELING - } - - // - // Probe Z Offset - // - { - _FIELD_TEST(probe_offset); - #if HAS_BED_PROBE - const xyz_pos_t &zpo = probe.offset; - #else - xyz_pos_t zpo; - #endif - EEPROM_READ(zpo); - } - - // - // Planar Bed Leveling matrix - // - { - #if ABL_PLANAR - EEPROM_READ(planner.bed_level_matrix); - #else - for (uint8_t q = 9; q--;) EEPROM_READ(dummyf); - #endif - } - - // - // Bilinear Auto Bed Leveling - // - { - uint8_t grid_max_x, grid_max_y; - EEPROM_READ_ALWAYS(grid_max_x); // 1 byte - EEPROM_READ_ALWAYS(grid_max_y); // 1 byte - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - if (grid_max_x == GRID_MAX_POINTS_X && grid_max_y == GRID_MAX_POINTS_Y) { - if (!validating) set_bed_leveling_enabled(false); - EEPROM_READ(bilinear_grid_spacing); // 2 ints - EEPROM_READ(bilinear_start); // 2 ints - EEPROM_READ(z_values); // 9 to 256 floats - } - else // EEPROM data is stale - #endif // AUTO_BED_LEVELING_BILINEAR - { - // Skip past disabled (or stale) Bilinear Grid data - xy_pos_t bgs, bs; - EEPROM_READ(bgs); - EEPROM_READ(bs); - for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_READ(dummyf); - } - } - - // - // Unified Bed Leveling active state - // - { - _FIELD_TEST(planner_leveling_active); - #if ENABLED(AUTO_BED_LEVELING_UBL) - const bool &planner_leveling_active = planner.leveling_active; - const int8_t &ubl_storage_slot = ubl.storage_slot; - #else - bool planner_leveling_active; - int8_t ubl_storage_slot; - #endif - EEPROM_READ(planner_leveling_active); - EEPROM_READ(ubl_storage_slot); - } - - // - // SERVO_ANGLES - // - { - _FIELD_TEST(servo_angles); - #if ENABLED(EDITABLE_SERVO_ANGLES) - uint16_t (&servo_angles_arr)[EEPROM_NUM_SERVOS][2] = servo_angles; - #else - uint16_t servo_angles_arr[EEPROM_NUM_SERVOS][2]; - #endif - EEPROM_READ(servo_angles_arr); - } - - // - // Thermal first layer compensation values - // - #if ENABLED(PROBE_TEMP_COMPENSATION) - EEPROM_READ(temp_comp.z_offsets_probe); - EEPROM_READ(temp_comp.z_offsets_bed); - #if ENABLED(USE_TEMP_EXT_COMPENSATION) - EEPROM_READ(temp_comp.z_offsets_ext); - #endif - temp_comp.reset_index(); - #else - // No placeholder data for this feature - #endif - - // - // BLTOUCH - // - { - _FIELD_TEST(bltouch_last_written_mode); - #if ENABLED(BLTOUCH) - const bool &bltouch_last_written_mode = bltouch.last_written_mode; - #else - bool bltouch_last_written_mode; - #endif - EEPROM_READ(bltouch_last_written_mode); - } - - // - // DELTA Geometry or Dual Endstops offsets - // - { - #if ENABLED(DELTA) - - _FIELD_TEST(delta_height); - - EEPROM_READ(delta_height); // 1 float - EEPROM_READ(delta_endstop_adj); // 3 floats - EEPROM_READ(delta_radius); // 1 float - EEPROM_READ(delta_diagonal_rod); // 1 float - EEPROM_READ(delta_segments_per_second); // 1 float - EEPROM_READ(delta_tower_angle_trim); // 3 floats - EEPROM_READ(delta_diagonal_rod_trim); // 3 floats - - #elif HAS_EXTRA_ENDSTOPS - - _FIELD_TEST(x2_endstop_adj); - - EEPROM_READ(TERN(X_DUAL_ENDSTOPS, endstops.x2_endstop_adj, dummyf)); // 1 float - EEPROM_READ(TERN(Y_DUAL_ENDSTOPS, endstops.y2_endstop_adj, dummyf)); // 1 float - EEPROM_READ(TERN(Z_MULTI_ENDSTOPS, endstops.z2_endstop_adj, dummyf)); // 1 float - - #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 - EEPROM_READ(endstops.z3_endstop_adj); // 1 float - #else - EEPROM_READ(dummyf); - #endif - #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 - EEPROM_READ(endstops.z4_endstop_adj); // 1 float - #else - EEPROM_READ(dummyf); - #endif - - #endif - } - - #if ENABLED(Z_STEPPER_AUTO_ALIGN) - EEPROM_READ(z_stepper_align.xy); - #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) - EEPROM_READ(z_stepper_align.stepper_xy); - #endif - #endif - - // - // LCD Preheat settings - // - #if PREHEAT_COUNT - _FIELD_TEST(ui_material_preset); - EEPROM_READ(ui.material_preset); - #endif - - // - // Hotend PID - // - { - HOTEND_LOOP() { - PIDCF_t pidcf; - EEPROM_READ(pidcf); - #if ENABLED(PIDTEMP) - if (!validating && !isnan(pidcf.Kp)) { - // Scale PID values since EEPROM values are unscaled - PID_PARAM(Kp, e) = pidcf.Kp; - PID_PARAM(Ki, e) = scalePID_i(pidcf.Ki); - PID_PARAM(Kd, e) = scalePID_d(pidcf.Kd); - TERN_(PID_EXTRUSION_SCALING, PID_PARAM(Kc, e) = pidcf.Kc); - TERN_(PID_FAN_SCALING, PID_PARAM(Kf, e) = pidcf.Kf); - } - #endif - } - } - - // - // PID Extrusion Scaling - // - { - _FIELD_TEST(lpq_len); - #if ENABLED(PID_EXTRUSION_SCALING) - const int16_t &lpq_len = thermalManager.lpq_len; - #else - int16_t lpq_len; - #endif - EEPROM_READ(lpq_len); - } - - // - // Heated Bed PID - // - { - PID_t pid; - EEPROM_READ(pid); - #if ENABLED(PIDTEMPBED) - if (!validating && !isnan(pid.Kp)) { - // Scale PID values since EEPROM values are unscaled - thermalManager.temp_bed.pid.Kp = pid.Kp; - thermalManager.temp_bed.pid.Ki = scalePID_i(pid.Ki); - thermalManager.temp_bed.pid.Kd = scalePID_d(pid.Kd); - } - #endif - } - - // - // User-defined Thermistors - // - #if HAS_USER_THERMISTORS - { - _FIELD_TEST(user_thermistor); - EEPROM_READ(thermalManager.user_thermistor); - } - #endif - - // - // Power monitor - // - { - #if HAS_POWER_MONITOR - uint8_t &power_monitor_flags = power_monitor.flags; - #else - uint8_t power_monitor_flags; - #endif - _FIELD_TEST(power_monitor_flags); - EEPROM_READ(power_monitor_flags); - } - - // - // LCD Contrast - // - { - _FIELD_TEST(lcd_contrast); - int16_t lcd_contrast; - EEPROM_READ(lcd_contrast); - if (!validating) { - TERN_(HAS_LCD_CONTRAST, ui.set_contrast(lcd_contrast)); - } - } - - // - // Controller Fan - // - { - _FIELD_TEST(controllerFan_settings); - #if ENABLED(CONTROLLER_FAN_EDITABLE) - const controllerFan_settings_t &cfs = controllerFan.settings; - #else - controllerFan_settings_t cfs = { 0 }; - #endif - EEPROM_READ(cfs); - } - - // - // Power-Loss Recovery - // - { - _FIELD_TEST(recovery_enabled); - #if ENABLED(POWER_LOSS_RECOVERY) - const bool &recovery_enabled = recovery.enabled; - #else - bool recovery_enabled; - #endif - EEPROM_READ(recovery_enabled); - } - - // - // Firmware Retraction - // - { - _FIELD_TEST(fwretract_settings); - - #if ENABLED(FWRETRACT) - EEPROM_READ(fwretract.settings); - #else - fwretract_settings_t fwretract_settings; - EEPROM_READ(fwretract_settings); - #endif - #if BOTH(FWRETRACT, FWRETRACT_AUTORETRACT) - EEPROM_READ(fwretract.autoretract_enabled); - #else - bool autoretract_enabled; - EEPROM_READ(autoretract_enabled); - #endif - } - - // - // Volumetric & Filament Size - // - { - struct { - bool volumetric_enabled; - float filament_size[EXTRUDERS]; - float volumetric_extruder_limit[EXTRUDERS]; - } storage; - - _FIELD_TEST(parser_volumetric_enabled); - EEPROM_READ(storage); - - #if DISABLED(NO_VOLUMETRICS) - if (!validating) { - parser.volumetric_enabled = storage.volumetric_enabled; - COPY(planner.filament_size, storage.filament_size); - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - COPY(planner.volumetric_extruder_limit, storage.volumetric_extruder_limit); - #endif - } - #endif - } - - // - // TMC Stepper Settings - // - - if (!validating) reset_stepper_drivers(); - - // TMC Stepper Current - { - _FIELD_TEST(tmc_stepper_current); - - tmc_stepper_current_t currents; - EEPROM_READ(currents); - - #if HAS_TRINAMIC_CONFIG - - #define SET_CURR(Q) stepper##Q.rms_current(currents.Q ? currents.Q : Q##_CURRENT) - if (!validating) { - #if AXIS_IS_TMC(X) - SET_CURR(X); - #endif - #if AXIS_IS_TMC(Y) - SET_CURR(Y); - #endif - #if AXIS_IS_TMC(Z) - SET_CURR(Z); - #endif - #if AXIS_IS_TMC(X2) - SET_CURR(X2); - #endif - #if AXIS_IS_TMC(Y2) - SET_CURR(Y2); - #endif - #if AXIS_IS_TMC(Z2) - SET_CURR(Z2); - #endif - #if AXIS_IS_TMC(Z3) - SET_CURR(Z3); - #endif - #if AXIS_IS_TMC(Z4) - SET_CURR(Z4); - #endif - #if AXIS_IS_TMC(E0) - SET_CURR(E0); - #endif - #if AXIS_IS_TMC(E1) - SET_CURR(E1); - #endif - #if AXIS_IS_TMC(E2) - SET_CURR(E2); - #endif - #if AXIS_IS_TMC(E3) - SET_CURR(E3); - #endif - #if AXIS_IS_TMC(E4) - SET_CURR(E4); - #endif - #if AXIS_IS_TMC(E5) - SET_CURR(E5); - #endif - #if AXIS_IS_TMC(E6) - SET_CURR(E6); - #endif - #if AXIS_IS_TMC(E7) - SET_CURR(E7); - #endif - } - #endif - } - - // TMC Hybrid Threshold - { - tmc_hybrid_threshold_t tmc_hybrid_threshold; - _FIELD_TEST(tmc_hybrid_threshold); - EEPROM_READ(tmc_hybrid_threshold); - - #if ENABLED(HYBRID_THRESHOLD) - if (!validating) { - #if AXIS_HAS_STEALTHCHOP(X) - stepperX.set_pwm_thrs(tmc_hybrid_threshold.X); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - stepperY.set_pwm_thrs(tmc_hybrid_threshold.Y); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - stepperZ.set_pwm_thrs(tmc_hybrid_threshold.Z); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - stepperX2.set_pwm_thrs(tmc_hybrid_threshold.X2); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - stepperY2.set_pwm_thrs(tmc_hybrid_threshold.Y2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - stepperZ2.set_pwm_thrs(tmc_hybrid_threshold.Z2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - stepperZ3.set_pwm_thrs(tmc_hybrid_threshold.Z3); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - stepperZ4.set_pwm_thrs(tmc_hybrid_threshold.Z4); - #endif - #if AXIS_HAS_STEALTHCHOP(E0) - stepperE0.set_pwm_thrs(tmc_hybrid_threshold.E0); - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - stepperE1.set_pwm_thrs(tmc_hybrid_threshold.E1); - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - stepperE2.set_pwm_thrs(tmc_hybrid_threshold.E2); - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - stepperE3.set_pwm_thrs(tmc_hybrid_threshold.E3); - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - stepperE4.set_pwm_thrs(tmc_hybrid_threshold.E4); - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - stepperE5.set_pwm_thrs(tmc_hybrid_threshold.E5); - #endif - #if AXIS_HAS_STEALTHCHOP(E6) - stepperE6.set_pwm_thrs(tmc_hybrid_threshold.E6); - #endif - #if AXIS_HAS_STEALTHCHOP(E7) - stepperE7.set_pwm_thrs(tmc_hybrid_threshold.E7); - #endif - } - #endif - } - - // - // TMC StallGuard threshold. - // - { - tmc_sgt_t tmc_sgt; - _FIELD_TEST(tmc_sgt); - EEPROM_READ(tmc_sgt); - #if USE_SENSORLESS - if (!validating) { - TERN_(X_SENSORLESS, stepperX.homing_threshold(tmc_sgt.X)); - TERN_(X2_SENSORLESS, stepperX2.homing_threshold(tmc_sgt.X2)); - TERN_(Y_SENSORLESS, stepperY.homing_threshold(tmc_sgt.Y)); - TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(tmc_sgt.Y2)); - TERN_(Z_SENSORLESS, stepperZ.homing_threshold(tmc_sgt.Z)); - TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(tmc_sgt.Z2)); - TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(tmc_sgt.Z3)); - TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(tmc_sgt.Z4)); - } - #endif - } - - // TMC stepping mode - { - _FIELD_TEST(tmc_stealth_enabled); - - tmc_stealth_enabled_t tmc_stealth_enabled; - EEPROM_READ(tmc_stealth_enabled); - - #if HAS_TRINAMIC_CONFIG - - #define SET_STEPPING_MODE(ST) stepper##ST.stored.stealthChop_enabled = tmc_stealth_enabled.ST; stepper##ST.refresh_stepping_mode(); - if (!validating) { - #if AXIS_HAS_STEALTHCHOP(X) - SET_STEPPING_MODE(X); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - SET_STEPPING_MODE(Y); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - SET_STEPPING_MODE(Z); - #endif - #if AXIS_HAS_STEALTHCHOP(X2) - SET_STEPPING_MODE(X2); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - SET_STEPPING_MODE(Y2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - SET_STEPPING_MODE(Z2); - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - SET_STEPPING_MODE(Z3); - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - SET_STEPPING_MODE(Z4); - #endif - #if AXIS_HAS_STEALTHCHOP(E0) - SET_STEPPING_MODE(E0); - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - SET_STEPPING_MODE(E1); - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - SET_STEPPING_MODE(E2); - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - SET_STEPPING_MODE(E3); - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - SET_STEPPING_MODE(E4); - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - SET_STEPPING_MODE(E5); - #endif - #if AXIS_HAS_STEALTHCHOP(E6) - SET_STEPPING_MODE(E6); - #endif - #if AXIS_HAS_STEALTHCHOP(E7) - SET_STEPPING_MODE(E7); - #endif - } - #endif - } - - // - // Linear Advance - // - { - float extruder_advance_K[_MAX(EXTRUDERS, 1)]; - _FIELD_TEST(planner_extruder_advance_K); - EEPROM_READ(extruder_advance_K); - #if ENABLED(LIN_ADVANCE) - if (!validating) - COPY(planner.extruder_advance_K, extruder_advance_K); - #endif - } - - // - // Motor Current PWM - // - { - _FIELD_TEST(motor_current_setting); - uint32_t motor_current_setting[MOTOR_CURRENT_COUNT] - #if HAS_MOTOR_CURRENT_SPI - = DIGIPOT_MOTOR_CURRENT - #endif - ; - DEBUG_ECHOLNPGM("DIGIPOTS Loading"); - EEPROM_READ(motor_current_setting); - DEBUG_ECHOLNPGM("DIGIPOTS Loaded"); - #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM - if (!validating) - COPY(stepper.motor_current_setting, motor_current_setting); - #endif - } - - // - // CNC Coordinate System - // - { - _FIELD_TEST(coordinate_system); - #if ENABLED(CNC_COORDINATE_SYSTEMS) - if (!validating) (void)gcode.select_coordinate_system(-1); // Go back to machine space - EEPROM_READ(gcode.coordinate_system); - #else - xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; - EEPROM_READ(coordinate_system); - #endif - } - - // - // Skew correction factors - // - { - skew_factor_t skew_factor; - _FIELD_TEST(planner_skew_factor); - EEPROM_READ(skew_factor); - #if ENABLED(SKEW_CORRECTION_GCODE) - if (!validating) { - planner.skew_factor.xy = skew_factor.xy; - #if ENABLED(SKEW_CORRECTION_FOR_Z) - planner.skew_factor.xz = skew_factor.xz; - planner.skew_factor.yz = skew_factor.yz; - #endif - } - #endif - } - - // - // Advanced Pause filament load & unload lengths - // - #if EXTRUDERS - { - #if DISABLED(ADVANCED_PAUSE_FEATURE) - fil_change_settings_t fc_settings[EXTRUDERS]; - #endif - _FIELD_TEST(fc_settings); - EEPROM_READ(fc_settings); - } - #endif - - // - // Tool-change settings - // - #if HAS_MULTI_EXTRUDER - _FIELD_TEST(toolchange_settings); - EEPROM_READ(toolchange_settings); - #endif - - // - // Backlash Compensation - // - { - #if ENABLED(BACKLASH_GCODE) - const xyz_float_t &backlash_distance_mm = backlash.distance_mm; - const uint8_t &backlash_correction = backlash.correction; - #else - float backlash_distance_mm[XYZ]; - uint8_t backlash_correction; - #endif - #if ENABLED(BACKLASH_GCODE) && defined(BACKLASH_SMOOTHING_MM) - const float &backlash_smoothing_mm = backlash.smoothing_mm; - #else - float backlash_smoothing_mm; - #endif - _FIELD_TEST(backlash_distance_mm); - EEPROM_READ(backlash_distance_mm); - EEPROM_READ(backlash_correction); - EEPROM_READ(backlash_smoothing_mm); - } - - // - // Extensible UI User Data - // - #if ENABLED(EXTENSIBLE_UI) - // This is a significant hardware change; don't reserve EEPROM space when not present - { - const char extui_data[ExtUI::eeprom_data_size] = { 0 }; - _FIELD_TEST(extui_data); - EEPROM_READ(extui_data); - if (!validating) ExtUI::onLoadSettings(extui_data); - } - #endif - - // - // Case Light Brightness - // - #if HAS_CASE_LIGHT_BRIGHTNESS - _FIELD_TEST(caselight_brightness); - EEPROM_READ(caselight.brightness); - #endif - - // - // Password feature - // - #if ENABLED(PASSWORD_FEATURE) - _FIELD_TEST(password_is_set); - EEPROM_READ(password.is_set); - EEPROM_READ(password.value); - #endif - - // - // TOUCH_SCREEN_CALIBRATION - // - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - _FIELD_TEST(touch.calibration); - EEPROM_READ(touch.calibration); - #endif - - eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET)); - if (eeprom_error) { - DEBUG_ECHO_START(); - DEBUG_ECHOLNPAIR("Index: ", int(eeprom_index - (EEPROM_OFFSET)), " Size: ", datasize()); - TERN(EEPROM_AUTO_INIT,,ui.eeprom_alert_index()); - } - else if (working_crc != stored_crc) { - eeprom_error = true; - DEBUG_ERROR_START(); - DEBUG_ECHOLNPAIR("EEPROM CRC mismatch - (stored) ", stored_crc, " != ", working_crc, " (calculated)!"); - TERN(EEPROM_AUTO_INIT,,ui.eeprom_alert_crc()); - } - else if (!validating) { - DEBUG_ECHO_START(); - DEBUG_ECHO(version); - DEBUG_ECHOLNPAIR(" stored settings retrieved (", eeprom_index - (EEPROM_OFFSET), " bytes; crc ", (uint32_t)working_crc, ")"); - } - - if (!validating && !eeprom_error) postprocess(); - - #if ENABLED(AUTO_BED_LEVELING_UBL) - if (!validating) { - ubl.report_state(); - - if (!ubl.sanity_check()) { - SERIAL_EOL(); - #if ENABLED(EEPROM_CHITCHAT) - ubl.echo_name(); - DEBUG_ECHOLNPGM(" initialized.\n"); - #endif - } - else { - eeprom_error = true; - #if ENABLED(EEPROM_CHITCHAT) - DEBUG_ECHOPGM("?Can't enable "); - ubl.echo_name(); - DEBUG_ECHOLNPGM("."); - #endif - ubl.reset(); - } - - if (ubl.storage_slot >= 0) { - load_mesh(ubl.storage_slot); - DEBUG_ECHOLNPAIR("Mesh ", ubl.storage_slot, " loaded from storage."); - } - else { - ubl.reset(); - DEBUG_ECHOLNPGM("UBL reset"); - } - } - #endif - } - - #if ENABLED(EEPROM_CHITCHAT) && DISABLED(DISABLE_M503) - // Report the EEPROM settings - if (!validating && (DISABLED(EEPROM_BOOT_SILENT) || IsRunning())) report(); - #endif - - EEPROM_FINISH(); - - return !eeprom_error; - } - - #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE - extern bool restoreEEPROM(); - #endif - - bool MarlinSettings::validate() { - validating = true; - #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE - bool success = _load(); - if (!success && restoreEEPROM()) { - SERIAL_ECHOLNPGM("Recovered backup EEPROM settings from SPI Flash"); - success = _load(); - } - #else - const bool success = _load(); - #endif - validating = false; - return success; - } - - bool MarlinSettings::load() { - if (validate()) { - const bool success = _load(); - TERN_(EXTENSIBLE_UI, ExtUI::onConfigurationStoreRead(success)); - return success; - } - reset(); - #if ENABLED(EEPROM_AUTO_INIT) - (void)save(); - SERIAL_ECHO_MSG("EEPROM Initialized"); - #endif - return false; - } - - #if ENABLED(AUTO_BED_LEVELING_UBL) - - inline void ubl_invalid_slot(const int s) { - #if ENABLED(EEPROM_CHITCHAT) - DEBUG_ECHOLNPGM("?Invalid slot."); - DEBUG_ECHO(s); - DEBUG_ECHOLNPGM(" mesh slots available."); - #else - UNUSED(s); - #endif - } - - const uint16_t MarlinSettings::meshes_end = persistentStore.capacity() - 129; // 128 (+1 because of the change to capacity rather than last valid address) - // is a placeholder for the size of the MAT; the MAT will always - // live at the very end of the eeprom - - uint16_t MarlinSettings::meshes_start_index() { - return (datasize() + EEPROM_OFFSET + 32) & 0xFFF8; // Pad the end of configuration data so it can float up - // or down a little bit without disrupting the mesh data - } - - uint16_t MarlinSettings::calc_num_meshes() { - return (meshes_end - meshes_start_index()) / sizeof(ubl.z_values); - } - - int MarlinSettings::mesh_slot_offset(const int8_t slot) { - return meshes_end - (slot + 1) * sizeof(ubl.z_values); - } - - void MarlinSettings::store_mesh(const int8_t slot) { - - #if ENABLED(AUTO_BED_LEVELING_UBL) - const int16_t a = calc_num_meshes(); - if (!WITHIN(slot, 0, a - 1)) { - ubl_invalid_slot(a); - DEBUG_ECHOLNPAIR("E2END=", persistentStore.capacity() - 1, " meshes_end=", meshes_end, " slot=", slot); - DEBUG_EOL(); - return; - } - - int pos = mesh_slot_offset(slot); - uint16_t crc = 0; - - // Write crc to MAT along with other data, or just tack on to the beginning or end - persistentStore.access_start(); - const bool status = persistentStore.write_data(pos, (uint8_t *)&ubl.z_values, sizeof(ubl.z_values), &crc); - persistentStore.access_finish(); - - if (status) SERIAL_ECHOLNPGM("?Unable to save mesh data."); - else DEBUG_ECHOLNPAIR("Mesh saved in slot ", slot); - - #else - - // Other mesh types - - #endif - } - - void MarlinSettings::load_mesh(const int8_t slot, void * const into/*=nullptr*/) { - - #if ENABLED(AUTO_BED_LEVELING_UBL) - - const int16_t a = settings.calc_num_meshes(); - - if (!WITHIN(slot, 0, a - 1)) { - ubl_invalid_slot(a); - return; - } - - int pos = mesh_slot_offset(slot); - uint16_t crc = 0; - uint8_t * const dest = into ? (uint8_t*)into : (uint8_t*)&ubl.z_values; - - persistentStore.access_start(); - const uint16_t status = persistentStore.read_data(pos, dest, sizeof(ubl.z_values), &crc); - persistentStore.access_finish(); - - if (status) SERIAL_ECHOLNPGM("?Unable to load mesh data."); - else DEBUG_ECHOLNPAIR("Mesh loaded from slot ", slot); - - EEPROM_FINISH(); - - #else - - // Other mesh types - - #endif - } - - //void MarlinSettings::delete_mesh() { return; } - //void MarlinSettings::defrag_meshes() { return; } - - #endif // AUTO_BED_LEVELING_UBL - -#else // !EEPROM_SETTINGS - - bool MarlinSettings::save() { - DEBUG_ERROR_MSG("EEPROM disabled"); - return false; - } - -#endif // !EEPROM_SETTINGS - -/** - * M502 - Reset Configuration - */ -void MarlinSettings::reset() { - LOOP_XYZE_N(i) { - planner.settings.max_acceleration_mm_per_s2[i] = pgm_read_dword(&_DMA[ALIM(i, _DMA)]); - planner.settings.axis_steps_per_mm[i] = pgm_read_float(&_DASU[ALIM(i, _DASU)]); - planner.settings.max_feedrate_mm_s[i] = pgm_read_float(&_DMF[ALIM(i, _DMF)]); - } - - planner.settings.min_segment_time_us = DEFAULT_MINSEGMENTTIME; - planner.settings.acceleration = DEFAULT_ACCELERATION; - planner.settings.retract_acceleration = DEFAULT_RETRACT_ACCELERATION; - planner.settings.travel_acceleration = DEFAULT_TRAVEL_ACCELERATION; - planner.settings.min_feedrate_mm_s = feedRate_t(DEFAULT_MINIMUMFEEDRATE); - planner.settings.min_travel_feedrate_mm_s = feedRate_t(DEFAULT_MINTRAVELFEEDRATE); - - #if HAS_CLASSIC_JERK - #ifndef DEFAULT_XJERK - #define DEFAULT_XJERK 0 - #endif - #ifndef DEFAULT_YJERK - #define DEFAULT_YJERK 0 - #endif - #ifndef DEFAULT_ZJERK - #define DEFAULT_ZJERK 0 - #endif - planner.max_jerk.set(DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK); - TERN_(HAS_CLASSIC_E_JERK, planner.max_jerk.e = DEFAULT_EJERK;); - #endif - - #if HAS_JUNCTION_DEVIATION - planner.junction_deviation_mm = float(JUNCTION_DEVIATION_MM); - #endif - - #if HAS_SCARA_OFFSET - scara_home_offset.reset(); - #elif HAS_HOME_OFFSET - home_offset.reset(); - #endif - - TERN_(HAS_HOTEND_OFFSET, reset_hotend_offsets()); - - // - // Filament Runout Sensor - // - - #if HAS_FILAMENT_SENSOR - runout.enabled = FIL_RUNOUT_ENABLED_DEFAULT; - runout.reset(); - TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, runout.set_runout_distance(FILAMENT_RUNOUT_DISTANCE_MM)); - #endif - - // - // Tool-change Settings - // - - #if HAS_MULTI_EXTRUDER - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - toolchange_settings.swap_length = TOOLCHANGE_FS_LENGTH; - toolchange_settings.extra_resume = TOOLCHANGE_FS_EXTRA_RESUME_LENGTH; - toolchange_settings.retract_speed = TOOLCHANGE_FS_RETRACT_SPEED; - toolchange_settings.unretract_speed = TOOLCHANGE_FS_UNRETRACT_SPEED; - toolchange_settings.extra_prime = TOOLCHANGE_FS_EXTRA_PRIME; - toolchange_settings.prime_speed = TOOLCHANGE_FS_PRIME_SPEED; - toolchange_settings.fan_speed = TOOLCHANGE_FS_FAN_SPEED; - toolchange_settings.fan_time = TOOLCHANGE_FS_FAN_TIME; - #endif - - #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) - enable_first_prime = false; - #endif - - #if ENABLED(TOOLCHANGE_PARK) - constexpr xyz_pos_t tpxy = TOOLCHANGE_PARK_XY; - toolchange_settings.enable_park = true; - toolchange_settings.change_point = tpxy; - #endif - - toolchange_settings.z_raise = TOOLCHANGE_ZRAISE; - - #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - migration = migration_defaults; - #endif - - #endif - - #if ENABLED(BACKLASH_GCODE) - backlash.correction = (BACKLASH_CORRECTION) * 255; - constexpr xyz_float_t tmp = BACKLASH_DISTANCE_MM; - backlash.distance_mm = tmp; - #ifdef BACKLASH_SMOOTHING_MM - backlash.smoothing_mm = BACKLASH_SMOOTHING_MM; - #endif - #endif - - TERN_(EXTENSIBLE_UI, ExtUI::onFactoryReset()); - - // - // Case Light Brightness - // - TERN_(HAS_CASE_LIGHT_BRIGHTNESS, caselight.brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); - - // - // TOUCH_SCREEN_CALIBRATION - // - TERN_(TOUCH_SCREEN_CALIBRATION, touch.calibration_reset()); - - // - // Magnetic Parking Extruder - // - TERN_(MAGNETIC_PARKING_EXTRUDER, mpe_settings_init()); - - // - // Global Leveling - // - TERN_(ENABLE_LEVELING_FADE_HEIGHT, new_z_fade_height = 0.0); - TERN_(HAS_LEVELING, reset_bed_level()); - - #if HAS_BED_PROBE - constexpr float dpo[] = NOZZLE_TO_PROBE_OFFSET; - static_assert(COUNT(dpo) == 3, "NOZZLE_TO_PROBE_OFFSET must contain offsets for X, Y, and Z."); - #if HAS_PROBE_XY_OFFSET - LOOP_XYZ(a) probe.offset[a] = dpo[a]; - #else - probe.offset.set(0, 0, dpo[Z_AXIS]); - #endif - #endif - - // - // Z Stepper Auto-alignment points - // - TERN_(Z_STEPPER_AUTO_ALIGN, z_stepper_align.reset_to_default()); - - // - // Servo Angles - // - TERN_(EDITABLE_SERVO_ANGLES, COPY(servo_angles, base_servo_angles)); // When not editable only one copy of servo angles exists - - // - // BLTOUCH - // - //#if ENABLED(BLTOUCH) - // bltouch.last_written_mode; - //#endif - - // - // Endstop Adjustments - // - - #if ENABLED(DELTA) - const abc_float_t adj = DELTA_ENDSTOP_ADJ, dta = DELTA_TOWER_ANGLE_TRIM, ddr = DELTA_DIAGONAL_ROD_TRIM_TOWER; - delta_height = DELTA_HEIGHT; - delta_endstop_adj = adj; - delta_radius = DELTA_RADIUS; - delta_diagonal_rod = DELTA_DIAGONAL_ROD; - delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND; - delta_tower_angle_trim = dta; - delta_diagonal_rod_trim = ddr; - #endif - - #if ENABLED(X_DUAL_ENDSTOPS) - #ifndef X2_ENDSTOP_ADJUSTMENT - #define X2_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.x2_endstop_adj = X2_ENDSTOP_ADJUSTMENT; - #endif - - #if ENABLED(Y_DUAL_ENDSTOPS) - #ifndef Y2_ENDSTOP_ADJUSTMENT - #define Y2_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.y2_endstop_adj = Y2_ENDSTOP_ADJUSTMENT; - #endif - - #if ENABLED(Z_MULTI_ENDSTOPS) - #ifndef Z2_ENDSTOP_ADJUSTMENT - #define Z2_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.z2_endstop_adj = Z2_ENDSTOP_ADJUSTMENT; - #if NUM_Z_STEPPER_DRIVERS >= 3 - #ifndef Z3_ENDSTOP_ADJUSTMENT - #define Z3_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.z3_endstop_adj = Z3_ENDSTOP_ADJUSTMENT; - #endif - #if NUM_Z_STEPPER_DRIVERS >= 4 - #ifndef Z4_ENDSTOP_ADJUSTMENT - #define Z4_ENDSTOP_ADJUSTMENT 0 - #endif - endstops.z4_endstop_adj = Z4_ENDSTOP_ADJUSTMENT; - #endif - #endif - - // - // Preheat parameters - // - #if PREHEAT_COUNT - #if HAS_HOTEND - constexpr uint16_t hpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_TEMP_HOTEND, PREHEAT_2_TEMP_HOTEND, PREHEAT_3_TEMP_HOTEND, PREHEAT_4_TEMP_HOTEND, PREHEAT_5_TEMP_HOTEND); - #endif - #if HAS_HEATED_BED - constexpr uint16_t bpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_TEMP_BED, PREHEAT_2_TEMP_BED, PREHEAT_3_TEMP_BED, PREHEAT_4_TEMP_BED, PREHEAT_5_TEMP_BED); - #endif - #if HAS_FAN - constexpr uint8_t fpre[] = ARRAY_N(PREHEAT_COUNT, PREHEAT_1_FAN_SPEED, PREHEAT_2_FAN_SPEED, PREHEAT_3_FAN_SPEED, PREHEAT_4_FAN_SPEED, PREHEAT_5_FAN_SPEED); - #endif - LOOP_L_N(i, PREHEAT_COUNT) { - #if HAS_HOTEND - ui.material_preset[i].hotend_temp = hpre[i]; - #endif - #if HAS_HEATED_BED - ui.material_preset[i].bed_temp = bpre[i]; - #endif - #if HAS_FAN - ui.material_preset[i].fan_speed = fpre[i]; - #endif - } - #endif - - // - // Hotend PID - // - - #if ENABLED(PIDTEMP) - #if ENABLED(PID_PARAMS_PER_HOTEND) - constexpr float defKp[] = - #ifdef DEFAULT_Kp_LIST - DEFAULT_Kp_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Kp) - #endif - , defKi[] = - #ifdef DEFAULT_Ki_LIST - DEFAULT_Ki_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Ki) - #endif - , defKd[] = - #ifdef DEFAULT_Kd_LIST - DEFAULT_Kd_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Kd) - #endif - ; - static_assert(WITHIN(COUNT(defKp), 1, HOTENDS), "DEFAULT_Kp_LIST must have between 1 and HOTENDS items."); - static_assert(WITHIN(COUNT(defKi), 1, HOTENDS), "DEFAULT_Ki_LIST must have between 1 and HOTENDS items."); - static_assert(WITHIN(COUNT(defKd), 1, HOTENDS), "DEFAULT_Kd_LIST must have between 1 and HOTENDS items."); - #if ENABLED(PID_EXTRUSION_SCALING) - constexpr float defKc[] = - #ifdef DEFAULT_Kc_LIST - DEFAULT_Kc_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Kc) - #endif - ; - static_assert(WITHIN(COUNT(defKc), 1, HOTENDS), "DEFAULT_Kc_LIST must have between 1 and HOTENDS items."); - #endif - #if ENABLED(PID_FAN_SCALING) - constexpr float defKf[] = - #ifdef DEFAULT_Kf_LIST - DEFAULT_Kf_LIST - #else - ARRAY_BY_HOTENDS1(DEFAULT_Kf) - #endif - ; - static_assert(WITHIN(COUNT(defKf), 1, HOTENDS), "DEFAULT_Kf_LIST must have between 1 and HOTENDS items."); - #endif - #define PID_DEFAULT(N,E) def##N[E] - #else - #define PID_DEFAULT(N,E) DEFAULT_##N - #endif - HOTEND_LOOP() { - PID_PARAM(Kp, e) = float(PID_DEFAULT(Kp, ALIM(e, defKp))); - PID_PARAM(Ki, e) = scalePID_i(PID_DEFAULT(Ki, ALIM(e, defKi))); - PID_PARAM(Kd, e) = scalePID_d(PID_DEFAULT(Kd, ALIM(e, defKd))); - TERN_(PID_EXTRUSION_SCALING, PID_PARAM(Kc, e) = float(PID_DEFAULT(Kc, ALIM(e, defKc)))); - TERN_(PID_FAN_SCALING, PID_PARAM(Kf, e) = float(PID_DEFAULT(Kf, ALIM(e, defKf)))); - } - #endif - - // - // PID Extrusion Scaling - // - TERN_(PID_EXTRUSION_SCALING, thermalManager.lpq_len = 20); // Default last-position-queue size - - // - // Heated Bed PID - // - - #if ENABLED(PIDTEMPBED) - thermalManager.temp_bed.pid.Kp = DEFAULT_bedKp; - thermalManager.temp_bed.pid.Ki = scalePID_i(DEFAULT_bedKi); - thermalManager.temp_bed.pid.Kd = scalePID_d(DEFAULT_bedKd); - #endif - - // - // User-Defined Thermistors - // - TERN_(HAS_USER_THERMISTORS, thermalManager.reset_user_thermistors()); - - // - // Power Monitor - // - TERN_(POWER_MONITOR, power_monitor.reset()); - - // - // LCD Contrast - // - TERN_(HAS_LCD_CONTRAST, ui.set_contrast(DEFAULT_LCD_CONTRAST)); - - // - // Controller Fan - // - TERN_(USE_CONTROLLER_FAN, controllerFan.reset()); - - // - // Power-Loss Recovery - // - TERN_(POWER_LOSS_RECOVERY, recovery.enable(ENABLED(PLR_ENABLED_DEFAULT))); - - // - // Firmware Retraction - // - TERN_(FWRETRACT, fwretract.reset()); - - // - // Volumetric & Filament Size - // - - #if DISABLED(NO_VOLUMETRICS) - parser.volumetric_enabled = ENABLED(VOLUMETRIC_DEFAULT_ON); - LOOP_L_N(q, COUNT(planner.filament_size)) - planner.filament_size[q] = DEFAULT_NOMINAL_FILAMENT_DIA; - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - LOOP_L_N(q, COUNT(planner.volumetric_extruder_limit)) - planner.volumetric_extruder_limit[q] = DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT; - #endif - #endif - - endstops.enable_globally(ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)); - - reset_stepper_drivers(); - - // - // Linear Advance - // - - #if ENABLED(LIN_ADVANCE) - LOOP_L_N(i, EXTRUDERS) { - planner.extruder_advance_K[i] = LIN_ADVANCE_K; - TERN_(EXTRA_LIN_ADVANCE_K, other_extruder_advance_K[i] = LIN_ADVANCE_K); - } - #endif - - // - // Motor Current PWM - // - - #if HAS_MOTOR_CURRENT_PWM - constexpr uint32_t tmp_motor_current_setting[MOTOR_CURRENT_COUNT] = PWM_MOTOR_CURRENT; - LOOP_L_N(q, MOTOR_CURRENT_COUNT) - stepper.set_digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q])); - #endif - - // - // DIGIPOTS - // - #if HAS_MOTOR_CURRENT_SPI - static constexpr uint32_t tmp_motor_current_setting[] = DIGIPOT_MOTOR_CURRENT; - DEBUG_ECHOLNPGM("Writing Digipot"); - LOOP_L_N(q, COUNT(tmp_motor_current_setting)) - stepper.set_digipot_current(q, tmp_motor_current_setting[q]); - DEBUG_ECHOLNPGM("Digipot Written"); - #endif - - // - // CNC Coordinate System - // - TERN_(CNC_COORDINATE_SYSTEMS, (void)gcode.select_coordinate_system(-1)); // Go back to machine space - - // - // Skew Correction - // - #if ENABLED(SKEW_CORRECTION_GCODE) - planner.skew_factor.xy = XY_SKEW_FACTOR; - #if ENABLED(SKEW_CORRECTION_FOR_Z) - planner.skew_factor.xz = XZ_SKEW_FACTOR; - planner.skew_factor.yz = YZ_SKEW_FACTOR; - #endif - #endif - - // - // Advanced Pause filament load & unload lengths - // - #if ENABLED(ADVANCED_PAUSE_FEATURE) - LOOP_L_N(e, EXTRUDERS) { - fc_settings[e].unload_length = FILAMENT_CHANGE_UNLOAD_LENGTH; - fc_settings[e].load_length = FILAMENT_CHANGE_FAST_LOAD_LENGTH; - } - #endif - - #if ENABLED(PASSWORD_FEATURE) - #ifdef PASSWORD_DEFAULT_VALUE - password.is_set = true; - password.value = PASSWORD_DEFAULT_VALUE; - #else - password.is_set = false; - #endif - #endif - - postprocess(); - - DEBUG_ECHO_START(); - DEBUG_ECHOLNPGM("Hardcoded Default Settings Loaded"); - - TERN_(EXTENSIBLE_UI, ExtUI::onFactoryReset()); -} - -#if DISABLED(DISABLE_M503) - - static void config_heading(const bool repl, PGM_P const pstr, const bool eol=true) { - if (!repl) { - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("; "); - serialprintPGM(pstr); - if (eol) SERIAL_EOL(); - } - } - - #define CONFIG_ECHO_START() do{ if (!forReplay) SERIAL_ECHO_START(); }while(0) - #define CONFIG_ECHO_MSG(STR) do{ CONFIG_ECHO_START(); SERIAL_ECHOLNPGM(STR); }while(0) - #define CONFIG_ECHO_HEADING(STR) config_heading(forReplay, PSTR(STR)) - - #if HAS_TRINAMIC_CONFIG - inline void say_M906(const bool forReplay) { CONFIG_ECHO_START(); SERIAL_ECHOPGM(" M906"); } - #if HAS_STEALTHCHOP - void say_M569(const bool forReplay, const char * const etc=nullptr, const bool newLine = false) { - CONFIG_ECHO_START(); - SERIAL_ECHOPGM(" M569 S1"); - if (etc) { - SERIAL_CHAR(' '); - serialprintPGM(etc); - } - if (newLine) SERIAL_EOL(); - } - #endif - #if ENABLED(HYBRID_THRESHOLD) - inline void say_M913(const bool forReplay) { CONFIG_ECHO_START(); SERIAL_ECHOPGM(" M913"); } - #endif - #if USE_SENSORLESS - inline void say_M914() { SERIAL_ECHOPGM(" M914"); } - #endif - #endif - - #if ENABLED(ADVANCED_PAUSE_FEATURE) - inline void say_M603(const bool forReplay) { CONFIG_ECHO_START(); SERIAL_ECHOPGM(" M603 "); } - #endif - - inline void say_units(const bool colon) { - serialprintPGM( - #if ENABLED(INCH_MODE_SUPPORT) - parser.linear_unit_factor != 1.0 ? PSTR(" (in)") : - #endif - PSTR(" (mm)") - ); - if (colon) SERIAL_ECHOLNPGM(":"); - } - - void report_M92(const bool echo=true, const int8_t e=-1); - - /** - * M503 - Report current settings in RAM - * - * Unless specifically disabled, M503 is available even without EEPROM - */ - void MarlinSettings::report(const bool forReplay) { - /** - * Announce current units, in case inches are being displayed - */ - CONFIG_ECHO_START(); - #if ENABLED(INCH_MODE_SUPPORT) - SERIAL_ECHOPGM(" G2"); - SERIAL_CHAR(parser.linear_unit_factor == 1.0 ? '1' : '0'); - SERIAL_ECHOPGM(" ;"); - say_units(false); - #else - SERIAL_ECHOPGM(" G21 ; Units in mm"); - say_units(false); - #endif - SERIAL_EOL(); - - #if HAS_LCD_MENU - - // Temperature units - for Ultipanel temperature options - - CONFIG_ECHO_START(); - #if ENABLED(TEMPERATURE_UNITS_SUPPORT) - SERIAL_ECHOPGM(" M149 "); - SERIAL_CHAR(parser.temp_units_code()); - SERIAL_ECHOPGM(" ; Units in "); - serialprintPGM(parser.temp_units_name()); - #else - SERIAL_ECHOLNPGM(" M149 C ; Units in Celsius"); - #endif - - #endif - - SERIAL_EOL(); - - #if EXTRUDERS && DISABLED(NO_VOLUMETRICS) - - /** - * Volumetric extrusion M200 - */ - if (!forReplay) { - config_heading(forReplay, PSTR("Filament settings:"), false); - if (parser.volumetric_enabled) - SERIAL_EOL(); - else - SERIAL_ECHOLNPGM(" Disabled"); - } - - #if EXTRUDERS == 1 - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M200 S", int(parser.volumetric_enabled) - , " D", LINEAR_UNIT(planner.filament_size[0]) - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[0]) - #endif - ); - #else - LOOP_L_N(i, EXTRUDERS) { - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M200 T", int(i) - , " D", LINEAR_UNIT(planner.filament_size[i]) - #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[i]) - #endif - ); - } - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M200 S", int(parser.volumetric_enabled)); - #endif - #endif // EXTRUDERS && !NO_VOLUMETRICS - - CONFIG_ECHO_HEADING("Steps per unit:"); - report_M92(!forReplay); - - CONFIG_ECHO_HEADING("Maximum feedrates (units/s):"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M203 X"), LINEAR_UNIT(planner.settings.max_feedrate_mm_s[X_AXIS]) - , SP_Y_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Y_AXIS]) - , SP_Z_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Z_AXIS]) - #if DISABLED(DISTINCT_E_FACTORS) - , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS]) - #endif - ); - #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(i, E_STEPPERS) { - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M203 T"), (int)i - , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS_N(i)]) - ); - } - #endif - - CONFIG_ECHO_HEADING("Maximum Acceleration (units/s2):"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M201 X"), LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[X_AXIS]) - , SP_Y_STR, LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Y_AXIS]) - , SP_Z_STR, LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Z_AXIS]) - #if DISABLED(DISTINCT_E_FACTORS) - , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS]) - #endif - ); - #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(i, E_STEPPERS) { - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M201 T"), (int)i - , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(i)]) - ); - } - #endif - - CONFIG_ECHO_HEADING("Acceleration (units/s2): P R T"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M204 P"), LINEAR_UNIT(planner.settings.acceleration) - , PSTR(" R"), LINEAR_UNIT(planner.settings.retract_acceleration) - , SP_T_STR, LINEAR_UNIT(planner.settings.travel_acceleration) - ); - - CONFIG_ECHO_HEADING( - "Advanced: B S T" - #if HAS_JUNCTION_DEVIATION - " J" - #endif - #if HAS_CLASSIC_JERK - " X Y Z" - TERN_(HAS_CLASSIC_E_JERK, " E") - #endif - ); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M205 B"), LINEAR_UNIT(planner.settings.min_segment_time_us) - , PSTR(" S"), LINEAR_UNIT(planner.settings.min_feedrate_mm_s) - , SP_T_STR, LINEAR_UNIT(planner.settings.min_travel_feedrate_mm_s) - #if HAS_JUNCTION_DEVIATION - , PSTR(" J"), LINEAR_UNIT(planner.junction_deviation_mm) - #endif - #if HAS_CLASSIC_JERK - , SP_X_STR, LINEAR_UNIT(planner.max_jerk.x) - , SP_Y_STR, LINEAR_UNIT(planner.max_jerk.y) - , SP_Z_STR, LINEAR_UNIT(planner.max_jerk.z) - #if HAS_CLASSIC_E_JERK - , SP_E_STR, LINEAR_UNIT(planner.max_jerk.e) - #endif - #endif - ); - - #if HAS_M206_COMMAND - CONFIG_ECHO_HEADING("Home offset:"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - #if IS_CARTESIAN - PSTR(" M206 X"), LINEAR_UNIT(home_offset.x) - , SP_Y_STR, LINEAR_UNIT(home_offset.y) - , SP_Z_STR - #else - PSTR(" M206 Z") - #endif - , LINEAR_UNIT(home_offset.z) - ); - #endif - - #if HAS_HOTEND_OFFSET - CONFIG_ECHO_HEADING("Hotend offsets:"); - CONFIG_ECHO_START(); - LOOP_S_L_N(e, 1, HOTENDS) { - SERIAL_ECHOPAIR_P( - PSTR(" M218 T"), (int)e, - SP_X_STR, LINEAR_UNIT(hotend_offset[e].x), - SP_Y_STR, LINEAR_UNIT(hotend_offset[e].y) - ); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(hotend_offset[e].z), 3); - } - #endif - - /** - * Bed Leveling - */ - #if HAS_LEVELING - - #if ENABLED(MESH_BED_LEVELING) - - CONFIG_ECHO_HEADING("Mesh Bed Leveling:"); - - #elif ENABLED(AUTO_BED_LEVELING_UBL) - - config_heading(forReplay, PSTR(""), false); - if (!forReplay) { - ubl.echo_name(); - SERIAL_CHAR(':'); - SERIAL_EOL(); - } - - #elif HAS_ABL_OR_UBL - - CONFIG_ECHO_HEADING("Auto Bed Leveling:"); - - #endif - - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M420 S"), planner.leveling_active ? 1 : 0 - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - , SP_Z_STR, LINEAR_UNIT(planner.z_fade_height) - #endif - ); - - #if ENABLED(MESH_BED_LEVELING) - - if (leveling_is_valid()) { - LOOP_L_N(py, GRID_MAX_POINTS_Y) { - LOOP_L_N(px, GRID_MAX_POINTS_X) { - CONFIG_ECHO_START(); - SERIAL_ECHOPAIR_P(PSTR(" G29 S3 I"), (int)px, PSTR(" J"), (int)py); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(mbl.z_values[px][py]), 5); - } - } - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_F_P(PSTR(" G29 S4 Z"), LINEAR_UNIT(mbl.z_offset), 5); - } - - #elif ENABLED(AUTO_BED_LEVELING_UBL) - - if (!forReplay) { - SERIAL_EOL(); - ubl.report_state(); - SERIAL_EOL(); - config_heading(false, PSTR("Active Mesh Slot: "), false); - SERIAL_ECHOLN(ubl.storage_slot); - config_heading(false, PSTR("EEPROM can hold "), false); - SERIAL_ECHO(calc_num_meshes()); - SERIAL_ECHOLNPGM(" meshes.\n"); - } - - //ubl.report_current_mesh(); // This is too verbose for large meshes. A better (more terse) - // solution needs to be found. - #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - - if (leveling_is_valid()) { - LOOP_L_N(py, GRID_MAX_POINTS_Y) { - LOOP_L_N(px, GRID_MAX_POINTS_X) { - CONFIG_ECHO_START(); - SERIAL_ECHOPAIR(" G29 W I", (int)px, " J", (int)py); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(z_values[px][py]), 5); - } - } - } - - #endif - - #endif // HAS_LEVELING - - #if ENABLED(EDITABLE_SERVO_ANGLES) - - CONFIG_ECHO_HEADING("Servo Angles:"); - LOOP_L_N(i, NUM_SERVOS) { - switch (i) { - #if ENABLED(SWITCHING_EXTRUDER) - case SWITCHING_EXTRUDER_SERVO_NR: - #if EXTRUDERS > 3 - case SWITCHING_EXTRUDER_E23_SERVO_NR: - #endif - #elif ENABLED(SWITCHING_NOZZLE) - case SWITCHING_NOZZLE_SERVO_NR: - #elif ENABLED(BLTOUCH) || (HAS_Z_SERVO_PROBE && defined(Z_SERVO_ANGLES)) - case Z_PROBE_SERVO_NR: - #endif - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M281 P", int(i), " L", servo_angles[i][0], " U", servo_angles[i][1]); - default: break; - } - } - - #endif // EDITABLE_SERVO_ANGLES - - #if HAS_SCARA_OFFSET - - CONFIG_ECHO_HEADING("SCARA settings: S P T"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M665 S"), delta_segments_per_second - , SP_P_STR, scara_home_offset.a - , SP_T_STR, scara_home_offset.b - , SP_Z_STR, LINEAR_UNIT(scara_home_offset.z) - ); - - #elif ENABLED(DELTA) - - CONFIG_ECHO_HEADING("Endstop adjustment:"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M666 X"), LINEAR_UNIT(delta_endstop_adj.a) - , SP_Y_STR, LINEAR_UNIT(delta_endstop_adj.b) - , SP_Z_STR, LINEAR_UNIT(delta_endstop_adj.c) - ); - - CONFIG_ECHO_HEADING("Delta settings: L R H S XYZ ABC"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M665 L"), LINEAR_UNIT(delta_diagonal_rod) - , PSTR(" R"), LINEAR_UNIT(delta_radius) - , PSTR(" H"), LINEAR_UNIT(delta_height) - , PSTR(" S"), delta_segments_per_second - , SP_X_STR, LINEAR_UNIT(delta_tower_angle_trim.a) - , SP_Y_STR, LINEAR_UNIT(delta_tower_angle_trim.b) - , SP_Z_STR, LINEAR_UNIT(delta_tower_angle_trim.c) - , PSTR(" A"), LINEAR_UNIT(delta_diagonal_rod_trim.a) - , PSTR(" B"), LINEAR_UNIT(delta_diagonal_rod_trim.b) - , PSTR(" C"), LINEAR_UNIT(delta_diagonal_rod_trim.c) - ); - - #elif HAS_EXTRA_ENDSTOPS - - CONFIG_ECHO_HEADING("Endstop adjustment:"); - CONFIG_ECHO_START(); - SERIAL_ECHOPGM(" M666"); - #if ENABLED(X_DUAL_ENDSTOPS) - SERIAL_ECHOLNPAIR_P(SP_X_STR, LINEAR_UNIT(endstops.x2_endstop_adj)); - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - SERIAL_ECHOLNPAIR_P(SP_Y_STR, LINEAR_UNIT(endstops.y2_endstop_adj)); - #endif - #if ENABLED(Z_MULTI_ENDSTOPS) - #if NUM_Z_STEPPER_DRIVERS >= 3 - SERIAL_ECHOPAIR(" S2 Z", LINEAR_UNIT(endstops.z3_endstop_adj)); - CONFIG_ECHO_START(); - SERIAL_ECHOPAIR(" M666 S3 Z", LINEAR_UNIT(endstops.z3_endstop_adj)); - #if NUM_Z_STEPPER_DRIVERS >= 4 - CONFIG_ECHO_START(); - SERIAL_ECHOPAIR(" M666 S4 Z", LINEAR_UNIT(endstops.z4_endstop_adj)); - #endif - #else - SERIAL_ECHOLNPAIR_P(SP_Z_STR, LINEAR_UNIT(endstops.z2_endstop_adj)); - #endif - #endif - - #endif // [XYZ]_DUAL_ENDSTOPS - - #if PREHEAT_COUNT - - CONFIG_ECHO_HEADING("Material heatup parameters:"); - LOOP_L_N(i, PREHEAT_COUNT) { - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M145 S"), (int)i - #if HAS_HOTEND - , PSTR(" H"), TEMP_UNIT(ui.material_preset[i].hotend_temp) - #endif - #if HAS_HEATED_BED - , SP_B_STR, TEMP_UNIT(ui.material_preset[i].bed_temp) - #endif - #if HAS_FAN - , PSTR(" F"), ui.material_preset[i].fan_speed - #endif - ); - } - - #endif - - #if HAS_PID_HEATING - - CONFIG_ECHO_HEADING("PID settings:"); - - #if ENABLED(PIDTEMP) - HOTEND_LOOP() { - CONFIG_ECHO_START(); - SERIAL_ECHOPAIR_P( - #if ENABLED(PID_PARAMS_PER_HOTEND) - PSTR(" M301 E"), e, - SP_P_STR - #else - PSTR(" M301 P") - #endif - , PID_PARAM(Kp, e) - , PSTR(" I"), unscalePID_i(PID_PARAM(Ki, e)) - , PSTR(" D"), unscalePID_d(PID_PARAM(Kd, e)) - ); - #if ENABLED(PID_EXTRUSION_SCALING) - SERIAL_ECHOPAIR_P(SP_C_STR, PID_PARAM(Kc, e)); - if (e == 0) SERIAL_ECHOPAIR(" L", thermalManager.lpq_len); - #endif - #if ENABLED(PID_FAN_SCALING) - SERIAL_ECHOPAIR(" F", PID_PARAM(Kf, e)); - #endif - SERIAL_EOL(); - } - #endif // PIDTEMP - - #if ENABLED(PIDTEMPBED) - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR( - " M304 P", thermalManager.temp_bed.pid.Kp - , " I", unscalePID_i(thermalManager.temp_bed.pid.Ki) - , " D", unscalePID_d(thermalManager.temp_bed.pid.Kd) - ); - #endif - - #endif // PIDTEMP || PIDTEMPBED - - #if HAS_USER_THERMISTORS - CONFIG_ECHO_HEADING("User thermistors:"); - LOOP_L_N(i, USER_THERMISTORS) - thermalManager.log_user_thermistor(i, true); - #endif - - #if HAS_LCD_CONTRAST - CONFIG_ECHO_HEADING("LCD Contrast:"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M250 C", ui.contrast); - #endif - - TERN_(CONTROLLER_FAN_EDITABLE, M710_report(forReplay)); - - #if ENABLED(POWER_LOSS_RECOVERY) - CONFIG_ECHO_HEADING("Power-Loss Recovery:"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M413 S", int(recovery.enabled)); - #endif - - #if ENABLED(FWRETRACT) - - CONFIG_ECHO_HEADING("Retract: S F Z"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M207 S"), LINEAR_UNIT(fwretract.settings.retract_length) - , PSTR(" W"), LINEAR_UNIT(fwretract.settings.swap_retract_length) - , PSTR(" F"), LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_feedrate_mm_s)) - , SP_Z_STR, LINEAR_UNIT(fwretract.settings.retract_zraise) - ); - - CONFIG_ECHO_HEADING("Recover: S F"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR( - " M208 S", LINEAR_UNIT(fwretract.settings.retract_recover_extra) - , " W", LINEAR_UNIT(fwretract.settings.swap_retract_recover_extra) - , " F", LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_recover_feedrate_mm_s)) - ); - - #if ENABLED(FWRETRACT_AUTORETRACT) - - CONFIG_ECHO_HEADING("Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M209 S", fwretract.autoretract_enabled ? 1 : 0); - - #endif // FWRETRACT_AUTORETRACT - - #endif // FWRETRACT - - /** - * Probe Offset - */ - #if HAS_BED_PROBE - config_heading(forReplay, PSTR("Z-Probe Offset"), false); - if (!forReplay) say_units(true); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - #if HAS_PROBE_XY_OFFSET - PSTR(" M851 X"), LINEAR_UNIT(probe.offset_xy.x), - SP_Y_STR, LINEAR_UNIT(probe.offset_xy.y), - SP_Z_STR - #else - PSTR(" M851 X0 Y0 Z") - #endif - , LINEAR_UNIT(probe.offset.z) - ); - #endif - - /** - * Bed Skew Correction - */ - #if ENABLED(SKEW_CORRECTION_GCODE) - CONFIG_ECHO_HEADING("Skew Factor: "); - CONFIG_ECHO_START(); - #if ENABLED(SKEW_CORRECTION_FOR_Z) - SERIAL_ECHOPAIR_F(" M852 I", LINEAR_UNIT(planner.skew_factor.xy), 6); - SERIAL_ECHOPAIR_F(" J", LINEAR_UNIT(planner.skew_factor.xz), 6); - SERIAL_ECHOLNPAIR_F(" K", LINEAR_UNIT(planner.skew_factor.yz), 6); - #else - SERIAL_ECHOLNPAIR_F(" M852 S", LINEAR_UNIT(planner.skew_factor.xy), 6); - #endif - #endif - - #if HAS_TRINAMIC_CONFIG - - /** - * TMC stepper driver current - */ - CONFIG_ECHO_HEADING("Stepper driver current:"); - - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) - say_M906(forReplay); - #if AXIS_IS_TMC(X) - SERIAL_ECHOPAIR_P(SP_X_STR, stepperX.getMilliamps()); - #endif - #if AXIS_IS_TMC(Y) - SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY.getMilliamps()); - #endif - #if AXIS_IS_TMC(Z) - SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ.getMilliamps()); - #endif - SERIAL_EOL(); - #endif - - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) - say_M906(forReplay); - SERIAL_ECHOPGM(" I1"); - #if AXIS_IS_TMC(X2) - SERIAL_ECHOPAIR_P(SP_X_STR, stepperX2.getMilliamps()); - #endif - #if AXIS_IS_TMC(Y2) - SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY2.getMilliamps()); - #endif - #if AXIS_IS_TMC(Z2) - SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ2.getMilliamps()); - #endif - SERIAL_EOL(); - #endif - - #if AXIS_IS_TMC(Z3) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" I2 Z", stepperZ3.getMilliamps()); - #endif - - #if AXIS_IS_TMC(Z4) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" I3 Z", stepperZ4.getMilliamps()); - #endif - - #if AXIS_IS_TMC(E0) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" T0 E", stepperE0.getMilliamps()); - #endif - #if AXIS_IS_TMC(E1) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" T1 E", stepperE1.getMilliamps()); - #endif - #if AXIS_IS_TMC(E2) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" T2 E", stepperE2.getMilliamps()); - #endif - #if AXIS_IS_TMC(E3) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" T3 E", stepperE3.getMilliamps()); - #endif - #if AXIS_IS_TMC(E4) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" T4 E", stepperE4.getMilliamps()); - #endif - #if AXIS_IS_TMC(E5) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" T5 E", stepperE5.getMilliamps()); - #endif - #if AXIS_IS_TMC(E6) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" T6 E", stepperE6.getMilliamps()); - #endif - #if AXIS_IS_TMC(E7) - say_M906(forReplay); - SERIAL_ECHOLNPAIR(" T7 E", stepperE7.getMilliamps()); - #endif - SERIAL_EOL(); - - /** - * TMC Hybrid Threshold - */ - #if ENABLED(HYBRID_THRESHOLD) - CONFIG_ECHO_HEADING("Hybrid Threshold:"); - #if AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Z) - say_M913(forReplay); - #if AXIS_HAS_STEALTHCHOP(X) - SERIAL_ECHOPAIR_P(SP_X_STR, stepperX.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ.get_pwm_thrs()); - #endif - SERIAL_EOL(); - #endif - - #if AXIS_HAS_STEALTHCHOP(X2) || AXIS_HAS_STEALTHCHOP(Y2) || AXIS_HAS_STEALTHCHOP(Z2) - say_M913(forReplay); - SERIAL_ECHOPGM(" I1"); - #if AXIS_HAS_STEALTHCHOP(X2) - SERIAL_ECHOPAIR_P(SP_X_STR, stepperX2.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY2.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ2.get_pwm_thrs()); - #endif - SERIAL_EOL(); - #endif - - #if AXIS_HAS_STEALTHCHOP(Z3) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" I2 Z", stepperZ3.get_pwm_thrs()); - #endif - - #if AXIS_HAS_STEALTHCHOP(Z4) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" I3 Z", stepperZ4.get_pwm_thrs()); - #endif - - #if AXIS_HAS_STEALTHCHOP(E0) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" T0 E", stepperE0.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" T1 E", stepperE1.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" T2 E", stepperE2.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" T3 E", stepperE3.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" T4 E", stepperE4.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" T5 E", stepperE5.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(E6) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" T6 E", stepperE6.get_pwm_thrs()); - #endif - #if AXIS_HAS_STEALTHCHOP(E7) - say_M913(forReplay); - SERIAL_ECHOLNPAIR(" T7 E", stepperE7.get_pwm_thrs()); - #endif - SERIAL_EOL(); - #endif // HYBRID_THRESHOLD - - /** - * TMC Sensorless homing thresholds - */ - #if USE_SENSORLESS - CONFIG_ECHO_HEADING("StallGuard threshold:"); - #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS - CONFIG_ECHO_START(); - say_M914(); - #if X_SENSORLESS - SERIAL_ECHOPAIR_P(SP_X_STR, stepperX.homing_threshold()); - #endif - #if Y_SENSORLESS - SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY.homing_threshold()); - #endif - #if Z_SENSORLESS - SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ.homing_threshold()); - #endif - SERIAL_EOL(); - #endif - - #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS - CONFIG_ECHO_START(); - say_M914(); - SERIAL_ECHOPGM(" I1"); - #if X2_SENSORLESS - SERIAL_ECHOPAIR_P(SP_X_STR, stepperX2.homing_threshold()); - #endif - #if Y2_SENSORLESS - SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY2.homing_threshold()); - #endif - #if Z2_SENSORLESS - SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ2.homing_threshold()); - #endif - SERIAL_EOL(); - #endif - - #if Z3_SENSORLESS - CONFIG_ECHO_START(); - say_M914(); - SERIAL_ECHOLNPAIR(" I2 Z", stepperZ3.homing_threshold()); - #endif - - #if Z4_SENSORLESS - CONFIG_ECHO_START(); - say_M914(); - SERIAL_ECHOLNPAIR(" I3 Z", stepperZ4.homing_threshold()); - #endif - - #endif // USE_SENSORLESS - - /** - * TMC stepping mode - */ - #if HAS_STEALTHCHOP - CONFIG_ECHO_HEADING("Driver stepping mode:"); - #if AXIS_HAS_STEALTHCHOP(X) - const bool chop_x = stepperX.get_stored_stealthChop_status(); - #else - constexpr bool chop_x = false; - #endif - #if AXIS_HAS_STEALTHCHOP(Y) - const bool chop_y = stepperY.get_stored_stealthChop_status(); - #else - constexpr bool chop_y = false; - #endif - #if AXIS_HAS_STEALTHCHOP(Z) - const bool chop_z = stepperZ.get_stored_stealthChop_status(); - #else - constexpr bool chop_z = false; - #endif - - if (chop_x || chop_y || chop_z) { - say_M569(forReplay); - if (chop_x) SERIAL_ECHOPGM_P(SP_X_STR); - if (chop_y) SERIAL_ECHOPGM_P(SP_Y_STR); - if (chop_z) SERIAL_ECHOPGM_P(SP_Z_STR); - SERIAL_EOL(); - } - - #if AXIS_HAS_STEALTHCHOP(X2) - const bool chop_x2 = stepperX2.get_stored_stealthChop_status(); - #else - constexpr bool chop_x2 = false; - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - const bool chop_y2 = stepperY2.get_stored_stealthChop_status(); - #else - constexpr bool chop_y2 = false; - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - const bool chop_z2 = stepperZ2.get_stored_stealthChop_status(); - #else - constexpr bool chop_z2 = false; - #endif - - if (chop_x2 || chop_y2 || chop_z2) { - say_M569(forReplay, PSTR("I1")); - if (chop_x2) SERIAL_ECHOPGM_P(SP_X_STR); - if (chop_y2) SERIAL_ECHOPGM_P(SP_Y_STR); - if (chop_z2) SERIAL_ECHOPGM_P(SP_Z_STR); - SERIAL_EOL(); - } - - #if AXIS_HAS_STEALTHCHOP(Z3) - if (stepperZ3.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("I2 Z"), true); } - #endif - - #if AXIS_HAS_STEALTHCHOP(Z4) - if (stepperZ4.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("I3 Z"), true); } - #endif - - #if AXIS_HAS_STEALTHCHOP(E0) - if (stepperE0.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T0 E"), true); } - #endif - #if AXIS_HAS_STEALTHCHOP(E1) - if (stepperE1.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T1 E"), true); } - #endif - #if AXIS_HAS_STEALTHCHOP(E2) - if (stepperE2.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T2 E"), true); } - #endif - #if AXIS_HAS_STEALTHCHOP(E3) - if (stepperE3.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T3 E"), true); } - #endif - #if AXIS_HAS_STEALTHCHOP(E4) - if (stepperE4.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T4 E"), true); } - #endif - #if AXIS_HAS_STEALTHCHOP(E5) - if (stepperE5.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T5 E"), true); } - #endif - #if AXIS_HAS_STEALTHCHOP(E6) - if (stepperE6.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T6 E"), true); } - #endif - #if AXIS_HAS_STEALTHCHOP(E7) - if (stepperE7.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T7 E"), true); } - #endif - - #endif // HAS_STEALTHCHOP - - #endif // HAS_TRINAMIC_CONFIG - - /** - * Linear Advance - */ - #if ENABLED(LIN_ADVANCE) - CONFIG_ECHO_HEADING("Linear Advance:"); - #if EXTRUDERS < 2 - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M900 K", planner.extruder_advance_K[0]); - #else - LOOP_L_N(i, EXTRUDERS) { - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR(" M900 T", int(i), " K", planner.extruder_advance_K[i]); - } - #endif - #endif - - #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM - CONFIG_ECHO_HEADING("Stepper motor currents:"); - CONFIG_ECHO_START(); - #if HAS_MOTOR_CURRENT_PWM - SERIAL_ECHOLNPAIR_P( - PSTR(" M907 X"), stepper.motor_current_setting[0] - , SP_Z_STR, stepper.motor_current_setting[1] - , SP_E_STR, stepper.motor_current_setting[2] - ); - #elif HAS_MOTOR_CURRENT_SPI - SERIAL_ECHOPGM(" M907"); - LOOP_L_N(q, MOTOR_CURRENT_COUNT) { - SERIAL_CHAR(' '); - SERIAL_CHAR(axis_codes[q]); - SERIAL_ECHO(stepper.motor_current_setting[q]); - } - #endif - #endif - - /** - * Advanced Pause filament load & unload lengths - */ - #if ENABLED(ADVANCED_PAUSE_FEATURE) - CONFIG_ECHO_HEADING("Filament load/unload lengths:"); - #if EXTRUDERS == 1 - say_M603(forReplay); - SERIAL_ECHOLNPAIR("L", LINEAR_UNIT(fc_settings[0].load_length), " U", LINEAR_UNIT(fc_settings[0].unload_length)); - #else - #define _ECHO_603(N) do{ say_M603(forReplay); SERIAL_ECHOLNPAIR("T" STRINGIFY(N) " L", LINEAR_UNIT(fc_settings[N].load_length), " U", LINEAR_UNIT(fc_settings[N].unload_length)); }while(0); - REPEAT(EXTRUDERS, _ECHO_603) - #endif - #endif - - #if HAS_MULTI_EXTRUDER - CONFIG_ECHO_HEADING("Tool-changing:"); - CONFIG_ECHO_START(); - M217_report(true); - #endif - - #if ENABLED(BACKLASH_GCODE) - CONFIG_ECHO_HEADING("Backlash compensation:"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M425 F"), backlash.get_correction() - , SP_X_STR, LINEAR_UNIT(backlash.distance_mm.x) - , SP_Y_STR, LINEAR_UNIT(backlash.distance_mm.y) - , SP_Z_STR, LINEAR_UNIT(backlash.distance_mm.z) - #ifdef BACKLASH_SMOOTHING_MM - , PSTR(" S"), LINEAR_UNIT(backlash.smoothing_mm) - #endif - ); - #endif - - #if HAS_FILAMENT_SENSOR - CONFIG_ECHO_HEADING("Filament runout sensor:"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR( - " M412 S", int(runout.enabled) - #if HAS_FILAMENT_RUNOUT_DISTANCE - , " D", LINEAR_UNIT(runout.runout_distance()) - #endif - ); - #endif - } - -#endif // !DISABLE_M503 - -#pragma pack(pop) diff --git a/Marlin/src/module/settings.h b/Marlin/src/module/settings.h deleted file mode 100644 index b213de93a4..0000000000 --- a/Marlin/src/module/settings.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// -// settings.cpp - Settings and EEPROM storage -// - -#include "../inc/MarlinConfig.h" - -#if ENABLED(EEPROM_SETTINGS) - #include "../HAL/shared/eeprom_api.h" -#endif - -class MarlinSettings { - public: - static uint16_t datasize(); - - static void reset(); - static bool save(); // Return 'true' if data was saved - - FORCE_INLINE static bool init_eeprom() { - reset(); - #if ENABLED(EEPROM_SETTINGS) - const bool success = save(); - if (TERN0(EEPROM_CHITCHAT, success)) report(); - return success; - #else - return true; - #endif - } - - #if ENABLED(SD_FIRMWARE_UPDATE) - static bool sd_update_status(); // True if the SD-Firmware-Update EEPROM flag is set - static bool set_sd_update_status(const bool enable); // Return 'true' after EEPROM is set (-> always true) - #endif - - #if ENABLED(EEPROM_SETTINGS) - - static bool load(); // Return 'true' if data was loaded ok - static bool validate(); // Return 'true' if EEPROM data is ok - - static inline void first_load() { - static bool loaded = false; - if (!loaded && load()) loaded = true; - } - - #if ENABLED(AUTO_BED_LEVELING_UBL) // Eventually make these available if any leveling system - // That can store is enabled - static uint16_t meshes_start_index(); - FORCE_INLINE static uint16_t meshes_end_index() { return meshes_end; } - static uint16_t calc_num_meshes(); - static int mesh_slot_offset(const int8_t slot); - static void store_mesh(const int8_t slot); - static void load_mesh(const int8_t slot, void * const into=nullptr); - - //static void delete_mesh(); // necessary if we have a MAT - //static void defrag_meshes(); // " - #endif - #else - FORCE_INLINE - static bool load() { reset(); report(); return true; } - FORCE_INLINE - static void first_load() { (void)load(); } - #endif - - #if DISABLED(DISABLE_M503) - static void report(const bool forReplay=false); - #else - FORCE_INLINE - static void report(const bool=false) {} - #endif - - private: - static void postprocess(); - - #if ENABLED(EEPROM_SETTINGS) - - static bool eeprom_error, validating; - - #if ENABLED(AUTO_BED_LEVELING_UBL) // Eventually make these available if any leveling system - // That can store is enabled - static const uint16_t meshes_end; // 128 is a placeholder for the size of the MAT; the MAT will always - // live at the very end of the eeprom - #endif - - static bool _load(); - static bool size_error(const uint16_t size); - #endif -}; - -extern MarlinSettings settings; diff --git a/Marlin/src/module/speed_lookuptable.h b/Marlin/src/module/speed_lookuptable.h index b173ebec08..c251a7ffc1 100644 --- a/Marlin/src/module/speed_lookuptable.h +++ b/Marlin/src/module/speed_lookuptable.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef SPEED_LOOKUPTABLE_H +#define SPEED_LOOKUPTABLE_H #if F_CPU == 16000000 @@ -166,3 +168,5 @@ }; #endif + +#endif // SPEED_LOOKUPTABLE_H diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 8a5de4b608..bff01abae0 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -38,7 +38,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Grbl. If not, see . + * along with Grbl. If not, see . */ /** @@ -79,10 +79,6 @@ #include "stepper.h" -Stepper stepper; // Singleton - -#define BABYSTEPPING_EXTRA_DIR_WAIT - #ifdef __AVR__ #include "speed_lookuptable.h" #endif @@ -91,71 +87,44 @@ Stepper stepper; // Singleton #include "planner.h" #include "motion.h" -#include "temperature.h" +#include "../module/temperature.h" #include "../lcd/ultralcd.h" +#include "../core/language.h" #include "../gcode/queue.h" #include "../sd/cardreader.h" -#include "../MarlinCore.h" +#include "../Marlin.h" #include "../HAL/shared/Delay.h" -#if ENABLED(INTEGRATED_BABYSTEPPING) - #include "../feature/babystep.h" -#endif - #if MB(ALLIGATOR) #include "../feature/dac/dac_dac084s085.h" #endif -#if HAS_MOTOR_CURRENT_SPI +#if HAS_DIGIPOTSS #include #endif -#if ENABLED(MIXING_EXTRUDER) - #include "../feature/mixing.h" -#endif - -#if HAS_FILAMENT_RUNOUT_DISTANCE - #include "../feature/runout.h" -#endif - -#if HAS_L64XX - #include "../libs/L64XX/L64XX_Marlin.h" - uint8_t L6470_buf[MAX_L64XX + 1]; // chip command sequence - element 0 not used - bool L64XX_OK_to_power_up = false; // flag to keep L64xx steppers powered down after a reset or power up -#endif - -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../feature/powerloss.h" -#endif - -#if HAS_CUTTER - #include "../feature/spindle_laser.h" -#endif +Stepper stepper; // Singleton // public: -#if EITHER(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) - bool Stepper::separate_multi_axis = false; +#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + bool Stepper::homing_dual_axis = false; #endif -#if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM - bool Stepper::initialized; // = false - uint32_t Stepper::motor_current_setting[MOTOR_CURRENT_COUNT]; // Initialized by settings.load() - #if HAS_MOTOR_CURRENT_SPI - constexpr uint32_t Stepper::digipot_count[]; - #endif +#if HAS_MOTOR_CURRENT_PWM + uint32_t Stepper::motor_current_setting[3]; // Initialized by settings.load() #endif // private: -block_t* Stepper::current_block; // (= nullptr) A pointer to the block currently being traced +block_t* Stepper::current_block = NULL; // A pointer to the block currently being traced -uint8_t Stepper::last_direction_bits, // = 0 - Stepper::axis_did_move; // = 0 +uint8_t Stepper::last_direction_bits = 0, + Stepper::axis_did_move; bool Stepper::abort_current_block; -#if DISABLED(MIXING_EXTRUDER) && HAS_MULTI_EXTRUDER +#if DISABLED(MIXING_EXTRUDER) uint8_t Stepper::last_moved_extruder = 0xFF; #endif @@ -165,36 +134,33 @@ bool Stepper::abort_current_block; #if ENABLED(Y_DUAL_ENDSTOPS) bool Stepper::locked_Y_motor = false, Stepper::locked_Y2_motor = false; #endif - -#if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) - bool Stepper::locked_Z_motor = false, Stepper::locked_Z2_motor = false - #if NUM_Z_STEPPER_DRIVERS >= 3 - , Stepper::locked_Z3_motor = false - #if NUM_Z_STEPPER_DRIVERS >= 4 - , Stepper::locked_Z4_motor = false - #endif - #endif - ; +#if ENABLED(Z_DUAL_ENDSTOPS) + bool Stepper::locked_Z_motor = false, Stepper::locked_Z2_motor = false; #endif uint32_t Stepper::acceleration_time, Stepper::deceleration_time; uint8_t Stepper::steps_per_isr; -TERN(ADAPTIVE_STEP_SMOOTHING,,constexpr) uint8_t Stepper::oversampling_factor; +#if DISABLED(ADAPTIVE_STEP_SMOOTHING) + constexpr +#endif + uint8_t Stepper::oversampling_factor; -xyze_long_t Stepper::delta_error{0}; +int32_t Stepper::delta_error[XYZE] = { 0 }; -xyze_ulong_t Stepper::advance_dividend{0}; -uint32_t Stepper::advance_divisor = 0, +uint32_t Stepper::advance_dividend[XYZE] = { 0 }, + Stepper::advance_divisor = 0, Stepper::step_events_completed = 0, // The number of step events executed in the current block - Stepper::accelerate_until, // The count at which to stop accelerating - Stepper::decelerate_after, // The count at which to start decelerating + Stepper::accelerate_until, // The point from where we need to stop acceleration + Stepper::decelerate_after, // The point from where we need to start decelerating Stepper::step_event_count; // The total event count for the current block -#if EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) - uint8_t Stepper::stepper_extruder; +#if ENABLED(MIXING_EXTRUDER) + int32_t Stepper::delta_error_m[MIXING_STEPPERS]; + uint32_t Stepper::advance_dividend_m[MIXING_STEPPERS], + Stepper::advance_divisor_m; #else - constexpr uint8_t Stepper::stepper_extruder; + int8_t Stepper::active_extruder; // Active extruder #endif #if ENABLED(S_CURVE_ACCELERATION) @@ -209,8 +175,11 @@ uint32_t Stepper::advance_divisor = 0, bool Stepper::bezier_2nd_half; // =false If Bézier curve has been initialized or not #endif +uint32_t Stepper::nextMainISR = 0; + #if ENABLED(LIN_ADVANCE) + constexpr uint32_t LA_ADV_NEVER = 0xFFFFFFFF; uint32_t Stepper::nextAdvanceISR = LA_ADV_NEVER, Stepper::LA_isr_rate = LA_ADV_NEVER; uint16_t Stepper::LA_current_adv_steps = 0, @@ -223,130 +192,34 @@ uint32_t Stepper::advance_divisor = 0, #endif // LIN_ADVANCE -#if ENABLED(INTEGRATED_BABYSTEPPING) - uint32_t Stepper::nextBabystepISR = BABYSTEP_NEVER; -#endif - -#if ENABLED(DIRECT_STEPPING) - page_step_state_t Stepper::page_step_state; -#endif - int32_t Stepper::ticks_nominal = -1; #if DISABLED(S_CURVE_ACCELERATION) uint32_t Stepper::acc_step_rate; // needed for deceleration start point #endif -xyz_long_t Stepper::endstops_trigsteps; -xyze_long_t Stepper::count_position{0}; -xyze_int8_t Stepper::count_direction{0}; +volatile int32_t Stepper::endstops_trigsteps[XYZ]; -#if ENABLED(LASER_POWER_INLINE_TRAPEZOID) - Stepper::stepper_laser_t Stepper::laser_trap = { - .enabled = false, - .cur_power = 0, - .cruise_set = false, - #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) - .last_step_count = 0, - .acc_step_count = 0 - #else - .till_update = 0 - #endif - }; +volatile int32_t Stepper::count_position[NUM_AXIS] = { 0 }; +int8_t Stepper::count_direction[NUM_AXIS] = { 0, 0, 0, 0 }; + +#if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + #define DUAL_ENDSTOP_APPLY_STEP(A,V) \ + if (homing_dual_axis) { \ + if (A##_HOME_DIR < 0) { \ + if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + } \ + else { \ + if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + } \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + } #endif -#define DUAL_ENDSTOP_APPLY_STEP(A,V) \ - if (separate_multi_axis) { \ - if (A##_HOME_DIR < 0) { \ - if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ - } \ - else { \ - if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ - } \ - } \ - else { \ - A##_STEP_WRITE(V); \ - A##2_STEP_WRITE(V); \ - } - -#define DUAL_SEPARATE_APPLY_STEP(A,V) \ - if (separate_multi_axis) { \ - if (!locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!locked_##A##2_motor) A##2_STEP_WRITE(V); \ - } \ - else { \ - A##_STEP_WRITE(V); \ - A##2_STEP_WRITE(V); \ - } - -#define TRIPLE_ENDSTOP_APPLY_STEP(A,V) \ - if (separate_multi_axis) { \ - if (A##_HOME_DIR < 0) { \ - if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##3_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ - } \ - else { \ - if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##3_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ - } \ - } \ - else { \ - A##_STEP_WRITE(V); \ - A##2_STEP_WRITE(V); \ - A##3_STEP_WRITE(V); \ - } - -#define TRIPLE_SEPARATE_APPLY_STEP(A,V) \ - if (separate_multi_axis) { \ - if (!locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!locked_##A##2_motor) A##2_STEP_WRITE(V); \ - if (!locked_##A##3_motor) A##3_STEP_WRITE(V); \ - } \ - else { \ - A##_STEP_WRITE(V); \ - A##2_STEP_WRITE(V); \ - A##3_STEP_WRITE(V); \ - } - -#define QUAD_ENDSTOP_APPLY_STEP(A,V) \ - if (separate_multi_axis) { \ - if (A##_HOME_DIR < 0) { \ - if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##3_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##4_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##4_motor) A##4_STEP_WRITE(V); \ - } \ - else { \ - if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##3_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ - if (!(TEST(endstops.state(), A##4_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##4_motor) A##4_STEP_WRITE(V); \ - } \ - } \ - else { \ - A##_STEP_WRITE(V); \ - A##2_STEP_WRITE(V); \ - A##3_STEP_WRITE(V); \ - A##4_STEP_WRITE(V); \ - } - -#define QUAD_SEPARATE_APPLY_STEP(A,V) \ - if (separate_multi_axis) { \ - if (!locked_##A##_motor) A##_STEP_WRITE(V); \ - if (!locked_##A##2_motor) A##2_STEP_WRITE(V); \ - if (!locked_##A##3_motor) A##3_STEP_WRITE(V); \ - if (!locked_##A##4_motor) A##4_STEP_WRITE(V); \ - } \ - else { \ - A##_STEP_WRITE(V); \ - A##2_STEP_WRITE(V); \ - A##3_STEP_WRITE(V); \ - A##4_STEP_WRITE(V); \ - } - #if ENABLED(X_DUAL_STEPPER_DRIVERS) #define X_APPLY_DIR(v,Q) do{ X_DIR_WRITE(v); X2_DIR_WRITE((v) != INVERT_X2_VS_X_DIR); }while(0) #if ENABLED(X_DUAL_ENDSTOPS) @@ -355,14 +228,22 @@ xyze_int8_t Stepper::count_direction{0}; #define X_APPLY_STEP(v,Q) do{ X_STEP_WRITE(v); X2_STEP_WRITE(v); }while(0) #endif #elif ENABLED(DUAL_X_CARRIAGE) - #define X_APPLY_DIR(v,ALWAYS) do{ \ - if (extruder_duplication_enabled || ALWAYS) { X_DIR_WRITE(v); X2_DIR_WRITE(mirrored_duplication_mode ? !(v) : v); } \ - else if (last_moved_extruder) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ - }while(0) - #define X_APPLY_STEP(v,ALWAYS) do{ \ - if (extruder_duplication_enabled || ALWAYS) { X_STEP_WRITE(v); X2_STEP_WRITE(v); } \ - else if (last_moved_extruder) X2_STEP_WRITE(v); else X_STEP_WRITE(v); \ - }while(0) + #define X_APPLY_DIR(v,ALWAYS) \ + if (extruder_duplication_enabled || ALWAYS) { \ + X_DIR_WRITE(v); \ + X2_DIR_WRITE(bool(v)); \ + } \ + else { \ + if (movement_extruder()) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ + } + #define X_APPLY_STEP(v,ALWAYS) \ + if (extruder_duplication_enabled || ALWAYS) { \ + X_STEP_WRITE(v); \ + X2_STEP_WRITE(v); \ + } \ + else { \ + if (movement_extruder()) X2_STEP_WRITE(v); else X_STEP_WRITE(v); \ + } #else #define X_APPLY_DIR(v,Q) X_DIR_WRITE(v) #define X_APPLY_STEP(v,Q) X_STEP_WRITE(v) @@ -380,30 +261,10 @@ xyze_int8_t Stepper::count_direction{0}; #define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v) #endif -#if NUM_Z_STEPPER_DRIVERS == 4 - #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); Z3_DIR_WRITE(v); Z4_DIR_WRITE(v); }while(0) - #if ENABLED(Z_MULTI_ENDSTOPS) - #define Z_APPLY_STEP(v,Q) QUAD_ENDSTOP_APPLY_STEP(Z,v) - #elif ENABLED(Z_STEPPER_AUTO_ALIGN) - #define Z_APPLY_STEP(v,Q) QUAD_SEPARATE_APPLY_STEP(Z,v) - #else - #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); Z4_STEP_WRITE(v); }while(0) - #endif -#elif NUM_Z_STEPPER_DRIVERS == 3 - #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); Z3_DIR_WRITE(v); }while(0) - #if ENABLED(Z_MULTI_ENDSTOPS) - #define Z_APPLY_STEP(v,Q) TRIPLE_ENDSTOP_APPLY_STEP(Z,v) - #elif ENABLED(Z_STEPPER_AUTO_ALIGN) - #define Z_APPLY_STEP(v,Q) TRIPLE_SEPARATE_APPLY_STEP(Z,v) - #else - #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); }while(0) - #endif -#elif NUM_Z_STEPPER_DRIVERS == 2 +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }while(0) - #if ENABLED(Z_MULTI_ENDSTOPS) + #if ENABLED(Z_DUAL_ENDSTOPS) #define Z_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Z,v) - #elif ENABLED(Z_STEPPER_AUTO_ALIGN) - #define Z_APPLY_STEP(v,Q) DUAL_SEPARATE_APPLY_STEP(Z,v) #else #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); }while(0) #endif @@ -413,39 +274,13 @@ xyze_int8_t Stepper::count_direction{0}; #endif #if DISABLED(MIXING_EXTRUDER) - #define E_APPLY_STEP(v,Q) E_STEP_WRITE(stepper_extruder, v) + #define E_APPLY_STEP(v,Q) E_STEP_WRITE(active_extruder, v) #endif -#define CYCLES_TO_NS(CYC) (1000UL * (CYC) / ((F_CPU) / 1000000)) -#define NS_PER_PULSE_TIMER_TICK (1000000000UL / (STEPPER_TIMER_RATE)) - -// Round up when converting from ns to timer ticks -#define NS_TO_PULSE_TIMER_TICKS(NS) (((NS) + (NS_PER_PULSE_TIMER_TICK) / 2) / (NS_PER_PULSE_TIMER_TICK)) - -#define TIMER_SETUP_NS (CYCLES_TO_NS(TIMER_READ_ADD_AND_STORE_CYCLES)) - -#define PULSE_HIGH_TICK_COUNT hal_timer_t(NS_TO_PULSE_TIMER_TICKS(_MIN_PULSE_HIGH_NS - _MIN(_MIN_PULSE_HIGH_NS, TIMER_SETUP_NS))) -#define PULSE_LOW_TICK_COUNT hal_timer_t(NS_TO_PULSE_TIMER_TICKS(_MIN_PULSE_LOW_NS - _MIN(_MIN_PULSE_LOW_NS, TIMER_SETUP_NS))) - -#define USING_TIMED_PULSE() hal_timer_t start_pulse_count = 0 -#define START_TIMED_PULSE(DIR) (start_pulse_count = HAL_timer_get_count(PULSE_TIMER_NUM)) -#define AWAIT_TIMED_PULSE(DIR) while (PULSE_##DIR##_TICK_COUNT > HAL_timer_get_count(PULSE_TIMER_NUM) - start_pulse_count) { } -#define START_HIGH_PULSE() START_TIMED_PULSE(HIGH) -#define AWAIT_HIGH_PULSE() AWAIT_TIMED_PULSE(HIGH) -#define START_LOW_PULSE() START_TIMED_PULSE(LOW) -#define AWAIT_LOW_PULSE() AWAIT_TIMED_PULSE(LOW) - -#if MINIMUM_STEPPER_PRE_DIR_DELAY > 0 - #define DIR_WAIT_BEFORE() DELAY_NS(MINIMUM_STEPPER_PRE_DIR_DELAY) -#else - #define DIR_WAIT_BEFORE() -#endif - -#if MINIMUM_STEPPER_POST_DIR_DELAY > 0 - #define DIR_WAIT_AFTER() DELAY_NS(MINIMUM_STEPPER_POST_DIR_DELAY) -#else - #define DIR_WAIT_AFTER() -#endif +void Stepper::wake_up() { + // TCNT1 = 0; + ENABLE_STEPPER_DRIVER_INTERRUPT(); +} /** * Set the stepper direction of each axis @@ -456,16 +291,14 @@ xyze_int8_t Stepper::count_direction{0}; */ void Stepper::set_directions() { - DIR_WAIT_BEFORE(); - - #define SET_STEP_DIR(A) \ - if (motor_direction(_AXIS(A))) { \ - A##_APPLY_DIR(INVERT_##A##_DIR, false); \ - count_direction[_AXIS(A)] = -1; \ - } \ - else { \ - A##_APPLY_DIR(!INVERT_##A##_DIR, false); \ - count_direction[_AXIS(A)] = 1; \ + #define SET_STEP_DIR(A) \ + if (motor_direction(_AXIS(A))) { \ + A##_APPLY_DIR(INVERT_## A##_DIR, false); \ + count_direction[_AXIS(A)] = -1; \ + } \ + else { \ + A##_APPLY_DIR(!INVERT_## A##_DIR, false); \ + count_direction[_AXIS(A)] = 1; \ } #if HAS_X_DIR @@ -480,50 +313,30 @@ void Stepper::set_directions() { #if DISABLED(LIN_ADVANCE) #if ENABLED(MIXING_EXTRUDER) - // Because this is valid for the whole block we don't know - // what e-steppers will step. Likely all. Set all. if (motor_direction(E_AXIS)) { - MIXER_STEPPER_LOOP(j) REV_E_DIR(j); - count_direction.e = -1; + MIXING_STEPPERS_LOOP(j) REV_E_DIR(j); + count_direction[E_AXIS] = -1; } else { - MIXER_STEPPER_LOOP(j) NORM_E_DIR(j); - count_direction.e = 1; + MIXING_STEPPERS_LOOP(j) NORM_E_DIR(j); + count_direction[E_AXIS] = 1; } #else if (motor_direction(E_AXIS)) { - REV_E_DIR(stepper_extruder); - count_direction.e = -1; + REV_E_DIR(active_extruder); + count_direction[E_AXIS] = -1; } else { - NORM_E_DIR(stepper_extruder); - count_direction.e = 1; + NORM_E_DIR(active_extruder); + count_direction[E_AXIS] = 1; } #endif #endif // !LIN_ADVANCE - #if HAS_L64XX - if (L64XX_OK_to_power_up) { // OK to send the direction commands (which powers up the L64XX steppers) - if (L64xxManager.spi_active) { - L64xxManager.spi_abort = true; // Interrupted SPI transfer needs to shut down gracefully - for (uint8_t j = 1; j <= L64XX::chain[0]; j++) - L6470_buf[j] = dSPIN_NOP; // Fill buffer with NOOPs - L64xxManager.transfer(L6470_buf, L64XX::chain[0]); // Send enough NOOPs to complete any command - L64xxManager.transfer(L6470_buf, L64XX::chain[0]); - L64xxManager.transfer(L6470_buf, L64XX::chain[0]); - } - - // L64xxManager.dir_commands[] is an array that holds direction command for each stepper - - // Scan command array, copy matches into L64xxManager.transfer - for (uint8_t j = 1; j <= L64XX::chain[0]; j++) - L6470_buf[j] = L64xxManager.dir_commands[L64XX::chain[j]]; - - L64xxManager.transfer(L6470_buf, L64XX::chain[0]); // send the command stream to the drivers - } + // A small delay may be needed after changing direction + #if MINIMUM_STEPPER_DIR_DELAY > 0 + DELAY_NS(MINIMUM_STEPPER_DIR_DELAY); #endif - - DIR_WAIT_AFTER(); } #if ENABLED(S_CURVE_ACCELERATION) @@ -638,14 +451,14 @@ void Stepper::set_directions() { * rhi = int32_t((mul >> 32) & 0xFFFFFFFF); * } * int32_t _eval_bezier_curve_arm(uint32_t curr_step) { - * uint32_t flo = 0; - * uint32_t fhi = bezier_AV * curr_step; - * uint32_t t = fhi; - * int32_t alo = bezier_F; - * int32_t ahi = 0; - * int32_t A = bezier_A; - * int32_t B = bezier_B; - * int32_t C = bezier_C; + * register uint32_t flo = 0; + * register uint32_t fhi = bezier_AV * curr_step; + * register uint32_t t = fhi; + * register int32_t alo = bezier_F; + * register int32_t ahi = 0; + * register int32_t A = bezier_A; + * register int32_t B = bezier_B; + * register int32_t C = bezier_C; * * lsrs(ahi, alo, 1); // a = F << 31 * lsls(alo, alo, 31); // @@ -730,29 +543,29 @@ void Stepper::set_directions() { * uint16_t t; * umul24x24to16hi(t, bezier_AV, curr_step); // t: Range 0 - 1^16 = 16 bits * uint16_t f = t; - * umul16x16to16hi(f, f, t); // Range 16 bits (unsigned) - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^3 (unsigned) - * uint24_t acc = bezier_F; // Range 20 bits (unsigned) + * umul16x16to16hi(f, f, t); // Range 16 bits (unsigned) + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^3 (unsigned) + * uint24_t acc = bezier_F; // Range 20 bits (unsigned) * if (A_negative) { * uint24_t v; - * umul16x24to24hi(v, f, bezier_C); // Range 21bits + * umul16x24to24hi(v, f, bezier_C); // Range 21bits * acc -= v; - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) - * umul16x24to24hi(v, f, bezier_B); // Range 22bits + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) + * umul16x24to24hi(v, f, bezier_B); // Range 22bits * acc += v; - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) - * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) + * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) * acc -= v; * } * else { * uint24_t v; - * umul16x24to24hi(v, f, bezier_C); // Range 21bits + * umul16x24to24hi(v, f, bezier_C); // Range 21bits * acc += v; - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) - * umul16x24to24hi(v, f, bezier_B); // Range 22bits + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) + * umul16x24to24hi(v, f, bezier_B); // Range 22bits * acc -= v; - * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) - * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) + * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) * acc += v; * } * return acc; @@ -770,13 +583,13 @@ void Stepper::set_directions() { bezier_AV = av; // Calculate the rest of the coefficients - uint8_t r2 = v0 & 0xFF; - uint8_t r3 = (v0 >> 8) & 0xFF; - uint8_t r12 = (v0 >> 16) & 0xFF; - uint8_t r5 = v1 & 0xFF; - uint8_t r6 = (v1 >> 8) & 0xFF; - uint8_t r7 = (v1 >> 16) & 0xFF; - uint8_t r4,r8,r9,r10,r11; + register uint8_t r2 = v0 & 0xFF; + register uint8_t r3 = (v0 >> 8) & 0xFF; + register uint8_t r12 = (v0 >> 16) & 0xFF; + register uint8_t r5 = v1 & 0xFF; + register uint8_t r6 = (v1 >> 8) & 0xFF; + register uint8_t r7 = (v1 >> 16) & 0xFF; + register uint8_t r4,r8,r9,r10,r11; __asm__ __volatile__( /* Calculate the Bézier coefficients */ @@ -872,11 +685,11 @@ void Stepper::set_directions() { if (!curr_step) return bezier_F; - uint8_t r0 = 0; /* Zero register */ - uint8_t r2 = (curr_step) & 0xFF; - uint8_t r3 = (curr_step >> 8) & 0xFF; - uint8_t r4 = (curr_step >> 16) & 0xFF; - uint8_t r1,r5,r6,r7,r8,r9,r10,r11; /* Temporary registers */ + register uint8_t r0 = 0; /* Zero register */ + register uint8_t r2 = (curr_step) & 0xFF; + register uint8_t r3 = (curr_step >> 8) & 0xFF; + register uint8_t r4 = (curr_step >> 16) & 0xFF; + register uint8_t r1,r5,r6,r7,r8,r9,r10,r11; /* Temporary registers */ __asm__ __volatile( /* umul24x24to16hi(t, bezier_AV, curr_step); t: Range 0 - 1^16 = 16 bits*/ @@ -1264,17 +1077,17 @@ void Stepper::set_directions() { } FORCE_INLINE int32_t Stepper::_eval_bezier_curve(const uint32_t curr_step) { - #if defined(__arm__) || defined(__thumb__) + #if defined(__ARM__) || defined(__thumb__) // For ARM Cortex M3/M4 CPUs, we have the optimized assembler version, that takes 43 cycles to execute - uint32_t flo = 0; - uint32_t fhi = bezier_AV * curr_step; - uint32_t t = fhi; - int32_t alo = bezier_F; - int32_t ahi = 0; - int32_t A = bezier_A; - int32_t B = bezier_B; - int32_t C = bezier_C; + register uint32_t flo = 0; + register uint32_t fhi = bezier_AV * curr_step; + register uint32_t t = fhi; + register int32_t alo = bezier_F; + register int32_t ahi = 0; + register int32_t A = bezier_A; + register int32_t B = bezier_B; + register int32_t C = bezier_C; __asm__ __volatile__( ".syntax unified" "\n\t" // is to prevent CM0,CM1 non-unified syntax @@ -1337,7 +1150,7 @@ void Stepper::set_directions() { * Directly pulses the stepper motors at high frequency. */ -HAL_STEP_TIMER_ISR() { +HAL_STEP_TIMER_ISR { HAL_timer_isr_prologue(STEP_TIMER_NUM); Stepper::isr(); @@ -1352,9 +1165,6 @@ HAL_STEP_TIMER_ISR() { #endif void Stepper::isr() { - - static uint32_t nextMainISR = 0; // Interval until the next main Stepper Pulse phase (0 = Now) - #ifndef __AVR__ // Disable interrupts, to avoid ISR preemption while we reprogram the period // (AVR enters the ISR with global interrupts disabled, so no need to do it here) @@ -1364,7 +1174,7 @@ void Stepper::isr() { // Program timer compare for the maximum period, so it does NOT // flag an interrupt while this ISR is running - So changes from small // periods to big periods are respected and the timer does not reset to 0 - HAL_timer_set_compare(STEP_TIMER_NUM, hal_timer_t(HAL_TIMER_TYPE_MAX)); + HAL_timer_set_compare(STEP_TIMER_NUM, HAL_TIMER_TYPE_MAX); // Count of ticks for the next ISR hal_timer_t next_isr_ticks = 0; @@ -1378,58 +1188,38 @@ void Stepper::isr() { // Enable ISRs to reduce USART processing latency ENABLE_ISRS(); - if (!nextMainISR) pulse_phase_isr(); // 0 = Do coordinated axes Stepper pulses + // Run main stepping pulse phase ISR if we have to + if (!nextMainISR) Stepper::stepper_pulse_phase_isr(); #if ENABLED(LIN_ADVANCE) - if (!nextAdvanceISR) nextAdvanceISR = advance_isr(); // 0 = Do Linear Advance E Stepper pulses - #endif - - #if ENABLED(INTEGRATED_BABYSTEPPING) - const bool is_babystep = (nextBabystepISR == 0); // 0 = Do Babystepping (XY)Z pulses - if (is_babystep) nextBabystepISR = babystepping_isr(); + // Run linear advance stepper ISR if we have to + if (!nextAdvanceISR) nextAdvanceISR = Stepper::advance_isr(); #endif // ^== Time critical. NOTHING besides pulse generation should be above here!!! - if (!nextMainISR) nextMainISR = block_phase_isr(); // Manage acc/deceleration, get next block + // Run main stepping block processing ISR if we have to + if (!nextMainISR) nextMainISR = Stepper::stepper_block_phase_isr(); - #if ENABLED(INTEGRATED_BABYSTEPPING) - if (is_babystep) // Avoid ANY stepping too soon after baby-stepping - NOLESS(nextMainISR, (BABYSTEP_TICKS) / 8); // FULL STOP for 125µs after a baby-step - - if (nextBabystepISR != BABYSTEP_NEVER) // Avoid baby-stepping too close to axis Stepping - NOLESS(nextBabystepISR, nextMainISR / 2); // TODO: Only look at axes enabled for baby-stepping - #endif - - // Get the interval to the next ISR call - const uint32_t interval = _MIN( - nextMainISR // Time until the next Pulse / Block phase + uint32_t interval = #if ENABLED(LIN_ADVANCE) - , nextAdvanceISR // Come back early for Linear Advance? + MIN(nextAdvanceISR, nextMainISR) // Nearest time interval + #else + nextMainISR // Remaining stepper ISR time #endif - #if ENABLED(INTEGRATED_BABYSTEPPING) - , nextBabystepISR // Come back early for Babystepping? - #endif - , uint32_t(HAL_TIMER_TYPE_MAX) // Come back in a very long time - ); + ; - // - // Compute remaining time for each ISR phase - // NEVER : The phase is idle - // Zero : The phase will occur on the next ISR call - // Non-zero : The phase will occur on a future ISR call - // + // Limit the value to the maximum possible value of the timer + NOMORE(interval, HAL_TIMER_TYPE_MAX); + // Compute the time remaining for the main isr nextMainISR -= interval; #if ENABLED(LIN_ADVANCE) + // Compute the time remaining for the advance isr if (nextAdvanceISR != LA_ADV_NEVER) nextAdvanceISR -= interval; #endif - #if ENABLED(INTEGRATED_BABYSTEPPING) - if (nextBabystepISR != BABYSTEP_NEVER) nextBabystepISR -= interval; - #endif - /** * This needs to avoid a race-condition caused by interleaving * of interrupts required by both the LA and Stepper algorithms. @@ -1502,13 +1292,6 @@ void Stepper::isr() { ENABLE_ISRS(); } -#if MINIMUM_STEPPER_PULSE || MAXIMUM_STEPPER_RATE - #define ISR_PULSE_CONTROL 1 -#endif -#if ISR_PULSE_CONTROL && DISABLED(I2S_STEPPER_STREAM) - #define ISR_MULTI_STEPS 1 -#endif - /** * This phase of the ISR should ONLY create the pulses for the steppers. * This prevents jitter caused by the interval between the start of the @@ -1516,12 +1299,16 @@ void Stepper::isr() { * call to this method that might cause variation in the timing. The aim * is to keep pulse timing as regular as possible. */ -void Stepper::pulse_phase_isr() { +void Stepper::stepper_pulse_phase_isr() { // If we must abort the current block, do so! if (abort_current_block) { abort_current_block = false; - if (current_block) discard_current_block(); + if (current_block) { + axis_did_move = 0; + current_block = NULL; + planner.discard_current_block(); + } } // If there is no current block, do nothing @@ -1529,192 +1316,39 @@ void Stepper::pulse_phase_isr() { // Count of pending loops and events for this iteration const uint32_t pending_events = step_event_count - step_events_completed; - uint8_t events_to_do = _MIN(pending_events, steps_per_isr); + uint8_t events_to_do = MIN(pending_events, steps_per_isr); // Just update the value we will get at the end of the loop step_events_completed += events_to_do; - // Take multiple steps per interrupt (For high speed moves) - #if ISR_MULTI_STEPS - bool firstStep = true; - USING_TIMED_PULSE(); - #endif - xyze_bool_t step_needed{0}; + // Get the timer count and estimate the end of the pulse + hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t(MIN_PULSE_TICKS); + const hal_timer_t added_step_ticks = hal_timer_t(ADDED_STEP_TICKS); + + // Take multiple steps per interrupt (For high speed moves) do { - #define _APPLY_STEP(AXIS, INV, ALWAYS) AXIS ##_APPLY_STEP(INV, ALWAYS) + + #define _APPLY_STEP(AXIS) AXIS ##_APPLY_STEP #define _INVERT_STEP_PIN(AXIS) INVERT_## AXIS ##_STEP_PIN - // Determine if a pulse is needed using Bresenham - #define PULSE_PREP(AXIS) do{ \ - delta_error[_AXIS(AXIS)] += advance_dividend[_AXIS(AXIS)]; \ - step_needed[_AXIS(AXIS)] = (delta_error[_AXIS(AXIS)] >= 0); \ - if (step_needed[_AXIS(AXIS)]) { \ - count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; \ - delta_error[_AXIS(AXIS)] -= advance_divisor; \ - } \ - }while(0) - - // Start an active pulse if needed + // Start an active pulse, if Bresenham says so, and update position #define PULSE_START(AXIS) do{ \ - if (step_needed[_AXIS(AXIS)]) { \ - _APPLY_STEP(AXIS, !_INVERT_STEP_PIN(AXIS), 0); \ + delta_error[_AXIS(AXIS)] += advance_dividend[_AXIS(AXIS)]; \ + if (delta_error[_AXIS(AXIS)] >= 0) { \ + _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS), 0); \ + count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; \ } \ }while(0) - // Stop an active pulse if needed + // Stop an active pulse, if any, and adjust error term #define PULSE_STOP(AXIS) do { \ - if (step_needed[_AXIS(AXIS)]) { \ - _APPLY_STEP(AXIS, _INVERT_STEP_PIN(AXIS), 0); \ + if (delta_error[_AXIS(AXIS)] >= 0) { \ + delta_error[_AXIS(AXIS)] -= advance_divisor; \ + _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS), 0); \ } \ }while(0) - // Direct Stepping page? - const bool is_page = IS_PAGE(current_block); - - #if ENABLED(DIRECT_STEPPING) - - if (is_page) { - - #if STEPPER_PAGE_FORMAT == SP_4x4D_128 - - #define PAGE_SEGMENT_UPDATE(AXIS, VALUE) do{ \ - if ((VALUE) < 7) SBI(dm, _AXIS(AXIS)); \ - else if ((VALUE) > 7) CBI(dm, _AXIS(AXIS)); \ - page_step_state.sd[_AXIS(AXIS)] = VALUE; \ - page_step_state.bd[_AXIS(AXIS)] += VALUE; \ - }while(0) - - #define PAGE_PULSE_PREP(AXIS) do{ \ - step_needed[_AXIS(AXIS)] = \ - pgm_read_byte(&segment_table[page_step_state.sd[_AXIS(AXIS)]][page_step_state.segment_steps & 0x7]); \ - }while(0) - - switch (page_step_state.segment_steps) { - case DirectStepping::Config::SEGMENT_STEPS: - page_step_state.segment_idx += 2; - page_step_state.segment_steps = 0; - // fallthru - case 0: { - const uint8_t low = page_step_state.page[page_step_state.segment_idx], - high = page_step_state.page[page_step_state.segment_idx + 1]; - uint8_t dm = last_direction_bits; - - PAGE_SEGMENT_UPDATE(X, low >> 4); - PAGE_SEGMENT_UPDATE(Y, low & 0xF); - PAGE_SEGMENT_UPDATE(Z, high >> 4); - PAGE_SEGMENT_UPDATE(E, high & 0xF); - - if (dm != last_direction_bits) { - last_direction_bits = dm; - set_directions(); - } - } break; - - default: break; - } - - PAGE_PULSE_PREP(X); - PAGE_PULSE_PREP(Y); - PAGE_PULSE_PREP(Z); - PAGE_PULSE_PREP(E); - - page_step_state.segment_steps++; - - #elif STEPPER_PAGE_FORMAT == SP_4x2_256 - - #define PAGE_SEGMENT_UPDATE(AXIS, VALUE) \ - page_step_state.sd[_AXIS(AXIS)] = VALUE; \ - page_step_state.bd[_AXIS(AXIS)] += VALUE; - - #define PAGE_PULSE_PREP(AXIS) do{ \ - step_needed[_AXIS(AXIS)] = \ - pgm_read_byte(&segment_table[page_step_state.sd[_AXIS(AXIS)]][page_step_state.segment_steps & 0x3]); \ - }while(0) - - switch (page_step_state.segment_steps) { - case DirectStepping::Config::SEGMENT_STEPS: - page_step_state.segment_idx++; - page_step_state.segment_steps = 0; - // fallthru - case 0: { - const uint8_t b = page_step_state.page[page_step_state.segment_idx]; - PAGE_SEGMENT_UPDATE(X, (b >> 6) & 0x3); - PAGE_SEGMENT_UPDATE(Y, (b >> 4) & 0x3); - PAGE_SEGMENT_UPDATE(Z, (b >> 2) & 0x3); - PAGE_SEGMENT_UPDATE(E, (b >> 0) & 0x3); - } break; - default: break; - } - - PAGE_PULSE_PREP(X); - PAGE_PULSE_PREP(Y); - PAGE_PULSE_PREP(Z); - PAGE_PULSE_PREP(E); - - page_step_state.segment_steps++; - - #elif STEPPER_PAGE_FORMAT == SP_4x1_512 - - #define PAGE_PULSE_PREP(AXIS, BITS) do{ \ - step_needed[_AXIS(AXIS)] = (steps >> BITS) & 0x1; \ - if (step_needed[_AXIS(AXIS)]) \ - page_step_state.bd[_AXIS(AXIS)]++; \ - }while(0) - - uint8_t steps = page_step_state.page[page_step_state.segment_idx >> 1]; - if (page_step_state.segment_idx & 0x1) steps >>= 4; - - PAGE_PULSE_PREP(X, 3); - PAGE_PULSE_PREP(Y, 2); - PAGE_PULSE_PREP(Z, 1); - PAGE_PULSE_PREP(E, 0); - - page_step_state.segment_idx++; - - #else - #error "Unknown direct stepping page format!" - #endif - } - - #endif // DIRECT_STEPPING - - if (!is_page) { - // Determine if pulses are needed - #if HAS_X_STEP - PULSE_PREP(X); - #endif - #if HAS_Y_STEP - PULSE_PREP(Y); - #endif - #if HAS_Z_STEP - PULSE_PREP(Z); - #endif - - #if EITHER(LIN_ADVANCE, MIXING_EXTRUDER) - delta_error.e += advance_dividend.e; - if (delta_error.e >= 0) { - count_position.e += count_direction.e; - #if ENABLED(LIN_ADVANCE) - delta_error.e -= advance_divisor; - // Don't step E here - But remember the number of steps to perform - motor_direction(E_AXIS) ? --LA_steps : ++LA_steps; - #else - step_needed.e = true; - #endif - } - #elif HAS_E0_STEP - PULSE_PREP(E); - #endif - } - - #if ISR_MULTI_STEPS - if (firstStep) - firstStep = false; - else - AWAIT_LOW_PULSE(); - #endif - // Pulse start #if HAS_X_STEP PULSE_START(X); @@ -1726,23 +1360,47 @@ void Stepper::pulse_phase_isr() { PULSE_START(Z); #endif - #if DISABLED(LIN_ADVANCE) + // Pulse E/Mixing extruders + #if ENABLED(LIN_ADVANCE) + // Tick the E axis, correct error term and update position + delta_error[E_AXIS] += advance_dividend[E_AXIS]; + if (delta_error[E_AXIS] >= 0) { + count_position[E_AXIS] += count_direction[E_AXIS]; + delta_error[E_AXIS] -= advance_divisor; + + // Don't step E here - But remember the number of steps to perform + motor_direction(E_AXIS) ? --LA_steps : ++LA_steps; + } + #else // !LIN_ADVANCE - use linear interpolation for E also #if ENABLED(MIXING_EXTRUDER) - if (step_needed.e) E_STEP_WRITE(mixer.get_next_stepper(), !INVERT_E_STEP_PIN); - #elif HAS_E0_STEP + + // Tick the E axis + delta_error[E_AXIS] += advance_dividend[E_AXIS]; + if (delta_error[E_AXIS] >= 0) { + count_position[E_AXIS] += count_direction[E_AXIS]; + delta_error[E_AXIS] -= advance_divisor; + } + + // Tick the counters used for this mix in proper proportion + MIXING_STEPPERS_LOOP(j) { + // Step mixing steppers (proportionally) + delta_error_m[j] += advance_dividend_m[j]; + // Step when the counter goes over zero + if (delta_error_m[j] >= 0) E_STEP_WRITE(j, !INVERT_E_STEP_PIN); + } + + #else // !MIXING_EXTRUDER PULSE_START(E); #endif + #endif // !LIN_ADVANCE + + #if MINIMUM_STEPPER_PULSE + // Just wait for the requested pulse duration + while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ } #endif - #if ENABLED(I2S_STEPPER_STREAM) - i2s_push_sample(); - #endif - - // TODO: need to deal with MINIMUM_STEPPER_PULSE over i2s - #if ISR_MULTI_STEPS - START_HIGH_PULSE(); - AWAIT_HIGH_PULSE(); - #endif + // Add the delay needed to ensure the maximum driver rate is enforced + if (signed(added_step_ticks) > 0) pulse_end += hal_timer_t(added_step_ticks); // Pulse stop #if HAS_X_STEP @@ -1757,54 +1415,50 @@ void Stepper::pulse_phase_isr() { #if DISABLED(LIN_ADVANCE) #if ENABLED(MIXING_EXTRUDER) - if (delta_error.e >= 0) { - delta_error.e -= advance_divisor; - E_STEP_WRITE(mixer.get_stepper(), INVERT_E_STEP_PIN); + MIXING_STEPPERS_LOOP(j) { + if (delta_error_m[j] >= 0) { + delta_error_m[j] -= advance_divisor_m; + E_STEP_WRITE(j, INVERT_E_STEP_PIN); + } } - #elif HAS_E0_STEP + #else // !MIXING_EXTRUDER PULSE_STOP(E); #endif - #endif + #endif // !LIN_ADVANCE - #if ISR_MULTI_STEPS - if (events_to_do) START_LOW_PULSE(); - #endif + // Decrement the count of pending pulses to do + --events_to_do; - } while (--events_to_do); + // For minimum pulse time wait after stopping pulses also + if (events_to_do) { + // Just wait for the requested pulse duration + while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ } + #if MINIMUM_STEPPER_PULSE + // Add to the value, the time that the pulse must be active (to be used on the next loop) + pulse_end += hal_timer_t(MIN_PULSE_TICKS); + #endif + } + + } while (events_to_do); } // This is the last half of the stepper interrupt: This one processes and // properly schedules blocks from the planner. This is executed after creating // the step pulses, so it is not time critical, as pulses are already done. -uint32_t Stepper::block_phase_isr() { +uint32_t Stepper::stepper_block_phase_isr() { - // If no queued movements, just wait 1ms for the next block - uint32_t interval = (STEPPER_TIMER_RATE) / 1000UL; + // If no queued movements, just wait 1ms for the next move + uint32_t interval = (STEPPER_TIMER_RATE / 1000); // If there is a current block if (current_block) { - // If current block is finished, reset pointer and finalize state + // If current block is finished, reset pointer if (step_events_completed >= step_event_count) { - #if ENABLED(DIRECT_STEPPING) - #if STEPPER_PAGE_FORMAT == SP_4x4D_128 - #define PAGE_SEGMENT_UPDATE_POS(AXIS) \ - count_position[_AXIS(AXIS)] += page_step_state.bd[_AXIS(AXIS)] - 128 * 7; - #elif STEPPER_PAGE_FORMAT == SP_4x1_512 || STEPPER_PAGE_FORMAT == SP_4x2_256 - #define PAGE_SEGMENT_UPDATE_POS(AXIS) \ - count_position[_AXIS(AXIS)] += page_step_state.bd[_AXIS(AXIS)] * count_direction[_AXIS(AXIS)]; - #endif - - if (IS_PAGE(current_block)) { - PAGE_SEGMENT_UPDATE_POS(X); - PAGE_SEGMENT_UPDATE_POS(Y); - PAGE_SEGMENT_UPDATE_POS(Z); - PAGE_SEGMENT_UPDATE_POS(E); - } - #endif - TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, runout.block_completed(current_block)); - discard_current_block(); + axis_did_move = 0; + current_block = NULL; + planner.discard_current_block(); } else { // Step events not completed yet... @@ -1814,9 +1468,10 @@ uint32_t Stepper::block_phase_isr() { #if ENABLED(S_CURVE_ACCELERATION) // Get the next speed to use (Jerk limited!) - uint32_t acc_step_rate = acceleration_time < current_block->acceleration_time - ? _eval_bezier_curve(acceleration_time) - : current_block->cruise_rate; + uint32_t acc_step_rate = + acceleration_time < current_block->acceleration_time + ? _eval_bezier_curve(acceleration_time) + : current_block->cruise_rate; #else acc_step_rate = STEP_MULTIPLY(acceleration_time, current_block->acceleration_rate) + current_block->initial_rate; NOMORE(acc_step_rate, current_block->nominal_rate); @@ -1825,7 +1480,7 @@ uint32_t Stepper::block_phase_isr() { // acc_step_rate is in steps/second // step_rate to timer interval and steps per stepper isr - interval = calc_timer_interval(acc_step_rate, &steps_per_isr); + interval = calc_timer_interval(acc_step_rate, oversampling_factor, &steps_per_isr); acceleration_time += interval; #if ENABLED(LIN_ADVANCE) @@ -1834,36 +1489,7 @@ uint32_t Stepper::block_phase_isr() { if (LA_steps && LA_isr_rate != current_block->advance_speed) nextAdvanceISR = 0; } else if (LA_steps) nextAdvanceISR = 0; - #endif - - // Update laser - Accelerating - #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) - if (laser_trap.enabled) { - #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) - if (current_block->laser.entry_per) { - laser_trap.acc_step_count -= step_events_completed - laser_trap.last_step_count; - laser_trap.last_step_count = step_events_completed; - - // Should be faster than a divide, since this should trip just once - if (laser_trap.acc_step_count < 0) { - while (laser_trap.acc_step_count < 0) { - laser_trap.acc_step_count += current_block->laser.entry_per; - if (laser_trap.cur_power < current_block->laser.power) laser_trap.cur_power++; - } - cutter.set_ocr_power(laser_trap.cur_power); - } - } - #else - if (laser_trap.till_update) - laser_trap.till_update--; - else { - laser_trap.till_update = LASER_POWER_INLINE_TRAPEZOID_CONT_PER; - laser_trap.cur_power = (current_block->laser.power * acc_step_rate) / current_block->nominal_rate; - cutter.set_ocr_power(laser_trap.cur_power); // Cycle efficiency is irrelevant it the last line was many cycles - } - #endif - } - #endif + #endif // LIN_ADVANCE } // Are we in Deceleration phase ? else if (step_events_completed > decelerate_after) { @@ -1899,81 +1525,36 @@ uint32_t Stepper::block_phase_isr() { // step_rate is in steps/second // step_rate to timer interval and steps per stepper isr - interval = calc_timer_interval(step_rate, &steps_per_isr); + interval = calc_timer_interval(step_rate, oversampling_factor, &steps_per_isr); deceleration_time += interval; #if ENABLED(LIN_ADVANCE) if (LA_use_advance_lead) { // Wake up eISR on first deceleration loop and fire ISR if final adv_rate is reached if (step_events_completed <= decelerate_after + steps_per_isr || (LA_steps && LA_isr_rate != current_block->advance_speed)) { - initiateLA(); + nextAdvanceISR = 0; LA_isr_rate = current_block->advance_speed; } } else if (LA_steps) nextAdvanceISR = 0; #endif // LIN_ADVANCE - - // Update laser - Decelerating - #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) - if (laser_trap.enabled) { - #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) - if (current_block->laser.exit_per) { - laser_trap.acc_step_count -= step_events_completed - laser_trap.last_step_count; - laser_trap.last_step_count = step_events_completed; - - // Should be faster than a divide, since this should trip just once - if (laser_trap.acc_step_count < 0) { - while (laser_trap.acc_step_count < 0) { - laser_trap.acc_step_count += current_block->laser.exit_per; - if (laser_trap.cur_power > current_block->laser.power_exit) laser_trap.cur_power--; - } - cutter.set_ocr_power(laser_trap.cur_power); - } - } - #else - if (laser_trap.till_update) - laser_trap.till_update--; - else { - laser_trap.till_update = LASER_POWER_INLINE_TRAPEZOID_CONT_PER; - laser_trap.cur_power = (current_block->laser.power * step_rate) / current_block->nominal_rate; - cutter.set_ocr_power(laser_trap.cur_power); // Cycle efficiency isn't relevant when the last line was many cycles - } - #endif - } - #endif } - // Must be in cruise phase otherwise + // We must be in cruise phase otherwise else { #if ENABLED(LIN_ADVANCE) // If there are any esteps, fire the next advance_isr "now" - if (LA_steps && LA_isr_rate != current_block->advance_speed) initiateLA(); + if (LA_steps && LA_isr_rate != current_block->advance_speed) nextAdvanceISR = 0; #endif // Calculate the ticks_nominal for this nominal speed, if not done yet if (ticks_nominal < 0) { // step_rate to timer interval and loops for the nominal speed - ticks_nominal = calc_timer_interval(current_block->nominal_rate, &steps_per_isr); + ticks_nominal = calc_timer_interval(current_block->nominal_rate, oversampling_factor, &steps_per_isr); } // The timer interval is just the nominal value for the nominal speed interval = ticks_nominal; - - // Update laser - Cruising - #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) - if (laser_trap.enabled) { - if (!laser_trap.cruise_set) { - laser_trap.cur_power = current_block->laser.power; - cutter.set_ocr_power(laser_trap.cur_power); - laser_trap.cruise_set = true; - } - #if ENABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) - laser_trap.till_update = LASER_POWER_INLINE_TRAPEZOID_CONT_PER; - #else - laser_trap.last_step_count = step_events_completed; - #endif - } - #endif } } } @@ -1987,38 +1568,17 @@ uint32_t Stepper::block_phase_isr() { // Sync block? Sync the stepper counts and return while (TEST(current_block->flag, BLOCK_BIT_SYNC_POSITION)) { - _set_position(current_block->position); - discard_current_block(); + _set_position( + current_block->position[A_AXIS], current_block->position[B_AXIS], + current_block->position[C_AXIS], current_block->position[E_AXIS] + ); + planner.discard_current_block(); // Try to get a new block if (!(current_block = planner.get_current_block())) return interval; // No more queued movements! } - // For non-inline cutter, grossly apply power - #if ENABLED(LASER_FEATURE) && DISABLED(LASER_POWER_INLINE) - cutter.apply_power(current_block->cutter_power); - #endif - - TERN_(POWER_LOSS_RECOVERY, recovery.info.sdpos = current_block->sdpos); - - #if ENABLED(DIRECT_STEPPING) - if (IS_PAGE(current_block)) { - page_step_state.segment_steps = 0; - page_step_state.segment_idx = 0; - page_step_state.page = page_manager.get_page(current_block->page_idx); - page_step_state.bd.reset(); - - if (DirectStepping::Config::DIRECTIONAL) - current_block->direction_bits = last_direction_bits; - - if (!page_step_state.page) { - discard_current_block(); - return interval; - } - } - #endif - // Flag all moving axes for proper endstop handling #if IS_CORE @@ -2035,16 +1595,14 @@ uint32_t Stepper::block_phase_isr() { * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z, handled below) * If DeltaA == DeltaB, the movement is only in the 1st axis (X) */ - #if EITHER(COREXY, COREXZ) - #define X_CMP(A,B) ((A)==(B)) + #if ENABLED(COREXY) || ENABLED(COREXZ) + #define X_CMP == #else - #define X_CMP(A,B) ((A)!=(B)) + #define X_CMP != #endif - #define X_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && X_CMP(D_(1),D_(2))) ) - #elif ENABLED(MARKFORGED_XY) - #define X_MOVE_TEST (current_block->steps.a != current_block->steps.b) + #define X_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) X_CMP D_(2)) ) #else - #define X_MOVE_TEST !!current_block->steps.a + #define X_MOVE_TEST !!current_block->steps[A_AXIS] #endif #if CORE_IS_XY || CORE_IS_YZ @@ -2055,14 +1613,14 @@ uint32_t Stepper::block_phase_isr() { * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y) * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z) */ - #if EITHER(COREYX, COREYZ) - #define Y_CMP(A,B) ((A)==(B)) + #if ENABLED(COREYX) || ENABLED(COREYZ) + #define Y_CMP == #else - #define Y_CMP(A,B) ((A)!=(B)) + #define Y_CMP != #endif - #define Y_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && Y_CMP(D_(1),D_(2))) ) + #define Y_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) Y_CMP D_(2)) ) #else - #define Y_MOVE_TEST !!current_block->steps.b + #define Y_MOVE_TEST !!current_block->steps[B_AXIS] #endif #if CORE_IS_XZ || CORE_IS_YZ @@ -2073,51 +1631,55 @@ uint32_t Stepper::block_phase_isr() { * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y, already handled above) * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Z) */ - #if EITHER(COREZX, COREZY) - #define Z_CMP(A,B) ((A)==(B)) + #if ENABLED(COREZX) || ENABLED(COREZY) + #define Z_CMP == #else - #define Z_CMP(A,B) ((A)!=(B)) + #define Z_CMP != #endif - #define Z_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && Z_CMP(D_(1),D_(2))) ) + #define Z_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && D_(1) Z_CMP D_(2)) ) #else - #define Z_MOVE_TEST !!current_block->steps.c + #define Z_MOVE_TEST !!current_block->steps[C_AXIS] #endif uint8_t axis_bits = 0; if (X_MOVE_TEST) SBI(axis_bits, A_AXIS); if (Y_MOVE_TEST) SBI(axis_bits, B_AXIS); if (Z_MOVE_TEST) SBI(axis_bits, C_AXIS); - //if (!!current_block->steps.e) SBI(axis_bits, E_AXIS); - //if (!!current_block->steps.a) SBI(axis_bits, X_HEAD); - //if (!!current_block->steps.b) SBI(axis_bits, Y_HEAD); - //if (!!current_block->steps.c) SBI(axis_bits, Z_HEAD); + //if (!!current_block->steps[E_AXIS]) SBI(axis_bits, E_AXIS); + //if (!!current_block->steps[A_AXIS]) SBI(axis_bits, X_HEAD); + //if (!!current_block->steps[B_AXIS]) SBI(axis_bits, Y_HEAD); + //if (!!current_block->steps[C_AXIS]) SBI(axis_bits, Z_HEAD); axis_did_move = axis_bits; // No acceleration / deceleration time elapsed so far acceleration_time = deceleration_time = 0; + uint8_t oversampling = 0; // Assume we won't use it + #if ENABLED(ADAPTIVE_STEP_SMOOTHING) - uint8_t oversampling = 0; // Assume no axis smoothing (via oversampling) - // Decide if axis smoothing is possible - uint32_t max_rate = current_block->nominal_rate; // Get the step event rate - while (max_rate < MIN_STEP_ISR_FREQUENCY) { // As long as more ISRs are possible... - max_rate <<= 1; // Try to double the rate - if (max_rate < MIN_STEP_ISR_FREQUENCY) // Don't exceed the estimated ISR limit - ++oversampling; // Increase the oversampling (used for left-shift) + // At this point, we must decide if we can use Stepper movement axis smoothing. + uint32_t max_rate = current_block->nominal_rate; // Get the maximum rate (maximum event speed) + while (max_rate < MIN_STEP_ISR_FREQUENCY) { + max_rate <<= 1; + if (max_rate >= MAX_STEP_ISR_FREQUENCY_1X) break; + ++oversampling; } - oversampling_factor = oversampling; // For all timer interval calculations - #else - constexpr uint8_t oversampling = 0; + oversampling_factor = oversampling; #endif // Based on the oversampling factor, do the calculations step_event_count = current_block->step_event_count << oversampling; // Initialize Bresenham delta errors to 1/2 - delta_error = -int32_t(step_event_count); + delta_error[X_AXIS] = delta_error[Y_AXIS] = delta_error[Z_AXIS] = delta_error[E_AXIS] = -int32_t(step_event_count); - // Calculate Bresenham dividends and divisors - advance_dividend = current_block->steps << 1; + // Calculate Bresenham dividends + advance_dividend[X_AXIS] = current_block->steps[X_AXIS] << 1; + advance_dividend[Y_AXIS] = current_block->steps[Y_AXIS] << 1; + advance_dividend[Z_AXIS] = current_block->steps[Z_AXIS] << 1; + advance_dividend[E_AXIS] = current_block->steps[E_AXIS] << 1; + + // Calculate Bresenham divisor advance_divisor = step_event_count << 1; // No step events completed so far @@ -2128,73 +1690,51 @@ uint32_t Stepper::block_phase_isr() { decelerate_after = current_block->decelerate_after << oversampling; #if ENABLED(MIXING_EXTRUDER) - MIXER_STEPPER_SETUP(); - #endif - - #if HAS_MULTI_EXTRUDER - stepper_extruder = current_block->extruder; + const uint32_t e_steps = ( + #if ENABLED(LIN_ADVANCE) + current_block->steps[E_AXIS] + #else + step_event_count + #endif + ); + MIXING_STEPPERS_LOOP(i) { + delta_error_m[i] = -int32_t(e_steps); + advance_dividend_m[i] = current_block->mix_steps[i] << 1; + } + advance_divisor_m = e_steps << 1; + #else + active_extruder = current_block->active_extruder; #endif // Initialize the trapezoid generator from the current block. #if ENABLED(LIN_ADVANCE) #if DISABLED(MIXING_EXTRUDER) && E_STEPPERS > 1 // If the now active extruder wasn't in use during the last move, its pressure is most likely gone. - if (stepper_extruder != last_moved_extruder) LA_current_adv_steps = 0; + if (active_extruder != last_moved_extruder) LA_current_adv_steps = 0; #endif if ((LA_use_advance_lead = current_block->use_advance_lead)) { LA_final_adv_steps = current_block->final_adv_steps; LA_max_adv_steps = current_block->max_adv_steps; - initiateLA(); // Start the ISR + //Start the ISR + nextAdvanceISR = 0; LA_isr_rate = current_block->advance_speed; } else LA_isr_rate = LA_ADV_NEVER; #endif - if ( ENABLED(HAS_L64XX) // Always set direction for L64xx (Also enables the chips) - || current_block->direction_bits != last_direction_bits - || TERN(MIXING_EXTRUDER, false, stepper_extruder != last_moved_extruder) + if (current_block->direction_bits != last_direction_bits + #if DISABLED(MIXING_EXTRUDER) + || active_extruder != last_moved_extruder + #endif ) { last_direction_bits = current_block->direction_bits; - #if HAS_MULTI_EXTRUDER - last_moved_extruder = stepper_extruder; + #if DISABLED(MIXING_EXTRUDER) + last_moved_extruder = active_extruder; #endif - - TERN_(HAS_L64XX, L64XX_OK_to_power_up = true); set_directions(); } - #if ENABLED(LASER_POWER_INLINE) - const power_status_t stat = current_block->laser.status; - #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) - laser_trap.enabled = stat.isPlanned && stat.isEnabled; - laser_trap.cur_power = current_block->laser.power_entry; // RESET STATE - laser_trap.cruise_set = false; - #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) - laser_trap.last_step_count = 0; - laser_trap.acc_step_count = current_block->laser.entry_per / 2; - #else - laser_trap.till_update = 0; - #endif - // Always have PWM in this case - if (stat.isPlanned) { // Planner controls the laser - cutter.set_ocr_power( - stat.isEnabled ? laser_trap.cur_power : 0 // ON with power or OFF - ); - } - #else - if (stat.isPlanned) { // Planner controls the laser - #if ENABLED(SPINDLE_LASER_PWM) - cutter.set_ocr_power( - stat.isEnabled ? current_block->laser.power : 0 // ON with power or OFF - ); - #else - cutter.set_enabled(stat.isEnabled); - #endif - } - #endif - #endif // LASER_POWER_INLINE - // At this point, we must ensure the movement about to execute isn't // trying to force the head against a limit switch. If using interrupt- // driven change detection, and already against a limit then no call to @@ -2208,40 +1748,27 @@ uint32_t Stepper::block_phase_isr() { // If delayed Z enable, enable it now. This option will severely interfere with // timing between pulses when chaining motion between blocks, and it could lead // to lost steps in both X and Y axis, so avoid using it unless strictly necessary!! - if (current_block->steps.z) ENABLE_AXIS_Z(); + if (current_block->steps[Z_AXIS]) enable_Z(); #endif // Mark the time_nominal as not calculated yet ticks_nominal = -1; + #if DISABLED(S_CURVE_ACCELERATION) + // Set as deceleration point the initial rate of the block + acc_step_rate = current_block->initial_rate; + #endif + #if ENABLED(S_CURVE_ACCELERATION) // Initialize the Bézier speed curve _calc_bezier_curve_coeffs(current_block->initial_rate, current_block->cruise_rate, current_block->acceleration_time_inverse); // We haven't started the 2nd half of the trapezoid bezier_2nd_half = false; - #else - // Set as deceleration point the initial rate of the block - acc_step_rate = current_block->initial_rate; #endif // Calculate the initial timer interval - interval = calc_timer_interval(current_block->initial_rate, &steps_per_isr); + interval = calc_timer_interval(current_block->initial_rate, oversampling_factor, &steps_per_isr); } - #if ENABLED(LASER_POWER_INLINE_CONTINUOUS) - else { // No new block found; so apply inline laser parameters - // This should mean ending file with 'M5 I' will stop the laser; thus the inline flag isn't needed - const power_status_t stat = planner.laser_inline.status; - if (stat.isPlanned) { // Planner controls the laser - #if ENABLED(SPINDLE_LASER_PWM) - cutter.set_ocr_power( - stat.isEnabled ? planner.laser_inline.power : 0 // ON with power or OFF - ); - #else - cutter.set_enabled(stat.isEnabled); - #endif - } - } - #endif } // Return the interval to wait @@ -2272,87 +1799,76 @@ uint32_t Stepper::block_phase_isr() { else interval = LA_ADV_NEVER; - DIR_WAIT_BEFORE(); + #if ENABLED(MIXING_EXTRUDER) + if (LA_steps >= 0) + MIXING_STEPPERS_LOOP(j) NORM_E_DIR(j); + else + MIXING_STEPPERS_LOOP(j) REV_E_DIR(j); + #else + if (LA_steps >= 0) + NORM_E_DIR(active_extruder); + else + REV_E_DIR(active_extruder); + #endif - #if ENABLED(MIXING_EXTRUDER) - // We don't know which steppers will be stepped because LA loop follows, - // with potentially multiple steps. Set all. - if (LA_steps > 0) - MIXER_STEPPER_LOOP(j) NORM_E_DIR(j); - else if (LA_steps < 0) - MIXER_STEPPER_LOOP(j) REV_E_DIR(j); - #else - if (LA_steps > 0) - NORM_E_DIR(stepper_extruder); - else if (LA_steps < 0) - REV_E_DIR(stepper_extruder); - #endif + // Get the timer count and estimate the end of the pulse + hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t(MIN_PULSE_TICKS); - DIR_WAIT_AFTER(); - - //const hal_timer_t added_step_ticks = hal_timer_t(ADDED_STEP_TICKS); + const hal_timer_t added_step_ticks = hal_timer_t(ADDED_STEP_TICKS); // Step E stepper if we have steps - #if ISR_MULTI_STEPS - bool firstStep = true; - USING_TIMED_PULSE(); - #endif - while (LA_steps) { - #if ISR_MULTI_STEPS - if (firstStep) - firstStep = false; - else - AWAIT_LOW_PULSE(); - #endif // Set the STEP pulse ON #if ENABLED(MIXING_EXTRUDER) - E_STEP_WRITE(mixer.get_next_stepper(), !INVERT_E_STEP_PIN); + MIXING_STEPPERS_LOOP(j) { + // Step mixing steppers (proportionally) + delta_error_m[j] += advance_dividend_m[j]; + // Step when the counter goes over zero + if (delta_error_m[j] >= 0) E_STEP_WRITE(j, !INVERT_E_STEP_PIN); + } #else - E_STEP_WRITE(stepper_extruder, !INVERT_E_STEP_PIN); + E_STEP_WRITE(active_extruder, !INVERT_E_STEP_PIN); #endif // Enforce a minimum duration for STEP pulse ON - #if ISR_PULSE_CONTROL - START_HIGH_PULSE(); + #if MINIMUM_STEPPER_PULSE + // Just wait for the requested pulse duration + while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ } #endif + // Add the delay needed to ensure the maximum driver rate is enforced + if (signed(added_step_ticks) > 0) pulse_end += hal_timer_t(added_step_ticks); + LA_steps < 0 ? ++LA_steps : --LA_steps; - #if ISR_PULSE_CONTROL - AWAIT_HIGH_PULSE(); - #endif - // Set the STEP pulse OFF #if ENABLED(MIXING_EXTRUDER) - E_STEP_WRITE(mixer.get_stepper(), INVERT_E_STEP_PIN); + MIXING_STEPPERS_LOOP(j) { + if (delta_error_m[j] >= 0) { + delta_error_m[j] -= advance_divisor_m; + E_STEP_WRITE(j, INVERT_E_STEP_PIN); + } + } #else - E_STEP_WRITE(stepper_extruder, INVERT_E_STEP_PIN); + E_STEP_WRITE(active_extruder, INVERT_E_STEP_PIN); #endif // For minimum pulse time wait before looping // Just wait for the requested pulse duration - #if ISR_PULSE_CONTROL - if (LA_steps) START_LOW_PULSE(); - #endif + if (LA_steps) { + while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ } + #if MINIMUM_STEPPER_PULSE + // Add to the value, the time that the pulse must be active (to be used on the next loop) + pulse_end += hal_timer_t(MIN_PULSE_TICKS); + #endif + } } // LA_steps return interval; } - #endif // LIN_ADVANCE -#if ENABLED(INTEGRATED_BABYSTEPPING) - - // Timer interrupt for baby-stepping - uint32_t Stepper::babystepping_isr() { - babystep.task(); - return babystep.has_steps() ? BABYSTEP_TICKS : BABYSTEP_NEVER; - } - -#endif - // Check if the given block is busy or not - Must not be called from ISR contexts // The current_block could change in the middle of the read by an Stepper ISR, so // we must explicitly prevent that! @@ -2383,145 +1899,121 @@ bool Stepper::is_block_busy(const block_t* const block) { void Stepper::init() { + // Init Digipot Motor Current + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM + digipot_init(); + #endif + #if MB(ALLIGATOR) const float motor_current[] = MOTOR_CURRENT; unsigned int digipot_motor = 0; - LOOP_L_N(i, 3 + EXTRUDERS) { + for (uint8_t i = 0; i < 3 + EXTRUDERS; i++) { digipot_motor = 255 * (motor_current[i] / 2.5); dac084s085::setValue(i, digipot_motor); } - #endif + #endif//MB(ALLIGATOR) // Init Microstepping Pins - TERN_(HAS_MICROSTEPS, microstep_init()); + #if HAS_MICROSTEPS + microstep_init(); + #endif // Init Dir Pins - TERN_(HAS_X_DIR, X_DIR_INIT()); - TERN_(HAS_X2_DIR, X2_DIR_INIT()); + #if HAS_X_DIR + X_DIR_INIT; + #endif + #if HAS_X2_DIR + X2_DIR_INIT; + #endif #if HAS_Y_DIR - Y_DIR_INIT(); - #if BOTH(Y_DUAL_STEPPER_DRIVERS, HAS_Y2_DIR) - Y2_DIR_INIT(); + Y_DIR_INIT; + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) && HAS_Y2_DIR + Y2_DIR_INIT; #endif #endif #if HAS_Z_DIR - Z_DIR_INIT(); - #if NUM_Z_STEPPER_DRIVERS >= 2 && HAS_Z2_DIR - Z2_DIR_INIT(); - #endif - #if NUM_Z_STEPPER_DRIVERS >= 3 && HAS_Z3_DIR - Z3_DIR_INIT(); - #endif - #if NUM_Z_STEPPER_DRIVERS >= 4 && HAS_Z4_DIR - Z4_DIR_INIT(); + Z_DIR_INIT; + #if ENABLED(Z_DUAL_STEPPER_DRIVERS) && HAS_Z2_DIR + Z2_DIR_INIT; #endif #endif #if HAS_E0_DIR - E0_DIR_INIT(); + E0_DIR_INIT; #endif #if HAS_E1_DIR - E1_DIR_INIT(); + E1_DIR_INIT; #endif #if HAS_E2_DIR - E2_DIR_INIT(); + E2_DIR_INIT; #endif #if HAS_E3_DIR - E3_DIR_INIT(); + E3_DIR_INIT; #endif #if HAS_E4_DIR - E4_DIR_INIT(); - #endif - #if HAS_E5_DIR - E5_DIR_INIT(); - #endif - #if HAS_E6_DIR - E6_DIR_INIT(); - #endif - #if HAS_E7_DIR - E7_DIR_INIT(); + E4_DIR_INIT; #endif // Init Enable Pins - steppers default to disabled. #if HAS_X_ENABLE - X_ENABLE_INIT(); + X_ENABLE_INIT; if (!X_ENABLE_ON) X_ENABLE_WRITE(HIGH); - #if EITHER(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) && HAS_X2_ENABLE - X2_ENABLE_INIT(); + #if (ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS)) && HAS_X2_ENABLE + X2_ENABLE_INIT; if (!X_ENABLE_ON) X2_ENABLE_WRITE(HIGH); #endif #endif #if HAS_Y_ENABLE - Y_ENABLE_INIT(); + Y_ENABLE_INIT; if (!Y_ENABLE_ON) Y_ENABLE_WRITE(HIGH); - #if BOTH(Y_DUAL_STEPPER_DRIVERS, HAS_Y2_ENABLE) - Y2_ENABLE_INIT(); + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) && HAS_Y2_ENABLE + Y2_ENABLE_INIT; if (!Y_ENABLE_ON) Y2_ENABLE_WRITE(HIGH); #endif #endif #if HAS_Z_ENABLE - Z_ENABLE_INIT(); + Z_ENABLE_INIT; if (!Z_ENABLE_ON) Z_ENABLE_WRITE(HIGH); - #if NUM_Z_STEPPER_DRIVERS >= 2 && HAS_Z2_ENABLE - Z2_ENABLE_INIT(); + #if ENABLED(Z_DUAL_STEPPER_DRIVERS) && HAS_Z2_ENABLE + Z2_ENABLE_INIT; if (!Z_ENABLE_ON) Z2_ENABLE_WRITE(HIGH); #endif - #if NUM_Z_STEPPER_DRIVERS >= 3 && HAS_Z3_ENABLE - Z3_ENABLE_INIT(); - if (!Z_ENABLE_ON) Z3_ENABLE_WRITE(HIGH); - #endif - #if NUM_Z_STEPPER_DRIVERS >= 4 && HAS_Z4_ENABLE - Z4_ENABLE_INIT(); - if (!Z_ENABLE_ON) Z4_ENABLE_WRITE(HIGH); - #endif #endif #if HAS_E0_ENABLE - E0_ENABLE_INIT(); + E0_ENABLE_INIT; if (!E_ENABLE_ON) E0_ENABLE_WRITE(HIGH); #endif #if HAS_E1_ENABLE - E1_ENABLE_INIT(); + E1_ENABLE_INIT; if (!E_ENABLE_ON) E1_ENABLE_WRITE(HIGH); #endif #if HAS_E2_ENABLE - E2_ENABLE_INIT(); + E2_ENABLE_INIT; if (!E_ENABLE_ON) E2_ENABLE_WRITE(HIGH); #endif #if HAS_E3_ENABLE - E3_ENABLE_INIT(); + E3_ENABLE_INIT; if (!E_ENABLE_ON) E3_ENABLE_WRITE(HIGH); #endif #if HAS_E4_ENABLE - E4_ENABLE_INIT(); + E4_ENABLE_INIT; if (!E_ENABLE_ON) E4_ENABLE_WRITE(HIGH); #endif - #if HAS_E5_ENABLE - E5_ENABLE_INIT(); - if (!E_ENABLE_ON) E5_ENABLE_WRITE(HIGH); - #endif - #if HAS_E6_ENABLE - E6_ENABLE_INIT(); - if (!E_ENABLE_ON) E6_ENABLE_WRITE(HIGH); - #endif - #if HAS_E7_ENABLE - E7_ENABLE_INIT(); - if (!E_ENABLE_ON) E7_ENABLE_WRITE(HIGH); - #endif - #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT() + #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) - #define _DISABLE_AXIS(AXIS) DISABLE_AXIS_## AXIS() + #define _DISABLE(AXIS) disable_## AXIS() #define AXIS_INIT(AXIS, PIN) \ _STEP_INIT(AXIS); \ _WRITE_STEP(AXIS, _INVERT_STEP_PIN(PIN)); \ - _DISABLE_AXIS(AXIS) + _DISABLE(AXIS) #define E_AXIS_INIT(NUM) AXIS_INIT(E## NUM, E) // Init Step Pins #if HAS_X_STEP - #if EITHER(X_DUAL_STEPPER_DRIVERS, DUAL_X_CARRIAGE) - X2_STEP_INIT(); + #if ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE) + X2_STEP_INIT; X2_STEP_WRITE(INVERT_X_STEP_PIN); #endif AXIS_INIT(X, X); @@ -2529,29 +2021,21 @@ void Stepper::init() { #if HAS_Y_STEP #if ENABLED(Y_DUAL_STEPPER_DRIVERS) - Y2_STEP_INIT(); + Y2_STEP_INIT; Y2_STEP_WRITE(INVERT_Y_STEP_PIN); #endif AXIS_INIT(Y, Y); #endif #if HAS_Z_STEP - #if NUM_Z_STEPPER_DRIVERS >= 2 - Z2_STEP_INIT(); + #if ENABLED(Z_DUAL_STEPPER_DRIVERS) + Z2_STEP_INIT; Z2_STEP_WRITE(INVERT_Z_STEP_PIN); #endif - #if NUM_Z_STEPPER_DRIVERS >= 3 - Z3_STEP_INIT(); - Z3_STEP_WRITE(INVERT_Z_STEP_PIN); - #endif - #if NUM_Z_STEPPER_DRIVERS >= 4 - Z4_STEP_INIT(); - Z4_STEP_WRITE(INVERT_Z_STEP_PIN); - #endif AXIS_INIT(Z, Z); #endif - #if E_STEPPERS && HAS_E0_STEP + #if E_STEPPERS > 0 && HAS_E0_STEP E_AXIS_INIT(0); #endif #if E_STEPPERS > 1 && HAS_E1_STEP @@ -2566,34 +2050,16 @@ void Stepper::init() { #if E_STEPPERS > 4 && HAS_E4_STEP E_AXIS_INIT(4); #endif - #if E_STEPPERS > 5 && HAS_E5_STEP - E_AXIS_INIT(5); - #endif - #if E_STEPPERS > 6 && HAS_E6_STEP - E_AXIS_INIT(6); - #endif - #if E_STEPPERS > 7 && HAS_E7_STEP - E_AXIS_INIT(7); - #endif - #if DISABLED(I2S_STEPPER_STREAM) - HAL_timer_start(STEP_TIMER_NUM, 122); // Init Stepper ISR to 122 Hz for quick starting - wake_up(); - sei(); - #endif + // Init Stepper ISR to 122 Hz for quick starting + HAL_timer_start(STEP_TIMER_NUM, 122); - // Init direction bits for first moves - last_direction_bits = 0 - | (INVERT_X_DIR ? _BV(X_AXIS) : 0) - | (INVERT_Y_DIR ? _BV(Y_AXIS) : 0) - | (INVERT_Z_DIR ? _BV(Z_AXIS) : 0); + ENABLE_STEPPER_DRIVER_INTERRUPT(); - set_directions(); + endstops.enable(true); // Start with endstops active. After homing they can be disabled + sei(); - #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM - initialized = true; - digipot_init(); - #endif + set_directions(); // Init directions to last_direction_bits = 0 } /** @@ -2608,21 +2074,27 @@ void Stepper::init() { void Stepper::_set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { #if CORE_IS_XY // corexy positioning - // these equations follow the form of the dA and dB equations on https://www.corexy.com/theory.html - count_position.set(a + b, CORESIGN(a - b), c); + // these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html + count_position[A_AXIS] = a + b; + count_position[B_AXIS] = CORESIGN(a - b); + count_position[Z_AXIS] = c; #elif CORE_IS_XZ // corexz planning - count_position.set(a + c, b, CORESIGN(a - c)); + count_position[A_AXIS] = a + c; + count_position[Y_AXIS] = b; + count_position[C_AXIS] = CORESIGN(a - c); #elif CORE_IS_YZ // coreyz planning - count_position.set(a, b + c, CORESIGN(b - c)); - #elif ENABLED(MARKFORGED_XY) - count_position.set(a - b, b, c); + count_position[X_AXIS] = a; + count_position[B_AXIS] = b + c; + count_position[C_AXIS] = CORESIGN(b - c); #else // default non-h-bot planning - count_position.set(a, b, c); + count_position[X_AXIS] = a; + count_position[Y_AXIS] = b; + count_position[Z_AXIS] = c; #endif - count_position.e = e; + count_position[E_AXIS] = e; } /** @@ -2632,126 +2104,105 @@ int32_t Stepper::position(const AxisEnum axis) { #ifdef __AVR__ // Protect the access to the position. Only required for AVR, as // any 32bit CPU offers atomic access to 32bit variables - const bool was_enabled = suspend(); + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); #endif const int32_t v = count_position[axis]; #ifdef __AVR__ // Reenable Stepper ISR - if (was_enabled) wake_up(); + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); #endif return v; } -// Set the current position in steps -void Stepper::set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { - planner.synchronize(); - const bool was_enabled = suspend(); - _set_position(a, b, c, e); - if (was_enabled) wake_up(); -} - -void Stepper::set_axis_position(const AxisEnum a, const int32_t &v) { - planner.synchronize(); - - #ifdef __AVR__ - // Protect the access to the position. Only required for AVR, as - // any 32bit CPU offers atomic access to 32bit variables - const bool was_enabled = suspend(); - #endif - - count_position[a] = v; - - #ifdef __AVR__ - // Reenable Stepper ISR - if (was_enabled) wake_up(); - #endif -} - // Signal endstops were triggered - This function can be called from // an ISR context (Temperature, Stepper or limits ISR), so we must // be very careful here. If the interrupt being preempted was the // Stepper ISR (this CAN happen with the endstop limits ISR) then // when the stepper ISR resumes, we must be very sure that the movement -// is properly canceled +// is properly cancelled void Stepper::endstop_triggered(const AxisEnum axis) { - const bool was_enabled = suspend(); - endstops_trigsteps[axis] = ( - #if IS_CORE - (axis == CORE_AXIS_2 - ? CORESIGN(count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2]) - : count_position[CORE_AXIS_1] + count_position[CORE_AXIS_2] - ) * double(0.5) - #elif ENABLED(MARKFORGED_XY) - axis == CORE_AXIS_1 - ? count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2] - : count_position[CORE_AXIS_2] - #else // !IS_CORE - count_position[axis] - #endif - ); + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + + #if IS_CORE + + endstops_trigsteps[axis] = 0.5f * ( + axis == CORE_AXIS_2 ? CORESIGN(count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2]) + : count_position[CORE_AXIS_1] + count_position[CORE_AXIS_2] + ); + + #else // !COREXY && !COREXZ && !COREYZ + + endstops_trigsteps[axis] = count_position[axis]; + + #endif // !COREXY && !COREXZ && !COREYZ // Discard the rest of the move if there is a current block quick_stop(); - if (was_enabled) wake_up(); + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); } int32_t Stepper::triggered_position(const AxisEnum axis) { #ifdef __AVR__ // Protect the access to the position. Only required for AVR, as // any 32bit CPU offers atomic access to 32bit variables - const bool was_enabled = suspend(); + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); #endif const int32_t v = endstops_trigsteps[axis]; #ifdef __AVR__ // Reenable Stepper ISR - if (was_enabled) wake_up(); + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); #endif return v; } -void Stepper::report_a_position(const xyz_long_t &pos) { - #if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY, DELTA, IS_SCARA) - SERIAL_ECHOPAIR(STR_COUNT_A, pos.x, " B:", pos.y); - #else - SERIAL_ECHOPAIR_P(PSTR(STR_COUNT_X), pos.x, SP_Y_LBL, pos.y); - #endif - #if ANY(CORE_IS_XZ, CORE_IS_YZ, DELTA) - SERIAL_ECHOLNPAIR(" C:", pos.z); - #else - SERIAL_ECHOLNPAIR_P(SP_Z_LBL, pos.z); - #endif -} - void Stepper::report_positions() { - #ifdef __AVR__ - // Protect the access to the position. - const bool was_enabled = suspend(); + // Protect the access to the position. + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + + const int32_t xpos = count_position[X_AXIS], + ypos = count_position[Y_AXIS], + zpos = count_position[Z_AXIS]; + + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + + #if CORE_IS_XY || CORE_IS_XZ || IS_DELTA || IS_SCARA + SERIAL_PROTOCOLPGM(MSG_COUNT_A); + #else + SERIAL_PROTOCOLPGM(MSG_COUNT_X); #endif + SERIAL_PROTOCOL(xpos); - const xyz_long_t pos = count_position; - - #ifdef __AVR__ - if (was_enabled) wake_up(); + #if CORE_IS_XY || CORE_IS_YZ || IS_DELTA || IS_SCARA + SERIAL_PROTOCOLPGM(" B:"); + #else + SERIAL_PROTOCOLPGM(" Y:"); #endif + SERIAL_PROTOCOL(ypos); - report_a_position(pos); + #if CORE_IS_XZ || CORE_IS_YZ || IS_DELTA + SERIAL_PROTOCOLPGM(" C:"); + #else + SERIAL_PROTOCOLPGM(" Z:"); + #endif + SERIAL_PROTOCOL(zpos); + + SERIAL_EOL(); } #if ENABLED(BABYSTEPPING) - #define _ENABLE_AXIS(AXIS) ENABLE_AXIS_## AXIS() - #define _READ_DIR(AXIS) AXIS ##_DIR_READ() - #define _INVERT_DIR(AXIS) INVERT_## AXIS ##_DIR - #define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true) - #if MINIMUM_STEPPER_PULSE #define STEP_PULSE_CYCLES ((MINIMUM_STEPPER_PULSE) * CYCLES_PER_MICROSECOND) #else @@ -2765,78 +2216,43 @@ void Stepper::report_positions() { #endif #define EXTRA_CYCLES_BABYSTEP (STEP_PULSE_CYCLES - (CYCLES_EATEN_BABYSTEP)) + #define _ENABLE(AXIS) enable_## AXIS() + #define _READ_DIR(AXIS) AXIS ##_DIR_READ + #define _INVERT_DIR(AXIS) INVERT_## AXIS ##_DIR + #define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true) + #if EXTRA_CYCLES_BABYSTEP > 20 - #define _SAVE_START() const hal_timer_t pulse_start = HAL_timer_get_count(PULSE_TIMER_NUM) - #define _PULSE_WAIT() while (EXTRA_CYCLES_BABYSTEP > (uint32_t)(HAL_timer_get_count(PULSE_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ } + #define _SAVE_START const hal_timer_t pulse_start = HAL_timer_get_count(PULSE_TIMER_NUM) + #define _PULSE_WAIT while (EXTRA_CYCLES_BABYSTEP > (uint32_t)(HAL_timer_get_count(PULSE_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ } #else - #define _SAVE_START() NOOP + #define _SAVE_START NOOP #if EXTRA_CYCLES_BABYSTEP > 0 - #define _PULSE_WAIT() DELAY_NS(EXTRA_CYCLES_BABYSTEP * NANOSECONDS_PER_CYCLE) - #elif ENABLED(DELTA) - #define _PULSE_WAIT() DELAY_US(2); + #define _PULSE_WAIT DELAY_NS(EXTRA_CYCLES_BABYSTEP * NANOSECONDS_PER_CYCLE) #elif STEP_PULSE_CYCLES > 0 - #define _PULSE_WAIT() NOOP + #define _PULSE_WAIT NOOP + #elif ENABLED(DELTA) + #define _PULSE_WAIT DELAY_US(2); #else - #define _PULSE_WAIT() DELAY_US(4); + #define _PULSE_WAIT DELAY_US(4); #endif #endif - #if ENABLED(BABYSTEPPING_EXTRA_DIR_WAIT) - #define EXTRA_DIR_WAIT_BEFORE DIR_WAIT_BEFORE - #define EXTRA_DIR_WAIT_AFTER DIR_WAIT_AFTER - #else - #define EXTRA_DIR_WAIT_BEFORE() - #define EXTRA_DIR_WAIT_AFTER() - #endif - - #if DISABLED(DELTA) - - #define BABYSTEP_AXIS(AXIS, INV, DIR) do{ \ + #define BABYSTEP_AXIS(AXIS, INVERT, DIR) { \ const uint8_t old_dir = _READ_DIR(AXIS); \ - _ENABLE_AXIS(AXIS); \ - DIR_WAIT_BEFORE(); \ - _APPLY_DIR(AXIS, _INVERT_DIR(AXIS)^DIR^INV); \ - DIR_WAIT_AFTER(); \ - _SAVE_START(); \ - _APPLY_STEP(AXIS, !_INVERT_STEP_PIN(AXIS), true); \ - _PULSE_WAIT(); \ - _APPLY_STEP(AXIS, _INVERT_STEP_PIN(AXIS), true); \ - EXTRA_DIR_WAIT_BEFORE(); \ + _ENABLE(AXIS); \ + _APPLY_DIR(AXIS, _INVERT_DIR(AXIS)^DIR^INVERT); \ + DELAY_NS(MINIMUM_STEPPER_DIR_DELAY); \ + _SAVE_START; \ + _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS), true); \ + _PULSE_WAIT; \ + _APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS), true); \ _APPLY_DIR(AXIS, old_dir); \ - EXTRA_DIR_WAIT_AFTER(); \ - }while(0) - - #endif - - #if IS_CORE - - #define BABYSTEP_CORE(A, B, INV, DIR, ALT) do{ \ - const xy_byte_t old_dir = { _READ_DIR(A), _READ_DIR(B) }; \ - _ENABLE_AXIS(A); _ENABLE_AXIS(B); \ - DIR_WAIT_BEFORE(); \ - _APPLY_DIR(A, _INVERT_DIR(A)^DIR^INV); \ - _APPLY_DIR(B, _INVERT_DIR(B)^DIR^INV^ALT); \ - DIR_WAIT_AFTER(); \ - _SAVE_START(); \ - _APPLY_STEP(A, !_INVERT_STEP_PIN(A), true); \ - _APPLY_STEP(B, !_INVERT_STEP_PIN(B), true); \ - _PULSE_WAIT(); \ - _APPLY_STEP(A, _INVERT_STEP_PIN(A), true); \ - _APPLY_STEP(B, _INVERT_STEP_PIN(B), true); \ - EXTRA_DIR_WAIT_BEFORE(); \ - _APPLY_DIR(A, old_dir.a); _APPLY_DIR(B, old_dir.b); \ - EXTRA_DIR_WAIT_AFTER(); \ - }while(0) - - #endif + } // MUST ONLY BE CALLED BY AN ISR, // No other ISR should ever interrupt this! - void Stepper::do_babystep(const AxisEnum axis, const bool direction) { - - #if DISABLED(INTEGRATED_BABYSTEPPING) - cli(); - #endif + void Stepper::babystep(const AxisEnum axis, const bool direction) { + cli(); switch (axis) { @@ -2844,21 +2260,25 @@ void Stepper::report_positions() { case X_AXIS: #if CORE_IS_XY - BABYSTEP_CORE(X, Y, 0, direction, 0); + BABYSTEP_AXIS(X, false, direction); + BABYSTEP_AXIS(Y, false, direction); #elif CORE_IS_XZ - BABYSTEP_CORE(X, Z, 0, direction, 0); + BABYSTEP_AXIS(X, false, direction); + BABYSTEP_AXIS(Z, false, direction); #else - BABYSTEP_AXIS(X, 0, direction); + BABYSTEP_AXIS(X, false, direction); #endif break; case Y_AXIS: #if CORE_IS_XY - BABYSTEP_CORE(X, Y, 1, !direction, (CORESIGN(1)>0)); + BABYSTEP_AXIS(X, false, direction); + BABYSTEP_AXIS(Y, false, direction^(CORESIGN(1)<0)); #elif CORE_IS_YZ - BABYSTEP_CORE(Y, Z, 0, direction, (CORESIGN(1)<0)); + BABYSTEP_AXIS(Y, false, direction); + BABYSTEP_AXIS(Z, false, direction^(CORESIGN(1)<0)); #else - BABYSTEP_AXIS(Y, 0, direction); + BABYSTEP_AXIS(Y, false, direction); #endif break; @@ -2867,9 +2287,13 @@ void Stepper::report_positions() { case Z_AXIS: { #if CORE_IS_XZ - BABYSTEP_CORE(X, Z, BABYSTEP_INVERT_Z, direction, (CORESIGN(1)<0)); + BABYSTEP_AXIS(X, BABYSTEP_INVERT_Z, direction); + BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction^(CORESIGN(1)<0)); + #elif CORE_IS_YZ - BABYSTEP_CORE(Y, Z, BABYSTEP_INVERT_Z, direction, (CORESIGN(1)<0)); + BABYSTEP_AXIS(Y, BABYSTEP_INVERT_Z, direction); + BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction^(CORESIGN(1)<0)); + #elif DISABLED(DELTA) BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction); @@ -2877,40 +2301,38 @@ void Stepper::report_positions() { const bool z_direction = direction ^ BABYSTEP_INVERT_Z; - ENABLE_AXIS_X(); - ENABLE_AXIS_Y(); - ENABLE_AXIS_Z(); + enable_X(); + enable_Y(); + enable_Z(); - DIR_WAIT_BEFORE(); - - const xyz_byte_t old_dir = { X_DIR_READ(), Y_DIR_READ(), Z_DIR_READ() }; + const uint8_t old_x_dir_pin = X_DIR_READ, + old_y_dir_pin = Y_DIR_READ, + old_z_dir_pin = Z_DIR_READ; X_DIR_WRITE(INVERT_X_DIR ^ z_direction); Y_DIR_WRITE(INVERT_Y_DIR ^ z_direction); Z_DIR_WRITE(INVERT_Z_DIR ^ z_direction); - DIR_WAIT_AFTER(); + #if MINIMUM_STEPPER_DIR_DELAY > 0 + DELAY_NS(MINIMUM_STEPPER_DIR_DELAY); + #endif - _SAVE_START(); + _SAVE_START; X_STEP_WRITE(!INVERT_X_STEP_PIN); Y_STEP_WRITE(!INVERT_Y_STEP_PIN); Z_STEP_WRITE(!INVERT_Z_STEP_PIN); - _PULSE_WAIT(); + _PULSE_WAIT; X_STEP_WRITE(INVERT_X_STEP_PIN); Y_STEP_WRITE(INVERT_Y_STEP_PIN); Z_STEP_WRITE(INVERT_Z_STEP_PIN); // Restore direction bits - EXTRA_DIR_WAIT_BEFORE(); - - X_DIR_WRITE(old_dir.x); - Y_DIR_WRITE(old_dir.y); - Z_DIR_WRITE(old_dir.z); - - EXTRA_DIR_WAIT_AFTER(); + X_DIR_WRITE(old_x_dir_pin); + Y_DIR_WRITE(old_y_dir_pin); + Z_DIR_WRITE(old_z_dir_pin); #endif @@ -2918,10 +2340,7 @@ void Stepper::report_positions() { default: break; } - - #if DISABLED(INTEGRATED_BABYSTEPPING) - sei(); - #endif + sei(); } #endif // BABYSTEPPING @@ -2930,10 +2349,10 @@ void Stepper::report_positions() { * Software-controlled Stepper Motor Current */ -#if HAS_MOTOR_CURRENT_SPI +#if HAS_DIGIPOTSS // From Arduino DigitalPotControl example - void Stepper::set_digipot_value_spi(const int16_t address, const int16_t value) { + void Stepper::digitalPotWrite(const int16_t address, const int16_t value) { WRITE(DIGIPOTSS_PIN, LOW); // Take the SS pin low to select the chip SPI.transfer(address); // Send the address and value via SPI SPI.transfer(value); @@ -2941,24 +2360,23 @@ void Stepper::report_positions() { //delay(10); } -#endif // HAS_MOTOR_CURRENT_SPI +#endif // HAS_DIGIPOTSS #if HAS_MOTOR_CURRENT_PWM void Stepper::refresh_motor_power() { - if (!initialized) return; - LOOP_L_N(i, COUNT(motor_current_setting)) { + for (uint8_t i = 0; i < COUNT(motor_current_setting); ++i) { switch (i) { - #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y) + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) case 0: #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) case 1: #endif - #if ANY_PIN(MOTOR_CURRENT_PWM_E, MOTOR_CURRENT_PWM_E0, MOTOR_CURRENT_PWM_E1) + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) case 2: #endif - set_digipot_current(i, motor_current_setting[i]); + digipot_current(i, motor_current_setting[i]); default: break; } } @@ -2966,106 +2384,68 @@ void Stepper::report_positions() { #endif // HAS_MOTOR_CURRENT_PWM -#if !MB(PRINTRBOARD_G2) +#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM - #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + void Stepper::digipot_current(const uint8_t driver, const int current) { - void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { - if (WITHIN(driver, 0, COUNT(motor_current_setting) - 1)) + #if HAS_DIGIPOTSS + + const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; + digitalPotWrite(digipot_ch[driver], current); + + #elif HAS_MOTOR_CURRENT_PWM + + if (WITHIN(driver, 0, 2)) motor_current_setting[driver] = current; // update motor_current_setting - if (!initialized) return; - - #if HAS_MOTOR_CURRENT_SPI - - //SERIAL_ECHOLNPAIR("Digipotss current ", current); - - const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; - set_digipot_value_spi(digipot_ch[driver], current); - - #elif HAS_MOTOR_CURRENT_PWM - - #define _WRITE_CURRENT_PWM(P) analogWrite(pin_t(MOTOR_CURRENT_PWM_## P ##_PIN), 255L * current / (MOTOR_CURRENT_PWM_RANGE)) - switch (driver) { - case 0: - #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) - _WRITE_CURRENT_PWM(X); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) - _WRITE_CURRENT_PWM(Y); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) - _WRITE_CURRENT_PWM(XY); - #endif - break; - case 1: - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - _WRITE_CURRENT_PWM(Z); - #endif - break; - case 2: - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - _WRITE_CURRENT_PWM(E); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E0) - _WRITE_CURRENT_PWM(E0); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E1) - _WRITE_CURRENT_PWM(E1); - #endif - break; - } - #endif - } - - void Stepper::digipot_init() { - - #if HAS_MOTOR_CURRENT_SPI - - SPI.begin(); - SET_OUTPUT(DIGIPOTSS_PIN); - - LOOP_L_N(i, COUNT(motor_current_setting)) - set_digipot_current(i, motor_current_setting[i]); - - #elif HAS_MOTOR_CURRENT_PWM - - #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) - SET_PWM(MOTOR_CURRENT_PWM_X_PIN); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) - SET_PWM(MOTOR_CURRENT_PWM_Y_PIN); - #endif + #define _WRITE_CURRENT_PWM(P) analogWrite(MOTOR_CURRENT_PWM_## P ##_PIN, 255L * current / (MOTOR_CURRENT_PWM_RANGE)) + switch (driver) { #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) - SET_PWM(MOTOR_CURRENT_PWM_XY_PIN); + case 0: _WRITE_CURRENT_PWM(XY); break; #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - SET_PWM(MOTOR_CURRENT_PWM_Z_PIN); + case 1: _WRITE_CURRENT_PWM(Z); break; #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) - SET_PWM(MOTOR_CURRENT_PWM_E_PIN); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E0) - SET_PWM(MOTOR_CURRENT_PWM_E0_PIN); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_E1) - SET_PWM(MOTOR_CURRENT_PWM_E1_PIN); + case 2: _WRITE_CURRENT_PWM(E); break; #endif + } + #endif + } - refresh_motor_power(); + void Stepper::digipot_init() { - // Set Timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise) - #ifdef __AVR__ - SET_CS5(PRESCALER_1); - #endif + #if HAS_DIGIPOTSS + + static const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; + + SPI.begin(); + SET_OUTPUT(DIGIPOTSS_PIN); + + for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) { + //digitalPotWrite(digipot_ch[i], digipot_motor_current[i]); + digipot_current(i, digipot_motor_current[i]); + } + + #elif HAS_MOTOR_CURRENT_PWM + + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + SET_OUTPUT(MOTOR_CURRENT_PWM_XY_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + SET_OUTPUT(MOTOR_CURRENT_PWM_Z_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + SET_OUTPUT(MOTOR_CURRENT_PWM_E_PIN); #endif - } - #endif + refresh_motor_power(); -#else // PRINTRBOARD_G2 + // Set Timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise) + SET_CS5(PRESCALER_1); - #include HAL_PATH(../HAL, fastio/G2_PWM.h) + #endif + } #endif @@ -3076,415 +2456,150 @@ void Stepper::report_positions() { */ void Stepper::microstep_init() { - #if HAS_X_MS_PINS - SET_OUTPUT(X_MS1_PIN); - SET_OUTPUT(X_MS2_PIN); - #if PIN_EXISTS(X_MS3) - SET_OUTPUT(X_MS3_PIN); - #endif - #endif - #if HAS_X2_MS_PINS - SET_OUTPUT(X2_MS1_PIN); - SET_OUTPUT(X2_MS2_PIN); - #if PIN_EXISTS(X2_MS3) - SET_OUTPUT(X2_MS3_PIN); - #endif - #endif - #if HAS_Y_MS_PINS + SET_OUTPUT(X_MS1_PIN); + SET_OUTPUT(X_MS2_PIN); + #if HAS_Y_MICROSTEPS SET_OUTPUT(Y_MS1_PIN); SET_OUTPUT(Y_MS2_PIN); - #if PIN_EXISTS(Y_MS3) - SET_OUTPUT(Y_MS3_PIN); - #endif #endif - #if HAS_Y2_MS_PINS - SET_OUTPUT(Y2_MS1_PIN); - SET_OUTPUT(Y2_MS2_PIN); - #if PIN_EXISTS(Y2_MS3) - SET_OUTPUT(Y2_MS3_PIN); - #endif - #endif - #if HAS_Z_MS_PINS + #if HAS_Z_MICROSTEPS SET_OUTPUT(Z_MS1_PIN); SET_OUTPUT(Z_MS2_PIN); - #if PIN_EXISTS(Z_MS3) - SET_OUTPUT(Z_MS3_PIN); - #endif #endif - #if HAS_Z2_MS_PINS - SET_OUTPUT(Z2_MS1_PIN); - SET_OUTPUT(Z2_MS2_PIN); - #if PIN_EXISTS(Z2_MS3) - SET_OUTPUT(Z2_MS3_PIN); - #endif - #endif - #if HAS_Z3_MS_PINS - SET_OUTPUT(Z3_MS1_PIN); - SET_OUTPUT(Z3_MS2_PIN); - #if PIN_EXISTS(Z3_MS3) - SET_OUTPUT(Z3_MS3_PIN); - #endif - #endif - #if HAS_Z4_MS_PINS - SET_OUTPUT(Z4_MS1_PIN); - SET_OUTPUT(Z4_MS2_PIN); - #if PIN_EXISTS(Z4_MS3) - SET_OUTPUT(Z4_MS3_PIN); - #endif - #endif - #if HAS_E0_MS_PINS + #if HAS_E0_MICROSTEPS SET_OUTPUT(E0_MS1_PIN); SET_OUTPUT(E0_MS2_PIN); - #if PIN_EXISTS(E0_MS3) - SET_OUTPUT(E0_MS3_PIN); - #endif #endif - #if HAS_E1_MS_PINS + #if HAS_E1_MICROSTEPS SET_OUTPUT(E1_MS1_PIN); SET_OUTPUT(E1_MS2_PIN); - #if PIN_EXISTS(E1_MS3) - SET_OUTPUT(E1_MS3_PIN); - #endif #endif - #if HAS_E2_MS_PINS + #if HAS_E2_MICROSTEPS SET_OUTPUT(E2_MS1_PIN); SET_OUTPUT(E2_MS2_PIN); - #if PIN_EXISTS(E2_MS3) - SET_OUTPUT(E2_MS3_PIN); - #endif #endif - #if HAS_E3_MS_PINS + #if HAS_E3_MICROSTEPS SET_OUTPUT(E3_MS1_PIN); SET_OUTPUT(E3_MS2_PIN); - #if PIN_EXISTS(E3_MS3) - SET_OUTPUT(E3_MS3_PIN); - #endif #endif - #if HAS_E4_MS_PINS + #if HAS_E4_MICROSTEPS SET_OUTPUT(E4_MS1_PIN); SET_OUTPUT(E4_MS2_PIN); - #if PIN_EXISTS(E4_MS3) - SET_OUTPUT(E4_MS3_PIN); - #endif #endif - #if HAS_E5_MS_PINS - SET_OUTPUT(E5_MS1_PIN); - SET_OUTPUT(E5_MS2_PIN); - #if PIN_EXISTS(E5_MS3) - SET_OUTPUT(E5_MS3_PIN); - #endif - #endif - #if HAS_E6_MS_PINS - SET_OUTPUT(E6_MS1_PIN); - SET_OUTPUT(E6_MS2_PIN); - #if PIN_EXISTS(E6_MS3) - SET_OUTPUT(E6_MS3_PIN); - #endif - #endif - #if HAS_E7_MS_PINS - SET_OUTPUT(E7_MS1_PIN); - SET_OUTPUT(E7_MS2_PIN); - #if PIN_EXISTS(E7_MS3) - SET_OUTPUT(E7_MS3_PIN); - #endif - #endif - static const uint8_t microstep_modes[] = MICROSTEP_MODES; for (uint16_t i = 0; i < COUNT(microstep_modes); i++) microstep_mode(i, microstep_modes[i]); } - void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2, const int8_t ms3) { + void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2) { if (ms1 >= 0) switch (driver) { - #if HAS_X_MS_PINS || HAS_X2_MS_PINS - case 0: - #if HAS_X_MS_PINS - WRITE(X_MS1_PIN, ms1); - #endif - #if HAS_X2_MS_PINS - WRITE(X2_MS1_PIN, ms1); - #endif - break; + case 0: WRITE(X_MS1_PIN, ms1); break; + #if HAS_Y_MICROSTEPS + case 1: WRITE(Y_MS1_PIN, ms1); break; #endif - #if HAS_Y_MS_PINS || HAS_Y2_MS_PINS - case 1: - #if HAS_Y_MS_PINS - WRITE(Y_MS1_PIN, ms1); - #endif - #if HAS_Y2_MS_PINS - WRITE(Y2_MS1_PIN, ms1); - #endif - break; + #if HAS_Z_MICROSTEPS + case 2: WRITE(Z_MS1_PIN, ms1); break; #endif - #if HAS_SOME_Z_MS_PINS - case 2: - #if HAS_Z_MS_PINS - WRITE(Z_MS1_PIN, ms1); - #endif - #if HAS_Z2_MS_PINS - WRITE(Z2_MS1_PIN, ms1); - #endif - #if HAS_Z3_MS_PINS - WRITE(Z3_MS1_PIN, ms1); - #endif - #if HAS_Z4_MS_PINS - WRITE(Z4_MS1_PIN, ms1); - #endif - break; + #if HAS_E0_MICROSTEPS + case 3: WRITE(E0_MS1_PIN, ms1); break; #endif - #if HAS_E0_MS_PINS - case 3: WRITE(E0_MS1_PIN, ms1); break; + #if HAS_E1_MICROSTEPS + case 4: WRITE(E1_MS1_PIN, ms1); break; #endif - #if HAS_E1_MS_PINS - case 4: WRITE(E1_MS1_PIN, ms1); break; + #if HAS_E2_MICROSTEPS + case 5: WRITE(E2_MS1_PIN, ms1); break; #endif - #if HAS_E2_MS_PINS - case 5: WRITE(E2_MS1_PIN, ms1); break; + #if HAS_E3_MICROSTEPS + case 6: WRITE(E3_MS1_PIN, ms1); break; #endif - #if HAS_E3_MS_PINS - case 6: WRITE(E3_MS1_PIN, ms1); break; - #endif - #if HAS_E4_MS_PINS - case 7: WRITE(E4_MS1_PIN, ms1); break; - #endif - #if HAS_E5_MS_PINS - case 8: WRITE(E5_MS1_PIN, ms1); break; - #endif - #if HAS_E6_MS_PINS - case 9: WRITE(E6_MS1_PIN, ms1); break; - #endif - #if HAS_E7_MS_PINS - case 10: WRITE(E7_MS1_PIN, ms1); break; + #if HAS_E4_MICROSTEPS + case 7: WRITE(E4_MS1_PIN, ms1); break; #endif } if (ms2 >= 0) switch (driver) { - #if HAS_X_MS_PINS || HAS_X2_MS_PINS - case 0: - #if HAS_X_MS_PINS - WRITE(X_MS2_PIN, ms2); - #endif - #if HAS_X2_MS_PINS - WRITE(X2_MS2_PIN, ms2); - #endif - break; + case 0: WRITE(X_MS2_PIN, ms2); break; + #if HAS_Y_MICROSTEPS + case 1: WRITE(Y_MS2_PIN, ms2); break; #endif - #if HAS_Y_MS_PINS || HAS_Y2_MS_PINS - case 1: - #if HAS_Y_MS_PINS - WRITE(Y_MS2_PIN, ms2); - #endif - #if HAS_Y2_MS_PINS - WRITE(Y2_MS2_PIN, ms2); - #endif - break; + #if HAS_Z_MICROSTEPS + case 2: WRITE(Z_MS2_PIN, ms2); break; #endif - #if HAS_SOME_Z_MS_PINS - case 2: - #if HAS_Z_MS_PINS - WRITE(Z_MS2_PIN, ms2); - #endif - #if HAS_Z2_MS_PINS - WRITE(Z2_MS2_PIN, ms2); - #endif - #if HAS_Z3_MS_PINS - WRITE(Z3_MS2_PIN, ms2); - #endif - #if HAS_Z4_MS_PINS - WRITE(Z4_MS2_PIN, ms2); - #endif - break; + #if HAS_E0_MICROSTEPS + case 3: WRITE(E0_MS2_PIN, ms2); break; #endif - #if HAS_E0_MS_PINS - case 3: WRITE(E0_MS2_PIN, ms2); break; + #if HAS_E1_MICROSTEPS + case 4: WRITE(E1_MS2_PIN, ms2); break; #endif - #if HAS_E1_MS_PINS - case 4: WRITE(E1_MS2_PIN, ms2); break; + #if HAS_E2_MICROSTEPS + case 5: WRITE(E2_MS2_PIN, ms2); break; #endif - #if HAS_E2_MS_PINS - case 5: WRITE(E2_MS2_PIN, ms2); break; + #if HAS_E3_MICROSTEPS + case 6: WRITE(E3_MS2_PIN, ms2); break; #endif - #if HAS_E3_MS_PINS - case 6: WRITE(E3_MS2_PIN, ms2); break; - #endif - #if HAS_E4_MS_PINS - case 7: WRITE(E4_MS2_PIN, ms2); break; - #endif - #if HAS_E5_MS_PINS - case 8: WRITE(E5_MS2_PIN, ms2); break; - #endif - #if HAS_E6_MS_PINS - case 9: WRITE(E6_MS2_PIN, ms2); break; - #endif - #if HAS_E7_MS_PINS - case 10: WRITE(E7_MS2_PIN, ms2); break; - #endif - } - if (ms3 >= 0) switch (driver) { - #if HAS_X_MS_PINS || HAS_X2_MS_PINS - case 0: - #if HAS_X_MS_PINS && PIN_EXISTS(X_MS3) - WRITE(X_MS3_PIN, ms3); - #endif - #if HAS_X2_MS_PINS && PIN_EXISTS(X2_MS3) - WRITE(X2_MS3_PIN, ms3); - #endif - break; - #endif - #if HAS_Y_MS_PINS || HAS_Y2_MS_PINS - case 1: - #if HAS_Y_MS_PINS && PIN_EXISTS(Y_MS3) - WRITE(Y_MS3_PIN, ms3); - #endif - #if HAS_Y2_MS_PINS && PIN_EXISTS(Y2_MS3) - WRITE(Y2_MS3_PIN, ms3); - #endif - break; - #endif - #if HAS_SOME_Z_MS_PINS - case 2: - #if HAS_Z_MS_PINS && PIN_EXISTS(Z_MS3) - WRITE(Z_MS3_PIN, ms3); - #endif - #if HAS_Z2_MS_PINS && PIN_EXISTS(Z2_MS3) - WRITE(Z2_MS3_PIN, ms3); - #endif - #if HAS_Z3_MS_PINS && PIN_EXISTS(Z3_MS3) - WRITE(Z3_MS3_PIN, ms3); - #endif - #if HAS_Z4_MS_PINS && PIN_EXISTS(Z4_MS3) - WRITE(Z4_MS3_PIN, ms3); - #endif - break; - #endif - #if HAS_E0_MS_PINS && PIN_EXISTS(E0_MS3) - case 3: WRITE(E0_MS3_PIN, ms3); break; - #endif - #if HAS_E1_MS_PINS && PIN_EXISTS(E1_MS3) - case 4: WRITE(E1_MS3_PIN, ms3); break; - #endif - #if HAS_E2_MS_PINS && PIN_EXISTS(E2_MS3) - case 5: WRITE(E2_MS3_PIN, ms3); break; - #endif - #if HAS_E3_MS_PINS && PIN_EXISTS(E3_MS3) - case 6: WRITE(E3_MS3_PIN, ms3); break; - #endif - #if HAS_E4_MS_PINS && PIN_EXISTS(E4_MS3) - case 7: WRITE(E4_MS3_PIN, ms3); break; - #endif - #if HAS_E5_MS_PINS && PIN_EXISTS(E5_MS3) - case 8: WRITE(E5_MS3_PIN, ms3); break; - #endif - #if HAS_E6_MS_PINS && PIN_EXISTS(E6_MS3) - case 9: WRITE(E6_MS3_PIN, ms3); break; - #endif - #if HAS_E7_MS_PINS && PIN_EXISTS(E7_MS3) - case 10: WRITE(E7_MS3_PIN, ms3); break; + #if HAS_E4_MICROSTEPS + case 7: WRITE(E4_MS2_PIN, ms2); break; #endif } } void Stepper::microstep_mode(const uint8_t driver, const uint8_t stepping_mode) { switch (stepping_mode) { - #if HAS_MICROSTEP1 - case 1: microstep_ms(driver, MICROSTEP1); break; - #endif - #if HAS_MICROSTEP2 + case 1: microstep_ms(driver, MICROSTEP1); break; + #if ENABLED(HEROIC_STEPPER_DRIVERS) + case 128: microstep_ms(driver, MICROSTEP128); break; + #else case 2: microstep_ms(driver, MICROSTEP2); break; - #endif - #if HAS_MICROSTEP4 case 4: microstep_ms(driver, MICROSTEP4); break; #endif - #if HAS_MICROSTEP8 - case 8: microstep_ms(driver, MICROSTEP8); break; - #endif - #if HAS_MICROSTEP16 - case 16: microstep_ms(driver, MICROSTEP16); break; - #endif - #if HAS_MICROSTEP32 + case 8: microstep_ms(driver, MICROSTEP8); break; + case 16: microstep_ms(driver, MICROSTEP16); break; + #if MB(ALLIGATOR) case 32: microstep_ms(driver, MICROSTEP32); break; #endif - #if HAS_MICROSTEP64 - case 64: microstep_ms(driver, MICROSTEP64); break; - #endif - #if HAS_MICROSTEP128 - case 128: microstep_ms(driver, MICROSTEP128); break; - #endif - - default: SERIAL_ERROR_MSG("Microsteps unavailable"); break; + default: SERIAL_ERROR_START(); SERIAL_ERRORLNPGM("Microsteps unavailable"); break; } } void Stepper::microstep_readings() { - #define PIN_CHAR(P) SERIAL_CHAR('0' + READ(P##_PIN)) - #define MS_LINE(A) do{ SERIAL_ECHOPGM(" " STRINGIFY(A) ":"); PIN_CHAR(A##_MS1); PIN_CHAR(A##_MS2); }while(0) - SERIAL_ECHOPGM("MS1|2|3 Pins"); - #if HAS_X_MS_PINS - MS_LINE(X); - #if PIN_EXISTS(X_MS3) - PIN_CHAR(X_MS3); - #endif + SERIAL_PROTOCOLLNPGM("MS1,MS2 Pins"); + SERIAL_PROTOCOLPGM("X: "); + SERIAL_PROTOCOL(READ(X_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(X_MS2_PIN)); + #if HAS_Y_MICROSTEPS + SERIAL_PROTOCOLPGM("Y: "); + SERIAL_PROTOCOL(READ(Y_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(Y_MS2_PIN)); #endif - #if HAS_Y_MS_PINS - MS_LINE(Y); - #if PIN_EXISTS(Y_MS3) - PIN_CHAR(Y_MS3); - #endif + #if HAS_Z_MICROSTEPS + SERIAL_PROTOCOLPGM("Z: "); + SERIAL_PROTOCOL(READ(Z_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(Z_MS2_PIN)); #endif - #if HAS_Z_MS_PINS - MS_LINE(Z); - #if PIN_EXISTS(Z_MS3) - PIN_CHAR(Z_MS3); - #endif + #if HAS_E0_MICROSTEPS + SERIAL_PROTOCOLPGM("E0: "); + SERIAL_PROTOCOL(READ(E0_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E0_MS2_PIN)); #endif - #if HAS_E0_MS_PINS - MS_LINE(E0); - #if PIN_EXISTS(E0_MS3) - PIN_CHAR(E0_MS3); - #endif + #if HAS_E1_MICROSTEPS + SERIAL_PROTOCOLPGM("E1: "); + SERIAL_PROTOCOL(READ(E1_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E1_MS2_PIN)); #endif - #if HAS_E1_MS_PINS - MS_LINE(E1); - #if PIN_EXISTS(E1_MS3) - PIN_CHAR(E1_MS3); - #endif + #if HAS_E2_MICROSTEPS + SERIAL_PROTOCOLPGM("E2: "); + SERIAL_PROTOCOL(READ(E2_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E2_MS2_PIN)); #endif - #if HAS_E2_MS_PINS - MS_LINE(E2); - #if PIN_EXISTS(E2_MS3) - PIN_CHAR(E2_MS3); - #endif + #if HAS_E3_MICROSTEPS + SERIAL_PROTOCOLPGM("E3: "); + SERIAL_PROTOCOL(READ(E3_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E3_MS2_PIN)); #endif - #if HAS_E3_MS_PINS - MS_LINE(E3); - #if PIN_EXISTS(E3_MS3) - PIN_CHAR(E3_MS3); - #endif + #if HAS_E4_MICROSTEPS + SERIAL_PROTOCOLPGM("E4: "); + SERIAL_PROTOCOL(READ(E4_MS1_PIN)); + SERIAL_PROTOCOLLN(READ(E4_MS2_PIN)); #endif - #if HAS_E4_MS_PINS - MS_LINE(E4); - #if PIN_EXISTS(E4_MS3) - PIN_CHAR(E4_MS3); - #endif - #endif - #if HAS_E5_MS_PINS - MS_LINE(E5); - #if PIN_EXISTS(E5_MS3) - PIN_CHAR(E5_MS3); - #endif - #endif - #if HAS_E6_MS_PINS - MS_LINE(E6); - #if PIN_EXISTS(E6_MS3) - PIN_CHAR(E6_MS3); - #endif - #endif - #if HAS_E7_MS_PINS - MS_LINE(E7); - #if PIN_EXISTS(E7_MS3) - PIN_CHAR(E7_MS3); - #endif - #endif - SERIAL_EOL(); } #endif // HAS_MICROSTEPS diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 572c3f3f9b..7e9f9cbe17 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * stepper.h - stepper motor driver: executes motion plans of planner.c using the stepper motors @@ -38,16 +37,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Grbl. If not, see . + * along with Grbl. If not, see . */ -#include "../inc/MarlinConfig.h" +#ifndef STEPPER_H +#define STEPPER_H -#include "planner.h" -#include "stepper/indirection.h" -#ifdef __AVR__ - #include "speed_lookuptable.h" -#endif +#include "../inc/MarlinConfig.h" // Disable multiple steps per ISR //#define DISABLE_MULTI_STEPPING @@ -56,24 +52,19 @@ // Estimate the amount of time the Stepper ISR will take to execute // -/** - * The method of calculating these cycle-constants is unclear. - * Most of them are no longer used directly for pulse timing, and exist - * only to estimate a maximum step rate based on the user's configuration. - * As 32-bit processors continue to diverge, maintaining cycle counts - * will become increasingly difficult and error-prone. - */ +#ifndef MINIMUM_STEPPER_PULSE + #define MINIMUM_STEPPER_PULSE 0UL +#endif + +#ifndef MAXIMUM_STEPPER_RATE + #if MINIMUM_STEPPER_PULSE + #define MAXIMUM_STEPPER_RATE (1000000UL / (2UL * (unsigned long)(MINIMUM_STEPPER_PULSE))) + #else + #define MAXIMUM_STEPPER_RATE 500000UL + #endif +#endif #ifdef CPU_32_BIT - /** - * Duration of START_TIMED_PULSE - * - * ...as measured on an LPC1768 with a scope and converted to cycles. - * Not applicable to other 32-bit processors, but as long as others - * take longer, pulses will be longer. For example the SKR Pro - * (stm32f407zgt6) requires ~60 cyles. - */ - #define TIMER_READ_ADD_AND_STORE_CYCLES 34UL // The base ISR takes 792 cycles #define ISR_BASE_CYCLES 792UL @@ -102,8 +93,6 @@ #define ISR_STEPPER_CYCLES 16UL #else - // Cycles to perform actions in START_TIMED_PULSE - #define TIMER_READ_ADD_AND_STORE_CYCLES 13UL // The base ISR takes 752 cycles #define ISR_BASE_CYCLES 752UL @@ -134,83 +123,79 @@ #endif // Add time for each stepper -#if HAS_X_STEP +#ifdef HAS_X_STEP + #define ISR_START_X_STEPPER_CYCLES ISR_START_STEPPER_CYCLES #define ISR_X_STEPPER_CYCLES ISR_STEPPER_CYCLES #else + #define ISR_START_X_STEPPER_CYCLES 0UL #define ISR_X_STEPPER_CYCLES 0UL #endif -#if HAS_Y_STEP +#ifdef HAS_Y_STEP + #define ISR_START_Y_STEPPER_CYCLES ISR_START_STEPPER_CYCLES #define ISR_Y_STEPPER_CYCLES ISR_STEPPER_CYCLES #else #define ISR_START_Y_STEPPER_CYCLES 0UL #define ISR_Y_STEPPER_CYCLES 0UL #endif -#if HAS_Z_STEP +#ifdef HAS_Z_STEP + #define ISR_START_Z_STEPPER_CYCLES ISR_START_STEPPER_CYCLES #define ISR_Z_STEPPER_CYCLES ISR_STEPPER_CYCLES #else + #define ISR_START_Z_STEPPER_CYCLES 0UL #define ISR_Z_STEPPER_CYCLES 0UL #endif // E is always interpolated, even for mixing extruders +#define ISR_START_E_STEPPER_CYCLES ISR_START_STEPPER_CYCLES #define ISR_E_STEPPER_CYCLES ISR_STEPPER_CYCLES -// If linear advance is disabled, the loop also handles them +// If linear advance is disabled, then the loop also handles them #if DISABLED(LIN_ADVANCE) && ENABLED(MIXING_EXTRUDER) + #define ISR_START_MIXING_STEPPER_CYCLES ((MIXING_STEPPERS) * (ISR_START_STEPPER_CYCLES)) #define ISR_MIXING_STEPPER_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) #else + #define ISR_START_MIXING_STEPPER_CYCLES 0UL #define ISR_MIXING_STEPPER_CYCLES 0UL #endif +// Calculate the minimum time to start all stepper pulses in the ISR loop +#define MIN_ISR_START_LOOP_CYCLES (ISR_START_X_STEPPER_CYCLES + ISR_START_Y_STEPPER_CYCLES + ISR_START_Z_STEPPER_CYCLES + ISR_START_E_STEPPER_CYCLES + ISR_START_MIXING_STEPPER_CYCLES) + // And the total minimum loop time, not including the base #define MIN_ISR_LOOP_CYCLES (ISR_X_STEPPER_CYCLES + ISR_Y_STEPPER_CYCLES + ISR_Z_STEPPER_CYCLES + ISR_E_STEPPER_CYCLES + ISR_MIXING_STEPPER_CYCLES) // Calculate the minimum MPU cycles needed per pulse to enforce, limited to the max stepper rate -#define _MIN_STEPPER_PULSE_CYCLES(N) _MAX(uint32_t((F_CPU) / (MAXIMUM_STEPPER_RATE)), ((F_CPU) / 500000UL) * (N)) +#define _MIN_STEPPER_PULSE_CYCLES(N) MAX((unsigned long)((F_CPU) / (MAXIMUM_STEPPER_RATE)), ((F_CPU) / 500000UL) * (N)) #if MINIMUM_STEPPER_PULSE - #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(uint32_t(MINIMUM_STEPPER_PULSE)) -#elif HAS_DRIVER(LV8729) - #define MIN_STEPPER_PULSE_CYCLES uint32_t((((F_CPU) - 1) / 2000000) + 1) // 0.5µs, aka 500ns + #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES((unsigned long)(MINIMUM_STEPPER_PULSE)) #else #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(1UL) #endif -// Calculate the minimum pulse times (high and low) -#if MINIMUM_STEPPER_PULSE && MAXIMUM_STEPPER_RATE - constexpr uint32_t _MIN_STEP_PERIOD_NS = 1000000000UL / MAXIMUM_STEPPER_RATE; - constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE; - constexpr uint32_t _MIN_PULSE_LOW_NS = _MAX((_MIN_STEP_PERIOD_NS - _MIN(_MIN_STEP_PERIOD_NS, _MIN_PULSE_HIGH_NS)), _MIN_PULSE_HIGH_NS); -#elif MINIMUM_STEPPER_PULSE - // Assume 50% duty cycle - constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE; - constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS; -#elif MAXIMUM_STEPPER_RATE - // Assume 50% duty cycle - constexpr uint32_t _MIN_PULSE_HIGH_NS = 500000000UL / MAXIMUM_STEPPER_RATE; - constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS; -#else - #error "Expected at least one of MINIMUM_STEPPER_PULSE or MAXIMUM_STEPPER_RATE to be defined" -#endif +// Calculate the minimum ticks of the PULSE timer that must elapse with the step pulse enabled +// adding the "start stepper pulse" code section execution cycles to account for that not all +// pulses start at the beginning of the loop, so an extra time must be added to compensate so +// the last generated pulse (usually the extruder stepper) has the right length +#define MIN_PULSE_TICKS (((PULSE_TIMER_TICKS_PER_US) * (unsigned long)(MINIMUM_STEPPER_PULSE)) + ((MIN_ISR_START_LOOP_CYCLES) / (unsigned long)(PULSE_TIMER_PRESCALE))) + +// Calculate the extra ticks of the PULSE timer between step pulses +#define ADDED_STEP_TICKS (((MIN_STEPPER_PULSE_CYCLES) / (PULSE_TIMER_PRESCALE)) - (MIN_PULSE_TICKS)) // But the user could be enforcing a minimum time, so the loop time is -#define ISR_LOOP_CYCLES (ISR_LOOP_BASE_CYCLES + _MAX(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LOOP_CYCLES)) +#define ISR_LOOP_CYCLES (ISR_LOOP_BASE_CYCLES + MAX(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LOOP_CYCLES)) // If linear advance is enabled, then it is handled separately #if ENABLED(LIN_ADVANCE) // Estimate the minimum LA loop time - #if ENABLED(MIXING_EXTRUDER) // ToDo: ??? - // HELP ME: What is what? - // Directions are set up for MIXING_STEPPERS - like before. - // Finding the right stepper may last up to MIXING_STEPPERS loops in get_next_stepper(). - // These loops are a bit faster than advancing a bresenham counter. - // Always only one e-stepper is stepped. + #if ENABLED(MIXING_EXTRUDER) #define MIN_ISR_LA_LOOP_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) #else #define MIN_ISR_LA_LOOP_CYCLES ISR_STEPPER_CYCLES #endif // And the real loop time - #define ISR_LA_LOOP_CYCLES _MAX(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LA_LOOP_CYCLES) + #define ISR_LA_LOOP_CYCLES MAX(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LA_LOOP_CYCLES) #else #define ISR_LA_LOOP_CYCLES 0UL @@ -229,41 +214,35 @@ #define MAX_STEP_ISR_FREQUENCY_2X ((F_CPU) / ISR_EXECUTION_CYCLES(2)) #define MAX_STEP_ISR_FREQUENCY_1X ((F_CPU) / ISR_EXECUTION_CYCLES(1)) -// The minimum step ISR rate used by ADAPTIVE_STEP_SMOOTHING to target 50% CPU usage -// This does not account for the possibility of multi-stepping. -// Perhaps DISABLE_MULTI_STEPPING should be required with ADAPTIVE_STEP_SMOOTHING. -#define MIN_STEP_ISR_FREQUENCY (MAX_STEP_ISR_FREQUENCY_1X / 2) +// The minimum allowable frequency for step smoothing will be 1/10 of the maximum nominal frequency (in Hz) +#define MIN_STEP_ISR_FREQUENCY MAX_STEP_ISR_FREQUENCY_1X // // Stepper class definition // + +#include "stepper_indirection.h" + +#ifdef __AVR__ + #include "speed_lookuptable.h" +#endif + +#include "../module/planner.h" +#include "../core/language.h" + class Stepper { public: - #if EITHER(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) - static bool separate_multi_axis; + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + static bool homing_dual_axis; #endif - #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM - #if HAS_MOTOR_CURRENT_PWM - #ifndef PWM_MOTOR_CURRENT - #define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT - #endif - #define MOTOR_CURRENT_COUNT 3 - #elif HAS_MOTOR_CURRENT_SPI - static constexpr uint32_t digipot_count[] = DIGIPOT_MOTOR_CURRENT; - #define MOTOR_CURRENT_COUNT COUNT(Stepper::digipot_count) + #if HAS_MOTOR_CURRENT_PWM + #ifndef PWM_MOTOR_CURRENT + #define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT #endif - static bool initialized; - static uint32_t motor_current_setting[MOTOR_CURRENT_COUNT]; // Initialized by settings.load() - #endif - - // Last-moved extruder, as set when the last movement was fetched from planner - #if HAS_MULTI_EXTRUDER - static uint8_t last_moved_extruder; - #else - static constexpr uint8_t last_moved_extruder = 0; + static uint32_t motor_current_setting[3]; #endif private: @@ -275,21 +254,18 @@ class Stepper { static bool abort_current_block; // Signals to the stepper that current block should be aborted + #if DISABLED(MIXING_EXTRUDER) + static uint8_t last_moved_extruder; // Last-moved extruder, as set when the last movement was fetched from planner + #endif + #if ENABLED(X_DUAL_ENDSTOPS) static bool locked_X_motor, locked_X2_motor; #endif #if ENABLED(Y_DUAL_ENDSTOPS) static bool locked_Y_motor, locked_Y2_motor; #endif - #if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) - static bool locked_Z_motor, locked_Z2_motor - #if NUM_Z_STEPPER_DRIVERS >= 3 - , locked_Z3_motor - #if NUM_Z_STEPPER_DRIVERS >= 4 - , locked_Z4_motor - #endif - #endif - ; + #if ENABLED(Z_DUAL_ENDSTOPS) + static bool locked_Z_motor, locked_Z2_motor; #endif static uint32_t acceleration_time, deceleration_time; // time measured in Stepper Timer ticks @@ -302,18 +278,23 @@ class Stepper { #endif // Delta error variables for the Bresenham line tracer - static xyze_long_t delta_error; - static xyze_ulong_t advance_dividend; - static uint32_t advance_divisor, + static int32_t delta_error[XYZE]; + static uint32_t advance_dividend[XYZE], + advance_divisor, step_events_completed, // The number of step events executed in the current block accelerate_until, // The point from where we need to stop acceleration decelerate_after, // The point from where we need to start decelerating step_event_count; // The total event count for the current block - #if EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) - static uint8_t stepper_extruder; + // Mixing extruder mix delta_errors for bresenham tracing + #if ENABLED(MIXING_EXTRUDER) + static int32_t delta_error_m[MIXING_STEPPERS]; + static uint32_t advance_dividend_m[MIXING_STEPPERS], + advance_divisor_m; + #define MIXING_STEPPERS_LOOP(VAR) \ + for (uint8_t VAR = 0; VAR < MIXING_STEPPERS; VAR++) #else - static constexpr uint8_t stepper_extruder = 0; + static int8_t active_extruder; // Active extruder #endif #if ENABLED(S_CURVE_ACCELERATION) @@ -328,98 +309,55 @@ class Stepper { static bool bezier_2nd_half; // If Bézier curve has been initialized or not #endif + static uint32_t nextMainISR; // time remaining for the next Step ISR #if ENABLED(LIN_ADVANCE) - static constexpr uint32_t LA_ADV_NEVER = 0xFFFFFFFF; static uint32_t nextAdvanceISR, LA_isr_rate; static uint16_t LA_current_adv_steps, LA_final_adv_steps, LA_max_adv_steps; // Copy from current executed block. Needed because current_block is set to NULL "too early". static int8_t LA_steps; static bool LA_use_advance_lead; - #endif - - #if ENABLED(INTEGRATED_BABYSTEPPING) - static constexpr uint32_t BABYSTEP_NEVER = 0xFFFFFFFF; - static uint32_t nextBabystepISR; - #endif - - #if ENABLED(DIRECT_STEPPING) - static page_step_state_t page_step_state; - #endif + #endif // LIN_ADVANCE static int32_t ticks_nominal; #if DISABLED(S_CURVE_ACCELERATION) static uint32_t acc_step_rate; // needed for deceleration start point #endif - // Exact steps at which an endstop was triggered - static xyz_long_t endstops_trigsteps; + static volatile int32_t endstops_trigsteps[XYZ]; + // // Positions of stepper motors, in step units - static xyze_long_t count_position; + // + static volatile int32_t count_position[NUM_AXIS]; - // Current stepper motor directions (+1 or -1) - static xyze_int8_t count_direction; - - #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) - - typedef struct { - bool enabled; // Trapezoid needed flag (i.e., laser on, planner in control) - uint8_t cur_power; // Current laser power - bool cruise_set; // Power set up for cruising? - - #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) - uint32_t last_step_count, // Step count from the last update - acc_step_count; // Bresenham counter for laser accel/decel - #else - uint16_t till_update; // Countdown to the next update - #endif - } stepper_laser_t; - - static stepper_laser_t laser_trap; - - #endif + // + // Current direction of stepper motors (+1 or -1) + // + static int8_t count_direction[NUM_AXIS]; public: + + // + // Constructor / initializer + // + Stepper() { }; + // Initialize stepper hardware static void init(); - // Interrupt Service Routine and phases - - // The stepper subsystem goes to sleep when it runs out of things to execute. - // Call this to notify the subsystem that it is time to go to work. - static inline void wake_up() { ENABLE_STEPPER_DRIVER_INTERRUPT(); } - - static inline bool is_awake() { return STEPPER_ISR_ENABLED(); } - - static inline bool suspend() { - const bool awake = is_awake(); - if (awake) DISABLE_STEPPER_DRIVER_INTERRUPT(); - return awake; - } + // Interrupt Service Routines // The ISR scheduler static void isr(); - // The stepper pulse ISR phase - static void pulse_phase_isr(); + // The stepper pulse phase ISR + static void stepper_pulse_phase_isr(); - // The stepper block processing ISR phase - static uint32_t block_phase_isr(); + // The stepper block processing phase ISR + static uint32_t stepper_block_phase_isr(); #if ENABLED(LIN_ADVANCE) - // The Linear advance ISR phase + // The Linear advance stepper ISR static uint32_t advance_isr(); - FORCE_INLINE static void initiateLA() { nextAdvanceISR = 0; } - #endif - - #if ENABLED(INTEGRATED_BABYSTEPPING) - // The Babystepping ISR phase - static uint32_t babystepping_isr(); - FORCE_INLINE static void initiateBabystepping() { - if (nextBabystepISR == BABYSTEP_NEVER) { - nextBabystepISR = 0; - wake_up(); - } - } #endif // Check if the given block is busy or not - Must not be called from ISR contexts @@ -428,25 +366,12 @@ class Stepper { // Get the position of a stepper, in steps static int32_t position(const AxisEnum axis); - // Set the current position in steps - static void set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); - static inline void set_position(const xyze_long_t &abce) { set_position(abce.a, abce.b, abce.c, abce.e); } - static void set_axis_position(const AxisEnum a, const int32_t &v); - // Report the positions of the steppers, in steps - static void report_a_position(const xyz_long_t &pos); static void report_positions(); - // Discard current block and free any resources - FORCE_INLINE static void discard_current_block() { - #if ENABLED(DIRECT_STEPPING) - if (IS_PAGE(current_block)) - page_manager.free_page(current_block->page_idx); - #endif - current_block = nullptr; - axis_did_move = 0; - planner.release_current_block(); - } + // The stepper subsystem goes to sleep when it runs out of things to execute. Call this + // to notify the subsystem that it is time to go to work. + static void wake_up(); // Quickly stop all steppers FORCE_INLINE static void quick_stop() { abort_current_block = true; } @@ -457,25 +382,36 @@ class Stepper { // The last movement direction was not null on the specified axis. Note that motor direction is not necessarily the same. FORCE_INLINE static bool axis_is_moving(const AxisEnum axis) { return TEST(axis_did_move, axis); } + // The extruder associated to the last movement + FORCE_INLINE static uint8_t movement_extruder() { + return + #if ENABLED(MIXING_EXTRUDER) + 0 + #else + last_moved_extruder + #endif + ; + } + // Handle a triggered endstop static void endstop_triggered(const AxisEnum axis); // Triggered position of an axis in steps static int32_t triggered_position(const AxisEnum axis); - #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM - static void set_digipot_value_spi(const int16_t address, const int16_t value); - static void set_digipot_current(const uint8_t driver, const int16_t current); + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM + static void digitalPotWrite(const int16_t address, const int16_t value); + static void digipot_current(const uint8_t driver, const int16_t current); #endif #if HAS_MICROSTEPS - static void microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2, const int8_t ms3); + static void microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2); static void microstep_mode(const uint8_t driver, const uint8_t stepping); static void microstep_readings(); #endif - #if EITHER(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) - FORCE_INLINE static void set_separate_multi_axis(const bool state) { separate_multi_axis = state; } + #if ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) + FORCE_INLINE static void set_homing_dual_axis(const bool state) { homing_dual_axis = state; } #endif #if ENABLED(X_DUAL_ENDSTOPS) FORCE_INLINE static void set_x_lock(const bool state) { locked_X_motor = state; } @@ -485,49 +421,59 @@ class Stepper { FORCE_INLINE static void set_y_lock(const bool state) { locked_Y_motor = state; } FORCE_INLINE static void set_y2_lock(const bool state) { locked_Y2_motor = state; } #endif - #if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) - FORCE_INLINE static void set_z1_lock(const bool state) { locked_Z_motor = state; } + #if ENABLED(Z_DUAL_ENDSTOPS) + FORCE_INLINE static void set_z_lock(const bool state) { locked_Z_motor = state; } FORCE_INLINE static void set_z2_lock(const bool state) { locked_Z2_motor = state; } - #if NUM_Z_STEPPER_DRIVERS >= 3 - FORCE_INLINE static void set_z3_lock(const bool state) { locked_Z3_motor = state; } - #if NUM_Z_STEPPER_DRIVERS >= 4 - FORCE_INLINE static void set_z4_lock(const bool state) { locked_Z4_motor = state; } - #endif - #endif - static inline void set_all_z_lock(const bool lock, const int8_t except=-1) { - set_z1_lock(lock ^ (except == 0)); - set_z2_lock(lock ^ (except == 1)); - #if NUM_Z_STEPPER_DRIVERS >= 3 - set_z3_lock(lock ^ (except == 2)); - #if NUM_Z_STEPPER_DRIVERS >= 4 - set_z4_lock(lock ^ (except == 3)); - #endif - #endif - } #endif #if ENABLED(BABYSTEPPING) - static void do_babystep(const AxisEnum axis, const bool direction); // perform a short step with a single stepper motor, outside of any convention + static void babystep(const AxisEnum axis, const bool direction); // perform a short step with a single stepper motor, outside of any convention #endif #if HAS_MOTOR_CURRENT_PWM static void refresh_motor_power(); #endif - // Set direction bits for all steppers - static void set_directions(); + // Set the current position in steps + static inline void set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { + planner.synchronize(); + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + _set_position(a, b, c, e); + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + } + + static inline void set_position(const AxisEnum a, const int32_t &v) { + planner.synchronize(); + + #ifdef __AVR__ + // Protect the access to the position. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + const bool was_enabled = STEPPER_ISR_ENABLED(); + if (was_enabled) DISABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + + count_position[a] = v; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) ENABLE_STEPPER_DRIVER_INTERRUPT(); + #endif + } private: // Set the current position in steps static void _set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); - FORCE_INLINE static void _set_position(const abce_long_t &spos) { _set_position(spos.a, spos.b, spos.c, spos.e); } - FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t* loops) { + // Set direction bits for all steppers + static void set_directions(); + + FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t scale, uint8_t* loops) { uint32_t timer; // Scale the frequency, as requested by the caller - step_rate <<= oversampling_factor; + step_rate <<= scale; uint8_t multistep = 1; #if DISABLED(DISABLE_MULTI_STEPPING) @@ -560,21 +506,21 @@ class Stepper { // In case of high-performance processor, it is able to calculate in real-time timer = uint32_t(STEPPER_TIMER_RATE) / step_rate; #else - constexpr uint32_t min_step_rate = (F_CPU) / 500000U; + constexpr uint32_t min_step_rate = F_CPU / 500000U; NOLESS(step_rate, min_step_rate); step_rate -= min_step_rate; // Correct for minimal speed if (step_rate >= (8 * 256)) { // higher step rate const uint8_t tmp_step_rate = (step_rate & 0x00FF); const uint16_t table_address = (uint16_t)&speed_lookuptable_fast[(uint8_t)(step_rate >> 8)][0], - gain = (uint16_t)pgm_read_word(table_address + 2); + gain = (uint16_t)pgm_read_word_near(table_address + 2); timer = MultiU16X8toH16(tmp_step_rate, gain); - timer = (uint16_t)pgm_read_word(table_address) - timer; + timer = (uint16_t)pgm_read_word_near(table_address) - timer; } else { // lower step rates uint16_t table_address = (uint16_t)&speed_lookuptable_slow[0][0]; table_address += ((step_rate) >> 1) & 0xFFFC; - timer = (uint16_t)pgm_read_word(table_address) - - (((uint16_t)pgm_read_word(table_address + 2) * (uint8_t)(step_rate & 0x0007)) >> 3); + timer = (uint16_t)pgm_read_word_near(table_address) + - (((uint16_t)pgm_read_word_near(table_address + 2) * (uint8_t)(step_rate & 0x0007)) >> 3); } // (there is no need to limit the timer value here. All limits have been // applied above, and AVR is able to keep up at 30khz Stepping ISR rate) @@ -588,7 +534,7 @@ class Stepper { static int32_t _eval_bezier_curve(const uint32_t curr_step); #endif - #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM static void digipot_init(); #endif @@ -599,3 +545,5 @@ class Stepper { }; extern Stepper stepper; + +#endif // STEPPER_H diff --git a/Marlin/src/module/stepper/L64xx.cpp b/Marlin/src/module/stepper/L64xx.cpp deleted file mode 100644 index 3e2bf09446..0000000000 --- a/Marlin/src/module/stepper/L64xx.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * stepper/L64xx.cpp - * Stepper driver indirection for L64XX drivers - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_L64XX - -#include "L64xx.h" - -#if AXIS_IS_L64XX(X) - L64XX_CLASS(X) stepperX(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(X2) - L64XX_CLASS(X2) stepperX2(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(Y) - L64XX_CLASS(Y) stepperY(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(Y2) - L64XX_CLASS(Y2) stepperY2(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(Z) - L64XX_CLASS(Z) stepperZ(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(Z2) - L64XX_CLASS(Z2) stepperZ2(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(Z3) - L64XX_CLASS(Z3) stepperZ3(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(Z4) - L64XX_CLASS(Z4) stepperZ4(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(E0) - L64XX_CLASS(E0) stepperE0(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(E1) - L64XX_CLASS(E1) stepperE1(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(E2) - L64XX_CLASS(E2) stepperE2(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(E3) - L64XX_CLASS(E3) stepperE3(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(E4) - L64XX_CLASS(E4) stepperE4(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(E5) - L64XX_CLASS(E5) stepperE5(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(E6) - L64XX_CLASS(E6) stepperE6(L6470_CHAIN_SS_PIN); -#endif -#if AXIS_IS_L64XX(E7) - L64XX_CLASS(E7) stepperE7(L6470_CHAIN_SS_PIN); -#endif - -// Not using L64XX class init method because it -// briefly sends power to the steppers - -inline void L6470_init_chip(L64XX &st, const int ms, const int oc, const int sc, const int mv, const int slew_rate) { - st.set_handlers(L64xxManager.spi_init, L64xxManager.transfer_single, L64xxManager.transfer_chain); // specify which external SPI routines to use - switch (st.L6470_status_layout) { - case L6470_STATUS_LAYOUT: { - st.resetDev(); - st.softFree(); - st.SetParam(st.L64XX_CONFIG, CONFIG_PWM_DIV_1 | CONFIG_PWM_MUL_2 | CONFIG_OC_SD_DISABLE | CONFIG_VS_COMP_DISABLE | CONFIG_SW_HARD_STOP | CONFIG_INT_16MHZ); - st.SetParam(L6470_KVAL_RUN, 0xFF); - st.SetParam(L6470_KVAL_ACC, 0xFF); - st.SetParam(L6470_KVAL_DEC, 0xFF); - st.setMicroSteps(ms); - st.setOverCurrent(oc); - st.setStallCurrent(sc); - st.SetParam(L6470_KVAL_HOLD, mv); - st.SetParam(L6470_ABS_POS, 0); - uint32_t config_temp = st.GetParam(st.L64XX_CONFIG); - config_temp &= ~CONFIG_POW_SR; - switch (slew_rate) { - case 0: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_75V_us); break; - default: - case 1: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_110V_us); break; - case 3: - case 2: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_260V_us); break; - } - st.getStatus(); - st.getStatus(); - break; - } - - case L6474_STATUS_LAYOUT: { - st.free(); - //st.SetParam(st.L64XX_CONFIG, CONFIG_PWM_DIV_1 | CONFIG_PWM_MUL_2 | CONFIG_OC_SD_DISABLE | CONFIG_VS_COMP_DISABLE | CONFIG_SW_HARD_STOP | CONFIG_INT_16MHZ); - //st.SetParam(L6474_TVAL, 0xFF); - st.setMicroSteps(ms); - st.setOverCurrent(oc); - st.setTVALCurrent(sc); - st.SetParam(L6470_ABS_POS, 0); - uint32_t config_temp = st.GetParam(st.L64XX_CONFIG); - config_temp &= ~CONFIG_POW_SR & ~CONFIG_EN_TQREG; // clear out slew rate and set current to be controlled by TVAL register - switch (slew_rate) { - case 0: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_75V_us); break; - default: - case 1: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_110V_us); break; - case 3: - case 2: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_260V_us); break; - //case 0: st.SetParam(st.L64XX_CONFIG, 0x2E88 | CONFIG_EN_TQREG | CONFIG_SR_75V_us); break; - //default: - //case 1: st.SetParam(st.L64XX_CONFIG, 0x2E88 | CONFIG_EN_TQREG | CONFIG_SR_110V_us); break; - //case 3: - //case 2: st.SetParam(st.L64XX_CONFIG, 0x2E88 | CONFIG_EN_TQREG | CONFIG_SR_260V_us); break; - - //case 0: st.SetParam(st.L64XX_CONFIG, 0x2E88 ); break; - //default: - //case 1: st.SetParam(st.L64XX_CONFIG, 0x2E88 ); break; - //case 3: - //case 2: st.SetParam(st.L64XX_CONFIG, 0x2E88 ); break; - } - st.getStatus(); - st.getStatus(); - break; - } - - case L6480_STATUS_LAYOUT: { - st.resetDev(); - st.softFree(); - st.SetParam(st.L64XX_CONFIG, CONFIG_PWM_DIV_1 | CONFIG_PWM_MUL_2 | CONFIG_OC_SD_DISABLE | CONFIG_VS_COMP_DISABLE | CONFIG_SW_HARD_STOP | CONFIG_INT_16MHZ); - st.SetParam(L6470_KVAL_RUN, 0xFF); - st.SetParam(L6470_KVAL_ACC, 0xFF); - st.SetParam(L6470_KVAL_DEC, 0xFF); - st.setMicroSteps(ms); - st.setOverCurrent(oc); - st.setStallCurrent(sc); - st.SetParam(+-L6470_KVAL_HOLD, mv); - st.SetParam(L6470_ABS_POS, 0); - st.SetParam(st.L64XX_CONFIG,(st.GetParam(st.L64XX_CONFIG) | PWR_VCC_7_5V)); - st.getStatus(); // must clear out status bits before can set slew rate - st.getStatus(); - switch (slew_rate) { - case 0: st.SetParam(L6470_GATECFG1, CONFIG1_SR_220V_us); st.SetParam(L6470_GATECFG2, CONFIG2_SR_220V_us); break; - default: - case 1: st.SetParam(L6470_GATECFG1, CONFIG1_SR_400V_us); st.SetParam(L6470_GATECFG2, CONFIG2_SR_400V_us); break; - case 2: st.SetParam(L6470_GATECFG1, CONFIG1_SR_520V_us); st.SetParam(L6470_GATECFG2, CONFIG2_SR_520V_us); break; - case 3: st.SetParam(L6470_GATECFG1, CONFIG1_SR_980V_us); st.SetParam(L6470_GATECFG2, CONFIG2_SR_980V_us); break; - } - break; - } - } -} - -#define L6470_INIT_CHIP(Q) L6470_init_chip(stepper##Q, Q##_MICROSTEPS, Q##_OVERCURRENT, Q##_STALLCURRENT, Q##_MAX_VOLTAGE, Q##_SLEW_RATE) - -void L64XX_Marlin::init_to_defaults() { - #if AXIS_IS_L64XX(X) - L6470_INIT_CHIP(X); - #endif - #if AXIS_IS_L64XX(X2) - L6470_INIT_CHIP(X2); - #endif - #if AXIS_IS_L64XX(Y) - L6470_INIT_CHIP(Y); - #endif - #if AXIS_IS_L64XX(Y2) - L6470_INIT_CHIP(Y2); - #endif - #if AXIS_IS_L64XX(Z) - L6470_INIT_CHIP(Z); - #endif - #if AXIS_IS_L64XX(Z2) - L6470_INIT_CHIP(Z2); - #endif - #if AXIS_IS_L64XX(Z3) - L6470_INIT_CHIP(Z3); - #endif - #if AXIS_IS_L64XX(E0) - L6470_INIT_CHIP(E0); - #endif - #if AXIS_IS_L64XX(E1) - L6470_INIT_CHIP(E1); - #endif - #if AXIS_IS_L64XX(E2) - L6470_INIT_CHIP(E2); - #endif - #if AXIS_IS_L64XX(E3) - L6470_INIT_CHIP(E3); - #endif - #if AXIS_IS_L64XX(E4) - L6470_INIT_CHIP(E4); - #endif - #if AXIS_IS_L64XX(E5) - L6470_INIT_CHIP(E5); - #endif - #if AXIS_IS_L64XX(E6) - L6470_INIT_CHIP(E6); - #endif - #if AXIS_IS_L64XX(E7) - L6470_INIT_CHIP(E7); - #endif -} - -#endif // HAS_L64XX diff --git a/Marlin/src/module/stepper/L64xx.h b/Marlin/src/module/stepper/L64xx.h deleted file mode 100644 index 9c8b0b1bdd..0000000000 --- a/Marlin/src/module/stepper/L64xx.h +++ /dev/null @@ -1,364 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * stepper/L64xx.h - * Stepper driver indirection for L64XX drivers - */ - -#include "../../inc/MarlinConfig.h" -#include "../../libs/L64XX/L64XX_Marlin.h" - -// Convert option names to L64XX classes -#define CLASS_L6470 L6470 -#define CLASS_L6474 L6474 -#define CLASS_POWERSTEP01 powerSTEP01 - -#define __L64XX_CLASS(TYPE) CLASS_##TYPE -#define _L64XX_CLASS(TYPE) __L64XX_CLASS(TYPE) -#define L64XX_CLASS(ST) _L64XX_CLASS(ST##_DRIVER_TYPE) - -#define L6474_DIR_WRITE(A,STATE) do{ L64xxManager.dir_commands[A] = dSPIN_L6474_ENABLE; WRITE(A##_DIR_PIN, STATE); }while(0) -#define L64XX_DIR_WRITE(A,STATE) do{ L64xxManager.dir_commands[A] = (STATE) ? dSPIN_STEP_CLOCK_REV : dSPIN_STEP_CLOCK_FWD; }while(0) - -// X Stepper -#if AXIS_IS_L64XX(X) - extern L64XX_CLASS(X) stepperX; - #define X_ENABLE_INIT() NOOP - #define X_ENABLE_WRITE(STATE) (STATE ? stepperX.hardStop() : stepperX.free()) - #define X_ENABLE_READ() (stepperX.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_X(L6474) - #define X_DIR_INIT() SET_OUTPUT(X_DIR_PIN) - #define X_DIR_WRITE(STATE) L6474_DIR_WRITE(X, STATE) - #define X_DIR_READ() READ(X_DIR_PIN) - #else - #define X_DIR_INIT() NOOP - #define X_DIR_WRITE(STATE) L64XX_DIR_WRITE(X, STATE) - #define X_DIR_READ() (stepper##X.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_X(L6470) - #define DISABLE_STEPPER_X() stepperX.free() - #endif - #endif -#endif - -// Y Stepper -#if AXIS_IS_L64XX(Y) - extern L64XX_CLASS(Y) stepperY; - #define Y_ENABLE_INIT() NOOP - #define Y_ENABLE_WRITE(STATE) (STATE ? stepperY.hardStop() : stepperY.free()) - #define Y_ENABLE_READ() (stepperY.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_Y(L6474) - #define Y_DIR_INIT() SET_OUTPUT(Y_DIR_PIN) - #define Y_DIR_WRITE(STATE) L6474_DIR_WRITE(Y, STATE) - #define Y_DIR_READ() READ(Y_DIR_PIN) - #else - #define Y_DIR_INIT() NOOP - #define Y_DIR_WRITE(STATE) L64XX_DIR_WRITE(Y, STATE) - #define Y_DIR_READ() (stepper##Y.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_Y(L6470) - #define DISABLE_STEPPER_Y() stepperY.free() - #endif - #endif -#endif - -// Z Stepper -#if AXIS_IS_L64XX(Z) - extern L64XX_CLASS(Z) stepperZ; - #define Z_ENABLE_INIT() NOOP - #define Z_ENABLE_WRITE(STATE) (STATE ? stepperZ.hardStop() : stepperZ.free()) - #define Z_ENABLE_READ() (stepperZ.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_Z(L6474) - #define Z_DIR_INIT() SET_OUTPUT(Z_DIR_PIN) - #define Z_DIR_WRITE(STATE) L6474_DIR_WRITE(Z, STATE) - #define Z_DIR_READ() READ(Z_DIR_PIN) - #else - #define Z_DIR_INIT() NOOP - #define Z_DIR_WRITE(STATE) L64XX_DIR_WRITE(Z, STATE) - #define Z_DIR_READ() (stepper##Z.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_Z(L6470) - #define DISABLE_STEPPER_Z() stepperZ.free() - #endif - #endif -#endif - -// X2 Stepper -#if HAS_X2_ENABLE && AXIS_IS_L64XX(X2) - extern L64XX_CLASS(X2) stepperX2; - #define X2_ENABLE_INIT() NOOP - #define X2_ENABLE_WRITE(STATE) (STATE ? stepperX2.hardStop() : stepperX2.free()) - #define X2_ENABLE_READ() (stepperX2.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_X2(L6474) - #define X2_DIR_INIT() SET_OUTPUT(X2_DIR_PIN) - #define X2_DIR_WRITE(STATE) L6474_DIR_WRITE(X2, STATE) - #define X2_DIR_READ() READ(X2_DIR_PIN) - #else - #define X2_DIR_INIT() NOOP - #define X2_DIR_WRITE(STATE) L64XX_DIR_WRITE(X2, STATE) - #define X2_DIR_READ() (stepper##X2.getStatus() & STATUS_DIR); - #endif -#endif - -#if AXIS_DRIVER_TYPE_X2(L6470) - #define DISABLE_STEPPER_X2() stepperX2.free() -#endif - -// Y2 Stepper -#if HAS_Y2_ENABLE && AXIS_IS_L64XX(Y2) - extern L64XX_CLASS(Y2) stepperY2; - #define Y2_ENABLE_INIT() NOOP - #define Y2_ENABLE_WRITE(STATE) (STATE ? stepperY2.hardStop() : stepperY2.free()) - #define Y2_ENABLE_READ() (stepperY2.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_Y2(L6474) - #define Y2_DIR_INIT() SET_OUTPUT(Y2_DIR_PIN) - #define Y2_DIR_WRITE(STATE) L6474_DIR_WRITE(Y2, STATE) - #define Y2_DIR_READ() READ(Y2_DIR_PIN) - #else - #define Y2_DIR_INIT() NOOP - #define Y2_DIR_WRITE(STATE) L64XX_DIR_WRITE(Y2, STATE) - #define Y2_DIR_READ() (stepper##Y2.getStatus() & STATUS_DIR); - #endif -#endif - -#if AXIS_DRIVER_TYPE_Y2(L6470) - #define DISABLE_STEPPER_Y2() stepperY2.free() -#endif - -// Z2 Stepper -#if HAS_Z2_ENABLE && AXIS_IS_L64XX(Z2) - extern L64XX_CLASS(Z2) stepperZ2; - #define Z2_ENABLE_INIT() NOOP - #define Z2_ENABLE_WRITE(STATE) (STATE ? stepperZ2.hardStop() : stepperZ2.free()) - #define Z2_ENABLE_READ() (stepperZ2.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_Z2(L6474) - #define Z2_DIR_INIT() SET_OUTPUT(Z2_DIR_PIN) - #define Z2_DIR_WRITE(STATE) L6474_DIR_WRITE(Z2, STATE) - #define Z2_DIR_READ() READ(Z2_DIR_PIN) - #else - #define Z2_DIR_INIT() NOOP - #define Z2_DIR_WRITE(STATE) L64XX_DIR_WRITE(Z2, STATE) - #define Z2_DIR_READ() (stepper##Z2.getStatus() & STATUS_DIR); - #endif -#endif - -#if AXIS_DRIVER_TYPE_Z2(L6470) - #define DISABLE_STEPPER_Z2() stepperZ2.free() -#endif - -// Z3 Stepper -#if HAS_Z3_ENABLE && AXIS_IS_L64XX(Z3) - extern L64XX_CLASS(Z3) stepperZ3; - #define Z3_ENABLE_INIT() NOOP - #define Z3_ENABLE_WRITE(STATE) (STATE ? stepperZ3.hardStop() : stepperZ3.free()) - #define Z3_ENABLE_READ() (stepperZ3.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_Z3(L6474) - #define Z3_DIR_INIT() SET_OUTPUT(Z3_DIR_PIN) - #define Z3_DIR_WRITE(STATE) L6474_DIR_WRITE(Z3, STATE) - #define Z3_DIR_READ() READ(Z3_DIR_PIN) - #else - #define Z3_DIR_INIT() NOOP - #define Z3_DIR_WRITE(STATE) L64XX_DIR_WRITE(Z3, STATE) - #define Z3_DIR_READ() (stepper##Z3.getStatus() & STATUS_DIR); - #endif -#endif - -#if AXIS_DRIVER_TYPE_Z3(L6470) - #define DISABLE_STEPPER_Z3() stepperZ3.free() -#endif - -// Z4 Stepper -#if HAS_Z4_ENABLE && AXIS_IS_L64XX(Z4) - extern L64XX_CLASS(Z4) stepperZ4; - #define Z4_ENABLE_INIT() NOOP - #define Z4_ENABLE_WRITE(STATE) (STATE ? stepperZ4.hardStop() : stepperZ4.free()) - #define Z4_ENABLE_READ() (stepperZ4.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_Z4(L6474) - #define Z4_DIR_INIT() SET_OUTPUT(Z4_DIR_PIN) - #define Z4_DIR_WRITE(STATE) L6474_DIR_WRITE(Z4, STATE) - #define Z4_DIR_READ() READ(Z4_DIR_PIN) - #else - #define Z4_DIR_INIT() NOOP - #define Z4_DIR_WRITE(STATE) L64XX_DIR_WRITE(Z4, STATE) - #define Z4_DIR_READ() (stepper##Z4.getStatus() & STATUS_DIR); - #endif -#endif - -#if AXIS_DRIVER_TYPE_Z4(L6470) - #define DISABLE_STEPPER_Z4() stepperZ4.free() -#endif - -// E0 Stepper -#if AXIS_IS_L64XX(E0) - extern L64XX_CLASS(E0) stepperE0; - #define E0_ENABLE_INIT() NOOP - #define E0_ENABLE_WRITE(STATE) (STATE ? stepperE0.hardStop() : stepperE0.free()) - #define E0_ENABLE_READ() (stepperE0.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_E0(L6474) - #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) - #define E0_DIR_WRITE(STATE) L6474_DIR_WRITE(E0, STATE) - #define E0_DIR_READ() READ(E0_DIR_PIN) - #else - #define E0_DIR_INIT() NOOP - #define E0_DIR_WRITE(STATE) L64XX_DIR_WRITE(E0, STATE) - #define E0_DIR_READ() (stepper##E0.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_E0(L6470) - #define DISABLE_STEPPER_E0() do{ stepperE0.free(); }while(0) - #endif - #endif -#endif - -// E1 Stepper -#if AXIS_IS_L64XX(E1) - extern L64XX_CLASS(E1) stepperE1; - #define E1_ENABLE_INIT() NOOP - #define E1_ENABLE_WRITE(STATE) (STATE ? stepperE1.hardStop() : stepperE1.free()) - #define E1_ENABLE_READ() (stepperE1.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_E1(L6474) - #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) - #define E1_DIR_WRITE(STATE) L6474_DIR_WRITE(E1, STATE) - #define E1_DIR_READ() READ(E1_DIR_PIN) - #else - #define E1_DIR_INIT() NOOP - #define E1_DIR_WRITE(STATE) L64XX_DIR_WRITE(E1, STATE) - #define E1_DIR_READ() (stepper##E1.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_E1(L6470) - #define DISABLE_STEPPER_E1() do{ stepperE1.free(); }while(0) - #endif - #endif -#endif - -// E2 Stepper -#if AXIS_IS_L64XX(E2) - extern L64XX_CLASS(E2) stepperE2; - #define E2_ENABLE_INIT() NOOP - #define E2_ENABLE_WRITE(STATE) (STATE ? stepperE2.hardStop() : stepperE2.free()) - #define E2_ENABLE_READ() (stepperE2.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_E2(L6474) - #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) - #define E2_DIR_WRITE(STATE) L6474_DIR_WRITE(E2, STATE) - #define E2_DIR_READ() READ(E2_DIR_PIN) - #else - #define E2_DIR_INIT() NOOP - #define E2_DIR_WRITE(STATE) L64XX_DIR_WRITE(E2, STATE) - #define E2_DIR_READ() (stepper##E2.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_E2(L6470) - #define DISABLE_STEPPER_E2() do{ stepperE2.free(); }while(0) - #endif - #endif -#endif - -// E3 Stepper -#if AXIS_IS_L64XX(E3) - extern L64XX_CLASS(E3) stepperE3; - #define E3_ENABLE_INIT() NOOP - #define E3_ENABLE_WRITE(STATE) (STATE ? stepperE3.hardStop() : stepperE3.free()) - #define E3_ENABLE_READ() (stepperE3.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_E3(L6474) - #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) - #define E3_DIR_WRITE(STATE) L6474_DIR_WRITE(E3, STATE) - #define E3_DIR_READ() READ(E3_DIR_PIN) - #else - #define E3_DIR_INIT() NOOP - #define E3_DIR_WRITE(STATE) L64XX_DIR_WRITE(E3, STATE) - #define E3_DIR_READ() (stepper##E3.getStatus() & STATUS_DIR); - #endif -#endif - -// E4 Stepper -#if AXIS_IS_L64XX(E4) - extern L64XX_CLASS(E4) stepperE4; - #define E4_ENABLE_INIT() NOOP - #define E4_ENABLE_WRITE(STATE) (STATE ? stepperE4.hardStop() : stepperE4.free()) - #define E4_ENABLE_READ() (stepperE4.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_E4(L6474) - #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) - #define E4_DIR_WRITE(STATE) L6474_DIR_WRITE(E4, STATE) - #define E4_DIR_READ() READ(E4_DIR_PIN) - #else - #define E4_DIR_INIT() NOOP - #define E4_DIR_WRITE(STATE) L64XX_DIR_WRITE(E4, STATE) - #define E4_DIR_READ() (stepper##E4.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_E4(L6470) - #define DISABLE_STEPPER_E4() do{ stepperE4.free(); }while(0) - #endif - #endif -#endif - -// E5 Stepper -#if AXIS_IS_L64XX(E5) - extern L64XX_CLASS(E5) stepperE5; - #define E5_ENABLE_INIT() NOOP - #define E5_ENABLE_WRITE(STATE) (STATE ? stepperE5.hardStop() : stepperE5.free()) - #define E5_ENABLE_READ() (stepperE5.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_E5(L6474) - #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) - #define E5_DIR_WRITE(STATE) L6474_DIR_WRITE(E5, STATE) - #define E5_DIR_READ() READ(E5_DIR_PIN) - #else - #define E5_DIR_INIT() NOOP - #define E5_DIR_WRITE(STATE) L64XX_DIR_WRITE(E5, STATE) - #define E5_DIR_READ() (stepper##E5.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_E5(L6470) - #define DISABLE_STEPPER_E5() do{ stepperE5.free(); }while(0) - #endif - #endif -#endif - -// E6 Stepper -#if AXIS_IS_L64XX(E6) - extern L64XX_CLASS(E6) stepperE6; - #define E6_ENABLE_INIT() NOOP - #define E6_ENABLE_WRITE(STATE) (STATE ? stepperE6.hardStop() : stepperE6.free()) - #define E6_ENABLE_READ() (stepperE6.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_E6(L6474) - #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) - #define E6_DIR_WRITE(STATE) L6474_DIR_WRITE(E6, STATE) - #define E6_DIR_READ() READ(E6_DIR_PIN) - #else - #define E6_DIR_INIT() NOOP - #define E6_DIR_WRITE(STATE) L64XX_DIR_WRITE(E6, STATE) - #define E6_DIR_READ() (stepper##E6.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_E6(L6470) - #define DISABLE_STEPPER_E6() do{ stepperE6.free(); }while(0) - #endif - #endif -#endif - -// E7 Stepper -#if AXIS_IS_L64XX(E7) - extern L64XX_CLASS(E7) stepperE7; - #define E7_ENABLE_INIT() NOOP - #define E7_ENABLE_WRITE(STATE) (STATE ? stepperE7.hardStop() : stepperE7.free()) - #define E7_ENABLE_READ() (stepperE7.getStatus() & STATUS_HIZ) - #if AXIS_DRIVER_TYPE_E7(L6474) - #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) - #define E7_DIR_WRITE(STATE) L6474_DIR_WRITE(E7, STATE) - #define E7_DIR_READ() READ(E7_DIR_PIN) - #else - #define E7_DIR_INIT() NOOP - #define E7_DIR_WRITE(STATE) L64XX_DIR_WRITE(E7, STATE) - #define E7_DIR_READ() (stepper##E7.getStatus() & STATUS_DIR); - #if AXIS_DRIVER_TYPE_E7(L6470) - #define DISABLE_STEPPER_E7() do{ stepperE7.free(); }while(0) - #endif - #endif -#endif diff --git a/Marlin/src/module/stepper/TMC26X.cpp b/Marlin/src/module/stepper/TMC26X.cpp deleted file mode 100644 index 926f1a4e08..0000000000 --- a/Marlin/src/module/stepper/TMC26X.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * stepper/TMC26X.cpp - * Stepper driver indirection for TMC26X drivers - */ - -#include "../../inc/MarlinConfig.h" - -// -// TMC26X Driver objects and inits -// -#if HAS_TMC26X - -#include "TMC26X.h" - -#define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR) - -#if AXIS_DRIVER_TYPE_X(TMC26X) - _TMC26X_DEFINE(X); -#endif -#if AXIS_DRIVER_TYPE_X2(TMC26X) - _TMC26X_DEFINE(X2); -#endif -#if AXIS_DRIVER_TYPE_Y(TMC26X) - _TMC26X_DEFINE(Y); -#endif -#if AXIS_DRIVER_TYPE_Y2(TMC26X) - _TMC26X_DEFINE(Y2); -#endif -#if AXIS_DRIVER_TYPE_Z(TMC26X) - _TMC26X_DEFINE(Z); -#endif -#if AXIS_DRIVER_TYPE_Z2(TMC26X) - _TMC26X_DEFINE(Z2); -#endif -#if AXIS_DRIVER_TYPE_Z3(TMC26X) - _TMC26X_DEFINE(Z3); -#endif -#if AXIS_DRIVER_TYPE_Z4(TMC26X) - _TMC26X_DEFINE(Z4); -#endif -#if AXIS_DRIVER_TYPE_E0(TMC26X) - _TMC26X_DEFINE(E0); -#endif -#if AXIS_DRIVER_TYPE_E1(TMC26X) - _TMC26X_DEFINE(E1); -#endif -#if AXIS_DRIVER_TYPE_E2(TMC26X) - _TMC26X_DEFINE(E2); -#endif -#if AXIS_DRIVER_TYPE_E3(TMC26X) - _TMC26X_DEFINE(E3); -#endif -#if AXIS_DRIVER_TYPE_E4(TMC26X) - _TMC26X_DEFINE(E4); -#endif -#if AXIS_DRIVER_TYPE_E5(TMC26X) - _TMC26X_DEFINE(E5); -#endif -#if AXIS_DRIVER_TYPE_E6(TMC26X) - _TMC26X_DEFINE(E6); -#endif -#if AXIS_DRIVER_TYPE_E7(TMC26X) - _TMC26X_DEFINE(E7); -#endif - -#define _TMC26X_INIT(A) do{ \ - stepper##A.setMicrosteps(A##_MICROSTEPS); \ - stepper##A.start(); \ -}while(0) - -void tmc26x_init_to_defaults() { - #if AXIS_DRIVER_TYPE_X(TMC26X) - _TMC26X_INIT(X); - #endif - #if AXIS_DRIVER_TYPE_X2(TMC26X) - _TMC26X_INIT(X2); - #endif - #if AXIS_DRIVER_TYPE_Y(TMC26X) - _TMC26X_INIT(Y); - #endif - #if AXIS_DRIVER_TYPE_Y2(TMC26X) - _TMC26X_INIT(Y2); - #endif - #if AXIS_DRIVER_TYPE_Z(TMC26X) - _TMC26X_INIT(Z); - #endif - #if AXIS_DRIVER_TYPE_Z2(TMC26X) - _TMC26X_INIT(Z2); - #endif - #if AXIS_DRIVER_TYPE_Z3(TMC26X) - _TMC26X_INIT(Z3); - #endif - #if AXIS_DRIVER_TYPE_Z4(TMC26X) - _TMC26X_INIT(Z4); - #endif - #if AXIS_DRIVER_TYPE_E0(TMC26X) - _TMC26X_INIT(E0); - #endif - #if AXIS_DRIVER_TYPE_E1(TMC26X) - _TMC26X_INIT(E1); - #endif - #if AXIS_DRIVER_TYPE_E2(TMC26X) - _TMC26X_INIT(E2); - #endif - #if AXIS_DRIVER_TYPE_E3(TMC26X) - _TMC26X_INIT(E3); - #endif - #if AXIS_DRIVER_TYPE_E4(TMC26X) - _TMC26X_INIT(E4); - #endif - #if AXIS_DRIVER_TYPE_E5(TMC26X) - _TMC26X_INIT(E5); - #endif - #if AXIS_DRIVER_TYPE_E6(TMC26X) - _TMC26X_INIT(E6); - #endif - #if AXIS_DRIVER_TYPE_E7(TMC26X) - _TMC26X_INIT(E7); - #endif -} - -#endif // HAS_TMC26X diff --git a/Marlin/src/module/stepper/TMC26X.h b/Marlin/src/module/stepper/TMC26X.h deleted file mode 100644 index 8977266b47..0000000000 --- a/Marlin/src/module/stepper/TMC26X.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * stepper/TMC26X.h - * Stepper driver indirection for TMC26X drivers - */ - -#include "../../inc/MarlinConfig.h" - -// TMC26X drivers have STEP/DIR on normal pins, but ENABLE via SPI - -#include -#if defined(STM32GENERIC) && defined(STM32F7) - #include "../../HAL/STM32_F4_F7/STM32F7/TMC2660.h" -#else - #include -#endif - -void tmc26x_init_to_defaults(); - -// X Stepper -#if AXIS_DRIVER_TYPE_X(TMC26X) - extern TMC26XStepper stepperX; - #define X_ENABLE_INIT() NOOP - #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE) - #define X_ENABLE_READ() stepperX.isEnabled() -#endif - -// Y Stepper -#if AXIS_DRIVER_TYPE_Y(TMC26X) - extern TMC26XStepper stepperY; - #define Y_ENABLE_INIT() NOOP - #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE) - #define Y_ENABLE_READ() stepperY.isEnabled() -#endif - -// Z Stepper -#if AXIS_DRIVER_TYPE_Z(TMC26X) - extern TMC26XStepper stepperZ; - #define Z_ENABLE_INIT() NOOP - #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE) - #define Z_ENABLE_READ() stepperZ.isEnabled() -#endif - -// X2 Stepper -#if HAS_X2_ENABLE && AXIS_DRIVER_TYPE_X2(TMC26X) - extern TMC26XStepper stepperX2; - #define X2_ENABLE_INIT() NOOP - #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE) - #define X2_ENABLE_READ() stepperX2.isEnabled() -#endif - -// Y2 Stepper -#if HAS_Y2_ENABLE && AXIS_DRIVER_TYPE_Y2(TMC26X) - extern TMC26XStepper stepperY2; - #define Y2_ENABLE_INIT() NOOP - #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE) - #define Y2_ENABLE_READ() stepperY2.isEnabled() -#endif - -// Z2 Stepper -#if HAS_Z2_ENABLE && AXIS_DRIVER_TYPE_Z2(TMC26X) - extern TMC26XStepper stepperZ2; - #define Z2_ENABLE_INIT() NOOP - #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE) - #define Z2_ENABLE_READ() stepperZ2.isEnabled() -#endif - -// Z3 Stepper -#if HAS_Z3_ENABLE && AXIS_DRIVER_TYPE_Z3(TMC26X) - extern TMC26XStepper stepperZ3; - #define Z3_ENABLE_INIT() NOOP - #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE) - #define Z3_ENABLE_READ() stepperZ3.isEnabled() -#endif - -// Z4 Stepper -#if HAS_Z4_ENABLE && AXIS_DRIVER_TYPE_Z4(TMC26X) - extern TMC26XStepper stepperZ4; - #define Z4_ENABLE_INIT() NOOP - #define Z4_ENABLE_WRITE(STATE) stepperZ4.setEnabled(STATE) - #define Z4_ENABLE_READ() stepperZ4.isEnabled() -#endif - -// E0 Stepper -#if AXIS_DRIVER_TYPE_E0(TMC26X) - extern TMC26XStepper stepperE0; - #define E0_ENABLE_INIT() NOOP - #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE) - #define E0_ENABLE_READ() stepperE0.isEnabled() -#endif - -// E1 Stepper -#if AXIS_DRIVER_TYPE_E1(TMC26X) - extern TMC26XStepper stepperE1; - #define E1_ENABLE_INIT() NOOP - #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE) - #define E1_ENABLE_READ() stepperE1.isEnabled() -#endif - -// E2 Stepper -#if AXIS_DRIVER_TYPE_E2(TMC26X) - extern TMC26XStepper stepperE2; - #define E2_ENABLE_INIT() NOOP - #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE) - #define E2_ENABLE_READ() stepperE2.isEnabled() -#endif - -// E3 Stepper -#if AXIS_DRIVER_TYPE_E3(TMC26X) - extern TMC26XStepper stepperE3; - #define E3_ENABLE_INIT() NOOP - #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE) - #define E3_ENABLE_READ() stepperE3.isEnabled() -#endif - -// E4 Stepper -#if AXIS_DRIVER_TYPE_E4(TMC26X) - extern TMC26XStepper stepperE4; - #define E4_ENABLE_INIT() NOOP - #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE) - #define E4_ENABLE_READ() stepperE4.isEnabled() -#endif - -// E5 Stepper -#if AXIS_DRIVER_TYPE_E5(TMC26X) - extern TMC26XStepper stepperE5; - #define E5_ENABLE_INIT() NOOP - #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE) - #define E5_ENABLE_READ() stepperE5.isEnabled() -#endif - -// E6 Stepper -#if AXIS_DRIVER_TYPE_E6(TMC26X) - extern TMC26XStepper stepperE6; - #define E6_ENABLE_INIT() NOOP - #define E6_ENABLE_WRITE(STATE) stepperE6.setEnabled(STATE) - #define E6_ENABLE_READ() stepperE6.isEnabled() -#endif - -// E7 Stepper -#if AXIS_DRIVER_TYPE_E7(TMC26X) - extern TMC26XStepper stepperE7; - #define E7_ENABLE_INIT() NOOP - #define E7_ENABLE_WRITE(STATE) stepperE7.setEnabled(STATE) - #define E7_ENABLE_READ() stepperE7.isEnabled() -#endif diff --git a/Marlin/src/module/stepper/indirection.cpp b/Marlin/src/module/stepper/indirection.cpp deleted file mode 100644 index 6f9ac9ba0a..0000000000 --- a/Marlin/src/module/stepper/indirection.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * stepper/indirection.cpp - * - * Stepper motor driver indirection to allow some stepper functions to - * be done via SPI/I2c instead of direct pin manipulation. - * - * Copyright (c) 2015 Dominik Wenger - */ - -#include "../../inc/MarlinConfig.h" -#include "indirection.h" - -void restore_stepper_drivers() { - TERN_(HAS_TRINAMIC_CONFIG, restore_trinamic_drivers()); -} - -void reset_stepper_drivers() { - #if HAS_DRIVER(TMC26X) - tmc26x_init_to_defaults(); - #endif - TERN_(HAS_L64XX, L64xxManager.init_to_defaults()); - TERN_(HAS_TRINAMIC_CONFIG, reset_trinamic_drivers()); -} diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h deleted file mode 100644 index ec0d63a89d..0000000000 --- a/Marlin/src/module/stepper/indirection.h +++ /dev/null @@ -1,992 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * stepper/indirection.h - * - * Stepper motor driver indirection to allow some stepper functions to - * be done via SPI/I2c instead of direct pin manipulation. - * - * Copyright (c) 2015 Dominik Wenger - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_L64XX - #include "L64xx.h" -#endif - -#if HAS_DRIVER(TMC26X) - #include "TMC26X.h" -#endif - -#if HAS_TRINAMIC_CONFIG - #include "trinamic.h" -#endif - -void restore_stepper_drivers(); // Called by PSU_ON -void reset_stepper_drivers(); // Called by settings.load / settings.reset - -// X Stepper -#ifndef X_ENABLE_INIT - #define X_ENABLE_INIT() SET_OUTPUT(X_ENABLE_PIN) - #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE) - #define X_ENABLE_READ() bool(READ(X_ENABLE_PIN)) -#endif -#ifndef X_DIR_INIT - #define X_DIR_INIT() SET_OUTPUT(X_DIR_PIN) - #define X_DIR_WRITE(STATE) WRITE(X_DIR_PIN,STATE) - #define X_DIR_READ() bool(READ(X_DIR_PIN)) -#endif -#define X_STEP_INIT() SET_OUTPUT(X_STEP_PIN) -#ifndef X_STEP_WRITE - #define X_STEP_WRITE(STATE) WRITE(X_STEP_PIN,STATE) -#endif -#define X_STEP_READ() bool(READ(X_STEP_PIN)) - -// Y Stepper -#ifndef Y_ENABLE_INIT - #define Y_ENABLE_INIT() SET_OUTPUT(Y_ENABLE_PIN) - #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE) - #define Y_ENABLE_READ() bool(READ(Y_ENABLE_PIN)) -#endif -#ifndef Y_DIR_INIT - #define Y_DIR_INIT() SET_OUTPUT(Y_DIR_PIN) - #define Y_DIR_WRITE(STATE) WRITE(Y_DIR_PIN,STATE) - #define Y_DIR_READ() bool(READ(Y_DIR_PIN)) -#endif -#define Y_STEP_INIT() SET_OUTPUT(Y_STEP_PIN) -#ifndef Y_STEP_WRITE - #define Y_STEP_WRITE(STATE) WRITE(Y_STEP_PIN,STATE) -#endif -#define Y_STEP_READ() bool(READ(Y_STEP_PIN)) - -// Z Stepper -#ifndef Z_ENABLE_INIT - #define Z_ENABLE_INIT() SET_OUTPUT(Z_ENABLE_PIN) - #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE) - #define Z_ENABLE_READ() bool(READ(Z_ENABLE_PIN)) -#endif -#ifndef Z_DIR_INIT - #define Z_DIR_INIT() SET_OUTPUT(Z_DIR_PIN) - #define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,STATE) - #define Z_DIR_READ() bool(READ(Z_DIR_PIN)) -#endif -#define Z_STEP_INIT() SET_OUTPUT(Z_STEP_PIN) -#ifndef Z_STEP_WRITE - #define Z_STEP_WRITE(STATE) WRITE(Z_STEP_PIN,STATE) -#endif -#define Z_STEP_READ() bool(READ(Z_STEP_PIN)) - -// X2 Stepper -#if HAS_X2_ENABLE - #ifndef X2_ENABLE_INIT - #define X2_ENABLE_INIT() SET_OUTPUT(X2_ENABLE_PIN) - #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE) - #define X2_ENABLE_READ() bool(READ(X2_ENABLE_PIN)) - #endif - #ifndef X2_DIR_INIT - #define X2_DIR_INIT() SET_OUTPUT(X2_DIR_PIN) - #define X2_DIR_WRITE(STATE) WRITE(X2_DIR_PIN,STATE) - #define X2_DIR_READ() bool(READ(X2_DIR_PIN)) - #endif - #define X2_STEP_INIT() SET_OUTPUT(X2_STEP_PIN) - #ifndef X2_STEP_WRITE - #define X2_STEP_WRITE(STATE) WRITE(X2_STEP_PIN,STATE) - #endif - #define X2_STEP_READ() bool(READ(X2_STEP_PIN)) -#endif - -// Y2 Stepper -#if HAS_Y2_ENABLE - #ifndef Y2_ENABLE_INIT - #define Y2_ENABLE_INIT() SET_OUTPUT(Y2_ENABLE_PIN) - #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE) - #define Y2_ENABLE_READ() bool(READ(Y2_ENABLE_PIN)) - #endif - #ifndef Y2_DIR_INIT - #define Y2_DIR_INIT() SET_OUTPUT(Y2_DIR_PIN) - #define Y2_DIR_WRITE(STATE) WRITE(Y2_DIR_PIN,STATE) - #define Y2_DIR_READ() bool(READ(Y2_DIR_PIN)) - #endif - #define Y2_STEP_INIT() SET_OUTPUT(Y2_STEP_PIN) - #ifndef Y2_STEP_WRITE - #define Y2_STEP_WRITE(STATE) WRITE(Y2_STEP_PIN,STATE) - #endif - #define Y2_STEP_READ() bool(READ(Y2_STEP_PIN)) -#else - #define Y2_DIR_WRITE(STATE) NOOP -#endif - -// Z2 Stepper -#if HAS_Z2_ENABLE - #ifndef Z2_ENABLE_INIT - #define Z2_ENABLE_INIT() SET_OUTPUT(Z2_ENABLE_PIN) - #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE) - #define Z2_ENABLE_READ() bool(READ(Z2_ENABLE_PIN)) - #endif - #ifndef Z2_DIR_INIT - #define Z2_DIR_INIT() SET_OUTPUT(Z2_DIR_PIN) - #define Z2_DIR_WRITE(STATE) WRITE(Z2_DIR_PIN,STATE) - #define Z2_DIR_READ() bool(READ(Z2_DIR_PIN)) - #endif - #define Z2_STEP_INIT() SET_OUTPUT(Z2_STEP_PIN) - #ifndef Z2_STEP_WRITE - #define Z2_STEP_WRITE(STATE) WRITE(Z2_STEP_PIN,STATE) - #endif - #define Z2_STEP_READ() bool(READ(Z2_STEP_PIN)) -#else - #define Z2_DIR_WRITE(STATE) NOOP -#endif - -// Z3 Stepper -#if HAS_Z3_ENABLE - #ifndef Z3_ENABLE_INIT - #define Z3_ENABLE_INIT() SET_OUTPUT(Z3_ENABLE_PIN) - #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE) - #define Z3_ENABLE_READ() bool(READ(Z3_ENABLE_PIN)) - #endif - #ifndef Z3_DIR_INIT - #define Z3_DIR_INIT() SET_OUTPUT(Z3_DIR_PIN) - #define Z3_DIR_WRITE(STATE) WRITE(Z3_DIR_PIN,STATE) - #define Z3_DIR_READ() bool(READ(Z3_DIR_PIN)) - #endif - #define Z3_STEP_INIT() SET_OUTPUT(Z3_STEP_PIN) - #ifndef Z3_STEP_WRITE - #define Z3_STEP_WRITE(STATE) WRITE(Z3_STEP_PIN,STATE) - #endif - #define Z3_STEP_READ() bool(READ(Z3_STEP_PIN)) -#else - #define Z3_DIR_WRITE(STATE) NOOP -#endif - -// Z4 Stepper -#if HAS_Z4_ENABLE - #ifndef Z4_ENABLE_INIT - #define Z4_ENABLE_INIT() SET_OUTPUT(Z4_ENABLE_PIN) - #define Z4_ENABLE_WRITE(STATE) WRITE(Z4_ENABLE_PIN,STATE) - #define Z4_ENABLE_READ() bool(READ(Z4_ENABLE_PIN)) - #endif - #ifndef Z4_DIR_INIT - #define Z4_DIR_INIT() SET_OUTPUT(Z4_DIR_PIN) - #define Z4_DIR_WRITE(STATE) WRITE(Z4_DIR_PIN,STATE) - #define Z4_DIR_READ() bool(READ(Z4_DIR_PIN)) - #endif - #define Z4_STEP_INIT() SET_OUTPUT(Z4_STEP_PIN) - #ifndef Z4_STEP_WRITE - #define Z4_STEP_WRITE(STATE) WRITE(Z4_STEP_PIN,STATE) - #endif - #define Z4_STEP_READ() bool(READ(Z4_STEP_PIN)) -#else - #define Z4_DIR_WRITE(STATE) NOOP -#endif - -// E0 Stepper -#ifndef E0_ENABLE_INIT - #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) - #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) - #define E0_ENABLE_READ() bool(READ(E0_ENABLE_PIN)) -#endif -#ifndef E0_DIR_INIT - #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) - #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,STATE) - #define E0_DIR_READ() bool(READ(E0_DIR_PIN)) -#endif -#define E0_STEP_INIT() SET_OUTPUT(E0_STEP_PIN) -#ifndef E0_STEP_WRITE - #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE) -#endif -#define E0_STEP_READ() bool(READ(E0_STEP_PIN)) - -// E1 Stepper -#ifndef E1_ENABLE_INIT - #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) - #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) - #define E1_ENABLE_READ() bool(READ(E1_ENABLE_PIN)) -#endif -#ifndef E1_DIR_INIT - #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) - #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,STATE) - #define E1_DIR_READ() bool(READ(E1_DIR_PIN)) -#endif -#define E1_STEP_INIT() SET_OUTPUT(E1_STEP_PIN) -#ifndef E1_STEP_WRITE - #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE) -#endif -#define E1_STEP_READ() bool(READ(E1_STEP_PIN)) - -// E2 Stepper -#ifndef E2_ENABLE_INIT - #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) - #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) - #define E2_ENABLE_READ() bool(READ(E2_ENABLE_PIN)) -#endif -#ifndef E2_DIR_INIT - #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) - #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,STATE) - #define E2_DIR_READ() bool(READ(E2_DIR_PIN)) -#endif -#define E2_STEP_INIT() SET_OUTPUT(E2_STEP_PIN) -#ifndef E2_STEP_WRITE - #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE) -#endif -#define E2_STEP_READ() bool(READ(E2_STEP_PIN)) - -// E3 Stepper -#ifndef E3_ENABLE_INIT - #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) - #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) - #define E3_ENABLE_READ() bool(READ(E3_ENABLE_PIN)) -#endif -#ifndef E3_DIR_INIT - #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) - #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,STATE) - #define E3_DIR_READ() bool(READ(E3_DIR_PIN)) -#endif -#define E3_STEP_INIT() SET_OUTPUT(E3_STEP_PIN) -#ifndef E3_STEP_WRITE - #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE) -#endif -#define E3_STEP_READ() bool(READ(E3_STEP_PIN)) - -// E4 Stepper -#ifndef E4_ENABLE_INIT - #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) - #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) - #define E4_ENABLE_READ() bool(READ(E4_ENABLE_PIN)) -#endif -#ifndef E4_DIR_INIT - #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) - #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,STATE) - #define E4_DIR_READ() bool(READ(E4_DIR_PIN)) -#endif -#define E4_STEP_INIT() SET_OUTPUT(E4_STEP_PIN) -#ifndef E4_STEP_WRITE - #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) -#endif -#define E4_STEP_READ() bool(READ(E4_STEP_PIN)) - -// E5 Stepper -#ifndef E5_ENABLE_INIT - #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) - #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) - #define E5_ENABLE_READ() bool(READ(E5_ENABLE_PIN)) -#endif -#ifndef E5_DIR_INIT - #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) - #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE) - #define E5_DIR_READ() bool(READ(E5_DIR_PIN)) -#endif -#define E5_STEP_INIT() SET_OUTPUT(E5_STEP_PIN) -#ifndef E5_STEP_WRITE - #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE) -#endif -#define E5_STEP_READ() bool(READ(E5_STEP_PIN)) - -// E6 Stepper -#ifndef E6_ENABLE_INIT - #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) - #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) - #define E6_ENABLE_READ() bool(READ(E6_ENABLE_PIN)) -#endif -#ifndef E6_DIR_INIT - #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) - #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,STATE) - #define E6_DIR_READ() bool(READ(E6_DIR_PIN)) -#endif -#define E6_STEP_INIT() SET_OUTPUT(E6_STEP_PIN) -#ifndef E6_STEP_WRITE - #define E6_STEP_WRITE(STATE) WRITE(E6_STEP_PIN,STATE) -#endif -#define E6_STEP_READ() bool(READ(E6_STEP_PIN)) - -// E7 Stepper -#ifndef E7_ENABLE_INIT - #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) - #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) - #define E7_ENABLE_READ() bool(READ(E7_ENABLE_PIN)) -#endif -#ifndef E7_DIR_INIT - #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) - #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,STATE) - #define E7_DIR_READ() bool(READ(E7_DIR_PIN)) -#endif -#define E7_STEP_INIT() SET_OUTPUT(E7_STEP_PIN) -#ifndef E7_STEP_WRITE - #define E7_STEP_WRITE(STATE) WRITE(E7_STEP_PIN,STATE) -#endif -#define E7_STEP_READ() bool(READ(E7_STEP_PIN)) - -/** - * Extruder indirection for the single E axis - */ -#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index - #if EXTRUDERS > 7 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else if (E < 6) { E2_STEP_WRITE(V); } else { E3_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - case 4: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 5: E2_DIR_WRITE( INVERT_E2_DIR); break; \ - case 6: E3_DIR_WRITE( INVERT_E3_DIR); break; case 7: E3_DIR_WRITE( INVERT_E3_DIR); break; \ - } }while(0) - #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - case 4: E2_DIR_WRITE( INVERT_E2_DIR); break; case 5: E2_DIR_WRITE(!INVERT_E2_DIR); break; \ - case 6: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 7: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ - } }while(0) - #elif EXTRUDERS > 6 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else if (E < 6) { E2_STEP_WRITE(V); } else { E3_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - case 4: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 5: E2_DIR_WRITE( INVERT_E2_DIR); break; \ - case 6: E3_DIR_WRITE( INVERT_E3_DIR); break; \ - } }while(0) - #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - case 4: E2_DIR_WRITE( INVERT_E2_DIR); break; case 5: E2_DIR_WRITE(!INVERT_E2_DIR); break; \ - case 6: E3_DIR_WRITE(!INVERT_E3_DIR); } }while(0) - #elif EXTRUDERS > 5 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - case 4: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 5: E2_DIR_WRITE( INVERT_E2_DIR); break; \ - } }while(0) - #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - case 4: E2_DIR_WRITE( INVERT_E2_DIR); break; case 5: E2_DIR_WRITE(!INVERT_E2_DIR); break; \ - } }while(0) - #elif EXTRUDERS > 4 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - case 4: E2_DIR_WRITE(!INVERT_E2_DIR); break; \ - } }while(0) - #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - case 4: E2_DIR_WRITE( INVERT_E2_DIR); break; \ - } }while(0) - #elif EXTRUDERS > 3 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - } }while(0) - #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - } }while(0) - #elif EXTRUDERS > 2 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - } }while(0) - #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ - case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - } }while(0) - #else - #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) - #define NORM_E_DIR(E) do{ E0_DIR_WRITE(E ? INVERT_E0_DIR : !INVERT_E0_DIR); }while(0) - #define REV_E_DIR(E) do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR : INVERT_E0_DIR); }while(0) - #endif -#elif ENABLED(PRUSA_MMU2) - #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) - #define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR) - #define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR) - -#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index - #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) - #define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0) - #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0) - -#elif E_STEPPERS > 1 - - #if E_STEPPERS > 7 - - #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ - case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; case 6: E6_STEP_WRITE(V); break; case 7: E7_STEP_WRITE(V); break; \ - } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ - case 4: E4_DIR_WRITE(!INVERT_E4_DIR); break; case 5: E5_DIR_WRITE(!INVERT_E5_DIR); break; \ - case 6: E6_DIR_WRITE(!INVERT_E6_DIR); break; case 7: E7_DIR_WRITE(!INVERT_E7_DIR); break; \ - } }while(0) - #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ - case 4: E4_DIR_WRITE( INVERT_E4_DIR); break; case 5: E5_DIR_WRITE( INVERT_E5_DIR); break; \ - case 6: E6_DIR_WRITE( INVERT_E6_DIR); break; case 7: E7_DIR_WRITE( INVERT_E7_DIR); break; \ - } }while(0) - - #elif E_STEPPERS > 6 - - #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ - case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; case 6: E6_STEP_WRITE(V); break; \ - } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ - case 4: E4_DIR_WRITE(!INVERT_E4_DIR); break; case 5: E5_DIR_WRITE(!INVERT_E5_DIR); break; \ - case 6: E6_DIR_WRITE(!INVERT_E6_DIR); break; \ - } }while(0) - #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ - case 4: E4_DIR_WRITE( INVERT_E4_DIR); break; case 5: E5_DIR_WRITE( INVERT_E5_DIR); break; \ - case 6: E6_DIR_WRITE( INVERT_E6_DIR); break; \ - } }while(0) - - #elif E_STEPPERS > 5 - - #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ - case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; \ - } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ - case 4: E4_DIR_WRITE(!INVERT_E4_DIR); break; case 5: E5_DIR_WRITE(!INVERT_E5_DIR); break; \ - } }while(0) - #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ - case 4: E4_DIR_WRITE( INVERT_E4_DIR); break; case 5: E5_DIR_WRITE( INVERT_E5_DIR); break; \ - } }while(0) - - #elif E_STEPPERS > 4 - - #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ - case 4: E4_STEP_WRITE(V); break; \ - } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ - case 4: E4_DIR_WRITE(!INVERT_E4_DIR); break; \ - } }while(0) - #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ - case 4: E4_DIR_WRITE( INVERT_E4_DIR); break; \ - } }while(0) - - #elif E_STEPPERS > 3 - - #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ - } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ - } }while(0) - #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ - case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ - } }while(0) - - #elif E_STEPPERS > 2 - - #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) - #define _REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0) - - #else - - #define _E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) - #define _NORM_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) - #define _REV_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) - #endif - - #if HAS_DUPLICATION_MODE - - #if ENABLED(MULTI_NOZZLE_DUPLICATION) - #define _DUPE(N,T,V) do{ if (TEST(duplication_e_mask, N)) E##N##_##T##_WRITE(V); }while(0) - #else - #define _DUPE(N,T,V) E##N##_##T##_WRITE(V) - #endif - - #define NDIR(N) _DUPE(N,DIR,!INVERT_E##N##_DIR) - #define RDIR(N) _DUPE(N,DIR, INVERT_E##N##_DIR) - - #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { DUPE(STEP,V); } else _E_STEP_WRITE(E,V); }while(0) - - #if E_STEPPERS > 2 - #if E_STEPPERS > 7 - #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); _DUPE(5,T,V); _DUPE(6,T,V); _DUPE(7,T,V); }while(0) - #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); NDIR(5); NDIR(6); NDIR(7); } else _NORM_E_DIR(E); }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); RDIR(5); RDIR(6); RDIR(7); } else _REV_E_DIR(E); }while(0) - #elif E_STEPPERS > 6 - #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); _DUPE(5,T,V); _DUPE(6,T,V); }while(0) - #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); NDIR(5); NDIR(6); } else _NORM_E_DIR(E); }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); RDIR(5); RDIR(6); } else _REV_E_DIR(E); }while(0) - #elif E_STEPPERS > 5 - #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); _DUPE(5,T,V); }while(0) - #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); NDIR(5); } else _NORM_E_DIR(E); }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); RDIR(5); } else _REV_E_DIR(E); }while(0) - #elif E_STEPPERS > 4 - #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); }while(0) - #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); } else _NORM_E_DIR(E); }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); } else _REV_E_DIR(E); }while(0) - #elif E_STEPPERS > 3 - #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); }while(0) - #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); } else _NORM_E_DIR(E); }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); } else _REV_E_DIR(E); }while(0) - #else - #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); }while(0) - #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); } else _NORM_E_DIR(E); }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); } else _REV_E_DIR(E); }while(0) - #endif - #else - #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); }while(0) - #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); } else _NORM_E_DIR(E); }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); } else _REV_E_DIR(E); }while(0) - #endif - - #else - - #define E_STEP_WRITE(E,V) _E_STEP_WRITE(E,V) - #define NORM_E_DIR(E) _NORM_E_DIR(E) - #define REV_E_DIR(E) _REV_E_DIR(E) - - #endif - -#elif E_STEPPERS - #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) - #define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR) - #define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR) - -#else - #define E_STEP_WRITE(E,V) NOOP - #define NORM_E_DIR(E) NOOP - #define REV_E_DIR(E) NOOP - -#endif - -// -// Individual stepper enable / disable macros -// - -#ifndef ENABLE_STEPPER_X - #if HAS_X_ENABLE - #define ENABLE_STEPPER_X() X_ENABLE_WRITE( X_ENABLE_ON) - #else - #define ENABLE_STEPPER_X() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_X - #if HAS_X_ENABLE - #define DISABLE_STEPPER_X() X_ENABLE_WRITE(!X_ENABLE_ON) - #else - #define DISABLE_STEPPER_X() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_X2 - #if HAS_X2_ENABLE - #define ENABLE_STEPPER_X2() X2_ENABLE_WRITE( X_ENABLE_ON) - #else - #define ENABLE_STEPPER_X2() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_X2 - #if HAS_X2_ENABLE - #define DISABLE_STEPPER_X2() X2_ENABLE_WRITE(!X_ENABLE_ON) - #else - #define DISABLE_STEPPER_X2() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_Y - #if HAS_Y_ENABLE - #define ENABLE_STEPPER_Y() Y_ENABLE_WRITE( Y_ENABLE_ON) - #else - #define ENABLE_STEPPER_Y() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_Y - #if HAS_Y_ENABLE - #define DISABLE_STEPPER_Y() Y_ENABLE_WRITE(!Y_ENABLE_ON) - #else - #define DISABLE_STEPPER_Y() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_Y2 - #if HAS_Y2_ENABLE - #define ENABLE_STEPPER_Y2() Y2_ENABLE_WRITE( Y_ENABLE_ON) - #else - #define ENABLE_STEPPER_Y2() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_Y2 - #if HAS_Y2_ENABLE - #define DISABLE_STEPPER_Y2() Y2_ENABLE_WRITE(!Y_ENABLE_ON) - #else - #define DISABLE_STEPPER_Y2() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_Z - #if HAS_Z_ENABLE - #define ENABLE_STEPPER_Z() Z_ENABLE_WRITE( Z_ENABLE_ON) - #else - #define ENABLE_STEPPER_Z() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_Z - #if HAS_Z_ENABLE - #define DISABLE_STEPPER_Z() Z_ENABLE_WRITE(!Z_ENABLE_ON) - #else - #define DISABLE_STEPPER_Z() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_Z2 - #if HAS_Z2_ENABLE - #define ENABLE_STEPPER_Z2() Z2_ENABLE_WRITE( Z_ENABLE_ON) - #else - #define ENABLE_STEPPER_Z2() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_Z2 - #if HAS_Z2_ENABLE - #define DISABLE_STEPPER_Z2() Z2_ENABLE_WRITE(!Z_ENABLE_ON) - #else - #define DISABLE_STEPPER_Z2() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_Z3 - #if HAS_Z3_ENABLE - #define ENABLE_STEPPER_Z3() Z3_ENABLE_WRITE( Z_ENABLE_ON) - #else - #define ENABLE_STEPPER_Z3() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_Z3 - #if HAS_Z3_ENABLE - #define DISABLE_STEPPER_Z3() Z3_ENABLE_WRITE(!Z_ENABLE_ON) - #else - #define DISABLE_STEPPER_Z3() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_Z4 - #if HAS_Z4_ENABLE - #define ENABLE_STEPPER_Z4() Z4_ENABLE_WRITE( Z_ENABLE_ON) - #else - #define ENABLE_STEPPER_Z4() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_Z4 - #if HAS_Z4_ENABLE - #define DISABLE_STEPPER_Z4() Z4_ENABLE_WRITE(!Z_ENABLE_ON) - #else - #define DISABLE_STEPPER_Z4() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_E0 - #if HAS_E0_ENABLE - #define ENABLE_STEPPER_E0() E0_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E0() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_E0 - #if HAS_E0_ENABLE - #define DISABLE_STEPPER_E0() E0_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E0() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define ENABLE_STEPPER_E1() E1_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E1() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define DISABLE_STEPPER_E1() E1_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E1() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define ENABLE_STEPPER_E2() E2_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E2() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define DISABLE_STEPPER_E2() E2_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E2() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define ENABLE_STEPPER_E3() E3_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E3() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define DISABLE_STEPPER_E3() E3_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E3() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define ENABLE_STEPPER_E4() E4_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E4() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define DISABLE_STEPPER_E4() E4_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E4() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define ENABLE_STEPPER_E5() E5_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E5() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define DISABLE_STEPPER_E5() E5_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E5() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define ENABLE_STEPPER_E6() E6_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E6() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define DISABLE_STEPPER_E6() E6_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E6() NOOP - #endif -#endif - -#ifndef ENABLE_STEPPER_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define ENABLE_STEPPER_E7() E7_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E7() NOOP - #endif -#endif -#ifndef DISABLE_STEPPER_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define DISABLE_STEPPER_E7() E7_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E7() NOOP - #endif -#endif - -// -// Axis steppers enable / disable macros -// -#define FORGET_AXIS(A) TERN(HOME_AFTER_DEACTIVATE, set_axis_never_homed(A), CBI(axis_known_position, A)) - -#define ENABLE_AXIS_X() do{ ENABLE_STEPPER_X(); ENABLE_STEPPER_X2(); }while(0) -#define DISABLE_AXIS_X() do{ DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); FORGET_AXIS(X_AXIS); }while(0) - -#define ENABLE_AXIS_Y() do{ ENABLE_STEPPER_Y(); ENABLE_STEPPER_Y2(); }while(0) -#define DISABLE_AXIS_Y() do{ DISABLE_STEPPER_Y(); DISABLE_STEPPER_Y2(); FORGET_AXIS(Y_AXIS); }while(0) - -#define ENABLE_AXIS_Z() do{ ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); }while(0) - -#ifdef Z_AFTER_DEACTIVATE - #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; sync_plan_position(); }while(0) -#else - #define Z_RESET() -#endif -#define DISABLE_AXIS_Z() do{ DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); FORGET_AXIS(Z_AXIS); Z_RESET(); }while(0) - -// -// Extruder steppers enable / disable macros -// - -#if ENABLED(MIXING_EXTRUDER) - /** - * Mixing steppers keep all their enable (and direction) states synchronized - */ - #define _CALL_ENA_E(N) ENABLE_STEPPER_E##N () ; - #define _CALL_DIS_E(N) DISABLE_STEPPER_E##N () ; - #define ENABLE_AXIS_E0() { RREPEAT(MIXING_STEPPERS, _CALL_ENA_E) } - #define DISABLE_AXIS_E0() { RREPEAT(MIXING_STEPPERS, _CALL_DIS_E) } -#endif - -#ifndef ENABLE_AXIS_E0 - #if E_STEPPERS && HAS_E0_ENABLE - #define ENABLE_AXIS_E0() ENABLE_STEPPER_E0() - #else - #define ENABLE_AXIS_E0() NOOP - #endif -#endif -#ifndef DISABLE_AXIS_E0 - #if E_STEPPERS && HAS_E0_ENABLE - #define DISABLE_AXIS_E0() DISABLE_STEPPER_E0() - #else - #define DISABLE_AXIS_E0() NOOP - #endif -#endif - -#ifndef ENABLE_AXIS_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define ENABLE_AXIS_E1() ENABLE_STEPPER_E1() - #else - #define ENABLE_AXIS_E1() NOOP - #endif -#endif -#ifndef DISABLE_AXIS_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define DISABLE_AXIS_E1() DISABLE_STEPPER_E1() - #else - #define DISABLE_AXIS_E1() NOOP - #endif -#endif - -#ifndef ENABLE_AXIS_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define ENABLE_AXIS_E2() ENABLE_STEPPER_E2() - #else - #define ENABLE_AXIS_E2() NOOP - #endif -#endif -#ifndef DISABLE_AXIS_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define DISABLE_AXIS_E2() DISABLE_STEPPER_E2() - #else - #define DISABLE_AXIS_E2() NOOP - #endif -#endif - -#ifndef ENABLE_AXIS_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define ENABLE_AXIS_E3() ENABLE_STEPPER_E3() - #else - #define ENABLE_AXIS_E3() NOOP - #endif -#endif -#ifndef DISABLE_AXIS_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define DISABLE_AXIS_E3() DISABLE_STEPPER_E3() - #else - #define DISABLE_AXIS_E3() NOOP - #endif -#endif - -#ifndef ENABLE_AXIS_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define ENABLE_AXIS_E4() ENABLE_STEPPER_E4() - #else - #define ENABLE_AXIS_E4() NOOP - #endif -#endif -#ifndef DISABLE_AXIS_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define DISABLE_AXIS_E4() DISABLE_STEPPER_E4() - #else - #define DISABLE_AXIS_E4() NOOP - #endif -#endif - -#ifndef ENABLE_AXIS_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define ENABLE_AXIS_E5() ENABLE_STEPPER_E5() - #else - #define ENABLE_AXIS_E5() NOOP - #endif -#endif -#ifndef DISABLE_AXIS_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define DISABLE_AXIS_E5() DISABLE_STEPPER_E5() - #else - #define DISABLE_AXIS_E5() NOOP - #endif -#endif - -#ifndef ENABLE_AXIS_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define ENABLE_AXIS_E6() ENABLE_STEPPER_E6() - #else - #define ENABLE_AXIS_E6() NOOP - #endif -#endif -#ifndef DISABLE_AXIS_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define DISABLE_AXIS_E6() DISABLE_STEPPER_E6() - #else - #define DISABLE_AXIS_E6() NOOP - #endif -#endif - -#ifndef ENABLE_AXIS_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define ENABLE_AXIS_E7() ENABLE_STEPPER_E7() - #else - #define ENABLE_AXIS_E7() NOOP - #endif -#endif -#ifndef DISABLE_AXIS_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define DISABLE_AXIS_E7() DISABLE_STEPPER_E7() - #else - #define DISABLE_AXIS_E7() NOOP - #endif -#endif diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp deleted file mode 100644 index d5a861d71b..0000000000 --- a/Marlin/src/module/stepper/trinamic.cpp +++ /dev/null @@ -1,877 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * stepper/trinamic.cpp - * Stepper driver indirection for Trinamic - */ - -#include "../../inc/MarlinConfig.h" - -#if HAS_TRINAMIC_CONFIG - -#include "trinamic.h" -#include "../stepper.h" - -#include -#include - -enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; -#define TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX]) - -// IC = TMC model number -// ST = Stepper object letter -// L = Label characters -// AI = Axis Enum Index -// SWHW = SW/SH UART selection -#if ENABLED(TMC_USE_SW_SPI) - #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK, ST##_CHAIN_POS) -#else - #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), ST##_CHAIN_POS) -#endif - -#if ENABLED(TMC_SERIAL_MULTIPLEXER) - #define TMC_UART_HW_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(&ST##_HARDWARE_SERIAL, float(ST##_RSENSE), ST##_SLAVE_ADDRESS, SERIAL_MUL_PIN1, SERIAL_MUL_PIN2) -#else - #define TMC_UART_HW_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(&ST##_HARDWARE_SERIAL, float(ST##_RSENSE), ST##_SLAVE_ADDRESS) -#endif -#define TMC_UART_SW_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, float(ST##_RSENSE), ST##_SLAVE_ADDRESS) - -#define _TMC_SPI_DEFINE(IC, ST, AI) __TMC_SPI_DEFINE(IC, ST, TMC_##ST##_LABEL, AI) -#define TMC_SPI_DEFINE(ST, AI) _TMC_SPI_DEFINE(ST##_DRIVER_TYPE, ST, AI##_AXIS) - -#define _TMC_UART_DEFINE(SWHW, IC, ST, AI) TMC_UART_##SWHW##_DEFINE(IC, ST, TMC_##ST##_LABEL, AI) -#define TMC_UART_DEFINE(SWHW, ST, AI) _TMC_UART_DEFINE(SWHW, ST##_DRIVER_TYPE, ST, AI##_AXIS) - -#if DISTINCT_E > 1 - #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI) - #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E##AI) -#else - #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E) - #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E) -#endif - -// Stepper objects of TMC2130/TMC2160/TMC2660/TMC5130/TMC5160 steppers used -#if AXIS_HAS_SPI(X) - TMC_SPI_DEFINE(X, X); -#endif -#if AXIS_HAS_SPI(X2) - TMC_SPI_DEFINE(X2, X); -#endif -#if AXIS_HAS_SPI(Y) - TMC_SPI_DEFINE(Y, Y); -#endif -#if AXIS_HAS_SPI(Y2) - TMC_SPI_DEFINE(Y2, Y); -#endif -#if AXIS_HAS_SPI(Z) - TMC_SPI_DEFINE(Z, Z); -#endif -#if AXIS_HAS_SPI(Z2) - TMC_SPI_DEFINE(Z2, Z); -#endif -#if AXIS_HAS_SPI(Z3) - TMC_SPI_DEFINE(Z3, Z); -#endif -#if AXIS_HAS_SPI(Z4) - TMC_SPI_DEFINE(Z4, Z); -#endif -#if AXIS_HAS_SPI(E0) - TMC_SPI_DEFINE_E(0); -#endif -#if AXIS_HAS_SPI(E1) - TMC_SPI_DEFINE_E(1); -#endif -#if AXIS_HAS_SPI(E2) - TMC_SPI_DEFINE_E(2); -#endif -#if AXIS_HAS_SPI(E3) - TMC_SPI_DEFINE_E(3); -#endif -#if AXIS_HAS_SPI(E4) - TMC_SPI_DEFINE_E(4); -#endif -#if AXIS_HAS_SPI(E5) - TMC_SPI_DEFINE_E(5); -#endif -#if AXIS_HAS_SPI(E6) - TMC_SPI_DEFINE_E(6); -#endif -#if AXIS_HAS_SPI(E7) - TMC_SPI_DEFINE_E(7); -#endif - -#ifndef TMC_BAUD_RATE - // Reduce baud rate for boards not already overriding TMC_BAUD_RATE for software serial. - // Testing has shown that 115200 is not 100% reliable on AVR platforms, occasionally - // failing to read status properly. 32-bit platforms typically define an even lower - // TMC_BAUD_RATE, due to differences in how SoftwareSerial libraries work on different - // platforms. - #define TMC_BAUD_RATE TERN(HAS_TMC_SW_SERIAL, 57600, 115200) -#endif - -#if HAS_DRIVER(TMC2130) - template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { - st.begin(); - - CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; - chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; - TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); - st.CHOPCONF(chopconf.sr); - - st.rms_current(mA, HOLD_MULTIPLIER); - st.microsteps(microsteps); - st.iholddelay(10); - st.TPOWERDOWN(128); // ~2s until driver lowers to hold current - - st.en_pwm_mode(stealth); - st.stored.stealthChop_enabled = stealth; - - PWMCONF_t pwmconf{0}; - pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk - pwmconf.pwm_autoscale = true; - pwmconf.pwm_grad = 5; - pwmconf.pwm_ampl = 180; - st.PWMCONF(pwmconf.sr); - - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); - - st.GSTAT(); // Clear GSTAT - } -#endif // TMC2130 - -#if HAS_DRIVER(TMC2160) - template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { - st.begin(); - - CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; - chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; - TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); - st.CHOPCONF(chopconf.sr); - - st.rms_current(mA, HOLD_MULTIPLIER); - st.microsteps(microsteps); - st.iholddelay(10); - st.TPOWERDOWN(128); // ~2s until driver lowers to hold current - - st.en_pwm_mode(stealth); - st.stored.stealthChop_enabled = stealth; - - TMC2160_n::PWMCONF_t pwmconf{0}; - pwmconf.pwm_lim = 12; - pwmconf.pwm_reg = 8; - pwmconf.pwm_autograd = true; - pwmconf.pwm_autoscale = true; - pwmconf.pwm_freq = 0b01; - pwmconf.pwm_grad = 14; - pwmconf.pwm_ofs = 36; - st.PWMCONF(pwmconf.sr); - - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); - - st.GSTAT(); // Clear GSTAT - } -#endif // TMC2160 - -// -// TMC2208/2209 Driver objects and inits -// -#if HAS_TMC220x - #if AXIS_HAS_UART(X) - #ifdef X_HARDWARE_SERIAL - TMC_UART_DEFINE(HW, X, X); - #define X_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE(SW, X, X); - #define X_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(X2) - #ifdef X2_HARDWARE_SERIAL - TMC_UART_DEFINE(HW, X2, X); - #define X2_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE(SW, X2, X); - #define X2_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(Y) - #ifdef Y_HARDWARE_SERIAL - TMC_UART_DEFINE(HW, Y, Y); - #define Y_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE(SW, Y, Y); - #define Y_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(Y2) - #ifdef Y2_HARDWARE_SERIAL - TMC_UART_DEFINE(HW, Y2, Y); - #define Y2_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE(SW, Y2, Y); - #define Y2_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(Z) - #ifdef Z_HARDWARE_SERIAL - TMC_UART_DEFINE(HW, Z, Z); - #define Z_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE(SW, Z, Z); - #define Z_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(Z2) - #ifdef Z2_HARDWARE_SERIAL - TMC_UART_DEFINE(HW, Z2, Z); - #define Z2_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE(SW, Z2, Z); - #define Z2_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(Z3) - #ifdef Z3_HARDWARE_SERIAL - TMC_UART_DEFINE(HW, Z3, Z); - #define Z3_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE(SW, Z3, Z); - #define Z3_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(Z4) - #ifdef Z4_HARDWARE_SERIAL - TMC_UART_DEFINE(HW, Z4, Z); - #define Z4_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE(SW, Z4, Z); - #define Z4_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(E0) - #ifdef E0_HARDWARE_SERIAL - TMC_UART_DEFINE_E(HW, 0); - #define E0_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE_E(SW, 0); - #define E0_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(E1) - #ifdef E1_HARDWARE_SERIAL - TMC_UART_DEFINE_E(HW, 1); - #define E1_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE_E(SW, 1); - #define E1_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(E2) - #ifdef E2_HARDWARE_SERIAL - TMC_UART_DEFINE_E(HW, 2); - #define E2_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE_E(SW, 2); - #define E2_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(E3) - #ifdef E3_HARDWARE_SERIAL - TMC_UART_DEFINE_E(HW, 3); - #define E3_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE_E(SW, 3); - #define E3_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(E4) - #ifdef E4_HARDWARE_SERIAL - TMC_UART_DEFINE_E(HW, 4); - #define E4_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE_E(SW, 4); - #define E4_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(E5) - #ifdef E5_HARDWARE_SERIAL - TMC_UART_DEFINE_E(HW, 5); - #define E5_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE_E(SW, 5); - #define E5_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(E6) - #ifdef E6_HARDWARE_SERIAL - TMC_UART_DEFINE_E(HW, 6); - #define E6_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE_E(SW, 6); - #define E6_HAS_SW_SERIAL 1 - #endif - #endif - #if AXIS_HAS_UART(E7) - #ifdef E7_HARDWARE_SERIAL - TMC_UART_DEFINE_E(HW, 7); - #define E7_HAS_HW_SERIAL 1 - #else - TMC_UART_DEFINE_E(SW, 7); - #define E7_HAS_SW_SERIAL 1 - #endif - #endif - - enum TMCAxis : uint8_t { X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7, TOTAL }; - - void tmc_serial_begin() { - #if HAS_TMC_HW_SERIAL - struct { - const void *ptr[TMCAxis::TOTAL]; - bool began(const TMCAxis a, const void * const p) { - LOOP_L_N(i, a) if (p == ptr[i]) return true; - ptr[a] = p; return false; - }; - } sp_helper; - - #define HW_SERIAL_BEGIN(A) do{ if (!sp_helper.began(TMCAxis::A, &A##_HARDWARE_SERIAL)) \ - A##_HARDWARE_SERIAL.begin(TMC_BAUD_RATE); }while(0) - #endif - - #if AXIS_HAS_UART(X) - #ifdef X_HARDWARE_SERIAL - HW_SERIAL_BEGIN(X); - #else - stepperX.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(X2) - #ifdef X2_HARDWARE_SERIAL - HW_SERIAL_BEGIN(X2); - #else - stepperX2.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(Y) - #ifdef Y_HARDWARE_SERIAL - HW_SERIAL_BEGIN(Y); - #else - stepperY.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(Y2) - #ifdef Y2_HARDWARE_SERIAL - HW_SERIAL_BEGIN(Y2); - #else - stepperY2.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(Z) - #ifdef Z_HARDWARE_SERIAL - HW_SERIAL_BEGIN(Z); - #else - stepperZ.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(Z2) - #ifdef Z2_HARDWARE_SERIAL - HW_SERIAL_BEGIN(Z2); - #else - stepperZ2.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(Z3) - #ifdef Z3_HARDWARE_SERIAL - HW_SERIAL_BEGIN(Z3); - #else - stepperZ3.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(Z4) - #ifdef Z4_HARDWARE_SERIAL - HW_SERIAL_BEGIN(Z4); - #else - stepperZ4.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(E0) - #ifdef E0_HARDWARE_SERIAL - HW_SERIAL_BEGIN(E0); - #else - stepperE0.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(E1) - #ifdef E1_HARDWARE_SERIAL - HW_SERIAL_BEGIN(E1); - #else - stepperE1.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(E2) - #ifdef E2_HARDWARE_SERIAL - HW_SERIAL_BEGIN(E2); - #else - stepperE2.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(E3) - #ifdef E3_HARDWARE_SERIAL - HW_SERIAL_BEGIN(E3); - #else - stepperE3.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(E4) - #ifdef E4_HARDWARE_SERIAL - HW_SERIAL_BEGIN(E4); - #else - stepperE4.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(E5) - #ifdef E5_HARDWARE_SERIAL - HW_SERIAL_BEGIN(E5); - #else - stepperE5.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(E6) - #ifdef E6_HARDWARE_SERIAL - HW_SERIAL_BEGIN(E6); - #else - stepperE6.beginSerial(TMC_BAUD_RATE); - #endif - #endif - #if AXIS_HAS_UART(E7) - #ifdef E7_HARDWARE_SERIAL - HW_SERIAL_BEGIN(E7); - #else - stepperE7.beginSerial(TMC_BAUD_RATE); - #endif - #endif - } -#endif - -#if HAS_DRIVER(TMC2208) - template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { - TMC2208_n::GCONF_t gconf{0}; - gconf.pdn_disable = true; // Use UART - gconf.mstep_reg_select = true; // Select microsteps with UART - gconf.i_scale_analog = false; - gconf.en_spreadcycle = !stealth; - st.GCONF(gconf.sr); - st.stored.stealthChop_enabled = stealth; - - TMC2208_n::CHOPCONF_t chopconf{0}; - chopconf.tbl = 0b01; // blank_time = 24 - chopconf.toff = chopper_timing.toff; - chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; - TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); - st.CHOPCONF(chopconf.sr); - - st.rms_current(mA, HOLD_MULTIPLIER); - st.microsteps(microsteps); - st.iholddelay(10); - st.TPOWERDOWN(128); // ~2s until driver lowers to hold current - - TMC2208_n::PWMCONF_t pwmconf{0}; - pwmconf.pwm_lim = 12; - pwmconf.pwm_reg = 8; - pwmconf.pwm_autograd = true; - pwmconf.pwm_autoscale = true; - pwmconf.pwm_freq = 0b01; - pwmconf.pwm_grad = 14; - pwmconf.pwm_ofs = 36; - st.PWMCONF(pwmconf.sr); - - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); - - st.GSTAT(0b111); // Clear - delay(200); - } -#endif // TMC2208 - -#if HAS_DRIVER(TMC2209) - template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { - TMC2208_n::GCONF_t gconf{0}; - gconf.pdn_disable = true; // Use UART - gconf.mstep_reg_select = true; // Select microsteps with UART - gconf.i_scale_analog = false; - gconf.en_spreadcycle = !stealth; - st.GCONF(gconf.sr); - st.stored.stealthChop_enabled = stealth; - - TMC2208_n::CHOPCONF_t chopconf{0}; - chopconf.tbl = 0b01; // blank_time = 24 - chopconf.toff = chopper_timing.toff; - chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; - TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); - st.CHOPCONF(chopconf.sr); - - st.rms_current(mA, HOLD_MULTIPLIER); - st.microsteps(microsteps); - st.iholddelay(10); - st.TPOWERDOWN(128); // ~2s until driver lowers to hold current - - TMC2208_n::PWMCONF_t pwmconf{0}; - pwmconf.pwm_lim = 12; - pwmconf.pwm_reg = 8; - pwmconf.pwm_autograd = true; - pwmconf.pwm_autoscale = true; - pwmconf.pwm_freq = 0b01; - pwmconf.pwm_grad = 14; - pwmconf.pwm_ofs = 36; - st.PWMCONF(pwmconf.sr); - - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); - - st.GSTAT(0b111); // Clear - delay(200); - } -#endif // TMC2209 - -#if HAS_DRIVER(TMC2660) - template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool) { - st.begin(); - - TMC2660_n::CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; - st.CHOPCONF(chopconf.sr); - - st.sdoff(0); - st.rms_current(mA); - st.microsteps(microsteps); - TERN_(SQUARE_WAVE_STEPPING, st.dedge(true)); - st.intpol(INTERPOLATE); - st.diss2g(true); // Disable short to ground protection. Too many false readings? - TERN_(TMC_DEBUG, st.rdsel(0b01)); - } -#endif // TMC2660 - -#if HAS_DRIVER(TMC5130) - template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { - st.begin(); - - CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; - chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; - TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); - st.CHOPCONF(chopconf.sr); - - st.rms_current(mA, HOLD_MULTIPLIER); - st.microsteps(microsteps); - st.iholddelay(10); - st.TPOWERDOWN(128); // ~2s until driver lowers to hold current - - st.en_pwm_mode(stealth); - st.stored.stealthChop_enabled = stealth; - - PWMCONF_t pwmconf{0}; - pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk - pwmconf.pwm_autoscale = true; - pwmconf.pwm_grad = 5; - pwmconf.pwm_ampl = 180; - st.PWMCONF(pwmconf.sr); - - TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); - - st.GSTAT(); // Clear GSTAT - } -#endif // TMC5130 - -#if HAS_DRIVER(TMC5160) - template - void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { - st.begin(); - - CHOPCONF_t chopconf{0}; - chopconf.tbl = 1; - chopconf.toff = chopper_timing.toff; - chopconf.intpol = INTERPOLATE; - chopconf.hend = chopper_timing.hend + 3; - chopconf.hstrt = chopper_timing.hstrt - 1; - TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); - st.CHOPCONF(chopconf.sr); - - st.rms_current(mA, HOLD_MULTIPLIER); - st.microsteps(microsteps); - st.iholddelay(10); - st.TPOWERDOWN(128); // ~2s until driver lowers to hold current - - st.en_pwm_mode(stealth); - st.stored.stealthChop_enabled = stealth; - - TMC2160_n::PWMCONF_t pwmconf{0}; - pwmconf.pwm_lim = 12; - pwmconf.pwm_reg = 8; - pwmconf.pwm_autograd = true; - pwmconf.pwm_autoscale = true; - pwmconf.pwm_freq = 0b01; - pwmconf.pwm_grad = 14; - pwmconf.pwm_ofs = 36; - st.PWMCONF(pwmconf.sr); - - #if ENABLED(HYBRID_THRESHOLD) - st.set_pwm_thrs(hyb_thrs); - #else - UNUSED(hyb_thrs); - #endif - st.GSTAT(); // Clear GSTAT - } -#endif // TMC5160 - -void restore_trinamic_drivers() { - #if AXIS_IS_TMC(X) - stepperX.push(); - #endif - #if AXIS_IS_TMC(X2) - stepperX2.push(); - #endif - #if AXIS_IS_TMC(Y) - stepperY.push(); - #endif - #if AXIS_IS_TMC(Y2) - stepperY2.push(); - #endif - #if AXIS_IS_TMC(Z) - stepperZ.push(); - #endif - #if AXIS_IS_TMC(Z2) - stepperZ2.push(); - #endif - #if AXIS_IS_TMC(Z3) - stepperZ3.push(); - #endif - #if AXIS_IS_TMC(Z4) - stepperZ4.push(); - #endif - #if AXIS_IS_TMC(E0) - stepperE0.push(); - #endif - #if AXIS_IS_TMC(E1) - stepperE1.push(); - #endif - #if AXIS_IS_TMC(E2) - stepperE2.push(); - #endif - #if AXIS_IS_TMC(E3) - stepperE3.push(); - #endif - #if AXIS_IS_TMC(E4) - stepperE4.push(); - #endif - #if AXIS_IS_TMC(E5) - stepperE5.push(); - #endif - #if AXIS_IS_TMC(E6) - stepperE6.push(); - #endif - #if AXIS_IS_TMC(E7) - stepperE7.push(); - #endif -} - -void reset_trinamic_drivers() { - static constexpr bool stealthchop_by_axis[] = { ENABLED(STEALTHCHOP_XY), ENABLED(STEALTHCHOP_Z), ENABLED(STEALTHCHOP_E) }; - - #if AXIS_IS_TMC(X) - TMC_INIT(X, STEALTH_AXIS_XY); - #endif - #if AXIS_IS_TMC(X2) - TMC_INIT(X2, STEALTH_AXIS_XY); - #endif - #if AXIS_IS_TMC(Y) - TMC_INIT(Y, STEALTH_AXIS_XY); - #endif - #if AXIS_IS_TMC(Y2) - TMC_INIT(Y2, STEALTH_AXIS_XY); - #endif - #if AXIS_IS_TMC(Z) - TMC_INIT(Z, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_INIT(Z2, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z3) - TMC_INIT(Z3, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z4) - TMC_INIT(Z4, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(E0) - TMC_INIT(E0, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E1) - TMC_INIT(E1, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E2) - TMC_INIT(E2, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E3) - TMC_INIT(E3, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E4) - TMC_INIT(E4, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E5) - TMC_INIT(E5, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E6) - TMC_INIT(E6, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E7) - TMC_INIT(E7, STEALTH_AXIS_E); - #endif - - #if USE_SENSORLESS - #if X_SENSORLESS - stepperX.homing_threshold(X_STALL_SENSITIVITY); - #if AXIS_HAS_STALLGUARD(X2) - stepperX2.homing_threshold(CAT(TERN(X2_SENSORLESS, X2, X), _STALL_SENSITIVITY)); - #endif - #endif - #if Y_SENSORLESS - stepperY.homing_threshold(Y_STALL_SENSITIVITY); - #if AXIS_HAS_STALLGUARD(Y2) - stepperY2.homing_threshold(CAT(TERN(Y2_SENSORLESS, Y2, Y), _STALL_SENSITIVITY)); - #endif - #endif - #if Z_SENSORLESS - stepperZ.homing_threshold(Z_STALL_SENSITIVITY); - #if AXIS_HAS_STALLGUARD(Z2) - stepperZ2.homing_threshold(CAT(TERN(Z2_SENSORLESS, Z2, Z), _STALL_SENSITIVITY)); - #endif - #if AXIS_HAS_STALLGUARD(Z3) - stepperZ3.homing_threshold(CAT(TERN(Z3_SENSORLESS, Z3, Z), _STALL_SENSITIVITY)); - #endif - #if AXIS_HAS_STALLGUARD(Z4) - stepperZ4.homing_threshold(CAT(TERN(Z4_SENSORLESS, Z4, Z), _STALL_SENSITIVITY)); - #endif - #endif - #endif - - #ifdef TMC_ADV - TMC_ADV() - #endif - - stepper.set_directions(); -} - -// TMC Slave Address Conflict Detection -// -// Conflict detection is performed in the following way. Similar methods are used for -// hardware and software serial, but the implementations are indepenent. -// -// 1. Populate a data structure with UART parameters and addresses for all possible axis. -// If an axis is not in use, populate it with recognizable placeholder data. -// 2. For each axis in use, static_assert using a constexpr function, which counts the -// number of matching/conflicting axis. If the value is not exactly 1, fail. - -#if ANY_AXIS_HAS(HW_SERIAL) - // Hardware serial names are compared as strings, since actually resolving them cannot occur in a constexpr. - // Using a fixed-length character array for the port name allows this to be constexpr compatible. - struct SanityHwSerialDetails { const char port[20]; uint32_t address; }; - #define TMC_HW_DETAIL_ARGS(A) TERN(A##_HAS_HW_SERIAL, STRINGIFY(A##_HARDWARE_SERIAL), ""), TERN0(A##_HAS_HW_SERIAL, A##_SLAVE_ADDRESS) - #define TMC_HW_DETAIL(A) {TMC_HW_DETAIL_ARGS(A)} - constexpr SanityHwSerialDetails sanity_tmc_hw_details[] = { - TMC_HW_DETAIL(X), TMC_HW_DETAIL(X2), - TMC_HW_DETAIL(Y), TMC_HW_DETAIL(Y2), - TMC_HW_DETAIL(Z), TMC_HW_DETAIL(Z2), TMC_HW_DETAIL(Z3), TMC_HW_DETAIL(Z4), - TMC_HW_DETAIL(E0), TMC_HW_DETAIL(E1), TMC_HW_DETAIL(E2), TMC_HW_DETAIL(E3), TMC_HW_DETAIL(E4), TMC_HW_DETAIL(E5), TMC_HW_DETAIL(E6), TMC_HW_DETAIL(E7) - }; - - // constexpr compatible string comparison - constexpr bool str_eq_ce(const char * a, const char * b) { - return *a == *b && (*a == '\0' || str_eq_ce(a+1,b+1)); - } - - constexpr bool sc_hw_done(size_t start, size_t end) { return start == end; } - constexpr bool sc_hw_skip(const char* port_name) { return !(*port_name); } - constexpr bool sc_hw_match(const char* port_name, uint32_t address, size_t start, size_t end) { - return !sc_hw_done(start, end) && !sc_hw_skip(port_name) && (address == sanity_tmc_hw_details[start].address && str_eq_ce(port_name, sanity_tmc_hw_details[start].port)); - } - constexpr int count_tmc_hw_serial_matches(const char* port_name, uint32_t address, size_t start, size_t end) { - return sc_hw_done(start, end) ? 0 : ((sc_hw_skip(port_name) ? 0 : (sc_hw_match(port_name, address, start, end) ? 1 : 0)) + count_tmc_hw_serial_matches(port_name, address, start + 1, end)); - } - - #define TMC_HWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_HARDWARE_SERIAL" - #define SA_NO_TMC_HW_C(A) static_assert(1 >= count_tmc_hw_serial_matches(TMC_HW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_hw_details)), TMC_HWSERIAL_CONFLICT_MSG(A)); - SA_NO_TMC_HW_C(X);SA_NO_TMC_HW_C(X2); - SA_NO_TMC_HW_C(Y);SA_NO_TMC_HW_C(Y2); - SA_NO_TMC_HW_C(Z);SA_NO_TMC_HW_C(Z2);SA_NO_TMC_HW_C(Z3);SA_NO_TMC_HW_C(Z4); - SA_NO_TMC_HW_C(E0);SA_NO_TMC_HW_C(E1);SA_NO_TMC_HW_C(E2);SA_NO_TMC_HW_C(E3);SA_NO_TMC_HW_C(E4);SA_NO_TMC_HW_C(E5);SA_NO_TMC_HW_C(E6);SA_NO_TMC_HW_C(E7); -#endif - -#if ANY_AXIS_HAS(SW_SERIAL) - struct SanitySwSerialDetails { int32_t txpin; int32_t rxpin; uint32_t address; }; - #define TMC_SW_DETAIL_ARGS(A) TERN(A##_HAS_SW_SERIAL, A##_SERIAL_TX_PIN, -1), TERN(A##_HAS_SW_SERIAL, A##_SERIAL_RX_PIN, -1), TERN0(A##_HAS_SW_SERIAL, A##_SLAVE_ADDRESS) - #define TMC_SW_DETAIL(A) TMC_SW_DETAIL_ARGS(A) - constexpr SanitySwSerialDetails sanity_tmc_sw_details[] = { - TMC_SW_DETAIL(X), TMC_SW_DETAIL(X2), - TMC_SW_DETAIL(Y), TMC_SW_DETAIL(Y2), - TMC_SW_DETAIL(Z), TMC_SW_DETAIL(Z2), TMC_SW_DETAIL(Z3), TMC_SW_DETAIL(Z4), - TMC_SW_DETAIL(E0), TMC_SW_DETAIL(E1), TMC_SW_DETAIL(E2), TMC_SW_DETAIL(E3), TMC_SW_DETAIL(E4), TMC_SW_DETAIL(E5), TMC_SW_DETAIL(E6), TMC_SW_DETAIL(E7) - }; - - constexpr bool sc_sw_done(size_t start, size_t end) { return start == end; } - constexpr bool sc_sw_skip(int32_t txpin) { return txpin < 0; } - constexpr bool sc_sw_match(int32_t txpin, int32_t rxpin, uint32_t address, size_t start, size_t end) { - return !sc_sw_done(start, end) && !sc_sw_skip(txpin) && (txpin == sanity_tmc_sw_details[start].txpin || rxpin == sanity_tmc_sw_details[start].rxpin) && (address == sanity_tmc_sw_details[start].address); - } - constexpr int count_tmc_sw_serial_matches(int32_t txpin, int32_t rxpin, uint32_t address, size_t start, size_t end) { - return sc_sw_done(start, end) ? 0 : ((sc_sw_skip(txpin) ? 0 : (sc_sw_match(txpin, rxpin, address, start, end) ? 1 : 0)) + count_tmc_sw_serial_matches(txpin, rxpin, address, start + 1, end)); - } - - #define TMC_SWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_SERIAL_RX_PIN or " STRINGIFY(A) "_SERIAL_TX_PIN" - #define SA_NO_TMC_SW_C(A) static_assert(1 >= count_tmc_sw_serial_matches(TMC_SW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_sw_details)), TMC_SWSERIAL_CONFLICT_MSG(A)); - SA_NO_TMC_SW_C(X);SA_NO_TMC_SW_C(X2); - SA_NO_TMC_SW_C(Y);SA_NO_TMC_SW_C(Y2); - SA_NO_TMC_SW_C(Z);SA_NO_TMC_SW_C(Z2);SA_NO_TMC_SW_C(Z3);SA_NO_TMC_SW_C(Z4); - SA_NO_TMC_SW_C(E0);SA_NO_TMC_SW_C(E1);SA_NO_TMC_SW_C(E2);SA_NO_TMC_SW_C(E3);SA_NO_TMC_SW_C(E4);SA_NO_TMC_SW_C(E5);SA_NO_TMC_SW_C(E6);SA_NO_TMC_SW_C(E7); -#endif - -#endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h deleted file mode 100644 index 9cc3404cd2..0000000000 --- a/Marlin/src/module/stepper/trinamic.h +++ /dev/null @@ -1,296 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * stepper/trinamic.h - * Stepper driver indirection for Trinamic - */ - -#include -#if TMCSTEPPER_VERSION < 0x000500 - #error "Update TMCStepper library to 0.5.0 or newer." -#endif - -#include "../../inc/MarlinConfig.h" -#include "../../feature/tmc_util.h" - -#define CLASS_TMC2130 TMC2130Stepper -#define CLASS_TMC2160 TMC2160Stepper -#define CLASS_TMC2208 TMC2208Stepper -#define CLASS_TMC2209 TMC2209Stepper -#define CLASS_TMC2660 TMC2660Stepper -#define CLASS_TMC5130 TMC5130Stepper -#define CLASS_TMC5160 TMC5160Stepper - -#define TMC_X_LABEL 'X', '0' -#define TMC_Y_LABEL 'Y', '0' -#define TMC_Z_LABEL 'Z', '0' - -#define TMC_X2_LABEL 'X', '2' -#define TMC_Y2_LABEL 'Y', '2' -#define TMC_Z2_LABEL 'Z', '2' -#define TMC_Z3_LABEL 'Z', '3' -#define TMC_Z4_LABEL 'Z', '4' - -#define TMC_E0_LABEL 'E', '0' -#define TMC_E1_LABEL 'E', '1' -#define TMC_E2_LABEL 'E', '2' -#define TMC_E3_LABEL 'E', '3' -#define TMC_E4_LABEL 'E', '4' -#define TMC_E5_LABEL 'E', '5' -#define TMC_E6_LABEL 'E', '6' -#define TMC_E7_LABEL 'E', '7' - -#define __TMC_CLASS(TYPE, L, I, A) TMCMarlin -#define _TMC_CLASS(TYPE, LandI, A) __TMC_CLASS(TYPE, LandI, A) -#define TMC_CLASS(ST, A) _TMC_CLASS(ST##_DRIVER_TYPE, TMC_##ST##_LABEL, A##_AXIS) -#if ENABLED(DISTINCT_E_FACTORS) - #define TMC_CLASS_E(N) TMC_CLASS(E##N, E##N) -#else - #define TMC_CLASS_E(N) TMC_CLASS(E##N, E) -#endif - -typedef struct { - uint8_t toff; - int8_t hend; - uint8_t hstrt; -} chopper_timing_t; - -static constexpr chopper_timing_t chopper_timing = CHOPPER_TIMING; - -#if HAS_TMC220x - void tmc_serial_begin(); -#endif - -void restore_trinamic_drivers(); -void reset_trinamic_drivers(); - -#define AXIS_HAS_SQUARE_WAVE(A) (AXIS_IS_TMC(A) && ENABLED(SQUARE_WAVE_STEPPING)) - -// X Stepper -#if AXIS_IS_TMC(X) - extern TMC_CLASS(X, X) stepperX; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) - #define X_ENABLE_INIT() NOOP - #define X_ENABLE_WRITE(STATE) stepperX.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0) - #define X_ENABLE_READ() stepperX.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(X) - #define X_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(X_STEP_PIN); }while(0) - #endif -#endif - -// Y Stepper -#if AXIS_IS_TMC(Y) - extern TMC_CLASS(Y, Y) stepperY; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) - #define Y_ENABLE_INIT() NOOP - #define Y_ENABLE_WRITE(STATE) stepperY.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0) - #define Y_ENABLE_READ() stepperY.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(Y) - #define Y_STEP_WRITE(STATE) do{ if (STATE) TOGGLE(Y_STEP_PIN); }while(0) - #endif -#endif - -// Z Stepper -#if AXIS_IS_TMC(Z) - extern TMC_CLASS(Z, Z) stepperZ; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) - #define Z_ENABLE_INIT() NOOP - #define Z_ENABLE_WRITE(STATE) stepperZ.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) - #define Z_ENABLE_READ() stepperZ.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(Z) - #define Z_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z_STEP_PIN); }while(0) - #endif -#endif - -// X2 Stepper -#if HAS_X2_ENABLE && AXIS_IS_TMC(X2) - extern TMC_CLASS(X2, X) stepperX2; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) - #define X2_ENABLE_INIT() NOOP - #define X2_ENABLE_WRITE(STATE) stepperX2.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0) - #define X2_ENABLE_READ() stepperX2.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(X2) - #define X2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(X2_STEP_PIN); }while(0) - #endif -#endif - -// Y2 Stepper -#if HAS_Y2_ENABLE && AXIS_IS_TMC(Y2) - extern TMC_CLASS(Y2, Y) stepperY2; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) - #define Y2_ENABLE_INIT() NOOP - #define Y2_ENABLE_WRITE(STATE) stepperY2.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0) - #define Y2_ENABLE_READ() stepperY2.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(Y2) - #define Y2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Y2_STEP_PIN); }while(0) - #endif -#endif - -// Z2 Stepper -#if HAS_Z2_ENABLE && AXIS_IS_TMC(Z2) - extern TMC_CLASS(Z2, Z) stepperZ2; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2) - #define Z2_ENABLE_INIT() NOOP - #define Z2_ENABLE_WRITE(STATE) stepperZ2.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) - #define Z2_ENABLE_READ() stepperZ2.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(Z2) - #define Z2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z2_STEP_PIN); }while(0) - #endif -#endif - -// Z3 Stepper -#if HAS_Z3_ENABLE && AXIS_IS_TMC(Z3) - extern TMC_CLASS(Z3, Z) stepperZ3; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) - #define Z3_ENABLE_INIT() NOOP - #define Z3_ENABLE_WRITE(STATE) stepperZ3.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) - #define Z3_ENABLE_READ() stepperZ3.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(Z3) - #define Z3_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z3_STEP_PIN); }while(0) - #endif -#endif - -// Z4 Stepper -#if HAS_Z4_ENABLE && AXIS_IS_TMC(Z4) - extern TMC_CLASS(Z4, Z) stepperZ4; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) - #define Z4_ENABLE_INIT() NOOP - #define Z4_ENABLE_WRITE(STATE) stepperZ4.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) - #define Z4_ENABLE_READ() stepperZ4.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(Z4) - #define Z4_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z4_STEP_PIN); }while(0) - #endif -#endif - -// E0 Stepper -#if AXIS_IS_TMC(E0) - extern TMC_CLASS_E(0) stepperE0; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0) - #define E0_ENABLE_INIT() NOOP - #define E0_ENABLE_WRITE(STATE) stepperE0.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) - #define E0_ENABLE_READ() stepperE0.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(E0) - #define E0_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E0_STEP_PIN); }while(0) - #endif -#endif - -// E1 Stepper -#if AXIS_IS_TMC(E1) - extern TMC_CLASS_E(1) stepperE1; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1) - #define E1_ENABLE_INIT() NOOP - #define E1_ENABLE_WRITE(STATE) stepperE1.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) - #define E1_ENABLE_READ() stepperE1.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(E1) - #define E1_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E1_STEP_PIN); }while(0) - #endif -#endif - -// E2 Stepper -#if AXIS_IS_TMC(E2) - extern TMC_CLASS_E(2) stepperE2; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2) - #define E2_ENABLE_INIT() NOOP - #define E2_ENABLE_WRITE(STATE) stepperE2.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) - #define E2_ENABLE_READ() stepperE2.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(E2) - #define E2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E2_STEP_PIN); }while(0) - #endif -#endif - -// E3 Stepper -#if AXIS_IS_TMC(E3) - extern TMC_CLASS_E(3) stepperE3; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3) - #define E3_ENABLE_INIT() NOOP - #define E3_ENABLE_WRITE(STATE) stepperE3.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) - #define E3_ENABLE_READ() stepperE3.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(E3) - #define E3_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E3_STEP_PIN); }while(0) - #endif -#endif - -// E4 Stepper -#if AXIS_IS_TMC(E4) - extern TMC_CLASS_E(4) stepperE4; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4) - #define E4_ENABLE_INIT() NOOP - #define E4_ENABLE_WRITE(STATE) stepperE4.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) - #define E4_ENABLE_READ() stepperE4.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(E4) - #define E4_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E4_STEP_PIN); }while(0) - #endif -#endif - -// E5 Stepper -#if AXIS_IS_TMC(E5) - extern TMC_CLASS_E(5) stepperE5; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5) - #define E5_ENABLE_INIT() NOOP - #define E5_ENABLE_WRITE(STATE) stepperE5.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) - #define E5_ENABLE_READ() stepperE5.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(E5) - #define E5_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E5_STEP_PIN); }while(0) - #endif -#endif - -// E6 Stepper -#if AXIS_IS_TMC(E6) - extern TMC_CLASS_E(6) stepperE6; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E6) - #define E6_ENABLE_INIT() NOOP - #define E6_ENABLE_WRITE(STATE) stepperE6.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) - #define E6_ENABLE_READ() stepperE6.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(E6) - #define E6_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E6_STEP_PIN); }while(0) - #endif -#endif - -// E7 Stepper -#if AXIS_IS_TMC(E7) - extern TMC_CLASS_E(7) stepperE7; - #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E7) - #define E7_ENABLE_INIT() NOOP - #define E7_ENABLE_WRITE(STATE) stepperE7.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) - #define E7_ENABLE_READ() stepperE7.isEnabled() - #endif - #if AXIS_HAS_SQUARE_WAVE(E7) - #define E7_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E7_STEP_PIN); }while(0) - #endif -#endif diff --git a/Marlin/src/module/stepper_indirection.cpp b/Marlin/src/module/stepper_indirection.cpp new file mode 100644 index 0000000000..abd28eb65a --- /dev/null +++ b/Marlin/src/module/stepper_indirection.cpp @@ -0,0 +1,674 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * stepper_indirection.cpp + * + * Stepper motor driver indirection to allow some stepper functions to + * be done via SPI/I2c instead of direct pin manipulation. + * + * Part of Marlin + * + * Copyright (c) 2015 Dominik Wenger + */ + +#include "stepper_indirection.h" + +#include "../inc/MarlinConfig.h" + +// +// TMC26X Driver objects and inits +// +#if HAS_DRIVER(TMC26X) + #include + + #ifdef STM32F7 + #include "../HAL/HAL_STM32F7/TMC2660.h" + #else + #include + #endif + + #define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR) + + #if AXIS_DRIVER_TYPE(X, TMC26X) + _TMC26X_DEFINE(X); + #endif + #if AXIS_DRIVER_TYPE(X2, TMC26X) + _TMC26X_DEFINE(X2); + #endif + #if AXIS_DRIVER_TYPE(Y, TMC26X) + _TMC26X_DEFINE(Y); + #endif + #if AXIS_DRIVER_TYPE(Y2, TMC26X) + _TMC26X_DEFINE(Y2); + #endif + #if AXIS_DRIVER_TYPE(Z, TMC26X) + _TMC26X_DEFINE(Z); + #endif + #if AXIS_DRIVER_TYPE(Z2, TMC26X) + _TMC26X_DEFINE(Z2); + #endif + #if AXIS_DRIVER_TYPE(E0, TMC26X) + _TMC26X_DEFINE(E0); + #endif + #if AXIS_DRIVER_TYPE(E1, TMC26X) + _TMC26X_DEFINE(E1); + #endif + #if AXIS_DRIVER_TYPE(E2, TMC26X) + _TMC26X_DEFINE(E2); + #endif + #if AXIS_DRIVER_TYPE(E3, TMC26X) + _TMC26X_DEFINE(E3); + #endif + #if AXIS_DRIVER_TYPE(E4, TMC26X) + _TMC26X_DEFINE(E4); + #endif + + #define _TMC26X_INIT(A) do{ \ + stepper##A.setMicrosteps(A##_MICROSTEPS); \ + stepper##A.start(); \ + }while(0) + + void tmc26x_init_to_defaults() { + #if AXIS_DRIVER_TYPE(X, TMC26X) + _TMC26X_INIT(X); + #endif + #if AXIS_DRIVER_TYPE(X2, TMC26X) + _TMC26X_INIT(X2); + #endif + #if AXIS_DRIVER_TYPE(Y, TMC26X) + _TMC26X_INIT(Y); + #endif + #if AXIS_DRIVER_TYPE(Y2, TMC26X) + _TMC26X_INIT(Y2); + #endif + #if AXIS_DRIVER_TYPE(Z, TMC26X) + _TMC26X_INIT(Z); + #endif + #if AXIS_DRIVER_TYPE(Z2, TMC26X) + _TMC26X_INIT(Z2); + #endif + #if AXIS_DRIVER_TYPE(E0, TMC26X) + _TMC26X_INIT(E0); + #endif + #if AXIS_DRIVER_TYPE(E1, TMC26X) + _TMC26X_INIT(E1); + #endif + #if AXIS_DRIVER_TYPE(E2, TMC26X) + _TMC26X_INIT(E2); + #endif + #if AXIS_DRIVER_TYPE(E3, TMC26X) + _TMC26X_INIT(E3); + #endif + #if AXIS_DRIVER_TYPE(E4, TMC26X) + _TMC26X_INIT(E4); + #endif + } +#endif // TMC26X + +// +// TMC2130 Driver objects and inits +// +#if HAS_DRIVER(TMC2130) + + #include + #include + #include "planner.h" + #include "../core/enum.h" + + #if TMC2130STEPPER_VERSION < 0x020201 + #error "Update TMC2130Stepper library to 2.2.1 or newer." + #endif + + #if ENABLED(TMC_USE_SW_SPI) + #define _TMC2130_DEFINE(ST) TMC2130Stepper stepper##ST(ST##_ENABLE_PIN, ST##_DIR_PIN, ST##_STEP_PIN, ST##_CS_PIN, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK) + #else + #define _TMC2130_DEFINE(ST) TMC2130Stepper stepper##ST(ST##_ENABLE_PIN, ST##_DIR_PIN, ST##_STEP_PIN, ST##_CS_PIN) + #endif + + // Stepper objects of TMC2130 steppers used + #if AXIS_DRIVER_TYPE(X, TMC2130) + _TMC2130_DEFINE(X); + #endif + #if AXIS_DRIVER_TYPE(X2, TMC2130) + _TMC2130_DEFINE(X2); + #endif + #if AXIS_DRIVER_TYPE(Y, TMC2130) + _TMC2130_DEFINE(Y); + #endif + #if AXIS_DRIVER_TYPE(Y2, TMC2130) + _TMC2130_DEFINE(Y2); + #endif + #if AXIS_DRIVER_TYPE(Z, TMC2130) + _TMC2130_DEFINE(Z); + #endif + #if AXIS_DRIVER_TYPE(Z2, TMC2130) + _TMC2130_DEFINE(Z2); + #endif + #if AXIS_DRIVER_TYPE(E0, TMC2130) + _TMC2130_DEFINE(E0); + #endif + #if AXIS_DRIVER_TYPE(E1, TMC2130) + _TMC2130_DEFINE(E1); + #endif + #if AXIS_DRIVER_TYPE(E2, TMC2130) + _TMC2130_DEFINE(E2); + #endif + #if AXIS_DRIVER_TYPE(E3, TMC2130) + _TMC2130_DEFINE(E3); + #endif + #if AXIS_DRIVER_TYPE(E4, TMC2130) + _TMC2130_DEFINE(E4); + #endif + + // Use internal reference voltage for current calculations. This is the default. + // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609) + // https://www.trinamic.com/products/integrated-circuits/details/tmc2130/ + void tmc2130_init(TMC2130Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) { + #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD) + UNUSED(thrs); + UNUSED(spmm); + #endif + st.begin(); + st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER); + st.microsteps(microsteps); + st.blank_time(24); + st.off_time(5); // Only enables the driver if used with stealthChop + st.interpolate(INTERPOLATE); + st.power_down_delay(128); // ~2s until driver lowers to hold current + st.hysteresis_start(3); + st.hysteresis_end(2); + #if ENABLED(STEALTHCHOP) + st.stealth_freq(1); // f_pwm = 2/683 f_clk + st.stealth_autoscale(1); + st.stealth_gradient(5); + st.stealth_amplitude(255); + st.stealthChop(1); + #if ENABLED(HYBRID_THRESHOLD) + st.stealth_max_speed(12650000UL*microsteps/(256*thrs*spmm)); + #endif + #endif + st.GSTAT(); // Clear GSTAT + } + + #define _TMC2130_INIT(ST, SPMM) tmc2130_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM) + + void tmc2130_init_to_defaults() { + #if AXIS_DRIVER_TYPE(X, TMC2130) + _TMC2130_INIT( X, planner.axis_steps_per_mm[X_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(X2, TMC2130) + _TMC2130_INIT(X2, planner.axis_steps_per_mm[X_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(Y, TMC2130) + _TMC2130_INIT( Y, planner.axis_steps_per_mm[Y_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(Y2, TMC2130) + _TMC2130_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(Z, TMC2130) + _TMC2130_INIT( Z, planner.axis_steps_per_mm[Z_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(Z2, TMC2130) + _TMC2130_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(E0, TMC2130) + _TMC2130_INIT(E0, planner.axis_steps_per_mm[E_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(E1, TMC2130) + { constexpr int extruder = 1; _TMC2130_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); } + #endif + #if AXIS_DRIVER_TYPE(E2, TMC2130) + { constexpr int extruder = 2; _TMC2130_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); } + #endif + #if AXIS_DRIVER_TYPE(E3, TMC2130) + { constexpr int extruder = 3; _TMC2130_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); } + #endif + #if AXIS_DRIVER_TYPE(E4, TMC2130) + { constexpr int extruder = 4; _TMC2130_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); } + #endif + + #if ENABLED(SENSORLESS_HOMING) + #define TMC_INIT_SGT(P,Q) stepper##Q.sgt(P##_HOMING_SENSITIVITY); + #if X_SENSORLESS + #if AXIS_DRIVER_TYPE(X, TMC2130) + stepperX.sgt(X_HOMING_SENSITIVITY); + #endif + #if AXIS_DRIVER_TYPE(X2, TMC2130) + stepperX2.sgt(X_HOMING_SENSITIVITY); + #endif + #endif + #if Y_SENSORLESS + #if AXIS_DRIVER_TYPE(Y, TMC2130) + stepperY.sgt(Y_HOMING_SENSITIVITY); + #endif + #if AXIS_DRIVER_TYPE(Y2, TMC2130) + stepperY2.sgt(Y_HOMING_SENSITIVITY); + #endif + #endif + #if Z_SENSORLESS + #if AXIS_DRIVER_TYPE(Z, TMC2130) + stepperZ.sgt(Z_HOMING_SENSITIVITY); + #endif + #if AXIS_DRIVER_TYPE(Z2, TMC2130) + stepperZ2.sgt(Z_HOMING_SENSITIVITY); + #endif + #endif + #endif + } +#endif // TMC2130 + +// +// TMC2208 Driver objects and inits +// +#if HAS_DRIVER(TMC2208) + #include + #include + #include "planner.h" + + #if TMC2208STEPPER_VERSION < 0x000101 + #error "Update TMC2208Stepper library to 0.1.1 or newer." + #endif + + #define _TMC2208_DEFINE_HARDWARE(ST) TMC2208Stepper stepper##ST(&ST##_HARDWARE_SERIAL) + #define _TMC2208_DEFINE_SOFTWARE(ST) TMC2208Stepper stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, ST##_SERIAL_RX_PIN > -1) + + // Stepper objects of TMC2208 steppers used + #if AXIS_DRIVER_TYPE(X, TMC2208) + #ifdef X_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(X); + #else + _TMC2208_DEFINE_SOFTWARE(X); + #endif + #endif + #if AXIS_DRIVER_TYPE(X2, TMC2208) + #ifdef X2_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(X2); + #else + _TMC2208_DEFINE_SOFTWARE(X2); + #endif + #endif + #if AXIS_DRIVER_TYPE(Y, TMC2208) + #ifdef Y_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(Y); + #else + _TMC2208_DEFINE_SOFTWARE(Y); + #endif + #endif + #if AXIS_DRIVER_TYPE(Y2, TMC2208) + #ifdef Y2_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(Y2); + #else + _TMC2208_DEFINE_SOFTWARE(Y2); + #endif + #endif + #if AXIS_DRIVER_TYPE(Z, TMC2208) + #ifdef Z_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(Z); + #else + _TMC2208_DEFINE_SOFTWARE(Z); + #endif + #endif + #if AXIS_DRIVER_TYPE(Z2, TMC2208) + #ifdef Z2_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(Z2); + #else + _TMC2208_DEFINE_SOFTWARE(Z2); + #endif + #endif + #if AXIS_DRIVER_TYPE(E0, TMC2208) + #ifdef E0_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(E0); + #else + _TMC2208_DEFINE_SOFTWARE(E0); + #endif + #endif + #if AXIS_DRIVER_TYPE(E1, TMC2208) + #ifdef E1_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(E1); + #else + _TMC2208_DEFINE_SOFTWARE(E1); + #endif + #endif + #if AXIS_DRIVER_TYPE(E2, TMC2208) + #ifdef E2_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(E2); + #else + _TMC2208_DEFINE_SOFTWARE(E2); + #endif + #endif + #if AXIS_DRIVER_TYPE(E3, TMC2208) + #ifdef E3_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(E3); + #else + _TMC2208_DEFINE_SOFTWARE(E3); + #endif + #endif + #if AXIS_DRIVER_TYPE(E4, TMC2208) + #ifdef E4_HARDWARE_SERIAL + _TMC2208_DEFINE_HARDWARE(E4); + #else + _TMC2208_DEFINE_SOFTWARE(E4); + #endif + #endif + + void tmc2208_serial_begin() { + #if AXIS_DRIVER_TYPE(X, TMC2208) + #ifdef X_HARDWARE_SERIAL + X_HARDWARE_SERIAL.begin(115200); + #else + stepperX.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(X2, TMC2208) + #ifdef X2_HARDWARE_SERIAL + X2_HARDWARE_SERIAL.begin(115200); + #else + stepperX2.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(Y, TMC2208) + #ifdef Y_HARDWARE_SERIAL + Y_HARDWARE_SERIAL.begin(115200); + #else + stepperY.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(Y2, TMC2208) + #ifdef Y2_HARDWARE_SERIAL + Y2_HARDWARE_SERIAL.begin(115200); + #else + stepperY2.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(Z, TMC2208) + #ifdef Z_HARDWARE_SERIAL + Z_HARDWARE_SERIAL.begin(115200); + #else + stepperZ.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(Z2, TMC2208) + #ifdef Z2_HARDWARE_SERIAL + Z2_HARDWARE_SERIAL.begin(115200); + #else + stepperZ2.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(E0, TMC2208) + #ifdef E0_HARDWARE_SERIAL + E0_HARDWARE_SERIAL.begin(115200); + #else + stepperE0.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(E1, TMC2208) + #ifdef E1_HARDWARE_SERIAL + E1_HARDWARE_SERIAL.begin(115200); + #else + stepperE1.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(E2, TMC2208) + #ifdef E2_HARDWARE_SERIAL + E2_HARDWARE_SERIAL.begin(115200); + #else + stepperE2.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(E3, TMC2208) + #ifdef E3_HARDWARE_SERIAL + E3_HARDWARE_SERIAL.begin(115200); + #else + stepperE3.beginSerial(115200); + #endif + #endif + #if AXIS_DRIVER_TYPE(E4, TMC2208) + #ifdef E4_HARDWARE_SERIAL + E4_HARDWARE_SERIAL.begin(115200); + #else + stepperE4.beginSerial(115200); + #endif + #endif + } + + // Use internal reference voltage for current calculations. This is the default. + // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609) + void tmc2208_init(TMC2208Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) { + st.pdn_disable(true); // Use UART + st.mstep_reg_select(true); // Select microsteps with UART + st.I_scale_analog(false); + st.rms_current(mA, HOLD_MULTIPLIER, R_SENSE); + st.microsteps(microsteps); + st.blank_time(24); + st.toff(5); + st.intpol(INTERPOLATE); + st.TPOWERDOWN(128); // ~2s until driver lowers to hold current + st.hysteresis_start(3); + st.hysteresis_end(2); + #if ENABLED(STEALTHCHOP) + st.pwm_lim(12); + st.pwm_reg(8); + st.pwm_autograd(1); + st.pwm_autoscale(1); + st.pwm_freq(1); + st.pwm_grad(14); + st.pwm_ofs(36); + st.en_spreadCycle(false); + #if ENABLED(HYBRID_THRESHOLD) + st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm)); + #else + UNUSED(thrs); + UNUSED(spmm); + #endif + #else + st.en_spreadCycle(true); + #endif + st.GSTAT(0b111); // Clear + delay(200); + } + + #define _TMC2208_INIT(ST, SPMM) tmc2208_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM) + + void tmc2208_init_to_defaults() { + #if AXIS_DRIVER_TYPE(X, TMC2208) + _TMC2208_INIT(X, planner.axis_steps_per_mm[X_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(X2, TMC2208) + _TMC2208_INIT(X2, planner.axis_steps_per_mm[X_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(Y, TMC2208) + _TMC2208_INIT(Y, planner.axis_steps_per_mm[Y_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(Y2, TMC2208) + _TMC2208_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(Z, TMC2208) + _TMC2208_INIT(Z, planner.axis_steps_per_mm[Z_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(Z2, TMC2208) + _TMC2208_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(E0, TMC2208) + _TMC2208_INIT(E0, planner.axis_steps_per_mm[E_AXIS]); + #endif + #if AXIS_DRIVER_TYPE(E1, TMC2208) + { constexpr int extruder = 1; _TMC2208_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); } + #endif + #if AXIS_DRIVER_TYPE(E2, TMC2208) + { constexpr int extruder = 2; _TMC2208_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); } + #endif + #if AXIS_DRIVER_TYPE(E3, TMC2208) + { constexpr int extruder = 3; _TMC2208_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); } + #endif + #if AXIS_DRIVER_TYPE(E4, TMC2208) + { constexpr int extruder = 4; _TMC2208_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); } + #endif + } +#endif // TMC2208 + +void restore_stepper_drivers() { + #if AXIS_IS_TMC(X) + stepperX.push(); + #endif + #if AXIS_IS_TMC(X2) + stepperX2.push(); + #endif + #if AXIS_IS_TMC(Y) + stepperY.push(); + #endif + #if AXIS_IS_TMC(Y2) + stepperY2.push(); + #endif + #if AXIS_IS_TMC(Z) + stepperZ.push(); + #endif + #if AXIS_IS_TMC(Z2) + stepperZ2.push(); + #endif + #if AXIS_IS_TMC(E0) + stepperE0.push(); + #endif + #if AXIS_IS_TMC(E1) + stepperE1.push(); + #endif + #if AXIS_IS_TMC(E2) + stepperE2.push(); + #endif + #if AXIS_IS_TMC(E3) + stepperE3.push(); + #endif + #if AXIS_IS_TMC(E4) + stepperE4.push(); + #endif +} + +void reset_stepper_drivers() { + #if HAS_DRIVER(TMC26X) + tmc26x_init_to_defaults(); + #endif + #if HAS_DRIVER(TMC2130) + delay(100); + tmc2130_init_to_defaults(); + #endif + #if HAS_DRIVER(TMC2208) + delay(100); + tmc2208_init_to_defaults(); + #endif + #ifdef TMC_ADV + TMC_ADV() + #endif + #if HAS_DRIVER(L6470) + L6470_init_to_defaults(); + #endif +} + +// +// L6470 Driver objects and inits +// +#if HAS_DRIVER(L6470) + + #include + #include + + #define _L6470_DEFINE(ST) L6470 stepper##ST(ST##_ENABLE_PIN) + + // L6470 Stepper objects + #if AXIS_DRIVER_TYPE(X, L6470) + _L6470_DEFINE(X); + #endif + #if AXIS_DRIVER_TYPE(X2, L6470) + _L6470_DEFINE(X2); + #endif + #if AXIS_DRIVER_TYPE(Y, L6470) + _L6470_DEFINE(Y); + #endif + #if AXIS_DRIVER_TYPE(Y2, L6470) + _L6470_DEFINE(Y2); + #endif + #if AXIS_DRIVER_TYPE(Z, L6470) + _L6470_DEFINE(Z); + #endif + #if AXIS_DRIVER_TYPE(Z2, L6470) + _L6470_DEFINE(Z2); + #endif + #if AXIS_DRIVER_TYPE(E0, L6470) + _L6470_DEFINE(E0); + #endif + #if AXIS_DRIVER_TYPE(E1, L6470) + _L6470_DEFINE(E1); + #endif + #if AXIS_DRIVER_TYPE(E2, L6470) + _L6470_DEFINE(E2); + #endif + #if AXIS_DRIVER_TYPE(E3, L6470) + _L6470_DEFINE(E3); + #endif + #if AXIS_DRIVER_TYPE(E4, L6470) + _L6470_DEFINE(E4); + #endif + + #define _L6470_INIT(A) do{ \ + stepper##A.init(); \ + stepper##A.softFree(); \ + stepper##A.setMicroSteps(A##_MICROSTEPS); \ + stepper##A.setOverCurrent(A##_OVERCURRENT); \ + stepper##A.setStallCurrent(A##_STALLCURRENT); \ + }while(0) + + void L6470_init_to_defaults() { + #if AXIS_DRIVER_TYPE(X, L6470) + _L6470_INIT(X); + #endif + #if AXIS_DRIVER_TYPE(X2, L6470) + _L6470_INIT(X2); + #endif + #if AXIS_DRIVER_TYPE(Y, L6470) + _L6470_INIT(Y); + #endif + #if AXIS_DRIVER_TYPE(Y2, L6470) + _L6470_INIT(Y2); + #endif + #if AXIS_DRIVER_TYPE(Z, L6470) + _L6470_INIT(Z); + #endif + #if AXIS_DRIVER_TYPE(Z2, L6470) + _L6470_INIT(Z2); + #endif + #if AXIS_DRIVER_TYPE(E0, L6470) + _L6470_INIT(E0); + #endif + #if AXIS_DRIVER_TYPE(E1, L6470) + _L6470_INIT(E1); + #endif + #if AXIS_DRIVER_TYPE(E2, L6470) + _L6470_INIT(E2); + #endif + #if AXIS_DRIVER_TYPE(E3, L6470) + _L6470_INIT(E3); + #endif + #if AXIS_DRIVER_TYPE(E4, L6470) + _L6470_INIT(E4); + #endif + } + +#endif // L6470 diff --git a/Marlin/src/module/stepper_indirection.h b/Marlin/src/module/stepper_indirection.h new file mode 100644 index 0000000000..8ac4a0d8e9 --- /dev/null +++ b/Marlin/src/module/stepper_indirection.h @@ -0,0 +1,503 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * stepper_indirection.h - stepper motor driver indirection macros + * to allow some stepper functions to be done via SPI/I2c instead of direct pin manipulation + * Part of Marlin + * + * Copyright (c) 2015 Dominik Wenger + * + * Marlin is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * Marlin is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Marlin. If not, see . + */ + +#ifndef STEPPER_INDIRECTION_H +#define STEPPER_INDIRECTION_H + +#include "../inc/MarlinConfig.h" + +// TMC26X drivers have STEP/DIR on normal pins, but ENABLE via SPI +#if HAS_DRIVER(TMC26X) + #include + #ifdef STM32F7 + #include "../HAL/HAL_STM32F7/TMC2660.h" + #else + #include + #endif + void tmc26x_init_to_defaults(); +#endif + +#if HAS_DRIVER(TMC2130) + #include + void tmc2130_init_to_defaults(); +#endif + +#if HAS_DRIVER(TMC2208) + #include + void tmc2208_serial_begin(); + void tmc2208_init_to_defaults(); +#endif + +// L6470 has STEP on normal pins, but DIR/ENABLE via SPI +#if HAS_DRIVER(L6470) + #include + #include + void L6470_init_to_defaults(); +#endif + +void restore_stepper_drivers(); // Called by PSU_ON +void reset_stepper_drivers(); // Called by settings.load / settings.reset + +// X Stepper +#if AXIS_DRIVER_TYPE(X, L6470) + extern L6470 stepperX; + #define X_ENABLE_INIT NOOP + #define X_ENABLE_WRITE(STATE) do{ if (STATE) stepperX.Step_Clock(stepperX.getStatus() & STATUS_HIZ); else stepperX.softFree(); }while(0) + #define X_ENABLE_READ (stepperX.getStatus() & STATUS_HIZ) + #define X_DIR_INIT NOOP + #define X_DIR_WRITE(STATE) stepperX.Step_Clock(STATE) + #define X_DIR_READ (stepperX.getStatus() & STATUS_DIR) +#else + #if AXIS_DRIVER_TYPE(X, TMC26X) + extern TMC26XStepper stepperX; + #define X_ENABLE_INIT NOOP + #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE) + #define X_ENABLE_READ stepperX.isEnabled() + #else + #if AXIS_DRIVER_TYPE(X, TMC2130) + extern TMC2130Stepper stepperX; + #elif AXIS_DRIVER_TYPE(X, TMC2208) + extern TMC2208Stepper stepperX; + #endif + #define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN) + #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE) + #define X_ENABLE_READ READ(X_ENABLE_PIN) + #endif + #define X_DIR_INIT SET_OUTPUT(X_DIR_PIN) + #define X_DIR_WRITE(STATE) WRITE(X_DIR_PIN,STATE) + #define X_DIR_READ READ(X_DIR_PIN) +#endif +#define X_STEP_INIT SET_OUTPUT(X_STEP_PIN) +#define X_STEP_WRITE(STATE) WRITE(X_STEP_PIN,STATE) +#define X_STEP_READ READ(X_STEP_PIN) + +// Y Stepper +#if AXIS_DRIVER_TYPE(Y, L6470) + extern L6470 stepperY; + #define Y_ENABLE_INIT NOOP + #define Y_ENABLE_WRITE(STATE) do{ if (STATE) stepperY.Step_Clock(stepperY.getStatus() & STATUS_HIZ); else stepperY.softFree(); }while(0) + #define Y_ENABLE_READ (stepperY.getStatus() & STATUS_HIZ) + #define Y_DIR_INIT NOOP + #define Y_DIR_WRITE(STATE) stepperY.Step_Clock(STATE) + #define Y_DIR_READ (stepperY.getStatus() & STATUS_DIR) +#else + #if AXIS_DRIVER_TYPE(Y, TMC26X) + extern TMC26XStepper stepperY; + #define Y_ENABLE_INIT NOOP + #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE) + #define Y_ENABLE_READ stepperY.isEnabled() + #else + #if AXIS_DRIVER_TYPE(Y, TMC2130) + extern TMC2130Stepper stepperY; + #elif AXIS_DRIVER_TYPE(Y, TMC2208) + extern TMC2208Stepper stepperY; + #endif + #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN) + #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE) + #define Y_ENABLE_READ READ(Y_ENABLE_PIN) + #endif + #define Y_DIR_INIT SET_OUTPUT(Y_DIR_PIN) + #define Y_DIR_WRITE(STATE) WRITE(Y_DIR_PIN,STATE) + #define Y_DIR_READ READ(Y_DIR_PIN) +#endif +#define Y_STEP_INIT SET_OUTPUT(Y_STEP_PIN) +#define Y_STEP_WRITE(STATE) WRITE(Y_STEP_PIN,STATE) +#define Y_STEP_READ READ(Y_STEP_PIN) + +// Z Stepper +#if AXIS_DRIVER_TYPE(Z, L6470) + extern L6470 stepperZ; + #define Z_ENABLE_INIT NOOP + #define Z_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ.Step_Clock(stepperZ.getStatus() & STATUS_HIZ); else stepperZ.softFree(); }while(0) + #define Z_ENABLE_READ (stepperZ.getStatus() & STATUS_HIZ) + #define Z_DIR_INIT NOOP + #define Z_DIR_WRITE(STATE) stepperZ.Step_Clock(STATE) + #define Z_DIR_READ (stepperZ.getStatus() & STATUS_DIR) +#else + #if AXIS_DRIVER_TYPE(Z, TMC26X) + extern TMC26XStepper stepperZ; + #define Z_ENABLE_INIT NOOP + #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE) + #define Z_ENABLE_READ stepperZ.isEnabled() + #else + #if AXIS_DRIVER_TYPE(Z, TMC2130) + extern TMC2130Stepper stepperZ; + #elif AXIS_DRIVER_TYPE(Z, TMC2208) + extern TMC2208Stepper stepperZ; + #endif + #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN) + #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE) + #define Z_ENABLE_READ READ(Z_ENABLE_PIN) + #endif + #define Z_DIR_INIT SET_OUTPUT(Z_DIR_PIN) + #define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,STATE) + #define Z_DIR_READ READ(Z_DIR_PIN) +#endif +#define Z_STEP_INIT SET_OUTPUT(Z_STEP_PIN) +#define Z_STEP_WRITE(STATE) WRITE(Z_STEP_PIN,STATE) +#define Z_STEP_READ READ(Z_STEP_PIN) + +// X2 Stepper +#if HAS_X2_ENABLE + #if AXIS_DRIVER_TYPE(X2, L6470) + extern L6470 stepperX2; + #define X2_ENABLE_INIT NOOP + #define X2_ENABLE_WRITE(STATE) do{ if (STATE) stepperX2.Step_Clock(stepperX2.getStatus() & STATUS_HIZ); else stepperX2.softFree(); }while(0) + #define X2_ENABLE_READ (stepperX2.getStatus() & STATUS_HIZ) + #define X2_DIR_INIT NOOP + #define X2_DIR_WRITE(STATE) stepperX2.Step_Clock(STATE) + #define X2_DIR_READ (stepperX2.getStatus() & STATUS_DIR) + #else + #if AXIS_DRIVER_TYPE(X2, TMC26X) + extern TMC26XStepper stepperX2; + #define X2_ENABLE_INIT NOOP + #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE) + #define X2_ENABLE_READ stepperX2.isEnabled() + #else + #if AXIS_DRIVER_TYPE(X2, TMC2130) + extern TMC2130Stepper stepperX2; + #elif AXIS_DRIVER_TYPE(X2, TMC2208) + extern TMC2208Stepper stepperX2; + #endif + #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN) + #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE) + #define X2_ENABLE_READ READ(X2_ENABLE_PIN) + #endif + #define X2_DIR_INIT SET_OUTPUT(X2_DIR_PIN) + #define X2_DIR_WRITE(STATE) WRITE(X2_DIR_PIN,STATE) + #define X2_DIR_READ READ(X2_DIR_PIN) + #endif + #define X2_STEP_INIT SET_OUTPUT(X2_STEP_PIN) + #define X2_STEP_WRITE(STATE) WRITE(X2_STEP_PIN,STATE) + #define X2_STEP_READ READ(X2_STEP_PIN) +#endif + +// Y2 Stepper +#if HAS_Y2_ENABLE + #if AXIS_DRIVER_TYPE(Y2, L6470) + extern L6470 stepperY2; + #define Y2_ENABLE_INIT NOOP + #define Y2_ENABLE_WRITE(STATE) do{ if (STATE) stepperY2.Step_Clock(stepperY2.getStatus() & STATUS_HIZ); else stepperY2.softFree(); }while(0) + #define Y2_ENABLE_READ (stepperY2.getStatus() & STATUS_HIZ) + #define Y2_DIR_INIT NOOP + #define Y2_DIR_WRITE(STATE) stepperY2.Step_Clock(STATE) + #define Y2_DIR_READ (stepperY2.getStatus() & STATUS_DIR) + #else + #if AXIS_DRIVER_TYPE(Y2, TMC26X) + extern TMC26XStepper stepperY2; + #define Y2_ENABLE_INIT NOOP + #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE) + #define Y2_ENABLE_READ stepperY2.isEnabled() + #else + #if AXIS_DRIVER_TYPE(Y2, TMC2130) + extern TMC2130Stepper stepperY2; + #elif AXIS_DRIVER_TYPE(Y2, TMC2208) + extern TMC2208Stepper stepperY2; + #endif + #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN) + #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE) + #define Y2_ENABLE_READ READ(Y2_ENABLE_PIN) + #endif + #define Y2_DIR_INIT SET_OUTPUT(Y2_DIR_PIN) + #define Y2_DIR_WRITE(STATE) WRITE(Y2_DIR_PIN,STATE) + #define Y2_DIR_READ READ(Y2_DIR_PIN) + #endif + #define Y2_STEP_INIT SET_OUTPUT(Y2_STEP_PIN) + #define Y2_STEP_WRITE(STATE) WRITE(Y2_STEP_PIN,STATE) + #define Y2_STEP_READ READ(Y2_STEP_PIN) +#endif + +// Z2 Stepper +#if HAS_Z2_ENABLE + #if AXIS_DRIVER_TYPE(Z2, L6470) + extern L6470 stepperZ2; + #define Z2_ENABLE_INIT NOOP + #define Z2_ENABLE_WRITE(STATE) do{ if (STATE) stepperZ2.Step_Clock(stepperZ2.getStatus() & STATUS_HIZ); else stepperZ2.softFree(); }while(0) + #define Z2_ENABLE_READ (stepperZ2.getStatus() & STATUS_HIZ) + #define Z2_DIR_INIT NOOP + #define Z2_DIR_WRITE(STATE) stepperZ2.Step_Clock(STATE) + #define Z2_DIR_READ (stepperZ2.getStatus() & STATUS_DIR) + #else + #if AXIS_DRIVER_TYPE(Z2, TMC26X) + extern TMC26XStepper stepperZ2; + #define Z2_ENABLE_INIT NOOP + #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE) + #define Z2_ENABLE_READ stepperZ2.isEnabled() + #else + #if AXIS_DRIVER_TYPE(Z2, TMC2130) + extern TMC2130Stepper stepperZ2; + #elif AXIS_DRIVER_TYPE(Z2, TMC2208) + extern TMC2208Stepper stepperZ2; + #endif + #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN) + #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE) + #define Z2_ENABLE_READ READ(Z2_ENABLE_PIN) + #endif + #define Z2_DIR_INIT SET_OUTPUT(Z2_DIR_PIN) + #define Z2_DIR_WRITE(STATE) WRITE(Z2_DIR_PIN,STATE) + #define Z2_DIR_READ READ(Z2_DIR_PIN) + #endif + #define Z2_STEP_INIT SET_OUTPUT(Z2_STEP_PIN) + #define Z2_STEP_WRITE(STATE) WRITE(Z2_STEP_PIN,STATE) + #define Z2_STEP_READ READ(Z2_STEP_PIN) +#endif + +// E0 Stepper +#if AXIS_DRIVER_TYPE(E0, L6470) + extern L6470 stepperE0; + #define E0_ENABLE_INIT NOOP + #define E0_ENABLE_WRITE(STATE) do{ if (STATE) stepperE0.Step_Clock(stepperE0.getStatus() & STATUS_HIZ); else stepperE0.softFree(); }while(0) + #define E0_ENABLE_READ (stepperE0.getStatus() & STATUS_HIZ) + #define E0_DIR_INIT NOOP + #define E0_DIR_WRITE(STATE) stepperE0.Step_Clock(STATE) + #define E0_DIR_READ (stepperE0.getStatus() & STATUS_DIR) +#else + #if AXIS_DRIVER_TYPE(E0, TMC26X) + extern TMC26XStepper stepperE0; + #define E0_ENABLE_INIT NOOP + #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE) + #define E0_ENABLE_READ stepperE0.isEnabled() + #else + #if AXIS_DRIVER_TYPE(E0, TMC2130) + extern TMC2130Stepper stepperE0; + #elif AXIS_DRIVER_TYPE(E0, TMC2208) + extern TMC2208Stepper stepperE0; + #endif + #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN) + #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) + #define E0_ENABLE_READ READ(E0_ENABLE_PIN) + #endif + #define E0_DIR_INIT SET_OUTPUT(E0_DIR_PIN) + #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,STATE) + #define E0_DIR_READ READ(E0_DIR_PIN) +#endif +#define E0_STEP_INIT SET_OUTPUT(E0_STEP_PIN) +#define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE) +#define E0_STEP_READ READ(E0_STEP_PIN) + +// E1 Stepper +#if AXIS_DRIVER_TYPE(E1, L6470) + extern L6470 stepperE1; + #define E1_ENABLE_INIT NOOP + #define E1_ENABLE_WRITE(STATE) do{ if (STATE) stepperE1.Step_Clock(stepperE1.getStatus() & STATUS_HIZ); else stepperE1.softFree(); }while(0) + #define E1_ENABLE_READ (stepperE1.getStatus() & STATUS_HIZ) + #define E1_DIR_INIT NOOP + #define E1_DIR_WRITE(STATE) stepperE1.Step_Clock(STATE) + #define E1_DIR_READ (stepperE1.getStatus() & STATUS_DIR) +#else + #if AXIS_DRIVER_TYPE(E1, TMC26X) + extern TMC26XStepper stepperE1; + #define E1_ENABLE_INIT NOOP + #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE) + #define E1_ENABLE_READ stepperE1.isEnabled() + #else + #if AXIS_DRIVER_TYPE(E1, TMC2130) + extern TMC2130Stepper stepperE1; + #elif AXIS_DRIVER_TYPE(E1, TMC2208) + extern TMC2208Stepper stepperE1; + #endif + #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN) + #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) + #define E1_ENABLE_READ READ(E1_ENABLE_PIN) + #endif + #define E1_DIR_INIT SET_OUTPUT(E1_DIR_PIN) + #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,STATE) + #define E1_DIR_READ READ(E1_DIR_PIN) +#endif +#define E1_STEP_INIT SET_OUTPUT(E1_STEP_PIN) +#define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE) +#define E1_STEP_READ READ(E1_STEP_PIN) + +// E2 Stepper +#if AXIS_DRIVER_TYPE(E2, L6470) + extern L6470 stepperE2; + #define E2_ENABLE_INIT NOOP + #define E2_ENABLE_WRITE(STATE) do{ if (STATE) stepperE2.Step_Clock(stepperE2.getStatus() & STATUS_HIZ); else stepperE2.softFree(); }while(0) + #define E2_ENABLE_READ (stepperE2.getStatus() & STATUS_HIZ) + #define E2_DIR_INIT NOOP + #define E2_DIR_WRITE(STATE) stepperE2.Step_Clock(STATE) + #define E2_DIR_READ (stepperE2.getStatus() & STATUS_DIR) +#else + #if AXIS_DRIVER_TYPE(E2, TMC26X) + extern TMC26XStepper stepperE2; + #define E2_ENABLE_INIT NOOP + #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE) + #define E2_ENABLE_READ stepperE2.isEnabled() + #else + #if AXIS_DRIVER_TYPE(E2, TMC2130) + extern TMC2130Stepper stepperE2; + #elif AXIS_DRIVER_TYPE(E2, TMC2208) + extern TMC2208Stepper stepperE2; + #endif + #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN) + #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) + #define E2_ENABLE_READ READ(E2_ENABLE_PIN) + #endif + #define E2_DIR_INIT SET_OUTPUT(E2_DIR_PIN) + #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,STATE) + #define E2_DIR_READ READ(E2_DIR_PIN) +#endif +#define E2_STEP_INIT SET_OUTPUT(E2_STEP_PIN) +#define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE) +#define E2_STEP_READ READ(E2_STEP_PIN) + +// E3 Stepper +#if AXIS_DRIVER_TYPE(E3, L6470) + extern L6470 stepperE3; + #define E3_ENABLE_INIT NOOP + #define E3_ENABLE_WRITE(STATE) do{ if (STATE) stepperE3.Step_Clock(stepperE3.getStatus() & STATUS_HIZ); else stepperE3.softFree(); }while(0) + #define E3_ENABLE_READ (stepperE3.getStatus() & STATUS_HIZ) + #define E3_DIR_INIT NOOP + #define E3_DIR_WRITE(STATE) stepperE3.Step_Clock(STATE) + #define E3_DIR_READ (stepperE3.getStatus() & STATUS_DIR) +#else + #if AXIS_DRIVER_TYPE(E3, TMC26X) + extern TMC26XStepper stepperE3; + #define E3_ENABLE_INIT NOOP + #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE) + #define E3_ENABLE_READ stepperE3.isEnabled() + #else + #if AXIS_DRIVER_TYPE(E3, TMC2130) + extern TMC2130Stepper stepperE3; + #elif AXIS_DRIVER_TYPE(E3, TMC2208) + extern TMC2208Stepper stepperE3; + #endif + #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN) + #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) + #define E3_ENABLE_READ READ(E3_ENABLE_PIN) + #endif + #define E3_DIR_INIT SET_OUTPUT(E3_DIR_PIN) + #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,STATE) + #define E3_DIR_READ READ(E3_DIR_PIN) +#endif +#define E3_STEP_INIT SET_OUTPUT(E3_STEP_PIN) +#define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE) +#define E3_STEP_READ READ(E3_STEP_PIN) + +// E4 Stepper +#if AXIS_DRIVER_TYPE(E4, L6470) + extern L6470 stepperE4; + #define E4_ENABLE_INIT NOOP + #define E4_ENABLE_WRITE(STATE) do{ if (STATE) stepperE4.Step_Clock(stepperE4.getStatus() & STATUS_HIZ); else stepperE4.softFree(); }while(0) + #define E4_ENABLE_READ (stepperE4.getStatus() & STATUS_HIZ) + #define E4_DIR_INIT NOOP + #define E4_DIR_WRITE(STATE) stepperE4.Step_Clock(STATE) + #define E4_DIR_READ (stepperE4.getStatus() & STATUS_DIR) +#else + #if AXIS_DRIVER_TYPE(E4, TMC26X) + extern TMC26XStepper stepperE4; + #define E4_ENABLE_INIT NOOP + #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE) + #define E4_ENABLE_READ stepperE4.isEnabled() + #else + #if AXIS_DRIVER_TYPE(E4, TMC2130) + extern TMC2130Stepper stepperE4; + #elif AXIS_DRIVER_TYPE(E4, TMC2208) + extern TMC2208Stepper stepperE4; + #endif + #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN) + #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) + #define E4_ENABLE_READ READ(E4_ENABLE_PIN) + #endif + #define E4_DIR_INIT SET_OUTPUT(E4_DIR_PIN) + #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,STATE) + #define E4_DIR_READ READ(E4_DIR_PIN) +#endif +#define E4_STEP_INIT SET_OUTPUT(E4_STEP_PIN) +#define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) +#define E4_STEP_READ READ(E4_STEP_PIN) + +/** + * Extruder indirection for the single E axis + */ +#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index + #if EXTRUDERS > 4 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0) + #elif EXTRUDERS > 3 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + #elif EXTRUDERS > 2 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) + #else + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) do{ E0_DIR_WRITE(E ? INVERT_E0_DIR : !INVERT_E0_DIR); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR : INVERT_E0_DIR); }while(0) + #endif +#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0) +#elif E_STEPPERS > 4 + #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; case 4: E4_DIR_WRITE( INVERT_E4_DIR); } }while(0) +#elif E_STEPPERS > 3 + #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); } }while(0) +#elif E_STEPPERS > 2 + #define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) + #define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0) +#elif E_STEPPERS > 1 + #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE) + #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { E0_STEP_WRITE(V); E1_STEP_WRITE(V); } else if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) + #else + #define E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + #define REV_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) + #endif +#else + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR) + #define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR) +#endif + +#endif // STEPPER_INDIRECTION_H diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 9ecbb7c766..1c4d101e99 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,281 +24,137 @@ * temperature.cpp - temperature control */ -// Useful when debugging thermocouples -//#define IGNORE_THERMOCOUPLE_ERRORS - #include "temperature.h" #include "endstops.h" -#include "../MarlinCore.h" +#include "../Marlin.h" +#include "../lcd/ultralcd.h" #include "planner.h" +#include "../core/language.h" #include "../HAL/shared/Delay.h" -#include "../lcd/ultralcd.h" - -#if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/e3v2/dwin.h" -#endif - -#if ENABLED(EXTENSIBLE_UI) - #include "../lcd/extui/ui_api.h" -#endif - -#if ENABLED(MAX6675_IS_MAX31865) - #include - #ifndef MAX31865_CS_PIN - #define MAX31865_CS_PIN MAX6675_SS_PIN // HW:49 SW:65 for example - #endif - #ifndef MAX31865_MOSI_PIN - #define MAX31865_MOSI_PIN MOSI_PIN // 63 - #endif - #ifndef MAX31865_MISO_PIN - #define MAX31865_MISO_PIN MAX6675_DO_PIN // 42 - #endif - #ifndef MAX31865_SCK_PIN - #define MAX31865_SCK_PIN MAX6675_SCK_PIN // 40 - #endif - Adafruit_MAX31865 max31865 = Adafruit_MAX31865(MAX31865_CS_PIN - #if MAX31865_CS_PIN != MAX6675_SS_PIN - , MAX31865_MOSI_PIN // For software SPI also set MOSI/MISO/SCK - , MAX31865_MISO_PIN - , MAX31865_SCK_PIN - #endif - ); -#endif - -#define MAX6675_SEPARATE_SPI (EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) && PINS_EXIST(MAX6675_SCK, MAX6675_DO)) - -#if MAX6675_SEPARATE_SPI +#if ENABLED(HEATER_0_USES_MAX6675) #include "../libs/private_spi.h" #endif -#if ENABLED(PID_EXTRUSION_SCALING) +#if ENABLED(BABYSTEPPING) || ENABLED(PID_EXTRUSION_SCALING) #include "stepper.h" #endif -#if ENABLED(BABYSTEPPING) && DISABLED(INTEGRATED_BABYSTEPPING) - #include "../feature/babystep.h" -#endif - #include "printcounter.h" #if ENABLED(FILAMENT_WIDTH_SENSOR) #include "../feature/filwidth.h" #endif -#if HAS_POWER_MONITOR - #include "../feature/power_monitor.h" -#endif - #if ENABLED(EMERGENCY_PARSER) - #include "../feature/e_parser.h" + #include "../feature/emergency_parser.h" #endif -#if ENABLED(PRINTER_EVENT_LEDS) - #include "../feature/leds/printer_event_leds.h" -#endif - -#if ENABLED(JOYSTICK) - #include "../feature/joystick.h" -#endif - -#if ENABLED(SINGLENOZZLE) - #include "tool_change.h" -#endif - -#if USE_BEEPER - #include "../libs/buzzer.h" -#endif - -#if HAS_SERVOS - #include "./servo.h" -#endif #if HOTEND_USES_THERMISTOR #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - static const temp_entry_t* heater_ttbl_map[2] = { HEATER_0_TEMPTABLE, HEATER_1_TEMPTABLE }; + static void* heater_ttbl_map[2] = { (void*)HEATER_0_TEMPTABLE, (void*)HEATER_1_TEMPTABLE }; static constexpr uint8_t heater_ttbllen_map[2] = { HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN }; #else - #define NEXT_TEMPTABLE(N) ,HEATER_##N##_TEMPTABLE - #define NEXT_TEMPTABLE_LEN(N) ,HEATER_##N##_TEMPTABLE_LEN - static const temp_entry_t* heater_ttbl_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE REPEAT_S(1, HOTENDS, NEXT_TEMPTABLE)); - static constexpr uint8_t heater_ttbllen_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE_LEN REPEAT_S(1, HOTENDS, NEXT_TEMPTABLE_LEN)); + static void* heater_ttbl_map[HOTENDS] = ARRAY_BY_HOTENDS((void*)HEATER_0_TEMPTABLE, (void*)HEATER_1_TEMPTABLE, (void*)HEATER_2_TEMPTABLE, (void*)HEATER_3_TEMPTABLE, (void*)HEATER_4_TEMPTABLE); + static constexpr uint8_t heater_ttbllen_map[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN, HEATER_2_TEMPTABLE_LEN, HEATER_3_TEMPTABLE_LEN, HEATER_4_TEMPTABLE_LEN); #endif #endif Temperature thermalManager; -const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, - str_t_heating_failed[] PROGMEM = STR_T_HEATING_FAILED; - /** * Macros to include the heater id in temp errors. The compiler's dead-code * elimination should (hopefully) optimize out the unused strings. */ - #if HAS_HEATED_BED - #define _BED_PSTR(h) (h) == H_BED ? GET_TEXT(MSG_BED) : + #define TEMP_ERR_PSTR(MSG, E) \ + (E) == -1 ? PSTR(MSG ## _BED) : \ + (HOTENDS > 1 && (E) == 1) ? PSTR(MSG_E2 " " MSG) : \ + (HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \ + (HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \ + (HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \ + PSTR(MSG_E1 " " MSG) #else - #define _BED_PSTR(h) + #define TEMP_ERR_PSTR(MSG, E) \ + (HOTENDS > 1 && (E) == 1) ? PSTR(MSG_E2 " " MSG) : \ + (HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \ + (HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \ + (HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \ + PSTR(MSG_E1 " " MSG) #endif -#if HAS_HEATED_CHAMBER - #define _CHAMBER_PSTR(h) (h) == H_CHAMBER ? GET_TEXT(MSG_CHAMBER) : -#else - #define _CHAMBER_PSTR(h) -#endif -#define _E_PSTR(h,N) ((HOTENDS) > N && (h) == N) ? PSTR(LCD_STR_E##N) : -#define HEATER_PSTR(h) _BED_PSTR(h) _CHAMBER_PSTR(h) _E_PSTR(h,1) _E_PSTR(h,2) _E_PSTR(h,3) _E_PSTR(h,4) _E_PSTR(h,5) PSTR(LCD_STR_E0) // public: -#if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) - bool Temperature::adaptive_fan_slowing = true; -#endif - -#if HAS_HOTEND - hotend_info_t Temperature::temp_hotend[HOTEND_TEMPS]; // = { 0 } - const uint16_t Temperature::heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); -#endif +float Temperature::current_temperature[HOTENDS] = { 0.0 }; +int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 }, + Temperature::target_temperature[HOTENDS] = { 0 }; #if ENABLED(AUTO_POWER_E_FANS) - uint8_t Temperature::autofan_speed[HOTENDS]; // = { 0 } -#endif - -#if ENABLED(AUTO_POWER_CHAMBER_FAN) - uint8_t Temperature::chamberfan_speed; // = 0 -#endif - -#if HAS_FAN - - uint8_t Temperature::fan_speed[FAN_COUNT]; // = { 0 } - - #if ENABLED(EXTRA_FAN_SPEED) - uint8_t Temperature::old_fan_speed[FAN_COUNT], Temperature::new_fan_speed[FAN_COUNT]; - - void Temperature::set_temp_fan_speed(const uint8_t fan, const uint16_t tmp_temp) { - switch (tmp_temp) { - case 1: - set_fan_speed(fan, old_fan_speed[fan]); - break; - case 2: - old_fan_speed[fan] = fan_speed[fan]; - set_fan_speed(fan, new_fan_speed[fan]); - break; - default: - new_fan_speed[fan] = _MIN(tmp_temp, 255U); - break; - } - } - - #endif - - #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) - bool Temperature::fans_paused; // = false; - uint8_t Temperature::saved_fan_speed[FAN_COUNT]; // = { 0 } - #endif - - #if ENABLED(ADAPTIVE_FAN_SLOWING) - uint8_t Temperature::fan_speed_scaler[FAN_COUNT] = ARRAY_N(FAN_COUNT, 128, 128, 128, 128, 128, 128, 128, 128); - #endif - - /** - * Set the print fan speed for a target extruder - */ - void Temperature::set_fan_speed(uint8_t target, uint16_t speed) { - - NOMORE(speed, 255U); - - #if ENABLED(SINGLENOZZLE_STANDBY_FAN) - if (target != active_extruder) { - if (target < EXTRUDERS) singlenozzle_fan_speed[target] = speed; - return; - } - #endif - - TERN_(SINGLENOZZLE, target = 0); // Always use fan index 0 with SINGLENOZZLE - - if (target >= FAN_COUNT) return; - - fan_speed[target] = speed; - - TERN_(REPORT_FAN_CHANGE, report_fan_speed(target)); - } - - #if ENABLED(REPORT_FAN_CHANGE) - /** - * Report print fan speed for a target extruder - */ - void Temperature::report_fan_speed(const uint8_t target) { - if (target >= FAN_COUNT) return; - PORT_REDIRECT(SERIAL_BOTH); - SERIAL_ECHOLNPAIR("M106 P", target, " S", fan_speed[target]); - } - #endif - - #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) - - void Temperature::set_fans_paused(const bool p) { - if (p != fans_paused) { - fans_paused = p; - if (p) - FANS_LOOP(i) { saved_fan_speed[i] = fan_speed[i]; fan_speed[i] = 0; } - else - FANS_LOOP(i) fan_speed[i] = saved_fan_speed[i]; - } - } - - #endif - -#endif // HAS_FAN - -#if WATCH_HOTENDS - hotend_watch_t Temperature::watch_hotend[HOTENDS]; // = { { 0 } } -#endif -#if HEATER_IDLE_HANDLER - Temperature::heater_idle_t Temperature::heater_idle[NR_HEATER_IDLE]; // = { { 0 } } + int16_t Temperature::autofan_speed[HOTENDS] = { 0 }; #endif #if HAS_HEATED_BED - bed_info_t Temperature::temp_bed; // = { 0 } - // Init min and max temp with extreme values to prevent false errors during startup + float Temperature::current_temperature_bed = 0.0; + int16_t Temperature::current_temperature_bed_raw = 0, + Temperature::target_temperature_bed = 0; + uint8_t Temperature::soft_pwm_amount_bed; #ifdef BED_MINTEMP - int16_t Temperature::mintemp_raw_BED = HEATER_BED_RAW_LO_TEMP; + int16_t Temperature::bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP; #endif #ifdef BED_MAXTEMP - int16_t Temperature::maxtemp_raw_BED = HEATER_BED_RAW_HI_TEMP; + int16_t Temperature::bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP; + #endif + #if WATCH_THE_BED + uint16_t Temperature::watch_target_bed_temp = 0; + millis_t Temperature::watch_bed_next_ms = 0; + #endif + #if ENABLED(PIDTEMPBED) + float Temperature::bedKp, Temperature::bedKi, Temperature::bedKd, // Initialized by settings.load() + Temperature::temp_iState_bed = { 0 }, + Temperature::temp_dState_bed = { 0 }, + Temperature::pTerm_bed, + Temperature::iTerm_bed, + Temperature::dTerm_bed, + Temperature::pid_error_bed; + #else + millis_t Temperature::next_bed_check_ms; + #endif + uint16_t Temperature::raw_temp_bed_value = 0; + #if HEATER_IDLE_HANDLER + millis_t Temperature::bed_idle_timeout_ms = 0; + bool Temperature::bed_idle_timeout_exceeded = false; #endif - TERN_(WATCH_BED, bed_watch_t Temperature::watch_bed); // = { 0 } - TERN(PIDTEMPBED,, millis_t Temperature::next_bed_check_ms); #endif // HAS_HEATED_BED #if HAS_TEMP_CHAMBER - chamber_info_t Temperature::temp_chamber; // = { 0 } - #if HAS_HEATED_CHAMBER - int16_t fan_chamber_pwm; - bool flag_chamber_off; - bool flag_chamber_excess_heat = false; - millis_t next_cool_check_ms_2 = 0; - float old_temp = 9999; - #ifdef CHAMBER_MINTEMP - int16_t Temperature::mintemp_raw_CHAMBER = HEATER_CHAMBER_RAW_LO_TEMP; - #endif - #ifdef CHAMBER_MAXTEMP - int16_t Temperature::maxtemp_raw_CHAMBER = HEATER_CHAMBER_RAW_HI_TEMP; - #endif - #if WATCH_CHAMBER - chamber_watch_t Temperature::watch_chamber{0}; - #endif - millis_t Temperature::next_chamber_check_ms; - #endif // HAS_HEATED_CHAMBER -#endif // HAS_TEMP_CHAMBER - -#if HAS_TEMP_PROBE - probe_info_t Temperature::temp_probe; // = { 0 } + float Temperature::current_temperature_chamber = 0.0; + int16_t Temperature::current_temperature_chamber_raw = 0; + uint16_t Temperature::raw_temp_chamber_value = 0; #endif // Initialized by settings.load() #if ENABLED(PIDTEMP) - //hotend_pid_t Temperature::pid[HOTENDS]; + #if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1 + float Temperature::Kp[HOTENDS], Temperature::Ki[HOTENDS], Temperature::Kd[HOTENDS]; + #if ENABLED(PID_EXTRUSION_SCALING) + float Temperature::Kc[HOTENDS]; + #endif + #else + float Temperature::Kp, Temperature::Ki, Temperature::Kd; + #if ENABLED(PID_EXTRUSION_SCALING) + float Temperature::Kc; + #endif + #endif +#endif + +#if ENABLED(BABYSTEPPING) + volatile int Temperature::babystepsTodo[XYZ] = { 0 }; +#endif + +#if WATCH_HOTENDS + uint16_t Temperature::watch_target_temp[HOTENDS] = { 0 }; + millis_t Temperature::watch_heater_next_ms[HOTENDS] = { 0 }; #endif #if ENABLED(PREVENT_COLD_EXTRUSION) @@ -317,28 +173,33 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, float Temperature::redundant_temperature = 0.0; #endif -volatile bool Temperature::raw_temps_ready = false; +volatile bool Temperature::temp_meas_ready = false; -#if ENABLED(PID_EXTRUSION_SCALING) - int32_t Temperature::last_e_position, Temperature::lpq[LPQ_MAX_LEN]; - lpq_ptr_t Temperature::lpq_ptr = 0; +#if ENABLED(PIDTEMP) + float Temperature::temp_iState[HOTENDS] = { 0 }, + Temperature::temp_dState[HOTENDS] = { 0 }, + Temperature::pTerm[HOTENDS], + Temperature::iTerm[HOTENDS], + Temperature::dTerm[HOTENDS]; + + #if ENABLED(PID_EXTRUSION_SCALING) + float Temperature::cTerm[HOTENDS]; + long Temperature::last_e_position; + long Temperature::lpq[LPQ_MAX_LEN]; + int Temperature::lpq_ptr = 0; + #endif + + float Temperature::pid_error[HOTENDS]; + bool Temperature::pid_reset[HOTENDS]; #endif -#define TEMPDIR(N) ((HEATER_##N##_RAW_LO_TEMP) < (HEATER_##N##_RAW_HI_TEMP) ? 1 : -1) +uint16_t Temperature::raw_temp_value[MAX_EXTRUDERS] = { 0 }; -#if HAS_HOTEND - // Init mintemp and maxtemp with extreme values to prevent false errors during startup - constexpr temp_range_t sensor_heater_0 { HEATER_0_RAW_LO_TEMP, HEATER_0_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_1 { HEATER_1_RAW_LO_TEMP, HEATER_1_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_2 { HEATER_2_RAW_LO_TEMP, HEATER_2_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_3 { HEATER_3_RAW_LO_TEMP, HEATER_3_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_4 { HEATER_4_RAW_LO_TEMP, HEATER_4_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_5 { HEATER_5_RAW_LO_TEMP, HEATER_5_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_6 { HEATER_6_RAW_LO_TEMP, HEATER_6_RAW_HI_TEMP, 0, 16383 }, - sensor_heater_7 { HEATER_7_RAW_LO_TEMP, HEATER_7_RAW_HI_TEMP, 0, 16383 }; - - temp_range_t Temperature::temp_range[HOTENDS] = ARRAY_BY_HOTENDS(sensor_heater_0, sensor_heater_1, sensor_heater_2, sensor_heater_3, sensor_heater_4, sensor_heater_5, sensor_heater_6, sensor_heater_7); -#endif +// Init min and max temp with extreme values to prevent false errors during startup +int16_t Temperature::minttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP, HEATER_3_RAW_LO_TEMP, HEATER_4_RAW_LO_TEMP), + Temperature::maxttemp_raw[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_RAW_HI_TEMP , HEATER_1_RAW_HI_TEMP , HEATER_2_RAW_HI_TEMP, HEATER_3_RAW_HI_TEMP, HEATER_4_RAW_HI_TEMP), + Temperature::minttemp[HOTENDS] = { 0 }, + Temperature::maxttemp[HOTENDS] = ARRAY_BY_HOTENDS1(16383); #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED uint8_t Temperature::consecutive_low_temperature_error[HOTENDS] = { 0 }; @@ -348,44 +209,53 @@ volatile bool Temperature::raw_temps_ready = false; millis_t Temperature::preheat_end_time[HOTENDS] = { 0 }; #endif +#if ENABLED(FILAMENT_WIDTH_SENSOR) + int8_t Temperature::meas_shift_index; // Index of a delayed sample in buffer +#endif + #if HAS_AUTO_FAN millis_t Temperature::next_auto_fan_check_ms = 0; #endif +uint8_t Temperature::soft_pwm_amount[HOTENDS]; + #if ENABLED(FAN_SOFT_PWM) uint8_t Temperature::soft_pwm_amount_fan[FAN_COUNT], Temperature::soft_pwm_count_fan[FAN_COUNT]; #endif +#if ENABLED(FILAMENT_WIDTH_SENSOR) + uint16_t Temperature::current_raw_filwidth = 0; // Measured filament diameter - one extruder only +#endif + #if ENABLED(PROBING_HEATERS_OFF) bool Temperature::paused; #endif -// public: +#if HEATER_IDLE_HANDLER + millis_t Temperature::heater_idle_timeout_ms[HOTENDS] = { 0 }; + bool Temperature::heater_idle_timeout_exceeded[HOTENDS] = { false }; +#endif -#if HAS_ADC_BUTTONS - uint32_t Temperature::current_ADCKey_raw = HAL_ADC_RANGE; - uint16_t Temperature::ADCKey_count = 0; +#if ENABLED(ADC_KEYPAD) + uint32_t Temperature::current_ADCKey_raw = 0; + uint8_t Temperature::ADCKey_count = 0; #endif #if ENABLED(PID_EXTRUSION_SCALING) - int16_t Temperature::lpq_len; // Initialized in settings.cpp + int16_t Temperature::lpq_len; // Initialized in configuration_store #endif #if HAS_PID_HEATING - inline void say_default_() { SERIAL_ECHOPGM("#define DEFAULT_"); } - /** * PID Autotuning (M303) * * Alternately heat and cool the nozzle, observing its behavior to * determine the best PID values to achieve a stable temperature. - * Needs sufficient heater power to make some overshoot at target - * temperature to succeed. */ - void Temperature::PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { - float current_temp = 0.0; + void Temperature::PID_autotune(const float &target, const int8_t hotend, const int8_t ncycles, const bool set_result/*=false*/) { + float current = 0.0; int cycles = 0; bool heating = true; @@ -393,84 +263,78 @@ volatile bool Temperature::raw_temps_ready = false; long t_high = 0, t_low = 0; long bias, d; - PID_t tune_pid = { 0, 0, 0 }; - float maxT = 0, minT = 10000; - - const bool isbed = (heater_id == H_BED); + float Ku, Tu, + workKp = 0, workKi = 0, workKd = 0, + max = 0, min = 10000; #if HAS_PID_FOR_BOTH - #define GHV(B,H) (isbed ? (B) : (H)) - #define SHV(B,H) do{ if (isbed) temp_bed.soft_pwm_amount = B; else temp_hotend[heater_id].soft_pwm_amount = H; }while(0) - #define ONHEATINGSTART() (isbed ? printerEventLEDs.onBedHeatingStart() : printerEventLEDs.onHotendHeatingStart()) - #define ONHEATING(S,C,T) (isbed ? printerEventLEDs.onBedHeating(S,C,T) : printerEventLEDs.onHotendHeating(S,C,T)) + #define GHV(B,H) (hotend < 0 ? (B) : (H)) + #define SHV(S,B,H) if (hotend < 0) S##_bed = B; else S [hotend] = H; #elif ENABLED(PIDTEMPBED) #define GHV(B,H) B - #define SHV(B,H) (temp_bed.soft_pwm_amount = B) - #define ONHEATINGSTART() printerEventLEDs.onBedHeatingStart() - #define ONHEATING(S,C,T) printerEventLEDs.onBedHeating(S,C,T) + #define SHV(S,B,H) (S##_bed = B) #else #define GHV(B,H) H - #define SHV(B,H) (temp_hotend[heater_id].soft_pwm_amount = H) - #define ONHEATINGSTART() printerEventLEDs.onHotendHeatingStart() - #define ONHEATING(S,C,T) printerEventLEDs.onHotendHeating(S,C,T) + #define SHV(S,B,H) (S [hotend] = H) #endif - #define WATCH_PID BOTH(WATCH_BED, PIDTEMPBED) || BOTH(WATCH_HOTENDS, PIDTEMP) - #if WATCH_PID - #if ALL(THERMAL_PROTECTION_HOTENDS, PIDTEMP, THERMAL_PROTECTION_BED, PIDTEMPBED) - #define GTV(B,H) (isbed ? (B) : (H)) - #elif BOTH(THERMAL_PROTECTION_HOTENDS, PIDTEMP) - #define GTV(B,H) (H) - #else + #if WATCH_THE_BED || WATCH_HOTENDS + #define HAS_TP_BED (ENABLED(THERMAL_PROTECTION_BED) && ENABLED(PIDTEMPBED)) + #if HAS_TP_BED && ENABLED(THERMAL_PROTECTION_HOTENDS) && ENABLED(PIDTEMP) + #define GTV(B,H) (hotend < 0 ? (B) : (H)) + #elif HAS_TP_BED #define GTV(B,H) (B) + #else + #define GTV(B,H) (H) #endif const uint16_t watch_temp_period = GTV(WATCH_BED_TEMP_PERIOD, WATCH_TEMP_PERIOD); const uint8_t watch_temp_increase = GTV(WATCH_BED_TEMP_INCREASE, WATCH_TEMP_INCREASE); const float watch_temp_target = target - float(watch_temp_increase + GTV(TEMP_BED_HYSTERESIS, TEMP_HYSTERESIS) + 1); - millis_t temp_change_ms = next_temp_ms + SEC_TO_MS(watch_temp_period); + millis_t temp_change_ms = next_temp_ms + watch_temp_period * 1000UL; float next_watch_temp = 0.0; bool heated = false; #endif - TERN_(HAS_AUTO_FAN, next_auto_fan_check_ms = next_temp_ms + 2500UL); + #if HAS_AUTO_FAN + next_auto_fan_check_ms = next_temp_ms + 2500UL; + #endif - if (target > GHV(BED_MAX_TARGET, temp_range[heater_id].maxtemp - HOTEND_OVERSHOOT)) { - SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); + #if ENABLED(PIDTEMP) + #define _TOP_HOTEND HOTENDS - 1 + #else + #define _TOP_HOTEND -1 + #endif + #if ENABLED(PIDTEMPBED) + #define _BOT_HOTEND -1 + #else + #define _BOT_HOTEND 0 + #endif + + if (!WITHIN(hotend, _BOT_HOTEND, _TOP_HOTEND)) { + SERIAL_ECHOLNPGM(MSG_PID_BAD_EXTRUDER_NUM); return; } - SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_START); + SERIAL_ECHOLNPGM(MSG_PID_AUTOTUNE_START); - disable_all_heaters(); - TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); + disable_all_heaters(); // switch off all heaters. - SHV(bias = d = (MAX_BED_POWER) >> 1, bias = d = (PID_MAX) >> 1); + SHV(soft_pwm_amount, bias = d = (MAX_BED_POWER) >> 1, bias = d = (PID_MAX) >> 1); - #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); - LEDColor color = ONHEATINGSTART(); - #endif - - TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = false); + wait_for_heatup = true; // Can be interrupted with M108 // PID Tuning loop - wait_for_heatup = true; // Can be interrupted with M108 while (wait_for_heatup) { const millis_t ms = millis(); - if (raw_temps_ready) { // temp sample ready + if (temp_meas_ready) { // temp sample ready updateTemperaturesFromRawValues(); // Get the current temperature and constrain it - current_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); - NOLESS(maxT, current_temp); - NOMORE(minT, current_temp); - - #if ENABLED(PRINTER_EVENT_LEDS) - ONHEATING(start_temp, current_temp, target); - #endif + current = GHV(current_temperature_bed, current_temperature[hotend]); + NOLESS(max, current); + NOMORE(min, current); #if HAS_AUTO_FAN if (ELAPSED(ms, next_auto_fan_check_ms)) { @@ -479,17 +343,17 @@ volatile bool Temperature::raw_temps_ready = false; } #endif - if (heating && current_temp > target) { + if (heating && current > target) { if (ELAPSED(ms, t2 + 5000UL)) { heating = false; - SHV((bias - d) >> 1, (bias - d) >> 1); + SHV(soft_pwm_amount, (bias - d) >> 1, (bias - d) >> 1); t1 = ms; t_high = t1 - t2; - maxT = target; + max = target; } } - if (!heating && current_temp < target) { + if (!heating && current < target) { if (ELAPSED(ms, t1 + 5000UL)) { heating = true; t2 = ms; @@ -497,84 +361,89 @@ volatile bool Temperature::raw_temps_ready = false; if (cycles > 0) { const long max_pow = GHV(MAX_BED_POWER, PID_MAX); bias += (d * (t_high - t_low)) / (t_low + t_high); - LIMIT(bias, 20, max_pow - 20); + bias = constrain(bias, 20, max_pow - 20); d = (bias > max_pow >> 1) ? max_pow - 1 - bias : bias; - SERIAL_ECHOPAIR(STR_BIAS, bias, STR_D_COLON, d, STR_T_MIN, minT, STR_T_MAX, maxT); + SERIAL_PROTOCOLPAIR(MSG_BIAS, bias); + SERIAL_PROTOCOLPAIR(MSG_D, d); + SERIAL_PROTOCOLPAIR(MSG_T_MIN, min); + SERIAL_PROTOCOLPAIR(MSG_T_MAX, max); if (cycles > 2) { - const float Ku = (4.0f * d) / (float(M_PI) * (maxT - minT) * 0.5f), - Tu = float(t_low + t_high) * 0.001f, - pf = isbed ? 0.2f : 0.6f, - df = isbed ? 1.0f / 3.0f : 1.0f / 8.0f; - - SERIAL_ECHOPAIR(STR_KU, Ku, STR_TU, Tu); - if (isbed) { // Do not remove this otherwise PID autotune won't work right for the bed! - tune_pid.Kp = Ku * 0.2f; - tune_pid.Ki = 2 * tune_pid.Kp / Tu; - tune_pid.Kd = tune_pid.Kp * Tu / 3; - SERIAL_ECHOLNPGM("\n" " No overshoot"); // Works far better for the bed. Classic and some have bad ringing. - SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); - } - else { - tune_pid.Kp = Ku * pf; - tune_pid.Kd = tune_pid.Kp * Tu * df; - tune_pid.Ki = 2 * tune_pid.Kp / Tu; - SERIAL_ECHOLNPGM("\n" STR_CLASSIC_PID); - SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); - } - + Ku = (4.0f * d) / (float(M_PI) * (max - min) * 0.5f); + Tu = ((float)(t_low + t_high) * 0.001f); + SERIAL_PROTOCOLPAIR(MSG_KU, Ku); + SERIAL_PROTOCOLPAIR(MSG_TU, Tu); + workKp = 0.6f * Ku; + workKi = 2 * workKp / Tu; + workKd = workKp * Tu * 0.125f; + SERIAL_PROTOCOLLNPGM("\n" MSG_CLASSIC_PID); + SERIAL_PROTOCOLPAIR(MSG_KP, workKp); + SERIAL_PROTOCOLPAIR(MSG_KI, workKi); + SERIAL_PROTOCOLLNPAIR(MSG_KD, workKd); /** - tune_pid.Kp = 0.33 * Ku; - tune_pid.Ki = tune_pid.Kp / Tu; - tune_pid.Kd = tune_pid.Kp * Tu / 3; - SERIAL_ECHOLNPGM(" Some overshoot"); - SERIAL_ECHOLNPAIR(" Kp: ", tune_pid.Kp, " Ki: ", tune_pid.Ki, " Kd: ", tune_pid.Kd, " No overshoot"); - tune_pid.Kp = 0.2 * Ku; - tune_pid.Ki = 2 * tune_pid.Kp / Tu; - tune_pid.Kd = tune_pid.Kp * Tu / 3; - SERIAL_ECHOPAIR(" Kp: ", tune_pid.Kp, " Ki: ", tune_pid.Ki, " Kd: ", tune_pid.Kd); + workKp = 0.33*Ku; + workKi = workKp/Tu; + workKd = workKp*Tu/3; + SERIAL_PROTOCOLLNPGM(" Some overshoot"); + SERIAL_PROTOCOLPAIR(" Kp: ", workKp); + SERIAL_PROTOCOLPAIR(" Ki: ", workKi); + SERIAL_PROTOCOLPAIR(" Kd: ", workKd); + workKp = 0.2*Ku; + workKi = 2*workKp/Tu; + workKd = workKp*Tu/3; + SERIAL_PROTOCOLLNPGM(" No overshoot"); + SERIAL_PROTOCOLPAIR(" Kp: ", workKp); + SERIAL_PROTOCOLPAIR(" Ki: ", workKi); + SERIAL_PROTOCOLPAIR(" Kd: ", workKd); */ } } - SHV((bias + d) >> 1, (bias + d) >> 1); + SHV(soft_pwm_amount, (bias + d) >> 1, (bias + d) >> 1); cycles++; - minT = target; + min = target; } } } // Did the temperature overshoot very far? #ifndef MAX_OVERSHOOT_PID_AUTOTUNE - #define MAX_OVERSHOOT_PID_AUTOTUNE 30 + #define MAX_OVERSHOOT_PID_AUTOTUNE 20 #endif - if (current_temp > target + MAX_OVERSHOOT_PID_AUTOTUNE) { - SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); + if (current > target + MAX_OVERSHOOT_PID_AUTOTUNE) { + SERIAL_PROTOCOLLNPGM(MSG_PID_TEMP_TOO_HIGH); break; } // Report heater states every 2 seconds if (ELAPSED(ms, next_temp_ms)) { #if HAS_TEMP_SENSOR - print_heater_states(isbed ? active_extruder : heater_id); + print_heaterstates(); SERIAL_EOL(); #endif next_temp_ms = ms + 2000UL; // Make sure heating is actually working - #if WATCH_PID - if (BOTH(WATCH_BED, WATCH_HOTENDS) || isbed == DISABLED(WATCH_HOTENDS)) { - if (!heated) { // If not yet reached target... - if (current_temp > next_watch_temp) { // Over the watch temp? - next_watch_temp = current_temp + watch_temp_increase; // - set the next temp to watch for - temp_change_ms = ms + SEC_TO_MS(watch_temp_period); // - move the expiration timer up - if (current_temp > watch_temp_target) heated = true; // - Flag if target temperature reached + #if WATCH_THE_BED || WATCH_HOTENDS + if ( + #if WATCH_THE_BED && WATCH_HOTENDS + true + #elif WATCH_HOTENDS + hotend >= 0 + #else + hotend < 0 + #endif + ) { + if (!heated) { // If not yet reached target... + if (current > next_watch_temp) { // Over the watch temp? + next_watch_temp = current + watch_temp_increase; // - set the next temp to watch for + temp_change_ms = ms + watch_temp_period * 1000UL; // - move the expiration timer up + if (current > watch_temp_target) heated = true; // - Flag if target temperature reached } - else if (ELAPSED(ms, temp_change_ms)) // Watch timer expired - _temp_error(heater_id, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); + else if (ELAPSED(ms, temp_change_ms)) // Watch timer expired + _temp_error(hotend, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, hotend)); } - else if (current_temp < target - (MAX_OVERSHOOT_PID_AUTOTUNE)) // Heated, then temperature fell too far? - _temp_error(heater_id, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); + else if (current < target - (MAX_OVERSHOOT_PID_AUTOTUNE)) // Heated, then temperature fell too far? + _temp_error(hotend, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, hotend)); } #endif } // every 2 seconds @@ -583,78 +452,59 @@ volatile bool Temperature::raw_temps_ready = false; #ifndef MAX_CYCLE_TIME_PID_AUTOTUNE #define MAX_CYCLE_TIME_PID_AUTOTUNE 20L #endif - if ((ms - _MIN(t1, t2)) > (MAX_CYCLE_TIME_PID_AUTOTUNE * 60L * 1000L)) { - TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TUNING_TIMEOUT)); - SERIAL_ECHOLNPGM(STR_PID_TIMEOUT); + if (((ms - t1) + (ms - t2)) > (MAX_CYCLE_TIME_PID_AUTOTUNE * 60L * 1000L)) { + SERIAL_PROTOCOLLNPGM(MSG_PID_TIMEOUT); break; } - if (cycles > ncycles && cycles > 2) { - SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_FINISHED); + if (cycles > ncycles) { + SERIAL_PROTOCOLLNPGM(MSG_PID_AUTOTUNE_FINISHED); #if HAS_PID_FOR_BOTH - const char * const estring = GHV(PSTR("bed"), NUL_STR); - say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); - say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); - say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); + const char* estring = GHV("bed", ""); + SERIAL_PROTOCOLPAIR("#define DEFAULT_", estring); SERIAL_PROTOCOLPAIR("Kp ", workKp); SERIAL_EOL(); + SERIAL_PROTOCOLPAIR("#define DEFAULT_", estring); SERIAL_PROTOCOLPAIR("Ki ", workKi); SERIAL_EOL(); + SERIAL_PROTOCOLPAIR("#define DEFAULT_", estring); SERIAL_PROTOCOLPAIR("Kd ", workKd); SERIAL_EOL(); #elif ENABLED(PIDTEMP) - say_default_(); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); - say_default_(); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); - say_default_(); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); + SERIAL_PROTOCOLPAIR("#define DEFAULT_Kp ", workKp); SERIAL_EOL(); + SERIAL_PROTOCOLPAIR("#define DEFAULT_Ki ", workKi); SERIAL_EOL(); + SERIAL_PROTOCOLPAIR("#define DEFAULT_Kd ", workKd); SERIAL_EOL(); #else - say_default_(); SERIAL_ECHOLNPAIR("bedKp ", tune_pid.Kp); - say_default_(); SERIAL_ECHOLNPAIR("bedKi ", tune_pid.Ki); - say_default_(); SERIAL_ECHOLNPAIR("bedKd ", tune_pid.Kd); + SERIAL_PROTOCOLPAIR("#define DEFAULT_bedKp ", workKp); SERIAL_EOL(); + SERIAL_PROTOCOLPAIR("#define DEFAULT_bedKi ", workKi); SERIAL_EOL(); + SERIAL_PROTOCOLPAIR("#define DEFAULT_bedKd ", workKd); SERIAL_EOL(); #endif #define _SET_BED_PID() do { \ - temp_bed.pid.Kp = tune_pid.Kp; \ - temp_bed.pid.Ki = scalePID_i(tune_pid.Ki); \ - temp_bed.pid.Kd = scalePID_d(tune_pid.Kd); \ + bedKp = workKp; \ + bedKi = scalePID_i(workKi); \ + bedKd = scalePID_d(workKd); \ }while(0) #define _SET_EXTRUDER_PID() do { \ - PID_PARAM(Kp, heater_id) = tune_pid.Kp; \ - PID_PARAM(Ki, heater_id) = scalePID_i(tune_pid.Ki); \ - PID_PARAM(Kd, heater_id) = scalePID_d(tune_pid.Kd); \ + PID_PARAM(Kp, hotend) = workKp; \ + PID_PARAM(Ki, hotend) = scalePID_i(workKi); \ + PID_PARAM(Kd, hotend) = scalePID_d(workKd); \ updatePID(); }while(0) // Use the result? (As with "M303 U1") if (set_result) { #if HAS_PID_FOR_BOTH - if (isbed) _SET_BED_PID(); else _SET_EXTRUDER_PID(); + if (hotend < 0) + _SET_BED_PID(); + else + _SET_EXTRUDER_PID(); #elif ENABLED(PIDTEMP) _SET_EXTRUDER_PID(); #else _SET_BED_PID(); #endif } - - TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPidTuningDone(color)); - - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_DONE)); - - goto EXIT_M303; + return; } - - // Run HAL idle tasks - TERN_(HAL_IDLETASK, HAL_idletask()); - - // Run UI update - TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); + lcd_update(); } - wait_for_heatup = false; - disable_all_heaters(); - - TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPidTuningDone(color)); - - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_DONE)); - - EXIT_M303: - TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = true); - return; } #endif // HAS_PID_HEATING @@ -663,104 +513,60 @@ volatile bool Temperature::raw_temps_ready = false; * Class and Instance Methods */ -int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { - switch (heater_id) { - #if HAS_HEATED_BED - case H_BED: return temp_bed.soft_pwm_amount; - #endif - #if HAS_HEATED_CHAMBER - case H_CHAMBER: return temp_chamber.soft_pwm_amount; - #endif - default: - return TERN0(HAS_HOTEND, temp_hotend[heater_id].soft_pwm_amount); - } -} +Temperature::Temperature() { } -#define _EFANOVERLAP(A,B) _FANOVERLAP(E##A,B) +int Temperature::getHeaterPower(const int heater) { + return ( + #if HAS_HEATED_BED + heater < 0 ? soft_pwm_amount_bed : + #endif + soft_pwm_amount[heater] + ); +} #if HAS_AUTO_FAN - #define CHAMBER_FAN_INDEX HOTENDS - void Temperature::checkExtruderAutoFans() { - #define _EFAN(B,A) _EFANOVERLAP(A,B) ? B : + static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN }; static const uint8_t fanBit[] PROGMEM = { - 0 - #if HAS_MULTI_HOTEND - #define _NEXT_FAN(N) , REPEAT2(N,_EFAN,N) N - RREPEAT_S(1, HOTENDS, _NEXT_FAN) - #endif - #if HAS_AUTO_CHAMBER_FAN - #define _CFAN(B) _FANOVERLAP(CHAMBER,B) ? B : - , REPEAT(HOTENDS,_CFAN) (HOTENDS) - #endif + 0, + AUTO_1_IS_0 ? 0 : 1, + AUTO_2_IS_0 ? 0 : AUTO_2_IS_1 ? 1 : 2, + AUTO_3_IS_0 ? 0 : AUTO_3_IS_1 ? 1 : AUTO_3_IS_2 ? 2 : 3, + AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4, + AUTO_CHAMBER_IS_0 ? 0 : AUTO_CHAMBER_IS_1 ? 1 : AUTO_CHAMBER_IS_2 ? 2 : AUTO_CHAMBER_IS_3 ? 3 : AUTO_CHAMBER_IS_4 ? 4 : 5 }; - uint8_t fanState = 0; + HOTEND_LOOP() - if (temp_hotend[e].celsius >= EXTRUDER_AUTO_FAN_TEMPERATURE) + if (current_temperature[e] > EXTRUDER_AUTO_FAN_TEMPERATURE) SBI(fanState, pgm_read_byte(&fanBit[e])); - #if HAS_AUTO_CHAMBER_FAN - if (temp_chamber.celsius >= CHAMBER_AUTO_FAN_TEMPERATURE) - SBI(fanState, pgm_read_byte(&fanBit[CHAMBER_FAN_INDEX])); + #if HAS_TEMP_CHAMBER + if (current_temperature_chamber > EXTRUDER_AUTO_FAN_TEMPERATURE) + SBI(fanState, pgm_read_byte(&fanBit[5])); #endif - #define _UPDATE_AUTO_FAN(P,D,A) do{ \ - if (PWM_PIN(P##_AUTO_FAN_PIN) && A < 255) \ - analogWrite(pin_t(P##_AUTO_FAN_PIN), D ? A : 0); \ - else \ - WRITE(P##_AUTO_FAN_PIN, D); \ - }while(0) - uint8_t fanDone = 0; - LOOP_L_N(f, COUNT(fanBit)) { - const uint8_t realFan = pgm_read_byte(&fanBit[f]); - if (TEST(fanDone, realFan)) continue; - const bool fan_on = TEST(fanState, realFan); - switch (f) { - #if ENABLED(AUTO_POWER_CHAMBER_FAN) - case CHAMBER_FAN_INDEX: - chamberfan_speed = fan_on ? CHAMBER_AUTO_FAN_SPEED : 0; - break; + for (uint8_t f = 0; f < COUNT(fanPin); f++) { + const pin_t pin = + #ifdef ARDUINO + pgm_read_byte(&fanPin[f]) + #else + fanPin[f] #endif - default: - #if ENABLED(AUTO_POWER_E_FANS) - autofan_speed[realFan] = fan_on ? EXTRUDER_AUTO_FAN_SPEED : 0; - #endif - break; + ; + const uint8_t bit = pgm_read_byte(&fanBit[f]); + if (pin >= 0 && !TEST(fanDone, bit)) { + uint8_t newFanSpeed = TEST(fanState, bit) ? EXTRUDER_AUTO_FAN_SPEED : 0; + #if ENABLED(AUTO_POWER_E_FANS) + autofan_speed[f] = newFanSpeed; + #endif + // this idiom allows both digital and PWM fan outputs (see M42 handling). + digitalWrite(pin, newFanSpeed); + analogWrite(pin, newFanSpeed); + SBI(fanDone, bit); } - - switch (f) { - #if HAS_AUTO_FAN_0 - case 0: _UPDATE_AUTO_FAN(E0, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; - #endif - #if HAS_AUTO_FAN_1 - case 1: _UPDATE_AUTO_FAN(E1, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; - #endif - #if HAS_AUTO_FAN_2 - case 2: _UPDATE_AUTO_FAN(E2, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; - #endif - #if HAS_AUTO_FAN_3 - case 3: _UPDATE_AUTO_FAN(E3, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; - #endif - #if HAS_AUTO_FAN_4 - case 4: _UPDATE_AUTO_FAN(E4, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; - #endif - #if HAS_AUTO_FAN_5 - case 5: _UPDATE_AUTO_FAN(E5, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; - #endif - #if HAS_AUTO_FAN_6 - case 6: _UPDATE_AUTO_FAN(E6, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; - #endif - #if HAS_AUTO_FAN_7 - case 7: _UPDATE_AUTO_FAN(E7, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; - #endif - #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E - case CHAMBER_FAN_INDEX: _UPDATE_AUTO_FAN(CHAMBER, fan_on, CHAMBER_AUTO_FAN_SPEED); break; - #endif - } - SBI(fanDone, realFan); } } @@ -769,251 +575,174 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { // // Temperature Error Handlers // - -inline void loud_kill(PGM_P const lcd_msg, const heater_id_t heater_id) { - marlin_state = MF_KILLED; - #if USE_BEEPER - for (uint8_t i = 20; i--;) { - WRITE(BEEPER_PIN, HIGH); delay(25); - WRITE(BEEPER_PIN, LOW); delay(80); - } - WRITE(BEEPER_PIN, HIGH); - #endif - kill(lcd_msg, HEATER_PSTR(heater_id)); -} - -void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_msg, PGM_P const lcd_msg) { - - static uint8_t killed = 0; - - if (IsRunning() && TERN1(BOGUS_TEMPERATURE_GRACE_PERIOD, killed == 2)) { +void Temperature::_temp_error(const int8_t e, const char * const serial_msg, const char * const lcd_msg) { + static bool killed = false; + if (IsRunning()) { SERIAL_ERROR_START(); serialprintPGM(serial_msg); - SERIAL_ECHOPGM(STR_STOPPED_HEATER); - if (heater_id >= 0) - SERIAL_ECHO((int)heater_id); - else if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER)) - SERIAL_ECHOPGM(STR_HEATER_CHAMBER); - else - SERIAL_ECHOPGM(STR_HEATER_BED); - SERIAL_EOL(); + SERIAL_ERRORPGM(MSG_STOPPED_HEATER); + if (e >= 0) SERIAL_ERRORLN((int)e); else SERIAL_ERRORLNPGM(MSG_HEATER_BED); } - - disable_all_heaters(); // always disable (even for bogus temp) - - #if BOGUS_TEMPERATURE_GRACE_PERIOD - const millis_t ms = millis(); - static millis_t expire_ms; - switch (killed) { - case 0: - expire_ms = ms + BOGUS_TEMPERATURE_GRACE_PERIOD; - ++killed; - break; - case 1: - if (ELAPSED(ms, expire_ms)) ++killed; - break; - case 2: - loud_kill(lcd_msg, heater_id); - ++killed; - break; + #if DISABLED(BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE) + if (!killed) { + Running = false; + killed = true; + kill(lcd_msg); } - #elif defined(BOGUS_TEMPERATURE_GRACE_PERIOD) - UNUSED(killed); + else + disable_all_heaters(); // paranoia + #endif +} + +void Temperature::max_temp_error(const int8_t e) { + _temp_error(e, PSTR(MSG_T_MAXTEMP), TEMP_ERR_PSTR(MSG_ERR_MAXTEMP, e)); +} + +void Temperature::min_temp_error(const int8_t e) { + _temp_error(e, PSTR(MSG_T_MINTEMP), TEMP_ERR_PSTR(MSG_ERR_MINTEMP, e)); +} + +float Temperature::get_pid_output(const int8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #define _HOTEND_TEST true #else - if (!killed) { killed = 1; loud_kill(lcd_msg, heater_id); } + #define _HOTEND_TEST e == active_extruder #endif -} - -void Temperature::max_temp_error(const heater_id_t heater_id) { - #if ENABLED(DWIN_CREALITY_LCD) && (HAS_HOTEND || HAS_HEATED_BED) - DWIN_Popup_Temperature(1); - #endif - _temp_error(heater_id, PSTR(STR_T_MAXTEMP), GET_TEXT(MSG_ERR_MAXTEMP)); -} - -void Temperature::min_temp_error(const heater_id_t heater_id) { - #if ENABLED(DWIN_CREALITY_LCD) && (HAS_HOTEND || HAS_HEATED_BED) - DWIN_Popup_Temperature(0); - #endif - _temp_error(heater_id, PSTR(STR_T_MINTEMP), GET_TEXT(MSG_ERR_MINTEMP)); -} - -#if HAS_HOTEND - #if ENABLED(PID_DEBUG) - extern bool pid_debug_flag; - #endif - - float Temperature::get_pid_output_hotend(const uint8_t E_NAME) { - const uint8_t ee = HOTEND_INDEX; - #if ENABLED(PIDTEMP) - #if DISABLED(PID_OPENLOOP) - static hotend_pid_t work_pid[HOTENDS]; - static float temp_iState[HOTENDS] = { 0 }, - temp_dState[HOTENDS] = { 0 }; - static bool pid_reset[HOTENDS] = { false }; - const float pid_error = temp_hotend[ee].target - temp_hotend[ee].celsius; - - float pid_output; - - if (temp_hotend[ee].target == 0 - || pid_error < -(PID_FUNCTIONAL_RANGE) - || TERN0(HEATER_IDLE_HANDLER, heater_idle[ee].timed_out) - ) { - pid_output = 0; - pid_reset[ee] = true; - } - else if (pid_error > PID_FUNCTIONAL_RANGE) { - pid_output = BANG_MAX; - pid_reset[ee] = true; - } - else { - if (pid_reset[ee]) { - temp_iState[ee] = 0.0; - work_pid[ee].Kd = 0.0; - pid_reset[ee] = false; - } - - work_pid[ee].Kd = work_pid[ee].Kd + PID_K2 * (PID_PARAM(Kd, ee) * (temp_dState[ee] - temp_hotend[ee].celsius) - work_pid[ee].Kd); - const float max_power_over_i_gain = float(PID_MAX) / PID_PARAM(Ki, ee) - float(MIN_POWER); - temp_iState[ee] = constrain(temp_iState[ee] + pid_error, 0, max_power_over_i_gain); - work_pid[ee].Kp = PID_PARAM(Kp, ee) * pid_error; - work_pid[ee].Ki = PID_PARAM(Ki, ee) * temp_iState[ee]; - - pid_output = work_pid[ee].Kp + work_pid[ee].Ki + work_pid[ee].Kd + float(MIN_POWER); - - #if ENABLED(PID_EXTRUSION_SCALING) - #if HOTENDS == 1 - constexpr bool this_hotend = true; - #else - const bool this_hotend = (ee == active_extruder); - #endif - work_pid[ee].Kc = 0; - if (this_hotend) { - const long e_position = stepper.position(E_AXIS); - if (e_position > last_e_position) { - lpq[lpq_ptr] = e_position - last_e_position; - last_e_position = e_position; - } - else - lpq[lpq_ptr] = 0; - - if (++lpq_ptr >= lpq_len) lpq_ptr = 0; - work_pid[ee].Kc = (lpq[lpq_ptr] * planner.steps_to_mm[E_AXIS]) * PID_PARAM(Kc, ee); - pid_output += work_pid[ee].Kc; - } - #endif // PID_EXTRUSION_SCALING - #if ENABLED(PID_FAN_SCALING) - if (thermalManager.fan_speed[active_extruder] > PID_FAN_SCALING_MIN_SPEED) { - work_pid[ee].Kf = PID_PARAM(Kf, ee) + (PID_FAN_SCALING_LIN_FACTOR) * thermalManager.fan_speed[active_extruder]; - pid_output += work_pid[ee].Kf; - } - //pid_output -= work_pid[ee].Ki; - //pid_output += work_pid[ee].Ki * work_pid[ee].Kf - #endif // PID_FAN_SCALING - LIMIT(pid_output, 0, PID_MAX); - } - temp_dState[ee] = temp_hotend[ee].celsius; - - #else // PID_OPENLOOP - - const float pid_output = constrain(temp_hotend[ee].target, 0, PID_MAX); - - #endif // PID_OPENLOOP - - #if ENABLED(PID_DEBUG) - if (ee == active_extruder && pid_debug_flag) { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(STR_PID_DEBUG, ee, STR_PID_DEBUG_INPUT, temp_hotend[ee].celsius, STR_PID_DEBUG_OUTPUT, pid_output); - #if DISABLED(PID_OPENLOOP) - { - SERIAL_ECHOPAIR( - STR_PID_DEBUG_PTERM, work_pid[ee].Kp, - STR_PID_DEBUG_ITERM, work_pid[ee].Ki, - STR_PID_DEBUG_DTERM, work_pid[ee].Kd - #if ENABLED(PID_EXTRUSION_SCALING) - , STR_PID_DEBUG_CTERM, work_pid[ee].Kc - #endif - ); - } - #endif - SERIAL_EOL(); - } - #endif // PID_DEBUG - - #else // No PID enabled - - const bool is_idling = TERN0(HEATER_IDLE_HANDLER, heater_idle[ee].timed_out); - const float pid_output = (!is_idling && temp_hotend[ee].celsius < temp_hotend[ee].target) ? BANG_MAX : 0; - - #endif - - return pid_output; - } - -#endif // HAS_HOTEND - -#if ENABLED(PIDTEMPBED) - - float Temperature::get_pid_output_bed() { - + float pid_output; + #if ENABLED(PIDTEMP) #if DISABLED(PID_OPENLOOP) - - static PID_t work_pid{0}; - static float temp_iState = 0, temp_dState = 0; - static bool pid_reset = true; - float pid_output = 0; - const float max_power_over_i_gain = float(MAX_BED_POWER) / temp_bed.pid.Ki - float(MIN_BED_POWER), - pid_error = temp_bed.target - temp_bed.celsius; - - if (!temp_bed.target || pid_error < -(PID_FUNCTIONAL_RANGE)) { - pid_output = 0; - pid_reset = true; + pid_error[HOTEND_INDEX] = target_temperature[HOTEND_INDEX] - current_temperature[HOTEND_INDEX]; + dTerm[HOTEND_INDEX] = PID_K2 * PID_PARAM(Kd, HOTEND_INDEX) * (current_temperature[HOTEND_INDEX] - temp_dState[HOTEND_INDEX]) + float(PID_K1) * dTerm[HOTEND_INDEX]; + temp_dState[HOTEND_INDEX] = current_temperature[HOTEND_INDEX]; + #if HEATER_IDLE_HANDLER + if (heater_idle_timeout_exceeded[HOTEND_INDEX]) { + pid_output = 0; + pid_reset[HOTEND_INDEX] = true; + } + else + #endif + if (pid_error[HOTEND_INDEX] > PID_FUNCTIONAL_RANGE) { + pid_output = BANG_MAX; + pid_reset[HOTEND_INDEX] = true; } - else if (pid_error > PID_FUNCTIONAL_RANGE) { - pid_output = MAX_BED_POWER; - pid_reset = true; + else if (pid_error[HOTEND_INDEX] < -(PID_FUNCTIONAL_RANGE) || target_temperature[HOTEND_INDEX] == 0 + #if HEATER_IDLE_HANDLER + || heater_idle_timeout_exceeded[HOTEND_INDEX] + #endif + ) { + pid_output = 0; + pid_reset[HOTEND_INDEX] = true; } else { - if (pid_reset) { - temp_iState = 0.0; - work_pid.Kd = 0.0; - pid_reset = false; + if (pid_reset[HOTEND_INDEX]) { + temp_iState[HOTEND_INDEX] = 0.0; + pid_reset[HOTEND_INDEX] = false; } + pTerm[HOTEND_INDEX] = PID_PARAM(Kp, HOTEND_INDEX) * pid_error[HOTEND_INDEX]; + temp_iState[HOTEND_INDEX] += pid_error[HOTEND_INDEX]; + iTerm[HOTEND_INDEX] = PID_PARAM(Ki, HOTEND_INDEX) * temp_iState[HOTEND_INDEX]; - temp_iState = constrain(temp_iState + pid_error, 0, max_power_over_i_gain); + pid_output = pTerm[HOTEND_INDEX] + iTerm[HOTEND_INDEX] - dTerm[HOTEND_INDEX]; - work_pid.Kp = temp_bed.pid.Kp * pid_error; - work_pid.Ki = temp_bed.pid.Ki * temp_iState; - work_pid.Kd = work_pid.Kd + PID_K2 * (temp_bed.pid.Kd * (temp_dState - temp_bed.celsius) - work_pid.Kd); + #if ENABLED(PID_EXTRUSION_SCALING) + cTerm[HOTEND_INDEX] = 0; + if (_HOTEND_TEST) { + const long e_position = stepper.position(E_AXIS); + if (e_position > last_e_position) { + lpq[lpq_ptr] = e_position - last_e_position; + last_e_position = e_position; + } + else + lpq[lpq_ptr] = 0; - temp_dState = temp_bed.celsius; + if (++lpq_ptr >= lpq_len) lpq_ptr = 0; + cTerm[HOTEND_INDEX] = (lpq[lpq_ptr] * planner.steps_to_mm[E_AXIS]) * PID_PARAM(Kc, HOTEND_INDEX); + pid_output += cTerm[HOTEND_INDEX]; + } + #endif // PID_EXTRUSION_SCALING - pid_output = constrain(work_pid.Kp + work_pid.Ki + work_pid.Kd + float(MIN_BED_POWER), 0, MAX_BED_POWER); + if (pid_output > PID_MAX) { + if (pid_error[HOTEND_INDEX] > 0) temp_iState[HOTEND_INDEX] -= pid_error[HOTEND_INDEX]; // conditional un-integration + pid_output = PID_MAX; + } + else if (pid_output < 0) { + if (pid_error[HOTEND_INDEX] < 0) temp_iState[HOTEND_INDEX] -= pid_error[HOTEND_INDEX]; // conditional un-integration + pid_output = 0; + } } + #else + pid_output = constrain(target_temperature[HOTEND_INDEX], 0, PID_MAX); + #endif // PID_OPENLOOP - #else // PID_OPENLOOP + #if ENABLED(PID_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(MSG_PID_DEBUG, HOTEND_INDEX); + SERIAL_ECHOPAIR(MSG_PID_DEBUG_INPUT, current_temperature[HOTEND_INDEX]); + SERIAL_ECHOPAIR(MSG_PID_DEBUG_OUTPUT, pid_output); + SERIAL_ECHOPAIR(MSG_PID_DEBUG_PTERM, pTerm[HOTEND_INDEX]); + SERIAL_ECHOPAIR(MSG_PID_DEBUG_ITERM, iTerm[HOTEND_INDEX]); + SERIAL_ECHOPAIR(MSG_PID_DEBUG_DTERM, dTerm[HOTEND_INDEX]); + #if ENABLED(PID_EXTRUSION_SCALING) + SERIAL_ECHOPAIR(MSG_PID_DEBUG_CTERM, cTerm[HOTEND_INDEX]); + #endif + SERIAL_EOL(); + #endif // PID_DEBUG - const float pid_output = constrain(temp_bed.target, 0, MAX_BED_POWER); + #else /* PID off */ + #if HEATER_IDLE_HANDLER + if (heater_idle_timeout_exceeded[HOTEND_INDEX]) + pid_output = 0; + else + #endif + pid_output = (current_temperature[HOTEND_INDEX] < target_temperature[HOTEND_INDEX]) ? PID_MAX : 0; + #endif + return pid_output; +} + +#if ENABLED(PIDTEMPBED) + float Temperature::get_pid_output_bed() { + float pid_output; + #if DISABLED(PID_OPENLOOP) + pid_error_bed = target_temperature_bed - current_temperature_bed; + pTerm_bed = bedKp * pid_error_bed; + temp_iState_bed += pid_error_bed; + iTerm_bed = bedKi * temp_iState_bed; + + dTerm_bed = PID_K2 * bedKd * (current_temperature_bed - temp_dState_bed) + PID_K1 * dTerm_bed; + temp_dState_bed = current_temperature_bed; + + pid_output = pTerm_bed + iTerm_bed - dTerm_bed; + if (pid_output > MAX_BED_POWER) { + if (pid_error_bed > 0) temp_iState_bed -= pid_error_bed; // conditional un-integration + pid_output = MAX_BED_POWER; + } + else if (pid_output < 0) { + if (pid_error_bed < 0) temp_iState_bed -= pid_error_bed; // conditional un-integration + pid_output = 0; + } + #else + pid_output = constrain(target_temperature_bed, 0, MAX_BED_POWER); #endif // PID_OPENLOOP #if ENABLED(PID_BED_DEBUG) - { SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR( - " PID_BED_DEBUG : Input ", temp_bed.celsius, " Output ", pid_output, - #if DISABLED(PID_OPENLOOP) - STR_PID_DEBUG_PTERM, work_pid.Kp, - STR_PID_DEBUG_ITERM, work_pid.Ki, - STR_PID_DEBUG_DTERM, work_pid.Kd, - #endif - ); - } - #endif + SERIAL_ECHOPGM(" PID_BED_DEBUG "); + SERIAL_ECHOPGM(": Input "); + SERIAL_ECHO(current_temperature_bed); + SERIAL_ECHOPGM(" Output "); + SERIAL_ECHO(pid_output); + SERIAL_ECHOPGM(" pTerm "); + SERIAL_ECHO(pTerm_bed); + SERIAL_ECHOPGM(" iTerm "); + SERIAL_ECHO(iTerm_bed); + SERIAL_ECHOPGM(" dTerm "); + SERIAL_ECHOLN(dTerm_bed); + #endif // PID_BED_DEBUG return pid_output; } - #endif // PIDTEMPBED /** @@ -1029,66 +758,64 @@ void Temperature::manage_heater() { #if EARLY_WATCHDOG // If thermal manager is still not running, make sure to at least reset the watchdog! - if (!inited) return watchdog_refresh(); + if (!inited) { + watchdog_reset(); + return; + } #endif - if (TERN0(EMERGENCY_PARSER, emergency_parser.killed_by_M112)) - kill(M112_KILL_STR, nullptr, true); + #if ENABLED(PROBING_HEATERS_OFF) && ENABLED(BED_LIMIT_SWITCHING) + static bool last_pause_state; + #endif - if (!raw_temps_ready) return; + #if ENABLED(EMERGENCY_PARSER) + if (emergency_parser.killed_by_M112) kill(PSTR(MSG_KILLED)); + #endif + + if (!temp_meas_ready) return; updateTemperaturesFromRawValues(); // also resets the watchdog - #if DISABLED(IGNORE_THERMOCOUPLE_ERRORS) - #if ENABLED(HEATER_0_USES_MAX6675) - if (temp_hotend[0].celsius > _MIN(HEATER_0_MAXTEMP, HEATER_0_MAX6675_TMAX - 1.0)) max_temp_error(H_E0); - if (temp_hotend[0].celsius < _MAX(HEATER_0_MINTEMP, HEATER_0_MAX6675_TMIN + .01)) min_temp_error(H_E0); - #endif - #if ENABLED(HEATER_1_USES_MAX6675) - if (temp_hotend[1].celsius > _MIN(HEATER_1_MAXTEMP, HEATER_1_MAX6675_TMAX - 1.0)) max_temp_error(H_E1); - if (temp_hotend[1].celsius < _MAX(HEATER_1_MINTEMP, HEATER_1_MAX6675_TMIN + .01)) min_temp_error(H_E1); - #endif + #if ENABLED(HEATER_0_USES_MAX6675) + if (current_temperature[0] > MIN(HEATER_0_MAXTEMP, MAX6675_TMAX - 1.0)) max_temp_error(0); + if (current_temperature[0] < MAX(HEATER_0_MINTEMP, MAX6675_TMIN + .01)) min_temp_error(0); #endif - millis_t ms = millis(); + #if WATCH_HOTENDS || WATCH_THE_BED || DISABLED(PIDTEMPBED) || HAS_AUTO_FAN || HEATER_IDLE_HANDLER + millis_t ms = millis(); + #endif - #if HAS_HOTEND + HOTEND_LOOP() { - HOTEND_LOOP() { - #if ENABLED(THERMAL_PROTECTION_HOTENDS) - if (degHotend(e) > temp_range[e].maxtemp) max_temp_error((heater_id_t)e); - #endif + #if HEATER_IDLE_HANDLER + if (!heater_idle_timeout_exceeded[e] && heater_idle_timeout_ms[e] && ELAPSED(ms, heater_idle_timeout_ms[e])) + heater_idle_timeout_exceeded[e] = true; + #endif - TERN_(HEATER_IDLE_HANDLER, heater_idle[e].update(ms)); + #if ENABLED(THERMAL_PROTECTION_HOTENDS) + // Check for thermal runaway + thermal_runaway_protection(&thermal_runaway_state_machine[e], &thermal_runaway_timer[e], current_temperature[e], target_temperature[e], e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS); + #endif - #if ENABLED(THERMAL_PROTECTION_HOTENDS) - // Check for thermal runaway - tr_state_machine[e].run(temp_hotend[e].celsius, temp_hotend[e].target, (heater_id_t)e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS); - #endif + soft_pwm_amount[e] = (current_temperature[e] > minttemp[e] || is_preheating(e)) && current_temperature[e] < maxttemp[e] ? (int)get_pid_output(e) >> 1 : 0; - temp_hotend[e].soft_pwm_amount = (temp_hotend[e].celsius > temp_range[e].mintemp || is_preheating(e)) && temp_hotend[e].celsius < temp_range[e].maxtemp ? (int)get_pid_output_hotend(e) >> 1 : 0; + #if WATCH_HOTENDS + // Make sure temperature is increasing + if (watch_heater_next_ms[e] && ELAPSED(ms, watch_heater_next_ms[e])) { // Time to check this extruder? + if (degHotend(e) < watch_target_temp[e]) // Failed to increase enough? + _temp_error(e, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, e)); + else // Start again if the target is still far off + start_watching_heater(e); + } + #endif - #if WATCH_HOTENDS - // Make sure temperature is increasing - if (watch_hotend[e].next_ms && ELAPSED(ms, watch_hotend[e].next_ms)) { // Time to check this extruder? - if (degHotend(e) < watch_hotend[e].target) { // Failed to increase enough? - TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); - _temp_error((heater_id_t)e, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); - } - else // Start again if the target is still far off - start_watching_hotend(e); - } - #endif + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + // Make sure measured temperatures are close together + if (ABS(current_temperature[0] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) + _temp_error(0, PSTR(MSG_REDUNDANCY), PSTR(MSG_ERR_REDUNDANT_TEMP)); + #endif - #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - // Make sure measured temperatures are close together - if (ABS(temp_hotend[0].celsius - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) - _temp_error(H_E0, PSTR(STR_REDUNDANCY), GET_TEXT(MSG_ERR_REDUNDANT_TEMP)); - #endif - - } // HOTEND_LOOP - - #endif // HAS_HOTEND + } // HOTEND_LOOP #if HAS_AUTO_FAN if (ELAPSED(ms, next_auto_fan_check_ms)) { // only need to check fan state very infrequently @@ -1099,479 +826,189 @@ void Temperature::manage_heater() { #if ENABLED(FILAMENT_WIDTH_SENSOR) /** - * Dynamically set the volumetric multiplier based - * on the delayed Filament Width measurement. + * Filament Width Sensor dynamically sets the volumetric multiplier + * based on a delayed measurement of the filament diameter. */ - filwidth.update_volumetric(); - #endif + if (filament_sensor) { + meas_shift_index = filwidth_delay_index[0] - meas_delay_cm; + if (meas_shift_index < 0) meas_shift_index += MAX_MEASUREMENT_DELAY + 1; //loop around buffer if needed + meas_shift_index = constrain(meas_shift_index, 0, MAX_MEASUREMENT_DELAY); + planner.calculate_volumetric_for_width_sensor(measurement_delay[meas_shift_index]); + } + #endif // FILAMENT_WIDTH_SENSOR #if HAS_HEATED_BED - #if ENABLED(THERMAL_PROTECTION_BED) - if (degBed() > BED_MAXTEMP) max_temp_error(H_BED); - #endif - - #if WATCH_BED + #if WATCH_THE_BED // Make sure temperature is increasing - if (watch_bed.elapsed(ms)) { // Time to check the bed? - if (degBed() < watch_bed.target) { // Failed to increase enough? - TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); - _temp_error(H_BED, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); - } + if (watch_bed_next_ms && ELAPSED(ms, watch_bed_next_ms)) { // Time to check the bed? + if (degBed() < watch_target_bed_temp) // Failed to increase enough? + _temp_error(-1, PSTR(MSG_T_HEATING_FAILED), TEMP_ERR_PSTR(MSG_HEATING_FAILED_LCD, -1)); else // Start again if the target is still far off start_watching_bed(); } - #endif // WATCH_BED + #endif // WATCH_THE_BED - #if BOTH(PROBING_HEATERS_OFF, BED_LIMIT_SWITCHING) - #define PAUSE_CHANGE_REQD 1 - #endif - - #if PAUSE_CHANGE_REQD - static bool last_pause_state; - #endif - - do { - - #if DISABLED(PIDTEMPBED) - if (PENDING(ms, next_bed_check_ms) - && TERN1(PAUSE_CHANGE_REQD, paused == last_pause_state) - ) break; - next_bed_check_ms = ms + BED_CHECK_INTERVAL; - TERN_(PAUSE_CHANGE_REQD, last_pause_state = paused); + #if DISABLED(PIDTEMPBED) + if (PENDING(ms, next_bed_check_ms) + #if ENABLED(PROBING_HEATERS_OFF) && ENABLED(BED_LIMIT_SWITCHING) + && paused == last_pause_state + #endif + ) return; + next_bed_check_ms = ms + BED_CHECK_INTERVAL; + #if ENABLED(PROBING_HEATERS_OFF) && ENABLED(BED_LIMIT_SWITCHING) + last_pause_state = paused; #endif - - TERN_(HEATER_IDLE_HANDLER, heater_idle[IDLE_INDEX_BED].update(ms)); - - #if HAS_THERMALLY_PROTECTED_BED - tr_state_machine[RUNAWAY_IND_BED].run(temp_bed.celsius, temp_bed.target, H_BED, THERMAL_PROTECTION_BED_PERIOD, THERMAL_PROTECTION_BED_HYSTERESIS); - #endif - - #if HEATER_IDLE_HANDLER - if (heater_idle[IDLE_INDEX_BED].timed_out) { - temp_bed.soft_pwm_amount = 0; - #if DISABLED(PIDTEMPBED) - WRITE_HEATER_BED(LOW); - #endif - } - else - #endif - { - #if ENABLED(PIDTEMPBED) - temp_bed.soft_pwm_amount = WITHIN(temp_bed.celsius, BED_MINTEMP, BED_MAXTEMP) ? (int)get_pid_output_bed() >> 1 : 0; - #else - // Check if temperature is within the correct band - if (WITHIN(temp_bed.celsius, BED_MINTEMP, BED_MAXTEMP)) { - #if ENABLED(BED_LIMIT_SWITCHING) - if (temp_bed.celsius >= temp_bed.target + BED_HYSTERESIS) - temp_bed.soft_pwm_amount = 0; - else if (temp_bed.celsius <= temp_bed.target - (BED_HYSTERESIS)) - temp_bed.soft_pwm_amount = MAX_BED_POWER >> 1; - #else // !PIDTEMPBED && !BED_LIMIT_SWITCHING - temp_bed.soft_pwm_amount = temp_bed.celsius < temp_bed.target ? MAX_BED_POWER >> 1 : 0; - #endif - } - else { - temp_bed.soft_pwm_amount = 0; - WRITE_HEATER_BED(LOW); - } - #endif - } - - } while (false); - - #endif // HAS_HEATED_BED - - #if HAS_HEATED_CHAMBER - - #ifndef CHAMBER_CHECK_INTERVAL - #define CHAMBER_CHECK_INTERVAL 1000UL #endif - #if ENABLED(THERMAL_PROTECTION_CHAMBER) - if (degChamber() > CHAMBER_MAXTEMP) max_temp_error(H_CHAMBER); + #if HEATER_IDLE_HANDLER + if (!bed_idle_timeout_exceeded && bed_idle_timeout_ms && ELAPSED(ms, bed_idle_timeout_ms)) + bed_idle_timeout_exceeded = true; #endif - #if WATCH_CHAMBER - // Make sure temperature is increasing - if (watch_chamber.elapsed(ms)) { // Time to check the chamber? - if (degChamber() < watch_chamber.target) // Failed to increase enough? - _temp_error(H_CHAMBER, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); - else - start_watching_chamber(); // Start again if the target is still far off - } + #if HAS_THERMALLY_PROTECTED_BED + thermal_runaway_protection(&thermal_runaway_bed_state_machine, &thermal_runaway_bed_timer, current_temperature_bed, target_temperature_bed, -1, THERMAL_PROTECTION_BED_PERIOD, THERMAL_PROTECTION_BED_HYSTERESIS); #endif - #if EITHER(CHAMBER_FAN, CHAMBER_VENT) - if (temp_chamber.target > CHAMBER_MINTEMP) { - flag_chamber_off = false; - - #if ENABLED(CHAMBER_FAN) - #if CHAMBER_FAN_MODE == 0 - fan_chamber_pwm = CHAMBER_FAN_BASE - #elif CHAMBER_FAN_MODE == 1 - fan_chamber_pwm = (temp_chamber.celsius > temp_chamber.target) ? (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * (temp_chamber.celsius - temp_chamber.target) : 0; - #elif CHAMBER_FAN_MODE == 2 - fan_chamber_pwm = (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * ABS(temp_chamber.celsius - temp_chamber.target); - if (temp_chamber.soft_pwm_amount) - fan_chamber_pwm += (CHAMBER_FAN_FACTOR) * 2; - #endif - NOMORE(fan_chamber_pwm, 225); - thermalManager.set_fan_speed(2, fan_chamber_pwm); // TODO: instead of fan 2, set to chamber fan - #endif - - #if ENABLED(CHAMBER_VENT) - #ifndef MIN_COOLING_SLOPE_TIME_CHAMBER_VENT - #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20 - #endif - #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER_VENT - #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 - #endif - if( (temp_chamber.celsius - temp_chamber.target >= HIGH_EXCESS_HEAT_LIMIT) && !flag_chamber_excess_heat) { - // open vent after MIN_COOLING_SLOPE_TIME_CHAMBER_VENT seconds - // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT - if (next_cool_check_ms_2 == 0 || ELAPSED(ms, next_cool_check_ms_2)) { - if (old_temp - temp_chamber.celsius < float(MIN_COOLING_SLOPE_DEG_CHAMBER_VENT)) flag_chamber_excess_heat = true; //the bed is heating the chamber too much - next_cool_check_ms_2 = ms + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER_VENT; - old_temp = temp_chamber.celsius; - } - } - else { - next_cool_check_ms_2 = 0; - old_temp = 9999; - } - if (flag_chamber_excess_heat && (temp_chamber.celsius - temp_chamber.target <= -LOW_EXCESS_HEAT_LIMIT) ) { - flag_chamber_excess_heat = false; - } - #endif - } - else if (!flag_chamber_off) { - #if ENABLED(CHAMBER_FAN) - flag_chamber_off = true; - thermalManager.set_fan_speed(2, 0); - #endif - #if ENABLED(CHAMBER_VENT) - flag_chamber_excess_heat = false; - MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 90); + #if HEATER_IDLE_HANDLER + if (bed_idle_timeout_exceeded) { + soft_pwm_amount_bed = 0; + #if DISABLED(PIDTEMPBED) + WRITE_HEATER_BED(LOW); #endif } + else #endif - - if (ELAPSED(ms, next_chamber_check_ms)) { - next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; - - if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { - if (flag_chamber_excess_heat) { - temp_chamber.soft_pwm_amount = 0; - #if ENABLED(CHAMBER_VENT) - if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90); + { + #if ENABLED(PIDTEMPBED) + soft_pwm_amount_bed = WITHIN(current_temperature_bed, BED_MINTEMP, BED_MAXTEMP) ? (int)get_pid_output_bed() >> 1 : 0; + #else + // Check if temperature is within the correct band + if (WITHIN(current_temperature_bed, BED_MINTEMP, BED_MAXTEMP)) { + #if ENABLED(BED_LIMIT_SWITCHING) + if (current_temperature_bed >= target_temperature_bed + BED_HYSTERESIS) + soft_pwm_amount_bed = 0; + else if (current_temperature_bed <= target_temperature_bed - (BED_HYSTERESIS)) + soft_pwm_amount_bed = MAX_BED_POWER >> 1; + #else // !PIDTEMPBED && !BED_LIMIT_SWITCHING + soft_pwm_amount_bed = current_temperature_bed < target_temperature_bed ? MAX_BED_POWER >> 1 : 0; #endif } else { - #if ENABLED(CHAMBER_LIMIT_SWITCHING) - if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS) - temp_chamber.soft_pwm_amount = 0; - else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS)) - temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1; - #else - temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? (MAX_CHAMBER_POWER) >> 1 : 0; - #endif - #if ENABLED(CHAMBER_VENT) - if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0); - #endif + soft_pwm_amount_bed = 0; + WRITE_HEATER_BED(LOW); } - } - else { - temp_chamber.soft_pwm_amount = 0; - WRITE_HEATER_CHAMBER(LOW); - } - - #if ENABLED(THERMAL_PROTECTION_CHAMBER) - tr_state_machine[RUNAWAY_IND_CHAMBER].run(temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS); #endif } - - // TODO: Implement true PID pwm - //temp_bed.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0; - - #endif // HAS_HEATED_CHAMBER - - UNUSED(ms); + #endif // HAS_HEATED_BED } -#define TEMP_AD595(RAW) ((RAW) * 5.0 * 100.0 / float(HAL_ADC_RANGE) / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET) -#define TEMP_AD8495(RAW) ((RAW) * 6.6 * 100.0 / float(HAL_ADC_RANGE) / (OVERSAMPLENR) * (TEMP_SENSOR_AD8495_GAIN) + TEMP_SENSOR_AD8495_OFFSET) +#define TEMP_AD595(RAW) ((RAW) * 5.0 * 100.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET) +#define TEMP_AD8495(RAW) ((RAW) * 6.6 * 100.0 / 1024.0 / (OVERSAMPLENR) * (TEMP_SENSOR_AD8495_GAIN) + TEMP_SENSOR_AD8495_OFFSET) /** * Bisect search for the range of the 'raw' value, then interpolate * proportionally between the under and over values. */ -#define SCAN_THERMISTOR_TABLE(TBL,LEN) do{ \ - uint8_t l = 0, r = LEN, m; \ - for (;;) { \ - m = (l + r) >> 1; \ - if (!m) return int16_t(pgm_read_word(&TBL[0].celsius)); \ - if (m == l || m == r) return int16_t(pgm_read_word(&TBL[LEN-1].celsius)); \ - int16_t v00 = pgm_read_word(&TBL[m-1].value), \ - v10 = pgm_read_word(&TBL[m-0].value); \ - if (raw < v00) r = m; \ - else if (raw > v10) l = m; \ - else { \ - const int16_t v01 = int16_t(pgm_read_word(&TBL[m-1].celsius)), \ - v11 = int16_t(pgm_read_word(&TBL[m-0].celsius)); \ - return v01 + (raw - v00) * float(v11 - v01) / float(v10 - v00); \ - } \ - } \ +#define SCAN_THERMISTOR_TABLE(TBL,LEN) do{ \ + uint8_t l = 0, r = LEN, m; \ + for (;;) { \ + m = (l + r) >> 1; \ + if (m == l || m == r) return (short)pgm_read_word(&TBL[LEN-1][1]); \ + short v00 = pgm_read_word(&TBL[m-1][0]), \ + v10 = pgm_read_word(&TBL[m-0][0]); \ + if (raw < v00) r = m; \ + else if (raw > v10) l = m; \ + else { \ + const short v01 = (short)pgm_read_word(&TBL[m-1][1]), \ + v11 = (short)pgm_read_word(&TBL[m-0][1]); \ + return v01 + (raw - v00) * float(v11 - v01) / float(v10 - v00); \ + } \ + } \ }while(0) -#if HAS_USER_THERMISTORS - - user_thermistor_t Temperature::user_thermistor[USER_THERMISTORS]; // Initialized by settings.load() - - void Temperature::reset_user_thermistors() { - user_thermistor_t user_thermistor[USER_THERMISTORS] = { - #if ENABLED(HEATER_0_USER_THERMISTOR) - { true, 0, 0, HOTEND0_PULLUP_RESISTOR_OHMS, HOTEND0_RESISTANCE_25C_OHMS, 0, 0, HOTEND0_BETA, 0 }, - #endif - #if ENABLED(HEATER_1_USER_THERMISTOR) - { true, 0, 0, HOTEND1_PULLUP_RESISTOR_OHMS, HOTEND1_RESISTANCE_25C_OHMS, 0, 0, HOTEND1_BETA, 0 }, - #endif - #if ENABLED(HEATER_2_USER_THERMISTOR) - { true, 0, 0, HOTEND2_PULLUP_RESISTOR_OHMS, HOTEND2_RESISTANCE_25C_OHMS, 0, 0, HOTEND2_BETA, 0 }, - #endif - #if ENABLED(HEATER_3_USER_THERMISTOR) - { true, 0, 0, HOTEND3_PULLUP_RESISTOR_OHMS, HOTEND3_RESISTANCE_25C_OHMS, 0, 0, HOTEND3_BETA, 0 }, - #endif - #if ENABLED(HEATER_4_USER_THERMISTOR) - { true, 0, 0, HOTEND4_PULLUP_RESISTOR_OHMS, HOTEND4_RESISTANCE_25C_OHMS, 0, 0, HOTEND4_BETA, 0 }, - #endif - #if ENABLED(HEATER_5_USER_THERMISTOR) - { true, 0, 0, HOTEND5_PULLUP_RESISTOR_OHMS, HOTEND5_RESISTANCE_25C_OHMS, 0, 0, HOTEND5_BETA, 0 }, - #endif - #if ENABLED(HEATER_6_USER_THERMISTOR) - { true, 0, 0, HOTEND6_PULLUP_RESISTOR_OHMS, HOTEND6_RESISTANCE_25C_OHMS, 0, 0, HOTEND6_BETA, 0 }, - #endif - #if ENABLED(HEATER_7_USER_THERMISTOR) - { true, 0, 0, HOTEND7_PULLUP_RESISTOR_OHMS, HOTEND7_RESISTANCE_25C_OHMS, 0, 0, HOTEND7_BETA, 0 }, - #endif - #if ENABLED(HEATER_BED_USER_THERMISTOR) - { true, 0, 0, BED_PULLUP_RESISTOR_OHMS, BED_RESISTANCE_25C_OHMS, 0, 0, BED_BETA, 0 }, - #endif - #if ENABLED(HEATER_CHAMBER_USER_THERMISTOR) - { true, 0, 0, CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS, 0, 0, CHAMBER_BETA, 0 } - #endif - }; - COPY(thermalManager.user_thermistor, user_thermistor); - } - - void Temperature::log_user_thermistor(const uint8_t t_index, const bool eprom/*=false*/) { - - if (eprom) - SERIAL_ECHOPGM(" M305 "); - else - SERIAL_ECHO_START(); - SERIAL_CHAR('P'); - SERIAL_CHAR('0' + t_index); - - const user_thermistor_t &t = user_thermistor[t_index]; - - SERIAL_ECHOPAIR_F(" R", t.series_res, 1); - SERIAL_ECHOPAIR_F_P(SP_T_STR, t.res_25, 1); - SERIAL_ECHOPAIR_F_P(SP_B_STR, t.beta, 1); - SERIAL_ECHOPAIR_F_P(SP_C_STR, t.sh_c_coeff, 9); - SERIAL_ECHOPGM(" ; "); - serialprintPGM( - TERN_(HEATER_0_USER_THERMISTOR, t_index == CTI_HOTEND_0 ? PSTR("HOTEND 0") :) - TERN_(HEATER_1_USER_THERMISTOR, t_index == CTI_HOTEND_1 ? PSTR("HOTEND 1") :) - TERN_(HEATER_2_USER_THERMISTOR, t_index == CTI_HOTEND_2 ? PSTR("HOTEND 2") :) - TERN_(HEATER_3_USER_THERMISTOR, t_index == CTI_HOTEND_3 ? PSTR("HOTEND 3") :) - TERN_(HEATER_4_USER_THERMISTOR, t_index == CTI_HOTEND_4 ? PSTR("HOTEND 4") :) - TERN_(HEATER_5_USER_THERMISTOR, t_index == CTI_HOTEND_5 ? PSTR("HOTEND 5") :) - TERN_(HEATER_6_USER_THERMISTOR, t_index == CTI_HOTEND_6 ? PSTR("HOTEND 6") :) - TERN_(HEATER_7_USER_THERMISTOR, t_index == CTI_HOTEND_7 ? PSTR("HOTEND 7") :) - TERN_(HEATER_BED_USER_THERMISTOR, t_index == CTI_BED ? PSTR("BED") :) - TERN_(HEATER_CHAMBER_USER_THERMISTOR, t_index == CTI_CHAMBER ? PSTR("CHAMBER") :) - nullptr - ); - SERIAL_EOL(); - } - - float Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int raw) { - //#if (MOTHERBOARD == BOARD_RAMPS_14_EFB) - // static uint32_t clocks_total = 0; - // static uint32_t calls = 0; - // uint32_t tcnt5 = TCNT5; - //#endif - - if (!WITHIN(t_index, 0, COUNT(user_thermistor) - 1)) return 25; - - user_thermistor_t &t = user_thermistor[t_index]; - if (t.pre_calc) { // pre-calculate some variables - t.pre_calc = false; - t.res_25_recip = 1.0f / t.res_25; - t.res_25_log = logf(t.res_25); - t.beta_recip = 1.0f / t.beta; - t.sh_alpha = RECIPROCAL(THERMISTOR_RESISTANCE_NOMINAL_C - (THERMISTOR_ABS_ZERO_C)) - - (t.beta_recip * t.res_25_log) - (t.sh_c_coeff * cu(t.res_25_log)); +// Derived from RepRap FiveD extruder::getTemperature() +// For hot end temperature measurement. +float Temperature::analog2temp(const int raw, const uint8_t e) { + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + if (e > HOTENDS) + #else + if (e >= HOTENDS) + #endif + { + SERIAL_ERROR_START(); + SERIAL_ERROR((int)e); + SERIAL_ERRORLNPGM(MSG_INVALID_EXTRUDER_NUM); + kill(PSTR(MSG_KILLED)); + return 0.0; } - // maximum adc value .. take into account the over sampling - const int adc_max = MAX_RAW_THERMISTOR_VALUE, - adc_raw = constrain(raw, 1, adc_max - 1); // constrain to prevent divide-by-zero - - const float adc_inverse = (adc_max - adc_raw) - 0.5f, - resistance = t.series_res * (adc_raw + 0.5f) / adc_inverse, - log_resistance = logf(resistance); - - float value = t.sh_alpha; - value += log_resistance * t.beta_recip; - if (t.sh_c_coeff != 0) - value += t.sh_c_coeff * cu(log_resistance); - value = 1.0f / value; - - //#if (MOTHERBOARD == BOARD_RAMPS_14_EFB) - // int32_t clocks = TCNT5 - tcnt5; - // if (clocks >= 0) { - // clocks_total += clocks; - // calls++; - // } - //#endif - - // Return degrees C (up to 999, as the LCD only displays 3 digits) - return _MIN(value + THERMISTOR_ABS_ZERO_C, 999); + switch (e) { + case 0: + #if ENABLED(HEATER_0_USES_MAX6675) + return raw * 0.25; + #elif ENABLED(HEATER_0_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_0_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 1: + #if ENABLED(HEATER_1_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_1_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 2: + #if ENABLED(HEATER_2_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_2_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 3: + #if ENABLED(HEATER_3_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_3_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 4: + #if ENABLED(HEATER_4_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_4_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + default: break; } -#endif -#if HAS_HOTEND - // Derived from RepRap FiveD extruder::getTemperature() - // For hot end temperature measurement. - float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { - if (e > HOTENDS - DISABLED(TEMP_SENSOR_1_AS_REDUNDANT)) { - SERIAL_ERROR_START(); - SERIAL_ECHO((int)e); - SERIAL_ECHOLNPGM(STR_INVALID_EXTRUDER_NUM); - kill(); - return 0; - } + #if HOTEND_USES_THERMISTOR + // Thermistor with conversion table? + const short(*tt)[][2] = (short(*)[][2])(heater_ttbl_map[e]); + SCAN_THERMISTOR_TABLE((*tt), heater_ttbllen_map[e]); + #endif - switch (e) { - case 0: - #if ENABLED(HEATER_0_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_HOTEND_0, raw); - #elif ENABLED(HEATER_0_USES_MAX6675) - return ( - #if ENABLED(MAX6675_IS_MAX31865) - max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS) - #else - raw * 0.25 - #endif - ); - #elif ENABLED(HEATER_0_USES_AD595) - return TEMP_AD595(raw); - #elif ENABLED(HEATER_0_USES_AD8495) - return TEMP_AD8495(raw); - #else - break; - #endif - case 1: - #if ENABLED(HEATER_1_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_HOTEND_1, raw); - #elif ENABLED(HEATER_1_USES_MAX6675) - return raw * 0.25; - #elif ENABLED(HEATER_1_USES_AD595) - return TEMP_AD595(raw); - #elif ENABLED(HEATER_1_USES_AD8495) - return TEMP_AD8495(raw); - #else - break; - #endif - case 2: - #if ENABLED(HEATER_2_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_HOTEND_2, raw); - #elif ENABLED(HEATER_2_USES_AD595) - return TEMP_AD595(raw); - #elif ENABLED(HEATER_2_USES_AD8495) - return TEMP_AD8495(raw); - #else - break; - #endif - case 3: - #if ENABLED(HEATER_3_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_HOTEND_3, raw); - #elif ENABLED(HEATER_3_USES_AD595) - return TEMP_AD595(raw); - #elif ENABLED(HEATER_3_USES_AD8495) - return TEMP_AD8495(raw); - #else - break; - #endif - case 4: - #if ENABLED(HEATER_4_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_HOTEND_4, raw); - #elif ENABLED(HEATER_4_USES_AD595) - return TEMP_AD595(raw); - #elif ENABLED(HEATER_4_USES_AD8495) - return TEMP_AD8495(raw); - #else - break; - #endif - case 5: - #if ENABLED(HEATER_5_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_HOTEND_5, raw); - #elif ENABLED(HEATER_5_USES_AD595) - return TEMP_AD595(raw); - #elif ENABLED(HEATER_5_USES_AD8495) - return TEMP_AD8495(raw); - #else - break; - #endif - case 6: - #if ENABLED(HEATER_6_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_HOTEND_6, raw); - #elif ENABLED(HEATER_6_USES_AD595) - return TEMP_AD595(raw); - #elif ENABLED(HEATER_6_USES_AD8495) - return TEMP_AD8495(raw); - #else - break; - #endif - case 7: - #if ENABLED(HEATER_7_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_HOTEND_7, raw); - #elif ENABLED(HEATER_7_USES_AD595) - return TEMP_AD595(raw); - #elif ENABLED(HEATER_7_USES_AD8495) - return TEMP_AD8495(raw); - #else - break; - #endif - default: break; - } - - #if HOTEND_USES_THERMISTOR - // Thermistor with conversion table? - const temp_entry_t(*tt)[] = (temp_entry_t(*)[])(heater_ttbl_map[e]); - SCAN_THERMISTOR_TABLE((*tt), heater_ttbllen_map[e]); - #endif - - return 0; - } -#endif // HAS_HOTEND + return 0; +} #if HAS_HEATED_BED // Derived from RepRap FiveD extruder::getTemperature() // For bed temperature measurement. - float Temperature::analog_to_celsius_bed(const int raw) { - #if ENABLED(HEATER_BED_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_BED, raw); - #elif ENABLED(HEATER_BED_USES_THERMISTOR) - SCAN_THERMISTOR_TABLE(BED_TEMPTABLE, BED_TEMPTABLE_LEN); + float Temperature::analog2tempBed(const int raw) { + #if ENABLED(HEATER_BED_USES_THERMISTOR) + SCAN_THERMISTOR_TABLE(BEDTEMPTABLE, BEDTEMPTABLE_LEN); #elif ENABLED(HEATER_BED_USES_AD595) return TEMP_AD595(raw); #elif ENABLED(HEATER_BED_USES_AD8495) return TEMP_AD8495(raw); #else - UNUSED(raw); return 0; #endif } @@ -1580,41 +1017,19 @@ void Temperature::manage_heater() { #if HAS_TEMP_CHAMBER // Derived from RepRap FiveD extruder::getTemperature() // For chamber temperature measurement. - float Temperature::analog_to_celsius_chamber(const int raw) { - #if ENABLED(HEATER_CHAMBER_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_CHAMBER, raw); - #elif ENABLED(HEATER_CHAMBER_USES_THERMISTOR) - SCAN_THERMISTOR_TABLE(CHAMBER_TEMPTABLE, CHAMBER_TEMPTABLE_LEN); + float Temperature::analog2tempChamber(const int raw) { + #if ENABLED(HEATER_CHAMBER_USES_THERMISTOR) + SCAN_THERMISTOR_TABLE(CHAMBERTEMPTABLE, CHAMBERTEMPTABLE_LEN); #elif ENABLED(HEATER_CHAMBER_USES_AD595) return TEMP_AD595(raw); #elif ENABLED(HEATER_CHAMBER_USES_AD8495) return TEMP_AD8495(raw); #else - UNUSED(raw); return 0; #endif } #endif // HAS_TEMP_CHAMBER -#if HAS_TEMP_PROBE - // Derived from RepRap FiveD extruder::getTemperature() - // For probe temperature measurement. - float Temperature::analog_to_celsius_probe(const int raw) { - #if ENABLED(PROBE_USER_THERMISTOR) - return user_thermistor_to_deg_c(CTI_PROBE, raw); - #elif ENABLED(PROBE_USES_THERMISTOR) - SCAN_THERMISTOR_TABLE(PROBE_TEMPTABLE, PROBE_TEMPTABLE_LEN); - #elif ENABLED(PROBE_USES_AD595) - return TEMP_AD595(raw); - #elif ENABLED(PROBE_USES_AD8495) - return TEMP_AD8495(raw); - #else - UNUSED(raw); - return 0; - #endif - } -#endif // HAS_TEMP_PROBE - /** * Get the raw values into the actual temperatures. * The raw values are created in interrupt context, @@ -1623,59 +1038,62 @@ void Temperature::manage_heater() { */ void Temperature::updateTemperaturesFromRawValues() { #if ENABLED(HEATER_0_USES_MAX6675) - temp_hotend[0].raw = READ_MAX6675(0); + current_temperature_raw[0] = read_max6675(); #endif - #if ENABLED(HEATER_1_USES_MAX6675) - temp_hotend[1].raw = READ_MAX6675(1); + HOTEND_LOOP() current_temperature[e] = Temperature::analog2temp(current_temperature_raw[e], e); + #if HAS_HEATED_BED + current_temperature_bed = Temperature::analog2tempBed(current_temperature_bed_raw); #endif - #if HAS_HOTEND - HOTEND_LOOP() temp_hotend[e].celsius = analog_to_celsius_hotend(temp_hotend[e].raw, e); + #if HAS_TEMP_CHAMBER + current_temperature_chamber = Temperature::analog2tempChamber(current_temperature_chamber_raw); + #endif + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + redundant_temperature = Temperature::analog2temp(redundant_temperature_raw, 1); + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + filament_width_meas = analog2widthFil(); #endif - TERN_(HAS_HEATED_BED, temp_bed.celsius = analog_to_celsius_bed(temp_bed.raw)); - TERN_(HAS_TEMP_CHAMBER, temp_chamber.celsius = analog_to_celsius_chamber(temp_chamber.raw)); - TERN_(HAS_TEMP_PROBE, temp_probe.celsius = analog_to_celsius_probe(temp_probe.raw)); - TERN_(TEMP_SENSOR_1_AS_REDUNDANT, redundant_temperature = analog_to_celsius_hotend(redundant_temperature_raw, 1)); - TERN_(FILAMENT_WIDTH_SENSOR, filwidth.update_measured_mm()); - TERN_(HAS_POWER_MONITOR, power_monitor.capture_values()); + #if ENABLED(USE_WATCHDOG) + // Reset the watchdog after we know we have a temperature measurement. + watchdog_reset(); + #endif - // Reset the watchdog on good temperature measurement - watchdog_refresh(); - - raw_temps_ready = false; + temp_meas_ready = false; } -#if MAX6675_SEPARATE_SPI - template SoftSPI SPIclass::softSPI; - SPIclass max6675_spi; + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + + // Convert raw Filament Width to millimeters + float Temperature::analog2widthFil() { + return current_raw_filwidth * 5.0f * (1.0f / 16383.0f); + } + + /** + * Convert Filament Width (mm) to a simple ratio + * and reduce to an 8 bit value. + * + * A nominal width of 1.75 and measured width of 1.73 + * gives (100 * 1.75 / 1.73) for a ratio of 101 and + * a return value of 1. + */ + int8_t Temperature::widthFil_to_size_ratio() { + if (ABS(filament_width_nominal - filament_width_meas) <= FILWIDTH_ERROR_MARGIN) + return int(100.0f * filament_width_nominal / filament_width_meas) - 100; + return 0; + } + #endif -// Init fans according to whether they're native PWM or Software PWM -#ifdef ALFAWISE_UX0 - #define _INIT_SOFT_FAN(P) OUT_WRITE_OD(P, FAN_INVERTING ? LOW : HIGH) -#else - #define _INIT_SOFT_FAN(P) OUT_WRITE(P, FAN_INVERTING ? LOW : HIGH) -#endif -#if ENABLED(FAN_SOFT_PWM) - #define _INIT_FAN_PIN(P) _INIT_SOFT_FAN(P) -#else - #define _INIT_FAN_PIN(P) do{ if (PWM_PIN(P)) SET_PWM(P); else _INIT_SOFT_FAN(P); }while(0) -#endif -#if ENABLED(FAST_PWM_FAN) - #define SET_FAST_PWM_FREQ(P) set_pwm_frequency(P, FAST_PWM_FAN_FREQUENCY) -#else - #define SET_FAST_PWM_FREQ(P) NOOP -#endif -#define INIT_FAN_PIN(P) do{ _INIT_FAN_PIN(P); SET_FAST_PWM_FREQ(P); }while(0) -#if EXTRUDER_AUTO_FAN_SPEED != 255 - #define INIT_E_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(FAST_PWM_FAN_FREQUENCY); } else SET_OUTPUT(P); }while(0) -#else - #define INIT_E_AUTO_FAN_PIN(P) SET_OUTPUT(P) -#endif -#if CHAMBER_AUTO_FAN_SPEED != 255 - #define INIT_CHAMBER_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(FAST_PWM_FAN_FREQUENCY); } else SET_OUTPUT(P); }while(0) -#else - #define INIT_CHAMBER_AUTO_FAN_PIN(P) SET_OUTPUT(P) +#if ENABLED(HEATER_0_USES_MAX6675) + #ifndef MAX6675_SCK_PIN + #define MAX6675_SCK_PIN SCK_PIN + #endif + #ifndef MAX6675_DO_PIN + #define MAX6675_DO_PIN MISO_PIN + #endif + SPIclass max6675_spi; #endif /** @@ -1684,43 +1102,30 @@ void Temperature::updateTemperaturesFromRawValues() { */ void Temperature::init() { - TERN_(MAX6675_IS_MAX31865, max31865.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE - #if EARLY_WATCHDOG // Flag that the thermalManager should be running if (inited) return; inited = true; #endif - #if MB(RUMBA) + #if MB(RUMBA) && ( \ + ENABLED(HEATER_0_USES_AD595) || ENABLED(HEATER_1_USES_AD595) || ENABLED(HEATER_2_USES_AD595) || ENABLED(HEATER_3_USES_AD595) || ENABLED(HEATER_4_USES_AD595) || ENABLED(HEATER_BED_USES_AD595) || ENABLED(HEATER_CHAMBER_USES_AD595) \ + || ENABLED(HEATER_0_USES_AD8495) || ENABLED(HEATER_1_USES_AD8495) || ENABLED(HEATER_2_USES_AD8495) || ENABLED(HEATER_3_USES_AD8495) || ENABLED(HEATER_4_USES_AD8495) || ENABLED(HEATER_BED_USES_AD8495) || ENABLED(HEATER_CHAMBER_USES_AD8495)) // Disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector - #define _AD(N) ANY(HEATER_##N##_USES_AD595, HEATER_##N##_USES_AD8495) - #if _AD(0) || _AD(1) || _AD(2) || _AD(BED) || _AD(CHAMBER) - MCUCR = _BV(JTD); - MCUCR = _BV(JTD); - #endif + MCUCR = _BV(JTD); + MCUCR = _BV(JTD); #endif - // Thermistor activation by MCU pin - #if PIN_EXISTS(TEMP_0_TR_ENABLE_PIN) - OUT_WRITE(TEMP_0_TR_ENABLE_PIN, ENABLED(HEATER_0_USES_MAX6675)); - #endif - #if PIN_EXISTS(TEMP_1_TR_ENABLE_PIN) - OUT_WRITE(TEMP_1_TR_ENABLE_PIN, ENABLED(HEATER_1_USES_MAX6675)); - #endif + // Finish init of mult hotend arrays + HOTEND_LOOP() maxttemp[e] = maxttemp[0]; - #if BOTH(PIDTEMP, PID_EXTRUSION_SCALING) + #if ENABLED(PIDTEMP) && ENABLED(PID_EXTRUSION_SCALING) last_e_position = 0; #endif #if HAS_HEATER_0 - #ifdef ALFAWISE_UX0 - OUT_WRITE_OD(HEATER_0_PIN, HEATER_0_INVERTING); - #else - OUT_WRITE(HEATER_0_PIN, HEATER_0_INVERTING); - #endif + OUT_WRITE(HEATER_0_PIN, HEATER_0_INVERTING); #endif - #if HAS_HEATER_1 OUT_WRITE(HEATER_1_PIN, HEATER_1_INVERTING); #endif @@ -1731,59 +1136,34 @@ void Temperature::init() { OUT_WRITE(HEATER_3_PIN, HEATER_3_INVERTING); #endif #if HAS_HEATER_4 - OUT_WRITE(HEATER_4_PIN, HEATER_4_INVERTING); + OUT_WRITE(HEATER_3_PIN, HEATER_4_INVERTING); #endif - #if HAS_HEATER_5 - OUT_WRITE(HEATER_5_PIN, HEATER_5_INVERTING); - #endif - #if HAS_HEATER_6 - OUT_WRITE(HEATER_6_PIN, HEATER_6_INVERTING); - #endif - #if HAS_HEATER_7 - OUT_WRITE(HEATER_7_PIN, HEATER_7_INVERTING); - #endif - #if HAS_HEATED_BED - #ifdef ALFAWISE_UX0 - OUT_WRITE_OD(HEATER_BED_PIN, HEATER_BED_INVERTING); - #else - OUT_WRITE(HEATER_BED_PIN, HEATER_BED_INVERTING); - #endif - #endif - - #if HAS_HEATED_CHAMBER - OUT_WRITE(HEATER_CHAMBER_PIN, HEATER_CHAMBER_INVERTING); + OUT_WRITE(HEATER_BED_PIN, HEATER_BED_INVERTING); #endif #if HAS_FAN0 - INIT_FAN_PIN(FAN_PIN); - #endif - #if HAS_FAN1 - INIT_FAN_PIN(FAN1_PIN); - #endif - #if HAS_FAN2 - INIT_FAN_PIN(FAN2_PIN); - #endif - #if HAS_FAN3 - INIT_FAN_PIN(FAN3_PIN); - #endif - #if HAS_FAN4 - INIT_FAN_PIN(FAN4_PIN); - #endif - #if HAS_FAN5 - INIT_FAN_PIN(FAN5_PIN); - #endif - #if HAS_FAN6 - INIT_FAN_PIN(FAN6_PIN); - #endif - #if HAS_FAN7 - INIT_FAN_PIN(FAN7_PIN); - #endif - #if ENABLED(USE_CONTROLLER_FAN) - INIT_FAN_PIN(CONTROLLER_FAN_PIN); + SET_OUTPUT(FAN_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif #endif - #if MAX6675_SEPARATE_SPI + #if HAS_FAN1 + SET_OUTPUT(FAN1_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(FAN1_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #endif + + #if HAS_FAN2 + SET_OUTPUT(FAN2_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(FAN2_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #endif + + #if ENABLED(HEATER_0_USES_MAX6675) OUT_WRITE(SCK_PIN, LOW); OUT_WRITE(MOSI_PIN, HIGH); @@ -1792,13 +1172,9 @@ void Temperature::init() { max6675_spi.init(); OUT_WRITE(SS_PIN, HIGH); - OUT_WRITE(MAX6675_SS_PIN, HIGH); + OUT_WRITE(MAX6675_SS, HIGH); - #endif - - #if ENABLED(HEATER_1_USES_MAX6675) - OUT_WRITE(MAX6675_SS2_PIN, HIGH); - #endif + #endif // HEATER_0_USES_MAX6675 HAL_adc_init(); @@ -1817,625 +1193,566 @@ void Temperature::init() { #if HAS_TEMP_ADC_4 HAL_ANALOG_SELECT(TEMP_4_PIN); #endif - #if HAS_TEMP_ADC_5 - HAL_ANALOG_SELECT(TEMP_5_PIN); - #endif - #if HAS_TEMP_ADC_6 - HAL_ANALOG_SELECT(TEMP_6_PIN); - #endif - #if HAS_TEMP_ADC_7 - HAL_ANALOG_SELECT(TEMP_7_PIN); - #endif - #if HAS_JOY_ADC_X - HAL_ANALOG_SELECT(JOY_X_PIN); - #endif - #if HAS_JOY_ADC_Y - HAL_ANALOG_SELECT(JOY_Y_PIN); - #endif - #if HAS_JOY_ADC_Z - HAL_ANALOG_SELECT(JOY_Z_PIN); - #endif - #if HAS_JOY_ADC_EN - SET_INPUT_PULLUP(JOY_EN_PIN); - #endif #if HAS_HEATED_BED HAL_ANALOG_SELECT(TEMP_BED_PIN); #endif #if HAS_TEMP_CHAMBER HAL_ANALOG_SELECT(TEMP_CHAMBER_PIN); #endif - #if HAS_TEMP_PROBE - HAL_ANALOG_SELECT(TEMP_PROBE_PIN); - #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) HAL_ANALOG_SELECT(FILWIDTH_PIN); #endif - #if HAS_ADC_BUTTONS - HAL_ANALOG_SELECT(ADC_KEYPAD_PIN); - #endif - #if ENABLED(POWER_MONITOR_CURRENT) - HAL_ANALOG_SELECT(POWER_MONITOR_CURRENT_PIN); - #endif - #if ENABLED(POWER_MONITOR_VOLTAGE) - HAL_ANALOG_SELECT(POWER_MONITOR_VOLTAGE_PIN); - #endif HAL_timer_start(TEMP_TIMER_NUM, TEMP_TIMER_FREQUENCY); ENABLE_TEMPERATURE_INTERRUPT(); #if HAS_AUTO_FAN_0 - INIT_E_AUTO_FAN_PIN(E0_AUTO_FAN_PIN); + #if E0_AUTO_FAN_PIN == FAN1_PIN + SET_OUTPUT(E0_AUTO_FAN_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(E0_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #else + SET_OUTPUT(E0_AUTO_FAN_PIN); + #endif #endif - #if HAS_AUTO_FAN_1 && !_EFANOVERLAP(1,0) - INIT_E_AUTO_FAN_PIN(E1_AUTO_FAN_PIN); + #if HAS_AUTO_FAN_1 && !AUTO_1_IS_0 + #if E1_AUTO_FAN_PIN == FAN1_PIN + SET_OUTPUT(E1_AUTO_FAN_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(E1_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #else + SET_OUTPUT(E1_AUTO_FAN_PIN); + #endif #endif - #if HAS_AUTO_FAN_2 && !(_EFANOVERLAP(2,0) || _EFANOVERLAP(2,1)) - INIT_E_AUTO_FAN_PIN(E2_AUTO_FAN_PIN); + #if HAS_AUTO_FAN_2 && !AUTO_2_IS_0 && !AUTO_2_IS_1 + #if E2_AUTO_FAN_PIN == FAN1_PIN + SET_OUTPUT(E2_AUTO_FAN_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(E2_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #else + SET_OUTPUT(E2_AUTO_FAN_PIN); + #endif #endif - #if HAS_AUTO_FAN_3 && !(_EFANOVERLAP(3,0) || _EFANOVERLAP(3,1) || _EFANOVERLAP(3,2)) - INIT_E_AUTO_FAN_PIN(E3_AUTO_FAN_PIN); + #if HAS_AUTO_FAN_3 && !AUTO_3_IS_0 && !AUTO_3_IS_1 && !AUTO_3_IS_2 + #if E3_AUTO_FAN_PIN == FAN1_PIN + SET_OUTPUT(E3_AUTO_FAN_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(E3_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #else + SET_OUTPUT(E3_AUTO_FAN_PIN); + #endif #endif - #if HAS_AUTO_FAN_4 && !(_EFANOVERLAP(4,0) || _EFANOVERLAP(4,1) || _EFANOVERLAP(4,2) || _EFANOVERLAP(4,3)) - INIT_E_AUTO_FAN_PIN(E4_AUTO_FAN_PIN); + #if HAS_AUTO_FAN_4 && !AUTO_4_IS_0 && !AUTO_4_IS_1 && !AUTO_4_IS_2 && !AUTO_4_IS_3 + #if E4_AUTO_FAN_PIN == FAN1_PIN + SET_OUTPUT(E4_AUTO_FAN_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(E4_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #else + SET_OUTPUT(E4_AUTO_FAN_PIN); + #endif #endif - #if HAS_AUTO_FAN_5 && !(_EFANOVERLAP(5,0) || _EFANOVERLAP(5,1) || _EFANOVERLAP(5,2) || _EFANOVERLAP(5,3) || _EFANOVERLAP(5,4)) - INIT_E_AUTO_FAN_PIN(E5_AUTO_FAN_PIN); - #endif - #if HAS_AUTO_FAN_6 && !(_EFANOVERLAP(6,0) || _EFANOVERLAP(6,1) || _EFANOVERLAP(6,2) || _EFANOVERLAP(6,3) || _EFANOVERLAP(6,4) || _EFANOVERLAP(6,5)) - INIT_E_AUTO_FAN_PIN(E6_AUTO_FAN_PIN); - #endif - #if HAS_AUTO_FAN_7 && !(_EFANOVERLAP(7,0) || _EFANOVERLAP(7,1) || _EFANOVERLAP(7,2) || _EFANOVERLAP(7,3) || _EFANOVERLAP(7,4) || _EFANOVERLAP(7,5) || _EFANOVERLAP(7,6)) - INIT_E_AUTO_FAN_PIN(E7_AUTO_FAN_PIN); - #endif - #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E - INIT_CHAMBER_AUTO_FAN_PIN(CHAMBER_AUTO_FAN_PIN); + #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_0 && !AUTO_CHAMBER_IS_1 && !AUTO_CHAMBER_IS_2 && !AUTO_CHAMBER_IS_3 && ! AUTO_CHAMBER_IS_4 + #if CHAMBER_AUTO_FAN_PIN == FAN1_PIN + SET_OUTPUT(CHAMBER_AUTO_FAN_PIN); + #if ENABLED(FAST_PWM_FAN) + setPwmFrequency(CHAMBER_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + #endif + #else + SET_OUTPUT(CHAMBER_AUTO_FAN_PIN); + #endif #endif // Wait for temperature measurement to settle delay(250); - #if HAS_HOTEND + #define TEMP_MIN_ROUTINE(NR) \ + minttemp[NR] = HEATER_ ##NR## _MINTEMP; \ + while (analog2temp(minttemp_raw[NR], NR) < HEATER_ ##NR## _MINTEMP) { \ + if (HEATER_ ##NR## _RAW_LO_TEMP < HEATER_ ##NR## _RAW_HI_TEMP) \ + minttemp_raw[NR] += OVERSAMPLENR; \ + else \ + minttemp_raw[NR] -= OVERSAMPLENR; \ + } + #define TEMP_MAX_ROUTINE(NR) \ + maxttemp[NR] = HEATER_ ##NR## _MAXTEMP; \ + while (analog2temp(maxttemp_raw[NR], NR) > HEATER_ ##NR## _MAXTEMP) { \ + if (HEATER_ ##NR## _RAW_LO_TEMP < HEATER_ ##NR## _RAW_HI_TEMP) \ + maxttemp_raw[NR] -= OVERSAMPLENR; \ + else \ + maxttemp_raw[NR] += OVERSAMPLENR; \ + } - #define _TEMP_MIN_E(NR) do{ \ - const int16_t tmin = _MAX(HEATER_ ##NR## _MINTEMP, TERN(HEATER_##NR##_USER_THERMISTOR, 0, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MINTEMP_IND].celsius))); \ - temp_range[NR].mintemp = tmin; \ - while (analog_to_celsius_hotend(temp_range[NR].raw_min, NR) < tmin) \ - temp_range[NR].raw_min += TEMPDIR(NR) * (OVERSAMPLENR); \ - }while(0) - #define _TEMP_MAX_E(NR) do{ \ - const int16_t tmax = _MIN(HEATER_ ##NR## _MAXTEMP, TERN(HEATER_##NR##_USER_THERMISTOR, 2000, (int16_t)pgm_read_word(&HEATER_ ##NR## _TEMPTABLE[HEATER_ ##NR## _SENSOR_MAXTEMP_IND].celsius) - 1)); \ - temp_range[NR].maxtemp = tmax; \ - while (analog_to_celsius_hotend(temp_range[NR].raw_max, NR) > tmax) \ - temp_range[NR].raw_max -= TEMPDIR(NR) * (OVERSAMPLENR); \ - }while(0) - - #define _MINMAX_TEST(N,M) (HOTENDS > N && THERMISTOR_HEATER_##N && THERMISTOR_HEATER_##N != 998 && THERMISTOR_HEATER_##N != 999 && defined(HEATER_##N##_##M##TEMP)) - - #if _MINMAX_TEST(0, MIN) - _TEMP_MIN_E(0); + #ifdef HEATER_0_MINTEMP + TEMP_MIN_ROUTINE(0); + #endif + #ifdef HEATER_0_MAXTEMP + TEMP_MAX_ROUTINE(0); + #endif + #if HOTENDS > 1 + #ifdef HEATER_1_MINTEMP + TEMP_MIN_ROUTINE(1); #endif - #if _MINMAX_TEST(0, MAX) - _TEMP_MAX_E(0); + #ifdef HEATER_1_MAXTEMP + TEMP_MAX_ROUTINE(1); #endif - #if _MINMAX_TEST(1, MIN) - _TEMP_MIN_E(1); - #endif - #if _MINMAX_TEST(1, MAX) - _TEMP_MAX_E(1); - #endif - #if _MINMAX_TEST(2, MIN) - _TEMP_MIN_E(2); - #endif - #if _MINMAX_TEST(2, MAX) - _TEMP_MAX_E(2); - #endif - #if _MINMAX_TEST(3, MIN) - _TEMP_MIN_E(3); - #endif - #if _MINMAX_TEST(3, MAX) - _TEMP_MAX_E(3); - #endif - #if _MINMAX_TEST(4, MIN) - _TEMP_MIN_E(4); - #endif - #if _MINMAX_TEST(4, MAX) - _TEMP_MAX_E(4); - #endif - #if _MINMAX_TEST(5, MIN) - _TEMP_MIN_E(5); - #endif - #if _MINMAX_TEST(5, MAX) - _TEMP_MAX_E(5); - #endif - #if _MINMAX_TEST(6, MIN) - _TEMP_MIN_E(6); - #endif - #if _MINMAX_TEST(6, MAX) - _TEMP_MAX_E(6); - #endif - #if _MINMAX_TEST(7, MIN) - _TEMP_MIN_E(7); - #endif - #if _MINMAX_TEST(7, MAX) - _TEMP_MAX_E(7); - #endif - - #endif // HAS_HOTEND + #if HOTENDS > 2 + #ifdef HEATER_2_MINTEMP + TEMP_MIN_ROUTINE(2); + #endif + #ifdef HEATER_2_MAXTEMP + TEMP_MAX_ROUTINE(2); + #endif + #if HOTENDS > 3 + #ifdef HEATER_3_MINTEMP + TEMP_MIN_ROUTINE(3); + #endif + #ifdef HEATER_3_MAXTEMP + TEMP_MAX_ROUTINE(3); + #endif + #if HOTENDS > 4 + #ifdef HEATER_4_MINTEMP + TEMP_MIN_ROUTINE(4); + #endif + #ifdef HEATER_4_MAXTEMP + TEMP_MAX_ROUTINE(4); + #endif + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 #if HAS_HEATED_BED #ifdef BED_MINTEMP - while (analog_to_celsius_bed(mintemp_raw_BED) < BED_MINTEMP) mintemp_raw_BED += TEMPDIR(BED) * (OVERSAMPLENR); - #endif + while (analog2tempBed(bed_minttemp_raw) < BED_MINTEMP) { + #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP + bed_minttemp_raw += OVERSAMPLENR; + #else + bed_minttemp_raw -= OVERSAMPLENR; + #endif + } + #endif // BED_MINTEMP #ifdef BED_MAXTEMP - while (analog_to_celsius_bed(maxtemp_raw_BED) > BED_MAXTEMP) maxtemp_raw_BED -= TEMPDIR(BED) * (OVERSAMPLENR); - #endif + while (analog2tempBed(bed_maxttemp_raw) > BED_MAXTEMP) { + #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP + bed_maxttemp_raw -= OVERSAMPLENR; + #else + bed_maxttemp_raw += OVERSAMPLENR; + #endif + } + #endif // BED_MAXTEMP #endif // HAS_HEATED_BED - #if HAS_HEATED_CHAMBER - #ifdef CHAMBER_MINTEMP - while (analog_to_celsius_chamber(mintemp_raw_CHAMBER) < CHAMBER_MINTEMP) mintemp_raw_CHAMBER += TEMPDIR(CHAMBER) * (OVERSAMPLENR); - #endif - #ifdef CHAMBER_MAXTEMP - while (analog_to_celsius_chamber(maxtemp_raw_CHAMBER) > CHAMBER_MAXTEMP) maxtemp_raw_CHAMBER -= TEMPDIR(CHAMBER) * (OVERSAMPLENR); - #endif + #if ENABLED(PROBING_HEATERS_OFF) + paused = false; #endif - - TERN_(PROBING_HEATERS_OFF, paused = false); } +#if ENABLED(FAST_PWM_FAN) + + void Temperature::setPwmFrequency(const pin_t pin, int val) { + #if defined(ARDUINO) && !defined(ARDUINO_ARCH_SAM) + val &= 0x07; + switch (digitalPinToTimer(pin)) { + #ifdef TCCR0A + #if !AVR_AT90USB1286_FAMILY + case TIMER0A: + #endif + case TIMER0B: //_SET_CS(0, val); + break; + #endif + #ifdef TCCR1A + case TIMER1A: case TIMER1B: //_SET_CS(1, val); + break; + #endif + #if defined(TCCR2) || defined(TCCR2A) + #ifdef TCCR2 + case TIMER2: + #endif + #ifdef TCCR2A + case TIMER2A: case TIMER2B: + #endif + _SET_CS(2, val); break; + #endif + #ifdef TCCR3A + case TIMER3A: case TIMER3B: case TIMER3C: _SET_CS(3, val); break; + #endif + #ifdef TCCR4A + case TIMER4A: case TIMER4B: case TIMER4C: _SET_CS(4, val); break; + #endif + #ifdef TCCR5A + case TIMER5A: case TIMER5B: case TIMER5C: _SET_CS(5, val); break; + #endif + } + #endif + } + +#endif // FAST_PWM_FAN + #if WATCH_HOTENDS /** * Start Heating Sanity Check for hotends that are below * their target temperature by a configurable margin. * This is called when the temperature is set. (M104, M109) */ - void Temperature::start_watching_hotend(const uint8_t E_NAME) { - const uint8_t ee = HOTEND_INDEX; - watch_hotend[ee].restart(degHotend(ee), degTargetHotend(ee)); + void Temperature::start_watching_heater(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif + if (degHotend(HOTEND_INDEX) < degTargetHotend(HOTEND_INDEX) - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1)) { + watch_target_temp[HOTEND_INDEX] = degHotend(HOTEND_INDEX) + WATCH_TEMP_INCREASE; + watch_heater_next_ms[HOTEND_INDEX] = millis() + (WATCH_TEMP_PERIOD) * 1000UL; + } + else + watch_heater_next_ms[HOTEND_INDEX] = 0; } #endif -#if WATCH_BED +#if WATCH_THE_BED /** * Start Heating Sanity Check for hotends that are below * their target temperature by a configurable margin. * This is called when the temperature is set. (M140, M190) */ void Temperature::start_watching_bed() { - watch_bed.restart(degBed(), degTargetBed()); + if (degBed() < degTargetBed() - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { + watch_target_bed_temp = degBed() + WATCH_BED_TEMP_INCREASE; + watch_bed_next_ms = millis() + (WATCH_BED_TEMP_PERIOD) * 1000UL; + } + else + watch_bed_next_ms = 0; } #endif -#if WATCH_CHAMBER - /** - * Start Heating Sanity Check for chamber that is below - * its target temperature by a configurable margin. - * This is called when the temperature is set. (M141, M191) - */ - void Temperature::start_watching_chamber() { - watch_chamber.restart(degChamber(), degTargetChamber()); - } -#endif +#if ENABLED(THERMAL_PROTECTION_HOTENDS) || HAS_THERMALLY_PROTECTED_BED -#if HAS_THERMAL_PROTECTION + #if ENABLED(THERMAL_PROTECTION_HOTENDS) + Temperature::TRState Temperature::thermal_runaway_state_machine[HOTENDS] = { TRInactive }; + millis_t Temperature::thermal_runaway_timer[HOTENDS] = { 0 }; + #endif - Temperature::tr_state_machine_t Temperature::tr_state_machine[NR_HEATER_RUNAWAY]; // = { { TRInactive, 0 } }; + #if HAS_THERMALLY_PROTECTED_BED + Temperature::TRState Temperature::thermal_runaway_bed_state_machine = TRInactive; + millis_t Temperature::thermal_runaway_bed_timer; + #endif - /** - * @brief Thermal Runaway state machine for a single heater - * @param current current measured temperature - * @param target current target temperature - * @param heater_id extruder index - * @param period_seconds missed temperature allowed time - * @param hysteresis_degc allowed distance from target - * - * TODO: Embed the last 3 parameters during init, if not less optimal - */ - void Temperature::tr_state_machine_t::run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc) { + void Temperature::thermal_runaway_protection(Temperature::TRState * const state, millis_t * const timer, const float ¤t, const float &target, const int8_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc) { - #if HEATER_IDLE_HANDLER - // Convert the given heater_id_t to an idle array index - const IdleIndex idle_index = idle_index_for_id(heater_id); - #endif + static float tr_target_temperature[HOTENDS + 1] = { 0.0 }; /** - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Thermal Runaway Running. Heater ID: "); - switch (heater_id) { - case H_BED: SERIAL_ECHOPGM("bed"); break; - case H_CHAMBER: SERIAL_ECHOPGM("chamber"); break; - default: SERIAL_ECHO(heater_id); - } - SERIAL_ECHOLNPAIR( - " ; sizeof(running_temp):", sizeof(running_temp), - " ; State:", state, " ; Timer:", timer, " ; Temperature:", current, " ; Target Temp:", target - #if HEATER_IDLE_HANDLER - , " ; Idle Timeout:", heater_idle[idle_index].timed_out - #endif - ); - //*/ + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Thermal Thermal Runaway Running. Heater ID: "); + if (heater_id < 0) SERIAL_ECHOPGM("bed"); else SERIAL_ECHO(heater_id); + SERIAL_ECHOPAIR(" ; State:", *state); + SERIAL_ECHOPAIR(" ; Timer:", *timer); + SERIAL_ECHOPAIR(" ; Temperature:", current); + SERIAL_ECHOPAIR(" ; Target Temp:", target); + if (heater_id >= 0) + SERIAL_ECHOPAIR(" ; Idle Timeout:", heater_idle_timeout_exceeded[heater_id]); + else + SERIAL_ECHOPAIR(" ; Idle Timeout:", bed_idle_timeout_exceeded); + SERIAL_EOL(); + */ + + const int heater_index = heater_id >= 0 ? heater_id : HOTENDS; #if HEATER_IDLE_HANDLER // If the heater idle timeout expires, restart - if (heater_idle[idle_index].timed_out) { - state = TRInactive; - running_temp = 0; + if ((heater_id >= 0 && heater_idle_timeout_exceeded[heater_id]) + #if HAS_HEATED_BED + || (heater_id < 0 && bed_idle_timeout_exceeded) + #endif + ) { + *state = TRInactive; + tr_target_temperature[heater_index] = 0; } else #endif { // If the target temperature changes, restart - if (running_temp != target) { - running_temp = target; - state = target > 0 ? TRFirstHeating : TRInactive; + if (tr_target_temperature[heater_index] != target) { + tr_target_temperature[heater_index] = target; + *state = target > 0 ? TRFirstHeating : TRInactive; } } - switch (state) { + switch (*state) { // Inactive state waits for a target temperature to be set case TRInactive: break; - // When first heating, wait for the temperature to be reached then go to Stable state case TRFirstHeating: - if (current < running_temp) break; - state = TRStable; - + if (current < tr_target_temperature[heater_index]) break; + *state = TRStable; // While the temperature is stable watch for a bad temperature case TRStable: - - #if ENABLED(ADAPTIVE_FAN_SLOWING) - if (adaptive_fan_slowing && heater_id >= 0) { - const int fan_index = _MIN(heater_id, FAN_COUNT - 1); - if (fan_speed[fan_index] == 0 || current >= running_temp - (hysteresis_degc * 0.25f)) - fan_speed_scaler[fan_index] = 128; - else if (current >= running_temp - (hysteresis_degc * 0.3335f)) - fan_speed_scaler[fan_index] = 96; - else if (current >= running_temp - (hysteresis_degc * 0.5f)) - fan_speed_scaler[fan_index] = 64; - else if (current >= running_temp - (hysteresis_degc * 0.8f)) - fan_speed_scaler[fan_index] = 32; - else - fan_speed_scaler[fan_index] = 0; - } - #endif - - if (current >= running_temp - hysteresis_degc) { - timer = millis() + SEC_TO_MS(period_seconds); + if (current >= tr_target_temperature[heater_index] - hysteresis_degc) { + *timer = millis() + period_seconds * 1000UL; break; } - else if (PENDING(millis(), timer)) break; - state = TRRunaway; - + else if (PENDING(millis(), *timer)) break; + *state = TRRunaway; case TRRunaway: - TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); - _temp_error(heater_id, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); + _temp_error(heater_id, PSTR(MSG_T_THERMAL_RUNAWAY), TEMP_ERR_PSTR(MSG_THERMAL_RUNAWAY, heater_id)); } } -#endif // HAS_THERMAL_PROTECTION +#endif // THERMAL_PROTECTION_HOTENDS || THERMAL_PROTECTION_BED void Temperature::disable_all_heaters() { - TERN_(AUTOTEMP, planner.autotemp_enabled = false); - - // Unpause and reset everything - TERN_(PROBING_HEATERS_OFF, pause(false)); - - #if HAS_HOTEND - HOTEND_LOOP() { - setTargetHotend(0, e); - temp_hotend[e].soft_pwm_amount = 0; - } + #if ENABLED(AUTOTEMP) + planner.autotemp_enabled = false; #endif - #if HAS_TEMP_HOTEND - #define DISABLE_HEATER(N) WRITE_HEATER_##N(LOW); - REPEAT(HOTENDS, DISABLE_HEATER); - #endif + HOTEND_LOOP() setTargetHotend(0, e); #if HAS_HEATED_BED setTargetBed(0); - temp_bed.soft_pwm_amount = 0; - WRITE_HEATER_BED(LOW); #endif - #if HAS_HEATED_CHAMBER - setTargetChamber(0); - temp_chamber.soft_pwm_amount = 0; - WRITE_HEATER_CHAMBER(LOW); + // Unpause and reset everything + #if ENABLED(PROBING_HEATERS_OFF) + pause(false); + #endif + + // If all heaters go down then for sure our print job has stopped + print_job_timer.stop(); + + #define DISABLE_HEATER(NR) { \ + setTargetHotend(0, NR); \ + soft_pwm_amount[NR] = 0; \ + WRITE_HEATER_ ##NR (LOW); \ + } + + #if HAS_TEMP_HOTEND + DISABLE_HEATER(0); + #if HOTENDS > 1 + DISABLE_HEATER(1); + #if HOTENDS > 2 + DISABLE_HEATER(2); + #if HOTENDS > 3 + DISABLE_HEATER(3); + #if HOTENDS > 4 + DISABLE_HEATER(4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 + #endif + + #if HAS_HEATED_BED + target_temperature_bed = 0; + soft_pwm_amount_bed = 0; + #if HAS_HEATED_BED + WRITE_HEATER_BED(LOW); + #endif #endif } -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - - bool Temperature::over_autostart_threshold() { - #if HAS_HOTEND - HOTEND_LOOP() if (degTargetHotend(e) > (EXTRUDE_MINTEMP) / 2) return true; - #endif - return TERN0(HAS_HEATED_BED, degTargetBed() > BED_MINTEMP) - || TERN0(HAS_HEATED_CHAMBER, degTargetChamber() > CHAMBER_MINTEMP); - } - - void Temperature::check_timer_autostart(const bool can_start, const bool can_stop) { - if (over_autostart_threshold()) { - if (can_start) startOrResumeJob(); - } - else if (can_stop) { - print_job_timer.stop(); - ui.reset_status(); - } - } - -#endif - - #if ENABLED(PROBING_HEATERS_OFF) void Temperature::pause(const bool p) { if (p != paused) { paused = p; if (p) { - HOTEND_LOOP() heater_idle[e].expire(); // Timeout immediately - TERN_(HAS_HEATED_BED, heater_idle[IDLE_INDEX_BED].expire()); // Timeout immediately + HOTEND_LOOP() start_heater_idle_timer(e, 0); // timeout immediately + #if HAS_HEATED_BED + start_bed_idle_timer(0); // timeout immediately + #endif } else { - HOTEND_LOOP() reset_hotend_idle_timer(e); - TERN_(HAS_HEATED_BED, reset_bed_idle_timer()); + HOTEND_LOOP() reset_heater_idle_timer(e); + #if HAS_HEATED_BED + reset_bed_idle_timer(); + #endif } } } #endif // PROBING_HEATERS_OFF -#if HAS_MAX6675 +#if ENABLED(HEATER_0_USES_MAX6675) - #ifndef THERMOCOUPLE_MAX_ERRORS - #define THERMOCOUPLE_MAX_ERRORS 15 + #define MAX6675_HEAT_INTERVAL 250u + + #if ENABLED(MAX6675_IS_MAX31855) + uint32_t max6675_temp = 2000; + #define MAX6675_ERROR_MASK 7 + #define MAX6675_DISCARD_BITS 18 + #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 + #else + uint16_t max6675_temp = 2000; + #define MAX6675_ERROR_MASK 4 + #define MAX6675_DISCARD_BITS 3 + #define MAX6675_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16 #endif - int Temperature::read_max6675( - #if COUNT_6675 > 1 - const uint8_t hindex - #endif - ) { - #if COUNT_6675 == 1 - constexpr uint8_t hindex = 0; - #else - // Needed to return the correct temp when this is called too soon - static uint16_t max6675_temp_previous[COUNT_6675] = { 0 }; - #endif + int Temperature::read_max6675() { - static uint8_t max6675_errors[COUNT_6675] = { 0 }; + static millis_t next_max6675_ms = 0; - #define MAX6675_HEAT_INTERVAL 250UL - - #if ENABLED(MAX6675_IS_MAX31855) - static uint32_t max6675_temp = 2000; - #define MAX6675_ERROR_MASK 7 - #define MAX6675_DISCARD_BITS 18 - #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 - #else - static uint16_t max6675_temp = 2000; - #define MAX6675_ERROR_MASK 4 - #define MAX6675_DISCARD_BITS 3 - #define MAX6675_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16 - #endif - - // Return last-read value between readings - static millis_t next_max6675_ms[COUNT_6675] = { 0 }; millis_t ms = millis(); - if (PENDING(ms, next_max6675_ms[hindex])) - return int( - #if COUNT_6675 == 1 - max6675_temp - #else - max6675_temp_previous[hindex] // Need to return the correct previous value - #endif - ); - next_max6675_ms[hindex] = ms + MAX6675_HEAT_INTERVAL; + if (PENDING(ms, next_max6675_ms)) return (int)max6675_temp; - #if ENABLED(MAX6675_IS_MAX31865) - max6675_temp = int(max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS)); - #endif + next_max6675_ms = ms + MAX6675_HEAT_INTERVAL; - // - // TODO: spiBegin, spiRec and spiInit doesn't work when soft spi is used. - // - #if !MAX6675_SEPARATE_SPI - spiBegin(); - spiInit(MAX6675_SPEED_BITS); - #endif + spiBegin(); + spiInit(MAX6675_SPEED_BITS); - #if COUNT_6675 > 1 - #define WRITE_MAX6675(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0) - #define SET_OUTPUT_MAX6675() do{ switch (hindex) { case 1: SET_OUTPUT(MAX6675_SS2_PIN); break; default: SET_OUTPUT(MAX6675_SS_PIN); } }while(0) - #elif ENABLED(HEATER_1_USES_MAX6675) - #define WRITE_MAX6675(V) WRITE(MAX6675_SS2_PIN, V) - #define SET_OUTPUT_MAX6675() SET_OUTPUT(MAX6675_SS2_PIN) - #else - #define WRITE_MAX6675(V) WRITE(MAX6675_SS_PIN, V) - #define SET_OUTPUT_MAX6675() SET_OUTPUT(MAX6675_SS_PIN) - #endif - - SET_OUTPUT_MAX6675(); - WRITE_MAX6675(LOW); // enable TT_MAX6675 + WRITE(MAX6675_SS, 0); // enable TT_MAX6675 DELAY_NS(100); // Ensure 100ns delay // Read a big-endian temperature value max6675_temp = 0; for (uint8_t i = sizeof(max6675_temp); i--;) { - max6675_temp |= ( - #if MAX6675_SEPARATE_SPI - max6675_spi.receive() - #else - spiRec() - #endif - ); + max6675_temp |= spiRec(); if (i > 0) max6675_temp <<= 8; // shift left if not the last byte } - WRITE_MAX6675(HIGH); // disable TT_MAX6675 + WRITE(MAX6675_SS, 1); // disable TT_MAX6675 - if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK)) { - max6675_errors[hindex] += 1; - if (max6675_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) { - SERIAL_ERROR_START(); - SERIAL_ECHOPGM("Temp measurement error! "); - #if MAX6675_ERROR_MASK == 7 - SERIAL_ECHOPGM("MAX31855 "); - if (max6675_temp & 1) - SERIAL_ECHOLNPGM("Open Circuit"); - else if (max6675_temp & 2) - SERIAL_ECHOLNPGM("Short to GND"); - else if (max6675_temp & 4) - SERIAL_ECHOLNPGM("Short to VCC"); - #else - SERIAL_ECHOLNPGM("MAX6675"); - #endif - - // Thermocouple open - max6675_temp = 4 * ( - #if COUNT_6675 > 1 - hindex ? HEATER_1_MAX6675_TMAX : HEATER_0_MAX6675_TMAX - #else - TERN(HEATER_1_USES_MAX6675, HEATER_1_MAX6675_TMAX, HEATER_0_MAX6675_TMAX) - #endif - ); - } - else - max6675_temp >>= MAX6675_DISCARD_BITS; + if (max6675_temp & MAX6675_ERROR_MASK) { + SERIAL_ERROR_START(); + SERIAL_ERRORPGM("Temp measurement error! "); + #if MAX6675_ERROR_MASK == 7 + SERIAL_ERRORPGM("MAX31855 "); + if (max6675_temp & 1) + SERIAL_ERRORLNPGM("Open Circuit"); + else if (max6675_temp & 2) + SERIAL_ERRORLNPGM("Short to GND"); + else if (max6675_temp & 4) + SERIAL_ERRORLNPGM("Short to VCC"); + #else + SERIAL_ERRORLNPGM("MAX6675"); + #endif + max6675_temp = MAX6675_TMAX * 4; // thermocouple open } - else { + else max6675_temp >>= MAX6675_DISCARD_BITS; - max6675_errors[hindex] = 0; - } + #if ENABLED(MAX6675_IS_MAX31855) + // Support negative temperature + if (max6675_temp & 0x00002000) max6675_temp |= 0xFFFFC000; + #endif - #if ENABLED(MAX6675_IS_MAX31855) - if (max6675_temp & 0x00002000) max6675_temp |= 0xFFFFC000; // Support negative temperature - #endif - - #if COUNT_6675 > 1 - max6675_temp_previous[hindex] = max6675_temp; - #endif - - return int(max6675_temp); + return (int)max6675_temp; } -#endif // HAS_MAX6675 +#endif // HEATER_0_USES_MAX6675 /** - * Update raw temperatures + * Get raw temperatures */ -void Temperature::update_raw_temperatures() { - +void Temperature::set_current_temp_raw() { #if HAS_TEMP_ADC_0 && DISABLED(HEATER_0_USES_MAX6675) - temp_hotend[0].update(); + current_temperature_raw[0] = raw_temp_value[0]; #endif - #if HAS_TEMP_ADC_1 #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - redundant_temperature_raw = temp_hotend[1].acc; - #elif DISABLED(HEATER_1_USES_MAX6675) - temp_hotend[1].update(); + redundant_temperature_raw = raw_temp_value[1]; + #else + current_temperature_raw[1] = raw_temp_value[1]; + #endif + #if HAS_TEMP_ADC_2 + current_temperature_raw[2] = raw_temp_value[2]; + #if HAS_TEMP_ADC_3 + current_temperature_raw[3] = raw_temp_value[3]; + #if HAS_TEMP_ADC_4 + current_temperature_raw[4] = raw_temp_value[4]; + #endif + #endif #endif #endif - TERN_(HAS_TEMP_ADC_2, temp_hotend[2].update()); - TERN_(HAS_TEMP_ADC_3, temp_hotend[3].update()); - TERN_(HAS_TEMP_ADC_4, temp_hotend[4].update()); - TERN_(HAS_TEMP_ADC_5, temp_hotend[5].update()); - TERN_(HAS_TEMP_ADC_6, temp_hotend[6].update()); - TERN_(HAS_TEMP_ADC_7, temp_hotend[7].update()); - TERN_(HAS_HEATED_BED, temp_bed.update()); - TERN_(HAS_TEMP_CHAMBER, temp_chamber.update()); - TERN_(HAS_TEMP_PROBE, temp_probe.update()); - - TERN_(HAS_JOY_ADC_X, joystick.x.update()); - TERN_(HAS_JOY_ADC_Y, joystick.y.update()); - TERN_(HAS_JOY_ADC_Z, joystick.z.update()); - - raw_temps_ready = true; + #if HAS_HEATED_BED + current_temperature_bed_raw = raw_temp_bed_value; + #endif + #if HAS_TEMP_CHAMBER + current_temperature_chamber_raw = raw_temp_chamber_value; + #endif + temp_meas_ready = true; } void Temperature::readings_ready() { - // Update the raw values if they've been read. Else we could be updating them during reading. - if (!raw_temps_ready) update_raw_temperatures(); + if (!temp_meas_ready) set_current_temp_raw(); // Filament Sensor - can be read any time since IIR filtering is used - TERN_(FILAMENT_WIDTH_SENSOR, filwidth.reading_ready()); - - #if HAS_HOTEND - HOTEND_LOOP() temp_hotend[e].reset(); - TERN_(TEMP_SENSOR_1_AS_REDUNDANT, temp_hotend[1].reset()); + #if ENABLED(FILAMENT_WIDTH_SENSOR) + current_raw_filwidth = raw_filwidth_value >> 10; // Divide to get to 0-16384 range since we used 1/128 IIR filter approach #endif - TERN_(HAS_HEATED_BED, temp_bed.reset()); - TERN_(HAS_TEMP_CHAMBER, temp_chamber.reset()); - TERN_(HAS_TEMP_PROBE, temp_probe.reset()); - - TERN_(HAS_JOY_ADC_X, joystick.x.reset()); - TERN_(HAS_JOY_ADC_Y, joystick.y.reset()); - TERN_(HAS_JOY_ADC_Z, joystick.z.reset()); - - #if HAS_HOTEND - - static constexpr int8_t temp_dir[] = { - TERN(HEATER_0_USES_MAX6675, 0, TEMPDIR(0)) - #if HAS_MULTI_HOTEND - , TERN(HEATER_1_USES_MAX6675, 0, TEMPDIR(1)) - #if HOTENDS > 2 - #define _TEMPDIR(N) , TEMPDIR(N) - REPEAT_S(2, HOTENDS, _TEMPDIR) - #endif - #endif - }; - - LOOP_L_N(e, COUNT(temp_dir)) { - const int8_t tdir = temp_dir[e]; - if (tdir) { - const int16_t rawtemp = temp_hotend[e].raw * tdir; // normal direction, +rawtemp, else -rawtemp - const bool heater_on = (temp_hotend[e].target > 0 - || TERN0(PIDTEMP, temp_hotend[e].soft_pwm_amount) > 0 - ); - if (rawtemp > temp_range[e].raw_max * tdir) max_temp_error((heater_id_t)e); - if (heater_on && rawtemp < temp_range[e].raw_min * tdir && !is_preheating(e)) { - #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED - if (++consecutive_low_temperature_error[e] >= MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED) - #endif - min_temp_error((heater_id_t)e); - } - #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED - else - consecutive_low_temperature_error[e] = 0; - #endif - } - } - - #endif // HAS_HOTEND + ZERO(raw_temp_value); #if HAS_HEATED_BED - #if TEMPDIR(BED) < 0 - #define BEDCMP(A,B) ((A)<(B)) - #else - #define BEDCMP(A,B) ((A)>(B)) - #endif - const bool bed_on = (temp_bed.target > 0) || TERN0(PIDTEMPBED, temp_bed.soft_pwm_amount > 0); - if (BEDCMP(temp_bed.raw, maxtemp_raw_BED)) max_temp_error(H_BED); - if (bed_on && BEDCMP(mintemp_raw_BED, temp_bed.raw)) min_temp_error(H_BED); + raw_temp_bed_value = 0; #endif - #if HAS_HEATED_CHAMBER - #if TEMPDIR(CHAMBER) < 0 - #define CHAMBERCMP(A,B) ((A)<(B)) + #if HAS_TEMP_CHAMBER + raw_temp_chamber_value = 0; + #endif + + #define TEMPDIR(N) ((HEATER_##N##_RAW_LO_TEMP) > (HEATER_##N##_RAW_HI_TEMP) ? -1 : 1) + + int constexpr temp_dir[] = { + #if ENABLED(HEATER_0_USES_MAX6675) + 0 #else - #define CHAMBERCMP(A,B) ((A)>(B)) + TEMPDIR(0) #endif - const bool chamber_on = (temp_chamber.target > 0); - if (CHAMBERCMP(temp_chamber.raw, maxtemp_raw_CHAMBER)) max_temp_error(H_CHAMBER); - if (chamber_on && CHAMBERCMP(mintemp_raw_CHAMBER, temp_chamber.raw)) min_temp_error(H_CHAMBER); + #if HOTENDS > 1 + , TEMPDIR(1) + #if HOTENDS > 2 + , TEMPDIR(2) + #if HOTENDS > 3 + , TEMPDIR(3) + #if HOTENDS > 4 + , TEMPDIR(4) + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 + }; + + for (uint8_t e = 0; e < COUNT(temp_dir); e++) { + const int16_t tdir = temp_dir[e], rawtemp = current_temperature_raw[e] * tdir; + const bool heater_on = (target_temperature[e] > 0) + #if ENABLED(PIDTEMP) + || (soft_pwm_amount[e] > 0) + #endif + ; + if (rawtemp > maxttemp_raw[e] * tdir) max_temp_error(e); + if (rawtemp < minttemp_raw[e] * tdir && !is_preheating(e) && heater_on) { + #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED + if (++consecutive_low_temperature_error[e] >= MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED) + #endif + min_temp_error(e); + } + #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED + else + consecutive_low_temperature_error[e] = 0; + #endif + } + + #if HAS_HEATED_BED + #if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP + #define GEBED <= + #else + #define GEBED >= + #endif + const bool bed_on = (target_temperature_bed > 0) + #if ENABLED(PIDTEMPBED) + || (soft_pwm_amount_bed > 0) + #endif + ; + if (current_temperature_bed_raw GEBED bed_maxttemp_raw) max_temp_error(-1); + if (bed_minttemp_raw GEBED current_temperature_bed_raw && bed_on) min_temp_error(-1); #endif } @@ -2454,174 +1771,139 @@ void Temperature::readings_ready() { * - For ENDSTOP_INTERRUPTS_FEATURE check endstops if flagged * - Call planner.tick to count down its "ignore" time */ -HAL_TEMP_TIMER_ISR() { +HAL_TEMP_TIMER_ISR { HAL_timer_isr_prologue(TEMP_TIMER_NUM); - Temperature::tick(); + Temperature::isr(); HAL_timer_isr_epilogue(TEMP_TIMER_NUM); } -#if ENABLED(SLOW_PWM_HEATERS) && !defined(MIN_STATE_TIME) - #define MIN_STATE_TIME 16 // MIN_STATE_TIME * 65.5 = time in milliseconds -#endif - -class SoftPWM { -public: - uint8_t count; - inline bool add(const uint8_t mask, const uint8_t amount) { - count = (count & mask) + amount; return (count > mask); - } - #if ENABLED(SLOW_PWM_HEATERS) - bool state_heater; - uint8_t state_timer_heater; - inline void dec() { if (state_timer_heater > 0) state_timer_heater--; } - inline bool ready(const bool v) { - const bool rdy = !state_timer_heater; - if (rdy && state_heater != v) { - state_heater = v; - state_timer_heater = MIN_STATE_TIME; - } - return rdy; - } - #endif -}; - -/** - * Handle various ~1KHz tasks associated with temperature - * - Heater PWM (~1KHz with scaler) - * - LCD Button polling (~500Hz) - * - Start / Read one ADC sensor - * - Advance Babysteps - * - Endstop polling - * - Planner clean buffer - */ -void Temperature::tick() { +void Temperature::isr() { static int8_t temp_count = -1; static ADCSensorState adc_sensor_state = StartupDelay; static uint8_t pwm_count = _BV(SOFT_PWM_SCALE); - // avoid multiple loads of pwm_count uint8_t pwm_count_tmp = pwm_count; - - #if HAS_ADC_BUTTONS + #if ENABLED(ADC_KEYPAD) static unsigned int raw_ADCKey_value = 0; - static bool ADCKey_pressed = false; #endif - #if HAS_HOTEND - static SoftPWM soft_pwm_hotend[HOTENDS]; + // Static members for each heater + #if ENABLED(SLOW_PWM_HEATERS) + static uint8_t slow_pwm_count = 0; + #define ISR_STATICS(n) \ + static uint8_t soft_pwm_count_ ## n, \ + state_heater_ ## n = 0, \ + state_timer_heater_ ## n = 0 + #else + #define ISR_STATICS(n) static uint8_t soft_pwm_count_ ## n = 0 #endif + // Statics per heater + ISR_STATICS(0); + #if HOTENDS > 1 + ISR_STATICS(1); + #if HOTENDS > 2 + ISR_STATICS(2); + #if HOTENDS > 3 + ISR_STATICS(3); + #if HOTENDS > 4 + ISR_STATICS(4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 #if HAS_HEATED_BED - static SoftPWM soft_pwm_bed; + ISR_STATICS(BED); #endif - #if HAS_HEATED_CHAMBER - static SoftPWM soft_pwm_chamber; + #if ENABLED(FILAMENT_WIDTH_SENSOR) + static unsigned long raw_filwidth_value = 0; #endif #if DISABLED(SLOW_PWM_HEATERS) - - #if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_HEATED_CHAMBER, FAN_SOFT_PWM) - constexpr uint8_t pwm_mask = TERN0(SOFT_PWM_DITHER, _BV(SOFT_PWM_SCALE) - 1); - #define _PWM_MOD(N,S,T) do{ \ - const bool on = S.add(pwm_mask, T.soft_pwm_amount); \ - WRITE_HEATER_##N(on); \ - }while(0) - #endif + constexpr uint8_t pwm_mask = + #if ENABLED(SOFT_PWM_DITHER) + _BV(SOFT_PWM_SCALE) - 1 + #else + 0 + #endif + ; /** - * Standard heater PWM modulation + * Standard PWM modulation */ if (pwm_count_tmp >= 127) { pwm_count_tmp -= 127; - - #if HAS_HOTEND - #define _PWM_MOD_E(N) _PWM_MOD(N,soft_pwm_hotend[N],temp_hotend[N]); - REPEAT(HOTENDS, _PWM_MOD_E); - #endif + soft_pwm_count_0 = (soft_pwm_count_0 & pwm_mask) + soft_pwm_amount[0]; + WRITE_HEATER_0(soft_pwm_count_0 > pwm_mask ? HIGH : LOW); + #if HOTENDS > 1 + soft_pwm_count_1 = (soft_pwm_count_1 & pwm_mask) + soft_pwm_amount[1]; + WRITE_HEATER_1(soft_pwm_count_1 > pwm_mask ? HIGH : LOW); + #if HOTENDS > 2 + soft_pwm_count_2 = (soft_pwm_count_2 & pwm_mask) + soft_pwm_amount[2]; + WRITE_HEATER_2(soft_pwm_count_2 > pwm_mask ? HIGH : LOW); + #if HOTENDS > 3 + soft_pwm_count_3 = (soft_pwm_count_3 & pwm_mask) + soft_pwm_amount[3]; + WRITE_HEATER_3(soft_pwm_count_3 > pwm_mask ? HIGH : LOW); + #if HOTENDS > 4 + soft_pwm_count_4 = (soft_pwm_count_4 & pwm_mask) + soft_pwm_amount[4]; + WRITE_HEATER_4(soft_pwm_count_4 > pwm_mask ? HIGH : LOW); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 #if HAS_HEATED_BED - _PWM_MOD(BED,soft_pwm_bed,temp_bed); - #endif - - #if HAS_HEATED_CHAMBER - _PWM_MOD(CHAMBER,soft_pwm_chamber,temp_chamber); + soft_pwm_count_BED = (soft_pwm_count_BED & pwm_mask) + soft_pwm_amount_bed; + WRITE_HEATER_BED(soft_pwm_count_BED > pwm_mask ? HIGH : LOW); #endif #if ENABLED(FAN_SOFT_PWM) - #define _FAN_PWM(N) do{ \ - uint8_t &spcf = soft_pwm_count_fan[N]; \ - spcf = (spcf & pwm_mask) + (soft_pwm_amount_fan[N] >> 1); \ - WRITE_FAN(N, spcf > pwm_mask ? HIGH : LOW); \ - }while(0) #if HAS_FAN0 - _FAN_PWM(0); + soft_pwm_count_fan[0] = (soft_pwm_count_fan[0] & pwm_mask) + (soft_pwm_amount_fan[0] >> 1); + WRITE_FAN(soft_pwm_count_fan[0] > pwm_mask ? HIGH : LOW); #endif #if HAS_FAN1 - _FAN_PWM(1); + soft_pwm_count_fan[1] = (soft_pwm_count_fan[1] & pwm_mask) + (soft_pwm_amount_fan[1] >> 1); + WRITE_FAN1(soft_pwm_count_fan[1] > pwm_mask ? HIGH : LOW); #endif #if HAS_FAN2 - _FAN_PWM(2); - #endif - #if HAS_FAN3 - _FAN_PWM(3); - #endif - #if HAS_FAN4 - _FAN_PWM(4); - #endif - #if HAS_FAN5 - _FAN_PWM(5); - #endif - #if HAS_FAN6 - _FAN_PWM(6); - #endif - #if HAS_FAN7 - _FAN_PWM(7); + soft_pwm_count_fan[2] = (soft_pwm_count_fan[2] & pwm_mask) + (soft_pwm_amount_fan[2] >> 1); + WRITE_FAN2(soft_pwm_count_fan[2] > pwm_mask ? HIGH : LOW); #endif #endif } else { - #define _PWM_LOW(N,S) do{ if (S.count <= pwm_count_tmp) WRITE_HEATER_##N(LOW); }while(0) - #if HAS_HOTEND - #define _PWM_LOW_E(N) _PWM_LOW(N, soft_pwm_hotend[N]); - REPEAT(HOTENDS, _PWM_LOW_E); - #endif + if (soft_pwm_count_0 <= pwm_count_tmp) WRITE_HEATER_0(LOW); + #if HOTENDS > 1 + if (soft_pwm_count_1 <= pwm_count_tmp) WRITE_HEATER_1(LOW); + #if HOTENDS > 2 + if (soft_pwm_count_2 <= pwm_count_tmp) WRITE_HEATER_2(LOW); + #if HOTENDS > 3 + if (soft_pwm_count_3 <= pwm_count_tmp) WRITE_HEATER_3(LOW); + #if HOTENDS > 4 + if (soft_pwm_count_4 <= pwm_count_tmp) WRITE_HEATER_4(LOW); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 #if HAS_HEATED_BED - _PWM_LOW(BED, soft_pwm_bed); - #endif - - #if HAS_HEATED_CHAMBER - _PWM_LOW(CHAMBER, soft_pwm_chamber); + if (soft_pwm_count_BED <= pwm_count_tmp) WRITE_HEATER_BED(LOW); #endif #if ENABLED(FAN_SOFT_PWM) #if HAS_FAN0 - if (soft_pwm_count_fan[0] <= pwm_count_tmp) WRITE_FAN(0, LOW); + if (soft_pwm_count_fan[0] <= pwm_count_tmp) WRITE_FAN(LOW); #endif #if HAS_FAN1 - if (soft_pwm_count_fan[1] <= pwm_count_tmp) WRITE_FAN(1, LOW); + if (soft_pwm_count_fan[1] <= pwm_count_tmp) WRITE_FAN1(LOW); #endif #if HAS_FAN2 - if (soft_pwm_count_fan[2] <= pwm_count_tmp) WRITE_FAN(2, LOW); - #endif - #if HAS_FAN3 - if (soft_pwm_count_fan[3] <= pwm_count_tmp) WRITE_FAN(3, LOW); - #endif - #if HAS_FAN4 - if (soft_pwm_count_fan[4] <= pwm_count_tmp) WRITE_FAN(4, LOW); - #endif - #if HAS_FAN5 - if (soft_pwm_count_fan[5] <= pwm_count_tmp) WRITE_FAN(5, LOW); - #endif - #if HAS_FAN6 - if (soft_pwm_count_fan[6] <= pwm_count_tmp) WRITE_FAN(6, LOW); - #endif - #if HAS_FAN7 - if (soft_pwm_count_fan[7] <= pwm_count_tmp) WRITE_FAN(7, LOW); + if (soft_pwm_count_fan[2] <= pwm_count_tmp) WRITE_FAN2(LOW); #endif #endif } @@ -2643,97 +1925,100 @@ void Temperature::tick() { * * For relay-driven heaters */ - #define _SLOW_SET(NR,PWM,V) do{ if (PWM.ready(V)) WRITE_HEATER_##NR(V); }while(0) - #define _SLOW_PWM(NR,PWM,SRC) do{ PWM.count = SRC.soft_pwm_amount; _SLOW_SET(NR,PWM,(PWM.count > 0)); }while(0) - #define _PWM_OFF(NR,PWM) do{ if (PWM.count < slow_pwm_count) _SLOW_SET(NR,PWM,0); }while(0) + #ifndef MIN_STATE_TIME + #define MIN_STATE_TIME 16 // MIN_STATE_TIME * 65.5 = time in milliseconds + #endif - static uint8_t slow_pwm_count = 0; + // Macros for Slow PWM timer logic + #define _SLOW_PWM_ROUTINE(NR, src) \ + soft_pwm_count_ ##NR = src; \ + if (soft_pwm_count_ ##NR > 0) { \ + if (state_timer_heater_ ##NR == 0) { \ + if (state_heater_ ##NR == 0) state_timer_heater_ ##NR = MIN_STATE_TIME; \ + state_heater_ ##NR = 1; \ + WRITE_HEATER_ ##NR(1); \ + } \ + } \ + else { \ + if (state_timer_heater_ ##NR == 0) { \ + if (state_heater_ ##NR == 1) state_timer_heater_ ##NR = MIN_STATE_TIME; \ + state_heater_ ##NR = 0; \ + WRITE_HEATER_ ##NR(0); \ + } \ + } + #define SLOW_PWM_ROUTINE(n) _SLOW_PWM_ROUTINE(n, soft_pwm_amount[n]) + + #define PWM_OFF_ROUTINE(NR) \ + if (soft_pwm_count_ ##NR < slow_pwm_count) { \ + if (state_timer_heater_ ##NR == 0) { \ + if (state_heater_ ##NR == 1) state_timer_heater_ ##NR = MIN_STATE_TIME; \ + state_heater_ ##NR = 0; \ + WRITE_HEATER_ ##NR (0); \ + } \ + } if (slow_pwm_count == 0) { - #if HAS_HOTEND - #define _SLOW_PWM_E(N) _SLOW_PWM(N, soft_pwm_hotend[N], temp_hotend[N]); - REPEAT(HOTENDS, _SLOW_PWM_E); - #endif - + SLOW_PWM_ROUTINE(0); + #if HOTENDS > 1 + SLOW_PWM_ROUTINE(1); + #if HOTENDS > 2 + SLOW_PWM_ROUTINE(2); + #if HOTENDS > 3 + SLOW_PWM_ROUTINE(3); + #if HOTENDS > 4 + SLOW_PWM_ROUTINE(4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 #if HAS_HEATED_BED - _SLOW_PWM(BED, soft_pwm_bed, temp_bed); - #endif - - #if HAS_HEATED_CHAMBER - _SLOW_PWM(CHAMBER, soft_pwm_chamber, temp_chamber); + _SLOW_PWM_ROUTINE(BED, soft_pwm_amount_bed); // BED #endif } // slow_pwm_count == 0 - #if HAS_HOTEND - #define _PWM_OFF_E(N) _PWM_OFF(N, soft_pwm_hotend[N]); - REPEAT(HOTENDS, _PWM_OFF_E); - #endif - + PWM_OFF_ROUTINE(0); + #if HOTENDS > 1 + PWM_OFF_ROUTINE(1); + #if HOTENDS > 2 + PWM_OFF_ROUTINE(2); + #if HOTENDS > 3 + PWM_OFF_ROUTINE(3); + #if HOTENDS > 4 + PWM_OFF_ROUTINE(4); + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 #if HAS_HEATED_BED - _PWM_OFF(BED, soft_pwm_bed); - #endif - - #if HAS_HEATED_CHAMBER - _PWM_OFF(CHAMBER, soft_pwm_chamber); + PWM_OFF_ROUTINE(BED); // BED #endif #if ENABLED(FAN_SOFT_PWM) if (pwm_count_tmp >= 127) { pwm_count_tmp = 0; - #define _PWM_FAN(N) do{ \ - soft_pwm_count_fan[N] = soft_pwm_amount_fan[N] >> 1; \ - WRITE_FAN(N, soft_pwm_count_fan[N] > 0 ? HIGH : LOW); \ - }while(0) #if HAS_FAN0 - _PWM_FAN(0); + soft_pwm_count_fan[0] = soft_pwm_amount_fan[0] >> 1; + WRITE_FAN(soft_pwm_count_fan[0] > 0 ? HIGH : LOW); #endif #if HAS_FAN1 - _PWM_FAN(1); + soft_pwm_count_fan[1] = soft_pwm_amount_fan[1] >> 1; + WRITE_FAN1(soft_pwm_count_fan[1] > 0 ? HIGH : LOW); #endif #if HAS_FAN2 - _PWM_FAN(2); - #endif - #if HAS_FAN3 - _FAN_PWM(3); - #endif - #if HAS_FAN4 - _FAN_PWM(4); - #endif - #if HAS_FAN5 - _FAN_PWM(5); - #endif - #if HAS_FAN6 - _FAN_PWM(6); - #endif - #if HAS_FAN7 - _FAN_PWM(7); + soft_pwm_count_fan[2] = soft_pwm_amount_fan[2] >> 1; + WRITE_FAN2(soft_pwm_count_fan[2] > 0 ? HIGH : LOW); #endif } #if HAS_FAN0 - if (soft_pwm_count_fan[0] <= pwm_count_tmp) WRITE_FAN(0, LOW); + if (soft_pwm_count_fan[0] <= pwm_count_tmp) WRITE_FAN(LOW); #endif #if HAS_FAN1 - if (soft_pwm_count_fan[1] <= pwm_count_tmp) WRITE_FAN(1, LOW); + if (soft_pwm_count_fan[1] <= pwm_count_tmp) WRITE_FAN1(LOW); #endif #if HAS_FAN2 - if (soft_pwm_count_fan[2] <= pwm_count_tmp) WRITE_FAN(2, LOW); - #endif - #if HAS_FAN3 - if (soft_pwm_count_fan[3] <= pwm_count_tmp) WRITE_FAN(3, LOW); - #endif - #if HAS_FAN4 - if (soft_pwm_count_fan[4] <= pwm_count_tmp) WRITE_FAN(4, LOW); - #endif - #if HAS_FAN5 - if (soft_pwm_count_fan[5] <= pwm_count_tmp) WRITE_FAN(5, LOW); - #endif - #if HAS_FAN6 - if (soft_pwm_count_fan[6] <= pwm_count_tmp) WRITE_FAN(6, LOW); - #endif - #if HAS_FAN7 - if (soft_pwm_count_fan[7] <= pwm_count_tmp) WRITE_FAN(7, LOW); + if (soft_pwm_count_fan[2] <= pwm_count_tmp) WRITE_FAN2(LOW); #endif #endif // FAN_SOFT_PWM @@ -2753,12 +2038,23 @@ void Temperature::tick() { slow_pwm_count++; slow_pwm_count &= 0x7F; - #if HAS_HOTEND - HOTEND_LOOP() soft_pwm_hotend[e].dec(); + if (state_timer_heater_0 > 0) state_timer_heater_0--; + #if HOTENDS > 1 + if (state_timer_heater_1 > 0) state_timer_heater_1--; + #if HOTENDS > 2 + if (state_timer_heater_2 > 0) state_timer_heater_2--; + #if HOTENDS > 3 + if (state_timer_heater_3 > 0) state_timer_heater_3--; + #if HOTENDS > 4 + if (state_timer_heater_4 > 0) state_timer_heater_4--; + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HOTENDS > 1 + #if HAS_HEATED_BED + if (state_timer_heater_BED > 0) state_timer_heater_BED--; #endif - TERN_(HAS_HEATED_BED, soft_pwm_bed.dec()); - TERN_(HAS_HEATED_CHAMBER, soft_pwm_chamber.dec()); - } + } // ((pwm_count >> SOFT_PWM_SCALE) & 0x3F) == 0 #endif // SLOW_PWM_HEATERS @@ -2766,7 +2062,7 @@ void Temperature::tick() { // Update lcd buttons 488 times per second // static bool do_buttons; - if ((do_buttons ^= true)) ui.update_buttons(); + if ((do_buttons ^= true)) lcd_buttons_update(); /** * One sensor is sampled on every other call of the ISR. @@ -2777,9 +2073,9 @@ void Temperature::tick() { * * This gives each ADC 0.9765ms to charge up. */ - #define ACCUMULATE_ADC(obj) do{ \ + #define ACCUMULATE_ADC(var) do{ \ if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; \ - else obj.sample(HAL_READ_ADC()); \ + else var += HAL_READ_ADC(); \ }while(0) ADCSensorState next_sensor_state = adc_sensor_state < SensorsReady ? (ADCSensorState)(int(adc_sensor_state) + 1) : StartSampling; @@ -2811,128 +2107,103 @@ void Temperature::tick() { break; #if HAS_TEMP_ADC_0 - case PrepareTemp_0: HAL_START_ADC(TEMP_0_PIN); break; - case MeasureTemp_0: ACCUMULATE_ADC(temp_hotend[0]); break; + case PrepareTemp_0: + HAL_START_ADC(TEMP_0_PIN); + break; + case MeasureTemp_0: + ACCUMULATE_ADC(raw_temp_value[0]); + break; #endif #if HAS_HEATED_BED - case PrepareTemp_BED: HAL_START_ADC(TEMP_BED_PIN); break; - case MeasureTemp_BED: ACCUMULATE_ADC(temp_bed); break; + case PrepareTemp_BED: + HAL_START_ADC(TEMP_BED_PIN); + break; + case MeasureTemp_BED: + ACCUMULATE_ADC(raw_temp_bed_value); + break; #endif #if HAS_TEMP_CHAMBER - case PrepareTemp_CHAMBER: HAL_START_ADC(TEMP_CHAMBER_PIN); break; - case MeasureTemp_CHAMBER: ACCUMULATE_ADC(temp_chamber); break; - #endif - - #if HAS_TEMP_PROBE - case PrepareTemp_PROBE: HAL_START_ADC(TEMP_PROBE_PIN); break; - case MeasureTemp_PROBE: ACCUMULATE_ADC(temp_probe); break; + case PrepareTemp_CHAMBER: + HAL_START_ADC(TEMP_CHAMBER_PIN); + break; + case MeasureTemp_CHAMBER: + ACCUMULATE_ADC(raw_temp_chamber_value); + break; #endif #if HAS_TEMP_ADC_1 - case PrepareTemp_1: HAL_START_ADC(TEMP_1_PIN); break; - case MeasureTemp_1: ACCUMULATE_ADC(temp_hotend[1]); break; + case PrepareTemp_1: + HAL_START_ADC(TEMP_1_PIN); + break; + case MeasureTemp_1: + ACCUMULATE_ADC(raw_temp_value[1]); + break; #endif #if HAS_TEMP_ADC_2 - case PrepareTemp_2: HAL_START_ADC(TEMP_2_PIN); break; - case MeasureTemp_2: ACCUMULATE_ADC(temp_hotend[2]); break; + case PrepareTemp_2: + HAL_START_ADC(TEMP_2_PIN); + break; + case MeasureTemp_2: + ACCUMULATE_ADC(raw_temp_value[2]); + break; #endif #if HAS_TEMP_ADC_3 - case PrepareTemp_3: HAL_START_ADC(TEMP_3_PIN); break; - case MeasureTemp_3: ACCUMULATE_ADC(temp_hotend[3]); break; + case PrepareTemp_3: + HAL_START_ADC(TEMP_3_PIN); + break; + case MeasureTemp_3: + ACCUMULATE_ADC(raw_temp_value[3]); + break; #endif #if HAS_TEMP_ADC_4 - case PrepareTemp_4: HAL_START_ADC(TEMP_4_PIN); break; - case MeasureTemp_4: ACCUMULATE_ADC(temp_hotend[4]); break; - #endif - - #if HAS_TEMP_ADC_5 - case PrepareTemp_5: HAL_START_ADC(TEMP_5_PIN); break; - case MeasureTemp_5: ACCUMULATE_ADC(temp_hotend[5]); break; - #endif - - #if HAS_TEMP_ADC_6 - case PrepareTemp_6: HAL_START_ADC(TEMP_6_PIN); break; - case MeasureTemp_6: ACCUMULATE_ADC(temp_hotend[6]); break; - #endif - - #if HAS_TEMP_ADC_7 - case PrepareTemp_7: HAL_START_ADC(TEMP_7_PIN); break; - case MeasureTemp_7: ACCUMULATE_ADC(temp_hotend[7]); break; + case PrepareTemp_4: + HAL_START_ADC(TEMP_4_PIN); + break; + case MeasureTemp_4: + ACCUMULATE_ADC(raw_temp_value[4]); + break; #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) - case Prepare_FILWIDTH: HAL_START_ADC(FILWIDTH_PIN); break; + case Prepare_FILWIDTH: + HAL_START_ADC(FILWIDTH_PIN); + break; case Measure_FILWIDTH: - if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; // Redo this state - else filwidth.accumulate(HAL_READ_ADC()); + if (!HAL_ADC_READY()) + next_sensor_state = adc_sensor_state; // redo this state + else if (HAL_READ_ADC() > 102) { // Make sure ADC is reading > 0.5 volts, otherwise don't read. + raw_filwidth_value -= (raw_filwidth_value >> 7); // Subtract 1/128th of the raw_filwidth_value + raw_filwidth_value += ((unsigned long)HAL_READ_ADC() << 7); // Add new ADC reading, scaled by 128 + } break; #endif - #if ENABLED(POWER_MONITOR_CURRENT) - case Prepare_POWER_MONITOR_CURRENT: - HAL_START_ADC(POWER_MONITOR_CURRENT_PIN); + #if ENABLED(ADC_KEYPAD) + case Prepare_ADC_KEY: + HAL_START_ADC(ADC_KEYPAD_PIN); break; - case Measure_POWER_MONITOR_CURRENT: - if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; // Redo this state - else power_monitor.add_current_sample(HAL_READ_ADC()); - break; - #endif - - #if ENABLED(POWER_MONITOR_VOLTAGE) - case Prepare_POWER_MONITOR_VOLTAGE: - HAL_START_ADC(POWER_MONITOR_VOLTAGE_PIN); - break; - case Measure_POWER_MONITOR_VOLTAGE: - if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; // Redo this state - else power_monitor.add_voltage_sample(HAL_READ_ADC()); - break; - #endif - - #if HAS_JOY_ADC_X - case PrepareJoy_X: HAL_START_ADC(JOY_X_PIN); break; - case MeasureJoy_X: ACCUMULATE_ADC(joystick.x); break; - #endif - - #if HAS_JOY_ADC_Y - case PrepareJoy_Y: HAL_START_ADC(JOY_Y_PIN); break; - case MeasureJoy_Y: ACCUMULATE_ADC(joystick.y); break; - #endif - - #if HAS_JOY_ADC_Z - case PrepareJoy_Z: HAL_START_ADC(JOY_Z_PIN); break; - case MeasureJoy_Z: ACCUMULATE_ADC(joystick.z); break; - #endif - - #if HAS_ADC_BUTTONS - #ifndef ADC_BUTTON_DEBOUNCE_DELAY - #define ADC_BUTTON_DEBOUNCE_DELAY 16 - #endif - case Prepare_ADC_KEY: HAL_START_ADC(ADC_KEYPAD_PIN); break; case Measure_ADC_KEY: if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; // redo this state - else if (ADCKey_count < ADC_BUTTON_DEBOUNCE_DELAY) { + else if (ADCKey_count < 16) { raw_ADCKey_value = HAL_READ_ADC(); - if (raw_ADCKey_value <= 900UL * HAL_ADC_RANGE / 1024UL) { - NOMORE(current_ADCKey_raw, raw_ADCKey_value); + if (raw_ADCKey_value > 900) { + //ADC Key release + ADCKey_count = 0; + current_ADCKey_raw = 0; + } + else { + current_ADCKey_raw += raw_ADCKey_value; ADCKey_count++; } - else { //ADC Key release - if (ADCKey_count > 0) ADCKey_count++; else ADCKey_pressed = false; - if (ADCKey_pressed) { - ADCKey_count = 0; - current_ADCKey_raw = HAL_ADC_RANGE; - } - } } - if (ADCKey_count == ADC_BUTTON_DEBOUNCE_DELAY) ADCKey_pressed = true; break; - #endif // HAS_ADC_BUTTONS + #endif // ADC_KEYPAD case StartupDelay: break; @@ -2945,9 +2216,16 @@ void Temperature::tick() { // Additional ~1KHz Tasks // - #if ENABLED(BABYSTEPPING) && DISABLED(INTEGRATED_BABYSTEPPING) - babystep.task(); - #endif + #if ENABLED(BABYSTEPPING) + LOOP_XYZ(axis) { + const int curTodo = babystepsTodo[axis]; // get rid of volatile for performance + if (curTodo) { + stepper.babystep((AxisEnum)axis, curTodo > 0); + if (curTodo > 0) babystepsTodo[axis]--; + else babystepsTodo[axis]++; + } + } + #endif // BABYSTEPPING // Poll endstops state, if required endstops.poll(); @@ -2964,112 +2242,96 @@ void Temperature::tick() { #if ENABLED(SHOW_TEMP_ADC_VALUES) , const float r #endif - , const heater_id_t e=INDEX_NONE - ) { - char k; - switch (e) { - #if HAS_TEMP_CHAMBER - case H_CHAMBER: k = 'C'; break; - #endif - #if HAS_TEMP_PROBE - case H_PROBE: k = 'P'; break; - #endif - #if HAS_TEMP_HOTEND - default: k = 'T'; break; - #if HAS_HEATED_BED - case H_BED: k = 'B'; break; - #endif - #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - case H_REDUNDANT: k = 'R'; break; - #endif - #elif HAS_HEATED_BED - default: k = 'B'; break; - #endif - } - SERIAL_CHAR(' '); - SERIAL_CHAR(k); - #if HAS_MULTI_HOTEND - if (e >= 0) SERIAL_CHAR('0' + e); + #if NUM_SERIAL > 1 + , const int8_t port=-1 #endif - SERIAL_CHAR(':'); - SERIAL_ECHO(c); - SERIAL_ECHOPAIR(" /" , t); + , const int8_t e=-3 + ) { + #if !(HAS_HEATED_BED && HAS_TEMP_HOTEND && HAS_TEMP_CHAMBER) && HOTENDS <= 1 + UNUSED(e); + #endif + + SERIAL_PROTOCOLCHAR_P(port, ' '); + SERIAL_PROTOCOLCHAR_P(port, + #if HAS_TEMP_CHAMBER && HAS_HEATED_BED && HAS_TEMP_HOTEND + e == -2 ? 'C' : e == -1 ? 'B' : 'T' + #elif HAS_HEATED_BED && HAS_TEMP_HOTEND + e == -1 ? 'B' : 'T' + #elif HAS_TEMP_HOTEND + 'T' + #else + 'B' + #endif + ); + #if HOTENDS > 1 + if (e >= 0) SERIAL_PROTOCOLCHAR_P(port, '0' + e); + #endif + SERIAL_PROTOCOLCHAR_P(port, ':'); + SERIAL_PROTOCOL_P(port, c); + SERIAL_PROTOCOLPAIR_P(port, " /" , t); #if ENABLED(SHOW_TEMP_ADC_VALUES) - SERIAL_ECHOPAIR(" (", r * RECIPROCAL(OVERSAMPLENR)); - SERIAL_CHAR(')'); + SERIAL_PROTOCOLPAIR_P(port, " (", r / OVERSAMPLENR); + SERIAL_PROTOCOLCHAR_P(port, ')'); #endif delay(2); } - void Temperature::print_heater_states(const uint8_t target_extruder - #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - , const bool include_r/*=false*/ + void Temperature::print_heaterstates( + #if NUM_SERIAL > 1 + const int8_t port #endif ) { #if HAS_TEMP_HOTEND - print_heater_state(degHotend(target_extruder), degTargetHotend(target_extruder) + print_heater_state(degHotend(gcode.target_extruder), degTargetHotend(gcode.target_extruder) #if ENABLED(SHOW_TEMP_ADC_VALUES) - , rawHotendTemp(target_extruder) + , rawHotendTemp(gcode.target_extruder) + #endif + #if NUM_SERIAL > 1 + , port #endif ); - #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - if (include_r) print_heater_state(redundant_temperature, degTargetHotend(target_extruder) - #if ENABLED(SHOW_TEMP_ADC_VALUES) - , redundant_temperature_raw - #endif - , H_REDUNDANT - ); - #endif #endif #if HAS_HEATED_BED print_heater_state(degBed(), degTargetBed() #if ENABLED(SHOW_TEMP_ADC_VALUES) , rawBedTemp() #endif - , H_BED + #if NUM_SERIAL > 1 + , port + #endif + , -1 // BED ); #endif #if HAS_TEMP_CHAMBER - print_heater_state(degChamber() - #if HAS_HEATED_CHAMBER - , degTargetChamber() - #else - , 0 - #endif + print_heater_state(degChamber(), 0 #if ENABLED(SHOW_TEMP_ADC_VALUES) , rawChamberTemp() #endif - , H_CHAMBER + , -2 // CHAMBER ); - #endif // HAS_TEMP_CHAMBER - #if HAS_TEMP_PROBE - print_heater_state(degProbe(), 0 - #if ENABLED(SHOW_TEMP_ADC_VALUES) - , rawProbeTemp() - #endif - , H_PROBE - ); - #endif // HAS_TEMP_PROBE - #if HAS_MULTI_HOTEND + #endif + #if HOTENDS > 1 HOTEND_LOOP() print_heater_state(degHotend(e), degTargetHotend(e) #if ENABLED(SHOW_TEMP_ADC_VALUES) , rawHotendTemp(e) #endif - , (heater_id_t)e + #if NUM_SERIAL > 1 + , port + #endif + , e ); #endif - SERIAL_ECHOPAIR(" @:", getHeaterPower((heater_id_t)target_extruder)); + SERIAL_PROTOCOLPGM_P(port, " @:"); + SERIAL_PROTOCOL_P(port, getHeaterPower(gcode.target_extruder)); #if HAS_HEATED_BED - SERIAL_ECHOPAIR(" B@:", getHeaterPower(H_BED)); + SERIAL_PROTOCOLPGM_P(port, " B@:"); + SERIAL_PROTOCOL_P(port, getHeaterPower(-1)); #endif - #if HAS_HEATED_CHAMBER - SERIAL_ECHOPAIR(" C@:", getHeaterPower(H_CHAMBER)); - #endif - #if HAS_MULTI_HOTEND + #if HOTENDS > 1 HOTEND_LOOP() { - SERIAL_ECHOPAIR(" @", e); - SERIAL_CHAR(':'); - SERIAL_ECHO(getHeaterPower((heater_id_t)e)); + SERIAL_PROTOCOLPAIR_P(port, " @", e); + SERIAL_PROTOCOLCHAR_P(port, ':'); + SERIAL_PROTOCOL_P(port, getHeaterPower(e)); } #endif } @@ -3082,457 +2344,11 @@ void Temperature::tick() { void Temperature::auto_report_temperatures() { if (auto_report_temp_interval && ELAPSED(millis(), next_temp_report_ms)) { next_temp_report_ms = millis() + 1000UL * auto_report_temp_interval; - PORT_REDIRECT(SERIAL_BOTH); - print_heater_states(active_extruder); + print_heaterstates(); SERIAL_EOL(); } } #endif // AUTO_REPORT_TEMPERATURES - #if HAS_HOTEND && HAS_DISPLAY - void Temperature::set_heating_message(const uint8_t e) { - const bool heating = isHeatingHotend(e); - ui.status_printf_P(0, - #if HAS_MULTI_HOTEND - PSTR("E%c " S_FMT), '1' + e - #else - PSTR("E " S_FMT) - #endif - , heating ? GET_TEXT(MSG_HEATING) : GET_TEXT(MSG_COOLING) - ); - } - #endif - - #if HAS_TEMP_HOTEND - - #ifndef MIN_COOLING_SLOPE_DEG - #define MIN_COOLING_SLOPE_DEG 1.50 - #endif - #ifndef MIN_COOLING_SLOPE_TIME - #define MIN_COOLING_SLOPE_TIME 60 - #endif - - bool Temperature::wait_for_hotend(const uint8_t target_extruder, const bool no_wait_for_cooling/*=true*/ - #if G26_CLICK_CAN_CANCEL - , const bool click_to_cancel/*=false*/ - #endif - ) { - - #if ENABLED(AUTOTEMP) - REMEMBER(1, planner.autotemp_enabled, false); - #endif - - #if TEMP_RESIDENCY_TIME > 0 - millis_t residency_start_ms = 0; - bool first_loop = true; - // Loop until the temperature has stabilized - #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_RESIDENCY_TIME))) - #else - // Loop until the temperature is very close target - #define TEMP_CONDITIONS (wants_to_cool ? isCoolingHotend(target_extruder) : isHeatingHotend(target_extruder)) - #endif - - #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) - KEEPALIVE_STATE(NOT_BUSY); - #endif - - #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = degHotend(target_extruder); - printerEventLEDs.onHotendHeatingStart(); - #endif - - bool wants_to_cool = false; - float target_temp = -1.0, old_temp = 9999.0; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; - wait_for_heatup = true; - do { - // Target temperature might be changed during the loop - if (target_temp != degTargetHotend(target_extruder)) { - wants_to_cool = isCoolingHotend(target_extruder); - target_temp = degTargetHotend(target_extruder); - - // Exit if S, continue if S, R, or R - if (no_wait_for_cooling && wants_to_cool) break; - } - - now = millis(); - if (ELAPSED(now, next_temp_ms)) { // Print temp & remaining time every 1s while waiting - next_temp_ms = now + 1000UL; - print_heater_states(target_extruder); - #if TEMP_RESIDENCY_TIME > 0 - SERIAL_ECHOPGM(" W:"); - if (residency_start_ms) - SERIAL_ECHO(long((SEC_TO_MS(TEMP_RESIDENCY_TIME) - (now - residency_start_ms)) / 1000UL)); - else - SERIAL_CHAR('?'); - #endif - SERIAL_EOL(); - } - - idle(); - gcode.reset_stepper_timeout(); // Keep steppers powered - - const float temp = degHotend(target_extruder); - - #if ENABLED(PRINTER_EVENT_LEDS) - // Gradually change LED strip from violet to red as nozzle heats up - if (!wants_to_cool) printerEventLEDs.onHotendHeating(start_temp, temp, target_temp); - #endif - - #if TEMP_RESIDENCY_TIME > 0 - - const float temp_diff = ABS(target_temp - temp); - - if (!residency_start_ms) { - // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time. - if (temp_diff < TEMP_WINDOW) - residency_start_ms = now + (first_loop ? SEC_TO_MS(TEMP_RESIDENCY_TIME) / 3 : 0); - } - else if (temp_diff > TEMP_HYSTERESIS) { - // Restart the timer whenever the temperature falls outside the hysteresis. - residency_start_ms = now; - } - - first_loop = false; - - #endif - - // Prevent a wait-forever situation if R is misused i.e. M109 R0 - if (wants_to_cool) { - // break after MIN_COOLING_SLOPE_TIME seconds - // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG - if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { - if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG)) break; - next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME; - old_temp = temp; - } - } - - #if G26_CLICK_CAN_CANCEL - if (click_to_cancel && ui.use_click()) { - wait_for_heatup = false; - ui.quick_feedback(); - } - #endif - - } while (wait_for_heatup && TEMP_CONDITIONS); - - if (wait_for_heatup) { - wait_for_heatup = false; - #if ENABLED(DWIN_CREALITY_LCD) - HMI_flag.heat_flag = 0; - duration_t elapsed = print_job_timer.duration(); // print timer - dwin_heat_time = elapsed.value; - #else - ui.reset_status(); - #endif - TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onHeatingDone()); - return true; - } - - return false; - } - - #endif // HAS_TEMP_HOTEND - - #if HAS_HEATED_BED - - #ifndef MIN_COOLING_SLOPE_DEG_BED - #define MIN_COOLING_SLOPE_DEG_BED 1.00 - #endif - #ifndef MIN_COOLING_SLOPE_TIME_BED - #define MIN_COOLING_SLOPE_TIME_BED 60 - #endif - - bool Temperature::wait_for_bed(const bool no_wait_for_cooling/*=true*/ - #if G26_CLICK_CAN_CANCEL - , const bool click_to_cancel/*=false*/ - #endif - ) { - #if TEMP_BED_RESIDENCY_TIME > 0 - millis_t residency_start_ms = 0; - bool first_loop = true; - // Loop until the temperature has stabilized - #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_BED_RESIDENCY_TIME))) - #else - // Loop until the temperature is very close target - #define TEMP_BED_CONDITIONS (wants_to_cool ? isCoolingBed() : isHeatingBed()) - #endif - - #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) - KEEPALIVE_STATE(NOT_BUSY); - #endif - - #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = degBed(); - printerEventLEDs.onBedHeatingStart(); - #endif - - bool wants_to_cool = false; - float target_temp = -1, old_temp = 9999; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; - wait_for_heatup = true; - do { - // Target temperature might be changed during the loop - if (target_temp != degTargetBed()) { - wants_to_cool = isCoolingBed(); - target_temp = degTargetBed(); - - // Exit if S, continue if S, R, or R - if (no_wait_for_cooling && wants_to_cool) break; - } - - now = millis(); - if (ELAPSED(now, next_temp_ms)) { //Print Temp Reading every 1 second while heating up. - next_temp_ms = now + 1000UL; - print_heater_states(active_extruder); - #if TEMP_BED_RESIDENCY_TIME > 0 - SERIAL_ECHOPGM(" W:"); - if (residency_start_ms) - SERIAL_ECHO(long((SEC_TO_MS(TEMP_BED_RESIDENCY_TIME) - (now - residency_start_ms)) / 1000UL)); - else - SERIAL_CHAR('?'); - #endif - SERIAL_EOL(); - } - - idle(); - gcode.reset_stepper_timeout(); // Keep steppers powered - - const float temp = degBed(); - - #if ENABLED(PRINTER_EVENT_LEDS) - // Gradually change LED strip from blue to violet as bed heats up - if (!wants_to_cool) printerEventLEDs.onBedHeating(start_temp, temp, target_temp); - #endif - - #if TEMP_BED_RESIDENCY_TIME > 0 - - const float temp_diff = ABS(target_temp - temp); - - if (!residency_start_ms) { - // Start the TEMP_BED_RESIDENCY_TIME timer when we reach target temp for the first time. - if (temp_diff < TEMP_BED_WINDOW) - residency_start_ms = now + (first_loop ? SEC_TO_MS(TEMP_BED_RESIDENCY_TIME) / 3 : 0); - } - else if (temp_diff > TEMP_BED_HYSTERESIS) { - // Restart the timer whenever the temperature falls outside the hysteresis. - residency_start_ms = now; - } - - #endif // TEMP_BED_RESIDENCY_TIME > 0 - - // Prevent a wait-forever situation if R is misused i.e. M190 R0 - if (wants_to_cool) { - // Break after MIN_COOLING_SLOPE_TIME_BED seconds - // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_BED - if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { - if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG_BED)) break; - next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME_BED; - old_temp = temp; - } - } - - #if G26_CLICK_CAN_CANCEL - if (click_to_cancel && ui.use_click()) { - wait_for_heatup = false; - ui.quick_feedback(); - } - #endif - - #if TEMP_BED_RESIDENCY_TIME > 0 - first_loop = false; - #endif - - } while (wait_for_heatup && TEMP_BED_CONDITIONS); - - if (wait_for_heatup) { - wait_for_heatup = false; - ui.reset_status(); - return true; - } - - return false; - } - - void Temperature::wait_for_bed_heating() { - if (isHeatingBed()) { - SERIAL_ECHOLNPGM("Wait for bed heating..."); - LCD_MESSAGEPGM(MSG_BED_HEATING); - wait_for_bed(); - ui.reset_status(); - } - } - - #endif // HAS_HEATED_BED - - #if HAS_TEMP_PROBE - - #ifndef MIN_DELTA_SLOPE_DEG_PROBE - #define MIN_DELTA_SLOPE_DEG_PROBE 1.0 - #endif - #ifndef MIN_DELTA_SLOPE_TIME_PROBE - #define MIN_DELTA_SLOPE_TIME_PROBE 600 - #endif - - bool Temperature::wait_for_probe(const float target_temp, bool no_wait_for_cooling/*=true*/) { - - const bool wants_to_cool = isProbeAboveTemp(target_temp); - const bool will_wait = !(wants_to_cool && no_wait_for_cooling); - if (will_wait) - SERIAL_ECHOLNPAIR("Waiting for probe to ", (wants_to_cool ? PSTR("cool down") : PSTR("heat up")), " to ", target_temp, " degrees."); - - #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) - KEEPALIVE_STATE(NOT_BUSY); - #endif - - float old_temp = 9999; - millis_t next_temp_ms = 0, next_delta_check_ms = 0; - wait_for_heatup = true; - while (will_wait && wait_for_heatup) { - - // Print Temp Reading every 10 seconds while heating up. - millis_t now = millis(); - if (!next_temp_ms || ELAPSED(now, next_temp_ms)) { - next_temp_ms = now + 10000UL; - print_heater_states(active_extruder); - SERIAL_EOL(); - } - - idle(); - gcode.reset_stepper_timeout(); // Keep steppers powered - - // Break after MIN_DELTA_SLOPE_TIME_PROBE seconds if the temperature - // did not drop at least MIN_DELTA_SLOPE_DEG_PROBE. This avoids waiting - // forever as the probe is not actively heated. - if (!next_delta_check_ms || ELAPSED(now, next_delta_check_ms)) { - const float temp = degProbe(), - delta_temp = old_temp > temp ? old_temp - temp : temp - old_temp; - if (delta_temp < float(MIN_DELTA_SLOPE_DEG_PROBE)) { - SERIAL_ECHOLNPGM("Timed out waiting for probe temperature."); - break; - } - next_delta_check_ms = now + 1000UL * MIN_DELTA_SLOPE_TIME_PROBE; - old_temp = temp; - } - - // Loop until the temperature is very close target - if (!(wants_to_cool ? isProbeAboveTemp(target_temp) : isProbeBelowTemp(target_temp))) { - SERIAL_ECHOLN(wants_to_cool ? PSTR("Cooldown") : PSTR("Heatup")); - SERIAL_ECHOLNPGM(" complete, target probe temperature reached."); - break; - } - } - - if (wait_for_heatup) { - wait_for_heatup = false; - ui.reset_status(); - return true; - } - else if (will_wait) - SERIAL_ECHOLNPGM("Canceled wait for probe temperature."); - - return false; - } - - #endif // HAS_TEMP_PROBE - - #if HAS_HEATED_CHAMBER - - #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER - #define MIN_COOLING_SLOPE_DEG_CHAMBER 1.50 - #endif - #ifndef MIN_COOLING_SLOPE_TIME_CHAMBER - #define MIN_COOLING_SLOPE_TIME_CHAMBER 120 - #endif - - bool Temperature::wait_for_chamber(const bool no_wait_for_cooling/*=true*/) { - #if TEMP_CHAMBER_RESIDENCY_TIME > 0 - millis_t residency_start_ms = 0; - bool first_loop = true; - // Loop until the temperature has stabilized - #define TEMP_CHAMBER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME))) - #else - // Loop until the temperature is very close target - #define TEMP_CHAMBER_CONDITIONS (wants_to_cool ? isCoolingChamber() : isHeatingChamber()) - #endif - - #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) - KEEPALIVE_STATE(NOT_BUSY); - #endif - - bool wants_to_cool = false; - float target_temp = -1, old_temp = 9999; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; - wait_for_heatup = true; - do { - // Target temperature might be changed during the loop - if (target_temp != degTargetChamber()) { - wants_to_cool = isCoolingChamber(); - target_temp = degTargetChamber(); - - // Exit if S, continue if S, R, or R - if (no_wait_for_cooling && wants_to_cool) break; - } - - now = millis(); - if (ELAPSED(now, next_temp_ms)) { // Print Temp Reading every 1 second while heating up. - next_temp_ms = now + 1000UL; - print_heater_states(active_extruder); - #if TEMP_CHAMBER_RESIDENCY_TIME > 0 - SERIAL_ECHOPGM(" W:"); - if (residency_start_ms) - SERIAL_ECHO(long((SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME) - (now - residency_start_ms)) / 1000UL)); - else - SERIAL_CHAR('?'); - #endif - SERIAL_EOL(); - } - - idle(); - gcode.reset_stepper_timeout(); // Keep steppers powered - - const float temp = degChamber(); - - #if TEMP_CHAMBER_RESIDENCY_TIME > 0 - - const float temp_diff = ABS(target_temp - temp); - - if (!residency_start_ms) { - // Start the TEMP_CHAMBER_RESIDENCY_TIME timer when we reach target temp for the first time. - if (temp_diff < TEMP_CHAMBER_WINDOW) - residency_start_ms = now + (first_loop ? SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME) / 3 : 0); - } - else if (temp_diff > TEMP_CHAMBER_HYSTERESIS) { - // Restart the timer whenever the temperature falls outside the hysteresis. - residency_start_ms = now; - } - - first_loop = false; - #endif // TEMP_CHAMBER_RESIDENCY_TIME > 0 - - // Prevent a wait-forever situation if R is misused i.e. M191 R0 - if (wants_to_cool) { - // Break after MIN_COOLING_SLOPE_TIME_CHAMBER seconds - // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER - if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { - if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG_CHAMBER)) break; - next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER; - old_temp = temp; - } - } - } while (wait_for_heatup && TEMP_CHAMBER_CONDITIONS); - - if (wait_for_heatup) { - wait_for_heatup = false; - ui.reset_status(); - return true; - } - - return false; - } - - #endif // HAS_HEATED_CHAMBER - #endif // HAS_TEMP_SENSOR diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 57b0fecbcc..e8b80f97b5 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,19 +16,24 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * temperature.h - temperature controller */ -#include "thermistor/thermistors.h" +#ifndef TEMPERATURE_H +#define TEMPERATURE_H +#include "thermistor/thermistors.h" #include "../inc/MarlinConfig.h" +#if ENABLED(BABYSTEPPING) + extern uint8_t axis_known_position; +#endif + #if ENABLED(AUTO_POWER_CONTROL) #include "../feature/power.h" #endif @@ -37,48 +42,10 @@ #define SOFT_PWM_SCALE 0 #endif -#define HOTEND_INDEX TERN(HAS_MULTI_HOTEND, e, 0) -#define E_NAME TERN_(HAS_MULTI_HOTEND, e) - -// Heater identifiers. Positive values are hotends. Negative values are other heaters. -typedef enum : int8_t { - INDEX_NONE = -5, - H_PROBE, H_REDUNDANT, H_CHAMBER, H_BED, - H_E0, H_E1, H_E2, H_E3, H_E4, H_E5, H_E6, H_E7 -} heater_id_t; - -// PID storage -typedef struct { float Kp, Ki, Kd; } PID_t; -typedef struct { float Kp, Ki, Kd, Kc; } PIDC_t; -typedef struct { float Kp, Ki, Kd, Kf; } PIDF_t; -typedef struct { float Kp, Ki, Kd, Kc, Kf; } PIDCF_t; - -typedef - #if BOTH(PID_EXTRUSION_SCALING, PID_FAN_SCALING) - PIDCF_t - #elif ENABLED(PID_EXTRUSION_SCALING) - PIDC_t - #elif ENABLED(PID_FAN_SCALING) - PIDF_t - #else - PID_t - #endif -hotend_pid_t; - -#if ENABLED(PID_EXTRUSION_SCALING) - typedef IF<(LPQ_MAX_LEN > 255), uint16_t, uint8_t>::type lpq_ptr_t; -#endif - -#define PID_PARAM(F,H) _PID_##F(TERN(PID_PARAMS_PER_HOTEND, H, 0)) -#define _PID_Kp(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kp, NAN) -#define _PID_Ki(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Ki, NAN) -#define _PID_Kd(H) TERN(PIDTEMP, Temperature::temp_hotend[H].pid.Kd, NAN) -#if ENABLED(PIDTEMP) - #define _PID_Kc(H) TERN(PID_EXTRUSION_SCALING, Temperature::temp_hotend[H].pid.Kc, 1) - #define _PID_Kf(H) TERN(PID_FAN_SCALING, Temperature::temp_hotend[H].pid.Kf, 0) +#if HOTENDS == 1 + #define HOTEND_INDEX 0 #else - #define _PID_Kc(H) 1 - #define _PID_Kf(H) 0 + #define HOTEND_INDEX e #endif /** @@ -87,60 +54,40 @@ hotend_pid_t; enum ADCSensorState : char { StartSampling, #if HAS_TEMP_ADC_0 - PrepareTemp_0, MeasureTemp_0, - #endif - #if HAS_HEATED_BED - PrepareTemp_BED, MeasureTemp_BED, - #endif - #if HAS_TEMP_CHAMBER - PrepareTemp_CHAMBER, MeasureTemp_CHAMBER, - #endif - #if HAS_TEMP_PROBE - PrepareTemp_PROBE, MeasureTemp_PROBE, + PrepareTemp_0, + MeasureTemp_0, #endif #if HAS_TEMP_ADC_1 - PrepareTemp_1, MeasureTemp_1, + PrepareTemp_1, + MeasureTemp_1, #endif #if HAS_TEMP_ADC_2 - PrepareTemp_2, MeasureTemp_2, + PrepareTemp_2, + MeasureTemp_2, #endif #if HAS_TEMP_ADC_3 - PrepareTemp_3, MeasureTemp_3, + PrepareTemp_3, + MeasureTemp_3, #endif #if HAS_TEMP_ADC_4 - PrepareTemp_4, MeasureTemp_4, + PrepareTemp_4, + MeasureTemp_4, #endif - #if HAS_TEMP_ADC_5 - PrepareTemp_5, MeasureTemp_5, + #if HAS_HEATED_BED + PrepareTemp_BED, + MeasureTemp_BED, #endif - #if HAS_TEMP_ADC_6 - PrepareTemp_6, MeasureTemp_6, - #endif - #if HAS_TEMP_ADC_7 - PrepareTemp_7, MeasureTemp_7, - #endif - #if HAS_JOY_ADC_X - PrepareJoy_X, MeasureJoy_X, - #endif - #if HAS_JOY_ADC_Y - PrepareJoy_Y, MeasureJoy_Y, - #endif - #if HAS_JOY_ADC_Z - PrepareJoy_Z, MeasureJoy_Z, + #if HAS_TEMP_CHAMBER + PrepareTemp_CHAMBER, + MeasureTemp_CHAMBER, #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) - Prepare_FILWIDTH, Measure_FILWIDTH, + Prepare_FILWIDTH, + Measure_FILWIDTH, #endif - #if ENABLED(POWER_MONITOR_CURRENT) - Prepare_POWER_MONITOR_CURRENT, - Measure_POWER_MONITOR_CURRENT, - #endif - #if ENABLED(POWER_MONITOR_VOLTAGE) - Prepare_POWER_MONITOR_VOLTAGE, - Measure_POWER_MONITOR_VOLTAGE, - #endif - #if HAS_ADC_BUTTONS - Prepare_ADC_KEY, Measure_ADC_KEY, + #if ENABLED(ADC_KEYPAD) + Prepare_ADC_KEY, + Measure_ADC_KEY, #endif SensorsReady, // Temperatures ready. Delay the next round of readings to let ADC pins settle. StartupDelay // Startup, delay initial temp reading a tiny bit so the hardware can settle @@ -151,7 +98,7 @@ enum ADCSensorState : char { // get all oversampled sensor readings #define MIN_ADC_ISR_LOOPS 10 -#define ACTUAL_ADC_SAMPLES _MAX(int(MIN_ADC_ISR_LOOPS), int(SensorsReady)) +#define ACTUAL_ADC_SAMPLES MAX(int(MIN_ADC_ISR_LOOPS), int(SensorsReady)) #if HAS_PID_HEATING #define PID_K2 (1-float(PID_K1)) @@ -164,252 +111,160 @@ enum ADCSensorState : char { #define unscalePID_d(d) ( float(d) * PID_dT ) #endif -#if BOTH(HAS_LCD_MENU, G26_MESH_VALIDATION) - #define G26_CLICK_CAN_CANCEL 1 -#endif - -// A temperature sensor -typedef struct TempInfo { - uint16_t acc; - int16_t raw; - float celsius; - inline void reset() { acc = 0; } - inline void sample(const uint16_t s) { acc += s; } - inline void update() { raw = acc; } -} temp_info_t; - -// A PWM heater with temperature sensor -typedef struct HeaterInfo : public TempInfo { - int16_t target; - uint8_t soft_pwm_amount; -} heater_info_t; - -// A heater with PID stabilization -template -struct PIDHeaterInfo : public HeaterInfo { - T pid; // Initialized by settings.load() -}; - -#if ENABLED(PIDTEMP) - typedef struct PIDHeaterInfo hotend_info_t; -#else - typedef heater_info_t hotend_info_t; -#endif -#if HAS_HEATED_BED - #if ENABLED(PIDTEMPBED) - typedef struct PIDHeaterInfo bed_info_t; - #else - typedef heater_info_t bed_info_t; - #endif -#endif -#if HAS_TEMP_PROBE - typedef temp_info_t probe_info_t; -#endif -#if HAS_HEATED_CHAMBER - typedef heater_info_t chamber_info_t; -#elif HAS_TEMP_CHAMBER - typedef temp_info_t chamber_info_t; -#endif - -// Heater watch handling -template -struct HeaterWatch { - uint16_t target; - millis_t next_ms; - inline bool elapsed(const millis_t &ms) { return next_ms && ELAPSED(ms, next_ms); } - inline bool elapsed() { return elapsed(millis()); } - - inline void restart(const int16_t curr, const int16_t tgt) { - if (tgt) { - const int16_t newtarget = curr + INCREASE; - if (newtarget < tgt - HYSTERESIS - 1) { - target = newtarget; - next_ms = millis() + SEC_TO_MS(PERIOD); - return; - } - } - next_ms = 0; - } -}; - -#if WATCH_HOTENDS - typedef struct HeaterWatch hotend_watch_t; -#endif -#if WATCH_BED - typedef struct HeaterWatch bed_watch_t; -#endif -#if WATCH_CHAMBER - typedef struct HeaterWatch chamber_watch_t; -#endif - -// Temperature sensor read value ranges -typedef struct { int16_t raw_min, raw_max; } raw_range_t; -typedef struct { int16_t mintemp, maxtemp; } celsius_range_t; -typedef struct { int16_t raw_min, raw_max, mintemp, maxtemp; } temp_range_t; - -#define THERMISTOR_ABS_ZERO_C -273.15f // bbbbrrrrr cold ! -#define THERMISTOR_RESISTANCE_NOMINAL_C 25.0f // mmmmm comfortable - -#if HAS_USER_THERMISTORS - - enum CustomThermistorIndex : uint8_t { - #if ENABLED(HEATER_0_USER_THERMISTOR) - CTI_HOTEND_0, - #endif - #if ENABLED(HEATER_1_USER_THERMISTOR) - CTI_HOTEND_1, - #endif - #if ENABLED(HEATER_2_USER_THERMISTOR) - CTI_HOTEND_2, - #endif - #if ENABLED(HEATER_3_USER_THERMISTOR) - CTI_HOTEND_3, - #endif - #if ENABLED(HEATER_4_USER_THERMISTOR) - CTI_HOTEND_4, - #endif - #if ENABLED(HEATER_5_USER_THERMISTOR) - CTI_HOTEND_5, - #endif - #if ENABLED(HEATER_BED_USER_THERMISTOR) - CTI_BED, - #endif - #if ENABLED(HEATER_PROBE_USER_THERMISTOR) - CTI_PROBE, - #endif - #if ENABLED(HEATER_CHAMBER_USER_THERMISTOR) - CTI_CHAMBER, - #endif - USER_THERMISTORS - }; - - // User-defined thermistor - typedef struct { - bool pre_calc; // true if pre-calculations update needed - float sh_c_coeff, // Steinhart-Hart C coefficient .. defaults to '0.0' - sh_alpha, - series_res, - res_25, res_25_recip, - res_25_log, - beta, beta_recip; - } user_thermistor_t; - -#endif - class Temperature { public: - #if HAS_HOTEND - #define HOTEND_TEMPS (HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) - static hotend_info_t temp_hotend[HOTEND_TEMPS]; - static const uint16_t heater_maxtemp[HOTENDS]; - #endif - TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); - TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); - TERN_(HAS_TEMP_CHAMBER, static chamber_info_t temp_chamber); + static volatile bool in_temp_isr; - TERN_(AUTO_POWER_E_FANS, static uint8_t autofan_speed[HOTENDS]); - TERN_(AUTO_POWER_CHAMBER_FAN, static uint8_t chamberfan_speed); + static float current_temperature[HOTENDS]; + static int16_t current_temperature_raw[HOTENDS], + target_temperature[HOTENDS]; + static uint8_t soft_pwm_amount[HOTENDS]; + + #if ENABLED(AUTO_POWER_E_FANS) + static int16_t autofan_speed[HOTENDS]; + #endif #if ENABLED(FAN_SOFT_PWM) static uint8_t soft_pwm_amount_fan[FAN_COUNT], soft_pwm_count_fan[FAN_COUNT]; #endif + #if ENABLED(PIDTEMP) + + #if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1 + + static float Kp[HOTENDS], Ki[HOTENDS], Kd[HOTENDS]; + #if ENABLED(PID_EXTRUSION_SCALING) + static float Kc[HOTENDS]; + #endif + #define PID_PARAM(param, h) Temperature::param[h] + + #else + + static float Kp, Ki, Kd; + #if ENABLED(PID_EXTRUSION_SCALING) + static float Kc; + #endif + #define PID_PARAM(param, h) Temperature::param + + #endif // PID_PARAMS_PER_HOTEND + + #endif + + #if HAS_HEATED_BED + static float current_temperature_bed; + static int16_t current_temperature_bed_raw, target_temperature_bed; + static uint8_t soft_pwm_amount_bed; + #if ENABLED(PIDTEMPBED) + static float bedKp, bedKi, bedKd; + #endif + #endif + + #if ENABLED(BABYSTEPPING) + static volatile int babystepsTodo[3]; + #endif + #if ENABLED(PREVENT_COLD_EXTRUSION) static bool allow_cold_extrude; static int16_t extrude_min_temp; - FORCE_INLINE static bool tooCold(const int16_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } - FORCE_INLINE static bool tooColdToExtrude(const uint8_t E_NAME) { + FORCE_INLINE static bool tooCold(const int16_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp; } + FORCE_INLINE static bool tooColdToExtrude(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif return tooCold(degHotend(HOTEND_INDEX)); } - FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t E_NAME) { + FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif return tooCold(degTargetHotend(HOTEND_INDEX)); } #else - FORCE_INLINE static bool tooColdToExtrude(const uint8_t) { return false; } - FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t) { return false; } + FORCE_INLINE static bool tooColdToExtrude(const uint8_t e) { UNUSED(e); return false; } + FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t e) { UNUSED(e); return false; } #endif FORCE_INLINE static bool hotEnoughToExtrude(const uint8_t e) { return !tooColdToExtrude(e); } FORCE_INLINE static bool targetHotEnoughToExtrude(const uint8_t e) { return !targetTooColdToExtrude(e); } - #if HEATER_IDLE_HANDLER - - // Heater idle handling. Marlin creates one per hotend and one for the heated bed. - typedef struct { - millis_t timeout_ms; - bool timed_out; - inline void update(const millis_t &ms) { if (!timed_out && timeout_ms && ELAPSED(ms, timeout_ms)) timed_out = true; } - inline void start(const millis_t &ms) { timeout_ms = millis() + ms; timed_out = false; } - inline void reset() { timeout_ms = 0; timed_out = false; } - inline void expire() { start(0); } - } heater_idle_t; - - // Indices and size for the heater_idle array - #define _ENUM_FOR_E(N) IDLE_INDEX_E##N, - enum IdleIndex : uint8_t { - REPEAT(HOTENDS, _ENUM_FOR_E) - #if ENABLED(HAS_HEATED_BED) - IDLE_INDEX_BED, - #endif - NR_HEATER_IDLE - }; - #undef _ENUM_FOR_E - - // Convert the given heater_id_t to idle array index - static inline IdleIndex idle_index_for_id(const int8_t heater_id) { - #if HAS_HEATED_BED - if (heater_id == H_BED) return IDLE_INDEX_BED; - #endif - return (IdleIndex)_MAX(heater_id, 0); - } - - static heater_idle_t heater_idle[NR_HEATER_IDLE]; - - #endif - private: - TERN_(EARLY_WATCHDOG, static bool inited); // If temperature controller is running + #if EARLY_WATCHDOG + static bool inited; // If temperature controller is running + #endif - static volatile bool raw_temps_ready; + static volatile bool temp_meas_ready; + static uint16_t raw_temp_value[MAX_EXTRUDERS]; - TERN_(WATCH_HOTENDS, static hotend_watch_t watch_hotend[HOTENDS]); + #if WATCH_HOTENDS + static uint16_t watch_target_temp[HOTENDS]; + static millis_t watch_heater_next_ms[HOTENDS]; + #endif #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) static uint16_t redundant_temperature_raw; static float redundant_temperature; #endif - #if ENABLED(PID_EXTRUSION_SCALING) - static int32_t last_e_position, lpq[LPQ_MAX_LEN]; - static lpq_ptr_t lpq_ptr; + #if ENABLED(PIDTEMP) + static float temp_iState[HOTENDS], + temp_dState[HOTENDS], + pTerm[HOTENDS], + iTerm[HOTENDS], + dTerm[HOTENDS]; + + #if ENABLED(PID_EXTRUSION_SCALING) + static float cTerm[HOTENDS]; + static long last_e_position; + static long lpq[LPQ_MAX_LEN]; + static int lpq_ptr; + #endif + + static float pid_error[HOTENDS]; + static bool pid_reset[HOTENDS]; #endif - TERN_(HAS_HOTEND, static temp_range_t temp_range[HOTENDS]); + // Init min and max temp with extreme values to prevent false errors during startup + static int16_t minttemp_raw[HOTENDS], + maxttemp_raw[HOTENDS], + minttemp[HOTENDS], + maxttemp[HOTENDS]; #if HAS_HEATED_BED - TERN_(WATCH_BED, static bed_watch_t watch_bed); - TERN(PIDTEMPBED,,static millis_t next_bed_check_ms); + static uint16_t raw_temp_bed_value; + #if WATCH_THE_BED + static uint16_t watch_target_bed_temp; + static millis_t watch_bed_next_ms; + #endif + #if ENABLED(PIDTEMPBED) + static float temp_iState_bed, + temp_dState_bed, + pTerm_bed, + iTerm_bed, + dTerm_bed, + pid_error_bed; + #else + static millis_t next_bed_check_ms; + #endif + #if HEATER_IDLE_HANDLER + static millis_t bed_idle_timeout_ms; + static bool bed_idle_timeout_exceeded; + #endif #ifdef BED_MINTEMP - static int16_t mintemp_raw_BED; + static int16_t bed_minttemp_raw; #endif #ifdef BED_MAXTEMP - static int16_t maxtemp_raw_BED; + static int16_t bed_maxttemp_raw; #endif #endif - #if HAS_HEATED_CHAMBER - TERN_(WATCH_CHAMBER, static chamber_watch_t watch_chamber); - static millis_t next_chamber_check_ms; - #ifdef CHAMBER_MINTEMP - static int16_t mintemp_raw_CHAMBER; - #endif - #ifdef CHAMBER_MAXTEMP - static int16_t maxtemp_raw_CHAMBER; - #endif + #if HAS_TEMP_CHAMBER + static uint16_t raw_temp_chamber_value; + static float current_temperature_chamber; + static int16_t current_temperature_chamber_raw; #endif #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED @@ -420,124 +275,62 @@ class Temperature { static millis_t preheat_end_time[HOTENDS]; #endif - TERN_(HAS_AUTO_FAN, static millis_t next_auto_fan_check_ms); - - TERN_(PROBING_HEATERS_OFF, static bool paused); - - public: - #if HAS_ADC_BUTTONS - static uint32_t current_ADCKey_raw; - static uint16_t ADCKey_count; + #if ENABLED(FILAMENT_WIDTH_SENSOR) + static int8_t meas_shift_index; // Index of a delayed sample in buffer #endif - TERN_(PID_EXTRUSION_SCALING, static int16_t lpq_len); + #if HAS_AUTO_FAN + static millis_t next_auto_fan_check_ms; + #endif + + #if ENABLED(FILAMENT_WIDTH_SENSOR) + static uint16_t current_raw_filwidth; // Measured filament diameter - one extruder only + #endif + + #if ENABLED(PROBING_HEATERS_OFF) + static bool paused; + #endif + + #if HEATER_IDLE_HANDLER + static millis_t heater_idle_timeout_ms[HOTENDS]; + static bool heater_idle_timeout_exceeded[HOTENDS]; + #endif + + public: + #if ENABLED(ADC_KEYPAD) + static uint32_t current_ADCKey_raw; + static uint8_t ADCKey_count; + #endif + + #if ENABLED(PID_EXTRUSION_SCALING) + static int16_t lpq_len; + #endif /** * Instance Methods */ + Temperature(); + void init(); /** * Static (class) methods */ - - #if HAS_USER_THERMISTORS - static user_thermistor_t user_thermistor[USER_THERMISTORS]; - static void log_user_thermistor(const uint8_t t_index, const bool eprom=false); - static void reset_user_thermistors(); - static float user_thermistor_to_deg_c(const uint8_t t_index, const int raw); - static bool set_pull_up_res(int8_t t_index, float value) { - //if (!WITHIN(t_index, 0, USER_THERMISTORS - 1)) return false; - if (!WITHIN(value, 1, 1000000)) return false; - user_thermistor[t_index].series_res = value; - return true; - } - static bool set_res25(int8_t t_index, float value) { - if (!WITHIN(value, 1, 10000000)) return false; - user_thermistor[t_index].res_25 = value; - user_thermistor[t_index].pre_calc = true; - return true; - } - static bool set_beta(int8_t t_index, float value) { - if (!WITHIN(value, 1, 1000000)) return false; - user_thermistor[t_index].beta = value; - user_thermistor[t_index].pre_calc = true; - return true; - } - static bool set_sh_coeff(int8_t t_index, float value) { - if (!WITHIN(value, -0.01f, 0.01f)) return false; - user_thermistor[t_index].sh_c_coeff = value; - user_thermistor[t_index].pre_calc = true; - return true; - } - #endif - - #if HAS_HOTEND - static float analog_to_celsius_hotend(const int raw, const uint8_t e); - #endif + static float analog2temp(const int raw, const uint8_t e); #if HAS_HEATED_BED - static float analog_to_celsius_bed(const int raw); - #endif - #if HAS_TEMP_PROBE - static float analog_to_celsius_probe(const int raw); + static float analog2tempBed(const int raw); #endif #if HAS_TEMP_CHAMBER - static float analog_to_celsius_chamber(const int raw); + static float analog2tempChamber(const int raw); #endif - #if HAS_FAN - - static uint8_t fan_speed[FAN_COUNT]; - #define FANS_LOOP(I) LOOP_L_N(I, FAN_COUNT) - - static void set_fan_speed(const uint8_t target, const uint16_t speed); - - #if ENABLED(REPORT_FAN_CHANGE) - static void report_fan_speed(const uint8_t target); - #endif - - #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) - static bool fans_paused; - static uint8_t saved_fan_speed[FAN_COUNT]; - #endif - - static constexpr inline uint8_t fanPercent(const uint8_t speed) { return ui8_to_percent(speed); } - - TERN_(ADAPTIVE_FAN_SLOWING, static uint8_t fan_speed_scaler[FAN_COUNT]); - - static inline uint8_t scaledFanSpeed(const uint8_t target, const uint8_t fs) { - UNUSED(target); // Potentially unused! - return (fs * uint16_t(TERN(ADAPTIVE_FAN_SLOWING, fan_speed_scaler[target], 128))) >> 7; - } - - static inline uint8_t scaledFanSpeed(const uint8_t target) { - return scaledFanSpeed(target, fan_speed[target]); - } - - #if ENABLED(EXTRA_FAN_SPEED) - static uint8_t old_fan_speed[FAN_COUNT], new_fan_speed[FAN_COUNT]; - static void set_temp_fan_speed(const uint8_t fan, const uint16_t tmp_temp); - #endif - - #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) - void set_fans_paused(const bool p); - #endif - - #endif // HAS_FAN - - static inline void zero_fan_speeds() { - #if HAS_FAN - FANS_LOOP(i) set_fan_speed(i, 0); - #endif - } - /** * Called from the Temperature ISR */ static void readings_ready(); - static void tick(); + static void isr(); /** * Call periodically to manage heaters @@ -548,216 +341,202 @@ class Temperature { * Preheating hotends */ #ifdef MILLISECONDS_PREHEAT_TIME - static bool is_preheating(const uint8_t E_NAME) { + static bool is_preheating(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif return preheat_end_time[HOTEND_INDEX] && PENDING(millis(), preheat_end_time[HOTEND_INDEX]); } - static void start_preheat_time(const uint8_t E_NAME) { + static void start_preheat_time(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif preheat_end_time[HOTEND_INDEX] = millis() + MILLISECONDS_PREHEAT_TIME; } - static void reset_preheat_time(const uint8_t E_NAME) { + static void reset_preheat_time(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif preheat_end_time[HOTEND_INDEX] = 0; } #else #define is_preheating(n) (false) #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + static float analog2widthFil(); // Convert raw Filament Width to millimeters + static int8_t widthFil_to_size_ratio(); // Convert Filament Width (mm) to an extrusion ratio + #endif + + //high level conversion routines, for use outside of temperature.cpp //inline so that there is no performance decrease. //deg=degreeCelsius - FORCE_INLINE static float degHotend(const uint8_t E_NAME) { - return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].celsius); + FORCE_INLINE static float degHotend(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif + return current_temperature[HOTEND_INDEX]; } #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawHotendTemp(const uint8_t E_NAME) { - return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].raw); + FORCE_INLINE static int16_t rawHotendTemp(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif + return current_temperature_raw[HOTEND_INDEX]; } #endif - FORCE_INLINE static int16_t degTargetHotend(const uint8_t E_NAME) { - return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].target); + FORCE_INLINE static int16_t degTargetHotend(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif + return target_temperature[HOTEND_INDEX]; } #if WATCH_HOTENDS - static void start_watching_hotend(const uint8_t e=0); - #else - static inline void start_watching_hotend(const uint8_t=0) {} + static void start_watching_heater(const uint8_t e = 0); #endif - #if HAS_HOTEND - - static void setTargetHotend(const int16_t celsius, const uint8_t E_NAME) { - const uint8_t ee = HOTEND_INDEX; - #ifdef MILLISECONDS_PREHEAT_TIME - if (celsius == 0) - reset_preheat_time(ee); - else if (temp_hotend[ee].target == 0) - start_preheat_time(ee); - #endif - TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); - temp_hotend[ee].target = _MIN(celsius, temp_range[ee].maxtemp - HOTEND_OVERSHOOT); - start_watching_hotend(ee); - } - - FORCE_INLINE static bool isHeatingHotend(const uint8_t E_NAME) { - return temp_hotend[HOTEND_INDEX].target > temp_hotend[HOTEND_INDEX].celsius; - } - - FORCE_INLINE static bool isCoolingHotend(const uint8_t E_NAME) { - return temp_hotend[HOTEND_INDEX].target < temp_hotend[HOTEND_INDEX].celsius; - } - - #if HAS_TEMP_HOTEND - static bool wait_for_hotend(const uint8_t target_extruder, const bool no_wait_for_cooling=true - #if G26_CLICK_CAN_CANCEL - , const bool click_to_cancel=false - #endif - ); + static void setTargetHotend(const int16_t celsius, const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); #endif + #ifdef MILLISECONDS_PREHEAT_TIME + if (celsius == 0) + reset_preheat_time(HOTEND_INDEX); + else if (target_temperature[HOTEND_INDEX] == 0) + start_preheat_time(HOTEND_INDEX); + #endif + #if ENABLED(AUTO_POWER_CONTROL) + powerManager.power_on(); + #endif + target_temperature[HOTEND_INDEX] = celsius; + #if WATCH_HOTENDS + start_watching_heater(HOTEND_INDEX); + #endif + } - FORCE_INLINE static bool still_heating(const uint8_t e) { - return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; - } + FORCE_INLINE static bool isHeatingHotend(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif + return target_temperature[HOTEND_INDEX] > current_temperature[HOTEND_INDEX]; + } - FORCE_INLINE static bool degHotendNear(const uint8_t e, const float &temp) { - return ABS(degHotend(e) - temp) < (TEMP_HYSTERESIS); - } - - #endif // HAS_HOTEND + FORCE_INLINE static bool isCoolingHotend(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif + return target_temperature[HOTEND_INDEX] < current_temperature[HOTEND_INDEX]; + } #if HAS_HEATED_BED - #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawBedTemp() { return temp_bed.raw; } - #endif - FORCE_INLINE static float degBed() { return temp_bed.celsius; } - FORCE_INLINE static int16_t degTargetBed() { return temp_bed.target; } - FORCE_INLINE static bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } - FORCE_INLINE static bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } - - #if WATCH_BED - static void start_watching_bed(); - #else - static inline void start_watching_bed() {} + FORCE_INLINE static int16_t rawBedTemp() { return current_temperature_bed_raw; } #endif + FORCE_INLINE static float degBed() { return current_temperature_bed; } + FORCE_INLINE static int16_t degTargetBed() { return target_temperature_bed; } + FORCE_INLINE static bool isHeatingBed() { return target_temperature_bed > current_temperature_bed; } + FORCE_INLINE static bool isCoolingBed() { return target_temperature_bed < current_temperature_bed; } static void setTargetBed(const int16_t celsius) { - TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); - temp_bed.target = - #ifdef BED_MAX_TARGET - _MIN(celsius, BED_MAX_TARGET) + #if ENABLED(AUTO_POWER_CONTROL) + powerManager.power_on(); + #endif + target_temperature_bed = + #ifdef BED_MAXTEMP + MIN(celsius, BED_MAXTEMP) #else celsius #endif ; - start_watching_bed(); - } - - static bool wait_for_bed(const bool no_wait_for_cooling=true - #if G26_CLICK_CAN_CANCEL - , const bool click_to_cancel=false + #if WATCH_THE_BED + start_watching_bed(); #endif - ); - - static void wait_for_bed_heating(); - - FORCE_INLINE static bool degBedNear(const float &temp) { - return ABS(degBed() - temp) < (TEMP_BED_HYSTERESIS); } - #endif // HAS_HEATED_BED - - #if HAS_TEMP_PROBE - #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawProbeTemp() { return temp_probe.raw; } + #if WATCH_THE_BED + static void start_watching_bed(); #endif - FORCE_INLINE static float degProbe() { return temp_probe.celsius; } - FORCE_INLINE static bool isProbeBelowTemp(const float target_temp) { return temp_probe.celsius < target_temp; } - FORCE_INLINE static bool isProbeAboveTemp(const float target_temp) { return temp_probe.celsius > target_temp; } - static bool wait_for_probe(const float target_temp, bool no_wait_for_cooling=true); - #endif - - #if WATCH_PROBE - static void start_watching_probe(); - #else - static inline void start_watching_probe() {} #endif #if HAS_TEMP_CHAMBER #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawChamberTemp() { return temp_chamber.raw; } + FORCE_INLINE static int16_t rawChamberTemp() { return current_temperature_chamber_raw; } #endif - FORCE_INLINE static float degChamber() { return temp_chamber.celsius; } - #if HAS_HEATED_CHAMBER - FORCE_INLINE static int16_t degTargetChamber() { return temp_chamber.target; } - FORCE_INLINE static bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } - FORCE_INLINE static bool isCoolingChamber() { return temp_chamber.target < temp_chamber.celsius; } - - static bool wait_for_chamber(const bool no_wait_for_cooling=true); - #endif - #endif // HAS_TEMP_CHAMBER - - #if WATCH_CHAMBER - static void start_watching_chamber(); - #else - static inline void start_watching_chamber() {} + FORCE_INLINE static float degChamber() { return current_temperature_chamber; } #endif - #if HAS_HEATED_CHAMBER - static void setTargetChamber(const int16_t celsius) { - temp_chamber.target = - #ifdef CHAMBER_MAXTEMP - _MIN(celsius, CHAMBER_MAXTEMP - 10) - #else - celsius - #endif - ; - start_watching_chamber(); - } - #endif // HAS_HEATED_CHAMBER + FORCE_INLINE static bool wait_for_heating(const uint8_t e) { + return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; + } /** * The software PWM power for a heater */ - static int16_t getHeaterPower(const heater_id_t heater_id); + static int getHeaterPower(const int heater); /** * Switch off all heaters, set all target temperatures to 0 */ static void disable_all_heaters(); - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) - /** - * Methods to check if heaters are enabled, indicating an active job - */ - static bool over_autostart_threshold(); - static void check_timer_autostart(const bool can_start, const bool can_stop); - #endif - /** * Perform auto-tuning for hotend or bed in response to M303 */ #if HAS_PID_HEATING - static void PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); - - #if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) - static bool adaptive_fan_slowing; - #elif ENABLED(ADAPTIVE_FAN_SLOWING) - static constexpr bool adaptive_fan_slowing = true; - #endif + static void PID_autotune(const float &target, const int8_t hotend, const int8_t ncycles, const bool set_result=false); /** * Update the temp manager when PID values change */ #if ENABLED(PIDTEMP) FORCE_INLINE static void updatePID() { - TERN_(PID_EXTRUSION_SCALING, last_e_position = 0); + #if ENABLED(PID_EXTRUSION_SCALING) + last_e_position = 0; + #endif } #endif #endif + #if ENABLED(BABYSTEPPING) + + static void babystep_axis(const AxisEnum axis, const int16_t distance) { + if (TEST(axis_known_position, axis)) { + #if IS_CORE + #if ENABLED(BABYSTEP_XY) + switch (axis) { + case CORE_AXIS_1: // X on CoreXY and CoreXZ, Y on CoreYZ + babystepsTodo[CORE_AXIS_1] += distance * 2; + babystepsTodo[CORE_AXIS_2] += distance * 2; + break; + case CORE_AXIS_2: // Y on CoreXY, Z on CoreXZ and CoreYZ + babystepsTodo[CORE_AXIS_1] += CORESIGN(distance * 2); + babystepsTodo[CORE_AXIS_2] -= CORESIGN(distance * 2); + break; + case NORMAL_AXIS: // Z on CoreXY, Y on CoreXZ, X on CoreYZ + babystepsTodo[NORMAL_AXIS] += distance; + break; + } + #elif CORE_IS_XZ || CORE_IS_YZ + // Only Z stepping needs to be handled here + babystepsTodo[CORE_AXIS_1] += CORESIGN(distance * 2); + babystepsTodo[CORE_AXIS_2] -= CORESIGN(distance * 2); + #else + babystepsTodo[Z_AXIS] += distance; + #endif + #else + babystepsTodo[axis] += distance; + #endif + } + } + + #endif // BABYSTEPPING + #if ENABLED(PROBING_HEATERS_OFF) static void pause(const bool p); FORCE_INLINE static bool is_paused() { return paused; } @@ -765,31 +544,62 @@ class Temperature { #if HEATER_IDLE_HANDLER - static void reset_hotend_idle_timer(const uint8_t E_NAME) { - heater_idle[HOTEND_INDEX].reset(); - start_watching_hotend(HOTEND_INDEX); + static void start_heater_idle_timer(const uint8_t e, const millis_t timeout_ms) { + #if HOTENDS == 1 + UNUSED(e); + #endif + heater_idle_timeout_ms[HOTEND_INDEX] = millis() + timeout_ms; + heater_idle_timeout_exceeded[HOTEND_INDEX] = false; + } + + static void reset_heater_idle_timer(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif + heater_idle_timeout_ms[HOTEND_INDEX] = 0; + heater_idle_timeout_exceeded[HOTEND_INDEX] = false; + #if WATCH_HOTENDS + start_watching_heater(HOTEND_INDEX); + #endif + } + + FORCE_INLINE static bool is_heater_idle(const uint8_t e) { + #if HOTENDS == 1 + UNUSED(e); + #endif + return heater_idle_timeout_exceeded[HOTEND_INDEX]; } #if HAS_HEATED_BED - static void reset_bed_idle_timer() { - heater_idle[IDLE_INDEX_BED].reset(); - start_watching_bed(); + static void start_bed_idle_timer(const millis_t timeout_ms) { + bed_idle_timeout_ms = millis() + timeout_ms; + bed_idle_timeout_exceeded = false; } + + static void reset_bed_idle_timer() { + bed_idle_timeout_ms = 0; + bed_idle_timeout_exceeded = false; + #if WATCH_THE_BED + start_watching_bed(); + #endif + } + + FORCE_INLINE static bool is_bed_idle() { return bed_idle_timeout_exceeded; } #endif #endif // HEATER_IDLE_HANDLER #if HAS_TEMP_SENSOR - static void print_heater_states(const uint8_t target_extruder - #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - , const bool include_r=false + static void print_heaterstates( + #if NUM_SERIAL > 1 + const int8_t port = -1 #endif ); #if ENABLED(AUTO_REPORT_TEMPERATURES) static uint8_t auto_report_temp_interval; static millis_t next_temp_report_ms; - static void auto_report_temperatures(); - static inline void set_auto_report_interval(uint8_t v) { + static void auto_report_temperatures(void); + FORCE_INLINE void set_auto_report_interval(uint8_t v) { NOMORE(v, 60); auto_report_temp_interval = v; next_temp_report_ms = millis() + 1000UL * v; @@ -797,86 +607,52 @@ class Temperature { #endif #endif - TERN_(HAS_DISPLAY, static void set_heating_message(const uint8_t e)); + private: - #if HAS_LCD_MENU && HAS_TEMPERATURE - static void lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb); + #if ENABLED(FAST_PWM_FAN) + static void setPwmFrequency(const pin_t pin, int val); #endif - private: - static void update_raw_temperatures(); + static void set_current_temp_raw(); + static void updateTemperaturesFromRawValues(); - #define HAS_MAX6675 EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) - #if HAS_MAX6675 - #define COUNT_6675 1 + BOTH(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) - #if COUNT_6675 > 1 - #define READ_MAX6675(N) read_max6675(N) - #else - #define READ_MAX6675(N) read_max6675() - #endif - static int read_max6675( - #if COUNT_6675 > 1 - const uint8_t hindex=0 - #endif - ); + #if ENABLED(HEATER_0_USES_MAX6675) + static int read_max6675(); #endif static void checkExtruderAutoFans(); - static float get_pid_output_hotend(const uint8_t e); + static float get_pid_output(const int8_t e); - TERN_(PIDTEMPBED, static float get_pid_output_bed()); + #if ENABLED(PIDTEMPBED) + static float get_pid_output_bed(); + #endif - TERN_(HAS_HEATED_CHAMBER, static float get_pid_output_chamber()); + static void _temp_error(const int8_t e, const char * const serial_msg, const char * const lcd_msg); + static void min_temp_error(const int8_t e); + static void max_temp_error(const int8_t e); - static void _temp_error(const heater_id_t e, PGM_P const serial_msg, PGM_P const lcd_msg); - static void min_temp_error(const heater_id_t e); - static void max_temp_error(const heater_id_t e); - - #define HAS_THERMAL_PROTECTION ANY(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER, HAS_THERMALLY_PROTECTED_BED) - - #if HAS_THERMAL_PROTECTION - - // Indices and size for the tr_state_machine array. One for each protected heater. - #define _ENUM_FOR_E(N) RUNAWAY_IND_E##N, - enum RunawayIndex : uint8_t { - #if ENABLED(THERMAL_PROTECTION_HOTENDS) - REPEAT(HOTENDS, _ENUM_FOR_E) - #endif - #if ENABLED(HAS_THERMALLY_PROTECTED_BED) - RUNAWAY_IND_BED, - #endif - #if ENABLED(THERMAL_PROTECTION_CHAMBER) - RUNAWAY_IND_CHAMBER, - #endif - NR_HEATER_RUNAWAY - }; - #undef _ENUM_FOR_E - - // Convert the given heater_id_t to runaway state array index - static inline RunawayIndex runaway_index_for_id(const int8_t heater_id) { - #if HAS_THERMALLY_PROTECTED_CHAMBER - if (heater_id == H_CHAMBER) return RUNAWAY_IND_CHAMBER; - #endif - #if HAS_THERMALLY_PROTECTED_BED - if (heater_id == H_BED) return RUNAWAY_IND_BED; - #endif - return (RunawayIndex)_MAX(heater_id, 0); - } + #if ENABLED(THERMAL_PROTECTION_HOTENDS) || HAS_THERMALLY_PROTECTED_BED enum TRState : char { TRInactive, TRFirstHeating, TRStable, TRRunaway }; - typedef struct { - millis_t timer = 0; - TRState state = TRInactive; - float running_temp; - void run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc); - } tr_state_machine_t; + static void thermal_runaway_protection(TRState * const state, millis_t * const timer, const float ¤t, const float &target, const int8_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc); - static tr_state_machine_t tr_state_machine[NR_HEATER_RUNAWAY]; + #if ENABLED(THERMAL_PROTECTION_HOTENDS) + static TRState thermal_runaway_state_machine[HOTENDS]; + static millis_t thermal_runaway_timer[HOTENDS]; + #endif + + #if HAS_THERMALLY_PROTECTED_BED + static TRState thermal_runaway_bed_state_machine; + static millis_t thermal_runaway_bed_timer; + #endif + + #endif // THERMAL_PROTECTION - #endif // HAS_THERMAL_PROTECTION }; extern Temperature thermalManager; + +#endif // TEMPERATURE_H diff --git a/Marlin/src/module/thermistor/thermistor_1.h b/Marlin/src/module/thermistor/thermistor_1.h index fad7908375..ea887952f5 100644 --- a/Marlin/src/module/thermistor/thermistor_1.h +++ b/Marlin/src/module/thermistor/thermistor_1.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor -const temp_entry_t temptable_1[] PROGMEM = { +const short temptable_1[][2] PROGMEM = { { OV( 23), 300 }, { OV( 25), 295 }, { OV( 27), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_10.h b/Marlin/src/module/thermistor/thermistor_10.h index c24ad40bf4..b54425fff8 100644 --- a/Marlin/src/module/thermistor/thermistor_10.h +++ b/Marlin/src/module/thermistor/thermistor_10.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 3960 K, 4.7 kOhm pull-up, RS thermistor 198-961 -const temp_entry_t temptable_10[] PROGMEM = { +const short temptable_10[][2] PROGMEM = { { OV( 1), 929 }, { OV( 36), 299 }, { OV( 71), 246 }, diff --git a/Marlin/src/module/thermistor/thermistor_1010.h b/Marlin/src/module/thermistor/thermistor_1010.h index 8ab5e3b364..79a557954e 100644 --- a/Marlin/src/module/thermistor/thermistor_1010.h +++ b/Marlin/src/module/thermistor/thermistor_1010.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,26 +16,23 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once - -#define REVERSE_TEMP_SENSOR_RANGE_1010 1 // Pt1000 with 1k0 pullup -const temp_entry_t temptable_1010[] PROGMEM = { - PtLine( 0, 1000, 1000), - PtLine( 25, 1000, 1000), - PtLine( 50, 1000, 1000), - PtLine( 75, 1000, 1000), - PtLine(100, 1000, 1000), - PtLine(125, 1000, 1000), - PtLine(150, 1000, 1000), - PtLine(175, 1000, 1000), - PtLine(200, 1000, 1000), - PtLine(225, 1000, 1000), - PtLine(250, 1000, 1000), - PtLine(275, 1000, 1000), +const short temptable_1010[][2] PROGMEM = { + PtLine( 0, 1000, 1000) + PtLine( 25, 1000, 1000) + PtLine( 50, 1000, 1000) + PtLine( 75, 1000, 1000) + PtLine(100, 1000, 1000) + PtLine(125, 1000, 1000) + PtLine(150, 1000, 1000) + PtLine(175, 1000, 1000) + PtLine(200, 1000, 1000) + PtLine(225, 1000, 1000) + PtLine(250, 1000, 1000) + PtLine(275, 1000, 1000) PtLine(300, 1000, 1000) }; diff --git a/Marlin/src/module/thermistor/thermistor_1047.h b/Marlin/src/module/thermistor/thermistor_1047.h index 6e1b61f9d0..01997abc3a 100644 --- a/Marlin/src/module/thermistor/thermistor_1047.h +++ b/Marlin/src/module/thermistor/thermistor_1047.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,25 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once - -#define REVERSE_TEMP_SENSOR_RANGE_1047 1 // Pt1000 with 4k7 pullup -const temp_entry_t temptable_1047[] PROGMEM = { +const short temptable_1047[][2] PROGMEM = { // only a few values are needed as the curve is very flat - PtLine( 0, 1000, 4700), - PtLine( 50, 1000, 4700), - PtLine(100, 1000, 4700), - PtLine(150, 1000, 4700), - PtLine(200, 1000, 4700), - PtLine(250, 1000, 4700), - PtLine(300, 1000, 4700), - PtLine(350, 1000, 4700), - PtLine(400, 1000, 4700), - PtLine(450, 1000, 4700), - PtLine(500, 1000, 4700) + PtLine( 0, 1000, 4700) + PtLine( 50, 1000, 4700) + PtLine(100, 1000, 4700) + PtLine(150, 1000, 4700) + PtLine(200, 1000, 4700) + PtLine(250, 1000, 4700) + PtLine(300, 1000, 4700) }; diff --git a/Marlin/src/module/thermistor/thermistor_11.h b/Marlin/src/module/thermistor/thermistor_11.h index 345d009a64..eb8030697f 100644 --- a/Marlin/src/module/thermistor/thermistor_11.h +++ b/Marlin/src/module/thermistor/thermistor_11.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, QU-BD silicone bed QWG-104F-3950 thermistor -const temp_entry_t temptable_11[] PROGMEM = { +const short temptable_11[][2] PROGMEM = { { OV( 1), 938 }, { OV( 31), 314 }, { OV( 41), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_110.h b/Marlin/src/module/thermistor/thermistor_110.h index 215495e2c6..7a4c80df71 100644 --- a/Marlin/src/module/thermistor/thermistor_110.h +++ b/Marlin/src/module/thermistor/thermistor_110.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,21 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once - -#define REVERSE_TEMP_SENSOR_RANGE_110 1 // Pt100 with 1k0 pullup -const temp_entry_t temptable_110[] PROGMEM = { +const short temptable_110[][2] PROGMEM = { // only a few values are needed as the curve is very flat - PtLine( 0, 100, 1000), - PtLine( 50, 100, 1000), - PtLine(100, 100, 1000), - PtLine(150, 100, 1000), - PtLine(200, 100, 1000), - PtLine(250, 100, 1000), + PtLine( 0, 100, 1000) + PtLine( 50, 100, 1000) + PtLine(100, 100, 1000) + PtLine(150, 100, 1000) + PtLine(200, 100, 1000) + PtLine(250, 100, 1000) PtLine(300, 100, 1000) }; diff --git a/Marlin/src/module/thermistor/thermistor_12.h b/Marlin/src/module/thermistor/thermistor_12.h index d1ee23b2b7..c05ba4077b 100644 --- a/Marlin/src/module/thermistor/thermistor_12.h +++ b/Marlin/src/module/thermistor/thermistor_12.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 4700 K, 4.7 kOhm pull-up, (personal calibration for Makibox hot bed) -const temp_entry_t temptable_12[] PROGMEM = { +const short temptable_12[][2] PROGMEM = { { OV( 35), 180 }, // top rating 180C { OV( 211), 140 }, { OV( 233), 135 }, diff --git a/Marlin/src/module/thermistor/thermistor_13.h b/Marlin/src/module/thermistor/thermistor_13.h index bb622240c8..b0bfd8aa62 100644 --- a/Marlin/src/module/thermistor/thermistor_13.h +++ b/Marlin/src/module/thermistor/thermistor_13.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, Hisens thermistor -const temp_entry_t temptable_13[] PROGMEM = { +const short temptable_13[][2] PROGMEM = { { OV( 20.04), 300 }, { OV( 23.19), 290 }, { OV( 26.71), 280 }, diff --git a/Marlin/src/module/thermistor/thermistor_147.h b/Marlin/src/module/thermistor/thermistor_147.h index 6d846ad5be..7e4a3b6fb6 100644 --- a/Marlin/src/module/thermistor/thermistor_147.h +++ b/Marlin/src/module/thermistor/thermistor_147.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,21 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once - -#define REVERSE_TEMP_SENSOR_RANGE_147 1 // Pt100 with 4k7 pullup -const temp_entry_t temptable_147[] PROGMEM = { +const short temptable_147[][2] PROGMEM = { // only a few values are needed as the curve is very flat - PtLine( 0, 100, 4700), - PtLine( 50, 100, 4700), - PtLine(100, 100, 4700), - PtLine(150, 100, 4700), - PtLine(200, 100, 4700), - PtLine(250, 100, 4700), + PtLine( 0, 100, 4700) + PtLine( 50, 100, 4700) + PtLine(100, 100, 4700) + PtLine(150, 100, 4700) + PtLine(200, 100, 4700) + PtLine(250, 100, 4700) PtLine(300, 100, 4700) }; diff --git a/Marlin/src/module/thermistor/thermistor_15.h b/Marlin/src/module/thermistor/thermistor_15.h index 46dcce8c1e..8e207cdca4 100644 --- a/Marlin/src/module/thermistor/thermistor_15.h +++ b/Marlin/src/module/thermistor/thermistor_15.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // 100k bed thermistor in JGAurora A5. Calibrated by Sam Pinches 21st Jan 2018 using cheap k-type thermocouple inserted into heater block, using TM-902C meter. -const temp_entry_t temptable_15[] PROGMEM = { +const short temptable_15[][2] PROGMEM = { { OV( 31), 275 }, { OV( 33), 270 }, { OV( 35), 260 }, diff --git a/Marlin/src/module/thermistor/thermistor_18.h b/Marlin/src/module/thermistor/thermistor_18.h deleted file mode 100644 index 9c2d81b3e6..0000000000 --- a/Marlin/src/module/thermistor/thermistor_18.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 - version (measured/tested/approved) -const temp_entry_t temptable_18[] PROGMEM = { - { OV( 1), 713 }, - { OV( 17), 284 }, - { OV( 20), 275 }, - { OV( 23), 267 }, - { OV( 27), 257 }, - { OV( 31), 250 }, - { OV( 37), 240 }, - { OV( 43), 232 }, - { OV( 51), 222 }, - { OV( 61), 213 }, - { OV( 73), 204 }, - { OV( 87), 195 }, - { OV( 106), 185 }, - { OV( 128), 175 }, - { OV( 155), 166 }, - { OV( 189), 156 }, - { OV( 230), 146 }, - { OV( 278), 137 }, - { OV( 336), 127 }, - { OV( 402), 117 }, - { OV( 476), 107 }, - { OV( 554), 97 }, - { OV( 635), 87 }, - { OV( 713), 78 }, - { OV( 784), 68 }, - { OV( 846), 58 }, - { OV( 897), 49 }, - { OV( 937), 39 }, - { OV( 966), 30 }, - { OV( 986), 20 }, - { OV(1000), 10 }, - { OV(1010), 0 }, - { OV(1024),-273 } // for safety -}; diff --git a/Marlin/src/module/thermistor/thermistor_2.h b/Marlin/src/module/thermistor/thermistor_2.h index d0e1e4f3df..e747b2ffad 100644 --- a/Marlin/src/module/thermistor/thermistor_2.h +++ b/Marlin/src/module/thermistor/thermistor_2.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // // R25 = 200 kOhm, beta25 = 4338 K, 4.7 kOhm pull-up, ATC Semitec 204GT-2 -// Verified by linagee. Source: https://www.mouser.com/datasheet/2/362/semitec%20usa%20corporation_gtthermistor-1202937.pdf +// Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf // Calculated using 4.7kohm pullup, voltage divider math, and manufacturer provided temp/resistance // -const temp_entry_t temptable_2[] PROGMEM = { +const short temptable_2[][2] PROGMEM = { { OV( 1), 848 }, { OV( 30), 300 }, // top rating 300C { OV( 34), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_20.h b/Marlin/src/module/thermistor/thermistor_20.h index 73094f1460..1cd9480c80 100644 --- a/Marlin/src/module/thermistor/thermistor_20.h +++ b/Marlin/src/module/thermistor/thermistor_20.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,15 +16,42 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#define REVERSE_TEMP_SENSOR_RANGE_20 1 - -// Pt100 with INA826 amp on Ultimaker v2.0 electronics -const temp_entry_t temptable_20[] PROGMEM = { +// PT100 with INA826 amp on Ultimaker v2.0 electronics +// The PT100 in the Ultimaker v2.0 electronics has a high sample value for a high temperature. +// This does not match the normal thermistor behaviour so we need to set the following defines +#if THERMISTORHEATER_0 == 20 + #define HEATER_0_RAW_HI_TEMP 16383 + #define HEATER_0_RAW_LO_TEMP 0 +#endif +#if THERMISTORHEATER_1 == 20 + #define HEATER_1_RAW_HI_TEMP 16383 + #define HEATER_1_RAW_LO_TEMP 0 +#endif +#if THERMISTORHEATER_2 == 20 + #define HEATER_2_RAW_HI_TEMP 16383 + #define HEATER_2_RAW_LO_TEMP 0 +#endif +#if THERMISTORHEATER_3 == 20 + #define HEATER_3_RAW_HI_TEMP 16383 + #define HEATER_3_RAW_LO_TEMP 0 +#endif +#if THERMISTORHEATER_4 == 20 + #define HEATER_4_RAW_HI_TEMP 16383 + #define HEATER_4_RAW_LO_TEMP 0 +#endif +#if THERMISTORBED == 20 + #define HEATER_BED_RAW_HI_TEMP 16383 + #define HEATER_BED_RAW_LO_TEMP 0 +#endif +#if THERMISTORCHAMBER == 20 + #define HEATER_CHAMBER_RAW_HI_TEMP 16383 + #define HEATER_CHAMBER_RAW_LO_TEMP 0 +#endif +const short temptable_20[][2] PROGMEM = { { OV( 0), 0 }, { OV(227), 1 }, { OV(236), 10 }, diff --git a/Marlin/src/module/thermistor/thermistor_201.h b/Marlin/src/module/thermistor/thermistor_201.h deleted file mode 100644 index 44d5280681..0000000000 --- a/Marlin/src/module/thermistor/thermistor_201.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define REVERSE_TEMP_SENSOR_RANGE_201 1 - -// Pt100 with LMV324 amp on Overlord v1.1 electronics -const temp_entry_t temptable_201[] PROGMEM = { - { OV( 0), 0 }, - { OV( 8), 1 }, - { OV( 23), 6 }, - { OV( 41), 15 }, - { OV( 51), 20 }, - { OV( 68), 28 }, - { OV( 74), 30 }, - { OV( 88), 35 }, - { OV( 99), 40 }, - { OV( 123), 50 }, - { OV( 148), 60 }, - { OV( 173), 70 }, - { OV( 198), 80 }, - { OV( 221), 90 }, - { OV( 245), 100 }, - { OV( 269), 110 }, - { OV( 294), 120 }, - { OV( 316), 130 }, - { OV( 342), 140 }, - { OV( 364), 150 }, - { OV( 387), 160 }, - { OV( 412), 170 }, - { OV( 433), 180 }, - { OV( 456), 190 }, - { OV( 480), 200 }, - { OV( 500), 210 }, - { OV( 548), 224 }, - { OV( 572), 233 }, - { OV(1155), 490 } -}; diff --git a/Marlin/src/module/thermistor/thermistor_202.h b/Marlin/src/module/thermistor/thermistor_202.h deleted file mode 100644 index c5229607ae..0000000000 --- a/Marlin/src/module/thermistor/thermistor_202.h +++ /dev/null @@ -1,69 +0,0 @@ -// -// Unknown 200K thermistor on a Copymaster 3D hotend -// Temptable sent from dealer technologyoutlet.co.uk -// - -const temp_entry_t temptable_202[] PROGMEM = { - { OV( 1), 864 }, - { OV( 35), 300 }, - { OV( 38), 295 }, - { OV( 41), 290 }, - { OV( 44), 285 }, - { OV( 47), 280 }, - { OV( 51), 275 }, - { OV( 55), 270 }, - { OV( 60), 265 }, - { OV( 65), 260 }, - { OV( 70), 255 }, - { OV( 76), 250 }, - { OV( 83), 245 }, - { OV( 90), 240 }, - { OV( 98), 235 }, - { OV( 107), 230 }, - { OV( 116), 225 }, - { OV( 127), 220 }, - { OV( 138), 215 }, - { OV( 151), 210 }, - { OV( 164), 205 }, - { OV( 179), 200 }, - { OV( 195), 195 }, - { OV( 213), 190 }, - { OV( 232), 185 }, - { OV( 253), 180 }, - { OV( 275), 175 }, - { OV( 299), 170 }, - { OV( 325), 165 }, - { OV( 352), 160 }, - { OV( 381), 155 }, - { OV( 411), 150 }, - { OV( 443), 145 }, - { OV( 476), 140 }, - { OV( 511), 135 }, - { OV( 546), 130 }, - { OV( 581), 125 }, - { OV( 617), 120 }, - { OV( 652), 115 }, - { OV( 687), 110 }, - { OV( 720), 105 }, - { OV( 753), 100 }, - { OV( 783), 95 }, - { OV( 812), 90 }, - { OV( 839), 85 }, - { OV( 864), 80 }, - { OV( 886), 75 }, - { OV( 906), 70 }, - { OV( 924), 65 }, - { OV( 940), 60 }, - { OV( 954), 55 }, - { OV( 966), 50 }, - { OV( 976), 45 }, - { OV( 985), 40 }, - { OV( 992), 35 }, - { OV( 998), 30 }, - { OV(1003), 25 }, - { OV(1007), 20 }, - { OV(1011), 15 }, - { OV(1014), 10 }, - { OV(1016), 5 }, - { OV(1018), 0 } -}; diff --git a/Marlin/src/module/thermistor/thermistor_21.h b/Marlin/src/module/thermistor/thermistor_21.h deleted file mode 100644 index cd867df291..0000000000 --- a/Marlin/src/module/thermistor/thermistor_21.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define REVERSE_TEMP_SENSOR_RANGE_21 1 - -#undef OV_SCALE -#define OV_SCALE(N) (float((N) * 5) / 3.3f) - -// Pt100 with INA826 amp with 3.3v excitation based on "Pt100 with INA826 amp on Ultimaker v2.0 electronics" -const temp_entry_t temptable_21[] PROGMEM = { - { OV( 0), 0 }, - { OV(227), 1 }, - { OV(236), 10 }, - { OV(245), 20 }, - { OV(253), 30 }, - { OV(262), 40 }, - { OV(270), 50 }, - { OV(279), 60 }, - { OV(287), 70 }, - { OV(295), 80 }, - { OV(304), 90 }, - { OV(312), 100 }, - { OV(320), 110 }, - { OV(329), 120 }, - { OV(337), 130 }, - { OV(345), 140 }, - { OV(353), 150 }, - { OV(361), 160 }, - { OV(369), 170 }, - { OV(377), 180 }, - { OV(385), 190 }, - { OV(393), 200 }, - { OV(401), 210 }, - { OV(409), 220 }, - { OV(417), 230 }, - { OV(424), 240 }, - { OV(432), 250 }, - { OV(440), 260 }, - { OV(447), 270 }, - { OV(455), 280 }, - { OV(463), 290 }, - { OV(470), 300 }, - { OV(478), 310 }, - { OV(485), 320 }, - { OV(493), 330 }, - { OV(500), 340 }, - { OV(507), 350 }, - { OV(515), 360 }, - { OV(522), 370 }, - { OV(529), 380 }, - { OV(537), 390 }, - { OV(544), 400 }, - { OV(614), 500 } -}; - -#undef OV_SCALE -#define OV_SCALE(N) (N) diff --git a/Marlin/src/module/thermistor/thermistor_22.h b/Marlin/src/module/thermistor/thermistor_22.h deleted file mode 100644 index 6f4a31050a..0000000000 --- a/Marlin/src/module/thermistor/thermistor_22.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// 100k hotend thermistor with 4.7k pull up to 3.3v and 220R to analog input as in GTM32 Pro vB -const temp_entry_t temptable_22[] PROGMEM = { - { OV( 1), 352 }, - { OV( 6), 341 }, - { OV( 11), 330 }, - { OV( 16), 319 }, - { OV( 20), 307 }, - { OV( 26), 296 }, - { OV( 31), 285 }, - { OV( 40), 274 }, - { OV( 51), 263 }, - { OV( 61), 251 }, - { OV( 72), 245 }, - { OV( 77), 240 }, - { OV( 82), 237 }, - { OV( 87), 232 }, - { OV( 91), 229 }, - { OV( 94), 227 }, - { OV( 97), 225 }, - { OV( 100), 223 }, - { OV( 104), 221 }, - { OV( 108), 219 }, - { OV( 115), 214 }, - { OV( 126), 209 }, - { OV( 137), 204 }, - { OV( 147), 200 }, - { OV( 158), 193 }, - { OV( 167), 192 }, - { OV( 177), 189 }, - { OV( 197), 163 }, - { OV( 230), 174 }, - { OV( 267), 165 }, - { OV( 310), 158 }, - { OV( 336), 151 }, - { OV( 379), 143 }, - { OV( 413), 138 }, - { OV( 480), 127 }, - { OV( 580), 110 }, - { OV( 646), 100 }, - { OV( 731), 88 }, - { OV( 768), 84 }, - { OV( 861), 69 }, - { OV( 935), 50 }, - { OV( 975), 38 }, - { OV(1001), 27 }, - { OV(1011), 22 }, - { OV(1015), 13 }, - { OV(1020), 6 }, - { OV(1023), 0 } -}; diff --git a/Marlin/src/module/thermistor/thermistor_23.h b/Marlin/src/module/thermistor/thermistor_23.h deleted file mode 100644 index 02ff9fb2b6..0000000000 --- a/Marlin/src/module/thermistor/thermistor_23.h +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// 100k hotbed thermistor with 4.7k pull up to 3.3v and 220R to analog input as in GTM32 Pro vB -const temp_entry_t temptable_23[] PROGMEM = { - { OV( 1), 938 }, - { OV( 11), 423 }, - { OV( 21), 351 }, - { OV( 31), 314 }, - { OV( 41), 290 }, - { OV( 51), 272 }, - { OV( 61), 258 }, - { OV( 71), 247 }, - { OV( 81), 237 }, - { OV( 91), 229 }, - { OV( 101), 221 }, - { OV( 111), 215 }, - { OV( 121), 209 }, - { OV( 131), 204 }, - { OV( 141), 199 }, - { OV( 151), 195 }, - { OV( 161), 190 }, - { OV( 171), 187 }, - { OV( 181), 183 }, - { OV( 191), 179 }, - { OV( 201), 176 }, - { OV( 211), 173 }, - { OV( 221), 170 }, - { OV( 231), 167 }, - { OV( 241), 165 }, - { OV( 251), 162 }, - { OV( 261), 160 }, - { OV( 271), 157 }, - { OV( 281), 155 }, - { OV( 291), 153 }, - { OV( 301), 150 }, - { OV( 311), 148 }, - { OV( 321), 146 }, - { OV( 331), 144 }, - { OV( 341), 142 }, - { OV( 351), 140 }, - { OV( 361), 139 }, - { OV( 371), 137 }, - { OV( 381), 135 }, - { OV( 391), 133 }, - { OV( 401), 131 }, - { OV( 411), 130 }, - { OV( 421), 128 }, - { OV( 431), 126 }, - { OV( 441), 125 }, - { OV( 451), 123 }, - { OV( 461), 122 }, - { OV( 471), 120 }, - { OV( 481), 119 }, - { OV( 491), 117 }, - { OV( 501), 116 }, - { OV( 511), 114 }, - { OV( 521), 113 }, - { OV( 531), 111 }, - { OV( 541), 110 }, - { OV( 551), 108 }, - { OV( 561), 107 }, - { OV( 571), 105 }, - { OV( 581), 104 }, - { OV( 591), 102 }, - { OV( 601), 101 }, - { OV( 611), 100 }, - { OV( 621), 98 }, - { OV( 631), 97 }, - { OV( 641), 95 }, - { OV( 651), 94 }, - { OV( 661), 92 }, - { OV( 671), 91 }, - { OV( 681), 90 }, - { OV( 691), 88 }, - { OV( 701), 87 }, - { OV( 711), 85 }, - { OV( 721), 84 }, - { OV( 731), 82 }, - { OV( 741), 81 }, - { OV( 751), 79 }, - { OV( 761), 77 }, - { OV( 771), 76 }, - { OV( 781), 74 }, - { OV( 791), 72 }, - { OV( 801), 71 }, - { OV( 811), 69 }, - { OV( 821), 67 }, - { OV( 831), 65 }, - { OV( 841), 63 }, - { OV( 851), 62 }, - { OV( 861), 60 }, - { OV( 871), 57 }, - { OV( 881), 55 }, - { OV( 891), 53 }, - { OV( 901), 51 }, - { OV( 911), 48 }, - { OV( 921), 45 }, - { OV( 931), 42 }, - { OV( 941), 39 }, - { OV( 951), 36 }, - { OV( 961), 32 }, - { OV( 971), 28 }, - { OV( 981), 25 }, - { OV( 991), 23 }, - { OV(1001), 21 }, - { OV(1011), 19 }, - { OV(1021), 5 } -}; diff --git a/Marlin/src/module/thermistor/thermistor_3.h b/Marlin/src/module/thermistor/thermistor_3.h index 74e00e2ba4..a82a9b6ff9 100644 --- a/Marlin/src/module/thermistor/thermistor_3.h +++ b/Marlin/src/module/thermistor/thermistor_3.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 4120 K, 4.7 kOhm pull-up, mendel-parts -const temp_entry_t temptable_3[] PROGMEM = { +const short temptable_3[][2] PROGMEM = { { OV( 1), 864 }, { OV( 21), 300 }, { OV( 25), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_30.h b/Marlin/src/module/thermistor/thermistor_30.h deleted file mode 100644 index bc1781b135..0000000000 --- a/Marlin/src/module/thermistor/thermistor_30.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up -// Resistance 100k Ohms at 25deg. C -// Resistance Tolerance + / -1% -// B Value 3950K at 25/50 deg. C -// B Value Tolerance + / - 1% -// Kis3d Silicone Heater 24V 200W/300W with 6mm Precision cast plate (EN AW 5083) -// Temperature setting time 10 min to determine the 12Bit ADC value on the surface. (le3tspeak) -const temp_entry_t temptable_30[] PROGMEM = { - { OV( 1), 938 }, - { OV( 298), 125 }, // 1193 - 125° - { OV( 321), 121 }, // 1285 - 121° - { OV( 348), 117 }, // 1392 - 117° - { OV( 387), 113 }, // 1550 - 113° - { OV( 411), 110 }, // 1644 - 110° - { OV( 445), 106 }, // 1780 - 106° - { OV( 480), 101 }, // 1920 - 101° - { OV( 516), 97 }, // 2064 - 97° - { OV( 553), 92 }, // 2212 - 92° - { OV( 591), 88 }, // 2364 - 88° - { OV( 628), 84 }, // 2512 - 84° - { OV( 665), 79 }, // 2660 - 79° - { OV( 702), 75 }, // 2808 - 75° - { OV( 736), 71 }, // 2945 - 71° - { OV( 770), 67 }, // 3080 - 67° - { OV( 801), 63 }, // 3204 - 63° - { OV( 830), 59 }, // 3320 - 59° - { OV( 857), 55 }, // 3428 - 55° - { OV( 881), 51 }, // 3524 - 51° - { OV( 902), 47 }, // 3611 - 47° - { OV( 922), 42 }, // 3688 - 42° - { OV( 938), 38 }, // 3754 - 38° - { OV( 952), 34 }, // 3811 - 34° - { OV( 964), 29 }, // 3857 - 29° - { OV( 975), 25 }, // 3900 - 25° - { OV( 980), 23 }, // 3920 - 23° - { OV( 991), 17 }, // 3964 - 17° - { OV(1001), 9 }, // Calculated - { OV(1004), 5 }, // Calculated - { OV(1008), 0 }, // Calculated - { OV(1012), -5 }, // Calculated - { OV(1016), -10 }, // Calculated - { OV(1020), -15 } // Calculated -}; diff --git a/Marlin/src/module/thermistor/thermistor_331.h b/Marlin/src/module/thermistor/thermistor_331.h deleted file mode 100644 index ccb0f6b62d..0000000000 --- a/Marlin/src/module/thermistor/thermistor_331.h +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define OVM(V) OV((V)*(0.327/0.5)) - -// R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor -const temp_entry_t temptable_331[] PROGMEM = { - { OVM( 23), 300 }, - { OVM( 25), 295 }, - { OVM( 27), 290 }, - { OVM( 28), 285 }, - { OVM( 31), 280 }, - { OVM( 33), 275 }, - { OVM( 35), 270 }, - { OVM( 38), 265 }, - { OVM( 41), 260 }, - { OVM( 44), 255 }, - { OVM( 48), 250 }, - { OVM( 52), 245 }, - { OVM( 56), 240 }, - { OVM( 61), 235 }, - { OVM( 66), 230 }, - { OVM( 71), 225 }, - { OVM( 78), 220 }, - { OVM( 84), 215 }, - { OVM( 92), 210 }, - { OVM( 100), 205 }, - { OVM( 109), 200 }, - { OVM( 120), 195 }, - { OVM( 131), 190 }, - { OVM( 143), 185 }, - { OVM( 156), 180 }, - { OVM( 171), 175 }, - { OVM( 187), 170 }, - { OVM( 205), 165 }, - { OVM( 224), 160 }, - { OVM( 245), 155 }, - { OVM( 268), 150 }, - { OVM( 293), 145 }, - { OVM( 320), 140 }, - { OVM( 348), 135 }, - { OVM( 379), 130 }, - { OVM( 411), 125 }, - { OVM( 445), 120 }, - { OVM( 480), 115 }, - { OVM( 516), 110 }, - { OVM( 553), 105 }, - { OVM( 591), 100 }, - { OVM( 628), 95 }, - { OVM( 665), 90 }, - { OVM( 702), 85 }, - { OVM( 737), 80 }, - { OVM( 770), 75 }, - { OVM( 801), 70 }, - { OVM( 830), 65 }, - { OVM( 857), 60 }, - { OVM( 881), 55 }, - { OVM( 903), 50 }, - { OVM( 922), 45 }, - { OVM( 939), 40 }, - { OVM( 954), 35 }, - { OVM( 966), 30 }, - { OVM( 977), 25 }, - { OVM( 985), 20 }, - { OVM( 993), 15 }, - { OVM( 999), 10 }, - { OVM(1004), 5 }, - { OVM(1008), 0 }, - { OVM(1012), -5 }, - { OVM(1016), -10 }, - { OVM(1020), -15 } -}; diff --git a/Marlin/src/module/thermistor/thermistor_332.h b/Marlin/src/module/thermistor/thermistor_332.h deleted file mode 100644 index 9502f1bdae..0000000000 --- a/Marlin/src/module/thermistor/thermistor_332.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define OVM(V) OV((V)*(0.327/0.327)) - -// R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor -const temp_entry_t temptable_332[] PROGMEM = { - { OVM( 268), 150 }, - { OVM( 293), 145 }, - { OVM( 320), 141 }, - { OVM( 379), 133 }, - { OVM( 445), 122 }, - { OVM( 516), 108 }, - { OVM( 591), 98 }, - { OVM( 665), 88 }, - { OVM( 737), 79 }, - { OVM( 801), 70 }, - { OVM( 857), 55 }, - { OVM( 903), 46 }, - { OVM( 939), 39 }, - { OVM( 954), 33 }, - { OVM( 966), 27 }, - { OVM( 977), 22 }, - { OVM( 999), 15 }, - { OVM(1004), 5 }, - { OVM(1008), 0 }, - { OVM(1012), -5 }, - { OVM(1016), -10 }, - { OVM(1020), -15 } -}; diff --git a/Marlin/src/module/thermistor/thermistor_4.h b/Marlin/src/module/thermistor/thermistor_4.h index 92d907249b..6c3ea61709 100644 --- a/Marlin/src/module/thermistor/thermistor_4.h +++ b/Marlin/src/module/thermistor/thermistor_4.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 10 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, Generic 10k thermistor -const temp_entry_t temptable_4[] PROGMEM = { +const short temptable_4[][2] PROGMEM = { { OV( 1), 430 }, { OV( 54), 137 }, { OV( 107), 107 }, diff --git a/Marlin/src/module/thermistor/thermistor_5.h b/Marlin/src/module/thermistor/thermistor_5.h index 1d5fa2fec7..676fbbd460 100644 --- a/Marlin/src/module/thermistor/thermistor_5.h +++ b/Marlin/src/module/thermistor/thermistor_5.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 4267 K, 4.7 kOhm pull-up // 100k ParCan thermistor (104GT-2) // ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan) -// Verified by linagee. Source: https://www.mouser.com/datasheet/2/362/semitec%20usa%20corporation_gtthermistor-1202937.pdf +// Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf // Calculated using 4.7kohm pullup, voltage divider math, and manufacturer provided temp/resistance -const temp_entry_t temptable_5[] PROGMEM = { +const short temptable_5[][2] PROGMEM = { { OV( 1), 713 }, { OV( 17), 300 }, // top rating 300C { OV( 20), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_501.h b/Marlin/src/module/thermistor/thermistor_501.h index d40e341f7e..512ac0d8d8 100644 --- a/Marlin/src/module/thermistor/thermistor_501.h +++ b/Marlin/src/module/thermistor/thermistor_501.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,43 +16,42 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // 100k Zonestar thermistor. Adjusted By Hally -const temp_entry_t temptable_501[] PROGMEM = { - { OV( 1), 713 }, - { OV( 14), 300 }, // Top rating 300C - { OV( 16), 290 }, - { OV( 19), 280 }, - { OV( 23), 270 }, - { OV( 27), 260 }, - { OV( 31), 250 }, - { OV( 37), 240 }, - { OV( 47), 230 }, - { OV( 57), 220 }, - { OV( 68), 210 }, - { OV( 84), 200 }, - { OV( 100), 190 }, - { OV( 128), 180 }, - { OV( 155), 170 }, - { OV( 189), 160 }, - { OV( 230), 150 }, - { OV( 278), 140 }, - { OV( 336), 130 }, - { OV( 402), 120 }, - { OV( 476), 110 }, - { OV( 554), 100 }, - { OV( 635), 90 }, - { OV( 713), 80 }, - { OV( 784), 70 }, - { OV( 846), 60 }, - { OV( 897), 50 }, - { OV( 937), 40 }, - { OV( 966), 30 }, - { OV( 986), 20 }, - { OV(1000), 10 }, - { OV(1010), 0 } +const short temptable_501[][2] PROGMEM = { + {OV( 1), 713}, + {OV( 14), 300}, // Top rating 300C + {OV( 16), 290}, + {OV( 19), 280}, + {OV( 23), 270}, + {OV( 27), 260}, + {OV( 32), 250}, + {OV( 30), 240}, + {OV( 47), 230}, + {OV( 57), 220}, + {OV( 68), 210}, + {OV( 84), 200}, + {OV( 100), 190}, + {OV( 128), 180}, + {OV( 155), 170}, + {OV( 189), 160}, + {OV( 230), 150}, + {OV( 278), 140}, + {OV( 336), 130}, + {OV( 402), 120}, + {OV( 476), 110}, + {OV( 554), 100}, + {OV( 635), 90}, + {OV( 713), 80}, + {OV( 784), 70}, + {OV( 846), 60}, + {OV( 897), 50}, + {OV( 937), 40}, + {OV( 966), 30}, + {OV( 986), 20}, + {OV(1000), 10}, + {OV(1010), 0} }; diff --git a/Marlin/src/module/thermistor/thermistor_502.h b/Marlin/src/module/thermistor/thermistor_502.h deleted file mode 100644 index 69cee2431c..0000000000 --- a/Marlin/src/module/thermistor/thermistor_502.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// Unknown thermistor for the Zonestar P802M hot bed. Adjusted By Nerseth -// These were the shipped settings from Zonestar in original firmware: P802M_8_Repetier_V1.6_Zonestar.zip -const temp_entry_t temptable_502[] PROGMEM = { - { OV( 56.0 / 4), 300 }, - { OV( 187.0 / 4), 250 }, - { OV( 615.0 / 4), 190 }, - { OV( 690.0 / 4), 185 }, - { OV( 750.0 / 4), 180 }, - { OV( 830.0 / 4), 175 }, - { OV( 920.0 / 4), 170 }, - { OV(1010.0 / 4), 165 }, - { OV(1118.0 / 4), 160 }, - { OV(1215.0 / 4), 155 }, - { OV(1330.0 / 4), 145 }, - { OV(1460.0 / 4), 140 }, - { OV(1594.0 / 4), 135 }, - { OV(1752.0 / 4), 130 }, - { OV(1900.0 / 4), 125 }, - { OV(2040.0 / 4), 120 }, - { OV(2200.0 / 4), 115 }, - { OV(2350.0 / 4), 110 }, - { OV(2516.0 / 4), 105 }, - { OV(2671.0 / 4), 98 }, - { OV(2831.0 / 4), 92 }, - { OV(2975.0 / 4), 85 }, - { OV(3115.0 / 4), 76 }, - { OV(3251.0 / 4), 72 }, - { OV(3480.0 / 4), 62 }, - { OV(3580.0 / 4), 52 }, - { OV(3660.0 / 4), 46 }, - { OV(3740.0 / 4), 40 }, - { OV(3869.0 / 4), 30 }, - { OV(3912.0 / 4), 25 }, - { OV(3948.0 / 4), 20 }, - { OV(4077.0 / 4), -20 }, - { OV(4094.0 / 4), -55 } -}; diff --git a/Marlin/src/module/thermistor/thermistor_51.h b/Marlin/src/module/thermistor/thermistor_51.h index d02dd47ba5..0746c70558 100644 --- a/Marlin/src/module/thermistor/thermistor_51.h +++ b/Marlin/src/module/thermistor/thermistor_51.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 4092 K, 1 kOhm pull-up, // 100k EPCOS (WITH 1kohm RESISTOR FOR PULLUP, R9 ON SANGUINOLOLU! NOT FOR 4.7kohm PULLUP! THIS IS NOT NORMAL!) // Verified by linagee. // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance // Advantage: Twice the resolution and better linearity from 150C to 200C -const temp_entry_t temptable_51[] PROGMEM = { +const short temptable_51[][2] PROGMEM = { { OV( 1), 350 }, { OV( 190), 250 }, // top rating 250C { OV( 203), 245 }, diff --git a/Marlin/src/module/thermistor/thermistor_512.h b/Marlin/src/module/thermistor/thermistor_512.h deleted file mode 100644 index e8021e1e48..0000000000 --- a/Marlin/src/module/thermistor/thermistor_512.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// 100k thermistor supplied with RPW-Ultra hotend, 4.7k pullup - -const temp_entry_t temptable_512[] PROGMEM = { - { OV(26), 300 }, - { OV(28), 295 }, - { OV(30), 290 }, - { OV(32), 285 }, - { OV(34), 280 }, - { OV(37), 275 }, - { OV(39), 270 }, - { OV(42), 265 }, - { OV(46), 260 }, - { OV(49), 255 }, - { OV(53), 250 }, // 256.5 - { OV(57), 245 }, - { OV(62), 240 }, - { OV(67), 235 }, - { OV(73), 230 }, - { OV(79), 225 }, - { OV(86), 220 }, - { OV(94), 215 }, - { OV(103), 210 }, - { OV(112), 205 }, - { OV(123), 200 }, - { OV(135), 195 }, - { OV(148), 190 }, - { OV(162), 185 }, - { OV(178), 180 }, - { OV(195), 175 }, - { OV(215), 170 }, - { OV(235), 165 }, - { OV(258), 160 }, - { OV(283), 155 }, - { OV(310), 150 }, // 2040.6 - { OV(338), 145 }, - { OV(369), 140 }, - { OV(401), 135 }, - { OV(435), 130 }, - { OV(470), 125 }, - { OV(505), 120 }, - { OV(542), 115 }, - { OV(579), 110 }, - { OV(615), 105 }, - { OV(651), 100 }, - { OV(686), 95 }, - { OV(720), 90 }, - { OV(751), 85 }, - { OV(781), 80 }, - { OV(809), 75 }, - { OV(835), 70 }, - { OV(858), 65 }, - { OV(880), 60 }, - { OV(899), 55 }, - { OV(915), 50 }, - { OV(930), 45 }, - { OV(944), 40 }, - { OV(955), 35 }, - { OV(965), 30 }, // 78279.3 - { OV(974), 25 }, - { OV(981), 20 }, - { OV(988), 15 }, - { OV(993), 10 }, - { OV(998), 5 }, - { OV(1002), 0 }, -}; diff --git a/Marlin/src/module/thermistor/thermistor_52.h b/Marlin/src/module/thermistor/thermistor_52.h index 5c9cb9dc4d..63b53e1a70 100644 --- a/Marlin/src/module/thermistor/thermistor_52.h +++ b/Marlin/src/module/thermistor/thermistor_52.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 200 kOhm, beta25 = 4338 K, 1 kOhm pull-up, // 200k ATC Semitec 204GT-2 (WITH 1kohm RESISTOR FOR PULLUP, R9 ON SANGUINOLOLU! NOT FOR 4.7kohm PULLUP! THIS IS NOT NORMAL!) -// Verified by linagee. Source: https://www.mouser.com/datasheet/2/362/semitec%20usa%20corporation_gtthermistor-1202937.pdf +// Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance // Advantage: More resolution and better linearity from 150C to 200C -const temp_entry_t temptable_52[] PROGMEM = { +const short temptable_52[][2] PROGMEM = { { OV( 1), 500 }, { OV( 125), 300 }, // top rating 300C { OV( 142), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_55.h b/Marlin/src/module/thermistor/thermistor_55.h index 707b7d420a..aa6677febe 100644 --- a/Marlin/src/module/thermistor/thermistor_55.h +++ b/Marlin/src/module/thermistor/thermistor_55.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 4267 K, 1 kOhm pull-up, // 100k ATC Semitec 104GT-2 (Used on ParCan) (WITH 1kohm RESISTOR FOR PULLUP, R9 ON SANGUINOLOLU! NOT FOR 4.7kohm PULLUP! THIS IS NOT NORMAL!) -// Verified by linagee. Source: https://www.mouser.com/datasheet/2/362/semitec%20usa%20corporation_gtthermistor-1202937.pdf +// Verified by linagee. Source: http://shop.arcol.hu/static/datasheets/thermistors.pdf // Calculated using 1kohm pullup, voltage divider math, and manufacturer provided temp/resistance // Advantage: More resolution and better linearity from 150C to 200C -const temp_entry_t temptable_55[] PROGMEM = { +const short temptable_55[][2] PROGMEM = { { OV( 1), 500 }, { OV( 76), 300 }, { OV( 87), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_6.h b/Marlin/src/module/thermistor/thermistor_6.h index 68113419e5..bb97267ba9 100644 --- a/Marlin/src/module/thermistor/thermistor_6.h +++ b/Marlin/src/module/thermistor/thermistor_6.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 4092 K, 8.2 kOhm pull-up, 100k Epcos (?) thermistor -const temp_entry_t temptable_6[] PROGMEM = { +const short temptable_6[][2] PROGMEM = { { OV( 1), 350 }, { OV( 28), 250 }, // top rating 250C { OV( 31), 245 }, diff --git a/Marlin/src/module/thermistor/thermistor_60.h b/Marlin/src/module/thermistor/thermistor_60.h index a3fe50559f..ab92406f46 100644 --- a/Marlin/src/module/thermistor/thermistor_60.h +++ b/Marlin/src/module/thermistor/thermistor_60.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, // Maker's Tool Works Kapton Bed Thermistor @@ -31,7 +30,7 @@ // beta: 3950 // min adc: 1 at 0.0048828125 V // max adc: 1023 at 4.9951171875 V -const temp_entry_t temptable_60[] PROGMEM = { +const short temptable_60[][2] PROGMEM = { { OV( 51), 272 }, { OV( 61), 258 }, { OV( 71), 247 }, diff --git a/Marlin/src/module/thermistor/thermistor_61.h b/Marlin/src/module/thermistor/thermistor_61.h deleted file mode 100644 index ed4c4c8859..0000000000 --- a/Marlin/src/module/thermistor/thermistor_61.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, -// Formbot / Vivedino high temp 100k thermistor -// 100KR13950181203 -// Generated with modified version of https://www.thingiverse.com/thing:103668 -// Using table 1 with datasheet values -// Resistance 100k Ohms at 25deg. C -// Resistance Tolerance + / -1% -// B Value 3950K at 25/50 deg. C -// B Value Tolerance + / - 1% -const temp_entry_t temptable_61[] PROGMEM = { - { OV( 2.00), 420 }, // Guestimate to ensure we dont lose a reading and drop temps to -50 when over - { OV( 12.07), 350 }, - { OV( 12.79), 345 }, - { OV( 13.59), 340 }, - { OV( 14.44), 335 }, - { OV( 15.37), 330 }, - { OV( 16.38), 325 }, - { OV( 17.46), 320 }, - { OV( 18.63), 315 }, - { OV( 19.91), 310 }, - { OV( 21.29), 305 }, - { OV( 22.79), 300 }, - { OV( 24.43), 295 }, - { OV( 26.21), 290 }, - { OV( 28.15), 285 }, - { OV( 30.27), 280 }, - { OV( 32.58), 275 }, - { OV( 35.10), 270 }, - { OV( 38.44), 265 }, - { OV( 40.89), 260 }, - { OV( 44.19), 255 }, - { OV( 47.83), 250 }, - { OV( 51.80), 245 }, - { OV( 56.20), 240 }, - { OV( 61.00), 235 }, - { OV( 66.30), 230 }, - { OV( 72.11), 225 }, - { OV( 78.51), 220 }, - { OV( 85.57), 215 }, - { OV( 93.34), 210 }, - { OV( 101.91), 205 }, - { OV( 111.34), 200 }, - { OV( 121.73), 195 }, - { OV( 133.17), 190 }, - { OV( 145.74), 185 }, - { OV( 159.57), 180 }, - { OV( 174.73), 175 }, - { OV( 191.35), 170 }, - { OV( 209.53), 165 }, - { OV( 229.35), 160 }, - { OV( 250.90), 155 }, - { OV( 274.25), 150 }, - { OV( 299.46), 145 }, - { OV( 326.52), 140 }, - { OV( 355.44), 135 }, - { OV( 386.15), 130 }, - { OV( 418.53), 125 }, - { OV( 452.43), 120 }, - { OV( 487.62), 115 }, - { OV( 523.82), 110 }, - { OV( 560.70), 105 }, - { OV( 597.88), 100 }, - { OV( 634.97), 95 }, - { OV( 671.55), 90 }, - { OV( 707.21), 85 }, - { OV( 741.54), 80 }, - { OV( 779.65), 75 }, - { OV( 809.57), 70 }, - { OV( 833.40), 65 }, - { OV( 859.55), 60 }, - { OV( 883.27), 55 }, - { OV( 904.53), 50 }, - { OV( 923.38), 45 }, - { OV( 939.91), 40 }, - { OV( 954.26), 35 }, - { OV( 966.59), 30 }, - { OV( 977.08), 25 }, - { OV( 985.92), 20 }, - { OV( 993.39), 15 }, - { OV( 999.42), 10 }, - { OV(1004.43), 5 }, - { OV(1008.51), 0 }, - { OV(1011.79), -5 }, - { OV(1014.40), -10 }, - { OV(1016.48), -15 }, - { OV(1018.10), -20 }, - { OV(1019.35), -25 }, - { OV(1020.32), -30 }, - { OV(1021.05), -35 }, - { OV(1021.60), -40 }, - { OV(1022.01), -45 }, - { OV(1022.31), -50 } -}; diff --git a/Marlin/src/module/thermistor/thermistor_66.h b/Marlin/src/module/thermistor/thermistor_66.h index 0ad5994ea8..197029082c 100644 --- a/Marlin/src/module/thermistor/thermistor_66.h +++ b/Marlin/src/module/thermistor/thermistor_66.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 2.5 MOhm, beta25 = 4500 K, 4.7 kOhm pull-up, DyzeDesign 500 °C Thermistor -const temp_entry_t temptable_66[] PROGMEM = { +const short temptable_66[][2] PROGMEM = { { OV( 17.5), 850 }, { OV( 17.9), 500 }, { OV( 21.7), 480 }, @@ -48,6 +47,6 @@ const temp_entry_t temptable_66[] PROGMEM = { { OV(1006.6), 80 }, { OV(1015.8), 60 }, { OV(1021.3), 30 }, - { OV( 1022), 25 }, + { OV( 1023) - 1, 25 }, { OV( 1023), 20 } }; diff --git a/Marlin/src/module/thermistor/thermistor_666.h b/Marlin/src/module/thermistor/thermistor_666.h old mode 100644 new mode 100755 index 490dbd5f3e..be76b03dfa --- a/Marlin/src/module/thermistor/thermistor_666.h +++ b/Marlin/src/module/thermistor/thermistor_666.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * This file was generated by tltgen on Thu Jul 5 15:46:43 2018. @@ -33,7 +32,8 @@ * B: 0.00031362 * C: -2.03978e-07 */ -const temp_entry_t temptable_666[] PROGMEM = { +#define NUMTEMPS 61 +const short temptable_666[NUMTEMPS][2] PROGMEM = { { OV( 1), 794 }, { OV( 18), 288 }, { OV( 35), 234 }, diff --git a/Marlin/src/module/thermistor/thermistor_67.h b/Marlin/src/module/thermistor/thermistor_67.h deleted file mode 100644 index 7d6d7f697d..0000000000 --- a/Marlin/src/module/thermistor/thermistor_67.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// R25 = 500 KOhm, beta25 = 3800 K, 4.7 kOhm pull-up, SliceEngineering 450 °C Thermistor -const temp_entry_t temptable_67[] PROGMEM = { - { OV( 22 ), 500 }, - { OV( 23 ), 490 }, - { OV( 25 ), 480 }, - { OV( 27 ), 470 }, - { OV( 29 ), 460 }, - { OV( 32 ), 450 }, - { OV( 35 ), 440 }, - { OV( 38 ), 430 }, - { OV( 41 ), 420 }, - { OV( 45 ), 410 }, - { OV( 50 ), 400 }, - { OV( 55 ), 390 }, - { OV( 60 ), 380 }, - { OV( 67 ), 370 }, - { OV( 74 ), 360 }, - { OV( 82 ), 350 }, - { OV( 91 ), 340 }, - { OV( 102 ), 330 }, - { OV( 114 ), 320 }, - { OV( 127 ), 310 }, - { OV( 143 ), 300 }, - { OV( 161 ), 290 }, - { OV( 181 ), 280 }, - { OV( 204 ), 270 }, - { OV( 229 ), 260 }, - { OV( 259 ), 250 }, - { OV( 290 ), 240 }, - { OV( 325 ), 230 }, - { OV( 364 ), 220 }, - { OV( 407 ), 210 }, - { OV( 453 ), 200 }, - { OV( 501 ), 190 }, - { OV( 551 ), 180 }, - { OV( 603 ), 170 }, - { OV( 655 ), 160 }, - { OV( 706 ), 150 }, - { OV( 755 ), 140 }, - { OV( 801 ), 130 }, - { OV( 842 ), 120 }, - { OV( 879 ), 110 }, - { OV( 910 ), 100 }, - { OV( 936 ), 90 }, - { OV( 948 ), 85 }, - { OV( 958 ), 80 }, - { OV( 975 ), 70 }, - { OV( 988 ), 60 }, - { OV( 998 ), 50 }, - { OV(1006 ), 40 }, - { OV(1011 ), 30 }, - { OV(1013 ), 25 }, - { OV(1015 ), 20 }, - { OV(1018 ), 10 }, - { OV(1020 ), 0 }, - { OV(1021 ), -10 }, - { OV(1022 ), -20 } -}; diff --git a/Marlin/src/module/thermistor/thermistor_7.h b/Marlin/src/module/thermistor/thermistor_7.h index 7a73755984..025c53ce97 100644 --- a/Marlin/src/module/thermistor/thermistor_7.h +++ b/Marlin/src/module/thermistor/thermistor_7.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 3974 K, 4.7 kOhm pull-up, Honeywell 135-104LAG-J01 -const temp_entry_t temptable_7[] PROGMEM = { +const short temptable_7[][2] PROGMEM = { { OV( 1), 941 }, { OV( 19), 362 }, { OV( 37), 299 }, // top rating 300C diff --git a/Marlin/src/module/thermistor/thermistor_70.h b/Marlin/src/module/thermistor/thermistor_70.h index 466b925553..2f9434e300 100644 --- a/Marlin/src/module/thermistor/thermistor_70.h +++ b/Marlin/src/module/thermistor/thermistor_70.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // Stock BQ Hephestos 2 100k thermistor. // Created on 29/12/2017 with an ambient temperature of 20C. // ANENG AN8009 DMM with a K-type probe used for measurements. // R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, bqh2 stock thermistor -const temp_entry_t temptable_70[] PROGMEM = { +const short temptable_70[][2] PROGMEM = { { OV( 18), 270 }, { OV( 27), 248 }, { OV( 34), 234 }, diff --git a/Marlin/src/module/thermistor/thermistor_71.h b/Marlin/src/module/thermistor/thermistor_71.h index abd7fc5b98..f28a4ceabb 100644 --- a/Marlin/src/module/thermistor/thermistor_71.h +++ b/Marlin/src/module/thermistor/thermistor_71.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 3974 K, 4.7 kOhm pull-up, Honeywell 135-104LAF-J01 // R0 = 100000 Ohm @@ -27,7 +26,7 @@ // Beta = 3974 // R1 = 0 Ohm // R2 = 4700 Ohm -const temp_entry_t temptable_71[] PROGMEM = { +const short temptable_71[][2] PROGMEM = { { OV( 35), 300 }, { OV( 51), 269 }, { OV( 59), 258 }, diff --git a/Marlin/src/module/thermistor/thermistor_75.h b/Marlin/src/module/thermistor/thermistor_75.h index 79800d2e40..5d9350a9ce 100644 --- a/Marlin/src/module/thermistor/thermistor_75.h +++ b/Marlin/src/module/thermistor/thermistor_75.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,65 +16,55 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -/** - * R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, - * Generic Silicon Heat Pad with NTC 100K thermistor - * - * Many generic silicone heat pads use the MGB18-104F39050L32 thermistor, applicable to various - * wattages and voltages. This table is correct if this part is used. It's been optimized - * to provide good granularity in the 60-110C range, good for PLA and ABS. For higher temperature - * filament (e.g., nylon) uncomment HIGH_TEMP_RANGE_75 for increased accuracy. If higher - * temperatures aren't used it can improve performance slightly to leave it commented out. - */ +// R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, +// Generic Silicon Heat Pad with NTC 100K thermistor +// +// Many of the generic silicon heat pads use the MGB18-104F39050L32 Thermistor It is used for various +// wattage and voltage heat pads. This table is correct if this part is used. It has been +// optimized to provide good granularity around the 60 C. and 110 C. which corrisponds to bed temperatures +// for PLA and ABS. If you are printing higher temperature filament such as nylon you can uncomment +// the higher earlier entries in the table to give better accuracy. But for speed reasons, if these +// temperatures are not going to be used, it is better to leave them commented out. -//#define HIGH_TEMP_RANGE_75 - -const temp_entry_t temptable_75[] PROGMEM = { // Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor - { OV(111.06), 200 }, // v=0.542 r=571.747 res=0.501 degC/count - - #ifdef HIGH_TEMP_RANGE_75 - { OV(174.87), 175 }, // v=0.854 r=967.950 res=0.311 degC/count These values are valid. But they serve no - { OV(191.64), 170 }, // v=0.936 r=1082.139 res=0.284 degC/count purpose. It is better to delete them so - { OV(209.99), 165 }, // v=1.025 r=1212.472 res=0.260 degC/count the search is quicker and get to the meaningful - { OV(230.02), 160 }, // v=1.123 r=1361.590 res=0.239 degC/count part of the table sooner. - { OV(251.80), 155 }, // v=1.230 r=1532.621 res=0.220 degC/count - #endif - - { OV(275.43), 150 }, // v=1.345 r=1729.283 res=0.203 degC/count - - #ifdef HIGH_TEMP_RANGE_75 - { OV(300.92), 145 }, // v=1.469 r=1956.004 res=0.189 degC/coun - #endif - - { OV( 328.32), 140 }, // v=1.603 r=2218.081 res=0.176 degC/count - { OV( 388.65), 130 }, // v=1.898 r=2874.980 res=0.156 degC/count - { OV( 421.39), 125 }, // v=2.058 r=3286.644 res=0.149 degC/count - { OV( 455.65), 120 }, // v=2.225 r=3768.002 res=0.143 degC/count - { OV( 491.17), 115 }, // v=2.398 r=4332.590 res=0.139 degC/count - { OV( 527.68), 110 }, // v=2.577 r=4996.905 res=0.136 degC/count - { OV( 564.81), 105 }, // v=2.758 r=5781.120 res=0.134 degC/count - { OV( 602.19), 100 }, // v=2.940 r=6710.000 res=0.134 degC/count - { OV( 676.03), 90 }, // v=3.301 r=9131.018 res=0.138 degC/count - { OV( 745.85), 80 }, // v=3.642 r=12602.693 res=0.150 degC/count - { OV( 778.31), 75 }, // v=3.800 r=14889.001 res=0.159 degC/count - { OV( 808.75), 70 }, // v=3.949 r=17658.700 res=0.171 degC/count - { OV( 836.94), 65 }, // v=4.087 r=21028.040 res=0.185 degC/count - { OV( 862.74), 60 }, // v=4.213 r=25144.568 res=0.204 degC/count - { OV( 886.08), 55 }, // v=4.327 r=30196.449 res=0.227 degC/count - { OV( 906.97), 50 }, // v=4.429 r=36424.838 res=0.255 degC/count - { OV( 941.65), 40 }, // v=4.598 r=53745.337 res=0.333 degC/count - { OV( 967.76), 30 }, // v=4.725 r=80880.630 res=0.452 degC/count - { OV( 978.03), 25 }, // v=4.776 r=100000.000 res=0.535 degC/count - { OV( 981.68), 23 }, // v=4.793 r=109024.395 res=0.573 degC/count - { OV( 983.41), 22 }, // v=4.802 r=113875.430 res=0.594 degC/count - { OV( 985.08), 21 }, // v=4.810 r=118968.955 res=0.616 degC/count - { OV( 986.70), 20 }, // v=4.818 r=124318.354 res=0.638 degC/count - { OV( 993.94), 15 }, // v=4.853 r=155431.302 res=0.768 degC/count - { OV( 999.96), 10 }, // v=4.883 r=195480.023 res=0.934 degC/count - { OV(1008.95), 0 } // v=4.926 r=314997.575 res=1.418 degC/count +const short temptable_75[][2] PROGMEM = { // Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + { (short) ( 111.06 * OVERSAMPLENR ), 200 }, // v=0.542 r=571.747 res=0.501 degC/count +// { (short) ( 174.87 * OVERSAMPLENR ), 175 }, // v=0.854 r=967.950 res=0.311 degC/count These values are valid. But they serve no +// { (short) ( 191.64 * OVERSAMPLENR ), 170 }, // v=0.936 r=1082.139 res=0.284 degC/count purpose. It is better to delete them so +// { (short) ( 209.99 * OVERSAMPLENR ), 165 }, // v=1.025 r=1212.472 res=0.260 degC/count the search is quicker and get to the meaningful +// { (short) ( 230.02 * OVERSAMPLENR ), 160 }, // v=1.123 r=1361.590 res=0.239 degC/count part of the table sooner. +// { (short) ( 251.80 * OVERSAMPLENR ), 155 }, // v=1.230 r=1532.621 res=0.220 degC/count + { (short) ( 275.43 * OVERSAMPLENR ), 150 }, // v=1.345 r=1729.283 res=0.203 degC/count +// { (short) ( 300.92 * OVERSAMPLENR ), 145 }, // v=1.469 r=1956.004 res=0.189 degC/coun + { (short) ( 328.32 * OVERSAMPLENR ), 140 }, // v=1.603 r=2218.081 res=0.176 degC/count + { (short) ( 388.65 * OVERSAMPLENR ), 130 }, // v=1.898 r=2874.980 res=0.156 degC/count + { (short) ( 421.39 * OVERSAMPLENR ), 125 }, // v=2.058 r=3286.644 res=0.149 degC/count + { (short) ( 455.65 * OVERSAMPLENR ), 120 }, // v=2.225 r=3768.002 res=0.143 degC/count + { (short) ( 491.17 * OVERSAMPLENR ), 115 }, // v=2.398 r=4332.590 res=0.139 degC/count + { (short) ( 527.68 * OVERSAMPLENR ), 110 }, // v=2.577 r=4996.905 res=0.136 degC/count + { (short) ( 564.81 * OVERSAMPLENR ), 105 }, // v=2.758 r=5781.120 res=0.134 degC/count + { (short) ( 602.19 * OVERSAMPLENR ), 100 }, // v=2.940 r=6710.000 res=0.134 degC/count + { (short) ( 676.03 * OVERSAMPLENR ), 90 }, // v=3.301 r=9131.018 res=0.138 degC/count + { (short) ( 745.85 * OVERSAMPLENR ), 80 }, // v=3.642 r=12602.693 res=0.150 degC/count + { (short) ( 778.31 * OVERSAMPLENR ), 75 }, // v=3.800 r=14889.001 res=0.159 degC/count + { (short) ( 808.75 * OVERSAMPLENR ), 70 }, // v=3.949 r=17658.700 res=0.171 degC/count + { (short) ( 836.94 * OVERSAMPLENR ), 65 }, // v=4.087 r=21028.040 res=0.185 degC/count + { (short) ( 862.74 * OVERSAMPLENR ), 60 }, // v=4.213 r=25144.568 res=0.204 degC/count + { (short) ( 886.08 * OVERSAMPLENR ), 55 }, // v=4.327 r=30196.449 res=0.227 degC/count + { (short) ( 906.97 * OVERSAMPLENR ), 50 }, // v=4.429 r=36424.838 res=0.255 degC/count + { (short) ( 941.65 * OVERSAMPLENR ), 40 }, // v=4.598 r=53745.337 res=0.333 degC/count + { (short) ( 967.76 * OVERSAMPLENR ), 30 }, // v=4.725 r=80880.630 res=0.452 degC/count + { (short) ( 978.03 * OVERSAMPLENR ), 25 }, // v=4.776 r=100000.000 res=0.535 degC/count + { (short) ( 981.68 * OVERSAMPLENR ), 23 }, // v=4.793 r=109024.395 res=0.573 degC/count + { (short) ( 983.41 * OVERSAMPLENR ), 22 }, // v=4.802 r=113875.430 res=0.594 degC/count + { (short) ( 985.08 * OVERSAMPLENR ), 21 }, // v=4.810 r=118968.955 res=0.616 degC/count + { (short) ( 986.70 * OVERSAMPLENR ), 20 }, // v=4.818 r=124318.354 res=0.638 degC/count + { (short) ( 993.94 * OVERSAMPLENR ), 15 }, // v=4.853 r=155431.302 res=0.768 degC/count + { (short) ( 999.96 * OVERSAMPLENR ), 10 }, // v=4.883 r=195480.023 res=0.934 degC/count + { (short) (1008.95 * OVERSAMPLENR ), 0 } // v=4.926 r=314997.575 res=1.418 degC/count }; + + diff --git a/Marlin/src/module/thermistor/thermistor_8.h b/Marlin/src/module/thermistor/thermistor_8.h index 9e19168fed..3ef78da0c5 100644 --- a/Marlin/src/module/thermistor/thermistor_8.h +++ b/Marlin/src/module/thermistor/thermistor_8.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 3950 K, 10 kOhm pull-up, NTCS0603E3104FHT -const temp_entry_t temptable_8[] PROGMEM = { +const short temptable_8[][2] PROGMEM = { { OV( 1), 704 }, { OV( 54), 216 }, { OV( 107), 175 }, diff --git a/Marlin/src/module/thermistor/thermistor_9.h b/Marlin/src/module/thermistor/thermistor_9.h index 29097420ec..e9ef924d1f 100644 --- a/Marlin/src/module/thermistor/thermistor_9.h +++ b/Marlin/src/module/thermistor/thermistor_9.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // R25 = 100 kOhm, beta25 = 3960 K, 4.7 kOhm pull-up, GE Sensing AL03006-58.2K-97-G1 -const temp_entry_t temptable_9[] PROGMEM = { +const short temptable_9[][2] PROGMEM = { { OV( 1), 936 }, { OV( 36), 300 }, { OV( 71), 246 }, diff --git a/Marlin/src/module/thermistor/thermistor_99.h b/Marlin/src/module/thermistor/thermistor_99.h deleted file mode 100644 index 839a511c09..0000000000 --- a/Marlin/src/module/thermistor/thermistor_99.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once - -// 100k bed thermistor with a 10K pull-up resistor - made by $ buildroot/share/scripts/createTemperatureLookupMarlin.py --rp=10000 - -const temp_entry_t temptable_99[] PROGMEM = { - { OV( 5.81), 350 }, // v=0.028 r= 57.081 res=13.433 degC/count - { OV( 6.54), 340 }, // v=0.032 r= 64.248 res=11.711 degC/count - { OV( 7.38), 330 }, // v=0.036 r= 72.588 res=10.161 degC/count - { OV( 8.36), 320 }, // v=0.041 r= 82.336 res= 8.772 degC/count - { OV( 9.51), 310 }, // v=0.046 r= 93.780 res= 7.535 degC/count - { OV( 10.87), 300 }, // v=0.053 r= 107.281 res= 6.439 degC/count - { OV( 12.47), 290 }, // v=0.061 r= 123.286 res= 5.473 degC/count - { OV( 14.37), 280 }, // v=0.070 r= 142.360 res= 4.627 degC/count - { OV( 16.64), 270 }, // v=0.081 r= 165.215 res= 3.891 degC/count - { OV( 19.37), 260 }, // v=0.095 r= 192.758 res= 3.253 degC/count - { OV( 22.65), 250 }, // v=0.111 r= 226.150 res= 2.705 degC/count - { OV( 26.62), 240 }, // v=0.130 r= 266.891 res= 2.236 degC/count - { OV( 31.46), 230 }, // v=0.154 r= 316.931 res= 1.839 degC/count - { OV( 37.38), 220 }, // v=0.182 r= 378.822 res= 1.504 degC/count - { OV( 44.65), 210 }, // v=0.218 r= 455.939 res= 1.224 degC/count - { OV( 53.64), 200 }, // v=0.262 r= 552.778 res= 0.991 degC/count - { OV( 64.78), 190 }, // v=0.316 r= 675.386 res= 0.799 degC/count - { OV( 78.65), 180 }, // v=0.384 r= 831.973 res= 0.643 degC/count - { OV( 95.94), 170 }, // v=0.468 r= 1033.801 res= 0.516 degC/count - { OV(117.52), 160 }, // v=0.574 r= 1296.481 res= 0.414 degC/count - { OV(144.42), 150 }, // v=0.705 r= 1641.900 res= 0.333 degC/count - { OV(177.80), 140 }, // v=0.868 r= 2101.110 res= 0.269 degC/count - { OV(218.89), 130 }, // v=1.069 r= 2718.725 res= 0.220 degC/count - { OV(268.82), 120 }, // v=1.313 r= 3559.702 res= 0.183 degC/count - { OV(328.35), 110 }, // v=1.603 r= 4719.968 res= 0.155 degC/count - { OV(397.44), 100 }, // v=1.941 r= 6343.323 res= 0.136 degC/count - { OV(474.90), 90 }, // v=2.319 r= 8648.807 res= 0.124 degC/count - { OV(558.03), 80 }, // v=2.725 r= 11975.779 res= 0.118 degC/count - { OV(642.76), 70 }, // v=3.138 r= 16859.622 res= 0.119 degC/count - { OV(724.25), 60 }, // v=3.536 r= 24161.472 res= 0.128 degC/count - { OV(797.93), 50 }, // v=3.896 r= 35295.361 res= 0.146 degC/count - { OV(860.51), 40 }, // v=4.202 r= 52635.209 res= 0.178 degC/count - { OV(910.55), 30 }, // v=4.446 r= 80262.251 res= 0.229 degC/count - { OV(948.36), 20 }, // v=4.631 r=125374.433 res= 0.313 degC/count - { OV(975.47), 10 }, // v=4.763 r=201020.458 res= 0.449 degC/count - { OV(994.02), 0 } // v=4.854 r=331567.870 res= 0.676 degC/count -}; diff --git a/Marlin/src/module/thermistor/thermistor_998.h b/Marlin/src/module/thermistor/thermistor_998.h index e4cfbbaa0d..66becc7029 100644 --- a/Marlin/src/module/thermistor/thermistor_998.h +++ b/Marlin/src/module/thermistor/thermistor_998.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // User-defined table 1 // Dummy Thermistor table.. It will ALWAYS read a fixed value. @@ -27,7 +26,7 @@ #define DUMMY_THERMISTOR_998_VALUE 25 #endif -const temp_entry_t temptable_998[] PROGMEM = { +const short temptable_998[][2] PROGMEM = { { OV( 1), DUMMY_THERMISTOR_998_VALUE }, { OV(1023), DUMMY_THERMISTOR_998_VALUE } }; diff --git a/Marlin/src/module/thermistor/thermistor_999.h b/Marlin/src/module/thermistor/thermistor_999.h index 0271c47f85..ea45952f60 100644 --- a/Marlin/src/module/thermistor/thermistor_999.h +++ b/Marlin/src/module/thermistor/thermistor_999.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once // User-defined table 2 // Dummy Thermistor table.. It will ALWAYS read a fixed value. @@ -27,7 +26,7 @@ #define DUMMY_THERMISTOR_999_VALUE 25 #endif -const temp_entry_t temptable_999[] PROGMEM = { +const short temptable_999[][2] PROGMEM = { { OV( 1), DUMMY_THERMISTOR_999_VALUE }, { OV(1023), DUMMY_THERMISTOR_999_VALUE } }; diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 0b0419c520..56b75e1739 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,33 +16,19 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef THERMISTORS_H_ +#define THERMISTORS_H_ #include "../../inc/MarlinConfig.h" -#define THERMISTOR_TABLE_ADC_RESOLUTION 10 -#define THERMISTOR_TABLE_SCALE (HAL_ADC_RANGE / _BV(THERMISTOR_TABLE_ADC_RESOLUTION)) -#if ENABLED(HAL_ADC_FILTERED) - #define OVERSAMPLENR 1 -#else - #define OVERSAMPLENR 16 -#endif -#define MAX_RAW_THERMISTOR_VALUE (HAL_ADC_RANGE * (OVERSAMPLENR) - 1) +#define OVERSAMPLENR 16 +#define OV(N) int16_t((N) * (OVERSAMPLENR)) -// Currently Marlin stores all oversampled ADC values as int16_t, make sure the HAL settings do not overflow 15bit -#if MAX_RAW_THERMISTOR_VALUE > ((1 << 15) - 1) - #error "MAX_RAW_THERMISTOR_VALUE is too large for int16_t. Reduce OVERSAMPLENR or HAL_ADC_RESOLUTION." -#endif - -#define OV_SCALE(N) (N) -#define OV(N) int16_t(OV_SCALE(N) * (OVERSAMPLENR) * (THERMISTOR_TABLE_SCALE)) - -#define ANY_THERMISTOR_IS(n) (THERMISTOR_HEATER_0 == n || THERMISTOR_HEATER_1 == n || THERMISTOR_HEATER_2 == n || THERMISTOR_HEATER_3 == n || THERMISTOR_HEATER_4 == n || THERMISTOR_HEATER_5 == n || THERMISTOR_HEATER_6 == n || THERMISTOR_HEATER_7 == n || THERMISTORBED == n || THERMISTORCHAMBER == n || THERMISTORPROBE == n) - -typedef struct { int16_t value, celsius; } temp_entry_t; +#define ANY_THERMISTOR_IS(n) (THERMISTORHEATER_0 == n || THERMISTORHEATER_1 == n || THERMISTORHEATER_2 == n || THERMISTORHEATER_3 == n || THERMISTORHEATER_4 == n || THERMISTORBED == n || THERMISTORCHAMBER == n) // Pt1000 and Pt100 handling // @@ -50,9 +36,9 @@ typedef struct { int16_t value, celsius; } temp_entry_t; // a=3.9083E-3, b=-5.775E-7 #define PtA 3.9083E-3 #define PtB -5.775E-7 -#define PtRt(T,R0) ((R0) * (1.0 + (PtA) * (T) + (PtB) * (T) * (T))) -#define PtAdVal(T,R0,Rup) (short)(1024 / (Rup / PtRt(T, R0) + 1)) -#define PtLine(T,R0,Rup) { OV(PtAdVal(T, R0, Rup)), T } +#define PtRt(T,R0) ((R0)*(1.0+(PtA)*(T)+(PtB)*(T)*(T))) +#define PtAdVal(T,R0,Rup) (short)(1024/(Rup/PtRt(T,R0)+1)) +#define PtLine(T,R0,Rup) { OV(PtAdVal(T,R0,Rup)), T }, #if ANY_THERMISTOR_IS(1) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "EPCOS" #include "thermistor_1.h" @@ -72,12 +58,6 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(501) // 100K Zonestar thermistor #include "thermistor_501.h" #endif -#if ANY_THERMISTOR_IS(502) // Unknown thermistor used by the Zonestar Průša P802M hot bed - #include "thermistor_502.h" -#endif -#if ANY_THERMISTOR_IS(512) // 100k thermistor in RPW-Ultra hotend, Pull-up = 4.7 kOhm, "unknown model" - #include "thermistor_512.h" -#endif #if ANY_THERMISTOR_IS(6) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 8.2 kOhm, "EPCOS ?" #include "thermistor_6.h" #endif @@ -105,24 +85,9 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(15) // JGAurora A5 thermistor calibration #include "thermistor_15.h" #endif -#if ANY_THERMISTOR_IS(18) // ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 - #include "thermistor_18.h" -#endif -#if ANY_THERMISTOR_IS(20) // Pt100 with INA826 amp on Ultimaker v2.0 electronics +#if ANY_THERMISTOR_IS(20) // PT100 with INA826 amp on Ultimaker v2.0 electronics #include "thermistor_20.h" #endif -#if ANY_THERMISTOR_IS(21) // Pt100 with INA826 amp with 3.3v excitation based on "Pt100 with INA826 amp on Ultimaker v2.0 electronics" - #include "thermistor_21.h" -#endif -#if ANY_THERMISTOR_IS(22) // Thermistor in a Rostock 301 hot end, calibrated with a multimeter - #include "thermistor_22.h" -#endif -#if ANY_THERMISTOR_IS(23) // By AluOne #12622. Formerly 22 above. May need calibration/checking. - #include "thermistor_23.h" -#endif -#if ANY_THERMISTOR_IS(30) // Kis3d Silicone mat 24V 200W/300W with 6mm Precision cast plate (EN AW 5083) - #include "thermistor_30.h" -#endif #if ANY_THERMISTOR_IS(51) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 1 kOhm, "EPCOS" #include "thermistor_51.h" #endif @@ -135,15 +100,9 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(60) // beta25 = 3950 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Maker's Tool Works Kapton Bed" #include "thermistor_60.h" #endif -#if ANY_THERMISTOR_IS(61) // beta25 = 3950 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Formbot 350°C Thermistor" - #include "thermistor_61.h" -#endif #if ANY_THERMISTOR_IS(66) // beta25 = 4500 K, R25 = 2.5 MOhm, Pull-up = 4.7 kOhm, "DyzeDesign 500 °C Thermistor" #include "thermistor_66.h" #endif -#if ANY_THERMISTOR_IS(67) // R25 = 500 KOhm, beta25 = 3800 K, 4.7 kOhm pull-up, SliceEngineering 450 °C Thermistor - #include "thermistor_67.h" -#endif #if ANY_THERMISTOR_IS(12) // beta25 = 4700 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Personal calibration for Makibox hot bed" #include "thermistor_12.h" #endif @@ -153,27 +112,12 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(75) // beta25 = 4100 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "MGB18-104F39050L32 thermistor" #include "thermistor_75.h" #endif -#if ANY_THERMISTOR_IS(99) // 100k bed thermistor with a 10K pull-up resistor (on some Wanhao i3 models) - #include "thermistor_99.h" -#endif #if ANY_THERMISTOR_IS(110) // Pt100 with 1k0 pullup #include "thermistor_110.h" #endif #if ANY_THERMISTOR_IS(147) // Pt100 with 4k7 pullup #include "thermistor_147.h" #endif -#if ANY_THERMISTOR_IS(201) // Pt100 with LMV324 Overlord - #include "thermistor_201.h" -#endif -#if ANY_THERMISTOR_IS(202) // 200K thermistor in Copymaker3D hotend - #include "thermistor_202.h" -#endif -#if ANY_THERMISTOR_IS(331) // Like table 1, but with 3V3 as input voltage for MEGA - #include "thermistor_331.h" -#endif -#if ANY_THERMISTOR_IS(332) // Like table 1, but with 3V3 as input voltage for DUE - #include "thermistor_332.h" -#endif #if ANY_THERMISTOR_IS(666) // beta25 = UNK, R25 = 200K, Pull-up = 10 kOhm, "Unidentified 200K NTC thermistor (Einstart S)" #include "thermistor_666.h" #endif @@ -189,311 +133,148 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(999) // User-defined table 2 #include "thermistor_999.h" #endif -#if ANY_THERMISTOR_IS(1000) // Custom - const temp_entry_t temptable_1000[] PROGMEM = { { 0, 0 } }; -#endif #define _TT_NAME(_N) temptable_ ## _N #define TT_NAME(_N) _TT_NAME(_N) - -#if THERMISTOR_HEATER_0 - #define HEATER_0_TEMPTABLE TT_NAME(THERMISTOR_HEATER_0) +#if THERMISTORHEATER_0 + #define HEATER_0_TEMPTABLE TT_NAME(THERMISTORHEATER_0) #define HEATER_0_TEMPTABLE_LEN COUNT(HEATER_0_TEMPTABLE) #elif defined(HEATER_0_USES_THERMISTOR) #error "No heater 0 thermistor table specified" #else - #define HEATER_0_TEMPTABLE nullptr + #define HEATER_0_TEMPTABLE NULL #define HEATER_0_TEMPTABLE_LEN 0 #endif -#if THERMISTOR_HEATER_1 - #define HEATER_1_TEMPTABLE TT_NAME(THERMISTOR_HEATER_1) +#if THERMISTORHEATER_1 + #define HEATER_1_TEMPTABLE TT_NAME(THERMISTORHEATER_1) #define HEATER_1_TEMPTABLE_LEN COUNT(HEATER_1_TEMPTABLE) #elif defined(HEATER_1_USES_THERMISTOR) #error "No heater 1 thermistor table specified" #else - #define HEATER_1_TEMPTABLE nullptr + #define HEATER_1_TEMPTABLE NULL #define HEATER_1_TEMPTABLE_LEN 0 #endif -#if THERMISTOR_HEATER_2 - #define HEATER_2_TEMPTABLE TT_NAME(THERMISTOR_HEATER_2) +#if THERMISTORHEATER_2 + #define HEATER_2_TEMPTABLE TT_NAME(THERMISTORHEATER_2) #define HEATER_2_TEMPTABLE_LEN COUNT(HEATER_2_TEMPTABLE) #elif defined(HEATER_2_USES_THERMISTOR) #error "No heater 2 thermistor table specified" #else - #define HEATER_2_TEMPTABLE nullptr + #define HEATER_2_TEMPTABLE NULL #define HEATER_2_TEMPTABLE_LEN 0 #endif -#if THERMISTOR_HEATER_3 - #define HEATER_3_TEMPTABLE TT_NAME(THERMISTOR_HEATER_3) +#if THERMISTORHEATER_3 + #define HEATER_3_TEMPTABLE TT_NAME(THERMISTORHEATER_3) #define HEATER_3_TEMPTABLE_LEN COUNT(HEATER_3_TEMPTABLE) #elif defined(HEATER_3_USES_THERMISTOR) #error "No heater 3 thermistor table specified" #else - #define HEATER_3_TEMPTABLE nullptr + #define HEATER_3_TEMPTABLE NULL #define HEATER_3_TEMPTABLE_LEN 0 #endif -#if THERMISTOR_HEATER_4 - #define HEATER_4_TEMPTABLE TT_NAME(THERMISTOR_HEATER_4) +#if THERMISTORHEATER_4 + #define HEATER_4_TEMPTABLE TT_NAME(THERMISTORHEATER_4) #define HEATER_4_TEMPTABLE_LEN COUNT(HEATER_4_TEMPTABLE) #elif defined(HEATER_4_USES_THERMISTOR) #error "No heater 4 thermistor table specified" #else - #define HEATER_4_TEMPTABLE nullptr + #define HEATER_4_TEMPTABLE NULL #define HEATER_4_TEMPTABLE_LEN 0 #endif -#if THERMISTOR_HEATER_5 - #define HEATER_5_TEMPTABLE TT_NAME(THERMISTOR_HEATER_5) - #define HEATER_5_TEMPTABLE_LEN COUNT(HEATER_5_TEMPTABLE) -#elif defined(HEATER_5_USES_THERMISTOR) - #error "No heater 5 thermistor table specified" -#else - #define HEATER_5_TEMPTABLE nullptr - #define HEATER_5_TEMPTABLE_LEN 0 -#endif - -#if THERMISTOR_HEATER_6 - #define HEATER_6_TEMPTABLE TT_NAME(THERMISTOR_HEATER_6) - #define HEATER_6_TEMPTABLE_LEN COUNT(HEATER_6_TEMPTABLE) -#elif defined(HEATER_6_USES_THERMISTOR) - #error "No heater 6 thermistor table specified" -#else - #define HEATER_6_TEMPTABLE nullptr - #define HEATER_6_TEMPTABLE_LEN 0 -#endif - -#if THERMISTOR_HEATER_7 - #define HEATER_7_TEMPTABLE TT_NAME(THERMISTOR_HEATER_7) - #define HEATER_7_TEMPTABLE_LEN COUNT(HEATER_7_TEMPTABLE) -#elif defined(HEATER_7_USES_THERMISTOR) - #error "No heater 7 thermistor table specified" -#else - #define HEATER_7_TEMPTABLE nullptr - #define HEATER_7_TEMPTABLE_LEN 0 -#endif - #ifdef THERMISTORBED - #define BED_TEMPTABLE TT_NAME(THERMISTORBED) - #define BED_TEMPTABLE_LEN COUNT(BED_TEMPTABLE) + #define BEDTEMPTABLE TT_NAME(THERMISTORBED) + #define BEDTEMPTABLE_LEN COUNT(BEDTEMPTABLE) #elif defined(HEATER_BED_USES_THERMISTOR) #error "No bed thermistor table specified" #else - #define BED_TEMPTABLE_LEN 0 + #define BEDTEMPTABLE_LEN 0 #endif #ifdef THERMISTORCHAMBER - #define CHAMBER_TEMPTABLE TT_NAME(THERMISTORCHAMBER) - #define CHAMBER_TEMPTABLE_LEN COUNT(CHAMBER_TEMPTABLE) + #define CHAMBERTEMPTABLE TT_NAME(THERMISTORCHAMBER) + #define CHAMBERTEMPTABLE_LEN COUNT(CHAMBERTEMPTABLE) #elif defined(HEATER_CHAMBER_USES_THERMISTOR) #error "No chamber thermistor table specified" #else - #define CHAMBER_TEMPTABLE_LEN 0 -#endif - -#ifdef THERMISTORPROBE - #define PROBE_TEMPTABLE TT_NAME(THERMISTORPROBE) - #define PROBE_TEMPTABLE_LEN COUNT(PROBE_TEMPTABLE) -#elif defined(HEATER_PROBE_USES_THERMISTOR) - #error "No probe thermistor table specified" -#else - #define PROBE_TEMPTABLE_LEN 0 + #define CHAMBERTEMPTABLE_LEN 0 #endif // The SCAN_THERMISTOR_TABLE macro needs alteration? -static_assert( - HEATER_0_TEMPTABLE_LEN < 256 && HEATER_1_TEMPTABLE_LEN < 256 - && HEATER_2_TEMPTABLE_LEN < 256 && HEATER_3_TEMPTABLE_LEN < 256 - && HEATER_4_TEMPTABLE_LEN < 256 && HEATER_5_TEMPTABLE_LEN < 256 - && HEATER_6_TEMPTABLE_LEN < 256 && HEATER_7_TEMPTABLE_LEN < 256 - && BED_TEMPTABLE_LEN < 256 && CHAMBER_TEMPTABLE_LEN < 256 - && PROBE_TEMPTABLE_LEN < 256, +static_assert(HEATER_0_TEMPTABLE_LEN < 256 && HEATER_1_TEMPTABLE_LEN < 256 && HEATER_2_TEMPTABLE_LEN < 256 && HEATER_3_TEMPTABLE_LEN < 256 && HEATER_4_TEMPTABLE_LEN < 256 && BEDTEMPTABLE_LEN < 256 && CHAMBERTEMPTABLE_LEN < 256, "Temperature conversion tables over 255 entries need special consideration." ); // Set the high and low raw values for the heaters // For thermistors the highest temperature results in the lowest ADC value // For thermocouples the highest temperature results in the highest ADC value - -#define _TT_REV(N) REVERSE_TEMP_SENSOR_RANGE_##N -#define TT_REV(N) _TT_REV(N) - -#ifdef HEATER_0_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_0) - #define HEATER_0_SENSOR_MINTEMP_IND 0 - #define HEATER_0_SENSOR_MAXTEMP_IND HEATER_0_TEMPTABLE_LEN - 1 - #else - #define HEATER_0_SENSOR_MINTEMP_IND HEATER_0_TEMPTABLE_LEN - 1 - #define HEATER_0_SENSOR_MAXTEMP_IND 0 - #endif -#endif -#ifdef HEATER_1_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_1) - #define HEATER_1_SENSOR_MINTEMP_IND 0 - #define HEATER_1_SENSOR_MAXTEMP_IND HEATER_1_TEMPTABLE_LEN - 1 - #else - #define HEATER_1_SENSOR_MINTEMP_IND HEATER_1_TEMPTABLE_LEN - 1 - #define HEATER_1_SENSOR_MAXTEMP_IND 0 - #endif -#endif -#ifdef HEATER_2_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_2) - #define HEATER_2_SENSOR_MINTEMP_IND 0 - #define HEATER_2_SENSOR_MAXTEMP_IND HEATER_2_TEMPTABLE_LEN - 1 - #else - #define HEATER_2_SENSOR_MINTEMP_IND HEATER_2_TEMPTABLE_LEN - 1 - #define HEATER_2_SENSOR_MAXTEMP_IND 0 - #endif -#endif -#ifdef HEATER_3_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_3) - #define HEATER_3_SENSOR_MINTEMP_IND 0 - #define HEATER_3_SENSOR_MAXTEMP_IND HEATER_3_TEMPTABLE_LEN - 1 - #else - #define HEATER_3_SENSOR_MINTEMP_IND HEATER_3_TEMPTABLE_LEN - 1 - #define HEATER_3_SENSOR_MAXTEMP_IND 0 - #endif -#endif -#ifdef HEATER_4_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_4) - #define HEATER_4_SENSOR_MINTEMP_IND 0 - #define HEATER_4_SENSOR_MAXTEMP_IND HEATER_4_TEMPTABLE_LEN - 1 - #else - #define HEATER_4_SENSOR_MINTEMP_IND HEATER_4_TEMPTABLE_LEN - 1 - #define HEATER_4_SENSOR_MAXTEMP_IND 0 - #endif -#endif -#ifdef HEATER_5_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_5) - #define HEATER_5_SENSOR_MINTEMP_IND 0 - #define HEATER_5_SENSOR_MAXTEMP_IND HEATER_5_TEMPTABLE_LEN - 1 - #else - #define HEATER_5_SENSOR_MINTEMP_IND HEATER_5_TEMPTABLE_LEN - 1 - #define HEATER_5_SENSOR_MAXTEMP_IND 0 - #endif -#endif -#ifdef HEATER_6_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_6) - #define HEATER_6_SENSOR_MINTEMP_IND 0 - #define HEATER_6_SENSOR_MAXTEMP_IND HEATER_6_TEMPTABLE_LEN - 1 - #else - #define HEATER_6_SENSOR_MINTEMP_IND HEATER_6_TEMPTABLE_LEN - 1 - #define HEATER_6_SENSOR_MAXTEMP_IND 0 - #endif -#endif -#ifdef HEATER_7_TEMPTABLE - #if TT_REV(THERMISTOR_HEATER_7) - #define HEATER_7_SENSOR_MINTEMP_IND 0 - #define HEATER_7_SENSOR_MAXTEMP_IND HEATER_7_TEMPTABLE_LEN - 1 - #else - #define HEATER_7_SENSOR_MINTEMP_IND HEATER_7_TEMPTABLE_LEN - 1 - #define HEATER_7_SENSOR_MAXTEMP_IND 0 - #endif -#endif - #ifndef HEATER_0_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_0) || !defined(HEATER_0_USES_THERMISTOR) - #define HEATER_0_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_0_RAW_LO_TEMP 0 - #else + #ifdef HEATER_0_USES_THERMISTOR #define HEATER_0_RAW_HI_TEMP 0 - #define HEATER_0_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define HEATER_0_RAW_LO_TEMP 16383 + #else + #define HEATER_0_RAW_HI_TEMP 16383 + #define HEATER_0_RAW_LO_TEMP 0 #endif #endif #ifndef HEATER_1_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_1) || !defined(HEATER_1_USES_THERMISTOR) - #define HEATER_1_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_1_RAW_LO_TEMP 0 - #else + #ifdef HEATER_1_USES_THERMISTOR #define HEATER_1_RAW_HI_TEMP 0 - #define HEATER_1_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define HEATER_1_RAW_LO_TEMP 16383 + #else + #define HEATER_1_RAW_HI_TEMP 16383 + #define HEATER_1_RAW_LO_TEMP 0 #endif #endif #ifndef HEATER_2_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_2) || !defined(HEATER_2_USES_THERMISTOR) - #define HEATER_2_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_2_RAW_LO_TEMP 0 - #else + #ifdef HEATER_2_USES_THERMISTOR #define HEATER_2_RAW_HI_TEMP 0 - #define HEATER_2_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define HEATER_2_RAW_LO_TEMP 16383 + #else + #define HEATER_2_RAW_HI_TEMP 16383 + #define HEATER_2_RAW_LO_TEMP 0 #endif #endif #ifndef HEATER_3_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_3) || !defined(HEATER_3_USES_THERMISTOR) - #define HEATER_3_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_3_RAW_LO_TEMP 0 - #else + #ifdef HEATER_3_USES_THERMISTOR #define HEATER_3_RAW_HI_TEMP 0 - #define HEATER_3_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define HEATER_3_RAW_LO_TEMP 16383 + #else + #define HEATER_3_RAW_HI_TEMP 16383 + #define HEATER_3_RAW_LO_TEMP 0 #endif #endif #ifndef HEATER_4_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_4) || !defined(HEATER_4_USES_THERMISTOR) - #define HEATER_4_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_4_RAW_LO_TEMP 0 - #else + #ifdef HEATER_4_USES_THERMISTOR #define HEATER_4_RAW_HI_TEMP 0 - #define HEATER_4_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE - #endif -#endif -#ifndef HEATER_5_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_5) || !defined(HEATER_5_USES_THERMISTOR) - #define HEATER_5_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_5_RAW_LO_TEMP 0 + #define HEATER_4_RAW_LO_TEMP 16383 #else - #define HEATER_5_RAW_HI_TEMP 0 - #define HEATER_5_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE - #endif -#endif -#ifndef HEATER_6_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_6) || !defined(HEATER_6_USES_THERMISTOR) - #define HEATER_6_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_6_RAW_LO_TEMP 0 - #else - #define HEATER_6_RAW_HI_TEMP 0 - #define HEATER_6_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE - #endif -#endif -#ifndef HEATER_7_RAW_HI_TEMP - #if TT_REV(THERMISTOR_HEATER_7) || !defined(HEATER_7_USES_THERMISTOR) - #define HEATER_7_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_7_RAW_LO_TEMP 0 - #else - #define HEATER_7_RAW_HI_TEMP 0 - #define HEATER_7_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define HEATER_4_RAW_HI_TEMP 16383 + #define HEATER_4_RAW_LO_TEMP 0 #endif #endif #ifndef HEATER_BED_RAW_HI_TEMP - #if TT_REV(THERMISTORBED) || !defined(HEATER_BED_USES_THERMISTOR) - #define HEATER_BED_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_BED_RAW_LO_TEMP 0 - #else + #ifdef HEATER_BED_USES_THERMISTOR #define HEATER_BED_RAW_HI_TEMP 0 - #define HEATER_BED_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define HEATER_BED_RAW_LO_TEMP 16383 + #else + #define HEATER_BED_RAW_HI_TEMP 16383 + #define HEATER_BED_RAW_LO_TEMP 0 #endif #endif #ifndef HEATER_CHAMBER_RAW_HI_TEMP - #if TT_REV(THERMISTORCHAMBER) || !defined(HEATER_CHAMBER_USES_THERMISTOR) - #define HEATER_CHAMBER_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_CHAMBER_RAW_LO_TEMP 0 - #else + #ifdef HEATER_CHAMBER_USES_THERMISTOR #define HEATER_CHAMBER_RAW_HI_TEMP 0 - #define HEATER_CHAMBER_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE - #endif -#endif -#ifndef HEATER_PROBE_RAW_HI_TEMP - #if TT_REV(THERMISTORPROBE) || !defined(HEATER_PROBE_USES_THERMISTOR) - #define HEATER_PROBE_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE - #define HEATER_PROBE_RAW_LO_TEMP 0 + #define HEATER_CHAMBER_RAW_LO_TEMP 16383 #else - #define HEATER_PROBE_RAW_HI_TEMP 0 - #define HEATER_PROBE_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #define HEATER_CHAMBER_RAW_HI_TEMP 16383 + #define HEATER_CHAMBER_RAW_LO_TEMP 0 #endif #endif -#undef _TT_REV -#undef TT_REV +#endif // THERMISTORS_H_ diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 4ab818f41d..13f391eda4 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,53 +16,25 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#include "../inc/MarlinConfigPre.h" - #include "tool_change.h" -#include "probe.h" #include "motion.h" #include "planner.h" -#include "temperature.h" -#include "../MarlinCore.h" +#include "../Marlin.h" -//#define DEBUG_TOOL_CHANGE +#include "../inc/MarlinConfig.h" -#define DEBUG_OUT ENABLED(DEBUG_TOOL_CHANGE) -#include "../core/debug_out.h" - -#if HAS_MULTI_EXTRUDER - toolchange_settings_t toolchange_settings; // Initialized by settings.load() +#if ENABLED(PARKING_EXTRUDER) && PARKING_EXTRUDER_SOLENOIDS_DELAY > 0 + #include "../gcode/gcode.h" // for dwell() #endif -#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - migration_settings_t migration = migration_defaults; - bool enable_first_prime; -#endif - -#if ENABLED(TOOLCHANGE_FS_INIT_BEFORE_SWAP) - bool toolchange_extruder_ready[EXTRUDERS]; -#endif - -#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - uint16_t singlenozzle_temp[EXTRUDERS]; -#endif - -#if BOTH(HAS_FAN, SINGLENOZZLE_STANDBY_FAN) - uint8_t singlenozzle_fan_speed[EXTRUDERS]; -#endif - -#if ENABLED(MAGNETIC_PARKING_EXTRUDER) || defined(EVENT_GCODE_AFTER_TOOLCHANGE) || (ENABLED(PARKING_EXTRUDER) && PARKING_EXTRUDER_SOLENOIDS_DELAY > 0) - #include "../gcode/gcode.h" -#endif - -#if ANY(SWITCHING_EXTRUDER, SWITCHING_NOZZLE, SWITCHING_TOOLHEAD) - #include "servo.h" +#if ENABLED(SWITCHING_EXTRUDER) || ENABLED(SWITCHING_NOZZLE) || ENABLED(SWITCHING_TOOLHEAD) + #include "../module/servo.h" #endif #if ENABLED(EXT_SOLENOID) && DISABLED(PARKING_EXTRUDER) @@ -85,26 +57,6 @@ #include "../feature/fanmux.h" #endif -#if ENABLED(PRUSA_MMU2) - #include "../feature/mmu2/mmu2.h" -#endif - -#if HAS_LCD_MENU - #include "../lcd/ultralcd.h" -#endif - -#if ENABLED(ADVANCED_PAUSE_FEATURE) - #include "../feature/pause.h" -#endif - -#if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - #include "../gcode/gcode.h" - #if TOOLCHANGE_FS_WIPE_RETRACT <= 0 - #undef TOOLCHANGE_FS_WIPE_RETRACT - #define TOOLCHANGE_FS_WIPE_RETRACT 0 - #endif -#endif - #if DO_SWITCH_EXTRUDER #if EXTRUDERS > 3 @@ -128,144 +80,26 @@ #if ENABLED(SWITCHING_NOZZLE) - #if SWITCHING_NOZZLE_TWO_SERVOS - - inline void _move_nozzle_servo(const uint8_t e, const uint8_t angle_index) { - constexpr int8_t sns_index[2] = { SWITCHING_NOZZLE_SERVO_NR, SWITCHING_NOZZLE_E1_SERVO_NR }; - constexpr int16_t sns_angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES; - planner.synchronize(); - MOVE_SERVO(sns_index[e], sns_angles[angle_index]); - safe_delay(500); - } - - void lower_nozzle(const uint8_t e) { _move_nozzle_servo(e, 0); } - void raise_nozzle(const uint8_t e) { _move_nozzle_servo(e, 1); } - - #else - - void move_nozzle_servo(const uint8_t angle_index) { - planner.synchronize(); - MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, servo_angles[SWITCHING_NOZZLE_SERVO_NR][angle_index]); - safe_delay(500); - } - - #endif + void move_nozzle_servo(const uint8_t e) { + planner.synchronize(); + MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, servo_angles[SWITCHING_NOZZLE_SERVO_NR][e]); + safe_delay(500); + } #endif // SWITCHING_NOZZLE -inline void _line_to_current(const AxisEnum fr_axis, const float fscale=1) { - line_to_current_position(planner.settings.max_feedrate_mm_s[fr_axis] * fscale); -} -inline void slow_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.5f); } -inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis); } +#if ENABLED(PARKING_EXTRUDER) -#if ENABLED(MAGNETIC_PARKING_EXTRUDER) - - float parkingposx[2], // M951 R L - parkinggrabdistance, // M951 I - parkingslowspeed, // M951 J - parkinghighspeed, // M951 H - parkingtraveldistance, // M951 D - compensationmultiplier; - - inline void magnetic_parking_extruder_tool_change(const uint8_t new_tool) { - - const float oldx = current_position.x, - grabpos = mpe_settings.parking_xpos[new_tool] + (new_tool ? mpe_settings.grab_distance : -mpe_settings.grab_distance), - offsetcompensation = TERN0(HAS_HOTEND_OFFSET, hotend_offset[active_extruder].x * mpe_settings.compensation_factor); - - if (homing_needed_error(_BV(X_AXIS))) return; - - /** - * Z Lift and Nozzle Offset shift ar defined in caller method to work equal with any Multi Hotend realization - * - * Steps: - * 1. Move high speed to park position of new extruder - * 2. Move to couple position of new extruder (this also discouple the old extruder) - * 3. Move to park position of new extruder - * 4. Move high speed to approach park position of old extruder - * 5. Move to park position of old extruder - * 6. Move to starting position - */ - - // STEP 1 - - current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; - - DEBUG_ECHOPAIR("(1) Move extruder ", int(new_tool)); - DEBUG_POS(" to new extruder ParkPos", current_position); - - planner.buffer_line(current_position, mpe_settings.fast_feedrate, new_tool); - planner.synchronize(); - - // STEP 2 - - current_position.x = grabpos + offsetcompensation; - - DEBUG_ECHOPAIR("(2) Couple extruder ", int(new_tool)); - DEBUG_POS(" to new extruder GrabPos", current_position); - - planner.buffer_line(current_position, mpe_settings.slow_feedrate, new_tool); - planner.synchronize(); - - // Delay before moving tool, to allow magnetic coupling - gcode.dwell(150); - - // STEP 3 - - current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; - - DEBUG_ECHOPAIR("(3) Move extruder ", int(new_tool)); - DEBUG_POS(" back to new extruder ParkPos", current_position); - - planner.buffer_line(current_position, mpe_settings.slow_feedrate, new_tool); - planner.synchronize(); - - // STEP 4 - - current_position.x = mpe_settings.parking_xpos[active_extruder] + (active_extruder == 0 ? MPE_TRAVEL_DISTANCE : -MPE_TRAVEL_DISTANCE) + offsetcompensation; - - DEBUG_ECHOPAIR("(4) Move extruder ", int(new_tool)); - DEBUG_POS(" close to old extruder ParkPos", current_position); - - planner.buffer_line(current_position, mpe_settings.fast_feedrate, new_tool); - planner.synchronize(); - - // STEP 5 - - current_position.x = mpe_settings.parking_xpos[active_extruder] + offsetcompensation; - - DEBUG_ECHOPAIR("(5) Park extruder ", int(new_tool)); - DEBUG_POS(" at old extruder ParkPos", current_position); - - planner.buffer_line(current_position, mpe_settings.slow_feedrate, new_tool); - planner.synchronize(); - - // STEP 6 - - current_position.x = oldx; - - DEBUG_ECHOPAIR("(6) Move extruder ", int(new_tool)); - DEBUG_POS(" to starting position", current_position); - - planner.buffer_line(current_position, mpe_settings.fast_feedrate, new_tool); - planner.synchronize(); - - DEBUG_ECHOLNPGM("Autopark done."); - } - -#elif ENABLED(PARKING_EXTRUDER) - - void pe_solenoid_init() { - LOOP_LE_N(n, 1) + void pe_magnet_init() { + for (uint8_t n = 0; n <= 1; ++n) #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) - pe_activate_solenoid(n); + pe_activate_magnet(n); #else - pe_deactivate_solenoid(n); + pe_deactivate_magnet(n); #endif } - void pe_set_solenoid(const uint8_t extruder_num, const uint8_t state) { + void pe_set_magnet(const uint8_t extruder_num, const uint8_t state) { switch (extruder_num) { case 1: OUT_WRITE(SOL1_PIN, state); break; default: OUT_WRITE(SOL0_PIN, state); break; @@ -275,1027 +109,525 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a #endif } - inline void parking_extruder_tool_change(const uint8_t new_tool, bool no_move) { + inline void parking_extruder_tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { if (!no_move) { - constexpr float parkingposx[] = PARKING_EXTRUDER_PARKING_X; - - #if HAS_HOTEND_OFFSET - const float x_offset = hotend_offset[active_extruder].x; - #else - constexpr float x_offset = 0; - #endif - - const float midpos = (parkingposx[0] + parkingposx[1]) * 0.5f + x_offset, - grabpos = parkingposx[new_tool] + (new_tool ? PARKING_EXTRUDER_GRAB_DISTANCE : -(PARKING_EXTRUDER_GRAB_DISTANCE)) + x_offset; - + const float parkingposx[] = PARKING_EXTRUDER_PARKING_X, + midpos = (parkingposx[0] + parkingposx[1]) * 0.5 + hotend_offset[X_AXIS][active_extruder], + grabpos = parkingposx[tmp_extruder] + hotend_offset[X_AXIS][active_extruder] + + (tmp_extruder == 0 ? -(PARKING_EXTRUDER_GRAB_DISTANCE) : PARKING_EXTRUDER_GRAB_DISTANCE); /** - * 1. Move to park position of old extruder - * 2. Disengage magnetic field, wait for delay - * 3. Move near new extruder - * 4. Engage magnetic field for new extruder - * 5. Move to parking incl. offset of new extruder - * 6. Lower Z-Axis + * 1. Raise Z-Axis to give enough clearance + * 2. Move to park position of old extruder + * 3. Disengage magnetic field, wait for delay + * 4. Move near new extruder + * 5. Engage magnetic field for new extruder + * 6. Move to parking incl. offset of new extruder + * 7. Lower Z-Axis */ // STEP 1 - - DEBUG_POS("Start PE Tool-Change", current_position); - - current_position.x = parkingposx[active_extruder] + x_offset; - - DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder)); - DEBUG_POS("Moving ParkPos", current_position); - - fast_line_to_current(X_AXIS); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Start Autopark", current_position); + #endif + current_position[Z_AXIS] += PARKING_EXTRUDER_SECURITY_RAISE; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + planner.synchronize(); // STEP 2 - + current_position[X_AXIS] = parkingposx[active_extruder] + hotend_offset[X_AXIS][active_extruder]; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPAIR("(2) Park extruder ", int(active_extruder)); + DEBUG_POS("Moving ParkPos", current_position); + } + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); planner.synchronize(); - DEBUG_ECHOLNPGM("(2) Disengage magnet"); - pe_deactivate_solenoid(active_extruder); // STEP 3 - - current_position.x += active_extruder ? -10 : 10; // move 10mm away from parked extruder - - DEBUG_ECHOLNPGM("(3) Move near new extruder"); - DEBUG_POS("Move away from parked extruder", current_position); - - fast_line_to_current(X_AXIS); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(3) Disengage magnet "); + #endif + pe_deactivate_magnet(active_extruder); // STEP 4 + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(4) Move to position near new extruder"); + #endif + current_position[X_AXIS] += (active_extruder == 0 ? 10 : -10); // move 10mm away from parked extruder + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move away from parked extruder", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); planner.synchronize(); - DEBUG_ECHOLNPGM("(4) Engage magnetic field"); - - // Just save power for inverted magnets - TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid(active_extruder)); - pe_activate_solenoid(new_tool); // STEP 5 + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(5) Engage magnetic field"); + #endif - current_position.x = grabpos + (new_tool ? -10 : 10); - fast_line_to_current(X_AXIS); - - current_position.x = grabpos; - - DEBUG_SYNCHRONIZE(); - DEBUG_POS("(5) Unpark extruder", current_position); - - slow_line_to_current(X_AXIS); + #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) + pe_activate_magnet(active_extruder); //just save power for inverted magnets + #endif + pe_activate_magnet(tmp_extruder); // STEP 6 + current_position[X_AXIS] = grabpos + (tmp_extruder == 0 ? (+10) : (-10)); + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + current_position[X_AXIS] = grabpos; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("(6) Unpark extruder", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS]/2, active_extruder); + planner.synchronize(); - current_position.x = midpos - TERN0(HAS_HOTEND_OFFSET, hotend_offset[new_tool].x); - - DEBUG_SYNCHRONIZE(); - DEBUG_POS("(6) Move midway between hotends", current_position); - - fast_line_to_current(X_AXIS); - planner.synchronize(); // Always sync the final move - - DEBUG_POS("PE Tool-Change done.", current_position); + // Step 7 + current_position[X_AXIS] = midpos - hotend_offset[X_AXIS][tmp_extruder]; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("(7) Move midway between hotends", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.synchronize(); + #if ENABLED(DEBUG_LEVELING_FEATURE) + SERIAL_ECHOLNPGM("Autopark done."); + #endif } else { // nomove == true // Only engage magnetic field for new extruder - pe_activate_solenoid(new_tool); - // Just save power for inverted magnets - TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid(active_extruder)); + pe_activate_magnet(tmp_extruder); + #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) + pe_activate_magnet(active_extruder); // Just save power for inverted magnets + #endif } + current_position[Z_AXIS] += hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder]; + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Applying Z-offset", current_position); + #endif } #endif // PARKING_EXTRUDER #if ENABLED(SWITCHING_TOOLHEAD) - inline void swt_lock(const bool locked=true) { - const uint16_t swt_angles[2] = SWITCHING_TOOLHEAD_SERVO_ANGLES; - MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, swt_angles[locked ? 0 : 1]); - } - - void swt_init() { swt_lock(); } - - inline void switching_toolhead_tool_change(const uint8_t new_tool, bool no_move/*=false*/) { + inline void switching_toolhead_tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { if (no_move) return; - constexpr float toolheadposx[] = SWITCHING_TOOLHEAD_X_POS; - const float placexpos = toolheadposx[active_extruder], - grabxpos = toolheadposx[new_tool]; + constexpr uint16_t angles[2] = SWITCHING_TOOLHEAD_SERVO_ANGLES; + + const float toolheadposx[] = SWITCHING_TOOLHEAD_X_POS, + placexpos = toolheadposx[active_extruder], + grabxpos = toolheadposx[tmp_extruder]; /** - * 1. Move to switch position of current toolhead - * 2. Unlock tool and drop it in the dock - * 3. Move to the new toolhead - * 4. Grab and lock the new toolhead + * 1. Raise Z to give enough clearance + * 2. Move to switch position of current toolhead + * 3. Unlock tool and drop it in the dock + * 4. Move to the new toolhead + * 5. Grab and lock the new toolhead + * 6. Apply the z-offset of the new toolhead */ - // 1. Move to switch position of current toolhead - - DEBUG_POS("Start ST Tool-Change", current_position); - - current_position.x = placexpos; - - DEBUG_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); - DEBUG_POS("Move X SwitchPos", current_position); - - fast_line_to_current(X_AXIS); - - current_position.y = SWITCHING_TOOLHEAD_Y_POS - (SWITCHING_TOOLHEAD_Y_SECURITY); - - DEBUG_SYNCHRONIZE(); - DEBUG_POS("Move Y SwitchPos + Security", current_position); - - fast_line_to_current(Y_AXIS); - - // 2. Unlock tool and drop it in the dock - + // STEP 1 + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Starting Toolhead change", current_position); + #endif + current_position[Z_AXIS] += SWITCHING_TOOLHEAD_SECURITY_RAISE; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); planner.synchronize(); - DEBUG_ECHOLNPGM("(2) Unlock and Place Toolhead"); - swt_lock(false); + + // STEP 2 + current_position[X_AXIS] = placexpos; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPAIR("(2) Place old tool ", int(active_extruder)); + DEBUG_POS("Move X SwitchPos", current_position); + } + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.synchronize(); + + current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS - SWITCHING_TOOLHEAD_Y_SECURITY; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Security", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); + planner.synchronize(); + + // STEP 3 + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(3) Unlock and Place Toolhead"); + #endif + MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, angles[1]); safe_delay(500); - current_position.y = SWITCHING_TOOLHEAD_Y_POS; - DEBUG_POS("Move Y SwitchPos", current_position); - slow_line_to_current(Y_AXIS); - - // Wait for move to complete, then another 0.2s + current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos", current_position); + #endif + planner.buffer_line_kinematic(current_position,(planner.max_feedrate_mm_s[Y_AXIS] * 0.5), active_extruder); planner.synchronize(); safe_delay(200); - - current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; - DEBUG_POS("Move back Y clear", current_position); - fast_line_to_current(Y_AXIS); // move away from docked toolhead - - // 3. Move to the new toolhead - - current_position.x = grabxpos; - - DEBUG_SYNCHRONIZE(); - DEBUG_ECHOLNPGM("(3) Move to new toolhead position"); - DEBUG_POS("Move to new toolhead X", current_position); - - fast_line_to_current(X_AXIS); - - current_position.y = SWITCHING_TOOLHEAD_Y_POS - (SWITCHING_TOOLHEAD_Y_SECURITY); - - DEBUG_SYNCHRONIZE(); - DEBUG_POS("Move Y SwitchPos + Security", current_position); - - fast_line_to_current(Y_AXIS); - - // 4. Grab and lock the new toolhead - - current_position.y = SWITCHING_TOOLHEAD_Y_POS; - - DEBUG_SYNCHRONIZE(); - DEBUG_ECHOLNPGM("(4) Grab and lock new toolhead"); - DEBUG_POS("Move Y SwitchPos", current_position); - - slow_line_to_current(Y_AXIS); - - // Wait for move to finish, pause 0.2s, move servo, pause 0.5s + current_position[Y_AXIS] -= SWITCHING_TOOLHEAD_Y_CLEAR; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead planner.synchronize(); + + // STEP 4 + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(4) Move to new toolhead position"); + #endif + current_position[X_AXIS] = grabxpos; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move to new toolhead X", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.synchronize(); + current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS - SWITCHING_TOOLHEAD_Y_SECURITY; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Security", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); + planner.synchronize(); + + // STEP 5 + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("(5) Grab and lock new toolhead "); + #endif + current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS] * 0.5, active_extruder); + planner.synchronize(); + safe_delay(200); - swt_lock(); + MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, angles[0]); safe_delay(500); - current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; - DEBUG_POS("Move back Y clear", current_position); - fast_line_to_current(Y_AXIS); // Move away from docked toolhead - planner.synchronize(); // Always sync the final move + current_position[Y_AXIS] -= SWITCHING_TOOLHEAD_Y_CLEAR; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position); + #endif + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead + planner.synchronize(); - DEBUG_POS("ST Tool-Change done.", current_position); - } + // STEP 6 + current_position[Z_AXIS] += hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder]; -#elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) - - inline void magnetic_switching_toolhead_tool_change(const uint8_t new_tool, bool no_move/*=false*/) { - if (no_move) return; - - constexpr float toolheadposx[] = SWITCHING_TOOLHEAD_X_POS, - toolheadclearx[] = SWITCHING_TOOLHEAD_X_SECURITY; - - const float placexpos = toolheadposx[active_extruder], - placexclear = toolheadclearx[active_extruder], - grabxpos = toolheadposx[new_tool], - grabxclear = toolheadclearx[new_tool]; - - /** - * 1. Move to switch position of current toolhead - * 2. Release and place toolhead in the dock - * 3. Move to the new toolhead - * 4. Grab the new toolhead and move to security position - */ - - DEBUG_POS("Start MST Tool-Change", current_position); - - // 1. Move to switch position current toolhead - - current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR; - - SERIAL_ECHOLNPAIR("(1) Place old tool ", int(active_extruder)); - DEBUG_POS("Move Y SwitchPos + Security", current_position); - - fast_line_to_current(Y_AXIS); - - current_position.x = placexclear; - - DEBUG_SYNCHRONIZE(); - DEBUG_POS("Move X SwitchPos + Security", current_position); - - fast_line_to_current(X_AXIS); - - current_position.y = SWITCHING_TOOLHEAD_Y_POS; - - DEBUG_SYNCHRONIZE(); - DEBUG_POS("Move Y SwitchPos", current_position); - - fast_line_to_current(Y_AXIS); - - current_position.x = placexpos; - - DEBUG_SYNCHRONIZE(); - DEBUG_POS("Move X SwitchPos", current_position); - - line_to_current_position(planner.settings.max_feedrate_mm_s[X_AXIS] * 0.25f); - - // 2. Release and place toolhead in the dock - - DEBUG_SYNCHRONIZE(); - DEBUG_ECHOLNPGM("(2) Release and Place Toolhead"); - - current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; - DEBUG_POS("Move Y SwitchPos + Release", current_position); - line_to_current_position(planner.settings.max_feedrate_mm_s[Y_AXIS] * 0.1f); - - current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_SECURITY; - - DEBUG_SYNCHRONIZE(); - DEBUG_POS("Move Y SwitchPos + Security", current_position); - - line_to_current_position(planner.settings.max_feedrate_mm_s[Y_AXIS]); - - // 3. Move to new toolhead position - - DEBUG_SYNCHRONIZE(); - DEBUG_ECHOLNPGM("(3) Move to new toolhead position"); - - current_position.x = grabxpos; - DEBUG_POS("Move to new toolhead X", current_position); - fast_line_to_current(X_AXIS); - - // 4. Grab the new toolhead and move to security position - - DEBUG_SYNCHRONIZE(); - DEBUG_ECHOLNPGM("(4) Grab new toolhead, move to security position"); - - current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; - DEBUG_POS("Move Y SwitchPos + Release", current_position); - line_to_current_position(planner.settings.max_feedrate_mm_s[Y_AXIS]); - - current_position.y = SWITCHING_TOOLHEAD_Y_POS; - - DEBUG_SYNCHRONIZE(); - DEBUG_POS("Move Y SwitchPos", current_position); - - _line_to_current(Y_AXIS, 0.2f); - - #if ENABLED(PRIME_BEFORE_REMOVE) && (SWITCHING_TOOLHEAD_PRIME_MM || SWITCHING_TOOLHEAD_RETRACT_MM) - #if SWITCHING_TOOLHEAD_PRIME_MM - current_position.e += SWITCHING_TOOLHEAD_PRIME_MM; - planner.buffer_line(current_position, MMM_TO_MMS(SWITCHING_TOOLHEAD_PRIME_FEEDRATE), new_tool); - #endif - #if SWITCHING_TOOLHEAD_RETRACT_MM - current_position.e -= SWITCHING_TOOLHEAD_RETRACT_MM; - planner.buffer_line(current_position, MMM_TO_MMS(SWITCHING_TOOLHEAD_RETRACT_FEEDRATE), new_tool); - #endif - #else - planner.synchronize(); - safe_delay(100); // Give switch time to settle + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("(6) Apply Z offset", current_position); #endif - current_position.x = grabxclear; - DEBUG_POS("Move to new toolhead X + Security", current_position); - _line_to_current(X_AXIS, 0.1f); - planner.synchronize(); - safe_delay(100); // Give switch time to settle - - current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; - DEBUG_POS("Move back Y clear", current_position); - fast_line_to_current(Y_AXIS); // move away from docked toolhead - planner.synchronize(); // Always sync last tool-change move - - DEBUG_POS("MST Tool-Change done.", current_position); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("Toolhead change done."); + #endif } -#elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) +#endif // SWITCHING_TOOLHEAD - inline void est_activate_solenoid() { OUT_WRITE(SOL0_PIN, HIGH); } - inline void est_deactivate_solenoid() { OUT_WRITE(SOL0_PIN, LOW); } - void est_init() { est_activate_solenoid(); } +inline void invalid_extruder_error(const uint8_t e) { + SERIAL_ECHO_START(); + SERIAL_CHAR('T'); + SERIAL_ECHO_F(e, DEC); + SERIAL_CHAR(' '); + SERIAL_ECHOLNPGM(MSG_INVALID_EXTRUDER); +} - inline void em_switching_toolhead_tool_change(const uint8_t new_tool, bool no_move) { - if (no_move) return; +#if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 - constexpr float toolheadposx[] = SWITCHING_TOOLHEAD_X_POS; - const float placexpos = toolheadposx[active_extruder], - grabxpos = toolheadposx[new_tool]; - const xyz_pos_t &hoffs = hotend_offset[active_extruder]; + inline void mixing_tool_change(const uint8_t tmp_extruder) { + if (tmp_extruder >= MIXING_VIRTUAL_TOOLS) + return invalid_extruder_error(tmp_extruder); - /** - * 1. Raise Z-Axis to give enough clearance - * 2. Move to position near active extruder parking - * 3. Move gently to park position of active extruder - * 4. Disengage magnetic field, wait for delay - * 5. Leave extruder and move to position near new extruder parking - * 6. Move gently to park position of new extruder - * 7. Engage magnetic field for new extruder parking - * 8. Unpark extruder - * 9. Apply Z hotend offset to current position - */ - - DEBUG_POS("Start EMST Tool-Change", current_position); - - // 1. Raise Z-Axis to give enough clearance - - current_position.z += SWITCHING_TOOLHEAD_Z_HOP; - DEBUG_POS("(1) Raise Z-Axis ", current_position); - fast_line_to_current(Z_AXIS); - - // 2. Move to position near active extruder parking - - DEBUG_SYNCHRONIZE(); - DEBUG_ECHOLNPAIR("(2) Move near active extruder parking", active_extruder); - DEBUG_POS("Moving ParkPos", current_position); - - current_position.set(hoffs.x + placexpos, - hoffs.y + SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR); - fast_line_to_current(X_AXIS); - - // 3. Move gently to park position of active extruder - - DEBUG_SYNCHRONIZE(); - SERIAL_ECHOLNPAIR("(3) Move gently to park position of active extruder", active_extruder); - DEBUG_POS("Moving ParkPos", current_position); - - current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; - slow_line_to_current(Y_AXIS); - - // 4. Disengage magnetic field, wait for delay - - planner.synchronize(); - DEBUG_ECHOLNPGM("(4) Disengage magnet"); - est_deactivate_solenoid(); - - // 5. Leave extruder and move to position near new extruder parking - - DEBUG_ECHOLNPGM("(5) Move near new extruder parking"); - DEBUG_POS("Moving ParkPos", current_position); - - current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; - slow_line_to_current(Y_AXIS); - current_position.set(hoffs.x + grabxpos, - hoffs.y + SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR); - fast_line_to_current(X_AXIS); - - // 6. Move gently to park position of new extruder - - current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; - if (DEBUGGING(LEVELING)) { - planner.synchronize(); - DEBUG_ECHOLNPGM("(6) Move near new extruder"); - } - slow_line_to_current(Y_AXIS); - - // 7. Engage magnetic field for new extruder parking - - DEBUG_SYNCHRONIZE(); - DEBUG_ECHOLNPGM("(7) Engage magnetic field"); - est_activate_solenoid(); - - // 8. Unpark extruder - - current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; - DEBUG_ECHOLNPGM("(8) Unpark extruder"); - slow_line_to_current(X_AXIS); - planner.synchronize(); // Always sync the final move - - // 9. Apply Z hotend offset to current position - - DEBUG_POS("(9) Applying Z-offset", current_position); - current_position.z += hoffs.z - hotend_offset[new_tool].z; - - DEBUG_POS("EMST Tool-Change done.", current_position); + // T0-Tnnn: Switch virtual tool by changing the mix + for (uint8_t j = 0; j < MIXING_STEPPERS; j++) + mixing_factor[j] = mixing_virtual_tool_mix[tmp_extruder][j]; } -#endif // ELECTROMAGNETIC_SWITCHING_TOOLHEAD - -#if EXTRUDERS - inline void invalid_extruder_error(const uint8_t e) { - SERIAL_ECHO_START(); - SERIAL_CHAR('T'); SERIAL_ECHO(int(e)); - SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(STR_INVALID_EXTRUDER); - } -#endif +#endif // MIXING_EXTRUDER && MIXING_VIRTUAL_TOOLS > 1 #if ENABLED(DUAL_X_CARRIAGE) - inline void dualx_tool_change(const uint8_t new_tool, bool &no_move) { - - DEBUG_ECHOPGM("Dual X Carriage Mode "); - switch (dual_x_carriage_mode) { - case DXC_FULL_CONTROL_MODE: DEBUG_ECHOLNPGM("FULL_CONTROL"); break; - case DXC_AUTO_PARK_MODE: DEBUG_ECHOLNPGM("AUTO_PARK"); break; - case DXC_DUPLICATION_MODE: DEBUG_ECHOLNPGM("DUPLICATION"); break; - case DXC_MIRRORED_MODE: DEBUG_ECHOLNPGM("MIRRORED"); break; - } + inline void dualx_tool_change(const uint8_t tmp_extruder, bool &no_move) { + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPGM("Dual X Carriage Mode "); + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: SERIAL_ECHOLNPGM("DXC_FULL_CONTROL_MODE"); break; + case DXC_AUTO_PARK_MODE: SERIAL_ECHOLNPGM("DXC_AUTO_PARK_MODE"); break; + } + } + #endif const float xhome = x_home_pos(active_extruder); if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE - && IsRunning() && !no_move - && (delayed_move_time || current_position.x != xhome) + && IsRunning() + && (delayed_move_time || current_position[X_AXIS] != xhome) ) { + float raised_z = current_position[Z_AXIS] + TOOLCHANGE_PARK_ZLIFT; + #if ENABLED(MAX_SOFTWARE_ENDSTOPS) + NOMORE(raised_z, soft_endstop_max[Z_AXIS]); + #endif + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPAIR("Raise to ", raised_z); + SERIAL_ECHOLNPAIR("MoveX to ", xhome); + SERIAL_ECHOLNPAIR("Lower to ", current_position[Z_AXIS]); + } + #endif + // Park old head: 1) raise 2) move to park position 3) lower - DEBUG_ECHOLNPAIR("MoveX to ", xhome); + #define CUR_X current_position[X_AXIS] + #define CUR_Y current_position[Y_AXIS] + #define CUR_Z current_position[Z_AXIS] + #define CUR_E current_position[E_AXIS] + + planner.buffer_line( CUR_X, CUR_Y, raised_z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + planner.buffer_line( xhome, CUR_Y, raised_z, CUR_E, planner.max_feedrate_mm_s[X_AXIS], active_extruder); + planner.buffer_line( xhome, CUR_Y, CUR_Z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); - // Park old head - current_position.x = xhome; - line_to_current_position(planner.settings.max_feedrate_mm_s[X_AXIS]); planner.synchronize(); } + // Apply Y & Z extruder offset (X offset is used as home pos with Dual X) + current_position[Y_AXIS] -= hotend_offset[Y_AXIS][active_extruder] - hotend_offset[Y_AXIS][tmp_extruder]; + current_position[Z_AXIS] -= hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder]; + // Activate the new extruder ahead of calling set_axis_is_at_home! - active_extruder = new_tool; + active_extruder = tmp_extruder; // This function resets the max/min values - the current position may be overwritten below. set_axis_is_at_home(X_AXIS); - DEBUG_POS("New Extruder", current_position); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("New Extruder", current_position); + #endif + + // Only when auto-parking are carriages safe to move + if (dual_x_carriage_mode != DXC_AUTO_PARK_MODE) no_move = true; switch (dual_x_carriage_mode) { case DXC_FULL_CONTROL_MODE: // New current position is the position of the activated extruder - current_position.x = inactive_extruder_x_pos; + current_position[X_AXIS] = inactive_extruder_x_pos; // Save the inactive extruder's position (from the old current_position) - inactive_extruder_x_pos = destination.x; + inactive_extruder_x_pos = destination[X_AXIS]; break; case DXC_AUTO_PARK_MODE: - // record current raised toolhead position for use by unpark - raised_parked_position = current_position; + // record raised toolhead position for use by unpark + COPY(raised_parked_position, current_position); + raised_parked_position[Z_AXIS] += TOOLCHANGE_UNPARK_ZLIFT; + #if ENABLED(MAX_SOFTWARE_ENDSTOPS) + NOMORE(raised_parked_position[Z_AXIS], soft_endstop_max[Z_AXIS]); + #endif active_extruder_parked = true; delayed_move_time = 0; break; - default: - break; } - DEBUG_ECHOLNPAIR("Active extruder parked: ", active_extruder_parked ? "yes" : "no"); - DEBUG_POS("New extruder (parked)", current_position); + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOLNPAIR("Active extruder parked: ", active_extruder_parked ? "yes" : "no"); + DEBUG_POS("New extruder (parked)", current_position); + } + #endif + + // No extra case for HAS_ABL in DUAL_X_CARRIAGE. Does that mean they don't work together? } #endif // DUAL_X_CARRIAGE -/** - * Prime active tool using TOOLCHANGE_FILAMENT_SWAP settings - */ -#if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - -void tool_change_prime() { - if (toolchange_settings.extra_prime > 0 - && TERN(PREVENT_COLD_EXTRUSION, !thermalManager.targetTooColdToExtrude(active_extruder), 1) - ) { - destination = current_position; // Remember the old position - - const bool ok = TERN1(TOOLCHANGE_PARK, all_axes_homed() && toolchange_settings.enable_park); - - #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 - // Store and stop fan. Restored on any exit. - REMEMBER(fan, thermalManager.fan_speed[TOOLCHANGE_FS_FAN], 0); - #endif - - // Z raise - if (ok) { - // Do a small lift to avoid the workpiece in the move back (below) - current_position.z += toolchange_settings.z_raise; - #if HAS_SOFTWARE_ENDSTOPS - NOMORE(current_position.z, soft_endstop.max.z); - #endif - fast_line_to_current(Z_AXIS); - planner.synchronize(); - } - - // Park - #if ENABLED(TOOLCHANGE_PARK) - if (ok) { - TERN(TOOLCHANGE_PARK_Y_ONLY,,current_position.x = toolchange_settings.change_point.x); - TERN(TOOLCHANGE_PARK_X_ONLY,,current_position.y = toolchange_settings.change_point.y); - planner.buffer_line(current_position, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE), active_extruder); - planner.synchronize(); - } - #endif - - // Prime (All distances are added and slowed down to ensure secure priming in all circumstances) - unscaled_e_move(toolchange_settings.swap_length + toolchange_settings.extra_prime, MMM_TO_MMS(toolchange_settings.prime_speed)); - - // Cutting retraction - #if TOOLCHANGE_FS_WIPE_RETRACT - unscaled_e_move(-(TOOLCHANGE_FS_WIPE_RETRACT), MMM_TO_MMS(toolchange_settings.retract_speed)); - #endif - - // Cool down with fan - #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 - thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed; - gcode.dwell(toolchange_settings.fan_time * 1000); - thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = 0; - #endif - - // Move back - #if ENABLED(TOOLCHANGE_PARK) - if (ok) { - #if ENABLED(TOOLCHANGE_NO_RETURN) - do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); - #else - do_blocking_move_to(destination, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); - #endif - } - #endif - - // Cutting recover - unscaled_e_move(toolchange_settings.extra_resume + TOOLCHANGE_FS_WIPE_RETRACT, MMM_TO_MMS(toolchange_settings.unretract_speed)); - - planner.synchronize(); - current_position.e = destination.e; - sync_plan_position_e(); // Resume at the old E position - } -} -#endif - /** * Perform a tool-change, which may result in moving the * previous tool out of the way and the new tool into place. */ -void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { +void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { + planner.synchronize(); - if (TERN0(MAGNETIC_SWITCHING_TOOLHEAD, new_tool == active_extruder)) - return; + #if ENABLED(DUAL_X_CARRIAGE) + // Only T0 allowed in DXC_DUPLICATION_MODE + if (tmp_extruder != 0 && dual_x_carriage_mode == DXC_DUPLICATION_MODE) + return invalid_extruder_error(tmp_extruder); + #endif - #if ENABLED(MIXING_EXTRUDER) + #if HAS_LEVELING + // Set current position to the physical position + const bool leveling_was_active = planner.leveling_active; + set_bed_leveling_enabled(false); + #endif - UNUSED(no_move); + #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 - if (new_tool >= MIXING_VIRTUAL_TOOLS) - return invalid_extruder_error(new_tool); + mixing_tool_change(tmp_extruder); - #if MIXING_VIRTUAL_TOOLS > 1 - // T0-Tnnn: Switch virtual tool by changing the index to the mix - mixer.T(new_tool); - #endif + #else // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1 - #elif ENABLED(PRUSA_MMU2) + if (tmp_extruder >= EXTRUDERS) + return invalid_extruder_error(tmp_extruder); - UNUSED(no_move); + #if HOTENDS > 1 - mmu2.tool_change(new_tool); + const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s; - #elif EXTRUDERS == 0 + feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; - // Nothing to do - UNUSED(new_tool); UNUSED(no_move); - - #elif EXTRUDERS < 2 - - UNUSED(no_move); - - if (new_tool) invalid_extruder_error(new_tool); - return; - - #elif HAS_MULTI_EXTRUDER - - planner.synchronize(); - - #if ENABLED(DUAL_X_CARRIAGE) // Only T0 allowed if the Printer is in DXC_DUPLICATION_MODE or DXC_MIRRORED_MODE - if (new_tool != 0 && dxc_is_duplicating()) - return invalid_extruder_error(new_tool); - #endif - - if (new_tool >= EXTRUDERS) - return invalid_extruder_error(new_tool); - - if (!no_move && homing_needed()) { - no_move = true; - DEBUG_ECHOLNPGM("No move (not homed)"); - } - - TERN_(HAS_LCD_MENU, if (!no_move) ui.return_to_status()); - - #if ENABLED(DUAL_X_CARRIAGE) - const bool idex_full_control = dual_x_carriage_mode == DXC_FULL_CONTROL_MODE; - #else - constexpr bool idex_full_control = false; - #endif - - const uint8_t old_tool = active_extruder; - const bool can_move_away = !no_move && !idex_full_control; - - #if HAS_LEVELING - // Set current position to the physical position - TEMPORARY_BED_LEVELING_STATE(false); - #endif - - // First tool priming. To prime again, reboot the machine. - #if BOTH(TOOLCHANGE_FILAMENT_SWAP, TOOLCHANGE_FS_PRIME_FIRST_USED) - static bool first_tool_is_primed = false; - if (new_tool == old_tool && !first_tool_is_primed && enable_first_prime) { - tool_change_prime(); - first_tool_is_primed = true; - toolchange_extruder_ready[old_tool] = true; // Primed and initialized - } - #endif - - if (new_tool != old_tool) { - destination = current_position; - - #if BOTH(TOOLCHANGE_FILAMENT_SWAP, HAS_FAN) && TOOLCHANGE_FS_FAN >= 0 - // Store and stop fan. Restored on any exit. - REMEMBER(fan, thermalManager.fan_speed[TOOLCHANGE_FS_FAN], 0); - #endif - - // Z raise before retraction - #if ENABLED(TOOLCHANGE_ZRAISE_BEFORE_RETRACT) && DISABLED(SWITCHING_NOZZLE) - if (can_move_away && TERN1(TOOLCHANGE_PARK, toolchange_settings.enable_park)) { - // Do a small lift to avoid the workpiece in the move back (below) - current_position.z += toolchange_settings.z_raise; - #if HAS_SOFTWARE_ENDSTOPS - NOMORE(current_position.z, soft_endstop.max.z); + if (tmp_extruder != active_extruder) { + if (!no_move && axis_unhomed_error()) { + no_move = true; + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("No move on toolchange"); #endif - fast_line_to_current(Z_AXIS); - planner.synchronize(); } - #endif - // Unload / Retract - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - const bool should_swap = can_move_away && toolchange_settings.swap_length, - too_cold = TERN0(PREVENT_COLD_EXTRUSION, - !DEBUGGING(DRYRUN) && (thermalManager.targetTooColdToExtrude(old_tool) || thermalManager.targetTooColdToExtrude(new_tool)) - ); - if (should_swap) { - if (too_cold) { - SERIAL_ECHO_MSG(STR_ERR_HOTEND_TOO_COLD); - if (ENABLED(SINGLENOZZLE)) { active_extruder = new_tool; return; } - } - else { - #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) - // For first new tool, change without unloading the old. 'Just prime/init the new' - if (first_tool_is_primed) - unscaled_e_move(-toolchange_settings.swap_length, MMM_TO_MMS(toolchange_settings.retract_speed)); - first_tool_is_primed = true; // The first new tool will be primed by toolchanging + #if ENABLED(DUAL_X_CARRIAGE) + + #if HAS_SOFTWARE_ENDSTOPS + // Update the X software endstops early + active_extruder = tmp_extruder; + update_software_endstops(X_AXIS); + active_extruder = !tmp_extruder; + #endif + + // Don't move the new extruder out of bounds + if (!WITHIN(current_position[X_AXIS], soft_endstop_min[X_AXIS], soft_endstop_max[X_AXIS])) + no_move = true; + + if (!no_move) set_destination_from_current(); + dualx_tool_change(tmp_extruder, no_move); // Can modify no_move + + #else // !DUAL_X_CARRIAGE + + set_destination_from_current(); + + const float xdiff = hotend_offset[X_AXIS][tmp_extruder] - hotend_offset[X_AXIS][active_extruder], + ydiff = hotend_offset[Y_AXIS][tmp_extruder] - hotend_offset[Y_AXIS][active_extruder]; + + #if ENABLED(PARKING_EXTRUDER) // Dual Parking extruder + constexpr float zdiff = 0; + parking_extruder_tool_change(tmp_extruder, no_move); + #elif ENABLED(SWITCHING_TOOLHEAD) // Switching Toolhead + constexpr float zdiff = 0; + switching_toolhead_tool_change(tmp_extruder, fr_mm_s, no_move); + #else + const float zdiff = hotend_offset[Z_AXIS][tmp_extruder] - hotend_offset[Z_AXIS][active_extruder]; + #if ENABLED(SWITCHING_NOZZLE) + // Always raise by at least 1 to avoid workpiece + current_position[Z_AXIS] += MAX(-zdiff, 0.0) + 1; + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + move_nozzle_servo(tmp_extruder); #endif - } - } - #endif - - TERN_(SWITCHING_NOZZLE_TWO_SERVOS, raise_nozzle(old_tool)); - - REMEMBER(fr, feedrate_mm_s, XY_PROBE_FEEDRATE_MM_S); - - #if HAS_SOFTWARE_ENDSTOPS - #if HAS_HOTEND_OFFSET - #define _EXT_ARGS , old_tool, new_tool - #else - #define _EXT_ARGS - #endif - update_software_endstops(X_AXIS _EXT_ARGS); - #if DISABLED(DUAL_X_CARRIAGE) - update_software_endstops(Y_AXIS _EXT_ARGS); - update_software_endstops(Z_AXIS _EXT_ARGS); - #endif - #endif - - #if DISABLED(TOOLCHANGE_ZRAISE_BEFORE_RETRACT) && DISABLED(SWITCHING_NOZZLE) - if (can_move_away && TERN1(TOOLCHANGE_PARK, toolchange_settings.enable_park)) { - // Do a small lift to avoid the workpiece in the move back (below) - current_position.z += toolchange_settings.z_raise; - #if HAS_SOFTWARE_ENDSTOPS - NOMORE(current_position.z, soft_endstop.max.z); #endif - fast_line_to_current(Z_AXIS); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + SERIAL_ECHOPAIR("Offset Tool XY by { ", xdiff); + SERIAL_ECHOPAIR(", ", ydiff); + SERIAL_ECHOPAIR(", ", zdiff); + SERIAL_ECHOLNPGM(" }"); + } + #endif + + // The newly-selected extruder XY is actually at... + current_position[X_AXIS] += xdiff; + current_position[Y_AXIS] += ydiff; + current_position[Z_AXIS] += zdiff; + + // Set the new active extruder + active_extruder = tmp_extruder; + + #endif // !DUAL_X_CARRIAGE + + // Tell the planner the new "current position" + SYNC_PLAN_POSITION_KINEMATIC(); + + #if ENABLED(DELTA) + //LOOP_XYZ(i) update_software_endstops(i); // or modify the constrain function + const bool safe_to_move = current_position[Z_AXIS] < delta_clip_start_height - 1; + #else + constexpr bool safe_to_move = true; + #endif + + // Raise, move, and lower again + if (safe_to_move && !no_move && IsRunning()) { + #if DISABLED(SWITCHING_NOZZLE) + // Do a small lift to avoid the workpiece in the move back (below) + current_position[Z_AXIS] += 1.0; + planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder); + #endif + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination); + #endif + // Move back to the original (or tweaked) position + do_blocking_move_to(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS]); + #if ENABLED(DUAL_X_CARRIAGE) + active_extruder_parked = false; + #endif } + #if ENABLED(SWITCHING_NOZZLE) + else { + // Move back down. (Including when the new tool is higher.) + do_blocking_move_to_z(destination[Z_AXIS], planner.max_feedrate_mm_s[Z_AXIS]); + } + #endif + } // (tmp_extruder != active_extruder) + + planner.synchronize(); + + #if ENABLED(EXT_SOLENOID) && DISABLED(PARKING_EXTRUDER) + disable_all_solenoids(); + enable_solenoid_on_active_extruder(); #endif - // Toolchange park - #if ENABLED(TOOLCHANGE_PARK) && DISABLED(SWITCHING_NOZZLE) - if (can_move_away && toolchange_settings.enable_park) { - TERN(TOOLCHANGE_PARK_Y_ONLY,,current_position.x = toolchange_settings.change_point.x); - TERN(TOOLCHANGE_PARK_X_ONLY,,current_position.y = toolchange_settings.change_point.y); - planner.buffer_line(current_position, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE), old_tool); - planner.synchronize(); - } + feedrate_mm_s = old_feedrate_mm_s; + + #if HAS_SOFTWARE_ENDSTOPS && ENABLED(DUAL_X_CARRIAGE) + update_software_endstops(X_AXIS); #endif - #if HAS_HOTEND_OFFSET - xyz_pos_t diff = hotend_offset[new_tool] - hotend_offset[old_tool]; - TERN_(DUAL_X_CARRIAGE, diff.x = 0); - #else - constexpr xyz_pos_t diff{0}; - #endif + #else // HOTENDS <= 1 - #if ENABLED(DUAL_X_CARRIAGE) - dualx_tool_change(new_tool, no_move); - #elif ENABLED(PARKING_EXTRUDER) // Dual Parking extruder - parking_extruder_tool_change(new_tool, no_move); - #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) // Magnetic Parking extruder - magnetic_parking_extruder_tool_change(new_tool); - #elif ENABLED(SWITCHING_TOOLHEAD) // Switching Toolhead - switching_toolhead_tool_change(new_tool, no_move); - #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) // Magnetic Switching Toolhead - magnetic_switching_toolhead_tool_change(new_tool, no_move); - #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) // Magnetic Switching ToolChanger - em_switching_toolhead_tool_change(new_tool, no_move); - #elif ENABLED(SWITCHING_NOZZLE) && !SWITCHING_NOZZLE_TWO_SERVOS // Switching Nozzle (single servo) - // Raise by a configured distance to avoid workpiece, except with - // SWITCHING_NOZZLE_TWO_SERVOS, as both nozzles will lift instead. - if (!no_move) { - const float newz = current_position.z + _MAX(-diff.z, 0.0); + UNUSED(fr_mm_s); + UNUSED(no_move); - // Check if Z has space to compensate at least z_offset, and if not, just abort now - const float maxz = _MIN(TERN(HAS_SOFTWARE_ENDSTOPS, soft_endstop.max.z, Z_MAX_POS), Z_MAX_POS); - if (newz > maxz) return; + #if ENABLED(MK2_MULTIPLEXER) + if (tmp_extruder >= E_STEPPERS) + return invalid_extruder_error(tmp_extruder); - current_position.z = _MIN(newz + toolchange_settings.z_raise, maxz); - fast_line_to_current(Z_AXIS); - } - move_nozzle_servo(new_tool); + select_multiplexed_stepper(tmp_extruder); #endif // Set the new active extruder - if (DISABLED(DUAL_X_CARRIAGE)) active_extruder = new_tool; + active_extruder = tmp_extruder; - // The newly-selected extruder XYZ is actually at... - DEBUG_ECHOLNPAIR("Offset Tool XYZ by { ", diff.x, ", ", diff.y, ", ", diff.z, " }"); - current_position += diff; - - // Tell the planner the new "current position" - sync_plan_position(); - - #if ENABLED(DELTA) - //LOOP_XYZ(i) update_software_endstops(i); // or modify the constrain function - const bool safe_to_move = current_position.z < delta_clip_start_height - 1; - #else - constexpr bool safe_to_move = true; - #endif - - // Return to position and lower again - const bool should_move = safe_to_move && !no_move && IsRunning(); - if (should_move) { - - #if BOTH(HAS_FAN, SINGLENOZZLE_STANDBY_FAN) - singlenozzle_fan_speed[old_tool] = thermalManager.fan_speed[0]; - thermalManager.fan_speed[0] = singlenozzle_fan_speed[new_tool]; - #endif - - #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - singlenozzle_temp[old_tool] = thermalManager.temp_hotend[0].target; - if (singlenozzle_temp[new_tool] && singlenozzle_temp[new_tool] != singlenozzle_temp[old_tool]) { - thermalManager.setTargetHotend(singlenozzle_temp[new_tool], 0); - TERN_(AUTOTEMP, planner.autotemp_update()); - TERN_(HAS_DISPLAY, thermalManager.set_heating_message(0)); - (void)thermalManager.wait_for_hotend(0, false); // Wait for heating or cooling - } - #endif - - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - if (should_swap && !too_cold) { - - float fr = toolchange_settings.unretract_speed; - - #if ENABLED(TOOLCHANGE_FS_INIT_BEFORE_SWAP) - if (!toolchange_extruder_ready[new_tool]) { - toolchange_extruder_ready[new_tool] = true; - fr = toolchange_settings.prime_speed; // Next move is a prime - unscaled_e_move(0, MMM_TO_MMS(fr)); // Init planner with 0 length move - } - #endif - - // Unretract (or Prime) - unscaled_e_move(toolchange_settings.swap_length, MMM_TO_MMS(fr)); - - // Extra Prime - unscaled_e_move(toolchange_settings.extra_prime, MMM_TO_MMS(toolchange_settings.prime_speed)); - - // Cutting retraction - #if TOOLCHANGE_FS_WIPE_RETRACT - unscaled_e_move(-(TOOLCHANGE_FS_WIPE_RETRACT), MMM_TO_MMS(toolchange_settings.retract_speed)); - #endif - - // Cool down with fan - #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 - thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed; - gcode.dwell(toolchange_settings.fan_time * 1000); - thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = 0; - #endif - } - #endif - - // Prevent a move outside physical bounds - #if ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) - // If the original position is within tool store area, go to X origin at once - if (destination.y < SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR) { - current_position.x = 0; - planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], new_tool); - planner.synchronize(); - } - #else - apply_motion_limits(destination); - #endif - - // Should the nozzle move back to the old position? - if (can_move_away) { - #if ENABLED(TOOLCHANGE_NO_RETURN) - // Just move back down - DEBUG_ECHOLNPGM("Move back Z only"); - - #if ENABLED(TOOLCHANGE_PARK) - if (toolchange_settings.enable_park) - #endif - do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); - - #else - // Move back to the original (or adjusted) position - DEBUG_POS("Move back", destination); - - #if ENABLED(TOOLCHANGE_PARK) - if (toolchange_settings.enable_park) do_blocking_move_to_xy_z(destination, destination.z, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); - #else - do_blocking_move_to_xy(destination, planner.settings.max_feedrate_mm_s[X_AXIS]); - do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); - #endif - - #endif - } - - else DEBUG_ECHOLNPGM("Move back skipped"); - - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - if (should_swap && !too_cold) { - // Cutting recover - unscaled_e_move(toolchange_settings.extra_resume + TOOLCHANGE_FS_WIPE_RETRACT, MMM_TO_MMS(toolchange_settings.unretract_speed)); - current_position.e = 0; - sync_plan_position_e(); // New extruder primed and set to 0 - - // Restart Fan - #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 - RESTORE(fan); - #endif - } - #endif - - TERN_(DUAL_X_CARRIAGE, active_extruder_parked = false); - } - - #if ENABLED(SWITCHING_NOZZLE) - // Move back down. (Including when the new tool is higher.) - if (!should_move) - do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); - #endif - - TERN_(PRUSA_MMU2, mmu2.tool_change(new_tool)); - - TERN_(SWITCHING_NOZZLE_TWO_SERVOS, lower_nozzle(new_tool)); - - } // (new_tool != old_tool) - - planner.synchronize(); - - #if ENABLED(EXT_SOLENOID) && DISABLED(PARKING_EXTRUDER) - disable_all_solenoids(); - enable_solenoid_on_active_extruder(); - #endif - - #if ENABLED(MK2_MULTIPLEXER) - if (new_tool >= E_STEPPERS) return invalid_extruder_error(new_tool); - select_multiplexed_stepper(new_tool); - #endif + #endif // HOTENDS <= 1 #if DO_SWITCH_EXTRUDER planner.synchronize(); move_extruder_servo(active_extruder); #endif - TERN_(HAS_FANMUX, fanmux_switch(active_extruder)); + #if HAS_FANMUX + fanmux_switch(active_extruder); + #endif - #ifdef EVENT_GCODE_AFTER_TOOLCHANGE - if (!no_move && TERN1(DUAL_X_CARRIAGE, dual_x_carriage_mode == DXC_AUTO_PARK_MODE)) - gcode.process_subcommands_now_P(PSTR(EVENT_GCODE_AFTER_TOOLCHANGE)); + #if HAS_LEVELING + // Restore leveling to re-establish the logical position + set_bed_leveling_enabled(leveling_was_active); #endif SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(active_extruder)); + SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, (int)active_extruder); - #endif // HAS_MULTI_EXTRUDER + #endif // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1 } - -#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - - bool extruder_migration() { - - #if ENABLED(PREVENT_COLD_EXTRUSION) - if (thermalManager.targetTooColdToExtrude(active_extruder)) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration Source Too Cold"); - #endif - return false; - } - #endif - - // No auto-migration or specified target? - if (!migration.target && active_extruder >= migration.last) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHO_MSG("No Migration Target"); - SERIAL_ECHO_MSG("Target: ", migration.target, - " Last: ", migration.last, - " Active: ", active_extruder); - #endif - migration.automode = false; - return false; - } - - // Migrate to a target or the next extruder - - uint8_t migration_extruder = active_extruder; - - if (migration.target) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration using fixed target"); - #endif - // Specified target ok? - const int16_t t = migration.target - 1; - if (t != active_extruder) migration_extruder = t; - } - else if (migration.automode && migration_extruder < migration.last && migration_extruder < EXTRUDERS - 1) - migration_extruder++; - - if (migration_extruder == active_extruder) { - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration source matches active"); - #endif - return false; - } - - // Migration begins - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Beginning migration"); - #endif - - migration.in_progress = true; // Prevent runout script - planner.synchronize(); - - // Remember position before migration - const float resume_current_e = current_position.e; - - // Migrate the flow - planner.set_flow(migration_extruder, planner.flow_percentage[active_extruder]); - - // Migrate the retracted state - #if ENABLED(FWRETRACT) - fwretract.retracted[migration_extruder] = fwretract.retracted[active_extruder]; - #endif - - // Migrate the temperature to the new hotend - #if HAS_MULTI_HOTEND - thermalManager.setTargetHotend(thermalManager.temp_hotend[active_extruder].target, migration_extruder); - TERN_(AUTOTEMP, planner.autotemp_update()); - TERN_(HAS_DISPLAY, thermalManager.set_heating_message(0)); - thermalManager.wait_for_hotend(active_extruder); - #endif - - // Migrate Linear Advance K factor to the new extruder - TERN_(LIN_ADVANCE, planner.extruder_advance_K[active_extruder] = planner.extruder_advance_K[migration_extruder]); - - // Perform the tool change - tool_change(migration_extruder); - - // Retract if previously retracted - #if ENABLED(FWRETRACT) - if (fwretract.retracted[active_extruder]) - unscaled_e_move(-fwretract.settings.retract_length, fwretract.settings.retract_feedrate_mm_s); - #endif - - // If no available extruder - if (EXTRUDERS < 2 || active_extruder >= EXTRUDERS - 2 || active_extruder == migration.last) - migration.automode = false; - - migration.in_progress = false; - - current_position.e = resume_current_e; - - planner.synchronize(); - planner.set_e_position_mm(current_position.e); // New extruder primed and ready - #if ENABLED(DEBUG_TOOLCHANGE_MIGRATION_FEATURE) - SERIAL_ECHOLN("Migration Complete"); - #endif - return true; - } - -#endif // TOOLCHANGE_MIGRATION_FEATURE diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 38347191d3..53da00d178 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,64 +16,21 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once -#include "../inc/MarlinConfigPre.h" -#include "../core/types.h" +#ifndef TOOL_CHANGE_H +#define TOOL_CHANGE_H -#if HAS_MULTI_EXTRUDER - - typedef struct { - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - float swap_length, extra_prime, extra_resume; - int16_t prime_speed, retract_speed, unretract_speed, fan, fan_speed, fan_time; - #endif - #if ENABLED(TOOLCHANGE_PARK) - bool enable_park; - xy_pos_t change_point; - #endif - float z_raise; - } toolchange_settings_t; - - extern toolchange_settings_t toolchange_settings; - - #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - extern void tool_change_prime(); - #endif - - #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) - extern bool enable_first_prime; - #endif - - #if ENABLED(TOOLCHANGE_FS_INIT_BEFORE_SWAP) - extern bool toolchange_extruder_ready[EXTRUDERS]; - #endif - - #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) - typedef struct { - uint8_t target, last; - bool automode, in_progress; - } migration_settings_t; - constexpr migration_settings_t migration_defaults = { 0, 0, false, false }; - extern migration_settings_t migration; - bool extruder_migration(); - #endif -#endif +#include "../inc/MarlinConfig.h" #if DO_SWITCH_EXTRUDER void move_extruder_servo(const uint8_t e); #endif #if ENABLED(SWITCHING_NOZZLE) - #if SWITCHING_NOZZLE_TWO_SERVOS - void lower_nozzle(const uint8_t e); - void raise_nozzle(const uint8_t e); - #else - void move_nozzle_servo(const uint8_t angle_index); - #endif + void move_nozzle_servo(const uint8_t e); #endif #if ENABLED(PARKING_EXTRUDER) @@ -84,44 +41,19 @@ #define PE_MAGNET_ON_STATE PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE #endif - void pe_set_solenoid(const uint8_t extruder_num, const uint8_t state); + void pe_set_magnet(const uint8_t extruder_num, const uint8_t state); - inline void pe_activate_solenoid(const uint8_t extruder_num) { pe_set_solenoid(extruder_num, PE_MAGNET_ON_STATE); } - inline void pe_deactivate_solenoid(const uint8_t extruder_num) { pe_set_solenoid(extruder_num, !PE_MAGNET_ON_STATE); } + inline void pe_activate_magnet(const uint8_t extruder_num) { pe_set_magnet(extruder_num, PE_MAGNET_ON_STATE); } + inline void pe_deactivate_magnet(const uint8_t extruder_num) { pe_set_magnet(extruder_num, !PE_MAGNET_ON_STATE); } - void pe_solenoid_init(); + void pe_magnet_init(); -#elif ENABLED(MAGNETIC_PARKING_EXTRUDER) - - typedef struct MPESettings { - float parking_xpos[2], // M951 L R - grab_distance; // M951 I - feedRate_t slow_feedrate, // M951 J - fast_feedrate; // M951 H - float travel_distance, // M951 D - compensation_factor; // M951 C - } mpe_settings_t; - - extern mpe_settings_t mpe_settings; - - void mpe_settings_init(); - -#endif - -#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - extern uint16_t singlenozzle_temp[EXTRUDERS]; -#endif - -#if BOTH(HAS_FAN, SINGLENOZZLE_STANDBY_FAN) - extern uint8_t singlenozzle_fan_speed[EXTRUDERS]; -#endif - -TERN_(ELECTROMAGNETIC_SWITCHING_TOOLHEAD, void est_init()); - -TERN_(SWITCHING_TOOLHEAD, void swt_init()); +#endif // PARKING_EXTRUDER /** * Perform a tool-change, which may result in moving the * previous tool out of the way and the new tool into place. */ -void tool_change(const uint8_t tmp_extruder, bool no_move=false); +void tool_change(const uint8_t tmp_extruder, const float fr_mm_s=0.0, bool no_move=false); + +#endif // TOOL_CHANGE_H diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h deleted file mode 100644 index 7b5595444c..0000000000 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * E4d@Box pin assignments - * E4d@Box is a small factor 3D printer control board based on the ESP32 microcontroller for Laser, CNC and 3d printers - * for more info check https://atbox.tech/ and join to Facebook page E4d@box. - */ - -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 1 || E_STEPPERS > 1 - #error "E4d@box only supports one E Stepper. Comment out this line to continue." -#elif HOTENDS > 2 - #error "E4d@box currently supports only one hotend. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "E4D@BOX" -#define BOARD_WEBSITE_URL "github.com/Exilaus/E4d@box" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// Limit Switches -// -#define X_MIN_PIN 34 -#define Y_MIN_PIN 35 -#define Z_MIN_PIN 16 // 15 - -// -// Steppers -// -#define X_STEP_PIN 12 // 34//27 -#define X_DIR_PIN 13 // 35//26 -#define X_ENABLE_PIN 17 // 0//17//25 // used free pin -//#define X_CS_PIN 0 - -#define Y_STEP_PIN 32 // 33 -#define Y_DIR_PIN 33 // 32 -#define Y_ENABLE_PIN X_ENABLE_PIN -//#define Y_CS_PIN 13 - -#define Z_STEP_PIN 25 // 14 -#define Z_DIR_PIN 26 // 12 -#define Z_ENABLE_PIN X_ENABLE_PIN -//#define Z_CS_PIN 5 // SS_PIN - -#define E0_STEP_PIN 27 // 16 -#define E0_DIR_PIN 14 // 17 -#define E0_ENABLE_PIN X_ENABLE_PIN -//#define E0_CS_PIN 21 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 36 // Analog Input -#define TEMP_BED_PIN 39 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 // 4//2//(D8) -#define FAN_PIN 0 // 2//15//13 (D9) -#define HEATER_BED_PIN 15 // 15//0 //(D10) - -// SPI -#define SDSS 5 -#define I2S_STEPPER_STREAM -#define I2S_WS 23 -#define I2S_BCK 22 -#define I2S_DATA 21 diff --git a/Marlin/src/pins/esp32/pins_ESP32.h b/Marlin/src/pins/esp32/pins_ESP32.h deleted file mode 100644 index d54a92b9c4..0000000000 --- a/Marlin/src/pins/esp32/pins_ESP32.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Espressif ESP32 (Tensilica Xtensa LX6) pin assignments - */ - -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - "Oops! Select an ESP32 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Espressif ESP32" - -// -// I2S (steppers & other output-only pins) -// -#define I2S_STEPPER_STREAM -#define I2S_WS 25 -#define I2S_BCK 26 -#define I2S_DATA 27 - -// -// Limit Switches -// -#define X_MIN_PIN 34 -#define Y_MIN_PIN 35 -#define Z_MIN_PIN 15 - -// -// Steppers -// -#define X_STEP_PIN 128 -#define X_DIR_PIN 129 -#define X_ENABLE_PIN 130 -//#define X_CS_PIN 0 - -#define Y_STEP_PIN 131 -#define Y_DIR_PIN 132 -#define Y_ENABLE_PIN 133 -//#define Y_CS_PIN 13 - -#define Z_STEP_PIN 134 -#define Z_DIR_PIN 135 -#define Z_ENABLE_PIN 136 -//#define Z_CS_PIN 5 // SS_PIN - -#define E0_STEP_PIN 137 -#define E0_DIR_PIN 138 -#define E0_ENABLE_PIN 139 -//#define E0_CS_PIN 21 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 36 // Analog Input -#define TEMP_BED_PIN 39 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define FAN_PIN 13 -#define HEATER_BED_PIN 4 - -// SPI -#define SDSS 5 diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h deleted file mode 100644 index 0457b0afca..0000000000 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MRR ESPA pin assignments - * MRR ESPA is a 3D printer control board based on the ESP32 microcontroller. - * Supports 4 stepper drivers, heated bed, single hotend. - */ - -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 1 || E_STEPPERS > 1 - #error "MRR ESPA only supports one E Stepper. Comment out this line to continue." -#elif HOTENDS > 1 - #error "MRR ESPA currently supports only one hotend. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MRR ESPA" -#define BOARD_WEBSITE_URL "github.com/maplerainresearch/MRR_ESPA" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// Disable I2S stepper stream -// -#ifdef I2S_STEPPER_STREAM - #undef I2S_STEPPER_STREAM -#endif -#define I2S_WS -1 -#define I2S_BCK -1 -#define I2S_DATA -1 - -// -// Limit Switches -// -#define X_STOP_PIN 34 -#define Y_STOP_PIN 35 -#define Z_STOP_PIN 15 - -// -// Steppers -// -#define X_STEP_PIN 27 -#define X_DIR_PIN 26 -#define X_ENABLE_PIN 25 -//#define X_CS_PIN 21 - -#define Y_STEP_PIN 33 -#define Y_DIR_PIN 32 -#define Y_ENABLE_PIN X_ENABLE_PIN -//#define Y_CS_PIN 22 - -#define Z_STEP_PIN 14 -#define Z_DIR_PIN 12 -#define Z_ENABLE_PIN X_ENABLE_PIN -//#define Z_CS_PIN 5 // SS_PIN - -#define E0_STEP_PIN 16 -#define E0_DIR_PIN 17 -#define E0_ENABLE_PIN X_ENABLE_PIN -//#define E0_CS_PIN 21 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 36 // Analog Input -#define TEMP_BED_PIN 39 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define FAN_PIN 13 -#define HEATER_BED_PIN 4 - -// -// MicroSD card -// -#define MOSI_PIN 23 -#define MISO_PIN 19 -#define SCK_PIN 18 -#define SDSS 5 -#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers - -// Hardware serial pins -// Add the following to Configuration.h or Configuration_adv.h to assign -// specific pins to hardware Serial1. -// Note: Serial2 can be defined using HARDWARE_SERIAL2_RX and HARDWARE_SERIAL2_TX but -// MRR ESPA does not have enough spare pins for such reassignment. -//#define HARDWARE_SERIAL1_RX 21 -//#define HARDWARE_SERIAL1_TX 22 diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h deleted file mode 100644 index 95f761f26a..0000000000 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ /dev/null @@ -1,165 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MRR ESPE pin assignments - * MRR ESPE is a 3D printer control board based on the ESP32 microcontroller. - * Supports 5 stepper drivers (using I2S stepper stream), heated bed, - * single hotend, and LCD controller. - */ - -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 2 || E_STEPPERS > 2 - #error "MRR ESPE only supports two E Steppers. Comment out this line to continue." -#elif HOTENDS > 1 - #error "MRR ESPE currently supports only one hotend. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MRR ESPE" -#define BOARD_WEBSITE_URL "github.com/maplerainresearch/MRR_ESPE" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// Limit Switches -// -#define X_STOP_PIN 35 -#define Y_STOP_PIN 32 -#define Z_STOP_PIN 33 - -// -// Enable I2S stepper stream -// -#undef I2S_STEPPER_STREAM -#define I2S_STEPPER_STREAM - -#undef LIN_ADVANCE // Currently, I2S stream does not work with linear advance - -#define I2S_WS 26 -#define I2S_BCK 25 -#define I2S_DATA 27 - -// -// Steppers -// -#define X_STEP_PIN 129 -#define X_DIR_PIN 130 -#define X_ENABLE_PIN 128 -//#define X_CS_PIN 21 - -#define Y_STEP_PIN 132 -#define Y_DIR_PIN 133 -#define Y_ENABLE_PIN 131 -//#define Y_CS_PIN 22 - -#define Z_STEP_PIN 135 -#define Z_DIR_PIN 136 -#define Z_ENABLE_PIN 134 -//#define Z_CS_PIN 5 // SS_PIN - -#define E0_STEP_PIN 138 -#define E0_DIR_PIN 139 -#define E0_ENABLE_PIN 137 -//#define E0_CS_PIN 21 - -#define E1_STEP_PIN 141 -#define E1_DIR_PIN 142 -#define E1_ENABLE_PIN 140 -//#define E1_CS_PIN 22 - -#define Z2_STEP_PIN 141 -#define Z2_DIR_PIN 142 -#define Z2_ENABLE_PIN 140 -//#define Z2_CS_PIN 5 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 36 // Analog Input -#define TEMP_1_PIN 34 // Analog Input -#define TEMP_BED_PIN 39 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 145 // 2 -#define FAN_PIN 146 // 15 -#define HEATER_BED_PIN 144 // 4 - -#define CONTROLLER_FAN_PIN 147 -//#define E0_AUTO_FAN_PIN 148 // need to update Configuration_adv.h @section extruder -//#define E1_AUTO_FAN_PIN 149 // need to update Configuration_adv.h @section extruder -#define FAN1_PIN 149 - -// -// MicroSD card -// -#define MOSI_PIN 23 -#define MISO_PIN 19 -#define SCK_PIN 18 -#define SDSS 5 -#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers - -////////////////////////// -// LCDs and Controllers // -////////////////////////// - -#if HAS_MARLINUI_U8GLIB - - #define LCD_PINS_RS 13 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 16 - - #if ENABLED(CR10_STOCKDISPLAY) - - #define BEEPER_PIN 151 - - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - - #define BEEPER_PIN 151 - - //#define LCD_PINS_D5 150 - //#define LCD_PINS_D6 152 - //#define LCD_PINS_D7 153 - - #else - - #error "Only CR10_STOCKDISPLAY and REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER are currently supported. Comment out this line to continue." - - #endif - - #define BTN_EN1 0 - #define BTN_EN2 12 - #define BTN_ENC 14 - -#endif // HAS_MARLINUI_U8GLIB - -// Hardware serial pins -// Add the following to Configuration.h or Configuration_adv.h to assign -// specific pins to hardware Serial1 and Serial2. -// Note: Serial2 can be defined using HARDWARE_SERIAL2_RX and HARDWARE_SERIAL2_TX but -// MRR ESPA does not have enough spare pins for such reassignment. -//#define HARDWARE_SERIAL1_RX 21 -//#define HARDWARE_SERIAL1_TX 22 -//#define HARDWARE_SERIAL2_RX 2 -//#define HARDWARE_SERIAL2_TX 4 diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h deleted file mode 100644 index 002d2ebd9c..0000000000 --- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h +++ /dev/null @@ -1,635 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega with RAMPS v1.4 (or v1.3) pin assignments - * - * Applies to the following boards: - * - * RAMPS_14_EFB (Hotend, Fan, Bed) - * RAMPS_14_EEB (Hotend0, Hotend1, Bed) - * RAMPS_14_EFF (Hotend, Fan0, Fan1) - * RAMPS_14_EEF (Hotend0, Hotend1, Fan) - * RAMPS_14_SF (Spindle, Controller Fan) - * - * RAMPS_13_EFB (Hotend, Fan, Bed) - * RAMPS_13_EEB (Hotend0, Hotend1, Bed) - * RAMPS_13_EFF (Hotend, Fan0, Fan1) - * RAMPS_13_EEF (Hotend0, Hotend1, Fan) - * RAMPS_13_SF (Spindle, Controller Fan) - * - * Other pins_MYBOARD.h files may override these defaults - * - * Differences between - * RAMPS_13 | RAMPS_14 - * 7 | 11 - */ - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "RAMPS 1.4" -#endif - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -#define IS_RAMPS_EFB - -// -// Servos -// -#ifdef IS_RAMPS_13 - #define SERVO0_PIN 7 // RAMPS_13 // Will conflict with BTN_EN2 on LCD_I2C_VIKI -#else - #define SERVO0_PIN 11 -#endif -#define SERVO1_PIN 6 -#define SERVO2_PIN 5 -#ifndef SERVO3_PIN - #define SERVO3_PIN 4 -#endif - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#ifndef X_MAX_PIN - #define X_MAX_PIN 2 -#endif -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -#ifndef X_CS_PIN - #define X_CS_PIN 53 -#endif - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -#ifndef Y_CS_PIN - #define Y_CS_PIN 49 -#endif - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 -#ifndef Z_CS_PIN - #define Z_CS_PIN 40 -#endif - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -#ifndef E0_CS_PIN - #define E0_CS_PIN 42 -#endif - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 -#ifndef E1_CS_PIN - #define E1_CS_PIN 44 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card -#else - #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) -#endif - -// -// Augmentation for auto-assigning RAMPS plugs -// -#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) - #if HAS_MULTI_HOTEND - #if TEMP_SENSOR_BED - #define IS_RAMPS_EEB - #else - #define IS_RAMPS_EEF - #endif - #elif TEMP_SENSOR_BED - #define IS_RAMPS_EFB - #else - #define IS_RAMPS_EFF - #endif -#endif - -// -// Heaters / Fans -// -#ifndef MOSFET_D_PIN - #define MOSFET_D_PIN -1 -#endif -#ifndef RAMPS_D8_PIN - #define RAMPS_D8_PIN 8 -#endif -#ifndef RAMPS_D9_PIN - #define RAMPS_D9_PIN 9 -#endif -#ifndef RAMPS_D10_PIN - #define RAMPS_D10_PIN 10 -#endif - -#define HEATER_0_PIN RAMPS_D10_PIN - -#if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed - #define FAN_PIN RAMPS_D9_PIN - #define HEATER_BED_PIN RAMPS_D8_PIN -#elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan - #define HEATER_1_PIN RAMPS_D9_PIN - #define FAN_PIN RAMPS_D8_PIN -#elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed - #define HEATER_1_PIN RAMPS_D9_PIN - #define HEATER_BED_PIN RAMPS_D8_PIN -#elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan - #define FAN_PIN RAMPS_D9_PIN - #define FAN1_PIN RAMPS_D8_PIN -#elif ENABLED(IS_RAMPS_SF) // Spindle, Fan - #define FAN_PIN RAMPS_D8_PIN -#else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") - #define FAN_PIN RAMPS_D9_PIN - #define HEATER_BED_PIN RAMPS_D8_PIN - #if HOTENDS == 1 - #define FAN1_PIN MOSFET_D_PIN - #else - #define HEATER_1_PIN MOSFET_D_PIN - #endif -#endif - -#ifndef FAN_PIN - #define FAN_PIN 4 // IO pin. Buffer needed -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 5 // Analog Input on AUX2 -#endif - -// define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 4 -#endif - -#ifndef PS_ON_PIN - #define PS_ON_PIN 12 -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENA_PIN) - #if NUM_SERVOS <= 1 // Prefer the servo connector - #define CASE_LIGHT_PIN 6 // Hardware PWM - #elif HAS_FREE_AUX2_PINS // try to use AUX 2 - #define CASE_LIGHT_PIN 44 // Hardware PWM - #endif -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) - #if !defined(NUM_SERVOS) || NUM_SERVOS == 0 // Prefer the servo connector - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM - #define SPINDLE_DIR_PIN 5 - #elif HAS_FREE_AUX2_PINS // try to use AUX 2 - #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM - #define SPINDLE_DIR_PIN 65 - #endif -#endif - -// -// Průša i3 MK2 Multiplexer Support -// -#ifndef E_MUX0_PIN - #define E_MUX0_PIN 40 // Z_CS_PIN -#endif -#ifndef E_MUX1_PIN - #define E_MUX1_PIN 42 // E0_CS_PIN -#endif -#ifndef E_MUX2_PIN - #define E_MUX2_PIN 44 // E1_CS_PIN -#endif - -/** - * Default pins for TMC software SPI - */ -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI 66 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO 44 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK 64 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - /** - * Software serial - */ - - #ifndef X_SERIAL_TX_PIN - #define X_SERIAL_TX_PIN 40 - #endif - #ifndef X_SERIAL_RX_PIN - #define X_SERIAL_RX_PIN 63 - #endif - #ifndef X2_SERIAL_TX_PIN - #define X2_SERIAL_TX_PIN -1 - #endif - #ifndef X2_SERIAL_RX_PIN - #define X2_SERIAL_RX_PIN -1 - #endif - - #ifndef Y_SERIAL_TX_PIN - #define Y_SERIAL_TX_PIN 59 - #endif - #ifndef Y_SERIAL_RX_PIN - #define Y_SERIAL_RX_PIN 64 - #endif - #ifndef Y2_SERIAL_TX_PIN - #define Y2_SERIAL_TX_PIN -1 - #endif - #ifndef Y2_SERIAL_RX_PIN - #define Y2_SERIAL_RX_PIN -1 - #endif - - #ifndef Z_SERIAL_TX_PIN - #define Z_SERIAL_TX_PIN 42 - #endif - #ifndef Z_SERIAL_RX_PIN - #define Z_SERIAL_RX_PIN 65 - #endif - #ifndef Z2_SERIAL_TX_PIN - #define Z2_SERIAL_TX_PIN -1 - #endif - #ifndef Z2_SERIAL_RX_PIN - #define Z2_SERIAL_RX_PIN -1 - #endif - - #ifndef E0_SERIAL_TX_PIN - #define E0_SERIAL_TX_PIN 44 - #endif - #ifndef E0_SERIAL_RX_PIN - #define E0_SERIAL_RX_PIN 66 - #endif - #ifndef E1_SERIAL_TX_PIN - #define E1_SERIAL_TX_PIN -1 - #endif - #ifndef E1_SERIAL_RX_PIN - #define E1_SERIAL_RX_PIN -1 - #endif - #ifndef E2_SERIAL_TX_PIN - #define E2_SERIAL_TX_PIN -1 - #endif - #ifndef E2_SERIAL_RX_PIN - #define E2_SERIAL_RX_PIN -1 - #endif - #ifndef E3_SERIAL_TX_PIN - #define E3_SERIAL_TX_PIN -1 - #endif - #ifndef E3_SERIAL_RX_PIN - #define E3_SERIAL_RX_PIN -1 - #endif - #ifndef E4_SERIAL_TX_PIN - #define E4_SERIAL_TX_PIN -1 - #endif - #ifndef E4_SERIAL_RX_PIN - #define E4_SERIAL_RX_PIN -1 - #endif - #ifndef E5_SERIAL_TX_PIN - #define E5_SERIAL_TX_PIN -1 - #endif - #ifndef E5_SERIAL_RX_PIN - #define E5_SERIAL_RX_PIN -1 - #endif - #ifndef E6_SERIAL_TX_PIN - #define E6_SERIAL_TX_PIN -1 - #endif - #ifndef E6_SERIAL_RX_PIN - #define E6_SERIAL_RX_PIN -1 - #endif - #ifndef E7_SERIAL_TX_PIN - #define E7_SERIAL_TX_PIN -1 - #endif - #ifndef E7_SERIAL_RX_PIN - #define E7_SERIAL_RX_PIN -1 - #endif -#endif - -////////////////////////// -// LCDs and Controllers // -////////////////////////// - -#if HAS_WIRED_LCD - - // - // LCD Display output pins - // - #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - - #elif BOTH(NEWPANEL, PANEL_ONE) - - #define LCD_PINS_RS 40 - #define LCD_PINS_ENABLE 42 - #define LCD_PINS_D4 65 - #define LCD_PINS_D5 66 - #define LCD_PINS_D6 44 - #define LCD_PINS_D7 64 - - #else - - #if ENABLED(CR10_STOCKDISPLAY) - - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 - #define LCD_PINS_D4 25 - - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 37 - #endif - - #elif ENABLED(ZONESTAR_LCD) - - #define LCD_PINS_RS 64 - #define LCD_PINS_ENABLE 44 - #define LCD_PINS_D4 63 - #define LCD_PINS_D5 40 - #define LCD_PINS_D6 42 - #define LCD_PINS_D7 65 - - #else - - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) - #define LCD_PINS_DC 25 // Set as output on init - #define LCD_PINS_RS 27 // Pull low for 1s to init - // DOGM SPI LCD Support - #define DOGLCD_CS 16 - #define DOGLCD_MOSI 17 - #define DOGLCD_SCK 23 - #define DOGLCD_A0 LCD_PINS_DC - #else - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #endif - - #define LCD_PINS_D7 29 - - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 - #endif - - #endif - - #if DISABLED(NEWPANEL) - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 - #endif - - #endif - - // - // LCD Display input pins - // - #if ENABLED(NEWPANEL) - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN 37 - - #if ENABLED(CR10_STOCKDISPLAY) - #define BTN_EN1 17 - #define BTN_EN2 23 - #else - #define BTN_EN1 31 - #define BTN_EN2 33 - #endif - - #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 - #endif - - #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS SDSS - #define KILL_PIN 41 - - #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - #define BTN_ENC -1 - - #define LCD_SDSS SDSS - #define SD_DETECT_PIN 49 - - #elif ANY(VIKI2, miniVIKI) - - #define DOGLCD_CS 45 - #define DOGLCD_A0 44 - #define LCD_SCREEN_ROT_180 - - #define BEEPER_PIN 33 - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 - - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 - - #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - #define KILL_PIN 31 - - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - - #define BEEPER_PIN 23 - #define LCD_BACKLIGHT_PIN 33 - - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - - #define LCD_SDSS SDSS - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - - #elif ENABLED(MKS_MINI_12864) - - #define DOGLCD_A0 27 - #define DOGLCD_CS 25 - - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - #define BEEPER_PIN 37 - // not connected to a pin - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - - #define SD_DETECT_PIN 49 - #define KILL_PIN 64 - - #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN 42 - // not connected to a pin - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 - - #define SD_DETECT_PIN 49 - #define KILL_PIN 64 - - #elif ENABLED(ZONESTAR_LCD) - - #define ADC_KEYPAD_PIN 12 - - #elif ENABLED(AZSMZ_12864) - - // Pins only defined for RAMPS_SMART currently - - #else - - // Beeper on AUX-4 - #define BEEPER_PIN 33 - - // Buttons are directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - #endif - - #endif - #endif // NEWPANEL - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h deleted file mode 100644 index 78e7426674..0000000000 --- a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * AZSMZ MINI pin assignments - */ - -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "AZSMZ MINI" - -// -// Servos -// -#define SERVO0_PIN P1_23 - -// -// Limit Switches -// -#define X_MIN_PIN P1_24 -#define Y_MIN_PIN P1_26 -#define Z_MIN_PIN P1_28 -#define Z_MAX_PIN P1_29 - -// -// Steppers -// -#define X_STEP_PIN P2_00 -#define X_DIR_PIN P0_05 -#define X_ENABLE_PIN P0_04 - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P0_11 -#define Y_ENABLE_PIN P0_10 - -#define Z_STEP_PIN P2_02 -#define Z_DIR_PIN P0_20 -#define Z_ENABLE_PIN P0_19 - -#define E0_STEP_PIN P2_03 -#define E0_DIR_PIN P0_22 -#define E0_ENABLE_PIN P0_21 - -#define E1_STEP_PIN P2_08 -#define E1_DIR_PIN P2_13 -#define E1_ENABLE_PIN P4_29 - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_23_A0 // A0 (TH1) -#define TEMP_BED_PIN P0_24_A1 // A1 (TH2) -#define TEMP_1_PIN P0_25_A2 // A2 (TH3) - -// -// Heaters / Fans -// -// EFB -#define HEATER_0_PIN P2_04 -#define HEATER_BED_PIN P2_05 -#ifndef FAN_PIN - #define FAN_PIN P2_07 -#endif -#define FAN1_PIN P0_26 - -#define LCD_SDSS P0_16 // LCD SD chip select -#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card - -#if ENABLED(AZSMZ_12864) - #define BEEPER_PIN P1_30 - #define DOGLCD_A0 P2_06 - #define DOGLCD_CS P1_22 - #define BTN_EN1 P4_28 - #define BTN_EN2 P1_27 - #define BTN_ENC P3_26 - #ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION LCD - #endif -#endif - -#if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 - #define SS_PIN LCD_SDSS - #define SD_DETECT_PIN P3_25 -#elif SD_CONNECTION_IS(ONBOARD) - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "No custom SD drive cable defined for this board." -#endif - -// -// Ethernet pins -// -#define ENET_MDIO P1_17 -#define ENET_RX_ER P1_14 -#define ENET_RXD1 P1_10 -#define ENET_MOC P1_16 -#define REF_CLK P1_15 -#define ENET_RXD0 P1_09 -#define ENET_CRS P1_08 -#define ENET_TX_EN P1_04 -#define ENET_TXD0 P1_00 -#define ENET_TXD1 P1_01 - -/** - * PWMs - * - * There are 6 PWMs. Each PWM can be assigned to one of two pins. - * - * SERVO2 does NOT have a PWM assigned to it. - * - * PWM1.1 DIO4 SERVO3_PIN FIL_RUNOUT_PIN 5V output, PWM - * PWM1.1 DIO26 E0_STEP_PIN - * PWM1.2 DIO11 SERVO0_PIN - * PWM1.2 DIO54 X_STEP_PIN - * PWM1.3 DIO6 SERVO1_PIN J5-1 - * PWM1.3 DIO60 Y_STEP_PIN - * PWM1.4 DIO53 SDSS(SSEL0) J3-5 AUX-3 - * PWM1.4 DIO46 Z_STEP_PIN - * PWM1.5 DIO3 X_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES - * PWM1.5 DIO9 RAMPS_D9_PIN - * PWM1.6 DIO14 Y_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES - * PWM1.6 DIO10 RAMPS_D10_PIN - */ - - /** - * Special pins - * D37 - not 5V tolerant - * D49 - not 5V tolerant - * D57 - open collector - * D58 - open collector - */ diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h deleted file mode 100644 index df182049f9..0000000000 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * BIQU BQ111-A4 - * - * Applies to the following boards: - * - * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) - */ - -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "BIQU Thunder B300 V1.0" -#endif - -// -// Limit Switches -// -#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series -#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series -#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series -#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series -#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V, 1K series -#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series - -// -// Steppers -// -#define X_STEP_PIN P2_00 -#define X_DIR_PIN P0_05 -#define X_ENABLE_PIN P0_04 -#ifndef X_CS_PIN - #define X_CS_PIN P1_15 // ETH -#endif - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P0_11 -#define Y_ENABLE_PIN P0_10 -#ifndef Y_CS_PIN - #define Y_CS_PIN P1_14 // ETH -#endif - -#define Z_STEP_PIN P2_02 -#define Z_DIR_PIN P0_20 -#define Z_ENABLE_PIN P0_19 -#ifndef Z_CS_PIN - #define Z_CS_PIN P1_16 // ETH -#endif - -#define E0_STEP_PIN P2_03 -#define E0_DIR_PIN P0_22 -#define E0_ENABLE_PIN P0_21 -#ifndef E0_CS_PIN - #define E0_CS_PIN P1_17 // ETH -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P0_18 // ETH - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P0_17 // ETH - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P0_15 // ETH - #endif -#endif - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_24_A1 // A0 (T0) -#define TEMP_BED_PIN P0_23_A0 // A1 (T1) - -// -// Heaters / Fans -// -#define HEATER_0_PIN P2_07 -#define HEATER_BED_PIN P2_05 -#ifndef FAN_PIN - #define FAN_PIN P2_04 -#endif - -// -// Unused -// -//#define PIN_P2_10 P2_10 // IBOOT-1 -//#define PIN_P0_27 P0_27 // Onboard SD Detect - -/** - * LCD / Controller - * - * REPRAP_DISCOUNT_SMART_CONTROLLER is not supported due to the lack of LCD_PINS_D5, - * LCD_PINS_D6 or LCD_PINS_D7 in the EXP1 connector. - * - * A remote SD card is not supported as the pins routed to EXP2 are the same as used - * for the onboard SD card, and a chip select signal is not provided for the remote - * SD card. - */ -#if HAS_WIRED_LCD - - #define BEEPER_PIN P1_31 // EXP1-1 - - #define BTN_EN1 P3_26 // EXP2-3 - #define BTN_EN2 P3_25 // EXP2-5 - #define BTN_ENC P1_30 // EXP1-2 - - #define SD_DETECT_PIN P0_27 // EXP2-7 - #define LCD_PINS_RS P0_16 // EXP1-4 - #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 - #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 - - #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER) - #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU B300 v1.0" - #endif - - #if ENABLED(SDSUPPORT) - #error "SDSUPPORT is not supported by the BIQU B300 v1.0 when an LCD controller is used" - #endif - -#endif // HAS_WIRED_LCD - -/** - * SD Card Reader - * - * Software SPI is used to interface with a stand-alone SD card reader connected to EXP1. - * Hardware SPI can't be used because P0_17 (MISO) is not brought out on this board. - */ -#if ENABLED(SDSUPPORT) - #define SCK_PIN P0_15 // EXP1-5 - #define MISO_PIN P0_16 // EXP1-4 - #define MOSI_PIN P0_18 // EXP1-3 - #define SS_PIN P1_30 // EXP1-2 - #define SDSS SS_PIN -#endif - -/** - * PWMS - * - * There are 6 PWMS. Each PWM can be assigned to one of two pins. - * - * PWM1.1 P0_18 LCD_PINS_ENABLE - * PWM1.1 P2_0 X_STEP_PIN - * PWM1.2 P1_20 - * PWM1.2 P2_1 Y_STEP_PIN - * PWM1.3 P1_21 - * PWM1.3 P2_2 Z_STEP_PIN - * PWM1.4 P1_23 - * PWM1.4 P2_3 E0_STEP_PIN - * PWM1.5 P1_24 X_MIN_PIN - * PWM1.5 P2_4 FAN_PIN - * PWM1.6 P1_26 Y_MIN_PIN - * PWM1.6 P2_5 HEATER_BED_PIN - */ diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h deleted file mode 100644 index bcff04eb85..0000000000 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * BIQU BQ111-A4 - * - * Applies to the following boards: - * - * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) - */ - -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "BIQU BQ111-A4" - -// -// Limit Switches -// -#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series -#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series -#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series -#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series -#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V, 1K series -#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series - -// -// Steppers -// -#define X_STEP_PIN P2_00 -#define X_DIR_PIN P0_05 -#define X_ENABLE_PIN P0_04 - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P0_11 -#define Y_ENABLE_PIN P0_10 - -#define Z_STEP_PIN P2_02 -#define Z_DIR_PIN P0_20 -#define Z_ENABLE_PIN P0_19 - -#define E0_STEP_PIN P2_03 -#define E0_DIR_PIN P0_22 -#define E0_ENABLE_PIN P0_21 - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_23_A0 // A0 (T0) -#define TEMP_BED_PIN P0_24_A1 // A1 (T1) - -// -// Heaters / Fans -// -#define HEATER_0_PIN P2_07 -#define HEATER_BED_PIN P2_05 -#ifndef FAN_PIN - #define FAN_PIN P2_04 -#endif - -// -// Unused -// -//#define PIN_P2_10 P2_10 // IBOOT-1 -//#define PIN_P0_27 P0_27 // Onboard SD Detect - -/** - * LCD / Controller - * - * REPRAP_DISCOUNT_SMART_CONTROLLER is not supported due to the lack of LCD_PINS_D5, - * LCD_PINS_D6 or LCD_PINS_D7 in the EXP1 connector. - * - * A remote SD card is not supported as the pins routed to EXP2 are the same as used - * for the onboard SD card, and a chip select signal is not provided for the remote - * SD card. - */ -#if HAS_WIRED_LCD - - #define BEEPER_PIN P1_31 // EXP1-1 - - #define BTN_EN1 P3_26 // EXP2-3 - #define BTN_EN2 P3_25 // EXP2-5 - #define BTN_ENC P1_30 // EXP1-2 - - #define SD_DETECT_PIN P0_27 // EXP2-7 - #define LCD_PINS_RS P0_16 // EXP1-4 - #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 - #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 - - #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER) - #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU BQ111-A4" - #endif - - #if ENABLED(SDSUPPORT) - #error "SDSUPPORT is not supported by the BIQU BQ111-A4 when an LCD controller is used" - #endif - -#endif // HAS_WIRED_LCD - -/** - * SD Card Reader - * - * Software SPI is used to interface with a stand-alone SD card reader connected to EXP1. - * Hardware SPI can't be used because P0_17 (MISO) is not brought out on this board. - */ -#if ENABLED(SDSUPPORT) - - #define SCK_PIN P0_15 // EXP1-5 - #define MISO_PIN P0_16 // EXP1-4 - #define MOSI_PIN P0_18 // EXP1-3 - #define SS_PIN P1_30 // EXP1-2 - #define SDSS SS_PIN - -#endif // SDSUPPORT - -/** - * PWMS - * - * There are 6 PWMS. Each PWM can be assigned to one of two pins. - * - * PWM1.1 P0_18 LCD_PINS_ENABLE - * PWM1.1 P2_0 X_STEP_PIN - * PWM1.2 P1_20 - * PWM1.2 P2_1 Y_STEP_PIN - * PWM1.3 P1_21 - * PWM1.3 P2_2 Z_STEP_PIN - * PWM1.4 P1_23 - * PWM1.4 P2_3 E0_STEP_PIN - * PWM1.5 P1_24 X_MIN_PIN - * PWM1.5 P2_4 FAN_PIN - * PWM1.6 P1_26 Y_MIN_PIN - * PWM1.6 P2_5 HEATER_BED_PIN - */ diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h deleted file mode 100644 index 0701e45992..0000000000 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h +++ /dev/null @@ -1,236 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define BOARD_INFO_NAME "BTT SKR V1.1" - -// -// Limit Switches -// -#define X_MIN_PIN P1_29 -#define X_MAX_PIN P1_28 -#define Y_MIN_PIN P1_27 -#define Y_MAX_PIN P1_26 -#define Z_MIN_PIN P1_25 -#define Z_MAX_PIN P1_24 - -// -// Steppers -// -#define X_STEP_PIN P0_04 -#define X_DIR_PIN P0_05 -#define X_ENABLE_PIN P4_28 - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P2_02 -#define Y_ENABLE_PIN P2_00 - -#define Z_STEP_PIN P0_20 -#define Z_DIR_PIN P0_21 -#define Z_ENABLE_PIN P0_19 - -#define E0_STEP_PIN P0_11 -#define E0_DIR_PIN P2_13 -#define E0_ENABLE_PIN P2_12 - -/** - * LCD / Controller - * - * As of 20 JAN 2019 only the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER display has - * been tested with these settings. It can be connected to the SKR using standard cables - * via the EXP1 and EXP2 ports. Other displays may need a custom cable and/or changes to - * the pins defined below. - * - * The SD card on the LCD controller uses the same SPI signals as the LCD, resulting in - * garbage/lines on the LCD display during SD card access. The LCD code mitigates this - * by redrawing the screen after SD card accesses. - */ - -#if IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS P3_26 - #endif - - #define SD_DETECT_PIN P1_31 - -#elif HAS_WIRED_LCD - - #define BTN_EN1 P3_26 - #define BTN_EN2 P3_25 - #define BTN_ENC P2_11 - - #define SD_DETECT_PIN P1_31 - #define LCD_SDSS P1_23 - #define LCD_PINS_RS P0_16 - #define LCD_PINS_ENABLE P0_18 - #define LCD_PINS_D4 P0_15 - - #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS P2_06 - #define DOGLCD_A0 P0_16 - #endif - -#endif // HAS_WIRED_LCD - -// -// SD Support -// -// MKS_MINI_12864 strongly prefers the SD card on the display and -// requires jumpers on the SKR V1.1 board as documented here: -// https://www.facebook.com/groups/505736576548648/permalink/630639874058317/ -#ifndef SDCARD_CONNECTION - #if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY, IS_TFTGLCD_PANEL) - #define SDCARD_CONNECTION LCD - #else - #define SDCARD_CONNECTION ONBOARD - #endif -#endif - -#if SD_CONNECTION_IS(LCD) - #define SS_PIN P1_23 -#endif - -// Trinamic driver support - -#if HAS_TRINAMIC_CONFIG - // Using TMC devices in intelligent mode requires extra connections to each device. Unfortunately - // the SKR does not have many free pins (especially if a display is in use). The SPI-based devices - // will require 3 connections (clock, mosi, miso), plus a chip select line (CS) for each driver. - // The UART-based devices require 2 pis per deriver (one of which must be interrupt capable). - // The same SPI pins can be shared with the display/SD card reader, meaning SPI-based devices are - // probably a good choice for this board. - // - // SOFTWARE_DRIVER_ENABLE is a good option. It uses SPI to control the driver enable and allows the - // hardware ENABLE pins for each driver to be repurposed as SPI chip select. To use this mode the - // driver modules will probably need to be modified, removing the pin used for the enable line from - // the module and wiring this connection directly to GND (as is the case for TMC2130). - // Using this option and sharing all of the SPI pins allows 5 TMC2130 drivers to be used along with - // a REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER without requiring the use of any extra pins. - // - // Other options will probably require the use of any free pins and the TFT serial port or a - // different type of display (like the TFT), using the pins normally used for the display and encoder. - // Unfortunately, tests show it's not possible to use endstop and thermistor pins for chip-select. - // Sample settings are provided below, but only some have been tested. - // - // Another option is to share the enable and chip-select pins when using SPI. Several users have - // reported that this works. However, it's unlikely that this configuration will allow SPI communi- - // cation with the device when the drivers are active, meaning that some of the more advanced TMC - // options may not be available. - - // When using any TMC SPI-based drivers, software SPI is used - // because pins may be shared with the display or SD card. - #define TMC_USE_SW_SPI - #define TMC_SW_MOSI P0_18 - #define TMC_SW_MISO P0_17 - // To minimize pin usage use the same clock pin as the display/SD card reader. (May generate LCD noise.) - #define TMC_SW_SCK P0_15 - // If pin 2_06 is unused, it can be used for the clock to avoid the LCD noise. - //#define TMC_SW_SCK P2_06 - - #if ENABLED(SOFTWARE_DRIVER_ENABLE) - - // Software enable allows the enable pins to be repurposed as chip-select pins. - // Note: Requires the driver modules to be modified to always be enabled with the enable pin removed. - #if AXIS_DRIVER_TYPE_X(TMC2130) - #define X_CS_PIN P4_28 - #undef X_ENABLE_PIN - #endif - - #if AXIS_DRIVER_TYPE_Y(TMC2130) - #define Y_CS_PIN P2_00 - #undef Y_ENABLE_PIN - #endif - - #if AXIS_DRIVER_TYPE_Z(TMC2130) - #define Z_CS_PIN P0_19 - #undef Z_ENABLE_PIN - #endif - - #if AXIS_DRIVER_TYPE_E0(TMC2130) - #define E0_CS_PIN P2_12 - #undef E0_ENABLE_PIN - #endif - - #if AXIS_DRIVER_TYPE_E1(TMC2130) - #define E1_CS_PIN P0_10 - #undef E1_ENABLE_PIN - #endif - - #else // !SOFTWARE_DRIVER_ENABLE - - // A chip-select pin is needed for each driver. - - // EXAMPLES - - // Example 1: No LCD attached or a TFT style display using the AUX header RX/TX pins. - // SDCARD_CONNECTION must not be 'LCD'. Nothing should be connected to EXP1/EXP2. - //#define SKR_USE_LCD_PINS_FOR_CS - #if ENABLED(SKR_USE_LCD_PINS_FOR_CS) - #if SD_CONNECTION_IS(LCD) - #error "SDCARD_CONNECTION must not be 'LCD' with SKR_USE_LCD_PINS_FOR_CS." - #endif - #define X_CS_PIN P1_23 - #define Y_CS_PIN P3_26 - #define Z_CS_PIN P2_11 - #define E0_CS_PIN P3_25 - #define E1_CS_PIN P1_31 - #endif - - // Example 2: A REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - // The SD card reader attached to the LCD (if present) can't be used because - // the pins will be in use. So SDCARD_CONNECTION must not be 'LCD'. - //#define SKR_USE_LCD_SD_CARD_PINS_FOR_CS - #if ENABLED(SKR_USE_LCD_SD_CARD_PINS_FOR_CS) - #if SD_CONNECTION_IS(LCD) - #error "SDCARD_CONNECTION must not be 'LCD' with SKR_USE_LCD_SD_CARD_PINS_FOR_CS." - #endif - #define X_CS_PIN P0_02 - #define Y_CS_PIN P0_03 - #define Z_CS_PIN P2_06 - // We use SD_DETECT_PIN for E0 - #undef SD_DETECT_PIN - #define E0_CS_PIN P1_31 - // We use LCD_SDSS pin for E1 - #undef LCD_SDSS - #define LCD_SDSS -1 - #define E1_CS_PIN P1_23 - #endif - - // Example 3: Use the driver enable pins for chip-select. - // Commands must not be sent to the drivers when enabled. So certain - // advanced features (like driver monitoring) will not be available. - //#define SKR_USE_ENABLE_CS - #if ENABLED(SKR_USE_ENABLE_FOR_CS) - #define X_CS_PIN X_ENABLE_PIN - #define Y_CS_PIN Y_ENABLE_PIN - #define Z_CS_PIN Z_ENABLE_PIN - #define E0_CS_PIN E0_ENABLE_PIN - #define E1_CS_PIN E1_ENABLE_PIN - #endif - - #endif // SOFTWARE_DRIVER_ENABLE - -#endif - -// Include common SKR pins -#include "pins_BTT_SKR_common.h" diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h deleted file mode 100644 index 31373fedff..0000000000 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ /dev/null @@ -1,384 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define BOARD_INFO_NAME "BTT SKR V1.3" - -// -// Trinamic Stallguard pins -// -#define X_DIAG_PIN P1_29 // X- -#define Y_DIAG_PIN P1_27 // Y- -#define Z_DIAG_PIN P1_25 // Z- -#define E0_DIAG_PIN P1_28 // X+ -#define E1_DIAG_PIN P1_26 // Y+ - -// -// Limit Switches -// -#ifdef X_STALL_SENSITIVITY - #define X_STOP_PIN X_DIAG_PIN - #if X_HOME_DIR < 0 - #define X_MAX_PIN P1_28 // X+ - #else - #define X_MIN_PIN P1_28 // X+ - #endif -#else - #define X_MIN_PIN P1_29 // X- - #define X_MAX_PIN P1_28 // X+ -#endif - -#ifdef Y_STALL_SENSITIVITY - #define Y_STOP_PIN Y_DIAG_PIN - #if Y_HOME_DIR < 0 - #define Y_MAX_PIN P1_26 // Y+ - #else - #define Y_MIN_PIN P1_26 // Y+ - #endif -#else - #define Y_MIN_PIN P1_27 // Y- - #define Y_MAX_PIN P1_26 // Y+ -#endif - -#ifdef Z_STALL_SENSITIVITY - #define Z_STOP_PIN Z_DIAG_PIN - #if Z_HOME_DIR < 0 - #define Z_MAX_PIN P1_24 // Z+ - #else - #define Z_MIN_PIN P1_24 // Z+ - #endif -#else - #define Z_MIN_PIN P1_25 // Z- - #define Z_MAX_PIN P1_24 // Z+ -#endif - -#define ONBOARD_ENDSTOPPULLUPS // Board has built-in pullups - -// -// Servos -// -#ifndef SERVO0_PIN - #define SERVO0_PIN P2_00 -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN P1_24 -#endif - -// -// Filament Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN P1_28 -#endif - -// -// Steppers -// -#define X_STEP_PIN P2_02 -#define X_DIR_PIN P2_06 -#define X_ENABLE_PIN P2_01 -#ifndef X_CS_PIN - #define X_CS_PIN P1_17 -#endif - -#define Y_STEP_PIN P0_19 -#define Y_DIR_PIN P0_20 -#define Y_ENABLE_PIN P2_08 -#ifndef Y_CS_PIN - #define Y_CS_PIN P1_15 -#endif - -#define Z_STEP_PIN P0_22 -#define Z_DIR_PIN P2_11 -#define Z_ENABLE_PIN P0_21 -#ifndef Z_CS_PIN - #define Z_CS_PIN P1_10 -#endif - -#define E0_STEP_PIN P2_13 -#define E0_DIR_PIN P0_11 -#define E0_ENABLE_PIN P2_12 -#ifndef E0_CS_PIN - #define E0_CS_PIN P1_08 -#endif - -#ifndef E1_CS_PIN - #define E1_CS_PIN P1_01 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P4_28 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P0_05 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P0_04 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - #define X_SERIAL_TX_PIN P4_29 - #define X_SERIAL_RX_PIN P1_17 - - #define Y_SERIAL_TX_PIN P1_16 - #define Y_SERIAL_RX_PIN P1_15 - - #define Z_SERIAL_TX_PIN P1_14 - #define Z_SERIAL_RX_PIN P1_10 - - #define E0_SERIAL_TX_PIN P1_09 - #define E0_SERIAL_RX_PIN P1_08 - - #define E1_SERIAL_TX_PIN P1_04 - #define E1_SERIAL_RX_PIN P1_01 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -/** - * _____ _____ - * NC | 1 2 | GND 5V | 1 2 | GND - * RESET | 3 4 | 1.31 (SD_DETECT) (LCD_D7) 1.23 | 3 4 | 1.22 (LCD_D6) - * (MOSI) 0.18 | 5 6 3.25 (BTN_EN2) (LCD_D5) 1.21 | 5 6 1.20 (LCD_D4) - * (SD_SS) 0.16 | 7 8 | 3.26 (BTN_EN1) (LCD_RS) 1.19 | 7 8 | 1.18 (LCD_EN) - * (SCK) 0.15 | 9 10| 0.17 (MISO) (BTN_ENC) 0.28 | 9 10| 1.30 (BEEPER) - * ----- ----- - * EXP2 EXP1 - */ - -#define EXPA1_03_PIN P1_23 -#define EXPA1_04_PIN P1_22 -#define EXPA1_05_PIN P1_21 -#define EXPA1_06_PIN P1_20 -#define EXPA1_07_PIN P1_19 -#define EXPA1_08_PIN P1_18 -#define EXPA1_09_PIN P0_28 -#define EXPA1_10_PIN P1_30 - -#define EXPA2_03_PIN -1 -#define EXPA2_04_PIN P1_31 -#define EXPA2_05_PIN P0_18 -#define EXPA2_06_PIN P3_25 -#define EXPA2_07_PIN P0_16 -#define EXPA2_08_PIN P3_26 -#define EXPA2_09_PIN P0_15 -#define EXPA2_10_PIN P0_17 - -#if HAS_WIRED_LCD - - #if ENABLED(ANET_FULL_GRAPHICS_LCD) - - #error "CAUTION! ANET_FULL_GRAPHICS_LCD requires wiring modifications. See 'pins_BTT_SKR_V1_3.h' for details. Comment out this line to continue." - - /** - * 1. Cut the tab off the LCD connector so it can be plugged into the "EXP1" connector the other way. - * 2. Swap the LCD's +5V (Pin2) and GND (Pin1) wires. (This is the critical part!) - * 3. Rewire the CLK Signal (LCD Pin9) to LCD Pin7. (LCD Pin9 remains open because this pin is open drain.) - * 4. A wire is needed to connect the Reset switch at J3 (LCD Pin7) to EXP2 (Pin3) on the board. - * - * !!! If you are unsure, ask for help! Your motherboard may be damaged in some circumstances !!! - * - * The ANET_FULL_GRAPHICS_LCD connector plug: - * - * BEFORE AFTER - * _____ _____ - * GND 1 | 1 2 | 2 5V 5V 1 | 1 2 | 2 GND - * CS 3 | 3 4 | 4 BTN_EN2 CS 3 | 3 4 | 4 BTN_EN2 - * SID 5 | 5 6 6 BTN_EN1 SID 5 | 5 6 6 BTN_EN1 - * open 7 | 7 8 | 8 BTN_ENC CLK 7 | 7 8 | 8 BTN_ENC - * CLK 9 | 9 10| 10 Beeper open 9 | 9 10| 10 Beeper - * ----- ----- - * LCD LCD - */ - - #define LCD_PINS_RS EXPA1_03_PIN - - #define BTN_EN1 EXPA1_06_PIN - #define BTN_EN2 EXPA1_04_PIN - #define BTN_ENC EXPA1_08_PIN - - #define LCD_PINS_ENABLE EXPA1_05_PIN - #define LCD_PINS_D4 EXPA1_07_PIN - - #elif ENABLED(CR10_STOCKDISPLAY) - - #define LCD_PINS_RS EXPA1_04_PIN - - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN // (58) open-drain - - #define LCD_PINS_ENABLE EXPA1_03_PIN - #define LCD_PINS_D4 EXPA1_05_PIN - - #elif HAS_ADC_BUTTONS - - #error "ADC BUTTONS do not work unmodifed on SKR 1.3, The ADC ports cannot take more than 3.3v." - - #elif IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS EXPA2_08_PIN - #endif - - #define SD_DETECT_PIN EXPA2_04_PIN - - #else // !CR10_STOCKDISPLAY - - #define LCD_PINS_RS EXPA1_07_PIN - - #define BTN_EN1 EXPA2_08_PIN // (31) J3-2 & AUX-4 - #define BTN_EN2 EXPA2_06_PIN // (33) J3-4 & AUX-4 - #define BTN_ENC EXPA1_09_PIN // (58) open-drain - - #define LCD_PINS_ENABLE EXPA1_08_PIN - #define LCD_PINS_D4 EXPA1_06_PIN - - #define LCD_SDSS EXPA2_07_PIN // (16) J3-7 & AUX-4 - #define SD_DETECT_PIN EXPA2_04_PIN // (49) (NOT 5V tolerant) - - #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS EXPA1_08_PIN - #define DOGLCD_A0 EXPA1_07_PIN - #define DOGLCD_SCK EXPA2_09_PIN - #define DOGLCD_MOSI EXPA2_05_PIN - - #define LCD_BACKLIGHT_PIN -1 - - #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN EXPA1_06_PIN // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN EXPA1_05_PIN - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN EXPA1_04_PIN - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN EXPA1_03_PIN - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN EXPA1_05_PIN - #endif - - #else // !FYSETC_MINI_12864 - - #if ENABLED(MKS_MINI_12864) - - #define DOGLCD_CS EXPA1_05_PIN - #define DOGLCD_A0 EXPA1_04_PIN - #define DOGLCD_SCK EXPA2_09_PIN - #define DOGLCD_MOSI EXPA2_05_PIN - - #elif ENABLED(ENDER2_STOCKDISPLAY) - - /** - * Creality Ender-2 display pinout - * _____ - * 5V | 1 2 | GND - * (MOSI) P1_23 | 3 4 | P1_22 (LCD_CS) - * (LCD_A0) P1_21 | 5 6 P1_20 (BTN_EN2) - * RESET P1_19 | 7 8 | P1_18 (BTN_EN1) - * (BTN_ENC) P0_28 | 9 10| P1_30 (SCK) - * ----- - * EXP1 - */ - - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN - #define DOGLCD_CS EXPA1_04_PIN - #define DOGLCD_A0 EXPA1_05_PIN - #define DOGLCD_SCK EXPA1_10_PIN - #define DOGLCD_MOSI EXPA1_03_PIN - #define FORCE_SOFT_SPI - #define LCD_BACKLIGHT_PIN -1 - #endif - - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 EXPA1_05_PIN - #define LCD_PINS_D6 EXPA1_04_PIN - #define LCD_PINS_D7 EXPA1_03_PIN - #endif - - #endif // !FYSETC_MINI_12864 - - #endif // !CR10_STOCKDISPLAY - -#endif // HAS_WIRED_LCD - -// -// SD Support -// - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION LCD -#endif - -#if SD_CONNECTION_IS(LCD) - #define SS_PIN EXPA2_07_PIN -#endif - -/** - * Special pins - * P1_30 (37) (NOT 5V tolerant) - * P1_31 (49) (NOT 5V tolerant) - * P0_27 (57) (Open collector) - * P0_28 (58) (Open collector) - */ - -// Include common SKR pins -#include "pins_BTT_SKR_common.h" diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h deleted file mode 100644 index 4686e984b0..0000000000 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ /dev/null @@ -1,435 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "BTT SKR V1.4" -#endif - -#ifndef BOARD_CUSTOM_BUILD_FLAGS - #define BOARD_CUSTOM_BUILD_FLAGS -DLPC_PINCFG_UART3_P4_28 -#endif - -// -// SD Connection -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION LCD -#endif - -// -// Servos -// -#define SERVO0_PIN P2_00 - -// -// TMC StallGuard DIAG pins -// -#define X_DIAG_PIN P1_29 // X-STOP -#define Y_DIAG_PIN P1_28 // Y-STOP -#define Z_DIAG_PIN P1_27 // Z-STOP -#define E0_DIAG_PIN P1_26 // E0DET -#define E1_DIAG_PIN P1_25 // E1DET - -// -// Limit Switches -// -#ifdef X_STALL_SENSITIVITY - #define X_STOP_PIN X_DIAG_PIN - #if X_HOME_DIR < 0 - #define X_MAX_PIN P1_26 // E0DET - #else - #define X_MIN_PIN P1_26 // E0DET - #endif -#else - #define X_STOP_PIN P1_29 // X-STOP -#endif - -#ifdef Y_STALL_SENSITIVITY - #define Y_STOP_PIN Y_DIAG_PIN - #if Y_HOME_DIR < 0 - #define Y_MAX_PIN P1_25 // E1DET - #else - #define Y_MIN_PIN P1_25 // E1DET - #endif -#else - #define Y_STOP_PIN P1_28 // Y-STOP -#endif - -#ifdef Z_STALL_SENSITIVITY - #define Z_STOP_PIN Z_DIAG_PIN - #if Z_HOME_DIR < 0 - #define Z_MAX_PIN P1_00 // PWRDET - #else - #define Z_MIN_PIN P1_00 // PWRDET - #endif -#else - #ifndef Z_STOP_PIN - #define Z_STOP_PIN P1_27 // Z-STOP - #endif -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN P0_10 -#endif - -// -// Filament Runout Sensor -// -#define FIL_RUNOUT_PIN P1_26 // E0DET -#define FIL_RUNOUT2_PIN P1_25 // E1DET - -// -// Power Supply Control -// -#ifndef PS_ON_PIN - #define PS_ON_PIN P1_00 // PWRDET -#endif - -// -// Power Loss Detection -// -#ifndef POWER_LOSS_PIN - #define POWER_LOSS_PIN P1_00 // PWRDET -#endif - -// -// Steppers -// -#define X_STEP_PIN P2_02 -#define X_DIR_PIN P2_06 -#define X_ENABLE_PIN P2_01 -#ifndef X_CS_PIN - #define X_CS_PIN P1_10 -#endif - -#define Y_STEP_PIN P0_19 -#define Y_DIR_PIN P0_20 -#define Y_ENABLE_PIN P2_08 -#ifndef Y_CS_PIN - #define Y_CS_PIN P1_09 -#endif - -#define Z_STEP_PIN P0_22 -#define Z_DIR_PIN P2_11 -#define Z_ENABLE_PIN P0_21 -#ifndef Z_CS_PIN - #define Z_CS_PIN P1_08 -#endif - -#define E0_STEP_PIN P2_13 -#define E0_DIR_PIN P0_11 -#define E0_ENABLE_PIN P2_12 -#ifndef E0_CS_PIN - #define E0_CS_PIN P1_04 -#endif - -#define E1_STEP_PIN P1_15 -#define E1_DIR_PIN P1_14 -#define E1_ENABLE_PIN P1_16 -#ifndef E1_CS_PIN - #define E1_CS_PIN P1_01 -#endif - -#define TEMP_1_PIN P0_23_A0 // A0 (T0) - (67) - TEMP_1_PIN -#define TEMP_BED_PIN P0_25_A2 // A2 (T2) - (69) - TEMP_BED_PIN - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P1_17 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P0_05 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P0_04 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - #define X_SERIAL_TX_PIN P1_10 - #define X_SERIAL_RX_PIN P1_10 - - #define Y_SERIAL_TX_PIN P1_09 - #define Y_SERIAL_RX_PIN P1_09 - - #define Z_SERIAL_TX_PIN P1_08 - #define Z_SERIAL_RX_PIN P1_08 - - #define E0_SERIAL_TX_PIN P1_04 - #define E0_SERIAL_RX_PIN P1_04 - - #define E1_SERIAL_TX_PIN P1_01 - #define E1_SERIAL_RX_PIN P1_01 - - #define Z2_SERIAL_TX_PIN P1_01 - #define Z2_SERIAL_RX_PIN P1_01 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// -// SD Connection -// -#if SD_CONNECTION_IS(LCD) - #define SS_PIN P0_16 -#endif - -/** - * _____ _____ - * NC | · · | GND 5V | · · | GND - * RESET | · · | 1.31 (SD_DETECT) (LCD_D7) 1.23 | · · | 1.22 (LCD_D6) - * (MOSI) 0.18 | · · | 3.25 (BTN_EN2) (LCD_D5) 1.21 | · · | 1.20 (LCD_D4) - * (SD_SS) 0.16 | · · | 3.26 (BTN_EN1) (LCD_RS) 1.19 | · · | 1.18 (LCD_EN) - * (SCK) 0.15 | · · | 0.17 (MISO) (BTN_ENC) 0.28 | · · | 1.30 (BEEPER) - * ----- ----- - * EXP2 EXP1 - */ -#if HAS_WIRED_LCD - #if ENABLED(ANET_FULL_GRAPHICS_LCD) - - #define LCD_PINS_RS P1_23 - - #define BTN_EN1 P1_20 - #define BTN_EN2 P1_22 - #define BTN_ENC P1_18 - - #define LCD_PINS_ENABLE P1_21 - #define LCD_PINS_D4 P1_19 - - #elif ENABLED(CR10_STOCKDISPLAY) - #define BTN_ENC P0_28 // (58) open-drain - #define LCD_PINS_RS P1_22 - - #define BTN_EN1 P1_18 - #define BTN_EN2 P1_20 - - #define LCD_PINS_ENABLE P1_23 - #define LCD_PINS_D4 P1_21 - - #elif ENABLED(ENDER2_STOCKDISPLAY) - - /** Creality Ender-2 display pinout - * _____ - * 5V | 1 2 | GND - * (MOSI) 1.23 | 3 4 | 1.22 (LCD_RS) - * (LCD_A0) 1.21 | 5 6 | 1.20 (BTN_EN2) - * RESET 1.19 | 7 8 | 1.18 (BTN_EN1) - * (BTN_ENC) 0.28 | 9 10| 1.30 (SCK) - * ----- - * EXP1 - */ - - #define BTN_EN1 P1_18 - #define BTN_EN2 P1_20 - #define BTN_ENC P0_28 - - #define DOGLCD_CS P1_22 - #define DOGLCD_A0 P1_21 - #define DOGLCD_SCK P1_30 - #define DOGLCD_MOSI P1_23 - #define FORCE_SOFT_SPI - #define LCD_BACKLIGHT_PIN -1 - - #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI - #define TFT_CS_PIN P1_22 - #define TFT_A0_PIN P1_23 - #define TFT_DC_PIN P1_23 - #define TFT_MISO_PIN P0_17 - #define TFT_BACKLIGHT_PIN P1_18 - #define TFT_RESET_PIN P1_19 - - #define LCD_USE_DMA_SPI - - #define TOUCH_INT_PIN P1_21 - #define TOUCH_CS_PIN P1_20 - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - - #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 - #endif - // SPI 1 - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 - - // Disable any LCD related PINs config - #define LCD_PINS_ENABLE -1 - #define LCD_PINS_RS -1 - - // XPT2046 Touch Screen calibration - #if ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11245 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8629 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 685 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -285 - #endif - #elif ENABLED(TFT_480x320_SPI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17232 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11196 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 1047 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -358 - #endif - - #define TFT_BUFFER_SIZE 2400 - #endif - - #elif IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS P3_26 - #endif - - #define SD_DETECT_PIN P1_31 - - #else - - #define BTN_ENC P0_28 // (58) open-drain - #define LCD_PINS_RS P1_19 - - #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 - #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 - - #define LCD_PINS_ENABLE P1_18 - #define LCD_PINS_D4 P1_20 - - #define LCD_SDSS P0_16 // (16) J3-7 & AUX-4 - - #if SD_CONNECTION_IS(LCD) - #define SD_DETECT_PIN P1_31 // (49) (NOT 5V tolerant) - #endif - - #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS P1_18 - #define DOGLCD_A0 P1_19 - #define DOGLCD_SCK P0_15 - #define DOGLCD_MOSI P0_18 - - #define LCD_BACKLIGHT_PIN -1 - - #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN P1_20 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN P1_21 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN P1_22 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN P1_23 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN P1_21 - #endif - - #else // !FYSETC_MINI_12864 - - #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS P1_21 - #define DOGLCD_A0 P1_22 - #define DOGLCD_SCK P0_15 - #define DOGLCD_MOSI P0_18 - #define FORCE_SOFT_SPI - #endif - - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 P1_21 - #define LCD_PINS_D6 P1_22 - #define LCD_PINS_D7 P1_23 - #endif - - #endif // !FYSETC_MINI_12864 - - #endif // HAS_MARLINUI_U8GLIB - -#endif // HAS_WIRED_LCD - -#if HAS_ADC_BUTTONS - #error "ADC BUTTONS do not work unmodifed on SKR 1.4, The ADC ports cannot take more than 3.3v." -#endif - -// -// NeoPixel LED -// -#ifndef NEOPIXEL_PIN - #define NEOPIXEL_PIN P1_24 -#endif - -/** - * Special pins - * P1_30 (37) (NOT 5V tolerant) - * P1_31 (49) (NOT 5V tolerant) - * P0_27 (57) (Open collector) - * P0_28 (58) (Open collector) - */ - -// -// Include common SKR pins -// -#include "pins_BTT_SKR_common.h" diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h deleted file mode 100644 index 820c35a01c..0000000000 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifdef SKR_HAS_LPC1769 - #if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." - #endif -#elif NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Steppers -// -#ifndef E1_STEP_PIN - #define E1_STEP_PIN P0_01 -#endif -#ifndef E1_DIR_PIN - #define E1_DIR_PIN P0_00 -#endif -#ifndef E1_ENABLE_PIN - #define E1_ENABLE_PIN P0_10 -#endif - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#ifndef TEMP_0_PIN - #define TEMP_0_PIN P0_24_A1 // A1 (T1) - (68) - TEMP_0_PIN -#endif -#ifndef TEMP_1_PIN - #define TEMP_1_PIN P0_25_A2 // A2 (T2) - (69) - TEMP_1_PIN -#endif -#ifndef TEMP_BED_PIN - #define TEMP_BED_PIN P0_23_A0 // A0 (T0) - (67) - TEMP_BED_PIN -#endif - -#if HOTENDS == 1 - #if TEMP_SENSOR_PROBE - #define TEMP_PROBE_PIN TEMP_1_PIN - #elif TEMP_SENSOR_CHAMBER - #define TEMP_CHAMBER_PIN TEMP_1_PIN - #endif -#endif - -// -// Heaters / Fans -// -#ifndef HEATER_0_PIN - #define HEATER_0_PIN P2_07 -#endif -#if HOTENDS == 1 - #ifndef FAN1_PIN - #define FAN1_PIN P2_04 - #endif -#else - #ifndef HEATER_1_PIN - #define HEATER_1_PIN P2_04 - #endif -#endif -#ifndef FAN_PIN - #define FAN_PIN P2_03 -#endif -#ifndef HEATER_BED_PIN - #define HEATER_BED_PIN P2_05 -#endif - -// -// LCD / Controller -// -#if HAS_WIRED_LCD && DISABLED(LCD_USE_I2C_BUZZER) - #define BEEPER_PIN P1_30 // (37) not 5V tolerant -#endif - -// -// SD Support -// -#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card - -#if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 -#elif SD_CONNECTION_IS(ONBOARD) - #undef SD_DETECT_PIN - #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "No custom SD drive cable defined for this board." -#endif diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h deleted file mode 100644 index 5132081a55..0000000000 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "GMARSH X6 REV1" - -// Ignore temp readings during develpment. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Enable 12MHz clock output on P1.27 pin to sync TMC2208 chip clocks -// -#define LPC1768_ENABLE_CLKOUT_12M - -// -// Servos -// -#define SERVO0_PIN P1_26 // PWM1[6] -#define SERVO1_PIN P1_18 // PWM1[1] - -// -// Limit Switches -// -#define X_MIN_PIN P0_00 -#define X_MAX_PIN P0_01 -#define Y_MIN_PIN P0_10 -#define Y_MAX_PIN P0_21 -#define Z_MIN_PIN P2_13 -#define Z_MAX_PIN P2_22 - -// -// Steppers -// - -#define X_STEP_PIN P1_01 -#define X_DIR_PIN P1_04 -#define X_ENABLE_PIN P0_26 - -#define Y_STEP_PIN P1_10 -#define Y_DIR_PIN P1_14 -#define Y_ENABLE_PIN P1_08 - -#define Z_STEP_PIN P1_17 -#define Z_DIR_PIN P4_29 -#define Z_ENABLE_PIN P1_15 - -#define E0_STEP_PIN P0_05 -#define E0_DIR_PIN P2_00 -#define E0_ENABLE_PIN P4_28 - -#define E1_STEP_PIN P2_03 -#define E1_DIR_PIN P2_04 -#define E1_ENABLE_PIN P2_01 - -#define E2_STEP_PIN P2_07 -#define E2_DIR_PIN P2_08 -#define E2_ENABLE_PIN P2_05 - -// -// TMC2208 UART pins -// -#if HAS_TMC_UART - #define X_SERIAL_TX_PIN P1_00 - #define X_SERIAL_RX_PIN P1_00 - #define Y_SERIAL_TX_PIN P1_09 - #define Y_SERIAL_RX_PIN P1_09 - #define Z_SERIAL_TX_PIN P1_16 - #define Z_SERIAL_RX_PIN P1_16 - #define E0_SERIAL_TX_PIN P0_04 - #define E0_SERIAL_RX_PIN P0_04 - #define E1_SERIAL_TX_PIN P2_02 - #define E1_SERIAL_RX_PIN P2_02 - #define E2_SERIAL_TX_PIN P2_06 - #define E2_SERIAL_RX_PIN P2_06 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#else - #error "TMC2208 UART configuration is required for GMarsh X6." -#endif - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_24_A1 // AD0[0] on P0_23 -#define TEMP_BED_PIN P0_23_A0 // AD0[1] on P0_24 - -// -// Heaters / Fans -// -#define HEATER_BED_PIN P1_19 // Not a PWM pin, software PWM required -#define HEATER_0_PIN P3_26 // PWM1[3] -#define FAN_PIN P3_25 // Part cooling fan - connected to PWM1[2] -#define E0_AUTO_FAN_PIN P0_27 // Extruder cooling fan - -// -// Misc. Functions -// -#define LED_PIN P1_31 - -// -// LCD -// -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BEEPER_PIN P0_19 - #define BTN_EN1 P1_23 - #define BTN_EN2 P1_24 - #define BTN_ENC P1_25 - #define LCD_PINS_RS P0_20 - #define LCD_PINS_ENABLE P0_21 - #define LCD_PINS_D4 P2_11 - #define LCD_PINS_D5 P0_22 - #define LCD_PINS_D6 P1_29 - #define LCD_PINS_D7 P1_28 -#endif - -// -// SD Support -// - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION LCD -#endif - -#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card - -#if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 - #define SS_PIN P0_16 -#elif SD_CONNECTION_IS(ONBOARD) - #undef SD_DETECT_PIN - #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN -#endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h deleted file mode 100644 index 6c6a9ea306..0000000000 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ /dev/null @@ -1,389 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS SBASE pin assignments - */ - -#if defined(MKS_HAS_LPC1769) && NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#elif NOT_TARGET(MKS_HAS_LPC1769, MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "MKS SBASE" -#endif -#ifndef BOARD_WEBSITE_URL - #define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SBASE" -#endif - -#define LED_PIN P1_18 // Used as a status indicator -#define LED2_PIN P1_19 -#define LED3_PIN P1_20 -#define LED4_PIN P1_21 - -// -// Servos -// -#define SERVO0_PIN P1_23 // J8-3 (low jitter) -#define SERVO1_PIN P2_12 // J8-4 -#define SERVO2_PIN P2_11 // J8-5 -#define SERVO3_PIN P4_28 // J8-6 - -// -// Limit Switches - Not Interrupt Capable -// -#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series -#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series -#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series -#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series -#define Z_MIN_PIN P1_28 // The original Mks Sbase DIO19 has a 10k pullup to 3.3V or 5V, 1K series, so when using a Zprobe we must use DIO41 (J8 P1.22) -#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series - -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN P4_28 // Connector J8 -#endif - -// -// Steppers -// -#define X_STEP_PIN P2_00 -#define X_DIR_PIN P0_05 -#define X_ENABLE_PIN P0_04 - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P0_11 -#define Y_ENABLE_PIN P0_10 - -#define Z_STEP_PIN P2_02 -#define Z_DIR_PIN P0_20 -#define Z_ENABLE_PIN P0_19 - -#define E0_STEP_PIN P2_03 -#define E0_DIR_PIN P0_22 -#define E0_ENABLE_PIN P0_21 - -#define E1_STEP_PIN P2_08 -#define E1_DIR_PIN P2_13 -#define E1_ENABLE_PIN P4_29 - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_BED_PIN P0_23_A0 // A0 (TH1) -#define TEMP_0_PIN P0_24_A1 // A1 (TH2) -#define TEMP_1_PIN P0_25_A2 // A2 (TH3) -#define TEMP_2_PIN P0_26_A3 // A3 (TH4) - -// -// Heaters / Fans -// -#define HEATER_BED_PIN P2_05 -#define HEATER_0_PIN P2_07 -#define HEATER_1_PIN P2_06 -#ifndef FAN_PIN - #define FAN_PIN P2_04 -#endif - -// -// Connector J7 -// Note: These pins are all digitally shared with the EXP1/EXP2 Connector. -// Using them with an LCD connected or configured will lead to hangs & crashes. -// - -// 5V -// NC -// GND -#define PIN_P0_17 P0_17 -#define PIN_P0_16 P0_16 -#define PIN_P0_15 P0_15 - -// -// Connector J8 -// - -// GND -#define PIN_P1_22 P1_22 -#define PIN_P1_23 P1_23 // PWM Capable -#define PIN_P2_12 P2_12 // Interrupt Capable -#define PIN_P2_11 P2_11 // Interrupt Capable - -// -// Průša i3 MK2 Multi Material Multiplexer Support -// -#if ENABLED(MK2_MULTIPLEXER) - #define E_MUX0_PIN P1_23 // J8-3 - #define E_MUX1_PIN P2_12 // J8-4 - #define E_MUX2_PIN P2_11 // J8-5 -#endif - -// -// Misc. Functions -// -#define PS_ON_PIN P0_25 // TH3 Connector - -// -// Ethernet pins -// -#ifndef ULTIPANEL - #define ENET_MDIO P1_17 // J12-4 - #define ENET_RX_ER P1_14 // J12-6 - #define ENET_RXD1 P1_10 // J12-8 -#endif - -#define ENET_MOC P1_16 // J12-3 -#define REF_CLK P1_15 // J12-5 -#define ENET_RXD0 P1_09 // J12-7 -#define ENET_CRS P1_08 // J12-9 -#define ENET_TX_EN P1_04 // J12-10 -#define ENET_TXD0 P1_00 // J12-11 -#define ENET_TXD1 P1_01 // J12-12 - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card - -#if SD_CONNECTION_IS(CUSTOM_CABLE) - - /** - * A custom cable is needed. See the README file in the - * Marlin\src\config\examples\Mks\Sbase directory - * P0.27 is on EXP2 and the on-board SD card's socket. That means it can't be - * used as the SD_DETECT for the LCD's SD card. - * - * The best solution is to use the custom cable to connect the LCD's SD_DETECT - * to a pin NOT on EXP2. - * - * If you can't find a pin to use for the LCD's SD_DETECT then comment out - * SD_DETECT_PIN entirely and remove that wire from the the custom cable. - */ - #define SD_DETECT_PIN P2_11 // J8-5 (moved from EXP2 P0.27) - #define SCK_PIN P1_22 // J8-2 (moved from EXP2 P0.7) - #define MISO_PIN P1_23 // J8-3 (moved from EXP2 P0.8) - #define MOSI_PIN P2_12 // J8-4 (moved from EXP2 P0.9) - #define SS_PIN P0_28 - #define LPC_SOFTWARE_SPI // With a custom cable we need software SPI because the - // selected pins are not on a hardware SPI controller -#elif SD_CONNECTION_IS(LCD) - // use standard cable and header, SPI and SD detect sre shared with on-board SD card - // hardware SPI is used for both SD cards. The detect pin is shred between the - // LCD and onboard SD readers so we disable it. - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN P0_28 -#elif SD_CONNECTION_IS(ONBOARD) - #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN -#endif - -/** - * Smart LCD adapter - * - * The Smart LCD adapter can be used for the two 10 pin LCD controllers such as - * REPRAP_DISCOUNT_SMART_CONTROLLER. It can't be used for controllers that use - * DOGLCD_A0, DOGLCD_CS, LCD_PINS_D5, LCD_PINS_D6 or LCD_PINS_D7. A custom cable - * is needed to pick up 5V for the EXP1 connection. - * - * SD card on the LCD uses the same SPI signals as the LCD. This results in garbage/lines - * on the LCD display during accesses of the SD card. The menus/code has been arranged so - * that the garbage/lines are erased immediately after the SD card accesses are completed. - */ - -#if IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS P3_25 // EXP2.3 - #endif - - #if SD_CONNECTION_IS(LCD) - #define SD_DETECT_PIN P0_28 // EXP2.4 - #endif - -#elif HAS_WIRED_LCD - - #define BEEPER_PIN P1_31 // EXP1.1 - #define BTN_ENC P1_30 // EXP1.2 - #define BTN_EN1 P3_26 // EXP2.5 - #define BTN_EN2 P3_25 // EXP2.3 - #define LCD_PINS_RS P0_16 // EXP1.4 - #define LCD_SDSS P0_28 // EXP2.4 - #define LCD_PINS_ENABLE P0_18 // EXP1.3 - #define LCD_PINS_D4 P0_15 // EXP1.5 - #if ANY(VIKI2, miniVIKI) - #define DOGLCD_SCK SCK_PIN - #define DOGLCD_MOSI MOSI_PIN - #endif - - #if ENABLED(FYSETC_MINI_12864) - /** - * The FYSETC display can NOT use the SCK and MOSI pins on EXP2, so a - * special cable is needed to go between EXP2 on the FYSETC and the - * controller board's EXP2 and J8. It also means that a software SPI - * is needed to drive those pins. - * - * The FYSETC requires mode 3 SPI interface. - * - * Pins 6, 7 & 8 on EXP2 are no connects. That means a second special - * cable will be needed if the RGB LEDs are to be active. - */ - #define DOGLCD_CS LCD_PINS_ENABLE // EXP1.3 (LCD_EN on FYSETC schematic) - #define DOGLCD_A0 LCD_PINS_RS // EXP1.4 (LCD_A0 on FYSETC schematic) - #define DOGLCD_SCK P2_11 // J8-5 (SCK on FYSETC schematic) - #define DOGLCD_MOSI P4_28 // J8-6 (MOSI on FYSETC schematic) - - //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN P2_12 // J8-4 (LCD_D6 on FYSETC schematic) - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN P1_23 // J8-3 (LCD_D5 on FYSETC schematic) - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN P1_22 // J8-2 (LCD_D7 on FYSETC schematic) - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN P2_12 - #endif - - #elif ENABLED(MINIPANEL) - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - #endif - -#endif // HAS_WIRED_LCD - -/** - * Example for trinamic drivers using the J8 connector on MKs Sbase. - * 2130s need 1 pin for each driver. 2208/2209s need 2 pins for serial control. - * This board does not have enough pins to use hardware serial. - */ - -#if HAS_DRIVER(TMC2130) - // J8 - #define X_CS_PIN P1_22 - #define Y_CS_PIN P1_23 - #define Z_CS_PIN P2_12 - #define E0_CS_PIN P2_11 - #define E1_CS_PIN P4_28 - - // Hardware SPI is on EXP2. See if you can make it work: - // https://github.com/makerbase-mks/MKS-SBASE/issues/25 - #define TMC_USE_SW_SPI - #if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P0_03 // AUX1 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P0_02 // AUX1 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P0_26 // TH4 - #endif - #endif - -#endif - -#if MB(MKS_SBASE) && HAS_TMC_UART - - /** - * TMC2208/TMC2209 stepper drivers - * - * The shortage of pins becomes apparent. - * Worst case you may have to give up the LCD - * RX pins need to be interrupt capable - */ - #define X_SERIAL_TX_PIN P1_22 // J8-2 - #define X_SERIAL_RX_PIN P2_12 // J8-4 Interrupt Capable - #define Y_SERIAL_TX_PIN P1_23 // J8-3 - #define Y_SERIAL_RX_PIN P2_11 // J8-5 Interrupt Capable - #define Z_SERIAL_TX_PIN P2_12 // J8-4 - #define Z_SERIAL_RX_PIN P0_25 // TH3 - #define E0_SERIAL_TX_PIN P4_28 // J8-6 - #define E0_SERIAL_RX_PIN P0_26 // TH4 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// UNUSED -#define PIN_P0_27 P0_27 // EXP2/Onboard SD -#define PIN_P0_28 P0_28 // EXP2 -#define PIN_P0_02 P0_02 // AUX1 (Interrupt Capable/ADC/Serial Port 0) -#define PIN_P0_03 P0_03 // AUX1 (Interrupt Capable/ADC/Serial Port 0) - -/** - * PWMs - * - * There are 6 PWMs. Each PWM can be assigned to one of two pins. - * - * SERVO2 does NOT have a PWM assigned to it. - * - * PWM1.1 P1_18 SERVO3_PIN FIL_RUNOUT_PIN 5V output, PWM - * PWM1.1 P2_00 E0_STEP_PIN - * PWM1.2 P1_20 SERVO0_PIN - * PWM1.2 P2_01 X_STEP_PIN - * PWM1.3 P1_21 SERVO1_PIN J5-1 - * PWM1.3 P2_02 Y_STEP_PIN - * PWM1.4 P1_23 SDSS(SSEL0) J3-5 AUX-3 - * PWM1.4 P2_03 Z_STEP_PIN - * PWM1.5 P1_24 X_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES - * PWM1.5 P2_04 RAMPS_D9_PIN - * PWM1.6 P1_26 Y_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES - * PWM1.6 P2_05 RAMPS_D10_PIN - */ - -/** - * Special pins - * P1_30 - not 5V tolerant - EXP1 - * P1_31 - not 5V tolerant - EXP1 - * P0_27 - open collector - EXP2 - * P0_28 - open collector - EXP2 - */ - -/** - * Serial Ports - * P0_00 - Port 3 - * P0_01 - SD Card (Onboard) - * P0_10 - Port 2 - * P0_11 - Y_EN/Y_DIR - * P0_15 - Port 1 - * P0_16 - EXP1 - * P0_02 - Port 0 - * P0_03 - AUX1 - * P0_29 - Port -1 - * P0_30 - USB - */ diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h deleted file mode 100644 index d269ecbdc9..0000000000 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ /dev/null @@ -1,361 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS SGEN-L pin assignments - */ - -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "MKS SGen-L" -#define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SGEN_L" - -// -// Servos -// -#define SERVO0_PIN P1_23 // SERVO P1.23 -#define SERVO1_PIN P2_00 // SERVO P2.0 - -// -// Trinamic Stallguard pins -// -#define X_DIAG_PIN P1_29 // X- -#define Y_DIAG_PIN P1_27 // Y- -#define Z_DIAG_PIN P1_25 // Z- -#define E0_DIAG_PIN P1_28 // X+ -#define E1_DIAG_PIN P1_26 // Y+ - -// -// Limit Switches -// -#ifdef X_STALL_SENSITIVITY - #define X_STOP_PIN X_DIAG_PIN - #if X_HOME_DIR < 0 - #define X_MAX_PIN P1_28 // X+ - #else - #define X_MIN_PIN P1_28 // X+ - #endif -#else - #define X_MIN_PIN P1_29 // X- - #define X_MAX_PIN P1_28 // X+ -#endif - -#ifdef Y_STALL_SENSITIVITY - #define Y_STOP_PIN Y_DIAG_PIN - #if Y_HOME_DIR < 0 - #define Y_MAX_PIN P1_26 // Y+ - #else - #define Y_MIN_PIN P1_26 // Y+ - #endif -#else - #define Y_MIN_PIN P1_27 // Y- - #define Y_MAX_PIN P1_26 // Y+ -#endif - -#ifdef Z_STALL_SENSITIVITY - #define Z_STOP_PIN Z_DIAG_PIN - #if Z_HOME_DIR < 0 - #define Z_MAX_PIN P1_24 // Z+ - #else - #define Z_MIN_PIN P1_24 // Z+ - #endif -#else - #define Z_MIN_PIN P1_25 // Z- - #define Z_MAX_PIN P1_24 // Z+ -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN P1_24 -#endif - -// -// Steppers -// -#define X_STEP_PIN P2_02 -#define X_DIR_PIN P2_03 -#define X_ENABLE_PIN P2_01 -#ifndef X_CS_PIN - #define X_CS_PIN P1_01 -#endif - -#define Y_STEP_PIN P0_19 -#define Y_DIR_PIN P0_20 -#define Y_ENABLE_PIN P2_08 -#ifndef Y_CS_PIN - #define Y_CS_PIN P1_08 -#endif - -#define Z_STEP_PIN P0_22 -#define Z_DIR_PIN P2_11 -#define Z_ENABLE_PIN P0_21 -#ifndef Z_CS_PIN - #define Z_CS_PIN P1_10 -#endif - -#define E0_STEP_PIN P2_13 -#define E0_DIR_PIN P0_11 -#define E0_ENABLE_PIN P2_12 -#ifndef E0_CS_PIN - #define E0_CS_PIN P1_15 -#endif - -#define E1_STEP_PIN P0_01 -#define E1_DIR_PIN P0_00 -#define E1_ENABLE_PIN P0_10 -#ifndef E1_CS_PIN - #define E1_CS_PIN P1_17 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P4_28 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P0_05 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P0_04 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - - #define X_SERIAL_TX_PIN P1_04 - #define X_SERIAL_RX_PIN P1_01 - - #define Y_SERIAL_TX_PIN P1_09 - #define Y_SERIAL_RX_PIN P1_08 - - #define Z_SERIAL_TX_PIN P1_14 - #define Z_SERIAL_RX_PIN P1_10 - - #define E0_SERIAL_TX_PIN P1_16 - #define E0_SERIAL_RX_PIN P1_15 - - #define E1_SERIAL_TX_PIN P4_29 - #define E1_SERIAL_RX_PIN P1_17 - - #define Z2_SERIAL_TX_PIN P4_29 - #define Z2_SERIAL_RX_PIN P1_17 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif // TMC2208 || TMC2209 - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_23_A0 // Analog Input A0 (TH1) -#define TEMP_BED_PIN P0_24_A1 // Analog Input A1 (TB) -#define TEMP_1_PIN P0_25_A2 // Analog Input A2 (TH2) - -// -// Heaters / Fans -// -#define HEATER_BED_PIN P2_05 -#define HEATER_0_PIN P2_07 -#if HOTENDS == 1 - #ifndef FAN1_PIN - #define FAN1_PIN P2_06 - #endif -#else - #ifndef HEATER_1_PIN - #define HEATER_1_PIN P2_06 - #endif -#endif -#ifndef FAN_PIN - #define FAN_PIN P2_04 -#endif - -// -// Misc. Functions -// -#define LED_PIN P1_18 // Used as a status indicator -#define LED2_PIN P1_19 -#define LED3_PIN P1_20 -#define LED4_PIN P1_21 - -/** - * _____ _____ - * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) - * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) - * (LCD_D4) 0.15 | · · | 0.17 (LCD_D5) (BTN_EN2) 3.26 | · · | 0.9 (SD_MOSI) - * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST - * GND | · · | 5V GND | · · | NC - * ----- ----- - * EXP1 EXP2 - */ -#if HAS_WIRED_LCD - - #define BEEPER_PIN P1_31 - #define BTN_ENC P1_30 - - #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS P1_00 - - #define BTN_EN1 P0_18 - #define BTN_EN2 P0_15 - - #define LCD_PINS_ENABLE P1_22 - #define LCD_PINS_D4 P0_17 - - #elif IS_TFTGLCD_PANEL - - #undef BEEPER_PIN - #undef BTN_ENC - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS P3_25 - #endif - - #else - - #define BTN_EN1 P3_25 - #define BTN_EN2 P3_26 - - #define LCD_SDSS P0_28 - - #if ENABLED(MKS_12864OLED_SSD1306) - - #define LCD_PINS_DC P0_17 - #define DOGLCD_CS P0_16 - #define DOGLCD_A0 LCD_PINS_DC - #define DOGLCD_SCK P0_15 - #define DOGLCD_MOSI P0_18 - - #define LCD_PINS_RS P1_00 - #define LCD_PINS_D7 P1_22 - #define KILL_PIN -1 // NC - - #else // !MKS_12864OLED_SSD1306 - - #define LCD_PINS_RS P0_16 - - #define LCD_PINS_ENABLE P0_18 - #define LCD_PINS_D4 P0_15 - - #if ENABLED(FYSETC_MINI_12864) - - #define DOGLCD_CS P0_18 - #define DOGLCD_A0 P0_16 - #define DOGLCD_SCK P0_07 - #define DOGLCD_MOSI P0_09 - - #define LCD_BACKLIGHT_PIN -1 - - #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN P0_15 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN P0_17 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN P1_00 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN P1_22 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN P0_17 - #endif - - #else // !FYSETC_MINI_12864 - - #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS P0_17 - #define DOGLCD_A0 P1_00 - #endif - - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 P0_17 - #define LCD_PINS_D6 P1_00 - #define LCD_PINS_D7 P1_22 - #endif - - #endif // !FYSETC_MINI_12864 - - #endif // !MKS_12864OLED_SSD1306 - - #endif // !CR10_STOCKDISPLAY - -#endif // HAS_WIRED_LCD - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card - -#if SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD) - #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #if SD_CONNECTION_IS(ONBOARD) - #define SS_PIN ONBOARD_SD_CS_PIN - #else - #define SS_PIN P0_28 - #endif -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "No custom SD drive cable defined for this board." -#endif - -// -// Other Pins -// -//#define PIN_P0_02 P0_02 // AUX1 (Interrupt Capable/ADC/Serial Port 0) -//#define PIN_P0_03 P0_03 // AUX1 (Interrupt Capable/ADC/Serial Port 0) -//#define PS_ON_PIN P1_23 // SERVO P1.23 diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h deleted file mode 100644 index 294e7527a8..0000000000 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ /dev/null @@ -1,514 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Re-ARM with RAMPS v1.4 pin assignments - * - * Applies to the following boards: - * - * RAMPS_14_EFB (Hotend, Fan, Bed) - * RAMPS_14_EEB (Hotend0, Hotend1, Bed) - * RAMPS_14_EFF (Hotend, Fan0, Fan1) - * RAMPS_14_EEF (Hotend0, Hotend1, Fan) - * RAMPS_14_SF (Spindle, Controller Fan) - */ - -// Numbers in parentheses () are the corresponding mega2560 pin numbers - -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "Re-ARM RAMPS 1.4" - -// -// Servos -// -#define SERVO0_PIN P1_20 // (11) -#define SERVO1_PIN P1_21 // ( 6) also on J5-1 -#define SERVO2_PIN P1_19 // ( 5) -#define SERVO3_PIN P1_18 // ( 4) 5V output - -// -// Limit Switches -// -#define X_MIN_PIN P1_24 // ( 3) 10k pullup to 3.3V, 1K series -#define X_MAX_PIN P1_25 // ( 2) 10k pullup to 3.3V, 1K series -#define Y_MIN_PIN P1_26 // (14) 10k pullup to 3.3V, 1K series -#define Y_MAX_PIN P1_27 // (15) 10k pullup to 3.3V, 1K series -#define Z_MIN_PIN P1_29 // (18) 10k pullup to 3.3V, 1K series -#define Z_MAX_PIN P1_28 // (19) 10k pullup to 3.3V, 1K series -#define ONBOARD_ENDSTOPPULLUPS // Board has built-in pullups - -// -// Steppers -// -#define X_STEP_PIN P2_01 // (54) -#define X_DIR_PIN P0_11 // (55) -#define X_ENABLE_PIN P0_10 // (38) -#ifndef X_CS_PIN - #define X_CS_PIN P1_01 // ETH -#endif - -#define Y_STEP_PIN P2_02 // (60) -#define Y_DIR_PIN P0_20 // (61) -#define Y_ENABLE_PIN P0_19 // (56) -#ifndef Y_CS_PIN - #define Y_CS_PIN P1_04 // ETH -#endif - -#define Z_STEP_PIN P2_03 // (46) -#define Z_DIR_PIN P0_22 // (48) -#define Z_ENABLE_PIN P0_21 // (62) -#ifndef Z_CS_PIN - #define Z_CS_PIN P1_10 // ETH -#endif - -#define E0_STEP_PIN P2_00 // (26) -#define E0_DIR_PIN P0_05 // (28) -#define E0_ENABLE_PIN P0_04 // (24) -#ifndef E0_CS_PIN - #define E0_CS_PIN P1_14 // ETH -#endif - -#define E1_STEP_PIN P2_08 // (36) -#define E1_DIR_PIN P2_13 // (34) -#define E1_ENABLE_PIN P4_29 // (30) -#ifndef E1_CS_PIN - #define E1_CS_PIN -1 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P1_00 // ETH - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P1_08 // ETH - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P1_09 // ETH - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - - // - // Software serial - // - - // P2_08 E1-Step - // P2_13 E1-Dir - - #ifndef X_SERIAL_TX_PIN - #define X_SERIAL_TX_PIN P0_01 - #endif - #ifndef X_SERIAL_RX_PIN - #define X_SERIAL_RX_PIN P0_01 - #endif - - #ifndef Y_SERIAL_TX_PIN - #define Y_SERIAL_TX_PIN P0_00 - #endif - #ifndef Y_SERIAL_RX_PIN - #define Y_SERIAL_RX_PIN P0_00 - #endif - - #ifndef Z_SERIAL_TX_PIN - #define Z_SERIAL_TX_PIN P2_13 - #endif - #ifndef Z_SERIAL_RX_PIN - #define Z_SERIAL_RX_PIN P2_13 - #endif - - #ifndef E0_SERIAL_TX_PIN - #define E0_SERIAL_TX_PIN P2_08 - #endif - #ifndef E0_SERIAL_RX_PIN - #define E0_SERIAL_RX_PIN P2_08 - #endif - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_23_A0 // A0 (T0) - (67) - TEMP_0_PIN -#define TEMP_BED_PIN P0_24_A1 // A1 (T1) - (68) - TEMP_BED_PIN -#define TEMP_1_PIN P0_25_A2 // A2 (T2) - (69) - TEMP_1_PIN -#define TEMP_2_PIN P0_26_A3 // A3 - (63) - J5-3 & AUX-2 -#define TEMP_3_PIN P1_30_A4 // A4 - (37) - BUZZER_PIN -//#define TEMP_4_PIN P1_31_A5 // A5 - (49) - SD_DETECT_PIN -//#define ?? P0_03_A6 // A6 - ( 0) - RXD0 - J4-4 & AUX-1 -#define FILWIDTH_PIN P0_02_A7 // A7 - ( 1) - TXD0 - J4-5 & AUX-1 - -// -// Augmentation for auto-assigning RAMPS plugs -// -#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) - #if HAS_MULTI_HOTEND - #if TEMP_SENSOR_BED - #define IS_RAMPS_EEB - #else - #define IS_RAMPS_EEF - #endif - #elif TEMP_SENSOR_BED - #define IS_RAMPS_EFB - #else - #define IS_RAMPS_EFF - #endif -#endif - -// -// Heaters / Fans -// -#ifndef MOSFET_D_PIN - #define MOSFET_D_PIN -1 -#endif -#ifndef RAMPS_D8_PIN - #define RAMPS_D8_PIN P2_07 // (8) -#endif -#ifndef RAMPS_D9_PIN - #define RAMPS_D9_PIN P2_04 // (9) -#endif -#ifndef RAMPS_D10_PIN - #define RAMPS_D10_PIN P2_05 // (10) -#endif - -#define HEATER_0_PIN RAMPS_D10_PIN - -#if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed - #define HEATER_BED_PIN RAMPS_D8_PIN -#elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan - #define HEATER_1_PIN RAMPS_D9_PIN -#elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed - #define HEATER_1_PIN RAMPS_D9_PIN - #define HEATER_BED_PIN RAMPS_D8_PIN -#elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan - #define FAN1_PIN RAMPS_D8_PIN -#elif DISABLED(IS_RAMPS_SF) // Not Spindle, Fan (i.e., "EFBF" or "EFBE") - #define HEATER_BED_PIN RAMPS_D8_PIN - #if HOTENDS == 1 - #define FAN1_PIN MOSFET_D_PIN - #else - #define HEATER_1_PIN MOSFET_D_PIN - #endif -#endif - -#ifndef FAN_PIN - #if EITHER(IS_RAMPS_EFB, IS_RAMPS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan - #define FAN_PIN RAMPS_D9_PIN - #elif EITHER(IS_RAMPS_EEF, IS_RAMPS_SF) // Hotend, Hotend, Fan or Spindle, Fan - #define FAN_PIN RAMPS_D8_PIN - #elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed - #define FAN_PIN P1_18 // (4) IO pin. Buffer needed - #else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") - #define FAN_PIN RAMPS_D9_PIN - #endif -#endif - -// -// Misc. Functions -// -#define LED_PIN P4_28 // (13) - -// define digital pin 5 for the filament runout sensor. Use the RAMPS 1.4 digital input 5 on the servos connector -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN P1_19 // (5) -#endif - -#define PS_ON_PIN P2_12 // (12) - -#if !defined(MAX6675_SS_PIN) && DISABLED(USE_ZMAX_PLUG) - #define MAX6675_SS_PIN P1_28 -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENA_PIN) - #if !defined(NUM_SERVOS) || NUM_SERVOS < 4 // Try to use servo connector - #define CASE_LIGHT_PIN P1_18 // (4) MUST BE HARDWARE PWM - #endif -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// Use servo pins, if available -// -#if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) - #if NUM_SERVOS > 1 - #if ENABLED(SPINDLE_FEATURE) - #error "SPINDLE_FEATURE requires 3 free servo pins." - #else - #error "LASER_FEATURE requires 3 free servo pins." - #endif - #endif - #define SPINDLE_LASER_ENA_PIN SERVO1_PIN // (6) Pin should have a pullup/pulldown! - #define SPINDLE_LASER_PWM_PIN SERVO3_PIN // (4) MUST BE HARDWARE PWM - #define SPINDLE_DIR_PIN SERVO2_PIN // (5) -#endif - -// -// Průša i3 MK2 Multiplexer Support -// -#if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 - #define E_MUX0_PIN P0_03 // ( 0) Z_CS_PIN - #define E_MUX1_PIN P0_02 // ( 1) E0_CS_PIN -#endif -#define E_MUX2_PIN P0_26 // (63) E1_CS_PIN - -/** - * LCD / Controller - * - * All controllers can use J3 and J5 on the Re-ARM board. Custom cabling will be required. - * - * - https://github.com/wolfmanjm/universal-panel-adapter - * - https://panucattdevices.freshdesk.com/support/solutions/articles/1000243195-lcd-display-installation - */ - -/** - * Smart LCD adapter - * - * The Smart LCD adapter can be used for the two 10 pin LCD controllers such as - * REPRAP_DISCOUNT_SMART_CONTROLLER. It can't be used for controllers that use - * DOGLCD_A0, DOGLCD_CS, LCD_PINS_D5, LCD_PINS_D6 or LCD_PINS_D7. A custom cable - * is needed to pick up 5V for the EXP1 connection. - * - * SD card on the LCD uses the same SPI signals as the LCD. This results in garbage/lines - * on the LCD display during accesses of the SD card. The menus/code has been arranged so - * that the garbage/lines are erased immediately after the SD card accesses are completed. - */ - -#if ENABLED(CR10_STOCKDISPLAY) - - // Re-Arm can support Creality stock display without SD card reader and single cable on EXP3. - // Re-Arm J3 pins 1 (p1.31) & 2 (P3.26) are not used. Stock cable will need to have one - // 10-pin IDC connector trimmed or replaced with a 12-pin IDC connector to fit J3. - // Requires REVERSE_ENCODER_DIRECTION in Configuration.h - - #define BEEPER_PIN P2_11 // J3-3 & AUX-4 - - #define BTN_EN1 P0_16 // J3-7 & AUX-4 - #define BTN_EN2 P1_23 // J3-5 & AUX-4 - #define BTN_ENC P3_25 // J3-4 & AUX-4 - - #define LCD_PINS_RS P0_15 // J3-9 & AUX-4 (CS) - #define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI) - #define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK) - -#elif IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS P3_26 // (31) J3-2 & AUX-4 - #endif - - #define SD_DETECT_PIN P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) - #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 - -#elif HAS_WIRED_LCD - - //#define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 - //#define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 - //#define MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 - //#define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - - #if ENABLED(FYSETC_MINI_12864) - #define BEEPER_PIN P1_01 - #define BTN_ENC P1_04 - #else - #define BEEPER_PIN P1_30 // (37) not 5V tolerant - #define BTN_ENC P2_11 // (35) J3-3 & AUX-4 - #endif - - #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 - #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 - - #define SD_DETECT_PIN P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) - #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 - #define LCD_PINS_RS P0_16 // (16) J3-7 & AUX-4 - #define LCD_SDSS P1_23 // (53) J3-5 & AUX-3 - - #if ENABLED(NEWPANEL) - #if ENABLED(REPRAPWORLD_KEYPAD) - #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 - #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 - #define SHIFT_LD P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) - #endif - #else - //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 - //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 - //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 - //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4 - #endif - - #if ANY(VIKI2, miniVIKI) - //#define LCD_SCREEN_ROT_180 - - #define DOGLCD_CS P0_16 // (16) - #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 - #define DOGLCD_SCK SCK_PIN - #define DOGLCD_MOSI MOSI_PIN - - #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes - #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes - - #else - - #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_SCK P0_15 - #define DOGLCD_MOSI P0_18 - - // EXP1 on LCD adapter is not usable - using Ethernet connector instead - #define DOGLCD_CS P1_09 - #define DOGLCD_A0 P1_14 - //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN P0_16 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN P1_00 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN P1_01 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN P1_08 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN P1_00 - #endif - #else - #define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2 - #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 - #endif - - #define LCD_BACKLIGHT_PIN P0_16 //(16) J3-7 & AUX-4 - only used on DOGLCD controllers - #define LCD_PINS_ENABLE P0_18 // (51) (MOSI) J3-10 & AUX-3 - #define LCD_PINS_D4 P0_15 // (52) (SCK) J3-9 & AUX-3 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO - #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER - #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 - #endif - #endif - - #if ENABLED(MINIPANEL) - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - #endif - -#endif // HAS_WIRED_LCD - -// -// Ethernet pins -// -#if DISABLED(ULTIPANEL) - #define ENET_MDIO P1_17 // (71) J12-4 - #define ENET_RX_ER P1_14 // (73) J12-6 - #define ENET_RXD1 P1_10 // (75) J12-8 -#endif -#define ENET_MOC P1_16 // (70) J12-3 -#define REF_CLK P1_15 // (72) J12-5 -#define ENET_RXD0 P1_09 // (74) J12-7 -#define ENET_CRS P1_08 // (76) J12-9 -#define ENET_TX_EN P1_04 // (77) J12-10 -#define ENET_TXD0 P1_00 // (78) J12-11 -#define ENET_TXD1 P1_01 // (79) J12-12 - -// -// SD Support -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card - -#if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 - #define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 - #define MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 - #define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin -#elif SD_CONNECTION_IS(ONBOARD) - #undef SD_DETECT_PIN - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "No custom SD drive cable defined for this board." -#endif - -/** - * Fast PWMs - * - * The LPC1768's hardware PWM controller has 6 channels. Each channel - * can be setup to either control a dedicated pin directly or to generate - * an interrupt. The direct method's duty cycle is accurate to within a - * a microsecond. The interrupt method's average duty cycle has the - * the same accuracy but the individual cycles can vary because of higher - * priority interrupts. - * - * All Fast PWMs have a 50Hz rate. - * - * The following pins/signals use the direct method. All other pins use the - * the interrupt method. Note that SERVO2_PIN and RAMPS_D8_PIN use the - * interrupt method. - * - * P1_20 (11) SERVO0_PIN - * P1_21 ( 6) SERVO1_PIN J5-1 - * P0_18 ( 4) SERVO3_PIN 5V output - * *P2_04 ( 9) RAMPS_D9_PIN - * *P2_05 (10) RAMPS_D10_PIN - * - * * - If used as a heater driver then a Fast PWM is NOT assigned. If used as - * a fan driver then enabling FAST_PWM_FAN assigns a Fast PWM to it. - */ - - /** - * Special pins - * P1_30 (37) (NOT 5V tolerant) - * P1_31 (49) (NOT 5V tolerant) - * P0_27 (57) (Open collector) - * P0_28 (58) (Open collector) - */ - -/** - * The following mega2560 pins are NOT available in a Re-ARM system: - * - * 7, 17, 22, 23, 25, 27, 29, 32, 39, 40, 42, 43, 44, 45, 47, 64, 65, 66 - */ diff --git a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h deleted file mode 100644 index f9b9db918d..0000000000 --- a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Selena Compact pin assignments - */ - -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "Selena Compact" -#define BOARD_WEBSITE_URL "github.com/Ales2-k/Selena" - -// -// Servos -// -#define SERVO0_PIN P1_23 - -// -// Limit Switches -// -#define X_MIN_PIN P1_28 -#define X_MAX_PIN P1_25 -#define Y_MIN_PIN P2_11 -#define Y_MAX_PIN -1 -#define Z_MIN_PIN P1_27 -#define Z_MAX_PIN -1 -#define Z_PROBE P1_22 - -// -// Steppers -// -#define X_STEP_PIN P2_00 -#define X_DIR_PIN P0_05 -#define X_ENABLE_PIN P0_04 - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P0_11 -#define Y_ENABLE_PIN P0_10 - -#define Z_STEP_PIN P2_02 -#define Z_DIR_PIN P0_20 -#define Z_ENABLE_PIN P0_19 - -#define E0_STEP_PIN P2_03 -#define E0_DIR_PIN P0_22 -#define E0_ENABLE_PIN P0_21 - -#define E1_STEP_PIN P2_08 -#define E1_DIR_PIN P2_13 -#define E1_ENABLE_PIN P4_29 - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_BED_PIN P0_23_A0 // A0 (TH1) -#define TEMP_0_PIN P0_24_A1 // A1 (TH2) -#define TEMP_1_PIN P0_25_A2 // A2 (TH3) - -// -// Heaters / Fans -// - -#define HEATER_BED_PIN P2_05 -#define HEATER_BED2_PIN P2_04 -#define HEATER_0_PIN P2_07 -#define HEATER_1_PIN P2_06 -#ifndef FAN_PIN - #define FAN_PIN P1_24 -#endif -#define FAN1_PIN P1_26 - -// -// Display -// - -#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCD_PINS_RS P0_16 - #define LCD_PINS_ENABLE P0_18 - #define LCD_PINS_D4 P0_15 - #define LCD_PINS_D5 P1_00 - #define LCD_PINS_D6 P1_01 - #define LCD_PINS_D7 P1_04 - #define BEEPER_PIN P1_31 - - #define BTN_EN1 P3_25 - #define BTN_EN2 P3_26 - #define BTN_ENC P1_30 - - #define SD_DETECT_PIN -1 -#endif // REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h deleted file mode 100644 index adf9085262..0000000000 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Azteeg X5 GT pin assignments - */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "Azteeg X5 GT" -#define BOARD_WEBSITE_URL "tinyurl.com/yx8tdqa3" - -// -// Servos -// -#define SERVO0_PIN P1_23 - -// -// Limit Switches -// -#define X_MIN_PIN P1_24 -#define X_MAX_PIN P1_27 -#define Y_MIN_PIN P1_25 -#define Y_MAX_PIN P1_28 -#define Z_MIN_PIN P1_26 -#define Z_MAX_PIN P1_29 - -// -// Steppers -// -#define X_STEP_PIN P2_01 -#define X_DIR_PIN P0_11 -#define X_ENABLE_PIN P0_10 -#ifndef X_CS_PIN - #define X_CS_PIN P0_10 // BSD2660 default -#endif - -#define Y_STEP_PIN P2_02 -#define Y_DIR_PIN P0_20 -#define Y_ENABLE_PIN P0_19 -#ifndef Y_CS_PIN - #define Y_CS_PIN P0_19 // BSD2660 default -#endif - -#define Z_STEP_PIN P2_03 -#define Z_DIR_PIN P0_22 -#define Z_ENABLE_PIN P0_21 -#ifndef Z_CS_PIN - #define Z_CS_PIN P0_21 // BSD2660 default -#endif - -#define E0_STEP_PIN P2_00 -#define E0_DIR_PIN P0_05 -#define E0_ENABLE_PIN P0_04 -#ifndef E0_CS_PIN - #define E0_CS_PIN P0_04 // BSD2660 default -#endif - -#define E1_STEP_PIN P2_08 -#define E1_DIR_PIN P2_13 -#define E1_ENABLE_PIN P4_29 -#ifndef E1_CS_PIN - #define E1_CS_PIN P4_29 // BSD2660 default -#endif - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_BED_PIN P0_23_A0 // A0 (TH1) -#define TEMP_0_PIN P0_24_A1 // A1 (TH2) -#define TEMP_1_PIN P0_25_A2 // A2 (TH3) - -// -// Heaters / Fans -// - -#define HEATER_BED_PIN P2_07 -#define HEATER_0_PIN P2_04 -#define HEATER_1_PIN P2_05 -#ifndef FAN_PIN - #define FAN_PIN P0_26 -#endif -#define FAN1_PIN P1_22 - -// -// Display -// - -#if ANY(VIKI2, miniVIKI) - #define BEEPER_PIN P1_31 - #define DOGLCD_A0 P2_06 - #define DOGLCD_CS P0_16 - - #define BTN_EN1 P3_25 - #define BTN_EN2 P3_26 - #define BTN_ENC P2_11 - - #define SD_DETECT_PIN P1_18 - #define SDSS P1_21 - - #define STAT_LED_RED_PIN P1_19 - #define STAT_LED_BLUE_PIN P1_20 -#endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h deleted file mode 100644 index 6331d6aa7c..0000000000 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ /dev/null @@ -1,212 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Azteeg X5 MINI pin assignments - */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Azteeg X5 MINI" -#endif -#define BOARD_WEBSITE_URL "tiny.cc/x5_mini" - -// -// LED -// -#define LED_PIN P1_18 - -// -// Servos -// -#define SERVO0_PIN P1_29 - -// -// Limit Switches -// -#define X_STOP_PIN P1_24 -#define Y_STOP_PIN P1_26 -#define Z_STOP_PIN P1_28 - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN P2_04 -#endif - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN P0_25_A2 // Analog Input (P0_25) -#endif - -// -// Steppers -// -#define X_STEP_PIN P2_01 -#define X_DIR_PIN P0_11 -#define X_ENABLE_PIN P0_10 - -#define Y_STEP_PIN P2_02 -#define Y_DIR_PIN P0_20 -#define Y_ENABLE_PIN P0_19 - -#define Z_STEP_PIN P2_03 -#define Z_DIR_PIN P0_22 -#define Z_ENABLE_PIN P0_21 - -#define E0_STEP_PIN P2_00 -#define E0_DIR_PIN P0_05 -#define E0_ENABLE_PIN P0_04 - -// -// DIGIPOT slave addresses -// -#ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT -#endif - -#ifndef DIGIPOT_I2C_ADDRESS_B - #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT -#endif - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_BED_PIN P0_23_A0 // A0 (TH1) -#define TEMP_0_PIN P0_24_A1 // A1 (TH2) - -// -// Heaters / Fans -// -#define HEATER_BED_PIN P2_07 -#define HEATER_0_PIN P2_05 -#ifndef FAN_PIN - #define FAN_PIN P0_26 -#endif -#define FAN1_PIN P1_25 - -// -// Display -// -#if HAS_WIRED_LCD - - #if ENABLED(CR10_STOCKDISPLAY) - - // Re-Arm can support Creality stock display without SD card reader and single cable on EXP3. - // Re-Arm J3 pins 1 (p1.31) & 2 (P3.26) are not used. Stock cable will need to have one - // 10-pin IDC connector trimmed or replaced with a 12-pin IDC connector to fit J3. - // Requires REVERSE_ENCODER_DIRECTION in Configuration.h - - #define BEEPER_PIN P2_11 // J3-3 & AUX-4 - - #define BTN_EN1 P0_16 // J3-7 & AUX-4 - #define BTN_EN2 P1_23 // J3-5 & AUX-4 - #define BTN_ENC P3_25 // J3-4 & AUX-4 - - #define LCD_PINS_RS P0_15 // J3-9 & AUX-4 (CS) - #define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI) - #define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK) - - #else - - #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 - #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 - #define BTN_ENC P2_11 // (35) J3-3 & AUX-4 - - #define SD_DETECT_PIN P1_31 // (49) not 5V tolerant J3-1 & AUX-3 - #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 - #define LCD_PINS_RS P0_16 // (16) J3-7 & AUX-4 - #define LCD_SDSS P0_16 // (16) J3-7 & AUX-4 - #define LCD_BACKLIGHT_PIN P0_16 // (16) J3-7 & AUX-4 - only used on DOGLCD controllers - #define LCD_PINS_ENABLE P0_18 // (51) (MOSI) J3-10 & AUX-3 - #define LCD_PINS_D4 P0_15 // (52) (SCK) J3-9 & AUX-3 - - #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 - - #if ENABLED(REPRAPWORLD_KEYPAD) - #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 - #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 - #define SHIFT_LD P1_31 // (49) not 5V tolerant J3-1 & AUX-3 - #elif DISABLED(NEWPANEL) - //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 - //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 - //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 - //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4 - #endif - - #if ANY(VIKI2, miniVIKI) - //#define LCD_SCREEN_ROT_180 - - #define BEEPER_PIN P1_30 // (37) may change if cable changes - #define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2 - #define DOGLCD_SCK SCK_PIN - #define DOGLCD_MOSI MOSI_PIN - - #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes - #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes - #else - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO - #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER - #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 - #endif - #define BEEPER_PIN P1_30 // (37) not 5V tolerant - #define DOGLCD_CS P0_16 // (16) - #endif - - #if ENABLED(MINIPANEL) - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - #endif - - #endif - -#endif // HAS_WIRED_LCD - -// -// SD Support -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card - -#if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_15 - #define MISO_PIN P0_17 - #define MOSI_PIN P0_18 - #define SS_PIN P1_23 -#elif SD_CONNECTION_IS(ONBOARD) - #undef SD_DETECT_PIN - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "No custom SD drive cable defined for this board." -#endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h deleted file mode 100644 index 99ff0fd25a..0000000000 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Azteeg X5 MINI pin assignments - */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "Azteeg X5 MINI WIFI" - -// -// DIGIPOT slave addresses -// -#ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x58 // shifted slave address for first DIGIPOT (0x58 <- 0x2C << 1) -#endif -#ifndef DIGIPOT_I2C_ADDRESS_B - #define DIGIPOT_I2C_ADDRESS_B 0x5C // shifted slave address for second DIGIPOT (0x5C <- 0x2E << 1) -#endif - -#include "pins_AZTEEG_X5_MINI.h" diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h deleted file mode 100644 index 6d6d7557f5..0000000000 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ /dev/null @@ -1,260 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "BTT SKR E3 Turbo" -#endif - -// Onboard I2C EEPROM -#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 // 4KB (AT24C32) - -// -// Servos -// -#define SERVO0_PIN P1_23 - -// -// TMC StallGuard DIAG pins -// -#define X_DIAG_PIN P1_29 // X-STOP -#define Y_DIAG_PIN P1_28 // Y-STOP -#define Z_DIAG_PIN P1_27 // Z-STOP -#define E0_DIAG_PIN P1_26 // E0DET -#define E1_DIAG_PIN P1_25 // E1DET - -// -// Limit Switches -#define X_STOP_PIN X_DIAG_PIN -#define Y_STOP_PIN Y_DIAG_PIN -#define Z_STOP_PIN Z_DIAG_PIN - -// -// Z Probe -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN P1_22 -#endif - -// -// Filament Runout Sensor -// -#define FIL_RUNOUT_PIN P1_26 // E0DET -#define FIL_RUNOUT2_PIN P1_25 // E1DET - -// -// Power Supply Control -// -#ifndef PS_ON_PIN - #define PS_ON_PIN P1_21 -#endif - -// LED driving pin -#define NEOPIXEL_PIN P1_24 - -// -// Power Loss Detection -// -#ifndef POWER_LOSS_PIN - #define POWER_LOSS_PIN P1_20 // PWRDET -#endif - -// -// Steppers -// -#define X_STEP_PIN P1_04 -#define X_DIR_PIN P1_08 -#define X_ENABLE_PIN P1_00 -#ifndef X_CS_PIN - #define X_CS_PIN P1_01 -#endif - -#define Y_STEP_PIN P1_14 -#define Y_DIR_PIN P1_15 -#define Y_ENABLE_PIN P1_09 -#ifndef Y_CS_PIN - #define Y_CS_PIN P1_10 -#endif - -#define Z_STEP_PIN P4_29 -#define Z_DIR_PIN P4_28 -#define Z_ENABLE_PIN P1_16 -#ifndef Z_CS_PIN - #define Z_CS_PIN P1_17 -#endif - -#define E0_STEP_PIN P2_06 -#define E0_DIR_PIN P2_07 -#define E0_ENABLE_PIN P0_04 -#ifndef E0_CS_PIN - #define E0_CS_PIN P0_05 -#endif - -#define E1_STEP_PIN P2_11 -#define E1_DIR_PIN P2_12 -#define E1_ENABLE_PIN P0_21 -#ifndef E1_CS_PIN - #define E1_CS_PIN P0_22 -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - - // - // Software serial - // - #define X_SERIAL_TX_PIN P1_01 - #define X_SERIAL_RX_PIN P1_01 - - #define Y_SERIAL_TX_PIN P1_10 - #define Y_SERIAL_RX_PIN P1_10 - - #define Z_SERIAL_TX_PIN P1_17 - #define Z_SERIAL_RX_PIN P1_17 - - #define E0_SERIAL_TX_PIN P0_05 - #define E0_SERIAL_RX_PIN P0_05 - - #define E1_SERIAL_TX_PIN P0_22 - #define E1_SERIAL_RX_PIN P0_22 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// -// TMC Low Power Standby pins -// -#define X_STDBY_PIN P3_26 -#define Y_STDBY_PIN P3_25 -#define Z_STDBY_PIN P1_18 -#define E0_STDBY_PIN P1_19 -#define E1_STDBY_PIN P2_13 - -// -// Temperature Sensors -// -#define TEMP_0_PIN P0_24 -#define TEMP_1_PIN P0_23 -//#define TEMP_2_PIN P1_30 // Onboard thermistor -#define TEMP_BED_PIN P0_25 - -// -// Heaters / Fans -// -#define HEATER_0_PIN P2_03 // EXTRUDER 0 -#define HEATER_1_PIN P2_04 // EXTRUDER 1 -#define HEATER_BED_PIN P2_05 // BED -#define FAN_PIN P2_01 -#define FAN1_PIN P2_02 - -/** - * _____ - * 5V | 1 2 | GND - * (LCD_EN) P0_18 | 3 4 | P0_17 (LCD_RS) - * (LCD_D4) P0_15 | 5 6 P0_20 (BTN_EN2) - * RESET | 7 8 | P0_19 (BTN_EN1) - * (BTN_ENC) P0_16 | 9 10| P2_08 (BEEPER) - * ----- - * EXP - */ - -#define EXPA1_03_PIN P0_18 -#define EXPA1_04_PIN P0_17 -#define EXPA1_05_PIN P0_15 -#define EXPA1_06_PIN P0_20 -#define EXPA1_07_PIN -1 -#define EXPA1_08_PIN P0_19 -#define EXPA1_09_PIN P0_16 -#define EXPA1_10_PIN P2_08 - -#if HAS_WIRED_LCD - - #if ENABLED(CR10_STOCKDISPLAY) - - #define BEEPER_PIN EXPA1_10_PIN - - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN - - #define LCD_PINS_RS EXPA1_04_PIN - #define LCD_PINS_ENABLE EXPA1_03_PIN - #define LCD_PINS_D4 EXPA1_05_PIN - - #elif ENABLED(ZONESTAR_LCD) // ANET A8 LCD Controller - Must convert to 3.3V - CONNECTING TO 5V WILL DAMAGE THE BOARD! - - #error "CAUTION! ZONESTAR_LCD requires wiring modifications. See 'pins_BTT_SKR_E3_TURBO.h' for details. Comment out this line to continue." - - #define LCD_PINS_RS EXPA1_05_PIN - #define LCD_PINS_ENABLE EXPA1_09_PIN - #define LCD_PINS_D4 EXPA1_04_PIN - #define LCD_PINS_D5 EXPA1_06_PIN - #define LCD_PINS_D6 EXPA1_08_PIN - #define LCD_PINS_D7 EXPA1_10_PIN - #define ADC_KEYPAD_PIN P1_23 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) - - #define BTN_EN1 EXPA1_08_PIN - #define BTN_EN2 EXPA1_06_PIN - #define BTN_ENC EXPA1_09_PIN - - #define DOGLCD_CS EXPA1_04_PIN - #define DOGLCD_A0 EXPA1_05_PIN - #define DOGLCD_SCK EXPA1_10_PIN - #define DOGLCD_MOSI EXPA1_03_PIN - #define FORCE_SOFT_SPI - #define LCD_BACKLIGHT_PIN -1 - - #else - - #error "Only ZONESTAR_LCD, MKS_MINI_12864, ENDER2_STOCKDISPLAY, and CR10_STOCKDISPLAY are currently supported on the BTT_SKR_E3_TURBO." - - #endif - -#endif // HAS_WIRED_LCD - -// -// SD Support -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#if SD_CONNECTION_IS(ONBOARD) - #define SD_DETECT_PIN P2_00 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN P0_06 -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "SD CUSTOM_CABLE is not compatible with SKR E3 Turbo." -#endif - -#define ON_BOARD_SPI_DEVICE 1 // SPI1 diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h deleted file mode 100644 index a751286e3a..0000000000 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define BOARD_INFO_NAME "BTT SKR V1.4 TURBO" -#define SKR_HAS_LPC1769 - -// -// Include SKR 1.4 pins -// -#include "../lpc1768/pins_BTT_SKR_V1_4.h" diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h deleted file mode 100644 index d66ffbe4e5..0000000000 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Cohesion3D Mini pin assignments - */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "Cohesion3D Mini" - -// -// Servos -// -#define SERVO0_PIN P1_23 - -// -// Limit Switches -// -#define X_MIN_PIN P1_24 // 10k pullup to 3.3V -#define X_MAX_PIN P1_25 // 10k pullup to 3.3V -#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V -#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V -#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V -#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V - -// -// Steppers -// -#define X_STEP_PIN P2_00 -#define X_DIR_PIN P0_05 -#define X_ENABLE_PIN P0_04 -#define X_CS_PIN P1_10 // Ethernet Expansion - Pin 9 - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P0_11 -#define Y_ENABLE_PIN P0_10 -#define Y_CS_PIN P1_09 // Ethernet Expansion - Pin 10 - -#define Z_STEP_PIN P2_02 -#define Z_DIR_PIN P0_20 -#define Z_ENABLE_PIN P0_19 -#define Z_CS_PIN P1_00 // Ethernet Expansion - Pin 11 - -#define E0_STEP_PIN P2_03 -#define E0_DIR_PIN P0_22 -#define E0_ENABLE_PIN P0_21 -#define E0_CS_PIN P1_04 // Ethernet Expansion - Pin 12 - -// -// Default pins for TMC software SPI -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P1_16 // Ethernet Expansion - Pin 5 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P1_17 // Ethernet Expansion - Pin 6 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P1_08 // Ethernet Expansion - Pin 7 - #endif -#endif - -// -// Analog Inputs -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_23_A0 // P0_23 -#define TEMP_BED_PIN P0_24_A1 // P0_24 - -// -// Heaters / Fans -// -#define HEATER_BED_PIN P2_05 -#define HEATER_0_PIN P2_07 // FET 1 -#ifndef FAN_PIN - #define FAN_PIN P2_06 // FET 3 -#endif - -// -// Auto fans -// -#define AUTO_FAN_PIN P2_04 // FET 4 -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN AUTO_FAN_PIN -#endif - -// -// Misc. Functions -// -#define LED_PIN P4_28 // Play LED - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER - #undef HEATER_0_PIN - #define SPINDLE_LASER_ENA_PIN P2_07 // FET 1 - #undef HEATER_BED_PIN - #define SPINDLE_LASER_PWM_PIN P2_05 // Bed FET - #undef FAN_PIN - #define SPINDLE_DIR_PIN P2_06 // FET 3 -#endif - -// -// LCD / Controller -// -// LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be -// defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. -// -// A remote SD card is currently not supported because the pins routed to the EXP2 -// connector are shared with the onboard SD card, and Marlin does not support reading -// G-code files from the onboard SD card. -// -#if HAS_WIRED_LCD - - #define BEEPER_PIN P0_27 // EXP2-7 - open drain - - #define BTN_EN1 P3_26 // EXP2-5 - #define BTN_EN2 P3_25 // EXP2-3 - #define BTN_ENC P1_30 // EXP1-2 - - #define LCD_PINS_RS P0_16 // EXP1-4 - #define LCD_SDSS P0_28 // EXP2-4 - #define LCD_PINS_ENABLE P0_18 // EXP1-3 - #define LCD_PINS_D4 P0_15 // EXP1-5 - - #define KILL_PIN P2_11 // EXP2-10 - - #if ENABLED(SDSUPPORT) - #error "SDSUPPORT is not currently supported by the Cohesion3D boards" - #endif - -#endif // HAS_WIRED_LCD - -// -// Ethernet pins -// -#define ENET_MDIO P1_17 -#define ENET_RX_ER P1_14 -#define ENET_RXD1 P1_10 -#define ENET_MOC P1_16 -#define REF_CLK P1_15 -#define ENET_RXD0 P1_09 -#define ENET_CRS P1_08 -#define ENET_TX_EN P1_04 -#define ENET_TXD0 P1_00 -#define ENET_TXD1 P1_01 diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h deleted file mode 100644 index 66604ef635..0000000000 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h +++ /dev/null @@ -1,290 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Cohesion3D ReMix pin assignments - */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "Cohesion3D ReMix" - -// -// Servos -// -#define SERVO0_PIN P2_04 - -// -// Limit Switches -// -#define X_MIN_PIN P1_24 // 10k pullup to 3.3V -#define X_MAX_PIN P1_25 // 10k pullup to 3.3V -#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V -#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V -#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V -#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN P1_29 -#endif - -// -// Steppers -// -#define X_STEP_PIN P2_00 -#define X_DIR_PIN P0_05 -#define X_ENABLE_PIN P0_04 -#define X_CS_PIN P1_10 // Ethernet Expansion - Pin 9 - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P0_11 -#define Y_ENABLE_PIN P0_10 -#define Y_CS_PIN P1_09 // Ethernet Expansion - Pin 10 - -#define Z_STEP_PIN P2_02 -#define Z_DIR_PIN P0_20 -#define Z_ENABLE_PIN P0_19 -#define Z_CS_PIN P1_00 // Ethernet Expansion - Pin 11 - -#define E0_STEP_PIN P2_03 -#define E0_DIR_PIN P0_22 -#define E0_ENABLE_PIN P0_21 -#define E0_CS_PIN P1_04 // Ethernet Expansion - Pin 12 - -#define E1_STEP_PIN P2_08 -#define E1_DIR_PIN P2_13 -#define E1_ENABLE_PIN P4_29 -#define E1_CS_PIN P1_01 // Ethernet Expansion - Pin 14 - -#define E2_STEP_PIN P1_20 -#define E2_DIR_PIN P1_19 -#define E2_ENABLE_PIN P1_21 -#define E2_CS_PIN P1_18 // FET 6 - -// -// Default pins for TMC software SPI -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P1_16 // Ethernet Expansion - Pin 5 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P1_17 // Ethernet Expansion - Pin 6 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P1_08 // Ethernet Expansion - Pin 7 - #endif -#endif - -// -// Analog Inputs -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_23_A0 -#define TEMP_BED_PIN P0_24_A1 -#define TEMP_1_PIN P0_25_A2 -#if ENABLED(FILAMENT_WIDTH_SENSOR) - #define FILWIDTH_PIN P0_26_A3 -#else - #define TEMP_2_PIN P0_26_A3 -#endif - -// -// Heaters / Fans -// -#define HEATER_BED_PIN P2_05 -#define HEATER_0_PIN P2_07 // FET 1 -#define HEATER_1_PIN P1_23 // FET 2 -#define HEATER_2_PIN P1_22 // FET 3 -#ifndef FAN_PIN - #define FAN_PIN P2_06 // FET 4 -#endif - -// -// Auto fans -// -#if HOTENDS == 3 - #define AUTO_FAN_PIN P1_18 // FET 6 -#else - #define AUTO_FAN_PIN P1_22 // FET 3 -#endif -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN AUTO_FAN_PIN -#endif - -// -// Misc. Functions -// -#define LED_PIN P4_28 // Play LED - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER - #undef HEATER_0_PIN - #undef HEATER_BED_PIN - #undef FAN_PIN - #define SPINDLE_LASER_ENA_PIN P2_07 // FET 1 - #define SPINDLE_LASER_PWM_PIN P2_05 // Bed FET - #define SPINDLE_DIR_PIN P2_06 // FET 4 -#endif - -// -// LCD / Controller -// -// LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be -// defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. -// -// A remote SD card is currently not supported because the pins routed to the EXP2 -// connector are shared with the onboard SD card, and Marlin does not support that -// hardware configuration. -// - -#if ENABLED(FYSETC_MINI_12864) - - #define FORCE_SOFT_SPI // REQUIRED - results in LCD soft SPI mode 3 - - #define BEEPER_PIN P1_31 // EXP1-1 - #define BTN_ENC P1_30 // EXP1-2 - #define DOGLCD_CS P0_18 // EXP1-3 - #define DOGLCD_A0 P0_16 // EXP1-4 - #define LCD_RESET_PIN P0_15 // EXP1-5 - - // A custom cable is REQUIRED for EXP2 cable because the SCK & MOSI on the card's EXP2 are dedicated - // to the onboard SD card. All required EXP2 signals come from the Ethernet connector. Pin 1 of this - // connector is the one nearest the motor power connector. - #define DOGLCD_SCK P1_17 // EXP2-2 => Ethernet pin 5 (bottom, 3 from left) - #define BTN_EN2 P1_09 // EXP2-3 => Ethernet pin 9 (bottom, 5 from left) - #define BTN_EN1 P1_04 // EXP2-5 => Ethernet pin 11 (bottom, 6 from left) - #define DOGLCD_MOSI P1_01 // EXP2-6 => Ethernet pin 13 (bottom, 7 from left) - - // A custom EXP1 cable is required colored LEDs. Pins 1-5, 9, 10 of the cable go to pins 1-5, 9, 10 - // on the board's EXP1 connector. Pins 6, 7, and 8 of the EXP1 cable go to the Ethernet connector. - // Rev 1.2 displays do NOT require the RGB LEDs. 2.0 and 2.1 displays do require RGB. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN P1_16 // EXP1-6 => Ethernet pin 6 (top row, 3 from left) - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN P1_10 // EXP1-7 => Ethernet pin 10 (top row, 5 from left) - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN P1_00 // EXP1-8 => Ethernet pin 12 (top row, 6 from left) - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN P1_16 // EXP1-6 => Ethernet pin 6 (top row, 3 from left) - #endif - -#elif HAS_WIRED_LCD - - #define BEEPER_PIN P1_31 // EXP1-1 - //#define SD_DETECT_PIN P0_27 // EXP2-7 - - #define BTN_EN1 P3_26 // EXP2-5 - #define BTN_EN2 P3_25 // EXP2-3 - #define BTN_ENC P1_30 // EXP1-2 - - #define LCD_PINS_RS P0_16 // EXP1-4 - #define LCD_SDSS P0_28 // EXP2-4 - #define LCD_PINS_ENABLE P0_18 // EXP1-3 - #define LCD_PINS_D4 P0_15 // EXP1-5 - - #define KILL_PIN P2_11 // EXP2-10 - -#endif // HAS_WIRED_LCD - -// -// SD Support -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card - -#if SD_CONNECTION_IS(LCD) - #define SCK_PIN P0_07 // (52) system defined J3-9 & AUX-3 - #define MISO_PIN P0_08 // (50) system defined J3-10 & AUX-3 - #define MOSI_PIN P0_09 // (51) system defined J3-10 & AUX-3 - #define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin -#elif SD_CONNECTION_IS(ONBOARD) - #undef SD_DETECT_PIN - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #define SS_PIN ONBOARD_SD_CS_PIN -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "No custom SD drive cable defined for this board." -#endif - -// -// Ethernet pins -// -//#define ENET_MDIO P1_17 // Ethernet pin 5 (bottom, 3 from left) -//#define ENET_RX_ER P1_14 -//#define ENET_RXD1 P1_10 // Ethernet pin 10 (top row, 5 from left) -//#define ENET_MOC P1_16 // Ethernet pin 6 (top row, 3 from left) -//#define REF_CLK P1_15 -//#define ENET_RXD0 P1_09 // Ethernet pin 9 (bottom, 5 from left) -//#define ENET_CRS P1_08 // Ethernet pin 8 (top row, 4 from left) - INPUT ONLY -//#define ENET_TX_EN P1_04 // Ethernet pin 11 (bottom, 6 from left) -//#define ENET_TXD0 P1_00 // Ethernet pin 12 (top row, 6 from left) -//#define ENET_TXD1 P1_01 // Ethernet pin 13 (bottom, 7 from left) - -/** - * EXP1 pins - * 1 - P1_31 - * 2 - P1_30 - * 3 - P0_18 - * 4 - P0_16 - * 5 - P0_15 - * 6 - N/C - * 7 - N/C - * 8 - P0_27 (also on EXP2-7) - * 9 - GND - * 10 - +5V - * - * - * EXP2 pins - * 1 - P0_08 - * 2 - P0_07 - * 3 - P3_26 - * 4 - P0_28 - * 5 - P3_25 - * 6 - P0_09 - * 7 - P0_27 (also on EXP1_8) - * 8 - P2_11 - * 9 - GND - * 10 - N/C - */ diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h deleted file mode 100644 index d67549997b..0000000000 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS SGen pin assignments - * - * The pins diagram can be found and the following URL: - * https://github.com/makerbase-mks/MKS-SGen/blob/master/Hardware/MKS%20SGEN%20V1.0_001/MKS%20SGEN%20V1.0_001%20PIN.pdf - */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "MKS SGen" -#define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SGEN" - -#define MKS_HAS_LPC1769 -#include "../lpc1768/pins_MKS_SBASE.h" - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - */ - - #define X_SERIAL_TX_PIN P1_22 // J8-2 - #define X_SERIAL_RX_PIN P1_22 // J8-2 - #define Y_SERIAL_TX_PIN P1_23 // J8-3 - #define Y_SERIAL_RX_PIN P1_23 // J8-3 - #define Z_SERIAL_TX_PIN P2_12 // J8-4 - #define Z_SERIAL_RX_PIN P2_12 // J8-4 - #define E0_SERIAL_TX_PIN P2_11 // J8-5 - #define E0_SERIAL_RX_PIN P2_11 // J8-5 - #define E1_SERIAL_TX_PIN P4_28 // J8-6 - #define E1_SERIAL_RX_PIN P4_28 // J8-6 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h deleted file mode 100644 index 62660935f5..0000000000 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ /dev/null @@ -1,367 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS SGen pin assignments - */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "MKS SGEN_L V2" -#define BOARD_WEBSITE_URL "github.com/makerbase-mks" - -// -// EEPROM, MKS SGEN_L V2.0 hardware has 4K EEPROM on the board -// -#if NO_EEPROM_SELECTED - //#define SDCARD_EEPROM_EMULATION - //#define I2C_EEPROM // AT24C32 - #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Servos -// -#define SERVO0_PIN P1_23 // SERVO P1.23 -#define SERVO1_PIN P2_00 // SERVO P2.0 - -// -// Trinamic Stallguard pins, can connect or disconnect by jumpers cap on the board -// -#define X_DIAG_PIN P1_29 // X- -#define Y_DIAG_PIN P1_27 // Y- -#define Z_DIAG_PIN P1_25 // Z- -#define E0_DIAG_PIN P1_28 // X+ -#define E1_DIAG_PIN P1_26 // Y+ - -// -// Limit Switches -// -#if X_STALL_SENSITIVITY - #define X_STOP_PIN X_DIAG_PIN - #if X_HOME_DIR < 0 - #define X_MAX_PIN P1_28 // X+ - #else - #define X_MIN_PIN P1_28 // X+ - #endif -#else - #define X_MIN_PIN P1_29 // X- - #define X_MAX_PIN P1_28 // X+ -#endif - -#if Y_STALL_SENSITIVITY - #define Y_STOP_PIN Y_DIAG_PIN - #if Y_HOME_DIR < 0 - #define Y_MAX_PIN P1_26 // Y+ - #else - #define Y_MIN_PIN P1_26 // Y+ - #endif -#else - #define Y_MIN_PIN P1_27 // Y- - #define Y_MAX_PIN P1_26 // Y+ -#endif - -#if Z_STALL_SENSITIVITY - #define Z_STOP_PIN Z_DIAG_PIN - #if Z_HOME_DIR < 0 - #define Z_MAX_PIN P1_24 // Z+ - #else - #define Z_MIN_PIN P1_24 // Z+ - #endif -#else - #define Z_MIN_PIN P1_25 // Z- - #define Z_MAX_PIN P1_24 // Z+ -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN P1_24 -#endif - -// -// Steppers -// -#define X_STEP_PIN P2_02 -#define X_DIR_PIN P2_03 -#define X_ENABLE_PIN P2_01 -#ifndef X_CS_PIN - #define X_CS_PIN P1_01 -#endif - -#define Y_STEP_PIN P0_19 -#define Y_DIR_PIN P0_20 -#define Y_ENABLE_PIN P2_08 -#ifndef Y_CS_PIN - #define Y_CS_PIN P1_08 -#endif - -#define Z_STEP_PIN P0_22 -#define Z_DIR_PIN P2_11 -#define Z_ENABLE_PIN P0_21 -#ifndef Z_CS_PIN - #define Z_CS_PIN P1_10 -#endif - -#define E0_STEP_PIN P2_13 -#define E0_DIR_PIN P0_11 -#define E0_ENABLE_PIN P2_12 -#ifndef E0_CS_PIN - #define E0_CS_PIN P1_15 -#endif - -#define E1_STEP_PIN P1_09 -#define E1_DIR_PIN P1_14 -#define E1_ENABLE_PIN P0_10 -#ifndef E1_CS_PIN - #define E1_CS_PIN P1_17 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI P1_16 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO P0_05 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK P0_04 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - #define X_SERIAL_TX_PIN P1_01 - #define X_SERIAL_RX_PIN P1_01 - #define Y_SERIAL_TX_PIN P1_08 - #define Y_SERIAL_RX_PIN P1_08 - #define Z_SERIAL_TX_PIN P1_10 - #define Z_SERIAL_RX_PIN P1_10 - #define E0_SERIAL_TX_PIN P1_15 - #define E0_SERIAL_RX_PIN P1_15 - #define E1_SERIAL_TX_PIN P1_17 - #define E1_SERIAL_RX_PIN P1_17 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif // HAS_TMC_UART - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_23_A0 // Analog Input A0 (TH1) -#define TEMP_BED_PIN P0_24_A1 // Analog Input A1 (TB) -#define TEMP_1_PIN P0_25_A2 // Analog Input A2 (TH2) -#define TEMP_2_PIN P0_26_A3 // Analog Input A3 (P0.26, No pull up) - -// -// Heaters / Fans -// -#define HEATER_BED_PIN P2_05 -#define HEATER_0_PIN P2_07 -#if HAS_MULTI_HOTEND - #ifndef HEATER_1_PIN - #define HEATER_1_PIN P2_06 - #endif -#else - #ifndef FAN2_PIN - #define FAN2_PIN P2_06 // HE1 for FAN3 - #endif -#endif -#ifndef FAN_PIN - #define FAN_PIN P2_04 // FAN1 -#endif -#ifndef FAN1_PIN - #define FAN1_PIN P1_04 // FAN2 -#endif - -// -// Misc. Functions -// -#define LED_PIN P1_18 // Used as a status indicator -#define LED2_PIN P1_19 -#define LED3_PIN P1_20 -#define LED4_PIN P1_21 - -/** - * _____ _____ - * (BEEPER) 1.31 | · · | 1.30 (BTN_ENC) (MISO) 0.8 | · · | 0.7 (SD_SCK) - * (LCD_EN) 0.18 | · · | 0.16 (LCD_RS) (BTN_EN1) 3.25 | · · | 0.28 (SD_CS2) - * (LCD_D4) 0.15 | · ·| 0.17 (LCD_D5) (BTN_EN2) 3.26 | · ·| 0.9 (SD_MOSI) - * (LCD_D6) 1.0 | · · | 1.22 (LCD_D7) (SD_DETECT) 0.27 | · · | RST - * GND | · · | 5V GND | · · | NC - * ----- ----- - * EXP1 EXP2 - */ -#if IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS P3_25 - #endif - - #define SD_DETECT_PIN P0_27 - -#elif HAS_WIRED_LCD - - #define BEEPER_PIN P1_31 - #define BTN_ENC P1_30 - - #if ENABLED(CR10_STOCKDISPLAY) - - #define LCD_PINS_RS P1_00 - - #define BTN_EN1 P0_18 - #define BTN_EN2 P0_15 - - #define LCD_PINS_ENABLE P1_22 - #define LCD_PINS_D4 P0_17 - - #else - - #define BTN_EN1 P3_25 - #define BTN_EN2 P3_26 - - #define LCD_SDSS P0_28 - - #if ENABLED(MKS_12864OLED_SSD1306) - - #define LCD_PINS_DC P0_17 - #define DOGLCD_CS P0_16 - #define DOGLCD_A0 LCD_PINS_DC - #define DOGLCD_SCK P0_15 - #define DOGLCD_MOSI P0_18 - - #define LCD_PINS_RS P1_00 - #define LCD_PINS_D7 P1_22 - #define KILL_PIN -1 // NC - - #else // !MKS_12864OLED_SSD1306 - - #define LCD_PINS_RS P0_16 - - #define LCD_PINS_ENABLE P0_18 - #define LCD_PINS_D4 P0_15 - - #if ENABLED(FYSETC_MINI_12864) - - #define DOGLCD_CS P0_18 - #define DOGLCD_A0 P0_16 - #define DOGLCD_SCK P0_07 - #define DOGLCD_MOSI P1_20 - - #define LCD_BACKLIGHT_PIN -1 - - #define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN P0_15 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN P0_17 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN P1_00 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN P1_22 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN P0_17 - #endif - - #else // !FYSETC_MINI_12864 - - #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS P0_17 - #define DOGLCD_A0 P1_00 - #endif - - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 P0_17 - #define LCD_PINS_D6 P1_00 - #define LCD_PINS_D7 P1_22 - #endif - - #endif // !FYSETC_MINI_12864 - - #endif // !MKS_12864OLED_SSD1306 - - #endif // !CR10_STOCKDISPLAY - -#endif // HAS_WIRED_LCD - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card - -#if SD_CONNECTION_IS(LCD) || SD_CONNECTION_IS(ONBOARD) - #define SD_DETECT_PIN P0_27 - #define SCK_PIN P0_07 - #define MISO_PIN P0_08 - #define MOSI_PIN P0_09 - #if SD_CONNECTION_IS(ONBOARD) - #define SS_PIN ONBOARD_SD_CS_PIN - #else - #define SS_PIN P0_28 - #endif -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "No custom SD drive cable defined for this board." -#endif - -// -// Other Pins -// -//#define PIN_P0_02 P0_02 // AUX1 (Interrupt Capable/ADC/Serial Port 0) -//#define PIN_P0_03 P0_03 // AUX1 (Interrupt Capable/ADC/Serial Port 0) -//#define PS_ON_PIN P1_23 // SERVO P1.23 diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h deleted file mode 100644 index f2811b14ab..0000000000 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Smoothieboard pin assignments - */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "Smoothieboard" -#define BOARD_WEBSITE_URL "smoothieware.org/smoothieboard" - -// -// Servos -// -#define SERVO0_PIN P1_23 - -// -// Limit Switches -// -#define X_MIN_PIN P1_24 -#define X_MAX_PIN P1_25 -#define Y_MIN_PIN P1_26 -#define Y_MAX_PIN P1_27 -#define Z_MIN_PIN P1_28 -#define Z_MAX_PIN P1_29 - -// -// Steppers -// -#define X_STEP_PIN P2_00 -#define X_DIR_PIN P0_05 -#define X_ENABLE_PIN P0_04 - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P0_11 -#define Y_ENABLE_PIN P0_10 - -#define Z_STEP_PIN P2_02 -#define Z_DIR_PIN P0_20 -#define Z_ENABLE_PIN P0_19 - -#define E0_STEP_PIN P2_03 -#define E0_DIR_PIN P0_22 -#define E0_ENABLE_PIN P0_21 - -#define E1_STEP_PIN P2_08 -#define E1_DIR_PIN P2_13 -#define E1_ENABLE_PIN P4_29 - -// -// Temperature Sensors -// 3.3V max when defined as an analog input -// -#define TEMP_0_PIN P0_23_A0 // (T1) -#define TEMP_BED_PIN P0_24_A1 // (T2) -#define TEMP_1_PIN P0_25_A2 // (T3) -#define TEMP_2_PIN P0_26_A3 // (T4) - -// -// Heaters / Fans -// -#define HEATER_BED_PIN P2_05 -#define HEATER_0_PIN P2_07 -#define HEATER_1_PIN P1_23 -#ifndef FAN_PIN - #define FAN_PIN P2_06 -#endif -#define FAN1_PIN P2_04 - -// -// LCD / Controller -// -#if ANY(VIKI2, miniVIKI) - - #define BEEPER_PIN P1_31 - #define DOGLCD_A0 P2_11 - #define DOGLCD_CS P0_16 - - #define BTN_EN1 P3_25 - #define BTN_EN2 P3_26 - #define BTN_ENC P1_30 - - #define SD_DETECT_PIN P1_18 - #define SDSS P1_21 - - #define STAT_LED_RED_PIN P1_19 - #define STAT_LED_BLUE_PIN P1_20 - -#elif HAS_WIRED_LCD - - /** - * SD Support - * - * For the RRD GLCD it CANNOT share the same SPI as the LCD so it must be - * hooked up to the onboard SDCard SPI and use a spare pin for the SDCS. - * Also note that an external SDCard sharing the SPI port with the - * onboard/internal SDCard must be ejected before rebooting as the bootloader - * does not like the external card. NOTE Smoothie will not boot if the external - * sdcard is inserted in the RRD LCD sdcard slot at boot time, it must be - * inserted after it has booted. - */ - #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) - - #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO) - #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK) - #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS) - #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI) - - /** - * The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either - * a custom cable with breakouts to the pins indicated below or the RRD GLCD Adapter board - * found at http://smoothieware.org/rrdglcdadapter - * - * Other links to information about setting up a display panel with Smoothieboard - * http://chibidibidiwah.wdfiles.com/local--files/panel/smoothieboard2sd.jpg - * http://smoothieware.org/panel - */ - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - // EXP1 Pins - #define BEEPER_PIN P1_31 // EXP1 Pin 1 - #define BTN_ENC P1_30 // EXP1 Pin 2 - #define LCD_PINS_ENABLE P0_18 // EXP1 Pin 3 (MOSI) - #define LCD_PINS_RS P0_16 // EXP1 Pin 4 (CS) - #define LCD_PINS_D4 P0_15 // EXP1 Pin 5 (SCK) - // EXP2 Pins - #define BTN_EN2 P3_26 // EXP2 Pin 3 - #define BTN_EN1 P3_25 // EXP2 Pin 5 - - #elif IS_TFTGLCD_PANEL - - #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS P3_26 // EXP2 Pin 3 - #endif - - #else - #error "Marlin's Smoothieboard support cannot drive your LCD." - #endif - -#endif - -/** - * I2C Digipots - MCP4451 - * Address 58 (2C << 1) - * Set from 0 - 127 with stop bit. - * (Ex. 3F << 1 | 1) - */ -#define DIGIPOTS_I2C_SCL P0_0 -#define DIGIPOTS_I2C_SDA_X P0_04 -#define DIGIPOTS_I2C_SDA_Y P0_10 -#define DIGIPOTS_I2C_SDA_Z P0_19 -#define DIGIPOTS_I2C_SDA_E0 P0_21 -#define DIGIPOTS_I2C_SDA_E1 P4_29 - -#ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address (58 <- 2C << 1) -#endif diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h deleted file mode 100644 index a0174f2602..0000000000 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * TH3D EZBoard pin assignments - */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - -#define BOARD_INFO_NAME "TH3D EZBoard" -#define BOARD_WEBSITE_URL "th3dstudio.com" - -// -// Servos -// -#define SERVO0_PIN P2_04 - -// -// Limit Switches -// -#define X_STOP_PIN P1_24 -#define Y_STOP_PIN P1_25 -#define Z_STOP_PIN P1_26 - -// -// Filament Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN P1_27 -#endif - -// -// Steppers -// -#define X_STEP_PIN P2_00 -#define X_DIR_PIN P1_16 -#define X_ENABLE_PIN P1_17 - -#define Y_STEP_PIN P2_01 -#define Y_DIR_PIN P1_10 -#define Y_ENABLE_PIN P1_09 - -#define Z_STEP_PIN P2_02 -#define Z_DIR_PIN P1_15 -#define Z_ENABLE_PIN P1_14 - -#define E0_STEP_PIN P2_03 -#define E0_DIR_PIN P1_04 -#define E0_ENABLE_PIN P1_08 - -#define E1_STEP_PIN P2_08 -#define E1_DIR_PIN P2_13 -#define E1_ENABLE_PIN P4_29 - -#if HAS_TMC_UART - // - // TMC220x stepper drivers - // Software serial - // - #define X_SERIAL_TX_PIN P0_04 - #define X_SERIAL_RX_PIN P0_05 - #define Y_SERIAL_TX_PIN P0_10 - #define Y_SERIAL_RX_PIN P0_11 - #define Z_SERIAL_TX_PIN P0_19 - #define Z_SERIAL_RX_PIN P0_20 - #define E0_SERIAL_TX_PIN P0_22 - #define E0_SERIAL_RX_PIN P0_21 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// -// Temp Sensors -// 3.3V max when defined as an Analog Input! -// -#if TEMP_SENSOR_0 == 20 // PT100 Adapter - #define TEMP_0_PIN P0_02_A7 // Analog Input -#else - #define TEMP_0_PIN P0_23_A0 // Analog Input P0_23 -#endif - -#define TEMP_BED_PIN P0_24_A1 // Analog Input P0_24 -#define TEMP_1_PIN P0_25_A2 // Analog Input P0_25 - -#if ENABLED(FILAMENT_WIDTH_SENSOR) - #define FILWIDTH_PIN P0_26_A3 // Analog Input P0_26 -#else - #define TEMP_2_PIN P0_26_A3 // Analog Input P0_26 -#endif - -// -// Heaters / Fans -// -#define HEATER_BED_PIN P2_05 -#define HEATER_0_PIN P2_07 -#ifndef FAN_PIN - #define FAN_PIN P2_06 -#endif -#define FAN1_PIN P1_22 - -// -// Auto fans -// -#define AUTO_FAN_PIN P1_22 // FET 3 -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN AUTO_FAN_PIN -#endif - -// -// SD Card -// - -#define SDCARD_CONNECTION ONBOARD - -#define SCK_PIN P0_07 -#define MISO_PIN P0_08 -#define MOSI_PIN P0_09 -#define ONBOARD_SD_CS_PIN P0_06 -#define SS_PIN ONBOARD_SD_CS_PIN - -// -// LCD / Controller -// - -/** - * _____ - * 5V | · · | GND - * (LCD_EN) P0_18 | · · | P0_16 (LCD_RS) - * (LCD_D4) P0_15 | · · | P3_25 (BTN_EN2) - * (RESET) P2_11 | · · | P3_26 (BTN_EN1) - * (BTN_ENC) P1_30 | · · | P1_31 (BEEPER) - * ----- - * EXP1 - * - * LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be - * defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. - * - * A remote SD card is currently not supported because the pins routed to the EXP2 - * connector are shared with the onboard SD card. - */ - -#if ENABLED(CR10_STOCKDISPLAY) - #define BEEPER_PIN P1_31 - #define BTN_EN1 P3_26 - #define BTN_EN2 P3_25 - #define BTN_ENC P1_30 - #define LCD_PINS_RS P0_16 - #define LCD_PINS_ENABLE P0_18 - #define LCD_PINS_D4 P0_15 - #define KILL_PIN P2_11 -#elif HAS_WIRED_LCD - #error "Only the CR10_STOCKDISPLAY is supported with TH3D EZBoard." -#endif diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h deleted file mode 100644 index 98427d9e59..0000000000 --- a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Cheaptronic v1.0 pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Cheaptronic v1.0" -// -// Limit Switches -// -#define X_STOP_PIN 3 -#define Y_STOP_PIN 2 -#define Z_STOP_PIN 5 - -// -// Steppers -// -#define X_STEP_PIN 14 -#define X_DIR_PIN 15 -#define X_ENABLE_PIN 24 - -#define Y_STEP_PIN 35 -#define Y_DIR_PIN 36 -#define Y_ENABLE_PIN 31 - -#define Z_STEP_PIN 40 -#define Z_DIR_PIN 41 -#define Z_ENABLE_PIN 37 - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 25 - -#define E1_STEP_PIN 33 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 - -// -// Temperature sensors -// -#define TEMP_0_PIN 15 // Analog Input -#define TEMP_1_PIN 14 // Analog Input -#define TEMP_BED_PIN 13 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 19 // EXTRUDER 1 -#define HEATER_1_PIN 23 // EXTRUDER 2 -#define HEATER_BED_PIN 22 - -// -// LCD / Controller -// -// Cheaptronic v1.0 doesn't support LCD diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h deleted file mode 100644 index 3a84f4395f..0000000000 --- a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Cheaptronic v2.0 pin assignments - * Built and sold by Michal Dyntar - RRO - * www.reprapobchod.cz - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Cheaptronic v2.0" - -// -// Limit Switches -// -#define X_MIN_PIN 30 -#define X_MAX_PIN 31 -#define Y_MIN_PIN 32 -#define Y_MAX_PIN 33 -#define Z_MIN_PIN 34 -#define Z_MAX_PIN 35 - -// -// Steppers -// -#define X_STEP_PIN 17 -#define X_DIR_PIN 16 -#define X_ENABLE_PIN 48 - -#define Y_STEP_PIN 54 -#define Y_DIR_PIN 47 -#define Y_ENABLE_PIN 55 - -#define Z_STEP_PIN 57 -#define Z_DIR_PIN 56 -#define Z_ENABLE_PIN 62 - -#define E0_STEP_PIN 23 -#define E0_DIR_PIN 22 -#define E0_ENABLE_PIN 24 - -#define E1_STEP_PIN 26 -#define E1_DIR_PIN 25 -#define E1_ENABLE_PIN 27 - -#define E2_STEP_PIN 29 -#define E2_DIR_PIN 28 -#define E2_ENABLE_PIN 39 - -// -// Temperature sensors -// -#define TEMP_0_PIN 15 -#define TEMP_1_PIN 13 -#define TEMP_2_PIN 14 -#define TEMP_3_PIN 11 // should be used for chamber temperature control -#define TEMP_BED_PIN 12 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 6 -#define HEATER_1_PIN 7 -#define HEATER_2_PIN 8 -#define HEATER_BED_PIN 9 -#ifndef FAN_PIN - #define FAN_PIN 3 -#endif -#define FAN2_PIN 58 // additional fan or light control output - -// -// Other board specific pins -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 37 // board input labeled as F-DET -#endif -#define Z_MIN_PROBE_PIN 36 // additional external board input labeled as E-SENS (should be used for Z-probe) -#define LED_PIN 13 -#define SPINDLE_ENABLE_PIN 4 // additional PWM pin 1 at JP1 connector - should be used for laser control too -#define EXT_2 5 // additional PWM pin 2 at JP1 connector -#define EXT_3 2 // additional PWM pin 3 at JP1 connector -#define PS_ON_PIN 45 -#define KILL_PIN 46 - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 11 // shared with TEMP_3 analog input -#endif - -// -// LCD / Controller -// -#define LCD_PINS_RS 19 -#define LCD_PINS_ENABLE 42 -#define LCD_PINS_D4 18 -#define LCD_PINS_D5 38 -#define LCD_PINS_D6 41 -#define LCD_PINS_D7 40 - -// -// Beeper, SD Card, Encoder -// -#define BEEPER_PIN 44 - -#if ENABLED(SDSUPPORT) - #define SDSS 53 - #define SD_DETECT_PIN 49 -#endif - -#if ENABLED(NEWPANEL) - #define BTN_EN1 11 - #define BTN_EN2 12 - #define BTN_ENC 43 -#endif diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h deleted file mode 100644 index 675d4b7262..0000000000 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * CartesioV11 pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "CN Controls V11" - -// -// Limit Switches -// -#define X_STOP_PIN 43 -#define Y_STOP_PIN 45 -#define Z_STOP_PIN 42 - -// -// Steppers -// -#define X_STEP_PIN 34 -#define X_DIR_PIN 36 -#define X_ENABLE_PIN 35 - -#define Y_STEP_PIN 37 -#define Y_DIR_PIN 39 -#define Y_ENABLE_PIN 38 - -#define Z_STEP_PIN 40 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 41 - -#define E0_STEP_PIN 29 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 3 - -#define E1_STEP_PIN 61 -#define E1_DIR_PIN 62 -#define E1_ENABLE_PIN 60 - -#define E2_STEP_PIN 15 -#define E2_DIR_PIN 14 -#define E2_ENABLE_PIN 16 - -#define E3_STEP_PIN 44 -#define E3_DIR_PIN 49 -#define E3_ENABLE_PIN 47 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 3 // Analog Input. 3 for tool2 -> 2 for chambertemp -#define TEMP_2_PIN 2 // Analog Input. 9 for tool3 -> 2 for chambertemp -#define TEMP_3_PIN 11 // Analog Input. 11 for tool4 -> 2 for chambertemp -#define TEMP_BED_PIN 1 // Analog Input - -#ifndef TEMP_CHAMBER_PIN - //#define TEMP_CHAMBER_PIN 2 // Analog Input -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 5 -#define HEATER_1_PIN 58 -#define HEATER_2_PIN 64 -#define HEATER_3_PIN 46 -#define HEATER_BED_PIN 2 - -#ifndef FAN_PIN - //#define FAN_PIN 7 // common PWM pin for all tools -#endif - -// -// Auto fans -// -#define AUTO_FAN_PIN 7 -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E3_AUTO_FAN_PIN - #define E3_AUTO_FAN_PIN AUTO_FAN_PIN -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define SD_DETECT_PIN 13 - -// Tools - -//#define TOOL_0_PIN 4 -//#define TOOL_1_PIN 59 -//#define TOOL_2_PIN 8 -//#define TOOL_3_PIN 30 -//#define TOOL_PWM_PIN 7 // common PWM pin for all tools - -// Common I/O - -//#define FIL_RUNOUT_PIN -1 -//#define PWM_1_PIN 11 -//#define PWM_2_PIN 10 -//#define SPARE_IO 12 - -// -// LCD / Controller -// -#define BEEPER_PIN 6 - -// Pins for DOGM SPI LCD Support -#define DOGLCD_A0 26 -#define DOGLCD_CS 24 -#define DOGLCD_MOSI -1 -#define DOGLCD_SCK -1 - -#define BTN_EN1 23 -#define BTN_EN2 25 -#define BTN_ENC 27 - -// Hardware buttons for manual movement of XYZ -#define SHIFT_OUT 19 -#define SHIFT_LD 18 -#define SHIFT_CLK 17 - -//#define UI1 31 -//#define UI2 22 - -#define STAT_LED_BLUE_PIN -1 -#define STAT_LED_RED_PIN 31 diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h deleted file mode 100644 index 35426a4531..0000000000 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * CartesioV12 pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "CN Controls V12" - -// -// Limit Switches -// -#define X_STOP_PIN 19 -#define Y_STOP_PIN 22 -#define Z_STOP_PIN 23 - -// -// Steppers -// -#define X_STEP_PIN 25 -#define X_DIR_PIN 27 -#define X_ENABLE_PIN 26 - -#define Y_STEP_PIN 28 -#define Y_DIR_PIN 30 -#define Y_ENABLE_PIN 29 - -#define Z_STEP_PIN 31 -#define Z_DIR_PIN 33 -#define Z_ENABLE_PIN 32 - -#define E0_STEP_PIN 57 -#define E0_DIR_PIN 55 -#define E0_ENABLE_PIN 58 - -#define E1_STEP_PIN 61 -#define E1_DIR_PIN 62 -#define E1_ENABLE_PIN 60 - -#define E2_STEP_PIN 46 -#define E2_DIR_PIN 66 -#define E2_ENABLE_PIN 44 - -#define E3_STEP_PIN 45 -#define E3_DIR_PIN 69 -#define E3_ENABLE_PIN 47 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 9 // Analog Input. 9 for tool2 -> 13 for chambertemp -#define TEMP_2_PIN 13 // Analog Input. 10 for tool3 -> 13 for chambertemp -#define TEMP_3_PIN 11 // Analog Input. 11 for tool4 -> 13 for chambertemp -#define TEMP_BED_PIN 14 // Analog Input - -#ifndef TEMP_CHAMBER_PIN - //#define TEMP_CHAMBER_PIN 13 // Analog Input -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 11 -#define HEATER_1_PIN 9 -#define HEATER_2_PIN 6 -#define HEATER_3_PIN 3 -#define HEATER_BED_PIN 24 - -#ifndef FAN_PIN - #define FAN_PIN 5 // 5 is PWMtool3 -> 7 is common PWM pin for all tools -#endif - -// -// Auto fans -// -#define AUTO_FAN_PIN 7 -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E3_AUTO_FAN_PIN - #define E3_AUTO_FAN_PIN AUTO_FAN_PIN -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define SD_DETECT_PIN 15 - -// Tools - -//#define TOOL_0_PIN 56 -//#define TOOL_0_PWM_PIN 10 // red warning led at dual extruder -//#define TOOL_1_PIN 59 -//#define TOOL_1_PWM_PIN 8 // lights at dual extruder -//#define TOOL_2_PIN 4 -//#define TOOL_2_PWM_PIN 5 -//#define TOOL_3_PIN 14 -//#define TOOL_3_PWM_PIN 2 - -// Common I/O - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 18 -#endif -//#define PWM_1_PIN 12 -//#define PWM_2_PIN 13 -//#define SPARE_IO 17 - -// -// LCD / Controller -// -#define BEEPER_PIN 16 - -// Pins for DOGM SPI LCD Support -#define DOGLCD_A0 39 -#define DOGLCD_CS 35 -#define DOGLCD_MOSI 48 -#define DOGLCD_SCK 49 -#define LCD_SCREEN_ROT_180 - -// The encoder and click button -#define BTN_EN1 36 -#define BTN_EN2 34 -#define BTN_ENC 38 - -// Hardware buttons for manual movement of XYZ -#define SHIFT_OUT 42 -#define SHIFT_LD 41 -#define SHIFT_CLK 40 - -//#define UI1 43 -//#define UI2 37 - -#define STAT_LED_BLUE_PIN -1 -#define STAT_LED_RED_PIN 10 // TOOL_0_PWM_PIN diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h deleted file mode 100644 index 8bafbdf000..0000000000 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * CNControls V15 for HMS434 pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "CN Controls V15" - -// -// Servos -// -#define SERVO0_PIN 6 - -// -// Limit Switches -// -#define X_STOP_PIN 34 -#define Y_STOP_PIN 39 -#define Z_STOP_PIN 62 - -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 49 -#endif - -// -// Steppers -// -#define X_STEP_PIN 14 -#define X_DIR_PIN 25 -#define X_ENABLE_PIN 26 - -#define Y_STEP_PIN 11 -#define Y_DIR_PIN 12 -#define Y_ENABLE_PIN 15 - -#define Z_STEP_PIN 24 -#define Z_DIR_PIN 27 -#define Z_ENABLE_PIN 28 - -#define E0_STEP_PIN 64 -#define E0_DIR_PIN 65 -#define E0_ENABLE_PIN 63 - -// -// Temperature Sensors -// Analog Inputs -// -#define TEMP_0_PIN 2 // Analog Input -#define TEMP_BED_PIN 4 // Analog Input - -#ifndef TEMP_CHAMBER_PIN - #define TEMP_CHAMBER_PIN 5 // Analog Input -#endif - -// -// Heaters -// -#define HEATER_0_PIN 4 -#define HEATER_BED_PIN 32 -#define HEATER_CHAMBER_PIN 33 - -// -// Fans -// -#define FAN_PIN 8 - -// -// Auto fans -// -#define AUTO_FAN_PIN 30 -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E3_AUTO_FAN_PIN - #define E3_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef CHAMBER_AUTO_FAN_PIN - //#define CHAMBER_AUTO_FAN_PIN 10 -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define SD_DETECT_PIN 40 - -// Common I/O - -#define FIL_RUNOUT_PIN 9 -//#define FIL_RUNOUT_PIN 29 // encoder sensor -//#define PWM_1_PIN 12 -//#define PWM_2_PIN 13 -//#define SPARE_IO 17 -#define BEEPER_PIN 13 -#define STAT_LED_BLUE_PIN -1 -#define STAT_LED_RED_PIN 10 // 31 diff --git a/Marlin/src/pins/mega/pins_EINSTART-S.h b/Marlin/src/pins/mega/pins_EINSTART-S.h deleted file mode 100644 index 40d65c353e..0000000000 --- a/Marlin/src/pins/mega/pins_EINSTART-S.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Einstart-S pin assignments - * PCB Silkscreen: 3DPrinterCon_v3.5 - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Einstart-S" - -// -// Limit Switches -// -#define X_STOP_PIN 44 -#define Y_STOP_PIN 43 -#define Z_STOP_PIN 42 - -// -// Steppers -// -#define X_STEP_PIN 76 -#define X_DIR_PIN 75 -#define X_ENABLE_PIN 73 - -#define Y_STEP_PIN 31 -#define Y_DIR_PIN 32 -#define Y_ENABLE_PIN 72 - -#define Z_STEP_PIN 34 -#define Z_DIR_PIN 35 -#define Z_ENABLE_PIN 33 - -#define E0_STEP_PIN 36 -#define E0_DIR_PIN 37 -#define E0_ENABLE_PIN 30 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_BED_PIN 1 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 83 -#define HEATER_BED_PIN 38 - -#define FAN_PIN 82 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 4 - -////////////////////////// -// LCDs and Controllers // -////////////////////////// - -// -// LCD Display output pins -// - -// Requires #define U8GLIB_SH1106_EINSTART in Configuration.h -// u8glib constructor -// U8GLIB_SH1106_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS); - -#define LCD_PINS_DC 78 -#define LCD_PINS_RS 79 -// DOGM SPI LCD Support -#define DOGLCD_CS 3 -#define DOGLCD_MOSI 2 -#define DOGLCD_SCK 5 -#define DOGLCD_A0 2 - -// -// LCD Display input pins -// -#define BTN_UP 25 -#define BTN_DWN 26 -#define BTN_LFT 27 -#define BTN_RT 28 - -// 'OK' button -#define BTN_ENC 29 - -// Set Kill to right arrow, same as RIGID_PANEL -#define KILL_PIN 28 diff --git a/Marlin/src/pins/mega/pins_ELEFU_3.h b/Marlin/src/pins/mega/pins_ELEFU_3.h deleted file mode 100644 index af93c408a2..0000000000 --- a/Marlin/src/pins/mega/pins_ELEFU_3.h +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Elefu RA Board Pin Assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Elefu Ra v3" - -// -// Limit Switches -// -#define X_MIN_PIN 35 -#define X_MAX_PIN 34 -#define Y_MIN_PIN 33 -#define Y_MAX_PIN 32 -#define Z_MIN_PIN 31 -#define Z_MAX_PIN 30 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 30 -#endif - -// -// Steppers -// -#define X_STEP_PIN 49 -#define X_DIR_PIN 13 -#define X_ENABLE_PIN 48 - -#define Y_STEP_PIN 11 -#define Y_DIR_PIN 9 -#define Y_ENABLE_PIN 12 - -#define Z_STEP_PIN 7 -#define Z_DIR_PIN 6 -#define Z_ENABLE_PIN 8 - -#define E0_STEP_PIN 40 -#define E0_DIR_PIN 41 -#define E0_ENABLE_PIN 37 - -#define E1_STEP_PIN 18 -#define E1_DIR_PIN 19 -#define E1_ENABLE_PIN 38 - -#define E2_STEP_PIN 43 -#define E2_DIR_PIN 47 -#define E2_ENABLE_PIN 42 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 3 // Analog Input -#define TEMP_1_PIN 2 // Analog Input -#define TEMP_2_PIN 1 // Analog Input -#define TEMP_BED_PIN 0 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 45 // 12V PWM1 -#define HEATER_1_PIN 46 // 12V PWM2 -#define HEATER_2_PIN 17 // 12V PWM3 -#define HEATER_BED_PIN 44 // DOUBLE 12V PWM - -#ifndef FAN_PIN - #define FAN_PIN 16 // 5V PWM -#endif - -// -// Misc. Functions -// -#define PS_ON_PIN 10 // Set to -1 if using a manual switch on the PWRSW Connector -#define SLEEP_WAKE_PIN 26 // This feature still needs work -#define PHOTOGRAPH_PIN 29 - -// -// LCD / Controller -// -#define BEEPER_PIN 36 - -#if ENABLED(RA_CONTROL_PANEL) - - #define SDSS 53 - #define SD_DETECT_PIN 28 - - #define BTN_EN1 14 - #define BTN_EN2 39 - #define BTN_ENC 15 - -#endif // RA_CONTROL_PANEL - -#if ENABLED(RA_DISCO) - // variables for which pins the TLC5947 is using - #define TLC_CLOCK_PIN 25 - #define TLC_BLANK_PIN 23 - #define TLC_XLAT_PIN 22 - #define TLC_DATA_PIN 24 - - // We also need to define pin to port number mapping for the 2560 to match the pins listed above. - // If you change the TLC pins, update this as well per the 2560 datasheet! This currently only works with the RA Board. - #define TLC_CLOCK_BIT 3 - #define TLC_CLOCK_PORT &PORTA - - #define TLC_BLANK_BIT 1 - #define TLC_BLANK_PORT &PORTA - - #define TLC_DATA_BIT 2 - #define TLC_DATA_PORT &PORTA - - #define TLC_XLAT_BIT 0 - #define TLC_XLAT_PORT &PORTA - - // Change this to match your situation. Lots of TLCs takes up the arduino SRAM very quickly, so be careful - // Leave it at at least 1 if you have enabled RA_LIGHTING - // The number of TLC5947 boards chained together for use with the animation, additional ones will repeat the animation on them, but are not individually addressable and mimic those before them. You can leave the default at 2 even if you only have 1 TLC5947 module. - #define NUM_TLCS 2 - - // These TRANS_ARRAY values let you change the order the LEDs on the lighting modules will animate for chase functions. - // Modify them according to your specific situation. - // NOTE: the array should be 8 long for every TLC you have. These defaults assume (2) TLCs. - #define TRANS_ARRAY { 0, 1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8 } // forward - //#define TRANS_ARRAY { 7, 6, 5, 4, 3, 2, 1, 0, 8, 9, 10, 11, 12, 13, 14, 15 } // backward -#endif // RA_DISCO diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h deleted file mode 100644 index 2fe9a43ba1..0000000000 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Geeetech GT2560 Revision A board pin assignments, based on the work of - * George Robles (https://georges3dprinters.com) and - * Richard Smith - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "GT2560 Rev.A" -#endif -#define DEFAULT_MACHINE_NAME "Prusa i3 Pro B" - -// -// Limit Switches -// -#define X_MIN_PIN 22 -#define X_MAX_PIN 24 -#define Y_MIN_PIN 26 -#define Y_MAX_PIN 28 -#define Z_MIN_PIN 30 - -#if ENABLED(BLTOUCH) - #if MB(GT2560_REV_A_PLUS) - #define SERVO0_PIN 11 - #else - #define SERVO0_PIN 32 - #endif - #define Z_MAX_PIN -1 -#else - #define Z_MAX_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 25 -#define X_DIR_PIN 23 -#define X_ENABLE_PIN 27 - -#define Y_STEP_PIN 31 -#define Y_DIR_PIN 33 -#define Y_ENABLE_PIN 29 - -#define Z_STEP_PIN 37 -#define Z_DIR_PIN 39 -#define Z_ENABLE_PIN 35 - -#define E0_STEP_PIN 43 -#define E0_DIR_PIN 45 -#define E0_ENABLE_PIN 41 - -#define E1_STEP_PIN 49 -#define E1_DIR_PIN 47 -#define E1_ENABLE_PIN 48 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 8 -#define TEMP_1_PIN 9 -#define TEMP_BED_PIN 10 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define HEATER_1_PIN 3 -#define HEATER_BED_PIN 4 -#ifndef FAN_PIN - #define FAN_PIN 7 -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define PS_ON_PIN 12 -#define SUICIDE_PIN 54 // Must be enabled at startup to keep power flowing -#define KILL_PIN -1 - -#if HAS_WIRED_LCD - - #define BEEPER_PIN 18 - - #if ENABLED(NEWPANEL) - - #if ENABLED(MKS_MINI_12864) - #define DOGLCD_A0 5 - #define DOGLCD_CS 21 - #define BTN_EN1 40 - #define BTN_EN2 42 - #else - #define LCD_PINS_RS 20 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 16 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 5 - #define LCD_PINS_D7 6 - #define BTN_EN1 42 - #define BTN_EN2 40 - #endif - - #define BTN_ENC 19 - #define SD_DETECT_PIN 38 - - #else // !NEWPANEL - - #define SHIFT_CLK 38 - #define SHIFT_LD 42 - #define SHIFT_OUT 40 - #define SHIFT_EN 17 - - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 5 - #define LCD_PINS_D4 6 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 20 - #define LCD_PINS_D7 19 - - #define SD_DETECT_PIN -1 - - #endif // !NEWPANEL - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h b/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h deleted file mode 100644 index 7e2ce20c67..0000000000 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Geeetech GT2560 Revision A+ board pin assignments - */ - -#define BOARD_INFO_NAME "GT2560 Rev.A+" - -#include "pins_GT2560_REV_A.h" - -#if DISABLED(BLTOUCH) - #define SERVO0_PIN 32 -#endif diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h deleted file mode 100644 index d71a195419..0000000000 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * GT2560 RevB + GT2560 V3.0 + GT2560 V3.1 + GT2560 V4.0 pin assignment - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "GT2560 V3.0" -#endif - -// -// Servos -// -#define SERVO0_PIN 11 //13 untested 3Dtouch - -// -// Limit Switches -// -#ifndef X_STOP_PIN - #ifndef X_MIN_PIN - #define X_MIN_PIN 24 - #endif - #ifndef X_MAX_PIN - #define X_MAX_PIN 22 - #endif -#endif -#ifndef Y_STOP_PIN - #ifndef Y_MIN_PIN - #define Y_MIN_PIN 28 - #endif - #ifndef Y_MAX_PIN - #define Y_MAX_PIN 26 - #endif -#endif -#ifndef Z_STOP_PIN - #ifndef Z_MIN_PIN - #define Z_MIN_PIN 30 - #endif - #ifndef Z_MAX_PIN - #define Z_MAX_PIN 32 - #endif -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 66 -#endif -#ifndef FIL_RUNOUT2_PIN - #define FIL_RUNOUT2_PIN 67 -#endif - -// -// Power Recovery -// -#define POWER_LOSS_PIN 69 // Pin to detect power loss -#define POWER_LOSS_STATE LOW - -// -// Steppers -// -#define X_STEP_PIN 37 -#define X_DIR_PIN 39 -#define X_ENABLE_PIN 35 - -#define Y_STEP_PIN 31 -#define Y_DIR_PIN 33 -#define Y_ENABLE_PIN 29 - -#define Z_STEP_PIN 25 -#define Z_DIR_PIN 23 -#define Z_ENABLE_PIN 27 - -#define E0_STEP_PIN 46 -#define E0_DIR_PIN 44 -#define E0_ENABLE_PIN 12 - -#define E1_STEP_PIN 49 -#define E1_DIR_PIN 47 -#define E1_ENABLE_PIN 48 - -#define E2_STEP_PIN 43 -#define E2_DIR_PIN 45 -#define E2_ENABLE_PIN 41 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 11 // Analog Input -#define TEMP_1_PIN 9 // Analog Input -#define TEMP_2_PIN 8 // Analog Input -#define TEMP_BED_PIN 10 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 10 -#define HEATER_1_PIN 3 -#define HEATER_2_PIN 2 -#define HEATER_BED_PIN 4 -#define FAN_PIN 9 -#define FAN1_PIN 8 -#define FAN2_PIN 7 - -// -// Misc. Functions -// -#define SD_DETECT_PIN 38 -#define SDSS 53 -#define LED_PIN 13 // Use 6 (case light) for external LED. 13 is internal (yellow) LED. -#define PS_ON_PIN 12 -#define SUICIDE_PIN 54 // This pin must be enabled at boot to keep power flowing - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 6 // 21 -#endif - -// -// LCD Controller -// -#define BEEPER_PIN 18 - -#ifndef LCD_PINS_RS - #define LCD_PINS_RS 20 -#endif -#ifndef LCD_PINS_ENABLE - #define LCD_PINS_ENABLE 17 -#endif -#ifndef LCD_PINS_D4 - #define LCD_PINS_D4 16 -#endif -#ifndef LCD_PINS_D5 - #define LCD_PINS_D5 21 -#endif -#ifndef LCD_PINS_D6 - #define LCD_PINS_D6 5 -#endif -#ifndef LCD_PINS_D7 - #define LCD_PINS_D7 36 -#endif - -#if ENABLED(NEWPANEL) - #ifndef BTN_EN1 - #define BTN_EN1 42 - #endif - #ifndef BTN_EN2 - #define BTN_EN2 40 - #endif - #ifndef BTN_ENC - #define BTN_ENC 19 - #endif -#endif diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h deleted file mode 100644 index e1956488c6..0000000000 --- a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Geeetech A20M pin assignment - */ - -#define LCD_PINS_RS 5 -#define LCD_PINS_ENABLE 36 -#define LCD_PINS_D4 21 -#define LCD_PINS_D7 6 - -#define SPEAKER // The speaker can produce tones - -#if ENABLED(NEWPANEL) - #define BTN_EN1 16 - #define BTN_EN2 17 - #define BTN_ENC 19 -#endif - -#include "pins_GT2560_V3.h" diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h b/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h deleted file mode 100644 index 26721df364..0000000000 --- a/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/***************************************************************** - * GT2560 V3.0 pin assignment (for Mecreator 2) - *****************************************************************/ - -#define BOARD_INFO_NAME "GT2560 V3.0 (MC2)" - -#define X_MIN_PIN 22 -#define X_MAX_PIN 24 -#define Y_MIN_PIN 26 -#define Y_MAX_PIN 28 - -#include "pins_GT2560_V3.h" diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h deleted file mode 100644 index e30a65b90e..0000000000 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * HJC2560-C Rev2.x pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define DEFAULT_MACHINE_NAME "ADIMLab Gantry v2" -#define BOARD_INFO_NAME "HJC2560-C" - -// -// Servos -// -//#ifndef SERVO0_PIN -// #define SERVO0_PIN 11 -//#endif - -// -// Limit Switches -// -#define X_STOP_PIN 22 -#define Y_STOP_PIN 26 -#define Z_STOP_PIN 29 -//#define EXP_STOP_PIN 28 - -// -// Steppers -// -#define X_STEP_PIN 25 -#define X_DIR_PIN 23 -#define X_ENABLE_PIN 27 - -#define Y_STEP_PIN 32 -#define Y_DIR_PIN 33 -#define Y_ENABLE_PIN 31 - -#define Z_STEP_PIN 35 -#define Z_DIR_PIN 36 -#define Z_ENABLE_PIN 34 - -#define E0_STEP_PIN 42 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 37 - -#define E1_STEP_PIN 49 -#define E1_DIR_PIN 47 -#define E1_ENABLE_PIN 48 - -#define MOTOR_CURRENT_PWM_XY_PIN 44 -#define MOTOR_CURRENT_PWM_Z_PIN 45 -#define MOTOR_CURRENT_PWM_E_PIN 46 -// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range -#ifndef MOTOR_CURRENT_PWM_RANGE - #define MOTOR_CURRENT_PWM_RANGE 2000 -#endif -#define DEFAULT_PWM_MOTOR_CURRENT { 1300, 1300, 1250 } - -// -// Temperature Sensors -// -#define TEMP_0_PIN 8 // Analog Input -#define TEMP_1_PIN 9 // Analog Input -#define TEMP_BED_PIN 10 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define HEATER_1_PIN 3 -#define HEATER_BED_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 7 //默认不使用PWM_FAN冷却喷嘴,如果需要,则取消注释 -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define SD_DETECT_PIN 39 -//#define LED_PIN 8 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 8 // 8 默认挤出机风扇作为Case LED,如果需要PWM FAN,则需要将FAN_PIN置为7,LED_PIN置为8 -#endif - -//#define SAFETY_TRIGGERED_PIN 28 // PIN to detect the safety circuit has triggered -//#define MAIN_VOLTAGE_MEASURE_PIN 14 // ANALOG PIN to measure the main voltage, with a 100k - 4k7 resitor divider. - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if ENABLED(SPINDLE_LASER_ENABLE) - #define SPINDLE_DIR_PIN 16 - #define SPINDLE_LASER_ENABLE_PIN 17 // Pin should have a pullup! - #define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM -#endif - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #define BEEPER_PIN 18 - - #if ENABLED(NEWPANEL) - - #define LCD_PINS_RS 20 // LCD_CS - #define LCD_PINS_ENABLE 15 // LCD_SDA - #define LCD_PINS_D4 14 // LCD_SCK - - #if ENABLED(HJC_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 5 // LCD_Backlight - //#ifndef LCD_CONTRAST_PIN - // #define LCD_CONTRAST_PIN 5 // LCD_Contrast - //#endif - #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 24 // Filament runout - #endif - #else - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 5 - #define LCD_PINS_D7 6 - #endif - - #define BTN_EN1 41 - #define BTN_EN2 40 - #define BTN_ENC 19 - - #define SD_DETECT_PIN 39 - - #else - - // Buttons attached to a shift register - #define SHIFT_CLK 38 - #define SHIFT_LD 42 - #define SHIFT_OUT 40 - #define SHIFT_EN 17 - - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 5 - #define LCD_PINS_D4 6 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 20 - #define LCD_PINS_D7 19 - - #endif // !NEWPANEL - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h deleted file mode 100644 index be5f461dda..0000000000 --- a/Marlin/src/pins/mega/pins_INTAMSYS40.h +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Intamsys Funmat HT V4.0 Mainboard - * 4988 Drivers Tested - * 2208 version exists and may or may not work - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Intamsys 4.0" - -// -// Servos -// -#define SERVO0_PIN 12 // Uses High Temp Present Jumper Pin - -// -// Limit Switches -// -#define X_STOP_PIN 22 -#define Y_STOP_PIN 26 -#define Z_MIN_PIN 29 -#define Z_MAX_PIN 69 - -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 69 -#endif - -#define FIL_RUNOUT_PIN 10 - -// -// Steppers -// -#define X_STEP_PIN 25 -#define X_DIR_PIN 23 -#define X_ENABLE_PIN 27 // 44 - -#define Y_STEP_PIN 32 // 33 -#define Y_DIR_PIN 33 // 31, 32 -#define Y_ENABLE_PIN 31 // 32 - -#define Z_STEP_PIN 35 // 35 -#define Z_DIR_PIN 36 -#define Z_ENABLE_PIN 34 // 34 - -#define E0_STEP_PIN 42 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 37 - -#define E1_STEP_PIN 49 -#define E1_DIR_PIN 47 -#define E1_ENABLE_PIN 48 - -#define MOTOR_CURRENT_PWM_X_PIN 11 -#define MOTOR_CURRENT_PWM_Y_PIN 44 -#define MOTOR_CURRENT_PWM_Z_PIN 45 -#define MOTOR_CURRENT_PWM_E_PIN 46 - -// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range -#ifndef MOTOR_CURRENT_PWM_RANGE - #define MOTOR_CURRENT_PWM_RANGE 2000 -#endif -#define DEFAULT_PWM_MOTOR_CURRENT { 1300, 1300, 1250 } - -// -// Temperature Sensors -// -#define TEMP_0_PIN 8 // Analog Input D62 -#define TEMP_BED_PIN 10 // Analog Input D64 - -#define TEMP_CHAMBER_PIN 9 // Analog Input D63 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 // PWM -#define HEATER_BED_PIN 4 // PWM -#define HEATER_CHAMBER_PIN 3 // PWM -#define FAN_PIN 7 // PWM - -// -// Misc. Functions -// -#define SDSS 53 -#define SD_DETECT_PIN 39 - -#if ENABLED(CASE_LIGHT_ENABLE) - #define CASE_LIGHT_PIN 8 -#endif - -#if ENABLED(PSU_CONTROL) - #define PS_ON_PIN 38 // UPS Module -#endif - -// -// LCD Controller -// - -#define BEEPER_PIN 18 - -#if HAS_WIRED_LCD - #define LCD_PINS_RS 20 - #define LCD_PINS_ENABLE 30 - #define LCD_PINS_D4 14 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 5 - #define LCD_PINS_D7 6 - #define BTN_EN1 40 - #define BTN_EN2 41 - #define BTN_ENC 19 -#endif - -///////////////////// SPARE HEADERS ////////////// - -/** - * J25 - * 1 D54 - * 2 D55 - * 3 D56 - * 4 D57 - * 5 D58 - * 6 D59 - * 7 D60 - * 8 D61 - -Hotend High Temp Connected : D12 -*/ diff --git a/Marlin/src/pins/mega/pins_LEAPFROG.h b/Marlin/src/pins/mega/pins_LEAPFROG.h deleted file mode 100644 index 9e6802b24b..0000000000 --- a/Marlin/src/pins/mega/pins_LEAPFROG.h +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Leapfrog Driver board pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Leapfrog" - -// -// Limit Switches -// -#define X_MIN_PIN 47 -#define X_MAX_PIN 2 -#define Y_MIN_PIN 48 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 49 -#define Z_MAX_PIN -1 - -// -// Steppers -// -#define X_STEP_PIN 28 -#define X_DIR_PIN 63 -#define X_ENABLE_PIN 29 - -#define Y_STEP_PIN 14 // A6 -#define Y_DIR_PIN 15 // A0 -#define Y_ENABLE_PIN 39 - -#define Z_STEP_PIN 31 // A2 -#define Z_DIR_PIN 32 // A6 -#define Z_ENABLE_PIN 30 // A1 - -#define E0_STEP_PIN 34 // 34 -#define E0_DIR_PIN 35 // 35 -#define E0_ENABLE_PIN 33 // 33 - -#define E1_STEP_PIN 37 // 37 -#define E1_DIR_PIN 40 // 40 -#define E1_ENABLE_PIN 36 // 36 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 // Analog Input (D27) -#define TEMP_1_PIN 15 // Analog Input (1) -#define TEMP_BED_PIN 14 // Analog Input (1,2 or I2C) - -// -// Heaters / Fans -// -#define HEATER_0_PIN 9 -#define HEATER_1_PIN 8 // 12 -#define HEATER_2_PIN 11 // 13 -#define HEATER_BED_PIN 10 // 14/15 - -#define FAN_PIN 7 - -// -// Misc. Functions -// -#define SDSS 11 -#define LED_PIN 13 -#define SOL1_PIN 16 -#define SOL2_PIN 17 - -/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */ diff --git a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h deleted file mode 100644 index 9c316aa759..0000000000 --- a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Leapfrog Xeed Driver board pin assignments - * - * This board is used by other Leapfrog printers in addition to the Xeed, - * such as the Creatr HS and Bolt. The pin assignments vary wildly between - * printer models. As such this file is currently specific to the Xeed. - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Leapfrog Xeed 2015" - -// -// Limit Switches -// -#define X_STOP_PIN 47 // 'X Min' -#define Y_STOP_PIN 48 // 'Y Min' -#define Z_STOP_PIN 49 // 'Z Min' - -// -// Steppers -// The Xeed utilizes three Z-axis motors, which use the X, Y, and Z stepper connectors -// on the board. The X and Y steppers use external drivers, attached to signal-level -// Y-axis and X-axis connectors on the board, which map to distinct CPU pins from -// the on-board X/Y stepper drivers. -// - -// X-axis signal-level connector -#define X_STEP_PIN 65 -#define X_DIR_PIN 64 -#define X_ENABLE_PIN 66 // Not actually used on Xeed, could be repurposed - -// Y-axis signal-level connector -#define Y_STEP_PIN 23 -#define Y_DIR_PIN 22 -#define Y_ENABLE_PIN 24 // Not actually used on Xeed, could be repurposed - -// ZMOT connector (Front Right Z Motor) -#define Z_STEP_PIN 31 -#define Z_DIR_PIN 32 -#define Z_ENABLE_PIN 30 - -// XMOT connector (Rear Z Motor) -#define Z2_STEP_PIN 28 -#define Z2_DIR_PIN 63 -#define Z2_ENABLE_PIN 29 - -// YMOT connector (Front Left Z Motor) -#define Z3_STEP_PIN 14 -#define Z3_DIR_PIN 15 -#define Z3_ENABLE_PIN 39 - -// EMOT2 connector -#define E0_STEP_PIN 37 -#define E0_DIR_PIN 40 -#define E0_ENABLE_PIN 36 - -// EMOT connector -#define E1_STEP_PIN 34 -#define E1_DIR_PIN 35 -#define E1_ENABLE_PIN 33 - -// -// Filament runout -// -#define FIL_RUNOUT_PIN 42 // ROT2 Connector -#define FIL_RUNOUT2_PIN 44 // ROT1 Connector - -// -// Temperature Sensors -// -#define TEMP_0_PIN 15 // T3 Connector -#define TEMP_1_PIN 13 // T1 Connector -#define TEMP_BED_PIN 14 // BED Connector (Between T1 and T3) - -// -// Heaters / Fans -// -#define HEATER_0_PIN 8 // Misc Connector, pins 3 and 4 (Out2) -#define HEATER_1_PIN 9 // Misc Connector, pins 5 and 6 (Out3) -#define HEATER_BED_PIN 6 // Misc Connector, pins 9(-) and 10(+) (OutA) - -#define FAN_PIN 10 // Misc Connector, pins 7(-) and 8 (+) (Out4) - -#define LED_PIN 13 - -#define SOL1_PIN 7 // Misc Connector, pins 1(-) and 2(+) (Out1) - -// Door Closed Sensor -//#define DOOR_PIN 45 // HM1 Connector diff --git a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h deleted file mode 100644 index 938ad82eff..0000000000 --- a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Mega controller pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Mega Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Mega Controller" - -// -// Servos -// -#define SERVO0_PIN 30 -#define SERVO1_PIN 31 -#define SERVO2_PIN 32 -#define SERVO3_PIN 33 - -// -// Limit Switches -// -#define X_MIN_PIN 43 -#define X_MAX_PIN 42 -#define Y_MIN_PIN 38 -#define Y_MAX_PIN 41 -#define Z_MIN_PIN 40 -#define Z_MAX_PIN 37 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 37 -#endif - -// -// Steppers -// -#define X_STEP_PIN 62 // A8 -#define X_DIR_PIN 63 // A9 -#define X_ENABLE_PIN 61 // A7 - -#define Y_STEP_PIN 65 // A11 -#define Y_DIR_PIN 66 // A12 -#define Y_ENABLE_PIN 64 // A10 - -#define Z_STEP_PIN 68 // A14 -#define Z_DIR_PIN 69 // A15 -#define Z_ENABLE_PIN 67 // A13 - -#define E0_STEP_PIN 23 -#define E0_DIR_PIN 24 -#define E0_ENABLE_PIN 22 - -#define E1_STEP_PIN 26 -#define E1_DIR_PIN 27 -#define E1_ENABLE_PIN 25 - -// -// Temperature Sensors -// -#if TEMP_SENSOR_0 == -1 - #define TEMP_0_PIN 4 // Analog Input -#else - #define TEMP_0_PIN 0 // Analog Input -#endif - -#if TEMP_SENSOR_1 == -1 - #define TEMP_1_PIN 5 // Analog Input -#else - #define TEMP_1_PIN 2 // Analog Input -#endif - -#define TEMP_2_PIN 3 // Analog Input - -#if TEMP_SENSOR_BED == -1 - #define TEMP_BED_PIN 6 // Analog Input -#else - #define TEMP_BED_PIN 1 // Analog Input -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 29 -#define HEATER_1_PIN 34 -#define HEATER_BED_PIN 28 - -#ifndef FAN_PIN - #define FAN_PIN 39 -#endif -#define FAN1_PIN 35 -#define FAN2_PIN 36 - -#ifndef CONTROLLER_FAN_PIN - #define CONTROLLER_FAN_PIN FAN2_PIN -#endif - -#define FAN_SOFT_PWM - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 2 -#endif - -// -// LCD / Controller -// -#if ENABLED(MINIPANEL) - - #define BEEPER_PIN 46 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 47 - #define DOGLCD_CS 45 - #define LCD_BACKLIGHT_PIN 44 // backlight LED on PA3 - - #define KILL_PIN 12 - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - #define BTN_EN1 48 - #define BTN_EN2 11 - #define BTN_ENC 10 - - #define SD_DETECT_PIN 49 - -#endif // MINIPANEL - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 7 // Pullup! -#define SPINDLE_DIR_PIN 8 diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h deleted file mode 100644 index 1c37b21ab7..0000000000 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MegaTronics pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Megatronics" -// -// Limit Switches -// -#define X_MIN_PIN 41 -#define X_MAX_PIN 37 -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 19 -#endif - -// -// Steppers -// -#define X_STEP_PIN 26 -#define X_DIR_PIN 28 -#define X_ENABLE_PIN 24 - -#define Y_STEP_PIN 60 // A6 -#define Y_DIR_PIN 61 // A7 -#define Y_ENABLE_PIN 22 - -#define Z_STEP_PIN 54 // A0 -#define Z_DIR_PIN 55 // A1 -#define Z_ENABLE_PIN 56 // A2 - -#define E0_STEP_PIN 31 -#define E0_DIR_PIN 32 -#define E0_ENABLE_PIN 38 - -#define E1_STEP_PIN 34 -#define E1_DIR_PIN 36 -#define E1_ENABLE_PIN 30 - -// -// Temperature Sensors -// -#if TEMP_SENSOR_0 == -1 - #define TEMP_0_PIN 8 // Analog Input -#else - #define TEMP_0_PIN 13 // Analog Input -#endif -#define TEMP_1_PIN 15 // Analog Input -#define TEMP_BED_PIN 14 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 9 -#define HEATER_1_PIN 8 -#define HEATER_BED_PIN 10 - -#ifndef FAN_PIN - #define FAN_PIN 7 // IO pin. Buffer needed -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define PS_ON_PIN 12 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 2 -#endif - -// -// LCD / Controller -// -#define BEEPER_PIN 33 - -#if BOTH(ULTRA_LCD, NEWPANEL) - - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 - - // Buttons directly attached to AUX-2 - #define BTN_EN1 59 - #define BTN_EN2 64 - #define BTN_ENC 43 - - #define SD_DETECT_PIN -1 // RAMPS doesn't use this - -#endif // ULTRA_LCD && NEWPANEL - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_PWM_PIN 3 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 4 // Pullup! -#define SPINDLE_DIR_PIN 11 diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h deleted file mode 100644 index ff7cf15714..0000000000 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MegaTronics v2.0 pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Megatronics v2.0" -// -// Limit Switches -// -#define X_MIN_PIN 37 -#define X_MAX_PIN 40 -#define Y_MIN_PIN 41 -#define Y_MAX_PIN 38 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 19 -#endif - -// -// Steppers -// -#define X_STEP_PIN 26 -#define X_DIR_PIN 27 -#define X_ENABLE_PIN 25 - -#define Y_STEP_PIN 4 // A6 -#define Y_DIR_PIN 54 // A0 -#define Y_ENABLE_PIN 5 - -#define Z_STEP_PIN 56 // A2 -#define Z_DIR_PIN 60 // A6 -#define Z_ENABLE_PIN 55 // A1 - -#define E0_STEP_PIN 35 -#define E0_DIR_PIN 36 -#define E0_ENABLE_PIN 34 - -#define E1_STEP_PIN 29 -#define E1_DIR_PIN 39 -#define E1_ENABLE_PIN 28 - -#define E2_STEP_PIN 23 // ? schematic says 24 -#define E2_DIR_PIN 24 // ? schematic says 23 -#define E2_ENABLE_PIN 22 - -// -// Temperature Sensors -// -#if TEMP_SENSOR_0 == -1 - #define TEMP_0_PIN 4 // Analog Input -#else - #define TEMP_0_PIN 13 // Analog Input -#endif - -#if TEMP_SENSOR_1 == -1 - #define TEMP_1_PIN 8 // Analog Input -#else - #define TEMP_1_PIN 15 // Analog Input -#endif - -#if TEMP_SENSOR_BED == -1 - #define TEMP_BED_PIN 8 // Analog Input -#else - #define TEMP_BED_PIN 14 // Analog Input -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 9 -#define HEATER_1_PIN 8 -#define HEATER_BED_PIN 10 - -#ifndef FAN_PIN - #define FAN_PIN 7 -#endif -#define FAN1_PIN 6 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define PS_ON_PIN 12 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 2 -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_PWM_PIN 3 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 16 // Pullup! -#define SPINDLE_DIR_PIN 11 - -// -// LCD / Controller -// -#define BEEPER_PIN 64 - -#if HAS_WIRED_LCD - - #define LCD_PINS_RS 14 - #define LCD_PINS_ENABLE 15 - #define LCD_PINS_D4 30 - #define LCD_PINS_D5 31 - #define LCD_PINS_D6 32 - #define LCD_PINS_D7 33 - - #if ENABLED(NEWPANEL) - // Buttons are directly attached using keypad - #define BTN_EN1 61 - #define BTN_EN2 59 - #define BTN_ENC 43 - #else - // Buttons attached to shift register of reprapworld keypad v1.1 - #define SHIFT_CLK 63 - #define SHIFT_LD 42 - #define SHIFT_OUT 17 - #define SHIFT_EN 17 - #endif - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h deleted file mode 100644 index 45ebd163a7..0000000000 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h +++ /dev/null @@ -1,198 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MegaTronics v3.0 / v3.1 / v3.2 pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#if MB(MEGATRONICS_32) - #define BOARD_INFO_NAME "Megatronics v3.2" -#elif MB(MEGATRONICS_31) - #define BOARD_INFO_NAME "Megatronics v3.1" -#else - #define BOARD_INFO_NAME "Megatronics v3.0" -#endif - -// -// Servos -// -#define SERVO0_PIN 46 // AUX3-6 -#define SERVO1_PIN 47 // AUX3-5 -#define SERVO2_PIN 48 // AUX3-4 -#define SERVO3_PIN 49 // AUX3-3 - -// -// Limit Switches -// -#define X_MIN_PIN 37 // No INT -#define X_MAX_PIN 40 // No INT -#define Y_MIN_PIN 41 // No INT -#define Y_MAX_PIN 38 // No INT -#define Z_MIN_PIN 18 // No INT -#define Z_MAX_PIN 19 // No INT - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 19 -#endif - -// -// Steppers -// -#define X_STEP_PIN 58 -#define X_DIR_PIN 57 -#define X_ENABLE_PIN 59 - -#define Y_STEP_PIN 5 -#define Y_DIR_PIN 17 -#define Y_ENABLE_PIN 4 - -#define Z_STEP_PIN 16 -#define Z_DIR_PIN 11 -#define Z_ENABLE_PIN 3 - -#define E0_STEP_PIN 28 -#define E0_DIR_PIN 27 -#define E0_ENABLE_PIN 29 - -#define E1_STEP_PIN 25 -#define E1_DIR_PIN 24 -#define E1_ENABLE_PIN 26 - -#define E2_STEP_PIN 22 -#define E2_DIR_PIN 60 -#define E2_ENABLE_PIN 23 - -// -// Temperature Sensors -// -#if TEMP_SENSOR_0 == -1 - #define TEMP_0_PIN 11 // Analog Input -#else - #define TEMP_0_PIN 15 // Analog Input -#endif -#if TEMP_SENSOR_1 == -1 - #define TEMP_1_PIN 10 // Analog Input -#else - #define TEMP_1_PIN 13 // Analog Input -#endif -#if TEMP_SENSOR_2 == -1 - #define TEMP_2_PIN 9 // Analog Input -#else - #define TEMP_2_PIN 12 // Analog Input -#endif -#if TEMP_SENSOR_BED == -1 - #define TEMP_BED_PIN 8 // Analog Input -#else - #define TEMP_BED_PIN 14 // Analog Input -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define HEATER_1_PIN 9 -#define HEATER_2_PIN 8 -#define HEATER_BED_PIN 10 - -#ifndef FAN_PIN - #define FAN_PIN 6 -#endif -#define FAN1_PIN 7 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define PS_ON_PIN 12 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 45 // Try the keypad connector -#endif - -// -// LCD / Controller -// -#define BEEPER_PIN 61 - -#define BTN_EN1 44 -#define BTN_EN2 45 -#define BTN_ENC 33 - -#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define LCD_PINS_RS 56 // CS chip select / SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - #define SD_DETECT_PIN 35 - -#else - - #define LCD_PINS_RS 32 - #define LCD_PINS_ENABLE 31 - #define LCD_PINS_D4 14 - #define LCD_PINS_D5 30 - #define LCD_PINS_D6 39 - #define LCD_PINS_D7 15 - - #define SHIFT_CLK 43 - #define SHIFT_LD 35 - #define SHIFT_OUT 34 - #define SHIFT_EN 44 - - #if MB(MEGATRONICS_31, MEGATRONICS_32) - #define SD_DETECT_PIN 56 - #endif - -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if DISABLED(REPRAPWORLD_KEYPAD) // try to use the keypad connector first - #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM - #define SPINDLE_LASER_ENA_PIN 43 // Pullup! - #define SPINDLE_DIR_PIN 42 -#elif EXTRUDERS <= 2 - // Hijack the last extruder so that we can get the PWM signal off the Y breakout - // Move Y to the E2 plug. This makes dual Y steppers harder - #undef Y_ENABLE_PIN // 4 - #undef Y_STEP_PIN // 5 - #undef Y_DIR_PIN // 17 - #undef E2_ENABLE_PIN // 23 - #undef E2_STEP_PIN // 22 - #undef E2_DIR_PIN // 60 - #define Y_ENABLE_PIN 23 - #define Y_STEP_PIN 22 - #define Y_DIR_PIN 60 - #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM - #define SPINDLE_LASER_ENA_PIN 17 // Pullup! - #define SPINDLE_DIR_PIN 5 -#endif diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h deleted file mode 100644 index 963911ec5d..0000000000 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ /dev/null @@ -1,303 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Mightyboard Rev.E pin assignments - * also works for Rev D boards. It's all rev E despite what the silk screen says - */ - -/** - * Rev B 2 JAN 2017 - * - * Added pin definitions for: - * M3, M4 & M5 spindle control commands - * case light - * - * Corrected pin assignment for EX2_HEAT_PIN pin. Changed it from 9 to 11. The port - * number (B5) agrees with the schematic but B5 is assigned to logical pin 11. - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Mightyboard" -#define DEFAULT_MACHINE_NAME "MB Replicator" - -// -// Servos -// -#define SERVO0_PIN 36 // C1 (1280-EX1) -#define SERVO1_PIN 37 // C0 (1280-EX2) -#define SERVO2_PIN 40 // G1 (1280-EX3) -#define SERVO3_PIN 41 // G0 (1280-EX4) - -// -// Limit Switches -// -#define X_MIN_PIN 49 // L0 -#define X_MAX_PIN 48 // L1 -#define Y_MIN_PIN 47 // L2 -#define Y_MAX_PIN 46 // L3 -#define Z_MIN_PIN 43 // L6 -#define Z_MAX_PIN 42 // L7 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 42 -#endif - -// -// Filament Runout Pins -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 49 -#endif -#ifndef FIL_RUNOUT2_PIN - #define FIL_RUNOUT2_PIN 47 -#endif - -// -// Steppers -// -#define X_STEP_PIN 55 // F1 -#define X_DIR_PIN 54 // F0 -#define X_ENABLE_PIN 56 // F2 - -#define Y_STEP_PIN 59 // F5 -#define Y_DIR_PIN 58 // F4 -#define Y_ENABLE_PIN 60 // F6 - -#define Z_STEP_PIN 63 // K1 -#define Z_DIR_PIN 62 // K0 -#define Z_ENABLE_PIN 64 // K2 - -#define E0_STEP_PIN 25 // A3 -#define E0_DIR_PIN 24 // A2 -#define E0_ENABLE_PIN 26 // A4 - -#define E1_STEP_PIN 29 // A7 -#define E1_DIR_PIN 28 // A6 -#define E1_ENABLE_PIN 39 // G2 - -// -// I2C Digipots - MCP4018 -// Address 5E (2F << 1) -// Set from 0 - 127 with stop bit. -// (Ex. 3F << 1 | 1) -// -#define DIGIPOTS_I2C_SCL 76 // J5 -#define DIGIPOTS_I2C_SDA_X 57 // F3 -#define DIGIPOTS_I2C_SDA_Y 61 // F7 -#define DIGIPOTS_I2C_SDA_Z 65 // K3 -#define DIGIPOTS_I2C_SDA_E0 27 // A5 -#define DIGIPOTS_I2C_SDA_E1 77 // J6 - -#ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address (5E <- 2F << 1) -#endif - -// -// Temperature Sensors -// -// K7 - 69 / ADC15 - 15 -#define TEMP_BED_PIN 15 - -// SPI for Max6675 or Max31855 Thermocouple -// Uses a separate SPI bus -// -// 3 E5 DO (SO) -// 5 E3 CS1 -// 2 E4 CS2 -// 78 E2 SCK -// -#define THERMO_SCK_PIN 78 // E2 -#define THERMO_DO_PIN 3 // E5 -#define THERMO_CS1_PIN 5 // E3 -#define THERMO_CS2_PIN 2 // E4 - -#define MAX6675_SS_PIN THERMO_CS1_PIN -#define MAX6675_SS2_PIN THERMO_CS2_PIN -#define MAX6675_SCK_PIN THERMO_SCK_PIN -#define MAX6675_DO_PIN THERMO_DO_PIN - -// -// Augmentation for auto-assigning plugs -// -// Two thermocouple connectors allows for either -// 2 extruders or 1 extruder and a heated bed. -// With no heated bed, an additional 24V fan is possible. -// - -// Labels from the schematic: -#define EX1_HEAT_PIN 6 // H3 -#define EX1_FAN_PIN 7 // H4 -#define EX2_HEAT_PIN 11 // B5 -#define EX2_FAN_PIN 12 // B6 -#define HBP_PIN 45 // L4 -#define EXTRA_FET_PIN 44 // L5 - -#if HAS_MULTI_HOTEND - #if TEMP_SENSOR_BED - #define IS_EEB - #else - #define IS_EEF - #endif -#elif TEMP_SENSOR_BED - #define IS_EFB -#else - #define IS_EFF -#endif - -// -// Heaters / Fans (24V) -// -#define HEATER_0_PIN EX1_HEAT_PIN - -#if ENABLED(IS_EFB) // Hotend, Fan, Bed - #define HEATER_BED_PIN HBP_PIN -#elif ENABLED(IS_EEF) // Hotend, Hotend, Fan - #define HEATER_1_PIN EX2_HEAT_PIN -#elif ENABLED(IS_EEB) // Hotend, Hotend, Bed - #define HEATER_1_PIN EX2_HEAT_PIN - #define HEATER_BED_PIN HBP_PIN -#elif ENABLED(IS_EFF) // Hotend, Fan, Fan - #define FAN1_PIN HBP_PIN -#endif - -#ifndef FAN_PIN - #if EITHER(IS_EFB, IS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan - #define FAN_PIN EX2_HEAT_PIN - #elif EITHER(IS_EEF, IS_SF) // Hotend, Hotend, Fan or Spindle, Fan - #define FAN_PIN HBP_PIN - #else - #define FAN_PIN EXTRA_FET_PIN - #endif -#endif - -#ifndef CONTROLLER_FAN_PIN - #define CONTROLLER_FAN_PIN EX2_FAN_PIN -#endif - -// -// Misc. Functions -// -#define LED_PIN 13 // B7 -#define CUTOFF_RESET_PIN 16 // H1 -#define CUTOFF_TEST_PIN 17 // H0 -#define CUTOFF_SR_CHECK_PIN 70 // G4 (TOSC1) - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - - #define LCD_PINS_RS 33 // C4: LCD-STROBE - #define LCD_PINS_ENABLE 72 // J2: LEFT - #define LCD_PINS_D4 35 // C2: LCD-CLK - #define LCD_PINS_D5 32 // C5: RLED - #define LCD_PINS_D6 34 // C3: LCD-DATA - #define LCD_PINS_D7 31 // C6: GLED - - #define BTN_EN2 75 // J4, UP - #define BTN_EN1 73 // J3, DOWN - //STOP button connected as KILL_PIN - #define KILL_PIN 14 // J1, RIGHT - //KILL - not connected - - #define BEEPER_PIN 8 // H5, SD_WP - - //on board leds - #define STAT_LED_RED_LED SERVO0_PIN // C1 (1280-EX1, DEBUG2) - #define STAT_LED_BLUE_PIN SERVO1_PIN // C0 (1280-EX2, DEBUG3) - - #else - // Replicator uses a 3-wire SR controller with HD44780 - #define SR_DATA_PIN 34 // C3 - #define SR_CLK_PIN 35 // C2 - #define SR_STROBE_PIN 33 // C4 - - #define BTN_UP 75 // J4 - #define BTN_DWN 73 // J3 - #define BTN_LFT 72 // J2 - #define BTN_RT 14 // J1 - - // Disable encoder - #undef BTN_EN1 - #undef BTN_EN2 - - #define BEEPER_PIN 4 // G5 - - #define STAT_LED_RED_PIN 32 // C5 - #define STAT_LED_BLUE_PIN 31 // C6 (Actually green) - - #endif - - #define BTN_CENTER 15 // J0 - #define BTN_ENC BTN_CENTER - -#endif // HAS_WIRED_LCD - -// -// SD Card -// -#define SDSS 53 // B0 -#define SD_DETECT_PIN 9 // H6 - -// -// TMC 220x -// -#if HAS_TMC_UART - /** - * TMC220x stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - #define X_HARDWARE_SERIAL Serial2 - #define Y_HARDWARE_SERIAL Serial1 - - /** - * Software serial - */ - - #define X_SERIAL_TX_PIN 16 - #define X_SERIAL_RX_PIN 17 - - #define Y_SERIAL_TX_PIN 18 - #define Y_SERIAL_RX_PIN 19 - - #define Z_SERIAL_TX_PIN 41 - #define Z_SERIAL_RX_PIN 66 - - #define E0_SERIAL_TX_PIN 40 - #define E0_SERIAL_RX_PIN 67 - - #define E1_SERIAL_TX_PIN 37 - #define E1_SERIAL_RX_PIN 68 - -#endif diff --git a/Marlin/src/pins/mega/pins_MINITRONICS.h b/Marlin/src/pins/mega/pins_MINITRONICS.h deleted file mode 100644 index bbe746461e..0000000000 --- a/Marlin/src/pins/mega/pins_MINITRONICS.h +++ /dev/null @@ -1,142 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Minitronics v1.0/1.1 pin assignments - */ - -/** - * Rev B 2 JAN 2017 - * - * Added pin definitions for M3, M4 & M5 spindle control commands - */ - -#if NOT_TARGET(__AVR_ATmega1281__) - #error "Oops! Select 'Minitronics' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Minitronics supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Minitronics v1.0/1.1" -// -// Limit Switches -// -#define X_MIN_PIN 5 -#define X_MAX_PIN 2 -#define Y_MIN_PIN 2 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 6 -#define Z_MAX_PIN -1 - -// -// Steppers -// -#define X_STEP_PIN 48 -#define X_DIR_PIN 47 -#define X_ENABLE_PIN 49 - -#define Y_STEP_PIN 39 // A6 -#define Y_DIR_PIN 40 // A0 -#define Y_ENABLE_PIN 38 - -#define Z_STEP_PIN 42 // A2 -#define Z_DIR_PIN 43 // A6 -#define Z_ENABLE_PIN 41 // A1 - -#define E0_STEP_PIN 45 -#define E0_DIR_PIN 44 -#define E0_ENABLE_PIN 27 - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 35 -#define E1_ENABLE_PIN 37 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 7 // Analog Input -#define TEMP_1_PIN 6 // Analog Input -#define TEMP_BED_PIN 6 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 7 // EXTRUDER 1 -#define HEATER_1_PIN 8 // EXTRUDER 2 -#define HEATER_BED_PIN 3 // BED - -#ifndef FAN_PIN - #define FAN_PIN 9 -#endif - -// -// Misc. Functions -// -#define SDSS 16 -#define LED_PIN 46 - -// -// LCD / Controller -// -#define BEEPER_PIN -1 - -#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define LCD_PINS_RS 15 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 11 // SID (MOSI) - #define LCD_PINS_D4 10 // SCK (CLK) clock - - #define BTN_EN1 18 - #define BTN_EN2 17 - #define BTN_ENC 25 - - #define SD_DETECT_PIN 30 - -#else - - #define LCD_PINS_RS -1 - #define LCD_PINS_ENABLE -1 - - // Buttons are directly attached using keypad - #define BTN_EN1 -1 - #define BTN_EN2 -1 - #define BTN_ENC -1 - - #define SD_DETECT_PIN -1 // Minitronics doesn't use this -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER // assumes we're only doing CNC work (no 3D printing) - #undef HEATER_BED_PIN - #undef TEMP_BED_PIN // need to free up some pins but also need to - #undef TEMP_0_PIN // re-assign them (to unused pins) because Marlin - #undef TEMP_1_PIN // requires the presence of certain pins or else it - #define HEATER_BED_PIN 4 // won't compile - #define TEMP_BED_PIN 50 - #define TEMP_0_PIN 51 - #define SPINDLE_LASER_ENA_PIN 52 // using A6 because it already has a pullup - #define SPINDLE_LASER_PWM_PIN 3 // WARNING - LED & resistor pull up to +12/+24V stepper voltage - #define SPINDLE_DIR_PIN 53 -#endif diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h deleted file mode 100644 index 045c1bc0fa..0000000000 --- a/Marlin/src/pins/mega/pins_OVERLORD.h +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Dreammaker Overlord v1.1 pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Overlord Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "OVERLORD" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// Limit Switches -// -#define X_STOP_PIN 24 -#define Y_STOP_PIN 28 -#define Z_MIN_PIN 46 -#define Z_MAX_PIN 32 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 46 // JP4, Tfeed1 -#endif - -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - #define FIL_RUNOUT_PIN 44 // JP3, Tfeed2 -#endif - -// -// Steppers -// -#define X_STEP_PIN 25 -#define X_DIR_PIN 23 -#define X_ENABLE_PIN 27 - -#define Y_STEP_PIN 31 -#define Y_DIR_PIN 33 -#define Y_ENABLE_PIN 29 - -#define Z_STEP_PIN 37 -#define Z_DIR_PIN 39 -#define Z_ENABLE_PIN 35 - -#define E0_STEP_PIN 43 -#define E0_DIR_PIN 45 -#define E0_ENABLE_PIN 41 - -#define E1_STEP_PIN 49 -#define E1_DIR_PIN 47 -#define E1_ENABLE_PIN 48 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 8 // Analog Input -#define TEMP_1_PIN 9 // Analog Input - Redundant temp sensor -#define TEMP_2_PIN 12 // Analog Input -#define TEMP_3_PIN 14 // Analog Input -#define TEMP_BED_PIN 10 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define HEATER_1_PIN 3 -#define HEATER_BED_PIN 4 - -#define FAN_PIN 7 // material cooling fan - -// -// SD Card -// -#define SDSS 53 -#define SD_DETECT_PIN 38 - -// -// Misc. Functions -// -#define LED_PIN 13 // On PCB status led -#define PS_ON_PIN 12 // For stepper/heater/fan power. Active HIGH. -#define POWER_LOSS_PIN 34 // Power check - whether hotends/steppers/fans have power - -#if ENABLED(BATTERY_STATUS_AVAILABLE) - #undef BATTERY_STATUS_PIN - #define BATTERY_STATUS_PIN 26 // Status of power loss battery, whether it is charged (low) or charging (high) -#endif -#if ENABLED(INPUT_VOLTAGE_AVAILABLE) - #undef VOLTAGE_DETECTION_PIN - #define VOLTAGE_DETECTION_PIN 11 // Analog Input - ADC Voltage level of main input -#endif - -// -// LCD / Controller -// -#if HAS_MARLINUI_U8GLIB - // OVERLORD OLED pins - #define LCD_PINS_RS 20 - #define LCD_PINS_D5 21 - #define LCD_PINS_ENABLE 15 - #define LCD_PINS_D4 14 - #define LCD_PINS_D6 5 - #define LCD_PINS_D7 6 - #ifndef LCD_RESET_PIN - #define LCD_RESET_PIN 5 // LCD_PINS_D6 - #endif -#endif - -#if ENABLED(NEWPANEL) - #define BTN_ENC 16 // Enter Pin - #define BTN_UP 19 // Button UP Pin - #define BTN_DWN 17 // Button DOWN Pin -#endif - -// Additional connectors/pins on the Overlord V1.X board -#define PCB_VERSION_PIN 22 -#define APPROACH_PIN 11 // JP7, Tpd -#define GATE_PIN 36 // Threshold, JP6, Tg diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h deleted file mode 100644 index ff4d3e834d..0000000000 --- a/Marlin/src/pins/mega/pins_PICA.h +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Arduino Mega with PICA pin assignments - * - * PICA is Power, Interface, and Control Adapter and is open source hardware. - * See https://github.com/mjrice/PICA for schematics etc. - * - * Applies to PICA, PICA_REVB - */ - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "PICA" -#endif - -/* -// Note that these are the "pins" that correspond to the analog inputs on the arduino mega. -// These are not the same as the physical pin numbers - AD0 = 54; AD1 = 55; AD2 = 56; AD3 = 57; - AD4 = 58; AD5 = 59; AD6 = 60; AD7 = 61; - AD8 = 62; AD9 = 63; AD10 = 64; AD11 = 65; - AD12 = 66; AD13 = 67; AD14 = 68; AD15 = 69; -*/ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." -#endif - -// -// Servos -// -#define SERVO0_PIN 3 -#define SERVO1_PIN 4 -#define SERVO2_PIN 5 -// -// Limit Switches -// -#define X_MIN_PIN 14 -#define X_MAX_PIN 15 -#define Y_MIN_PIN 16 -#define Y_MAX_PIN 17 -#define Z_MIN_PIN 23 -#define Z_MAX_PIN 22 - -// -// Steppers -// -#define X_STEP_PIN 55 -#define X_DIR_PIN 54 -#define X_ENABLE_PIN 60 - -#define Y_STEP_PIN 57 -#define Y_DIR_PIN 56 -#define Y_ENABLE_PIN 61 - -#define Z_STEP_PIN 59 -#define Z_DIR_PIN 58 -#define Z_ENABLE_PIN 62 - -#define E0_STEP_PIN 67 -#define E0_DIR_PIN 24 -#define E0_ENABLE_PIN 26 - -#define E1_STEP_PIN 68 -#define E1_DIR_PIN 28 -#define E1_ENABLE_PIN 27 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 9 // Analog Input -#define TEMP_1_PIN 10 -#define TEMP_BED_PIN 10 -#define TEMP_2_PIN 11 -#define TEMP_3_PIN 12 - -// -// Heaters / Fans -// -#ifndef HEATER_0_PIN - #define HEATER_0_PIN 10 // E0 -#endif -#ifndef HEATER_1_PIN - #define HEATER_1_PIN 2 // E1 -#endif -#define HEATER_BED_PIN 8 // HEAT-BED - -#ifndef FAN_PIN - #define FAN_PIN 9 -#endif -#ifndef FAN_2_PIN - #define FAN_2_PIN 7 -#endif - -#define SDPOWER_PIN -1 -#define LED_PIN -1 -#define PS_ON_PIN -1 -#define KILL_PIN -1 - -#define SSR_PIN 6 - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card -#else - #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) -#endif - -// -// SD Support -// -#define SD_DETECT_PIN 49 -#define SDSS 53 - -// -// LCD / Controller -// -#define BEEPER_PIN 29 - -#if HAS_WIRED_LCD - #define LCD_PINS_RS 33 - #define LCD_PINS_ENABLE 30 - #define LCD_PINS_D4 35 - #define LCD_PINS_D5 32 - #define LCD_PINS_D6 37 - #define LCD_PINS_D7 36 - - #define BTN_EN1 47 - #define BTN_EN2 48 - #define BTN_ENC 31 - - #define LCD_SDSS 53 -#endif diff --git a/Marlin/src/pins/mega/pins_PICAOLD.h b/Marlin/src/pins/mega/pins_PICAOLD.h deleted file mode 100644 index f53a4cdcd2..0000000000 --- a/Marlin/src/pins/mega/pins_PICAOLD.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#define HEATER_0_PIN 9 // E0 -#define HEATER_1_PIN 10 // E1 -#define FAN_PIN 11 -#define FAN2_PIN 12 - -#include "pins_PICA.h" diff --git a/Marlin/src/pins/mega/pins_SILVER_GATE.h b/Marlin/src/pins/mega/pins_SILVER_GATE.h deleted file mode 100644 index 41cbe5e0e0..0000000000 --- a/Marlin/src/pins/mega/pins_SILVER_GATE.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__AVR_ATmega1281__, __AVR_ATmega2561__) - #error "Oops! Select 'Silvergate' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Silver Gate" - -#define X_STEP_PIN 43 -#define X_DIR_PIN 44 -#define X_ENABLE_PIN 42 -#define X_MIN_PIN 31 -#define X_MAX_PIN 34 - -#define Y_STEP_PIN 40 -#define Y_DIR_PIN 41 -#define Y_ENABLE_PIN 39 -#define Y_MIN_PIN 32 -#define Y_MAX_PIN 35 - -#define Z_STEP_PIN 13 -#define Z_DIR_PIN 38 -#define Z_ENABLE_PIN 14 -#define Z_MIN_PIN 33 -#define Z_MAX_PIN 36 - -#define E0_STEP_PIN 27 -#define E0_DIR_PIN 37 -#define E0_ENABLE_PIN 45 - -#define SDSS 16 - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 34 // X_MAX unless overridden -#endif - -#ifndef FAN_PIN - #define FAN_PIN 5 -#endif - -#define HEATER_0_PIN 7 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 3 -#endif - -#define CONTROLLER_FAN_PIN 2 - -#define TEMP_0_PIN 7 // Analog Input - -#define HEATER_BED_PIN 8 -#define TEMP_BED_PIN 6 - -#if HAS_MARLINUI_U8GLIB - #if ENABLED(U8GLIB_ST7920) // SPI GLCD 12864 ST7920 - #define LCD_PINS_RS 30 - #define LCD_PINS_ENABLE 20 - #define LCD_PINS_D4 25 - #define BEEPER_PIN 29 - #define BTN_EN1 19 - #define BTN_EN2 22 - #define BTN_ENC 24 - #define LCD_BACKLIGHT_PIN 6 - #if ENABLED(SILVER_GATE_GLCD_CONTROLLER) - #define KILL_PIN 21 - #define HOME_PIN 28 - #endif - #endif -#endif - -#define SD_DETECT_PIN 15 - -#define STAT_LED_RED_PIN 23 -#define STAT_LED_BLUE_PIN 26 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 51 -#endif diff --git a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h deleted file mode 100644 index 52e757c534..0000000000 --- a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Wanhao 0ne+ pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Wanhao i3 Mini 0ne+" -#define DEFAULT_MACHINE_NAME "i3 Mini" -#define BOARD_WEBSITE_URL "https://tinyurl.com/yyxw7se7" - -// -// Limit Switches -// -#define X_STOP_PIN 19 -#define Y_STOP_PIN 18 -#define Z_STOP_PIN 38 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 38 -#endif - -// -// Steppers -// -#define X_STEP_PIN 22 -#define X_DIR_PIN 23 -#define X_ENABLE_PIN 57 - -#define Y_STEP_PIN 25 -#define Y_DIR_PIN 26 -#define Y_ENABLE_PIN 24 - -#define Z_STEP_PIN 29 -#define Z_DIR_PIN 39 -#define Z_ENABLE_PIN 28 - -#define E0_STEP_PIN 55 -#define E0_DIR_PIN 56 -#define E0_ENABLE_PIN 54 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 -#define TEMP_BED_PIN 14 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 4 -#define HEATER_BED_PIN 44 -#define FAN_PIN 12 // IO pin. Buffer needed - -// -// SD Card -// -#define SD_DETECT_PIN -1 -#define SDSS 53 - -// -// Misc. Functions -// -#define BEEPER_PIN 37 -#define KILL_PIN 64 - -// -// LCD / Controller (Integrated MINIPANEL) -// -#if ENABLED(MINIPANEL) - #define DOGLCD_A0 40 - #define DOGLCD_CS 41 - #define LCD_BACKLIGHT_PIN 65 // Backlight LED on A11/D65 - #define LCD_RESET_PIN 27 - - #define BTN_EN1 2 - #define BTN_EN2 3 - #define BTN_ENC 5 - - // This display has adjustable contrast - #define LCD_CONTRAST_MIN 0 - #define LCD_CONTRAST_MAX 255 - #define LCD_CONTRAST_INIT LCD_CONTRAST_MAX -#endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index c5dbd20876..76c58576bd 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,12 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once - -#include "../core/boards.h" /** * Include pins definitions @@ -35,739 +32,382 @@ * These numbers are the same in any pin mapping. */ -#define MAX_EXTRUDERS 8 +#ifndef __PINS_H__ +#define __PINS_H__ -#if MB(RAMPS_13_EFB, RAMPS_14_EFB, RAMPS_PLUS_EFB, RAMPS_14_RE_ARM_EFB, RAMPS_SMART_EFB, RAMPS_DUO_EFB, RAMPS4DUE_EFB) +#include "../inc/MarlinConfig.h" + +#if MB(RAMPS_13_EFB) || MB(RAMPS_14_EFB) || MB(RAMPS_PLUS_EFB) || MB(RAMPS_14_RE_ARM_EFB) || MB(RAMPS_SMART_EFB) || MB(RAMPS_DUO_EFB) || MB(RAMPS4DUE_EFB) #define IS_RAMPS_EFB -#elif MB(RAMPS_13_EEB, RAMPS_14_EEB, RAMPS_PLUS_EEB, RAMPS_14_RE_ARM_EEB, RAMPS_SMART_EEB, RAMPS_DUO_EEB, RAMPS4DUE_EEB) +#elif MB(RAMPS_13_EEB) || MB(RAMPS_14_EEB) || MB(RAMPS_PLUS_EEB) || MB(RAMPS_14_RE_ARM_EEB) || MB(RAMPS_SMART_EEB) || MB(RAMPS_DUO_EEB) || MB(RAMPS4DUE_EEB) #define IS_RAMPS_EEB -#elif MB(RAMPS_13_EFF, RAMPS_14_EFF, RAMPS_PLUS_EFF, RAMPS_14_RE_ARM_EFF, RAMPS_SMART_EFF, RAMPS_DUO_EFF, RAMPS4DUE_EFF) +#elif MB(RAMPS_13_EFF) || MB(RAMPS_14_EFF) || MB(RAMPS_PLUS_EFF) || MB(RAMPS_14_RE_ARM_EFF) || MB(RAMPS_SMART_EFF) || MB(RAMPS_DUO_EFF) || MB(RAMPS4DUE_EFF) #define IS_RAMPS_EFF -#elif MB(RAMPS_13_EEF, RAMPS_14_EEF, RAMPS_PLUS_EEF, RAMPS_14_RE_ARM_EEF, RAMPS_SMART_EEF, RAMPS_DUO_EEF, RAMPS4DUE_EEF) +#elif MB(RAMPS_13_EEF) || MB(RAMPS_14_EEF) || MB(RAMPS_PLUS_EEF) || MB(RAMPS_14_RE_ARM_EEF) || MB(RAMPS_SMART_EEF) || MB(RAMPS_DUO_EEF) || MB(RAMPS4DUE_EEF) #define IS_RAMPS_EEF -#elif MB(RAMPS_13_SF, RAMPS_14_SF, RAMPS_PLUS_SF, RAMPS_14_RE_ARM_SF, RAMPS_SMART_SF, RAMPS_DUO_SF, RAMPS4DUE_SF) +#elif MB(RAMPS_13_SF) || MB(RAMPS_14_SF) || MB(RAMPS_PLUS_SF) || MB(RAMPS_14_RE_ARM_SF) || MB(RAMPS_SMART_SF) || MB(RAMPS_DUO_SF) || MB(RAMPS4DUE_SF) #define IS_RAMPS_SF #endif -#define HAS_FREE_AUX2_PINS !(BOTH(ULTRA_LCD, NEWPANEL) && ANY(PANEL_ONE, VIKI2, miniVIKI, MINIPANEL, REPRAPWORLD_KEYPAD)) - -// Test the target within the included pins file -#ifdef __MARLIN_DEPS__ - #define NOT_TARGET(V...) 0 -#else - #define NOT_TARGET(V...) NONE(V) -#endif - // // RAMPS 1.3 / 1.4 - ATmega1280, ATmega2560 // #if MB(RAMPS_OLD) - #include "ramps/pins_RAMPS_OLD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_OLD.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_13_EFB) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_13_EEB) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_13_EFF) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_13_EEF) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_13_SF) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_14_EFB) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_14_EEB) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_14_EFF) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_14_EEF) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_14_SF) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_PLUS_EFB) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_PLUS_EEB) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_PLUS_EFF) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_PLUS_EEF) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RAMPS_PLUS_SF) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 // // RAMPS Derivatives - ATmega1280, ATmega2560 // #elif MB(3DRAG) - #include "ramps/pins_3DRAG.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_3DRAG.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(K8200) - #include "ramps/pins_K8200.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (3DRAG) + #include "pins_K8200.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 (3DRAG) #elif MB(K8400) - #include "ramps/pins_K8400.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (3DRAG) -#elif MB(K8600) - #include "ramps/pins_K8600.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(K8800) - #include "ramps/pins_K8800.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (3DRAG) + #include "pins_K8400.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 (3DRAG) #elif MB(BAM_DICE) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RAMPS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(BAM_DICE_DUE) - #include "ramps/pins_BAM_DICE_DUE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_BAM_DICE_DUE.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(MKS_BASE) - #include "ramps/pins_MKS_BASE_10.h" // ATmega2560 env:mega2560 -#elif MB(MKS_BASE_14) - #include "ramps/pins_MKS_BASE_14.h" // ATmega2560 env:mega2560 + #include "pins_MKS_BASE.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(MKS_BASE_15) - #include "ramps/pins_MKS_BASE_15.h" // ATmega2560 env:mega2560 -#elif MB(MKS_BASE_16) - #include "ramps/pins_MKS_BASE_16.h" // ATmega2560 env:mega2560 + #include "pins_MKS_BASE_15.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(MKS_BASE_HEROIC) - #include "ramps/pins_MKS_BASE_HEROIC.h" // ATmega2560 env:mega2560 + #include "pins_MKS_BASE_HEROIC.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(MKS_GEN_13) - #include "ramps/pins_MKS_GEN_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_MKS_GEN_13.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(MKS_GEN_L) - #include "ramps/pins_MKS_GEN_L.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_MKS_GEN_L.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(KFB_2) - #include "ramps/pins_BIQU_KFB_2.h" // ATmega2560 env:mega2560 + #include "pins_KFB_2.h" // ATmega2560 env:megaatmega2560 #elif MB(ZRIB_V20) - #include "ramps/pins_ZRIB_V20.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (MKS_GEN_13) + #include "pins_ZRIB_V20.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 (MKS_GEN_13) #elif MB(FELIX2) - #include "ramps/pins_FELIX2.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_FELIX2.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RIGIDBOARD) - #include "ramps/pins_RIGIDBOARD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RIGIDBOARD.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(RIGIDBOARD_V2) - #include "ramps/pins_RIGIDBOARD_V2.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_RIGIDBOARD_V2.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(SAINSMART_2IN1) - #include "ramps/pins_SAINSMART_2IN1.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_SAINSMART_2IN1.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(ULTIMAKER) - #include "ramps/pins_ULTIMAKER.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_ULTIMAKER.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(ULTIMAKER_OLD) - #include "ramps/pins_ULTIMAKER_OLD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_ULTIMAKER_OLD.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(AZTEEG_X3) - #include "ramps/pins_AZTEEG_X3.h" // ATmega2560 env:mega2560 + #include "pins_AZTEEG_X3.h" // ATmega2560 env:megaatmega2560 #elif MB(AZTEEG_X3_PRO) - #include "ramps/pins_AZTEEG_X3_PRO.h" // ATmega2560 env:mega2560 + #include "pins_AZTEEG_X3_PRO.h" // ATmega2560 env:megaatmega2560 #elif MB(ULTIMAIN_2) - #include "ramps/pins_ULTIMAIN_2.h" // ATmega2560 env:mega2560ext -#elif MB(FORMBOT_RAPTOR) - #include "ramps/pins_FORMBOT_RAPTOR.h" // ATmega2560 env:mega2560 -#elif MB(FORMBOT_RAPTOR2) - #include "ramps/pins_FORMBOT_RAPTOR2.h" // ATmega2560 env:mega2560 -#elif MB(FORMBOT_TREX2PLUS) - #include "ramps/pins_FORMBOT_TREX2PLUS.h" // ATmega2560 env:mega2560 + #include "pins_ULTIMAIN_2.h" // ATmega2560 env:megaatmega2560 +#elif MB(FORMBOT_TREX2) + #include "pins_FORMBOT_TREX2.h" // ATmega2560 env:megaatmega2560 #elif MB(FORMBOT_TREX3) - #include "ramps/pins_FORMBOT_TREX3.h" // ATmega2560 env:mega2560 + #include "pins_FORMBOT_TREX3.h" // ATmega2560 env:megaatmega2560 #elif MB(RUMBA) - #include "ramps/pins_RUMBA.h" // ATmega2560 env:mega2560 -#elif MB(RUMBA_RAISE3D) - #include "ramps/pins_RUMBA_RAISE3D.h" // ATmega2560 env:mega2560 -#elif MB(RL200) - #include "ramps/pins_RL200.h" // ATmega2560 env:mega2560 + #include "pins_RUMBA.h" // ATmega2560 env:megaatmega2560 #elif MB(BQ_ZUM_MEGA_3D) - #include "ramps/pins_BQ_ZUM_MEGA_3D.h" // ATmega2560 env:mega2560ext + #include "pins_BQ_ZUM_MEGA_3D.h" // ATmega2560 env:megaatmega2560 #elif MB(MAKEBOARD_MINI) - #include "ramps/pins_MAKEBOARD_MINI.h" // ATmega2560 env:mega2560 + #include "pins_MAKEBOARD_MINI.h" // ATmega2560 env:megaatmega2560 #elif MB(TRIGORILLA_13) - #include "ramps/pins_TRIGORILLA_13.h" // ATmega2560 env:mega2560 + #include "pins_TRIGORILLA_13.h" // ATmega2560 env:megaatmega2560 #elif MB(TRIGORILLA_14) - #include "ramps/pins_TRIGORILLA_14.h" // ATmega2560 env:mega2560 -#elif MB(TRIGORILLA_14_11) - #include "ramps/pins_TRIGORILLA_14.h" // ATmega2560 env:mega2560 + #include "pins_TRIGORILLA_14.h" // ATmega2560 env:megaatmega2560 #elif MB(RAMPS_ENDER_4) - #include "ramps/pins_RAMPS_ENDER_4.h" // ATmega2560 env:mega2560 -#elif MB(RAMPS_CREALITY) - #include "ramps/pins_RAMPS_CREALITY.h" // ATmega2560 env:mega2560 -#elif MB(RAMPS_DAGOMA) - #include "ramps/pins_RAMPS_DAGOMA.h" // ATmega2560 env:mega2560 -#elif MB(FYSETC_F6_13) - #include "ramps/pins_FYSETC_F6_13.h" // ATmega2560 env:FYSETC_F6_13 -#elif MB(FYSETC_F6_14) - #include "ramps/pins_FYSETC_F6_14.h" // ATmega2560 env:FYSETC_F6_14 -#elif MB(DUPLICATOR_I3_PLUS) - #include "ramps/pins_DUPLICATOR_I3_PLUS.h" // ATmega2560 env:mega2560 -#elif MB(VORON) - #include "ramps/pins_VORON.h" // ATmega2560 env:mega2560 -#elif MB(TRONXY_V3_1_0) - #include "ramps/pins_TRONXY_V3_1_0.h" // ATmega2560 env:mega2560 -#elif MB(Z_BOLT_X_SERIES) - #include "ramps/pins_Z_BOLT_X_SERIES.h" // ATmega2560 env:mega2560 -#elif MB(TT_OSCAR) - #include "ramps/pins_TT_OSCAR.h" // ATmega2560 env:mega2560 -#elif MB(TANGO) - #include "ramps/pins_TANGO.h" // ATmega2560 env:mega2560 -#elif MB(MKS_GEN_L_V2) - #include "ramps/pins_MKS_GEN_L_V2.h" // ATmega2560 env:mega2560 -#elif MB(COPYMASTER_3D) - #include "ramps/pins_COPYMASTER_3D.h" // ATmega2560 env:mega2560 -#elif MB(ORTUR_4) - #include "ramps/pins_ORTUR_4.h" // ATmega2560 env:mega2560 -#elif MB(TENLOG_D3_HERO) - #include "ramps/pins_TENLOG_D3_HERO.h" // ATmega2560 env:mega2560 -#elif MB(MKS_GEN_L_V21) - #include "ramps/pins_MKS_GEN_L_V21.h" // ATmega2560 env:mega2560 - -// -// RAMBo and derivatives -// - -#elif MB(RAMBO) - #include "rambo/pins_RAMBO.h" // ATmega2560 env:rambo -#elif MB(MINIRAMBO, MINIRAMBO_10A) - #include "rambo/pins_MINIRAMBO.h" // ATmega2560 env:rambo -#elif MB(EINSY_RAMBO) - #include "rambo/pins_EINSY_RAMBO.h" // ATmega2560 env:rambo -#elif MB(EINSY_RETRO) - #include "rambo/pins_EINSY_RETRO.h" // ATmega2560 env:rambo -#elif MB(SCOOVO_X9H) - #include "rambo/pins_SCOOVO_X9H.h" // ATmega2560 env:rambo + #include "pins_RAMPS_ENDER_4.h" // ATmega2560 env:megaatmega2560 // // Other ATmega1280, ATmega2560 // #elif MB(CNCONTROLS_11) - #include "mega/pins_CNCONTROLS_11.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_CNCONTROLS_11.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(CNCONTROLS_12) - #include "mega/pins_CNCONTROLS_12.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(CNCONTROLS_15) - #include "mega/pins_CNCONTROLS_15.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_CNCONTROLS_12.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(MIGHTYBOARD_REVE) - #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext + #include "pins_MIGHTYBOARD_REVE.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(CHEAPTRONIC) - #include "mega/pins_CHEAPTRONIC.h" // ATmega2560 env:mega2560 + #include "pins_CHEAPTRONIC.h" // ATmega2560 env:megaatmega2560 #elif MB(CHEAPTRONIC_V2) - #include "mega/pins_CHEAPTRONICv2.h" // ATmega2560 env:mega2560 + #include "pins_CHEAPTRONICv2.h" // ATmega2560 env:megaatmega2560 #elif MB(MEGATRONICS) - #include "mega/pins_MEGATRONICS.h" // ATmega2560 env:mega2560 + #include "pins_MEGATRONICS.h" // ATmega2560 env:megaatmega2560 #elif MB(MEGATRONICS_2) - #include "mega/pins_MEGATRONICS_2.h" // ATmega2560 env:mega2560 -#elif MB(MEGATRONICS_3, MEGATRONICS_31, MEGATRONICS_32) - #include "mega/pins_MEGATRONICS_3.h" // ATmega2560 env:mega2560 + #include "pins_MEGATRONICS_2.h" // ATmega2560 env:megaatmega2560 +#elif MB(MEGATRONICS_3) || MB(MEGATRONICS_31) + #include "pins_MEGATRONICS_3.h" // ATmega2560 env:megaatmega2560 +#elif MB(RAMBO) + #include "pins_RAMBO.h" // ATmega2560 env:rambo +#elif MB(MINIRAMBO) || MB(MINIRAMBO_10A) + #include "pins_MINIRAMBO.h" // ATmega2560 env:rambo +#elif MB(EINSY_RAMBO) + #include "pins_EINSY_RAMBO.h" // ATmega2560 env:rambo +#elif MB(EINSY_RETRO) + #include "pins_EINSY_RETRO.h" // ATmega2560 env:rambo #elif MB(ELEFU_3) - #include "mega/pins_ELEFU_3.h" // ATmega2560 env:mega2560 + #include "pins_ELEFU_3.h" // ATmega2560 env:megaatmega2560 #elif MB(LEAPFROG) - #include "mega/pins_LEAPFROG.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_LEAPFROG.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(MEGACONTROLLER) - #include "mega/pins_MEGACONTROLLER.h" // ATmega2560 env:mega2560 + #include "pins_MEGACONTROLLER.h" // ATmega2560 env:megaatmega2560 +#elif MB(SCOOVO_X9H) + #include "pins_SCOOVO_X9H.h" // ATmega2560 env:rambo #elif MB(GT2560_REV_A) - #include "mega/pins_GT2560_REV_A.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "pins_GT2560_REV_A.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(GT2560_REV_A_PLUS) - #include "mega/pins_GT2560_REV_A_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 -#elif MB(GT2560_V3) - #include "mega/pins_GT2560_V3.h" // ATmega2560 env:mega2560 -#elif MB(GT2560_V3_MC2) - #include "mega/pins_GT2560_V3_MC2.h" // ATmega2560 env:mega2560 -#elif MB(GT2560_V3_A20) - #include "mega/pins_GT2560_V3_A20.h" // ATmega2560 env:mega2560 + #include "pins_GT2560_REV_A_PLUS.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 #elif MB(EINSTART_S) - #include "mega/pins_EINSTART-S.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext -#elif MB(WANHAO_ONEPLUS) - #include "mega/pins_WANHAO_ONEPLUS.h" // ATmega2560 env:mega2560 -#elif MB(OVERLORD) - #include "mega/pins_OVERLORD.h" // ATmega2560 env:mega2560 -#elif MB(HJC2560C_REV2) - #include "mega/pins_HJC2560C_REV2.h" // ATmega2560 env:mega2560 -#elif MB(LEAPFROG_XEED2015) - #include "mega/pins_LEAPFROG_XEED2015.h" // ATmega2560 env:mega2560 -#elif MB(PICA) - #include "mega/pins_PICA.h" // ATmega2560 env:mega2560 -#elif MB(PICA_REVB) - #include "mega/pins_PICAOLD.h" // ATmega2560 env:mega2560 -#elif MB(INTAMSYS40) - #include "mega/pins_INTAMSYS40.h" // ATmega2560 env:mega2560 + #include "pins_EINSTART-S.h" // ATmega1280, ATmega2560 env:megaatmega1280 env:megaatmega2560 // // ATmega1281, ATmega2561 // #elif MB(MINITRONICS) - #include "mega/pins_MINITRONICS.h" // ATmega1281 env:mega1280 + #include "pins_MINITRONICS.h" // ATmega1281 env:megaatmega1280 #elif MB(SILVER_GATE) - #include "mega/pins_SILVER_GATE.h" // ATmega2561 env:mega2560 + #include "pins_SILVER_GATE.h" // ATmega2561 env:megaatmega2560 // // Sanguinololu and Derivatives - ATmega644P, ATmega1284P // #elif MB(SANGUINOLOLU_11) - #include "sanguino/pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(SANGUINOLOLU_12) - #include "sanguino/pins_SANGUINOLOLU_12.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_SANGUINOLOLU_12.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(MELZI) - #include "sanguino/pins_MELZI.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p -#elif MB(MELZI_V2) - #include "sanguino/pins_MELZI_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_MELZI.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(MELZI_MAKR3D) - #include "sanguino/pins_MELZI_MAKR3D.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_MELZI_MAKR3D.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(MELZI_CREALITY) - #include "sanguino/pins_MELZI_CREALITY.h" // ATmega1284P env:melzi env:melzi_optimized env:melzi_optiboot + #include "pins_MELZI_CREALITY.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(MELZI_MALYAN) - #include "sanguino/pins_MELZI_MALYAN.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_MELZI_MALYAN.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(MELZI_TRONXY) - #include "sanguino/pins_MELZI_TRONXY.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_MELZI_TRONXY.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(STB_11) - #include "sanguino/pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(AZTEEG_X1) - #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p -#elif MB(ZMIB_V2) - #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p + #include "pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p // // Other ATmega644P, ATmega644, ATmega1284P // #elif MB(GEN3_MONOLITHIC) - #include "sanguino/pins_GEN3_MONOLITHIC.h" // ATmega644P env:sanguino644p + #include "pins_GEN3_MONOLITHIC.h" // ATmega644P env:sanguino_atmega644p #elif MB(GEN3_PLUS) - #include "sanguino/pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(GEN6) - #include "sanguino/pins_GEN6.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_GEN6.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(GEN6_DELUXE) - #include "sanguino/pins_GEN6_DELUXE.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_GEN6_DELUXE.h" // ATmega644P, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(GEN7_CUSTOM) - #include "sanguino/pins_GEN7_CUSTOM.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_GEN7_CUSTOM.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(GEN7_12) - #include "sanguino/pins_GEN7_12.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_GEN7_12.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(GEN7_13) - #include "sanguino/pins_GEN7_13.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_GEN7_13.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(GEN7_14) - #include "sanguino/pins_GEN7_14.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_GEN7_14.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p #elif MB(OMCA_A) - #include "sanguino/pins_OMCA_A.h" // ATmega644 env:sanguino644p + #include "pins_OMCA_A.h" // ATmega644 env:sanguino_atmega644p #elif MB(OMCA) - #include "sanguino/pins_OMCA.h" // ATmega644P, ATmega644 env:sanguino644p + #include "pins_OMCA.h" // ATmega644P, ATmega644 env:sanguino_atmega644p #elif MB(ANET_10) - #include "sanguino/pins_ANET_10.h" // ATmega1284P env:sanguino1284p + #include "pins_ANET_10.h" // ATmega1284P env:sanguino_atmega1284p #elif MB(SETHI) - #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + #include "pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino_atmega644p env:sanguino_atmega1284p // // Teensyduino - AT90USB1286, AT90USB1286P // #elif MB(TEENSYLU) - #include "teensy2/pins_TEENSYLU.h" // AT90USB1286, AT90USB1286P env:at90usb1286_cdc + #include "pins_TEENSYLU.h" // AT90USB1286, AT90USB1286P env:at90usb1286_cdc #elif MB(PRINTRBOARD) - #include "teensy2/pins_PRINTRBOARD.h" // AT90USB1286 env:at90usb1286_dfu + #include "pins_PRINTRBOARD.h" // AT90USB1286 env:at90usb1286_dfu #elif MB(PRINTRBOARD_REVF) - #include "teensy2/pins_PRINTRBOARD_REVF.h" // AT90USB1286 env:at90usb1286_dfu + #include "pins_PRINTRBOARD_REVF.h" // AT90USB1286 env:at90usb1286_dfu #elif MB(BRAINWAVE) - #include "teensy2/pins_BRAINWAVE.h" // AT90USB646 env:at90usb1286_cdc + #include "pins_BRAINWAVE.h" // AT90USB646 env:at90usb1286_cdc #elif MB(BRAINWAVE_PRO) - #include "teensy2/pins_BRAINWAVE_PRO.h" // AT90USB1286 env:at90usb1286_cdc + #include "pins_BRAINWAVE_PRO.h" // AT90USB1286 env:at90usb1286_cdc #elif MB(SAV_MKI) - #include "teensy2/pins_SAV_MKI.h" // AT90USB1286 env:at90usb1286_cdc + #include "pins_SAV_MKI.h" // AT90USB1286 env:at90usb1286_cdc #elif MB(TEENSY2) - #include "teensy2/pins_TEENSY2.h" // AT90USB1286 env:teensy20 + #include "pins_TEENSY2.h" // AT90USB1286 env:teensy20 #elif MB(5DPRINT) - #include "teensy2/pins_5DPRINT.h" // AT90USB1286 env:at90usb1286_dfu + #include "pins_5DPRINT.h" // AT90USB1286 env:at90usb1286_dfu // // LPC1768 ARM Cortex M3 // #elif MB(RAMPS_14_RE_ARM_EFB) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 + #include "pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 #elif MB(RAMPS_14_RE_ARM_EEB) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 + #include "pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 #elif MB(RAMPS_14_RE_ARM_EFF) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 + #include "pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 #elif MB(RAMPS_14_RE_ARM_EEF) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 + #include "pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 #elif MB(RAMPS_14_RE_ARM_SF) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 + #include "pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 #elif MB(MKS_SBASE) - #include "lpc1768/pins_MKS_SBASE.h" // LPC1768 env:LPC1768 -#elif MB(MKS_SGEN_L) - #include "lpc1768/pins_MKS_SGEN_L.h" // LPC1768 env:LPC1768 + #include "pins_MKS_SBASE.h" // LPC1768 env:LPC1768 #elif MB(AZSMZ_MINI) - #include "lpc1768/pins_AZSMZ_MINI.h" // LPC1768 env:LPC1768 -#elif MB(BIQU_BQ111_A4) - #include "lpc1768/pins_BIQU_BQ111_A4.h" // LPC1768 env:LPC1768 -#elif MB(SELENA_COMPACT) - #include "lpc1768/pins_SELENA_COMPACT.h" // LPC1768 env:LPC1768 -#elif MB(BIQU_B300_V1_0) - #include "lpc1768/pins_BIQU_B300_V1.0.h" // LPC1768 env:LPC1768 -#elif MB(GMARSH_X6_REV1) - #include "lpc1768/pins_GMARSH_X6_REV1.h" // LPC1768 env:LPC1768 -#elif MB(BTT_SKR_V1_1) - #include "lpc1768/pins_BTT_SKR_V1_1.h" // LPC1768 env:LPC1768 -#elif MB(BTT_SKR_V1_3) - #include "lpc1768/pins_BTT_SKR_V1_3.h" // LPC1768 env:LPC1768 -#elif MB(BTT_SKR_V1_4) - #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768 - -// -// LPC1769 ARM Cortex M3 -// - -#elif MB(MKS_SGEN) - #include "lpc1769/pins_MKS_SGEN.h" // LPC1769 env:LPC1769 + #include "pins_AZSMZ_MINI.h" // LPC1768 env:LPC1768 #elif MB(AZTEEG_X5_GT) - #include "lpc1769/pins_AZTEEG_X5_GT.h" // LPC1769 env:LPC1769 -#elif MB(AZTEEG_X5_MINI) - #include "lpc1769/pins_AZTEEG_X5_MINI.h" // LPC1769 env:LPC1769 + #include "pins_AZTEEG_X5_GT.h" // LPC1769 env:LPC1768 #elif MB(AZTEEG_X5_MINI_WIFI) - #include "lpc1769/pins_AZTEEG_X5_MINI_WIFI.h" // LPC1769 env:LPC1769 + #include "pins_AZTEEG_X5_MINI_WIFI.h" // LPC1769 env:LPC1768 +#elif MB(BIQU_BQ111_A4) + #include "pins_BIQU_BQ111_A4.h" // LPC1768 env:LPC1768 +#elif MB(SELENA_COMPACT) + #include "pins_SELENA_COMPACT.h" // LPC1768 env:LPC1768 #elif MB(COHESION3D_REMIX) - #include "lpc1769/pins_COHESION3D_REMIX.h" // LPC1769 env:LPC1769 + #include "pins_COHESION3D_REMIX.h" // LPC1769 env:LPC1768 #elif MB(COHESION3D_MINI) - #include "lpc1769/pins_COHESION3D_MINI.h" // LPC1769 env:LPC1769 + #include "pins_COHESION3D_MINI.h" // LPC1769 env:LPC1768 #elif MB(SMOOTHIEBOARD) - #include "lpc1769/pins_SMOOTHIEBOARD.h" // LPC1769 env:LPC1769 -#elif MB(TH3D_EZBOARD) - #include "lpc1769/pins_TH3D_EZBOARD.h" // LPC1769 env:LPC1769 -#elif MB(BTT_SKR_V1_4_TURBO) - #include "lpc1769/pins_BTT_SKR_V1_4_TURBO.h" // LPC1769 env:LPC1769 -#elif MB(MKS_SGEN_L_V2) - #include "lpc1769/pins_MKS_SGEN_L_V2.h" // LPC1769 env:LPC1769 -#elif MB(BTT_SKR_E3_TURBO) - #include "lpc1769/pins_BTT_SKR_E3_TURBO.h" // LPC1769 env:LPC1769 + #include "pins_SMOOTHIEBOARD.h" // LPC1769 env:LPC1768 // -// Due (ATSAM) boards +// Other 32-bit Boards // #elif MB(DUE3DOM) - #include "sam/pins_DUE3DOM.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_DUE3DOM.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(DUE3DOM_MINI) - #include "sam/pins_DUE3DOM_MINI.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_DUE3DOM_MINI.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RADDS) - #include "sam/pins_RADDS.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RADDS.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RURAMPS4D_11) - #include "sam/pins_RURAMPS4D_11.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RURAMPS4D_11.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RURAMPS4D_13) - #include "sam/pins_RURAMPS4D_13.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RURAMPS4D_13.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_FD_V1) - #include "sam/pins_RAMPS_FD_V1.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_FD_V1.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_FD_V2) - #include "sam/pins_RAMPS_FD_V2.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_FD_V2.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_SMART_EFB) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_SMART_EEB) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_SMART_EFF) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_SMART_EEF) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_SMART_SF) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_DUO_EFB) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_DUO_EEB) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_DUO_EFF) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_DUO_EEF) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_DUO_SF) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS4DUE_EFB) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS4DUE_EEB) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS4DUE_EFF) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS4DUE_EEF) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS4DUE_SF) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(ULTRATRONICS_PRO) - #include "sam/pins_ULTRATRONICS_PRO.h" // SAM3X8E env:DUE env:DUE_debug -#elif MB(ARCHIM1) - #include "sam/pins_ARCHIM1.h" // SAM3X8E env:DUE env:DUE_debug + #include "pins_ULTRATRONICS_PRO.h" // SAM3X8E env:DUE env:DUE_debug #elif MB(ARCHIM2) - #include "sam/pins_ARCHIM2.h" // SAM3X8E env:DUE_archim env:DUE_archim_debug + #include "pins_ARCHIM2.h" // SAM3X8E env:DUE env:DUE_debug #elif MB(ALLIGATOR) - #include "sam/pins_ALLIGATOR_R2.h" // SAM3X8E env:DUE env:DUE_debug -#elif MB(ADSK) - #include "sam/pins_ADSK.h" // SAM3X8E env:DUE env:DUE_debug -#elif MB(PRINTRBOARD_G2) - #include "sam/pins_PRINTRBOARD_G2.h" // SAM3X8C env:DUE_USB -#elif MB(CNCONTROLS_15D) - #include "sam/pins_CNCONTROLS_15D.h" // SAM3X8E env:DUE env:DUE_USB - -// -// STM32 ARM Cortex-M0 -// -#elif MB(MALYAN_M200_V2) - #include "stm32f0/pins_MALYAN_M200_V2.h" // STM32F0 env:STM32F070RB_malyan env:STM32F070CB_malyan -#elif MB(MALYAN_M300) - #include "stm32f0/pins_MALYAN_M300.h" // STM32F070 env:malyan_M300 + #include "pins_ALLIGATOR_R2.h" // SAM3X8E env:DUE env:DUE_debug // // STM32 ARM Cortex-M3 // -#elif MB(STM32F103RE) - #include "stm32f1/pins_STM32F1R.h" // STM32F1 env:STM32F103RE -#elif MB(MALYAN_M200) - #include "stm32f1/pins_MALYAN_M200.h" // STM32F1 env:STM32F103CB_malyan +#elif MB(STM32F1R) + #include "pins_STM32F1R.h" // STM32F1 env:STM32F1 #elif MB(STM3R_MINI) - #include "stm32f1/pins_STM3R_MINI.h" // STM32F1 env:STM32F103RE -#elif MB(GTM32_PRO_VB) - #include "stm32f1/pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F103RE -#elif MB(GTM32_MINI) - #include "stm32f1/pins_GTM32_MINI.h" // STM32F1 env:STM32F103RE -#elif MB(GTM32_MINI_A30) - #include "stm32f1/pins_GTM32_MINI_A30.h" // STM32F1 env:STM32F103RE -#elif MB(GTM32_REV_B) - #include "stm32f1/pins_GTM32_REV_B.h" // STM32F1 env:STM32F103RE -#elif MB(MORPHEUS) - #include "stm32f1/pins_MORPHEUS.h" // STM32F1 env:STM32F103RE + #include "pins_STM3R_MINI.h" // STM32F1 env:STM32F1 +#elif MB(MALYAN_M200) + #include "pins_MALYAN_M200.h" // STM32F1 env:malyanm200 #elif MB(CHITU3D) - #include "stm32f1/pins_CHITU3D.h" // STM32F1 env:STM32F103RE -#elif MB(MKS_ROBIN) - #include "stm32f1/pins_MKS_ROBIN.h" // STM32F1 env:mks_robin env:mks_robin_stm32 -#elif MB(MKS_ROBIN_MINI) - #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini -#elif MB(MKS_ROBIN_NANO) - #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano35 -#elif MB(MKS_ROBIN_NANO_V2) - #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano35 -#elif MB(MKS_ROBIN_LITE) - #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite -#elif MB(MKS_ROBIN_LITE3) - #include "stm32f1/pins_MKS_ROBIN_LITE3.h" // STM32F1 env:mks_robin_lite3 -#elif MB(MKS_ROBIN_PRO) - #include "stm32f1/pins_MKS_ROBIN_PRO.h" // STM32F1 env:mks_robin_pro -#elif MB(MKS_ROBIN_E3) - #include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3 -#elif MB(MKS_ROBIN_E3D) - #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3 -#elif MB(MKS_ROBIN_E3P) - #include "stm32f1/pins_MKS_ROBIN_E3P.h" // STM32F1 env:mks_robin_e3p -#elif MB(BTT_SKR_MINI_V1_1) - #include "stm32f1/pins_BTT_SKR_MINI_V1_1.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB -#elif MB(BTT_SKR_MINI_E3_V1_0) - #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB -#elif MB(BTT_SKR_MINI_E3_V1_2) - #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB -#elif MB(BTT_SKR_MINI_E3_V2_0) - #include "stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB -#elif MB(BTT_SKR_E3_DIP) - #include "stm32f1/pins_BTT_SKR_E3_DIP.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB -#elif MB(JGAURORA_A5S_A1) - #include "stm32f1/pins_JGAURORA_A5S_A1.h" // STM32F1 env:jgaurora_a5s_a1 -#elif MB(FYSETC_AIO_II) - #include "stm32f1/pins_FYSETC_AIO_II.h" // STM32F1 env:STM32F103RC_fysetc -#elif MB(FYSETC_CHEETAH) - #include "stm32f1/pins_FYSETC_CHEETAH.h" // STM32F1 env:STM32F103RC_fysetc -#elif MB(FYSETC_CHEETAH_V12) - #include "stm32f1/pins_FYSETC_CHEETAH_V12.h" // STM32F1 env:STM32F103RC_fysetc -#elif MB(LONGER3D_LK) - #include "stm32f1/pins_LONGER3D_LK.h" // STM32F1 env:STM32F103VE_longer -#elif MB(CCROBOT_MEEB_3DP) - #include "stm32f1/pins_CCROBOT_MEEB_3DP.h" // STM32F1 env:STM32F103RC_meeb -#elif MB(CHITU3D_V5) - #include "stm32f1/pins_CHITU3D_V5.h" // STM32F1 env:chitu_f103 env:chitu_v5_gpio_init -#elif MB(CHITU3D_V6) - #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 -#elif MB(CREALITY_V4) - #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RET6_creality -#elif MB(CREALITY_V427) - #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality -#elif MB(TRIGORILLA_PRO) - #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro -#elif MB(FLY_MINI) - #include "stm32f1/pins_FLY_MINI.h" // STM32F1 env:FLY_MINI - -// -// ARM Cortex-M4F -// - -#elif MB(TEENSY31_32) - #include "teensy3/pins_TEENSY31_32.h" // TEENSY31_32 env:teensy31 -#elif MB(TEENSY35_36) - #include "teensy3/pins_TEENSY35_36.h" // TEENSY35_36 env:teensy35 + #include "pins_CHITU3D.h" // STM32F1 env:STM32F1 +#elif MB(GTM32_PRO_VB) + #include "pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F1 +#elif MB(MORPHEUS) + #include "pins_MORPHEUS.h" // STM32F1 env:STM32F1 // // STM32 ARM Cortex-M4F // +#elif MB(TEENSY31_32) + #include "pins_TEENSY31_32.h" // TEENSY31_32 env:teensy31 +#elif MB(TEENSY35_36) + #include "pins_TEENSY35_36.h" // TEENSY35_36 env:teensy35 #elif MB(BEAST) - #include "stm32f4/pins_BEAST.h" // STM32F4 env:STM32F4 -#elif MB(GENERIC_STM32F4) - #include "stm32f4/pins_GENERIC_STM32F4.h" // STM32F4 env:STM32F4 -#elif MB(ARMED) - #include "stm32f4/pins_ARMED.h" // STM32F4 env:ARMED -#elif MB(RUMBA32_V1_0) - #include "stm32f4/pins_RUMBA32_AUS3D.h" // STM32F4 env:rumba32 -#elif MB(RUMBA32_V1_1) - #include "stm32f4/pins_RUMBA32_AUS3D.h" // STM32F4 env:rumba32 -#elif MB(RUMBA32_MKS) - #include "stm32f4/pins_RUMBA32_MKS.h" // STM32F4 env:rumba32 -#elif MB(BLACK_STM32F407VE) - #include "stm32f4/pins_BLACK_STM32F407VE.h" // STM32F4 env:STM32F407VE_black -#elif MB(STEVAL_3DP001V1) - #include "stm32f4/pins_STEVAL_3DP001V1.h" // STM32F4 env:STM32F401VE_STEVAL -#elif MB(BTT_SKR_PRO_V1_1) - #include "stm32f4/pins_BTT_SKR_PRO_V1_1.h" // STM32F4 env:BIGTREE_SKR_PRO -#elif MB(BTT_SKR_PRO_V1_2) - #include "stm32f4/pins_BTT_SKR_PRO_V1_2.h" // STM32F4 env:BIGTREE_SKR_PRO -#elif MB(BTT_GTR_V1_0) - #include "stm32f4/pins_BTT_GTR_V1_0.h" // STM32F4 env:BIGTREE_GTR_V1_0 -#elif MB(BTT_BTT002_V1_0) - #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 -#elif MB(LERDGE_K) - #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:STM32F4 -#elif MB(LERDGE_S) - #include "stm32f4/pins_LERDGE_S.h" // STM32F4 env:LERDGE_S -#elif MB(LERDGE_X) - #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:LERDGE_X -#elif MB(VAKE403D) - #include "stm32f4/pins_VAKE403D.h" // STM32F4 env:STM32F4 -#elif MB(FYSETC_S6) - #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:FYSETC_S6 -#elif MB(FLYF407ZG) - #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG -#elif MB(MKS_ROBIN2) - #include "stm32f4/pins_MKS_ROBIN2.h" // STM32F4 env:MKS_ROBIN2 -#elif MB(FYSETC_S6_V2_0) - #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 + #include "pins_BEAST.h" // STM32F4 env:STM32F4 +#elif MB(STM32F4) + #include "pins_STM32F4.h" // STM32F4 env:STM32F4 // // ARM Cortex M7 // #elif MB(THE_BORG) - #include "stm32f7/pins_THE_BORG.h" // STM32F7 env:STM32F7 -#elif MB(REMRAM_V1) - #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:STM32F7 -#elif MB(NUCLEO_F767ZI) - #include "stm32f7/pins_NUCLEO_F767ZI.h" // STM32F7 env:NUCLEO_F767ZI -#elif MB(TEENSY41) - #include "teensy4/pins_TEENSY41.h" // Teensy-4.x env:teensy41 -#elif MB(T41U5XBB) - #include "teensy4/pins_T41U5XBB.h" // Teensy-4.x env:teensy41 + #include "pins_THE_BORG.h" // STM32F7 env:STM32F7 // // Espressif ESP32 // -#elif MB(ESPRESSIF_ESP32) - #include "esp32/pins_ESP32.h" // ESP32 env:esp32 -#elif MB(MRR_ESPA) - #include "esp32/pins_MRR_ESPA.h" // ESP32 env:esp32 -#elif MB(MRR_ESPE) - #include "esp32/pins_MRR_ESPE.h" // ESP32 env:esp32 -#elif MB(E4D_BOX) - #include "esp32/pins_E4D.h" // ESP32 env:esp32 - -// -// Adafruit Grand Central M4 (SAMD51 ARM Cortex-M4) -// - -#elif MB(AGCM4_RAMPS_144) - #include "samd/pins_RAMPS_144.h" // SAMD51 env:SAMD51_grandcentral_m4 - -// -// Custom board (with custom PIO env) -// -#elif MB(CUSTOM) - #include "pins_custom.h" // env:custom - -// -// Linux Native Debug board -// - -#elif MB(LINUX_RAMPS) - #include "linux/pins_RAMPS_LINUX.h" // Linux env:linux_native +#elif MB(ESP32) + #include "pins_ESP32.h" #else - - // - // Obsolete or unknown board - // - - #define BOARD_MKS_13 -1000 - #define BOARD_TRIGORILLA -1001 - #define BOARD_RURAMPS4D -1002 - #define BOARD_FORMBOT_TREX2 -1003 - #define BOARD_BIQU_SKR_V1_1 -1004 - #define BOARD_STM32F1R -1005 - #define BOARD_STM32F103R -1006 - #define BOARD_ESP32 -1007 - #define BOARD_STEVAL -1008 - #define BOARD_BIGTREE_SKR_V1_1 -1009 - #define BOARD_BIGTREE_SKR_V1_3 -1010 - #define BOARD_BIGTREE_SKR_V1_4 -1011 - #define BOARD_BIGTREE_SKR_V1_4_TURBO -1012 - #define BOARD_BIGTREE_BTT002_V1_0 -1013 - #define BOARD_BIGTREE_SKR_PRO_V1_1 -1014 - #define BOARD_BIGTREE_SKR_MINI_V1_1 -1015 - #define BOARD_BIGTREE_SKR_MINI_E3 -1016 - #define BOARD_BIGTREE_SKR_E3_DIP -1017 - #define BOARD_RUMBA32 -1018 - #define BOARD_RUMBA32_AUS3D -1019 - - #if MB(MKS_13) - #error "BOARD_MKS_13 has been renamed BOARD_MKS_GEN_13. Please update your configuration." - #elif MB(TRIGORILLA) - #error "BOARD_TRIGORILLA has been renamed BOARD_TRIGORILLA_13. Please update your configuration." - #elif MB(RURAMPS4D) - #error "BOARD_RURAMPS4D has been renamed BOARD_RURAMPS4D_11. Please update your configuration." - #elif MB(FORMBOT_TREX2) - #error "FORMBOT_TREX2 has been renamed BOARD_FORMBOT_TREX2PLUS. Please update your configuration." - #elif MB(BIQU_SKR_V1_1) - #error "BOARD_BIQU_SKR_V1_1 has been renamed BOARD_BTT_SKR_V1_1. Please update your configuration." - #elif MB(BIGTREE_SKR_V1_1) - #error "BOARD_BIGTREE_SKR_V1_1 has been renamed BOARD_BTT_SKR_V1_1. Please update your configuration." - #elif MB(BIGTREE_SKR_V2_2) - #error "BOARD_BIGTREE_SKR_V1_2 has been renamed BOARD_BTT_SKR_V1_2. Please update your configuration." - #elif MB(BIGTREE_SKR_V1_3) - #error "BOARD_BIGTREE_SKR_V1_3 has been renamed BOARD_BTT_SKR_V1_3. Please update your configuration." - #elif MB(BIGTREE_SKR_V1_4) - #error "BOARD_BIGTREE_SKR_V1_4 has been renamed BOARD_BTT_SKR_V1_4. Please update your configuration." - #elif MB(BIGTREE_SKR_V1_4_TURBO) - #error "BOARD_BIGTREE_SKR_V1_4_TURBO has been renamed BOARD_BTT_SKR_V1_4_TURBO. Please update your configuration." - #elif MB(BIGTREE_BTT002_V1_0) - #error "BOARD_BIGTREE_BTT002_V1_0 has been renamed BOARD_BTT_BTT002_V1_0. Please update your configuration." - #elif MB(BIGTREE_SKR_PRO_V1_1) - #error "BOARD_BIGTREE_SKR_PRO_V1_1 has been renamed BOARD_BTT_SKR_PRO_V1_1. Please update your configuration." - #elif MB(BIGTREE_SKR_MINI_V1_1) - #error "BOARD_BIGTREE_SKR_MINI_V1_1 has been renamed BOARD_BTT_SKR_MINI_V1_1. Please update your configuration." - #elif MB(BIGTREE_SKR_MINI_E3) - #error "BOARD_BIGTREE_SKR_MINI_E3 has been renamed BOARD_BTT_SKR_MINI_E3_V1_0. Please update your configuration." - #elif MB(BIGTREE_SKR_E3_DIP) - #error "BOARD_BIGTREE_SKR_E3_DIP has been renamed BOARD_BTT_SKR_E3_DIP. Please update your configuration." - #elif MB(STM32F1R) - #error "BOARD_STM32F1R has been renamed BOARD_STM32F103RE. Please update your configuration." - #elif MB(STM32F103R) - #error "BOARD_STM32F103R has been renamed BOARD_STM32F103RE. Please update your configuration." - #elif MOTHERBOARD == BOARD_ESP32 - #error "BOARD_ESP32 has been renamed BOARD_ESPRESSIF_ESP32. Please update your configuration." - #elif MB(STEVAL) - #error "BOARD_STEVAL has been renamed BOARD_STEVAL_3DP001V1. Please update your configuration." - #elif MB(RUMBA32) - #error "BOARD_RUMBA32 is now BOARD_RUMBA32_MKS or BOARD_RUMBA32_V1_0. Please update your configuration." - #elif MB(RUMBA32_AUS3D) - #error "BOARD_RUMBA32_AUS3D is now BOARD_RUMBA32_V1_0. Please update your configuration." - #else - #error "Unknown MOTHERBOARD value set in Configuration.h" - #endif - - #undef BOARD_MKS_13 - #undef BOARD_TRIGORILLA - #undef BOARD_RURAMPS4D - #undef BOARD_FORMBOT_TREX2 - #undef BOARD_BIQU_SKR_V1_1 - #undef BOARD_STM32F1R - #undef BOARD_STM32F103R - #undef BOARD_ESP32 - #undef BOARD_STEVAL - #undef BOARD_BIGTREE_SKR_MINI_E3 - #undef BOARD_BIGTREE_SKR_V1_1 - #undef BOARD_BIGTREE_SKR_V1_3 - #undef BOARD_BIGTREE_SKR_V1_4 - #undef BOARD_BIGTREE_SKR_V1_4_TURBO - #undef BOARD_BIGTREE_BTT002_V1_0 - #undef BOARD_BIGTREE_SKR_PRO_V1_1 - #undef BOARD_BIGTREE_SKR_MINI_V1_1 - #undef BOARD_BIGTREE_SKR_E3_DIP - #undef BOARD_RUMBA32 - #undef BOARD_RUMBA32_AUS3D - + #error "Unknown MOTHERBOARD value set in Configuration.h" #endif // Define certain undefined pins @@ -777,18 +417,12 @@ #ifndef X_MS2_PIN #define X_MS2_PIN -1 #endif -#ifndef X_MS3_PIN - #define X_MS3_PIN -1 -#endif #ifndef Y_MS1_PIN #define Y_MS1_PIN -1 #endif #ifndef Y_MS2_PIN #define Y_MS2_PIN -1 #endif -#ifndef Y_MS3_PIN - #define Y_MS3_PIN -1 -#endif #ifndef Z_MS1_PIN #define Z_MS1_PIN -1 #endif @@ -804,27 +438,18 @@ #ifndef E0_MS2_PIN #define E0_MS2_PIN -1 #endif -#ifndef E0_MS3_PIN - #define E0_MS3_PIN -1 -#endif #ifndef E1_MS1_PIN #define E1_MS1_PIN -1 #endif #ifndef E1_MS2_PIN #define E1_MS2_PIN -1 #endif -#ifndef E1_MS3_PIN - #define E1_MS3_PIN -1 -#endif #ifndef E2_MS1_PIN #define E2_MS1_PIN -1 #endif #ifndef E2_MS2_PIN #define E2_MS2_PIN -1 #endif -#ifndef E2_MS3_PIN - #define E2_MS3_PIN -1 -#endif #ifndef E3_MS1_PIN #define E3_MS1_PIN -1 #endif @@ -843,33 +468,6 @@ #ifndef E4_MS3_PIN #define E4_MS3_PIN -1 #endif -#ifndef E5_MS1_PIN - #define E5_MS1_PIN -1 -#endif -#ifndef E5_MS2_PIN - #define E5_MS2_PIN -1 -#endif -#ifndef E5_MS3_PIN - #define E5_MS3_PIN -1 -#endif -#ifndef E6_MS1_PIN - #define E6_MS1_PIN -1 -#endif -#ifndef E6_MS2_PIN - #define E6_MS2_PIN -1 -#endif -#ifndef E6_MS3_PIN - #define E6_MS3_PIN -1 -#endif -#ifndef E7_MS1_PIN - #define E7_MS1_PIN -1 -#endif -#ifndef E7_MS2_PIN - #define E7_MS2_PIN -1 -#endif -#ifndef E7_MS3_PIN - #define E7_MS3_PIN -1 -#endif #ifndef E0_STEP_PIN #define E0_STEP_PIN -1 @@ -916,70 +514,6 @@ #ifndef E4_ENABLE_PIN #define E4_ENABLE_PIN -1 #endif -#ifndef E5_STEP_PIN - #define E5_STEP_PIN -1 -#endif -#ifndef E5_DIR_PIN - #define E5_DIR_PIN -1 -#endif -#ifndef E5_ENABLE_PIN - #define E5_ENABLE_PIN -1 -#endif -#ifndef E6_STEP_PIN - #define E6_STEP_PIN -1 -#endif -#ifndef E6_DIR_PIN - #define E6_DIR_PIN -1 -#endif -#ifndef E6_ENABLE_PIN - #define E6_ENABLE_PIN -1 -#endif -#ifndef E7_STEP_PIN - #define E7_STEP_PIN -1 -#endif -#ifndef E7_DIR_PIN - #define E7_DIR_PIN -1 -#endif -#ifndef E7_ENABLE_PIN - #define E7_ENABLE_PIN -1 -#endif - -// -// Destroy unused CS pins -// -#if !AXIS_HAS_SPI(X) - #undef X_CS_PIN -#endif -#if !AXIS_HAS_SPI(Y) - #undef Y_CS_PIN -#endif -#if !AXIS_HAS_SPI(Z) - #undef Z_CS_PIN -#endif -#if E_STEPPERS && !AXIS_HAS_SPI(E0) - #undef E0_CS_PIN -#endif -#if E_STEPPERS > 1 && !AXIS_HAS_SPI(E1) - #undef E1_CS_PIN -#endif -#if E_STEPPERS > 2 && !AXIS_HAS_SPI(E2) - #undef E2_CS_PIN -#endif -#if E_STEPPERS > 3 && !AXIS_HAS_SPI(E3) - #undef E3_CS_PIN -#endif -#if E_STEPPERS > 4 && !AXIS_HAS_SPI(E4) - #undef E4_CS_PIN -#endif -#if E_STEPPERS > 5 && !AXIS_HAS_SPI(E5) - #undef E5_CS_PIN -#endif -#if E_STEPPERS > 6 && !AXIS_HAS_SPI(E6) - #undef E6_CS_PIN -#endif -#if E_STEPPERS > 7 && !AXIS_HAS_SPI(E7) - #undef E7_CS_PIN -#endif #ifndef X_CS_PIN #define X_CS_PIN -1 @@ -1005,20 +539,10 @@ #ifndef E4_CS_PIN #define E4_CS_PIN -1 #endif -#ifndef E5_CS_PIN - #define E5_CS_PIN -1 -#endif -#ifndef E6_CS_PIN - #define E6_CS_PIN -1 -#endif -#ifndef E7_CS_PIN - #define E7_CS_PIN -1 -#endif #ifndef FAN_PIN #define FAN_PIN -1 #endif -#define FAN0_PIN FAN_PIN #ifndef FAN1_PIN #define FAN1_PIN -1 #endif @@ -1054,15 +578,6 @@ #ifndef HEATER_4_PIN #define HEATER_4_PIN -1 #endif -#ifndef HEATER_5_PIN - #define HEATER_5_PIN -1 -#endif -#ifndef HEATER_6_PIN - #define HEATER_6_PIN -1 -#endif -#ifndef HEATER_7_PIN - #define HEATER_7_PIN -1 -#endif #ifndef HEATER_BED_PIN #define HEATER_BED_PIN -1 #endif @@ -1082,15 +597,6 @@ #ifndef TEMP_4_PIN #define TEMP_4_PIN -1 #endif -#ifndef TEMP_5_PIN - #define TEMP_5_PIN -1 -#endif -#ifndef TEMP_6_PIN - #define TEMP_6_PIN -1 -#endif -#ifndef TEMP_7_PIN - #define TEMP_7_PIN -1 -#endif #ifndef TEMP_BED_PIN #define TEMP_BED_PIN -1 #endif @@ -1098,8 +604,8 @@ #ifndef SD_DETECT_PIN #define SD_DETECT_PIN -1 #endif -#ifndef SDPOWER_PIN - #define SDPOWER_PIN -1 +#ifndef SDPOWER + #define SDPOWER -1 #endif #ifndef SDSS #define SDSS -1 @@ -1107,8 +613,7 @@ #ifndef LED_PIN #define LED_PIN -1 #endif -#if DISABLED(PSU_CONTROL) || !defined(PS_ON_PIN) - #undef PS_ON_PIN +#ifndef PS_ON_PIN #define PS_ON_PIN -1 #endif #ifndef KILL_PIN @@ -1117,75 +622,172 @@ #ifndef SUICIDE_PIN #define SUICIDE_PIN -1 #endif -#ifndef SUICIDE_PIN_INVERTING - #define SUICIDE_PIN_INVERTING false + +#ifndef MAX_EXTRUDERS + #define MAX_EXTRUDERS 5 #endif -#ifndef NUM_SERVO_PLUGS - #define NUM_SERVO_PLUGS 4 +#ifndef MAX_SERVOS + #define MAX_SERVOS 4 #endif +// +// Assign auto fan pins if needed +// +#ifndef E0_AUTO_FAN_PIN + #ifdef ORIG_E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN ORIG_E0_AUTO_FAN_PIN + #else + #define E0_AUTO_FAN_PIN -1 + #endif +#endif +#ifndef E1_AUTO_FAN_PIN + #ifdef ORIG_E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN ORIG_E1_AUTO_FAN_PIN + #else + #define E1_AUTO_FAN_PIN -1 + #endif +#endif +#ifndef E2_AUTO_FAN_PIN + #ifdef ORIG_E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN ORIG_E2_AUTO_FAN_PIN + #else + #define E2_AUTO_FAN_PIN -1 + #endif +#endif +#ifndef E3_AUTO_FAN_PIN + #ifdef ORIG_E3_AUTO_FAN_PIN + #define E3_AUTO_FAN_PIN ORIG_E3_AUTO_FAN_PIN + #else + #define E3_AUTO_FAN_PIN -1 + #endif +#endif +#ifndef E4_AUTO_FAN_PIN + #ifdef ORIG_E4_AUTO_FAN_PIN + #define E4_AUTO_FAN_PIN ORIG_E4_AUTO_FAN_PIN + #else + #define E4_AUTO_FAN_PIN -1 + #endif +#endif +#ifndef CHAMBER_AUTO_FAN_PIN + #ifdef ORIG_CHAMBER_AUTO_FAN_PIN + #define CHAMBER_AUTO_FAN_PIN ORIG_CHAMBER_AUTO_FAN_PIN + #else + #define CHAMBER_AUTO_FAN_PIN -1 + #endif +#endif + +// List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those! +#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, E0_MS1_PIN, E0_MS2_PIN, E0_CS_PIN, +#define _E1_PINS +#define _E2_PINS +#define _E3_PINS +#define _E4_PINS + +#if ENABLED(SWITCHING_EXTRUDER) + // Tools 0 and 1 use E0 + #if EXTRUDERS > 2 // Tools 2 and 3 use E1 + #undef _E1_PINS + #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN, E1_CS_PIN, + #if EXTRUDERS > 4 // Tools 4 and 5 use E2 + #undef _E2_PINS + #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, E2_MS1_PIN, E2_MS2_PIN, E2_CS_PIN, + #endif + #endif +#elif EXTRUDERS > 1 + #undef _E1_PINS + #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN, E1_CS_PIN, + #if EXTRUDERS > 2 + #undef _E2_PINS + #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, E2_MS1_PIN, E2_MS2_PIN, E2_CS_PIN, + #if EXTRUDERS > 3 + #undef _E3_PINS + #define _E3_PINS E3_STEP_PIN, E3_DIR_PIN, E3_ENABLE_PIN, E3_MS1_PIN, E3_MS2_PIN, E3_MS3_PIN, E3_CS_PIN, + #if EXTRUDERS > 4 + #undef _E4_PINS + #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_MS3_PIN, E4_CS_PIN, + #endif // EXTRUDERS > 4 + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 +#endif // EXTRUDERS > 1 + +#define _H0_PINS HEATER_0_PIN, E0_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_0_PIN), +#define _H1_PINS +#define _H2_PINS +#define _H3_PINS +#define _H4_PINS + +#if HOTENDS > 1 + #undef _H1_PINS + #define _H1_PINS HEATER_1_PIN, E1_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_1_PIN), + #if HOTENDS > 2 + #undef _H2_PINS + #define _H2_PINS HEATER_2_PIN, E2_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_2_PIN), + #if HOTENDS > 3 + #undef _H3_PINS + #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_3_PIN), + #if HOTENDS > 4 + #undef _H4_PINS + #define _H4_PINS HEATER_4_PIN, analogInputToDigitalPin(TEMP_4_PIN), + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 +#elif ENABLED(MIXING_EXTRUDER) + #undef _E1_PINS + #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN, E1_CS_PIN, + #if MIXING_STEPPERS > 2 + #undef _E2_PINS + #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, E2_MS1_PIN, E2_MS2_PIN, E2_CS_PIN, + #if MIXING_STEPPERS > 3 + #undef _E3_PINS + #define _E3_PINS E3_STEP_PIN, E3_DIR_PIN, E3_ENABLE_PIN, E3_MS1_PIN, E3_MS2_PIN, E3_CS_PIN, + #if MIXING_STEPPERS > 4 + #undef _E4_PINS + #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_CS_PIN, + #endif // MIXING_STEPPERS > 4 + #endif // MIXING_STEPPERS > 3 + #endif // MIXING_STEPPERS > 2 +#endif // MIXING_STEPPERS > 1 + +#define BED_PINS HEATER_BED_PIN, analogInputToDigitalPin(TEMP_BED_PIN), + // // Assign endstop pins for boards with only 3 connectors // #ifdef X_STOP_PIN #if X_HOME_DIR < 0 #define X_MIN_PIN X_STOP_PIN - #ifndef X_MAX_PIN - #define X_MAX_PIN -1 - #endif + #define X_MAX_PIN -1 #else + #define X_MIN_PIN -1 #define X_MAX_PIN X_STOP_PIN - #ifndef X_MIN_PIN - #define X_MIN_PIN -1 - #endif #endif -#elif X_HOME_DIR < 0 - #define X_STOP_PIN X_MIN_PIN -#else - #define X_STOP_PIN X_MAX_PIN #endif #ifdef Y_STOP_PIN #if Y_HOME_DIR < 0 #define Y_MIN_PIN Y_STOP_PIN - #ifndef Y_MAX_PIN - #define Y_MAX_PIN -1 - #endif + #define Y_MAX_PIN -1 #else + #define Y_MIN_PIN -1 #define Y_MAX_PIN Y_STOP_PIN - #ifndef Y_MIN_PIN - #define Y_MIN_PIN -1 - #endif #endif -#elif Y_HOME_DIR < 0 - #define Y_STOP_PIN Y_MIN_PIN -#else - #define Y_STOP_PIN Y_MAX_PIN #endif #ifdef Z_STOP_PIN #if Z_HOME_DIR < 0 #define Z_MIN_PIN Z_STOP_PIN - #ifndef Z_MAX_PIN - #define Z_MAX_PIN -1 - #endif + #define Z_MAX_PIN -1 #else + #define Z_MIN_PIN -1 #define Z_MAX_PIN Z_STOP_PIN - #ifndef Z_MIN_PIN - #define Z_MIN_PIN -1 - #endif #endif -#elif Z_HOME_DIR < 0 - #define Z_STOP_PIN Z_MIN_PIN -#else - #define Z_STOP_PIN Z_MAX_PIN #endif // // Disable unused endstop / probe pins // -#if !HAS_CUSTOM_PROBE_PIN +#if DISABLED(Z_MIN_PROBE_ENDSTOP) #undef Z_MIN_PROBE_PIN #define Z_MIN_PROBE_PIN -1 #endif @@ -1220,116 +822,53 @@ #define Z_MIN_PIN -1 #endif -#if HAS_FILAMENT_SENSOR - #define FIL_RUNOUT1_PIN FIL_RUNOUT_PIN -#else - #undef FIL_RUNOUT_PIN - #undef FIL_RUNOUT1_PIN -#endif - #ifndef LCD_PINS_D4 #define LCD_PINS_D4 -1 #endif - -#if HAS_MARLINUI_HD44780 || TOUCH_UI_ULTIPANEL - #ifndef LCD_PINS_D5 - #define LCD_PINS_D5 -1 - #endif - #ifndef LCD_PINS_D6 - #define LCD_PINS_D6 -1 - #endif - #ifndef LCD_PINS_D7 - #define LCD_PINS_D7 -1 - #endif +#ifndef LCD_PINS_D5 + #define LCD_PINS_D5 -1 +#endif +#ifndef LCD_PINS_D6 + #define LCD_PINS_D6 -1 +#endif +#ifndef LCD_PINS_D7 + #define LCD_PINS_D7 -1 #endif -/** - * Auto-Assignment for Dual X, Dual Y, Multi-Z Steppers - * - * By default X2 is assigned to the next open E plug - * on the board, then in order, Y2, Z2, Z3. These can be - * overridden in Configuration.h or Configuration_adv.h. - */ +// +// Dual X-carriage, Dual Y, Dual Z support +// + +#define _X2_PINS +#define _Y2_PINS +#define _Z2_PINS -#define __PEXI(p,q) PIN_EXISTS(E##p##_##q) -#define _PEXI(p,q) __PEXI(p,q) #define __EPIN(p,q) E##p##_##q##_PIN #define _EPIN(p,q) __EPIN(p,q) -#define DIAG_REMAPPED(p,q) (PIN_EXISTS(q) && _EPIN(p##_E_INDEX, DIAG) == q##_PIN) // The X2 axis, if any, should be the next open extruder port -#define X2_E_INDEX E_STEPPERS - -#if EITHER(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) +#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS) #ifndef X2_STEP_PIN - #define X2_STEP_PIN _EPIN(X2_E_INDEX, STEP) - #define X2_DIR_PIN _EPIN(X2_E_INDEX, DIR) - #define X2_ENABLE_PIN _EPIN(X2_E_INDEX, ENABLE) - #if X2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(X2_STEP) + #define X2_STEP_PIN _EPIN(E_STEPPERS, STEP) + #define X2_DIR_PIN _EPIN(E_STEPPERS, DIR) + #define X2_ENABLE_PIN _EPIN(E_STEPPERS, ENABLE) + #ifndef X2_CS_PIN + #define X2_CS_PIN _EPIN(E_STEPPERS, CS) + #endif + #if E_STEPPERS > 4 || !PIN_EXISTS(X2_ENABLE) #error "No E stepper plug left for X2!" #endif #endif - #ifndef X2_MS1_PIN - #define X2_MS1_PIN _EPIN(X2_E_INDEX, MS1) + #undef _X2_PINS + #define __X2_PINS X2_STEP_PIN, X2_DIR_PIN, X2_ENABLE_PIN, + #ifdef X2_CS_PIN + #define _X2_PINS __X2_PINS X2_CS_PIN, + #else + #define _X2_PINS __X2_PINS #endif - #ifndef X2_MS2_PIN - #define X2_MS2_PIN _EPIN(X2_E_INDEX, MS2) - #endif - #ifndef X2_MS3_PIN - #define X2_MS3_PIN _EPIN(X2_E_INDEX, MS3) - #endif - #if AXIS_HAS_SPI(X2) && !defined(X2_CS_PIN) - #define X2_CS_PIN _EPIN(X2_E_INDEX, CS) - #endif - #if AXIS_HAS_UART(X2) - #ifndef X2_SERIAL_TX_PIN - #define X2_SERIAL_TX_PIN _EPIN(X2_E_INDEX, SERIAL_TX) - #endif - #ifndef X2_SERIAL_RX_PIN - #define X2_SERIAL_RX_PIN _EPIN(X2_E_INDEX, SERIAL_RX) - #endif - #endif - - // - // Auto-assign pins for stallGuard sensorless homing - // - #if defined(X2_STALL_SENSITIVITY) && ENABLED(X_DUAL_ENDSTOPS) && _PEXI(X2_E_INDEX, DIAG) - #define X2_DIAG_PIN _EPIN(X2_E_INDEX, DIAG) - #if DIAG_REMAPPED(X2, X_MIN) // If already remapped in the pins file... - #define X2_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(X2, Y_MIN) - #define X2_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(X2, Z_MIN) - #define X2_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(X2, X_MAX) - #define X2_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(X2, Y_MAX) - #define X2_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(X2, Z_MAX) - #define X2_USE_ENDSTOP _ZMAX_ - #else // Otherwise use the driver DIAG_PIN directly - #define _X2_USE_ENDSTOP(P) _E##P##_DIAG_ - #define X2_USE_ENDSTOP _X2_USE_ENDSTOP(X2_E_INDEX) - #endif - #undef X2_DIAG_PIN - #endif - - #define Y2_E_INDEX INCREMENT(X2_E_INDEX) + #define Y2_E_INDEX INCREMENT(E_STEPPERS) #else - #define Y2_E_INDEX X2_E_INDEX -#endif - -#ifndef X2_CS_PIN - #define X2_CS_PIN -1 -#endif -#ifndef X2_MS1_PIN - #define X2_MS1_PIN -1 -#endif -#ifndef X2_MS2_PIN - #define X2_MS2_PIN -1 -#endif -#ifndef X2_MS3_PIN - #define X2_MS3_PIN -1 + #define Y2_E_INDEX E_STEPPERS #endif // The Y2 axis, if any, should be the next open extruder port @@ -1338,284 +877,66 @@ #define Y2_STEP_PIN _EPIN(Y2_E_INDEX, STEP) #define Y2_DIR_PIN _EPIN(Y2_E_INDEX, DIR) #define Y2_ENABLE_PIN _EPIN(Y2_E_INDEX, ENABLE) - #if Y2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Y2_STEP) + #ifndef Y2_CS_PIN + #define Y2_CS_PIN _EPIN(Y2_E_INDEX, CS) + #endif + #if Y2_E_INDEX > 4 || !PIN_EXISTS(Y2_ENABLE) #error "No E stepper plug left for Y2!" #endif #endif - #ifndef Y2_MS1_PIN - #define Y2_MS1_PIN _EPIN(Y2_E_INDEX, MS1) - #endif - #ifndef Y2_MS2_PIN - #define Y2_MS2_PIN _EPIN(Y2_E_INDEX, MS2) - #endif - #ifndef Y2_MS3_PIN - #define Y2_MS3_PIN _EPIN(Y2_E_INDEX, MS3) - #endif - #if AXIS_HAS_SPI(Y2) && !defined(Y2_CS_PIN) - #define Y2_CS_PIN _EPIN(Y2_E_INDEX, CS) - #endif - #if AXIS_HAS_UART(Y2) - #ifndef Y2_SERIAL_TX_PIN - #define Y2_SERIAL_TX_PIN _EPIN(Y2_E_INDEX, SERIAL_TX) - #endif - #ifndef Y2_SERIAL_RX_PIN - #define Y2_SERIAL_RX_PIN _EPIN(Y2_E_INDEX, SERIAL_RX) - #endif - #endif - #if defined(Y2_STALL_SENSITIVITY) && ENABLED(Y_DUAL_ENDSTOPS) && _PEXI(Y2_E_INDEX, DIAG) - #define Y2_DIAG_PIN _EPIN(Y2_E_INDEX, DIAG) - #if DIAG_REMAPPED(Y2, X_MIN) - #define Y2_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(Y2, Y_MIN) - #define Y2_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(Y2, Z_MIN) - #define Y2_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(Y2, X_MAX) - #define Y2_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(Y2, Y_MAX) - #define Y2_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(Y2, Z_MAX) - #define Y2_USE_ENDSTOP _ZMAX_ - #else - #define _Y2_USE_ENDSTOP(P) _E##P##_DIAG_ - #define Y2_USE_ENDSTOP _Y2_USE_ENDSTOP(Y2_E_INDEX) - #endif - #undef Y2_DIAG_PIN + #undef _Y2_PINS + #define __Y2_PINS Y2_STEP_PIN, Y2_DIR_PIN, Y2_ENABLE_PIN, + #ifdef Y2_CS_PIN + #define _Y2_PINS __Y2_PINS Y2_CS_PIN, + #else + #define _Y2_PINS __Y2_PINS #endif #define Z2_E_INDEX INCREMENT(Y2_E_INDEX) #else #define Z2_E_INDEX Y2_E_INDEX #endif -#ifndef Y2_CS_PIN - #define Y2_CS_PIN -1 -#endif -#ifndef Y2_MS1_PIN - #define Y2_MS1_PIN -1 -#endif -#ifndef Y2_MS2_PIN - #define Y2_MS2_PIN -1 -#endif -#ifndef Y2_MS3_PIN - #define Y2_MS3_PIN -1 -#endif - // The Z2 axis, if any, should be the next open extruder port -#if NUM_Z_STEPPER_DRIVERS >= 2 +#if ENABLED(Z_DUAL_STEPPER_DRIVERS) #ifndef Z2_STEP_PIN #define Z2_STEP_PIN _EPIN(Z2_E_INDEX, STEP) #define Z2_DIR_PIN _EPIN(Z2_E_INDEX, DIR) #define Z2_ENABLE_PIN _EPIN(Z2_E_INDEX, ENABLE) - #if Z2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z2_STEP) + #ifndef Z2_CS_PIN + #define Z2_CS_PIN _EPIN(Z2_E_INDEX, CS) + #endif + #if Z2_E_INDEX > 4 || !PIN_EXISTS(Z2_ENABLE) #error "No E stepper plug left for Z2!" #endif #endif - #ifndef Z2_MS1_PIN - #define Z2_MS1_PIN _EPIN(Z2_E_INDEX, MS1) - #endif - #ifndef Z2_MS2_PIN - #define Z2_MS2_PIN _EPIN(Z2_E_INDEX, MS2) - #endif - #ifndef Z2_MS3_PIN - #define Z2_MS3_PIN _EPIN(Z2_E_INDEX, MS3) - #endif - #if AXIS_HAS_SPI(Z2) && !defined(Z2_CS_PIN) - #define Z2_CS_PIN _EPIN(Z2_E_INDEX, CS) - #endif - #if AXIS_HAS_UART(Z2) - #ifndef Z2_SERIAL_TX_PIN - #define Z2_SERIAL_TX_PIN _EPIN(Z2_E_INDEX, SERIAL_TX) - #endif - #ifndef Z2_SERIAL_RX_PIN - #define Z2_SERIAL_RX_PIN _EPIN(Z2_E_INDEX, SERIAL_RX) - #endif - #endif - #if defined(Z2_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 2 && _PEXI(Z2_E_INDEX, DIAG) - #define Z2_DIAG_PIN _EPIN(Z2_E_INDEX, DIAG) - #if DIAG_REMAPPED(Z2, X_MIN) - #define Z2_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(Z2, Y_MIN) - #define Z2_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(Z2, Z_MIN) - #define Z2_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(Z2, X_MAX) - #define Z2_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(Z2, Y_MAX) - #define Z2_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(Z2, Z_MAX) - #define Z2_USE_ENDSTOP _ZMAX_ - #else - #define _Z2_USE_ENDSTOP(P) _E##P##_DIAG_ - #define Z2_USE_ENDSTOP _Z2_USE_ENDSTOP(Z2_E_INDEX) - #endif - #undef Z2_DIAG_PIN - #endif - #define Z3_E_INDEX INCREMENT(Z2_E_INDEX) -#else - #define Z3_E_INDEX Z2_E_INDEX -#endif - -#ifndef Z2_CS_PIN - #define Z2_CS_PIN -1 -#endif -#ifndef Z2_MS1_PIN - #define Z2_MS1_PIN -1 -#endif -#ifndef Z2_MS2_PIN - #define Z2_MS2_PIN -1 -#endif -#ifndef Z2_MS3_PIN - #define Z2_MS3_PIN -1 -#endif - -#if NUM_Z_STEPPER_DRIVERS >= 3 - #ifndef Z3_STEP_PIN - #define Z3_STEP_PIN _EPIN(Z3_E_INDEX, STEP) - #define Z3_DIR_PIN _EPIN(Z3_E_INDEX, DIR) - #define Z3_ENABLE_PIN _EPIN(Z3_E_INDEX, ENABLE) - #if Z3_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z3_STEP) - #error "No E stepper plug left for Z3!" - #endif - #endif - #if AXIS_HAS_SPI(Z3) - #ifndef Z3_CS_PIN - #define Z3_CS_PIN _EPIN(Z3_E_INDEX, CS) - #endif - #endif - #ifndef Z3_MS1_PIN - #define Z3_MS1_PIN _EPIN(Z3_E_INDEX, MS1) - #endif - #ifndef Z3_MS2_PIN - #define Z3_MS2_PIN _EPIN(Z3_E_INDEX, MS2) - #endif - #ifndef Z3_MS3_PIN - #define Z3_MS3_PIN _EPIN(Z3_E_INDEX, MS3) - #endif - #if AXIS_HAS_UART(Z3) - #ifndef Z3_SERIAL_TX_PIN - #define Z3_SERIAL_TX_PIN _EPIN(Z3_E_INDEX, SERIAL_TX) - #endif - #ifndef Z3_SERIAL_RX_PIN - #define Z3_SERIAL_RX_PIN _EPIN(Z3_E_INDEX, SERIAL_RX) - #endif - #endif - #if defined(Z3_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 && _PEXI(Z3_E_INDEX, DIAG) - #define Z3_DIAG_PIN _EPIN(Z3_E_INDEX, DIAG) - #if DIAG_REMAPPED(Z3, X_MIN) - #define Z3_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(Z3, Y_MIN) - #define Z3_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(Z3, Z_MIN) - #define Z3_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(Z3, X_MAX) - #define Z3_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(Z3, Y_MAX) - #define Z3_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(Z3, Z_MAX) - #define Z3_USE_ENDSTOP _ZMAX_ - #else - #define _Z3_USE_ENDSTOP(P) _E##P##_DIAG_ - #define Z3_USE_ENDSTOP _Z3_USE_ENDSTOP(Z3_E_INDEX) - #endif - #undef Z3_DIAG_PIN - #endif - #define Z4_E_INDEX INCREMENT(Z3_E_INDEX) -#endif - -#ifndef Z3_CS_PIN - #define Z3_CS_PIN -1 -#endif -#ifndef Z3_MS1_PIN - #define Z3_MS1_PIN -1 -#endif -#ifndef Z3_MS2_PIN - #define Z3_MS2_PIN -1 -#endif -#ifndef Z3_MS3_PIN - #define Z3_MS3_PIN -1 -#endif - -#if NUM_Z_STEPPER_DRIVERS >= 4 - #ifndef Z4_STEP_PIN - #define Z4_STEP_PIN _EPIN(Z4_E_INDEX, STEP) - #define Z4_DIR_PIN _EPIN(Z4_E_INDEX, DIR) - #define Z4_ENABLE_PIN _EPIN(Z4_E_INDEX, ENABLE) - #if Z4_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z4_STEP) - #error "No E stepper plug left for Z4!" - #endif - #endif - #if AXIS_HAS_SPI(Z4) - #ifndef Z4_CS_PIN - #define Z4_CS_PIN _EPIN(Z4_E_INDEX, CS) - #endif - #endif - #ifndef Z4_MS1_PIN - #define Z4_MS1_PIN _EPIN(Z4_E_INDEX, MS1) - #endif - #ifndef Z4_MS2_PIN - #define Z4_MS2_PIN _EPIN(Z4_E_INDEX, MS2) - #endif - #ifndef Z4_MS3_PIN - #define Z4_MS3_PIN _EPIN(Z4_E_INDEX, MS3) - #endif - #if AXIS_HAS_UART(Z4) - #ifndef Z4_SERIAL_TX_PIN - #define Z4_SERIAL_TX_PIN _EPIN(Z4_E_INDEX, SERIAL_TX) - #endif - #ifndef Z4_SERIAL_RX_PIN - #define Z4_SERIAL_RX_PIN _EPIN(Z4_E_INDEX, SERIAL_RX) - #endif - #endif - #if defined(Z4_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 && _PEXI(Z4_E_INDEX, DIAG) - #define Z4_DIAG_PIN _EPIN(Z4_E_INDEX, DIAG) - #if DIAG_REMAPPED(Z4, X_MIN) - #define Z4_USE_ENDSTOP _XMIN_ - #elif DIAG_REMAPPED(Z4, Y_MIN) - #define Z4_USE_ENDSTOP _YMIN_ - #elif DIAG_REMAPPED(Z4, Z_MIN) - #define Z4_USE_ENDSTOP _ZMIN_ - #elif DIAG_REMAPPED(Z4, X_MAX) - #define Z4_USE_ENDSTOP _XMAX_ - #elif DIAG_REMAPPED(Z4, Y_MAX) - #define Z4_USE_ENDSTOP _YMAX_ - #elif DIAG_REMAPPED(Z4, Z_MAX) - #define Z4_USE_ENDSTOP _ZMAX_ - #else - #define _Z4_USE_ENDSTOP(P) _E##P##_DIAG_ - #define Z4_USE_ENDSTOP _Z4_USE_ENDSTOP(Z4_E_INDEX) - #endif - #undef Z4_DIAG_PIN + #undef _Z2_PINS + #define __Z2_PINS Z2_STEP_PIN, Z2_DIR_PIN, Z2_ENABLE_PIN, + #ifdef Z2_CS_PIN + #define _Z2_PINS __Z2_PINS Z2_CS_PIN, + #else + #define _Z2_PINS __Z2_PINS #endif #endif -#ifndef Z4_CS_PIN - #define Z4_CS_PIN -1 -#endif -#ifndef Z4_MS1_PIN - #define Z4_MS1_PIN -1 -#endif -#ifndef Z4_MS2_PIN - #define Z4_MS2_PIN -1 -#endif -#ifndef Z4_MS3_PIN - #define Z4_MS3_PIN -1 +#ifndef HAL_SENSITIVE_PINS + #define HAL_SENSITIVE_PINS #endif -#if HAS_MARLINUI_U8GLIB - #if !defined(ST7920_DELAY_1) && defined(BOARD_ST7920_DELAY_1) - #define ST7920_DELAY_1 BOARD_ST7920_DELAY_1 - #endif - #if !defined(ST7920_DELAY_2) && defined(BOARD_ST7920_DELAY_2) - #define ST7920_DELAY_2 BOARD_ST7920_DELAY_2 - #endif - #if !defined(ST7920_DELAY_3) && defined(BOARD_ST7920_DELAY_3) - #define ST7920_DELAY_3 BOARD_ST7920_DELAY_3 - #endif -#else - #undef ST7920_DELAY_1 - #undef ST7920_DELAY_2 - #undef ST7920_DELAY_3 -#endif +#define SENSITIVE_PINS { \ + X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, X_MS1_PIN, X_MS2_PIN, X_CS_PIN, \ + Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Y_MS1_PIN, Y_MS2_PIN, Y_CS_PIN, \ + Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, Z_MS1_PIN, Z_MS2_PIN, Z_MS3_PIN, Z_CS_PIN, Z_MIN_PROBE_PIN, \ + PS_ON_PIN, HEATER_BED_PIN, FAN_PIN, FAN1_PIN, FAN2_PIN, CONTROLLER_FAN_PIN, \ + _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS BED_PINS \ + _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS \ + _X2_PINS _Y2_PINS _Z2_PINS \ + HAL_SENSITIVE_PINS \ + } -#undef HAS_FREE_AUX2_PINS -#undef DIAG_REMAPPED +#define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS)) + +// Note: default SPI pins are defined in the HAL + +#include HAL_PATH(../HAL, spi_pins.h) + +#endif // __PINS_H__ diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h index 5f153cfa2b..2ec747cd44 100644 --- a/Marlin/src/pins/pinsDebug.h +++ b/Marlin/src/pins/pinsDebug.h @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016, 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,12 +16,10 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#include "../inc/MarlinConfig.h" - #define MAX_NAME_LENGTH 39 // one place to specify the format of all the sources of names // "-" left justify, "39" minimum width of name, pad with blanks @@ -31,6 +32,7 @@ * * Both passes use the same pin list. The list contains two macro names. The * actual macro definitions are changed depending on which pass is being done. + * */ // first pass - put the name strings into FLASH @@ -41,38 +43,12 @@ #define REPORT_NAME_ANALOG(COUNTER, NAME) _ADD_PIN(#NAME, COUNTER) #include "pinsDebug_list.h" -#line 46 +#line 47 // manually add pins that have names that are macros which don't play well with these macros -#if ANY(AVR_ATmega2560_FAMILY, AVR_ATmega1284_FAMILY, ARDUINO_ARCH_SAM, TARGET_LPC1768) - #if SERIAL_PORT == 0 - static const char RXD_NAME_0[] PROGMEM = { "RXD0" }; - static const char TXD_NAME_0[] PROGMEM = { "TXD0" }; - #elif SERIAL_PORT == 1 - static const char RXD_NAME_1[] PROGMEM = { "RXD1" }; - static const char TXD_NAME_1[] PROGMEM = { "TXD1" }; - #elif SERIAL_PORT == 2 - static const char RXD_NAME_2[] PROGMEM = { "RXD2" }; - static const char TXD_NAME_2[] PROGMEM = { "TXD2" }; - #elif SERIAL_PORT == 3 - static const char RXD_NAME_3[] PROGMEM = { "RXD3" }; - static const char TXD_NAME_3[] PROGMEM = { "TXD3" }; - #endif - #ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == 0 - static const char RXD_NAME_0[] PROGMEM = { "RXD0" }; - static const char TXD_NAME_0[] PROGMEM = { "TXD0" }; - #elif SERIAL_PORT_2 == 1 - static const char RXD_NAME_1[] PROGMEM = { "RXD1" }; - static const char TXD_NAME_1[] PROGMEM = { "TXD1" }; - #elif SERIAL_PORT_2 == 2 - static const char RXD_NAME_2[] PROGMEM = { "RXD2" }; - static const char TXD_NAME_2[] PROGMEM = { "TXD2" }; - #elif SERIAL_PORT_2 == 3 - static const char RXD_NAME_3[] PROGMEM = { "RXD3" }; - static const char TXD_NAME_3[] PROGMEM = { "TXD3" }; - #endif - #endif +#if SERIAL_PORT == 0 && (AVR_ATmega2560_FAMILY || AVR_ATmega1284_FAMILY || defined(ARDUINO_ARCH_SAM)) + static const char RXD_NAME[] PROGMEM = { "RXD" }; + static const char TXD_NAME[] PROGMEM = { "TXD" }; #endif ///////////////////////////////////////////////////////////////////////////// @@ -91,7 +67,7 @@ typedef struct { - PGM_P const name; + const char * const name; pin_t pin; bool is_digital; } PinInfo; @@ -109,168 +85,43 @@ const PinInfo pin_array[] PROGMEM = { // manually add pins ... #if SERIAL_PORT == 0 - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) - { RXD_NAME_0, 0, true }, - { TXD_NAME_0, 1, true }, + #if (AVR_ATmega2560_FAMILY || defined(ARDUINO_ARCH_SAM)) + { RXD_NAME, 0, true }, + { TXD_NAME, 1, true }, #elif AVR_ATmega1284_FAMILY - { RXD_NAME_0, 8, true }, - { TXD_NAME_0, 9, true }, - #elif defined(TARGET_LPC1768) // TX P0_02 RX P0_03 - { RXD_NAME_0, 3, true }, - { TXD_NAME_0, 2, true }, - #endif - #elif SERIAL_PORT == 1 - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) - { RXD_NAME_1, 19, true }, - { TXD_NAME_1, 18, true }, - #elif AVR_ATmega1284_FAMILY - { RXD_NAME_1, 10, true }, - { TXD_NAME_1, 11, true }, - #elif defined(TARGET_LPC1768) - #ifdef LPC_PINCFG_UART1_P2_00 // TX P2_00 RX P2_01 - { RXD_NAME_1, 0x41, true }, - { TXD_NAME_1, 0x40, true }, - #else // TX P0_15 RX P0_16 - { RXD_NAME_1, 16, true }, - { TXD_NAME_1, 15, true }, - #endif - #endif - #elif SERIAL_PORT == 2 - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) - { RXD_NAME_2, 17, true }, - { TXD_NAME_2, 16, true }, - #elif defined(TARGET_LPC1768) - #ifdef LPC_PINCFG_UART2_P2_08 // TX P2_08 RX P2_09 - { RXD_NAME_2, 0x49, true }, - { TXD_NAME_2, 0x48, true }, - #else // TX P0_10 RX P0_11 - { RXD_NAME_2, 11, true }, - { TXD_NAME_2, 10, true }, - #endif - #endif - #elif SERIAL_PORT == 3 - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) - { RXD_NAME_3, 15, true }, - { TXD_NAME_3, 14, true }, - #elif defined(TARGET_LPC1768) - #ifdef LPC_PINCFG_UART3_P0_25 // TX P0_25 RX P0_26 - { RXD_NAME_3, 0x1A, true }, - { TXD_NAME_3, 0x19, true }, - #elif defined(LPC_PINCFG_UART3_P4_28) // TX P4_28 RX P4_29 - { RXD_NAME_3, 0x9D, true }, - { TXD_NAME_3, 0x9C, true }, - #else // TX P0_00 RX P0_01 - { RXD_NAME_3, 1, true }, - { TXD_NAME_3, 0, true }, - #endif - #endif - #endif - - #ifdef SERIAL_PORT_2 - #if SERIAL_PORT_2 == 0 - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) - { RXD_NAME_0, 0, true }, - { TXD_NAME_0, 1, true }, - #elif AVR_ATmega1284_FAMILY - { RXD_NAME_0, 8, true }, - { TXD_NAME_0, 9, true }, - #elif defined(TARGET_LPC1768) // TX P0_02 RX P0_03 - { RXD_NAME_0, 3, true }, - { TXD_NAME_0, 2, true }, - #endif - #elif SERIAL_PORT_2 == 1 - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) - { RXD_NAME_1, 19, true }, - { TXD_NAME_1, 18, true }, - #elif AVR_ATmega1284_FAMILY - { RXD_NAME_1, 10, true }, - { TXD_NAME_1, 11, true }, - #elif defined(TARGET_LPC1768) - #ifdef LPC_PINCFG_UART1_P2_00 // TX P2_00 RX P2_01 - { RXD_NAME_1, 0x41, true }, - { TXD_NAME_1, 0x40, true }, - #else // TX P0_15 RX P0_16 - { RXD_NAME_1, 16, true }, - { TXD_NAME_1, 15, true }, - #endif - #endif - #elif SERIAL_PORT_2 == 2 - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) - { RXD_NAME_2, 17, true }, - { TXD_NAME_2, 16, true }, - #elif defined(TARGET_LPC1768) - #ifdef LPC_PINCFG_UART2_P2_08 // TX P2_08 RX P2_09 - { RXD_NAME_2, 0x49, true }, - { TXD_NAME_2, 0x48, true }, - #else // TX P0_10 RX P0_11 - { RXD_NAME_2, 11, true }, - { TXD_NAME_2, 10, true }, - #endif - #endif - #elif SERIAL_PORT_2 == 3 - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) - { RXD_NAME_3, 15, true }, - { TXD_NAME_3, 14, true }, - #elif defined(TARGET_LPC1768) - #ifdef LPC_PINCFG_UART3_P0_25 // TX P0_25 RX P0_26 - { RXD_NAME_3, 0x1A, true }, - { TXD_NAME_3, 0x19, true }, - #elif defined(LPC_PINCFG_UART3_P4_28) // TX P4_28 RX P4_29 - { RXD_NAME_3, 0x9D, true }, - { TXD_NAME_3, 0x9C, true }, - #else // TX P0_00 RX P0_01 - { RXD_NAME_3, 1, true }, - { TXD_NAME_3, 0, true }, - #endif - #endif + { RXD_NAME, 8, true }, + { TXD_NAME, 9, true }, #endif #endif #include "pinsDebug_list.h" - #line 172 + #line 99 }; + #include HAL_PATH(../HAL, pinsDebug.h) // get the correct support file for this CPU -#ifndef M43_NEVER_TOUCH - #define M43_NEVER_TOUCH(Q) false -#endif static void print_input_or_output(const bool isout) { serialprintPGM(isout ? PSTR("Output = ") : PSTR("Input = ")); } // pretty report with PWM info -inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool extended=false, PGM_P const start_string=nullptr) { +inline void report_pin_state_extended(pin_t pin, bool ignore, bool extended = false, const char *start_string = "") { char buffer[MAX_NAME_LENGTH + 1]; // for the sprintf statements bool found = false, multi_name_pin = false; - auto alt_pin_echo = [](const pin_t &pin) { - #if AVR_AT90USB1286_FAMILY - // Use FastIO for pins Teensy doesn't expose - if (pin == 46) { - print_input_or_output(IS_OUTPUT(46)); - SERIAL_CHAR('0' + READ(46)); - return false; - } - else if (pin == 47) { - print_input_or_output(IS_OUTPUT(47)); - SERIAL_CHAR('0' + READ(47)); - return false; - } - #endif - return true; - }; - - LOOP_L_N(x, COUNT(pin_array)) { // scan entire array and report all instances of this pin + for (uint8_t x = 0; x < COUNT(pin_array); x++) { // scan entire array and report all instances of this pin if (GET_ARRAY_PIN(x) == pin) { - if (!found) { // report digital and analog pin number only on the first time through - if (start_string) serialprintPGM(start_string); - serialprintPGM(PSTR("PIN: ")); + if (found) multi_name_pin = true; + found = true; + if (!multi_name_pin) { // report digitial and analog pin number only on the first time through + sprintf_P(buffer, PSTR("%sPIN: "), start_string); // digital pin number + SERIAL_ECHO(buffer); PRINT_PIN(pin); PRINT_PORT(pin); - if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) { + if (IS_ANALOG(pin)) { sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); // analog pin number SERIAL_ECHO(buffer); } @@ -278,32 +129,45 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e } else { SERIAL_CHAR('.'); - SERIAL_ECHO_SP(MULTI_NAME_PAD + (start_string ? strlen_P(start_string) : 0)); // add padding if not the first instance found + SERIAL_ECHO_SP(MULTI_NAME_PAD + strlen(start_string)); // add padding if not the first instance found } PRINT_ARRAY_NAME(x); if (extended) { if (pin_is_protected(pin) && !ignore) SERIAL_ECHOPGM("protected "); else { - if (alt_pin_echo(pin)) { + #if AVR_AT90USB1286_FAMILY //Teensy IDEs don't know about these pins so must use FASTIO + if (pin == 46 || pin == 47) { + if (pin == 46) { + print_input_or_output(GET_OUTPUT(46)); + SERIAL_PROTOCOL(READ(46)); + } + else if (pin == 47) { + print_input_or_output(GET_OUTPUT(47)); + SERIAL_PROTOCOL(READ(47)); + } + } + else + #endif + { if (!GET_ARRAY_IS_DIGITAL(x)) { - sprintf_P(buffer, PSTR("Analog in = %5ld"), (long)analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); + sprintf_P(buffer, PSTR("Analog in = %5ld"), analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); SERIAL_ECHO(buffer); } else { if (!GET_PINMODE(pin)) { //pinMode(pin, INPUT_PULLUP); // make sure input isn't floating - stopped doing this // because this could interfere with inductive/capacitive - // sensors (high impedance voltage divider) and with Pt100 amplifier + // sensors (high impedance voltage divider) and with PT100 amplifier print_input_or_output(false); - SERIAL_ECHO(digitalRead_mod(pin)); + SERIAL_PROTOCOL(digitalRead_mod(pin)); } else if (pwm_status(pin)) { // do nothing } else { print_input_or_output(true); - SERIAL_ECHO(digitalRead_mod(pin)); + SERIAL_PROTOCOL(digitalRead_mod(pin)); } } if (!multi_name_pin && extended) pwm_details(pin); // report PWM capabilities only on the first pass & only if doing an extended report @@ -311,17 +175,15 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e } } SERIAL_EOL(); - multi_name_pin = found; - found = true; } // end of IF } // end of for loop if (!found) { - if (start_string) serialprintPGM(start_string); - serialprintPGM(PSTR("PIN: ")); + sprintf_P(buffer, PSTR("%sPIN: "), start_string); + SERIAL_ECHO(buffer); PRINT_PIN(pin); PRINT_PORT(pin); - if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) { + if (IS_ANALOG(pin)) { sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); // analog pin number SERIAL_ECHO(buffer); } @@ -329,19 +191,29 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e SERIAL_ECHO_SP(8); // add padding if not an analog pin SERIAL_ECHOPGM(""); if (extended) { - - if (alt_pin_echo(pin)) { - if (pwm_status(pin)) { - // do nothing + #if AVR_AT90USB1286_FAMILY //Teensy IDEs don't know about these pins so must use FASTIO + if (pin == 46 || pin == 47) { + SERIAL_PROTOCOL_SP(12); + if (pin == 46) { + print_input_or_output(GET_OUTPUT(46)); + SERIAL_PROTOCOL(READ(46)); + } + else { + print_input_or_output(GET_OUTPUT(47)); + SERIAL_PROTOCOL(READ(47)); + } } - else if (GET_PINMODE(pin)) { - SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); + else + #endif + { + if (GET_PINMODE(pin)) { + SERIAL_PROTOCOL_SP(MAX_NAME_LENGTH - 16); print_input_or_output(true); - SERIAL_ECHO(digitalRead_mod(pin)); + SERIAL_PROTOCOL(digitalRead_mod(pin)); } else { if (IS_ANALOG(pin)) { - sprintf_P(buffer, PSTR(" Analog in = %5ld"), (long)analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); + sprintf_P(buffer, PSTR(" Analog in = %5ld"), analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); SERIAL_ECHO(buffer); SERIAL_ECHOPGM(" "); } @@ -349,13 +221,10 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); // add padding if not an analog pin print_input_or_output(false); - SERIAL_ECHO(digitalRead_mod(pin)); + SERIAL_PROTOCOL(digitalRead_mod(pin)); } //if (!pwm_status(pin)) SERIAL_CHAR(' '); // add padding if it's not a PWM pin - if (extended) { - SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); - pwm_details(pin); // report PWM capabilities only if doing an extended report - } + if (extended) pwm_details(pin); // report PWM capabilities only if doing an extended report } } SERIAL_EOL(); diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 704f2a487f..4ea33dd5a6 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -1,6 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,74 +27,63 @@ // Pin lists 1.1.x and 2.0.x synchronized 2018-02-17 -#line 28 // set __LINE__ to a known value for both passes +#line 31 // set __LINE__ to a known value for both passes // // Analog Pin Assignments // -#define ANALOG_OK(PN) ((PN) >= 0 && (PN) < NUM_ANALOG_INPUTS) - -#if defined(EXT_AUX_A0) && ANALOG_OK(EXT_AUX_A0) +#if defined(EXT_AUX_A0) && EXT_AUX_A0 >= 0 && EXT_AUX_A0 < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A0) #endif -#if defined(EXT_AUX_A1) && ANALOG_OK(EXT_AUX_A0) +#if defined(EXT_AUX_A1) && EXT_AUX_A1 >= 0 && EXT_AUX_A1 < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A1) #endif -#if defined(EXT_AUX_A2) && ANALOG_OK(EXT_AUX_A0) +#if defined(EXT_AUX_A2) && EXT_AUX_A2 >= 0 && EXT_AUX_A2 < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A2) #endif -#if defined(EXT_AUX_A3) && ANALOG_OK(EXT_AUX_A0) +#if defined(EXT_AUX_A3) && EXT_AUX_A3 >= 0 && EXT_AUX_A3 < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A3) #endif -#if defined(EXT_AUX_A4) && ANALOG_OK(EXT_AUX_A0) +#if defined(EXT_AUX_A4) && EXT_AUX_A4 >= 0 && EXT_AUX_A4 < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A4) #endif -#if PIN_EXISTS(FILWIDTH) && ANALOG_OK(FILWIDTH_PIN) +#if PIN_EXISTS(FILWIDTH) && FILWIDTH_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, FILWIDTH_PIN) #endif -#if PIN_EXISTS(MAIN_VOLTAGE_MEASURE) && ANALOG_OK(MAIN_VOLTAGE_MEASURE_PIN) +#if PIN_EXISTS(MAIN_VOLTAGE_MEASURE) && MAIN_VOLTAGE_MEASURE_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, MAIN_VOLTAGE_MEASURE_PIN) #endif -#if !defined(ARDUINO_ARCH_SAM) && !defined(ARDUINO_ARCH_SAMD) // TC1 & TC2 are macros in the SAM/SAMD tool chain - #if defined(TC1) && ANALOG_OK(TC1) +#if !defined(ARDUINO_ARCH_SAM) //TC1 & TC2 are macros in the SAM tool chain + #if defined(TC1) && TC1 >= 0 && TC1 < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, TC1) #endif - #if defined(TC2) && ANALOG_OK(TC1) + #if defined(TC2) && TC2 >= 0 && TC2 < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, TC2) #endif #endif -#if PIN_EXISTS(TEMP_0) && ANALOG_OK(TEMP_0_PIN) +#if PIN_EXISTS(TEMP_0) && TEMP_0_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, TEMP_0_PIN) #endif -#if PIN_EXISTS(TEMP_1) && ANALOG_OK(TEMP_1_PIN) +#if PIN_EXISTS(TEMP_1) && TEMP_1_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, TEMP_1_PIN) #endif -#if PIN_EXISTS(TEMP_2) && ANALOG_OK(TEMP_2_PIN) +#if PIN_EXISTS(TEMP_2) && TEMP_2_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, TEMP_2_PIN) #endif -#if PIN_EXISTS(TEMP_3) && ANALOG_OK(TEMP_3_PIN) +#if PIN_EXISTS(TEMP_3) && TEMP_3_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, TEMP_3_PIN) #endif -#if PIN_EXISTS(TEMP_4) && ANALOG_OK(TEMP_4_PIN) +#if PIN_EXISTS(TEMP_4) && TEMP_4_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, TEMP_4_PIN) #endif -#if PIN_EXISTS(TEMP_5) && ANALOG_OK(TEMP_5_PIN) - REPORT_NAME_ANALOG(__LINE__, TEMP_5_PIN) -#endif -#if PIN_EXISTS(TEMP_6) && ANALOG_OK(TEMP_6_PIN) - REPORT_NAME_ANALOG(__LINE__, TEMP_6_PIN) -#endif -#if PIN_EXISTS(TEMP_7) && ANALOG_OK(TEMP_7_PIN) - REPORT_NAME_ANALOG(__LINE__, TEMP_7_PIN) -#endif -#if PIN_EXISTS(TEMP_BED) && ANALOG_OK(TEMP_BED_PIN) +#if PIN_EXISTS(TEMP_BED) && TEMP_BED_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, TEMP_BED_PIN) #endif -#if PIN_EXISTS(TEMP_CHAMBER) && ANALOG_OK(TEMP_CHAMBER_PIN) +#if PIN_EXISTS(TEMP_CHAMBER) && TEMP_CHAMBER_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, TEMP_CHAMBER_PIN) #endif -#if PIN_EXISTS(ADC_KEYPAD) && ANALOG_OK(ADC_KEYPAD_PIN) +#if PIN_EXISTS(ADC_KEYPAD) && ADC_KEYPAD_PIN < NUM_ANALOG_INPUTS REPORT_NAME_ANALOG(__LINE__, ADC_KEYPAD_PIN) #endif @@ -168,18 +160,6 @@ #if defined(BTN_UP) && BTN_UP >= 0 REPORT_NAME_DIGITAL(__LINE__, BTN_UP) #endif -#if PIN_EXISTS(JOY_X) - REPORT_NAME_DIGITAL(__LINE__, JOY_X_PIN) -#endif -#if PIN_EXISTS(JOY_Y) - REPORT_NAME_DIGITAL(__LINE__, JOY_Y_PIN) -#endif -#if PIN_EXISTS(JOY_Z) - REPORT_NAME_DIGITAL(__LINE__, JOY_Z_PIN) -#endif -#if PIN_EXISTS(JOY_EN) - REPORT_NAME_DIGITAL(__LINE__, JOY_EN_PIN) -#endif #if PIN_EXISTS(CASE_LIGHT) REPORT_NAME_DIGITAL(__LINE__, CASE_LIGHT_PIN) #endif @@ -189,12 +169,6 @@ #if PIN_EXISTS(CONTROLLER_FAN) REPORT_NAME_DIGITAL(__LINE__, CONTROLLER_FAN_PIN) #endif -#if PIN_EXISTS(COOLANT_FLOOD) - REPORT_NAME_DIGITAL(__LINE__, COOLANT_FLOOD_PIN) -#endif -#if PIN_EXISTS(COOLANT_MIST) - REPORT_NAME_DIGITAL(__LINE__, COOLANT_MIST_PIN) -#endif #if PIN_EXISTS(CUTOFF_RESET) REPORT_NAME_DIGITAL(__LINE__, CUTOFF_RESET_PIN) #endif @@ -261,9 +235,6 @@ #if defined(TMC_SW_SCK) && TMC_SW_SCK >= 0 REPORT_NAME_DIGITAL(__LINE__, TMC_SW_SCK) #endif -#if defined(TFTGLCD_CS) && TFTGLCD_CS >= 0 - REPORT_NAME_DIGITAL(__LINE__, TFTGLCD_CS) -#endif #if PIN_EXISTS(E_MUX0) REPORT_NAME_DIGITAL(__LINE__, E_MUX0_PIN) #endif @@ -297,9 +268,6 @@ #if PIN_EXISTS(E0_MS2) REPORT_NAME_DIGITAL(__LINE__, E0_MS2_PIN) #endif -#if PIN_EXISTS(E0_MS3) - REPORT_NAME_DIGITAL(__LINE__, E0_MS3_PIN) -#endif #if PIN_EXISTS(E0_STEP) REPORT_NAME_DIGITAL(__LINE__, E0_STEP_PIN) #endif @@ -321,9 +289,6 @@ #if PIN_EXISTS(E1_MS2) REPORT_NAME_DIGITAL(__LINE__, E1_MS2_PIN) #endif -#if PIN_EXISTS(E1_MS3) - REPORT_NAME_DIGITAL(__LINE__, E1_MS3_PIN) -#endif #if PIN_EXISTS(E1_STEP) REPORT_NAME_DIGITAL(__LINE__, E1_STEP_PIN) #endif @@ -345,9 +310,6 @@ #if PIN_EXISTS(E2_MS2) REPORT_NAME_DIGITAL(__LINE__, E2_MS2_PIN) #endif -#if PIN_EXISTS(E2_MS3) - REPORT_NAME_DIGITAL(__LINE__, E2_MS3_PIN) -#endif #if PIN_EXISTS(E2_STEP) REPORT_NAME_DIGITAL(__LINE__, E2_STEP_PIN) #endif @@ -399,78 +361,6 @@ #if PIN_EXISTS(E4_STEP) REPORT_NAME_DIGITAL(__LINE__, E4_STEP_PIN) #endif -#if PIN_EXISTS(E5_AUTO_FAN) - REPORT_NAME_DIGITAL(__LINE__, E5_AUTO_FAN_PIN) -#endif -#if PIN_EXISTS(E5_CS) - REPORT_NAME_DIGITAL(__LINE__, E5_CS_PIN) -#endif -#if PIN_EXISTS(E5_DIR) - REPORT_NAME_DIGITAL(__LINE__, E5_DIR_PIN) -#endif -#if PIN_EXISTS(E5_ENABLE) - REPORT_NAME_DIGITAL(__LINE__, E5_ENABLE_PIN) -#endif -#if PIN_EXISTS(E5_MS1) - REPORT_NAME_DIGITAL(__LINE__, E5_MS1_PIN) -#endif -#if PIN_EXISTS(E5_MS2) - REPORT_NAME_DIGITAL(__LINE__, E5_MS2_PIN) -#endif -#if PIN_EXISTS(E5_MS3) - REPORT_NAME_DIGITAL(__LINE__, E5_MS3_PIN) -#endif -#if PIN_EXISTS(E5_STEP) - REPORT_NAME_DIGITAL(__LINE__, E5_STEP_PIN) -#endif -#if PIN_EXISTS(E6_AUTO_FAN) - REPORT_NAME_DIGITAL(__LINE__, E6_AUTO_FAN_PIN) -#endif -#if PIN_EXISTS(E6_CS) - REPORT_NAME_DIGITAL(__LINE__, E6_CS_PIN) -#endif -#if PIN_EXISTS(E6_DIR) - REPORT_NAME_DIGITAL(__LINE__, E6_DIR_PIN) -#endif -#if PIN_EXISTS(E6_ENABLE) - REPORT_NAME_DIGITAL(__LINE__, E6_ENABLE_PIN) -#endif -#if PIN_EXISTS(E6_MS1) - REPORT_NAME_DIGITAL(__LINE__, E6_MS1_PIN) -#endif -#if PIN_EXISTS(E6_MS2) - REPORT_NAME_DIGITAL(__LINE__, E6_MS2_PIN) -#endif -#if PIN_EXISTS(E6_MS3) - REPORT_NAME_DIGITAL(__LINE__, E6_MS3_PIN) -#endif -#if PIN_EXISTS(E6_STEP) - REPORT_NAME_DIGITAL(__LINE__, E6_STEP_PIN) -#endif -#if PIN_EXISTS(E7_AUTO_FAN) - REPORT_NAME_DIGITAL(__LINE__, E7_AUTO_FAN_PIN) -#endif -#if PIN_EXISTS(E7_CS) - REPORT_NAME_DIGITAL(__LINE__, E7_CS_PIN) -#endif -#if PIN_EXISTS(E7_DIR) - REPORT_NAME_DIGITAL(__LINE__, E7_DIR_PIN) -#endif -#if PIN_EXISTS(E7_ENABLE) - REPORT_NAME_DIGITAL(__LINE__, E7_ENABLE_PIN) -#endif -#if PIN_EXISTS(E7_MS1) - REPORT_NAME_DIGITAL(__LINE__, E7_MS1_PIN) -#endif -#if PIN_EXISTS(E7_MS2) - REPORT_NAME_DIGITAL(__LINE__, E7_MS2_PIN) -#endif -#if PIN_EXISTS(E7_MS3) - REPORT_NAME_DIGITAL(__LINE__, E7_MS3_PIN) -#endif -#if PIN_EXISTS(E7_STEP) - REPORT_NAME_DIGITAL(__LINE__, E7_STEP_PIN) -#endif #if defined(ENET_CRS) && ENET_CRS >= 0 REPORT_NAME_DIGITAL(__LINE__, ENET_CRS) #endif @@ -550,54 +440,9 @@ #if PIN_EXISTS(FAN3) REPORT_NAME_DIGITAL(__LINE__, FAN3_PIN) #endif -#if PIN_EXISTS(FAN4) - REPORT_NAME_DIGITAL(__LINE__, FAN4_PIN) -#endif -#if PIN_EXISTS(FAN5) - REPORT_NAME_DIGITAL(__LINE__, FAN5_PIN) -#endif -#if PIN_EXISTS(FAN6) - REPORT_NAME_DIGITAL(__LINE__, FAN6_PIN) -#endif -#if PIN_EXISTS(FAN7) - REPORT_NAME_DIGITAL(__LINE__, FAN7_PIN) -#endif -#if PIN_EXISTS(FAN_MUX0) - REPORT_NAME_DIGITAL(__LINE__, FAN_MUX0_PIN) -#endif -#if PIN_EXISTS(FAN_MUX1) - REPORT_NAME_DIGITAL(__LINE__, FAN_MUX1_PIN) -#endif -#if PIN_EXISTS(FAN_MUX2) - REPORT_NAME_DIGITAL(__LINE__, FAN_MUX2_PIN) -#endif -#if PIN_EXISTS(POWER_LOSS) - REPORT_NAME_DIGITAL(__LINE__, POWER_LOSS_PIN) -#endif #if PIN_EXISTS(FIL_RUNOUT) REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT_PIN) #endif -#if PIN_EXISTS(FIL_RUNOUT2) - REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT2_PIN) -#endif -#if PIN_EXISTS(FIL_RUNOUT3) - REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT3_PIN) -#endif -#if PIN_EXISTS(FIL_RUNOUT4) - REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT4_PIN) -#endif -#if PIN_EXISTS(FIL_RUNOUT5) - REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT5_PIN) -#endif -#if PIN_EXISTS(FIL_RUNOUT6) - REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT6_PIN) -#endif -#if PIN_EXISTS(FIL_RUNOUT7) - REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT7_PIN) -#endif -#if PIN_EXISTS(FIL_RUNOUT8) - REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT8_PIN) -#endif #if PIN_EXISTS(HEATER_0) REPORT_NAME_DIGITAL(__LINE__, HEATER_0_PIN) #endif @@ -625,9 +470,6 @@ #if PIN_EXISTS(HEATER_BED) REPORT_NAME_DIGITAL(__LINE__, HEATER_BED_PIN) #endif -#if PIN_EXISTS(HEATER_CHAMBER) - REPORT_NAME_DIGITAL(__LINE__, HEATER_CHAMBER_PIN) -#endif #if PIN_EXISTS(HOME) REPORT_NAME_DIGITAL(__LINE__, HOME_PIN) #endif @@ -673,28 +515,18 @@ #if PIN_EXISTS(LED_RED) REPORT_NAME_DIGITAL(__LINE__, LED_RED_PIN) #endif +#if PIN_EXISTS(MAX) + REPORT_NAME_DIGITAL(__LINE__, MAX_PIN) +#endif #if PIN_EXISTS(MAX6675_DO) REPORT_NAME_DIGITAL(__LINE__, MAX6675_DO_PIN) #endif #if PIN_EXISTS(MAX6675_SCK) REPORT_NAME_DIGITAL(__LINE__, MAX6675_SCK_PIN) #endif -#if PIN_EXISTS(MAX6675_SS) - REPORT_NAME_DIGITAL(__LINE__, MAX6675_SS_PIN) +#if defined(MAX6675_SS) && MAX6675_SS >= 0 + REPORT_NAME_DIGITAL(__LINE__, MAX6675_SS) #endif -#if PIN_EXISTS(MAX6675_SS2) - REPORT_NAME_DIGITAL(__LINE__, MAX6675_SS2_PIN) -#endif -#if PIN_EXISTS(MAX7219_CLK) - REPORT_NAME_DIGITAL(__LINE__, MAX7219_CLK_PIN) -#endif -#if PIN_EXISTS(MAX7219_DIN) - REPORT_NAME_DIGITAL(__LINE__, MAX7219_DIN_PIN) -#endif -#if PIN_EXISTS(MAX7219_LOAD) - REPORT_NAME_DIGITAL(__LINE__, MAX7219_LOAD_PIN) -#endif - // #if defined(MISO) && MISO >= 0 // REPORT_NAME_DIGITAL(__LINE__, MISO) // #endif @@ -722,33 +554,33 @@ #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_E_PIN) #endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_X) - REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_X_PIN) -#endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) - REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_Y_PIN) -#endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_XY_PIN) #endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_X) - REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_X_PIN) -#endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) - REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_Y_PIN) -#endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_Z_PIN) #endif #if PIN_EXISTS(MOTOR_FAULT) REPORT_NAME_DIGITAL(__LINE__, MOTOR_FAULT_PIN) #endif +#if PIN_EXISTS(ORIG_E0_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, ORIG_E0_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(ORIG_E1_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, ORIG_E1_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(ORIG_E2_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, ORIG_E2_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(ORIG_E3_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, ORIG_E3_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(ORIG_E4_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, ORIG_E4_AUTO_FAN_PIN) +#endif #if PIN_EXISTS(PHOTOGRAPH) REPORT_NAME_DIGITAL(__LINE__, PHOTOGRAPH_PIN) #endif -#if PIN_EXISTS(CHDK) - REPORT_NAME_DIGITAL(__LINE__, CHDK_PIN) -#endif #if PIN_EXISTS(PS_ON) REPORT_NAME_DIGITAL(__LINE__, PS_ON_PIN) #endif @@ -770,12 +602,6 @@ #if PIN_EXISTS(RAMPS_D9) REPORT_NAME_DIGITAL(__LINE__, RAMPS_D9_PIN) #endif -#if PIN_EXISTS(NEOPIXEL) - REPORT_NAME_DIGITAL(__LINE__, NEOPIXEL_PIN) -#endif -#if PIN_EXISTS(NEOPIXEL2) - REPORT_NAME_DIGITAL(__LINE__, NEOPIXEL2_PIN) -#endif #if PIN_EXISTS(RGB_LED_R) REPORT_NAME_DIGITAL(__LINE__, RGB_LED_R_PIN) #endif @@ -809,8 +635,8 @@ // #if defined(SDA) && SDA >= 0 // REPORT_NAME_DIGITAL(__LINE__, SDA) // #endif -#if PIN_EXISTS(SDPOWER) - REPORT_NAME_DIGITAL(__LINE__, SDPOWER_PIN) +#if defined(SDPOWER) && SDPOWER >= 0 + REPORT_NAME_DIGITAL(__LINE__, SDPOWER) #endif #if defined(SDSS) && SDSS >= 0 REPORT_NAME_DIGITAL(__LINE__, SDSS) @@ -863,18 +689,18 @@ #if PIN_EXISTS(SOL4) REPORT_NAME_DIGITAL(__LINE__, SOL4_PIN) #endif -#if PIN_EXISTS(SOL5) - REPORT_NAME_DIGITAL(__LINE__, SOL5_PIN) -#endif -#if PIN_EXISTS(SOL6) - REPORT_NAME_DIGITAL(__LINE__, SOL6_PIN) -#endif -#if PIN_EXISTS(SOL7) - REPORT_NAME_DIGITAL(__LINE__, SOL7_PIN) -#endif #if defined(SPARE_IO) && SPARE_IO >= 0 REPORT_NAME_DIGITAL(__LINE__, SPARE_IO) #endif +#if defined(SPI_CHAN_DAC) && SPI_CHAN_DAC >= 0 + REPORT_NAME_DIGITAL(__LINE__, SPI_CHAN_DAC) +#endif +#if defined(SPI_CHAN_EEPROM1) && SPI_CHAN_EEPROM1 >= 0 + REPORT_NAME_DIGITAL(__LINE__, SPI_CHAN_EEPROM1) +#endif +#if defined(SPI_EEPROM) && SPI_EEPROM >= 0 + REPORT_NAME_DIGITAL(__LINE__, SPI_EEPROM) +#endif #if defined(SPI_EEPROM1_CS) && SPI_EEPROM1_CS >= 0 REPORT_NAME_DIGITAL(__LINE__, SPI_EEPROM1_CS) #endif @@ -890,8 +716,8 @@ #if PIN_EXISTS(SPINDLE_ENABLE) REPORT_NAME_DIGITAL(__LINE__, SPINDLE_ENABLE_PIN) #endif -#if PIN_EXISTS(SPINDLE_LASER_ENA) - REPORT_NAME_DIGITAL(__LINE__, SPINDLE_LASER_ENA_PIN) +#if PIN_EXISTS(SPINDLE_LASER_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, SPINDLE_LASER_ENABLE_PIN) #endif #if PIN_EXISTS(SPINDLE_LASER_PWM) REPORT_NAME_DIGITAL(__LINE__, SPINDLE_LASER_PWM_PIN) @@ -923,11 +749,11 @@ #if PIN_EXISTS(SUICIDE) REPORT_NAME_DIGITAL(__LINE__, SUICIDE_PIN) #endif -#if PIN_EXISTS(THERMO_CS1) - REPORT_NAME_DIGITAL(__LINE__, THERMO_CS1_PIN) +#if defined(THERMO_CS1) && THERMO_CS1 >= 0 + REPORT_NAME_DIGITAL(__LINE__, THERMO_CS1) #endif -#if PIN_EXISTS(THERMO_CS2) - REPORT_NAME_DIGITAL(__LINE__, THERMO_CS2_PIN) +#if defined(THERMO_CS2) && THERMO_CS2 >= 0 + REPORT_NAME_DIGITAL(__LINE__, THERMO_CS2) #endif #if PIN_EXISTS(THERMO_DO) REPORT_NAME_DIGITAL(__LINE__, THERMO_DO_PIN) @@ -1004,48 +830,24 @@ #if PIN_EXISTS(X_MIN) REPORT_NAME_DIGITAL(__LINE__, X_MIN_PIN) #endif -#if PIN_EXISTS(X_DIAG) - REPORT_NAME_DIGITAL(__LINE__, X_DIAG_PIN) -#endif #if PIN_EXISTS(X_MS1) REPORT_NAME_DIGITAL(__LINE__, X_MS1_PIN) #endif #if PIN_EXISTS(X_MS2) REPORT_NAME_DIGITAL(__LINE__, X_MS2_PIN) #endif -#if PIN_EXISTS(X_MS3) - REPORT_NAME_DIGITAL(__LINE__, X_MS3_PIN) -#endif #if PIN_EXISTS(X_STEP) REPORT_NAME_DIGITAL(__LINE__, X_STEP_PIN) #endif #if PIN_EXISTS(X_STOP) REPORT_NAME_DIGITAL(__LINE__, X_STOP_PIN) #endif -#if PIN_EXISTS(X2_CS) - REPORT_NAME_DIGITAL(__LINE__, X2_CS_PIN) -#endif #if PIN_EXISTS(X2_DIR) REPORT_NAME_DIGITAL(__LINE__, X2_DIR_PIN) #endif #if PIN_EXISTS(X2_ENABLE) REPORT_NAME_DIGITAL(__LINE__, X2_ENABLE_PIN) #endif -#if PIN_EXISTS(X2_MAX) - REPORT_NAME_DIGITAL(__LINE__, X2_MAX_PIN) -#endif -#if PIN_EXISTS(X2_MIN) - REPORT_NAME_DIGITAL(__LINE__, X2_MIN_PIN) -#endif -#if PIN_EXISTS(X2_MS1) - REPORT_NAME_DIGITAL(__LINE__, X2_MS1_PIN) -#endif -#if PIN_EXISTS(X2_MS2) - REPORT_NAME_DIGITAL(__LINE__, X2_MS2_PIN) -#endif -#if PIN_EXISTS(X2_MS3) - REPORT_NAME_DIGITAL(__LINE__, X2_MS3_PIN) -#endif #if PIN_EXISTS(X2_STEP) REPORT_NAME_DIGITAL(__LINE__, X2_STEP_PIN) #endif @@ -1067,48 +869,24 @@ #if PIN_EXISTS(Y_MIN) REPORT_NAME_DIGITAL(__LINE__, Y_MIN_PIN) #endif -#if PIN_EXISTS(Y_DIAG) - REPORT_NAME_DIGITAL(__LINE__, Y_DIAG_PIN) -#endif #if PIN_EXISTS(Y_MS1) REPORT_NAME_DIGITAL(__LINE__, Y_MS1_PIN) #endif #if PIN_EXISTS(Y_MS2) REPORT_NAME_DIGITAL(__LINE__, Y_MS2_PIN) #endif -#if PIN_EXISTS(Y_MS3) - REPORT_NAME_DIGITAL(__LINE__, Y_MS3_PIN) -#endif #if PIN_EXISTS(Y_STEP) REPORT_NAME_DIGITAL(__LINE__, Y_STEP_PIN) #endif #if PIN_EXISTS(Y_STOP) REPORT_NAME_DIGITAL(__LINE__, Y_STOP_PIN) #endif -#if PIN_EXISTS(Y2_CS) - REPORT_NAME_DIGITAL(__LINE__, Y2_CS_PIN) -#endif #if PIN_EXISTS(Y2_DIR) REPORT_NAME_DIGITAL(__LINE__, Y2_DIR_PIN) #endif #if PIN_EXISTS(Y2_ENABLE) REPORT_NAME_DIGITAL(__LINE__, Y2_ENABLE_PIN) #endif -#if PIN_EXISTS(Y2_MAX) - REPORT_NAME_DIGITAL(__LINE__, Y2_MAX_PIN) -#endif -#if PIN_EXISTS(Y2_MIN) - REPORT_NAME_DIGITAL(__LINE__, Y2_MIN_PIN) -#endif -#if PIN_EXISTS(Y2_MS1) - REPORT_NAME_DIGITAL(__LINE__, Y2_MS1_PIN) -#endif -#if PIN_EXISTS(Y2_MS2) - REPORT_NAME_DIGITAL(__LINE__, Y2_MS2_PIN) -#endif -#if PIN_EXISTS(Y2_MS3) - REPORT_NAME_DIGITAL(__LINE__, Y2_MS3_PIN) -#endif #if PIN_EXISTS(Y2_STEP) REPORT_NAME_DIGITAL(__LINE__, Y2_STEP_PIN) #endif @@ -1130,8 +908,8 @@ #if PIN_EXISTS(Z_MIN) REPORT_NAME_DIGITAL(__LINE__, Z_MIN_PIN) #endif -#if PIN_EXISTS(Z_DIAG) - REPORT_NAME_DIGITAL(__LINE__, Z_DIAG_PIN) +#if PIN_EXISTS(Z_MIN_PROBE) + REPORT_NAME_DIGITAL(__LINE__, Z_MIN_PROBE_PIN) #endif #if PIN_EXISTS(Z_MS1) REPORT_NAME_DIGITAL(__LINE__, Z_MS1_PIN) @@ -1139,9 +917,6 @@ #if PIN_EXISTS(Z_MS2) REPORT_NAME_DIGITAL(__LINE__, Z_MS2_PIN) #endif -#if PIN_EXISTS(Z_MS3) - REPORT_NAME_DIGITAL(__LINE__, Z_MS3_PIN) -#endif #if PIN_EXISTS(Z_STEP) REPORT_NAME_DIGITAL(__LINE__, Z_STEP_PIN) #endif @@ -1157,12 +932,6 @@ #if PIN_EXISTS(Z2_ENABLE) REPORT_NAME_DIGITAL(__LINE__, Z2_ENABLE_PIN) #endif -#if PIN_EXISTS(Z2_MAX) - REPORT_NAME_DIGITAL(__LINE__, Z2_MAX_PIN) -#endif -#if PIN_EXISTS(Z2_MIN) - REPORT_NAME_DIGITAL(__LINE__, Z2_MIN_PIN) -#endif #if PIN_EXISTS(Z2_MS1) REPORT_NAME_DIGITAL(__LINE__, Z2_MS1_PIN) #endif @@ -1175,63 +944,6 @@ #if PIN_EXISTS(Z2_STEP) REPORT_NAME_DIGITAL(__LINE__, Z2_STEP_PIN) #endif -#if PIN_EXISTS(Z3_CS) - REPORT_NAME_DIGITAL(__LINE__, Z3_CS_PIN) -#endif -#if PIN_EXISTS(Z3_DIR) - REPORT_NAME_DIGITAL(__LINE__, Z3_DIR_PIN) -#endif -#if PIN_EXISTS(Z3_ENABLE) - REPORT_NAME_DIGITAL(__LINE__, Z3_ENABLE_PIN) -#endif -#if PIN_EXISTS(Z3_MAX) - REPORT_NAME_DIGITAL(__LINE__, Z3_MAX_PIN) -#endif -#if PIN_EXISTS(Z3_MIN) - REPORT_NAME_DIGITAL(__LINE__, Z3_MIN_PIN) -#endif -#if PIN_EXISTS(Z3_MS1) - REPORT_NAME_DIGITAL(__LINE__, Z3_MS1_PIN) -#endif -#if PIN_EXISTS(Z3_MS2) - REPORT_NAME_DIGITAL(__LINE__, Z3_MS2_PIN) -#endif -#if PIN_EXISTS(Z3_MS3) - REPORT_NAME_DIGITAL(__LINE__, Z3_MS3_PIN) -#endif -#if PIN_EXISTS(Z3_STEP) - REPORT_NAME_DIGITAL(__LINE__, Z3_STEP_PIN) -#endif -#if PIN_EXISTS(Z4_CS) - REPORT_NAME_DIGITAL(__LINE__, Z4_CS_PIN) -#endif -#if PIN_EXISTS(Z4_DIR) - REPORT_NAME_DIGITAL(__LINE__, Z4_DIR_PIN) -#endif -#if PIN_EXISTS(Z4_ENABLE) - REPORT_NAME_DIGITAL(__LINE__, Z4_ENABLE_PIN) -#endif -#if PIN_EXISTS(Z4_MAX) - REPORT_NAME_DIGITAL(__LINE__, Z4_MAX_PIN) -#endif -#if PIN_EXISTS(Z4_MIN) - REPORT_NAME_DIGITAL(__LINE__, Z4_MIN_PIN) -#endif -#if PIN_EXISTS(Z4_MS1) - REPORT_NAME_DIGITAL(__LINE__, Z4_MS1_PIN) -#endif -#if PIN_EXISTS(Z4_MS2) - REPORT_NAME_DIGITAL(__LINE__, Z4_MS2_PIN) -#endif -#if PIN_EXISTS(Z4_MS3) - REPORT_NAME_DIGITAL(__LINE__, Z4_MS3_PIN) -#endif -#if PIN_EXISTS(Z4_STEP) - REPORT_NAME_DIGITAL(__LINE__, Z4_STEP_PIN) -#endif -#if PIN_EXISTS(Z_MIN_PROBE) - REPORT_NAME_DIGITAL(__LINE__, Z_MIN_PROBE_PIN) -#endif #if PIN_EXISTS(ZRIB_V20_D6) REPORT_NAME_DIGITAL(__LINE__, ZRIB_V20_D6_PIN) #endif @@ -1274,172 +986,33 @@ #if PIN_EXISTS(Z2_SERIAL_RX) REPORT_NAME_DIGITAL(__LINE__, Z2_SERIAL_RX_PIN) #endif -#if PIN_EXISTS(Z3_SERIAL_TX) - REPORT_NAME_DIGITAL(__LINE__, Z3_SERIAL_TX_PIN) -#endif -#if PIN_EXISTS(Z3_SERIAL_RX) - REPORT_NAME_DIGITAL(__LINE__, Z3_SERIAL_RX_PIN) -#endif -#if PIN_EXISTS(Z4_SERIAL_TX) - REPORT_NAME_DIGITAL(__LINE__, Z4_SERIAL_TX_PIN) -#endif -#if PIN_EXISTS(Z4_SERIAL_RX) - REPORT_NAME_DIGITAL(__LINE__, Z4_SERIAL_RX_PIN) -#endif -#if PIN_EXISTS(E0_DIAG) - REPORT_NAME_DIGITAL(__LINE__, E0_DIAG_PIN) -#endif #if PIN_EXISTS(E0_SERIAL_TX) REPORT_NAME_DIGITAL(__LINE__, E0_SERIAL_TX_PIN) #endif #if PIN_EXISTS(E0_SERIAL_RX) REPORT_NAME_DIGITAL(__LINE__, E0_SERIAL_RX_PIN) #endif -#if PIN_EXISTS(E1_DIAG) - REPORT_NAME_DIGITAL(__LINE__, E1_DIAG_PIN) -#endif #if PIN_EXISTS(E1_SERIAL_TX) REPORT_NAME_DIGITAL(__LINE__, E1_SERIAL_TX_PIN) #endif #if PIN_EXISTS(E1_SERIAL_RX) REPORT_NAME_DIGITAL(__LINE__, E1_SERIAL_RX_PIN) #endif -#if PIN_EXISTS(E2_DIAG) - REPORT_NAME_DIGITAL(__LINE__, E2_DIAG_PIN) -#endif #if PIN_EXISTS(E2_SERIAL_TX) REPORT_NAME_DIGITAL(__LINE__, E2_SERIAL_TX_PIN) #endif #if PIN_EXISTS(E2_SERIAL_RX) REPORT_NAME_DIGITAL(__LINE__, E2_SERIAL_RX_PIN) #endif -#if PIN_EXISTS(E3_DIAG) - REPORT_NAME_DIGITAL(__LINE__, E3_DIAG_PIN) -#endif #if PIN_EXISTS(E3_SERIAL_TX) REPORT_NAME_DIGITAL(__LINE__, E3_SERIAL_TX_PIN) #endif #if PIN_EXISTS(E3_SERIAL_RX) REPORT_NAME_DIGITAL(__LINE__, E3_SERIAL_RX_PIN) #endif -#if PIN_EXISTS(E4_DIAG) - REPORT_NAME_DIGITAL(__LINE__, E4_DIAG_PIN) -#endif #if PIN_EXISTS(E4_SERIAL_TX) REPORT_NAME_DIGITAL(__LINE__, E4_SERIAL_TX_PIN) #endif #if PIN_EXISTS(E4_SERIAL_RX) REPORT_NAME_DIGITAL(__LINE__, E4_SERIAL_RX_PIN) #endif -#if PIN_EXISTS(E5_DIAG) - REPORT_NAME_DIGITAL(__LINE__, E5_DIAG_PIN) -#endif -#if PIN_EXISTS(E5_SERIAL_TX) - REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_TX_PIN) -#endif -#if PIN_EXISTS(E5_SERIAL_RX) - REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_RX_PIN) -#endif -#if PIN_EXISTS(E6_DIAG) - REPORT_NAME_DIGITAL(__LINE__, E6_DIAG_PIN) -#endif -#if PIN_EXISTS(E6_SERIAL_TX) - REPORT_NAME_DIGITAL(__LINE__, E6_SERIAL_TX_PIN) -#endif -#if PIN_EXISTS(E6_SERIAL_RX) - REPORT_NAME_DIGITAL(__LINE__, E6_SERIAL_RX_PIN) -#endif -#if PIN_EXISTS(E7_DIAG) - REPORT_NAME_DIGITAL(__LINE__, E7_DIAG_PIN) -#endif -#if PIN_EXISTS(E7_SERIAL_TX) - REPORT_NAME_DIGITAL(__LINE__, E7_SERIAL_TX_PIN) -#endif -#if PIN_EXISTS(E7_SERIAL_RX) - REPORT_NAME_DIGITAL(__LINE__, E7_SERIAL_RX_PIN) -#endif -#if PIN_EXISTS(L6470_CHAIN_SCK) - REPORT_NAME_DIGITAL(__LINE__, L6470_CHAIN_SCK_PIN) -#endif -#if PIN_EXISTS(L6470_CHAIN_MISO) - REPORT_NAME_DIGITAL(__LINE__, L6470_CHAIN_MISO_PIN) -#endif -#if PIN_EXISTS(L6470_CHAIN_MOSI) - REPORT_NAME_DIGITAL(__LINE__, L6470_CHAIN_MOSI_PIN) -#endif -#if PIN_EXISTS(L6470_CHAIN_SS) - REPORT_NAME_DIGITAL(__LINE__, L6470_CHAIN_SS_PIN) -#endif -#if PIN_EXISTS(L6470_RESET_CHAIN) - REPORT_NAME_DIGITAL(__LINE__, L6470_RESET_CHAIN_PIN) -#endif -#if PIN_EXISTS(FET_SAFETY) - REPORT_NAME_DIGITAL(__LINE__, FET_SAFETY_PIN) -#endif -#if PIN_EXISTS(TOUCH_MISO) - REPORT_NAME_DIGITAL(__LINE__, TOUCH_MISO_PIN) -#endif -#if PIN_EXISTS(TOUCH_MOSI) - REPORT_NAME_DIGITAL(__LINE__, TOUCH_MOSI_PIN) -#endif -#if PIN_EXISTS(TOUCH_SCK) - REPORT_NAME_DIGITAL(__LINE__, TOUCH_SCK_PIN) -#endif -#if PIN_EXISTS(TOUCH_CS) - REPORT_NAME_DIGITAL(__LINE__, TOUCH_CS_PIN) -#endif -#if PIN_EXISTS(TOUCH_INT) - REPORT_NAME_DIGITAL(__LINE__, TOUCH_INT_PIN) -#endif -#if PIN_EXISTS(USB_CS) - REPORT_NAME_DIGITAL(__LINE__, USB_CS_PIN) -#endif -#if PIN_EXISTS(USB_INTR) - REPORT_NAME_DIGITAL(__LINE__, USB_INTR_PIN) -#endif -#if PIN_EXISTS(MMU2_RST) - REPORT_NAME_DIGITAL(__LINE__, MMU2_RST_PIN) -#endif -#if PIN_EXISTS(CALIBRATION) - REPORT_NAME_DIGITAL(__LINE__, CALIBRATION_PIN) -#endif -#if PIN_EXISTS(SMART_EFFECTOR_MOD) - REPORT_NAME_DIGITAL(__LINE__, SMART_EFFECTOR_MOD_PIN) -#endif -#if PIN_EXISTS(CLOSED_LOOP_ENABLE) - REPORT_NAME_DIGITAL(__LINE__, CLOSED_LOOP_ENABLE_PIN) -#endif -#if PIN_EXISTS(CLOSED_LOOP_MOVE_COMPLETE) - REPORT_NAME_DIGITAL(__LINE__, CLOSED_LOOP_MOVE_COMPLETE_PIN) -#endif -#if PIN_EXISTS(ESP_WIFI_MODULE_RESET) - REPORT_NAME_DIGITAL(__LINE__, ESP_WIFI_MODULE_RESET_PIN) -#endif -#if PIN_EXISTS(ESP_WIFI_MODULE_ENABLE) - REPORT_NAME_DIGITAL(__LINE__, ESP_WIFI_MODULE_ENABLE_PIN) -#endif -#if PIN_EXISTS(ESP_WIFI_MODULE_GPIO0) - REPORT_NAME_DIGITAL(__LINE__, ESP_WIFI_MODULE_GPIO0_PIN) -#endif -#if PIN_EXISTS(ESP_WIFI_MODULE_GPIO2) - REPORT_NAME_DIGITAL(__LINE__, ESP_WIFI_MODULE_GPIO2_PIN) -#endif -// TFT PINS -#if PIN_EXISTS(TFT_CS) - REPORT_NAME_DIGITAL(__LINE__, TFT_CS_PIN) -#endif -#if PIN_EXISTS(TFT_A0) - REPORT_NAME_DIGITAL(__LINE__, TFT_A0_PIN) -#endif -#if PIN_EXISTS(TFT_DC) - REPORT_NAME_DIGITAL(__LINE__, TFT_DC_PIN) -#endif -#if PIN_EXISTS(TFT_MISO) - REPORT_NAME_DIGITAL(__LINE__, TFT_MISO_PIN) -#endif -#if PIN_EXISTS(TFT_BACKLIGHT) - REPORT_NAME_DIGITAL(__LINE__, TFT_BACKLIGHT_PIN) -#endif -#if PIN_EXISTS(TFT_RESET) - REPORT_NAME_DIGITAL(__LINE__, TFT_RESET_PIN) -#endif diff --git a/Marlin/src/pins/pins_3DRAG.h b/Marlin/src/pins/pins_3DRAG.h new file mode 100644 index 0000000000..61cdb56c1d --- /dev/null +++ b/Marlin/src/pins/pins_3DRAG.h @@ -0,0 +1,163 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * 3DRAG (and K8200 / K8400) Arduino Mega with RAMPS v1.4 pin assignments + */ + +#ifndef BOARD_NAME + #define BOARD_NAME "3Drag" +#endif + +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "3Drag" +#endif + +#ifndef DEFAULT_SOURCE_CODE_URL + #define DEFAULT_SOURCE_CODE_URL "http://3dprint.elettronicain.it/" +#endif + +// +// Heaters / Fans +// +#define RAMPS_D8_PIN 9 +#define RAMPS_D9_PIN 8 +#define MOSFET_D_PIN 12 + +#define CASE_LIGHT_PIN -1 // MUST BE HARDWARE PWM but one is not available on expansion header + +#include "pins_RAMPS.h" + +// +// Limit Switches +// +#undef Z_MAX_PIN +#define Z_MAX_PIN -1 + +// +// Steppers +// +#undef Z_ENABLE_PIN +#define Z_ENABLE_PIN 63 + +// +// Heaters / Fans +// +#define HEATER_2_PIN 6 + +// +// Misc. Functions +// +#undef SDSS +#define SDSS 25 + +#undef SD_DETECT_PIN +#define SD_DETECT_PIN 53 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) + #undef BEEPER_PIN + #define BEEPER_PIN -1 + + #undef LCD_PINS_RS + #undef LCD_PINS_ENABLE + #undef LCD_PINS_D4 + #undef LCD_PINS_D5 + #undef LCD_PINS_D6 + #undef LCD_PINS_D7 + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 37 + #define LCD_PINS_D5 35 + #define LCD_PINS_D6 33 + #define LCD_PINS_D7 31 + + // Buttons + #undef BTN_EN1 + #undef BTN_EN2 + #undef BTN_ENC + #define BTN_EN1 16 + #define BTN_EN2 17 + #define BTN_ENC 23 + +#else + + #define BEEPER_PIN 33 + +#endif // ULTRA_LCD && NEWPANEL + +/** + * M3/M4/M5 - Spindle/Laser Control + * + * If you want to control the speed of your spindle then you'll have + * have to sacrifce the Extruder and pull some signals off the Z stepper + * driver socket. + * + * The following assumes: + * - the Z stepper driver socket is empty + * - the extruder driver socket has a driver board plugged into it + * - the Z stepper wires are attached the the extruder connector + * + * If you want to keep the extruder AND don't have a LCD display then + * you can still control the power on/off and spindle direction. + * + * Where to get spindle signals + * + * stepper signal socket name socket name + * ------- + * SPINDLE_LASER_ENABLE_PIN /ENABLE O| |O VMOT + * MS1 O| |O GND + * MS2 O| |O 2B + * MS3 O| |O 2A + * /RESET O| |O 1A + * /SLEEP O| |O 1B + * SPINDLE_LASER_PWM_PIN STEP O| |O VDD + * SPINDLE_DIR_PIN DIR O| |O GND + * ------- + * + * Note: Socket names vary from vendor to vendor + */ +#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are not good with 3DRAG +#undef SPINDLE_LASER_ENABLE_PIN +#undef SPINDLE_DIR_PIN + +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !EXTRUDERS + #undef E0_DIR_PIN + #undef E0_ENABLE_PIN + #undef E0_STEP_PIN + #undef Z_DIR_PIN + #undef Z_ENABLE_PIN + #undef Z_STEP_PIN + #define Z_DIR_PIN 28 + #define Z_ENABLE_PIN 24 + #define Z_STEP_PIN 26 + #define SPINDLE_LASER_PWM_PIN 46 // MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENABLE_PIN 62 // Pin should have a pullup! + #define SPINDLE_DIR_PIN 48 + #elif !(ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL)) // use expansion header if no LCD in use + #define SPINDLE_LASER_ENABLE_PIN 16 // Pin should have a pullup/pulldown! + #define SPINDLE_DIR_PIN 17 + #endif +#endif diff --git a/Marlin/src/pins/pins_5DPRINT.h b/Marlin/src/pins/pins_5DPRINT.h new file mode 100755 index 0000000000..415cc23bce --- /dev/null +++ b/Marlin/src/pins/pins_5DPRINT.h @@ -0,0 +1,145 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Select Teensy++ 2.0 in Arduino IDE from the 'Tools -> Boards' menu + * + * Installation instructions are at the above URL. Don't bother loading the + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools -> Boards' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +/** + * 5DPrint D8 Driver board pin assignments + * + * https://bitbucket.org/makible/5dprint-d8-controller-board + */ + +#ifndef __AVR_AT90USB1286__ + #error "Oops! Make sure you have 'Teensy++ 2.0' or 'Printrboard' selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "Makibox" +#define BOARD_NAME "5DPrint D8" + +// +// Servos +// +#define SERVO0_PIN 41 +#define SERVO1_PIN 42 +#define SERVO2_PIN 43 +#define SERVO3_PIN 44 + +// +// Limit Switches +// +#define X_STOP_PIN 37 // E5 +#define Y_STOP_PIN 36 // E4 +#define Z_STOP_PIN 19 // E7 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 17 // C7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 13 // C3 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 12 // C2 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 11 // C1 + +// +// Digital Microstepping +// +#define X_MS1_PIN 25 // B5 +#define X_MS2_PIN 26 // B6 +#define Y_MS1_PIN 9 // E1 +#define Y_MS2_PIN 8 // E0 +#define Z_MS1_PIN 7 // D7 +#define Z_MS2_PIN 6 // D6 +#define E0_MS1_PIN 5 // D5 +#define E0_MS2_PIN 4 // D4 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // F1 Analog Input +#define TEMP_BED_PIN 0 // F0 Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 +#define HEATER_BED_PIN 14 // C4 + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 + +//DIGIPOTS slave addresses +#define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for DIGIPOT 0x2C (0x58 <- 0x2C << 1) diff --git a/Marlin/src/pins/pins_ALLIGATOR_R2.h b/Marlin/src/pins/pins_ALLIGATOR_R2.h new file mode 100644 index 0000000000..1bfbcdf224 --- /dev/null +++ b/Marlin/src/pins/pins_ALLIGATOR_R2.h @@ -0,0 +1,161 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Alligator Board R2 + * http://www.3dartists.org/ + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Alligator Board R2" + +// +// Servos +// +#define SERVO0_PIN 36 +#define SERVO1_PIN 40 +#define SERVO2_PIN 41 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 33 // PC1 +#define X_MAX_PIN 34 // PC2 +#define Y_MIN_PIN 35 // PC3 +#define Y_MAX_PIN 37 // PC5 +#define Z_MIN_PIN 38 // PC6 +#define Z_MAX_PIN 39 // PC7 + +// +// Steppers +// +#define X_STEP_PIN 96 // PB24 +#define X_DIR_PIN 2 // PB25 +#define X_ENABLE_PIN 24 // PA15, motor RESET pin + +#define Y_STEP_PIN 94 // PB22 +#define Y_DIR_PIN 95 // PB23 +#define Y_ENABLE_PIN 24 // PA15, motor RESET pin + +#define Z_STEP_PIN 98 // PC27 +#define Z_DIR_PIN 3 // PC28 +#define Z_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E0_STEP_PIN 5 // PC25 +#define E0_DIR_PIN 4 // PC26 +#define E0_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E1_STEP_PIN 28 // PD3 on piggy +#define E1_DIR_PIN 27 // PD2 on piggy +#define E1_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E2_STEP_PIN 11 // PD7 on piggy +#define E2_DIR_PIN 29 // PD6 on piggy +#define E2_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E3_STEP_PIN 30 // PD9 on piggy +#define E3_DIR_PIN 12 // PD8 on piggy +#define E3_ENABLE_PIN 24 // PA15, motor RESET pin + +// Microstepping pins - Mapping not from fastio.h (?) +#define X_MS1_PIN 99 // PC10 +#define Y_MS1_PIN 10 // PC29 +#define Z_MS1_PIN 44 // PC19 +#define E0_MS1_PIN 45 // PC18 + +//#define MOTOR_FAULT_PIN 22 // PB26 , motor X-Y-Z-E0 motor FAULT + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input (PA24) +#define TEMP_1_PIN 2 // Analog Input (PA23 on piggy) +#define TEMP_2_PIN 3 // Analog Input (PA22 on piggy) +#define TEMP_3_PIN 4 // Analog Input (PA6 on piggy) +#define TEMP_BED_PIN 0 // Analog Input (PA16) + +// +// Heaters / Fans +// +// Note that on the Due pin A0 on the board is channel 2 on the ARM chip +#define HEATER_0_PIN 68 // PA1 +#define HEATER_1_PIN 8 // PC22 on piggy +#define HEATER_2_PIN 9 // PC21 on piggy +#define HEATER_3_PIN 97 // PC20 on piggy +#define HEATER_BED_PIN 69 // PA0 + +#ifndef FAN_PIN + #define FAN_PIN 92 // PA5 +#endif +#define FAN1_PIN 31 // PA7 + +// +// Misc. Functions +// +#define SDSS 77 // PA28 +#define SD_DETECT_PIN 87 // PA29 +#define LED_RED_PIN 40 // PC8 +#define LED_GREEN_PIN 41 // PC9 + +#define EXP_VOLTAGE_LEVEL_PIN 65 + +#define SPI_CHAN_DAC 1 + +#define DAC0_SYNC 53 // PB14 +#define DAC1_SYNC 6 // PC24 + +// 64K SPI EEPROM +#define SPI_EEPROM +#define SPI_CHAN_EEPROM1 2 +#define SPI_EEPROM1_CS 25 // PD0 + +// 2K SPI EEPROM +#define SPI_EEPROM2_CS 26 // PD1 + +// FLASH SPI +// 32Mb +#define SPI_FLASH_CS 23 // PA14 + +// +// LCD / Controller +// +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define LCD_PINS_RS 18 + #define LCD_PINS_ENABLE 15 + #define LCD_PINS_D4 19 + #define BEEPER_PIN 64 + + #define BTN_EN1 14 + #define BTN_EN2 16 + #define BTN_ENC 17 + + #if UI_VOLTAGE_LEVEL != 1 + #undef UI_VOLTAGE_LEVEL + #define UI_VOLTAGE_LEVEL 1 + #endif + +#endif // REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER diff --git a/Marlin/src/pins/pins_ANET_10.h b/Marlin/src/pins/pins_ANET_10.h new file mode 100644 index 0000000000..a8cbd5f29c --- /dev/null +++ b/Marlin/src/pins/pins_ANET_10.h @@ -0,0 +1,278 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Anet V1.0 board pin assignments + */ + +/** + * Rev B 16 JUN 2017 + * + * 1) no longer uses Sanguino files to define some of the pins + * 2) added pointers to useable Arduino IDE extensions + * + */ + +/** + * The standard Arduino IDE extension (board manager) for this board + * is located at https://github.com/SkyNet3D/anet-board. + * + * Installation instructions are on that page. + * + * After copying the files to the appropriate location, restart Arduino and + * you'll see "Anet V1.0" and "Anet V1.0 (Optiboot)" in the boards list. + * + * "Anet V1.0" uses the bootloader that was installed on the board when + * it shipped from the factory. + * + * "Anet V1.0 (Optiboot)" frees up another 3K of FLASH. You'll need to burn + * a new bootloader to the board to be able to automatically download a + * compiled image. + * + */ + +/** + * Another usable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +/** + * To burn a new bootloader: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select the board and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +/** + * Additional info: + * + * Anet Schematics - https://github.com/ralf-e/ANET-3D-Board-V1.0 + * Wiring RRDFG Smart Controller - http://www.thingiverse.com/thing:2103748 + * SkyNet3D Anet software development - https://github.com/SkyNet3D/Marlin/ + * Anet Users / Skynet SW on Facebook - https://www.facebook.com/skynet3ddevelopment/ + * + * Many thanks to Hans Raaf (@oderwat) for developing the Anet-specific software and supporting the Anet community. + */ + +#ifndef __AVR_ATmega1284P__ + #error "Oops! Make sure you have 'Anet V1.0', 'Anet V1.0 (Optiboot)' or 'Sanguino' selected in the 'Tools -> Boards' menu and ATmega1284P selected in 'Tools -> Processor' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Anet" +#endif + +// +// Limit Switches +// +#define X_STOP_PIN 18 +#define Y_STOP_PIN 19 +#define Z_STOP_PIN 20 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 21 +#define X_ENABLE_PIN 14 + +#define Y_STEP_PIN 22 +#define Y_DIR_PIN 23 +#define Y_ENABLE_PIN 14 + +#define Z_STEP_PIN 3 +#define Z_DIR_PIN 2 +#define Z_ENABLE_PIN 26 + +#define E0_STEP_PIN 1 +#define E0_DIR_PIN 0 +#define E0_ENABLE_PIN 14 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // Analog Input (pin 33 extruder) +#define TEMP_BED_PIN 6 // Analog Input (pin 34 bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 // (extruder) +#define HEATER_BED_PIN 12 // (bed) + +#ifndef FAN_PIN + #define FAN_PIN 4 +#endif + +// +// Misc. Functions +// +#define SDSS 31 +#define LED_PIN -1 + +/** + * LCD / Controller + * + * Only the following displays are supported: + * ZONESTAR_LCD + * ANET_FULL_GRAPHICS_LCD + * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + */ + +#if ENABLED(ULTRA_LCD) + #define LCD_SDSS 28 + #if ENABLED(ADC_KEYPAD) + #define SERVO0_PIN 27 // free for BLTouch/3D-Touch + #define LCD_PINS_RS 28 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 10 + #define LCD_PINS_D5 11 + #define LCD_PINS_D6 16 + #define LCD_PINS_D7 17 + #define BTN_EN1 -1 + #define BTN_EN2 -1 + #define BTN_ENC -1 + #define ADC_KEYPAD_PIN 1 + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) || ENABLED(ANET_FULL_GRAPHICS_LCD) + // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics + // display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb + // See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748 + #define SERVO0_PIN 29 // free for BLTouch/3D-Touch + #define BEEPER_PIN 17 + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 28 + #define LCD_PINS_D4 30 + #define BTN_EN1 11 + #define BTN_EN2 10 + #define BTN_ENC 16 + #ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(0) + #endif + #ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(63) + #endif + #ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(125) + #endif + #define STD_ENCODER_PULSES_PER_STEP 4 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 + #endif +#else + #define SERVO0_PIN 27 +#endif + +/** + * ==================================================================== + * =============== Alternative RepRapDiscount Wiring ================== + * ==================================================================== + * + * An alternative wiring scheme for the RepRapDiscount Full Graphics Display is + * published by oderwat on Thingiverse at https://www.thingiverse.com/thing:2103748. + * + * Using that adapter requires changing the pin definition as follows: + * #define SERVO0_PIN 27 // free for BLTouch/3D-Touch + * #define BEEPER_PIN 28 + * #define LCD_PINS_RS 30 + * #define LCD_PINS_ENABLE 29 + * #define LCD_PINS_D4 17 + * + * The BLTouch pin becomes LCD:3 + */ + +/** + * ==================================================================== + * ===================== LCD PINOUTS ================================== + * ==================================================================== + * + * Anet V1.0 controller | ZONESTAR_LCD | ANET_FULL_ | RepRapDiscount Full | Thingiverse RepRap wiring + * physical logical alt | | GRAPHICS_LCD | Graphics Display Wiring | http://www.thingiverse + * pin pin functions | | | | .com/thing:2103748 + *------------------------------------------------------------------------------------------------------------------------ + * ANET-J3.1 8 *** | N/A | J3_TX *** | | + * ANET-J3.2 9 *** | N/A | J3_RX *** | | + * ANET-J3.3 6 MISO | N/A | MISO *** | EXP2.1 MISO | EXP2.1 MISO + * ANET-J3.4 +5V | N/A | +5V | | + * ANET-J3.5 7 SCK | N/A | SCK *** | EXP2.2 SCK | EXP2.2 SCK + * ANET-J3.6 5 MOSI | N/A | MOSI *** | EXP2.6 MOSI | EXP2.6 MOSI + * ANET-J3.7 !RESET | N/A | button | EXP2.8 panel button | EXP2.8 panel button + * ANET-J3.8 GND | N/A | GND | EXP2.9 GND | EXP2.9 GND + * ANET-J3.9 4 Don't use | N/A | N/C | | + * ANET-J3.10 +3.3V | N/A | +3.3V *** | | + * | | | | + * | | | | + * ANET-LCD.1 GND | GND | GND | EXP1.9 GND | EXP1.9 GND + * ANET-LCD.2 +5V | +5V | +5V | EXP1.10 +5V | EXP1.10 +5V + * ANET-LCD.3 27 A4 | N/C * | LCD_PINS_RS | EXP1.4 LCD_PINS_RS | EXP2.4 SDSS or N/C * + * ANET-LCD.4 10 | LCD_PINS_D4 | BTN_EN2 | EXP2.3 BTN_EN2 | EXP2.3 BTN_EN2 + * ANET-LCD.5 28 A3 | LCD_PINS_RS | LCD_PINS_ENABLE | EXP1.3 LCD_PINS_ENABLE | EXP1.1 BEEPER_PIN + * ANET-LCD.6 11 | LCD_PINS_D5 | BTN_EN1 | EXP2.5 BTN_EN1 | EXP2.5 BTN_EN1 + * ANET-LCD.7 29 A2 | LCD_PINS_ENABLE | N/C * | EXP2.4 SDSS or N/C * | EXP1.3 LCD_PINS_ENABLE + * ANET-LCD.8 16 SCL | LCD_PINS_D6 | BTN_ENC | EXP1.2 BTN_ENC | EXP1.2 BTN_ENC + * ANET-LCD.9 30 A1 | ADC_KEYPAD_PIN ** | LCD_PINS_D4 | EXP1.5 LCD_PINS_D4 | EXP1.4 LCD_PINS_RS + * ANET-LCD.10 17 SDA | LCD_PINS_D7 | BEEPER_PIN | EXP1.1 BEEPER_PIN | EXP1.5 LCD_PINS_D4 + * + * N/C * - if not connected to the LCD can be used for BLTouch servo input + * ** - analog pin -WITHOUT a pullup + * *** - only connected to something if the Bluetooth module is populated + */ + +/** + * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + * physical pin function + * EXP1.1 BEEPER + * EXP1.2 BTN_ENC + * EXP1.3 LCD_PINS_ENABLE + * EXP1.4 LCD_PINS_RS + * EXP1.5 LCD_PINS_D4 + * EXP1.6 LCD_PINS_D5 (not used) + * EXP1.7 LCD_PINS_D6 (not used) + * EXP1.8 LCD_PINS_D7 (not used) + * EXP1.9 GND + * EXP1.10 VCC + * + * + * EXP2.1 MISO + * EXP2.2 SCK + * EXP2.3 BTN_EN2 + * EXP2.4 SDSS + * EXP2.5 BTN_EN1 + * EXP2.6 MOSI + * EXP2.7 SD_DETECT_PIN + * EXP2.8 button + * EXP2.9 GND + * EXP2.10 NC + */ diff --git a/Marlin/src/pins/pins_ARCHIM2.h b/Marlin/src/pins/pins_ARCHIM2.h new file mode 100644 index 0000000000..ea9348cef0 --- /dev/null +++ b/Marlin/src/pins/pins_ARCHIM2.h @@ -0,0 +1,187 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * ARCHIM2 pin assignment (pins_ARCHIM2.h) + * + * The Archim2 board requires Arduino Archim addons installed. + * Add the following URL to Arduino IDE's Additional Board Manager URLs: + * https://raw.githubusercontent.com/ultimachine/ArduinoAddons/master/package_ultimachine_index.json + * In the Arduino IDE Board Manager search for Archim and install the package. + * Change your target board to "Archim". + * + * Further information is provided by UltiMachine + * https://github.com/ultimachine/Archim/wiki/Archim-v2.0 + * https://github.com/ultimachine/Archim/wiki + * + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Archim' selected from the 'Tools -> Boards' menu." +#endif + +// +// Items marked * have been altered from Archim v1.0 +// + +// TMC2130 Diag Pins (currently just for reference) +#define X_DIAG_PIN 59 // PA4 X_DIAG +#define Y_DIAG_PIN 48 // PC15 Y_DIAG +#define Z_DIAG_PIN 36 // PC4 Z_DIAG +#define E0_DIAG_PIN 78 // PB23 E1_DIAG +#define E1_DIAG_PIN 25 // PD0 E2_DIAG + +// +// Limit Switches +// +// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. +// Otherwise use a physical endstop based configuration. + +#if DISABLED(SENSORLESS_HOMING) + #define X_MIN_PIN 14 // PD4 MIN ES1 + #define X_MAX_PIN 32 // PD10 MAX ES1 + #define Y_MIN_PIN 29 // PD6 MIN ES2 + #define Y_MAX_PIN 15 // PD5 MAX ES2 +#else + #if X_HOME_DIR == -1 + #define X_MIN_PIN X_DIAG_PIN + #define X_MAX_PIN 32 + #else + #define X_MIN_PIN 14 + #define X_MAX_PIN X_DIAG_PIN + #endif + + #if Y_HOME_DIR == -1 + #define Y_MIN_PIN Y_DIAG_PIN + #define Y_MAX_PIN 15 + #else + #define Y_MIN_PIN 29 + #define Y_MAX_PIN Y_DIAG_PIN + #endif +#endif + + #define Z_MIN_PIN 31 // PA7 MIN ES3 + #define Z_MAX_PIN 30 // PD9 MAX ES3 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 38 // PC6 X-STEP * +#define X_DIR_PIN 37 // PC5 X-DIR * +#define X_ENABLE_PIN 41 // PC9 EN1 +#ifndef X_CS_PIN + #define X_CS_PIN 39 // PC7 X_nCS +#endif + +#define Y_STEP_PIN 51 // PC12 Y-STEP * +#define Y_DIR_PIN 92 // PC11 Y-DIR -AddOns * +#define Y_ENABLE_PIN 49 // PC14 Y-EN * +#ifndef Y_CS_PIN + #define Y_CS_PIN 50 // PC13 Y_nCS +#endif + +#define Z_STEP_PIN 46 // PC17 Z-STEP * +#define Z_DIR_PIN 47 // PC16 Z-DIR * +#define Z_ENABLE_PIN 44 // PC19 Z-END * +#ifndef Z_CS_PIN + #define Z_CS_PIN 45 // PC18 Z_nCS +#endif + +#define E0_STEP_PIN 107 // PB10 E1-STEP -AddOns * +#define E0_DIR_PIN 96 // PC10 E1-DIR -AddOns * +#define E0_ENABLE_PIN 105 // PB22 E1-EN -AddOns * +#ifndef E0_CS_PIN + #define E0_CS_PIN 104 // PC20 E1_nCS -AddOns * +#endif + +#define E1_STEP_PIN 22 // PB26 E2_STEP * +#define E1_DIR_PIN 97 // PB24 E2_DIR -AddOns * +#define E1_ENABLE_PIN 18 // PA11 E2-EN +#ifndef E1_CS_PIN + #define E1_CS_PIN 19 // PA10 E2_nCS +#endif + +// +// Software SPI pins for TMC2130 stepper drivers. +// Required for the Archim2 board. +// +#if ENABLED(TMC_USE_SW_SPI) + #define TMC_SW_MOSI 28 // PD3 + #define TMC_SW_MISO 26 // PD1 + #define TMC_SW_SCK 27 // PD2 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 10 // D10 PB19 THERM AN1 * +#define TEMP_1_PIN 9 // D9 PB18 THERM AN2 * +#define TEMP_2_PIN 8 // D8 PB17 THERM AN4 * +#define TEMP_BED_PIN 11 // D11 PB20 THERM AN3 * + +// +// Heaters / Fans +// +#ifndef FAN_PIN + #define FAN_PIN 4 // D4 PC26 FET_PWM1 +#endif +#define FAN1_PIN 5 // D5 PC25 FET_PWM2 + +#define HEATER_0_PIN 6 // D6 PC24 FET_PWM3 +#define HEATER_1_PIN 7 // D7 PC23 FET_PWM4 +#define HEATER_2_PIN 8 // D8 PC22 FET_PWM5 +#define HEATER_BED_PIN 9 // D9 PC21 BED_PWM + +// +// Misc. Functions +// +#define SDSS 87 // D87 PA29 CS + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +#if ENABLED(ULTRA_LCD) + #if ENABLED(NEWPANEL) + #define BEEPER_PIN 23 // D24 PA15_CTS1 + #define LCD_PINS_RS 17 // D17 PA12_RXD1 + #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1 + #define LCD_PINS_D4 69 // D69 PA0_CANTX0 + #define LCD_PINS_D5 54 // D54 PA16_SCK1 + #define LCD_PINS_D6 68 // D68 PA1_CANRX0 + #define LCD_PINS_D7 34 // D34 PC2_PWML0 + + #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 + + // Buttons on AUX-2 + #define BTN_EN1 60 // D60 PA3_TIOB1 + #define BTN_EN2 13 // D13 PB27_TIOB0 + #define BTN_ENC 16 // D16 PA13_TXD1 // the click + #endif // NEWPANEL +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_AZSMZ_MINI.h b/Marlin/src/pins/pins_AZSMZ_MINI.h new file mode 100644 index 0000000000..6d4971b954 --- /dev/null +++ b/Marlin/src/pins/pins_AZSMZ_MINI.h @@ -0,0 +1,142 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * AZSMZ MINI pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "AZSMZ MINI" +#endif + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 +#define Y_MIN_PIN P1_26 +#define Z_MIN_PIN P1_28 +#define Z_MAX_PIN P1_29 + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // A0 (TH1) +#define TEMP_BED_PIN 1 // A1 (TH2) +#define TEMP_1_PIN 2 // A2 (TH3) + +// +// Heaters / Fans +// +// EFB +#define HEATER_0_PIN P2_04 +#define HEATER_BED_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P2_07 +#endif +#define FAN1_PIN P0_26 + +#if ENABLED(AZSMZ_12864) + #define BEEPER_PIN P1_30 + #define DOGLCD_A0 P2_06 + #define DOGLCD_CS P1_22 + #define BTN_EN1 P4_28 + #define BTN_EN2 P1_27 + #define BTN_ENC P3_26 + #define LCD_SDSS P0_16 + #define SD_DETECT_PIN P3_25 +#endif + +// +// Ethernet pins +// +#define ENET_MDIO P1_17 +#define ENET_RX_ER P1_14 +#define ENET_RXD1 P1_10 +#define ENET_MOC P1_16 +#define REF_CLK P1_15 +#define ENET_RXD0 P1_09 +#define ENET_CRS P1_08 +#define ENET_TX_EN P1_04 +#define ENET_TXD0 P1_00 +#define ENET_TXD1 P1_01 + +/** + * PWMs + * + * There are 6 PWMs. Each PWM can be assigned to one of two pins. + * + * SERVO2 does NOT have a PWM assigned to it. + * + * PWM1.1 DIO4 SERVO3_PIN FIL_RUNOUT_PIN 5V output, PWM + * PWM1.1 DIO26 E0_STEP_PIN + * PWM1.2 DIO11 SERVO0_PIN + * PWM1.2 DIO54 X_STEP_PIN + * PWM1.3 DIO6 SERVO1_PIN J5-1 + * PWM1.3 DIO60 Y_STEP_PIN + * PWM1.4 DIO53 SDSS(SSEL0) J3-5 AUX-3 + * PWM1.4 DIO46 Z_STEP_PIN + * PWM1.5 DIO3 X_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.5 DIO9 RAMPS_D9_PIN + * PWM1.6 DIO14 Y_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.6 DIO10 RAMPS_D10_PIN + */ + + /** + * Special pins + * D37 - not 5V tolerant + * D49 - not 5V tolerant + * D57 - open collector + * D58 - open collector + */ diff --git a/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h b/Marlin/src/pins/pins_AZTEEG_X1.h similarity index 75% rename from Marlin/src/pins/sanguino/pins_AZTEEG_X1.h rename to Marlin/src/pins/pins_AZTEEG_X1.h index c3c38eb6f3..17290d1108 100644 --- a/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h +++ b/Marlin/src/pins/pins_AZTEEG_X1.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,15 +16,14 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Azteeg X1 pin assignments */ -#define BOARD_INFO_NAME "Azteeg X1" +#define BOARD_NAME "Azteeg X1" #include "pins_SANGUINOLOLU_12.h" diff --git a/Marlin/src/pins/pins_AZTEEG_X3.h b/Marlin/src/pins/pins_AZTEEG_X3.h new file mode 100644 index 0000000000..0abc9b87d6 --- /dev/null +++ b/Marlin/src/pins/pins_AZTEEG_X3.h @@ -0,0 +1,99 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * AZTEEG_X3 Arduino Mega with RAMPS v1.4 pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu." +#endif + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "Azteeg X3 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) + #define CASE_LIGHT_PIN 6 // Define before RAMPS pins include +#endif +#define BOARD_NAME "Azteeg X3" + +#include "pins_RAMPS_13.h" + +// +// Servos +// +#undef SERVO0_PIN +#undef SERVO1_PIN +#define SERVO0_PIN 44 // SERVO1 port +#define SERVO1_PIN 55 // SERVO2 port + +// +// LCD / Controller +// +#undef STAT_LED_RED_PIN +#undef STAT_LED_BLUE_PIN + +#if ENABLED(VIKI2) || ENABLED(miniVIKI) + + #undef DOGLCD_A0 + #undef DOGLCD_CS + #undef BTN_ENC + #define DOGLCD_A0 31 + #define DOGLCD_CS 32 + #define BTN_ENC 12 + + #define STAT_LED_RED_PIN 64 + #define STAT_LED_BLUE_PIN 63 + +#else + + #define STAT_LED_RED_PIN 6 + #define STAT_LED_BLUE_PIN 11 + +#endif + +// +// Misc +// +#if ENABLED(CASE_LIGHT_ENABLE) && PIN_EXISTS(CASE_LIGHT) && PIN_EXISTS(STAT_LED_RED) && STAT_LED_RED_PIN == CASE_LIGHT_PIN + #undef STAT_LED_RED_PIN +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are no good with the AzteegX3 board +#undef SPINDLE_LASER_ENABLE_PIN +#undef SPINDLE_DIR_PIN + +#if ENABLED(SPINDLE_LASER_ENABLE) + #undef SDA // use EXP3 header + #undef SCL + #if SERVO0_PIN == 7 + #undef SERVO0_PIN + #define SERVO0_PIN 11 + #endif + #define SPINDLE_LASER_PWM_PIN 7 // MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENABLE_PIN 20 // Pin should have a pullup! + #define SPINDLE_DIR_PIN 21 +#endif diff --git a/Marlin/src/pins/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/pins_AZTEEG_X3_PRO.h new file mode 100644 index 0000000000..fa17120651 --- /dev/null +++ b/Marlin/src/pins/pins_AZTEEG_X3_PRO.h @@ -0,0 +1,177 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * AZTEEG_X3_PRO (Arduino Mega) pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu." +#endif + +#if HOTENDS > 5 || E_STEPPERS > 5 + #error "Azteeg X3 Pro supports up to 5 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_NAME "Azteeg X3 Pro" + +// +// RAMPS pins overrides +// +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) + #define CASE_LIGHT_PIN 44 +#endif + +#ifndef FAN_PIN + #define FAN_PIN 6 +#endif + +#include "pins_RAMPS.h" + +// DIGIPOT slave addresses +#define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT 0x2C (0x58 <- 0x2C << 1) +#define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT 0x2E (0x5C <- 0x2E << 1) + +// +// Servos +// +// Tested this pin with bed leveling on a Delta with 1 servo. +// Physical wire attachment on EXT1: GND, 5V, D47. +// +#undef SERVO0_PIN +#define SERVO0_PIN 47 + +// +// Limit Switches +// +// Swap the MIN and MAX endstop pins because the X3 Pro comes with only +// MIN endstop pin headers soldered onto the board. +// +#if ENABLED(DELTA) + #undef X_MIN_PIN + #undef X_MAX_PIN + #undef Y_MIN_PIN + #undef Y_MAX_PIN + #undef Z_MIN_PIN + #undef Z_MAX_PIN + + #define X_MIN_PIN 2 + #define X_MAX_PIN 3 + #define Y_MIN_PIN 15 + #define Y_MAX_PIN 14 + #define Z_MIN_PIN 19 + #define Z_MAX_PIN 18 +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 18 +#endif + +// +// Steppers +// +#define E2_STEP_PIN 23 +#define E2_DIR_PIN 25 +#define E2_ENABLE_PIN 40 + +#define E3_STEP_PIN 27 +#define E3_DIR_PIN 29 +#define E3_ENABLE_PIN 41 + +#define E4_STEP_PIN 43 +#define E4_DIR_PIN 37 +#define E4_ENABLE_PIN 42 + +// +// Temperature Sensors +// +#define TEMP_2_PIN 12 // Analog Input +#define TEMP_3_PIN 11 // Analog Input +#define TEMP_4_PIN 10 // Analog Input +#define TC1 4 // Analog Input (Thermo couple on Azteeg X3Pro) +#define TC2 5 // Analog Input (Thermo couple on Azteeg X3Pro) + +// +// Heaters / Fans +// +#define HEATER_2_PIN 16 +#define HEATER_3_PIN 17 +#define HEATER_4_PIN 4 +#define HEATER_5_PIN 5 +#define HEATER_6_PIN 6 +#define HEATER_7_PIN 11 + +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN 4 // Pin used for the fan to cool motherboard (-1 to disable) +#endif + +// Fans/Water Pump to cool the hotend cool side. +#define ORIG_E0_AUTO_FAN_PIN 5 +#define ORIG_E1_AUTO_FAN_PIN 5 +#define ORIG_E2_AUTO_FAN_PIN 5 +#define ORIG_E3_AUTO_FAN_PIN 5 + +// +// LCD / Controller +// +#undef BEEPER_PIN +#define BEEPER_PIN 33 + +#if ENABLED(VIKI2) || ENABLED(miniVIKI) + #undef SD_DETECT_PIN + #define SD_DETECT_PIN 49 // For easy adapter board + #undef BEEPER_PIN + #define BEEPER_PIN 12 // 33 isn't physically available to the LCD display +#else + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 +#endif + +// +// Misc. Functions +// +#if ENABLED(CASE_LIGHT_ENABLE) && PIN_EXISTS(CASE_LIGHT) && defined(DOGLCD_A0) && DOGLCD_A0 == CASE_LIGHT_PIN + #undef DOGLCD_A0 // Steal pin 44 for the case light; if you have a Viki2 and have connected it + #define DOGLCD_A0 57 // following the Panucatt wiring diagram, you may need to tweak these pin assignments + // as the wiring diagram uses pin 44 for DOGLCD_A0 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are no good with the AzteegX3pro board +#undef SPINDLE_LASER_ENABLE_PIN +#undef SPINDLE_DIR_PIN + +#if ENABLED(SPINDLE_LASER_ENABLE) // EXP2 header + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + #undef BTN_EN2 + #define BTN_EN2 31 // need 7 for the spindle speed PWM + #endif + #define SPINDLE_LASER_PWM_PIN 7 // must have a hardware PWM + #define SPINDLE_LASER_ENABLE_PIN 20 // Pin should have a pullup! + #define SPINDLE_DIR_PIN 21 +#endif + diff --git a/Marlin/src/pins/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/pins_AZTEEG_X5_GT.h new file mode 100755 index 0000000000..3b41b9c4f2 --- /dev/null +++ b/Marlin/src/pins/pins_AZTEEG_X5_GT.h @@ -0,0 +1,122 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Azteeg X5 GT pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Azteeg X5 GT" + #define DEFAULT_WEBSITE_URL "https://www.panucatt.com/azteeg_X5_GT_reprap_3d_printer_controller_p/ax5gt.htm" +#endif + +// +// Set CPU +// +#undef F_CPU +#define F_CPU 120000000 + +// +// Limit Switches +// + +#define X_MIN_PIN P1_24 +#define X_MAX_PIN P1_27 +#define Y_MIN_PIN P1_25 +#define Y_MAX_PIN P1_28 +#define Z_MIN_PIN P1_26 +#define Z_MAX_PIN P1_29 + + +// +// Steppers +// +#define X_STEP_PIN P2_01 +#define X_DIR_PIN P0_11 +#define X_ENABLE_PIN P0_10 + +#define Y_STEP_PIN P2_02 +#define Y_DIR_PIN P0_20 +#define Y_ENABLE_PIN P0_19 + +#define Z_STEP_PIN P2_03 +#define Z_DIR_PIN P0_22 +#define Z_ENABLE_PIN P0_21 + +#define E0_STEP_PIN P2_00 +#define E0_DIR_PIN P0_05 +#define E0_ENABLE_PIN P0_04 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN 0 // A0 (TH1) +#define TEMP_0_PIN 1 // A1 (TH2) +#define TEMP_1_PIN 2 // A2 (TH3) + + +// +// Heaters / Fans +// + +#define HEATER_BED_PIN P2_07 +#define HEATER_0_PIN P2_04 +#define HEATER_1_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P0_26 +#endif +#define FAN1_PIN P1_22 + +// +// Display +// + +#if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define BEEPER_PIN P1_31 + #define DOGLCD_A0 P2_06 + #define DOGLCD_CS P0_16 + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + #define BTN_ENC P2_11 + + #define SD_DETECT_PIN P1_18 + #define SDSS P1_21 + + #define STAT_LED_RED_PIN P1_19 + #define STAT_LED_BLUE_PIN P1_20 +#endif + +// +// Servo +// +#define SERVO0_PIN P1_23 diff --git a/Marlin/src/pins/pins_AZTEEG_X5_MINI_WIFI.h b/Marlin/src/pins/pins_AZTEEG_X5_MINI_WIFI.h new file mode 100644 index 0000000000..78af567a35 --- /dev/null +++ b/Marlin/src/pins/pins_AZTEEG_X5_MINI_WIFI.h @@ -0,0 +1,182 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Azteeg X5 MINI pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Azteeg X5 MINI WIFI" + #define DEFAULT_WEBSITE_URL "http://www.panucatt.com/azteeg_X5_mini_reprap_3d_printer_controller_p/ax5mini.htm" +#endif + +// +// Set CPU +// +#undef F_CPU +#define F_CPU 120000000 + +// +// Servo +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 +#define Y_MIN_PIN P1_26 +#define Z_MIN_PIN P1_28 + +// +// Steppers +// +#define X_STEP_PIN P2_01 +#define X_DIR_PIN P0_11 +#define X_ENABLE_PIN P0_10 + +#define Y_STEP_PIN P2_02 +#define Y_DIR_PIN P0_20 +#define Y_ENABLE_PIN P0_19 + +#define Z_STEP_PIN P2_03 +#define Z_DIR_PIN P0_22 +#define Z_ENABLE_PIN P0_21 + +#define E0_STEP_PIN P2_00 +#define E0_DIR_PIN P0_05 +#define E0_ENABLE_PIN P0_04 + +// +// DIGIPOT slave addresses +// +#define DIGIPOT_I2C_ADDRESS_A 0x58 // shifted slave address for first DIGIPOT (0x58 <- 0x2C << 1) +#define DIGIPOT_I2C_ADDRESS_B 0x5C // shifted slave address for second DIGIPOT (0x5C <- 0x2E << 1) + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN 0 // A0 (TH1) +#define TEMP_0_PIN 1 // A1 (TH2) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_07 +#define HEATER_0_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P0_26 +#endif +#define FAN1_PIN P1_25 + +// +// Display +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(CR10_STOCKDISPLAY) + + // Re-Arm can support Creality stock display without SD card reader and single cable on EXP3. + // Re-Arm J3 pins 1 (p1.31) & 2 (P3.26) are not used. Stock cable will need to have one + // 10-pin IDC connector trimmed or replaced with a 12-pin IDC connector to fit J3. + // Requires REVERSE_ENCODER_DIRECTION in Configuration.h + + #define BEEPER_PIN P2_11 // J3-3 & AUX-4 + + #define BTN_EN1 P0_16 // J3-7 & AUX-4 + #define BTN_EN2 P1_23 // J3-5 & AUX-4 + #define BTN_ENC P3_25 // J3-4 & AUX-4 + + #define LCD_PINS_RS P0_15 // J3-9 & AUX-4 (CS) + #define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI) + #define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK) + + #else + + #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 + #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 + #define BTN_ENC P2_11 // (35) J3-3 & AUX-4 + + #define SD_DETECT_PIN P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 + #define LCD_PINS_RS P0_16 // (16) J3-7 & AUX-4 + #define LCD_SDSS P0_16 // (16) J3-7 & AUX-4 + #define LCD_BACKLIGHT_PIN P0_16 // (16) J3-7 & AUX-4 - only used on DOGLCD controllers + #define LCD_PINS_ENABLE P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define LCD_PINS_D4 P0_15 // (52) (SCK) J3-9 & AUX-3 + + #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 + + #if ENABLED(REPRAPWORLD_KEYPAD) + #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 + #define SHIFT_LD P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #elif DISABLED(NEWPANEL) + //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 + //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 + //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 + //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4 + #endif + + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + //#define LCD_SCREEN_ROT_180 + + #define BEEPER_PIN P1_30 // (37) may change if cable changes + #define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2 + #define DOGLCD_SCK SCK_PIN + #define DOGLCD_MOSI MOSI_PIN + + #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes + #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes + #else + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO + #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER + #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 + #endif + #define BEEPER_PIN P1_30 // (37) not 5V tolerant + #define DOGLCD_CS P0_16 // (16) + #endif + + //#define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 + //#define MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 + //#define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 + //#define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 - sometimes called SDSS + + #if ENABLED(MINIPANEL) + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + #endif + + #endif + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_BAM_DICE_DUE.h b/Marlin/src/pins/pins_BAM_DICE_DUE.h new file mode 100644 index 0000000000..d763392c5d --- /dev/null +++ b/Marlin/src/pins/pins_BAM_DICE_DUE.h @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * BAM&DICE Due (Arduino Mega) pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "2PrintBeta Due supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_NAME "2PrintBeta Due" + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENABLE_PIN 66 // Pin should have a pullup/pulldown! +#define SPINDLE_DIR_PIN 67 +#define SPINDLE_LASER_PWM_PIN 44 // MUST BE HARDWARE PWM + +#include "pins_RAMPS.h" + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#undef TEMP_1_PIN +#define TEMP_0_PIN 9 // Analog Input +#define TEMP_1_PIN 11 // Analog Input diff --git a/Marlin/src/pins/pins_BEAST.h b/Marlin/src/pins/pins_BEAST.h new file mode 100644 index 0000000000..28fb8539a2 --- /dev/null +++ b/Marlin/src/pins/pins_BEAST.h @@ -0,0 +1,291 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if !defined(__STM32F1__) && !defined(__STM32F4__) + #error "Oops! Make sure you have an STM32F1/4 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 21017 Victor Perez Marlin for stm32f1 test + */ + +#define DEFAULT_MACHINE_NAME "STM32F103RET6" +#define BOARD_NAME "Marlin for STM32" + +// Enable I2C_EEPROM for testing +#define I2C_EEPROM + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Steppers +// +#define X_STEP_PIN PE0 +#define X_DIR_PIN PE1 +#define X_ENABLE_PIN PC0 +#define X_MIN_PIN PD5 +#define X_MAX_PIN -1 + +#define Y_STEP_PIN PE2 +#define Y_DIR_PIN PE3 +#define Y_ENABLE_PIN PC1 +#define Y_MIN_PIN PD6 +#define Y_MAX_PIN + +#define Z_STEP_PIN PE4 +#define Z_DIR_PIN PE5 +#define Z_ENABLE_PIN PC2 +#define Z_MIN_PIN PD7 +#define Z_MAX_PIN -1 + +#define Y2_STEP_PIN -1 +#define Y2_DIR_PIN -1 +#define Y2_ENABLE_PIN -1 + +#define Z2_STEP_PIN -1 +#define Z2_DIR_PIN -1 +#define Z2_ENABLE_PIN -1 + +#define E0_STEP_PIN PE6 +#define E0_DIR_PIN PE7 +#define E0_ENABLE_PIN PC3 + +/** + * TODO: Currently using same Enable pin to all steppers. + */ + +#define E1_STEP_PIN PE8 +#define E1_DIR_PIN PE9 +#define E1_ENABLE_PIN PC4 + +#define E2_STEP_PIN PE10 +#define E2_DIR_PIN PE11 +#define E2_ENABLE_PIN PC5 + +// +// Misc. Functions +// +#define SDPOWER -1 +#define SDSS PA15 +#define LED_PIN PB2 + +#define PS_ON_PIN -1 +#define KILL_PIN -1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD12 // EXTRUDER 1 +#define HEATER_1_PIN PD13 +#define HEATER_2_PIN PD14 + +#define HEATER_BED_PIN PB9 // BED +#define HEATER_BED2_PIN -1 // BED2 +#define HEATER_BED3_PIN -1 // BED3 + +#ifndef FAN_PIN + #define FAN_PIN PB10 +#endif + +#define FAN_SOFT_PWM + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 // ANALOG NUMBERING +#define TEMP_0_PIN PA1 // ANALOG NUMBERING +#define TEMP_1_PIN PA2 // ANALOG NUMBERING +#define TEMP_2_PIN PA3 // ANALOG NUMBERING + +// +// LCD Pins +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + // The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD + +#define U_MIN_PIN -1 +#define V_MIN_PIN -1 +#define W_MIN_PIN -1 + diff --git a/Marlin/src/pins/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/pins_BIQU_BQ111_A4.h new file mode 100644 index 0000000000..1b481e2e41 --- /dev/null +++ b/Marlin/src/pins/pins_BIQU_BQ111_A4.h @@ -0,0 +1,163 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * BIQU BQ111-A4 + * + * Applies to the following boards: + * + * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) + * + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "BIQU BQ111-A4" +#endif + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V, 1K series +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series + + +// +// Steppers +// +#define X_STEP_PIN P2_0 +#define X_DIR_PIN P0_5 +#define X_ENABLE_PIN P0_4 + +#define Y_STEP_PIN P2_1 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_2 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_3 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // A0 (T0) +#define TEMP_BED_PIN 1 // A1 (T1) + + +// +// Heaters / Fans +// +#define HEATER_0_PIN P2_7 +#define HEATER_BED_PIN P2_5 +#ifndef FAN_PIN + #define FAN_PIN P2_4 +#endif + +// +// Unused +// +//#define PIN_P2_10 P2_10 // IBOOT-1 +//#define PIN_P0_27 P0_27 // Onboard SD Detect + +/** + * LCD / Controller + * + * REPRAP_DISCOUNT_SMART_CONTROLLER is not supported due to the lack of LCD_PINS_D5, + * LCD_PINS_D6 or LCD_PINS_D7 in the EXP1 connector. + * + * A remote SD card is not supported as the pins routed to EXP2 are the same as used + * for the onboard SD card, and a chip select signal is not provided for the remote + * SD card. + */ +#if ENABLED(ULTRA_LCD) + + #define BEEPER_PIN P1_31 // EXP1-1 + + #define BTN_EN1 P3_26 // EXP2-3 + #define BTN_EN2 P3_25 // EXP2-5 + #define BTN_ENC P1_30 // EXP1-2 + + #define SD_DETECT_PIN P0_27 // EXP2-7 + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 + #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) && DISABLED(DOGLCD) + #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU BQ111-A4" + #endif + + #if ENABLED(SDSUPPORT) + #error "SDSUPPORT is not supported by the BIQU BQ111-A4 when an LCD controller is used" + #endif + +#endif // ULTRA_LCD + + +/** + * SD Card Reader + * + * Software SPI is used to interface with a stand-alone SD card reader connected to EXP1. + * Hardware SPI can't be used because P0_17 (MISO) is not brought out on this board. + */ +#if ENABLED(SDSUPPORT) + + #define SCK_PIN P0_15 // EXP1-5 + #define MISO_PIN P0_16 // EXP1-4 + #define MOSI_PIN P0_18 // EXP1-3 + #define SS_PIN P1_30 // EXP1-2 + #define SDSS SS_PIN + +#endif // SDSUPPORT + + +/** + * PWMS + * + * There are 6 PWMS. Each PWM can be assigned to one of two pins. + * + * PWM1.1 P0_18 LCD_PINS_ENABLE + * PWM1.1 P2_0 X_STEP_PIN + * PWM1.2 P1_20 + * PWM1.2 P2_1 Y_STEP_PIN + * PWM1.3 P1_21 + * PWM1.3 P2_2 Z_STEP_PIN + * PWM1.4 P1_23 + * PWM1.4 P2_3 E0_STEP_PIN + * PWM1.5 P1_24 X_MIN_PIN + * PWM1.5 P2_4 FAN_PIN + * PWM1.6 P1_26 Y_MIN_PIN + * PWM1.6 P2_5 HEATER_BED_PIN + */ diff --git a/Marlin/src/pins/ramps/pins_BIQU_KFB_2.h b/Marlin/src/pins/pins_BIQU_KFB_2.h similarity index 80% rename from Marlin/src/pins/ramps/pins_BIQU_KFB_2.h rename to Marlin/src/pins/pins_BIQU_KFB_2.h index b31df11563..f629424a8d 100644 --- a/Marlin/src/pins/ramps/pins_BIQU_KFB_2.h +++ b/Marlin/src/pins/pins_BIQU_KFB_2.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * KFB 2.0 – Arduino Mega2560 with RAMPS v1.4 pin assignments @@ -29,7 +28,7 @@ #error "KFB 2.0 supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "KFB 2.0" +#define BOARD_NAME "KFB 2.0" // // Heaters / Fans diff --git a/Marlin/src/pins/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/pins_BQ_ZUM_MEGA_3D.h new file mode 100644 index 0000000000..f80379eda2 --- /dev/null +++ b/Marlin/src/pins/pins_BQ_ZUM_MEGA_3D.h @@ -0,0 +1,118 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * bq ZUM Mega 3D board definition + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "ZUM Mega 3D" + +// +// Heaters / Fans +// +#define RAMPS_D8_PIN 10 +#define RAMPS_D9_PIN 12 +#define RAMPS_D10_PIN 9 +#define MOSFET_D_PIN 7 + +// +// Auto fans +// +#define ORIG_E0_AUTO_FAN_PIN 11 +#define ORIG_E1_AUTO_FAN_PIN 6 +#define ORIG_E2_AUTO_FAN_PIN 6 +#define ORIG_E3_AUTO_FAN_PIN 6 + +// +// Misc. Functions +// +#define CASE_LIGHT_PIN 44 // MUST BE HARDWARE PWM + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENABLE_PIN 40 // Pin should have a pullup/pulldown! +#define SPINDLE_LASER_PWM_PIN 44 // MUST BE HARDWARE PWM +#define SPINDLE_DIR_PIN 42 + +#include "pins_RAMPS_13.h" + +// +// Limit Switches +// +#undef X_MAX_PIN +#define X_MAX_PIN 79 // 2 + +// +// Z Probe (when not Z_MIN_PIN) +// +#undef Z_MIN_PROBE_PIN +#define Z_MIN_PROBE_PIN 19 // IND_S_5V + +#undef Z_ENABLE_PIN +#define Z_ENABLE_PIN 77 // 62 + +// +// Steppers +// +#define DIGIPOTSS_PIN 22 +#define DIGIPOT_CHANNELS { 4, 5, 3, 0, 1 } + +// +// Temperature Sensors +// +#undef TEMP_1_PIN +#define TEMP_1_PIN 14 // Analog Input (15) + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 15 // Analog Input (14) + +// +// Misc. Functions +// +#undef PS_ON_PIN // 12 +#define PS_ON_PIN 81 // External Power Supply + + +// This board has headers for Z-min, Z-max and IND_S_5V *but* as the bq team +// decided to ship the printer only with the probe and no additional Z-min +// endstop and the instruction manual advises the user to connect the probe to +// IND_S_5V the option Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN will not work. +#ifdef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + #undef Z_MIN_PIN + #undef Z_MAX_PIN + #define Z_MIN_PIN 19 // IND_S_5V + #define Z_MAX_PIN 18 // Z-MIN Label +#endif + + +// +// This pin is used by the official Hephestos 2 heated bed upgrade kit +// +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef HEATER_BED_PIN + #define HEATER_BED_PIN 8 +#endif diff --git a/Marlin/src/pins/pins_BRAINWAVE.h b/Marlin/src/pins/pins_BRAINWAVE.h new file mode 100644 index 0000000000..a43c6be95c --- /dev/null +++ b/Marlin/src/pins/pins_BRAINWAVE.h @@ -0,0 +1,125 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Brainwave 1.0 pin assignments (AT90USB646) + * + * Requires hardware bundle for Arduino: + * https://github.com/unrepentantgeek/brainwave-arduino + */ + +/** + * Rev B 16 JAN 2017 + * + * Added pointer to a currently available Arduino IDE extension that will + * allow this board to use the latest Marlin software + */ + +/** + * Rev C 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * Marlin_AT90USB - https://github.com/Bob-the-Kuhn/Marlin_AT90USB + * This is the only known IDE extension that is compatible with the pin definitions + * in this file, Adrduino 1.6.12 and the latest mainstream Marlin software. + * + * "Marlin_AT90USB" makes PWM0A available rather than the usual PWM1C. These PWMs share + * the same physical pin. Marlin uses TIMER1 to generate interrupts and sets it up such + * that PWM1A, PWM1B & PWM1C can't be used. + * + * Installation: + * + * 1. In the Arduino IDE, under Files -> Preferences paste the following URL + * https://rawgit.com/Bob-the-Kuhn/Marlin_AT90USB/master/package_MARLIN_AT90USB_index.json + * 2. Under Tools -> Board -> Boards manager, scroll to the bottom, click on MARLIN_AT90USB + * and then click on "Install" + * 3. Select "AT90USB646_TEENSYPP" from the 'Tools -> Boards' menu. + */ + +/** + * To burn the bootloader that comes with Marlin_AT90USB: + * + * 1. Connect your programmer to the board. + * 2. In Arduino IDE select "AT90USB646_TEENSYPP" and then select the programmer. + * 3. In Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#ifndef __AVR_AT90USB646__ + #error "Oops! Make sure you have 'AT90USB646_TEENSYPP' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Brainwave" + +// +// Limit Switches +// +#define X_STOP_PIN 35 // A7 +#define Y_STOP_PIN 34 // A6 +#define Z_STOP_PIN 33 // A5 + +// +// Steppers +// +#define X_STEP_PIN 3 // D3 +#define X_DIR_PIN 5 // D5 +#define X_ENABLE_PIN 4 // D4 +#define X_ATT_PIN 2 // D2 + +#define Y_STEP_PIN 7 // D7 +#define Y_DIR_PIN 9 // E1 +#define Y_ENABLE_PIN 8 // E0 +#define Y_ATT_PIN 6 // D6 + +#define Z_STEP_PIN 11 // C1 +#define Z_DIR_PIN 13 // C3 +#define Z_ENABLE_PIN 12 // C2 +#define Z_ATT_PIN 10 // C0 + +#define E0_STEP_PIN 15 // C5 +#define E0_DIR_PIN 17 // C7 +#define E0_ENABLE_PIN 16 // C6 +#define E0_ATT_PIN 14 // C4 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // F7 Analog Input +#define TEMP_BED_PIN 6 // F6 Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 32 // A4 Extruder +#define HEATER_BED_PIN 18 // E6 Bed + +#ifndef FAN_PIN + #define FAN_PIN 31 // A3 Fan +#endif + +// +// Misc. Functions +// +#define LED_PIN 19 // E7 diff --git a/Marlin/src/pins/pins_BRAINWAVE_PRO.h b/Marlin/src/pins/pins_BRAINWAVE_PRO.h new file mode 100644 index 0000000000..49c8ab6b59 --- /dev/null +++ b/Marlin/src/pins/pins_BRAINWAVE_PRO.h @@ -0,0 +1,137 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Brainwave Pro pin assignments (AT90USB1286) + * + * Requires hardware bundle for Arduino: + * https://github.com/unrepentantgeek/brainwave-arduino + */ + +/** + * Rev B 16 JAN 2017 + * + * Added pointers to currently available Arduino IDE extensions that will + * allow this board to use the latest Marlin software + * + * + * Rev C 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Select Teensy++ 2.0 in Arduino IDE from the 'Tools -> Boards' menu + * + * Installation instructions are at the above URL. Don't bother loading the + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools -> Boards' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#ifndef __AVR_AT90USB1286__ + #error "Oops! Make sure you have 'Teensy++ 2.0' or 'Printrboard' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Brainwave Pro" + +// +// Limit Switches +// +#define X_STOP_PIN 45 // F7 +#define Y_STOP_PIN 12 // C2 +#define Z_STOP_PIN 36 // E4 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 11 // C1 +#endif + +// +// Steppers +// +#define X_STEP_PIN 9 // E1 +#define X_DIR_PIN 8 // E0 +#define X_ENABLE_PIN 23 // B3 + +#define Y_STEP_PIN 7 // D7 +#define Y_DIR_PIN 6 // D6 +#define Y_ENABLE_PIN 20 // B0 + +#define Z_STEP_PIN 5 // D5 +#define Z_DIR_PIN 4 // D4 +#define Z_ENABLE_PIN 37 // E5 + +#define E0_STEP_PIN 47 // E3 +#define E0_DIR_PIN 46 // E2 +#define E0_ENABLE_PIN 25 // B5 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 2 // F2 Analog Input +#define TEMP_1_PIN 1 // F1 Analog Input +#define TEMP_BED_PIN 0 // F0 Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 27 // B7 +#define HEATER_BED_PIN 26 // B6 Bed +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 Fan, PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 +#define SD_DETECT_PIN 24 // B4 +#define LED_PIN 13 // C3 diff --git a/Marlin/src/pins/pins_CHEAPTRONIC.h b/Marlin/src/pins/pins_CHEAPTRONIC.h new file mode 100644 index 0000000000..e8f2c5f67e --- /dev/null +++ b/Marlin/src/pins/pins_CHEAPTRONIC.h @@ -0,0 +1,86 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Cheaptronic v1.0 pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Cheaptronic v1.0" +// +// Limit Switches +// +#define X_STOP_PIN 3 +#define Y_STOP_PIN 2 +#define Z_STOP_PIN 5 + +// +// Steppers +// +#define X_STEP_PIN 14 +#define X_DIR_PIN 15 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 35 +#define Y_DIR_PIN 36 +#define Y_ENABLE_PIN 31 + +#define Z_STEP_PIN 40 +#define Z_DIR_PIN 41 +#define Z_ENABLE_PIN 37 + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 25 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 + +// +// Temperature sensors +// +#define TEMP_0_PIN 15 // Analog Input +#define TEMP_1_PIN 14 // Analog Input +#define TEMP_BED_PIN 13 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 19 // EXTRUDER 1 +#define HEATER_1_PIN 23 // EXTRUDER 2 +#define HEATER_BED_PIN 22 + +// +// LCD / Controller +// +// Cheaptronic v1.0 doesn't support LCD +#define LCD_PINS_RS -1 +#define LCD_PINS_ENABLE -1 + +// Cheaptronic v1.0 doesn't support keypad +#define BTN_EN1 -1 +#define BTN_EN2 -1 +#define BTN_ENC -1 diff --git a/Marlin/src/pins/pins_CHEAPTRONICv2.h b/Marlin/src/pins/pins_CHEAPTRONICv2.h new file mode 100644 index 0000000000..eea57d23ec --- /dev/null +++ b/Marlin/src/pins/pins_CHEAPTRONICv2.h @@ -0,0 +1,130 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Cheaptronic v2.0 pin assignments + * Built and sold by Michal Dyntar - RRO + * www.reprapobchod.cz + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Cheaptronic v2.0" + +// +// Limit Switches +// +#define X_MIN_PIN 30 +#define X_MAX_PIN 31 +#define Y_MIN_PIN 32 +#define Y_MAX_PIN 33 +#define Z_MIN_PIN 34 +#define Z_MAX_PIN 35 + +// +// Steppers +// +#define X_STEP_PIN 17 +#define X_DIR_PIN 16 +#define X_ENABLE_PIN 48 + +#define Y_STEP_PIN 54 +#define Y_DIR_PIN 47 +#define Y_ENABLE_PIN 55 + +#define Z_STEP_PIN 57 +#define Z_DIR_PIN 56 +#define Z_ENABLE_PIN 62 + +#define E0_STEP_PIN 23 +#define E0_DIR_PIN 22 +#define E0_ENABLE_PIN 24 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 25 +#define E1_ENABLE_PIN 27 + +#define E2_STEP_PIN 29 +#define E2_DIR_PIN 28 +#define E2_ENABLE_PIN 39 + +// +// Temperature sensors +// +#define TEMP_0_PIN 15 +#define TEMP_1_PIN 13 +#define TEMP_2_PIN 14 +#define TEMP_3_PIN 11 // should be used for chamber temperature control +#define TEMP_BED_PIN 12 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 6 +#define HEATER_1_PIN 7 +#define HEATER_2_PIN 8 +#define HEATER_BED_PIN 9 +#ifndef FAN_PIN + #define FAN_PIN 3 +#endif +#define FAN2_PIN 58 // additional fan or light control output + +// +// Other board specific pins +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 37 // board input labeled as F-DET +#endif +#define Z_MIN_PROBE_PIN 36 // additional external board input labeled as E-SENS (should be used for Z-probe) +#define LED_PIN 13 +#define SPINDLE_ENABLE_PIN 4 // additional PWM pin 1 at JP1 connector - should be used for laser control too +#define EXT_2 5 // additional PWM pin 2 at JP1 connector +#define EXT_3 2 // additional PWM pin 3 at JP1 connector +#define PS_ON_PIN 45 +#define KILL_PIN 46 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 11 // shared with TEMP_3 analog input +#endif + +// +// LCD +// +#define LCD_PINS_RS 19 +#define LCD_PINS_ENABLE 42 +#define LCD_PINS_D4 18 +#define LCD_PINS_D5 38 +#define LCD_PINS_D6 41 +#define LCD_PINS_D7 40 + +// +// SD CARD, ROTARY ENCODER, BEEPER +// +#define SDPOWER -1 +#define SDSS 53 +#define SD_DETECT_PIN 49 +#define BEEPER_PIN 44 +#define BTN_EN1 11 +#define BTN_EN2 12 +#define BTN_ENC 43 diff --git a/Marlin/src/pins/pins_CHITU3D.h b/Marlin/src/pins/pins_CHITU3D.h new file mode 100644 index 0000000000..bfa92357ef --- /dev/null +++ b/Marlin/src/pins/pins_CHITU3D.h @@ -0,0 +1,289 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if !defined(__STM32F1__) && !defined(__STM32F4__) + #error "Oops! Make sure you have an STM32F1/4 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 2017 Victor Perez Marlin for stm32f1 test + */ + +#define DEFAULT_MACHINE_NAME "STM32F103RET6" +#define BOARD_NAME "Chitu3d Marlin" + +// Enable I2C_EEPROM for testing +//#define I2C_EEPROM + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Steppers +// +#define X_STEP_PIN PE5 +#define X_DIR_PIN PE6 +#define X_ENABLE_PIN PC13 +#define X_MIN_PIN PG10 +#define X_MAX_PIN -1 + +#define Y_STEP_PIN PE2 +#define Y_DIR_PIN PE3 +#define Y_ENABLE_PIN PE4 +#define Y_MIN_PIN PA12 +#define Y_MAX_PIN + +#define Z_STEP_PIN PB9 +#define Z_DIR_PIN PE0 +#define Z_ENABLE_PIN PE1 +#define Z_MIN_PIN PA14 +#define Z_MAX_PIN -1 + +#define Y2_STEP_PIN -1 +#define Y2_DIR_PIN -1 +#define Y2_ENABLE_PIN -1 + +#define Z2_STEP_PIN -1 +#define Z2_DIR_PIN -1 +#define Z2_ENABLE_PIN -1 + +#define E0_STEP_PIN PB4 +#define E0_DIR_PIN PB5 +#define E0_ENABLE_PIN PB8 + + + +#define E1_STEP_PIN -1 +#define E1_DIR_PIN -1 +#define E1_ENABLE_PIN -1 + +#define E2_STEP_PIN -1 +#define E2_DIR_PIN -1 +#define E2_ENABLE_PIN -1 + +// +// Misc. Functions +// +#define SDPOWER -1 +#define SDSS -1 +#define LED_PIN -1 +#define CASE_LIGHT_PIN 8 + +#define PS_ON_PIN -1 +#define KILL_PIN PD6 // LED strip 24v + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD12 // HOT-END +#define HEATER_1_PIN -1 +#define HEATER_2_PIN -1 + +#define HEATER_BED_PIN PG11 // HOT-BED +#define HEATER_BED2_PIN -1 // BED2 +#define HEATER_BED3_PIN -1 // BED3 + +#ifndef FAN_PIN + #define FAN_PIN PG14 // MAIN BOARD FAN +#endif + +#define FAN_SOFT_PWM + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 // ANALOG NUMBERING +#define TEMP_0_PIN PA1 // ANALOG NUMBERING +#define TEMP_1_PIN -1 // ANALOG NUMBERING +#define TEMP_2_PIN -1 // ANALOG NUMBERING + +// +// LCD Pins +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + // The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD + +#define U_MIN_PIN -1 +#define V_MIN_PIN -1 +#define W_MIN_PIN -1 + diff --git a/Marlin/src/pins/pins_CNCONTROLS_11.h b/Marlin/src/pins/pins_CNCONTROLS_11.h new file mode 100644 index 0000000000..0a32d04a18 --- /dev/null +++ b/Marlin/src/pins/pins_CNCONTROLS_11.h @@ -0,0 +1,122 @@ +/** + * CartesioV11 pin assignments + */ + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu. +#endif + +#define BOARD_NAME "CN Controls V11" + +// +// Limit Switches +// +#define X_STOP_PIN 43 +#define Y_STOP_PIN 45 +#define Z_STOP_PIN 42 + +// +// Steppers +// +#define X_STEP_PIN 34 +#define X_DIR_PIN 36 +#define X_ENABLE_PIN 35 + +#define Y_STEP_PIN 37 +#define Y_DIR_PIN 39 +#define Y_ENABLE_PIN 38 + +#define Z_STEP_PIN 40 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 41 + +#define E0_STEP_PIN 29 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 3 + +#define E1_STEP_PIN 61 +#define E1_DIR_PIN 62 +#define E1_ENABLE_PIN 60 + +#define E2_STEP_PIN 15 +#define E2_DIR_PIN 14 +#define E2_ENABLE_PIN 16 + +#define E3_STEP_PIN 44 +#define E3_DIR_PIN 49 +#define E3_ENABLE_PIN 47 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 3 // Analog Input. 3 for tool2 -> 2 for chambertemp +#define TEMP_2_PIN 2 // Analog Input. 9 for tool3 -> 2 for chambertemp +#define TEMP_3_PIN 11 // Analog Input. 11 for tool4 -> 2 for chambertemp +#define TEMP_BED_PIN 1 // Analog Input +//#define TEMP_CHAMBER_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 5 +#define HEATER_1_PIN 58 +#define HEATER_2_PIN 64 +#define HEATER_3_PIN 46 +#define HEATER_BED_PIN 2 + +#ifndef FAN_PIN + //#define FAN_PIN 7 // common PWM pin for all tools +#endif + +#define ORIG_E0_AUTO_FAN_PIN 7 +#define ORIG_E1_AUTO_FAN_PIN 7 +#define ORIG_E2_AUTO_FAN_PIN 7 +#define ORIG_E3_AUTO_FAN_PIN 7 + +// +// Misc. Functions +// +#define SDSS 53 +#define SD_DETECT_PIN 13 + +// Tools + +//#define TOOL_0_PIN 4 +//#define TOOL_1_PIN 59 +//#define TOOL_2_PIN 8 +//#define TOOL_3_PIN 30 +//#define TOOL_PWM_PIN 7 // common PWM pin for all tools + +// Common I/O + +//#define FIL_RUNOUT_PIN -1 +//#define PWM_1_PIN 11 +//#define PWM_2_PIN 10 +//#define SPARE_IO 12 + +// +// LCD / Controller +// +#define BEEPER_PIN 6 + +// Pins for DOGM SPI LCD Support +#define DOGLCD_A0 26 +#define DOGLCD_CS 24 +#define DOGLCD_MOSI -1 +#define DOGLCD_SCK -1 + +#define BTN_EN1 23 +#define BTN_EN2 25 +#define BTN_ENC 27 + +// Hardware buttons for manual movement of XYZ +#define SHIFT_OUT 19 +#define SHIFT_LD 18 +#define SHIFT_CLK 17 + +//#define UI1 31 +//#define UI2 22 + +#define STAT_LED_BLUE_PIN -1 +#define STAT_LED_RED_PIN 31 diff --git a/Marlin/src/pins/pins_CNCONTROLS_12.h b/Marlin/src/pins/pins_CNCONTROLS_12.h new file mode 100644 index 0000000000..f073b19c96 --- /dev/null +++ b/Marlin/src/pins/pins_CNCONTROLS_12.h @@ -0,0 +1,129 @@ +/** + * CartesioV12 pin assignments + */ + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu. +#endif + +#define BOARD_NAME "CN Controls V12" + +// +// Limit Switches +// +#define X_STOP_PIN 19 +#define Y_STOP_PIN 22 +#define Z_STOP_PIN 23 + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 27 +#define X_ENABLE_PIN 26 + +#define Y_STEP_PIN 28 +#define Y_DIR_PIN 30 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 31 +#define Z_DIR_PIN 33 +#define Z_ENABLE_PIN 32 + +#define E0_STEP_PIN 57 +#define E0_DIR_PIN 55 +#define E0_ENABLE_PIN 58 + +#define E1_STEP_PIN 61 +#define E1_DIR_PIN 62 +#define E1_ENABLE_PIN 60 + +#define E2_STEP_PIN 46 +#define E2_DIR_PIN 66 +#define E2_ENABLE_PIN 44 + +#define E3_STEP_PIN 45 +#define E3_DIR_PIN 69 +#define E3_ENABLE_PIN 47 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 9 // Analog Input. 9 for tool2 -> 13 for chambertemp +#define TEMP_2_PIN 13 // Analog Input. 10 for tool3 -> 13 for chambertemp +#define TEMP_3_PIN 11 // Analog Input. 11 for tool4 -> 13 for chambertemp +#define TEMP_BED_PIN 14 // Analog Input +//#define TEMP_CHAMBER_PIN 13 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 11 +#define HEATER_1_PIN 9 +#define HEATER_2_PIN 6 +#define HEATER_3_PIN 3 +#define HEATER_BED_PIN 24 + +#ifndef FAN_PIN + #define FAN_PIN 5 // 5 is PWMtool3 -> 7 is common PWM pin for all tools +#endif + +#define ORIG_E0_AUTO_FAN_PIN 7 +#define ORIG_E1_AUTO_FAN_PIN 7 +#define ORIG_E2_AUTO_FAN_PIN 7 +#define ORIG_E3_AUTO_FAN_PIN 7 + +// +// Misc. Functions +// +#define SDSS 53 +#define SD_DETECT_PIN 15 + +// Tools + +//#define TOOL_0_PIN 56 +//#define TOOL_0_PWM_PIN 10 // red warning led at dual extruder +//#define TOOL_1_PIN 59 +//#define TOOL_1_PWM_PIN 8 // lights at dual extruder +//#define TOOL_2_PIN 4 +//#define TOOL_2_PWM_PIN 5 +//#define TOOL_3_PIN 14 +//#define TOOL_3_PWM_PIN 2 + +// Common I/O + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 18 +#endif +//#define PWM_1_PIN 12 +//#define PWM_2_PIN 13 +//#define SPARE_IO 17 + +// +// LCD / Controller +// +#define BEEPER_PIN 16 + +// Pins for DOGM SPI LCD Support +#define DOGLCD_A0 39 +#define DOGLCD_CS 35 +#define DOGLCD_MOSI 48 +#define DOGLCD_SCK 49 +#define LCD_SCREEN_ROT_180 + +// The encoder and click button +#define BTN_EN1 36 +#define BTN_EN2 34 +#define BTN_ENC 38 + +// Hardware buttons for manual movement of XYZ +#define SHIFT_OUT 42 +#define SHIFT_LD 41 +#define SHIFT_CLK 40 + +//#define UI1 43 +//#define UI2 37 + +#define STAT_LED_BLUE_PIN -1 +#define STAT_LED_RED_PIN 10 // TOOL_0_PWM_PIN diff --git a/Marlin/src/pins/pins_COHESION3D_MINI.h b/Marlin/src/pins/pins_COHESION3D_MINI.h new file mode 100644 index 0000000000..ea568b266f --- /dev/null +++ b/Marlin/src/pins/pins_COHESION3D_MINI.h @@ -0,0 +1,174 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Cohesion3D Mini pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Cohesion3D Mini" +#endif + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 +#define X_CS_PIN P1_10 // Ethernet Expansion - Pin 9 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 +#define Y_CS_PIN P1_09 // Ethernet Expansion - Pin 10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 +#define Z_CS_PIN P1_00 // Ethernet Expansion - Pin 11 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 +#define E0_CS_PIN P1_04 // Ethernet Expansion - Pin 12 + +// +// Default pins for TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_16 // Ethernet Expansion - Pin 5 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P1_17 // Ethernet Expansion - Pin 6 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P1_08 // Ethernet Expansion - Pin 7 + #endif +#endif + +// +// Analog Inputs +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // P0_23 +#define TEMP_BED_PIN 1 // P0_24 + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 // FET 1 +#ifndef FAN_PIN + #define FAN_PIN P2_06 // ReMix FET 4, Mini FET 3 +#endif + +// +// Auto fans +// +#define AUTO_FAN_PIN P2_04 // FET 4 + +#define ORIG_E0_AUTO_FAN_PIN AUTO_FAN_PIN +#define ORIG_E1_AUTO_FAN_PIN AUTO_FAN_PIN +#define ORIG_E2_AUTO_FAN_PIN AUTO_FAN_PIN + +// +// Misc. Functions +// +#define LED_PIN P4_28 // Play LED + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) + #undef HEATER_0_PIN + #define SPINDLE_LASER_ENABLE_PIN P2_07 // FET 1 + #undef HEATER_BED_PIN + #define SPINDLE_LASER_PWM_PIN P2_05 // Bed FET + #undef FAN_PIN + #define SPINDLE_DIR_PIN P2_06 // ReMix FET 4, Mini FET 3 +#endif + +// +// LCD / Controller +// +// LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be +// defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. +// +// A remote SD card is currently not supported because the pins routed to the EXP2 +// connector are shared with the onboard SD card, and Marlin does not support reading +// G-code files from the onboard SD card. +// +#if ENABLED(ULTRA_LCD) + + #define BEEPER_PIN P0_27 // EXP2-7 - open drain + + #define BTN_EN1 P3_26 // EXP2-5 + #define BTN_EN2 P3_25 // EXP2-3 + #define BTN_ENC P1_30 // EXP1-2 + + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_SDSS P0_28 // EXP2-4 + #define LCD_PINS_ENABLE P0_18 // EXP1-3 + #define LCD_PINS_D4 P0_15 // EXP1-5 + + #define KILL_PIN P2_11 // EXP2-10 + + #if ENABLED(SDSUPPORT) + #error "SDSUPPORT is not currently supported by the Cohesion3D boards" + #endif + +#endif // ULTRA_LCD + +// +// Ethernet pins +// +#define ENET_MDIO P1_17 +#define ENET_RX_ER P1_14 +#define ENET_RXD1 P1_10 +#define ENET_MOC P1_16 +#define REF_CLK P1_15 +#define ENET_RXD0 P1_09 +#define ENET_CRS P1_08 +#define ENET_TX_EN P1_04 +#define ENET_TXD0 P1_00 +#define ENET_TXD1 P1_01 diff --git a/Marlin/src/pins/pins_COHESION3D_REMIX.h b/Marlin/src/pins/pins_COHESION3D_REMIX.h new file mode 100644 index 0000000000..77346914fb --- /dev/null +++ b/Marlin/src/pins/pins_COHESION3D_REMIX.h @@ -0,0 +1,196 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Cohesion3D ReMix pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Cohesion3D ReMix" +#endif + +// +// Servos +// +#define SERVO0_PIN P2_04 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 +#define X_CS_PIN P1_10 // Ethernet Expansion - Pin 9 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 +#define Y_CS_PIN P1_09 // Ethernet Expansion - Pin 10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 +#define Z_CS_PIN P1_00 // Ethernet Expansion - Pin 11 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 +#define E0_CS_PIN P1_04 // Ethernet Expansion - Pin 12 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 +#define E1_CS_PIN P1_01 // Ethernet Expansion - Pin 14 + +#define E2_STEP_PIN P1_20 +#define E2_DIR_PIN P1_19 +#define E2_ENABLE_PIN P1_21 +#define E2_CS_PIN P1_18 // FET 6 + +// +// Default pins for TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_16 // Ethernet Expansion - Pin 5 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P1_17 // Ethernet Expansion - Pin 6 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P1_08 // Ethernet Expansion - Pin 7 + #endif +#endif + +// +// Analog Inputs +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // P0_23 +#define TEMP_BED_PIN 1 // P0_24 +#define TEMP_1_PIN 2 // P0_25 +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILWIDTH_PIN 3 // P0_26 +#else + #define TEMP_2_PIN 3 // P0_26 +#endif + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 // FET 1 +#define HEATER_1_PIN P1_23 // FET 2 +#define HEATER_2_PIN P1_22 // FET 3 +#ifndef FAN_PIN + #define FAN_PIN P2_06 // ReMix FET 4, Mini FET 3 +#endif + +// +// Auto fans +// +#if HOTENDS == 3 + #define AUTO_FAN_PIN P1_18 // FET 6 +#else + #define AUTO_FAN_PIN P1_22 // FET 3 +#endif +#define ORIG_E0_AUTO_FAN_PIN AUTO_FAN_PIN +#define ORIG_E1_AUTO_FAN_PIN AUTO_FAN_PIN +#define ORIG_E2_AUTO_FAN_PIN AUTO_FAN_PIN + +// +// Misc. Functions +// +#define LED_PIN P4_28 // Play LED + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) + #undef HEATER_0_PIN + #define SPINDLE_LASER_ENABLE_PIN P2_07 // FET 1 + #undef HEATER_BED_PIN + #define SPINDLE_LASER_PWM_PIN P2_05 // Bed FET + #undef FAN_PIN + #define SPINDLE_DIR_PIN P2_06 // ReMix FET 4, Mini FET 3 +#endif + +// +// LCD / Controller +// +// LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be +// defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. +// +// A remote SD card is currently not supported because the pins routed to the EXP2 +// connector are shared with the onboard SD card, and Marlin does not support reading +// G-code files from the onboard SD card. +// +#if ENABLED(ULTRA_LCD) + + #define BEEPER_PIN P1_31 // EXP1-1 + #define SD_DETECT_PIN P0_27 // EXP2-7 + + #define BTN_EN1 P3_26 // EXP2-5 + #define BTN_EN2 P3_25 // EXP2-3 + #define BTN_ENC P1_30 // EXP1-2 + + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_SDSS P0_28 // EXP2-4 + #define LCD_PINS_ENABLE P0_18 // EXP1-3 + #define LCD_PINS_D4 P0_15 // EXP1-5 + + #define KILL_PIN P2_11 // EXP2-10 + + #if ENABLED(SDSUPPORT) + #error "SDSUPPORT is not currently supported by the Cohesion3D boards" + #endif + +#endif // ULTRA_LCD + +// +// Ethernet pins +// +#define ENET_MDIO P1_17 +#define ENET_RX_ER P1_14 +#define ENET_RXD1 P1_10 +#define ENET_MOC P1_16 +#define REF_CLK P1_15 +#define ENET_RXD0 P1_09 +#define ENET_CRS P1_08 +#define ENET_TX_EN P1_04 +#define ENET_TXD0 P1_00 +#define ENET_TXD1 P1_01 diff --git a/Marlin/src/pins/pins_DUE3DOM.h b/Marlin/src/pins/pins_DUE3DOM.h new file mode 100644 index 0000000000..76cc39c9ca --- /dev/null +++ b/Marlin/src/pins/pins_DUE3DOM.h @@ -0,0 +1,170 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * DUE3DOM pin assignments + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "DUE3DOM" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 6 +#define SERVO2_PIN 13 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 38 +#define X_MAX_PIN 36 +#define Y_MIN_PIN 34 +#define Y_MAX_PIN 32 +#define Z_MIN_PIN 30 +#define Z_MAX_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 2 +#define X_DIR_PIN 3 +#define X_ENABLE_PIN 22 + +#define Y_STEP_PIN 17 +#define Y_DIR_PIN 16 +#define Y_ENABLE_PIN 26 + +#define Z_STEP_PIN 61 // Z1 STP +#define Z_DIR_PIN 60 // Z1 DIR +#define Z_ENABLE_PIN 15 // Z1 ENA + +#define E0_STEP_PIN 64 // Z2 STP +#define E0_DIR_PIN 63 // Z2 DIR +#define E0_ENABLE_PIN 62 // Z2 ENA + +#define E1_STEP_PIN 51 // E1 STP +#define E1_DIR_PIN 53 // E1 DIR +#define E1_ENABLE_PIN 65 // E1 ENA + +#define E2_STEP_PIN 24 // E2 STP +#define E2_DIR_PIN 23 // E2 DIR +#define E2_ENABLE_PIN 49 // E2 ENA + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (HOTEND0 thermistor) +#define TEMP_1_PIN 2 // Analog Input (HOTEND1 thermistor) +#define TEMP_2_PIN 5 // Analog Input (unused) +#define TEMP_BED_PIN 1 // Analog Input (BED thermistor) + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS -1 +#else + #define MAX6675_SS -1 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 7 // HOTEND0 MOSFET +#define HEATER_1_PIN 8 // HOTEND1 MOSFET +#define HEATER_BED_PIN 39 // BED MOSFET + +#ifndef FAN_PIN + #define FAN_PIN 11 // FAN1 header on board - PRINT FAN +#endif +#define FAN1_PIN 9 // FAN2 header on board - CONTROLLER FAN +#define FAN2_PIN 12 // FAN3 header on board - EXTRUDER0 FAN + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 40 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + #define LCD_PINS_D5 45 + #define LCD_PINS_D6 46 + #define LCD_PINS_D7 47 + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(RADDS_DISPLAY) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define BTN_BACK 71 + + #undef SDSS + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SSD1306_OLED_I2C_CONTROLLER) + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + #define BEEPER_PIN 41 + #define LCD_SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + #define LCD_PINS_D4 29 + #define LCD_PINS_ENABLE 27 + #define LCD_PINS_RS 25 + + #define BTN_EN1 35 + #define BTN_EN2 33 + #define BTN_ENC 37 + + #define BEEPER_PIN -1 + #endif // SPARK_FULL_GRAPHICS +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_DUE3DOM_MINI.h b/Marlin/src/pins/pins_DUE3DOM_MINI.h new file mode 100644 index 0000000000..bf525d3059 --- /dev/null +++ b/Marlin/src/pins/pins_DUE3DOM_MINI.h @@ -0,0 +1,173 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * DUE3DOM MINI pin assignments + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "DUE3DOM MINI" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 6 +#define SERVO2_PIN 8 // 4-pin header FAN0 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 38 +#define X_MAX_PIN -1 +#define Y_MIN_PIN 34 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN 30 +#define Z_MAX_PIN -1 + +// +// Steppers +// +#define X_STEP_PIN 17 +#define X_DIR_PIN 16 +#define X_ENABLE_PIN 22 + +#define Y_STEP_PIN 2 +#define Y_DIR_PIN 3 +#define Y_ENABLE_PIN 26 + +#define Z_STEP_PIN 64 +#define Z_DIR_PIN 63 +#define Z_ENABLE_PIN 15 + +#define E0_STEP_PIN 61 +#define E0_DIR_PIN 60 +#define E0_ENABLE_PIN 62 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (HOTEND0 thermistor) +#define TEMP_1_PIN 2 // Analog Input (unused) +#define TEMP_2_PIN 5 // Analog Input (OnBoard thermistor beta 3950) +#define TEMP_BED_PIN 1 // Analog Input (BED thermistor) + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 53 +#else + #define MAX6675_SS 53 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 // HOTEND0 MOSFET +#define HEATER_BED_PIN 7 // BED MOSFET + +#ifndef FAN_PIN + #define FAN_PIN 11 // FAN1 header on board - PRINT FAN +#endif +#define FAN1_PIN 12 // FAN2 header on board - CONTROLLER FAN +#define FAN2_PIN 9 // FAN3 header on board - EXTRUDER0 FAN +//#define FAN3_PIN 8 // FAN0 4-pin header on board + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 40 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + #define LCD_PINS_D5 45 + #define LCD_PINS_D6 46 + #define LCD_PINS_D7 47 + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(RADDS_DISPLAY) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define BTN_BACK 71 + + #undef SDSS + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SSD1306_OLED_I2C_CONTROLLER) + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + #define BEEPER_PIN 41 + #define LCD_SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + #define LCD_PINS_D4 29 + #define LCD_PINS_ENABLE 27 + #define LCD_PINS_RS 25 + + #define BTN_EN1 35 + #define BTN_EN2 33 + #define BTN_ENC 37 + + #define BEEPER_PIN -1 + + #elif ENABLED(MINIPANEL) + #define BTN_EN1 52 + #define BTN_EN2 50 + #define BTN_ENC 48 + #define LCD_SDSS 4 + #define SD_DETECT_PIN 14 + #define BEEPER_PIN 41 + #define DOGLCD_A0 46 + #define DOGLCD_CS 45 + + #endif // SPARK_FULL_GRAPHICS +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_EINSTART-S.h b/Marlin/src/pins/pins_EINSTART-S.h new file mode 100755 index 0000000000..7fd88f8fc5 --- /dev/null +++ b/Marlin/src/pins/pins_EINSTART-S.h @@ -0,0 +1,122 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Einstart S pin assignments + * PCB Silkscreen: 3DPrinterCon_v3.5 + */ + +#if ENABLED(TARGET_LPC1768) + #error "Oops! Set MOTHERBOARD to an LPC1768-based board when building for LPC1768." +#elif defined(__STM32F1__) + #error "Oops! Set MOTHERBOARD to an STM32F1-based board when building for STM32F1." +#endif + +#if DISABLED(IS_RAMPS_SMART) && DISABLED(IS_RAMPS_DUO) && DISABLED(IS_RAMPS4DUE) && DISABLED(TARGET_LPC1768) + #if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." + #endif +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "EINSTART_S" +#endif + +// +// Limit Switches +// +#define X_STOP_PIN 44 // 2560 PIN 40 +#define Y_STOP_PIN 43 // 2560 PIN 41 +#define Z_STOP_PIN 42 // 2560 PIN 42 + +// +// Steppers +// +#define X_STEP_PIN 76 // 2560 PIN 68 +#define X_DIR_PIN 75 // 2560 PIN 67 +#define X_ENABLE_PIN 73 // 2560 PIN 66 + +#define Y_STEP_PIN 31 // 2560 PIN 59 +#define Y_DIR_PIN 32 // 2560 PIN 58 +#define Y_ENABLE_PIN 72 // 2560 PIN 65 + +#define Z_STEP_PIN 34 // 2560 PIN 56 +#define Z_DIR_PIN 35 // 2560 PIN 55 +#define Z_ENABLE_PIN 33 // 2560 PIN 57 + +#define E0_STEP_PIN 36 // 2560 PIN 54 +#define E0_DIR_PIN 37 // 2560 PIN 53 +#define E0_ENABLE_PIN 30 // 2560 PIN 60 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_BED_PIN 1 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 83 // 2560 PIN 49 +#define HEATER_BED_PIN 38 // 2560 PIN 50 + +#define FAN_PIN 82 // 2560 PIN 48 + +// +// Misc. Functions +// +#define SDSS 53 // 2560 PIN 19 +#define LED_PIN 4 // 2560 PIN 1 + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +// +// LCD Display output pins +// + +// Requires #define U8GLIB_SH1106_EINSTART in Configuration.h +// u8glib constructor +// U8GLIB_SH1106_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS); + +#define LCD_PINS_DC 78 // 2560 PIN 4 +#define LCD_PINS_RS 79 // 2560 PIN 8 +// DOGM SPI LCD Support +#define DOGLCD_CS 3 // 2560 PIN 7 +#define DOGLCD_MOSI 2 // 2560 PIN 6 +#define DOGLCD_SCK 5 // 2560 PIN 5 +#define DOGLCD_A0 2 // 2560 PIN 6 + +// +// LCD Display input pins +// +#define BTN_UP 25 // 2560 PIN 75 +#define BTN_DWN 26 // 2560 PIN 74 +#define BTN_LFT 27 // 2560 PIN 73 +#define BTN_RT 28 // 2560 PIN 72 + +// 'OK' button +#define BTN_ENC 29 // 2560 PIN 71 + +// Set Kill to right arrow, same as RIGID_PANEL +#define KILL_PIN 28 // 2560 PIN 72 diff --git a/Marlin/src/pins/pins_EINSY_RAMBO.h b/Marlin/src/pins/pins_EINSY_RAMBO.h new file mode 100644 index 0000000000..e3f67059fa --- /dev/null +++ b/Marlin/src/pins/pins_EINSY_RAMBO.h @@ -0,0 +1,179 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Einsy-Rambo pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega 2560 or Rambo' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Einsy Rambo" + +// +// TMC2130 Configuration_adv defaults for EinsyRambo +// +#if !AXIS_DRIVER_TYPE(X, TMC2130) || !AXIS_DRIVER_TYPE(Y, TMC2130) || !AXIS_DRIVER_TYPE(Z, TMC2130) || !AXIS_DRIVER_TYPE(E0, TMC2130) + #error "You must set ([XYZ]|E0)_DRIVER_TYPE to TMC2130 in Configuration.h for EinsyRambo." +#endif + +// TMC2130 Diag Pins (currently just for reference) +#define X_DIAG_PIN 64 +#define Y_DIAG_PIN 69 +#define Z_DIAG_PIN 68 +#define E0_DIAG_PIN 65 + +// +// Limit Switches +// +// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. +// Otherwise use a physical endstop based configuration. +// +// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING. +// + +#if DISABLED(SENSORLESS_HOMING) + + #define X_STOP_PIN 12 + #define Y_STOP_PIN 11 + #define Z_STOP_PIN 10 + +#else + + #define X_STOP_PIN X_DIAG_PIN + #define Y_STOP_PIN Y_DIAG_PIN + + #if ENABLED(BLTOUCH) + #define Z_STOP_PIN 11 // Y-MIN + #define SERVO0_PIN 10 // Z-MIN + #else + #define Z_STOP_PIN 10 + #endif + +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 10 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 49 +#define X_ENABLE_PIN 29 +#define X_CS_PIN 41 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 48 +#define Y_ENABLE_PIN 28 +#define Y_CS_PIN 39 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 +#define Z_CS_PIN 67 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 +#define E0_CS_PIN 66 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif + +#ifndef FAN1_PIN + #define FAN1_PIN 6 +#endif + +// +// Misc. Functions +// +#define SDSS 77 +#define LED_PIN 13 +#define CASE_LIGHT_PIN 9 + +// +// M3/M4/M5 - Spindle/Laser Control +// +// use P1 connector for spindle pins +#define SPINDLE_LASER_PWM_PIN 9 // MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 18 // Pin should have a pullup! +#define SPINDLE_DIR_PIN 19 + +// +// Průša i3 MK2 Multiplexer Support +// +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 +#define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #define KILL_PIN 32 + + #if ENABLED(NEWPANEL) + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS 85 + #define LCD_PINS_ENABLE 71 + #define LCD_PINS_D4 70 + #define BTN_EN1 61 + #define BTN_EN2 59 + #else + #define LCD_PINS_RS 82 + #define LCD_PINS_ENABLE 61 + #define LCD_PINS_D4 59 + #define LCD_PINS_D5 70 + #define LCD_PINS_D6 85 + #define LCD_PINS_D7 71 + #define BTN_EN1 14 + #define BTN_EN2 72 + #endif + + #define BTN_ENC 9 // AUX-2 + #define BEEPER_PIN 84 // AUX-4 + #define SD_DETECT_PIN 15 + + #endif // NEWPANEL +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_EINSY_RETRO.h b/Marlin/src/pins/pins_EINSY_RETRO.h new file mode 100644 index 0000000000..a100d9329e --- /dev/null +++ b/Marlin/src/pins/pins_EINSY_RETRO.h @@ -0,0 +1,193 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Einsy-Retro pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega 2560 or Rambo' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Einsy Retro" + +// +// TMC2130 Configuration_adv defaults for EinsyRetro +// +#if !AXIS_DRIVER_TYPE(X, TMC2130) || !AXIS_DRIVER_TYPE(Y, TMC2130) || !AXIS_DRIVER_TYPE(Z, TMC2130) || !AXIS_DRIVER_TYPE(E0, TMC2130) + #error "You must set ([XYZ]|E0)_DRIVER_TYPE to TMC2130 in Configuration.h for EinsyRetro." +#endif + +// TMC2130 Diag Pins (currently just for reference) +#define X_DIAG_PIN 64 +#define Y_DIAG_PIN 69 +#define Z_DIAG_PIN 68 +#define E0_DIAG_PIN 65 + +// +// Limit Switches +// +// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. +// Otherwise use a physical endstop based configuration. +// +// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING. +// + +#if DISABLED(SENSORLESS_HOMING) + + #define X_MIN_PIN 12 + #define Y_MIN_PIN 11 + #define Z_MIN_PIN 10 + #define X_MAX_PIN 81 + #define Y_MAX_PIN 57 + +#else + + #if X_HOME_DIR == -1 + #define X_MIN_PIN X_DIAG_PIN + #define X_MAX_PIN 81 + #else + #define X_MIN_PIN 12 + #define X_MAX_PIN X_DIAG_PIN + #endif + + #if Y_HOME_DIR == -1 + #define Y_MIN_PIN Y_DIAG_PIN + #define Y_MAX_PIN 57 + #else + #define Y_MIN_PIN 11 + #define Y_MAX_PIN Y_DIAG_PIN + #endif + + #if ENABLED(BLTOUCH) + #define Z_MIN_PIN 11 // Y-MIN + #define SERVO0_PIN 10 // Z-MIN + #else + #define Z_MIN_PIN 10 + #endif + +#endif + +#define Z_MAX_PIN 7 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 10 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 49 +#define X_ENABLE_PIN 29 +#define X_CS_PIN 41 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 48 +#define Y_ENABLE_PIN 28 +#define Y_CS_PIN 39 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 +#define Z_CS_PIN 67 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 +#define E0_CS_PIN 66 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif +#define FAN1_PIN 6 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define CASE_LIGHT_PIN 9 + +// +// M3/M4/M5 - Spindle/Laser Control +// +// use P1 connector for spindle pins +#define SPINDLE_LASER_PWM_PIN 9 // MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 18 // Pin should have a pullup! +#define SPINDLE_DIR_PIN 19 + +// +// Průša i3 MK2 Multiplexer Support +// +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 +#define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #define KILL_PIN 32 + + #if ENABLED(NEWPANEL) + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS 85 + #define LCD_PINS_ENABLE 71 + #define LCD_PINS_D4 70 + #define BTN_EN1 18 + #define BTN_EN2 19 + #else + #define LCD_PINS_RS 82 + #define LCD_PINS_ENABLE 18 + #define LCD_PINS_D4 19 + #define LCD_PINS_D5 70 + #define LCD_PINS_D6 85 + #define LCD_PINS_D7 71 + #define BTN_EN1 14 + #define BTN_EN2 72 + #endif + + #define BTN_ENC 9 // AUX-2 + #define BEEPER_PIN 84 // AUX-4 + #define SD_DETECT_PIN 15 + + #endif // NEWPANEL +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_ELEFU_3.h b/Marlin/src/pins/pins_ELEFU_3.h new file mode 100644 index 0000000000..79a4bce712 --- /dev/null +++ b/Marlin/src/pins/pins_ELEFU_3.h @@ -0,0 +1,151 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Elefu RA Board Pin Assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Elefu Ra v3" + +// +// Limit Switches +// +#define X_MIN_PIN 35 +#define X_MAX_PIN 34 +#define Y_MIN_PIN 33 +#define Y_MAX_PIN 32 +#define Z_MIN_PIN 31 +#define Z_MAX_PIN 30 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 30 +#endif + +// +// Steppers +// +#define X_STEP_PIN 49 +#define X_DIR_PIN 13 +#define X_ENABLE_PIN 48 + +#define Y_STEP_PIN 11 +#define Y_DIR_PIN 9 +#define Y_ENABLE_PIN 12 + +#define Z_STEP_PIN 7 +#define Z_DIR_PIN 6 +#define Z_ENABLE_PIN 8 + +#define E0_STEP_PIN 40 +#define E0_DIR_PIN 41 +#define E0_ENABLE_PIN 37 + +#define E1_STEP_PIN 18 +#define E1_DIR_PIN 19 +#define E1_ENABLE_PIN 38 + +#define E2_STEP_PIN 43 +#define E2_DIR_PIN 47 +#define E2_ENABLE_PIN 42 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 3 // Analog Input +#define TEMP_1_PIN 2 // Analog Input +#define TEMP_2_PIN 1 // Analog Input +#define TEMP_BED_PIN 0 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 45 // 12V PWM1 +#define HEATER_1_PIN 46 // 12V PWM2 +#define HEATER_2_PIN 17 // 12V PWM3 +#define HEATER_BED_PIN 44 // DOUBLE 12V PWM + +#ifndef FAN_PIN + #define FAN_PIN 16 // 5V PWM +#endif + +// +// Misc. Functions +// +#define PS_ON_PIN 10 // Set to -1 if using a manual switch on the PWRSW Connector +#define SLEEP_WAKE_PIN 26 // This feature still needs work +#define PHOTOGRAPH_PIN 29 + +// +// LCD / Controller +// +#define BEEPER_PIN 36 + +#if ENABLED(RA_CONTROL_PANEL) + + #define SDSS 53 + #define SD_DETECT_PIN 28 + + #define BTN_EN1 14 + #define BTN_EN2 39 + #define BTN_ENC 15 + +#endif // RA_CONTROL_PANEL + +#if ENABLED(RA_DISCO) + // variables for which pins the TLC5947 is using + #define TLC_CLOCK_PIN 25 + #define TLC_BLANK_PIN 23 + #define TLC_XLAT_PIN 22 + #define TLC_DATA_PIN 24 + + // We also need to define pin to port number mapping for the 2560 to match the pins listed above. + // If you change the TLC pins, update this as well per the 2560 datasheet! This currently only works with the RA Board. + #define TLC_CLOCK_BIT 3 + #define TLC_CLOCK_PORT &PORTA + + #define TLC_BLANK_BIT 1 + #define TLC_BLANK_PORT &PORTA + + #define TLC_DATA_BIT 2 + #define TLC_DATA_PORT &PORTA + + #define TLC_XLAT_BIT 0 + #define TLC_XLAT_PORT &PORTA + + // Change this to match your situation. Lots of TLCs takes up the arduino SRAM very quickly, so be careful + // Leave it at at least 1 if you have enabled RA_LIGHTING + // The number of TLC5947 boards chained together for use with the animation, additional ones will repeat the animation on them, but are not individually addressable and mimic those before them. You can leave the default at 2 even if you only have 1 TLC5947 module. + #define NUM_TLCS 2 + + // These TRANS_ARRAY values let you change the order the LEDs on the lighting modules will animate for chase functions. + // Modify them according to your specific situation. + // NOTE: the array should be 8 long for every TLC you have. These defaults assume (2) TLCs. + #define TRANS_ARRAY { 0, 1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8 } // forward + //#define TRANS_ARRAY { 7, 6, 5, 4, 3, 2, 1, 0, 8, 9, 10, 11, 12, 13, 14, 15 } // backward +#endif // RA_DISCO diff --git a/Marlin/src/pins/pins_ESP32.h b/Marlin/src/pins/pins_ESP32.h new file mode 100644 index 0000000000..ffad5890b2 --- /dev/null +++ b/Marlin/src/pins/pins_ESP32.h @@ -0,0 +1,72 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Espressif ESP32 (Tensilica Xtensa LX6) pin assignments + */ + +#ifndef BOARD_NAME + #define BOARD_NAME "Espressif ESP32" +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 34 +#define Y_MIN_PIN 35 +#define Z_MIN_PIN 15 + +// +// Steppers +// +#define X_STEP_PIN 27 +#define X_DIR_PIN 26 +#define X_ENABLE_PIN 25 +//#define X_CS_PIN 0 + +#define Y_STEP_PIN 33 +#define Y_DIR_PIN 32 +#define Y_ENABLE_PIN X_ENABLE_PIN +//#define Y_CS_PIN 13 + +#define Z_STEP_PIN 14 +#define Z_DIR_PIN 12 +#define Z_ENABLE_PIN X_ENABLE_PIN +//#define Z_CS_PIN 5 // SS_PIN + +#define E0_STEP_PIN 16 +#define E0_DIR_PIN 17 +#define E0_ENABLE_PIN X_ENABLE_PIN +//#define E0_CS_PIN 21 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 36 // Analog Input +#define TEMP_BED_PIN 39 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define FAN_PIN 13 +#define HEATER_BED_PIN 4 diff --git a/Marlin/src/pins/pins_FELIX2.h b/Marlin/src/pins/pins_FELIX2.h new file mode 100644 index 0000000000..83c4845745 --- /dev/null +++ b/Marlin/src/pins/pins_FELIX2.h @@ -0,0 +1,63 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * FELIXprinters v2.0/3.0 (RAMPS v1.4) pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "Felix 2.0+ supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_NAME "Felix 2.0+" + +// +// Heaters / Fans +// +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +#include "pins_RAMPS.h" + +// +// Misc. Functions +// +#undef SDPOWER +#define SDPOWER 1 + +#define PS_ON_PIN 12 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) + + #define SD_DETECT_PIN 6 + +#endif // NEWPANEL && ULTRA_LCD + +// +// M3/M4/M5 - Spindle/Laser Control +// +#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are not valid with this board +#undef SPINDLE_LASER_ENABLE_PIN +#undef SPINDLE_DIR_PIN diff --git a/Marlin/src/pins/pins_FORMBOT_TREX2.h b/Marlin/src/pins/pins_FORMBOT_TREX2.h new file mode 100644 index 0000000000..9af13bdb38 --- /dev/null +++ b/Marlin/src/pins/pins_FORMBOT_TREX2.h @@ -0,0 +1,195 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Formbot pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#if E_STEPPERS > 3 || HOTENDS > 3 + #error "Formbot supports up to 3 hotends / E-steppers. Comment this line to keep going." +#endif + +#define DEFAULT_MACHINE_NAME "Formbot" +#define BOARD_NAME "Formbot" + +// +// Servos +// +#define SERVO0_PIN 11 +#define SERVO1_PIN -1 // was 6 +#define SERVO2_PIN -1 // was 5 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 53 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN 49 +#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#ifndef Z_CS_PIN + #define Z_CS_PIN 40 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 42 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 44 +#endif + +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 43 +#define E2_ENABLE_PIN 44 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 3 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 66 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS 66 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if DISABLED(IS_RAMPS_EEB) && DISABLED(IS_RAMPS_EEF) && DISABLED(IS_RAMPS_EFB) && DISABLED(IS_RAMPS_EFF) && DISABLED(IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HOTENDS > 1 + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 7 +#define HEATER_BED_PIN 58 + +#define FAN_PIN 9 +#define FAN1_PIN 4 + + +#if DISABLED(ICSP_PORT_SWITCHES) + #define FIL_RUNOUT_PIN 22 + #define FIL_RUNOUT2_PIN 21 +#else + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define FIL_RUNOUT_PIN 52 + #define FIL_RUNOUT2_PIN 50 + #endif +#endif + +// +// Misc. Functions +// +#define CASE_LIGHT_PIN 8 +#define SDSS 53 +#ifndef ROXYs_TRex + #define LED_PIN 13 +#endif + +// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector +#define FILWIDTH_PIN 5 // Analog Input + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +// +// LCD / Controller +// +// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER +// +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + #ifndef ROXYs_TRex + #define KILL_PIN 41 + #define BEEPER_PIN 37 + #endif +#endif diff --git a/Marlin/src/pins/pins_FORMBOT_TREX3.h b/Marlin/src/pins/pins_FORMBOT_TREX3.h new file mode 100644 index 0000000000..322e0f2ea0 --- /dev/null +++ b/Marlin/src/pins/pins_FORMBOT_TREX3.h @@ -0,0 +1,195 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Formbot pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#if E_STEPPERS > 3 || HOTENDS > 3 + #error "Formbot supports up to 3 hotends / E-steppers. Comment this line to keep going." +#endif + +#define DEFAULT_MACHINE_NAME "Formbot" +#define BOARD_NAME "Formbot" + +// +// Servos +// +#define SERVO0_PIN 11 +#define SERVO1_PIN -1 // was 6 +#define SERVO2_PIN -1 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 53 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN 49 +#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#ifndef Z_CS_PIN + #define Z_CS_PIN 40 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 42 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 44 +#endif + +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 43 +#define E2_ENABLE_PIN 44 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 3 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 66 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS 66 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if DISABLED(IS_RAMPS_EEB) && DISABLED(IS_RAMPS_EEF) && DISABLED(IS_RAMPS_EFB) && DISABLED(IS_RAMPS_EFF) && DISABLED(IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HOTENDS > 1 + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 7 +#define HEATER_BED_PIN 8 + +#define FAN_PIN 9 +#define FAN1_PIN 4 + + +#if DISABLED(ICSP_PORT_SWITCHES) + #define FIL_RUNOUT_PIN 22 + #define FIL_RUNOUT2_PIN 21 +#else + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define FIL_RUNOUT_PIN 52 + #define FIL_RUNOUT2_PIN 50 + #endif +#endif + +// +// Misc. Functions +// +#define CASE_LIGHT_PIN 5 +#define SDSS 53 +#ifndef ROXYs_TRex + #define LED_PIN 13 +#endif + +// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector +#define FILWIDTH_PIN 5 // Analog Input + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +// +// LCD / Controller +// +// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER +// +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + #ifndef ROXYs_TRex + #define KILL_PIN 41 + #define BEEPER_PIN 37 + #endif +#endif diff --git a/Marlin/src/pins/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/pins_GEN3_MONOLITHIC.h new file mode 100644 index 0000000000..5d64e94290 --- /dev/null +++ b/Marlin/src/pins/pins_GEN3_MONOLITHIC.h @@ -0,0 +1,100 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Gen3 Monolithic Electronics pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + * + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +#ifndef __AVR_ATmega644P__ + #error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Gen3 Monolithic" +#define DEBUG_PIN 0 + +// +// Limit Switches +// +#define X_STOP_PIN 20 +#define Y_STOP_PIN 25 +#define Z_STOP_PIN 30 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 24 // actually uses Y_enable_pin + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 // shared with X_enable_pin + +#define Z_STEP_PIN 27 +#define Z_DIR_PIN 28 +#define Z_ENABLE_PIN 29 + +#define E0_STEP_PIN 12 +#define E0_DIR_PIN 17 +#define E0_ENABLE_PIN 3 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input + +// +// Heaters +// +#define HEATER_0_PIN 16 + +// +// Misc. Functions +// +#define PS_ON_PIN 14 // Alex, does this work on the card? + +// Alex extras from Gen3+ diff --git a/Marlin/src/pins/pins_GEN3_PLUS.h b/Marlin/src/pins/pins_GEN3_PLUS.h new file mode 100644 index 0000000000..85c47305b3 --- /dev/null +++ b/Marlin/src/pins/pins_GEN3_PLUS.h @@ -0,0 +1,101 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Gen3+ pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + * + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the SANGUINO board and then select the CPU. + * + */ + + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__) + #error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Gen3+" + +// +// Limit Switches +// +#define X_STOP_PIN 20 +#define Y_STOP_PIN 25 +#define Z_STOP_PIN 30 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 19 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 27 +#define Z_DIR_PIN 28 +#define Z_ENABLE_PIN 29 + +#define E0_STEP_PIN 17 +#define E0_DIR_PIN 21 +#define E0_ENABLE_PIN 13 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (pin 33 extruder) +#define TEMP_BED_PIN 5 // Analog Input (pin 34 bed) + +// +// Heaters +// +#define HEATER_0_PIN 12 +#define HEATER_BED_PIN 16 + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 14 diff --git a/Marlin/src/pins/pins_GEN6.h b/Marlin/src/pins/pins_GEN6.h new file mode 100644 index 0000000000..1c5e2069ae --- /dev/null +++ b/Marlin/src/pins/pins_GEN6.h @@ -0,0 +1,119 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Gen6 pin assignments + */ + + /** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + * + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__) + #error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Gen6" +#endif + +// +// Limit Switches +// +#define X_STOP_PIN 20 +#define Y_STOP_PIN 25 +#define Z_STOP_PIN 30 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 19 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 27 +#define Z_DIR_PIN 28 +#define Z_ENABLE_PIN 29 + +#define E0_STEP_PIN 4 // Edited @ EJE Electronics 20100715 +#define E0_DIR_PIN 2 // Edited @ EJE Electronics 20100715 +#define E0_ENABLE_PIN 3 // Added @ EJE Electronics 20100715 + +// +// Temperature Sensor +// +#define TEMP_0_PIN 5 // Analog Input + +// +// Heaters +// +#define HEATER_0_PIN 14 // changed @ rkoeppl 20110410 + +#if !MB(GEN6) + #define HEATER_BED_PIN 1 // changed @ rkoeppl 20110410 + #define TEMP_BED_PIN 0 // Analog Input +#endif + +// +// Misc. Functions +// +#define SDSS 17 +#define DEBUG_PIN 0 +#define CASE_LIGHT_PIN 16 // MUST BE HARDWARE PWM + +// RS485 pins +#define TX_ENABLE_PIN 12 +#define RX_ENABLE_PIN 13 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENABLE_PIN 5 // Pin should have a pullup/pulldown! +#define SPINDLE_LASER_PWM_PIN 16 // MUST BE HARDWARE PWM +#define SPINDLE_DIR_PIN 6 diff --git a/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h b/Marlin/src/pins/pins_GEN6_DELUXE.h similarity index 84% rename from Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h rename to Marlin/src/pins/pins_GEN6_DELUXE.h index 9c63570620..5834068667 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h +++ b/Marlin/src/pins/pins_GEN6_DELUXE.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Gen6 Deluxe pin assignments @@ -29,6 +28,7 @@ * Rev B 26 DEC 2016 * * added pointer to a current Arduino IDE extension + * */ /** @@ -46,9 +46,10 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the SANGUINO board and then select the CPU. + * */ -#define BOARD_INFO_NAME "Gen6 Deluxe" +#define BOARD_NAME "Gen6 Deluxe" #include "pins_GEN6.h" diff --git a/Marlin/src/pins/pins_GEN7_12.h b/Marlin/src/pins/pins_GEN7_12.h new file mode 100644 index 0000000000..1afaae9abc --- /dev/null +++ b/Marlin/src/pins/pins_GEN7_12.h @@ -0,0 +1,149 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Gen7 v1.1, v1.2, v1.3 pin assignments + */ + + /** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + * + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__) + #error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Gen7 v1.1 / 1.2" +#endif + +#ifndef GEN7_VERSION + #define GEN7_VERSION 12 // v1.x +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 7 +#define Y_MIN_PIN 5 +#define Z_MIN_PIN 1 +#define Z_MAX_PIN 0 +#define Y_MAX_PIN 2 +#define X_MAX_PIN 6 + + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 0 +#endif + +// +// Steppers +// +#define X_STEP_PIN 19 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 26 +#define Z_DIR_PIN 25 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 3 + +#if !defined(FAN_PIN) && GEN7_VERSION < 13 // Gen7 v1.3 removed the fan pin + #define FAN_PIN 31 +#endif + +// +// Misc. Functions +// +#define PS_ON_PIN 15 + +#if GEN7_VERSION < 13 + #define CASE_LIGHT_PIN 16 // MUST BE HARDWARE PWM +#else // Gen7 v1.3 removed the I2C connector & signals so need to get PWM off the PC power supply header + #define CASE_LIGHT_PIN 15 // MUST BE HARDWARE PWM +#endif + +// All these generations of Gen7 supply thermistor power +// via PS_ON, so ignore bad thermistor readings +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +#define DEBUG_PIN 0 + +// RS485 pins +#define TX_ENABLE_PIN 12 +#define RX_ENABLE_PIN 13 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENABLE_PIN 10 // Pin should have a pullup/pulldown! +#define SPINDLE_DIR_PIN 11 +#if GEN7_VERSION < 13 + #define SPINDLE_LASER_PWM_PIN 16 // MUST BE HARDWARE PWM +#else // Gen7 v1.3 removed the I2C connector & signals so need to get PWM off the PC power supply header + #define SPINDLE_LASER_PWM_PIN 15 // MUST BE HARDWARE PWM +#endif diff --git a/Marlin/src/pins/sanguino/pins_GEN7_13.h b/Marlin/src/pins/pins_GEN7_13.h similarity index 85% rename from Marlin/src/pins/sanguino/pins_GEN7_13.h rename to Marlin/src/pins/pins_GEN7_13.h index 55881aaff5..749a6c3389 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_13.h +++ b/Marlin/src/pins/pins_GEN7_13.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,19 +16,19 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Gen7 v1.3 pin assignments */ -/** + /** * Rev B 26 DEC 2016 * * added pointer to a current Arduino IDE extension + * */ /** @@ -46,9 +46,10 @@ * Just use the above JSON URL instead of Sparkfun's JSON. * * Once installed select the Sanguino board and then select the CPU. + * */ -#define BOARD_INFO_NAME "Gen7 v1.3" +#define BOARD_NAME "Gen7 v1.3" #define GEN7_VERSION 13 // v1.3 #include "pins_GEN7_12.h" diff --git a/Marlin/src/pins/pins_GEN7_14.h b/Marlin/src/pins/pins_GEN7_14.h new file mode 100644 index 0000000000..dedd227ca0 --- /dev/null +++ b/Marlin/src/pins/pins_GEN7_14.h @@ -0,0 +1,118 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Gen7 v1.4 pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + * + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__) + #error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Gen7 v1.4" + +#define GEN7_VERSION 14 // v1.4 + +// +// Limit switches +// +#define X_STOP_PIN 0 +#define Y_STOP_PIN 1 +#define Z_STOP_PIN 2 + +// +// Steppers +// +#define X_STEP_PIN 29 +#define X_DIR_PIN 28 +#define X_ENABLE_PIN 25 + +#define Y_STEP_PIN 27 +#define Y_DIR_PIN 26 +#define Y_ENABLE_PIN 25 + +#define Z_STEP_PIN 23 +#define Z_DIR_PIN 22 +#define Z_ENABLE_PIN 25 + +#define E0_STEP_PIN 19 +#define E0_DIR_PIN 18 +#define E0_ENABLE_PIN 25 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 0 // Analog Input + +// +// Heaters +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 3 + +// +// Misc. Functions +// +#define PS_ON_PIN 15 +#define CASE_LIGHT_PIN 15 // MUST BE HARDWARE PWM + +// A pin for debugging +#define DEBUG_PIN 0 + +// RS485 pins +#define TX_ENABLE_PIN 12 +#define RX_ENABLE_PIN 13 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENABLE_PIN 20 // Pin should have a pullup/pulldown! +#define SPINDLE_LASER_PWM_PIN 16 // MUST BE HARDWARE PWM +#define SPINDLE_DIR_PIN 21 diff --git a/Marlin/src/pins/pins_GEN7_CUSTOM.h b/Marlin/src/pins/pins_GEN7_CUSTOM.h new file mode 100644 index 0000000000..fdfb6b5fa1 --- /dev/null +++ b/Marlin/src/pins/pins_GEN7_CUSTOM.h @@ -0,0 +1,138 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Gen7 Alfons3 board pin assignments + * + * These Pins are assigned for the modified GEN7 Board from Alfons3. + * Please review the pins and adjust them for your needs. + */ + +/** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + * + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__) + #error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Gen7 Custom" + +// +// Limit Switches +// +#define X_STOP_PIN 0 +#define Y_STOP_PIN 1 +#define Z_STOP_PIN 2 + +// +// Steppers +// +#define X_STEP_PIN 21 // different from standard GEN7 +#define X_DIR_PIN 20 // different from standard GEN7 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 26 +#define Z_DIR_PIN 25 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 2 // Analog Input +#define TEMP_BED_PIN 1 // Analog Input (pin 34 bed) + +// +// Heaters +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 3 // (bed) + +// +// Misc. Functions +// +#define SDSS 31 // SCL pin of I2C header || CS Pin for SD Card support +#define PS_ON_PIN 19 +#define CASE_LIGHT_PIN 15 // MUST BE HARDWARE PWM + +// A pin for debugging +#define DEBUG_PIN -1 + +// +// LCD / Controller +// +#define BEEPER_PIN -1 + +// 4bit LCD Support +#define LCD_PINS_RS 18 +#define LCD_PINS_ENABLE 17 +#define LCD_PINS_D4 16 +#define LCD_PINS_D5 15 +#define LCD_PINS_D6 13 +#define LCD_PINS_D7 14 + +// Buttons are directly attached +#define BTN_EN1 11 +#define BTN_EN2 10 +#define BTN_ENC 12 + +// RS485 pins +//#define TX_ENABLE_PIN 12 +//#define RX_ENABLE_PIN 13 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENABLE_PIN 5 // Pin should have a pullup/pulldown! +#define SPINDLE_LASER_PWM_PIN 16 // MUST BE HARDWARE PWM +#define SPINDLE_DIR_PIN 6 diff --git a/Marlin/src/pins/pins_GT2560_REV_A.h b/Marlin/src/pins/pins_GT2560_REV_A.h new file mode 100644 index 0000000000..63f166ab32 --- /dev/null +++ b/Marlin/src/pins/pins_GT2560_REV_A.h @@ -0,0 +1,141 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Geeetech GT2560 Revision A board pin assignments, based on the work of + * George Robles (https://georges3dprinters.com) and + * Richard Smith + */ + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "GT2560 Rev.A" +#endif +#define DEFAULT_MACHINE_NAME "Prusa i3 Pro B" + +// +// Limit Switches +// +#define X_MIN_PIN 22 +#define X_MAX_PIN 24 +#define Y_MIN_PIN 26 +#define Y_MAX_PIN 28 +#define Z_MIN_PIN 30 +#define Z_MAX_PIN 32 + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 31 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 37 +#define Z_DIR_PIN 39 +#define Z_ENABLE_PIN 35 + +#define E0_STEP_PIN 43 +#define E0_DIR_PIN 45 +#define E0_ENABLE_PIN 41 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 +#define TEMP_1_PIN 9 +#define TEMP_BED_PIN 10 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_BED_PIN 4 +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif + +// +// Misc. Functions +// +#define SDPOWER -1 +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 +#define SUICIDE_PIN 54 // Must be enabled at startup to keep power flowing +#define KILL_PIN -1 + +#if ENABLED(ULTRA_LCD) + + #define BEEPER_PIN 18 + + #if ENABLED(NEWPANEL) + + #if ENABLED(MKS_MINI_12864) + #define DOGLCD_A0 5 + #define DOGLCD_CS 21 + #define BTN_EN1 40 + #define BTN_EN2 42 + #else + #define LCD_PINS_RS 20 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 16 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 6 + #define BTN_EN1 42 + #define BTN_EN2 40 + #endif + + #define BTN_ENC 19 + #define SD_DETECT_PIN 38 + + #else // !NEWPANEL + + #define SHIFT_CLK 38 + #define SHIFT_LD 42 + #define SHIFT_OUT 40 + #define SHIFT_EN 17 + + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 6 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 20 + #define LCD_PINS_D7 19 + + #define SD_DETECT_PIN -1 + + #endif // !NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_GT2560_REV_A_PLUS.h b/Marlin/src/pins/pins_GT2560_REV_A_PLUS.h new file mode 100644 index 0000000000..99399e34ba --- /dev/null +++ b/Marlin/src/pins/pins_GT2560_REV_A_PLUS.h @@ -0,0 +1,35 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Geeetech GT2560 Revision A+ board pin assignments + */ + +#define BOARD_NAME "GT2560 Rev.A+" + +#include "pins_GT2560_REV_A.h" + +#if ENABLED(BLTOUCH) + #define SERVO0_PIN 11 +#else + #define SERVO0_PIN 32 +#endif diff --git a/Marlin/src/pins/pins_GTM32_PRO_VB.h b/Marlin/src/pins/pins_GTM32_PRO_VB.h new file mode 100644 index 0000000000..41f45f54b3 --- /dev/null +++ b/Marlin/src/pins/pins_GTM32_PRO_VB.h @@ -0,0 +1,99 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef __STM32F1__ + #error "Oops! Make sure you have an STM32F1 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 24.05.2018 Axel "chepo" Sepúlveda Marlin for (stm32f103vet6) sch of board https://github.com/chepo92/Smartto/blob/master/Rostock301/Hardware_GTM32_PRO_VB.pdf + */ + +#define DEFAULT_MACHINE_NAME "STM32F103VET6" +#define BOARD_NAME "GTM32 Pro VB" + +// Ignore temp readings during development. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Limit Switches +// +#define X_MIN_PIN PE5 +#define X_MAX_PIN PE4 +#define Y_MIN_PIN PE3 +#define Y_MAX_PIN PE2 +#define Z_MIN_PIN PE1 +#define Z_MAX_PIN PE0 + +// +// Steppers +// +#define X_STEP_PIN PC6 +#define X_DIR_PIN PD13 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PA12 +#define Y_DIR_PIN PA11 +#define Y_ENABLE_PIN PA15 // core conflict? + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD3 +#define Z_ENABLE_PIN PB3 // core conflict? + +#define E0_STEP_PIN PC14 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PC15 + +#define E1_STEP_PIN PA0 +#define E1_DIR_PIN PB6 +#define E1_ENABLE_PIN PA1 + +#define E2_STEP_PIN PB2 +#define E2_DIR_PIN PB11 +#define E2_ENABLE_PIN PC4 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PC0 +#define TEMP_0_PIN PC1 +#define TEMP_1_PIN PC2 +#define TEMP_2_PIN PC3 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB4 // EXTRUDER 1 +#define HEATER_1_PIN PB5 // EXTRUDER 2 +#define HEATER_2_PIN PB0 // EXTRUDER 3 +#define HEATER_BED_PIN PB1 // BED + +#ifndef FAN_PIN + #define FAN_PIN PB7 // (Sprinter config) +#endif +#define FAN1_PIN PB8 +#define FAN2_PIN PB9 + +// +// Misc. Functions +// +#define LED_PIN PD12 diff --git a/Marlin/src/pins/ramps/pins_K8200.h b/Marlin/src/pins/pins_K8200.h similarity index 77% rename from Marlin/src/pins/ramps/pins_K8200.h rename to Marlin/src/pins/pins_K8200.h index 5d4d2d7022..cc3e731172 100644 --- a/Marlin/src/pins/ramps/pins_K8200.h +++ b/Marlin/src/pins/pins_K8200.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,16 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * K8200 Arduino Mega with RAMPS v1.3 pin assignments * Identical to 3DRAG */ -#define BOARD_INFO_NAME "Velleman K8200" +#define BOARD_NAME "Velleman K8200" #define DEFAULT_MACHINE_NAME "K8200" #define DEFAULT_SOURCE_CODE_URL "https://github.com/CONSULitAS/Marlin-K8200" diff --git a/Marlin/src/pins/pins_K8400.h b/Marlin/src/pins/pins_K8400.h new file mode 100644 index 0000000000..3e2cd4b212 --- /dev/null +++ b/Marlin/src/pins/pins_K8400.h @@ -0,0 +1,73 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Velleman K8400 (Vertex) + * 3DRAG clone + * + * K8400 has some minor differences over a normal 3Drag: + * - No X/Y max endstops + * - Second extruder step pin has moved + * - No power supply control + * - Second heater has moved pin + */ + +#define BOARD_NAME "K8400" +#define DEFAULT_MACHINE_NAME "Vertex" +#define DEFAULT_SOURCE_CODE_URL "https://github.com/birkett/Vertex-K8400-Firmware" + +#include "pins_3DRAG.h" + +// +// Limit Switches +// +#define X_STOP_PIN 3 +#define Y_STOP_PIN 14 + +#undef X_MIN_PIN +#undef X_MAX_PIN +#undef Y_MIN_PIN +#undef Y_MAX_PIN + +// +// Steppers +// +#undef E1_STEP_PIN +#define E1_STEP_PIN 32 + +// +// Heaters / Fans +// +#undef HEATER_1_PIN +#define HEATER_1_PIN 11 + +// +// Misc. Functions +// +#undef PS_ON_PIN +#undef KILL_PIN +#undef SD_DETECT_PIN + +#if Z_STEP_PIN == 26 + #undef Z_STEP_PIN + #define Z_STEP_PIN 32 +#endif diff --git a/Marlin/src/pins/pins_LEAPFROG.h b/Marlin/src/pins/pins_LEAPFROG.h new file mode 100644 index 0000000000..9a31520e8a --- /dev/null +++ b/Marlin/src/pins/pins_LEAPFROG.h @@ -0,0 +1,91 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Leapfrog Driver board pin assignments + */ + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Leapfrog" + +// +// Limit Switches +// +#define X_MIN_PIN 47 +#define X_MAX_PIN 2 +#define Y_MIN_PIN 48 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 49 +#define Z_MAX_PIN -1 + +// +// Steppers +// +#define X_STEP_PIN 28 +#define X_DIR_PIN 63 +#define X_ENABLE_PIN 29 + +#define Y_STEP_PIN 14 // A6 +#define Y_DIR_PIN 15 // A0 +#define Y_ENABLE_PIN 39 + +#define Z_STEP_PIN 31 // A2 +#define Z_DIR_PIN 32 // A6 +#define Z_ENABLE_PIN 30 // A1 + +#define E0_STEP_PIN 34 // 34 +#define E0_DIR_PIN 35 // 35 +#define E0_ENABLE_PIN 33 // 33 + +#define E1_STEP_PIN 37 // 37 +#define E1_DIR_PIN 40 // 40 +#define E1_ENABLE_PIN 36 // 36 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input (D27) +#define TEMP_1_PIN 15 // Analog Input (1) +#define TEMP_BED_PIN 14 // Analog Input (1,2 or I2C) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 8 // 12 +#define HEATER_2_PIN 11 // 13 +#define HEATER_BED_PIN 10 // 14/15 + +#define FAN_PIN 7 + +// +// Misc. Functions +// +#define SDSS 11 +#define LED_PIN 13 +#define SOL1_PIN 16 +#define SOL2_PIN 17 + +/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */ diff --git a/Marlin/src/pins/pins_MAKEBOARD_MINI.h b/Marlin/src/pins/pins_MAKEBOARD_MINI.h new file mode 100644 index 0000000000..5dcf1e2180 --- /dev/null +++ b/Marlin/src/pins/pins_MAKEBOARD_MINI.h @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "pins_RAMPS.h" + +#undef BOARD_NAME +#define BOARD_NAME "MAKEBOARD_MINI" + +// +// Only 3 Limit Switch plugs on Micromake C1 +// +#undef X_MIN_PIN +#undef Y_MIN_PIN +#undef Z_MIN_PIN +#undef X_MAX_PIN +#undef Y_MAX_PIN +#undef Z_MAX_PIN +#define X_STOP_PIN 2 +#define Y_STOP_PIN 15 +#define Z_STOP_PIN 19 diff --git a/Marlin/src/pins/pins_MALYAN_M200.h b/Marlin/src/pins/pins_MALYAN_M200.h new file mode 100644 index 0000000000..c9887fa71f --- /dev/null +++ b/Marlin/src/pins/pins_MALYAN_M200.h @@ -0,0 +1,91 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MALYAN M200 pin assignments + */ + +#ifndef __STM32F1__ + #error "Oops! You must be compiling for STM32." +#endif + +#define BOARD_NAME "MALYANM200" + +// Enable EEPROM Emulation for this board +// This setting should probably be in configuration.h +// but it is literally the only board which uses it. +#define FLASH_EEPROM_EMULATION + +#define SDSS SS_PIN + +// +// Limit Switches +// +#define X_MIN_PIN PB4 +#define Y_MIN_PIN PA15 +#define Z_MIN_PIN PB5 + +// +// Steppers +// +// X & Y enable are the same +#define X_STEP_PIN PB14 +#define X_DIR_PIN PB15 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PB12 +#define Y_DIR_PIN PB13 +#define Y_ENABLE_PIN PA8 + +#define Z_STEP_PIN PB10 +#define Z_DIR_PIN PB2 +#define Z_ENABLE_PIN PB11 + +#define E0_STEP_PIN PB0 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PB1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // Analog Input (HOTEND0 thermistor) +#define TEMP_BED_PIN PA1 // Analog Input (BED thermistor) + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB6 // HOTEND0 MOSFET +#define HEATER_BED_PIN PB7 // BED MOSFET + +// FAN_PIN is commented out here because the M200 example +// Configuration_adv.h does NOT override E0_AUTO_FAN_PIN. +#ifndef FAN_PIN + //#define FAN_PIN PB8 // FAN1 header on board - PRINT FAN +#endif +#define FAN1_PIN PB3 // FAN2 header on board - CONTROLLER FAN +#define FAN2_PIN -1 // FAN3 header on board - EXTRUDER0 FAN + +// This board has only the controller fan and the extruder fan +// If someone hacks to put a direct power fan on the controller, PB3 could +// be used as a separate print cooling fan. +#define ORIG_E0_AUTO_FAN_PIN PB8 + diff --git a/Marlin/src/pins/pins_MEGACONTROLLER.h b/Marlin/src/pins/pins_MEGACONTROLLER.h new file mode 100644 index 0000000000..709dc413be --- /dev/null +++ b/Marlin/src/pins/pins_MEGACONTROLLER.h @@ -0,0 +1,166 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Mega controller pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "Mega Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_NAME "Mega Controller" + +// +// Servos +// +#define SERVO0_PIN 30 +#define SERVO1_PIN 31 +#define SERVO2_PIN 32 +#define SERVO3_PIN 33 + +// +// Limit Switches +// +#define X_MIN_PIN 43 +#define X_MAX_PIN 42 +#define Y_MIN_PIN 38 +#define Y_MAX_PIN 41 +#define Z_MIN_PIN 40 +#define Z_MAX_PIN 37 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 37 +#endif + +// +// Steppers +// +#define X_STEP_PIN 62 // A8 +#define X_DIR_PIN 63 // A9 +#define X_ENABLE_PIN 61 // A7 + +#define Y_STEP_PIN 65 // A11 +#define Y_DIR_PIN 66 // A12 +#define Y_ENABLE_PIN 64 // A10 + +#define Z_STEP_PIN 68 // A14 +#define Z_DIR_PIN 69 // A15 +#define Z_ENABLE_PIN 67 // A13 + +#define E0_STEP_PIN 23 +#define E0_DIR_PIN 24 +#define E0_ENABLE_PIN 22 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 27 +#define E1_ENABLE_PIN 25 + +// +// Temperature Sensors +// +#if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 4 // Analog Input +#else + #define TEMP_0_PIN 0 // Analog Input +#endif + +#if TEMP_SENSOR_1 == -1 + #define TEMP_1_PIN 5 // Analog Input +#else + #define TEMP_1_PIN 2 // Analog Input +#endif + +#define TEMP_2_PIN 3 // Analog Input + +#if TEMP_SENSOR_BED == -1 + #define TEMP_BED_PIN 6 // Analog Input +#else + #define TEMP_BED_PIN 1 // Analog Input +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 29 +#define HEATER_1_PIN 34 +#define HEATER_BED_PIN 28 + +#ifndef FAN_PIN + #define FAN_PIN 39 +#endif +#define FAN1_PIN 35 +#define FAN2_PIN 36 + +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN FAN2_PIN +#endif + +#define FAN_SOFT_PWM + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define CASE_LIGHT_PIN 2 + +// +// LCD / Controller +// +#if ENABLED(MINIPANEL) + + #define BEEPER_PIN 46 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 47 + #define DOGLCD_CS 45 + #define LCD_BACKLIGHT_PIN 44 // backlight LED on PA3 + + #define KILL_PIN 12 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #define BTN_EN1 48 + #define BTN_EN2 11 + #define BTN_ENC 10 + + #define SD_DETECT_PIN 49 + +#endif // MINIPANEL + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 6 // MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 7 // Pin should have a pullup! +#define SPINDLE_DIR_PIN 8 diff --git a/Marlin/src/pins/pins_MEGATRONICS.h b/Marlin/src/pins/pins_MEGATRONICS.h new file mode 100644 index 0000000000..8b608eff88 --- /dev/null +++ b/Marlin/src/pins/pins_MEGATRONICS.h @@ -0,0 +1,130 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MegaTronics pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Megatronics" +// +// Limit Switches +// +#define X_MIN_PIN 41 +#define X_MAX_PIN 37 +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 +#endif + +// +// Steppers +// +#define X_STEP_PIN 26 +#define X_DIR_PIN 28 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 60 // A6 +#define Y_DIR_PIN 61 // A7 +#define Y_ENABLE_PIN 22 + +#define Z_STEP_PIN 54 // A0 +#define Z_DIR_PIN 55 // A1 +#define Z_ENABLE_PIN 56 // A2 + +#define E0_STEP_PIN 31 +#define E0_DIR_PIN 32 +#define E0_ENABLE_PIN 38 + +#define E1_STEP_PIN 34 +#define E1_DIR_PIN 36 +#define E1_ENABLE_PIN 30 + +// +// Temperature Sensors +// +#if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 8 // Analog Input +#else + #define TEMP_0_PIN 13 // Analog Input +#endif +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 14 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 8 +#define HEATER_BED_PIN 10 + +#ifndef FAN_PIN + #define FAN_PIN 7 // IO pin. Buffer needed +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 +#define CASE_LIGHT_PIN 2 + +// +// LCD / Controller +// +#define BEEPER_PIN 33 + +#if ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) + + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + + // Buttons directly attached using AUX-2 + #define BTN_EN1 59 + #define BTN_EN2 64 + #define BTN_ENC 43 + + #define SD_DETECT_PIN -1 // RAMPS doesn't use this + +#endif // ULTRA_LCD && NEWPANEL + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 3 // MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 4 // Pin should have a pullup! +#define SPINDLE_DIR_PIN 11 diff --git a/Marlin/src/pins/pins_MEGATRONICS_2.h b/Marlin/src/pins/pins_MEGATRONICS_2.h new file mode 100644 index 0000000000..9bd8b4506d --- /dev/null +++ b/Marlin/src/pins/pins_MEGATRONICS_2.h @@ -0,0 +1,145 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MegaTronics v2.0 pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Megatronics v2.0" +// +// Limit Switches +// +#define X_MIN_PIN 37 +#define X_MAX_PIN 40 +#define Y_MIN_PIN 41 +#define Y_MAX_PIN 38 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 +#endif + +// +// Steppers +// +#define X_STEP_PIN 26 +#define X_DIR_PIN 27 +#define X_ENABLE_PIN 25 + +#define Y_STEP_PIN 4 // A6 +#define Y_DIR_PIN 54 // A0 +#define Y_ENABLE_PIN 5 + +#define Z_STEP_PIN 56 // A2 +#define Z_DIR_PIN 60 // A6 +#define Z_ENABLE_PIN 55 // A1 + +#define E0_STEP_PIN 35 +#define E0_DIR_PIN 36 +#define E0_ENABLE_PIN 34 + +#define E1_STEP_PIN 29 +#define E1_DIR_PIN 39 +#define E1_ENABLE_PIN 28 + +#define E2_STEP_PIN 23 // ? schematic says 24 +#define E2_DIR_PIN 24 // ? schematic says 23 +#define E2_ENABLE_PIN 22 + +// +// Temperature Sensors +// +#if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 4 // Analog Input +#else + #define TEMP_0_PIN 13 // Analog Input +#endif + +#if TEMP_SENSOR_1 == -1 + #define TEMP_1_PIN 8 // Analog Input +#else + #define TEMP_1_PIN 15 // Analog Input +#endif + +#if TEMP_SENSOR_BED == -1 + #define TEMP_BED_PIN 8 // Analog Input +#else + #define TEMP_BED_PIN 14 // Analog Input +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 8 +#define HEATER_BED_PIN 10 + +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif +#define FAN1_PIN 6 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 +#define CASE_LIGHT_PIN 2 + +// +// LCD / Controller +// +#define BEEPER_PIN 64 + +#define LCD_PINS_RS 14 +#define LCD_PINS_ENABLE 15 +#define LCD_PINS_D4 30 +#define LCD_PINS_D5 31 +#define LCD_PINS_D6 32 +#define LCD_PINS_D7 33 + +// Buttons are directly attached using keypad +#define BTN_EN1 61 +#define BTN_EN2 59 +#define BTN_ENC 43 + +// Buttons that are attached using shift register of reprapworld keypad v1.1 +#define SHIFT_CLK 63 +#define SHIFT_LD 42 +#define SHIFT_OUT 17 +#define SHIFT_EN 17 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 3 // MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 16 // Pin should have a pullup! +#define SPINDLE_DIR_PIN 11 diff --git a/Marlin/src/pins/pins_MEGATRONICS_3.h b/Marlin/src/pins/pins_MEGATRONICS_3.h new file mode 100644 index 0000000000..119c63a585 --- /dev/null +++ b/Marlin/src/pins/pins_MEGATRONICS_3.h @@ -0,0 +1,192 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MegaTronics v3.0 / v3.1 pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#if MB(MEGATRONICS_31) + #define BOARD_NAME "Megatronics v3.1" +#else + #define BOARD_NAME "Megatronics v3.0" +#endif + +// +// Servos +// +#define SERVO0_PIN 46 // AUX3-6 +#define SERVO1_PIN 47 // AUX3-5 +#define SERVO2_PIN 48 // AUX3-4 +#define SERVO3_PIN 49 // AUX3-3 + +// +// Limit Switches +// +#define X_MIN_PIN 37 +#define X_MAX_PIN 40 +#define Y_MIN_PIN 41 +#define Y_MAX_PIN 38 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 +#endif + +// +// Steppers +// +#define X_STEP_PIN 58 +#define X_DIR_PIN 57 +#define X_ENABLE_PIN 59 + +#define Y_STEP_PIN 5 +#define Y_DIR_PIN 17 +#define Y_ENABLE_PIN 4 + +#define Z_STEP_PIN 16 +#define Z_DIR_PIN 11 +#define Z_ENABLE_PIN 3 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 29 + +#define E1_STEP_PIN 25 +#define E1_DIR_PIN 24 +#define E1_ENABLE_PIN 26 + +#define E2_STEP_PIN 22 +#define E2_DIR_PIN 60 +#define E2_ENABLE_PIN 23 + +// +// Temperature Sensors +// +#if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 11 // Analog Input +#else + #define TEMP_0_PIN 15 // Analog Input +#endif +#if TEMP_SENSOR_1 == -1 + #define TEMP_1_PIN 10 // Analog Input +#else + #define TEMP_1_PIN 13 // Analog Input +#endif +#if TEMP_SENSOR_2 == -1 + #define TEMP_2_PIN 9 // Analog Input +#else + #define TEMP_2_PIN 12 // Analog Input +#endif +#if TEMP_SENSOR_BED == -1 + #define TEMP_BED_PIN 8 // Analog Input +#else + #define TEMP_BED_PIN 14 // Analog Input +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 9 +#define HEATER_2_PIN 8 +#define HEATER_BED_PIN 10 + +#ifndef FAN_PIN + #define FAN_PIN 6 +#endif +#define FAN1_PIN 7 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 +#define CASE_LIGHT_PIN 45 // Try the keypad connector + +// +// LCD / Controller +// +#define BEEPER_PIN 61 + +#define BTN_EN1 44 +#define BTN_EN2 45 +#define BTN_ENC 33 + +#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define LCD_PINS_RS 56 // CS chip select / SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #define SD_DETECT_PIN 35 + +#else + + #define LCD_PINS_RS 32 + #define LCD_PINS_ENABLE 31 + #define LCD_PINS_D4 14 + #define LCD_PINS_D5 30 + #define LCD_PINS_D6 39 + #define LCD_PINS_D7 15 + + #define SHIFT_CLK 43 + #define SHIFT_LD 35 + #define SHIFT_OUT 34 + #define SHIFT_EN 44 + + #if MB(MEGATRONICS_31) + #define SD_DETECT_PIN 56 + #endif + +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if DISABLED(REPRAPWORLD_KEYPAD) // try to use the keypad connector first + #define SPINDLE_LASER_PWM_PIN 44 // MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENABLE_PIN 43 // Pin should have a pullup! + #define SPINDLE_DIR_PIN 42 +#elif EXTRUDERS <= 2 + // Hijack the last extruder so that we can get the PWM signal off the Y breakout + // Move Y to the E2 plug. This makes dual Y steppers harder + #undef Y_ENABLE_PIN // 4 + #undef Y_STEP_PIN // 5 + #undef Y_DIR_PIN // 17 + #undef E2_ENABLE_PIN // 23 + #undef E2_STEP_PIN // 22 + #undef E2_DIR_PIN // 60 + #define Y_ENABLE_PIN 23 + #define Y_STEP_PIN 22 + #define Y_DIR_PIN 60 + #define SPINDLE_LASER_PWM_PIN 4 // MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENABLE_PIN 17 // Pin should have a pullup! + #define SPINDLE_DIR_PIN 5 +#endif diff --git a/Marlin/src/pins/pins_MELZI.h b/Marlin/src/pins/pins_MELZI.h new file mode 100644 index 0000000000..79042f61dc --- /dev/null +++ b/Marlin/src/pins/pins_MELZI.h @@ -0,0 +1,32 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Melzi pin assignments + */ + +#ifndef BOARD_NAME + #define BOARD_NAME "Melzi" +#endif + +#define IS_MELZI +#include "pins_SANGUINOLOLU_12.h" diff --git a/Marlin/src/pins/pins_MELZI_CREALITY.h b/Marlin/src/pins/pins_MELZI_CREALITY.h new file mode 100644 index 0000000000..8bfd3b860a --- /dev/null +++ b/Marlin/src/pins/pins_MELZI_CREALITY.h @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Melzi (Creality) pin assignments + * + * The Creality board needs a bootloader installed before Marlin can be uploaded. + * If you don't have a chip programmer you can use a spare Arduino plus a few + * electronic components to write the bootloader. + * + * See http://www.instructables.com/id/Burn-Arduino-Bootloader-with-Arduino-MEGA/ + */ + +#define BOARD_NAME "Melzi (Creality)" + +#include "pins_MELZI.h" + +// For the stock CR-10 use the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +// option for the display in Configuration.h + +#undef LCD_SDSS +#undef LED_PIN +#undef LCD_PINS_RS +#undef LCD_PINS_ENABLE +#undef LCD_PINS_D4 +#undef LCD_PINS_D5 +#undef LCD_PINS_D6 +#undef LCD_PINS_D7 +#undef FIL_RUNOUT_PIN + +#define LCD_SDSS 31 // Smart Controller SD card reader (rather than the Melzi) +#define LCD_PINS_RS 28 // ST9720 CS +#define LCD_PINS_ENABLE 17 // ST9720 DAT +#define LCD_PINS_D4 30 // ST9720 CLK +#define FIL_RUNOUT_PIN -1 // Uses Beeper/LED Pin Pulled to GND + +// Alter timing for graphical display +#ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(125) +#endif +#ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(125) +#endif +#ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(125) +#endif + +#if ENABLED(MINIPANEL) + #undef DOGLCD_CS + #define DOGLCD_CS LCD_PINS_RS +#endif + +/** + PIN: 0 Port: B0 E0_DIR_PIN protected + PIN: 1 Port: B1 E0_STEP_PIN protected + PIN: 2 Port: B2 Z_DIR_PIN protected + PIN: 3 Port: B3 Z_STEP_PIN protected + PIN: 4 Port: B4 AVR_SS_PIN protected + . FAN_PIN protected + . SS_PIN protected + PIN: 5 Port: B5 AVR_MOSI_PIN Output = 1 + . MOSI_PIN Output = 1 + PIN: 6 Port: B6 AVR_MISO_PIN Input = 0 TIMER3A PWM: 0 WGM: 1 COM3A: 0 CS: 3 TCCR3A: 1 TCCR3B: 3 TIMSK3: 0 + . MISO_PIN Input = 0 + PIN: 7 Port: B7 AVR_SCK_PIN Output = 0 TIMER3B PWM: 0 WGM: 1 COM3B: 0 CS: 3 TCCR3A: 1 TCCR3B: 3 TIMSK3: 0 + . SCK_PIN Output = 0 + PIN: 8 Port: D0 RXD Input = 1 + PIN: 9 Port: D1 TXD Input = 0 + PIN: 10 Port: D2 BTN_EN2 Input = 1 + PIN: 11 Port: D3 BTN_EN1 Input = 1 + PIN: 12 Port: D4 HEATER_BED_PIN protected + PIN: 13 Port: D5 HEATER_0_PIN protected + PIN: 14 Port: D6 E0_ENABLE_PIN protected + . X_ENABLE_PIN protected + . Y_ENABLE_PIN protected + PIN: 15 Port: D7 X_STEP_PIN protected + PIN: 16 Port: C0 BTN_ENC Input = 1 + . SCL Input = 1 + PIN: 17 Port: C1 LCD_PINS_ENABLE Output = 0 + . SDA Output = 0 + PIN: 18 Port: C2 X_MIN_PIN protected + . X_STOP_PIN protected + PIN: 19 Port: C3 Y_MIN_PIN protected + . Y_STOP_PIN protected + PIN: 20 Port: C4 Z_MIN_PIN protected + . Z_STOP_PIN protected + PIN: 21 Port: C5 X_DIR_PIN protected + PIN: 22 Port: C6 Y_STEP_PIN protected + PIN: 23 Port: C7 Y_DIR_PIN protected + PIN: 24 Port: A7 TEMP_0_PIN protected + PIN: 25 Port: A6 TEMP_BED_PIN protected + PIN: 26 Port: A5 Z_ENABLE_PIN protected + PIN: 27 Port: A4 BEEPER_PIN Output = 0 + PIN: 28 Port: A3 LCD_PINS_RS Output = 0 + PIN: 29 Port: A2 Input = 0 + PIN: 30 Port: A1 LCD_PINS_D4 Output = 1 + PIN: 31 Port: A0 SDSS Output = 1 +*/ diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h b/Marlin/src/pins/pins_MELZI_MAKR3D.h similarity index 75% rename from Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h rename to Marlin/src/pins/pins_MELZI_MAKR3D.h index 0e09c1f005..1b20d2ae09 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h +++ b/Marlin/src/pins/pins_MELZI_MAKR3D.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,14 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Melzi with ATmega1284 (MaKr3d version) pin assignments */ -#define BOARD_INFO_NAME "Melzi (ATmega1284)" +#define BOARD_NAME "Melzi (ATmega1284)" #include "pins_MELZI.h" diff --git a/Marlin/src/pins/pins_MELZI_MALYAN.h b/Marlin/src/pins/pins_MELZI_MALYAN.h new file mode 100644 index 0000000000..a81526f065 --- /dev/null +++ b/Marlin/src/pins/pins_MELZI_MALYAN.h @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Melzi (Malyan M150) pin assignments + */ + +#define BOARD_NAME "Melzi (Malyan)" +#include "pins_MELZI.h" + +#undef LCD_SDSS +#undef LCD_PINS_RS +#undef LCD_PINS_ENABLE +#undef LCD_PINS_D4 +#undef BTN_EN1 +#undef BTN_EN2 +#undef BTN_ENC + +#define LCD_PINS_RS 17 // ST9720 CS +#define LCD_PINS_ENABLE 16 // ST9720 DAT +#define LCD_PINS_D4 11 // ST9720 CLK +#define BTN_EN1 30 +#define BTN_EN2 29 +#define BTN_ENC 28 + +// Alter timing for graphical display +#ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(125) +#endif +#ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(125) +#endif +#ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(125) +#endif diff --git a/Marlin/src/pins/pins_MELZI_TRONXY.h b/Marlin/src/pins/pins_MELZI_TRONXY.h new file mode 100644 index 0000000000..0da7934302 --- /dev/null +++ b/Marlin/src/pins/pins_MELZI_TRONXY.h @@ -0,0 +1,61 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Melzi pin assignments + */ + +#define BOARD_NAME "Melzi (Tronxy)" +#include "pins_MELZI.h" + +#undef Z_ENABLE_PIN +#undef LCD_PINS_RS +#undef LCD_PINS_ENABLE +#undef LCD_PINS_D4 +#undef LCD_PINS_D5 +#undef LCD_PINS_D6 +#undef LCD_PINS_D7 +#undef BTN_EN1 +#undef BTN_EN2 +#undef BTN_ENC +#undef LCD_SDSS + +#define Z_ENABLE_PIN 14 +#define LCD_PINS_RS 30 +#define LCD_PINS_ENABLE 28 +#define LCD_PINS_D4 16 +#define LCD_PINS_D5 17 +#define LCD_PINS_D6 27 +#define LCD_PINS_D7 29 +#define BTN_EN1 10 +#define BTN_EN2 11 +#define BTN_ENC 26 + +#ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(0) +#endif +#ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(125) +#endif +#ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(0) +#endif diff --git a/Marlin/src/pins/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/pins_MIGHTYBOARD_REVE.h new file mode 100644 index 0000000000..989533d53e --- /dev/null +++ b/Marlin/src/pins/pins_MIGHTYBOARD_REVE.h @@ -0,0 +1,331 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Mightyboard Rev.E pin assignments + */ + +/** + * + * This is a starting-point to support the Makerbot Replicator series of 3D printers. + * It's not functional because Marlin has limited support for some features. + * Marlin will need the following augmentations before it will be supportable: + * + * - Support for two or more MAX6675 thermocouples + * - Support for multiple i2c buses to control the MCP4018 digital pots + * - Support for one additional unidirectional SPI bus, to read the thermocouples + * - Support for an RGB LED that may work differently from BLINKM + * + * The MCP4018 requires separate I2C buses because it has a fixed address (0x2F << 1 = 0x5E) + * The thermocouples share the same SCK and DO pins, with their own CS pins. + * The controller interface port connects to a 3-wire shift-register display controller + * + */ + +/** + * Rev B 2 JAN 2017 + * + * Added pin definitions for: + * M3, M4 & M5 spindle control commands + * case light + * + * Corrected pin assignment for MOSFET_B_PIN pin. Changed it from 9 to 11. The port + * number (B5) agrees with the schematic but B5 is assigned to logical pin 11. + */ + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "MB Replicator" +#define BOARD_NAME "Mightyboard" + +// +// Servos +// +#define SERVO0_PIN 36 // C1 (1280-EX1) +#define SERVO1_PIN 37 // C0 (1280-EX2) +#define SERVO2_PIN 40 // G1 (1280-EX3) +#define SERVO3_PIN 41 // G0 (1280-EX4) + +// +// Limit Switches +// +#define X_MIN_PIN 49 // L0 +#define X_MAX_PIN 48 // L1 +#define Y_MIN_PIN 47 // L2 +#define Y_MAX_PIN 46 // L3 +#define Z_MIN_PIN 43 // L6 +#define Z_MAX_PIN 42 // L7 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 42 +#endif + +// +// Steppers +// +#define X_STEP_PIN 55 // F1 +#define X_DIR_PIN 54 // F0 +#define X_ENABLE_PIN 56 // F2 + +#define Y_STEP_PIN 59 // F5 +#define Y_DIR_PIN 58 // F4 +#define Y_ENABLE_PIN 60 // F6 + +#define Z_STEP_PIN 63 // K1 +#define Z_DIR_PIN 62 // K0 +#define Z_ENABLE_PIN 64 // K2 + +#define E0_STEP_PIN 25 // A3 +#define E0_DIR_PIN 24 // A2 +#define E0_ENABLE_PIN 26 // A4 + +#define E1_STEP_PIN 29 // A7 +#define E1_DIR_PIN 28 // A6 +#define E1_ENABLE_PIN 39 // G2 + +// +// I2C Digipots - MCP4018 +// Address 5E (2F << 1) +// Set from 0 - 127 with stop bit. +// (Ex. 3F << 1 | 1) +// +#define DIGIPOTS_I2C_SCL 76 // J5 +#define DIGIPOTS_I2C_SDA_X 57 // F3 +#define DIGIPOTS_I2C_SDA_Y 61 // F7 +#define DIGIPOTS_I2C_SDA_Z 65 // K3 +#define DIGIPOTS_I2C_SDA_E0 27 // A5 +#define DIGIPOTS_I2C_SDA_E1 77 // J6 +#define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address (5E <- 2F << 1) + +// +// Temperature Sensors +// +#define TEMP_BED_PIN 15 // K7 - 69 / ADC15 - 15 + +// SPI for Max6675 or Max31855 Thermocouple +// Uses a separate SPI bus +// +// 3 E5 DO (SO) +// 5 E3 CS1 +// 2 E4 CS2 +// 78 E2 SCK +// +#define THERMO_SCK_PIN 78 // E2 +#define THERMO_DO_PIN 3 // E5 +#define THERMO_CS1 5 // E3 +#define THERMO_CS2 2 // E4 + +#define MAX6675_SS THERMO_CS1 +#define MAX6675_SCK_PIN THERMO_SCK_PIN +#define MAX6675_DO_PIN THERMO_DO_PIN +// +// Augmentation for auto-assigning plugs +// +// Two thermocouple connectors allows for either +// 2 extruders or 1 extruder and a heated bed. +// With no heated bed, an additional 24V fan is possible. +// +#define MOSFET_A_PIN 6 // H3 +#define MOSFET_B_PIN 11 // B5 - Rev A of this file had this pin assigned to 9 +#define MOSFET_C_PIN 45 // L4 +#define MOSFET_D_PIN 44 // L5 + +#if HOTENDS > 1 + #if TEMP_SENSOR_BED + #define IS_EEB + #else + #define IS_EEF + #endif +#elif TEMP_SENSOR_BED + #define IS_EFB +#else + #define IS_EFF +#endif + +// +// Heaters / Fans (24V) +// +#define HEATER_0_PIN MOSFET_A_PIN + +#if ENABLED(IS_EFB) // Hotend, Fan, Bed + #define HEATER_BED_PIN MOSFET_C_PIN +#elif ENABLED(IS_EEF) // Hotend, Hotend, Fan + #define HEATER_1_PIN MOSFET_B_PIN +#elif ENABLED(IS_EEB) // Hotend, Hotend, Bed + #define HEATER_1_PIN MOSFET_B_PIN + #define HEATER_BED_PIN MOSFET_C_PIN +#elif ENABLED(IS_EFF) // Hotend, Fan, Fan + #define FAN1_PIN MOSFET_C_PIN +#endif + +#ifndef FAN_PIN + #if ENABLED(IS_EFB) || ENABLED(IS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #define FAN_PIN MOSFET_B_PIN + #elif ENABLED(IS_EEF) || ENABLED(IS_SF) // Hotend, Hotend, Fan or Spindle, Fan + #define FAN_PIN MOSFET_C_PIN + #else + #define FAN_PIN MOSFET_D_PIN + #endif +#endif + +// +// Extruder Auto Fan Pins +// +#define ORIG_E0_AUTO_FAN_PIN 7 // H4 +#define ORIG_E1_AUTO_FAN_PIN 12 // B6 + +// +// Misc. Functions +// +#define LED_PIN 13 // B7 +#define CUTOFF_RESET_PIN 16 // H1 +#define CUTOFF_TEST_PIN 17 // H0 +#define CASE_LIGHT_PIN 44 // L5 MUST BE HARDWARE PWM + +// +// LCD / Controller +// +#ifdef REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + + #define LCD_PINS_RS 33 // C4: LCD-STROBE + #define LCD_PINS_ENABLE 72 // J2: LEFT + #define LCD_PINS_D4 35 // C2: LCD-CLK + #define LCD_PINS_D5 32 // C5: RLED + #define LCD_PINS_D6 34 // C3: LCD-DATA + #define LCD_PINS_D7 31 // C6: GLED + + #define BTN_EN2 75 // J4, UP + #define BTN_EN1 73 // J3, DOWN + //STOP button connected as KILL_PIN + #define KILL_PIN 14 // J1, RIGHT + //KILL - not connected + + #define BEEPER_PIN 8 // H5, SD_WP + + #define BTN_CENTER 15 // J0 + #define BTN_ENC BTN_CENTER + + //on board leds + #define STAT_LED_RED_LED SERVO0_PIN // C1 (1280-EX1, DEBUG2) + #define STAT_LED_BLUE_PIN SERVO1_PIN // C0 (1280-EX2, DEBUG3) + +#else + // Replicator uses a 3-wire SR controller with HD44780 + // For now, pretend it's the SAV + // + + #define SAV_3DLCD + #define SR_DATA_PIN 34 // C3 + #define SR_CLK_PIN 35 // C2 + #define SR_STROBE_PIN 33 // C4 + + #define BTN_UP 75 // J4 + #define BTN_DOWN 73 // J3 + #define BTN_LEFT 72 // J2 + #define BTN_RIGHT 14 // J1 + #define BTN_CENTER 15 // J0 + #define BTN_ENC BTN_CENTER + + #define BEEPER_PIN 4 // G5 + + #define STAT_LED_RED_PIN 32 // C5 + #define STAT_LED_BLUE_PIN 31 // C6 (Actually green) + +#endif + +// +// SD Card +// +#define SDSS 53 // B0 +#define SD_DETECT_PIN 9 // H6 + +#define MAX_PIN THERMO_SCK_PIN + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENABLE_PIN 66 // K4 Pin should have a pullup! +#define SPINDLE_LASER_PWM_PIN 8 // H5 MUST BE HARDWARE PWM +#define SPINDLE_DIR_PIN 67 // K5 + + +// Check if all pins are defined in mega/pins_arduino.h +#include +static_assert(NUM_DIGITAL_PINS > MAX_PIN, "add missing pins to [arduino dir]/hardware/arduino/avr/variants/mega/pins_arduino.h based on fastio.h" + "to digital_pin_to_port_PGM, digital_pin_to_bit_mask_PGM, digital_pin_to_timer_PGM, NUM_DIGITAL_PINS, see below"); + +/* in [arduino dir]/hardware/arduino/avr/variants/mega/pins_arduino.h +change: +#define NUM_DIGITAL_PINS 70 +to: +#define NUM_DIGITAL_PINS 80 + +to digital_pin_to_port_PGM add at the end: +const uint8_t PROGMEM digital_pin_to_port_PGM[] = { +.... + PG , // PG 4 ** 70 ** + PG , // PG 3 ** 71 ** + PJ , // PJ 2 ** 72 ** + PJ , // PJ 3 ** 73 ** + PJ , // PJ 7 ** 74 ** + PJ , // PJ 4 ** 75 ** + PJ , // PJ 5 ** 76 ** + PJ , // PJ 6 ** 77 ** + PE , // PE 2 ** 78 ** + PE , // PE 6 ** 79 ** +}; + +to digital_pin_to_bit_mask_PGM add at the end: +const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { +.... + _BV( 4 ) , // PG 4 ** 70 ** + _BV( 3 ) , // PG 3 ** 71 ** + _BV( 2 ) , // PJ 2 ** 72 ** + _BV( 3 ) , // PJ 3 ** 73 ** + _BV( 7 ) , // PJ 7 ** 74 ** + _BV( 4 ) , // PJ 4 ** 75 ** + _BV( 5 ) , // PJ 5 ** 76 ** + _BV( 6 ) , // PJ 6 ** 77 ** + _BV( 2 ) , // PE 2 ** 78 ** + _BV( 6 ) , // PE 6 ** 79 ** +}; + +to digital_pin_to_timer_PGM add at the end: +const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { +.... + NOT_ON_TIMER , // PG 4 ** 70 ** + NOT_ON_TIMER , // PG 3 ** 71 ** + NOT_ON_TIMER , // PJ 2 ** 72 ** + NOT_ON_TIMER , // PJ 3 ** 73 ** + NOT_ON_TIMER , // PJ 7 ** 74 ** + NOT_ON_TIMER , // PJ 4 ** 75 ** + NOT_ON_TIMER , // PJ 5 ** 76 ** + NOT_ON_TIMER , // PJ 6 ** 77 ** + NOT_ON_TIMER , // PE 2 ** 78 ** + NOT_ON_TIMER , // PE 6 ** 79 ** +}; +*/ diff --git a/Marlin/src/pins/pins_MINIRAMBO.h b/Marlin/src/pins/pins_MINIRAMBO.h new file mode 100644 index 0000000000..89335ea8d4 --- /dev/null +++ b/Marlin/src/pins/pins_MINIRAMBO.h @@ -0,0 +1,191 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Mini-Rambo pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Rambo' selected from the 'Tools -> Boards' menu." +#endif + +#if MB(MINIRAMBO_10A) + #define BOARD_NAME "Mini Rambo 1.0a" +#else + #define BOARD_NAME "Mini Rambo" +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 12 +#define X_MAX_PIN 30 +#define Y_MIN_PIN 11 +#define Y_MAX_PIN 24 +#define Z_MIN_PIN 10 +#define Z_MAX_PIN 23 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 23 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 48 +#define X_ENABLE_PIN 29 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 49 +#define Y_ENABLE_PIN 28 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 + +// Microstepping pins - Mapping not from fastio.h (?) +#define X_MS1_PIN 40 +#define X_MS2_PIN 41 +#define Y_MS1_PIN 69 +#define Y_MS2_PIN 39 +#define Z_MS1_PIN 68 +#define Z_MS2_PIN 67 +#define E0_MS1_PIN 65 +#define E0_MS2_PIN 66 + +#define MOTOR_CURRENT_PWM_XY_PIN 46 +#define MOTOR_CURRENT_PWM_Z_PIN 45 +#define MOTOR_CURRENT_PWM_E_PIN 44 +// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range +#ifndef MOTOR_CURRENT_PWM_RANGE + #define MOTOR_CURRENT_PWM_RANGE 2000 +#endif +#define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 +#define HEATER_1_PIN 7 +#if !MB(MINIRAMBO_10A) + #define HEATER_2_PIN 6 +#endif +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif +#define FAN1_PIN 6 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#if !MB(MINIRAMBO_10A) + #define CASE_LIGHT_PIN 9 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +// use P1 connector for spindle pins +#define SPINDLE_LASER_PWM_PIN 9 // MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 18 // Pin should have a pullup! +#define SPINDLE_DIR_PIN 19 + +// +// Průša i3 MK2 Multiplexer Support +// +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 +#if !MB(MINIRAMBO_10A) + #define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 +#endif + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #if !MB(MINIRAMBO_10A) + #define KILL_PIN 32 + #endif + + #if ENABLED(NEWPANEL) + + #if MB(MINIRAMBO_10A) + + #define BEEPER_PIN 78 + + #define BTN_EN1 80 + #define BTN_EN2 73 + #define BTN_ENC 21 + + #define LCD_PINS_RS 38 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 14 + #define LCD_PINS_D5 15 + #define LCD_PINS_D6 32 + #define LCD_PINS_D7 31 + + #define SD_DETECT_PIN 72 + + #else // !MINIRAMBO_10A + + // AUX-4 + #define BEEPER_PIN 84 + + // AUX-2 + #define BTN_EN1 14 + #define BTN_EN2 72 + #define BTN_ENC 9 + + #define LCD_PINS_RS 82 + #define LCD_PINS_ENABLE 18 + #define LCD_PINS_D4 19 + #define LCD_PINS_D5 70 + #define LCD_PINS_D6 85 + #define LCD_PINS_D7 71 + + #define SD_DETECT_PIN 15 + + #endif // !MINIRAMBO_10A + + #endif // NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_MINITRONICS.h b/Marlin/src/pins/pins_MINITRONICS.h new file mode 100644 index 0000000000..f5fdac21d2 --- /dev/null +++ b/Marlin/src/pins/pins_MINITRONICS.h @@ -0,0 +1,144 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Minitronics v1.0/1.1 pin assignments + */ + +/** + * Rev B 2 JAN 2017 + * + * Added pin definitions for M3, M4 & M5 spindle control commands + * + */ + +#ifndef __AVR_ATmega1281__ + #error "Oops! Make sure you have 'Minitronics' selected from the 'Tools -> Boards' menu." +#endif + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "Minitronics supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_NAME "Minitronics v1.0 / v1.1" +// +// Limit Switches +// +#define X_MIN_PIN 5 +#define X_MAX_PIN 2 +#define Y_MIN_PIN 2 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 6 +#define Z_MAX_PIN -1 + +// +// Steppers +// +#define X_STEP_PIN 48 +#define X_DIR_PIN 47 +#define X_ENABLE_PIN 49 + +#define Y_STEP_PIN 39 // A6 +#define Y_DIR_PIN 40 // A0 +#define Y_ENABLE_PIN 38 + +#define Z_STEP_PIN 42 // A2 +#define Z_DIR_PIN 43 // A6 +#define Z_ENABLE_PIN 41 // A1 + +#define E0_STEP_PIN 45 +#define E0_DIR_PIN 44 +#define E0_ENABLE_PIN 27 + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 35 +#define E1_ENABLE_PIN 37 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // Analog Input +#define TEMP_1_PIN 6 // Analog Input +#define TEMP_BED_PIN 6 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 7 // EXTRUDER 1 +#define HEATER_1_PIN 8 // EXTRUDER 2 +#define HEATER_BED_PIN 3 // BED + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif + +// +// Misc. Functions +// +#define SDSS 16 +#define LED_PIN 46 + +// +// LCD / Controller +// +#define BEEPER_PIN -1 + +#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define LCD_PINS_RS 15 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 11 // SID (MOSI) + #define LCD_PINS_D4 10 // SCK (CLK) clock + + #define BTN_EN1 18 + #define BTN_EN2 17 + #define BTN_ENC 25 + + #define SD_DETECT_PIN 30 + +#else + + #define LCD_PINS_RS -1 + #define LCD_PINS_ENABLE -1 + + // Buttons are directly attached using keypad + #define BTN_EN1 -1 + #define BTN_EN2 -1 + #define BTN_ENC -1 + + #define SD_DETECT_PIN -1 // Minitronics doesn't use this +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) // assumes we're only doing CNC work (no 3D printing) + #undef HEATER_BED_PIN + #undef TEMP_BED_PIN // need to free up some pins but also need to + #undef TEMP_0_PIN // re-assign them (to unused pins) because Marlin + #undef TEMP_1_PIN // requires the presence of certain pins or else it + #define HEATER_BED_PIN 4 // won't compile + #define TEMP_BED_PIN 50 + #define TEMP_0_PIN 51 + #define SPINDLE_LASER_ENABLE_PIN 52 // using A6 because it already has a pullup + #define SPINDLE_LASER_PWM_PIN 3 // WARNING - LED & resistor pull up to +12/+24V stepper voltage + #define SPINDLE_DIR_PIN 53 +#endif diff --git a/Marlin/src/pins/pins_MKS_BASE.h b/Marlin/src/pins/pins_MKS_BASE.h new file mode 100644 index 0000000000..90344c4084 --- /dev/null +++ b/Marlin/src/pins/pins_MKS_BASE.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MKS BASE 1.0 – Arduino Mega2560 with RAMPS v1.4 pin assignments + * + * Rev B - Override pin definitions for CASE_LIGHT and M3/M4/M5 spindle control + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS BASE 1.0 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_NAME "MKS BASE 1.0" + +// +// Heaters / Fans +// +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +#define CASE_LIGHT_PIN 2 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 2 // MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 15 // Pin should have a pullup! +#define SPINDLE_DIR_PIN 19 + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/pins_MKS_BASE_15.h b/Marlin/src/pins/pins_MKS_BASE_15.h new file mode 100644 index 0000000000..e9f7050a1b --- /dev/null +++ b/Marlin/src/pins/pins_MKS_BASE_15.h @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MKS BASE v1.5 with A4982 stepper drivers and digital micro-stepping + */ + +#include "pins_MKS_BASE.h" + +/** + * Microstepping pins + */ +#define X_MS1_PIN 5 // Digital 3 / Pin 5 / PE3 / SERVO2_PIN +#define X_MS2_PIN 6 // Digital 6 / Pin 14 / PH3 / SERVO1_PIN +#define Y_MS1_PIN 59 // Analog 5 / Pin 92 / PF5 +#define Y_MS2_PIN 58 // Analog 4 / Pin 93 / PF4 +#define Z_MS1_PIN 22 // Digital 22 / Pin 78 / PA0 +#define Z_MS2_PIN 39 // Digital 39 / Pin 70 / PG2 +#define E0_MS1_PIN 63 // Analog 9 / Pin 86 / PK1 +#define E0_MS2_PIN 64 // Analog 10 / Pin 87 / PK2 +#define E1_MS1_PIN 57 // Analog 3 / Pin 93 / PF3 +#define E1_MS2_PIN 4 // Digital 4 / Pin 1 / PG5 / SERVO3_PIN diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h b/Marlin/src/pins/pins_MKS_BASE_HEROIC.h similarity index 84% rename from Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h rename to Marlin/src/pins/pins_MKS_BASE_HEROIC.h index 3ce138b975..84f7280dfa 100644 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h +++ b/Marlin/src/pins/pins_MKS_BASE_HEROIC.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * MKS BASE with Heroic HR4982 stepper drivers diff --git a/Marlin/src/pins/pins_MKS_GEN_13.h b/Marlin/src/pins/pins_MKS_GEN_13.h new file mode 100644 index 0000000000..41e69d478a --- /dev/null +++ b/Marlin/src/pins/pins_MKS_GEN_13.h @@ -0,0 +1,144 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Arduino Mega with RAMPS v1.4 adjusted pin assignments + * + * MKS GEN v1.3 (Extruder, Fan, Bed) + * MKS GEN v1.3 (Extruder, Extruder, Fan, Bed) + * MKS GEN v1.4 (Extruder, Fan, Bed) + * MKS GEN v1.4 (Extruder, Extruder, Fan, Bed) + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS GEN 1.3/1.4 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_NAME "MKS GEN >= v1.3" + +// +// Heaters / Fans +// +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +// +// PSU / SERVO +// +// If POWER_SUPPLY is specified, always hijack Servo 3 +// +#if POWER_SUPPLY > 0 + #define SERVO3_PIN -1 + #define PS_ON_PIN 4 +#endif + +#include "pins_RAMPS.h" + +// +// LCD / Controller +// +#if ENABLED(VIKI2) || ENABLED(miniVIKI) + /** + * VIKI2 Has two groups of wires with... + * + * +Vin + Input supply, requires 120ma for LCD and mSD card + * GND Ground Pin + * MOSI Data input for LCD and SD + * MISO Data output for SD + * SCK Clock for LCD and SD + * AO Reg. Sel for LCD + * LCS Chip Select for LCD + * SDCS Chip Select for SD + * SDCD Card Detect pin for SD + * ENCA Encoder output A + * ENCB Encoder output B + * ENCBTN Encoder button switch + * + * BTN Panel mounted button switch + * BUZZER Piezo buzzer + * BLUE-LED Blue LED ring pin (3 to 5v, mosfet buffered) + * RED-LED Red LED ring pin (3 to 5v, mosfet buffered) + * + * This configuration uses the following arrangement: + * + * EXP1 D37 = EN2 D35 = EN1 EXP2 D50 = MISO D52 = SCK + * D17 = BLUE D16 = RED D31 = ENC D53 = SDCS + * D23 = KILL D25 = BUZZ D33 = --- D51 = MOSI + * D27 = A0 D29 = LCS D49 = SDCD RST = --- + * GND = GND 5V = 5V GND = --- D41 = --- + */ + + #undef BTN_EN1 + #undef BTN_EN2 + #undef BTN_ENC + #undef DOGLCD_A0 + #undef DOGLCD_CS + #undef SD_DETECT_PIN + #undef BEEPER_PIN + #undef KILL_PIN + + // + // VIKI2 12-wire lead + // + + // orange/white SDCD + #define SD_DETECT_PIN 49 + + // white ENCA + #define BTN_EN1 35 + + // green ENCB + #define BTN_EN2 37 + + // purple ENCBTN + #define BTN_ENC 31 + + // brown A0 + #define DOGLCD_A0 27 + + // green/white LCS + #define DOGLCD_CS 29 + + // 50 gray MISO + // 51 yellow MOSI + // 52 orange SCK + + // blue SDCS + //#define SDSS 53 + + // + // VIKI2 4-wire lead + // + + // blue BTN + #define KILL_PIN 23 + + // green BUZZER + #define BEEPER_PIN 25 + + // yellow RED-LED + #define STAT_LED_RED_PIN 16 + + // white BLUE-LED + #define STAT_LED_BLUE_PIN 17 + +#endif diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L.h b/Marlin/src/pins/pins_MKS_GEN_L.h similarity index 82% rename from Marlin/src/pins/ramps/pins_MKS_GEN_L.h rename to Marlin/src/pins/pins_MKS_GEN_L.h index 522a34cda1..59c5bcf481 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_L.h +++ b/Marlin/src/pins/pins_MKS_GEN_L.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * MKS GEN L – Arduino Mega2560 with RAMPS v1.4 pin assignments @@ -29,7 +28,7 @@ #error "MKS GEN L supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "MKS GEN L" +#define BOARD_NAME "MKS GEN L" // // Heaters / Fans diff --git a/Marlin/src/pins/pins_MKS_SBASE.h b/Marlin/src/pins/pins_MKS_SBASE.h new file mode 100644 index 0000000000..7a58198342 --- /dev/null +++ b/Marlin/src/pins/pins_MKS_SBASE.h @@ -0,0 +1,295 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * MKS SBASE pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "MKS SBASE" + #define DEFAULT_WEBSITE_URL "https://github.com/makerbase-mks/MKS-SBASE" +#endif + +// unused +/* +#define PIN_P0_27 P0_27 // EXP2/Onboard SD +#define PIN_P0_28 P0_28 // EXP2 +#define PIN_P0_02 P0_02 // AUX1 (Interrupt Capable/ADC/Serial Port 0) +#define PIN_P0_03 P0_03 // AUX1 (Interrupt Capable/ADC/Serial Port 0) +*/ + +#define LED_PIN P1_18 // LED2 P1_19, LED3 P1_20, LED4 P1_21 + +// +// Servo pin +// +#define SERVO0_PIN P1_23 // J8-3 (low jitter) +#define SERVO1_PIN P2_12 // J8-4 +#define SERVO2_PIN P2_11 // J8-5 +#define SERVO3_PIN P4_28 // J8-6 + +// +// Limit Switches - Not Interrupt Capable +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_28 // The original Mks Sbase DIO19 has a 10k pullup to 3.3V or 5V, 1K series, so when using a Zprobe we must use DIO41 (J8 P1.22) +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN 0 // A0 (TH1) +#define TEMP_0_PIN 1 // A1 (TH2) +#define TEMP_1_PIN 2 // A2 (TH3) +#define TEMP_2_PIN 3 // A3 (TH4) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 +#define HEATER_1_PIN P2_06 +#ifndef FAN_PIN + #define FAN_PIN P2_04 +#endif + +// +// Connector J7 +// Note: These pins are all digitally shared with the EXP1/EXP2 Connector. +// Using them with an LCD connected or configured will lead to hangs & crashes. +// + +// 5V +// NC +// GND +#define PIN_P0_17 P0_17 +#define PIN_P0_16 P0_16 +#define PIN_P0_15 P0_15 + +// +// Connector J8 +// + +// GND +#define PIN_P1_22 P1_22 +#define PIN_P1_23 P1_23 // PWM Capable +#define PIN_P2_12 P2_12 // Interrupt Capable +#define PIN_P2_11 P2_11 // Interrupt Capable +#define PIN_P4_28 P4_28 + +// +// Prusa i3 MK2 Multi Material Multiplexer Support +// +#if ENABLED(MK2_MULTIPLEXER) + #define E_MUX0_PIN P1_23 // J8-3 + #define E_MUX1_PIN P2_12 // J8-4 + #define E_MUX2_PIN P2_11 // J8-5 +#endif + +// +// Misc. Functions +// +#define PS_ON_PIN P0_25 //TH3 Connector +#define LPC_SOFTWARE_SPI // MKS_SBASE needs a software SPI because the + // selected pins are not on a hardware SPI controller + +/** + * Smart LCD adapter + * + * The Smart LCD adapter can be used for the two 10 pin LCD controllers such as + * REPRAP_DISCOUNT_SMART_CONTROLLER. It can't be used for controllers that use + * DOGLCD_A0, DOGLCD_CS, LCD_PINS_D5, LCD_PINS_D6 or LCD_PINS_D7. A custom cable + * is needed to pick up 5V for the EXP1 connection. + * + * SD card on the LCD uses the same SPI signals as the LCD. This results in garbage/lines + * on the LCD display during accesses of the SD card. The menus/code has been arranged so + * that the garbage/lines are erased immediately after the SD card accesses are completed. + */ + +#if ENABLED(ULTRA_LCD) + #define BEEPER_PIN P1_31 // EXP1.1 + #define BTN_ENC P1_30 // EXP1.2 + #define BTN_EN1 P3_26 // EXP2.5 + #define BTN_EN2 P3_25 // EXP2.3 + #define LCD_PINS_RS P0_16 // EXP1.4 + #define LCD_SDSS P0_28 // EXP2.4 + #define LCD_PINS_ENABLE P0_18 // EXP1.3 + #define LCD_PINS_D4 P0_15 // EXP1.5 +#endif + +// +// Ethernet pins +// +#ifndef ULTIPANEL + #define ENET_MDIO P1_17 // J12-4 + #define ENET_RX_ER P1_14 // J12-6 + #define ENET_RXD1 P1_10 // J12-8 +#endif + +#define ENET_MOC P1_16 // J12-3 +#define REF_CLK P1_15 // J12-5 +#define ENET_RXD0 P1_09 // J12-7 +#define ENET_CRS P1_08 // J12-9 +#define ENET_TX_EN P1_04 // J12-10 +#define ENET_TXD0 P1_00 // J12-11 +#define ENET_TXD1 P1_01 // J12-12 + +// A custom cable is needed. See the README file in the +// Marlin\src\config\examples\Mks\Sbase directory + +#define SCK_PIN P1_22 // J8-2 (moved from EXP2 P0.7) +#define MISO_PIN P1_23 // J8-3 (moved from EXP2 P0.8) +#define MOSI_PIN P2_12 // J8-4 (moved from EXP2 P0.5) +#define SS_PIN P0_28 +#define SDSS P0_06 + +/** + * Example for trinamic drivers using the J8 connector on MKs Sbase. + * 2130s need 1 pin for each driver. 2208s need 2 pins for serial control. + * This board does not have enough pins to use hardware serial. + */ + +#if HAS_DRIVER(TMC2130) + // J8 + #define X_CS_PIN P1_22 + #define Y_CS_PIN P1_23 + #define Z_CS_PIN P2_12 + #define E0_CS_PIN P2_11 + #define E1_CS_PIN P4_28 + +// Hardware SPI is on EXP2. See if you can make it work: +// https://github.com/makerbase-mks/MKS-SBASE/issues/25 +#define TMC_USE_SW_SPI +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P0_03 // AUX1 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P0_02 // AUX1 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P0_26 // TH4 + #endif + #endif +#endif +#if HAS_DRIVER(TMC2208) + // The shortage of pins becomes apparent. + // Worst case you may have to give up the LCD + // RX pins need to be interrupt capable + #define X_SERIAL_TX_PIN P1_22 // J8-2 + #define X_SERIAL_RX_PIN P2_12 // J8-4 Interrupt Capable + #define Y_SERIAL_TX_PIN P1_23 // J8-3 + #define Y_SERIAL_RX_PIN P2_11 // J8-5 Interrupt Capable + #define Z_SERIAL_TX_PIN P2_12 // J8-4 + #define Z_SERIAL_RX_PIN P0_25 // TH3 + #define E0_SERIAL_TX_PIN P4_28 // J8-6 + #define E0_SERIAL_RX_PIN P0_26 // TH4 +#endif + +/** + * P0.27 is on EXP2 and the on-board SD card's socket. That means it can't be + * used as the SD_DETECT for the LCD's SD card. + * + * The best solution is to use the custom cable to connect the LCD's SD_DETECT + * to a pin NOT on EXP2. + * + * If you can't find a pin to use for the LCD's SD_DETECT then comment out + * SD_DETECT_PIN entirely and remove that wire from the the custom cable. + */ +#define SD_DETECT_PIN P2_11 // J8-5 (moved from EXP2 P0.27) + +/** + * PWMs + * + * There are 6 PWMs. Each PWM can be assigned to one of two pins. + * + * SERVO2 does NOT have a PWM assigned to it. + * + * PWM1.1 P1_18 SERVO3_PIN FIL_RUNOUT_PIN 5V output, PWM + * PWM1.1 P2_00 E0_STEP_PIN + * PWM1.2 P1_20 SERVO0_PIN + * PWM1.2 P2_01 X_STEP_PIN + * PWM1.3 P1_21 SERVO1_PIN J5-1 + * PWM1.3 P2_02 Y_STEP_PIN + * PWM1.4 P1_23 SDSS(SSEL0) J3-5 AUX-3 + * PWM1.4 P2_03 Z_STEP_PIN + * PWM1.5 P1_24 X_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.5 P2_04 RAMPS_D9_PIN + * PWM1.6 P1_26 Y_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.6 P2_05 RAMPS_D10_PIN + */ + + /** + * Special pins + * P1_30 - not 5V tolerant - EXP1 + * P1_31 - not 5V tolerant - EXP1 + * P0_27 - open collector - EXP2 + * P0_28 - open collector - EXP2 + * + */ + + /** + * Serial Ports + * P0_00 - Port 3 + * P0_01 - SD Card (Onboard) + * P0_10 - Port 2 + * P0_11 - Y_EN/Y_DIR + * P0_15 - Port 1 + * P0_16 - EXP1 + * P0_02 - Port 0 + * P0_03 - AUX1 + * P0_29 - Port -1 + * P0_30 - USB + * + */ diff --git a/Marlin/src/pins/pins_MORPHEUS.h b/Marlin/src/pins/pins_MORPHEUS.h new file mode 100644 index 0000000000..24ccf47a2d --- /dev/null +++ b/Marlin/src/pins/pins_MORPHEUS.h @@ -0,0 +1,90 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + /** + * 2017 Victor Perez Marlin for stm32f1 test + * 2018 Modified by Pablo Crespo for Morpheus Board (https://github.com/pscrespo/Morpheus-STM32) + */ + +/** + * MORPHEUS Board pin assignments + */ + +#ifndef __STM32F1__ + #error "Oops! Make sure you have an STM32F1 board selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Bluepill based board" + +// +// Limit Switches +// +#define X_MIN_PIN PB14 +#define Y_MIN_PIN PB13 +#define Z_MIN_PIN PB12 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PB9 +#endif + +// +// Steppers +// +// X & Y enable are the same +#define X_STEP_PIN PB7 +#define X_DIR_PIN PB6 +#define X_ENABLE_PIN PB8 + +#define Y_STEP_PIN PB5 +#define Y_DIR_PIN PB4 +#define Y_ENABLE_PIN PB8 + +#define Z_STEP_PIN PA15 +#define Z_DIR_PIN PA10 +#define Z_ENABLE_PIN PB3 + +#define E0_STEP_PIN PA8 +#define E0_DIR_PIN PB15 +#define E0_ENABLE_PIN PA9 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PB1 // Analog Input (HOTEND thermistor) +#define TEMP_BED_PIN PB0 // Analog Input (BED thermistor) + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA2 // HOTEND MOSFET +#define HEATER_BED_PIN PA0 // BED MOSFET + +#define FAN_PIN PA1 // FAN1 header on board - PRINT FAN + +// +// Misc. +// +#define LED_PIN PC13 +#define SDSS PA3 diff --git a/Marlin/src/pins/pins_OMCA.h b/Marlin/src/pins/pins_OMCA.h new file mode 100644 index 0000000000..6ee6fabe6b --- /dev/null +++ b/Marlin/src/pins/pins_OMCA.h @@ -0,0 +1,150 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Open Motion controller with enable based extruders (Final!) + * + * ATMega644 + * + * +---\/---+ + * (D 0) PB0 1| |40 PA0 (AI 0 / D31) + * (D 1) PB1 2| |39 PA1 (AI 1 / D30) + * INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29) + * PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28) + * PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27) + * MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26) + * MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25) + * SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24) + * RST 9| |32 AREF + * VCC 10| |31 GND + * GND 11| |30 AVCC + * XTAL2 12| |29 PC7 (D 23) + * XTAL1 13| |28 PC6 (D 22) + * RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI + * TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO + * INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS + * INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK + * PWM (D 12) PD4 18| |23 PC1 (D 17) SDA + * PWM (D 13) PD5 19| |22 PC0 (D 16) SCL + * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM + * +--------+ + * + * REF http://sanguino.cc/hardware + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + * + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) + #error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu. (Final OMCA board)" +#endif + +#define BOARD_NAME "Final OMCA" + +// +// Limit Switches +// +#define X_STOP_PIN 0 +#define Y_STOP_PIN 1 +#define Z_STOP_PIN 2 + +// +// Steppers +// +#define X_STEP_PIN 26 +#define X_DIR_PIN 25 +#define X_ENABLE_PIN 10 + +#define Y_STEP_PIN 28 +#define Y_DIR_PIN 27 +#define Y_ENABLE_PIN 10 + +#define Z_STEP_PIN 23 +#define Z_DIR_PIN 22 +#define Z_ENABLE_PIN 10 + +#define E0_STEP_PIN 24 +#define E0_DIR_PIN 21 +#define E0_ENABLE_PIN 10 + +#define E1_STEP_PIN -1 // 21 +#define E1_DIR_PIN -1 // 20 +#define E1_ENABLE_PIN -1 // 19 + +#define E2_STEP_PIN -1 // 21 +#define E2_DIR_PIN -1 // 20 +#define E2_ENABLE_PIN -1 // 18 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input (1,2 or I2C) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 // DONE PWM on RIGHT connector +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 14 // PWM on MIDDLE connector +#endif + +// +// Misc. Functions +// +#define SDSS 11 + +#define I2C_SCL_PIN 16 +#define I2C_SDA_PIN 17 + +// future proofing +#define __FS 20 +#define __FD 19 +#define __GS 18 +#define __GD 13 + +#define UNUSED_PWM 14 // PWM on LEFT connector diff --git a/Marlin/src/pins/pins_OMCA_A.h b/Marlin/src/pins/pins_OMCA_A.h new file mode 100644 index 0000000000..777c80b22f --- /dev/null +++ b/Marlin/src/pins/pins_OMCA_A.h @@ -0,0 +1,137 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Open Motion controller with enable based extruders (Alpha!) + * + * ATMega644 + * + * +---\/---+ + * (D 0) PB0 1| |40 PA0 (AI 0 / D31) + * (D 1) PB1 2| |39 PA1 (AI 1 / D30) + * INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29) + * PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28) + * PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27) + * MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26) + * MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25) + * SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24) + * RST 9| |32 AREF + * VCC 10| |31 GND + * GND 11| |30 AVCC + * XTAL2 12| |29 PC7 (D 23) + * XTAL1 13| |28 PC6 (D 22) + * RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI + * TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO + * INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS + * INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK + * PWM (D 12) PD4 18| |23 PC1 (D 17) SDA + * PWM (D 13) PD5 19| |22 PC0 (D 16) SCL + * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM + * +--------+ + * + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + * + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +#ifndef __AVR_ATmega644__ + #error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Alpha OMCA" + +// +// Limit Switches +// +#define X_STOP_PIN 0 +#define Y_STOP_PIN 1 +#define Z_STOP_PIN 2 + +// +// Steppers +// +#define X_STEP_PIN 21 +#define X_DIR_PIN 20 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 26 +#define Z_DIR_PIN 25 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 24 + +#define E1_STEP_PIN -1 // 19 +#define E1_DIR_PIN -1 // 18 +#define E1_ENABLE_PIN 24 + +#define E2_STEP_PIN -1 // 17 +#define E2_DIR_PIN -1 // 16 +#define E2_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (D27) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 3 +#endif + +// +// Misc. Functions +// +#define SDSS 11 + +/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */ diff --git a/Marlin/src/pins/pins_PRINTRBOARD.h b/Marlin/src/pins/pins_PRINTRBOARD.h new file mode 100644 index 0000000000..42632d174a --- /dev/null +++ b/Marlin/src/pins/pins_PRINTRBOARD.h @@ -0,0 +1,168 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Select Teensy++ 2.0 in Arduino IDE from the 'Tools -> Boards' menu + * + * Installation instructions are at the above URL. Don't bother loading the + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools -> Boards' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#ifndef __AVR_AT90USB1286__ + #error "Oops! Make sure you have 'Teensy++ 2.0' or 'Printrboard' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Printrboard" + +// Disable JTAG pins so they can be used for the Extrudrboard +#define DISABLE_JTAG + +// +// Limit Switches +// +#define X_STOP_PIN 47 // E3 +#define Y_STOP_PIN 20 // B0 SS +#define Z_STOP_PIN 36 // E4 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 19 // E7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 18 // E6 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 17 // C7 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 13 // C3 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 0 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B - Extruder +#define HEATER_1_PIN 44 // F6 +#define HEATER_2_PIN 45 // F7 +#define HEATER_BED_PIN 14 // C4 PWM3C + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 26 // B6 SDCS +#define FILWIDTH_PIN 2 // Analog Input + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) + + #define LCD_PINS_RS 9 // E1 JP11-11 + #define LCD_PINS_ENABLE 8 // E0 JP11-10 + #define LCD_PINS_D4 7 // D7 JP11-8 + #define LCD_PINS_D5 6 // D6 JP11-7 + #define LCD_PINS_D6 5 // D5 JP11-6 + #define LCD_PINS_D7 4 // D4 JP11-5 + + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define BEEPER_PIN 8 // E0 JP11-10 + + #define DOGLCD_A0 40 // F2 JP2-2 + #define DOGLCD_CS 41 // F3 JP2-4 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 2 // D2 TX1 JP2-5 + #define BTN_EN2 3 // D3 RX1 JP2-7 + #define BTN_ENC 45 // F7 TDI JP2-12 + + #undef SDSS + #define SDSS 43 // F5 TMS JP2-8 + + #define STAT_LED_RED_PIN 12 // C2 JP11-14 + #define STAT_LED_BLUE_PIN 10 // C0 JP11-12 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 3 // D3 RX1 JP2-7 + #define BTN_EN2 2 // D2 TX1 JP2-5 + #define BTN_ENC 41 // F3 JP2-4 + #undef SDSS + #define SDSS 38 // F0 B-THERM connector - use SD card on Panelolu2 + + #else + + #define BTN_EN1 10 // C0 JP11-12 + #define BTN_EN2 11 // C1 JP11-13 + #define BTN_ENC 12 // C2 JP11-14 + + #endif + +#endif // ULTRA_LCD && NEWPANEL diff --git a/Marlin/src/pins/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/pins_PRINTRBOARD_REVF.h new file mode 100644 index 0000000000..8239a91586 --- /dev/null +++ b/Marlin/src/pins/pins_PRINTRBOARD_REVF.h @@ -0,0 +1,285 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html + * Installation - https://www.pjrc.com/teensy/td_download.html + * + * Select Teensy++ 2.0 in Arduino IDE from the 'Tools -> Boards' menu + * + * Note: With Teensyduino extension, the Arduino IDE will report 130048 bytes of program storage space available, + * but there is actually only 122880 bytes due to the larger DFU bootloader shipped by default on all Printrboard RevF. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools -> Boards' menu. + * + * Teensyduino is the most popular and easiest option. + */ + +/** + * To burn the bootloader that comes with Printrboard HID extension: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#ifndef __AVR_AT90USB1286__ + #error "Oops! Make sure you have 'Teensy++ 2.0' or 'Printrboard' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef USBCON + #error "USBCON should be defined by the platform for this board." +#endif + +#define BOARD_NAME "Printrboard Rev.F" +// Disable JTAG pins so EXP1 pins work correctly +// (Its pins are used for the Extrudrboard and filament sensor, for example). +#define DISABLE_JTAG + +/** + * Note that REV F6 of the Printrboard stole the A HOTEND pin and + * reassigned it to a second fan for the extruder heater. It's + * recommended that you swap the A and B outputs on the Extrudrboard + * so EXTRUDERS=2 will still work on F6, using B for E1/HEATER_1/TEMP_1. + * See https://printrbot.zendesk.com/hc/en-us/articles/115003072346 + * + * If you have REV F6 you probably also want to set E0_AUTO_FAN_PIN + * to PRINTRBOARD_F6_HEATER_FAN_PIN (44). + * + * Define NO_EXTRUDRBOARD if you don't have an EXTRUDRBOARD and wish to + * reassign different functions to EXP1. + * + * Define NO_EXTRUDRBOARD_OUTPUT_SWAP if you have a REV F5 or lower and + * want to use EXTRUDRBOARD A for E1 and EXTRUDRBOARD B for E2. + */ +//#define NO_EXTRUDRBOARD +//#define NO_EXTRUDRBOARD_OUTPUT_SWAP + +// +// Limit Switches +// +#define X_STOP_PIN 47 // E3 +#define Y_STOP_PIN 24 // B4 PWM2A +#define Z_STOP_PIN 36 // E4 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 19 // E7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 18 // E6 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 17 // C7 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 13 // C3 + +#if DISABLED(NO_EXTRUDRBOARD) +#if DISABLED(NO_EXTRUDRBOARD_OUTPUT_SWAP) + #define E1_STEP_PIN 25 // B5 + #define E1_DIR_PIN 37 // E5 + #define E1_ENABLE_PIN 42 // F4 + + #define E2_STEP_PIN 2 // D2 + #define E2_DIR_PIN 3 // D3 + #define E2_ENABLE_PIN 43 // F5 +#else + #define E1_STEP_PIN 2 // D2 + #define E1_DIR_PIN 3 // D3 + #define E1_ENABLE_PIN 43 // F5 + + #define E2_STEP_PIN 25 // B5 + #define E2_DIR_PIN 37 // E5 + #define E2_ENABLE_PIN 42 // F4 +#endif +#endif // NO_EXTRUDRBOARD + +// Enable control of stepper motor currents with the I2C based MCP4728 DAC used on Printrboard REVF +#define DAC_STEPPER_CURRENT + +// Set default drive strength percents if not already defined - X, Y, Z, E axis +#ifndef DAC_MOTOR_CURRENT_DEFAULT + #define DAC_MOTOR_CURRENT_DEFAULT { 70, 70, 50, 70 } +#endif + +// Number of channels available for DAC +#define DAC_STEPPER_ORDER { 3, 2, 1, 0 } + +#define DAC_STEPPER_SENSE 0.11 +#define DAC_STEPPER_ADDRESS 0 +#define DAC_STEPPER_MAX 3520 +#define DAC_STEPPER_VREF 1 // internal Vref, gain 1x = 2.048V +#define DAC_STEPPER_GAIN 0 +#define DAC_OR_ADDRESS 0x00 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input (Extruder) +#define TEMP_BED_PIN 0 // Analog Input (Bed) + +#if DISABLED(NO_EXTRUDRBOARD) +#if DISABLED(NO_EXTRUDRBOARD_OUTPUT_SWAP) + #define TEMP_1_PIN 2 // Analog Input (Extrudrboard A THERM) + #define TEMP_2_PIN 3 // Analog Input (Extrudrboard B THERM) +#else + #define TEMP_1_PIN 3 // Analog Input (Extrudrboard B THERM) + #define TEMP_2_PIN 2 // Analog Input (Extrudrboard A THERM) +#endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B - Extruder +#define HEATER_BED_PIN 14 // C4 PWM3C + +#if DISABLED(NO_EXTRUDRBOARD) +#if DISABLED(NO_EXTRUDRBOARD_OUTPUT_SWAP) + #define HEATER_1_PIN 44 // F6 - Extrudrboard A HOTEND + #define HEATER_2_PIN 45 // F7 - Extrudrboard B HOTEND +#else + #define HEATER_1_PIN 45 // F7 - Extrudrboard B HOTEND + #define HEATER_2_PIN 44 // F6 - Extrudrboard A HOTEND +#endif +#endif + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// LCD / Controller +// +//#define USE_INTERNAL_SD + +#if ENABLED(ULTRA_LCD) + #define LCD_PINS_RS 9 // E1 JP11-11 + #define LCD_PINS_ENABLE 8 // E0 JP11-10 + #define LCD_PINS_D4 7 // D7 JP11-8 + #define LCD_PINS_D5 6 // D6 JP11-7 + #define LCD_PINS_D6 5 // D5 JP11-6 + #define LCD_PINS_D7 4 // D4 JP11-5 + + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define BEEPER_PIN 8 // E0 JP11-10 + #define DOGLCD_A0 40 // F2 JP2-2 + #define DOGLCD_CS 41 // F3 JP2-4 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 2 // D2 TX1 JP2-5 + #define BTN_EN2 3 // D3 RX1 JP2-7 + #define BTN_ENC 45 // F7 TDI JP2-12 + + #define SDSS 3 // F5 TMS JP2-8 + + #define STAT_LED_RED_PIN 12 // C2 JP11-14 + #define STAT_LED_BLUE_PIN 10 // C0 JP11-12 + + #elif ENABLED(MINIPANEL) + + #if DISABLED(USE_INTERNAL_SD) + // PIN FASTIO PIN# ATUSB90 PIN# Teensy2.0++ PIN# Printrboard RevF Conn. MKSLCD12864 PIN# + #define SDSS 11 // 36 C1 EXP2-13 EXP2-07 + #define SD_DETECT_PIN 9 // 34 E1 EXP2-11 EXP2-04 + #endif + + // PIN FASTIO PIN# ATUSB90 PIN# Teensy2.0++ PIN# Printrboard RevF Conn. MKSLCD12864 PIN# + #define DOGLCD_A0 4 // 29 D4 EXP2-05 EXP1-04 + #define DOGLCD_CS 5 // 30 D5 EXP2-06 EXP1-05 + #define BTN_ENC 6 // 31 D6 EXP2-07 EXP1-09 + #define BEEPER_PIN 7 // 32 D7 EXP2-08 EXP1-10 + #define KILL_PIN 8 // 33 E0 EXP2-10 EXP2-03 + #define BTN_EN1 10 // 35 C0 EXP2-12 EXP2-06 + #define BTN_EN2 12 // 37 C2 EXP2-14 EXP2-08 + //#define LCD_BACKLIGHT_PIN 43 // 56 F5 EXP1-12 Not Implemented + //#define SCK 21 // 11 B1 ICSP-04 EXP2-09 + //#define MOSI 22 // 12 B2 ICSP-03 EXP2-05 + //#define MISO 23 // 13 B3 ICSP-06 EXP2-05 + + // increase delays + #ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(313) + #endif + #ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(313) + #endif + #ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(313) + #endif + + #else + + #define BTN_EN1 10 // C0 JP11-12 + #define BTN_EN2 11 // C1 JP11-13 + #define BTN_ENC 12 // C2 JP11-14 + + #endif + +#endif + +// +// Misc. Functions +// +// PIN FASTIO PIN# ATUSB90 PIN# Teensy2.0++ PIN# Printrboard RevF Conn. +#ifndef SDSS + #define SDSS 20 // 10 B0 +#endif + +/** + * This is EXP1-2, which is also the TEMP_A_PIN for the Extrudrboard. + * If using w/ Extrudrboard, cut off pin 2 on the Extrudrboard male + * connector to ensure this is disconnected from the A THERM pullups. + * You probably want to set EXTRUDERS=2 and swap the Extrudrboard outputs, + * which will let you use Channel B on the Extrudrboard as E1. + */ +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 2 // Analog Input +#endif diff --git a/Marlin/src/pins/pins_RADDS.h b/Marlin/src/pins/pins_RADDS.h new file mode 100644 index 0000000000..d17bc72b17 --- /dev/null +++ b/Marlin/src/pins/pins_RADDS.h @@ -0,0 +1,243 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * RADDS + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "RADDS" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 6 +#define SERVO2_PIN 39 +#define SERVO3_PIN 40 + +// +// Limit Switches +// +#define X_MIN_PIN 28 +#define X_MAX_PIN 34 +#define Y_MIN_PIN 30 +#define Y_MAX_PIN 36 +#define Z_MIN_PIN 32 +#define Z_MAX_PIN 38 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 38 +#endif + +// +// Steppers +// +#define X_STEP_PIN 24 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 26 +#ifndef X_CS_PIN + #define X_CS_PIN 25 +#endif + +#define Y_STEP_PIN 17 +#define Y_DIR_PIN 16 +#define Y_ENABLE_PIN 22 +#ifndef Y_CS_PIN + #define Y_CS_PIN 27 +#endif + +#define Z_STEP_PIN 2 +#define Z_DIR_PIN 3 +#define Z_ENABLE_PIN 15 +#ifndef Z_CS_PIN + #define Z_CS_PIN 29 +#endif + +#define E0_STEP_PIN 61 +#define E0_DIR_PIN 60 +#define E0_ENABLE_PIN 62 +#ifndef E0_CS_PIN + #define E0_CS_PIN 31 +#endif + +#define E1_STEP_PIN 64 +#define E1_DIR_PIN 63 +#define E1_ENABLE_PIN 65 +#ifndef E1_CS_PIN + #define E1_CS_PIN 33 +#endif + +#define E2_STEP_PIN 51 +#define E2_DIR_PIN 53 +#define E2_ENABLE_PIN 49 +#ifndef E2_CS_PIN + #define E2_CS_PIN 35 +#endif + +// +// Extension Board V2 +// http://doku.radds.org/dokumentation/extension-board +// +//#define RADDS_EXTENSION +#if ENABLED(RADDS_EXTENSION) + #define E3_STEP_PIN 35 + #define E3_DIR_PIN 33 + #define E3_ENABLE_PIN 37 + #ifndef E3_CS_PIN + #define E3_CS_PIN 6 + #endif + + #define E3_MS1_PIN 67 + #define E3_MS2_PIN 68 + #define E3_MS3_PIN 69 + + #define Z2_STEP_PIN 29 + #define Z2_DIR_PIN 27 + #define Z2_ENABLE_PIN 31 + #ifndef Z2_CS_PIN + #define Z2_CS_PIN 39 + #endif + + #define Z2_MS1_PIN 67 // shared with E3_MS1_PIN + #define Z2_MS2_PIN 68 // shared with E3_MS2_PIN + #define Z2_MS3_PIN 69 // shared with E3_MS3_PIN + + #define RADDS_EXT_VDD1_PIN 25 + #define RADDS_EXT_VDD2_PIN 66 + + #define BOARD_INIT() OUT_WRITE(RADDS_EXT_VDD1_PIN, HIGH); OUT_WRITE(RADDS_EXT_VDD2_PIN, HIGH) +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_2_PIN 2 // Analog Input +#define TEMP_3_PIN 3 // Analog Input +#define TEMP_4_PIN 5 // dummy so will compile when PINS_DEBUGGING is enabled +#define TEMP_BED_PIN 4 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 53 +#else + #define MAX6675_SS 49 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 7 // BED + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif +#define FAN1_PIN 8 + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 40 // SERVO3_PIN + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 39 // SERVO2_PIN +#endif + +// I2C EEPROM with 8K of space +#define I2C_EEPROM +#define E2END 0x1FFF + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(RADDS_DISPLAY) + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + #define LCD_PINS_D5 45 + #define LCD_PINS_D6 46 + #define LCD_PINS_D7 47 + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define BTN_BACK 71 + + #undef SDSS + #define SDSS 10 + #define SD_DETECT_PIN 14 + + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + // The REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER requires + // an adapter such as https://www.thingiverse.com/thing:1740725 + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #elif ENABLED(SSD1306_OLED_I2C_CONTROLLER) + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + #define BEEPER_PIN 41 + #define LCD_SDSS 10 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + #define LCD_PINS_D4 29 + #define LCD_PINS_ENABLE 27 + #define LCD_PINS_RS 25 + + #define BTN_EN1 35 + #define BTN_EN2 33 + #define BTN_ENC 37 + + #endif // SPARK_FULL_GRAPHICS + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_RAMBO.h b/Marlin/src/pins/pins_RAMBO.h new file mode 100644 index 0000000000..f2ea3d33bd --- /dev/null +++ b/Marlin/src/pins/pins_RAMBO.h @@ -0,0 +1,231 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * IMPORTANT NOTE: + * Rambo users should be sure to compile Marlin using either the RAMBo + * board type if using the Arduino IDE - available via the link below - or + * the 'rambo' environment if using platformio, by specifying '-e rambo' on + * the command line or by changing the value of the 'env_default' variable to + * 'rambo' in the supplied platformio.ini. + * + * If you don't compile using the proper board type, the RAMBo's extended + * pins will likely be unavailable and accessories/addons may not work. + * + * Instructions for installing the Arduino RAMBo board type for the + * Arduino IDE are available at: + * http://reprap.org/wiki/Rambo_firmware + */ + +/** + * Rambo pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Rambo" + +// +// Servos +// +#define SERVO0_PIN 22 // Motor header MX1 +#define SERVO1_PIN 23 // Motor header MX2 +#define SERVO2_PIN 24 // Motor header MX3 +#define SERVO3_PIN 5 // PWM header pin 5 + +// +// Limit Switches +// +#define X_MIN_PIN 12 +#define X_MAX_PIN 24 +#define Y_MIN_PIN 11 +#define Y_MAX_PIN 23 +#define Z_MIN_PIN 10 +#define Z_MAX_PIN 30 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 30 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 48 +#define X_ENABLE_PIN 29 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 49 +#define Y_ENABLE_PIN 28 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 42 +#define E1_ENABLE_PIN 25 + +// Microstepping pins - Mapping not from fastio.h (?) +#define X_MS1_PIN 40 +#define X_MS2_PIN 41 +#define Y_MS1_PIN 69 +#define Y_MS2_PIN 39 +#define Z_MS1_PIN 68 +#define Z_MS2_PIN 67 +#define E0_MS1_PIN 65 +#define E0_MS2_PIN 66 +#define E1_MS1_PIN 63 +#define E1_MS2_PIN 64 + +#define DIGIPOTSS_PIN 38 +#define DIGIPOT_CHANNELS { 4,5,3,0,1 } // X Y Z E0 E1 digipot channels to stepper driver mapping +#ifndef DIGIPOT_MOTOR_CURRENT + #define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 7 +#define HEATER_2_PIN 6 +#define HEATER_BED_PIN 3 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif +#define FAN1_PIN 6 +#define FAN2_PIN 2 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 4 +#define CASE_LIGHT_PIN 46 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 3 // Analog Input +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 45 // MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 31 // Pin should have a pullup! +#define SPINDLE_DIR_PIN 32 + +// +// Průša i3 MK2 Multiplexer Support +// +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 +#define E_MUX2_PIN 84 // 84 in MK2 Firmware + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #define KILL_PIN 80 + + #if ENABLED(NEWPANEL) + + #define LCD_PINS_RS 70 + #define LCD_PINS_ENABLE 71 + #define LCD_PINS_D4 72 + #define LCD_PINS_D5 73 + #define LCD_PINS_D6 74 + #define LCD_PINS_D7 75 + + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define BEEPER_PIN 44 + // NB: Panucatt's Viki 2.0 wiring diagram (v1.2) indicates that the + // beeper/buzzer is connected to pin 33; however, the pin used in the + // diagram is actually pin 44, so this is correct. + + #define DOGLCD_A0 70 + #define DOGLCD_CS 71 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 85 + #define BTN_EN2 84 + #define BTN_ENC 83 + + #define SD_DETECT_PIN -1 // Pin 72 if using easy adapter board + + #define STAT_LED_RED_PIN 22 + #define STAT_LED_BLUE_PIN 32 + + #else // !VIKI2 && !miniVIKI + + #define BEEPER_PIN 79 // AUX-4 + + // AUX-2 + #define BTN_EN1 76 + #define BTN_EN2 77 + #define BTN_ENC 78 + + #define SD_DETECT_PIN 81 + + #endif // !VIKI2 && !miniVIKI + + #else // !NEWPANEL - old style panel with shift register + + // No Beeper added + #define BEEPER_PIN 33 + + // buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + + #define LCD_PINS_RS 75 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + + #endif // !NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_RAMPS.h b/Marlin/src/pins/pins_RAMPS.h new file mode 100644 index 0000000000..b8c6233da7 --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS.h @@ -0,0 +1,584 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Arduino Mega with RAMPS v1.4 (or v1.3) pin assignments + * + * Applies to the following boards: + * + * RAMPS_14_EFB (Hotend, Fan, Bed) + * RAMPS_14_EEB (Hotend0, Hotend1, Bed) + * RAMPS_14_EFF (Hotend, Fan0, Fan1) + * RAMPS_14_EEF (Hotend0, Hotend1, Fan) + * RAMPS_14_SF (Spindle, Controller Fan) + * + * RAMPS_13_EFB (Hotend, Fan, Bed) + * RAMPS_13_EEB (Hotend0, Hotend1, Bed) + * RAMPS_13_EFF (Hotend, Fan0, Fan1) + * RAMPS_13_EEF (Hotend0, Hotend1, Fan) + * RAMPS_13_SF (Spindle, Controller Fan) + * + * Other pins_MYBOARD.h files may override these defaults + * + * Differences between + * RAMPS_13 | RAMPS_14 + * 7 | 11 + */ + +#if ENABLED(TARGET_LPC1768) + #error "Oops! Set MOTHERBOARD to an LPC1768-based board when building for LPC1768." +#elif defined(__STM32F1__) + #error "Oops! Set MOTHERBOARD to an STM32F1-based board when building for STM32F1." +#endif + +#if DISABLED(IS_RAMPS_SMART) && DISABLED(IS_RAMPS_DUO) && DISABLED(IS_RAMPS4DUE) && DISABLED(TARGET_LPC1768) + #if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." + #endif +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS 1.4" +#endif + +// +// Servos +// +#ifdef IS_RAMPS_13 + #define SERVO0_PIN 7 // RAMPS_13 // Will conflict with BTN_EN2 on LCD_I2C_VIKI +#else + #define SERVO0_PIN 11 +#endif +#define SERVO1_PIN 6 +#define SERVO2_PIN 5 +#ifndef SERVO3_PIN + #define SERVO3_PIN 4 +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 53 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN 49 +#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#ifndef Z_CS_PIN + #define Z_CS_PIN 40 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 42 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 44 +#endif + +/** + * Default pins for TMC software SPI + */ +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI 66 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO 44 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK 64 + #endif +#endif + +#if HAS_DRIVER(TMC2208) + /** + * TMC2208 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial1 + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 + + /** + * Software serial + */ + + #define X_SERIAL_TX_PIN 40 + #define X_SERIAL_RX_PIN 63 + #define X2_SERIAL_TX_PIN -1 + #define X2_SERIAL_RX_PIN -1 + + #define Y_SERIAL_TX_PIN 59 + #define Y_SERIAL_RX_PIN 64 + #define Y2_SERIAL_TX_PIN -1 + #define Y2_SERIAL_RX_PIN -1 + + #define Z_SERIAL_TX_PIN 42 + #define Z_SERIAL_RX_PIN 65 + #define Z2_SERIAL_TX_PIN -1 + #define Z2_SERIAL_RX_PIN -1 + + #define E0_SERIAL_TX_PIN 44 + #define E0_SERIAL_RX_PIN 66 + #define E1_SERIAL_TX_PIN -1 + #define E1_SERIAL_RX_PIN -1 + #define E2_SERIAL_TX_PIN -1 + #define E2_SERIAL_RX_PIN -1 + #define E3_SERIAL_TX_PIN -1 + #define E3_SERIAL_RX_PIN -1 + #define E4_SERIAL_TX_PIN -1 + #define E4_SERIAL_RX_PIN -1 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 14 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 66 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS 66 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if DISABLED(IS_RAMPS_EEB) && DISABLED(IS_RAMPS_EEF) && DISABLED(IS_RAMPS_EFB) && DISABLED(IS_RAMPS_EFF) && DISABLED(IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HOTENDS > 1 + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#ifndef MOSFET_D_PIN + #define MOSFET_D_PIN -1 +#endif +#ifndef RAMPS_D8_PIN + #define RAMPS_D8_PIN 8 +#endif +#ifndef RAMPS_D9_PIN + #define RAMPS_D9_PIN 9 +#endif +#ifndef RAMPS_D10_PIN + #define RAMPS_D10_PIN 10 +#endif + +#define HEATER_0_PIN RAMPS_D10_PIN + +#if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan + #define HEATER_1_PIN RAMPS_D9_PIN +#elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define HEATER_1_PIN RAMPS_D9_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan + #define FAN1_PIN RAMPS_D8_PIN +#elif DISABLED(IS_RAMPS_SF) // Not Spindle, Fan (i.e., "EFBF" or "EFBE") + #define HEATER_BED_PIN RAMPS_D8_PIN + #if HOTENDS == 1 + #define FAN1_PIN MOSFET_D_PIN + #else + #define HEATER_1_PIN MOSFET_D_PIN + #endif +#endif + +#ifndef FAN_PIN + #if ENABLED(IS_RAMPS_EFB) || ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #define FAN_PIN RAMPS_D9_PIN + #elif ENABLED(IS_RAMPS_EEF) || ENABLED(IS_RAMPS_SF) // Hotend, Hotend, Fan or Spindle, Fan + #define FAN_PIN RAMPS_D8_PIN + #elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define FAN_PIN 4 // IO pin. Buffer needed + #else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") + #define FAN_PIN RAMPS_D9_PIN + #endif +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 5 // Analog Input on AUX2 +#endif + +// define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 4 +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENABLE_PIN) + #if NUM_SERVOS <= 1 // try to use servo connector first + #define CASE_LIGHT_PIN 6 // MUST BE HARDWARE PWM + #elif !(ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) \ + && (ENABLED(PANEL_ONE) || ENABLED(VIKI2) || ENABLED(miniVIKI) || ENABLED(MINIPANEL) || ENABLED(REPRAPWORLD_KEYPAD))) // try to use AUX 2 + #define CASE_LIGHT_PIN 44 // MUST BE HARDWARE PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #if !defined(NUM_SERVOS) || NUM_SERVOS == 0 // try to use servo connector first + #define SPINDLE_LASER_ENABLE_PIN 4 // Pin should have a pullup/pulldown! + #define SPINDLE_LASER_PWM_PIN 6 // MUST BE HARDWARE PWM + #define SPINDLE_DIR_PIN 5 + #elif !(ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) \ + && (ENABLED(PANEL_ONE) || ENABLED(VIKI2) || ENABLED(miniVIKI) || ENABLED(MINIPANEL) || ENABLED(REPRAPWORLD_KEYPAD))) // try to use AUX 2 + #define SPINDLE_LASER_ENABLE_PIN 40 // Pin should have a pullup/pulldown! + #define SPINDLE_LASER_PWM_PIN 44 // MUST BE HARDWARE PWM + #define SPINDLE_DIR_PIN 65 + #endif +#endif + +// +// Průša i3 MK2 Multiplexer Support +// +#ifndef E_MUX0_PIN + #define E_MUX0_PIN 40 // Z_CS_PIN +#endif +#ifndef E_MUX1_PIN + #define E_MUX1_PIN 42 // E0_CS_PIN +#endif +#ifndef E_MUX2_PIN + #define E_MUX2_PIN 44 // E1_CS_PIN +#endif + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +#if ENABLED(ULTRA_LCD) + + // + // LCD Display output pins + // + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 42 + #define LCD_PINS_D4 65 + #define LCD_PINS_D5 66 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 64 + + #else + + #if ENABLED(CR10_STOCKDISPLAY) + + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 25 + + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 37 + #endif + + #elif ENABLED(ZONESTAR_LCD) + + #define LCD_PINS_RS 64 + #define LCD_PINS_ENABLE 44 + #define LCD_PINS_D4 63 + #define LCD_PINS_D5 40 + #define LCD_PINS_D6 42 + #define LCD_PINS_D7 65 + + #else + + #if ENABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) + #define LCD_PINS_DC 25 // Set as output on init + #define LCD_PINS_RS 27 // Pull low for 1s to init + // DOGM SPI LCD Support + #define DOGLCD_CS 16 + #define DOGLCD_MOSI 17 + #define DOGLCD_SCK 23 + #define DOGLCD_A0 LCD_PINS_DC + #else + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #endif + + #define LCD_PINS_D7 29 + + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + #endif + + #endif + + #if DISABLED(NEWPANEL) + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + + #endif + + // + // LCD Display input pins + // + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #if ENABLED(CR10_STOCKDISPLAY) + #define BTN_EN1 17 + #define BTN_EN2 23 + #else + #define BTN_EN1 31 + #define BTN_EN2 33 + #endif + + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS SDSS + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + #define BTN_ENC -1 + + #define LCD_SDSS SDSS + #define SD_DETECT_PIN 49 + + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define LCD_SCREEN_ROT_180 + + #define BEEPER_PIN 33 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + #define KILL_PIN 31 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + + #define BEEPER_PIN 23 + #define LCD_BACKLIGHT_PIN 33 + + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + + #define LCD_SDSS SDSS + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #elif ENABLED(MKS_MINI_12864) // Added in Marlin 1.1.6 + + #define DOGLCD_A0 27 + #define DOGLCD_CS 25 + + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #define BEEPER_PIN 37 + // not connected to a pin + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 64 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // not connected to a pin + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 64 + + #elif ENABLED(ZONESTAR_LCD) + + #define ADC_KEYPAD_PIN 12 + + #elif ENABLED(AZSMZ_12864) + + // Pins only defined for RAMPS_SMART currently + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // Buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_RAMPS4DUE.h b/Marlin/src/pins/pins_RAMPS4DUE.h new file mode 100644 index 0000000000..5f4cbc4810 --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS4DUE.h @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Arduino Mega or Due with RAMPS4DUE pin assignments + * + * Applies to the following boards: + * + * RAMPS4DUE_EFB (Hotend, Fan, Bed) + * RAMPS4DUE_EEB (Hotend0, Hotend1, Bed) + * RAMPS4DUE_EFF (Hotend, Fan0, Fan1) + * RAMPS4DUE_EEF (Hotend0, Hotend1, Fan) + * RAMPS4DUE_SF (Spindle, Controller Fan) + * + * Differences between + * RAMPS_14 | RAMPS4DUE + * A13 | A9/D63 (shares the same pin with AUX2_4PIN) + * A14 | A10/D64 (shares the same pin with AUX2_5PIN) + * A15 | NC + */ + +#if !defined(__SAM3X8E__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Due' or 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS4DUE" +#endif + +#define IS_RAMPS4DUE +#include "pins_RAMPS.h" + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#define TEMP_0_PIN 9 // Analog Input + +#undef TEMP_1_PIN +#define TEMP_1_PIN -1 // Analog Input + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 10 // Analog Input diff --git a/Marlin/src/pins/ramps/pins_RAMPS_13.h b/Marlin/src/pins/pins_RAMPS_13.h similarity index 79% rename from Marlin/src/pins/ramps/pins_RAMPS_13.h rename to Marlin/src/pins/pins_RAMPS_13.h index 6e7c8cbab5..effce90706 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_13.h +++ b/Marlin/src/pins/pins_RAMPS_13.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Arduino Mega with RAMPS v1.3 pin assignments @@ -31,12 +30,12 @@ * RAMPS_13_EFF (Extruder, Fan, Fan) * RAMPS_13_EEF (Extruder, Extruder, Fan) * RAMPS_13_SF (Spindle, Controller Fan) + * */ -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "RAMPS 1.3" +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS 1.3" #endif #define IS_RAMPS_13 - #include "pins_RAMPS.h" diff --git a/Marlin/src/pins/pins_RAMPS_DUO.h b/Marlin/src/pins/pins_RAMPS_DUO.h new file mode 100644 index 0000000000..f0c0e74da2 --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_DUO.h @@ -0,0 +1,132 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Arduino Mega or Due with RAMPS Duo pin assignments + * + * Applies to the following boards: + * + * RAMPS_DUO_EFB (Hotend, Fan, Bed) + * RAMPS_DUO_EEB (Hotend0, Hotend1, Bed) + * RAMPS_DUO_EFF (Hotend, Fan0, Fan1) + * RAMPS_DUO_EEF (Hotend0, Hotend1, Fan) + * RAMPS_DUO_SF (Spindle, Controller Fan) + * + * Differences between + * RAMPS_14 | RAMPS_DUO + * A9/D63 | A12/D66 + * A10/D64 | A13/D67 + * A11/D65 | A14/D68 + * A12/D66 | A15/D69 + * A13 | A9 + * A14 | A10 + * A15 | A11 + */ + +#if !defined(__SAM3X8E__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Due' or 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS Duo" +#endif + +#define IS_RAMPS_DUO +#include "pins_RAMPS.h" + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#define TEMP_0_PIN 9 // Analog Input + +#undef TEMP_1_PIN +#define TEMP_1_PIN 11 // Analog Input + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 10 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#undef MAX6675_SS +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 69 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS 69 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #undef LCD_PINS_D4 + #define LCD_PINS_D4 68 + + #undef LCD_PINS_D5 + #define LCD_PINS_D5 69 + + #undef LCD_PINS_D7 + #define LCD_PINS_D7 67 + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #undef BTN_EN1 + #define BTN_EN1 67 + + #undef BTN_ENC + #define BTN_ENC 66 + + #elif ENABLED(MINIPANEL) + + #undef DOGLCD_CS + #define DOGLCD_CS 69 + + #undef LCD_BACKLIGHT_PIN + #define LCD_BACKLIGHT_PIN 68 // backlight LED on A14/D68 + + #undef KILL_PIN + #define KILL_PIN 67 + + #undef BTN_EN2 + #define BTN_EN2 66 + + #else + + #if ENABLED(REPRAPWORLD_KEYPAD) + #undef BTN_EN1 + #define BTN_EN1 67 // encoder + + #undef BTN_ENC + #define BTN_ENC 66 // enter button + #elif ENABLED(PANEL_ONE) + #undef BTN_EN2 + #define BTN_EN2 66 // AUX2 PIN 4 + #endif + #endif + + #endif // NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_RAMPS_ENDER_4.h b/Marlin/src/pins/pins_RAMPS_ENDER_4.h new file mode 100755 index 0000000000..a14ace25ba --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_ENDER_4.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "Ender-4 supports only 1 hotend / E-stepper. Comment out this line to continue." +#endif + +#define BOARD_NAME "Ender-4" + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/pins_RAMPS_FD_V1.h b/Marlin/src/pins/pins_RAMPS_FD_V1.h new file mode 100644 index 0000000000..b6266fab83 --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_FD_V1.h @@ -0,0 +1,210 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * RAMPS-FD + * + * No EEPROM + * Use 4k7 thermistor tables + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS-FD" +#endif + +#define INVERTED_HEATER_PINS +#define INVERTED_BED_PINS +#define INVERTED_FAN_PINS + +// +// Servos +// +#define SERVO0_PIN 7 +#define SERVO1_PIN 6 +#define SERVO2_PIN 5 +#define SERVO3_PIN 3 + +// +// Limit Switches +// +#define X_MIN_PIN 22 +#define X_MAX_PIN 30 +#define Y_MIN_PIN 24 +#define Y_MAX_PIN 38 +#define Z_MIN_PIN 26 +#define Z_MAX_PIN 34 + +// +// Steppers +// +#define X_STEP_PIN 63 +#define X_DIR_PIN 62 +#define X_ENABLE_PIN 48 +#ifndef X_CS_PIN + #define X_CS_PIN 68 +#endif + +#define Y_STEP_PIN 65 +#define Y_DIR_PIN 64 +#define Y_ENABLE_PIN 46 +#ifndef Y_CS_PIN + #define Y_CS_PIN 60 +#endif + +#define Z_STEP_PIN 67 +#define Z_DIR_PIN 66 +#define Z_ENABLE_PIN 44 +#ifndef Z_CS_PIN + #define Z_CS_PIN 58 +#endif + +#define E0_STEP_PIN 36 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 42 +#ifndef E0_CS_PIN + #define E0_CS_PIN 67 +#endif + +#define E1_STEP_PIN 43 +#define E1_DIR_PIN 41 +#define E1_ENABLE_PIN 39 +#ifndef E1_CS_PIN + #define E1_CS_PIN 61 +#endif + +#define E2_STEP_PIN 32 +#define E2_DIR_PIN 47 +#define E2_ENABLE_PIN 45 +#ifndef E2_CS_PIN + #define E2_CS_PIN 59 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_1_PIN 2 // Analog Input +#define TEMP_2_PIN 3 // Analog Input +#define TEMP_3_PIN -1 // fewer compiler warnings +#define TEMP_4_PIN -1 // fewer compiler warnings +#define TEMP_BED_PIN 0 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 53 +#else + #define MAX6675_SS 49 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 10 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 8 + +#ifndef FAN_PIN + #define FAN_PIN 12 +#endif +#define CONTROLLER_FAN_PIN -1 + +// +// Misc. Functions +// +#define SDSS 4 +#define LED_PIN 13 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + // ramps-fd lcd adaptor + + #define BEEPER_PIN 37 + #define BTN_EN1 33 + #define BTN_EN2 31 + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + + #if ENABLED(NEWPANEL) + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + #endif + + #if ENABLED(MINIPANEL) + #define DOGLCD_CS 25 + #define DOGLCD_A0 27 + #endif + + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define DOGLCD_A0 16 + #define KILL_PIN 51 + #define STAT_LED_BLUE_PIN 29 + #define STAT_LED_RED_PIN 23 + #define DOGLCD_CS 17 + #define DOGLCD_SCK 76 //SCK_PIN - required so that the DUE hardware SPI will be used + #define DOGLCD_MOSI 75 //MOSI_PIN - required so that the DUE hardware SPI will be used + #define DOGLCD_MISO 74 //MISO_PIN + #endif + + +#endif // ULTRA_LCD + +#if HAS_DRIVER(TMC2208) + /** + * TMC2208 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial1 + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #if HOTENDS < 3 + #define SPINDLE_LASER_ENABLE_PIN 45 // Use E2 ENA + #define SPINDLE_LASER_PWM_PIN 12 // MUST BE HARDWARE PWM + #define SPINDLE_DIR_PIN 47 // Use E2 DIR + #endif +#endif diff --git a/Marlin/src/pins/pins_RAMPS_FD_V2.h b/Marlin/src/pins/pins_RAMPS_FD_V2.h new file mode 100644 index 0000000000..9fa9750c18 --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_FD_V2.h @@ -0,0 +1,47 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * RAMPS-FD v2 + * + * EEPROM supported + * Use 1k thermistor tables + */ + +#define BOARD_NAME "RAMPS-FD v2" + +#include "pins_RAMPS_FD_V1.h" + +#undef INVERTED_HEATER_PINS +#undef INVERTED_BED_PINS +#undef INVERTED_FAN_PINS + +#define I2C_EEPROM +#define E2END 0xFFFF // 64K in a 24C512 + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 5 // Analog Input on AUX2 +#endif diff --git a/Marlin/src/pins/pins_RAMPS_OLD.h b/Marlin/src/pins/pins_RAMPS_OLD.h new file mode 100644 index 0000000000..da047e2b0a --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_OLD.h @@ -0,0 +1,115 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Arduino Mega with RAMPS v1.0, v1.1, v1.2 pin assignments + */ + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "MEGA/RAMPS <1.2" + +// Uncomment the following line for RAMPS v1.0 +//#define RAMPS_V_1_0 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#define X_MAX_PIN 2 +#define Y_MIN_PIN 16 +#define Y_MAX_PIN 17 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 +#endif + +// +// Steppers +// +#define X_STEP_PIN 26 +#define X_DIR_PIN 28 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 38 +#define Y_DIR_PIN 40 +#define Y_ENABLE_PIN 36 + +#define Z_STEP_PIN 44 +#define Z_DIR_PIN 46 +#define Z_ENABLE_PIN 42 + +#define E0_STEP_PIN 32 +#define E0_DIR_PIN 34 +#define E0_ENABLE_PIN 30 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 2 // Analog Input +#define TEMP_BED_PIN 1 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 66 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS 66 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// Heaters / Fans +// +#if ENABLED(RAMPS_V_1_0) + #define HEATER_0_PIN 12 + #define HEATER_BED_PIN -1 + #ifndef FAN_PIN + #define FAN_PIN 11 + #endif +#else // RAMPS_V_1_1 or RAMPS_V_1_2 + #define HEATER_0_PIN 10 + #define HEATER_BED_PIN 8 + #ifndef FAN_PIN + #define FAN_PIN 9 + #endif +#endif + +// +// Misc. Functions +// +#define SDPOWER 48 +#define SDSS 53 +#define LED_PIN 13 +#define CASE_LIGHT_PIN 45 // MUST BE HARDWARE PWM + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENABLE_PIN 41 // Pin should have a pullup/pulldown! +#define SPINDLE_LASER_PWM_PIN 45 // MUST BE HARDWARE PWM +#define SPINDLE_DIR_PIN 43 diff --git a/Marlin/src/pins/pins_RAMPS_PLUS.h b/Marlin/src/pins/pins_RAMPS_PLUS.h new file mode 100644 index 0000000000..77e0e140c0 --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_PLUS.h @@ -0,0 +1,87 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Arduino Mega with RAMPS v1.4Plus, also known as 3DYMY version, pin assignments + * The differences to the RAMPS v1.4 are: + * - Swap heater E0 with E1 + * - Swap pins 8 and 10. Bed/Fan/Hotend as labeled on the board are on pins 8/9/10. + * - Change pins 16->42, 17->44 and 29->53 used for display. + * + * Applies to the following boards: + * + * RAMPS_PLUS_EFB (Extruder, Fan, Bed) + * RAMPS_PLUS_EEB (Extruder, Extruder, Bed) + * RAMPS_PLUS_EFF (Extruder, Fan, Fan) + * RAMPS_PLUS_EEF (Extruder, Extruder, Fan) + * RAMPS_PLUS_SF (Spindle, Controller Fan) + * + */ + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS 1.4 Plus" +#endif + +#define RAMPS_D8_PIN 10 +#define RAMPS_D10_PIN 8 + +#include "pins_RAMPS.h" + +// +// Steppers - Swap E0 / E1 on 3DYMY +// +#undef E0_STEP_PIN +#undef E0_DIR_PIN +#undef E0_ENABLE_PIN + +#undef E1_STEP_PIN +#undef E1_DIR_PIN +#undef E1_ENABLE_PIN + +#define E0_STEP_PIN 36 +#define E0_DIR_PIN 34 +#define E0_ENABLE_PIN 30 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 28 +#define E1_ENABLE_PIN 24 + +#undef X_CS_PIN +#undef Y_CS_PIN +#undef Z_CS_PIN +#undef E0_CS_PIN +#undef E1_CS_PIN + +#if ENABLED(ULTRA_LCD) && DISABLED(REPRAPWORLD_GRAPHICAL_LCD) && (DISABLED(NEWPANEL) || DISABLED(PANEL_ONE)) && DISABLED(CR10_STOCKDISPLAY) + #if DISABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) + #undef LCD_PINS_RS + #define LCD_PINS_RS 42 // 3DYMY boards pin 16 -> 42 + #undef LCD_PINS_ENABLE + #define LCD_PINS_ENABLE 44 // 3DYMY boards pin 17 -> 44 + #endif + #undef LCD_PINS_D7 + #define LCD_PINS_D7 53 // 3DYMY boards pin 29 -> 53 +#endif diff --git a/Marlin/src/pins/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/pins_RAMPS_RE_ARM.h new file mode 100644 index 0000000000..6f0c604ffb --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_RE_ARM.h @@ -0,0 +1,421 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Re-ARM with RAMPS v1.4 pin assignments + * + * Applies to the following boards: + * + * RAMPS_14_EFB (Hotend, Fan, Bed) + * RAMPS_14_EEB (Hotend0, Hotend1, Bed) + * RAMPS_14_EFF (Hotend, Fan0, Fan1) + * RAMPS_14_EEF (Hotend0, Hotend1, Fan) + * RAMPS_14_SF (Spindle, Controller Fan) + * + */ + +// numbers in parenthesis () are the mega2560 equivalent pin numbers + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Re-ARM RAMPS 1.4" +#endif + +// +// Servos +// +#define SERVO0_PIN P1_20 // (11) +#define SERVO1_PIN P1_21 // ( 6) also on J5-1 +#define SERVO2_PIN P1_19 // ( 5) +#define SERVO3_PIN P1_18 // ( 4) 5V output + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // ( 3) 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // ( 2) 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // (14) 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // (15) 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_29 // (18) 10k pullup to 3.3V, 1K series +#define Z_MAX_PIN P1_28 // (19) 10k pullup to 3.3V, 1K series + +// +// Steppers +// +#define X_STEP_PIN P2_01 // (54) +#define X_DIR_PIN P0_11 // (55) +#define X_ENABLE_PIN P0_10 // (38) +#ifndef X_CS_PIN + #define X_CS_PIN P1_01 // ETH +#endif + +#define Y_STEP_PIN P2_02 // (60) +#define Y_DIR_PIN P0_20 // (61) +#define Y_ENABLE_PIN P0_19 // (56) +#ifndef Y_CS_PIN + #define Y_CS_PIN P1_04 // ETH +#endif + +#define Z_STEP_PIN P2_03 // (46) +#define Z_DIR_PIN P0_22 // (48) +#define Z_ENABLE_PIN P0_21 // (62) +#ifndef Z_CS_PIN + #define Z_CS_PIN P1_10 // ETH +#endif + +#define E0_STEP_PIN P2_00 // (26) +#define E0_DIR_PIN P0_05 // (28) +#define E0_ENABLE_PIN P0_04 // (24) +#ifndef E0_CS_PIN + #define E0_CS_PIN P1_14 // ETH +#endif + +#define E1_STEP_PIN P2_08 // (36) +#define E1_DIR_PIN P2_13 // (34) +#define E1_ENABLE_PIN P4_29 // (30) +#ifndef E1_CS_PIN + #define E1_CS_PIN -1 +#endif + +//#define E2_STEP_PIN P2_08 // (36) +//#define E2_DIR_PIN P2_13 // (34) +//#define E2_ENABLE_PIN P4_29 // (30) +//#ifndef E2_CS_PIN +// #define E2_CS_PIN -1 +//#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #define TMC_SW_MOSI P1_00 // ETH + #define TMC_SW_MISO P1_08 // ETH + #define TMC_SW_SCK P1_09 // ETH +#endif + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // A0 (T0) - (67) - TEMP_0_PIN +#define TEMP_BED_PIN 1 // A1 (T1) - (68) - TEMP_BED_PIN +#define TEMP_1_PIN 2 // A2 (T2) - (69) - TEMP_1_PIN +#define TEMP_2_PIN 3 // A3 - (63) - J5-3 & AUX-2 +#define TEMP_3_PIN 4 // A4 - (37) - BUZZER_PIN +//#define TEMP_4_PIN 5 // A5 - (49) - SD_DETECT_PIN +//#define ?? 6 // A6 - ( 0) - RXD0 - J4-4 & AUX-1 +#define FILWIDTH_PIN 7 // A7 - ( 1) - TXD0 - J4-5 & AUX-1 + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if DISABLED(IS_RAMPS_EEB) && DISABLED(IS_RAMPS_EEF) && DISABLED(IS_RAMPS_EFB) && DISABLED(IS_RAMPS_EFF) && DISABLED(IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HOTENDS > 1 + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#ifndef MOSFET_D_PIN + #define MOSFET_D_PIN -1 +#endif +#ifndef RAMPS_D8_PIN + #define RAMPS_D8_PIN P2_07 // (8) +#endif +#ifndef RAMPS_D9_PIN + #define RAMPS_D9_PIN P2_04 // (9) +#endif +#ifndef RAMPS_D10_PIN + #define RAMPS_D10_PIN P2_05 // (10) +#endif + +#define HEATER_0_PIN RAMPS_D10_PIN + +#if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan + #define HEATER_1_PIN RAMPS_D9_PIN +#elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define HEATER_1_PIN RAMPS_D9_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan + #define FAN1_PIN RAMPS_D8_PIN +#elif DISABLED(IS_RAMPS_SF) // Not Spindle, Fan (i.e., "EFBF" or "EFBE") + #define HEATER_BED_PIN RAMPS_D8_PIN + #if HOTENDS == 1 + #define FAN1_PIN MOSFET_D_PIN + #else + #define HEATER_1_PIN MOSFET_D_PIN + #endif +#endif + +#ifndef FAN_PIN + #if ENABLED(IS_RAMPS_EFB) || ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #define FAN_PIN RAMPS_D9_PIN + #elif ENABLED(IS_RAMPS_EEF) || ENABLED(IS_RAMPS_SF) // Hotend, Hotend, Fan or Spindle, Fan + #define FAN_PIN RAMPS_D8_PIN + #elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define FAN_PIN P1_18 // (4) IO pin. Buffer needed + #else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") + #define FAN_PIN RAMPS_D9_PIN + #endif +#endif + +// +// Misc. Functions +// +#define LED_PIN P4_28 // (13) +#define SDSS P1_23 // (53) + +// define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN P1_18 // (4) +#endif + +#define PS_ON_PIN P2_12 // (12) + +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENABLE_PIN) + #if !defined(NUM_SERVOS) || NUM_SERVOS < 4 // try to use servo connector + #define CASE_LIGHT_PIN P1_18 // (4) MUST BE HARDWARE PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #if !defined(NUM_SERVOS) || NUM_SERVOS == 1 // must use servo connector + #undef SERVO1 + #undef SERVO2 + #undef SERVO3 + #define SPINDLE_LASER_ENABLE_PIN P1_21 // (6) Pin should have a pullup/pulldown! + #define SPINDLE_LASER_PWM_PIN P1_18 // (4) MUST BE HARDWARE PWM + #define SPINDLE_DIR_PIN P1_19 // (5) + #endif +#endif + +// +// Průša i3 MK2 Multiplexer Support +// +#if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + #define E_MUX0_PIN P0_03 // ( 0) Z_CS_PIN + #define E_MUX1_PIN P0_02 // ( 1) E0_CS_PIN +#endif +#define E_MUX2_PIN P0_26 // (63) E1_CS_PIN + +/** + * LCD / Controller + * + * All controllers can use J3 and J5 on the Re-ARM board. Custom cabling will be required. + */ + +/** + * Smart LCD adapter + * + * The Smart LCD adapter can be used for the two 10 pin LCD controllers such as + * REPRAP_DISCOUNT_SMART_CONTROLLER. It can't be used for controllers that use + * DOGLCD_A0, DOGLCD_CS, LCD_PINS_D5, LCD_PINS_D6 or LCD_PINS_D7. A custom cable + * is needed to pick up 5V for the EXP1 connection. + * + * SD card on the LCD uses the same SPI signals as the LCD. This results in garbage/lines + * on the LCD display during accesses of the SD card. The menus/code has been arranged so + * that the garbage/lines are erased immediately after the SD card accesses are completed. + */ + +#if ENABLED(ULTRA_LCD) + + #if ENABLED(CR10_STOCKDISPLAY) + + // Re-Arm can support Creality stock display without SD card reader and single cable on EXP3. + // Re-Arm J3 pins 1 (p1.31) & 2 (P3.26) are not used. Stock cable will need to have one + // 10-pin IDC connector trimmed or replaced with a 12-pin IDC connector to fit J3. + // Requires REVERSE_ENCODER_DIRECTION in Configuration.h + + #define BEEPER_PIN P2_11 // J3-3 & AUX-4 + + #define BTN_EN1 P0_16 // J3-7 & AUX-4 + #define BTN_EN2 P1_23 // J3-5 & AUX-4 + #define BTN_ENC P3_25 // J3-4 & AUX-4 + + #define LCD_PINS_RS P0_15 // J3-9 & AUX-4 (CS) + #define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI) + #define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK) + + #else + + #define BEEPER_PIN P1_30 // (37) not 5V tolerant + + #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 + #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 + #define BTN_ENC P2_11 // (35) J3-3 & AUX-4 + + #define SD_DETECT_PIN P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 + #define LCD_PINS_RS P0_16 // (16) J3-7 & AUX-4 + #define LCD_SDSS P0_16 // (16) J3-7 & AUX-4 + + #if ENABLED(NEWPANEL) + #if ENABLED(REPRAPWORLD_KEYPAD) + #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 + #define SHIFT_LD P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #endif + #else + //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 + //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 + //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 + //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4 + #endif + + #if ENABLED(VIKI2) || ENABLED(miniVIKI) + // #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 + #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 + #define BTN_ENC P2_11 // (35) J3-3 & AUX-4 + + #define SD_DETECT_PIN P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 + + #define DOGLCD_CS P0_16 // (16) + #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 + #define DOGLCD_SCK SCK_PIN + #define DOGLCD_MOSI MOSI_PIN + + #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes + #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes + #else + #define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2 + #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 + #define LCD_BACKLIGHT_PIN P0_16 // (16) J3-7 & AUX-4 - only used on DOGLCD controllers + #define LCD_PINS_ENABLE P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define LCD_PINS_D4 P0_15 // (52) (SCK) J3-9 & AUX-3 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO + #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER + #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 + #endif + #endif + + //#define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 + //#define MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 + //#define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 + //#define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 - sometimes called SDSS + + #if ENABLED(MINIPANEL) + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + #endif + + #endif + +#endif // ULTRA_LCD + +// +// Ethernet pins +// +#if DISABLED(ULTIPANEL) + #define ENET_MDIO P1_17 // (71) J12-4 + #define ENET_RX_ER P1_14 // (73) J12-6 + #define ENET_RXD1 P1_10 // (75) J12-8 +#endif +#define ENET_MOC P1_16 // (70) J12-3 +#define REF_CLK P1_15 // (72) J12-5 +#define ENET_RXD0 P1_09 // (74) J12-7 +#define ENET_CRS P1_08 // (76) J12-9 +#define ENET_TX_EN P1_04 // (77) J12-10 +#define ENET_TXD0 P1_00 // (78) J12-11 +#define ENET_TXD1 P1_01 // (79) J12-12 + +/** + * Fast PWMS + * + * The LPC1768's hardware PWM controller has 6 channels. Each channel + * can be setup to either control a dedicated pin directly or to generate + * an interrupt. The direct method's duty cycle is accurate to within a + * a microsecond. The interrupt method's average duty cycle has the + * the same accuracy but the individual cycles can vary because of higher + * priority interrupts. + * + * All Fast PWMs have a 50Hz rate. + * + * The following pins/signals use the direct method. All other pins use the + * the interrupt method. Note that SERVO2_PIN and RAMPS_D8_PIN use the + * interrupt method. + * P1_20 (11) SERVO0_PIN + * P1_21 ( 6) SERVO1_PIN J5-1 + * P0_18 ( 4) SERVO3_PIN 5V output + * *P2_04 ( 9) RAMPS_D9_PIN + * *P2_05 (10) RAMPS_D10_PIN + * + * * - If used as a heater driver then a Fast PWM is NOT assigned. If used as + * a fan driver then enabling FAST_PWM_FAN assigns a Fast PWM to it. + */ + + /** + * special pins + * P1_30 (37) - not 5V tolerant + * P1_31 (49) - not 5V tolerant + * P0_27 (57) - open collector + * P0_28 (58) - open collector + * + */ + +/** + * The following mega2560 pins are NOT available in a Re-ARM system + * 7 + * 17 + * 22 + * 23 + * 25 + * 27 + * 29 + * 32 + * 39 + * 40 + * 42 + * 43 + * 44 + * 45 + * 47 + * 64 + * 65 + * 66 + */ diff --git a/Marlin/src/pins/pins_RAMPS_SMART.h b/Marlin/src/pins/pins_RAMPS_SMART.h new file mode 100644 index 0000000000..6de539cd3f --- /dev/null +++ b/Marlin/src/pins/pins_RAMPS_SMART.h @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Arduino Due with RAMPS-SMART pin assignments + * + * Applies to the following boards: + * + * RAMPS_SMART_EFB (Hotend, Fan, Bed) + * RAMPS_SMART_EEB (Hotend0, Hotend1, Bed) + * RAMPS_SMART_EFF (Hotend, Fan0, Fan1) + * RAMPS_SMART_EEF (Hotend0, Hotend1, Fan) + * RAMPS_SMART_SF (Spindle, Controller Fan) + * + * Differences between + * RAMPS_14 | RAMPS-SMART + * NONE | D16 (Additional AUX-3 pin(AUX3_2PIN), shares the same pin with AUX4_18PIN) + * NONE | D17 (Additional AUX-3 pin(AUX3_1PIN), shares the same pin with AUX4_17PIN) + * D0 | NONE + * D1 | NONE + * A3/D57 | NONE + * A4/D58 | NONE + * A5/D59 | A3/D57 + * A9/D63 | A4/D58 + * A10/D64 | A5/D59 + * A11/D65 | D66 + * A12/D66 | D67 + * A13 | A9 + * A14 | A10 + * A15 | A11 + * + * + * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER works fine connected to AUX-4 with + * Smart Adapter, but requires removing the AUX3 pin header on the adapter to fit. + * To use the SD card reader, wire its pins to AUX-3 (and use Software SPI). + * + * To use Hardware SPI for SD, the SDSS pin must be set to 52 instead of 53. + * Hardware SPI also requires additional wiring because the board doesn't pass + * the 6-pin SPI header from the DUE board. + * (Search the web for "Arduino DUE Board Pinout" to see the correct header.) + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RAMPS-SMART" +#endif + +#define IS_RAMPS_SMART +#include "pins_RAMPS.h" + +// I2C EEPROM with 4K of space +#define I2C_EEPROM +#define E2END 0xFFF + +#define RESET_PIN 42 // Resets the board if the jumper is attached + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#define TEMP_0_PIN 9 // Analog Input + +#undef TEMP_1_PIN +#define TEMP_1_PIN 10 // Analog Input + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 11 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #undef MAX6675_SS + #define MAX6675_SS 67 // Do not use pin 53 if there is even the remote possibility of using Display/SD card +#else + #undef MAX6675_SS + #define MAX6675_SS 67 // Do not use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// LCD / Controller +// +// Support for AZSMZ 12864 LCD with SD Card 3D printer smart controller control panel +#if ENABLED(AZSMZ_12864) + #define BEEPER_PIN 66 // Smart RAMPS 1.42 pinout diagram on RepRap WIKI erroneously says this should be pin 65 + #define DOGLCD_A0 59 + #define DOGLCD_CS 44 + #define BTN_EN1 58 + #define BTN_EN2 40 + #define BTN_ENC 67 // Smart RAMPS 1.42 pinout diagram on RepRap WIKI erroneously says this should be pin 66 + #define SD_DETECT_PIN 49 // Pin 49 for display sd interface, 72 for easy adapter board + #define KILL_PIN 42 +#endif diff --git a/Marlin/src/pins/pins_RIGIDBOARD.h b/Marlin/src/pins/pins_RIGIDBOARD.h new file mode 100644 index 0000000000..e985963505 --- /dev/null +++ b/Marlin/src/pins/pins_RIGIDBOARD.h @@ -0,0 +1,134 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * RIGIDBOARD Arduino Mega with RAMPS v1.4 pin assignments + */ + +#define BOARD_NAME "RigidBoard" + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 // Z-MAX pin J14 End Stops +#endif + +// +// MOSFET changes +// +#define RAMPS_D10_PIN 9 // EXTRUDER 1 +#define MOSFET_D_PIN 12 // EXTRUDER 2 or FAN + +#include "pins_RAMPS.h" + +// +// Steppers +// +// RigidBot swaps E0 / E1 plugs vs RAMPS 1.3 +#undef E0_STEP_PIN +#undef E0_DIR_PIN +#undef E0_ENABLE_PIN +#define E0_STEP_PIN 36 +#define E0_DIR_PIN 34 +#define E0_ENABLE_PIN 30 + +#undef E1_STEP_PIN +#undef E1_DIR_PIN +#undef E1_ENABLE_PIN +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 28 +#define E1_ENABLE_PIN 24 + +#define STEPPER_RESET_PIN 41 // Stepper drivers have a reset on RigidBot + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#undef TEMP_1_PIN +#undef TEMP_BED_PIN +#define TEMP_0_PIN 14 // Analog Input +#define TEMP_1_PIN 13 // Analog Input +#define TEMP_BED_PIN 15 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#undef MAX6675_SS +#if DISABLED(SDSUPPORT) + #define MAX6675_SS 53 // Don't use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS 49 // Don't use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// Heaters / Fans +// +#undef HEATER_BED_PIN +#define HEATER_BED_PIN 10 + +#ifndef FAN_PIN + #define FAN_PIN 8 // Same as RAMPS_13_EEF +#endif + +// +// Misc. Functions +// +#undef PS_ON_PIN +#define PS_ON_PIN -1 + +// +// LCD / Controller +// +// LCD Panel options for the RigidBoard +#if ENABLED(RIGIDBOT_PANEL) + + #undef BEEPER_PIN + #define BEEPER_PIN -1 + + // Direction buttons + #define BTN_UP 37 + #define BTN_DWN 35 + #define BTN_LFT 33 + #define BTN_RT 32 + + // 'R' button + #undef BTN_ENC + #define BTN_ENC 31 + + // Disable encoder + #undef BTN_EN1 + #define BTN_EN1 -1 + #undef BTN_EN2 + #define BTN_EN2 -1 + + #undef SD_DETECT_PIN + #define SD_DETECT_PIN 22 + +#elif ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #undef SD_DETECT_PIN + #define SD_DETECT_PIN 22 + + #undef KILL_PIN + #define KILL_PIN 32 + +#endif diff --git a/Marlin/src/pins/pins_RIGIDBOARD_V2.h b/Marlin/src/pins/pins_RIGIDBOARD_V2.h new file mode 100644 index 0000000000..2075892ab8 --- /dev/null +++ b/Marlin/src/pins/pins_RIGIDBOARD_V2.h @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * RIGIDBOARD V2 Arduino Mega with RAMPS v1.4 pin assignments + */ + +#include "pins_RIGIDBOARD.h" + +#undef BOARD_NAME +#define BOARD_NAME "RigidBoard V2" + +// +// Steppers +// + +// I2C based DAC like on the Printrboard REVF +#define DAC_STEPPER_CURRENT + +// Channels available for DAC, For Rigidboard there are 4 +#define DAC_STEPPER_ORDER { 0, 1, 2, 3 } + +#define DAC_STEPPER_SENSE 0.05 // sense resistors on rigidboard stepper chips are .05 value +#define DAC_STEPPER_ADDRESS 0 +#define DAC_STEPPER_MAX 4096 // was 5000 but max allowable value is actually 4096 +#define DAC_STEPPER_VREF 1 // internal Vref, gain 2x = 4.096V +#define DAC_STEPPER_GAIN 1 // value of 1 here sets gain of 2 +#define DAC_DISABLE_PIN 42 // set low to enable DAC +#define DAC_OR_ADDRESS 0x01 + +#ifndef DAC_MOTOR_CURRENT_DEFAULT + #define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis +#endif diff --git a/Marlin/src/pins/pins_RUMBA.h b/Marlin/src/pins/pins_RUMBA.h new file mode 100644 index 0000000000..160dae55b8 --- /dev/null +++ b/Marlin/src/pins/pins_RUMBA.h @@ -0,0 +1,178 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * RUMBA pin assignments + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#if HOTENDS > 3 || E_STEPPERS > 3 + #error "RUMBA supports up to 3 hotends / E-steppers. Comment out this line to continue." +#endif + +#define DEFAULT_MACHINE_NAME "Rumba" +#define BOARD_NAME "Rumba" + +// +// Servos +// +#define SERVO0_PIN 5 + +// +// Limit Switches +// +#define X_MIN_PIN 37 +#define X_MAX_PIN 36 +#define Y_MIN_PIN 35 +#define Y_MAX_PIN 34 +#define Z_MIN_PIN 33 +#define Z_MAX_PIN 32 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 17 +#define X_DIR_PIN 16 +#define X_ENABLE_PIN 48 + +#define Y_STEP_PIN 54 +#define Y_DIR_PIN 47 +#define Y_ENABLE_PIN 55 + +#define Z_STEP_PIN 57 +#define Z_DIR_PIN 56 +#define Z_ENABLE_PIN 62 + +#define E0_STEP_PIN 23 +#define E0_DIR_PIN 22 +#define E0_ENABLE_PIN 24 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 25 +#define E1_ENABLE_PIN 27 + +#define E2_STEP_PIN 29 +#define E2_DIR_PIN 28 +#define E2_ENABLE_PIN 39 + +// +// Temperature Sensors +// +#if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 6 // Analog Input (connector *K1* on RUMBA thermocouple ADD ON is used) +#else + #define TEMP_0_PIN 15 // Analog Input (default connector for thermistor *T0* on rumba board is used) +#endif + +#if TEMP_SENSOR_1 == -1 + #define TEMP_1_PIN 5 // Analog Input (connector *K2* on RUMBA thermocouple ADD ON is used) +#else + #define TEMP_1_PIN 14 // Analog Input (default connector for thermistor *T1* on rumba board is used) +#endif + +#if TEMP_SENSOR_2 == -1 + #define TEMP_2_PIN 7 // Analog Input (connector *K3* on RUMBA thermocouple ADD ON is used <-- this can't be used when TEMP_SENSOR_BED is defined as thermocouple) +#else + #define TEMP_2_PIN 13 // Analog Input (default connector for thermistor *T2* on rumba board is used) +#endif + +// optional for extruder 4 or chamber: +//#define TEMP_X_PIN 12 // Analog Input (default connector for thermistor *T3* on rumba board is used) +//#define TEMP_CHAMBER_PIN 12 // Analog Input (default connector for thermistor *T3* on rumba board is used) + +#if TEMP_SENSOR_BED == -1 + #define TEMP_BED_PIN 7 // Analog Input (connector *K3* on RUMBA thermocouple ADD ON is used <-- this can't be used when TEMP_SENSOR_2 is defined as thermocouple) +#else + #define TEMP_BED_PIN 11 // Analog Input (default connector for thermistor *THB* on rumba board is used) +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_2_PIN 6 +#define HEATER_3_PIN 8 +#define HEATER_BED_PIN 9 + +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif +#define FAN1_PIN 8 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 45 +#define KILL_PIN 46 +#define CASE_LIGHT_PIN 45 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#ifndef SPINDLE_LASER_PWM_PIN + #define SPINDLE_LASER_PWM_PIN 4 // MUST BE HARDWARE PWM. Pin 4 interrupts OC0* and OC1* always in use? +#endif +#ifndef SPINDLE_LASER_ENABLE_PIN + #define SPINDLE_LASER_ENABLE_PIN 14 // Pin should have a pullup! +#endif +#ifndef SPINDLE_DIR_PIN + #define SPINDLE_DIR_PIN 15 +#endif + +// +// LCD / Controller +// +#define SD_DETECT_PIN 49 +#define BEEPER_PIN 44 +#define LCD_PINS_D7 40 +#define BTN_EN1 11 +#define BTN_EN2 12 +#define BTN_ENC 43 + +#if ENABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) + #define LCD_PINS_DC 38 // Set as output on init + #define LCD_PINS_RS 41 // Pull low for 1s to init + // DOGM SPI LCD Support + #define DOGLCD_CS 19 + #define DOGLCD_MOSI 42 + #define DOGLCD_SCK 18 + #define DOGLCD_A0 LCD_PINS_DC +#else + #define LCD_PINS_RS 19 + #define LCD_PINS_ENABLE 42 + #define LCD_PINS_D4 18 + #define LCD_PINS_D5 38 + #define LCD_PINS_D6 41 +#endif diff --git a/Marlin/src/pins/pins_RURAMPS4D_11.h b/Marlin/src/pins/pins_RURAMPS4D_11.h new file mode 100644 index 0000000000..d05b74b04c --- /dev/null +++ b/Marlin/src/pins/pins_RURAMPS4D_11.h @@ -0,0 +1,259 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Ported sys0724 & Vynt + */ + +/** + * Arduino Mega? or Due with RuRAMPS4DUE pin assignments + * + * Applies to the following boards: + * RURAMPS4DUE (Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) + * + * Differences between + * RADDS | RuRAMPS4DUE + * | + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RuRAMPS4Due v1.1" +#endif + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 3 + +// +// Limit Switches +// +#define X_MIN_PIN 45 +#define X_MAX_PIN 39 +#define Y_MIN_PIN 46 +#define Y_MAX_PIN 41 +#define Z_MIN_PIN 47 +#define Z_MAX_PIN 43 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 43 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 // Support Extension Board +#define X_DIR_PIN 36 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN -1 +#endif + +#define Y_STEP_PIN 32 // Support Extension Board +#define Y_DIR_PIN 35 +#define Y_ENABLE_PIN 34 +#ifndef Y_CS_PIN + #define Y_CS_PIN -1 +#endif + +#define Z_STEP_PIN 30 // Support Extension Board +#define Z_DIR_PIN 2 +#define Z_ENABLE_PIN 33 +#ifndef Z_CS_PIN + #define Z_CS_PIN -1 +#endif + +#define E0_STEP_PIN 29 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 31 +#ifndef E0_CS_PIN + #define E0_CS_PIN -1 +#endif + +#define E1_STEP_PIN 22 +#define E1_DIR_PIN 24 +#define E1_ENABLE_PIN 26 +#ifndef E1_CS_PIN + #define E1_CS_PIN -1 +#endif + +#define E2_STEP_PIN 25 +#define E2_DIR_PIN 23 +#define E2_ENABLE_PIN 27 +#ifndef E2_CS_PIN + #define E2_CS_PIN -1 +#endif + +#define E3_STEP_PIN 15 // Only For Extension Board +#define E3_DIR_PIN 14 +#define E3_ENABLE_PIN 61 +#ifndef E3_CS_PIN + #define E3_CS_PIN -1 +#endif + +// For Future: Microstepping pins - Mapping not from fastio.h (?) +//#define E3_MS1_PIN ? +//#define E3_MS2_PIN ? +//#define E3_MS3_PIN ? +//#define Z2_MS1_PIN ? // shared with E3_MS1_PIN +//#define Z2_MS2_PIN ? // shared with E3_MS2_PIN +//#define Z2_MS3_PIN ? // shared with E3_MS3_PIN + +#if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define Z_MIN_PROBE_PIN 49 +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN Y_MIN_PIN + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 7 // BED H1 + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif +#define FAN1_PIN 8 +#define CONTROLLER_FAN_PIN -1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // ANALOG A0 +#define TEMP_1_PIN 1 // ANALOG A1 +#define TEMP_2_PIN 2 // ANALOG A2 +#define TEMP_3_PIN 3 // ANALOG A2 +#define TEMP_BED_PIN 4 // ANALOG A3 + +// The thermocouple uses Analog pins +#if ENABLED(VER_WITH_THERMOCOUPLE) // Defined in Configuration.h + #define TEMP_4_PIN 5 // A5 + #define TEMP_5_PIN 6 // A6 (Marlin 2.0 not support) +#endif + +// SPI for Max6675 or Max31855 Thermocouple +//#if DISABLED(SDSUPPORT) +// #define MAX6675_SS 53 +//#else +// #define MAX6675_SS 49 +//#endif + +// +// Misc. Functions +// +#define SDSS 4 // 4,10,52 if using HW SPI. +#define LED_PIN -1 // 13 - HEATER_0_PIN +#define PS_ON_PIN -1 // 65 + +// MKS TFT / Nextion Use internal USART-1 +#define TFT_LCD_MODULE_COM 1 +#define TFT_LCD_MODULE_BAUDRATE 115600 + +// ESP WiFi Use internal USART-2 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115600 +#define ESP_WIFI_MODULE_RESET_PIN -1 +#define PIGGY_GPIO_PIN -1 + +// +// EEPROM +// +#define E2END 0x7FFF // 32Kb (24lc256) +#define I2C_EEPROM // EEPROM on I2C-0 +//#define EEPROM_SD // EEPROM on SDCARD +//#define SPI_EEPROM // EEPROM on SPI-0 +//#define SPI_CHAN_EEPROM1 ? +//#define SPI_EEPROM1_CS ? +// 2K EEPROM +//#define SPI_EEPROM2_CS ? +// 32Mb FLASH +//#define SPI_FLASH_CS ? + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(RADDS_DISPLAY) || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 62 + + #define LCD_PINS_RS 63 + #define LCD_PINS_ENABLE 64 + #define LCD_PINS_D4 48 + #define LCD_PINS_D5 50 + #define LCD_PINS_D6 52 + #define LCD_PINS_D7 53 + + #define SD_DETECT_PIN 51 + + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define BEEPER_PIN 62 + + #define LCD_PINS_RS 52 + #define LCD_PINS_ENABLE 53 + #define LCD_PINS_D4 48 + #define LCD_PINS_D5 50 + #define LCD_PINS_D6 52 + #define LCD_PINS_D7 53 + + #define SD_DETECT_PIN 51 + + #elif ENABLED(SSD1306_OLED_I2C_CONTROLLER) + + #define BEEPER_PIN 62 + #define LCD_SDSS 10 + #define SD_DETECT_PIN 51 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + //http://doku.radds.org/dokumentation/other-electronics/sparklcd/ + #error "Oops! SPARK_FULL_GRAPHICS not supported with RURAMPS4D." + //#define LCD_PINS_D4 29//? + //#define LCD_PINS_ENABLE 27//? + //#define LCD_PINS_RS 25//? + //#define BTN_EN1 35//? + //#define BTN_EN2 33//? + //#define BTN_ENC 37//? + + #endif // SPARK_FULL_GRAPHICS + + #if ENABLED(NEWPANEL) + #define BTN_EN1 44 + #define BTN_EN2 42 + #define BTN_ENC 40 + #endif + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_RURAMPS4D_13.h b/Marlin/src/pins/pins_RURAMPS4D_13.h new file mode 100644 index 0000000000..ca80c21132 --- /dev/null +++ b/Marlin/src/pins/pins_RURAMPS4D_13.h @@ -0,0 +1,240 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Ported sys0724 & Vynt + */ + +/** + * Arduino Mega? or Due with RuRAMPS4DUE pin assignments + * + * Applies to the following boards: + * RURAMPS4DUE (Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) + * + * Differences between + * RADDS | RuRAMPS4DUE + * | + */ + +#ifndef __SAM3X8E__ + #error "Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "RuRAMPS4Due v1.3" +#endif + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 3 + +// +// Limit Switches +// +#define X_MIN_PIN 45 +#define X_MAX_PIN 39 +#define Y_MIN_PIN 46 +#define Y_MAX_PIN 41 +#define Z_MIN_PIN 47 +#define Z_MAX_PIN 43 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 49 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 // Support Extension Board +#define X_DIR_PIN 36 +#define X_ENABLE_PIN 31 +#ifndef X_CS_PIN + #define X_CS_PIN 38 +#endif + +#define Y_STEP_PIN 32 // Support Extension Board +#define Y_DIR_PIN 35 +#define Y_ENABLE_PIN 31 +#ifndef Y_CS_PIN + #define Y_CS_PIN 34 +#endif + +#define Z_STEP_PIN 30 // Support Extension Board +#define Z_DIR_PIN 2 +#define Z_ENABLE_PIN 31 +#ifndef Z_CS_PIN + #define Z_CS_PIN 10 +#endif + +#define E0_STEP_PIN 29 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 33 +#ifndef E0_CS_PIN + #define E0_CS_PIN 14 +#endif + +#define E1_STEP_PIN 22 +#define E1_DIR_PIN 24 +#define E1_ENABLE_PIN 26 +#ifndef E1_CS_PIN + #define E1_CS_PIN 15 +#endif + +#define E2_STEP_PIN 25 +#define E2_DIR_PIN 23 +#define E2_ENABLE_PIN 27 +#ifndef E2_CS_PIN + #define E2_CS_PIN 61 +#endif + +#if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define Z_MIN_PROBE_PIN 49 +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN Y_MIN_PIN + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 7 // BED H1 + +#define FAN_PIN 9 +#define FAN1_PIN 8 +#define CONTROLLER_FAN_PIN -1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // ANALOG A0 +#define TEMP_1_PIN 1 // ANALOG A1 +#define TEMP_2_PIN 2 // ANALOG A2 +#define TEMP_3_PIN 3 // ANALOG A2 +#define TEMP_BED_PIN 4 // ANALOG A3 + +// The thermocouple uses Analog pins +#if ENABLED(VER_WITH_THERMOCOUPLE) // Defined in Configuration.h + #define TEMP_4_PIN 5 // A5 + #define TEMP_5_PIN 6 // A6 (Marlin 2.0 not support) +#endif + +// SPI for Max6675 or Max31855 Thermocouple +//#if DISABLED(SDSUPPORT) +// #define MAX6675_SS 53 +//#else +// #define MAX6675_SS 49 +//#endif + +// +// Misc. Functions +// +#define SDSS 4 // 4,10,52 if using HW SPI. +#define LED_PIN -1 // 13 - HEATER_0_PIN +#define PS_ON_PIN -1 // 65 + +// MKS TFT / Nextion Use internal USART-1 +#define TFT_LCD_MODULE_COM 1 +#define TFT_LCD_MODULE_BAUDRATE 115600 + +// ESP WiFi Use internal USART-2 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115600 +#define ESP_WIFI_MODULE_RESET_PIN -1 +#define PIGGY_GPIO_PIN -1 + +// +// EEPROM +// +#define E2END 0x8000 // 32Kb (24lc256) +#define I2C_EEPROM // EEPROM on I2C-0 +//#define EEPROM_SD // EEPROM on SDCARD +//#define SPI_EEPROM // EEPROM on SPI-0 +//#define SPI_CHAN_EEPROM1 ? +//#define SPI_EEPROM1_CS ? +// 2K EEPROM +//#define SPI_EEPROM2_CS ? +// 32Mb FLASH +//#define SPI_FLASH_CS ? + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(RADDS_DISPLAY) || ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 62 + + #define LCD_PINS_RS 63 + #define LCD_PINS_ENABLE 64 + #define LCD_PINS_D4 48 + #define LCD_PINS_D5 50 + #define LCD_PINS_D6 52 + #define LCD_PINS_D7 53 + + #define SD_DETECT_PIN 51 + + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define BEEPER_PIN 62 + + #define LCD_PINS_RS 52 + #define LCD_PINS_ENABLE 53 + #define LCD_PINS_D4 48 + #define LCD_PINS_D5 50 + #define LCD_PINS_D6 52 + #define LCD_PINS_D7 53 + + #define SD_DETECT_PIN 51 + + #elif ENABLED(SSD1306_OLED_I2C_CONTROLLER) + + #define BEEPER_PIN 62 + #define LCD_SDSS 10 + #define SD_DETECT_PIN 51 + + #elif ENABLED(MKS_MINI_12864) + + #define ORIG_BEEPER_PIN 62 + + #define DOGLCD_A0 52 + #define DOGLCD_CS 50 + + #define SD_DETECT_PIN 51 + + #endif + + #if ENABLED(NEWPANEL) + #define BTN_EN1 44 + #define BTN_EN2 42 + #define BTN_ENC 40 + #endif + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h b/Marlin/src/pins/pins_SAINSMART_2IN1.h similarity index 81% rename from Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h rename to Marlin/src/pins/pins_SAINSMART_2IN1.h index e15fc94ac4..53d1a3e95b 100644 --- a/Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h +++ b/Marlin/src/pins/pins_SAINSMART_2IN1.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Sainsmart 2-in-1 pin assignments @@ -29,7 +28,7 @@ #error "Sainsmart 2-in-1 supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif -#define BOARD_INFO_NAME "Sainsmart" +#define BOARD_NAME "Sainsmart" // // Heaters / Fans diff --git a/Marlin/src/pins/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/pins_SANGUINOLOLU_11.h new file mode 100644 index 0000000000..0d9af5b5a8 --- /dev/null +++ b/Marlin/src/pins/pins_SANGUINOLOLU_11.h @@ -0,0 +1,325 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Sanguinololu board pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + * + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__) + #error "Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Sanguinololu <1.2" +#endif + +// +// Limit Switches +// +#define X_STOP_PIN 18 +#define Y_STOP_PIN 19 +#define Z_STOP_PIN 20 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 21 + +#define Y_STEP_PIN 22 +#define Y_DIR_PIN 23 + +#define Z_STEP_PIN 3 +#define Z_DIR_PIN 2 + +#define E0_STEP_PIN 1 +#define E0_DIR_PIN 0 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // Analog Input (pin 33 extruder) +#define TEMP_BED_PIN 6 // Analog Input (pin 34 bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 // (extruder) + +#if ENABLED(SANGUINOLOLU_V_1_2) + + #define HEATER_BED_PIN 12 // (bed) + #define X_ENABLE_PIN 14 + #define Y_ENABLE_PIN 14 + #define Z_ENABLE_PIN 26 + #define E0_ENABLE_PIN 14 + + #if !defined(FAN_PIN) && ENABLED(LCD_I2C_PANELOLU2) + #define FAN_PIN 4 // Uses Transistor1 (PWM) on Panelolu2's Sanguino Adapter Board to drive the fan + #endif + +#else + + #define HEATER_BED_PIN 14 // (bed) + #define X_ENABLE_PIN -1 + #define Y_ENABLE_PIN -1 + #define Z_ENABLE_PIN -1 + #define E0_ENABLE_PIN -1 + +#endif + +#if !defined(FAN_PIN) && (MB(AZTEEG_X1) || MB(STB_11) || ENABLED(IS_MELZI)) + #define FAN_PIN 4 // Works for Panelolu2 too +#endif + +// +// Misc. Functions +// + +/** + * In some versions of the Sanguino libraries the pin + * definitions are wrong, with SDSS = 24 and LED_PIN = 28 (Melzi). + * If you encounter issues with these pins, upgrade your + * Sanguino libraries! See #368. + */ +//#define SDSS 24 +#define SDSS 31 + +#if ENABLED(IS_MELZI) + #define LED_PIN 27 +#elif MB(STB_11) + #define LCD_BACKLIGHT_PIN 17 // LCD backlight LED +#endif + +#if DISABLED(SPINDLE_LASER_ENABLE) && ENABLED(SANGUINOLOLU_V_1_2) && !(ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL)) // try to use IO Header + #define CASE_LIGHT_PIN 4 // MUST BE HARDWARE PWM - see if IO Header is available +#endif + +/** + * Sanguinololu 1.4 AUX pins: + * + * PWM TX1 RX1 SDA SCL + * 12V 5V D12 D11 D10 D17 D16 + * GND GND D31 D30 D29 D28 D27 + * A4 A3 A2 A1 A0 + */ + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) + + #if ENABLED(DOGLCD) + + #if ENABLED(U8GLIB_ST7920) // SPI GLCD 12864 ST7920 ( like [www.digole.com] ) For Melzi V2.0 + + #if ENABLED(IS_MELZI) + #define LCD_PINS_RS 30 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 29 // SID (MOSI) + #define LCD_PINS_D4 17 // SCK (CLK) clock + // Pin 27 is taken by LED_PIN, but Melzi LED does nothing with + // Marlin so this can be used for BEEPER_PIN. You can use this pin + // with M42 instead of BEEPER_PIN. + #define BEEPER_PIN 27 + #else // Sanguinololu >=1.3 + #define LCD_PINS_RS 4 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 30 + #define LCD_PINS_D5 29 + #define LCD_PINS_D6 28 + #define LCD_PINS_D7 27 + #endif + + #else // DOGM SPI LCD Support + + #define DOGLCD_A0 30 + #define LCD_CONTRAST 1 + + #if ENABLED(MAKRPANEL) + + #define BEEPER_PIN 29 + #define DOGLCD_CS 17 + #define LCD_BACKLIGHT_PIN 28 // PA3 + + #elif ENABLED(IS_MELZI) + + #define BEEPER_PIN 27 + #define DOGLCD_CS 28 + + #else // !MAKRPANEL + + #define DOGLCD_CS 29 + + #endif + + #endif + + // Uncomment screen orientation + #define LCD_SCREEN_ROT_0 + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #else // !DOGLCD + + #define LCD_PINS_RS 4 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 30 + #define LCD_PINS_D5 29 + #define LCD_PINS_D6 28 + #define LCD_PINS_D7 27 + + #endif // !DOGLCD + + #define BTN_EN1 11 + #define BTN_EN2 10 + + #if ENABLED(LCD_I2C_PANELOLU2) + + #if ENABLED(IS_MELZI) + #define BTN_ENC 29 + #define LCD_SDSS 30 // Panelolu2 SD card reader rather than the Melzi + #else + #define BTN_ENC 30 + #endif + + #elif ENABLED(LCD_FOR_MELZI) + + #define LCD_PINS_RS 17 + #define LCD_PINS_ENABLE 16 + #define LCD_PINS_D4 11 + #define BTN_ENC 28 + #define BTN_EN1 29 + #define BTN_EN2 30 + + #ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(0) + #endif + #ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(188) + #endif + #ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(0) + #endif + + #elif ENABLED(ZONESTAR_LCD) // For the Tronxy Melzi boards + + #define LCD_PINS_RS 28 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 10 + #define LCD_PINS_D5 11 + #define LCD_PINS_D6 16 + #define LCD_PINS_D7 17 + #define ADC_KEYPAD_PIN 1 + + // Not used + #define BTN_EN1 -1 + #define BTN_EN2 -1 + + #else // !LCD_I2C_PANELOLU2 && !LCD_FOR_MELZI && !ZONESTAR_LCD + + #define BTN_ENC 16 + #define LCD_SDSS 28 // Smart Controller SD card reader rather than the Melzi + + #endif + + #define SD_DETECT_PIN -1 + +#endif // ULTRA_LCD && NEWPANEL + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) + #if !MB(AZTEEG_X1) && ENABLED(SANGUINOLOLU_V_1_2) && !(ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL)) // try to use IO Header + + #define SPINDLE_LASER_ENABLE_PIN 10 // Pin should have a pullup/pulldown! + #define SPINDLE_LASER_PWM_PIN 4 // MUST BE HARDWARE PWM + #define SPINDLE_DIR_PIN 11 + + #elif !MB(MELZI) // use X stepper motor socket + + /** + * To control the spindle speed and have an LCD you must sacrifice + * the Extruder and pull some signals off the X stepper driver socket. + * + * The following assumes: + * - The X stepper driver socket is empty + * - The extruder driver socket has a driver board plugged into it + * - The X stepper wires are attached the the extruder connector + */ + + /** + * Where to get the spindle signals + * + * spindle signal socket name socket name + * ------- + * /ENABLE O| |O VMOT + * MS1 O| |O GND + * MS2 O| |O 2B + * MS3 O| |O 2A + * /RESET O| |O 1A + * /SLEEP O| |O 1B + * SPINDLE_LASER_PWM_PIN STEP O| |O VDD + * SPINDLE_LASER_ENABLE_PIN DIR O| |O GND + * ------- + * + * Note: Socket names vary from vendor to vendor. + */ + #undef X_DIR_PIN + #undef X_ENABLE_PIN + #undef X_STEP_PIN + #define X_DIR_PIN 0 + #define X_ENABLE_PIN 14 + #define X_STEP_PIN 1 + #define SPINDLE_LASER_PWM_PIN 15 // MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENABLE_PIN 21 // Pin should have a pullup! + #define SPINDLE_DIR_PIN -1 // No pin available on the socket for the direction pin + #endif +#endif // SPINDLE_LASER_ENABLE diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h b/Marlin/src/pins/pins_SANGUINOLOLU_12.h similarity index 76% rename from Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h rename to Marlin/src/pins/pins_SANGUINOLOLU_12.h index c5c8b4f57e..f648dce085 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h +++ b/Marlin/src/pins/pins_SANGUINOLOLU_12.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Sanguinololu V1.2 pin assignments @@ -34,8 +33,8 @@ * STB_11 */ -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Sanguinololu 1.2" +#ifndef BOARD_NAME + #define BOARD_NAME "Sanguinololu 1.2" #endif #define SANGUINOLOLU_V_1_2 diff --git a/Marlin/src/pins/pins_SAV_MKI.h b/Marlin/src/pins/pins_SAV_MKI.h new file mode 100644 index 0000000000..8945594495 --- /dev/null +++ b/Marlin/src/pins/pins_SAV_MKI.h @@ -0,0 +1,184 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Select Teensy++ 2.0 in Arduino IDE from the 'Tools -> Boards' menu + * + * Installation instructions are at the above URL. Don't bother loading the + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools -> Boards' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#ifndef __AVR_AT90USB1286__ + #error "Oops! Make sure you have 'Teensy++ 2.0' or 'Printrboard' selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "SAV MkI" +#define DEFAULT_SOURCE_CODE_URL "https://github.com/fmalpartida/Marlin/tree/SAV-MkI-config" +#define BOARD_NAME "SAV MkI" + +// +// Servos +// +#define SERVO0_PIN 39 // F1 In teensy's pin definition for pinMode (in servo.cpp) + +// +// Limit Switches +// +#define X_STOP_PIN 25 // B5 +#define Y_STOP_PIN 26 // B6 +//#define Z_STOP_PIN 27 // B7 +#define Z_STOP_PIN 36 // E4 For inductive sensor. +//#define E_STOP_PIN 36 // E4 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 19 // E7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 18 // E6 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 17 // C7 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 13 // C3 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // F7 Analog Input (Extruder) +#define TEMP_BED_PIN 6 // F6 Analog Input (Bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B - Extruder +#define HEATER_BED_PIN 14 // C4 PWM3C - Bed + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 + +// Extension header pin mapping +// ---------------------------- +// SCL (I2C)-D0 A0 (An), IO +// SDA (I2C)-D1 A1 (An), IO +// RX1-D2 A2 (An), IO +// TX1-D3 A3 (An), IO +// PWM-D24 A4 (An), IO +// 5V GND +// 12V GND +#define EXT_AUX_SCL_D0 0 // D0 PWM0B +#define EXT_AUX_SDA_D1 1 // D1 +#define EXT_AUX_RX1_D2 2 // D2 +#define EXT_AUX_TX1_D3 3 // D3 +#define EXT_AUX_PWM_D24 24 // B4 PWM2A +#define EXT_AUX_A0 0 // F0 Analog Input +#define EXT_AUX_A0_IO 38 // F0 Digital IO +#define EXT_AUX_A1 1 // F1 Analog Input +#define EXT_AUX_A1_IO 39 // F1 Digital IO +#define EXT_AUX_A2 2 // F2 Analog Input +#define EXT_AUX_A2_IO 40 // F2 Digital IO +#define EXT_AUX_A3 3 // F3 Analog Input +#define EXT_AUX_A3_IO 41 // F3 Digital IO +#define EXT_AUX_A4 4 // F4 Analog Input +#define EXT_AUX_A4_IO 42 // F4 Digital IO + +// +// LCD / Controller +// +#define BEEPER_PIN -1 +#define LCD_PINS_RS -1 +#define LCD_PINS_ENABLE -1 + +#if ENABLED(SAV_3DLCD) + // For LCD SHIFT register LCD + #define SR_DATA_PIN EXT_AUX_SDA_D1 + #define SR_CLK_PIN EXT_AUX_SCL_D0 +#endif + +#if ENABLED(SAV_3DLCD) || ENABLED(SAV_3DGLCD) + + #define BTN_EN1 EXT_AUX_A1_IO + #define BTN_EN2 EXT_AUX_A0_IO + #define BTN_ENC EXT_AUX_PWM_D24 + + #define KILL_PIN EXT_AUX_A2_IO + #define HOME_PIN EXT_AUX_A4_IO + +#else // Use the expansion header for spindle control + + // + // M3/M4/M5 - Spindle/Laser Control + // + #define SPINDLE_LASER_PWM_PIN 24 // B4 PWM2A + #define SPINDLE_LASER_ENABLE_PIN 39 // F1 Pin should have a pullup! + #define SPINDLE_DIR_PIN 40 // F2 + + #define CASE_LIGHT_PIN 0 // D0 PWM0B + +#endif diff --git a/Marlin/src/pins/pins_SCOOVO_X9H.h b/Marlin/src/pins/pins_SCOOVO_X9H.h new file mode 100644 index 0000000000..ea6685def4 --- /dev/null +++ b/Marlin/src/pins/pins_SCOOVO_X9H.h @@ -0,0 +1,158 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/************************************************ + * Rambo pin assignments MODIFIED FOR Scoovo X9H + ************************************************/ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Scoovo X9H" + +// +// Servos +// +#define SERVO0_PIN 22 // Motor header MX1 +#define SERVO1_PIN 23 // Motor header MX2 +#define SERVO2_PIN 24 // Motor header MX3 +#define SERVO3_PIN 5 // PWM header pin 5 + +// +// Limit Switches +// +#define X_MIN_PIN 12 +#define X_MAX_PIN 24 +#define Y_MIN_PIN 11 +#define Y_MAX_PIN 23 +#define Z_MIN_PIN 10 +#define Z_MAX_PIN 30 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 30 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 48 +#define X_ENABLE_PIN 29 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 49 +#define Y_ENABLE_PIN 28 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 42 +#define E1_ENABLE_PIN 25 + +// Microstepping pins - Mapping not from fastio.h (?) +#define X_MS1_PIN 40 +#define X_MS2_PIN 41 +#define Y_MS1_PIN 69 +#define Y_MS2_PIN 39 +#define Z_MS1_PIN 68 +#define Z_MS2_PIN 67 +#define E0_MS1_PIN 65 +#define E0_MS2_PIN 66 +#define E1_MS1_PIN 63 +#define E1_MS2_PIN 64 + +#define DIGIPOTSS_PIN 38 +#define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_BED_PIN 7 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 7 +#define HEATER_BED_PIN 3 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif +#define FAN1_PIN 6 +#define FAN2_PIN 2 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 4 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 3 // Analog Input +#endif + +// +// LCD / Controller +// +#define LCD_PINS_RS 70 // Ext2_5 +#define LCD_PINS_ENABLE 71 // Ext2_7 +#define LCD_PINS_D4 72 // Ext2_9 ? +#define LCD_PINS_D5 73 // Ext2_11 ? +#define LCD_PINS_D6 74 // Ext2_13 +#define LCD_PINS_D7 75 // Ext2_15 ? +#define BEEPER_PIN -1 + +#define BTN_HOME 80 // Ext_16 +#define BTN_CENTER 81 // Ext_14 +#define BTN_ENC BTN_CENTER +#define BTN_RIGHT 82 // Ext_12 +#define BTN_LEFT 83 // Ext_10 +#define BTN_UP 84 // Ext2_8 +#define BTN_DOWN 85 // Ext2_6 + +#define HOME_PIN BTN_HOME + +#if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define BEEPER_PIN 44 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 70 + #define DOGLCD_CS 71 + #define LCD_SCREEN_ROT_180 + + #define SD_DETECT_PIN -1 // Pin 72 if using easy adapter board + + #define STAT_LED_RED_PIN 22 + #define STAT_LED_BLUE_PIN 32 +#endif // VIKI2/miniVIKI diff --git a/Marlin/src/pins/pins_SELENA_COMPACT.h b/Marlin/src/pins/pins_SELENA_COMPACT.h new file mode 100644 index 0000000000..5ea2d3bf54 --- /dev/null +++ b/Marlin/src/pins/pins_SELENA_COMPACT.h @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Selena Compact pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Selena Compact" + #define DEFAULT_WEBSITE_URL "https://github.com/Ales2-k/Selena" +#endif + +// +// Limit Switches +// + +#define X_MIN_PIN P1_28 +#define X_MAX_PIN P1_25 +#define Y_MIN_PIN P2_11 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN P1_27 +#define Z_MAX_PIN -1 +#define Z_PROBE P1_22 + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN 0 // A0 (TH1) +#define TEMP_0_PIN 1 // A1 (TH2) +#define TEMP_1_PIN 2 // A2 (TH3) + + +// +// Heaters / Fans +// + +#define HEATER_BED_PIN P2_05 +#define HEATER_BED2_PIN P2_04 +#define HEATER_0_PIN P2_07 +#define HEATER_1_PIN P2_06 +#ifndef FAN_PIN + #define FAN_PIN P1_24 +#endif +#define FAN1_PIN P1_26 + +// +// Display +// + +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define LCD_PINS_RS P0_16 + #define LCD_PINS_ENABLE P0_18 + #define LCD_PINS_D4 P0_15 + #define LCD_PINS_D5 P1_00 + #define LCD_PINS_D6 P1_01 + #define LCD_PINS_D7 P1_04 + #define BEEPER_PIN P1_31 + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + #define BTN_ENC P1_30 + + #define SD_DETECT_PIN -1 +#endif // REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// Servo +// +#define SERVO0_PIN P1_23 diff --git a/Marlin/src/pins/pins_SETHI.h b/Marlin/src/pins/pins_SETHI.h new file mode 100644 index 0000000000..801560e5e3 --- /dev/null +++ b/Marlin/src/pins/pins_SETHI.h @@ -0,0 +1,124 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Sethi 3D_1 pin assignments - www.sethi3d.com.br + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + * this assumes that this board uses the Sanguino pin map + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino + * Just use the above JSON URL instead of Sparkfun's JSON. + * + * Once installed select the Sanguino board and then select the CPU. + * + */ + +#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__) + #error "Oops! Make sure you have 'Sethi 3D' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Sethi 3D_1" + +#ifndef GEN7_VERSION + #define GEN7_VERSION 12 // v1.x +#endif + +// +// Limit Switches +// +#define X_STOP_PIN 2 +#define Y_STOP_PIN 0 +#define Z_MIN_PIN 1 +#define Z_MAX_PIN 0 + +// +// Steppers +// +#define X_STEP_PIN 19 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 26 +#define Z_DIR_PIN 25 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 3 + +#ifndef FAN_PIN + #if GEN7_VERSION >= 13 + // Gen7 v1.3 removed the fan pin + #define FAN_PIN -1 + #else + #define FAN_PIN 31 + #endif +#endif + +// +// Misc. Functions +// +#define PS_ON_PIN 15 + +// All these generations of Gen7 supply thermistor power +// via PS_ON, so ignore bad thermistor readings +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// our pin for debugging. +#define DEBUG_PIN 0 + +// our RS485 pins +#define TX_ENABLE_PIN 12 +#define RX_ENABLE_PIN 13 diff --git a/Marlin/src/pins/pins_SILVER_GATE.h b/Marlin/src/pins/pins_SILVER_GATE.h new file mode 100644 index 0000000000..005c4c6eca --- /dev/null +++ b/Marlin/src/pins/pins_SILVER_GATE.h @@ -0,0 +1,94 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if !defined(__AVR_ATmega1281__) && !defined(__AVR_ATmega2561__) + #error Oops! Make sure you have 'Silvergate' selected from the 'Tools -> Boards' menu. +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Silver Gate" +#endif + +#define X_STEP_PIN 43 +#define X_DIR_PIN 44 +#define X_ENABLE_PIN 42 +#define X_MIN_PIN 31 +#define X_MAX_PIN 34 + +#define Y_STEP_PIN 40 +#define Y_DIR_PIN 41 +#define Y_ENABLE_PIN 39 +#define Y_MIN_PIN 32 +#define Y_MAX_PIN 35 + +#define Z_STEP_PIN 13 +#define Z_DIR_PIN 38 +#define Z_ENABLE_PIN 14 +#define Z_MIN_PIN 33 +#define Z_MAX_PIN 36 + +#define E0_STEP_PIN 27 +#define E0_DIR_PIN 37 +#define E0_ENABLE_PIN 45 + +#define SDSS 16 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 34 // X_MAX unless overridden +#endif + +#ifndef FAN_PIN + #define FAN_PIN 5 +#endif + +#define HEATER_0_PIN 7 + +#define ORIG_E0_AUTO_FAN_PIN 3 // Use this by NOT overriding E0_AUTO_FAN_PIN +#define CONTROLLER_FAN_PIN 2 + +#define TEMP_0_PIN 7 // Analog Input + +#define HEATER_BED_PIN 8 +#define TEMP_BED_PIN 6 + +#if ENABLED(DOGLCD) + #if ENABLED(U8GLIB_ST7920) // SPI GLCD 12864 ST7920 + #define LCD_PINS_RS 30 + #define LCD_PINS_ENABLE 20 + #define LCD_PINS_D4 25 + #define BEEPER_PIN 29 + #define BTN_EN1 19 + #define BTN_EN2 22 + #define BTN_ENC 24 + #define LCD_BACKLIGHT_PIN 6 + #if ENABLED(SILVER_GATE_GLCD_CONTROLLER) + #define KILL_PIN 21 + #define HOME_PIN 28 + #endif + #endif +#endif + +#define SD_DETECT_PIN 15 + +#define STAT_LED_RED_PIN 23 +#define STAT_LED_BLUE_PIN 26 +#define CASE_LIGHT_PIN 51 diff --git a/Marlin/src/pins/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/pins_SMOOTHIEBOARD.h new file mode 100644 index 0000000000..f41f57020a --- /dev/null +++ b/Marlin/src/pins/pins_SMOOTHIEBOARD.h @@ -0,0 +1,115 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Smoothieboard pin assignments + */ + +#ifndef TARGET_LPC1768 + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_NAME + #define BOARD_NAME "Smoothieboard" + #define DEFAULT_WEBSITE_URL "http://smoothieware.org/smoothieboard" +#endif + +#undef F_CPU +#define F_CPU 120000000 + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 +#define X_MAX_PIN P1_25 +#define Y_MIN_PIN P1_26 +#define Y_MAX_PIN P1_27 +#define Z_MIN_PIN P1_28 +#define Z_MAX_PIN P1_29 + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN 0 // P0.23 (T1) +#define TEMP_BED_PIN 1 // P0.24 (T2) +#define TEMP_1_PIN 2 // P0.25 (T3) +#define TEMP_2_PIN 3 // P0.26 (T4) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 +#define HEATER_1_PIN P1_23 +#ifndef FAN_PIN + #define FAN_PIN P2_06 +#endif +#define FAN1_PIN P2_04 + +// +// Display +// +#if ENABLED(VIKI2) || ENABLED(miniVIKI) + #define BEEPER_PIN P1_31 + //#define DOGLCD_A0 P2_06 + #define DOGLCD_CS P0_16 + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + #define BTN_ENC P2_11 + + #define SD_DETECT_PIN P1_18 + #define SDSS P1_21 + + #define STAT_LED_RED_PIN P1_19 + #define STAT_LED_BLUE_PIN P1_20 +#endif diff --git a/Marlin/src/pins/sanguino/pins_STB_11.h b/Marlin/src/pins/pins_STB_11.h similarity index 75% rename from Marlin/src/pins/sanguino/pins_STB_11.h rename to Marlin/src/pins/pins_STB_11.h index b10a09840a..de769fcb68 100644 --- a/Marlin/src/pins/sanguino/pins_STB_11.h +++ b/Marlin/src/pins/pins_STB_11.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,15 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * STB V1.1 pin assignments */ -#define BOARD_INFO_NAME "STB V1.1" - +#define BOARD_NAME "STB V1.1" #include "pins_SANGUINOLOLU_12.h" diff --git a/Marlin/src/pins/pins_STM32F1R.h b/Marlin/src/pins/pins_STM32F1R.h new file mode 100644 index 0000000000..f827a7ef9b --- /dev/null +++ b/Marlin/src/pins/pins_STM32F1R.h @@ -0,0 +1,264 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef __STM32F1__ + #error "Oops! Make sure you have an STM32F1 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 21017 Victor Perez Marlin for stm32f1 test + */ + +#define DEFAULT_MACHINE_NAME "STM32F103RET6" +#define BOARD_NAME "Marlin for STM32" + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Limit Switches +// +#define U_MIN_PIN -1 +#define V_MIN_PIN -1 +#define W_MIN_PIN -1 +#define X_STOP_PIN PB3 +#define Y_STOP_PIN PB4 +#define Z_STOP_PIN PB5 + +// +// Steppers +// +#define X_STEP_PIN PC0 +#define X_DIR_PIN PC1 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PC2 +#define Y_DIR_PIN PC3 +#define Y_ENABLE_PIN PA8 + +#define Z_STEP_PIN PC4 +#define Z_DIR_PIN PC5 +#define Z_ENABLE_PIN PA8 + +#define E0_STEP_PIN PC6 +#define E0_DIR_PIN PC7 +#define E0_ENABLE_PIN PA8 + +/** + * TODO: Currently using same Enable pin to all steppers. + */ + +#define E1_STEP_PIN PC8 +#define E1_DIR_PIN PC9 +#define E1_ENABLE_PIN PA8 + +#define E2_STEP_PIN PC10 +#define E2_DIR_PIN PC11 +#define E2_ENABLE_PIN PA8 + +// +// Misc. Functions +// +#define SDSS PA4 +#define LED_PIN PD2 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB0 // EXTRUDER 1 +#define HEATER_1_PIN PB1 + +#define HEATER_BED_PIN PA3 // BED + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 // ANALOG NUMBERING +#define TEMP_0_PIN PA1 // ANALOG NUMBERING +#define TEMP_1_PIN PA2 // ANALOG NUMBERING + +// +// LCD Pins +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + // The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_STM32F4.h b/Marlin/src/pins/pins_STM32F4.h new file mode 100644 index 0000000000..22c8389635 --- /dev/null +++ b/Marlin/src/pins/pins_STM32F4.h @@ -0,0 +1,191 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if !defined(STM32F4) && !defined(STM32F4xx) + #error "Oops! Make sure you have an STM32F4 board selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "STM32F407VET6" +#define BOARD_NAME "STM32F4 Board" + +//#define I2C_EEPROM + +#define E2END 0xFFF // EEPROM end address (4kB) + +// Ignore temp readings during develpment. +//#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +#if E_STEPPERS > 2 || HOTENDS > 2 + #error "STM32F4 supports up to 2 hotends / E-steppers." +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PE0 +#define X_MAX_PIN -1 +#define Y_MIN_PIN PE1 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN PE14 +#define Z_MAX_PIN -1 + +// +// Z Probe (when not Z_MIN_PIN) +// + +//#ifndef Z_MIN_PROBE_PIN +// #define Z_MIN_PROBE_PIN PA4 +//#endif + +// +// Steppers +// + +#define X_STEP_PIN PD3 +#define X_DIR_PIN PD2 +#define X_ENABLE_PIN PD0 +//#ifndef X_CS_PIN +// #define X_CS_PIN PD1 +//#endif + +#define Y_STEP_PIN PE11 +#define Y_DIR_PIN PE10 +#define Y_ENABLE_PIN PE13 +//#ifndef Y_CS_PIN +// #define Y_CS_PIN PE12 +//#endif + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD7 +#define Z_ENABLE_PIN PD4 +//#ifndef Z_CS_PIN +// #define Z_CS_PIN PD5 +//#endif + +#define E0_STEP_PIN PB5 +#define E0_DIR_PIN PB6 +#define E0_ENABLE_PIN PB3 +//#ifndef E0_CS_PIN +// #define E0_CS_PIN PB4 +//#endif + +#define E1_STEP_PIN PE4 +#define E1_DIR_PIN PE2 +#define E1_ENABLE_PIN PE3 +//#ifndef E1_CS_PIN +// #define E1_CS_PIN PE5 +//#endif + +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 + +// +// Temperature Sensors +// + +#define TEMP_0_PIN PC0 // Analog Input +#define TEMP_1_PIN PC1 // Analog Input +#define TEMP_BED_PIN PC2 // Analog Input + +// +// Heaters / Fans +// + +#define HEATER_0_PIN PA1 +#define HEATER_1_PIN PA2 +#define HEATER_BED_PIN PA0 + +#ifndef FAN_PIN + #define FAN_PIN PC6 +#endif +#define FAN1_PIN PC7 +#define FAN2_PIN PC8 + +#define ORIG_E0_AUTO_FAN_PIN FAN1_PIN // Use this by NOT overriding E0_AUTO_FAN_PIN + +// +// Misc. Functions +// + +//#define CASE_LIGHT_PIN_CI PF13 +//#define CASE_LIGHT_PIN_DO PF14 +//#define NEOPIXEL_PIN PF13 + +// +// Prusa i3 MK2 Multi Material Multiplexer Support +// + +//#define E_MUX0_PIN PG3 +//#define E_MUX1_PIN PG4 + +// +// Servos +// + +//#define SERVO0_PIN PE13 +//#define SERVO1_PIN PE14 + + +#define SDSS PE7 +#define SS_PIN PE7 +#define LED_PIN PB7 //Alive +#define PS_ON_PIN PA10 +#define KILL_PIN PA8 +#define PWR_LOSS PA4 //Power loss / nAC_FAULT + +// +// LCD / Controller +// + +#define SD_DETECT_PIN PA15 +#define BEEPER_PIN PC9 +#define LCD_PINS_RS PE9 +#define LCD_PINS_ENABLE PE8 +#define LCD_PINS_D4 PB12 +#define LCD_PINS_D5 PB13 +#define LCD_PINS_D6 PB14 +#define LCD_PINS_D7 PB15 +#define BTN_EN1 PC4 +#define BTN_EN2 PC5 +#define BTN_ENC PC3 + +// +// Filament runout +// + +#define FIL_RUNOUT_PIN PA3 + +// +// ST7920 Delays +// +#ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(96) +#endif + +#ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(48) +#endif + +#ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(715) +#endif diff --git a/Marlin/src/pins/pins_STM3R_MINI.h b/Marlin/src/pins/pins_STM3R_MINI.h new file mode 100644 index 0000000000..2ffb09e2d5 --- /dev/null +++ b/Marlin/src/pins/pins_STM3R_MINI.h @@ -0,0 +1,280 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if !defined(__STM32F1__) && !defined(__STM32F4__) + #error "Oops! Make sure you have an STM32F1/4 board selected from the 'Tools -> Boards' menu." +#endif + +/** + * 21017 Victor Perez Marlin for stm32f1 test + */ + +#define DEFAULT_MACHINE_NAME "STM3R Mini" +#define BOARD_NAME "Marlin for STM32" + +// Enable I2C_EEPROM for testing +#define I2C_EEPROM + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +// +// Limit Switches +// +#define U_MIN_PIN -1 +#define V_MIN_PIN -1 +#define W_MIN_PIN -1 +#define X_STOP_PIN PD0 +#define Y_STOP_PIN PD1 +#define Z_STOP_PIN PD4 + +// +// Steppers +// +#define X_STEP_PIN PE1 +#define X_DIR_PIN PE0 +#define X_ENABLE_PIN PC0 + +#define Y_STEP_PIN PE3 +#define Y_DIR_PIN PE2 +#define Y_ENABLE_PIN PC1 + +#define Z_STEP_PIN PE5 +#define Z_DIR_PIN PE4 +#define Z_ENABLE_PIN PC2 + +#define E0_STEP_PIN PE7 +#define E0_DIR_PIN PE6 +#define E0_ENABLE_PIN PC3 + +#define E1_STEP_PIN PE9 +#define E1_DIR_PIN PE8 +#define E1_ENABLE_PIN PC4 + +#define E2_STEP_PIN PE11 +#define E2_DIR_PIN PE10 +#define E2_ENABLE_PIN PC5 + +// +// Misc. Functions +// +#define SDSS PA15 +#define LED_PIN PB2 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD12 // EXTRUDER 1 +//#define HEATER_1_PIN PD13 + +#define HEATER_BED_PIN PB9 // BED +//#define HEATER_BED2_PIN -1 // BED2 +//#define HEATER_BED3_PIN -1 // BED3 + +#ifndef FAN_PIN + #define FAN_PIN PD14 +#endif +#define FAN1_PIN PD13 + +#define FAN_SOFT_PWM + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 +#define TEMP_0_PIN PA1 +#define TEMP_1_PIN PA2 +#define TEMP_2_PIN PA3 + +// Laser control +#if ENABLED(SPINDLE_LASER_ENABLE) + #define SPINDLE_LASER_PWM_PIN PB8 + #define SPINDLE_LASER_ENABLE_PIN PD5 +#endif + +// +// LCD Pins +// +#if ENABLED(ULTRA_LCD) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #elif ENABLED(NEWPANEL) && ENABLED(PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + // Buttons are attached to a shift register + // Not wired yet + //#define SHIFT_CLK 38 + //#define SHIFT_LD 42 + //#define SHIFT_OUT 40 + //#define SHIFT_EN 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 22 // http://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. + + #define BTN_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ENABLED(VIKI2) || ENABLED(miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + #define SD_DETECT_PIN 49 + #define LCD_SDSS 53 + #define KILL_PIN 41 + #define BEEPER_PIN 23 + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + #define LCD_BACKLIGHT_PIN 33 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + #define SDSS 53 + + #define KILL_PIN 64 + // GLCD features + //#define LCD_CONTRAST 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + // The encoder and click button + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // buttons are directly attached using AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 59 // AUX2 PIN 3 + #define BTN_EN2 63 // AUX2 PIN 4 + #define BTN_ENC 49 // AUX3 PIN 7 + #else + #define BTN_EN1 37 + #define BTN_EN2 35 + #define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // ULTRA_LCD diff --git a/Marlin/src/pins/pins_TEENSY2.h b/Marlin/src/pins/pins_TEENSY2.h new file mode 100644 index 0000000000..736be6f73e --- /dev/null +++ b/Marlin/src/pins/pins_TEENSY2.h @@ -0,0 +1,184 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2017 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Select Teensy++ 2.0 in Arduino IDE from the 'Tools -> Boards' menu + * + * Installation instructions are at the above URL. Don't bother loading the + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools -> Boards' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +/** + * Teensy++ 2.0 Breadboard pin assignments (AT90USB1286) + * Requires the Teensyduino software with Teensy++ 2.0 selected in Arduino IDE! + * http://www.pjrc.com/teensy/teensyduino.html + * See http://reprap.org/wiki/Printrboard for more info + * + * CLI build: HARDWARE_MOTHERBOARD=84 make + * + * DaveX plan for Teensylu/printrboard-type pinouts for a TeensyBreadboard: + * (ref teensylu & sprinter) + * + * USB + * GND GND |-----#####-----| +5V ATX +5SB + * ATX PS_ON PWM 27 |b7 ##### b6| 26 PWM* Stepper Enable + * PWM 0 |d0 b5| 25 PWM* + * PWM 1 |d1 b4| 24 PWM + * X_MIN 2 |d2 b3| 23 MISO_PIN + * Y_MIN 3 |d3 b2| 22 MOSI_PIN + * Z_MIN 4 |d4 * * b1| 21 SCK_PIN + * 5 |d5 e e b0| 20 SDSS + * LED 6 |d6 5 4 e7| 19 + * 7 |d7 e6| 18 + * LCD RS 8 |e0 | GND + * LCD EN 9 |e1 a4 a0 R| AREF + * LCD D4 10 |c0 a5 a1 f0| 38 A0 ENC_1 + * LCD D5 11 |c1 a6 a2 f1| 39 A1 ENC_2 + * LCD D6 12 |c2 a7 a3 f2| 40 A2 ENC_CLK + * LCD D6 13 |c3 f3| 41 A3 + * Bed Heat PWM 14 |c4 V G R f4| 42 A4 + * Extruder Heat PWM 15 |c5 c n S f5| 43 A5 + * Fan PWM 16 |c6 c d T f6| 44 A6 Bed TC + * 17 |c7 * * * f7| 45 A7 Extruder TC * 4.7k * +5 + * ----------------- + * + * Interior E4: 36, INT4 + * Interior E5: 37, INT5 + * Interior PA0-7: 28-35 -- Printrboard and Teensylu use these pins for step & direction: + * T++ PA Signal Marlin + * + * Z STEP 32 a4 a0 28 X STEP + * Z DIR 33 a5 a1 29 X DIR + * E STEP 34 a6 a2 30 Y STEP + * E DIR 35 a7 a3 31 Y DIR + */ + +#ifndef __AVR_AT90USB1286__ + #error "Oops! Make sure you have 'Teensy++ 2.0' or 'Printrboard' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Teensy++2.0" + +// +// Limit Switches +// +#define X_STOP_PIN 2 // D2 +#define Y_STOP_PIN 3 // D3 +#define Z_STOP_PIN 4 // D4 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 Marlin +#define X_DIR_PIN 29 // A1 Marlin +#define X_ENABLE_PIN 26 // B6 + +#define Y_STEP_PIN 30 // A2 Marlin +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 26 // B6 Shared w/x + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 26 // B6 Shared w/x + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 26 // B6 Shared w/x + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // F7 Analog Input (Extruder) +#define TEMP_BED_PIN 6 // F6 Analog Input (Bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B Extruder +#define HEATER_BED_PIN 14 // C4 PWM3C +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A Fan +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 +#define LED_PIN 6 // D6 +#define PS_ON_PIN 27 // B7 +#define CASE_LIGHT_PIN 1 // D1 PWM2B MUST BE HARDWARE PWM + +// +// LCD / Controller +// +#if ENABLED(ULTIPANEL) + #define LCD_PINS_RS 8 // E0 + #define LCD_PINS_ENABLE 9 // E1 + #define LCD_PINS_D4 10 // C0 + #define LCD_PINS_D5 11 // C1 + #define LCD_PINS_D6 12 // C2 + #define LCD_PINS_D7 13 // C3 + #define BTN_EN1 38 // F0 + #define BTN_EN2 39 // F1 + #define BTN_ENC 40 // F2 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENABLE_PIN 5 // D5 Pin should have a pullup! +#define SPINDLE_LASER_PWM_PIN 0 // D0 PWM0B MUST BE HARDWARE PWM +#define SPINDLE_DIR_PIN 7 // D7 diff --git a/Marlin/src/pins/pins_TEENSY31_32.h b/Marlin/src/pins/pins_TEENSY31_32.h new file mode 100644 index 0000000000..a37a2407d8 --- /dev/null +++ b/Marlin/src/pins/pins_TEENSY31_32.h @@ -0,0 +1,111 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/**************************************************************************************** +* Teensy 3.1 (MK20DX256) and Teensy 3.2 (MK20DX256) Breadboard pin assignments +* Requires the Teensyduino software with Teensy 3.1 or Teensy 3.2 selected in Arduino IDE! +* http://www.pjrc.com/teensy/teensyduino.html +****************************************************************************************/ + +#if !IS_32BIT_TEENSY + #error "Oops! Make sure you have 'Teensy 3.1' or 'Teensy 3.2' selected from the 'Tools -> Boards' menu." +#endif + +#if IS_TEENSY32 + #define BOARD_NAME "Teensy3.2" +#endif + +#define AT90USB 1286 // Disable MarlinSerial etc. +#define USBCON //1286 // Disable MarlinSerial etc. + +// +// Limit Switches +// +#define X_STOP_PIN 3 +#define Y_STOP_PIN 4 +#define Z_STOP_PIN 5 + +// +// Steppers +// +#define X_STEP_PIN 5 +#define X_DIR_PIN 6 +#define X_ENABLE_PIN 2 + +#define Y_STEP_PIN 7 +#define Y_DIR_PIN 8 +#define Y_ENABLE_PIN 2 + +#define Z_STEP_PIN 9 +#define Z_DIR_PIN 10 +#define Z_ENABLE_PIN 2 + +#define E0_STEP_PIN 11 +#define E0_DIR_PIN 12 +#define E0_ENABLE_PIN 2 + +// #define E1_STEP_PIN 33 +// #define E1_DIR_PIN 34 +// #define E1_ENABLE_PIN 35 + +#define HEATER_0_PIN 20 +// #define HEATER_1_PIN 36 +#define HEATER_BED_PIN 21 +#ifndef FAN_PIN + #define FAN_PIN 22 +#endif + +#define TEMP_0_PIN 14 // Extruder / Analog pin numbering: 2 => A2 +// #define TEMP_1_PIN 0 +#define TEMP_BED_PIN 15 // Bed / Analog pin numbering + +// #define SDSS 16 // 8 +#define LED_PIN 13 +#define PS_ON_PIN -1 +#define ALARM_PIN -1 + +// #define FILWIDTH_PIN 6 +// #define SOL1_PIN 28 + +#if 0 +// Pretty sure this is obsolete! +// Please use Marlin 1.1.x pins files as reference for new pins files. +#ifndef SDSUPPORT + // these are defined in the SD library if building with SD support + #define SCK_PIN 13 + #define MISO_PIN 12 + #define MOSI_PIN 11 +#endif +#endif +/* +#ifdef ULTRA_LCD + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 41 + #define LCD_PINS_D4 42 + #define LCD_PINS_D5 43 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 45 + #define BTN_EN1 46 + #define BTN_EN2 47 + #define BTN_ENC 48 +#endif +*/ diff --git a/Marlin/src/pins/pins_TEENSY35_36.h b/Marlin/src/pins/pins_TEENSY35_36.h new file mode 100644 index 0000000000..f21438b129 --- /dev/null +++ b/Marlin/src/pins/pins_TEENSY35_36.h @@ -0,0 +1,152 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/**************************************************************************************** +* Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) Breadboard pin assignments +* Requires the Teensyduino software with Teensy 3.5 or Teensy 3.6 selected in Arduino IDE! +* http://www.pjrc.com/teensy/teensyduino.html +****************************************************************************************/ + +#if !IS_32BIT_TEENSY + #error "Oops! Make sure you have 'Teensy 3.5' or 'Teensy 3.6' selected from the 'Tools -> Boards' menu." +#endif + +#if IS_TEENSY35 + #define BOARD_NAME "Teensy3.5" +#elif IS_TEENSY36 + #define BOARD_NAME "Teensy3.6" +#endif + +#define AT90USB 1286 // Disable MarlinSerial etc. +#define USBCON //1286 // Disable MarlinSerial etc. +/* + + teemuatlut plan for Teensy3.5 and Teensy3.6: + USB + GND |-----#####-----| VIN 5V + X_STEP_PIN MOSI1 RX1 0 | ##### | Analog GND + X_DIR_PIN MISO1 TX1 1 | | 3.3V + Y_STEP_PIN PWM 2 | *NC AREF* | 23 A9 PWM + Y_DIR_PIN SCL2 CAN0TX PWM 3 | *A26 A10* | 22 A8 PWM + Z_STEP_PIN SDA2 CAN0RX PWM 4 | *A25 A11* | 21 A7 PWM CS0 MOSI1 RX1 + Z_DIR_PIN MISO1 TX1 PWM 5 | *GND * * 57 | 20 A6 PWM CS0 SCK1 FILWIDTH_PIN + X_ENABLE_PIN PWM 6 | *GND * * 56 | 19 A5 SCL0 E0_STEP_PIN + Y_ENABLE_PIN SCL0 MOSI0 RX3 PWM 7 | * * 55 | 18 A4 SDA0 E0_DIR_PIN + Z_ENABLE_PIN SDA0 MISO0 TX3 PWM 8 | * * 54 | 17 A3 SDA0 E0_ENABLE_PIN + CS0 RX2 PWM 9 | | 16 A2 SCL0 TEMP_0_PIN + CS0 TX2 PWM 10 | | 15 A1 CS0 TEMP_BED_PIN + X_STOP_PIN MOSI0 11 | | 14 A0 PWM CS0 TEMP_1_PIN + Y_STOP_PIN MISO0 12 | | 13 LED SCK0 LED_PIN + 3.3V | | GND + Z_STOP_PIN 24 | 40 * * 53 | A22 DAC1 +AUX2 25 | 41 * * 52 | A21 DAC0 +AUX2 FAN_PIN SCL2 TX1 26 | 42 * * 51 | 39 A20 MISO0 SDSS +AUX2 Z-PROBE PWR SCK0 RX1 27 | * * * * * | 38 A19 PWM SDA1 +AUX2 SOL1_PIN MOSI0 28 | 43 * * 50 | 37 A18 PWM SCL1 +D10 CONTROLLERFAN_PIN CAN0TX PWM 29 | 44 * * 49 | 36 A17 PWM +D9 HEATER_0_PIN CAN0RX PWM 30 | 45 * * 48 | 35 A16 PWM E1_ENABLE_PIN +D8 HEATER_BED_PIN CS1 RX4 A12 31 | 46 * * 47 | 34 A15 PWM SDA0 RX5 E1_DIR_PIN + SCK1 TX4 A13 32 |__GND_*_*_3.3V_| 33 A14 PWM SCL0 TX5 E1_STEP_PIN + + Interior pins: + LCD_PINS_RS 40 * * 53 SCK2 + LCD_PINS_ENABLE 41 * * 52 MOSI2 + LCD_PINS_D4 42 * * 51 MISO2 + LCD_PINS_D5 CS2 43 * * 50 A24 + LCD_PINS_D6 MOSI2 44 * * 49 A23 + LCD_PINS_D7 MISO2 45 * * 48 TX6 SDA0 BTN_ENC + BTN_EN1 SCK2 46 * * 47 RX6 SCL0 BTN_EN2 + GND * * 3.3V + +*/ + +// +// Limit Switches +// +#define X_STOP_PIN 24 +#define Y_STOP_PIN 26 +#define Z_STOP_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 22 +#define X_DIR_PIN 21 +#define X_ENABLE_PIN 39 + +#define Y_STEP_PIN 19 +#define Y_DIR_PIN 18 +#define Y_ENABLE_PIN 20 + +#define Z_STEP_PIN 38 +#define Z_DIR_PIN 37 +#define Z_ENABLE_PIN 17 + +#define E0_STEP_PIN 31 +#define E0_DIR_PIN 30 +#define E0_ENABLE_PIN 32 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 35 + +#define HEATER_0_PIN 30 +#define HEATER_1_PIN 36 +#define HEATER_BED_PIN 31 +#ifndef FAN_PIN + #define FAN_PIN 2 +#endif + +#define TEMP_0_PIN 2 // Extruder / Analog pin numbering: 2 => A2 +#define TEMP_1_PIN 0 +#define TEMP_BED_PIN 1 // Bed / Analog pin numbering + +#define SDSS 39 // 8 +#define LED_PIN 13 +#define PS_ON_PIN 1 +#define ALARM_PIN -1 + +#define FILWIDTH_PIN 6 +#define SOL1_PIN 28 + +#if 0 +// Pretty sure this is obsolete! +// Please use Marlin 1.1.x pins files as reference for new pins files. +#ifndef SDSUPPORT + // these are defined in the SD library if building with SD support + #define SCK_PIN 13 + #define MISO_PIN 12 + #define MOSI_PIN 11 +#endif +#endif + +#if ENABLED(ULTRA_LCD) + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 41 + #define LCD_PINS_D4 42 + #define LCD_PINS_D5 43 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 45 + #define BTN_EN1 46 + #define BTN_EN2 47 + #define BTN_ENC 48 +#endif diff --git a/Marlin/src/pins/pins_TEENSYLU.h b/Marlin/src/pins/pins_TEENSYLU.h new file mode 100755 index 0000000000..e733b98287 --- /dev/null +++ b/Marlin/src/pins/pins_TEENSYLU.h @@ -0,0 +1,163 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Rev C 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. All have been used with Arduino 1.6.12 + * + * Teensyduino - http://www.pjrc.com/teensy/teensyduino.html + * Select Teensy++ 2.0 in Arduino IDE from the 'Tools -> Boards' menu + * + * Installation instructions are at the above URL. Don't bother loading the + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * This is basically Teensyduino but with a bootloader that can handle image sizes + * larger than 64K. + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools -> Boards' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + + /** + * SILKSCREEN ERROR + * + * The silkscreen for the endstops do NOT match the schematic. The silkscreen SHOULD + * read (from left to right) X-STOP, Y-STOP, Z-STOP & E-STOP. The silkscreen actually + * reads E-STOP, X-STOP, Y-STOP & Z-STOP. + * + * The pin assignments in this file match the silkscreen. + */ + +#if !defined(__AVR_AT90USB1286__) && !defined(__AVR_AT90USB1286P__) + #error "Oops! Make sure you have 'Teensy++ 2.0' or 'Printrboard' selected from the 'Tools -> Boards' menu." +#endif + +#define BOARD_NAME "Teensylu" + +// +// Limit Switch definitions that match the SCHEMATIC +// +//#define X_STOP_PIN 25 // B5 +//#define Y_STOP_PIN 26 // B6 +//#define Z_STOP_PIN 27 // B7 +//#define E_STOP_PIN 36 // E4 + + +// +// Limit Switch definitions that match the SILKSCREEN +// +#define X_STOP_PIN 26 // B6 +#define Y_STOP_PIN 27 // B7 +#define Z_STOP_PIN 36 // E4 +//#define E_STOP_PIN 25 // B5 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 19 // E7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 18 // E6 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 17 // C7 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 13 // C3 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // Analog Input (Extruder) +#define TEMP_BED_PIN 6 // Analog Input (Bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B - Extruder +#define HEATER_BED_PIN 14 // C4 PWM3C + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 JP31-6 +#define CASE_LIGHT_PIN 0 // D0 IO-14 PWM0B + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) && ENABLED(NEWPANEL) + + #define BEEPER_PIN -1 + + #if ENABLED(LCD_I2C_PANELOLU2) + #define BTN_EN1 3 // D3 IO-8 + #define BTN_EN2 2 // D2 IO-10 + #define BTN_ENC 41 // F3 IO-7 + #define SDSS 38 // F0 IO-13 use SD card on Panelolu2 + #endif + + #define SD_DETECT_PIN -1 + +#endif // ULTRA_LCD && NEWPANEL + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 24 // B4 IO-3 PWM2A - MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 39 // F1 IO-11 - Pin should have a pullup! +#define SPINDLE_DIR_PIN 40 // F2 IO-9 diff --git a/Marlin/src/pins/pins_THE_BORG.h b/Marlin/src/pins/pins_THE_BORG.h new file mode 100644 index 0000000000..8a762fba21 --- /dev/null +++ b/Marlin/src/pins/pins_THE_BORG.h @@ -0,0 +1,186 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#if !defined(STM32F7) + #error "Oops! Make sure you have an STM32F7 board selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "The-Borge" +#define BOARD_NAME "The-Borge" + +#define E2END 0xFFF // EEPROM end address + +// Ignore temp readings during develpment. +#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE + +#if E_STEPPERS > 3 || HOTENDS > 3 + #error "The-Borg supports up to 3 hotends / E-steppers." +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PE9 +#define X_MAX_PIN PE10 +#define Y_MIN_PIN PE7 +#define Y_MAX_PIN PE8 +#define Z_MIN_PIN PF15 +#define Z_MAX_PIN PG0 +#define E_MIN_PIN PE2 +#define E_MAX_PIN PE3 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PA4 +#endif + +// +// Steppers +// +#define STEPPER_ENABLE_PIN PE0 + +#define X_STEP_PIN PC6 // 96, 39 in Arduino +#define X_DIR_PIN PC7 +#define X_ENABLE_PIN PC8 + + +#define Y_STEP_PIN PD9 +#define Y_DIR_PIN PD10 +#define Y_ENABLE_PIN PD11 + +#define Z_STEP_PIN PE15 +#define Z_DIR_PIN PG1 +#define Z_ENABLE_PIN PD8 + + +#define E0_STEP_PIN PB1 +#define E0_DIR_PIN PB2 +#define E0_ENABLE_PIN PE11 + + +#define E1_STEP_PIN PC4 +#define E1_DIR_PIN PC5 +#define E1_ENABLE_PIN PB0 + + +#define E2_STEP_PIN PC13 +#define E2_DIR_PIN PC14 +#define E2_ENABLE_PIN PC15 + +#define Z2_STEP_PIN PC13 +#define Z2_DIR_PIN PC14 +#define Z2_ENABLE_PIN PC15 + + +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 + +#define SPI1_SCK_PIN PA5 +#define SPI1_MISO_PIN PA6 +#define SPI1_MOSI_PIN PA7 + +#define SPI6_SCK_PIN PG13 +#define SPI6_MISO_PIN PG12 +#define SPI6_MOSI_PIN PG14 + +// +// Temperature Sensors +// + +#define TEMP_0_PIN PC3 // Analog Input +#define TEMP_1_PIN PC2 // Analog Input +#define TEMP_2_PIN PC1 // Analog Input +#define TEMP_3_PIN PC0 // Analog Input + +#define TEMP_BED_PIN PF10 // Analog Input + +#define TEMP_5_PIN PE12 // Analog Input, Probe temp + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD15 +#define HEATER_1_PIN PD14 +#define HEATER_BED_PIN PF6 + +#ifndef FAN_PIN + #define FAN_PIN PD13 +#endif +#define FAN1_PIN PA0 +#define FAN2_PIN PA1 + +#define ORIG_E0_AUTO_FAN_PIN PA1 // Use this by NOT overriding E0_AUTO_FAN_PIN + +// +// Misc. Functions +// + +//#define CASE_LIGHT_PIN_CI PF13 +//#define CASE_LIGHT_PIN_DO PF14 +//#define NEOPIXEL_PIN PF13 + +// +// Prusa i3 MK2 Multi Material Multiplexer Support +// + +#define E_MUX0_PIN PG3 +#define E_MUX1_PIN PG4 + +// +// Servos +// + +#define SERVO0_PIN PE13 +#define SERVO1_PIN PE14 + + +#define SDSS PA8 +#define SS_PIN PA8 +#define LED_PIN PA2 // Alive +#define PS_ON_PIN PA3 +#define KILL_PIN -1 //PD5 // EXP2-10 +#define PWR_LOSS PG5 // Power loss / nAC_FAULT + +// +// MAX7219_DEBUG +// +#define MAX7219_CLK_PIN PG10 // EXP1-1 +#define MAX7219_DIN_PIN PD7 // EXP1-3 +#define MAX7219_LOAD_PIN PD1 // EXP1-5 + +// +// LCD / Controller +// +//#define SD_DETECT_PIN -1 //PB6) // EXP2-4 +#define BEEPER_PIN PG10 // EXP1-1 +#define LCD_PINS_RS PG9 // EXP1-4 +#define LCD_PINS_ENABLE PD7 // EXP1-3 +#define LCD_PINS_D4 PD1 // EXP1-5 +#define LCD_PINS_D5 PF0 // EXP1-6 +#define LCD_PINS_D6 PD3 // EXP1-7 +#define LCD_PINS_D7 PD4 // EXP1-8 +#define BTN_EN1 PD6 // EXP2-5 +#define BTN_EN2 PD0 // EXP2-3 +#define BTN_ENC PG11 // EXP1-2 diff --git a/Marlin/src/pins/pins_TRIGORILLA_13.h b/Marlin/src/pins/pins_TRIGORILLA_13.h new file mode 100644 index 0000000000..0907eaf286 --- /dev/null +++ b/Marlin/src/pins/pins_TRIGORILLA_13.h @@ -0,0 +1,41 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Arduino Mega with RAMPS v1.3 for Anycubic + */ + +#ifndef BOARD_NAME + #define BOARD_NAME "Anycubic RAMPS 1.3" +#endif + +#define IS_RAMPS_EFB +#define RAMPS_D9_PIN 44 +#define FAN2_PIN 9 +#define ORIG_E0_AUTO_FAN_PIN 9 + +#include "pins_RAMPS_13.h" + +#undef E1_STEP_PIN +#undef E1_DIR_PIN +#undef E1_ENABLE_PIN +#undef E1_CS_PIN diff --git a/Marlin/src/pins/pins_TRIGORILLA_14.h b/Marlin/src/pins/pins_TRIGORILLA_14.h new file mode 100644 index 0000000000..70b0a930a9 --- /dev/null +++ b/Marlin/src/pins/pins_TRIGORILLA_14.h @@ -0,0 +1,36 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Arduino Mega with RAMPS v1.4 for Anycubic + */ + +#ifndef BOARD_NAME + #define BOARD_NAME "Anycubic RAMPS 1.4" +#endif + +#define IS_RAMPS_EFB + +#define FAN2_PIN 44 +#define ORIG_E0_AUTO_FAN_PIN 44 + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/pins_ULTIMAIN_2.h b/Marlin/src/pins/pins_ULTIMAIN_2.h new file mode 100644 index 0000000000..ea7a8325c0 --- /dev/null +++ b/Marlin/src/pins/pins_ULTIMAIN_2.h @@ -0,0 +1,137 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Ultiboard v2.0 pin assignments + */ + +/** + * Rev B 2 JAN 2017 + * + * Added pin definitions for: + * M3, M4 & M5 spindle control commands + * case light + */ + +#ifndef __AVR_ATmega2560__ + #error "Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "Ultimaker" +#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" +#define BOARD_NAME "Ultimaker 2.x" + +// +// Limit Switches +// +#define X_STOP_PIN 22 +#define Y_STOP_PIN 26 +#define Z_STOP_PIN 29 + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 32 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 31 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 36 +#define Z_ENABLE_PIN 34 + +#define E0_STEP_PIN 42 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 37 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +#define MOTOR_CURRENT_PWM_XY_PIN 44 +#define MOTOR_CURRENT_PWM_Z_PIN 45 +#define MOTOR_CURRENT_PWM_E_PIN 46 +// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range +#ifndef MOTOR_CURRENT_PWM_RANGE + #define MOTOR_CURRENT_PWM_RANGE 2000 +#endif +#define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 // Analog Input +#define TEMP_1_PIN 9 // Analog Input +#define TEMP_BED_PIN 10 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define SD_DETECT_PIN 39 +#define LED_PIN 8 +#define SAFETY_TRIGGERED_PIN 28 // PIN to detect the safety circuit has triggered +#define MAIN_VOLTAGE_MEASURE_PIN 14 // ANALOG PIN to measure the main voltage, with a 100k - 4k7 resitor divider. + +// +// LCD / Controller +// +#define BEEPER_PIN 18 + +#define LCD_PINS_RS 20 +#define LCD_PINS_ENABLE 15 +#define LCD_PINS_D4 14 +#define LCD_PINS_D5 21 +#define LCD_PINS_D6 5 +#define LCD_PINS_D7 6 + +// Buttons are directly attached +#define BTN_EN1 40 +#define BTN_EN2 41 +#define BTN_ENC 19 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) // use the LED_PIN for spindle speed control or case light + #undef LED_PIN + #define SPINDLE_DIR_PIN 16 + #define SPINDLE_LASER_ENABLE_PIN 17 // Pin should have a pullup! + #define SPINDLE_LASER_PWM_PIN 8 // MUST BE HARDWARE PWM +#else + #undef LED_PIN + #define CASE_LIGHT_PIN 8 +#endif diff --git a/Marlin/src/pins/pins_ULTIMAKER.h b/Marlin/src/pins/pins_ULTIMAKER.h new file mode 100644 index 0000000000..23941a1624 --- /dev/null +++ b/Marlin/src/pins/pins_ULTIMAKER.h @@ -0,0 +1,164 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Ultimaker pin assignments + */ + +/** + * Rev B 2 JAN 2017 + * + * Added pin definitions for: + * M3, M4 & M5 spindle control commands + * case light + */ + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "Ultimaker" +#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" +#define BOARD_NAME "Ultimaker" + +// +// Servos +// +#define SERVO0_PIN 11 + +// +// Limit Switches +// +#define X_MIN_PIN 22 +#define X_MAX_PIN 24 +#define Y_MIN_PIN 26 +#define Y_MAX_PIN 28 +#define Z_MIN_PIN 30 +#define Z_MAX_PIN 32 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 31 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 37 +#define Z_DIR_PIN 39 +#define Z_ENABLE_PIN 35 + +#define E0_STEP_PIN 43 +#define E0_DIR_PIN 45 +#define E0_ENABLE_PIN 41 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 // Analog Input +#define TEMP_1_PIN 9 // Analog Input +#define TEMP_BED_PIN 10 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 +#define SUICIDE_PIN 54 // PIN that has to be turned on right after start, to keep power flowing. +#define CASE_LIGHT_PIN 8 + +// +// LCD / Controller +// +#if ENABLED(ULTRA_LCD) + + #define BEEPER_PIN 18 + + #if ENABLED(NEWPANEL) + + #define LCD_PINS_RS 20 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 16 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 6 + + // buttons are directly attached + #define BTN_EN1 40 + #define BTN_EN2 42 + #define BTN_ENC 19 + + #define SD_DETECT_PIN 38 + + #else // !NEWPANEL - Old style panel with shift register + + // buttons are attached to a shift register + #define SHIFT_CLK 38 + #define SHIFT_LD 42 + #define SHIFT_OUT 40 + #define SHIFT_EN 17 + + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 6 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 20 + #define LCD_PINS_D7 19 + + #define SD_DETECT_PIN -1 + + #endif // !NEWPANEL + +#endif // ULTRA_LCD + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 9 // MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENABLE_PIN 10 // Pin should have a pullup! +#define SPINDLE_DIR_PIN 11 // use the EXP3 PWM header diff --git a/Marlin/src/pins/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/pins_ULTIMAKER_OLD.h new file mode 100644 index 0000000000..c07f2d0e75 --- /dev/null +++ b/Marlin/src/pins/pins_ULTIMAKER_OLD.h @@ -0,0 +1,281 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * Ultimaker pin assignments (Old electronics) + */ + + /** + * Rev B 3 JAN 2017 + * + * Details on pin definitions for M3, M4 & M5 spindle control commands and for + * the CASE_LIGHT_PIN are at the end of this file. + * + * This started out as an attempt to add pin definitions for M3, M4 & M5 spindle + * control commands but quickly turned into a head scratcher as the sources for + * the revisions provided inconsistent information. + * + * As best I can determine: + * 1.5.3 boards should use the pins_ULTIMAKER.h file which means the BOARD_NAME + * define in this file should say 1.5.3 rather than 1.5.4 + * This file is meant for 1.1 - 1.3 boards. + * The endstops for the 1.0 boards use different definitions than on the 1.1 - 1.3 + * boards. + * + * I've added sections that have the 1.0 and 1.5.3 + endstop definitions so you can + * easily switch if needed. I've also copied over the 1.5.3 + LCD definitions. + * + * To be 100% sure of the board you have: + * 1. In Configuration_adv.h enable "PINS_DEBUGGING" + * 2. Compile & uploade + * 3. Enter the command "M43 W1 I1". This command will report that pin nmumber and + * name of any pin that changes state. + * 4. Using a 1k (approximately) resistor pull the endstops and some of the LCD pins + * to ground and see what is reported. + * 5. If the reported pin doesn't match the file then try a different board revision + * and repeat steps 2 - 5 + */ + +#define board_rev_1_1_TO_1_3 +//#define board_rev_1_0 +//#define board_rev_1_5 + + +#if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +#define DEFAULT_MACHINE_NAME "Ultimaker" +#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" +#define BOARD_NAME "Ultimaker <1.5.4" + +// +// Limit Switches +// +#if ENABLED(board_rev_1_1_TO_1_3) + #define X_MIN_PIN 15 // SW1 + #define X_MAX_PIN 14 // SW2 + #define Y_MIN_PIN 17 // SW3 + #define Y_MAX_PIN 16 // SW4 + #define Z_MIN_PIN 19 // SW5 + #define Z_MAX_PIN 18 // SW6 +#endif + +#if ENABLED(board_rev_1_0) + #define X_MIN_PIN 13 // SW1 + #define X_MAX_PIN 12 // SW2 + #define Y_MIN_PIN 11 // SW3 + #define Y_MAX_PIN 10 // SW4 + #define Z_MIN_PIN 9 // SW5 + #define Z_MAX_PIN 8 // SW6 +#endif + +#if ENABLED(board_rev_1_5) + #define X_MIN_PIN 22 + #define X_MAX_PIN 24 + #define Y_MIN_PIN 26 + #define Y_MAX_PIN 28 + #define Z_MIN_PIN 30 + #define Z_MAX_PIN 32 +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN Z_MAX_PIN +#endif + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 31 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 37 +#define Z_DIR_PIN 39 +#define Z_ENABLE_PIN 35 + +#define E0_STEP_PIN 43 +#define E0_DIR_PIN 45 +#define E0_ENABLE_PIN 41 + +#define E1_STEP_PIN -1 // 49 +#define E1_DIR_PIN -1 // 47 +#define E1_ENABLE_PIN -1 // 48 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 // Analog Input +#define TEMP_1_PIN 1 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +//#define HEATER_1_PIN 3 // used for case light Rev A said "1" +#define HEATER_BED_PIN 4 + +// +// LCD / Controller +// +#if ENABLED(board_rev_1_0) || ENABLED(board_rev_1_1_TO_1_3) + #define LCD_PINS_RS 24 + #define LCD_PINS_ENABLE 22 + #define LCD_PINS_D4 36 + #define LCD_PINS_D5 34 + #define LCD_PINS_D6 32 + #define LCD_PINS_D7 30 +#elif ENABLED(board_rev_1_5) && ENABLED(ULTRA_LCD) + + #define BEEPER_PIN 18 + + #if ENABLED(NEWPANEL) + + #define LCD_PINS_RS 20 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 16 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 6 + + // buttons are directly attached + #define BTN_EN1 40 + #define BTN_EN2 42 + #define BTN_ENC 19 + + #define SD_DETECT_PIN 38 + + #else // !NEWPANEL - Old style panel with shift register + + // buttons are attached to a shift register + #define SHIFT_CLK 38 + #define SHIFT_LD 42 + #define SHIFT_OUT 40 + #define SHIFT_EN 17 + + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 6 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 20 + #define LCD_PINS_D7 19 + + #define SD_DETECT_PIN -1 + + #endif // !NEWPANEL + +#endif // ULTRA_LCD + +// +// case light - see spindle section for more info on available hardware PWMs +// +#if !PIN_EXISTS(CASE_LIGHT) && ENABLED(board_rev_1_5) + #define CASE_LIGHT_PIN 7 // use PWM - MUST BE HARDWARE PWM +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) + + #if ENABLED(board_rev_1_0) // use the last three SW positions + + #undef Z_MIN_PROBE_PIN + #undef X_MIN_PIN // SW1 + #undef X_MAX_PIN // SW2 + #undef Y_MIN_PIN // SW3 + #undef Y_MAX_PIN // SW4 + #undef Z_MIN_PIN // SW5 + #undef Z_MAX_PIN // SW6 + + #define X_STOP_PIN 13 // SW1 (didn't change) - also has a useable hardware PWM + #define Y_STOP_PIN 12 // SW2 + #define Z_STOP_PIN 11 // SW3 + + #define SPINDLE_DIR_PIN 10 // SW4 + #define SPINDLE_LASER_PWM_PIN 9 // SW5 MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENABLE_PIN 8 // SW6 Pin should have a pullup! + + #elif ENABLED(board_rev_1_5) // use the same pins - but now they are on a different connector + + #define SPINDLE_DIR_PIN 10 // EXP3-6 (silkscreen says 10) + #define SPINDLE_LASER_PWM_PIN 9 // EXP3-7 (silkscreen says 9) MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENABLE_PIN 8 // EXP3-8 (silkscreen says 8) Pin should have a pullup! + + #elif ENABLED(board_rev_1_1_TO_1_3) + + /** + * Only four hardware PWMs physically connected to anything on these boards: + * + * HEATER_0_PIN 2 silkscreen varies - usually "PWM 1" or "HEATER1" + * HEATER_1_PIN 3 silkscreen varies - usually "PWM 2" or "HEATER2" + * HEATER_BED_PIN 4 silkscreen varies - usually "PWM 3" or "HEATED BED" + * E0_DIR_PIN 45 + * + * If one of the heaters is used then special precautions will usually be needed. + * They have an LED and resistor pullup to +24V which could damage 3.3V-5V ICs. + */ + #if EXTRUDERS == 1 // Move E0 stepper module to the spare and get signals from E0 + #undef E0_STEP_PIN + #undef E0_DIR_PIN + #undef E0_ENABLE_PIN + #define E0_STEP_PIN 49 + #define E0_DIR_PIN 47 + #define E0_ENABLE_PIN 48 + #define SPINDLE_DIR_PIN 43 + #define SPINDLE_LASER_PWM_PIN 45 // MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENABLE_PIN 41 // Pin should have a pullup! + #elif TEMP_SENSOR_BED == 0 // Can't use E0 so see if HEATER_BED_PIN is available + #undef HEATER_BED_PIN + #define SPINDLE_DIR_PIN 38 // Probably pin 4 on 10 pin connector closest to the E0 socket + #define SPINDLE_LASER_PWM_PIN 4 // MUST BE HARDWARE PWM - Special precautions usually needed. + #define SPINDLE_LASER_ENABLE_PIN 40 // Pin should have a pullup! (Probably pin 6 on the 10-pin + // connector closest to the E0 socket) + #endif + #endif +#endif + +/** + * Where to get the spindle signals on the E0 socket + * + * spindle signal socket name socket name + * ------- + * SPINDLE_LASER_ENABLE_PIN /ENABLE *| |O VMOT + * MS1 O| |O GND + * MS2 O| |O 2B + * MS3 O| |O 2A + * /RESET O| |O 1A + * /SLEEP O| |O 1B + * SPINDLE_DIR_PIN STEP O| |O VDD + * SPINDLE_LASER_PWM_PIN DIR O| |O GND + * ------- + * * - pin closest to MS1, MS2 & MS3 jumpers on the board + * + * Note: Socket names vary from vendor to vendor. + */ diff --git a/Marlin/src/pins/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/pins_ULTRATRONICS_PRO.h new file mode 100644 index 0000000000..42bdd7f645 --- /dev/null +++ b/Marlin/src/pins/pins_ULTRATRONICS_PRO.h @@ -0,0 +1,153 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * ReprapWorld ULTRATRONICS v1.0 + */ + +#define KNOWN_BOARD +#define BOARD_NAME "Ultratronics v1.0" + +#ifndef ARDUINO_ARCH_SAM + #error Oops! Make sure you have 'Arduino Due' selected from the 'Tools -> Boards' menu. +#endif + +// +// Servos +// +#if NUM_SERVOS > 0 + #define SERVO0_PIN 11 + #if NUM_SERVOS > 1 + #define SERVO1_PIN 12 + #endif +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 31 +#define X_MAX_PIN 30 +#define Y_MIN_PIN 12 +#define Y_MAX_PIN 11 +#define Z_MIN_PIN 29 +#define Z_MAX_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 35 +#define X_DIR_PIN 34 +#define X_ENABLE_PIN 37 + +#define Y_STEP_PIN 22 +#define Y_DIR_PIN 23 +#define Y_ENABLE_PIN 33 + +#define Z_STEP_PIN 25 +#define Z_DIR_PIN 26 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 47 +#define E0_DIR_PIN 46 +#define E0_ENABLE_PIN 48 + +#define E1_STEP_PIN 44 +#define E1_DIR_PIN 36 +#define E1_ENABLE_PIN 45 + +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 41 +#define E2_ENABLE_PIN 43 + +#define E3_STEP_PIN 39 +#define E3_DIR_PIN 38 +#define E3_ENABLE_PIN 40 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 2 // Analog Input +#define TEMP_2_PIN 3 // Analog Input +#define TEMP_3_PIN 4 // Analog Input +#define TEMP_BED_PIN 1 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 +#define HEATER_1_PIN 8 +#define HEATER_2_PIN 7 +#define HEATER_3_PIN 9 +#define HEATER_BED_PIN 2 + +#ifndef FAN_PIN + #define FAN_PIN 6 +#endif +#define FAN2_PIN 5 + +// +// Misc. Functions +// +#define SDSS 59 +#define SD_DETECT_PIN 60 +#define LED_PIN 13 +#define PS_ON_PIN 32 + +// +// SPI Buses +// + +#define DAC0_SYNC 53 // PB14 +#define SPI_CHAN_DAC 1 + +#define SPI_CHAN_EEPROM1 -1 +#define SPI_EEPROM1_CS -1 +#define SPI_EEPROM2_CS -1 +#define SPI_FLASH_CS -1 + +// SPI for Max6675 or Max31855 Thermocouple +#define MAX6675_SS 65 +#define MAX31855_SS0 65 +#define MAX31855_SS1 52 +#define MAX31855_SS2 50 +#define MAX31855_SS3 51 + +#define ENC424_SS 61 + +// +// LCD / Controller +// + +#define BEEPER_PIN 27 + +#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define LCD_PINS_RS A8 // CS chip select / SS chip slave select + #define LCD_PINS_ENABLE MOSI // SID (MOSI) + #define LCD_PINS_D4 SCK // SCK (CLK) clock + + #define BTN_EN1 20 + #define BTN_EN2 21 + #define BTN_ENC 64 + +#endif // REPRAPWORLD_GRAPHICAL_LCD diff --git a/Marlin/src/pins/pins_ZRIB_V20.h b/Marlin/src/pins/pins_ZRIB_V20.h new file mode 100644 index 0000000000..94a083dd40 --- /dev/null +++ b/Marlin/src/pins/pins_ZRIB_V20.h @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * ZRIB V2.0 pin assignments + */ + +#define ZRIB_V20_D6_PIN 6 +#define ZRIB_V20_D9_PIN 9 +#define RAMPS_D9_PIN ZRIB_V20_D6_PIN +#define ORIG_E0_AUTO_FAN_PIN ZRIB_V20_D9_PIN +#define ORIG_E1_AUTO_FAN_PIN ZRIB_V20_D9_PIN +#define ORIG_E2_AUTO_FAN_PIN ZRIB_V20_D9_PIN +#define ORIG_E3_AUTO_FAN_PIN ZRIB_V20_D9_PIN + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 11 // Analog Input +#endif + +#include "pins_MKS_GEN_13.h" diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h deleted file mode 100644 index 2ea15c97d3..0000000000 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ /dev/null @@ -1,191 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Einsy-Rambo pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Einsy Rambo" - -// -// TMC2130 Configuration_adv defaults for EinsyRambo -// -#if !AXIS_DRIVER_TYPE_X(TMC2130) || !AXIS_DRIVER_TYPE_Y(TMC2130) || !AXIS_DRIVER_TYPE_Z(TMC2130) || !AXIS_DRIVER_TYPE_E0(TMC2130) - #error "You must set ([XYZ]|E0)_DRIVER_TYPE to TMC2130 in Configuration.h for EinsyRambo." -#endif - -// TMC2130 Diag Pins (currently just for reference) -#define X_DIAG_PIN 64 -#define Y_DIAG_PIN 69 -#define Z_DIAG_PIN 68 -#define E0_DIAG_PIN 65 - -// -// Limit Switches -// -// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. -// Otherwise use a physical endstop based configuration. -// -// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING. -// - -#if DISABLED(SENSORLESS_HOMING) - - #define X_STOP_PIN 12 - #define Y_STOP_PIN 11 - #define Z_STOP_PIN 10 - -#else - - #define X_STOP_PIN X_DIAG_PIN - #define Y_STOP_PIN Y_DIAG_PIN - - #if ENABLED(BLTOUCH) - #define Z_STOP_PIN 11 // Y-MIN - #define SERVO0_PIN 10 // Z-MIN - #else - #define Z_STOP_PIN 10 - #endif - -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 10 -#endif - -// -// Filament Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 62 -#endif - -// -// Steppers -// -#define X_STEP_PIN 37 -#define X_DIR_PIN 49 -#define X_ENABLE_PIN 29 -#define X_CS_PIN 41 - -#define Y_STEP_PIN 36 -#define Y_DIR_PIN 48 -#define Y_ENABLE_PIN 28 -#define Y_CS_PIN 39 - -#define Z_STEP_PIN 35 -#define Z_DIR_PIN 47 -#define Z_ENABLE_PIN 27 -#define Z_CS_PIN 67 - -#define E0_STEP_PIN 34 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 26 -#define E0_CS_PIN 66 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input -#define TEMP_PROBE_PIN 3 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 3 -#define HEATER_BED_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 8 -#endif - -#ifndef FAN1_PIN - #define FAN1_PIN 6 -#endif - -// -// Misc. Functions -// -#define SDSS 77 -#define LED_PIN 13 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 9 -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -// use P1 connector for spindle pins -#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 18 // Pullup! -#define SPINDLE_DIR_PIN 19 - -// -// Průša i3 MK2 Multiplexer Support -// -#define E_MUX0_PIN 17 -#define E_MUX1_PIN 16 -#define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 - -// -// LCD / Controller -// -#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL - - #define KILL_PIN 32 - - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL - - #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS 85 - #define LCD_PINS_ENABLE 71 - #define LCD_PINS_D4 70 - #define BTN_EN1 61 - #define BTN_EN2 59 - #else - #define LCD_PINS_RS 82 - #define LCD_PINS_ENABLE 61 - #define LCD_PINS_D4 59 - #define LCD_PINS_D5 70 - #define LCD_PINS_D6 85 - #define LCD_PINS_D7 71 - #define BTN_EN1 14 - #define BTN_EN2 72 - #endif - - #define BTN_ENC 9 // AUX-2 - #define BEEPER_PIN 84 // AUX-4 - #define SD_DETECT_PIN 15 - - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h deleted file mode 100644 index 4a1bf70b6e..0000000000 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Einsy-Retro pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Einsy Retro" - -// -// TMC2130 Configuration_adv defaults for EinsyRetro -// -#if !AXIS_DRIVER_TYPE_X(TMC2130) || !AXIS_DRIVER_TYPE_Y(TMC2130) || !AXIS_DRIVER_TYPE_Z(TMC2130) || !AXIS_DRIVER_TYPE_E0(TMC2130) - #error "You must set ([XYZ]|E0)_DRIVER_TYPE to TMC2130 in Configuration.h for EinsyRetro." -#endif - -// TMC2130 Diag Pins -#define X_DIAG_PIN 64 -#define Y_DIAG_PIN 69 -#define Z_DIAG_PIN 68 -#define E0_DIAG_PIN 65 - -// -// Limit Switches -// -// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. -// Otherwise use a physical endstop based configuration. -// -// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING. -// - -#if DISABLED(SENSORLESS_HOMING) - - #define X_MIN_PIN 12 // X- - #define Y_MIN_PIN 11 // Y- - #define Z_MIN_PIN 10 // Z- - #define X_MAX_PIN 81 // X+ - #define Y_MAX_PIN 57 // Y+ - -#else - - #if X_HOME_DIR < 0 - #define X_MIN_PIN X_DIAG_PIN - #define X_MAX_PIN 81 // X+ - #else - #define X_MIN_PIN 12 // X- - #define X_MAX_PIN X_DIAG_PIN - #endif - - #if Y_HOME_DIR < 0 - #define Y_MIN_PIN Y_DIAG_PIN - #define Y_MAX_PIN 57 // Y+ - #else - #define Y_MIN_PIN 11 // Y- - #define Y_MAX_PIN Y_DIAG_PIN - #endif - - #if ENABLED(BLTOUCH) - #define Z_MIN_PIN 11 // Y-MIN - #define SERVO0_PIN 10 // Z-MIN - #else - #define Z_MIN_PIN 10 - #endif - -#endif - -#define Z_MAX_PIN 7 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 10 -#endif - -// -// Steppers -// -#define X_STEP_PIN 37 -#define X_DIR_PIN 49 -#define X_ENABLE_PIN 29 -#define X_CS_PIN 41 - -#define Y_STEP_PIN 36 -#define Y_DIR_PIN 48 -#define Y_ENABLE_PIN 28 -#define Y_CS_PIN 39 - -#define Z_STEP_PIN 35 -#define Z_DIR_PIN 47 -#define Z_ENABLE_PIN 27 -#define Z_CS_PIN 67 - -#define E0_STEP_PIN 34 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 26 -#define E0_CS_PIN 66 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 3 -#define HEATER_BED_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 8 -#endif -#define FAN1_PIN 6 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 9 -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -// use P1 connector for spindle pins -#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 18 // Pullup! -#define SPINDLE_DIR_PIN 19 - -// -// Průša i3 MK2 Multiplexer Support -// -#define E_MUX0_PIN 17 -#define E_MUX1_PIN 16 -#define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 - -// -// LCD / Controller -// -#if ANY(HAS_WIRED_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) - - #define KILL_PIN 32 - - #if ANY(ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) - - #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS 85 - #define LCD_PINS_ENABLE 71 - #define LCD_PINS_D4 70 - #define BTN_EN1 18 - #define BTN_EN2 19 - #else - #define LCD_PINS_RS 82 - #define LCD_PINS_ENABLE 18 // On 0.6b, use 61 - #define LCD_PINS_D4 19 // On 0.6b, use 59 - #define LCD_PINS_D5 70 - #define LCD_PINS_D6 85 - #define LCD_PINS_D7 71 - #define BTN_EN1 14 - #define BTN_EN2 72 - #endif - - #define BTN_ENC 9 // AUX-2 - #define BEEPER_PIN 84 // AUX-4 - - #define SD_DETECT_PIN 15 - - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE - -#endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h deleted file mode 100644 index 6314bc07b8..0000000000 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Mini-RAMBo pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'RAMBo' in 'Tools > Board' or the Mega2560 environment in PlatformIO." -#endif - -#if MB(MINIRAMBO_10A) - #define BOARD_INFO_NAME "Mini RAMBo 1.0a" -#else - #define BOARD_INFO_NAME "Mini RAMBo" -#endif - -// -// Limit Switches -// -#define X_MIN_PIN 12 -#define X_MAX_PIN 30 -#define Y_MIN_PIN 11 -#define Y_MAX_PIN 24 -#define Z_MIN_PIN 10 -#define Z_MAX_PIN 23 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 23 -#endif - -// -// Steppers -// -#define X_STEP_PIN 37 -#define X_DIR_PIN 48 -#define X_ENABLE_PIN 29 - -#define Y_STEP_PIN 36 -#define Y_DIR_PIN 49 -#define Y_ENABLE_PIN 28 - -#define Z_STEP_PIN 35 -#define Z_DIR_PIN 47 -#define Z_ENABLE_PIN 27 - -#define E0_STEP_PIN 34 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 26 - -// Microstepping pins - Mapping not from fastio.h (?) -#define X_MS1_PIN 40 -#define X_MS2_PIN 41 -#define Y_MS1_PIN 69 -#define Y_MS2_PIN 39 -#define Z_MS1_PIN 68 -#define Z_MS2_PIN 67 -#define E0_MS1_PIN 65 -#define E0_MS2_PIN 66 - -#define MOTOR_CURRENT_PWM_XY_PIN 46 -#define MOTOR_CURRENT_PWM_Z_PIN 45 -#define MOTOR_CURRENT_PWM_E_PIN 44 -// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range -#ifndef MOTOR_CURRENT_PWM_RANGE - #define MOTOR_CURRENT_PWM_RANGE 2000 -#endif -#define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 3 -#define HEATER_1_PIN 7 -#if !MB(MINIRAMBO_10A) - #define HEATER_2_PIN 6 -#endif -#define HEATER_BED_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 8 -#endif -#define FAN1_PIN 6 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#if !MB(MINIRAMBO_10A) - #define CASE_LIGHT_PIN 9 -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -// use P1 connector for spindle pins -#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 18 // Pullup! -#define SPINDLE_DIR_PIN 19 - -// -// Průša i3 MK2 Multiplexer Support -// -#define E_MUX0_PIN 17 -#define E_MUX1_PIN 16 -#if !MB(MINIRAMBO_10A) - #define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 -#endif - -// -// LCD / Controller -// -#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL - - #if !MB(MINIRAMBO_10A) - #define KILL_PIN 32 - #endif - - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL - - #if MB(MINIRAMBO_10A) - - #define BEEPER_PIN 78 - - #define BTN_EN1 80 - #define BTN_EN2 73 - #define BTN_ENC 21 - - #define LCD_PINS_RS 38 - #define LCD_PINS_ENABLE 5 - #define LCD_PINS_D4 14 - #define LCD_PINS_D5 15 - #define LCD_PINS_D6 32 - #define LCD_PINS_D7 31 - - #define SD_DETECT_PIN 72 - - #else // !MINIRAMBO_10A - - // AUX-4 - #define BEEPER_PIN 84 - - // AUX-2 - #define BTN_EN1 14 - #define BTN_EN2 72 - #define BTN_ENC 9 - - #define LCD_PINS_RS 82 - #define LCD_PINS_ENABLE 18 - #define LCD_PINS_D4 19 - #define LCD_PINS_D5 70 - #define LCD_PINS_D6 85 - #define LCD_PINS_D7 71 - - #define SD_DETECT_PIN 15 - - #endif // !MINIRAMBO_10A - - #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL - -#endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h deleted file mode 100644 index 735852b2ff..0000000000 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ /dev/null @@ -1,252 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * IMPORTANT NOTE: - * Rambo users should be sure to compile Marlin using either the RAMBo - * board type if using the Arduino IDE - available via the link below - or - * the 'rambo' environment if using platformio, by specifying '-e rambo' on - * the command line or by changing the value of the 'env_default' variable to - * 'rambo' in the supplied platformio.ini. - * - * If you don't compile using the proper board type, the RAMBo's extended - * pins will likely be unavailable and accessories/addons may not work. - * - * Instructions for installing the Arduino RAMBo board type for the - * Arduino IDE are available at: - * https://reprap.org/wiki/Rambo_firmware - */ - -/** - * Rambo pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Rambo" - -// -// Servos -// -#define SERVO0_PIN 22 // Motor header MX1 -#define SERVO1_PIN 23 // Motor header MX2 -#define SERVO2_PIN 24 // Motor header MX3 -#define SERVO3_PIN 5 // PWM header pin 5 - -// -// Limit Switches -// -#define X_MIN_PIN 12 -#define X_MAX_PIN 24 -#define Y_MIN_PIN 11 -#define Y_MAX_PIN 23 -#define Z_MIN_PIN 10 -#define Z_MAX_PIN 30 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 30 -#endif - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 5 -#endif - -// -// Steppers -// -#define X_STEP_PIN 37 -#define X_DIR_PIN 48 -#define X_ENABLE_PIN 29 - -#define Y_STEP_PIN 36 -#define Y_DIR_PIN 49 -#define Y_ENABLE_PIN 28 - -#define Z_STEP_PIN 35 -#define Z_DIR_PIN 47 -#define Z_ENABLE_PIN 27 - -#define E0_STEP_PIN 34 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 26 - -#define E1_STEP_PIN 33 -#define E1_DIR_PIN 42 -#define E1_ENABLE_PIN 25 - -// Microstepping pins - Mapping not from fastio.h (?) -#define X_MS1_PIN 40 -#define X_MS2_PIN 41 -#define Y_MS1_PIN 69 -#define Y_MS2_PIN 39 -#define Z_MS1_PIN 68 -#define Z_MS2_PIN 67 -#define E0_MS1_PIN 65 -#define E0_MS2_PIN 66 -#define E1_MS1_PIN 63 -#define E1_MS2_PIN 64 - -#define DIGIPOTSS_PIN 38 -#define DIGIPOT_CHANNELS { 4,5,3,0,1 } // X Y Z E0 E1 digipot channels to stepper driver mapping -#ifndef DIGIPOT_MOTOR_CURRENT - #define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 9 -#define HEATER_1_PIN 7 -#define HEATER_2_PIN 6 -#define HEATER_BED_PIN 3 - -#ifndef FAN_PIN - #define FAN_PIN 8 -#endif -#define FAN1_PIN 6 -#define FAN2_PIN 2 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define PS_ON_PIN 4 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 46 -#endif - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 3 // Analog Input -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 31 // Pullup! -#define SPINDLE_DIR_PIN 32 - -// -// SPI for Max6675 or Max31855 Thermocouple -// -#ifndef MAX6675_SS_PIN - #define MAX6675_SS_PIN 32 // SPINDLE_DIR_PIN / STAT_LED_BLUE_PIN -#endif - -// -// M7/M8/M9 - Coolant Control -// -#define COOLANT_MIST_PIN 22 -#define COOLANT_FLOOD_PIN 44 - -// -// Průša i3 MK2 Multiplexer Support -// -#define E_MUX0_PIN 17 -#define E_MUX1_PIN 16 -#define E_MUX2_PIN 84 // 84 in MK2 Firmware - -// -// LCD / Controller -// -#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL - - #define KILL_PIN 80 - - #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL - - #define LCD_PINS_RS 70 - #define LCD_PINS_ENABLE 71 - #define LCD_PINS_D4 72 - #define LCD_PINS_D5 73 - #define LCD_PINS_D6 74 - #define LCD_PINS_D7 75 - - #if ANY(VIKI2, miniVIKI) - #define BEEPER_PIN 44 - // NB: Panucatt's Viki 2.0 wiring diagram (v1.2) indicates that the - // beeper/buzzer is connected to pin 33; however, the pin used in the - // diagram is actually pin 44, so this is correct. - - #define DOGLCD_A0 70 - #define DOGLCD_CS 71 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 85 - #define BTN_EN2 84 - #define BTN_ENC 83 - - #define SD_DETECT_PIN -1 // Pin 72 if using easy adapter board - - #define STAT_LED_RED_PIN 22 - #define STAT_LED_BLUE_PIN 32 - - #else // !VIKI2 && !miniVIKI - - #define BEEPER_PIN 79 // AUX-4 - - // AUX-2 - #define BTN_EN1 76 - #define BTN_EN2 77 - #define BTN_ENC 78 - - #define SD_DETECT_PIN 81 - - #endif // !VIKI2 && !miniVIKI - - #else // !NEWPANEL - old style panel with shift register - - // No Beeper added - #define BEEPER_PIN 33 - - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 - - #define LCD_PINS_RS 75 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 - - #endif // !NEWPANEL - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h deleted file mode 100644 index 4af38e1de3..0000000000 --- a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/************************************************ - * Rambo pin assignments MODIFIED FOR Scoovo X9H - ************************************************/ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Scoovo X9H" - -// -// Servos -// -#define SERVO0_PIN 22 // Motor header MX1 -#define SERVO1_PIN 23 // Motor header MX2 -#define SERVO2_PIN 24 // Motor header MX3 -#define SERVO3_PIN 5 // PWM header pin 5 - -// -// Limit Switches -// -#define X_MIN_PIN 12 -#define X_MAX_PIN 24 -#define Y_MIN_PIN 11 -#define Y_MAX_PIN 23 -#define Z_MIN_PIN 10 -#define Z_MAX_PIN 30 - -// -// Z Probe (when not Z_MIN_IN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 30 -#endif - -// -// Steppers -// -#define X_STEP_PIN 37 -#define X_DIR_PIN 48 -#define X_ENABLE_PIN 29 - -#define Y_STEP_PIN 36 -#define Y_DIR_PIN 49 -#define Y_ENABLE_PIN 28 - -#define Z_STEP_PIN 35 -#define Z_DIR_PIN 47 -#define Z_ENABLE_PIN 27 - -#define E0_STEP_PIN 34 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 26 - -#define E1_STEP_PIN 33 -#define E1_DIR_PIN 42 -#define E1_ENABLE_PIN 25 - -// Microstepping pins - Mapping not from fastio.h (?) -#define X_MS1_PIN 40 -#define X_MS2_PIN 41 -#define Y_MS1_PIN 69 -#define Y_MS2_PIN 39 -#define Z_MS1_PIN 68 -#define Z_MS2_PIN 67 -#define E0_MS1_PIN 65 -#define E0_MS2_PIN 66 -#define E1_MS1_PIN 63 -#define E1_MS2_PIN 64 - -#define DIGIPOTSS_PIN 38 -#define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_BED_PIN 7 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 9 -#define HEATER_1_PIN 7 -#define HEATER_BED_PIN 3 - -#ifndef FAN_PIN - #define FAN_PIN 8 -#endif -#define FAN1_PIN 6 -#define FAN2_PIN 2 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define PS_ON_PIN 4 - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 3 // Analog Input -#endif - -// -// LCD / Controller -// -#define LCD_PINS_RS 70 // Ext2_5 -#define LCD_PINS_ENABLE 71 // Ext2_7 -#define LCD_PINS_D4 72 // Ext2_9 ? -#define LCD_PINS_D5 73 // Ext2_11 ? -#define LCD_PINS_D6 74 // Ext2_13 -#define LCD_PINS_D7 75 // Ext2_15 ? -#define BEEPER_PIN -1 - -#define BTN_HOME 80 // Ext_16 -#define BTN_CENTER 81 // Ext_14 -#define BTN_ENC BTN_CENTER -#define BTN_RIGHT 82 // Ext_12 -#define BTN_LEFT 83 // Ext_10 -#define BTN_UP 84 // Ext2_8 -#define BTN_DOWN 85 // Ext2_6 - -#define HOME_PIN BTN_HOME - -#if ANY(VIKI2, miniVIKI) - #define BEEPER_PIN 44 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 70 - #define DOGLCD_CS 71 - #define LCD_SCREEN_ROT_180 - - #define SD_DETECT_PIN -1 // Pin 72 if using easy adapter board - - #define STAT_LED_RED_PIN 22 - #define STAT_LED_BLUE_PIN 32 -#endif // VIKI2/miniVIKI diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h deleted file mode 100644 index f0057e1fc9..0000000000 --- a/Marlin/src/pins/ramps/pins_3DRAG.h +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * 3DRAG (and K8200 / K8400) Arduino Mega with RAMPS v1.4 pin assignments - */ - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "3Drag" -#endif - -#ifndef DEFAULT_MACHINE_NAME - #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#endif - -#ifndef DEFAULT_SOURCE_CODE_URL - #define DEFAULT_SOURCE_CODE_URL "https://3dprint.elettronicain.it/" -#endif - -// -// Heaters / Fans -// -#define RAMPS_D8_PIN 9 -#define RAMPS_D9_PIN 8 -#define MOSFET_D_PIN 12 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN -1 // Hardware PWM but one is not available on expansion header -#endif - -#include "pins_RAMPS.h" - -// -// Limit Switches -// -#undef Z_MAX_PIN - -// -// Steppers -// -#undef Z_ENABLE_PIN -#define Z_ENABLE_PIN 63 - -// -// Heaters / Fans -// -#define HEATER_2_PIN 6 - -// -// Misc. Functions -// -#undef SDSS -#define SDSS 25 - -#undef SD_DETECT_PIN -#define SD_DETECT_PIN 53 - -// -// LCD / Controller -// -#if BOTH(ULTRA_LCD, NEWPANEL) - #undef BEEPER_PIN - - #undef LCD_PINS_RS - #undef LCD_PINS_ENABLE - #undef LCD_PINS_D4 - #undef LCD_PINS_D5 - #undef LCD_PINS_D6 - #undef LCD_PINS_D7 - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 - #define LCD_PINS_D4 37 - #define LCD_PINS_D5 35 - #define LCD_PINS_D6 33 - #define LCD_PINS_D7 31 - - // Buttons - #undef BTN_EN1 - #undef BTN_EN2 - #undef BTN_ENC - #define BTN_EN1 16 - #define BTN_EN2 17 - #define BTN_ENC 23 - -#else - - #define BEEPER_PIN 33 - -#endif // ULTRA_LCD && NEWPANEL - -/** - * M3/M4/M5 - Spindle/Laser Control - * - * If you want to control the speed of your spindle then you'll have - * have to sacrifce the Extruder and pull some signals off the Z stepper - * driver socket. - * - * The following assumes: - * - the Z stepper driver socket is empty - * - the extruder driver socket has a driver board plugged into it - * - the Z stepper wires are attached the the extruder connector - * - * If you want to keep the extruder AND don't have a LCD display then - * you can still control the power on/off and spindle direction. - * - * Where to get spindle signals - * - * stepper signal socket name socket name - * ------- - * SPINDLE_LASER_ENA_PIN /ENABLE O| |O VMOT - * MS1 O| |O GND - * MS2 O| |O 2B - * MS3 O| |O 2A - * /RESET O| |O 1A - * /SLEEP O| |O 1B - * SPINDLE_LASER_PWM_PIN STEP O| |O VDD - * SPINDLE_DIR_PIN DIR O| |O GND - * ------- - * - * Note: Socket names vary from vendor to vendor - */ -#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are not good with 3DRAG -#undef SPINDLE_LASER_ENA_PIN -#undef SPINDLE_DIR_PIN - -#if HAS_CUTTER - #if !EXTRUDERS - #undef E0_DIR_PIN - #undef E0_ENABLE_PIN - #undef E0_STEP_PIN - #undef Z_DIR_PIN - #undef Z_ENABLE_PIN - #undef Z_STEP_PIN - #define Z_DIR_PIN 28 - #define Z_ENABLE_PIN 24 - #define Z_STEP_PIN 26 - #define SPINDLE_LASER_PWM_PIN 46 // Hardware PWM - #define SPINDLE_LASER_ENA_PIN 62 // Pullup! - #define SPINDLE_DIR_PIN 48 - #elif !BOTH(ULTRA_LCD, NEWPANEL) // use expansion header if no LCD in use - #define SPINDLE_LASER_ENA_PIN 16 // Pullup or pulldown! - #define SPINDLE_DIR_PIN 17 - #endif -#endif diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h deleted file mode 100644 index e919b30cf9..0000000000 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * AZTEEG_X3 Arduino Mega with RAMPS v1.4 pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Azteeg X3 supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) - #define CASE_LIGHT_PIN 6 // Define before RAMPS pins include -#endif -#define BOARD_INFO_NAME "Azteeg X3" - -// -// Servos -// -#define SERVO0_PIN 44 // SERVO1 port -#define SERVO1_PIN 55 // SERVO2 port - -#include "pins_RAMPS_13.h" - -// -// LCD / Controller -// -#undef STAT_LED_RED_PIN -#undef STAT_LED_BLUE_PIN - -#if ANY(VIKI2, miniVIKI) - - #undef DOGLCD_A0 - #undef DOGLCD_CS - #undef BTN_ENC - #define DOGLCD_A0 31 - #define DOGLCD_CS 32 - #define BTN_ENC 12 - - #define STAT_LED_RED_PIN 64 - #define STAT_LED_BLUE_PIN 63 - -#else - - #define STAT_LED_RED_PIN 6 - #define STAT_LED_BLUE_PIN 11 - -#endif - -// -// Misc -// -#if ENABLED(CASE_LIGHT_ENABLE) && PIN_EXISTS(CASE_LIGHT, STAT_LED_RED) && STAT_LED_RED_PIN == CASE_LIGHT_PIN - #undef STAT_LED_RED_PIN -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are no good with the AzteegX3 board -#undef SPINDLE_LASER_ENA_PIN -#undef SPINDLE_DIR_PIN - -#if HAS_CUTTER - #undef SDA // use EXP3 header - #undef SCL - #if SERVO0_PIN == 7 - #undef SERVO0_PIN - #define SERVO0_PIN 11 - #endif - #define SPINDLE_LASER_PWM_PIN 7 // Hardware PWM - #define SPINDLE_LASER_ENA_PIN 20 // Pullup! - #define SPINDLE_DIR_PIN 21 -#endif diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h deleted file mode 100644 index 9ba6a0c1ac..0000000000 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * AZTEEG_X3_PRO (Arduino Mega) pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 5 || E_STEPPERS > 5 - #error "Azteeg X3 Pro supports up to 5 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Azteeg X3 Pro" - -// -// RAMPS pins overrides -// - -// -// Servos -// -// Tested this pin with bed leveling on a Delta with 1 servo. -// Physical wire attachment on EXT1: GND, 5V, D47. -// -#define SERVO0_PIN 47 - -// -// Limit Switches -// -#define X_STOP_PIN 3 -#define Y_STOP_PIN 14 -#define Z_STOP_PIN 18 - -#ifndef FAN_PIN - #define FAN_PIN 6 -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) - #define CASE_LIGHT_PIN 44 -#endif - -// -// Import RAMPS 1.4 pins -// -#include "pins_RAMPS.h" - -// DIGIPOT slave addresses -#ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for first DIGIPOT 0x2C (0x58 <- 0x2C << 1) -#endif -#ifndef DIGIPOT_I2C_ADDRESS_B - #define DIGIPOT_I2C_ADDRESS_B 0x2E // unshifted slave address for second DIGIPOT 0x2E (0x5C <- 0x2E << 1) -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 18 -#endif - -// -// Steppers -// -#define E2_STEP_PIN 23 -#define E2_DIR_PIN 25 -#define E2_ENABLE_PIN 40 - -#define E3_STEP_PIN 27 -#define E3_DIR_PIN 29 -#define E3_ENABLE_PIN 41 - -#define E4_STEP_PIN 43 -#define E4_DIR_PIN 37 -#define E4_ENABLE_PIN 42 - -// -// Temperature Sensors -// -#define TEMP_2_PIN 12 // Analog Input -#define TEMP_3_PIN 11 // Analog Input -#define TEMP_4_PIN 10 // Analog Input -#define TC1 4 // Analog Input (Thermo couple on Azteeg X3Pro) -#define TC2 5 // Analog Input (Thermo couple on Azteeg X3Pro) - -// -// Heaters / Fans -// -#define HEATER_2_PIN 16 -#define HEATER_3_PIN 17 -#define HEATER_4_PIN 4 -#define HEATER_5_PIN 5 -#define HEATER_6_PIN 6 -#define HEATER_7_PIN 11 - -#ifndef CONTROLLER_FAN_PIN - #define CONTROLLER_FAN_PIN 4 // Pin used for the fan to cool motherboard (-1 to disable) -#endif - -// -// Auto fans -// -#define AUTO_FAN_PIN 5 -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E3_AUTO_FAN_PIN - #define E3_AUTO_FAN_PIN AUTO_FAN_PIN -#endif - -// -// LCD / Controller -// -#undef BEEPER_PIN -#define BEEPER_PIN 33 - -#if ANY(VIKI2, miniVIKI) - #undef SD_DETECT_PIN - #define SD_DETECT_PIN 49 // For easy adapter board - #undef BEEPER_PIN - #define BEEPER_PIN 12 // 33 isn't physically available to the LCD display -#else - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 -#endif - -// -// Misc. Functions -// -#if ENABLED(CASE_LIGHT_ENABLE) && PIN_EXISTS(CASE_LIGHT) && defined(DOGLCD_A0) && DOGLCD_A0 == CASE_LIGHT_PIN - #undef DOGLCD_A0 // Steal pin 44 for the case light; if you have a Viki2 and have connected it - #define DOGLCD_A0 57 // following the Panucatt wiring diagram, you may need to tweak these pin assignments - // as the wiring diagram uses pin 44 for DOGLCD_A0 -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are no good with the AzteegX3pro board -#undef SPINDLE_LASER_ENA_PIN -#undef SPINDLE_DIR_PIN - -#if HAS_CUTTER // EXP2 header - #if ANY(VIKI2, miniVIKI) - #define BTN_EN2 31 // Pin 7 needed for Spindle PWM - #endif - #define SPINDLE_LASER_PWM_PIN 7 // Hardware PWM - #define SPINDLE_LASER_ENA_PIN 20 // Pullup! - #define SPINDLE_DIR_PIN 21 -#endif diff --git a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h deleted file mode 100644 index af1adabbbc..0000000000 --- a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * BAM&DICE Due (Arduino Mega) pin assignments - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "2PrintBeta Due supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "2PrintBeta Due" - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_ENA_PIN 66 // Pullup or pulldown! -#define SPINDLE_DIR_PIN 67 -#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM - -#include "pins_RAMPS.h" - -// -// Temperature Sensors -// -#undef TEMP_0_PIN -#undef TEMP_1_PIN -#define TEMP_0_PIN 9 // Analog Input -#define TEMP_1_PIN 11 // Analog Input diff --git a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h deleted file mode 100644 index 967fec7b47..0000000000 --- a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * bq ZUM Mega 3D board definition - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "ZUM Mega 3D" - -// -// Heaters / Fans -// -#define RAMPS_D8_PIN 10 -#define RAMPS_D9_PIN 12 -#define RAMPS_D10_PIN 9 -#define MOSFET_D_PIN 7 - -// -// Auto fans -// -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 11 -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN 6 -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN 6 -#endif -#ifndef E3_AUTO_FAN_PIN - #define E3_AUTO_FAN_PIN 6 -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM -#define SPINDLE_DIR_PIN 42 - -// -// Limit Switches -// -#define X_MAX_PIN 79 // 2 - -// -// Import RAMPS 1.3 pins -// -#include "pins_RAMPS_13.h" - -// -// Z Probe (when not Z_MIN_PIN) -// -#undef Z_MIN_PROBE_PIN -#define Z_MIN_PROBE_PIN 19 // IND_S_5V - -#undef Z_ENABLE_PIN -#define Z_ENABLE_PIN 77 // 62 - -// -// Steppers -// -#define DIGIPOTSS_PIN 22 -#define DIGIPOT_CHANNELS { 4, 5, 3, 0, 1 } - -// -// Temperature Sensors -// -#undef TEMP_1_PIN -#define TEMP_1_PIN 14 // Analog Input (15) - -#undef TEMP_BED_PIN -#define TEMP_BED_PIN 15 // Analog Input (14) - -// -// Misc. Functions -// -#undef PS_ON_PIN // 12 -#define PS_ON_PIN 81 // External Power Supply - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 44 // Hardware PWM -#endif - -// This board has headers for Z-min, Z-max and IND_S_5V *but* as the bq team -// decided to ship the printer only with the probe and no additional Z-min -// endstop and the instruction manual advises the user to connect the probe to -// IND_S_5V the option Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN will not work. -#ifdef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN - #undef Z_MIN_PIN - #undef Z_MAX_PIN - #define Z_MIN_PIN 19 // IND_S_5V - #define Z_MAX_PIN 18 // Z-MIN Label -#endif - -// -// Used by the Hephestos 2 heated bed upgrade kit -// -#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) - #undef HEATER_BED_PIN - #define HEATER_BED_PIN 8 -#endif diff --git a/Marlin/src/pins/ramps/pins_COPYMASTER_3D.h b/Marlin/src/pins/ramps/pins_COPYMASTER_3D.h deleted file mode 100644 index b9eee6bd53..0000000000 --- a/Marlin/src/pins/ramps/pins_COPYMASTER_3D.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define BOARD_INFO_NAME "Copymaster 3D RAMPS" - -#define Z_STEP_PIN 47 -#define Y_MAX_PIN 14 -#define FIL_RUNOUT_PIN 15 -#define SD_DETECT_PIN 66 - -// -// Import RAMPS 1.4 pins -// -#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h deleted file mode 100644 index 87d24890c9..0000000000 --- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h +++ /dev/null @@ -1,184 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Wanhao Duplicator i3 Plus pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Duplicator i3 Plus" - -// -// Limit Switches -// -#define X_STOP_PIN 54 // PF0 / A0 -#define Y_STOP_PIN 24 // PA2 / AD2 -#define Z_MIN_PIN 23 // PA1 / AD1 -#define Z_MAX_PIN 25 // PA3 / AD3 -#define SERVO0_PIN 40 // PG1 / !RD - -// -// Steppers -// -#define X_STEP_PIN 61 // PF7 / A7 -#define X_DIR_PIN 62 // PK0 / A8 -#define X_ENABLE_PIN 60 // PF6 / A6 - -#define Y_STEP_PIN 64 // PK2 / A10 -#define Y_DIR_PIN 65 // PK3 / A11 -#define Y_ENABLE_PIN 63 // PK1 / A9 - -#define Z_STEP_PIN 67 // PK5 / A13 -#define Z_DIR_PIN 69 // PK7 / A15 -#define Z_ENABLE_PIN 66 // PK4 / A12 -#define Z_MIN_PROBE_PIN 25 // PA3 / AD3 - -#define E0_STEP_PIN 58 // PF4 / A4 -#define E0_DIR_PIN 59 // PF5 / A5 -#define E0_ENABLE_PIN 57 // PF3 / A3 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // PF1 / A1 Analog -#define TEMP_BED_PIN 14 // PK6 / A14 Analog - -// -// Heaters / Fans -// -#define HEATER_0_PIN 4 // PG5 / PWM4 -#define HEATER_BED_PIN 3 // PE5 / PWM3 - -#define FAN_PIN 5 // PE3 / PWM5 - -// -// Misc. Functions -// -#define SDSS 53 // PB0 / SS -#define LED_PIN 13 // PB7 / PWM13 - -#define MISO_PIN 50 // PB3 -#define MOSI_PIN 51 // PB2 -#define SCK_PIN 52 // PB1 - -// -// LCDs and Controllers -// -#if HAS_WIRED_LCD - #if ENABLED(ZONESTAR_LCD) - #define LCD_PINS_RS 2 - #define LCD_PINS_ENABLE 36 - #define LCD_PINS_D4 37 - #define LCD_PINS_D5 34 - #define LCD_PINS_D6 35 - #define LCD_PINS_D7 32 - #define ADC_KEYPAD_PIN 12 // Analog - #endif -#endif - -/** - * == EXT connector == - * - * 2 4 6 8 10 - * #---------------# - * #2 | ° ° ° ° ° | - * #1 | ° ° ° ° ° | - * #---------------# - * 1 3 5 7 9 - * - * ################################## - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################## - * # 1 | 52 / PG1 (!RD) | 40 # - * # 2 | 95 / PF2 (A2) | 56 # - * # 3 | 54 / PC1 (A9) | 36 # - * # 4 | 53 / PC0 (A8) | 37 # - * # 5 | 56 / PC3 (A11) | 34 # - * # 6 | 55 / PC2 (A10) | 35 # - * # 7 | 58 / PC5 (A13) | 32 # - * # 8 | 57 / PC4 (A12) | 33 # - * # 9 | GND | - # - * # 10 | VCC | + # - * ################################## - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * == Z-probe connector == - * - * 1 2 3 - * #---------# - * | ° ° ° | - * #---------# - * - * ################################## - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################## - * # 1 | 24V or 5V | + # - * # 2 | 75 / PA3 (AD3) | 25 # - * # 3 | GND | - # - * ################################## - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * == Y-endstop == == Z-endstop == == Bed temperature == - * - * 1 2 1 2 1 2 - * #------# #------# #------# - * | ° ° | | ° ° | | ° ° | - * #------# #------# #------# - * - * ############### Y ################ ############### Z ################ ############## BED ############### - * # Pin | ATMEGA2560 Pin | Arduino # # Pin | ATMEGA2560 Pin | Arduino # # Pin | ATMEGA2560 Pin | Arduino # - * ################################## ################################## ################################## - * # 1 | GND | - # # 1 | GND | - # # 1 | GND | - # - * # 2 | 76 / PA2 (AD2) | 24 # # 2 | 77 / PA1 (AD1) | 23 # # 2 |83 / PK6 (ADC14)| 14 # - * ################################## ################################## ################################## - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * == SPI connector == - * - * 5 3 1 - * #---------# - * | ° ° ° | - * | ° ° ° | - * #---------# - * 6 4 2 - * - * ################################## - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################## - * # 1 | 22 / PB3 (MISO)| 50 # - * # 2 | VCC | + # - * # 3 | 20 / PB1 (SCK) | 52 # - * # 4 | 21 / PB2 (MOSI)| 51 # - * # 5 | 30 / !RESET | RESET # - * # 6 | GND | - # - * ################################## - * - * Pictogram by Ludy https://github.com/Ludy87 - * See: https://sebastien.andrivet.com/en/posts/wanhao-duplicator-i3-plus-3d-printer/ - */ diff --git a/Marlin/src/pins/ramps/pins_FELIX2.h b/Marlin/src/pins/ramps/pins_FELIX2.h deleted file mode 100644 index 6cc6997adc..0000000000 --- a/Marlin/src/pins/ramps/pins_FELIX2.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * FELIXprinters v2.0/3.0 (RAMPS v1.4) pin assignments - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "Felix 2.0+ supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Felix 2.0+" - -// -// Heaters / Fans -// -// Power outputs EFBF or EFBE -#define MOSFET_D_PIN 7 - -#include "pins_RAMPS.h" - -// -// Misc. Functions -// -#define SDPOWER_PIN 1 - -#define PS_ON_PIN 12 - -// -// LCD / Controller -// -#if BOTH(ULTRA_LCD, NEWPANEL) - - #define SD_DETECT_PIN 6 - -#endif // NEWPANEL && ULTRA_LCD - -// -// M3/M4/M5 - Spindle/Laser Control -// -#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are not valid with this board -#undef SPINDLE_LASER_ENA_PIN -#undef SPINDLE_DIR_PIN diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h deleted file mode 100644 index 0877d168d6..0000000000 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Formbot Raptor pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 - #error "Formbot supports up to 3 hotends / E-steppers. Comment out this line to continue." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Formbot Raptor" -#endif -#ifndef DEFAULT_MACHINE_NAME - #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#endif - -// -// Servos -// -#define SERVO0_PIN 11 -#define SERVO1_PIN 6 -#define SERVO2_PIN 5 - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#ifndef X_MAX_PIN - #define X_MAX_PIN 2 -#endif -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -#ifndef X_CS_PIN - #define X_CS_PIN 53 -#endif - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -#ifndef Y_CS_PIN - #define Y_CS_PIN 49 -#endif - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 -#ifndef Z_CS_PIN - #define Z_CS_PIN 40 -#endif - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -#ifndef E0_CS_PIN - #define E0_CS_PIN 42 -#endif - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 -#ifndef E1_CS_PIN - #define E1_CS_PIN 44 -#endif - -#define E2_STEP_PIN 42 -#define E2_DIR_PIN 43 -#define E2_ENABLE_PIN 44 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 // Analog Input -#define TEMP_1_PIN 15 // Analog Input -#define TEMP_BED_PIN 14 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card -#else - #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) -#endif - -// -// Augmentation for auto-assigning RAMPS plugs -// -#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) - #if HAS_MULTI_HOTEND - #if TEMP_SENSOR_BED - #define IS_RAMPS_EEB - #else - #define IS_RAMPS_EEF - #endif - #elif TEMP_SENSOR_BED - #define IS_RAMPS_EFB - #else - #define IS_RAMPS_EFF - #endif -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 10 -#define HEATER_1_PIN 7 -#define HEATER_BED_PIN 8 - -#ifndef FAN_PIN - #define FAN_PIN 9 -#endif - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 57 -#endif - -#if !HAS_FILAMENT_SENSOR - #define FAN1_PIN 4 -#endif - -// -// Misc. Functions -// -#ifndef SDSS - #define SDSS 53 -#endif -#define LED_PIN 13 -#define LED4_PIN 5 - -// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector -#define FILWIDTH_PIN 5 // Analog Input - -#ifndef PS_ON_PIN - #define PS_ON_PIN 12 -#endif - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 5 -#endif - -// -// LCD / Controller -// -// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER -// -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BEEPER_PIN 37 - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 -#endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h deleted file mode 100644 index 843eadb432..0000000000 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Formbot Raptor 2 pin assignments - */ - -#define BOARD_INFO_NAME "Formbot Raptor2" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -#define FAN_PIN 6 - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 22 -#endif - -#include "pins_FORMBOT_RAPTOR.h" - -#define GREEDY_PANEL ANY(PANEL_ONE, VIKI2, miniVIKI, MINIPANEL, REPRAPWORLD_KEYPAD) - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) - #if !NUM_SERVOS // Try to use servo connector first - #define SPINDLE_LASER_ENA_PIN 6 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM - #define SPINDLE_DIR_PIN 5 - #elif !GREEDY_PANEL // Try to use AUX2 - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM - #define SPINDLE_DIR_PIN 65 - #endif -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) - #if NUM_SERVOS <= 1 // Try to use servo connector first - #define CASE_LIGHT_PIN 6 // Hardware PWM - #elif !GREEDY_PANEL // Try to use AUX2 - #define CASE_LIGHT_PIN 44 // Hardware PWM - #endif -#endif - -#undef GREEDY_PANEL - -#if ENABLED(CASE_LIGHT_ENABLE) && PIN_EXISTS(CASE_LIGHT) && (CASE_LIGHT_PIN == SPINDLE_LASER_ENA_PIN || CASE_LIGHT_PIN == SPINDLE_LASER_PWM_PIN) - #error "CASE_LIGHT_PIN conflicts with a Spindle / Laser pin." -#endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h deleted file mode 100644 index 75a219c177..0000000000 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h +++ /dev/null @@ -1,210 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Formbot pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Formbot" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// Servos -// -#define SERVO0_PIN 11 -#define SERVO1_PIN -1 // was 6 -#define SERVO2_PIN -1 // was 5 -#define SERVO3_PIN -1 - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#ifndef X_MAX_PIN - #define X_MAX_PIN 2 -#endif -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -#ifndef X_CS_PIN - #define X_CS_PIN 53 -#endif - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -#ifndef Y_CS_PIN - #define Y_CS_PIN 49 -#endif - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 -#ifndef Z_CS_PIN - #define Z_CS_PIN 40 -#endif - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -#ifndef E0_CS_PIN - #define E0_CS_PIN 42 -#endif - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 -#ifndef E1_CS_PIN - #define E1_CS_PIN 44 -#endif - -#define E2_STEP_PIN 42 -#define E2_DIR_PIN 43 -#define E2_ENABLE_PIN 44 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 // Analog Input -#define TEMP_1_PIN 15 // Analog Input -#define TEMP_BED_PIN 3 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card -#else - #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) -#endif - -// -// Augmentation for auto-assigning RAMPS plugs -// -#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) - #if HAS_MULTI_HOTEND - #if TEMP_SENSOR_BED - #define IS_RAMPS_EEB - #else - #define IS_RAMPS_EEF - #endif - #elif TEMP_SENSOR_BED - #define IS_RAMPS_EFB - #else - #define IS_RAMPS_EFF - #endif -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 10 -#define HEATER_1_PIN 7 -#define HEATER_BED_PIN 58 - -#define FAN_PIN 9 - -#if HAS_FILAMENT_SENSOR - #define FIL_RUNOUT_PIN 4 - //#define FIL_RUNOUT2_PIN -1 -#else - // Though defined as a fan pin, it is utilized as a dedicated laser pin by Formbot. - #define FAN1_PIN 4 -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#ifndef LED_PIN - #define LED_PIN 13 // The Formbot v 1 board has almost no unassigned pins on it. The Board's LED -#endif // is a good place to get a signal to control the Max7219 LED Matrix. - -// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector -#define FILWIDTH_PIN 5 // Analog Input - -#ifndef PS_ON_PIN - #define PS_ON_PIN 12 -#endif - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 8 -#endif - -// -// LCD / Controller -// -// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER -// -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #ifndef BEEPER_PIN - #define BEEPER_PIN 37 - #endif - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - - // Allow MAX7219 to steal the KILL pin - #if !defined(KILL_PIN) && MAX7219_CLK_PIN != 41 && MAX7219_DIN_PIN != 41 && MAX7219_LOAD_PIN != 41 - #define KILL_PIN 41 - #endif - - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 -#endif - -#if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(200) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(200) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(200) - #endif -#endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h deleted file mode 100644 index 0470fc47e9..0000000000 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Formbot pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Formbot" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// Servos -// -#define SERVO0_PIN 11 -#define SERVO1_PIN -1 // was 6 -#define SERVO2_PIN -1 -#define SERVO3_PIN -1 - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#ifndef X_MAX_PIN - #define X_MAX_PIN 2 -#endif -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -#ifndef X_CS_PIN - #define X_CS_PIN 53 -#endif - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -#ifndef Y_CS_PIN - #define Y_CS_PIN 49 -#endif - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 -#ifndef Z_CS_PIN - #define Z_CS_PIN 40 -#endif - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -#ifndef E0_CS_PIN - #define E0_CS_PIN 42 -#endif - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 -#ifndef E1_CS_PIN - #define E1_CS_PIN 44 -#endif - -#define E2_STEP_PIN 42 -#define E2_DIR_PIN 43 -#define E2_ENABLE_PIN 44 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 // Analog Input -#define TEMP_1_PIN 15 // Analog Input -#define TEMP_BED_PIN 14 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card -#else - #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 10 -#define HEATER_1_PIN 7 -#define HEATER_BED_PIN 8 - -#define FAN_PIN 9 -#define FAN1_PIN 12 - -#define NUM_RUNOUT_SENSORS 2 -#define FIL_RUNOUT_PIN 22 -#define FIL_RUNOUT2_PIN 21 - -// -// Misc. Functions -// -#define SDSS 53 - -#ifndef LED_PIN - #define LED_PIN 13 -#endif - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 5 -#endif - -#define SPINDLE_LASER_PWM_PIN -1 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 4 // Pullup! - -// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector -#define FILWIDTH_PIN 5 // Analog Input - -// -// LCD / Controller -// -// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER -// -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - #ifndef KILL_PIN - #define KILL_PIN 41 - #endif - #ifndef BEEPER_PIN - #define BEEPER_PIN 37 - #endif -#endif diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h deleted file mode 100644 index 3fa3cc9e8c..0000000000 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ /dev/null @@ -1,298 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// -// FYSETC F6 1.3 (and 1.4) pin assignments -// - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'FYSETC F6' in 'Tools > Board.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "FYSETC F6 1.3" -#endif - -#define RESET_PIN 30 -#define SPI_FLASH_CS 83 - -// -// Servos -// -#define SERVO0_PIN 13 -#define SERVO1_PIN 11 // (PS_ON_PIN) -#define SERVO2_PIN 10 // (FIL_RUNOUT_PIN) -#define SERVO3_PIN 4 // (RGB_LED_G_PIN) - -// -// Limit Switches -// -#define X_MIN_PIN 63 -#define X_MAX_PIN 64 -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 12 -#ifndef Z_MAX_PIN - #define Z_MAX_PIN 9 -#endif - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN SERVO2_PIN -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 9 // Servos pin -#endif - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -#ifndef X_CS_PIN - #define X_CS_PIN 70 -#endif - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -#ifndef Y_CS_PIN - #define Y_CS_PIN 39 -#endif - -#define Z_STEP_PIN 43 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 58 -#ifndef Z_CS_PIN - #define Z_CS_PIN 74 -#endif - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -#ifndef E0_CS_PIN - #define E0_CS_PIN 47 -#endif - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 -#ifndef E1_CS_PIN - #define E1_CS_PIN 32 -#endif - -#define E2_STEP_PIN 59 -#define E2_DIR_PIN 57 -#define E2_ENABLE_PIN 40 -#ifndef E2_CS_PIN - #define E2_CS_PIN 42 -#endif - -// -// Sensorless homing DIAG pin is not directly connected to the MCU. Close -// the jumper next to the limit switch socket when using sensorless homing. -// - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Software serial communication pins. - * At the moment, F6 rx pins are not pc interrupt pins - */ - #ifndef X_SERIAL_RX_PIN - #define X_SERIAL_RX_PIN -1 // 71 - #endif - #ifndef X_SERIAL_TX_PIN - #define X_SERIAL_TX_PIN 72 - #endif - #ifndef Y_SERIAL_RX_PIN - #define Y_SERIAL_RX_PIN -1 // 73 - #endif - #ifndef Y_SERIAL_TX_PIN - #define Y_SERIAL_TX_PIN 75 - #endif - #ifndef Z_SERIAL_RX_PIN - #define Z_SERIAL_RX_PIN -1 // 78 - #endif - #ifndef Z_SERIAL_TX_PIN - #define Z_SERIAL_TX_PIN 79 - #endif - #ifndef E0_SERIAL_RX_PIN - #define E0_SERIAL_RX_PIN -1 // 76 - #endif - #ifndef E0_SERIAL_TX_PIN - #define E0_SERIAL_TX_PIN 77 - #endif - #ifndef E1_SERIAL_RX_PIN - #define E1_SERIAL_RX_PIN -1 // 80 - #endif - #ifndef E1_SERIAL_TX_PIN - #define E1_SERIAL_TX_PIN 81 - #endif - #ifndef E2_SERIAL_RX_PIN - #define E2_SERIAL_RX_PIN -1 // 22 - #endif - #ifndef E2_SERIAL_TX_PIN - #define E2_SERIAL_TX_PIN 82 - #endif -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 12 // Analog Input -#define TEMP_1_PIN 13 // Analog Input -#define TEMP_2_PIN 14 // Analog Input -#define TEMP_BED_PIN 15 // Analog Input - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 9 // Analog Input on X+ endstop -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 5 -#define HEATER_1_PIN 6 -#define HEATER_2_PIN 7 -#define HEATER_BED_PIN 8 - -#define FAN_PIN 44 -#define FAN1_PIN 45 -#define FAN2_PIN 46 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define KILL_PIN 41 - -#ifndef PS_ON_PIN - #define PS_ON_PIN SERVO1_PIN -#endif - -/** - * ----- ----- - * 5V/D41 | · · | GND 5V | · · | GND - * RESET | · · | D49 (SD_DETECT) (LCD_D7) D29 | · · | D27 (LCD_D6) - * (MOSI) D51 | · · | D33 (BTN_EN2) (LCD_D5) D25 | · · | D23 (LCD_D4) - * (SD_SS) D53 | · · | D31 (BTN_EN1) (LCD_RS) D16 | · · | D17 (LCD_EN) - * (SCK) D52 | · · | D50 (MISO) (BTN_ENC) D35 | · · | D37 (BEEPER) - * ----- ----- - * EXP2 EXP1 - */ - -// -// LCDs and Controllers -// -#define SD_DETECT_PIN 49 - -#if ENABLED(FYSETC_242_OLED_12864) - #define BTN_EN1 37 - #define BTN_EN2 29 - #define BTN_ENC 35 - #define BEEPER_PIN 31 - - #define LCD_PINS_DC 25 - #define LCD_PINS_RS 33 - #define DOGLCD_CS 16 - #define DOGLCD_MOSI 23 - #define DOGLCD_SCK 17 - #define DOGLCD_A0 LCD_PINS_DC - - #define KILL_PIN -1 // NC - #define NEOPIXEL_PIN 27 - -#else - #define BEEPER_PIN 37 - - #if ENABLED(FYSETC_MINI_12864) - // - // See https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 - // - #define DOGLCD_A0 16 - #define DOGLCD_CS 17 - - #if ENABLED(FYSETC_GENERIC_12864_1_1) - #define LCD_BACKLIGHT_PIN 27 - #endif - - #define KILL_PIN 41 - #define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. - // Seems to work best if left open. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 25 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN 27 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN 29 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN 25 - #endif - - #elif HAS_MARLINUI_U8GLIB - - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 - - #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS 25 - #define DOGLCD_A0 27 - #endif - - #endif - - #if ENABLED(NEWPANEL) - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - #endif -#endif - -#ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 3 -#endif -#ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN 4 -#endif -#ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN 9 -#endif -#ifndef RGB_LED_W_PIN - #define RGB_LED_W_PIN -1 -#endif diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h deleted file mode 100644 index 4280204b99..0000000000 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// -// FYSETC F6 v1.4 pin assignments -// - -#define BOARD_INFO_NAME "FYSETC F6 1.4" - -#define Z_MAX_PIN 2 - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - */ - #define X_SERIAL_RX_PIN 72 - #define X_SERIAL_TX_PIN 71 - #define Y_SERIAL_RX_PIN 73 - #define Y_SERIAL_TX_PIN 78 - #define Z_SERIAL_RX_PIN 75 - #define Z_SERIAL_TX_PIN 79 - #define E0_SERIAL_RX_PIN 77 - #define E0_SERIAL_TX_PIN 81 - #define E1_SERIAL_RX_PIN 76 - #define E1_SERIAL_TX_PIN 80 - #define E2_SERIAL_RX_PIN 62 - #define E2_SERIAL_TX_PIN 82 -#endif - -#include "pins_FYSETC_F6_13.h" diff --git a/Marlin/src/pins/ramps/pins_K8400.h b/Marlin/src/pins/ramps/pins_K8400.h deleted file mode 100644 index c36e291598..0000000000 --- a/Marlin/src/pins/ramps/pins_K8400.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Velleman K8400 (Vertex) - * 3DRAG clone - * - * K8400 has some minor differences over a normal 3Drag: - * - No X/Y max endstops - * - Second extruder step pin has moved - * - No power supply control - * - Second heater has moved pin - */ - -#define BOARD_INFO_NAME "K8400" -#define DEFAULT_MACHINE_NAME "Vertex" - -#include "pins_3DRAG.h" - -// -// Limit Switches -// -#define X_STOP_PIN 3 -#define Y_STOP_PIN 14 - -#undef X_MIN_PIN -#undef X_MAX_PIN -#undef Y_MIN_PIN -#undef Y_MAX_PIN - -// -// Steppers -// -#undef E1_STEP_PIN -#define E1_STEP_PIN 32 - -// -// Heaters / Fans -// -#undef HEATER_1_PIN -#define HEATER_1_PIN 11 - -// -// Misc. Functions -// -#undef PS_ON_PIN -#undef KILL_PIN -#undef SD_DETECT_PIN - -#if Z_STEP_PIN == 26 - #undef Z_STEP_PIN - #define Z_STEP_PIN 32 -#endif diff --git a/Marlin/src/pins/ramps/pins_K8600.h b/Marlin/src/pins/ramps/pins_K8600.h deleted file mode 100644 index 0de0192752..0000000000 --- a/Marlin/src/pins/ramps/pins_K8600.h +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * VERTEX NANO Arduino Mega with RAMPS EFB v1.4 pin assignments. - */ - -#if HOTENDS > 1 - #error "Only 1 hotend is supported for Vertex Nano." -#endif - -#define BOARD_INFO_NAME "K8600" -#define DEFAULT_MACHINE_NAME "Vertex Nano" - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#define Y_MAX_PIN 14 -#define Z_MAX_PIN 18 -#define Z_MIN_PIN -1 - -// -// Heaters / Fans -// -#define FAN_PIN 8 - -// -// Misc. Functions -// -#define CASE_LIGHT_PIN 7 - -// -// Other RAMPS pins -// -#define IS_RAMPS_EFB // Override autodetection. Bed will be undefined. -#include "pins_RAMPS.h" - -// -// Steppers -// -#undef X_STEP_PIN -#undef X_DIR_PIN -#undef X_ENABLE_PIN -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 - -#undef Y_STEP_PIN -#undef Y_DIR_PIN -#undef Y_ENABLE_PIN -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 - -#undef Z_ENABLE_PIN -#define Z_ENABLE_PIN 63 - -#undef E0_STEP_PIN -#undef E0_DIR_PIN -#undef E0_ENABLE_PIN -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 - -// -// Heaters / Fans -// -#undef HEATER_BED_PIN - -// -// Misc. Functions -// -#undef SDSS -#define SDSS 25 // 53 - -// -// LCD / Controller -// -#if BOTH(ULTRA_LCD, NEWPANEL) - #undef BEEPER_PIN - - #undef LCD_PINS_RS - #undef LCD_PINS_ENABLE - #undef LCD_PINS_D4 - #undef LCD_PINS_D5 - #undef LCD_PINS_D6 - #undef LCD_PINS_D7 - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 - #define LCD_PINS_D4 37 - #define LCD_PINS_D5 35 - #define LCD_PINS_D6 33 - #define LCD_PINS_D7 31 - - // Buttons - #undef BTN_EN1 - #undef BTN_EN2 - #undef BTN_ENC - #define BTN_EN1 17 - #define BTN_EN2 16 - #define BTN_ENC 23 - -#else - - #define BEEPER_PIN 33 - -#endif diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h deleted file mode 100644 index 7e8c245a41..0000000000 --- a/Marlin/src/pins/ramps/pins_K8800.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Velleman K8800 (Vertex) - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "K8800" -#define DEFAULT_MACHINE_NAME "Vertex Delta" - -//#define LCD_SCREEN_ROT_180 - -// -// Limit Switches -// -#define X_STOP_PIN 3 -#define Y_STOP_PIN 14 -#define Z_STOP_PIN 66 - -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 68 -#endif - -#define FIL_RUNOUT_PIN 69 // PK7 - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 63 - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 10 -#define FAN_PIN 8 -#define CONTROLLER_FAN_PIN 9 - -// -// Misc. Functions -// -#define KILL_PIN 20 // PD1 -#define CASE_LIGHT_PIN 7 - -// -// SD Card -// -#define SDSS 25 -#define SD_DETECT_PIN 21 // PD0 - -// -// LCD / Controller -// -#define BEEPER_PIN 6 - -#if HAS_WIRED_LCD - - #define LCD_SDSS 53 - - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 - #define LCD_PINS_D4 37 - #define LCD_PINS_D5 35 - #define LCD_PINS_D6 33 - #define LCD_PINS_D7 31 - - #define LCD_CONTRAST_MIN 0 - #define LCD_CONTRAST_MAX 100 - #define DEFAULT_LCD_CONTRAST 30 - - #if ENABLED(NEWPANEL) - #define BTN_EN1 17 - #define BTN_EN2 16 - #define BTN_ENC 23 - #endif - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h b/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h deleted file mode 100644 index a42dba874f..0000000000 --- a/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define BOARD_INFO_NAME "MAKEboard Mini" - -// -// Only 3 Limit Switch plugs on Micromake C1 -// -#define X_STOP_PIN 2 -#define Y_STOP_PIN 15 -#define Z_STOP_PIN 19 - -#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_10.h b/Marlin/src/pins/ramps/pins_MKS_BASE_10.h deleted file mode 100644 index 0be58653aa..0000000000 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_10.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS BASE 1.0 – Arduino Mega2560 with RAMPS v1.4 pin assignments - * - * Rev B - Override pin definitions for CASE_LIGHT and M3/M4/M5 spindle control - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS BASE 1.0 supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS BASE 1.0" -#define MKS_BASE_VERSION 10 - -#include "pins_MKS_BASE_common.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_14.h b/Marlin/src/pins/ramps/pins_MKS_BASE_14.h deleted file mode 100644 index 3612f9b894..0000000000 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_14.h +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS BASE v1.4 with A4982 stepper drivers and digital micro-stepping - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS BASE 1.4 only supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS BASE 1.4" -#define MKS_BASE_VERSION 14 - -// -// Heaters / Fans -// -#define FAN_PIN 9 // PH6 ** Pin18 ** PWM9 - -// Other Mods - -#define SERVO3_PIN 12 // PB6 ** Pin25 ** D12 -#define PS_ON_PIN 2 // X+ // PE4 ** Pin6 ** PWM2 **MUST BE HARDWARE PWM -#define FILWIDTH_PIN 15 // Y+ // PJ0 ** Pin63 ** USART3_RX **Pin should have a pullup! -#define FIL_RUNOUT_PIN 19 // Z+ // PD2 ** Pin45 ** USART1_RX - -#ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 50 -#endif -#ifndef RGB_LED_R_PIN - #define RGB_LED_G_PIN 51 -#endif -#ifndef RGB_LED_R_PIN - #define RGB_LED_B_PIN 52 -#endif - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 11 // PB5 ** Pin24 ** PWM11 -#endif - -#include "pins_MKS_BASE_common.h" - -/* - Available connectors on MKS BASE v1.4 - - ======= - | GND | - |-----| E0 - | 10 | (10) PB4 ** Pin23 ** PWM10 - |-----| - | GND | - |-----| E1 - | 7 | ( 7) PH4 ** Pin16 ** PWM7 - |-----| - | GND | - |-----| FAN - | 9 | ( 9) PH6 ** Pin18 ** PWM9 - ======= - - ======= - | GND | - |-----| Heated Bed - | 8 | ( 8) PH5 ** Pin17 ** PWM8 - ======= - - ========== - | 12-24V | - |--------| Power - | GND | - ========== - - XS3 Connector - ================= - | 65 | GND | 5V | (65) PK3 ** Pin86 ** A11 - |----|-----|----| - | 66 | GND | 5V | (66) PK4 ** Pin85 ** A12 - ================= - - Servos Connector - ================= - | 11 | GND | 5V | (11) PB5 ** Pin24 ** PWM11 - |----|-----|----| - | 12 | GND | 5V | (12) PB6 ** Pin25 ** PWM12 - ================= - - ICSP - ================= - | 5V | 51 | GND | (51) PB2 ** Pin21 ** SPI_MOSI - |----|----|-----| - | 50 | 52 | RST | (50) PB3 ** Pin22 ** SPI_MISO - ================= (52) PB1 ** Pin20 ** SPI_SCK - - XS6/AUX-1 Connector - ====================== - | 5V | GND | NC | 20 | (20) PD1 ** Pin44 ** I2C_SDA - |----|-----|----|----| - | 50 | 51 | 52 | 21 | (50) PB3 ** Pin22 ** SPI_MISO - ====================== (51) PB2 ** Pin21 ** SPI_MOSI - (52) PB1 ** Pin20 ** SPI_SCK - (21) PD0 ** Pin43 ** I2C_SCL - - Temperature - ================================== - | GND | 69 | GND | 68 | GND | 67 | - ================================== - (69) PK7 ** Pin82 ** A15 - (68) PK6 ** Pin83 ** A14 - (67) PK5 ** Pin84 ** A13 - - Limit Switches - ============ - | 2 | GND | X+ ( 2) PE4 ** Pin6 ** PWM2 - |----|-----| - | 3 | GND | X- ( 3) PE5 ** Pin7 ** PWM3 - |----|-----| - | 15 | GND | Y+ (15) PJ0 ** Pin63 ** USART3_RX - |----|-----| - | 14 | GND | Y- (14) PJ1 ** Pin64 ** USART3_TX - |----|-----| - | 19 | GND | Z+ (19) PD2 ** Pin45 ** USART1_RX - |----|-----| - | 18 | GND | Z- (18) PD3 ** Pin46 ** USART1_TX - ============ - - EXP1 - ============ - | 37 | 35 | (37) PC0 ** Pin53 ** D37 - |-----|----| (35) PC2 ** Pin55 ** D35 - | 17 | 16 | (17) PH0 ** Pin12 ** USART2_RX - |-----|----| (16) PH1 ** Pin13 ** USART2_TX - | 23 | 25 | (23) PA1 ** Pin77 ** D23 - |-----|----| (25) PA3 ** Pin75 ** D25 - | 27 | 29 | (27) PA5 ** Pin73 ** D27 - |-----|----| (29) PA7 ** Pin71 ** D29 - | GND | 5V | - ============ - - EXP2 - ============ - | 50 | 52 | (50) PB3 ** Pin22 ** SPI_MISO - |-----|----| (52) PB1 ** Pin20 ** SPI_SCK - | 31 | 53 | (31) PC6 ** Pin59 ** D31 - |-----|----| (53) PB0 ** Pin19 ** SPI_SS - | 33 | 51 | (33) PC4 ** Pin57 ** D33 - |-----|----| (51) PB2 ** Pin21 ** SPI_MOSI - | 49 | 41 | (49) PL0 ** Pin35 ** D49 - |-----|----| (41) PG0 ** Pin51 ** D41 - | GND | NC | - ============ -*/ diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_15.h b/Marlin/src/pins/ramps/pins_MKS_BASE_15.h deleted file mode 100644 index 9e670d1bbd..0000000000 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_15.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS BASE v1.5 with A4982 stepper drivers and digital micro-stepping - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS BASE 1.5 only supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS BASE 1.5" -#define MKS_BASE_VERSION 15 - -#include "pins_MKS_BASE_common.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_16.h b/Marlin/src/pins/ramps/pins_MKS_BASE_16.h deleted file mode 100644 index 42796acf8b..0000000000 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_16.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS BASE v1.6 with A4982 stepper drivers and digital micro-stepping - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS BASE 1.6 only supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS BASE 1.6" -#define MKS_BASE_VERSION 16 - -// -// Servos -// -#define SERVO1_PIN 12 // Digital 12 / Pin 25 - -// -// Omitted RAMPS pins -// -#ifndef SERVO2_PIN - #define SERVO2_PIN -1 -#endif -#ifndef SERVO3_PIN - #define SERVO3_PIN -1 -#endif -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN -1 -#endif -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN -1 -#endif -#ifndef PS_ON_PIN - #define PS_ON_PIN -1 -#endif - -#include "pins_MKS_BASE_common.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_common.h b/Marlin/src/pins/ramps/pins_MKS_BASE_common.h deleted file mode 100644 index 9047a4bcf0..0000000000 --- a/Marlin/src/pins/ramps/pins_MKS_BASE_common.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS BASE – Arduino Mega2560 with RAMPS pin assignments - */ - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "MKS BASE" -#endif - -#if MKS_BASE_VERSION >= 14 - // - // Heaters / Fans - // - // Power outputs EFBF or EFBE - #define MOSFET_D_PIN 7 - - // - // M3/M4/M5 - Spindle/Laser Control - // - #if HAS_CUTTER - #define SPINDLE_LASER_PWM_PIN 2 // Hardware PWM - #define SPINDLE_LASER_ENA_PIN 15 // Pullup! - #define SPINDLE_DIR_PIN 19 - #endif - - #ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 2 - #endif - -#endif - -// -// Microstepping pins -// -#if MKS_BASE_VERSION >= 14 // |===== 1.4 =====|===== 1.5+ =====| - #define X_MS1_PIN 5 // PE3 | Pin 5 | PWM5 | | D3 | SERVO2_PIN - #define X_MS2_PIN 6 // PH3 | Pin 15 | PWM6 | Pin 14 | D6 | SERVO1_PIN - #define Y_MS1_PIN 59 // PF5 | Pin 92 | A5 | | | - #define Y_MS2_PIN 58 // PF4 | Pin 93 | A4 | | | - #define Z_MS1_PIN 22 // PA0 | Pin 78 | D22 | | | - #define Z_MS2_PIN 39 // PG2 | Pin 70 | D39 | | | - #if MKS_BASE_VERSION == 14 - #define E0_MS1_PIN 64 // PK2 | Pin 87 | A10 | | | - #define E0_MS2_PIN 63 // PK1 | Pin 88 | A9 | | | - #else - #define E0_MS1_PIN 63 // PK1 | | | Pin 86 | A9 | - #define E0_MS2_PIN 64 // PK2 | | | Pin 87 | A10 | - #endif - #define E1_MS1_PIN 57 // PF3 | Pin 94 | A3 | Pin 93 | A3 | - #define E1_MS2_PIN 4 // PG5 | Pin 1 | PWM4 | | D4 | SERVO3_PIN -#endif - -#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_13.h b/Marlin/src/pins/ramps/pins_MKS_GEN_13.h deleted file mode 100644 index 08dd0f44bd..0000000000 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_13.h +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega with RAMPS v1.4 adjusted pin assignments - * - * MKS GEN v1.3 (Extruder, Fan, Bed) - * MKS GEN v1.3 (Extruder, Extruder, Fan, Bed) - * MKS GEN v1.4 (Extruder, Fan, Bed) - * MKS GEN v1.4 (Extruder, Extruder, Fan, Bed) - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS GEN 1.3/1.4 supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS GEN >= v1.3" - -// -// Heaters / Fans -// -// Power outputs EFBF or EFBE -#define MOSFET_D_PIN 7 - -// -// PSU / SERVO -// -// If PSU_CONTROL is specified, always hijack Servo 3 -// -#if ENABLED(PSU_CONTROL) - #define SERVO3_PIN -1 - #define PS_ON_PIN 4 -#endif - -#include "pins_RAMPS.h" - -// -// LCD / Controller -// -#if ANY(VIKI2, miniVIKI) - /** - * VIKI2 Has two groups of wires with... - * - * +Vin + Input supply, requires 120ma for LCD and mSD card - * GND Ground Pin - * MOSI Data input for LCD and SD - * MISO Data output for SD - * SCK Clock for LCD and SD - * AO Reg. Sel for LCD - * LCS Chip Select for LCD - * SDCS Chip Select for SD - * SDCD Card Detect pin for SD - * ENCA Encoder output A - * ENCB Encoder output B - * ENCBTN Encoder button switch - * - * BTN Panel mounted button switch - * BUZZER Piezo buzzer - * BLUE-LED Blue LED ring pin (3 to 5v, mosfet buffered) - * RED-LED Red LED ring pin (3 to 5v, mosfet buffered) - * - * This configuration uses the following arrangement: - * - * EXP1 D37 = EN2 D35 = EN1 EXP2 D50 = MISO D52 = SCK - * D17 = BLUE D16 = RED D31 = ENC D53 = SDCS - * D23 = KILL D25 = BUZZ D33 = --- D51 = MOSI - * D27 = A0 D29 = LCS D49 = SDCD RST = --- - * GND = GND 5V = 5V GND = --- D41 = --- - */ - - #undef BTN_EN1 - #undef BTN_EN2 - #undef BTN_ENC - #undef DOGLCD_A0 - #undef DOGLCD_CS - #undef SD_DETECT_PIN - #undef BEEPER_PIN - #undef KILL_PIN - #undef STAT_LED_RED_PIN - #undef STAT_LED_BLUE_PIN - - // - // VIKI2 12-wire lead - // - - // orange/white SDCD - #define SD_DETECT_PIN 49 - - // white ENCA - #define BTN_EN1 35 - - // green ENCB - #define BTN_EN2 37 - - // purple ENCBTN - #define BTN_ENC 31 - - // brown A0 - #define DOGLCD_A0 27 - - // green/white LCS - #define DOGLCD_CS 29 - - // 50 gray MISO - // 51 yellow MOSI - // 52 orange SCK - - // blue SDCS - //#define SDSS 53 - - // - // VIKI2 4-wire lead - // - - // blue BTN - #define KILL_PIN 23 - - // green BUZZER - #define BEEPER_PIN 25 - - // yellow RED-LED - #define STAT_LED_RED_PIN 16 - - // white BLUE-LED - #define STAT_LED_BLUE_PIN 17 - -#endif diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h deleted file mode 100644 index 20f3dece42..0000000000 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS GEN L V2 – Arduino Mega2560 with RAMPS v1.4 pin assignments - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS GEN L V2 supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS GEN L V2" - -// -// Heaters / Fans -// -// Power outputs EFBF or EFBE -#define MOSFET_D_PIN 7 - -// -// CS Pins wired to avoid conflict with the LCD -// See https://www.thingiverse.com/asset:66604 -// - -#ifndef X_CS_PIN - #define X_CS_PIN 63 -#endif - -#ifndef Y_CS_PIN - #define Y_CS_PIN 64 -#endif - -#ifndef Z_CS_PIN - #define Z_CS_PIN 65 -#endif - -#ifndef E0_CS_PIN - #define E0_CS_PIN 66 -#endif - -#ifndef E1_CS_PIN - #define E1_CS_PIN 21 -#endif - -// TMC2130 Diag Pins (currently just for reference) -#define X_DIAG_PIN 3 -#define Y_DIAG_PIN 14 -#define Z_DIAG_PIN 18 -#define E0_DIAG_PIN 2 -#define E1_DIAG_PIN 15 - -#ifndef SERVO1_PIN - #define SERVO1_PIN 12 -#endif -#ifndef SERVO2_PIN - #define SERVO2_PIN 39 -#endif -#ifndef SERVO3_PIN - #define SERVO3_PIN 32 -#endif - -#ifndef E1_SERIAL_TX_PIN - #define E1_SERIAL_TX_PIN 20 -#endif -#ifndef E1_SERIAL_RX_PIN - #define E1_SERIAL_RX_PIN 21 -#endif - -#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h deleted file mode 100644 index 24e04a39ff..0000000000 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS GEN L V2 – Arduino Mega2560 with RAMPS v1.4 pin assignments - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS GEN L V2.1 supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS GEN L V2.1" - -// -// Heaters / Fans -// -// Power outputs EFBF or EFBE -#define MOSFET_D_PIN 7 - -// -// CS Pins wired to avoid conflict with the LCD -// See https://www.thingiverse.com/asset:66604 -// - -#ifndef X_CS_PIN - #define X_CS_PIN 63 -#endif -#ifndef Y_CS_PIN - #define Y_CS_PIN 64 -#endif -#ifndef Z_CS_PIN - #define Z_CS_PIN 65 -#endif -#ifndef E0_CS_PIN - #define E0_CS_PIN 66 -#endif -#ifndef E1_CS_PIN - #define E1_CS_PIN 12 -#endif - -// TMC2130 Diag Pins (currently just for reference) -#define X_DIAG_PIN 3 -#define Y_DIAG_PIN 14 -#define Z_DIAG_PIN 18 -#define E0_DIAG_PIN 2 -#define E1_DIAG_PIN 15 - -#ifndef SERVO1_PIN - #define SERVO1_PIN 21 -#endif -#ifndef SERVO2_PIN - #define SERVO2_PIN 39 -#endif -#ifndef SERVO3_PIN - #define SERVO3_PIN 32 -#endif - -#ifndef E1_SERIAL_TX_PIN - #define E1_SERIAL_TX_PIN 20 -#endif -#ifndef E1_SERIAL_RX_PIN - #define E1_SERIAL_RX_PIN 12 -#endif - -#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_ORTUR_4.h b/Marlin/src/pins/ramps/pins_ORTUR_4.h deleted file mode 100644 index cef01bf62a..0000000000 --- a/Marlin/src/pins/ramps/pins_ORTUR_4.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Ortur 4 Arduino Mega based on RAMPS v1.4 pin assignments - */ - -#define BOARD_INFO_NAME "Ortur 4.3" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// Servos -// -#define SERVO0_PIN 29 - -// -// Limit Switches -// -#define X_MAX_PIN 18 -#define Z_MIN_PIN 63 - -#define Z_MIN_PROBE_PIN 2 -#define FIL_RUNOUT_PIN 59 - -// -// Steppers -// -#define E0_CS_PIN 44 -#define E1_CS_PIN 42 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 15 // Analog Input -#define TEMP_1_PIN 13 // Analog Input - -// -// Software serial -// -#define X_SERIAL_TX_PIN 59 -#define X_SERIAL_RX_PIN 63 - -#define Y_SERIAL_TX_PIN 64 -#define Y_SERIAL_RX_PIN 40 - -#define Z_SERIAL_TX_PIN 44 -#define Z_SERIAL_RX_PIN 42 - -#define E0_SERIAL_TX_PIN 66 -#define E0_SERIAL_RX_PIN 65 - -#include "pins_RAMPS.h" - -// -// Steppers -// -#undef E0_STEP_PIN -#undef E0_DIR_PIN -#undef E0_ENABLE_PIN -#define E0_STEP_PIN 36 -#define E0_DIR_PIN 34 -#define E0_ENABLE_PIN 30 - -#undef E1_STEP_PIN -#undef E1_DIR_PIN -#undef E1_ENABLE_PIN -#define E1_STEP_PIN 26 -#define E1_DIR_PIN 28 -#define E1_ENABLE_PIN 24 - -// -// LCD / Controller -// -#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #undef BEEPER_PIN - #define BEEPER_PIN 35 - - #undef LCD_PINS_RS - #undef LCD_PINS_ENABLE - #undef LCD_PINS_D4 - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 23 - #define LCD_PINS_D4 37 - - #undef LCD_SDSS - #undef SD_DETECT_PIN - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - - #undef BTN_EN1 - #undef BTN_EN2 - #undef BTN_ENC - #define BTN_EN1 29 - #define BTN_EN2 25 - #define BTN_ENC 16 -#endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h deleted file mode 100644 index de56d2b59d..0000000000 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ /dev/null @@ -1,775 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega with RAMPS v1.4 (or v1.3) pin assignments - * - * Applies to the following boards: - * - * RAMPS_14_EFB (Hotend, Fan, Bed) - * RAMPS_14_EEB (Hotend0, Hotend1, Bed) - * RAMPS_14_EFF (Hotend, Fan0, Fan1) - * RAMPS_14_EEF (Hotend0, Hotend1, Fan) - * RAMPS_14_SF (Spindle, Controller Fan) - * - * RAMPS_13_EFB (Hotend, Fan, Bed) - * RAMPS_13_EEB (Hotend0, Hotend1, Bed) - * RAMPS_13_EFF (Hotend, Fan0, Fan1) - * RAMPS_13_EEF (Hotend0, Hotend1, Fan) - * RAMPS_13_SF (Spindle, Controller Fan) - * - * Other pins_MYBOARD.h files may override these defaults - * - * Differences between - * RAMPS_13 | RAMPS_14 - * 7 | 11 - */ - -#ifdef TARGET_LPC1768 - #error "Oops! Set MOTHERBOARD to an LPC1768-based board when building for LPC1768." -#elif defined(__STM32F1__) - #error "Oops! Set MOTHERBOARD to an STM32F1-based board when building for STM32F1." -#endif - -#if NOT_TARGET(IS_RAMPS_SMART, IS_RAMPS_DUO, IS_RAMPS4DUE, TARGET_LPC1768, __AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -// Custom flags and defines for the build -//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "RAMPS 1.4" -#endif - -// -// Servos -// -#ifndef SERVO0_PIN - #ifdef IS_RAMPS_13 - #define SERVO0_PIN 7 - #else - #define SERVO0_PIN 11 - #endif -#endif -#ifndef SERVO1_PIN - #define SERVO1_PIN 6 -#endif -#ifndef SERVO2_PIN - #define SERVO2_PIN 5 -#endif -#ifndef SERVO3_PIN - #define SERVO3_PIN 4 -#endif - -// -// Limit Switches -// -#ifndef X_STOP_PIN - #ifndef X_MIN_PIN - #define X_MIN_PIN 3 - #endif - #ifndef X_MAX_PIN - #define X_MAX_PIN 2 - #endif -#endif -#ifndef Y_STOP_PIN - #ifndef Y_MIN_PIN - #define Y_MIN_PIN 14 - #endif - #ifndef Y_MAX_PIN - #define Y_MAX_PIN 15 - #endif -#endif -#ifndef Z_STOP_PIN - #ifndef Z_MIN_PIN - #define Z_MIN_PIN 18 - #endif - #ifndef Z_MAX_PIN - #define Z_MAX_PIN 19 - #endif -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -#ifndef X_CS_PIN - #define X_CS_PIN 53 -#endif - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -#ifndef Y_CS_PIN - #define Y_CS_PIN 49 -#endif - -#ifndef Z_STEP_PIN - #define Z_STEP_PIN 46 -#endif -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 -#ifndef Z_CS_PIN - #define Z_CS_PIN 40 -#endif - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -#ifndef E0_CS_PIN - #define E0_CS_PIN 42 -#endif - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 -#ifndef E1_CS_PIN - #define E1_CS_PIN 44 -#endif - -// -// Temperature Sensors -// -#ifndef TEMP_0_PIN - #define TEMP_0_PIN 13 // Analog Input -#endif -#ifndef TEMP_1_PIN - #define TEMP_1_PIN 15 // Analog Input -#endif -#ifndef TEMP_BED_PIN - #define TEMP_BED_PIN 14 // Analog Input -#endif - -// -// SPI for Max6675 or Max31855 Thermocouple -// -#ifndef MAX6675_SS_PIN - #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card (SDSS) or 49 (SD_DETECT_PIN) -#endif - -// -// Augmentation for auto-assigning RAMPS plugs -// -#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) - #if HAS_MULTI_HOTEND - #if TEMP_SENSOR_BED - #define IS_RAMPS_EEB - #else - #define IS_RAMPS_EEF - #endif - #elif TEMP_SENSOR_BED - #define IS_RAMPS_EFB - #else - #define IS_RAMPS_EFF - #endif -#endif - -// -// Heaters / Fans -// -#ifndef MOSFET_D_PIN - #define MOSFET_D_PIN -1 -#endif -#ifndef RAMPS_D8_PIN - #define RAMPS_D8_PIN 8 -#endif -#ifndef RAMPS_D9_PIN - #define RAMPS_D9_PIN 9 -#endif -#ifndef RAMPS_D10_PIN - #define RAMPS_D10_PIN 10 -#endif - -#define HEATER_0_PIN RAMPS_D10_PIN - -#if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed - #define HEATER_BED_PIN RAMPS_D8_PIN -#elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan - #define HEATER_1_PIN RAMPS_D9_PIN -#elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed - #define HEATER_1_PIN RAMPS_D9_PIN - #define HEATER_BED_PIN RAMPS_D8_PIN -#elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan - #define FAN1_PIN RAMPS_D8_PIN -#elif DISABLED(IS_RAMPS_SF) // Not Spindle, Fan (i.e., "EFBF" or "EFBE") - #define HEATER_BED_PIN RAMPS_D8_PIN - #if HOTENDS == 1 - #define FAN1_PIN MOSFET_D_PIN - #else - #define HEATER_1_PIN MOSFET_D_PIN - #endif -#endif - -#ifndef FAN_PIN - #if EITHER(IS_RAMPS_EFB, IS_RAMPS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan - #define FAN_PIN RAMPS_D9_PIN - #elif EITHER(IS_RAMPS_EEF, IS_RAMPS_SF) // Hotend, Hotend, Fan or Spindle, Fan - #define FAN_PIN RAMPS_D8_PIN - #elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed - #define FAN_PIN 4 // IO pin. Buffer needed - #else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") - #define FAN_PIN RAMPS_D9_PIN - #endif -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 5 // Analog Input on AUX2 -#endif - -// RAMPS 1.4 DIO 4 on the servos connector -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 4 -#endif - -#ifndef PS_ON_PIN - #define PS_ON_PIN 12 -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENA_PIN) - #if NUM_SERVOS <= 1 // Prefer the servo connector - #define CASE_LIGHT_PIN 6 // Hardware PWM - #elif HAS_FREE_AUX2_PINS - #define CASE_LIGHT_PIN 44 // Hardware PWM - #endif -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER && !defined(SPINDLE_LASER_ENA_PIN) - #if !NUM_SERVOS // Use servo connector if possible - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM - #define SPINDLE_DIR_PIN 5 - #elif HAS_FREE_AUX2_PINS - #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM - #define SPINDLE_DIR_PIN 65 - #else - #error "No auto-assignable Spindle/Laser pins available." - #endif -#endif - -// -// TMC software SPI -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI 66 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO 44 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK 64 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - - #ifndef X_SERIAL_TX_PIN - #define X_SERIAL_TX_PIN 40 - #endif - #ifndef X_SERIAL_RX_PIN - #define X_SERIAL_RX_PIN 63 - #endif - #ifndef X2_SERIAL_TX_PIN - #define X2_SERIAL_TX_PIN -1 - #endif - #ifndef X2_SERIAL_RX_PIN - #define X2_SERIAL_RX_PIN -1 - #endif - - #ifndef Y_SERIAL_TX_PIN - #define Y_SERIAL_TX_PIN 59 - #endif - #ifndef Y_SERIAL_RX_PIN - #define Y_SERIAL_RX_PIN 64 - #endif - #ifndef Y2_SERIAL_TX_PIN - #define Y2_SERIAL_TX_PIN -1 - #endif - #ifndef Y2_SERIAL_RX_PIN - #define Y2_SERIAL_RX_PIN -1 - #endif - - #ifndef Z_SERIAL_TX_PIN - #define Z_SERIAL_TX_PIN 42 - #endif - #ifndef Z_SERIAL_RX_PIN - #define Z_SERIAL_RX_PIN 65 - #endif - #ifndef Z2_SERIAL_TX_PIN - #define Z2_SERIAL_TX_PIN -1 - #endif - #ifndef Z2_SERIAL_RX_PIN - #define Z2_SERIAL_RX_PIN -1 - #endif - - #ifndef E0_SERIAL_TX_PIN - #define E0_SERIAL_TX_PIN 44 - #endif - #ifndef E0_SERIAL_RX_PIN - #define E0_SERIAL_RX_PIN 66 - #endif - #ifndef E1_SERIAL_TX_PIN - #define E1_SERIAL_TX_PIN -1 - #endif - #ifndef E1_SERIAL_RX_PIN - #define E1_SERIAL_RX_PIN -1 - #endif - #ifndef E2_SERIAL_TX_PIN - #define E2_SERIAL_TX_PIN -1 - #endif - #ifndef E2_SERIAL_RX_PIN - #define E2_SERIAL_RX_PIN -1 - #endif - #ifndef E3_SERIAL_TX_PIN - #define E3_SERIAL_TX_PIN -1 - #endif - #ifndef E3_SERIAL_RX_PIN - #define E3_SERIAL_RX_PIN -1 - #endif - #ifndef E4_SERIAL_TX_PIN - #define E4_SERIAL_TX_PIN -1 - #endif - #ifndef E4_SERIAL_RX_PIN - #define E4_SERIAL_RX_PIN -1 - #endif - #ifndef E5_SERIAL_TX_PIN - #define E5_SERIAL_TX_PIN -1 - #endif - #ifndef E5_SERIAL_RX_PIN - #define E5_SERIAL_RX_PIN -1 - #endif - #ifndef E6_SERIAL_TX_PIN - #define E6_SERIAL_TX_PIN -1 - #endif - #ifndef E6_SERIAL_RX_PIN - #define E6_SERIAL_RX_PIN -1 - #endif - #ifndef E7_SERIAL_TX_PIN - #define E7_SERIAL_TX_PIN -1 - #endif - #ifndef E7_SERIAL_RX_PIN - #define E7_SERIAL_RX_PIN -1 - #endif -#endif - -// -// Průša i3 MK2 Multiplexer Support -// -#ifndef E_MUX0_PIN - #define E_MUX0_PIN 40 // Z_CS_PIN -#endif -#ifndef E_MUX1_PIN - #define E_MUX1_PIN 42 // E0_CS_PIN -#endif -#ifndef E_MUX2_PIN - #define E_MUX2_PIN 44 // E1_CS_PIN -#endif - -////////////////////////// -// LCDs and Controllers // -////////////////////////// - -#if HAS_WIRED_LCD - - // - // LCD Display output pins - // - #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - - #elif BOTH(NEWPANEL, PANEL_ONE) - - #define LCD_PINS_RS 40 - #define LCD_PINS_ENABLE 42 - #define LCD_PINS_D4 65 - #define LCD_PINS_D5 66 - #define LCD_PINS_D6 44 - #define LCD_PINS_D7 64 - - #elif ENABLED(TFTGLCD_PANEL_SPI) - - #define TFTGLCD_CS 33 - - #else - - #if ENABLED(CR10_STOCKDISPLAY) - - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 - #define LCD_PINS_D4 25 - - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 37 - #endif - - #elif ENABLED(ZONESTAR_LCD) - - #define LCD_PINS_RS 64 - #define LCD_PINS_ENABLE 44 - #define LCD_PINS_D4 63 - #define LCD_PINS_D5 40 - #define LCD_PINS_D6 42 - #define LCD_PINS_D7 65 - - #else - - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) - #define LCD_PINS_DC 25 // Set as output on init - #define LCD_PINS_RS 27 // Pull low for 1s to init - // DOGM SPI LCD Support - #define DOGLCD_CS 16 - #define DOGLCD_MOSI 17 - #define DOGLCD_SCK 23 - #define DOGLCD_A0 LCD_PINS_DC - #else - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #endif - - #define LCD_PINS_D7 29 - - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 - #endif - - #endif - - #if DISABLED(NEWPANEL) - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 - #endif - - #endif - - // - // LCD Display input pins - // - #if ENABLED(NEWPANEL) - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN 37 - - #if ENABLED(CR10_STOCKDISPLAY) - #define BTN_EN1 17 - #define BTN_EN2 23 - #else - #define BTN_EN1 31 - #define BTN_EN2 33 - #endif - - #define BTN_ENC 35 - #ifndef SD_DETECT_PIN - #define SD_DETECT_PIN 49 - #endif - #ifndef KILL_PIN - #define KILL_PIN 41 - #endif - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 - #endif - - #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS SDSS - #define KILL_PIN 41 - - #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 40 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 42 - #define BTN_ENC -1 - - #define LCD_SDSS SDSS - #define SD_DETECT_PIN 49 - - #elif ANY(VIKI2, miniVIKI) - - #define DOGLCD_CS 45 - #define DOGLCD_A0 44 - #define LCD_SCREEN_ROT_180 - - #define BEEPER_PIN 33 - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 - - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 - - #define SD_DETECT_PIN -1 // Pin 49 for display SD interface, 72 for easy adapter board - #define KILL_PIN 31 - - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - - #define BEEPER_PIN 23 - #define LCD_BACKLIGHT_PIN 33 - - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - - #define LCD_SDSS SDSS - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - - #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) - - #define BEEPER_PIN 37 - #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - - #ifndef KILL_PIN - #define KILL_PIN 41 - #endif - - #if ENABLED(MKS_MINI_12864) - - #define DOGLCD_A0 27 - #define DOGLCD_CS 25 - - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - // not connected to a pin - #define LCD_BACKLIGHT_PIN -1 // 65 (MKS mini12864 can't adjust backlight by software!) - - #define BTN_EN1 31 - #define BTN_EN2 33 - - #elif ENABLED(FYSETC_MINI_12864) - - // From https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 - - #define DOGLCD_A0 16 - #define DOGLCD_CS 17 - - #define BTN_EN1 33 - #define BTN_EN2 31 - - //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 25 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN 27 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN 29 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN 25 - #endif - - #endif - - #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN 42 - // not connected to a pin - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 - - #define SD_DETECT_PIN 49 - #define KILL_PIN 64 - - #elif ENABLED(ZONESTAR_LCD) - - #define ADC_KEYPAD_PIN 12 - - #elif ENABLED(AZSMZ_12864) - - // Pins only defined for RAMPS_SMART currently - - #elif IS_TFTGLCD_PANEL - - #define SD_DETECT_PIN 49 - - #else - - // Beeper on AUX-4 - #define BEEPER_PIN 33 - - // Buttons are directly attached to AUX-2 - #if ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - #endif - - #endif - #endif // NEWPANEL - -#endif // HAS_WIRED_LCD - -#if ENABLED(REPRAPWORLD_KEYPAD) && DISABLED(ADC_KEYPAD) - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 - #ifndef BTN_EN1 - #define BTN_EN1 64 - #endif - #ifndef BTN_EN2 - #define BTN_EN2 59 - #endif - #ifndef BTN_ENC - #define BTN_ENC 63 - #endif -#endif - -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) - - #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_RAMPS.h' for details. Comment out this line to continue." - - /** FYSETC TFT TFT81050 display pinout - * - * Board Display - * _____ _____ - * (SCK) D52 | 1 2 | D50 (MISO) MISO | 1 2 | SCK - * (SD_CS) D53 | 3 4 | D33 (BNT_EN2) (BNT_EN2) MOD_RESET | 3 4 | SD_CS - * (MOSI) D51 | 5 6 D31 (BNT_EN1) (BNT_EN1) LCD_CS | 5 6 MOSI - * RESET | 7 8 | D49 (SD_DET) SD_DET | 7 8 | RESET - * NC | 9 10| GND GND | 9 10| 5V - * ----- ----- - * EXP2 EXP1 - * - * Needs custom cable: - * - * Board Adapter Display - * _________ - * EXP2-1 ----------- EXP1-10 - * EXP2-2 ----------- EXP1-9 - * EXP2-4 ----------- EXP1-8 - * EXP2-4 ----------- EXP1-7 - * EXP2-3 ----------- EXP1-6 - * EXP2-6 ----------- EXP1-5 - * EXP2-7 ----------- EXP1-4 - * EXP2-8 ----------- EXP1-3 - * EXP2-1 ----------- EXP1-2 - * EXP1-10 ----------- EXP1-1 - * - * NOTE: The MISO pin should not get a 5V signal. - * To fix, insert a 1N4148 diode in the MISO line. - */ - - #define BEEPER_PIN 37 - - #define SD_DETECT_PIN 49 - - #define CLCD_MOD_RESET 31 - #define CLCD_SPI_CS 33 -#endif // TOUCH_UI_FTDI_EVE && LCD_FYSETC_TFT81050 diff --git a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h deleted file mode 100644 index 1dc898e6ca..0000000000 --- a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "Creality3D RAMPS supports only 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Creality3D RAMPS" - -// -// Heaters / Fans -// - -// Power outputs EFBF or EFBE -#define MOSFET_D_PIN 7 - -#define FIL_RUNOUT_PIN 2 -#if NUM_RUNOUT_SENSORS > 1 - #define FIL_RUNOUT2_PIN 15 // Creality CR-X can use dual runout sensors -#endif - -#ifndef SD_DETECT_PIN - #define SD_DETECT_PIN 49 // Always define onboard SD detect -#endif - -#ifndef PS_ON_PIN - #define PS_ON_PIN 40 // Used by CR2020 Industrial series -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) - #define CASE_LIGHT_PIN 65 -#endif - -#include "pins_RAMPS.h" - -#ifndef BEEPER_PIN - #define BEEPER_PIN 37 // Always define beeper pin so Play Tone works with ExtUI -#endif - -#define EXP1_PIN 65 // A11 - Used by CR2020 Industrial series for case -#define EXP2_PIN 66 // A12 -#define EXP3_PIN 11 // SERVO0_PIN -#define EXP4_PIN 12 // PS_ON_PIN - -#define SUICIDE_PIN 12 // Used by CR2020 Industrial series -#ifndef SUICIDE_PIN_INVERTING - #define SUICIDE_PIN_INVERTING true -#endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h b/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h deleted file mode 100644 index ad56b7f9d1..0000000000 --- a/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "Dagoma3D F5 RAMPS supports only 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Dagoma3D F5 RAMPS" - -#define X_STOP_PIN 2 -#define Y_STOP_PIN 3 -#define Z_STOP_PIN 15 -#define FIL_RUNOUT_PIN 39 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 7 -#endif - -// -// Import RAMPS 1.4 pins -// -#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h deleted file mode 100644 index 513c7fe8d5..0000000000 --- a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HOTENDS > 1 || E_STEPPERS > 1 - #error "Ender-4 supports only 1 hotend / E-stepper. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Ender-4" - -#include "pins_RAMPS.h" - -// The board only has one PWM fan connector. The others are 12V always-on. -// The default config uses this pin to control the brightness of the LED -// band (case light). Thus the hotend and controller fans are always-on. - -#if ENABLED(CASE_LIGHT_ENABLE) - #undef FAN_PIN - #ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN RAMPS_D9_PIN - #endif -#endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h deleted file mode 100644 index 6d2dad2314..0000000000 --- a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega with RAMPS v1.0, v1.1, v1.2 pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "RAMPS <1.2" - -// Uncomment the following line for RAMPS v1.0 -//#define RAMPS_V_1_0 - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#define X_MAX_PIN 2 -#define Y_MIN_PIN 16 -#define Y_MAX_PIN 17 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 19 -#endif - -// -// Steppers -// -#define X_STEP_PIN 26 -#define X_DIR_PIN 28 -#define X_ENABLE_PIN 24 - -#define Y_STEP_PIN 38 -#define Y_DIR_PIN 40 -#define Y_ENABLE_PIN 36 - -#define Z_STEP_PIN 44 -#define Z_DIR_PIN 46 -#define Z_ENABLE_PIN 42 - -#define E0_STEP_PIN 32 -#define E0_DIR_PIN 34 -#define E0_ENABLE_PIN 30 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 2 // Analog Input -#define TEMP_BED_PIN 1 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card -#else - #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) -#endif - -// -// Heaters / Fans -// -#if ENABLED(RAMPS_V_1_0) - #define HEATER_0_PIN 12 - #define HEATER_BED_PIN -1 - #ifndef FAN_PIN - #define FAN_PIN 11 - #endif -#else // RAMPS_V_1_1 or RAMPS_V_1_2 - #define HEATER_0_PIN 10 - #define HEATER_BED_PIN 8 - #ifndef FAN_PIN - #define FAN_PIN 9 - #endif -#endif - -// -// Misc. Functions -// -#define SDPOWER_PIN 48 -#define SDSS 53 -#define LED_PIN 13 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 45 // Hardware PWM -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_ENA_PIN 41 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM -#define SPINDLE_DIR_PIN 43 diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h deleted file mode 100644 index 9908d9494f..0000000000 --- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega with RAMPS v1.4Plus, also known as 3DYMY version, pin assignments - * The differences to the RAMPS v1.4 are: - * - Swap heater E0 with E1 - * - Swap pins 8 and 10. Bed/Fan/Hotend as labeled on the board are on pins 8/9/10. - * - Change pins 16->42, 17->44 and 29->53 used for display. - * - * Applies to the following boards: - * - * RAMPS_PLUS_EFB (Extruder, Fan, Bed) - * RAMPS_PLUS_EEB (Extruder, Extruder, Bed) - * RAMPS_PLUS_EFF (Extruder, Fan, Fan) - * RAMPS_PLUS_EEF (Extruder, Extruder, Fan) - * RAMPS_PLUS_SF (Spindle, Controller Fan) - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "RAMPS 1.4 Plus" - -#define RAMPS_D8_PIN 10 -#define RAMPS_D10_PIN 8 - -#include "pins_RAMPS.h" - -// -// Steppers - Swap E0 / E1 on 3DYMY -// -#undef E0_STEP_PIN -#undef E0_DIR_PIN -#undef E0_ENABLE_PIN - -#undef E1_STEP_PIN -#undef E1_DIR_PIN -#undef E1_ENABLE_PIN - -#define E0_STEP_PIN 36 -#define E0_DIR_PIN 34 -#define E0_ENABLE_PIN 30 - -#define E1_STEP_PIN 26 -#define E1_DIR_PIN 28 -#define E1_ENABLE_PIN 24 - -#undef X_CS_PIN -#undef Y_CS_PIN -#undef Z_CS_PIN -#undef E0_CS_PIN -#undef E1_CS_PIN - -#if ENABLED(ULTRA_LCD) && NONE(REPRAPWORLD_GRAPHICAL_LCD, CR10_STOCKDISPLAY) && !BOTH(NEWPANEL, PANEL_ONE) - #if DISABLED(MKS_12864OLED) || ENABLED(MKS_12864OLED_SSD1306) - #undef LCD_PINS_RS - #define LCD_PINS_RS 42 // 3DYMY boards pin 16 -> 42 - #undef LCD_PINS_ENABLE - #define LCD_PINS_ENABLE 44 // 3DYMY boards pin 17 -> 44 - #endif - #undef LCD_PINS_D7 - #define LCD_PINS_D7 53 // 3DYMY boards pin 29 -> 53 -#endif diff --git a/Marlin/src/pins/ramps/pins_RIGIDBOARD.h b/Marlin/src/pins/ramps/pins_RIGIDBOARD.h deleted file mode 100644 index c43d786aa2..0000000000 --- a/Marlin/src/pins/ramps/pins_RIGIDBOARD.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * RIGIDBOARD Arduino Mega with RAMPS v1.4 pin assignments - */ - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "RigidBoard" -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 19 // Z-MAX pin J14 End Stops -#endif - -// -// MOSFET changes -// -#define RAMPS_D9_PIN 8 // FAN (by default) -#define RAMPS_D10_PIN 9 // EXTRUDER 1 -#define MOSFET_D_PIN 12 // EXTRUDER 2 or FAN - -#include "pins_RAMPS.h" - -// -// Steppers -// -// RigidBot swaps E0 / E1 plugs vs RAMPS 1.3 -#undef E0_STEP_PIN -#undef E0_DIR_PIN -#undef E0_ENABLE_PIN -#define E0_STEP_PIN 36 -#define E0_DIR_PIN 34 -#define E0_ENABLE_PIN 30 - -#undef E1_STEP_PIN -#undef E1_DIR_PIN -#undef E1_ENABLE_PIN -#define E1_STEP_PIN 26 -#define E1_DIR_PIN 28 -#define E1_ENABLE_PIN 24 - -#define STEPPER_RESET_PIN 41 // Stepper drivers have a reset on RigidBot - -// -// Temperature Sensors -// -#undef TEMP_0_PIN -#undef TEMP_1_PIN -#undef TEMP_BED_PIN -#define TEMP_0_PIN 14 // Analog Input -#define TEMP_1_PIN 13 // Analog Input -#define TEMP_BED_PIN 15 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#undef MAX6675_SS_PIN -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 53 // Don't use pin 53 if there is even the remote possibility of using Display/SD card -#else - #define MAX6675_SS_PIN 49 // Don't use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present -#endif - -// -// Heaters / Fans -// -#undef HEATER_BED_PIN -#define HEATER_BED_PIN 10 - -#ifndef FAN_PIN - #define FAN_PIN 8 // Same as RAMPS_13_EEF -#endif - -// -// Misc. Functions -// -#undef PS_ON_PIN - -// -// LCD / Controller -// -// LCD Panel options for the RigidBoard -#if ENABLED(RIGIDBOT_PANEL) - - #undef BEEPER_PIN - #define BEEPER_PIN -1 - - // Direction buttons - #define BTN_UP 37 - #define BTN_DWN 35 - #define BTN_LFT 33 - #define BTN_RT 32 - - // 'R' button - #undef BTN_ENC - #define BTN_ENC 31 - - // Disable encoder - #undef BTN_EN1 - #undef BTN_EN2 - - #undef SD_DETECT_PIN - #define SD_DETECT_PIN 22 - -#elif ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #undef SD_DETECT_PIN - #define SD_DETECT_PIN 22 - - #undef KILL_PIN - #define KILL_PIN 32 - -#endif diff --git a/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h b/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h deleted file mode 100644 index 1428de31a2..0000000000 --- a/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * RIGIDBOARD V2 Arduino Mega with RAMPS v1.4 pin assignments - */ - -#define BOARD_INFO_NAME "RigidBoard V2" - -#include "pins_RIGIDBOARD.h" - -// -// Steppers -// - -// I2C based DAC like on the Printrboard REVF -#define HAS_MOTOR_CURRENT_DAC - -// Channels available for DAC, For Rigidboard there are 4 -#define DAC_STEPPER_ORDER { 0, 1, 2, 3 } - -#define DAC_STEPPER_SENSE 0.05 // sense resistors on rigidboard stepper chips are .05 value -#define DAC_STEPPER_ADDRESS 0 -#define DAC_STEPPER_MAX 4096 // was 5000 but max allowable value is actually 4096 -#define DAC_STEPPER_VREF 1 // internal Vref, gain 2x = 4.096V -#define DAC_STEPPER_GAIN 1 // value of 1 here sets gain of 2 -#define DAC_DISABLE_PIN 42 // set low to enable DAC -#define DAC_OR_ADDRESS 0x01 - -#ifndef DAC_MOTOR_CURRENT_DEFAULT - #define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis -#endif diff --git a/Marlin/src/pins/ramps/pins_RL200.h b/Marlin/src/pins/ramps/pins_RL200.h deleted file mode 100644 index 3fccb90276..0000000000 --- a/Marlin/src/pins/ramps/pins_RL200.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Rapide Lite 200 v1 (RUMBA clone) pin assignments. Has slightly different assignment for - * extruder motors due to dual Z motors. Pinout therefore based on pins_RUMBA.h. - */ - -#define BOARD_INFO_NAME "RL200" -#define DEFAULT_MACHINE_NAME "Rapide Lite 200" - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "RL200v1 supports up to 2 hotends / E-steppers. Comment out this line to continue." -#elif NUM_Z_STEPPER_DRIVERS != 2 - #error "RL200 uses dual Z stepper motors. Set NUM_Z_STEPPER_DRIVERS to 2 or comment out this line to continue." -#elif !(AXIS_DRIVER_TYPE_X(DRV8825) && AXIS_DRIVER_TYPE_Y(DRV8825) && AXIS_DRIVER_TYPE_Z(DRV8825) && AXIS_DRIVER_TYPE_Z2(DRV8825) && AXIS_DRIVER_TYPE_E0(DRV8825)) - #error "You must set ([XYZ]|Z2|E0)_DRIVER_TYPE to DRV8825 in Configuration.h for RL200." -#endif - -#define E0_STEP_PIN 26 // (RUMBA E1 pins) -#define E0_DIR_PIN 25 -#define E0_ENABLE_PIN 27 - -#define E1_STEP_PIN 29 // (RUMBA E2 pins) -#define E1_DIR_PIN 28 -#define E1_ENABLE_PIN 39 - -#define Z2_STEP_PIN 23 // (RUMBA E0 pins) -#define Z2_DIR_PIN 22 -#define Z2_ENABLE_PIN 24 - -#include "pins_RUMBA.h" diff --git a/Marlin/src/pins/ramps/pins_RUMBA.h b/Marlin/src/pins/ramps/pins_RUMBA.h deleted file mode 100644 index 5be2896e18..0000000000 --- a/Marlin/src/pins/ramps/pins_RUMBA.h +++ /dev/null @@ -1,234 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * RUMBA pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 - #error "RUMBA supports up to 3 hotends / E-steppers. Comment out this line to continue." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Rumba" -#endif -#ifndef DEFAULT_MACHINE_NAME - #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#endif - -// -// Servos -// -#define SERVO0_PIN 5 - -// -// Limit Switches -// -#define X_MIN_PIN 37 -#define X_MAX_PIN 36 -#define Y_MIN_PIN 35 -#define Y_MAX_PIN 34 -#define Z_MIN_PIN 33 -#define Z_MAX_PIN 32 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 17 -#define X_DIR_PIN 16 -#define X_ENABLE_PIN 48 - -#define Y_STEP_PIN 54 -#define Y_DIR_PIN 47 -#define Y_ENABLE_PIN 55 - -#define Z_STEP_PIN 57 -#define Z_DIR_PIN 56 -#define Z_ENABLE_PIN 62 - -#ifndef E0_STEP_PIN - #define E0_STEP_PIN 23 - #define E0_DIR_PIN 22 - #define E0_ENABLE_PIN 24 -#endif - -#ifndef E1_STEP_PIN - #define E1_STEP_PIN 26 - #define E1_DIR_PIN 25 - #define E1_ENABLE_PIN 27 -#endif - -#if E1_STEP_PIN != 29 - #define E2_STEP_PIN 29 - #define E2_DIR_PIN 28 - #define E2_ENABLE_PIN 39 -#endif - -// -// Temperature Sensors -// -#ifndef TEMP_0_PIN - #if TEMP_SENSOR_0 == -1 - #define TEMP_0_PIN 6 // Analog Input (connector *K1* on RUMBA thermocouple ADD ON is used) - #else - #define TEMP_0_PIN 15 // Analog Input (default connector for thermistor *T0* on rumba board is used) - #endif -#endif - -#ifndef TEMP_1_PIN - #if TEMP_SENSOR_1 == -1 - #define TEMP_1_PIN 5 // Analog Input (connector *K2* on RUMBA thermocouple ADD ON is used) - #else - #define TEMP_1_PIN 14 // Analog Input (default connector for thermistor *T1* on rumba board is used) - #endif -#endif - -#if TEMP_SENSOR_2 == -1 - #define TEMP_2_PIN 7 // Analog Input (connector *K3* on RUMBA thermocouple ADD ON is used <-- this can't be used when TEMP_SENSOR_BED is defined as thermocouple) -#else - #define TEMP_2_PIN 13 // Analog Input (default connector for thermistor *T2* on rumba board is used) -#endif - -// Optional for extruder 4 or chamber: -//#define TEMP_X_PIN 12 // Analog Input (default connector for thermistor *T3* on rumba board is used) - -#ifndef TEMP_CHAMBER_PIN - //#define TEMP_CHAMBER_PIN 12 // Analog Input (default connector for thermistor *T3* on rumba board is used) -#endif - -#if TEMP_SENSOR_BED == -1 - #define TEMP_BED_PIN 7 // Analog Input (connector *K3* on RUMBA thermocouple ADD ON is used <-- this can't be used when TEMP_SENSOR_2 is defined as thermocouple) -#else - #define TEMP_BED_PIN 11 // Analog Input (default connector for thermistor *THB* on rumba board is used) -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define HEATER_1_PIN 3 -#define HEATER_2_PIN 6 -#define HEATER_3_PIN 8 -#define HEATER_BED_PIN 9 - -#ifndef FAN_PIN - #define FAN_PIN 7 -#endif -#ifndef FAN1_PIN - #define FAN1_PIN 8 -#endif - -// -// Misc. Functions -// -#define LED_PIN 13 -#define PS_ON_PIN 45 -#define KILL_PIN 46 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 45 -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#ifndef SPINDLE_LASER_PWM_PIN - #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM. Pin 4 interrupts OC0* and OC1* always in use? -#endif -#ifndef SPINDLE_LASER_ENA_PIN - #define SPINDLE_LASER_ENA_PIN 14 // Pullup! -#endif -#ifndef SPINDLE_DIR_PIN - #define SPINDLE_DIR_PIN 15 -#endif - -// -// LCD / Controller -// -#if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) - #define LCD_PINS_DC 38 // Set as output on init - #define LCD_PINS_RS 41 // Pull low for 1s to init - // DOGM SPI LCD Support - #define DOGLCD_CS 19 - #define DOGLCD_MOSI 42 - #define DOGLCD_SCK 18 - #define DOGLCD_A0 LCD_PINS_DC -#elif ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS 42 - #define DOGLCD_A0 19 - #define DOGLCD_MOSI 51 - #define DOGLCD_SCK 52 - - //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN 18 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 41 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN 38 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN 40 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN 25 - #endif - -#else - #define LCD_PINS_RS 19 - #define LCD_PINS_ENABLE 42 - #define LCD_PINS_D4 18 - #define LCD_PINS_D5 38 - #define LCD_PINS_D6 41 -#endif - -#define LCD_PINS_D7 40 - -// -// Beeper, SD Card, Encoder -// -#define BEEPER_PIN 44 - -#if ENABLED(SDSUPPORT) - #define SDSS 53 - #define SD_DETECT_PIN 49 -#endif - -#if ENABLED(NEWPANEL) - #define BTN_EN1 11 - #define BTN_EN2 12 - #define BTN_ENC 43 -#endif diff --git a/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h b/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h deleted file mode 100644 index 39942613ff..0000000000 --- a/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define BOARD_INFO_NAME "Raise3D Rumba" -#define DEFAULT_MACHINE_NAME "Raise3D N Series" - -// Raise3D uses thermocouples on the standard input pins -#define TEMP_0_PIN 15 // Analog Input -#define TEMP_1_PIN 14 // Analog Input - -#include "pins_RUMBA.h" diff --git a/Marlin/src/pins/ramps/pins_TANGO.h b/Marlin/src/pins/ramps/pins_TANGO.h deleted file mode 100644 index 715444cee2..0000000000 --- a/Marlin/src/pins/ramps/pins_TANGO.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * BIQU Tango pin assignments - */ - -#define BOARD_INFO_NAME "Tango" - -#define FAN_PIN 8 -#define FAN1_PIN -1 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 7 -#endif - -#ifndef TEMP_0_PIN - #if TEMP_SENSOR_0 == -1 - #define TEMP_0_PIN 10 // Analog Input (connector *K1* on Tango thermocouple ADD ON is used) - #else - #define TEMP_0_PIN 15 // Analog Input (default connector for thermistor *T0* on rumba board is used) - #endif -#endif - -#ifndef TEMP_1_PIN - #if TEMP_SENSOR_1 == -1 - #define TEMP_1_PIN 9 // Analog Input (connector *K2* on Tango thermocouple ADD ON is used) - #else - #define TEMP_1_PIN 14 // Analog Input (default connector for thermistor *T1* on rumba board is used) - #endif -#endif - -#include "pins_RUMBA.h" diff --git a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h deleted file mode 100644 index e7a59a69df..0000000000 --- a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Tenlog pin assignments - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Tenlog supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Tenlog D3 Hero" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// Servos -// -#define SERVO0_PIN 11 -#define SERVO1_PIN 6 -#define SERVO2_PIN -1 // Original pin 5 used for hotend fans -#define SERVO3_PIN 4 - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#define X_MAX_PIN 2 -#define Y_MIN_PIN 14 -//#define Y_MAX_PIN 15 // Connected to "DJ" plug on extruder heads -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 15 // Ramps is normally 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -//#ifndef X_CS_PIN - //#define X_CS_PIN 53 -//#endif - -#define X2_STEP_PIN 36 -#define X2_DIR_PIN 34 -#define X2_ENABLE_PIN 30 -//#ifndef X2_CS_PIN - //#define X2_CS_PIN 53 -//#endif - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -//#ifndef Y_CS_PIN - //#define Y_CS_PIN 49 -//#endif - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 -//#ifndef Z_CS_PIN - //#define Z_CS_PIN 40 -//#endif - -#define Z2_STEP_PIN 65 -#define Z2_DIR_PIN 66 -#define Z2_ENABLE_PIN 64 -//#ifndef Z2_CS_PIN - //#define Z2_CS_PIN 40 -//#endif - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -//#ifndef E0_CS_PIN - //define E0_CS_PIN 42 -//#endif - -#define E1_STEP_PIN 57 -#define E1_DIR_PIN 58 -#define E1_ENABLE_PIN 59 -//#ifndef E1_CS_PIN - //define E1_CS_PIN 44 -//#endif - -//#define E2_STEP_PIN 42 -//#define E2_DIR_PIN 43 -//#define E2_ENABLE_PIN 44 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 // Analog Input -#define TEMP_1_PIN 15 // Analog Input -#define TEMP_BED_PIN 14 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN -1 // Don't use 53 if using Display/SD card -#else - #define MAX6675_SS_PIN -1 // Don't use 49 (SD_DETECT_PIN) -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 10 -#define HEATER_1_PIN 11 -#define HEATER_BED_PIN 8 - -#define FAN_PIN 9 -#define FAN1_PIN 5 // Normall this would be a servo pin - -// XXX Runout support unknown? -//#define NUM_RUNOUT_SENSORS 0 -//#define FIL_RUNOUT_PIN 22 -//#define FIL_RUNOUT2_PIN 21 - -// -// Misc. Functions -// -//#define CASE_LIGHT_PIN 5 -#define SDSS 53 -//#ifndef LED_PIN - //#define LED_PIN 13 -//#endif - -//#define SPINDLE_LASER_PWM_PIN -1 // Hardware PWM -//#define SPINDLE_LASER_ENA_PIN 4 // Pullup! - -// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector -//#define FILWIDTH_PIN 5 // Analog Input - -// -// LCD / Controller -// - -//#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - -#define LCD_PINS_RS -1 -#define LCD_PINS_ENABLE -1 -#define LCD_PINS_D4 -1 -#define LCD_PINS_D5 -1 -#define LCD_PINS_D6 -1 -#define LCD_PINS_D7 -1 -//#define BTN_EN1 31 -//#define BTN_EN2 33 -//#define BTN_ENC 35 -#define SD_DETECT_PIN 49 -//#ifndef KILL_PIN - //#define KILL_PIN 41 -//#endif -//#ifndef BEEPER_PIN -#define BEEPER_PIN -1 -//#endif - -//#endif // REPRAP_DISCOUNT_SMART_CONTROLLER diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h deleted file mode 100644 index 9508be0173..0000000000 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega with RAMPS v1.3 for Anycubic - */ - -#define BOARD_INFO_NAME "Anycubic RAMPS 1.3" - -#define IS_RAMPS_EFB -#define RAMPS_D9_PIN 44 -#define FAN2_PIN 9 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 9 -#endif - -#include "pins_RAMPS_13.h" - -#undef E1_STEP_PIN -#undef E1_DIR_PIN -#undef E1_ENABLE_PIN -#undef E1_CS_PIN diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h deleted file mode 100644 index 1c2cb60957..0000000000 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ /dev/null @@ -1,157 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega with RAMPS v1.4 for Anycubic - */ - -#define BOARD_INFO_NAME "Anycubic RAMPS 1.4" - -// Board labeled pins: - -#define TG_HEATER_BED_PIN 8 -#define TG_HEATER_0_PIN 10 -#define TG_HEATER_1_PIN 45 // Anycubic Kossel: Unused - -#define TG_FAN0_PIN 9 // Anycubic Kossel: Usually the part cooling fan -#define TG_FAN1_PIN 7 // Anycubic Kossel: Unused -#define TG_FAN2_PIN 44 // Anycubic Kossel: Hotend fan - -// -// Servos -// -#if MB(TRIGORILLA_14_11) - #define SERVO0_PIN 5 - #define SERVO1_PIN 4 - #define SERVO2_PIN 11 - #define SERVO3_PIN 6 -#endif - -// Remap MOSFET pins to common usages: - -#define RAMPS_D10_PIN TG_HEATER_0_PIN // HEATER_0_PIN is always RAMPS_D10_PIN in pins_RAMPS.h - -#if HAS_MULTI_HOTEND // EEF and EEB - #define RAMPS_D9_PIN TG_HEATER_1_PIN - #if !TEMP_SENSOR_BED - // EEF - #define RAMPS_D8_PIN TG_FAN0_PIN - #else - // EEB - #define RAMPS_D8_PIN TG_HEATER_BED_PIN - #define FAN_PIN TG_FAN0_PIN // Override pin 4 in pins_RAMPS.h - #endif -#elif TEMP_SENSOR_BED - // EFB (Anycubic Kossel default) - #define RAMPS_D9_PIN TG_FAN0_PIN - #if ENABLED(ANYCUBIC_LCD_CHIRON) - #define RAMPS_D8_PIN TG_HEATER_1_PIN // Heated bed is connected to HEATER1 output - #else - #define RAMPS_D8_PIN TG_HEATER_BED_PIN - #endif -#else - // EFF - #define RAMPS_D9_PIN TG_FAN1_PIN - #define RAMPS_D8_PIN TG_FAN0_PIN -#endif - -#if HAS_MULTI_HOTEND || TEMP_SENSOR_BED // EEF, EEB, EFB - #define FAN1_PIN TG_FAN1_PIN -#endif -#define FAN2_PIN TG_FAN2_PIN - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN TG_FAN2_PIN // Used in Anycubic Kossel example config -#endif - -#if ENABLED(ANYCUBIC_LCD_I3MEGA) - #define CONTROLLER_FAN_PIN TG_FAN1_PIN -#endif - -// -// AnyCubic standard pin mappings -// -// On most printers, endstops are NOT all wired to the appropriate pins on the Trigorilla board. -// For instance, on a Chiron, Y axis goes to an aux connector. -// There are also other things that have been wired in creative ways. -// To enable PIN definitions for a specific printer model, #define the appropriate symbol after -// MOTHERBOARD in Configuration.h - -// -// Limit Switches -// -//#define ANYCUBIC_4_MAX_PRO_ENDSTOPS - -#if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) - #define X_MAX_PIN 43 - #define Y_STOP_PIN 19 -#elif EITHER(ANYCUBIC_LCD_CHIRON, ANYCUBIC_LCD_I3MEGA) - #define Y_STOP_PIN 42 - #define Z2_MIN_PIN 43 - #ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 2 - #endif - #ifndef FIL_RUNOUT_PIN - #if ENABLED(ANYCUBIC_LCD_CHIRON) - #define FIL_RUNOUT_PIN 33 - #else - #define FIL_RUNOUT_PIN 19 - #endif - #endif - #define BEEPER_PIN 31 - #define SD_DETECT_PIN 49 -#endif - -#include "pins_RAMPS.h" - -// -// AnyCubic made the following changes to 1.1.0-RC8 -// If these are appropriate for your LCD let us know. -// -#if 0 && HAS_WIRED_LCD - - // LCD Display output pins - #if BOTH(NEWPANEL, PANEL_ONE) - #undef LCD_PINS_D6 - #define LCD_PINS_D6 57 - #endif - - // LCD Display input pins - #if ENABLED(NEWPANEL) - #if ANY(VIKI2, miniVIKI) - #undef DOGLCD_A0 - #define DOGLCD_A0 23 - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #undef BEEPER_PIN - #define BEEPER_PIN 33 - #undef LCD_BACKLIGHT_PIN - #define LCD_BACKLIGHT_PIN 67 - #endif - #elif ENABLED(MINIPANEL) - #undef BEEPER_PIN - #define BEEPER_PIN 33 - #undef DOGLCD_A0 - #define DOGLCD_A0 42 - #endif - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h deleted file mode 100644 index f342eff8aa..0000000000 --- a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h +++ /dev/null @@ -1,279 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega for Tronxy X5S-2E, etc. - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "TRONXY-V3-1.0 supports only 2 hotends/E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "TRONXY-V3-1.0" - -// -// Servos -// -#define SERVO1_PIN 12 // 2560 PIN 25/PB6 - -// -// Import RAMPS 1.4 pins -// -#include "pins_RAMPS.h" - -/** - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * ===== AUX-1 connector ===== - * - * 2 4 6 8 - * #----------------# - * #2 | ° ° ° ° | - * #1 | ° ° ° ° | - * NOTCH #------ ------# - * 1 3 5 7 - * - * ################################### - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################### - * # 1 | VCC | + # - * # 2 | VCC | + # - * # 3 | GND | - # - * # 4 | GND | - # - * # 5 | N/C | # - * # 6 | 3 / PE1 (TXD0) | D1 # - * # 7 | N/C | # - * # 8 | 2 / PE0 (RXD0) | D0 # - * ################################### - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * ===== Limit Switch connectors ===== - * - * ############## X+ ################# - * X+ # Pin | ATMEGA2560 Pin | Arduino # - * 1 2 3 ################################### - * #- --- -# # 1 | 6 / PE4 (INT4) | D2 # - * | ° ° ° | # 2 | GND | - # - * #-------# # 3 | VCC | + # - * ################################### - * - * ############## X- ################# - * X- # Pin | ATMEGA2560 Pin | Arduino # - * 1 2 3 ################################### - * #- --- -# # 1 | 7 / PE5 (INT5) | D3 # - * | ° ° ° | # 2 | GND | - # - * #-------# # 3 | VCC | + # - * ################################### - * - * ############## Y+ ################# - * Y+ # Pin | ATMEGA2560 Pin | Arduino # - * 1 2 3 ################################### - * #- --- -# # 1 | 63/PJ0 (PCINT9) | D15 # - * | ° ° ° | # 2 | GND | - # - * #-------# # 3 | VCC | + # - * ################################### - * - * ############## Y- ################# - * Y- # Pin | ATMEGA2560 Pin | Arduino # - * 1 2 3 ################################### - * #- --- -# # 1 | 64/PJ1 (PCINT10)| D14 # - * | ° ° ° | # 2 | GND | - # - * #-------# # 3 | VCC | + # - * ################################### - * - * ############## Z+ ################# - * Z+ # Pin | ATMEGA2560 Pin | Arduino # - * 1 2 3 ################################### - * #- --- -# # 1 | 45 / PD2 (INT2) | D19 # - * | ° ° ° | # 2 | GND | - # - * #-------# # 3 | VCC | + # - * ################################### - * - * ############## Z- ################# - * Z- # Pin | ATMEGA2560 Pin | Arduino # - * 1 2 3 ################################### - * #- --- -# # 1 | 46 / PD3 (INT3) | D18 # - * | ° ° ° | # 2 | GND | - # - * #-------# # 3 | VCC | + # - * ################################### - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * ===== EXP1/EXP2 connectors ===== - * - * (NOTE ORDER) EXP2 EXP1 - * 2 4 6 8 10 2 4 6 8 10 - * #-------------------# #-------------------# - * #2 | ° ° ° ° ° | #2 | ° ° ° ° ° | - * #1 | ° ° ° ° ° | #1 | ° ° ° ° ° | - * NOTCH #-------- -------# NOTCH #-------- -------# - * 1 3 5 7 9 1 3 5 7 9 - * - * ############# EXP1 ################ - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################### - * # 1 | 53 / PC0 | D37 # - * # 2 | 55 / PC2 | D35 # - * # 3 | 12 / PH0 (RXD2) | D17 # - * # 4 | 13 / PH1 (TXD2) | D16 # - * # 5 | 77 / PA1 | D23 # - * # 6 | 75 / PA3 | D25 # - * # 7 | 73 / PA5 | D27 # - * # 8 | 71 / PA7 | D29 # - * # 9 | GND | - # - * # 10 | VCC | + # - * ################################### - * - * ############# EXP2 ################ - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################### - * # 1 | 22 / PB3 (MISO) | D50 # - * # 2 | 20 / PB1 (SCK) | D52 # - * # 3 | 59 / PC6 | D31 # - * # 4 | N/C | # - * # 5 | 57 / PC4 | D33 # - * # 6 | 21 / PB2 (MOSI) | D51 # - * # 7 | N/C | # - * # 8 | 30 / !RESET | RESET # - * # 9 | GND | - # - * # 10 | 51 / PG0 | D41 # - * ################################### - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * ===== ICSP connector ===== - * - * 2 4 6 - * #---------# - * | ° ° ° | - * | ° ° ° | - * #---------# - * 1 3 5 - * - * ################################## - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################## - * # 1 | 22 / PB3 (MISO)| 50 # - * # 2 | VCC | + # - * # 3 | 20 / PB1 (SCK) | 52 # - * # 4 | 21 / PB2 (MOSI)| 51 # - * # 5 | 30 / !RESET | RESET # - * # 6 | GND | - # - * ################################## - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * ===== SERVOS connector ===== - * - * 2 4 6 - * #---------# - * | ° ° ° | - * | ° ° ° | - * #---------# - * 1 3 5 - * - * ################################## - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################## - * # 1 | 25 / PB6 (OC1B)| D12 # - * # 2 | 24 / PB5 (OC1A)| D11 # - * # 3 | GND | - # - * # 4 | GND | - # - * # 5 | VCC | + # - * # 6 | VCC | + # - * ################################## - * - * NOTE: Pins 1 and 2 are the ones closest to the "L" and "PWR" LEDs. - * - * NOTE: Check servo wiring before connecting, for example: - * + Airtronics (non-Z) use: Red = +; Black = -; Black & White, White or Orange = signal. - * + Airtronics-Z use: Red = +; Black = -; Blue = signal. - * + Futaba use: Red = +; Black = -; White = signal. - * + Hitec use: Red = +; Black = -; Yellow = signal. - * + JR use: Red = +; Brown = -; Orange = signal. - * - * NOTE: Test your servo limits: - * Due to effects of component tolerances and/or age, the usable range of S-values for individual servos may be less than the settable 0-255 range. For example: - * 1. One servo may have a fully usable range of M280 P0 S0 through M280 P0 S255. - * 2. A different servo (of the same brand and model) may have a usable range of only M280 P0 S0 through M280 P0 S165 after which you experience binding. - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * ===== Thermistor connectors ===== - * - * (NOTE ORDER) TH2 TH1 TB - * 1 2 1 2 1 2 - * #- -# #- -# #- -# - * | ° ° | | ° ° | | ° ° | - * #-----# #-----# #-----# - * - * ############## TB ################# - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################### - * # 1 | GND | - # - * # 2 | 83 / PK6 (ADC14)| A14 # - * ################################### - * - * ############## TH1 ################ - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################### - * # 1 | GND | - # - * # 2 | 84 / PK5 (ADC13)| A13 # - * ################################### - * - * ############## TH2 ################ - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################### - * # 1 | GND | - # - * # 2 | 82 / PK7 (ADC15)| A15 # - * ################################### - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - * - * ===== XS3 connector ===== - * - * 2 4 6 - * #---------# - * | ° ° ° | - * | ° ° ° | - * #---------# - * 1 3 5 - * - * ################################## - * # Pin | ATMEGA2560 Pin | Arduino # - * ################################## - * # 1 | 85 / ADC12 | A12 # - * # 2 | 86 / ADC11 | A11 # - * # 3 | GND | - # - * # 4 | GND | - # - * # 5 | VCC | + # - * # 6 | VCC | + # - * ################################## - * - * NOTE: Pins 1 and 2 are the ones closest to the "L" and "PWR" LEDs. - * - * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - */ diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h deleted file mode 100644 index 1568288e69..0000000000 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ /dev/null @@ -1,515 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#if HOTENDS > 5 || E_STEPPERS > 5 - #error "TTOSCAR supports up to 5 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "TT OSCAR" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// Servos -// -#define SERVO0_PIN 11 -#define SERVO1_PIN 12 -#define SERVO2_PIN 5 -#define SERVO3_PIN 4 - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#define X_MAX_PIN 2 -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN SERVO3_PIN -#endif - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -#define X_CS_PIN 57 - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -#define Y_CS_PIN 58 - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 -#define Z_CS_PIN 53 - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -#define E0_CS_PIN 49 - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 -#define E1_CS_PIN E0_CS_PIN - -#define E2_STEP_PIN 63 -#define E2_DIR_PIN 22 -#define E2_ENABLE_PIN 59 -#define E2_CS_PIN E0_CS_PIN - -#define E3_STEP_PIN 32 -#define E3_DIR_PIN 40 -#define E3_ENABLE_PIN 39 -#define E3_CS_PIN E0_CS_PIN - -#define E4_STEP_PIN 43 -#define E4_DIR_PIN 42 -#define E4_ENABLE_PIN 47 -#define E4_CS_PIN E0_CS_PIN - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - - #define X_SERIAL_TX_PIN -1 // 59 - #define X_SERIAL_RX_PIN -1 // 63 - #define X2_SERIAL_TX_PIN -1 - #define X2_SERIAL_RX_PIN -1 - - #define Y_SERIAL_TX_PIN -1 // 64 - #define Y_SERIAL_RX_PIN -1 // 40 - #define Y2_SERIAL_TX_PIN -1 - #define Y2_SERIAL_RX_PIN -1 - - #define Z_SERIAL_TX_PIN -1 // 44 - #define Z_SERIAL_RX_PIN -1 // 42 - #define Z2_SERIAL_TX_PIN -1 - #define Z2_SERIAL_RX_PIN -1 - - #define E0_SERIAL_TX_PIN -1 // 66 - #define E0_SERIAL_RX_PIN -1 // 65 - #define E1_SERIAL_TX_PIN -1 - #define E1_SERIAL_RX_PIN -1 - #define E2_SERIAL_TX_PIN -1 - #define E2_SERIAL_RX_PIN -1 - #define E3_SERIAL_TX_PIN -1 - #define E3_SERIAL_RX_PIN -1 - #define E4_SERIAL_TX_PIN -1 - #define E4_SERIAL_RX_PIN -1 - #define E5_SERIAL_RX_PIN -1 - #define E6_SERIAL_RX_PIN -1 - #define E7_SERIAL_RX_PIN -1 -#endif - -// -// Default pins for TMC software SPI -// -//#if ENABLED(TMC_USE_SW_SPI) -// #ifndef TMC_SW_MOSI -// #define TMC_SW_MOSI 66 -// #endif -// #ifndef TMC_SW_MISO -// #define TMC_SW_MISO 44 -// #endif -// #ifndef TMC_SW_SCK -// #define TMC_SW_SCK 64 -// #endif -//#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 -#define TEMP_1_PIN 15 -#define TEMP_2_PIN 10 -#define TEMP_3_PIN 11 -#define TEMP_BED_PIN 14 - -#if TEMP_SENSOR_CHAMBER > 0 - #define TEMP_CHAMBER_PIN 12 -#else - #define TEMP_4_PIN 12 -#endif - -// SPI for Max6675 or Max31855 Thermocouple -//#if DISABLED(SDSUPPORT) -// #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card -//#else -// #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) -//#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 10 -#define HEATER_1_PIN 7 -#define HEATER_2_PIN 44 -#define HEATER_BED_PIN 8 - -#define FAN_PIN 9 - -#if EXTRUDERS >= 5 - #define HEATER_4_PIN 6 -#else - #define FAN1_PIN 6 -#endif - -#if EXTRUDERS >= 4 - #define HEATER_3_PIN 45 -#else - #define FAN2_PIN 45 -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 - -//#ifndef FILWIDTH_PIN -// #define FILWIDTH_PIN 5 // Analog Input -//#endif - -// DIO 4 (Servos plug) for the runout sensor. -//#define FIL_RUNOUT_PIN SERVO3_PIN - -#ifndef PS_ON_PIN - #define PS_ON_PIN 12 -#endif - -// -// Case Light -// -#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENABLE_PIN) - #if !NUM_SERVOS // Prefer the servo connector - #define CASE_LIGHT_PIN 6 // Hardware PWM - #elif HAS_FREE_AUX2_PINS // Try to use AUX 2 - #define CASE_LIGHT_PIN 44 // Hardware PWM - #endif -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENABLE) - #if !NUM_SERVOS // Prefer the servo connector - #define SPINDLE_LASER_ENABLE_PIN 4 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM - #define SPINDLE_DIR_PIN 5 - #elif HAS_FREE_AUX2_PINS // Try to use AUX 2 - #define SPINDLE_LASER_ENABLE_PIN 40 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM - #define SPINDLE_DIR_PIN 65 - #endif -#endif - -// -// Průša i3 MK2 Multiplexer Support -// -//#ifndef E_MUX0_PIN -// #define E_MUX0_PIN 58 // Y_CS_PIN -//#endif -//#ifndef E_MUX1_PIN -// #define E_MUX1_PIN 53 // Z_CS_PIN -//#endif -//#ifndef E_MUX2_PIN -// #define E_MUX2_PIN 49 // En_CS_PIN -//#endif - -////////////////////////// -// LCDs and Controllers // -////////////////////////// - -#if HAS_WIRED_LCD - - // - // LCD Display output pins - // - #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - - #elif BOTH(NEWPANEL, PANEL_ONE) - - #define LCD_PINS_RS 40 - #define LCD_PINS_ENABLE 42 - #define LCD_PINS_D4 65 - #define LCD_PINS_D5 66 - #define LCD_PINS_D6 44 - #define LCD_PINS_D7 64 - - #elif ENABLED(ZONESTAR_LCD) - - #define LCD_PINS_RS 64 - #define LCD_PINS_ENABLE 44 - #define LCD_PINS_D4 63 - #define LCD_PINS_D5 40 - #define LCD_PINS_D6 42 - #define LCD_PINS_D7 65 - #define ADC_KEYPAD_PIN 12 - - #else - - #if ENABLED(CR10_STOCKDISPLAY) - - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 - #define LCD_PINS_D4 25 - - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 37 - #endif - - #else - - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) - #define LCD_PINS_DC 25 // Set as output on init - #define LCD_PINS_RS 27 // Pull low for 1s to init - // DOGM SPI LCD Support - #define DOGLCD_CS 16 - #define DOGLCD_MOSI 17 - #define DOGLCD_SCK 23 - #define DOGLCD_A0 LCD_PINS_DC - #else - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #endif - - #define LCD_PINS_D7 29 - - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 - #endif - - #endif - - #if DISABLED(NEWPANEL) - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 - #endif - - #endif - - // - // LCD Display input pins - // - #if ENABLED(NEWPANEL) - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN 37 - - #if ENABLED(CR10_STOCKDISPLAY) - #define BTN_EN1 17 - #define BTN_EN2 23 - #else - #define BTN_EN1 31 - #define BTN_EN2 33 - #endif - - #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - //#define KILL_PIN 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 - #endif - - #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 - //#define KILL_PIN 41 - - #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - #define BTN_ENC -1 - - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - - #elif EITHER(VIKI2, miniVIKI) - - #define DOGLCD_CS 45 - #define DOGLCD_A0 44 - #define LCD_SCREEN_ROT_180 - - #define BEEPER_PIN 33 - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 - - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 - - #define SDSS 53 - #define SD_DETECT_PIN -1 // Pin 49 for display SD interface, 72 for easy adapter board - //#define KILL_PIN 31 - - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - - #define BEEPER_PIN 23 - #define LCD_BACKLIGHT_PIN 33 - - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - //#define KILL_PIN 41 - - #elif ENABLED(MKS_MINI_12864) - - #define DOGLCD_A0 27 - #define DOGLCD_CS 25 - - // GLCD features - //#define LCD_CONTRAST_INIT 190 - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - #define BEEPER_PIN 37 - - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - //#define SDSS 53 - #define SD_DETECT_PIN 49 - //#define KILL_PIN 64 - - #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN 42 - // not connected to a pin - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - - // GLCD features - //#define LCD_CONTRAST_INIT 190 - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 - - #define SDSS 53 - #define SD_DETECT_PIN 49 - //#define KILL_PIN 64 - - #else - - // Beeper on AUX-4 - #define BEEPER_PIN 33 - - // Buttons are directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - //#define KILL_PIN 41 - #endif - - #endif - - #endif // NEWPANEL - -#endif diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h deleted file mode 100644 index c6251ae817..0000000000 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ /dev/null @@ -1,142 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Ultiboard v2.0 pin assignments - */ - -/** - * Rev B 2 JAN 2017 - * - * Added pin definitions for: - * M3, M4 & M5 spindle control commands - * case light - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Ultimaker 2.x" -#define DEFAULT_MACHINE_NAME "Ultimaker" -#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" - -// -// Limit Switches -// -#define X_STOP_PIN 22 -#define Y_STOP_PIN 26 -#define Z_STOP_PIN 29 - -// -// Steppers -// -#define X_STEP_PIN 25 -#define X_DIR_PIN 23 -#define X_ENABLE_PIN 27 - -#define Y_STEP_PIN 32 -#define Y_DIR_PIN 33 -#define Y_ENABLE_PIN 31 - -#define Z_STEP_PIN 35 -#define Z_DIR_PIN 36 -#define Z_ENABLE_PIN 34 - -#define E0_STEP_PIN 42 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 37 - -#define E1_STEP_PIN 49 -#define E1_DIR_PIN 47 -#define E1_ENABLE_PIN 48 - -#define MOTOR_CURRENT_PWM_XY_PIN 44 -#define MOTOR_CURRENT_PWM_Z_PIN 45 -#define MOTOR_CURRENT_PWM_E_PIN 46 -// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range -#ifndef MOTOR_CURRENT_PWM_RANGE - #define MOTOR_CURRENT_PWM_RANGE 2000 -#endif -#define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} - -// -// Temperature Sensors -// -#define TEMP_0_PIN 8 // Analog Input -#define TEMP_1_PIN 9 // Analog Input -#define TEMP_BED_PIN 10 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define HEATER_1_PIN 3 -#define HEATER_BED_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 7 -#endif - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 77 -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define SD_DETECT_PIN 39 -#define LED_PIN 8 -#define SAFETY_TRIGGERED_PIN 28 // PIN to detect the safety circuit has triggered -#define MAIN_VOLTAGE_MEASURE_PIN 14 // ANALOG PIN to measure the main voltage, with a 100k - 4k7 resitor divider. - -// -// LCD / Controller -// -#define BEEPER_PIN 18 - -#define LCD_PINS_RS 20 -#define LCD_PINS_ENABLE 15 -#define LCD_PINS_D4 14 -#define LCD_PINS_D5 21 -#define LCD_PINS_D6 5 -#define LCD_PINS_D7 6 - -// Buttons are directly attached -#define BTN_EN1 40 -#define BTN_EN2 41 -#define BTN_ENC 19 - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER // use the LED_PIN for spindle speed control or case light - #undef LED_PIN - #define SPINDLE_DIR_PIN 16 - #define SPINDLE_LASER_ENA_PIN 17 // Pullup! - #define SPINDLE_LASER_PWM_PIN 8 // Hardware PWM -#else - #undef LED_PIN - #define CASE_LIGHT_PIN 8 -#endif diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h deleted file mode 100644 index 597a37bdbc..0000000000 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Ultimaker pin assignments - */ - -/** - * Rev B 2 JAN 2017 - * - * Added pin definitions for: - * M3, M4 & M5 spindle control commands - * case light - */ - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Ultimaker" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" - -// -// Servos -// -#define SERVO0_PIN 11 - -// -// Limit Switches -// -#define X_MIN_PIN 22 -#define X_MAX_PIN 24 -#define Y_MIN_PIN 26 -#define Y_MAX_PIN 28 -#define Z_MIN_PIN 30 -#define Z_MAX_PIN 32 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 25 -#define X_DIR_PIN 23 -#define X_ENABLE_PIN 27 - -#define Y_STEP_PIN 31 -#define Y_DIR_PIN 33 -#define Y_ENABLE_PIN 29 - -#define Z_STEP_PIN 37 -#define Z_DIR_PIN 39 -#define Z_ENABLE_PIN 35 - -#define E0_STEP_PIN 43 -#define E0_DIR_PIN 45 -#define E0_ENABLE_PIN 41 - -#define E1_STEP_PIN 49 -#define E1_DIR_PIN 47 -#define E1_ENABLE_PIN 48 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 8 // Analog Input -#define TEMP_1_PIN 9 // Analog Input -#define TEMP_BED_PIN 10 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -#define HEATER_1_PIN 3 -#define HEATER_BED_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 7 -#endif - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define PS_ON_PIN 12 -#define SUICIDE_PIN 54 // PIN that has to be turned on right after start, to keep power flowing. - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 8 -#endif - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #define BEEPER_PIN 18 - - #if ENABLED(NEWPANEL) - - #define LCD_PINS_RS 20 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 16 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 5 - #define LCD_PINS_D7 6 - - // Buttons directly attached - #define BTN_EN1 40 - #define BTN_EN2 42 - #define BTN_ENC 19 - - #define SD_DETECT_PIN 38 - - #else // !NEWPANEL - Old style panel with shift register - - // Buttons attached to a shift register - #define SHIFT_CLK 38 - #define SHIFT_LD 42 - #define SHIFT_OUT 40 - #define SHIFT_EN 17 - - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 5 - #define LCD_PINS_D4 6 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 20 - #define LCD_PINS_D7 19 - - #define SD_DETECT_PIN -1 - - #endif // !NEWPANEL - -#endif // HAS_WIRED_LCD - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 10 // Pullup! -#define SPINDLE_DIR_PIN 11 // use the EXP3 PWM header diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h deleted file mode 100644 index c5bbd02bf5..0000000000 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ /dev/null @@ -1,274 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Ultimaker pin assignments (Old electronics) - */ - -/** - * Rev B 3 JAN 2017 - * - * Details on pin definitions for M3, M4 & M5 spindle control commands and for - * the CASE_LIGHT_PIN are at the end of this file. - * - * This started out as an attempt to add pin definitions for M3, M4 & M5 spindle - * control commands but quickly turned into a head scratcher as the sources for - * the revisions provided inconsistent information. - * - * As best I can determine: - * 1.5.3 boards should use the pins_ULTIMAKER.h file which means the BOARD_INFO_NAME - * define in this file should say 1.5.3 rather than 1.5.4 - * This file is meant for 1.1 - 1.3 boards. - * The endstops for the 1.0 boards use different definitions than on the 1.1 - 1.3 - * boards. - * - * I've added sections that have the 1.0 and 1.5.3 + endstop definitions so you can - * easily switch if needed. I've also copied over the 1.5.3 + LCD definitions. - * - * To be 100% sure of the board you have: - * 1. In Configuration_adv.h enable "PINS_DEBUGGING" - * 2. Compile & uploade - * 3. Enter the command "M43 W1 I1". This command will report that pin nmumber and - * name of any pin that changes state. - * 4. Using a 1k (approximately) resistor pull the endstops and some of the LCD pins - * to ground and see what is reported. - * 5. If the reported pin doesn't match the file then try a different board revision - * and repeat steps 2 - 5 - */ - -#define BOARD_REV_1_1_TO_1_3 -//#define BOARD_REV_1_0 -//#define BOARD_REV_1_5 - -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#ifdef BOARD_REV_1_1_TO_1_3 - #define BOARD_INFO_NAME "Ultimaker 1.1-1.3" -#elif defined(BOARD_REV_1_0) - #define BOARD_INFO_NAME "Ultimaker 1.0" -#elif defined(BOARD_REV_1_5) - #define BOARD_INFO_NAME "Ultimaker 1.5" -#else - #define BOARD_INFO_NAME "Ultimaker 1.5.4+" -#endif -#define DEFAULT_MACHINE_NAME "Ultimaker" -#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" - -// -// Limit Switches -// -#if ENABLED(BOARD_REV_1_1_TO_1_3) - #define X_MIN_PIN 15 // SW1 - #define X_MAX_PIN 14 // SW2 - #define Y_MIN_PIN 17 // SW3 - #define Y_MAX_PIN 16 // SW4 - #define Z_MIN_PIN 19 // SW5 - #define Z_MAX_PIN 18 // SW6 -#endif - -#if ENABLED(BOARD_REV_1_0) - #if HAS_CUTTER - #define X_STOP_PIN 13 // SW1 (didn't change) - also has a useable hardware PWM - #define Y_STOP_PIN 12 // SW2 - #define Z_STOP_PIN 11 // SW3 - #else - #define X_MIN_PIN 13 // SW1 - #define X_MAX_PIN 12 // SW2 - #define Y_MIN_PIN 11 // SW3 - #define Y_MAX_PIN 10 // SW4 - #define Z_MIN_PIN 9 // SW5 - #define Z_MAX_PIN 8 // SW6 - #endif -#endif - -#if ENABLED(BOARD_REV_1_5) - #define X_MIN_PIN 22 - #define X_MAX_PIN 24 - #define Y_MIN_PIN 26 - #define Y_MAX_PIN 28 - #define Z_MIN_PIN 30 - #define Z_MAX_PIN 32 -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#if !defined(Z_MIN_PROBE_PIN) && !BOTH(HAS_CUTTER, BOARD_REV_1_0) - #define Z_MIN_PROBE_PIN Z_MAX_PIN -#endif - -// -// Steppers -// -#define X_STEP_PIN 25 -#define X_DIR_PIN 23 -#define X_ENABLE_PIN 27 - -#define Y_STEP_PIN 31 -#define Y_DIR_PIN 33 -#define Y_ENABLE_PIN 29 - -#define Z_STEP_PIN 37 -#define Z_DIR_PIN 39 -#define Z_ENABLE_PIN 35 - -#if BOTH(HAS_CUTTER, BOARD_REV_1_1_TO_1_3) && EXTRUDERS == 1 - // Move E0 to the spare and get Spindle/Laser signals from E0 - #define E0_STEP_PIN 49 - #define E0_DIR_PIN 47 - #define E0_ENABLE_PIN 48 -#else - #define E0_STEP_PIN 43 - #define E0_DIR_PIN 45 - #define E0_ENABLE_PIN 41 - - #define E1_STEP_PIN 49 - #define E1_DIR_PIN 47 - #define E1_ENABLE_PIN 48 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 8 // Analog Input -#define TEMP_1_PIN 1 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 2 -//#define HEATER_1_PIN 3 // used for case light Rev A said "1" -#define HEATER_BED_PIN 4 - -// -// LCD / Controller -// -#if ANY(BOARD_REV_1_0, BOARD_REV_1_1_TO_1_3) - - #define LCD_PINS_RS 24 - #define LCD_PINS_ENABLE 22 - #define LCD_PINS_D4 36 - #define LCD_PINS_D5 34 - #define LCD_PINS_D6 32 - #define LCD_PINS_D7 30 - -#elif BOTH(BOARD_REV_1_5, ULTRA_LCD) - - #define BEEPER_PIN 18 - - #if ENABLED(NEWPANEL) - - #define LCD_PINS_RS 20 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 16 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 5 - #define LCD_PINS_D7 6 - - // Buttons directly attached - #define BTN_EN1 40 - #define BTN_EN2 42 - #define BTN_ENC 19 - - #define SD_DETECT_PIN 38 - - #else // !NEWPANEL - Old style panel with shift register - - // Buttons attached to a shift register - #define SHIFT_CLK 38 - #define SHIFT_LD 42 - #define SHIFT_OUT 40 - #define SHIFT_EN 17 - - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 5 - #define LCD_PINS_D4 6 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 20 - #define LCD_PINS_D7 19 - - #endif // !NEWPANEL - -#endif - -// -// case light - see spindle section for more info on available hardware PWMs -// -#if !PIN_EXISTS(CASE_LIGHT) && ENABLED(BOARD_REV_1_5) - #define CASE_LIGHT_PIN 7 // use PWM - MUST BE HARDWARE PWM -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER - #if EITHER(BOARD_REV_1_0, BOARD_REV_1_5) // Use the last three SW positions - #define SPINDLE_DIR_PIN 10 // 1.0: SW4 1.5: EXP3-6 ("10") - #define SPINDLE_LASER_PWM_PIN 9 // 1.0: SW5 1.5: EXP3-7 ( "9") .. MUST BE HARDWARE PWM - #define SPINDLE_LASER_ENA_PIN 8 // 1.0: SW6 1.5: EXP3-8 ( "8") .. Pin should have a pullup! - #elif ENABLED(BOARD_REV_1_1_TO_1_3) - /** - * Only four hardware PWMs physically connected to anything on these boards: - * - * HEATER_0_PIN 2 silkscreen varies - usually "PWM 1" or "HEATER1" - * HEATER_1_PIN 3 silkscreen varies - usually "PWM 2" or "HEATER2" - * HEATER_BED_PIN 4 silkscreen varies - usually "PWM 3" or "HEATED BED" - * E0_DIR_PIN 45 - * - * If one of the heaters is used then special precautions will usually be needed. - * They have an LED and resistor pullup to +24V which could damage 3.3V-5V ICs. - */ - #if EXTRUDERS == 1 - #define SPINDLE_DIR_PIN 43 - #define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM - #define SPINDLE_LASER_ENA_PIN 41 // Pullup! - #elif TEMP_SENSOR_BED == 0 // Can't use E0 so see if HEATER_BED_PIN is available - #undef HEATER_BED_PIN - #define SPINDLE_DIR_PIN 38 // Probably pin 4 on 10 pin connector closest to the E0 socket - #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM - Special precautions usually needed. - #define SPINDLE_LASER_ENA_PIN 40 // Pullup! (Probably pin 6 on the 10-pin - // connector closest to the E0 socket) - #endif - #endif -#endif - -/** - * Where to get the spindle signals on the E0 socket - * - * spindle signal socket name socket name - * ------- - * SPINDLE_LASER_ENA_PIN /ENABLE *| |O VMOT - * MS1 O| |O GND - * MS2 O| |O 2B - * MS3 O| |O 2A - * /RESET O| |O 1A - * /SLEEP O| |O 1B - * SPINDLE_DIR_PIN STEP O| |O VDD - * SPINDLE_LASER_PWM_PIN DIR O| |O GND - * ------- - * * - pin closest to MS1, MS2 & MS3 jumpers on the board - * - * Note: Socket names vary from vendor to vendor. - */ diff --git a/Marlin/src/pins/ramps/pins_VORON.h b/Marlin/src/pins/ramps/pins_VORON.h deleted file mode 100644 index 40ec71b6f0..0000000000 --- a/Marlin/src/pins/ramps/pins_VORON.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * VORON Design v2 pin assignments - * See https://github.com/mzbotreprap/VORON/blob/master/Firmware/Marlin/pins_RAMPS_VORON.h - */ - -#define BOARD_INFO_NAME "VORON Design v2" - -#define RAMPS_D8_PIN 11 - -#include "pins_RAMPS.h" - -// -// Heaters / Fans -// -#undef FAN_PIN -#define FAN_PIN 5 // Using the pin for the controller fan since controller fan is always on. -#define CONTROLLER_FAN_PIN 8 - -// -// Auto fans -// -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 6 // Servo pin 6 for E3D Fan -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN 6 // Servo pin 6 for E3D Fan (same pin for both extruders since it's the same fan) -#endif - -// -// LCDs and Controllers -// -#undef BEEPER_PIN diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V20.h b/Marlin/src/pins/ramps/pins_ZRIB_V20.h deleted file mode 100644 index 90433c62d7..0000000000 --- a/Marlin/src/pins/ramps/pins_ZRIB_V20.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * ZRIB V2.0 & V3.0 pin assignments - * V2 and V3 Boards only differ in USB controller, nothing affecting the pins. - */ - -#include "pins_MKS_GEN_13.h" - -#define ZRIB_V20_D6_PIN 6 // Fan -#define ZRIB_V20_D9_PIN 9 // Fan2 -#define ZRIB_V20_A10_PIN 10 -#define ZRIB_V20_D16_PIN 16 -#define ZRIB_V20_D17_PIN 17 -#define ZRIB_V20_D23_PIN 23 -#define ZRIB_V20_D25_PIN 25 -#define ZRIB_V20_D27_PIN 27 -#define ZRIB_V20_D29_PIN 29 -#define ZRIB_V20_D37_PIN 37 - -// -// Auto fans -// -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN ZRIB_V20_D6_PIN -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN ZRIB_V20_D6_PIN -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN ZRIB_V20_D6_PIN -#endif -#ifndef E3_AUTO_FAN_PIN - #define E3_AUTO_FAN_PIN ZRIB_V20_D6_PIN -#endif - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 11 // Analog Input -#endif - -#if ENABLED(ZONESTAR_LCD) - #undef LCD_PINS_RS - #undef LCD_PINS_ENABLE - #undef LCD_PINS_D4 - #undef LCD_PINS_D5 - #undef LCD_PINS_D6 - #undef LCD_PINS_D7 - #undef ADC_KEYPAD_PIN - #undef BEEPER_PIN - - #undef SHIFT_OUT - #undef SHIFT_CLK - #undef SHIFT_LD - #undef BTN_EN1 - #undef BTN_EN2 - #undef BTN_ENC - - #define LCD_PINS_RS ZRIB_V20_D16_PIN - #define LCD_PINS_ENABLE ZRIB_V20_D17_PIN - #define LCD_PINS_D4 ZRIB_V20_D23_PIN - #define LCD_PINS_D5 ZRIB_V20_D25_PIN - #define LCD_PINS_D6 ZRIB_V20_D27_PIN - #define LCD_PINS_D7 ZRIB_V20_D29_PIN - #define ADC_KEYPAD_PIN ZRIB_V20_A10_PIN - #define BEEPER_PIN ZRIB_V20_D37_PIN -#endif diff --git a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h deleted file mode 100644 index 096d970871..0000000000 --- a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h +++ /dev/null @@ -1,306 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Z-Bolt X Series board – based on Arduino Mega2560 - */ - -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 4 || E_STEPPERS > 4 - #error "Z-Bolt X Series board supports up to 4 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "Z-Bolt X Series" - -// -// Servos -// -#ifndef SERVO0_PIN - #define SERVO0_PIN 11 -#endif -#ifndef SERVO3_PIN - #define SERVO3_PIN 4 -#endif - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#ifndef X_MAX_PIN - #define X_MAX_PIN 2 -#endif -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 -#ifndef X_CS_PIN - #define X_CS_PIN -1 -#endif - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 -#ifndef Y_CS_PIN - #define Y_CS_PIN -1 -#endif - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 -#ifndef Z_CS_PIN - #define Z_CS_PIN -1 -#endif - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -#ifndef E0_CS_PIN - #define E0_CS_PIN -1 -#endif - -#define E1_STEP_PIN 36 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 30 -#ifndef E1_CS_PIN - #define E1_CS_PIN -1 -#endif - -// Red -#define E2_STEP_PIN 42 -#define E2_DIR_PIN 40 -#define E2_ENABLE_PIN 65 -#ifndef E2_CS_PIN - #define E2_CS_PIN -1 -#endif - -// Black -#define E3_STEP_PIN 44 -#define E3_DIR_PIN 64 -#define E3_ENABLE_PIN 66 -#ifndef E3_CS_PIN - #define E3_CS_PIN -1 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 // Analog Input -#define TEMP_1_PIN 15 // Analog Input -#define TEMP_2_PIN 5 // Analog Input (BLACK) -#define TEMP_3_PIN 9 // Analog Input (RED) -#define TEMP_BED_PIN 14 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 10 -#define HEATER_1_PIN 7 -#define HEATER_2_PIN 6 -#define HEATER_3_PIN 5 -#define HEATER_BED_PIN 8 - -#define FAN_PIN 9 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 5 // Analog Input on AUX2 -#endif - -// Оn the servos connector -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 4 -#endif - -#ifndef PS_ON_PIN - #define PS_ON_PIN 12 -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENA_PIN) - #if NUM_SERVOS <= 1 // Prefer the servo connector - #define CASE_LIGHT_PIN 6 // Hardware PWM - #elif HAS_FREE_AUX2_PINS - #define CASE_LIGHT_PIN 44 // Hardware PWM - #endif -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) - #if !defined(NUM_SERVOS) || NUM_SERVOS == 0 // Prefer the servo connector - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM - #define SPINDLE_DIR_PIN 5 - #elif HAS_FREE_AUX2_PINS - #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM - #define SPINDLE_DIR_PIN 65 - #endif -#endif - -// -// TMC software SPI -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI 66 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO 44 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK 64 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC220x stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - - #ifndef X_SERIAL_TX_PIN - #define X_SERIAL_TX_PIN 40 - #endif - #ifndef X_SERIAL_RX_PIN - #define X_SERIAL_RX_PIN 63 - #endif - #ifndef X2_SERIAL_TX_PIN - #define X2_SERIAL_TX_PIN -1 - #endif - #ifndef X2_SERIAL_RX_PIN - #define X2_SERIAL_RX_PIN -1 - #endif - - #ifndef Y_SERIAL_TX_PIN - #define Y_SERIAL_TX_PIN 59 - #endif - #ifndef Y_SERIAL_RX_PIN - #define Y_SERIAL_RX_PIN 64 - #endif - #ifndef Y2_SERIAL_TX_PIN - #define Y2_SERIAL_TX_PIN -1 - #endif - #ifndef Y2_SERIAL_RX_PIN - #define Y2_SERIAL_RX_PIN -1 - #endif - - #ifndef Z_SERIAL_TX_PIN - #define Z_SERIAL_TX_PIN 42 - #endif - #ifndef Z_SERIAL_RX_PIN - #define Z_SERIAL_RX_PIN 65 - #endif - #ifndef Z2_SERIAL_TX_PIN - #define Z2_SERIAL_TX_PIN -1 - #endif - #ifndef Z2_SERIAL_RX_PIN - #define Z2_SERIAL_RX_PIN -1 - #endif - - #ifndef E0_SERIAL_TX_PIN - #define E0_SERIAL_TX_PIN 44 - #endif - #ifndef E0_SERIAL_RX_PIN - #define E0_SERIAL_RX_PIN 66 - #endif - #ifndef E1_SERIAL_TX_PIN - #define E1_SERIAL_TX_PIN -1 - #endif - #ifndef E1_SERIAL_RX_PIN - #define E1_SERIAL_RX_PIN -1 - #endif - #ifndef E2_SERIAL_TX_PIN - #define E2_SERIAL_TX_PIN -1 - #endif - #ifndef E2_SERIAL_RX_PIN - #define E2_SERIAL_RX_PIN -1 - #endif - #ifndef E3_SERIAL_TX_PIN - #define E3_SERIAL_TX_PIN -1 - #endif - #ifndef E3_SERIAL_RX_PIN - #define E3_SERIAL_RX_PIN -1 - #endif - #ifndef E4_SERIAL_TX_PIN - #define E4_SERIAL_TX_PIN -1 - #endif - #ifndef E4_SERIAL_RX_PIN - #define E4_SERIAL_RX_PIN -1 - #endif - #ifndef E5_SERIAL_TX_PIN - #define E5_SERIAL_TX_PIN -1 - #endif - #ifndef E5_SERIAL_RX_PIN - #define E5_SERIAL_RX_PIN -1 - #endif - #ifndef E6_SERIAL_TX_PIN - #define E6_SERIAL_TX_PIN -1 - #endif - #ifndef E6_SERIAL_RX_PIN - #define E6_SERIAL_RX_PIN -1 - #endif - #ifndef E7_SERIAL_TX_PIN - #define E7_SERIAL_TX_PIN -1 - #endif - #ifndef E7_SERIAL_RX_PIN - #define E7_SERIAL_RX_PIN -1 - #endif -#endif diff --git a/Marlin/src/pins/sam/pins_ADSK.h b/Marlin/src/pins/sam/pins_ADSK.h deleted file mode 100644 index b0e171cf17..0000000000 --- a/Marlin/src/pins/sam/pins_ADSK.h +++ /dev/null @@ -1,207 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino DUE Shield Kit (ADSK) pin assignments - */ - -#define BOARD_INFO_NAME "ADSK" - -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due or Mega' in 'Tools > Board.'" -#endif - -/* CNC shield modifications: -FROM THE BOTTOM CUT THE 5V PIN THAT GOES TO ARDUINO!!! -On the top put jumper between 5V and 3V3 pins, - jumper between D12 and A.STEP, jumper between D13 and A.DIR -*/ - -/* CNC shield 3D printer connections: -X,Y,Z steppers as normal -A stepper for E0 extruder -(X-)&(GND) - X limit -(Y-)&(GND) - Y limit -(Z-)&(GND) - Z limit -(Abort)&(GND) - Extruder thermistor (also require pullup resistor 4.7K between "Abort" and - Vcc (now "5V" on the board but actual 3.3V because of jumper)) -(Hold)&(GND) - Bed thermistor (also require pullup resistor 4.7K between "Hold" and - Vcc (now "5V" on the board but actual 3.3V because of jumper)) -(CoolEn) - 3.3v signal to controll extruder heater MOSFET -(Resume) - 3.3v signal to control heatbed MOSFET -(SDA) - 3.3v signal to controll extruder fan -(SCL) - 3.3v signal to controll extruder cooling fan -*/ - -/* CNC Shield pinout -"Name on the board": DUE pin -"Abort": Analog pin 0 or Digital pin 54 -"Hold": Analog pin 1 or Digital pin 55 -"Resume": Analog pin 2 or Digital pin 56 -"CoolEn": Analog pin 3 or Digital pin 57 -"SDA": Analog pin 4 or Digital pin 58 -"SCL": Analog pin 5 or Digital pin 59 -"E-STOP": Reset pin -"RX": Digital pin 0 -"TX": Digital pin 1 -"X.STEP": Digital pin 2 -"Y.STEP": Digital pin 3 -"Z.STEP": Digital pin 4 -"X.DIR": Digital pin 5 -"Y.DIR": Digital pin 6 -"Z.DIR": Digital pin 7 -"EN": Digital pin 8 -"X+","X-": Digital pin 9 -"Y+","Y-": Digital pin 10 -"Z+","Z-": Digital pin 11 -"SpinEn": Digital pin 12 -> will be connected to A.STEP with jumper -"SpinDir": Digital pin 13 -> will be connected to A.DIR with jumper -*/ - -// -// Servos -// -#define SERVO0_PIN 61 // Analog pin 7, Digital pin 61 - -// -// Limit Switches -// -#define X_MIN_PIN 9 -#define Y_MIN_PIN 10 -#define Z_MIN_PIN 11 - -#define Z_MIN_PROBE_PIN 62 // Analog pin 8, Digital pin 62 - -// -// Steppers -// -#define X_STEP_PIN 2 -#define X_DIR_PIN 5 -#define X_ENABLE_PIN 8 - -#define Y_STEP_PIN 3 -#define Y_DIR_PIN 6 -#define Y_ENABLE_PIN 8 - -#define Z_STEP_PIN 4 -#define Z_DIR_PIN 7 -#define Z_ENABLE_PIN 8 - -#define E0_STEP_PIN 12 -#define E0_DIR_PIN 13 -#define E0_ENABLE_PIN 8 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 55 // "Hold": Analog pin 1, Digital pin 55 -#define HEATER_BED_PIN 57 // "CoolEn": Analog pin 3, Digital pin 57 -#define FAN_PIN 54 // "Abort": Analog pin 0, Digital pin 54 -#undef E0_AUTO_FAN_PIN -#define E0_AUTO_FAN_PIN 56 // "Resume": Analog pin 2, Digital pin 56 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 4 // "SDA": Analog pin 4, Digital pin 58 -#define TEMP_BED_PIN 5 // "SCL": Analog pin 5, Digital pin 59 - -// -// Misc. Functions -// -#define SDSS 52 - -#if ENABLED(ZONESTAR_LCD) - - /** - * The 2004 LCD should be powered with 5V. - * The next LCD pins RS,D4,D5,D6,D7 have internal pull-ups to 5V and as result the 5V will be on these pins. - * Luckily these internal pull-ups have really high resistance and adding 33K pull-down resistors will create - * simple voltage divider that will bring the voltage down just slightly bellow 3.3V. - * - * This LCD also has buttons that connected to the same ADC pin with different voltage divider combinations. - * On the LCD panel there is internal pull-up resistor of the 4.7K connected to 5V. - * Connecting another 4.7K pull-down resistor between ADC pin and the GND - * will result in scaled values for voltage dividers and will bring them down to be always below 3.3V. - * - * For 2004 LCD to work with 3.3V board like Arduino DUE the next required: - * Pull-down resistors of 33K between each of LCD pins RS,D4,D5,D6,D7 and the GND. - * Pull-down resistor of 4.7K between ADC_KEYPAD_PIN and the GND - * - * All these modifications will still work with 5V based boards but require proper scaled ADC values - */ - - #ifdef __SAM3X8E__ - #define AREF_VOLTS 3.3 - #else - #define AREF_VOLTS 5.0 - #endif - - // - // LCD / Controller - // - #define LCD_PINS_ENABLE 14 - #define LCD_PINS_RS 15 - #define LCD_PINS_D4 16 - #define LCD_PINS_D5 17 - #define LCD_PINS_D6 18 - #define LCD_PINS_D7 19 - #define ADC_KEYPAD_PIN 6 //60 // Analog pin 6, Digital pin 60 - - /** - * The below defines will scale all the values to work properly on both - * 5V (Mega) and 3.3V (DUE) boards with all pull-up resistors added for 3.3V - */ - - #define ADC_BUTTONS_VALUE_SCALE (5.0/AREF_VOLTS) // The LCD module pullup voltage is 5.0V but ADC reference voltage is 3.3V - - #define ADC_BUTTONS_R_PULLDOWN 4.7 // Moves voltage down to be bellow 3.3V instead of 5V - // the resistors values will be scaled because of 4.7K pulldown parallel resistor - #define _ADC_BUTTONS_R_SCALED(R) ((R) * (ADC_BUTTONS_R_PULLDOWN) / ((R) + ADC_BUTTONS_R_PULLDOWN)) - - // buttons pullup resistor - #define ADC_BUTTONS_R_PULLUP 4.7 // the resistor on the 2004 LCD panel - // buttons resistors with scaled values because of parallel pulldown resistor - #define ADC_BUTTONS_LEFT_R_PULLDOWN _ADC_BUTTONS_R_SCALED(0.47) - #define ADC_BUTTONS_RIGHT_R_PULLDOWN _ADC_BUTTONS_R_SCALED(4.7) - #define ADC_BUTTONS_UP_R_PULLDOWN _ADC_BUTTONS_R_SCALED(1.0) - #define ADC_BUTTONS_DOWN_R_PULLDOWN _ADC_BUTTONS_R_SCALED(10.0) - #define ADC_BUTTONS_MIDDLE_R_PULLDOWN _ADC_BUTTONS_R_SCALED(2.2) - -#endif // ZONESTAR_LCD - -/** - * RJ45 8 pins extruder connector - * - * 1 - GND (Please do not connect to the same GND as extruder heater to prevent ground offset voltage) - * 2 - thermistor - * 3 - SERVO PWM - * 4 - extruder heater - * 5 - FAN (print cooling) - * 6 - FAN (extruder cooling) - * 7 - Probe signal - * 8 - 5V - * - * Standard ethernet pairs: 1&2, 3&6, 4&5, 7&8 - * Use CAT7 cable to have all pairs shielded - */ diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h deleted file mode 100644 index 8d6906117d..0000000000 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Alligator Board R2 - * https://reprap.org/wiki/Alligator_Board - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Alligator Board R2" - -// -// Servos -// -#define SERVO0_PIN 36 -#define SERVO1_PIN 40 -#define SERVO2_PIN 41 -#define SERVO3_PIN -1 - -// -// Limit Switches -// -#define X_MIN_PIN 33 // PC1 -#define X_MAX_PIN 34 // PC2 -#define Y_MIN_PIN 35 // PC3 -#define Y_MAX_PIN 37 // PC5 -#define Z_MIN_PIN 38 // PC6 -#define Z_MAX_PIN 39 // PC7 - -// -// Steppers -// -#define X_STEP_PIN 96 // PB24 -#define X_DIR_PIN 2 // PB25 -#define X_ENABLE_PIN 24 // PA15, motor RESET pin - -#define Y_STEP_PIN 94 // PB22 -#define Y_DIR_PIN 95 // PB23 -#define Y_ENABLE_PIN 24 // PA15, motor RESET pin - -#define Z_STEP_PIN 98 // PC27 -#define Z_DIR_PIN 3 // PC28 -#define Z_ENABLE_PIN 24 // PA15, motor RESET pin - -#define E0_STEP_PIN 5 // PC25 -#define E0_DIR_PIN 4 // PC26 -#define E0_ENABLE_PIN 24 // PA15, motor RESET pin - -#define E1_STEP_PIN 28 // PD3 on piggy -#define E1_DIR_PIN 27 // PD2 on piggy -#define E1_ENABLE_PIN 24 // PA15, motor RESET pin - -#define E2_STEP_PIN 11 // PD7 on piggy -#define E2_DIR_PIN 29 // PD6 on piggy -#define E2_ENABLE_PIN 24 // PA15, motor RESET pin - -#define E3_STEP_PIN 30 // PD9 on piggy -#define E3_DIR_PIN 12 // PD8 on piggy -#define E3_ENABLE_PIN 24 // PA15, motor RESET pin - -// Microstepping pins - Mapping not from fastio.h (?) -#define X_MS1_PIN 99 // PC10 -#define Y_MS1_PIN 10 // PC29 -#define Z_MS1_PIN 44 // PC19 -#define E0_MS1_PIN 45 // PC18 - -//#define MOTOR_FAULT_PIN 22 // PB26 , motor X-Y-Z-E0 motor FAULT - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // Analog Input (PA24) -#define TEMP_1_PIN 2 // Analog Input (PA23 on piggy) -#define TEMP_2_PIN 3 // Analog Input (PA22 on piggy) -#define TEMP_3_PIN 4 // Analog Input (PA6 on piggy) -#define TEMP_BED_PIN 0 // Analog Input (PA16) - -// -// Heaters / Fans -// -// Note that on the Due pin A0 on the board is channel 2 on the ARM chip -#define HEATER_0_PIN 68 // PA1 -#define HEATER_1_PIN 8 // PC22 on piggy -#define HEATER_2_PIN 9 // PC21 on piggy -#define HEATER_3_PIN 97 // PC20 on piggy -#define HEATER_BED_PIN 69 // PA0 - -#ifndef FAN_PIN - #define FAN_PIN 92 // PA5 -#endif -#define FAN1_PIN 31 // PA7 - -// -// Misc. Functions -// -#define SDSS 77 // PA28 -#define SD_DETECT_PIN 87 // PA29 -#define LED_RED_PIN 40 // PC8 -#define LED_GREEN_PIN 41 // PC9 - -#define EXP_VOLTAGE_LEVEL_PIN 65 - -#define SPI_CHAN_DAC 1 - -#define DAC0_SYNC 53 // PB14 -#define DAC1_SYNC 6 // PC24 - -// 64K SPI EEPROM -#define SPI_EEPROM -#define SPI_CHAN_EEPROM1 2 -#define SPI_EEPROM1_CS 25 // PD0 - -// 2K SPI EEPROM -#define SPI_EEPROM2_CS 26 // PD1 - -// FLASH SPI -// 32Mb -#define SPI_FLASH_CS 23 // PA14 - -// -// LCD / Controller -// -#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCD_PINS_RS 18 - #define LCD_PINS_ENABLE 15 - #define LCD_PINS_D4 19 - #define BEEPER_PIN 64 - #undef UI_VOLTAGE_LEVEL - #define UI_VOLTAGE_LEVEL 1 -#endif - -#if ENABLED(NEWPANEL) - #define BTN_EN1 14 - #define BTN_EN2 16 - #define BTN_ENC 17 -#endif diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h deleted file mode 100644 index 6e3768c663..0000000000 --- a/Marlin/src/pins/sam/pins_ARCHIM1.h +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * ARCHIM1 pin assignment - * - * The Archim 1.0 board requires Arduino Archim addons installed. - * - * - Add the following URL to Arduino IDE's Additional Board Manager URLs: - * https://raw.githubusercontent.com/ultimachine/ArduinoAddons/master/package_ultimachine_index.json - * - * - In the Arduino IDE Board Manager search for Archim and install the package. - * - * - Change your target board to "Archim". - * - * Further information on the UltiMachine website... - * https://github.com/ultimachine/Archim/wiki - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Archim' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Archim 1.0" - -// -// Timers -// -// These are already defined in DUE, so must be undefined first -#define STEP_TIMER_NUM 3 -#define HAL_STEP_TIMER_ISR() void TC3_Handler() - -// -// Items marked * have been altered from Archim v1.0 -// - -// -// Servos -// -#define SERVO0_PIN 20 // D20 PB12 (Header J20 20) -#define SERVO1_PIN 21 // D21 PB13 (Header J20 19) - -// -// Limit Switches -// -#define X_MIN_PIN 14 // PD4 MIN ES1 -#define X_MAX_PIN 32 // PD10 MAX ES1 -#define Y_MIN_PIN 29 // PD6 MIN ES2 -#define Y_MAX_PIN 15 // PD5 MAX ES2 -#define Z_MIN_PIN 31 // PA7 MIN ES3 -#define Z_MAX_PIN 30 // PD9 MAX ES3 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 66 // D66 PB15 (Header J20 15) -#endif -#ifndef FIL_RUNOUT2_PIN - #define FIL_RUNOUT2_PIN 67 // D67 PB16 (Header J20 16) -#endif - -// -// Steppers -// -#define X_STEP_PIN 40 // PC8 STEP1 * -#define X_DIR_PIN 59 // PA4 DIR1 * -#define X_ENABLE_PIN 41 // PC9 EN1 - -#define Y_STEP_PIN 49 // PC14 STEP2 * -#define Y_DIR_PIN 47 // PC16 DIR2 * -#define Y_ENABLE_PIN 48 // PC15 EN2 * - -#define Z_STEP_PIN 36 // PC4 STEP Z * -#define Z_DIR_PIN 107 // PB10 DIR Z * -#define Z_ENABLE_PIN 96 // PC10 EN Z -AddOns * - -#define E0_STEP_PIN 78 // PB23 STEP3 * -#define E0_DIR_PIN 22 // PB26 DIR3 * -#define E0_ENABLE_PIN 97 // PB24 EN3 -Addons * - -#define E1_STEP_PIN 26 // PD1 STEP4 * -#define E1_DIR_PIN 27 // PD2 DIR4 * -#define E1_ENABLE_PIN 28 // PD3 EN4 * - -// Microstepping mode pins * -#define X_MS1_PIN 39 // PC7 MOD0E1 - As listed in schematic -#define X_MS2_PIN 38 // PC6 MOD1E1 -#define X_MS3_PIN 37 // PC5 MOD2E1 - -#define Y_MS1_PIN 50 // PC13 MODE0E2 -#define Y_MS2_PIN 51 // PC12 MODE1E2 -#define Y_MS3_PIN 92 // PC11 MODE2E2 - AddOns - -#define Z_MS1_PIN 44 // PC19 MOD0E Z -#define Z_MS2_PIN 45 // PC18 MOD1E Z -#define Z_MS3_PIN 46 // PC17 MOD2E Z - -#define E0_MS1_PIN 105 // PB22 MOD0E3 - AddOns -#define E0_MS2_PIN 106 // PC27 MOD1E3 - AddOns -#define E0_MS3_PIN 104 // PC20 MOD2E3 - AddOns - -#define E1_MS1_PIN 25 // PD0 MOD0E4 -#define E1_MS2_PIN 18 // PA11 MOD1E4 -#define E1_MS3_PIN 19 // PA10 MOD2E4 - -// Motor current PWM pins * -#define MOTOR_CURRENT_PWM_X_PIN 58 // PA6 X-REF TIOB2 -#define MOTOR_CURRENT_PWM_Y_PIN 12 // PD8 Y-REF TIOB8 -#define MOTOR_CURRENT_PWM_Z_PIN 10 // PC29 Z-REF TIOB7 -#define MOTOR_CURRENT_PWM_E0_PIN 3 // PC28 E1-REF TIOA7 -#define MOTOR_CURRENT_PWM_E1_PIN 11 // PD7 E2-REF TIOA8 - -#define MOTOR_CURRENT_PWM_RANGE 2750 // (3.3 Volts * 100000 Ohms) / (100000 Ohms + 20000 Ohms) = 2.75 Volts (max vref) -#define DEFAULT_PWM_MOTOR_CURRENT { 1000, 1000, 1000 } //, 1000, 1000} // X Y Z E0 E1, 1000 = 1000mAh - -// -// Temperature Sensors -// -#define TEMP_0_PIN 10 // D10 PB19 THERM AN1 * -#define TEMP_1_PIN 9 // D9 PB18 THERM AN2 * -#define TEMP_2_PIN 8 // D8 PB17 THERM AN4 * -#define TEMP_BED_PIN 11 // D11 PB20 THERM AN3 * - -// -// Heaters / Fans -// -#define HEATER_0_PIN 6 // D6 PC24 FET_PWM3 -#define HEATER_1_PIN 7 // D7 PC23 FET_PWM4 -#define HEATER_2_PIN 8 // D8 PC22 FET_PWM5 -#define HEATER_BED_PIN 9 // D9 PC21 BED_PWM - -#ifndef FAN_PIN - #define FAN_PIN 4 // D4 PC26 FET_PWM1 -#endif -#define FAN1_PIN 5 // D5 PC25 FET_PWM2 - -// -// Misc. Functions -// - -// Internal MicroSD card reader on the PCB -#define INT_SCK_PIN 42 // D42 PA19/MCCK -#define INT_MISO_PIN 43 // D43 PA20/MCCDA -#define INT_MOSI_PIN 73 // D73 PA21/MCDA0 -#define INT_SDSS 55 // D55 PA24/MCDA3 - -// External SD card reader on SC2 -#define SCK_PIN 76 // D76 PA27 -#define MISO_PIN 74 // D74 PA25 -#define MOSI_PIN 75 // D75 PA26 -#define SDSS 87 // D87 PA29 - -// 2MB SPI Flash -#define SPI_FLASH_SS 52 // D52 PB21 - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - #define BEEPER_PIN 23 // D24 PA15_CTS1 - #define LCD_PINS_RS 17 // D17 PA12_RXD1 - #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1 - #define LCD_PINS_D4 69 // D69 PA0_CANTX0 - #define LCD_PINS_D5 54 // D54 PA16_SCK1 - #define LCD_PINS_D6 68 // D68 PA1_CANRX0 - #define LCD_PINS_D7 34 // D34 PC2_PWML0 - - #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 - - #if ENABLED(NEWPANEL) - // Buttons on AUX-2 - #define BTN_EN1 60 // D60 PA3_TIOB1 - #define BTN_EN2 13 // D13 PB27_TIOB0 - #define BTN_ENC 16 // D16 PA13_TXD1 - #endif // NEWPANEL -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h deleted file mode 100644 index 5a3fe0e4d5..0000000000 --- a/Marlin/src/pins/sam/pins_ARCHIM2.h +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * ARCHIM2 pin assignment - * - * The Archim 2.0 board requires Arduino Archim addons installed. - * - * - Add the following URL to Arduino IDE's Additional Board Manager URLs: - * https://raw.githubusercontent.com/ultimachine/ArduinoAddons/master/package_ultimachine_index.json - * - * - In the Arduino IDE Board Manager search for Archim and install the package. - * - * - Change your target board to "Archim". - * - * Further information on the UltiMachine website... - * https://github.com/ultimachine/Archim/wiki - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Archim' in 'Tools > Board.'" -#elif DISABLED(TMC_USE_SW_SPI) - #error "Archim2 requires Software SPI. Enable TMC_USE_SW_SPI in Configuration_adv.h." -#endif - -#define BOARD_INFO_NAME "Archim 2.0" - -// -// Items marked * have been altered from Archim v1.0 -// - -// -// Servos -// -#define SERVO0_PIN 20 // D20 PB12 (Header J20 20) -#define SERVO1_PIN 21 // D21 PB13 (Header J20 19) - -// -// Limit Switches -// - -#if ENABLED(SENSORLESS_HOMING) - - // Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. - // Otherwise use a physical endstop based configuration. - - // TMC2130 Diag Pins - #define X_DIAG_PIN 59 // PA4 - #define Y_DIAG_PIN 48 // PC15 - #define Z_DIAG_PIN 36 // PC4 - #define E0_DIAG_PIN 78 // PB23 - #define E1_DIAG_PIN 25 // PD0 - - #if X_HOME_DIR < 0 - #define X_MIN_PIN X_DIAG_PIN - #define X_MAX_PIN 32 - #else - #define X_MIN_PIN 14 - #define X_MAX_PIN X_DIAG_PIN - #endif - - #if Y_HOME_DIR < 0 - #define Y_MIN_PIN Y_DIAG_PIN - #define Y_MAX_PIN 15 - #else - #define Y_MIN_PIN 29 - #define Y_MAX_PIN Y_DIAG_PIN - #endif - -#else - - #define X_MIN_PIN 14 // PD4 MIN ES1 - #define X_MAX_PIN 32 // PD10 MAX ES1 - #define Y_MIN_PIN 29 // PD6 MIN ES2 - #define Y_MAX_PIN 15 // PD5 MAX ES2 - -#endif - -#define Z_MIN_PIN 31 // PA7 MIN ES3 -#define Z_MAX_PIN 30 // PD9 MAX ES3 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 32 -#endif - -// -// Steppers -// -#define X_STEP_PIN 38 // PC6 X-STEP * -#define X_DIR_PIN 37 // PC5 X-DIR * -#define X_ENABLE_PIN 41 // PC9 EN1 -#ifndef X_CS_PIN - #define X_CS_PIN 39 // PC7 X_nCS -#endif - -#define Y_STEP_PIN 51 // PC12 Y-STEP * -#define Y_DIR_PIN 92 // PC11 Y-DIR -AddOns * -#define Y_ENABLE_PIN 49 // PC14 Y-EN * -#ifndef Y_CS_PIN - #define Y_CS_PIN 50 // PC13 Y_nCS -#endif - -#define Z_STEP_PIN 46 // PC17 Z-STEP * -#define Z_DIR_PIN 47 // PC16 Z-DIR * -#define Z_ENABLE_PIN 44 // PC19 Z-END * -#ifndef Z_CS_PIN - #define Z_CS_PIN 45 // PC18 Z_nCS -#endif - -#define E0_STEP_PIN 107 // PB10 E1-STEP -AddOns * -#define E0_DIR_PIN 96 // PC10 E1-DIR -AddOns * -#define E0_ENABLE_PIN 105 // PB22 E1-EN -AddOns * -#ifndef E0_CS_PIN - #define E0_CS_PIN 104 // PC20 E1_nCS -AddOns * -#endif - -#define E1_STEP_PIN 22 // PB26 E2_STEP * -#define E1_DIR_PIN 97 // PB24 E2_DIR -AddOns * -#define E1_ENABLE_PIN 18 // PA11 E2-EN -#ifndef E1_CS_PIN - #define E1_CS_PIN 19 // PA10 E2_nCS -#endif - -// -// Software SPI pins for TMC2130 stepper drivers. -// Required for the Archim2 board. -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI 28 // PD3 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO 26 // PD1 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK 27 // PD2 - #endif -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 10 // D10 PB19 THERM AN1 * -#define TEMP_1_PIN 9 // D9 PB18 THERM AN2 * -#define TEMP_2_PIN 8 // D8 PB17 THERM AN4 * -#define TEMP_BED_PIN 11 // D11 PB20 THERM AN3 * - -// -// Heaters / Fans -// -#define HEATER_0_PIN 6 // D6 PC24 FET_PWM3 -#define HEATER_1_PIN 7 // D7 PC23 FET_PWM4 -#define HEATER_2_PIN 8 // D8 PC22 FET_PWM5 -#define HEATER_BED_PIN 9 // D9 PC21 BED_PWM - -#ifndef FAN_PIN - #define FAN_PIN 4 // D4 PC26 FET_PWM1 -#endif -#define FAN1_PIN 5 // D5 PC25 FET_PWM2 - -// -// Misc. Functions -// - -// Internal MicroSD card reader on the PCB -#define INT_SCK_PIN 42 // D42 PA19/MCCK -#define INT_MISO_PIN 43 // D43 PA20/MCCDA -#define INT_MOSI_PIN 73 // D73 PA21/MCDA0 -#define INT_SDSS 55 // D55 PA24/MCDA3 - -// External SD card reader on SC2 -#define SCK_PIN 76 // D76 PA27 -#define MISO_PIN 74 // D74 PA25 -#define MOSI_PIN 75 // D75 PA26 -#define SDSS 87 // D87 PA29 - -// Unused Digital GPIO J20 Pins -#define GPIO_PB1_J20_5 94 // D94 PB1 (Header J20 5) -#define GPIO_PB0_J20_6 95 // D95 PB0 (Header J20 6) -#define GPIO_PB3_J20_7 103 // D103 PB3 (Header J20 7) -#define GPIO_PB2_J20_8 93 // D93 PB2 (Header J20 8) -#define GPIO_PB6_J20_9 99 // D99 PB6 (Header J20 9) -#define GPIO_PB5_J20_10 101 // D101 PB5 (Header J20 10) -#define GPIO_PB8_J20_11 100 // D100 PB8 (Header J20 11) -#define GPIO_PB4_J20_12 102 // D102 PB4 (Header J20 12) -#define GPIO_PB9_J20_13 108 // D108 PB9 (Header J20 13) -#define GPIO_PB7_J20_14 98 // D98 PB7 (Header J20 14) -#define GPIO_PB15_J20_15 66 // D66 PB15 (Header J20 15) -#define GPIO_PB16_J20_16 67 // D67 PB16 (Header J20 16) -#define GPIO_PB14_J20_17 53 // D53 PB14 (Header J20 17) -#define GPIO_PA18_J20_21 71 // D71 PA17 (Header J20 21) -#define GPIO_PA17_J20_22 70 // D70 PA17 (Header J20 22) - -// Case Light - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN GPIO_PB1_J20_5 -#endif - -// 2MB SPI Flash -#define SPI_FLASH_SS 52 // D52 PB21 - -// -// Filament Runout Sensor -// - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN GPIO_PB15_J20_15 -#endif -#ifndef FIL_RUNOUT2_PIN - #define FIL_RUNOUT2_PIN GPIO_PB16_J20_16 -#endif - -// -// LCD / Controller -// -#if ANY(HAS_WIRED_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) - #define BEEPER_PIN 23 // D24 PA15_CTS1 - #define LCD_PINS_RS 17 // D17 PA12_RXD1 - #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1 - #define LCD_PINS_D4 69 // D69 PA0_CANTX0 - #define LCD_PINS_D5 54 // D54 PA16_SCK1 - #define LCD_PINS_D6 68 // D68 PA1_CANRX0 - #define LCD_PINS_D7 34 // D34 PC2_PWML0 - - #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 - - #if ANY(ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) - // Buttons on AUX-2 - #define BTN_EN1 60 // D60 PA3_TIOB1 - #define BTN_EN2 13 // D13 PB27_TIOB0 - #define BTN_ENC 16 // D16 PA13_TXD1 // the click - #endif -#endif diff --git a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h deleted file mode 100644 index fcd2bb4c67..0000000000 --- a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * CNControls V15 for HMS434 with DUE pin assignments - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "CN Controls V15D" - -// -// Servos -// -#define SERVO0_PIN 6 - -// -// Limit Switches -// -#define X_STOP_PIN 34 -#define Y_STOP_PIN 39 -#define Z_STOP_PIN 62 - -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 49 -#endif - -// -// Steppers -// -#define X_STEP_PIN 14 -#define X_DIR_PIN 25 -#define X_ENABLE_PIN 26 - -#define Y_STEP_PIN 11 -#define Y_DIR_PIN 12 -#define Y_ENABLE_PIN 15 - -#define Z_STEP_PIN 24 -#define Z_DIR_PIN 27 -#define Z_ENABLE_PIN 28 - -#define E0_STEP_PIN 64 -#define E0_DIR_PIN 65 -#define E0_ENABLE_PIN 63 - -#define E1_STEP_PIN 8 -#define E1_DIR_PIN 7 -#define E1_ENABLE_PIN 29 - -// -// Temperature Sensors -// Analog Inputs -// -#define TEMP_0_PIN 1 -#define TEMP_1_PIN 2 -#define TEMP_BED_PIN 4 - -#ifndef TEMP_CHAMBER_PIN - #define TEMP_CHAMBER_PIN 5 -#endif - -// -// Heaters -// -#define HEATER_0_PIN 3 -#define HEATER_1_PIN 4 -#define HEATER_BED_PIN 32 -#define HEATER_CHAMBER_PIN 33 - -// -// Fans -// -//#define FAN_PIN 8 - -// -// Auto fans -// -#define AUTO_FAN_PIN 30 -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef E3_AUTO_FAN_PIN - #define E3_AUTO_FAN_PIN AUTO_FAN_PIN -#endif -#ifndef CHAMBER_AUTO_FAN_PIN - #define CHAMBER_AUTO_FAN_PIN 10 -#endif - -// -// SD card -// -#define SCK_PIN 76 -#define MISO_PIN 74 -#define MOSI_PIN 75 -#define SDSS 53 -#define SD_DETECT_PIN 40 - -// Common I/O - -//#define PWM_1_PIN 6 // probe -//#define PWM_2_PIN 13 -//#define SPARE_IO 17 -#define BEEPER_PIN 13 -#define STAT_LED_BLUE_PIN -1 -#define STAT_LED_RED_PIN 31 - -// G425 CALIBRATION_GCODE default pin -#ifndef CALIBRATION_PIN - #define CALIBRATION_PIN 66 -#endif diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h deleted file mode 100644 index cd4033aa6f..0000000000 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ /dev/null @@ -1,171 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * DUE3DOM pin assignments - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "DUE3DOM" - -// -// Servos -// -#define SERVO0_PIN 5 -#define SERVO1_PIN 6 -#define SERVO2_PIN 13 -#define SERVO3_PIN -1 - -// -// Limit Switches -// -#define X_MIN_PIN 38 -#define X_MAX_PIN 36 -#define Y_MIN_PIN 34 -#define Y_MAX_PIN 32 -#define Z_MIN_PIN 30 -#define Z_MAX_PIN 28 - -// -// Steppers -// -#define X_STEP_PIN 2 -#define X_DIR_PIN 3 -#define X_ENABLE_PIN 22 - -#define Y_STEP_PIN 17 -#define Y_DIR_PIN 16 -#define Y_ENABLE_PIN 26 - -#define Z_STEP_PIN 61 // Z1 STP -#define Z_DIR_PIN 60 // Z1 DIR -#define Z_ENABLE_PIN 15 // Z1 ENA - -#define E0_STEP_PIN 64 // Z2 STP -#define E0_DIR_PIN 63 // Z2 DIR -#define E0_ENABLE_PIN 62 // Z2 ENA - -#define E1_STEP_PIN 51 // E1 STP -#define E1_DIR_PIN 53 // E1 DIR -#define E1_ENABLE_PIN 65 // E1 ENA - -#define E2_STEP_PIN 24 // E2 STP -#define E2_DIR_PIN 23 // E2 DIR -#define E2_ENABLE_PIN 49 // E2 ENA - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input (HOTEND0 thermistor) -#define TEMP_1_PIN 2 // Analog Input (HOTEND1 thermistor) -#define TEMP_2_PIN 5 // Analog Input (unused) -#define TEMP_BED_PIN 1 // Analog Input (BED thermistor) - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN -1 -#else - #define MAX6675_SS_PIN -1 -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 7 // HOTEND0 MOSFET -#define HEATER_1_PIN 8 // HOTEND1 MOSFET -#define HEATER_BED_PIN 39 // BED MOSFET - -#ifndef FAN_PIN - #define FAN_PIN 11 // FAN1 header on board - PRINT FAN -#endif -#define FAN1_PIN 9 // FAN2 header on board - CONTROLLER FAN -#define FAN2_PIN 12 // FAN3 header on board - EXTRUDER0 FAN - -// -// Misc. Functions -// -#define SDSS 4 -#define PS_ON_PIN 40 - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #define LCD_PINS_RS 42 - #define LCD_PINS_ENABLE 43 - #define LCD_PINS_D4 44 - #define LCD_PINS_D5 45 - #define LCD_PINS_D6 46 - #define LCD_PINS_D7 47 - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN 41 - - #define BTN_EN1 50 - #define BTN_EN2 52 - #define BTN_ENC 48 - - #define SDSS 4 - #define SD_DETECT_PIN 14 - - #elif ENABLED(RADDS_DISPLAY) - - #define BEEPER_PIN 41 - - #define BTN_EN1 50 - #define BTN_EN2 52 - #define BTN_ENC 48 - - #define BTN_BACK 71 - - #undef SDSS - #define SDSS 4 - #define SD_DETECT_PIN 14 - - #elif HAS_U8GLIB_I2C_OLED - - #define BTN_EN1 50 - #define BTN_EN2 52 - #define BTN_ENC 48 - #define BEEPER_PIN 41 - #define LCD_SDSS 4 - #define SD_DETECT_PIN 14 - - #elif ENABLED(SPARK_FULL_GRAPHICS) - - #define LCD_PINS_D4 29 - #define LCD_PINS_ENABLE 27 - #define LCD_PINS_RS 25 - - #define BTN_EN1 35 - #define BTN_EN2 33 - #define BTN_ENC 37 - - #define BEEPER_PIN -1 - #endif // SPARK_FULL_GRAPHICS -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h deleted file mode 100644 index 5f9ad48a08..0000000000 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ /dev/null @@ -1,174 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * DUE3DOM MINI pin assignments - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "DUE3DOM MINI" - -// -// Servos -// -#define SERVO0_PIN 5 -#define SERVO1_PIN 6 -#define SERVO2_PIN 8 // 4-pin header FAN0 -#define SERVO3_PIN -1 - -// -// Limit Switches -// -#define X_MIN_PIN 38 -#define X_MAX_PIN -1 -#define Y_MIN_PIN 34 -#define Y_MAX_PIN -1 -#define Z_MIN_PIN 30 -#define Z_MAX_PIN -1 - -// -// Steppers -// -#define X_STEP_PIN 17 -#define X_DIR_PIN 16 -#define X_ENABLE_PIN 22 - -#define Y_STEP_PIN 2 -#define Y_DIR_PIN 3 -#define Y_ENABLE_PIN 26 - -#define Z_STEP_PIN 64 -#define Z_DIR_PIN 63 -#define Z_ENABLE_PIN 15 - -#define E0_STEP_PIN 61 -#define E0_DIR_PIN 60 -#define E0_ENABLE_PIN 62 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input (HOTEND0 thermistor) -#define TEMP_1_PIN 2 // Analog Input (unused) -#define TEMP_2_PIN 5 // Analog Input (OnBoard thermistor beta 3950) -#define TEMP_BED_PIN 1 // Analog Input (BED thermistor) - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 53 -#else - #define MAX6675_SS_PIN 53 -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 13 // HOTEND0 MOSFET -#define HEATER_BED_PIN 7 // BED MOSFET - -#ifndef FAN_PIN - #define FAN_PIN 11 // FAN1 header on board - PRINT FAN -#endif -#define FAN1_PIN 12 // FAN2 header on board - CONTROLLER FAN -#define FAN2_PIN 9 // FAN3 header on board - EXTRUDER0 FAN -//#define FAN3_PIN 8 // FAN0 4-pin header on board - -// -// Misc. Functions -// -#define SDSS 4 -#define PS_ON_PIN 40 - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #define LCD_PINS_RS 42 - #define LCD_PINS_ENABLE 43 - #define LCD_PINS_D4 44 - #define LCD_PINS_D5 45 - #define LCD_PINS_D6 46 - #define LCD_PINS_D7 47 - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN 41 - - #define BTN_EN1 50 - #define BTN_EN2 52 - #define BTN_ENC 48 - - #define SDSS 4 - #define SD_DETECT_PIN 14 - - #elif ENABLED(RADDS_DISPLAY) - - #define BEEPER_PIN 41 - - #define BTN_EN1 50 - #define BTN_EN2 52 - #define BTN_ENC 48 - - #define BTN_BACK 71 - - #undef SDSS - #define SDSS 4 - #define SD_DETECT_PIN 14 - - #elif HAS_U8GLIB_I2C_OLED - - #define BTN_EN1 50 - #define BTN_EN2 52 - #define BTN_ENC 48 - #define BEEPER_PIN 41 - #define LCD_SDSS 4 - #define SD_DETECT_PIN 14 - - #elif ENABLED(SPARK_FULL_GRAPHICS) - - #define LCD_PINS_D4 29 - #define LCD_PINS_ENABLE 27 - #define LCD_PINS_RS 25 - - #define BTN_EN1 35 - #define BTN_EN2 33 - #define BTN_ENC 37 - - #define BEEPER_PIN -1 - - #elif ENABLED(MINIPANEL) - #define BTN_EN1 52 - #define BTN_EN2 50 - #define BTN_ENC 48 - #define LCD_SDSS 4 - #define SD_DETECT_PIN 14 - #define BEEPER_PIN 41 - #define DOGLCD_A0 46 - #define DOGLCD_CS 45 - - #endif // SPARK_FULL_GRAPHICS -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h deleted file mode 100644 index 22edb70213..0000000000 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * PRINTRBOARD_G2 - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "PRINTRBOARD_G2" -#endif - -// -// Servos -// -//#define SERVO0_PIN -1 -//#define SERVO1_PIN -1 - -// -// Limit Switches -// -#define X_MIN_PIN 22 // PB26 -#define Y_MAX_PIN 18 // PA11 -#define Z_MIN_PIN 19 // PA10 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 22 -#endif - -#ifndef FIL_RUNOUT_PIN - //#define FIL_RUNOUT_PIN 57 // PA22 -#endif -#ifndef FIL_RUNOUT2_PIN - //#define FIL_RUNOUT2_PIN 21 // PB13 -#endif - -// -// LED defines -// -//#define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) -//#define NEOPIXEL_PIN 20 // LED driving pin on motherboard -//#define NEOPIXEL_PIXELS 3 // Number of LEDs in the strip -//#define SDA0 20 // PB12 NeoPixel pin I2C data -//#define SCL0 21 // PB13 I2C clock - -// D0_12 #REF! (INDICATOR_LED) -// B28 JTAG-CLK -// B31 JTAG_TMS /SWD_DIO -//A18 INTERRUPT_OUT -//A12 USART_RX not used -//A13 USART_TX not used -//A14 UART_RTS -//A15 UART_CTS -//PB2 Unassigned -//PB4 to PB9 Unassigned -//#define UART_RX_PIN 0 // PA8 "RX0" -//#define UART_TX_PIN 1 // PA9 "TX0" -//#define UART_RTS_PIN 23 // PA14 -//#define UART_CTS_PIN 24 // PA15 - -// -// Steppers -// -#define Z_STEP_PIN 73 // PA21 MOTOR 1 -#define Z_DIR_PIN 75 // PA26 -#define Z_ENABLE_PIN 74 // PA25 - -#define X_STEP_PIN 66 // PB15 MOTOR 2 -#define X_DIR_PIN 54 // PA16 -#define X_ENABLE_PIN 67 // PB16 - -#define Y_STEP_PIN 34 // PA29 MOTOR 3 -#define Y_DIR_PIN 35 // PB1 -#define Y_ENABLE_PIN 36 // PB0 - -#define E0_STEP_PIN 53 // PB14 MOTOR 4 -#define E0_DIR_PIN 78 // PB23 -#define E0_ENABLE_PIN 37 // PB22 - -// Microstepping mode pins -#define Z_MS1_PIN 52 // PB21 MODE0 MOTOR 1 -#define Z_MS2_PIN 52 // PB21 MODE1 -#define Z_MS3_PIN 65 // PB20 MODE2 - -#define X_MS1_PIN 43 // PA20 MODE0 MOTOR 2 -#define X_MS2_PIN 43 // PA20 MODE1 -#define X_MS3_PIN 42 // PA19 MODE2 - -#define Y_MS1_PIN 77 // PA28 MODE0 MOTOR 3 -#define Y_MS2_PIN 77 // PA28 MODE1 -#define Y_MS3_PIN 76 // PA27 MODE2 - -#define E0_MS1_PIN 38 // PB11 MODE0 MOTOR 4 -#define E0_MS2_PIN 38 // PB11 MODE1 -#define E0_MS3_PIN 39 // PB10 MODE2 - -// Motor current PWM pins -#define MOTOR_CURRENT_PWM_X_PIN 62 // PB17 MOTOR 1 -#define MOTOR_CURRENT_PWM_Z_PIN 63 // PB18 MOTOR 2 -#define MOTOR_CURRENT_PWM_Y_PIN 64 // PB19 MOTOR 3 -#define MOTOR_CURRENT_PWM_E_PIN 61 // PA2 MOTOR 4 - -#define DEFAULT_PWM_MOTOR_CURRENT { 300, 400, 1000} // XY Z E0, 1000 = 1000mAh - -// -// Temperature Sensors -// -#define TEMP_0_PIN 2 // digital 56 PA23 -#define TEMP_BED_PIN 5 // digital 59 PA4 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 40 // PA5 -#define HEATER_BED_PIN 41 // PB24 - -#ifndef FAN_PIN - #define FAN_PIN 13 // PB27 Fan1A -#endif -#define FAN1_PIN 58 // PA6 Fan1B - -#define FET_SAFETY_PIN 31 // PA7 must be pulsed low every 50 mS or FETs are turned off -#define FET_SAFETY_DELAY 50 // 50 mS delay between pulses -#define FET_SAFETY_INVERTED true // true - negative going pulse of 2 uS - -///////////////////////////////////////////////////////// - -#define MISO_PIN 68 // set to unused pins for now -#define MOSI_PIN 69 // set to unused pins for now -#define SCK_PIN 70 // set to unused pins for now -#define SDSS 71 // set to unused pins for now - -/** - * G2 uses 8 pins that are not available in the DUE environment: - * 34 PA29 - Y_STEP_PIN - * 35 PB1 - Y_DIR_PIN - * 36 PB0 - Y_ENABLE_PIN - * 37 PB22 - E0_ENABLE_PIN - * 38 PB11 - E0_MS1_PIN - normally used by the USB native port - * 39 PB10 - E0_MS3_PIN - normally used by the USB native port - * 40 PA5 - HEATER_0_PIN - * 41 PB24 - HEATER_BED_PIN - * - * None of these are in the arduino_due_x variant so digitalWrite and digitalRead can't be used on them. - * - * They can be accessed via FASTIO functions WRITE, READ, OUT_WRITE, OUTPUT, ... - */ diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h deleted file mode 100644 index 60fe351237..0000000000 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ /dev/null @@ -1,294 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * RADDS - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "RADDS" - -// -// EEPROM -// -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) - #define I2C_EEPROM - #define MARLIN_EEPROM_SIZE 0x2000 // 8KB -#endif - -// -// Servos -// -#if !HAS_CUTTER - #define SERVO0_PIN 5 -#endif -#define SERVO1_PIN 6 -#define SERVO2_PIN 39 -#define SERVO3_PIN 40 - -// -// Limit Switches -// -#define X_MIN_PIN 28 -#define X_MAX_PIN 34 -#define Y_MIN_PIN 30 -#define Y_MAX_PIN 36 -#define Z_MIN_PIN 32 -#define Z_MAX_PIN 38 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 38 -#endif - -// -// Steppers -// -#define X_STEP_PIN 24 -#define X_DIR_PIN 23 -#define X_ENABLE_PIN 26 -#ifndef X_CS_PIN - #define X_CS_PIN 25 -#endif - -#define Y_STEP_PIN 17 -#define Y_DIR_PIN 16 -#define Y_ENABLE_PIN 22 -#ifndef Y_CS_PIN - #define Y_CS_PIN 27 -#endif - -#define Z_STEP_PIN 2 -#define Z_DIR_PIN 3 -#define Z_ENABLE_PIN 15 -#ifndef Z_CS_PIN - #define Z_CS_PIN 29 -#endif - -#define E0_STEP_PIN 61 -#define E0_DIR_PIN 60 -#define E0_ENABLE_PIN 62 -#ifndef E0_CS_PIN - #define E0_CS_PIN 31 -#endif - -#define E1_STEP_PIN 64 -#define E1_DIR_PIN 63 -#define E1_ENABLE_PIN 65 -#ifndef E1_CS_PIN - #define E1_CS_PIN 33 -#endif - -#define E2_STEP_PIN 51 -#define E2_DIR_PIN 53 -#define E2_ENABLE_PIN 49 -#ifndef E2_CS_PIN - #define E2_CS_PIN 35 -#endif - -/** - * RADDS Extension Board V2 / V3 - * http://doku.radds.org/dokumentation/extension-board - */ -//#define RADDS_EXTENSION 2 -#if RADDS_EXTENSION >= 2 - #define E3_DIR_PIN 33 - #define E3_STEP_PIN 35 - #define E3_ENABLE_PIN 37 - #ifndef E3_CS_PIN - #define E3_CS_PIN 6 - #endif - - #if RADDS_EXTENSION == 3 - - #define E4_DIR_PIN 27 - #define E4_STEP_PIN 29 - #define E4_ENABLE_PIN 31 - #ifndef E4_CS_PIN - #define E4_CS_PIN 39 - #endif - - #define E5_DIR_PIN 66 - #define E5_STEP_PIN 67 - #define E5_ENABLE_PIN 68 - #ifndef E5_CS_PIN - #define E5_CS_PIN 6 - #endif - - #define RADDS_EXT_MSI_PIN 69 - - #define BOARD_INIT() OUT_WRITE(RADDS_EXT_VDD_PIN, HIGH) - - #else - - #define E4_DIR_PIN 27 - #define E4_STEP_PIN 29 - #define E4_ENABLE_PIN 31 - #ifndef E4_CS_PIN - #define E4_CS_PIN 39 - #endif - - // E3 and E4 share the same MSx pins - #define E3_MS1_PIN 67 - #define E4_MS1_PIN 67 - #define E3_MS2_PIN 68 - #define E4_MS2_PIN 68 - #define E3_MS3_PIN 69 - #define E4_MS3_PIN 69 - - #define RADDS_EXT_VDD2_PIN 66 - - #define BOARD_INIT() do{ OUT_WRITE(RADDS_EXT_VDD_PIN, HIGH); OUT_WRITE(RADDS_EXT_VDD2_PIN, HIGH); }while(0) - - #endif - - #define RADDS_EXT_VDD_PIN 25 - -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 1 // Analog Input -#define TEMP_2_PIN 2 // Analog Input -#define TEMP_3_PIN 3 // Analog Input -#define TEMP_4_PIN 5 // dummy so will compile when PINS_DEBUGGING is enabled -#define TEMP_BED_PIN 4 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 53 -#else - #define MAX6675_SS_PIN 49 -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 13 -#define HEATER_1_PIN 12 -#define HEATER_2_PIN 11 -#if !HAS_CUTTER - #define HEATER_BED_PIN 7 // BED -#endif - -#ifndef FAN_PIN - #define FAN_PIN 9 -#endif -#define FAN1_PIN 8 - -// -// Misc. Functions -// -#define SD_DETECT_PIN 14 -#define PS_ON_PIN 40 // SERVO3_PIN - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 39 // SERVO2_PIN -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER - #if !NUM_SERVOS - #define SPINDLE_LASER_PWM_PIN 5 // SERVO0_PIN - #endif - #define SPINDLE_LASER_ENA_PIN 7 // HEATER_BED_PIN - Pullup/down! -#endif - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if ENABLED(RADDS_DISPLAY) - - #define LCD_PINS_RS 42 - #define LCD_PINS_ENABLE 43 - #define LCD_PINS_D4 44 - #define LCD_PINS_D5 45 - #define LCD_PINS_D6 46 - #define LCD_PINS_D7 47 - - #define BEEPER_PIN 41 - - #define BTN_EN1 50 - #define BTN_EN2 52 - #define BTN_ENC 48 - - #define BTN_BACK 71 - - #define SDSS 10 - #define SD_DETECT_PIN 14 - - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - - // The REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER requires - // an adapter such as https://www.thingiverse.com/thing:1740725 - - #define LCD_PINS_RS 42 - #define LCD_PINS_ENABLE 43 - #define LCD_PINS_D4 44 - - #define BEEPER_PIN 41 - - #define BTN_EN1 50 - #define BTN_EN2 52 - #define BTN_ENC 48 - - #define SDSS 10 - #define SD_DETECT_PIN 14 - - #elif HAS_U8GLIB_I2C_OLED - - #define BTN_EN1 50 - #define BTN_EN2 52 - #define BTN_ENC 48 - #define BEEPER_PIN 41 - #define LCD_SDSS 10 - #define SD_DETECT_PIN 14 - - #elif ENABLED(SPARK_FULL_GRAPHICS) - - #define LCD_PINS_D4 29 - #define LCD_PINS_ENABLE 27 - #define LCD_PINS_RS 25 - - #define BTN_EN1 35 - #define BTN_EN2 33 - #define BTN_ENC 37 - - #endif // SPARK_FULL_GRAPHICS - -#endif // HAS_WIRED_LCD - -#ifndef SDSS - #define SDSS 4 -#endif diff --git a/Marlin/src/pins/sam/pins_RAMPS4DUE.h b/Marlin/src/pins/sam/pins_RAMPS4DUE.h deleted file mode 100644 index 54548333b5..0000000000 --- a/Marlin/src/pins/sam/pins_RAMPS4DUE.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega or Due with RAMPS4DUE pin assignments - * - * Applies to the following boards: - * - * RAMPS4DUE_EFB (Hotend, Fan, Bed) - * RAMPS4DUE_EEB (Hotend0, Hotend1, Bed) - * RAMPS4DUE_EFF (Hotend, Fan0, Fan1) - * RAMPS4DUE_EEF (Hotend0, Hotend1, Fan) - * RAMPS4DUE_SF (Spindle, Controller Fan) - * - * Differences between - * RAMPS_14 | RAMPS4DUE - * A13 | A9/D63 (shares the same pin with AUX2_4PIN) - * A14 | A10/D64 (shares the same pin with AUX2_5PIN) - * A15 | NC - */ - -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "RAMPS4DUE" - -#define IS_RAMPS4DUE - -// -// Temperature Sensors -// -#define TEMP_0_PIN 9 // Analog Input -#define TEMP_1_PIN -1 // Analog Input -#define TEMP_BED_PIN 10 // Analog Input - -#include "../ramps/pins_RAMPS.h" diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h deleted file mode 100644 index bfc3968ffa..0000000000 --- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Mega or Due with RAMPS Duo pin assignments - * - * Applies to the following boards: - * - * RAMPS_DUO_EFB (Hotend, Fan, Bed) - * RAMPS_DUO_EEB (Hotend0, Hotend1, Bed) - * RAMPS_DUO_EFF (Hotend, Fan0, Fan1) - * RAMPS_DUO_EEF (Hotend0, Hotend1, Fan) - * RAMPS_DUO_SF (Spindle, Controller Fan) - * - * Differences between - * RAMPS_14 | RAMPS_DUO - * A9/D63 | A12/D66 - * A10/D64 | A13/D67 - * A11/D65 | A14/D68 - * A12/D66 | A15/D69 - * A13 | A9 - * A14 | A10 - * A15 | A11 - */ - -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "RAMPS Duo" - -#define IS_RAMPS_DUO - -#include "../ramps/pins_RAMPS.h" - -// -// Temperature Sensors -// -#undef TEMP_0_PIN -#define TEMP_0_PIN 9 // Analog Input - -#undef TEMP_1_PIN -#define TEMP_1_PIN 11 // Analog Input - -#undef TEMP_BED_PIN -#define TEMP_BED_PIN 10 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#undef MAX6675_SS_PIN -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 69 // Don't use 53 if using Display/SD card -#else - #define MAX6675_SS_PIN 69 // Don't use 49 (SD_DETECT_PIN) -#endif - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if BOTH(NEWPANEL, PANEL_ONE) - #undef LCD_PINS_D4 - #define LCD_PINS_D4 68 - - #undef LCD_PINS_D5 - #define LCD_PINS_D5 69 - - #undef LCD_PINS_D7 - #define LCD_PINS_D7 67 - #endif - - #if ENABLED(NEWPANEL) - - #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #undef BTN_EN1 - #define BTN_EN1 67 - - #undef BTN_ENC - #define BTN_ENC 66 - - #elif ENABLED(MINIPANEL) - - #undef DOGLCD_CS - #define DOGLCD_CS 69 - - #undef LCD_BACKLIGHT_PIN - #define LCD_BACKLIGHT_PIN 68 // backlight LED on A14/D68 - - #undef KILL_PIN - #define KILL_PIN 67 - - #undef BTN_EN2 - #define BTN_EN2 66 - - #else - - #if ENABLED(REPRAPWORLD_KEYPAD) - #undef BTN_EN1 - #define BTN_EN1 67 // encoder - - #undef BTN_ENC - #define BTN_ENC 66 // enter button - #elif ENABLED(PANEL_ONE) - #undef BTN_EN2 - #define BTN_EN2 66 // AUX2 PIN 4 - #endif - #endif - - #endif // NEWPANEL - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h deleted file mode 100644 index ee525eefaa..0000000000 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * RAMPS-FD - * - * No EEPROM - * Use 4k7 thermistor tables - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "RAMPS-FD v1" -#endif - -#define INVERTED_HEATER_PINS -#define INVERTED_BED_PINS -#define INVERTED_FAN_PINS - -// -// Servos -// -#define SERVO0_PIN 7 -#define SERVO1_PIN 6 -#define SERVO2_PIN 5 -#define SERVO3_PIN 3 - -// -// Limit Switches -// -#define X_MIN_PIN 22 -#define X_MAX_PIN 30 -#define Y_MIN_PIN 24 -#define Y_MAX_PIN 38 -#define Z_MIN_PIN 26 -#define Z_MAX_PIN 34 - -// -// Steppers -// -#define X_STEP_PIN 63 -#define X_DIR_PIN 62 -#define X_ENABLE_PIN 48 -#ifndef X_CS_PIN - #define X_CS_PIN 68 -#endif - -#define Y_STEP_PIN 65 -#define Y_DIR_PIN 64 -#define Y_ENABLE_PIN 46 -#ifndef Y_CS_PIN - #define Y_CS_PIN 60 -#endif - -#define Z_STEP_PIN 67 -#define Z_DIR_PIN 66 -#define Z_ENABLE_PIN 44 -#ifndef Z_CS_PIN - #define Z_CS_PIN 58 -#endif - -#define E0_STEP_PIN 36 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 42 -#ifndef E0_CS_PIN - #define E0_CS_PIN 67 -#endif - -#define E1_STEP_PIN 43 -#define E1_DIR_PIN 41 -#define E1_ENABLE_PIN 39 -#ifndef E1_CS_PIN - #define E1_CS_PIN 61 -#endif - -#define E2_STEP_PIN 32 -#define E2_DIR_PIN 47 -#define E2_ENABLE_PIN 45 -#ifndef E2_CS_PIN - #define E2_CS_PIN 59 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // Analog Input -#define TEMP_1_PIN 2 // Analog Input -#define TEMP_2_PIN 3 // Analog Input -#define TEMP_BED_PIN 0 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 53 -#else - #define MAX6675_SS_PIN 49 -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 9 -#define HEATER_1_PIN 10 -#define HEATER_2_PIN 11 -#define HEATER_BED_PIN 8 - -#ifndef FAN_PIN - #define FAN_PIN 12 -#endif - -// -// Misc. Functions -// -#define SDSS 4 -#define LED_PIN 13 - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - // ramps-fd lcd adaptor - - #define BEEPER_PIN 37 - #define BTN_EN1 33 - #define BTN_EN2 31 - #define BTN_ENC 35 - #define SD_DETECT_PIN 49 - - #if ENABLED(NEWPANEL) - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #endif - - #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS LCD_PINS_ENABLE - #define DOGLCD_A0 LCD_PINS_RS - #define DOGLCD_SCK 76 - #define DOGLCD_MOSI 75 - - //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 25 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN 27 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN 29 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN 25 - #endif - - #elif ENABLED(NEWPANEL) - - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 - - #if ENABLED(MINIPANEL) - #define DOGLCD_CS 25 - #define DOGLCD_A0 27 - #endif - - #endif - - #if ANY(VIKI2, miniVIKI) - #define DOGLCD_A0 16 - #define KILL_PIN 51 - #define STAT_LED_BLUE_PIN 29 - #define STAT_LED_RED_PIN 23 - #define DOGLCD_CS 17 - #define DOGLCD_SCK 76 // SCK_PIN - Required for DUE Hardware SPI - #define DOGLCD_MOSI 75 // MOSI_PIN - #define DOGLCD_MISO 74 // MISO_PIN - #endif - -#endif // HAS_WIRED_LCD - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HOTENDS < 3 && HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) - #define SPINDLE_LASER_ENA_PIN 45 // Use E2 ENA - #define SPINDLE_LASER_PWM_PIN 12 // Hardware PWM - #define SPINDLE_DIR_PIN 47 // Use E2 DIR -#endif diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h deleted file mode 100644 index 55a42b2a47..0000000000 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * RAMPS-FD v2 - * - * EEPROM supported - * Use 1k thermistor tables - */ - -#define BOARD_INFO_NAME "RAMPS-FD v2" - -#ifndef E0_CS_PIN - #define E0_CS_PIN 69 // moved from A13 to A15 on v2.2, if not earlier -#endif - -#include "pins_RAMPS_FD_V1.h" - -#undef INVERTED_HEATER_PINS -#undef INVERTED_BED_PINS -#undef INVERTED_FAN_PINS - -#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x10000 // 64K in a 24C512 - -#ifndef PS_ON_PIN - #define PS_ON_PIN 12 -#endif - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 5 // Analog Input on AUX2 -#endif diff --git a/Marlin/src/pins/sam/pins_RAMPS_SMART.h b/Marlin/src/pins/sam/pins_RAMPS_SMART.h deleted file mode 100644 index 9b76ee290b..0000000000 --- a/Marlin/src/pins/sam/pins_RAMPS_SMART.h +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Arduino Due with RAMPS-SMART pin assignments - * - * Applies to the following boards: - * - * RAMPS_SMART_EFB (Hotend, Fan, Bed) - * RAMPS_SMART_EEB (Hotend0, Hotend1, Bed) - * RAMPS_SMART_EFF (Hotend, Fan0, Fan1) - * RAMPS_SMART_EEF (Hotend0, Hotend1, Fan) - * RAMPS_SMART_SF (Spindle, Controller Fan) - * - * Differences between - * RAMPS_14 | RAMPS-SMART - * NONE | D16 (Additional AUX-3 pin(AUX3_2PIN), shares the same pin with AUX4_18PIN) - * NONE | D17 (Additional AUX-3 pin(AUX3_1PIN), shares the same pin with AUX4_17PIN) - * D0 | NONE - * D1 | NONE - * A3/D57 | NONE - * A4/D58 | NONE - * A5/D59 | A3/D57 - * A9/D63 | A4/D58 - * A10/D64 | A5/D59 - * A11/D65 | D66 - * A12/D66 | D67 - * A13 | A9 - * A14 | A10 - * A15 | A11 - * - * - * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER works fine connected to AUX-4 with - * Smart Adapter, but requires removing the AUX3 pin header on the adapter to fit. - * To use the SD card reader, wire its pins to AUX-3 (and use Software SPI). - * - * To use Hardware SPI for SD, the SDSS pin must be set to 52 instead of 53. - * Hardware SPI also requires additional wiring because the board doesn't pass - * the 6-pin SPI header from the DUE board. - * (Search the web for "Arduino DUE Board Pinout" to see the correct header.) - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "RAMPS-SMART" -#define IS_RAMPS_SMART -#include "../ramps/pins_RAMPS.h" - -// I2C EEPROM with 4K of space -#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 - -#define RESET_PIN 42 // Resets the board if the jumper is attached - -// -// Temperature Sensors -// -#undef TEMP_0_PIN -#define TEMP_0_PIN 9 // Analog Input - -#undef TEMP_1_PIN -#define TEMP_1_PIN 10 // Analog Input - -#undef TEMP_BED_PIN -#define TEMP_BED_PIN 11 // Analog Input - -// SPI for Max6675 or Max31855 Thermocouple -#undef MAX6675_SS_PIN -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 67 // Don't use 53 if using Display/SD card -#else - #define MAX6675_SS_PIN 67 // Don't use 49 (SD_DETECT_PIN) -#endif - -// -// LCD / Controller -// -// Support for AZSMZ 12864 LCD with SD Card 3D printer smart controller control panel -#if ENABLED(AZSMZ_12864) - #define BEEPER_PIN 66 // Smart RAMPS 1.42 pinout diagram on RepRap WIKI erroneously says this should be pin 65 - #define DOGLCD_A0 59 - #define DOGLCD_CS 44 - #define BTN_EN1 58 - #define BTN_EN2 40 - #define BTN_ENC 67 // Smart RAMPS 1.42 pinout diagram on RepRap WIKI erroneously says this should be pin 66 - #define SD_DETECT_PIN 49 // Pin 49 for display sd interface, 72 for easy adapter board - #define KILL_PIN 42 -#endif diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h deleted file mode 100644 index b9e61fb27c..0000000000 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ /dev/null @@ -1,274 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * Ported sys0724 & Vynt - */ - -/** - * Arduino Mega? or Due with RuRAMPS4DUE pin assignments - * - * Applies to the following boards: - * RURAMPS4DUE (Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) - * - * Differences between - * RADDS | RuRAMPS4DUE - * | - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "RuRAMPS4Due v1.1" - -// -// Servos -// -#define SERVO0_PIN 5 -#define SERVO1_PIN 3 - -// -// Limit Switches -// -#define X_MIN_PIN 45 -#define X_MAX_PIN 39 -#define Y_MIN_PIN 46 -#define Y_MAX_PIN 41 -#define Z_MIN_PIN 47 -#define Z_MAX_PIN 43 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 43 -#endif - -// -// Steppers -// -#define X_STEP_PIN 37 // Support Extension Board -#define X_DIR_PIN 36 -#define X_ENABLE_PIN 38 -#ifndef X_CS_PIN - #define X_CS_PIN -1 -#endif - -#define Y_STEP_PIN 32 // Support Extension Board -#define Y_DIR_PIN 35 -#define Y_ENABLE_PIN 34 -#ifndef Y_CS_PIN - #define Y_CS_PIN -1 -#endif - -#define Z_STEP_PIN 30 // Support Extension Board -#define Z_DIR_PIN 2 -#define Z_ENABLE_PIN 33 -#ifndef Z_CS_PIN - #define Z_CS_PIN -1 -#endif - -#define E0_STEP_PIN 29 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 31 -#ifndef E0_CS_PIN - #define E0_CS_PIN -1 -#endif - -#define E1_STEP_PIN 22 -#define E1_DIR_PIN 24 -#define E1_ENABLE_PIN 26 -#ifndef E1_CS_PIN - #define E1_CS_PIN -1 -#endif - -#define E2_STEP_PIN 25 -#define E2_DIR_PIN 23 -#define E2_ENABLE_PIN 27 -#ifndef E2_CS_PIN - #define E2_CS_PIN -1 -#endif - -#define E3_STEP_PIN 15 // Only For Extension Board -#define E3_DIR_PIN 14 -#define E3_ENABLE_PIN 61 -#ifndef E3_CS_PIN - #define E3_CS_PIN -1 -#endif - -// For Future: Microstepping pins - Mapping not from fastio.h (?) -//#define E3_MS1_PIN ? -//#define E3_MS2_PIN ? -//#define E3_MS3_PIN ? - -#if HAS_CUSTOM_PROBE_PIN - #define Z_MIN_PROBE_PIN 49 -#endif - -#if HAS_FILAMENT_SENSOR - #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN Y_MIN_PIN - #endif -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 13 -#define HEATER_1_PIN 12 -#define HEATER_2_PIN 11 -#define HEATER_BED_PIN 7 // BED H1 - -#ifndef FAN_PIN - #define FAN_PIN 9 -#endif -#define FAN1_PIN 8 -#define CONTROLLER_FAN_PIN -1 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // ANALOG A0 -#define TEMP_1_PIN 1 // ANALOG A1 -#define TEMP_2_PIN 2 // ANALOG A2 -#define TEMP_3_PIN 3 // ANALOG A3 -#define TEMP_BED_PIN 4 // ANALOG A4 - -// The thermocouple uses Analog pins -#if ENABLED(VER_WITH_THERMOCOUPLE) // Defined in Configuration.h - #define TEMP_4_PIN 5 // A5 - #define TEMP_5_PIN 6 // A6 (Marlin 2.0 not support) -#endif - -// SPI for Max6675 or Max31855 Thermocouple -/* -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 53 -#else - #define MAX6675_SS_PIN 49 -#endif -*/ - -// -// Misc. Functions -// -#define SDSS 4 // 4,10,52 if using HW SPI. -#define LED_PIN -1 // 13 - HEATER_0_PIN -#define PS_ON_PIN -1 // 65 - -// MKS TFT / Nextion Use internal USART-1 -#define TFT_LCD_MODULE_COM 1 -#define TFT_LCD_MODULE_BAUDRATE 115600 - -// ESP WiFi Use internal USART-2 -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115600 -#define ESP_WIFI_MODULE_RESET_PIN -1 -#define PIGGY_GPIO_PIN -1 - -// -// EEPROM -// -#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) -#define I2C_EEPROM // EEPROM on I2C-0 -//#define EEPROM_SD // EEPROM on SDCARD -//#define SPI_EEPROM // EEPROM on SPI-0 -//#define SPI_CHAN_EEPROM1 ? -//#define SPI_EEPROM1_CS ? -// 2K EEPROM -//#define SPI_EEPROM2_CS ? -// 32Mb FLASH -//#define SPI_FLASH_CS ? - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define BEEPER_PIN 62 - #define LCD_PINS_D4 48 - #define LCD_PINS_D5 50 - #define LCD_PINS_D6 52 - #define LCD_PINS_D7 53 - #define SD_DETECT_PIN 51 - #endif - - #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define LCD_PINS_RS 63 - #define LCD_PINS_ENABLE 64 - - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - - #define LCD_PINS_RS 52 - #define LCD_PINS_ENABLE 53 - - #elif HAS_U8GLIB_I2C_OLED - - #define BEEPER_PIN 62 - #define LCD_SDSS 10 - #define SD_DETECT_PIN 51 - - #elif ENABLED(FYSETC_MINI_12864) - - #define BEEPER_PIN 62 - #define DOGLCD_CS 64 - #define DOGLCD_A0 63 - - //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN 48 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 50 // D5 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN 52 // D6 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN 53 // D7 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN 50 // D5 - #endif - - #elif ENABLED(SPARK_FULL_GRAPHICS) - - //http://doku.radds.org/dokumentation/other-electronics/sparklcd/ - #error "Oops! SPARK_FULL_GRAPHICS not supported with RURAMPS4D." - //#define LCD_PINS_D4 29 //? - //#define LCD_PINS_ENABLE 27 //? - //#define LCD_PINS_RS 25 //? - //#define BTN_EN1 35 //? - //#define BTN_EN2 33 //? - //#define BTN_ENC 37 //? - - #endif // SPARK_FULL_GRAPHICS - - #if ENABLED(NEWPANEL) - #define BTN_EN1 44 - #define BTN_EN2 42 - #define BTN_ENC 40 - #endif - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h deleted file mode 100644 index dc0c127995..0000000000 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ /dev/null @@ -1,256 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * Ported sys0724 & Vynt - */ - -/** - * Arduino Mega? or Due with RuRAMPS4DUE pin assignments - * - * Applies to the following boards: - * RURAMPS4DUE (Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) - * - * Differences between - * RADDS | RuRAMPS4DUE - * | - */ - -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "RuRAMPS4Due v1.3" - -// -// Servos -// -#define SERVO0_PIN 5 -#define SERVO1_PIN 3 - -// -// Limit Switches -// -#define X_MIN_PIN 45 -#define X_MAX_PIN 39 -#define Y_MIN_PIN 46 -#define Y_MAX_PIN 41 -#define Z_MIN_PIN 47 -#define Z_MAX_PIN 43 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 49 -#endif - -// -// Steppers -// -#define X_STEP_PIN 37 // Support Extension Board -#define X_DIR_PIN 36 -#define X_ENABLE_PIN 31 -#ifndef X_CS_PIN - #define X_CS_PIN 38 -#endif - -#define Y_STEP_PIN 32 // Support Extension Board -#define Y_DIR_PIN 35 -#define Y_ENABLE_PIN 31 -#ifndef Y_CS_PIN - #define Y_CS_PIN 34 -#endif - -#define Z_STEP_PIN 30 // Support Extension Board -#define Z_DIR_PIN 2 -#define Z_ENABLE_PIN 31 -#ifndef Z_CS_PIN - #define Z_CS_PIN 10 -#endif - -#define E0_STEP_PIN 29 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 33 -#ifndef E0_CS_PIN - #define E0_CS_PIN 14 -#endif - -#define E1_STEP_PIN 22 -#define E1_DIR_PIN 24 -#define E1_ENABLE_PIN 26 -#ifndef E1_CS_PIN - #define E1_CS_PIN 15 -#endif - -#define E2_STEP_PIN 25 -#define E2_DIR_PIN 23 -#define E2_ENABLE_PIN 27 -#ifndef E2_CS_PIN - #define E2_CS_PIN 61 -#endif - -#if HAS_CUSTOM_PROBE_PIN - #define Z_MIN_PROBE_PIN 49 -#endif - -#if HAS_FILAMENT_SENSOR - #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN Y_MIN_PIN - #endif -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 13 -#define HEATER_1_PIN 12 -#define HEATER_2_PIN 11 -#define HEATER_BED_PIN 7 // BED H1 - -#define FAN_PIN 9 -#define FAN1_PIN 8 -#define CONTROLLER_FAN_PIN -1 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // ANALOG A0 -#define TEMP_1_PIN 1 // ANALOG A1 -#define TEMP_2_PIN 2 // ANALOG A2 -#define TEMP_3_PIN 3 // ANALOG A3 -#define TEMP_BED_PIN 4 // ANALOG A4 - -// The thermocouple uses Analog pins -#if ENABLED(VER_WITH_THERMOCOUPLE) // Defined in Configuration.h - #define TEMP_4_PIN 5 // A5 - #define TEMP_5_PIN 6 // A6 (Marlin 2.0 not support) -#endif - -// SPI for Max6675 or Max31855 Thermocouple -/* -#if DISABLED(SDSUPPORT) - #define MAX6675_SS_PIN 53 -#else - #define MAX6675_SS_PIN 49 -#endif -*/ - -// -// Misc. Functions -// -#define SDSS 4 // 4,10,52 if using HW SPI. -#define LED_PIN -1 // 13 - HEATER_0_PIN -#define PS_ON_PIN -1 // 65 - -// MKS TFT / Nextion Use internal USART-1 -#define TFT_LCD_MODULE_COM 1 -#define TFT_LCD_MODULE_BAUDRATE 115200 - -// ESP WiFi Use internal USART-2 -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 -#define ESP_WIFI_MODULE_RESET_PIN -1 -#define PIGGY_GPIO_PIN -1 - -// -// EEPROM -// -#define MARLIN_EEPROM_SIZE 0x8000 // 32Kb (24lc256) -#define I2C_EEPROM // EEPROM on I2C-0 -//#define EEPROM_SD // EEPROM on SDCARD -//#define SPI_EEPROM // EEPROM on SPI-0 -//#define SPI_CHAN_EEPROM1 ? -//#define SPI_EEPROM1_CS ? -// 2K EEPROM -//#define SPI_EEPROM2_CS ? -// 32Mb FLASH -//#define SPI_FLASH_CS ? - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define BEEPER_PIN 62 - #define LCD_PINS_D4 48 - #define LCD_PINS_D5 50 - #define LCD_PINS_D6 52 - #define LCD_PINS_D7 53 - #define SD_DETECT_PIN 51 - #endif - - #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define LCD_PINS_RS 63 - #define LCD_PINS_ENABLE 64 - - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - - #define LCD_PINS_RS 52 - #define LCD_PINS_ENABLE 53 - - #elif HAS_U8GLIB_I2C_OLED - - #define BEEPER_PIN 62 - #define LCD_SDSS 10 - #define SD_DETECT_PIN 51 - - #elif ENABLED(FYSETC_MINI_12864) - - #define BEEPER_PIN 62 - #define DOGLCD_CS 64 - #define DOGLCD_A0 63 - - //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - #define LCD_RESET_PIN 48 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN 50 // D5 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN 52 // D6 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN 53 // D7 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN 50 // D5 - #endif - - #elif ENABLED(MKS_MINI_12864) - - #define DOGLCD_A0 52 - #define DOGLCD_CS 50 - - #define SD_DETECT_PIN 51 - - #endif - - #if ENABLED(NEWPANEL) - #define BTN_EN1 44 - #define BTN_EN2 42 - #define BTN_ENC 40 - #endif - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h deleted file mode 100644 index 0b91ba61d6..0000000000 --- a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * ReprapWorld ULTRATRONICS v1.0 - * https://reprapworld.com/documentation/datasheet_ultratronics10_05.pdf - */ - -#if NOT_TARGET(ARDUINO_ARCH_SAM) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Ultratronics v1.0" - -// -// Servos -// -#if NUM_SERVOS > 0 - #define SERVO0_PIN 11 - #if NUM_SERVOS > 1 - #define SERVO1_PIN 12 - #endif -#endif - -// -// Limit Switches -// -#define X_MIN_PIN 31 -#define X_MAX_PIN 30 -#define Y_MIN_PIN 12 -#define Y_MAX_PIN 11 -#define Z_MIN_PIN 29 -#define Z_MAX_PIN 28 - -// -// Steppers -// -#define X_STEP_PIN 35 -#define X_DIR_PIN 34 -#define X_ENABLE_PIN 37 -#ifndef X_CS_PIN - #define X_CS_PIN 18 -#endif - -#define Y_STEP_PIN 22 -#define Y_DIR_PIN 23 -#define Y_ENABLE_PIN 33 -#ifndef Y_CS_PIN - #define Y_CS_PIN 19 -#endif - -#define Z_STEP_PIN 25 -#define Z_DIR_PIN 26 -#define Z_ENABLE_PIN 24 -#ifndef Z_CS_PIN - #define Z_CS_PIN 16 -#endif - -#define E0_STEP_PIN 47 -#define E0_DIR_PIN 46 -#define E0_ENABLE_PIN 48 -#ifndef E0_CS_PIN - #define E0_CS_PIN 17 -#endif - -#define E1_STEP_PIN 44 -#define E1_DIR_PIN 36 -#define E1_ENABLE_PIN 45 -#ifndef E1_CS_PIN - #define E1_CS_PIN -1 -#endif - -#define E2_STEP_PIN 42 -#define E2_DIR_PIN 41 -#define E2_ENABLE_PIN 43 -#ifndef E2_CS_PIN - #define E2_CS_PIN -1 -#endif - -#define E3_STEP_PIN 39 -#define E3_DIR_PIN 38 -#define E3_ENABLE_PIN 40 -#ifndef E3_CS_PIN - #define E3_CS_PIN -1 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 2 // Analog Input -#define TEMP_2_PIN 3 // Analog Input -#define TEMP_3_PIN 4 // Analog Input -#define TEMP_BED_PIN 1 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 3 -#define HEATER_1_PIN 8 -#define HEATER_2_PIN 7 -#define HEATER_3_PIN 9 -#define HEATER_BED_PIN 2 - -#ifndef FAN_PIN - #define FAN_PIN 6 -#endif -#define FAN2_PIN 5 - -// -// Misc. Functions -// -#define SDSS 59 -#define SD_DETECT_PIN 60 -#define LED_PIN 13 -#define PS_ON_PIN 32 - -// -// SPI Buses -// - -#define DAC0_SYNC 53 // PB14 -#define SPI_CHAN_DAC 1 - -#define SPI_CHAN_EEPROM1 -1 -#define SPI_EEPROM1_CS -1 -#define SPI_EEPROM2_CS -1 -#define SPI_FLASH_CS -1 - -#define SCK_PIN 76 -#define MISO_PIN 74 -#define MOSI_PIN 75 - -// SPI for Max6675 or Max31855 Thermocouple -#define MAX6675_SS_PIN 65 -#define MAX31855_SS0 65 -#define MAX31855_SS1 52 -#define MAX31855_SS2 50 -#define MAX31855_SS3 51 - -#define ENC424_SS 61 - -// -// LCD / Controller -// - -#define BEEPER_PIN 27 - -#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define LCD_PINS_RS A8 // CS chip select / SS chip slave select - #define LCD_PINS_ENABLE MOSI // SID (MOSI) - #define LCD_PINS_D4 SCK // SCK (CLK) clock - - #define BTN_EN1 20 - #define BTN_EN2 21 - #define BTN_ENC 64 - -#endif // REPRAPWORLD_GRAPHICAL_LCD diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h deleted file mode 100644 index 6076be07e9..0000000000 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ /dev/null @@ -1,611 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * AGCM4 with RAMPS v1.4.4 pin assignments - */ - -#if NOT_TARGET(ARDUINO_GRAND_CENTRAL_M4) - #error "Oops! Select 'Adafruit Grand Central M4' in 'Tools > Board.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "AGCM4 RAMPS 1.4.4" -#endif - -// -// Servos -// -#define SERVO0_PIN 11 -#define SERVO1_PIN 6 -#define SERVO2_PIN 5 -#define SERVO3_PIN 4 - -// -// EEPROM -// -//#define QSPI_EEPROM // Use AGCM4 onboard QSPI EEPROM (Uses 4K of RAM) -#define I2C_EEPROM // EEPROM on I2C-0 -#define MARLIN_EEPROM_SIZE 0x8000 // 32K (24lc256) - -// -// Limit Switches -// -#define X_MIN_PIN 3 -#define X_MAX_PIN 2 -#define Y_MIN_PIN 14 -#define Y_MAX_PIN 15 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN 19 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 18 -#endif - -// -// Steppers -// -#define X_STEP_PIN 67 // Mega/Due:54 - AGCM4:67 -#define X_DIR_PIN 68 // Mega/Due:55 - AGCM4:68 -#define X_ENABLE_PIN 38 -#ifndef X_CS_PIN - #define X_CS_PIN 47 -#endif - -#define Y_STEP_PIN 73 // Mega/Due:60 - AGCM4:73 -#define Y_DIR_PIN 74 // Mega/Due:61 - AGCM4:74 -#define Y_ENABLE_PIN 69 // Mega/Due:56 - AGCM4:69 -#ifndef Y_CS_PIN - #define Y_CS_PIN 45 -#endif - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 54 // Mega/Due:62 - AGCM4:54 -#ifndef Z_CS_PIN - #define Z_CS_PIN 32 -#endif - -#define Z2_STEP_PIN 36 -#define Z2_DIR_PIN 34 -#define Z2_ENABLE_PIN 30 -#ifndef Z2_CS_PIN - #define Z2_CS_PIN 22 -#endif - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 -#ifndef E0_CS_PIN - #define E0_CS_PIN 43 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 13 -#define TEMP_BED_PIN 14 -#define TEMP_CHAMBER_PIN 15 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 10 -#define HEATER_BED_PIN 8 -#define FAN_PIN 9 -#define FAN1_PIN 7 -#define FAN2_PIN 12 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 5 // Analog Input on AUX2 -#endif - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 70 -#endif - -#ifndef PS_ON_PIN - #define PS_ON_PIN 39 -#endif - -#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENA_PIN) - #if NUM_SERVOS <= 1 // Prefer the servo connector - #define CASE_LIGHT_PIN 6 // Hardware PWM - #endif -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER && !defined(SPINDLE_LASER_ENA_PIN) - #if !NUM_SERVOS // Use servo connector if possible - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM - #define SPINDLE_DIR_PIN 5 - #else - #error "No auto-assignable Spindle/Laser pins available." - #endif -#endif - -// -// TMC software SPI -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI 58 // Mega/Due:66 - AGCM4:58 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO 44 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK 56 // Mega/Due:64 - AGCM4:56 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - - #ifndef X_SERIAL_TX_PIN - #define X_SERIAL_TX_PIN 47 - #endif - #ifndef X_SERIAL_RX_PIN - #define X_SERIAL_RX_PIN 47 - #endif - #ifndef X2_SERIAL_TX_PIN - #define X2_SERIAL_TX_PIN -1 - #endif - #ifndef X2_SERIAL_RX_PIN - #define X2_SERIAL_RX_PIN -1 - #endif - - #ifndef Y_SERIAL_TX_PIN - #define Y_SERIAL_TX_PIN 45 - #endif - #ifndef Y_SERIAL_RX_PIN - #define Y_SERIAL_RX_PIN 45 - #endif - #ifndef Y2_SERIAL_TX_PIN - #define Y2_SERIAL_TX_PIN -1 - #endif - #ifndef Y2_SERIAL_RX_PIN - #define Y2_SERIAL_RX_PIN -1 - #endif - - #ifndef Z_SERIAL_TX_PIN - #define Z_SERIAL_TX_PIN 32 - #endif - #ifndef Z_SERIAL_RX_PIN - #define Z_SERIAL_RX_PIN 32 - #endif - #ifndef Z2_SERIAL_TX_PIN - #define Z2_SERIAL_TX_PIN 22 - #endif - #ifndef Z2_SERIAL_RX_PIN - #define Z2_SERIAL_RX_PIN 22 - #endif - - #ifndef E0_SERIAL_TX_PIN - #define E0_SERIAL_TX_PIN 43 - #endif - #ifndef E0_SERIAL_RX_PIN - #define E0_SERIAL_RX_PIN 43 - #endif - #ifndef E1_SERIAL_TX_PIN - #define E1_SERIAL_TX_PIN -1 - #endif - #ifndef E1_SERIAL_RX_PIN - #define E1_SERIAL_RX_PIN -1 - #endif - #ifndef E2_SERIAL_TX_PIN - #define E2_SERIAL_TX_PIN -1 - #endif - #ifndef E2_SERIAL_RX_PIN - #define E2_SERIAL_RX_PIN -1 - #endif - #ifndef E3_SERIAL_TX_PIN - #define E3_SERIAL_TX_PIN -1 - #endif - #ifndef E3_SERIAL_RX_PIN - #define E3_SERIAL_RX_PIN -1 - #endif - #ifndef E4_SERIAL_TX_PIN - #define E4_SERIAL_TX_PIN -1 - #endif - #ifndef E4_SERIAL_RX_PIN - #define E4_SERIAL_RX_PIN -1 - #endif - #ifndef E5_SERIAL_TX_PIN - #define E5_SERIAL_TX_PIN -1 - #endif - #ifndef E5_SERIAL_RX_PIN - #define E5_SERIAL_RX_PIN -1 - #endif - #ifndef E6_SERIAL_TX_PIN - #define E6_SERIAL_TX_PIN -1 - #endif - #ifndef E6_SERIAL_RX_PIN - #define E6_SERIAL_RX_PIN -1 - #endif - #ifndef E7_SERIAL_TX_PIN - #define E7_SERIAL_TX_PIN -1 - #endif - #ifndef E7_SERIAL_RX_PIN - #define E7_SERIAL_RX_PIN -1 - #endif -#endif - -////////////////////////// -// LCDs and Controllers // -////////////////////////// - -#if HAS_WIRED_LCD - - // - // LCD Display output pins - // - #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - // TO TEST - //#define LCD_PINS_RS 49 // CS chip select /SS chip slave select - //#define LCD_PINS_ENABLE 51 // SID (MOSI) - //#define LCD_PINS_D4 52 // SCK (CLK) clock - - #elif BOTH(NEWPANEL, PANEL_ONE) - - // TO TEST - //#define LCD_PINS_RS 40 - //#define LCD_PINS_ENABLE 42 - //#define LCD_PINS_D4 57 // Mega/Due:65 - AGCM4:57 - //#define LCD_PINS_D5 58 // Mega/Due:66 - AGCM4:58 - //#define LCD_PINS_D6 44 - //#define LCD_PINS_D7 56 // Mega/Due:64 - AGCM4:56 - - #else - - #if ENABLED(CR10_STOCKDISPLAY) - - // TO TEST - //#define LCD_PINS_RS 27 - //#define LCD_PINS_ENABLE 29 - //#define LCD_PINS_D4 25 - - #if DISABLED(NEWPANEL) - // TO TEST - //#define BEEPER_PIN 37 - #endif - - #elif ENABLED(ZONESTAR_LCD) - - // TO TEST - //#define LCD_PINS_RS 56 // Mega/Due:64 - AGCM4:56 - //#define LCD_PINS_ENABLE 44 - //#define LCD_PINS_D4 55 // Mega/Due:63 - AGCM4:55 - //#define LCD_PINS_D5 40 - //#define LCD_PINS_D6 42 - //#define LCD_PINS_D7 57 // Mega/Due:65 - AGCM4:57 - - #else - - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) - // TO TEST - //#define LCD_PINS_DC 25 // Set as output on init - //#define LCD_PINS_RS 27 // Pull low for 1s to init - // DOGM SPI LCD Support - //#define DOGLCD_CS 16 - //#define DOGLCD_MOSI 17 - //#define DOGLCD_SCK 23 - //#define DOGLCD_A0 LCD_PINS_DC - #else - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #endif - - #define LCD_PINS_D7 29 - - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 - #endif - - #endif - - #if DISABLED(NEWPANEL) - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 - #endif - - #endif - - // - // LCD Display input pins - // - #if ENABLED(NEWPANEL) - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN 37 - - #if ENABLED(CR10_STOCKDISPLAY) - // TO TEST - //#define BTN_EN1 17 - //#define BTN_EN2 23 - #else - #define BTN_EN1 31 - #define BTN_EN2 33 - #endif - - #define BTN_ENC 35 - #ifndef SD_DETECT_PIN - #define SD_DETECT_PIN 49 - #endif - #define KILL_PIN 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - // TO TEST - //#define LCD_BACKLIGHT_PIN 39 - #endif - - #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - // TO TEST - //#define BTN_EN1 56 // Mega/Due:64 - AGCM4:56 - //#define BTN_EN2 72 // Mega/Due:59 - AGCM4:72 - //#define BTN_ENC 55 - //#define SD_DETECT_PIN 42 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - // TO TEST - //#define BTN_EN1 47 - //#define BTN_EN2 43 - //#define BTN_ENC 32 - //#define LCD_SDSS SDSS - //#define KILL_PIN 41 - - #elif ENABLED(LCD_I2C_VIKI) - - // TO TEST - //#define BTN_EN1 40 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - //#define BTN_EN2 42 - //#define BTN_ENC -1 - - //#define LCD_SDSS SDSS - //#define SD_DETECT_PIN 49 - - #elif ANY(VIKI2, miniVIKI) - - // TO TEST - //#define DOGLCD_CS 45 - //#define DOGLCD_A0 44 - //#define LCD_SCREEN_ROT_180 - - //#define BEEPER_PIN 33 - //#define STAT_LED_RED_PIN 32 - //#define STAT_LED_BLUE_PIN 35 - - //#define BTN_EN1 22 - //#define BTN_EN2 7 - //#define BTN_ENC 39 - - //#define SD_DETECT_PIN -1 // Pin 49 for display SD interface, 72 for easy adapter board - //#define KILL_PIN 31 - - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - - // TO TEST - //#define DOGLCD_CS 29 - //#define DOGLCD_A0 27 - - //#define BEEPER_PIN 23 - //#define LCD_BACKLIGHT_PIN 33 - - //#define BTN_EN1 35 - //#define BTN_EN2 37 - //#define BTN_ENC 31 - - //#define LCD_SDSS SDSS - //#define SD_DETECT_PIN 49 - //#define KILL_PIN 41 - - #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) - - // TO TEST - //#define BEEPER_PIN 37 - //#define BTN_ENC 35 - //#define SD_DETECT_PIN 49 - - //#ifndef KILL_PIN - // #define KILL_PIN 41 - //#endif - - #if ENABLED(MKS_MINI_12864) - - // TO TEST - //#define DOGLCD_A0 27 - //#define DOGLCD_CS 25 - - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - // not connected to a pin - //#define LCD_BACKLIGHT_PIN 57 // backlight LED on A11/D? (Mega/Due:65 - AGCM4:57) - - //#define BTN_EN1 31 - //#define BTN_EN2 33 - - #elif ENABLED(FYSETC_MINI_12864) - - // From https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 - - // TO TEST - //#define DOGLCD_A0 16 - //#define DOGLCD_CS 17 - - //#define BTN_EN1 33 - //#define BTN_EN2 31 - - //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems - // results in LCD soft SPI mode 3, SD soft SPI mode 0 - - //#define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - // TO TEST - //#define RGB_LED_R_PIN 25 - #endif - #ifndef RGB_LED_G_PIN - // TO TEST - //#define RGB_LED_G_PIN 27 - #endif - #ifndef RGB_LED_B_PIN - // TO TEST - //#define RGB_LED_B_PIN 29 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - // TO TEST - //#define NEOPIXEL_PIN 25 - #endif - - #endif - - #elif ENABLED(MINIPANEL) - - // TO TEST - //#define BEEPER_PIN 42 - // not connected to a pin - //#define LCD_BACKLIGHT_PIN 57 // backlight LED on A11/D? (Mega/Due:65 - AGCM4:57) - - //#define DOGLCD_A0 44 - //#define DOGLCD_CS 58 // Mega/Due:66 - AGCM4:58 - - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - //#define BTN_EN1 40 - //#define BTN_EN2 55 // Mega/Due:63 - AGCM4:55 - //#define BTN_ENC 72 // Mega/Due:59 - AGCM4:72 - - //#define SD_DETECT_PIN 49 - //#define KILL_PIN 56 // Mega/Due:64 - AGCM4:56 - - #elif ENABLED(ZONESTAR_LCD) - - // TO TEST - //#define ADC_KEYPAD_PIN 12 - - #elif ENABLED(AZSMZ_12864) - - // TO TEST - - #else - - // Beeper on AUX-4 - //#define BEEPER_PIN 33 - - // Buttons are directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) - // TO TEST - //#define SHIFT_OUT 40 - //#define SHIFT_CLK 44 - //#define SHIFT_LD 42 - //#define BTN_EN1 56 // Mega/Due:64 - AGCM4:56 - //#define BTN_EN2 72 // Mega/Due:59 - AGCM4:72 - //#define BTN_ENC 55 // Mega/Due:63 - AGCM4:55 - #elif ENABLED(PANEL_ONE) - // TO TEST - //#define BTN_EN1 72 // AUX2 PIN 3 (Mega/Due:59 - AGCM4:72) - //#define BTN_EN2 55 // AUX2 PIN 4 (Mega/Due:63 - AGCM4:55) - //#define BTN_ENC 49 // AUX3 PIN 7 - #else - // TO TEST - //#define BTN_EN1 37 - //#define BTN_EN2 35 - //#define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - // TO TEST - //#define SD_DETECT_PIN 49 - //#define KILL_PIN 41 - #endif - - #endif - #endif // NEWPANEL - -#endif // HAS_WIRED_LCD - -// -// SD Support -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#if SD_CONNECTION_IS(ONBOARD) - #undef SDSS - #define SDSS 83 - #undef SD_DETECT_PIN - #define SD_DETECT_PIN 95 -#endif diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h deleted file mode 100644 index 74692a21a3..0000000000 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ /dev/null @@ -1,265 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Anet V1.0 board pin assignments - */ - -/** - * Rev B 16 JUN 2017 - * - * 1) no longer uses Sanguino files to define some of the pins - * 2) added pointers to useable Arduino IDE extensions - */ - -/** - * The standard Arduino IDE extension (board manager) for this board - * is located at https://github.com/SkyNet3D/anet-board. - * - * Installation instructions are on that page. - * - * After copying the files to the appropriate location, restart Arduino and - * you'll see "Anet V1.0" and "Anet V1.0 (Optiboot)" in the boards list. - * - * "Anet V1.0" uses the bootloader that was installed on the board when - * it shipped from the factory. - * - * "Anet V1.0 (Optiboot)" frees up another 3K of FLASH. You'll need to burn - * a new bootloader to the board to be able to automatically download a - * compiled image. - */ - -/** - * Another usable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -/** - * To burn a new bootloader: - * - * 1. Connect your programmer to the board. - * 2. In the Arduino IDE select the board and then select the programmer. - * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. - * 4. The programmer is no longer needed. Remove it. - */ - -/** - * Additional info: - * - * Anet Schematics - https://github.com/ralf-e/ANET-3D-Board-V1.0 - * Wiring RRDFG Smart Controller - https://www.thingiverse.com/thing:2103748 - * SkyNet3D Anet software development - https://github.com/SkyNet3D/Marlin/ - * Anet Users / Skynet SW on Facebook - https://www.facebook.com/skynet3ddevelopment/ - * - * Many thanks to Hans Raaf (@oderwat) for developing the Anet-specific software and supporting the Anet community. - */ - -#if NOT_TARGET(__AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega1284P' in 'Tools > Processor.' (For PlatformIO, use 'melzi' or 'melzi_optiboot.')" -#endif - -#define BOARD_INFO_NAME "Anet 1.0" - -// -// Limit Switches -// -#define X_STOP_PIN 18 -#define Y_STOP_PIN 19 -#define Z_STOP_PIN 20 - -// -// Steppers -// -#define X_STEP_PIN 15 -#define X_DIR_PIN 21 -#define X_ENABLE_PIN 14 - -#define Y_STEP_PIN 22 -#define Y_DIR_PIN 23 -#define Y_ENABLE_PIN 14 - -#define Z_STEP_PIN 3 -#define Z_DIR_PIN 2 -#define Z_ENABLE_PIN 26 - -#define E0_STEP_PIN 1 -#define E0_DIR_PIN 0 -#define E0_ENABLE_PIN 14 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 7 // Analog Input (pin 33 extruder) -#define TEMP_BED_PIN 6 // Analog Input (pin 34 bed) - -// -// Heaters / Fans -// -#define HEATER_0_PIN 13 // (extruder) -#define HEATER_BED_PIN 12 // (bed) - -#ifndef FAN_PIN - #define FAN_PIN 4 -#endif - -// -// Misc. Functions -// -#define SDSS 31 -#define LED_PIN -1 - -/** - * LCD / Controller - * - * Only the following displays are supported: - * ZONESTAR_LCD - * ANET_FULL_GRAPHICS_LCD - * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - */ - -#if HAS_WIRED_LCD - #define LCD_SDSS 28 - #if ENABLED(ADC_KEYPAD) - #define SERVO0_PIN 27 // free for BLTouch/3D-Touch - #define LCD_PINS_RS 28 - #define LCD_PINS_ENABLE 29 - #define LCD_PINS_D4 10 - #define LCD_PINS_D5 11 - #define LCD_PINS_D6 16 - #define LCD_PINS_D7 17 - #define ADC_KEYPAD_PIN 1 - #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics - // display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb - // See below for alternative pin definitions for use with https://www.thingiverse.com/thing:2103748 - #define SERVO0_PIN 29 // free for BLTouch/3D-Touch - #define BEEPER_PIN 17 - #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 28 - #define LCD_PINS_D4 30 - #define BTN_EN1 11 - #define BTN_EN2 10 - #define BTN_ENC 16 - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) - #define BOARD_ST7920_DELAY_2 DELAY_NS(63) - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #define STD_ENCODER_PULSES_PER_STEP 4 - #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 - #endif -#else - #define SERVO0_PIN 27 -#endif - -/** - * ==================================================================== - * =============== Alternative RepRapDiscount Wiring ================== - * ==================================================================== - * - * An alternative wiring scheme for the RepRapDiscount Full Graphics Display is - * published by oderwat on Thingiverse at https://www.thingiverse.com/thing:2103748. - * - * Using that adapter requires changing the pin definition as follows: - * #define SERVO0_PIN 27 // free for BLTouch/3D-Touch - * #define BEEPER_PIN 28 - * #define LCD_PINS_RS 30 - * #define LCD_PINS_ENABLE 29 - * #define LCD_PINS_D4 17 - * - * The BLTouch pin becomes LCD:3 - */ - -/** - * ==================================================================== - * ===================== LCD PINOUTS ================================== - * ==================================================================== - * - * Anet V1.0 controller | ZONESTAR_LCD | ANET_FULL_ | RepRapDiscount Full | Thingiverse RepRap wiring - * physical logical alt | | GRAPHICS_LCD | Graphics Display Wiring | https://www.thingiverse - * pin pin functions | | | | .com/thing:2103748 - *------------------------------------------------------------------------------------------------------------------------ - * ANET-J3.1 8 *** | N/A | J3_TX *** | | - * ANET-J3.2 9 *** | N/A | J3_RX *** | | - * ANET-J3.3 6 MISO | N/A | MISO *** | EXP2.1 MISO | EXP2.1 MISO - * ANET-J3.4 +5V | N/A | +5V | | - * ANET-J3.5 7 SCK | N/A | SCK *** | EXP2.2 SCK | EXP2.2 SCK - * ANET-J3.6 5 MOSI | N/A | MOSI *** | EXP2.6 MOSI | EXP2.6 MOSI - * ANET-J3.7 !RESET | N/A | button | EXP2.8 panel button | EXP2.8 panel button - * ANET-J3.8 GND | N/A | GND | EXP2.9 GND | EXP2.9 GND - * ANET-J3.9 4 Don't use | N/A | N/C | | - * ANET-J3.10 +3.3V | N/A | +3.3V *** | | - * | | | | - * | | | | - * ANET-LCD.1 GND | GND | GND | EXP1.9 GND | EXP1.9 GND - * ANET-LCD.2 +5V | +5V | +5V | EXP1.10 +5V | EXP1.10 +5V - * ANET-LCD.3 27 A4 | N/C * | LCD_PINS_RS | EXP1.4 LCD_PINS_RS | EXP2.4 SDSS or N/C * - * ANET-LCD.4 10 | LCD_PINS_D4 | BTN_EN2 | EXP2.3 BTN_EN2 | EXP2.3 BTN_EN2 - * ANET-LCD.5 28 A3 | LCD_PINS_RS | LCD_PINS_ENABLE | EXP1.3 LCD_PINS_ENABLE | EXP1.1 BEEPER_PIN - * ANET-LCD.6 11 | LCD_PINS_D5 | BTN_EN1 | EXP2.5 BTN_EN1 | EXP2.5 BTN_EN1 - * ANET-LCD.7 29 A2 | LCD_PINS_ENABLE | N/C * | EXP2.4 SDSS or N/C * | EXP1.3 LCD_PINS_ENABLE - * ANET-LCD.8 16 SCL | LCD_PINS_D6 | BTN_ENC | EXP1.2 BTN_ENC | EXP1.2 BTN_ENC - * ANET-LCD.9 30 A1 | ADC_KEYPAD_PIN ** | LCD_PINS_D4 | EXP1.5 LCD_PINS_D4 | EXP1.4 LCD_PINS_RS - * ANET-LCD.10 17 SDA | LCD_PINS_D7 | BEEPER_PIN | EXP1.1 BEEPER_PIN | EXP1.5 LCD_PINS_D4 - * - * N/C * - if not connected to the LCD can be used for BLTouch servo input - * ** - analog pin -WITHOUT a pullup - * *** - only connected to something if the Bluetooth module is populated - */ - -/** - * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - * physical pin function - * EXP1.1 BEEPER - * EXP1.2 BTN_ENC - * EXP1.3 LCD_PINS_ENABLE - * EXP1.4 LCD_PINS_RS - * EXP1.5 LCD_PINS_D4 - * EXP1.6 LCD_PINS_D5 (not used) - * EXP1.7 LCD_PINS_D6 (not used) - * EXP1.8 LCD_PINS_D7 (not used) - * EXP1.9 GND - * EXP1.10 VCC - * - * - * EXP2.1 MISO - * EXP2.2 SCK - * EXP2.3 BTN_EN2 - * EXP2.4 SDSS - * EXP2.5 BTN_EN1 - * EXP2.6 MOSI - * EXP2.7 SD_DETECT_PIN - * EXP2.8 button - * EXP2.9 GND - * EXP2.10 NC - */ diff --git a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h deleted file mode 100644 index 29905c1089..0000000000 --- a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Gen3 Monolithic Electronics pin assignments - */ - -/** - * Rev B 26 DEC 2016 - * - * added pointer to a current Arduino IDE extension - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644P__) - #error "Oops! Select 'Sanguino' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Gen3 Monolithic" -#define DEBUG_PIN 0 - -// -// Limit Switches -// -#define X_STOP_PIN 20 -#define Y_STOP_PIN 25 -#define Z_STOP_PIN 30 - -// -// Steppers -// -#define X_STEP_PIN 15 -#define X_DIR_PIN 18 -#define X_ENABLE_PIN 24 // actually uses Y_enable_pin - -#define Y_STEP_PIN 23 -#define Y_DIR_PIN 22 -#define Y_ENABLE_PIN 24 // shared with X_enable_pin - -#define Z_STEP_PIN 27 -#define Z_DIR_PIN 28 -#define Z_ENABLE_PIN 29 - -#define E0_STEP_PIN 12 -#define E0_DIR_PIN 17 -#define E0_ENABLE_PIN 3 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input - -// -// Heaters -// -#define HEATER_0_PIN 16 - -// -// Misc. Functions -// -#define PS_ON_PIN 14 // Alex, does this work on the card? - -// Alex extras from Gen3+ diff --git a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h deleted file mode 100644 index 33fc233f7a..0000000000 --- a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Gen3+ pin assignments - */ - -/** - * Rev B 26 DEC 2016 - * - * added pointer to a current Arduino IDE extension - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the SANGUINO board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif - -#define BOARD_INFO_NAME "Gen3+" - -// -// Limit Switches -// -#define X_STOP_PIN 20 -#define Y_STOP_PIN 25 -#define Z_STOP_PIN 30 - -// -// Steppers -// -#define X_STEP_PIN 15 -#define X_DIR_PIN 18 -#define X_ENABLE_PIN 19 - -#define Y_STEP_PIN 23 -#define Y_DIR_PIN 22 -#define Y_ENABLE_PIN 24 - -#define Z_STEP_PIN 27 -#define Z_DIR_PIN 28 -#define Z_ENABLE_PIN 29 - -#define E0_STEP_PIN 17 -#define E0_DIR_PIN 21 -#define E0_ENABLE_PIN 13 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input (pin 33 extruder) -#define TEMP_BED_PIN 5 // Analog Input (pin 34 bed) - -// -// Heaters -// -#define HEATER_0_PIN 12 -#define HEATER_BED_PIN 16 - -// -// Misc. Functions -// -#define SDSS 4 -#define PS_ON_PIN 14 diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h deleted file mode 100644 index bfca8e90d9..0000000000 --- a/Marlin/src/pins/sanguino/pins_GEN6.h +++ /dev/null @@ -1,121 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Gen6 pin assignments - */ - - /** - * Rev B 26 DEC 2016 - * - * 1) added pointer to a current Arduino IDE extension - * 2) added support for M3, M4 & M5 spindle control commands - * 3) added case light pin definition - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Gen6" -#endif - -// -// Limit Switches -// -#define X_STOP_PIN 20 -#define Y_STOP_PIN 25 -#define Z_STOP_PIN 30 - -// -// Steppers -// -#define X_STEP_PIN 15 -#define X_DIR_PIN 18 -#define X_ENABLE_PIN 19 - -#define Y_STEP_PIN 23 -#define Y_DIR_PIN 22 -#define Y_ENABLE_PIN 24 - -#define Z_STEP_PIN 27 -#define Z_DIR_PIN 28 -#define Z_ENABLE_PIN 29 - -#define E0_STEP_PIN 4 // Edited @ EJE Electronics 20100715 -#define E0_DIR_PIN 2 // Edited @ EJE Electronics 20100715 -#define E0_ENABLE_PIN 3 // Added @ EJE Electronics 20100715 - -// -// Temperature Sensor -// -#define TEMP_0_PIN 5 // Analog Input - -// -// Heaters -// -#define HEATER_0_PIN 14 // changed @ rkoeppl 20110410 - -#if !MB(GEN6) - #define HEATER_BED_PIN 1 // changed @ rkoeppl 20110410 - #define TEMP_BED_PIN 0 // Analog Input -#endif - -// -// Misc. Functions -// -#define SDSS 17 -#define DEBUG_PIN 0 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 16 // Hardware PWM -#endif - -// RS485 pins -#define TX_ENABLE_PIN 12 -#define RX_ENABLE_PIN 13 - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_ENA_PIN 5 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM -#define SPINDLE_DIR_PIN 6 diff --git a/Marlin/src/pins/sanguino/pins_GEN7_12.h b/Marlin/src/pins/sanguino/pins_GEN7_12.h deleted file mode 100644 index 9db7d7214a..0000000000 --- a/Marlin/src/pins/sanguino/pins_GEN7_12.h +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Gen7 v1.1, v1.2, v1.3 pin assignments - */ - - /** - * Rev B 26 DEC 2016 - * - * 1) added pointer to a current Arduino IDE extension - * 2) added support for M3, M4 & M5 spindle control commands - * 3) added case light pin definition - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Gen7 v1.1 / 1.2" -#endif - -#ifndef GEN7_VERSION - #define GEN7_VERSION 12 // v1.x -#endif - -// -// Limit Switches -// -#define X_MIN_PIN 7 -#define Y_MIN_PIN 5 -#define Z_MIN_PIN 1 -#define Z_MAX_PIN 0 -#define Y_MAX_PIN 2 -#define X_MAX_PIN 6 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 0 -#endif - -// -// Steppers -// -#define X_STEP_PIN 19 -#define X_DIR_PIN 18 -#define X_ENABLE_PIN 24 - -#define Y_STEP_PIN 23 -#define Y_DIR_PIN 22 -#define Y_ENABLE_PIN 24 - -#define Z_STEP_PIN 26 -#define Z_DIR_PIN 25 -#define Z_ENABLE_PIN 24 - -#define E0_STEP_PIN 28 -#define E0_DIR_PIN 27 -#define E0_ENABLE_PIN 24 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 4 -#define HEATER_BED_PIN 3 - -#if !defined(FAN_PIN) && GEN7_VERSION < 13 // Gen7 v1.3 removed the fan pin - #define FAN_PIN 31 -#endif - -// -// Misc. Functions -// -#define PS_ON_PIN 15 - -#if GEN7_VERSION < 13 - #define CASE_LIGHT_PIN 16 // Hardware PWM -#else // Gen7 v1.3 removed the I2C connector & signals so need to get PWM off the PC power supply header - #define CASE_LIGHT_PIN 15 // Hardware PWM -#endif - -// All these generations of Gen7 supply thermistor power -// via PS_ON, so ignore bad thermistor readings -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -#define DEBUG_PIN 0 - -// RS485 pins -#define TX_ENABLE_PIN 12 -#define RX_ENABLE_PIN 13 - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_ENA_PIN 10 // Pullup or pulldown! -#define SPINDLE_DIR_PIN 11 -#if GEN7_VERSION < 13 - #define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM -#else // Gen7 v1.3 removed the I2C connector & signals so need to get PWM off the PC power supply header - #define SPINDLE_LASER_PWM_PIN 15 // Hardware PWM -#endif diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h deleted file mode 100644 index 66dba533e9..0000000000 --- a/Marlin/src/pins/sanguino/pins_GEN7_14.h +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Gen7 v1.4 pin assignments - */ - -/** - * Rev B 26 DEC 2016 - * - * 1) added pointer to a current Arduino IDE extension - * 2) added support for M3, M4 & M5 spindle control commands - * 3) added case light pin definition - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif - -#define BOARD_INFO_NAME "Gen7 v1.4" - -#define GEN7_VERSION 14 // v1.4 - -// -// Limit switches -// -#define X_STOP_PIN 0 -#define Y_STOP_PIN 1 -#define Z_STOP_PIN 2 - -// -// Steppers -// -#define X_STEP_PIN 29 -#define X_DIR_PIN 28 -#define X_ENABLE_PIN 25 - -#define Y_STEP_PIN 27 -#define Y_DIR_PIN 26 -#define Y_ENABLE_PIN 25 - -#define Z_STEP_PIN 23 -#define Z_DIR_PIN 22 -#define Z_ENABLE_PIN 25 - -#define E0_STEP_PIN 19 -#define E0_DIR_PIN 18 -#define E0_ENABLE_PIN 25 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // Analog Input -#define TEMP_BED_PIN 0 // Analog Input - -// -// Heaters -// -#define HEATER_0_PIN 4 -#define HEATER_BED_PIN 3 - -// -// Misc. Functions -// -#define PS_ON_PIN 15 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 15 // Hardware PWM -#endif - -// A pin for debugging -#define DEBUG_PIN 0 - -// RS485 pins -#define TX_ENABLE_PIN 12 -#define RX_ENABLE_PIN 13 - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_ENA_PIN 20 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM -#define SPINDLE_DIR_PIN 21 diff --git a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h deleted file mode 100644 index 0c4871fb27..0000000000 --- a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Gen7 Alfons3 board pin assignments - * - * These Pins are assigned for the modified GEN7 Board from Alfons3. - * Please review the pins and adjust them for your needs. - */ - -/** - * Rev B 26 DEC 2016 - * - * 1) added pointer to a current Arduino IDE extension - * 2) added support for M3, M4 & M5 spindle control commands - * 3) added case light pin definition - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif - -#define BOARD_INFO_NAME "Gen7 Custom" - -// -// Limit Switches -// -#define X_STOP_PIN 0 -#define Y_STOP_PIN 1 -#define Z_STOP_PIN 2 - -// -// Steppers -// -#define X_STEP_PIN 21 // different from standard GEN7 -#define X_DIR_PIN 20 // different from standard GEN7 -#define X_ENABLE_PIN 24 - -#define Y_STEP_PIN 23 -#define Y_DIR_PIN 22 -#define Y_ENABLE_PIN 24 - -#define Z_STEP_PIN 26 -#define Z_DIR_PIN 25 -#define Z_ENABLE_PIN 24 - -#define E0_STEP_PIN 28 -#define E0_DIR_PIN 27 -#define E0_ENABLE_PIN 24 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 2 // Analog Input -#define TEMP_BED_PIN 1 // Analog Input (pin 34 bed) - -// -// Heaters -// -#define HEATER_0_PIN 4 -#define HEATER_BED_PIN 3 // (bed) - -// -// Misc. Functions -// -#define SDSS 31 // SCL pin of I2C header || CS Pin for SD Card support -#define PS_ON_PIN 19 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 15 // Hardware PWM -#endif - -// A pin for debugging -#define DEBUG_PIN -1 - -// -// LCD / Controller -// -#define BEEPER_PIN -1 - -// 4bit LCD Support -#define LCD_PINS_RS 18 -#define LCD_PINS_ENABLE 17 -#define LCD_PINS_D4 16 -#define LCD_PINS_D5 15 -#define LCD_PINS_D6 13 -#define LCD_PINS_D7 14 - -// Buttons are directly attached -#define BTN_EN1 11 -#define BTN_EN2 10 -#define BTN_ENC 12 - -// RS485 pins -//#define TX_ENABLE_PIN 12 -//#define RX_ENABLE_PIN 13 - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_ENA_PIN 5 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM -#define SPINDLE_DIR_PIN 6 diff --git a/Marlin/src/pins/sanguino/pins_MELZI.h b/Marlin/src/pins/sanguino/pins_MELZI.h deleted file mode 100644 index 887aae1858..0000000000 --- a/Marlin/src/pins/sanguino/pins_MELZI.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Melzi pin assignments - */ - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Melzi" -#endif - -#include "pins_SANGUINOLOLU_12.h" diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h deleted file mode 100644 index 9f406c1f78..0000000000 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Melzi (Creality) pin assignments - * - * The Creality board needs a bootloader installed before Marlin can be uploaded. - * If you don't have a chip programmer you can use a spare Arduino plus a few - * electronic components to write the bootloader. - * - * See https://www.instructables.com/id/Burn-Arduino-Bootloader-with-Arduino-MEGA/ - * - * Schematic: https://bit.ly/2XOnsWb - */ - -#define BOARD_INFO_NAME "Melzi (Creality)" - -// Alter timing for graphical display -#if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif -#endif - -#include "pins_MELZI.h" - -// -// For the stock CR-10 enable CR10_STOCKDISPLAY in Configuration.h -// -#undef LCD_SDSS -#undef LED_PIN -#undef LCD_PINS_RS -#undef LCD_PINS_ENABLE -#undef LCD_PINS_D4 -#undef LCD_PINS_D5 -#undef LCD_PINS_D6 -#undef LCD_PINS_D7 - -#define LCD_SDSS 31 // Smart Controller SD card reader (rather than the Melzi) -#define LCD_PINS_RS 28 // ST9720 CS -#define LCD_PINS_ENABLE 17 // ST9720 DAT -#define LCD_PINS_D4 30 // ST9720 CLK - -#if ENABLED(BLTOUCH) - #define SERVO0_PIN 27 - #undef BEEPER_PIN -#elif ENABLED(FILAMENT_RUNOUT_SENSOR) - #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 27 - #endif - #if FIL_RUNOUT_PIN == BEEPER_PIN - #undef BEEPER_PIN - #endif -#endif - -#if ENABLED(MINIPANEL) - #undef DOGLCD_CS - #define DOGLCD_CS LCD_PINS_RS -#endif - -/** - PIN: 0 Port: B0 E0_DIR_PIN protected - PIN: 1 Port: B1 E0_STEP_PIN protected - PIN: 2 Port: B2 Z_DIR_PIN protected - PIN: 3 Port: B3 Z_STEP_PIN protected - PIN: 4 Port: B4 AVR_SS_PIN protected - . FAN_PIN protected - . SS_PIN protected - PIN: 5 Port: B5 AVR_MOSI_PIN Output = 1 - . MOSI_PIN Output = 1 - PIN: 6 Port: B6 AVR_MISO_PIN Input = 0 TIMER3A PWM: 0 WGM: 1 COM3A: 0 CS: 3 TCCR3A: 1 TCCR3B: 3 TIMSK3: 0 - . MISO_PIN Input = 0 - PIN: 7 Port: B7 AVR_SCK_PIN Output = 0 TIMER3B PWM: 0 WGM: 1 COM3B: 0 CS: 3 TCCR3A: 1 TCCR3B: 3 TIMSK3: 0 - . SCK_PIN Output = 0 - PIN: 8 Port: D0 RXD Input = 1 - PIN: 9 Port: D1 TXD Input = 0 - PIN: 10 Port: D2 BTN_EN2 Input = 1 - PIN: 11 Port: D3 BTN_EN1 Input = 1 - PIN: 12 Port: D4 HEATER_BED_PIN protected - PIN: 13 Port: D5 HEATER_0_PIN protected - PIN: 14 Port: D6 E0_ENABLE_PIN protected - . X_ENABLE_PIN protected - . Y_ENABLE_PIN protected - PIN: 15 Port: D7 X_STEP_PIN protected - PIN: 16 Port: C0 BTN_ENC Input = 1 - . SCL Input = 1 - PIN: 17 Port: C1 LCD_PINS_ENABLE Output = 0 - . SDA Output = 0 - PIN: 18 Port: C2 X_MIN_PIN protected - . X_STOP_PIN protected - PIN: 19 Port: C3 Y_MIN_PIN protected - . Y_STOP_PIN protected - PIN: 20 Port: C4 Z_MIN_PIN protected - . Z_STOP_PIN protected - PIN: 21 Port: C5 X_DIR_PIN protected - PIN: 22 Port: C6 Y_STEP_PIN protected - PIN: 23 Port: C7 Y_DIR_PIN protected - PIN: 24 Port: A7 TEMP_0_PIN protected - PIN: 25 Port: A6 TEMP_BED_PIN protected - PIN: 26 Port: A5 Z_ENABLE_PIN protected - PIN: 27 Port: A4 BEEPER_PIN Output = 0 - PIN: 28 Port: A3 LCD_PINS_RS Output = 0 - PIN: 29 Port: A2 Input = 0 - PIN: 30 Port: A1 LCD_PINS_D4 Output = 1 - PIN: 31 Port: A0 SDSS Output = 1 -*/ - -/** - * EXP1 Connector EXP1 as CR10 STOCKDISPLAY - * _____ _____ - * PA4 | 6 5 | PC0 BEEPER_PIN | 6 5 | BTN_ENC - * PD3 | 7 4 | RESET BTN_EN1 | 7 4 | RESET - * PD2 8 3 | PA1 BTN_EN2 8 3 | LCD_PINS_D4 (ST9720 CLK) - * PA3 | 9 2 | PC1 (ST9720 CS) LCD_PINS_RS | 9 2 | LCD_PINS_ENABLE (ST9720 DAT) - * GND |10 1 | 5V GND |10 1 | 5V - * ----- ----- - */ diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h deleted file mode 100644 index 5014620c6b..0000000000 --- a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Melzi (Malyan M150) pin assignments - */ - -#define BOARD_INFO_NAME "Melzi (Malyan)" - -// Alter timing for graphical display -#if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif -#endif - -#include "pins_MELZI.h" - -#undef LCD_SDSS -#undef LCD_PINS_RS -#undef LCD_PINS_ENABLE -#undef LCD_PINS_D4 -#undef BTN_EN1 -#undef BTN_EN2 -#undef BTN_ENC - -#define LCD_PINS_RS 17 // ST9720 CS -#define LCD_PINS_ENABLE 16 // ST9720 DAT -#define LCD_PINS_D4 11 // ST9720 CLK -#define BTN_EN1 30 -#define BTN_EN2 29 -#define BTN_ENC 28 diff --git a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h deleted file mode 100644 index f878941037..0000000000 --- a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Melzi pin assignments - */ - -#define BOARD_INFO_NAME "Melzi (Tronxy)" - -#if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(0) - #endif -#endif - -#include "pins_MELZI.h" - -#undef Z_ENABLE_PIN -#undef LCD_PINS_RS -#undef LCD_PINS_ENABLE -#undef LCD_PINS_D4 -#undef LCD_PINS_D5 -#undef LCD_PINS_D6 -#undef LCD_PINS_D7 -#undef BTN_EN1 -#undef BTN_EN2 -#undef BTN_ENC -#undef LCD_SDSS - -#define Z_ENABLE_PIN 14 -#define LCD_PINS_RS 30 -#define LCD_PINS_ENABLE 28 -#define LCD_PINS_D4 16 -#define LCD_PINS_D5 17 -#define LCD_PINS_D6 27 -#define LCD_PINS_D7 29 -#define BTN_EN1 10 -#define BTN_EN2 11 -#define BTN_ENC 26 diff --git a/Marlin/src/pins/sanguino/pins_MELZI_V2.h b/Marlin/src/pins/sanguino/pins_MELZI_V2.h deleted file mode 100644 index 275498d558..0000000000 --- a/Marlin/src/pins/sanguino/pins_MELZI_V2.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Melzi V2.0 as found at https://www.reprap.org/wiki/Melzi - */ - -#define BOARD_INFO_NAME "Melzi V2" - -#if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(188) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(0) - #endif -#endif - -#include "pins_MELZI.h" diff --git a/Marlin/src/pins/sanguino/pins_OMCA.h b/Marlin/src/pins/sanguino/pins_OMCA.h deleted file mode 100644 index 7f18283d1c..0000000000 --- a/Marlin/src/pins/sanguino/pins_OMCA.h +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Open Motion controller with enable based extruders (Final!) - * - * ATmega644 - * - * +---\/---+ - * (D 0) PB0 1| |40 PA0 (AI 0 / D31) - * (D 1) PB1 2| |39 PA1 (AI 1 / D30) - * INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29) - * PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28) - * PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27) - * MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26) - * MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25) - * SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24) - * RST 9| |32 AREF - * VCC 10| |31 GND - * GND 11| |30 AVCC - * XTAL2 12| |29 PC7 (D 23) - * XTAL1 13| |28 PC6 (D 22) - * RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI - * TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO - * INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS - * INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK - * PWM (D 12) PD4 18| |23 PC1 (D 17) SDA - * PWM (D 13) PD5 19| |22 PC0 (D 16) SCL - * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM - * +--------+ - * - * REF http://sanguino.wikidot.com/hardware - */ - -/** - * Rev B 26 DEC 2016 - * - * added pointer to a current Arduino IDE extension - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at http://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__) - #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega644' or 'ATmega644P' in 'Tools > Processor.'" -#endif - -#define BOARD_INFO_NAME "Final OMCA" - -// -// Limit Switches -// -#define X_STOP_PIN 0 -#define Y_STOP_PIN 1 -#define Z_STOP_PIN 2 - -// -// Steppers -// -#define X_STEP_PIN 26 -#define X_DIR_PIN 25 -#define X_ENABLE_PIN 10 - -#define Y_STEP_PIN 28 -#define Y_DIR_PIN 27 -#define Y_ENABLE_PIN 10 - -#define Z_STEP_PIN 23 -#define Z_DIR_PIN 22 -#define Z_ENABLE_PIN 10 - -#define E0_STEP_PIN 24 -#define E0_DIR_PIN 21 -#define E0_ENABLE_PIN 10 - -#define E1_STEP_PIN -1 // 21 -#define E1_DIR_PIN -1 // 20 -#define E1_ENABLE_PIN -1 // 19 - -#define E2_STEP_PIN -1 // 21 -#define E2_DIR_PIN -1 // 20 -#define E2_ENABLE_PIN -1 // 18 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input (1,2 or I2C) - -// -// Heaters / Fans -// -#define HEATER_0_PIN 3 // DONE PWM on RIGHT connector -#define HEATER_BED_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 14 // PWM on MIDDLE connector -#endif - -// -// Misc. Functions -// -#define SDSS 11 - -#define I2C_SCL_PIN 16 -#define I2C_SDA_PIN 17 - -// future proofing -#define __FS 20 -#define __FD 19 -#define __GS 18 -#define __GD 13 - -#define UNUSED_PWM 14 // PWM on LEFT connector diff --git a/Marlin/src/pins/sanguino/pins_OMCA_A.h b/Marlin/src/pins/sanguino/pins_OMCA_A.h deleted file mode 100644 index 7707320519..0000000000 --- a/Marlin/src/pins/sanguino/pins_OMCA_A.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Open Motion controller with enable based extruders (Alpha!) - * - * ATmega644 - * - * +---\/---+ - * (D 0) PB0 1| |40 PA0 (AI 0 / D31) - * (D 1) PB1 2| |39 PA1 (AI 1 / D30) - * INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29) - * PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28) - * PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27) - * MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26) - * MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25) - * SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24) - * RST 9| |32 AREF - * VCC 10| |31 GND - * GND 11| |30 AVCC - * XTAL2 12| |29 PC7 (D 23) - * XTAL1 13| |28 PC6 (D 22) - * RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI - * TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO - * INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS - * INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK - * PWM (D 12) PD4 18| |23 PC1 (D 17) SDA - * PWM (D 13) PD5 19| |22 PC0 (D 16) SCL - * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM - * +--------+ - */ - -/** - * Rev B 26 DEC 2016 - * - * added pointer to a current Arduino IDE extension - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644__) - #error "Oops! Select 'Sanguino' in 'Tools > Board' and ATmega644 in 'Tools > Processor.'" -#endif - -#define BOARD_INFO_NAME "Alpha OMCA" - -// -// Limit Switches -// -#define X_STOP_PIN 0 -#define Y_STOP_PIN 1 -#define Z_STOP_PIN 2 - -// -// Steppers -// -#define X_STEP_PIN 21 -#define X_DIR_PIN 20 -#define X_ENABLE_PIN 24 - -#define Y_STEP_PIN 23 -#define Y_DIR_PIN 22 -#define Y_ENABLE_PIN 24 - -#define Z_STEP_PIN 26 -#define Z_DIR_PIN 25 -#define Z_ENABLE_PIN 24 - -#define E0_STEP_PIN 28 -#define E0_DIR_PIN 27 -#define E0_ENABLE_PIN 24 - -#define E1_STEP_PIN -1 // 19 -#define E1_DIR_PIN -1 // 18 -#define E1_ENABLE_PIN 24 - -#define E2_STEP_PIN -1 // 17 -#define E2_DIR_PIN -1 // 16 -#define E2_ENABLE_PIN 24 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input (D27) - -// -// Heaters / Fans -// -#define HEATER_0_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 3 -#endif - -// -// Misc. Functions -// -#define SDSS 11 - -/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */ diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h deleted file mode 100644 index 438d49d615..0000000000 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ /dev/null @@ -1,342 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Sanguinololu board pin assignments - */ - -/** - * Rev B 26 DEC 2016 - * - * 1) added pointer to a current Arduino IDE extension - * 2) added support for M3, M4 & M5 spindle control commands - * 3) added case light pin definition - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Sanguinololu <1.2" -#endif - -// -// Limit Switches -// -#define X_STOP_PIN 18 -#define Y_STOP_PIN 19 -#define Z_STOP_PIN 20 - -// -// Steppers -// -#define X_STEP_PIN 15 -#define X_DIR_PIN 21 - -#define Y_STEP_PIN 22 -#define Y_DIR_PIN 23 - -#define Z_STEP_PIN 3 -#define Z_DIR_PIN 2 - -#define E0_STEP_PIN 1 -#define E0_DIR_PIN 0 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 7 // Analog Input (pin 33 extruder) -#define TEMP_BED_PIN 6 // Analog Input (pin 34 bed) - -// -// Heaters / Fans -// -#define HEATER_0_PIN 13 // (extruder) - -#if ENABLED(SANGUINOLOLU_V_1_2) - - #define HEATER_BED_PIN 12 // (bed) - #define X_ENABLE_PIN 14 - #define Y_ENABLE_PIN 14 - #define Z_ENABLE_PIN 26 - #define E0_ENABLE_PIN 14 - - #if !defined(FAN_PIN) && ENABLED(LCD_I2C_PANELOLU2) - #define FAN_PIN 4 // Uses Transistor1 (PWM) on Panelolu2's Sanguino Adapter Board to drive the fan - #endif - -#else - - #define HEATER_BED_PIN 14 // (bed) - #define X_ENABLE_PIN -1 - #define Y_ENABLE_PIN -1 - #define Z_ENABLE_PIN -1 - #define E0_ENABLE_PIN -1 - -#endif - -#if !defined(FAN_PIN) && (MB(AZTEEG_X1, STB_11) || IS_MELZI) - #define FAN_PIN 4 // Works for Panelolu2 too -#endif - -// -// Misc. Functions -// - -/** - * In some versions of the Sanguino libraries the pin - * definitions are wrong, with SDSS = 24 and LED_PIN = 28 (Melzi). - * If you encounter issues with these pins, upgrade your - * Sanguino libraries! See #368. - */ -//#define SDSS 24 -#define SDSS 31 - -#if IS_MELZI - #define LED_PIN 27 -#elif MB(STB_11) - #define LCD_BACKLIGHT_PIN 17 // LCD backlight LED -#endif - -#if NONE(SPINDLE_FEATURE, LASER_FEATURE) && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(ULTRA_LCD, NEWPANEL)// try to use IO Header - #define CASE_LIGHT_PIN 4 // Hardware PWM - see if IO Header is available -#endif - -/** - * Sanguinololu 1.4 AUX pins: - * - * PWM TX1 RX1 SDA SCL - * 12V 5V D12 D11 D10 D17 D16 - * GND GND D31 D30 D29 D28 D27 - * A4 A3 A2 A1 A0 - */ - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #define SD_DETECT_PIN -1 - - #if HAS_MARLINUI_U8GLIB - - #if ENABLED(LCD_FOR_MELZI) - - #define LCD_PINS_RS 17 - #define LCD_PINS_ENABLE 16 - #define LCD_PINS_D4 11 - - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(188) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(0) - #endif - - #elif ENABLED(U8GLIB_ST7920) // SPI GLCD 12864 ST7920 ( like [www.digole.com] ) For Melzi V2.0 - - #if IS_MELZI - #define LCD_PINS_RS 30 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 29 // SID (MOSI) - #define LCD_PINS_D4 17 // SCK (CLK) clock - // Pin 27 is taken by LED_PIN, but Melzi LED does nothing with - // Marlin so this can be used for BEEPER_PIN. You can use this pin - // with M42 instead of BEEPER_PIN. - #define BEEPER_PIN 27 - - #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(188) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(0) - #endif - #endif - - #else // Sanguinololu >=1.3 - #define LCD_PINS_RS 4 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 30 - #define LCD_PINS_D5 29 - #define LCD_PINS_D6 28 - #define LCD_PINS_D7 27 - #endif - - #else - - #define DOGLCD_A0 30 - - #if ENABLED(MAKRPANEL) - - #define BEEPER_PIN 29 - #define DOGLCD_CS 17 - #define LCD_BACKLIGHT_PIN 28 // PA3 - - #elif IS_MELZI - - #define BEEPER_PIN 27 - #define DOGLCD_CS 28 - - #else // !MAKRPANEL - - #define DOGLCD_CS 29 - - #endif - - #endif - - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_0 - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - #elif ENABLED(ZONESTAR_LCD) // For the Tronxy Melzi boards - - #define LCD_PINS_RS 28 - #define LCD_PINS_ENABLE 29 - #define LCD_PINS_D4 10 - #define LCD_PINS_D5 11 - #define LCD_PINS_D6 16 - #define LCD_PINS_D7 17 - - #else - - #define LCD_PINS_RS 4 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 30 - #define LCD_PINS_D5 29 - #define LCD_PINS_D6 28 - #define LCD_PINS_D7 27 - - #endif - - #if ENABLED(LCD_FOR_MELZI) - - #define BTN_ENC 28 - #define BTN_EN1 29 - #define BTN_EN2 30 - - #elif ENABLED(ZONESTAR_LCD) // For the Tronxy Melzi boards - - #define ADC_KEYPAD_PIN 1 - #define BTN_EN1 -1 - #define BTN_EN2 -1 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #if IS_MELZI - #define BTN_ENC 29 - #define LCD_SDSS 30 // Panelolu2 SD card reader rather than the Melzi - #else - #define BTN_ENC 30 - #endif - - #else // !LCD_FOR_MELZI && !ZONESTAR_LCD && !LCD_I2C_PANELOLU2 - - #define BTN_ENC 16 - #define LCD_SDSS 28 // Smart Controller SD card reader rather than the Melzi - - #endif - - #if ENABLED(NEWPANEL) && !defined(BTN_EN1) - #define BTN_EN1 11 - #define BTN_EN2 10 - #endif - -#endif // HAS_WIRED_LCD - -// -// M3/M4/M5 - Spindle/Laser Control -// -#if HAS_CUTTER - #if !MB(AZTEEG_X1) && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(ULTRA_LCD, NEWPANEL)// try to use IO Header - - #define SPINDLE_LASER_ENA_PIN 10 // Pullup or pulldown! - #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM - #define SPINDLE_DIR_PIN 11 - - #elif !MB(MELZI) // use X stepper motor socket - - /** - * To control the spindle speed and have an LCD you must sacrifice - * the Extruder and pull some signals off the X stepper driver socket. - * - * The following assumes: - * - The X stepper driver socket is empty - * - The extruder driver socket has a driver board plugged into it - * - The X stepper wires are attached the the extruder connector - */ - - /** - * Where to get the spindle signals - * - * spindle signal socket name socket name - * ------- - * /ENABLE O| |O VMOT - * MS1 O| |O GND - * MS2 O| |O 2B - * MS3 O| |O 2A - * /RESET O| |O 1A - * /SLEEP O| |O 1B - * SPINDLE_LASER_PWM_PIN STEP O| |O VDD - * SPINDLE_LASER_ENA_PIN DIR O| |O GND - * ------- - * - * Note: Socket names vary from vendor to vendor. - */ - #undef X_DIR_PIN - #undef X_ENABLE_PIN - #undef X_STEP_PIN - #define X_DIR_PIN 0 - #define X_ENABLE_PIN 14 - #define X_STEP_PIN 1 - #define SPINDLE_LASER_PWM_PIN 15 // Hardware PWM - #define SPINDLE_LASER_ENA_PIN 21 // Pullup! - #define SPINDLE_DIR_PIN -1 // No pin available on the socket for the direction pin - #endif -#endif diff --git a/Marlin/src/pins/sanguino/pins_SETHI.h b/Marlin/src/pins/sanguino/pins_SETHI.h deleted file mode 100644 index dc2133e441..0000000000 --- a/Marlin/src/pins/sanguino/pins_SETHI.h +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Sethi 3D_1 pin assignments - www.sethi3d.com.br - */ - -/** - * Rev B 26 DEC 2016 - * - * added pointer to a current Arduino IDE extension - * this assumes that this board uses the Sanguino pin map - */ - -/** - * A useable Arduino IDE extension (board manager) can be found at - * https://github.com/Lauszus/Sanguino - * - * This extension has been tested on Arduino 1.6.12 & 1.8.0 - * - * Here's the JSON path: - * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json - * - * When installing select 1.0.2 - * - * Installation instructions can be found at https://learn.sparkfun.com/pages/CustomBoardsArduino - * Just use the above JSON URL instead of Sparkfun's JSON. - * - * Once installed select the Sanguino board and then select the CPU. - */ - -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif - -#define BOARD_INFO_NAME "Sethi 3D_1" - -#ifndef GEN7_VERSION - #define GEN7_VERSION 12 // v1.x -#endif - -// -// Limit Switches -// -#define X_STOP_PIN 2 -#define Y_STOP_PIN 0 -#define Z_MIN_PIN 1 -#define Z_MAX_PIN 0 - -// -// Steppers -// -#define X_STEP_PIN 19 -#define X_DIR_PIN 18 -#define X_ENABLE_PIN 24 - -#define Y_STEP_PIN 23 -#define Y_DIR_PIN 22 -#define Y_ENABLE_PIN 24 - -#define Z_STEP_PIN 26 -#define Z_DIR_PIN 25 -#define Z_ENABLE_PIN 24 - -#define E0_STEP_PIN 28 -#define E0_DIR_PIN 27 -#define E0_ENABLE_PIN 24 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 4 -#define HEATER_BED_PIN 3 - -#ifndef FAN_PIN - #if GEN7_VERSION >= 13 - // Gen7 v1.3 removed the fan pin - #define FAN_PIN -1 - #else - #define FAN_PIN 31 - #endif -#endif - -// -// Misc. Functions -// -#define PS_ON_PIN 15 - -// All these generations of Gen7 supply thermistor power -// via PS_ON, so ignore bad thermistor readings -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// our pin for debugging. -#define DEBUG_PIN 0 - -// our RS485 pins -#define TX_ENABLE_PIN 12 -#define RX_ENABLE_PIN 13 diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h deleted file mode 100644 index 838ffe38aa..0000000000 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ /dev/null @@ -1,234 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif - -#define BOARD_INFO_NAME "Zonestar ZMIB_V2" -#define BOARD_WEBSITE_URL "https://www.aliexpress.com/item/32957490744.html" - -#define IS_ZMIB_V2 - -/** - * ZMIB pin assignments - * - * The ZMIB board needs a bootloader installed before Marlin can be uploaded. - * If you don't have a chip programmer you can use a spare Arduino plus a few - * electronic components to write the bootloader. - * - * See http://www.instructables.com/id/Burn-Arduino-Bootloader-with-Arduino-MEGA/ - */ - -/** - * PIN: 0 Port: B0 HEATER_0_PIN - * PIN: 1 Port: B1 HEATER_BED_PIN - * PIN: 2 Port: B2 EXP1_4(BTN_EN2) - * PIN: 3 Port: B3 V1: SD_DETECT_PIN - * PIN: 3 Port: B3 V2: EXP1_6 - * PIN: 4 Port: B4 SDSS - * PIN: 4 Port: B4 V1: EXP1_6 - * PIN: 5 Port: B5 AVR_MOSI_PIN - * . MOSI_PIN - * PIN: 6 Port: B6 AVR_MISO_PIN - * . EXP1_9(MISO_PIN) - * PIN: 7 Port: B7 AVR_SCK_PIN - * . EXP1_10(SCK_PIN) - * PIN: 8 Port: D0 RXD - * PIN: 9 Port: D1 TXD - * PIN: 10 Port: D2 EXP1_8 - * PIN: 11 Port: D3 EXP1_7 - * PIN: 12 Port: D4 EXP1_5(BTN_EN1) - * PIN: 13 Port: D5 Z_MIN_PIN - * PIN: 14 Port: D6 E1_DIR_PIN - * PIN: 15 Port: D7 E1_STEP_PIN - * PIN: 16 Port: C0 Z_DIR_PIN - * PIN: 17 Port: C1 Z_STEP_PIN - * PIN: 18 Port: C2 Y_MIN_PIN - * PIN: 19 Port: C3 Y_DIR_PIN - * PIN: 20 Port: C4 Y_STEP_PIN - * PIN: 21 Port: C5 X_MIN_PIN - * PIN: 22 Port: C6 X_DIR_PIN - * PIN: 23 Port: C7 X_STEP_PIN - * PIN: 24 Port: A7 X_ENABLE_PIN - * Y_ENABLE_PIN - * Z_ENABLE_PIN - * E0_ENABLE_PIN - * E1_ENABLE_PIN - * PIN: 25 Port: A6 FIL_RUNOUT_PIN - * PIN: 26 Port: A5 E0_DIR_PIN - * PIN: 27 Port: A4 E0_STEP_PIN - * PIN: 28 Port: A3 FAN_PIN - * PIN: 29 Port: A2 EXP1_3(BTN_ENC) - * ADC_KEY_PIN - * PIN: 30 Port: A1 TEMP_0_PIN - * PIN: 31 Port: A0 TEMP_BED_PIN - */ - -// -// Limit Switches -// -#define X_MIN_PIN 21 -#define Y_MIN_PIN 18 - -#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) - #define Z_MIN_PIN 25 -#else - #define Z_MIN_PIN 13 -#endif - -// -// Steppers -// -#define X_STEP_PIN 23 -#define X_DIR_PIN 22 -#define X_ENABLE_PIN 24 - -#define Y_STEP_PIN 20 -#define Y_DIR_PIN 19 -#define Y_ENABLE_PIN 24 - -#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) - #define Z_STEP_PIN 27 - #define Z_DIR_PIN 26 -#else - #define Z_STEP_PIN 17 - #define Z_DIR_PIN 16 -#endif - -#define Z_ENABLE_PIN 24 - -#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) - #define E0_STEP_PIN 15 - #define E0_DIR_PIN 14 -#else - #define E0_STEP_PIN 27 - #define E0_DIR_PIN 26 -#endif - -#define E0_ENABLE_PIN 24 - -#define E1_STEP_PIN 15 -#define E1_DIR_PIN 14 -#define E1_ENABLE_PIN 24 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // Analog Input -#define TEMP_BED_PIN 0 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 0 -#define HEATER_BED_PIN 1 -#define FAN_PIN 28 -#define FAN1_PIN -1 - -// -//filament run out sensor -// -#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) - #define FIL_RUNOUT_PIN 13 -#else - #define FIL_RUNOUT_PIN 25 // Z-MIN -#endif - -// -// SD card -// -#if ENABLED(SDSUPPORT) - #define SDSS 4 -#endif -#define SD_DETECT_PIN -1 - -/*=================================================== - * ZMIB Version 1 - EXP1 Connector - * MOSI(D5) TX1(D11) ENA(D12) ENC(D29/A2) 5V - * SCK(D7) RX1(D10) SCS(D4) ENB(D2) GND - *=================================================== - * ZMIB Version 2 - EXP1 Connector - * MOSI(D5) TX1(D11) ENA(D12) ENC(D29/A2) 5V - * SCK(D7) RX1(D10) SCS(D3) ENB(D2) GND - *=================================================== - * LCD 128x64 - *==================================================*/ - -#if ENABLED(ZONESTAR_12864LCD) - // - // LCD 128x64 - // - #define LCDSCREEN_NAME "ZONESTAR_12864LCD" - #define FORCE_SOFT_SPI - //#define LCD_SDSS 11 - #define LCD_PINS_RS 11 // ST7920_CS_PIN LCD_PIN_RS (PIN4 of LCD module) - #ifdef IS_ZMIB_V2 - #define LCD_PINS_ENABLE 3 // ST7920_DAT_PIN LCD_PIN_R/W (PIN5 of LCD module) - #else - #define LCD_PINS_ENABLE 4 // ST7920_DAT_PIN LCD_PIN_R/W (PIN5 of LCD module) - #endif - #define LCD_PINS_D4 10 // ST7920_CLK_PIN LCD_PIN_ENABLE (PIN6 of LCD module) - - // Alter timing for graphical display - #define ST7920_DELAY_1 DELAY_2_NOP - #define ST7920_DELAY_2 DELAY_2_NOP - #define ST7920_DELAY_3 DELAY_2_NOP - -#elif EITHER(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) - // - // OLED 128x64 - // - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" - #define FORCE_SOFT_SPI - #ifdef IS_ZMIB_V2 - #define LCD_PINS_RS 3 // RESET - #else - #define LCD_PINS_RS 4 // RESET - #endif - #define LCD_PINS_DC 10 // DC - #define DOGLCD_CS 11 // CS - #if ENABLED(OLED_HW_IIC) - #error "Oops! can't choose HW IIC for ZMIB board!!" - #elif ENABLED(OLED_HW_SPI) - // HW SPI - #define DOGLCD_A0 LCD_PINS_DC // A0 = DC - #else - // SW SPI - #define DOGLCD_A0 LCD_PINS_DC // A0 = DC - #define DOGLCD_MOSI AVR_MOSI_PIN // SDA - #define DOGLCD_SCK AVR_SCK_PIN // SCK - #endif - -#endif - -// -// All the above are also RRDSC with rotary encoder -// -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - #define BTN_EN1 2 - #define BTN_EN2 12 - #define BTN_ENC 29 - #define BEEPER_PIN -1 - #define KILL_PIN -1 -#endif diff --git a/Marlin/src/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h deleted file mode 100644 index d7eb187245..0000000000 --- a/Marlin/src/pins/sensitive_pins.h +++ /dev/null @@ -1,689 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -// -// Prepare a list of protected pins for M42/M43 -// - -#if PIN_EXISTS(X_MIN) - #define _X_MIN X_MIN_PIN, -#else - #define _X_MIN -#endif -#if PIN_EXISTS(X_MAX) - #define _X_MAX X_MAX_PIN, -#else - #define _X_MAX -#endif -#if PIN_EXISTS(X_CS) && AXIS_HAS_SPI(X) - #define _X_CS X_CS_PIN, -#else - #define _X_CS -#endif -#if PIN_EXISTS(X_MS1) - #define _X_MS1 X_MS1_PIN, -#else - #define _X_MS1 -#endif -#if PIN_EXISTS(X_MS2) - #define _X_MS2 X_MS2_PIN, -#else - #define _X_MS2 -#endif -#if PIN_EXISTS(X_MS3) - #define _X_MS3 X_MS3_PIN, -#else - #define _X_MS3 -#endif - -#define _X_PINS X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, _X_MIN _X_MAX _X_MS1 _X_MS2 _X_MS3 _X_CS - -#if PIN_EXISTS(Y_MIN) - #define _Y_MIN Y_MIN_PIN, -#else - #define _Y_MIN -#endif -#if PIN_EXISTS(Y_MAX) - #define _Y_MAX Y_MAX_PIN, -#else - #define _Y_MAX -#endif -#if PIN_EXISTS(Y_CS) && AXIS_HAS_SPI(Y) - #define _Y_CS Y_CS_PIN, -#else - #define _Y_CS -#endif -#if PIN_EXISTS(Y_MS1) - #define _Y_MS1 Y_MS1_PIN, -#else - #define _Y_MS1 -#endif -#if PIN_EXISTS(Y_MS2) - #define _Y_MS2 Y_MS2_PIN, -#else - #define _Y_MS2 -#endif -#if PIN_EXISTS(Y_MS3) - #define _Y_MS3 Y_MS3_PIN, -#else - #define _Y_MS3 -#endif - -#define _Y_PINS Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, _Y_MIN _Y_MAX _Y_MS1 _Y_MS2 _Y_MS3 _Y_CS - -#if PIN_EXISTS(Z_MIN) - #define _Z_MIN Z_MIN_PIN, -#else - #define _Z_MIN -#endif -#if PIN_EXISTS(Z_MAX) - #define _Z_MAX Z_MAX_PIN, -#else - #define _Z_MAX -#endif -#if PIN_EXISTS(Z_CS) && AXIS_HAS_SPI(Z) - #define _Z_CS Z_CS_PIN, -#else - #define _Z_CS -#endif -#if PIN_EXISTS(Z_MS1) - #define _Z_MS1 Z_MS1_PIN, -#else - #define _Z_MS1 -#endif -#if PIN_EXISTS(Z_MS2) - #define _Z_MS2 Z_MS2_PIN, -#else - #define _Z_MS2 -#endif -#if PIN_EXISTS(Z_MS3) - #define _Z_MS3 Z_MS3_PIN, -#else - #define _Z_MS3 -#endif - -#define _Z_PINS Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, _Z_MIN _Z_MAX _Z_MS1 _Z_MS2 _Z_MS3 _Z_CS - -// -// Extruder Chip Select, Digital Micro-steps -// - -// Mixing stepper, Switching stepper, or regular stepper -#define E_NEEDED(N) (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > N) \ - || (ENABLED(SWITCHING_EXTRUDER) && E_STEPPERS > N) \ - || (NONE(SWITCHING_EXTRUDER, MIXING_EXTRUDER) && EXTRUDERS > N) - -#define _E0_CS -#define _E0_MS1 -#define _E0_MS2 -#define _E0_MS3 - -#if E_NEEDED(0) - #if PIN_EXISTS(E0_CS) && AXIS_HAS_SPI(E0) - #undef _E0_CS - #define _E0_CS E0_CS_PIN, - #endif - #if PIN_EXISTS(E0_MS1) - #undef _E0_MS1 - #define _E0_MS1 E0_MS1_PIN, - #endif - #if PIN_EXISTS(E0_MS2) - #undef _E0_MS2 - #define _E0_MS2 E0_MS2_PIN, - #endif - #if PIN_EXISTS(E0_MS3) - #undef _E0_MS3 - #define _E0_MS3 E0_MS3_PIN, - #endif -#endif - -#define _E1_CS -#define _E1_MS1 -#define _E1_MS2 -#define _E1_MS3 - -#if E_NEEDED(1) - #if PIN_EXISTS(E1_CS) && AXIS_HAS_SPI(E1) - #undef _E1_CS - #define _E1_CS E1_CS_PIN, - #endif - #if PIN_EXISTS(E1_MS1) - #undef _E1_MS1 - #define _E1_MS1 E1_MS1_PIN, - #endif - #if PIN_EXISTS(E1_MS2) - #undef _E1_MS2 - #define _E1_MS2 E1_MS2_PIN, - #endif - #if PIN_EXISTS(E1_MS3) - #undef _E1_MS3 - #define _E1_MS3 E1_MS3_PIN, - #endif -#endif - -#define _E2_CS -#define _E2_MS1 -#define _E2_MS2 -#define _E2_MS3 - -#if E_NEEDED(2) - #if PIN_EXISTS(E2_CS) && AXIS_HAS_SPI(E2) - #undef _E2_CS - #define _E2_CS E2_CS_PIN, - #endif - #if PIN_EXISTS(E2_MS1) - #undef _E2_MS1 - #define _E2_MS1 E2_MS1_PIN, - #endif - #if PIN_EXISTS(E2_MS2) - #undef _E2_MS2 - #define _E2_MS2 E2_MS2_PIN, - #endif - #if PIN_EXISTS(E2_MS3) - #undef _E2_MS3 - #define _E2_MS3 E2_MS3_PIN, - #endif -#endif - -#define _E3_CS -#define _E3_MS1 -#define _E3_MS2 -#define _E3_MS3 - -#if E_NEEDED(3) - #if PIN_EXISTS(E3_CS) && AXIS_HAS_SPI(E3) - #undef _E3_CS - #define _E3_CS E3_CS_PIN, - #endif - #if PIN_EXISTS(E3_MS1) - #undef _E3_MS1 - #define _E3_MS1 E3_MS1_PIN, - #endif - #if PIN_EXISTS(E3_MS2) - #undef _E3_MS2 - #define _E3_MS2 E3_MS2_PIN, - #endif - #if PIN_EXISTS(E3_MS3) - #undef _E3_MS3 - #define _E3_MS3 E3_MS3_PIN, - #endif -#endif - -#define _E4_CS -#define _E4_MS1 -#define _E4_MS2 -#define _E4_MS3 - -#if E_NEEDED(4) - #if PIN_EXISTS(E4_CS) && AXIS_HAS_SPI(E4) - #undef _E4_CS - #define _E4_CS E4_CS_PIN, - #endif - #if PIN_EXISTS(E4_MS1) - #undef _E4_MS1 - #define _E4_MS1 E4_MS1_PIN, - #endif - #if PIN_EXISTS(E4_MS2) - #undef _E4_MS2 - #define _E4_MS2 E4_MS2_PIN, - #endif - #if PIN_EXISTS(E4_MS3) - #undef _E4_MS3 - #define _E4_MS3 E4_MS3_PIN, - #endif -#endif - -#define _E5_CS -#define _E5_MS1 -#define _E5_MS2 -#define _E5_MS3 - -#if E_NEEDED(5) - #if PIN_EXISTS(E5_CS) && AXIS_HAS_SPI(E5) - #undef _E5_CS - #define _E5_CS E5_CS_PIN, - #endif - #if PIN_EXISTS(E5_MS1) - #undef _E5_MS1 - #define _E5_MS1 E5_MS1_PIN, - #endif - #if PIN_EXISTS(E5_MS2) - #undef _E5_MS2 - #define _E5_MS2 E5_MS2_PIN, - #endif - #if PIN_EXISTS(E5_MS3) - #undef _E5_MS3 - #define _E5_MS3 E5_MS3_PIN, - #endif -#endif - -#define _E6_CS -#define _E6_MS1 -#define _E6_MS2 -#define _E6_MS3 - -#if E_NEEDED(6) - #if PIN_EXISTS(E6_CS) && AXIS_HAS_SPI(E6) - #undef _E6_CS - #define _E6_CS E6_CS_PIN, - #endif - #if PIN_EXISTS(E6_MS2) - #undef _E6_MS2 - #define _E6_MS2 E6_MS2_PIN, - #endif - #if PIN_EXISTS(E6_MS3) - #undef _E6_MS3 - #define _E6_MS3 E6_MS3_PIN, - #endif - #if PIN_EXISTS(E6_MS4) - #undef _E6_MS4 - #define _E6_MS4 E6_MS4_PIN, - #endif -#endif - -#define _E7_CS -#define _E7_MS1 -#define _E7_MS2 -#define _E7_MS3 - -#if E_NEEDED(7) - #if PIN_EXISTS(E7_CS) && AXIS_HAS_SPI(E7) - #undef _E7_CS - #define _E7_CS E7_CS_PIN, - #endif - #if PIN_EXISTS(E7_MS3) - #undef _E7_MS3 - #define _E7_MS3 E7_MS3_PIN, - #endif - #if PIN_EXISTS(E7_MS4) - #undef _E7_MS4 - #define _E7_MS4 E7_MS4_PIN, - #endif - #if PIN_EXISTS(E7_MS5) - #undef _E7_MS5 - #define _E7_MS5 E7_MS5_PIN, - #endif -#endif - -// -// E Steppers -// - -#define _E0_PINS -#define _E1_PINS -#define _E2_PINS -#define _E3_PINS -#define _E4_PINS -#define _E5_PINS -#define _E6_PINS -#define _E7_PINS - -#if EXTRUDERS - #undef _E0_PINS - #define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, _E0_CS _E0_MS1 _E0_MS2 _E0_MS3 -#endif - -#if ENABLED(SWITCHING_EXTRUDER) - // Tools 0 and 1 use E0 - #if EXTRUDERS > 2 // Tools 2 and 3 use E1 - #undef _E1_PINS - #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, _E1_CS _E1_MS1 _E1_MS2 _E1_MS3 - #if EXTRUDERS > 4 // Tools 4 and 5 use E2 - #undef _E2_PINS - #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, _E2_CS _E2_MS1 _E2_MS2 _E2_MS3 - #endif - #endif - -#elif EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) - - #undef _E1_PINS - #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, _E1_CS _E1_MS1 _E1_MS2 _E1_MS3 - #if EXTRUDERS > 2 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 2) - #undef _E2_PINS - #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, _E2_CS _E2_MS1 _E2_MS2 _E2_MS3 - #if EXTRUDERS > 3 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 3) - #undef _E3_PINS - #define _E3_PINS E3_STEP_PIN, E3_DIR_PIN, E3_ENABLE_PIN, _E3_CS _E3_MS1 _E3_MS2 _E3_MS3 - #if EXTRUDERS > 4 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 4) - #undef _E4_PINS - #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, _E4_CS _E4_MS1 _E4_MS2 _E4_MS3 - #if EXTRUDERS > 5 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 5) - #undef _E5_PINS - #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, _E5_CS _E5_MS1 _E5_MS2 _E5_MS3 - #if EXTRUDERS > 6 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 6) - #undef _E6_PINS - #define _E6_PINS E6_STEP_PIN, E6_DIR_PIN, E6_ENABLE_PIN, _E6_CS _E6_MS1 _E6_MS2 _E6_MS3 - #if EXTRUDERS > 7 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 7) - #undef _E7_PINS - #define _E7_PINS E7_STEP_PIN, E7_DIR_PIN, E7_ENABLE_PIN, _E7_CS _E7_MS1 _E7_MS2 _E7_MS3 - #endif // EXTRUDERS > 7 || MIXING_EXTRUDER > 7 - #endif // EXTRUDERS > 6 || MIXING_EXTRUDER > 6 - #endif // EXTRUDERS > 5 || MIXING_EXTRUDER > 5 - #endif // EXTRUDERS > 4 || MIXING_EXTRUDER > 4 - #endif // EXTRUDERS > 3 || MIXING_EXTRUDER > 3 - #endif // EXTRUDERS > 2 || MIXING_EXTRUDER > 2 - -#endif // HAS_MULTI_EXTRUDER || MIXING_EXTRUDER - -// -// Heaters, Fans, Temp Sensors -// - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN -1 -#endif -#ifndef E1_AUTO_FAN_PIN - #define E1_AUTO_FAN_PIN -1 -#endif -#ifndef E2_AUTO_FAN_PIN - #define E2_AUTO_FAN_PIN -1 -#endif -#ifndef E3_AUTO_FAN_PIN - #define E3_AUTO_FAN_PIN -1 -#endif -#ifndef E4_AUTO_FAN_PIN - #define E4_AUTO_FAN_PIN -1 -#endif -#ifndef E5_AUTO_FAN_PIN - #define E5_AUTO_FAN_PIN -1 -#endif -#ifndef E6_AUTO_FAN_PIN - #define E6_AUTO_FAN_PIN -1 -#endif -#ifndef E7_AUTO_FAN_PIN - #define E7_AUTO_FAN_PIN -1 -#endif - -#define _H0_PINS -#define _H1_PINS -#define _H2_PINS -#define _H3_PINS -#define _H4_PINS -#define _H5_PINS -#define _H6_PINS -#define _H7_PINS - -#if HAS_HOTEND - #undef _H0_PINS - #define _H0_PINS HEATER_0_PIN, E0_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_0_PIN), - #if HAS_MULTI_HOTEND - #undef _H1_PINS - #define _H1_PINS HEATER_1_PIN, E1_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_1_PIN), - #if HOTENDS > 2 - #undef _H2_PINS - #define _H2_PINS HEATER_2_PIN, E2_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_2_PIN), - #if HOTENDS > 3 - #undef _H3_PINS - #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_3_PIN), - #if HOTENDS > 4 - #undef _H4_PINS - #define _H4_PINS HEATER_4_PIN, E4_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_4_PIN), - #if HOTENDS > 5 - #undef _H5_PINS - #define _H5_PINS HEATER_5_PIN, E5_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_5_PIN), - #if HOTENDS > 6 - #undef _H6_PINS - #define _H6_PINS HEATER_6_PIN, E6_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_6_PIN), - #if HOTENDS > 7 - #undef _H7_PINS - #define _H7_PINS HEATER_7_PIN, E7_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_7_PIN), - #endif // HOTENDS > 7 - #endif // HOTENDS > 6 - #endif // HOTENDS > 5 - #endif // HOTENDS > 4 - #endif // HOTENDS > 3 - #endif // HOTENDS > 2 - #endif // HAS_MULTI_HOTEND -#endif // HOTENDS - -// -// Dual X, Dual Y, Multi-Z -// Chip Select and Digital Micro-stepping -// - -#if EITHER(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) - #if PIN_EXISTS(X2_CS) && AXIS_HAS_SPI(X2) - #define _X2_CS X2_CS_PIN, - #else - #define _X2_CS - #endif - #if PIN_EXISTS(X2_MS1) - #define _X2_MS1 X2_MS1_PIN, - #else - #define _X2_MS1 - #endif - #if PIN_EXISTS(X2_MS2) - #define _X2_MS2 X2_MS2_PIN, - #else - #define _X2_MS2 - #endif - #if PIN_EXISTS(X2_MS3) - #define _X2_MS3 X2_MS3_PIN, - #else - #define _X2_MS3 - #endif - #define _X2_PINS X2_STEP_PIN, X2_DIR_PIN, X2_ENABLE_PIN, _X2_CS _X2_MS1 _X2_MS2 _X2_MS3 -#else - #define _X2_PINS -#endif - -#if ENABLED(Y_DUAL_STEPPER_DRIVERS) - #if PIN_EXISTS(Y2_CS) && AXIS_HAS_SPI(Y2) - #define _Y2_CS Y2_CS_PIN, - #else - #define _Y2_CS - #endif - #if PIN_EXISTS(Y2_MS1) - #define _Y2_MS1 Y2_MS1_PIN, - #else - #define _Y2_MS1 - #endif - #if PIN_EXISTS(Y2_MS2) - #define _Y2_MS2 Y2_MS2_PIN, - #else - #define _Y2_MS2 - #endif - #if PIN_EXISTS(Y2_MS3) - #define _Y2_MS3 Y2_MS3_PIN, - #else - #define _Y2_MS3 - #endif - #define _Y2_PINS Y2_STEP_PIN, Y2_DIR_PIN, Y2_ENABLE_PIN, _Y2_CS _Y2_MS1 _Y2_MS2 _Y2_MS3 -#else - #define _Y2_PINS -#endif - -#if NUM_Z_STEPPER_DRIVERS >= 2 - #if PIN_EXISTS(Z2_CS) && AXIS_HAS_SPI(Z2) - #define _Z2_CS Z2_CS_PIN, - #else - #define _Z2_CS - #endif - #if PIN_EXISTS(Z2_MS1) - #define _Z2_MS1 Z2_MS1_PIN, - #else - #define _Z2_MS1 - #endif - #if PIN_EXISTS(Z2_MS2) - #define _Z2_MS2 Z2_MS2_PIN, - #else - #define _Z2_MS2 - #endif - #if PIN_EXISTS(Z2_MS3) - #define _Z2_MS3 Z2_MS3_PIN, - #else - #define _Z2_MS3 - #endif - #define _Z2_PINS Z2_STEP_PIN, Z2_DIR_PIN, Z2_ENABLE_PIN, _Z2_CS _Z2_MS1 _Z2_MS2 _Z2_MS3 -#else - #define _Z2_PINS -#endif - -#if NUM_Z_STEPPER_DRIVERS >= 3 - #if PIN_EXISTS(Z3_CS) && AXIS_HAS_SPI(Z3) - #define _Z3_CS Z3_CS_PIN, - #else - #define _Z3_CS - #endif - #if PIN_EXISTS(Z3_MS1) - #define _Z3_MS1 Z3_MS1_PIN, - #else - #define _Z3_MS1 - #endif - #if PIN_EXISTS(Z3_MS2) - #define _Z3_MS2 Z3_MS2_PIN, - #else - #define _Z3_MS2 - #endif - #if PIN_EXISTS(Z3_MS3) - #define _Z3_MS3 Z3_MS3_PIN, - #else - #define _Z3_MS3 - #endif - #define _Z3_PINS Z3_STEP_PIN, Z3_DIR_PIN, Z3_ENABLE_PIN, _Z3_CS _Z3_MS1 _Z3_MS2 _Z3_MS3 -#else - #define _Z3_PINS -#endif - -#if NUM_Z_STEPPER_DRIVERS >= 4 - #if PIN_EXISTS(Z4_CS) && AXIS_HAS_SPI(Z4) - #define _Z4_CS Z4_CS_PIN, - #else - #define _Z4_CS - #endif - #if PIN_EXISTS(Z4_MS1) - #define _Z4_MS1 Z4_MS1_PIN, - #else - #define _Z4_MS1 - #endif - #if PIN_EXISTS(Z4_MS2) - #define _Z4_MS2 Z4_MS2_PIN, - #else - #define _Z4_MS2 - #endif - #if PIN_EXISTS(Z4_MS3) - #define _Z4_MS3 Z4_MS3_PIN, - #else - #define _Z4_MS3 - #endif - #define _Z4_PINS Z4_STEP_PIN, Z4_DIR_PIN, Z4_ENABLE_PIN, _Z4_CS _Z4_MS1 _Z4_MS2 _Z4_MS3 -#else - #define _Z4_PINS -#endif - -// -// Generate the final Sensitive Pins array, -// keeping the array as small as possible. -// - -#if PIN_EXISTS(PS_ON) - #define _PS_ON PS_ON_PIN, -#else - #define _PS_ON -#endif - -#if HAS_BED_PROBE && PIN_EXISTS(Z_MIN_PROBE) - #define _Z_PROBE Z_MIN_PROBE_PIN, -#else - #define _Z_PROBE -#endif - -#if PIN_EXISTS(FAN) - #define _FAN0 FAN_PIN, -#else - #define _FAN0 -#endif -#if PIN_EXISTS(FAN1) - #define _FAN1 FAN1_PIN, -#else - #define _FAN1 -#endif -#if PIN_EXISTS(FAN2) - #define _FAN2 FAN2_PIN, -#else - #define _FAN2 -#endif -#if PIN_EXISTS(FAN3) - #define _FAN3 FAN3_PIN, -#else - #define _FAN3 -#endif -#if PIN_EXISTS(FAN4) - #define _FAN4 FAN4_PIN, -#else - #define _FAN4 -#endif -#if PIN_EXISTS(FAN5) - #define _FAN5 FAN5_PIN, -#else - #define _FAN5 -#endif -#if PIN_EXISTS(FAN6) - #define _FAN6 FAN6_PIN, -#else - #define _FAN6 -#endif -#if PIN_EXISTS(FAN7) - #define _FAN7 FAN7_PIN, -#else - #define _FAN7 -#endif -#if PIN_EXISTS(CONTROLLER_FAN) - #define _FANC CONTROLLER_FAN_PIN, -#else - #define _FANC -#endif - -#if TEMP_SENSOR_BED && PINS_EXIST(TEMP_BED, HEATER_BED) - #define _BED_PINS HEATER_BED_PIN, analogInputToDigitalPin(TEMP_BED_PIN), -#else - #define _BED_PINS -#endif - -#if TEMP_SENSOR_CHAMBER && PIN_EXISTS(TEMP_CHAMBER) - #define _CHAMBER_TEMP analogInputToDigitalPin(TEMP_CHAMBER_PIN), -#else - #define _CHAMBER_TEMP -#endif -#if TEMP_SENSOR_CHAMBER && PINS_EXIST(TEMP_CHAMBER, HEATER_CHAMBER) - #define _CHAMBER_HEATER HEATER_CHAMBER_PIN, -#else - #define _CHAMBER_HEATER -#endif -#if TEMP_SENSOR_CHAMBER && PINS_EXIST(TEMP_CHAMBER, CHAMBER_AUTO_FAN) - #define _CHAMBER_FAN CHAMBER_AUTO_FAN_PIN, -#else - #define _CHAMBER_FAN -#endif - -#ifndef HAL_SENSITIVE_PINS - #define HAL_SENSITIVE_PINS -#endif - -#define SENSITIVE_PINS { \ - _X_PINS _Y_PINS _Z_PINS _X2_PINS _Y2_PINS _Z2_PINS _Z3_PINS _Z4_PINS _Z_PROBE \ - _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS _E6_PINS _E7_PINS \ - _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS _H6_PINS _H7_PINS \ - _PS_ON _FAN0 _FAN1 _FAN2 _FAN3 _FAN4 _FAN5 _FAN6 _FAN7 _FANC \ - _BED_PINS _CHAMBER_TEMP _CHAMBER_HEATER _CHAMBER_FAN HAL_SENSITIVE_PINS \ -} diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h deleted file mode 100644 index abdd088f9b..0000000000 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once - -#if NOT_TARGET(STM32F0xx) - #error "Oops! Select an STM32F0 board in your IDE." -#endif - -#define BOARD_INFO_NAME "Malyan M200 V2" - -#include "../stm32f1/pins_MALYAN_M200.h" diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h deleted file mode 100644 index a0e035a916..0000000000 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once - -#if NOT_TARGET(__STM32F1__, STM32F1xx, STM32F0xx) - #error "Oops! Select a 'Malyan M300' board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Malyan M300" - -// -// EEPROM Emulation -// -#if NO_EEPROM_SELECTED - #define FLASH_EEPROM_EMULATION - #ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x800U // 2KB - #endif -#endif - -// -// SD CARD SPI -// -#define SDSS SS_PIN - -// -// Timers -// -#define STEP_TIMER 6 -#define TEMP_TIMER 7 - -// -// Limit Switches -// -#define X_MAX_PIN PC13 -#define Y_MAX_PIN PC14 -#define Z_MAX_PIN PC15 -#define Z_MIN_PIN PB7 - -// -// Steppers -// -#define X_STEP_PIN PB14 -#define X_DIR_PIN PB13 -#define X_ENABLE_PIN PB10 - -#define Y_STEP_PIN PB12 -#define Y_DIR_PIN PB11 -#define Y_ENABLE_PIN PB10 - -#define Z_STEP_PIN PB2 -#define Z_DIR_PIN PB1 -#define Z_ENABLE_PIN PB10 - -#define E0_STEP_PIN PA7 -#define E0_DIR_PIN PA6 -#define E0_ENABLE_PIN PB0 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA0 // Analog Input (HOTEND0 thermistor) -#define TEMP_BED_PIN PA4 // Analog Input (BED thermistor) - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA1 // HOTEND0 MOSFET -#define HEATER_BED_PIN PA5 // BED MOSFET - -#define AUTO_FAN_PIN PA8 diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h deleted file mode 100644 index 63b97b666f..0000000000 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ /dev/null @@ -1,289 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(TARGET_STM32F1) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "BTT SKR E3 DIP V1.0" - -// Release PB3/PB4 (TMC_SW Pins) from JTAG pins -#define DISABLE_JTAG - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB -#endif - -// -// Servos -// -#define SERVO0_PIN PA1 // SERVOS - -// -// Limit Switches -// -#define X_STOP_PIN PC1 // "X-STOP" -#define Y_STOP_PIN PC0 // "Y-STOP" -#define Z_STOP_PIN PC15 // "Z-STOP" - -// -// Z Probe must be this pin -// -#define Z_MIN_PROBE_PIN PC14 // "PROBE" - -// -// Filament Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PC2 // "E0-STOP" -#endif - -// -// Steppers -// -#define X_ENABLE_PIN PC7 -#define X_STEP_PIN PC6 -#define X_DIR_PIN PB15 -#ifndef X_CS_PIN - #define X_CS_PIN PC10 -#endif - -#define Y_ENABLE_PIN PB14 -#define Y_STEP_PIN PB13 -#define Y_DIR_PIN PB12 -#ifndef Y_CS_PIN - #define Y_CS_PIN PC11 -#endif - -#define Z_ENABLE_PIN PB11 -#define Z_STEP_PIN PB10 -#define Z_DIR_PIN PB2 -#ifndef Z_CS_PIN - #define Z_CS_PIN PC12 -#endif - -#define E0_ENABLE_PIN PB1 -#define E0_STEP_PIN PB0 -#define E0_DIR_PIN PC5 -#ifndef E0_CS_PIN - #define E0_CS_PIN PD2 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PB5 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PB4 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PB3 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL MSerial1 - //#define Y_HARDWARE_SERIAL MSerial1 - //#define Z_HARDWARE_SERIAL MSerial1 - //#define E0_HARDWARE_SERIAL MSerial1 - - // - // Software serial - // - #define X_SERIAL_TX_PIN PC10 - #define X_SERIAL_RX_PIN PC10 - - #define Y_SERIAL_TX_PIN PC11 - #define Y_SERIAL_RX_PIN PC11 - - #define Z_SERIAL_TX_PIN PC12 - #define Z_SERIAL_RX_PIN PC12 - - #define E0_SERIAL_TX_PIN PD2 - #define E0_SERIAL_RX_PIN PD2 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA0 // Analog Input "TH0" -#define TEMP_BED_PIN PC3 // Analog Input "TB0" - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC8 // "HE" -#define HEATER_BED_PIN PC9 // "HB" -#define FAN_PIN PA8 // "FAN0" - -// -// USB connect control -// -#define USB_CONNECT_PIN PC13 -#define USB_CONNECT_INVERTING false - -/** - * _____ - * 5V | 1 2 | GND - * (LCD_EN) PB7 | 3 4 | PB8 (LCD_RS) - * (LCD_D4) PB9 | 5 6 PA10 (BTN_EN2) - * RESET | 7 8 | PA9 (BTN_EN1) - * (BTN_ENC) PB6 | 9 10| PA15 (BEEPER) - * ----- - * EXP1 - */ - -#if HAS_WIRED_LCD - - #if ENABLED(CR10_STOCKDISPLAY) - - #define BEEPER_PIN PA15 - - #define BTN_ENC PB6 - #define BTN_EN1 PA9 - #define BTN_EN2 PA10 - - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PB7 - #define LCD_PINS_D4 PB9 - - #elif ENABLED(ZONESTAR_LCD) // ANET A8 LCD Controller - Must convert to 3.3V - CONNECTING TO 5V WILL DAMAGE THE BOARD! - - #error "CAUTION! ZONESTAR_LCD requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue." - - #define LCD_PINS_RS PB9 - #define LCD_PINS_ENABLE PB6 - #define LCD_PINS_D4 PB8 - #define LCD_PINS_D5 PA10 - #define LCD_PINS_D6 PA9 - #define LCD_PINS_D7 PA15 - #define ADC_KEYPAD_PIN PA1 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) - - /** Creality Ender-2 display pinout - * _____ - * 5V | 1 2 | GND - * (MOSI) PB7 | 3 4 | PB8 (LCD_RS) - * (LCD_A0) PB9 | 5 6 PA10 (BTN_EN2) - * RESET | 7 8 | PA9 (BTN_EN1) - * (BTN_ENC) PB6 | 9 10| PA15 (SCK) - * ----- - * EXP1 - */ - - #define BTN_ENC PB6 - #define BTN_EN1 PA9 - #define BTN_EN2 PA10 - - #define DOGLCD_CS PB8 - #define DOGLCD_A0 PB9 - #define DOGLCD_SCK PA15 - #define DOGLCD_MOSI PB7 - #define FORCE_SOFT_SPI - #define LCD_BACKLIGHT_PIN -1 - - #else - #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and MKS_LCD12864 are currently supported on the BIGTREE_SKR_E3_DIP." - #endif - -#endif // HAS_WIRED_LCD - -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) - - #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_SKR_E3_DIP.h' for details. Comment out this line to continue." - - /** FYSETC TFT TFT81050 display pinout - * - * Board Display - * _____ _____ - * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) - * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) MOD_RESET | 3 4 | SD_CS (PA10) - * (FREE) PB9 | 5 6 PA10 (SD_CS) (PB8) LCD_CS | 5 6 MOSI (SPI1-MOSI) - * RESET | 7 8 | PA9 (MOD_RESET) (PA15) SD_DET | 7 8 | RESET - * (BEEPER) PB6 | 9 10| PA15 (SD_DET) GND | 9 10| 5V - * ----- ----- - * EXP1 EXP1 - * - * Needs custom cable: - * - * Board Adapter Display - * _________ - * EXP1-1 ----------- EXP1-10 - * EXP1-2 ----------- EXP1-9 - * SPI1-4 ----------- EXP1-6 - * EXP1-4 ----------- EXP1-5 - * SP11-3 ----------- EXP1-2 - * EXP1-6 ----------- EXP1-4 - * EXP1-7 ----------- EXP1-8 - * EXP1-8 ----------- EXP1-3 - * SPI1-1 ----------- EXP1-1 - * EXP1-10 ----------- EXP1-7 - */ - - #define CLCD_SPI_BUS 1 // SPI1 connector - - #define BEEPER_PIN PB6 - - #define CLCD_MOD_RESET PA9 - #define CLCD_SPI_CS PA8 - -#endif // TOUCH_UI_FTDI_EVE && LCD_FYSETC_TFT81050 - -// -// SD Support -// - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#if SD_CONNECTION_IS(ONBOARD) - #define SD_DETECT_PIN PC4 -#elif SD_CONNECTION_IS(LCD) && BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) - #define SD_DETECT_PIN PA15 - #define SS_PIN PA10 -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "SD CUSTOM_CABLE is not compatible with SKR E3 DIP." -#endif - -#define ONBOARD_SPI_DEVICE 1 // SPI1 -#define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h deleted file mode 100644 index 78751a6bac..0000000000 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "pins_BTT_SKR_MINI_E3_common.h" - -#define BOARD_INFO_NAME "BTT SKR Mini E3 V1.0" - -/** - * TMC220x stepper drivers - * Hardware serial communication ports. - */ -#if HAS_TMC_UART - #define X_HARDWARE_SERIAL MSerial4 - #define Y_HARDWARE_SERIAL MSerial4 - #define Z_HARDWARE_SERIAL MSerial4 - #define E0_HARDWARE_SERIAL MSerial4 -#endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h deleted file mode 100644 index 8d384c7396..0000000000 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "pins_BTT_SKR_MINI_E3_common.h" - -#define BOARD_INFO_NAME "BTT SKR Mini E3 V1.2" - -#define NEOPIXEL_PIN PC7 // LED driving pin - -/** - * TMC2208/TMC2209 stepper drivers - */ -#if HAS_TMC_UART - // - // Software serial - // - #define X_SERIAL_TX_PIN PB15 - #define X_SERIAL_RX_PIN PB15 - - #define Y_SERIAL_TX_PIN PC6 - #define Y_SERIAL_RX_PIN PC6 - - #define Z_SERIAL_TX_PIN PC10 - #define Z_SERIAL_RX_PIN PC10 - - #define E0_SERIAL_TX_PIN PC11 - #define E0_SERIAL_RX_PIN PC11 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h deleted file mode 100644 index 0a0d857db3..0000000000 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define SKR_MINI_E3_V2 - -// Onboard I2C EEPROM -#if NO_EEPROM_SELECTED - #define I2C_EEPROM - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB - #undef NO_EEPROM_SELECTED -#endif - -#include "pins_BTT_SKR_MINI_E3_common.h" - -#define BOARD_INFO_NAME "BTT SKR Mini E3 V2.0" - -// Release PA13/PA14 (led, usb control) from SWD pins -#define DISABLE_DEBUG - -#define NEOPIXEL_PIN PA8 // LED driving pin - -#define PS_ON_PIN PC13 // Power Supply Control - -#define FAN1_PIN PC7 - -#ifndef CONTROLLER_FAN_PIN - #define CONTROLLER_FAN_PIN FAN1_PIN -#endif - -/** - * TMC220x stepper drivers - * Hardware serial communication ports. - */ -#if HAS_TMC_UART - #define X_HARDWARE_SERIAL MSerial4 - #define Y_HARDWARE_SERIAL MSerial4 - #define Z_HARDWARE_SERIAL MSerial4 - #define E0_HARDWARE_SERIAL MSerial4 -#endif diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h deleted file mode 100644 index 50257f4f46..0000000000 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ /dev/null @@ -1,276 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(TARGET_STM32F1) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -// Release PB3/PB4 (E0 STP/DIR) from JTAG pins -#define DISABLE_JTAG - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB -#endif - -// -// Servos -// -#define SERVO0_PIN PA1 // "SERVOS" - -// -// Limit Switches -// -#define X_STOP_PIN PC0 // "X-STOP" -#define Y_STOP_PIN PC1 // "Y-STOP" -#define Z_STOP_PIN PC2 // "Z-STOP" - -// -// Z Probe must be this pin -// -#define Z_MIN_PROBE_PIN PC14 // "PROBE" - -// -// Filament Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PC15 // "E0-STOP" -#endif - -// -// Steppers -// -#define X_ENABLE_PIN PB14 -#define X_STEP_PIN PB13 -#define X_DIR_PIN PB12 - -#define Y_ENABLE_PIN PB11 -#define Y_STEP_PIN PB10 -#define Y_DIR_PIN PB2 - -#define Z_ENABLE_PIN PB1 -#define Z_STEP_PIN PB0 -#define Z_DIR_PIN PC5 - -#define E0_ENABLE_PIN PD2 -#define E0_STEP_PIN PB3 -#define E0_DIR_PIN PB4 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA0 // Analog Input "TH0" -#define TEMP_BED_PIN PC3 // Analog Input "TB0" - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC8 // "HE" -#define HEATER_BED_PIN PC9 // "HB" - -#ifdef SKR_MINI_E3_V2 - #define FAN_PIN PC6 -#else - #define FAN_PIN PA8 // "FAN0" -#endif - -// -// USB connect control -// -#ifdef SKR_MINI_E3_V2 - #define USB_CONNECT_PIN PA14 -#else - #define USB_CONNECT_PIN PC13 -#endif - -#define USB_CONNECT_INVERTING false - -/** - * SKR Mini E3 V1.0, V1.2 SKR Mini E3 V2.0 - * _____ _____ - * 5V | 1 2 | GND 5V | 1 2 | GND - * (LCD_EN) PB7 | 3 4 | PB8 (LCD_RS) (LCD_EN) PB15 | 3 4 | PB8 (LCD_RS) - * (LCD_D4) PB9 | 5 6 PA10 (BTN_EN2) (LCD_D4) PB9 | 5 6 PA10 (BTN_EN2) - * RESET | 7 8 | PA9 (BTN_EN1) RESET | 7 8 | PA9 (BTN_EN1) - * (BTN_ENC) PB6 | 9 10| PB5 (BEEPER) (BTN_ENC) PA15 | 9 10| PB5 (BEEPER) - * ----- ----- - * EXP1 EXP1 - */ -#ifdef SKR_MINI_E3_V2 - #define EXP1_9 PA15 - #define EXP1_3 PB15 -#else - #define EXP1_9 PB6 - #define EXP1_3 PB7 -#endif - -#if HAS_WIRED_LCD - - #if ENABLED(CR10_STOCKDISPLAY) - - #define BEEPER_PIN PB5 - #define BTN_ENC EXP1_9 - - #define BTN_EN1 PA9 - #define BTN_EN2 PA10 - - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE EXP1_3 - #define LCD_PINS_D4 PB9 - - #elif ENABLED(ZONESTAR_LCD) // ANET A8 LCD Controller - Must convert to 3.3V - CONNECTING TO 5V WILL DAMAGE THE BOARD! - - #error "CAUTION! ZONESTAR_LCD requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue." - - #define LCD_PINS_RS PB9 - #define LCD_PINS_ENABLE EXP1_9 - #define LCD_PINS_D4 PB8 - #define LCD_PINS_D5 PA10 - #define LCD_PINS_D6 PA9 - #define LCD_PINS_D7 PB5 - #define ADC_KEYPAD_PIN PA1 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) - - #define BTN_ENC EXP1_9 - #define BTN_EN1 PA9 - #define BTN_EN2 PA10 - - #define DOGLCD_CS PB8 - #define DOGLCD_A0 PB9 - #define DOGLCD_SCK PB5 - #define DOGLCD_MOSI EXP1_3 - - #define FORCE_SOFT_SPI - #define LCD_BACKLIGHT_PIN -1 - - #elif IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - - #error "CAUTION! TFTGLCD_PANEL_SPI requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue." - - /** - * TFTGLCD_PANEL_SPI display pinout - * - * Board Display - * _____ _____ - * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) - * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) GLCD_CS | 3 4 | SD_CS (PA10) - * (FREE) PB9 | 5 6 | PA10 (SD_CS) (FREE) | 5 6 | MOSI (SPI1-MOSI) - * RESET | 7 8 | PA9 (MOD_RESET) (PB5) SD_DET | 7 8 | (FREE) - * (BEEPER) PB6 | 9 10| PB5 (SD_DET) GND | 9 10| 5V - * ----- ----- - * EXP1 EXP1 - * - * Needs custom cable: - * - * Board Adapter Display - * _________ - * EXP1-1 ----------- EXP1-10 - * EXP1-2 ----------- EXP1-9 - * SPI1-4 ----------- EXP1-6 - * EXP1-4 ----------- FREE - * SPI1-3 ----------- EXP1-2 - * EXP1-6 ----------- EXP1-4 - * EXP1-7 ----------- FREE - * EXP1-8 ----------- EXP1-3 - * SPI1-1 ----------- EXP1-1 - * EXP1-10 ----------- EXP1-7 - */ - - #define TFTGLCD_CS PA9 - - #endif - - #else - #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and TFTGLCD_PANEL_(SPI|I2C) are currently supported on the BIGTREE_SKR_MINI_E3." - #endif - -#endif // HAS_WIRED_LCD - -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) - - #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue." - - /** FYSETC TFT TFT81050 display pinout - * - * Board Display - * _____ _____ - * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) - * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) MOD_RESET | 3 4 | SD_CS (PA10) - * (FREE) PB9 | 5 6 | PA10 (SD_CS) (PB8) LCD_CS | 5 6 | MOSI (SPI1-MOSI) - * RESET | 7 8 | PA9 (MOD_RESET) (PB5) SD_DET | 7 8 | RESET - * (BEEPER) PB6 | 9 10| PB5 (SD_DET) GND | 9 10| 5V - * ----- ----- - * EXP1 EXP1 - * - * Needs custom cable: - * - * Board Adapter Display - * _________ - * EXP1-1 ----------- EXP1-10 - * EXP1-2 ----------- EXP1-9 - * SPI1-4 ----------- EXP1-6 - * EXP1-4 ----------- EXP1-5 - * SPI1-3 ----------- EXP1-2 - * EXP1-6 ----------- EXP1-4 - * EXP1-7 ----------- EXP1-8 - * EXP1-8 ----------- EXP1-3 - * SPI1-1 ----------- EXP1-1 - * EXP1-10 ----------- EXP1-7 - */ - - #define CLCD_SPI_BUS 1 // SPI1 connector - - #define BEEPER_PIN EXP1_9 - - #define CLCD_MOD_RESET PA9 - #define CLCD_SPI_CS PB8 - -#endif // TOUCH_UI_FTDI_EVE && LCD_FYSETC_TFT81050 - -// -// SD Support -// - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#if SD_CONNECTION_IS(ONBOARD) - #define SD_DETECT_PIN PC4 -#elif SD_CONNECTION_IS(LCD) && (BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) - #define SD_DETECT_PIN PB5 - #define SS_PIN PA10 -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "SD CUSTOM_CABLE is not compatible with SKR Mini E3." -#endif - -#define ONBOARD_SPI_DEVICE 1 // SPI1 -#define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h deleted file mode 100644 index 47fff4467c..0000000000 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ /dev/null @@ -1,228 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(TARGET_STM32F1) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "BTT SKR Mini V1.1" - -//#define DISABLE_DEBUG -#define DISABLE_JTAG - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB -#endif - -// -// Limit Switches -// -#define X_MIN_PIN PC2 -#define X_MAX_PIN PA2 -#define Y_MIN_PIN PC1 -#define Y_MAX_PIN PA1 -#define Z_MIN_PIN PC0 -#define Z_MAX_PIN PC3 - -// -// Steppers -// - -#define X_STEP_PIN PC6 -#define X_DIR_PIN PC7 -#define X_ENABLE_PIN PB15 - -#define Y_STEP_PIN PB13 -#define Y_DIR_PIN PB14 -#define Y_ENABLE_PIN PB12 - -#define Z_STEP_PIN PB10 -#define Z_DIR_PIN PB11 -#define Z_ENABLE_PIN PB2 - -#define E0_STEP_PIN PC5 -#define E0_DIR_PIN PB0 -#define E0_ENABLE_PIN PC4 - -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PB3 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PB4 - #endif - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PB5 - #endif -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA8 -#define FAN_PIN PC8 -#define HEATER_BED_PIN PC9 - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PB1 // Analog Input -#define TEMP_0_PIN PA0 // Analog Input - -// -// LCD Pins -// - -/** - * _____ _____ - * NC | · · | GND 5V | · · | GND - * RESET | · · | PB9 (SD_DETECT) (LCD_D7) PC14 | · · | PC15 (LCD_D6) - * (MOSI) PB5 | · · | PB8 (BTN_EN2) (LCD_D5) PB7 | · · | PC13 (LCD_D4) - * (SD_SS) PA15 | · · | PD2 (BTN_EN1) (LCD_RS) PC12 | · · | PB6 (LCD_EN) - * (SCK) PB3 | · · | PB4 (MISO) (BTN_ENC) PC11 | · · | PC10 (BEEPER) - * ----- ----- - * EXP2 EXP1 - */ - -#if HAS_WIRED_LCD - #define BEEPER_PIN PC10 - #define BTN_ENC PC11 - - #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS PC15 - - #define BTN_EN1 PB6 - #define BTN_EN2 PC13 - - #define LCD_PINS_ENABLE PC14 - #define LCD_PINS_D4 PB7 - - #elif IS_TFTGLCD_PANEL - - #undef BEEPER_PIN - #undef BTN_ENC - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS PD2 - #endif - - #define SD_DETECT_PIN PB9 - - #else - - #define LCD_PINS_RS PC12 - - #define BTN_EN1 PD2 - #define BTN_EN2 PB8 - - #define LCD_PINS_ENABLE PB6 - - #if ENABLED(FYSETC_MINI_12864) - - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN PC13 - #define DOGLCD_A0 PC12 - #define DOGLCD_CS PB6 - #define DOGLCD_SCK PB3 - #define DOGLCD_MOSI PB5 - - #define FORCE_SOFT_SPI // SPI MODE3 - - #define LED_PIN PB7 // red pwm - //#define LED_PIN PC15 // green - //#define LED_PIN PC14 // blue - - //#if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - // #ifndef RGB_LED_R_PIN - // #define RGB_LED_R_PIN PB7 - // #endif - // #ifndef RGB_LED_G_PIN - // #define RGB_LED_G_PIN PC15 - // #endif - // #ifndef RGB_LED_B_PIN - // #define RGB_LED_B_PIN PC14 - // #endif - //#elif ENABLED(FYSETC_MINI_12864_2_1) - // #define NEOPIXEL_PIN PB7 - //#endif - - #else // !FYSETC_MINI_12864 - - #define LCD_PINS_D4 PC13 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PB7 - #define LCD_PINS_D6 PC15 - #define LCD_PINS_D7 PC14 - #endif - - #endif // !FYSETC_MINI_12864 - - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif - #endif - - #endif - -#endif // HAS_WIRED_LCD - -// -// SD Card -// - -// By default the onboard SD is enabled. -// Change SDCARD_CONNECTION from 'ONBOARD' to 'LCD' for an external (LCD module) SD -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#if SD_CONNECTION_IS(LCD) - #define ENABLE_SPI3 - #define SD_DETECT_PIN PB9 - #define SCK_PIN PB3 - #define MISO_PIN PB4 - #define MOSI_PIN PB5 - #define SS_PIN PA15 -#elif SD_CONNECTION_IS(ONBOARD) - #define ENABLE_SPI1 - #define SD_DETECT_PIN PA3 - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PA7 - #define SS_PIN PA4 -#endif -#define ONBOARD_SPI_DEVICE 1 // SPI1 -#define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h deleted file mode 100644 index 66930a2ea5..0000000000 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(TARGET_STM32F1) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 - #error "CCROBOT-ONLINE MEEB_3DP only supports 1 hotend / E-stepper. Comment out this line to continue." -#endif - -// https://github.com/ccrobot-online/MEEB_3DP -// Pin assignments for 32-bit MEEB_3DP -#define BOARD_INFO_NAME "CCROBOT-ONLINE MEEB_3DP" -#define DEFAULT_MACHINE_NAME "STM32F103RCT6" -#define BOARD_WEBSITE_URL "ccrobot-online.com" - -// -// Release PB4 from JTAG NRST role -// -#define DISABLE_JTAG - -// -// EEPROM -// -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE 0x800U // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Servos -// -#define SERVO0_PIN PA1 - -// -// Limit Switches -// -#define X_STOP_PIN PC0 -#define Y_STOP_PIN PC1 -#define Z_STOP_PIN PC2 - -// -// Z Probe must be this pin -// -#define Z_MIN_PROBE_PIN PC15 // "PROBE" - -// -// TMC2208 stepper drivers -// -#define X_ENABLE_PIN PB4 -#define X_STEP_PIN PC12 -#define X_DIR_PIN PC11 - -#define Y_ENABLE_PIN PC10 -#define Y_STEP_PIN PB14 -#define Y_DIR_PIN PB13 - -#define Z_ENABLE_PIN PB12 -#define Z_STEP_PIN PB2 -#define Z_DIR_PIN PB1 - -#define E0_ENABLE_PIN PB0 -#define E0_STEP_PIN PA6 -#define E0_DIR_PIN PA5 - -// Stepper drivers Serial UART -#define X_SERIAL_TX_PIN PB3 -#define X_SERIAL_RX_PIN PD2 -#define Y_SERIAL_TX_PIN PA15 -#define Y_SERIAL_RX_PIN PC6 -#define Z_SERIAL_TX_PIN PB11 -#define Z_SERIAL_RX_PIN PB10 -#define E0_SERIAL_TX_PIN PC5 -#define E0_SERIAL_RX_PIN PC4 - -// Reduce baud rate to improve software serial reliability -#define TMC_BAUD_RATE 19200 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA0 // TH0 -#define TEMP_BED_PIN PC3 // THB - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC8 // HEATER0 -#define HEATER_BED_PIN PC9 // HOT BED - -#define FAN_PIN PA7 // FAN (fan2 on board) model cool fan -#define FAN1_PIN PA8 // FAN (fan0 on board) e0 cool fan -#define FAN2_PIN PB9 // FAN (fan1 on board) controller cool fan - -// One NeoPixel onboard and a connector for other NeoPixels -#define NEOPIXEL_PIN PC7 // The NEOPIXEL LED driving pin - -/** - * 1 _____ 2 - * PB5 | · · | PB6 - * PA2 | · · | RESET - * PA3 | · · | PB8 - * PB7 | · · | PA4 - * GND | · · | VCC5 - * 9 ----- 10 - * LCD EXP - */ - -// -// LCD / Controller -// -#if ENABLED(CR10_STOCKDISPLAY) - #define BEEPER_PIN PB5 - #define BTN_EN1 PA2 - #define BTN_EN2 PA3 - #define BTN_ENC PB6 - - #define LCD_PINS_RS PB7 // CS -- SOFT SPI for ENDER3 LCD - #define LCD_PINS_D4 PB8 // SCLK - #define LCD_PINS_ENABLE PA4 // DATA MOSI -#endif - -// Alter timing for graphical display -#if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif -#endif - -// -// Camera -// -#define CHDK_PIN PB15 - -#if 0 - -// -// SD-NAND -// -#if SD_CONNECTION_IS(ONBOARD) - #define ENABLE_SPI1 - #define SD_DETECT_PIN -1 - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PA7 - #define SS_PIN PA4 -#endif - -#define ONBOARD_SPI_DEVICE 1 // SPI1 -#define ONBOARD_SD_CS_PIN PA4 // Chip select for SD-NAND - -#endif diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h deleted file mode 100644 index 3a872db025..0000000000 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ /dev/null @@ -1,284 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" -#endif - -/** - * 2017 Victor Perez Marlin for stm32f1 test - */ - -#define BOARD_INFO_NAME "Chitu3D" -#define DEFAULT_MACHINE_NAME "STM32F103RET6" - -// Enable I2C_EEPROM for testing -//#define I2C_EEPROM - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Steppers -// -#define X_STEP_PIN PE5 -#define X_DIR_PIN PE6 -#define X_ENABLE_PIN PC13 -#define X_MIN_PIN PG10 -#define X_MAX_PIN -1 - -#define Y_STEP_PIN PE2 -#define Y_DIR_PIN PE3 -#define Y_ENABLE_PIN PE4 -#define Y_MIN_PIN PA12 -#define Y_MAX_PIN - -#define Z_STEP_PIN PB9 -#define Z_DIR_PIN PE0 -#define Z_ENABLE_PIN PE1 -#define Z_MIN_PIN PA14 -#define Z_MAX_PIN -1 - -#define Y2_STEP_PIN -1 -#define Y2_DIR_PIN -1 -#define Y2_ENABLE_PIN -1 - -#define Z2_STEP_PIN -1 -#define Z2_DIR_PIN -1 -#define Z2_ENABLE_PIN -1 - -#define E0_STEP_PIN PB4 -#define E0_DIR_PIN PB5 -#define E0_ENABLE_PIN PB8 - -#define E1_STEP_PIN -1 -#define E1_DIR_PIN -1 -#define E1_ENABLE_PIN -1 - -#define E2_STEP_PIN -1 -#define E2_DIR_PIN -1 -#define E2_ENABLE_PIN -1 - -// -// Misc. Functions -// -#define SDSS -1 -#define LED_PIN -1 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN PA8 // 8 -#endif - -#define PS_ON_PIN -1 -#define KILL_PIN PD6 // LED strip 24v - -// -// Heaters / Fans -// -#define HEATER_0_PIN PD12 // HOT-END -#define HEATER_1_PIN -1 -#define HEATER_2_PIN -1 - -#define HEATER_BED_PIN PG11 // HOT-BED -#define HEATER_BED2_PIN -1 // BED2 -#define HEATER_BED3_PIN -1 // BED3 - -#ifndef FAN_PIN - #define FAN_PIN PG14 // MAIN BOARD FAN -#endif - -#define FAN_SOFT_PWM - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PA0 // Analog Input -#define TEMP_0_PIN PA1 // Analog Input -#define TEMP_1_PIN -1 // Analog Input -#define TEMP_2_PIN -1 // Analog Input - -// -// LCD Pins -// -#if HAS_WIRED_LCD - - #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS PD1 // 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE PD3 // 51 // SID (MOSI) - #define LCD_PINS_D4 PD4 // 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 - #else - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 - #if DISABLED(NEWPANEL) - #define BEEPER_PIN PC1 // 33 - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK PC6 // 38 - //#define SHIFT_LD PC10 // 42 - //#define SHIFT_OUT PC8 // 40 - //#define SHIFT_EN PA1 // 17 - #endif - #endif - - #if ENABLED(NEWPANEL) - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN PC5 - - #define BTN_EN1 PB15 // 31 - #define BTN_EN2 PC1 // 33 - #define BTN_ENC PC3 // 35 - - #define SD_DETECT_PIN PD1 // 49 - #define KILL_PIN PC9 // 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN PC7 // 39 - #endif - - #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 PE0 // 64 - #define BTN_EN2 PD11 // 59 - #define BTN_ENC PD15 // 63 - #define SD_DETECT_PIN PC10 // 42 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 PC15 // 47 - #define BTN_EN2 PC11 // 43 - #define BTN_ENC PC0 // 32 - #define LCD_SDSS PD5 // 53 - #define SD_DETECT_PIN -1 - #define KILL_PIN PC9 // 41 - - #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 PB6 // 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 PA7 // 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - - #define BTN_ENC -1 - #define LCD_SDSS PD5 // 53 - #define SD_DETECT_PIN PD1 // 49 - - #elif ANY(VIKI2, miniVIKI) - - #define BEEPER_PIN PC1 // 33 - - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 PC12 // 44 - #define DOGLCD_CS PC13 // 45 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 PB6 // 22 - #define BTN_EN2 PA7 // 7 - #define BTN_ENC PC7 // 39 - - #define SDSS PD5 // 53 - #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - - #define KILL_PIN PB15 // 31 - - #define STAT_LED_RED_PIN PC0 // 32 - #define STAT_LED_BLUE_PIN PC3 // 35 - - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 PC3 // 35 - #define BTN_EN2 PC5 // 37 - #define BTN_ENC PB15 // 31 - #define SD_DETECT_PIN PD1 // 49 - #define LCD_SDSS PD5 // 53 - #define KILL_PIN PC9 // 41 - #define BEEPER_PIN PB7 // 23 - #define DOGLCD_CS PB13 // 29 - #define DOGLCD_A0 PB11 // 27 - #define LCD_BACKLIGHT_PIN PC1 // 33 - - #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN PC10 // 42 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 PC12 // 44 - #define DOGLCD_CS PE2 // 66 - #define LCD_BACKLIGHT_PIN PE1 // 65 // backlight LED on A11/D65 - #define SDSS PD5 // 53 - - #define KILL_PIN PE0 // 64 - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - // The encoder and click button - #define BTN_EN1 PC8 // 40 - #define BTN_EN2 PD15 // 63 - #define BTN_ENC PD11 // 59 - // not connected to a pin - #define SD_DETECT_PIN PD1 // 49 - - #else - - // Beeper on AUX-4 - #define BEEPER_PIN PC1 // 33 - - // Buttons directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 PE0 // 64 - #define BTN_EN2 PD11 // 59 - #define BTN_ENC PD15 // 63 - #define SHIFT_OUT PC8 // 40 - #define SHIFT_CLK PC12 // 44 - #define SHIFT_LD PC10 // 42 - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 PD11 // 59 // AUX2 PIN 3 - #define BTN_EN2 PD15 // 63 // AUX2 PIN 4 - #define BTN_ENC PD1 // 49 // AUX3 PIN 7 - #else - #define BTN_EN1 PC5 // 37 - #define BTN_EN2 PC3 // 35 - #define BTN_ENC PB15 // 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN PD1 // 49 - #define KILL_PIN PC9 // 41 - #else - //#define SD_DETECT_PIN -1 // Ramps doesn't use this - #endif - - #endif - #endif // NEWPANEL - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h deleted file mode 100644 index b02d414089..0000000000 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ /dev/null @@ -1,203 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" -#endif - -/** - * 2017 Victor Perez Marlin for stm32f1 test - */ - -#define BOARD_INFO_NAME "Chitu3D V5" -#define DEFAULT_MACHINE_NAME "STM32F103ZET6" - -#define DISABLE_JTAG - -// -// EEPROM -// -#define FLASH_EEPROM_EMULATION -#if ENABLED(FLASH_EEPROM_EMULATION) - // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) - #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE) - #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE -#else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM -#endif - -// -// Limit Switches -// -#define X_STOP_PIN PG10 -#define Y_STOP_PIN PA12 -#define Z_STOP_PIN PA14 - -// -// Steppers -// -#define X_ENABLE_PIN PC13 -#define X_STEP_PIN PE5 -#define X_DIR_PIN PE6 - -#define Y_ENABLE_PIN PE4 -#define Y_STEP_PIN PE2 -#define Y_DIR_PIN PE3 - -#define Z_ENABLE_PIN PE1 -#define Z_STEP_PIN PB9 -#define Z_DIR_PIN PE0 - -#define E0_ENABLE_PIN PB8 -#define E0_STEP_PIN PB4 -#define E0_DIR_PIN PB5 - -#define E1_ENABLE_PIN PG8 -#define E1_STEP_PIN PC7 -#define E1_DIR_PIN PC6 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA1 // TH1 -#define TEMP_BED_PIN PA0 // TB1 - -// -// Heaters -// -#define HEATER_0_PIN PG12 // HEATER1 -#define HEATER_BED_PIN PG11 // HOT BED - -// -// Fans -// -#define CONTROLLER_FAN_PIN PD6 // BOARD FAN -#define FAN_PIN PG13 // FAN -#define FAN_PIN_2 PG14 - -// -// Misc -// -#define BEEPER_PIN PB0 -//#define LED_PIN -1 -//#define POWER_LOSS_PIN -1 -#define FIL_RUNOUT_PIN PA15 - -// SPI Flash -#define HAS_SPI_FLASH 1 -#if HAS_SPI_FLASH - #define SPI_FLASH_SIZE 0x200000 // 2MB -#endif - -// SPI 2 -#define W25QXX_CS_PIN PB12 -#define W25QXX_MOSI_PIN PB15 -#define W25QXX_MISO_PIN PB14 -#define W25QXX_SCK_PIN PB13 - -// -// TronXY TFT Support -// - -#if HAS_FSMC_TFT - - // Shared FSMC - - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define TFT_RESET_PIN PF11 - #define TFT_BACKLIGHT_PIN PD13 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - -#endif - -#if ENABLED(TFT_LVGL_UI) - // LVGL - #define HAS_SPI_FLASH_FONT 1 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 1 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 -#elif ENABLED(TFT_COLOR_UI) - // Color UI - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 -#elif ENABLED(TFT_CLASSIC_UI) - // Emulated DOGM - #define GRAPHICAL_TFT_UPSCALE 3 -#endif - -// XPT2046 Touch Screen calibration -#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17181 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11434 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 501 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -9 - #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif -#endif - -// SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available -// Needs to use SPI2 -#define ENABLE_SPI2 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SS_PIN PB12 - -// -// SD Card -// -#define SDIO_SUPPORT -#define SD_DETECT_PIN -1 // PF0, but it isn't connected -#define SDIO_CLOCK 4500000 -#define SDIO_READ_RETRIES 16 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h deleted file mode 100644 index cafd50dcf2..0000000000 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ /dev/null @@ -1,218 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" -#endif - -/** - * 2017 Victor Perez Marlin for stm32f1 test - */ - -#define BOARD_INFO_NAME "Chitu3D" -#define DEFAULT_MACHINE_NAME "STM32F103ZET6" - -#define DISABLE_JTAG - -// -// EEPROM -// - -#if NO_EEPROM_SELECTED - #define FLASH_EEPROM_EMULATION -#endif - -#if ENABLED(FLASH_EEPROM_EMULATION) - // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) - #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE) - #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE -#else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM -#endif - -// -// Limit Switches -// -#define X_STOP_PIN PG10 -#define Y_STOP_PIN PA12 -#define Z_STOP_PIN PG9 - -// -// Steppers -// -#define X_ENABLE_PIN PC13 -#define X_STEP_PIN PE5 -#define X_DIR_PIN PE6 - -#define Y_ENABLE_PIN PE4 -#define Y_STEP_PIN PE2 -#define Y_DIR_PIN PE3 - -#define Z_ENABLE_PIN PE1 -#define Z_STEP_PIN PB9 -#define Z_DIR_PIN PE0 - -#define Z2_ENABLE_PIN PF3 -#define Z2_STEP_PIN PF5 -#define Z2_DIR_PIN PF1 - -#define E0_ENABLE_PIN PB8 -#define E0_STEP_PIN PB4 -#define E0_DIR_PIN PB5 - -#define E1_ENABLE_PIN PG8 -#define E1_STEP_PIN PC7 -#define E1_DIR_PIN PC6 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA1 // TH1 -#define TEMP_BED_PIN PA0 // TB1 - -// -// Heaters -// -#define HEATER_0_PIN PG12 // HEATER1 -#define HEATER_BED_PIN PG11 // HOT BED -//#define HEATER_BED_INVERTING true - -// -// Fans -// -#define CONTROLLER_FAN_PIN PD6 // BOARD FAN -#define FAN_PIN PG13 // FAN -#define FAN_PIN_2 PG14 - -// -// Misc -// -#define BEEPER_PIN PB0 -//#define LED_PIN PD3 -//#define POWER_LOSS_PIN PG2 // PG4 PW_DET - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PA15 // MT_DET -#endif -#ifndef FIL_RUNOUT2_PIN - #define FIL_RUNOUT2_PIN PF13 -#endif - -// SPI Flash -#define HAS_SPI_FLASH 1 -#if HAS_SPI_FLASH - #define SPI_FLASH_SIZE 0x200000 // 2MB -#endif - -// SPI 2 -#define W25QXX_CS_PIN PB12 -#define W25QXX_MOSI_PIN PB15 -#define W25QXX_MISO_PIN PB14 -#define W25QXX_SCK_PIN PB13 - -// -// TronXY TFT Support -// - -#if HAS_FSMC_TFT - - // Shared FSMC - - #define TOUCH_CS_PIN PB7 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define TFT_RESET_PIN PF11 - #define TFT_BACKLIGHT_PIN PD13 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - -#endif - -#if ENABLED(TFT_LVGL_UI) - // LVGL - #define HAS_SPI_FLASH_FONT 1 - #define HAS_GCODE_PREVIEW 1 - #define HAS_GCODE_DEFAULT_VIEW_IN_FLASH 0 - #define HAS_LANG_SELECT_SCREEN 1 - #define HAS_BAK_VIEW_IN_FLASH 0 - #define HAS_LOGO_IN_FLASH 0 -#elif ENABLED(TFT_COLOR_UI) - // Color UI - #define TFT_DRIVER ILI9488 - #define TFT_BUFFER_SIZE 14400 -#elif ENABLED(TFT_CLASSIC_UI) - // Emulated DOGM - #define GRAPHICAL_TFT_UPSCALE 3 -#endif - -// XPT2046 Touch Screen calibration -#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17181 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11434 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 501 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -9 - #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif -#endif - -// SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available -// so SPI2 is required. -#define ENABLE_SPI2 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SS_PIN PB12 - -// -// SD Card -// -#define SDIO_SUPPORT -#define SD_DETECT_PIN -1 // PF0, but it isn't connected -#define SDIO_CLOCK 4500000 -#define SDIO_READ_RETRIES 16 diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h deleted file mode 100644 index eb910dd846..0000000000 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * CREALITY (STM32F103) board pin assignments - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#if HOTENDS > 1 || E_STEPPERS > 1 - #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Creality V4" -#endif -#ifndef DEFAULT_MACHINE_NAME - #define DEFAULT_MACHINE_NAME "Ender 3 V2" -#endif - -// -// EEPROM -// -#if NO_EEPROM_SELECTED - // FLASH - //#define FLASH_EEPROM_EMULATION - - // I2C - #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 used only for display settings - #if ENABLED(IIC_BL24CXX_EEPROM) - #define IIC_EEPROM_SDA PA11 - #define IIC_EEPROM_SCL PA12 - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) - #else - #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX - #define MARLIN_EEPROM_SIZE 0x800 // 2Kb - #endif - - // SPI - //#define SPI_EEPROM // EEPROM on SPI-0 - //#define SPI_CHAN_EEPROM1 ? - //#define SPI_EEPROM1_CS ? - - // 2K EEPROM - //#define SPI_EEPROM2_CS ? - - // 32Mb FLASH - //#define SPI_FLASH_CS ? -#endif - -// -// Servos -// -#define SERVO0_PIN PB0 // BLTouch OUT - -// -// Limit Switches -// -#define X_STOP_PIN PA5 -#define Y_STOP_PIN PA6 -#define Z_STOP_PIN PA7 - -#define Z_MIN_PROBE_PIN PB1 // BLTouch IN - -// -// Filament Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PA4 // "Pulled-high" -#endif - -// -// Steppers -// -#define X_ENABLE_PIN PC3 -#ifndef X_STEP_PIN - #define X_STEP_PIN PC2 -#endif -#ifndef X_DIR_PIN - #define X_DIR_PIN PB9 -#endif - -#define Y_ENABLE_PIN PC3 -#ifndef Y_STEP_PIN - #define Y_STEP_PIN PB8 -#endif -#ifndef Y_DIR_PIN - #define Y_DIR_PIN PB7 -#endif - -#define Z_ENABLE_PIN PC3 -#ifndef Z_STEP_PIN - #define Z_STEP_PIN PB6 -#endif -#ifndef Z_DIR_PIN - #define Z_DIR_PIN PB5 -#endif - -#define E0_ENABLE_PIN PC3 -#ifndef E0_STEP_PIN - #define E0_STEP_PIN PB4 -#endif -#ifndef E0_DIR_PIN - #define E0_DIR_PIN PB3 -#endif - -// -// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role -// -#define DISABLE_DEBUG - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC5 // TH1 -#define TEMP_BED_PIN PC4 // TB1 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA1 // HEATER1 -#define HEATER_BED_PIN PA2 // HOT BED - -#define FAN_PIN PA0 // FAN -#define FAN_SOFT_PWM - -// -// SD Card -// -#define SD_DETECT_PIN PC7 -#define SDCARD_CONNECTION ONBOARD -#define ONBOARD_SPI_DEVICE 1 -#define ONBOARD_SD_CS_PIN PA4 // SDSS -#define SDIO_SUPPORT -#define NO_SD_HOST_DRIVE // This board's SD is only seen by the printer - -#if ENABLED(CR10_STOCKDISPLAY) && NONE(RET6_12864_LCD, VET6_12864_LCD) - #error "Define RET6_12864_LCD or VET6_12864_LCD to select pins for CR10_STOCKDISPLAY with the Creality V4 controller." -#endif - -#if ENABLED(RET6_12864_LCD) - - // RET6 12864 LCD - #define LCD_PINS_RS PB12 - #define LCD_PINS_ENABLE PB15 - #define LCD_PINS_D4 PB13 - - #define BTN_ENC PB2 - #define BTN_EN1 PB10 - #define BTN_EN2 PB14 - - #define BEEPER_PIN PC6 - -#elif ENABLED(VET6_12864_LCD) - - // VET6 12864 LCD - #define LCD_PINS_RS PA4 - #define LCD_PINS_ENABLE PA7 - #define LCD_PINS_D4 PA5 - - #define BTN_ENC PC5 - #define BTN_EN1 PB10 - #define BTN_EN2 PA6 - -#elif ENABLED(DWIN_CREALITY_LCD) - - // RET6 DWIN ENCODER LCD - #define BTN_ENC PB14 - #define BTN_EN1 PB15 - #define BTN_EN2 PB12 - - //#define LCD_LED_PIN PB2 - #ifndef BEEPER_PIN - #define BEEPER_PIN PB13 - #undef SPEAKER - #endif - -#elif ENABLED(DWIN_VET6_CREALITY_LCD) - - // VET6 DWIN ENCODER LCD - #define BTN_ENC PA6 - #define BTN_EN1 PA7 - #define BTN_EN2 PA4 - - #define BEEPER_PIN PA5 - -#endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h deleted file mode 100644 index 5b51ece07f..0000000000 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V427.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * CREALITY v4.2.7 (STM32F103) board pin assignments - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Creality v4.2.7" -#define DEFAULT_MACHINE_NAME "Creality3D" - -// -// Steppers -// -#define X_STEP_PIN PB9 -#define X_DIR_PIN PC2 -#define Y_STEP_PIN PB7 - -#define Y_DIR_PIN PB8 -#define Z_STEP_PIN PB5 -#define Z_DIR_PIN PB6 - -#define E0_STEP_PIN PB3 -#define E0_DIR_PIN PB4 - -#include "pins_CREALITY_V4.h" diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h deleted file mode 100644 index 55a809efab..0000000000 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifndef __STM32F1__ - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "FLY_MINI" -#define BOARD_WEBSITE_URL "github.com/FLYmaker" -#define DISABLE_JTAG - -// -// Flash EEPROM Emulation -// -#define FLASH_EEPROM_EMULATION -#define EEPROM_PAGE_SIZE 0x800 // 2KB -#define EEPROM_START_ADDRESS (0x8000000 + 256 * 1024 - 2 * EEPROM_PAGE_SIZE) // 256K firmware space -#define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE - -// -// Servos -// -#define SERVO0_PIN PA8 - -// -// Limit Switches -// -#define X_MIN_PIN PC12 -#define X_MAX_PIN PC11 -#define Y_MIN_PIN PC10 -#define Y_MAX_PIN PA15 -#define Z_MIN_PIN PA14 -#define Z_MAX_PIN PA13 - -// -// Steppers -// -#define X_STEP_PIN PB1 -#define X_DIR_PIN PB2 -#define X_ENABLE_PIN PB10 -#ifndef X_CS_PIN - #define X_CS_PIN PB0 -#endif - -#define Y_STEP_PIN PA2 -#define Y_DIR_PIN PC4 -#define Y_ENABLE_PIN PC5 -#ifndef Y_CS_PIN - #define Y_CS_PIN PA7 -#endif - -#define Z_STEP_PIN PA3 -#define Z_DIR_PIN PA5 -#define Z_ENABLE_PIN PA6 -#ifndef Z_CS_PIN - #define Z_CS_PIN PA4 -#endif - -#define E0_STEP_PIN PA1 -#define E0_DIR_PIN PC3 -#define E0_ENABLE_PIN PA0 -#ifndef E0_CS_PIN - #define E0_CS_PIN PC2 -#endif - -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PB15 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PB14 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PB13 - #endif -#endif - -#if HAS_TMC_UART - // - // Software serial - // - #define X_SERIAL_TX_PIN PB0 - #define X_SERIAL_RX_PIN PB0 - #define Y_SERIAL_TX_PIN PA7 - #define Y_SERIAL_RX_PIN PA7 - #define Z_SERIAL_TX_PIN PA4 - #define Z_SERIAL_RX_PIN PA4 - #define E0_SERIAL_TX_PIN PC2 - #define E0_SERIAL_RX_PIN PC2 -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC6 -#define HEATER_BED_PIN PC7 -#ifndef FAN_PIN - #define FAN_PIN PC8 -#endif -#define FAN1_PIN PC9 - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PC0 // Analog Input -#define TEMP_0_PIN PC1 // Analog Input - -// -// LCD Pins -// - -// -// LCD / Controller -// -#define ENABLE_SPI2 -#define SS_PIN PB12 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 - -#define SDSS SS_PIN -#define SD_DETECT_PIN PB11 - -#define BEEPER_PIN PC14 - -#define LCD_PINS_RS PB8 -#define LCD_PINS_ENABLE PB9 -#define LCD_PINS_D4 PB7 -#define LCD_PINS_D5 PB6 -#define LCD_PINS_D6 PB5 -#define LCD_PINS_D7 PB4 - -#define BTN_EN1 PD2 -#define BTN_EN2 PB3 -#define BTN_ENC PC13 - -// -// Filament runout -// - -// -// ST7920 Delays -// -#ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(96) -#endif -#ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(48) -#endif -#ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(715) -#endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h deleted file mode 100644 index ebe5964d05..0000000000 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ /dev/null @@ -1,196 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "FYSETC AIO II" -#define BOARD_WEBSITE_URL "fysetc.com" - -#define DISABLE_JTAG - -#define pins_v2_20190128 // new pins define - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Flash EEPROM Emulation -// -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB -#endif - -// -// Limit Switches -// -#define X_STOP_PIN PA1 -#define Y_STOP_PIN PA0 -#define Z_STOP_PIN PB14 - -// -// Filament runout -// -#ifdef pins_v2_20190128 - #define FIL_RUNOUT_PIN PB15 -#else - #define FIL_RUNOUT_PIN PB5 -#endif - -// -// Steppers -// -#define X_STEP_PIN PB8 -#define X_DIR_PIN PB9 -#define X_ENABLE_PIN PA8 - -#define Y_STEP_PIN PB2 -#ifdef pins_v2_20190128 - #define Y_DIR_PIN PB3 -#else - #define Y_DIR_PIN PB0 -#endif -#define Y_ENABLE_PIN PB1 - -#define Z_STEP_PIN PC0 -#define Z_DIR_PIN PC1 -#define Z_ENABLE_PIN PC2 - -#define E0_STEP_PIN PC15 -#define E0_DIR_PIN PC14 -#define E0_ENABLE_PIN PC13 - -#if HAS_TMC_UART - - /** - * TMC2208/TMC2209 stepper drivers - */ - - // - // Hardware serial with switch - // - #define X_HARDWARE_SERIAL MSerial1 - #define Y_HARDWARE_SERIAL MSerial1 - #define Z_HARDWARE_SERIAL MSerial1 - #define E0_HARDWARE_SERIAL MSerial1 - - // The 4xTMC2209 module doesn't have a serial multiplexer and - // needs to set *_SLAVE_ADDRESS in Configuration_adv.h for X,Y,Z,E0 - #if HAS_DRIVER(TMC2208) - #define TMC_SERIAL_MULTIPLEXER - #define SERIAL_MUL_PIN1 PB13 - #define SERIAL_MUL_PIN2 PB12 - #endif - -#endif - -// -// Stepper current PWM -// -#ifndef MOTOR_CURRENT_PWM_RANGE - #define MOTOR_CURRENT_PWM_RANGE 1500 // origin:2000 -#endif -#define DEFAULT_PWM_MOTOR_CURRENT { 500, 500, 400 } // origin: {1300,1300,1250} - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC7 -#define HEATER_BED_PIN PC6 -#ifndef FAN_PIN - #define FAN_PIN PC8 -#endif - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PC5 // Analog Input -#define TEMP_0_PIN PC4 // Analog Input - -// -// Misc. Functions -// -#define SDSS PA4 - -// -// LCD Pins -// -#if HAS_WIRED_LCD - - #define BEEPER_PIN PC9 - - #if HAS_MARLINUI_U8GLIB - - #define DOGLCD_A0 PA15 - #ifdef pins_v2_20190128 - #define DOGLCD_CS PB5 - #else - #define DOGLCD_CS PB7 - #endif - - //#define LCD_CONTRAST_INIT 190 - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - #endif - - // not connected to a pin - #define SD_DETECT_PIN PC3 - - #if ENABLED(NEWPANEL) - // The encoder and click button - #define BTN_EN1 PC10 - #define BTN_EN2 PC11 - #define BTN_ENC PC12 - #endif - - #ifdef pins_v2_20190128 - #define LCD_RESET_PIN PB4 - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PB0 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PB6 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PB7 - #endif - #else - #define LCD_RESET_PIN PB6 - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PB3 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PB4 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PB5 - #endif - #endif - -#endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h deleted file mode 100644 index de5ea45d44..0000000000 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define DEFAULT_MACHINE_NAME "3D Printer" - -#define BOARD_INFO_NAME "FYSETC Cheetah" -#define BOARD_WEBSITE_URL "fysetc.com" -// https://github.com/FYSETC/Cheetah - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -#define DISABLE_JTAG - -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB -#endif - -// -// Servos -// -#define SERVO0_PIN PA0 - -// -// Limit Switches -// -#define X_STOP_PIN PA1 -#define Y_STOP_PIN PB4 -#define Z_STOP_PIN PA15 - -// -// Filament runout -// -#define FIL_RUNOUT_PIN PB5 - -// -// Steppers -// -#define X_STEP_PIN PB8 -#define X_DIR_PIN PB9 -#define X_ENABLE_PIN PA8 - -#define Y_STEP_PIN PB2 -#define Y_DIR_PIN PB3 -#define Y_ENABLE_PIN PB1 - -#define Z_STEP_PIN PC0 -#define Z_DIR_PIN PC1 -#define Z_ENABLE_PIN PC2 - -#define E0_STEP_PIN PC15 -#define E0_DIR_PIN PC14 -#define E0_ENABLE_PIN PC13 - -#define X_HARDWARE_SERIAL MSerial2 -#define Y_HARDWARE_SERIAL MSerial2 -#define Z_HARDWARE_SERIAL MSerial2 -#define E0_HARDWARE_SERIAL MSerial2 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC6 -#define HEATER_BED_PIN PC7 -#ifndef FAN_PIN - #define FAN_PIN PC8 -#endif - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PC5 // Analog Input -#define TEMP_0_PIN PC4 // Analog Input - -// -// Misc. Functions -// -#define SDSS PA4 -#define SD_DETECT_PIN PC3 - -#ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PB0 -#endif -#ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PB7 -#endif -#ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PB6 -#endif - -/* -* EXP1 pinout for the LCD according to Fysetcs schematic for the Cheetah board -* _____ -* (Beeper) PC9 | 1 2 | PC12 (BTN_ENC) -* (BTN_EN2) PC11 | 3 4 | PB14 (LCD_RS / MISO) -* (BTN_EN1) PC10 5 6 | PB13 (SCK) -* (LCD_EN) PB12 | 7 8 | PB15 (MOSI) -* GND | 9 10| 5V -* ----- -* EXP1 -* Note: The pin-numbers match the connector correctly and are not in reverse order like on the Ender-3 board. -* Note: Functionally the pins are assigned in the same order as on the Ender-3 board. -* Note: Pin 4 on the Cheetah board is assigned to an I/O, it is assigned to RESET on the Ender-3 board. -*/ - -#if HAS_WIRED_LCD - #define BEEPER_PIN PC9 - - #if HAS_MARLINUI_U8GLIB - #define DOGLCD_A0 PB14 - #define DOGLCD_CS PB12 - #define DOGLCD_SCK PB13 - #define DOGLCD_MOSI PB15 - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - - #if EITHER(FYSETC_MINI_12864, U8GLIB_ST7920) - #define FORCE_SOFT_SPI - #endif - #endif - - #define LCD_PINS_RS PB12 // CS -- SOFT SPI for ENDER3 LCD - #define LCD_PINS_D4 PB13 // SCLK - #define LCD_PINS_ENABLE PB15 // DATA MOSI - - //#define LCD_CONTRAST_INIT 190 - - #if ENABLED(NEWPANEL) - #define BTN_EN1 PC10 - #define BTN_EN2 PC11 - #define BTN_ENC PC12 - #endif -#endif - -#if ENABLED(TOUCH_UI_FTDI_EVE) - #define BEEPER_PIN PC9 - #define CLCD_MOD_RESET PC11 - #define CLCD_SPI_CS PB12 - - //#define CLCD_USE_SOFT_SPI // the Cheetah can use hardware-SPI so we do not really need this - - #if ENABLED(CLCD_USE_SOFT_SPI) - #define CLCD_SOFT_SPI_MOSI PB15 - #define CLCD_SOFT_SPI_MISO PB14 - #define CLCD_SOFT_SPI_SCLK PB13 - #else - #define CLCD_SPI_BUS 2 - #endif -#endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h deleted file mode 100644 index 5e8bd11b4b..0000000000 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#include "pins_FYSETC_CHEETAH.h" - -#undef X_HARDWARE_SERIAL -#undef Y_HARDWARE_SERIAL -#undef Z_HARDWARE_SERIAL -#undef E0_HARDWARE_SERIAL - -#undef RGB_LED_R_PIN -#undef RGB_LED_G_PIN -#undef RGB_LED_B_PIN - -#define FAN1_PIN PB0 // Fan1 - -#if HAS_TMC_UART - - /** - * TMC2208/TMC2209 stepper drivers - */ - - // - // Software serial - // - #define X_SERIAL_TX_PIN PA11 - #define X_SERIAL_RX_PIN PA12 - - #define Y_SERIAL_TX_PIN PB6 - #define Y_SERIAL_RX_PIN PB7 - - #define Z_SERIAL_TX_PIN PB10 - #define Z_SERIAL_RX_PIN PB11 - - #define E0_SERIAL_TX_PIN PA2 - #define E0_SERIAL_RX_PIN PA3 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h deleted file mode 100644 index ca25c45a7b..0000000000 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ /dev/null @@ -1,241 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * 24 May 2018 - @chepo for STM32F103VET6 - * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "GTM32 Pro VB" -#define DEFAULT_MACHINE_NAME "STM32F103VET6" - -//#define DISABLE_DEBUG - -// -// It is required to disable JTAG function because its pins are -// used as GPIO to drive the Y axis stepper. -// DO NOT ENABLE! -// -#define DISABLE_JTAG - -// -// If you don't need the SWDIO functionality (any more), you may -// disable SWD here to regain PA13/PA14 pins for other use. -// -//#define DISABLE_JTAGSWD - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// Enable EEPROM Emulation for this board as it doesn't have EEPROM -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Limit Switches -// -#define X_MIN_PIN PE5 // ENDSTOPS 15,17 -#define X_MAX_PIN PE4 // ENDSTOPS 16,18 -#define Y_MIN_PIN PE3 // ENDSTOPS 9,11 -#define Y_MAX_PIN PE2 // ENDSTOPS 10,12 -#define Z_MIN_PIN PE1 // ENDSTOPS 3,5 -#define Z_MAX_PIN PE0 // ENDSTOPS 4,6 - -// -// Steppers -// -#define X_STEP_PIN PC6 -#define X_DIR_PIN PD13 -#define X_ENABLE_PIN PA8 - -#define Y_STEP_PIN PA12 -#define Y_DIR_PIN PA11 -#define Y_ENABLE_PIN PA15 - -#define Z_STEP_PIN PD6 -#define Z_DIR_PIN PD3 -#define Z_ENABLE_PIN PB3 - -// Extruder stepper pins -// NOTE: Numbering here is made according to EXT connector numbers, -// the FANx_PWM line numbering in the schematics is reverse. -// That is, E0_*_PIN are the E2_* lines connected to E2_A1 step -// stick that drives the EXT0 output on the board. -// -#define E0_STEP_PIN PC14 -#define E0_DIR_PIN PC13 -#define E0_ENABLE_PIN PC15 - -#define E1_STEP_PIN PA0 -#define E1_DIR_PIN PB6 -#define E1_ENABLE_PIN PA1 - -#define E2_STEP_PIN PB2 -#define E2_DIR_PIN PB11 -#define E2_ENABLE_PIN PC4 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PB0 // EXT0 port -#define HEATER_1_PIN PB5 // EXT1 port -#define HEATER_2_PIN PB4 // EXT2 port -#define HEATER_BED_PIN PB1 // CON2X3 hotbed port - -// -// These are FAN PWM pins on EXT0..EXT2 connectors. -// -//#define FAN_PIN PB9 // EXT0 port -#define FAN1_PIN PB8 // EXT1 port -#define FAN2_PIN PB7 // EXT2 port - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PB9 // EXT0 port, used as main extruder fan -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC2 // EXT0 port -#define TEMP_1_PIN PC1 // EXT1 port -#define TEMP_2_PIN PC0 // EXT2 port -#define TEMP_BED_PIN PC3 // CON2X3 hotbed port - -// -// Misc. Functions -// -#define LED_PWM PD12 // External LED, pin 2 on LED labeled connector - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - // - // LCD display on J2 FFC40 - // Geeetech's LCD2004A Control Panel is very much like - // RepRapDiscount Smart Controller, but adds an FFC40 connector - // - #define LCD_PINS_RS PE6 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE PE14 // SID (MOSI) - #define LCD_PINS_D4 PD8 // SCK (CLK) clock - #define LCD_PINS_D5 PD9 - #define LCD_PINS_D6 PD10 - #define LCD_PINS_D7 PE15 - - #else - // - // Serial LCDs can be implemented in ExtUI - // - //#define LCD_UART_TX PD8 - //#define LCD_UART_RX PD9 - #endif - - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) - #endif - #endif - -#endif // HAS_WIRED_LCD - -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - // - // Geeetech's LCD2004A Control Panel is very much like - // RepRapDiscount Smart Controller, but adds an FFC40 connector - // connected with a flat wire to J2 connector on the board. - // - #define BTN_EN1 PE8 - #define BTN_EN2 PE9 - #define BTN_ENC PE13 - - #define GTM32_PRO_VB_USE_LCD_BEEPER - #define GTM32_PRO_VB_USE_EXT_SDCARD -#endif - -// -// Beeper -// -#ifdef GTM32_PRO_VB_USE_LCD_BEEPER - // This is pin 32 on J2 FFC40 and pin, goes to the beeper - // on Geeetech's version of RepRapDiscount Smart Controller - // (e.g. on Rostock 301) - #define BEEPER_PIN PE12 -#else - // This is the beeper on the board itself - #define BEEPER_PIN PB10 -#endif - -/** - * The on-board TF_CARD_SOCKET microSD card socket has no SD Detect pin wired. - * - * The FFC10 (SD_CARD) connector has the same pins as those routed to the FFC40 (J2) - * connector, which usually go to the SD Card slot on the Geeetech version of the - * RepRapDiscount Smart Controller. Both connectors have the card detect signal. - * - * The on-board SD card and the external card (on either SD_CARD or J2) are two - * separate devices and can work simultaneously. Unfortunately, Marlin only supports - * a single SPI Flash device (as of 2019-07-05) so only one is enabled here. - */ -#if ENABLED(GTM32_PRO_VB_USE_EXT_SDCARD) - // - // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector - // - #define SS_PIN PC11 - #define SCK_PIN PC12 - #define MOSI_PIN PD2 - #define MISO_PIN PC8 - #define SD_DETECT_PIN PC7 -#else - // - // Use the on-board card socket labeled TF_CARD_SOCKET - // - #define SS_PIN PA4 - #define SCK_PIN PA5 - #define MOSI_PIN PA7 - #define MISO_PIN PA6 - #define SD_DETECT_PIN -1 // Card detect is not connected -#endif - -#define SDSS SS_PIN - -// -// ESP WiFi can be soldered to J9 connector which is wired to USART2. -// Must define WIFISUPPORT in Configuration.h for the printer. -// -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 -#define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h deleted file mode 100644 index 02fd3bcae7..0000000000 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * 24 May 2018 - @chepo for STM32F103VET6 - * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "GTM32 Pro VB" -#define DEFAULT_MACHINE_NAME "STM32F103VET6" - -//#define DISABLE_DEBUG - -// -// It is required to disable JTAG function because its pins are -// used as GPIO to drive the Y axis stepper. -// DO NOT ENABLE! -// -#define DISABLE_JTAG - -// -// If you don't need the SWDIO functionality (any more), you may -// disable SWD here to regain PA13/PA14 pins for other use. -// -//#define DISABLE_JTAGSWD - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// Enable EEPROM Emulation for this board as it doesn't have EEPROM -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Limit Switches -// -#define X_MIN_PIN PE5 // ENDSTOPS 15,17 -#define X_MAX_PIN PE4 // ENDSTOPS 16,18 -#define Y_MIN_PIN PE3 // ENDSTOPS 9,11 -#define Y_MAX_PIN PE2 // ENDSTOPS 10,12 -#define Z_MIN_PIN PE0 // ENDSTOPS 3,5 -#define Z_MAX_PIN PE1 // ENDSTOPS 4,6 - -// -// Steppers -// -#define X_STEP_PIN PC6 -#define X_DIR_PIN PD13 -#define X_ENABLE_PIN PA8 - -#define Y_STEP_PIN PA12 -#define Y_DIR_PIN PA11 -#define Y_ENABLE_PIN PA15 - -#define Z_STEP_PIN PD6 -#define Z_DIR_PIN PD3 -#define Z_ENABLE_PIN PB3 - -// Extruder stepper pins -// NOTE: Numbering here is made according to EXT connector numbers, -// the FANx_PWM line numbering in the schematics is reverse. -// That is, E0_*_PIN are the E2_* lines connected to E2_A1 step -// stick that drives the EXT0 output on the board. -// -#define E0_STEP_PIN PC14 -#define E0_DIR_PIN PC13 -#define E0_ENABLE_PIN PC15 - -#define E1_STEP_PIN PA0 -#define E1_DIR_PIN PB6 -#define E1_ENABLE_PIN PA1 - -#define E2_STEP_PIN PB2 -#define E2_DIR_PIN PB11 -#define E2_ENABLE_PIN PC4 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PB0 // EXT0 port -#define HEATER_1_PIN PB5 // EXT1 port -#define HEATER_2_PIN PB4 // EXT2 port -#define HEATER_BED_PIN PB1 // CON2X3 hotbed port - -// -// These are FAN PWM pins on EXT0..EXT2 connectors. -// -//#define FAN_PIN PB9 // EXT0 port -#define FAN1_PIN PB8 // EXT1 port -#define FAN2_PIN PB7 // EXT2 port - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PB9 // EXT0 port, used as main extruder fan -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC2 // EXT0 port -#define TEMP_1_PIN PC1 // EXT1 port -#define TEMP_2_PIN PC0 // EXT2 port -#define TEMP_BED_PIN PC3 // CON2X3 hotbed port - -// -// Misc. Functions -// -#define LED_PWM PD12 // External LED, pin 2 on LED labeled connector - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - // - // LCD display on J2 FFC40 - // Geeetech's LCD2004A Control Panel is very much like - // RepRapDiscount Smart Controller, but adds an FFC40 connector - // connected with a flat wire to J2 connector on the board. - // - #define LCD_PINS_RS PE6 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE PE14 // SID (MOSI) - #define LCD_PINS_D4 PD8 // SCK (CLK) clock - #define LCD_PINS_D5 PD9 - #define LCD_PINS_D6 PD10 - #define LCD_PINS_D7 PE15 - - #define BTN_EN1 PE8 - #define BTN_EN2 PE9 - #define BTN_ENC PE13 - - #define GTM32_PRO_VB_USE_LCD_BEEPER - #define GTM32_PRO_VB_USE_EXT_SDCARD - - #else - // - // Serial LCDs can be implemented in ExtUI - // - //#define LCD_UART_TX PD8 - //#define LCD_UART_RX PD9 - #endif - - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) - #endif - #endif - -#endif // HAS_WIRED_LCD - -// -// Beeper -// -#ifdef GTM32_PRO_VB_USE_LCD_BEEPER - // This is pin 32 on J2 FFC40 and pin, goes to the beeper - // on Geeetech's version of RepRapDiscount Smart Controller - // (e.g. on Rostock 301) - #define BEEPER_PIN PE12 -#else - // This is the beeper on the board itself - #define BEEPER_PIN PB10 -#endif - -/** - * The on-board TF_CARD_SOCKET microSD card socket has no SD Detect pin wired. - * - * The FFC10 (SD_CARD) connector has the same pins as those routed to the FFC40 (J2) - * connector, which usually go to the SD Card slot on the Geeetech version of the - * RepRapDiscount Smart Controller. Both connectors have the card detect signal. - * - * The on-board SD card and the external card (on either SD_CARD or J2) are two - * separate devices and can work simultaneously. Unfortunately, Marlin only supports - * a single SPI Flash device (as of 2019-07-05) so only one is enabled here. - */ -#if ENABLED(GTM32_PRO_VB_USE_EXT_SDCARD) - // - // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector - // - #define SS_PIN PC11 - #define SCK_PIN PC12 - #define MOSI_PIN PD2 - #define MISO_PIN PC8 - #define SD_DETECT_PIN PC7 -#else - // - // Use the on-board card socket labeled TF_CARD_SOCKET - // - #define SS_PIN PA4 - #define SCK_PIN PA5 - #define MOSI_PIN PA7 - #define MISO_PIN PA6 - #define SD_DETECT_PIN -1 // Card detect is not connected -#endif - -#define SDSS SS_PIN - -// -// ESP WiFi can be soldered to J9 connector which is wired to USART2. -// Must define WIFISUPPORT in Configuration.h for the printer. -// -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 -#define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h deleted file mode 100644 index ca25c45a7b..0000000000 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ /dev/null @@ -1,241 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * 24 May 2018 - @chepo for STM32F103VET6 - * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "GTM32 Pro VB" -#define DEFAULT_MACHINE_NAME "STM32F103VET6" - -//#define DISABLE_DEBUG - -// -// It is required to disable JTAG function because its pins are -// used as GPIO to drive the Y axis stepper. -// DO NOT ENABLE! -// -#define DISABLE_JTAG - -// -// If you don't need the SWDIO functionality (any more), you may -// disable SWD here to regain PA13/PA14 pins for other use. -// -//#define DISABLE_JTAGSWD - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// Enable EEPROM Emulation for this board as it doesn't have EEPROM -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Limit Switches -// -#define X_MIN_PIN PE5 // ENDSTOPS 15,17 -#define X_MAX_PIN PE4 // ENDSTOPS 16,18 -#define Y_MIN_PIN PE3 // ENDSTOPS 9,11 -#define Y_MAX_PIN PE2 // ENDSTOPS 10,12 -#define Z_MIN_PIN PE1 // ENDSTOPS 3,5 -#define Z_MAX_PIN PE0 // ENDSTOPS 4,6 - -// -// Steppers -// -#define X_STEP_PIN PC6 -#define X_DIR_PIN PD13 -#define X_ENABLE_PIN PA8 - -#define Y_STEP_PIN PA12 -#define Y_DIR_PIN PA11 -#define Y_ENABLE_PIN PA15 - -#define Z_STEP_PIN PD6 -#define Z_DIR_PIN PD3 -#define Z_ENABLE_PIN PB3 - -// Extruder stepper pins -// NOTE: Numbering here is made according to EXT connector numbers, -// the FANx_PWM line numbering in the schematics is reverse. -// That is, E0_*_PIN are the E2_* lines connected to E2_A1 step -// stick that drives the EXT0 output on the board. -// -#define E0_STEP_PIN PC14 -#define E0_DIR_PIN PC13 -#define E0_ENABLE_PIN PC15 - -#define E1_STEP_PIN PA0 -#define E1_DIR_PIN PB6 -#define E1_ENABLE_PIN PA1 - -#define E2_STEP_PIN PB2 -#define E2_DIR_PIN PB11 -#define E2_ENABLE_PIN PC4 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PB0 // EXT0 port -#define HEATER_1_PIN PB5 // EXT1 port -#define HEATER_2_PIN PB4 // EXT2 port -#define HEATER_BED_PIN PB1 // CON2X3 hotbed port - -// -// These are FAN PWM pins on EXT0..EXT2 connectors. -// -//#define FAN_PIN PB9 // EXT0 port -#define FAN1_PIN PB8 // EXT1 port -#define FAN2_PIN PB7 // EXT2 port - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PB9 // EXT0 port, used as main extruder fan -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC2 // EXT0 port -#define TEMP_1_PIN PC1 // EXT1 port -#define TEMP_2_PIN PC0 // EXT2 port -#define TEMP_BED_PIN PC3 // CON2X3 hotbed port - -// -// Misc. Functions -// -#define LED_PWM PD12 // External LED, pin 2 on LED labeled connector - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - // - // LCD display on J2 FFC40 - // Geeetech's LCD2004A Control Panel is very much like - // RepRapDiscount Smart Controller, but adds an FFC40 connector - // - #define LCD_PINS_RS PE6 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE PE14 // SID (MOSI) - #define LCD_PINS_D4 PD8 // SCK (CLK) clock - #define LCD_PINS_D5 PD9 - #define LCD_PINS_D6 PD10 - #define LCD_PINS_D7 PE15 - - #else - // - // Serial LCDs can be implemented in ExtUI - // - //#define LCD_UART_TX PD8 - //#define LCD_UART_RX PD9 - #endif - - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) - #endif - #endif - -#endif // HAS_WIRED_LCD - -#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - // - // Geeetech's LCD2004A Control Panel is very much like - // RepRapDiscount Smart Controller, but adds an FFC40 connector - // connected with a flat wire to J2 connector on the board. - // - #define BTN_EN1 PE8 - #define BTN_EN2 PE9 - #define BTN_ENC PE13 - - #define GTM32_PRO_VB_USE_LCD_BEEPER - #define GTM32_PRO_VB_USE_EXT_SDCARD -#endif - -// -// Beeper -// -#ifdef GTM32_PRO_VB_USE_LCD_BEEPER - // This is pin 32 on J2 FFC40 and pin, goes to the beeper - // on Geeetech's version of RepRapDiscount Smart Controller - // (e.g. on Rostock 301) - #define BEEPER_PIN PE12 -#else - // This is the beeper on the board itself - #define BEEPER_PIN PB10 -#endif - -/** - * The on-board TF_CARD_SOCKET microSD card socket has no SD Detect pin wired. - * - * The FFC10 (SD_CARD) connector has the same pins as those routed to the FFC40 (J2) - * connector, which usually go to the SD Card slot on the Geeetech version of the - * RepRapDiscount Smart Controller. Both connectors have the card detect signal. - * - * The on-board SD card and the external card (on either SD_CARD or J2) are two - * separate devices and can work simultaneously. Unfortunately, Marlin only supports - * a single SPI Flash device (as of 2019-07-05) so only one is enabled here. - */ -#if ENABLED(GTM32_PRO_VB_USE_EXT_SDCARD) - // - // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector - // - #define SS_PIN PC11 - #define SCK_PIN PC12 - #define MOSI_PIN PD2 - #define MISO_PIN PC8 - #define SD_DETECT_PIN PC7 -#else - // - // Use the on-board card socket labeled TF_CARD_SOCKET - // - #define SS_PIN PA4 - #define SCK_PIN PA5 - #define MOSI_PIN PA7 - #define MISO_PIN PA6 - #define SD_DETECT_PIN -1 // Card detect is not connected -#endif - -#define SDSS SS_PIN - -// -// ESP WiFi can be soldered to J9 connector which is wired to USART2. -// Must define WIFISUPPORT in Configuration.h for the printer. -// -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 -#define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h deleted file mode 100644 index fc18263fdd..0000000000 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ /dev/null @@ -1,238 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * 24 May 2018 - @chepo for STM32F103VET6 - * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "GTM32 Pro VB" -#define DEFAULT_MACHINE_NAME "M201" - -//#define DISABLE_DEBUG - -// -// It is required to disable JTAG function because its pins are -// used as GPIO to drive the Y axis stepper. -// DO NOT ENABLE! -// -#define DISABLE_JTAG - -// -// If you don't need the SWDIO functionality (any more), you may -// disable SWD here to regain PA13/PA14 pins for other use. -// -//#define DISABLE_JTAGSWD - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// Enable EEPROM Emulation for this board as it doesn't have EEPROM -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Limit Switches -// -#define X_MIN_PIN PE5 // ENDSTOPS 15,17 -#define X_MAX_PIN PE4 // ENDSTOPS 16,18 -#define Y_MIN_PIN PE3 // ENDSTOPS 9,11 -#define Y_MAX_PIN PE2 // ENDSTOPS 10,12 -#define Z_MIN_PIN PE1 // ENDSTOPS 3,5 -#define Z_MAX_PIN PE0 // ENDSTOPS 4,6 - -// -// Steppers -// -#define X_STEP_PIN PC6 -#define X_DIR_PIN PD13 -#define X_ENABLE_PIN PA8 - -#define Y_STEP_PIN PA12 -#define Y_DIR_PIN PA11 -#define Y_ENABLE_PIN PA15 - -#define Z_STEP_PIN PD6 -#define Z_DIR_PIN PD3 -#define Z_ENABLE_PIN PB3 - -// Extruder stepper pins -// NOTE: Numbering here is made according to EXT connector numbers, -// the FANx_PWM line numbering in the schematics is reverse. -// That is, E0_*_PIN are the E2_* lines connected to E2_A1 step -// stick that drives the EXT0 output on the board. -// -#define E0_STEP_PIN PC14 -#define E0_DIR_PIN PC13 -#define E0_ENABLE_PIN PC15 - -#define E1_STEP_PIN PA0 -#define E1_DIR_PIN PB6 -#define E1_ENABLE_PIN PA1 - -#define E2_STEP_PIN PB2 -#define E2_DIR_PIN PB11 -#define E2_ENABLE_PIN PC4 - -// -// Heaters / Fans - INFO: Extruders ports are in reverse order. Pin numbers here differ from schematic. Original firmware assumes heater, fan and temp sensor on port EXT0 PB0, PB9, PC2. -// -#define HEATER_0_PIN PB0 // EXT0 port. -#define HEATER_1_PIN PB5 // EXT1 port -#define HEATER_2_PIN PB4 // EXT2 port -#define HEATER_BED_PIN PB1 // CON2X3 hotbed port - -// -// These are FAN PWM pins on EXT0..EXT2 connectors. -// -//#define FAN_PIN PB9 // EXT0 port -#define FAN1_PIN PB8 // EXT1 port -#define FAN2_PIN PB7 // EXT2 port - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PB9 // EXT0 port, used as main extruder fan -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC2 // EXT0 port -#define TEMP_1_PIN PC1 // EXT1 port -#define TEMP_2_PIN PC0 // EXT2 port -#define TEMP_BED_PIN PC3 // CON2X3 hotbed port - -// -// Misc. Functions -// -#define LED_PWM PD12 // External LED, pin 2 on LED labeled connector - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - // - // LCD display on J2 FFC40 - // Geeetech's LCD2004A Control Panel is very much like - // RepRapDiscount Smart Controller, but adds an FFC40 connector - // connected with a flat wire to J2 connector on the board. - // - #define LCD_PINS_RS PA12 // CS chip select /SS chip slave select - // RW is hardwired to VSS - #define LCD_PINS_ENABLE PC7 // SID (MOSI) - #define LCD_PINS_D4 PD1 // SCK (CLK) clock - #define LCD_PINS_D5 PD4 - #define LCD_PINS_D6 PD5 - #define LCD_PINS_D7 PD7 - - #define BTN_EN1 PE8 - #define BTN_EN2 PE9 - #define BTN_ENC PE13 - - //#define GTM32_PRO_VB_USE_LCD_BEEPER - #define GTM32_PRO_VB_USE_EXT_SDCARD - - #else - // - // Serial LCDs can be implemented in ExtUI - // - //#define LCD_UART_TX PD8 - //#define LCD_UART_RX PD9 - #endif - - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) - #endif - #endif - -#endif // HAS_WIRED_LCD - -// -// Beeper -// -#ifdef GTM32_PRO_VB_USE_LCD_BEEPER - // This is pin 32 on J2 FFC40 and pin, goes to the beeper - // on Geeetech's version of RepRapDiscount Smart Controller - // (e.g. on Rostock 301) - #define BEEPER_PIN PE12 -#else - // This is the beeper on the board itself - #define BEEPER_PIN PB10 -#endif - -/** - * The on-board TF_CARD_SOCKET microSD card socket has no SD Detect pin wired. - * - * The FFC10 (SD_CARD) connector has the same pins as those routed to the FFC40 (J2) - * connector, which usually go to the SD Card slot on the Geeetech version of the - * RepRapDiscount Smart Controller. Both connectors have the card detect signal. - * - * The on-board SD card and the external card (on either SD_CARD or J2) are two - * separate devices and can work simultaneously. Unfortunately, Marlin only supports - * a single SPI Flash device (as of 2019-07-05) so only one is enabled here. - */ -#if ENABLED(GTM32_PRO_VB_USE_EXT_SDCARD) - // - // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector - // - #define SS_PIN PB12 // PC11 - #define SCK_PIN PB13 // PC12 // PC1 - #define MOSI_PIN PB15 // PD2 // PD2 - #define MISO_PIN PB14 // PC8 - #define SD_DETECT_PIN PC7 - -#else - // - // Use the on-board card socket labeled TF_CARD_SOCKET - // - #define SS_PIN PA4 - #define SCK_PIN PA5 - #define MOSI_PIN PA7 - #define MISO_PIN PA6 // PA6 - #define SD_DETECT_PIN -1 // Card detect is not connected -#endif - -#define SDSS SS_PIN - -// -// ESP WiFi can be soldered to J9 connector which is wired to USART2. -// Must define WIFISUPPORT in Configuration.h for the printer. -// -#define ESP_WIFI_MODULE_COM 2 -#define ESP_WIFI_MODULE_BAUDRATE 115200 -#define ESP_WIFI_MODULE_RESET_PIN -1 diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h deleted file mode 100644 index 3c277233d7..0000000000 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - - /** - * ╦╔═╗╔═╗┬ ┬┬─┐┌─┐┬─┐┌─┐╔═╗┌─┐┬─┐┬ ┬┌┬┐ ┌─┐┌─┐┌┬┐ - * ║║ ╦╠═╣│ │├┬┘│ │├┬┘├─┤╠╣ │ │├┬┘│ ││││ │ │ ││││ - * ╚╝╚═╝╩ ╩└─┘┴└─└─┘┴└─┴ ┴╚ └─┘┴└─└─┘┴ ┴o└─┘└─┘┴ ┴ - * Pin assignments for 32-bit JGAurora A5S & A1 - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 - #error "JGAurora 32-bit board only supports 1 hotend / E-stepper. Comment out this line to continue." -#endif -#define BOARD_INFO_NAME "JGAurora A5S A1 board" - -#ifndef STM32_XL_DENSITY - #define STM32_XL_DENSITY -#endif - -//#define MCU_STM32F103ZE // not yet required -// Enable EEPROM Emulation for this board, so that we don't overwrite factory data - -//#define I2C_EEPROM // AT24C64 -//#define MARLIN_EEPROM_SIZE 0x8000UL // 64KB - -//#define FLASH_EEPROM_EMULATION -//#define MARLIN_EEPROM_SIZE 0x1000UL // 4KB -//#define MARLIN_EEPROM_SIZE (EEPROM_START_ADDRESS + (EEPROM_PAGE_SIZE) * 2UL) - -//#define EEPROM_CHITCHAT -//#define DEBUG_EEPROM_READWRITE - -// -// Limit Switches -// -#define X_STOP_PIN PC6 -#define Y_STOP_PIN PG8 -#define Z_STOP_PIN PG7 -//#define X_MAX_PIN PC5 -//#define Y_MAX_PIN PC4 -//#define Z_MAX_PIN PB0 - -// -// Steppers -// -#define X_STEP_PIN PD6 -#define X_DIR_PIN PD3 -#define X_ENABLE_PIN PG9 - -#define Y_STEP_PIN PG12 -#define Y_DIR_PIN PG11 -#define Y_ENABLE_PIN PG13 - -#define Z_STEP_PIN PG15 -#define Z_DIR_PIN PG14 -#define Z_ENABLE_PIN PB8 - -#define E0_STEP_PIN PE2 -#define E0_DIR_PIN PB9 -#define E0_ENABLE_PIN PE3 - -#define E1_STEP_PIN PE5 -#define E1_DIR_PIN PE4 -#define E1_ENABLE_PIN PE6 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC2 -#define TEMP_BED_PIN PC1 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA2 -#define HEATER_BED_PIN PA3 - -#define FAN_PIN PA1 - -#define FIL_RUNOUT_PIN PC7 - -// -// LCD -// -#define LCD_BACKLIGHT_PIN PF11 -#define FSMC_CS_PIN PD7 -#define FSMC_RS_PIN PG0 - -#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT -#define FSMC_DMA_DEV DMA2 -#define FSMC_DMA_CHANNEL DMA_CH5 - -// -// SD Card -// -#define SD_DETECT_PIN PF10 - -// -// Misc. -// -#define BEEPER_PIN PC3 // use PB7 to shut up if desired -#define LED_PIN PC13 - -// -// Touch support -// -#if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PA4 - #define TOUCH_INT_PIN PC4 -#endif diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h deleted file mode 100644 index af81bbebe2..0000000000 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Longer3D LK1/LK2 & Alfawise U20/U30 (STM32F103VET6) board pin assignments - */ - -#if NOT_TARGET(__STM32F1__, STM32F1xx) - #error "Oops! Select a STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 - #error "Longer3D board only supports 1 hotend / E-stepper. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Longer3D" -#define ALFAWISE_UX0 // Common to all Longer3D STM32F1 boards (used for Open drain mosfets) - -//#define DISABLE_DEBUG // We still want to debug with STLINK... -#define DISABLE_JTAG // We free the jtag pins (PA15) but keep STLINK - // Release PB4 (STEP_X_PIN) from JTAG NRST role. -// -// Limit Switches -// -#define X_MIN_PIN PC1 // pin 16 -#define X_MAX_PIN PC0 // pin 15 (Filament sensor on Alfawise setup) -#define Y_MIN_PIN PC15 // pin 9 -#define Y_MAX_PIN PC14 // pin 8 (Unused in stock Alfawise setup) -#define Z_MIN_PIN PE6 // pin 5 Standard Endstop or Z_Probe endstop function -#define Z_MAX_PIN PE5 // pin 4 (Unused in stock Alfawise setup) - // May be used for BLTouch Servo function on older variants (<= V08) -#define ONBOARD_ENDSTOPPULLUPS - -// -// Filament Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PC0 // XMAX plug on PCB used as filament runout sensor on Alfawise boards (inverting true) -#endif - -// -// Steppers -// -#define X_ENABLE_PIN PB5 // pin 91 -#define X_STEP_PIN PB4 // pin 90 -#define X_DIR_PIN PB3 // pin 89 - -#define Y_ENABLE_PIN PB8 // pin 95 -#define Y_STEP_PIN PB7 // pin 93 -#define Y_DIR_PIN PB6 // pin 92 - -#define Z_ENABLE_PIN PE1 // pin 98 -#define Z_STEP_PIN PE0 // pin 97 -#define Z_DIR_PIN PB9 // pin 96 - -#define E0_ENABLE_PIN PE4 // pin 3 -#define E0_STEP_PIN PE3 // pin 2 -#define E0_DIR_PIN PE2 // pin 1 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA0 // pin 23 (Nozzle 100K/3950 thermistor) -#define TEMP_BED_PIN PA1 // pin 24 (Hot Bed 100K/3950 thermistor) - -// -// Heaters / Fans -// -#define HEATER_0_PIN PD3 // pin 84 (Nozzle Heat Mosfet) -#define HEATER_BED_PIN PA8 // pin 67 (Hot Bed Mosfet) - -#define FAN_PIN PA15 // pin 77 (4cm Fan) -#define FAN_SOFT_PWM // Required to avoid issues with heating or STLink -#define FAN_MIN_PWM 35 // Fan will not start in 1-30 range -#define FAN_MAX_PWM 255 - -//#define BEEPER_PIN PD13 // pin 60 (Servo PWM output 5V/GND on Board V0G+) made for BL-Touch sensor - // Can drive a PC Buzzer, if connected between PWM and 5V pins - -#define LED_PIN PC2 // pin 17 - -// -// PWM for a servo probe -// Other servo devices are not supported on this board! -// -#if HAS_Z_SERVO_PROBE - #define SERVO0_PIN PD13 // Open drain PWM pin on the V0G (GND or floating 5V) - #define SERVO0_PWM_OD // Comment this if using PE5 - - //#define SERVO0_PIN PE5 // Pulled up PWM pin on the V08 (3.3V or 0) - //#undef Z_MAX_PIN // Uncomment if using ZMAX connector (PE5) -#endif - -/** - * Note: Alfawise screens use various TFT controllers. Supported screens - * are based on the ILI9341, ILI9328 and ST7798V. Define init sequences for - * other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp - * - * If the screen stays white, disable 'LCD_RESET_PIN' to let the bootloader - * init the screen. - * - * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu - * because Marlin uses the reset as a failsafe to revive a glitchy LCD. - */ - -#define TFT_RESET_PIN PC4 // pin 33 -#define TFT_BACKLIGHT_PIN PD12 // pin 59 -#define FSMC_CS_PIN PD7 // pin 88 = FSMC_NE1 -#define FSMC_RS_PIN PD11 // pin 58 A16 Register. Only one address needed - -#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT -#define FSMC_DMA_DEV DMA2 -#define FSMC_DMA_CHANNEL DMA_CH5 - -#define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h -#define DOGLCD_SCK -1 - -// Longer/Alfawise TFT -#define LONGER_LK_TFT28 - -// Buffer for Color UI -#define TFT_BUFFER_SIZE 3200 - -/** - * Note: Alfawise U20/U30 boards DON'T use SPI2, as the hardware designer - * mixed up MOSI and MISO pins. SPI is managed in SW, and needs pins - * declared below. - */ -#if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PB12 // pin 51 SPI2_NSS - #define TOUCH_SCK_PIN PB13 // pin 52 - #define TOUCH_MOSI_PIN PB14 // pin 53 - #define TOUCH_MISO_PIN PB15 // pin 54 - #define TOUCH_INT_PIN PC6 // pin 63 (PenIRQ coming from ADS7843) -#endif - -// -// Persistent Storage -// If no option is selected below the SD Card will be used -// -#if NO_EEPROM_SELECTED - //#define SPI_EEPROM - #define FLASH_EEPROM_EMULATION -#endif - -#if ENABLED(SPI_EEPROM) - // SPI1 EEPROM Winbond W25Q64 (8MB/64Mbits) - #define SPI_CHAN_EEPROM1 1 - #define SPI_EEPROM1_CS PC5 // pin 34 - #define EEPROM_SCK BOARD_SPI1_SCK_PIN // PA5 pin 30 - #define EEPROM_MISO BOARD_SPI1_MISO_PIN // PA6 pin 31 - #define EEPROM_MOSI BOARD_SPI1_MOSI_PIN // PA7 pin 32 - #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) - #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64KB for now... -#elif ENABLED(FLASH_EEPROM_EMULATION) - // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE (EEPROM_PAGE_SIZE) -#else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h deleted file mode 100644 index 95e7e92174..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MALYAN M200 pin assignments - */ - -#if NOT_TARGET(__STM32F1__, STM32F1xx, STM32F0xx) - #error "Oops! Select an STM32 board in your IDE." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Malyan M200" -#endif - -// Prevents hanging from an extra watchdog init -#define DISABLE_WATCHDOG_INIT - -// Assume Flash EEPROM -#if NO_EEPROM_SELECTED - #define FLASH_EEPROM_EMULATION -#endif - -#define SDSS SS_PIN - -// Based on PWM timer usage, we have to use these timers and soft PWM for the fans -// On STM32F103: -// PB3, PB6, PB7, and PB8 can be used with pwm, which rules out TIM2 and TIM4. -// On STM32F070, 16 and 17 are in use, but 1 and 3 are available. -#define STEP_TIMER 1 -#define TEMP_TIMER 3 - -// -// Limit Switches -// -#define X_MIN_PIN PB4 -#define Y_MIN_PIN PA15 -#define Z_MIN_PIN PB5 - -// -// Steppers -// -// X & Y enable are the same -#define X_STEP_PIN PB14 -#define X_DIR_PIN PB15 -#define X_ENABLE_PIN PA8 - -#define Y_STEP_PIN PB12 -#define Y_DIR_PIN PB13 -#define Y_ENABLE_PIN PA8 - -#define Z_STEP_PIN PB10 -#define Z_DIR_PIN PB2 -#define Z_ENABLE_PIN PB11 - -#define E0_STEP_PIN PB0 -#define E0_DIR_PIN PC13 -#define E0_ENABLE_PIN PB1 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA0 // Analog Input (HOTEND0 thermistor) -#define TEMP_BED_PIN PA1 // Analog Input (BED thermistor) - -// -// Heaters / Fans -// -#define HEATER_0_PIN PB6 // HOTEND0 MOSFET -#define HEATER_BED_PIN PB7 // BED MOSFET - -#define MALYAN_FAN1_PIN PB8 // FAN1 header on board - PRINT FAN -#define MALYAN_FAN2_PIN PB3 // FAN2 header on board - CONTROLLER FAN - -#define FAN1_PIN MALYAN_FAN2_PIN diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h deleted file mode 100644 index 8831d6804b..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ /dev/null @@ -1,213 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin (STM32F130ZET6) board pin assignments - * - * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware - */ - -#if NOT_TARGET(STM32F1, STM32F1xx) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS Robin supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS Robin" - -// -// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role -// -#define DISABLE_JTAG - -// -// Enable SD EEPROM to prevent infinite boot loop -// -#ifdef ARDUINO_ARCH_STM32 - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE (EEPROM_PAGE_SIZE) -#else - #define SDCARD_EEPROM_EMULATION -#endif - -// -// Servos -// -#define SERVO0_PIN PC3 // XS1 - 5 -#define SERVO1_PIN PA1 // XS1 - 6 -#define SERVO2_PIN PF9 // XS2 - 5 -#define SERVO3_PIN PF8 // XS2 - 6 - -// -// Limit Switches -// -#define X_MIN_PIN PB12 -#define X_MAX_PIN PB0 -#define Y_MIN_PIN PC5 -#define Y_MAX_PIN PC4 -#define Z_MIN_PIN PA4 -#define Z_MAX_PIN PF7 - -// -// Steppers -// -#define X_ENABLE_PIN PB9 -#define X_STEP_PIN PB8 -#define X_DIR_PIN PB5 - -#define Y_ENABLE_PIN PB4 -#define Y_STEP_PIN PG15 -#define Y_DIR_PIN PG10 - -#define Z_ENABLE_PIN PD7 -#define Z_STEP_PIN PD3 -#define Z_DIR_PIN PG14 - -#define E0_ENABLE_PIN PG13 -#define E0_STEP_PIN PG8 -#define E0_DIR_PIN PA15 - -#define E1_ENABLE_PIN PA12 -#define E1_STEP_PIN PA11 -#define E1_DIR_PIN PA8 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC1 // TH1 -#define TEMP_1_PIN PC2 // TH2 -#define TEMP_BED_PIN PC0 // TB1 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC7 // HEATER1 -#define HEATER_1_PIN PA6 // HEATER2 -#define HEATER_BED_PIN PC6 // HOT BED - -#define FAN_PIN PA7 // FAN - -/** - * Note: MKS Robin board is using SPI2 interface. Make sure your stm32duino library is configured accordingly - */ -//#define MAX6675_SS_PIN PE5 // TC1 - CS1 -//#define MAX6675_SS_PIN PE6 // TC2 - CS2 - -#define POWER_LOSS_PIN PA2 // PW_DET -#define PS_ON_PIN PA3 // PW_OFF -#define FIL_RUNOUT_PIN PF11 // MT_DET - -#ifdef ARDUINO_ARCH_STM32F1 - #define BEEPER_PIN PC13 -#else - #define BEEPER_PIN -1 -#endif -#define LED_PIN PB2 - -#if HAS_FSMC_TFT - /** - * Note: MKS Robin TFT screens use various TFT controllers - * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) - * ILI9488 is not supported - * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp - * - * If the screen stays white, disable 'LCD_RESET_PIN' - * to let the bootloader init the screen. - * - * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu - * because Marlin uses the reset as a failsafe to revive a glitchy LCD. - */ - //#define LCD_RESET_PIN PF6 - #define LCD_BACKLIGHT_PIN PG11 - #define FSMC_CS_PIN PG12 // NE4 - #define FSMC_RS_PIN PF0 // A0 - #define TFT_CS_PIN FSMC_CS_PIN - #define TFT_RS_PIN FSMC_RS_PIN - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 -#elif HAS_GRAPHICAL_TFT - #define TFT_RESET_PIN PF6 - #define TFT_BACKLIGHT_PIN PG11 - #define TFT_CS_PIN PG12 // NE4 - #define TFT_RS_PIN PF0 // A0 -#endif - -#if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PB1 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - #define TOUCH_INT_PIN -1 -#endif - -// SPI1(PA7) & SPI3(PB5) not available -#define ENABLE_SPI2 - -#if ENABLED(SDIO_SUPPORT) - #define SCK_PIN PB13 // SPI2 - #define MISO_PIN PB14 // SPI2 - #define MOSI_PIN PB15 // SPI2 - #define SD_DETECT_PIN PF12 // SD_CD -#else - // SD as custom software SPI (SDIO pins) - #define SCK_PIN PC12 - #define MISO_PIN PC8 - #define MOSI_PIN PD2 - #define SS_PIN -1 - #define ONBOARD_SD_CS_PIN PC11 - #define SDSS PD2 - #define SD_DETECT_PIN -1 -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL MSerial1 - //#define Y_HARDWARE_SERIAL MSerial1 - //#define Z_HARDWARE_SERIAL MSerial1 - //#define E0_HARDWARE_SERIAL MSerial1 - //#define E1_HARDWARE_SERIAL MSerial1 - - // Unused servo pins may be repurposed with SoftwareSerialM - //#define X_SERIAL_TX_PIN PF8 // SERVO3_PIN -- XS2 - 6 - //#define Y_SERIAL_TX_PIN PF9 // SERVO2_PIN -- XS2 - 5 - //#define Z_SERIAL_TX_PIN PA1 // SERVO1_PIN -- XS1 - 6 - //#define E0_SERIAL_TX_PIN PC3 // SERVO0_PIN -- XS1 - 5 - //#define X_SERIAL_RX_PIN X_SERIAL_TX_PIN - //#define Y_SERIAL_RX_PIN Y_SERIAL_TX_PIN - //#define Z_SERIAL_RX_PIN Z_SERIAL_TX_PIN - //#define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN - - // Reduce baud rate for software serial reliability - #if HAS_TMC_SW_SERIAL - #define TMC_BAUD_RATE 19200 - #endif -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h deleted file mode 100644 index 2028cd9dd4..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin E3 (STM32F103RCT6) board pin assignments - */ - -#if HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin E3 supports up to 1 hotends / E-steppers. Comment out this line to continue." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "MKS Robin E3" -#endif - -#include "pins_MKS_ROBIN_E3_common.h" diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h deleted file mode 100644 index d1f6dece5c..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin E3D (STM32F103RCT6) board pin assignments - */ - -#if HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin E3D supports up to 1 hotends / E-steppers. Comment out this line to continue." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "MKS Robin E3D" -#endif - -// -// Steppers -// -#ifndef X_CS_PIN - #define X_CS_PIN PC7 -#endif -#ifndef Y_CS_PIN - #define Y_CS_PIN PD2 -#endif -#ifndef Z_CS_PIN - #define Z_CS_PIN PC12 -#endif -#ifndef E0_CS_PIN - #define E0_CS_PIN PC11 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PB15 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PB14 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PB13 - #endif -#endif - -#include "pins_MKS_ROBIN_E3_common.h" diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h deleted file mode 100644 index 94a28953cc..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ /dev/null @@ -1,376 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin nano (STM32F130VET6) board pin assignments - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin e3p supports up to 1 hotends / E-steppers. Comment out this line to continue." -#elif HAS_FSMC_TFT - #error "MKS Robin e3p doesn't support FSMC-based TFT displays." -#endif - -#define BOARD_INFO_NAME "MKS Robin e3p" - -// -// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role -// - -#define DISABLE_DEBUG - -// -// EEPROM -// -//#define FLASH_EEPROM_EMULATION -//#define SDCARD_EEPROM_EMULATION - -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) - #define I2C_EEPROM // EEPROM on I2C-0 - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Note: MKS Robin board is using SPI2 interface. -// -//#define SPI_MODULE 2 -#define ENABLE_SPI2 - -// -// Limit Switches -// -#define X_DIAG_PIN PA15 -#define Y_DIAG_PIN PA12 -#define Z_DIAG_PIN PA11 -#define E0_DIAG_PIN PC4 - -#define X_STOP_PIN PA15 -#define Y_STOP_PIN PA12 -#define Z_MIN_PIN PA11 -#define Z_MAX_PIN PC4 - -// -// Steppers -// -#define X_ENABLE_PIN PE4 -#define X_STEP_PIN PE3 -#define X_DIR_PIN PE2 -#ifndef X_CS_PIN - #define X_CS_PIN PD5 -#endif - -#define Y_ENABLE_PIN PE1 -#define Y_STEP_PIN PE0 -#define Y_DIR_PIN PB9 -#ifndef Y_CS_PIN - #define Y_CS_PIN PD7 -#endif - -#define Z_ENABLE_PIN PB8 -#define Z_STEP_PIN PB5 -#define Z_DIR_PIN PB4 -#ifndef Z_CS_PIN - #define Z_CS_PIN PD4 -#endif - -#define E0_ENABLE_PIN PB3 -#define E0_STEP_PIN PD6 -#define E0_DIR_PIN PD3 -#ifndef E0_CS_PIN - #define E0_CS_PIN PD9 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PD14 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PD1 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PD0 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - - #define X_SERIAL_TX_PIN PD5 - #define X_SERIAL_RX_PIN PD5 - - #define Y_SERIAL_TX_PIN PD7 - #define Y_SERIAL_RX_PIN PD7 - - #define Z_SERIAL_TX_PIN PD4 - #define Z_SERIAL_RX_PIN PD4 - - #define E0_SERIAL_TX_PIN PD9 - #define E0_SERIAL_RX_PIN PD9 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif // TMC2208 || TMC2209 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC1 // TH1 -#define TEMP_BED_PIN PC0 // TB1 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC3 // HEATER1 -#define HEATER_BED_PIN PA0 // HOT BED - -#define FAN_PIN PB1 // FAN - -// -// Misc. Functions -// -#if HAS_TFT_LVGL_UI - //#define MKSPWC - #ifdef MKSPWC - #define SUICIDE_PIN PB2 // Enable MKSPWC SUICIDE PIN - #define SUICIDE_PIN_INVERTING false // Enable MKSPWC PIN STATE - #define KILL_PIN PA2 // Enable MKSPWC DET PIN - #define KILL_PIN_STATE true // Enable MKSPWC PIN STATE - #endif - - #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN - #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE - - #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN - #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN - #define WIFI_RESET_PIN PE9 // MKS ESP WIFI RESET PIN - - #if ENABLED(MKS_TEST) - #define MKS_TEST_POWER_LOSS_PIN PA2 // PW_DET - #define MKS_TEST_PS_ON_PIN PB0 // PW_OFF - #endif -#else - //#define POWER_LOSS_PIN PA2 // PW_DET - //#define PS_ON_PIN PB2 // PW_OFF - #define FIL_RUNOUT_PIN PA4 -#endif - -#define SERVO0_PIN PA8 // Enable BLTOUCH - -//#define LED_PIN PB2 - -// -// SD Card -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz -#define SD_DETECT_PIN PD12 -#define ONBOARD_SD_CS_PIN PC11 - -// -// LCD / Controller -// -#ifndef BEEPER_PIN - #define BEEPER_PIN PC5 -#endif - -/** - * Note: MKS Robin TFT screens use various TFT controllers. - * If the screen stays white, disable 'LCD_RESET_PIN' - * to let the bootloader init the screen. - */ - -#if HAS_SPI_TFT - - // Shared SPI TFT - - #define LCD_BACKLIGHT_PIN PD13 - - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define BTN_ENC PE13 - - #define TFT_CS_PIN PD11 - #define TFT_SCK_PIN PA5 - #define TFT_MISO_PIN PA6 - #define TFT_MOSI_PIN PA7 - #define TFT_DC_PIN PD10 - #define TFT_RST_PIN PC6 - #define TFT_A0_PIN TFT_DC_PIN - - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 - - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - - #ifndef TFT_WIDTH - #define TFT_WIDTH 480 - #endif - #ifndef TFT_HEIGHT - #define TFT_HEIGHT 320 - #endif - - #define LCD_READ_ID 0xD3 - #define LCD_USE_DMA_SPI - -#endif - -#if ENABLED(SPI_GRAPHICAL_TFT) - // Emulated DOGM SPI - #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 - #endif - #ifndef TFT_PIXEL_OFFSET_Y - #define TFT_PIXEL_OFFSET_Y 32 - #endif - - #define BTN_ENC PE13 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - -#elif ENABLED(TFT_480x320_SPI) - #define TFT_DRIVER ST7796 - #define TFT_BUFFER_SIZE 14400 -#endif - -// XPT2046 Touch Screen calibration -#if EITHER(HAS_TFT_LVGL_UI, TFT_480x320_SPI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17253 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11579 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 514 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -24 - #endif -#elif ENABLED(SPI_GRAPHICAL_TFT) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11386 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8684 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 339 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -18 - #endif -#endif - -#if HAS_WIRED_LCD && !HAS_SPI_TFT - - // NON TFT Displays - - #if ENABLED(MKS_MINI_12864) - - // MKS MINI12864 and MKS LCD12864B - // If using MKS LCD12864A (Need to remove RPK2 resistor) - - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PD11 - #define DOGLCD_CS PE15 - #define DOGLCD_SCK PA5 - #define DOGLCD_MOSI PA7 - - // Required for MKS_MINI_12864 with this board - #define MKS_LCD12864B - #undef SHOW_BOOTSCREEN - - #else // !MKS_MINI_12864 - - #define LCD_PINS_D4 PE14 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PE15 - #define LCD_PINS_D6 PD11 - #define LCD_PINS_D7 PD10 - #endif - - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif - - #endif // !MKS_MINI_12864 - -#endif // HAS_WIRED_LCD && !HAS_SPI_TFT - -#define HAS_SPI_FLASH 1 -#if HAS_SPI_FLASH - #define SPI_FLASH_SIZE 0x1000000 // 16MB - #define W25QXX_CS_PIN PB12 - #define W25QXX_MOSI_PIN PB15 - #define W25QXX_MISO_PIN PB14 - #define W25QXX_SCK_PIN PB13 -#endif - -#if ENABLED(SPEAKER) && BEEPER_PIN == PC5 - #error "MKS Robin nano default BEEPER_PIN is not a SPEAKER." -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h deleted file mode 100644 index 015e29bdbe..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin E3 & E3D (STM32F103RCT6) common board pin assignments - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_WEBSITE_URL "github.com/makerbase-mks" - -//#define DISABLE_DEBUG -#define DISABLE_JTAG - -// -// EEPROM -// -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB -#endif - -// -// Servos -// -#define SERVO0_PIN PA3 - -// -// Limit Switches -// -#define X_STOP_PIN PA12 -#define Y_STOP_PIN PA11 -#define Z_MIN_PIN PC6 -#define Z_MAX_PIN PB1 - -// -// Steppers -// -#define X_STEP_PIN PC0 -#define X_DIR_PIN PB2 -#define X_ENABLE_PIN PC13 - -#define Y_STEP_PIN PC2 -#define Y_DIR_PIN PB9 -#define Y_ENABLE_PIN PB12 - -#define Z_STEP_PIN PB7 -#define Z_DIR_PIN PB6 -#define Z_ENABLE_PIN PB8 - -#define E0_STEP_PIN PB4 -#define E0_DIR_PIN PB3 -#define E0_ENABLE_PIN PB5 - -#if HAS_TMC220x - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL MSerial1 - //#define Y_HARDWARE_SERIAL MSerial1 - //#define Z_HARDWARE_SERIAL MSerial1 - //#define E0_HARDWARE_SERIAL MSerial1 - - // - // Software serial - // - #define X_SERIAL_TX_PIN PC7 - #define X_SERIAL_RX_PIN PC7 - - #define Y_SERIAL_TX_PIN PD2 - #define Y_SERIAL_RX_PIN PD2 - - #define Z_SERIAL_TX_PIN PC12 - #define Z_SERIAL_RX_PIN PC12 - - #define E0_SERIAL_TX_PIN PC11 - #define E0_SERIAL_RX_PIN PC11 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// -// Heaters 0,1 / Fans / Bed -// -#define HEATER_0_PIN PC9 -#define FAN_PIN PA8 -#define HEATER_BED_PIN PC8 - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PA1 // TB -#define TEMP_0_PIN PA0 // TH1 - -#define FIL_RUNOUT_PIN PB10 // MT_DET - -/** - * _____ _____ _____ - * (BEEPER) PC1 | 1 2 | PC3 (BTN_ENC) (MISO) PB14 | 1 2 | PB13 (SD_SCK) 5V | 1 2 | GND - * (LCD_EN) PA4 | 3 4 | PA5 (LCD_RS) (BTN_EN1) PB11 | 3 4 | PA15 (SD_SS) (LCD_EN) PA4 | 3 4 | PA5 (LCD_RS) - * (LCD_D4) PA6 | 5 6 PA7 (LCD_D5) (BTN_EN2) PB0 | 5 6 PB15 (SD_MOSI) (LCD_D4) PA6 | 5 6 PB0 (BTN_EN2) - * (LCD_D6) PC4 | 7 8 | PC5 (LCD_D7) (SD_DETECT) PC10 | 7 8 | RESET RESET | 7 8 | PB11 (BTN_EN1) - * GND | 9 10| 5V GND | 9 10| NC (BTN_ENC) PC3 | 9 10| PC1 (BEEPER) - * ----- ----- ----- - * EXP1 EXP2 EXP3 - */ -#if HAS_WIRED_LCD - - #define BEEPER_PIN PC1 - #define BTN_ENC PC3 - #define LCD_PINS_ENABLE PA4 - #define LCD_PINS_RS PA5 - #define BTN_EN1 PB11 - #define BTN_EN2 PB0 - - // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) - #if ENABLED(MKS_MINI_12864) - - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PC4 - #define DOGLCD_CS PA7 - #define DOGLCD_SCK PB13 - #define DOGLCD_MOSI PB15 - - #else - - #define LCD_PINS_D4 PA6 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PA7 - #define LCD_PINS_D6 PC4 - #define LCD_PINS_D7 PC5 - #endif - - #endif // !MKS_MINI_12864 - -#endif // HAS_WIRED_LCD - -// -// SD Card -// -#define ENABLE_SPI2 -#define SD_DETECT_PIN PC10 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SS_PIN PA15 - -#ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) -#endif -#ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) -#endif -#ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h deleted file mode 100644 index aa1ccedb35..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin Lite supports only 1 hotend / E-stepper. Comment out this line to continue." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "MKS Robin Lite" -#endif -#define BOARD_WEBSITE_URL "github.com/makerbase-mks" - -//#define DISABLE_DEBUG -#define DISABLE_JTAG -#define ENABLE_SPI2 - -// -// Limit Switches -// -#define X_STOP_PIN PC13 -#define Y_STOP_PIN PC0 -#define Z_MIN_PIN PC12 -#define Z_MAX_PIN PB9 - -// -// Steppers -// -#define X_STEP_PIN PC6 -#define X_DIR_PIN PB12 -#define X_ENABLE_PIN PB10 - -#define Y_STEP_PIN PB11 -#define Y_DIR_PIN PB2 -#define Y_ENABLE_PIN PB10 - -#define Z_STEP_PIN PB1 -#define Z_DIR_PIN PC5 -#define Z_ENABLE_PIN PB10 - -#define E0_STEP_PIN PC4 -#define E0_DIR_PIN PA5 -#define E0_ENABLE_PIN PA4 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC9 -#define FAN_PIN PA8 -#define HEATER_BED_PIN PC8 - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PA1 -#define TEMP_0_PIN PA0 - -#define FIL_RUNOUT_PIN PB8 // MT_DET - -// -// LCD Pins -// -#if HAS_WIRED_LCD - #define BEEPER_PIN PD2 - #define BTN_ENC PB3 - #define LCD_PINS_RS PC3 - - #define BTN_EN1 PB5 - #define BTN_EN2 PB4 - - #define LCD_PINS_ENABLE PC2 - - #if ENABLED(MKS_MINI_12864) - - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PC1 - #define DOGLCD_CS PC2 - #define DOGLCD_SCK PB13 - #define DOGLCD_MOSI PB15 - - #else // !MKS_MINI_12864 - - #define LCD_PINS_D4 PC1 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 -1 - #define LCD_PINS_D6 -1 - #define LCD_PINS_D7 -1 - #endif - - #endif // !MKS_MINI_12864 - - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif - #endif - -#endif // HAS_WIRED_LCD - -// Motor current PWM pins -#define MOTOR_CURRENT_PWM_XY_PIN PB0 -#define MOTOR_CURRENT_PWM_Z_PIN PA7 -#define MOTOR_CURRENT_PWM_E_PIN PA6 -#define MOTOR_CURRENT_PWM_RANGE (65535/10/3.3) // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp -#define DEFAULT_PWM_MOTOR_CURRENT { 1000, 1000, 1000 } // 1.05Amp per driver, here is XY, Z and E. This values determined empirically. - -// -// SD Card -// -#define ENABLE_SPI2 -#define SD_DETECT_PIN PC10 -#define SCK_PIN PB13 -#define MISO_PIN P1B4 -#define MOSI_PIN P1B5 -#define SS_PIN PA15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h deleted file mode 100644 index d5318b8e87..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin Lite 3 (STM32F103RCT6) board pin assignments - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS Robin Lite3 supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "MKS Robin Lite3" -#endif -#define BOARD_WEBSITE_URL "github.com/makerbase-mks" - -//#define DISABLE_DEBUG -#define DISABLE_JTAG -#define ENABLE_SPI2 - -// -// Servos -// -#define SERVO0_PIN PA3 - -// -// Limit Switches -// -#define X_STOP_PIN PA12 -#define Y_STOP_PIN PA11 -#define Z_MIN_PIN PC6 -#define Z_MAX_PIN PB1 - -// -// Steppers -// -#define X_STEP_PIN PC0 -#define X_DIR_PIN PB2 -#define X_ENABLE_PIN PC13 - -#define Y_STEP_PIN PC2 -#define Y_DIR_PIN PB9 -#define Y_ENABLE_PIN PB12 - -#define Z_STEP_PIN PB7 -#define Z_DIR_PIN PB6 -#define Z_ENABLE_PIN PB8 - -#define E0_STEP_PIN PB4 -#define E0_DIR_PIN PB3 -#define E0_ENABLE_PIN PB5 - -#define E1_STEP_PIN PC12 -#define E1_DIR_PIN PC11 -#define E1_ENABLE_PIN PD2 - -// -// Heaters 0,1 / Fans / Bed -// -#define HEATER_0_PIN PC9 -#define HEATER_1_PIN PC7 -#define FAN_PIN PA8 -#define HEATER_BED_PIN PC8 - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PA1 //TB -#define TEMP_0_PIN PA0 //TH1 -#define TEMP_1_PIN PA2 //TH2 - -#define FIL_RUNOUT_PIN PB10 // MT_DET - -// -// LCD Pins -// -#if HAS_WIRED_LCD - - #define BEEPER_PIN PC1 - #define BTN_ENC PC3 - #define LCD_PINS_ENABLE PA4 - #define LCD_PINS_RS PA5 - #define BTN_EN1 PB11 - #define BTN_EN2 PB0 - - // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor) - #if ENABLED(MKS_MINI_12864) - - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PC4 - #define DOGLCD_CS PA7 - #define DOGLCD_SCK PB13 - #define DOGLCD_MOSI PB15 - - #elif IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS PB11 - #endif - - #else // !MKS_MINI_12864 - - #define LCD_PINS_D4 PA6 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PA7 - #define LCD_PINS_D6 PC4 - #define LCD_PINS_D7 PC5 - #endif - - #endif // !MKS_MINI_12864 - -#endif // HAS_WIRED_LCD - -// -// SD Card -// -#define ENABLE_SPI2 -#define SD_DETECT_PIN PC10 -#define SCK_PIN PB13 -#define MISO_PIN PB14 -#define MOSI_PIN PB15 -#define SS_PIN PA15 - -#ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) -#endif -#ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) -#endif -#ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h deleted file mode 100644 index 2b099b3e93..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ /dev/null @@ -1,210 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin mini (STM32F130VET6) board pin assignments - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 - #error "MKS Robin mini only supports 1 hotend / E-stepper. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS Robin Mini" - -// -// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role -// -#define DISABLE_DEBUG - -// -// EEPROM -// -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB -#endif - -#define ENABLE_SPI2 - -// -// Limit Switches -// -#define X_STOP_PIN PA15 -#define Y_STOP_PIN PA12 -#define Z_MIN_PIN PA11 -#define Z_MAX_PIN PC4 - -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PA4 // MT_DET -#endif - -// -// Steppers -// -#define X_ENABLE_PIN PE4 -#define X_STEP_PIN PE3 -#define X_DIR_PIN PE2 - -#define Y_ENABLE_PIN PE1 -#define Y_STEP_PIN PE0 -#define Y_DIR_PIN PB9 - -#define Z_ENABLE_PIN PB8 -#define Z_STEP_PIN PB5 -#define Z_DIR_PIN PB4 - -#define E0_ENABLE_PIN PB3 -#define E0_STEP_PIN PD6 -#define E0_DIR_PIN PD3 - -// Motor current PWM pins -#define MOTOR_CURRENT_PWM_XY_PIN PA6 -#define MOTOR_CURRENT_PWM_Z_PIN PA7 -#define MOTOR_CURRENT_PWM_E_PIN PB0 -#define MOTOR_CURRENT_PWM_RANGE 1500 // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp -#ifndef DEFAULT_PWM_MOTOR_CURRENT - #define DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 } -#endif -// -// Temperature Sensors -// -#define TEMP_0_PIN PC1 // TH1 -#define TEMP_BED_PIN PC0 // TB1 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC3 -#define HEATER_BED_PIN PA0 - -#define FAN_PIN PB1 // FAN - -// -// Misc. Functions -// -#define POWER_LOSS_PIN PA2 // PW_DET -#define PS_ON_PIN PA3 // PW_OFF - -#define SERVO0_PIN PA8 // Enable BLTOUCH support on IO0 (WIFI connector) - -#define MT_DET_1_PIN PA4 -#define MT_DET_PIN_INVERTING false - -#define WIFI_IO0_PIN PC13 - -// -// SD Card -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz -#define SD_DETECT_PIN PD12 -#define ONBOARD_SPI_DEVICE 1 // SPI1 -#define ONBOARD_SD_CS_PIN PC11 - -// -// LCD / Controller -// -#define BEEPER_PIN PC5 - -/** - * Note: MKS Robin TFT screens use various TFT controllers. - * If the screen stays white, disable 'LCD_RESET_PIN' - * to let the bootloader init the screen. - */ -#if ENABLED(TOUCH_SCREEN) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 12033 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -9047 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -30 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 254 - #endif -#endif - -#if ENABLED(FSMC_GRAPHICAL_TFT) - - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define LCD_RESET_PIN PC6 // FSMC_RST - #define LCD_BACKLIGHT_PIN PD13 - - #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PC2 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - #endif - -#elif ENABLED(TFT_320x240) //TFT32/28 - - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define TOUCH_CS_PIN PC2 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - - #define TFT_DRIVER ILI9341 - #define TFT_BUFFER_SIZE 14400 - - // YV for normal screen mounting - #define ILI9341_ORIENTATION ILI9341_MADCTL_MY | ILI9341_MADCTL_MV - // XV for 180° rotated screen mounting - //#define ILI9341_ORIENTATION ILI9341_MADCTL_MX | ILI9341_MADCTL_MV - - #define ILI9341_COLOR_RGB -#endif - -#define HAS_SPI_FLASH 1 -#if HAS_SPI_FLASH - #define SPI_FLASH_SIZE 0x1000000 // 16MB - #define W25QXX_CS_PIN PB12 // Flash chip-select - #define W25QXX_MOSI_PIN PB15 - #define W25QXX_MISO_PIN PB14 - #define W25QXX_SCK_PIN PB13 -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h deleted file mode 100644 index 16d6d2ffc4..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h +++ /dev/null @@ -1,249 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin nano (STM32F130VET6) board pin assignments - */ - -#if NOT_TARGET(STM32F1, STM32F1xx) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS Robin Nano" - -// -// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role -// -#define DISABLE_JTAG - -// -// EEPROM -// -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) - #define FLASH_EEPROM_EMULATION - #define EEPROM_PAGE_SIZE (0x800U) // 2KB - #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB -#endif - -#define ENABLE_SPI2 - -// -// Limit Switches -// -#define X_STOP_PIN PA15 -#define Y_STOP_PIN PA12 -#define Z_MIN_PIN PA11 -#define Z_MAX_PIN PC4 - -// -// Steppers -// -#define X_ENABLE_PIN PE4 -#define X_STEP_PIN PE3 -#define X_DIR_PIN PE2 - -#define Y_ENABLE_PIN PE1 -#define Y_STEP_PIN PE0 -#define Y_DIR_PIN PB9 - -#define Z_ENABLE_PIN PB8 -#define Z_STEP_PIN PB5 -#define Z_DIR_PIN PB4 - -#define E0_ENABLE_PIN PB3 -#define E0_STEP_PIN PD6 -#define E0_DIR_PIN PD3 - -#define E1_ENABLE_PIN PA3 -#define E1_STEP_PIN PA6 -#define E1_DIR_PIN PA1 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC1 // TH1 -#define TEMP_1_PIN PC2 // TH2 -#define TEMP_BED_PIN PC0 // TB1 - -// -// Heaters / Fans -// -#ifndef HEATER_0_PIN - #define HEATER_0_PIN PC3 -#endif -#if HOTENDS == 1 - #ifndef FAN1_PIN - #define FAN1_PIN PB0 - #endif -#else - #ifndef HEATER_1_PIN - #define HEATER_1_PIN PB0 - #endif -#endif -#ifndef FAN_PIN - #define FAN_PIN PB1 // FAN -#endif -#ifndef HEATER_BED_PIN - #define HEATER_BED_PIN PA0 -#endif - -// -// Thermocouples -// -//#define MAX6675_SS_PIN PE5 // TC1 - CS1 -//#define MAX6675_SS_PIN PE6 // TC2 - CS2 - -// -// Misc. Functions -// -#if HAS_TFT_LVGL_UI - //#define MKSPWC - #ifdef MKSPWC - #define SUICIDE_PIN PB2 // Enable MKSPWC SUICIDE PIN - #define SUICIDE_PIN_INVERTING false // Enable MKSPWC PIN STATE - #define KILL_PIN PA2 // Enable MKSPWC DET PIN - #define KILL_PIN_STATE true // Enable MKSPWC PIN STATE - #endif - - #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN - #define MT_DET_2_PIN PE6 // LVGL UI FILAMENT RUNOUT2 PIN - #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE - - #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN - #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN - #define WIFI_RESET_PIN PA5 // MKS ESP WIFI RESET PIN -#else - //#define POWER_LOSS_PIN PA2 // PW_DET - //#define PS_ON_PIN PB2 // PW_OFF - #define FIL_RUNOUT_PIN PA4 - #define FIL_RUNOUT2_PIN PE6 -#endif - -#define SERVO0_PIN PA8 // Enable BLTOUCH support - -//#define LED_PIN PB2 - -// -// SD Card -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz -#define SD_DETECT_PIN PD12 -#define ONBOARD_SD_CS_PIN PC11 - -// -// LCD / Controller -// -#define BEEPER_PIN PC5 - -/** - * Note: MKS Robin TFT screens use various TFT controllers. - * If the screen stays white, disable 'LCD_RESET_PIN' - * to let the bootloader init the screen. - */ - -// Shared FSMC Configs -#if HAS_FSMC_TFT - #define DOGLCD_MOSI -1 // prevent redefine Conditionals_post.h - #define DOGLCD_SCK -1 - - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - - #define TOUCH_CS_PIN PA7 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 // SPI2_SCK - #define TOUCH_MISO_PIN PB14 // SPI2_MISO - #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI - - #define TFT_RESET_PIN PC6 // FSMC_RST - #define TFT_BACKLIGHT_PIN PD13 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 - #define FSMC_RS_PIN PD11 - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 - - #define TFT_BUFFER_SIZE 14400 -#endif - -// XPT2046 Touch Screen calibration -#if EITHER(TFT_LVGL_UI_FSMC, TFT_480x320) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 17880 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -12234 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -45 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 349 - #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION 12149 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION -8746 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET -35 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET 256 - #endif -#elif ENABLED(TFT_320x240) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12246 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 9453 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 360 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -22 - #endif -#endif - -#define HAS_SPI_FLASH 1 -#if HAS_SPI_FLASH - #define SPI_FLASH_SIZE 0x1000000 // 16MB - #define W25QXX_CS_PIN PB12 - #define W25QXX_MOSI_PIN PB15 - #define W25QXX_MISO_PIN PB14 - #define W25QXX_SCK_PIN PB13 -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h deleted file mode 100644 index 846fe80a08..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ /dev/null @@ -1,392 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin nano (STM32F130VET6) board pin assignments - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue." -#elif HAS_FSMC_TFT - #error "MKS Robin nano v2 doesn't support FSMC-based TFT displays." -#endif - -#define BOARD_INFO_NAME "MKS Robin nano V2.0" - -// -// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role -// - -#define DISABLE_DEBUG - -// -// EEPROM -// -//#define FLASH_EEPROM_EMULATION -//#define SDCARD_EEPROM_EMULATION - -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) - #define I2C_EEPROM // EEPROM on I2C-0 - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Note: MKS Robin board is using SPI2 interface. -// -//#define SPI_MODULE 2 -#define ENABLE_SPI2 - -// -// Limit Switches -// -#define X_DIAG_PIN PA15 -#define Y_DIAG_PIN PA12 -#define Z_DIAG_PIN PA11 -#define E0_DIAG_PIN PC4 -#define E1_DIAG_PIN PE7 - -#define X_STOP_PIN PA15 -#define Y_STOP_PIN PA12 -#define Z_MIN_PIN PA11 -#define Z_MAX_PIN PC4 - -// -// Steppers -// -#define X_ENABLE_PIN PE4 -#define X_STEP_PIN PE3 -#define X_DIR_PIN PE2 -#ifndef X_CS_PIN - #define X_CS_PIN PD5 -#endif - -#define Y_ENABLE_PIN PE1 -#define Y_STEP_PIN PE0 -#define Y_DIR_PIN PB9 -#ifndef Y_CS_PIN - #define Y_CS_PIN PD7 -#endif - -#define Z_ENABLE_PIN PB8 -#define Z_STEP_PIN PB5 -#define Z_DIR_PIN PB4 -#ifndef Z_CS_PIN - #define Z_CS_PIN PD4 -#endif - -#define E0_ENABLE_PIN PB3 -#define E0_STEP_PIN PD6 -#define E0_DIR_PIN PD3 -#ifndef E0_CS_PIN - #define E0_CS_PIN PD9 -#endif - -#define E1_ENABLE_PIN PA3 -#define E1_STEP_PIN PD15 -#define E1_DIR_PIN PA1 -#ifndef E1_CS_PIN - #define E1_CS_PIN PD8 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PD14 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PD1 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PD0 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL MSerial1 - //#define Y_HARDWARE_SERIAL MSerial1 - //#define Z_HARDWARE_SERIAL MSerial1 - //#define E0_HARDWARE_SERIAL MSerial1 - //#define E1_HARDWARE_SERIAL MSerial1 - - // - // Software serial - // - - #define X_SERIAL_TX_PIN PD5 - #define X_SERIAL_RX_PIN PD5 - - #define Y_SERIAL_TX_PIN PD7 - #define Y_SERIAL_RX_PIN PD7 - - #define Z_SERIAL_TX_PIN PD4 - #define Z_SERIAL_RX_PIN PD4 - - #define E0_SERIAL_TX_PIN PD9 - #define E0_SERIAL_RX_PIN PD9 - - #define E1_SERIAL_TX_PIN PD8 - #define E1_SERIAL_RX_PIN PD8 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif // TMC2208 || TMC2209 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC1 // TH1 -#define TEMP_1_PIN PC2 // TH2 -#define TEMP_BED_PIN PC0 // TB1 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC3 // HEATER1 -#define HEATER_1_PIN PB0 // HEATER2 -#define HEATER_BED_PIN PA0 // HOT BED - -#define FAN_PIN PB1 // FAN - -// -// Thermocouples -// -//#define MAX6675_SS_PIN PE5 // TC1 - CS1 -//#define MAX6675_SS_PIN PE6 // TC2 - CS2 - -// -// Misc. Functions -// -#if HAS_TFT_LVGL_UI - //#define MKSPWC - #ifdef MKSPWC - #define SUICIDE_PIN PB2 // Enable MKSPWC SUICIDE PIN - #define SUICIDE_PIN_INVERTING false // Enable MKSPWC PIN STATE - #define KILL_PIN PA2 // Enable MKSPWC DET PIN - #define KILL_PIN_STATE true // Enable MKSPWC PIN STATE - #endif - - #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN - #define MT_DET_2_PIN PE6 // LVGL UI FILAMENT RUNOUT2 PIN - #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE - - #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN - #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN - #define WIFI_RESET_PIN PE9 // MKS ESP WIFI RESET PIN - - #if ENABLED(MKS_TEST) - #define MKS_TEST_POWER_LOSS_PIN PA2 // PW_DET - #define MKS_TEST_PS_ON_PIN PB2 // PW_OFF - #endif -#else - //#define POWER_LOSS_PIN PA2 // PW_DET - //#define PS_ON_PIN PB2 // PW_OFF - #define FIL_RUNOUT_PIN PA4 - #define FIL_RUNOUT2_PIN PE6 -#endif - -#define SERVO0_PIN PA8 // Enable BLTOUCH - -//#define LED_PIN PB2 - -// -// SD Card -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#define SDIO_SUPPORT -#define SDIO_CLOCK 4500000 // 4.5 MHz -#define SD_DETECT_PIN PD12 -#define ONBOARD_SD_CS_PIN PC11 - -// -// LCD / Controller -// - -/** - * Note: MKS Robin TFT screens use various TFT controllers. - * If the screen stays white, disable 'LCD_RESET_PIN' - * to let the bootloader init the screen. - */ - -#if HAS_SPI_TFT - - // Shared SPI TFT - - #define LCD_BACKLIGHT_PIN PD13 - - #define TOUCH_CS_PIN PE14 // SPI1_NSS - #define TOUCH_SCK_PIN PA5 // SPI1_SCK - #define TOUCH_MISO_PIN PA6 // SPI1_MISO - #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI - - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - #define BTN_ENC PE13 - - #define TFT_CS_PIN PD11 - #define TFT_SCK_PIN PA5 - #define TFT_MISO_PIN PA6 - #define TFT_MOSI_PIN PA7 - #define TFT_DC_PIN PD10 - #define TFT_RST_PIN PC6 - #define TFT_A0_PIN TFT_DC_PIN - - #define TFT_RESET_PIN PC6 - #define TFT_BACKLIGHT_PIN PD13 - - #define TOUCH_BUTTONS_HW_SPI - #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 - - #define LCD_USE_DMA_SPI - -#endif - -#if ENABLED(TFT_CLASSIC_UI) - // Emulated DOGM SPI - #ifndef GRAPHICAL_TFT_UPSCALE - #define GRAPHICAL_TFT_UPSCALE 3 - #endif - #ifndef TFT_PIXEL_OFFSET_Y - #define TFT_PIXEL_OFFSET_Y 32 - #endif - - #define BTN_ENC PE13 - #define BTN_EN1 PE8 - #define BTN_EN2 PE11 - - #define LCD_PINS_ENABLE PD13 - #define LCD_PINS_RS PC6 - -#elif ENABLED(TFT_COLOR_UI) - #define TFT_BUFFER_SIZE 14400 -#endif - -// XPT2046 Touch Screen calibration -#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17253 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11579 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 514 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -24 - #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -11386 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8684 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 339 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -18 - #endif -#endif - -#if HAS_WIRED_LCD && !HAS_SPI_TFT - - // NON TFT Displays - - #if ENABLED(MKS_MINI_12864) - - // MKS MINI12864 and MKS LCD12864B - // If using MKS LCD12864A (Need to remove RPK2 resistor) - - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PD11 - #define DOGLCD_CS PE15 - #define DOGLCD_SCK PA5 - #define DOGLCD_MOSI PA7 - - #elif IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define PIN_SPI_SCK PA5 - #define PIN_TFT_MISO PA6 - #define PIN_TFT_MOSI PA7 - #define TFTGLCD_CS PE8 - #endif - - #ifndef BEEPER_PIN - #define BEEPER_PIN -1 - #endif - - #else // !MKS_MINI_12864 - - #define LCD_PINS_D4 PE14 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PE15 - #define LCD_PINS_D6 PD11 - #define LCD_PINS_D7 PD10 - #endif - - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) - #endif - - #endif // !MKS_MINI_12864 - -#endif // HAS_WIRED_LCD && !HAS_SPI_TFT - -#define HAS_SPI_FLASH 1 -#if HAS_SPI_FLASH - #define SPI_FLASH_SIZE 0x1000000 // 16MB - #define W25QXX_CS_PIN PB12 - #define W25QXX_MOSI_PIN PB15 - #define W25QXX_MISO_PIN PB14 - #define W25QXX_SCK_PIN PB13 -#endif - -#ifndef BEEPER_PIN - #define BEEPER_PIN PC5 -#endif - -#if ENABLED(SPEAKER) && BEEPER_PIN == PC5 - #error "MKS Robin nano default BEEPER_PIN is not a SPEAKER." -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h deleted file mode 100644 index 32203f52ea..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ /dev/null @@ -1,275 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * MKS Robin pro (STM32F103ZET6) board pin assignments - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 - #error "MKS Robin pro supports up to 3 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "MKS Robin pro" - -// -// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role -// -#define DISABLE_DEBUG - -// -// Note: MKS Robin board is using SPI2 interface. -// -//#define SPI_MODULE 2 -#define ENABLE_SPI2 - -// -// Servos -// -#define SERVO0_PIN PA8 // BLTOUCH - -// -// Limit Switches -// -#define X_MIN_PIN PA15 -#define X_MAX_PIN PG7 -#define Y_MIN_PIN PA12 -#define Y_MAX_PIN PG8 -#define Z_MIN_PIN PA11 -#define Z_MAX_PIN PC4 - -// -// Steppers -// -#define X_ENABLE_PIN PE4 -#define X_STEP_PIN PE3 -#define X_DIR_PIN PE2 -#ifndef X_CS_PIN - #define X_CS_PIN PF8 -#endif - -#define Y_ENABLE_PIN PE1 -#define Y_STEP_PIN PE0 -#define Y_DIR_PIN PB9 -#ifndef Y_CS_PIN - #define Y_CS_PIN PF3 -#endif - -#define Z_ENABLE_PIN PB8 -#define Z_STEP_PIN PB5 -#define Z_DIR_PIN PB4 -#ifndef Z_CS_PIN - #define Z_CS_PIN PF6 -#endif - -#define E0_ENABLE_PIN PB3 -#define E0_STEP_PIN PD6 -#define E0_DIR_PIN PD3 -#ifndef E0_CS_PIN - #define E0_CS_PIN PG15 -#endif - -#define E1_ENABLE_PIN PA3 -#define E1_STEP_PIN PA6 -#define E1_DIR_PIN PA1 -#ifndef E1_CS_PIN - #define E1_CS_PIN PG10 -#endif - -#define E2_ENABLE_PIN PF0 -#define E2_STEP_PIN PF2 -#define E2_DIR_PIN PF1 -#ifndef E2_CS_PIN - #define E2_CS_PIN PG9 -#endif -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PB15 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PB14 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PB13 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL MSerial1 - //#define Y_HARDWARE_SERIAL MSerial1 - //#define Z_HARDWARE_SERIAL MSerial1 - //#define E0_HARDWARE_SERIAL MSerial1 - //#define E1_HARDWARE_SERIAL MSerial1 - //#define E2_HARDWARE_SERIAL MSerial1 - - // - // Software serial - // - #define X_SERIAL_TX_PIN PF7 - #define X_SERIAL_RX_PIN PF8 - - #define Y_SERIAL_TX_PIN PF4 - #define Y_SERIAL_RX_PIN PF3 - - #define Z_SERIAL_TX_PIN PF5 - #define Z_SERIAL_RX_PIN PF6 - - #define E0_SERIAL_TX_PIN PG13 - #define E0_SERIAL_RX_PIN PG15 - - #define E1_SERIAL_TX_PIN PG12 - #define E1_SERIAL_RX_PIN PG10 - - #define E2_SERIAL_TX_PIN PC13 - #define E2_SERIAL_RX_PIN PG9 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC1 // TH1 -#define TEMP_1_PIN PC2 // TH2 -#define TEMP_2_PIN PC3 // TH3 -#define TEMP_BED_PIN PC0 // TB1 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PF10 // +HE0- -#define HEATER_1_PIN PB0 // +HE1- -#define HEATER_2_PIN PF9 // +HE2- -#define HEATER_BED_PIN PA0 // +HOT-BED- -#define FAN_PIN PB1 // +FAN- - -/** - * Note: MKS Robin Pro board is using SPI2 interface. Make sure your stm32duino library is configured accordingly - */ -//#define MAX6675_SS_PIN PE5 // TC1 - CS1 -//#define MAX6675_SS_PIN PF11 // TC2 - CS2 - -#define POWER_LOSS_PIN PA2 // PW_DET -#define PS_ON_PIN PG11 // PW_OFF -#define FIL_RUNOUT_PIN PA4 // MT_DET1 -//#define FIL_RUNOUT_PIN PE6 // MT_DET2 -//#define FIL_RUNOUT_PIN PG14 // MT_DET3 - -// -// SD Card -// -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#if SD_CONNECTION_IS(LCD) - #define ENABLE_SPI2 - #define SD_DETECT_PIN PG3 - #define SCK_PIN PB13 - #define MISO_PIN PB14 - #define MOSI_PIN PB15 - #define SS_PIN PG6 -#elif SD_CONNECTION_IS(ONBOARD) - #define SDIO_SUPPORT - #define SD_DETECT_PIN PD12 - #define ONBOARD_SD_CS_PIN PC11 -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "No custom SD drive cable defined for this board." -#endif - -/** - * Note: MKS Robin TFT screens use various TFT controllers. - * If the screen stays white, disable 'LCD_RESET_PIN' - * to let the bootloader init the screen. - */ -#if ENABLED(FSMC_GRAPHICAL_TFT) - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - - #define LCD_RESET_PIN PF6 - #define LCD_BACKLIGHT_PIN PD13 - - #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PA7 - #else - #define BEEPER_PIN PC5 - #define BTN_ENC PG2 - #define BTN_EN1 PG5 - #define BTN_EN2 PG4 - #endif - -#elif IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS PG5 - #endif - -#elif HAS_WIRED_LCD - - #define BEEPER_PIN PC5 - #define BTN_ENC PG2 - #define LCD_PINS_ENABLE PG0 - #define LCD_PINS_RS PG1 - #define BTN_EN1 PG5 - #define BTN_EN2 PG4 - - // MKS MINI12864 and MKS LCD12864B. If using MKS LCD12864A (Need to remove RPK2 resistor) - #if ENABLED(MKS_MINI_12864) - - #define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN -1 - #define DOGLCD_A0 PF12 - #define DOGLCD_CS PF15 - #define DOGLCD_SCK PB13 - #define DOGLCD_MOSI PB15 - - #else // !MKS_MINI_12864 && !ENDER2_STOCKDISPLAY - - #define LCD_PINS_D4 PF14 - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PF15 - #define LCD_PINS_D6 PF12 - #define LCD_PINS_D7 PF13 - #endif - - #endif // !MKS_MINI_12864 && !ENDER2_STOCKDISPLAY - -#endif - -#ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) -#endif -#ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(125) -#endif -#ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(125) -#endif diff --git a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h deleted file mode 100644 index ccc92b7527..0000000000 --- a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - - /** - * 2017 Victor Perez Marlin for stm32f1 test - * 2018 Modified by Pablo Crespo for Morpheus Board (https://github.com/pscrespo/Morpheus-STM32) - */ - -/** - * MORPHEUS Board pin assignments - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Bluepill based board" - -// -// Limit Switches -// -#define X_MIN_PIN PB14 -#define Y_MIN_PIN PB13 -#define Z_MIN_PIN PB12 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PB9 -#endif - -// -// Steppers -// -// X & Y enable are the same -#define X_STEP_PIN PB7 -#define X_DIR_PIN PB6 -#define X_ENABLE_PIN PB8 - -#define Y_STEP_PIN PB5 -#define Y_DIR_PIN PB4 -#define Y_ENABLE_PIN PB8 - -#define Z_STEP_PIN PA15 -#define Z_DIR_PIN PA10 -#define Z_ENABLE_PIN PB3 - -#define E0_STEP_PIN PA8 -#define E0_DIR_PIN PB15 -#define E0_ENABLE_PIN PA9 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PB1 // Analog Input (HOTEND thermistor) -#define TEMP_BED_PIN PB0 // Analog Input (BED thermistor) - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA2 // HOTEND MOSFET -#define HEATER_BED_PIN PA0 // BED MOSFET - -#define FAN_PIN PA1 // FAN1 header on board - PRINT FAN - -// -// Misc. -// -#define LED_PIN PC13 -#define SDSS PA3 -#define TFTGLCD_CS PA4 diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h deleted file mode 100644 index cf2ba2c5fa..0000000000 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ /dev/null @@ -1,261 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif - -/** - * 21017 Victor Perez Marlin for stm32f1 test - */ - -#define BOARD_INFO_NAME "Misc. STM32F1R" -#define DEFAULT_MACHINE_NAME "STM32F103RET6" - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Limit Switches -// -#define X_STOP_PIN PB3 -#define Y_STOP_PIN PB4 -#define Z_STOP_PIN PB5 - -// -// Steppers -// -#define X_STEP_PIN PC0 -#define X_DIR_PIN PC1 -#define X_ENABLE_PIN PA8 - -#define Y_STEP_PIN PC2 -#define Y_DIR_PIN PC3 -#define Y_ENABLE_PIN PA8 - -#define Z_STEP_PIN PC4 -#define Z_DIR_PIN PC5 -#define Z_ENABLE_PIN PA8 - -#define E0_STEP_PIN PC6 -#define E0_DIR_PIN PC7 -#define E0_ENABLE_PIN PA8 - -/** - * TODO: Currently using same Enable pin to all steppers. - */ - -#define E1_STEP_PIN PC8 -#define E1_DIR_PIN PC9 -#define E1_ENABLE_PIN PA8 - -#define E2_STEP_PIN PC10 -#define E2_DIR_PIN PC11 -#define E2_ENABLE_PIN PA8 - -// -// Misc. Functions -// -#define SDSS PA4 -#define LED_PIN PD2 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PB0 // EXTRUDER 1 -#define HEATER_1_PIN PB1 - -#define HEATER_BED_PIN PA3 // BED - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PA0 // Analog Input -#define TEMP_0_PIN PA1 // Analog Input -#define TEMP_1_PIN PA2 // Analog Input - -// -// LCD Pins -// -#if HAS_WIRED_LCD - - #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 - #else - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 - #endif - #endif - - #if ENABLED(NEWPANEL) - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN 37 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 - #endif - - #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 - #define SD_DETECT_PIN -1 - #define KILL_PIN 41 - - #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - - #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - - #elif ANY(VIKI2, miniVIKI) - - #define BEEPER_PIN 33 - - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 - - #define SDSS 53 - #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - - #define KILL_PIN 31 - - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 - - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 - - #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN 42 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 - - #define KILL_PIN 64 - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 - // not connected to a pin - #define SD_DETECT_PIN 49 - - #else - - // Beeper on AUX-4 - #define BEEPER_PIN 33 - - // Buttons directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - #else - //#define SD_DETECT_PIN -1 // Ramps doesn't use this - #endif - - #endif - #endif // NEWPANEL - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h deleted file mode 100644 index e74698f89e..0000000000 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ /dev/null @@ -1,285 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" -#endif - -/** - * 21017 Victor Perez Marlin for stm32f1 test - */ - -#define BOARD_INFO_NAME "STM3R Mini" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// Enable I2C_EEPROM for testing -#define I2C_EEPROM - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Limit Switches -// -#define X_STOP_PIN PD0 -#define Y_STOP_PIN PD1 -#define Z_STOP_PIN PD4 - -// -// Steppers -// -#define X_STEP_PIN PE1 -#define X_DIR_PIN PE0 -#define X_ENABLE_PIN PC0 - -#define Y_STEP_PIN PE3 -#define Y_DIR_PIN PE2 -#define Y_ENABLE_PIN PC1 - -#define Z_STEP_PIN PE5 -#define Z_DIR_PIN PE4 -#define Z_ENABLE_PIN PC2 - -#define E0_STEP_PIN PE7 -#define E0_DIR_PIN PE6 -#define E0_ENABLE_PIN PC3 - -#define E1_STEP_PIN PE9 -#define E1_DIR_PIN PE8 -#define E1_ENABLE_PIN PC4 - -#define E2_STEP_PIN PE11 -#define E2_DIR_PIN PE10 -#define E2_ENABLE_PIN PC5 - -// -// Misc. Functions -// -#define SDSS PA15 -#define LED_PIN PB2 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PD12 // EXTRUDER 1 -//#define HEATER_1_PIN PD13 - -#define HEATER_BED_PIN PB9 // BED -//#define HEATER_BED2_PIN -1 // BED2 -//#define HEATER_BED3_PIN -1 // BED3 - -#ifndef FAN_PIN - #define FAN_PIN PD14 -#endif -#define FAN1_PIN PD13 - -#define FAN_SOFT_PWM - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PA0 -#define TEMP_0_PIN PA1 -#define TEMP_1_PIN PA2 -#define TEMP_2_PIN PA3 - -// Laser control -#if HAS_CUTTER - #define SPINDLE_LASER_PWM_PIN PB8 - #define SPINDLE_LASER_ENA_PIN PD5 -#endif - -// -// LCD Pins -// -#if HAS_WIRED_LCD - - #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 - #else - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 - #endif - #endif - - #if NEED_TOUCH_PINS - - #define TOUCH_CS_PIN PB12 // SPI2_NSS - #define TOUCH_SCK_PIN PB13 - #define TOUCH_MOSI_PIN PB14 - #define TOUCH_MISO_PIN PB15 - #define TOUCH_INT_PIN PC6 // (PenIRQ coming from ADS7843) - - #elif ENABLED(NEWPANEL) - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN 37 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 - #endif - - #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 - #define SD_DETECT_PIN -1 - #define KILL_PIN 41 - - #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - - #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - - #elif ANY(VIKI2, miniVIKI) - - #define BEEPER_PIN 33 - - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 - - #define SDSS 53 - #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - - #define KILL_PIN 31 - - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 - - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 - - #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN 42 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 - - #define KILL_PIN 64 - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 - // not connected to a pin - #define SD_DETECT_PIN 49 - - #else - - // Beeper on AUX-4 - #define BEEPER_PIN 33 - - // Buttons directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - #else - //#define SD_DETECT_PIN -1 // Ramps doesn't use this - #endif - - #endif - #endif // NEWPANEL - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h deleted file mode 100644 index bfd1f2abdc..0000000000 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ /dev/null @@ -1,193 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * ANYCUBIC Trigorilla Pro (STM32F130ZET6) board pin assignments. - * It is the same used by the Tronxy X5SA thanks to ftoz1 for sharing it - * https://github.com/MarlinFirmware/Marlin/issues/14655 - * https://github.com/MarlinFirmware/Marlin/files/3401484/x5sa-main_board-2.pdf - */ - -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Trigorilla Pro supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_INFO_NAME "Trigorilla Pro" -#define DISABLE_JTAG - -// -// EEPROM -// -#define FLASH_EEPROM_EMULATION -#if ENABLED(FLASH_EEPROM_EMULATION) - // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) - #define EEPROM_START_ADDRESS (0x8000000UL + (512 * 1024) - 2 * EEPROM_PAGE_SIZE) - #define EEPROM_PAGE_SIZE (0x800U) // 2KB, but will use 2x more (4KB) - #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE -#else - #define MARLIN_EEPROM_SIZE (0x800U) // On SD, Limit to 2KB, require this amount of RAM -#endif - -// -// Limit Switches -// -#define X_MAX_PIN PG10 -#define Y_MAX_PIN PA12 -#define Z_MAX_PIN PA14 -#define Z_MIN_PIN PA13 - -// -// Steppers -// -#define X_ENABLE_PIN PC13 -#define X_STEP_PIN PE5 -#define X_DIR_PIN PE6 - -#define Y_ENABLE_PIN PE4 -#define Y_STEP_PIN PE2 -#define Y_DIR_PIN PE3 - -#define Z_ENABLE_PIN PE1 -#define Z_STEP_PIN PB9 -#define Z_DIR_PIN PE0 - -#define E0_ENABLE_PIN PB8 -#define E0_STEP_PIN PB4 -#define E0_DIR_PIN PB5 - -#define E1_ENABLE_PIN PG8 -#define E1_STEP_PIN PC7 -#define E1_DIR_PIN PC6 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA1 // TH1 -#define TEMP_BED_PIN PA0 // TB1 - -// -// Heaters -// -#define HEATER_0_PIN PG12 // HEATER1 -#define HEATER_BED_PIN PG11 // HOT BED -#define HEATER_BED_INVERTING true - -// -// Fans -// -#define CONTROLLER_FAN_PIN PD6 // FAN -#define FAN_PIN PG13 // FAN -#define FAN1_PIN PG14 // FAN - -// -// Misc -// -#define BEEPER_PIN PB0 -#define LED_PIN PD3 -//#define POWER_LOSS_PIN PG2 // PG4 PW_DET -#define FIL_RUNOUT_PIN PA15 // MT_DET - -/** - * Note: MKS Robin TFT screens use various TFT controllers - * Supported screens are based on the ILI9341, ST7789V and ILI9328 (320x240) - * ILI9488 is not supported. - * Define init sequences for other screens in u8g_dev_tft_320x240_upscale_from_128x64.cpp - * - * If the screen stays white, disable 'LCD_RESET_PIN' to let the bootloader init the screen. - * - * Setting an 'LCD_RESET_PIN' may cause a flicker when entering the LCD menu - * because Marlin uses the reset as a failsafe to revive a glitchy LCD. - */ -#if HAS_FSMC_TFT - #define TFT_RESET_PIN PF11 - #define TFT_BACKLIGHT_PIN PD13 - #define FSMC_CS_PIN PD7 // NE4 - #define FSMC_RS_PIN PD11 // A0 - - #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_DMA_DEV DMA2 - #define FSMC_DMA_CHANNEL DMA_CH5 - - #define ANYCUBIC_TFT35 -#else - #define LCD_RESET_PIN PF11 - #define LCD_BACKLIGHT_PIN PD13 -#endif - -// XPT2046 Touch Screen calibration -#if ENABLED(TFT_COLOR_UI) || ENABLED(TFT_LVGL_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -17181 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 11434 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 501 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -9 - #endif -#elif ENABLED(TFT_CLASSIC_UI) - #ifndef XPT2046_X_CALIBRATION - #define XPT2046_X_CALIBRATION -12316 - #endif - #ifndef XPT2046_Y_CALIBRATION - #define XPT2046_Y_CALIBRATION 8981 - #endif - #ifndef XPT2046_X_OFFSET - #define XPT2046_X_OFFSET 340 - #endif - #ifndef XPT2046_Y_OFFSET - #define XPT2046_Y_OFFSET -20 - #endif -#endif - -#if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PB7 // SPI2_NSS - #define TOUCH_SCK_PIN PA5 // SPI2_SCK - #define TOUCH_MISO_PIN PA6 // SPI2_MISO - #define TOUCH_MOSI_PIN PA7 // SPI2_MOSI -#endif - -// SPI1(PA7) & SPI3(PB5) not available -#define ENABLE_SPI2 - -#if ENABLED(SDIO_SUPPORT) - #define SCK_PIN PB13 // SPI2 ok - #define MISO_PIN PB14 // SPI2 ok - #define MOSI_PIN PB15 // SPI2 ok - #define SS_PIN PC11 // PB12 is X- ok - #define SD_DETECT_PIN -1 // SD_CD ok -#else - // SD as custom software SPI (SDIO pins) - #define SCK_PIN PC12 - #define MISO_PIN PC8 - #define MOSI_PIN PD2 - #define SS_PIN -1 - #define ONBOARD_SD_CS_PIN PC11 - #define SDSS PD2 - #define SD_DETECT_PIN -1 -#endif diff --git a/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h deleted file mode 100644 index db57db14d5..0000000000 --- a/Marlin/src/pins/stm32f4/pins_ARMED.h +++ /dev/null @@ -1,229 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// https://github.com/ktand/Armed - -#pragma once - -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Arm'ed supports up to 2 hotends / E-steppers." -#endif - -#ifndef ARMED_V1_0 - #define ARMED_V1_1 -#endif - -#undef BOARD_INFO_NAME // Defined on the command line by Arduino Core STM32 -#define BOARD_INFO_NAME "Arm'ed" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 // 4KB - -// -// Limit Switches -// -#define X_STOP_PIN PE0 -#define Y_STOP_PIN PE1 -#define Z_STOP_PIN PE14 - -// -// Z Probe (when not Z_MIN_PIN) -// -//#ifndef Z_MIN_PROBE_PIN -// #define Z_MIN_PROBE_PIN PA4 -//#endif - -// -// Filament Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PA3 -#endif - -// -// Steppers -// - -#ifdef ARMED_SWAP_X_E1 - #define X_STEP_PIN PE4 - #define X_DIR_PIN PE2 - #define X_ENABLE_PIN PE3 - #define X_CS_PIN PE5 -#else - #define X_STEP_PIN PD3 - #define X_DIR_PIN PD2 - #define X_ENABLE_PIN PD0 - #define X_CS_PIN PD1 -#endif - -#define Y_STEP_PIN PE11 -#define Y_DIR_PIN PE10 -#define Y_ENABLE_PIN PE13 -#define Y_CS_PIN PE12 - -#define Z_STEP_PIN PD6 -#define Z_DIR_PIN PD7 -#define Z_ENABLE_PIN PD4 -#define Z_CS_PIN PD5 - -#define E0_STEP_PIN PB5 -#define E0_DIR_PIN PB6 -#ifdef ARMED_V1_1 - #define E0_ENABLE_PIN PC12 -#else - #define E0_ENABLE_PIN PB3 -#endif -#define E0_CS_PIN PB4 - -#ifdef ARMED_SWAP_X_E1 - #define E1_STEP_PIN PD3 - #define E1_DIR_PIN PD2 - #define E1_ENABLE_PIN PD0 - #define E1_CS_PIN PD1 -#else - #define E1_STEP_PIN PE4 - #define E1_DIR_PIN PE2 - #define E1_ENABLE_PIN PE3 - #define E1_CS_PIN PE5 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC0 // Analog Input -#define TEMP_1_PIN PC1 // Analog Input -#define TEMP_BED_PIN PC2 // Analog Input - -#if HOTENDS == 1 && TEMP_SENSOR_PROBE - #define TEMP_PROBE_PIN PC1 -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA1 // Hardware PWM -#define HEATER_1_PIN PA2 // Hardware PWM -#define HEATER_BED_PIN PA0 // Hardware PWM - -#define FAN_PIN PC6 // Hardware PWM, Part cooling fan -#define FAN1_PIN PC7 // Hardware PWM, Extruder fan -#define FAN2_PIN PC8 // Hardware PWM, Controller fan - -// -// Misc functions -// -#define SDSS PE7 -#define LED_PIN PB7 // Heart beat -#define PS_ON_PIN PA10 -#define KILL_PIN PA8 -#define PWR_LOSS PA4 // Power loss / nAC_FAULT - -// -// LCD / Controller -// -#define SD_DETECT_PIN PA15 -#define BEEPER_PIN PC9 - -#if ENABLED(FYSETC_MINI_12864) - // - // See https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 - // - #define DOGLCD_A0 PE9 - #define DOGLCD_CS PE8 - - #define LCD_BACKLIGHT_PIN -1 - - #define LCD_RESET_PIN PB12 // Must be high or open for LCD to operate normally. - - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PB13 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PB14 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PB15 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN PB13 - #endif -#else - #define LCD_PINS_RS PE9 - #define LCD_PINS_ENABLE PE8 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 - - #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS PB13 - #define DOGLCD_A0 PB14 - #endif -#endif - -#define BTN_EN1 PC4 -#define BTN_EN2 PC5 -#define BTN_ENC PC3 - -// -// Extension pins -// -#define EXT0_PIN PB0 -#define EXT1_PIN PB1 -#define EXT2_PIN PB2 -#define EXT3_PIN PD8 -#define EXT4_PIN PD9 -#define EXT5_PIN PD10 -#define EXT6_PIN PD11 -#define EXT7_PIN PD12 -#define EXT8_PIN PB10 -#define EXT9_PIN PB11 - -#if HAS_TMC_UART - // TMC2208/TMC2209 stepper drivers - // - // Software serial - // - #define X_SERIAL_TX_PIN EXT0_PIN - #define X_SERIAL_RX_PIN EXT0_PIN - - #define Y_SERIAL_TX_PIN EXT1_PIN - #define Y_SERIAL_RX_PIN EXT1_PIN - - #define Z_SERIAL_TX_PIN EXT2_PIN - #define Z_SERIAL_RX_PIN EXT2_PIN - - #define E0_SERIAL_TX_PIN EXT3_PIN - #define E0_SERIAL_RX_PIN EXT3_PIN - - #define E1_SERIAL_RX_PIN EXT4_PIN - #define E1_SERIAL_TX_PIN EXT4_PIN - - #define Z2_SERIAL_RX_PIN EXT4_PIN - #define Z2_SERIAL_TX_PIN EXT4_PIN - - #define TMC_BAUD_RATE 19200 -#endif diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f4/pins_BEAST.h deleted file mode 100644 index 268b7b59cd..0000000000 --- a/Marlin/src/pins/stm32f4/pins_BEAST.h +++ /dev/null @@ -1,285 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(__STM32F1__, __STM32F4__) - #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" -#endif - -/** - * 21017 Victor Perez Marlin for stm32f1 test - */ - -#define BOARD_INFO_NAME "Beast STM32" -#define DEFAULT_MACHINE_NAME "STM32F103RET6" - -// Enable I2C_EEPROM for testing -#define I2C_EEPROM - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Steppers -// -#define X_STEP_PIN PE0 -#define X_DIR_PIN PE1 -#define X_ENABLE_PIN PC0 -#define X_MIN_PIN PD5 -#define X_MAX_PIN -1 - -#define Y_STEP_PIN PE2 -#define Y_DIR_PIN PE3 -#define Y_ENABLE_PIN PC1 -#define Y_MIN_PIN PD6 -#define Y_MAX_PIN - -#define Z_STEP_PIN PE4 -#define Z_DIR_PIN PE5 -#define Z_ENABLE_PIN PC2 -#define Z_MIN_PIN PD7 -#define Z_MAX_PIN -1 - -#define Y2_STEP_PIN -1 -#define Y2_DIR_PIN -1 -#define Y2_ENABLE_PIN -1 - -#define Z2_STEP_PIN -1 -#define Z2_DIR_PIN -1 -#define Z2_ENABLE_PIN -1 - -#define E0_STEP_PIN PE6 -#define E0_DIR_PIN PE7 -#define E0_ENABLE_PIN PC3 - -/** - * TODO: Currently using same Enable pin to all steppers. - */ - -#define E1_STEP_PIN PE8 -#define E1_DIR_PIN PE9 -#define E1_ENABLE_PIN PC4 - -#define E2_STEP_PIN PE10 -#define E2_DIR_PIN PE11 -#define E2_ENABLE_PIN PC5 - -// -// Misc. Functions -// -#define SDSS PA15 -#define LED_PIN PB2 - -#define PS_ON_PIN -1 -#define KILL_PIN -1 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PD12 // EXTRUDER 1 -#define HEATER_1_PIN PD13 -#define HEATER_2_PIN PD14 - -#define HEATER_BED_PIN PB9 // BED -#define HEATER_BED2_PIN -1 // BED2 -#define HEATER_BED3_PIN -1 // BED3 - -#ifndef FAN_PIN - #define FAN_PIN PB10 -#endif - -#define FAN_SOFT_PWM - -// -// Temperature Sensors -// -#define TEMP_BED_PIN PA0 // Analog Input -#define TEMP_0_PIN PA1 // Analog Input -#define TEMP_1_PIN PA2 // Analog Input -#define TEMP_2_PIN PA3 // Analog Input - -// -// LCD Pins -// -#if HAS_WIRED_LCD - - #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) - #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(NEWPANEL, PANEL_ONE) - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 - #else - #define LCD_PINS_RS PB8 - #define LCD_PINS_ENABLE PD2 - #define LCD_PINS_D4 PB12 - #define LCD_PINS_D5 PB13 - #define LCD_PINS_D6 PB14 - #define LCD_PINS_D7 PB15 - #if DISABLED(NEWPANEL) - #define BEEPER_PIN 33 - // Buttons attached to a shift register - // Not wired yet - //#define SHIFT_CLK 38 - //#define SHIFT_LD 42 - //#define SHIFT_OUT 40 - //#define SHIFT_EN 17 - #endif - #endif - - #if ENABLED(NEWPANEL) - - #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - - #define BEEPER_PIN 37 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - - #if ENABLED(BQ_LCD_SMART_CONTROLLER) - #define LCD_BACKLIGHT_PIN 39 - #endif - - #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) - - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SD_DETECT_PIN 42 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 47 - #define BTN_EN2 43 - #define BTN_ENC 32 - #define LCD_SDSS 53 - #define SD_DETECT_PIN -1 - #define KILL_PIN 41 - - #elif ENABLED(LCD_I2C_VIKI) - - #define BTN_EN1 22 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. - #define BTN_EN2 7 // 22/7 are unused on RAMPS_14. 22 is unused and 7 the SERVO0_PIN on RAMPS_13. - - #define BTN_ENC -1 - #define LCD_SDSS 53 - #define SD_DETECT_PIN 49 - - #elif ANY(VIKI2, miniVIKI) - - #define BEEPER_PIN 33 - - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 45 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 22 - #define BTN_EN2 7 - #define BTN_ENC 39 - - #define SDSS 53 - #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board - - #define KILL_PIN 31 - - #define STAT_LED_RED_PIN 32 - #define STAT_LED_BLUE_PIN 35 - - #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) - - #define BTN_EN1 35 - #define BTN_EN2 37 - #define BTN_ENC 31 - #define SD_DETECT_PIN 49 - #define LCD_SDSS 53 - #define KILL_PIN 41 - #define BEEPER_PIN 23 - #define DOGLCD_CS 29 - #define DOGLCD_A0 27 - #define LCD_BACKLIGHT_PIN 33 - - #elif ENABLED(MINIPANEL) - - #define BEEPER_PIN 42 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 44 - #define DOGLCD_CS 66 - #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 - #define SDSS 53 - - #define KILL_PIN 64 - // GLCD features - // Uncomment screen orientation - //#define LCD_SCREEN_ROT_90 - //#define LCD_SCREEN_ROT_180 - //#define LCD_SCREEN_ROT_270 - // The encoder and click button - #define BTN_EN1 40 - #define BTN_EN2 63 - #define BTN_ENC 59 - // not connected to a pin - #define SD_DETECT_PIN 49 - - #else - - // Beeper on AUX-4 - #define BEEPER_PIN 33 - - // Buttons directly attached to AUX-2 - #if ENABLED(REPRAPWORLD_KEYPAD) - #define BTN_EN1 64 - #define BTN_EN2 59 - #define BTN_ENC 63 - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 - #elif ENABLED(PANEL_ONE) - #define BTN_EN1 59 // AUX2 PIN 3 - #define BTN_EN2 63 // AUX2 PIN 4 - #define BTN_ENC 49 // AUX3 PIN 7 - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC 31 - #endif - - #if ENABLED(G3D_PANEL) - #define SD_DETECT_PIN 49 - #define KILL_PIN 41 - #else - //#define SD_DETECT_PIN -1 // Ramps doesn't use this - #endif - - #endif - #endif // NEWPANEL - -#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h deleted file mode 100644 index b13d495542..0000000000 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * STM32F407VET6 with RAMPS-like shield - * 'Black' STM32F407VET6 board - https://www.stm32duino.com/viewtopic.php?t=485 - * Shield - https://github.com/jmz52/Hardware - */ - -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "Black STM32F4VET6 supports up to 2 hotends / E-steppers." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Black STM32F4VET6" -#endif - -#define DEFAULT_MACHINE_NAME "STM32F407VET6" - -//#define I2C_EEPROM -#define SRAM_EEPROM_EMULATION -#define MARLIN_EEPROM_SIZE 0x2000 // 8KB - -// -// Servos -// -#define SERVO0_PIN PC6 -#define SERVO1_PIN PC7 - -// -// Limit Switches -// -#define X_MIN_PIN PC13 -#define X_MAX_PIN PA15 -#define Y_MIN_PIN PA5 -#define Y_MAX_PIN PD12 -#define Z_MIN_PIN PD14 -#define Z_MAX_PIN PD15 - -// -// Steppers -// -#define X_STEP_PIN PC4 -#define X_DIR_PIN PA4 -#define X_ENABLE_PIN PE7 - -#define Y_STEP_PIN PE5 -#define Y_DIR_PIN PE2 -#define Y_ENABLE_PIN PE6 - -#define Z_STEP_PIN PD5 -#define Z_DIR_PIN PD3 -#define Z_ENABLE_PIN PD6 - -#define E0_STEP_PIN PD7 -#define E0_DIR_PIN PD0 -#define E0_ENABLE_PIN PB9 - -#define E1_STEP_PIN PE0 -#define E1_DIR_PIN PE1 -#define E1_ENABLE_PIN PB8 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC0 // T0 -#define TEMP_1_PIN PC1 // T1 -#define TEMP_BED_PIN PC2 // TB - -#ifndef TEMP_CHAMBER_PIN - #define TEMP_CHAMBER_PIN PC3 // TC -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA2 // Heater0 -#define HEATER_1_PIN PA3 // Heater1 -#define HEATER_BED_PIN PA1 // Hotbed - -#define FAN_PIN PE9 // Fan0 -#define FAN1_PIN PE11 // Fan1 -#define FAN2_PIN PE13 // Fan2 -#define FAN3_PIN PE14 // Fan3 - -// -// Misc. Functions -// -#define LED_PIN PA6 -//#define LED_PIN PA7 -#define KILL_PIN PB1 - -// -// LCD / Controller -// -//#define SD_DETECT_PIN PC5 -//#define SD_DETECT_PIN PA8 // SDIO SD_DETECT_PIN, external SDIO card reader only - -#define BEEPER_PIN PD10 -#define LCD_PINS_RS PE15 -#define LCD_PINS_ENABLE PD8 -#define LCD_PINS_D4 PE10 -#define LCD_PINS_D5 PE12 -#define LCD_PINS_D6 PD1 -#define LCD_PINS_D7 PE8 -#define BTN_ENC PD9 -#define BTN_EN1 PD4 -#define BTN_EN2 PD13 - -#define DOGLCD_CS LCD_PINS_D5 -#define DOGLCD_A0 LCD_PINS_D6 - -// -// Onboard SD support -// -#define SDIO_D0_PIN PC8 -#define SDIO_D1_PIN PC9 -#define SDIO_D2_PIN PC10 -#define SDIO_D3_PIN PC11 -#define SDIO_CK_PIN PC12 -#define SDIO_CMD_PIN PD2 - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#if SD_CONNECTION_IS(ONBOARD) - #define SDIO_SUPPORT // Use SDIO for onboard SD - - #ifndef SDIO_SUPPORT - #define SOFTWARE_SPI // Use soft SPI for onboard SD - #define SDSS SDIO_D3_PIN - #define SCK_PIN SDIO_CK_PIN - #define MISO_PIN SDIO_D0_PIN - #define MOSI_PIN SDIO_CMD_PIN - #endif -#endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h deleted file mode 100644 index c37f6cce04..0000000000 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ /dev/null @@ -1,268 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 - #error "BIGTREE BTT002 V1.0 supports up to 1 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "BTT BTT002 V1.0" - -// Use one of these or SDCard-based Emulation will be used -#if NO_EEPROM_SELECTED - //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation - #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation -#endif - -#if ENABLED(FLASH_EEPROM_EMULATION) - // Decrease delays and flash wear by spreading writes across the - // 128 kB sector allocated for EEPROM emulation. - #define FLASH_EEPROM_LEVELING -#endif - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Limit Switches -// -#define X_STOP_PIN PD3 -#define Y_STOP_PIN PD2 -#define Z_STOP_PIN PD1 // Shares J4 connector with PC3 - -// -// Z Probe must be this pin -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PD1 -#endif - -// -// Filament Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PA15 -#endif - -// -// Power Loss Detection -// -#ifndef POWER_LOSS_PIN - #define POWER_LOSS_PIN PD4 -#endif - -// -// Steppers -// -#define X_STEP_PIN PA9 -#define X_DIR_PIN PA10 -#define X_ENABLE_PIN PA8 -#ifndef X_CS_PIN - #define X_CS_PIN PE2 -#endif - -#define Y_STEP_PIN PC8 -#define Y_DIR_PIN PC9 -#define Y_ENABLE_PIN PC7 - #ifndef Y_CS_PIN - #define Y_CS_PIN PE3 -#endif - -#define Z_STEP_PIN PD15 -#define Z_DIR_PIN PC6 -#define Z_ENABLE_PIN PD14 -#ifndef Z_CS_PIN - #define Z_CS_PIN PE4 -#endif - -#define E0_STEP_PIN PD12 -#define E0_DIR_PIN PD13 -#define E0_ENABLE_PIN PD11 -#ifndef E0_CS_PIN - #define E0_CS_PIN PD7 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PB15 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PB14 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PB13 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial ## - // - #define X_SERIAL_TX_PIN PE2 - #define X_SERIAL_RX_PIN PE2 - - #define Y_SERIAL_TX_PIN PE3 - #define Y_SERIAL_RX_PIN PE3 - - #define Z_SERIAL_TX_PIN PE4 - #define Z_SERIAL_RX_PIN PE4 - - #define E0_SERIAL_TX_PIN PD7 - #define E0_SERIAL_RX_PIN PD7 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA2 // T0 <-> E0 -#define TEMP_1_PIN PA0 // T1 <-> E1 -#define TEMP_BED_PIN PA1 // T2 <-> Bed -#define TEMP_PROBE_PIN PC3 // Shares J4 connector with PD1 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PE6 // Heater0 -#define HEATER_BED_PIN PE5 // Hotbed -#define FAN_PIN PB8 // Fan1 -#define FAN1_PIN PB9 // Fan0 - -// HAL SPI1 pins -#define CUSTOM_SPI_PINS -#if ENABLED(CUSTOM_SPI_PINS) - #define SCK_PIN PA5 // SPI1 SCLK - #define SS_PIN PA4 // SPI1 SSEL - #define MISO_PIN PA6 // SPI1 MISO - #define MOSI_PIN PA7 // SPI1 MOSI -#endif - -// -// Misc. Functions -// -#define SDSS PA4 - -/** - * -------------------------------------BTT002 V1.0-------------------------------------------- - * ----- ----- | - * PA3 | · · | GND 5V | · · | GND | - * NRESET | · · | PC4(SD_DET) (LCD_D7) PE13 | · · | PE12 (LCD_D6) | - * (MOSI)PA7 | · · | PB0(BTN_EN2) (LCD_D5) PE11 | · · | PE10 (LCD_D4) | - * (SD_SS)PA4 | · · | PC5(BTN_EN1) (LCD_RS) PE8 | · · | PE9 (LCD_EN) | - * (SCK)PA5 | · · | PA6(MISO) (BTN_ENC) PB1 | · · | PE7 (BEEPER) | - * ----- ----- | - * EXP2 EXP1 | - * -------------------------------------------------------------------------------------------- - */ - -// -// LCDs and Controllers -// -#if HAS_WIRED_LCD - #define BEEPER_PIN PE7 - #define BTN_ENC PB1 - - #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS PE12 - - #define BTN_EN1 PE9 - #define BTN_EN2 PE10 - - #define LCD_PINS_ENABLE PE13 - #define LCD_PINS_D4 PE11 - - #else - - #define LCD_PINS_RS PE8 - - #define BTN_EN1 PC5 - #define BTN_EN2 PB0 - #define SD_DETECT_PIN PC4 - - #define LCD_SDSS PA4 - - #define LCD_PINS_ENABLE PE9 - #define LCD_PINS_D4 PE10 - - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PE11 - #define LCD_PINS_D6 PE12 - #define LCD_PINS_D7 PE13 - #endif - - #endif - - // Alter timing for graphical display - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) - #endif - #endif - -#endif // HAS_WIRED_LCD - -// -// RGB LEDs -// -#ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PB5 -#endif -#ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PB4 -#endif -#ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PB3 -#endif -#ifndef RGB_LED_W_PIN - #define RGB_LED_W_PIN -1 -#endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h deleted file mode 100644 index dc8ce9f2d1..0000000000 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ /dev/null @@ -1,411 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 8 || E_STEPPERS > 8 - #error "BIGTREE GTR V1.0 supports up to 8 hotends / E-steppers." -#elif HOTENDS > MAX_EXTRUDERS || E_STEPPERS > MAX_EXTRUDERS - #error "Marlin extruder/hotends limit! Increase MAX_EXTRUDERS to continue." -#endif - -#define BOARD_INFO_NAME "BTT GTR V1.0" - -// Onboard I2C EEPROM -#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24C64 ... 64Kb = 8KB) - -#define TP // Enable to define servo and probe pins - -// -// Servos -// -#if ENABLED(TP) - #define SERVO0_PIN PB11 -#endif - -#define PS_ON_PIN PH6 - -// -// Limit Switches -// -#define X_MIN_PIN PF2 -#define X_MAX_PIN PG14 -#define Y_MIN_PIN PC13 -#define Y_MAX_PIN PG9 -#define Z_MIN_PIN PE0 -#define Z_MAX_PIN PD3 - -// -// Pins on the extender -// -//#define X_MIN_PIN PI4 -//#define X2_MIN_PIN PF12 -//#define Y_MIN_PIN PF4 -//#define Y2_MIN_PIN PI7 -//#define Z_MIN_PIN PF6 - -#if ENABLED(TP) && !defined(Z_MIN_PROBE_PIN) - #define Z_MIN_PROBE_PIN PH11 // Z Probe must be PH11 -#endif - -// -// Steppers -// -#define X_STEP_PIN PC15 -#define X_DIR_PIN PF0 -#define X_ENABLE_PIN PF1 -#ifndef X_CS_PIN - #define X_CS_PIN PC14 -#endif - -#define Y_STEP_PIN PE3 -#define Y_DIR_PIN PE2 -#define Y_ENABLE_PIN PE4 -#ifndef Y_CS_PIN - #define Y_CS_PIN PE1 -#endif - -#define Z_STEP_PIN PB8 -#define Z_DIR_PIN PB7 // PB7 -#define Z_ENABLE_PIN PB9 -#ifndef Z_CS_PIN - #define Z_CS_PIN PB5 -#endif - -#define E0_STEP_PIN PG12 -#define E0_DIR_PIN PG11 -#define E0_ENABLE_PIN PG13 -#ifndef E0_CS_PIN - #define E0_CS_PIN PG10 -#endif - -#define E1_STEP_PIN PD6 -#define E1_DIR_PIN PD5 -#define E1_ENABLE_PIN PD7 -#ifndef E1_CS_PIN - #define E1_CS_PIN PD4 -#endif - -#define E2_STEP_PIN PD1 -#define E2_DIR_PIN PD0 -#define E2_ENABLE_PIN PD2 -#ifndef E2_CS_PIN - #define E2_CS_PIN PC12 -#endif - -#define E3_STEP_PIN PF3 -#define E3_DIR_PIN PG3 -#define E3_ENABLE_PIN PF8 -#ifndef E3_CS_PIN - #define E3_CS_PIN PG4 -#endif - -#define E4_STEP_PIN PD14 -#define E4_DIR_PIN PD11 -#define E4_ENABLE_PIN PG2 -#ifndef E4_CS_PIN - #define E4_CS_PIN PE15 -#endif - -#define E5_STEP_PIN PE12 -#define E5_DIR_PIN PE10 -#define E5_ENABLE_PIN PF14 -#ifndef E5_CS_PIN - #define E5_CS_PIN PE7 -#endif - -#define E6_STEP_PIN PG0 -#define E6_DIR_PIN PG1 -#define E6_ENABLE_PIN PE8 -#ifndef E6_CS_PIN - #define E6_CS_PIN PF15 -#endif - -#define E7_STEP_PIN PH12 -#define E7_DIR_PIN PH15 -#define E7_ENABLE_PIN PI0 -#ifndef E7_CS_PIN - #define E7_CS_PIN PH14 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PG15 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PB6 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PB3 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - //#define E5_HARDWARE_SERIAL Serial1 - //#define E6_HARDWARE_SERIAL Serial1 - //#define E7_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - #define X_SERIAL_TX_PIN PC14 - #define X_SERIAL_RX_PIN PC14 - - #define Y_SERIAL_TX_PIN PE1 - #define Y_SERIAL_RX_PIN PE1 - - #define Z_SERIAL_TX_PIN PB5 - #define Z_SERIAL_RX_PIN PB5 - - #define E0_SERIAL_TX_PIN PG10 - #define E0_SERIAL_RX_PIN PG10 - - #define E1_SERIAL_TX_PIN PD4 - #define E1_SERIAL_RX_PIN PD4 - - #define E2_SERIAL_TX_PIN PC12 - #define E2_SERIAL_RX_PIN PC12 - - #define E3_SERIAL_TX_PIN PG4 - #define E3_SERIAL_RX_PIN PG4 - - #define E4_SERIAL_TX_PIN PE15 - #define E4_SERIAL_RX_PIN PE15 - - #define E5_SERIAL_TX_PIN PE7 - #define E5_SERIAL_RX_PIN PE7 - - #define E6_SERIAL_TX_PIN PF15 - #define E6_SERIAL_RX_PIN PF15 - - #define E7_SERIAL_TX_PIN PH14 - #define E7_SERIAL_RX_PIN PH14 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC1 // T1 <-> E0 -#define TEMP_1_PIN PC2 // T2 <-> E1 -#define TEMP_2_PIN PC3 // T3 <-> E2 - -#define TEMP_3_PIN PA3 // T4 <-> E3 -#define TEMP_4_PIN PF9 // T5 <-> E4 -#define TEMP_5_PIN PF10 // T6 <-> E5 -#define TEMP_6_PIN PF7 // T7 <-> E6 -#define TEMP_7_PIN PF5 // T8 <-> E7 - -#define TEMP_BED_PIN PC0 // T0 <-> Bed - -// SPI for Max6675 or Max31855 Thermocouple -// Uses a separate SPI bus -// If you have a two-way thermocouple, you can customize two THERMO_CSx_PIN pins (x:1~2) - -#define THERMO_SCK_PIN PI1 // SCK -#define THERMO_DO_PIN PI2 // MISO -#define THERMO_CS1_PIN PH9 // CS1 -#define THERMO_CS2_PIN PH2 // CS2 - -#define MAX6675_SS_PIN THERMO_CS1_PIN -#define MAX6675_SS2_PIN THERMO_CS2_PIN -#define MAX6675_SCK_PIN THERMO_SCK_PIN -#define MAX6675_DO_PIN THERMO_DO_PIN - -// -// Heaters / Fans -// -#define HEATER_0_PIN PB1 // Heater0 -#define HEATER_1_PIN PA1 // Heater1 -#define HEATER_2_PIN PB0 // Heater2 - -#define HEATER_3_PIN PD15 // Heater3 -#define HEATER_4_PIN PD13 // Heater4 -#define HEATER_5_PIN PD12 // Heater5 -#define HEATER_6_PIN PE13 // Heater6 -#define HEATER_7_PIN PI6 // Heater7 - -#define HEATER_BED_PIN PA2 // Hotbed - -#define FAN_PIN PE5 // Fan0 -#define FAN1_PIN PE6 // Fan1 -#define FAN2_PIN PC8 // Fan2 - -#define FAN3_PIN PI5 // Fan3 -#define FAN4_PIN PE9 // Fan4 -#define FAN5_PIN PE11 // Fan5 -//#define FAN6_PIN PC9 // Fan6 -//#define FAN7_PIN PE14 // Fan7 - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -// -// By default the LCD SD (SPI2) is enabled -// Onboard SD is on a completely separate SPI bus, and requires -// overriding pins to access. -// -#if SD_CONNECTION_IS(LCD) - - #define SD_DETECT_PIN PB10 - #define SDSS PB12 - -#elif SD_CONNECTION_IS(ONBOARD) - - // Instruct the STM32 HAL to override the default SPI pins from the variant.h file - #define CUSTOM_SPI_PINS - #define SDSS PA4 - #define SS_PIN SDSS - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PA7 - #define SD_DETECT_PIN PC4 - -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" -#endif - -/** - * ----- ----- - * NC | · · | GND 5V | · · | GND - * RESET | · · | PB10(SD_DETECT) (LCD_D7) PG5 | · · | PG6 (LCD_D6) - * (MOSI)PB15 | · · | PH10(BTN_EN2) (LCD_D5) PG7 | · · | PG8 (LCD_D4) - * (SD_SS)PB12 | · · | PD10(BTN_EN1) (LCD_RS) PA8 | · · | PC10 (LCD_EN) - * (SCK)PB13 | · · | PB14(MISO) (BTN_ENC) PA15 | · · | PC11 (BEEPER) - * ----- ----- - * EXP2 EXP1 - */ - -// -// LCDs and Controllers -// -#if HAS_WIRED_LCD - #define BEEPER_PIN PC11 - #define BTN_ENC PA15 - - #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS PG6 - - #define BTN_EN1 PC10 - #define BTN_EN2 PG8 - - #define LCD_PINS_ENABLE PG5 - #define LCD_PINS_D4 PG7 - - // CR10_STOCKDISPLAY default timing is too fast - #undef BOARD_ST7920_DELAY_1 - #undef BOARD_ST7920_DELAY_2 - #undef BOARD_ST7920_DELAY_3 - - #elif ENABLED(MKS_MINI_12864) - #define DOGLCD_A0 PG6 - #define DOGLCD_CS PG7 - #define BTN_EN1 PD10 - #define BTN_EN2 PH10 - - #if SD_CONNECTION_IS(ONBOARD) - #define SOFTWARE_SPI - #endif - #else - - #define LCD_PINS_RS PA8 - - #define BTN_EN1 PD10 - #define BTN_EN2 PH10 - - #define LCD_PINS_ENABLE PC10 - #define LCD_PINS_D4 PG8 - - #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS PC10 - #define DOGLCD_A0 PA8 - - #if SD_CONNECTION_IS(ONBOARD) - #define SOFTWARE_SPI - #endif - - //#define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN PG8 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PG7 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PG6 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PG5 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN PF13 - #endif - #endif // !FYSETC_MINI_12864 - - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PG7 - #define LCD_PINS_D6 PG6 - #define LCD_PINS_D7 PG5 - #endif - - #endif - - // Alter timing for graphical display - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) - #endif - #endif - -#endif // HAS_WIRED_LCD - -#undef TP diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_1.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_1.h deleted file mode 100644 index fb4b17b6fb..0000000000 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_1.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HOTENDS > 3 || E_STEPPERS > 3 - #error "BIGTREE SKR Pro V1.1 supports up to 3 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "BTT SKR Pro V1.1" - -#include "pins_BTT_SKR_PRO_common.h" diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_2.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_2.h deleted file mode 100644 index 615751b62d..0000000000 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_2.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if HOTENDS > 3 || E_STEPPERS > 3 - #error "BIGTREE SKR Pro V1.2 supports up to 3 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "BTT SKR Pro V1.2" - -#include "pins_BTT_SKR_PRO_common.h" diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h deleted file mode 100644 index 83fd987d9d..0000000000 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ /dev/null @@ -1,394 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#endif - -// Use one of these or SDCard-based Emulation will be used -#if NO_EEPROM_SELECTED - //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation - #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation -#endif - -#if ENABLED(FLASH_EEPROM_EMULATION) - // Decrease delays and flash wear by spreading writes across the - // 128 kB sector allocated for EEPROM emulation. - #define FLASH_EEPROM_LEVELING -#endif - -// -// Servos -// -#define SERVO0_PIN PA1 -#define SERVO1_PIN PC9 - -// -// Trinamic Stallguard pins -// -#define X_DIAG_PIN PB10 // X- -#define Y_DIAG_PIN PE12 // Y- -#define Z_DIAG_PIN PG8 // Z- -#define E0_DIAG_PIN PE15 // E0 -#define E1_DIAG_PIN PE10 // E1 -#define E2_DIAG_PIN PG5 // E2 - -// -// Limit Switches -// -#ifdef X_STALL_SENSITIVITY - #define X_STOP_PIN X_DIAG_PIN - #if X_HOME_DIR < 0 - #define X_MAX_PIN PE15 // E0 - #else - #define X_MIN_PIN PE15 // E0 - #endif -#else - #define X_MIN_PIN PB10 // X- - #define X_MAX_PIN PE15 // E0 -#endif - -#ifdef Y_STALL_SENSITIVITY - #define Y_STOP_PIN Y_DIAG_PIN - #if Y_HOME_DIR < 0 - #define Y_MAX_PIN PE10 // E1 - #else - #define Y_MIN_PIN PE10 // E1 - #endif -#else - #define Y_MIN_PIN PE12 // Y- - #define Y_MAX_PIN PE10 // E1 -#endif - -#ifdef Z_STALL_SENSITIVITY - #define Z_STOP_PIN Z_DIAG_PIN - #if Z_HOME_DIR < 0 - #define Z_MAX_PIN PG5 // E2 - #else - #define Z_MIN_PIN PG5 // E2 - #endif -#else - #define Z_MIN_PIN PG8 // Z- - #define Z_MAX_PIN PG5 // E2 -#endif - -// -// Z Probe must be this pin -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PA2 -#endif - -// -// Filament Runout Sensor -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PE15 -#endif -#ifndef FIL_RUNOUT2_PIN - #define FIL_RUNOUT2_PIN PE10 -#endif -#ifndef FIL_RUNOUT3_PIN - #define FIL_RUNOUT3_PIN PG5 -#endif - -// -// Steppers -// -#define X_STEP_PIN PE9 -#define X_DIR_PIN PF1 -#define X_ENABLE_PIN PF2 -#ifndef X_CS_PIN - #define X_CS_PIN PA15 -#endif - -#define Y_STEP_PIN PE11 -#define Y_DIR_PIN PE8 -#define Y_ENABLE_PIN PD7 - #ifndef Y_CS_PIN - #define Y_CS_PIN PB8 -#endif - -#define Z_STEP_PIN PE13 -#define Z_DIR_PIN PC2 -#define Z_ENABLE_PIN PC0 -#ifndef Z_CS_PIN - #define Z_CS_PIN PB9 -#endif - -#define E0_STEP_PIN PE14 -#define E0_DIR_PIN PA0 -#define E0_ENABLE_PIN PC3 -#ifndef E0_CS_PIN - #define E0_CS_PIN PB3 -#endif - -#define E1_STEP_PIN PD15 -#define E1_DIR_PIN PE7 -#define E1_ENABLE_PIN PA3 -#ifndef E1_CS_PIN - #define E1_CS_PIN PG15 -#endif - -#define E2_STEP_PIN PD13 -#define E2_DIR_PIN PG9 -#define E2_ENABLE_PIN PF0 -#ifndef E2_CS_PIN - #define E2_CS_PIN PG12 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PC12 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PC11 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PC10 - #endif -#endif - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - #define X_SERIAL_TX_PIN PC13 - #define X_SERIAL_RX_PIN PC13 - - #define Y_SERIAL_TX_PIN PE3 - #define Y_SERIAL_RX_PIN PE3 - - #define Z_SERIAL_TX_PIN PE1 - #define Z_SERIAL_RX_PIN PE1 - - #define E0_SERIAL_TX_PIN PD4 - #define E0_SERIAL_RX_PIN PD4 - - #define E1_SERIAL_TX_PIN PD1 - #define E1_SERIAL_RX_PIN PD1 - - #define E2_SERIAL_TX_PIN PD6 - #define E2_SERIAL_RX_PIN PD6 - - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PF4 // T1 <-> E0 -#define TEMP_1_PIN PF5 // T2 <-> E1 -#define TEMP_2_PIN PF6 // T3 <-> E2 -#define TEMP_BED_PIN PF3 // T0 <-> Bed - -// -// Heaters / Fans -// -#define HEATER_0_PIN PB1 // Heater0 -#define HEATER_1_PIN PD14 // Heater1 -#define HEATER_2_PIN PB0 // Heater1 -#define HEATER_BED_PIN PD12 // Hotbed -#define FAN_PIN PC8 // Fan0 -#define FAN1_PIN PE5 // Fan1 -#define FAN2_PIN PE6 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN FAN1_PIN -#endif - -// -// Misc. Functions -// - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION LCD -#endif - -// -// Onboard SD card -// Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2 -// -#if SD_CONNECTION_IS(LCD) - - #define SD_DETECT_PIN PF12 - #define SDSS PB12 - -#elif SD_CONNECTION_IS(ONBOARD) - - // The SKR Pro's ONBOARD SD interface is on SPI1. - // Due to a pull resistor on the clock line, it needs to use SPI Data Mode 3 to - // function with Hardware SPI. This is not currently configurable in the HAL, - // so force Software SPI to work around this issue. - #define SOFTWARE_SPI - #define SDSS PA4 - #define SCK_PIN PA5 - #define MISO_PIN PA6 - #define MOSI_PIN PB5 - #define SD_DETECT_PIN PB11 - -#elif SD_CONNECTION_IS(CUSTOM_CABLE) - #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" -#endif - -/** - * ----- ----- - * NC | · · | GND 5V | · · | GND - * RESET | · · | PF12(SD_DETECT) (LCD_D7) PG7 | · · | PG6 (LCD_D6) - * (MOSI)PB15 | · · | PF11(BTN_EN2) (LCD_D5) PG3 | · · | PG2 (LCD_D4) - * (SD_SS)PB12 | · · | PG10(BTN_EN1) (LCD_RS) PD10 | · · | PD11 (LCD_EN) - * (SCK)PB13 | · · | PB14(MISO) (BTN_ENC) PA8 | · · | PG4 (BEEPER) - * ----- ----- - * EXP2 EXP1 - */ - -// -// LCDs and Controllers -// -#if IS_TFTGLCD_PANEL - - #if ENABLED(TFTGLCD_PANEL_SPI) - #define TFTGLCD_CS PG10 - #endif - -#elif HAS_WIRED_LCD - - #define BEEPER_PIN PG4 - #define BTN_ENC PA8 - - #if ENABLED(CR10_STOCKDISPLAY) - - #define LCD_PINS_RS PG6 - - #define BTN_EN1 PD11 - #define BTN_EN2 PG2 - - #define LCD_PINS_ENABLE PG7 - #define LCD_PINS_D4 PG3 - - // CR10_STOCKDISPLAY default timing is too fast - #undef BOARD_ST7920_DELAY_1 - #undef BOARD_ST7920_DELAY_2 - #undef BOARD_ST7920_DELAY_3 - - #elif ENABLED(MKS_MINI_12864) - - #define DOGLCD_A0 PG6 - #define DOGLCD_CS PG3 - #define BTN_EN1 PG10 - #define BTN_EN2 PF11 - - #else - - #define LCD_PINS_RS PD10 - - #define BTN_EN1 PG10 - #define BTN_EN2 PF11 - - #define LCD_PINS_ENABLE PD11 - #define LCD_PINS_D4 PG2 - - #if ENABLED(FYSETC_MINI_12864) - #define DOGLCD_CS PD11 - #define DOGLCD_A0 PD10 - //#define LCD_BACKLIGHT_PIN -1 - #define LCD_RESET_PIN PG2 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PG3 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PG6 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PG7 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN PG3 - #endif - #endif // !FYSETC_MINI_12864 - - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PG3 - #define LCD_PINS_D6 PG6 - #define LCD_PINS_D7 PG7 - #endif - - #endif - -#endif // HAS_WIRED_LCD - -// Alter timing for graphical display -#if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) - #endif -#endif - -// -// WIFI -// - -/** - * ----- - * TX | 1 2 | GND Enable PG1 // Must be high for module to run - * Enable | 3 4 | GPIO2 Reset PG0 // active low, probably OK to leave floating - * Reset | 5 6 | GPIO0 GPIO2 PF15 // must be high (ESP3D software configures this with a pullup so OK to leave as floating) - * 3.3V | 7 8 | RX GPIO0 PF14 // Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) - * ----- - * W1 - */ -#define ESP_WIFI_MODULE_COM 6 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this -#define ESP_WIFI_MODULE_BAUDRATE BAUDRATE // Must use same BAUDRATE as SERIAL_PORT & SERIAL_PORT_2 -#define ESP_WIFI_MODULE_RESET_PIN PG0 -#define ESP_WIFI_MODULE_ENABLE_PIN PG1 -#define ESP_WIFI_MODULE_GPIO0_PIN PF14 -#define ESP_WIFI_MODULE_GPIO2_PIN PF15 diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h deleted file mode 100644 index 808751d7a5..0000000000 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ /dev/null @@ -1,292 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 6 || E_STEPPERS > 6 - #error "FLYF407ZG supports up to 6 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "FLYF407ZG" -#define BOARD_WEBSITE_URL "github.com/FLYmaker/FLYF407ZG" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// -// EEPROM Emulation -// -#if NO_EEPROM_SELECTED - #define FLASH_EEPROM_EMULATION - //#define SRAM_EEPROM_EMULATION - //#define I2C_EEPROM -#endif - -#if ENABLED(FLASH_EEPROM_EMULATION) - // Decrease delays and flash wear by spreading writes across - // the 128kB sector allocated for EEPROM emulation. - #define FLASH_EEPROM_LEVELING -#elif ENABLED(I2C_EEPROM) - #define MARLIN_EEPROM_SIZE 0x2000 // 8KB -#endif - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Servos -// -#define SERVO0_PIN PE11 - -// -// Limit Switches -// -#define X_MIN_PIN PC3 -#define X_MAX_PIN PC2 -#define Y_MIN_PIN PF2 -#define Y_MAX_PIN PF1 -#define Z_MIN_PIN PF0 -#define Z_MAX_PIN PC15 - -// -// Z Probe (when not Z_MIN_PIN) -// -#define Z_MIN_PROBE_PIN PC14 // Z3_PIN - -// -// Steppers -// - -#define X_STEP_PIN PB9 -#define X_DIR_PIN PE0 -#define X_ENABLE_PIN PE1 -#ifndef X_CS_PIN - #define X_CS_PIN PG13 -#endif - -#define Y_STEP_PIN PB8 -#define Y_DIR_PIN PG11 -#define Y_ENABLE_PIN PG12 -#ifndef Y_CS_PIN - #define Y_CS_PIN PG10 -#endif - -#define Z_STEP_PIN PA8 -#define Z_DIR_PIN PD6 -#define Z_ENABLE_PIN PD7 -#ifndef Z_CS_PIN - #define Z_CS_PIN PD5 -#endif - -#define E0_STEP_PIN PC7 -#define E0_DIR_PIN PD3 -#define E0_ENABLE_PIN PD4 -#ifndef E0_CS_PIN - #define E0_CS_PIN PD1 -#endif - -#define E1_STEP_PIN PC6 -#define E1_DIR_PIN PA15 -#define E1_ENABLE_PIN PD0 -#ifndef E1_CS_PIN - #define E1_CS_PIN PA14 -#endif - -#define E2_STEP_PIN PD15 -#define E2_DIR_PIN PG7 -#define E2_ENABLE_PIN PG8 -#ifndef E2_CS_PIN - #define E2_CS_PIN PG6 -#endif - -#define E3_STEP_PIN PD14 -#define E3_DIR_PIN PG4 -#define E3_ENABLE_PIN PG5 -#ifndef E3_CS_PIN - #define E3_CS_PIN PG3 -#endif - -#define E4_STEP_PIN PD13 -#define E4_DIR_PIN PD11 -#define E4_ENABLE_PIN PG2 -#ifndef E4_CS_PIN - #define E4_CS_PIN PD10 -#endif - -#define E5_STEP_PIN PD12 -#define E5_DIR_PIN PD8 -#define E5_ENABLE_PIN PD9 -#ifndef E5_CS_PIN - #define E5_CS_PIN PB12 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA0 // Analog Input -#define TEMP_1_PIN PC1 // Analog Input -#define TEMP_2_PIN PC0 // Analog Input -#define TEMP_3_PIN PF10 // Analog Input -#define TEMP_4_PIN PF5 // Analog Input -#define TEMP_5_PIN PF4 // Analog Input -#define TEMP_BED_PIN PF3 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN PF7 -#define HEATER_1_PIN PF6 -#define HEATER_2_PIN PE6 -#define HEATER_3_PIN PE5 -#define HEATER_4_PIN PE4 -#define HEATER_5_PIN PE3 -#define HEATER_BED_PIN PE2 - -#ifndef FAN_PIN - #define FAN_PIN PF8 -#endif -#define FAN1_PIN PF9 -#define FAN2_PIN PA2 -#define FAN3_PIN PA1 -#define FAN4_PIN PE13 -#define FAN5_PIN PB11 - -// -// Onboard SD support -// - -#define SDIO_D0_PIN PC8 -#define SDIO_D1_PIN PC9 -//#define SD_CARD_DETECT_PIN PC13 -#define SDIO_D2_PIN PC10 -#define SDIO_D3_PIN PC11 -#define SDIO_CK_PIN PC12 -#define SDIO_CMD_PIN PD2 - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#if SD_CONNECTION_IS(ONBOARD) - - #define SDIO_SUPPORT // Use SDIO for onboard SD - #ifndef SDIO_SUPPORT - #define SOFTWARE_SPI // Use soft SPI for onboard SD - #define SDSS SDIO_D3_PIN - #define SCK_PIN SDIO_CK_PIN - #define MISO_PIN SDIO_D0_PIN - #define MOSI_PIN SDIO_CMD_PIN - #endif - -#elif SD_CONNECTION_IS(LCD) - - #define SCK_PIN PB13 - #define MISO_PIN PB14 - #define MOSI_PIN PB15 - #define SDSS PF11 - #define SD_DETECT_PIN PB2 - -#endif - -// -// Trinamic Software SPI -// - -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PB15 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PB14 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PB13 - #endif -#endif - -// -// Trinamic Software Serial -// - -#if HAS_TMC_UART - #define X_SERIAL_TX_PIN PG13 - #define X_SERIAL_RX_PIN PG13 - - #define Y_SERIAL_TX_PIN PG10 - #define Y_SERIAL_RX_PIN PG10 - - #define Z_SERIAL_TX_PIN PD5 - #define Z_SERIAL_RX_PIN PD5 - - #define E0_SERIAL_TX_PIN PD1 - #define E0_SERIAL_RX_PIN PD1 - - #define E1_SERIAL_TX_PIN PA14 - #define E1_SERIAL_RX_PIN PA14 - - #define E2_SERIAL_TX_PIN PG6 - #define E2_SERIAL_RX_PIN PG6 - - #define E3_SERIAL_TX_PIN PG3 - #define E3_SERIAL_RX_PIN PG3 - - #define E4_SERIAL_TX_PIN PD10 - #define E4_SERIAL_RX_PIN PD10 - - #define E5_SERIAL_TX_PIN PB12 - #define E5_SERIAL_RX_PIN PB12 - -#endif - -// -// LCD / Controller -// - -#define BEEPER_PIN PB10 -#define LCD_PINS_RS PE12 -#define LCD_PINS_ENABLE PE14 -#define LCD_PINS_D4 PE10 -#define LCD_PINS_D5 PE9 -#define LCD_PINS_D6 PE8 -#define LCD_PINS_D7 PE7 -#define BTN_EN1 PC4 -#define BTN_EN2 PC5 -#define BTN_ENC PE15 - -// -// Filament runout -// - -#define FIL_RUNOUT_PIN PA3 - -// -// ST7920 Delays -// -#ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) -#endif -#ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) -#endif -#ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) -#endif diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h deleted file mode 100644 index 151f6c3bc0..0000000000 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ /dev/null @@ -1,289 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 - #error "RUMBA32 supports up to 3 hotends / E-steppers." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "FYSETC S6" -#endif -#ifndef DEFAULT_MACHINE_NAME - #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#endif - -// Change the priority to 3. Priority 2 is for software serial. -//#define TEMP_TIMER_IRQ_PRIO 3 - -// -// EEPROM Emulation -// -#if NO_EEPROM_SELECTED - #define FLASH_EEPROM_EMULATION - //#define SRAM_EEPROM_EMULATION - //#define I2C_EEPROM -#endif - -#if ENABLED(FLASH_EEPROM_EMULATION) - // Decrease delays and flash wear by spreading writes across the - // 128 kB sector allocated for EEPROM emulation. - #define FLASH_EEPROM_LEVELING -#elif ENABLED(I2C_EEPROM) - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// -// Servos -// -#define SERVO0_PIN PA3 - -// -// Limit Switches -// -#define X_MIN_PIN PB14 -#define X_MAX_PIN PA1 -#define Y_MIN_PIN PB13 -#define Y_MAX_PIN PA2 -#define Z_MIN_PIN PA0 -#define Z_MAX_PIN PA3 - -// -// Filament Sensor -// share with X_MAX_PIN -// -#ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN PA1 -#endif - -// -// Steppers -// -#define X_STEP_PIN PE11 -#define X_DIR_PIN PE10 -#ifndef X_ENABLE_PIN - #define X_ENABLE_PIN PE12 -#endif -#define X_CS_PIN PE7 - -#define Y_STEP_PIN PD8 -#define Y_DIR_PIN PB12 -#define Y_ENABLE_PIN PD9 -#define Y_CS_PIN PE15 - -#define Z_STEP_PIN PD14 -#define Z_DIR_PIN PD13 -#define Z_ENABLE_PIN PD15 -#define Z_CS_PIN PD10 - -#define E0_STEP_PIN PD5 -#define E0_DIR_PIN PD6 -#define E0_ENABLE_PIN PD4 -#define E0_CS_PIN PD7 - -#define E1_STEP_PIN PE6 -#define E1_DIR_PIN PC13 -#define E1_ENABLE_PIN PE5 -#define E1_CS_PIN PC14 - -#define E2_STEP_PIN PE2 -#define E2_DIR_PIN PE4 -#define E2_ENABLE_PIN PE3 -#define E2_CS_PIN PC15 - -#if HAS_TMC_UART - // - // TMC2208/TMC2209 stepper drivers - // - - // - // Software serial - // - #ifndef X_SERIAL_TX_PIN - #define X_SERIAL_TX_PIN PE9 - #endif - #ifndef X_SERIAL_RX_PIN - #define X_SERIAL_RX_PIN PE8 - #endif - #ifndef Y_SERIAL_TX_PIN - #define Y_SERIAL_TX_PIN PE14 - #endif - #ifndef Y_SERIAL_RX_PIN - #define Y_SERIAL_RX_PIN PE13 - #endif - #ifndef Z_SERIAL_TX_PIN - #define Z_SERIAL_TX_PIN PD11 - #endif - #ifndef Z_SERIAL_RX_PIN - #define Z_SERIAL_RX_PIN PD12 - #endif - #ifndef E0_SERIAL_TX_PIN - #define E0_SERIAL_TX_PIN PD3 - #endif - #ifndef E0_SERIAL_RX_PIN - #define E0_SERIAL_RX_PIN PA15 - #endif - #ifndef E1_SERIAL_TX_PIN - #define E1_SERIAL_TX_PIN PC4 - #endif - #ifndef E1_SERIAL_RX_PIN - #define E1_SERIAL_RX_PIN PC5 - #endif - #ifndef E2_SERIAL_TX_PIN - #define E2_SERIAL_TX_PIN PE1 - #endif - #ifndef E2_SERIAL_RX_PIN - #define E2_SERIAL_RX_PIN PE0 - #endif -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC0 -#define TEMP_1_PIN PC1 -#define TEMP_2_PIN PC2 -#define TEMP_BED_PIN PC3 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PB3 -#define HEATER_1_PIN PB4 -#define HEATER_2_PIN PB15 -#define HEATER_BED_PIN PC8 - -#define FAN_PIN PB0 -#define FAN1_PIN PB1 -#define FAN2_PIN PB2 - -// -// SPI -// -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 - -// -// Misc. Functions -// -//#define LED_PIN PB14 -//#define BTN_PIN PC10 -//#define PS_ON_PIN PE11 -//#define KILL_PIN PC5 - -#define SDSS PA4 -#define SD_DETECT_PIN PB10 - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - #define BEEPER_PIN PC9 - #define BTN_ENC PA8 - - #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS PD0 - - #define BTN_EN1 PC11 - #define BTN_EN2 PC10 - - #define LCD_PINS_ENABLE PD1 - #define LCD_PINS_D4 PC12 - - // CR10_STOCKDISPLAY default timing is too fast - #undef BOARD_ST7920_DELAY_1 - #undef BOARD_ST7920_DELAY_2 - #undef BOARD_ST7920_DELAY_3 - - #else - - #define LCD_PINS_RS PD2 - - #define BTN_EN1 PC6 - #define BTN_EN2 PC7 - - #define LCD_SDSS PA4 - - #define LCD_PINS_ENABLE PC11 - #define LCD_PINS_D4 PC10 - - #if ENABLED(FYSETC_MINI_12864) - // See https://wiki.fysetc.com/Mini12864_Panel - #define DOGLCD_CS PC11 - #define DOGLCD_A0 PD2 - #if ENABLED(FYSETC_GENERIC_12864_1_1) - #define LCD_BACKLIGHT_PIN PD0 - #endif - #define LCD_RESET_PIN PC10 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) - #ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PC12 - #endif - #ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PD0 - #endif - #ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PD1 - #endif - #elif ENABLED(FYSETC_MINI_12864_2_1) - #define NEOPIXEL_PIN PC12 - #endif - #endif // !FYSETC_MINI_12864 - - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PC12 - #define LCD_PINS_D6 PD0 - #define LCD_PINS_D7 PD1 - #endif - - #endif - - // Alter timing for graphical display - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) - #endif - #endif - -#endif // HAS_WIRED_LCD - -#ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PB6 -#endif -#ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PB5 -#endif -#ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PB7 -#endif -#ifndef RGB_LED_W_PIN - #define RGB_LED_W_PIN -1 -#endif diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h deleted file mode 100644 index 021ef1d5f6..0000000000 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#define BOARD_INFO_NAME "FYSETC S6 2.0" - -// -// EEPROM Emulation -// -#if NO_EEPROM_SELECTED - #undef NO_EEPROM_SELECTED - //#define FLASH_EEPROM_EMULATION - //#define SRAM_EEPROM_EMULATION - #define I2C_EEPROM -#endif - -// -// Steppers -// -#define X_ENABLE_PIN PE9 - -#if HAS_TMC_UART - #define X_SERIAL_TX_PIN PE8 - #define Y_SERIAL_TX_PIN PC4 - #define Y_SERIAL_RX_PIN PC4 - #define Z_SERIAL_TX_PIN PD12 - #define E0_SERIAL_TX_PIN PA15 - #define E1_SERIAL_TX_PIN PC5 - #define E2_SERIAL_TX_PIN PE0 -#endif - -// -// Software SPI pins for TMC2130 stepper drivers -// -#define TMC_USE_SW_SPI -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PE14 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PE13 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PE12 - #endif -#endif - -#include "pins_FYSETC_S6.h" diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h deleted file mode 100644 index 4acfd743b7..0000000000 --- a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * To build with Arduino IDE use "Discovery F407VG" - * To build with PlatformIO use environment "STM32F4" - */ -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "STM32F4 supports up to 2 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "Misc. STM32F4" -#define DEFAULT_MACHINE_NAME "STM32F407VET6" - -//#define I2C_EEPROM - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Limit Switches -// -#define X_MIN_PIN PE0 -#define X_MAX_PIN -1 -#define Y_MIN_PIN PE1 -#define Y_MAX_PIN -1 -#define Z_MIN_PIN PE14 -#define Z_MAX_PIN -1 - -// -// Z Probe (when not Z_MIN_PIN) -// - -//#ifndef Z_MIN_PROBE_PIN -// #define Z_MIN_PROBE_PIN PA4 -//#endif - -// -// Steppers -// - -#define X_STEP_PIN PD3 -#define X_DIR_PIN PD2 -#define X_ENABLE_PIN PD0 -//#ifndef X_CS_PIN -// #define X_CS_PIN PD1 -//#endif - -#define Y_STEP_PIN PE11 -#define Y_DIR_PIN PE10 -#define Y_ENABLE_PIN PE13 -//#ifndef Y_CS_PIN -// #define Y_CS_PIN PE12 -//#endif - -#define Z_STEP_PIN PD6 -#define Z_DIR_PIN PD7 -#define Z_ENABLE_PIN PD4 -//#ifndef Z_CS_PIN -// #define Z_CS_PIN PD5 -//#endif - -#define E0_STEP_PIN PB5 -#define E0_DIR_PIN PB6 -#define E0_ENABLE_PIN PB3 -//#ifndef E0_CS_PIN -// #define E0_CS_PIN PB4 -//#endif - -#define E1_STEP_PIN PE4 -#define E1_DIR_PIN PE2 -#define E1_ENABLE_PIN PE3 -//#ifndef E1_CS_PIN -// #define E1_CS_PIN PE5 -//#endif - -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 - -// -// Temperature Sensors -// - -#define TEMP_0_PIN PC0 // Analog Input -#define TEMP_1_PIN PC1 // Analog Input -#define TEMP_BED_PIN PC2 // Analog Input - -// -// Heaters / Fans -// - -#define HEATER_0_PIN PA1 -#define HEATER_1_PIN PA2 -#define HEATER_BED_PIN PA0 - -#ifndef FAN_PIN - #define FAN_PIN PC6 -#endif -#define FAN1_PIN PC7 -#define FAN2_PIN PC8 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PC7 -#endif - -// -// Misc. Functions -// - -//#define CASE_LIGHT_PIN_CI PF13 -//#define CASE_LIGHT_PIN_DO PF14 -//#define NEOPIXEL_PIN PF13 - -// -// Průša i3 MK2 Multi Material Multiplexer Support -// - -//#define E_MUX0_PIN PG3 -//#define E_MUX1_PIN PG4 - -// -// Servos -// - -//#define SERVO0_PIN PE13 -//#define SERVO1_PIN PE14 - -#define SDSS PE7 -#define SS_PIN PE7 -#define LED_PIN PB7 //Alive -#define PS_ON_PIN PA10 -#define KILL_PIN PA8 -#define PWR_LOSS PA4 //Power loss / nAC_FAULT - -// -// LCD / Controller -// - -#define SD_DETECT_PIN PA15 -#define BEEPER_PIN PC9 -#define LCD_PINS_RS PE9 -#define LCD_PINS_ENABLE PE8 -#define LCD_PINS_D4 PB12 -#define LCD_PINS_D5 PB13 -#define LCD_PINS_D6 PB14 -#define LCD_PINS_D7 PB15 -#define BTN_EN1 PC4 -#define BTN_EN2 PC5 -#define BTN_ENC PC3 - -// -// Filament runout -// - -#define FIL_RUNOUT_PIN PA3 - -// -// ST7920 Delays -// -#if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) - #endif -#endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h deleted file mode 100644 index 48973688a0..0000000000 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ /dev/null @@ -1,180 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "LERDGE K supports up to 2 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "Lerdge K" -#define DEFAULT_MACHINE_NAME "LERDGE" - -#define I2C_EEPROM - -// -// Servos -// -//#define SERVO0_PIN PB11 - -// -// Limit Switches -// -#define X_STOP_PIN PG3 -#define Y_STOP_PIN PG4 -#define Z_STOP_PIN PG5 - -// -// Z Probe (when not Z_MIN_PIN) -// -//#ifndef Z_MIN_PROBE_PIN -// #define Z_MIN_PROBE_PIN PG6 -//#endif - -// -// Filament runout -// -#define FIL_RUNOUT_PIN PE5 -#define FIL_RUNOUT2_PIN PE6 - -// -// Steppers -// -#define X_STEP_PIN PG1 -#define X_DIR_PIN PB10 -#define X_ENABLE_PIN PG0 -//#ifndef X_CS_PIN -// #define X_CS_PIN PE0 -//#endif - -#define Y_STEP_PIN PF14 -#define Y_DIR_PIN PF15 -#define Y_ENABLE_PIN PF13 -//#ifndef Y_CS_PIN -// #define Y_CS_PIN PE1 -//#endif - -#define Z_STEP_PIN PF11 -#define Z_DIR_PIN PF12 -#define Z_ENABLE_PIN PC5 -//#ifndef Z_CS_PIN -// #define Z_CS_PIN PE2 -//#endif - -#define E0_STEP_PIN PC14 -#define E0_DIR_PIN PC13 -#define E0_ENABLE_PIN PC15 -//#ifndef E0_CS_PIN -// #define E0_CS_PIN PE3 -//#endif - -#define E1_STEP_PIN PF1 -#define E1_DIR_PIN PF0 -#define E1_ENABLE_PIN PF2 -//#ifndef E1_CS_PIN -// #define E1_CS_PIN PE4 -//#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC1 // Analog Input -#define TEMP_1_PIN PC2 // Analog Input -#define TEMP_BED_PIN PC0 // Analog Input - -// Lergde-K can choose thermocouple/thermistor mode in software. -// For use with thermistors, these pins must be OUT/LOW. -// This is done automatically. -#define TEMP_0_TR_ENABLE_PIN PF10 -#define TEMP_1_TR_ENABLE_PIN PF9 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA1 -#define HEATER_1_PIN PA0 -#define HEATER_BED_PIN PA2 - -#ifndef FAN_PIN - #define FAN_PIN PF7 -#endif -#define FAN1_PIN PF6 -#define FAN2_PIN PF8 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PF6 -#endif - -// -// LED / Lighting -// -//#define CASE_LIGHT_PIN_CI -1 -//#define CASE_LIGHT_PIN_DO -1 -//#define NEOPIXEL_PIN -1 -#ifndef RGB_LED_R_PIN - #define RGB_LED_R_PIN PB7 -#endif -#ifndef RGB_LED_G_PIN - #define RGB_LED_G_PIN PB8 -#endif -#ifndef RGB_LED_B_PIN - #define RGB_LED_B_PIN PB9 -#endif - -// -// SD support -// -#define SDIO_SUPPORT - -// -// Misc. Functions -// -#define SDSS PC11 -#define LED_PIN PA15 // Alive -#define PS_ON_PIN -1 -#define KILL_PIN -1 -#define POWER_LOSS_PIN PA4 // Power-loss / nAC_FAULT - -#define SCK_PIN PC12 -#define MISO_PIN PC8 -#define MOSI_PIN PD2 -#define SS_PIN PC11 - -#define SD_DETECT_PIN PA8 -#define BEEPER_PIN PC7 - -// -// LCD / Controller -// - -#define TFT_RESET_PIN PD6 -#define TFT_BACKLIGHT_PIN PD3 - -#define TFT_CS_PIN PD7 -#define TFT_RS_PIN PD11 - -#define TOUCH_CS_PIN PG15 -#define TOUCH_SCK_PIN PB3 -#define TOUCH_MOSI_PIN PB5 -#define TOUCH_MISO_PIN PB4 - -#define BTN_EN1 PG10 -#define BTN_EN2 PG11 -#define BTN_ENC PG9 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h deleted file mode 100644 index 0600ed4338..0000000000 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ /dev/null @@ -1,208 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "LERDGE S supports up to 2 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "Lerdge S" -#define DEFAULT_MACHINE_NAME "LERDGE" - -#define STEP_TIMER 4 -#define TEMP_TIMER 2 - -//#define I2C_EEPROM - -// -// Servos -// -#define SERVO0_PIN PD12 //confirmed -//#define SERVO1_PIN -1 - -// -// Limit Switches -// -#define X_MIN_PIN PG9 //confirmed -#define Y_MIN_PIN PG10 //confirmed -#define Z_MIN_PIN PG11 //confirmed - -#define X_MAX_PIN PG12 //confirmed -#define Y_MAX_PIN PG13 //confirmed -#define Z_MAX_PIN PG14 //confirmed - -// -// Filament runout -// -#define FIL_RUNOUT_PIN PC5 //confirmed - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PG8 //confirmed -#endif - -// -// Steppers -// -#define X_STEP_PIN PF7 //confirmed -#define X_DIR_PIN PF8 //confirmed -#define X_ENABLE_PIN PF6 //confirmed - -#define Y_STEP_PIN PF10 //confirmed -#define Y_DIR_PIN PF11 //confirmed -#define Y_ENABLE_PIN PF9 //confirmed - -#define Z_STEP_PIN PF13 //confirmed -#define Z_DIR_PIN PF14 //confirmed -#define Z_ENABLE_PIN PF12 //confirmed - -#define E0_STEP_PIN PG0 //confirmed -#define E0_DIR_PIN PG1 //confirmed -#define E0_ENABLE_PIN PF15 //confirmed - -#define E1_STEP_PIN PG3 //confirmed -#define E1_DIR_PIN PG4 //confirmed -#define E1_ENABLE_PIN PG2 //confirmed - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC0 // See below for activation of thermistor readings -#define TEMP_1_PIN PC1 // See below for activation of thermistor readings -#define TEMP_BED_PIN PC3 //confirmed - -// Lergde-S can choose thermocouple/thermistor mode in software. -// For use with thermistors, these pins must be OUT/LOW. -// This is done automatically. -#define TEMP_0_TR_ENABLE_PIN PF3 -#define TEMP_1_TR_ENABLE_PIN PF4 - -// MAX6675 Cold-Junction-Compensated K-Thermocouple to Digital Converter (0°C to +1024°C) -// https://datasheets.maximintegrated.com/en/ds/MAX6675.pdf - -#define MAX6675_SCK_PIN PB3 // max6675 datasheet: SCK pin, found with multimeter, not tested -#define MAX6675_DO_PIN PB4 // max6675 datasheet: SO pin, found with multimeter, not tested -#define MAX6675_SS_PIN PC4 // max6675 datasheet: /CS pin, found with multimeter, not tested and likely wrong - -// Expansion board with second max6675 -// Warning: Some boards leave the slot unpopulated. - -//#define MAX6675_SCK2_PIN PB3 // max6675 datasheet: SCK pin, found with multimeter, not tested -//#define MAX6675_DO2_PIN PB4 // max6675 datasheet: SO pin, found with multimeter, not tested -//#define MAX6675_SS2_PIN PF1 // max6675 datasheet: /CS pin, found with multimeter, not tested - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA0 //confirmed -#define HEATER_1_PIN PA1 //confirmed -#define HEATER_BED_PIN PA3 //confirmed - -#define FAN_PIN PA15 // heater 0 fan 1 //confirmed -#define FAN1_PIN PB10 // heater 1 fan 2 //confirmed -#define FAN2_PIN PF5 // heater 0 fan 2 and heater 1 fan 1 (two sockets, switched together) //confirmed - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PF5 -#endif - -// -// Průša i3 MK2 Multi Material Multiplexer Support -// -//#define E_MUX0_PIN -1 -//#define E_MUX1_PIN -1 - -// -// LED / Lighting -// -//Lerdge-S board has two LED connectors (this is the one on the mainboard) -#define CASE_LIGHT_PIN PC7 //confirmed - -//on the dual extrusion addon board is a RGB connector -#define RGB_LED_R_PIN PC7 // Shared with the mainboard LED light connector (CASE_LIGHT_PIN), confirmed -#define RGB_LED_G_PIN PB0 //confirmed -#define RGB_LED_B_PIN PB1 //confirmed - -// -// Misc. Functions -// -#define SDSS PC11 // SD is working using SDIO, not sure if this definition is needed? -#define LED_PIN PC6 // Mainboard soldered green LED, confirmed -#define PS_ON_PIN PB2 // Board has a power module connector, confirmed -#define KILL_PIN -1 // There is no reset button on the LCD -#define POWER_LOSS_PIN -1 // PB2 could be used for this as well - -// -// SD support -// -#define SDIO_SUPPORT - -#define SCK_PIN PC12 //confirmed working -#define MISO_PIN PC8 //confirmed working -#define MOSI_PIN PD2 //confirmed working -#define SS_PIN PC11 //confirmed working - -#define SD_DETECT_PIN PG15 //confirmed - -// -// Persistent Storage -// If no option is selected below the SD Card will be used -// (this section modelled after pins_LONGER3D_LK.h) -// Warning: Not tested yet! Pins traced with multimeter, mistakes are possible -//#define SPI_EEPROM - -#if ENABLED(SPI_EEPROM) - // Lerdge has an SPI EEPROM Winbond W25Q128 (128Mbits) https://www.pjrc.com/teensy/W25Q128FV.pdf - #define SPI_CHAN_EEPROM1 1 - #define SPI_EEPROM1_CS PB12 // datasheet: /CS pin, found with multimeter, not tested - #define EEPROM_SCK PB13 // datasheet: CLK pin, found with multimeter, not tested - #define EEPROM_MISO PB14 // datasheet: DO pin, found with multimeter, not tested - #define EEPROM_MOSI PB15 // datasheet: DI pin, found with multimeter, not tested - #define EEPROM_PAGE_SIZE 0x1000U // 4KB (from datasheet) - #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64KB for now... -#else - #define MARLIN_EEPROM_SIZE 0x800U // On SD, Limit to 2KB, require this amount of RAM -#endif - -// -// LCD / Controller -// - -// The LCD is initialized in FSMC mode -#define BEEPER_PIN PD13 //confirmed - -#define BTN_EN1 PC14 //confirmed -#define BTN_EN2 PC15 //confirmed -#define BTN_ENC PC13 //confirmed - -#define TFT_RESET_PIN PD6 //confirmed -#define TFT_BACKLIGHT_PIN PD3 //confirmed - -#define TFT_CS_PIN PD7 // TFT works -#define TFT_RS_PIN PD11 // TFT works - -// There is touch, but calibration is off -#define TOUCH_CS_PIN PB6 -#define TOUCH_SCK_PIN PB3 -#define TOUCH_MOSI_PIN PB5 -#define TOUCH_MISO_PIN PB4 diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h deleted file mode 100644 index bed51ca660..0000000000 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 - #error "LERDGE X supports only one hotend / E-steppers" -#endif - -#define BOARD_INFO_NAME "Lerdge X" -#define DEFAULT_MACHINE_NAME "LERDGE" - -#define STEP_TIMER 4 -#define TEMP_TIMER 2 - -#define I2C_EEPROM - -// -// Servos -// -//#define SERVO0_PIN PD13 - -// -// Limit Switches -// -#define X_STOP_PIN PB12 -#define Y_STOP_PIN PB13 -#define Z_STOP_PIN PB14 - -// -// Filament runout -// -#define FIL_RUNOUT_PIN PE1 - -// -// Z Probe (when not Z_MIN_PIN) -// -//#ifndef Z_MIN_PROBE_PIN -// #define Z_MIN_PROBE_PIN PB15 -//#endif - -// -// Steppers -// -#define X_STEP_PIN PB10 -#define X_DIR_PIN PB2 -#define X_ENABLE_PIN PB11 - -#define Y_STEP_PIN PB0 -#define Y_DIR_PIN PC5 -#define Y_ENABLE_PIN PB1 - -#define Z_STEP_PIN PA7 -#define Z_DIR_PIN PA6 -#define Z_ENABLE_PIN PC4 - -#define E0_STEP_PIN PA4 -#define E0_DIR_PIN PA3 -#define E0_ENABLE_PIN PA5 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC0 // Analog Input -#define TEMP_1_PIN -1 // Analog Input -#define TEMP_BED_PIN PC1 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA1 -#define HEATER_1_PIN -1 -#define HEATER_BED_PIN PA2 - -//#ifndef FAN_PIN -// #define FAN_PIN PC15 -//#endif -#define FAN1_PIN PC15 -#define FAN2_PIN PA0 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PC15 // FAN1_PIN -#endif - -// -// LED / Lighting -// -//#define CASE_LIGHT_PIN_CI -1 -//#define CASE_LIGHT_PIN_DO -1 -//#define NEOPIXEL_PIN -1 - -// -// Misc. Functions -// -#define SDSS PC11 -#define LED_PIN PC7 // Alive -#define PS_ON_PIN -1 -#define KILL_PIN -1 - -// Lerdge supports auto-power off and power loss sense through a single pin. -#define POWER_LOSS_PIN PC14 // Power-loss / nAC_FAULT - -#define SCK_PIN PC12 -#define MISO_PIN PC8 -#define MOSI_PIN PD2 -#define SS_PIN PC11 - -// -// SD support -// -#define SDIO_SUPPORT -#define SD_DETECT_PIN PA8 - -// -// LCD / Controller -// - -// The LCD is initialized in FSMC mode -#define BEEPER_PIN PD12 - -#define BTN_EN1 PE3 -#define BTN_EN2 PE4 -#define BTN_ENC PE2 - -#define TFT_RESET_PIN PD6 -#define TFT_BACKLIGHT_PIN PD3 - -#define TFT_CS_PIN PD7 -#define TFT_RS_PIN PD11 - -#define TOUCH_CS_PIN PB6 -#define TOUCH_SCK_PIN PB3 -#define TOUCH_MOSI_PIN PB5 -#define TOUCH_MISO_PIN PB4 diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h deleted file mode 100644 index c2f5f324ba..0000000000 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS_ROBIN2 supports up to 2 hotends / E-steppers." -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "MKS_ROBIN2" -#endif - -#ifndef DEFAULT_MACHINE_NAME - #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#endif - -#define SRAM_EEPROM_EMULATION - -// -// Limit Switches -// -#define X_MIN_PIN PG8 -#define X_MAX_PIN PG7 -#define Y_MIN_PIN PG6 -#define Y_MAX_PIN PG5 -#define Z_MIN_PIN PG4 -#define Z_MAX_PIN PG3 - -// -// Servos -// -#define SERVO0_PIN PB0 // XS2-5 -#define SERVO1_PIN PF7 // XS1-5 -#define SERVO2_PIN PF8 // XS1-6 - -// -// Steppers -// -#define X_STEP_PIN PE6 -#define X_DIR_PIN PE5 -#define X_ENABLE_PIN PC13 - -#define Y_STEP_PIN PE3 -#define Y_DIR_PIN PE2 -#define Y_ENABLE_PIN PE4 - -#define Z_STEP_PIN PE0 -#define Z_DIR_PIN PB9 -#define Z_ENABLE_PIN PE1 - -#define E0_STEP_PIN PG10 -#define E0_DIR_PIN PG9 -#define E0_ENABLE_PIN PB8 - -#define E1_STEP_PIN PD3 -#define E1_DIR_PIN PA15 -#define E1_ENABLE_PIN PD6 - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC1 // T1 <-> E0 -#define TEMP_1_PIN PC2 // T2 <-> E1 -#define TEMP_BED_PIN PC0 // T0 <-> Bed - -// -// Heaters / Fans -// -#define HEATER_0_PIN PF3 // Heater0 -#define HEATER_1_PIN PF2 // Heater1 -#define HEATER_BED_PIN PF4 // Hotbed -#define FAN_PIN PA7 // Fan0 - -// -// Misc. Functions -// -#define SDSS -1 // PB12 - -#define SD_DETECT_PIN PF9 -#define BEEPER_PIN PG2 diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h deleted file mode 100644 index a60a278149..0000000000 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Pin assignments for the RUMBA32 - * - * https://aus3d.com.au/rumba32 - * https://github.com/Aus3D/RUMBA32 - */ - -#define BOARD_INFO_NAME "RUMBA32" - -#if NO_EEPROM_SELECTED - #if MB(RUMBA32_V1_0) - #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB - #elif MB(RUMBA32_V1_1) - #define I2C_EEPROM - #define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24LC64T-I/OT) - #endif -#endif - -#if ENABLED(FLASH_EEPROM_EMULATION) - // Decrease delays and flash wear by spreading writes across the - // 128 kB sector allocated for EEPROM emulation. - #define FLASH_EEPROM_LEVELING -#endif - -#include "pins_RUMBA32_common.h" - -#if MB(RUMBA32_V1_1) - - #define SERVO0_PIN PA15 - #undef BTN_PIN - - #if HAS_TMC_UART - // - // TMC2208/TMC2209 stepper drivers - Software Serial is used according to below pins - // - #define X_SERIAL_TX_PIN PA14 - #define X_SERIAL_RX_PIN PC14 - - #define Y_SERIAL_TX_PIN PA13 - #define Y_SERIAL_RX_PIN PE4 - - #define Z_SERIAL_TX_PIN PB10 - #define Z_SERIAL_RX_PIN PE0 - - #define E0_SERIAL_TX_PIN PD11 - #define E0_SERIAL_RX_PIN PC13 - - #define E1_SERIAL_TX_PIN PB3 - #define E1_SERIAL_RX_PIN PD5 - - #define E2_SERIAL_TX_PIN PB4 - #define E2_SERIAL_RX_PIN PD1 - #endif -#endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h deleted file mode 100644 index ab277d4372..0000000000 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Pin assignments for the MKS RUMBA32 - * - * https://github.com/makerbase-mks/MKS-RUMBA32 - * - * The MKS and Aus3D versions have the same pinout but the MKS version - * has some added resistors and LEDs. The resistors needed for the - * TMC2208/9 UART interface are among the additions. Also added were - * connectors and resistors dedicated to the TMC2130 sensorless homing - * interface. - */ - -#define BOARD_INFO_NAME "MKS RUMBA32" - -#if NO_EEPROM_SELECTED - #define FLASH_EEPROM_EMULATION - #define MARLIN_EEPROM_SIZE 0x1000 // 4KB -#endif - -#if ENABLED(FLASH_EEPROM_EMULATION) - // Decrease delays and flash wear by spreading writes across the - // 128 kB sector allocated for EEPROM emulation. - #define FLASH_EEPROM_LEVELING -#endif - -#define ENABLE_SPI1 - -#include "pins_RUMBA32_common.h" - -#if HAS_TMC_UART - /** - * TMC2208/TMC2209 stepper drivers - * - * Hardware serial communication ports. - * If undefined software serial is used according to the pins below - */ - //#define X_HARDWARE_SERIAL Serial1 - //#define X2_HARDWARE_SERIAL Serial1 - //#define Y_HARDWARE_SERIAL Serial1 - //#define Y2_HARDWARE_SERIAL Serial1 - //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 - //#define E0_HARDWARE_SERIAL Serial1 - //#define E1_HARDWARE_SERIAL Serial1 - //#define E2_HARDWARE_SERIAL Serial1 - //#define E3_HARDWARE_SERIAL Serial1 - //#define E4_HARDWARE_SERIAL Serial1 - - // - // Software serial - // - #define X_SERIAL_TX_PIN PA3 - #define X_SERIAL_RX_PIN PC14 - - #define Y_SERIAL_TX_PIN PA4 - #define Y_SERIAL_RX_PIN PE4 - - #define Z_SERIAL_TX_PIN PD13 - #define Z_SERIAL_RX_PIN PE0 - - #define E0_SERIAL_TX_PIN PD14 - #define E0_SERIAL_RX_PIN PC13 - - #define E1_SERIAL_TX_PIN PD15 - #define E1_SERIAL_RX_PIN PD5 - - #define E2_SERIAL_TX_PIN PD12 - #define E2_SERIAL_RX_PIN PD1 -#endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h deleted file mode 100644 index d52bb11d12..0000000000 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ /dev/null @@ -1,183 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Common pin assignments for all RUMBA32 boards - */ - -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 - #error "RUMBA32 boards support up to 3 hotends / E-steppers." -#endif - -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -// Use soft PWM for fans - PWM is not working properly when paired with STM32 Arduino Core v1.7.0 -// This can be removed when Core version is updated and PWM behaviour is fixed. -#define FAN_SOFT_PWM - -// -// Configure Timers -// TIM6 is used for TONE -// TIM7 is used for SERVO -// TIMER_SERIAL defaults to TIM7 and must be overridden in the platformio.h file if SERVO will also be used. -// This will be difficult to solve from the Arduino IDE, without modifying the RUMBA32 variant -// included with the STM32 framework. - -#define STEP_TIMER 10 -#define TEMP_TIMER 14 -#define HAL_TIMER_RATE F_CPU - -// -// Limit Switches -// -#define X_MIN_PIN PB12 -#define X_MAX_PIN PB13 -#define Y_MIN_PIN PB15 -#define Y_MAX_PIN PD8 -#define Z_MIN_PIN PD9 -#define Z_MAX_PIN PD10 - -// -// Steppers -// -#define X_STEP_PIN PA0 -#define X_DIR_PIN PC15 -#define X_ENABLE_PIN PC11 -#define X_CS_PIN PC14 - -#define Y_STEP_PIN PE5 -#define Y_DIR_PIN PE6 -#define Y_ENABLE_PIN PE3 -#define Y_CS_PIN PE4 - -#define Z_STEP_PIN PE1 -#define Z_DIR_PIN PE2 -#define Z_ENABLE_PIN PB7 -#define Z_CS_PIN PE0 - -#define E0_STEP_PIN PB5 -#define E0_DIR_PIN PB6 -#define E0_ENABLE_PIN PC12 -#define E0_CS_PIN PC13 - -#define E1_STEP_PIN PD6 -#define E1_DIR_PIN PD7 -#define E1_ENABLE_PIN PD4 -#define E1_CS_PIN PD5 - -#define E2_STEP_PIN PD2 -#define E2_DIR_PIN PD3 -#define E2_ENABLE_PIN PD0 -#define E2_CS_PIN PD1 - -#if ENABLED(TMC_USE_SW_SPI) - #ifndef TMC_SW_MOSI - #define TMC_SW_MOSI PA7 - #endif - #ifndef TMC_SW_MISO - #define TMC_SW_MISO PA6 - #endif - #ifndef TMC_SW_SCK - #define TMC_SW_SCK PA5 - #endif -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PC4 -#define TEMP_1_PIN PC3 -#define TEMP_2_PIN PC2 -#define TEMP_3_PIN PC1 -#define TEMP_BED_PIN PC0 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PC6 -#define HEATER_1_PIN PC7 -#define HEATER_2_PIN PC8 -#define HEATER_BED_PIN PA1 - -#define FAN_PIN PC9 -#define FAN1_PIN PA8 - -// -// SPI -// -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 - -// -// Misc. Functions -// -#define LED_PIN PB14 -#define BTN_PIN PC10 -#define PS_ON_PIN PE11 -#define KILL_PIN PC5 - -#define SDSS PA2 -#define SD_DETECT_PIN PB0 -#define BEEPER_PIN PE8 - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #define BTN_EN1 PB2 - #define BTN_EN2 PB1 - #define BTN_ENC PE7 - - #define LCD_PINS_RS PE10 - #define LCD_PINS_ENABLE PE9 - #define LCD_PINS_D4 PE12 - - #if ENABLED(MKS_MINI_12864) - #define DOGLCD_CS PE13 - #define DOGLCD_A0 PE14 - #endif - - #if ENABLED(ULTIPANEL) - #define LCD_PINS_D5 PE13 - #define LCD_PINS_D6 PE14 - #define LCD_PINS_D7 PE15 - #endif - - // Alter timing for graphical display - #if HAS_MARLINUI_U8GLIB - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(600) - #endif - #endif - -#endif diff --git a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h deleted file mode 100644 index 0278dd8434..0000000000 --- a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h +++ /dev/null @@ -1,359 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// Source: https://github.com/stm32duino/Arduino_Core_STM32/blob/master/variants/ST3DP001_EVAL/variant.cpp - -/** - * HOW TO COMPILE - * - * PlatformIO - Use the STM32F401VE_STEVAL environment (or the "Auto Build Marlin" extension). - * - * Arduino - Tested with 1.8.10 - * Install library per https://github.com/stm32duino/Arduino_Core_STM32 - * Make the following selections under the TOOL menu in the Arduino IDE - * Board: "3D printer boards" - * Board part number: "STEVAL-3DP001V1" - * U(S)ART support: "Enabled (generic "Serial")" - * USB support (if available): "CDC (no generic "Serial")" - * Optimize: "Smallest (-Os default)" - * C Runtime Library: "newlib Nano (default)" - */ - -#pragma once - -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#endif - -#ifndef MACHINE_NAME - #define MACHINE_NAME "STEVAL-3DP001V1" -#endif - -// -// Limit Switches -// -#define X_MIN_PIN 39 // PD8 X_STOP -#define Y_MIN_PIN 40 // PD9 Y_STOP -#define Z_MIN_PIN 41 // PD10 Z_STOP - -#define X_MAX_PIN 44 // PD0 W_STOP -#define Y_MAX_PIN 43 // PA8 V_STOP -#define Z_MAX_PIN 42 // PD11 U_STOP - -// -// Z Probe (when not Z_MIN_PIN) -// -//#ifndef Z_MIN_PROBE_PIN -// #define Z_MIN_PROBE_PIN 16 // PA4 -//#endif - -// -// Filament runout -// -//#define FIL_RUNOUT_PIN 53 // PA3 BED_THE - -// -// Steppers -// - -#define X_STEP_PIN 61 // PE14 X_PWM -#define X_DIR_PIN 62 // PE15 X_DIR -#define X_ENABLE_PIN 60 // PE13 X_RES -#define X_CS_PIN 16 // PA4 SPI_CS - -#define Y_STEP_PIN 64 // PB10 Y_PWM -#define Y_DIR_PIN 65 // PE9 Y_DIR -#define Y_ENABLE_PIN 63 // PE10 Y_RES -#define Y_CS_PIN 16 // PA4 SPI_CS - -#define Z_STEP_PIN 67 // PC6 Z_PWM -#define Z_DIR_PIN 68 // PC0 Z_DIR -#define Z_ENABLE_PIN 66 // PC15 Z_RES -#define Z_CS_PIN 16 // PA4 SPI_CS - -#define E0_STEP_PIN 71 // PD12 E1_PW -#define E0_DIR_PIN 70 // PC13 E1_DIR -#define E0_ENABLE_PIN 69 // PC14 E1_RE -#define E0_CS_PIN 16 // PA4 SPI_CS - -#define E1_STEP_PIN 73 // PE5 E2_PWM -#define E1_DIR_PIN 74 // PE6 E2_DIR -#define E1_ENABLE_PIN 72 // PE4 E2_RESE -#define E1_CS_PIN 16 // PA4 SPI_CS - -#define E2_STEP_PIN 77 // PB8 E3_PWM -#define E2_DIR_PIN 76 // PE2 E3_DIR -#define E2_ENABLE_PIN 75 // PE3 E3_RESE -#define E2_CS_PIN 16 // PA4 SPI_CS - -// needed to pass a sanity check -#define X2_CS_PIN 16 // PA4 SPI_CS -#define Y2_CS_PIN 16 // PA4 SPI_CS -#define Z2_CS_PIN 16 // PA4 SPI_CS -#define Z3_CS_PIN 16 // PA4 SPI_CS -#define E3_CS_PIN 16 // PA4 SPI_CS -#define E4_CS_PIN 16 // PA4 SPI_CS -#define E5_CS_PIN 16 // PA4 SPI_CS - -#if HAS_L64XX - #define L6470_CHAIN_SCK_PIN 17 // PA5 - #define L6470_CHAIN_MISO_PIN 18 // PA6 - #define L6470_CHAIN_MOSI_PIN 19 // PA7 - #define L6470_CHAIN_SS_PIN 16 // PA4 - - //#define SCK_PIN L6470_CHAIN_SCK_PIN - //#define MISO_PIN L6470_CHAIN_MISO_PIN - //#define MOSI_PIN L6470_CHAIN_MOSI_PIN -#else - //#define SCK_PIN 13 // PB13 SPI_S - //#define MISO_PIN 12 // PB14 SPI_M - //#define MOSI_PIN 11 // PB15 SPI_M -#endif - -/** - * Macro to reset/enable L6474 stepper drivers - * - * IMPORTANT - To disable (bypass) L6474s, install the corresponding - * resistors (R11 - R17) and change the "V" to "0" for the - * corresponding pins here: - */ -#define ENABLE_RESET_L64XX_CHIPS(V) do{ OUT_WRITE(X_ENABLE_PIN, V); \ - OUT_WRITE(Y_ENABLE_PIN, V); \ - OUT_WRITE(Z_ENABLE_PIN, V); \ - OUT_WRITE(E0_ENABLE_PIN,V); \ - OUT_WRITE(E1_ENABLE_PIN,V); \ - OUT_WRITE(E2_ENABLE_PIN,V); \ - }while(0) - -// -// Temperature Sensors -// -#define TEMP_0_PIN 3 // Analog input 3, digital pin 54 PA0 E1_THERMISTOR -#define TEMP_1_PIN 4 // Analog input 4, digital pin 55 PA1 E2_THERMISTOR -#define TEMP_2_PIN 5 // Analog input 5, digital pin 56 PA2 E3_THERMISTOR -#define TEMP_BED_PIN 0 // Analog input 0, digital pin 51 PC2 BED_THERMISTOR_1 -#define TEMP_BED_1_PIN 1 // Analog input 1, digital pin 52 PC3 BED_THERMISTOR_2 -#define TEMP_BED_2_PIN 2 // Analog input 2, digital pin 53 PA3 BED_THERMISTOR_3 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 48 // PC7 E1_HEAT_PWM -#define HEATER_1_PIN 49 // PB0 E2_HEAT_PWM -#define HEATER_2_PIN 50 // PB1 E3_HEAT_PWM -#define HEATER_BED_PIN 46 // PD14 (BED_HEAT_1 FET -#define HEATER_BED_1_PIN 45 // PD13 (BED_HEAT_2 FET -#define HEATER_BED_2_PIN 47 // PD15 (BED_HEAT_3 FET - -#define FAN_PIN 57 // PC4 E1_FAN PWM pin, Part cooling fan FET -#define FAN1_PIN 58 // PC5 E2_FAN PWM pin, Extruder fan FET -#define FAN2_PIN 59 // PE8 E3_FAN PWM pin, Controller fan FET - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 58 // FAN1_PIN -#endif - -// -// Misc functions -// -#define SDSS 16 // PA4 SPI_CS -#define LED_PIN -1 // 9 // PE1 green LED Heart beat -#define PS_ON_PIN -1 -#define KILL_PIN -1 -#define POWER_LOSS_PIN -1 // PWR_LOSS / nAC_FAULT - -// -// LCD / Controller -// -//#define SD_DETECT_PIN 66 // PA15 SD_CA -//#define BEEPER_PIN 24 // PC9 SDIO_D1 -//#define LCD_PINS_RS 65 // PE9 Y_DIR -//#define LCD_PINS_ENABLE 59 // PE8 E3_FAN -//#define LCD_PINS_D4 10 // PB12 SPI_C -//#define LCD_PINS_D5 13 // PB13 SPI_S -//#define LCD_PINS_D6 12 // PB14 SPI_M -//#define LCD_PINS_D7 11 // PB15 SPI_M -//#define BTN_EN1 57 // PC4 E1_FAN -//#define BTN_EN2 58 // PC5 E2_FAN -//#define BTN_ENC 52 // PC3 BED_THE - -// -// Extension pins -// -//#define EXT0_PIN 49 // PB0 E2_HEAT -//#define EXT1_PIN 50 // PB1 E3_HEAT -//#define EXT2_PIN // PB2 not used (tied to ground -//#define EXT3_PIN 39 // PD8 X_STOP -//#define EXT4_PIN 40 // PD9 Y_STOP -//#define EXT5_PIN 41 // PD10 Z_STOP -//#define EXT6_PIN 42 // PD11 -//#define EXT7_PIN 71 // PD12 E1_PW -//#define EXT8_PIN 64 // PB10 Y_PWM - -// WIFI -// 2 // PD3 CTS -// 3 // PD4 RTS -// 4 // PD5 TX -// 5 // PD6 RX -// 6 // PB5 WIFI_WAKEUP -// 7 // PE11 WIFI_RESET -// 8 // PE12 WIFI_BOOT - -// I2C USER -// 14 // PB7 SDA -// 15 // PB6 SCL - -// JTAG -// 20 // PA13 JTAG_TMS/SWDIO -// 21 // PA14 JTAG_TCK/SWCLK -// 22 // PB3 JTAG_TDO/SWO - -// -// Onboard SD support -// -#define SDIO_D0_PIN 23 // PC8 SDIO_D0 -#define SDIO_D1_PIN 24 // PC9 SDIO_D1 -//#define SD_CARD_DETECT_PIN 25 // PA15 SD_CARD_DETECT -#define SDIO_D2_PIN 26 // PC10 SDIO_D2 -#define SDIO_D3_PIN 27 // PC11 SDIO_D3 -#define SDIO_CK_PIN 28 // PC12 SDIO_CK -#define SDIO_CMD_PIN 29 // PD2 SDIO_CMD - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -#if SD_CONNECTION_IS(ONBOARD) - #define SDIO_SUPPORT // Use SDIO for onboard SD - - #ifndef SDIO_SUPPORT - #define SOFTWARE_SPI // Use soft SPI for onboard SD - #undef SDSS - #define SDSS SDIO_D3_PIN - #define SCK_PIN SDIO_CK_PIN - #define MISO_PIN SDIO_D0_PIN - #define MOSI_PIN SDIO_CMD_PIN - #endif -#endif - -// OTG -// 30 // PA11 OTG_DM -// 31 // PA12 OTG_DP - -// USER_PINS -// 34 // PD7 USER3 -// 35 // PB9 USER1 -// 36 // PE0 USER2 -// 37 // PB4 USER4 - -// USERKET -// 38 // PE7 USER_BUTTON - -// 0 // PA9 TX -// 1 // PA10 RX - -// IR/PROBE -// 32 // PD1 IR_OUT -// 33 // PC1 IR_ON - -/** - * Logical pin vs. port/pin cross reference - * - * PA0 54 // E1_THERMISTOR PA9 0 // TX - * PA1 55 // E2_THERMISTOR PA10 1 // RX - * PA2 56 // E3_THERMISTOR PD3 2 // CTS - * PA3 53 // BED_THERMISTOR_3 PD4 3 // RTS - * PA4 16 // SPI_CS PD5 4 // TX - * PA5 17 // SPI_SCK PD6 5 // RX - * PA6 18 // SPI_MISO PB5 6 // WIFI_WAKEUP - * PA7 19 // SPI_MOSI PE11 7 // WIFI_RESET - * PA8 43 // V_STOP PE12 8 // WIFI_BOOT - * PA9 0 // TX PE1 9 // STATUS_LED - * PA10 1 // RX PB12 10 // SPI_CS - * PA11 30 // OTG_DM PB15 11 // SPI_MOSI - * PA12 31 // OTG_DP PB14 12 // SPI_MISO - * PA13 20 // JTAG_TMS/SWDIO PB13 13 // SPI_SCK - * PA14 21 // JTAG_TCK/SWCLK PB7 14 // SDA - * PA15 25 // SD_CARD_DETECT PB6 15 // SCL - * PB0 49 // E2_HEAT_PWM PA4 16 // SPI_CS - * PB1 50 // E3_HEAT_PWM PA5 17 // SPI_SCK - * PB3 22 // JTAG_TDO/SWO PA6 18 // SPI_MISO - * PB4 37 // USER4 PA7 19 // SPI_MOSI - * PB5 6 // WIFI_WAKEUP PA13 20 // JTAG_TMS/SWDIO - * PB6 15 // SCL PA14 21 // JTAG_TCK/SWCLK - * PB7 14 // SDA PB3 22 // JTAG_TDO/SWO - * PB8 77 // E3_PWM PC8 23 // SDIO_D0 - * PB9 35 // USER1 PC9 24 // SDIO_D1 - * PB10 64 // Y_PWM PA15 25 // SD_CARD_DETECT - * PB12 10 // SPI_CS PC10 26 // SDIO_D2 - * PB13 13 // SPI_SCK PC11 27 // SDIO_D3 - * PB14 12 // SPI_MISO PC12 28 // SDIO_CK - * PB15 11 // SPI_MOSI PD2 29 // SDIO_CMD - * PC0 68 // Z_DIR PA11 30 // OTG_DM - * PC1 33 // IR_ON PA12 31 // OTG_DP - * PC2 51 // BED_THERMISTOR_1 PD1 32 // IR_OUT - * PC3 52 // BED_THERMISTOR_2 PC1 33 // IR_ON - * PC4 57 // E1_FAN PD7 34 // USER3 - * PC5 58 // E2_FAN PB9 35 // USER1 - * PC6 67 // Z_PWM PE0 36 // USER2 - * PC7 48 // E1_HEAT_PWM PB4 37 // USER4 - * PC8 23 // SDIO_D0 PE7 38 // USER_BUTTON - * PC9 24 // SDIO_D1 PD8 39 // X_STOP - * PC10 26 // SDIO_D2 PD9 40 // Y_STOP - * PC11 27 // SDIO_D3 PD10 41 // Z_STOP - * PC12 28 // SDIO_CK PD11 42 // U_STOP - * PC13 70 // E1_DIR PA8 43 // V_STOP - * PC14 69 // E1_RESET PD0 44 // W_STOP - * PC15 66 // Z_RESET PD13 45 // BED_HEAT_2 - * PD0 44 // W_STOP PD14 46 // BED_HEAT_1 - * PD1 32 // IR_OUT PD15 47 // BED_HEAT_3 - * PD2 29 // SDIO_CMD PC7 48 // E1_HEAT_PWM - * PD3 2 // CTS PB0 49 // E2_HEAT_PWM - * PD4 3 // RTS PB1 50 // E3_HEAT_PWM - * PD5 4 // TX PC2 51 // BED_THERMISTOR_1 - * PD6 5 // RX PC3 52 // BED_THERMISTOR_2 - * PD7 34 // USER3 PA3 53 // BED_THERMISTOR_3 - * PD8 39 // X_STOP PA0 54 // E1_THERMISTOR - * PD9 40 // Y_STOP PA1 55 // E2_THERMISTOR - * PD10 41 // Z_STOP PA2 56 // E3_THERMISTOR - * PD11 42 // U_STOP PC4 57 // E1_FAN - * PD12 71 // E1_PWM PC5 58 // E2_FAN - * PD13 45 // BED_HEAT_2 PE8 59 // E3_FAN - * PD14 46 // BED_HEAT_1 PE13 60 // X_RESET - * PD15 47 // BED_HEAT_3 PE14 61 // X_PWM - * PE0 36 // USER2 PE15 62 // X_DIR - * PE1 9 // STATUS_LED PE10 63 // Y_RESET - * PE2 76 // E3_DIR PB10 64 // Y_PWM - * PE3 75 // E3_RESET PE9 65 // Y_DIR - * PE4 72 // E2_RESET PC15 66 // Z_RESET - * PE5 73 // E2_PWM PC6 67 // Z_PWM - * PE6 74 // E2_DIR PC0 68 // Z_DIR - * PE7 38 // USER_BUTTON PC14 69 // E1_RESET - * PE8 59 // E3_FAN PC13 70 // E1_DIR - * PE9 65 // Y_DIR PD12 71 // E1_PWM - * PE10 63 // Y_RESET PE4 72 // E2_RESET - * PE11 7 // WIFI_RESET PE5 73 // E2_PWM - * PE12 8 // WIFI_BOOT PE6 74 // E2_DIR - * PE13 60 // X_RESET PE3 75 // E3_RESET - * PE14 61 // X_PWM PE2 76 // E3_DIR - * PE15 62 // X_DIR PB8 77 // E3_PWM - */ diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h deleted file mode 100644 index e2463fd47e..0000000000 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ /dev/null @@ -1,195 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 - #error "STM32F4 supports up to 2 hotends / E-steppers." -#endif - -#define DEFAULT_MACHINE_NAME "STM32F446VET6" -#define BOARD_INFO_NAME "STM32F4 VAkE" - -//#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 // 4KB - -// -// Servos -// -//#define SERVO0_PIN PE13 -//#define SERVO1_PIN PE14 - -// -// Limit Switches -// -#define X_STOP_PIN PE10 -#define Y_STOP_PIN PE9 -#define Z_STOP_PIN PE8 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PA4 -#endif - -// -// Filament runout -// -#define FIL_RUNOUT_PIN PA3 - -// -// Steppers -// - -#define STEPPER_ENABLE_PIN PB2 - -#define X_STEP_PIN PC6 // X_STEP -#define X_DIR_PIN PC7 // X_DIR -#define X_ENABLE_PIN PB2 // -#ifndef X_CS_PIN - #define X_CS_PIN PC8 // X_CS -#endif - -#define Y_STEP_PIN PD9 // Y_STEP -#define Y_DIR_PIN PD10 // Y_DIR -#define Y_ENABLE_PIN PB2 // -#ifndef Y_CS_PIN - #define Y_CS_PIN PD11 // Y_CS -#endif - -#define Z_STEP_PIN PE15 // Z_STEP -#define Z_DIR_PIN PB10 // Z_DIR -#define Z_ENABLE_PIN PB2 -#ifndef Z_CS_PIN - #define Z_CS_PIN PD8 -#endif - -#define E0_STEP_PIN PB1 -#define E0_DIR_PIN PB13 -#define E0_ENABLE_PIN PB2 -#ifndef E0_CS_PIN - #define E0_CS_PIN PE11 -#endif - -#define E1_STEP_PIN PC4 -#define E1_DIR_PIN PC5 -#define E1_ENABLE_PIN PB2 -#ifndef E1_CS_PIN - #define E1_CS_PIN PB0 -#endif - -#define SCK_PIN PE12 // PA5 // SPI1 for SD card -#define MISO_PIN PE13 // PA6 -#define MOSI_PIN PE14 // PA7 - -// added for SD card : optional or not ??? -//#define SD_CHIP_SELECT_PIN SDSS // The default chip select pin for the SD card is SS. -// The following three pins must not be redefined for hardware SPI. -//#define SPI_MOSI_PIN MOSI_PIN // SPI Master Out Slave In pin -//#define SPI_MISO_PIN MISO_PIN // SPI Master In Slave Out pin -//#define SPI_SCK_PIN SCK_PIN // SPI Clock pin - -// -// Temperature Sensors (Analog inputs) -// - -#define TEMP_0_PIN PC0 // Analog Input -#define TEMP_1_PIN PC1 // Analog Input -#define TEMP_2_PIN PC2 // Analog Input -#define TEMP_3_PIN PC3 // Analog Input -#define TEMP_BED_PIN PC3 // Analog Input - -// -// Heaters / Fans -// - -#define HEATER_0_PIN PD15 -#define HEATER_1_PIN PD14 -#define HEATER_BED_PIN PD12 - -#ifndef FAN_PIN - #define FAN_PIN PD13 -#endif -#define FAN1_PIN PB5 // PA0 -#define FAN2_PIN PB4 // PA1 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PD13 -#endif - -// -// Misc. Functions -// - -//#define CASE_LIGHT_PIN_CI PF13 -//#define CASE_LIGHT_PIN_DO PF14 -//#define NEOPIXEL_PIN PF13 - -// -// Průša i3 MK2 Multi Material Multiplexer Support -// -//#define E_MUX0_PIN PG3 -//#define E_MUX1_PIN PG4 - -#define LED_PIN PB14 // Alive -#define PS_ON_PIN PE0 -#define KILL_PIN PD5 -#define POWER_LOSS_PIN PA4 // ?? Power loss / nAC_FAULT - -#if ENABLED(SDSUPPORT) - #define SD_DETECT_PIN PB7 - #define SS_PIN PB_15 // USD_CS -> CS for onboard SD -#endif - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - #if ENABLED(SDSUPPORT) - #define SDSS PB6 // CS for SD card in LCD - #endif - #define BEEPER_PIN PC9 - #define LCD_PINS_RS PC12 - #define LCD_PINS_ENABLE PD7 - #define LCD_PINS_D4 PD1 - #define LCD_PINS_D5 PD2 - #define LCD_PINS_D6 PD3 - #define LCD_PINS_D7 PD4 - #define BTN_EN1 PD6 - #define BTN_EN2 PD0 - #define BTN_ENC PB12 -#endif - -// -// ST7920 Delays -// -#ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) -#endif -#ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) -#endif -#ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 DELAY_NS(715) -#endif diff --git a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h deleted file mode 100644 index 5e3d5f4ab5..0000000000 --- a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#ifndef STM32F767xx - #error "Oops! Select an STM32F767 environment" -#endif - -#define BOARD_INFO_NAME "NUCLEO-F767ZI" -#define DEFAULT_MACHINE_NAME "Prototype Board" - -#if NO_EEPROM_SELECTED - #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation -#endif - -#if ENABLED(FLASH_EEPROM_EMULATION) - // Decrease delays and flash wear by spreading writes across the - // 128 kB sector allocated for EEPROM emulation. - // Not yet supported on F7 hardware - // #define FLASH_EEPROM_LEVELING -#endif - -/** - * Timer assignments - * - * TIM1 - - * TIM2 - Hardware PWM (Fan/Heater Pins) - * TIM3 - Hardware PWM (Servo Pins) - * TIM4 - STEP_TIMER (Marlin) - * TIM5 - - * TIM6 - TIMER_TONE (variant.h) - * TIM7 - TIMER_SERVO (variant.h) - * TIM9 - TIMER_SERIAL (platformio.ini) - * TIM10 - For some reason trips Watchdog when used for SW Serial - * TIM11 - - * TIM12 - - * TIM13 - - * TIM14 - TEMP_TIMER (Marlin) - * - */ -#define STEP_TIMER 4 -#define TEMP_TIMER 14 - - -/** - * These pin assignments are arbitrary and intending for testing purposes. - * Assignments may not be ideal, and not every assignment has been tested. - * Proceed at your own risk. - * _CN7_ - * (X_STEP) PC6 | · · | PB8 (X_EN) - * (X_DIR) PB15 | · · | PB9 (X_CS) - * (LCD_D4) PB13 | · · | AVDD - * _CN8_ PB12 | · · | GND - * NC | · · | PC8 (HEATER_0) PA15 | · · | PA5 (SCLK) - * IOREF | · · | PC9 (BEEPER) PC7 | · · | PA6 (MISO) - * RESET | · · | PC10 (SERVO1_PIN) PB5 | · · | PA7 (MOSI) - * +3.3V | · · | PC11 (HEATER_BED) PB3 | · · | PD14 (SD_DETECT) - * +5V | · · | PC12 (SDSS) PA4 | · · | PD15 (LCD_ENABLE) - * GND | · · | PD2 (SERVO0_PIN) PB4 | · · | PF12 (LCD_RS) - * GND | · · | PG2  ̄ ̄ ̄ - * VIN | · · | PG3 -_*  ̄ ̄ ̄ _CN10 - * AVDD | · · | PF13 (BTN_EN1) - * _CN9_ AGND | · · | PE9 (BTN_EN2) - * (TEMP_0) PA3 | · · | PD7 GND | · · | PE11 (BTN_ENC) - * (TEMP_BED) PC0 | · · | PD6 PB1 | · · | PF14 - * PC3 | · · | PD5 PC2 | · · | PE13 - * PF3 | · · | PD4 PF4 | · · | PF15 - * PF5 | · · | PD3 (E_STEP) PB6 | · · | PG14 (E_EN) - * PF10 | · · | GND (E_DIR) PB2 | · · | PG9 (E_CS) - * NC | · · | PE2 GND | · · | PE8 - * PA7 | · · | PE4 PD13 | · · | PE7 - * PF2 | · · | PE5 PD12 | · · | GND - * (Y_STEP) PF1 | · · | PE6 (Y_EN) (Z_STEP) PD11 | · · | PE10 (Z_EN) - * (Y_DIR) PF0 | · · | PE3 (Y_CS) (Z_DIR) PE2 | · · | PE12 (Z_CS) - * GND | · · | PF8 GND | · · | PE14 - * (Z_MAX) PD0 | · · | PF7 (X_MIN) PA0 | · · | PE15 - * (Z_MIN) PD1 | · · | PF9 (X_MAX) PB0 | · · | PB10 (FAN) - * (Y_MAX) PG0 | · · | PG1 (Y_MIN) PE0 | · · | PB11 (FAN1) - *  ̄ ̄ ̄  ̄ ̄ ̄ ̄ - */ - -#define X_MIN_PIN PF7 -#define X_MAX_PIN PF9 -#define Y_MIN_PIN PG1 -#define Y_MAX_PIN PG0 -#define Z_MIN_PIN PD1 -#define Z_MAX_PIN PD0 - -// -// Steppers -// -#define X_STEP_PIN PC6 -#define X_DIR_PIN PB15 -#define X_ENABLE_PIN PB8 -#define X_CS_PIN PB9 - -#define Y_STEP_PIN PF1 -#define Y_DIR_PIN PF0 -#define Y_ENABLE_PIN PE6 -#define Y_CS_PIN PE3 - -#define Z_STEP_PIN PD11 -#define Z_DIR_PIN PE2 -#define Z_ENABLE_PIN PE10 -#define Z_CS_PIN PE12 - -#define E0_STEP_PIN PB6 -#define E0_DIR_PIN PB2 -#define E0_ENABLE_PIN PG14 -#define E0_CS_PIN PG9 - -#if HAS_TMC_UART - #define X_SERIAL_TX_PIN PB9 - #define X_SERIAL_RX_PIN PB9 - - #define Y_SERIAL_TX_PIN PE3 - #define Y_SERIAL_RX_PIN PE3 - - #define Z_SERIAL_TX_PIN PE12 - #define Z_SERIAL_RX_PIN PE12 - - #define E_SERIAL_TX_PIN PG9 - #define E_SERIAL_RX_PIN PG9 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN PA3 -#define TEMP_BED_PIN PC0 - -// -// Heaters / Fans -// -#define HEATER_0_PIN PA15 // PWM Capable, TIM2_CH1 -#define HEATER_BED_PIN PB3 // PWM Capable, TIM2_CH2 - -#ifndef FAN_PIN - #define FAN_PIN PB10 // PWM Capable, TIM2_CH3 -#endif -#define FAN1_PIN PB11 // PWM Capable, TIM2_CH4 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN FAN1_PIN -#endif - -// -// Servos -// -#define SERVO0_PIN PB4 // PWM Capable, TIM3_CH1 -#define SERVO1_PIN PB5 // PWM Capable, TIM3_CH2 - -// SPI for external SD Card (Not entirely sure this will work) -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 -#define SS_PIN PA4 -#define SDSS PA4 - -#define LED_PIN LED_BLUE - -// -// LCD / Controller -// -#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define BEEPER_PIN PC7 // LCD_BEEPER - #define BTN_ENC PE11 // BTN_ENC - #define SD_DETECT_PIN PD14 - #define LCD_PINS_RS PF12 // LCD_RS - #define LCD_PINS_ENABLE PD15 // LCD_EN - #define LCD_PINS_D4 PB13 // LCD_D4 - // #define LCD_PINS_D5 - // #define LCD_PINS_D6 - // #define LCD_PINS_D7 - #define BTN_EN1 PF13 // BTN_EN1 - #define BTN_EN2 PE9 // BTN_EN2 - - #define BOARD_ST7920_DELAY_1 DELAY_NS(125) - #define BOARD_ST7920_DELAY_2 DELAY_NS(63) - #define BOARD_ST7920_DELAY_3 DELAY_NS(780) -#endif diff --git a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h deleted file mode 100644 index c3dc004728..0000000000 --- a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F7xx) - #error "Oops! Select an STM32F7 board in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "RemRam v1" -#define DEFAULT_MACHINE_NAME "RemRam" - -#if NO_EEPROM_SELECTED - #define SRAM_EEPROM_EMULATION // Emulate the EEPROM using Backup SRAM -#endif - -#if HOTENDS > 1 || E_STEPPERS > 1 - #error "RemRam supports only one hotend / E-stepper." -#endif - -// -// Limit Switches -// -#if DISABLED(SENSORLESS_HOMING) - #define X_MIN_PIN 58 - #define X_MAX_PIN 59 - #define Y_MIN_PIN 60 - #define Y_MAX_PIN 61 - #define Z_MIN_PIN 62 - #define Z_MAX_PIN 63 -#else - #define X_STOP_PIN 36 - #define Y_STOP_PIN 39 - #define Z_MIN_PIN 62 - #define Z_MAX_PIN 42 -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 26 // EXT_D1 -#endif - -// -// Steppers -// -#define X_STEP_PIN 22 -#define X_DIR_PIN 35 -#define X_ENABLE_PIN 34 -#define X_CS_PIN 14 - -#define Y_STEP_PIN 23 -#define Y_DIR_PIN 38 -#define Y_ENABLE_PIN 37 -#define Y_CS_PIN 15 - -#define Z_STEP_PIN 24 -#define Z_DIR_PIN 41 -#define Z_ENABLE_PIN 40 -#define Z_CS_PIN 16 - -#define E0_STEP_PIN 25 -#define E0_DIR_PIN 44 -#define E0_ENABLE_PIN 43 -#define E0_CS_PIN 10 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 64 // THERM_1 -#define TEMP_1_PIN 65 // THERM_2 -#define TEMP_BED_PIN 66 // THERM_3 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 33 -#define HEATER_BED_PIN 31 - -#ifndef FAN_PIN - #define FAN_PIN 30 // "FAN1" -#endif -#define FAN1_PIN 32 // "FAN2" - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN 32 -#endif - -// -// Servos -// -#define SERVO0_PIN 26 // PWM_EXT1 -#define SERVO1_PIN 27 // PWM_EXT2 - -#define SDSS 57 // Onboard SD card reader -//#define SDSS 9 // LCD SD card reader -#define LED_PIN 21 // STATUS_LED - -// -// LCD / Controller -// -#define SD_DETECT_PIN 56 // SD_CARD_DET -#define BEEPER_PIN 46 // LCD_BEEPER -#define LCD_PINS_RS 49 // LCD_RS -#define LCD_PINS_ENABLE 48 // LCD_EN -#define LCD_PINS_D4 50 // LCD_D4 -#define LCD_PINS_D5 51 // LCD_D5 -#define LCD_PINS_D6 52 // LCD_D6 -#define LCD_PINS_D7 53 // LCD_D7 -#define BTN_EN1 54 // BTN_EN1 -#define BTN_EN2 55 // BTN_EN2 -#define BTN_ENC 47 // BTN_ENC - -// -// Timers -// - -#define STEP_TIMER 2 diff --git a/Marlin/src/pins/stm32f7/pins_THE_BORG.h b/Marlin/src/pins/stm32f7/pins_THE_BORG.h deleted file mode 100644 index c050824a83..0000000000 --- a/Marlin/src/pins/stm32f7/pins_THE_BORG.h +++ /dev/null @@ -1,183 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#if NOT_TARGET(STM32F7) - #error "Oops! Select an STM32F7 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 - #error "The-Borg supports up to 3 hotends / E-steppers." -#endif - -#define BOARD_INFO_NAME "The-Borge" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME - -#ifndef MARLIN_EEPROM_SIZE - #define MARLIN_EEPROM_SIZE 0x1000 -#endif - -// Ignore temp readings during development. -//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 - -// -// Limit Switches -// -#define X_MIN_PIN PE9 -#define X_MAX_PIN PE10 -#define Y_MIN_PIN PE7 -#define Y_MAX_PIN PE8 -#define Z_MIN_PIN PF15 -#define Z_MAX_PIN PG0 -#define E_MIN_PIN PE2 -#define E_MAX_PIN PE3 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PA4 -#endif - -// -// Steppers -// -#define STEPPER_ENABLE_PIN PE0 - -#define X_STEP_PIN PC6 // 96, 39 in Arduino -#define X_DIR_PIN PC7 -#define X_ENABLE_PIN PC8 - -#define Y_STEP_PIN PD9 -#define Y_DIR_PIN PD10 -#define Y_ENABLE_PIN PD11 - -#define Z_STEP_PIN PE15 -#define Z_DIR_PIN PG1 -#define Z_ENABLE_PIN PD8 - -#define E0_STEP_PIN PB1 -#define E0_DIR_PIN PB2 -#define E0_ENABLE_PIN PE11 - -#define E1_STEP_PIN PC4 -#define E1_DIR_PIN PC5 -#define E1_ENABLE_PIN PB0 - -#define E2_STEP_PIN PC13 -#define E2_DIR_PIN PC14 -#define E2_ENABLE_PIN PC15 - -#define Z2_STEP_PIN PC13 -#define Z2_DIR_PIN PC14 -#define Z2_ENABLE_PIN PC15 - -#define SCK_PIN PA5 -#define MISO_PIN PA6 -#define MOSI_PIN PA7 - -#define SPI1_SCK_PIN PA5 -#define SPI1_MISO_PIN PA6 -#define SPI1_MOSI_PIN PA7 - -#define SPI6_SCK_PIN PG13 -#define SPI6_MISO_PIN PG12 -#define SPI6_MOSI_PIN PG14 - -// -// Temperature Sensors -// - -#define TEMP_0_PIN PC3 // Analog Input -#define TEMP_1_PIN PC2 // Analog Input -#define TEMP_2_PIN PC1 // Analog Input -#define TEMP_3_PIN PC0 // Analog Input - -#define TEMP_BED_PIN PF10 // Analog Input - -#define TEMP_5_PIN PE12 // Analog Input, Probe temp - -// -// Heaters / Fans -// -#define HEATER_0_PIN PD15 -#define HEATER_1_PIN PD14 -#define HEATER_BED_PIN PF6 - -#ifndef FAN_PIN - #define FAN_PIN PD13 -#endif -#define FAN1_PIN PA0 -#define FAN2_PIN PA1 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PA1 -#endif - -// -// Misc. Functions -// - -//#define CASE_LIGHT_PIN_CI PF13 -//#define CASE_LIGHT_PIN_DO PF14 -//#define NEOPIXEL_PIN PF13 - -// -// Průša i3 MK2 Multi Material Multiplexer Support -// - -#define E_MUX0_PIN PG3 -#define E_MUX1_PIN PG4 - -// -// Servos -// - -#define SERVO0_PIN PE13 -#define SERVO1_PIN PE14 - -#define SDSS PA8 -#define SS_PIN PA8 -#define LED_PIN PA2 // Alive -#define PS_ON_PIN PA3 -#define KILL_PIN -1 //PD5 // EXP2-10 -#define PWR_LOSS PG5 // Power loss / nAC_FAULT - -// -// MAX7219_DEBUG -// -#define MAX7219_CLK_PIN PG10 // EXP1-1 -#define MAX7219_DIN_PIN PD7 // EXP1-3 -#define MAX7219_LOAD_PIN PD1 // EXP1-5 - -// -// LCD / Controller -// -//#define SD_DETECT_PIN -1 //PB6) // EXP2-4 -#define BEEPER_PIN PG10 // EXP1-1 -#define LCD_PINS_RS PG9 // EXP1-4 -#define LCD_PINS_ENABLE PD7 // EXP1-3 -#define LCD_PINS_D4 PD1 // EXP1-5 -#define LCD_PINS_D5 PF0 // EXP1-6 -#define LCD_PINS_D6 PD3 // EXP1-7 -#define LCD_PINS_D7 PD4 // EXP1-8 -#define BTN_EN1 PD6 // EXP2-5 -#define BTN_EN2 PD0 // EXP2-3 -#define BTN_ENC PG11 // EXP1-2 diff --git a/Marlin/src/pins/teensy2/pins_5DPRINT.h b/Marlin/src/pins/teensy2/pins_5DPRINT.h deleted file mode 100644 index 908e12e0ba..0000000000 --- a/Marlin/src/pins/teensy2/pins_5DPRINT.h +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Rev B 2 JUN 2017 - * - * Converted to Arduino pin numbering - */ - -/** - * There are two Arduino IDE extensions that are compatible with this board - * and with the mainstream Marlin software. - * - * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html - * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu - * - * Installation instructions are at the above URL. Don't bother loading the - * libraries - they are not used with the Marlin software. - * - * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support - * - * Installation: - * - * 1. Go to the above URL, click on the "Clone or Download" button and then - * click on "Download ZIP" button. - * 2. Unzip the file, find the "printrboard" directory and then copy it to the - * hardware directory in Arduino. The Arduino hardware directory will probably - * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. - * 3. Restart Arduino. - * 4. Select "Printrboard" from the 'Tools > Board' menu. - * - * Teensyduino is the most popular option. Printrboard is used if your board doesn't have - * the Teensyduino bootloader on it. - */ - -/** - * To burn the bootloader that comes with Printrboard: - * - * 1. Connect your programmer to the board. - * 2. In the Arduino IDE select "Printrboard" and then select the programmer. - * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. - * 4. The programmer is no longer needed. Remove it. - */ - -/** - * 5DPrint D8 Driver board pin assignments - * - * https://bitbucket.org/makible/5dprint-d8-controller-board - */ - -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif - -#define DEFAULT_MACHINE_NAME "Makibox" -#define BOARD_INFO_NAME "5DPrint D8" - -// -// Servos -// -#define SERVO0_PIN 41 -#define SERVO1_PIN 42 -#define SERVO2_PIN 43 -#define SERVO3_PIN 44 - -// -// Limit Switches -// -#define X_STOP_PIN 37 // E5 -#define Y_STOP_PIN 36 // E4 -#define Z_STOP_PIN 19 // E7 - -// -// Steppers -// -#define X_STEP_PIN 28 // A0 -#define X_DIR_PIN 29 // A1 -#define X_ENABLE_PIN 17 // C7 - -#define Y_STEP_PIN 30 // A2 -#define Y_DIR_PIN 31 // A3 -#define Y_ENABLE_PIN 13 // C3 - -#define Z_STEP_PIN 32 // A4 -#define Z_DIR_PIN 33 // A5 -#define Z_ENABLE_PIN 12 // C2 - -#define E0_STEP_PIN 34 // A6 -#define E0_DIR_PIN 35 // A7 -#define E0_ENABLE_PIN 11 // C1 - -// -// Digital Microstepping -// -#define X_MS1_PIN 25 // B5 -#define X_MS2_PIN 26 // B6 -#define Y_MS1_PIN 9 // E1 -#define Y_MS2_PIN 8 // E0 -#define Z_MS1_PIN 7 // D7 -#define Z_MS2_PIN 6 // D6 -#define E0_MS1_PIN 5 // D5 -#define E0_MS2_PIN 4 // D4 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // F1 Analog Input -#define TEMP_BED_PIN 0 // F0 Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 15 // C5 -#define HEATER_BED_PIN 14 // C4 - -#ifndef FAN_PIN - #define FAN_PIN 16 // C6 PWM3A -#endif - -// -// Misc. Functions -// -#define SDSS 20 // B0 - -//DIGIPOTS slave addresses -#ifndef DIGIPOT_I2C_ADDRESS_A - #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for DIGIPOT 0x2C (0x58 <- 0x2C << 1) -#endif diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h deleted file mode 100644 index 97d210a0f8..0000000000 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Brainwave 1.0 pin assignments (AT90USB646) - * - * Requires hardware bundle for Arduino: - * https://github.com/unrepentantgeek/brainwave-arduino - */ - -/** - * Rev B 16 JAN 2017 - * - * Added pointer to a currently available Arduino IDE extension that will - * allow this board to use the latest Marlin software - */ - -/** - * Rev C 2 JUN 2017 - * - * Converted to Arduino pin numbering - */ - -/** - * Marlin_AT90USB - https://github.com/Bob-the-Kuhn/Marlin_AT90USB - * This is the only known IDE extension that is compatible with the pin definitions - * in this file, Adrduino 1.6.12 and the latest mainstream Marlin software. - * - * "Marlin_AT90USB" makes PWM0A available rather than the usual PWM1C. These PWMs share - * the same physical pin. Marlin uses TIMER1 to generate interrupts and sets it up such - * that PWM1A, PWM1B & PWM1C can't be used. - * - * Installation: - * - * 1. In the Arduino IDE, under Files -> Preferences paste the following URL - * https://rawgit.com/Bob-the-Kuhn/Marlin_AT90USB/master/package_MARLIN_AT90USB_index.json - * 2. Under Tools > Board -> Boards manager, scroll to the bottom, click on MARLIN_AT90USB - * and then click on "Install" - * 3. Select "AT90USB646_TEENSYPP" from the 'Tools > Board' menu. - */ - -/** - * To burn the bootloader that comes with Marlin_AT90USB: - * - * 1. Connect your programmer to the board. - * 2. In Arduino IDE select "AT90USB646_TEENSYPP" and then select the programmer. - * 3. In Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. - * 4. The programmer is no longer needed. Remove it. - */ - -#if NOT_TARGET(__AVR_AT90USB646__) - #error "Oops! Select 'AT90USB646_TEENSYPP' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Brainwave" - -// -// Limit Switches -// -#define X_STOP_PIN 35 // A7 -#define Y_STOP_PIN 34 // A6 -#define Z_STOP_PIN 33 // A5 - -// -// Steppers -// -#define X_STEP_PIN 3 // D3 -#define X_DIR_PIN 5 // D5 -#define X_ENABLE_PIN 4 // D4 -#define X_ATT_PIN 2 // D2 - -#define Y_STEP_PIN 7 // D7 -#define Y_DIR_PIN 9 // E1 -#define Y_ENABLE_PIN 8 // E0 -#define Y_ATT_PIN 6 // D6 - -#define Z_STEP_PIN 11 // C1 -#define Z_DIR_PIN 13 // C3 -#define Z_ENABLE_PIN 12 // C2 -#define Z_ATT_PIN 10 // C0 - -#define E0_STEP_PIN 15 // C5 -#define E0_DIR_PIN 17 // C7 -#define E0_ENABLE_PIN 16 // C6 -#define E0_ATT_PIN 14 // C4 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 7 // F7 Analog Input -#define TEMP_BED_PIN 6 // F6 Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 32 // A4 Extruder -#define HEATER_BED_PIN 18 // E6 Bed - -#ifndef FAN_PIN - #define FAN_PIN 31 // A3 Fan -#endif - -// -// Misc. Functions -// -#define LED_PIN 19 // E7 diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h deleted file mode 100644 index e41fcaab94..0000000000 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Brainwave Pro pin assignments (AT90USB1286) - * - * Requires hardware bundle for Arduino: - * https://github.com/unrepentantgeek/brainwave-arduino - */ - -/** - * Rev B 16 JAN 2017 - * - * Added pointers to currently available Arduino IDE extensions that will - * allow this board to use the latest Marlin software - * - * - * Rev C 2 JUN 2017 - * - * Converted to Arduino pin numbering - */ - -/** - * There are two Arduino IDE extensions that are compatible with this board - * and with the mainstream Marlin software. - * - * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html - * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu - * - * Installation instructions are at the above URL. Don't bother loading the - * libraries - they are not used with the Marlin software. - * - * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support - * - * Installation: - * - * 1. Go to the above URL, click on the "Clone or Download" button and then - * click on "Download ZIP" button. - * 2. Unzip the file, find the "printrboard" directory and then copy it to the - * hardware directory in Arduino. The Arduino hardware directory will probably - * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. - * 3. Restart Arduino. - * 4. Select "Printrboard" from the 'Tools > Board' menu. - * - * Teensyduino is the most popular option. Printrboard is used if your board doesn't have - * the Teensyduino bootloader on it. - */ - -/** - * To burn the bootloader that comes with Printrboard: - * - * 1. Connect your programmer to the board. - * 2. In the Arduino IDE select "Printrboard" and then select the programmer. - * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. - * 4. The programmer is no longer needed. Remove it. - */ - -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Brainwave Pro" - -// -// Limit Switches -// -#define X_STOP_PIN 45 // F7 -#define Y_STOP_PIN 12 // C2 -#define Z_STOP_PIN 36 // E4 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 11 // C1 -#endif - -// -// Steppers -// -#define X_STEP_PIN 9 // E1 -#define X_DIR_PIN 8 // E0 -#define X_ENABLE_PIN 23 // B3 - -#define Y_STEP_PIN 7 // D7 -#define Y_DIR_PIN 6 // D6 -#define Y_ENABLE_PIN 20 // B0 - -#define Z_STEP_PIN 5 // D5 -#define Z_DIR_PIN 4 // D4 -#define Z_ENABLE_PIN 37 // E5 - -#define E0_STEP_PIN 47 // E3 -#define E0_DIR_PIN 46 // E2 -#define E0_ENABLE_PIN 25 // B5 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 2 // F2 Analog Input -#define TEMP_1_PIN 1 // F1 Analog Input -#define TEMP_BED_PIN 0 // F0 Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 27 // B7 -#define HEATER_BED_PIN 26 // B6 Bed -#ifndef FAN_PIN - #define FAN_PIN 16 // C6 Fan, PWM3A -#endif - -// -// Misc. Functions -// -#define SDSS 20 // B0 -#define SD_DETECT_PIN 24 // B4 -#define LED_PIN 13 // C3 diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h deleted file mode 100644 index ffecc03b4a..0000000000 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ /dev/null @@ -1,169 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Rev B 2 JUN 2017 - * - * Converted to Arduino pin numbering - */ - -/** - * There are two Arduino IDE extensions that are compatible with this board - * and with the mainstream Marlin software. - * - * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html - * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu - * - * Installation instructions are at the above URL. Don't bother loading the - * libraries - they are not used with the Marlin software. - * - * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support - * - * Installation: - * - * 1. Go to the above URL, click on the "Clone or Download" button and then - * click on "Download ZIP" button. - * 2. Unzip the file, find the "printrboard" directory and then copy it to the - * hardware directory in Arduino. The Arduino hardware directory will probably - * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. - * 3. Restart Arduino. - * 4. Select "Printrboard" from the 'Tools > Board' menu. - * - * Teensyduino is the most popular option. Printrboard is used if your board doesn't have - * the Teensyduino bootloader on it. - */ - -/** - * To burn the bootloader that comes with Printrboard: - * - * 1. Connect your programmer to the board. - * 2. In the Arduino IDE select "Printrboard" and then select the programmer. - * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. - * 4. The programmer is no longer needed. Remove it. - */ - -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Printrboard" - -// Disable JTAG pins so they can be used for the Extrudrboard -#define DISABLE_JTAG - -// -// Limit Switches -// -#define X_STOP_PIN 47 // E3 -#define Y_STOP_PIN 20 // B0 SS -#define Z_STOP_PIN 36 // E4 - -// -// Steppers -// -#define X_STEP_PIN 28 // A0 -#define X_DIR_PIN 29 // A1 -#define X_ENABLE_PIN 19 // E7 - -#define Y_STEP_PIN 30 // A2 -#define Y_DIR_PIN 31 // A3 -#define Y_ENABLE_PIN 18 // E6 - -#define Z_STEP_PIN 32 // A4 -#define Z_DIR_PIN 33 // A5 -#define Z_ENABLE_PIN 17 // C7 - -#define E0_STEP_PIN 34 // A6 -#define E0_DIR_PIN 35 // A7 -#define E0_ENABLE_PIN 13 // C3 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // Analog Input -#define TEMP_BED_PIN 0 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 15 // C5 PWM3B - Extruder -#define HEATER_1_PIN 44 // F6 -#define HEATER_2_PIN 45 // F7 -#define HEATER_BED_PIN 14 // C4 PWM3C - -#ifndef FAN_PIN - #define FAN_PIN 16 // C6 PWM3A -#endif - -// -// Misc. Functions -// -#define SDSS 26 // B6 SDCS -#define FILWIDTH_PIN 2 // Analog Input - -// -// LCD / Controller -// -#if BOTH(ULTRA_LCD, NEWPANEL) - - #define LCD_PINS_RS 9 // E1 JP11-11 - #define LCD_PINS_ENABLE 8 // E0 JP11-10 - #define LCD_PINS_D4 7 // D7 JP11-8 - #define LCD_PINS_D5 6 // D6 JP11-7 - #define LCD_PINS_D6 5 // D5 JP11-6 - #define LCD_PINS_D7 4 // D4 JP11-5 - - #if ANY(VIKI2, miniVIKI) - #define BEEPER_PIN 8 // E0 JP11-10 - - #define DOGLCD_A0 40 // F2 JP2-2 - #define DOGLCD_CS 41 // F3 JP2-4 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 2 // D2 TX1 JP2-5 - #define BTN_EN2 3 // D3 RX1 JP2-7 - #define BTN_ENC 45 // F7 TDI JP2-12 - - #undef SDSS - #define SDSS 43 // F5 TMS JP2-8 - - #define STAT_LED_RED_PIN 12 // C2 JP11-14 - #define STAT_LED_BLUE_PIN 10 // C0 JP11-12 - - #elif ENABLED(LCD_I2C_PANELOLU2) - - #define BTN_EN1 3 // D3 RX1 JP2-7 - #define BTN_EN2 2 // D2 TX1 JP2-5 - #define BTN_ENC 41 // F3 JP2-4 - #undef SDSS - #define SDSS 38 // F0 B-THERM connector - use SD card on Panelolu2 - - #else - - #define BTN_EN1 10 // C0 JP11-12 - #define BTN_EN2 11 // C1 JP11-13 - #define BTN_ENC 12 // C2 JP11-14 - - #endif - -#endif // ULTRA_LCD && NEWPANEL diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h deleted file mode 100644 index d4f9fc7641..0000000000 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ /dev/null @@ -1,281 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Rev B 2 JUN 2017 - * - * Converted to Arduino pin numbering - */ - -/** - * There are two Arduino IDE extensions that are compatible with this board - * and with the mainstream Marlin software. - * - * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html - * Installation - https://www.pjrc.com/teensy/td_download.html - * - * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu - * - * Note: With Teensyduino extension, the Arduino IDE will report 130048 bytes of program storage space available, - * but there is actually only 122880 bytes due to the larger DFU bootloader shipped by default on all Printrboard RevF. - * - * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support - * - * Installation: - * - * 1. Go to the above URL, click on the "Clone or Download" button and then - * click on "Download ZIP" button. - * 2. Unzip the file, find the "printrboard" directory and then copy it to the - * hardware directory in Arduino. The Arduino hardware directory will probably - * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. - * 3. Restart Arduino. - * 4. Select "Printrboard" from the 'Tools > Board' menu. - * - * Teensyduino is the most popular and easiest option. - */ - -/** - * To burn the bootloader that comes with Printrboard HID extension: - * - * 1. Connect your programmer to the board. - * 2. In the Arduino IDE select "Printrboard" and then select the programmer. - * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. - * 4. The programmer is no longer needed. Remove it. - */ - -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif - -#if !defined(__MARLIN_DEPS__) && !defined(USBCON) - #error "USBCON should be defined by the platform for this board." -#endif - -#define BOARD_INFO_NAME "Printrboard Rev.F" - -// Disable JTAG pins so EXP1 pins work correctly -// (Its pins are used for the Extrudrboard and filament sensor, for example). -#define DISABLE_JTAG - -/** - * Note that REV F6 of the Printrboard stole the A HOTEND pin and - * reassigned it to a second fan for the extruder heater. It's - * recommended that you swap the A and B outputs on the Extrudrboard - * so EXTRUDERS=2 will still work on F6, using B for E1/HEATER_1/TEMP_1. - * See https://printrbot.zendesk.com/hc/en-us/articles/115003072346 - * - * If you have REV F6 you probably also want to set E0_AUTO_FAN_PIN - * to PRINTRBOARD_F6_HEATER_FAN_PIN (44). - * - * Define NO_EXTRUDRBOARD if you don't have an EXTRUDRBOARD and wish to - * reassign different functions to EXP1. - * - * Define NO_EXTRUDRBOARD_OUTPUT_SWAP if you have a REV F5 or lower and - * want to use EXTRUDRBOARD A for E1 and EXTRUDRBOARD B for E2. - */ -//#define NO_EXTRUDRBOARD -//#define NO_EXTRUDRBOARD_OUTPUT_SWAP - -// -// Limit Switches -// -#define X_STOP_PIN 47 // E3 -#define Y_STOP_PIN 24 // B4 PWM2A -#define Z_STOP_PIN 36 // E4 - -// -// Steppers -// -#define X_STEP_PIN 28 // A0 -#define X_DIR_PIN 29 // A1 -#define X_ENABLE_PIN 19 // E7 - -#define Y_STEP_PIN 30 // A2 -#define Y_DIR_PIN 31 // A3 -#define Y_ENABLE_PIN 18 // E6 - -#define Z_STEP_PIN 32 // A4 -#define Z_DIR_PIN 33 // A5 -#define Z_ENABLE_PIN 17 // C7 - -#define E0_STEP_PIN 34 // A6 -#define E0_DIR_PIN 35 // A7 -#define E0_ENABLE_PIN 13 // C3 - -#if DISABLED(NO_EXTRUDRBOARD) -#if DISABLED(NO_EXTRUDRBOARD_OUTPUT_SWAP) - #define E1_STEP_PIN 25 // B5 - #define E1_DIR_PIN 37 // E5 - #define E1_ENABLE_PIN 42 // F4 - - #define E2_STEP_PIN 2 // D2 - #define E2_DIR_PIN 3 // D3 - #define E2_ENABLE_PIN 43 // F5 -#else - #define E1_STEP_PIN 2 // D2 - #define E1_DIR_PIN 3 // D3 - #define E1_ENABLE_PIN 43 // F5 - - #define E2_STEP_PIN 25 // B5 - #define E2_DIR_PIN 37 // E5 - #define E2_ENABLE_PIN 42 // F4 -#endif -#endif // NO_EXTRUDRBOARD - -// Enable control of stepper motor currents with the I2C based MCP4728 DAC used on Printrboard REVF -#define HAS_MOTOR_CURRENT_DAC - -// Set default drive strength percents if not already defined - X, Y, Z, E axis -#ifndef DAC_MOTOR_CURRENT_DEFAULT - #define DAC_MOTOR_CURRENT_DEFAULT { 70, 70, 50, 70 } -#endif - -// Number of channels available for DAC -#define DAC_STEPPER_ORDER { 3, 2, 1, 0 } - -#define DAC_STEPPER_SENSE 0.11 -#define DAC_STEPPER_ADDRESS 0 -#define DAC_STEPPER_MAX 3520 -#define DAC_STEPPER_VREF 1 // internal Vref, gain 1x = 2.048V -#define DAC_STEPPER_GAIN 0 -#define DAC_OR_ADDRESS 0x00 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 1 // Analog Input (Extruder) -#define TEMP_BED_PIN 0 // Analog Input (Bed) - -#if DISABLED(NO_EXTRUDRBOARD) -#if DISABLED(NO_EXTRUDRBOARD_OUTPUT_SWAP) - #define TEMP_1_PIN 2 // Analog Input (Extrudrboard A THERM) - #define TEMP_2_PIN 3 // Analog Input (Extrudrboard B THERM) -#else - #define TEMP_1_PIN 3 // Analog Input (Extrudrboard B THERM) - #define TEMP_2_PIN 2 // Analog Input (Extrudrboard A THERM) -#endif -#endif - -// -// Heaters / Fans -// -#define HEATER_0_PIN 15 // C5 PWM3B - Extruder -#define HEATER_BED_PIN 14 // C4 PWM3C - -#if DISABLED(NO_EXTRUDRBOARD) -#if DISABLED(NO_EXTRUDRBOARD_OUTPUT_SWAP) - #define HEATER_1_PIN 44 // F6 - Extrudrboard A HOTEND - #define HEATER_2_PIN 45 // F7 - Extrudrboard B HOTEND -#else - #define HEATER_1_PIN 45 // F7 - Extrudrboard B HOTEND - #define HEATER_2_PIN 44 // F6 - Extrudrboard A HOTEND -#endif -#endif - -#ifndef FAN_PIN - #define FAN_PIN 16 // C6 PWM3A -#endif - -// -// LCD / Controller -// -//#define USE_INTERNAL_SD - -#if HAS_WIRED_LCD - #define LCD_PINS_RS 9 // E1 JP11-11 - #define LCD_PINS_ENABLE 8 // E0 JP11-10 - #define LCD_PINS_D4 7 // D7 JP11-8 - #define LCD_PINS_D5 6 // D6 JP11-7 - #define LCD_PINS_D6 5 // D5 JP11-6 - #define LCD_PINS_D7 4 // D4 JP11-5 - - #if ANY(VIKI2, miniVIKI) - - #define BEEPER_PIN 8 // E0 JP11-10 - #define DOGLCD_A0 40 // F2 JP2-2 - #define DOGLCD_CS 41 // F3 JP2-4 - #define LCD_SCREEN_ROT_180 - - #define BTN_EN1 2 // D2 TX1 JP2-5 - #define BTN_EN2 3 // D3 RX1 JP2-7 - #define BTN_ENC 45 // F7 TDI JP2-12 - - #define SDSS 3 // F5 TMS JP2-8 - - #define STAT_LED_RED_PIN 12 // C2 JP11-14 - #define STAT_LED_BLUE_PIN 10 // C0 JP11-12 - - #elif ENABLED(MINIPANEL) - - #if DISABLED(USE_INTERNAL_SD) - // PIN FASTIO PIN# ATUSB90 PIN# Teensy2.0++ PIN# Printrboard RevF Conn. MKSLCD12864 PIN# - #define SDSS 11 // 36 C1 EXP2-13 EXP2-07 - #define SD_DETECT_PIN 9 // 34 E1 EXP2-11 EXP2-04 - #endif - - // PIN FASTIO PIN# ATUSB90 PIN# Teensy2.0++ PIN# Printrboard RevF Conn. MKSLCD12864 PIN# - #define DOGLCD_A0 4 // 29 D4 EXP2-05 EXP1-04 - #define DOGLCD_CS 5 // 30 D5 EXP2-06 EXP1-05 - #define BTN_ENC 6 // 31 D6 EXP2-07 EXP1-09 - #define BEEPER_PIN 7 // 32 D7 EXP2-08 EXP1-10 - #define KILL_PIN 8 // 33 E0 EXP2-10 EXP2-03 - #define BTN_EN1 10 // 35 C0 EXP2-12 EXP2-06 - #define BTN_EN2 12 // 37 C2 EXP2-14 EXP2-08 - //#define LCD_BACKLIGHT_PIN 43 // 56 F5 EXP1-12 Not Implemented - //#define SCK 21 // 11 B1 ICSP-04 EXP2-09 - //#define MOSI 22 // 12 B2 ICSP-03 EXP2-05 - //#define MISO 23 // 13 B3 ICSP-06 EXP2-05 - - // Alter timing for graphical display - #define BOARD_ST7920_DELAY_1 DELAY_NS(313) - #define BOARD_ST7920_DELAY_2 DELAY_NS(313) - #define BOARD_ST7920_DELAY_3 DELAY_NS(313) - - #else - - #define BTN_EN1 10 // C0 JP11-12 - #define BTN_EN2 11 // C1 JP11-13 - #define BTN_ENC 12 // C2 JP11-14 - - #endif - -#endif - -// -// Misc. Functions -// -// PIN FASTIO PIN# ATUSB90 PIN# Teensy2.0++ PIN# Printrboard RevF Conn. -#ifndef SDSS - #define SDSS 20 // 10 B0 -#endif - -/** - * This is EXP1-2, which is also the TEMP_A_PIN for the Extrudrboard. - * If using w/ Extrudrboard, cut off pin 2 on the Extrudrboard male - * connector to ensure this is disconnected from the A THERM pullups. - * You probably want to set EXTRUDERS=2 and swap the Extrudrboard outputs, - * which will let you use Channel B on the Extrudrboard as E1. - */ -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 2 // Analog Input -#endif diff --git a/Marlin/src/pins/teensy2/pins_SAV_MKI.h b/Marlin/src/pins/teensy2/pins_SAV_MKI.h deleted file mode 100644 index 4d083ecd12..0000000000 --- a/Marlin/src/pins/teensy2/pins_SAV_MKI.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Rev B 2 JUN 2017 - * - * Converted to Arduino pin numbering - */ - -/** - * There are two Arduino IDE extensions that are compatible with this board - * and with the mainstream Marlin software. - * - * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html - * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu - * - * Installation instructions are at the above URL. Don't bother loading the - * libraries - they are not used with the Marlin software. - * - * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support - * - * Installation: - * - * 1. Go to the above URL, click on the "Clone or Download" button and then - * click on "Download ZIP" button. - * 2. Unzip the file, find the "printrboard" directory and then copy it to the - * hardware directory in Arduino. The Arduino hardware directory will probably - * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. - * 3. Restart Arduino. - * 4. Select "Printrboard" from the 'Tools > Board' menu. - * - * Teensyduino is the most popular option. Printrboard is used if your board doesn't have - * the Teensyduino bootloader on it. - */ - -/** - * To burn the bootloader that comes with Printrboard: - * - * 1. Connect your programmer to the board. - * 2. In the Arduino IDE select "Printrboard" and then select the programmer. - * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. - * 4. The programmer is no longer needed. Remove it. - */ - -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "SAV MkI" -#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME -#define DEFAULT_SOURCE_CODE_URL "https://tinyurl.com/onru38b" - -// -// Servos -// -#define SERVO0_PIN 39 // F1 In teensy's pin definition for pinMode (in servo.cpp) - -// -// Limit Switches -// -#define X_STOP_PIN 25 // B5 -#define Y_STOP_PIN 26 // B6 -//#define Z_STOP_PIN 27 // B7 -#define Z_STOP_PIN 36 // E4 For inductive sensor. -//#define E_STOP_PIN 36 // E4 - -// -// Steppers -// -#define X_STEP_PIN 28 // A0 -#define X_DIR_PIN 29 // A1 -#define X_ENABLE_PIN 19 // E7 - -#define Y_STEP_PIN 30 // A2 -#define Y_DIR_PIN 31 // A3 -#define Y_ENABLE_PIN 18 // E6 - -#define Z_STEP_PIN 32 // A4 -#define Z_DIR_PIN 33 // A5 -#define Z_ENABLE_PIN 17 // C7 - -#define E0_STEP_PIN 34 // A6 -#define E0_DIR_PIN 35 // A7 -#define E0_ENABLE_PIN 13 // C3 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 7 // F7 Analog Input (Extruder) -#define TEMP_BED_PIN 6 // F6 Analog Input (Bed) - -// -// Heaters / Fans -// -#define HEATER_0_PIN 15 // C5 PWM3B - Extruder -#define HEATER_BED_PIN 14 // C4 PWM3C - Bed - -#ifndef FAN_PIN - #define FAN_PIN 16 // C6 PWM3A -#endif - -// -// Misc. Functions -// -#define SDSS 20 // B0 - -// Extension header pin mapping -// ---------------------------- -// SCL (I2C)-D0 A0 (An), IO -// SDA (I2C)-D1 A1 (An), IO -// RX1-D2 A2 (An), IO -// TX1-D3 A3 (An), IO -// PWM-D24 A4 (An), IO -// 5V GND -// 12V GND -#define EXT_AUX_SCL_D0 0 // D0 PWM0B -#define EXT_AUX_SDA_D1 1 // D1 -#define EXT_AUX_RX1_D2 2 // D2 -#define EXT_AUX_TX1_D3 3 // D3 -#define EXT_AUX_PWM_D24 24 // B4 PWM2A -#define EXT_AUX_A0 0 // F0 Analog Input -#define EXT_AUX_A0_IO 38 // F0 Digital IO -#define EXT_AUX_A1 1 // F1 Analog Input -#define EXT_AUX_A1_IO 39 // F1 Digital IO -#define EXT_AUX_A2 2 // F2 Analog Input -#define EXT_AUX_A2_IO 40 // F2 Digital IO -#define EXT_AUX_A3 3 // F3 Analog Input -#define EXT_AUX_A3_IO 41 // F3 Digital IO -#define EXT_AUX_A4 4 // F4 Analog Input -#define EXT_AUX_A4_IO 42 // F4 Digital IO - -// -// LCD / Controller -// -#define BEEPER_PIN -1 -#define LCD_PINS_RS -1 -#define LCD_PINS_ENABLE -1 - -#if ENABLED(SAV_3DLCD) - // For LCD SHIFT register LCD - #define SR_DATA_PIN EXT_AUX_SDA_D1 - #define SR_CLK_PIN EXT_AUX_SCL_D0 -#endif - -#if EITHER(SAV_3DLCD, SAV_3DGLCD) - - #define BTN_EN1 EXT_AUX_A1_IO - #define BTN_EN2 EXT_AUX_A0_IO - #define BTN_ENC EXT_AUX_PWM_D24 - - #define KILL_PIN EXT_AUX_A2_IO - #define HOME_PIN EXT_AUX_A4_IO - -#else // Use the expansion header for spindle control - - // - // M3/M4/M5 - Spindle/Laser Control - // - #define SPINDLE_LASER_PWM_PIN 24 // B4 PWM2A - #define SPINDLE_LASER_ENA_PIN 39 // F1 Pin should have a pullup! - #define SPINDLE_DIR_PIN 40 // F2 - - #define CASE_LIGHT_PIN 0 // D0 PWM0B - -#endif diff --git a/Marlin/src/pins/teensy2/pins_TEENSY2.h b/Marlin/src/pins/teensy2/pins_TEENSY2.h deleted file mode 100644 index 4efd83d9bc..0000000000 --- a/Marlin/src/pins/teensy2/pins_TEENSY2.h +++ /dev/null @@ -1,188 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Rev B 2 JUN 2017 - * - * Converted to Arduino pin numbering - */ - -/** - * There are two Arduino IDE extensions that are compatible with this board - * and with the mainstream Marlin software. - * - * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html - * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu - * - * Installation instructions are at the above URL. Don't bother loading the - * libraries - they are not used with the Marlin software. - * - * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support - * - * Installation: - * - * 1. Go to the above URL, click on the "Clone or Download" button and then - * click on "Download ZIP" button. - * 2. Unzip the file, find the "printrboard" directory and then copy it to the - * hardware directory in Arduino. The Arduino hardware directory will probably - * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. - * 3. Restart Arduino. - * 4. Select "Printrboard" from the 'Tools > Board' menu. - * - * Teensyduino is the most popular option. Printrboard is used if your board doesn't have - * the Teensyduino bootloader on it. - */ - -/** - * To burn the bootloader that comes with Printrboard: - * - * 1. Connect your programmer to the board. - * 2. In the Arduino IDE select "Printrboard" and then select the programmer. - * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. - * 4. The programmer is no longer needed. Remove it. - */ - -/** - * Teensy++ 2.0 Breadboard pin assignments (AT90USB1286) - * Requires the Teensyduino software with Teensy++ 2.0 selected in Arduino IDE! - * https://www.pjrc.com/teensy/teensyduino.html - * See https://reprap.org/wiki/Printrboard for more info - * - * CLI build: HARDWARE_MOTHERBOARD=84 make - * - * DaveX plan for Teensylu/printrboard-type pinouts for a TeensyBreadboard: - * (ref teensylu & sprinter) - * - * USB - * GND GND |-----#####-----| +5V ATX +5SB - * ATX PS_ON PWM 27 |b7 ##### b6| 26 PWM* Stepper Enable - * PWM 0 |d0 b5| 25 PWM* - * PWM 1 |d1 b4| 24 PWM - * X_MIN 2 |d2 b3| 23 MISO_PIN - * Y_MIN 3 |d3 b2| 22 MOSI_PIN - * Z_MIN 4 |d4 * * b1| 21 SCK_PIN - * 5 |d5 e e b0| 20 SDSS - * LED 6 |d6 5 4 e7| 19 - * 7 |d7 e6| 18 - * LCD RS 8 |e0 | GND - * LCD EN 9 |e1 a4 a0 R| AREF - * LCD D4 10 |c0 a5 a1 f0| 38 A0 ENC_1 - * LCD D5 11 |c1 a6 a2 f1| 39 A1 ENC_2 - * LCD D6 12 |c2 a7 a3 f2| 40 A2 ENC_CLK - * LCD D6 13 |c3 f3| 41 A3 - * Bed Heat PWM 14 |c4 V G R f4| 42 A4 - * Extruder Heat PWM 15 |c5 c n S f5| 43 A5 - * Fan PWM 16 |c6 c d T f6| 44 A6 Bed TC - * 17 |c7 * * * f7| 45 A7 Extruder TC * 4.7k * +5 - * ----------------- - * - * Interior E4: 36, INT4 - * Interior E5: 37, INT5 - * Interior PA0-7: 28-35 -- Printrboard and Teensylu use these pins for step & direction: - * T++ PA Signal Marlin - * - * Z STEP 32 a4 a0 28 X STEP - * Z DIR 33 a5 a1 29 X DIR - * E STEP 34 a6 a2 30 Y STEP - * E DIR 35 a7 a3 31 Y DIR - */ - -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Teensy++2.0" - -// -// Limit Switches -// -#define X_STOP_PIN 2 // D2 -#define Y_STOP_PIN 3 // D3 -#define Z_STOP_PIN 4 // D4 - -// -// Steppers -// -#define X_STEP_PIN 28 // A0 Marlin -#define X_DIR_PIN 29 // A1 Marlin -#define X_ENABLE_PIN 26 // B6 - -#define Y_STEP_PIN 30 // A2 Marlin -#define Y_DIR_PIN 31 // A3 -#define Y_ENABLE_PIN 26 // B6 Shared w/x - -#define Z_STEP_PIN 32 // A4 -#define Z_DIR_PIN 33 // A5 -#define Z_ENABLE_PIN 26 // B6 Shared w/x - -#define E0_STEP_PIN 34 // A6 -#define E0_DIR_PIN 35 // A7 -#define E0_ENABLE_PIN 26 // B6 Shared w/x - -// -// Temperature Sensors -// -#define TEMP_0_PIN 7 // F7 Analog Input (Extruder) -#define TEMP_BED_PIN 6 // F6 Analog Input (Bed) - -// -// Heaters / Fans -// -#define HEATER_0_PIN 15 // C5 PWM3B Extruder -#define HEATER_BED_PIN 14 // C4 PWM3C -#ifndef FAN_PIN - #define FAN_PIN 16 // C6 PWM3A Fan -#endif - -// -// Misc. Functions -// -#define SDSS 20 // B0 -#define LED_PIN 6 // D6 -#define PS_ON_PIN 27 // B7 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 1 // D1 PWM2B MUST BE HARDWARE PWM -#endif - -// -// LCD / Controller -// -#if ENABLED(ULTIPANEL) - #define LCD_PINS_RS 8 // E0 - #define LCD_PINS_ENABLE 9 // E1 - #define LCD_PINS_D4 10 // C0 - #define LCD_PINS_D5 11 // C1 - #define LCD_PINS_D6 12 // C2 - #define LCD_PINS_D7 13 // C3 - #define BTN_EN1 38 // F0 - #define BTN_EN2 39 // F1 - #define BTN_ENC 40 // F2 -#endif - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_ENA_PIN 5 // D5 Pin should have a pullup! -#define SPINDLE_LASER_PWM_PIN 0 // D0 PWM0B MUST BE HARDWARE PWM -#define SPINDLE_DIR_PIN 7 // D7 diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h deleted file mode 100644 index 9de119b62b..0000000000 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * Rev C 2 JUN 2017 - * - * Converted to Arduino pin numbering - */ - -/** - * There are two Arduino IDE extensions that are compatible with this board - * and with the mainstream Marlin software. All have been used with Arduino 1.6.12 - * - * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html - * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu - * - * Installation instructions are at the above URL. Don't bother loading the - * libraries - they are not used with the Marlin software. - * - * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support - * This is basically Teensyduino but with a bootloader that can handle image sizes - * larger than 64K. - * - * Installation: - * - * 1. Go to the above URL, click on the "Clone or Download" button and then - * click on "Download ZIP" button. - * 2. Unzip the file, find the "printrboard" directory and then copy it to the - * hardware directory in Arduino. The Arduino hardware directory will probably - * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. - * 3. Restart Arduino. - * 4. Select "Printrboard" from the 'Tools > Board' menu. - * - * Teensyduino is the most popular option. Printrboard is used if your board doesn't have - * the Teensyduino bootloader on it. - */ - -/** - * To burn the bootloader that comes with Printrboard: - * - * 1. Connect your programmer to the board. - * 2. In the Arduino IDE select "Printrboard" and then select the programmer. - * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. - * 4. The programmer is no longer needed. Remove it. - */ - - /** - * SILKSCREEN ERROR - * - * The silkscreen for the endstops do NOT match the schematic. The silkscreen SHOULD - * read (from left to right) X-STOP, Y-STOP, Z-STOP & E-STOP. The silkscreen actually - * reads E-STOP, X-STOP, Y-STOP & Z-STOP. - * - * The pin assignments in this file match the silkscreen. - */ - -#if NOT_TARGET(__AVR_AT90USB1286__, __AVR_AT90USB1286P__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Teensylu" - -// -// Limit Switch definitions that match the SCHEMATIC -// -//#define X_STOP_PIN 25 // B5 -//#define Y_STOP_PIN 26 // B6 -//#define Z_STOP_PIN 27 // B7 -//#define E_STOP_PIN 36 // E4 - -// -// Limit Switch definitions that match the SILKSCREEN -// -#define X_STOP_PIN 26 // B6 -#define Y_STOP_PIN 27 // B7 -#define Z_STOP_PIN 36 // E4 -//#define E_STOP_PIN 25 // B5 - -// -// Steppers -// -#define X_STEP_PIN 28 // A0 -#define X_DIR_PIN 29 // A1 -#define X_ENABLE_PIN 19 // E7 - -#define Y_STEP_PIN 30 // A2 -#define Y_DIR_PIN 31 // A3 -#define Y_ENABLE_PIN 18 // E6 - -#define Z_STEP_PIN 32 // A4 -#define Z_DIR_PIN 33 // A5 -#define Z_ENABLE_PIN 17 // C7 - -#define E0_STEP_PIN 34 // A6 -#define E0_DIR_PIN 35 // A7 -#define E0_ENABLE_PIN 13 // C3 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 7 // Analog Input (Extruder) -#define TEMP_BED_PIN 6 // Analog Input (Bed) - -// -// Heaters / Fans -// -#define HEATER_0_PIN 15 // C5 PWM3B - Extruder -#define HEATER_BED_PIN 14 // C4 PWM3C - -#ifndef FAN_PIN - #define FAN_PIN 16 // C6 PWM3A -#endif - -// -// Misc. Functions -// -#define SDSS 20 // B0 JP31-6 - -#ifndef CASE_LIGHT_PIN - #define CASE_LIGHT_PIN 0 // D0 IO-14 PWM0B -#endif - -// -// LCD / Controller -// -#if BOTH(ULTRA_LCD, NEWPANEL) - - #define BEEPER_PIN -1 - - #if ENABLED(LCD_I2C_PANELOLU2) - #define BTN_EN1 3 // D3 IO-8 - #define BTN_EN2 2 // D2 IO-10 - #define BTN_ENC 41 // F3 IO-7 - #define SDSS 38 // F0 IO-13 use SD card on Panelolu2 - #endif - - #define SD_DETECT_PIN -1 - -#endif // ULTRA_LCD && NEWPANEL - -// -// M3/M4/M5 - Spindle/Laser Control -// -#define SPINDLE_LASER_PWM_PIN 24 // B4 IO-3 PWM2A - MUST BE HARDWARE PWM -#define SPINDLE_LASER_ENA_PIN 39 // F1 IO-11 - Pin should have a pullup! -#define SPINDLE_DIR_PIN 40 // F2 IO-9 diff --git a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h deleted file mode 100644 index 0edb5cb19d..0000000000 --- a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * Teensy 3.1 (MK20DX256) and Teensy 3.2 (MK20DX256) Breadboard pin assignments - * Requires the Teensyduino software with Teensy 3.1 or Teensy 3.2 selected in Arduino IDE! - * https://www.pjrc.com/teensy/teensyduino.html - */ - -#if NOT_TARGET(IS_TEENSY_31_32) - #error "Oops! Select 'Teensy 3.1' or 'Teensy 3.2' in 'Tools > Board.'" -#endif - -#ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "Teensy3.2" -#endif - -// -// Limit Switches -// -#define X_STOP_PIN 3 -#define Y_STOP_PIN 4 -#define Z_STOP_PIN 5 - -// -// Steppers -// -#define X_STEP_PIN 5 -#define X_DIR_PIN 6 -#define X_ENABLE_PIN 2 - -#define Y_STEP_PIN 7 -#define Y_DIR_PIN 8 -#define Y_ENABLE_PIN 2 - -#define Z_STEP_PIN 9 -#define Z_DIR_PIN 10 -#define Z_ENABLE_PIN 2 - -#define E0_STEP_PIN 11 -#define E0_DIR_PIN 12 -#define E0_ENABLE_PIN 2 - -//#define E1_STEP_PIN 33 -//#define E1_DIR_PIN 34 -//#define E1_ENABLE_PIN 35 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 20 -//#define HEATER_1_PIN 36 -#define HEATER_BED_PIN 21 -#ifndef FAN_PIN - #define FAN_PIN 22 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 14 // Analog Input - Extruder 2 => A2 -//#define TEMP_1_PIN 0 // Analog Input -#define TEMP_BED_PIN 15 // Analog Input - Bed - -#ifndef FILWIDTH_PIN - #define FILWIDTH_PIN 6 // Analog Input -#endif - -// -// Misc. Functions -// -#define LED_PIN 13 -//#define SOL1_PIN 28 -//#define SDSS 16 // 8 - -// -// LCD / Controller -// - -/* -#if HAS_WIRED_LCD - #define LCD_PINS_RS 40 - #define LCD_PINS_ENABLE 41 - #define LCD_PINS_D4 42 - #define LCD_PINS_D5 43 - #define LCD_PINS_D6 44 - #define LCD_PINS_D7 45 - #define BTN_EN1 46 - #define BTN_EN2 47 - #define BTN_ENC 48 -#endif -*/ diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h deleted file mode 100644 index 2e09c8a425..0000000000 --- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/**************************************************************************************** -* Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) Breadboard pin assignments -* Requires the Teensyduino software with Teensy 3.5 or Teensy 3.6 selected in Arduino IDE! -* https://www.pjrc.com/teensy/teensyduino.html -****************************************************************************************/ - -#if NOT_TARGET(IS_TEENSY_35_36) - #error "Oops! Select 'Teensy 3.5' or 'Teensy 3.6' in 'Tools > Board.'" -#endif - -#if IS_TEENSY35 - #define BOARD_INFO_NAME "Teensy3.5" -#elif IS_TEENSY36 - #define BOARD_INFO_NAME "Teensy3.6" -#endif - -/** - * Plan for Teensy 3.5 and Teensy 3.6: - * USB - * GND |-----#####-----| VIN 5V - * X_STEP_PIN MOSI1 RX1 0 | ##### | Analog GND - * X_DIR_PIN MISO1 TX1 1 | | 3.3V - * Y_STEP_PIN PWM 2 | *NC AREF* | 23 A9 PWM - * Y_DIR_PIN SCL2 CAN0TX PWM 3 | *A26 A10* | 22 A8 PWM - * Z_STEP_PIN SDA2 CAN0RX PWM 4 | *A25 A11* | 21 A7 PWM CS0 MOSI1 RX1 - * Z_DIR_PIN MISO1 TX1 PWM 5 | *GND * * 57 | 20 A6 PWM CS0 SCK1 FILWIDTH_PIN - * X_ENABLE_PIN PWM 6 | *GND * * 56 | 19 A5 SCL0 E0_STEP_PIN - * Y_ENABLE_PIN SCL0 MOSI0 RX3 PWM 7 | * * 55 | 18 A4 SDA0 E0_DIR_PIN - * Z_ENABLE_PIN SDA0 MISO0 TX3 PWM 8 | * * 54 | 17 A3 SDA0 E0_ENABLE_PIN - * CS0 RX2 PWM 9 | | 16 A2 SCL0 TEMP_0_PIN - * CS0 TX2 PWM 10 | | 15 A1 CS0 TEMP_BED_PIN - * X_STOP_PIN MOSI0 11 | | 14 A0 PWM CS0 TEMP_1_PIN - * Y_STOP_PIN MISO0 12 | | 13 LED SCK0 LED_PIN - * 3.3V | | GND - * Z_STOP_PIN 24 | 40 * * 53 | A22 DAC1 - * AUX2 25 | 41 * * 52 | A21 DAC0 - * AUX2 FAN_PIN SCL2 TX1 26 | 42 * * 51 | 39 A20 MISO0 SDSS - * AUX2 Z-PROBE PWR SCK0 RX1 27 | * * * * * | 38 A19 PWM SDA1 - * AUX2 SOL1_PIN MOSI0 28 | 43 * * 50 | 37 A18 PWM SCL1 - * D10 CONTROLLER_FAN_PIN CAN0TX PWM 29 | 44 * * 49 | 36 A17 PWM - * D9 HEATER_0_PIN CAN0RX PWM 30 | 45 * * 48 | 35 A16 PWM E1_ENABLE_PIN - * D8 HEATER_BED_PIN CS1 RX4 A12 31 | 46 * * 47 | 34 A15 PWM SDA0 RX5 E1_DIR_PIN - * SCK1 TX4 A13 32 |__GND_*_*_3.3V_| 33 A14 PWM SCL0 TX5 E1_STEP_PIN - * - * Interior pins: - * LCD_PINS_RS 40 * * 53 SCK2 - * LCD_PINS_ENABLE 41 * * 52 MOSI2 - * LCD_PINS_D4 42 * * 51 MISO2 - * LCD_PINS_D5 CS2 43 * * 50 A24 - * LCD_PINS_D6 MOSI2 44 * * 49 A23 - * LCD_PINS_D7 MISO2 45 * * 48 TX6 SDA0 BTN_ENC - * BTN_EN1 SCK2 46 * * 47 RX6 SCL0 BTN_EN2 - * GND * * 3.3V - */ - -// -// Limit Switches -// -#define X_STOP_PIN 24 -#define Y_STOP_PIN 26 -#define Z_STOP_PIN 28 - -// -// Steppers -// -#define X_STEP_PIN 22 -#define X_DIR_PIN 21 -#define X_ENABLE_PIN 39 - -#define Y_STEP_PIN 19 -#define Y_DIR_PIN 18 -#define Y_ENABLE_PIN 20 - -#define Z_STEP_PIN 38 -#define Z_DIR_PIN 37 -#define Z_ENABLE_PIN 17 - -#define E0_STEP_PIN 31 -#define E0_DIR_PIN 30 -#define E0_ENABLE_PIN 32 - -#define E1_STEP_PIN 33 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 35 - -#define HEATER_0_PIN 30 -#define HEATER_1_PIN 36 -#define HEATER_BED_PIN 31 -#ifndef FAN_PIN - #define FAN_PIN 2 -#endif - -#define TEMP_0_PIN 2 // Extruder / Analog pin numbering: 2 => A2 -#define TEMP_1_PIN 0 -#define TEMP_BED_PIN 1 // Bed / Analog pin numbering - -// -// Misc. Functions -// -#define LED_PIN 13 -#define PS_ON_PIN 1 -#define FILWIDTH_PIN 6 -#define SOL1_PIN 28 - -// -// SD Card -// -#define SDSS 39 // 8 - -#if HAS_WIRED_LCD - #define LCD_PINS_RS 40 - #define LCD_PINS_ENABLE 41 - #define LCD_PINS_D4 42 - #define LCD_PINS_D5 43 - #define LCD_PINS_D6 44 - #define LCD_PINS_D7 45 -#endif - -#if ENABLED(NEWPANEL) - #define BTN_EN1 46 - #define BTN_EN2 47 - #define BTN_ENC 48 -#endif - -#if ENABLED(REPRAPWORLD_KEYPAD) - #define SHIFT_OUT 40 - #define SHIFT_CLK 44 - #define SHIFT_LD 42 -#endif diff --git a/Marlin/src/pins/teensy4/pins_T41U5XBB.h b/Marlin/src/pins/teensy4/pins_T41U5XBB.h deleted file mode 100644 index 5f62bb05a6..0000000000 --- a/Marlin/src/pins/teensy4/pins_T41U5XBB.h +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/**************************************************************************************** -* Teensy 4.1 (IMXRT1062) Breadboard pin assignments -* Requires the Teensyduino software with Teensy 4.1 selected in Arduino IDE! -* https://www.pjrc.com/teensy/teensyduino.html -****************************************************************************************/ - -#if NOT_TARGET(IS_TEENSY41) - #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Teensy4.1" - -/** - * Plan for Teensy 4.0 and Teensy 4.1: - * USB - * GND |-----#####-----| VIN (3.65 TO 5.5V) - * RX1 CS1 RX1 PWM 0 | ##### | GND - * TX1 MISO1 TX1 PWM 1 | | 3.3V - * STPX PWM 2 | | 23 A9 PWM - * DIRX PWM 3 | | 22 A8 PWM LIMZ - * STPY PWM 4 | | 21 A7 RX5 LIMY - * DIRY PWM 5 | | 20 A6 TX5 LIMX - * STPZ PWM 6 | | 19 A5 PWM SCL0 COOL - * DIRZ RX2 PWM 7 | | 18 A4 PWM SDA0 MIST - * STPA TX2 PWM 8 | | 17 A3 RX4 SDA1 CYST - * DIRA PWM 9 | | 16 A2 TX4 SCL1 EHOLD - * STEN PWM 10 | | 15 A1 PWM RX3 PRB - * SPDI MOSI0 PWM 11 | | 14 A0 PWM TX3 PANIC - * SPEN MISO0 PWM 12 | | 13 LED PWM SCK0 SPWM - * 3.3V | | GND - * SCL PWM 24 | | 41 A17 KPSTR - * SDA PWM 25 | | 40 A16 STENY - * STPB MOSI1 26 | | 39 A15 MISO1 STENZ - * DIRB SCK1 27 | * * * * * | 38 A14 STENA - * LIMB RX7 PWM 28 | | 37 PWM STENB - * DOOR TX7 PWM 29 | | 36 PWM ST0 - * ST1 30 | | 35 TX8 ST3 - * AUX0 31 | SDCARD | 34 RX8 ST2 - * AUX1 32 |_______________| 33 PWM AUX2 - */ - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif - -// -// Servos -// -#define SERVO0_PIN 24 -#define SERVO1_PIN 25 - -// -// Limit Switches -// -#define X_STOP_PIN 20 -#define Y_STOP_PIN 21 -#define Z_STOP_PIN 22 - -// -// Steppers -// -#define X_STEP_PIN 2 -#define X_DIR_PIN 3 -#define X_ENABLE_PIN 10 -//#define X_CS_PIN 30 - -#define Y_STEP_PIN 4 -#define Y_DIR_PIN 5 -#define Y_ENABLE_PIN 40 -//#define Y_CS_PIN 31 - -#define Z_STEP_PIN 6 -#define Z_DIR_PIN 7 -#define Z_ENABLE_PIN 39 -//#define Z_CS_PIN 32 - -#define E0_STEP_PIN 8 -#define E0_DIR_PIN 9 -#define E0_ENABLE_PIN 38 - -#define E1_STEP_PIN 26 -#define E1_DIR_PIN 27 -#define E1_ENABLE_PIN 37 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 31 -#define HEATER_1_PIN 32 -#define HEATER_BED_PIN 33 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 5 // Extruder / Analog pin numbering: 2 => A2 -#define TEMP_1_PIN 4 -#define TEMP_BED_PIN 15 // Bed / Analog pin numbering - -// -// Misc. Functions -// -#define LED_PIN 13 -#define SOL0_PIN 17 diff --git a/Marlin/src/pins/teensy4/pins_TEENSY41.h b/Marlin/src/pins/teensy4/pins_TEENSY41.h deleted file mode 100644 index 21a1ff675f..0000000000 --- a/Marlin/src/pins/teensy4/pins_TEENSY41.h +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/**************************************************************************************** -* Teensy 4.1 (IMXRT1062) Breadboard pin assignments -* Requires the Teensyduino software with Teensy 4.1 selected in Arduino IDE! -* https://www.pjrc.com/teensy/teensyduino.html -****************************************************************************************/ - -#if NOT_TARGET(IS_TEENSY41) - #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" -#endif - -#define BOARD_INFO_NAME "Teensy4.1" - -/** - * Plan for Teensy 4.0 and Teensy 4.1: - * USB - * GND |-----#####-----| VIN (3.65 TO 5.5V) - * X_STEP_PIN CS1 RX1 PWM 0 | ##### | GND - * X_DIR_PIN MISO1 TX1 PWM 1 | | 3.3V - * Y_STEP_PIN PWM 2 | | 23 A9 PWM SERVO1_PIN - * Y_DIR_PIN PWM 3 | | 22 A8 PWM SERVO0_PIN - * Z_STEP_PIN PWM 4 | | 21 A7 RX5 - * Z_DIR_PIN PWM 5 | | 20 A6 TX5 FILWIDTH_PIN - * X_ENABLE_PIN PWM 6 | | 19 A5 PWM SCL0 - * Y_ENABLE_PIN RX2 PWM 7 | | 18 A4 PWM SDA0 HEATER_1_PIN - * Z_ENABLE_PIN TX2 PWM 8 | | 17 A3 RX4 SDA1 - * E0_STEP_PIN PWM 9 | | 16 A2 TX4 SCL1 TEMP_0_PIN - * E0_DIR_PIN PWM 10 | | 15 A1 PWM RX3 TEMP_BED_PIN - * MOSI_PIN MOSI0 PWM 11 | | 14 A0 PWM TX3 TEMP_1_PIN - * MISO_PIN MISO0 PWM 12 | | 13 LED PWM SCK0 SCK_PIN - * 3.3V | | GND - * Z_STOP_PIN PWM 24 | | 41 A17 - * E0_ENABLE_PIN PWM 25 | | 40 A16 - * FAN_PIN MOSI1 26 | | 39 A15 MISO1 X_STOP_PIN - * Z-PROBE PWR SCK1 27 | * * * * * | 38 A14 Y_STOP_PIN - * SOL1_PIN RX7 PWM 28 | | 37 PWM HEATER_0_PIN - * FAN_PIN TX7 PWM 29 | | 36 PWM HEATER_BED_PIN - * X_CS_PIN 30 | | 35 TX8 E1_ENABLE_PIN - * y_CS_PIN 31 | SDCARD | 34 RX8 E1_DIR_PIN - * Z_CS_PIN 32 |_______________| 33 PWM E1_STEP_PIN - */ - -// -// Servos -// -#define SERVO0_PIN 22 -#define SERVO1_PIN 23 - -// -// Limit Switches -// -#define X_STOP_PIN 39 -#define Y_STOP_PIN 38 -#define Z_STOP_PIN 24 - -// -// Steppers -// -#define X_STEP_PIN 0 -#define X_DIR_PIN 1 -#define X_ENABLE_PIN 6 -//#define X_CS_PIN 30 - -#define Y_STEP_PIN 2 -#define Y_DIR_PIN 3 -#define Y_ENABLE_PIN 7 -//#define Y_CS_PIN 31 - -#define Z_STEP_PIN 4 -#define Z_DIR_PIN 5 -#define Z_ENABLE_PIN 8 -//#define Z_CS_PIN 32 - -#define E0_STEP_PIN 9 -#define E0_DIR_PIN 10 -#define E0_ENABLE_PIN 25 - -#define E1_STEP_PIN 33 -#define E1_DIR_PIN 34 -#define E1_ENABLE_PIN 35 - -// -// Heaters / Fans -// -#define HEATER_0_PIN 37 -#define HEATER_1_PIN 18 -#define HEATER_BED_PIN 36 -#ifndef FAN_PIN - #define FAN_PIN 29 -#endif - -// -// Temperature Sensors -// -#define TEMP_0_PIN 2 // Extruder / Analog pin numbering: 2 => A2 -#define TEMP_1_PIN 0 -#define TEMP_BED_PIN 1 // Bed / Analog pin numbering - -// -// Misc. Functions -// -#define LED_PIN 13 -#define SOL0_PIN 28 -//#define PS_ON_PIN 1 -//#define FILWIDTH_PIN 6 // A6 - -#ifndef SDCARD_CONNECTION - #define SDCARD_CONNECTION ONBOARD -#endif diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index 491c0692c7..b52e4fa16d 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ /** * Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * Updated with backports of the latest SdFat library from the same author * * This file is part of the Arduino Sd2Card Library @@ -30,7 +30,7 @@ #include "../inc/MarlinConfig.h" -#if ENABLED(SDSUPPORT) && NONE(USB_FLASH_DRIVE_SUPPORT, SDIO_SUPPORT) +#if ENABLED(SDSUPPORT) /* Enable FAST CRC computations - You can trade speed for FLASH space if * needed by disabling the following define */ @@ -38,7 +38,7 @@ #include "Sd2Card.h" -#include "../MarlinCore.h" +#include "../Marlin.h" #if ENABLED(SD_CHECK_AND_RETRY) static bool crcSupported = true; @@ -65,7 +65,7 @@ static uint8_t CRC7(const uint8_t* data, uint8_t n) { uint8_t crc = 0; - while (n > 0) { + while ( n > 0 ) { crc = pgm_read_byte(&crctab7[ (crc << 1) ^ *data++ ]); n--; } @@ -74,7 +74,7 @@ #else static uint8_t CRC7(const uint8_t* data, uint8_t n) { uint8_t crc = 0; - LOOP_L_N(i, n) { + for (uint8_t i = 0; i < n; i++) { uint8_t d = data[i]; d ^= crc << 1; if (d & 0x80) d ^= 9; @@ -87,42 +87,44 @@ #endif #endif -// Send command and return error code. Return zero for OK -uint8_t Sd2Card::cardCommand(const uint8_t cmd, const uint32_t arg) { - // Select card +// send command and return error code. Return zero for OK +uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) { + // select card chipSelect(); - // Wait up to 300 ms if busy - waitNotBusy(SD_WRITE_TIMEOUT); + // wait up to 300 ms if busy + waitNotBusy( SD_WRITE_TIMEOUT ); uint8_t *pa = (uint8_t *)(&arg); - #if ENABLED(SD_CHECK_AND_RETRY) +#if ENABLED(SD_CHECK_AND_RETRY) - // Form message - uint8_t d[6] = {(uint8_t) (cmd | 0x40), pa[3], pa[2], pa[1], pa[0] }; + // form message + uint8_t d[6] = {(uint8_t) (cmd | 0x40), pa[3], pa[2], pa[1], pa[0] }; - // Add crc - d[5] = CRC7(d, 5); + // add crc + d[5] = CRC7(d, 5); - // Send message - LOOP_L_N(k, 6) spiSend(d[k]); + // send message + for (uint8_t k = 0; k < 6; k++ ) + spiSend( d[k] ); - #else - // Send command - spiSend(cmd | 0x40); +#else + // send command + spiSend(cmd | 0x40); - // Send argument - for (int8_t i = 3; i >= 0; i--) spiSend(pa[i]); + // send argument + for( int8_t i = 3; i >= 0; i-- ) + spiSend( pa[i] ); - // Send CRC - correct for CMD0 with arg zero or CMD8 with arg 0X1AA - spiSend(cmd == CMD0 ? 0X95 : 0X87); - #endif + // send CRC - correct for CMD0 with arg zero or CMD8 with arg 0X1AA + spiSend( cmd == CMD0 ? 0X95 : 0X87 ); +#endif - // Skip stuff byte for stop read + // skip stuff byte for stop read if (cmd == CMD12) spiRec(); - // Wait for response + // wait for response for (uint8_t i = 0; ((status_ = spiRec()) & 0x80) && i != 0xFF; i++) { /* Intentionally left empty */ } return status_; } @@ -156,13 +158,15 @@ uint32_t Sd2Card::cardSize() { } void Sd2Card::chipDeselect() { - extDigitalWrite(chipSelectPin_, HIGH); - spiSend(0xFF); // Ensure MISO goes high impedance + digitalWrite(chipSelectPin_, HIGH); + + // insure MISO goes high impedance + spiSend( 0xFF ); } void Sd2Card::chipSelect() { spiInit(spiRate_); - extDigitalWrite(chipSelectPin_, LOW); + digitalWrite(chipSelectPin_, LOW); } /** @@ -179,11 +183,8 @@ void Sd2Card::chipSelect() { * \return true for success, false for failure. */ bool Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { - if (ENABLED(SDCARD_READONLY)) return false; - csd_t csd; if (!readCSD(&csd)) goto FAIL; - // check for single block erase if (!csd.v1.erase_blk_en) { // erase size mask @@ -194,8 +195,13 @@ bool Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { goto FAIL; } } - if (type_ != SD_CARD_TYPE_SDHC) { firstBlock <<= 9; lastBlock <<= 9; } - if (cardCommand(CMD32, firstBlock) || cardCommand(CMD33, lastBlock) || cardCommand(CMD38, 0)) { + if (type_ != SD_CARD_TYPE_SDHC) { + firstBlock <<= 9; + lastBlock <<= 9; + } + if (cardCommand(CMD32, firstBlock) + || cardCommand(CMD33, lastBlock) + || cardCommand(CMD38, 0)) { error(SD_CARD_ERROR_ERASE); goto FAIL; } @@ -230,32 +236,22 @@ bool Sd2Card::eraseSingleBlockEnable() { * \return true for success, false for failure. * The reason for failure can be determined by calling errorCode() and errorData(). */ -bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { - #if IS_TEENSY_35_36 || IS_TEENSY_40_41 - chipSelectPin_ = BUILTIN_SDCARD; - const uint8_t ret = SDHC_CardInit(); - type_ = SDHC_CardGetType(); - return (ret == 0); - #endif - +bool Sd2Card::init(uint8_t sckRateID, pin_t chipSelectPin) { errorCode_ = type_ = 0; chipSelectPin_ = chipSelectPin; // 16-bit init start time allows over a minute - const millis_t init_timeout = millis() + SD_INIT_TIMEOUT; + uint16_t t0 = (uint16_t)millis(); uint32_t arg; - watchdog_refresh(); // In case init takes too long + // If init takes more than 4s it could trigger + // watchdog leading to a reboot loop. + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif // Set pin modes - #if ENABLED(ZONESTAR_12864OLED) - if (chipSelectPin_ != DOGLCD_CS) { - SET_OUTPUT(DOGLCD_CS); - WRITE(DOGLCD_CS, HIGH); - } - #else - extDigitalWrite(chipSelectPin_, HIGH); // For some CPUs pinMode can write the wrong data so init desired data value first - pinMode(chipSelectPin_, OUTPUT); // Solution for #8746 by @benlye - #endif + digitalWrite(chipSelectPin_, HIGH); // For some CPUs pinMode can write the wrong data so init desired data value first + pinMode(chipSelectPin_, OUTPUT); // Solution for #8746 by @benlye spiBegin(); // Set SCK rate for initialization commands @@ -263,13 +259,16 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { spiInit(spiRate_); // Must supply min of 74 clock cycles with CS high. - LOOP_L_N(i, 10) spiSend(0xFF); + for (uint8_t i = 0; i < 10; i++) spiSend(0xFF); - watchdog_refresh(); // In case init takes too long + // Initialization can cause the watchdog to timeout, so reinit it here + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif // Command to go idle in SPI mode while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { - if (ELAPSED(millis(), init_timeout)) { + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { error(SD_CARD_ERROR_CMD0); goto FAIL; } @@ -279,7 +278,10 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { crcSupported = (cardCommand(CMD59, 1) == R1_IDLE_STATE); #endif - watchdog_refresh(); // In case init takes too long + // Initialization can cause the watchdog to timeout, so reinit it here + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif // check SD version for (;;) { @@ -289,38 +291,41 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { } // Get the last byte of r7 response - LOOP_L_N(i, 4) status_ = spiRec(); + for (uint8_t i = 0; i < 4; i++) status_ = spiRec(); if (status_ == 0xAA) { type(SD_CARD_TYPE_SD2); break; } - if (ELAPSED(millis(), init_timeout)) { + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { error(SD_CARD_ERROR_CMD8); goto FAIL; } } - watchdog_refresh(); // In case init takes too long + // Initialization can cause the watchdog to timeout, so reinit it here + #if ENABLED(USE_WATCHDOG) + watchdog_reset(); + #endif - // Initialize card and send host supports SDHC if SD2 + // initialize card and send host supports SDHC if SD2 arg = type() == SD_CARD_TYPE_SD2 ? 0x40000000 : 0; while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) { - // Check for timeout - if (ELAPSED(millis(), init_timeout)) { + // check for timeout + if (((uint16_t)millis() - t0) > SD_INIT_TIMEOUT) { error(SD_CARD_ERROR_ACMD41); goto FAIL; } } - // If SD2 read OCR register to check for SDHC card + // if SD2 read OCR register to check for SDHC card if (type() == SD_CARD_TYPE_SD2) { if (cardCommand(CMD58, 0)) { error(SD_CARD_ERROR_CMD58); goto FAIL; } if ((spiRec() & 0xC0) == 0xC0) type(SD_CARD_TYPE_SDHC); - // Discard rest of ocr - contains allowed voltage range - LOOP_L_N(i, 3) spiRec(); + // discard rest of ocr - contains allowed voltage range + for (uint8_t i = 0; i < 3; i++) spiRec(); } chipDeselect(); @@ -339,15 +344,12 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { * \return true for success, false for failure. */ bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { - #if IS_TEENSY_35_36 || IS_TEENSY_40_41 - return 0 == SDHC_CardReadBlock(dst, blockNumber); - #endif - - if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; #if ENABLED(SD_CHECK_AND_RETRY) uint8_t retryCnt = 3; - for (;;) { + for(;;) { if (cardCommand(CMD17, blockNumber)) error(SD_CARD_ERROR_CMD17); else if (readData(dst, 512)) @@ -445,39 +447,44 @@ bool Sd2Card::readData(uint8_t* dst) { #endif #endif // SD_CHECK_AND_RETRY -bool Sd2Card::readData(uint8_t* dst, const uint16_t count) { - bool success = false; - - const millis_t read_timeout = millis() + SD_READ_TIMEOUT; - while ((status_ = spiRec()) == 0xFF) { // Wait for start block token - if (ELAPSED(millis(), read_timeout)) { +bool Sd2Card::readData(uint8_t* dst, uint16_t count) { + // wait for start block token + uint16_t t0 = millis(); + while ((status_ = spiRec()) == 0xFF) { + if (((uint16_t)millis() - t0) > SD_READ_TIMEOUT) { error(SD_CARD_ERROR_READ_TIMEOUT); goto FAIL; } } - - if (status_ == DATA_START_BLOCK) { - spiRead(dst, count); // Transfer data - - const uint16_t recvCrc = (spiRec() << 8) | spiRec(); - #if ENABLED(SD_CHECK_AND_RETRY) - success = !crcSupported || recvCrc == CRC_CCITT(dst, count); - if (!success) error(SD_CARD_ERROR_READ_CRC); - #else - success = true; - UNUSED(recvCrc); - #endif - } - else + if (status_ != DATA_START_BLOCK) { error(SD_CARD_ERROR_READ); + goto FAIL; + } + // transfer data + spiRead(dst, count); +#if ENABLED(SD_CHECK_AND_RETRY) + { + uint16_t recvCrc = (spiRec() << 8) | spiRec(); + if (crcSupported && recvCrc != CRC_CCITT(dst, count)) { + error(SD_CARD_ERROR_READ_CRC); + goto FAIL; + } + } +#else + // discard CRC + spiRec(); + spiRec(); +#endif + chipDeselect(); + return true; FAIL: chipDeselect(); - return success; + return false; } /** read CID or CSR register */ -bool Sd2Card::readRegister(const uint8_t cmd, void* buf) { +bool Sd2Card::readRegister(uint8_t cmd, void* buf) { uint8_t* dst = reinterpret_cast(buf); if (cardCommand(cmd, 0)) { error(SD_CARD_ERROR_READ_REG); @@ -499,11 +506,13 @@ bool Sd2Card::readRegister(const uint8_t cmd, void* buf) { */ bool Sd2Card::readStart(uint32_t blockNumber) { if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; - - const bool success = !cardCommand(CMD18, blockNumber); - if (!success) error(SD_CARD_ERROR_CMD18); + if (cardCommand(CMD18, blockNumber)) { + error(SD_CARD_ERROR_CMD18); + chipDeselect(); + return false; + } chipDeselect(); - return success; + return true; } /** @@ -513,10 +522,13 @@ bool Sd2Card::readStart(uint32_t blockNumber) { */ bool Sd2Card::readStop() { chipSelect(); - const bool success = !cardCommand(CMD12, 0); - if (!success) error(SD_CARD_ERROR_CMD12); + if (cardCommand(CMD12, 0)) { + error(SD_CARD_ERROR_CMD12); + chipDeselect(); + return false; + } chipDeselect(); - return success; + return true; } /** @@ -531,54 +543,55 @@ bool Sd2Card::readStop() { * \return The value one, true, is returned for success and the value zero, * false, is returned for an invalid value of \a sckRateID. */ -bool Sd2Card::setSckRate(const uint8_t sckRateID) { - const bool success = (sckRateID <= 6); - if (success) spiRate_ = sckRateID; else error(SD_CARD_ERROR_SCK_RATE); - return success; +bool Sd2Card::setSckRate(uint8_t sckRateID) { + if (sckRateID > 6) { + error(SD_CARD_ERROR_SCK_RATE); + return false; + } + spiRate_ = sckRateID; + return true; } -/** - * Wait for card to become not-busy - * \param[in] timeout_ms Timeout to abort. - * \return true for success, false for timeout. - */ -bool Sd2Card::waitNotBusy(const millis_t timeout_ms) { - const millis_t wait_timeout = millis() + timeout_ms; - while (spiRec() != 0xFF) if (ELAPSED(millis(), wait_timeout)) return false; +// wait for card to go not busy +bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) { + uint16_t t0 = millis(); + while (spiRec() != 0xFF) + if (((uint16_t)millis() - t0) >= timeoutMillis) return false; + return true; } /** - * Write a 512 byte block to an SD card. + * Writes a 512 byte block to an SD card. * * \param[in] blockNumber Logical block to be written. * \param[in] src Pointer to the location of the data to be written. * \return true for success, false for failure. */ bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { - if (ENABLED(SDCARD_READONLY)) return false; - - #if IS_TEENSY_35_36 || IS_TEENSY_40_41 - return 0 == SDHC_CardWriteBlock(src, blockNumber); - #endif - - bool success = false; - if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card - if (!cardCommand(CMD24, blockNumber)) { - if (writeData(DATA_START_BLOCK, src)) { - if (waitNotBusy(SD_WRITE_TIMEOUT)) { // Wait for flashing to complete - success = !(cardCommand(CMD13, 0) || spiRec()); // Response is r2 so get and check two bytes for nonzero - if (!success) error(SD_CARD_ERROR_WRITE_PROGRAMMING); - } - else - error(SD_CARD_ERROR_WRITE_TIMEOUT); - } - } - else + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD24, blockNumber)) { error(SD_CARD_ERROR_CMD24); + goto FAIL; + } + if (!writeData(DATA_START_BLOCK, src)) goto FAIL; + // wait for flash programming to complete + if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + error(SD_CARD_ERROR_WRITE_TIMEOUT); + goto FAIL; + } + // response is r2 so get and check two bytes for nonzero + if (cardCommand(CMD13, 0) || spiRec()) { + error(SD_CARD_ERROR_WRITE_PROGRAMMING); + goto FAIL; + } chipDeselect(); - return success; + return true; + FAIL: + chipDeselect(); + return false; } /** @@ -587,27 +600,28 @@ bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { * \return true for success, false for failure. */ bool Sd2Card::writeData(const uint8_t* src) { - if (ENABLED(SDCARD_READONLY)) return false; - - bool success = true; chipSelect(); - // Wait for previous write to finish + // wait for previous write to finish if (!waitNotBusy(SD_WRITE_TIMEOUT) || !writeData(WRITE_MULTIPLE_TOKEN, src)) { error(SD_CARD_ERROR_WRITE_MULTIPLE); - success = false; + chipDeselect(); + return false; } chipDeselect(); - return success; + return true; } -// Send one block of data for write block or write multiple blocks -bool Sd2Card::writeData(const uint8_t token, const uint8_t* src) { - if (ENABLED(SDCARD_READONLY)) return false; +// send one block of data for write block or write multiple blocks +bool Sd2Card::writeData(uint8_t token, const uint8_t* src) { - const uint16_t crc = TERN(SD_CHECK_AND_RETRY, CRC_CCITT(src, 512), 0xFFFF); - spiSendBlock(token, src); - spiSend(crc >> 8); - spiSend(crc & 0xFF); +#if ENABLED(SD_CHECK_AND_RETRY) + uint16_t crc = CRC_CCITT( src, 512 ); +#else // ENABLED(SD_CHECK_AND_RETRY) + uint16_t crc = 0xFFFF; +#endif // ENABLED(SD_CHECK_AND_RETRY) + spiSendBlock( token, src ); + spiSend( crc >> 8 ); + spiSend( crc & 0XFF ); status_ = spiRec(); if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) { @@ -629,20 +643,23 @@ bool Sd2Card::writeData(const uint8_t token, const uint8_t* src) { * * \return true for success, false for failure. */ -bool Sd2Card::writeStart(uint32_t blockNumber, const uint32_t eraseCount) { - if (ENABLED(SDCARD_READONLY)) return false; - - bool success = false; - if (!cardAcmd(ACMD23, eraseCount)) { // Send pre-erase count - if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card - success = !cardCommand(CMD25, blockNumber); - if (!success) error(SD_CARD_ERROR_CMD25); - } - else +bool Sd2Card::writeStart(uint32_t blockNumber, uint32_t eraseCount) { + // send pre-erase count + if (cardAcmd(ACMD23, eraseCount)) { error(SD_CARD_ERROR_ACMD23); - + goto FAIL; + } + // use address if not SDHC card + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + if (cardCommand(CMD25, blockNumber)) { + error(SD_CARD_ERROR_CMD25); + goto FAIL; + } chipDeselect(); - return success; + return true; + FAIL: + chipDeselect(); + return false; } /** @@ -651,19 +668,16 @@ bool Sd2Card::writeStart(uint32_t blockNumber, const uint32_t eraseCount) { * \return true for success, false for failure. */ bool Sd2Card::writeStop() { - if (ENABLED(SDCARD_READONLY)) return false; - - bool success = false; chipSelect(); - if (waitNotBusy(SD_WRITE_TIMEOUT)) { - spiSend(STOP_TRAN_TOKEN); - success = waitNotBusy(SD_WRITE_TIMEOUT); - } - else - error(SD_CARD_ERROR_STOP_TRAN); - + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto FAIL; + spiSend(STOP_TRAN_TOKEN); + if (!waitNotBusy(SD_WRITE_TIMEOUT)) goto FAIL; chipDeselect(); - return success; + return true; + FAIL: + error(SD_CARD_ERROR_STOP_TRAN); + chipDeselect(); + return false; } #endif // SDSUPPORT diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h index 6900502e03..0df9c0ba64 100644 --- a/Marlin/src/sd/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * \file @@ -28,10 +27,13 @@ /** * Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ +#ifndef _SD2CARD_H_ +#define _SD2CARD_H_ + #include "SdFatConfig.h" #include "SdInfo.h" @@ -78,15 +80,33 @@ uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 SD_CARD_TYPE_SDHC = 3; // High Capacity SD card /** - * Define SOFTWARE_SPI to use bit-bang SPI + * define SOFTWARE_SPI to use bit-bang SPI */ -#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) +#if MEGA_SOFT_SPI #define SOFTWARE_SPI -#endif +#elif USE_SOFTWARE_SPI + #define SOFTWARE_SPI +#endif // MEGA_SOFT_SPI +//------------------------------------------------------------------------------ +// SPI pin definitions - do not edit here - change in SdFatConfig.h +// +#define SD_CHIP_SELECT_PIN SS_PIN + +#if 0 +#if DISABLED(SOFTWARE_SPI) + // hardware pin defs + #define SD_CHIP_SELECT_PIN SS_PIN // The default chip select pin for the SD card is SS. + // The following three pins must not be redefined for hardware SPI. + #define SPI_MOSI_PIN MOSI_PIN // SPI Master Out Slave In pin + #define SPI_MISO_PIN MISO_PIN // SPI Master In Slave Out pin + #define SPI_SCK_PIN SCK_PIN // SPI Clock pin +#else // SOFTWARE_SPI + #define SD_CHIP_SELECT_PIN SOFT_SPI_CS_PIN // SPI chip select pin + #define SPI_MOSI_PIN SOFT_SPI_MOSI_PIN // SPI Master Out Slave In pin + #define SPI_MISO_PIN SOFT_SPI_MISO_PIN // SPI Master In Slave Out pin + #define SPI_SCK_PIN SOFT_SPI_SCK_PIN // SPI Clock pin +#endif // SOFTWARE_SPI -#if IS_TEENSY_35_36 || IS_TEENSY_40_41 - #include "NXP_SDHC.h" - #define BUILTIN_SDCARD 254 #endif /** @@ -94,7 +114,7 @@ uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 * \brief Raw access to SD and SDHC flash memory cards. */ class Sd2Card { -public: + public: Sd2Card() : errorCode_(SD_CARD_ERROR_INIT_NOT_CALLED), type_(0) {} @@ -106,15 +126,15 @@ public: * Set SD error code. * \param[in] code value for error code. */ - inline void error(const uint8_t code) { errorCode_ = code; } + void error(uint8_t code) {errorCode_ = code;} /** * \return error code for last error. See Sd2Card.h for a list of error codes. */ - inline int errorCode() const { return errorCode_; } + int errorCode() const {return errorCode_;} /** \return error data for last error. */ - inline int errorData() const { return status_; } + int errorData() const {return status_;} /** * Initialize an SD flash memory card with default clock rate and chip @@ -122,8 +142,8 @@ public: * * \return true for success or false for failure. */ - bool init(const uint8_t sckRateID, const pin_t chipSelectPin); - + bool init(uint8_t sckRateID = SPI_FULL_SPEED, + pin_t chipSelectPin = SD_CHIP_SELECT_PIN); bool readBlock(uint32_t block, uint8_t* dst); /** @@ -145,13 +165,12 @@ public: * * \return true for success or false for failure. */ - inline bool readCSD(csd_t* csd) { return readRegister(CMD9, csd); } + bool readCSD(csd_t* csd) { return readRegister(CMD9, csd); } bool readData(uint8_t* dst); bool readStart(uint32_t blockNumber); bool readStop(); - bool setSckRate(const uint8_t sckRateID); - + bool setSckRate(uint8_t sckRateID); /** * Return the card type: SD V1, SD V2 or SDHC * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. @@ -159,10 +178,10 @@ public: int type() const {return type_;} bool writeBlock(uint32_t blockNumber, const uint8_t* src); bool writeData(const uint8_t* src); - bool writeStart(uint32_t blockNumber, const uint32_t eraseCount); + bool writeStart(uint32_t blockNumber, uint32_t eraseCount); bool writeStop(); -private: + private: uint8_t chipSelectPin_, errorCode_, spiRate_, @@ -170,17 +189,19 @@ private: type_; // private functions - inline uint8_t cardAcmd(const uint8_t cmd, const uint32_t arg) { + uint8_t cardAcmd(uint8_t cmd, uint32_t arg) { cardCommand(CMD55, 0); return cardCommand(cmd, arg); } - uint8_t cardCommand(const uint8_t cmd, const uint32_t arg); + uint8_t cardCommand(uint8_t cmd, uint32_t arg); - bool readData(uint8_t* dst, const uint16_t count); - bool readRegister(const uint8_t cmd, void* buf); + bool readData(uint8_t* dst, uint16_t count); + bool readRegister(uint8_t cmd, void* buf); void chipDeselect(); void chipSelect(); - inline void type(const uint8_t value) { type_ = value; } - bool waitNotBusy(const millis_t timeout_ms); - bool writeData(const uint8_t token, const uint8_t* src); + void type(uint8_t value) { type_ = value; } + bool waitNotBusy(uint16_t timeoutMillis); + bool writeData(uint8_t token, const uint8_t* src); }; + +#endif // _SD2CARD_H_ diff --git a/Marlin/src/sd/Sd2Card_sdio.h b/Marlin/src/sd/Sd2Card_sdio.h deleted file mode 100644 index 10fb757359..0000000000 --- a/Marlin/src/sd/Sd2Card_sdio.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -#include "../inc/MarlinConfig.h" - -#if ENABLED(SDIO_SUPPORT) - -bool SDIO_Init(); -bool SDIO_ReadBlock(uint32_t block, uint8_t *dst); -bool SDIO_WriteBlock(uint32_t block, const uint8_t *src); - -class Sd2Card { - public: - bool init(uint8_t sckRateID = 0, uint8_t chipSelectPin = 0) { return SDIO_Init(); } - bool readBlock(uint32_t block, uint8_t *dst) { return SDIO_ReadBlock(block, dst); } - bool writeBlock(uint32_t block, const uint8_t *src) { return SDIO_WriteBlock(block, src); } -}; - -#endif // SDIO_SUPPORT diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 2bc9f96e8c..63e0740f62 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,19 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#if __GNUC__ > 8 - // The NXP platform updated GCC from 7.2.1 to 9.2.1 - // and this new warning apparently can be ignored. - #pragma GCC diagnostic ignored "-Waddress-of-packed-member" -#endif - /** * Arduino SdFat Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ @@ -39,7 +33,7 @@ #include "SdBaseFile.h" -#include "../MarlinCore.h" +#include "../Marlin.h" SdBaseFile* SdBaseFile::cwd_ = 0; // Pointer to Current Working Directory // callback function for date/time @@ -47,8 +41,6 @@ void (*SdBaseFile::dateTime_)(uint16_t* date, uint16_t* time) = 0; // add a cluster to a file bool SdBaseFile::addCluster() { - if (ENABLED(SDCARD_READONLY)) return false; - if (!vol_->allocContiguous(1, &curCluster_)) return false; // if first cluster of file link to directory entry @@ -62,8 +54,6 @@ bool SdBaseFile::addCluster() { // Add a cluster to a directory file and zero the cluster. // return with first block of cluster in the cache bool SdBaseFile::addDirCluster() { - if (ENABLED(SDCARD_READONLY)) return false; - uint32_t block; // max folder size if (fileSize_ / sizeof(dir_t) >= 0xFFFF) return false; @@ -91,7 +81,7 @@ bool SdBaseFile::addDirCluster() { // cache a file's directory entry // return pointer to cached entry or null for failure dir_t* SdBaseFile::cacheDirEntry(uint8_t action) { - if (!vol_->cacheRawBlock(dirBlock_, action)) return nullptr; + if (!vol_->cacheRawBlock(dirBlock_, action)) return NULL; return vol_->cache()->dir + dirIndex_; } @@ -154,10 +144,9 @@ bool SdBaseFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { * an invalid DOS 8.3 file name, the FAT volume has not been initialized, * a file is already open, the file already exists, the root * directory is full or an I/O error. + * */ bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char* path, uint32_t size) { - if (ENABLED(SDCARD_READONLY)) return false; - uint32_t count; // don't allow zero length file if (size == 0) return false; @@ -209,7 +198,7 @@ bool SdBaseFile::dirEntry(dir_t* dir) { */ void SdBaseFile::dirName(const dir_t& dir, char* name) { uint8_t j = 0; - LOOP_L_N(i, 11) { + for (uint8_t i = 0; i < 11; i++) { if (dir.name[i] == ' ')continue; if (i == 8) name[j++] = '.'; name[j++] = dir.name[i]; @@ -284,7 +273,7 @@ int16_t SdBaseFile::fgets(char* str, int16_t num, char* delim) { * * \return true for success, false for failure. */ -bool SdBaseFile::getDosName(char * const name) { +bool SdBaseFile::getFilename(char * const name) { if (!isOpen()) return false; if (isRoot()) { @@ -350,10 +339,10 @@ int8_t SdBaseFile::lsPrintNext(uint8_t flags, uint8_t indent) { && DIR_IS_FILE_OR_SUBDIR(&dir)) break; } // indent for dir level - LOOP_L_N(i, indent) SERIAL_CHAR(' '); + for (uint8_t i = 0; i < indent; i++) SERIAL_CHAR(' '); // print name - LOOP_L_N(i, 11) { + for (uint8_t i = 0; i < 11; i++) { if (dir.name[i] == ' ')continue; if (i == 8) { SERIAL_CHAR('.'); @@ -424,8 +413,6 @@ bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { * directory, \a path is invalid or already exists in \a parent. */ bool SdBaseFile::mkdir(SdBaseFile* parent, const char* path, bool pFlag) { - if (ENABLED(SDCARD_READONLY)) return false; - uint8_t dname[11]; SdBaseFile dir1, dir2; SdBaseFile* sub = &dir1; @@ -456,8 +443,6 @@ bool SdBaseFile::mkdir(SdBaseFile* parent, const char* path, bool pFlag) { } bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { - if (ENABLED(SDCARD_READONLY)) return false; - uint32_t block; dir_t d; dir_t* p; @@ -487,7 +472,7 @@ bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { // make entry for '.' memcpy(&d, p, sizeof(d)); d.name[0] = '.'; - LOOP_S_L_N(i, 1, 11) d.name[i] = ' '; + for (uint8_t i = 1; i < 11; i++) d.name[i] = ' '; // cache block for '.' and '..' block = vol_->clusterStartBlock(firstCluster_); @@ -641,7 +626,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t ofla } else { // don't create unless O_CREAT and O_WRITE - if ((oflag & (O_CREAT | O_WRITE)) != (O_CREAT | O_WRITE)) return false; + if (!(oflag & O_CREAT) || !(oflag & O_WRITE)) return false; if (emptyFound) { index = dirIndex_; p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); @@ -725,14 +710,8 @@ bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { // open a cached directory entry. Assumes vol_ is initialized bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { - dir_t* p; - - #if ENABLED(SDCARD_READONLY) - if (oflag & (O_WRITE | O_CREAT | O_TRUNC)) goto FAIL; - #endif - // location of entry in cache - p = &vol_->cache()->dir[dirIndex]; + dir_t* p = &vol_->cache()->dir[dirIndex]; // write or truncate is an error for a directory or read-only file if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { @@ -862,7 +841,7 @@ bool SdBaseFile::openParent(SdBaseFile* dir) { // search for parent in '../..' do { - if (file.readDir(&entry, nullptr) != 32) return false; + if (file.readDir(&entry, NULL) != 32) return false; c = entry.firstClusterLow; c |= (uint32_t)entry.firstClusterHigh << 16; } while (c != cluster); @@ -926,7 +905,7 @@ int SdBaseFile::peek() { // print uint8_t with width 2 static void print2u(const uint8_t v) { if (v < 10) SERIAL_CHAR('0'); - SERIAL_ECHO(int(v)); + SERIAL_ECHO_F(v, DEC); } /** @@ -978,7 +957,7 @@ void SdBaseFile::printFatTime(uint16_t fatTime) { */ bool SdBaseFile::printName() { char name[FILENAME_LENGTH]; - if (!getDosName(name)) return false; + if (!getFilename(name)) return false; SERIAL_ECHO(name); return true; } @@ -1103,7 +1082,7 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { if (WITHIN(seq, 1, MAX_VFAT_ENTRIES)) { // TODO: Store the filename checksum to verify if a long-filename-unaware system modified the file table. n = (seq - 1) * (FILENAME_LENGTH); - LOOP_L_N(i, FILENAME_LENGTH) + for (uint8_t i = 0; i < FILENAME_LENGTH; i++) longFilename[n + i] = (i < 5) ? VFAT->name1[i] : (i < 11) ? VFAT->name2[i - 5] : VFAT->name3[i - 11]; // If this VFAT entry is the last one, add a NUL terminator at the end of the string if (VFAT->sequenceNumber & 0x40) longFilename[n + FILENAME_LENGTH] = '\0'; @@ -1150,8 +1129,6 @@ dir_t* SdBaseFile::readDirCache() { * or an I/O error occurred. */ bool SdBaseFile::remove() { - if (ENABLED(SDCARD_READONLY)) return false; - dir_t* d; // free any clusters - will fail if read-only or directory if (!truncate(0)) return false; @@ -1189,8 +1166,6 @@ bool SdBaseFile::remove() { * or an I/O error occurred. */ bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { - if (ENABLED(SDCARD_READONLY)) return false; - SdBaseFile file; return file.open(dirFile, path, O_WRITE) ? file.remove() : false; } @@ -1206,8 +1181,6 @@ bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { * file, newPath is invalid or already exists, or an I/O error occurs. */ bool SdBaseFile::rename(SdBaseFile* dirFile, const char* newPath) { - if (ENABLED(SDCARD_READONLY)) return false; - dir_t entry; uint32_t dirCluster = 0; SdBaseFile file; @@ -1300,8 +1273,6 @@ restore: * directory, is not empty, or an I/O error occurred. */ bool SdBaseFile::rmdir() { - if (ENABLED(SDCARD_READONLY)) return false; - // must be open subdirectory if (!isSubDir()) return false; @@ -1340,8 +1311,6 @@ bool SdBaseFile::rmdir() { * \return true for success, false for failure. */ bool SdBaseFile::rmRfStar() { - if (ENABLED(SDCARD_READONLY)) return false; - uint32_t index; SdBaseFile f; rewind(); @@ -1449,7 +1418,7 @@ void SdBaseFile::setpos(filepos_t* pos) { */ bool SdBaseFile::sync() { // only allow open files and directories - if (ENABLED(SDCARD_READONLY) || !isOpen()) goto FAIL; + if (!isOpen()) goto FAIL; if (flags_ & F_FILE_DIR_DIRTY) { dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); @@ -1549,8 +1518,6 @@ bool SdBaseFile::timestamp(SdBaseFile* file) { */ bool SdBaseFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { - if (ENABLED(SDCARD_READONLY)) return false; - uint16_t dirDate, dirTime; dir_t* d; @@ -1602,8 +1569,6 @@ bool SdBaseFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, * \a length is greater than the current file size or an I/O error occurs. */ bool SdBaseFile::truncate(uint32_t length) { - if (ENABLED(SDCARD_READONLY)) return false; - uint32_t newPos; // error if not a normal file or read-only if (!isFile() || !(flags_ & O_WRITE)) return false; @@ -1662,12 +1627,9 @@ bool SdBaseFile::truncate(uint32_t length) { * \a nbyte. If an error occurs, write() returns -1. Possible errors * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. + * */ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { - #if ENABLED(SDCARD_READONLY) - writeError = true; return -1; - #endif - // convert void* to uint8_t* - must be before goto statements const uint8_t* src = reinterpret_cast(buf); diff --git a/Marlin/src/sd/SdBaseFile.h b/Marlin/src/sd/SdBaseFile.h index 13a1be863d..d8139d20c0 100644 --- a/Marlin/src/sd/SdBaseFile.h +++ b/Marlin/src/sd/SdBaseFile.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * \file @@ -28,10 +27,13 @@ /** * Arduino SdFat Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ +#ifndef _SDBASEFILE_H_ +#define _SDBASEFILE_H_ + #include "SdFatConfig.h" #include "SdVolume.h" @@ -108,7 +110,7 @@ static inline uint16_t FAT_YEAR(uint16_t fatDate) { return 1980 + (fatDate >> 9) * * \return Extracted month [1,12] */ -static inline uint8_t FAT_MONTH(uint16_t fatDate) { return (fatDate >> 5) & 0xF; } +static inline uint8_t FAT_MONTH(uint16_t fatDate) { return (fatDate >> 5) & 0XF; } /** * day part of FAT directory date field @@ -286,7 +288,7 @@ class SdBaseFile { */ bool isRoot() const { return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32; } - bool getDosName(char * const name); + bool getFilename(char * const name); void ls(uint8_t flags = 0, uint8_t indent = 0); bool mkdir(SdBaseFile* dir, const char* path, bool pFlag = true); @@ -385,3 +387,5 @@ class SdBaseFile { bool openCachedEntry(uint8_t cacheIndex, uint8_t oflags); dir_t* readDirCache(); }; + +#endif // _SDBASEFILE_H_ diff --git a/Marlin/src/sd/SdFatConfig.h b/Marlin/src/sd/SdFatConfig.h index 2e03a4181f..d2c769a014 100644 --- a/Marlin/src/sd/SdFatConfig.h +++ b/Marlin/src/sd/SdFatConfig.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,21 +16,24 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * SdFatConfig.h * Arduino SdFat Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ +#ifndef _SDFATCONFIG_H_ +#define _SDFATCONFIG_H_ + #include "../inc/MarlinConfig.h" + /** * To use multiple SD cards set USE_MULTIPLE_CARDS nonzero. * @@ -90,6 +93,12 @@ // Set USE_SOFTWARE_SPI nonzero to ALWAYS use Software SPI. #define USE_SOFTWARE_SPI 0 +// Define software SPI pins so Mega can use unmodified 168/328 shields +#define SOFT_SPI_CS_PIN 10 // Software SPI chip select pin for the SD +#define SOFT_SPI_MOSI_PIN 11 // Software SPI Master Out Slave In pin +#define SOFT_SPI_MISO_PIN 12 // Software SPI Master In Slave Out pin +#define SOFT_SPI_SCK_PIN 13 // Software SPI Clock pin + /** * The __cxa_pure_virtual function is an error handler that is invoked when * a pure virtual function is called. @@ -104,3 +113,5 @@ // Total bytes needed to store a single long filename #define LONG_FILENAME_LENGTH (FILENAME_LENGTH * MAX_VFAT_ENTRIES + 1) + +#endif // _SDFATCONFIG_H_ diff --git a/Marlin/src/sd/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h index 484d4e50c6..7b84b1ad0c 100644 --- a/Marlin/src/sd/SdFatStructs.h +++ b/Marlin/src/sd/SdFatStructs.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * \file @@ -28,10 +27,12 @@ /** * Arduino SdFat Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ +#ifndef SDFATSTRUCTS_H +#define SDFATSTRUCTS_H #include @@ -39,7 +40,7 @@ /** * mostly from Microsoft document fatgen103.doc - * https://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + * http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx */ uint8_t const BOOTSIG0 = 0x55, // Value for byte 510 of boot block or MBR @@ -128,6 +129,7 @@ typedef struct masterBootRecord mbr_t; * \struct fat_boot * * \brief Boot sector for a FAT12/FAT16 volume. + * */ struct fat_boot { /** @@ -408,6 +410,7 @@ uint32_t const FSINFO_LEAD_SIG = 0x41615252, // 'AaRR' Lead signature for a F * \struct fat32_fsinfo * * \brief FSINFO sector for a FAT32 volume. + * */ struct fat32_fsinfo { uint32_t leadSignature; // must be 0x52, 0x52, 0x61, 0x41 'RRaA' @@ -610,3 +613,5 @@ static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; } + +#endif // SDFATSTRUCTS_H diff --git a/Marlin/src/sd/SdFatUtil.cpp b/Marlin/src/sd/SdFatUtil.cpp index e2c467c5b6..1110d1dc9c 100644 --- a/Marlin/src/sd/SdFatUtil.cpp +++ b/Marlin/src/sd/SdFatUtil.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ /** * Arduino SdFat Library - * Copyright (c) 2008 by William Greiman + * Copyright (C) 2008 by William Greiman * * This file is part of the Arduino Sd2Card Library */ @@ -32,7 +32,6 @@ #if ENABLED(SDSUPPORT) #include "SdFatUtil.h" -#include /** * Amount of free RAM diff --git a/Marlin/src/sd/SdFatUtil.h b/Marlin/src/sd/SdFatUtil.h index 7afed2ede0..1deb1eb8f3 100644 --- a/Marlin/src/sd/SdFatUtil.h +++ b/Marlin/src/sd/SdFatUtil.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,20 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Arduino SdFat Library - * Copyright (c) 2008 by William Greiman + * Copyright (C) 2008 by William Greiman * * This file is part of the Arduino Sd2Card Library */ +#ifndef _SDFATUTIL_H_ +#define _SDFATUTIL_H_ + +#include /** * \file @@ -38,3 +41,5 @@ namespace SdFatUtil { } using namespace SdFatUtil; // NOLINT + +#endif // _SDFATUTIL_H_ diff --git a/Marlin/src/sd/SdFile.cpp b/Marlin/src/sd/SdFile.cpp index c82fe2c5ed..18b0324001 100644 --- a/Marlin/src/sd/SdFile.cpp +++ b/Marlin/src/sd/SdFile.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ /** * Arduino SdFat Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ @@ -57,6 +57,7 @@ SdFile::SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) { } * \a nbyte. If an error occurs, write() returns -1. Possible errors * include write() is called before a file has been opened, write is called * for a read-only file, device is full, a corrupt file system or an I/O error. + * */ int16_t SdFile::write(const void* buf, uint16_t nbyte) { return SdBaseFile::write(buf, nbyte); } diff --git a/Marlin/src/sd/SdFile.h b/Marlin/src/sd/SdFile.h index 52c8f1f0db..dd250110a1 100644 --- a/Marlin/src/sd/SdFile.h +++ b/Marlin/src/sd/SdFile.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * \file @@ -28,10 +27,12 @@ /** * Arduino SdFat Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ +#ifndef _SDFILE_H_ +#define _SDFILE_H_ #include "SdBaseFile.h" @@ -57,3 +58,5 @@ class SdFile : public SdBaseFile/*, public Print*/ { void write_P(PGM_P str); void writeln_P(PGM_P str); }; + +#endif // _SDFILE_H_ diff --git a/Marlin/src/sd/SdInfo.h b/Marlin/src/sd/SdInfo.h index bfa5a01ae2..91cb35da9e 100644 --- a/Marlin/src/sd/SdInfo.h +++ b/Marlin/src/sd/SdInfo.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,17 +16,18 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * Arduino Sd2Card Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ +#ifndef _SDINFO_H_ +#define _SDINFO_H_ #include @@ -39,7 +40,7 @@ // Version 3.01 // May 18, 2010 // -// https://www.sdcard.org/downloads/pls/index.html +// http://www.sdcard.org/developers/tech/sdcard/pls/simplified_specs // SD card commands uint8_t const CMD0 = 0x00, // GO_IDLE_STATE - init card in spi mode if CS low @@ -263,3 +264,5 @@ union csd_t { csd1_t v1; csd2_t v2; }; + +#endif // _SDINFO_H_ diff --git a/Marlin/src/sd/SdVolume.cpp b/Marlin/src/sd/SdVolume.cpp index 63731f728c..a872eb19d8 100644 --- a/Marlin/src/sd/SdVolume.cpp +++ b/Marlin/src/sd/SdVolume.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,13 +16,13 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ /** * Arduino SdFat Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ @@ -33,7 +33,7 @@ #include "SdVolume.h" -#include "../MarlinCore.h" +#include "../Marlin.h" #if !USE_MULTIPLE_CARDS // raw block cache @@ -46,8 +46,6 @@ // find a contiguous group of clusters bool SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { - if (ENABLED(SDCARD_READONLY)) return false; - // start of group uint32_t bgnCluster; // end of group @@ -119,20 +117,18 @@ bool SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { } bool SdVolume::cacheFlush() { - #if DISABLED(SDCARD_READONLY) - if (cacheDirty_) { - if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) - return false; + if (cacheDirty_) { + if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) + return false; - // mirror FAT tables - if (cacheMirrorBlock_) { - if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) - return false; - cacheMirrorBlock_ = 0; - } - cacheDirty_ = 0; + // mirror FAT tables + if (cacheMirrorBlock_) { + if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) + return false; + cacheMirrorBlock_ = 0; } - #endif + cacheDirty_ = 0; + } return true; } @@ -194,8 +190,6 @@ bool SdVolume::fatGet(uint32_t cluster, uint32_t* value) { // Store a FAT entry bool SdVolume::fatPut(uint32_t cluster, uint32_t value) { - if (ENABLED(SDCARD_READONLY)) return false; - uint32_t lba; // error if reserved cluster if (cluster < 2) return false; @@ -297,16 +291,6 @@ int32_t SdVolume::freeClusterCount() { for (uint16_t i = 0; i < n; i++) if (cacheBuffer_.fat32[i] == 0) free++; } - #ifdef ESP32 - // Needed to reset the idle task watchdog timer on ESP32 as reading the complete FAT may easily - // block for 10+ seconds. yield() is insufficient since it blocks lower prio tasks (e.g., idle). - static millis_t nextTaskTime = 0; - const millis_t ms = millis(); - if (ELAPSED(ms, nextTaskTime)) { - vTaskDelay(1); // delay 1 tick (Minimum. Usually 10 or 1 ms depending on skdconfig.h) - nextTaskTime = ms + 1000; // tickle the task manager again in 1 second - } - #endif // ESP32 } return free; } diff --git a/Marlin/src/sd/SdVolume.h b/Marlin/src/sd/SdVolume.h index 1ffa888468..d67d98f8be 100644 --- a/Marlin/src/sd/SdVolume.h +++ b/Marlin/src/sd/SdVolume.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,9 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once /** * \file @@ -28,26 +27,19 @@ /** * Arduino SdFat Library - * Copyright (c) 2009 by William Greiman + * Copyright (C) 2009 by William Greiman * * This file is part of the Arduino Sd2Card Library */ - -#include - -#include "../inc/MarlinConfigPre.h" - -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) - #include "usb_flashdrive/Sd2Card_FlashDrive.h" -#elif ENABLED(SDIO_SUPPORT) - #include "Sd2Card_sdio.h" -#else - #include "Sd2Card.h" -#endif +#ifndef _SDVOLUME_H_ +#define _SDVOLUME_H_ #include "SdFatConfig.h" +#include "Sd2Card.h" #include "SdFatStructs.h" +#include + //============================================================================== // SdVolume class /** @@ -199,3 +191,5 @@ class SdVolume { bool readBlock(uint32_t block, uint8_t* dst) { return sdCard_->readBlock(block, dst); } bool writeBlock(uint32_t block, const uint8_t* dst) { return sdCard_->writeBlock(block, dst); } }; + +#endif // _SDVOLUME_H_ diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index e154ea9f31..9ba018a2cf 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ @@ -24,105 +24,24 @@ #if ENABLED(SDSUPPORT) -//#define DEBUG_CARDREADER - #include "cardreader.h" -#include "../MarlinCore.h" +#include "../Marlin.h" #include "../lcd/ultralcd.h" - -#if ENABLED(DWIN_CREALITY_LCD) - #include "../lcd/dwin/e3v2/dwin.h" -#endif - -#include "../module/planner.h" // for synchronize +#include "../module/planner.h" #include "../module/printcounter.h" +#include "../core/language.h" #include "../gcode/queue.h" -#include "../module/settings.h" -#include "../module/stepper/indirection.h" - -#if ENABLED(EMERGENCY_PARSER) - #include "../feature/e_parser.h" -#endif #if ENABLED(POWER_LOSS_RECOVERY) - #include "../feature/powerloss.h" + #include "../feature/power_loss_recovery.h" #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) #include "../feature/pause.h" #endif -#define DEBUG_OUT EITHER(DEBUG_CARDREADER, MARLIN_DEV_MODE) -#include "../core/debug_out.h" -#include "../libs/hex_print.h" - -// public: - -card_flags_t CardReader::flag; -char CardReader::filename[FILENAME_LENGTH], CardReader::longFilename[LONG_FILENAME_LENGTH]; -int8_t CardReader::autostart_index; - -#if BOTH(HAS_MULTI_SERIAL, BINARY_FILE_TRANSFER) - int8_t CardReader::transfer_port_index; -#endif - -// private: - -SdFile CardReader::root, CardReader::workDir, CardReader::workDirParents[MAX_DIR_DEPTH]; -uint8_t CardReader::workDirDepth; - -#if ENABLED(SDCARD_SORT_ALPHA) - - uint16_t CardReader::sort_count; - #if ENABLED(SDSORT_GCODE) - bool CardReader::sort_alpha; - int CardReader::sort_folders; - //bool CardReader::sort_reverse; - #endif - - #if ENABLED(SDSORT_DYNAMIC_RAM) - uint8_t *CardReader::sort_order; - #else - uint8_t CardReader::sort_order[SDSORT_LIMIT]; - #endif - - #if ENABLED(SDSORT_USES_RAM) - - #if ENABLED(SDSORT_CACHE_NAMES) - uint16_t CardReader::nrFiles; // Cached total file count - #if ENABLED(SDSORT_DYNAMIC_RAM) - char **CardReader::sortshort, **CardReader::sortnames; - #else - char CardReader::sortshort[SDSORT_LIMIT][FILENAME_LENGTH]; - char CardReader::sortnames[SDSORT_LIMIT][SORTED_LONGNAME_STORAGE]; - #endif - #elif DISABLED(SDSORT_USES_STACK) - char CardReader::sortnames[SDSORT_LIMIT][SORTED_LONGNAME_STORAGE]; - #endif - - #if HAS_FOLDER_SORTING - #if ENABLED(SDSORT_DYNAMIC_RAM) - uint8_t *CardReader::isDir; - #elif ENABLED(SDSORT_CACHE_NAMES) || DISABLED(SDSORT_USES_STACK) - uint8_t CardReader::isDir[(SDSORT_LIMIT+7)>>3]; - #endif - #define IS_DIR(n) TEST(isDir[(n) >> 3], (n) & 0x07) - #endif - - #endif // SDSORT_USES_RAM - -#endif // SDCARD_SORT_ALPHA - -Sd2Card CardReader::sd2card; -SdVolume CardReader::volume; -SdFile CardReader::file; - -uint8_t CardReader::file_subcall_ctr; -uint32_t CardReader::filespos[SD_PROCEDURE_DEPTH]; -char CardReader::proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; - -uint32_t CardReader::filesize, CardReader::sdpos; +#include CardReader::CardReader() { #if ENABLED(SDCARD_SORT_ALPHA) @@ -133,8 +52,9 @@ CardReader::CardReader() { //sort_reverse = false; #endif #endif - flag.sdprinting = flag.mounted = flag.saving = flag.logging = false; - filesize = sdpos = 0; + sdprinting = cardOK = saving = logging = false; + filesize = 0; + sdpos = 0; file_subcall_ctr = 0; workDirDepth = 0; @@ -143,21 +63,15 @@ CardReader::CardReader() { // Disable autostart until card is initialized autostart_index = -1; - #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - SET_INPUT_PULLUP(SD_DETECT_PIN); - #endif - - #if PIN_EXISTS(SDPOWER) - OUT_WRITE(SDPOWER_PIN, HIGH); // Power the SD reader + //power to SD reader + #if SDPOWER > -1 + OUT_WRITE(SDPOWER, HIGH); #endif } -// -// Get a DOS 8.3 filename in its useful form -// -char *createFilename(char * const buffer, const dir_t &p) { +char *createFilename(char *buffer, const dir_t &p) { //buffer > 12characters char *pos = buffer; - LOOP_L_N(i, 11) { + for (uint8_t i = 0; i < 11; i++) { if (p.name[i] == ' ') continue; if (i == 8) *pos++ = '.'; *pos++ = p.name[i]; @@ -166,79 +80,28 @@ char *createFilename(char * const buffer, const dir_t &p) { return buffer; } -// -// Return 'true' if the item is a folder or G-code file -// -bool CardReader::is_dir_or_gcode(const dir_t &p) { - //uint8_t pn0 = p.name[0]; +/** + * Dive into a folder and recurse depth-first to perform a pre-set operation lsAction: + * LS_Count - Add +1 to nrFiles for every file within the parent + * LS_GetFilename - Get the filename of the file indexed by nrFile_index + * LS_SerialPrint - Print the full path and size of each file to serial output + */ - if ( (p.attributes & DIR_ATT_HIDDEN) // Hidden by attribute - // When readDir() > 0 these must be false: - //|| pn0 == DIR_NAME_FREE || pn0 == DIR_NAME_DELETED // Clear or Deleted entry - //|| pn0 == '.' || longFilename[0] == '.' // Hidden file - //|| !DIR_IS_FILE_OR_SUBDIR(&p) // Not a File or Directory - ) return false; +uint16_t nrFile_index; - flag.filenameIsDir = DIR_IS_SUBDIR(&p); // We know it's a File or Folder - - return ( - flag.filenameIsDir // All Directories are ok - || (p.name[8] == 'G' && p.name[9] != '~') // Non-backup *.G* files are accepted - ); -} - -// -// Get the number of (compliant) items in the folder -// -int CardReader::countItems(SdFile dir) { - dir_t p; - int c = 0; - while (dir.readDir(&p, longFilename) > 0) - c += is_dir_or_gcode(p); - - #if ALL(SDCARD_SORT_ALPHA, SDSORT_USES_RAM, SDSORT_CACHE_NAMES) - nrFiles = c; +void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/ + #if NUM_SERIAL > 1 + , const int8_t port/*= -1*/ #endif - - return c; -} - -// -// Get file/folder info for an item by index -// -void CardReader::selectByIndex(SdFile dir, const uint8_t index) { +) { dir_t p; - for (uint8_t cnt = 0; dir.readDir(&p, longFilename) > 0;) { - if (is_dir_or_gcode(p)) { - if (cnt == index) { - createFilename(filename, p); - return; // 0 based index - } - cnt++; - } - } -} + uint8_t cnt = 0; -// -// Get file/folder info for an item by name -// -void CardReader::selectByName(SdFile dir, const char * const match) { - dir_t p; - for (uint8_t cnt = 0; dir.readDir(&p, longFilename) > 0; cnt++) { - if (is_dir_or_gcode(p)) { - createFilename(filename, p); - if (strcasecmp(match, filename) == 0) return; - } - } -} - -// -// Recursive method to list all files within a folder -// -void CardReader::printListing(SdFile parent, const char * const prepend/*=nullptr*/) { - dir_t p; + // Read the next entry from a directory while (parent.readDir(&p, longFilename) > 0) { - if (DIR_IS_SUBDIR(&p)) { + + // If the entry is a directory and the action is LS_SerialPrint + if (DIR_IS_SUBDIR(&p) && lsAction != LS_Count && lsAction != LS_GetFilename) { // Get the short name for the item, which we know is a folder char dosFilename[FILENAME_LENGTH]; @@ -253,51 +116,96 @@ void CardReader::printListing(SdFile parent, const char * const prepend/*=nullpt // It contains the full path to the "parent" argument. // We now have the full path to the item in this folder. strcpy(path, prepend_is_empty ? "/" : prepend); // root slash if prepend is empty - strcat(path, dosFilename); // FILENAME_LENGTH characters maximum - strcat(path, "/"); // 1 character + strcat(path, dosFilename); // FILENAME_LENGTH-1 characters maximum + strcat(path, "/"); // 1 character // Serial.print(path); // Get a new directory object using the full path // and dive recursively into it. - SdFile child; - if (!child.open(&parent, dosFilename, O_READ)) { - SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_SD_CANT_OPEN_SUBDIR, dosFilename); + SdFile dir; + if (!dir.open(&parent, dosFilename, O_READ)) { + if (lsAction == LS_SerialPrint) { + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPGM_P(port, MSG_SD_CANT_OPEN_SUBDIR); + SERIAL_ECHOLN_P(port, dosFilename); + } } - printListing(child, path); + lsDive(path, dir + #if NUM_SERIAL > 1 + , NULL, port + #endif + ); // close() is done automatically by destructor of SdFile } - else if (is_dir_or_gcode(p)) { - createFilename(filename, p); - if (prepend) SERIAL_ECHO(prepend); - SERIAL_ECHO(filename); - SERIAL_CHAR(' '); - SERIAL_ECHOLN(p.fileSize); + else { + uint8_t pn0 = p.name[0]; + if (pn0 == DIR_NAME_FREE) break; + if (pn0 == DIR_NAME_DELETED || pn0 == '.') continue; + if (longFilename[0] == '.') continue; + + if (!DIR_IS_FILE_OR_SUBDIR(&p) || (p.attributes & DIR_ATT_HIDDEN)) continue; + + filenameIsDir = DIR_IS_SUBDIR(&p); + + if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue; + + switch (lsAction) { // 1 based file count + case LS_Count: + nrFiles++; + break; + + case LS_SerialPrint: + createFilename(filename, p); + if (prepend) SERIAL_PROTOCOL_P(port, prepend); + SERIAL_PROTOCOL_P(port, filename); + SERIAL_PROTOCOLCHAR_P(port, ' '); + SERIAL_PROTOCOLLN_P(port, p.fileSize); + break; + + case LS_GetFilename: + createFilename(filename, p); + if (match != NULL) { + if (strcasecmp(match, filename) == 0) return; + } + else if (cnt == nrFile_index) return; // 0 based index + cnt++; + break; + } + } - } + } // while readDir } -// -// List all files on the SD card -// -void CardReader::ls() { - if (flag.mounted) { - root.rewind(); - printListing(root); - } +void CardReader::ls( + #if NUM_SERIAL > 1 + const int8_t port + #endif +) { + lsAction = LS_SerialPrint; + root.rewind(); + lsDive(NULL, root + #if NUM_SERIAL > 1 + , NULL, port + #endif + ); } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - // - // Get a long pretty path based on a DOS 8.3 path - // - void CardReader::printLongPath(char * const path) { + /** + * Get a long pretty path based on a DOS 8.3 path + */ + void CardReader::printLongPath(char *path + #if NUM_SERIAL > 1 + , const int8_t port/*= -1*/ + #endif + ) { + lsAction = LS_GetFilename; int i, pathLen = strlen(path); - // SERIAL_ECHOPGM("Full Path: "); SERIAL_ECHOLN(path); + // SERIAL_ECHOPGM_P(port, "Full Path: "); SERIAL_ECHOLN_P(port, path); // Zero out slashes to make segments for (i = 0; i < pathLen; i++) if (path[i] == '/') path[i] = '\0'; @@ -315,27 +223,32 @@ void CardReader::ls() { // Go to the next segment while (path[++i]) { } - // SERIAL_ECHOPGM("Looking for segment: "); SERIAL_ECHOLN(segment); + // SERIAL_ECHOPGM_P(port, "Looking for segment: "); SERIAL_ECHOLN_P(port, segment); // Find the item, setting the long filename diveDir.rewind(); - selectByName(diveDir, segment); + lsDive(NULL, diveDir, segment + #if NUM_SERIAL > 1 + , port + #endif + ); // Print /LongNamePart to serial output - SERIAL_CHAR('/'); - SERIAL_ECHO(longFilename[0] ? longFilename : "???"); + SERIAL_PROTOCOLCHAR_P(port, '/'); + SERIAL_PROTOCOL_P(port, longFilename[0] ? longFilename : "???"); // If the filename was printed then that's it - if (!flag.filenameIsDir) break; + if (!filenameIsDir) break; - // SERIAL_ECHOPGM("Opening dir: "); SERIAL_ECHOLN(segment); + // SERIAL_ECHOPGM_P(port, "Opening dir: "); SERIAL_ECHOLN_P(port, segment); // Open the sub-item as the new dive parent SdFile dir; if (!dir.open(&diveDir, segment, O_READ)) { - SERIAL_EOL(); - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(STR_SD_CANT_OPEN_SUBDIR, segment); + SERIAL_EOL_P(port); + SERIAL_ECHO_START_P(port); + SERIAL_ECHOPGM_P(port, MSG_SD_CANT_OPEN_SUBDIR); + SERIAL_ECHO_P(port, segment); break; } @@ -344,214 +257,144 @@ void CardReader::ls() { } // while i 1 + const int8_t port/*= -1*/ + #endif +) { if (file.isOpen()) { char dosFilename[FILENAME_LENGTH]; - file.getDosName(dosFilename); - SERIAL_ECHO(dosFilename); + file.getFilename(dosFilename); + SERIAL_ECHO_P(port, dosFilename); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - selectFileByName(dosFilename); + getfilename(0, dosFilename); if (longFilename[0]) { - SERIAL_ECHO(' '); - SERIAL_ECHO(longFilename); + SERIAL_ECHO_P(port, ' '); + SERIAL_ECHO_P(port, longFilename); } #endif } else - SERIAL_ECHOPGM("(no file)"); + SERIAL_ECHOPGM_P(port, "(no file)"); - SERIAL_EOL(); + SERIAL_EOL_P(port); } -void CardReader::mount() { - flag.mounted = false; +void CardReader::initsd() { + cardOK = false; if (root.isOpen()) root.close(); + #ifndef SPI_SPEED + #define SPI_SPEED SPI_FULL_SPEED + #endif + if (!sd2card.init(SPI_SPEED, SDSS) #if defined(LCD_SDSS) && (LCD_SDSS != SDSS) && !sd2card.init(SPI_SPEED, LCD_SDSS) #endif - ) SERIAL_ECHO_MSG(STR_SD_INIT_FAIL); - else if (!volume.init(&sd2card)) - SERIAL_ERROR_MSG(STR_SD_VOL_INIT_FAIL); - else if (!root.openRoot(&volume)) - SERIAL_ERROR_MSG(STR_SD_OPENROOT_FAIL); + ) { + //if (!sd2card.init(SPI_HALF_SPEED,SDSS)) + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_SD_INIT_FAIL); + } + else if (!volume.init(&sd2card)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_SD_VOL_INIT_FAIL); + } + else if (!root.openRoot(&volume)) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_SD_OPENROOT_FAIL); + } else { - flag.mounted = true; - SERIAL_ECHO_MSG(STR_SD_CARD_OK); + cardOK = true; + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM(MSG_SD_CARD_OK); } - - if (flag.mounted) - cdroot(); - #if ENABLED(USB_FLASH_DRIVE_SUPPORT) || PIN_EXISTS(SD_DETECT) - else if (marlin_state != MF_INITIALIZING) - ui.set_status_P(GET_TEXT(MSG_SD_INIT_FAIL), -1); - #endif - - ui.refresh(); -} - -/** - * Handle SD card events - */ -#if MB(FYSETC_CHEETAH, FYSETC_AIO_II) - #include "../module/stepper.h" -#endif - -void CardReader::manage_media() { - static uint8_t prev_stat = 2; // First call, no prior state - uint8_t stat = uint8_t(IS_SD_INSERTED()); - if (stat == prev_stat) return; - - DEBUG_ECHOLNPAIR("SD: Status changed from ", prev_stat, " to ", stat); - - flag.workDirIsRoot = true; // Return to root on mount/release - - if (ui.detected()) { - - uint8_t old_stat = prev_stat; - prev_stat = stat; // Change now to prevent re-entry - - if (stat) { // Media Inserted - safe_delay(500); // Some boards need a delay to get settled - mount(); // Try to mount the media - #if MB(FYSETC_CHEETAH, FYSETC_CHEETAH_V12, FYSETC_AIO_II) - reset_stepper_drivers(); // Workaround for Cheetah bug - #endif - if (!isMounted()) stat = 0; // Not mounted? - } - else { - #if PIN_EXISTS(SD_DETECT) - release(); // Card is released - #endif - } - - ui.media_changed(old_stat, stat); // Update the UI - - if (stat) { - TERN_(SDCARD_EEPROM_EMULATION, settings.first_load()); - if (old_stat == 2) // First mount? - DEBUG_ECHOLNPGM("First mount."); - TERN(POWER_LOSS_RECOVERY, - recovery.check(), // Check for PLR file. (If not there it will beginautostart) - beginautostart() // Look for auto0.g on the next loop - ); - } - } - else - DEBUG_ECHOLNPGM("SD: No UI Detected."); + setroot(); } void CardReader::release() { - endFilePrint(); - flag.mounted = false; - flag.workDirIsRoot = true; - #if ALL(SDCARD_SORT_ALPHA, SDSORT_USES_RAM, SDSORT_CACHE_NAMES) - nrFiles = 0; - #endif + sdprinting = false; + cardOK = false; } void CardReader::openAndPrintFile(const char *name) { char cmd[4 + strlen(name) + 1]; // Room for "M23 ", filename, and null - extern const char M23_STR[]; - sprintf_P(cmd, M23_STR, name); + sprintf_P(cmd, PSTR("M23 %s"), name); for (char *c = &cmd[4]; *c; c++) *c = tolower(*c); - queue.enqueue_one_now(cmd); - queue.enqueue_now_P(M24_STR); + enqueue_and_echo_command_now(cmd); + enqueue_and_echo_commands_P(PSTR("M24")); } void CardReader::startFileprint() { - if (isMounted()) { - flag.sdprinting = true; - TERN_(SD_RESORT, flush_presort()); + if (cardOK) { + sdprinting = true; + #if SD_RESORT + flush_presort(); + #endif } } -void CardReader::endFilePrint(TERN_(SD_RESORT, const bool re_sort/*=false*/)) { - TERN_(ADVANCED_PAUSE_FEATURE, did_pause_print = 0); - TERN_(DWIN_CREALITY_LCD, HMI_flag.print_finish = flag.sdprinting); - flag.sdprinting = flag.abort_sd_printing = false; +void CardReader::stopSDPrint( + #if SD_RESORT + const bool re_sort/*=false*/ + #endif +) { + #if ENABLED(ADVANCED_PAUSE_FEATURE) + did_pause_print = 0; + #endif + sdprinting = false; if (isFileOpen()) file.close(); - TERN_(SD_RESORT, if (re_sort) presort()); + #if SD_RESORT + if (re_sort) presort(); + #endif } void CardReader::openLogFile(char * const path) { - flag.logging = DISABLED(SDCARD_READONLY); - TERN(SDCARD_READONLY,,openFileWrite(path)); + logging = true; + openFile(path, false); } -// -// Get the root-relative DOS path of the selected file -// -void CardReader::getAbsFilename(char *dst) { - *dst++ = '/'; +void appendAtom(SdFile &file, char *& dst, uint8_t &cnt) { + file.getFilename(dst); + while (*dst && cnt < MAXPATHNAMELENGTH) { dst++; cnt++; } + if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; } +} + +void CardReader::getAbsFilename(char *t) { + *t++ = '/'; // Root folder uint8_t cnt = 1; - auto appendAtom = [&](SdFile &file) { - file.getDosName(dst); - while (*dst && cnt < MAXPATHNAMELENGTH) { dst++; cnt++; } - if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; } - }; + for (uint8_t i = 0; i < workDirDepth; i++) // Loop to current work dir + appendAtom(workDirParents[i], t, cnt); - LOOP_L_N(i, workDirDepth) // Loop down to current work dir - appendAtom(workDirParents[i]); - - if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH) - 1) { // Leave room for filename and nul - appendAtom(file); - --dst; + if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH)) { + appendAtom(file, t, cnt); + --t; } - *dst = '\0'; + *t = '\0'; } -void openFailed(const char * const fname) { - SERIAL_ECHOLNPAIR(STR_SD_OPEN_FILE_FAIL, fname, "."); -} +void CardReader::openFile(char * const path, const bool read, const bool subcall/*=false*/) { -void announceOpen(const uint8_t doing, const char * const path) { - if (doing) { - PORT_REDIRECT(SERIAL_BOTH); - SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Now "); - serialprintPGM(doing == 1 ? PSTR("doing") : PSTR("fresh")); - SERIAL_ECHOLNPAIR(" file: ", path); - PORT_RESTORE(); - } -} + if (!cardOK) return; -// -// Open a file by DOS path for read -// The 'subcall_type' flag indicates... -// - 0 : Standard open from host or user interface. -// - 1 : (file open) Opening a new sub-procedure. -// - 1 : (no file open) Opening a macro (M98). -// - 2 : Resuming from a sub-procedure -// -void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0*/) { - if (!isMounted()) return; - - switch (subcall_type) { - case 0: // Starting a new print. "Now fresh file: ..." - announceOpen(2, path); - file_subcall_ctr = 0; - break; - - case 1: // Starting a sub-procedure - - // With no file is open it's a simple macro. "Now doing file: ..." - if (!isFileOpen()) { announceOpen(1, path); break; } - - // Too deep? The firmware has to bail. + uint8_t doing = 0; + if (isFileOpen()) { // Replacing current file or doing a subroutine + if (subcall) { if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) { - SERIAL_ERROR_MSG("Exceeded max SUBROUTINE depth:" STRINGIFY(SD_PROCEDURE_DEPTH)); - kill(GET_TEXT(MSG_KILL_SUBCALL_OVERFLOW)); + SERIAL_ERROR_START(); + SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:"); + SERIAL_ERRORLN((int)SD_PROCEDURE_DEPTH); + kill(PSTR(MSG_KILLED)); return; } @@ -559,132 +402,117 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0* getAbsFilename(proc_filenames[file_subcall_ctr]); filespos[file_subcall_ctr] = sdpos; - // For sub-procedures say 'SUBROUTINE CALL target: "..." parent: "..." pos12345' SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR("SUBROUTINE CALL target:\"", path, "\" parent:\"", proc_filenames[file_subcall_ctr], "\" pos", sdpos); + SERIAL_ECHOPAIR("SUBROUTINE CALL target:\"", path); + SERIAL_ECHOPAIR("\" parent:\"", proc_filenames[file_subcall_ctr]); + SERIAL_ECHOLNPAIR("\" pos", sdpos); file_subcall_ctr++; - break; - - case 2: // Resuming previous file after sub-procedure - SERIAL_ECHO_MSG("END SUBROUTINE"); - break; - } - - endFilePrint(); - - SdFile *diveDir; - const char * const fname = diveToFile(true, diveDir, path); - if (!fname) return; - - if (file.open(diveDir, fname, O_READ)) { - filesize = file.fileSize(); - sdpos = 0; - - PORT_REDIRECT(SERIAL_BOTH); - SERIAL_ECHOLNPAIR(STR_SD_FILE_OPENED, fname, STR_SD_SIZE, filesize); - SERIAL_ECHOLNPGM(STR_SD_FILE_SELECTED); - PORT_RESTORE(); - - selectFileByName(fname); - ui.set_status(longFilename[0] ? longFilename : fname); - } - else - openFailed(fname); -} - -inline void echo_write_to_file(const char * const fname) { - SERIAL_ECHOLNPAIR(STR_SD_WRITE_TO_FILE, fname); -} - -// -// Open a file by DOS path for write -// -void CardReader::openFileWrite(char * const path) { - if (!isMounted()) return; - - announceOpen(2, path); - file_subcall_ctr = 0; - - endFilePrint(); - - SdFile *diveDir; - const char * const fname = diveToFile(false, diveDir, path); - if (!fname) return; - - #if ENABLED(SDCARD_READONLY) - openFailed(fname); - #else - if (file.open(diveDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { - flag.saving = true; - selectFileByName(fname); - TERN_(EMERGENCY_PARSER, emergency_parser.disable()); - echo_write_to_file(fname); - ui.set_status(fname); } else - openFailed(fname); - #endif -} - -// -// Check if a file exists by absolute or workDir-relative path -// If the file exists, the long name can also be fetched. -// -bool CardReader::fileExists(const char * const path) { - if (!isMounted()) return false; - SdFile *diveDir = nullptr; - const char * const fname = diveToFile(false, diveDir, path); - if (fname) { - diveDir->rewind(); - selectByName(*diveDir, fname); - diveDir->close(); + doing = 1; + } + else if (subcall) { // Returning from a subcall? + SERIAL_ECHO_START(); + SERIAL_ECHOLNPGM("END SUBROUTINE"); + } + else { // Opening fresh file + doing = 2; + file_subcall_ctr = 0; // Reset procedure depth in case user cancels print while in procedure } - return fname != nullptr; -} -// -// Delete a file by name in the working directory -// -void CardReader::removeFile(const char * const name) { - if (!isMounted()) return; + if (doing) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Now "); + serialprintPGM(doing == 1 ? PSTR("doing") : PSTR("fresh")); + SERIAL_ECHOLNPAIR(" file: ", path); + } - //endFilePrint(); + stopSDPrint(); SdFile *curDir; - const char * const fname = diveToFile(false, curDir, name); + const char * const fname = diveToFile(curDir, path, false); if (!fname) return; - #if ENABLED(SDCARD_READONLY) - SERIAL_ECHOLNPAIR("Deletion failed (read-only), File: ", fname, "."); - #else - if (file.remove(curDir, fname)) { - SERIAL_ECHOLNPAIR("File deleted:", fname); + if (read) { + if (file.open(curDir, fname, O_READ)) { + filesize = file.fileSize(); sdpos = 0; - TERN_(SDCARD_SORT_ALPHA, presort()); + SERIAL_PROTOCOLPAIR(MSG_SD_FILE_OPENED, fname); + SERIAL_PROTOCOLLNPAIR(MSG_SD_SIZE, filesize); + SERIAL_PROTOCOLLNPGM(MSG_SD_FILE_SELECTED); + + getfilename(0, fname); + lcd_setstatus(longFilename[0] ? longFilename : fname); + //if (longFilename[0]) { + // SERIAL_PROTOCOLPAIR(MSG_SD_FILE_LONG_NAME, longFilename); + //} } - else - SERIAL_ECHOLNPAIR("Deletion failed, File: ", fname, "."); - #endif + else { + SERIAL_PROTOCOLPAIR(MSG_SD_OPEN_FILE_FAIL, fname); + SERIAL_PROTOCOLCHAR('.'); + SERIAL_EOL(); + } + } + else { //write + if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { + SERIAL_PROTOCOLPAIR(MSG_SD_OPEN_FILE_FAIL, fname); + SERIAL_PROTOCOLCHAR('.'); + SERIAL_EOL(); + } + else { + saving = true; + SERIAL_PROTOCOLLNPAIR(MSG_SD_WRITE_TO_FILE, path); + lcd_setstatus(fname); + } + } } -void CardReader::report_status() { - if (isPrinting()) { - SERIAL_ECHOPGM(STR_SD_PRINTING_BYTE); - SERIAL_ECHO(sdpos); - SERIAL_CHAR('/'); - SERIAL_ECHOLN(filesize); +void CardReader::removeFile(const char * const name) { + if (!cardOK) return; + + stopSDPrint(); + + SdFile *curDir; + const char * const fname = diveToFile(curDir, name, false); + if (!fname) return; + + if (file.remove(curDir, fname)) { + SERIAL_PROTOCOLPGM("File deleted:"); + SERIAL_PROTOCOLLN(fname); + sdpos = 0; + #if ENABLED(SDCARD_SORT_ALPHA) + presort(); + #endif + } + else { + SERIAL_PROTOCOLPGM("Deletion failed, File: "); + SERIAL_PROTOCOL(fname); + SERIAL_PROTOCOLCHAR('.'); + } +} + +void CardReader::getStatus( + #if NUM_SERIAL > 1 + const int8_t port/*= -1*/ + #endif +) { + if (cardOK && sdprinting) { + SERIAL_PROTOCOLPGM_P(port, MSG_SD_PRINTING_BYTE); + SERIAL_PROTOCOL_P(port, sdpos); + SERIAL_PROTOCOLCHAR_P(port, '/'); + SERIAL_PROTOCOLLN_P(port, filesize); } else - SERIAL_ECHOLNPGM(STR_SD_NOT_PRINTING); + SERIAL_PROTOCOLLNPGM_P(port, MSG_SD_NOT_PRINTING); } -void CardReader::write_command(char * const buf) { +void CardReader::write_command(char *buf) { char* begin = buf; - char* npos = nullptr; + char* npos = NULL; char* end = buf + strlen(buf) - 1; file.writeError = false; - if ((npos = strchr(buf, 'N')) != nullptr) { + if ((npos = strchr(buf, 'N')) != NULL) { begin = strchr(npos, ' ') + 1; end = strchr(npos, '*') - 1; } @@ -692,8 +520,10 @@ void CardReader::write_command(char * const buf) { end[2] = '\n'; end[3] = '\0'; file.write(begin); - - if (file.writeError) SERIAL_ERROR_MSG(STR_SD_ERR_WRITE_TO_FILE); + if (file.writeError) { + SERIAL_ERROR_START(); + SERIAL_ERRORLNPGM(MSG_SD_ERR_WRITE_TO_FILE); + } } // @@ -705,18 +535,20 @@ void CardReader::write_command(char * const buf) { void CardReader::checkautostart() { - if (autostart_index < 0 || flag.sdprinting) return; + if (autostart_index < 0 || sdprinting) return; - if (!isMounted()) mount(); - TERN_(SDCARD_EEPROM_EMULATION, else settings.first_load()); + if (!cardOK) initsd(); - // Don't run auto#.g when a PLR file exists - if (isMounted() && TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) { - char autoname[8]; - sprintf_P(autoname, PSTR("auto%c.g"), autostart_index + '0'); + if (cardOK + #if ENABLED(POWER_LOSS_RECOVERY) + && !jobRecoverFileExists() // Don't run auto#.g when a resume file exists + #endif + ) { + char autoname[10]; + sprintf_P(autoname, PSTR("auto%i.g"), int(autostart_index)); dir_t p; root.rewind(); - while (root.readDir(&p, nullptr) > 0) { + while (root.readDir(&p, NULL) > 0) { for (int8_t i = (int8_t)strlen((char*)p.name); i--;) p.name[i] = tolower(p.name[i]); if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) { openAndPrintFile(autoname); @@ -730,15 +562,13 @@ void CardReader::checkautostart() { void CardReader::beginautostart() { autostart_index = 0; - cdroot(); + setroot(); } -void CardReader::closefile(const bool store_location/*=false*/) { +void CardReader::closefile(const bool store_location) { file.sync(); file.close(); - flag.saving = flag.logging = false; - sdpos = 0; - TERN_(EMERGENCY_PARSER, emergency_parser.enable()); + saving = logging = false; if (store_location) { //future: store printer state, filename and position for continuing a stopped print @@ -746,209 +576,126 @@ void CardReader::closefile(const bool store_location/*=false*/) { } } -// -// Get info for a file in the working directory by index -// -void CardReader::selectFileByIndex(const uint16_t nr) { +/** + * Get the name of a file in the current directory by index + * with optional name to match. + */ +void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/) { #if ENABLED(SDSORT_CACHE_NAMES) + if (match != NULL) { + while (nr < sort_count) { + if (strcasecmp(match, sortshort[nr]) == 0) break; + nr++; + } + } if (nr < sort_count) { strcpy(filename, sortshort[nr]); strcpy(longFilename, sortnames[nr]); - flag.filenameIsDir = IS_DIR(nr); + filenameIsDir = TEST(isDir[nr>>3], nr & 0x07); return; } - #endif + #endif // SDSORT_CACHE_NAMES + lsAction = LS_GetFilename; + nrFile_index = nr; workDir.rewind(); - selectByIndex(workDir, nr); + lsDive(NULL, workDir, match); } -// -// Get info for a file in the working directory by DOS name -// -void CardReader::selectFileByName(const char * const match) { - #if ENABLED(SDSORT_CACHE_NAMES) - for (uint16_t nr = 0; nr < sort_count; nr++) - if (strcasecmp(match, sortshort[nr]) == 0) { - strcpy(filename, sortshort[nr]); - strcpy(longFilename, sortnames[nr]); - flag.filenameIsDir = IS_DIR(nr); - return; - } - #endif +uint16_t CardReader::getnrfilenames() { + lsAction = LS_Count; + nrFiles = 0; workDir.rewind(); - selectByName(workDir, match); -} - -uint16_t CardReader::countFilesInWorkDir() { - workDir.rewind(); - return countItems(workDir); + lsDive(NULL, workDir); + //SERIAL_ECHOLN(nrFiles); + return nrFiles; } /** - * Dive to the given DOS 8.3 file path, with optional echo of the dive paths. - * - * On exit: - * - Your curDir pointer contains an SdFile reference to the file's directory. - * - If update_cwd was 'true' the workDir now points to the file's directory. - * - * Returns a pointer to the last segment (filename) of the given DOS 8.3 path. - * - * A nullptr result indicates an unrecoverable error. + * Dive to the given file path, with optional echo. + * On exit set curDir and return the name part of the path. + * A NULL result indicates an unrecoverable error. */ -const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, const char * const path, const bool echo/*=false*/) { - // Track both parent and subfolder - static SdFile newDir1, newDir2; - SdFile *sub = &newDir1, *startDir; +const char* CardReader::diveToFile(SdFile*& curDir, const char * const path, const bool echo) { + SdFile myDir; + if (path[0] != '/') { curDir = &workDir; return path; } - // Parsing the path string - const char *item_name_adr = path; - - DEBUG_ECHOLNPAIR("diveToFile: path = '", path, "'"); - - if (path[0] == '/') { // Starting at the root directory? - diveDir = &root; - item_name_adr++; - DEBUG_ECHOLNPAIR("diveToFile: CWD to root: ", hex_address((void*)diveDir)); - if (update_cwd) workDirDepth = 0; // The cwd can be updated for the benefit of sub-programs - } - else - diveDir = &workDir; // Dive from workDir (as set by the UI) - - startDir = diveDir; - - DEBUG_ECHOLNPAIR("diveToFile: startDir = ", hex_address((void*)startDir)); - - while (item_name_adr) { - // Find next subdirectory delimiter - char * const name_end = strchr(item_name_adr, '/'); - - // Last atom in the path? Item found. - if (name_end <= item_name_adr) break; - - // Set subDirName - const uint8_t len = name_end - item_name_adr; + curDir = &root; + const char *dirname_start = &path[1]; + while (dirname_start) { + char * const dirname_end = strchr(dirname_start, '/'); + if (dirname_end <= dirname_start) break; + const uint8_t len = dirname_end - dirname_start; char dosSubdirname[len + 1]; - strncpy(dosSubdirname, item_name_adr, len); + strncpy(dosSubdirname, dirname_start, len); dosSubdirname[len] = 0; if (echo) SERIAL_ECHOLN(dosSubdirname); - DEBUG_ECHOLNPAIR("diveToFile: sub = ", hex_address((void*)sub)); - - // Open diveDir (closing first) - sub->close(); - if (!sub->open(diveDir, dosSubdirname, O_READ)) { - openFailed(dosSubdirname); - item_name_adr = nullptr; - break; + if (!myDir.open(curDir, dosSubdirname, O_READ)) { + SERIAL_PROTOCOLPAIR(MSG_SD_OPEN_FILE_FAIL, dosSubdirname); + SERIAL_PROTOCOLCHAR('.'); + SERIAL_EOL(); + return NULL; } - - // Close diveDir if not at starting-point - if (diveDir != startDir) { - DEBUG_ECHOLNPAIR("diveToFile: closing diveDir: ", hex_address((void*)diveDir)); - diveDir->close(); - } - - // diveDir now subDir - diveDir = sub; - DEBUG_ECHOLNPAIR("diveToFile: diveDir = sub: ", hex_address((void*)diveDir)); - - // Update workDirParents and workDirDepth - if (update_cwd) { - DEBUG_ECHOLNPAIR("diveToFile: update_cwd"); - if (workDirDepth < MAX_DIR_DEPTH) - workDirParents[workDirDepth++] = *diveDir; - } - - // Point sub at the other scratch object - sub = (diveDir != &newDir1) ? &newDir1 : &newDir2; - DEBUG_ECHOLNPAIR("diveToFile: swapping sub = ", hex_address((void*)sub)); - - // Next path atom address - item_name_adr = name_end + 1; + curDir = &myDir; + dirname_start = dirname_end + 1; } - - if (update_cwd) { - workDir = *diveDir; - DEBUG_ECHOLNPAIR("diveToFile: final workDir = ", hex_address((void*)diveDir)); - flag.workDirIsRoot = (workDirDepth == 0); - TERN_(SDCARD_SORT_ALPHA, presort()); - } - - return item_name_adr; + return dirname_start; } -void CardReader::cd(const char * relpath) { +void CardReader::chdir(const char * relpath) { SdFile newDir; SdFile *parent = workDir.isOpen() ? &workDir : &root; if (newDir.open(parent, relpath, O_READ)) { workDir = newDir; - flag.workDirIsRoot = false; if (workDirDepth < MAX_DIR_DEPTH) workDirParents[workDirDepth++] = workDir; - TERN_(SDCARD_SORT_ALPHA, presort()); + #if ENABLED(SDCARD_SORT_ALPHA) + presort(); + #endif } else { SERIAL_ECHO_START(); - SERIAL_ECHOLNPAIR(STR_SD_CANT_ENTER_SUBDIR, relpath); + SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR); + SERIAL_ECHOLN(relpath); } } -int8_t CardReader::cdup() { +int8_t CardReader::updir() { if (workDirDepth > 0) { // At least 1 dir has been saved workDir = --workDirDepth ? workDirParents[workDirDepth - 1] : root; // Use parent, or root if none - TERN_(SDCARD_SORT_ALPHA, presort()); + #if ENABLED(SDCARD_SORT_ALPHA) + presort(); + #endif } - if (!workDirDepth) flag.workDirIsRoot = true; return workDirDepth; } -void CardReader::cdroot() { +void CardReader::setroot() { + /*if (!workDir.openRoot(&volume)) { + SERIAL_ECHOLNPGM(MSG_SD_WORKDIR_FAIL); + }*/ workDir = root; - flag.workDirIsRoot = true; - TERN_(SDCARD_SORT_ALPHA, presort()); + #if ENABLED(SDCARD_SORT_ALPHA) + presort(); + #endif } #if ENABLED(SDCARD_SORT_ALPHA) /** - * Get the name of a file in the working directory by sort-index + * Get the name of a file in the current directory by sort-index */ void CardReader::getfilename_sorted(const uint16_t nr) { - selectFileByIndex(TERN1(SDSORT_GCODE, sort_alpha) && (nr < sort_count) - ? sort_order[nr] : nr); + getfilename( + #if ENABLED(SDSORT_GCODE) + sort_alpha && + #endif + (nr < sort_count) ? sort_order[nr] : nr + ); } - #if ENABLED(SDSORT_USES_RAM) - #if ENABLED(SDSORT_DYNAMIC_RAM) - // Use dynamic method to copy long filename - #define SET_SORTNAME(I) (sortnames[I] = strdup(longest_filename())) - #if ENABLED(SDSORT_CACHE_NAMES) - // When caching also store the short name, since - // we're replacing the selectFileByIndex() behavior. - #define SET_SORTSHORT(I) (sortshort[I] = strdup(filename)) - #else - #define SET_SORTSHORT(I) NOOP - #endif - #else - // Copy filenames into the static array - #define _SET_SORTNAME(I) strncpy(sortnames[I], longest_filename(), SORTED_LONGNAME_MAXLEN) - #if SORTED_LONGNAME_MAXLEN == LONG_FILENAME_LENGTH - // Short name sorting always use LONG_FILENAME_LENGTH with no trailing nul - #define SET_SORTNAME(I) _SET_SORTNAME(I) - #else - // Copy multiple name blocks. Add a nul for the longest case. - #define SET_SORTNAME(I) do{ _SET_SORTNAME(I); sortnames[I][SORTED_LONGNAME_MAXLEN] = '\0'; }while(0) - #endif - #if ENABLED(SDSORT_CACHE_NAMES) - #define SET_SORTSHORT(I) strcpy(sortshort[I], filename) - #else - #define SET_SORTSHORT(I) NOOP - #endif - #endif - #endif - /** * Read all the files and produce a sort key * @@ -963,18 +710,22 @@ void CardReader::cdroot() { flush_presort(); // Sorting may be turned off - if (TERN0(SDSORT_GCODE, !sort_alpha)) return; + #if ENABLED(SDSORT_GCODE) + if (!sort_alpha) return; + #endif // If there are files, sort up to the limit - uint16_t fileCnt = countFilesInWorkDir(); + uint16_t fileCnt = getnrfilenames(); if (fileCnt > 0) { // Never sort more than the max allowed // If you use folders to organize, 20 may be enough - NOMORE(fileCnt, uint16_t(SDSORT_LIMIT)); + if (fileCnt > SDSORT_LIMIT) fileCnt = SDSORT_LIMIT; // Sort order is always needed. May be static or dynamic. - TERN_(SDSORT_DYNAMIC_RAM, sort_order = new uint8_t[fileCnt]); + #if ENABLED(SDSORT_DYNAMIC_RAM) + sort_order = new uint8_t[fileCnt]; + #endif // Use RAM to store the entire directory during pre-sort. // SDSORT_LIMIT should be set to prevent over-allocation. @@ -987,7 +738,7 @@ void CardReader::cdroot() { sortnames = new char*[fileCnt]; #endif #elif ENABLED(SDSORT_USES_STACK) - char sortnames[fileCnt][SORTED_LONGNAME_STORAGE]; + char sortnames[fileCnt][SORTED_LONGNAME_MAXLEN]; #endif // Folder sorting needs 1 bit per entry for flags. @@ -1004,7 +755,7 @@ void CardReader::cdroot() { // By default re-read the names from SD for every compare // retaining only two filenames at a time. This is very // slow but is safest and uses minimal RAM. - char name1[LONG_FILENAME_LENGTH]; + char name1[LONG_FILENAME_LENGTH + 1]; #endif @@ -1015,16 +766,34 @@ void CardReader::cdroot() { sort_order[i] = i; // If using RAM then read all filenames now. #if ENABLED(SDSORT_USES_RAM) - selectFileByIndex(i); - SET_SORTNAME(i); - SET_SORTSHORT(i); + getfilename(i); + #if ENABLED(SDSORT_DYNAMIC_RAM) + // Use dynamic method to copy long filename + sortnames[i] = strdup(longest_filename()); + #if ENABLED(SDSORT_CACHE_NAMES) + // When caching also store the short name, since + // we're replacing the getfilename() behavior. + sortshort[i] = strdup(filename); + #endif + #else + // Copy filenames into the static array + #if SORTED_LONGNAME_MAXLEN != LONG_FILENAME_LENGTH + strncpy(sortnames[i], longest_filename(), SORTED_LONGNAME_MAXLEN); + sortnames[i][SORTED_LONGNAME_MAXLEN - 1] = '\0'; + #else + strncpy(sortnames[i], longest_filename(), SORTED_LONGNAME_MAXLEN); + #endif + #if ENABLED(SDSORT_CACHE_NAMES) + strcpy(sortshort[i], filename); + #endif + #endif // char out[30]; - // sprintf_P(out, PSTR("---- %i %s %s"), i, flag.filenameIsDir ? "D" : " ", sortnames[i]); + // sprintf_P(out, PSTR("---- %i %s %s"), i, filenameIsDir ? "D" : " ", sortnames[i]); // SERIAL_ECHOLN(out); #if HAS_FOLDER_SORTING const uint16_t bit = i & 0x07, ind = i >> 3; if (bit == 0) isDir[ind] = 0x00; - if (flag.filenameIsDir) SBI(isDir[ind], bit); + if (filenameIsDir) isDir[ind] |= _BV(bit); #endif #endif } @@ -1032,15 +801,8 @@ void CardReader::cdroot() { // Bubble Sort for (uint16_t i = fileCnt; --i;) { bool didSwap = false; - uint8_t o1 = sort_order[0]; - #if DISABLED(SDSORT_USES_RAM) - selectFileByIndex(o1); // Pre-fetch the first entry and save it - strcpy(name1, longest_filename()); // so the loop only needs one fetch - TERN_(HAS_FOLDER_SORTING, bool dir1 = flag.filenameIsDir); - #endif - for (uint16_t j = 0; j < i; ++j) { - const uint16_t o2 = sort_order[j + 1]; + const uint16_t o1 = sort_order[j], o2 = sort_order[j + 1]; // Compare names from the array or just the two buffered names #if ENABLED(SDSORT_USES_RAM) @@ -1052,18 +814,27 @@ void CardReader::cdroot() { #if HAS_FOLDER_SORTING #if ENABLED(SDSORT_USES_RAM) // Folder sorting needs an index and bit to test for folder-ness. - #define _SORT_CMP_DIR(fs) (IS_DIR(o1) == IS_DIR(o2) ? _SORT_CMP_NODIR() : IS_DIR(fs > 0 ? o1 : o2)) + const uint8_t ind1 = o1 >> 3, bit1 = o1 & 0x07, + ind2 = o2 >> 3, bit2 = o2 & 0x07; + #define _SORT_CMP_DIR(fs) \ + (((isDir[ind1] & _BV(bit1)) != 0) == ((isDir[ind2] & _BV(bit2)) != 0) \ + ? _SORT_CMP_NODIR() \ + : (isDir[fs > 0 ? ind1 : ind2] & (fs > 0 ? _BV(bit1) : _BV(bit2))) != 0) #else - #define _SORT_CMP_DIR(fs) ((dir1 == flag.filenameIsDir) ? _SORT_CMP_NODIR() : (fs > 0 ? dir1 : !dir1)) + #define _SORT_CMP_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_NODIR() : (fs > 0 ? dir1 : !dir1)) #endif #endif // The most economical method reads names as-needed // throughout the loop. Slow if there are many. #if DISABLED(SDSORT_USES_RAM) - selectFileByIndex(o2); - const bool dir2 = flag.filenameIsDir; - char * const name2 = longest_filename(); // use the string in-place + getfilename(o1); + strcpy(name1, longest_filename()); // save (or getfilename below will trounce it) + #if HAS_FOLDER_SORTING + bool dir1 = filenameIsDir; + #endif + getfilename(o2); + char *name2 = longest_filename(); // use the string in-place #endif // !SDSORT_USES_RAM // Sort the current pair according to settings. @@ -1078,20 +849,10 @@ void CardReader::cdroot() { _SORT_CMP_NODIR() #endif ) { - // Reorder the index, indicate that sorting happened - // Note that the next o1 will be the current o1. No new fetch needed. sort_order[j] = o2; sort_order[j + 1] = o1; didSwap = true; } - else { - // The next o1 is the current o2. No new fetch needed. - o1 = o2; - #if DISABLED(SDSORT_USES_RAM) - TERN_(HAS_FOLDER_SORTING, dir1 = dir2); - strcpy(name1, name2); - #endif - } } if (!didSwap) break; } @@ -1099,22 +860,36 @@ void CardReader::cdroot() { #if ENABLED(SDSORT_USES_RAM) && DISABLED(SDSORT_CACHE_NAMES) #if ENABLED(SDSORT_DYNAMIC_RAM) for (uint16_t i = 0; i < fileCnt; ++i) free(sortnames[i]); - TERN_(HAS_FOLDER_SORTING, free(isDir)); + #if HAS_FOLDER_SORTING + free(isDir); + #endif #endif #endif } else { sort_order[0] = 0; - #if BOTH(SDSORT_USES_RAM, SDSORT_CACHE_NAMES) + #if ENABLED(SDSORT_USES_RAM) && ENABLED(SDSORT_CACHE_NAMES) + getfilename(0); #if ENABLED(SDSORT_DYNAMIC_RAM) sortnames = new char*[1]; - sortshort = new char*[1]; + sortnames[0] = strdup(longest_filename()); // malloc + #if ENABLED(SDSORT_CACHE_NAMES) + sortshort = new char*[1]; + sortshort[0] = strdup(filename); // malloc + #endif isDir = new uint8_t[1]; + #else + #if SORTED_LONGNAME_MAXLEN != LONG_FILENAME_LENGTH + strncpy(sortnames[0], longest_filename(), SORTED_LONGNAME_MAXLEN); + sortnames[0][SORTED_LONGNAME_MAXLEN - 1] = '\0'; + #else + strncpy(sortnames[0], longest_filename(), SORTED_LONGNAME_MAXLEN); + #endif + #if ENABLED(SDSORT_CACHE_NAMES) + strcpy(sortshort[0], filename); + #endif #endif - selectFileByIndex(0); - SET_SORTNAME(0); - SET_SORTSHORT(0); - isDir[0] = flag.filenameIsDir; + isDir[0] = filenameIsDir ? 0x01 : 0x00; #endif } @@ -1127,7 +902,7 @@ void CardReader::cdroot() { #if ENABLED(SDSORT_DYNAMIC_RAM) delete sort_order; #if ENABLED(SDSORT_CACHE_NAMES) - LOOP_L_N(i, sort_count) { + for (uint8_t i = 0; i < sort_count; ++i) { free(sortshort[i]); // strdup free(sortnames[i]); // strdup } @@ -1142,78 +917,113 @@ void CardReader::cdroot() { #endif // SDCARD_SORT_ALPHA uint16_t CardReader::get_num_Files() { - if (!isMounted()) return 0; - return ( - #if ALL(SDCARD_SORT_ALPHA, SDSORT_USES_RAM, SDSORT_CACHE_NAMES) + return + #if ENABLED(SDCARD_SORT_ALPHA) && SDSORT_USES_RAM && SDSORT_CACHE_NAMES nrFiles // no need to access the SD card for filenames #else - countFilesInWorkDir() + getnrfilenames() #endif - ); + ; } -// -// Return from procedure or close out the Print Job -// -void CardReader::fileHasFinished() { +void CardReader::printingHasFinished() { planner.synchronize(); file.close(); - if (file_subcall_ctr > 0) { // Resume calling file after closing procedure + if (file_subcall_ctr > 0) { // Heading up to a parent file that called current as a procedure. file_subcall_ctr--; - openFileRead(proc_filenames[file_subcall_ctr], 2); // 2 = Returning from sub-procedure + openFile(proc_filenames[file_subcall_ctr], true, true); setIndex(filespos[file_subcall_ctr]); startFileprint(); } else { - endFilePrint(TERN_(SD_RESORT, true)); + sdprinting = false; - marlin_state = MF_SD_COMPLETE; + #if ENABLED(POWER_LOSS_RECOVERY) + removeJobRecoveryFile(); + #endif + + #if ENABLED(SD_FINISHED_STEPPERRELEASE) && defined(SD_FINISHED_RELEASECOMMAND) + planner.finish_and_disable(); + #endif + print_job_timer.stop(); + if (print_job_timer.duration() > 60) + enqueue_and_echo_commands_P(PSTR("M31")); + #if ENABLED(SDCARD_SORT_ALPHA) + presort(); + #endif + #if ENABLED(ULTRA_LCD) && ENABLED(LCD_SET_PROGRESS_MANUALLY) + progress_bar_percent = 0; + #endif + #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) + lcd_reselect_last_file(); + #endif } } #if ENABLED(AUTO_REPORT_SD_STATUS) uint8_t CardReader::auto_report_sd_interval = 0; millis_t CardReader::next_sd_report_ms; - #if HAS_MULTI_SERIAL - int8_t CardReader::auto_report_port; + #if NUM_SERIAL > 1 + int8_t CardReader::serialport; #endif void CardReader::auto_report_sd_status() { millis_t current_ms = millis(); if (auto_report_sd_interval && ELAPSED(current_ms, next_sd_report_ms)) { next_sd_report_ms = current_ms + 1000UL * auto_report_sd_interval; - PORT_REDIRECT(auto_report_port); - report_status(); + getStatus( + #if NUM_SERIAL > 1 + serialport + #endif + ); } } #endif // AUTO_REPORT_SD_STATUS #if ENABLED(POWER_LOSS_RECOVERY) + char job_recovery_file_name[4] = "bin"; + + void CardReader::openJobRecoveryFile(const bool read) { + if (!cardOK) return; + if (jobRecoveryFile.isOpen()) return; + if (!jobRecoveryFile.open(&root, job_recovery_file_name, read ? O_READ : O_CREAT | O_WRITE | O_TRUNC | O_SYNC)) { + SERIAL_PROTOCOLPAIR(MSG_SD_OPEN_FILE_FAIL, job_recovery_file_name); + SERIAL_PROTOCOLCHAR('.'); + SERIAL_EOL(); + } + else if (!read) + SERIAL_PROTOCOLLNPAIR(MSG_SD_WRITE_TO_FILE, job_recovery_file_name); + } + + void CardReader::closeJobRecoveryFile() { jobRecoveryFile.close(); } + bool CardReader::jobRecoverFileExists() { - const bool exists = recovery.file.open(&root, recovery.filename, O_READ); - if (exists) recovery.file.close(); + const bool exists = jobRecoveryFile.open(&root, job_recovery_file_name, O_READ); + if (exists) jobRecoveryFile.close(); return exists; } - void CardReader::openJobRecoveryFile(const bool read) { - if (!isMounted()) return; - if (recovery.file.isOpen()) return; - if (!recovery.file.open(&root, recovery.filename, read ? O_READ : O_CREAT | O_WRITE | O_TRUNC | O_SYNC)) - SERIAL_ECHOLNPAIR(STR_SD_OPEN_FILE_FAIL, recovery.filename, "."); - else if (!read) - echo_write_to_file(recovery.filename); + int16_t CardReader::saveJobRecoveryInfo() { + jobRecoveryFile.seekSet(0); + const int16_t ret = jobRecoveryFile.write(&job_recovery_info, sizeof(job_recovery_info)); + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + if (ret == -1) SERIAL_PROTOCOLLNPGM("Power-loss file write failed."); + #endif + return ret; + } + + int16_t CardReader::loadJobRecoveryInfo() { + return jobRecoveryFile.read(&job_recovery_info, sizeof(job_recovery_info)); } - // Removing the job recovery file currently requires closing - // the file being printed, so during SD printing the file should - // be zeroed and written instead of deleted. void CardReader::removeJobRecoveryFile() { + job_recovery_info.valid_head = job_recovery_info.valid_foot = job_recovery_commands_count = 0; if (jobRecoverFileExists()) { - recovery.init(); - removeFile(recovery.filename); + closefile(); + removeFile(job_recovery_file_name); #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - SERIAL_ECHOPGM("Power-loss file delete"); + SERIAL_PROTOCOLPGM("Power-loss file delete"); serialprintPGM(jobRecoverFileExists() ? PSTR(" failed.\n") : PSTR("d.\n")); #endif } diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 33645b6531..8e29bd9a6f 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -1,9 +1,9 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,198 +16,164 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ -#pragma once + +#ifndef _CARDREADER_H_ +#define _CARDREADER_H_ #include "../inc/MarlinConfig.h" -#define IFSD(A,B) TERN(SDSUPPORT,A,B) - #if ENABLED(SDSUPPORT) -#if BOTH(SDCARD_SORT_ALPHA, SDSORT_DYNAMIC_RAM) - #define SD_RESORT 1 -#endif +#define SD_RESORT ENABLED(SDCARD_SORT_ALPHA) && ENABLED(SDSORT_DYNAMIC_RAM) -#if ENABLED(SDCARD_RATHERRECENTFIRST) && DISABLED(SDCARD_SORT_ALPHA) - #define SD_ORDER(N,C) ((C) - 1 - (N)) -#else - #define SD_ORDER(N,C) N -#endif - -#define MAX_DIR_DEPTH 10 // Maximum folder depth -#define MAXDIRNAMELENGTH 8 // DOS folder name size -#define MAXPATHNAMELENGTH (1 + (MAXDIRNAMELENGTH + 1) * (MAX_DIR_DEPTH) + 1 + FILENAME_LENGTH) // "/" + N * ("ADIRNAME/") + "filename.ext" +#define MAX_DIR_DEPTH 10 // Maximum folder depth #include "SdFile.h" -typedef struct { - bool saving:1, - logging:1, - sdprinting:1, - mounted:1, - filenameIsDir:1, - workDirIsRoot:1, - abort_sd_printing:1 - #if ENABLED(BINARY_FILE_TRANSFER) - , binary_mode:1 - #endif - ; -} card_flags_t; - class CardReader { public: - static card_flags_t flag; // Flags (above) - static char filename[FILENAME_LENGTH], // DOS 8.3 filename of the selected item - longFilename[LONG_FILENAME_LENGTH]; // Long name of the selected item - - // Fast! binary file transfer - #if ENABLED(BINARY_FILE_TRANSFER) - #if HAS_MULTI_SERIAL - static int8_t transfer_port_index; - #else - static constexpr int8_t transfer_port_index = 0; - #endif - #endif - - // // // Methods // // // - CardReader(); - static SdFile getroot() { return root; } + void initsd(); + void write_command(char *buf); - static void mount(); - static void release(); - static inline bool isMounted() { return flag.mounted; } - static void ls(); + void beginautostart(); + void checkautostart(); - // Handle media insert/remove - static void manage_media(); + void openFile(char * const path, const bool read, const bool subcall=false); + void openLogFile(char * const path); + void removeFile(const char * const name); + void closefile(const bool store_location=false); + void release(); + void openAndPrintFile(const char *name); + void startFileprint(); + void stopSDPrint( + #if SD_RESORT + const bool re_sort=false + #endif + ); + void getStatus( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); + void printingHasFinished(); + void printFilename( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); - // SD Card Logging - static void openLogFile(char * const path); - static void write_command(char * const buf); - - // Auto-Start files - static int8_t autostart_index; // Index of autoX.g files - static void beginautostart(); - static void checkautostart(); - - // Basic file ops - static void openFileRead(char * const path, const uint8_t subcall=0); - static void openFileWrite(char * const path); - static void closefile(const bool store_location=false); - static bool fileExists(const char * const name); - static void removeFile(const char * const name); - - static inline char* longest_filename() { return longFilename[0] ? longFilename : filename; } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - static void printLongPath(char * const path); // Used by M33 + void printLongPath(char *path + #if NUM_SERIAL > 1 + , const int8_t port = -1 + #endif + ); #endif - // Working Directory for SD card menu - static void cdroot(); - static void cd(const char *relpath); - static int8_t cdup(); - static uint16_t countFilesInWorkDir(); - static uint16_t get_num_Files(); + void getfilename(uint16_t nr, const char* const match=NULL); + uint16_t getnrfilenames(); - // Select a file - static void selectFileByIndex(const uint16_t nr); - static void selectFileByName(const char* const match); + void getAbsFilename(char *t); - // Print job - static void openAndPrintFile(const char *name); // (working directory) - static void fileHasFinished(); - static void getAbsFilename(char *dst); - static void printFilename(); - static void startFileprint(); - static void endFilePrint(TERN_(SD_RESORT, const bool re_sort=false)); - static void report_status(); - static inline void pauseSDPrint() { flag.sdprinting = false; } - static inline bool isPaused() { return isFileOpen() && !flag.sdprinting; } - static inline bool isPrinting() { return flag.sdprinting; } - #if HAS_PRINT_PROGRESS_PERMYRIAD - static inline uint16_t permyriadDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 9999) / 10000) : 0; } - #endif - static inline uint8_t percentDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 99) / 100) : 0; } + void ls( + #if NUM_SERIAL > 1 + const int8_t port = -1 + #endif + ); + void chdir(const char *relpath); + int8_t updir(); + void setroot(); - // Helper for open and remove - static const char* diveToFile(const bool update_cwd, SdFile*& curDir, const char * const path, const bool echo=false); + const char* diveToFile(SdFile*& curDir, const char * const path, const bool echo); + + uint16_t get_num_Files(); #if ENABLED(SDCARD_SORT_ALPHA) - static void presort(); - static void getfilename_sorted(const uint16_t nr); + void presort(); + void getfilename_sorted(const uint16_t nr); #if ENABLED(SDSORT_GCODE) - FORCE_INLINE static void setSortOn(bool b) { sort_alpha = b; presort(); } - FORCE_INLINE static void setSortFolders(int i) { sort_folders = i; presort(); } - //FORCE_INLINE static void setSortReverse(bool b) { sort_reverse = b; } + FORCE_INLINE void setSortOn(bool b) { sort_alpha = b; presort(); } + FORCE_INLINE void setSortFolders(int i) { sort_folders = i; presort(); } + //FORCE_INLINE void setSortReverse(bool b) { sort_reverse = b; } #endif - #else - FORCE_INLINE static void getfilename_sorted(const uint16_t nr) { selectFileByIndex(nr); } #endif #if ENABLED(POWER_LOSS_RECOVERY) - static bool jobRecoverFileExists(); - static void openJobRecoveryFile(const bool read); - static void removeJobRecoveryFile(); + void openJobRecoveryFile(const bool read); + void closeJobRecoveryFile(); + bool jobRecoverFileExists(); + int16_t saveJobRecoveryInfo(); + int16_t loadJobRecoveryInfo(); + void removeJobRecoveryFile(); #endif - static inline bool isFileOpen() { return isMounted() && file.isOpen(); } - static inline uint32_t getIndex() { return sdpos; } - static inline uint32_t getFileSize() { return filesize; } - static inline bool eof() { return sdpos >= filesize; } - static inline void setIndex(const uint32_t index) { sdpos = index; file.seekSet(index); } - static inline char* getWorkDirName() { workDir.getDosName(filename); return filename; } - static inline int16_t get() { sdpos = file.curPosition(); return (int16_t)file.read(); } - static inline int16_t read(void* buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; } - static inline int16_t write(void* buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; } + FORCE_INLINE void pauseSDPrint() { sdprinting = false; } + FORCE_INLINE bool isFileOpen() { return file.isOpen(); } + FORCE_INLINE bool eof() { return sdpos >= filesize; } + FORCE_INLINE int16_t get() { sdpos = file.curPosition(); return (int16_t)file.read(); } + FORCE_INLINE void setIndex(const uint32_t index) { sdpos = index; file.seekSet(index); } + FORCE_INLINE uint32_t getIndex() { return sdpos; } + FORCE_INLINE uint8_t percentDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 99) / 100) : 0; } + FORCE_INLINE char* getWorkDirName() { workDir.getFilename(filename); return filename; } - static Sd2Card& getSd2Card() { return sd2card; } + #if defined(__STM32F1__) && ENABLED(EEPROM_SETTINGS) && DISABLED(FLASH_EEPROM_EMULATION) + FORCE_INLINE int16_t read(void* buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; } + FORCE_INLINE int16_t write(void* buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; } + #endif + + Sd2Card& getSd2Card() { return sd2card; } #if ENABLED(AUTO_REPORT_SD_STATUS) - static void auto_report_sd_status(); - static inline void set_auto_report_interval(uint8_t v) { - TERN_(HAS_MULTI_SERIAL, auto_report_port = serial_port_index); + void auto_report_sd_status(void); + FORCE_INLINE void set_auto_report_interval(uint8_t v + #if NUM_SERIAL > 1 + , int8_t port + #endif + ) { + #if NUM_SERIAL > 1 + serialport = port; + #endif NOMORE(v, 60); auto_report_sd_interval = v; next_sd_report_ms = millis() + 1000UL * v; } #endif -private: - // - // Working directory and parents - // - static SdFile root, workDir, workDirParents[MAX_DIR_DEPTH]; - static uint8_t workDirDepth; + FORCE_INLINE char* longest_filename() { return longFilename[0] ? longFilename : filename; } - // - // Alphabetical file and folder sorting - // +public: + bool saving, logging, sdprinting, cardOK, filenameIsDir; + char filename[FILENAME_LENGTH], longFilename[LONG_FILENAME_LENGTH]; + int8_t autostart_index; +private: + SdFile root, workDir, workDirParents[MAX_DIR_DEPTH]; + uint8_t workDirDepth; + + // Sort files and folders alphabetically. #if ENABLED(SDCARD_SORT_ALPHA) - static uint16_t sort_count; // Count of sorted items in the current directory + uint16_t sort_count; // Count of sorted items in the current directory #if ENABLED(SDSORT_GCODE) - static bool sort_alpha; // Flag to enable / disable the feature - static int sort_folders; // Folder sorting before/none/after - //static bool sort_reverse; // Flag to enable / disable reverse sorting + bool sort_alpha; // Flag to enable / disable the feature + int sort_folders; // Flag to enable / disable folder sorting + //bool sort_reverse; // Flag to enable / disable reverse sorting #endif // By default the sort index is static #if ENABLED(SDSORT_DYNAMIC_RAM) - static uint8_t *sort_order; + uint8_t *sort_order; #else - static uint8_t sort_order[SDSORT_LIMIT]; + uint8_t sort_order[SDSORT_LIMIT]; #endif - #if BOTH(SDSORT_USES_RAM, SDSORT_CACHE_NAMES) && DISABLED(SDSORT_DYNAMIC_RAM) - #define SORTED_LONGNAME_MAXLEN (SDSORT_CACHE_VFATS) * (FILENAME_LENGTH) - #define SORTED_LONGNAME_STORAGE (SORTED_LONGNAME_MAXLEN + 1) + #if ENABLED(SDSORT_USES_RAM) && ENABLED(SDSORT_CACHE_NAMES) && DISABLED(SDSORT_DYNAMIC_RAM) + #define SORTED_LONGNAME_MAXLEN ((SDSORT_CACHE_VFATS) * (FILENAME_LENGTH) + 1) #else #define SORTED_LONGNAME_MAXLEN LONG_FILENAME_LENGTH - #define SORTED_LONGNAME_STORAGE SORTED_LONGNAME_MAXLEN #endif // Cache filenames to speed up SD menus. @@ -215,24 +181,22 @@ private: // If using dynamic ram for names, allocate on the heap. #if ENABLED(SDSORT_CACHE_NAMES) - static uint16_t nrFiles; // Cache the total count #if ENABLED(SDSORT_DYNAMIC_RAM) - static char **sortshort, **sortnames; + char **sortshort, **sortnames; #else - static char sortshort[SDSORT_LIMIT][FILENAME_LENGTH]; + char sortshort[SDSORT_LIMIT][FILENAME_LENGTH]; + char sortnames[SDSORT_LIMIT][SORTED_LONGNAME_MAXLEN]; #endif - #endif - - #if (ENABLED(SDSORT_CACHE_NAMES) && DISABLED(SDSORT_DYNAMIC_RAM)) || NONE(SDSORT_CACHE_NAMES, SDSORT_USES_STACK) - static char sortnames[SDSORT_LIMIT][SORTED_LONGNAME_STORAGE]; + #elif DISABLED(SDSORT_USES_STACK) + char sortnames[SDSORT_LIMIT][SORTED_LONGNAME_MAXLEN]; #endif // Folder sorting uses an isDir array when caching items. #if HAS_FOLDER_SORTING #if ENABLED(SDSORT_DYNAMIC_RAM) - static uint8_t *isDir; + uint8_t *isDir; #elif ENABLED(SDSORT_CACHE_NAMES) || DISABLED(SDSORT_USES_STACK) - static uint8_t isDir[(SDSORT_LIMIT+7)>>3]; + uint8_t isDir[(SDSORT_LIMIT+7)>>3]; #endif #endif @@ -240,68 +204,64 @@ private: #endif // SDCARD_SORT_ALPHA - static Sd2Card sd2card; - static SdVolume volume; - static SdFile file; + Sd2Card sd2card; + SdVolume volume; + SdFile file; - static uint32_t filesize, sdpos; - - // - // Procedure calls to other files - // - #ifndef SD_PROCEDURE_DEPTH - #define SD_PROCEDURE_DEPTH 1 + #if ENABLED(POWER_LOSS_RECOVERY) + SdFile jobRecoveryFile; + #endif + + #define SD_PROCEDURE_DEPTH 1 + #define MAXPATHNAMELENGTH (FILENAME_LENGTH*MAX_DIR_DEPTH + MAX_DIR_DEPTH + 1) + uint8_t file_subcall_ctr; + uint32_t filespos[SD_PROCEDURE_DEPTH]; + char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; + uint32_t filesize, sdpos; + + LsAction lsAction; //stored for recursion. + uint16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory. + char* diveDirName; + void lsDive(const char *prepend, SdFile parent, const char * const match=NULL + #if NUM_SERIAL > 1 + , const int8_t port = -1 + #endif + ); + + #if ENABLED(SDCARD_SORT_ALPHA) + void flush_presort(); #endif - static uint8_t file_subcall_ctr; - static uint32_t filespos[SD_PROCEDURE_DEPTH]; - static char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; - // - // SD Auto Reporting - // #if ENABLED(AUTO_REPORT_SD_STATUS) static uint8_t auto_report_sd_interval; static millis_t next_sd_report_ms; - #if HAS_MULTI_SERIAL - static int8_t auto_report_port; + #if NUM_SERIAL > 1 + static int8_t serialport; #endif #endif - - // - // Directory items - // - static bool is_dir_or_gcode(const dir_t &p); - static int countItems(SdFile dir); - static void selectByIndex(SdFile dir, const uint8_t index); - static void selectByName(SdFile dir, const char * const match); - static void printListing(SdFile parent, const char * const prepend=nullptr); - - #if ENABLED(SDCARD_SORT_ALPHA) - static void flush_presort(); - #endif }; -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) - #define IS_SD_INSERTED() Sd2Card::isInserted() -#elif PIN_EXISTS(SD_DETECT) - #define IS_SD_INSERTED() (READ(SD_DETECT_PIN) == SD_DETECT_STATE) +#if PIN_EXISTS(SD_DETECT) + #if ENABLED(SD_DETECT_INVERTED) + #define IS_SD_INSERTED (READ(SD_DETECT_PIN) == HIGH) + #else + #define IS_SD_INSERTED (READ(SD_DETECT_PIN) == LOW) + #endif #else // No card detect line? Assume the card is inserted. - #define IS_SD_INSERTED() true + #define IS_SD_INSERTED true #endif -#define IS_SD_PRINTING() card.flag.sdprinting -#define IS_SD_PAUSED() card.isPaused() -#define IS_SD_FILE_OPEN() card.isFileOpen() - extern CardReader card; -#else // !SDSUPPORT +#endif // SDSUPPORT -#define IS_SD_PRINTING() false -#define IS_SD_PAUSED() false -#define IS_SD_FILE_OPEN() false +#if ENABLED(SDSUPPORT) + #define IS_SD_PRINTING (card.sdprinting) + #define IS_SD_FILE_OPEN (card.isFileOpen()) +#else + #define IS_SD_PRINTING (false) + #define IS_SD_FILE_OPEN (false) +#endif -#define LONG_FILENAME_LENGTH 0 - -#endif // !SDSUPPORT +#endif // _CARDREADER_H_ diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp deleted file mode 100644 index a097df5105..0000000000 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "../../inc/MarlinConfigPre.h" - -/** - * Adjust USB_DEBUG to select debugging verbosity. - * 0 - no debug messages - * 1 - basic insertion/removal messages - * 2 - show USB state transitions - * 3 - perform block range checking - * 4 - print each block access - */ -#define USB_DEBUG 1 -#define USB_STARTUP_DELAY 0 - -// uncomment to get 'printf' console debugging. NOT FOR UNO! -//#define HOST_DEBUG(...) {char s[255]; sprintf(s,__VA_ARGS__); SERIAL_ECHOLNPAIR("UHS:",s);} -//#define BS_HOST_DEBUG(...) {char s[255]; sprintf(s,__VA_ARGS__); SERIAL_ECHOLNPAIR("UHS:",s);} -//#define MAX_HOST_DEBUG(...) {char s[255]; sprintf(s,__VA_ARGS__); SERIAL_ECHOLNPAIR("UHS:",s);} - -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) - -#include "../../MarlinCore.h" -#include "../../core/serial.h" -#include "../../module/temperature.h" - -static_assert(USB_CS_PIN != -1, "USB_CS_PIN must be defined"); -static_assert(USB_INTR_PIN != -1, "USB_INTR_PIN must be defined"); - -#if ENABLED(USE_UHS3_USB) - #define NO_AUTO_SPEED - #define UHS_MAX3421E_SPD 8000000 >> SPI_SPEED - #define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 1 - #define UHS_HOST_MAX_INTERFACE_DRIVERS 2 - #define MASS_MAX_SUPPORTED_LUN 1 - #define USB_HOST_SERIAL MYSERIAL0 - - // Workaround for certain issues with UHS3 - #define SKIP_PAGE3F // Required for IOGEAR media adapter - #define USB_NO_TEST_UNIT_READY // Required for removable media adapter - #define USB_HOST_MANUAL_POLL // Optimization to shut off IRQ automatically - - // Workarounds for keeping Marlin's watchdog timer from barking... - void marlin_yield() { - thermalManager.manage_heater(); - } - #define SYSTEM_OR_SPECIAL_YIELD(...) marlin_yield(); - #define delay(x) safe_delay(x) - - #define LOAD_USB_HOST_SYSTEM - #define LOAD_USB_HOST_SHIELD - #define LOAD_UHS_BULK_STORAGE - - #define MARLIN_UHS_WRITE_SS(v) WRITE(USB_CS_PIN, v) - #define MARLIN_UHS_READ_IRQ() READ(USB_INTR_PIN) - - #include "lib-uhs3/UHS_host/UHS_host.h" - - MAX3421E_HOST usb(USB_CS_PIN, USB_INTR_PIN); - UHS_Bulk_Storage bulk(&usb); - - #define UHS_START (usb.Init() == 0) - #define UHS_STATE(state) UHS_USB_HOST_STATE_##state -#else - #include "lib-uhs2/Usb.h" - #include "lib-uhs2/masstorage.h" - - USB usb; - BulkOnly bulk(&usb); - - #define UHS_START usb.start() - #define UHS_STATE(state) USB_STATE_##state -#endif - -#include "Sd2Card_FlashDrive.h" - -#include "../../lcd/ultralcd.h" - -static enum { - UNINITIALIZED, - DO_STARTUP, - WAIT_FOR_DEVICE, - WAIT_FOR_LUN, - MEDIA_READY, - MEDIA_ERROR -} state; - -#if USB_DEBUG >= 3 - uint32_t lun0_capacity; -#endif - -bool Sd2Card::usbStartup() { - if (state <= DO_STARTUP) { - SERIAL_ECHOPGM("Starting USB host..."); - if (!UHS_START) { - SERIAL_ECHOLNPGM(" failed."); - LCD_MESSAGEPGM(MSG_MEDIA_USB_FAILED); - return false; - } - - // SPI quick test - check revision register - switch (usb.regRd(rREVISION)) { - case 0x01: SERIAL_ECHOLNPGM("rev.01 started"); break; - case 0x12: SERIAL_ECHOLNPGM("rev.02 started"); break; - case 0x13: SERIAL_ECHOLNPGM("rev.03 started"); break; - default: SERIAL_ECHOLNPGM("started. rev unknown."); break; - } - state = WAIT_FOR_DEVICE; - } - return true; -} - -// The USB library needs to be called periodically to detect USB thumbdrive -// insertion and removals. Call this idle() function periodically to allow -// the USB library to monitor for such events. This function also takes care -// of initializing the USB library for the first time. - -void Sd2Card::idle() { - usb.Task(); - - const uint8_t task_state = usb.getUsbTaskState(); - - #if USB_DEBUG >= 2 - if (state > DO_STARTUP) { - static uint8_t laststate = 232; - if (task_state != laststate) { - laststate = task_state; - #define UHS_USB_DEBUG(x) case UHS_STATE(x): SERIAL_ECHOLNPGM(#x); break - switch (task_state) { - UHS_USB_DEBUG(IDLE); - UHS_USB_DEBUG(RESET_DEVICE); - UHS_USB_DEBUG(RESET_NOT_COMPLETE); - UHS_USB_DEBUG(DEBOUNCE); - UHS_USB_DEBUG(DEBOUNCE_NOT_COMPLETE); - UHS_USB_DEBUG(WAIT_SOF); - UHS_USB_DEBUG(ERROR); - UHS_USB_DEBUG(CONFIGURING); - UHS_USB_DEBUG(CONFIGURING_DONE); - UHS_USB_DEBUG(RUNNING); - default: - SERIAL_ECHOLNPAIR("UHS_USB_HOST_STATE: ", task_state); - break; - } - } - } - #endif - - static millis_t next_state_ms = millis(); - - #define GOTO_STATE_AFTER_DELAY(STATE, DELAY) do{ state = STATE; next_state_ms = millis() + DELAY; }while(0) - - if (ELAPSED(millis(), next_state_ms)) { - GOTO_STATE_AFTER_DELAY(state, 250); // Default delay - - switch (state) { - - case UNINITIALIZED: - #ifndef MANUAL_USB_STARTUP - GOTO_STATE_AFTER_DELAY( DO_STARTUP, USB_STARTUP_DELAY ); - #endif - break; - - case DO_STARTUP: usbStartup(); break; - - case WAIT_FOR_DEVICE: - if (task_state == UHS_STATE(RUNNING)) { - #if USB_DEBUG >= 1 - SERIAL_ECHOLNPGM("USB device inserted"); - #endif - GOTO_STATE_AFTER_DELAY( WAIT_FOR_LUN, 250 ); - } - break; - - case WAIT_FOR_LUN: - /* USB device is inserted, but if it is an SD card, - * adapter it may not have an SD card in it yet. */ - if (bulk.LUNIsGood(0)) { - #if USB_DEBUG >= 1 - SERIAL_ECHOLNPGM("LUN is good"); - #endif - GOTO_STATE_AFTER_DELAY( MEDIA_READY, 100 ); - } - else { - #ifdef USB_HOST_MANUAL_POLL - // Make sure we catch disconnect events - usb.busprobe(); - usb.VBUS_changed(); - #endif - #if USB_DEBUG >= 1 - SERIAL_ECHOLNPGM("Waiting for media"); - #endif - LCD_MESSAGEPGM(MSG_MEDIA_WAITING); - GOTO_STATE_AFTER_DELAY(state, 2000); - } - break; - - case MEDIA_READY: break; - case MEDIA_ERROR: break; - } - - if (state > WAIT_FOR_DEVICE && task_state != UHS_STATE(RUNNING)) { - // Handle device removal events - #if USB_DEBUG >= 1 - SERIAL_ECHOLNPGM("USB device removed"); - #endif - if (state != MEDIA_READY) - LCD_MESSAGEPGM(MSG_MEDIA_USB_REMOVED); - GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0); - } - - else if (state > WAIT_FOR_LUN && !bulk.LUNIsGood(0)) { - // Handle media removal events - #if USB_DEBUG >= 1 - SERIAL_ECHOLNPGM("Media removed"); - #endif - LCD_MESSAGEPGM(MSG_MEDIA_REMOVED); - GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0); - } - - else if (task_state == UHS_STATE(ERROR)) { - LCD_MESSAGEPGM(MSG_MEDIA_READ_ERROR); - GOTO_STATE_AFTER_DELAY(MEDIA_ERROR, 0); - } - } -} - -// Marlin calls this function to check whether an USB drive is inserted. -// This is equivalent to polling the SD_DETECT when using SD cards. -bool Sd2Card::isInserted() { - return state == MEDIA_READY; -} - -bool Sd2Card::ready() { - return state > DO_STARTUP; -} - -// Marlin calls this to initialize an SD card once it is inserted. -bool Sd2Card::init(const uint8_t, const pin_t) { - if (!isInserted()) return false; - - #if USB_DEBUG >= 1 - const uint32_t sectorSize = bulk.GetSectorSize(0); - if (sectorSize != 512) { - SERIAL_ECHOLNPAIR("Expecting sector size of 512. Got: ", sectorSize); - return false; - } - #endif - - #if USB_DEBUG >= 3 - lun0_capacity = bulk.GetCapacity(0); - SERIAL_ECHOLNPAIR("LUN Capacity (in blocks): ", lun0_capacity); - #endif - return true; -} - -// Returns the capacity of the card in blocks. -uint32_t Sd2Card::cardSize() { - if (!isInserted()) return false; - #if USB_DEBUG < 3 - const uint32_t - #endif - lun0_capacity = bulk.GetCapacity(0); - return lun0_capacity; -} - -bool Sd2Card::readBlock(uint32_t block, uint8_t* dst) { - if (!isInserted()) return false; - #if USB_DEBUG >= 3 - if (block >= lun0_capacity) { - SERIAL_ECHOLNPAIR("Attempt to read past end of LUN: ", block); - return false; - } - #if USB_DEBUG >= 4 - SERIAL_ECHOLNPAIR("Read block ", block); - #endif - #endif - return bulk.Read(0, block, 512, 1, dst) == 0; -} - -bool Sd2Card::writeBlock(uint32_t block, const uint8_t* src) { - if (!isInserted()) return false; - #if USB_DEBUG >= 3 - if (block >= lun0_capacity) { - SERIAL_ECHOLNPAIR("Attempt to write past end of LUN: ", block); - return false; - } - #if USB_DEBUG >= 4 - SERIAL_ECHOLNPAIR("Write block ", block); - #endif - #endif - return bulk.Write(0, block, 512, 1, src) == 0; -} - -#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h deleted file mode 100644 index 8ca95ba706..0000000000 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#pragma once - -/** - * \file - * \brief Sd2Card class for V2 SD/SDHC cards - */ - -#include "../SdFatConfig.h" -#include "../SdInfo.h" - -/** - * Define SOFTWARE_SPI to use bit-bang SPI - */ -#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) - #define SOFTWARE_SPI -#endif - -// SPI pin definitions - do not edit here - change in SdFatConfig.h -#if ENABLED(SOFTWARE_SPI) - #warning "Auto-assigning '10' as the SD_CHIP_SELECT_PIN." - #define SD_CHIP_SELECT_PIN 10 // Software SPI chip select pin for the SD -#else - // hardware pin defs - #define SD_CHIP_SELECT_PIN SS_PIN // The default chip select pin for the SD card is SS. -#endif - -class Sd2Card { - private: - uint32_t pos; - - static void usbStateDebug(); - - public: - static bool usbStartup(); - - bool init(const uint8_t sckRateID=0, const pin_t chipSelectPin=SD_CHIP_SELECT_PIN); - - static void idle(); - - inline bool readStart(const uint32_t block) { pos = block; return ready(); } - inline bool readData(uint8_t* dst) { return readBlock(pos++, dst); } - inline bool readStop() const { return true; } - - inline bool writeStart(const uint32_t block, const uint32_t) { pos = block; return ready(); } - inline bool writeData(uint8_t* src) { return writeBlock(pos++, src); } - inline bool writeStop() const { return true; } - - bool readBlock(uint32_t block, uint8_t* dst); - bool writeBlock(uint32_t blockNumber, const uint8_t* src); - - uint32_t cardSize(); - static bool isInserted(); - static bool ready(); -}; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/README.txt b/Marlin/src/sd/usb_flashdrive/lib-uhs2/README.txt deleted file mode 100644 index 5abcc8f2ad..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/README.txt +++ /dev/null @@ -1,46 +0,0 @@ - -==== USB HOST SHIELD 2.0 LIBRARY ==== - -The lib/ folder contains a subset of the files from the USB Host Shield 2.0 -library: - - https://github.com/felis/USB_Host_Shield_2.0 - -While the original library was released under the GPLv2 and could not be -commingled with Marlin, the developers have graciously re-licenced the -files needed for Marlin as "GPLv2 or later", as documented in this thread. - - https://github.com/felis/USB_Host_Shield_2.0/issues/364 - -Small modifications have been made to the source. Please search for -USB_FLASH_DRIVE_SUPPORT or look at the patch file to see what was changed. - -==== LICENSE SUMMARY ==== - -Source Path: Repository: License: ------------- ----------- -------- -lib-uhs3/ github.com/felis/USB_Host_Shield_2.0 GPLv2 or later -lib-uhs3/lib/masstorage.cpp github.com/greiman/UsbFat [1] MIT -lib-uhs3/lib/settings.h github.com/greiman/UsbFat [1] MIT - -[1] Changes related to SKIP_WRITE_PROTECT and DELAY only - -==== PERFORMANCE ENHANCEMENTS FOR USB DRIVES ==== - -There are also some small performance enhancements from Bill Greiman, regarding -SKIP_WRITE_PROTECT and DELAY. These changes came from the following repo: - - https://github.com/greiman/UsbFat - -While the original library was released under the GPLv2 and could not be -commingled with Marlin, the developer has graciously re-licenced his changes -under the "MIT" license, as documented here: - - https://github.com/greiman/UsbFat/issues/8 - -==== MARLIN INTEGRATION WORK ==== - -All additional work done to integrate USB into Marlin was performed by AlephObjects, Inc. -and is licensed under the GPLv3. - --- marcio@alephobjects.com diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp deleted file mode 100644 index 8a989157b4..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp +++ /dev/null @@ -1,797 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -/* USB functions */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) - -#include "Usb.h" - -static uint8_t usb_error = 0; -static uint8_t usb_task_state; - -/* constructor */ -USB::USB() : bmHubPre(0) { - usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; //set up state machine - init(); -} - -/* Initialize data structures */ -void USB::init() { - //devConfigIndex = 0; - bmHubPre = 0; -} - -uint8_t USB::getUsbTaskState() { - return usb_task_state; -} - -void USB::setUsbTaskState(uint8_t state) { - usb_task_state = state; -} - -EpInfo* USB::getEpInfoEntry(uint8_t addr, uint8_t ep) { - UsbDevice *p = addrPool.GetUsbDevicePtr(addr); - - if (!p || !p->epinfo) - return nullptr; - - EpInfo *pep = p->epinfo; - - for (uint8_t i = 0; i < p->epcount; i++) { - if ((pep)->epAddr == ep) - return pep; - - pep++; - } - return nullptr; -} - -/* set device table entry */ - -/* each device is different and has different number of endpoints. This function plugs endpoint record structure, defined in application, to devtable */ -uint8_t USB::setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr) { - if (!eprecord_ptr) - return USB_ERROR_INVALID_ARGUMENT; - - UsbDevice *p = addrPool.GetUsbDevicePtr(addr); - - if (!p) - return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - p->address.devAddress = addr; - p->epinfo = eprecord_ptr; - p->epcount = epcount; - - return 0; -} - -uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit) { - UsbDevice *p = addrPool.GetUsbDevicePtr(addr); - - if (!p) - return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - if (!p->epinfo) - return USB_ERROR_EPINFO_IS_NULL; - - *ppep = getEpInfoEntry(addr, ep); - - if (!*ppep) - return USB_ERROR_EP_NOT_FOUND_IN_TBL; - - *nak_limit = (0x0001UL << (((*ppep)->bmNakPower > USB_NAK_MAX_POWER) ? USB_NAK_MAX_POWER : (*ppep)->bmNakPower)); - (*nak_limit)--; - /* - USBTRACE2("\r\nAddress: ", addr); - USBTRACE2(" EP: ", ep); - USBTRACE2(" NAK Power: ",(*ppep)->bmNakPower); - USBTRACE2(" NAK Limit: ", nak_limit); - USBTRACE("\r\n"); - */ - regWr(rPERADDR, addr); //set peripheral address - - uint8_t mode = regRd(rMODE); - - //Serial.print("\r\nMode: "); - //Serial.println( mode, HEX); - //Serial.print("\r\nLS: "); - //Serial.println(p->lowspeed, HEX); - - - - // Set bmLOWSPEED and bmHUBPRE in case of low-speed device, reset them otherwise - regWr(rMODE, (p->lowspeed) ? mode | bmLOWSPEED | bmHubPre : mode & ~(bmHUBPRE | bmLOWSPEED)); - - return 0; -} - -/* Control transfer. Sets address, endpoint, fills control packet with necessary data, dispatches control packet, and initiates bulk IN transfer, */ -/* depending on request. Actual requests are defined as inlines */ -/* return codes: */ -/* 00 = success */ - -/* 01-0f = non-zero HRSLT */ -uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, - uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p) { - bool direction = false; //request direction, IN or OUT - uint8_t rcode; - SETUP_PKT setup_pkt; - - EpInfo *pep = nullptr; - uint16_t nak_limit = 0; - - rcode = SetAddress(addr, ep, &pep, &nak_limit); - if (rcode) return rcode; - - direction = ((bmReqType & 0x80) > 0); - - /* fill in setup packet */ - setup_pkt.ReqType_u.bmRequestType = bmReqType; - setup_pkt.bRequest = bRequest; - setup_pkt.wVal_u.wValueLo = wValLo; - setup_pkt.wVal_u.wValueHi = wValHi; - setup_pkt.wIndex = wInd; - setup_pkt.wLength = total; - - bytesWr(rSUDFIFO, 8, (uint8_t*) & setup_pkt); //transfer to setup packet FIFO - - rcode = dispatchPkt(tokSETUP, ep, nak_limit); //dispatch packet - if (rcode) return rcode; // Return HRSLT if not zero - - if (dataptr != nullptr) { //data stage, if present - if (direction) { //IN transfer - uint16_t left = total; - pep->bmRcvToggle = 1; //bmRCVTOG1; - - while (left) { - // Bytes read into buffer - uint16_t read = nbytes; - //uint16_t read = (leftbmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; - continue; - } - - if (rcode) return rcode; - - // Invoke callback function if inTransfer completed successfully and callback function pointer is specified - if (!rcode && p) ((USBReadParser*)p)->Parse(read, dataptr, total - left); - - left -= read; - - if (read < nbytes) break; - } - } - else { //OUT transfer - pep->bmSndToggle = 1; //bmSNDTOG1; - rcode = OutTransfer(pep, nak_limit, nbytes, dataptr); - } - if (rcode) return rcode; // return error - } - // Status stage - return dispatchPkt((direction) ? tokOUTHS : tokINHS, ep, nak_limit); //GET if direction -} - -/* IN transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */ -/* Keep sending INs and writes data to memory area pointed by 'data' */ - -/* rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error, - fe USB xfer timeout */ -uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) { - EpInfo *pep = nullptr; - uint16_t nak_limit = 0; - - uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit); - if (rcode) { - USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81); - USBTRACE3("(USB::InTransfer) addr requested ", addr, 0x81); - USBTRACE3("(USB::InTransfer) ep requested ", ep, 0x81); - return rcode; - } - return InTransfer(pep, nak_limit, nbytesptr, data, bInterval); -} - -uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) { - uint8_t rcode = 0; - uint8_t pktsize; - - uint16_t nbytes = *nbytesptr; - //printf("Requesting %i bytes ", nbytes); - uint8_t maxpktsize = pep->maxPktSize; - - *nbytesptr = 0; - regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value - - // use a 'break' to exit this loop - for (;;) { - rcode = dispatchPkt(tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS. - if (rcode == hrTOGERR) { - // yes, we flip it wrong here so that next time it is actually correct! - pep->bmRcvToggle = (regRd(rHRSL) & bmRCVTOGRD) ? 0 : 1; - regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value - continue; - } - if (rcode) { - //printf(">>>>>>>> Problem! dispatchPkt %2.2x\r\n", rcode); - break; //should be 0, indicating ACK. Else return error code. - } - /* check for RCVDAVIRQ and generate error if not present */ - /* the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred. Need to add handling for that */ - if ((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) { - //printf(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n"); - rcode = 0xF0; //receive error - break; - } - pktsize = regRd(rRCVBC); //number of received bytes - //printf("Got %i bytes \r\n", pktsize); - // This would be OK, but... - //assert(pktsize <= nbytes); - if (pktsize > nbytes) { - // This can happen. Use of assert on Arduino locks up the Arduino. - // So I will trim the value, and hope for the best. - //printf(">>>>>>>> Problem! Wanted %i bytes but got %i.\r\n", nbytes, pktsize); - pktsize = nbytes; - } - - int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr); - if (mem_left < 0) mem_left = 0; - - data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data); - - regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer - *nbytesptr += pktsize; // add this packet's byte count to total transfer length - - /* The transfer is complete under two conditions: */ - /* 1. The device sent a short packet (L.T. maxPacketSize) */ - /* 2. 'nbytes' have been transferred. */ - if (pktsize < maxpktsize || *nbytesptr >= nbytes) { // Transferred 'nbytes' bytes? - // Save toggle value - pep->bmRcvToggle = ((regRd(rHRSL) & bmRCVTOGRD)) ? 1 : 0; - //printf("\r\n"); - rcode = 0; - break; - } - else if (bInterval > 0) - delay(bInterval); // Delay according to polling interval - } - return rcode; -} - -/* OUT transfer to arbitrary endpoint. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */ -/* Handles NAK bug per Maxim Application Note 4000 for single buffer transfer */ - -/* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */ -uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) { - EpInfo *pep = nullptr; - uint16_t nak_limit = 0; - - uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit); - if (rcode) return rcode; - - return OutTransfer(pep, nak_limit, nbytes, data); -} - -uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) { - uint8_t rcode = hrSUCCESS, retry_count; - uint8_t *data_p = data; //local copy of the data pointer - uint16_t bytes_tosend, nak_count; - uint16_t bytes_left = nbytes; - - uint8_t maxpktsize = pep->maxPktSize; - - if (maxpktsize < 1 || maxpktsize > 64) - return USB_ERROR_INVALID_MAX_PKT_SIZE; - - uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT; - - regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value - - while (bytes_left) { - retry_count = 0; - nak_count = 0; - bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left; - bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO - regWr(rSNDBC, bytes_tosend); //set number of bytes - regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet - while (!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ - regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ - rcode = (regRd(rHRSL) & 0x0F); - - while (rcode && ((int32_t)((uint32_t)millis() - timeout) < 0L)) { - switch (rcode) { - case hrNAK: - nak_count++; - if (nak_limit && (nak_count == nak_limit)) - goto breakout; - //return ( rcode); - break; - case hrTIMEOUT: - retry_count++; - if (retry_count == USB_RETRY_LIMIT) - goto breakout; - //return ( rcode); - break; - case hrTOGERR: - // yes, we flip it wrong here so that next time it is actually correct! - pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; - regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value - break; - default: - goto breakout; - } - - /* process NAK according to Host out NAK bug */ - regWr(rSNDBC, 0); - regWr(rSNDFIFO, *data_p); - regWr(rSNDBC, bytes_tosend); - regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet - while (!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ - regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ - rcode = (regRd(rHRSL) & 0x0F); - } // while rcode && .... - bytes_left -= bytes_tosend; - data_p += bytes_tosend; - } // while bytes_left... -breakout: - - pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle - return ( rcode); //should be 0 in all cases -} - -/* dispatch USB packet. Assumes peripheral address is set and relevant buffer is loaded/empty */ -/* If NAK, tries to re-send up to nak_limit times */ -/* If nak_limit == 0, do not count NAKs, exit after timeout */ -/* If bus timeout, re-sends up to USB_RETRY_LIMIT times */ - -/* return codes 0x00-0x0F are HRSLT( 0x00 being success ), 0xFF means timeout */ -uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) { - uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT; - uint8_t tmpdata; - uint8_t rcode = hrSUCCESS; - uint8_t retry_count = 0; - uint16_t nak_count = 0; - - while ((int32_t)((uint32_t)millis() - timeout) < 0L) { - #if defined(ESP8266) || defined(ESP32) - yield(); // needed in order to reset the watchdog timer on the ESP8266 - #endif - regWr(rHXFR, (token | ep)); //launch the transfer - rcode = USB_ERROR_TRANSFER_TIMEOUT; - - while ((int32_t)((uint32_t)millis() - timeout) < 0L) { //wait for transfer completion - #if defined(ESP8266) || defined(ESP32) - yield(); // needed to reset the watchdog timer on the ESP8266 - #endif - tmpdata = regRd(rHIRQ); - - if (tmpdata & bmHXFRDNIRQ) { - regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt - rcode = 0x00; - break; - } - - } // while millis() < timeout - - //if (rcode != 0x00) //exit if timeout - // return ( rcode); - - rcode = (regRd(rHRSL) & 0x0F); //analyze transfer result - - switch (rcode) { - case hrNAK: - nak_count++; - if (nak_limit && (nak_count == nak_limit)) - return (rcode); - break; - case hrTIMEOUT: - retry_count++; - if (retry_count == USB_RETRY_LIMIT) - return (rcode); - break; - default: - return (rcode); - } - - } // while timeout > millis() - return rcode; -} - -/* USB main task. Performs enumeration/cleanup */ -void USB::Task() { //USB state machine - uint8_t rcode; - uint8_t tmpdata; - static uint32_t delay = 0; - //USB_FD_DEVICE_DESCRIPTOR buf; - bool lowspeed = false; - - MAX3421E::Task(); - - tmpdata = getVbusState(); - - /* modify USB task state if Vbus changed */ - switch (tmpdata) { - case SE1: //illegal state - usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL; - lowspeed = false; - break; - case SE0: //disconnected - if ((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED) - usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; - lowspeed = false; - break; - case LSHOST: - lowspeed = true; - //intentional fallthrough - case FSHOST: //attached - if ((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) { - delay = (uint32_t)millis() + USB_SETTLE_DELAY; - usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE; - } - break; - } - - for (uint8_t i = 0; i < USB_NUMDEVICES; i++) - if (devConfig[i]) rcode = devConfig[i]->Poll(); - - switch (usb_task_state) { - case USB_DETACHED_SUBSTATE_INITIALIZE: - init(); - - for (uint8_t i = 0; i < USB_NUMDEVICES; i++) - if (devConfig[i]) - rcode = devConfig[i]->Release(); - - usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE; - break; - case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: //just sit here - break; - case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here - break; - case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device - if ((int32_t)((uint32_t)millis() - delay) >= 0L) - usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE; - else break; // don't fall through - case USB_ATTACHED_SUBSTATE_RESET_DEVICE: - regWr(rHCTL, bmBUSRST); //issue bus reset - usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE; - break; - case USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE: - if ((regRd(rHCTL) & bmBUSRST) == 0) { - tmpdata = regRd(rMODE) | bmSOFKAENAB; //start SOF generation - regWr(rMODE, tmpdata); - usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF; - //delay = (uint32_t)millis() + 20; //20ms wait after reset per USB spec - } - break; - case USB_ATTACHED_SUBSTATE_WAIT_SOF: //todo: change check order - if (regRd(rHIRQ) & bmFRAMEIRQ) { - //when first SOF received _and_ 20ms has passed we can continue - /* - if (delay < (uint32_t)millis()) //20ms passed - usb_task_state = USB_STATE_CONFIGURING; - */ - usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET; - delay = (uint32_t)millis() + 20; - } - break; - case USB_ATTACHED_SUBSTATE_WAIT_RESET: - if ((int32_t)((uint32_t)millis() - delay) >= 0L) usb_task_state = USB_STATE_CONFIGURING; - else break; // don't fall through - case USB_STATE_CONFIGURING: - - //Serial.print("\r\nConf.LS: "); - //Serial.println(lowspeed, HEX); - - rcode = Configuring(0, 0, lowspeed); - - if (!rcode) - usb_task_state = USB_STATE_RUNNING; - else if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) { - usb_error = rcode; - usb_task_state = USB_STATE_ERROR; - } - break; - case USB_STATE_RUNNING: - break; - case USB_STATE_ERROR: - //MAX3421E::Init(); - break; - } -} - -uint8_t USB::DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed) { - //uint8_t buf[12]; - uint8_t rcode; - UsbDevice *p0 = nullptr, *p = nullptr; - - // Get pointer to pseudo device with address 0 assigned - p0 = addrPool.GetUsbDevicePtr(0); - if (!p0) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - if (!p0->epinfo) return USB_ERROR_EPINFO_IS_NULL; - - p0->lowspeed = lowspeed; - - // Allocate new address according to device class - uint8_t bAddress = addrPool.AllocAddress(parent, false, port); - if (!bAddress) return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL; - - p = addrPool.GetUsbDevicePtr(bAddress); - if (!p) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - p->lowspeed = lowspeed; - - // Assign new address to the device - rcode = setAddr(0, 0, bAddress); - if (rcode) { - addrPool.FreeAddress(bAddress); - bAddress = 0; - } - return rcode; -} - -uint8_t USB::AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed) { - //printf("AttemptConfig: parent = %i, port = %i\r\n", parent, port); - uint8_t retries = 0; - -again: - uint8_t rcode = devConfig[driver]->ConfigureDevice(parent, port, lowspeed); - if (rcode == USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET) { - if (parent == 0) { - // Send a bus reset on the root interface. - regWr(rHCTL, bmBUSRST); //issue bus reset - delay(102); // delay 102ms, compensate for clock inaccuracy. - } - else { - // reset parent port - devConfig[parent]->ResetHubPort(port); - } - } - else if (rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works - delay(100); - retries++; - goto again; - } - else if (rcode) - return rcode; - - rcode = devConfig[driver]->Init(parent, port, lowspeed); - if (rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works - delay(100); - retries++; - goto again; - } - - if (rcode) { - // Issue a bus reset, because the device may be in a limbo state - if (parent == 0) { - // Send a bus reset on the root interface. - regWr(rHCTL, bmBUSRST); //issue bus reset - delay(102); // delay 102ms, compensate for clock inaccuracy. - } - else { - // reset parent port - devConfig[parent]->ResetHubPort(port); - } - } - return rcode; -} - -/** - * This is broken. It needs to enumerate differently. - * It causes major problems with several devices if detected in an unexpected order. - * - * Oleg - I wouldn't do anything before the newly connected device is considered sane. - * i.e.(delays are not indicated for brevity): - * 1. reset - * 2. GetDevDescr(); - * 3a. If ACK, continue with allocating address, addressing, etc. - * 3b. Else reset again, count resets, stop at some number (5?). - * 4. When max.number of resets is reached, toggle power/fail - * If desired, this could be modified by performing two resets with GetDevDescr() in the middle - however, from my experience, if a device answers to GDD() - * it doesn't need to be reset again - * New steps proposal: - * 1: get address pool instance. exit on fail - * 2: pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf). exit on fail. - * 3: bus reset, 100ms delay - * 4: set address - * 5: pUsb->setEpInfoEntry(bAddress, 1, epInfo), exit on fail - * 6: while (configurations) { - * for (each configuration) { - * for (each driver) { - * 6a: Ask device if it likes configuration. Returns 0 on OK. - * If successful, the driver configured device. - * The driver now owns the endpoints, and takes over managing them. - * The following will need codes: - * Everything went well, instance consumed, exit with success. - * Instance already in use, ignore it, try next driver. - * Not a supported device, ignore it, try next driver. - * Not a supported configuration for this device, ignore it, try next driver. - * Could not configure device, fatal, exit with fail. - * } - * } - * } - * 7: for (each driver) { - * 7a: Ask device if it knows this VID/PID. Acts exactly like 6a, but using VID/PID - * 8: if we get here, no driver likes the device plugged in, so exit failure. - */ -uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { - //uint8_t bAddress = 0; - //printf("Configuring: parent = %i, port = %i\r\n", parent, port); - uint8_t devConfigIndex; - uint8_t rcode = 0; - uint8_t buf[sizeof (USB_FD_DEVICE_DESCRIPTOR)]; - USB_FD_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); - UsbDevice *p = nullptr; - EpInfo *oldep_ptr = nullptr; - EpInfo epInfo; - - epInfo.epAddr = 0; - epInfo.maxPktSize = 8; - epInfo.bmSndToggle = 0; - epInfo.bmRcvToggle = 0; - epInfo.bmNakPower = USB_NAK_MAX_POWER; - - //delay(2000); - AddressPool &addrPool = GetAddressPool(); - // Get pointer to pseudo device with address 0 assigned - p = addrPool.GetUsbDevicePtr(0); - if (!p) { - //printf("Configuring error: USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL\r\n"); - return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - } - - // Save old pointer to EP_RECORD of address 0 - oldep_ptr = p->epinfo; - - // Temporary assign new pointer to epInfo to p->epinfo in order to - // avoid toggle inconsistence - - p->epinfo = &epInfo; - - p->lowspeed = lowspeed; - // Get device descriptor - rcode = getDevDescr(0, 0, sizeof (USB_FD_DEVICE_DESCRIPTOR), (uint8_t*)buf); - - // Restore p->epinfo - p->epinfo = oldep_ptr; - - if (rcode) { - //printf("Configuring error: Can't get USB_FD_DEVICE_DESCRIPTOR\r\n"); - return rcode; - } - - // to-do? - // Allocate new address according to device class - //bAddress = addrPool.AllocAddress(parent, false, port); - - uint16_t vid = udd->idVendor, pid = udd->idProduct; - uint8_t klass = udd->bDeviceClass, subklass = udd->bDeviceSubClass; - - // Attempt to configure if VID/PID or device class matches with a driver - // Qualify with subclass too. - // - // VID/PID & class tests default to false for drivers not yet ported - // subclass defaults to true, so you don't have to define it if you don't have to. - // - for (devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) { - if (!devConfig[devConfigIndex]) continue; // no driver - if (devConfig[devConfigIndex]->GetAddress()) continue; // consumed - if (devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) { - rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed); - if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED) - break; - } - } - - if (devConfigIndex < USB_NUMDEVICES) return rcode; - - // blindly attempt to configure - for (devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) { - if (!devConfig[devConfigIndex]) continue; - if (devConfig[devConfigIndex]->GetAddress()) continue; // consumed - if (devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) continue; // If this is true it means it must have returned USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED above - rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed); - - //printf("ERROR ENUMERATING %2.2x\r\n", rcode); - if (!(rcode == USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED || rcode == USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE)) { - // in case of an error dev_index should be reset to 0 - // in order to start from the very beginning the - // next time the program gets here - //if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) - // devConfigIndex = 0; - return rcode; - } - } - // Arriving here means the device class is unsupported by registered classes - return DefaultAddressing(parent, port, lowspeed); -} - -uint8_t USB::ReleaseDevice(uint8_t addr) { - if (addr) { - for (uint8_t i = 0; i < USB_NUMDEVICES; i++) { - if (!devConfig[i]) continue; - if (devConfig[i]->GetAddress() == addr) - return devConfig[i]->Release(); - } - } - return 0; -} - -#if 1 //!defined(USB_METHODS_INLINE) -//get device descriptor - -uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { - return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, nullptr); -} -//get configuration descriptor - -uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { - return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, nullptr); -} - -/* Requests Configuration Descriptor. Sends two Get Conf Descr requests. The first one gets the total length of all descriptors, then the second one requests this - total length. The length of the first request can be shorter ( 4 bytes ), however, there are devices which won't work unless this length is set to 9 */ -uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p) { - const uint8_t bufSize = 64; - uint8_t buf[bufSize]; - USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); - - uint8_t ret = getConfDescr(addr, ep, 9, conf, buf); - if (ret) return ret; - - uint16_t total = ucd->wTotalLength; - - //USBTRACE2("\r\ntotal conf.size:", total); - - return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p); -} - -//get string descriptor - -uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) { - return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, nullptr); -} -//set address - -uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) { - uint8_t rcode = ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, nullptr, nullptr); - //delay(2); //per USB 2.0 sect.9.2.6.3 - delay(300); // Older spec says you should wait at least 200ms - return rcode; - //return ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, nullptr, nullptr); -} -//set configuration - -uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) { - return ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, nullptr, nullptr); -} - -#endif // defined(USB_METHODS_INLINE) -#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h deleted file mode 100644 index b1ec146999..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -#pragma once - -/* USB functions */ -#define _usb_h_ - -#include "../../../inc/MarlinConfigPre.h" - -// WARNING: Do not change the order of includes, or stuff will break! -#include -#include -#include - -// None of these should ever be included by a driver, or a user's sketch. -#include "settings.h" -#include "printhex.h" -#include "message.h" - -#include "hexdump.h" -//#include "sink_parser.h" -#include "max3421e.h" -#include "address.h" -//#include "avrpins.h" -#include "usb_ch9.h" -#include "usbhost.h" -#include "UsbCore.h" -#include "parsetools.h" -#include "confdescparser.h" - -#undef _usb_h_ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h deleted file mode 100644 index d94958dd54..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h +++ /dev/null @@ -1,312 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ - -#ifndef _usb_h_ - #error "Never include UsbCore.h directly; include Usb.h instead" -#endif - -#pragma once - -// Not used anymore? If anyone uses this, please let us know so that this may be -// moved to the proper place, settings.h. -//#define USB_METHODS_INLINE - -/* shield pins. First parameter - SS pin, second parameter - INT pin */ - -#ifdef __MARLIN_FIRMWARE__ -typedef MAX3421e MAX3421E; // Marlin redefines this class in "../usb_host.h" -#elif defined(BOARD_BLACK_WIDDOW) -typedef MAX3421e MAX3421E; // Black Widow -#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)) -#if EXT_RAM -typedef MAX3421e MAX3421E; // Teensy++ 2.0 with XMEM2 -#else -typedef MAX3421e MAX3421E; // Teensy++ 1.0 and 2.0 -#endif -#elif defined(BOARD_MEGA_ADK) -typedef MAX3421e MAX3421E; // Arduino Mega ADK -#elif defined(ARDUINO_AVR_BALANDUINO) -typedef MAX3421e MAX3421E; // Balanduino -#elif defined(__ARDUINO_X86__) && PLATFORM_ID == 0x06 -typedef MAX3421e MAX3421E; // The Intel Galileo supports much faster read and write speed at pin 2 and 3 -#elif defined(ESP8266) -typedef MAX3421e MAX3421E; // ESP8266 boards -#elif defined(ESP32) -typedef MAX3421e MAX3421E; // ESP32 boards -#else -typedef MAX3421e MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega, 2560, Leonardo, Due etc.), Intel Edison, Intel Galileo 2 or Teensy 2.0 and 3.x -#endif - -/* Common setup data constant combinations */ -#define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //get descriptor request type -#define bmREQ_SET USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //set request type for all but 'set feature' and 'set interface' -#define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE //get interface request type - -// D7 data transfer direction (0 - host-to-device, 1 - device-to-host) -// D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved) -// D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved) - -// USB Device Classes -#define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors -#define USB_CLASS_AUDIO 0x01 // Audio -#define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control -#define USB_CLASS_HID 0x03 // HID -#define USB_CLASS_PHYSICAL 0x05 // Physical -#define USB_CLASS_IMAGE 0x06 // Image -#define USB_CLASS_PRINTER 0x07 // Printer -#define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage -#define USB_CLASS_HUB 0x09 // Hub -#define USB_CLASS_CDC_DATA 0x0A // CDC-Data -#define USB_CLASS_SMART_CARD 0x0B // Smart-Card -#define USB_CLASS_CONTENT_SECURITY 0x0D // Content Security -#define USB_CLASS_VIDEO 0x0E // Video -#define USB_CLASS_PERSONAL_HEALTH 0x0F // Personal Healthcare -#define USB_CLASS_DIAGNOSTIC_DEVICE 0xDC // Diagnostic Device -#define USB_CLASS_WIRELESS_CTRL 0xE0 // Wireless Controller -#define USB_CLASS_MISC 0xEF // Miscellaneous -#define USB_CLASS_APP_SPECIFIC 0xFE // Application Specific -#define USB_CLASS_VENDOR_SPECIFIC 0xFF // Vendor Specific - -// Additional Error Codes -#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1 -#define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2 -#define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3 -#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4 -#define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5 -#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6 -#define USB_ERROR_EPINFO_IS_NULL 0xD7 -#define USB_ERROR_INVALID_ARGUMENT 0xD8 -#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9 -#define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA -#define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB -#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET 0xE0 -#define USB_ERROR_FailGetDevDescr 0xE1 -#define USB_ERROR_FailSetDevTblEntry 0xE2 -#define USB_ERROR_FailGetConfDescr 0xE3 -#define USB_ERROR_TRANSFER_TIMEOUT 0xFF - -#define USB_XFER_TIMEOUT 5000 // (5000) USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec -//#define USB_NAK_LIMIT 32000 // NAK limit for a transfer. 0 means NAKs are not counted -#define USB_RETRY_LIMIT 3 // 3 retry limit for a transfer -#define USB_SETTLE_DELAY 200 // settle delay in milliseconds - -#define USB_NUMDEVICES 16 //number of USB devices -//#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller -#define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms - -/* USB state machine states */ -#define USB_STATE_MASK 0xF0 - -#define USB_STATE_DETACHED 0x10 -#define USB_DETACHED_SUBSTATE_INITIALIZE 0x11 -#define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12 -#define USB_DETACHED_SUBSTATE_ILLEGAL 0x13 -#define USB_ATTACHED_SUBSTATE_SETTLE 0x20 -#define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30 -#define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40 -#define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50 -#define USB_ATTACHED_SUBSTATE_WAIT_RESET 0x51 -#define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60 -#define USB_STATE_ADDRESSING 0x70 -#define USB_STATE_CONFIGURING 0x80 -#define USB_STATE_RUNNING 0x90 -#define USB_STATE_ERROR 0xA0 - -class USBDeviceConfig { -public: - - virtual uint8_t Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) { - return 0; - } - - virtual uint8_t ConfigureDevice(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) { - return 0; - } - - virtual uint8_t Release() { - return 0; - } - - virtual uint8_t Poll() { - return 0; - } - - virtual uint8_t GetAddress() { - return 0; - } - - virtual void ResetHubPort(uint8_t port __attribute__((unused))) { - return; - } // Note used for hubs only! - - virtual bool VIDPIDOK(uint16_t vid __attribute__((unused)), uint16_t pid __attribute__((unused))) { - return false; - } - - virtual bool DEVCLASSOK(uint8_t klass __attribute__((unused))) { - return false; - } - - virtual bool DEVSUBCLASSOK(uint8_t subklass __attribute__((unused))) { - return true; - } - -}; - -/* USB Setup Packet Structure */ -typedef struct { - - union { // offset description - uint8_t bmRequestType; // 0 Bit-map of request type - - struct { - uint8_t recipient : 5; // Recipient of the request - uint8_t type : 2; // Type of request - uint8_t direction : 1; // Direction of data X-fer - } __attribute__((packed)); - } ReqType_u; - uint8_t bRequest; // 1 Request - - union { - uint16_t wValue; // 2 Depends on bRequest - - struct { - uint8_t wValueLo; - uint8_t wValueHi; - } __attribute__((packed)); - } wVal_u; - uint16_t wIndex; // 4 Depends on bRequest - uint16_t wLength; // 6 Depends on bRequest -} __attribute__((packed)) SETUP_PKT, *PSETUP_PKT; - - - -// Base class for incoming data parser - -class USBReadParser { -public: - virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) = 0; -}; - -class USB : public MAX3421E { - AddressPoolImpl addrPool; - USBDeviceConfig* devConfig[USB_NUMDEVICES]; - uint8_t bmHubPre; - -public: - USB(); - - void SetHubPreMask() { - bmHubPre |= bmHUBPRE; - }; - - void ResetHubPreMask() { - bmHubPre &= (~bmHUBPRE); - }; - - AddressPool& GetAddressPool() { - return (AddressPool&)addrPool; - }; - - uint8_t RegisterDeviceClass(USBDeviceConfig *pdev) { - for (uint8_t i = 0; i < USB_NUMDEVICES; i++) { - if (!devConfig[i]) { - devConfig[i] = pdev; - return 0; - } - } - return USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS; - }; - - void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) { - addrPool.ForEachUsbDevice(pfunc); - }; - uint8_t getUsbTaskState(); - void setUsbTaskState(uint8_t state); - - EpInfo* getEpInfoEntry(uint8_t addr, uint8_t ep); - uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr); - - /* Control requests */ - uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr); - uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr); - - uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p); - - uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); - uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr); - uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value); - /**/ - uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr, bool direction); - uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit); - uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval = 0); - uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data); - uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit); - - void Task(); - - uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed); - uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed); - uint8_t ReleaseDevice(uint8_t addr); - - uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, - uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p); - -private: - void init(); - uint8_t SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit); - uint8_t OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data); - uint8_t InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0); - uint8_t AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed); -}; - -#if 0 //defined(USB_METHODS_INLINE) -//get device descriptor - -inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { - return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr)); -} -//get configuration descriptor - -inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { - return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr)); -} -//get string descriptor - -inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) { - return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr)); -} -//set address - -inline uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) { - return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, nullptr)); -} -//set configuration - -inline uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) { - return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, nullptr)); -} - -#endif // defined(USB_METHODS_INLINE) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h deleted file mode 100644 index 373b95a7f9..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h +++ /dev/null @@ -1,271 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -#pragma once - -#ifndef _usb_h_ - #error "Never include address.h directly; include Usb.h instead" -#endif - -/* NAK powers. To save space in endpoint data structure, amount of retries before giving up and returning 0x4 is stored in */ -/* bmNakPower as a power of 2. The actual nak_limit is then calculated as nak_limit = ( 2^bmNakPower - 1) */ -#define USB_NAK_MAX_POWER 15 //NAK binary order maximum value -#define USB_NAK_DEFAULT 14 //default 32K-1 NAKs before giving up -#define USB_NAK_NOWAIT 1 //Single NAK stops transfer -#define USB_NAK_NONAK 0 //Do not count NAKs, stop retrying after USB Timeout - -struct EpInfo { - uint8_t epAddr; // Endpoint address - uint8_t maxPktSize; // Maximum packet size - - union { - uint8_t epAttribs; - - struct { - uint8_t bmSndToggle : 1; // Send toggle, when zero bmSNDTOG0, bmSNDTOG1 otherwise - uint8_t bmRcvToggle : 1; // Send toggle, when zero bmRCVTOG0, bmRCVTOG1 otherwise - uint8_t bmNakPower : 6; // Binary order for NAK_LIMIT value - } __attribute__((packed)); - }; -} __attribute__((packed)); - -// 7 6 5 4 3 2 1 0 -// --------------------------------- -// | | H | P | P | P | A | A | A | -// --------------------------------- -// -// H - if 1 the address is a hub address -// P - parent hub address -// A - device address / port number in case of hub -// - -struct UsbDeviceAddress { - union { - struct { - uint8_t bmAddress : 3; // device address/port number - uint8_t bmParent : 3; // parent hub address - uint8_t bmHub : 1; // hub flag - uint8_t bmReserved : 1; // reserved, must be zero - } __attribute__((packed)); - uint8_t devAddress; - }; -} __attribute__((packed)); - -#define bmUSB_DEV_ADDR_ADDRESS 0x07 -#define bmUSB_DEV_ADDR_PARENT 0x38 -#define bmUSB_DEV_ADDR_HUB 0x40 - -struct UsbDevice { - EpInfo *epinfo; // endpoint info pointer - UsbDeviceAddress address; - uint8_t epcount; // number of endpoints - bool lowspeed; // indicates if a device is the low speed one - // uint8_t devclass; // device class -} __attribute__((packed)); - -class AddressPool { - public: - virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) = 0; - virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) = 0; - virtual void FreeAddress(uint8_t addr) = 0; -}; - -typedef void (*UsbDeviceHandleFunc)(UsbDevice *pdev); - -#define ADDR_ERROR_INVALID_INDEX 0xFF -#define ADDR_ERROR_INVALID_ADDRESS 0xFF - -template -class AddressPoolImpl : public AddressPool { - EpInfo dev0ep; //Endpoint data structure used during enumeration for uninitialized device - - uint8_t hubCounter; // hub counter is kept - // in order to avoid hub address duplication - - UsbDevice thePool[MAX_DEVICES_ALLOWED]; - - // Initialize address pool entry - - void InitEntry(uint8_t index) { - thePool[index].address.devAddress = 0; - thePool[index].epcount = 1; - thePool[index].lowspeed = 0; - thePool[index].epinfo = &dev0ep; - } - - // Return thePool index for a given address - - uint8_t FindAddressIndex(uint8_t address = 0) { - for (uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) - if (thePool[i].address.devAddress == address) - return i; - - return 0; - } - - // Return thePool child index for a given parent - - uint8_t FindChildIndex(UsbDeviceAddress addr, uint8_t start = 1) { - for (uint8_t i = (start < 1 || start >= MAX_DEVICES_ALLOWED) ? 1 : start; i < MAX_DEVICES_ALLOWED; i++) { - if (thePool[i].address.bmParent == addr.bmAddress) - return i; - } - return 0; - } - - // Frees address entry specified by index parameter - - void FreeAddressByIndex(uint8_t index) { - // Zero field is reserved and should not be affected - if (index == 0) return; - - UsbDeviceAddress uda = thePool[index].address; - // If a hub was switched off all port addresses should be freed - if (uda.bmHub == 1) { - for (uint8_t i = 1; (i = FindChildIndex(uda, i));) - FreeAddressByIndex(i); - - // If the hub had the last allocated address, hubCounter should be decremented - if (hubCounter == uda.bmAddress) hubCounter--; - } - InitEntry(index); - } - - // Initialize the whole address pool at once - - void InitAllAddresses() { - for (uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) - InitEntry(i); - - hubCounter = 0; - } - -public: - - AddressPoolImpl() : hubCounter(0) { - // Zero address is reserved - InitEntry(0); - - thePool[0].address.devAddress = 0; - thePool[0].epinfo = &dev0ep; - dev0ep.epAddr = 0; - dev0ep.maxPktSize = 8; - dev0ep.bmSndToggle = 0; // Set DATA0/1 toggles to 0 - dev0ep.bmRcvToggle = 0; - dev0ep.bmNakPower = USB_NAK_MAX_POWER; - - InitAllAddresses(); - } - - // Return a pointer to a specified address entry - - virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) { - if (!addr) return thePool; - uint8_t index = FindAddressIndex(addr); - return index ? thePool + index : nullptr; - } - - // Perform an operation specified by pfunc for each addressed device - - void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) { - if (pfunc) { - for (uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) - if (thePool[i].address.devAddress) - pfunc(thePool + i); - } - } - - // Allocate new address - - virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) { - /* if (parent != 0 && port == 0) - USB_HOST_SERIAL.println("PRT:0"); */ - UsbDeviceAddress _parent; - _parent.devAddress = parent; - if (_parent.bmReserved || port > 7) - //if(parent > 127 || port > 7) - return 0; - - if (is_hub && hubCounter == 7) return 0; - - // finds first empty address entry starting from one - uint8_t index = FindAddressIndex(0); - - if (!index) return 0; // if empty entry is not found - - if (_parent.devAddress == 0) { - if (is_hub) { - thePool[index].address.devAddress = 0x41; - hubCounter++; - } - else - thePool[index].address.devAddress = 1; - - return thePool[index].address.devAddress; - } - - UsbDeviceAddress addr; - addr.devAddress = 0; // Ensure all bits are zero - addr.bmParent = _parent.bmAddress; - if (is_hub) { - addr.bmHub = 1; - addr.bmAddress = ++hubCounter; - } - else { - addr.bmHub = 0; - addr.bmAddress = port; - } - thePool[index].address = addr; - /* - USB_HOST_SERIAL.print("Addr:"); - USB_HOST_SERIAL.print(addr.bmHub, HEX); - USB_HOST_SERIAL.print("."); - USB_HOST_SERIAL.print(addr.bmParent, HEX); - USB_HOST_SERIAL.print("."); - USB_HOST_SERIAL.println(addr.bmAddress, HEX); - */ - return thePool[index].address.devAddress; - } - - // Empty the pool entry - - virtual void FreeAddress(uint8_t addr) { - // if the root hub is disconnected all the addresses should be initialized - if (addr == 0x41) { - InitAllAddresses(); - return; - } - FreeAddressByIndex(FindAddressIndex(addr)); - } - - // Return number of hubs attached - // It can be helpful to find out if hubs are attached when getting the exact number of hubs. - //uint8_t GetNumHubs() { return hubCounter; } - //uint8_t GetNumDevices() { - // uint8_t counter = 0; - // for (uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) - // if (thePool[i].address != 0); counter++; - // return counter; - //} -}; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h deleted file mode 100644 index 9ed35fff65..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h +++ /dev/null @@ -1,201 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -#pragma once - -#ifndef _usb_h_ - #error "Never include confdescparser.h directly; include Usb.h instead" -#endif - -class UsbConfigXtracter { -public: - //virtual void ConfigXtract(const USB_FD_CONFIGURATION_DESCRIPTOR *conf) = 0; - //virtual void InterfaceXtract(uint8_t conf, const USB_FD_INTERFACE_DESCRIPTOR *iface) = 0; - - virtual void EndpointXtract(uint8_t conf __attribute__((unused)), uint8_t iface __attribute__((unused)), uint8_t alt __attribute__((unused)), uint8_t proto __attribute__((unused)), const USB_FD_ENDPOINT_DESCRIPTOR *ep __attribute__((unused))) { - } -}; - -#define CP_MASK_COMPARE_CLASS 1 -#define CP_MASK_COMPARE_SUBCLASS 2 -#define CP_MASK_COMPARE_PROTOCOL 4 -#define CP_MASK_COMPARE_ALL 7 - -// Configuration Descriptor Parser Class Template - -template -class ConfigDescParser : public USBReadParser { - UsbConfigXtracter *theXtractor; - MultiValueBuffer theBuffer; - MultiByteValueParser valParser; - ByteSkipper theSkipper; - uint8_t varBuffer[16 /*sizeof(USB_FD_CONFIGURATION_DESCRIPTOR)*/]; - - uint8_t stateParseDescr; // ParseDescriptor state - - uint8_t dscrLen; // Descriptor length - uint8_t dscrType; // Descriptor type - - bool isGoodInterface; // Apropriate interface flag - uint8_t confValue; // Configuration value - uint8_t protoValue; // Protocol value - uint8_t ifaceNumber; // Interface number - uint8_t ifaceAltSet; // Interface alternate settings - - bool UseOr; - bool ParseDescriptor(uint8_t **pp, uint16_t *pcntdn); - void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc); - -public: - - void SetOR() { UseOr = true; } - ConfigDescParser(UsbConfigXtracter *xtractor); - void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset); -}; - -template -ConfigDescParser::ConfigDescParser(UsbConfigXtracter *xtractor) : - theXtractor(xtractor), - stateParseDescr(0), - dscrLen(0), - dscrType(0), - UseOr(false) { - theBuffer.pValue = varBuffer; - valParser.Initialize(&theBuffer); - theSkipper.Initialize(&theBuffer); - }; - -template -void ConfigDescParser::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset __attribute__((unused))) { - uint16_t cntdn = (uint16_t)len; - uint8_t *p = (uint8_t*)pbuf; - while (cntdn) if (!ParseDescriptor(&p, &cntdn)) return; -} - -/* Parser for the configuration descriptor. Takes values for class, subclass, protocol fields in interface descriptor and - compare masks for them. When the match is found, calls EndpointXtract passing buffer containing endpoint descriptor */ -template -bool ConfigDescParser::ParseDescriptor(uint8_t **pp, uint16_t *pcntdn) { - USB_FD_CONFIGURATION_DESCRIPTOR* ucd = reinterpret_cast(varBuffer); - USB_FD_INTERFACE_DESCRIPTOR* uid = reinterpret_cast(varBuffer); - switch (stateParseDescr) { - case 0: - theBuffer.valueSize = 2; - valParser.Initialize(&theBuffer); - stateParseDescr = 1; - case 1: - if (!valParser.Parse(pp, pcntdn)) return false; - dscrLen = *((uint8_t*)theBuffer.pValue); - dscrType = *((uint8_t*)theBuffer.pValue + 1); - stateParseDescr = 2; - case 2: - // This is a sort of hack. Assuming that two bytes are all ready in the buffer - // the pointer is positioned two bytes ahead in order for the rest of descriptor - // to be read right after the size and the type fields. - // This should be used carefully. varBuffer should be used directly to handle data - // in the buffer. - theBuffer.pValue = varBuffer + 2; - stateParseDescr = 3; - case 3: - switch (dscrType) { - case USB_DESCRIPTOR_INTERFACE: - isGoodInterface = false; - break; - case USB_DESCRIPTOR_CONFIGURATION: - case USB_DESCRIPTOR_ENDPOINT: - case HID_DESCRIPTOR_HID: - break; - } - theBuffer.valueSize = dscrLen - 2; - valParser.Initialize(&theBuffer); - stateParseDescr = 4; - case 4: - switch (dscrType) { - case USB_DESCRIPTOR_CONFIGURATION: - if (!valParser.Parse(pp, pcntdn)) return false; - confValue = ucd->bConfigurationValue; - break; - case USB_DESCRIPTOR_INTERFACE: - if (!valParser.Parse(pp, pcntdn)) return false; - if ((MASK & CP_MASK_COMPARE_CLASS) && uid->bInterfaceClass != CLASS_ID) - break; - if ((MASK & CP_MASK_COMPARE_SUBCLASS) && uid->bInterfaceSubClass != SUBCLASS_ID) - break; - if (UseOr) { - if ((!((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol))) break; - } - else if ((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol != PROTOCOL_ID) - break; - isGoodInterface = true; - ifaceNumber = uid->bInterfaceNumber; - ifaceAltSet = uid->bAlternateSetting; - protoValue = uid->bInterfaceProtocol; - break; - case USB_DESCRIPTOR_ENDPOINT: - if (!valParser.Parse(pp, pcntdn)) return false; - if (isGoodInterface && theXtractor) - theXtractor->EndpointXtract(confValue, ifaceNumber, ifaceAltSet, protoValue, (USB_FD_ENDPOINT_DESCRIPTOR*)varBuffer); - break; - //case HID_DESCRIPTOR_HID: - // if (!valParser.Parse(pp, pcntdn)) return false; - // PrintHidDescriptor((const USB_HID_DESCRIPTOR*)varBuffer); - // break; - default: - if (!theSkipper.Skip(pp, pcntdn, dscrLen - 2)) return false; - } - theBuffer.pValue = varBuffer; - stateParseDescr = 0; - } - return true; -} - -template -void ConfigDescParser::PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc) { - Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"), 0x80); - Notify(PSTR("bDescLength:\t\t"), 0x80); - PrintHex (pDesc->bLength, 0x80); - - Notify(PSTR("\r\nbDescriptorType:\t"), 0x80); - PrintHex (pDesc->bDescriptorType, 0x80); - - Notify(PSTR("\r\nbcdHID:\t\t\t"), 0x80); - PrintHex (pDesc->bcdHID, 0x80); - - Notify(PSTR("\r\nbCountryCode:\t\t"), 0x80); - PrintHex (pDesc->bCountryCode, 0x80); - - Notify(PSTR("\r\nbNumDescriptors:\t"), 0x80); - PrintHex (pDesc->bNumDescriptors, 0x80); - - for (uint8_t i = 0; i < pDesc->bNumDescriptors; i++) { - HID_CLASS_DESCRIPTOR_LEN_AND_TYPE *pLT = (HID_CLASS_DESCRIPTOR_LEN_AND_TYPE*)&(pDesc->bDescrType); - - Notify(PSTR("\r\nbDescrType:\t\t"), 0x80); - PrintHex (pLT[i].bDescrType, 0x80); - - Notify(PSTR("\r\nwDescriptorLength:\t"), 0x80); - PrintHex (pLT[i].wDescriptorLength, 0x80); - } - Notify(PSTR("\r\n"), 0x80); -} diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h deleted file mode 100644 index c948e5aba0..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -#pragma once - -#ifndef _usb_h_ - #error "Never include hexdump.h directly; include Usb.h instead" -#endif - -extern int UsbDEBUGlvl; - -template -class HexDumper : public BASE_CLASS { - uint8_t byteCount; - OFFSET_TYPE byteTotal; - -public: - - HexDumper() : byteCount(0), byteTotal(0) { - }; - - void Initialize() { - byteCount = 0; - byteTotal = 0; - }; - - void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset); -}; - -template -void HexDumper::Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset __attribute__((unused))) { - if (UsbDEBUGlvl >= 0x80) { // Fully bypass this block of code if we do not debug. - for (LEN_TYPE j = 0; j < len; j++, byteCount++, byteTotal++) { - if (!byteCount) { - PrintHex (byteTotal, 0x80); - E_Notify(PSTR(": "), 0x80); - } - PrintHex (pbuf[j], 0x80); - E_Notify(PSTR(" "), 0x80); - - if (byteCount == 15) { - E_Notify(PSTR("\r\n"), 0x80); - byteCount = 0xFF; - } - } - } -} diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h deleted file mode 100644 index 8cb5b6bf37..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -#pragma once - -#ifndef _usb_h_ - #error "Never include macros.h directly; include Usb.h instead" -#endif - -//////////////////////////////////////////////////////////////////////////////// -// HANDY MACROS -//////////////////////////////////////////////////////////////////////////////// - -#define VALUE_BETWEEN(v,l,h) (((v)>(l)) && ((v)<(h))) -#define VALUE_WITHIN(v,l,h) (((v)>=(l)) && ((v)<=(h))) -#define output_pgm_message(wa,fp,mp,el) wa = &mp, fp((char *)pgm_read_pointer(wa), el) -#define output_if_between(v,l,h,wa,fp,mp,el) if (VALUE_BETWEEN(v,l,h)) output_pgm_message(wa,fp,mp[v-(l+1)],el); - -#define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) -#ifndef __BYTE_GRABBING_DEFINED__ -#define __BYTE_GRABBING_DEFINED__ 1 -#ifdef BROKEN_OPTIMIZER_LITTLE_ENDIAN -// Note: Use this if your compiler generates horrible assembler! -#define BGRAB0(__usi__) (((uint8_t *)&(__usi__))[0]) -#define BGRAB1(__usi__) (((uint8_t *)&(__usi__))[1]) -#define BGRAB2(__usi__) (((uint8_t *)&(__usi__))[2]) -#define BGRAB3(__usi__) (((uint8_t *)&(__usi__))[3]) -#define BGRAB4(__usi__) (((uint8_t *)&(__usi__))[4]) -#define BGRAB5(__usi__) (((uint8_t *)&(__usi__))[5]) -#define BGRAB6(__usi__) (((uint8_t *)&(__usi__))[6]) -#define BGRAB7(__usi__) (((uint8_t *)&(__usi__))[7]) -#else -// Note: The cast alone to uint8_t is actually enough. -// GCC throws out the "& 0xFF", and the size is no different. -// Some compilers need it. -#define BGRAB0(__usi__) ((uint8_t)((__usi__) & 0xFF )) -#define BGRAB1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xFF)) -#define BGRAB2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xFF)) -#define BGRAB3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xFF)) -#define BGRAB4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xFF)) -#define BGRAB5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xFF)) -#define BGRAB6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xFF)) -#define BGRAB7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xFF)) -#endif -#define BOVER1(__usi__) ((uint16_t)(__usi__) << 8) -#define BOVER2(__usi__) ((uint32_t)(__usi__) << 16) -#define BOVER3(__usi__) ((uint32_t)(__usi__) << 24) -#define BOVER4(__usi__) ((uint64_t)(__usi__) << 32) -#define BOVER5(__usi__) ((uint64_t)(__usi__) << 40) -#define BOVER6(__usi__) ((uint64_t)(__usi__) << 48) -#define BOVER7(__usi__) ((uint64_t)(__usi__) << 56) - -// These are the smallest and fastest ways I have found so far in pure C/C++. -#define BMAKE16(__usc1__,__usc0__) ((uint16_t)((uint16_t)(__usc0__) | (uint16_t)BOVER1(__usc1__))) -#define BMAKE32(__usc3__,__usc2__,__usc1__,__usc0__) ((uint32_t)((uint32_t)(__usc0__) | (uint32_t)BOVER1(__usc1__) | (uint32_t)BOVER2(__usc2__) | (uint32_t)BOVER3(__usc3__))) -#define BMAKE64(__usc7__,__usc6__,__usc5__,__usc4__,__usc3__,__usc2__,__usc1__,__usc0__) ((uint64_t)((uint64_t)__usc0__ | (uint64_t)BOVER1(__usc1__) | (uint64_t)BOVER2(__usc2__) | (uint64_t)BOVER3(__usc3__) | (uint64_t)BOVER4(__usc4__) | (uint64_t)BOVER5(__usc5__) | (uint64_t)BOVER6(__usc6__) | (uint64_t)BOVER1(__usc7__))) -#endif - -/* - * Debug macros: Strings are stored in progmem (flash) instead of RAM. - */ -#define USBTRACE(s) (Notify(PSTR(s), 0x80)) -#define USBTRACE1(s,l) (Notify(PSTR(s), l)) -#define USBTRACE2(s,r) (Notify(PSTR(s), 0x80), D_PrintHex((r), 0x80), Notify(PSTR("\r\n"), 0x80)) -#define USBTRACE3(s,r,l) (Notify(PSTR(s), l), D_PrintHex((r), l), Notify(PSTR("\r\n"), l)) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp deleted file mode 100644 index a84a683204..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp +++ /dev/null @@ -1,1217 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) - -#include "masstorage.h" - -const uint8_t BulkOnly::epDataInIndex = 1; -const uint8_t BulkOnly::epDataOutIndex = 2; -const uint8_t BulkOnly::epInterruptInIndex = 3; - -//////////////////////////////////////////////////////////////////////////////// -// Interface code -//////////////////////////////////////////////////////////////////////////////// - -/** - * Get the capacity of the media - * - * @param lun Logical Unit Number - * @return media capacity - */ -uint32_t BulkOnly::GetCapacity(uint8_t lun) { - return LUNOk[lun] ? CurrentCapacity[lun] : 0UL; -} - -/** - * Get the sector (block) size used on the media - * - * @param lun Logical Unit Number - * @return media sector size - */ -uint16_t BulkOnly::GetSectorSize(uint8_t lun) { - return LUNOk[lun] ? CurrentSectorSize[lun] : 0U; -} - -/** - * Test if LUN is ready for use - * - * @param lun Logical Unit Number - * @return true if LUN is ready for use - */ -bool BulkOnly::LUNIsGood(uint8_t lun) { return LUNOk[lun]; } - -/** - * Test if LUN is write protected - * - * @param lun Logical Unit Number - * @return cached status of write protect switch - */ -bool BulkOnly::WriteProtected(uint8_t lun) { return WriteOk[lun]; } - -/** - * Wrap and execute a SCSI CDB with length of 6 - * - * @param cdb CDB to execute - * @param buf_size Size of expected transaction - * @param buf Buffer - * @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT - * @return - */ -uint8_t BulkOnly::SCSITransaction6(CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) { - // promote buf_size to 32bits. - CommandBlockWrapper cbw = CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir); - //SetCurLUN(cdb->LUN); - return (HandleSCSIError(Transaction(&cbw, buf_size, buf))); -} - -/** - * Wrap and execute a SCSI CDB with length of 10 - * - * @param cdb CDB to execute - * @param buf_size Size of expected transaction - * @param buf Buffer - * @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT - * @return - */ -uint8_t BulkOnly::SCSITransaction10(CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) { - // promote buf_size to 32bits. - CommandBlockWrapper cbw = CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir); - //SetCurLUN(cdb->LUN); - return (HandleSCSIError(Transaction(&cbw, buf_size, buf))); -} - -/** - * Lock or Unlock the tray or door on device. - * Caution: Some devices with buggy firmware will lock up. - * - * @param lun Logical Unit Number - * @param lock 1 to lock, 0 to unlock - * @return - */ -uint8_t BulkOnly::LockMedia(uint8_t lun, uint8_t lock) { - Notify(PSTR("\r\nLockMedia\r\n"), 0x80); - Notify(PSTR("---------\r\n"), 0x80); - - CDB6_t cdb = CDB6_t(SCSI_CMD_PREVENT_REMOVAL, lun, (uint8_t)0, lock); - return SCSITransaction6(&cdb, (uint16_t)0, nullptr, (uint8_t)MASS_CMD_DIR_IN); -} - -/** - * Media control, for spindle motor and media tray or door. - * This includes CDROM, TAPE and anything with a media loader. - * - * @param lun Logical Unit Number - * @param ctl 0x00 Stop Motor, 0x01 Start Motor, 0x02 Eject Media, 0x03 Load Media - * @return 0 on success - */ -uint8_t BulkOnly::MediaCTL(uint8_t lun, uint8_t ctl) { - Notify(PSTR("\r\nMediaCTL\r\n"), 0x80); - Notify(PSTR("-----------------\r\n"), 0x80); - - uint8_t rcode = MASS_ERR_UNIT_NOT_READY; - if (bAddress) { - CDB6_t cdb = CDB6_t(SCSI_CMD_START_STOP_UNIT, lun, ctl & 0x03, 0); - rcode = SCSITransaction6(&cdb, (uint16_t)0, nullptr, (uint8_t)MASS_CMD_DIR_OUT); - } - else - SetCurLUN(lun); - - return rcode; -} - -/** - * Read data from media - * - * @param lun Logical Unit Number - * @param addr LBA address on media to read - * @param bsize size of a block (we should probably use the cached size) - * @param blocks how many blocks to read - * @param buf memory that is able to hold the requested data - * @return 0 on success - */ -uint8_t BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf) { - if (!LUNOk[lun]) return MASS_ERR_NO_MEDIA; - Notify(PSTR("\r\nRead LUN:\t"), 0x80); - D_PrintHex (lun, 0x90); - Notify(PSTR("\r\nLBA:\t\t"), 0x90); - D_PrintHex (addr, 0x90); - Notify(PSTR("\r\nblocks:\t\t"), 0x90); - D_PrintHex (blocks, 0x90); - Notify(PSTR("\r\nblock size:\t"), 0x90); - D_PrintHex (bsize, 0x90); - Notify(PSTR("\r\n---------\r\n"), 0x80); - CDB10_t cdb = CDB10_t(SCSI_CMD_READ_10, lun, blocks, addr); - -again: - uint8_t er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), buf, (uint8_t)MASS_CMD_DIR_IN); - - if (er == MASS_ERR_STALL) { - MediaCTL(lun, 1); - delay(150); - if (!TestUnitReady(lun)) goto again; - } - return er; -} - -/** - * Write data to media - * - * @param lun Logical Unit Number - * @param addr LBA address on media to write - * @param bsize size of a block (we should probably use the cached size) - * @param blocks how many blocks to write - * @param buf memory that contains the data to write - * @return 0 on success - */ -uint8_t BulkOnly::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf) { - if (!LUNOk[lun]) return MASS_ERR_NO_MEDIA; - if (!WriteOk[lun]) return MASS_ERR_WRITE_PROTECTED; - Notify(PSTR("\r\nWrite LUN:\t"), 0x80); - D_PrintHex (lun, 0x90); - Notify(PSTR("\r\nLBA:\t\t"), 0x90); - D_PrintHex (addr, 0x90); - Notify(PSTR("\r\nblocks:\t\t"), 0x90); - D_PrintHex (blocks, 0x90); - Notify(PSTR("\r\nblock size:\t"), 0x90); - D_PrintHex (bsize, 0x90); - Notify(PSTR("\r\n---------\r\n"), 0x80); - CDB10_t cdb = CDB10_t(SCSI_CMD_WRITE_10, lun, blocks, addr); - -again: - uint8_t er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), (void*)buf, (uint8_t)MASS_CMD_DIR_OUT); - - if (er == MASS_ERR_WRITE_STALL) { - MediaCTL(lun, 1); - delay(150); - if (!TestUnitReady(lun)) goto again; - } - return er; -} - -// End of user functions, the remaining code below is driver internals. -// Only developer serviceable parts below! - -//////////////////////////////////////////////////////////////////////////////// -// Main driver code -//////////////////////////////////////////////////////////////////////////////// - -BulkOnly::BulkOnly(USB *p) : -pUsb(p), -bAddress(0), -bIface(0), -bNumEP(1), -qNextPollTime(0), -bPollEnable(false), -//dCBWTag(0), -bLastUsbError(0) { - ClearAllEP(); - dCBWTag = 0; - if (pUsb) pUsb->RegisterDeviceClass(this); -} - -/** - * USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET == success - * We need to standardize either the rcode, or change the API to return values - * so a signal that additional actions are required can be produced. - * Some of these codes do exist already. - * - * TECHNICAL: We could do most of this code elsewhere, with the exception of checking the class instance. - * Doing so would save some program memory when using multiple drivers. - * - * @param parent USB address of parent - * @param port address of port on parent - * @param lowspeed true if device is low speed - * @return - */ -uint8_t BulkOnly::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) { - - const uint8_t constBufSize = sizeof (USB_FD_DEVICE_DESCRIPTOR); - - uint8_t buf[constBufSize]; - USB_FD_DEVICE_DESCRIPTOR * udd = reinterpret_cast(buf); - uint8_t rcode; - UsbDevice *p = nullptr; - EpInfo *oldep_ptr = nullptr; - USBTRACE("MS ConfigureDevice\r\n"); - ClearAllEP(); - AddressPool &addrPool = pUsb->GetAddressPool(); - - if (bAddress) return USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE; - - // - // Get pointer to pseudo device with address 0 assigned - p = addrPool.GetUsbDevicePtr(0); - if (!p) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - if (!p->epinfo) { - USBTRACE("epinfo\r\n"); - return USB_ERROR_EPINFO_IS_NULL; - } - - // Save old pointer to EP_RECORD of address 0 - oldep_ptr = p->epinfo; - - // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence - p->epinfo = epInfo; - - p->lowspeed = lowspeed; - // Get device descriptor - rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf); - - // Restore p->epinfo - p->epinfo = oldep_ptr; - - if (rcode) goto FailGetDevDescr; - - // Allocate new address according to device class - bAddress = addrPool.AllocAddress(parent, false, port); - - if (!bAddress) return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL; - - // Extract Max Packet Size from the device descriptor - epInfo[0].maxPktSize = udd->bMaxPacketSize0; - // Steal and abuse from epInfo structure to save on memory. - epInfo[1].epAddr = udd->bNumConfigurations; - // - return USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET; - -FailGetDevDescr: - - #ifdef DEBUG_USB_HOST - NotifyFailGetDevDescr(rcode); - #endif - rcode = USB_ERROR_FailGetDevDescr; - - Release(); - return rcode; -} - -/** - * @param parent (not used) - * @param port (not used) - * @param lowspeed true if device is low speed - * @return 0 for success - */ -uint8_t BulkOnly::Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed) { - uint8_t rcode; - uint8_t num_of_conf = epInfo[1].epAddr; // number of configurations - epInfo[1].epAddr = 0; - USBTRACE("MS Init\r\n"); - - AddressPool &addrPool = pUsb->GetAddressPool(); - UsbDevice *p = addrPool.GetUsbDevicePtr(bAddress); - - if (!p) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - // Assign new address to the device - delay(2000); - rcode = pUsb->setAddr(0, 0, bAddress); - - if (rcode) { - p->lowspeed = false; - addrPool.FreeAddress(bAddress); - bAddress = 0; - USBTRACE2("setAddr:", rcode); - return rcode; - } - - USBTRACE2("Addr:", bAddress); - - p->lowspeed = false; - - p = addrPool.GetUsbDevicePtr(bAddress); - - if (!p) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; - - p->lowspeed = lowspeed; - - // Assign epInfo to epinfo pointer - rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo); - - if (rcode) goto FailSetDevTblEntry; - - USBTRACE2("NC:", num_of_conf); - - for (uint8_t i = 0; i < num_of_conf; i++) { - ConfigDescParser< USB_CLASS_MASS_STORAGE, - MASS_SUBCLASS_SCSI, - MASS_PROTO_BBB, - CP_MASK_COMPARE_CLASS | - CP_MASK_COMPARE_SUBCLASS | - CP_MASK_COMPARE_PROTOCOL > BulkOnlyParser(this); - - rcode = pUsb->getConfDescr(bAddress, 0, i, &BulkOnlyParser); - - if (rcode) goto FailGetConfDescr; - - if (bNumEP > 1) break; - } - - if (bNumEP < 3) return USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED; - - // Assign epInfo to epinfo pointer - pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo); - - USBTRACE2("Conf:", bConfNum); - - // Set Configuration Value - rcode = pUsb->setConf(bAddress, 0, bConfNum); - - if (rcode) goto FailSetConfDescr; - - //Linux does a 1sec delay after this. - delay(1000); - - rcode = GetMaxLUN(&bMaxLUN); - if (rcode) goto FailGetMaxLUN; - - if (bMaxLUN >= MASS_MAX_SUPPORTED_LUN) bMaxLUN = MASS_MAX_SUPPORTED_LUN - 1; - ErrorMessage (PSTR("MaxLUN"), bMaxLUN); - - delay(1000); // Delay a bit for slow firmware. - - for (uint8_t lun = 0; lun <= bMaxLUN; lun++) { - InquiryResponse response; - rcode = Inquiry(lun, sizeof (InquiryResponse), (uint8_t*) & response); - if (rcode) { - ErrorMessage (PSTR("Inquiry"), rcode); - } - else { - #if 0 - printf("LUN %i `", lun); - uint8_t *buf = response.VendorID; - for (int i = 0; i < 28; i++) printf("%c", buf[i]); - printf("'\r\nQualifier %1.1X ", response.PeripheralQualifier); - printf("Device type %2.2X ", response.DeviceType); - printf("RMB %1.1X ", response.Removable); - printf("SSCS %1.1X ", response.SCCS); - uint8_t sv = response.Version; - printf("SCSI version %2.2X\r\nDevice conforms to ", sv); - switch (sv) { - case 0: - printf("No specific"); - break; - case 1: - printf("ANSI X3.131-1986 (ANSI 1)"); - break; - case 2: - printf("ANSI X3.131-1994 (ANSI 2)"); - break; - case 3: - printf("ANSI INCITS 301-1997 (SPC)"); - break; - case 4: - printf("ANSI INCITS 351-2001 (SPC-2)"); - break; - case 5: - printf("ANSI INCITS 408-2005 (SPC-4)"); - break; - case 6: - printf("T10/1731-D (SPC-4)"); - break; - default: printf("unknown"); - } - printf(" standards.\r\n"); - #endif - - uint8_t tries = 0xF0; - while ((rcode = TestUnitReady(lun))) { - if (rcode == 0x08) break; // break on no media, this is OK to do. - // try to lock media and spin up - if (tries < 14) { - LockMedia(lun, 1); - MediaCTL(lun, 1); // I actually have a USB stick that needs this! - } else - delay(2 * (tries + 1)); - tries++; - if (!tries) break; - } - if (!rcode) { - delay(1000); - LUNOk[lun] = CheckLUN(lun); - if (!LUNOk[lun]) LUNOk[lun] = CheckLUN(lun); - } - } - } - - CheckMedia(); - - rcode = OnInit(); - - if (rcode) goto FailOnInit; - - #ifdef DEBUG_USB_HOST - USBTRACE("MS configured\r\n\r\n"); - #endif - - bPollEnable = true; - - //USBTRACE("Poll enabled\r\n"); - return 0; - - FailSetConfDescr: - - #ifdef DEBUG_USB_HOST - NotifyFailSetConfDescr(); - goto Fail; - #endif - - FailOnInit: - - #ifdef DEBUG_USB_HOST - USBTRACE("OnInit:"); - goto Fail; - #endif - - FailGetMaxLUN: - - #ifdef DEBUG_USB_HOST - USBTRACE("GetMaxLUN:"); - goto Fail; - #endif - - //#ifdef DEBUG_USB_HOST - // FailInvalidSectorSize: - // USBTRACE("Sector Size is NOT VALID: "); - // goto Fail; - //#endif - - FailSetDevTblEntry: - #ifdef DEBUG_USB_HOST - NotifyFailSetDevTblEntry(); - goto Fail; - #endif - - FailGetConfDescr: - #ifdef DEBUG_USB_HOST - NotifyFailGetConfDescr(); - #endif - - #ifdef DEBUG_USB_HOST - Fail: - NotifyFail(rcode); - #endif - Release(); - return rcode; -} - -/** - * For driver use only. - * - * @param conf - * @param iface - * @param alt - * @param proto - * @param pep - */ -void BulkOnly::EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto __attribute__((unused)), const USB_FD_ENDPOINT_DESCRIPTOR * pep) { - ErrorMessage (PSTR("Conf.Val"), conf); - ErrorMessage (PSTR("Iface Num"), iface); - ErrorMessage (PSTR("Alt.Set"), alt); - - bConfNum = conf; - - uint8_t index; - - #if 1 - if ((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_BULK) { - index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex; - // Fill in the endpoint info structure - epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F); - epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize; - epInfo[index].bmSndToggle = 0; - epInfo[index].bmRcvToggle = 0; - - bNumEP++; - - PrintEndpointDescriptor(pep); - } - #else - if ((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80) - index = epInterruptInIndex; - else if ((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_BULK) - index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex; - else - return; - - // Fill in the endpoint info structure - epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F); - epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize; - epInfo[index].bmSndToggle = 0; - epInfo[index].bmRcvToggle = 0; - - bNumEP++; - - PrintEndpointDescriptor(pep); - #endif -} - -/** - * For driver use only. - * - * @return - */ -uint8_t BulkOnly::Release() { - ClearAllEP(); - pUsb->GetAddressPool().FreeAddress(bAddress); - return 0; -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @return true if LUN is ready for use. - */ -bool BulkOnly::CheckLUN(uint8_t lun) { - uint8_t rcode; - Capacity capacity; - for (uint8_t i = 0; i < 8; i++) capacity.data[i] = 0; - - rcode = ReadCapacity10(lun, (uint8_t*)capacity.data); - if (rcode) { - //printf(">>>>>>>>>>>>>>>>ReadCapacity returned %i\r\n", rcode); - return false; - } - ErrorMessage (PSTR(">>>>>>>>>>>>>>>>CAPACITY OK ON LUN"), lun); - for (uint8_t i = 0; i < 8 /*sizeof (Capacity)*/; i++) - D_PrintHex (capacity.data[i], 0x80); - Notify(PSTR("\r\n\r\n"), 0x80); - - // Only 512/1024/2048/4096 are valid values! - uint32_t c = BMAKE32(capacity.data[4], capacity.data[5], capacity.data[6], capacity.data[7]); - if (c != 0x0200UL && c != 0x0400UL && c != 0x0800UL && c != 0x1000UL) return false; - - // Store capacity information. - CurrentSectorSize[lun] = (uint16_t)(c); // & 0xFFFF); - - CurrentCapacity[lun] = BMAKE32(capacity.data[0], capacity.data[1], capacity.data[2], capacity.data[3]) + 1; - if (CurrentCapacity[lun] == /*0xFFFFFFFFUL */ 0x01UL || CurrentCapacity[lun] == 0x00UL) { - // Buggy firmware will report 0xFFFFFFFF or 0 for no media - if (CurrentCapacity[lun]) - ErrorMessage (PSTR(">>>>>>>>>>>>>>>>BUGGY FIRMWARE. CAPACITY FAIL ON LUN"), lun); - return false; - } - delay(20); - Page3F(lun); - return !TestUnitReady(lun); -} - -/** - * For driver use only. - * - * Scan for media change on all LUNs - */ -void BulkOnly::CheckMedia() { - for (uint8_t lun = 0; lun <= bMaxLUN; lun++) { - if (TestUnitReady(lun)) { - LUNOk[lun] = false; - continue; - } - if (!LUNOk[lun]) LUNOk[lun] = CheckLUN(lun); - } - #if 0 - printf("}}}}}}}}}}}}}}}}STATUS "); - for (uint8_t lun = 0; lun <= bMaxLUN; lun++) - printf(LUNOk[lun] ? "#" : "."); - printf("\r\n"); - #endif - qNextPollTime = (uint32_t)millis() + 2000; -} - -/** - * For driver use only. - * - * @return - */ -uint8_t BulkOnly::Poll() { - //uint8_t rcode = 0; - if (!bPollEnable) return 0; - if ((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) CheckMedia(); - //rcode = 0; - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// SCSI code -//////////////////////////////////////////////////////////////////////////////// - -/** - * For driver use only. - * - * @param plun - * @return - */ -uint8_t BulkOnly::GetMaxLUN(uint8_t *plun) { - uint8_t ret = pUsb->ctrlReq(bAddress, 0, bmREQ_MASSIN, MASS_REQ_GET_MAX_LUN, 0, 0, bIface, 1, 1, plun, nullptr); - - if (ret == hrSTALL) - *plun = 0; - - return 0; -} - -/** - * For driver use only. Used during Driver Init - * - * @param lun Logical Unit Number - * @param bsize - * @param buf - * @return - */ -uint8_t BulkOnly::Inquiry(uint8_t lun, uint16_t bsize, uint8_t *buf) { - Notify(PSTR("\r\nInquiry\r\n"), 0x80); - Notify(PSTR("---------\r\n"), 0x80); - - CDB6_t cdb = CDB6_t(SCSI_CMD_INQUIRY, lun, 0UL, (uint8_t)bsize, 0); - uint8_t rc = SCSITransaction6(&cdb, bsize, buf, (uint8_t)MASS_CMD_DIR_IN); - - return rc; -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @return - */ -uint8_t BulkOnly::TestUnitReady(uint8_t lun) { - //SetCurLUN(lun); - if (!bAddress) - return MASS_ERR_UNIT_NOT_READY; - - Notify(PSTR("\r\nTestUnitReady\r\n"), 0x80); - Notify(PSTR("-----------------\r\n"), 0x80); - - CDB6_t cdb = CDB6_t(SCSI_CMD_TEST_UNIT_READY, lun, (uint8_t)0, 0); - return SCSITransaction6(&cdb, 0, nullptr, (uint8_t)MASS_CMD_DIR_IN); - -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @param pc - * @param page - * @param subpage - * @param len - * @param pbuf - * @return - */ -uint8_t BulkOnly::ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t * pbuf) { - Notify(PSTR("\r\rModeSense\r\n"), 0x80); - Notify(PSTR("------------\r\n"), 0x80); - - CDB6_t cdb = CDB6_t(SCSI_CMD_MODE_SENSE_6, lun, (uint32_t)((((pc << 6) | page) << 8) | subpage), len, 0); - return SCSITransaction6(&cdb, len, pbuf, (uint8_t)MASS_CMD_DIR_IN); -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @param bsize - * @param buf - * @return - */ -uint8_t BulkOnly::ReadCapacity10(uint8_t lun, uint8_t *buf) { - Notify(PSTR("\r\nReadCapacity\r\n"), 0x80); - Notify(PSTR("---------------\r\n"), 0x80); - - CDB10_t cdb = CDB10_t(SCSI_CMD_READ_CAPACITY_10, lun); - return SCSITransaction10(&cdb, 8, buf, (uint8_t)MASS_CMD_DIR_IN); -} - -/** - * For driver use only. - * - * Page 3F contains write protect status. - * - * @param lun Logical Unit Number to test. - * @return Write protect switch status. - */ -uint8_t BulkOnly::Page3F(uint8_t lun) { - uint8_t buf[192]; - for (int i = 0; i < 192; i++) { - buf[i] = 0x00; - } - WriteOk[lun] = true; - #ifdef SKIP_WRITE_PROTECT - return 0; - #endif - uint8_t rc = ModeSense6(lun, 0, 0x3F, 0, 192, buf); - if (!rc) { - WriteOk[lun] = ((buf[2] & 0x80) == 0); - Notify(PSTR("Mode Sense: "), 0x80); - for (int i = 0; i < 4; i++) { - D_PrintHex (buf[i], 0x80); - Notify(PSTR(" "), 0x80); - } - Notify(PSTR("\r\n"), 0x80); - } - return rc; -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @param size - * @param buf - * @return - */ -uint8_t BulkOnly::RequestSense(uint8_t lun, uint16_t size, uint8_t *buf) { - Notify(PSTR("\r\nRequestSense\r\n"), 0x80); - Notify(PSTR("----------------\r\n"), 0x80); - - CDB6_t cdb = CDB6_t(SCSI_CMD_REQUEST_SENSE, lun, 0UL, (uint8_t)size, 0); - CommandBlockWrapper cbw = CommandBlockWrapper(++dCBWTag, (uint32_t)size, &cdb, (uint8_t)MASS_CMD_DIR_IN); - //SetCurLUN(lun); - return Transaction(&cbw, size, buf); -} - - -//////////////////////////////////////////////////////////////////////////////// -// USB code -//////////////////////////////////////////////////////////////////////////////// - -/** - * For driver use only. - * - * @param index - * @return - */ -uint8_t BulkOnly::ClearEpHalt(uint8_t index) { - if (index == 0) - return 0; - - uint8_t ret = 0; - - while ((ret = (pUsb->ctrlReq(bAddress, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT, USB_REQUEST_CLEAR_FEATURE, USB_FEATURE_ENDPOINT_HALT, 0, ((index == epDataInIndex) ? (0x80 | epInfo[index].epAddr) : epInfo[index].epAddr), 0, 0, nullptr, nullptr)) == 0x01)) - delay(6); - - if (ret) { - ErrorMessage (PSTR("ClearEpHalt"), ret); - ErrorMessage (PSTR("EP"), ((index == epDataInIndex) ? (0x80 | epInfo[index].epAddr) : epInfo[index].epAddr)); - return ret; - } - epInfo[index].bmSndToggle = 0; - epInfo[index].bmRcvToggle = 0; - return 0; -} - -/** - * For driver use only. - */ -void BulkOnly::Reset() { - while (pUsb->ctrlReq(bAddress, 0, bmREQ_MASSOUT, MASS_REQ_BOMSR, 0, 0, bIface, 0, 0, nullptr, nullptr) == 0x01) delay(6); -} - -/** - * For driver use only. - * - * @return 0 if successful - */ -uint8_t BulkOnly::ResetRecovery() { - Notify(PSTR("\r\nResetRecovery\r\n"), 0x80); - Notify(PSTR("-----------------\r\n"), 0x80); - - delay(6); - Reset(); - delay(6); - ClearEpHalt(epDataInIndex); - delay(6); - bLastUsbError = ClearEpHalt(epDataOutIndex); - delay(6); - return bLastUsbError; -} - -/** - * For driver use only. - * - * Clear all EP data and clear all LUN status - */ -void BulkOnly::ClearAllEP() { - for (uint8_t i = 0; i < MASS_MAX_ENDPOINTS; i++) { - epInfo[i].epAddr = 0; - epInfo[i].maxPktSize = (i) ? 0 : 8; - epInfo[i].bmSndToggle = 0; - epInfo[i].bmRcvToggle = 0; - epInfo[i].bmNakPower = USB_NAK_DEFAULT; - } - - for (uint8_t i = 0; i < MASS_MAX_SUPPORTED_LUN; i++) { - LUNOk[i] = false; - WriteOk[i] = false; - CurrentCapacity[i] = 0UL; - CurrentSectorSize[i] = 0; - } - - bIface = 0; - bNumEP = 1; - bAddress = 0; - qNextPollTime = 0; - bPollEnable = false; - bLastUsbError = 0; - bMaxLUN = 0; - bTheLUN = 0; -} - -/** - * For driver use only. - * - * @param pcsw - * @param pcbw - * @return - */ -bool BulkOnly::IsValidCSW(CommandStatusWrapper *pcsw, CommandBlockWrapperBase *pcbw) { - if (pcsw->dCSWSignature != MASS_CSW_SIGNATURE) { - Notify(PSTR("CSW:Sig error\r\n"), 0x80); - return false; - } - if (pcsw->dCSWTag != pcbw->dCBWTag) { - Notify(PSTR("CSW:Wrong tag\r\n"), 0x80); - return false; - } - return true; -} - -/** - * For driver use only. - * - * @param error - * @param index - * @return - */ -uint8_t BulkOnly::HandleUsbError(uint8_t error, uint8_t index) { - uint8_t count = 3; - - bLastUsbError = error; - //if (error) - //ClearEpHalt(index); - while (error && count) { - if (error != hrSUCCESS) { - ErrorMessage (PSTR("USB Error"), error); - ErrorMessage (PSTR("Index"), index); - } - switch (error) { - // case hrWRONGPID: - case hrSUCCESS: return MASS_ERR_SUCCESS; - case hrBUSY: return MASS_ERR_UNIT_BUSY; // SIE is busy, just hang out and try again. - case hrTIMEOUT: - case hrJERR: return MASS_ERR_DEVICE_DISCONNECTED; - case hrSTALL: - if (index) { - ClearEpHalt(index); - return (index == epDataInIndex) ? MASS_ERR_STALL : MASS_ERR_WRITE_STALL; - } - return MASS_ERR_STALL; - - case hrNAK: - return index ? MASS_ERR_UNIT_BUSY : MASS_ERR_UNIT_BUSY; - - case hrTOGERR: - // Handle a super rare corner case, where toggles become de-synced. - // I've only run into one device that has this firmware bug, and this is - // the only clean way to get back into sync with the buggy device firmware. - // --AJK - if (bAddress && bConfNum) { - error = pUsb->setConf(bAddress, 0, bConfNum); - if (error) break; - } - return MASS_ERR_SUCCESS; - default: - ErrorMessage (PSTR("\r\nUSB"), error); - return MASS_ERR_GENERAL_USB_ERROR; - } - count--; - } // while - - return ((error && !count) ? MASS_ERR_GENERAL_USB_ERROR : MASS_ERR_SUCCESS); -} - -#if MS_WANT_PARSER - uint8_t BulkOnly::Transaction(CommandBlockWrapper *pcbw, uint16_t buf_size, void *buf) { - return Transaction(CommandBlockWrapper *pcbw, uint16_t buf_size, void *buf, 0); - } -#endif - -/** - * For driver use only. - * - * @param pcbw - * @param buf_size - * @param buf - * @param flags - * @return - */ -uint8_t BulkOnly::Transaction(CommandBlockWrapper *pcbw, uint16_t buf_size, void *buf - #if MS_WANT_PARSER - , uint8_t flags - #endif -) { - #if MS_WANT_PARSER - uint16_t bytes = (pcbw->dCBWDataTransferLength > buf_size) ? buf_size : pcbw->dCBWDataTransferLength; - printf("Transfersize %i\r\n", bytes); - delay(1000); - - bool callback = (flags & MASS_TRANS_FLG_CALLBACK) == MASS_TRANS_FLG_CALLBACK; - #else - uint16_t bytes = buf_size; - #endif - - bool write = (pcbw->bmCBWFlags & MASS_CMD_DIR_IN) != MASS_CMD_DIR_IN; - uint8_t ret = 0; - uint8_t usberr; - CommandStatusWrapper csw; // up here, we allocate ahead to save cpu cycles. - SetCurLUN(pcbw->bmCBWLUN); - ErrorMessage (PSTR("CBW.dCBWTag"), pcbw->dCBWTag); - - while ((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, sizeof (CommandBlockWrapper), (uint8_t*)pcbw)) == hrBUSY) delay(1); - - ret = HandleUsbError(usberr, epDataOutIndex); - //ret = HandleUsbError(pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, sizeof (CommandBlockWrapper), (uint8_t*)pcbw), epDataOutIndex); - if (ret) - ErrorMessage (PSTR("============================ CBW"), ret); - else { - if (bytes) { - if (!write) { - #if MS_WANT_PARSER - if (callback) { - uint8_t rbuf[bytes]; - while ((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, rbuf)) == hrBUSY) delay(1); - if (usberr == hrSUCCESS) ((USBReadParser*)buf)->Parse(bytes, rbuf, 0); - } - else - #endif - { - while ((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*)buf)) == hrBUSY) delay(1); - } - ret = HandleUsbError(usberr, epDataInIndex); - } - else { - while ((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, bytes, (uint8_t*)buf)) == hrBUSY) delay(1); - ret = HandleUsbError(usberr, epDataOutIndex); - } - if (ret) ErrorMessage (PSTR("============================ DAT"), ret); - } - } - - bytes = sizeof (CommandStatusWrapper); - int tries = 2; - while (tries--) { - while ((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*) & csw)) == hrBUSY) delay(1); - if (!usberr) break; - ClearEpHalt(epDataInIndex); - if (tries) ResetRecovery(); - } - - if (!ret) { - Notify(PSTR("CBW:\t\tOK\r\n"), 0x80); - Notify(PSTR("Data Stage:\tOK\r\n"), 0x80); - } - else { - // Throw away csw, IT IS NOT OF ANY USE. - ResetRecovery(); - return ret; - } - - ret = HandleUsbError(usberr, epDataInIndex); - if (ret) ErrorMessage (PSTR("============================ CSW"), ret); - - if (usberr == hrSUCCESS) { - if (IsValidCSW(&csw, pcbw)) { - //ErrorMessage (PSTR("CSW.dCBWTag"), csw.dCSWTag); - //ErrorMessage (PSTR("bCSWStatus"), csw.bCSWStatus); - //ErrorMessage (PSTR("dCSWDataResidue"), csw.dCSWDataResidue); - Notify(PSTR("CSW:\t\tOK\r\n\r\n"), 0x80); - return csw.bCSWStatus; - } - else { - // NOTE! Sometimes this is caused by the reported residue being wrong. - // Get a different device. It isn't compliant, and should have never passed Q&A. - // I own one... 05e3:0701 Genesys Logic, Inc. USB 2.0 IDE Adapter. - // Other devices that exhibit this behavior exist in the wild too. - // Be sure to check quirks in the Linux source code before reporting a bug. --xxxajk - Notify(PSTR("Invalid CSW\r\n"), 0x80); - ResetRecovery(); - //return MASS_ERR_SUCCESS; - return MASS_ERR_INVALID_CSW; - } - } - return ret; -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @return - */ -uint8_t BulkOnly::SetCurLUN(uint8_t lun) { - if (lun > bMaxLUN) return MASS_ERR_INVALID_LUN; - bTheLUN = lun; - return MASS_ERR_SUCCESS; -} - -/** - * For driver use only. - * - * @param status - * @return - */ -uint8_t BulkOnly::HandleSCSIError(uint8_t status) { - uint8_t ret = 0; - - switch (status) { - case 0: return MASS_ERR_SUCCESS; - - case 2: - ErrorMessage (PSTR("Phase Error"), status); - ErrorMessage (PSTR("LUN"), bTheLUN); - ResetRecovery(); - return MASS_ERR_GENERAL_SCSI_ERROR; - - case 1: - ErrorMessage (PSTR("SCSI Error"), status); - ErrorMessage (PSTR("LUN"), bTheLUN); - RequestSenseResponce rsp; - - ret = RequestSense(bTheLUN, sizeof (RequestSenseResponce), (uint8_t*) & rsp); - - if (ret) return MASS_ERR_GENERAL_SCSI_ERROR; - - ErrorMessage (PSTR("Response Code"), rsp.bResponseCode); - if (rsp.bResponseCode & 0x80) { - Notify(PSTR("Information field: "), 0x80); - for (int i = 0; i < 4; i++) { - D_PrintHex (rsp.CmdSpecificInformation[i], 0x80); - Notify(PSTR(" "), 0x80); - } - Notify(PSTR("\r\n"), 0x80); - } - ErrorMessage (PSTR("Sense Key"), rsp.bmSenseKey); - ErrorMessage (PSTR("Add Sense Code"), rsp.bAdditionalSenseCode); - ErrorMessage (PSTR("Add Sense Qual"), rsp.bAdditionalSenseQualifier); - // warning, this is not testing ASQ, only SK and ASC. - switch (rsp.bmSenseKey) { - case SCSI_S_UNIT_ATTENTION: - switch (rsp.bAdditionalSenseCode) { - case SCSI_ASC_MEDIA_CHANGED: - return MASS_ERR_MEDIA_CHANGED; - default: - return MASS_ERR_UNIT_NOT_READY; - } - case SCSI_S_NOT_READY: - switch (rsp.bAdditionalSenseCode) { - case SCSI_ASC_MEDIUM_NOT_PRESENT: - return MASS_ERR_NO_MEDIA; - default: - return MASS_ERR_UNIT_NOT_READY; - } - case SCSI_S_ILLEGAL_REQUEST: - switch (rsp.bAdditionalSenseCode) { - case SCSI_ASC_LBA_OUT_OF_RANGE: - return MASS_ERR_BAD_LBA; - default: - return MASS_ERR_CMD_NOT_SUPPORTED; - } - default: - return MASS_ERR_GENERAL_SCSI_ERROR; - } - - // case 4: return MASS_ERR_UNIT_BUSY; // Busy means retry later. - // case 0x05/0x14: we stalled out - // case 0x15/0x16: we naked out. - default: - ErrorMessage (PSTR("Gen SCSI Err"), status); - ErrorMessage (PSTR("LUN"), bTheLUN); - return status; - } // switch -} - - -//////////////////////////////////////////////////////////////////////////////// -// Debugging code -//////////////////////////////////////////////////////////////////////////////// - -/** - * @param ep_ptr - */ -void BulkOnly::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) { - Notify(PSTR("Endpoint descriptor:"), 0x80); - Notify(PSTR("\r\nLength:\t\t"), 0x80); - D_PrintHex (ep_ptr->bLength, 0x80); - Notify(PSTR("\r\nType:\t\t"), 0x80); - D_PrintHex (ep_ptr->bDescriptorType, 0x80); - Notify(PSTR("\r\nAddress:\t"), 0x80); - D_PrintHex (ep_ptr->bEndpointAddress, 0x80); - Notify(PSTR("\r\nAttributes:\t"), 0x80); - D_PrintHex (ep_ptr->bmAttributes, 0x80); - Notify(PSTR("\r\nMaxPktSize:\t"), 0x80); - D_PrintHex (ep_ptr->wMaxPacketSize, 0x80); - Notify(PSTR("\r\nPoll Intrv:\t"), 0x80); - D_PrintHex (ep_ptr->bInterval, 0x80); - Notify(PSTR("\r\n"), 0x80); -} - -//////////////////////////////////////////////////////////////////////////////// -// misc/to kill/to-do -//////////////////////////////////////////////////////////////////////////////// - -/* We won't be needing this... */ -uint8_t BulkOnly::Read(uint8_t lun __attribute__((unused)), uint32_t addr __attribute__((unused)), uint16_t bsize __attribute__((unused)), uint8_t blocks __attribute__((unused)), USBReadParser * prs __attribute__((unused))) { - #if MS_WANT_PARSER - if (!LUNOk[lun]) return MASS_ERR_NO_MEDIA; - Notify(PSTR("\r\nRead (With parser)\r\n"), 0x80); - Notify(PSTR("---------\r\n"), 0x80); - - CommandBlockWrapper cbw = CommandBlockWrapper(); - - cbw.dCBWSignature = MASS_CBW_SIGNATURE; - cbw.dCBWTag = ++dCBWTag; - cbw.dCBWDataTransferLength = ((uint32_t)bsize * blocks); - cbw.bmCBWFlags = MASS_CMD_DIR_IN, - cbw.bmCBWLUN = lun; - cbw.bmCBWCBLength = 10; - - cbw.CBWCB[0] = SCSI_CMD_READ_10; - cbw.CBWCB[8] = blocks; - cbw.CBWCB[2] = ((addr >> 24) & 0xFF); - cbw.CBWCB[3] = ((addr >> 16) & 0xFF); - cbw.CBWCB[4] = ((addr >> 8) & 0xFF); - cbw.CBWCB[5] = (addr & 0xFF); - - return HandleSCSIError(Transaction(&cbw, bsize, prs, 1)); - #else - return MASS_ERR_NOT_IMPLEMENTED; - #endif -} - -#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h deleted file mode 100644 index 25df006e51..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h +++ /dev/null @@ -1,562 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ - -#pragma once - -// Cruft removal, makes driver smaller, faster. -#ifndef MS_WANT_PARSER - #define MS_WANT_PARSER 0 -#endif - -#include "Usb.h" - -#define bmREQ_MASSOUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE -#define bmREQ_MASSIN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE - -// Mass Storage Subclass Constants -#define MASS_SUBCLASS_SCSI_NOT_REPORTED 0x00 // De facto use -#define MASS_SUBCLASS_RBC 0x01 -#define MASS_SUBCLASS_ATAPI 0x02 // MMC-5 (ATAPI) -#define MASS_SUBCLASS_OBSOLETE1 0x03 // Was QIC-157 -#define MASS_SUBCLASS_UFI 0x04 // Specifies how to interface Floppy Disk Drives to USB -#define MASS_SUBCLASS_OBSOLETE2 0x05 // Was SFF-8070i -#define MASS_SUBCLASS_SCSI 0x06 // SCSI Transparent Command Set -#define MASS_SUBCLASS_LSDFS 0x07 // Specifies how host has to negotiate access before trying SCSI -#define MASS_SUBCLASS_IEEE1667 0x08 - -// Mass Storage Class Protocols -#define MASS_PROTO_CBI 0x00 // CBI (with command completion interrupt) -#define MASS_PROTO_CBI_NO_INT 0x01 // CBI (without command completion interrupt) -#define MASS_PROTO_OBSOLETE 0x02 -#define MASS_PROTO_BBB 0x50 // Bulk Only Transport -#define MASS_PROTO_UAS 0x62 - -// Request Codes -#define MASS_REQ_ADSC 0x00 -#define MASS_REQ_GET 0xFC -#define MASS_REQ_PUT 0xFD -#define MASS_REQ_GET_MAX_LUN 0xFE -#define MASS_REQ_BOMSR 0xFF // Bulk-Only Mass Storage Reset - -#define MASS_CBW_SIGNATURE 0x43425355 -#define MASS_CSW_SIGNATURE 0x53425355 - -#define MASS_CMD_DIR_OUT 0 // (0 << 7) -#define MASS_CMD_DIR_IN 0x80 //(1 << 7) - -/* - * Reference documents from T10 (https://www.t10.org) - * SCSI Primary Commands - 3 (SPC-3) - * SCSI Block Commands - 2 (SBC-2) - * Multi-Media Commands - 5 (MMC-5) - */ - -/* Group 1 commands (CDB's here are should all be 6-bytes) */ -#define SCSI_CMD_TEST_UNIT_READY 0x00 -#define SCSI_CMD_REQUEST_SENSE 0x03 -#define SCSI_CMD_FORMAT_UNIT 0x04 -#define SCSI_CMD_READ_6 0x08 -#define SCSI_CMD_WRITE_6 0x0A -#define SCSI_CMD_INQUIRY 0x12 -#define SCSI_CMD_MODE_SELECT_6 0x15 -#define SCSI_CMD_MODE_SENSE_6 0x1A -#define SCSI_CMD_START_STOP_UNIT 0x1B -#define SCSI_CMD_PREVENT_REMOVAL 0x1E -/* Group 2 Commands (CDB's here are 10-bytes) */ -#define SCSI_CMD_READ_FORMAT_CAPACITIES 0x23 -#define SCSI_CMD_READ_CAPACITY_10 0x25 -#define SCSI_CMD_READ_10 0x28 -#define SCSI_CMD_WRITE_10 0x2A -#define SCSI_CMD_SEEK_10 0x2B -#define SCSI_CMD_ERASE_10 0x2C -#define SCSI_CMD_WRITE_AND_VERIFY_10 0x2E -#define SCSI_CMD_VERIFY_10 0x2F -#define SCSI_CMD_SYNCHRONIZE_CACHE 0x35 -#define SCSI_CMD_WRITE_BUFFER 0x3B -#define SCSI_CMD_READ_BUFFER 0x3C -#define SCSI_CMD_READ_SUBCHANNEL 0x42 -#define SCSI_CMD_READ_TOC 0x43 -#define SCSI_CMD_READ_HEADER 0x44 -#define SCSI_CMD_PLAY_AUDIO_10 0x45 -#define SCSI_CMD_GET_CONFIGURATION 0x46 -#define SCSI_CMD_PLAY_AUDIO_MSF 0x47 -#define SCSI_CMD_PLAY_AUDIO_TI 0x48 -#define SCSI_CMD_PLAY_TRACK_REL_10 0x49 -#define SCSI_CMD_GET_EVENT_STATUS 0x4A -#define SCSI_CMD_PAUSE_RESUME 0x4B -#define SCSI_CMD_READ_DISC_INFORMATION 0x51 -#define SCSI_CMD_READ_TRACK_INFORMATION 0x52 -#define SCSI_CMD_RESERVE_TRACK 0x53 -#define SCSI_CMD_SEND_OPC_INFORMATION 0x54 -#define SCSI_CMD_MODE_SELECT_10 0x55 -#define SCSI_CMD_REPAIR_TRACK 0x58 -#define SCSI_CMD_MODE_SENSE_10 0x5A -#define SCSI_CMD_CLOSE_TRACK_SESSION 0x5B -#define SCSI_CMD_READ_BUFFER_CAPACITY 0x5C -#define SCSI_CMD_SEND_CUE_SHEET 0x5D -/* Group 5 Commands (CDB's here are 12-bytes) */ -#define SCSI_CMD_REPORT_LUNS 0xA0 -#define SCSI_CMD_BLANK 0xA1 -#define SCSI_CMD_SECURITY_PROTOCOL_IN 0xA2 -#define SCSI_CMD_SEND_KEY 0xA3 -#define SCSI_CMD_REPORT_KEY 0xA4 -#define SCSI_CMD_PLAY_AUDIO_12 0xA5 -#define SCSI_CMD_LOAD_UNLOAD 0xA6 -#define SCSI_CMD_SET_READ_AHEAD 0xA7 -#define SCSI_CMD_READ_12 0xA8 -#define SCSI_CMD_PLAY_TRACK_REL_12 0xA9 -#define SCSI_CMD_WRITE_12 0xAA -#define SCSI_CMD_READ_MEDIA_SERIAL_12 0xAB -#define SCSI_CMD_GET_PERFORMANCE 0xAC -#define SCSI_CMD_READ_DVD_STRUCTURE 0xAD -#define SCSI_CMD_SECURITY_PROTOCOL_OUT 0xB5 -#define SCSI_CMD_SET_STREAMING 0xB6 -#define SCSI_CMD_READ_MSF 0xB9 -#define SCSI_CMD_SET_SPEED 0xBB -#define SCSI_CMD_MECHANISM_STATUS 0xBD -#define SCSI_CMD_READ_CD 0xBE -#define SCSI_CMD_SEND_DISC_STRUCTURE 0xBF -/* Vendor-unique Commands, included for completeness */ -#define SCSI_CMD_CD_PLAYBACK_STATUS 0xC4 /* SONY unique */ -#define SCSI_CMD_PLAYBACK_CONTROL 0xC9 /* SONY unique */ -#define SCSI_CMD_READ_CDDA 0xD8 /* Vendor unique */ -#define SCSI_CMD_READ_CDXA 0xDB /* Vendor unique */ -#define SCSI_CMD_READ_ALL_SUBCODES 0xDF /* Vendor unique */ - -/* SCSI error codes */ -#define SCSI_S_NOT_READY 0x02 -#define SCSI_S_MEDIUM_ERROR 0x03 -#define SCSI_S_ILLEGAL_REQUEST 0x05 -#define SCSI_S_UNIT_ATTENTION 0x06 -#define SCSI_ASC_LBA_OUT_OF_RANGE 0x21 -#define SCSI_ASC_MEDIA_CHANGED 0x28 -#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3A - -/* USB error codes */ -#define MASS_ERR_SUCCESS 0x00 -#define MASS_ERR_PHASE_ERROR 0x02 -#define MASS_ERR_UNIT_NOT_READY 0x03 -#define MASS_ERR_UNIT_BUSY 0x04 -#define MASS_ERR_STALL 0x05 -#define MASS_ERR_CMD_NOT_SUPPORTED 0x06 -#define MASS_ERR_INVALID_CSW 0x07 -#define MASS_ERR_NO_MEDIA 0x08 -#define MASS_ERR_BAD_LBA 0x09 -#define MASS_ERR_MEDIA_CHANGED 0x0A -#define MASS_ERR_DEVICE_DISCONNECTED 0x11 -#define MASS_ERR_UNABLE_TO_RECOVER 0x12 // Reset recovery error -#define MASS_ERR_INVALID_LUN 0x13 -#define MASS_ERR_WRITE_STALL 0x14 -#define MASS_ERR_READ_NAKS 0x15 -#define MASS_ERR_WRITE_NAKS 0x16 -#define MASS_ERR_WRITE_PROTECTED 0x17 -#define MASS_ERR_NOT_IMPLEMENTED 0xFD -#define MASS_ERR_GENERAL_SCSI_ERROR 0xFE -#define MASS_ERR_GENERAL_USB_ERROR 0xFF -#define MASS_ERR_USER 0xA0 // For subclasses to define their own error codes - -#define MASS_TRANS_FLG_CALLBACK 0x01 // Callback is involved -#define MASS_TRANS_FLG_NO_STALL_CHECK 0x02 // STALL condition is not checked -#define MASS_TRANS_FLG_NO_PHASE_CHECK 0x04 // PHASE_ERROR is not checked - -#define MASS_MAX_ENDPOINTS 3 - -struct Capacity { - uint8_t data[8]; - //uint32_t dwBlockAddress; - //uint32_t dwBlockLength; -} __attribute__((packed)); - -struct BASICCDB { - uint8_t Opcode; - - unsigned unused : 5; - unsigned LUN : 3; - - uint8_t info[12]; -} __attribute__((packed)); - -typedef BASICCDB BASICCDB_t; - -struct CDB6 { - uint8_t Opcode; - - unsigned LBAMSB : 5; - unsigned LUN : 3; - - uint8_t LBAHB; - uint8_t LBALB; - uint8_t AllocationLength; - uint8_t Control; - -public: - - CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control) : - Opcode(_Opcode), LBAMSB(BGRAB2(LBA) & 0x1F), LUN(_LUN), LBAHB(BGRAB1(LBA)), LBALB(BGRAB0(LBA)), - AllocationLength(_AllocationLength), Control(_Control) { - } - - CDB6(uint8_t _Opcode, uint8_t _LUN, uint8_t _AllocationLength, uint8_t _Control) : - Opcode(_Opcode), LBAMSB(0), LUN(_LUN), LBAHB(0), LBALB(0), - AllocationLength(_AllocationLength), Control(_Control) { - } -} __attribute__((packed)); - -typedef CDB6 CDB6_t; - -struct CDB10 { - uint8_t Opcode; - - unsigned Service_Action : 5; - unsigned LUN : 3; - - uint8_t LBA_L_M_MB; - uint8_t LBA_L_M_LB; - uint8_t LBA_L_L_MB; - uint8_t LBA_L_L_LB; - - uint8_t Misc2; - - uint8_t ALC_MB; - uint8_t ALC_LB; - - uint8_t Control; -public: - - CDB10(uint8_t _Opcode, uint8_t _LUN) : - Opcode(_Opcode), Service_Action(0), LUN(_LUN), - LBA_L_M_MB(0), LBA_L_M_LB(0), LBA_L_L_MB(0), LBA_L_L_LB(0), - Misc2(0), ALC_MB(0), ALC_LB(0), Control(0) { - } - - CDB10(uint8_t _Opcode, uint8_t _LUN, uint16_t xflen, uint32_t _LBA) : - Opcode(_Opcode), Service_Action(0), LUN(_LUN), - LBA_L_M_MB(BGRAB3(_LBA)), LBA_L_M_LB(BGRAB2(_LBA)), LBA_L_L_MB(BGRAB1(_LBA)), LBA_L_L_LB(BGRAB0(_LBA)), - Misc2(0), ALC_MB(BGRAB1(xflen)), ALC_LB(BGRAB0(xflen)), Control(0) { - } -} __attribute__((packed)); - -typedef CDB10 CDB10_t; - -struct CDB12 { - uint8_t Opcode; - - unsigned Service_Action : 5; - unsigned Misc : 3; - - uint8_t LBA_L_M_LB; - uint8_t LBA_L_L_MB; - uint8_t LBA_L_L_LB; - - uint8_t ALC_M_LB; - uint8_t ALC_L_MB; - uint8_t ALC_L_LB; - uint8_t Control; -} __attribute__((packed)); - -typedef CDB12 CDB12_t; - -struct CDB_LBA32_16 { - uint8_t Opcode; - - unsigned Service_Action : 5; - unsigned Misc : 3; - - uint8_t LBA_L_M_MB; - uint8_t LBA_L_M_LB; - uint8_t LBA_L_L_MB; - uint8_t LBA_L_L_LB; - - uint8_t A_M_M_MB; - uint8_t A_M_M_LB; - uint8_t A_M_L_MB; - uint8_t A_M_L_LB; - - uint8_t ALC_M_MB; - uint8_t ALC_M_LB; - uint8_t ALC_L_MB; - uint8_t ALC_L_LB; - - uint8_t Misc2; - uint8_t Control; -} __attribute__((packed)); - -struct CDB_LBA64_16 { - uint8_t Opcode; - uint8_t Misc; - - uint8_t LBA_M_M_MB; - uint8_t LBA_M_M_LB; - uint8_t LBA_M_L_MB; - uint8_t LBA_M_L_LB; - - uint8_t LBA_L_M_MB; - uint8_t LBA_L_M_LB; - uint8_t LBA_L_L_MB; - uint8_t LBA_L_L_LB; - - uint8_t ALC_M_MB; - uint8_t ALC_M_LB; - uint8_t ALC_L_MB; - uint8_t ALC_L_LB; - - uint8_t Misc2; - uint8_t Control; -} __attribute__((packed)); - -struct InquiryResponse { - uint8_t DeviceType : 5; - uint8_t PeripheralQualifier : 3; - - unsigned Reserved : 7; - unsigned Removable : 1; - - uint8_t Version; - - unsigned ResponseDataFormat : 4; - unsigned HISUP : 1; - unsigned NormACA : 1; - unsigned TrmTsk : 1; - unsigned AERC : 1; - - uint8_t AdditionalLength; - //uint8_t Reserved3[2]; - - unsigned PROTECT : 1; - unsigned Res : 2; - unsigned ThreePC : 1; - unsigned TPGS : 2; - unsigned ACC : 1; - unsigned SCCS : 1; - - unsigned ADDR16 : 1; - unsigned R1 : 1; - unsigned R2 : 1; - unsigned MCHNGR : 1; - unsigned MULTIP : 1; - unsigned VS : 1; - unsigned ENCSERV : 1; - unsigned BQUE : 1; - - unsigned SoftReset : 1; - unsigned CmdQue : 1; - unsigned Reserved4 : 1; - unsigned Linked : 1; - unsigned Sync : 1; - unsigned WideBus16Bit : 1; - unsigned WideBus32Bit : 1; - unsigned RelAddr : 1; - - uint8_t VendorID[8]; - uint8_t ProductID[16]; - uint8_t RevisionID[4]; -} __attribute__((packed)); - -struct CommandBlockWrapperBase { - uint32_t dCBWSignature; - uint32_t dCBWTag; - uint32_t dCBWDataTransferLength; - uint8_t bmCBWFlags; -public: - - CommandBlockWrapperBase() { - } - - CommandBlockWrapperBase(uint32_t tag, uint32_t xflen, uint8_t flgs) : - dCBWSignature(MASS_CBW_SIGNATURE), dCBWTag(tag), dCBWDataTransferLength(xflen), bmCBWFlags(flgs) { - } -} __attribute__((packed)); - -struct CommandBlockWrapper : public CommandBlockWrapperBase { - - struct { - uint8_t bmCBWLUN : 4; - uint8_t bmReserved1 : 4; - }; - - struct { - uint8_t bmCBWCBLength : 4; - uint8_t bmReserved2 : 4; - }; - - uint8_t CBWCB[16]; - -public: - // All zeroed. - - CommandBlockWrapper() : - CommandBlockWrapperBase(0, 0, 0), bmReserved1(0), bmReserved2(0) { - for (int i = 0; i < 16; i++) CBWCB[i] = 0; - } - - // Generic Wrap, CDB zeroed. - - CommandBlockWrapper(uint32_t tag, uint32_t xflen, uint8_t flgs, uint8_t lu, uint8_t cmdlen, uint8_t cmd) : - CommandBlockWrapperBase(tag, xflen, flgs), - bmCBWLUN(lu), bmReserved1(0), bmCBWCBLength(cmdlen), bmReserved2(0) { - for (int i = 0; i < 16; i++) CBWCB[i] = 0; - // Type punning can cause optimization problems and bugs. - // Using reinterpret_cast to a dreinterpretifferent object is the proper way to do this. - //(((BASICCDB_t *) CBWCB)->LUN) = cmd; - BASICCDB_t *x = reinterpret_cast(CBWCB); - x->LUN = cmd; - } - - // Wrap for CDB of 6 - - CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB6_t *cdb, uint8_t dir) : - CommandBlockWrapperBase(tag, xflen, dir), - bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(6), bmReserved2(0) { - memcpy(&CBWCB, cdb, 6); - } - // Wrap for CDB of 10 - - CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB10_t *cdb, uint8_t dir) : - CommandBlockWrapperBase(tag, xflen, dir), - bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(10), bmReserved2(0) { - memcpy(&CBWCB, cdb, 10); - } -} __attribute__((packed)); - -struct CommandStatusWrapper { - uint32_t dCSWSignature; - uint32_t dCSWTag; - uint32_t dCSWDataResidue; - uint8_t bCSWStatus; -} __attribute__((packed)); - -struct RequestSenseResponce { - uint8_t bResponseCode; - uint8_t bSegmentNumber; - - uint8_t bmSenseKey : 4; - uint8_t bmReserved : 1; - uint8_t bmILI : 1; - uint8_t bmEOM : 1; - uint8_t bmFileMark : 1; - - uint8_t Information[4]; - uint8_t bAdditionalLength; - uint8_t CmdSpecificInformation[4]; - uint8_t bAdditionalSenseCode; - uint8_t bAdditionalSenseQualifier; - uint8_t bFieldReplaceableUnitCode; - uint8_t SenseKeySpecific[3]; -} __attribute__((packed)); - -class BulkOnly : public USBDeviceConfig, public UsbConfigXtracter { -protected: - static const uint8_t epDataInIndex; // DataIn endpoint index - static const uint8_t epDataOutIndex; // DataOUT endpoint index - static const uint8_t epInterruptInIndex; // InterruptIN endpoint index - - USB *pUsb; - uint8_t bAddress; - uint8_t bConfNum; // configuration number - uint8_t bIface; // interface value - uint8_t bNumEP; // total number of EP in the configuration - uint32_t qNextPollTime; // next poll time - bool bPollEnable; // poll enable flag - - EpInfo epInfo[MASS_MAX_ENDPOINTS]; - - uint32_t dCBWTag; // Tag - //uint32_t dCBWDataTransferLength; // Data Transfer Length - uint8_t bLastUsbError; // Last USB error - uint8_t bMaxLUN; // Max LUN - uint8_t bTheLUN; // Active LUN - uint32_t CurrentCapacity[MASS_MAX_SUPPORTED_LUN]; // Total sectors - uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]; // Sector size, clipped to 16 bits - bool LUNOk[MASS_MAX_SUPPORTED_LUN]; // use this to check for media changes. - bool WriteOk[MASS_MAX_SUPPORTED_LUN]; - void PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR* ep_ptr); - - // Additional Initialization Method for Subclasses - - virtual uint8_t OnInit() { return 0; } - -public: - BulkOnly(USB *p); - - uint8_t GetLastUsbError() { return bLastUsbError; }; - - uint8_t GetbMaxLUN() { return bMaxLUN; } // Max LUN - uint8_t GetbTheLUN() { return bTheLUN; } // Active LUN - - bool WriteProtected(uint8_t lun); - uint8_t MediaCTL(uint8_t lun, uint8_t ctl); - uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf); - uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, USBReadParser *prs); - uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf); - uint8_t LockMedia(uint8_t lun, uint8_t lock); - - bool LUNIsGood(uint8_t lun); - uint32_t GetCapacity(uint8_t lun); - uint16_t GetSectorSize(uint8_t lun); - - // USBDeviceConfig implementation - uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed); - uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed); - - uint8_t Release(); - uint8_t Poll(); - - virtual uint8_t GetAddress() { return bAddress; } - - // UsbConfigXtracter implementation - void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_FD_ENDPOINT_DESCRIPTOR *ep); - - virtual bool DEVCLASSOK(uint8_t klass) { return klass == USB_CLASS_MASS_STORAGE; } - - uint8_t SCSITransaction6(CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir); - uint8_t SCSITransaction10(CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir); - -private: - uint8_t Inquiry(uint8_t lun, uint16_t size, uint8_t *buf); - uint8_t TestUnitReady(uint8_t lun); - uint8_t RequestSense(uint8_t lun, uint16_t size, uint8_t *buf); - uint8_t ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t *buf); - uint8_t GetMaxLUN(uint8_t *max_lun); - uint8_t SetCurLUN(uint8_t lun); - void Reset(); - uint8_t ResetRecovery(); - uint8_t ReadCapacity10(uint8_t lun, uint8_t *buf); - void ClearAllEP(); - void CheckMedia(); - bool CheckLUN(uint8_t lun); - uint8_t Page3F(uint8_t lun); - bool IsValidCBW(uint8_t size, uint8_t *pcbw); - bool IsMeaningfulCBW(uint8_t size, uint8_t *pcbw); - - bool IsValidCSW(CommandStatusWrapper *pcsw, CommandBlockWrapperBase *pcbw); - - uint8_t ClearEpHalt(uint8_t index); - #if MS_WANT_PARSER - uint8_t Transaction(CommandBlockWrapper *cbw, uint16_t bsize, void *buf, uint8_t flags); - #endif - uint8_t Transaction(CommandBlockWrapper *cbw, uint16_t bsize, void *buf); - uint8_t HandleUsbError(uint8_t error, uint8_t index); - uint8_t HandleSCSIError(uint8_t status); -}; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h deleted file mode 100644 index 6cad39d0df..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h +++ /dev/null @@ -1,242 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -#pragma once - -#ifndef _usb_h_ - #error "Never include max3421e.h directly; include Usb.h instead" -#endif - -/* MAX3421E register/bit names and bitmasks */ - -/* Arduino pin definitions */ -/* pin numbers to port numbers */ - -#define SE0 0 -#define SE1 1 -#define FSHOST 2 -#define LSHOST 3 - -/* MAX3421E command byte format: rrrrr0wa where 'r' is register number */ -// -// MAX3421E Registers in HOST mode. -// -#define rRCVFIFO 0x08 //1<<3 -#define rSNDFIFO 0x10 //2<<3 -#define rSUDFIFO 0x20 //4<<3 -#define rRCVBC 0x30 //6<<3 -#define rSNDBC 0x38 //7<<3 - -#define rUSBIRQ 0x68 //13<<3 -/* USBIRQ Bits */ -#define bmVBUSIRQ 0x40 //b6 -#define bmNOVBUSIRQ 0x20 //b5 -#define bmOSCOKIRQ 0x01 //b0 - -#define rUSBIEN 0x70 //14<<3 -/* USBIEN Bits */ -#define bmVBUSIE 0x40 //b6 -#define bmNOVBUSIE 0x20 //b5 -#define bmOSCOKIE 0x01 //b0 - -#define rUSBCTL 0x78 //15<<3 -/* USBCTL Bits */ -#define bmCHIPRES 0x20 //b5 -#define bmPWRDOWN 0x10 //b4 - -#define rCPUCTL 0x80 //16<<3 -/* CPUCTL Bits */ -#define bmPUSLEWID1 0x80 //b7 -#define bmPULSEWID0 0x40 //b6 -#define bmIE 0x01 //b0 - -#define rPINCTL 0x88 //17<<3 -/* PINCTL Bits */ -#define bmFDUPSPI 0x10 //b4 -#define bmINTLEVEL 0x08 //b3 -#define bmPOSINT 0x04 //b2 -#define bmGPXB 0x02 //b1 -#define bmGPXA 0x01 //b0 -// GPX pin selections -#define GPX_OPERATE 0x00 -#define GPX_VBDET 0x01 -#define GPX_BUSACT 0x02 -#define GPX_SOF 0x03 - -#define rREVISION 0x90 //18<<3 - -#define rIOPINS1 0xA0 //20<<3 - -/* IOPINS1 Bits */ -#define bmGPOUT0 0x01 -#define bmGPOUT1 0x02 -#define bmGPOUT2 0x04 -#define bmGPOUT3 0x08 -#define bmGPIN0 0x10 -#define bmGPIN1 0x20 -#define bmGPIN2 0x40 -#define bmGPIN3 0x80 - -#define rIOPINS2 0xA8 //21<<3 -/* IOPINS2 Bits */ -#define bmGPOUT4 0x01 -#define bmGPOUT5 0x02 -#define bmGPOUT6 0x04 -#define bmGPOUT7 0x08 -#define bmGPIN4 0x10 -#define bmGPIN5 0x20 -#define bmGPIN6 0x40 -#define bmGPIN7 0x80 - -#define rGPINIRQ 0xB0 //22<<3 -/* GPINIRQ Bits */ -#define bmGPINIRQ0 0x01 -#define bmGPINIRQ1 0x02 -#define bmGPINIRQ2 0x04 -#define bmGPINIRQ3 0x08 -#define bmGPINIRQ4 0x10 -#define bmGPINIRQ5 0x20 -#define bmGPINIRQ6 0x40 -#define bmGPINIRQ7 0x80 - -#define rGPINIEN 0xB8 //23<<3 -/* GPINIEN Bits */ -#define bmGPINIEN0 0x01 -#define bmGPINIEN1 0x02 -#define bmGPINIEN2 0x04 -#define bmGPINIEN3 0x08 -#define bmGPINIEN4 0x10 -#define bmGPINIEN5 0x20 -#define bmGPINIEN6 0x40 -#define bmGPINIEN7 0x80 - -#define rGPINPOL 0xC0 //24<<3 -/* GPINPOL Bits */ -#define bmGPINPOL0 0x01 -#define bmGPINPOL1 0x02 -#define bmGPINPOL2 0x04 -#define bmGPINPOL3 0x08 -#define bmGPINPOL4 0x10 -#define bmGPINPOL5 0x20 -#define bmGPINPOL6 0x40 -#define bmGPINPOL7 0x80 - -#define rHIRQ 0xC8 //25<<3 -/* HIRQ Bits */ -#define bmBUSEVENTIRQ 0x01 // indicates BUS Reset Done or BUS Resume -#define bmRWUIRQ 0x02 -#define bmRCVDAVIRQ 0x04 -#define bmSNDBAVIRQ 0x08 -#define bmSUSDNIRQ 0x10 -#define bmCONDETIRQ 0x20 -#define bmFRAMEIRQ 0x40 -#define bmHXFRDNIRQ 0x80 - -#define rHIEN 0xD0 //26<<3 - -/* HIEN Bits */ -#define bmBUSEVENTIE 0x01 -#define bmRWUIE 0x02 -#define bmRCVDAVIE 0x04 -#define bmSNDBAVIE 0x08 -#define bmSUSDNIE 0x10 -#define bmCONDETIE 0x20 -#define bmFRAMEIE 0x40 -#define bmHXFRDNIE 0x80 - -#define rMODE 0xD8 //27<<3 - -/* MODE Bits */ -#define bmHOST 0x01 -#define bmLOWSPEED 0x02 -#define bmHUBPRE 0x04 -#define bmSOFKAENAB 0x08 -#define bmSEPIRQ 0x10 -#define bmDELAYISO 0x20 -#define bmDMPULLDN 0x40 -#define bmDPPULLDN 0x80 - -#define rPERADDR 0xE0 //28<<3 - -#define rHCTL 0xE8 //29<<3 -/* HCTL Bits */ -#define bmBUSRST 0x01 -#define bmFRMRST 0x02 -#define bmSAMPLEBUS 0x04 -#define bmSIGRSM 0x08 -#define bmRCVTOG0 0x10 -#define bmRCVTOG1 0x20 -#define bmSNDTOG0 0x40 -#define bmSNDTOG1 0x80 - -#define rHXFR 0xF0 //30<<3 - -#undef tokSETUP -#undef tokIN -#undef tokOUT -#undef tokINHS -#undef tokOUTHS -#undef tokISOIN -#undef tokISOOUT - -/* Host transfer token values for writing the HXFR register (R30) */ -/* OR this bit field with the endpoint number in bits 3:0 */ -#define tokSETUP 0x10 // HS=0, ISO=0, OUTNIN=0, SETUP=1 -#define tokIN 0x00 // HS=0, ISO=0, OUTNIN=0, SETUP=0 -#define tokOUT 0x20 // HS=0, ISO=0, OUTNIN=1, SETUP=0 -#define tokINHS 0x80 // HS=1, ISO=0, OUTNIN=0, SETUP=0 -#define tokOUTHS 0xA0 // HS=1, ISO=0, OUTNIN=1, SETUP=0 -#define tokISOIN 0x40 // HS=0, ISO=1, OUTNIN=0, SETUP=0 -#define tokISOOUT 0x60 // HS=0, ISO=1, OUTNIN=1, SETUP=0 - -#define rHRSL 0xF8 //31<<3 - -/* HRSL Bits */ -#define bmRCVTOGRD 0x10 -#define bmSNDTOGRD 0x20 -#define bmKSTATUS 0x40 -#define bmJSTATUS 0x80 -#define bmSE0 0x00 //SE0 - disconnect state -#define bmSE1 0xC0 //SE1 - illegal state - -/* Host error result codes, the 4 LSB's in the HRSL register */ -#define hrSUCCESS 0x00 -#define hrBUSY 0x01 -#define hrBADREQ 0x02 -#define hrUNDEF 0x03 -#define hrNAK 0x04 -#define hrSTALL 0x05 -#define hrTOGERR 0x06 -#define hrWRONGPID 0x07 -#define hrBADBC 0x08 -#define hrPIDERR 0x09 -#define hrPKTERR 0x0A -#define hrCRCERR 0x0B -#define hrKERR 0x0C -#define hrJERR 0x0D -#define hrTIMEOUT 0x0E -#define hrBABBLE 0x0F - -#define MODE_FS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmSOFKAENAB) -#define MODE_LS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmLOWSPEED|bmSOFKAENAB) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp deleted file mode 100644 index dcc309025a..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) - -#include "Usb.h" - -// 0x80 is the default (i.e. trace) to turn off set this global to something lower. -// this allows for 126 other debugging levels. -// TO-DO: Allow assignment to a different serial port by software -int UsbDEBUGlvl = 0x80; - -void E_Notifyc(char c, int lvl) { - if (UsbDEBUGlvl < lvl) return; - USB_HOST_SERIAL.print(c - #if !defined(ARDUINO) && !defined(ARDUINO_ARCH_LPC176X) - , BYTE - #endif - ); - //USB_HOST_SERIAL.flush(); -} - -void E_Notify(char const * msg, int lvl) { - if (UsbDEBUGlvl < lvl) return; - if (!msg) return; - while (const char c = pgm_read_byte(msg++)) E_Notifyc(c, lvl); -} - -void E_NotifyStr(char const * msg, int lvl) { - if (UsbDEBUGlvl < lvl) return; - if (!msg) return; - while (const char c = *msg++) E_Notifyc(c, lvl); -} - -void E_Notify(uint8_t b, int lvl) { - if (UsbDEBUGlvl < lvl) return; - USB_HOST_SERIAL.print(b - #if !defined(ARDUINO) || ARDUINO < 100 - , DEC - #endif - ); - //USB_HOST_SERIAL.flush(); -} - -void E_Notify(double d, int lvl) { - if (UsbDEBUGlvl < lvl) return; - USB_HOST_SERIAL.print(d); - //USB_HOST_SERIAL.flush(); -} - -#ifdef DEBUG_USB_HOST - - void NotifyFailGetDevDescr() { - Notify(PSTR("\r\ngetDevDescr "), 0x80); - } - - void NotifyFailSetDevTblEntry() { - Notify(PSTR("\r\nsetDevTblEn "), 0x80); - } - - void NotifyFailGetConfDescr() { - Notify(PSTR("\r\ngetConf "), 0x80); - } - - void NotifyFailSetConfDescr() { - Notify(PSTR("\r\nsetConf "), 0x80); - } - - void NotifyFailGetDevDescr(uint8_t reason) { - NotifyFailGetDevDescr(); - NotifyFail(reason); - } - - void NotifyFailSetDevTblEntry(uint8_t reason) { - NotifyFailSetDevTblEntry(); - NotifyFail(reason); - - } - - void NotifyFailGetConfDescr(uint8_t reason) { - NotifyFailGetConfDescr(); - NotifyFail(reason); - } - - void NotifyFailSetConfDescr(uint8_t reason) { - NotifyFailSetConfDescr(); - NotifyFail(reason); - } - - void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID) { - Notify(PSTR("\r\nUnknown Device Connected - VID: "), 0x80); - D_PrintHex (VID, 0x80); - Notify(PSTR(" PID: "), 0x80); - D_PrintHex (PID, 0x80); - } - - void NotifyFail(uint8_t rcode) { - D_PrintHex (rcode, 0x80); - Notify(PSTR("\r\n"), 0x80); - } - -#endif // DEBUG_USB_HOST - -#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h deleted file mode 100644 index 12195dcf62..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -#pragma once - -#ifndef _usb_h_ - #error "Never include message.h directly; include Usb.h instead" -#endif - -extern int UsbDEBUGlvl; - -void E_Notify(char const * msg, int lvl); -void E_Notify(uint8_t b, int lvl); -void E_NotifyStr(char const * msg, int lvl); -void E_Notifyc(char c, int lvl); - -#ifdef DEBUG_USB_HOST - #define Notify E_Notify - #define NotifyStr E_NotifyStr - #define Notifyc E_Notifyc - void NotifyFailGetDevDescr(uint8_t reason); - void NotifyFailSetDevTblEntry(uint8_t reason); - void NotifyFailGetConfDescr(uint8_t reason); - void NotifyFailSetConfDescr(uint8_t reason); - void NotifyFailGetDevDescr(); - void NotifyFailSetDevTblEntry(); - void NotifyFailGetConfDescr(); - void NotifyFailSetConfDescr(); - void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID); - void NotifyFail(uint8_t rcode); -#else - #define Notify(...) ((void)0) - #define NotifyStr(...) ((void)0) - #define Notifyc(...) ((void)0) - #define NotifyFailGetDevDescr(...) ((void)0) - #define NotifyFailSetDevTblEntry(...) ((void)0) - #define NotifyFailGetConfDescr(...) ((void)0) - #define NotifyFailGetDevDescr(...) ((void)0) - #define NotifyFailSetDevTblEntry(...) ((void)0) - #define NotifyFailGetConfDescr(...) ((void)0) - #define NotifyFailSetConfDescr(...) ((void)0) - #define NotifyFailUnknownDevice(...) ((void)0) - #define NotifyFail(...) ((void)0) -#endif - -template -void ErrorMessage(uint8_t level, char const * msg, ERROR_TYPE rcode = 0) { - #ifdef DEBUG_USB_HOST - Notify(msg, level); - Notify(PSTR(": "), level); - D_PrintHex (rcode, level); - Notify(PSTR("\r\n"), level); - #endif -} - -template -void ErrorMessage(char const * msg __attribute__((unused)), ERROR_TYPE rcode __attribute__((unused)) = 0) { - #ifdef DEBUG_USB_HOST - Notify(msg, 0x80); - Notify(PSTR(": "), 0x80); - D_PrintHex (rcode, 0x80); - Notify(PSTR("\r\n"), 0x80); - #endif -} diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp deleted file mode 100644 index 5d25576c40..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) - -#include "Usb.h" - -bool MultiByteValueParser::Parse(uint8_t **pp, uint16_t *pcntdn) { - if (!pBuf) { - Notify(PSTR("Buffer pointer is NULL!\r\n"), 0x80); - return false; - } - for (; countDown && (*pcntdn); countDown--, (*pcntdn)--, (*pp)++) - pBuf[valueSize - countDown] = (**pp); - - if (countDown) return false; - - countDown = valueSize; - return true; -} - -bool PTPListParser::Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me) { - switch (nStage) { - case 0: - pBuf->valueSize = lenSize; - theParser.Initialize(pBuf); - nStage = 1; - - case 1: - if (!theParser.Parse(pp, pcntdn)) return false; - - arLen = 0; - arLen = (pBuf->valueSize >= 4) ? *((uint32_t*)pBuf->pValue) : (uint32_t)(*((uint16_t*)pBuf->pValue)); - arLenCntdn = arLen; - nStage = 2; - - case 2: - pBuf->valueSize = valSize; - theParser.Initialize(pBuf); - nStage = 3; - - case 3: - for (; arLenCntdn; arLenCntdn--) { - if (!theParser.Parse(pp, pcntdn)) return false; - if (pf) pf(pBuf, (arLen - arLenCntdn), me); - } - - nStage = 0; - } - return true; -} - -#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h deleted file mode 100644 index 403766da8f..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -#pragma once - -#ifndef _usb_h_ - #error "Never include parsetools.h directly; include Usb.h instead" -#endif - -struct MultiValueBuffer { - uint8_t valueSize; - void *pValue; -} __attribute__((packed)); - -class MultiByteValueParser { - uint8_t * pBuf; - uint8_t countDown; - uint8_t valueSize; - -public: - - MultiByteValueParser() : pBuf(nullptr), countDown(0), valueSize(0) { - }; - - const uint8_t* GetBuffer() { return pBuf; } - - void Initialize(MultiValueBuffer * const pbuf) { - pBuf = (uint8_t*)pbuf->pValue; - countDown = valueSize = pbuf->valueSize; - } - - bool Parse(uint8_t **pp, uint16_t *pcntdn); -}; - -class ByteSkipper { - uint8_t *pBuf; - uint8_t nStage; - uint16_t countDown; - -public: - - ByteSkipper() : pBuf(nullptr), nStage(0), countDown(0) { - } - - void Initialize(MultiValueBuffer *pbuf) { - pBuf = (uint8_t*)pbuf->pValue; - countDown = 0; - } - - bool Skip(uint8_t **pp, uint16_t *pcntdn, uint16_t bytes_to_skip) { - switch (nStage) { - case 0: - countDown = bytes_to_skip; - nStage++; - case 1: - for (; countDown && (*pcntdn); countDown--, (*pp)++, (*pcntdn)--); - - if (!countDown) - nStage = 0; - } - return (!countDown); - } -}; - -// Pointer to a callback function triggered for each element of PTP array when used with PTPArrayParser -typedef void (*PTP_ARRAY_EL_FUNC)(const MultiValueBuffer * const p, uint32_t count, const void *me); - -class PTPListParser { -public: - - enum ParseMode { - modeArray, modeRange/*, modeEnum*/ - }; - -private: - uint8_t nStage; - uint8_t enStage; - - uint32_t arLen; - uint32_t arLenCntdn; - - uint8_t lenSize; // size of the array length field in bytes - uint8_t valSize; // size of the array element in bytes - - MultiValueBuffer *pBuf; - - // The only parser for both size and array element parsing - MultiByteValueParser theParser; - - uint8_t /*ParseMode*/ prsMode; - -public: - - PTPListParser() : - nStage(0), - enStage(0), - arLen(0), - arLenCntdn(0), - lenSize(0), - valSize(0), - pBuf(nullptr), - prsMode(modeArray) {} - ; - - void Initialize(const uint8_t len_size, const uint8_t val_size, MultiValueBuffer * const p, const uint8_t mode = modeArray) { - pBuf = p; - lenSize = len_size; - valSize = val_size; - prsMode = mode; - - if (prsMode == modeRange) { - arLenCntdn = arLen = 3; - nStage = 2; - } - else { - arLenCntdn = arLen = 0; - nStage = 0; - } - enStage = 0; - theParser.Initialize(p); - } - - bool Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me = nullptr); -}; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h deleted file mode 100644 index 319cd9c4c8..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ -#pragma once - -#ifndef _usb_h_ - #error "Never include printhex.h directly; include Usb.h instead" -#endif - -void E_Notifyc(char c, int lvl); - -template -void PrintHex(T val, int lvl) { - int num_nibbles = sizeof (T) * 2; - do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); - if (v > 57) v += 7; - E_Notifyc(v, lvl); - } while (--num_nibbles); -} - -template -void PrintBin(T val, int lvl) { - for (T mask = (((T)1) << ((sizeof (T) << 3) - 1)); mask; mask >>= 1) - E_Notifyc(val & mask ? '1' : '0', lvl); -} - -template -void SerialPrintHex(T val) { - int num_nibbles = sizeof (T) * 2; - do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); - if (v > 57) v += 7; - USB_HOST_SERIAL.print(v); - } while (--num_nibbles); -} - -template -void PrintHex2(Print *prn, T val) { - T mask = (((T)1) << (((sizeof (T) << 1) - 1) << 2)); - while (mask > 1) { - if (val < mask) prn->print("0"); - mask >>= 4; - } - prn->print((T)val, HEX); -} - -template void D_PrintHex(T val __attribute__((unused)), int lvl __attribute__((unused))) { - #ifdef DEBUG_USB_HOST - PrintHex (val, lvl); - #endif -} - -template -void D_PrintBin(T val, int lvl) { - #ifdef DEBUG_USB_HOST - PrintBin (val, lvl); - #endif -} diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h deleted file mode 100644 index 2de0d465e8..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h +++ /dev/null @@ -1,236 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ - -#pragma once - -#include "../../../inc/MarlinConfig.h" - -#include "macros.h" - -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) - //////////////////////////////////////////////////////////////////////////////// - /* Added by Bill Greiman to speed up mass storage initialization with USB - * flash drives and simple USB hard drives. - * Disable this by defining DELAY(x) to be delay(x). - */ - #define delay(x) if ((x) < 200) safe_delay(x) - /* Almost all USB flash drives and simple USB hard drives fail the write - * protect test and add 20 - 30 seconds to USB init. Set SKIP_WRITE_PROTECT - * to nonzero to skip the test and assume the drive is writable. - */ - #define SKIP_WRITE_PROTECT 1 - /* Since Marlin only cares about USB flash drives, we only need one LUN. */ - #define MASS_MAX_SUPPORTED_LUN 1 -#endif - -//////////////////////////////////////////////////////////////////////////////// -// SPI Configuration -//////////////////////////////////////////////////////////////////////////////// - -#ifndef USB_SPI - #define USB_SPI SPI - //#define USB_SPI SPI1 -#endif - -//////////////////////////////////////////////////////////////////////////////// -// DEBUGGING -//////////////////////////////////////////////////////////////////////////////// - -/* Set this to 1 to activate serial debugging */ -#define ENABLE_UHS_DEBUGGING 0 - -/* This can be used to select which serial port to use for debugging if - * multiple serial ports are available. - * For example Serial3. - */ -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) - #define USB_HOST_SERIAL MYSERIAL0 -#endif - -#ifndef USB_HOST_SERIAL - #define USB_HOST_SERIAL Serial -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Manual board activation -//////////////////////////////////////////////////////////////////////////////// - -/* Set this to 1 if you are using an Arduino Mega ADK board with MAX3421e built-in */ -#define USE_UHS_MEGA_ADK 0 // If you are using Arduino 1.5.5 or newer there is no need to do this manually - -/* Set this to 1 if you are using a Black Widdow */ -#define USE_UHS_BLACK_WIDDOW 0 - -/* Set this to a one to use the xmem2 lock. This is needed for multitasking and threading */ -#define USE_XMEM_SPI_LOCK 0 - -//////////////////////////////////////////////////////////////////////////////// -// Wii IR camera -//////////////////////////////////////////////////////////////////////////////// - -/* Set this to 1 to activate code for the Wii IR camera */ -#define ENABLE_WII_IR_CAMERA 0 - -//////////////////////////////////////////////////////////////////////////////// -// MASS STORAGE -//////////////////////////////////////////////////////////////////////////////// -// ******* IMPORTANT ******* -// Set this to 1 to support single LUN devices, and save RAM. -- I.E. thumb drives. -// Each LUN needs ~13 bytes to be able to track the state of each unit. -#ifndef MASS_MAX_SUPPORTED_LUN - #define MASS_MAX_SUPPORTED_LUN 8 -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Set to 1 to use the faster spi4teensy3 driver. -//////////////////////////////////////////////////////////////////////////////// -#ifndef USE_SPI4TEENSY3 - #define USE_SPI4TEENSY3 1 -#endif - -// Disabled on the Teensy LC, as it is incompatible for now -#ifdef __MKL26Z64__ - #undef USE_SPI4TEENSY3 - #define USE_SPI4TEENSY3 0 -#endif - -//////////////////////////////////////////////////////////////////////////////// -// AUTOMATIC Settings -//////////////////////////////////////////////////////////////////////////////// - -// No user serviceable parts below this line. -// DO NOT change anything below here unless you are a developer! - -//#include "version_helper.h" - -#if defined(__GNUC__) && defined(__AVR__) - #ifndef GCC_VERSION - #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) - #endif - #if GCC_VERSION < 40602 // Test for GCC < 4.6.2 - #ifdef PROGMEM - #undef PROGMEM - #define PROGMEM __attribute__((section(".progmem.data"))) // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734#c4 - #ifdef PSTR - #undef PSTR - #define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) // Copied from pgmspace.h in avr-libc source - #endif - #endif - #endif -#endif - -#if !defined(DEBUG_USB_HOST) && ENABLE_UHS_DEBUGGING - #define DEBUG_USB_HOST -#endif - -#if !defined(WIICAMERA) && ENABLE_WII_IR_CAMERA - #define WIICAMERA -#endif - -// To use some other locking (e.g. freertos), -// define XMEM_ACQUIRE_SPI and XMEM_RELEASE_SPI to point to your lock and unlock. -// NOTE: NO argument is passed. You have to do this within your routine for -// whatever you are using to lock and unlock. -#ifndef XMEM_ACQUIRE_SPI - #if USE_XMEM_SPI_LOCK || defined(USE_MULTIPLE_APP_API) - #include - #else - #define XMEM_ACQUIRE_SPI() (void(0)) - #define XMEM_RELEASE_SPI() (void(0)) - #endif -#endif - -#if !defined(EXT_RAM) && defined(EXT_RAM_STACK) || defined(EXT_RAM_HEAP) - #include -#else - #define EXT_RAM 0 -#endif - -#if defined(CORE_TEENSY) && defined(KINETISK) - #define USING_SPI4TEENSY3 USE_SPI4TEENSY3 -#else - #define USING_SPI4TEENSY3 0 -#endif -#if ((defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)) || defined(__ARDUINO_X86__) || ARDUINO >= 10600) && !USING_SPI4TEENSY3 - #include // Use the Arduino SPI library for the Arduino Due, Intel Galileo 1 & 2, Intel Edison or if the SPI library with transaction is available -#endif -#ifdef RBL_NRF51822 - #include - #include - #define SPI SPI_Master - #define MFK_CASTUINT8T (uint8_t) // RBLs return type for sizeof needs casting to uint8_t -#endif -#if defined(__PIC32MX__) || defined(__PIC32MZ__) - #include <../../../../hardware/pic32/libraries/SPI/SPI.h> // Hack to use the SPI library -#endif - -#if defined(ESP8266) || defined(ESP32) - #define MFK_CASTUINT8T (uint8_t) // ESP return type for sizeof needs casting to uint8_t -#endif - -#ifdef STM32F4 - #include "stm32f4xx_hal.h" - extern SPI_HandleTypeDef SPI_Handle; // Needed to be declared in your main.cpp -#endif - -// Fix defines on Arduino Due -#ifdef ARDUINO_SAM_DUE - #ifdef tokSETUP - #undef tokSETUP - #endif - #ifdef tokIN - #undef tokIN - #endif - #ifdef tokOUT - #undef tokOUT - #endif - #ifdef tokINHS - #undef tokINHS - #endif - #ifdef tokOUTHS - #undef tokOUTHS - #endif -#endif - -// Set defaults -#ifndef MFK_CASTUINT8T - #define MFK_CASTUINT8T -#endif - -// Workaround issue: https://github.com/esp8266/Arduino/issues/2078 -#ifdef ESP8266 - #undef PROGMEM - #define PROGMEM -#undef PSTR - #define PSTR(s) (s) -#undef pgm_read_byte - #define pgm_read_byte(addr) (*reinterpret_cast(addr)) - #undef pgm_read_word - #define pgm_read_word(addr) (*reinterpret_cast(addr)) -#endif - -#ifdef ARDUINO_ESP8266_WIFIO - #error "This board is currently not supported" -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h deleted file mode 100644 index 99c628f888..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Contact information - * ------------------- - * - * Circuits At Home, LTD - * Web : https://www.circuitsathome.com - * e-mail : support@circuitsathome.com - */ - -#ifndef _usb_h_ - #error "Never include usb_ch9.h directly; include Usb.h instead" -#endif - -/* USB chapter 9 structures */ - -/* Misc.USB constants */ -#define DEV_DESCR_LEN 18 //device descriptor length -#define CONF_DESCR_LEN 9 //configuration descriptor length -#define INTR_DESCR_LEN 9 //interface descriptor length -#define EP_DESCR_LEN 7 //endpoint descriptor length - -/* Standard Device Requests */ - -#define USB_REQUEST_GET_STATUS 0 // Standard Device Request - GET STATUS -#define USB_REQUEST_CLEAR_FEATURE 1 // Standard Device Request - CLEAR FEATURE -#define USB_REQUEST_SET_FEATURE 3 // Standard Device Request - SET FEATURE -#define USB_REQUEST_SET_ADDRESS 5 // Standard Device Request - SET ADDRESS -#define USB_REQUEST_GET_DESCRIPTOR 6 // Standard Device Request - GET DESCRIPTOR -#define USB_REQUEST_SET_DESCRIPTOR 7 // Standard Device Request - SET DESCRIPTOR -#define USB_REQUEST_GET_CONFIGURATION 8 // Standard Device Request - GET CONFIGURATION -#define USB_REQUEST_SET_CONFIGURATION 9 // Standard Device Request - SET CONFIGURATION -#define USB_REQUEST_GET_INTERFACE 10 // Standard Device Request - GET INTERFACE -#define USB_REQUEST_SET_INTERFACE 11 // Standard Device Request - SET INTERFACE -#define USB_REQUEST_SYNCH_FRAME 12 // Standard Device Request - SYNCH FRAME - -#define USB_FEATURE_ENDPOINT_HALT 0 // CLEAR/SET FEATURE - Endpoint Halt -#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // CLEAR/SET FEATURE - Device remote wake-up -#define USB_FEATURE_TEST_MODE 2 // CLEAR/SET FEATURE - Test mode - -/* Setup Data Constants */ - -#define USB_SETUP_HOST_TO_DEVICE 0x00 // Device Request bmRequestType transfer direction - host to device transfer -#define USB_SETUP_DEVICE_TO_HOST 0x80 // Device Request bmRequestType transfer direction - device to host transfer -#define USB_SETUP_TYPE_STANDARD 0x00 // Device Request bmRequestType type - standard -#define USB_SETUP_TYPE_CLASS 0x20 // Device Request bmRequestType type - class -#define USB_SETUP_TYPE_VENDOR 0x40 // Device Request bmRequestType type - vendor -#define USB_SETUP_RECIPIENT_DEVICE 0x00 // Device Request bmRequestType recipient - device -#define USB_SETUP_RECIPIENT_INTERFACE 0x01 // Device Request bmRequestType recipient - interface -#define USB_SETUP_RECIPIENT_ENDPOINT 0x02 // Device Request bmRequestType recipient - endpoint -#define USB_SETUP_RECIPIENT_OTHER 0x03 // Device Request bmRequestType recipient - other - -/* USB descriptors */ - -#define USB_DESCRIPTOR_DEVICE 0x01 // bDescriptorType for a Device Descriptor. -#define USB_DESCRIPTOR_CONFIGURATION 0x02 // bDescriptorType for a Configuration Descriptor. -#define USB_DESCRIPTOR_STRING 0x03 // bDescriptorType for a String Descriptor. -#define USB_DESCRIPTOR_INTERFACE 0x04 // bDescriptorType for an Interface Descriptor. -#define USB_DESCRIPTOR_ENDPOINT 0x05 // bDescriptorType for an Endpoint Descriptor. -#define USB_DESCRIPTOR_DEVICE_QUALIFIER 0x06 // bDescriptorType for a Device Qualifier. -#define USB_DESCRIPTOR_OTHER_SPEED 0x07 // bDescriptorType for a Other Speed Configuration. -#define USB_DESCRIPTOR_INTERFACE_POWER 0x08 // bDescriptorType for Interface Power. -#define USB_DESCRIPTOR_OTG 0x09 // bDescriptorType for an OTG Descriptor. - -#define HID_DESCRIPTOR_HID 0x21 - - -/* OTG SET FEATURE Constants */ -#define OTG_FEATURE_B_HNP_ENABLE 3 // SET FEATURE OTG - Enable B device to perform HNP -#define OTG_FEATURE_A_HNP_SUPPORT 4 // SET FEATURE OTG - A device supports HNP -#define OTG_FEATURE_A_ALT_HNP_SUPPORT 5 // SET FEATURE OTG - Another port on the A device supports HNP - -/* USB Endpoint Transfer Types */ -#define USB_TRANSFER_TYPE_CONTROL 0x00 // Endpoint is a control endpoint. -#define USB_TRANSFER_TYPE_ISOCHRONOUS 0x01 // Endpoint is an isochronous endpoint. -#define USB_TRANSFER_TYPE_BULK 0x02 // Endpoint is a bulk endpoint. -#define USB_TRANSFER_TYPE_INTERRUPT 0x03 // Endpoint is an interrupt endpoint. -#define bmUSB_TRANSFER_TYPE 0x03 // bit mask to separate transfer type from ISO attributes - - -/* Standard Feature Selectors for CLEAR_FEATURE Requests */ -#define USB_FEATURE_ENDPOINT_STALL 0 // Endpoint recipient -#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // Device recipient -#define USB_FEATURE_TEST_MODE 2 // Device recipient - -/* descriptor data structures */ - -/* Device descriptor structure */ -typedef struct { - uint8_t bLength; // Length of this descriptor. - uint8_t bDescriptorType; // DEVICE descriptor type (USB_DESCRIPTOR_DEVICE). - uint16_t bcdUSB; // USB Spec Release Number (BCD). - uint8_t bDeviceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific. - uint8_t bDeviceSubClass; // Subclass code (assigned by the USB-IF). - uint8_t bDeviceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. - uint8_t bMaxPacketSize0; // Maximum packet size for endpoint 0. - uint16_t idVendor; // Vendor ID (assigned by the USB-IF). - uint16_t idProduct; // Product ID (assigned by the manufacturer). - uint16_t bcdDevice; // Device release number (BCD). - uint8_t iManufacturer; // Index of String Descriptor describing the manufacturer. - uint8_t iProduct; // Index of String Descriptor describing the product. - uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number. - uint8_t bNumConfigurations; // Number of possible configurations. -} __attribute__((packed)) USB_FD_DEVICE_DESCRIPTOR; - -/* Configuration descriptor structure */ -typedef struct { - uint8_t bLength; // Length of this descriptor. - uint8_t bDescriptorType; // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION). - uint16_t wTotalLength; // Total length of all descriptors for this configuration. - uint8_t bNumInterfaces; // Number of interfaces in this configuration. - uint8_t bConfigurationValue; // Value of this configuration (1 based). - uint8_t iConfiguration; // Index of String Descriptor describing the configuration. - uint8_t bmAttributes; // Configuration characteristics. - uint8_t bMaxPower; // Maximum power consumed by this configuration. -} __attribute__((packed)) USB_FD_CONFIGURATION_DESCRIPTOR; - -/* Interface descriptor structure */ -typedef struct { - uint8_t bLength; // Length of this descriptor. - uint8_t bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE). - uint8_t bInterfaceNumber; // Number of this interface (0 based). - uint8_t bAlternateSetting; // Value of this alternate interface setting. - uint8_t bNumEndpoints; // Number of endpoints in this interface. - uint8_t bInterfaceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific. - uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF). - uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. - uint8_t iInterface; // Index of String Descriptor describing the interface. -} __attribute__((packed)) USB_FD_INTERFACE_DESCRIPTOR; - -/* Endpoint descriptor structure */ -typedef struct { - uint8_t bLength; // Length of this descriptor. - uint8_t bDescriptorType; // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT). - uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN). - uint8_t bmAttributes; // Endpoint transfer type. - uint16_t wMaxPacketSize; // Maximum packet size. - uint8_t bInterval; // Polling interval in frames. -} __attribute__((packed)) USB_FD_ENDPOINT_DESCRIPTOR; - -/* HID descriptor */ -typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdHID; // HID class specification release - uint8_t bCountryCode; - uint8_t bNumDescriptors; // Number of additional class specific descriptors - uint8_t bDescrType; // Type of class descriptor - uint16_t wDescriptorLength; // Total size of the Report descriptor -} __attribute__((packed)) USB_HID_DESCRIPTOR; - -typedef struct { - uint8_t bDescrType; // Type of class descriptor - uint16_t wDescriptorLength; // Total size of the Report descriptor -} __attribute__((packed)) HID_CLASS_DESCRIPTOR_LEN_AND_TYPE; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp deleted file mode 100644 index 6d2182cb8b..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/**************** - * usb_host.cpp * - ****************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -/* What follows is a modified version of the MAX3421e originally defined in - * lib/usbhost.c". This has been rewritten to use SPI routines from the - * Marlin HAL */ - -#include "../../../inc/MarlinConfigPre.h" - -#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) - -#include "Usb.h" -#include "usbhost.h" - -uint8_t MAX3421e::vbusState = 0; - -// constructor -void MAX3421e::cs() { - WRITE(USB_CS_PIN,0); -} - -void MAX3421e::ncs() { - WRITE(USB_CS_PIN,1); -} - -// write single byte into MAX3421 register -void MAX3421e::regWr(uint8_t reg, uint8_t data) { - cs(); - spiSend(reg | 0x02); - spiSend(data); - ncs(); -}; - -// multiple-byte write -// return a pointer to memory position after last written -uint8_t* MAX3421e::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { - cs(); - spiSend(reg | 0x02); - while (nbytes--) spiSend(*data_p++); - ncs(); - return data_p; -} - -// GPIO write -// GPIO byte is split between 2 registers, so two writes are needed to write one byte - -// GPOUT bits are in the low nybble. 0-3 in IOPINS1, 4-7 in IOPINS2 -void MAX3421e::gpioWr(uint8_t data) { - regWr(rIOPINS1, data); - regWr(rIOPINS2, data >> 4); -} - -// single host register read -uint8_t MAX3421e::regRd(uint8_t reg) { - cs(); - spiSend(reg); - uint8_t rv = spiRec(); - ncs(); - return rv; -} -// multiple-byte register read - -// return a pointer to a memory position after last read -uint8_t* MAX3421e::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { - cs(); - spiSend(reg); - while (nbytes--) *data_p++ = spiRec(); - ncs(); - return data_p; -} -// GPIO read. See gpioWr for explanation - -// GPIN pins are in high nybbles of IOPINS1, IOPINS2 -uint8_t MAX3421e::gpioRd() { - return (regRd(rIOPINS2) & 0xF0) | // pins 4-7, clean lower nybble - (regRd(rIOPINS1) >> 4); // shift low bits and OR with upper from previous operation. -} - -// reset MAX3421e. Returns false if PLL failed to stabilize 1 second after reset -bool MAX3421e::reset() { - regWr(rUSBCTL, bmCHIPRES); - regWr(rUSBCTL, 0x00); - for (uint8_t i = 100; i--;) { - if (regRd(rUSBIRQ) & bmOSCOKIRQ) return true; - delay(10); - } - return false; -} - -// initialize MAX3421e. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not -bool MAX3421e::start() { - // Initialize pins and SPI bus - - SET_OUTPUT(USB_CS_PIN); - SET_INPUT_PULLUP(USB_INTR_PIN); - ncs(); - spiBegin(); - - spiInit( - #ifdef SPI_SPEED - SPI_SPEED - #else - SPI_FULL_SPEED - #endif - ); - - // MAX3421e - full-duplex, level interrupt, vbus off. - regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | GPX_VBDET)); - - const uint8_t revision = regRd(rREVISION); - if (revision == 0x00 || revision == 0xFF) { - SERIAL_ECHOLNPAIR("Revision register appears incorrect on MAX3421e initialization. Got ", revision); - return false; - } - - if (!reset()) { - SERIAL_ECHOLNPGM("OSCOKIRQ hasn't asserted in time"); - return false; - } - - // Delay a minimum of 1 second to ensure any capacitors are drained. - // 1 second is required to make sure we do not smoke a Microdrive! - - delay(1000); - - regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host - regWr(rHIEN, bmCONDETIE | bmFRAMEIE); // connection detection - - // check if device is connected - regWr(rHCTL, bmSAMPLEBUS); // sample USB bus - while (!(regRd(rHCTL) & bmSAMPLEBUS)) delay(10); // wait for sample operation to finish - - busprobe(); // check if anything is connected - - regWr(rHIRQ, bmCONDETIRQ); // clear connection detect interrupt - regWr(rCPUCTL, 0x01); // enable interrupt pin - - // GPX pin on. This is done here so that busprobe will fail if we have a switch connected. - regWr(rPINCTL, bmFDUPSPI | bmINTLEVEL); - - return true; -} - -// Probe bus to determine device presence and speed. Switch host to this speed. -void MAX3421e::busprobe() { - // Switch on just the J & K bits - switch (regRd(rHRSL) & (bmJSTATUS | bmKSTATUS)) { - case bmJSTATUS: - if ((regRd(rMODE) & bmLOWSPEED) == 0) { - regWr(rMODE, MODE_FS_HOST); // start full-speed host - vbusState = FSHOST; - } - else { - regWr(rMODE, MODE_LS_HOST); // start low-speed host - vbusState = LSHOST; - } - break; - case bmKSTATUS: - if ((regRd(rMODE) & bmLOWSPEED) == 0) { - regWr(rMODE, MODE_LS_HOST); // start low-speed host - vbusState = LSHOST; - } - else { - regWr(rMODE, MODE_FS_HOST); // start full-speed host - vbusState = FSHOST; - } - break; - case bmSE1: // illegal state - vbusState = SE1; - break; - case bmSE0: // disconnected state - regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST | bmSEPIRQ); - vbusState = SE0; - break; - } -} - -// MAX3421 state change task and interrupt handler -uint8_t MAX3421e::Task() { - return READ(USB_INTR_PIN) ? 0 : IntHandler(); -} - -uint8_t MAX3421e::IntHandler() { - uint8_t HIRQ = regRd(rHIRQ), // determine interrupt source - HIRQ_sendback = 0x00; - if (HIRQ & bmCONDETIRQ) { - busprobe(); - HIRQ_sendback |= bmCONDETIRQ; - } - // End HIRQ interrupts handling, clear serviced IRQs - regWr(rHIRQ, HIRQ_sendback); - return HIRQ_sendback; -} - -#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h deleted file mode 100644 index 07ca811a4d..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h +++ /dev/null @@ -1,58 +0,0 @@ -/************** - * usb_host.h * - **************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ - -#pragma once - -/* This the following comes from "lib/usbhost.h", but has been rewritten - * to use the SPI functions from Marlin's HAL */ - -class MAX3421e { - private: - static uint8_t vbusState; - void cs(); - void ncs(); - - uint8_t GpxHandler(); - uint8_t IntHandler(); - - public: - bool start(); - - void regWr(uint8_t reg, uint8_t data); - uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p); - void gpioWr(uint8_t data); - uint8_t regRd(uint8_t reg); - uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p); - uint8_t gpioRd(); - bool reset(); - - uint8_t getVbusState() {return vbusState;}; - - void busprobe(); - - uint8_t Task(); -}; - -#define USE_MARLIN_MAX3421E - -#if defined(__SAM3X8E__) && !defined(ARDUINO_SAM_DUE) - #define ARDUINO_SAM_DUE // Spoof the USB library that this is a DUE -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/README.txt b/Marlin/src/sd/usb_flashdrive/lib-uhs3/README.txt deleted file mode 100644 index 710b3f20b5..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/README.txt +++ /dev/null @@ -1,31 +0,0 @@ -==== USB HOST SHIELD 3.0 LIBRARY ==== - -The lib-uhs3/ folder contains a subset of the files from the USB Host Shield -3.0 library: - - https://github.com/felis/UHS30 - - -==== LICENSE SUMMARY ==== - -Source Path: Repository: License: ------------- ----------- -------- -usb_flashdrive/lib github.com/felis/UHS30 GPLv2 or later - - -==== MARLIN INTEGRATION WORK ==== - -All additional work done to integrate USB into Marlin was performed by -AlephObjects, Inc. and is licensed under the GPLv3. - -This version of UHS3 has been modified for better compatibility with Marlin. -The upstream version of UHS 3.0 runs a frame timer interrupt every 1 ms to -handle device polling. This timer interrupt interferes with Marlin's stepper -IRQ, so the flag USB_HOST_MANUAL_POLL has been added to move the polling to -the idle task. Additional logic was added to disable and enable the frame -IRQ. - -SKIP_PAGE3F and USB_NO_TEST_UNIT_READY were added to work around bugs with -certain devices. - --- marcio@alephobjects.com diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h deleted file mode 100644 index b35e53686e..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h +++ /dev/null @@ -1,249 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and - Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#ifndef __UHS_BULK_STORAGE_H__ -#define __UHS_BULK_STORAGE_H__ - - -//////////////////////////////////////////////////////////////////////////////// -// Define any of these options at the top of your sketch to override -// the defaults contained herewith. Do NOT do modifications here. -// Macro | Settings and notes | Default -// -----------------------------------------+-----------------------+----------- -// | 1 to 8 | -// | Each LUN needs | -// MASS_MAX_SUPPORTED_LUN | ~13 bytes to be able | 8 -// | to track the state of | -// | each unit. | -// -----------------------------------------+-----------------------+----------- -// | Just define to use. | -// DEBUG_PRINTF_EXTRA_HUGE_UHS_BULK_STORAGE | works only if extra | -// | huge debug is on too. | -// -----------------------------------------^-----------------------^----------- - -#ifndef MASS_MAX_SUPPORTED_LUN -#define MASS_MAX_SUPPORTED_LUN 8 -#endif - -#include "UHS_SCSI.h" - -#define UHS_BULK_bmREQ_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE -#define UHS_BULK_bmREQ_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE - -// Request Codes -#define UHS_BULK_REQ_ADSC 0x00U -#define UHS_BULK_REQ_GET 0xFCU -#define UHS_BULK_REQ_PUT 0xFDU -#define UHS_BULK_REQ_GET_MAX_LUN 0xFEU -#define UHS_BULK_REQ_BOMSR 0xFFU // Mass Storage Reset - -#define UHS_BULK_CBW_SIGNATURE 0x43425355LU -#define UHS_BULK_CSW_SIGNATURE 0x53425355LU - -#define UHS_BULK_CMD_DIR_OUT 0x00U -#define UHS_BULK_CMD_DIR_IN 0x80U - -/* Bulk error codes */ -#define UHS_BULK_ERR_SUCCESS UHS_HOST_ERROR_NONE -#define UHS_BULK_ERR_PHASE_ERROR 0x22U -#define UHS_BULK_ERR_UNIT_NOT_READY 0x23U -#define UHS_BULK_ERR_UNIT_BUSY 0x24U -#define UHS_BULK_ERR_STALL 0x25U -#define UHS_BULK_ERR_CMD_NOT_SUPPORTED 0x26U -#define UHS_BULK_ERR_INVALID_CSW 0x27U -#define UHS_BULK_ERR_NO_MEDIA 0x28U -#define UHS_BULK_ERR_BAD_LBA 0x29U -#define UHS_BULK_ERR_MEDIA_CHANGED 0x2AU -#define UHS_BULK_ERR_DEVICE_DISCONNECTED UHS_HOST_ERROR_UNPLUGGED -#define UHS_BULK_ERR_UNABLE_TO_RECOVER 0x32U // Reset recovery error -#define UHS_BULK_ERR_INVALID_LUN 0x33U -#define UHS_BULK_ERR_WRITE_STALL 0x34U -#define UHS_BULK_ERR_READ_NAKS 0x35U -#define UHS_BULK_ERR_WRITE_NAKS 0x36U -#define UHS_BULK_ERR_WRITE_PROTECTED 0x37U -#define UHS_BULK_ERR_NOT_IMPLEMENTED 0xFDU -#define UHS_BULK_ERR_GENERAL_SCSI_ERROR 0xF0U -#define UHS_BULK_ERR_GENERAL_USB_ERROR 0xFFU -#define UHS_BULK_ERR_USER 0xA0U // For subclasses to define their own error codes - -#define MASS_MAX_ENDPOINTS 3 - -struct UHS_BULK_CommandBlockWrapperBase { - volatile uint32_t dCBWSignature; - volatile uint32_t dCBWTag; - volatile uint32_t dCBWDataTransferLength; - volatile uint8_t bmCBWFlags; -public: - - UHS_BULK_CommandBlockWrapperBase() { - } - - UHS_BULK_CommandBlockWrapperBase(uint32_t tag, uint32_t xflen, uint8_t flgs) : - dCBWSignature(UHS_BULK_CBW_SIGNATURE), dCBWTag(tag), dCBWDataTransferLength(xflen), bmCBWFlags(flgs) { - } -} __attribute__((packed)); - -struct UHS_BULK_CommandBlockWrapper : public UHS_BULK_CommandBlockWrapperBase { - - struct { - uint8_t bmCBWLUN : 4; - uint8_t bmReserved1 : 4; - }; - - struct { - uint8_t bmCBWCBLength : 4; - uint8_t bmReserved2 : 4; - }; - - uint8_t CBWCB[16]; - -public: - // All zeroed. - - UHS_BULK_CommandBlockWrapper() : - UHS_BULK_CommandBlockWrapperBase(0, 0, 0), bmReserved1(0), bmReserved2(0) { - for(int i = 0; i < 16; i++) CBWCB[i] = 0; - } - - // Generic Wrap, CDB zeroed. - - UHS_BULK_CommandBlockWrapper(uint32_t tag, uint32_t xflen, uint8_t flgs, uint8_t lu, uint8_t cmdlen, uint8_t cmd) : - UHS_BULK_CommandBlockWrapperBase(tag, xflen, flgs), - bmCBWLUN(lu), bmReserved1(0), bmCBWCBLength(cmdlen), bmReserved2(0) { - for(int i = 0; i < 16; i++) CBWCB[i] = 0; - SCSI_CDB_BASE_t *x = reinterpret_cast(CBWCB); - x->LUN = cmd; - } - - // Wrap for CDB of 6 - - UHS_BULK_CommandBlockWrapper(uint32_t tag, uint32_t xflen, SCSI_CDB6_t *cdb, uint8_t dir) : - UHS_BULK_CommandBlockWrapperBase(tag, xflen, dir), - bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(6), bmReserved2(0) { - memcpy(&CBWCB, cdb, 6); - } - // Wrap for CDB of 10 - - UHS_BULK_CommandBlockWrapper(uint32_t tag, uint32_t xflen, SCSI_CDB10_t *cdb, uint8_t dir) : - UHS_BULK_CommandBlockWrapperBase(tag, xflen, dir), - bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(10), bmReserved2(0) { - memcpy(&CBWCB, cdb, 10); - } -} __attribute__((packed)); - -struct UHS_BULK_CommandStatusWrapper { - uint32_t dCSWSignature; - uint32_t dCSWTag; - uint32_t dCSWDataResidue; - uint8_t bCSWStatus; -} __attribute__((packed)); - -class UHS_Bulk_Storage : public UHS_USBInterface { -protected: - static const uint8_t epDataInIndex = 1; // DataIn endpoint index - static const uint8_t epDataOutIndex = 2; // DataOUT endpoint index - static const uint8_t epInterruptInIndex = 3; // InterruptIN endpoint index - - uint8_t bMaxLUN; // Max LUN - volatile uint32_t dCBWTag; // Tag - volatile uint8_t bTheLUN; // Active LUN - volatile uint32_t CurrentCapacity[MASS_MAX_SUPPORTED_LUN]; // Total sectors - volatile uint16_t CurrentSectorSize[MASS_MAX_SUPPORTED_LUN]; // Sector size, clipped to 16 bits - volatile bool LUNOk[MASS_MAX_SUPPORTED_LUN]; // use this to check for media changes. - volatile bool WriteOk[MASS_MAX_SUPPORTED_LUN]; - void PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR* ep_ptr); - -public: - UHS_Bulk_Storage(UHS_USB_HOST_BASE *p); - - volatile UHS_EpInfo epInfo[MASS_MAX_ENDPOINTS]; - - uint8_t GetbMaxLUN() { - return bMaxLUN; // Max LUN - } - - uint8_t GetbTheLUN() { - return bTheLUN; // Active LUN - } - - bool WriteProtected(uint8_t lun); - uint8_t MediaCTL(uint8_t lun, uint8_t ctl); - uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf); - uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf); - uint8_t LockMedia(uint8_t lun, uint8_t lock); - - bool LUNIsGood(uint8_t lun); - uint32_t GetCapacity(uint8_t lun); - uint16_t GetSectorSize(uint8_t lun); - uint8_t SCSITransaction6(SCSI_CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir); - uint8_t SCSITransaction10(SCSI_CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir); - - - // Configure and internal methods, these should never be called by a user's sketch. - uint8_t Start(); - bool OKtoEnumerate(ENUMERATION_INFO *ei); - uint8_t SetInterface(ENUMERATION_INFO *ei); - - uint8_t GetAddress() { - return bAddress; - }; - - - void Poll(); - - void DriverDefaults(); - - -private: - void Reset(); - void CheckMedia(); - - bool IsValidCBW(uint8_t size, uint8_t *pcbw); - bool IsMeaningfulCBW(uint8_t size, uint8_t *pcbw); - bool IsValidCSW(UHS_BULK_CommandStatusWrapper *pcsw, UHS_BULK_CommandBlockWrapperBase *pcbw); - - bool CheckLUN(uint8_t lun); - - uint8_t Inquiry(uint8_t lun, uint16_t size, uint8_t *buf); - uint8_t TestUnitReady(uint8_t lun); - uint8_t RequestSense(uint8_t lun, uint16_t size, uint8_t *buf); - uint8_t ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t *buf); - uint8_t GetMaxLUN(uint8_t *max_lun); - uint8_t SetCurLUN(uint8_t lun); - uint8_t ResetRecovery(); - uint8_t ReadCapacity10(uint8_t lun, uint8_t *buf); - uint8_t Page3F(uint8_t lun); - uint8_t ClearEpHalt(uint8_t index); - uint8_t Transaction(UHS_BULK_CommandBlockWrapper *cbw, uint16_t bsize, void *buf); - uint8_t HandleUsbError(uint8_t error, uint8_t index); - uint8_t HandleSCSIError(uint8_t status); - -}; - -#if defined(LOAD_UHS_BULK_STORAGE) && !defined(UHS_BULK_STORAGE_LOADED) -#include "UHS_BULK_STORAGE_INLINE.h" -#endif -#endif // __MASSTORAGE_H__ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h deleted file mode 100644 index 37ba681c5c..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h +++ /dev/null @@ -1,1205 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#if defined(LOAD_UHS_BULK_STORAGE) && defined(__UHS_BULK_STORAGE_H__) && !defined(UHS_BULK_STORAGE_LOADED) -#define UHS_BULK_STORAGE_LOADED - -// uncomment to get 'printf' console debugging. NOT FOR UNO! -//#define DEBUG_PRINTF_EXTRA_HUGE_UHS_BULK_STORAGE - -#if DEBUG_PRINTF_EXTRA_HUGE -#ifdef DEBUG_PRINTF_EXTRA_HUGE_UHS_BULK_STORAGE -#define BS_HOST_DEBUG(...) printf(__VA_ARGS__) -#else -#define BS_HOST_DEBUG(...) VOID0 -#endif -#else -#define BS_HOST_DEBUG(...) VOID0 -#endif - -//////////////////////////////////////////////////////////////////////////////// - -// Interface code - -//////////////////////////////////////////////////////////////////////////////// - -/** - * Get the capacity of the media - * - * @param lun Logical Unit Number - * @return media capacity - */ -uint32_t UHS_NI UHS_Bulk_Storage::GetCapacity(uint8_t lun) { - uint32_t v = 0LU; - pUsb->DisablePoll(); - if(LUNOk[lun]) - v = CurrentCapacity[lun]; - pUsb->EnablePoll(); - return v; -} - -/** - * Get the sector (block) size used on the media - * - * @param lun Logical Unit Number - * @return media sector size - */ -uint16_t UHS_NI UHS_Bulk_Storage::GetSectorSize(uint8_t lun) { - uint16_t v = 0U; - pUsb->DisablePoll(); - if(LUNOk[lun]) - v = CurrentSectorSize[lun]; - pUsb->EnablePoll(); - return v; -} - -/** - * Test if LUN is ready for use - * - * @param lun Logical Unit Number - * @return true if LUN is ready for use - */ -bool UHS_NI UHS_Bulk_Storage::LUNIsGood(uint8_t lun) { - bool v; - pUsb->DisablePoll(); - v = LUNOk[lun]; - pUsb->EnablePoll(); - return v; -} - -/** - * Test if LUN is write protected - * - * @param lun Logical Unit Number - * @return cached status of write protect switch - */ -bool UHS_NI UHS_Bulk_Storage::WriteProtected(uint8_t lun) { - bool v; - pUsb->DisablePoll(); - v = WriteOk[lun]; - pUsb->EnablePoll(); - return v; -} - -/** - * Wrap and execute a SCSI CDB with length of 6 - * - * @param cdb CDB to execute - * @param buf_size Size of expected transaction - * @param buf Buffer - * @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::SCSITransaction6(SCSI_CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - pUsb->DisablePoll(); - // promote buf_size to 32bits. - UHS_BULK_CommandBlockWrapper cbw = UHS_BULK_CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir); - -#if 0 - // Lets check the CBW here: - printf("\r\n"); - printf("\r\n"); - uint8_t *dump = (uint8_t*)(&cbw); - - for(int i=0; i<(sizeof (UHS_BULK_CommandBlockWrapper)); i++) { - printf("%02.2x ", *dump); - dump++; - } - printf("\r\n"); - printf("\r\n"); -#endif - - uint8_t v = (HandleSCSIError(Transaction(&cbw, buf_size, buf))); - pUsb->EnablePoll(); - return v; -} - -/** - * Wrap and execute a SCSI CDB with length of 10 - * - * @param cdb CDB to execute - * @param buf_size Size of expected transaction - * @param buf Buffer - * @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::SCSITransaction10(SCSI_CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - pUsb->DisablePoll(); - // promote buf_size to 32bits. - UHS_BULK_CommandBlockWrapper cbw = UHS_BULK_CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir); - //SetCurLUN(cdb->LUN); - uint8_t v = (HandleSCSIError(Transaction(&cbw, buf_size, buf))); - pUsb->EnablePoll(); - return v; -} - -/** - * Lock or Unlock the tray or door on device. - * Caution: Some devices with buggy firmware will lock up. - * - * @param lun Logical Unit Number - * @param lock 1 to lock, 0 to unlock - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::LockMedia(uint8_t lun, uint8_t lock) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - pUsb->DisablePoll(); - Notify(PSTR("\r\nLockMedia\r\n"), 0x80); - Notify(PSTR("---------\r\n"), 0x80); - - SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_PREVENT_REMOVAL, lun, (uint8_t)0, lock); - - uint8_t v = SCSITransaction6(&cdb, (uint16_t)0, NULL, (uint8_t)UHS_BULK_CMD_DIR_IN); - pUsb->EnablePoll(); - return v; -} - -/** - * Media control, for spindle motor and media tray or door. - * This includes CDROM, TAPE and anything with a media loader. - * - * @param lun Logical Unit Number - * @param ctl 0x00 Stop Motor, 0x01 Start Motor, 0x02 Eject Media, 0x03 Load Media - * @return 0 on success - */ -uint8_t UHS_NI UHS_Bulk_Storage::MediaCTL(uint8_t lun, uint8_t ctl) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - pUsb->DisablePoll(); - Notify(PSTR("\r\nMediaCTL\r\n"), 0x80); - Notify(PSTR("-----------------\r\n"), 0x80); - - uint8_t rcode = UHS_BULK_ERR_UNIT_NOT_READY; - if(bAddress) { - SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_START_STOP_UNIT, lun, ctl & 0x03, 0); - rcode = SCSITransaction6(&cdb, (uint16_t)0, NULL, (uint8_t)UHS_BULK_CMD_DIR_OUT); - } else { - SetCurLUN(lun); - } - pUsb->EnablePoll(); - return rcode; -} - -/** - * Read data from media - * - * @param lun Logical Unit Number - * @param addr LBA address on media to read - * @param bsize size of a block (we should probably use the cached size) - * @param blocks how many blocks to read - * @param buf memory that is able to hold the requested data - * @return 0 on success - */ -uint8_t UHS_NI UHS_Bulk_Storage::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf) { - if(!bAddress) return UHS_BULK_ERR_NO_MEDIA; - uint8_t er = UHS_BULK_ERR_NO_MEDIA; - pUsb->DisablePoll(); - if(LUNOk[lun]) { - Notify(PSTR("\r\nRead LUN:\t"), 0x80); - D_PrintHex (lun, 0x90); - Notify(PSTR("\r\nLBA:\t\t"), 0x90); - D_PrintHex (addr, 0x90); - Notify(PSTR("\r\nblocks:\t\t"), 0x90); - D_PrintHex (blocks, 0x90); - Notify(PSTR("\r\nblock size:\t"), 0x90); - D_PrintHex (bsize, 0x90); - Notify(PSTR("\r\n---------\r\n"), 0x80); - SCSI_CDB10_t cdb = SCSI_CDB10_t(SCSI_CMD_READ_10, lun, blocks, addr); - -again: - er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), buf, (uint8_t)UHS_BULK_CMD_DIR_IN); - - if(er == UHS_BULK_ERR_STALL) { - MediaCTL(lun, 1); - - if(UHS_SLEEP_MS(150)) { - if(!TestUnitReady(lun)) goto again; - } - } - } - qNextPollTime = millis() + 100; - pUsb->EnablePoll(); - - return er; -} - -/** - * Write data to media - * - * @param lun Logical Unit Number - * @param addr LBA address on media to write - * @param bsize size of a block (we should probably use the cached size) - * @param blocks how many blocks to write - * @param buf memory that contains the data to write - * @return 0 on success - */ -uint8_t UHS_NI UHS_Bulk_Storage::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf) { - if(!bAddress) return UHS_BULK_ERR_NO_MEDIA; - uint8_t er = UHS_BULK_ERR_NO_MEDIA; - pUsb->DisablePoll(); - if(LUNOk[lun]) { - if(!WriteOk[lun]) { - er = UHS_BULK_ERR_WRITE_PROTECTED; - } else { - Notify(PSTR("\r\nWrite LUN:\t"), 0x80); - D_PrintHex (lun, 0x90); - Notify(PSTR("\r\nLBA:\t\t"), 0x90); - D_PrintHex (addr, 0x90); - Notify(PSTR("\r\nblocks:\t\t"), 0x90); - D_PrintHex (blocks, 0x90); - Notify(PSTR("\r\nblock size:\t"), 0x90); - D_PrintHex (bsize, 0x90); - Notify(PSTR("\r\n---------\r\n"), 0x80); - SCSI_CDB10_t cdb = SCSI_CDB10_t(SCSI_CMD_WRITE_10, lun, blocks, addr); - -again: - er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), (void*)buf, (uint8_t)UHS_BULK_CMD_DIR_OUT); - - if(er == UHS_BULK_ERR_WRITE_STALL) { - MediaCTL(lun, 1); - - if(UHS_SLEEP_MS(150)) { - if(!TestUnitReady(lun)) goto again; - } - } - } - } - qNextPollTime = millis() + 100; - pUsb->EnablePoll(); - - return er; -} - -// End of user functions, the remaining code below is driver internals. -// Only developer serviceable parts below! - -//////////////////////////////////////////////////////////////////////////////// - -// Main driver code - -//////////////////////////////////////////////////////////////////////////////// - -UHS_NI UHS_Bulk_Storage::UHS_Bulk_Storage(UHS_USB_HOST_BASE *p) { - pUsb = p; - dCBWTag = 0; - if(pUsb) { - - DriverDefaults(); - pUsb->RegisterDeviceClass(this); - // Serial.print("Bulk Register to USB Host @ 0x"); - // Serial.println((uint32_t)pUsb, HEX); - // Serial.print("Bulk Register to USB Host Address Pool @ 0x"); - // Serial.println((uint32_t)pUsb->GetAddressPool(), HEX); - } -} - -/** - * @param ei Enumeration information - * @return true if this interface driver can handle this interface description - */ -bool UHS_NI UHS_Bulk_Storage::OKtoEnumerate(ENUMERATION_INFO *ei) { - BS_HOST_DEBUG("BulkOnly: checking numep %i, klass %2.2x, subklass %2.2x\r\n", ei->interface.numep, ei->klass, ei->subklass); - BS_HOST_DEBUG("BulkOnly: checking protocol %2.2x, interface.klass %2.2x, interface.subklass %2.2x\r\n", ei->protocol, ei->interface.klass, ei->interface.subklass); - BS_HOST_DEBUG("BulkOnly: checking interface.protocol %2.2x\r\n", ei->interface.protocol); - // - // TO-DO? - // Check that we have 2 bulk endpoints, and one in each direction?? - // e.g. (ei->interface.numep > 1) && // two or more endpoints AND check types - // This will work with proper hardware though. - // - - return ( - ((ei->klass == UHS_USB_CLASS_MASS_STORAGE) || (ei->interface.klass == UHS_USB_CLASS_MASS_STORAGE)) && // mass storage class AND - ((ei->subklass == UHS_BULK_SUBCLASS_SCSI) || (ei->interface.subklass == UHS_BULK_SUBCLASS_SCSI)) && // SCSI command set AND - ((ei->protocol == UHS_STOR_PROTO_BBB) || (ei->interface.protocol == UHS_STOR_PROTO_BBB)) // Bulk Only transport - ); -} - -/** - * @param ei Enumeration information - * @return 0 always - */ -uint8_t UHS_NI UHS_Bulk_Storage::SetInterface(ENUMERATION_INFO *ei) { - uint8_t index; - - bAddress = ei->address; - BS_HOST_DEBUG("BS SetInterface\r\n"); - // Fill in the endpoint info structure - for(uint8_t ep = 0; ep < ei->interface.numep; ep++) { - BS_HOST_DEBUG("ep: 0x%2.2x bmAttributes: 0x%2.2x ", ep, ei->interface.epInfo[ep].bmAttributes); - if(ei->interface.epInfo[ep].bmAttributes == USB_TRANSFER_TYPE_BULK) { - index = ((ei->interface.epInfo[ep].bEndpointAddress & USB_TRANSFER_DIRECTION_IN) == USB_TRANSFER_DIRECTION_IN) ? epDataInIndex : epDataOutIndex; - epInfo[index].epAddr = (ei->interface.epInfo[ep].bEndpointAddress & 0x0F); - epInfo[index].maxPktSize = ei->interface.epInfo[ep].wMaxPacketSize; - epInfo[index].epAttribs = 0; - epInfo[index].bmNakPower = UHS_USB_NAK_MAX_POWER; - epInfo[index].bmSndToggle = 0; - epInfo[index].bmRcvToggle = 0; - epInfo[index].bIface=ei->interface.bInterfaceNumber; - BS_HOST_DEBUG("index: %i\r\n", index); - } - BS_HOST_DEBUG("\r\n"); - } - bNumEP = 3; - epInfo[0].epAddr = 0; - epInfo[0].maxPktSize = ei->bMaxPacketSize0; - epInfo[0].bmNakPower = UHS_USB_NAK_MAX_POWER; - bIface = ei->interface.bInterfaceNumber; - - return 0; -}; - -/** - * @return 0 for success - */ -uint8_t UHS_NI UHS_Bulk_Storage::Start() { - uint8_t rcode; - // Serial.print("Bulk Start from USB Host @ 0x"); - // Serial.println((uint32_t)pUsb, HEX); - // Serial.print("Bulk Start USB Host Address Pool @ 0x"); - // Serial.println((uint32_t)pUsb->GetAddressPool(), HEX); - - BS_HOST_DEBUG("BS Start, speed: %i\r\n", pUsb->GetAddressPool()->GetUsbDevicePtr(bAddress)->speed); - BS_HOST_DEBUG("BS Start\r\n"); - rcode = pUsb->setEpInfoEntry(bAddress, bIface, 3, epInfo); - // Serial.println(rcode,HEX); - if(rcode) goto FailOnInit; - - // Do a 1 second delay before LUN query - if(!UHS_SLEEP_MS(1000)) goto FailUnPlug; - - rcode = GetMaxLUN(&bMaxLUN); - BS_HOST_DEBUG("GetMaxLUN 0x%2.2x\r\n", rcode); - if(rcode) { - goto FailGetMaxLUN; - } - if(bMaxLUN >= MASS_MAX_SUPPORTED_LUN) bMaxLUN = MASS_MAX_SUPPORTED_LUN - 1; - BS_HOST_DEBUG("MaxLUN %u\r\n", bMaxLUN); - //ErrorMessage (PSTR("MaxLUN"), bMaxLUN); - if(!UHS_SLEEP_MS(150)) goto FailUnPlug; // Delay a bit for slow firmware. (again) - - for(uint8_t lun = 0; lun <= bMaxLUN; lun++) { - if(!UHS_SLEEP_MS(3)) goto FailUnPlug; - SCSI_Inquiry_Response response; - rcode = Inquiry(lun, sizeof (SCSI_Inquiry_Response), (uint8_t*) & response); - BS_HOST_DEBUG("Inquiry 0x%2.2x 0x%2.2x\r\n", sizeof (SCSI_Inquiry_Response), rcode); - if(rcode) { - goto FailInquiry; -#if 0 - } else { - BS_HOST_DEBUG("LUN %i `", lun); - uint8_t *buf = response.VendorID; - for(int i = 0; i < 28; i++) BS_HOST_DEBUG("%c", buf[i]); - BS_HOST_DEBUG("'\r\nQualifier %1.1X ", response.PeripheralQualifier); - BS_HOST_DEBUG("Device type %2.2X ", response.DeviceType); - BS_HOST_DEBUG("RMB %1.1X ", response.Removable); - BS_HOST_DEBUG("SSCS %1.1X ", response.SCCS); - uint8_t sv = response.Version; - BS_HOST_DEBUG("SCSI version %2.2X\r\nDevice conforms to ", sv); - switch(sv) { - case 0: - BS_HOST_DEBUG("No specific"); - break; - case 1: - BS_HOST_DEBUG("ANSI X3.131-1986 (ANSI 1)"); - break; - case 2: - BS_HOST_DEBUG("ANSI X3.131-1994 (ANSI 2)"); - break; - case 3: - BS_HOST_DEBUG("ANSI INCITS 301-1997 (SPC)"); - break; - case 4: - BS_HOST_DEBUG("ANSI INCITS 351-2001 (SPC-2)"); - break; - case 5: - BS_HOST_DEBUG("ANSI INCITS 408-2005 (SPC-4)"); - break; - case 6: - BS_HOST_DEBUG("T10/1731-D (SPC-4)"); - break; - default: - BS_HOST_DEBUG("unknown"); - } - BS_HOST_DEBUG(" standards.\r\n"); -#endif - } - } - - for(uint8_t lun = 0; lun <= bMaxLUN; lun++) { - if(!UHS_SLEEP_MS(3)) goto FailUnPlug; - #ifndef USB_NO_TEST_UNIT_READY - uint8_t tries = 0xF0; - while((rcode = TestUnitReady(lun))) { - BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xF0, rcode); - if(rcode == 0x08) break; // break on no media, this is OK to do. - if(rcode == UHS_BULK_ERR_DEVICE_DISCONNECTED) goto FailUnPlug; - if(rcode == UHS_BULK_ERR_INVALID_CSW) goto Fail; - if(rcode != UHS_BULK_ERR_MEDIA_CHANGED) goto Fail; - if(!UHS_SLEEP_MS(2 * (tries + 1))) goto FailUnPlug; - tries++; - if(!tries) break; - } - #else - // Don't wait for the LUN to become ready, as this will - // trigger Marlin's watchdog timer - rcode = -1; - #endif - if(!UHS_SLEEP_MS(3)) goto FailUnPlug; - LockMedia(lun, 1); - if(rcode == 0x08) { - if(!UHS_SLEEP_MS(3)) goto FailUnPlug; - if(MediaCTL(lun, 1) == UHS_BULK_ERR_DEVICE_DISCONNECTED) goto FailUnPlug; // I actually have a USB stick that needs this! - } - BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xF0, rcode); - if(!rcode) { - if(!UHS_SLEEP_MS(3)) goto FailUnPlug; - BS_HOST_DEBUG("CheckLUN...\r\n"); - BS_HOST_DEBUG("%lu\r\n", millis()/1000); - // Stalls on ***some*** devices, ***WHY***?! Device SAID it is READY!! - LUNOk[lun] = CheckLUN(lun); - BS_HOST_DEBUG("%lu\r\n", millis()/1000); - if(!LUNOk[lun]) LUNOk[lun] = CheckLUN(lun); - if(!UHS_SLEEP_MS(1)) goto FailUnPlug; - BS_HOST_DEBUG("Checked LUN...\r\n"); - } else { - LUNOk[lun] = false; - } - } - - rcode = OnStart(); - - if(rcode) goto FailOnInit; - -#ifdef DEBUG_USB_HOST - USBTRACE("BS configured\r\n\r\n"); -#endif - qNextPollTime = millis() + 100; - bPollEnable = true; - - return 0; -FailUnPlug: - rcode = UHS_BULK_ERR_DEVICE_DISCONNECTED; - goto Fail; - -FailOnInit: -#ifdef DEBUG_USB_HOST - USBTRACE("OnStart:"); - goto Fail; -#endif - -FailGetMaxLUN: -#ifdef DEBUG_USB_HOST - USBTRACE("GetMaxLUN:"); - goto Fail; -#endif - -FailInquiry: -#ifdef DEBUG_USB_HOST - USBTRACE("Inquiry:"); -#endif - -Fail: -#ifdef DEBUG_USB_HOST - NotifyFail(rcode); -#endif - Release(); - - return rcode; -} - -// Base class definition of Release() used. See UHS_USBInterface class definition for details - -/** - * For driver use only. - * - * @return - */ -//void UHS_NI UHS_Bulk_Storage::Release() { -// pUsb->DisablePoll(); -// OnRelease(); -// DriverDefaults(); -// pUsb->EnablePoll(); -// return; -//} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @return true if LUN is ready for use. - */ -bool UHS_NI UHS_Bulk_Storage::CheckLUN(uint8_t lun) { - uint8_t rcode; - SCSI_Capacity capacity; - for(uint8_t i = 0; i < 8; i++) capacity.data[i] = 0; - - rcode = ReadCapacity10(lun, (uint8_t*)capacity.data); - if(rcode) { - BS_HOST_DEBUG(">>>>>>>>>>>>>>>>ReadCapacity returned %i\r\n", rcode); - return false; - } -#ifdef DEBUG_USB_HOST - ErrorMessage (PSTR(">>>>>>>>>>>>>>>>CAPACITY OK ON LUN"), lun); - for(uint8_t i = 0; i < 8 /*sizeof (Capacity)*/; i++) - D_PrintHex (capacity.data[i], 0x80); - Notify(PSTR("\r\n\r\n"), 0x80); -#endif - // Only 512/1024/2048/4096 are valid values! - uint32_t c = UHS_BYTES_TO_UINT32(capacity.data[4], capacity.data[5], capacity.data[6], capacity.data[7]); - if(c != 0x0200LU && c != 0x0400LU && c != 0x0800LU && c != 0x1000LU) { - return false; - } - // Store capacity information. - CurrentSectorSize[lun] = (uint16_t)(c); // & 0xFFFF); - - CurrentCapacity[lun] = UHS_BYTES_TO_UINT32(capacity.data[0], capacity.data[1], capacity.data[2], capacity.data[3]) + 1; - if(CurrentCapacity[lun] == /*0xffffffffLU */ 0x01LU || CurrentCapacity[lun] == 0x00LU) { - // Buggy firmware will report 0xFFFFFFFF or 0 for no media -#ifdef DEBUG_USB_HOST - if(CurrentCapacity[lun]) - ErrorMessage (PSTR(">>>>>>>>>>>>>>>>BUGGY FIRMWARE. CAPACITY FAIL ON LUN"), lun); -#endif - return false; - } - if(!UHS_SLEEP_MS(20)) return false; - #ifndef SKIP_PAGE3F - Page3F(lun); - #endif - if(!TestUnitReady(lun)) return true; - - return false; -} - -/** - * For driver use only. - * - * Scan for media change on all LUNs - */ -void UHS_NI UHS_Bulk_Storage::CheckMedia() { - if(!bAddress) return; - for(uint8_t lun = 0; lun <= bMaxLUN; lun++) { - if(TestUnitReady(lun)) { - LUNOk[lun] = false; - continue; - } - if(!LUNOk[lun]) - LUNOk[lun] = CheckLUN(lun); - } -#if 0 - BS_HOST_DEBUG("}}}}}}}}}}}}}}}}STATUS "); - for(uint8_t lun = 0; lun <= bMaxLUN; lun++) { - if(LUNOk[lun]) - BS_HOST_DEBUG("#"); - - else BS_HOST_DEBUG("."); - } - BS_HOST_DEBUG("\r\n"); -#endif - OnPoll(); - qNextPollTime = millis() + 100; -} - -/** - * For driver use only. - */ -void UHS_NI UHS_Bulk_Storage::Poll() { - if((long)(millis() - qNextPollTime) >= 0L) { - - CheckMedia(); - } - - return; -} - -//////////////////////////////////////////////////////////////////////////////// - - -// SCSI code - - -//////////////////////////////////////////////////////////////////////////////// - -/** - * For driver use only. - * - * @param plun - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::GetMaxLUN(uint8_t *plun) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - uint8_t ret = pUsb->ctrlReq(bAddress, mkSETUP_PKT16(UHS_BULK_bmREQ_IN, UHS_BULK_REQ_GET_MAX_LUN, 0x0000U, bIface, 1), 1, plun); - - if(ret == UHS_HOST_ERROR_STALL) { - - *plun = 0; - Notify(PSTR("\r\nGetMaxLUN Stalled\r\n"), 0x80); - } - return 0; -} - -/** - * For driver use only. Used during Driver Start - * - * @param lun Logical Unit Number - * @param bsize - * @param buf - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::Inquiry(uint8_t lun, uint16_t bsize, uint8_t *buf) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - Notify(PSTR("\r\nInquiry\r\n"), 0x80); - Notify(PSTR("---------\r\n"), 0x80); - - SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_INQUIRY, lun, 0LU, (uint8_t)bsize, 0); - uint8_t rc = SCSITransaction6(&cdb, bsize, buf, (uint8_t)UHS_BULK_CMD_DIR_IN); - - return rc; -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::TestUnitReady(uint8_t lun) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - //SetCurLUN(lun); - if(!bAddress) - return UHS_BULK_ERR_UNIT_NOT_READY; - - Notify(PSTR("\r\nTestUnitReady\r\n"), 0x80); - Notify(PSTR("-----------------\r\n"), 0x80); - - SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_TEST_UNIT_READY, lun, (uint8_t)0, 0); - - return SCSITransaction6(&cdb, 0, NULL, (uint8_t)UHS_BULK_CMD_DIR_IN); - -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @param pc - * @param page - * @param subpage - * @param len - * @param pbuf - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t * pbuf) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - Notify(PSTR("\r\rModeSense\r\n"), 0x80); - Notify(PSTR("------------\r\n"), 0x80); - - SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_MODE_SENSE_6, lun, (uint32_t)((((pc << 6) | page) << 8) | subpage), len, 0); - - return SCSITransaction6(&cdb, len, pbuf, (uint8_t)UHS_BULK_CMD_DIR_IN); -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @param bsize - * @param buf - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::ReadCapacity10(uint8_t lun, uint8_t *buf) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - Notify(PSTR("\r\nReadCapacity\r\n"), 0x80); - Notify(PSTR("---------------\r\n"), 0x80); - - SCSI_CDB10_t cdb = SCSI_CDB10_t(SCSI_CMD_READ_CAPACITY_10, lun); - - return SCSITransaction10(&cdb, 8, buf, (uint8_t)UHS_BULK_CMD_DIR_IN); -} - -/** - * For driver use only. - * - * Page 3F contains write protect status. - * - * @param lun Logical Unit Number to test. - * @return Write protect switch status. - */ -uint8_t UHS_NI UHS_Bulk_Storage::Page3F(uint8_t lun) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - uint8_t buf[192]; - for(int i = 0; i < 192; i++) { - buf[i] = 0x00; - } - WriteOk[lun] = true; - uint8_t rc = ModeSense6(lun, 0, 0x3F, 0, 192, buf); - if(!rc) { - WriteOk[lun] = ((buf[2] & 0x80) == 0); -#ifdef DEBUG_USB_HOST - Notify(PSTR("Mode Sense: "), 0x80); - for(int i = 0; i < 4; i++) { - - D_PrintHex (buf[i], 0x80); - Notify(PSTR(" "), 0x80); - } - Notify(PSTR("\r\n"), 0x80); -#endif - } - return rc; -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @param size - * @param buf - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::RequestSense(uint8_t lun, uint16_t size, uint8_t *buf) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - pUsb->DisablePoll(); - Notify(PSTR("\r\nRequestSense\r\n"), 0x80); - Notify(PSTR("----------------\r\n"), 0x80); - - SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_REQUEST_SENSE, lun, 0LU, (uint8_t)size, 0); - UHS_BULK_CommandBlockWrapper cbw = UHS_BULK_CommandBlockWrapper(++dCBWTag, (uint32_t)size, &cdb, (uint8_t)UHS_BULK_CMD_DIR_IN); - uint8_t v = Transaction(&cbw, size, buf); - pUsb->EnablePoll(); - - return v; -} - - -//////////////////////////////////////////////////////////////////////////////// - - -// USB code - - -//////////////////////////////////////////////////////////////////////////////// - -/** - * For driver use only. - * - * @param index - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::ClearEpHalt(uint8_t index) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - uint8_t ret = 0; - if(index != 0) { - uint8_t ep = (index == epDataInIndex) ? (0x80 | epInfo[index].epAddr) : epInfo[index].epAddr; - do { - ret = pUsb->EPClearHalt(bAddress, ep); - if(!UHS_SLEEP_MS(6)) break; - } while(ret == 0x01); - - if(ret) { - ErrorMessage (PSTR("ClearEpHalt"), ret); - ErrorMessage (PSTR("EP"), ep); - epInfo[index].bmSndToggle = 0; - epInfo[index].bmRcvToggle = 0; - return ret; - } else { - - epInfo[index].bmSndToggle = 0; - epInfo[index].bmRcvToggle = 0; - } - } - return ret; -} - -/** - * For driver use only. - */ -void UHS_NI UHS_Bulk_Storage::Reset() { - if(!bAddress) return; - - while(pUsb->ctrlReq(bAddress, mkSETUP_PKT16(UHS_BULK_bmREQ_OUT, UHS_BULK_REQ_BOMSR, 0x0000U, bIface, 0), 0, NULL) == 0x01) { - if(!UHS_SLEEP_MS(6)) break; - } - - if(!bAddress) return; - - UHS_SLEEP_MS(2500); -} - -/** - * For driver use only. - * - * @return 0 if successful - */ -uint8_t UHS_NI UHS_Bulk_Storage::ResetRecovery() { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - Notify(PSTR("\r\nResetRecovery\r\n"), 0x80); - Notify(PSTR("-----------------\r\n"), 0x80); - qNextPollTime = millis() + 90000; - uint8_t bLastUsbError = UHS_HOST_ERROR_UNPLUGGED; - if(UHS_SLEEP_MS(6)) { - Reset(); - if(UHS_SLEEP_MS(6)) { - bLastUsbError = ClearEpHalt(epDataInIndex); - if(UHS_SLEEP_MS(6)) { - - bLastUsbError = ClearEpHalt(epDataOutIndex); - UHS_SLEEP_MS(6); - } - } - } - return bLastUsbError; -} - -/** - * For driver use only. - * - * Clear all EP data and clear all LUN status - */ -void UHS_NI UHS_Bulk_Storage::DriverDefaults() { - - pUsb->DeviceDefaults(MASS_MAX_ENDPOINTS, this); - - for(uint8_t i = 0; i < MASS_MAX_SUPPORTED_LUN; i++) { - - LUNOk[i] = false; - WriteOk[i] = false; - CurrentCapacity[i] = 0lu; - CurrentSectorSize[i] = 0; - } - - dCBWTag = 0; - bMaxLUN = 0; - bTheLUN = 0; -} - -/** - * For driver use only. - * - * @param pcsw - * @param pcbw - * @return - */ -bool UHS_NI UHS_Bulk_Storage::IsValidCSW(UHS_BULK_CommandStatusWrapper *pcsw, UHS_BULK_CommandBlockWrapperBase *pcbw) { - if(!bAddress) return false; - if(pcsw->dCSWSignature != UHS_BULK_CSW_SIGNATURE) { - Notify(PSTR("CSW:Sig error\r\n"), 0x80); - return false; - } - if(pcsw->dCSWTag != pcbw->dCBWTag) { - Notify(PSTR("CSW:Wrong tag\r\n"), 0x80); - ErrorMessage (PSTR("dCSWTag"), pcsw->dCSWTag); - ErrorMessage (PSTR("dCBWTag"), pcbw->dCBWTag); - - return false; - } - return true; -} - -/** - * For driver use only. - * - * @param error - * @param index - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::HandleUsbError(uint8_t error, uint8_t index) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - - uint8_t count = 3; - while(error && count) { - if(error != UHS_HOST_ERROR_NONE) { - ErrorMessage (PSTR("USB Error"), error); - ErrorMessage (PSTR("Index"), index); - } - switch(error) { - // case UHS_HOST_ERROR_WRONGPID: - case UHS_HOST_ERROR_NONE: - return UHS_BULK_ERR_SUCCESS; - case UHS_HOST_ERROR_BUSY: - // SIE is busy, just hang out and try again. - return UHS_BULK_ERR_UNIT_BUSY; - case UHS_HOST_ERROR_NAK: - return UHS_BULK_ERR_UNIT_BUSY; - case UHS_HOST_ERROR_UNPLUGGED: - case UHS_HOST_ERROR_TIMEOUT: - case UHS_HOST_ERROR_JERR: - return UHS_BULK_ERR_DEVICE_DISCONNECTED; - case UHS_HOST_ERROR_STALL: - if(index == 0) return UHS_BULK_ERR_STALL; - ClearEpHalt(index); - if(index != epDataInIndex) return UHS_BULK_ERR_WRITE_STALL; - return UHS_BULK_ERR_STALL; - - - case UHS_HOST_ERROR_TOGERR: - // Handle a very super rare corner case, where toggles become de-synched. - // I have only ran into one device that has this firmware bug, and this is - // the only clean way to get back into sync with the buggy device firmware. - // --AJK - if(bAddress && bConfNum) { - error = pUsb->setConf(bAddress, bConfNum); - - if(error) break; - } - return UHS_BULK_ERR_SUCCESS; - - default: - ErrorMessage (PSTR("\r\nUSB"), error); - - return UHS_BULK_ERR_GENERAL_USB_ERROR; - } - count--; - } // while - - return ((error && !count) ? UHS_BULK_ERR_GENERAL_USB_ERROR : UHS_BULK_ERR_SUCCESS); -} - -/** - * For driver use only. - * - * @param pcbw - * @param buf_size - * @param buf - * @param flags - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::Transaction(UHS_BULK_CommandBlockWrapper *pcbw, uint16_t buf_size, void *buf) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - - uint16_t bytes = buf_size; - bool write = (pcbw->bmCBWFlags & UHS_BULK_CMD_DIR_IN) != UHS_BULK_CMD_DIR_IN; - uint8_t ret = 0; - uint8_t usberr; - UHS_BULK_CommandStatusWrapper csw; // up here, we allocate ahead to save cpu cycles. - SetCurLUN(pcbw->bmCBWLUN); - ErrorMessage (PSTR("CBW.dCBWTag"), pcbw->dCBWTag); - - while((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, sizeof (UHS_BULK_CommandBlockWrapper), (uint8_t*)pcbw)) == UHS_HOST_ERROR_BUSY) { - if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - } - ret = HandleUsbError(usberr, epDataOutIndex); - if(ret) { - ErrorMessage (PSTR("============================ CBW"), ret); - } else { - if(bytes) { - if(!write) { - while((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*)buf)) == UHS_HOST_ERROR_BUSY) { - if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - } - ret = HandleUsbError(usberr, epDataInIndex); - } else { - while((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, bytes, (uint8_t*)buf)) == UHS_HOST_ERROR_BUSY) { - if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - } - ret = HandleUsbError(usberr, epDataOutIndex); - } - if(ret) { - ErrorMessage (PSTR("============================ DAT"), ret); - } - } - } - - { - bytes = sizeof (UHS_BULK_CommandStatusWrapper); - int tries = 2; - while(tries--) { - while((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*) & csw)) == UHS_HOST_ERROR_BUSY) { - if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - } - if(!usberr) break; - if(tries) { - if(usberr == UHS_HOST_ERROR_STALL) { - ResetRecovery(); - } else { - ClearEpHalt(epDataInIndex); - } - } - } - if(!ret) { - Notify(PSTR("CBW:\t\tOK\r\n"), 0x80); - Notify(PSTR("Data Stage:\tOK\r\n"), 0x80); - } else { - // Throw away csw, IT IS NOT OF ANY USE. - ResetRecovery(); - return ret; - } - ret = HandleUsbError(usberr, epDataInIndex); - if(ret) { - ErrorMessage (PSTR("============================ CSW"), ret); - } - if(usberr == UHS_HOST_ERROR_NONE) { - if(IsValidCSW(&csw, pcbw)) { - //ErrorMessage (PSTR("CSW.dCBWTag"), csw.dCSWTag); - //ErrorMessage (PSTR("bCSWStatus"), csw.bCSWStatus); - //ErrorMessage (PSTR("dCSWDataResidue"), csw.dCSWDataResidue); - Notify(PSTR("CSW:\t\tOK\r\n\r\n"), 0x80); - return csw.bCSWStatus; - } else { - // NOTE! Sometimes this is caused by the reported residue being wrong. - // Get a different device. It isn't compliant, and should have never passed Q&A. - // I own one... 05e3:0701 Genesys Logic, Inc. USB 2.0 IDE Adapter. - // Other devices that exhibit this behavior exist in the wild too. - // Be sure to check quirks in the Linux source code before reporting a bug. --xxxajk - Notify(PSTR("Invalid CSW\r\n"), 0x80); - Reset(); - ResetRecovery(); - - return UHS_BULK_ERR_INVALID_CSW; - } - } - } - return ret; -} - -/** - * For driver use only. - * - * @param lun Logical Unit Number - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::SetCurLUN(uint8_t lun) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - if(lun > bMaxLUN) - return UHS_BULK_ERR_INVALID_LUN; - bTheLUN = lun; - - return UHS_BULK_ERR_SUCCESS; -}; - -/** - * For driver use only. - * - * @param status - * @return - */ -uint8_t UHS_NI UHS_Bulk_Storage::HandleSCSIError(uint8_t status) { - if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - uint8_t ret = 0; - switch(status) { - case 0: return UHS_BULK_ERR_SUCCESS; - - case 2: - ErrorMessage (PSTR("Phase Error"), status); - ErrorMessage (PSTR("LUN"), bTheLUN); - ResetRecovery(); - return UHS_BULK_ERR_GENERAL_SCSI_ERROR; - - case 1: - ErrorMessage (PSTR("SCSI Error"), status); - ErrorMessage (PSTR("LUN"), bTheLUN); - SCSI_Request_Sense_Response rsp; - - ret = RequestSense(bTheLUN, sizeof (SCSI_Request_Sense_Response), (uint8_t*) & rsp); - - if(ret) { - if(ret == UHS_BULK_ERR_DEVICE_DISCONNECTED) return UHS_BULK_ERR_DEVICE_DISCONNECTED; - return UHS_BULK_ERR_GENERAL_SCSI_ERROR; - } -#if ENABLE_UHS_DEBUGGING - ErrorMessage (PSTR("Response Code"), rsp.bResponseCode); - if(rsp.bResponseCode & 0x80) { - Notify(PSTR("Information field: "), 0x80); - for(int i = 0; i < 4; i++) { - D_PrintHex (rsp.CmdSpecificInformation[i], 0x80); - Notify(PSTR(" "), 0x80); - } - Notify(PSTR("\r\n"), 0x80); - } - ErrorMessage (PSTR("Sense Key"), rsp.bmSenseKey); - ErrorMessage (PSTR("Add Sense Code"), rsp.bAdditionalSenseCode); - ErrorMessage (PSTR("Add Sense Qual"), rsp.bAdditionalSenseQualifier); -#endif - // warning, this is not testing ASQ, only SK and ASC. - switch(rsp.bmSenseKey) { - case SCSI_S_UNIT_ATTENTION: - switch(rsp.bAdditionalSenseCode) { - case SCSI_ASC_MEDIA_CHANGED: - return UHS_BULK_ERR_MEDIA_CHANGED; - default: - return UHS_BULK_ERR_UNIT_NOT_READY; - } - case SCSI_S_NOT_READY: - switch(rsp.bAdditionalSenseCode) { - case SCSI_ASC_MEDIUM_NOT_PRESENT: - return UHS_BULK_ERR_NO_MEDIA; - default: - return UHS_BULK_ERR_UNIT_NOT_READY; - } - case SCSI_S_ILLEGAL_REQUEST: - switch(rsp.bAdditionalSenseCode) { - case SCSI_ASC_LBA_OUT_OF_RANGE: - return UHS_BULK_ERR_BAD_LBA; - default: - return UHS_BULK_ERR_CMD_NOT_SUPPORTED; - } - default: - return UHS_BULK_ERR_GENERAL_SCSI_ERROR; - } - - // case 4: return MASS_ERR_UNIT_BUSY; // Busy means retry later. - // case 0x05/0x14: we stalled out - // case 0x15/0x16: we naked out. - default: - ErrorMessage (PSTR("Gen SCSI Err"), status); - ErrorMessage (PSTR("LUN"), bTheLUN); - - return status; - } // switch -} - - -//////////////////////////////////////////////////////////////////////////////// - - -// Debugging code - - -//////////////////////////////////////////////////////////////////////////////// - -/** - * @param ep_ptr - */ -void UHS_NI UHS_Bulk_Storage::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) { - Notify(PSTR("Endpoint descriptor:"), 0x80); - Notify(PSTR("\r\nLength:\t\t"), 0x80); - D_PrintHex (ep_ptr->bLength, 0x80); - Notify(PSTR("\r\nType:\t\t"), 0x80); - D_PrintHex (ep_ptr->bDescriptorType, 0x80); - Notify(PSTR("\r\nAddress:\t"), 0x80); - D_PrintHex (ep_ptr->bEndpointAddress, 0x80); - Notify(PSTR("\r\nAttributes:\t"), 0x80); - D_PrintHex (ep_ptr->bmAttributes, 0x80); - Notify(PSTR("\r\nMaxPktSize:\t"), 0x80); - D_PrintHex (ep_ptr->wMaxPacketSize, 0x80); - Notify(PSTR("\r\nPoll Intrv:\t"), 0x80); - D_PrintHex (ep_ptr->bInterval, 0x80); - Notify(PSTR("\r\n"), 0x80); -} - -#else -#error "Never include UHS_BULK_STORAGE_INLINE.h, include UHS_host.h instead" -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h deleted file mode 100644 index bead520bf2..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h +++ /dev/null @@ -1,327 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#ifndef UHS_SCSI_H -#define UHS_SCSI_H - -/* - * Reference documents from T10 (https://www.t10.org) - * SCSI Primary Commands - 3 (SPC-3) - * SCSI Block Commands - 2 (SBC-2) - * Multi-Media Commands - 5 (MMC-5) - */ - -/* Group 1 commands (CDB's here are should all be 6-bytes) */ -#define SCSI_CMD_TEST_UNIT_READY 0x00U -#define SCSI_CMD_REQUEST_SENSE 0x03U -#define SCSI_CMD_FORMAT_UNIT 0x04U -#define SCSI_CMD_READ_6 0x08U -#define SCSI_CMD_WRITE_6 0x0AU -#define SCSI_CMD_INQUIRY 0x12U -#define SCSI_CMD_MODE_SELECT_6 0x15U -#define SCSI_CMD_MODE_SENSE_6 0x1AU -#define SCSI_CMD_START_STOP_UNIT 0x1BU -#define SCSI_CMD_PREVENT_REMOVAL 0x1EU -/* Group 2 Commands (CDB's here are 10-bytes) */ -#define SCSI_CMD_READ_FORMAT_CAPACITIES 0x23U -#define SCSI_CMD_READ_CAPACITY_10 0x25U -#define SCSI_CMD_READ_10 0x28U -#define SCSI_CMD_WRITE_10 0x2AU -#define SCSI_CMD_SEEK_10 0x2BU -#define SCSI_CMD_ERASE_10 0x2CU -#define SCSI_CMD_WRITE_AND_VERIFY_10 0x2EU -#define SCSI_CMD_VERIFY_10 0x2FU -#define SCSI_CMD_SYNCHRONIZE_CACHE 0x35U -#define SCSI_CMD_WRITE_BUFFER 0x3BU -#define SCSI_CMD_READ_BUFFER 0x3CU -#define SCSI_CMD_READ_SUBCHANNEL 0x42U -#define SCSI_CMD_READ_TOC 0x43U -#define SCSI_CMD_READ_HEADER 0x44U -#define SCSI_CMD_PLAY_AUDIO_10 0x45U -#define SCSI_CMD_GET_CONFIGURATION 0x46U -#define SCSI_CMD_PLAY_AUDIO_MSF 0x47U -#define SCSI_CMD_PLAY_AUDIO_TI 0x48U -#define SCSI_CMD_PLAY_TRACK_REL_10 0x49U -#define SCSI_CMD_GET_EVENT_STATUS 0x4AU -#define SCSI_CMD_PAUSE_RESUME 0x4BU -#define SCSI_CMD_READ_DISC_INFORMATION 0x51U -#define SCSI_CMD_READ_TRACK_INFORMATION 0x52U -#define SCSI_CMD_RESERVE_TRACK 0x53U -#define SCSI_CMD_SEND_OPC_INFORMATION 0x54U -#define SCSI_CMD_MODE_SELECT_10 0x55U -#define SCSI_CMD_REPAIR_TRACK 0x58U -#define SCSI_CMD_MODE_SENSE_10 0x5AU -#define SCSI_CMD_CLOSE_TRACK_SESSION 0x5BU -#define SCSI_CMD_READ_BUFFER_CAPACITY 0x5CU -#define SCSI_CMD_SEND_CUE_SHEET 0x5DU -/* Group 5 Commands (CDB's here are 12-bytes) */ -#define SCSI_CMD_REPORT_LUNS 0xA0U -#define SCSI_CMD_BLANK 0xA1U -#define SCSI_CMD_SECURITY_PROTOCOL_IN 0xA2U -#define SCSI_CMD_SEND_KEY 0xA3U -#define SCSI_CMD_REPORT_KEY 0xA4U -#define SCSI_CMD_PLAY_AUDIO_12 0xA5U -#define SCSI_CMD_LOAD_UNLOAD 0xA6U -#define SCSI_CMD_SET_READ_AHEAD 0xA7U -#define SCSI_CMD_READ_12 0xA8U -#define SCSI_CMD_PLAY_TRACK_REL_12 0xA9U -#define SCSI_CMD_WRITE_12 0xAAU -#define SCSI_CMD_READ_MEDIA_SERIAL_12 0xABU -#define SCSI_CMD_GET_PERFORMANCE 0xACU -#define SCSI_CMD_READ_DVD_STRUCTURE 0xADU -#define SCSI_CMD_SECURITY_PROTOCOL_OUT 0xB5U -#define SCSI_CMD_SET_STREAMING 0xB6U -#define SCSI_CMD_READ_MSF 0xB9U -#define SCSI_CMD_SET_SPEED 0xBBU -#define SCSI_CMD_MECHANISM_STATUS 0xBDU -#define SCSI_CMD_READ_CD 0xBEU -#define SCSI_CMD_SEND_DISC_STRUCTURE 0xBFU -/* Vendor-unique Commands, included for completeness */ -#define SCSI_CMD_CD_PLAYBACK_STATUS 0xC4U /* SONY unique */ -#define SCSI_CMD_PLAYBACK_CONTROL 0xC9U /* SONY unique */ -#define SCSI_CMD_READ_CDDA 0xD8U /* Vendor unique */ -#define SCSI_CMD_READ_CDXA 0xDBU /* Vendor unique */ -#define SCSI_CMD_READ_ALL_SUBCODES 0xDFU /* Vendor unique */ - -/* SCSI error codes */ -#define SCSI_S_NOT_READY 0x02U -#define SCSI_S_MEDIUM_ERROR 0x03U -#define SCSI_S_ILLEGAL_REQUEST 0x05U -#define SCSI_S_UNIT_ATTENTION 0x06U -#define SCSI_ASC_LBA_OUT_OF_RANGE 0x21U -#define SCSI_ASC_MEDIA_CHANGED 0x28U -#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3AU - -struct SCSI_Capacity { - uint8_t data[8]; - //uint32_t dwBlockAddress; - //uint32_t dwBlockLength; -} __attribute__((packed)); - -struct SCSI_CDB_BASE { - uint8_t Opcode; - - unsigned unused : 5; - unsigned LUN : 3; - - uint8_t info[12]; -} __attribute__((packed)); - -typedef SCSI_CDB_BASE SCSI_CDB_BASE_t; - -struct SCSI_CDB6 { - uint8_t Opcode; - - unsigned LBAMSB : 5; - unsigned LUN : 3; - - uint8_t LBAHB; - uint8_t LBALB; - uint8_t AllocationLength; - uint8_t Control; - -public: - - SCSI_CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control) : - Opcode(_Opcode), LBAMSB(UHS_UINT8_BYTE2(LBA) & 0x1F), LUN(_LUN), LBAHB(UHS_UINT8_BYTE1(LBA)), LBALB(UHS_UINT8_BYTE0(LBA)), - AllocationLength(_AllocationLength), Control(_Control) { - } - - SCSI_CDB6(uint8_t _Opcode, uint8_t _LUN, uint8_t _AllocationLength, uint8_t _Control) : - Opcode(_Opcode), LBAMSB(0), LUN(_LUN), LBAHB(0), LBALB(0), - AllocationLength(_AllocationLength), Control(_Control) { - } -} __attribute__((packed)); - -typedef SCSI_CDB6 SCSI_CDB6_t; - -struct SCSI_CDB10 { - uint8_t Opcode; - - unsigned Service_Action : 5; - unsigned LUN : 3; - - uint8_t LBA_L_M_MB; - uint8_t LBA_L_M_LB; - uint8_t LBA_L_L_MB; - uint8_t LBA_L_L_LB; - - uint8_t Misc2; - - uint8_t ALC_MB; - uint8_t ALC_LB; - - uint8_t Control; -public: - - SCSI_CDB10(uint8_t _Opcode, uint8_t _LUN) : - Opcode(_Opcode), Service_Action(0), LUN(_LUN), - LBA_L_M_MB(0), LBA_L_M_LB(0), LBA_L_L_MB(0), LBA_L_L_LB(0), - Misc2(0), ALC_MB(0), ALC_LB(0), Control(0) { - } - - SCSI_CDB10(uint8_t _Opcode, uint8_t _LUN, uint16_t xflen, uint32_t _LBA) : - Opcode(_Opcode), Service_Action(0), LUN(_LUN), - LBA_L_M_MB(UHS_UINT8_BYTE3(_LBA)), LBA_L_M_LB(UHS_UINT8_BYTE2(_LBA)), LBA_L_L_MB(UHS_UINT8_BYTE1(_LBA)), LBA_L_L_LB(UHS_UINT8_BYTE0(_LBA)), - Misc2(0), ALC_MB(UHS_UINT8_BYTE1(xflen)), ALC_LB(UHS_UINT8_BYTE0(xflen)), Control(0) { - } -} __attribute__((packed)); - -typedef SCSI_CDB10 SCSI_CDB10_t; - -struct SCSI_CDB12 { - uint8_t Opcode; - - unsigned Service_Action : 5; - unsigned Misc : 3; - - uint8_t LBA_L_M_LB; - uint8_t LBA_L_L_MB; - uint8_t LBA_L_L_LB; - - uint8_t ALC_M_LB; - uint8_t ALC_L_MB; - uint8_t ALC_L_LB; - uint8_t Control; -} __attribute__((packed)); - -typedef SCSI_CDB12 SCSI_CDB12_t; - -struct SCSI_CDB_LBA32_16 { - uint8_t Opcode; - - unsigned Service_Action : 5; - unsigned Misc : 3; - - uint8_t LBA_L_M_MB; - uint8_t LBA_L_M_LB; - uint8_t LBA_L_L_MB; - uint8_t LBA_L_L_LB; - - uint8_t A_M_M_MB; - uint8_t A_M_M_LB; - uint8_t A_M_L_MB; - uint8_t A_M_L_LB; - - uint8_t ALC_M_MB; - uint8_t ALC_M_LB; - uint8_t ALC_L_MB; - uint8_t ALC_L_LB; - - uint8_t Misc2; - uint8_t Control; -} __attribute__((packed)); - -struct SCSI_CDB_LBA64_16 { - uint8_t Opcode; - uint8_t Misc; - - uint8_t LBA_M_M_MB; - uint8_t LBA_M_M_LB; - uint8_t LBA_M_L_MB; - uint8_t LBA_M_L_LB; - - uint8_t LBA_L_M_MB; - uint8_t LBA_L_M_LB; - uint8_t LBA_L_L_MB; - uint8_t LBA_L_L_LB; - - uint8_t ALC_M_MB; - uint8_t ALC_M_LB; - uint8_t ALC_L_MB; - uint8_t ALC_L_LB; - - uint8_t Misc2; - uint8_t Control; -} __attribute__((packed)); - -struct SCSI_Inquiry_Response { - uint8_t DeviceType : 5; - uint8_t PeripheralQualifier : 3; - - unsigned Reserved : 7; - unsigned Removable : 1; - - uint8_t Version; - - unsigned ResponseDataFormat : 4; - unsigned HISUP : 1; - unsigned NormACA : 1; - unsigned TrmTsk : 1; - unsigned AERC : 1; - - uint8_t AdditionalLength; - - unsigned PROTECT : 1; - unsigned Res : 2; - unsigned ThreePC : 1; - unsigned TPGS : 2; - unsigned ACC : 1; - unsigned SCCS : 1; - - unsigned ADDR16 : 1; - unsigned R1 : 1; - unsigned R2 : 1; - unsigned MCHNGR : 1; - unsigned MULTIP : 1; - unsigned VS : 1; - unsigned ENCSERV : 1; - unsigned BQUE : 1; - - unsigned SoftReset : 1; - unsigned CmdQue : 1; - unsigned Reserved4 : 1; - unsigned Linked : 1; - unsigned Sync : 1; - unsigned WideBus16Bit : 1; - unsigned WideBus32Bit : 1; - unsigned RelAddr : 1; - - uint8_t VendorID[8]; - uint8_t ProductID[16]; - uint8_t RevisionID[4]; -} __attribute__((packed)); - -struct SCSI_Request_Sense_Response { - uint8_t bResponseCode; - uint8_t bSegmentNumber; - - uint8_t bmSenseKey : 4; - uint8_t bmReserved : 1; - uint8_t bmILI : 1; - uint8_t bmEOM : 1; - uint8_t bmFileMark : 1; - - uint8_t Information[4]; - uint8_t bAdditionalLength; - uint8_t CmdSpecificInformation[4]; - uint8_t bAdditionalSenseCode; - uint8_t bAdditionalSenseQualifier; - uint8_t bFieldReplaceableUnitCode; - uint8_t SenseKeySpecific[3]; -} __attribute__((packed)); - -#endif /* UHS_SCSI_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UNOFFICIAL_IDs.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UNOFFICIAL_IDs.h deleted file mode 100644 index 6442bcc4b7..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UNOFFICIAL_IDs.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ -#ifndef _UHS_UNOFFICIAL_IDs_h -#define _UHS_UNOFFICIAL_IDs_h - -// Bogus unofficial and unregistered VIDs from cloners to be listed here. - -#define UHS_VID_UNOFFICIAL_JOYTECH 0x162EU // For unofficial Joytech controllers - -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_USB_IDs.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_USB_IDs.h deleted file mode 100644 index 417c9f6e69..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_USB_IDs.h +++ /dev/null @@ -1,2993 +0,0 @@ -/* - * USB vendor ids - * This file was generated by running python ./make-USB_IDs.py > UHS_USB_IDs.h - * Don't change it directly. - * - * Copyright 2014, Andrew J. Kroll for Circuits At Home, LTD. All rights reserved. - * - * Copyright 2012, Michal Labedzki for Tieto Corporation - * Other values imported from libghoto2/camlibs/ptp2/library.c, music-players.h - * Copyright (C) 2001-2005 Mariusz Woloszyn - * Copyright (C) 2003-2013 Marcus Meissner - * Copyright (C) 2005 Hubert Figuiere - * Copyright (C) 2009 Axel Waggershauser - * Copyright (C) 2005-2007 Richard A. Low - * Copyright (C) 2005-2012 Linus Walleij - * Copyright (C) 2007 Ted Bullock - * Copyright (C) 2012 Sony Mobile Communications AB - * - * Wireshark - Network traffic analyzer - * By Gerald Combs - * Copyright 1998 Gerald Combs - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -#ifndef _UHS_USB_IDs_h_ -#define _UHS_USB_IDs_h_ -#include "UHS_UNOFFICIAL_IDs.h" - -#define UHS_VID_FRYS_ELECTRONICS 0x0001U // Fry's Electronics -#define UHS_VID_INGRAM 0x0002U // Ingram -#define UHS_VID_CLUB_MAC 0x0003U // Club Mac -#define UHS_VID_NEBRASKA_FURNITURE_MART 0x0004U // Nebraska Furniture Mart -#define UHS_VID_UNKNOWN 0x0011U // Unknown -#define UHS_VID_PLANEX 0x0053U // Planex -#define UHS_VID_DRAGONRISE 0x0079U // DragonRise Inc. -#define UHS_VID_TRUST_INTERNATIONAL_BV 0x0105U // Trust International B.V. -#define UHS_VID_IBP 0x0127U // IBP -#define UHS_VID_UNKNOWN_1 0x0145U // Unknown -#define UHS_VID_MLK 0x017cU // MLK -#define UHS_VID_TP_LINK 0x0200U // TP-Link -#define UHS_VID_CHIPSBANK_MICROELECTRONICS 0x0204U // Chipsbank Microelectronics Co., Ltd -#define UHS_VID_HANGZHOU_WORLDE 0x0218U // Hangzhou Worlde -#define UHS_VID_HUMAX 0x02adU // HUMAX Co., Ltd. -#define UHS_VID_MM300_EBOOK_READER 0x0300U // MM300 eBook Reader -#define UHS_VID_OCZ_TECHNOLOGY 0x0324U // OCZ Technology Inc -#define UHS_VID_OCZ_TECHNOLOGY_1 0x0325U // OCZ Technology Inc -#define UHS_VID_LTS 0x0386U // LTS -#define UHS_VID_SHENZHEN_SINOTE_TECH_ELECTRON 0x03d9U // Shenzhen Sinote Tech-Electron Co., Ltd -#define UHS_VID_BERND_WALTER_COMPUTER_TECHNOLOGY 0x03daU // Bernd Walter Computer Technology -#define UHS_VID_ENDPOINTS 0x03e8U // EndPoints, Inc. -#define UHS_VID_THESYS_MICROELECTRONICS 0x03e9U // Thesys Microelectronics -#define UHS_VID_DATA_BROADCASTING 0x03eaU // Data Broadcasting Corp. -#define UHS_VID_ATMEL 0x03ebU // Atmel Corp. -#define UHS_VID_IWATSU_AMERICA 0x03ecU // Iwatsu America, Inc. -#define UHS_VID_MITEL 0x03edU // Mitel Corp. -#define UHS_VID_MITSUMI 0x03eeU // Mitsumi -#define UHS_VID_HEWLETT_PACKARD 0x03f0U // Hewlett-Packard -#define UHS_VID_GENOA_TECHNOLOGY 0x03f1U // Genoa Technology -#define UHS_VID_OAK_TECHNOLOGY 0x03f2U // Oak Technology, Inc. -#define UHS_VID_ADAPTEC 0x03f3U // Adaptec, Inc. -#define UHS_VID_DIEBOLD 0x03f4U // Diebold, Inc. -#define UHS_VID_SIEMENS_ELECTROMECHANICAL 0x03f5U // Siemens Electromechanical -#define UHS_VID_EPSON_IMAGING_TECHNOLOGY_CENTER 0x03f8U // Epson Imaging Technology Center -#define UHS_VID_KEYTRONIC 0x03f9U // KeyTronic Corp. -#define UHS_VID_OPTI 0x03fbU // OPTi, Inc. -#define UHS_VID_ELITEGROUP_COMPUTER_SYSTEMS 0x03fcU // Elitegroup Computer Systems -#define UHS_VID_XILINX 0x03fdU // Xilinx, Inc. -#define UHS_VID_FARALLON_COMUNICATIONS 0x03feU // Farallon Communications -#define UHS_VID_NATIONAL_SEMICONDUCTOR 0x0400U // National Semiconductor Corp. -#define UHS_VID_NATIONAL_REGISTRY 0x0401U // National Registry, Inc. -#define UHS_VID_ALI 0x0402U // ALi Corp. -#define UHS_VID_FUTURE_TECHNOLOGY_DEVICES_INTERNATIONAL 0x0403U // Future Technology Devices International, Ltd -#define UHS_VID_NCR 0x0404U // NCR Corp. -#define UHS_VID_SYNOPSYS 0x0405U // Synopsys, Inc. -#define UHS_VID_FUJITSU_ICL_COMPUTERS 0x0406U // Fujitsu-ICL Computers -#define UHS_VID_FUJITSU_PERSONAL_SYSTEMS 0x0407U // Fujitsu Personal Systems, Inc. -#define UHS_VID_QUANTA_COMPUTER 0x0408U // Quanta Computer, Inc. -#define UHS_VID_NEC 0x0409U // NEC Corp. -#define UHS_VID_KODAK 0x040aU // Kodak Co. -#define UHS_VID_WELTREND_SEMICONDUCTOR 0x040bU // Weltrend Semiconductor -#define UHS_VID_VTECH_COMPUTERS 0x040cU // VTech Computers, Ltd -#define UHS_VID_VIA_TECHNOLOGIES 0x040dU // VIA Technologies, Inc. -#define UHS_VID_MCCI 0x040eU // MCCI -#define UHS_VID_ECHO_SPEECH 0x040fU // Echo Speech Corp. -#define UHS_VID_BUFFALO_INC_FORMERLY_MELCO 0x0411U // BUFFALO INC. (formerly MelCo., Inc.) -#define UHS_VID_AWARD_SOFTWARE_INTERNATIONAL 0x0412U // Award Software International -#define UHS_VID_LEADTEK_RESEARCH 0x0413U // Leadtek Research, Inc. -#define UHS_VID_GIGA_BYTE_TECHNOLOGY 0x0414U // Giga-Byte Technology Co., Ltd -#define UHS_VID_WINBOND_ELECTRONICS 0x0416U // Winbond Electronics Corp. -#define UHS_VID_SYMBIOS_LOGIC 0x0417U // Symbios Logic -#define UHS_VID_AST_RESEARCH 0x0418U // AST Research -#define UHS_VID_SAMSUNG_INFO_SYSTEMS_AMERICA 0x0419U // Samsung Info. Systems America, Inc. -#define UHS_VID_PHOENIX_TECHNOLOGIES 0x041aU // Phoenix Technologies, Ltd -#define UHS_VID_DTV 0x041bU // d'TV -#define UHS_VID_S3 0x041dU // S3, Inc. -#define UHS_VID_CREATIVE_TECHNOLOGY 0x041eU // Creative Technology, Ltd -#define UHS_VID_LCS_TELEGRAPHICS 0x041fU // LCS Telegraphics -#define UHS_VID_CHIPS_AND_TECHNOLOGIES 0x0420U // Chips and Technologies -#define UHS_VID_NOKIA_MOBILE_PHONES 0x0421U // Nokia Mobile Phones -#define UHS_VID_ADI_SYSTEMS 0x0422U // ADI Systems, Inc. -#define UHS_VID_COMPUTER_ACCESS_TECHNOLOGY 0x0423U // Computer Access Technology Corp. -#define UHS_VID_STANDARD_MICROSYSTEMS 0x0424U // Standard Microsystems Corp. -#define UHS_VID_MOTOROLA_SEMICONDUCTORS_HK 0x0425U // Motorola Semiconductors HK, Ltd -#define UHS_VID_INTEGRATED_DEVICE_TECHNOLOGY 0x0426U // Integrated Device Technology, Inc. -#define UHS_VID_MOTOROLA_ELECTRONICS_TAIWAN 0x0427U // Motorola Electronics Taiwan, Ltd -#define UHS_VID_ADVANCED_GRAVIS_COMPUTER_TECH 0x0428U // Advanced Gravis Computer Tech, Ltd -#define UHS_VID_CIRRUS_LOGIC 0x0429U // Cirrus Logic -#define UHS_VID_ERICSSON_AUSTRIAN_AG 0x042aU // Ericsson Austrian, AG -#define UHS_VID_INTEL 0x042bU // Intel Corp. -#define UHS_VID_INNOVATIVE_SEMICONDUCTORS 0x042cU // Innovative Semiconductors, Inc. -#define UHS_VID_MICRONICS 0x042dU // Micronics -#define UHS_VID_ACER 0x042eU // Acer, Inc. -#define UHS_VID_MOLEX 0x042fU // Molex, Inc. -#define UHS_VID_SUN_MICROSYSTEMS 0x0430U // Sun Microsystems, Inc. -#define UHS_VID_ITAC_SYSTEMS 0x0431U // Itac Systems, Inc. -#define UHS_VID_UNISYS 0x0432U // Unisys Corp. -#define UHS_VID_ALPS_ELECTRIC 0x0433U // Alps Electric, Inc. -#define UHS_VID_SAMSUNG_INFO_SYSTEMS_AMERICA_1 0x0434U // Samsung Info. Systems America, Inc. -#define UHS_VID_HYUNDAI_ELECTRONICS_AMERICA 0x0435U // Hyundai Electronics America -#define UHS_VID_TAUGAGREINING_HF 0x0436U // Taugagreining HF -#define UHS_VID_FRAMATOME_CONNECTORS_USA 0x0437U // Framatome Connectors USA -#define UHS_VID_ADVANCED_MICRO_DEVICES 0x0438U // Advanced Micro Devices, Inc. -#define UHS_VID_VOICE_TECHNOLOGIES_GROUP 0x0439U // Voice Technologies Group -#define UHS_VID_LEXMARK_INTERNATIONAL 0x043dU // Lexmark International, Inc. -#define UHS_VID_LG_ELECTRONICS_USA 0x043eU // LG Electronics USA, Inc. -#define UHS_VID_RADISYS 0x043fU // RadiSys Corp. -#define UHS_VID_EIZO_NANAO 0x0440U // Eizo Nanao Corp. -#define UHS_VID_WINBOND_SYSTEMS_LAB 0x0441U // Winbond Systems Lab. -#define UHS_VID_ERICSSON 0x0442U // Ericsson, Inc. -#define UHS_VID_GATEWAY 0x0443U // Gateway, Inc. -#define UHS_VID_LUCENT_TECHNOLOGIES 0x0445U // Lucent Technologies, Inc. -#define UHS_VID_NMB_TECHNOLOGIES 0x0446U // NMB Technologies Corp. -#define UHS_VID_MOMENTUM_MICROSYSTEMS 0x0447U // Momentum Microsystems -#define UHS_VID_SHAMROCK_TECH 0x044aU // Shamrock Tech. Co., Ltd -#define UHS_VID_WSI 0x044bU // WSI -#define UHS_VID_CCLITRI 0x044cU // CCL/ITRI -#define UHS_VID_SIEMENS_NIXDORF_AG 0x044dU // Siemens Nixdorf AG -#define UHS_VID_ALPS_ELECTRIC_1 0x044eU // Alps Electric Co., Ltd -#define UHS_VID_THRUSTMASTER 0x044fU // ThrustMaster, Inc. -#define UHS_VID_DFI 0x0450U // DFI, Inc. -#define UHS_VID_TEXAS_INSTRUMENTS 0x0451U // Texas Instruments, Inc. -#define UHS_VID_MITSUBISHI_ELECTRONICS_AMERICA 0x0452U // Mitsubishi Electronics America, Inc. -#define UHS_VID_CMD_TECHNOLOGY 0x0453U // CMD Technology -#define UHS_VID_VOBIS_MICROCOMPUTER_AG 0x0454U // Vobis Microcomputer AG -#define UHS_VID_TELEMATICS_INTERNATIONAL 0x0455U // Telematics International, Inc. -#define UHS_VID_ANALOG_DEVICES 0x0456U // Analog Devices, Inc. -#define UHS_VID_SILICON_INTEGRATED_SYSTEMS 0x0457U // Silicon Integrated Systems Corp. -#define UHS_VID_KYE_SYSTEMS_CORP_MOUSE_SYSTEMS 0x0458U // KYE Systems Corp. (Mouse Systems) -#define UHS_VID_ADOBE_SYSTEMS 0x0459U // Adobe Systems, Inc. -#define UHS_VID_SONICBLUE 0x045aU // SONICblue, Inc. -#define UHS_VID_HITACHI 0x045bU // Hitachi, Ltd -#define UHS_VID_NORTEL_NETWORKS 0x045dU // Nortel Networks, Ltd -#define UHS_VID_MICROSOFT 0x045eU // Microsoft Corp. -#define UHS_VID_ACE_CAD_ENTERPRISE 0x0460U // Ace Cad Enterprise Co., Ltd -#define UHS_VID_PRIMAX_ELECTRONICS 0x0461U // Primax Electronics, Ltd -#define UHS_VID_MGE_UPS_SYSTEMS 0x0463U // MGE UPS Systems -#define UHS_VID_AMPTYCOELECTRONICS 0x0464U // AMP/Tycoelectronics Corp. -#define UHS_VID_ATANDT_PARADYNE 0x0467U // AT&T Paradyne -#define UHS_VID_WIESON_TECHNOLOGIES 0x0468U // Wieson Technologies Co., Ltd -#define UHS_VID_CHERRY 0x046aU // Cherry GmbH -#define UHS_VID_AMERICAN_MEGATRENDS 0x046bU // American Megatrends, Inc. -#define UHS_VID_TOSHIBA_CORP_DIGITAL_MEDIA_EQUIPMENT 0x046cU // Toshiba Corp., Digital Media Equipment -#define UHS_VID_LOGITECH 0x046dU // Logitech, Inc. -#define UHS_VID_BEHAVIOR_TECH_COMPUTER 0x046eU // Behavior Tech. Computer Corp. -#define UHS_VID_CRYSTAL_SEMICONDUCTOR 0x046fU // Crystal Semiconductor -#define UHS_VID_PHILIPS_OR_NXP 0x0471U // Philips (or NXP) -#define UHS_VID_CHICONY_ELECTRONICS 0x0472U // Chicony Electronics Co., Ltd -#define UHS_VID_SANYO_INFORMATION_BUSINESS 0x0473U // Sanyo Information Business Co., Ltd -#define UHS_VID_SANYO_ELECTRIC 0x0474U // Sanyo Electric Co., Ltd -#define UHS_VID_RELISYSTECO_INFORMATION_SYSTEM 0x0475U // Relisys/Teco Information System -#define UHS_VID_AESP 0x0476U // AESP -#define UHS_VID_SEAGATE_TECHNOLOGY 0x0477U // Seagate Technology, Inc. -#define UHS_VID_CONNECTIX 0x0478U // Connectix Corp. -#define UHS_VID_ADVANCED_PERIPHERAL_LABORATORIES 0x0479U // Advanced Peripheral Laboratories -#define UHS_VID_SEMTECH 0x047aU // Semtech Corp. -#define UHS_VID_SILITEK 0x047bU // Silitek Corp. -#define UHS_VID_DELL_COMPUTER 0x047cU // Dell Computer Corp. -#define UHS_VID_KENSINGTON 0x047dU // Kensington -#define UHS_VID_AGERE_SYSTEMS_INC_LUCENT 0x047eU // Agere Systems, Inc. (Lucent) -#define UHS_VID_PLANTRONICS 0x047fU // Plantronics, Inc. -#define UHS_VID_TOSHIBA_AMERICA 0x0480U // Toshiba America Inc -#define UHS_VID_ZENITH_DATA_SYSTEMS 0x0481U // Zenith Data Systems -#define UHS_VID_KYOCERA 0x0482U // Kyocera Corp. -#define UHS_VID_STMICROELECTRONICS 0x0483U // STMicroelectronics -#define UHS_VID_SPECIALIX 0x0484U // Specialix -#define UHS_VID_NOKIA_MONITORS 0x0485U // Nokia Monitors -#define UHS_VID_ASUS_COMPUTERS 0x0486U // ASUS Computers, Inc. -#define UHS_VID_STEWART_CONNECTOR 0x0487U // Stewart Connector -#define UHS_VID_CIRQUE 0x0488U // Cirque Corp. -#define UHS_VID_FOXCONN_HON_HAI 0x0489U // Foxconn / Hon Hai -#define UHS_VID_S_MOS_SYSTEMS 0x048aU // S-MOS Systems, Inc. -#define UHS_VID_ALPS_ELECTRIC_IRELAND 0x048cU // Alps Electric Ireland, Ltd -#define UHS_VID_INTEGRATED_TECHNOLOGY_EXPRESS 0x048dU // Integrated Technology Express, Inc. -#define UHS_VID_EICON_TECH 0x048fU // Eicon Tech. -#define UHS_VID_UNITED_MICROELECTRONICS 0x0490U // United Microelectronics Corp. -#define UHS_VID_CAPETRONIC 0x0491U // Capetronic -#define UHS_VID_SAMSUNG_SEMICONDUCTOR 0x0492U // Samsung SemiConductor, Inc. -#define UHS_VID_MAG_TECHNOLOGY 0x0493U // MAG Technology Co., Ltd -#define UHS_VID_ESS_TECHNOLOGY 0x0495U // ESS Technology, Inc. -#define UHS_VID_MICRON_ELECTRONICS 0x0496U // Micron Electronics -#define UHS_VID_SMILE_INTERNATIONAL 0x0497U // Smile International -#define UHS_VID_CAPETRONIC_KAOHSIUNG 0x0498U // Capetronic (Kaohsiung) Corp. -#define UHS_VID_YAMAHA 0x0499U // Yamaha Corp. -#define UHS_VID_GANDALF_TECHNOLOGIES 0x049aU // Gandalf Technologies, Ltd -#define UHS_VID_CURTIS_COMPUTER_PRODUCTS 0x049bU // Curtis Computer Products -#define UHS_VID_ACER_ADVANCED_LABS 0x049cU // Acer Advanced Labs, Inc. -#define UHS_VID_VLSI_TECHNOLOGY 0x049dU // VLSI Technology -#define UHS_VID_COMPAQ_COMPUTER 0x049fU // Compaq Computer Corp. -#define UHS_VID_DIGITAL_EQUIPMENT 0x04a0U // Digital Equipment Corp. -#define UHS_VID_SYSTEMSOFT 0x04a1U // SystemSoft Corp. -#define UHS_VID_FIREPOWER_SYSTEMS 0x04a2U // FirePower Systems -#define UHS_VID_TRIDENT_MICROSYSTEMS 0x04a3U // Trident Microsystems, Inc. -#define UHS_VID_HITACHI_1 0x04a4U // Hitachi, Ltd -#define UHS_VID_ACER_PERIPHERALS_INC_NOW_BENQ 0x04a5U // Acer Peripherals Inc. (now BenQ Corp.) -#define UHS_VID_NOKIA_DISPLAY_PRODUCTS 0x04a6U // Nokia Display Products -#define UHS_VID_VISIONEER 0x04a7U // Visioneer -#define UHS_VID_MULTIVIDEO_LABS 0x04a8U // Multivideo Labs, Inc. -#define UHS_VID_CANON 0x04a9U // Canon, Inc. -#define UHS_VID_DAEWOO_TELECOM 0x04aaU // DaeWoo Telecom, Ltd -#define UHS_VID_CHROMATIC_RESEARCH 0x04abU // Chromatic Research -#define UHS_VID_MICRO_AUDIOMETRICS 0x04acU // Micro Audiometrics Corp. -#define UHS_VID_DOOIN_ELECTRONICS 0x04adU // Dooin Electronics -#define UHS_VID_WINNOV_LP 0x04afU // Winnov L.P. -#define UHS_VID_NIKON 0x04b0U // Nikon Corp. -#define UHS_VID_PAN_INTERNATIONAL 0x04b1U // Pan International -#define UHS_VID_IBM 0x04b3U // IBM Corp. -#define UHS_VID_CYPRESS_SEMICONDUCTOR 0x04b4U // Cypress Semiconductor Corp. -#define UHS_VID_ROHM_LSI_SYSTEMS_USA 0x04b5U // ROHM LSI Systems USA, LLC -#define UHS_VID_HINT 0x04b6U // Hint Corp. -#define UHS_VID_COMPAL_ELECTRONICS 0x04b7U // Compal Electronics, Inc. -#define UHS_VID_SEIKO_EPSON 0x04b8U // Seiko Epson Corp. -#define UHS_VID_RAINBOW_TECHNOLOGIES 0x04b9U // Rainbow Technologies, Inc. -#define UHS_VID_TOUCAN_SYSTEMS 0x04baU // Toucan Systems, Ltd -#define UHS_VID_I_O_DATA_DEVICE 0x04bbU // I-O Data Device, Inc. -#define UHS_VID_TOSHIBA_ELECTRONICS_TAIWAN 0x04bdU // Toshiba Electronics Taiwan Corp. -#define UHS_VID_TELIA_RESEARCH 0x04beU // Telia Research AB -#define UHS_VID_TDK 0x04bfU // TDK Corp. -#define UHS_VID_US_ROBOTICS_3COM 0x04c1U // U.S. Robotics (3Com) -#define UHS_VID_METHODE_ELECTRONICS_FAR_EAST_PTE 0x04c2U // Methode Electronics Far East PTE, Ltd -#define UHS_VID_MAXI_SWITCH 0x04c3U // Maxi Switch, Inc. -#define UHS_VID_LOCKHEED_MARTIN_ENERGY_RESEARCH 0x04c4U // Lockheed Martin Energy Research -#define UHS_VID_FUJITSU 0x04c5U // Fujitsu, Ltd -#define UHS_VID_TOSHIBA_AMERICA_ELECTRONIC_COMPONENTS 0x04c6U // Toshiba America Electronic Components -#define UHS_VID_MICRO_MACRO_TECHNOLOGIES 0x04c7U // Micro Macro Technologies -#define UHS_VID_KONICA 0x04c8U // Konica Corp. -#define UHS_VID_LITE_ON_TECHNOLOGY 0x04caU // Lite-On Technology Corp. -#define UHS_VID_FUJI_PHOTO_FILM 0x04cbU // Fuji Photo Film Co., Ltd -#define UHS_VID_ST_ERICSSON 0x04ccU // ST-Ericsson -#define UHS_VID_TATUNG_CO_OF_AMERICA 0x04cdU // Tatung Co. Of America -#define UHS_VID_SCANLOGIC 0x04ceU // ScanLogic Corp. -#define UHS_VID_MYSON_CENTURY 0x04cfU // Myson Century, Inc. -#define UHS_VID_DIGI_INTERNATIONAL 0x04d0U // Digi International -#define UHS_VID_ITT_CANON 0x04d1U // ITT Canon -#define UHS_VID_ALTEC_LANSING_TECHNOLOGIES 0x04d2U // Altec Lansing Technologies -#define UHS_VID_VIDUS 0x04d3U // VidUS, Inc. -#define UHS_VID_LSI_LOGIC 0x04d4U // LSI Logic, Inc. -#define UHS_VID_FORTE_TECHNOLOGIES 0x04d5U // Forte Technologies, Inc. -#define UHS_VID_MENTOR_GRAPHICS 0x04d6U // Mentor Graphics -#define UHS_VID_OKI_SEMICONDUCTOR 0x04d7U // Oki Semiconductor -#define UHS_VID_MICROCHIP_TECHNOLOGY 0x04d8U // Microchip Technology, Inc. -#define UHS_VID_HOLTEK_SEMICONDUCTOR 0x04d9U // Holtek Semiconductor, Inc. -#define UHS_VID_PANASONIC_MATSUSHITA 0x04daU // Panasonic (Matsushita) -#define UHS_VID_HYPERTEC_PTY 0x04dbU // Hypertec Pty, Ltd -#define UHS_VID_HUAN_HSIN_HOLDINGS 0x04dcU // Huan Hsin Holdings, Ltd -#define UHS_VID_SHARP 0x04ddU // Sharp Corp. -#define UHS_VID_MINDSHARE 0x04deU // MindShare, Inc. -#define UHS_VID_INTERLINK_ELECTRONICS 0x04dfU // Interlink Electronics -#define UHS_VID_IIYAMA_NORTH_AMERICA 0x04e1U // Iiyama North America, Inc. -#define UHS_VID_EXAR 0x04e2U // Exar Corp. -#define UHS_VID_ZILOG 0x04e3U // Zilog, Inc. -#define UHS_VID_ACC_MICROELECTRONICS 0x04e4U // ACC Microelectronics -#define UHS_VID_PROMISE_TECHNOLOGY 0x04e5U // Promise Technology -#define UHS_VID_SCM_MICROSYSTEMS 0x04e6U // SCM Microsystems, Inc. -#define UHS_VID_ELO_TOUCHSYSTEMS 0x04e7U // Elo TouchSystems -#define UHS_VID_SAMSUNG_ELECTRONICS 0x04e8U // Samsung Electronics Co., Ltd -#define UHS_VID_PC_TEL 0x04e9U // PC-Tel, Inc. -#define UHS_VID_BROOKTREE 0x04eaU // Brooktree Corp. -#define UHS_VID_NORTHSTAR_SYSTEMS 0x04ebU // Northstar Systems, Inc. -#define UHS_VID_TOKYO_ELECTRON_DEVICE 0x04ecU // Tokyo Electron Device, Ltd -#define UHS_VID_ANNABOOKS 0x04edU // Annabooks -#define UHS_VID_PACIFIC_ELECTRONIC_INTERNATIONAL 0x04efU // Pacific Electronic International, Inc. -#define UHS_VID_DAEWOO_ELECTRONICS 0x04f0U // Daewoo Electronics Co., Ltd -#define UHS_VID_VICTOR_COMPANY_OF_JAPAN 0x04f1U // Victor Company of Japan, Ltd -#define UHS_VID_CHICONY_ELECTRONICS_1 0x04f2U // Chicony Electronics Co., Ltd -#define UHS_VID_ELAN_MICROELECTRONICS 0x04f3U // Elan Microelectronics Corp. -#define UHS_VID_HARTING_ELEKTRONIK 0x04f4U // Harting Elektronik, Inc. -#define UHS_VID_FUJITSU_ICL_SYSTEMS 0x04f5U // Fujitsu-ICL Systems, Inc. -#define UHS_VID_NORAND 0x04f6U // Norand Corp. -#define UHS_VID_NEWNEX_TECHNOLOGY 0x04f7U // Newnex Technology Corp. -#define UHS_VID_FUTUREPLUS_SYSTEMS 0x04f8U // FuturePlus Systems -#define UHS_VID_BROTHER_INDUSTRIES 0x04f9U // Brother Industries, Ltd -#define UHS_VID_DALLAS_SEMICONDUCTOR 0x04faU // Dallas Semiconductor -#define UHS_VID_BIOSTAR_MICROTECH_INTERNATIONAL 0x04fbU // Biostar Microtech International Corp. -#define UHS_VID_SUNPLUS_TECHNOLOGY 0x04fcU // Sunplus Technology Co., Ltd -#define UHS_VID_SOLITON_SYSTEMS_KK 0x04fdU // Soliton Systems, K.K. -#define UHS_VID_PFU 0x04feU // PFU, Ltd -#define UHS_VID_E_CMOS 0x04ffU // E-CMOS Corp. -#define UHS_VID_SIAM_UNITED_HI_TECH 0x0500U // Siam United Hi-Tech -#define UHS_VID_FUJIKURA_DDK 0x0501U // Fujikura DDK, Ltd -#define UHS_VID_ACER_1 0x0502U // Acer, Inc. -#define UHS_VID_HITACHI_AMERICA 0x0503U // Hitachi America, Ltd -#define UHS_VID_HAYES_MICROCOMPUTER_PRODUCTS 0x0504U // Hayes Microcomputer Products -#define UHS_VID_3COM 0x0506U // 3Com Corp. -#define UHS_VID_HOSIDEN 0x0507U // Hosiden Corp. -#define UHS_VID_CLARION 0x0508U // Clarion Co., Ltd -#define UHS_VID_AZTECH_SYSTEMS 0x0509U // Aztech Systems, Ltd -#define UHS_VID_CINCH_CONNECTORS 0x050aU // Cinch Connectors -#define UHS_VID_CABLE_SYSTEM_INTERNATIONAL 0x050bU // Cable System International -#define UHS_VID_INNOMEDIA 0x050cU // InnoMedia, Inc. -#define UHS_VID_BELKIN_COMPONENTS 0x050dU // Belkin Components -#define UHS_VID_NEON_TECHNOLOGY 0x050eU // Neon Technology, Inc. -#define UHS_VID_KC_TECHNOLOGY 0x050fU // KC Technology, Inc. -#define UHS_VID_SEJIN_ELECTRON 0x0510U // Sejin Electron, Inc. -#define UHS_VID_NABLE_DATABOOK_TECHNOLOGIES 0x0511U // N'Able (DataBook) Technologies, Inc. -#define UHS_VID_HUALON_MICROELECTRONICS 0x0512U // Hualon Microelectronics Corp. -#define UHS_VID_DIGITAL_X 0x0513U // digital-X, Inc. -#define UHS_VID_FCI_ELECTRONICS 0x0514U // FCI Electronics -#define UHS_VID_ACTC 0x0515U // ACTC -#define UHS_VID_LONGWELL_ELECTRONICS 0x0516U // Longwell Electronics -#define UHS_VID_BUTTERFLY_COMMUNICATIONS 0x0517U // Butterfly Communications -#define UHS_VID_EZKEY 0x0518U // EzKEY Corp. -#define UHS_VID_STAR_MICRONICS 0x0519U // Star Micronics Co., Ltd -#define UHS_VID_WYSE_TECHNOLOGY 0x051aU // WYSE Technology -#define UHS_VID_SILICON_GRAPHICS 0x051bU // Silicon Graphics -#define UHS_VID_SHUTTLE 0x051cU // Shuttle, Inc. -#define UHS_VID_AMERICAN_POWER_CONVERSION 0x051dU // American Power Conversion -#define UHS_VID_SCIENTIFIC_ATLANTA 0x051eU // Scientific Atlanta, Inc. -#define UHS_VID_IO_SYSTEMS_ELITE_ELECTRONICS 0x051fU // IO Systems (Elite Electronics), Inc. -#define UHS_VID_TAIWAN_SEMICONDUCTOR_MANUFACTURING 0x0520U // Taiwan Semiconductor Manufacturing Co. -#define UHS_VID_AIRBORN_CONNECTORS 0x0521U // Airborn Connectors -#define UHS_VID_ADVANCED_CONNECTEK 0x0522U // Advanced Connectek, Inc. -#define UHS_VID_ATEN 0x0523U // ATEN GmbH -#define UHS_VID_SOLA_ELECTRONICS 0x0524U // Sola Electronics -#define UHS_VID_NETCHIP_TECHNOLOGY 0x0525U // Netchip Technology, Inc. -#define UHS_VID_TEMIC_MHS 0x0526U // Temic MHS S.A. -#define UHS_VID_ALTRA 0x0527U // ALTRA -#define UHS_VID_ATI_TECHNOLOGIES 0x0528U // ATI Technologies, Inc. -#define UHS_VID_ALADDIN_KNOWLEDGE_SYSTEMS 0x0529U // Aladdin Knowledge Systems -#define UHS_VID_CRESCENT_HEART_SOFTWARE 0x052aU // Crescent Heart Software -#define UHS_VID_TEKOM_TECHNOLOGIES 0x052bU // Tekom Technologies, Inc. -#define UHS_VID_CANON_INFORMATION_SYSTEMS 0x052cU // Canon Information Systems, Inc. -#define UHS_VID_AVID_ELECTRONICS 0x052dU // Avid Electronics Corp. -#define UHS_VID_STANDARD_MICROSYSTEMS_1 0x052eU // Standard Microsystems Corp. -#define UHS_VID_UNICORE_SOFTWARE 0x052fU // Unicore Software, Inc. -#define UHS_VID_AMERICAN_MICROSYSTEMS 0x0530U // American Microsystems, Inc. -#define UHS_VID_WACOM_TECHNOLOGY 0x0531U // Wacom Technology Corp. -#define UHS_VID_SYSTECH 0x0532U // Systech Corp. -#define UHS_VID_ALCATEL_MOBILE_PHONES 0x0533U // Alcatel Mobile Phones -#define UHS_VID_MOTOROLA 0x0534U // Motorola, Inc. -#define UHS_VID_LIH_TZU_ELECTRIC 0x0535U // LIH TZU Electric Co., Ltd -#define UHS_VID_HAND_HELD_PRODUCTS_WELCH_ALLYN 0x0536U // Hand Held Products (Welch Allyn, Inc.) -#define UHS_VID_INVENTEC 0x0537U // Inventec Corp. -#define UHS_VID_CALDERA_INTERNATIONAL_INC_SCO 0x0538U // Caldera International, Inc. (SCO) -#define UHS_VID_SHYH_SHIUN_TERMINALS 0x0539U // Shyh Shiun Terminals Co., Ltd -#define UHS_VID_PREHKEYTEC 0x053aU // PrehKeyTec GmbH -#define UHS_VID_GLOBAL_VILLAGE_COMMUNICATION 0x053bU // Global Village Communication -#define UHS_VID_INSTITUT_OF_MICROELECTRONIC_AND_MECHATRONIC_SYSTEMS 0x053cU // Institut of Microelectronic & Mechatronic Systems -#define UHS_VID_SILICON_ARCHITECT 0x053dU // Silicon Architect -#define UHS_VID_MOBILITY_ELECTRONICS 0x053eU // Mobility Electronics -#define UHS_VID_SYNOPSYS_1 0x053fU // Synopsys, Inc. -#define UHS_VID_UNIACCESS 0x0540U // UniAccess AB -#define UHS_VID_SIRF_TECHNOLOGY 0x0541U // Sirf Technology, Inc. -#define UHS_VID_VIEWSONIC 0x0543U // ViewSonic Corp. -#define UHS_VID_CRISTIE_ELECTRONICS 0x0544U // Cristie Electronics, Ltd -#define UHS_VID_XIRLINK 0x0545U // Xirlink, Inc. -#define UHS_VID_POLAROID 0x0546U // Polaroid Corp. -#define UHS_VID_ANCHOR_CHIPS 0x0547U // Anchor Chips, Inc. -#define UHS_VID_TYAN_COMPUTER 0x0548U // Tyan Computer Corp. -#define UHS_VID_PIXERA 0x0549U // Pixera Corp. -#define UHS_VID_FUJITSU_MICROELECTRONICS 0x054aU // Fujitsu Microelectronics, Inc. -#define UHS_VID_NEW_MEDIA 0x054bU // New Media Corp. -#define UHS_VID_SONY 0x054cU // Sony Corp. -#define UHS_VID_TRY 0x054dU // Try Corp. -#define UHS_VID_PROSIDE 0x054eU // Proside Corp. -#define UHS_VID_WYSE_TECHNOLOGY_TAIWAN 0x054fU // WYSE Technology Taiwan -#define UHS_VID_FUJI_XEROX 0x0550U // Fuji Xerox Co., Ltd -#define UHS_VID_COMPUTREND_SYSTEMS 0x0551U // CompuTrend Systems, Inc. -#define UHS_VID_PHILIPS_MONITORS 0x0552U // Philips Monitors -#define UHS_VID_STMICROELECTRONICS_IMAGING_DIVISION_VLSI_VISION 0x0553U // STMicroelectronics Imaging Division (VLSI Vision) -#define UHS_VID_DICTAPHONE 0x0554U // Dictaphone Corp. -#define UHS_VID_ANAM_SANDT 0x0555U // ANAM S&T Co., Ltd -#define UHS_VID_ASAHI_KASEI_MICROSYSTEMS 0x0556U // Asahi Kasei Microsystems Co., Ltd -#define UHS_VID_ATEN_INTERNATIONAL 0x0557U // ATEN International Co., Ltd -#define UHS_VID_TRUEVISION 0x0558U // Truevision, Inc. -#define UHS_VID_CADENCE_DESIGN_SYSTEMS 0x0559U // Cadence Design Systems, Inc. -#define UHS_VID_KENWOOD_USA 0x055aU // Kenwood USA -#define UHS_VID_KNOWLEDGETEK 0x055bU // KnowledgeTek, Inc. -#define UHS_VID_PROTON_ELECTRONIC_IND 0x055cU // Proton Electronic Ind. -#define UHS_VID_SAMSUNG_ELECTRO_MECHANICS 0x055dU // Samsung Electro-Mechanics Co. -#define UHS_VID_CTX_OPTO_ELECTRONICS 0x055eU // CTX Opto-Electronics Corp. -#define UHS_VID_MUSTEK_SYSTEMS 0x055fU // Mustek Systems, Inc. -#define UHS_VID_INTERFACE 0x0560U // Interface Corp. -#define UHS_VID_OASIS_DESIGN 0x0561U // Oasis Design, Inc. -#define UHS_VID_TELEX_COMMUNICATIONS 0x0562U // Telex Communications, Inc. -#define UHS_VID_IMMERSION 0x0563U // Immersion Corp. -#define UHS_VID_KODAK_DIGITAL_PRODUCT_CENTER_JAPAN_LTD_FORMERLY_CHINON_INDUSTRIES 0x0564U // Kodak Digital Product Center, Japan Ltd. (formerly Chinon Industries Inc.) -#define UHS_VID_PERACOM_NETWORKS 0x0565U // Peracom Networks, Inc. -#define UHS_VID_MONTEREY_INTERNATIONAL 0x0566U // Monterey International Corp. -#define UHS_VID_XYRATEX_INTERNATIONAL 0x0567U // Xyratex International, Ltd -#define UHS_VID_QUARTZ_INGENIERIE 0x0568U // Quartz Ingenierie -#define UHS_VID_SEGASOFT 0x0569U // SegaSoft -#define UHS_VID_WACOM 0x056aU // Wacom Co., Ltd -#define UHS_VID_DECICON 0x056bU // Decicon, Inc. -#define UHS_VID_ETEK_LABS 0x056cU // eTEK Labs -#define UHS_VID_EIZO 0x056dU // EIZO Corp. -#define UHS_VID_ELECOM 0x056eU // Elecom Co., Ltd -#define UHS_VID_KOREA_DATA_SYSTEMS 0x056fU // Korea Data Systems Co., Ltd -#define UHS_VID_EPSON_AMERICA 0x0570U // Epson America -#define UHS_VID_INTEREX 0x0571U // Interex, Inc. -#define UHS_VID_CONEXANT_SYSTEMS_ROCKWELL 0x0572U // Conexant Systems (Rockwell), Inc. -#define UHS_VID_ZORAN_CO_PERSONAL_MEDIA_DIVISION_NOGATECH 0x0573U // Zoran Co. Personal Media Division (Nogatech) -#define UHS_VID_CITY_UNIVERSITY_OF_HONG_KONG 0x0574U // City University of Hong Kong -#define UHS_VID_PHILIPS_CREATIVE_DISPLAY_SOLUTIONS 0x0575U // Philips Creative Display Solutions -#define UHS_VID_BAFOQUALITY_COMPUTER_ACCESSORIES 0x0576U // BAFO/Quality Computer Accessories -#define UHS_VID_ELSA 0x0577U // ELSA -#define UHS_VID_INTRINSIX 0x0578U // Intrinsix Corp. -#define UHS_VID_GVC 0x0579U // GVC Corp. -#define UHS_VID_SAMSUNG_ELECTRONICS_AMERICA 0x057aU // Samsung Electronics America -#define UHS_VID_Y_E_DATA 0x057bU // Y-E Data, Inc. -#define UHS_VID_AVM 0x057cU // AVM GmbH -#define UHS_VID_SHARK_MULTIMEDIA 0x057dU // Shark Multimedia, Inc. -#define UHS_VID_NINTENDO 0x057eU // Nintendo Co., Ltd -#define UHS_VID_QUICKSHOT 0x057fU // QuickShot, Ltd -#define UHS_VID_DENRON 0x0580U // Denron, Inc. -#define UHS_VID_RACAL_DATA_GROUP 0x0581U // Racal Data Group -#define UHS_VID_ROLAND 0x0582U // Roland Corp. -#define UHS_VID_PADIX_CO_LTD_ROCKFIRE 0x0583U // Padix Co., Ltd (Rockfire) -#define UHS_VID_RATOC_SYSTEM 0x0584U // RATOC System, Inc. -#define UHS_VID_FLASHPOINT_TECHNOLOGY 0x0585U // FlashPoint Technology, Inc. -#define UHS_VID_ZYXEL_COMMUNICATIONS 0x0586U // ZyXEL Communications Corp. -#define UHS_VID_AMERICA_KOTOBUKI_ELECTRONICS_INDUSTRIES 0x0587U // America Kotobuki Electronics Industries, Inc. -#define UHS_VID_SAPIEN_DESIGN 0x0588U // Sapien Design -#define UHS_VID_VICTRON 0x0589U // Victron -#define UHS_VID_NOHAU 0x058aU // Nohau Corp. -#define UHS_VID_INFINEON_TECHNOLOGIES 0x058bU // Infineon Technologies -#define UHS_VID_IN_FOCUS_SYSTEMS 0x058cU // In Focus Systems -#define UHS_VID_MICREL_SEMICONDUCTOR 0x058dU // Micrel Semiconductor -#define UHS_VID_TRIPATH_TECHNOLOGY 0x058eU // Tripath Technology, Inc. -#define UHS_VID_ALCOR_MICRO 0x058fU // Alcor Micro Corp. -#define UHS_VID_OMRON 0x0590U // Omron Corp. -#define UHS_VID_QUESTRA_CONSULTING 0x0591U // Questra Consulting -#define UHS_VID_POWERWARE 0x0592U // Powerware Corp. -#define UHS_VID_INCITE 0x0593U // Incite -#define UHS_VID_PRINCETON_GRAPHIC_SYSTEMS 0x0594U // Princeton Graphic Systems -#define UHS_VID_ZORAN_MICROELECTRONICS 0x0595U // Zoran Microelectronics, Ltd -#define UHS_VID_MICROTOUCH_SYSTEMS 0x0596U // MicroTouch Systems, Inc. -#define UHS_VID_TRISIGNAL_COMMUNICATIONS 0x0597U // Trisignal Communications -#define UHS_VID_NIIGATA_CANOTEC 0x0598U // Niigata Canotec Co., Inc. -#define UHS_VID_BRILLIANCE_SEMICONDUCTOR 0x0599U // Brilliance Semiconductor, Inc. -#define UHS_VID_SPECTRUM_SIGNAL_PROCESSING 0x059aU // Spectrum Signal Processing, Inc. -#define UHS_VID_IOMEGA 0x059bU // Iomega Corp. -#define UHS_VID_A_TREND_TECHNOLOGY 0x059cU // A-Trend Technology Co., Ltd -#define UHS_VID_ADVANCED_INPUT_DEVICES 0x059dU // Advanced Input Devices -#define UHS_VID_INTELLIGENT_INSTRUMENTATION 0x059eU // Intelligent Instrumentation -#define UHS_VID_LACIE 0x059fU // LaCie, Ltd -#define UHS_VID_VETRONIX 0x05a0U // Vetronix Corp. -#define UHS_VID_USC 0x05a1U // USC Corp. -#define UHS_VID_FUJI_FILM_MICRODEVICES 0x05a2U // Fuji Film Microdevices Co., Ltd -#define UHS_VID_ARC_INTERNATIONAL 0x05a3U // ARC International -#define UHS_VID_ORTEK_TECHNOLOGY 0x05a4U // Ortek Technology, Inc. -#define UHS_VID_SAMPO_TECHNOLOGY 0x05a5U // Sampo Technology Corp. -#define UHS_VID_CISCO_SYSTEMS 0x05a6U // Cisco Systems, Inc. -#define UHS_VID_BOSE 0x05a7U // Bose Corp. -#define UHS_VID_SPACETEC_IMC 0x05a8U // Spacetec IMC Corp. -#define UHS_VID_OMNIVISION_TECHNOLOGIES 0x05a9U // OmniVision Technologies, Inc. -#define UHS_VID_UTILUX_SOUTH_CHINA 0x05aaU // Utilux South China, Ltd -#define UHS_VID_IN_SYSTEM_DESIGN 0x05abU // In-System Design -#define UHS_VID_APPLE 0x05acU // Apple, Inc. -#define UHS_VID_YC_CABLE_USA 0x05adU // Y.C. Cable U.S.A., Inc. -#define UHS_VID_SYNOPSYS_2 0x05aeU // Synopsys, Inc. -#define UHS_VID_JING_MOLD_ENTERPRISE 0x05afU // Jing-Mold Enterprise Co., Ltd -#define UHS_VID_FOUNTAIN_TECHNOLOGIES 0x05b0U // Fountain Technologies, Inc. -#define UHS_VID_FIRST_INTERNATIONAL_COMPUTER 0x05b1U // First International Computer, Inc. -#define UHS_VID_LG_SEMICON 0x05b4U // LG Semicon Co., Ltd -#define UHS_VID_DIALOGIC 0x05b5U // Dialogic Corp. -#define UHS_VID_PROXIMA 0x05b6U // Proxima Corp. -#define UHS_VID_MEDIANIX_SEMICONDUCTOR 0x05b7U // Medianix Semiconductor, Inc. -#define UHS_VID_AGILER 0x05b8U // Agiler, Inc. -#define UHS_VID_PHILIPS_RESEARCH_LABORATORIES 0x05b9U // Philips Research Laboratories -#define UHS_VID_DIGITALPERSONA 0x05baU // DigitalPersona, Inc. -#define UHS_VID_GREY_CELL_SYSTEMS 0x05bbU // Grey Cell Systems -#define UHS_VID_3G_GREEN_GREEN_GLOBE 0x05bcU // 3G Green Green Globe Co., Ltd -#define UHS_VID_RAFI_GMBH_AND_CO_KG 0x05bdU // RAFI GmbH & Co. KG -#define UHS_VID_TYCO_ELECTRONICS_RAYCHEM 0x05beU // Tyco Electronics (Raychem) -#define UHS_VID_S_AND_S_RESEARCH 0x05bfU // S & S Research -#define UHS_VID_KEIL_SOFTWARE 0x05c0U // Keil Software -#define UHS_VID_KAWASAKI_MICROELECTRONICS 0x05c1U // Kawasaki Microelectronics, Inc. -#define UHS_VID_MEDIA_PHONICS_SUISSE 0x05c2U // Media Phonics (Suisse) S.A. -#define UHS_VID_DIGI_INTERNATIONAL_1 0x05c5U // Digi International, Inc. -#define UHS_VID_QUALCOMM 0x05c6U // Qualcomm, Inc. -#define UHS_VID_QTRONIX 0x05c7U // Qtronix Corp. -#define UHS_VID_CHENG_UEI_PRECISION_INDUSTRY_CO_LTD_FOXLINK 0x05c8U // Cheng Uei Precision Industry Co., Ltd (Foxlink) -#define UHS_VID_SEMTECH_1 0x05c9U // Semtech Corp. -#define UHS_VID_RICOH 0x05caU // Ricoh Co., Ltd -#define UHS_VID_POWERVISION_TECHNOLOGIES 0x05cbU // PowerVision Technologies, Inc. -#define UHS_VID_ELSA_AG 0x05ccU // ELSA AG -#define UHS_VID_SILICOM 0x05cdU // Silicom, Ltd -#define UHS_VID_SCI_WORX 0x05ceU // sci-worx GmbH -#define UHS_VID_SUNG_FORN 0x05cfU // Sung Forn Co., Ltd -#define UHS_VID_GE_MEDICAL_SYSTEMS_LUNAR 0x05d0U // GE Medical Systems Lunar -#define UHS_VID_BRAINBOXES 0x05d1U // Brainboxes, Ltd -#define UHS_VID_WAVE_SYSTEMS 0x05d2U // Wave Systems Corp. -#define UHS_VID_TOHOKU_RICOH 0x05d3U // Tohoku Ricoh Co., Ltd -#define UHS_VID_SUPER_GATE_TECHNOLOGY 0x05d5U // Super Gate Technology Co., Ltd -#define UHS_VID_PHILIPS_SEMICONDUCTORS_CICT 0x05d6U // Philips Semiconductors, CICT -#define UHS_VID_THOMAS_AND_BETTS 0x05d7U // Thomas & Betts Corp. -#define UHS_VID_ULTIMA_ELECTRONICS 0x05d8U // Ultima Electronics Corp. -#define UHS_VID_AXIOHM_TRANSACTION_SOLUTIONS 0x05d9U // Axiohm Transaction Solutions -#define UHS_VID_MICROTEK_INTERNATIONAL 0x05daU // Microtek International, Inc. -#define UHS_VID_SUN_CORP_SUNTAC_UNKNOWN 0x05dbU // Sun Corp. (Suntac?) -#define UHS_VID_LEXAR_MEDIA 0x05dcU // Lexar Media, Inc. -#define UHS_VID_DELTA_ELECTRONICS 0x05ddU // Delta Electronics, Inc. -#define UHS_VID_SILICON_VISION 0x05dfU // Silicon Vision, Inc. -#define UHS_VID_SYMBOL_TECHNOLOGIES 0x05e0U // Symbol Technologies -#define UHS_VID_SYNTEK_SEMICONDUCTOR 0x05e1U // Syntek Semiconductor Co., Ltd -#define UHS_VID_ELECVISION 0x05e2U // ElecVision, Inc. -#define UHS_VID_GENESYS_LOGIC 0x05e3U // Genesys Logic, Inc. -#define UHS_VID_RED_WING 0x05e4U // Red Wing Corp. -#define UHS_VID_FUJI_ELECTRIC 0x05e5U // Fuji Electric Co., Ltd -#define UHS_VID_KEITHLEY_INSTRUMENTS 0x05e6U // Keithley Instruments -#define UHS_VID_ICC 0x05e8U // ICC, Inc. -#define UHS_VID_KAWASAKI_LSI 0x05e9U // Kawasaki LSI -#define UHS_VID_FFC 0x05ebU // FFC, Ltd -#define UHS_VID_COM21 0x05ecU // COM21, Inc. -#define UHS_VID_CYTECHINFO 0x05eeU // Cytechinfo Inc. -#define UHS_VID_AVB_INC_ANKO_UNKNOWN_ 0x05efU // AVB, Inc. [anko?] -#define UHS_VID_CANOPUS 0x05f0U // Canopus Co., Ltd -#define UHS_VID_COMPASS_COMMUNICATIONS 0x05f1U // Compass Communications -#define UHS_VID_DEXIN 0x05f2U // Dexin Corp., Ltd -#define UHS_VID_PI_ENGINEERING 0x05f3U // PI Engineering, Inc. -#define UHS_VID_UNIXTAR_TECHNOLOGY 0x05f5U // Unixtar Technology, Inc. -#define UHS_VID_AOC_INTERNATIONAL 0x05f6U // AOC International -#define UHS_VID_RFC_DISTRIBUTIONS_PTE 0x05f7U // RFC Distribution(s) PTE, Ltd -#define UHS_VID_PSC_SCANNING 0x05f9U // PSC Scanning, Inc. -#define UHS_VID_SIEMENS_TELECOMMUNICATIONS_SYSTEMS 0x05faU // Siemens Telecommunications Systems, Ltd -#define UHS_VID_HARMAN 0x05fcU // Harman -#define UHS_VID_INTERACT 0x05fdU // InterAct, Inc. -#define UHS_VID_CHIC_TECHNOLOGY 0x05feU // Chic Technology Corp. -#define UHS_VID_LECROY 0x05ffU // LeCroy Corp. -#define UHS_VID_BARCO_DISPLAY_SYSTEMS 0x0600U // Barco Display Systems -#define UHS_VID_JAZZ_HIPSTER 0x0601U // Jazz Hipster Corp. -#define UHS_VID_VISTA_IMAGING 0x0602U // Vista Imaging, Inc. -#define UHS_VID_NOVATEK_MICROELECTRONICS 0x0603U // Novatek Microelectronics Corp. -#define UHS_VID_JEAN 0x0604U // Jean Co., Ltd -#define UHS_VID_ANCHOR_CANDC 0x0605U // Anchor C&C Co., Ltd -#define UHS_VID_ROYAL_INFORMATION_ELECTRONICS 0x0606U // Royal Information Electronics Co., Ltd -#define UHS_VID_BRIDGE_INFORMATION 0x0607U // Bridge Information Co., Ltd -#define UHS_VID_GENRAD_ADS 0x0608U // Genrad Ads -#define UHS_VID_SMK_MANUFACTURING 0x0609U // SMK Manufacturing, Inc. -#define UHS_VID_WORTHINGTON_DATA_SOLUTIONS 0x060aU // Worthington Data Solutions, Inc. -#define UHS_VID_SOLID_YEAR 0x060bU // Solid Year -#define UHS_VID_EEH_DATALINK 0x060cU // EEH Datalink GmbH -#define UHS_VID_AUCTOR 0x060dU // Auctor Corp. -#define UHS_VID_TRANSMONDE_TECHNOLOGIES 0x060eU // Transmonde Technologies, Inc. -#define UHS_VID_JOINSOON_ELECTRONICS_MFG 0x060fU // Joinsoon Electronics Mfg. Co., Ltd -#define UHS_VID_COSTAR_ELECTRONICS 0x0610U // Costar Electronics, Inc. -#define UHS_VID_TOTOKU_ELECTRIC 0x0611U // Totoku Electric Co., Ltd -#define UHS_VID_TRANSACT_TECHNOLOGIES 0x0613U // TransAct Technologies, Inc. -#define UHS_VID_BIO_RAD_LABORATORIES 0x0614U // Bio-Rad Laboratories -#define UHS_VID_QUABBIN_WIRE_AND_CABLE 0x0615U // Quabbin Wire & Cable Co., Inc. -#define UHS_VID_FUTURE_TECHNO_DESIGNS_PVT 0x0616U // Future Techno Designs PVT, Ltd -#define UHS_VID_SWISS_FEDERAL_INSITUTE_OF_TECHNOLOGY 0x0617U // Swiss Federal Insitute of Technology -#define UHS_VID_MACALLY 0x0618U // MacAlly -#define UHS_VID_SEIKO_INSTRUMENTS 0x0619U // Seiko Instruments, Inc. -#define UHS_VID_VERIDICOM_INTERNATIONAL 0x061aU // Veridicom International, Inc. -#define UHS_VID_PROMPTUS_COMMUNICATIONS 0x061bU // Promptus Communications, Inc. -#define UHS_VID_ACT_LABS 0x061cU // Act Labs, Ltd -#define UHS_VID_QUATECH 0x061dU // Quatech, Inc. -#define UHS_VID_NISSEI_ELECTRIC 0x061eU // Nissei Electric Co. -#define UHS_VID_ALARIS 0x0620U // Alaris, Inc. -#define UHS_VID_ODU_STECKVERBINDUNGSSYSTEME_GMBH_AND_CO_KG 0x0621U // ODU-Steckverbindungssysteme GmbH & Co. KG -#define UHS_VID_IOTECH 0x0622U // Iotech, Inc. -#define UHS_VID_LITTELFUSE 0x0623U // Littelfuse, Inc. -#define UHS_VID_AVOCENT 0x0624U // Avocent Corp. -#define UHS_VID_TIMEDIA_TECHNOLOGY 0x0625U // TiMedia Technology Co., Ltd -#define UHS_VID_NIPPON_SYSTEMS_DEVELOPMENT 0x0626U // Nippon Systems Development Co., Ltd -#define UHS_VID_ADOMAX_TECHNOLOGY 0x0627U // Adomax Technology Co., Ltd -#define UHS_VID_TASKING_SOFTWARE 0x0628U // Tasking Software, Inc. -#define UHS_VID_ZIDA_TECHNOLOGIES 0x0629U // Zida Technologies, Ltd -#define UHS_VID_CREATIVE_LABS 0x062aU // Creative Labs -#define UHS_VID_GREATLINK_ELECTRONICS_TAIWAN 0x062bU // Greatlink Electronics Taiwan, Ltd -#define UHS_VID_INSTITUTE_FOR_INFORMATION_INDUSTRY 0x062cU // Institute for Information Industry -#define UHS_VID_TAIWAN_TAI_HAO_ENTERPRISES 0x062dU // Taiwan Tai-Hao Enterprises Co., Ltd -#define UHS_VID_MAINSUPER_ENTERPRISES 0x062eU // Mainsuper Enterprises Co., Ltd -#define UHS_VID_SIN_SHENG_TERMINAL_AND_MACHINE 0x062fU // Sin Sheng Terminal & Machine, Inc. -#define UHS_VID_JUJO_ELECTRONICS 0x0631U // JUJO Electronics Corp. -#define UHS_VID_CYRIX 0x0633U // Cyrix Corp. -#define UHS_VID_MICRON_TECHNOLOGY 0x0634U // Micron Technology, Inc. -#define UHS_VID_METHODE_ELECTRONICS 0x0635U // Methode Electronics, Inc. -#define UHS_VID_SIERRA_IMAGING 0x0636U // Sierra Imaging, Inc. -#define UHS_VID_AVISION 0x0638U // Avision, Inc. -#define UHS_VID_CHRONTEL 0x0639U // Chrontel, Inc. -#define UHS_VID_TECHWIN 0x063aU // Techwin Corp. -#define UHS_VID_TAUGAGREINING_HF_1 0x063bU // Taugagreining HF -#define UHS_VID_YAMAICHI_ELECTRONICS_CO_LTD_SAKURA 0x063cU // Yamaichi Electronics Co., Ltd (Sakura) -#define UHS_VID_FONG_KAI_INDUSTRIAL 0x063dU // Fong Kai Industrial Co., Ltd -#define UHS_VID_REALMEDIA_TECHNOLOGY 0x063eU // RealMedia Technology, Inc. -#define UHS_VID_NEW_TECHNOLOGY_CABLE 0x063fU // New Technology Cable, Ltd -#define UHS_VID_HITEX_DEVELOPMENT_TOOLS 0x0640U // Hitex Development Tools -#define UHS_VID_WOODS_INDUSTRIES 0x0641U // Woods Industries, Inc. -#define UHS_VID_VIA_MEDICAL 0x0642U // VIA Medical Corp. -#define UHS_VID_TEAC 0x0644U // TEAC Corp. -#define UHS_VID_WHO_UNKNOWN_VISION_SYSTEMS 0x0645U // Who? Vision Systems, Inc. -#define UHS_VID_UMAX 0x0646U // UMAX -#define UHS_VID_ACTON_RESEARCH 0x0647U // Acton Research Corp. -#define UHS_VID_INSIDE_OUT_NETWORKS 0x0648U // Inside Out Networks -#define UHS_VID_WELI_SCIENCE 0x0649U // Weli Science Co., Ltd -#define UHS_VID_ANALOG_DEVICES_INC_WHITE_MOUNTAIN_DSP 0x064bU // Analog Devices, Inc. (White Mountain DSP) -#define UHS_VID_JI_HAW_INDUSTRIAL 0x064cU // Ji-Haw Industrial Co., Ltd -#define UHS_VID_TRITECH_MICROELECTRONICS 0x064dU // TriTech Microelectronics, Ltd -#define UHS_VID_SUYIN 0x064eU // Suyin Corp. -#define UHS_VID_WIBU_SYSTEMS_AG 0x064fU // WIBU-Systems AG -#define UHS_VID_DYNAPRO_SYSTEMS 0x0650U // Dynapro Systems -#define UHS_VID_LIKOM_TECHNOLOGY_SDN_BHD 0x0651U // Likom Technology Sdn. Bhd. -#define UHS_VID_STARGATE_SOLUTIONS 0x0652U // Stargate Solutions, Inc. -#define UHS_VID_CNF 0x0653U // CNF, Inc. -#define UHS_VID_GRANITE_MICROSYSTEMS 0x0654U // Granite Microsystems, Inc. -#define UHS_VID_SPACE_SHUTTLE_HI_TECH 0x0655U // Space Shuttle Hi-Tech Co., Ltd -#define UHS_VID_GLORY_MARK_ELECTRONIC 0x0656U // Glory Mark Electronic, Ltd -#define UHS_VID_TEKCON_ELECTRONICS 0x0657U // Tekcon Electronics Corp. -#define UHS_VID_SIGMA_DESIGNS 0x0658U // Sigma Designs, Inc. -#define UHS_VID_AETHRA 0x0659U // Aethra -#define UHS_VID_OPTOELECTRONICS 0x065aU // Optoelectronics Co., Ltd -#define UHS_VID_TRACEWELL_SYSTEMS 0x065bU // Tracewell Systems -#define UHS_VID_SILICON_GRAPHICS_1 0x065eU // Silicon Graphics -#define UHS_VID_GOOD_WAY_TECHNOLOGY_CO_LTD_AND_GWC_TECHNOLOGY 0x065fU // Good Way Technology Co., Ltd & GWC technology Inc. -#define UHS_VID_TSAY_E_BVI_INTERNATIONAL 0x0660U // TSAY-E (BVI) International, Inc. -#define UHS_VID_HAMAMATSU_PHOTONICS_KK 0x0661U // Hamamatsu Photonics K.K. -#define UHS_VID_KANSAI_ELECTRIC 0x0662U // Kansai Electric Co., Ltd -#define UHS_VID_TOPMAX_ELECTRONIC 0x0663U // Topmax Electronic Co., Ltd -#define UHS_VID_ETANDT_TECHNOLOGY 0x0664U // ET&T Technology Co., Ltd. -#define UHS_VID_CYPRESS_SEMICONDUCTOR_1 0x0665U // Cypress Semiconductor -#define UHS_VID_AIWA 0x0667U // Aiwa Co., Ltd -#define UHS_VID_WORDWAND 0x0668U // WordWand -#define UHS_VID_OCE_PRINTING_SYSTEMS 0x0669U // Oce' Printing Systems GmbH -#define UHS_VID_TOTAL_TECHNOLOGIES 0x066aU // Total Technologies, Ltd -#define UHS_VID_LINKSYS 0x066bU // Linksys, Inc. -#define UHS_VID_ENTREGA 0x066dU // Entrega, Inc. -#define UHS_VID_ACER_SEMICONDUCTOR_AMERICA 0x066eU // Acer Semiconductor America, Inc. -#define UHS_VID_SIGMATEL 0x066fU // SigmaTel, Inc. -#define UHS_VID_SEQUEL_IMAGING 0x0670U // Sequel Imaging -#define UHS_VID_LABTEC 0x0672U // Labtec, Inc. -#define UHS_VID_HCL 0x0673U // HCL -#define UHS_VID_KEY_MOUSE_ELECTRONIC_ENTERPRISE 0x0674U // Key Mouse Electronic Enterprise Co., Ltd -#define UHS_VID_DRAYTEK 0x0675U // DrayTek Corp. -#define UHS_VID_TELES_AG 0x0676U // Teles AG -#define UHS_VID_AIWA_1 0x0677U // Aiwa Co., Ltd -#define UHS_VID_ACARD_TECHNOLOGY 0x0678U // ACard Technology Corp. -#define UHS_VID_PROLIFIC_TECHNOLOGY 0x067bU // Prolific Technology, Inc. -#define UHS_VID_EFFICIENT_NETWORKS 0x067cU // Efficient Networks, Inc. -#define UHS_VID_HOHNER 0x067dU // Hohner Corp. -#define UHS_VID_INTERMEC_TECHNOLOGIES 0x067eU // Intermec Technologies Corp. -#define UHS_VID_VIRATA 0x067fU // Virata, Ltd -#define UHS_VID_REALTEK_SEMICONDUCTOR_CORP_CPP_DIV_AVANCE_LOGIC 0x0680U // Realtek Semiconductor Corp., CPP Div. (Avance Logic) -#define UHS_VID_SIEMENS_INFORMATION_AND_COMMUNICATION_PRODUCTS 0x0681U // Siemens Information and Communication Products -#define UHS_VID_VICTOR_COMPANY_OF_JAPAN_1 0x0682U // Victor Company of Japan, Ltd -#define UHS_VID_ACTIONTEC_ELECTRONICS 0x0684U // Actiontec Electronics, Inc. -#define UHS_VID_ZD_INCORPORATED 0x0685U // ZD Incorporated -#define UHS_VID_MINOLTA 0x0686U // Minolta Co., Ltd -#define UHS_VID_PERTECH 0x068aU // Pertech, Inc. -#define UHS_VID_POTRANS_INTERNATIONAL 0x068bU // Potrans International, Inc. -#define UHS_VID_CH_PRODUCTS 0x068eU // CH Products, Inc. -#define UHS_VID_GOLDEN_BRIDGE_ELECTECH 0x0690U // Golden Bridge Electech, Inc. -#define UHS_VID_HAGIWARA_SYS_COM 0x0693U // Hagiwara Sys-Com Co., Ltd -#define UHS_VID_LEGO_GROUP 0x0694U // Lego Group -#define UHS_VID_CHUNTEX_CTX 0x0698U // Chuntex (CTX) -#define UHS_VID_TEKTRONIX 0x0699U // Tektronix, Inc. -#define UHS_VID_ASKEY_COMPUTER 0x069aU // Askey Computer Corp. -#define UHS_VID_THOMSON 0x069bU // Thomson, Inc. -#define UHS_VID_HUGHES_NETWORK_SYSTEMS_HNS 0x069dU // Hughes Network Systems (HNS) -#define UHS_VID_WELCAT 0x069eU // Welcat Inc. -#define UHS_VID_ALLIED_DATA_TECHNOLOGIES_BV 0x069fU // Allied Data Technologies BV -#define UHS_VID_TOPRO_TECHNOLOGY 0x06a2U // Topro Technology, Inc. -#define UHS_VID_SAITEK_PLC 0x06a3U // Saitek PLC -#define UHS_VID_XIAMEN_DOOWELL_ELECTRON 0x06a4U // Xiamen Doowell Electron Co., Ltd -#define UHS_VID_DIVIO 0x06a5U // Divio -#define UHS_VID_MICROSTORE 0x06a7U // MicroStore, Inc. -#define UHS_VID_TOPAZ_SYSTEMS 0x06a8U // Topaz Systems, Inc. -#define UHS_VID_WESTELL 0x06a9U // Westell -#define UHS_VID_SYSGRATION 0x06aaU // Sysgration, Ltd -#define UHS_VID_FUJITSU_LABORATORIES_OF_AMERICA 0x06acU // Fujitsu Laboratories of America, Inc. -#define UHS_VID_GREATLAND_ELECTRONICS_TAIWAN 0x06adU // Greatland Electronics Taiwan, Ltd -#define UHS_VID_PROFESSIONAL_MULTIMEDIA_TESTING_CENTRE 0x06aeU // Professional Multimedia Testing Centre -#define UHS_VID_HARTING_INC_OF_NORTH_AMERICA 0x06afU // Harting, Inc. of North America -#define UHS_VID_PIXELA 0x06b8U // Pixela Corp. -#define UHS_VID_ALCATEL_TELECOM 0x06b9U // Alcatel Telecom -#define UHS_VID_SMOOTH_CORD_AND_CONNECTOR 0x06baU // Smooth Cord & Connector Co., Ltd -#define UHS_VID_EDA 0x06bbU // EDA, Inc. -#define UHS_VID_OKI_DATA 0x06bcU // Oki Data Corp. -#define UHS_VID_AGFA_GEVAERT_NV 0x06bdU // AGFA-Gevaert NV -#define UHS_VID_AME_OPTIMEDIA_TECHNOLOGY 0x06beU // AME Optimedia Technology Co., Ltd -#define UHS_VID_LEOCO 0x06bfU // Leoco Corp. -#define UHS_VID_PHIDGETS_INC_FORMERLY_GLAB 0x06c2U // Phidgets Inc. (formerly GLAB) -#define UHS_VID_BIZLINK_INTERNATIONAL 0x06c4U // Bizlink International Corp. -#define UHS_VID_HAGENUK 0x06c5U // Hagenuk, GmbH -#define UHS_VID_INFOWAVE_SOFTWARE 0x06c6U // Infowave Software, Inc. -#define UHS_VID_SIIG 0x06c8U // SIIG, Inc. -#define UHS_VID_TAXAN_EUROPE 0x06c9U // Taxan (Europe), Ltd -#define UHS_VID_NEWER_TECHNOLOGY 0x06caU // Newer Technology, Inc. -#define UHS_VID_SYNAPTICS 0x06cbU // Synaptics, Inc. -#define UHS_VID_TERAYON_COMMUNICATION_SYSTEMS 0x06ccU // Terayon Communication Systems -#define UHS_VID_KEYSPAN 0x06cdU // Keyspan -#define UHS_VID_CONTEC 0x06ceU // Contec -#define UHS_VID_SPHERONVR_AG 0x06cfU // SpheronVR AG -#define UHS_VID_LAPLINK 0x06d0U // LapLink, Inc. -#define UHS_VID_DAEWOO_ELECTRONICS_1 0x06d1U // Daewoo Electronics Co., Ltd -#define UHS_VID_MITSUBISHI_ELECTRIC 0x06d3U // Mitsubishi Electric Corp. -#define UHS_VID_CISCO_SYSTEMS_1 0x06d4U // Cisco Systems -#define UHS_VID_TOSHIBA 0x06d5U // Toshiba -#define UHS_VID_AASHIMA_TECHNOLOGY_BV 0x06d6U // Aashima Technology B.V. -#define UHS_VID_NETWORK_COMPUTING_DEVICES_NCD 0x06d7U // Network Computing Devices (NCD) -#define UHS_VID_TECHNICAL_MARKETING_RESEARCH 0x06d8U // Technical Marketing Research, Inc. -#define UHS_VID_PHOENIXTEC_POWER 0x06daU // Phoenixtec Power Co., Ltd -#define UHS_VID_PARADYNE 0x06dbU // Paradyne -#define UHS_VID_FOXLINK_IMAGE_TECHNOLOGY 0x06dcU // Foxlink Image Technology Co., Ltd -#define UHS_VID_HEISEI_ELECTRONICS 0x06deU // Heisei Electronics Co., Ltd -#define UHS_VID_MULTI_TECH_SYSTEMS 0x06e0U // Multi-Tech Systems, Inc. -#define UHS_VID_ADS_TECHNOLOGIES 0x06e1U // ADS Technologies, Inc. -#define UHS_VID_ALCATEL_MICROELECTRONICS 0x06e4U // Alcatel Microelectronics -#define UHS_VID_TIGER_JET_NETWORK 0x06e6U // Tiger Jet Network, Inc. -#define UHS_VID_SIRIUS_TECHNOLOGIES 0x06eaU // Sirius Technologies -#define UHS_VID_PC_EXPERT_TECH 0x06ebU // PC Expert Tech. Co., Ltd -#define UHS_VID_IAC_GEOMETRISCHE_INGENIEURS_BV 0x06efU // I.A.C. Geometrische Ingenieurs B.V. -#define UHS_VID_TNC_INDUSTRIAL 0x06f0U // T.N.C Industrial Co., Ltd -#define UHS_VID_OPCODE_SYSTEMS 0x06f1U // Opcode Systems, Inc. -#define UHS_VID_EMINE_TECHNOLOGY 0x06f2U // Emine Technology Co. -#define UHS_VID_WINTREND_TECHNOLOGY 0x06f6U // Wintrend Technology Co., Ltd -#define UHS_VID_WAILLY_TECHNOLOGY 0x06f7U // Wailly Technology Ltd -#define UHS_VID_GUILLEMOT 0x06f8U // Guillemot Corp. -#define UHS_VID_ASYST_ELECTRONIC_DOO 0x06f9U // ASYST electronic d.o.o. -#define UHS_VID_HSD_SRL 0x06faU // HSD S.r.L -#define UHS_VID_MOTOROLA_SEMICONDUCTOR_PRODUCTS_SECTOR 0x06fcU // Motorola Semiconductor Products Sector -#define UHS_VID_BOSTON_ACOUSTICS 0x06fdU // Boston Acoustics -#define UHS_VID_GALLANT_COMPUTER 0x06feU // Gallant Computer, Inc. -#define UHS_VID_SUPERCOMAL_WIRE_AND_CABLE_SDN_BHD 0x0701U // Supercomal Wire & Cable SDN. BHD. -#define UHS_VID_BVTECH_INDUSTRY 0x0703U // Bvtech Industry, Inc. -#define UHS_VID_NKK 0x0705U // NKK Corp. -#define UHS_VID_ARIEL 0x0706U // Ariel Corp. -#define UHS_VID_STANDARD_MICROSYSTEMS_2 0x0707U // Standard Microsystems Corp. -#define UHS_VID_PUTERCOM 0x0708U // Putercom Co., Ltd -#define UHS_VID_SILICON_SYSTEMS_LTD_SSL 0x0709U // Silicon Systems, Ltd (SSL) -#define UHS_VID_OKI_ELECTRIC_INDUSTRY 0x070aU // Oki Electric Industry Co., Ltd -#define UHS_VID_COMOSS_ELECTRONIC 0x070dU // Comoss Electronic Co., Ltd -#define UHS_VID_EXCEL_CELL_ELECTRONIC 0x070eU // Excel Cell Electronic Co., Ltd -#define UHS_VID_CONNECT_TECH 0x0710U // Connect Tech, Inc. -#define UHS_VID_MAGIC_CONTROL_TECHNOLOGY 0x0711U // Magic Control Technology Corp. -#define UHS_VID_INTERVAL_RESEARCH 0x0713U // Interval Research Corp. -#define UHS_VID_NEWMOTION 0x0714U // NewMotion, Inc. -#define UHS_VID_ZNK 0x0717U // ZNK Corp. -#define UHS_VID_IMATION 0x0718U // Imation Corp. -#define UHS_VID_TREMON_ENTERPRISES 0x0719U // Tremon Enterprises Co., Ltd -#define UHS_VID_DOMAIN_TECHNOLOGIES 0x071bU // Domain Technologies, Inc. -#define UHS_VID_XIONICS_DOCUMENT_TECHNOLOGIES 0x071cU // Xionics Document Technologies, Inc. -#define UHS_VID_EICON_NETWORKS 0x071dU // Eicon Networks Corp. -#define UHS_VID_ARISTON_TECHNOLOGIES 0x071eU // Ariston Technologies -#define UHS_VID_CENTILLIUM_COMMUNICATIONS 0x0723U // Centillium Communications Corp. -#define UHS_VID_VANGUARD_INTERNATIONAL_SEMICONDUCTOR_AMERICA 0x0726U // Vanguard International Semiconductor-America -#define UHS_VID_AMITM 0x0729U // Amitm -#define UHS_VID_SUNIX 0x072eU // Sunix Co., Ltd -#define UHS_VID_ADVANCED_CARD_SYSTEMS 0x072fU // Advanced Card Systems, Ltd -#define UHS_VID_SUSTEEN 0x0731U // Susteen, Inc. -#define UHS_VID_GOLDFULL_ELECTRONICS_AND_TELECOMMUNICATIONS 0x0732U // Goldfull Electronics & Telecommunications Corp. -#define UHS_VID_VIEWQUEST_TECHNOLOGIES 0x0733U // ViewQuest Technologies, Inc. -#define UHS_VID_LASAT_COMMUNICATIONS_AS 0x0734U // Lasat Communications A/S -#define UHS_VID_ASUSCOM_NETWORK 0x0735U // Asuscom Network -#define UHS_VID_LOROM_INDUSTRIAL 0x0736U // Lorom Industrial Co., Ltd -#define UHS_VID_MAD_CATZ 0x0738U // Mad Catz, Inc. -#define UHS_VID_CHAPLET_SYSTEMS 0x073aU // Chaplet Systems, Inc. -#define UHS_VID_SUNCOM_TECHNOLOGIES 0x073bU // Suncom Technologies -#define UHS_VID_INDUSTRIAL_ELECTRONIC_ENGINEERS 0x073cU // Industrial Electronic Engineers, Inc. -#define UHS_VID_EUTRON_SPA 0x073dU // Eutron S.p.a. -#define UHS_VID_NEC_1 0x073eU // NEC, Inc. -#define UHS_VID_STOLLMANN 0x0742U // Stollmann -#define UHS_VID_SYNTECH_INFORMATION 0x0745U // Syntech Information Co., Ltd -#define UHS_VID_ONKYO 0x0746U // Onkyo Corp. -#define UHS_VID_LABWAY 0x0747U // Labway Corp. -#define UHS_VID_STRONG_MAN_ENTERPRISE 0x0748U // Strong Man Enterprise Co., Ltd -#define UHS_VID_EVER_ELECTRONICS 0x0749U // EVer Electronics Corp. -#define UHS_VID_MING_FORTUNE_INDUSTRY 0x074aU // Ming Fortune Industry Co., Ltd -#define UHS_VID_POLESTAR_TECH 0x074bU // Polestar Tech. Corp. -#define UHS_VID_C_C_C_GROUP_PLC 0x074cU // C-C-C Group PLC -#define UHS_VID_MICRONAS 0x074dU // Micronas GmbH -#define UHS_VID_DIGITAL_STREAM 0x074eU // Digital Stream Corp. -#define UHS_VID_AUREAL_SEMICONDUCTOR 0x0755U // Aureal Semiconductor -#define UHS_VID_NETWORK_TECHNOLOGIES 0x0757U // Network Technologies, Inc. -#define UHS_VID_SOPHISTICATED_CIRCUITS 0x075bU // Sophisticated Circuits, Inc. -#define UHS_VID_MIDIMAN 0x0763U // Midiman -#define UHS_VID_CYBER_POWER_SYSTEM 0x0764U // Cyber Power System, Inc. -#define UHS_VID_X_RITE 0x0765U // X-Rite, Inc. -#define UHS_VID_JESS_LINK_PRODUCTS 0x0766U // Jess-Link Products Co., Ltd -#define UHS_VID_TOKHEIM 0x0767U // Tokheim Corp. -#define UHS_VID_CAMTEL_TECHNOLOGY 0x0768U // Camtel Technology Corp. -#define UHS_VID_SURECOM_TECHNOLOGY 0x0769U // Surecom Technology Corp. -#define UHS_VID_SMART_TECHNOLOGY_ENABLERS 0x076aU // Smart Technology Enablers, Inc. -#define UHS_VID_OMNIKEY_AG 0x076bU // OmniKey AG -#define UHS_VID_PARTNER_TECH 0x076cU // Partner Tech -#define UHS_VID_DENSO 0x076dU // Denso Corp. -#define UHS_VID_KUAN_TECH_ENTERPRISE 0x076eU // Kuan Tech Enterprise Co., Ltd -#define UHS_VID_JHEN_VEI_ELECTRONIC 0x076fU // Jhen Vei Electronic Co., Ltd -#define UHS_VID_WELCH_ALLYN_INC__MEDICAL_DIVISION 0x0770U // Welch Allyn, Inc - Medical Division -#define UHS_VID_OBSERVATOR_INSTRUMENTS_BV 0x0771U // Observator Instruments BV -#define UHS_VID_YOUR_DATA_OUR_CARE 0x0772U // Your data Our Care -#define UHS_VID_AMTRAN_TECHNOLOGY 0x0774U // AmTRAN Technology Co., Ltd -#define UHS_VID_LONGSHINE_ELECTRONICS 0x0775U // Longshine Electronics Corp. -#define UHS_VID_INALWAYS 0x0776U // Inalways Corp. -#define UHS_VID_COMDA_ENTERPRISE 0x0777U // Comda Enterprise Corp. -#define UHS_VID_VOLEX 0x0778U // Volex, Inc. -#define UHS_VID_FAIRCHILD_SEMICONDUCTOR 0x0779U // Fairchild Semiconductor -#define UHS_VID_SANKYO_SEIKI_MFG 0x077aU // Sankyo Seiki Mfg. Co., Ltd -#define UHS_VID_LINKSYS_1 0x077bU // Linksys -#define UHS_VID_FORWARD_ELECTRONICS 0x077cU // Forward Electronics Co., Ltd -#define UHS_VID_GRIFFIN_TECHNOLOGY 0x077dU // Griffin Technology -#define UHS_VID_WELL_EXCELLENT_AND_MOST 0x077fU // Well Excellent & Most Corp. -#define UHS_VID_SAGEM_MONETEL 0x0780U // Sagem Monetel GmbH -#define UHS_VID_SANDISK 0x0781U // SanDisk Corp. -#define UHS_VID_TRACKERBALL 0x0782U // Trackerball -#define UHS_VID_C3PO 0x0783U // C3PO -#define UHS_VID_VIVITAR 0x0784U // Vivitar, Inc. -#define UHS_VID_NTT_ME 0x0785U // NTT-ME -#define UHS_VID_LOGITEC 0x0789U // Logitec Corp. -#define UHS_VID_HAPP_CONTROLS 0x078bU // Happ Controls, Inc. -#define UHS_VID_GTCOCALCOMP 0x078cU // GTCO/CalComp -#define UHS_VID_BRINCOM 0x078eU // Brincom, Inc. -#define UHS_VID_PRO_IMAGE_MANUFACTURING 0x0790U // Pro-Image Manufacturing Co., Ltd -#define UHS_VID_COPARTNER_WIRE_AND_CABLE_MFG 0x0791U // Copartner Wire and Cable Mfg. Corp. -#define UHS_VID_AXIS_COMMUNICATIONS 0x0792U // Axis Communications AB -#define UHS_VID_WHA_YU_INDUSTRIAL 0x0793U // Wha Yu Industrial Co., Ltd -#define UHS_VID_ABL_ELECTRONICS 0x0794U // ABL Electronics Corp. -#define UHS_VID_REALCHIP 0x0795U // RealChip, Inc. -#define UHS_VID_CERTICOM 0x0796U // Certicom Corp. -#define UHS_VID_GRANDTECH_SEMICONDUCTOR 0x0797U // Grandtech Semiconductor Corp. -#define UHS_VID_OPTELEC 0x0798U // Optelec -#define UHS_VID_ALTERA 0x0799U // Altera -#define UHS_VID_SAGEM 0x079bU // Sagem -#define UHS_VID_ALFADATA_COMPUTER 0x079dU // Alfadata Computer Corp. -#define UHS_VID_DIGICOM_SPA 0x07a1U // Digicom S.p.A. -#define UHS_VID_NATIONAL_TECHNICAL_SYSTEMS 0x07a2U // National Technical Systems -#define UHS_VID_ONNTO 0x07a3U // Onnto Corp. -#define UHS_VID_BE 0x07a4U // Be, Inc. -#define UHS_VID_ADMTEK 0x07a6U // ADMtek, Inc. -#define UHS_VID_COREGA_KK 0x07aaU // Corega K.K. -#define UHS_VID_FREECOM_TECHNOLOGIES 0x07abU // Freecom Technologies -#define UHS_VID_MICROTECH 0x07afU // Microtech -#define UHS_VID_TRUST_TECHNOLOGIES 0x07b0U // Trust Technologies -#define UHS_VID_IMP 0x07b1U // IMP, Inc. -#define UHS_VID_MOTOROLA_BCS 0x07b2U // Motorola BCS, Inc. -#define UHS_VID_PLUSTEK 0x07b3U // Plustek, Inc. -#define UHS_VID_OLYMPUS_OPTICAL 0x07b4U // Olympus Optical Co., Ltd -#define UHS_VID_MEGA_WORLD_INTERNATIONAL 0x07b5U // Mega World International, Ltd -#define UHS_VID_MARUBUN 0x07b6U // Marubun Corp. -#define UHS_VID_TIME_INTERCONNECT 0x07b7U // TIME Interconnect, Ltd -#define UHS_VID_ABOCOM_SYSTEMS 0x07b8U // AboCom Systems Inc -#define UHS_VID_CANON_COMPUTER_SYSTEMS 0x07bcU // Canon Computer Systems, Inc. -#define UHS_VID_WEBGEAR 0x07bdU // Webgear, Inc. -#define UHS_VID_VERIDICOM 0x07beU // Veridicom -#define UHS_VID_CODE_MERCENARIES_HARD_UND_SOFTWARE 0x07c0U // Code Mercenaries Hard- und Software GmbH -#define UHS_VID_KEISOKUGIKEN 0x07c1U // Keisokugiken -#define UHS_VID_DATAFAB_SYSTEMS 0x07c4U // Datafab Systems, Inc. -#define UHS_VID_APG_CASH_DRAWER 0x07c5U // APG Cash Drawer -#define UHS_VID_SHAREWAVE 0x07c6U // ShareWave, Inc. -#define UHS_VID_POWERTECH_INDUSTRIAL 0x07c7U // Powertech Industrial Co., Ltd -#define UHS_VID_BUG 0x07c8U // B.U.G., Inc. -#define UHS_VID_ALLIED_TELESYN_INTERNATIONAL 0x07c9U // Allied Telesyn International -#define UHS_VID_AVERMEDIA_TECHNOLOGIES 0x07caU // AVerMedia Technologies, Inc. -#define UHS_VID_KINGMAX_TECHNOLOGY 0x07cbU // Kingmax Technology, Inc. -#define UHS_VID_CARRY_COMPUTER_ENG 0x07ccU // Carry Computer Eng., Co., Ltd -#define UHS_VID_ELEKTOR 0x07cdU // Elektor -#define UHS_VID_CASIO_COMPUTER 0x07cfU // Casio Computer Co., Ltd -#define UHS_VID_DAZZLE 0x07d0U // Dazzle -#define UHS_VID_D_LINK_SYSTEM 0x07d1U // D-Link System -#define UHS_VID_APTIO_PRODUCTS 0x07d2U // Aptio Products, Inc. -#define UHS_VID_CYBERDATA 0x07d3U // Cyberdata Corp. -#define UHS_VID_RADIANT_SYSTEMS 0x07d5U // Radiant Systems -#define UHS_VID_GCC_TECHNOLOGIES 0x07d7U // GCC Technologies, Inc. -#define UHS_VID_ARASAN_CHIP_SYSTEMS 0x07daU // Arasan Chip Systems -#define UHS_VID_DIAMOND_MULTIMEDIA 0x07deU // Diamond Multimedia -#define UHS_VID_DAVID_ELECTRONICS 0x07dfU // David Electronics Co., Ltd -#define UHS_VID_AMBIENT_TECHNOLOGIES 0x07e1U // Ambient Technologies, Inc. -#define UHS_VID_ELMEG_GMBH_AND 0x07e2U // Elmeg GmbH & Co., Ltd -#define UHS_VID_PLANEX_COMMUNICATIONS 0x07e3U // Planex Communications, Inc. -#define UHS_VID_MOVADO_ENTERPRISE 0x07e4U // Movado Enterprise Co., Ltd -#define UHS_VID_QPS 0x07e5U // QPS, Inc. -#define UHS_VID_ALLIED_CABLE 0x07e6U // Allied Cable Corp. -#define UHS_VID_MIRVO_TOYS 0x07e7U // Mirvo Toys, Inc. -#define UHS_VID_LABSYSTEMS 0x07e8U // Labsystems -#define UHS_VID_IWATSU_ELECTRIC 0x07eaU // Iwatsu Electric Co., Ltd -#define UHS_VID_DOUBLE_H_TECHNOLOGY 0x07ebU // Double-H Technology Co., Ltd -#define UHS_VID_TAIYO_ELECTRIC_WIRE_AND_CABLE 0x07ecU // Taiyo Electric Wire & Cable Co., Ltd -#define UHS_VID_TOREX_RETAIL_FORMERLY_LOGWARE 0x07eeU // Torex Retail (formerly Logware) -#define UHS_VID_STSN 0x07efU // STSN -#define UHS_VID_MICROCOMPUTER_APPLICATIONS 0x07f2U // Microcomputer Applications, Inc. -#define UHS_VID_CIRCUIT_ASSEMBLY 0x07f6U // Circuit Assembly Corp. -#define UHS_VID_CENTURY 0x07f7U // Century Corp. -#define UHS_VID_DOTOP_TECHNOLOGY 0x07f9U // Dotop Technology, Inc. -#define UHS_VID_DRAYTEK_1 0x07faU // DrayTek Corp. -#define UHS_VID_MARK_OF_THE_UNICORN 0x07fdU // Mark of the Unicorn -#define UHS_VID_UNKNOWN_2 0x07ffU // Unknown -#define UHS_VID_MAGTEK 0x0801U // MagTek -#define UHS_VID_MAKO_TECHNOLOGIES 0x0802U // Mako Technologies, LLC -#define UHS_VID_ZOOM_TELEPHONICS 0x0803U // Zoom Telephonics, Inc. -#define UHS_VID_GENICOM_TECHNOLOGY 0x0809U // Genicom Technology, Inc. -#define UHS_VID_EVERMUCH_TECHNOLOGY 0x080aU // Evermuch Technology Co., Ltd -#define UHS_VID_CROSS_MATCH_TECHNOLOGIES 0x080bU // Cross Match Technologies -#define UHS_VID_DATALOGIC_SPA 0x080cU // Datalogic S.p.A. -#define UHS_VID_TECO_IMAGE_SYSTEMS 0x080dU // Teco Image Systems Co., Ltd -#define UHS_VID_PERSONAL_COMMUNICATION_SYSTEMS 0x0810U // Personal Communication Systems, Inc. -#define UHS_VID_MATTEL 0x0813U // Mattel, Inc. -#define UHS_VID_ELICENSER 0x0819U // eLicenser -#define UHS_VID_MG_LOGIC 0x081aU // MG Logic -#define UHS_VID_INDIGITA 0x081bU // Indigita Corp. -#define UHS_VID_MIPSYS 0x081cU // Mipsys -#define UHS_VID_ALPHASMART 0x081eU // AlphaSmart, Inc. -#define UHS_VID_REUDO 0x0822U // Reudo Corp. -#define UHS_VID_GC_PROTRONICS 0x0825U // GC Protronics -#define UHS_VID_DATA_TRANSIT 0x0826U // Data Transit -#define UHS_VID_BROADLOGIC 0x0827U // BroadLogic, Inc. -#define UHS_VID_SATO 0x0828U // Sato Corp. -#define UHS_VID_DIRECTV_BROADBAND_INC_TELOCITY 0x0829U // DirecTV Broadband, Inc. (Telocity) -#define UHS_VID_HANDSPRING 0x082dU // Handspring -#define UHS_VID_PALM 0x0830U // Palm, Inc. -#define UHS_VID_KOUWELL_ELECTRONICS 0x0832U // Kouwell Electronics Corp. -#define UHS_VID_SOURCENEXT 0x0833U // Sourcenext Corp. -#define UHS_VID_ACTION_STAR_ENTERPRISE 0x0835U // Action Star Enterprise Co., Ltd -#define UHS_VID_TREKSTOR 0x0836U // TrekStor -#define UHS_VID_SAMSUNG_TECHWIN 0x0839U // Samsung Techwin Co., Ltd -#define UHS_VID_ACCTON_TECHNOLOGY 0x083aU // Accton Technology Corp. -#define UHS_VID_GLOBAL_VILLAGE 0x083fU // Global Village -#define UHS_VID_ARGOSY_RESEARCH 0x0840U // Argosy Research, Inc. -#define UHS_VID_RIOPORTCOM 0x0841U // Rioport.com, Inc. -#define UHS_VID_WELLAND_INDUSTRIAL 0x0844U // Welland Industrial Co., Ltd -#define UHS_VID_NETGEAR 0x0846U // NetGear, Inc. -#define UHS_VID_MINTON_OPTIC_INDUSTRY 0x084dU // Minton Optic Industry Co., Inc. -#define UHS_VID_KB_GEAR 0x084eU // KB Gear -#define UHS_VID_EMPEG 0x084fU // Empeg -#define UHS_VID_FAST_POINT_TECHNOLOGIES 0x0850U // Fast Point Technologies, Inc. -#define UHS_VID_MACRONIX_INTERNATIONAL 0x0851U // Macronix International Co., Ltd -#define UHS_VID_CSEM 0x0852U // CSEM -#define UHS_VID_TOPRE_CORPORATION 0x0853U // Topre Corporation -#define UHS_VID_ACTIVEWIRE 0x0854U // ActiveWire, Inc. -#define UHS_VID_BANDB_ELECTRONICS 0x0856U // B&B Electronics -#define UHS_VID_HITACHI_MAXELL 0x0858U // Hitachi Maxell, Ltd -#define UHS_VID_MINOLTA_SYSTEMS_LABORATORY 0x0859U // Minolta Systems Laboratory, Inc. -#define UHS_VID_XIRCOM 0x085aU // Xircom -#define UHS_VID_COLORVISION 0x085cU // ColorVision, Inc. -#define UHS_VID_TELETROL_SYSTEMS 0x0862U // Teletrol Systems, Inc. -#define UHS_VID_FILANET 0x0863U // Filanet Corp. -#define UHS_VID_NETGEAR_1 0x0864U // NetGear, Inc. -#define UHS_VID_DATA_TRANSLATION 0x0867U // Data Translation, Inc. -#define UHS_VID_EMAGIC_SOFT_UND_HARDWARE 0x086aU // Emagic Soft- und Hardware GmbH -#define UHS_VID_DETEWE__DEUTSCHE_TELEPHONWERKE_AG_AND 0x086cU // DeTeWe - Deutsche Telephonwerke AG & Co. -#define UHS_VID_SYSTEM_TALKS 0x086eU // System TALKS, Inc. -#define UHS_VID_MEC_IMEX 0x086fU // MEC IMEX, Inc. -#define UHS_VID_METRICOM 0x0870U // Metricom -#define UHS_VID_SANDISK_1 0x0871U // SanDisk, Inc. -#define UHS_VID_XPEED 0x0873U // Xpeed, Inc. -#define UHS_VID_A_TEC_SUBSYSTEM 0x0874U // A-Tec Subsystem, Inc. -#define UHS_VID_COMTROL 0x0879U // Comtrol Corp. -#define UHS_VID_ADESSOKBTEK_AMERICA 0x087cU // Adesso/Kbtek America, Inc. -#define UHS_VID_JATON 0x087dU // Jaton Corp. -#define UHS_VID_FUJITSU_COMPUTER_PRODUCTS_OF_AMERICA 0x087eU // Fujitsu Computer Products of America -#define UHS_VID_QUALCORE_LOGIC 0x087fU // QualCore Logic Inc. -#define UHS_VID_APT_TECHNOLOGIES 0x0880U // APT Technologies, Inc. -#define UHS_VID_RECORDING_INDUSTRY_ASSOCIATION_OF_AMERICA_RIAA 0x0883U // Recording Industry Association of America (RIAA) -#define UHS_VID_BOCA_RESEARCH 0x0885U // Boca Research, Inc. -#define UHS_VID_XAC_AUTOMATION 0x0886U // XAC Automation Corp. -#define UHS_VID_HANNSTAR_ELECTRONICS 0x0887U // Hannstar Electronics Corp. -#define UHS_VID_TECHTOOLS 0x088aU // TechTools -#define UHS_VID_MASSWORKS 0x088bU // MassWorks, Inc. -#define UHS_VID_SWECOIN 0x088cU // Swecoin AB -#define UHS_VID_ILOK 0x088eU // iLok -#define UHS_VID_DIOGRAPHY 0x0892U // DioGraphy, Inc. -#define UHS_VID_TSI_INCORPORATED 0x0894U // TSI Incorporated -#define UHS_VID_LAUTERBACH 0x0897U // Lauterbach -#define UHS_VID_UNITED_TECHNOLOGIES_RESEARCH_CNTR 0x089cU // United Technologies Research Cntr. -#define UHS_VID_ICRON_TECHNOLOGIES 0x089dU // Icron Technologies Corp. -#define UHS_VID_NST 0x089eU // NST Co., Ltd -#define UHS_VID_PRIMEX_AEROSPACE 0x089fU // Primex Aerospace Co. -#define UHS_VID_E9 0x08a5U // e9, Inc. -#define UHS_VID_TOSHIBA_TEC 0x08a6U // Toshiba TEC -#define UHS_VID_ANDREA_ELECTRONICS 0x08a8U // Andrea Electronics -#define UHS_VID_CWAV 0x08a9U // CWAV Inc. -#define UHS_VID_MACRAIGOR_SYSTEMS 0x08acU // Macraigor Systems LLC -#define UHS_VID_MACALLY_MACE_GROUP 0x08aeU // Macally (Mace Group, Inc.) -#define UHS_VID_METROHM 0x08b0U // Metrohm -#define UHS_VID_SORENSON_VISION 0x08b4U // Sorenson Vision, Inc. -#define UHS_VID_NATSU 0x08b7U // NATSU -#define UHS_VID_J_GORDON_ELECTRONIC_DESIGN 0x08b8U // J. Gordon Electronic Design, Inc. -#define UHS_VID_RADIOSHACK_CORP_TANDY 0x08b9U // RadioShack Corp. (Tandy) -#define UHS_VID_TEXAS_INSTRUMENTS_1 0x08bbU // Texas Instruments -#define UHS_VID_CITIZEN_WATCH 0x08bdU // Citizen Watch Co., Ltd -#define UHS_VID_PRECISE_BIOMETRICS 0x08c3U // Precise Biometrics -#define UHS_VID_PROXIM 0x08c4U // Proxim, Inc. -#define UHS_VID_KEY_NICE_ENTERPRISE 0x08c7U // Key Nice Enterprise Co., Ltd -#define UHS_VID_2WIRE 0x08c8U // 2Wire, Inc. -#define UHS_VID_NIPPON_TELEGRAPH_AND_TELEPHONE 0x08c9U // Nippon Telegraph and Telephone Corp. -#define UHS_VID_AIPTEK_INTERNATIONAL 0x08caU // Aiptek International, Inc. -#define UHS_VID_JUE_HSUN_IND 0x08cdU // Jue Hsun Ind. Corp. -#define UHS_VID_LONG_WELL_ELECTRONICS 0x08ceU // Long Well Electronics Corp. -#define UHS_VID_PRODUCTIVITY_ENHANCEMENT_PRODUCTS 0x08cfU // Productivity Enhancement Products -#define UHS_VID_SMARTBRIDGES 0x08d1U // smartBridges, Inc. -#define UHS_VID_VIRTUAL_INK 0x08d3U // Virtual Ink -#define UHS_VID_FUJITSU_SIEMENS_COMPUTERS 0x08d4U // Fujitsu Siemens Computers -#define UHS_VID_IXXAT_AUTOMATION 0x08d8U // IXXAT Automation GmbH -#define UHS_VID_INCREMENT_P 0x08d9U // Increment P Corp. -#define UHS_VID_BILLIONTON_SYSTEMS 0x08ddU // Billionton Systems, Inc. -#define UHS_VID__UNKNOWN 0x08deU // ? -#define UHS_VID_SPYRUS 0x08dfU // Spyrus, Inc. -#define UHS_VID_OLITEC 0x08e3U // Olitec, Inc. -#define UHS_VID_PIONEER 0x08e4U // Pioneer Corp. -#define UHS_VID_LITRONIC 0x08e5U // Litronic -#define UHS_VID_GEMALTO_WAS_GEMPLUS 0x08e6U // Gemalto (was Gemplus) -#define UHS_VID_PAN_INTERNATIONAL_WIRE_AND_CABLE 0x08e7U // Pan-International Wire & Cable -#define UHS_VID_INTEGRATED_MEMORY_LOGIC 0x08e8U // Integrated Memory Logic -#define UHS_VID_EXTENDED_SYSTEMS 0x08e9U // Extended Systems, Inc. -#define UHS_VID_ERICSSON_INC_BLUE_RIDGE_LABS 0x08eaU // Ericsson, Inc., Blue Ridge Labs -#define UHS_VID_M_SYSTEMS_FLASH_DISK_PIONEERS 0x08ecU // M-Systems Flash Disk Pioneers -#define UHS_VID_MEDIATEK 0x08edU // MediaTek Inc. -#define UHS_VID_CCSIHESSO 0x08eeU // CCSI/Hesso -#define UHS_VID_COREX_TECHNOLOGIES 0x08f0U // Corex Technologies -#define UHS_VID_CTI_ELECTRONICS 0x08f1U // CTI Electronics Corp. -#define UHS_VID_GOTOP_INFORMATION 0x08f2U // Gotop Information Inc. -#define UHS_VID_SYSTEC 0x08f5U // SysTec Co., Ltd -#define UHS_VID_LOGIC_3_INTERNATIONAL 0x08f6U // Logic 3 International, Ltd -#define UHS_VID_VERNIER 0x08f7U // Vernier -#define UHS_VID_KEEN_TOP_INTERNATIONAL_ENTERPRISE 0x08f8U // Keen Top International Enterprise Co., Ltd -#define UHS_VID_WIPRO_TECHNOLOGIES 0x08f9U // Wipro Technologies -#define UHS_VID_CAERE 0x08faU // Caere -#define UHS_VID_SOCKET_COMMUNICATIONS 0x08fbU // Socket Communications -#define UHS_VID_SICON_CABLE_TECHNOLOGY 0x08fcU // Sicon Cable Technology Co., Ltd -#define UHS_VID_DIGIANSWER_AS 0x08fdU // Digianswer A/S -#define UHS_VID_AUTHENTEC 0x08ffU // AuthenTec, Inc. -#define UHS_VID_PINNACLE_SYSTEMS 0x0900U // Pinnacle Systems, Inc. -#define UHS_VID_VST_TECHNOLOGIES 0x0901U // VST Technologies -#define UHS_VID_FARADAY_TECHNOLOGY 0x0906U // Faraday Technology Corp. -#define UHS_VID_SIEMENS_AG 0x0908U // Siemens AG -#define UHS_VID_AUDIO_TECHNICA 0x0909U // Audio-Technica Corp. -#define UHS_VID_TRUMPION_MICROELECTRONICS 0x090aU // Trumpion Microelectronics, Inc. -#define UHS_VID_NEUROSMITH 0x090bU // Neurosmith -#define UHS_VID_SILICON_MOTION_INC__TAIWAN_FORMERLY_FEIYA_TECHNOLOGY 0x090cU // Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) -#define UHS_VID_MULTIPORT_COMPUTER_VERTRIEBS 0x090dU // Multiport Computer Vertriebs GmbH -#define UHS_VID_SHINING_TECHNOLOGY 0x090eU // Shining Technology, Inc. -#define UHS_VID_FUJITSU_DEVICES 0x090fU // Fujitsu Devices, Inc. -#define UHS_VID_ALATION_SYSTEMS 0x0910U // Alation Systems, Inc. -#define UHS_VID_PHILIPS_SPEECH_PROCESSING 0x0911U // Philips Speech Processing -#define UHS_VID_VOQUETTE 0x0912U // Voquette, Inc. -#define UHS_VID_GLOBESPAN 0x0915U // GlobeSpan, Inc. -#define UHS_VID_SMARTDISK 0x0917U // SmartDisk Corp. -#define UHS_VID_TIGER_ELECTRONICS 0x0919U // Tiger Electronics -#define UHS_VID_GARMIN_INTERNATIONAL 0x091eU // Garmin International -#define UHS_VID_ECHELON 0x0920U // Echelon Co. -#define UHS_VID_GOHUBS 0x0921U // GoHubs, Inc. -#define UHS_VID_DYMO_COSTAR 0x0922U // Dymo-CoStar Corp. -#define UHS_VID_IC_MEDIA 0x0923U // IC Media Corp. -#define UHS_VID_XEROX 0x0924U // Xerox -#define UHS_VID_LAKEVIEW_RESEARCH 0x0925U // Lakeview Research -#define UHS_VID_SUMMUS 0x0927U // Summus, Ltd -#define UHS_VID_PLX_TECHNOLOGY_INC_FORMERLY_OXFORD_SEMICONDUCTOR 0x0928U // PLX Technology, Inc. (formerly Oxford Semiconductor, Ltd) -#define UHS_VID_AMERICAN_BIOMETRIC 0x0929U // American Biometric Co. -#define UHS_VID_TOSHIBA_INFORMATION_AND_INDUSTRIAL_SYS_AND_SERVICES 0x092aU // Toshiba Information & Industrial Sys. And Services -#define UHS_VID_SENA_TECHNOLOGIES 0x092bU // Sena Technologies, Inc. -#define UHS_VID_NORTHERN_EMBEDDED_SCIENCECAVNEX 0x092fU // Northern Embedded Science/CAVNEX -#define UHS_VID_TOSHIBA_1 0x0930U // Toshiba Corp. -#define UHS_VID_HARMONIC_DATA_SYSTEMS 0x0931U // Harmonic Data Systems, Ltd -#define UHS_VID_CRESCENTEC 0x0932U // Crescentec Corp. -#define UHS_VID_QUANTUM 0x0933U // Quantum Corp. -#define UHS_VID_SPIRENT_COMMUNICATIONS 0x0934U // Spirent Communications -#define UHS_VID_NUTESLA 0x0936U // NuTesla -#define UHS_VID_LUMBERG 0x0939U // Lumberg, Inc. -#define UHS_VID_PIXART_IMAGING 0x093aU // Pixart Imaging, Inc. -#define UHS_VID_PLEXTOR 0x093bU // Plextor Corp. -#define UHS_VID_INTREPID_CONTROL_SYSTEMS 0x093cU // Intrepid Control Systems, Inc. -#define UHS_VID_INNOSYNC 0x093dU // InnoSync, Inc. -#define UHS_VID_JST_MFG 0x093eU // J.S.T. Mfg. Co., Ltd -#define UHS_VID_OLYMPIA_TELECOM_VERTRIEBS 0x093fU // Olympia Telecom Vertriebs GmbH -#define UHS_VID_JAPAN_STORAGE_BATTERY 0x0940U // Japan Storage Battery Co., Ltd -#define UHS_VID_PHOTOBIT 0x0941U // Photobit Corp. -#define UHS_VID_I2GOCOM 0x0942U // i2Go.com, LLC -#define UHS_VID_HCL_TECHNOLOGIES_INDIA_PRIVATE 0x0943U // HCL Technologies India Private, Ltd -#define UHS_VID_KORG 0x0944U // KORG, Inc. -#define UHS_VID_PASCO_SCIENTIFIC 0x0945U // Pasco Scientific -#define UHS_VID_KRONAUER_MUSIC_IN_DIGITAL 0x0948U // Kronauer music in digital -#define UHS_VID_LINKUP_SYSTEMS 0x094bU // Linkup Systems Corp. -#define UHS_VID_CABLE_TELEVISION_LABORATORIES 0x094dU // Cable Television Laboratories -#define UHS_VID_YANO 0x094fU // Yano -#define UHS_VID_KINGSTON_TECHNOLOGY 0x0951U // Kingston Technology -#define UHS_VID_RPM_SYSTEMS 0x0954U // RPM Systems Corp. -#define UHS_VID_NVIDIA 0x0955U // NVidia Corp. -#define UHS_VID_BSQUARE 0x0956U // BSquare Corp. -#define UHS_VID_AGILENT_TECHNOLOGIES 0x0957U // Agilent Technologies, Inc. -#define UHS_VID_COMPULINK_RESEARCH 0x0958U // CompuLink Research, Inc. -#define UHS_VID_COLOGNE_CHIP_AG 0x0959U // Cologne Chip AG -#define UHS_VID_PORTSMITH 0x095aU // Portsmith -#define UHS_VID_MEDIALOGIC 0x095bU // Medialogic Corp. -#define UHS_VID_K_TEC_ELECTRONICS 0x095cU // K-Tec Electronics -#define UHS_VID_POLYCOM 0x095dU // Polycom, Inc. -#define UHS_VID_ACER_NEWEB 0x0967U // Acer NeWeb Corp. -#define UHS_VID_CATALYST_ENTERPRISES 0x0968U // Catalyst Enterprises, Inc. -#define UHS_VID_FEITIAN_TECHNOLOGIES 0x096eU // Feitian Technologies, Inc. -#define UHS_VID_GRETAG_MACBETH_AG 0x0971U // Gretag-Macbeth AG -#define UHS_VID_SCHLUMBERGER 0x0973U // Schlumberger -#define UHS_VID_DATAGRAPHIX_A_BUSINESS_UNIT_OF_ANACOMP 0x0974U // Datagraphix, a business unit of Anacomp -#define UHS_VID_OLE_COMMUNICATIONS 0x0975U // OL'E Communications, Inc. -#define UHS_VID_ADIRONDACK_WIRE_AND_CABLE 0x0976U // Adirondack Wire & Cable -#define UHS_VID_LIGHTSURF_TECHNOLOGIES 0x0977U // Lightsurf Technologies -#define UHS_VID_BECKHOFF 0x0978U // Beckhoff GmbH -#define UHS_VID_JEILIN_TECHNOLOGY 0x0979U // Jeilin Technology Corp., Ltd -#define UHS_VID_MINDS_AT_WORK 0x097aU // Minds At Work LLC -#define UHS_VID_KNUDSEN_ENGINEERING 0x097bU // Knudsen Engineering, Ltd -#define UHS_VID_MARUNIX 0x097cU // Marunix Co., Ltd -#define UHS_VID_ROSUN_TECHNOLOGIES 0x097dU // Rosun Technologies, Inc. -#define UHS_VID_BIOPAC_SYSTEMS 0x097eU // Biopac Systems Inc. -#define UHS_VID_BARUN_ELECTRONICS 0x097fU // Barun Electronics Co., Ltd -#define UHS_VID_OAK_TECHNOLOGY_1 0x0981U // Oak Technology, Ltd -#define UHS_VID_APRICORN 0x0984U // Apricorn -#define UHS_VID_CAB_PRODUKTTECHNIK_GMBH_AND_CO_KG 0x0985U // cab Produkttechnik GmbH & Co KG -#define UHS_VID_MATSUSHITA_ELECTRIC_WORKS 0x0986U // Matsushita Electric Works, Ltd. -#define UHS_VID_VITANA 0x098cU // Vitana Corp. -#define UHS_VID_INDESIGN 0x098dU // INDesign -#define UHS_VID_INTEGRATED_INTELLECTUAL_PROPERTY 0x098eU // Integrated Intellectual Property, Inc. -#define UHS_VID_KENWOOD_TMI 0x098fU // Kenwood TMI Corp. -#define UHS_VID_GEMSTAR_EBOOK_GROUP 0x0993U // Gemstar eBook Group, Ltd -#define UHS_VID_INTEGRATED_TELECOM_EXPRESS 0x0996U // Integrated Telecom Express, Inc. -#define UHS_VID_ZIPPY_TECHNOLOGY 0x099aU // Zippy Technology Corp. -#define UHS_VID_PAIRGAIN_TECHNOLOGIES 0x09a3U // PairGain Technologies -#define UHS_VID_CONTECH_RESEARCH 0x09a4U // Contech Research, Inc. -#define UHS_VID_VCON_TELECOMMUNICATIONS 0x09a5U // VCON Telecommunications -#define UHS_VID_POINCHIPS 0x09a6U // Poinchips -#define UHS_VID_DATA_TRANSMISSION_NETWORK 0x09a7U // Data Transmission Network Corp. -#define UHS_VID_LIN_SHIUNG_ENTERPRISE 0x09a8U // Lin Shiung Enterprise Co., Ltd -#define UHS_VID_SMART_CARD_TECHNOLOGIES 0x09a9U // Smart Card Technologies Co., Ltd -#define UHS_VID_INTERSIL 0x09aaU // Intersil Corp. -#define UHS_VID_JAPAN_CASH_MACHINE 0x09abU // Japan Cash Machine Co., Ltd. -#define UHS_VID_TRIPP_LITE 0x09aeU // Tripp Lite -#define UHS_VID_FRANKLIN_ELECTRONIC_PUBLISHERS 0x09b2U // Franklin Electronic Publishers, Inc. -#define UHS_VID_ALTIUS_SOLUTIONS 0x09b3U // Altius Solutions, Inc. -#define UHS_VID_MDS_TELEPHONE_SYSTEMS 0x09b4U // MDS Telephone Systems -#define UHS_VID_CELLTRIX_TECHNOLOGY 0x09b5U // Celltrix Technology Co., Ltd -#define UHS_VID_GRUNDIG 0x09bcU // Grundig -#define UHS_VID_MYSMARTCOM 0x09beU // MySmart.Com -#define UHS_VID_AUERSWALD_GMBH_AND_CO_KG 0x09bfU // Auerswald GmbH & Co. KG -#define UHS_VID_GENPIX_ELECTRONICS 0x09c0U // Genpix Electronics, LLC -#define UHS_VID_ARRIS_INTERACTIVE 0x09c1U // Arris Interactive LLC -#define UHS_VID_NISCA 0x09c2U // Nisca Corp. -#define UHS_VID_ACTIVCARD 0x09c3U // ActivCard, Inc. -#define UHS_VID_ACTISYS 0x09c4U // ACTiSYS Corp. -#define UHS_VID_MEMORY 0x09c5U // Memory Corp. -#define UHS_VID_BMC_MESSSYSTEME 0x09caU // BMC Messsysteme GmbH -#define UHS_VID_WORKBIT 0x09ccU // Workbit Corp. -#define UHS_VID_PSION_DACOM_HOME_NETWORKS 0x09cdU // Psion Dacom Home Networks, Ltd -#define UHS_VID_CITY_ELECTRONICS 0x09ceU // City Electronics, Ltd -#define UHS_VID_ELECTRONICS_TESTING_CENTER_TAIWAN 0x09cfU // Electronics Testing Center, Taiwan -#define UHS_VID_NEOMAGIC 0x09d1U // NeoMagic, Inc. -#define UHS_VID_VREELIN_ENGINEERING 0x09d2U // Vreelin Engineering, Inc. -#define UHS_VID_COM_ONE 0x09d3U // Com One -#define UHS_VID_NOVATEL_WIRELESS 0x09d7U // Novatel Wireless -#define UHS_VID_KRF_TECH 0x09d9U // KRF Tech, Ltd -#define UHS_VID_A4TECH 0x09daU // A4Tech Co., Ltd. -#define UHS_VID_MEASUREMENT_COMPUTING 0x09dbU // Measurement Computing Corp. -#define UHS_VID_AIMEX 0x09dcU // Aimex Corp. -#define UHS_VID_FELLOWES 0x09ddU // Fellowes, Inc. -#define UHS_VID_ADDONICS_TECHNOLOGIES 0x09dfU // Addonics Technologies Corp. -#define UHS_VID_INTELLON 0x09e1U // Intellon Corp. -#define UHS_VID_JO_DAN_INTERNATIONAL 0x09e5U // Jo-Dan International, Inc. -#define UHS_VID_SILUTIA 0x09e6U // Silutia, Inc. -#define UHS_VID_REAL_3D 0x09e7U // Real 3D, Inc. -#define UHS_VID_AKAI_PROFESSIONAL_MI 0x09e8U // AKAI Professional M.I. Corp. -#define UHS_VID_CHEN_SOURCE 0x09e9U // Chen-Source, Inc. -#define UHS_VID_IM_NETWORKS 0x09ebU // IM Networks, Inc. -#define UHS_VID_XITEL 0x09efU // Xitel -#define UHS_VID_GOFLIGHT 0x09f3U // GoFlight, Inc. -#define UHS_VID_ARESCOM 0x09f5U // AresCom -#define UHS_VID_ROCKETCHIPS 0x09f6U // RocketChips, Inc. -#define UHS_VID_EDU_SCIENCE_HK 0x09f7U // Edu-Science (H.K.), Ltd -#define UHS_VID_SOFTCONNEX_TECHNOLOGIES 0x09f8U // SoftConnex Technologies, Inc. -#define UHS_VID_BAY_ASSOCIATES 0x09f9U // Bay Associates -#define UHS_VID_MTEK_VISION 0x09faU // Mtek Vision -#define UHS_VID_ALTERA_1 0x09fbU // Altera -#define UHS_VID_GAIN_TECHNOLOGY 0x09ffU // Gain Technology Corp. -#define UHS_VID_LIQUID_AUDIO 0x0a00U // Liquid Audio -#define UHS_VID_VIA 0x0a01U // ViA, Inc. -#define UHS_VID_UNKNOWN_MANUFACTURER 0x0a05U // Unknown Manufacturer -#define UHS_VID_ONTRAK_CONTROL_SYSTEMS 0x0a07U // Ontrak Control Systems Inc. -#define UHS_VID_CYBEX_COMPUTER_PRODUCTS 0x0a0bU // Cybex Computer Products Co. -#define UHS_VID_SERVERGY 0x0a0dU // Servergy, Inc -#define UHS_VID_XENTEC 0x0a11U // Xentec, Inc. -#define UHS_VID_CAMBRIDGE_SILICON_RADIO 0x0a12U // Cambridge Silicon Radio, Ltd -#define UHS_VID_TELEBYTE 0x0a13U // Telebyte, Inc. -#define UHS_VID_SPACELABS_MEDICAL 0x0a14U // Spacelabs Medical, Inc. -#define UHS_VID_SCALAR 0x0a15U // Scalar Corp. -#define UHS_VID_TREK_TECHNOLOGY_S_PTE 0x0a16U // Trek Technology (S) PTE, Ltd -#define UHS_VID_PENTAX 0x0a17U // Pentax Corp. -#define UHS_VID_HEIDELBERGER_DRUCKMASCHINEN_AG 0x0a18U // Heidelberger Druckmaschinen AG -#define UHS_VID_HUA_GENG_TECHNOLOGIES 0x0a19U // Hua Geng Technologies, Inc. -#define UHS_VID_MEDTRONIC_PHYSIO_CONTROL 0x0a21U // Medtronic Physio Control Corp. -#define UHS_VID_CENTURY_SEMICONDUCTOR_USA 0x0a22U // Century Semiconductor USA, Inc. -#define UHS_VID_DATACARD_GROUP 0x0a27U // Datacard Group -#define UHS_VID_AK_MODUL_BUS_COMPUTER 0x0a2cU // AK-Modul-Bus Computer GmbH -#define UHS_VID_TG3_ELECTRONICS 0x0a34U // TG3 Electronics, Inc. -#define UHS_VID_RADIKAL_TECHNOLOGIES 0x0a35U // Radikal Technologies -#define UHS_VID_GILAT_SATELLITE_NETWORKS 0x0a39U // Gilat Satellite Networks, Ltd -#define UHS_VID_PENTAMEDIA 0x0a3aU // PentaMedia Co., Ltd -#define UHS_VID_NTT_DOCOMO 0x0a3cU // NTT DoCoMo, Inc. -#define UHS_VID_VARO_VISION 0x0a3dU // Varo Vision -#define UHS_VID_SWISSONIC_AG 0x0a3fU // Swissonic AG -#define UHS_VID_BOCA_SYSTEMS 0x0a43U // Boca Systems, Inc. -#define UHS_VID_DAVICOM_SEMICONDUCTOR 0x0a46U // Davicom Semiconductor, Inc. -#define UHS_VID_HIROSE_ELECTRIC 0x0a47U // Hirose Electric -#define UHS_VID_IO_INTERCONNECT 0x0a48U // I/O Interconnect -#define UHS_VID_PLOYTEC 0x0a4aU // Ploytec GmbH -#define UHS_VID_FUJITSU_MEDIA_DEVICES 0x0a4bU // Fujitsu Media Devices, Ltd -#define UHS_VID_COMPUTEX 0x0a4cU // Computex Co., Ltd -#define UHS_VID_EVOLUTION_ELECTRONICS 0x0a4dU // Evolution Electronics, Ltd -#define UHS_VID_STEINBERG_SOFT_UND_HARDWARE 0x0a4eU // Steinberg Soft-und Hardware GmbH -#define UHS_VID_LITTON_SYSTEMS 0x0a4fU // Litton Systems, Inc. -#define UHS_VID_MIMAKI_ENGINEERING 0x0a50U // Mimaki Engineering Co., Ltd -#define UHS_VID_SONY_ELECTRONICS 0x0a51U // Sony Electronics, Inc. -#define UHS_VID_JEBSEE_ELECTRONICS 0x0a52U // Jebsee Electronics Co., Ltd -#define UHS_VID_PORTABLE_PERIPHERAL 0x0a53U // Portable Peripheral Co., Ltd -#define UHS_VID_ELECTRONICS_FOR_IMAGING 0x0a5aU // Electronics For Imaging, Inc. -#define UHS_VID_EASICS_NV 0x0a5bU // EAsics NV -#define UHS_VID_BROADCOM 0x0a5cU // Broadcom Corp. -#define UHS_VID_DIATREND 0x0a5dU // Diatrend Corp. -#define UHS_VID_ZEBRA 0x0a5fU // Zebra -#define UHS_VID_MPMAN 0x0a62U // MPMan -#define UHS_VID_CLEARCUBE_TECHNOLOGY 0x0a66U // ClearCube Technology -#define UHS_VID_MEDELI_ELECTRONICS 0x0a67U // Medeli Electronics Co., Ltd -#define UHS_VID_COMAIDE 0x0a68U // Comaide Corp. -#define UHS_VID_CHROMA_ATE 0x0a69U // Chroma ate, Inc. -#define UHS_VID_GREEN_HOUSE 0x0a6bU // Green House Co., Ltd -#define UHS_VID_INTEGRATED_CIRCUIT_SYSTEMS 0x0a6cU // Integrated Circuit Systems, Inc. -#define UHS_VID_UPS_MANUFACTURING 0x0a6dU // UPS Manufacturing -#define UHS_VID_BENWIN 0x0a6eU // Benwin -#define UHS_VID_CORE_TECHNOLOGY 0x0a6fU // Core Technology, Inc. -#define UHS_VID_INTERNATIONAL_GAME_TECHNOLOGY 0x0a70U // International Game Technology -#define UHS_VID_VIPCOLOR_TECHNOLOGIES_USA 0x0a71U // VIPColor Technologies USA, Inc. -#define UHS_VID_SANWA_DENSHI 0x0a72U // Sanwa Denshi -#define UHS_VID_MACKIE_DESIGNS 0x0a73U // Mackie Designs -#define UHS_VID_NSTL 0x0a7dU // NSTL, Inc. -#define UHS_VID_OCTAGON_SYSTEMS 0x0a7eU // Octagon Systems Corp. -#define UHS_VID_REXON_TECHNOLOGY 0x0a80U // Rexon Technology Corp., Ltd -#define UHS_VID_CHESEN_ELECTRONICS 0x0a81U // Chesen Electronics Corp. -#define UHS_VID_SYSCAN 0x0a82U // Syscan -#define UHS_VID_NEXTCOMM 0x0a83U // NextComm, Inc. -#define UHS_VID_MAUI_INNOVATIVE_PERIPHERALS 0x0a84U // Maui Innovative Peripherals -#define UHS_VID_IDEXX_LABS 0x0a85U // Idexx Labs -#define UHS_VID_NITGEN 0x0a86U // NITGen Co., Ltd -#define UHS_VID_AKTIV 0x0a89U // Aktiv -#define UHS_VID_PICTURETEL 0x0a8dU // Picturetel -#define UHS_VID_JAPAN_AVIATION_ELECTRONICS_INDUSTRY 0x0a8eU // Japan Aviation Electronics Industry, Ltd -#define UHS_VID_CANDY_TECHNOLOGY 0x0a90U // Candy Technology Co., Ltd -#define UHS_VID_GLOBLINK_TECHNOLOGY 0x0a91U // Globlink Technology, Inc. -#define UHS_VID_EGO_SYSTEMS 0x0a92U // EGO SYStems, Inc. -#define UHS_VID_C_TECHNOLOGIES 0x0a93U // C Technologies AB -#define UHS_VID_INTERSENSE 0x0a94U // Intersense -#define UHS_VID_LAVA_COMPUTER_MFG 0x0aa3U // Lava Computer Mfg., Inc. -#define UHS_VID_DEVELCO_ELEKTRONIK 0x0aa4U // Develco Elektronik -#define UHS_VID_FIRST_INTERNATIONAL_DIGITAL 0x0aa5U // First International Digital -#define UHS_VID_PERCEPTION_DIGITAL 0x0aa6U // Perception Digital, Ltd -#define UHS_VID_WINCOR_NIXDORF_INTERNATIONAL 0x0aa7U // Wincor Nixdorf International GmbH -#define UHS_VID_TRIGEM_COMPUTER 0x0aa8U // TriGem Computer, Inc. -#define UHS_VID_BAROMTEC 0x0aa9U // Baromtec Co. -#define UHS_VID_JAPAN_CBM 0x0aaaU // Japan CBM Corp. -#define UHS_VID_VISION_SHAPE_EUROPE 0x0aabU // Vision Shape Europe SA -#define UHS_VID_ICOMPRESSION 0x0aacU // iCompression, Inc. -#define UHS_VID_ROHDE_AND_SCHWARZ_GMBH_AND_CO_KG 0x0aadU // Rohde & Schwarz GmbH & Co. KG -#define UHS_VID_NEC_INFRONTIA_CORP_NITSUKO 0x0aaeU // NEC infrontia Corp. (Nitsuko) -#define UHS_VID_DIGITALWAY 0x0aafU // Digitalway Co., Ltd -#define UHS_VID_ARROW_STRONG_ELECTRONICS 0x0ab0U // Arrow Strong Electronics Co., Ltd -#define UHS_VID_FEIG_ELECTRONIC 0x0ab1U // FEIG ELECTRONIC GmbH -#define UHS_VID_ELLISYS 0x0abaU // Ellisys -#define UHS_VID_STEREO_LINK 0x0abeU // Stereo-Link -#define UHS_VID_DIOLAN 0x0abfU // Diolan -#define UHS_VID_SANYO_SEMICONDUCTOR_COMPANY_MICRO 0x0ac3U // Sanyo Semiconductor Company Micro -#define UHS_VID_LECO 0x0ac4U // Leco Corp. -#define UHS_VID_I_AND_C 0x0ac5U // I & C Corp. -#define UHS_VID_SINGING_ELECTRONS 0x0ac6U // Singing Electrons, Inc. -#define UHS_VID_PANWEST 0x0ac7U // Panwest Corp. -#define UHS_VID_Z_STAR_MICROELECTRONICS 0x0ac8U // Z-Star Microelectronics Corp. -#define UHS_VID_MICRO_SOLUTIONS 0x0ac9U // Micro Solutions, Inc. -#define UHS_VID_OPEN_NETWORKS 0x0acaU // OPEN Networks Ltd -#define UHS_VID_KOGA_ELECTRONICS 0x0accU // Koga Electronics Co. -#define UHS_VID_ID_TECH 0x0acdU // ID Tech -#define UHS_VID_ZYDAS 0x0aceU // ZyDAS -#define UHS_VID_INTOTO 0x0acfU // Intoto, Inc. -#define UHS_VID_INTELLIX 0x0ad0U // Intellix Corp. -#define UHS_VID_REMOTEC_TECHNOLOGY 0x0ad1U // Remotec Technology, Ltd -#define UHS_VID_SERVICE_AND_QUALITY_TECHNOLOGY 0x0ad2U // Service & Quality Technology Co., Ltd -#define UHS_VID_DATA_ENCRYPTION_SYSTEMS 0x0adaU // Data Encryption Systems Ltd. -#define UHS_VID_ALLION_COMPUTER 0x0ae3U // Allion Computer, Inc. -#define UHS_VID_TAITO 0x0ae4U // Taito Corp. -#define UHS_VID_NEODYM_SYSTEMS 0x0ae7U // Neodym Systems, Inc. -#define UHS_VID_SYSTEM_SUPPORT 0x0ae8U // System Support Co., Ltd -#define UHS_VID_NORTH_SHORE_CIRCUIT_DESIGN_LLP 0x0ae9U // North Shore Circuit Design L.L.P. -#define UHS_VID_SCIESSENCE 0x0aeaU // SciEssence, LLC -#define UHS_VID_TTP_COMMUNICATIONS 0x0aebU // TTP Communications, Ltd -#define UHS_VID_NEODIO_TECHNOLOGIES 0x0aecU // Neodio Technologies Corp. -#define UHS_VID_OPTION 0x0af0U // Option -#define UHS_VID_SILVER_I 0x0af6U // Silver I Co., Ltd -#define UHS_VID_B2C2 0x0af7U // B2C2, Inc. -#define UHS_VID_HAMA 0x0af9U // Hama, Inc. -#define UHS_VID_DMC 0x0afaU // DMC Co., Ltd. -#define UHS_VID_ZAPTRONIX 0x0afcU // Zaptronix Ltd -#define UHS_VID_TATENO_DENNOU 0x0afdU // Tateno Dennou, Inc. -#define UHS_VID_CUMMINS_ENGINE 0x0afeU // Cummins Engine Co. -#define UHS_VID_JUMP_ZONE_NETWORK_PRODUCTS 0x0affU // Jump Zone Network Products, Inc. -#define UHS_VID_INGENICO 0x0b00U // INGENICO -#define UHS_VID_ASUSTEK_COMPUTER 0x0b05U // ASUSTek Computer, Inc. -#define UHS_VID_DATAMAX_ONEIL 0x0b0bU // Datamax-O'Neil -#define UHS_VID_TODOS 0x0b0cU // Todos AB -#define UHS_VID_PROJECTLAB 0x0b0dU // ProjectLab -#define UHS_VID_GN_NETCOM 0x0b0eU // GN Netcom -#define UHS_VID_AVID_TECHNOLOGY 0x0b0fU // AVID Technology -#define UHS_VID_PCALLY 0x0b10U // Pcally -#define UHS_VID_I_TECH_SOLUTIONS 0x0b11U // I Tech Solutions Co., Ltd -#define UHS_VID_ELECTRONIC_WARFARE_ASSOC_INC_EWA 0x0b1eU // Electronic Warfare Assoc., Inc. (EWA) -#define UHS_VID_INSYDE_SOFTWARE 0x0b1fU // Insyde Software Corp. -#define UHS_VID_TRANSDIMENSION 0x0b20U // TransDimension, Inc. -#define UHS_VID_YOKOGAWA_ELECTRIC 0x0b21U // Yokogawa Electric Corp. -#define UHS_VID_JAPAN_SYSTEM_DEVELOPMENT 0x0b22U // Japan System Development Co., Ltd -#define UHS_VID_PAN_ASIA_ELECTRONICS 0x0b23U // Pan-Asia Electronics Co., Ltd -#define UHS_VID_LINK_EVOLUTION 0x0b24U // Link Evolution Corp. -#define UHS_VID_RITEK 0x0b27U // Ritek Corp. -#define UHS_VID_KENWOOD 0x0b28U // Kenwood Corp. -#define UHS_VID_VILLAGE_CENTER 0x0b2cU // Village Center, Inc. -#define UHS_VID_PNY_TECHNOLOGIES 0x0b30U // PNY Technologies, Inc. -#define UHS_VID_CONTOUR_DESIGN 0x0b33U // Contour Design, Inc. -#define UHS_VID_HITACHI_ULSI_SYSTEMS 0x0b37U // Hitachi ULSI Systems Co., Ltd -#define UHS_VID_GEAR_HEAD 0x0b38U // Gear Head -#define UHS_VID_OMNIDIRECTIONAL_CONTROL_TECHNOLOGY 0x0b39U // Omnidirectional Control Technology, Inc. -#define UHS_VID_IPAXESS 0x0b3aU // IPaxess -#define UHS_VID_TEKRAM_TECHNOLOGY 0x0b3bU // Tekram Technology Co., Ltd -#define UHS_VID_OLIVETTI_TECHCENTER 0x0b3cU // Olivetti Techcenter -#define UHS_VID_KIKUSUI_ELECTRONICS 0x0b3eU // Kikusui Electronics Corp. -#define UHS_VID_HAL 0x0b41U // Hal Corp. -#define UHS_VID_PLAYCOM 0x0b43U // Play.com, Inc. -#define UHS_VID_SPORTBUGCOM 0x0b47U // Sportbug.com, Inc. -#define UHS_VID_TECHNOTREND_AG 0x0b48U // TechnoTrend AG -#define UHS_VID_ASCII 0x0b49U // ASCII Corp. -#define UHS_VID_PINE 0x0b4bU // Pine Corp. Ltd. -#define UHS_VID_GRAPHTEC_AMERICA 0x0b4dU // Graphtec America, Inc. -#define UHS_VID_MUSICAL_ELECTRONICS 0x0b4eU // Musical Electronics, Ltd -#define UHS_VID_DUMPRIES 0x0b50U // Dumpries Co., Ltd -#define UHS_VID_COMFORT_KEYBOARD 0x0b51U // Comfort Keyboard Co. -#define UHS_VID_COLORADO_MICRODISPLAY 0x0b52U // Colorado MicroDisplay, Inc. -#define UHS_VID_SINBON_ELECTRONICS 0x0b54U // Sinbon Electronics Co., Ltd -#define UHS_VID_TYI_SYSTEMS 0x0b56U // TYI Systems, Ltd -#define UHS_VID_BEIJING_HANWANGTECHNOLOGY 0x0b57U // Beijing HanwangTechnology Co., Ltd -#define UHS_VID_LAKE_COMMUNICATIONS 0x0b59U // Lake Communications, Ltd -#define UHS_VID_COREL 0x0b5aU // Corel Corp. -#define UHS_VID_GREEN_ELECTRONICS 0x0b5fU // Green Electronics Co., Ltd -#define UHS_VID_NSINE 0x0b60U // Nsine, Ltd -#define UHS_VID_NEC_VIEWTECHNOLOGY 0x0b61U // NEC Viewtechnology, Ltd -#define UHS_VID_ORANGE_MICRO 0x0b62U // Orange Micro, Inc. -#define UHS_VID_ADLINK_TECHNOLOGY 0x0b63U // ADLink Technology, Inc. -#define UHS_VID_WONDERFUL_WIRE_CABLE 0x0b64U // Wonderful Wire Cable Co., Ltd -#define UHS_VID_EXPERT_MAGNETICS 0x0b65U // Expert Magnetics Corp. -#define UHS_VID_CYBIKO 0x0b66U // Cybiko Inc. -#define UHS_VID_FAIRBANKS_SCALES 0x0b67U // Fairbanks Scales -#define UHS_VID_CACHEVISION 0x0b69U // CacheVision -#define UHS_VID_MAXIM_INTEGRATED_PRODUCTS 0x0b6aU // Maxim Integrated Products -#define UHS_VID_NAGANO_JAPAN_RADIO 0x0b6fU // Nagano Japan Radio Co., Ltd -#define UHS_VID_PORTALPLAYER 0x0b70U // PortalPlayer, Inc. -#define UHS_VID_SHIN_EI_SANGYO 0x0b71U // SHIN-EI Sangyo Co., Ltd -#define UHS_VID_EMBEDDED_WIRELESS_TECHNOLOGY 0x0b72U // Embedded Wireless Technology Co., Ltd -#define UHS_VID_COMPUTONE 0x0b73U // Computone Corp. -#define UHS_VID_ROLAND_DG 0x0b75U // Roland DG Corp. -#define UHS_VID_SUNRISE_TELECOM 0x0b79U // Sunrise Telecom, Inc. -#define UHS_VID_ZEEVO 0x0b7aU // Zeevo, Inc. -#define UHS_VID_TAIKO_DENKI 0x0b7bU // Taiko Denki Co., Ltd -#define UHS_VID_ITRAN_COMMUNICATIONS 0x0b7cU // ITRAN Communications, Ltd -#define UHS_VID_ASTRODESIGN 0x0b7dU // Astrodesign, Inc. -#define UHS_VID_ID3_TECHNOLOGIES 0x0b81U // id3 Technologies -#define UHS_VID_REXTRON_TECHNOLOGY 0x0b84U // Rextron Technology, Inc. -#define UHS_VID_ELKAT_ELECTRONICS_SDN_BHD 0x0b85U // Elkat Electronics, Sdn., Bhd. -#define UHS_VID_EXPUTER_SYSTEMS 0x0b86U // Exputer Systems, Inc. -#define UHS_VID_PLUS_ONE_I_AND_T 0x0b87U // Plus-One I & T, Inc. -#define UHS_VID_SIGMA_KOKI_CO_LTD_TECHNOLOGY_CENTER 0x0b88U // Sigma Koki Co., Ltd, Technology Center -#define UHS_VID_ADVANCED_DIGITAL_BROADCAST 0x0b89U // Advanced Digital Broadcast, Ltd -#define UHS_VID_SMART_TECHNOLOGIES 0x0b8cU // SMART Technologies Inc. -#define UHS_VID_ASIX_ELECTRONICS 0x0b95U // ASIX Electronics Corp. -#define UHS_VID_SEWON_TELECOM 0x0b96U // Sewon Telecom -#define UHS_VID_O2_MICRO 0x0b97U // O2 Micro, Inc. -#define UHS_VID_PLAYMATES_TOYS 0x0b98U // Playmates Toys, Inc. -#define UHS_VID_AUDIO_INTERNATIONAL 0x0b99U // Audio International, Inc. -#define UHS_VID_DIPL_ING_STEFAN_KUNDE 0x0b9bU // Dipl.-Ing. Stefan Kunde -#define UHS_VID_SOFTPROTEC 0x0b9dU // Softprotec Co. -#define UHS_VID_CHIPPO_TECHNOLOGIES 0x0b9fU // Chippo Technologies -#define UHS_VID_US_ROBOTICS 0x0bafU // U.S. Robotics -#define UHS_VID_CONCORD_CAMERA 0x0bb0U // Concord Camera Corp. -#define UHS_VID_INFINILINK 0x0bb1U // Infinilink Corp. -#define UHS_VID_AMBIT_MICROSYSTEMS 0x0bb2U // Ambit Microsystems Corp. -#define UHS_VID_OFUJI_TECHNOLOGY 0x0bb3U // Ofuji Technology -#define UHS_VID_HTC_HIGH_TECH_COMPUTER 0x0bb4U // HTC (High Tech Computer Corp.) -#define UHS_VID_MURATA_MANUFACTURING 0x0bb5U // Murata Manufacturing Co., Ltd -#define UHS_VID_NETWORK_ALCHEMY 0x0bb6U // Network Alchemy -#define UHS_VID_JOYTECH_COMPUTER 0x0bb7U // Joytech Computer Co., Ltd -#define UHS_VID_HITACHI_SEMICONDUCTOR_AND_DEVICES_SALES 0x0bb8U // Hitachi Semiconductor and Devices Sales Co., Ltd -#define UHS_VID_EIGER_MANDC 0x0bb9U // Eiger M&C Co., Ltd -#define UHS_VID_ZACCESS_SYSTEMS 0x0bbaU // ZAccess Systems -#define UHS_VID_GENERAL_METERS 0x0bbbU // General Meters Corp. -#define UHS_VID_ASSISTIVE_TECHNOLOGY 0x0bbcU // Assistive Technology, Inc. -#define UHS_VID_SYSTEM_CONNECTION 0x0bbdU // System Connection, Inc. -#define UHS_VID_KNILINK_TECHNOLOGY 0x0bc0U // Knilink Technology, Inc. -#define UHS_VID_FUW_YNG_ELECTRONICS 0x0bc1U // Fuw Yng Electronics Co., Ltd -#define UHS_VID_SEAGATE_RSS 0x0bc2U // Seagate RSS LLC -#define UHS_VID_IPWIRELESS 0x0bc3U // IPWireless, Inc. -#define UHS_VID_MICROCUBE 0x0bc4U // Microcube Corp. -#define UHS_VID_JCN 0x0bc5U // JCN Co., Ltd -#define UHS_VID_EXWAY 0x0bc6U // ExWAY, Inc. -#define UHS_VID_X10_WIRELESS_TECHNOLOGY 0x0bc7U // X10 Wireless Technology, Inc. -#define UHS_VID_TELMAX_COMMUNICATIONS 0x0bc8U // Telmax Communications -#define UHS_VID_ECI_TELECOM 0x0bc9U // ECI Telecom, Ltd -#define UHS_VID_STARTEK_ENGINEERING 0x0bcaU // Startek Engineering, Inc. -#define UHS_VID_PERFECT_TECHNIC_ENTERPRISE 0x0bcbU // Perfect Technic Enterprise Co., Ltd -#define UHS_VID_ANDREW_PARGETER_AND_ASSOCIATES 0x0bd7U // Andrew Pargeter & Associates -#define UHS_VID_REALTEK_SEMICONDUCTOR 0x0bdaU // Realtek Semiconductor Corp. -#define UHS_VID_ERICSSON_BUSINESS_MOBILE_NETWORKS_BV 0x0bdbU // Ericsson Business Mobile Networks BV -#define UHS_VID_Y_MEDIA 0x0bdcU // Y Media Corp. -#define UHS_VID_ORANGE_PCS 0x0bddU // Orange PCS -#define UHS_VID_KANDA_TSUSHIN_KOGYO 0x0be2U // Kanda Tsushin Kogyo Co., Ltd -#define UHS_VID_TOYO 0x0be3U // TOYO Corp. -#define UHS_VID_ELKA_INTERNATIONAL 0x0be4U // Elka International, Ltd -#define UHS_VID_DOME_IMAGING_SYSTEMS 0x0be5U // DOME imaging systems, Inc. -#define UHS_VID_DONG_GUAN_HUMEN_WONDERFUL_WIRE_CABLE_FACTORY 0x0be6U // Dong Guan Humen Wonderful Wire Cable Factory -#define UHS_VID_MEI 0x0bedU // MEI -#define UHS_VID_LTK_INDUSTRIES 0x0beeU // LTK Industries, Ltd -#define UHS_VID_WAY2CALL_COMMUNICATIONS 0x0befU // Way2Call Communications -#define UHS_VID_PACE_MICRO_TECHNOLOGY_PLC 0x0bf0U // Pace Micro Technology PLC -#define UHS_VID_INTRACOM 0x0bf1U // Intracom S.A. -#define UHS_VID_KONEXX 0x0bf2U // Konexx -#define UHS_VID_ADDONICS_TECHNOLOGIES_1 0x0bf6U // Addonics Technologies, Inc. -#define UHS_VID_SUNNY_GIKEN 0x0bf7U // Sunny Giken, Inc. -#define UHS_VID_FUJITSU_SIEMENS_COMPUTERS_1 0x0bf8U // Fujitsu Siemens Computers -#define UHS_VID_KVASER 0x0bfdU // Kvaser AB -#define UHS_VID_MOTO_DEVELOPMENT_GROUP 0x0c04U // MOTO Development Group, Inc. -#define UHS_VID_APPIAN_GRAPHICS 0x0c05U // Appian Graphics -#define UHS_VID_HASBRO_GAMES 0x0c06U // Hasbro Games, Inc. -#define UHS_VID_INFINITE_DATA_STORAGE 0x0c07U // Infinite Data Storage, Ltd -#define UHS_VID_AGATE 0x0c08U // Agate -#define UHS_VID_COMJET_INFORMATION_SYSTEM 0x0c09U // Comjet Information System -#define UHS_VID_HIGHPOINT_TECHNOLOGIES 0x0c0aU // Highpoint Technologies, Inc. -#define UHS_VID_DURA_MICRO_INC_ACOMDATA 0x0c0bU // Dura Micro, Inc. (Acomdata) -#define UHS_VID_ZEROPLUS 0x0c12U // Zeroplus -#define UHS_VID_IRIS_GRAPHICS 0x0c15U // Iris Graphics -#define UHS_VID_GYRATION 0x0c16U // Gyration, Inc. -#define UHS_VID_CYBERBOARD_AS 0x0c17U // Cyberboard A/S -#define UHS_VID_SYNERTEK_KOREA 0x0c18U // SynerTek Korea, Inc. -#define UHS_VID_CYBERPIXIE 0x0c19U // cyberPIXIE, Inc. -#define UHS_VID_SILICON_MOTION 0x0c1aU // Silicon Motion, Inc. -#define UHS_VID_MIPS_TECHNOLOGIES 0x0c1bU // MIPS Technologies -#define UHS_VID_HANG_ZHOU_SILAN_ELECTRONICS 0x0c1cU // Hang Zhou Silan Electronics Co., Ltd -#define UHS_VID_TALLY_PRINTER 0x0c22U // Tally Printer Corp. -#define UHS_VID_LERNOUT__HAUSPIE 0x0c23U // Lernout + Hauspie -#define UHS_VID_TAIYO_YUDEN 0x0c24U // Taiyo Yuden -#define UHS_VID_SAMPO 0x0c25U // Sampo Corp. -#define UHS_VID_PROLIFIC_TECHNOLOGY_1 0x0c26U // Prolific Technology Inc. -#define UHS_VID_RFIDEAS 0x0c27U // RFIDeas, Inc -#define UHS_VID_METROLOGIC_INSTRUMENTS 0x0c2eU // Metrologic Instruments -#define UHS_VID_EAGLETRON 0x0c35U // Eagletron, Inc. -#define UHS_VID_E_INK 0x0c36U // E Ink Corp. -#define UHS_VID_EDIGITAL 0x0c37U // e.Digital -#define UHS_VID_DER_AN_ELECTRIC_WIRE_AND_CABLE 0x0c38U // Der An Electric Wire & Cable Co., Ltd -#define UHS_VID_IFR 0x0c39U // IFR -#define UHS_VID_FURUI_PRECISE_COMPONENT_KUNSHAN 0x0c3aU // Furui Precise Component (Kunshan) Co., Ltd -#define UHS_VID_KOMATSU 0x0c3bU // Komatsu, Ltd -#define UHS_VID_RADIUS 0x0c3cU // Radius Co., Ltd -#define UHS_VID_INNOCOM 0x0c3dU // Innocom, Inc. -#define UHS_VID_NEXTCELL 0x0c3eU // Nextcell, Inc. -#define UHS_VID_MOTOROLA_IDEN 0x0c44U // Motorola iDEN -#define UHS_VID_MICRODIA 0x0c45U // Microdia -#define UHS_VID_WAVERIDER_COMMUNICATIONS 0x0c46U // WaveRider Communications, Inc. -#define UHS_VID_ALGE_TIMING 0x0c4aU // ALGE-TIMING GmbH -#define UHS_VID_REINER_SCT_KARTENSYSTEME 0x0c4bU // Reiner SCT Kartensysteme GmbH -#define UHS_VID_NEEDHAMS_ELECTRONICS 0x0c4cU // Needham's Electronics -#define UHS_VID_SEALEVEL_SYSTEMS 0x0c52U // Sealevel Systems, Inc. -#define UHS_VID_VIEWPLUS 0x0c53U // ViewPLUS, Inc. -#define UHS_VID_GLORY 0x0c54U // Glory, Ltd -#define UHS_VID_SPECTRUM_DIGITAL 0x0c55U // Spectrum Digital, Inc. -#define UHS_VID_BILLION_BRIGHT 0x0c56U // Billion Bright, Ltd -#define UHS_VID_IMAGINATIVE_DESIGN_OPERATION 0x0c57U // Imaginative Design Operation Co., Ltd -#define UHS_VID_VIDAR_SYSTEMS 0x0c58U // Vidar Systems Corp. -#define UHS_VID_DONG_GUAN_SHINKO_WIRE 0x0c59U // Dong Guan Shinko Wire Co., Ltd -#define UHS_VID_TRS_INTERNATIONAL_MFG 0x0c5aU // TRS International Mfg., Inc. -#define UHS_VID_XYTRONIX_RESEARCH_AND_DESIGN 0x0c5eU // Xytronix Research & Design -#define UHS_VID_APOGEE_ELECTRONICS 0x0c60U // Apogee Electronics Corp. -#define UHS_VID_CHANT_SINCERE 0x0c62U // Chant Sincere Co., Ltd -#define UHS_VID_TOKO 0x0c63U // Toko, Inc. -#define UHS_VID_SIGNALITY_SYSTEM_ENGINEERING 0x0c64U // Signality System Engineering Co., Ltd -#define UHS_VID_EMINENCE_ENTERPRISE 0x0c65U // Eminence Enterprise Co., Ltd -#define UHS_VID_REXON_ELECTRONICS 0x0c66U // Rexon Electronics Corp. -#define UHS_VID_CONCEPT_TELECOM 0x0c67U // Concept Telecom, Ltd -#define UHS_VID_ACS 0x0c6aU // ACS -#define UHS_VID_JETI_TECHNISCHE_INSTRUMENTE 0x0c6cU // JETI Technische Instrumente GmbH -#define UHS_VID_MCT_ELEKTRONIKLADEN 0x0c70U // MCT Elektronikladen -#define UHS_VID_PEAK_SYSTEM 0x0c72U // PEAK System -#define UHS_VID_OPTRONIC_LABORATORIES 0x0c74U // Optronic Laboratories Inc. -#define UHS_VID_JMTEK 0x0c76U // JMTek, LLC. -#define UHS_VID_SIPIX_GROUP 0x0c77U // Sipix Group, Ltd -#define UHS_VID_DETTO 0x0c78U // Detto Corp. -#define UHS_VID_NUCONNEX_TECHNOLOGIES_PTE 0x0c79U // NuConnex Technologies Pte., Ltd -#define UHS_VID_WING_SPAN_ENTERPRISE 0x0c7aU // Wing-Span Enterprise Co., Ltd -#define UHS_VID_NDA_TECHNOLOGIES 0x0c86U // NDA Technologies, Inc. -#define UHS_VID_KYOCERA_WIRELESS 0x0c88U // Kyocera Wireless Corp. -#define UHS_VID_HONDA_TSUSHIN_KOGYO 0x0c89U // Honda Tsushin Kogyo Co., Ltd -#define UHS_VID_PATHWAY_CONNECTIVITY 0x0c8aU // Pathway Connectivity, Inc. -#define UHS_VID_WAVEFLY 0x0c8bU // Wavefly Corp. -#define UHS_VID_COACTIVE_NETWORKS 0x0c8cU // Coactive Networks -#define UHS_VID_TEMPO 0x0c8dU // Tempo -#define UHS_VID_CESSCOM 0x0c8eU // Cesscom Co., Ltd -#define UHS_VID_APPLIED_MICROSYSTEMS 0x0c8fU // Applied Microsystems -#define UHS_VID_CRYPTERA 0x0c94U // Cryptera -#define UHS_VID_BERKSHIRE_PRODUCTS 0x0c98U // Berkshire Products, Inc. -#define UHS_VID_INNOCHIPS 0x0c99U // Innochips Co., Ltd -#define UHS_VID_HANWOOL_ROBOTICS 0x0c9aU // Hanwool Robotics Corp. -#define UHS_VID_JOBIN_YVON 0x0c9bU // Jobin Yvon, Inc. -#define UHS_VID_SEMTEK 0x0c9dU // SemTek -#define UHS_VID_ZYFER 0x0ca2U // Zyfer -#define UHS_VID_SEGA 0x0ca3U // Sega Corp. -#define UHS_VID_STANDT_INSTRUMENT 0x0ca4U // ST&T Instrument Corp. -#define UHS_VID_BAE_SYSTEMS_CANADA 0x0ca5U // BAE Systems Canada, Inc. -#define UHS_VID_CASTLES_TECHNOLOGY 0x0ca6U // Castles Technology Co., Ltd -#define UHS_VID_INFORMATION_SYSTEMS_LABORATORIES 0x0ca7U // Information Systems Laboratories -#define UHS_VID_MOTOROLA_CGISS 0x0cadU // Motorola CGISS -#define UHS_VID_ASCOM_BUSINESS_SYSTEMS 0x0caeU // Ascom Business Systems, Ltd -#define UHS_VID_BUSLINK 0x0cafU // Buslink -#define UHS_VID_FLYING_PIG_SYSTEMS 0x0cb0U // Flying Pig Systems -#define UHS_VID_INNOVONICS 0x0cb1U // Innovonics, Inc. -#define UHS_VID_CELESTIX_NETWORKS_PTE 0x0cb6U // Celestix Networks, Pte., Ltd -#define UHS_VID_SINGATRON_ENTERPRISE 0x0cb7U // Singatron Enterprise Co., Ltd -#define UHS_VID_OPTICIS 0x0cb8U // Opticis Co., Ltd -#define UHS_VID_TRUST_ELECTRONIC_SHANGHAI 0x0cbaU // Trust Electronic (Shanghai) Co., Ltd -#define UHS_VID_SHANGHAI_DARONG_ELECTRONICS 0x0cbbU // Shanghai Darong Electronics Co., Ltd -#define UHS_VID_PALMAX_TECHNOLOGY 0x0cbcU // Palmax Technology Co., Ltd -#define UHS_VID_PENTEL_CO_LTD_ELECTRONICS_EQUIPMENT_DIV 0x0cbdU // Pentel Co., Ltd (Electronics Equipment Div.) -#define UHS_VID_KERYX_TECHNOLOGIES 0x0cbeU // Keryx Technologies, Inc. -#define UHS_VID_UNION_GENIUS_COMPUTER 0x0cbfU // Union Genius Computer Co., Ltd -#define UHS_VID_KUON_YI_INDUSTRIAL 0x0cc0U // Kuon Yi Industrial Corp. -#define UHS_VID_GIVEN_IMAGING 0x0cc1U // Given Imaging, Ltd -#define UHS_VID_TIMEX 0x0cc2U // Timex Corp. -#define UHS_VID_RIMAGE 0x0cc3U // Rimage Corp. -#define UHS_VID_EMSYS 0x0cc4U // emsys GmbH -#define UHS_VID_SENDO 0x0cc5U // Sendo -#define UHS_VID_INTERMAGIC 0x0cc6U // Intermagic Corp. -#define UHS_VID_KONTRON_MEDICAL_AG 0x0cc7U // Kontron Medical AG -#define UHS_VID_TECHNOTOOLS 0x0cc8U // Technotools Corp. -#define UHS_VID_BROADMAX_TECHNOLOGIES 0x0cc9U // BroadMAX Technologies, Inc. -#define UHS_VID_AMPHENOL 0x0ccaU // Amphenol -#define UHS_VID_SKNET 0x0ccbU // SKNet Co., Ltd -#define UHS_VID_DOMEX_TECHNOLOGY 0x0cccU // Domex Technology Corp. -#define UHS_VID_TERRATEC_ELECTRONIC 0x0ccdU // TerraTec Electronic GmbH -#define UHS_VID_BANG_OLUFSEN 0x0cd4U // Bang Olufsen -#define UHS_VID_LABJACK_CORPORATION 0x0cd5U // LabJack Corporation -#define UHS_VID_NEWCHIP_SRL 0x0cd7U // NewChip S.r.l. -#define UHS_VID_JS_DIGITECH 0x0cd8U // JS Digitech, Inc. -#define UHS_VID_HITACHI_SHIN_DIN_CABLE 0x0cd9U // Hitachi Shin Din Cable, Ltd -#define UHS_VID_Z_COM 0x0cdeU // Z-Com -#define UHS_VID_VALIDATION_TECHNOLOGIES_INTERNATIONAL 0x0ce5U // Validation Technologies International -#define UHS_VID_PICO_TECHNOLOGY 0x0ce9U // Pico Technology -#define UHS_VID_E_CONN_ELECTRONIC 0x0cf1U // e-Conn Electronic Co., Ltd -#define UHS_VID_ENE_TECHNOLOGY 0x0cf2U // ENE Technology, Inc. -#define UHS_VID_ATHEROS_COMMUNICATIONS 0x0cf3U // Atheros Communications, Inc. -#define UHS_VID_FOMTEX 0x0cf4U // Fomtex Corp. -#define UHS_VID_CELLINK 0x0cf5U // Cellink Co., Ltd -#define UHS_VID_COMPUCABLE 0x0cf6U // Compucable Corp. -#define UHS_VID_ISHONI_NETWORKS 0x0cf7U // ishoni Networks -#define UHS_VID_CLARISYS 0x0cf8U // Clarisys, Inc. -#define UHS_VID_CENTRAL_SYSTEM_RESEARCH 0x0cf9U // Central System Research Co., Ltd -#define UHS_VID_INVISO 0x0cfaU // Inviso, Inc. -#define UHS_VID_MINOLTA_QMS 0x0cfcU // Minolta-QMS, Inc. -#define UHS_VID_SAFA_MEDIA 0x0cffU // SAFA MEDIA Co., Ltd. -#define UHS_VID_TELOS_EDV_SYSTEMENTWICKLUNG 0x0d06U // telos EDV Systementwicklung GmbH -#define UHS_VID_UTSTARCOM 0x0d08U // UTStarcom -#define UHS_VID_CONTEMPORARY_CONTROLS 0x0d0bU // Contemporary Controls -#define UHS_VID_ASTRON_ELECTRONICS 0x0d0cU // Astron Electronics Co., Ltd -#define UHS_VID_MKNET 0x0d0dU // MKNet Corp. -#define UHS_VID_HYBRID_NETWORKS 0x0d0eU // Hybrid Networks, Inc. -#define UHS_VID_FENG_SHIN_CABLE 0x0d0fU // Feng Shin Cable Co., Ltd -#define UHS_VID_ELASTIC_NETWORKS 0x0d10U // Elastic Networks -#define UHS_VID_MASPRO_DENKOH 0x0d11U // Maspro Denkoh Corp. -#define UHS_VID_HANSOL_ELECTRONICS 0x0d12U // Hansol Electronics, Inc. -#define UHS_VID_BMF 0x0d13U // BMF Corp. -#define UHS_VID_ARRAY_COMM 0x0d14U // Array Comm, Inc. -#define UHS_VID_ONSTREAM_BV 0x0d15U // OnStream b.v. -#define UHS_VID_HI_TOUCH_IMAGING_TECHNOLOGIES 0x0d16U // Hi-Touch Imaging Technologies Co., Ltd -#define UHS_VID_NALTEC 0x0d17U // NALTEC, Inc. -#define UHS_VID_COAXMEDIA 0x0d18U // coaXmedia -#define UHS_VID_HANK_CONNECTION_INDUSTRIAL 0x0d19U // Hank Connection Industrial Co., Ltd -#define UHS_VID_NXP 0x0d28U // NXP -#define UHS_VID_LEO_HUI_ELECTRIC_WIRE_AND_CABLE 0x0d32U // Leo Hui Electric Wire & Cable Co., Ltd -#define UHS_VID_AIRSPEAK 0x0d33U // AirSpeak, Inc. -#define UHS_VID_REARDEN_STEEL_TECHNOLOGIES 0x0d34U // Rearden Steel Technologies -#define UHS_VID_DAH_KUN 0x0d35U // Dah Kun Co., Ltd -#define UHS_VID_POSIFLEX_TECHNOLOGIES 0x0d3aU // Posiflex Technologies, Inc. -#define UHS_VID_SRI_CABLE_TECHNOLOGY 0x0d3cU // Sri Cable Technology, Ltd -#define UHS_VID_TANGTOP_TECHNOLOGY 0x0d3dU // Tangtop Technology Co., Ltd -#define UHS_VID_FITCOM 0x0d3eU // Fitcom, inc. -#define UHS_VID_MTS_SYSTEMS 0x0d3fU // MTS Systems Corp. -#define UHS_VID_ASCOR 0x0d40U // Ascor, Inc. -#define UHS_VID_TA_YUN_TERMINALS_INDUSTRIAL 0x0d41U // Ta Yun Terminals Industrial Co., Ltd -#define UHS_VID_FULL_DER 0x0d42U // Full Der Co., Ltd -#define UHS_VID_KOBIL_SYSTEMS 0x0d46U // Kobil Systems GmbH -#define UHS_VID_PROMETHEAN_LIMITED 0x0d48U // Promethean Limited -#define UHS_VID_MAXTOR 0x0d49U // Maxtor -#define UHS_VID_NF 0x0d4aU // NF Corp. -#define UHS_VID_GRAPE_SYSTEMS 0x0d4bU // Grape Systems, Inc. -#define UHS_VID_TEDAS_AG 0x0d4cU // Tedas AG -#define UHS_VID_COHERENT 0x0d4dU // Coherent, Inc. -#define UHS_VID_AGERE_SYSTEMS_NETHERLAND_BV 0x0d4eU // Agere Systems Netherland BV -#define UHS_VID_EADS_AIRBUS_FRANCE 0x0d4fU // EADS Airbus France -#define UHS_VID_CLEWARE 0x0d50U // Cleware GmbH -#define UHS_VID_VOLEX_ASIA_PTE 0x0d51U // Volex (Asia) Pte., Ltd -#define UHS_VID_HMI 0x0d53U // HMI Co., Ltd -#define UHS_VID_HOLON 0x0d54U // Holon Corp. -#define UHS_VID_ASKA_TECHNOLOGIES 0x0d55U // ASKA Technologies, Inc. -#define UHS_VID_AVLAB_TECHNOLOGY 0x0d56U // AVLAB Technology, Inc. -#define UHS_VID_SOLOMON_MICROTECH 0x0d57U // Solomon Microtech, Ltd -#define UHS_VID_SMC_NETWORKS 0x0d5cU // SMC Networks, Inc. -#define UHS_VID_MYACOM 0x0d5eU // Myacom, Ltd -#define UHS_VID_CSI 0x0d5fU // CSI, Inc. -#define UHS_VID_IVL_TECHNOLOGIES 0x0d60U // IVL Technologies, Ltd -#define UHS_VID_MEILU_ELECTRONICS_SHENZHEN 0x0d61U // Meilu Electronics (Shenzhen) Co., Ltd -#define UHS_VID_DARFON_ELECTRONICS 0x0d62U // Darfon Electronics Corp. -#define UHS_VID_FRITZ_GEGAUF_AG 0x0d63U // Fritz Gegauf AG -#define UHS_VID_DXG_TECHNOLOGY 0x0d64U // DXG Technology Corp. -#define UHS_VID_KMJP 0x0d65U // KMJP Co., Ltd -#define UHS_VID_TMT 0x0d66U // TMT -#define UHS_VID_ADVANET 0x0d67U // Advanet, Inc. -#define UHS_VID_SUPER_LINK_ELECTRONICS 0x0d68U // Super Link Electronics Co., Ltd -#define UHS_VID_NSI 0x0d69U // NSI -#define UHS_VID_MEGAPOWER_INTERNATIONAL 0x0d6aU // Megapower International Corp. -#define UHS_VID_AND_OR_LOGIC 0x0d6bU // And-Or Logic -#define UHS_VID_TRY_COMPUTER 0x0d70U // Try Computer Co., Ltd -#define UHS_VID_HIRAKAWA_HEWTECH 0x0d71U // Hirakawa Hewtech Corp. -#define UHS_VID_WINMATE_COMMUNICATION 0x0d72U // Winmate Communication, Inc. -#define UHS_VID_HITS_COMMUNICATIONS 0x0d73U // Hit's Communications, Inc. -#define UHS_VID_MFP_KOREA 0x0d76U // MFP Korea, Inc. -#define UHS_VID_POWER_SENTRYNEWPOINT 0x0d77U // Power Sentry/Newpoint -#define UHS_VID_JAPAN_DISTRIBUTOR 0x0d78U // Japan Distributor Corp. -#define UHS_VID_MARX_DATENTECHNIK 0x0d7aU // MARX Datentechnik GmbH -#define UHS_VID_WELLCO_TECHNOLOGY 0x0d7bU // Wellco Technology Co., Ltd -#define UHS_VID_TAIWAN_LINE_TEK_ELECTRONIC 0x0d7cU // Taiwan Line Tek Electronic Co., Ltd -#define UHS_VID_PHISON_ELECTRONICS 0x0d7dU // Phison Electronics Corp. -#define UHS_VID_AMERICAN_COMPUTER_AND_DIGITAL_COMPONENTS 0x0d7eU // American Computer & Digital Components -#define UHS_VID_ESSENTIAL_REALITY 0x0d7fU // Essential Reality LLC -#define UHS_VID_HR_SILVINE_ELECTRONICS 0x0d80U // H.R. Silvine Electronics, Inc. -#define UHS_VID_TECHNOVISION 0x0d81U // TechnoVision -#define UHS_VID_THINK_OUTSIDE 0x0d83U // Think Outside, Inc. -#define UHS_VID_DOLBY_LABORATORIES 0x0d87U // Dolby Laboratories Inc. -#define UHS_VID_OZ_SOFTWARE 0x0d89U // Oz Software -#define UHS_VID_KING_JIM 0x0d8aU // King Jim Co., Ltd -#define UHS_VID_ASCOM_TELECOMMUNICATIONS 0x0d8bU // Ascom Telecommunications, Ltd -#define UHS_VID_C_MEDIA_ELECTRONICS 0x0d8cU // C-Media Electronics, Inc. -#define UHS_VID_PROMOTION_AND_DISPLAY_TECHNOLOGY 0x0d8dU // Promotion & Display Technology, Ltd -#define UHS_VID_GLOBAL_SUN_TECHNOLOGY 0x0d8eU // Global Sun Technology, Inc. -#define UHS_VID_PITNEY_BOWES 0x0d8fU // Pitney Bowes -#define UHS_VID_SURE_FIRE_ELECTRICAL 0x0d90U // Sure-Fire Electrical Corp. -#define UHS_VID_SKANHEX_TECHNOLOGY 0x0d96U // Skanhex Technology, Inc. -#define UHS_VID_SANTA_BARBARA_INSTRUMENT_GROUP 0x0d97U // Santa Barbara Instrument Group -#define UHS_VID_MARS_SEMICONDUCTOR 0x0d98U // Mars Semiconductor Corp. -#define UHS_VID_TRAZER_TECHNOLOGIES 0x0d99U // Trazer Technologies, Inc. -#define UHS_VID_RTX_TELECOM_AS 0x0d9aU // RTX Telecom AS -#define UHS_VID_TAT_SHING_ELECTRICAL 0x0d9bU // Tat Shing Electrical Co. -#define UHS_VID_CHEE_CHEN_HI_TECHNOLOGY 0x0d9cU // Chee Chen Hi-Technology Co., Ltd -#define UHS_VID_SANWA_SUPPLY 0x0d9dU // Sanwa Supply, Inc. -#define UHS_VID_AVAYA 0x0d9eU // Avaya -#define UHS_VID_POWERCOM 0x0d9fU // Powercom Co., Ltd -#define UHS_VID_DANGER_RESEARCH 0x0da0U // Danger Research -#define UHS_VID_SUZHOU_PETERS_PRECISE_INDUSTRIAL 0x0da1U // Suzhou Peter's Precise Industrial Co., Ltd -#define UHS_VID_LAND_INSTRUMENTS_INTERNATIONAL 0x0da2U // Land Instruments International, Ltd -#define UHS_VID_NIPPON_ELECTRO_SENSORY_DEVICES 0x0da3U // Nippon Electro-Sensory Devices Corp. -#define UHS_VID_POLAR_ELECTRO_OY 0x0da4U // Polar Electro Oy -#define UHS_VID_IOGEAR 0x0da7U // IOGear, Inc. -#define UHS_VID_SOFTDSP 0x0da8U // softDSP Co., Ltd -#define UHS_VID_CUBIG_GROUP 0x0dabU // Cubig Group -#define UHS_VID_WESTOVER_SCIENTIFIC 0x0dadU // Westover Scientific -#define UHS_VID_MICRO_STAR_INTERNATIONAL 0x0db0U // Micro Star International -#define UHS_VID_WEN_TE_ELECTRONICS 0x0db1U // Wen Te Electronics Co., Ltd -#define UHS_VID_SHIAN_HWI_PLUG_PARTS_PLASTIC_FACTORY 0x0db2U // Shian Hwi Plug Parts, Plastic Factory -#define UHS_VID_TEKRAM_TECHNOLOGY_1 0x0db3U // Tekram Technology Co., Ltd -#define UHS_VID_CHUNG_FU_CHEN_YEH_ENTERPRISE 0x0db4U // Chung Fu Chen Yeh Enterprise Corp. -#define UHS_VID_ACCESS_IS 0x0db5U // Access IS -#define UHS_VID_ELCON_SYSTEMTECHNIK 0x0db7U // ELCON Systemtechnik -#define UHS_VID_DIGIDESIGN 0x0dbaU // Digidesign -#define UHS_VID_AANDD_MEDICAL 0x0dbcU // A&D Medical -#define UHS_VID_JIUH_SHIUH_PRECISION_INDUSTRY 0x0dbeU // Jiuh Shiuh Precision Industry Co., Ltd -#define UHS_VID_JESS_LINK_INTERNATIONAL 0x0dbfU // Jess-Link International -#define UHS_VID_G7_SOLUTIONS_FORMERLY_GREAT_NOTIONS 0x0dc0U // G7 Solutions (formerly Great Notions) -#define UHS_VID_TAMAGAWA_SEIKI 0x0dc1U // Tamagawa Seiki Co., Ltd -#define UHS_VID_ATHENA_SMARTCARD_SOLUTIONS 0x0dc3U // Athena Smartcard Solutions, Inc. -#define UHS_VID_MACPOWER_PERIPHERALS 0x0dc4U // Macpower Peripherals, Ltd -#define UHS_VID_SDK 0x0dc5U // SDK Co., Ltd -#define UHS_VID_PRECISION_SQUARED_TECHNOLOGY 0x0dc6U // Precision Squared Technology Corp. -#define UHS_VID_FIRST_CABLE_LINE 0x0dc7U // First Cable Line, Inc. -#define UHS_VID_NETWORKFAB 0x0dcdU // NetworkFab Corp. -#define UHS_VID_ACCESS_SOLUTIONS 0x0dd0U // Access Solutions -#define UHS_VID_CONTEK_ELECTRONICS 0x0dd1U // Contek Electronics Co., Ltd -#define UHS_VID_POWER_QUOTIENT_INTERNATIONAL 0x0dd2U // Power Quotient International Co., Ltd -#define UHS_VID_MEDIAQ 0x0dd3U // MediaQ -#define UHS_VID_CUSTOM_ENGINEERING_SPA 0x0dd4U // Custom Engineering SPA -#define UHS_VID_CALIFORNIA_MICRO_DEVICES 0x0dd5U // California Micro Devices -#define UHS_VID_KOCOM 0x0dd7U // Kocom Co., Ltd -#define UHS_VID_NETAC_TECHNOLOGY 0x0dd8U // Netac Technology Co., Ltd -#define UHS_VID_HIGHSPEED_SURFING 0x0dd9U // HighSpeed Surfing -#define UHS_VID_INTEGRATED_CIRCUIT_SOLUTION 0x0ddaU // Integrated Circuit Solution, Inc. -#define UHS_VID_TAMARACK 0x0ddbU // Tamarack, Inc. -#define UHS_VID_DATELINK_TECHNOLOGY 0x0dddU // Datelink Technology Co., Ltd -#define UHS_VID_UBICOM 0x0ddeU // Ubicom, Inc. -#define UHS_VID_BD_CONSUMER_HEALTHCARE 0x0de0U // BD Consumer Healthcare -#define UHS_VID_USBMICRO 0x0de7U // USBmicro -#define UHS_VID_UTECH_ELECTRONIC_DG 0x0deaU // UTECH Electronic (D.G.) Co., Ltd. -#define UHS_VID_NOVASONICS 0x0dedU // Novasonics -#define UHS_VID_LIFETIME_MEMORY_PRODUCTS 0x0deeU // Lifetime Memory Products -#define UHS_VID_FULL_RISE_ELECTRONIC 0x0defU // Full Rise Electronic Co., Ltd -#define UHS_VID_NETANDSYS 0x0df4U // NET&SYS -#define UHS_VID_SITECOM_EUROPE_BV 0x0df6U // Sitecom Europe B.V. -#define UHS_VID_MOBILE_ACTION_TECHNOLOGY 0x0df7U // Mobile Action Technology, Inc. -#define UHS_VID_TOYO_COMMUNICATION_EQUIPMENT 0x0dfaU // Toyo Communication Equipment Co., Ltd -#define UHS_VID_GENERALTOUCH_TECHNOLOGY 0x0dfcU // GeneralTouch Technology Co., Ltd -#define UHS_VID_NIPPON_SYSTEMWARE 0x0e03U // Nippon Systemware Co., Ltd -#define UHS_VID_WINBEST_TECHNOLOGY 0x0e08U // Winbest Technology Co., Ltd -#define UHS_VID_AMIGO_TECHNOLOGY 0x0e0bU // Amigo Technology Inc. -#define UHS_VID_GESYTEC 0x0e0cU // Gesytec -#define UHS_VID_PICOQUANT 0x0e0dU // PicoQuant GmbH -#define UHS_VID_VMWARE 0x0e0fU // VMware, Inc. -#define UHS_VID_JMTEK_1 0x0e16U // JMTek, LLC -#define UHS_VID_WALEX_ELECTRONIC 0x0e17U // Walex Electronic, Ltd -#define UHS_VID_UNISYS_1 0x0e1aU // Unisys -#define UHS_VID_CREWAVE 0x0e1bU // Crewave -#define UHS_VID_PEGASUS_TECHNOLOGIES 0x0e20U // Pegasus Technologies Ltd. -#define UHS_VID_COWON_SYSTEMS 0x0e21U // Cowon Systems, Inc. -#define UHS_VID_SYMBIAN 0x0e22U // Symbian Ltd. -#define UHS_VID_LIOU_YUANE_ENTERPRISE 0x0e23U // Liou Yuane Enterprise Co., Ltd -#define UHS_VID_VINCHIP_SYSTEMS 0x0e25U // VinChip Systems, Inc. -#define UHS_VID_J_PHONE_EAST 0x0e26U // J-Phone East Co., Ltd -#define UHS_VID_HEARTMATH 0x0e30U // HeartMath LLC -#define UHS_VID_MICRO_COMPUTER_CONTROL 0x0e34U // Micro Computer Control Corp. -#define UHS_VID_3PEA_TECHNOLOGIES 0x0e35U // 3Pea Technologies, Inc. -#define UHS_VID_TIEPIE_ENGINEERING 0x0e36U // TiePie engineering -#define UHS_VID_STRATITEC 0x0e38U // Stratitec, Inc. -#define UHS_VID_SMART_MODULAR_TECHNOLOGIES 0x0e39U // Smart Modular Technologies, Inc. -#define UHS_VID_NEOSTAR_TECHNOLOGY 0x0e3aU // Neostar Technology Co., Ltd -#define UHS_VID_MANSELLA 0x0e3bU // Mansella, Ltd -#define UHS_VID_LINE6 0x0e41U // Line6, Inc. -#define UHS_VID_SUN_RISEFUL_TECHNOLOGY 0x0e44U // Sun-Riseful Technology Co., Ltd. -#define UHS_VID_JULIA 0x0e48U // Julia Corp., Ltd -#define UHS_VID_SHENZHEN_BAO_HING_ELECTRIC_WIRE_AND_CABLE_MFR 0x0e4aU // Shenzhen Bao Hing Electric Wire & Cable Mfr. Co. -#define UHS_VID_RADICA_GAMES 0x0e4cU // Radica Games, Ltd -#define UHS_VID_TECHNODATA_INTERWARE 0x0e50U // TechnoData Interware -#define UHS_VID_SPEED_DRAGON_MULTIMEDIA 0x0e55U // Speed Dragon Multimedia, Ltd -#define UHS_VID_KINGSTON_TECHNOLOGY_COMPANY 0x0e56U // Kingston Technology Company, Inc. -#define UHS_VID_ACTIVE 0x0e5aU // Active Co., Ltd -#define UHS_VID_UNION_POWER_INFORMATION_INDUSTRIAL 0x0e5bU // Union Power Information Industrial Co., Ltd -#define UHS_VID_BITLAND_INFORMATION_TECHNOLOGY 0x0e5cU // Bitland Information Technology Co., Ltd -#define UHS_VID_NELTRON_INDUSTRIAL 0x0e5dU // Neltron Industrial Co., Ltd -#define UHS_VID_CONWISE_TECHNOLOGY 0x0e5eU // Conwise Technology Co., Ltd. -#define UHS_VID_HAWKING_TECHNOLOGIES 0x0e66U // Hawking Technologies -#define UHS_VID_FOSSIL 0x0e67U // Fossil, Inc. -#define UHS_VID_MEGAWIN_TECHNOLOGY 0x0e6aU // Megawin Technology Co., Ltd -#define UHS_VID_LOGIC3 0x0e6fU // Logic3 -#define UHS_VID_TOKYO_ELECTRONIC_INDUSTRY 0x0e70U // Tokyo Electronic Industry Co., Ltd -#define UHS_VID_HSI_CHIN_ELECTRONICS 0x0e72U // Hsi-Chin Electronics Co., Ltd -#define UHS_VID_TVS_ELECTRONICS 0x0e75U // TVS Electronics, Ltd -#define UHS_VID_ARCHOS 0x0e79U // Archos, Inc. -#define UHS_VID_ON_TECH_INDUSTRY 0x0e7bU // On-Tech Industry Co., Ltd -#define UHS_VID_GMATE 0x0e7eU // Gmate, Inc. -#define UHS_VID_CHING_TAI_ELECTRIC_WIRE_AND_CABLE 0x0e82U // Ching Tai Electric Wire & Cable Co., Ltd -#define UHS_VID_SHIN_AN_WIRE_AND_CABLE 0x0e83U // Shin An Wire & Cable Co. -#define UHS_VID_WELL_FORCE_ELECTRONIC 0x0e8cU // Well Force Electronic Co., Ltd -#define UHS_VID_MEDIATEK_1 0x0e8dU // MediaTek Inc. -#define UHS_VID_GREENASIA 0x0e8fU // GreenAsia Inc. -#define UHS_VID_WIEBETECH 0x0e90U // WiebeTech, LLC -#define UHS_VID_VTECH_ENGINEERING_CANADA 0x0e91U // VTech Engineering Canada, Ltd -#define UHS_VID_CS_GLORY_ENTERPRISE 0x0e92U // C's Glory Enterprise Co., Ltd -#define UHS_VID_EM_TECHNICS 0x0e93U // eM Technics Co., Ltd -#define UHS_VID_FUTURE_TECHNOLOGY 0x0e95U // Future Technology Co., Ltd -#define UHS_VID_APLUX_COMMUNICATIONS 0x0e96U // Aplux Communications, Ltd -#define UHS_VID_FINGERWORKS 0x0e97U // Fingerworks, Inc. -#define UHS_VID_ADVANCED_ANALOGIC_TECHNOLOGIES 0x0e98U // Advanced Analogic Technologies, Inc. -#define UHS_VID_PARALLEL_DICE 0x0e99U // Parallel Dice Co., Ltd -#define UHS_VID_TA_HSING_INDUSTRIES 0x0e9aU // TA HSING Industries, Ltd -#define UHS_VID_ADTEC 0x0e9bU // ADTEC Corp. -#define UHS_VID_STREAMZAP 0x0e9cU // Streamzap, Inc. -#define UHS_VID_TAMURA 0x0e9fU // Tamura Corp. -#define UHS_VID_OURS_TECHNOLOGY 0x0ea0U // Ours Technology, Inc. -#define UHS_VID_NIHON_COMPUTER 0x0ea6U // Nihon Computer Co., Ltd -#define UHS_VID_MSL_ENTERPRISES 0x0ea7U // MSL Enterprises Corp. -#define UHS_VID_CENDYNE 0x0ea8U // CenDyne, Inc. -#define UHS_VID_HUMAX_1 0x0eadU // Humax Co., Ltd -#define UHS_VID_NOVATECH 0x0eb0U // NovaTech -#define UHS_VID_WIS_TECHNOLOGIES 0x0eb1U // WIS Technologies, Inc. -#define UHS_VID_Y_S_ELECTRONIC 0x0eb2U // Y-S Electronic Co., Ltd -#define UHS_VID_SAINT_TECHNOLOGY 0x0eb3U // Saint Technology Corp. -#define UHS_VID_ENDOR_AG 0x0eb7U // Endor AG -#define UHS_VID_METTLER_TOLEDO 0x0eb8U // Mettler Toledo -#define UHS_VID_THERMO_FISHER_SCIENTIFIC 0x0ebbU // Thermo Fisher Scientific -#define UHS_VID_VWEB 0x0ebeU // VWeb Corp. -#define UHS_VID_OMEGA_TECHNOLOGY_OF_TAIWAN 0x0ebfU // Omega Technology of Taiwan, Inc. -#define UHS_VID_LHI_TECHNOLOGY_CHINA 0x0ec0U // LHI Technology (China) Co., Ltd -#define UHS_VID_ABIT_COMPUTER 0x0ec1U // Abit Computer Corp. -#define UHS_VID_SWEETRAY_INDUSTRIAL 0x0ec2U // Sweetray Industrial, Ltd -#define UHS_VID_AXELL 0x0ec3U // Axell Co., Ltd -#define UHS_VID_BALLRACING_DEVELOPMENTS 0x0ec4U // Ballracing Developments, Ltd -#define UHS_VID_GT_INFORMATION_SYSTEM 0x0ec5U // GT Information System Co., Ltd -#define UHS_VID_INNOVISION_MULTIMEDIA 0x0ec6U // InnoVISION Multimedia, Ltd -#define UHS_VID_THETA_LINK 0x0ec7U // Theta Link Corp. -#define UHS_VID_LITE_ON_IT 0x0ecdU // Lite-On IT Corp. -#define UHS_VID_TAISOL_ELECTRONICS 0x0eceU // TaiSol Electronics Co., Ltd -#define UHS_VID_PHOGENIX_IMAGING 0x0ecfU // Phogenix Imaging, LLC -#define UHS_VID_WINMAXGROUP 0x0ed1U // WinMaxGroup -#define UHS_VID_KYOTO_MICRO_COMPUTER 0x0ed2U // Kyoto Micro Computer Co., Ltd -#define UHS_VID_WING_TECH_ENTERPRISE 0x0ed3U // Wing-Tech Enterprise Co., Ltd -#define UHS_VID_FIBERBYTE 0x0ed5U // Fiberbyte -#define UHS_VID_NORIAKE_ITRON 0x0edaU // Noriake Itron Corp. -#define UHS_VID_E_MDT 0x0edfU // e-MDT Co., Ltd -#define UHS_VID_SHIMA_SEIKI_MFG 0x0ee0U // Shima Seiki Mfg., Ltd -#define UHS_VID_SAROTECH 0x0ee1U // Sarotech Co., Ltd -#define UHS_VID_AMI_SEMICONDUCTOR 0x0ee2U // AMI Semiconductor, Inc. -#define UHS_VID_COMTRUE_TECHNOLOGY 0x0ee3U // ComTrue Technology Corp. -#define UHS_VID_SUNRICH_TECHNOLOGY 0x0ee4U // Sunrich Technology, Ltd -#define UHS_VID_DIGITAL_STREAM_TECHNOLOGY 0x0eeeU // Digital Stream Technology, Inc. -#define UHS_VID_D_WAV_SCIENTIFIC 0x0eefU // D-WAV Scientific Co., Ltd -#define UHS_VID_HITACHI_CABLE 0x0ef0U // Hitachi Cable, Ltd -#define UHS_VID_AICHI_MICRO_INTELLIGENT 0x0ef1U // Aichi Micro Intelligent Corp. -#define UHS_VID_IO_MAGIC 0x0ef2U // I/O Magic Corp. -#define UHS_VID_LYNN_PRODUCTS 0x0ef3U // Lynn Products, Inc. -#define UHS_VID_DSI_DATOTECH 0x0ef4U // DSI Datotech -#define UHS_VID_POINTCHIPS 0x0ef5U // PointChips -#define UHS_VID_YIELD_MICROELECTRONICS 0x0ef6U // Yield Microelectronics Corp. -#define UHS_VID_SM_TECH_CO_LTD_TULIP 0x0ef7U // SM Tech Co., Ltd (Tulip) -#define UHS_VID_OASIS_SEMICONDUCTOR 0x0efdU // Oasis Semiconductor -#define UHS_VID_WEM_TECHNOLOGY 0x0efeU // Wem Technology, Inc. -#define UHS_VID_UNITEK_UPS_SYSTEMS 0x0f03U // Unitek UPS Systems -#define UHS_VID_VISUAL_FRONTIER_ENTERPRISE 0x0f06U // Visual Frontier Enterprise Co., Ltd -#define UHS_VID_CSL_WIRE_AND_PLUG_SHEN_ZHEN 0x0f08U // CSL Wire & Plug (Shen Zhen) Co. -#define UHS_VID_CAS 0x0f0cU // CAS Corp. -#define UHS_VID_HORI 0x0f0dU // Hori Co., Ltd -#define UHS_VID_ENERGY_FULL 0x0f0eU // Energy Full Corp. -#define UHS_VID_LD_DIDACTIC 0x0f11U // LD Didactic GmbH -#define UHS_VID_MARS_ENGINEERING 0x0f12U // Mars Engineering Corp. -#define UHS_VID_ACETEK_TECHNOLOGY 0x0f13U // Acetek Technology Co., Ltd -#define UHS_VID_INGENICO_1 0x0f14U // Ingenico -#define UHS_VID_FINGER_LAKES_INSTRUMENTATION 0x0f18U // Finger Lakes Instrumentation -#define UHS_VID_ORACOM 0x0f19U // Oracom Co., Ltd -#define UHS_VID_ONSET_COMPUTER 0x0f1bU // Onset Computer Corp. -#define UHS_VID_FUNAI_ELECTRIC 0x0f1cU // Funai Electric Co., Ltd -#define UHS_VID_IWILL 0x0f1dU // Iwill Corp. -#define UHS_VID_IOI_TECHNOLOGY 0x0f21U // IOI Technology Corp. -#define UHS_VID_SENIOR_INDUSTRIES 0x0f22U // Senior Industries, Inc. -#define UHS_VID_LEADER_TECH_MANUFACTURER 0x0f23U // Leader Tech Manufacturer Co., Ltd -#define UHS_VID_FLEX_P_INDUSTRIES_SND_BHD 0x0f24U // Flex-P Industries, Snd., Bhd. -#define UHS_VID_VIPOWER 0x0f2dU // ViPower, Inc. -#define UHS_VID_GENIALITY_MAPLE_TECHNOLOGY 0x0f2eU // Geniality Maple Technology Co., Ltd -#define UHS_VID_PRIVA_DESIGN_SERVICES 0x0f2fU // Priva Design Services -#define UHS_VID_JESS_TECHNOLOGY 0x0f30U // Jess Technology Co., Ltd -#define UHS_VID_CHRYSALIS_DEVELOPMENT 0x0f31U // Chrysalis Development -#define UHS_VID_YFC_BONEAGLE_ELECTRIC 0x0f32U // YFC-BonEagle Electric Co., Ltd -#define UHS_VID_KOKUYO 0x0f37U // Kokuyo Co., Ltd -#define UHS_VID_NIEN_YI_INDUSTRIAL 0x0f38U // Nien-Yi Industrial Corp. -#define UHS_VID_TG3_ELECTRONICS_1 0x0f39U // TG3 Electronics -#define UHS_VID_AIRPRIME_INCORPORATED 0x0f3dU // Airprime, Incorporated -#define UHS_VID_RDC_SEMICONDUCTOR 0x0f41U // RDC Semiconductor Co., Ltd -#define UHS_VID_NITAL_CONSULTING_SERVICES 0x0f42U // Nital Consulting Services, Inc. -#define UHS_VID_POLHEMUS 0x0f44U // Polhemus -#define UHS_VID_ST_JOHN_TECHNOLOGY 0x0f4bU // St. John Technology Co., Ltd -#define UHS_VID_WORLDWIDE_CABLE_OPTO 0x0f4cU // WorldWide Cable Opto Corp. -#define UHS_VID_MICROTUNE 0x0f4dU // Microtune, Inc. -#define UHS_VID_FREEDOM_SCIENTIFIC 0x0f4eU // Freedom Scientific -#define UHS_VID_WING_KEY_ELECTRICAL 0x0f52U // Wing Key Electrical Co., Ltd -#define UHS_VID_DONGGUAN_WHITE_HORSE_CABLE_FACTORY 0x0f53U // Dongguan White Horse Cable Factory, Ltd -#define UHS_VID_KAWAI_MUSICAL_INSTRUMENTS_MFG 0x0f54U // Kawai Musical Instruments Mfg. Co., Ltd -#define UHS_VID_AMBICOM 0x0f55U // AmbiCom, Inc. -#define UHS_VID_PRAIRIECOMM 0x0f5cU // Prairiecomm, Inc. -#define UHS_VID_NEWAGE_INTERNATIONAL 0x0f5dU // NewAge International, LLC -#define UHS_VID_KEY_TECHNOLOGY 0x0f5fU // Key Technology Corp. -#define UHS_VID_NTK 0x0f60U // NTK, Ltd -#define UHS_VID_VARIAN 0x0f61U // Varian, Inc. -#define UHS_VID_ACROX_TECHNOLOGIES 0x0f62U // Acrox Technologies Co., Ltd -#define UHS_VID_LEAPFROG_ENTERPRISES 0x0f63U // LeapFrog Enterprises -#define UHS_VID_KOBE_STEEL 0x0f68U // Kobe Steel, Ltd -#define UHS_VID_DIONEX 0x0f69U // Dionex Corp. -#define UHS_VID_VIBREN_TECHNOLOGIES 0x0f6aU // Vibren Technologies, Inc. -#define UHS_VID_INTELLIGENT_SYSTEMS 0x0f6eU // INTELLIGENT SYSTEMS -#define UHS_VID_DFI_1 0x0f73U // DFI -#define UHS_VID_GUNTERMANN_AND_DRUNCK 0x0f78U // Guntermann & Drunck GmbH -#define UHS_VID_DQ_TECHNOLOGY 0x0f7cU // DQ Technology, Inc. -#define UHS_VID_NETBOTZ 0x0f7dU // NetBotz, Inc. -#define UHS_VID_FLUKE 0x0f7eU // Fluke Corp. -#define UHS_VID_VTECH_HOLDINGS 0x0f88U // VTech Holdings, Ltd -#define UHS_VID_YAZAKI 0x0f8bU // Yazaki Corp. -#define UHS_VID_YOUNG_GENERATION_INTERNATIONAL 0x0f8cU // Young Generation International Corp. -#define UHS_VID_UNIWILL_COMPUTER 0x0f8dU // Uniwill Computer Corp. -#define UHS_VID_KINGNET_TECHNOLOGY 0x0f8eU // Kingnet Technology Co., Ltd -#define UHS_VID_SOMA_NETWORKS 0x0f8fU // Soma Networks -#define UHS_VID_CVILUX 0x0f97U // CviLux Corp. -#define UHS_VID_CYBERBANK 0x0f98U // CyberBank Corp. -#define UHS_VID_HYUN_WON 0x0f9cU // Hyun Won, Inc. -#define UHS_VID_LUCENT_TECHNOLOGIES_1 0x0f9eU // Lucent Technologies -#define UHS_VID_STARCONN_ELECTRONIC 0x0fa3U // Starconn Electronic Co., Ltd -#define UHS_VID_ATL_TECHNOLOGY 0x0fa4U // ATL Technology -#define UHS_VID_SOTEC 0x0fa5U // Sotec Co., Ltd -#define UHS_VID_EPOX_COMPUTER 0x0fa7U // Epox Computer Co., Ltd -#define UHS_VID_LOGIC_CONTROLS 0x0fa8U // Logic Controls, Inc. -#define UHS_VID_WINPOINT_ELECTRONIC 0x0fafU // Winpoint Electronic Corp. -#define UHS_VID_HAURTIAN_WIRE_AND_CABLE 0x0fb0U // Haurtian Wire & Cable Co., Ltd -#define UHS_VID_INCLOSE_DESIGN 0x0fb1U // Inclose Design, Inc. -#define UHS_VID_JUAN_CHERN_INDUSTRIAL 0x0fb2U // Juan-Chern Industrial Co., Ltd -#define UHS_VID_HEBER 0x0fb6U // Heber Ltd -#define UHS_VID_WISTRON 0x0fb8U // Wistron Corp. -#define UHS_VID_AACOM 0x0fb9U // AACom Corp. -#define UHS_VID_SAN_SHING_ELECTRONICS 0x0fbaU // San Shing Electronics Co., Ltd -#define UHS_VID_BITWISE_SYSTEMS 0x0fbbU // Bitwise Systems, Inc. -#define UHS_VID_MITAC_INTERNATINAL 0x0fc1U // Mitac Internatinal Corp. -#define UHS_VID_PLUG_AND_JACK_INDUSTRIAL 0x0fc2U // Plug and Jack Industrial, Inc. -#define UHS_VID_DELCOM_ENGINEERING 0x0fc5U // Delcom Engineering -#define UHS_VID_DATAPLUS_SUPPLIES 0x0fc6U // Dataplus Supplies, Inc. -#define UHS_VID_RESEARCH_IN_MOTION 0x0fcaU // Research In Motion, Ltd. -#define UHS_VID_SONY_ERICSSON_MOBILE_COMMUNICATIONS 0x0fceU // Sony Ericsson Mobile Communications AB -#define UHS_VID_DYNASTREAM_INNOVATIONS 0x0fcfU // Dynastream Innovations, Inc. -#define UHS_VID_TULIP_COMPUTERS_BV 0x0fd0U // Tulip Computers B.V. -#define UHS_VID_GIANT_ELECTRONICS 0x0fd1U // Giant Electronics Ltd. -#define UHS_VID_SEAC_BANCHE 0x0fd2U // Seac Banche -#define UHS_VID_TENOVIS_GMBH_AND_CO_KG 0x0fd4U // Tenovis GmbH & Co., KG -#define UHS_VID_DIRECT_ACCESS_TECHNOLOGY 0x0fd5U // Direct Access Technology, Inc. -#define UHS_VID_ELGATO_SYSTEMS 0x0fd9U // Elgato Systems GmbH -#define UHS_VID_QUANTEC_NETWORKS 0x0fdaU // Quantec Networks GmbH -#define UHS_VID_MICRO_PLUS 0x0fdcU // Micro Plus -#define UHS_VID_OREGON_SCIENTIFIC 0x0fdeU // Oregon Scientific -#define UHS_VID_OSTERHOUT_DESIGN_GROUP 0x0fe0U // Osterhout Design Group -#define UHS_VID_IN_TECH_ELECTRONICS 0x0fe4U // IN-Tech Electronics, Ltd -#define UHS_VID_GREENCONN_USA 0x0fe5U // Greenconn (U.S.A.), Inc. -#define UHS_VID_KONTRON_INDUSTRIAL_COMPUTER_SOURCE_ICS_ADVENT 0x0fe6U // Kontron (Industrial Computer Source / ICS Advent) -#define UHS_VID_DVICO 0x0fe9U // DVICO -#define UHS_VID_UNITED_COMPUTER_ACCESSORIES 0x0feaU // United Computer Accessories -#define UHS_VID_CRS_ELECTRONIC 0x0febU // CRS Electronic Co., Ltd -#define UHS_VID_UMC_ELECTRONICS 0x0fecU // UMC Electronics Co., Ltd -#define UHS_VID_ACCESS 0x0fedU // Access Co., Ltd -#define UHS_VID_XSIDO 0x0feeU // Xsido Corp. -#define UHS_VID_MJ_RESEARCH 0x0fefU // MJ Research, Inc. -#define UHS_VID_CORE_VALLEY 0x0ff6U // Core Valley Co., Ltd -#define UHS_VID_CHI_SHING_COMPUTER_ACCESSORIES 0x0ff7U // CHI SHING Computer Accessories Co., Ltd -#define UHS_VID_CLAVIA_DMI 0x0ffcU // Clavia DMI AB -#define UHS_VID_EARLYSENSE 0x0ffdU // EarlySense -#define UHS_VID_AOPEN 0x0fffU // Aopen, Inc. -#define UHS_VID_SPEED_TECH 0x1000U // Speed Tech Corp. -#define UHS_VID_RITRONICS_COMPONENTS_S_PTE 0x1001U // Ritronics Components (S) Pte., Ltd -#define UHS_VID_SIGMA 0x1003U // Sigma Corp. -#define UHS_VID_LG_ELECTRONICS 0x1004U // LG Electronics, Inc. -#define UHS_VID_APACER_TECHNOLOGY 0x1005U // Apacer Technology, Inc. -#define UHS_VID_IRIVER 0x1006U // iRiver, Ltd. -#define UHS_VID_EMUZED 0x1009U // Emuzed, Inc. -#define UHS_VID_AV_CHASEWAY 0x100aU // AV Chaseway, Ltd -#define UHS_VID_CHOU_CHIN_INDUSTRIAL 0x100bU // Chou Chin Industrial Co., Ltd -#define UHS_VID_NETOPIA 0x100dU // Netopia, Inc. -#define UHS_VID_FUKUDA_DENSHI 0x1010U // Fukuda Denshi Co., Ltd -#define UHS_VID_MOBILE_MEDIA_TECH 0x1011U // Mobile Media Tech. -#define UHS_VID_SDKM_FIBRES_WIRES_AND_CABLES_BERHAD 0x1012U // SDKM Fibres, Wires & Cables Berhad -#define UHS_VID_TST_TOUCHLESS_SENSOR_TECHNOLOGY_AG 0x1013U // TST-Touchless Sensor Technology AG -#define UHS_VID_DENSITRON_TECHNOLOGIES_PLC 0x1014U // Densitron Technologies PLC -#define UHS_VID_SOFTRONICS_PTY 0x1015U // Softronics Pty., Ltd -#define UHS_VID_XIAMEN_HUNGS_ENTERPRISE 0x1016U // Xiamen Hung's Enterprise Co., Ltd -#define UHS_VID_SPEEDY_INDUSTRIAL_SUPPLIES_PTE 0x1017U // Speedy Industrial Supplies, Pte., Ltd -#define UHS_VID_ELITEGROUP_COMPUTER_SYSTEMS_ECS 0x1019U // Elitegroup Computer Systems (ECS) -#define UHS_VID_LABTEC_1 0x1020U // Labtec -#define UHS_VID_SHINKO_SHOJI 0x1022U // Shinko Shoji Co., Ltd -#define UHS_VID_HYPER_PALTEK 0x1025U // Hyper-Paltek -#define UHS_VID_NEWLY 0x1026U // Newly Corp. -#define UHS_VID_TIME_DOMAIN 0x1027U // Time Domain -#define UHS_VID_INOVYS 0x1028U // Inovys Corp. -#define UHS_VID_ATLANTIC_COAST_TELESYS 0x1029U // Atlantic Coast Telesys -#define UHS_VID_RAMOS_TECHNOLOGY 0x102aU // Ramos Technology Co., Ltd -#define UHS_VID_INFOTRONIC_AMERICA 0x102bU // Infotronic America, Inc. -#define UHS_VID_ETOMS_ELECTRONICS 0x102cU // Etoms Electronics Corp. -#define UHS_VID_WINIC 0x102dU // Winic Corp. -#define UHS_VID_COMAX_TECHNOLOGY 0x1031U // Comax Technology, Inc. -#define UHS_VID_C_ONE_TECHNOLOGY 0x1032U // C-One Technology Corp. -#define UHS_VID_NUCAM 0x1033U // Nucam Corp. -#define UHS_VID_STEELSERIES_APS 0x1038U // SteelSeries ApS -#define UHS_VID_DEVOLO_AG 0x1039U // devolo AG -#define UHS_VID_PSA 0x103aU // PSA -#define UHS_VID_STANTON 0x103dU // Stanton -#define UHS_VID_ICREATE_TECHNOLOGIES 0x1043U // iCreate Technologies Corp. -#define UHS_VID_CHU_YUEN_ENTERPRISE 0x1044U // Chu Yuen Enterprise Co., Ltd -#define UHS_VID_WINBOND_ELECTRONICS_CORP_HEX_ 0x1046U // Winbond Electronics Corp. [hex] -#define UHS_VID_TARGUS_GROUP_INTERNATIONAL 0x1048U // Targus Group International -#define UHS_VID_MYLEX_BUSLOGIC 0x104bU // Mylex / Buslogic -#define UHS_VID_AMCO_TEC_INTERNATIONAL 0x104cU // AMCO TEC International, Inc. -#define UHS_VID_NEWPORT_CORPORATION 0x104dU // Newport Corporation -#define UHS_VID_WB_ELECTRONICS 0x104fU // WB Electronics -#define UHS_VID_YUBICOCOM 0x1050U // Yubico.com -#define UHS_VID_IMMANUEL_ELECTRONICS 0x1053U // Immanuel Electronics Co., Ltd -#define UHS_VID_BMS_INTERNATIONAL_BEHEER_NV 0x1054U // BMS International Beheer N.V. -#define UHS_VID_COMPLEX_MICRO_INTERCONNECTION 0x1055U // Complex Micro Interconnection Co., Ltd -#define UHS_VID_HSIN_CHEN_ENT 0x1056U // Hsin Chen Ent Co., Ltd -#define UHS_VID_ON_SEMICONDUCTOR 0x1057U // ON Semiconductor -#define UHS_VID_WESTERN_DIGITAL_TECHNOLOGIES 0x1058U // Western Digital Technologies, Inc. -#define UHS_VID_GIESECKE_AND_DEVRIENT 0x1059U // Giesecke & Devrient GmbH -#define UHS_VID_FOXCONN_INTERNATIONAL 0x105bU // Foxconn International, Inc. -#define UHS_VID_HONG_JI_ELECTRIC_WIRE_AND_CABLE_DONGGUAN 0x105cU // Hong Ji Electric Wire & Cable (Dongguan) Co., Ltd -#define UHS_VID_DELKIN_DEVICES 0x105dU // Delkin Devices, Inc. -#define UHS_VID_VALENCE_SEMICONDUCTOR_DESIGN 0x105eU // Valence Semiconductor Design, Ltd -#define UHS_VID_CHIN_SHONG_ENTERPRISE 0x105fU // Chin Shong Enterprise Co., Ltd -#define UHS_VID_EASTHOME_INDUSTRIAL 0x1060U // Easthome Industrial Co., Ltd -#define UHS_VID_MOTOROLA_ELECTRONICS_TAIWAN_LTD_HEX_ 0x1063U // Motorola Electronics Taiwan, Ltd [hex] -#define UHS_VID_CCYU_TECHNOLOGY 0x1065U // CCYU Technology -#define UHS_VID_LOYAL_LEGEND 0x106aU // Loyal Legend, Ltd -#define UHS_VID_CURITEL_COMMUNICATIONS 0x106cU // Curitel Communications, Inc. -#define UHS_VID_SAN_CHIEH_MANUFACTURING 0x106dU // San Chieh Manufacturing, Ltd -#define UHS_VID_CONECTL 0x106eU // ConectL -#define UHS_VID_MONEY_CONTROLS 0x106fU // Money Controls -#define UHS_VID_GCT_SEMICONDUCTOR 0x1076U // GCT Semiconductor, Inc. -#define UHS_VID_GATEWAY_1 0x107bU // Gateway, Inc. -#define UHS_VID_ARLEC_AUSTRALIA 0x107dU // Arlec Australia, Ltd -#define UHS_VID_MIDORIYA_ELECTRIC 0x107eU // Midoriya Electric Co., Ltd -#define UHS_VID_KIDZMOUSE 0x107fU // KidzMouse, Inc. -#define UHS_VID_SHIN_ETSUKAKEN 0x1082U // Shin-Etsukaken Co., Ltd -#define UHS_VID_CANON_ELECTRONICS 0x1083U // Canon Electronics, Inc. -#define UHS_VID_PANTECH 0x1084U // Pantech Co., Ltd -#define UHS_VID_CHLORIDE_POWER_PROTECTION 0x108aU // Chloride Power Protection -#define UHS_VID_GRAND_TEK_TECHNOLOGY 0x108bU // Grand-tek Technology Co., Ltd -#define UHS_VID_ROBERT_BOSCH 0x108cU // Robert Bosch GmbH -#define UHS_VID_LOTES 0x108eU // Lotes Co., Ltd. -#define UHS_VID_SURFACE_OPTICS 0x1099U // Surface Optics Corp. -#define UHS_VID_DATASOFT_SYSTEMS 0x109aU // DATASOFT Systems GmbH -#define UHS_VID_HISENSE 0x109bU // Hisense -#define UHS_VID_ESOL 0x109fU // eSOL Co., Ltd -#define UHS_VID_HIROTECH 0x10a0U // Hirotech, Inc. -#define UHS_VID_MITSUBISHI_MATERIALS 0x10a3U // Mitsubishi Materials Corp. -#define UHS_VID_SK_TELETECH 0x10a9U // SK Teletech Co., Ltd -#define UHS_VID_CABLES_TO_GO 0x10aaU // Cables To Go -#define UHS_VID_USI 0x10abU // USI Co., Ltd -#define UHS_VID_HONEYWELL 0x10acU // Honeywell, Inc. -#define UHS_VID_PRINCETON_TECHNOLOGY 0x10aeU // Princeton Technology Corp. -#define UHS_VID_LIEBERT 0x10afU // Liebert Corp. -#define UHS_VID_COMODO_PLX_UNKNOWN 0x10b5U // Comodo (PLX?) -#define UHS_VID_DIBCOM 0x10b8U // DiBcom -#define UHS_VID_TM_TECHNOLOGY 0x10bbU // TM Technology, Inc. -#define UHS_VID_DINGING_TECHNOLOGY 0x10bcU // Dinging Technology Co., Ltd -#define UHS_VID_TMT_TECHNOLOGY 0x10bdU // TMT Technology, Inc. -#define UHS_VID_SMARTHOME 0x10bfU // SmartHome -#define UHS_VID_UNIVERSAL_LASER_SYSTEMS 0x10c3U // Universal Laser Systems, Inc. -#define UHS_VID_CYGNAL_INTEGRATED_PRODUCTS 0x10c4U // Cygnal Integrated Products, Inc. -#define UHS_VID_SANEI_ELECTRIC 0x10c5U // Sanei Electric, Inc. -#define UHS_VID_INTEC 0x10c6U // Intec, Inc. -#define UHS_VID_ERATECH 0x10cbU // Eratech -#define UHS_VID_GBM_CONNECTOR 0x10ccU // GBM Connector Co., Ltd -#define UHS_VID_KYCON 0x10cdU // Kycon, Inc. -#define UHS_VID_SILICON_LABS 0x10ceU // Silicon Labs -#define UHS_VID_VELLEMAN_COMPONENTS 0x10cfU // Velleman Components, Inc. -#define UHS_VID_HOTTINGER_BALDWIN_MEASUREMENT 0x10d1U // Hottinger Baldwin Measurement -#define UHS_VID_RAYCOMPOSER__R_ADAMS 0x10d2U // RayComposer - R. Adams -#define UHS_VID_MAN_BOON_MANUFACTORY 0x10d4U // Man Boon Manufactory, Ltd -#define UHS_VID_UNI_CLASS_TECHNOLOGY 0x10d5U // Uni Class Technology Co., Ltd -#define UHS_VID_ACTIONS_SEMICONDUCTOR 0x10d6U // Actions Semiconductor Co., Ltd -#define UHS_VID_AUTHENEX 0x10deU // Authenex, Inc. -#define UHS_VID_IN_WIN_DEVELOPMENT 0x10dfU // In-Win Development, Inc. -#define UHS_VID_POST_OP_VIDEO 0x10e0U // Post-Op Video, Inc. -#define UHS_VID_CABLEPLUS 0x10e1U // CablePlus, Ltd -#define UHS_VID_NADA_ELECTRONICS 0x10e2U // Nada Electronics, Ltd -#define UHS_VID_VAST_TECHNOLOGIES 0x10ecU // Vast Technologies, Inc. -#define UHS_VID_NEXIO 0x10f0U // Nexio Co., Ltd -#define UHS_VID_IMPORTEK 0x10f1U // Importek -#define UHS_VID_TURTLE_BEACH 0x10f5U // Turtle Beach -#define UHS_VID_PICTOS_TECHNOLOGIES 0x10fbU // Pictos Technologies, Inc. -#define UHS_VID_ANUBIS_ELECTRONICS 0x10fdU // Anubis Electronics, Ltd -#define UHS_VID_THRANE_AND_THRANE 0x10feU // Thrane & Thrane -#define UHS_VID_VIRTOUCH 0x1100U // VirTouch, Ltd -#define UHS_VID_EASYPASS_INDUSTRIAL 0x1101U // EasyPass Industrial Co., Ltd -#define UHS_VID_BRIGHTCOM_TECHNOLOGIES 0x1108U // Brightcom Technologies, Ltd -#define UHS_VID_MOXA_TECHNOLOGIES 0x110aU // Moxa Technologies Co., Ltd. -#define UHS_VID_ANALOG_DEVICES_CANADA_LTD_ALLIED_TELESYN 0x1110U // Analog Devices Canada, Ltd (Allied Telesyn) -#define UHS_VID_PANDORA_INTERNATIONAL 0x1111U // Pandora International Ltd. -#define UHS_VID_YM_ELECTRIC 0x1112U // YM ELECTRIC CO., Ltd -#define UHS_VID_MEDION_AG 0x1113U // Medion AG -#define UHS_VID_VSO_ELECTRIC 0x111eU // VSO Electric Co., Ltd -#define UHS_VID_REDRAT 0x112aU // RedRat -#define UHS_VID_MASTER_HILL_ELECTRIC_WIRE_AND_CABLE 0x112eU // Master Hill Electric Wire and Cable Co., Ltd -#define UHS_VID_CELLON_INTERNATIONAL 0x112fU // Cellon International, Inc. -#define UHS_VID_TENX_TECHNOLOGY 0x1130U // Tenx Technology, Inc. -#define UHS_VID_INTEGRATED_SYSTEM_SOLUTION 0x1131U // Integrated System Solution Corp. -#define UHS_VID_TOSHIBA_CORP_DIGITAL_MEDIA_EQUIPMENT_HEX_ 0x1132U // Toshiba Corp., Digital Media Equipment [hex] -#define UHS_VID_CTS_ELECTRONINCS 0x1136U // CTS Electronincs -#define UHS_VID_ARIN_TECH 0x113cU // Arin Tech Co., Ltd -#define UHS_VID_MAPOWER_ELECTRONICS 0x113dU // Mapower Electronics Co., Ltd -#define UHS_VID_V_ONE_MULTIMEDIA_PTE 0x1141U // V One Multimedia, Pte., Ltd -#define UHS_VID_CYBERSCAN_TECHNOLOGIES 0x1142U // CyberScan Technologies, Inc. -#define UHS_VID_JAPAN_RADIO_COMPANY 0x1145U // Japan Radio Company -#define UHS_VID_SHIMANE_SANYO_ELECTRIC 0x1146U // Shimane SANYO Electric Co., Ltd. -#define UHS_VID_EVER_GREAT_ELECTRIC_WIRE_AND_CABLE 0x1147U // Ever Great Electric Wire and Cable Co., Ltd -#define UHS_VID_SPHAIRON_ACCESS_SYSTEMS 0x114bU // Sphairon Access Systems GmbH -#define UHS_VID_TINIUS_OLSEN_TESTING_MACHINE 0x114cU // Tinius Olsen Testing Machine Co., Inc. -#define UHS_VID_ALPHA_IMAGING_TECHNOLOGY 0x114dU // Alpha Imaging Technology Corp. -#define UHS_VID_WAVECOM 0x114fU // Wavecom -#define UHS_VID_SALIX_TECHNOLOGY 0x115bU // Salix Technology Co., Ltd. -#define UHS_VID_SECUGEN 0x1162U // Secugen Corp. -#define UHS_VID_DELORME_PUBLISHING 0x1163U // DeLorme Publishing, Inc. -#define UHS_VID_YUAN_HIGH_TECH_DEVELOPMENT 0x1164U // YUAN High-Tech Development Co., Ltd -#define UHS_VID_TELSON_ELECTRONICS 0x1165U // Telson Electronics Co., Ltd -#define UHS_VID_BANTAM_INTERACTIVE_TECHNOLOGIES 0x1166U // Bantam Interactive Technologies -#define UHS_VID_SALIENT_SYSTEMS 0x1167U // Salient Systems Corp. -#define UHS_VID_BIZCONN_INTERNATIONAL 0x1168U // BizConn International Corp. -#define UHS_VID_GIGASTORAGE 0x116eU // Gigastorage Corp. -#define UHS_VID_SILICON_10_TECHNOLOGY 0x116fU // Silicon 10 Technology Corp. -#define UHS_VID_SHENGYIH_STEEL_MOLD 0x1175U // Shengyih Steel Mold Co., Ltd -#define UHS_VID_SANTA_ELECTRONIC 0x117dU // Santa Electronic, Inc. -#define UHS_VID_JNC 0x117eU // JNC, Inc. -#define UHS_VID_VENTURE 0x1182U // Venture Corp., Ltd -#define UHS_VID_COMPAQ_COMPUTER_CORP_HEX_DIGITAL_DREAM_UNKNOWN 0x1183U // Compaq Computer Corp. [hex] (Digital Dream ?) -#define UHS_VID_KYOCERA_ELCO 0x1184U // Kyocera Elco Corp. -#define UHS_VID_BLOOMBERG_LP 0x1188U // Bloomberg L.P. -#define UHS_VID_ACER_COMMUNICATIONS_AND_MULTIMEDIA 0x1189U // Acer Communications & Multimedia -#define UHS_VID_YOU_YANG_TECHNOLOGY 0x118fU // You Yang Technology Co., Ltd -#define UHS_VID_TRIPACE 0x1190U // Tripace -#define UHS_VID_LOYALTY_FOUNDER_ENTERPRISE 0x1191U // Loyalty Founder Enterprise Co., Ltd -#define UHS_VID_YANKEE_ROBOTICS 0x1196U // Yankee Robotics, LLC -#define UHS_VID_TECHNOIMAGIA 0x1197U // Technoimagia Co., Ltd -#define UHS_VID_STARSHINE_TECHNOLOGY 0x1198U // StarShine Technology Corp. -#define UHS_VID_SIERRA_WIRELESS 0x1199U // Sierra Wireless, Inc. -#define UHS_VID_ZHAN_QI_TECHNOLOGY 0x119aU // ZHAN QI Technology Co., Ltd -#define UHS_VID_RUWIDO_AUSTRIA 0x119bU // ruwido austria GmbH -#define UHS_VID_CHIPCON_AS 0x11a0U // Chipcon AS -#define UHS_VID_TECHNOVAS 0x11a3U // Technovas Co., Ltd -#define UHS_VID_GLOBALMEDIA_GROUP 0x11aaU // GlobalMedia Group, LLC -#define UHS_VID_EXITO_ELECTRONICS 0x11abU // Exito Electronics Co., Ltd -#define UHS_VID_NIKE 0x11acU // Nike -#define UHS_VID_ATECH_FLASH_TECHNOLOGY 0x11b0U // ATECH FLASH TECHNOLOGY -#define UHS_VID_RANDD_INTERNATIONAL_NV 0x11beU // R&D International NV -#define UHS_VID_INMAX 0x11c5U // Inmax -#define UHS_VID_VERIFONE 0x11caU // VeriFone Inc -#define UHS_VID_TOPFIELD 0x11dbU // Topfield Co., Ltd. -#define UHS_VID_KI_TECHNOLOGY 0x11e6U // K.I. Technology Co. Ltd. -#define UHS_VID_SIEMENS_AG_1 0x11f5U // Siemens AG -#define UHS_VID_PROLIFIC 0x11f6U // Prolific -#define UHS_VID_ALCATEL_UNKNOWN 0x11f7U // Alcatel (?) -#define UHS_VID_TSC_AUTO_ID_TECHNOLOGY 0x1203U // TSC Auto ID Technology Co., Ltd -#define UHS_VID_INTERBIOMETRICS 0x1209U // InterBiometrics -#define UHS_VID_HUDSON_SOFT 0x120eU // Hudson Soft Co., Ltd -#define UHS_VID_MAGELLAN 0x120fU // Magellan -#define UHS_VID_DIGITECH 0x1210U // DigiTech -#define UHS_VID_JUNGSOFT 0x121eU // Jungsoft Co., Ltd -#define UHS_VID_UNKNOWN_MANUFACTURER_1 0x1221U // Unknown manufacturer -#define UHS_VID_SKYCABLE_ENTERPRISE 0x1223U // SKYCABLE ENTERPRISE. CO., LTD. -#define UHS_VID_DATAPAQ_LIMITED 0x1228U // Datapaq Limited -#define UHS_VID_CHIPIDEA_MICROELECTRONICA 0x1230U // Chipidea-Microelectronica, S.A. -#define UHS_VID_DENVER_ELECTRONICS 0x1233U // Denver Electronics -#define UHS_VID_BRAIN_ACTUATED_TECHNOLOGIES 0x1234U // Brain Actuated Technologies -#define UHS_VID_FOCUSRITE_NOVATION 0x1235U // Focusrite-Novation -#define UHS_VID_BELKIN 0x1241U // Belkin -#define UHS_VID_AIRVAST 0x124aU // AirVast -#define UHS_VID_NYKO_HONEY_BEE 0x124bU // Nyko (Honey Bee) -#define UHS_VID_MXI__MEMORY_EXPERTS_INTERNATIONAL 0x124cU // MXI - Memory Experts International, Inc. -#define UHS_VID_APOGEE 0x125cU // Apogee Inc. -#define UHS_VID_A_DATA_TECHNOLOGY 0x125fU // A-DATA Technology Co., Ltd. -#define UHS_VID_STANDARD_MICROSYSTEMS_3 0x1260U // Standard Microsystems Corp. -#define UHS_VID_COVIDIEN_ENERGY_BASED_DEVICES 0x1264U // Covidien Energy-based Devices -#define UHS_VID_PIRELLI_BROADBAND_SOLUTIONS 0x1266U // Pirelli Broadband Solutions -#define UHS_VID_LOGIC3_SPECTRAVIDEO_PLC 0x1267U // Logic3 / SpectraVideo plc -#define UHS_VID_ARISTOCRAT_TECHNOLOGIES 0x126cU // Aristocrat Technologies -#define UHS_VID_BEL_STEWART 0x126dU // Bel Stewart -#define UHS_VID_STROBE_DATA 0x126eU // Strobe Data, Inc. -#define UHS_VID_TWINMOS 0x126fU // TwinMOS -#define UHS_VID_ENSONIQ 0x1274U // Ensoniq -#define UHS_VID_XAXERO_MARINE_SOFTWARE_ENGINEERING 0x1275U // Xaxero Marine Software Engineering, Ltd. -#define UHS_VID_STARLIGHT_XPRESS 0x1278U // Starlight Xpress -#define UHS_VID_ZEBRIS_MEDICAL 0x1283U // zebris Medical GmbH -#define UHS_VID_MARVELL_SEMICONDUCTOR 0x1286U // Marvell Semiconductor, Inc. -#define UHS_VID_QUALCOMM_FLARION_TECHNOLOGIES_INC_LEADTEK_RESEARCH 0x1291U // Qualcomm Flarion Technologies, Inc. / Leadtek Research, Inc. -#define UHS_VID_INNOMEDIA_1 0x1292U // Innomedia -#define UHS_VID_BELKIN_COMPONENTS_HEX_ 0x1293U // Belkin Components [hex] -#define UHS_VID_RISO_KAGAKU 0x1294U // RISO KAGAKU CORP. -#define UHS_VID_CYBERTAN_TECHNOLOGY 0x129bU // CyberTAN Technology -#define UHS_VID_TRENDCHIP_TECHNOLOGIES 0x12a7U // Trendchip Technologies Corp. -#define UHS_VID_HONEY_BEE_ELECTRONIC_INTERNATIONAL 0x12abU // Honey Bee Electronic International Ltd. -#define UHS_VID_ZHEJIANG_XINYA_ELECTRONIC_TECHNOLOGY 0x12b8U // Zhejiang Xinya Electronic Technology Co., Ltd. -#define UHS_VID_E28 0x12b9U // E28 -#define UHS_VID_LICENSED_BY_SONY_COMPUTER_ENTERTAINMENT_AMERICA 0x12baU // Licensed by Sony Computer Entertainment America -#define UHS_VID_GEMBIRD 0x12bdU // Gembird -#define UHS_VID_AUTOCUE_GROUP 0x12c4U // Autocue Group Ltd -#define UHS_VID_DEXIN_1 0x12cfU // DEXIN -#define UHS_VID_HUAWEI_TECHNOLOGIES 0x12d1U // Huawei Technologies Co., Ltd. -#define UHS_VID_LINE_TECH_INDUSTRIAL 0x12d2U // LINE TECH INDUSTRIAL CO., LTD. -#define UHS_VID_EMS_DR_THOMAS_WUENSCHE 0x12d6U // EMS Dr. Thomas Wuensche -#define UHS_VID_BETTER_WIRE_FACTORY 0x12d7U // BETTER WIRE FACTORY CO., LTD. -#define UHS_VID_ARANEUS_INFORMATION_SYSTEMS_OY 0x12d8U // Araneus Information Systems Oy -#define UHS_VID_WALDORF_MUSIC 0x12e6U // Waldorf Music GmbH -#define UHS_VID_TAPWAVE 0x12efU // Tapwave, Inc. -#define UHS_VID_DYNAMIC_SYSTEM_ELECTRONICS 0x12f5U // Dynamic System Electronics Corp. -#define UHS_VID_MEMOREX_PRODUCTS 0x12f7U // Memorex Products, Inc. -#define UHS_VID_AIN_COMM_TECHNOLOGY 0x12fdU // AIN Comm. Technology Co., Ltd -#define UHS_VID_FASCINATING_ELECTRONICS 0x12ffU // Fascinating Electronics, Inc. -#define UHS_VID_TRANSCEND_INFORMATION 0x1307U // Transcend Information, Inc. -#define UHS_VID_SHUTTLE_1 0x1308U // Shuttle, Inc. -#define UHS_VID_ROPER 0x1310U // Roper -#define UHS_VID_ICS_ELECTRONICS 0x1312U // ICS Electronics -#define UHS_VID_THORLABS 0x1313U // ThorLabs -#define UHS_VID_NATURAL_POINT 0x131dU // Natural Point -#define UHS_VID_ENVARA 0x132aU // Envara Inc. -#define UHS_VID_KONICA_MINOLTA 0x132bU // Konica Minolta -#define UHS_VID_KEMPER_DIGITAL 0x133eU // Kemper Digital GmbH -#define UHS_VID_MOBILITY 0x1342U // Mobility -#define UHS_VID_CITIZEN_SYSTEMS 0x1343U // Citizen Systems -#define UHS_VID_SINO_LITE_TECHNOLOGY 0x1345U // Sino Lite Technology Corp. -#define UHS_VID_MORAVIAN_INSTRUMENTS 0x1347U // Moravian Instruments -#define UHS_VID_KATSURAGAWA_ELECTRIC 0x1348U // Katsuragawa Electric Co., Ltd. -#define UHS_VID_PANJIT_INTERNATIONAL 0x134cU // PanJit International Inc. -#define UHS_VID_DIGBYS_BITPILE_INC_DBA_D_BIT 0x134eU // Digby's Bitpile, Inc. DBA D Bit -#define UHS_VID_PANDE_MICROCOMPUTER_SYSTEMS 0x1357U // P&E Microcomputer Systems -#define UHS_VID_CONTROL_DEVELOPMENT 0x135fU // Control Development Inc. -#define UHS_VID_SEGGER 0x1366U // SEGGER -#define UHS_VID_STEC 0x136bU // STEC -#define UHS_VID_ANDOR_TECHNOLOGY 0x136eU // Andor Technology Ltd. -#define UHS_VID_SWISSBIT 0x1370U // Swissbit -#define UHS_VID_CNET_TECHNOLOGY 0x1371U // CNet Technology Inc. -#define UHS_VID_VIMTRON_ELECTRONICS 0x1376U // Vimtron Electronics Co., Ltd. -#define UHS_VID_SCAPS 0x137bU // SCAPS GmbH -#define UHS_VID_NETGEAR_2 0x1385U // Netgear, Inc -#define UHS_VID_VALIDITY_SENSORS 0x138aU // Validity Sensors, Inc. -#define UHS_VID_JUNGO 0x138eU // Jungo LTD -#define UHS_VID_TOMTOM_BV 0x1390U // TOMTOM B.V. -#define UHS_VID_IDEALTEK 0x1391U // IdealTEK, Inc. -#define UHS_VID_SENNHEISER_COMMUNICATIONS 0x1395U // Sennheiser Communications -#define UHS_VID_BEHRINGER_INTERNATIONAL 0x1397U // BEHRINGER International GmbH -#define UHS_VID_Q_TEC 0x1398U // Q-tec -#define UHS_VID_BALTECH 0x13adU // Baltech -#define UHS_VID_PERKINELMER_OPTOELECTRONICS 0x13b0U // PerkinElmer Optoelectronics -#define UHS_VID_LINKSYS_2 0x13b1U // Linksys -#define UHS_VID_ALESIS 0x13b2U // Alesis -#define UHS_VID_NIPPON_DICS 0x13b3U // Nippon Dics Co., Ltd. -#define UHS_VID_PCPLAY 0x13baU // PCPlay -#define UHS_VID_RICOH_PRINTING_SYSTEMS 0x13beU // Ricoh Printing Systems, Ltd. -#define UHS_VID_JYETAI_PRECISION_INDUSTRIAL 0x13caU // JyeTai Precision Industrial Co., Ltd. -#define UHS_VID_WISAIR 0x13cfU // Wisair Ltd. -#define UHS_VID_TECHSAN_ELECTRONICS 0x13d0U // Techsan Electronics Co., Ltd. -#define UHS_VID_A_MAX_TECHNOLOGY_MACAO_COMMERCIAL_OFFSHORE 0x13d1U // A-Max Technology Macao Commercial Offshore Co. Ltd. -#define UHS_VID_SHARK_MULTIMEDIA_1 0x13d2U // Shark Multimedia -#define UHS_VID_IMC_NETWORKS 0x13d3U // IMC Networks -#define UHS_VID_GUIDANCE_SOFTWARE 0x13d7U // Guidance Software, Inc. -#define UHS_VID_ALEREON 0x13dcU // ALEREON, INC. -#define UHS_VID_ITECH_DYNAMIC_LIMITED 0x13ddU // i.Tech Dynamic Limited -#define UHS_VID_KAIBO_WIRE_AND_CABLE_SHENZHEN 0x13e1U // Kaibo Wire & Cable (Shenzhen) Co., Ltd. -#define UHS_VID_RANE 0x13e5U // Rane -#define UHS_VID_TECHNOSCOPE 0x13e6U // TechnoScope Co., Ltd. -#define UHS_VID_HENGSTLER 0x13eaU // Hengstler -#define UHS_VID_ZYDACRON 0x13ecU // Zydacron -#define UHS_VID_MOSART 0x13eeU // MosArt -#define UHS_VID_INITIO_CORPORATION 0x13fdU // Initio Corporation -#define UHS_VID_KINGSTON_TECHNOLOGY_COMPANY_1 0x13feU // Kingston Technology Company Inc. -#define UHS_VID_AXXION_GROUP 0x1400U // Axxion Group Corp. -#define UHS_VID_BOWE_BELL_AND_HOWELL 0x1402U // Bowe Bell & Howell -#define UHS_VID_SITRONIX 0x1403U // Sitronix -#define UHS_VID_IDS_IMAGING_DEVELOPMENT_SYSTEMS 0x1409U // IDS Imaging Development Systems GmbH -#define UHS_VID_TELECHIPS 0x140eU // Telechips, Inc. -#define UHS_VID_NOVATEL_WIRELESS_1 0x1410U // Novatel Wireless -#define UHS_VID_NAM_TAI_EANDE_PRODUCTS_LTD_OR_OMNIVISION_TECHNOLOGIES 0x1415U // Nam Tai E&E Products Ltd. or OmniVision Technologies, Inc. -#define UHS_VID_ABILITY_ENTERPRISE 0x1419U // ABILITY ENTERPRISE CO., LTD. -#define UHS_VID_SENSOR_TECHNOLOGY 0x1421U // Sensor Technology -#define UHS_VID_VEGA_TECHNOLOGIES_INDUSTRIAL_AUSTRIA 0x1429U // Vega Technologies Industrial (Austria) Co. -#define UHS_VID_THALES_E_TRANSACTIONS 0x142aU // Thales E-Transactions -#define UHS_VID_ARBITER_SYSTEMS 0x142bU // Arbiter Systems, Inc. -#define UHS_VID_REDOCTANE 0x1430U // RedOctane -#define UHS_VID_PERTECH_RESOURCES 0x1431U // Pertech Resources, Inc. -#define UHS_VID_WISTRON_NEWEB 0x1435U // Wistron NeWeb -#define UHS_VID_DENALI_SOFTWARE 0x1436U // Denali Software, Inc. -#define UHS_VID_ALTEK_CORPORATION 0x143cU // Altek Corporation -#define UHS_VID_DIGILENT 0x1443U // Digilent -#define UHS_VID_XJGROUP 0x1446U // X.J.GROUP -#define UHS_VID_RADIO_SHACK 0x1453U // Radio Shack -#define UHS_VID_EXTENDING_WIRE_AND_CABLE 0x1456U // Extending Wire & Cable Co., Ltd. -#define UHS_VID_FIRST_INTERNATIONAL_COMPUTER_1 0x1457U // First International Computer, Inc. -#define UHS_VID_TRUST 0x145fU // Trust -#define UHS_VID_TATUNG 0x1460U // Tatung Co. -#define UHS_VID_STACCATO_COMMUNICATIONS 0x1461U // Staccato Communications -#define UHS_VID_MICRO_STAR_INTERNATIONAL_1 0x1462U // Micro Star International -#define UHS_VID_HUAWEI_3COM 0x1472U // Huawei-3Com -#define UHS_VID_FORMOSA_INDUSTRIAL_COMPUTING 0x147aU // Formosa Industrial Computing, Inc. -#define UHS_VID_UPEK 0x147eU // Upek -#define UHS_VID_HAMA_GMBH_AND_CO_KG 0x147fU // Hama GmbH & Co., KG -#define UHS_VID_VAILLANT 0x1482U // Vaillant -#define UHS_VID_ELSA_AG_HEX_ 0x1484U // Elsa AG [hex] -#define UHS_VID_SILICOM_1 0x1485U // Silicom -#define UHS_VID_DSP_GROUP 0x1487U // DSP Group, Ltd. -#define UHS_VID_EVATRONIX 0x148eU // EVATRONIX SA -#define UHS_VID_RALINK_TECHNOLOGY 0x148fU // Ralink Technology, Corp. -#define UHS_VID_FUTRONIC_TECHNOLOGY 0x1491U // Futronic Technology Co. Ltd. -#define UHS_VID_SUUNTO 0x1493U // Suunto -#define UHS_VID_PANSTRONG_COMPANY 0x1497U // Panstrong Company Ltd. -#define UHS_VID_MICROTEK_INTERNATIONAL_1 0x1498U // Microtek International Inc. -#define UHS_VID_IMAGINATION_TECHNOLOGIES 0x149aU // Imagination Technologies -#define UHS_VID_WIDEVIEW_TECHNOLOGY 0x14aaU // WideView Technology Inc. -#define UHS_VID_CTK_CORPORATION 0x14adU // CTK Corporation -#define UHS_VID_PRINTRONIX 0x14aeU // Printronix Inc. -#define UHS_VID_ATP_ELECTRONICS 0x14afU // ATP Electronics Inc. -#define UHS_VID_STARTECHCOM 0x14b0U // StarTech.com Ltd. -#define UHS_VID_RALINK_TECHNOLOGY_1 0x14b2U // Ralink Technology, Corp. -#define UHS_VID_ROCKWELL_AUTOMATION 0x14c0U // Rockwell Automation, Inc. -#define UHS_VID_GEMLIGHT_COMPUTER 0x14c2U // Gemlight Computer, Ltd -#define UHS_VID_ZYTRONIC 0x14c8U // Zytronic -#define UHS_VID_SUPER_TOP 0x14cdU // Super Top -#define UHS_VID_JAMER_INDUSTRIES 0x14d8U // JAMER INDUSTRIES CO., LTD. -#define UHS_VID_RARITAN_COMPUTER 0x14ddU // Raritan Computer, Inc. -#define UHS_VID_WINRADIO_COMMUNICATIONS 0x14e0U // WiNRADiO Communications -#define UHS_VID_DIALOGUE_TECHNOLOGY 0x14e1U // Dialogue Technology Corp. -#define UHS_VID_SAIN_INFORMATION_AND_COMMUNICATIONS 0x14e5U // SAIN Information & Communications Co., Ltd. -#define UHS_VID_PLANEX_COMMUNICATIONS_1 0x14eaU // Planex Communications -#define UHS_VID_SHURE 0x14edU // Shure Inc. -#define UHS_VID_TECHNISAT_DIGITAL 0x14f7U // TechniSat Digital GmbH -#define UHS_VID_ELLISYS_1 0x1500U // Ellisys -#define UHS_VID_PINE_TUM_ENTERPRISE 0x1501U // Pine-Tum Enterprise Co., Ltd. -#define UHS_VID_FIRST_INTERNATIONAL_COMPUTER_2 0x1509U // First International Computer, Inc. -#define UHS_VID_MEDMOBILE 0x1513U // medMobile -#define UHS_VID_ACTEL 0x1514U // Actel -#define UHS_VID_COMPUSA 0x1516U // CompUSA -#define UHS_VID_CHESHIRE_ENGINEERING 0x1518U // Cheshire Engineering Corp. -#define UHS_VID_COMNEON 0x1519U // Comneon -#define UHS_VID_BITWIRE 0x1520U // Bitwire Corp. -#define UHS_VID_ENE_TECHNOLOGY_1 0x1524U // ENE Technology Inc -#define UHS_VID_SILICON_PORTALS 0x1527U // Silicon Portals -#define UHS_VID_UBIQUAM 0x1529U // UBIQUAM Co., Ltd. -#define UHS_VID_THESYCON_SYSTEMSOFTWARE_AND_CONSULTING 0x152aU // Thesycon Systemsoftware & Consulting GmbH -#define UHS_VID_MIR_SRL 0x152bU // MIR Srl -#define UHS_VID_JMICRON_TECHNOLOGY_CORP_JMICRON_USA_TECHNOLOGY 0x152dU // JMicron Technology Corp. / JMicron USA Technology Corp. -#define UHS_VID_LG_HLDS 0x152eU // LG (HLDS) -#define UHS_VID_RAZER_USA 0x1532U // Razer USA, Ltd -#define UHS_VID_TERRATEC_ELECTRONIC_1 0x153bU // TerraTec Electronic GmbH -#define UHS_VID_U_BLOX_AG 0x1546U // U-Blox AG -#define UHS_VID_SG_INTEC_LTD_AND_CO_KG 0x1547U // SG Intec Ltd & Co KG -#define UHS_VID_CELECTRONIC 0x154aU // Celectronic GmbH -#define UHS_VID_PNY 0x154bU // PNY -#define UHS_VID_CONNECTCOUNTY_HOLDINGS_BERHAD 0x154dU // ConnectCounty Holdings Berhad -#define UHS_VID_DANDM_HOLDINGS_INC_DENONMARANTZ 0x154eU // D&M Holdings, Inc. (Denon/Marantz) -#define UHS_VID_SNBC 0x154fU // SNBC CO., Ltd -#define UHS_VID_PROLINK_MICROSYSTEMS 0x1554U // Prolink Microsystems Corp. -#define UHS_VID_OQO 0x1557U // OQO -#define UHS_VID_SUNF_PU_TECHNOLOGY 0x1568U // Sunf Pu Technology Co., Ltd -#define UHS_VID_QUANTUM_CORPORATION 0x156fU // Quantum Corporation -#define UHS_VID_ALLTOP_TECHNOLOGY 0x1570U // ALLTOP TECHNOLOGY CO., LTD. -#define UHS_VID_KETRON_SRL 0x157bU // Ketron SRL -#define UHS_VID_TRENDNET 0x157eU // TRENDnet -#define UHS_VID_FIBERLINE 0x1582U // Fiberline -#define UHS_VID_SMA_TECHNOLOGIE_AG 0x1587U // SMA Technologie AG -#define UHS_VID_OAKLEY 0x158dU // Oakley Inc. -#define UHS_VID_JDS_UNIPHASE_CORPORATION_JDSU 0x158eU // JDS Uniphase Corporation (JDSU) -#define UHS_VID_KUNSHAN_GUOJI_ELECTRONICS 0x1598U // Kunshan Guoji Electronics Co., Ltd. -#define UHS_VID_FREESCALE_SEMICONDUCTOR 0x15a2U // Freescale Semiconductor, Inc. -#define UHS_VID_AFATECH_TECHNOLOGIES 0x15a4U // Afatech Technologies, Inc. -#define UHS_VID_TEAMS_POWER_LIMITED 0x15a8U // Teams Power Limited -#define UHS_VID_GEMTEK 0x15a9U // Gemtek -#define UHS_VID_GEARWAY_ELECTRONICS_DONG_GUAN 0x15aaU // Gearway Electronics (Dong Guan) Co., Ltd. -#define UHS_VID_VMWARE_1 0x15adU // VMware Inc. -#define UHS_VID_OLIMEX 0x15baU // Olimex Ltd. -#define UHS_VID_XL_IMAGING 0x15c0U // XL Imaging -#define UHS_VID_SOUNDGRAPH 0x15c2U // SoundGraph Inc. -#define UHS_VID_ADVANCE_MULTIMEDIA_INTERNET_TECHNOLOGY_INC_AMIT 0x15c5U // Advance Multimedia Internet Technology Inc. (AMIT) -#define UHS_VID_LABORATOIRES_MXM 0x15c6U // Laboratoires MXM -#define UHS_VID_KTF_TECHNOLOGIES 0x15c8U // KTF Technologies -#define UHS_VID_D_BOX_TECHNOLOGIES 0x15c9U // D-Box Technologies -#define UHS_VID_TEXTECH_INTERNATIONAL 0x15caU // Textech International Ltd. -#define UHS_VID_COULOMB_ELECTRONICS 0x15d5U // Coulomb Electronics Ltd. -#define UHS_VID_TRUST_INTERNATIONAL_BV_1 0x15d9U // Trust International B.V. -#define UHS_VID_HYNIX_SEMICONDUCTOR 0x15dcU // Hynix Semiconductor Inc. -#define UHS_VID_SEONG_JI_INDUSTRIAL 0x15e0U // Seong Ji Industrial Co., Ltd. -#define UHS_VID_RSA 0x15e1U // RSA -#define UHS_VID_NUMARK 0x15e4U // Numark -#define UHS_VID_SOHOWARE 0x15e8U // SohoWare -#define UHS_VID_PACIFIC_DIGITAL 0x15e9U // Pacific Digital Corp. -#define UHS_VID_BELCARRA_TECHNOLOGIES 0x15ecU // Belcarra Technologies Corp. -#define UHS_VID_HANFTEK 0x15f4U // HanfTek -#define UHS_VID_TASCAM 0x1604U // Tascam -#define UHS_VID_UMAX_1 0x1606U // Umax -#define UHS_VID_INSIDE_OUT_NETWORKS_HEX_ 0x1608U // Inside Out Networks [hex] -#define UHS_VID_VIA_TECHNOLOGIES_1 0x160aU // VIA Technologies, Inc. -#define UHS_VID_INRO 0x160eU // INRO -#define UHS_VID_AMOI_ELECTRONICS 0x1614U // Amoi Electronics -#define UHS_VID_SONY_1 0x1617U // Sony Corp. -#define UHS_VID_L_AND_K_PRECISION_TECHNOLOGY 0x1619U // L & K Precision Technology Co., Ltd. -#define UHS_VID_WIONICS_RESEARCH 0x1621U // Wionics Research -#define UHS_VID_STONESTREET_ONE 0x1628U // Stonestreet One, Inc. -#define UHS_VID_AIRGO_NETWORKS 0x162aU // Airgo Networks Inc. -#define UHS_VID_WIQUEST_COMMUNICATIONS 0x162fU // WiQuest Communications, Inc. -#define UHS_VID_2WIRE_1 0x1630U // 2Wire, Inc. -#define UHS_VID_GOOD_WAY_TECHNOLOGY 0x1631U // Good Way Technology -#define UHS_VID_ENTREGA_HEX_ 0x1645U // Entrega [hex] -#define UHS_VID_SOFTEC_MICROSYSTEMS 0x1649U // SofTec Microsystems -#define UHS_VID_CHIPX 0x164aU // ChipX -#define UHS_VID_MATRIX_VISION 0x164cU // Matrix Vision GmbH -#define UHS_VID_STRUCK_INNOVATIVE_SYSTEME 0x1657U // Struck Innovative Systeme GmbH -#define UHS_VID_FRONTIER_DESIGN_GROUP 0x165bU // Frontier Design Group -#define UHS_VID_KONDO_KAGAKU 0x165cU // Kondo Kagaku -#define UHS_VID_CREATIX_POLYMEDIA 0x1660U // Creatix Polymedia GmbH -#define UHS_VID_GIGA_TMS 0x1667U // GIGA-TMS INC. -#define UHS_VID_ACTIONTEC_ELECTRONICS_INC_HEX_ 0x1668U // Actiontec Electronics, Inc. [hex] -#define UHS_VID_PIKRON_LTD_HEX_ 0x1669U // PiKRON Ltd. [hex] -#define UHS_VID_CLIPSAL 0x166aU // Clipsal -#define UHS_VID_CHINA_HUADA_INTEGRATED_CIRCUIT_DESIGN_GROUP_CO_LTD_CIDC_GROUP 0x1677U // China Huada Integrated Circuit Design (Group) Co., Ltd. (CIDC Group) -#define UHS_VID_TOTAL_PHASE 0x1679U // Total Phase -#define UHS_VID_GOLDEN_BRIDGE_ELECTECH_1 0x1680U // Golden Bridge Electech Inc. -#define UHS_VID_PREVO_TECHNOLOGIES 0x1681U // Prevo Technologies, Inc. -#define UHS_VID_MAXWISE_PRODUCTION_ENTERPRISE 0x1682U // Maxwise Production Enterprise Ltd. -#define UHS_VID_GODSPEED_COMPUTER 0x1684U // Godspeed Computer Corp. -#define UHS_VID_DELOCK 0x1685U // Delock -#define UHS_VID_ZOOM_CORPORATION 0x1686U // ZOOM Corporation -#define UHS_VID_KINGMAX_DIGITAL 0x1687U // Kingmax Digital Inc. -#define UHS_VID_SAAB 0x1688U // Saab AB -#define UHS_VID_RAZER_USA_1 0x1689U // Razer USA, Ltd -#define UHS_VID_ATHEROS_COMMUNICATIONS_1 0x168cU // Atheros Communications -#define UHS_VID_ASKEY_COMPUTER_CORP_HEX_ 0x1690U // Askey Computer Corp. [hex] -#define UHS_VID_HITACHI_VIDEO_AND_INFORMATION_SYSTEM 0x1696U // Hitachi Video and Information System, Inc. -#define UHS_VID_VTEC_TEST 0x1697U // VTec Test, Inc. -#define UHS_VID_SHENZHEN_ZHENGERYA_CABLE 0x16a5U // Shenzhen Zhengerya Cable Co., Ltd. -#define UHS_VID_UNIGRAF 0x16a6U // Unigraf -#define UHS_VID_GLOBAL_SUN_TECHNOLOGY_1 0x16abU // Global Sun Technology -#define UHS_VID_DONGGUAN_CHINGLUNG_WIRE_AND_CABLE 0x16acU // Dongguan ChingLung Wire & Cable Co., Ltd. -#define UHS_VID_ISTATION 0x16b4U // iStation -#define UHS_VID_PERSENTEC 0x16b5U // Persentec, Inc. -#define UHS_VID_VAN_OOIJEN_TECHNISCHE_INFORMATICA 0x16c0U // Van Ooijen Technische Informatica -#define UHS_VID_WIRELESS_CABLES 0x16caU // Wireless Cables, Inc. -#define UHS_VID_SILEX_TECHNOLOGY 0x16ccU // silex technology, Inc. -#define UHS_VID_MCS 0x16d0U // MCS -#define UHS_VID_SUPREMA 0x16d1U // Suprema Inc. -#define UHS_VID_FRONTLINE_TEST_EQUIPMENT 0x16d3U // Frontline Test Equipment, Inc. -#define UHS_VID_ANYDATA_CORPORATION 0x16d5U // AnyDATA Corporation -#define UHS_VID_JABLOCOM_SRO 0x16d6U // JABLOCOM s.r.o. -#define UHS_VID_CMOTECH 0x16d8U // CMOTECH Co., Ltd. -#define UHS_VID_WIENER_PLEIN_AND_BAUS 0x16dcU // Wiener, Plein & Baus -#define UHS_VID_KING_BILLION_ELECTRONICS 0x16dfU // King Billion Electronics Co., Ltd. -#define UHS_VID_GN_RESOUND_AS 0x16f0U // GN ReSound A/S -#define UHS_VID_FUTURELOGIC 0x16f5U // Futurelogic Inc. -#define UHS_VID_BLUEVIEW_TECHNOLOGIES 0x1706U // BlueView Technologies, Inc. -#define UHS_VID_ARTIMI 0x1707U // ARTIMI -#define UHS_VID_SWISSONIC 0x170bU // Swissonic -#define UHS_VID_AVNERA 0x170dU // Avnera -#define UHS_VID_LEICA_MICROSYSTEMS 0x1711U // Leica Microsystems -#define UHS_VID_MEYER_INSTRUMENTS_MIS 0x1724U // Meyer Instruments (MIS) -#define UHS_VID_VITESSE_SEMICONDUCTOR 0x1725U // Vitesse Semiconductor -#define UHS_VID_AXESSTEL 0x1726U // Axesstel, Inc. -#define UHS_VID_WALTOP_INTERNATIONAL 0x172fU // Waltop International Corp. -#define UHS_VID_CELLINK_TECHNOLOGY 0x1733U // Cellink Technology Co., Ltd -#define UHS_VID_CANON_IMAGING_SYSTEM_TECHNOLOGIES 0x1736U // CANON IMAGING SYSTEM TECHNOLOGIES INC. -#define UHS_VID_LINKSYS_3 0x1737U // Linksys -#define UHS_VID_QSENN 0x173dU // QSENN -#define UHS_VID_SENAO 0x1740U // Senao -#define UHS_VID_GENERAL_ATOMICS 0x1743U // General Atomics -#define UHS_VID_MQP_ELECTRONICS 0x1748U // MQP Electronics -#define UHS_VID_ASMEDIA_TECHNOLOGY 0x174cU // ASMedia Technology Inc. -#define UHS_VID_SYNTEK 0x174fU // Syntek -#define UHS_VID_GERTEC_TELECOMUNICACOES_LTDA 0x1753U // GERTEC Telecomunicacoes Ltda. -#define UHS_VID_ENENSYS_TECHNOLOGIES 0x1756U // ENENSYS Technologies -#define UHS_VID_LUCIDPORT_TECHNOLOGY 0x1759U // LucidPort Technology, Inc. -#define UHS_VID_ASUSTEK_COMPUTER_INC_WRONG_ID 0x1761U // ASUSTek Computer, Inc. (wrong ID) -#define UHS_VID_SYSTEM_LEVEL_SOLUTIONS 0x1772U // System Level Solutions, Inc. -#define UHS_VID_AROWANA 0x1776U // Arowana -#define UHS_VID_SWEEX 0x177fU // Sweex -#define UHS_VID_MULTIPLE_VENDORS 0x1781U // Multiple Vendors -#define UHS_VID_SPREADTRUM_COMMUNICATIONS 0x1782U // Spreadtrum Communications Inc. -#define UHS_VID_TOPSEED_TECHNOLOGY 0x1784U // TopSeed Technology Corp. -#define UHS_VID_ATI_AIB 0x1787U // ATI AIB -#define UHS_VID_SHENZHEN_LITKCONN_TECHNOLOGY 0x1788U // ShenZhen Litkconn Technology Co., Ltd. -#define UHS_VID_PRINTREX 0x1796U // Printrex, Inc. -#define UHS_VID_JALCO 0x1797U // JALCO CO., LTD. -#define UHS_VID_THALES_NORWAY_AS 0x1799U // Thales Norway A/S -#define UHS_VID_RICAVISION_INTERNATIONAL 0x179dU // Ricavision International, Inc. -#define UHS_VID_SAMSON_TECHNOLOGIES 0x17a0U // Samson Technologies Corp. -#define UHS_VID_CONCEPT2 0x17a4U // Concept2 -#define UHS_VID_ADVANCED_CONNECTION_TECHNOLOGY 0x17a5U // Advanced Connection Technology Inc. -#define UHS_VID_MICOMSOFT 0x17a7U // MICOMSOFT CO., LTD. -#define UHS_VID_KAMSTRUP_AS 0x17a8U // Kamstrup A/S -#define UHS_VID_GREY_INNOVATION 0x17b3U // Grey Innovation -#define UHS_VID_LUNATONE 0x17b5U // Lunatone -#define UHS_VID_SAURIS 0x17baU // SAURIS GmbH -#define UHS_VID_SINGIM_INTERNATIONAL 0x17c3U // Singim International Corp. -#define UHS_VID_NATIVE_INSTRUMENTS 0x17ccU // Native Instruments -#define UHS_VID_HIP_HING_CABLE_AND_PLUG_MFY 0x17cfU // Hip Hing Cable & Plug Mfy. Ltd. -#define UHS_VID_SANFORD_LP 0x17d0U // Sanford L.P. -#define UHS_VID_KOREA_TECHTRON 0x17d3U // Korea Techtron Co., Ltd. -#define UHS_VID_DISPLAYLINK 0x17e9U // DisplayLink -#define UHS_VID_CORNICE 0x17ebU // Cornice, Inc. -#define UHS_VID_LENOVO 0x17efU // Lenovo -#define UHS_VID_WAVESENSE 0x17f4U // WaveSense -#define UHS_VID_KK_ROCKY 0x17f5U // K.K. Rocky -#define UHS_VID_UNICOMP 0x17f6U // Unicomp, Inc -#define UHS_VID_ADVANTECH 0x1809U // Advantech -#define UHS_VID_TWINHAN 0x1822U // Twinhan -#define UHS_VID_GWO_JINN_INDUSTRIES 0x1831U // Gwo Jinn Industries Co., Ltd. -#define UHS_VID_HUIZHOU_SHENGHUA_INDUSTRIAL 0x1832U // Huizhou Shenghua Industrial Co., Ltd. -#define UHS_VID_VIVOPHONE 0x183dU // VIVOphone -#define UHS_VID_VAISALA 0x1843U // Vaisala -#define UHS_VID_ASROCK_INCORPORATION 0x1849U // ASRock Incorporation -#define UHS_VID_GYROCOM_CANDC 0x1852U // GYROCOM C&C Co., LTD -#define UHS_VID_MEMORY_DEVICES 0x1854U // Memory Devices Ltd. -#define UHS_VID_COMPRO 0x185bU // Compro -#define UHS_VID_TECH_TECHNOLOGY_INDUSTRIAL_COMPANY 0x1861U // Tech Technology Industrial Company -#define UHS_VID_TERIDIAN_SEMICONDUCTOR 0x1862U // Teridian Semiconductor Corp. -#define UHS_VID_NEXIO_1 0x1870U // Nexio Co., Ltd -#define UHS_VID_AVEO_TECHNOLOGY 0x1871U // Aveo Technology Corp. -#define UHS_VID_NAVILOCK 0x1873U // Navilock -#define UHS_VID_ALIENWARE_CORPORATION 0x187cU // Alienware Corporation -#define UHS_VID_SIANO_MOBILE_SILICON 0x187fU // Siano Mobile Silicon -#define UHS_VID_VAST_TECHNOLOGIES_1 0x1892U // Vast Technologies, Inc. -#define UHS_VID_TOPSEED 0x1894U // Topseed -#define UHS_VID_EVERTOP_WIRE_CABLE 0x1897U // Evertop Wire Cable Co. -#define UHS_VID_3SHAPE_AS 0x189fU // 3Shape A/S -#define UHS_VID_CSSN 0x18a4U // CSSN -#define UHS_VID_VERBATIM 0x18a5U // Verbatim, Ltd -#define UHS_VID_PETALYNX 0x18b1U // Petalynx -#define UHS_VID_E3C_TECHNOLOGIES 0x18b4U // e3C Technologies -#define UHS_VID_MIKKON_TECHNOLOGY_LIMITED 0x18b6U // Mikkon Technology Limited -#define UHS_VID_ZOTEK_ELECTRONIC 0x18b7U // Zotek Electronic Co., Ltd. -#define UHS_VID_AMIT_TECHNOLOGY 0x18c5U // AMIT Technology, Inc. -#define UHS_VID_ECAMM 0x18cdU // Ecamm -#define UHS_VID_GOOGLE 0x18d1U // Google Inc. -#define UHS_VID_STARLINE_INTERNATIONAL_GROUP_LIMITED 0x18d5U // Starline International Group Limited -#define UHS_VID_KABA 0x18d9U // Kaba -#define UHS_VID_LKC_TECHNOLOGIES 0x18dcU // LKC Technologies, Inc. -#define UHS_VID_PLANON_SYSTEM_SOLUTIONS 0x18ddU // Planon System Solutions Inc. -#define UHS_VID_FITIPOWER_INTEGRATED_TECHNOLOGY 0x18e3U // Fitipower Integrated Technology Inc -#define UHS_VID_QCOM 0x18e8U // Qcom -#define UHS_VID_MATROX_GRAPHICS 0x18eaU // Matrox Graphics, Inc. -#define UHS_VID_ARKMICRO_TECHNOLOGIES 0x18ecU // Arkmicro Technologies Inc. -#define UHS_VID_FINEARCH 0x18fdU // FineArch Inc. -#define UHS_VID_GEMBIRD_1 0x1908U // GEMBIRD -#define UHS_VID_MOTOROLA_GSG 0x190dU // Motorola GSG -#define UHS_VID_ALCO_DIGITAL_DEVICES_LIMITED 0x1914U // Alco Digital Devices Limited -#define UHS_VID_NORDIC_SEMICONDUCTOR_ASA 0x1915U // Nordic Semiconductor ASA -#define UHS_VID_FITLINXX 0x1923U // FitLinxx -#define UHS_VID_NEXTWINDOW 0x1926U // NextWindow -#define UHS_VID_AVAGO_TECHNOLOGIES_PTE 0x192fU // Avago Technologies, Pte. -#define UHS_VID_SHENZHEN_XIANHE_TECHNOLOGY 0x1930U // Shenzhen Xianhe Technology Co., Ltd. -#define UHS_VID_NINGBO_BROAD_TELECOMMUNICATION 0x1931U // Ningbo Broad Telecommunication Co., Ltd. -#define UHS_VID_FEATURE_INTEGRATION_TECHNOLOGY_INC_FINTEK 0x1934U // Feature Integration Technology Inc. (Fintek) -#define UHS_VID_DREAM_LINK 0x1941U // Dream Link -#define UHS_VID_SENSORAY 0x1943U // Sensoray Co., Inc. -#define UHS_VID_LAB126 0x1949U // Lab126, Inc. -#define UHS_VID_PRESONUS_AUDIO_ELECTRONICS 0x194fU // PreSonus Audio Electronics, Inc. -#define UHS_VID_HYPERSTONE_AG 0x1951U // Hyperstone AG -#define UHS_VID_IRONKEY 0x1953U // Ironkey Inc. -#define UHS_VID_RADIIENT_TECHNOLOGIES 0x1954U // Radiient Technologies -#define UHS_VID_ITRON_TECHNOLOGY_IONE 0x195dU // Itron Technology iONE -#define UHS_VID_UNIDEN_CORPORATION 0x1965U // Uniden Corporation -#define UHS_VID_CASIO_HITACHI_MOBILE_COMMUNICATIONS 0x1967U // CASIO HITACHI Mobile Communications Co., Ltd. -#define UHS_VID_WISPRO_TECHNOLOGY 0x196bU // Wispro Technology Inc. -#define UHS_VID_DANE_ELEC_CORP_USA 0x1970U // Dane-Elec Corp. USA -#define UHS_VID_DONGGUAN_GUNEETAL_WIRE_AND_CABLE 0x1975U // Dongguan Guneetal Wire & Cable Co., Ltd. -#define UHS_VID_CHIPSBRAND_MICROELECTRONICS_HK 0x1976U // Chipsbrand Microelectronics (HK) Co., Ltd. -#define UHS_VID_T_LOGIC 0x1977U // T-Logic -#define UHS_VID_LEUZE_ELECTRONIC 0x197dU // Leuze electronic -#define UHS_VID_NUCONN_TECHNOLOGY 0x1989U // Nuconn Technology Corp. -#define UHS_VID_BECEEM_COMMUNICATIONS 0x198fU // Beceem Communications Inc. -#define UHS_VID_ACRON_PRECISION_INDUSTRIAL 0x1990U // Acron Precision Industrial Co., Ltd. -#define UHS_VID_TRILLIUM_TECHNOLOGY_PTY 0x1995U // Trillium Technology Pty. Ltd. -#define UHS_VID_PIXELINK 0x1996U // PixeLINK -#define UHS_VID_MICROSTRAIN 0x199bU // MicroStrain, Inc. -#define UHS_VID_THE_IMAGING_SOURCE_EUROPE 0x199eU // The Imaging Source Europe GmbH -#define UHS_VID_BENICA_CORPORATION 0x199fU // Benica Corporation -#define UHS_VID_BIFORST_TECHNOLOGY 0x19a8U // Biforst Technology Inc. -#define UHS_VID_BODELIN 0x19abU // Bodelin -#define UHS_VID_S_LIFE 0x19afU // S Life -#define UHS_VID_BATRONIX 0x19b2U // Batronix -#define UHS_VID_CELESTRON 0x19b4U // Celestron -#define UHS_VID_B_AND_W_GROUP 0x19b5U // B & W Group -#define UHS_VID_INFOTECH_LOGISTIC 0x19b6U // Infotech Logistic, LLC -#define UHS_VID_DATA_ROBOTICS 0x19b9U // Data Robotics -#define UHS_VID_FUTUBA 0x19c2U // Futuba -#define UHS_VID_MINDTRIBE 0x19caU // Mindtribe -#define UHS_VID_PARROT 0x19cfU // Parrot SA -#define UHS_VID_ZTE_WCDMA_TECHNOLOGIES_MSM 0x19d2U // ZTE WCDMA Technologies MSM -#define UHS_VID_KFI_PRINTERS 0x19dbU // KFI Printers -#define UHS_VID_WEIDUAN_ELECTRONIC_ACCESSORY_SZ 0x19e1U // WeiDuan Electronic Accessory (S.Z.) Co., Ltd. -#define UHS_VID_INDUSTRIAL_TECHNOLOGY_RESEARCH_INSTITUTE 0x19e8U // Industrial Technology Research Institute -#define UHS_VID_PAK_HENG_TECHNOLOGY_SHENZHEN 0x19efU // Pak Heng Technology (Shenzhen) Co., Ltd. -#define UHS_VID_RODE_MICROPHONES 0x19f7U // RODE Microphones -#define UHS_VID_GAMPAQ_COLTD 0x19faU // Gampaq Co.Ltd -#define UHS_VID_DYNEX 0x19ffU // Dynex -#define UHS_VID_BELLWOOD_INTERNATIONAL 0x1a08U // Bellwood International, Inc. -#define UHS_VID_USB_IF_NON_WORKSHOP 0x1a0aU // USB-IF non-workshop -#define UHS_VID_KES 0x1a12U // KES Co., Ltd. -#define UHS_VID_VEHO 0x1a1dU // Veho -#define UHS_VID_AMPHENOL_EAST_ASIA 0x1a25U // Amphenol East Asia Ltd. -#define UHS_VID_SEAGATE_BRANDED_SOLUTIONS 0x1a2aU // Seagate Branded Solutions -#define UHS_VID_CHINA_RESOURCE_SEMICO 0x1a2cU // China Resource Semico Co., Ltd -#define UHS_VID_QUANTA_MICROSYSTEMS 0x1a32U // Quanta Microsystems, Inc. -#define UHS_VID_ACRUX 0x1a34U // ACRUX -#define UHS_VID_BIWIN_TECHNOLOGY 0x1a36U // Biwin Technology Ltd. -#define UHS_VID_TERMINUS_TECHNOLOGY 0x1a40U // Terminus Technology Inc. -#define UHS_VID_ACTION_ELECTRONICS 0x1a41U // Action Electronics Co., Ltd. -#define UHS_VID_VASCO_DATA_SECURITY_INTERNATIONAL 0x1a44U // VASCO Data Security International -#define UHS_VID_SILICON_IMAGE 0x1a4aU // Silicon Image -#define UHS_VID_SAFEBOOT_INTERNATIONAL_BV 0x1a4bU // SafeBoot International B.V. -#define UHS_VID_TANDBERG_DATA 0x1a5aU // Tandberg Data -#define UHS_VID_ABBOTT_DIABETES_CARE 0x1a61U // Abbott Diabetes Care -#define UHS_VID_SPANSION 0x1a6aU // Spansion Inc. -#define UHS_VID_SAMYOUNG_ELECTRONICS 0x1a6dU // SamYoung Electronics Co., Ltd -#define UHS_VID_GLOBAL_UNICHIP 0x1a6eU // Global Unichip Corp. -#define UHS_VID_SAGEM_ORGA 0x1a6fU // Sagem Orga GmbH -#define UHS_VID_PHYSIK_INSTRUMENTE 0x1a72U // Physik Instrumente -#define UHS_VID_BAYER_HEALTH_CARE 0x1a79U // Bayer Health Care LLC -#define UHS_VID_LUMBERG_CONNECT_GMBH_AND_CO_KG 0x1a7bU // Lumberg Connect GmbH & Co. KG -#define UHS_VID_EVOLUENT 0x1a7cU // Evoluent -#define UHS_VID_HOLTEK_SEMICONDUCTOR_1 0x1a81U // Holtek Semiconductor, Inc. -#define UHS_VID_QINHENG_ELECTRONICS 0x1a86U // QinHeng Electronics -#define UHS_VID_DYNALITH_SYSTEMS 0x1a89U // Dynalith Systems Co., Ltd. -#define UHS_VID_SGS_TAIWAN 0x1a8bU // SGS Taiwan Ltd. -#define UHS_VID_BANDRICH 0x1a8dU // BandRich, Inc. -#define UHS_VID_LEICA_CAMERA_AG 0x1a98U // Leica Camera AG -#define UHS_VID_DATA_DRIVE_THRU 0x1aa4U // Data Drive Thru, Inc. -#define UHS_VID_UBEACON_TECHNOLOGIES 0x1aa5U // UBeacon Technologies, Inc. -#define UHS_VID_EFORTUNE_TECHNOLOGY 0x1aa6U // eFortune Technology Corp. -#define UHS_VID_KEETOUCH 0x1aadU // KeeTouch -#define UHS_VID_RIGOL_TECHNOLOGIES 0x1ab1U // Rigol Technologies -#define UHS_VID_SALCOMP_PLC 0x1acbU // Salcomp Plc -#define UHS_VID_MIDIPLUS 0x1accU // Midiplus Co, Ltd. -#define UHS_VID_DESAY_WIRE 0x1ad1U // Desay Wire Co., Ltd. -#define UHS_VID_APS 0x1ad4U // APS -#define UHS_VID_SEL_C662_SERIAL_CABLE 0x1adbU // SEL C662 Serial Cable -#define UHS_VID_IC_DESIGN_REINHARD_GOTTINGER 0x1ae4U // ic-design Reinhard Gottinger GmbH -#define UHS_VID_X_TENSIONS 0x1ae7U // X-TENSIONS -#define UHS_VID_HIGH_TOP_PRECISION_ELECTRONIC 0x1aedU // High Top Precision Electronic Co., Ltd. -#define UHS_VID_CONNTECH_ELECTRONIC_SUZHOU_CORPORATION 0x1aefU // Conntech Electronic (Suzhou) Corporation -#define UHS_VID_CONNECT_ONE 0x1af1U // Connect One Ltd. -#define UHS_VID_A_EBERLE_GMBH_AND_CO_KG 0x1afeU // A. Eberle GmbH & Co. KG -#define UHS_VID_MEILHAUS_ELECTRONIC 0x1b04U // Meilhaus Electronic GmbH -#define UHS_VID_BLUTRONICS_SRL 0x1b0eU // BLUTRONICS S.r.l. -#define UHS_VID_CORSAIR 0x1b1cU // Corsair -#define UHS_VID_MSTAR_SEMICONDUCTOR 0x1b20U // MStar Semiconductor, Inc. -#define UHS_VID_WILINX 0x1b22U // WiLinx Corp. -#define UHS_VID_CELLEX_POWER_PRODUCTS 0x1b26U // Cellex Power Products, Inc. -#define UHS_VID_CURRENT_ELECTRONICS 0x1b27U // Current Electronics Inc. -#define UHS_VID_NAVISIS 0x1b28U // NAVIsis Inc. -#define UHS_VID_UGOBE_LIFE_FORMS 0x1b32U // Ugobe Life Forms, Inc. -#define UHS_VID_VIXS_SYSTEMS 0x1b36U // ViXS Systems, Inc. -#define UHS_VID_IPASSION_TECHNOLOGY 0x1b3bU // iPassion Technology Inc. -#define UHS_VID_GENERALPLUS_TECHNOLOGY 0x1b3fU // Generalplus Technology Inc. -#define UHS_VID_ENERGIZER_HOLDINGS 0x1b47U // Energizer Holdings, Inc. -#define UHS_VID_PLASTRON_PRECISION 0x1b48U // Plastron Precision Co., Ltd. -#define UHS_VID_ARH 0x1b52U // ARH Inc. -#define UHS_VID_KS_TERMINALS 0x1b59U // K.S. Terminals Inc. -#define UHS_VID_CHAO_ZHOU_KAI_YUAN_ELECTRIC 0x1b5aU // Chao Zhou Kai Yuan Electric Co., Ltd. -#define UHS_VID_THE_HONG_KONG_STANDARDS_AND_TESTING_CENTRE 0x1b65U // The Hong Kong Standards and Testing Centre Ltd. -#define UHS_VID_FUSHICAI 0x1b71U // Fushicai -#define UHS_VID_ATERGI_TECHNOLOGY 0x1b72U // ATERGI TECHNOLOGY CO., LTD. -#define UHS_VID_FRESCO_LOGIC 0x1b73U // Fresco Logic -#define UHS_VID_OVISLINK 0x1b75U // Ovislink Corp. -#define UHS_VID_LEGEND_SILICON 0x1b76U // Legend Silicon Corp. -#define UHS_VID_AFATECH 0x1b80U // Afatech -#define UHS_VID_DONGGUAN_GUANSHANG_ELECTRONICS 0x1b86U // Dongguan Guanshang Electronics Co., Ltd. -#define UHS_VID_SHENMING_ELECTRON_DONG_GUAN 0x1b88U // ShenMing Electron (Dong Guan) Co., Ltd. -#define UHS_VID_ALTIUM_LIMITED 0x1b8cU // Altium Limited -#define UHS_VID_E_MOVE_TECHNOLOGY 0x1b8dU // e-MOVE Technology Co., Ltd. -#define UHS_VID_AMLOGIC 0x1b8eU // Amlogic, Inc. -#define UHS_VID_MA_LABS 0x1b8fU // MA LABS, Inc. -#define UHS_VID_N_TRIG 0x1b96U // N-Trig -#define UHS_VID_YMAX_COMMUNICATIONS 0x1b98U // YMax Communications Corp. -#define UHS_VID_SHENZHEN_YUANCHUAN_ELECTRONIC 0x1b99U // Shenzhen Yuanchuan Electronic -#define UHS_VID_JINQ_CHERN_ENTERPRISE 0x1ba1U // JINQ CHERN ENTERPRISE CO., LTD. -#define UHS_VID_LITE_METALS_AND_PLASTIC_SHENZHEN 0x1ba2U // Lite Metals & Plastic (Shenzhen) Co., Ltd. -#define UHS_VID_EMBER_CORPORATION 0x1ba4U // Ember Corporation -#define UHS_VID_ABILIS_SYSTEMS 0x1ba6U // Abilis Systems -#define UHS_VID_CHINA_TELECOMMUNICATION_TECHNOLOGY_LABS 0x1ba8U // China Telecommunication Technology Labs -#define UHS_VID_HARMONIX_MUSIC 0x1badU // Harmonix Music -#define UHS_VID_VUZIX_CORPORATION 0x1baeU // Vuzix Corporation -#define UHS_VID_T_AND_A_MOBILE_PHONES 0x1bbbU // T & A Mobile Phones -#define UHS_VID_FORD_MOTOR 0x1bc4U // Ford Motor Co. -#define UHS_VID_AVIXE_TECHNOLOGY_CHINA 0x1bc5U // AVIXE Technology (China) Ltd. -#define UHS_VID_TELIT_WIRELESS_SOLUTIONS 0x1bc7U // Telit Wireless Solutions -#define UHS_VID_CONTAC_CABLE_INDUSTRIAL_LIMITED 0x1bceU // Contac Cable Industrial Limited -#define UHS_VID_SUNPLUS_INNOVATION_TECHNOLOGY 0x1bcfU // Sunplus Innovation Technology Inc. -#define UHS_VID_HANGZHOU_RIYUE_ELECTRONIC 0x1bd0U // Hangzhou Riyue Electronic Co., Ltd. -#define UHS_VID_BG_SYSTEMS 0x1bd5U // BG Systems, Inc. -#define UHS_VID_P_TWO_INDUSTRIES 0x1bdeU // P-TWO INDUSTRIES, INC. -#define UHS_VID_SHENZHEN_TONGYUAN_NETWORK_COMMUNICATION_CABLES 0x1befU // Shenzhen Tongyuan Network-Communication Cables Co., Ltd -#define UHS_VID_REALVISION 0x1bf0U // RealVision Inc. -#define UHS_VID_EXTRANET_SYSTEMS 0x1bf5U // Extranet Systems Inc. -#define UHS_VID_ORIENT_SEMICONDUCTOR_ELECTRONICS 0x1bf6U // Orient Semiconductor Electronics, Ltd. -#define UHS_VID_TOUCHPACK 0x1bfdU // TouchPack -#define UHS_VID_KRETON_CORPORATION 0x1c02U // Kreton Corporation -#define UHS_VID_QNAP_SYSTEM 0x1c04U // QNAP System Inc. -#define UHS_VID_IONICS_EMS 0x1c0cU // Ionics EMS, Inc. -#define UHS_VID_RELM_WIRELESS 0x1c0dU // Relm Wireless -#define UHS_VID_LANTERRA_INDUSTRIAL 0x1c10U // Lanterra Industrial Co., Ltd. -#define UHS_VID_ALECTRONIC_LIMITED 0x1c13U // ALECTRONIC LIMITED -#define UHS_VID_DATEL_ELECTRONICS 0x1c1aU // Datel Electronics Ltd. -#define UHS_VID_VOLKSWAGEN_OF_AMERICA 0x1c1bU // Volkswagen of America, Inc. -#define UHS_VID_GOLDVISH 0x1c1fU // Goldvish S.A. -#define UHS_VID_FUJI_ELECTRIC_DEVICE_TECHNOLOGY 0x1c20U // Fuji Electric Device Technology Co., Ltd. -#define UHS_VID_ADDMM 0x1c21U // ADDMM LLC -#define UHS_VID_ZHONGSHAN_CHIANG_YU_ELECTRIC 0x1c22U // ZHONGSHAN CHIANG YU ELECTRIC CO., LTD. -#define UHS_VID_SHANGHAI_HAIYING_ELECTRONICS 0x1c26U // Shanghai Haiying Electronics Co., Ltd. -#define UHS_VID_HUIYANG_D_AND_S_CABLE 0x1c27U // HuiYang D & S Cable Co., Ltd. -#define UHS_VID_ELSTER 0x1c29U // Elster GmbH -#define UHS_VID_LS_CABLE 0x1c31U // LS Cable Ltd. -#define UHS_VID_SPRINGCARD 0x1c34U // SpringCard -#define UHS_VID_AUTHORIZER_TECHNOLOGIES 0x1c37U // Authorizer Technologies, Inc. -#define UHS_VID_NONIN_MEDICAL 0x1c3dU // NONIN MEDICAL INC. -#define UHS_VID_WEP_PERIPHERALS 0x1c3eU // Wep Peripherals -#define UHS_VID_EZPROTOTYPES 0x1c40U // EZPrototypes -#define UHS_VID_CHERNG_WEEI_TECHNOLOGY 0x1c49U // Cherng Weei Technology Corp. -#define UHS_VID_SIGMA_MICRO 0x1c4fU // SiGma Micro -#define UHS_VID_PHILIPS_AND_LITE_ON_DIGITAL_SOLUTIONS_CORPORATION 0x1c6bU // Philips & Lite-ON Digital Solutions Corporation -#define UHS_VID_SKYDIGITAL 0x1c6cU // Skydigital Inc. -#define UHS_VID_AMT 0x1c73U // AMT -#define UHS_VID_KAETAT_INDUSTRIAL 0x1c77U // Kaetat Industrial Co., Ltd. -#define UHS_VID_DATASCOPE 0x1c78U // Datascope Corp. -#define UHS_VID_UNIGEN_CORPORATION 0x1c79U // Unigen Corporation -#define UHS_VID_LIGHTUNING_TECHNOLOGY 0x1c7aU // LighTuning Technology Inc. -#define UHS_VID_LUXSHARE_PRECISION_INDUSTRY_SHENZHEN 0x1c7bU // LUXSHARE PRECISION INDUSTRY (SHENZHEN) CO., LTD. -#define UHS_VID_SCHOMAECKER 0x1c83U // Schomaecker GmbH -#define UHS_VID_2N_TELEKOMUNIKACE_AS 0x1c87U // 2N TELEKOMUNIKACE a.s. -#define UHS_VID_SOMAGIC 0x1c88U // Somagic, Inc. -#define UHS_VID_HONGKONG_WEIDIDA_ELECTRON_LIMITED 0x1c89U // HONGKONG WEIDIDA ELECTRON LIMITED -#define UHS_VID_ASTRON_INTERNATIONAL 0x1c8eU // ASTRON INTERNATIONAL CORP. -#define UHS_VID_ALPINE_ELECTRONICS 0x1c98U // ALPINE ELECTRONICS, INC. -#define UHS_VID_OMEGA_TECHNOLOGY 0x1c9eU // OMEGA TECHNOLOGY -#define UHS_VID_ACCARIO 0x1ca0U // ACCARIO Inc. -#define UHS_VID_SYMWAVE 0x1ca1U // Symwave -#define UHS_VID_KINSTONE 0x1cacU // Kinstone -#define UHS_VID_ACES_ELECTRONIC 0x1cb3U // Aces Electronic Co., Ltd. -#define UHS_VID_OPEX_CORPORATION 0x1cb4U // OPEX CORPORATION -#define UHS_VID_IDEACOM_TECHNOLOGY 0x1cb6U // IdeaCom Technology Inc. -#define UHS_VID_LUMINARY_MICRO 0x1cbeU // Luminary Micro Inc. -#define UHS_VID_FORTAT_SKYMARK_INDUSTRIAL_COMPANY 0x1cbfU // FORTAT SKYMARK INDUSTRIAL COMPANY -#define UHS_VID_PLANTSENSE 0x1cc0U // PlantSense -#define UHS_VID_NEXTWAVE_BROADBAND 0x1ccaU // NextWave Broadband Inc. -#define UHS_VID_BODATONG_TECHNOLOGY_SHENZHEN 0x1ccdU // Bodatong Technology (Shenzhen) Co., Ltd. -#define UHS_VID_ADP_CORPORATION 0x1cd4U // adp corporation -#define UHS_VID_FIRECOMMS 0x1cd5U // Firecomms Ltd. -#define UHS_VID_ANTONIO_PRECISE_PRODUCTS_MANUFACTORY 0x1cd6U // Antonio Precise Products Manufactory Ltd. -#define UHS_VID_TELECOMMUNICATIONS_TECHNOLOGY_ASSOCIATION_TTA 0x1cdeU // Telecommunications Technology Association (TTA) -#define UHS_VID_WONTEN_TECHNOLOGY 0x1cdfU // WonTen Technology Co., Ltd. -#define UHS_VID_EDIMAX_TECHNOLOGY 0x1ce0U // EDIMAX TECHNOLOGY CO., LTD. -#define UHS_VID_AMPHENOL_KAE 0x1ce1U // Amphenol KAE -#define UHS_VID_DRESDEN_ELEKTRONIK 0x1cf1U // Dresden Elektronik -#define UHS_VID_ANDES_TECHNOLOGY_CORPORATION 0x1cfcU // ANDES TECHNOLOGY CORPORATION -#define UHS_VID_FLEXTRONICS_DIGITAL_DESIGN_JAPAN 0x1cfdU // Flextronics Digital Design Japan, LTD. -#define UHS_VID_ICON 0x1d03U // iCON -#define UHS_VID_SOLID_MOTION 0x1d07U // Solid-Motion -#define UHS_VID_NINGBO_HENTEK_DRAGON_ELECTRONICS 0x1d08U // NINGBO HENTEK DRAGON ELECTRONICS CO., LTD. -#define UHS_VID_TECHFAITH_WIRELESS_TECHNOLOGY_LIMITED 0x1d09U // TechFaith Wireless Technology Limited -#define UHS_VID_JOHNSON_CONTROLS_INC_THE_AUTOMOTIVE_BUSINESS_UNIT 0x1d0aU // Johnson Controls, Inc. The Automotive Business Unit -#define UHS_VID_HAN_HUA_CABLE_AND_WIRE_TECHNOLOGY_JX 0x1d0bU // HAN HUA CABLE & WIRE TECHNOLOGY (J.X.) CO., LTD. -#define UHS_VID_SONIX_TECHNOLOGY 0x1d0fU // Sonix Technology Co., Ltd. -#define UHS_VID_ALPHA_SAT_TECHNOLOGY_LIMITED 0x1d14U // ALPHA-SAT TECHNOLOGY LIMITED -#define UHS_VID_C_THRU_MUSIC 0x1d17U // C-Thru Music Ltd. -#define UHS_VID_DEXATEK_TECHNOLOGY 0x1d19U // Dexatek Technology Ltd. -#define UHS_VID_DIOSTECH 0x1d1fU // Diostech Co., Ltd. -#define UHS_VID_SAMTACK 0x1d20U // SAMTACK INC. -#define UHS_VID_ASUS 0x1d27U // ASUS -#define UHS_VID_DREAM_CHEEKY 0x1d34U // Dream Cheeky -#define UHS_VID_TOUCH 0x1d45U // Touch -#define UHS_VID_PEGATRON_CORPORATION 0x1d4dU // PEGATRON CORPORATION -#define UHS_VID_OPENMOKO 0x1d50U // OpenMoko, Inc. -#define UHS_VID_XENTA 0x1d57U // Xenta -#define UHS_VID_SMARTRONIX 0x1d5bU // Smartronix, Inc. -#define UHS_VID_LINUX_FOUNDATION 0x1d6bU // Linux Foundation -#define UHS_VID_CITIZEN 0x1d90U // Citizen -#define UHS_VID_ACTIONS_MICROELECTRONICS 0x1de1U // Actions Microelectronics Co. -#define UHS_VID_QUALCOMM_OPTION 0x1e0eU // Qualcomm / Option -#define UHS_VID_POINT_GREY_RESEARCH 0x1e10U // Point Grey Research, Inc. -#define UHS_VID_MIRION_TECHNOLOGIES_DOSIMETRY_SERVICES_DIVISION 0x1e17U // Mirion Technologies Dosimetry Services Division -#define UHS_VID_LUMENSION_SECURITY 0x1e1dU // Lumension Security -#define UHS_VID_INVIA 0x1e1fU // INVIA -#define UHS_VID_FESTO_AG_AND_CO_KG 0x1e29U // Festo AG & Co. KG -#define UHS_VID_CHIPSBANK_MICROELECTRONICS_1 0x1e3dU // Chipsbank Microelectronics Co., Ltd -#define UHS_VID_CLEVERSCOPE 0x1e41U // Cleverscope -#define UHS_VID_CUBETERNET 0x1e4eU // Cubeternet -#define UHS_VID_TYPEMATRIX 0x1e54U // TypeMatrix -#define UHS_VID_TREKSTOR_GMBH_AND_CO_KG 0x1e68U // TrekStor GmbH & Co. KG -#define UHS_VID_NZXT 0x1e71U // NZXT -#define UHS_VID_COBY_ELECTRONICS_CORPORATION 0x1e74U // Coby Electronics Corporation -#define UHS_VID_ROCCAT 0x1e7dU // ROCCAT -#define UHS_VID_NUCORE_TECHNOLOGY 0x1ebbU // NuCORE Technology, Inc. -#define UHS_VID_AIRTIES_WIRELESS_NETWORKS 0x1edaU // AirTies Wireless Networks -#define UHS_VID_BLACKMAGIC_DESIGN 0x1edbU // Blackmagic design -#define UHS_VID_ONDA_COMMUNICATION_SPA 0x1ee8U // ONDA COMMUNICATION S.p.a. -#define UHS_VID_EADS_DEUTSCHLAND 0x1ef6U // EADS Deutschland GmbH -#define UHS_VID_CAL_COMP 0x1f28U // Cal-Comp -#define UHS_VID_ONDA_UNVERIFIED 0x1f3aU // Onda (unverified) -#define UHS_VID_THE_NEAT_COMPANY 0x1f44U // The Neat Company -#define UHS_VID_H_TRONIC 0x1f48U // H-TRONIC GmbH -#define UHS_VID_G_TEK_ELECTRONICS_GROUP 0x1f4dU // G-Tek Electronics Group -#define UHS_VID_ALIPH 0x1f6fU // Aliph -#define UHS_VID_INNOSTOR_TECHNOLOGY_CORPORATION 0x1f75U // Innostor Technology Corporation -#define UHS_VID_TANDBERG 0x1f82U // TANDBERG -#define UHS_VID_ALERE 0x1f84U // Alere, Inc. -#define UHS_VID_STANTUM 0x1f87U // Stantum -#define UHS_VID_UBIQUITI_NETWORKS 0x1f9bU // Ubiquiti Networks, Inc. -#define UHS_VID_SAMSUNG_OPTO_ELECTRONCS 0x1fabU // Samsung Opto-Electroncs Co., Ltd. -#define UHS_VID_DELPHIN_TECHNOLOGY_AG 0x1fbdU // Delphin Technology AG -#define UHS_VID_NXP_SEMICONDUCTORS 0x1fc9U // NXP Semiconductors -#define UHS_VID_ILX_LIGHTWAVE_CORPORATION 0x1fdeU // ILX Lightwave Corporation -#define UHS_VID_VERTEX_WIRELESS 0x1fe7U // Vertex Wireless Co., Ltd. -#define UHS_VID_CVT_ELECTRONICSCOLTD 0x1ff7U // CVT Electronics.Co.,Ltd -#define UHS_VID_IDEOFY 0x1fffU // Ideofy Inc. -#define UHS_VID_D_LINK 0x2001U // D-Link Corp. -#define UHS_VID_DAP_TECHNOLOGIES 0x2002U // DAP Technologies -#define UHS_VID_DETECTOMAT 0x2003U // detectomat -#define UHS_VID_RELOOP 0x200cU // Reloop -#define UHS_VID_PCTV_SYSTEMS 0x2013U // PCTV Systems -#define UHS_VID_PLANEX_1 0x2019U // PLANEX -#define UHS_VID_ENCORE_ELECTRONICS 0x203dU // Encore Electronics Inc. -#define UHS_VID_HAUPPAUGE 0x2040U // Hauppauge -#define UHS_VID_TEXAS_INSTRUMENTS_2 0x2047U // Texas Instruments -#define UHS_VID_NANO_RIVER_TECHNOLOGY 0x2058U // Nano River Technology -#define UHS_VID_TAICANG_TANDW_ELECTRONICS 0x2077U // Taicang T&W Electronics Co. Ltd -#define UHS_VID_BARNES_AND_NOBLE 0x2080U // Barnes & Noble -#define UHS_VID_SIMPASS 0x2086U // SIMPASS -#define UHS_VID_CANDO 0x2087U // Cando -#define UHS_VID_CLAY_LOGIC 0x20a0U // Clay Logic -#define UHS_VID_XMOS 0x20b1U // XMOS Ltd -#define UHS_VID_HANVON 0x20b3U // Hanvon -#define UHS_VID_QI_HARDWARE 0x20b7U // Qi Hardware -#define UHS_VID_MINICIRCUITS 0x20ceU // Minicircuits -#define UHS_VID_SIMTEC_ELECTRONICS 0x20dfU // Simtec Electronics -#define UHS_VID_NET_NEW_ELECTRONIC_TECHNOLOGY 0x20f1U // NET New Electronic Technology GmbH -#define UHS_VID_TRENDNET_1 0x20f4U // TRENDnet -#define UHS_VID_XIMEA 0x20f7U // XIMEA -#define UHS_VID_RT_SYSTEMS 0x2100U // RT Systems -#define UHS_VID_ACTIONSTAR 0x2101U // ActionStar -#define UHS_VID_VIA_LABS 0x2109U // VIA Labs, Inc. -#define UHS_VID_SOFTKINETIC 0x2113U // Softkinetic -#define UHS_VID_ADVANCED_SILICON 0x2149U // Advanced Silicon S.A. -#define UHS_VID_CREATIVE_UNKNOWN 0x2162U // Creative (?) -#define UHS_VID_GW_INSTEK 0x2184U // GW Instek -#define UHS_VID_EMOTIV_SYSTEMS_PTY 0x21a1U // Emotiv Systems Pty. Ltd. -#define UHS_VID_AGECODAGIS_SARL 0x21d6U // Agecodagis SARL -#define UHS_VID_MACALLY_1 0x2222U // MacAlly -#define UHS_VID_SAMWOO_ENTERPRISE 0x2227U // SAMWOO Enterprise -#define UHS_VID_SILICON_MOTION_1 0x2232U // Silicon Motion -#define UHS_VID_RADIOSHACK_CORPORATION 0x2233U // RadioShack Corporation -#define UHS_VID_KOBO 0x2237U // Kobo Inc. -#define UHS_VID_MORPHO 0x225dU // Morpho -#define UHS_VID_8D_TECHNOLOGIES 0x228dU // 8D Technologies inc. -#define UHS_VID_PIE_DIGITAL 0x22a6U // Pie Digital, Inc. -#define UHS_VID_MOTOROLA_PCS 0x22b8U // Motorola PCS -#define UHS_VID_ETURBOTOUCH_TECHNOLOGY 0x22b9U // eTurboTouch Technology, Inc. -#define UHS_VID_TECHNOLOGY_INNOVATION_HOLDINGS 0x22baU // Technology Innovation Holdings, Ltd -#define UHS_VID_PINNACLE_SYSTEMS_1 0x2304U // Pinnacle Systems, Inc. -#define UHS_VID_SHINING_TECHNOLOGIES_INC_HEX_ 0x2318U // Shining Technologies, Inc. [hex] -#define UHS_VID_ARDUINO 0x2341U // Arduino SA -#define UHS_VID_PUMATRONIX_LTDA 0x2373U // Pumatronix Ltda -#define UHS_VID_DIGITALWAY_1 0x2375U // Digit@lway, Inc. -#define UHS_VID_SANHO_DIGITAL_ELECTRONICS 0x2406U // SANHO Digital Electronics Co., Ltd. -#define UHS_VID_AESSENT_TECHNOLOGY 0x2443U // Aessent Technology Ltd -#define UHS_VID_TRIPP_LITE_1 0x2478U // Tripp-Lite -#define UHS_VID_MAXXTER 0x248aU // Maxxter -#define UHS_VID_M2TECH_SRL 0x249cU // M2Tech s.r.l. -#define UHS_VID_PARATRONIC 0x24e1U // Paratronic -#define UHS_VID_TWINMOS_1 0x2632U // TwinMOS -#define UHS_VID_XSENS 0x2639U // Xsens -#define UHS_VID_ELECTRONICS_FOR_IMAGING_INC_HEX_ 0x2650U // Electronics For Imaging, Inc. [hex] -#define UHS_VID_SUNDTEK 0x2659U // Sundtek -#define UHS_VID_BASLER_AG 0x2676U // Basler AG -#define UHS_VID_CITIZEN_1 0x2730U // Citizen -#define UHS_VID_DIGITALWAY_2 0x2735U // DigitalWay -#define UHS_VID_NHJ 0x2770U // NHJ, Ltd -#define UHS_VID_THINGM 0x27b8U // ThingM -#define UHS_VID_ASUSTEK_COMPUTER_1 0x2821U // ASUSTek Computer Inc. -#define UHS_VID_TOPTRONIC_INDUSTRIAL 0x2899U // Toptronic Industrial Co., Ltd -#define UHS_VID_DRACALRAPHNET_TECHNOLOGIES 0x289bU // Dracal/Raphnet technologies -#define UHS_VID_JOLLA_OY 0x2931U // Jolla Oy -#define UHS_VID_DOG_HUNTER_AG 0x2a03U // dog hunter AG -#define UHS_VID_RTD_EMBEDDED_TECHNOLOGIES 0x2a37U // RTD Embedded Technologies, Inc. -#define UHS_VID_MEIZU 0x2a45U // Meizu Corp. -#define UHS_VID_PLANEX_COMMUNICATIONS_2 0x2c02U // Planex Communications -#define UHS_VID_DOLPHIN_PERIPHERALS 0x2c1aU // Dolphin Peripherals -#define UHS_VID_FUJITSU_1 0x2fb2U // Fujitsu, Ltd -#define UHS_VID_EAGLETRON_1 0x3125U // Eagletron -#define UHS_VID_NAVINI_NETWORKS 0x3136U // Navini Networks -#define UHS_VID_WHANAM_ELECTRONICS 0x3176U // Whanam Electronics Co., Ltd -#define UHS_VID_LINK_INSTRUMENTS 0x3195U // Link Instruments -#define UHS_VID_VIDZMEDIA_PTE 0x3275U // VidzMedia Pte Ltd -#define UHS_VID_INLINE 0x3333U // InLine -#define UHS_VID_AEI 0x3334U // AEI -#define UHS_VID_YAKUMO 0x3340U // Yakumo -#define UHS_VID_LEAGUER_MICROELECTRONICS_LME 0x3344U // Leaguer Microelectronics (LME) -#define UHS_VID_MICRO_STAR 0x3504U // Micro Star -#define UHS_VID_POWER_QUOTIENT_INTERNATIONAL_1 0x3538U // Power Quotient International Co., Ltd -#define UHS_VID_DIVA 0x3579U // DIVA -#define UHS_VID_SHARKOON 0x357dU // Sharkoon -#define UHS_VID_INVIBRO 0x3636U // InVibro -#define UHS_VID_WEM 0x3838U // WEM -#define UHS_VID_NATIONAL_INSTRUMENTS 0x3923U // National Instruments Corp. -#define UHS_VID_I_O_DATA 0x40bbU // I-O Data -#define UHS_VID_I_ROCKS 0x4101U // i-rocks -#define UHS_VID_IRIVER_1 0x4102U // iRiver, Ltd. -#define UHS_VID_DELL_COMPUTER_1 0x413cU // Dell Computer Corp. -#define UHS_VID_USBEST_TECHNOLOGY 0x4146U // USBest Technology -#define UHS_VID_TARGUS 0x4168U // Targus -#define UHS_VID_USB_DESIGN_BY_EXAMPLE 0x4242U // USB Design by Example -#define UHS_VID_GOPRO 0x4255U // GoPro -#define UHS_VID_BROADCOM_1 0x4317U // Broadcom Corp. -#define UHS_VID_WINCHIPHEAD 0x4348U // WinChipHead -#define UHS_VID_SHUTTLE_2 0x4572U // Shuttle, Inc. -#define UHS_VID_PANRAM 0x4586U // Panram -#define UHS_VID_EMS_PRODUCTION 0x4670U // EMS Production -#define UHS_VID_MIDITECH 0x4752U // Miditech -#define UHS_VID_GW_INSTEK_1 0x4757U // GW Instek -#define UHS_VID_ACEECA 0x4766U // Aceeca -#define UHS_VID_MEMOREX 0x4855U // Memorex -#define UHS_VID_SIMPLETECH 0x4971U // SimpleTech -#define UHS_VID_MUSICAL_FIDELITY 0x4d46U // Musical Fidelity -#define UHS_VID_GRANDTEC 0x5032U // Grandtec -#define UHS_VID_LINKSYS_UNKNOWN 0x5041U // Linksys (?) -#define UHS_VID_AVERATEC_UNKNOWN 0x50c2U // Averatec (?) -#define UHS_VID_SWEEX_1 0x5173U // Sweex -#define UHS_VID_I_TETRA 0x5219U // I-Tetra -#define UHS_VID_OWON 0x5345U // Owon -#define UHS_VID_SATOSHILABS 0x534cU // SatoshiLabs -#define UHS_VID_MEYER_INSTRUMENTS_MIS_1 0x5354U // Meyer Instruments (MIS) -#define UHS_VID_TRANSMETA 0x544dU // Transmeta Corp. -#define UHS_VID_UC_LOGIC_TECHNOLOGY 0x5543U // UC-Logic Technology Corp. -#define UHS_VID_EPIPHAN_SYSTEMS 0x5555U // Epiphan Systems Inc. -#define UHS_VID_ONSPEC_ELECTRONIC 0x55aaU // OnSpec Electronic, Inc. -#define UHS_VID_GOTVIEW 0x5654U // Gotview -#define UHS_VID_UNI_TREND_GROUP_LIMITED 0x5656U // Uni-Trend Group Limited -#define UHS_VID_IRTOUCHSYSTEMS 0x595aU // IRTOUCHSYSTEMS Co. Ltd. -#define UHS_VID_ACER_2 0x5986U // Acer, Inc -#define UHS_VID_NONOLITH_LABS 0x59e3U // Nonolith Labs -#define UHS_VID_ZINWELL 0x5a57U // Zinwell -#define UHS_VID_BEHOLDER_INTERNATIONAL 0x6000U // Beholder International Ltd. -#define UHS_VID_INGENIC_SEMICONDUCTOR 0x601aU // Ingenic Semiconductor Ltd. -#define UHS_VID_SITECOM 0x6189U // Sitecom -#define UHS_VID_LIGHTINGSOFT_AG 0x6244U // LightingSoft AG -#define UHS_VID_TWINHAN_TECHNOLOGY 0x6253U // TwinHan Technology Co., Ltd -#define UHS_VID_CORELOGIC 0x636cU // CoreLogic, Inc. -#define UHS_VID_UNKNOWN_SONY_UNKNOWN 0x6472U // Unknown (Sony?) -#define UHS_VID_ARKMICRO_TECHNOLOGIES_1 0x6547U // Arkmicro Technologies Inc. -#define UHS_VID_IRTOUCHSYSTEMS_1 0x6615U // IRTOUCHSYSTEMS Co. Ltd. -#define UHS_VID_PROTOTYPE_PRODUCT_VENDOR_ID 0x6666U // Prototype product Vendor ID -#define UHS_VID_WISEGROUP 0x6677U // WiseGroup, Ltd. -#define UHS_VID_3COM_1 0x6891U // 3Com -#define UHS_VID_OPERA1 0x695cU // Opera1 -#define UHS_VID_YEALINK_NETWORK_TECHNOLOGY 0x6993U // Yealink Network Technology Co., Ltd. -#define UHS_VID_SHANGHAI_JUJO_ELECTRONICS 0x6a75U // Shanghai Jujo Electronics Co., Ltd -#define UHS_VID_CME_CENTRAL_MUSIC 0x7104U // CME (Central Music Co.) -#define UHS_VID_STACKFOUNDRY 0x726cU // StackFoundry LLC -#define UHS_VID_TBS_TECHNOLOGIES_CHINA 0x734cU // TBS Technologies China -#define UHS_VID_BEIJING_STONE_TECHNOLOGY 0x7373U // Beijing STONE Technology Co. Ltd. -#define UHS_VID_EDIMAX_TECHNOLOGY_1 0x7392U // Edimax Technology Co., Ltd -#define UHS_VID_INTEL_1 0x8086U // Intel Corp. -#define UHS_VID_INTEL_2 0x8087U // Intel Corp. -#define UHS_VID_VIRTUALBOX 0x80eeU // VirtualBox -#define UHS_VID_KEIO 0x8282U // Keio -#define UHS_VID_EGO_SYSTEMS_1 0x8341U // EGO Systems, Inc. -#define UHS_VID_TRANSCEND_INFORMATION_1 0x8564U // Transcend Information, Inc. -#define UHS_VID_INTENSO_GMBG 0x8644U // Intenso GmbG -#define UHS_VID_CH_PRODUCTS_1 0x8e06U // CH Products, Inc. -#define UHS_VID_SITECOM_1 0x9016U // Sitecom -#define UHS_VID_TEVII_TECHNOLOGY 0x9022U // TeVii Technology Ltd. -#define UHS_VID_GEOLAB 0x9148U // GeoLab, Ltd -#define UHS_VID_MOSCHIP_SEMICONDUCTOR 0x9710U // MosChip Semiconductor -#define UHS_VID_BESTMEDIA_CD_RECORDABLE_GMBH_AND_CO_KG 0x9849U // Bestmedia CD Recordable GmbH & Co. KG -#define UHS_VID_ODEON 0x9999U // Odeon -#define UHS_VID_GRANDTEC_1 0x99faU // Grandtec -#define UHS_VID_J_WESTHUES 0x9ac4U // J. Westhues -#define UHS_VID_MARVELL_SEMICONDUCTOR_1 0x9e88U // Marvell Semiconductor, Inc. -#define UHS_VID_ANMO_ELECTRONICS_CORP_DINO_LITE_UNKNOWN 0xa128U // AnMo Electronics Corp. / Dino-Lite (?) -#define UHS_VID_ANMO_ELECTRONICS_CORPORATION 0xa168U // AnMo Electronics Corporation -#define UHS_VID_ASIX 0xa600U // Asix -#define UHS_VID_3COM_2 0xa727U // 3Com -#define UHS_VID_MXT 0xaaaaU // MXT -#define UHS_VID_UNKNOWN_3 0xabcdU // Unknown -#define UHS_VID_BLUE_MICROPHONES 0xb58eU // Blue Microphones -#define UHS_VID_CARD_DEVICE_EXPERT 0xc216U // Card Device Expert Co., LTD -#define UHS_VID_KEIL_SOFTWARE_1 0xc251U // Keil Software, Inc. -#define UHS_VID_CACE_TECHNOLOGIES 0xcaceU // CACE Technologies Inc. -#define UHS_VID_SMART_TECHNOLOGY_INDUSTRIAL 0xcd12U // SMART TECHNOLOGY INDUSTRIAL LTD. -#define UHS_VID_ULTIMARC 0xd208U // Ultimarc -#define UHS_VID_ULTIMARC_1 0xd209U // Ultimarc -#define UHS_VID_LOGILINK 0xd904U // LogiLink -#define UHS_VID_XORCOM 0xe4e4U // Xorcom Ltd. -#define UHS_VID_MAKINGTHINGS 0xeb03U // MakingThings -#define UHS_VID_EMPIA_TECHNOLOGY 0xeb1aU // eMPIA Technology, Inc. -#define UHS_VID_KWORLD 0xeb2aU // KWorld -#define UHS_VID_SMART_TECHNOLOGY_INDUSTRIAL_1 0xef18U // SMART TECHNOLOGY INDUSTRIAL LTD. -#define UHS_VID_HEWLETT_PACKARD_1 0xf003U // Hewlett Packard -#define UHS_VID_LEAP_MOTION 0xf182U // Leap Motion -#define UHS_VID_ATTEN_ELECTRONICS_SIGLENT_TECHNOLOGIES 0xf4ecU // Atten Electronics / Siglent Technologies -#define UHS_VID_SHENZHEN_SIGLENT 0xf4edU // Shenzhen Siglent Co., Ltd. -#define UHS_VID_HAMA_1 0xf766U // Hama -#define UHS_VID_CONRAD_ELECTRONIC_SE 0xfc08U // Conrad Electronic SE -#define UHS_VID_FNK_TECH 0xffeeU // FNK Tech - -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h deleted file mode 100644 index 1591f3b74b..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h +++ /dev/null @@ -1,336 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#if !defined(_UHS_host_h_) || defined(USBCORE_H) -#error "Never include UHS_UsbCore.h directly; include UHS_Host.h instead" -#else -#define USBCORE_H - -#ifndef UHS_HOST_MAX_INTERFACE_DRIVERS -#define UHS_HOST_MAX_INTERFACE_DRIVERS 0x10U // Default maximum number of USB interface drivers -#endif - -#ifndef SYSTEM_OR_SPECIAL_YIELD -#define SYSTEM_OR_SPECIAL_YIELD(...) VOID0 -#endif - -#ifndef SYSTEM_OR_SPECIAL_YIELD_FROM_ISR -#define SYSTEM_OR_SPECIAL_YIELD_FROM_ISR(...) SYSTEM_OR_SPECIAL_YIELD -#endif - -// As we make extensions to a target interface add to UHS_HOST_MAX_INTERFACE_DRIVERS -// This offset gets calculated for supporting wide subclasses, such as HID, BT, etc. -#define UHS_HID_INDEX (UHS_HOST_MAX_INTERFACE_DRIVERS + 1) - -/* Common setup data constant combinations */ -//get descriptor request type -#define UHS_bmREQ_GET_DESCR (USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE) - -//set request type for all but 'set feature' and 'set interface' -#define UHS_bmREQ_SET (USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE) - -//get interface request type -#define UHS_bmREQ_CL_GET_INTF (USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE) - -// D7 data transfer direction (0 - host-to-device, 1 - device-to-host) -// D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved) -// D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved) - - -// TO-DO: Use the python script to generate these. -// TO-DO: Add _all_ subclasses here. -// USB Device Classes, Subclasses and Protocols -//////////////////////////////////////////////////////////////////////////////// -// Use Class Info in the Interface Descriptors -#define UHS_USB_CLASS_USE_CLASS_INFO 0x00U - -//////////////////////////////////////////////////////////////////////////////// -// Audio -#define UHS_USB_CLASS_AUDIO 0x01U -// Subclasses -#define UHS_USB_SUBCLASS_AUDIOCONTROL 0x01U -#define UHS_USB_SUBCLASS_AUDIOSTREAMING 0x02U -#define UHS_USB_SUBCLASS_MIDISTREAMING 0x03U - -//////////////////////////////////////////////////////////////////////////////// -// Communications and CDC Control -#define UHS_USB_CLASS_COM_AND_CDC_CTRL 0x02U - -//////////////////////////////////////////////////////////////////////////////// -// HID -#define UHS_USB_CLASS_HID 0x03U -// Subclasses -#define UHS_HID_BOOT_SUBCLASS 0x01U -// Protocols -#define UHS_HID_PROTOCOL_HIDBOOT_KEYBOARD 0x01U -#define UHS_HID_PROTOCOL_HIDBOOT_MOUSE 0x02U -//////////////////////////////////////////////////////////////////////////////// -// Physical -#define UHS_USB_CLASS_PHYSICAL 0x05U - -//////////////////////////////////////////////////////////////////////////////// -// Image -#define UHS_USB_CLASS_IMAGE 0x06U - -//////////////////////////////////////////////////////////////////////////////// -// Printer -#define UHS_USB_CLASS_PRINTER 0x07U - -//////////////////////////////////////////////////////////////////////////////// -// Mass Storage -#define UHS_USB_CLASS_MASS_STORAGE 0x08 -// Subclasses -#define UHS_BULK_SUBCLASS_SCSI_NOT_REPORTED 0x00U // De facto use -#define UHS_BULK_SUBCLASS_RBC 0x01U -#define UHS_BULK_SUBCLASS_ATAPI 0x02U // MMC-5 (ATAPI) -#define UHS_BULK_SUBCLASS_OBSOLETE1 0x03U // Was QIC-157 -#define UHS_BULK_SUBCLASS_UFI 0x04U // Specifies how to interface Floppy Disk Drives to USB -#define UHS_BULK_SUBCLASS_OBSOLETE2 0x05U // Was SFF-8070i -#define UHS_BULK_SUBCLASS_SCSI 0x06U // SCSI Transparent Command Set -#define UHS_BULK_SUBCLASS_LSDFS 0x07U // Specifies how host has to negotiate access before trying SCSI -#define UHS_BULK_SUBCLASS_IEEE1667 0x08U -// Protocols -#define UHS_STOR_PROTO_CBI 0x00U // CBI (with command completion interrupt) -#define UHS_STOR_PROTO_CBI_NO_INT 0x01U // CBI (without command completion interrupt) -#define UHS_STOR_PROTO_OBSOLETE 0x02U -#define UHS_STOR_PROTO_BBB 0x50U // Bulk Only Transport -#define UHS_STOR_PROTO_UAS 0x62U - -//////////////////////////////////////////////////////////////////////////////// -// Hub -#define UHS_USB_CLASS_HUB 0x09U - -//////////////////////////////////////////////////////////////////////////////// -// CDC-Data -#define UHS_USB_CLASS_CDC_DATA 0x0AU - -//////////////////////////////////////////////////////////////////////////////// -// Smart-Card -#define UHS_USB_CLASS_SMART_CARD 0x0BU - -//////////////////////////////////////////////////////////////////////////////// -// Content Security -#define UHS_USB_CLASS_CONTENT_SECURITY 0x0DU - -//////////////////////////////////////////////////////////////////////////////// -// Video -#define UHS_USB_CLASS_VIDEO 0x0EU - -//////////////////////////////////////////////////////////////////////////////// -// Personal Healthcare -#define UHS_USB_CLASS_PERSONAL_HEALTH 0x0FU - -//////////////////////////////////////////////////////////////////////////////// -// Diagnostic Device -#define UHS_USB_CLASS_DIAGNOSTIC_DEVICE 0xDCU - -//////////////////////////////////////////////////////////////////////////////// -// Wireless Controller -#define UHS_USB_CLASS_WIRELESS_CTRL 0xE0U - -//////////////////////////////////////////////////////////////////////////////// -// Miscellaneous -#define UHS_USB_CLASS_MISC 0xEFU - -//////////////////////////////////////////////////////////////////////////////// -// Application Specific -#define UHS_USB_CLASS_APP_SPECIFIC 0xFEU - -//////////////////////////////////////////////////////////////////////////////// -// Vendor Specific -#define UHS_USB_CLASS_VENDOR_SPECIFIC 0xFFU - -//////////////////////////////////////////////////////////////////////////////// - - -/* USB state machine states */ -#define UHS_USB_HOST_STATE_MASK 0xF0U - -// Configure states, MSN == 0 --------------------------V -#define UHS_USB_HOST_STATE_DETACHED 0x00U -#define UHS_USB_HOST_STATE_DEBOUNCE 0x01U -#define UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE 0x02U -#define UHS_USB_HOST_STATE_RESET_NOT_COMPLETE 0x03U -#define UHS_USB_HOST_STATE_WAIT_SOF 0x04U -#define UHS_USB_HOST_STATE_WAIT_BUS_READY 0x05U -#define UHS_USB_HOST_STATE_RESET_DEVICE 0x0AU -#define UHS_USB_HOST_STATE_CONFIGURING 0x0CU // Looks like "CO"nfig (backwards) -#define UHS_USB_HOST_STATE_CONFIGURING_DONE 0x0DU // Looks like "DO"one (backwards) -#define UHS_USB_HOST_STATE_CHECK 0x0EU -#define UHS_USB_HOST_STATE_ILLEGAL 0x0FU // Foo - -// Run states, MSN != 0 --------------------------------V -#define UHS_USB_HOST_STATE_RUNNING 0x60U // Looks like "GO" -#define UHS_USB_HOST_STATE_IDLE 0x1DU // Looks like "ID"le -#define UHS_USB_HOST_STATE_ERROR 0xF0U // Looks like "FO"o -#define UHS_USB_HOST_STATE_INITIALIZE 0x10U // Looks like "I"nit - -// Host SE result codes. -// Common SE results are stored in the low nybble, all interface drivers understand these plus 0x1F. -// Extended SE results are 0x10-0x1E. SE code only understands these internal to the hardware. -// Values > 0x1F are driver or other internal error conditions. -// Return these result codes from your host controller driver to match the error condition -// ALL Non-zero values are errors. -// Values not listed in this table are not handled in the base class, or any host driver. - -#define UHS_HOST_ERROR_NONE 0x00U // No error -#define UHS_HOST_ERROR_BUSY 0x01U // transfer pending -#define UHS_HOST_ERROR_BADREQ 0x02U // Transfer Launch Request was bad -#define UHS_HOST_ERROR_DMA 0x03U // DMA was too short, or too long -#define UHS_HOST_ERROR_NAK 0x04U // Peripheral returned NAK -#define UHS_HOST_ERROR_STALL 0x05U // Peripheral returned STALL -#define UHS_HOST_ERROR_TOGERR 0x06U // Toggle error/ISO over-underrun -#define UHS_HOST_ERROR_WRONGPID 0x07U // Received wrong Packet ID -#define UHS_HOST_ERROR_BADBC 0x08U // Byte count is bad -#define UHS_HOST_ERROR_PIDERR 0x09U // Received Packet ID is corrupted -#define UHS_HOST_ERROR_BADRQ 0x0AU // Packet error. Increase max packet. -#define UHS_HOST_ERROR_CRC 0x0BU // USB CRC was incorrect -#define UHS_HOST_ERROR_KERR 0x0CU // K-state instead of response, usually indicates wrong speed -#define UHS_HOST_ERROR_JERR 0x0DU // J-state instead of response, usually indicates wrong speed -#define UHS_HOST_ERROR_TIMEOUT 0x0EU // Device did not respond in time -#define UHS_HOST_ERROR_BABBLE 0x0FU // Line noise/unexpected data -#define UHS_HOST_ERROR_MEM_LAT 0x10U // Error caused by memory latency. -#define UHS_HOST_ERROR_NYET 0x11U // OUT transfer accepted with NYET - -// Addressing error codes -#define ADDR_ERROR_INVALID_INDEX 0xA0U -#define ADDR_ERROR_INVALID_ADDRESS 0xA1U - -// Common Interface Driver error codes -#define UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED 0xD1U // Driver doesn't support the device or interfaces -#define UHS_HOST_ERROR_DEVICE_INIT_INCOMPLETE 0xD2U // Init partially finished, but died. -#define UHS_HOST_ERROR_CANT_REGISTER_DEVICE_CLASS 0xD3U // There was no driver for the interface requested. -#define UHS_HOST_ERROR_ADDRESS_POOL_FULL 0xD4U // No addresses left in the address pool. -#define UHS_HOST_ERROR_HUB_ADDRESS_OVERFLOW 0xD5U // No hub addresses left. The maximum is 7. -#define UHS_HOST_ERROR_NO_ADDRESS_IN_POOL 0xD6U // Address was not allocated in the pool, thus not found. -#define UHS_HOST_ERROR_NULL_EPINFO 0xD7U // The supplied endpoint was NULL, indicates a bug or other problem. -#define UHS_HOST_ERROR_BAD_ARGUMENT 0xD8U // Indicates a range violation bug. -#define UHS_HOST_ERROR_DEVICE_DRIVER_BUSY 0xD9U // The interface driver is busy or out buffer is full, try again later. -#define UHS_HOST_ERROR_BAD_MAX_PACKET_SIZE 0xDAU // The maximum packet size was exceeded. Try again with smaller size. -#define UHS_HOST_ERROR_NO_ENDPOINT_IN_TABLE 0xDBU // The endpoint could not be found in the endpoint table. -#define UHS_HOST_ERROR_UNPLUGGED 0xDEU // Someone removed the USB device, or Vbus was turned off. -#define UHS_HOST_ERROR_NOMEM 0xDFU // Out Of Memory. - -// Control request stream errors -#define UHS_HOST_ERROR_FailGetDevDescr 0xE1U -#define UHS_HOST_ERROR_FailSetDevTblEntry 0xE2U -#define UHS_HOST_ERROR_FailGetConfDescr 0xE3U -#define UHS_HOST_ERROR_END_OF_STREAM 0xEFU - -// Host base class specific Error codes -#define UHS_HOST_ERROR_NOT_IMPLEMENTED 0xFEU -#define UHS_HOST_ERROR_TRANSFER_TIMEOUT 0xFFU - -// SEI interaction defaults -#define UHS_HOST_TRANSFER_MAX_MS 10000 // USB transfer timeout in ms, per section 9.2.6.1 of USB 2.0 spec -#define UHS_HOST_TRANSFER_RETRY_MAXIMUM 3 // 3 retry limit for a transfer -#define UHS_HOST_DEBOUNCE_DELAY_MS 500 // settle delay in milliseconds -#define UHS_HUB_RESET_DELAY_MS 20 // hub port reset delay, 10ms recomended, but can be up to 20ms - -// -// We only provide the minimum needed information for enumeration. -// Interface drivers should be able to set up what is needed with nothing more. -// A driver needs to know the following information: -// 1: address on the USB network, parent and port (aka UsbDeviceAddress) -// 2: endpoints -// 3: vid:pid, class, subclass, protocol -// - -struct ENDPOINT_INFO { - uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN). - uint8_t bmAttributes; // Endpoint transfer type. - uint16_t wMaxPacketSize; // Maximum packet size. - uint8_t bInterval; // Polling interval in frames. -} __attribute__((packed)); - -struct INTERFACE_INFO { - uint8_t bInterfaceNumber; - uint8_t bAlternateSetting; - uint8_t numep; - uint8_t klass; - uint8_t subklass; - uint8_t protocol; - ENDPOINT_INFO epInfo[16]; -} __attribute__((packed)); - -struct ENUMERATION_INFO { - uint16_t vid; - uint16_t pid; - uint16_t bcdDevice; - uint8_t klass; - uint8_t subklass; - uint8_t protocol; - uint8_t bMaxPacketSize0; - uint8_t currentconfig; - uint8_t parent; - uint8_t port; - uint8_t address; - INTERFACE_INFO interface; -} __attribute__((packed)); - -/* USB Setup Packet Structure */ -typedef struct { - // offset description - // 0 Bit-map of request type - union { - uint8_t bmRequestType; - - struct { - uint8_t recipient : 5; // Recipient of the request - uint8_t type : 2; // Type of request - uint8_t direction : 1; // Direction of data transfer - } __attribute__((packed)); - } ReqType_u; - - // 1 Request - uint8_t bRequest; - - // 2 Depends on bRequest - union { - uint16_t wValue; - - struct { - uint8_t wValueLo; - uint8_t wValueHi; - } __attribute__((packed)); - } wVal_u; - // 4 Depends on bRequest - uint16_t wIndex; - // 6 Depends on bRequest - uint16_t wLength; - // 8 bytes total -} __attribute__((packed)) SETUP_PKT, *PSETUP_PKT; - - -// little endian :-) 8 8 8 8 16 16 -#define mkSETUP_PKT8(bmReqType, bRequest, wValLo, wValHi, wInd, total) ((uint64_t)(((uint64_t)(bmReqType)))|(((uint64_t)(bRequest))<<8)|(((uint64_t)(wValLo))<<16)|(((uint64_t)(wValHi))<<24)|(((uint64_t)(wInd))<<32)|(((uint64_t)(total)<<48))) -#define mkSETUP_PKT16(bmReqType, bRequest, wVal, wInd, total) ((uint64_t)(((uint64_t)(bmReqType)))|(((uint64_t)(bRequest))<<8)|(((uint64_t)(wVal ))<<16) |(((uint64_t)(wInd))<<32)|(((uint64_t)(total)<<48))) - -// Big endian -- but we aren't able to use this :-/ -//#define mkSETUP_PKT8(bmReqType, bRequest, wValLo, wValHi, wInd, total) ((uint64_t)(((uint64_t)(bmReqType))<<56)|(((uint64_t)(bRequest))<<48)|(((uint64_t)(wValLo))<<40)|(((uint64_t)(wValHi))<<32)|(((uint64_t)(wInd))<<16)|((uint64_t)(total))) -//#define mkSETUP_PKT16(bmReqType, bRequest, wVal, wInd, total) ((uint64_t)(((uint64_t)(bmReqType))<<56)|(((uint64_t)(bRequest))<<48) |(((uint64_t)(wVal))<<32) |(((uint64_t)(wInd))<<16)|((uint64_t)(total))) - -#endif /* USBCORE_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_address.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_address.h deleted file mode 100644 index 4d9d35bd6d..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_address.h +++ /dev/null @@ -1,248 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#if !defined(_UHS_host_h_) || defined(__ADDRESS_H__) -#error "Never include UHS_address.h directly; include UHS_Usb.h instead" -#else -#define __ADDRESS_H__ - - - -/* NAK powers. To save space in endpoint data structure, amount of retries before giving up and returning 0x4 is stored in */ -/* bmNakPower as a power of 2. The actual nak_limit is then calculated as nak_limit = ( 2^bmNakPower - 1) */ -#define UHS_USB_NAK_MAX_POWER 14 // NAK binary order maximum value -#define UHS_USB_NAK_DEFAULT 13 // default 16K-1 NAKs before giving up -#define UHS_USB_NAK_NOWAIT 1 // Single NAK stops transfer -#define UHS_USB_NAK_NONAK 0 // Do not count NAKs, stop retrying after USB Timeout. Try not to use this. - -#define bmUSB_DEV_ADDR_PORT 0x07 -#define bmUSB_DEV_ADDR_PARENT 0x78 -#define bmUSB_DEV_ADDR_HUB 0x40 - -// TODO: embed parent? -struct UHS_EpInfo { - uint8_t epAddr; // Endpoint address - uint8_t bIface; - uint16_t maxPktSize; // Maximum packet size - - union { - uint8_t epAttribs; - - struct { - uint8_t bmSndToggle : 1; // Send toggle, when zero bmSNDTOG0, bmSNDTOG1 otherwise - uint8_t bmRcvToggle : 1; // Send toggle, when zero bmRCVTOG0, bmRCVTOG1 otherwise - uint8_t bmNeedPing : 1; // 1 == ping protocol needed for next out packet - uint8_t bmNakPower : 5; // Binary order for NAK_LIMIT value - } __attribute__((packed)); - }; -} __attribute__((packed)); - -// TODO: embed parent address and port into epinfo struct, -// and nuke this address stupidity. -// This is a compact scheme. Should also support full spec. -// This produces a 7 hub limit, 49 devices + 7 hubs, 56 total. -// -// 7 6 5 4 3 2 1 0 -// --------------------------------- -// | | H | P | P | P | A | A | A | -// --------------------------------- -// -// H - if 1 the address is a hub address -// P - parent hub number -// A - port number of parent -// - -struct UHS_DeviceAddress { - - union { - - struct { - uint8_t bmAddress : 3; // port number - uint8_t bmParent : 3; // parent hub address - uint8_t bmHub : 1; // hub flag - uint8_t bmReserved : 1; // reserved, must be zero - } __attribute__((packed)); - uint8_t devAddress; - }; -} __attribute__((packed)); - -struct UHS_Device { - volatile UHS_EpInfo *epinfo[UHS_HOST_MAX_INTERFACE_DRIVERS]; // endpoint info pointer - UHS_DeviceAddress address; - uint8_t epcount; // number of endpoints - uint8_t speed; // indicates device speed -} __attribute__((packed)); - -typedef void (*UsbDeviceHandleFunc)(UHS_Device *pdev); - -class AddressPool { - UHS_EpInfo dev0ep; //Endpoint data structure used during enumeration for uninitialized device - - // In order to avoid hub address duplication, this should use bits - uint8_t hubCounter; // hub counter - - UHS_Device thePool[UHS_HOST_MAX_INTERFACE_DRIVERS]; - - // Initializes address pool entry - - void UHS_NI InitEntry(uint8_t index) { - thePool[index].address.devAddress = 0; - thePool[index].epcount = 1; - thePool[index].speed = 0; - for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { - thePool[index].epinfo[i] = &dev0ep; - } - }; - - // Returns thePool index for a given address - - uint8_t UHS_NI FindAddressIndex(uint8_t address = 0) { - for(uint8_t i = 1; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { - if(thePool[i].address.devAddress == address) - return i; - } - return 0; - }; - - // Returns thePool child index for a given parent - - uint8_t UHS_NI FindChildIndex(UHS_DeviceAddress addr, uint8_t start = 1) { - for(uint8_t i = (start < 1 || start >= UHS_HOST_MAX_INTERFACE_DRIVERS) ? 1 : start; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { - if(thePool[i].address.bmParent == addr.bmAddress) - return i; - } - return 0; - }; - - // Frees address entry specified by index parameter - - void UHS_NI FreeAddressByIndex(uint8_t index) { - // Zero field is reserved and should not be affected - if(index == 0) - return; - - UHS_DeviceAddress uda = thePool[index].address; - // If a hub was switched off all port addresses should be freed - if(uda.bmHub == 1) { - for(uint8_t i = 1; (i = FindChildIndex(uda, i));) - FreeAddressByIndex(i); - - // FIXME: use BIT MASKS - // If the hub had the last allocated address, hubCounter should be decremented - if(hubCounter == uda.bmAddress) - hubCounter--; - } - InitEntry(index); - } - - void InitAllAddresses() { - for(uint8_t i = 1; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) InitEntry(i); - hubCounter = 0; - }; -public: - - AddressPool() { - hubCounter = 0; - // Zero address is reserved - InitEntry(0); - - thePool[0].epinfo[0] = &dev0ep; - dev0ep.epAddr = 0; -#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - dev0ep.maxPktSize = 0x40; //starting at 0x40 and work down -#else - dev0ep.maxPktSize = 0x08; -#endif - dev0ep.epAttribs = 0; //set DATA0/1 toggles to 0 - dev0ep.bmNakPower = UHS_USB_NAK_MAX_POWER; - InitAllAddresses(); - }; - - // Returns a pointer to a specified address entry - - UHS_Device* UHS_NI GetUsbDevicePtr(uint8_t addr) { - if(!addr) - return thePool; - - uint8_t index = FindAddressIndex(addr); - - return (!index) ? NULL : &thePool[index]; - }; - - - // Allocates new address - - uint8_t UHS_NI AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 1) { - /* if (parent != 0 && port == 0) - USB_HOST_SERIAL.println("PRT:0"); */ - UHS_DeviceAddress _parent; - _parent.devAddress = parent; - if(_parent.bmReserved || port > 7) - //if(parent > 127 || port > 7) - return 0; - - // FIXME: use BIT MASKS - if(is_hub && hubCounter == 7) - return 0; - - // finds first empty address entry starting from one - uint8_t index = FindAddressIndex(0); - - if(!index) // if empty entry is not found - return 0; - - UHS_DeviceAddress addr; - addr.devAddress = port; - addr.bmParent = _parent.bmAddress; - - // FIXME: use BIT MASKS - if(is_hub) { - hubCounter++; - addr.bmHub = 1; - addr.bmAddress = hubCounter; - } - thePool[index].address = addr; -#if DEBUG_PRINTF_EXTRA_HUGE -#ifdef UHS_DEBUG_USB_ADDRESS - printf("Address: %x (%x.%x.%x)\r\n", addr.devAddress, addr.bmHub, addr.bmParent, addr.bmAddress); -#endif -#endif - return thePool[index].address.devAddress; - }; - - void UHS_NI FreeAddress(uint8_t addr) { - // if the root hub is disconnected all the addresses should be initialized - if(addr == 0x41) { - InitAllAddresses(); - return; - } - uint8_t index = FindAddressIndex(addr); - FreeAddressByIndex(index); - }; - -}; - -#endif // __ADDRESS_H__ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_hexdump.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_hexdump.h deleted file mode 100644 index 945512cfcc..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_hexdump.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ -#if !defined(_usb_h_) || defined(__HEXDUMP_H__) -#error "Never include UHS_hexdump.h directly; include UHS_Usb.h instead" -#else -#define __HEXDUMP_H__ - -extern int UsbDEBUGlvl; - -template -class HexDumper : public BASE_CLASS { - uint8_t byteCount; - OFFSET_TYPE byteTotal; - -public: - - HexDumper() : byteCount(0), byteTotal(0) { - }; - - void Initialize() { - byteCount = 0; - byteTotal = 0; - }; - - virtual void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset); -}; - -template -void HexDumper::Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset) { - if(UsbDEBUGlvl >= 0x80) { // Fully bypass this block of code if we do not debug. - for(LEN_TYPE j = 0; j < len; j++, byteCount++, byteTotal++) { - if(!byteCount) { - PrintHex (byteTotal, 0x80); - E_Notify(PSTR(": "), 0x80); - } - PrintHex (pbuf[j], 0x80); - E_Notify(PSTR(" "), 0x80); - - if(byteCount == 15) { - E_Notify(PSTR("\r\n"), 0x80); - byteCount = 0xFF; - } - } - } -} - -#endif // __HEXDUMP_H__ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host.h deleted file mode 100644 index 5d711c1f74..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host.h +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ -/* USB functions */ -#ifndef _UHS_host_h_ -#define _UHS_host_h_ - -// WARNING: Do not change the order of includes, or stuff will break! -#include -#include -#include -#include - -#if DISABLED(USE_UHS3_USB) -#include -#include -#include -#include -#endif -#include "UHS_macros.h" - -// None of these should ever be directly included by a driver, or a user's sketch. -#include "../dyn_SWI/dyn_SWI.h" -#include "UHS_USB_IDs.h" -#include "UHS_settings.h" -#include "UHS_usb_ch9.h" -#include "UHS_UsbCore.h" -#include "UHS_address.h" -#include "UHS_usbhost.h" -#include "UHS_printhex.h" -#include "UHS_message.h" - -// Load system components as required -#if defined(LOAD_USB_HOST_SYSTEM) && !defined(USB_HOST_SYSTEM_LOADED) -#include "UHS_util_INLINE.h" -#include "UHS_host_INLINE.h" -#include "UHS_printf_HELPER.h" - -#ifdef LOAD_USB_HOST_SHIELD -#include "USB_HOST_SHIELD/USB_HOST_SHIELD.h" -#endif - -#if defined(LOAD_UHS_KINETIS_FS_HOST) && !defined(UHS_KINETIS_FS_HOST_LOADED) -#include "UHS_KINETIS_FS_HOST/UHS_KINETIS_FS_HOST.h" -#endif - -#if defined(LOAD_UHS_KINETIS_EHCI) && !defined(UHS_KINETIS_EHCI_LOADED) -#include "UHS_KINETIS_EHCI/UHS_KINETIS_EHCI.h" -#endif - -// Load USB drivers and multiplexers - -#ifdef LOAD_UHS_HUB -#include "UHS_HUB/UHS_HUB.h" -#endif // HUB loaded - -#ifdef LOAD_UHS_BULK_STORAGE -#include "UHS_BULK_STORAGE/UHS_BULK_STORAGE.h" -#endif - -#ifdef LOAD_GENERIC_STORAGE -#include "../UHS_FS/UHS_FS.h" -#endif -// Add BT and optionally HID if directed to do so -#ifdef LOAD_UHS_BT -#include "UHS_BT/UHS_BT.h" -#endif // BT and optionally HID loaded - -// Add HID -#ifdef LOAD_UHS_HID -#include "UHS_HID/UHS_HID.h" -#endif // HID loaded - -// Add CDC multiplexers (currently only ACM) -#if defined(LOAD_UHS_CDC_ACM) || defined(LOAD_UHS_CDC_ACM_FTDI) || defined(LOAD_UHS_CDC_ACM_PROLIFIC) || defined(LOAD_UHS_CDC_ACM_XR21B1411) -#include "UHS_CDC/UHS_CDC.h" -#endif // CDC loaded - -#ifdef LOAD_UHS_ADK -#include "UHS_ADK/UHS_ADK.h" -#endif - -#ifdef LOAD_UHS_MIDI -#include "UHS_MIDI/UHS_MIDI.h" -#endif - -#endif // System code loaded - -#endif // _UHS_host_h_ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h deleted file mode 100644 index 9c7b5001c0..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ /dev/null @@ -1,1222 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#if defined(LOAD_USB_HOST_SYSTEM) && !defined(USB_HOST_SYSTEM_LOADED) -#define USB_HOST_SYSTEM_LOADED - -#ifndef DEBUG_PRINTF_EXTRA_HUGE_UHS_HOST -#define DEBUG_PRINTF_EXTRA_HUGE_UHS_HOST 0 -#endif - -#if DEBUG_PRINTF_EXTRA_HUGE -#if DEBUG_PRINTF_EXTRA_HUGE_UHS_HOST -#define HOST_DEBUG(...) printf(__VA_ARGS__) -#else -#define HOST_DEBUG(...) VOID0 -#endif -#else -#define HOST_DEBUG(...) VOID0 -#endif - -UHS_EpInfo* UHS_USB_HOST_BASE::getEpInfoEntry(uint8_t addr, uint8_t ep) { - UHS_Device *p = addrPool.GetUsbDevicePtr(addr); - - if(!p || !p->epinfo) - return NULL; - - - UHS_EpInfo *pep; - for(uint8_t j = 0; j < UHS_HOST_MAX_INTERFACE_DRIVERS; j++) { - pep = (UHS_EpInfo *)(p->epinfo[j]); - - for(uint8_t i = 0; i < p->epcount; i++) { - if((pep)->epAddr == ep) { - HOST_DEBUG("ep entry for interface %d ep %d max packet size = %d\r\n", pep->bIface, ep, pep->maxPktSize); - return pep; - } - - pep++; - } - } - return NULL; -} - -/** - * Sets a device table entry for a device. - * Each device is different and has different number of endpoints. - * This function plugs endpoint record structure, defined in application, to devtable - * - * @param addr device address - * @param epcount how many endpoints - * @param eprecord pointer to the endpoint structure - * @return Zero for success, or error code - */ -uint8_t UHS_USB_HOST_BASE::setEpInfoEntry(uint8_t addr, uint8_t iface, uint8_t epcount, volatile UHS_EpInfo* eprecord) { - if(!eprecord) - return UHS_HOST_ERROR_BAD_ARGUMENT; - - UHS_Device *p = addrPool.GetUsbDevicePtr(addr); - - if(!p) - return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; - - p->address.devAddress = addr; - p->epinfo[iface] = eprecord; - p->epcount = epcount; - return 0; -} - -/** - * sets all enpoint addresses to zero. - * Sets all max packet sizes to defaults - * Clears all endpoint attributes - * Sets bmNakPower to USB_NAK_DEFAULT - * Sets binterface to zero. - * Sets bNumEP to zero. - * Sets bAddress to zero. - * Clears qNextPollTime and sets bPollEnable to false. - * - * @param maxep How many endpoints to initialize - * @param device pointer to the device driver instance (this) - */ - -void UHS_USB_HOST_BASE::DeviceDefaults(uint8_t maxep, UHS_USBInterface *interface) { - - for(uint8_t i = 0; i < maxep; i++) { - interface->epInfo[i].epAddr = 0; - interface->epInfo[i].maxPktSize = (i) ? 0 : 8; - interface->epInfo[i].epAttribs = 0; - interface->epInfo[i].bmNakPower = UHS_USB_NAK_DEFAULT; - } - interface->pUsb->GetAddressPool()->FreeAddress(interface->bAddress); - interface->bIface = 0; - interface->bNumEP = 1; - interface->bAddress = 0; - interface->qNextPollTime = 0; - interface->bPollEnable = false; -} - -/** - * Perform a bus reset to the port of the connected device - * - * @param parent index to Parent - * @param port what port on the parent - * @param address address of the device - * @return Zero for success, or error code - */ - -uint8_t UHS_USB_HOST_BASE::doSoftReset(uint8_t parent, uint8_t port, uint8_t address) { - uint8_t rcode = 0; - - if(parent == 0) { - // Send a bus reset on the root interface. - doHostReset(); - } else { - // reset parent port - devConfig[parent]->ResetHubPort(port); - } - - // - // Many devices require a delay before setting the address here... - // We loop upon fails for up to 2 seconds instead. - // Most devices will be happy without a retry. - // - uint8_t retries = 0; - if(address) { - do { - rcode = setAddr(0, address); - if(!rcode) break; - retries++; - sof_delay(10); - } while(retries < 200); - HOST_DEBUG("%i retries.\r\n", retries); - } else { -#if DEBUG_PRINTF_EXTRA_HUGE - printf("\r\ndoSoftReset called with address == 0.\r\n"); -#endif - } - return rcode; -} - -/* - * Pseudo code so you may understand the code flow. - * - * reset; (happens at the lower level) - * GetDevDescr(); - * reset; - * If there are no configuration descriptors { - * // - * // Note: I know of no device that does this. - * // I suppose there could be one though. - * // - * try to enumerate. - * } else { - * last success count = 0 - * best config = 0 - * for each configuration descriptor { - * for each interface descriptor { - * get the endpoint descriptors for this interface. - * Check to see if a driver can handle this interface. - * If it can, add 1 to the success count. - * } - * if success count > last success count { - * best config = current config - * last success count = success count - * } - * } - * set the device config to the best config - * for each best config interface descriptor { - * initialize driver that can handle this interface config - * } - * } - * - * NOTES: - * 1: We do not need to save toggle states anymore and have not - * needed to for some time, because the lower level driver - * actually corrects wrong toggles on-the-fly for us. - * - * 2: We always do a second reset, since this stupid bug is - * actually part of the specification documents that I - * have found all over the net. Even Linux does it, and - * many devices actually EXPECT this behavior. Some devices - * will not enumerate without it. For devices that do not - * need it, the additional reset is harmless. Here is an - * example of one of these documents, see page Five: - * https://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_113_Simplified%20Description%20of%20USB%20Device%20Enumeration.pdf - * - */ - -/** - * Enumerates interfaces on devices - * - * @param parent index to Parent - * @param port what port on the parent - * @param speed the speed of the device - * @return Zero for success, or error code - */ -uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t speed) { - //uint8_t bAddress = 0; - HOST_DEBUG("\r\n\r\n\r\nConfiguring: parent = %i, port = %i, speed = %i\r\n", parent, port, speed); - uint8_t rcode = 0; - uint8_t retries = 0; - uint8_t numinf = 0; - uint8_t configs; - UHS_Device *p = NULL; - //EpInfo epInfo; // cap at 16, this should be fairly reasonable. - ENUMERATION_INFO ei; - uint8_t bestconf = 0; - uint8_t bestsuccess = 0; - - uint8_t devConfigIndex; - -#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - const uint8_t biggest = 0x40; - // wrap in {} to throw away the 64 byte buffer when we are done with it - { - uint8_t buf[biggest]; - USB_FD_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); -#else - const uint8_t biggest = 18; - uint8_t buf[biggest]; - USB_FD_DEVICE_DESCRIPTOR *udd = reinterpret_cast(buf); - USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); -#endif - - //for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { - // if((devConfig[devConfigIndex]->bAddress) && (!devConfig[devConfigIndex]->bPollEnable)) { - // devConfig[devConfigIndex]->bAddress = 0; - // } - //} - // Serial.print("HOST USB Host @ 0x"); - // Serial.println((uint32_t)this, HEX); - // Serial.print("HOST USB Host Address Pool @ 0x"); - // Serial.println((uint32_t)GetAddressPool(), HEX); - - sof_delay(200); - p = addrPool.GetUsbDevicePtr(0); - if(!p) { - HOST_DEBUG("Configuring error: USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL\r\n"); - return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; - } - - p->speed = speed; -#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - - p->epinfo[0][0].maxPktSize = 0x40; // Windows bug is expected. - // poison data - // udd->bMaxPacketSize0 = 0U; -#else - p->epinfo[0][0].maxPktSize = 0x08; // USB Spec, start small, work your way up. -#endif -again: - memset((void *)buf, 0, biggest); - HOST_DEBUG("\r\n\r\nConfiguring PktSize 0x%2.2x, rcode: 0x%2.2x, retries %i,\r\n", p->epinfo[0][0].maxPktSize, rcode, retries); - rcode = getDevDescr(0, biggest, (uint8_t*)buf); -#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - if(rcode || udd->bMaxPacketSize0 < 8) -#else - if(rcode) -#endif - { - if(rcode == UHS_HOST_ERROR_JERR && retries < 4) { - // - // Some devices return JERR when plugged in. - // Attempts to reinitialize the device usually works. - // - // I have a hub that will refuse to work and acts like - // this unless external power is supplied. - // So this may not always work, and you may be fooled. - // - sof_delay(100); - retries++; - goto again; -#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - } else if(((rcode == UHS_HOST_ERROR_DMA || rcode == UHS_HOST_ERROR_MEM_LAT) && retries < 4) || (udd->bMaxPacketSize0 < 8 && !rcode)) { - - if(p->epinfo[0][0].maxPktSize > 8 && rcode == UHS_HOST_ERROR_DMA) p->epinfo[0][0].maxPktSize = p->epinfo[0][0].maxPktSize >> 1; -#else - } else if((rcode == UHS_HOST_ERROR_DMA || rcode == UHS_HOST_ERROR_MEM_LAT) && retries < 4) { - if(p->epinfo[0][0].maxPktSize < 32) p->epinfo[0][0].maxPktSize = p->epinfo[0][0].maxPktSize << 1; -#endif - HOST_DEBUG("Configuring error: 0x%2.2x UHS_HOST_ERROR_DMA. Retry with maxPktSize: %i\r\n", rcode, p->epinfo[0][0].maxPktSize); - doSoftReset(parent, port, 0); - retries++; - sof_delay(200); - goto again; - } - HOST_DEBUG("Configuring error: 0x%2.2x Can't get USB_FD_DEVICE_DESCRIPTOR\r\n", rcode); - return rcode; - } - - -#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - ei.address = addrPool.AllocAddress(parent, false, port); - - if(!ei.address) { - return UHS_HOST_ERROR_ADDRESS_POOL_FULL; - } - - p = addrPool.GetUsbDevicePtr(ei.address); - // set to 1 if you suspect address table corruption. -#if 0 - if(!p) { - return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; - } -#endif - - p->speed = speed; - - rcode = doSoftReset(parent, port, ei.address); - - if(rcode) { - addrPool.FreeAddress(ei.address); - HOST_DEBUG("Configuring error: %2.2x Can't set USB INTERFACE ADDRESS\r\n", rcode); - return rcode; - } - - { // the { } wrapper saves on stack. - HOST_DEBUG("DevDescr 2nd poll, bMaxPacketSize0:%u\r\n", udd->bMaxPacketSize0); - UHS_EpInfo dev1ep; - dev1ep.maxPktSize = udd->bMaxPacketSize0; - dev1ep.epAddr = 0; - dev1ep.epAttribs = 0; - dev1ep.bmNakPower = UHS_USB_NAK_MAX_POWER; - p->address.devAddress = ei.address; - p->epcount = 1; - p->epinfo[0] = &dev1ep; - - sof_delay(10); - memset((void *)buf, 0, biggest); - rcode = getDevDescr(ei.address, 18, (uint8_t*)buf); - if(rcode) HOST_DEBUG("getDevDescr err: 0x%x \r\n", rcode); - - addrPool.FreeAddress(ei.address); - if(rcode && rcode != UHS_HOST_ERROR_DMA) { - return rcode; - } - sof_delay(10); - } -#endif - - ei.vid = udd->idVendor; - ei.pid = udd->idProduct; - ei.bcdDevice = udd->bcdDevice; - ei.klass = udd->bDeviceClass; - ei.subklass = udd->bDeviceSubClass; - ei.protocol = udd->bDeviceProtocol; - ei.bMaxPacketSize0 = udd->bMaxPacketSize0; - ei.currentconfig = 0; - ei.parent = parent; - ei.port = port; - configs = udd->bNumConfigurations; -#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - } // unwrapped, old large buf now invalid and discarded. - - uint8_t buf[18]; - USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); -#endif - - ei.address = addrPool.AllocAddress(parent, IsHub(ei.klass), port); - - if(!ei.address) { - return UHS_HOST_ERROR_ADDRESS_POOL_FULL; - } - - p = addrPool.GetUsbDevicePtr(ei.address); - // set to 1 if you suspect address table corruption. -#if 0 - if(!p) { - return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; - } -#endif - - p->speed = speed; - - rcode = doSoftReset(parent, port, ei.address); - - if(rcode) { - addrPool.FreeAddress(ei.address); - HOST_DEBUG("Configuring error: %2.2x Can't set USB INTERFACE ADDRESS\r\n", rcode); - return rcode; - } - - if(configs < 1) { - HOST_DEBUG("No interfaces?!\r\n"); - addrPool.FreeAddress(ei.address); - // rcode = TestInterface(&ei); - // Not implemented (yet) - rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED; - } else { - HOST_DEBUG("configs: %i\r\n", configs); - for(uint8_t conf = 0; (!rcode) && (conf < configs); conf++) { - // read the config descriptor into a buffer. - rcode = getConfDescr(ei.address, sizeof (USB_FD_CONFIGURATION_DESCRIPTOR), conf, buf); - if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR\r\n", rcode); - rcode = UHS_HOST_ERROR_FailGetConfDescr; - continue; - } - ei.currentconfig = conf; - numinf = ucd->bNumInterfaces; // Does _not_ include alternates! - HOST_DEBUG("CONFIGURATION: %i, bNumInterfaces %i, wTotalLength %i\r\n", conf, numinf, ucd->wTotalLength); - uint8_t success = 0; - uint16_t inf = 0; - uint8_t data[ei.bMaxPacketSize0]; - UHS_EpInfo *pep; - pep = ctrlReqOpen(ei.address, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, ei.currentconfig, USB_DESCRIPTOR_CONFIGURATION, 0x0000U, ucd->wTotalLength), data); - if(!pep) { - rcode = UHS_HOST_ERROR_NULL_EPINFO; - continue; - } - uint16_t left; - uint16_t read; - uint8_t offset; - rcode = initDescrStream(&ei, ucd, pep, data, &left, &read, &offset); - if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); - break; - } - for(; (numinf) && (!rcode); inf++) { - // iterate for each interface on this config - rcode = getNextInterface(&ei, pep, data, &left, &read, &offset); - if(rcode == UHS_HOST_ERROR_END_OF_STREAM) { - HOST_DEBUG("USB_INTERFACE END OF STREAM\r\n"); - ctrlReqClose(pep, UHS_bmREQ_GET_DESCR, left, ei.bMaxPacketSize0, data); - rcode = 0; - break; - } - if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't close USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); - continue; - } - rcode = TestInterface(&ei); - if(!rcode) success++; - rcode = 0; - } - if(!inf) { - rcode = TestInterface(&ei); - if(!rcode) success++; - rcode = 0; - } - if(success > bestsuccess) { - bestconf = conf; - bestsuccess = success; - } - } - if(!bestsuccess) rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED; - } - if(!rcode) { - rcode = getConfDescr(ei.address, sizeof (USB_FD_CONFIGURATION_DESCRIPTOR), bestconf, buf); - if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR\r\n", rcode); - rcode = UHS_HOST_ERROR_FailGetConfDescr; - } - } - if(!rcode) { - bestconf++; - ei.currentconfig = bestconf; - numinf = ucd->bNumInterfaces; // Does _not_ include alternates! - HOST_DEBUG("CONFIGURATION: %i, bNumInterfaces %i, wTotalLength %i\r\n", bestconf, numinf, ucd->wTotalLength); - if(!rcode) { - HOST_DEBUG("Best configuration is %i, enumerating interfaces.\r\n", bestconf); - uint16_t inf = 0; - uint8_t data[ei.bMaxPacketSize0]; - UHS_EpInfo *pep; - pep = ctrlReqOpen(ei.address, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, ei.currentconfig - 1, USB_DESCRIPTOR_CONFIGURATION, 0x0000U, ucd->wTotalLength), data); - if(!pep) { - rcode = UHS_HOST_ERROR_NULL_EPINFO; - - } else { - uint16_t left; - uint16_t read; - uint8_t offset; - rcode = initDescrStream(&ei, ucd, pep, data, &left, &read, &offset); - if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); - } else { - for(; (numinf) && (!rcode); inf++) { - // iterate for each interface on this config - rcode = getNextInterface(&ei, pep, data, &left, &read, &offset); - if(rcode == UHS_HOST_ERROR_END_OF_STREAM) { - ctrlReqClose(pep, UHS_bmREQ_GET_DESCR, left, ei.bMaxPacketSize0, data); - rcode = 0; - break; - } - if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't close USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); - continue; - } - - if(enumerateInterface(&ei) == UHS_HOST_MAX_INTERFACE_DRIVERS) { - HOST_DEBUG("No interface driver for this interface."); - } else { - HOST_DEBUG("Interface Configured\r\n"); - } - } - } - } - } else { - HOST_DEBUG("Configuring error: %2.2x Can't set USB_INTERFACE_CONFIG stream.\r\n", rcode); - } - } - - if(!rcode) { - rcode = setConf(ei.address, bestconf); - if(rcode) { - HOST_DEBUG("Configuring error: %2.2x Can't set Configuration.\r\n", rcode); - addrPool.FreeAddress(ei.address); - } else { - for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { - HOST_DEBUG("Driver %i ", devConfigIndex); - if(!devConfig[devConfigIndex]) { - HOST_DEBUG("no driver at this index.\r\n"); - continue; // no driver - } - HOST_DEBUG("@ %2.2x ", devConfig[devConfigIndex]->bAddress); - if(devConfig[devConfigIndex]->bAddress) { - if(!devConfig[devConfigIndex]->bPollEnable) { - HOST_DEBUG("Initialize\r\n"); - rcode = devConfig[devConfigIndex]->Finalize(); - rcode = devConfig[devConfigIndex]->Start(); - if(!rcode) { - HOST_DEBUG("Total endpoints = (%i)%i\r\n", p->epcount, devConfig[devConfigIndex]->bNumEP); - } else { - break; - } - } else { - HOST_DEBUG("Already initialized.\r\n"); - continue; // consumed - } - } else { - HOST_DEBUG("Skipped\r\n"); - } - } -#if 0 // defined(UHS_HID_LOADED) - // Now do HID -#endif - } - } else { - addrPool.FreeAddress(ei.address); - } - return rcode; -} - -/** - * Removes a device from the tables - * - * @param addr address of the device - * @return nothing - */ -void UHS_USB_HOST_BASE::ReleaseDevice(uint8_t addr) { - if(addr) { -#if 0 // defined(UHS_HID_LOADED) - // Release any HID children - UHS_HID_Release(this, addr); -#endif - for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { - if(!devConfig[i]) continue; - if(devConfig[i]->bAddress == addr) { - devConfig[i]->Release(); - break; - } - } - } -} - -/** - * Gets the device descriptor, or part of it from endpoint Zero. - * - * @param addr Address of the device - * @param nbytes how many bytes to return - * @param dataptr pointer to the data to return - * @return status of the request, zero is success. - */ -uint8_t UHS_USB_HOST_BASE::getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr) { - return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes), nbytes, dataptr)); -} - -/** - * Gets the config descriptor, or part of it from endpoint Zero. - * - * @param addr Address of the device - * @param nbytes how many bytes to return - * @param conf index to descriptor to return - * @param dataptr ointer to the data to return - * @return status of the request, zero is success. - */ -uint8_t UHS_USB_HOST_BASE::getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { - return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes), nbytes, dataptr)); -} - -/** - * Get the string descriptor from a device - * - * @param addr Address of the device - * @param ns - * @param index - * @param langid language ID - * @param dataptr pointer to the data to return - * @return status of the request, zero is success. - */ -uint8_t UHS_USB_HOST_BASE::getStrDescr(uint8_t addr, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) { - return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns), ns, dataptr)); -} - -// -//set address -// - -/** - * Set the address of a device to a new address via endpoint Zero. - * - * @param oldaddr current address - * @param newaddr new address - * @return status of the request, zero is success. - */ -uint8_t UHS_USB_HOST_BASE::setAddr(uint8_t oldaddr, uint8_t newaddr) { - uint8_t rcode = ctrlReq(oldaddr, mkSETUP_PKT8(UHS_bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000), 0x0000, NULL); - sof_delay(300); // Older spec says you should wait at least 200ms - return rcode; -} - -// -//set configuration -// - -/** - * Set the configuration for the device to use via endpoint Zero. - * - * @param addr Address of the device - * @param conf_value configuration index value - * @return status of the request, zero is success. - */ -uint8_t UHS_USB_HOST_BASE::setConf(uint8_t addr, uint8_t conf_value) { - return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000), 0x0000, NULL)); -} - -/* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */ - -/** - * Writes data to an interface pipe - * - * @param addr Address of the device - * @param ep Endpoint of the pipe - * @param nbytes number of bytes to transfer - * @param data pointer to buffer to hold transfer - * @return zero for success or error code - */ -uint8_t UHS_USB_HOST_BASE::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) { - UHS_EpInfo *pep = NULL; - uint16_t nak_limit = 0; - HOST_DEBUG("outTransfer: addr: 0x%2.2x ep: 0x%2.2x nbytes: 0x%4.4x data: 0x%p\r\n", addr, ep, nbytes, data); - - uint8_t rcode = SetAddress(addr, ep, &pep, nak_limit); - HOST_DEBUG("outTransfer: SetAddress 0x%2.2x\r\n", rcode); - if(!rcode) - rcode = OutTransfer(pep, nak_limit, nbytes, data); - return rcode; -}; - -/** - * Reads data from an interface pipe - * - * @param addr Address of the device - * @param ep Endpoint of the pipe - * @param nbytesptr number of bytes to transfer - * @param data pointer to buffer to hold transfer - * @return zero for success or error code - */ -uint8_t UHS_USB_HOST_BASE::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data) { - UHS_EpInfo *pep = NULL; - uint16_t nak_limit = 0; - - uint8_t rcode = SetAddress(addr, ep, &pep, nak_limit); - - // if(rcode) { - // USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81); - // USBTRACE3("(USB::InTransfer) addr requested ", addr, 0x81); - // USBTRACE3("(USB::InTransfer) ep requested ", ep, 0x81); - // return rcode; - // } - if(!rcode) - rcode = InTransfer(pep, nak_limit, nbytesptr, data); - return rcode; - -} - -/** - * Initialize the descriptor stream, works much like opening a file. - * - * @param ei - * @param ucd - * @param pep - * @param data - * @param left - * @param read - * @param offset - * @return zero for success or error code - */ -uint8_t UHS_USB_HOST_BASE::initDescrStream(ENUMERATION_INFO *ei, USB_FD_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset) { - if(!ei || !ucd) return UHS_HOST_ERROR_BAD_ARGUMENT; - if(!pep) return UHS_HOST_ERROR_NULL_EPINFO; - *left = ucd->wTotalLength; - *read = 0; - *offset = 1; - uint8_t rcode; - pep->maxPktSize = ei->bMaxPacketSize0; - rcode = getone(pep, left, read, data, offset); - return rcode; -} - -uint8_t UHS_USB_HOST_BASE::getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pep, uint8_t data[], uint16_t *left, uint16_t *read, uint8_t *offset) { - uint16_t remain; - uint8_t ty; - uint8_t rcode = UHS_HOST_ERROR_END_OF_STREAM; - uint8_t *ptr; - uint8_t epc = 0; - ei->interface.numep = 0; - ei->interface.klass = 0; - ei->interface.subklass = 0; - ei->interface.protocol = 0; - while(*left + *read) { - remain = data[*offset]; // bLength - while(remain < 2) { - rcode = getone(pep, left, read, data, offset); - if(rcode) - return rcode; - remain = data[*offset]; - } - rcode = getone(pep, left, read, data, offset); - if(rcode) - return rcode; - ty = data[*offset]; // bDescriptorType - HOST_DEBUG("bLength: %i ", remain); - HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty); - remain--; - if(ty == USB_DESCRIPTOR_INTERFACE) { - HOST_DEBUG("INTERFACE DESCRIPTOR FOUND\r\n"); - ptr = (uint8_t *)(&(ei->interface.bInterfaceNumber)); - for(int i = 0; i < 6; i++) { - rcode = getone(pep, left, read, data, offset); - if(rcode) - return rcode; - *ptr = data[*offset]; - ptr++; - } - rcode = getone(pep, left, read, data, offset); - if(rcode) - return rcode; - // Now at iInterface - // Get endpoints. - HOST_DEBUG("Getting %i endpoints\r\n", ei->interface.numep); - while(epc < ei->interface.numep) { - rcode = getone(pep, left, read, data, offset); - if(rcode) { - HOST_DEBUG("ENDPOINT DESCRIPTOR DIED WAY EARLY\r\n"); - return rcode; - } - remain = data[*offset]; // bLength - while(remain < 2) { - rcode = getone(pep, left, read, data, offset); - if(rcode) - return rcode; - remain = data[*offset]; - } - rcode = getone(pep, left, read, data, offset); - if(rcode) { - HOST_DEBUG("ENDPOINT DESCRIPTOR DIED EARLY\r\n"); - return rcode; - } - ty = data[*offset]; // bDescriptorType - HOST_DEBUG("bLength: %i ", remain); - HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty); - remain -= 2; - if(ty == USB_DESCRIPTOR_ENDPOINT) { - HOST_DEBUG("ENDPOINT DESCRIPTOR: %i\r\n", epc); - ptr = (uint8_t *)(&(ei->interface.epInfo[epc].bEndpointAddress)); - for(unsigned int i = 0; i< sizeof (ENDPOINT_INFO); i++) { - rcode = getone(pep, left, read, data, offset); - if(rcode) { - HOST_DEBUG("ENDPOINT DESCRIPTOR DIED LATE\r\n"); - return rcode; - } - *ptr = data[*offset]; - ptr++; - remain--; - } - epc++; - HOST_DEBUG("ENDPOINT DESCRIPTOR OK\r\n"); - } - rcode = eat(pep, left, read, data, offset, &remain); - if(rcode) { - HOST_DEBUG("ENDPOINT DESCRIPTOR DIED EATING\r\n"); - return rcode; - } - remain = 0; - } - remain = 1; - // queue ahead, but do not report if error. - rcode = eat(pep, left, read, data, offset, &remain); - if(!ei->interface.numep && rcode) { - return rcode; - } - HOST_DEBUG("ENDPOINT DESCRIPTORS FILLED\r\n"); - return 0; - } else { - rcode = eat(pep, left, read, data, offset, &remain); - if(rcode) - return rcode; - } - rcode = UHS_HOST_ERROR_END_OF_STREAM; - } - return rcode; -} - -uint8_t UHS_USB_HOST_BASE::seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_FD_CONFIGURATION_DESCRIPTOR *ucd) { - if(!ei || !ucd) return UHS_HOST_ERROR_BAD_ARGUMENT; - uint8_t data[ei->bMaxPacketSize0]; - UHS_EpInfo *pep; - pep = ctrlReqOpen(ei->address, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, ei->currentconfig, - USB_DESCRIPTOR_CONFIGURATION, 0x0000U, ucd->wTotalLength), data); - if(!pep) return UHS_HOST_ERROR_NULL_EPINFO; - uint16_t left = ucd->wTotalLength; - uint8_t cinf = 0; - uint8_t ty; - uint8_t epc = 0; - uint16_t remain = ucd->bLength; - uint16_t read = 0; - uint8_t offset = remain; - uint8_t *ptr; - uint8_t rcode; - ei->interface.numep = 0; - ei->interface.klass = 0; - ei->interface.subklass = 0; - ei->interface.protocol = 0; - pep->maxPktSize = ei->bMaxPacketSize0; - - rcode = getone(pep, &left, &read, data, &offset); - if(rcode) - return rcode; - HOST_DEBUG("\r\nGetting interface: %i\r\n", inf); - inf++; - while(cinf != inf && (left + read)) { - //HOST_DEBUG("getInterface: cinf: %i inf: %i left: %i read: %i offset: %i remain %i\r\n", cinf, inf, left, read, offset, remain); - // Go past current descriptor - HOST_DEBUG("Skip: %i\r\n", remain); - rcode = eat(pep, &left, &read, data, &offset, &remain); - if(rcode) - return rcode; - remain = data[offset]; // bLength - while(remain < 2) { - rcode = getone(pep, &left, &read, data, &offset); - if(rcode) - return rcode; - remain = data[offset]; - } - rcode = getone(pep, &left, &read, data, &offset); - if(rcode) - return rcode; - ty = data[offset]; // bDescriptorType - HOST_DEBUG("bLength: %i ", remain); - HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty); - remain--; - if(ty == USB_DESCRIPTOR_INTERFACE) { - HOST_DEBUG("INTERFACE DESCRIPTOR: %i\r\n", cinf); - cinf++; - if(cinf == inf) { - // Get the interface descriptor information. - ptr = (uint8_t *)(&(ei->interface.bInterfaceNumber)); - for(int i = 0; i < 6; i++) { - rcode = getone(pep, &left, &read, data, &offset); - if(rcode) - return rcode; - *ptr = data[offset]; - ptr++; - } - rcode = getone(pep, &left, &read, data, &offset); - if(rcode) - return rcode; - // Now at iInterface - remain = 0; - // Get endpoints. - HOST_DEBUG("Getting %i endpoints\r\n", ei->interface.numep); - while(epc < ei->interface.numep) { - rcode = getone(pep, &left, &read, data, &offset); - if(rcode) - return rcode; - remain = data[offset]; // bLength - while(remain < 2) { - rcode = getone(pep, &left, &read, data, &offset); - if(rcode) - return rcode; - remain = data[offset]; - } - rcode = getone(pep, &left, &read, data, &offset); - if(rcode) - return rcode; - ty = data[offset]; // bDescriptorType - HOST_DEBUG("bLength: %i ", remain); - HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty); - remain--; - if(ty == USB_DESCRIPTOR_ENDPOINT) { - HOST_DEBUG("ENDPOINT DESCRIPTOR: %i\r\n", epc); - ptr = (uint8_t *)(&(ei->interface.epInfo[epc].bEndpointAddress)); - for(unsigned int i = 0; i< sizeof (ENDPOINT_INFO); i++) { - rcode = getone(pep, &left, &read, data, &offset); - if(rcode) - return rcode; - *ptr = data[offset]; - ptr++; - } - epc++; - remain = 0; - } else { - rcode = eat(pep, &left, &read, data, &offset, &remain); - if(rcode) - return rcode; - remain = 0; - } - } - } - } - } - - return ctrlReqClose(pep, UHS_bmREQ_GET_DESCR, left, ei->bMaxPacketSize0, data); -} - -uint8_t UHS_USB_HOST_BASE::getone(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset) { - uint8_t rcode = 0; - *offset += 1; - if(*offset < *read) { - return 0; - } else if(*left > 0) { - // uint16_t num = *left; - uint16_t num = pep->maxPktSize; - if(num > *left) num = *left; - *offset = 0; - rcode = ctrlReqRead(pep, left, read, num, dataptr); - if(rcode == 0) { - if(*read == 0) { - rcode = UHS_HOST_ERROR_END_OF_STREAM; - } else if(*read < num) *left = 0; - } - } else { - rcode = UHS_HOST_ERROR_END_OF_STREAM; - } - return rcode; -} - -uint8_t UHS_USB_HOST_BASE::eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset, uint16_t *yum) { - uint8_t rcode = 0; - HOST_DEBUG("eating %i\r\n", *yum); - while(*yum) { - *yum -= 1; - rcode = getone(pep, left, read, dataptr, offset); - if(rcode) break; - } - return rcode; -} - -uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr) { - //bool direction = bmReqType & 0x80; //request direction, IN or OUT - uint8_t rcode = 0; - - // Serial.println(""); - UHS_EpInfo *pep = ctrlReqOpen(addr, Request, dataptr); - if(!pep) { - HOST_DEBUG("ctrlReq1: ERROR_NULL_EPINFO addr: %d\r\n", addr); - return UHS_HOST_ERROR_NULL_EPINFO; - } - uint8_t rt = (uint8_t)(Request & 0xFFU); - - // Serial.println("Opened"); - uint16_t left = (uint16_t)(Request >> 48) /*total*/; - if(dataptr != NULL) { - //data stage - if((rt & 0x80) == 0x80) { - //IN transfer - while(left) { - // Bytes read into buffer - uint16_t read = nbytes; - HOST_DEBUG("ctrlReq2: left: %i, read:%i, nbytes %i\r\n", left, read, nbytes); - rcode = ctrlReqRead(pep, &left, &read, nbytes, dataptr); - -#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - HOST_DEBUG("RESULT: 0x%2.2x 0x%2.2x 0x%2.2x 0x%8.8lx%8.8lx\r\n", rcode, addr, read, (uint32_t)((Request>>32)&0xFFFFFFFFLU), (uint32_t)(Request&0xFFFFFFFFLU)); - // Should only be used for GET_DESCRIPTOR USB_DESCRIPTOR_DEVICE - constexpr uint32_t req_match = ((uint32_t)USB_DESCRIPTOR_DEVICE << 24) | - ((uint32_t)USB_REQUEST_GET_DESCRIPTOR << 8); - const uint32_t req_found = Request & 0xFF00FF00ul; - if(!addr && read && (req_found == req_match)) { - HOST_DEBUG("ctrlReq3: acceptBuffer sz %i nbytes %i left %i\n\r", read, nbytes, left); - left = 0; - rcode = UHS_HOST_ERROR_NONE; - break; - } -#endif - if(rcode) { - return rcode; - } - } - } else { - // OUT transfer - rcode = OutTransfer(pep, 0, nbytes, dataptr); - } - if(rcode) { - //return error - return ( rcode); - } - } - - // Serial.println("Close Phase"); - // Serial.flush(); - // Status stage - rcode = ctrlReqClose(pep, rt, left, nbytes, dataptr); - // Serial.println("Closed"); - return rcode; -} - -uint8_t UHS_USB_HOST_BASE::EPClearHalt(uint8_t addr, uint8_t ep) { - return ctrlReq(addr, mkSETUP_PKT8(USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT, USB_REQUEST_CLEAR_FEATURE, USB_FEATURE_ENDPOINT_HALT, 0, ep, 0), 0, NULL); -} - -uint8_t UHS_USB_HOST_BASE::TestInterface(ENUMERATION_INFO *ei) { - - uint8_t devConfigIndex; - uint8_t rcode = 0; - HOST_DEBUG("TestInterface VID:%4.4x PID:%4.4x Class:%2.2x Subclass:%2.2x Protocol %2.2x\r\n", ei->vid, ei->pid, ei->klass, ei->subklass, ei->protocol); - HOST_DEBUG("Interface data: Class:%2.2x Subclass:%2.2x Protocol %2.2x, number of endpoints %i\r\n", ei->interface.klass, ei->interface.subklass, ei->interface.subklass, ei->interface.numep); - HOST_DEBUG("Parent: %2.2x, bAddress: %2.2x\r\n", ei->parent, ei->address); - for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { - if(!devConfig[devConfigIndex]) { - HOST_DEBUG("No driver at index %i\r\n", devConfigIndex); - continue; // no driver - } - if(devConfig[devConfigIndex]->bAddress) { - HOST_DEBUG("Driver %i is already consumed @ %2.2x\r\n", devConfigIndex, devConfig[devConfigIndex]->bAddress); - continue; // consumed - } - - if(devConfig[devConfigIndex]->OKtoEnumerate(ei)) { - HOST_DEBUG("Driver %i supports this interface\r\n", devConfigIndex); - break; - } - } - if(devConfigIndex == UHS_HOST_MAX_INTERFACE_DRIVERS) { - rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED; -#if 0 // defined(UHS_HID_LOADED) - // Check HID here, if it is, then lie - if(ei->klass == UHS_USB_CLASS_HID) { - devConfigIndex = UHS_HID_INDEX; // for debugging, otherwise this has no use. - rcode = 0; - } -#endif - } - if(!rcode) HOST_DEBUG("Driver %i can be used for this interface\r\n", devConfigIndex); - else HOST_DEBUG("No driver for this interface.\r\n"); - return rcode; -}; - -uint8_t UHS_USB_HOST_BASE::enumerateInterface(ENUMERATION_INFO *ei) { - uint8_t devConfigIndex; - - HOST_DEBUG("AttemptConfig: parent = %i, port = %i\r\n", ei->parent, ei->port); - -#if 0 // defined(UHS_HID_LOADED) - // Check HID here, if it is, then lie - if(ei->klass == UHS_USB_CLASS_HID || ei->interface.klass == UHS_USB_CLASS_HID) { - UHS_HID_SetUSBInterface(this, ENUMERATION_INFO * ei); - devConfigIndex = UHS_HID_INDEX; - } else -#endif - for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { - if(!devConfig[devConfigIndex]) { - HOST_DEBUG("No driver at index %i\r\n", devConfigIndex); - continue; // no driver - } - if(devConfig[devConfigIndex]->bAddress) { - HOST_DEBUG("Driver %i is already consumed @ %2.2x\r\n", devConfigIndex, devConfig[devConfigIndex]->bAddress); - continue; // consumed - } - - if(devConfig[devConfigIndex]->OKtoEnumerate(ei)) { - HOST_DEBUG("Driver %i supports this interface\r\n", devConfigIndex); - if(!devConfig[devConfigIndex]->SetInterface(ei)) break; - else devConfigIndex = UHS_HOST_MAX_INTERFACE_DRIVERS; - } - } - return devConfigIndex; -}; - - -//////////////////////////////////////////////////////////////////////////////// -// Vendor Specific Interface Class -//////////////////////////////////////////////////////////////////////////////// - -#if 0 -/** - * Might go away, depends on if it is useful, or not. - * - * @param ei Enumeration information - * @return true if this interface driver can handle this interface description - */ -bool UHS_NI UHS_VSI::OKtoEnumerate(ENUMERATION_INFO *ei) { - return ( - (ei->subklass == UHS_USB_CLASS_VENDOR_SPECIFIC) || - (ei->interface.subklass == UHS_USB_CLASS_VENDOR_SPECIFIC) - ); -} - -/** - * Copy the entire ENUMERATION_INFO structure - * @param ei Enumeration information - * @return 0 - */ -uint8_t UHS_NI UHS_VSI::SetInterface(ENUMERATION_INFO *ei) { - bNumEP = 1; - bAddress = ei->address; - - eInfo.address = ei->address; - eInfo.bMaxPacketSize0 = ei->bMaxPacketSize0; - eInfo.currentconfig = ei->currentconfig; - eInfo.interface.bAlternateSetting = ei->interface.bAlternateSetting; - eInfo.interface.bInterfaceNumber = ei->interface.bInterfaceNumber; - eInfo.interface.numep = ei->interface.numep; - eInfo.interface.protocol = ei->interface.protocol; - eInfo.interface.subklass = ei->interface.subklass; - eInfo.klass = ei->klass; - eInfo.parent = ei->parent; - eInfo.pid = ei->pid; - eInfo.port = ei->port; - eInfo.protocol = ei->protocol; - eInfo.subklass = ei->subklass; - eInfo.vid = ei->vid; - for(uint8_t i = 0; i < eInfo.interface.numep; i++) { - eInfo.interface.epInfo[i].bEndpointAddress = ei->interface.epInfo[i].bEndpointAddress; - eInfo.interface.epInfo[i].bInterval = ei->interface.epInfo[i].bInterval; - eInfo.interface.epInfo[i].bmAttributes = ei->interface.epInfo[i].bmAttributes; - eInfo.interface.epInfo[i].wMaxPacketSize = ei->interface.epInfo[i].wMaxPacketSize; - } - return 0; -} -#endif - -//////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// - - -#if 0 - -/* TO-DO: Move this silliness to a NONE driver. - * When we have a generic NONE driver we can: - * o Extract ALL device information to help users with a new device. - * o Use an unknown device from a sketch, kind of like usblib does. - * This will aid in making more drivers in a faster way. - */ -uint8_t UHS_USB_HOST_BASE::DefaultAddressing(uint8_t parent, uint8_t port, uint8_t speed) { - uint8_t rcode; - UHS_Device *p0 = NULL, *p = NULL; - - // Get pointer to pseudo device with address 0 assigned - p0 = addrPool.GetUsbDevicePtr(0); - - if(!p0) - return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; - - if(!p0->epinfo) - return UHS_HOST_ERROR_NULL_EPINFO; - - p0->speed = speed; - - // Allocate new address according to device class - uint8_t bAddress = addrPool.AllocAddress(parent, false, port); - - if(!bAddress) - return UHS_HOST_ERROR_ADDRESS_POOL_FULL; - - p = addrPool.GetUsbDevicePtr(bAddress); - - if(!p) - return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; - - p->speed = speed; - - // Assign new address to the device - rcode = setAddr(0, bAddress); - - if(rcode) { - addrPool.FreeAddress(bAddress); - bAddress = 0; - return rcode; - } - return 0; -} -#endif - -#else -#error "Never include UHS_host_INLINE.h, include UHS_host.h instead" -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h deleted file mode 100644 index c5458208d2..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h +++ /dev/null @@ -1,392 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#ifndef MACROS_H -#define MACROS_H -#include "macro_logic.h" -/* - * Universal Arduino(tm) "IDE" fixups. - */ - - -// Just in case... -#ifndef SERIAL_PORT_MONITOR -#define SERIAL_PORT_MONITOR Serial -#endif - -#ifndef INT16_MIN -#define INT16_MIN -32768 -#endif -// require 10607+ -#if defined(ARDUINO) && ARDUINO >=10607 -// nop :-) -#else -#error "Arduino version too old, and must be at least 1.6.7" -#endif - -// Nuke screwed up macro junk from the IDE. -#ifdef __cplusplus -#ifdef true -#undef true -#endif -#ifdef false -#undef false -#endif -#endif - - -#ifndef UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE - -#ifndef UHS_BIG_FLASH - -#if defined(FLASHEND) && defined(FLASHSTART) -#if (FLASHEND - FLASHSTART) > 0x0FFFFU -#define UHS_BIG_FLASH 1 -#else -#define UHS_BIG_FLASH 0 -#endif - -#elif defined(__PIC32_FLASH_SIZE) -#if __PIC32_FLASH_SIZE > 511 -#define UHS_BIG_FLASH 1 -#else -#define UHS_BIG_FLASH 0 -#endif - -#elif defined(FLASHEND) && !defined(FLASHSTART) -// Assumes flash starts at 0x00000, is this a safe assumption? -// 192K + should be OK -#if FLASHEND > 0x02FFFFU -#define UHS_BIG_FLASH 1 -#else -#define UHS_BIG_FLASH 0 -#endif - -#elif defined(IFLASH_SIZE) -#if IFLASH_SIZE > 0x0FFFFU -#define UHS_BIG_FLASH 1 -#else -#define UHS_BIG_FLASH 0 -#endif - -#elif defined(ESP8266) -#define UHS_BIG_FLASH 1 -#define SYSTEM_OR_SPECIAL_YIELD(...) yield() - -#elif defined(__arm__) && defined(CORE_TEENSY) -#define UHS_BIG_FLASH 1 - -#elif defined(ARDUINO_spresense_ast) -#define UHS_BIG_FLASH 1 -#else -// safe default -#warning Small flash? -#define UHS_BIG_FLASH 0 -#endif -#endif - -#if UHS_BIG_FLASH -#define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 1 -#else -#define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 0 -#endif -#endif - -#if defined(__arm__) && defined(CORE_TEENSY) -#define UHS_PIN_WRITE(p, v) digitalWriteFast(p, v) -#define UHS_PIN_READ(p) digitalReadFast(p) -#endif -// TODO: Fast inline code for AVR and SAM based microcontrollers -// This can be done pretty easily. -// For now, this will just work out-of-the-box. -#ifndef UHS_PIN_WRITE -#define UHS_PIN_WRITE(p, v) digitalWrite(p, v) -#endif -#ifndef UHS_PIN_READ -#define UHS_PIN_READ(p) digitalRead(p) -#endif - -#if defined( __PIC32MX__ ) && !defined(interrupts) // compiling with Microchip XC32 compiler -#define interrupts() __builtin_enable_interrupts() -#edfine noInterrupts() __builtin_disable_interrupts() -#endif - -#ifndef ARDUINO_SAMD_ZERO -#ifdef ARDUINO_AVR_ADK -#define UHS_GET_DPI(x) (x == 54 ? 6 : digitalPinToInterrupt(x)) -#else -#define UHS_GET_DPI(x) digitalPinToInterrupt(x) -#endif -#else -#define UHS_GET_DPI(x) (x) -#endif - -#ifndef __AVR__ -#ifndef __PGMSPACE_H_ -// This define should prevent reading the system pgmspace.h if included elsewhere -// This is not normally needed. -#define __PGMSPACE_H_ 1 -#endif - -#ifndef PROGMEM -#define PROGMEM -#endif -#ifndef PGM_P -#define PGM_P const char * -#endif -#ifndef PSTR -#define PSTR(str) (str) -#endif -#ifndef F -#define F(str) (str) -#endif -#ifndef _SFR_BYTE -#define _SFR_BYTE(n) (n) -#endif -#ifndef memchr_P -#define memchr_P(str, c, len) memchr((str), (c), (len)) -#endif -#ifndef memcmp_P -#define memcmp_P(a, b, n) memcmp((a), (b), (n)) -#endif -#ifndef memcpy_P -#define memcpy_P(dest, src, num) memcpy((dest), (src), (num)) -#endif -#ifndef memmem_P -#define memmem_P(a, alen, b, blen) memmem((a), (alen), (b), (blen)) -#endif -#ifndef memrchr_P -#define memrchr_P(str, val, len) memrchr((str), (val), (len)) -#endif -#ifndef strcat_P -#define strcat_P(dest, src) strcat((dest), (src)) -#endif -#ifndef strchr_P -#define strchr_P(str, c) strchr((str), (c)) -#endif -#ifndef strchrnul_P -#define strchrnul_P(str, c) strchrnul((str), (c)) -#endif -#ifndef strcmp_P -#define strcmp_P(a, b) strcmp((a), (b)) -#endif -#ifndef strcpy_P -#define strcpy_P(dest, src) strcpy((dest), (src)) -#endif -#ifndef strcasecmp_P -#define strcasecmp_P(a, b) strcasecmp((a), (b)) -#endif -#ifndef strcasestr_P -#define strcasestr_P(a, b) strcasestr((a), (b)) -#endif -#ifndef strlcat_P -#define strlcat_P(dest, src, len) strlcat((dest), (src), (len)) -#endif -#ifndef strlcpy_P -#define strlcpy_P(dest, src, len) strlcpy((dest), (src), (len)) -#endif -#ifndef strlen_P -#define strlen_P(s) strlen((const char *)(s)) -#endif -#ifndef strnlen_P -#define strnlen_P(str, len) strnlen((str), (len)) -#endif -#ifndef strncmp_P -#define strncmp_P(a, b, n) strncmp((a), (b), (n)) -#endif -#ifndef strncasecmp_P -#define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n)) -#endif -#ifndef strncat_P -#define strncat_P(a, b, n) strncat((a), (b), (n)) -#endif -#ifndef strncpy_P -#define strncpy_P(a, b, n) strncmp((a), (b), (n)) -#endif -#ifndef strpbrk_P -#define strpbrk_P(str, chrs) strpbrk((str), (chrs)) -#endif -#ifndef strrchr_P -#define strrchr_P(str, c) strrchr((str), (c)) -#endif -#ifndef strsep_P -#define strsep_P(strp, delim) strsep((strp), (delim)) -#endif -#ifndef strspn_P -#define strspn_P(str, chrs) strspn((str), (chrs)) -#endif -#ifndef strstr_P -#define strstr_P(a, b) strstr((a), (b)) -#endif -#ifndef sprintf_P -#define sprintf_P(s, ...) sprintf((s), __VA_ARGS__) -#endif -#ifndef vfprintf_P -#define vfprintf_P(s, ...) vfprintf((s), __VA_ARGS__) -#endif -#ifndef printf_P -#define printf_P(...) printf(__VA_ARGS__) -#endif -#ifndef snprintf_P -#define snprintf_P(s, n, ...) ((s), (n), __VA_ARGS__) -#endif -#ifndef vsprintf_P -#define vsprintf_P(s, ...) ((s),__VA_ARGS__) -#endif -#ifndef vsnprintf_P -#define vsnprintf_P(s, n, ...) ((s), (n),__VA_ARGS__) -#endif -#ifndef fprintf_P -#define fprintf_P(s, ...) ((s), __VA_ARGS__) -#endif - -#ifndef pgm_read_byte -#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) -#endif -#ifndef pgm_read_word -#define pgm_read_word(addr) (*(const unsigned short *)(addr)) -#endif -#ifndef pgm_read_dword -#define pgm_read_dword(addr) (*(const unsigned long *)(addr)) -#endif -#ifndef pgm_read_float -#define pgm_read_float(addr) (*(const float *)(addr)) -#endif - -#ifndef pgm_read_byte_near -#define pgm_read_byte_near(addr) pgm_read_byte(addr) -#endif -#ifndef pgm_read_word_near -#define pgm_read_word_near(addr) pgm_read_word(addr) -#endif -#ifndef pgm_read_dword_near -#define pgm_read_dword_near(addr) pgm_read_dword(addr) -#endif -#ifndef pgm_read_float_near -#define pgm_read_float_near(addr) pgm_read_float(addr) -#endif -#ifndef pgm_read_byte_far -#define pgm_read_byte_far(addr) pgm_read_byte(addr) -#endif -#ifndef pgm_read_word_far -#define pgm_read_word_far(addr) pgm_read_word(addr) -#endif -#ifndef pgm_read_dword_far -#define pgm_read_dword_far(addr) pgm_read_dword(addr) -#endif -#ifndef pgm_read_float_far -#define pgm_read_float_far(addr) pgm_read_float(addr) -#endif - -#ifndef pgm_read_pointer -#define pgm_read_pointer -#endif - -#endif - - -//////////////////////////////////////////////////////////////////////////////// -// HANDY MACROS -//////////////////////////////////////////////////////////////////////////////// - -// Atmoically set/clear single bits using bitbands. -// Believe it or not, this boils down to a constant, -// and is less code than using |= &= operators. -// Bonus, it makes code easier to read too. -// Bitbanding is a wonderful thing. -#define BITNR(i) (i&0x1?0:i&0x2?1:i&0x4?2:i&0x8?3:i&0x10?4:i&0x20?5:i&0x40?6:i&0x80?7:i&0x100?8:i&0x200?9:i&0x400?10:i&0x800?11:i&0x1000?12:i&0x2000?13:i&0x4000?14:i&0x8000?15:i&0x10000?16:i&0x20000?17:i&0x40000?18:i&0x80000?19:i&0x100000?20:i&0x200000?21:i&0x400000?22:i&0x800000?23:i&0x1000000?24:i&0x2000000?25:i&0x4000000?26:i&0x8000000?27:i&0x10000000?28:i&0x20000000?29:i&0x40000000?30:i&0x80000000?31:32) -#define UHS_KIO_BITBAND_ADDR(r, i) (((uint32_t)&(r) - 0x40000000) * 32 + (i) * 4 + 0x42000000) -#define UHS_KIO_SETBIT_ATOMIC(r, m) (*(uint32_t *)UHS_KIO_BITBAND_ADDR((r), BITNR((m)))) = 1 -#define UHS_KIO_CLRBIT_ATOMIC(r, m) (*(uint32_t *)UHS_KIO_BITBAND_ADDR((r), BITNR((m)))) = 0 - - -#define VALUE_BETWEEN(v,l,h) (((v)>(l)) && ((v)<(h))) -#define VALUE_WITHIN(v,l,h) (((v)>=(l)) && ((v)<=(h))) -#define output_pgm_message(wa,fp,mp,el) wa = &mp, fp((char *)pgm_read_pointer(wa), el) -#define output_if_between(v,l,h,wa,fp,mp,el) if(VALUE_BETWEEN(v,l,h)) output_pgm_message(wa,fp,mp[v-(l+1)],el); - -#define UHS_SWAP_VALUES(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) -#ifndef __BYTE_GRABBING_DEFINED__ -#define __BYTE_GRABBING_DEFINED__ 1 -#ifdef BROKEN_OPTIMIZER_LITTLE_ENDIAN -// Note: Use this if your compiler generates horrible assembler! -#define UHS_UINT8_BYTE0(__usi__) (((uint8_t *)&(__usi__))[0]) -#define UHS_UINT8_BYTE1(__usi__) (((uint8_t *)&(__usi__))[1]) -#define UHS_UINT8_BYTE2(__usi__) (((uint8_t *)&(__usi__))[2]) -#define UHS_UINT8_BYTE3(__usi__) (((uint8_t *)&(__usi__))[3]) -#define UHS_UINT8_BYTE4(__usi__) (((uint8_t *)&(__usi__))[4]) -#define UHS_UINT8_BYTE5(__usi__) (((uint8_t *)&(__usi__))[5]) -#define UHS_UINT8_BYTE6(__usi__) (((uint8_t *)&(__usi__))[6]) -#define UHS_UINT8_BYTE7(__usi__) (((uint8_t *)&(__usi__))[7]) -#else -// Note: The cast alone to uint8_t is actually enough. -// GCC throws out the "& 0xFF", and the size is no different. -// Some compilers need it. -#define UHS_UINT8_BYTE0(__usi__) ((uint8_t)((__usi__) & 0xFF )) -#define UHS_UINT8_BYTE1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xFF)) -#define UHS_UINT8_BYTE2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xFF)) -#define UHS_UINT8_BYTE3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xFF)) -#define UHS_UINT8_BYTE4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xFF)) -#define UHS_UINT8_BYTE5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xFF)) -#define UHS_UINT8_BYTE6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xFF)) -#define UHS_UINT8_BYTE7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xFF)) -#endif -#define UHS_UINT16_SET_BYTE1(__usi__) ((uint16_t)(__usi__) << 8) -#define UHS_UINT32_SET_BYTE1(__usi__) ((uint32_t)(__usi__) << 8) -#define UHS_UINT64_SET_BYTE1(__usi__) ((uint64_t)(__usi__) << 8) -#define UHS_UINT32_SET_BYTE2(__usi__) ((uint32_t)(__usi__) << 16) -#define UHS_UINT64_SET_BYTE2(__usi__) ((uint64_t)(__usi__) << 16) -#define UHS_UINT32_SET_BYTE3(__usi__) ((uint32_t)(__usi__) << 24) -#define UHS_UINT64_SET_BYTE3(__usi__) ((uint64_t)(__usi__) << 24) -#define UHS_UINT64_SET_BYTE4(__usi__) ((uint64_t)(__usi__) << 32) -#define UHS_UINT64_SET_BYTE5(__usi__) ((uint64_t)(__usi__) << 40) -#define UHS_UINT64_SET_BYTE6(__usi__) ((uint64_t)(__usi__) << 48) -#define UHS_UINT64_SET_BYTE7(__usi__) ((uint64_t)(__usi__) << 56) - -// These are the smallest and fastest ways I have found so far in pure C/C++. -#define UHS_BYTES_TO_UINT16(__usc1__,__usc0__) ((uint16_t)((uint16_t)(__usc0__) | (uint16_t)UHS_UINT16_SET_BYTE1(__usc1__))) -#define UHS_BYTES_TO_UINT32(__usc3__,__usc2__,__usc1__,__usc0__) ((uint32_t)((uint32_t)(__usc0__) | UHS_UINT32_SET_BYTE1(__usc1__) | UHS_UINT32_SET_BYTE2(__usc2__) | UHS_UINT32_SET_BYTE3(__usc3__))) -#define UHS_BYTES_TO_UINT64(__usc7__,__usc6__,__usc5__,__usc4__,__usc3__,__usc2__,__usc1__,__usc0__) ((uint64_t)((uint64_t)__usc0__ | UHS_UINT64_SET_BYTE1(__usc1__) | UHS_UINT64_SET_BYTE2(__usc2__) | UHS_UINT64_SET_BYTE3(__usc3__) | UHS_UINT64_SET_BYTE4(__usc4__) | UHS_UINT64_SET_BYTE5(__usc5__) | UHS_UINT64_SET_BYTE6(__usc6__) | UHS_UINT64_SET_BYTE7(__usc7__))) -#endif -/* - * Debug macros. - * Useful when porting from UHS2. - * Do not use these for any new code. - * Change to better debugging after port is completed. - * Strings are stored in progmem (flash) instead of RAM. - */ -#define USBTRACE1(s,l) (Notify(PSTR(s), l)) -#define USBTRACE(s) (USBTRACE1((s), 0x80)); USB_HOST_SERIAL.flush() -#define USBTRACE3(s,r,l) (Notify(PSTR(s), l), D_PrintHex((r), l), Notify(PSTR("\r\n"), l)) -#define USBTRACE3X(s,r,l) (Notify(PSTR(s), l), D_PrintHex((r), l)) -#define USBTRACE2(s,r) (USBTRACE3((s),(r),0x80)); USB_HOST_SERIAL.flush() -#define USBTRACE2X(s,r) (USBTRACE3X((s),(r),0x80)); USB_HOST_SERIAL.flush() - -#define VOID0 ((void)0) -#ifndef NOTUSED -#define NOTUSED(...) __VA_ARGS__ __attribute__((unused)) -#endif -#endif /* MACROS_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_message.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_message.h deleted file mode 100644 index c0cc78d15f..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_message.h +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ -#if !defined(_UHS_host_h_) || defined(__MESSAGE_H__) -#error "Never include UHS_message.h directly; include UHS_Usb.h instead" -#else -#define __MESSAGE_H__ - -extern int UsbDEBUGlvl; - -void E_Notify(char const * msg, int lvl); -void E_Notify(uint8_t b, int lvl); -void E_NotifyStr(char const * msg, int lvl); -void E_Notifyc(char c, int lvl); - -#ifdef DEBUG_USB_HOST -#define Notify E_Notify -#define NotifyStr E_NotifyStr -#define Notifyc E_Notifyc -void NotifyFailGetDevDescr(uint8_t reason); -void NotifyFailSetDevTblEntry(uint8_t reason); -void NotifyFailGetConfDescr(uint8_t reason); -void NotifyFailSetConfDescr(uint8_t reason); -void NotifyFailGetDevDescr(); -void NotifyFailSetDevTblEntry(); -void NotifyFailGetConfDescr(); -void NotifyFailSetConfDescr(); -void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID); -void NotifyFail(uint8_t rcode); -#else -#define Notify(...) VOID0 -#define NotifyStr(...) VOID0 -#define Notifyc(...) VOID0 -#define NotifyFailGetDevDescr(...) VOID0 -#define NotifyFailSetDevTblEntry(...) VOID0 -#define NotifyFailGetConfDescr(...) VOID0 -#define NotifyFailGetDevDescr(...) VOID0 -#define NotifyFailSetDevTblEntry(...) VOID0 -#define NotifyFailGetConfDescr(...) VOID0 -#define NotifyFailSetConfDescr(...) VOID0 -#define NotifyFailUnknownDevice(...) VOID0 -#define NotifyFail(...) VOID0 -#endif - -#ifdef DEBUG_USB_HOST -template void ErrorMessage(uint8_t level, char const * msg, ERROR_TYPE rcode = 0) { - Notify(msg, level); - Notify(PSTR(": "), level); - D_PrintHex (rcode, level); - Notify(PSTR("\r\n"), level); -#else -template void ErrorMessage(NOTUSED(uint8_t level), NOTUSED(char const * msg), ERROR_TYPE rcode = 0) { - (void)rcode; -#endif -} - -#ifdef DEBUG_USB_HOST -template void ErrorMessage(char const * msg, ERROR_TYPE rcode = 0) { - Notify(msg, 0x80); - Notify(PSTR(": "), 0x80); - D_PrintHex (rcode, 0x80); - Notify(PSTR("\r\n"), 0x80); -#else -template void ErrorMessage(NOTUSED(char const * msg), ERROR_TYPE rcode = 0) { - (void)rcode; -#endif -} - -#endif // __MESSAGE_H__ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h deleted file mode 100644 index 4fc9b94079..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h +++ /dev/null @@ -1,200 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#ifndef UHS_PRINTF_HELPER_H -#define UHS_PRINTF_HELPER_H - -#ifdef LOAD_UHS_PRINTF_HELPER -#include -#ifdef true -#undef true -#endif -#ifdef false -#undef false -#endif - -#ifndef STDIO_IS_OK_TO_USE_AS_IS -#if defined(ARDUINO_SAMD_ZERO) || defined(ARDUINO_SAM_DUE) || defined(ARDUINO_spresense_ast) -// STDIO patching not required. -#define STDIO_IS_OK_TO_USE_AS_IS -#endif -#endif - -#ifndef STDIO_IS_OK_TO_USE_AS_IS -// We need to patch STDIO so it can be used. - -#ifndef SERIAL_PORT_MONITOR -// Some don't define this. -#define SERIAL_PORT_MONITOR Serial -#endif - -#ifndef SERIAL_PORT_HARDWARE -// Some don't define this. -#define SERIAL_PORT_HARDWARE SERIAL_PORT_MONITOR -#endif - -#ifndef USB_HOST_SERIAL -#if defined(SERIAL_PORT_USBVIRTUAL) && defined(LOAD_UHS_KINETIS_FS_HOST) -#define USB_HOST_SERIAL SERIAL_PORT_HARDWARE -#else -#define USB_HOST_SERIAL SERIAL_PORT_MONITOR -#endif -#endif - -#ifndef NOTUSED -#define NOTUSED(...) __VA_ARGS__ __attribute__((unused)) -#endif - -#ifndef __AVR__ -#ifndef printf_P -#define printf_P(...) printf(__VA_ARGS__) -#endif -#endif - -#ifdef ARDUINO_ARCH_PIC32 -/* - * For printf() output with pic32 Arduino - */ -extern "C" { - - void _mon_putc(char s) { - USB_HOST_SERIAL.write(s); - } - - int _mon_getc() { - while(!USB_HOST_SERIAL.available()); - return USB_HOST_SERIAL.read(); - } -} - -#elif defined(__AVR__) -extern "C" { - - static FILE tty_stdio; - static FILE tty_stderr; - - static int NOTUSED(tty_stderr_putc(char c, NOTUSED(FILE *t))); - static int NOTUSED(tty_stderr_flush(NOTUSED(FILE *t))); - static int NOTUSED(tty_std_putc(char c, NOTUSED(FILE *t))); - static int NOTUSED(tty_std_getc(NOTUSED(FILE *t))); - static int NOTUSED(tty_std_flush(NOTUSED(FILE *t))); - - static int tty_stderr_putc(char c, NOTUSED(FILE *t)) { - USB_HOST_SERIAL.write(c); - return 0; - } - - static int tty_stderr_flush(NOTUSED(FILE *t)) { - USB_HOST_SERIAL.flush(); - return 0; - } - - static int tty_std_putc(char c, NOTUSED(FILE *t)) { - USB_HOST_SERIAL.write(c); - return 0; - } - - static int tty_std_getc(NOTUSED(FILE *t)) { - while(!USB_HOST_SERIAL.available()); - return USB_HOST_SERIAL.read(); - } - - static int tty_std_flush(NOTUSED(FILE *t)) { - USB_HOST_SERIAL.flush(); - return 0; - } -} -#elif defined(CORE_TEENSY) -extern "C" { - - int _write(int fd, const char *ptr, int len) { - int j; - for(j = 0; j < len; j++) { - if(fd == 1) - USB_HOST_SERIAL.write(*ptr++); - else if(fd == 2) - USB_HOST_SERIAL.write(*ptr++); - } - return len; - } - - int _read(int fd, char *ptr, int len) { - if(len > 0 && fd == 0) { - while(!USB_HOST_SERIAL.available()); - *ptr = USB_HOST_SERIAL.read(); - return 1; - } - return 0; - } - -#include - - int _fstat(int fd, struct stat *st) { - memset(st, 0, sizeof (*st)); - st->st_mode = S_IFCHR; - st->st_blksize = 1024; - return 0; - } - - int _isatty(int fd) { - return (fd < 3) ? 1 : 0; - } -} -#else -#error no STDIO -#endif // defined(ARDUINO_ARCH_PIC32) - - - -#ifdef __AVR__ -// The only wierdo in the bunch... -void UHS_AVR_printf_HELPER_init() { - // Set up stdio/stderr - tty_stdio.put = tty_std_putc; - tty_stdio.get = tty_std_getc; - tty_stdio.flags = _FDEV_SETUP_RW; - tty_stdio.udata = 0; - - tty_stderr.put = tty_stderr_putc; - tty_stderr.get = NULL; - tty_stderr.flags = _FDEV_SETUP_WRITE; - tty_stderr.udata = 0; - - stdout = &tty_stdio; - stdin = &tty_stdio; - stderr = &tty_stderr; - -} -#define UHS_printf_HELPER_init() UHS_AVR_printf_HELPER_init() -#endif - -#endif /* STDIO_IS_OK_TO_USE_AS_IS */ -#endif /* load.... */ - -#ifndef UHS_printf_HELPER_init -#define UHS_printf_HELPER_init() (void(0)) -#endif -#endif /* UHS_PRINTF_HELPER_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h deleted file mode 100644 index bfa052b8f7..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#if !defined(_UHS_host_h_) || defined(__PRINTHEX_H__) -#error "Never include UHS_printhex.h directly; include UHS_Usb.h instead" -#else -#define __PRINTHEX_H__ - -void E_Notifyc(char c, int lvl); - -template -void PrintHex(T val, int lvl) { - int num_nibbles = sizeof (T) * 2; - - do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); - if(v > 57) v += 7; - E_Notifyc(v, lvl); - } while(--num_nibbles); -} - -template -void PrintBin(T val, int lvl) { - for(T mask = (((T)1) << ((sizeof (T) << 3) - 1)); mask; mask >>= 1) - if(val & mask) - E_Notifyc('1', lvl); - else - E_Notifyc('0', lvl); -} - -template -void SerialPrintHex(T val) { - int num_nibbles = sizeof (T) * 2; - - do { - char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); - if(v > 57) v += 7; - USB_HOST_SERIAL.print(v); - } while(--num_nibbles); -} - -template -void PrintHex2(Print *prn, T val) { - T mask = (((T)1) << (((sizeof (T) << 1) - 1) << 2)); - - while(mask > 1) { - if(val < mask) - prn->print("0"); - - mask >>= 4; - } - prn->print((T)val, HEX); -} - -#ifdef DEBUG_USB_HOST -template void D_PrintHex(T val, int lvl) { - PrintHex (val, lvl); -#else -template void D_PrintHex(NOTUSED(T val), NOTUSED(int lvl)) { -#endif -} - -#ifdef DEBUG_USB_HOST -template void D_PrintBin(T val, int lvl) { - PrintBin (val, lvl); -#else -template void D_PrintBin(NOTUSED(T val), NOTUSED(int lvl)) { -#endif -} - - - -#endif // __PRINTHEX_H__ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_settings.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_settings.h deleted file mode 100644 index c516599d6b..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_settings.h +++ /dev/null @@ -1,141 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#ifndef UHS_SETTINGS_H -#define UHS_SETTINGS_H - -// TO-DO: Move specific settings to modules which use them. - -//////////////////////////////////////////////////////////////////////////////// -// Define any of these options at the top of your sketch to override -// the defaults contained herewith. Do NOT do modifications here. -// Individual Components have their own settings. -// -// Macro | Settings and notes | Default -// -----------------------------+-----------------------+----------------------- -// | Any class that does | -// USB_HOST_SERIAL | text streaming | SERIAL_PORT_MONITOR -// | e.g. Serial2 | -// -----------------------------+-----------------------+----------------------- -// ENABLE_UHS_DEBUGGING | 0 = off, 1 = on | 0 -// -----------------------------+-----------------------+----------------------- -// | 0 = off, 1 = on | -// | Caution! Can make | -// DEBUG_PRINTF_EXTRA_HUGE | program too large! | 0 -// | Other modules depend | -// | on this setting. | -// -----------------------------+-----------------------+----------------------- -// USE_UHS_BLACK_WIDDOW | 0 = no, 1 = yes | 0 -// -----------------------------+-----------------------+----------------------- -// ENABLE_WII_IR_CAMERA | 0 = no, 1 = yes | 0 -// -----------------------------^-----------------------^----------------------- -// -//////////////////////////////////////////////////////////////////////////////// - - -//////////////////////////////////////////////////////////////////////////////// -// DEBUGGING -//////////////////////////////////////////////////////////////////////////////// - -#ifndef USB_HOST_SERIAL -#if defined(SERIAL_PORT_USBVIRTUAL) && defined(LOAD_UHS_KINETIS_FS_HOST) -#define USB_HOST_SERIAL SERIAL_PORT_HARDWARE -#else -#define USB_HOST_SERIAL SERIAL_PORT_MONITOR -#endif -#endif - -#ifndef ENABLE_UHS_DEBUGGING -#define ENABLE_UHS_DEBUGGING 0 -#endif - -#ifndef DEBUG_PRINTF_EXTRA_HUGE -#define DEBUG_PRINTF_EXTRA_HUGE 0 -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Manual board activation -//////////////////////////////////////////////////////////////////////////////// - -/* Set this to 1 if you are using a Black Widdow */ -#ifndef USE_UHS_BLACK_WIDDOW -#define USE_UHS_BLACK_WIDDOW 0 -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Wii IR camera -//////////////////////////////////////////////////////////////////////////////// - -/* Set this to 1 to activate code for the Wii IR camera */ -#ifndef ENABLE_WII_IR_CAMERA -#define ENABLE_WII_IR_CAMERA 0 -#endif - -//////////////////////////////////////////////////////////////////////////////// -// Set to 1 to use the faster spi4teensy3 driver. (not used yet)) -//////////////////////////////////////////////////////////////////////////////// -#ifndef USE_SPI4TEENSY3 -#define USE_SPI4TEENSY3 0 -#endif - -//////////////////////////////////////////////////////////////////////////////// -// AUTOMATIC Settings -//////////////////////////////////////////////////////////////////////////////// - -// No user serviceable parts below this line. -// DO NOT change anything below here unless you are a developer! - -#if defined(__GNUC__) && defined(__AVR__) -#ifndef GCC_VERSION -#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) -#endif -#if GCC_VERSION < 40602 // Test for GCC < 4.6.2 -#ifdef PROGMEM -#undef PROGMEM -#define PROGMEM __attribute__((section(".progmem.data"))) // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734#c4 -#ifdef PSTR -#undef PSTR -#define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];})) // Copied from pgmspace.h in avr-libc source -#endif -#endif -#endif -#endif - -#if !defined(DEBUG_USB_HOST) && ENABLE_UHS_DEBUGGING -#define DEBUG_USB_HOST -#endif - -#if !defined(WIICAMERA) && ENABLE_WII_IR_CAMERA -#define WIICAMERA -#endif - -#define UHS_SLEEP_MS(v) pUsb->sof_delay(v) - -#ifndef UHS_NI -#define UHS_NI __attribute__((noinline)) -#endif - -#endif /* SETTINGS_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h deleted file mode 100644 index 6486482d96..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h +++ /dev/null @@ -1,222 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#if !defined(_UHS_host_h_) || defined(_UHS_ch9_h_) -#error "Never include UHS_usb_ch9.h directly; include UHS_Usb.h instead" -#else - -/* USB chapter 9 structures */ -#define _UHS_ch9_h_ - -/* Misc.USB constants */ -#define DEV_DESCR_LEN 18 //device descriptor length -#define CONF_DESCR_LEN 9 //configuration descriptor length -#define INTR_DESCR_LEN 9 //interface descriptor length -#define EP_DESCR_LEN 7 //endpoint descriptor length - -/* Standard Device Requests */ -#define USB_REQUEST_GET_STATUS 0 // Standard Device Request - GET STATUS -#define USB_REQUEST_CLEAR_FEATURE 1 // Standard Device Request - CLEAR FEATURE -#define USB_REQUEST_SET_FEATURE 3 // Standard Device Request - SET FEATURE -#define USB_REQUEST_SET_ADDRESS 5 // Standard Device Request - SET ADDRESS -#define USB_REQUEST_GET_DESCRIPTOR 6 // Standard Device Request - GET DESCRIPTOR -#define USB_REQUEST_SET_DESCRIPTOR 7 // Standard Device Request - SET DESCRIPTOR -#define USB_REQUEST_GET_CONFIGURATION 8 // Standard Device Request - GET CONFIGURATION -#define USB_REQUEST_SET_CONFIGURATION 9 // Standard Device Request - SET CONFIGURATION -#define USB_REQUEST_GET_INTERFACE 10 // Standard Device Request - GET INTERFACE -#define USB_REQUEST_SET_INTERFACE 11 // Standard Device Request - SET INTERFACE -#define USB_REQUEST_SYNCH_FRAME 12 // Standard Device Request - SYNCH FRAME - -/* Wireless USB Device Requests */ -#define USB_REQ_SET_ENCRYPTION 0x0D -#define USB_REQ_GET_ENCRYPTION 0x0E -#define USB_REQ_RPIPE_ABORT 0x0E -#define USB_REQ_SET_HANDSHAKE 0x0F -#define USB_REQ_RPIPE_RESET 0x0F -#define USB_REQ_GET_HANDSHAKE 0x10 -#define USB_REQ_SET_CONNECTION 0x11 -#define USB_REQ_SET_SECURITY_DATA 0x12 -#define USB_REQ_GET_SECURITY_DATA 0x13 -#define USB_REQ_SET_WUSB_DATA 0x14 -#define USB_REQ_LOOPBACK_DATA_WRITE 0x15 -#define USB_REQ_LOOPBACK_DATA_READ 0x16 -#define USB_REQ_SET_INTERFACE_DS 0x17 - -/* USB feature flags */ -#define USB_DEVICE_SELF_POWERED 0 /* (read only) */ -#define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */ -#define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */ -#define USB_DEVICE_BATTERY 2 /* (wireless) */ -#define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */ -#define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/ -#define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */ -#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ -#define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ - -#define USB_FEATURE_ENDPOINT_HALT 0 // CLEAR/SET FEATURE - Endpoint Halt -#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // CLEAR/SET FEATURE - Device remote wake-up -#define USB_FEATURE_TEST_MODE 2 // CLEAR/SET FEATURE - Test mode -/* OTG SET FEATURE Constants */ -#define OTG_FEATURE_B_HNP_ENABLE 3 // SET FEATURE OTG - Enable B device to perform HNP -#define OTG_FEATURE_A_HNP_SUPPORT 4 // SET FEATURE OTG - A device supports HNP -#define OTG_FEATURE_A_ALT_HNP_SUPPORT 5 // SET FEATURE OTG - Another port on the A device supports HNP - -/* Setup Data Constants */ -#define USB_SETUP_HOST_TO_DEVICE 0x00 // Device Request bmRequestType transfer direction - host to device transfer -#define USB_SETUP_DEVICE_TO_HOST 0x80 // Device Request bmRequestType transfer direction - device to host transfer -#define USB_SETUP_TYPE_STANDARD 0x00 // Device Request bmRequestType type - standard -#define USB_SETUP_TYPE_CLASS 0x20 // Device Request bmRequestType type - class -#define USB_SETUP_TYPE_VENDOR 0x40 // Device Request bmRequestType type - vendor -#define USB_SETUP_RECIPIENT_DEVICE 0x00 // Device Request bmRequestType recipient - device -#define USB_SETUP_RECIPIENT_INTERFACE 0x01 // Device Request bmRequestType recipient - interface -#define USB_SETUP_RECIPIENT_ENDPOINT 0x02 // Device Request bmRequestType recipient - endpoint -#define USB_SETUP_RECIPIENT_OTHER 0x03 // Device Request bmRequestType recipient - other -#define USB_SETUP_RECIPIENT_PORT 0x04 // Wireless USB 1.0 -#define USB_SETUP_RECIPIENT_RPIPE 0x05 // Wireless USB 1.0 - - -/* USB descriptors */ -#define USB_DESCRIPTOR_DEVICE 0x01 // bDescriptorType for a Device Descriptor. -#define USB_DESCRIPTOR_CONFIGURATION 0x02 // bDescriptorType for a Configuration Descriptor. -#define USB_DESCRIPTOR_STRING 0x03 // bDescriptorType for a String Descriptor. -#define USB_DESCRIPTOR_INTERFACE 0x04 // bDescriptorType for an Interface Descriptor. -#define USB_DESCRIPTOR_ENDPOINT 0x05 // bDescriptorType for an Endpoint Descriptor. -#define USB_DESCRIPTOR_DEVICE_QUALIFIER 0x06 // bDescriptorType for a Device Qualifier. -#define USB_DESCRIPTOR_OTHER_SPEED 0x07 // bDescriptorType for a Other Speed Configuration. -#define USB_DESCRIPTOR_INTERFACE_POWER 0x08 // bDescriptorType for Interface Power. -#define USB_DESCRIPTOR_OTG 0x09 // bDescriptorType for an OTG Descriptor. -#define USB_DESCRIPTOR_DEBUG 0x0A -#define USB_DESCRIPTOR_INTERFACE_ASSOCIATION 0x0B -#define USB_DESCRIPTOR_SECURITY 0x0C -#define USB_DESCRIPTOR_KEY 0x0D -#define USB_DESCRIPTOR_ENCRYPTION_TYPE 0x0E -#define USB_DESCRIPTOR_BOS 0x0F -#define USB_DESCRIPTOR_DEVICE_CAPABILITY 0x10 -#define USB_DESCRIPTOR_WIRELESS_ENDPOINT_COMP 0x11 -#define USB_DESCRIPTOR_WIRE_ADAPTER 0x21 -#define USB_DESCRIPTOR_RPIPE 0x22 -#define USB_DESCRIPTOR_CS_RADIO_CONTROL 0x23 -#define USB_DESCRIPTOR_SS_ENDPOINT_COMP 0x30 - -#define USB_HID_DESCRIPTOR 0x21 - - -// Conventional codes for class-specific descriptors. "Common Class" Spec (3.11) -#define USB_DESCRIPTOR_CS_DEVICE 0x21 -#define USB_DESCRIPTOR_CS_CONFIG 0x22 -#define USB_DESCRIPTOR_CS_STRING 0x23 -#define USB_DESCRIPTOR_CS_INTERFACE 0x24 -#define USB_DESCRIPTOR_CS_ENDPOINT 0x25 - - - -/* USB Endpoint Transfer Types */ -#define USB_TRANSFER_TYPE_CONTROL 0x00 // Endpoint is a control endpoint. -#define USB_TRANSFER_TYPE_ISOCHRONOUS 0x01 // Endpoint is an isochronous endpoint. -#define USB_TRANSFER_TYPE_BULK 0x02 // Endpoint is a bulk endpoint. -#define USB_TRANSFER_TYPE_INTERRUPT 0x03 // Endpoint is an interrupt endpoint. -#define bmUSB_TRANSFER_TYPE 0x03 // bit mask to separate transfer type from ISO attributes -#define USB_TRANSFER_DIRECTION_IN 0x80 // Indicate direction is IN - -/* Standard Feature Selectors for CLEAR_FEATURE Requests */ -#define USB_FEATURE_ENDPOINT_STALL 0 // Endpoint recipient -#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // Device recipient -#define USB_FEATURE_TEST_MODE 2 // Device recipient - -/* descriptor data structures */ - -/* Device descriptor structure */ -typedef struct { - uint8_t bLength; // Length of this descriptor. - uint8_t bDescriptorType; // DEVICE descriptor type (USB_DESCRIPTOR_DEVICE). - uint16_t bcdUSB; // USB Spec Release Number (BCD). - uint8_t bDeviceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific. - uint8_t bDeviceSubClass; // Subclass code (assigned by the USB-IF). - uint8_t bDeviceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. - uint8_t bMaxPacketSize0; // Maximum packet size for endpoint 0. - uint16_t idVendor; // Vendor ID (assigned by the USB-IF). - uint16_t idProduct; // Product ID (assigned by the manufacturer). - uint16_t bcdDevice; // Device release number (BCD). - uint8_t iManufacturer; // Index of String Descriptor describing the manufacturer. - uint8_t iProduct; // Index of String Descriptor describing the product. - uint8_t iSerialNumber; // Index of String Descriptor with the device's serial number. - uint8_t bNumConfigurations; // Number of possible configurations. -} __attribute__((packed)) USB_FD_DEVICE_DESCRIPTOR; - -/* Configuration descriptor structure */ -typedef struct { - uint8_t bLength; // Length of this descriptor. - uint8_t bDescriptorType; // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION). - uint16_t wTotalLength; // Total length of all descriptors for this configuration. - uint8_t bNumInterfaces; // Number of interfaces in this configuration. - uint8_t bConfigurationValue; // Value of this configuration (1 based). - uint8_t iConfiguration; // Index of String Descriptor describing the configuration. - uint8_t bmAttributes; // Configuration characteristics. - uint8_t bMaxPower; // Maximum power consumed by this configuration. -} __attribute__((packed)) USB_FD_CONFIGURATION_DESCRIPTOR; - -/* Interface descriptor structure */ -typedef struct { - uint8_t bLength; // Length of this descriptor. - uint8_t bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE). - uint8_t bInterfaceNumber; // Number of this interface (0 based). - uint8_t bAlternateSetting; // Value of this alternate interface setting. - uint8_t bNumEndpoints; // Number of endpoints in this interface. - uint8_t bInterfaceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific. - uint8_t bInterfaceSubClass; // Subclass code (assigned by the USB-IF). - uint8_t bInterfaceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. - uint8_t iInterface; // Index of String Descriptor describing the interface. -} __attribute__((packed)) USB_FD_INTERFACE_DESCRIPTOR; - -/* Endpoint descriptor structure */ -typedef struct { - uint8_t bLength; // Length of this descriptor. - uint8_t bDescriptorType; // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT). - uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN). - uint8_t bmAttributes; // Endpoint transfer type. - uint16_t wMaxPacketSize; // Maximum packet size. - uint8_t bInterval; // Polling interval in frames. -} __attribute__((packed)) USB_FD_ENDPOINT_DESCRIPTOR; - -/* HID descriptor */ -/* -typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdHID; // HID class specification release - uint8_t bCountryCode; - uint8_t bNumDescriptors; // Number of additional class specific descriptors - uint8_t bDescrType; // Type of class descriptor - uint16_t wDescriptorLength; // Total size of the Report descriptor -} __attribute__((packed)) USB_HID_DESCRIPTOR; -*/ - -typedef struct { - uint8_t bDescrType; // Type of class descriptor - uint16_t wDescriptorLength; // Total size of the Report descriptor -} __attribute__((packed)) HID_CLASS_DESCRIPTOR_LEN_AND_TYPE; - -#endif // _ch9_h_ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h deleted file mode 100644 index b289a896ef..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h +++ /dev/null @@ -1,449 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#ifndef _UHS_host_h_ -#error "Never include UHS_usbhost.h directly; include UHS_host.h instead" -#else -#ifndef _USBHOST_H_ -#define _USBHOST_H_ - -// Very early prototypes -#ifdef UHS_LOAD_BT -void UHS_BT_SetUSBInterface(UHS_USB_HOST_BASE *host, ENUMERATION_INFO *ei); -void UHS_BT_ScanUninitialized(UHS_USB_HOST_BASE *host); -void UHS_BT_Poll(UHS_USB_HOST_BASE *host); -#endif -#ifdef UHS_LOAD_HID -void UHS_HID_SetUSBInterface(UHS_USB_HOST_BASE *host, ENUMERATION_INFO *ei); -void UHS_HID_ScanUninitialized(UHS_USB_HOST_BASE *host); -void UHS_HID_Poll(UHS_USB_HOST_BASE *host); -#endif - -//#if defined(LOAD_UHS_CDC_ACM) || defined(LOAD_UHS_CDC_ACM_FTDI) || defined(LOAD_UHS_CDC_ACM_PROLIFIC) || defined(LOAD_UHS_CDC_ACM_XR21B1411) -//void UHS_CDC_ACM_SetUSBInterface(UHS_USB_HOST_BASE *host, ENUMERATION_INFO *ei); -//void UHS_CDC_ACM_ScanUninitialized(UHS_USB_HOST_BASE *host); -//void UHS_CDC_ACM_Poll(UHS_USB_HOST_BASE *host); -//#endif - -class UHS_USBInterface; // forward class declaration - -// enumerator to turn the VBUS on/off - -typedef enum { - vbus_on = 0, - vbus_off = 1 -} VBUS_t; - -// All host SEI use this base class - -class UHS_USB_HOST_BASE { -public: - AddressPool addrPool; - UHS_USBInterface* devConfig[UHS_HOST_MAX_INTERFACE_DRIVERS]; - volatile uint8_t usb_error; - volatile uint8_t usb_task_state; - volatile uint8_t usb_task_polling_disabled; - volatile uint8_t usb_host_speed; - volatile uint8_t hub_present; - - UHS_USB_HOST_BASE() { - for(uint16_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { - devConfig[i] = NULL; - } - usb_task_polling_disabled = 0; - usb_task_state = UHS_USB_HOST_STATE_INITIALIZE; //set up state machine - usb_host_speed = 0; - usb_error = 0; - }; - - ///////////////////////////////////////////// - // - // Virtual methods that interface to the SIE - // Overriding each is mandatory. - // - ///////////////////////////////////////////// - - /** - * Delay for x milliseconds - * Override if your controller provides an SOF IRQ, which may involve - * some sort of reentrant ISR or workaround with interrupts enabled. - * - * @param x how many milliseconds to delay - * @return true if delay completed without a state change, false if delay aborted - */ - virtual bool UHS_NI sof_delay(uint16_t x) { - if(!(usb_task_state & UHS_USB_HOST_STATE_MASK)) return false; - uint8_t current_state = usb_task_state; - while(current_state == usb_task_state && x--) { - delay(1); - } - return (current_state == usb_task_state); - }; - - virtual UHS_EpInfo * UHS_NI ctrlReqOpen(NOTUSED(uint8_t addr), NOTUSED(uint64_t Request), NOTUSED(uint8_t* dataptr)) { - return NULL; - }; - - virtual void UHS_NI vbusPower(NOTUSED(VBUS_t state)) { - }; - - virtual void UHS_NI Task() { - }; - - virtual uint8_t UHS_NI SetAddress(NOTUSED(uint8_t addr), NOTUSED(uint8_t ep), NOTUSED(UHS_EpInfo **ppep), NOTUSED(uint16_t &nak_limit)) { - return UHS_HOST_ERROR_NOT_IMPLEMENTED; - }; - - virtual uint8_t UHS_NI OutTransfer(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint16_t nak_limit), NOTUSED(uint16_t nbytes), NOTUSED(uint8_t *data)) { - return UHS_HOST_ERROR_NOT_IMPLEMENTED; - }; - - virtual uint8_t UHS_NI InTransfer(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint16_t nak_limit), NOTUSED(uint16_t *nbytesptr), NOTUSED(uint8_t *data)) { - return UHS_HOST_ERROR_NOT_IMPLEMENTED; - }; - - virtual uint8_t UHS_NI ctrlReqClose(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint8_t bmReqType), NOTUSED(uint16_t left), NOTUSED(uint16_t nbytes), NOTUSED(uint8_t *dataptr)) { - return UHS_HOST_ERROR_NOT_IMPLEMENTED; - }; - - virtual uint8_t UHS_NI ctrlReqRead(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint16_t *left), NOTUSED(uint16_t *read), NOTUSED(uint16_t nbytes), NOTUSED(uint8_t *dataptr)) { - return UHS_HOST_ERROR_NOT_IMPLEMENTED; - }; - - virtual uint8_t UHS_NI dispatchPkt(NOTUSED(uint8_t token), NOTUSED(uint8_t ep), NOTUSED(uint16_t nak_limit)) { - return UHS_HOST_ERROR_NOT_IMPLEMENTED; - }; - - virtual uint8_t UHS_NI init() { - return 0; - }; - - virtual void UHS_NI doHostReset() { - }; - - virtual int16_t UHS_NI Init(NOTUSED(int16_t mseconds)) { - return -1; - }; - - virtual int16_t UHS_NI Init() { - return Init(INT16_MIN); - }; - - virtual uint8_t hwlPowerUp() { - /* This is for machine specific support to enable/power up the USB HW to operate*/ - return UHS_HOST_ERROR_NOT_IMPLEMENTED; - }; - - virtual uint8_t hwPowerDown() { - /* This is for machine specific support to disable/powerdown the USB Hw */ - return UHS_HOST_ERROR_NOT_IMPLEMENTED; - }; - - virtual bool IsHub(uint8_t klass) { - return (klass == UHS_USB_CLASS_HUB); - }; - - virtual void UHS_NI suspend_host() { - // Used on MCU that lack control of IRQ priority (AVR). - // Suspends ISRs, for critical code. IRQ will be serviced after it is resumed. - // NOTE: you must track the state yourself! - }; - - virtual void UHS_NI resume_host() { - // Used on MCU that lack control of IRQ priority (AVR). - // Resumes ISRs. - // NOTE: you must track the state yourself! - }; - - ///////////////////////////////////////////// - // - // Built-ins, No need to override - // - ///////////////////////////////////////////// - // these two probably will go away, and won't be used, TBD - inline void Poll_Others() { -#ifdef UHS_LOAD_BT - UHS_BT_Poll(this); -#endif -#ifdef UHS_LOAD_HID - UHS_HID_Poll(this); -#endif - } - - inline void DisablePoll() { - noInterrupts(); - usb_task_polling_disabled++; - DDSB(); - interrupts(); - } - - inline void EnablePoll() { - noInterrupts(); - usb_task_polling_disabled--; - DDSB(); - interrupts(); - } - - uint8_t UHS_NI seekInterface(ENUMERATION_INFO *ei, uint16_t inf, USB_FD_CONFIGURATION_DESCRIPTOR *ucd); - - uint8_t UHS_NI setEpInfoEntry(uint8_t addr, uint8_t iface, uint8_t epcount, volatile UHS_EpInfo* eprecord_ptr); - - uint8_t UHS_NI EPClearHalt(uint8_t addr, uint8_t ep); - - uint8_t UHS_NI ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr); - - uint8_t UHS_NI getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr); - - uint8_t UHS_NI getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr); - - uint8_t UHS_NI setAddr(uint8_t oldaddr, uint8_t newaddr); - - uint8_t UHS_NI setConf(uint8_t addr, uint8_t conf_value); - - uint8_t UHS_NI getStrDescr(uint8_t addr, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); - - void UHS_NI ReleaseDevice(uint8_t addr); - - uint8_t UHS_NI Configuring(uint8_t parent, uint8_t port, uint8_t speed); - - void UHS_NI DeviceDefaults(uint8_t maxep, UHS_USBInterface *device); - - UHS_EpInfo* UHS_NI getEpInfoEntry(uint8_t addr, uint8_t ep); - - inline uint8_t getUsbTaskState() { - return ( usb_task_state); - }; - - inline AddressPool* GetAddressPool() { - return &addrPool; - }; - - int UHS_NI RegisterDeviceClass(UHS_USBInterface *pdev) { - for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { - if(!devConfig[i]) { - devConfig[i] = pdev; - return i; - } - } - //return UHS_HOST_ERROR_CANT_REGISTER_DEVICE_CLASS; - return -1; - }; -#if 0 - - inline void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) { - addrPool.ForEachUsbDevice(pfunc); - }; -#endif - - uint8_t TestInterface(ENUMERATION_INFO *ei); - uint8_t enumerateInterface(ENUMERATION_INFO *ei); - uint8_t getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pep, uint8_t data[], uint16_t *left, uint16_t *read, uint8_t *offset); - uint8_t initDescrStream(ENUMERATION_INFO *ei, USB_FD_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset); - uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data); - uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data); - uint8_t doSoftReset(uint8_t parent, uint8_t port, uint8_t address); - uint8_t getone(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset); - uint8_t eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset, uint16_t *yum); - -}; - -// All device interface drivers use this subclass - -class UHS_USBInterface { -public: - - UHS_USB_HOST_BASE *pUsb; // Parent USB host - volatile uint8_t bNumEP; // total number of EP in this interface - volatile UHS_EpInfo epInfo[16]; // This is a stub, override in the driver. - - volatile uint8_t bAddress; // address of the device - volatile uint8_t bConfNum; // configuration number - volatile uint8_t bIface; // interface value - volatile bool bPollEnable; // poll enable flag, operating status - volatile uint32_t qNextPollTime; // next poll time - - /** - * Resets interface driver to unused state. You should override this in - * your driver if it requires extra class variable cleanup. - */ - virtual void DriverDefaults() { - printf("Default driver defaults.\r\n"); - pUsb->DeviceDefaults(bNumEP, this); - }; - - /** - * Checks if this interface is supported. - * Executed called when new devices are connected. - * - * @param ei - * @return true if the interface is supported - */ - virtual bool OKtoEnumerate(NOTUSED(ENUMERATION_INFO *ei)) { - return false; - }; - - /** - * Configures any needed endpoint information for an interface. - * You must provide this in your driver. - * Executed when new devices are connected and OKtoEnumerate() - * returned true. - * - * @param ei - * @return zero on success - */ - virtual uint8_t SetInterface(NOTUSED(ENUMERATION_INFO *ei)) { - return UHS_HOST_ERROR_NOT_IMPLEMENTED; - }; - - /** - * Interface specific additional setup and enumeration that - * can't occur when the descriptor stream is open. - * Also used for collection of unclaimed interfaces, to link to the master. - * - * @return zero on success - */ - virtual uint8_t Finalize() { - return 0; - }; - - /** - * Executed after interface is finalized but, before polling has started. - * - * @return 0 on success - */ - virtual uint8_t OnStart() { - return 0; - }; - - /** - * Start interface polling - * @return - */ - virtual uint8_t Start() { - uint8_t rcode = OnStart(); - if(!rcode) bPollEnable = true; - return rcode; - }; - - /** - * Executed before anything else in Release(). - */ - virtual void OnRelease() { - return; - }; - - /** - * Release resources when device is disconnected. - * Normally this does not need to be overridden. - */ - virtual void Release() { - OnRelease(); - DriverDefaults(); - return; - }; - - /** - * Executed After driver polls. - * Can be used when there is an important change detected during polling - * and you want to handle it elsewhere. - * Examples: - * Media status change for bulk, e.g. ready, not-ready, media changed, door opened. - * Button state/joystick position/etc changes on a HID device. - * Flow control status change on a communication device, e.g. CTS on serial - */ - virtual void OnPoll() { - return; - }; - - /** - * Poll interface driver. You should override this in your driver if you - * require polling faster or slower than every 100 milliseconds, or your - * driver requires special housekeeping. - */ - virtual void Poll() { - OnPoll(); - qNextPollTime = millis() + 100; - }; - - virtual bool UHS_NI Polling() { - return bPollEnable; - } - - /** - * This is only for a hub. - * @param port - */ - virtual void ResetHubPort(NOTUSED(uint8_t port)) { - return; - }; - -#if 0 - /** - * @return true if this interface is Vendor Specific. - */ - virtual bool IsVSI() { - return false; - } -#endif -}; - -#if 0 -/** - * Vendor Specific interface class. - * This is used by a partner interface. - * It can also be used to force-enumerate an interface that - * can use this interface directly. - * You can also add an instance of this class within the interface constructor - * if you expect the interface. - * - * If this is not needed, it may be removed. Nothing I have written needs this. - * Let me know if it is not required, then IsVSI method can also be shit-canned. - * -- AJK - */ - -class UHS_VSI : public UHS_USBInterface { -public: - volatile UHS_EpInfo epInfo[1]; - volatile ENUMERATION_INFO eInfo; - UHS_VSI(UHS_USB_HOST_BASE *p); - bool OKtoEnumerate(ENUMERATION_INFO *ei); - uint8_t SetInterface(ENUMERATION_INFO *ei); - virtual void DriverDefaults(); - virtual void Release(); - - uint8_t GetAddress() { - return bAddress; - }; - - virtual bool IsVSI() { - return true; - } - -}; -#endif - -#endif //_USBHOST_H_ -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_util_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_util_INLINE.h deleted file mode 100644 index 52015b5987..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_util_INLINE.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#if defined(LOAD_USB_HOST_SYSTEM) && !defined(USB_HOST_SYSTEM_UTIL_LOADED) -#define USB_HOST_SYSTEM_UTIL_LOADED - -// 0x80 is the default (i.e. trace) to turn off set this global to something lower. -// this allows for 126 other debugging levels. -// TO-DO: Allow assignment to a different serial port by software -int UsbDEBUGlvl = 0x80; - -void E_Notifyc(char c, int lvl) { - if(UsbDEBUGlvl < lvl) return; -#if defined(ARDUINO) && ARDUINO >=100 - USB_HOST_SERIAL.print(c); -#else - USB_HOST_SERIAL.print(c, BYTE); -#endif - //USB_HOST_SERIAL.flush(); -} - -void E_Notify(char const * msg, int lvl) { - if(UsbDEBUGlvl < lvl) return; - if(!msg) return; - char c; - - while((c = pgm_read_byte(msg++))) E_Notifyc(c, lvl); -} - -void E_NotifyStr(char const * msg, int lvl) { - if(UsbDEBUGlvl < lvl) return; - if(!msg) return; - char c; - - while((c = *msg++)) E_Notifyc(c, lvl); -} - -void E_Notify(uint8_t b, int lvl) { - if(UsbDEBUGlvl < lvl) return; -#if defined(ARDUINO) && ARDUINO >=100 - USB_HOST_SERIAL.print(b); -#else - USB_HOST_SERIAL.print(b, DEC); -#endif -} - -void E_Notify(double d, int lvl) { - if(UsbDEBUGlvl < lvl) return; - USB_HOST_SERIAL.print(d); -} - -#ifdef DEBUG_USB_HOST - -void NotifyFailGetDevDescr() { - Notify(PSTR("\r\ngetDevDescr "), 0x80); -} - -void NotifyFailSetDevTblEntry() { - Notify(PSTR("\r\nsetDevTblEn "), 0x80); -} - -void NotifyFailGetConfDescr() { - Notify(PSTR("\r\ngetConf "), 0x80); -} - -void NotifyFailSetConfDescr() { - Notify(PSTR("\r\nsetConf "), 0x80); -} - -void NotifyFailGetDevDescr(uint8_t reason) { - NotifyFailGetDevDescr(); - NotifyFail(reason); -} - -void NotifyFailSetDevTblEntry(uint8_t reason) { - NotifyFailSetDevTblEntry(); - NotifyFail(reason); - -} - -void NotifyFailGetConfDescr(uint8_t reason) { - NotifyFailGetConfDescr(); - NotifyFail(reason); -} - -void NotifyFailSetConfDescr(uint8_t reason) { - NotifyFailSetConfDescr(); - NotifyFail(reason); -} - -void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID) { - Notify(PSTR("\r\nUnknown Device Connected - VID: "), 0x80); - D_PrintHex (VID, 0x80); - Notify(PSTR(" PID: "), 0x80); - D_PrintHex (PID, 0x80); -} - -void NotifyFail(uint8_t rcode) { - D_PrintHex (rcode, 0x80); - Notify(PSTR("\r\n"), 0x80); -} -#endif - -#else -#error "Never include UHS_util_INLINE.h, include UHS_host.h instead" -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h deleted file mode 100644 index 8ecafd4ad8..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h +++ /dev/null @@ -1,226 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This software may be distributed and modified under the terms of the GNU -General Public License version 2 (GPL2) as published by the Free Software -Foundation and appearing in the file GPL2.TXT included in the packaging of -this file. Please note that GPL2 Section 2[b] requires that all works based -on this software must also be made publicly available under the terms of -the GPL2 ("Copyleft"). - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ -#if !defined(USB_HOST_SHIELD_H) || defined(_max3421e_h_) -#error "Never include UHS_max3421e.h directly; include USB_HOST_SHIELD.h instead" -#else - -#define _max3421e_h_ - -/* MAX3421E register/bit names and bitmasks */ - -#define SE0 0 -#define SE1 1 -#define FSHOST 2 -#define LSHOST 3 - -/* MAX3421E command byte format: rrrrr0wa where 'r' is register number */ - -// -// MAX3421E Registers in HOST mode. -// -#define rRCVFIFO 0x08 // Receive FIFO Register -#define rSNDFIFO 0x10 // Send FIFO Register -#define rSUDFIFO 0x20 // Set Up Data FIFO Register -#define rRCVBC 0x30 // Receive FIFO Byte Count Register -#define rSNDBC 0x38 // Send FIFO Byte Count Register - -// USB Interrupt Request Status (USBIRQ) -#define rUSBIRQ 0x68 // USB Interrupt Request Register -#define bmVBUSIRQ 0x40 // Vbus Present Interrupt Request -#define bmNOVBUSIRQ 0x20 // Vbus Absent Interrupt Request -#define bmOSCOKIRQ 0x01 // Oscillator OK Interrupt Request - -// USB Interrupt Request Control (USBIEN) -#define rUSBIEN 0x70 // USB Interrupt Request Enable Register -#define bmVBUSIE bmVBUSIRQ // Vbus Present Interrupt Request Enable -#define bmNOVBUSIE bmNOVBUSIRQ // Vbus Absent Interrupt Request Enable -#define bmOSCOKIE bmOSCOKIRQ // Oscillator OK Interrupt Request Enable - -// (USBCTL) -#define rUSBCTL 0x78 //15<<3 -#define bmCHIPRES 0x20 //b5 -#define bmPWRDOWN 0x10 //b4 - -// (CPUCTL) -#define rCPUCTL 0x80 //16<<3 -#define bmPUSLEWID1 0x80 //b7 -#define bmPULSEWID0 0x40 //b6 -#define bmIE 0x01 //b0 - -// bmPUSLEWID1 bmPULSEWID0 Pulse width -// 0 0 10.6uS -// 0 1 5.3uS -// 1 0 2.6uS -// 1 1 1.3uS -#define PUSLEWIDTH10_6 (0) -#define PUSLEWIDTH5_3 (bmPULSEWID0) -#define PUSLEWIDTH2_6 (bmPUSLEWID1) -#define PUSLEWIDTH1_3 (bmPULSEWID0 | bmPUSLEWID1) - -// (PINCTL) -#define rPINCTL 0x88 //17<<3 -#define bmFDUPSPI 0x10 //b4 -#define bmINTLEVEL 0x08 //b3 -#define bmPOSINT 0x04 //b2 -#define bmGPXB 0x02 //b1 -#define bmGPXA 0x01 //b0 - -// GPX pin selections -#define GPX_OPERATE 0x00 // -#define GPX_VBDET 0x01 // -#define GPX_BUSACT 0x02 // -#define GPX_SOF 0x03 // - -#define rREVISION 0x90 //18<<3 - -// (IOPINS1) -#define rIOPINS1 0xA0 //20<<3 -#define bmGPOUT0 0x01 // -#define bmGPOUT1 0x02 // -#define bmGPOUT2 0x04 // -#define bmGPOUT3 0x08 // -#define bmGPIN0 0x10 // -#define bmGPIN1 0x20 // -#define bmGPIN2 0x40 // -#define bmGPIN3 0x80 // - -// (IOPINS2) -#define rIOPINS2 0xA8 //21<<3 -#define bmGPOUT4 0x01 // -#define bmGPOUT5 0x02 // -#define bmGPOUT6 0x04 // -#define bmGPOUT7 0x08 // -#define bmGPIN4 0x10 // -#define bmGPIN5 0x20 // -#define bmGPIN6 0x40 // -#define bmGPIN7 0x80 // - -// (GPINIRQ) -#define rGPINIRQ 0xB0 //22<<3 -#define bmGPINIRQ0 0x01 // -#define bmGPINIRQ1 0x02 // -#define bmGPINIRQ2 0x04 // -#define bmGPINIRQ3 0x08 // -#define bmGPINIRQ4 0x10 // -#define bmGPINIRQ5 0x20 // -#define bmGPINIRQ6 0x40 // -#define bmGPINIRQ7 0x80 // - -// (GPINIEN) -#define rGPINIEN 0xB8 //23<<3 -#define bmGPINIEN0 0x01 // -#define bmGPINIEN1 0x02 // -#define bmGPINIEN2 0x04 // -#define bmGPINIEN3 0x08 // -#define bmGPINIEN4 0x10 // -#define bmGPINIEN5 0x20 // -#define bmGPINIEN6 0x40 // -#define bmGPINIEN7 0x80 // - -// (GPINPOL) -#define rGPINPOL 0xC0 //24<<3 -#define bmGPINPOL0 0x01 // -#define bmGPINPOL1 0x02 // -#define bmGPINPOL2 0x04 // -#define bmGPINPOL3 0x08 // -#define bmGPINPOL4 0x10 // -#define bmGPINPOL5 0x20 // -#define bmGPINPOL6 0x40 // -#define bmGPINPOL7 0x80 // - -// -// If any data transfer errors occur, the HXFRDNIRQ asserts, while the RCVDAVIRQ does not. -// -// The CPU clears the SNDBAVIRQ by writing the SNDBC register. -// The CPU should never directly clear the SNDBAVIRQ bit. - -// Host Interrupt Request Status (HIRQ) -#define rHIRQ 0xC8 // Host Interrupt Request Register -#define bmBUSEVENTIRQ 0x01 // BUS Reset Done or BUS Resume Interrupt Request -#define bmRWUIRQ 0x02 // Remote Wakeup Interrupt Request -#define bmRCVDAVIRQ 0x04 // Receive FIFO Data Available Interrupt Request -#define bmSNDBAVIRQ 0x08 // Send Buffer Available Interrupt Request -#define bmSUSDNIRQ 0x10 // Suspend operation Done Interrupt Request -#define bmCONDETIRQ 0x20 // Peripheral Connect/Disconnect Interrupt Request -#define bmFRAMEIRQ 0x40 // Frame Generator Interrupt Request -#define bmHXFRDNIRQ 0x80 // Host Transfer Done Interrupt Request - -// IRQs that are OK for the CPU to clear -#define ICLRALLBITS (bmBUSEVENTIRQ | bmRWUIRQ | bmRCVDAVIRQ | bmSUSDNIRQ | bmCONDETIRQ | bmFRAMEIRQ | bmHXFRDNIRQ) - -// Host Interrupt Request Control (HIEN) -#define rHIEN 0xD0 // -#define bmBUSEVENTIE bmBUSEVENTIRQ // BUS Reset Done or BUS Resume Interrupt Request Enable -#define bmRWUIE bmRWUIRQ // Remote Wakeup Interrupt Request Enable -#define bmRCVDAVIE bmRCVDAVIRQ // Receive FIFO Data Available Interrupt Request Enable -#define bmSNDBAVIE bmSNDBAVIRQ // Send Buffer Available Interrupt Request Enable -#define bmSUSDNIE bmSUSDNIRQ // Suspend operation Done Interrupt Request Enable -#define bmCONDETIE bmCONDETIRQ // Peripheral Connect/Disconnect Interrupt Request Enable -#define bmFRAMEIE bmFRAMEIRQ // Frame Generator Interrupt Request Enable -#define bmHXFRDNIE bmHXFRDNIRQ // Host Transfer Done Interrupt Request Enable - -// (MODE)) -#define rMODE 0xD8 //27<<3 -#define bmHOST 0x01 // -#define bmLOWSPEED 0x02 // -#define bmHUBPRE 0x04 // -#define bmSOFKAENAB 0x08 // -#define bmSEPIRQ 0x10 // -#define bmDELAYISO 0x20 // -#define bmDMPULLDN 0x40 // -#define bmDPPULLDN 0x80 // - -#define rPERADDR 0xE0 //28<<3 - -// (HCTL) -#define rHCTL 0xE8 //29<<3 -#define bmBUSRST 0x01 // -#define bmFRMRST 0x02 // -#define bmSAMPLEBUS 0x04 // -#define bmSIGRSM 0x08 // -#define bmRCVTOG0 0x10 // -#define bmRCVTOG1 0x20 // -#define bmSNDTOG0 0x40 // -#define bmSNDTOG1 0x80 // - -// Host transfer (HXFR) -#define rHXFR 0xF0 //30<<3 -/* Host transfer token values for writing the HXFR register (R30) */ -/* OR this bit field with the endpoint number in bits 3:0 */ -#define MAX3421E_tokSETUP 0x10 // HS=0, ISO=0, OUTNIN=0, SETUP=1 -#define MAX3421E_tokIN 0x00 // HS=0, ISO=0, OUTNIN=0, SETUP=0 -#define MAX3421E_tokOUT 0x20 // HS=0, ISO=0, OUTNIN=1, SETUP=0 -#define MAX3421E_tokINHS 0x80 // HS=1, ISO=0, OUTNIN=0, SETUP=0 -#define MAX3421E_tokOUTHS 0xA0 // HS=1, ISO=0, OUTNIN=1, SETUP=0 -#define MAX3421E_tokISOIN 0x40 // HS=0, ISO=1, OUTNIN=0, SETUP=0 -#define MAX3421E_tokISOOUT 0x60 // HS=0, ISO=1, OUTNIN=1, SETUP=0 - -// (HRSL) -#define rHRSL 0xF8 //31<<3 -#define bmRCVTOGRD 0x10 // -#define bmSNDTOGRD 0x20 // -#define bmKSTATUS 0x40 // -#define bmJSTATUS 0x80 // -#define bmSE0 0x00 //SE0 - disconnect state -#define bmSE1 0xC0 //SE1 - illegal state - -#define MODE_FS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmSOFKAENAB) -#define MODE_LS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmLOWSPEED|bmSOFKAENAB) - -#endif //_max3421e_h_ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h deleted file mode 100644 index 56d6400979..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h +++ /dev/null @@ -1,519 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This software may be distributed and modified under the terms of the GNU -General Public License version 2 (GPL2) as published by the Free Software -Foundation and appearing in the file GPL2.TXT included in the packaging of -this file. Please note that GPL2 Section 2[b] requires that all works based -on this software must also be made publicly available under the terms of -the GPL2 ("Copyleft"). - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#ifndef USB_HOST_SHIELD_H -#define USB_HOST_SHIELD_H - -// uncomment to get 'printf' console debugging. NOT FOR UNO! -//#define DEBUG_PRINTF_EXTRA_HUGE_USB_HOST_SHIELD - -#ifdef LOAD_USB_HOST_SHIELD -#include "UHS_max3421e.h" -#include - - -#ifndef SPI_HAS_TRANSACTION -#error "Your SPI library installation is too old." -#else -#ifndef SPI_ATOMIC_VERSION -#warning "Your SPI library installation lacks 'SPI_ATOMIC_VERSION'. Please complain to the maintainer." -#elif SPI_ATOMIC_VERSION < 1 -#error "Your SPI library installation is too old." -#endif - -#endif -#if DEBUG_PRINTF_EXTRA_HUGE -#ifdef DEBUG_PRINTF_EXTRA_HUGE_USB_HOST_SHIELD -#define MAX_HOST_DEBUG(...) printf_P(__VA_ARGS__) -#else -#define MAX_HOST_DEBUG(...) VOID0 -#endif -#else -#define MAX_HOST_DEBUG(...) VOID0 -#endif - -#ifndef USB_HOST_SHIELD_USE_ISR -#ifdef USE_MULTIPLE_APP_API -#define USB_HOST_SHIELD_USE_ISR 0 -#else -#define USB_HOST_SHIELD_USE_ISR 1 -#endif -#else -#define USB_HOST_SHIELD_USE_ISR 1 -#endif - - - -#if !USB_HOST_SHIELD_USE_ISR -#error NOISR Polled mode _NOT SUPPORTED YET_ - -// -// Polled defaults -// -#ifdef BOARD_BLACK_WIDDOW -#define UHS_MAX3421E_SS_ 6 -#define UHS_MAX3421E_INT_ 3 -#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)) -#if EXT_RAM -// Teensy++ 2.0 with XMEM2 -#define UHS_MAX3421E_SS_ 20 -#define UHS_MAX3421E_INT_ 7 -#else -#define UHS_MAX3421E_SS_ 9 -#define UHS_MAX3421E_INT_ 8 -#endif -#define UHS_MAX3421E_SPD -#elif defined(ARDUINO_AVR_ADK) -#define UHS_MAX3421E_SS_ 53 -#define UHS_MAX3421E_INT_ 54 -#elif defined(ARDUINO_AVR_BALANDUINO) -#define UHS_MAX3421E_SS_ 20 -#define UHS_MAX3421E_INT_ 19 -#else -#define UHS_MAX3421E_SS_ 10 -#define UHS_MAX3421E_INT_ 9 -#endif - -#else -#ifdef ARDUINO_ARCH_PIC32 -// PIC32 only allows edge interrupts, isn't that lovely? We'll emulate it... -#if CHANGE < 2 -#error core too old. -#endif - -#define IRQ_IS_EDGE 0 -#ifndef digitalPinToInterrupt -// great, this isn't implemented. -#warning digitalPinToInterrupt is not defined, complain here https://github.com/chipKIT32/chipKIT-core/issues/114 -#if defined(_BOARD_UNO_) || defined(_BOARD_UC32_) -#define digitalPinToInterrupt(p) ((p) == 2 ? 1 : ((p) == 7 ? 2 : ((p) == 8 ? 3 : ((p) == 35 ? 4 : ((p) == 38 ? 0 : NOT_AN_INTERRUPT))))) -#warning digitalPinToInterrupt is now defined until this is taken care of. -#else -#error digitalPinToInterrupt not defined for your board, complain here https://github.com/chipKIT32/chipKIT-core/issues/114 -#endif -#endif -#else -#define IRQ_IS_EDGE 0 -#endif - -// More stupidity from our friends @ Sony... -#ifdef ARDUINO_spresense_ast -#ifndef NOT_AN_INTERRUPT -#define NOT_AN_INTERRUPT -1 -#endif -#endif - -// SAMD uses an enum for this instead of a define. Isn't that just dandy? -#if !defined(NOT_AN_INTERRUPT) && !defined(ARDUINO_ARCH_SAMD) -#warning NOT_AN_INTERRUPT not defined, possible problems ahead. -#warning If NOT_AN_INTERRUPT is an enum or something else, complain to UHS30 developers on github. -#warning Otherwise complain to your board core developer/maintainer. -#define NOT_AN_INTERRUPT -1 -#endif - -// -// Interrupt defaults. Int0 or Int1 -// -#ifdef BOARD_BLACK_WIDDOW -#error "HELP! Please send us an email, I don't know the values for Int0 and Int1 on the Black Widow board!" -#elif defined(ARDUINO_AVR_ADK) -#define UHS_MAX3421E_SS_ 53 -#define UHS_MAX3421E_INT_ 54 -#elif defined(ARDUINO_spresense_ast) -#define UHS_MAX3421E_SS_ 21 -#define UHS_MAX3421E_INT_ 20 -#define SPIclass SPI5 -//#define UHS_MAX3421E_SPD 100000 -#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)) - -// TO-DO! - -#if EXT_RAM -// Teensy++ 2.0 with XMEM2 -#define UHS_MAX3421E_SS_ 20 -#define UHS_MAX3421E_INT_ 7 -#else -#define UHS_MAX3421E_SS_ 9 -#define UHS_MAX3421E_INT_ 8 -#endif - -#elif defined(ARDUINO_AVR_BALANDUINO) -#error "ISR mode is currently not supported on the Balanduino. Please set USB_HOST_SHIELD_USE_ISR to 0." -#else -#define UHS_MAX3421E_SS_ 10 -#ifdef __AVR__ -#ifdef __AVR_ATmega32U4__ -#define INT_FOR_PIN2 1 -#define INT_FOR_PIN3 0 -#else -// Everybody else??? -#define INT_FOR_PIN2 0 -#define INT_FOR_PIN3 1 -#endif -#define UHS_MAX3421E_INT_ 3 -#else -// Non-avr -#ifdef ARDUINO_ARCH_PIC32 -// UNO32 External Interrupts: -// Pin 38 (INT0), Pin 2 (INT1), Pin 7 (INT2), Pin 8 (INT3), Pin 35 (INT4) -#define UHS_MAX3421E_INT_ 7 -#else -#define UHS_MAX3421E_INT_ 9 -#endif -#endif -#endif -#endif - - - -#ifdef NO_AUTO_SPEED -// Ugly details section... -// MAX3421E characteristics -// SPI Serial - Clock Input. An external SPI master supplies SCLK with frequencies up to 26MHz. The -// logic level is referenced to the voltage on VL. Data is clocked into the SPI slave inter face on the -// rising edge of SCLK. Data is clocked out of the SPI slave interface on the falling edge of SCLK. -// Serial Clock (SCLK) Period 38.4ns minimum. 17ns minimum pulse width. VL >2.5V -// SCLK Fall to MISO Propagation Delay 14.2ns -// SCLK Fall to MOSI Propagation Delay 14.2ns -// SCLK Fall to MOSI Drive 3.5ns -// Theoretical deadline for reply 17.7ns -// 26MHz 38.4615ns period <-- MAX3421E theoretical maximum - -#ifndef UHS_MAX3421E_SPD -#ifdef ARDUINO_SAMD_ZERO -// Zero violates spec early, needs a long setup time, or doesn't like high latency. -#define UHS_MAX3421E_SPD 10000000 -#elif defined(ARDUINO_ARCH_PIC32) -// PIC MX 5/6/7 characteristics -// 25MHZ 40ns period <-- PIC MX 5/6/7 theoretical maximum -// pulse width minimum Tsclk/2ns -// Trise/fall 10ns maximum. 5ns is typical but not guaranteed. -// Tsetup minimum for MISO 10ns. -// We are in violation by 7.7ns @ 25MHz due to latency alone. -// Even reading at end of data cycle, we only have a 2.3ns window. -// This is too narrow to to compensate for capacitance, trace lengths, and noise. - -// 17.7ns + 10ns = 27.7ns -// 18MHz fits and has enough slack time to compensate for capacitance, trace lengths, and noise. -// For high speeds the SMP bit is recommended too, which samples at the end instead of the middle. -// 20Mhz seems to work. - -#define UHS_MAX3421E_SPD 20000000 -#else -#define UHS_MAX3421E_SPD 25000000 -#endif -#endif -#else -// We start at 25MHz, and back down until hardware can take it. -// Of course, SPI library can adjust this for us too. -// Why not 26MHz? Because I have not found any MCU board that -// can actually go that fast without problems. -// Could be a shield limitation too. -#ifndef UHS_MAX3421E_SPD -#define UHS_MAX3421E_SPD 25000000 -#endif -#endif - -#ifndef UHS_MAX3421E_INT -#define UHS_MAX3421E_INT UHS_MAX3421E_INT_ -#endif - -#ifndef UHS_MAX3421E_SS -#define UHS_MAX3421E_SS UHS_MAX3421E_SS_ -#endif - -// NOTE: On the max3421e the irq enable and irq bits are in the same position. - -// IRQs used if CPU polls -#define ENIBITSPOLLED (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE) -// IRQs used if CPU is interrupted -#define ENIBITSISR (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE /* | bmRCVDAVIRQ | bmSNDBAVIRQ | bmHXFRDNIRQ */ ) - -#if !USB_HOST_SHIELD_USE_ISR -#define IRQ_CHECK_MASK (ENIBITSPOLLED & ICLRALLBITS) -#define IRQ_IS_EDGE 0 -#else -#define IRQ_CHECK_MASK (ENIBITSISR & ICLRALLBITS) -#endif - -#if IRQ_IS_EDGE -// Note: UNO32 Interrupts can only be RISING, or FALLING. -// This poses an interesting problem, since we want to use a LOW level. -// The MAX3421E provides for pulse width control for an IRQ. -// We do need to watch the timing on this, as a second IRQ could cause -// a missed IRQ, since we read the level of the line to check if the IRQ -// is actually for this chip. The only other alternative is to add a capacitor -// and an NPN transistor, and use two lines. We can try this first, though. -// Worse case, we can ignore reading the pin for verification on UNO32. -// Too bad there is no minimum low width setting. -// -// Single Clear First Second Clear first Clear last -// IRQ Single IRQ IRQ Second active pending IRQ -// | | | | | | -// V V V V V V -// _____ _________ _ _ _______ -// |______| |______| |______| |______________| -// -#define IRQ_SENSE FALLING -#ifdef ARDUINO_ARCH_PIC32 -//#define bmPULSEWIDTH PUSLEWIDTH10_6 -#define bmPULSEWIDTH 0 -#define bmIRQ_SENSE 0 -#else -#define bmPULSEWIDTH PUSLEWIDTH1_3 -#define bmIRQ_SENSE 0 -#endif -#else -#ifndef IRQ_SENSE -#define IRQ_SENSE LOW -#endif -#ifndef bmPULSEWIDTH -#define bmPULSEWIDTH 0 -#endif -#ifndef bmIRQ_SENSE -#define bmIRQ_SENSE bmINTLEVEL -#endif -#endif - -class MAX3421E_HOST : -public UHS_USB_HOST_BASE -#ifdef SWI_IRQ_NUM -, public dyn_SWI -#endif -{ - // TO-DO: move these into the parent class. - volatile uint8_t vbusState; - volatile uint16_t sof_countdown; - - // TO-DO: pack into a struct/union and use one byte - volatile bool busevent; - volatile bool sofevent; - volatile bool counted; - volatile bool condet; - volatile bool doingreset; - - #ifdef USB_HOST_MANUAL_POLL - volatile bool frame_irq_enabled = false; - - bool enable_frame_irq(bool enable) { - const bool prev_state = frame_irq_enabled; - if(prev_state != enable) { - if(enable) - regWr(rHIEN, regRd(rHIEN) | bmFRAMEIE); - else - regWr(rHIEN, regRd(rHIEN) & ~bmFRAMEIE); - frame_irq_enabled = enable; - } - return prev_state; - } - #endif - -public: - SPISettings MAX3421E_SPI_Settings; - uint8_t ss_pin; - uint8_t irq_pin; - // Will use the defaults UHS_MAX3421E_SS, UHS_MAX3421E_INT and speed - - UHS_NI MAX3421E_HOST() { - sof_countdown = 0; - busevent = false; - doingreset = false; - sofevent = false; - condet = false; - ss_pin = UHS_MAX3421E_SS; - irq_pin = UHS_MAX3421E_INT; - MAX3421E_SPI_Settings = SPISettings(UHS_MAX3421E_SPD, MSBFIRST, SPI_MODE0); - hub_present = 0; - }; - - // Will use user supplied pins, and UHS_MAX3421E_SPD - - UHS_NI MAX3421E_HOST(uint8_t pss, uint8_t pirq) { - sof_countdown = 0; - busevent = false; - doingreset = false; - sofevent = false; - condet = false; - ss_pin = pss; - irq_pin = pirq; - MAX3421E_SPI_Settings = SPISettings(UHS_MAX3421E_SPD, MSBFIRST, SPI_MODE0); - hub_present = 0; - }; - - // Will use user supplied pins, and speed - - UHS_NI MAX3421E_HOST(uint8_t pss, uint8_t pirq, uint32_t pspd) { - sof_countdown = 0; - doingreset = false; - busevent = false; - sofevent = false; - condet = false; - ss_pin = pss; - irq_pin = pirq; - MAX3421E_SPI_Settings = SPISettings(pspd, MSBFIRST, SPI_MODE0); - hub_present = 0; - }; - - virtual bool UHS_NI sof_delay(uint16_t x) { -#ifdef USB_HOST_MANUAL_POLL - const bool saved_irq_state = enable_frame_irq(true); -#endif - sof_countdown = x; - while((sof_countdown != 0) && !condet) { - SYSTEM_OR_SPECIAL_YIELD(); -#if !USB_HOST_SHIELD_USE_ISR - Task(); -#endif - } -#ifdef USB_HOST_MANUAL_POLL - enable_frame_irq(saved_irq_state); -#endif - // Serial.println("...Wake"); - return (!condet); - }; - - virtual UHS_EpInfo *ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t* dataptr); - - virtual void UHS_NI vbusPower(VBUS_t state) { - regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE) | (uint8_t)(state)); - }; - - void UHS_NI Task(); - - virtual uint8_t SetAddress(uint8_t addr, uint8_t ep, UHS_EpInfo **ppep, uint16_t &nak_limit); - virtual uint8_t OutTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data); - virtual uint8_t InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data); - virtual uint8_t ctrlReqClose(UHS_EpInfo *pep, uint8_t bmReqType, uint16_t left, uint16_t nbytes, uint8_t *dataptr); - virtual uint8_t ctrlReqRead(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint16_t nbytes, uint8_t *dataptr); - virtual uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit); - - void UHS_NI ReleaseChildren() { - for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) - if(devConfig[i]) - devConfig[i]->Release(); - hub_present = 0; - }; - - virtual bool IsHub(uint8_t klass) { - if(klass == UHS_USB_CLASS_HUB) { - hub_present = bmHUBPRE; - return true; - } - return false; - }; - - virtual void VBUS_changed(); - - virtual void UHS_NI doHostReset() { -#if USB_HOST_SHIELD_USE_ISR - // Enable interrupts - noInterrupts(); -#endif - doingreset = true; - busevent = true; - regWr(rHIRQ, bmBUSEVENTIRQ); // see data sheet. - regWr(rHCTL, bmBUSRST); //issue bus reset -#if USB_HOST_SHIELD_USE_ISR - DDSB(); - // Enable interrupts - interrupts(); -#endif - while(busevent) { - DDSB(); - SYSTEM_OR_SPECIAL_YIELD(); - } -#endif -#if USB_HOST_SHIELD_USE_ISR - // Enable interrupts - noInterrupts(); -#endif - #ifdef USB_HOST_MANUAL_POLL - enable_frame_irq(true); - #endif - sofevent = true; -#if USB_HOST_SHIELD_USE_ISR - DDSB(); - // Enable interrupts - interrupts(); -#endif - // Wait for SOF - while(sofevent) { - } -#if USB_HOST_SHIELD_USE_ISR - // Enable interrupts - noInterrupts(); -#endif - doingreset = false; -#if USB_HOST_SHIELD_USE_ISR - DDSB(); - // Enable interrupts - interrupts(); - }; - - - int16_t UHS_NI Init(int16_t mseconds); - - int16_t UHS_NI Init() { - return Init(INT16_MIN); - }; - - void ISRTask(); - void ISRbottom(); - void busprobe(); - uint16_t reset(); - - // MAX3421e specific - void regWr(uint8_t reg, uint8_t data); - void gpioWr(uint8_t data); - uint8_t regRd(uint8_t reg); - uint8_t gpioRd(); - uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p); - uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p); - - // ARM/NVIC specific, used to emulate reentrant ISR. -#ifdef SWI_IRQ_NUM - - void dyn_SWISR() { - ISRbottom(); - }; -#endif - - virtual void UHS_NI suspend_host() { - // Used on MCU that lack control of IRQ priority (AVR). - // Suspends ISRs, for critical code. IRQ will be serviced after it is resumed. - // NOTE: you must track the state yourself! -#ifdef __AVR__ - noInterrupts(); - detachInterrupt(UHS_GET_DPI(irq_pin)); - interrupts(); -#endif - }; - - virtual void UHS_NI resume_host(); -}; -#ifndef SPIclass -#define SPIclass SPI -#endif -#ifndef USB_HOST_SHIELD_LOADED -#include "USB_HOST_SHIELD_INLINE.h" -#endif -#else -#error "define LOAD_USB_HOST_SHIELD in your sketch, never include USB_HOST_SHIELD.h in a driver." -#endif -#endif /* USB_HOST_SHIELD_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h deleted file mode 100644 index f7dd315a04..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h +++ /dev/null @@ -1,1003 +0,0 @@ -/* Copyright (C) 2015-2016 Andrew J. Kroll - and -Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. - -This software may be distributed and modified under the terms of the GNU -General Public License version 2 (GPL2) as publishe7d by the Free Software -Foundation and appearing in the file GPL2.TXT included in the packaging of -this file. Please note that GPL2 Section 2[b] requires that all works based -on this software must also be made publicly available under the terms of -the GPL2 ("Copyleft"). - -Contact information -------------------- - -Circuits At Home, LTD -Web : https://www.circuitsathome.com -e-mail : support@circuitsathome.com - */ - -#if defined(USB_HOST_SHIELD_H) && !defined(USB_HOST_SHIELD_LOADED) -#define USB_HOST_SHIELD_LOADED -#include - -#ifndef digitalPinToInterrupt -#error digitalPinToInterrupt not defined, complain to your board maintainer. -#endif - - -#if USB_HOST_SHIELD_USE_ISR - -// allow two slots. this makes the maximum allowed shield count TWO -// for AVRs this is limited to pins 2 and 3 ONLY -// for all other boards, one odd and one even pin number is allowed. -static MAX3421E_HOST *ISReven; -static MAX3421E_HOST *ISRodd; - -static void UHS_NI call_ISReven() { - ISReven->ISRTask(); -} - -static void UHS_NI call_ISRodd() { - UHS_PIN_WRITE(LED_BUILTIN, HIGH); - ISRodd->ISRTask(); -} -#endif - - -void UHS_NI MAX3421E_HOST::resume_host() { - // Used on MCU that lack control of IRQ priority (AVR). - // Resumes ISRs. - // NOTE: you must track the state yourself! -#ifdef __AVR__ - noInterrupts(); - if(irq_pin & 1) { - ISRodd = this; - attachInterrupt(UHS_GET_DPI(irq_pin), call_ISRodd, IRQ_SENSE); - } else { - ISReven = this; - attachInterrupt(UHS_GET_DPI(irq_pin), call_ISReven, IRQ_SENSE); - } - interrupts(); -#endif - -} -/* write single byte into MAX3421e register */ -void UHS_NI MAX3421E_HOST::regWr(uint8_t reg, uint8_t data) { - SPIclass.beginTransaction(MAX3421E_SPI_Settings); - MARLIN_UHS_WRITE_SS(LOW); - SPIclass.transfer(reg | 0x02); - SPIclass.transfer(data); - MARLIN_UHS_WRITE_SS(HIGH); - SPIclass.endTransaction(); -} - - -/* multiple-byte write */ - -/* returns a pointer to memory position after last written */ -uint8_t* UHS_NI MAX3421E_HOST::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { - SPIclass.beginTransaction(MAX3421E_SPI_Settings); - MARLIN_UHS_WRITE_SS(LOW); - SPIclass.transfer(reg | 0x02); - //printf("%2.2x :", reg); - - while(nbytes) { - SPIclass.transfer(*data_p); - //printf("%2.2x ", *data_p); - nbytes--; - data_p++; // advance data pointer - } - MARLIN_UHS_WRITE_SS(HIGH); - SPIclass.endTransaction(); - //printf("\r\n"); - return (data_p); -} -/* GPIO write */ -/*GPIO byte is split between 2 registers, so two writes are needed to write one byte */ - -/* GPOUT bits are in the low nibble. 0-3 in IOPINS1, 4-7 in IOPINS2 */ -void UHS_NI MAX3421E_HOST::gpioWr(uint8_t data) { - regWr(rIOPINS1, data); - data >>= 4; - regWr(rIOPINS2, data); - return; -} - -/* single host register read */ -uint8_t UHS_NI MAX3421E_HOST::regRd(uint8_t reg) { - SPIclass.beginTransaction(MAX3421E_SPI_Settings); - MARLIN_UHS_WRITE_SS(LOW); - SPIclass.transfer(reg); - uint8_t rv = SPIclass.transfer(0); - MARLIN_UHS_WRITE_SS(HIGH); - SPIclass.endTransaction(); - return (rv); -} -/* multiple-byte register read */ - -/* returns a pointer to a memory position after last read */ -uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { - SPIclass.beginTransaction(MAX3421E_SPI_Settings); - MARLIN_UHS_WRITE_SS(LOW); - SPIclass.transfer(reg); - while(nbytes) { - *data_p++ = SPIclass.transfer(0); - nbytes--; - } - MARLIN_UHS_WRITE_SS(HIGH); - SPIclass.endTransaction(); - return ( data_p); -} - -/* GPIO read. See gpioWr for explanation */ - -/* GPIN pins are in high nibbles of IOPINS1, IOPINS2 */ -uint8_t UHS_NI MAX3421E_HOST::gpioRd() { - uint8_t gpin = 0; - gpin = regRd(rIOPINS2); //pins 4-7 - gpin &= 0xF0; //clean lower nibble - gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation. - return ( gpin); -} - -/* reset MAX3421E. Returns number of microseconds it took for PLL to stabilize after reset - or zero if PLL haven't stabilized in 65535 cycles */ -uint16_t UHS_NI MAX3421E_HOST::reset() { - uint16_t i = 0; - - // Initiate chip reset - regWr(rUSBCTL, bmCHIPRES); - regWr(rUSBCTL, 0x00); - - int32_t now; - uint32_t expires = micros() + 65535; - - // Enable full-duplex SPI so we can read rUSBIRQ - regWr(rPINCTL, bmFDUPSPI); - while((int32_t)(micros() - expires) < 0L) { - if((regRd(rUSBIRQ) & bmOSCOKIRQ)) { - break; - } - } - now = (int32_t)(micros() - expires); - if(now < 0L) { - i = 65535 + now; // Note this subtracts, as now is negative - } - return (i); -} - -void UHS_NI MAX3421E_HOST::VBUS_changed() { - /* modify USB task state because Vbus changed or unknown */ - uint8_t speed = 1; - //printf("\r\n\r\n\r\n\r\nSTATE %2.2x -> ", usb_task_state); - switch(vbusState) { - case LSHOST: // Low speed - - speed = 0; - // Intentional fall-through - case FSHOST: // Full speed - // Start device initialization if we are not initializing - // Resets to the device cause an IRQ - // usb_task_state == UHS_USB_HOST_STATE_RESET_NOT_COMPLETE; - //if((usb_task_state & UHS_USB_HOST_STATE_MASK) != UHS_USB_HOST_STATE_DETACHED) { - ReleaseChildren(); - if(!doingreset) { - if(usb_task_state == UHS_USB_HOST_STATE_RESET_NOT_COMPLETE) { - usb_task_state = UHS_USB_HOST_STATE_WAIT_BUS_READY; - } else if(usb_task_state != UHS_USB_HOST_STATE_WAIT_BUS_READY) { - usb_task_state = UHS_USB_HOST_STATE_DEBOUNCE; - } - } - sof_countdown = 0; - break; - case SE1: //illegal state - sof_countdown = 0; - doingreset = false; - ReleaseChildren(); - usb_task_state = UHS_USB_HOST_STATE_ILLEGAL; - break; - case SE0: //disconnected - default: - sof_countdown = 0; - doingreset = false; - ReleaseChildren(); - usb_task_state = UHS_USB_HOST_STATE_IDLE; - break; - } - usb_host_speed = speed; - //printf("0x%2.2x\r\n\r\n\r\n\r\n", usb_task_state); - return; -}; - -/** - * Probe bus to determine device presence and speed, - * then switch host to detected speed. - */ -void UHS_NI MAX3421E_HOST::busprobe() { - uint8_t bus_sample; - uint8_t tmpdata; - bus_sample = regRd(rHRSL); //Get J,K status - bus_sample &= (bmJSTATUS | bmKSTATUS); //zero the rest of the byte - switch(bus_sample) { //start full-speed or low-speed host - case(bmJSTATUS): - // Serial.println("J"); - if((regRd(rMODE) & bmLOWSPEED) == 0) { - regWr(rMODE, MODE_FS_HOST); // start full-speed host - vbusState = FSHOST; - } else { - regWr(rMODE, MODE_LS_HOST); // start low-speed host - vbusState = LSHOST; - } - #ifdef USB_HOST_MANUAL_POLL - enable_frame_irq(true); - #endif - tmpdata = regRd(rMODE) | bmSOFKAENAB; // start SOF generation - regWr(rHIRQ, bmFRAMEIRQ); // see data sheet. - regWr(rMODE, tmpdata); - break; - case(bmKSTATUS): - // Serial.println("K"); - if((regRd(rMODE) & bmLOWSPEED) == 0) { - regWr(rMODE, MODE_LS_HOST); // start low-speed host - vbusState = LSHOST; - } else { - regWr(rMODE, MODE_FS_HOST); // start full-speed host - vbusState = FSHOST; - } - #ifdef USB_HOST_MANUAL_POLL - enable_frame_irq(true); - #endif - tmpdata = regRd(rMODE) | bmSOFKAENAB; // start SOF generation - regWr(rHIRQ, bmFRAMEIRQ); // see data sheet. - regWr(rMODE, tmpdata); - break; - case(bmSE1): //illegal state - // Serial.println("I"); - regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); - vbusState = SE1; - // sofevent = false; - break; - case(bmSE0): //disconnected state - // Serial.println("D"); - regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); - vbusState = SE0; - // sofevent = false; - break; - }//end switch( bus_sample ) -} - -/** - * Initialize USB hardware, turn on VBUS - * - * @param mseconds Delay energizing VBUS after mseconds, A value of INT16_MIN means no delay. - * @return 0 on success, -1 on error - */ -int16_t UHS_NI MAX3421E_HOST::Init(int16_t mseconds) { - usb_task_state = UHS_USB_HOST_STATE_INITIALIZE; //set up state machine - // Serial.print("MAX3421E 'this' USB Host @ 0x"); - // Serial.println((uint32_t)this, HEX); - // Serial.print("MAX3421E 'this' USB Host Address Pool @ 0x"); - // Serial.println((uint32_t)GetAddressPool(), HEX); - Init_dyn_SWI(); - UHS_printf_HELPER_init(); - noInterrupts(); -#ifdef ARDUINO_AVR_ADK - // For Mega ADK, which has a Max3421e on-board, - // set MAX_RESET to output mode, and then set it to HIGH - // PORTJ bit 2 - if(irq_pin == 54) { - DDRJ |= 0x04; // output - PORTJ |= 0x04; // HIGH - } -#endif - SPIclass.begin(); -#ifdef ARDUINO_AVR_ADK - if(irq_pin == 54) { - DDRE &= ~0x20; // input - PORTE |= 0x20; // pullup - } else -#endif - pinMode(irq_pin, INPUT_PULLUP); - //UHS_PIN_WRITE(irq_pin, HIGH); - pinMode(ss_pin, OUTPUT); - MARLIN_UHS_WRITE_SS(HIGH); - -#ifdef USB_HOST_SHIELD_TIMING_PIN - pinMode(USB_HOST_SHIELD_TIMING_PIN, OUTPUT); - // My counter/timer can't work on an inverted gate signal - // so we gate using a high pulse -- AJK - UHS_PIN_WRITE(USB_HOST_SHIELD_TIMING_PIN, LOW); -#endif - interrupts(); - -#if USB_HOST_SHIELD_USE_ISR - int intr = digitalPinToInterrupt(irq_pin); - if(intr == NOT_AN_INTERRUPT) { -#ifdef ARDUINO_AVR_ADK - if(irq_pin == 54) - intr = 6; - else -#endif - return (-2); - } - SPIclass.usingInterrupt(intr); -#else - SPIclass.usingInterrupt(255); -#endif -#ifndef NO_AUTO_SPEED - // test to get to reset acceptance. - uint32_t spd = UHS_MAX3421E_SPD; -again: - MAX3421E_SPI_Settings = SPISettings(spd, MSBFIRST, SPI_MODE0); - if(reset() == 0) { - MAX_HOST_DEBUG(PSTR("Fail SPI speed %lu\r\n"), spd); - if(spd > 1999999) { - spd -= 1000000; - goto again; - } - return (-1); - } else { - // reset passes, does 64k? - uint8_t sample_wr = 0; - uint8_t sample_rd = 0; - uint8_t gpinpol_copy = regRd(rGPINPOL); - for(uint16_t j = 0; j < 65535; j++) { - regWr(rGPINPOL, sample_wr); - sample_rd = regRd(rGPINPOL); - if(sample_rd != sample_wr) { - MAX_HOST_DEBUG(PSTR("Fail SPI speed %lu\r\n"), spd); - if(spd > 1999999) { - spd -= 1000000; - goto again; - } - return (-1); - } - sample_wr++; - } - regWr(rGPINPOL, gpinpol_copy); - } - - MAX_HOST_DEBUG(PSTR("Pass SPI speed %lu\r\n"), spd); -#endif - - if(reset() == 0) { //OSCOKIRQ hasn't asserted in time - MAX_HOST_DEBUG(PSTR("OSCOKIRQ hasn't asserted in time")); - return ( -1); - } - - /* MAX3421E - full-duplex SPI, interrupt kind, vbus off */ - regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE | GPX_VBDET)); - - // Delay a minimum of 1 second to ensure any capacitors are drained. - // 1 second is required to make sure we do not smoke a Microdrive! - if(mseconds != INT16_MIN) { - if(mseconds < 1000) mseconds = 1000; - delay(mseconds); // We can't depend on SOF timer here. - } - - regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host - - // Enable interrupts on the MAX3421e - regWr(rHIEN, IRQ_CHECK_MASK); - // Enable interrupt pin on the MAX3421e, set pulse width for edge - regWr(rCPUCTL, (bmIE | bmPULSEWIDTH)); - - /* check if device is connected */ - regWr(rHCTL, bmSAMPLEBUS); // sample USB bus - while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish - - busprobe(); //check if anything is connected - VBUS_changed(); - - // GPX pin on. This is done here so that a change is detected if we have a switch connected. - /* MAX3421E - full-duplex SPI, interrupt kind, vbus on */ - regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE)); - regWr(rHIRQ, bmBUSEVENTIRQ); // see data sheet. - regWr(rHCTL, bmBUSRST); // issue bus reset to force generate yet another possible IRQ - - -#if USB_HOST_SHIELD_USE_ISR - // Attach ISR to service IRQ from MAX3421e - noInterrupts(); - if(irq_pin & 1) { - ISRodd = this; - attachInterrupt(UHS_GET_DPI(irq_pin), call_ISRodd, IRQ_SENSE); - } else { - ISReven = this; - attachInterrupt(UHS_GET_DPI(irq_pin), call_ISReven, IRQ_SENSE); - } - interrupts(); -#endif - //printf("\r\nrPINCTL 0x%2.2X\r\n", rPINCTL); - //printf("rCPUCTL 0x%2.2X\r\n", rCPUCTL); - //printf("rHIEN 0x%2.2X\r\n", rHIEN); - //printf("irq_pin %i\r\n", irq_pin); - return 0; -} - -/** - * Setup UHS_EpInfo structure - * - * @param addr USB device address - * @param ep Endpoint - * @param ppep pointer to the pointer to a valid UHS_EpInfo structure - * @param nak_limit how many NAKs before aborting - * @return 0 on success - */ -uint8_t UHS_NI MAX3421E_HOST::SetAddress(uint8_t addr, uint8_t ep, UHS_EpInfo **ppep, uint16_t &nak_limit) { - UHS_Device *p = addrPool.GetUsbDevicePtr(addr); - - if(!p) - return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; - - if(!p->epinfo) - return UHS_HOST_ERROR_NULL_EPINFO; - - *ppep = getEpInfoEntry(addr, ep); - - if(!*ppep) - return UHS_HOST_ERROR_NO_ENDPOINT_IN_TABLE; - - nak_limit = (0x0001UL << (((*ppep)->bmNakPower > UHS_USB_NAK_MAX_POWER) ? UHS_USB_NAK_MAX_POWER : (*ppep)->bmNakPower)); - nak_limit--; - /* - USBTRACE2("\r\nAddress: ", addr); - USBTRACE2(" EP: ", ep); - USBTRACE2(" NAK Power: ",(*ppep)->bmNakPower); - USBTRACE2(" NAK Limit: ", nak_limit); - USBTRACE("\r\n"); - */ - regWr(rPERADDR, addr); //set peripheral address - - uint8_t mode = regRd(rMODE); - - //Serial.print("\r\nMode: "); - //Serial.println( mode, HEX); - //Serial.print("\r\nLS: "); - //Serial.println(p->speed, HEX); - - // Set bmLOWSPEED and bmHUBPRE in case of low-speed device, reset them otherwise - regWr(rMODE, (p->speed) ? mode & ~(bmHUBPRE | bmLOWSPEED) : mode | bmLOWSPEED | hub_present); - - return 0; -} - -/** - * Receive a packet - * - * @param pep pointer to a valid UHS_EpInfo structure - * @param nak_limit how many NAKs before aborting - * @param nbytesptr pointer to maximum number of bytes of data to receive - * @param data pointer to data buffer - * @return 0 on success - */ -uint8_t UHS_NI MAX3421E_HOST::InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data) { - uint8_t rcode = 0; - uint8_t pktsize; - - uint16_t nbytes = *nbytesptr; - MAX_HOST_DEBUG(PSTR("Requesting %i bytes "), nbytes); - uint8_t maxpktsize = pep->maxPktSize; - - *nbytesptr = 0; - regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value - - // use a 'break' to exit this loop - while(1) { - rcode = dispatchPkt(MAX3421E_tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS. -#if 0 - // This issue should be resolved now. - if(rcode == UHS_HOST_ERROR_TOGERR) { - //MAX_HOST_DEBUG(PSTR("toggle wrong\r\n")); - // yes, we flip it wrong here so that next time it is actually correct! - pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; - regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value - continue; - } -#endif - if(rcode) { - //MAX_HOST_DEBUG(PSTR(">>>>>>>> Problem! dispatchPkt %2.2x\r\n"), rcode); - break; //should be 0, indicating ACK. Else return error code. - } - /* check for RCVDAVIRQ and generate error if not present */ - /* the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred. Need to add handling for that */ - if((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) { - //MAX_HOST_DEBUG(PSTR(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n")); - rcode = 0xF0; //receive error - break; - } - pktsize = regRd(rRCVBC); //number of received bytes - MAX_HOST_DEBUG(PSTR("Got %i bytes \r\n"), pktsize); - - if(pktsize > nbytes) { //certain devices send more than asked - //MAX_HOST_DEBUG(PSTR(">>>>>>>> Warning: wanted %i bytes but got %i.\r\n"), nbytes, pktsize); - pktsize = nbytes; - } - - int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr); - - if(mem_left < 0) - mem_left = 0; - - data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data); - - regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer - *nbytesptr += pktsize; // add this packet's byte count to total transfer length - - /* The transfer is complete under two conditions: */ - /* 1. The device sent a short packet (L.T. maxPacketSize) */ - /* 2. 'nbytes' have been transferred. */ - if((pktsize < maxpktsize) || (*nbytesptr >= nbytes)) // have we transferred 'nbytes' bytes? - { - // Save toggle value - pep->bmRcvToggle = ((regRd(rHRSL) & bmRCVTOGRD)) ? 1 : 0; - //MAX_HOST_DEBUG(PSTR("\r\n")); - rcode = 0; - break; - } // if - } //while( 1 ) - return ( rcode); -} - -/** - * Transmit a packet - * - * @param pep pointer to a valid UHS_EpInfo structure - * @param nak_limit how many NAKs before aborting - * @param nbytes number of bytes of data to send - * @param data pointer to data buffer - * @return 0 on success - */ -uint8_t UHS_NI MAX3421E_HOST::OutTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) { - uint8_t rcode = UHS_HOST_ERROR_NONE; - uint8_t retry_count; - uint8_t *data_p = data; //local copy of the data pointer - uint16_t bytes_tosend; - uint16_t nak_count; - uint16_t bytes_left = nbytes; - - uint8_t maxpktsize = pep->maxPktSize; - - if(maxpktsize < 1 || maxpktsize > 64) - return UHS_HOST_ERROR_BAD_MAX_PACKET_SIZE; - - unsigned long timeout = millis() + UHS_HOST_TRANSFER_MAX_MS; - - regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value - - while(bytes_left) { - SYSTEM_OR_SPECIAL_YIELD(); - retry_count = 0; - nak_count = 0; - bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left; - bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO - regWr(rSNDBC, bytes_tosend); //set number of bytes - regWr(rHXFR, (MAX3421E_tokOUT | pep->epAddr)); //dispatch packet - while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ - regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ - rcode = (regRd(rHRSL) & 0x0F); - - while(rcode && ((long)(millis() - timeout) < 0L)) { - switch(rcode) { - case UHS_HOST_ERROR_NAK: - nak_count++; - if(nak_limit && (nak_count == nak_limit)) - goto breakout; - break; - case UHS_HOST_ERROR_TIMEOUT: - retry_count++; - if(retry_count == UHS_HOST_TRANSFER_RETRY_MAXIMUM) - goto breakout; - break; - case UHS_HOST_ERROR_TOGERR: - // yes, we flip it wrong here so that next time it is actually correct! - pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; - regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value - break; - default: - goto breakout; - }//switch( rcode - - /* process NAK according to Host out NAK bug */ - regWr(rSNDBC, 0); - regWr(rSNDFIFO, *data_p); - regWr(rSNDBC, bytes_tosend); - regWr(rHXFR, (MAX3421E_tokOUT | pep->epAddr)); //dispatch packet - while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ - regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ - rcode = (regRd(rHRSL) & 0x0F); - SYSTEM_OR_SPECIAL_YIELD(); - }//while( rcode && .... - bytes_left -= bytes_tosend; - data_p += bytes_tosend; - }//while( bytes_left... -breakout: - - pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle - return ( rcode); //should be 0 in all cases -} - -/** - * Send the actual packet. - * - * @param token - * @param ep Endpoint - * @param nak_limit how many NAKs before aborting, 0 == exit after timeout - * @return 0 on success, 0xFF indicates NAK timeout. @see - */ -/* Assumes peripheral address is set and relevant buffer is loaded/empty */ -/* If NAK, tries to re-send up to nak_limit times */ -/* If nak_limit == 0, do not count NAKs, exit after timeout */ -/* If bus timeout, re-sends up to USB_RETRY_LIMIT times */ - -/* return codes 0x00-0x0F are HRSLT( 0x00 being success ), 0xFF means timeout */ -uint8_t UHS_NI MAX3421E_HOST::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) { - unsigned long timeout = millis() + UHS_HOST_TRANSFER_MAX_MS; - uint8_t tmpdata; - uint8_t rcode = UHS_HOST_ERROR_NONE; - uint8_t retry_count = 0; - uint16_t nak_count = 0; - - for(;;) { - regWr(rHXFR, (token | ep)); //launch the transfer - while((long)(millis() - timeout) < 0L) //wait for transfer completion - { - SYSTEM_OR_SPECIAL_YIELD(); - tmpdata = regRd(rHIRQ); - - if(tmpdata & bmHXFRDNIRQ) { - regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt - //rcode = 0x00; - break; - }//if( tmpdata & bmHXFRDNIRQ - - }//while ( millis() < timeout - - rcode = (regRd(rHRSL) & 0x0F); //analyze transfer result - - switch(rcode) { - case UHS_HOST_ERROR_NAK: - nak_count++; - if(nak_limit && (nak_count == nak_limit)) - return (rcode); - delayMicroseconds(200); - break; - case UHS_HOST_ERROR_TIMEOUT: - retry_count++; - if(retry_count == UHS_HOST_TRANSFER_RETRY_MAXIMUM) - return (rcode); - break; - default: - return (rcode); - }//switch( rcode - } -} - -// -// NULL is error, we don't need to know the reason. -// - -UHS_EpInfo * UHS_NI MAX3421E_HOST::ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t *dataptr) { - uint8_t rcode; - UHS_EpInfo *pep = NULL; - uint16_t nak_limit = 0; - rcode = SetAddress(addr, 0, &pep, nak_limit); - - if(!rcode) { - - bytesWr(rSUDFIFO, 8, (uint8_t*)(&Request)); //transfer to setup packet FIFO - - rcode = dispatchPkt(MAX3421E_tokSETUP, 0, nak_limit); //dispatch packet - if(!rcode) { - if(dataptr != NULL) { - if(((Request)/* bmReqType*/ & 0x80) == 0x80) { - pep->bmRcvToggle = 1; //bmRCVTOG1; - } else { - pep->bmSndToggle = 1; //bmSNDTOG1; - } - } - } else { - pep = NULL; - } - } - return pep; -} - -uint8_t UHS_NI MAX3421E_HOST::ctrlReqRead(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint16_t nbytes, uint8_t *dataptr) { - *read = 0; - uint16_t nak_limit = 0; - MAX_HOST_DEBUG(PSTR("ctrlReqRead left: %i\r\n"), *left); - if(*left) { -again: - *read = nbytes; - uint8_t rcode = InTransfer(pep, nak_limit, read, dataptr); - if(rcode == UHS_HOST_ERROR_TOGERR) { - // yes, we flip it wrong here so that next time it is actually correct! - pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; - goto again; - } - - if(rcode) { - MAX_HOST_DEBUG(PSTR("ctrlReqRead ERROR: %2.2x, left: %i, read %i\r\n"), rcode, *left, *read); - return rcode; - } - *left -= *read; - MAX_HOST_DEBUG(PSTR("ctrlReqRead left: %i, read %i\r\n"), *left, *read); - } - return 0; -} - -uint8_t UHS_NI MAX3421E_HOST::ctrlReqClose(UHS_EpInfo *pep, uint8_t bmReqType, uint16_t left, uint16_t nbytes, uint8_t *dataptr) { - uint8_t rcode = 0; - - //MAX_HOST_DEBUG(PSTR("Closing")); - if(((bmReqType & 0x80) == 0x80) && pep && left && dataptr) { - MAX_HOST_DEBUG(PSTR("ctrlReqRead Sinking %i\r\n"), left); - // If reading, sink the rest of the data. - while(left) { - uint16_t read = nbytes; - rcode = InTransfer(pep, 0, &read, dataptr); - if(rcode == UHS_HOST_ERROR_TOGERR) { - // yes, we flip it wrong here so that next time it is actually correct! - pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; - continue; - } - if(rcode) break; - left -= read; - if(read < nbytes) break; - } - } - if(!rcode) { - // Serial.println("Dispatching"); - rcode = dispatchPkt(((bmReqType & 0x80) == 0x80) ? MAX3421E_tokOUTHS : MAX3421E_tokINHS, 0, 0); //GET if direction - // } else { - // Serial.println("Bypassed Dispatch"); - } - return rcode; -} - -/** - * Bottom half of the ISR task - */ -void UHS_NI MAX3421E_HOST::ISRbottom() { - uint8_t x; - // Serial.print("Enter "); - // Serial.print((uint32_t)this,HEX); - // Serial.print(" "); - // Serial.println(usb_task_state, HEX); - - DDSB(); - if(condet) { - VBUS_changed(); -#if USB_HOST_SHIELD_USE_ISR - noInterrupts(); -#endif - condet = false; -#if USB_HOST_SHIELD_USE_ISR - interrupts(); -#endif - } - switch(usb_task_state) { - case UHS_USB_HOST_STATE_INITIALIZE: - // should never happen... - MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_INITIALIZE\r\n")); - busprobe(); - VBUS_changed(); - break; - case UHS_USB_HOST_STATE_DEBOUNCE: - MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_DEBOUNCE\r\n")); - // This seems to not be needed. The host controller has debounce built in. - sof_countdown = UHS_HOST_DEBOUNCE_DELAY_MS; - usb_task_state = UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE; - break; - case UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE: - MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE\r\n")); - if(!sof_countdown) usb_task_state = UHS_USB_HOST_STATE_RESET_DEVICE; - break; - case UHS_USB_HOST_STATE_RESET_DEVICE: - MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_RESET_DEVICE\r\n")); - busevent = true; - usb_task_state = UHS_USB_HOST_STATE_RESET_NOT_COMPLETE; - regWr(rHIRQ, bmBUSEVENTIRQ); // see data sheet. - regWr(rHCTL, bmBUSRST); // issue bus reset - break; - case UHS_USB_HOST_STATE_RESET_NOT_COMPLETE: - MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_RESET_NOT_COMPLETE\r\n")); - if(!busevent) usb_task_state = UHS_USB_HOST_STATE_WAIT_BUS_READY; - break; - case UHS_USB_HOST_STATE_WAIT_BUS_READY: - MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_WAIT_BUS_READY\r\n")); - usb_task_state = UHS_USB_HOST_STATE_CONFIGURING; - break; // don't fall through - - case UHS_USB_HOST_STATE_CONFIGURING: - usb_task_state = UHS_USB_HOST_STATE_CHECK; - x = Configuring(0, 1, usb_host_speed); - usb_error = x; - if(usb_task_state == UHS_USB_HOST_STATE_CHECK) { - if(x) { - MAX_HOST_DEBUG(PSTR("Error 0x%2.2x"), x); - if(x == UHS_HOST_ERROR_JERR) { - usb_task_state = UHS_USB_HOST_STATE_IDLE; - } else if(x != UHS_HOST_ERROR_DEVICE_INIT_INCOMPLETE) { - usb_error = x; - usb_task_state = UHS_USB_HOST_STATE_ERROR; - } - } else - usb_task_state = UHS_USB_HOST_STATE_CONFIGURING_DONE; - } - break; - - case UHS_USB_HOST_STATE_CHECK: - // Serial.println((uint32_t)__builtin_return_address(0), HEX); - break; - case UHS_USB_HOST_STATE_CONFIGURING_DONE: - usb_task_state = UHS_USB_HOST_STATE_RUNNING; - break; - #ifdef USB_HOST_MANUAL_POLL - case UHS_USB_HOST_STATE_RUNNING: - case UHS_USB_HOST_STATE_ERROR: - case UHS_USB_HOST_STATE_IDLE: - case UHS_USB_HOST_STATE_ILLEGAL: - enable_frame_irq(false); - break; - #else - case UHS_USB_HOST_STATE_RUNNING: - Poll_Others(); - for(x = 0; (usb_task_state == UHS_USB_HOST_STATE_RUNNING) && (x < UHS_HOST_MAX_INTERFACE_DRIVERS); x++) { - if(devConfig[x]) { - if(devConfig[x]->bPollEnable) devConfig[x]->Poll(); - } - } - // fall thru - #endif - default: - // Do nothing - break; - } // switch( usb_task_state ) - DDSB(); -#if USB_HOST_SHIELD_USE_ISR - if(condet) { - VBUS_changed(); - noInterrupts(); - condet = false; - interrupts(); - } -#endif -#ifdef USB_HOST_SHIELD_TIMING_PIN - // My counter/timer can't work on an inverted gate signal - // so we gate using a high pulse -- AJK - UHS_PIN_WRITE(USB_HOST_SHIELD_TIMING_PIN, LOW); -#endif - //usb_task_polling_disabled--; - EnablePoll(); - DDSB(); -} - - -/* USB main task. Services the MAX3421e */ -#if !USB_HOST_SHIELD_USE_ISR - -void UHS_NI MAX3421E_HOST::ISRTask() { -} -void UHS_NI MAX3421E_HOST::Task() -#else - -void UHS_NI MAX3421E_HOST::Task() { -#ifdef USB_HOST_MANUAL_POLL - if(usb_task_state == UHS_USB_HOST_STATE_RUNNING) { - noInterrupts(); - for(uint8_t x = 0; x < UHS_HOST_MAX_INTERFACE_DRIVERS; x++) - if(devConfig[x] && devConfig[x]->bPollEnable) - devConfig[x]->Poll(); - interrupts(); - } -#endif -} - -void UHS_NI MAX3421E_HOST::ISRTask() -#endif -{ - DDSB(); - -#ifndef SWI_IRQ_NUM - suspend_host(); -#if USB_HOST_SHIELD_USE_ISR - // Enable interrupts - interrupts(); -#endif -#endif - - counted = false; - if(!MARLIN_UHS_READ_IRQ()) { - uint8_t HIRQALL = regRd(rHIRQ); //determine interrupt source - uint8_t HIRQ = HIRQALL & IRQ_CHECK_MASK; - uint8_t HIRQ_sendback = 0x00; - - if((HIRQ & bmCONDETIRQ) || (HIRQ & bmBUSEVENTIRQ)) { - MAX_HOST_DEBUG - (PSTR("\r\nBEFORE CDIRQ %s BEIRQ %s resetting %s state 0x%2.2x\r\n"), - (HIRQ & bmCONDETIRQ) ? "T" : "F", - (HIRQ & bmBUSEVENTIRQ) ? "T" : "F", - doingreset ? "T" : "F", - usb_task_state - ); - } - // ALWAYS happens BEFORE or WITH CONDETIRQ - if(HIRQ & bmBUSEVENTIRQ) { - HIRQ_sendback |= bmBUSEVENTIRQ; - if(!doingreset) condet = true; - busprobe(); - busevent = false; - } - - if(HIRQ & bmCONDETIRQ) { - HIRQ_sendback |= bmCONDETIRQ; - if(!doingreset) condet = true; - busprobe(); - } - -#if 1 - if((HIRQ & bmCONDETIRQ) || (HIRQ & bmBUSEVENTIRQ)) { - MAX_HOST_DEBUG - (PSTR("\r\nAFTER CDIRQ %s BEIRQ %s resetting %s state 0x%2.2x\r\n"), - (HIRQ & bmCONDETIRQ) ? "T" : "F", - (HIRQ & bmBUSEVENTIRQ) ? "T" : "F", - doingreset ? "T" : "F", - usb_task_state - ); - } -#endif - - if(HIRQ & bmFRAMEIRQ) { - HIRQ_sendback |= bmFRAMEIRQ; - if(sof_countdown) { - sof_countdown--; - counted = true; - } - sofevent = false; - } - - //MAX_HOST_DEBUG(PSTR("\r\n%s%s%s\r\n"), - // sof_countdown ? "T" : "F", - // counted ? "T" : "F", - // usb_task_polling_disabled? "T" : "F"); - DDSB(); - regWr(rHIRQ, HIRQ_sendback); -#ifndef SWI_IRQ_NUM - resume_host(); -#if USB_HOST_SHIELD_USE_ISR - // Disable interrupts - noInterrupts(); -#endif -#endif - if(!sof_countdown && !counted && !usb_task_polling_disabled) { - DisablePoll(); - //usb_task_polling_disabled++; -#ifdef USB_HOST_SHIELD_TIMING_PIN - // My counter/timer can't work on an inverted gate signal - // so we gate using a high pulse -- AJK - UHS_PIN_WRITE(USB_HOST_SHIELD_TIMING_PIN, HIGH); -#endif - -#ifdef SWI_IRQ_NUM - // MAX_HOST_DEBUG(PSTR("--------------- Doing SWI ----------------")); - exec_SWI(this); -#else -#if USB_HOST_SHIELD_USE_ISR - // Enable interrupts - interrupts(); -#endif /* USB_HOST_SHIELD_USE_ISR */ - ISRbottom(); -#endif /* SWI_IRQ_NUM */ - } - } -} - -#if 0 -DDSB(); -#endif -#else -#error "Never include USB_HOST_SHIELD_INLINE.h, include UHS_host.h instead" -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h deleted file mode 100644 index 0ac90f0df3..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * File: macro_logic.h - * Author: root - * - * Created on December 22, 2018, 4:49 AM - * - * To test: - * gcc -DAJK_TEST_MACRO_LOGIC -E macro_logic.h - */ - -#ifndef MACRO_LOGIC_H -#define MACRO_LOGIC_H - -#define AJK_CAT(a, ...) AJK_PRIMITIVE_CAT(a, __VA_ARGS__) -#define AJK_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__ - -#define AJK_COMPL(b) AJK_PRIMITIVE_CAT(AJK_COMPL_, b) -#define AJK_COMPL_0 1 -#define AJK_COMPL_1 0 - -#define AJK_BITAND(x) AJK_PRIMITIVE_CAT(AJK_BITAND_, x) -#define AJK_BITAND_0(y) 0 -#define AJK_BITAND_1(y) y - -#define AJK_INC(x) AJK_PRIMITIVE_CAT(AJK_INC_, x) -#define AJK_INC_0 1 -#define AJK_INC_1 2 -#define AJK_INC_2 3 -#define AJK_INC_3 4 -#define AJK_INC_4 5 -#define AJK_INC_5 6 -#define AJK_INC_6 7 -#define AJK_INC_7 8 -#define AJK_INC_8 9 -#define AJK_INC_9 10 -#define AJK_INC_10 10 - -#define AJK_DEC(x) AJK_PRIMITIVE_CAT(AJK_DEC_, x) -#define AJK_DEC_0 0 -#define AJK_DEC_1 0 -#define AJK_DEC_2 1 -#define AJK_DEC_3 2 -#define AJK_DEC_4 3 -#define AJK_DEC_5 4 -#define AJK_DEC_6 5 -#define AJK_DEC_7 6 -#define AJK_DEC_8 7 -#define AJK_DEC_9 8 -#define AJK_DEC_10 9 - -#define AJK_CHECK_N(x, n, ...) n -#define AJK_CHECK(...) AJK_CHECK_N(__VA_ARGS__, 0,) -#define AJK_PROBE(x) x, 1, - -#define AJK_IS_PAREN(x) AJK_CHECK(AJK_IS_PAREN_PROBE x) -#define AJK_IS_PAREN_PROBE(...) AJK_PROBE(~) - -#define AJK_NOT(x) AJK_CHECK(AJK_PRIMITIVE_CAT(AJK_NOT_, x)) -#define AJK_NOT_0 AJK_PROBE(~) - -#define AJK_COMPL(b) AJK_PRIMITIVE_CAT(AJK_COMPL_, b) -#define AJK_COMPL_0 1 -#define AJK_COMPL_1 0 - -#define AJK_BOOL(x) AJK_COMPL(AJK_NOT(x)) - -#define AJK_IIF(c) AJK_PRIMITIVE_CAT(AJK_IIF_, c) -#define AJK_IIF_0(t, ...) __VA_ARGS__ -#define AJK_IIF_1(t, ...) t - -#define AJK_IF(c) AJK_IIF(AJK_BOOL(c)) - -#define AJK_EAT(...) -#define AJK_EXPAND(...) __VA_ARGS__ -#define AJK_WHEN(c) AJK_IF(c)(AJK_EXPAND, AJK_EAT) - -#define AJK_EMPTY() -#define AJK_DEFER(id) id AJK_EMPTY() -#define AJK_OBSTRUCT(id) id AJK_DEFER(AJK_EMPTY)() - -#define AJK_EVAL(...) AJK_EVAL1(AJK_EVAL1(AJK_EVAL1(__VA_ARGS__))) -#define AJK_EVAL1(...) AJK_EVAL2(AJK_EVAL2(AJK_EVAL2(__VA_ARGS__))) -#define AJK_EVAL2(...) AJK_EVAL3(AJK_EVAL3(AJK_EVAL3(__VA_ARGS__))) -#define AJK_EVAL3(...) AJK_EVAL4(AJK_EVAL4(AJK_EVAL4(__VA_ARGS__))) -#define AJK_EVAL4(...) AJK_EVAL5(AJK_EVAL5(AJK_EVAL5(__VA_ARGS__))) -#define AJK_EVAL5(...) __VA_ARGS__ - -#define AJK_REPEAT(AJK_count, AJK_macro, ...) \ - AJK_WHEN(AJK_count) \ - ( \ - AJK_OBSTRUCT(AJK_REPEAT_INDIRECT) () \ - ( \ - AJK_DEC(AJK_count), AJK_macro, __VA_ARGS__ \ - ) \ - AJK_OBSTRUCT(AJK_macro) \ - ( \ - AJK_DEC(AJK_count), __VA_ARGS__ \ - ) \ - ) -#define AJK_REPEAT_INDIRECT() AJK_REPEAT - -#define AJK_WHILE(AJK_pred, AJK_op, ...) \ - IF(AJK_pred(__VA_ARGS__)) \ - ( \ - AJK_OBSTRUCT(AJK_WHILE_INDIRECT) () \ - ( \ - AJK_pred, AJK_op, AJK_op(__VA_ARGS__) \ - ), \ - __VA_ARGS__ \ - ) -#define AJK_WHILE_INDIRECT() AJK_WHILE - -#define AJK_PRIMITIVE_COMPARE(x, y) AJK_IS_PAREN \ -( \ - AJK_COMPARE_ ## x ( AJK_COMPARE_ ## y) (()) \ -) - -#define AJK_IS_COMPARABLE(x) AJK_IS_PAREN( AJK_CAT(AJK_COMPARE_, x) (()) ) - -#define AJK_NOT_EQUAL(x, y) \ -AJK_IIF(AJK_BITAND(AJK_IS_COMPARABLE(x))(AJK_IS_COMPARABLE(y)) ) \ -( \ - AJK_PRIMITIVE_COMPARE, \ - 1 AJK_EAT \ -)(x, y) - -#define AJK_EQUAL(x, y) AJK_COMPL(AJK_NOT_EQUAL(x, y)) - - -#define AJK_COMMA() , - -#define AJK_COMMA_IF(n) AJK_IF(n)(AJK_COMMA, AJK_EAT)() - - -#define AJK_COMMA_VAR(AJK_count, AJK_v) AJK_COMMA_IF(AJK_count) AJK_v ## AJK_count - -#define AJK_MAKE_LIST(AJK_v, AJK_count) AJK_EVAL(AJK_REPEAT(AJK_count, AJK_COMMA_VAR, AJK_v)) - -#define AJK_FUN(AJK_count, AJK_v, AJK_args, AJK_body) AJK_v ## AJK_count (AJK_args) { AJK_body(AJK_count) } -#define AJK_MAKE_FUNS(AJK_v, AJK_args, AJK_count, AJK_body) AJK_EVAL(AJK_REPEAT(AJK_count, AJK_FUN, AJK_v, AJK_args, AJK_body)) -#ifdef AJK_TEST_MACRO_LOGIC - -#define BODY(AJKindex) some(C, statement); contaning(a, test[AJKindex]); -#define ZERO_TIMES_TEST 0 -#define THREE_TIMES_TEST 3 -blank > AJK_MAKE_LIST(VARIABLE_, ZERO_TIMES_TEST) < because zero repeats -Make 3 comma separated indexed variables : AJK_MAKE_LIST(VARIABLE_, THREE_TIMES_TEST) -Make 3 bogus function bodies -AJK_MAKE_FUNS(unsigned Cfunc,(arg1, arg2),3,BODY) -#endif - -#endif /* MACRO_LOGIC_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h deleted file mode 100644 index f86054cad8..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - * File: SWI_INLINE.h - * Author: xxxajk@gmail.com - * - * Created on December 5, 2014, 9:40 AM - * - * This is the actual library. - * There are no 'c' or 'cpp' files. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifdef DYN_SWI_H -#ifndef SWI_INLINE_H -#define SWI_INLINE_H - -#ifndef SWI_MAXIMUM_ALLOWED -#define SWI_MAXIMUM_ALLOWED 4 -#endif - - - -#if defined(__arm__) || defined(ARDUINO_ARCH_PIC32) -static char dyn_SWI_initied = 0; -static dyn_SWI* dyn_SWI_LIST[SWI_MAXIMUM_ALLOWED]; -static dyn_SWI* dyn_SWI_EXEC[SWI_MAXIMUM_ALLOWED]; -#ifdef __arm__ -#ifdef __USE_CMSIS_VECTORS__ -extern "C" { - void (*_VectorsRam[VECTORTABLE_SIZE])(void)__attribute__((aligned(VECTORTABLE_ALIGNMENT))); -} -#else - -__attribute__((always_inline)) static inline void __DSB() { - __asm__ volatile ("dsb"); -} -#endif // defined(__USE_CMSIS_VECTORS__) -#else // defined(__arm__) -__attribute__((always_inline)) static inline void __DSB() { - __asm__ volatile ("sync" : : : "memory"); -} -#endif // defined(__arm__) - -/** - * Execute queued class ISR routines. - */ -#ifdef ARDUINO_ARCH_PIC32 -static p32_regset *ifs = ((p32_regset *) & IFS0) + (SWI_IRQ_NUM / 32); //interrupt flag register set -static p32_regset *iec = ((p32_regset *) & IEC0) + (SWI_IRQ_NUM / 32); //interrupt enable control reg set -static uint32_t swibit = 1 << (SWI_IRQ_NUM % 32); - -void -#ifdef __PIC32MZXX__ - __attribute__((nomips16,at_vector(SWI_VECTOR),interrupt(SWI_IPL))) -#else - __attribute__((interrupt(),nomips16)) -#endif - softISR() { -#else -#ifdef ARDUINO_spresense_ast -unsigned int softISR() { -#else -void softISR() { -#endif -#endif - - // - // TO-DO: Perhaps limit to 8, and inline this? - // - - - // Make a working copy, while clearing the queue. - noInterrupts(); -#ifdef ARDUINO_ARCH_PIC32 - //ifs->clr = swibit; -#endif - for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) { - dyn_SWI_EXEC[i] = dyn_SWI_LIST[i]; - dyn_SWI_LIST[i] = NULL; - } - __DSB(); - interrupts(); - - // Execute each class SWI - for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) { - if(dyn_SWI_EXEC[i]) { -#ifdef __DYN_SWI_DEBUG_LED__ - digitalWrite(__DYN_SWI_DEBUG_LED__, HIGH); -#endif - dyn_SWI_EXEC[i]->dyn_SWISR(); -#ifdef __DYN_SWI_DEBUG_LED__ - digitalWrite(__DYN_SWI_DEBUG_LED__, LOW); -#endif - } - } -#ifdef ARDUINO_ARCH_PIC32 - noInterrupts(); - if(!dyn_SWI_EXEC[0]) ifs->clr = swibit; - interrupts(); -#endif -#ifdef ARDUINO_spresense_ast - return 0; -#endif -} - -#define DDSB() __DSB() -#endif - - -#ifdef __arm__ -#ifndef interruptsStatus -#define interruptsStatus() __interruptsStatus() -static inline unsigned char __interruptsStatus() __attribute__((always_inline, unused)); - -static inline unsigned char __interruptsStatus() { - unsigned int primask; - asm volatile ("mrs %0, primask" : "=r" (primask)); - if(primask) return 0; - return 1; -} -#endif - -/** - * Initialize the Dynamic (class) Software Interrupt - */ -static void Init_dyn_SWI() { - if(!dyn_SWI_initied) { -#ifdef __USE_CMSIS_VECTORS__ - uint32_t *X_Vectors = (uint32_t*)SCB->VTOR; - for(int i = 0; i < VECTORTABLE_SIZE; i++) { - _VectorsRam[i] = reinterpret_cast(X_Vectors[i]); /* copy vector table to RAM */ - } - /* relocate vector table */ - noInterrupts(); - SCB->VTOR = reinterpret_cast(&_VectorsRam); - DDSB(); - interrupts(); -#endif -#ifndef ARDUINO_spresense_ast - for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) dyn_SWI_LIST[i] = NULL; - noInterrupts(); - _VectorsRam[SWI_IRQ_NUM + 16] = reinterpret_cast(softISR); - DDSB(); - interrupts(); - NVIC_SET_PRIORITY(SWI_IRQ_NUM, 255); - NVIC_ENABLE_IRQ(SWI_IRQ_NUM); -#endif -#ifdef __DYN_SWI_DEBUG_LED__ - pinMode(__DYN_SWI_DEBUG_LED__, OUTPUT); - digitalWrite(__DYN_SWI_DEBUG_LED__, LOW); -#endif - dyn_SWI_initied = 1; - } -} - -/** - * @param klass class that extends dyn_SWI - * @return 0 on queue full, else returns queue position (ones based) - */ -int exec_SWI(const dyn_SWI* klass) { - int rc = 0; - - uint8_t irestore = interruptsStatus(); - // Allow use from inside a critical section... - // ... and prevent races if also used inside an ISR - noInterrupts(); - for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) { - if(!dyn_SWI_LIST[i]) { - rc = 1 + i; // Success! - dyn_SWI_LIST[i] = (dyn_SWI*)klass; -#ifndef ARDUINO_spresense_ast - if(!NVIC_GET_PENDING(SWI_IRQ_NUM)) NVIC_SET_PENDING(SWI_IRQ_NUM); -#else - // Launch 1-shot timer as an emulated SWI - // Hopefully the value of Zero is legal. - // 1 microsecond latency would suck! - attachTimerInterrupt(softISR, 100); -#endif - DDSB(); - break; - } - } - // Restore interrupts, if they were on. - if(irestore) interrupts(); - return rc; -} -#elif defined(ARDUINO_ARCH_PIC32) - -/** - * Initialize the Dynamic (class) Software Interrupt - */ -static void Init_dyn_SWI() { - if(!dyn_SWI_initied) { - uint32_t sreg = disableInterrupts(); - - setIntVector(SWI_VECTOR, softISR); - setIntPriority(SWI_VECTOR, 1, 1); // Lowest priority, ever. - ifs->clr = swibit; - iec->clr = swibit; - iec->set = swibit; - restoreInterrupts(sreg); -#ifdef __DYN_SWI_DEBUG_LED__ - pinMode(__DYN_SWI_DEBUG_LED__, OUTPUT); - UHS_PIN_WRITE(__DYN_SWI_DEBUG_LED__, LOW); -#endif - } -} - -/** - * @param klass class that extends dyn_SWI - * @return 0 on queue full, else returns queue position (ones based) - */ -int exec_SWI(const dyn_SWI* klass) { - int rc = 0; - uint32_t sreg = disableInterrupts(); - for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) { - if(!dyn_SWI_LIST[i]) { - rc = 1 + i; // Success! - dyn_SWI_LIST[i] = (dyn_SWI*)klass; - if(!(ifs->reg & swibit)) ifs->set = swibit; - ; - break; - } - } - restoreInterrupts(sreg); - return rc; -} - -#endif /* defined(__arm__) */ -#endif /* SWI_INLINE_H */ -#else -#error "Never include SWI_INLINE.h directly, include dyn_SWI.h instead" -#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h deleted file mode 100644 index 07f4ae054d..0000000000 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - * File: dyn_SWI.h - * Author: xxxajk@gmail.com - * - * Created on December 5, 2014, 9:12 AM - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef DYN_SWI_H -#define DYN_SWI_H - - -#if defined(__arm__) || defined(ARDUINO_ARCH_PIC32) -#ifdef ARDUINO_ARCH_PIC32 -#include -#endif -#ifdef __cplusplus - -#ifdef true -#undef true -#endif - -#ifdef false -#undef false -#endif - -#endif - -#ifdef ARDUINO_spresense_ast -#define SWI_IRQ_NUM 666 // because this board is totally evil. -#elif defined(ARDUINO_ARCH_PIC32) -#ifndef SWI_IRQ_NUM -#ifdef _DSPI0_IPL_ISR -#define SWI_IPL _DSPI0_IPL_ISR -#define SWI_VECTOR _DSPI0_ERR_IRQ -#define SWI_IRQ_NUM _DSPI0_ERR_IRQ -#elif defined(_PMP_ERROR_IRQ) -#define SWI_IRQ_NUM _PMP_ERROR_IRQ -#define SWI_VECTOR _PMP_VECTOR -#else -#error SWI_IRQ_NUM and SWI_VECTOR need a definition -#endif -#ifdef __cplusplus -extern "C" -{ - void -#ifdef __PIC32MZXX__ - __attribute__((nomips16,at_vector(SWI_VECTOR),interrupt(SWI_IPL))) -#else - __attribute__((interrupt(),nomips16)) -#endif - softISR(); -} -#endif -#endif -#elif !defined(NVIC_NUM_INTERRUPTS) -// Assume CMSIS -#define __USE_CMSIS_VECTORS__ -#ifdef NUMBER_OF_INT_VECTORS -#define NVIC_NUM_INTERRUPTS (NUMBER_OF_INT_VECTORS-16) -#else -#define NVIC_NUM_INTERRUPTS ((int)PERIPH_COUNT_IRQn) -#endif -#define VECTORTABLE_SIZE (NVIC_NUM_INTERRUPTS+16) -#define VECTORTABLE_ALIGNMENT (0x100UL) -#define NVIC_GET_ACTIVE(n) NVIC_GetActive((IRQn_Type)n) -#define NVIC_GET_PENDING(n) NVIC_GetPendingIRQ((IRQn_Type)n) -#define NVIC_SET_PENDING(n) NVIC_SetPendingIRQ((IRQn_Type)n) -#define NVIC_ENABLE_IRQ(n) NVIC_EnableIRQ((IRQn_Type)n) -#define NVIC_SET_PRIORITY(n ,p) NVIC_SetPriority((IRQn_Type)n, (uint32_t) p) -//extern "C" { -// extern uint32_t _VectorsRam[VECTORTABLE_SIZE] __attribute__((aligned(VECTORTABLE_ALIGNMENT))); -//} - -#ifndef SWI_IRQ_NUM -#if defined(__SAM3X8E__) && defined(_VARIANT_ARDUINO_DUE_X_) -// DUE -// Choices available: -// HSMCI_IRQn Multimedia Card Interface (HSMCI) -// EMAC_IRQn Ethernet MAC (EMAC) -// EMAC is not broken out on the official DUE, but is on clones. -// SPI0_IRQn Serial Peripheral Interface (SPI0) -// SPI0_IRQn seems to be the best choice, as long as nobody uses an ISR based master -#define SWI_IRQ_NUM SPI0_IRQn -#elif defined(ARDUINO_SAMD_ZERO) -// Just use sercom4's unused IRQ vector. -#define SWI_IRQ_NUM I2S_IRQn -//#define SWI_IRQ_NUM SERCOM4_IRQn -#endif -#endif - -#ifndef SWI_IRQ_NUM -#error SWI_IRQ_NUM not defined (CMSIS) -#endif - -#elif defined(CORE_TEENSY) - -#ifndef NVIC_GET_ACTIVE -#define NVIC_GET_ACTIVE(n) (*((volatile uint32_t *)0xE000E300 + ((n) >> 5)) & (1 << ((n) & 31))) -#endif -#ifndef NVIC_GET_PENDING -#define NVIC_GET_PENDING(n) (*((volatile uint32_t *)0xE000E200 + ((n) >> 5)) & (1 << ((n) & 31))) -#ifndef SWI_IRQ_NUM -#ifdef __MK20DX256__ -#define SWI_IRQ_NUM 17 -#elif defined(__MK20DX128__) -#define SWI_IRQ_NUM 5 -#elif defined(__MKL26Z64__) -#define SWI_IRQ_NUM 4 -#elif defined(__MK66FX1M0__) -#define SWI_IRQ_NUM 30 -#elif defined(__MK64FX512__) -#define SWI_IRQ_NUM 30 -#elif defined(__IMXRT1052__) || defined(__IMXRT1062__) -#define SWI_IRQ_NUM 71 -#else -#error Do not know how to relocate IRQ vectors for this pjrc product -#endif -#endif -#endif -#else // Not CMSIS or PJRC CORE_TEENSY or PIC32 or SPRESENSE -#error Do not know how to relocate IRQ vectors or perform SWI -#endif // SWI_IRQ_NUM - - -#ifndef SWI_IRQ_NUM -#error SWI_IRQ_NUM not defined -#else -/** - * Use this class to extend your class, in order to provide - * a C++ context callable SWI. - */ -class dyn_SWI { -public: - - /** - * Override this method with your code. - */ - virtual void dyn_SWISR() { - }; -}; - -extern int exec_SWI(const dyn_SWI* klass); - -#include "SWI_INLINE.h" - -// IMPORTANT! Define this so that you do NOT end up with a NULL stub! -#define SWI_NO_STUB -#endif /* SWI_IRQ_NUM */ -#endif /* __arm__ */ - -// if no SWI for CPU (e.g. AVR) make a void stub. -#ifndef SWI_NO_STUB -#define Init_dyn_SWI() (void(0)) -#ifndef DDSB -#define DDSB() (void(0)) -#endif -#endif -#endif /* DYN_SWI_H */ diff --git a/README.md b/README.md index 1e78528b7a..89cb9d32cb 100644 --- a/README.md +++ b/README.md @@ -1,76 +1,103 @@ # Marlin 3D Printer Firmware -![GitHub](https://img.shields.io/github/license/marlinfirmware/marlin.svg) -![GitHub contributors](https://img.shields.io/github/contributors/marlinfirmware/marlin.svg) -![GitHub Release Date](https://img.shields.io/github/release-date/marlinfirmware/marlin.svg) -[![Build Status](https://github.com/MarlinFirmware/Marlin/workflows/CI/badge.svg?branch=bugfix-2.0.x)](https://github.com/MarlinFirmware/Marlin/actions) +[![Build Status](https://travis-ci.org/MarlinFirmware/Marlin.svg?branch=RCBugFix)](https://travis-ci.org/MarlinFirmware/Marlin) +[![Coverity Scan Build Status](https://scan.coverity.com/projects/2224/badge.svg)](https://scan.coverity.com/projects/2224) - + -Additional documentation can be found at the [Marlin Home Page](https://marlinfw.org/). +Additional documentation can be found at the [Marlin Home Page](http://marlinfw.org/). Please test this firmware and let us know if it misbehaves in any way. Volunteers are standing by! -## Marlin 2.0 +## Marlin 2.1 Bugfix Branch -Marlin 2.0 takes this popular RepRap firmware to the next level by adding support for much faster 32-bit and ARM-based boards while improving support for 8-bit AVR boards. Read about Marlin's decision to use a "Hardware Abstraction Layer" below. +__Not for production use. Use with caution!__ -Download earlier versions of Marlin on the [Releases page](https://github.com/MarlinFirmware/Marlin/releases). +Marlin 2.1 is an attempt to place a Real Time Operating System (RTOS) under Marlin 2.0. The goal is to support the same build environments and targets as the Marlin 2.0 branch. The goal is also to exactly duplicate the Marlin 2.0 functionality. This branch is not currently stable. It is only suitable for use by developers interested in the RTOS effort. The Marlin 2.1 branch will not be updated each time Marlin 2.0 is changed. It will be rebased against the Marlin 2.0 branch on an "as needed" basis. -## Building Marlin 2.0 +The changes to place an RTOS under the Marlin code base are very minor. -To build Marlin 2.0 you'll need [Arduino IDE 1.8.8 or newer](https://www.arduino.cc/en/main/software) or [PlatformIO](http://docs.platformio.org/en/latest/ide.html#platformio-ide). Detailed build and install instructions are posted at: +It is helpful to have a Max7219 8x8 LED matrix on the machine for debug purposes. It is helpful because the various tasks that are running update the LED's so you can see what is happening. I strongly encourage everybody to spend the $2.00 to get one of these devices: https://www.ebay.com/itm/MAX7219-Dot-Matrix-8x8-Led-Display-Module-MCU-Control-For-Arduino-Innovation/222709799381?epid=1672606113&hash=item33da89d9d5:g:QmgAAOSwbw1aATcc - - [Installing Marlin (Arduino)](http://marlinfw.org/docs/basics/install_arduino.html) - - [Installing Marlin (VSCode)](http://marlinfw.org/docs/basics/install_platformio_vscode.html). -### Supported Platforms +## Building Marlin 2.1 - Platform|MCU|Example Boards - --------|---|------- - [Arduino AVR](https://www.arduino.cc/)|ATmega|RAMPS, Melzi, RAMBo - [Teensy++ 2.0](http://www.microchip.com/wwwproducts/en/AT90USB1286)|AT90USB1286|Printrboard - [Arduino Due](https://www.arduino.cc/en/Guide/ArduinoDue)|SAM3X8E|RAMPS-FD, RADDS, RAMPS4DUE - [LPC1768](http://www.nxp.com/products/microcontrollers-and-processors/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|ARM® Cortex-M3|MKS SBASE, Re-ARM, Selena Compact - [LPC1769](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1769FBD100)|ARM® Cortex-M3|Smoothieboard, Azteeg X5 mini, TH3D EZBoard - [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)|ARM® Cortex-M3|Malyan M200, GTM32 Pro, MKS Robin, BTT SKR Mini - [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)|ARM® Cortex-M4|ARMED, Rumba32, SKR Pro, Lerdge, FYSETC S6 - [STM32F7x6](https://www.st.com/en/microcontrollers-microprocessors/stm32f7x6.html)|ARM® Cortex-M7|The Borg, RemRam V1 - [SAMD51P20A](https://www.adafruit.com/product/4064)|ARM® Cortex-M4|Adafruit Grand Central M4 - [Teensy 3.5](https://www.pjrc.com/store/teensy35.html)|ARM® Cortex-M4| - [Teensy 3.6](https://www.pjrc.com/store/teensy36.html)|ARM® Cortex-M4| - [Teensy 4.0](https://www.pjrc.com/store/teensy40.html)|ARM® Cortex-M7| - [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|ARM® Cortex-M7| +Currently, the Marlin 2.1 branch can only build code for the 8-bit AVR processors. It is a priority to get the build process also supporting the 32-bit platforms. -## Submitting Changes +To build Marlin 2.1 for the 8-bit AVR processors, you'll need [Arduino IDE 1.9](https://www.arduino.cc/en/main/software) These steps will get Arduino configured to build Marlin 2.1 with FreeRTOS under it (for the AVR processors): -- Submit **Bug Fixes** as Pull Requests to the ([bugfix-2.0.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.0.x)) branch. +1. Install FreeRTOS for Arduino + - Bring up Arduino + - Sketch / Include_Library / Manage_Libraries + - Set Type=Contributed + - Set Topic=Timing + - Scroll to FreeRTOS by Richard Barry. Real Time Operating System implemented for AVR + - Select version 10,0,0-10 and press Install + - Modified FreeRTOS files are in a .ZIP file alongside the Marlin source files. Copy supplied (and altered) FreeRTOS files to ???\Arduino\libraries\FreeRTOS\src Specifically: (FreeRTOSConfig.h, Arduino_FreeRTOS.h, variantHooks.cpp). These files can be found in an archive ../Marlin/src/FreeRTOS-changes.zip + - Configure your Marlin files in the Marlin directory + - Having a Max7219 LED Matrix is helpful... Debug info is displayed on + the device. + +Changes: + - The Marlin idle() function is its own task now. It is slightly lower priority than the main Marlin task. Instead of being called periodically, the main Marlin task can suspend itself and the former idle() task can continue its work from where it left off. What this means is idle() no longer needs to run to completion and return to its caller. Instead, it is allowed to run an appropriate amount of time, and it gets cut off so the main Marlin task can get other work done. Admitably, this initial use of the RTOS is not very sophisticated. But it does demonstrate that the surgery to activate the RTOS is in place and working. + - A few changes have been made to the default FreeRTOS configuration. And these configuration options exposed a bug in the Arduino version of FreeRTOS (in variantHooks.cpp). And it was done with very minor changes to the Marlin code so it is a good first step. + - An M101 RTOS Free Task Memory Status routine has been added. + - The Max7219 runs as a task with a message queue. Probably, this is a waste of memory, but it serves a good purpose right now just to show FreeRTOS is doing its thing. + + +To Do: + - We need the Arduino_FreeRTOS.h, FreeRTOSConfig.h and variantHooks.cpp files to only exist in one place. We need the FreeRTOS library to be configured appropriately for Marlin and not with the default settings. + + - We need to figure out why the settings.load() function can not be called + from setup() any more. It seems to cause some random memory corruption. + I've spent some time looking at this, and so far have not found the + answer. But... with that said... if settings.load() is moved to the + top of the Marlin_main_loop() task, it is able to go through the entire + routine (with no logic changes in configuration_store.cpp). PLEASE!!!! + If you can figure this out, please do!!! + + - Implement the previous concept of no_stepper_sleep for advanced pause in + the Marlin idle routine. This used to be a parameter passed into idle() + but this function is now run as a task. + + void idle( + //#if ENABLED(ADVANCED_PAUSE_FEATURE) + // bool no_stepper_sleep/*=false*/ + //#endif ) + + - Variables that are modified within the scope of idle() (via calls to things like lcd_update(), host_keepalive(), manage_inactivity(), thermalManager.manage_heater(), print_job_timer.tick(), buzzer.tick() ) need to be checked for atomic access. We can't have the new idle routine context + switch in the middle of a variable update. + + - The thermal code seems to be able to control the bed and hot end + temperatures. But I've seen a lot of Thermal Shutdown Kill's. I have + not searched for the root cause yet. Instead, I've turned off Thermal + Protection for the time being so I can use the time to make further + progress on RTOS related topics. + + +## Current Functionality + +Marlin 2.1 currently builds for the 8-bit AVR platforms using Arduino. This needs to be expanded to include coverage for the 32-bit platforms and Platform-IO. + +## High Priority Work Items + +- Expand build environment to address 32-bit platforms. + +- Alter build environment to handle inclusion (and configuration) of the FreeRTOS library gracefully. + +## Submitting Patches + +Proposed patches should be submitted as a Pull Request against the ([bugfix-2.1.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.1.x)) branch. + +- This branch is for fixing bugs and integrating any new features for the duration of the Marlin 2.1.x life-cycle. - Follow the [Coding Standards](http://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers. - Please submit your questions and concerns to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues). -## Marlin Support - -For best results getting help with configuration and troubleshooting, please use the following resources: - -- [Marlin Documentation](http://marlinfw.org) - Official Marlin documentation -- [Marlin Discord](https://discord.gg/n5NJ59y) - Discuss issues with Marlin users and developers -- Facebook Group ["Marlin Firmware"](https://www.facebook.com/groups/1049718498464482/) -- RepRap.org [Marlin Forum](http://forums.reprap.org/list.php?415) -- [Tom's 3D Forums](https://forum.toms3d.org/) -- Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/) -- [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube - -## Credits - -The current Marlin dev team consists of: - - - Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - USA   [Donate](http://www.thinkyhead.com/donate-to-marlin) - - Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - USA - - Chris Pepper [[@p3p](https://github.com/p3p)] - UK - - Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - USA - - Erik van der Zalm [[@ErikZalm](https://github.com/ErikZalm)] - Netherlands   [![Flattr Erik](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software) +### [RepRap.org Wiki Page](http://reprap.org/wiki/Marlin) ## License Marlin is published under the [GPL license](/LICENSE) because we believe in open development. The GPL comes with both rights and obligations. Whether you use Marlin firmware as the driver for your open or closed-source product, you must keep Marlin open, and you must provide your compatible Marlin source code to end users upon request. The most straightforward way to comply with the Marlin license is to make a fork of Marlin on Github, perform your modifications, and direct users to your modified fork. While we can't prevent the use of this code in products (3D printers, CNC, etc.) that are closed source or crippled by a patent, we would prefer that you choose another firmware or, better yet, make your own. + + diff --git a/buildroot/bin/.gitattributes b/buildroot/bin/.gitattributes deleted file mode 100644 index 6313b56c57..0000000000 --- a/buildroot/bin/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/buildroot/bin/build_marlin b/buildroot/bin/build_marlin new file mode 100755 index 0000000000..3255346291 --- /dev/null +++ b/buildroot/bin/build_marlin @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +case "$#" in + 0 ) BOARD=arduino:avr:mega:cpu=atmega2560 ;; + * ) BOARD=arduino:avr:$1 ;; +esac + +arduino --verify --board $BOARD Marlin/Marlin.ino diff --git a/buildroot/bin/build_marlin_fail b/buildroot/bin/build_marlin_fail new file mode 100755 index 0000000000..e18105cdd4 --- /dev/null +++ b/buildroot/bin/build_marlin_fail @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +build_marlin $@ && exit 0 +exit 1 diff --git a/buildroot/bin/build_marlin_pio b/buildroot/bin/build_marlin_pio new file mode 100755 index 0000000000..b3c113c2f6 --- /dev/null +++ b/buildroot/bin/build_marlin_pio @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +platformio run --project-dir $@ --silent diff --git a/buildroot/bin/build_marlin_teensy35 b/buildroot/bin/build_marlin_teensy35 new file mode 100755 index 0000000000..ed6e95cd23 --- /dev/null +++ b/buildroot/bin/build_marlin_teensy35 @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +arduino --verify --board teensy:avr:teensy35:usb=serial,speed=120,opt=o1std,keys=en-us Marlin/Marlin.ino diff --git a/buildroot/bin/env_backup b/buildroot/bin/env_backup new file mode 100755 index 0000000000..164582de60 --- /dev/null +++ b/buildroot/bin/env_backup @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +[ -z "$1" ] || cd $1 + +if [ -d ".test" ]; then + printf "\033[0;31mEnvironment backup already exists!\033[0m\n" +else + mkdir .test + cp Marlin/Configuration*.h .test/ + [ -f Marlin/_Bootscreen.h ] && cp Marlin/_Bootscreen.h .test/ + [ -f Marlin/_Statusscreen.h ] && cp Marlin/_Statusscreen.h .test/ + cp -r Marlin/src/pins .test/pins + printf "\033[0;32mEnvironment Backup created\033[0m\n" +fi diff --git a/buildroot/bin/env_clean b/buildroot/bin/env_clean new file mode 100755 index 0000000000..c352b01b2a --- /dev/null +++ b/buildroot/bin/env_clean @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +rm -rf .pioenvs +rm -rf .piolibdeps +rm -rf .piolib + +if [[ $1 = "--deep" ]]; then + rm -rf ~/.platformio/packages/* + rm -rf ~/.platformio/platforms/* + rm -rf ~/.platformio/.cache/* +fi diff --git a/buildroot/bin/env_restore b/buildroot/bin/env_restore new file mode 100755 index 0000000000..defc6d8431 --- /dev/null +++ b/buildroot/bin/env_restore @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +[ -z "$1" ] || cd $1 + +if [ -d ".test" ]; then + cp .test/Configuration*.h Marlin/ + rm .test/Configuration*.h + + if [ -f .test/_Bootscreen.h ]; then + cp .test/_Bootscreen.h Marlin/ + rm .test/_Bootscreen.h + fi + + if [ -f .test/_Statusscreen.h ]; then + cp .test/_Statusscreen.h Marlin/ + rm .test/_Statusscreen.h + fi + + cp -r .test/pins Marlin/src + rm -r .test/pins + + rmdir .test + printf "\033[0;32mEnvironment Restored\033[0m\n" +else + printf "\033[0;31mEnvironment Backup not available!\033[0m\n" +fi diff --git a/buildroot/bin/format_code b/buildroot/bin/format_code deleted file mode 100755 index 8ae04b1b6e..0000000000 --- a/buildroot/bin/format_code +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash -# -# format_code [dir/file...] -# - -HERE=`dirname $0` - -while [[ $# -gt 0 ]]; do - - val="$1" - - if [ -d "$val" ]; then - - find $val -name *.cpp -exec "$HERE/uncrust" '{}' \; - - elif [ -d "./Marlin/src/$val" ]; then - - find "./Marlin/src/$val" -name *.cpp -exec "$HERE/uncrust" '{}' \; - - elif [ -f "./Marlin/src/$val" ]; then - - uncrust "./Marlin/src/$val" - - elif [ -f "$val" ]; then - - uncrust "$val" - - fi - -done diff --git a/buildroot/bin/generate_version b/buildroot/bin/generate_version index b88e3de918..292fe59225 100755 --- a/buildroot/bin/generate_version +++ b/buildroot/bin/generate_version @@ -2,23 +2,10 @@ # # generate_version # -# Make a Version.h file to accompany CUSTOM_VERSION_FILE +# Make a _Version.h file # -DIR=${1:-"Marlin"} - -# MRCC3=$( git merge-base HEAD upstream/bugfix-2.0.x 2>/dev/null ) -# MRCC2=$( git merge-base HEAD upstream/bugfix-1.1.x 2>/dev/null ) -# MRCC1=$( git merge-base HEAD upstream/1.1.x 2>/dev/null ) - -# BASE='?' -# if [[ -n $MRCC3 && $MRCC3 != $MRCC2 ]]; then -# BASE=bugfix-2.0.x -# elif [[ -n $MRCC2 ]]; then -# BASE=bugfix-1.1.x -# elif [[ -n $MRCC1 ]]; then -# BASE=1.1.x -# fi +DIR="${1}" BUILDATE=$(date '+%s') DISTDATE=$(date '+%Y-%m-%d %H:%M') @@ -44,30 +31,7 @@ SOURCE_CODE_URL=$(awk -F'"' \ WEBSITE_URL=$(awk -F'"' \ '/#define WEBSITE_URL/{ print $2 }' < "${DIR}/Version.h") -cat > "${DIR}/Version.h" <. - * - */ -#pragma once - +cat > "${DIR}/_Version.h" < "${DIR}/Version.h" < temp && mv temp Marlin/Configuration.h" +eval "echo \"#define ${1} ${2}\" >>Marlin/Configuration.h" diff --git a/buildroot/bin/opt_add_adv b/buildroot/bin/opt_add_adv new file mode 100755 index 0000000000..8ef7e07917 --- /dev/null +++ b/buildroot/bin/opt_add_adv @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +eval "echo \"#define ${1} ${2}\" >>Marlin/Configuration_adv.h" diff --git a/buildroot/bin/opt_disable b/buildroot/bin/opt_disable index 11526132ef..c219f36170 100755 --- a/buildroot/bin/opt_disable +++ b/buildroot/bin/opt_disable @@ -1,13 +1,7 @@ #!/usr/bin/env bash -# exit on first failure -set -e - SED=$(which gsed || which sed) for opt in "$@" ; do - # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define \b${opt}\b\)/{s//\1\3\/\/\4/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define \b${opt}\b\)/{s//\1\3\/\/\4/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || - (echo "ERROR: opt_disable Can't find ${opt}" >&2 && exit 9) + eval "${SED} -i 's/\([[:blank:]]*\)\(#define \b${opt}\b\)/\1\/\/\2/g' Marlin/Configuration.h" done diff --git a/buildroot/bin/opt_disable_adv b/buildroot/bin/opt_disable_adv new file mode 100755 index 0000000000..bbb7ca5ae5 --- /dev/null +++ b/buildroot/bin/opt_disable_adv @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +SED=$(which gsed || which sed) + +for opt in "$@" ; do + eval "${SED} -i 's/\([[:blank:]]*\)\(#define \b${opt}\b\)/\1\/\/\2/g' Marlin/Configuration_adv.h" +done diff --git a/buildroot/bin/opt_enable b/buildroot/bin/opt_enable index 96686d6c68..7be02ed9b4 100755 --- a/buildroot/bin/opt_enable +++ b/buildroot/bin/opt_enable @@ -1,13 +1,7 @@ #!/usr/bin/env bash -# exit on first failure -set -e - SED=$(which gsed || which sed) for opt in "$@" ; do - # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || - (echo "ERROR: opt_enable Can't find ${opt}" >&2 && exit 9) + eval "${SED} -i 's/\/\/[[:blank:]]*\(#define \b${opt}\b\)/\1/g' Marlin/Configuration.h" done diff --git a/buildroot/bin/opt_enable_adv b/buildroot/bin/opt_enable_adv new file mode 100755 index 0000000000..73a9d95415 --- /dev/null +++ b/buildroot/bin/opt_enable_adv @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +SED=$(which gsed || which sed) + +for opt in "$@" ; do + eval "${SED} -i 's/\/\/[[:blank:]]*\(#define \b${opt}\b\)/\1/g' Marlin/Configuration_adv.h" +done diff --git a/buildroot/bin/opt_set b/buildroot/bin/opt_set index a646e09ae7..c1de22f5e9 100755 --- a/buildroot/bin/opt_set +++ b/buildroot/bin/opt_set @@ -1,12 +1,5 @@ #!/usr/bin/env bash -# exit on first failure -set -e - SED=$(which gsed || which sed) -# Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 -eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || -eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || -eval "echo '#define ${@}' >>Marlin/Configuration_adv.h" || -(echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) +eval "${SED} -i 's/\(#define \b${1}\b\).*$/\1 ${2}/g' Marlin/Configuration.h" diff --git a/buildroot/bin/opt_set_adv b/buildroot/bin/opt_set_adv new file mode 100755 index 0000000000..4c72c4a831 --- /dev/null +++ b/buildroot/bin/opt_set_adv @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +SED=$(which gsed || which sed) + +eval "${SED} -i 's/\(#define \b${1}\b\).*$/\1 ${2}/g' Marlin/Configuration_adv.h" diff --git a/buildroot/bin/pins_set b/buildroot/bin/pins_set index 87a8692aa2..639995e24c 100755 --- a/buildroot/bin/pins_set +++ b/buildroot/bin/pins_set @@ -1,11 +1,5 @@ #!/usr/bin/env bash -IFS='/' read -r -a PINPATH <<< "$1" -DIR=${PINPATH[0]} -NAM=${PINPATH[1]} -PIN=$2 -VAL=$3 - SED=$(which gsed || which sed) -eval "${SED} -i '/\(\/\/\)*\(#define \+${PIN}\b\).*$/{s//\2 ${VAL}/;h};\${x;/./{x;q0};x;q9}' Marlin/src/pins/$DIR/pins_${NAM}.h" || -(echo "ERROR: pins_set Can't find ${PIN}" >&2 && exit 9) + +eval "${SED} -i 's/\(#define \b${2}\b\).*$/\1 ${3}/g' Marlin/src/pins/pins_${1}.h" diff --git a/buildroot/bin/restore_configs b/buildroot/bin/restore_configs index b2d0ea19ac..aa0766b20b 100755 --- a/buildroot/bin/restore_configs +++ b/buildroot/bin/restore_configs @@ -1,5 +1,9 @@ #!/usr/bin/env bash -git checkout Marlin/Configuration*.h 2>/dev/null -git checkout Marlin/src/pins/ramps/pins_RAMPS.h 2>/dev/null -rm -f Marlin/_Bootscreen.h Marlin/_Statusscreen.h +cp Marlin/src/config/default/Configuration*.h Marlin + +[ -f Marlin/src/pins/pins_RAMPS.h.backup ] && cp Marlin/src/pins/pins_RAMPS.h.backup Marlin/src/pins/pins_RAMPS.h +rm -f Marlin/src/pins/pins_RAMPS.h.backup + +rm -f Marlin/_Bootscreen.h +rm -f Marlin/_Statusscreen.h diff --git a/buildroot/bin/uncrust b/buildroot/bin/uncrust deleted file mode 100755 index 9893b5c380..0000000000 --- a/buildroot/bin/uncrust +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Run uncrustify for a file in-place -# - -TMPDIR=`mktemp -d` - -# Reformat a single file to tmp/ -uncrustify -l CPP -c ./buildroot/share/extras/uncrustify.cfg -f "$1" >$TMPDIR/uncrustify.out - -# Replace the original file -cp "$TMPDIR/uncrustify.out" "$1" - -# Clean up, deliberately -rm "$TMPDIR/uncrustify.out" -rmdir "$TMPDIR" diff --git a/buildroot/bin/update_defaults b/buildroot/bin/update_defaults new file mode 100755 index 0000000000..2dcea0d155 --- /dev/null +++ b/buildroot/bin/update_defaults @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +cp Marlin/Configuration*.h Marlin/src/config/default diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs index 83c0f5485d..453c627bed 100755 --- a/buildroot/bin/use_example_configs +++ b/buildroot/bin/use_example_configs @@ -1,21 +1,13 @@ #!/usr/bin/env bash -IFS=: read -r PART1 PART2 <<< "$@" -[ -n "${PART2}" ] && { REPO="$PART1" ; RDIR="${PART2// /%20}" ; } \ - || { REPO=bugfix-2.0.x ; RDIR="${PART1// /%20}" ; } -EXAMPLES="https://raw.githubusercontent.com/MarlinFirmware/Configurations/$REPO/config/examples" - -which curl >/dev/null && TOOL='curl -L -s -S -f -o wgot' -which wget >/dev/null && TOOL='wget -q -O wgot' - restore_configs -cd Marlin +cp Marlin/src/config/examples/"$@"/Configuration* Marlin/ -$TOOL "$EXAMPLES/$RDIR/Configuration.h" >/dev/null 2>&1 && mv wgot Configuration.h -$TOOL "$EXAMPLES/$RDIR/Configuration_adv.h" >/dev/null 2>&1 && mv wgot Configuration_adv.h -$TOOL "$EXAMPLES/$RDIR/_Bootscreen.h" >/dev/null 2>&1 && mv wgot _Bootscreen.h -$TOOL "$EXAMPLES/$RDIR/_Statusscreen.h" >/dev/null 2>&1 && mv wgot _Statusscreen.h +if [ -f "Marlin/src/config/examples/$@/_Bootscreen.h" ]; then + cp "Marlin/src/config/examples/$@/_Bootscreen.h" Marlin/ +fi -rm -f wgot -cd - >/dev/null +if [ -f "Marlin/src/config/examples/$@/_Statusscreen.h" ]; then + cp "Marlin/src/config/examples/$@/_Statusscreen.h" Marlin/ +fi diff --git a/buildroot/etc/udev/rules.d/99-platformio-udev.rules b/buildroot/etc/udev/rules.d/99-platformio-udev.rules index 3c829882d1..6daaf922bf 100644 --- a/buildroot/etc/udev/rules.d/99-platformio-udev.rules +++ b/buildroot/etc/udev/rules.d/99-platformio-udev.rules @@ -4,7 +4,7 @@ # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# https://www.apache.org/licenses/LICENSE-2.0 +# 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, @@ -16,7 +16,7 @@ # # INSTALLATION # -# Please visit > https://docs.platformio.org/en/latest/faq.html#platformio-udev-rules +# Please visit > http://docs.platformio.org/en/latest/faq.html#platformio-udev-rules # ##################################################################################### diff --git a/buildroot/share/PlatformIO/boards/BigTree_Btt002.json b/buildroot/share/PlatformIO/boards/BigTree_Btt002.json deleted file mode 100644 index d0d092f1ea..0000000000 --- a/buildroot/share/PlatformIO/boards/BigTree_Btt002.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "build": { - "core": "stm32", - "cpu": "cortex-m4", - "extra_flags": "-DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx", - "f_cpu": "168000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x0483", - "0x3748" - ] - ], - "mcu": "stm32f407vgt6", - "variant": "BIGTREE_BTT002" - }, - "debug": { - "jlink_device": "STM32F407VG", - "openocd_target": "stm32f4x", - "svd_path": "STM32F40x.svd" - }, - "frameworks": [ - "arduino" - ], - "name": "STM32F407VG (192k RAM. 1024k Flash)", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 131072, - "maximum_size": 1048576, - "protocol": "stlink", - "protocols": [ - "stlink", - "dfu", - "jlink" - ], - "offset_address": "0x8008000", - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407vg.html", - "vendor": "Generic" -} diff --git a/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json b/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json deleted file mode 100644 index 32236301c3..0000000000 --- a/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "build": { - "core": "stm32", - "cpu": "cortex-m4", - "extra_flags": "-DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx", - "f_cpu": "168000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x0483", - "0x3748" - ] - ], - "mcu": "stm32f407zgt6", - "variant": "BIGTREE_GTR_V1" - }, - "debug": { - "jlink_device": "STM32F407ZG", - "openocd_target": "stm32f4x", - "svd_path": "STM32F40x.svd" - }, - "frameworks": [ - "arduino" - ], - "name": "STM32F407ZG (192k RAM. 1024k Flash)", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 196608, - "maximum_size": 1048576, - "protocol": "stlink", - "protocols": [ - "stlink", - "dfu", - "jlink" - ], - "offset_address": "0x8008000", - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407zg.html", - "vendor": "Generic" -} diff --git a/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json b/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json deleted file mode 100644 index 211ceacdca..0000000000 --- a/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "build": { - "core": "stm32", - "cpu": "cortex-m4", - "extra_flags": "-DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx", - "f_cpu": "168000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x0483", - "0x3748" - ] - ], - "mcu": "stm32f407zgt6", - "variant": "BIGTREE_SKR_PRO_1v1" - }, - "debug": { - "jlink_device": "STM32F407ZG", - "openocd_target": "stm32f4x", - "svd_path": "STM32F40x.svd" - }, - "frameworks": [ - "arduino" - ], - "name": "STM32F407ZG (192k RAM. 1024k Flash)", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 196608, - "maximum_size": 1048576, - "protocol": "stlink", - "protocols": [ - "stlink", - "dfu", - "jlink" - ], - "offset_address": "0x8008000", - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407zg.html", - "vendor": "Generic" -} diff --git a/buildroot/share/PlatformIO/boards/CHITU_F103.json b/buildroot/share/PlatformIO/boards/CHITU_F103.json deleted file mode 100644 index ecf7bff66c..0000000000 --- a/buildroot/share/PlatformIO/boards/CHITU_F103.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "build": { - "core": "maple", - "cpu": "cortex-m3", - "extra_flags": "-DSTM32F103xE -DSTM32F1", - "f_cpu": "72000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x1EAF", - "0x0004" - ] - ], - "mcu": "stm32f103zet6", - "variant": "CHITU_F103", - "ldscript": "chitu_f103.ld" - }, - "debug": { - "jlink_device": "STM32F103ZE", - "openocd_target": "stm32f1x", - "svd_path": "STM32F103xx.svd" - }, - "frameworks": [ - "arduino" - ], - "name": "CHITU STM32F103Z (64k RAM. 512k Flash)", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 60536, - "maximum_size": 480288, - "protocol": "stlink", - "protocols": [ - "jlink", - "stlink", - "blackmagic", - "serial", - "dfu" - ], - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f103ze.html", - "vendor": "Generic" -} diff --git a/buildroot/share/PlatformIO/boards/FLYF407ZG.json b/buildroot/share/PlatformIO/boards/FLYF407ZG.json deleted file mode 100644 index 7e585c5057..0000000000 --- a/buildroot/share/PlatformIO/boards/FLYF407ZG.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "build": { - "core": "stm32", - "cpu": "cortex-m4", - "extra_flags": "-DSTM32F407xx", - "f_cpu": "168000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x0483", - "0x3748" - ] - ], - "mcu": "stm32f407zgt6", - "variant": "FLY_F407ZG" - }, - "debug": { - "jlink_device": "STM32F407ZG", - "openocd_target": "stm32f4x", - "svd_path": "STM32F40x.svd", - "tools": { - "stlink": { - "server": { - "arguments": [ - "-f", - "scripts/interface/stlink.cfg", - "-c", - "transport select hla_swd", - "-f", - "scripts/target/stm32f4x.cfg", - "-c", - "reset_config none" - ], - "executable": "bin/openocd", - "package": "tool-openocd" - } - } - } - }, - "frameworks": [ - "arduino", - "stm32cube" - ], - "name": "STM32F407ZGT6(192k RAM. 1024k Flash)", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 196608, - "maximum_size": 1048576, - "protocol": "dfu", - "protocols": [ - "stlink", - "dfu", - "jlink" - ], - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407ZG.html", - "vendor": "Generic" -} diff --git a/buildroot/share/PlatformIO/boards/LERDGE.json b/buildroot/share/PlatformIO/boards/LERDGE.json deleted file mode 100644 index 011814a133..0000000000 --- a/buildroot/share/PlatformIO/boards/LERDGE.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "build": { - "core": "stm32", - "cpu": "cortex-m4", - "extra_flags": "-DSTM32F407xx", - "f_cpu": "168000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x0483", - "0x3748" - ] - ], - "mcu": "stm32f407zgt6", - "variant": "LERDGE", - "ldscript": "LERDGE.ld" - }, - "debug": { - "jlink_device": "STM32F407ZG", - "openocd_target": "stm32f4x", - "svd_path": "STM32F40x.svd", - "tools": { - "stlink": { - "server": { - "arguments": [ - "-f", - "scripts/interface/stlink.cfg", - "-c", - "transport select hla_swd", - "-f", - "scripts/target/stm32f4x.cfg", - "-c", - "reset_config none" - ], - "executable": "bin/openocd", - "package": "tool-openocd" - } - } - } - }, - "frameworks": [ - "arduino", - "stm32cube" - ], - "name": "STM32F407ZGT6(192k RAM. 1024k Flash)", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 196608, - "maximum_size": 1048576, - "protocol": "stlink", - "protocols": [ - "stlink", - "dfu", - "jlink" - ], - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407ZG.html", - "vendor": "Generic" -} diff --git a/buildroot/share/PlatformIO/boards/MEEB_3DP.json b/buildroot/share/PlatformIO/boards/MEEB_3DP.json deleted file mode 100644 index 870648b325..0000000000 --- a/buildroot/share/PlatformIO/boards/MEEB_3DP.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "build": { - "core": "maple", - "cpu": "cortex-m3", - "extra_flags": "-DSTM32F103xE -DSTM32F1", - "f_cpu": "72000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x1EAF", - "0x0004" - ] - ], - "libopencm3": { - "ldscript": "stm32f103xc.ld" - }, - "mcu": "stm32f103rct6", - "variant": "MEEB_3DP" - }, - "debug": { - "jlink_device": "STM32F103RC", - "openocd_target": "stm32f1x", - "svd_path": "STM32F103xx.svd" - }, - "frameworks": [ - "arduino", - "cmsis", - "libopencm3", - "stm32cube" - ], - "name": "3D Printer control board for MEEB with 512k flash/rs422 bus/tmc2208 drivers", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 49152, - "maximum_size": 524288, - "protocol": "dfu", - "protocols": [ - "jlink", - "stlink", - "blackmagic", - "serial", - "dfu" - ], - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://github.com/ccrobot-online/MEEB_3DP", - "vendor": "CCROBOT-ONLINE" -} diff --git a/buildroot/share/PlatformIO/boards/STEVAL_STM32F401VE.json b/buildroot/share/PlatformIO/boards/STEVAL_STM32F401VE.json deleted file mode 100644 index bbfb3fdfa5..0000000000 --- a/buildroot/share/PlatformIO/boards/STEVAL_STM32F401VE.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "build": { - "core": "stm32", - "cpu": "cortex-m4", - "extra_flags": "-DSTM32F401xx", - "f_cpu": "84000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x0483", - "0x3748" - ] - ], - "ldscript": "stm32f401xe.ld", - "mcu": "stm32f401vet6", - "variant": "STEVAL_F401VE" - }, - "debug": { - "jlink_device": "STM32F401VE", - "openocd_target": "stm32f4x", - "svd_path": "STM32F40x.svd", - "tools": { - "stlink": { - "server": { - "arguments": [ - "-f", - "scripts/interface/stlink.cfg", - "-c", - "transport select hla_swd", - "-f", - "scripts/target/stm32f4x.cfg", - "-c", - "reset_config none" - ], - "executable": "bin/openocd", - "package": "tool-openocd" - } - } - } - }, - "frameworks": [ - "arduino", - "stm32cube" - ], - "name": "STM32F401VE (96k RAM. 512k Flash)", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 98304, - "maximum_size": 514288, - "protocol": "stlink", - "protocols": [ - "stlink", - "dfu", - "jlink" - ], - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://www.st.com/en/evaluation-tools/steval-3dp001v1.html", - "vendor": "Generic" -} diff --git a/buildroot/share/PlatformIO/boards/archim.json b/buildroot/share/PlatformIO/boards/archim.json deleted file mode 100644 index 60035197f2..0000000000 --- a/buildroot/share/PlatformIO/boards/archim.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "build": { - "core": "arduino", - "cpu": "cortex-m3", - "extra_flags": "-D__SAM3X8E__ -DARDUINO_ARCH_SAM -DARDUINO_SAM_DUE", - "f_cpu": "84000000L", - "hwids": [ - [ - "0x27B1", - "0x0001" - ], - [ - "0x2341", - "0x003E" - ], - [ - "0x2341", - "0x003D" - ] - ], - "ldscript": "linker_scripts/gcc/flash.ld", - "mcu": "at91sam3x8e", - "usb_product": "Archim", - "variant": "archim" - }, - "connectivity": [ - "can" - ], - "debug": { - "jlink_device": "ATSAM3X8E", - "openocd_chipname": "at91sam3X8E", - "openocd_target": "at91sam3XXX", - "svd_path": "ATSAM3X8E.svd" - }, - "frameworks": [ - "arduino", - "simba" - ], - "name": "Archim", - "upload": { - "disable_flushing": true, - "maximum_ram_size": 98304, - "maximum_size": 524288, - "native_usb": true, - "protocol": "sam-ba", - "protocols": [ - "sam-ba", - "jlink", - "blackmagic", - "atmel-ice", - "stlink" - ], - "require_upload_port": true, - "use_1200bps_touch": true, - "wait_for_upload_port": true - }, - "url": "https://ultimachine.com", - "vendor": "UltiMachine" -} diff --git a/buildroot/share/PlatformIO/boards/at90usb1286.json b/buildroot/share/PlatformIO/boards/at90usb1286.json index 3282722b04..63c9ce44d1 100644 --- a/buildroot/share/PlatformIO/boards/at90usb1286.json +++ b/buildroot/share/PlatformIO/boards/at90usb1286.json @@ -8,7 +8,6 @@ "frameworks": [ "arduino" ], - "platform": "teensy", "name": "Atmel AT90USB1286 based", "upload": { "maximum_ram_size": 8192, diff --git a/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json b/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json deleted file mode 100644 index 1765634086..0000000000 --- a/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "build": { - "core": "stm32", - "cpu": "cortex-m4", - "extra_flags": "-DSTM32F407xx", - "f_cpu": "168000000L", - "hwids": [ - [ - "0x1EAF", - "0x0003" - ], - [ - "0x0483", - "0x3748" - ] - ], - "mcu": "stm32f407vet6", - "variant": "MARLIN_F407VE" - }, - "debug": { - "jlink_device": "STM32F407VE", - "openocd_target": "stm32f4x", - "svd_path": "STM32F40x.svd", - "tools": { - "stlink": { - "server": { - "arguments": [ - "-f", - "scripts/interface/stlink.cfg", - "-c", - "transport select hla_swd", - "-f", - "scripts/target/stm32f4x.cfg", - "-c", - "reset_config none" - ], - "executable": "bin/openocd", - "package": "tool-openocd" - } - } - } - }, - "frameworks": [ - "arduino", - "stm32cube" - ], - "name": "STM32F407VE (192k RAM. 512k Flash)", - "upload": { - "disable_flushing": false, - "maximum_ram_size": 131072, - "maximum_size": 514288, - "protocol": "stlink", - "protocols": [ - "stlink", - "dfu", - "jlink" - ], - "require_upload_port": true, - "use_1200bps_touch": false, - "wait_for_upload_port": false - }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407ve.html", - "vendor": "Generic" -} diff --git a/buildroot/share/PlatformIO/boards/malyanM200.json b/buildroot/share/PlatformIO/boards/malyanM200.json index 4dbf760774..ccf118512f 100644 --- a/buildroot/share/PlatformIO/boards/malyanM200.json +++ b/buildroot/share/PlatformIO/boards/malyanM200.json @@ -11,15 +11,58 @@ "ldscript": "jtagOffset.ld", "mcu": "stm32f103cb", "variant": "malyanM200", + "genericvariant" : "MALYAN_M200_V1", "vec_tab_addr": "0x8002000" }, "debug": { - "jlink_device": "STM32F103CB", - "openocd_target": "stm32f1x", - "svd_path": "STM32F103xx.svd" + "tools": { + "stlink": { + "server": { + "arguments": [ + "-f", "scripts/interface/stlink.cfg", + "-c", "transport select hla_swd", + "-f", "scripts/target/stm32f1x.cfg", + "-c", "reset_config none" + ], + "executable": "bin/openocd", + "package": "tool-openocd" + } + }, + "stlink-v2": { + "server": { + "package": "tool-openocd", + "executable": "bin/openocd", + "arguments": [ + "-f", "scripts/interface/stlink-v2.cfg", + "-c", "transport select hla_swd", + "-f", "scripts/target/stm32f1x.cfg" + ] + }, + "default": true + }, + "stlink-v2-1": { + "server": { + "package": "tool-openocd", + "executable": "bin/openocd", + "arguments": [ + "-f", "scripts/interface/stlink-v2-1.cfg", + "-c", "transport select hla_swd", + "-f", "scripts/target/stm32f1x.cfg" + ] + } + }, + "blackmagic": { + "hwids": [ + [ + "0x1d50", + "0x6018" + ] + ], + "require_debug_port": true + } + } }, - "platform": "ststm32", - "frameworks": ["arduino"], + "frameworks": ["arduino", "arduinoSTM32GENERIC"], "name": "Malyan STM32F103CB (20k RAM. 128k Flash)", "upload": { "disable_flushing": false, @@ -30,6 +73,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "https://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series/stm32f103/stm32f103cb.html", + "url": "http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32f1-series/stm32f103/stm32f103cb.html", "vendor": "Generic" } diff --git a/buildroot/share/PlatformIO/boards/malyanM200v2.json b/buildroot/share/PlatformIO/boards/malyanM200v2.json index 765a0c0a00..ca768444bc 100644 --- a/buildroot/share/PlatformIO/boards/malyanM200v2.json +++ b/buildroot/share/PlatformIO/boards/malyanM200v2.json @@ -4,11 +4,10 @@ "extra_flags": "-DSTM32F070xB", "f_cpu": "48000000L", "mcu": "stm32f070rbt6", - "variant": "MALYANMx00_F070CB", + "genericvariant" : "MALYAN_M200_V2", "vec_tab_addr": "0x8002000" }, "debug": { - "jlink_device": "STM32F070RB", "default_tools": [ "stlink" ], @@ -18,11 +17,10 @@ "openocd_board": "st_nucleo_f0", "openocd_target": "stm32f0x" }, - "platform": "ststm32", "frameworks": [ "mbed", "stm32cube", - "arduino" + "arduinoSTM32GENERIC" ], "name": "Malyan M200 V2/Delta", "upload": { diff --git a/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json b/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json deleted file mode 100644 index 286e46ffbd..0000000000 --- a/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "build": { - "cpu": "cortex-m4", - "extra_flags": "-DSTM32F446xx", - "f_cpu": "180000000L", - "mcu": "stm32f446ret6", - "variant": "MARLIN_FYSETC_S6" - }, - "connectivity": [ - "can" - ], - "debug": { - "jlink_device": "STM32F446RE", - "openocd_target": "stm32f4x", - "svd_path": "STM32F446x.svd" - }, - "frameworks": [ - "arduino", - "stm32cube" - ], - "name": "3D Printer control board", - "upload": { - "maximum_ram_size": 131072, - "maximum_size": 524288, - "protocol": "stlink", - "protocols": [ - "jlink", - "stlink", - "blackmagic", - "serial" - ] - }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html", - "vendor": "FYSETC" -} diff --git a/buildroot/share/PlatformIO/ldscripts/STM32F103RC_MEEB_3DP.ld b/buildroot/share/PlatformIO/ldscripts/STM32F103RC_MEEB_3DP.ld deleted file mode 100644 index 01609b9b2c..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/STM32F103RC_MEEB_3DP.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 - rom (rx) : ORIGIN = 0x08002000, LENGTH = 512K - 8K - 4K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_256K.ld b/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_256K.ld deleted file mode 100644 index 1e720c17c5..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_256K.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 256K - 28K - 4K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_512K.ld b/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_512K.ld deleted file mode 100644 index 248b7781cf..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_512K.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/STM32F103RE_SKR_E3_DIP.ld b/buildroot/share/PlatformIO/ldscripts/STM32F103RE_SKR_E3_DIP.ld deleted file mode 100644 index 248b7781cf..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/STM32F103RE_SKR_E3_DIP.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/STM32F103VE_longer.ld b/buildroot/share/PlatformIO/ldscripts/STM32F103VE_longer.ld deleted file mode 100644 index e7a71012bc..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/STM32F103VE_longer.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 - rom (rx) : ORIGIN = 0x08010000, LENGTH = 512K - 64K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/chitu_f103.ld b/buildroot/share/PlatformIO/ldscripts/chitu_f103.ld deleted file mode 100644 index 0938e8e5e9..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/chitu_f103.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 60K - rom (rx) : ORIGIN = 0x08008800, LENGTH = 512K - 34K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/creality.ld b/buildroot/share/PlatformIO/ldscripts/creality.ld deleted file mode 100644 index 785345543c..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/creality.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/fly_mini.ld b/buildroot/share/PlatformIO/ldscripts/fly_mini.ld deleted file mode 100644 index 2404e7cac9..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/fly_mini.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 - rom (rx) : ORIGIN = 0x08005000, LENGTH = 256K - 20K - 4K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/fysetc_stm32f103rc.ld b/buildroot/share/PlatformIO/ldscripts/fysetc_stm32f103rc.ld deleted file mode 100644 index 6777e59182..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/fysetc_stm32f103rc.ld +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Linker script for Generic STM32F103RC boards, using the generic bootloader (which takes the lower 8k of memory) - */ - -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - rom (rx) : ORIGIN = 0x08008000, LENGTH = 256K - 32K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/jgaurora_a5s_a1.ld b/buildroot/share/PlatformIO/ldscripts/jgaurora_a5s_a1.ld deleted file mode 100644 index db172c97e9..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/jgaurora_a5s_a1.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 64K - 3K - rom (rx) : ORIGIN = 0x0800A000, LENGTH = 512K - 40K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/lerdge.ld b/buildroot/share/PlatformIO/ldscripts/lerdge.ld deleted file mode 100644 index aa0b1dd9cb..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/lerdge.ld +++ /dev/null @@ -1,186 +0,0 @@ -/* -***************************************************************************** -** -** File : LinkerScript.ld -** -** Abstract : Linker script for STM32F407VGTx Device with -** 1024KByte FLASH, 128KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -** (c)Copyright Ac6. -** You may use this file as-is or modify it according to the needs of your -** project. Distribution of this file (unmodified or modified) is not -** permitted. Ac6 permit registered System Workbench for MCU users the -** rights to distribute the assembled, compiled & linked contents of this -** file as part of an application binary file, provided that it is built -** using the System Workbench for MCU toolchain. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20010000; /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200;; /* required amount of heap */ -_Min_Stack_Size = 0x400;; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text ALIGN(4): - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata ALIGN(4): - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCMRAM AT> FLASH - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin.ld deleted file mode 100644 index 785345543c..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/mks_robin.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_e3.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_e3.ld deleted file mode 100644 index 2404e7cac9..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/mks_robin_e3.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 - rom (rx) : ORIGIN = 0x08005000, LENGTH = 256K - 20K - 4K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld deleted file mode 100644 index d8a138ca2e..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld deleted file mode 100644 index 13fa48add4..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 - rom (rx) : ORIGIN = 0x08005000, LENGTH = 256K - 20K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_lite3.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_lite3.ld deleted file mode 100644 index 13fa48add4..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/mks_robin_lite3.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 - rom (rx) : ORIGIN = 0x08005000, LENGTH = 256K - 20K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_mini.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_mini.ld deleted file mode 100755 index d8a138ca2e..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/mks_robin_mini.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld deleted file mode 100755 index d8a138ca2e..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_pro.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_pro.ld deleted file mode 100644 index 785345543c..0000000000 --- a/buildroot/share/PlatformIO/ldscripts/mks_robin_pro.ld +++ /dev/null @@ -1,14 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py b/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py deleted file mode 100644 index 580529c9c1..0000000000 --- a/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py +++ /dev/null @@ -1,9 +0,0 @@ -import os -Import("env") - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py deleted file mode 100644 index 547d80ace5..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +++ /dev/null @@ -1,59 +0,0 @@ -try: - import configparser -except ImportError: - import ConfigParser as configparser - -import os -Import("env", "projenv") -# access to global build environment -print(env) -# access to project build environment (is used source files in "src" folder) -print(projenv) - -config = configparser.ConfigParser() -config.read("platformio.ini") - -#com_port = config.get("env:STM32F103RC_meeb", "upload_port") -#print('Use the {0:s} to reboot the board to dfu mode.'.format(com_port)) - -# -# Upload actions -# - -def before_upload(source, target, env): - print("before_upload") - # do some actions - # use com_port - # - env.Execute("pwd") - -def after_upload(source, target, env): - print("after_upload") - # do some actions - # - # - env.Execute("pwd") - -print("Current build targets", map(str, BUILD_TARGETS)) - -env.AddPreAction("upload", before_upload) -env.AddPostAction("upload", after_upload) - -flash_size = 0 -vect_tab_addr = 0 - -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - vect_tab_addr = define[1] - if define[0] == "STM32_FLASH_SIZE": - flash_size = define[1] - -print('Use the {0:s} address as the marlin app entry point.'.format(vect_tab_addr)) -print('Use the {0:d}KB flash version of stm32f103rct6 chip.'.format(flash_size)) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103RC_MEEB_3DP.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py deleted file mode 100644 index 497a035fdf..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py +++ /dev/null @@ -1,20 +0,0 @@ -import os -Import("env") - -STM32_FLASH_SIZE = 256 - -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) - if define[0] == "STM32_FLASH_SIZE": - STM32_FLASH_SIZE = define[1] - -# Relocate firmware from 0x08000000 to 0x08007000 -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_" + str(STM32_FLASH_SIZE) + "K.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py deleted file mode 100644 index b69f62578b..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +++ /dev/null @@ -1,36 +0,0 @@ -import os -from os.path import join -from os.path import expandvars -Import("env") - -# Relocate firmware from 0x08000000 to 0x08008000 -#for define in env['CPPDEFINES']: -# if define[0] == "VECT_TAB_ADDR": -# env['CPPDEFINES'].remove(define) -#env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08008000")) - -#custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/fysetc_stm32f103rc.ld") -#for i, flag in enumerate(env["LINKFLAGS"]): -# if "-Wl,-T" in flag: -# env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script -# elif flag == "-T": -# env["LINKFLAGS"][i + 1] = custom_ld_script - -# Custom HEX from ELF -env.AddPostAction( - join("$BUILD_DIR","${PROGNAME}.elf"), - env.VerboseAction(" ".join([ - "$OBJCOPY", "-O ihex", "$TARGET", # TARGET=.pio/build/fysetc_STM32F1/firmware.elf - "\"" + join("$BUILD_DIR","${PROGNAME}.hex") + "\"", # Note: $BUILD_DIR is a full path - ]), "Building $TARGET")) - -# In-line command with arguments -UPLOAD_TOOL="stm32flash" -platform = env.PioPlatform() -if platform.get_package_dir("tool-stm32duino") != None: - UPLOAD_TOOL=expandvars("\"" + join(platform.get_package_dir("tool-stm32duino"),"stm32flash","stm32flash") + "\"") - -env.Replace( - UPLOADER=UPLOAD_TOOL, - UPLOADCMD=expandvars(UPLOAD_TOOL + " -v -i rts,-dtr,dtr -R -b 115200 -g 0x8000000 -w \"" + join("$BUILD_DIR","${PROGNAME}.hex")+"\"" + " $UPLOAD_PORT") -) diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py b/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py deleted file mode 100644 index ecdd57f594..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py +++ /dev/null @@ -1,16 +0,0 @@ -import os -Import("env") - -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) - -# Relocate firmware from 0x08000000 to 0x08007000 -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103RE_SKR_E3_DIP.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py deleted file mode 100644 index ece47ed096..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py +++ /dev/null @@ -1,33 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08010000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08010000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103VE_longer.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Rename ${PROGNAME}.bin and save it as 'project.bin' (No encryption on the Longer3D) -def encrypt(source, target, env): - firmware = open(target[0].path, "rb") - marlin_alfa = open(target[0].dir.path +'/project.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - marlin_alfa.write(byte) - position += 1 - finally: - firmware.close() - marlin_alfa.close() - -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py deleted file mode 100644 index 4849f59ceb..0000000000 --- a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py +++ /dev/null @@ -1,34 +0,0 @@ -import os,shutil -from SCons.Script import DefaultEnvironment -from platformio import util - -def copytree(src, dst, symlinks=False, ignore=None): - for item in os.listdir(src): - s = os.path.join(src, item) - d = os.path.join(dst, item) - if os.path.isdir(s): - shutil.copytree(s, d, symlinks, ignore) - else: - shutil.copy2(s, d) - -env = DefaultEnvironment() -platform = env.PioPlatform() -board = env.BoardConfig() - -FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32-maple") -assert os.path.isdir(FRAMEWORK_DIR) -assert os.path.isdir("buildroot/share/PlatformIO/variants") - -variant = board.get("build.variant") -variant_dir = os.path.join(FRAMEWORK_DIR, "STM32F1", "variants", variant) - -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) -assert os.path.isdir(source_dir) - -if os.path.isdir(variant_dir): - shutil.rmtree(variant_dir) - -if not os.path.isdir(variant_dir): - os.mkdir(variant_dir) - -copytree(source_dir, variant_dir) diff --git a/buildroot/share/PlatformIO/scripts/chitu_crypt.py b/buildroot/share/PlatformIO/scripts/chitu_crypt.py deleted file mode 100644 index aa675878e7..0000000000 --- a/buildroot/share/PlatformIO/scripts/chitu_crypt.py +++ /dev/null @@ -1,127 +0,0 @@ -Import("env") -import os -import random -import struct -import uuid - -# Relocate firmware from 0x08000000 to 0x08008800 -env['CPPDEFINES'].remove(("VECT_TAB_ADDR", "0x8000000")) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08008800")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/chitu_f103.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -def calculate_crc(contents, seed): - accumulating_xor_value = seed; - - for i in range(0, len(contents), 4): - value = struct.unpack('> ip - - # load a byte into IP - ip = r0[loop_counter] - - # XOR the seed with r7 - xor_seed = xor_seed ^ r7 - - # and then with IP - xor_seed = xor_seed ^ ip - - #Now store the byte back - r1[loop_counter] = xor_seed & 0xFF - - #increment the loop_counter - loop_counter = loop_counter + 1 - - -def encrypt_file(input, output_file, file_length): - input_file = bytearray(input.read()) - block_size = 0x800 - key_length = 0x18 - - uid_value = uuid.uuid4() - file_key = int(uid_value.hex[0:8], 16) - - xor_crc = 0xEF3D4323; - - # the input file is exepcted to be in chunks of 0x800 - # so round the size - while len(input_file) % block_size != 0: - input_file.extend(b'0x0') - - # write the file header - output_file.write(struct.pack(">I", 0x443D2D3F)) - # encrypt the contents using a known file header key - - # write the file_key - output_file.write(struct.pack(". - * - */ - -/** - * The purpose of this file is just include Marlin Configuration files, - * to discover which FEATURES are enabled, without any HAL include. - * Used by common-dependencies.py - */ - -#define NUM_SERIAL 1 // Normally provided by HAL/HAL.h - -#include "../../../../Marlin/src/inc/MarlinConfig.h" - -// -// Conditionals only used for [features] -// -#if ENABLED(SR_LCD_3W_NL) - // Feature checks for SR_LCD_3W_NL -#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) - #define USES_LIQUIDTWI2 -#elif ANY(HAS_MARLINUI_HD44780, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) - #define USES_LIQUIDCRYSTAL -#endif - -#if SAVED_POSITIONS - #define HAS_SAVED_POSITIONS -#endif - -#if ENABLED(HOST_PROMPT_SUPPORT) && DISABLED(EMERGENCY_PARSER) - #define HAS_GCODE_M876 -#endif - -#if EXTRUDERS - #define HAS_EXTRUDERS -#endif - -#if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) - #define HAS_SMART_EFF_MOD -#endif - -#if HAS_LCD_MENU - #if ENABLED(BACKLASH_GCODE) - #define HAS_MENU_BACKLASH - #endif - #if ENABLED(LEVEL_BED_CORNERS) - #define HAS_MENU_BED_CORNERS - #endif - #if ENABLED(CANCEL_OBJECTS) - #define HAS_MENU_CANCELOBJECT - #endif - #if ENABLED(CUSTOM_USER_MENUS) - #define HAS_MENU_CUSTOM - #endif - #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) - #define HAS_MENU_DELTA_CALIBRATE - #endif - #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) - #define HAS_MENU_LED - #endif - #if ENABLED(ADVANCED_PAUSE_FEATURE) - #define HAS_MENU_FILAMENT - #endif - #if ENABLED(SDSUPPORT) - #define HAS_MENU_MEDIA - #endif - #if ENABLED(MIXING_EXTRUDER) - #define HAS_MENU_MIXER - #endif - #if ENABLED(POWER_LOSS_RECOVERY) - #define HAS_MENU_JOB_RECOVERY - #endif - #if HAS_POWER_MONITOR - #define HAS_MENU_POWER_MONITOR - #endif - #if HAS_CUTTER - #define HAS_MENU_CUTTER - #endif - #if HAS_TEMPERATURE - #define HAS_MENU_TEMPERATURE - #endif - #if ENABLED(MMU2_MENUS) - #define HAS_MENU_MMU2 - #endif - #if ENABLED(PASSWORD_FEATURE) - #define HAS_MENU_PASSWORD - #endif - #if HAS_TRINAMIC_CONFIG - #define HAS_MENU_TMC - #endif - #if ENABLED(TOUCH_SCREEN_CALIBRATION) - #define HAS_MENU_TOUCH_SCREEN - #endif - #if ENABLED(AUTO_BED_LEVELING_UBL) - #define HAS_MENU_UBL - #endif -#endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py deleted file mode 100644 index 4b4bba6258..0000000000 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ /dev/null @@ -1,287 +0,0 @@ -# -# common-dependencies.py -# Convenience script to check dependencies and add libs and sources for Marlin Enabled Features -# -import subprocess -import os -import re -try: - import configparser -except ImportError: - import ConfigParser as configparser -try: - # PIO < 4.4 - from platformio.managers.package import PackageManager -except ImportError: - # PIO >= 4.4 - from platformio.package.meta import PackageSpec as PackageManager - -Import("env") - -#print(env.Dump()) - -try: - verbose = int(env.GetProjectOption('custom_verbose')) -except: - verbose = 0 - -def blab(str): - if verbose: - print(str) - -def parse_pkg_uri(spec): - if PackageManager.__name__ == 'PackageSpec': - return PackageManager(spec).name - else: - name, _, _ = PackageManager.parse_pkg_uri(spec) - return name - -FEATURE_CONFIG = {} - -def add_to_feat_cnf(feature, flines): - - try: - feat = FEATURE_CONFIG[feature] - except: - FEATURE_CONFIG[feature] = {} - - feat = FEATURE_CONFIG[feature] - atoms = re.sub(',\\s*', '\n', flines).strip().split('\n') - for dep in atoms: - parts = dep.split('=') - name = parts.pop(0) - rest = '='.join(parts) - if name in ['extra_scripts', 'src_filter', 'lib_ignore']: - feat[name] = rest - else: - feat['lib_deps'] += [dep] - -def load_config(): - config = configparser.ConfigParser() - config.read("platformio.ini") - items = config.items('features') - for key in items: - feature = key[0].upper() - if not feature in FEATURE_CONFIG: - FEATURE_CONFIG[feature] = { 'lib_deps': [] } - add_to_feat_cnf(feature, key[1]) - - # Add options matching custom_marlin.MY_OPTION to the pile - all_opts = env.GetProjectOptions() - for n in all_opts: - mat = re.match(r'custom_marlin\.(.+)', n[0]) - if mat: - try: - val = env.GetProjectOption(n[0]) - except: - val = None - if val: - add_to_feat_cnf(mat.group(1).upper(), val) - -def get_all_known_libs(): - known_libs = [] - for feature in FEATURE_CONFIG: - feat = FEATURE_CONFIG[feature] - if not 'lib_deps' in feat: - continue - for dep in feat['lib_deps']: - name = parse_pkg_uri(dep) - known_libs.append(name) - return known_libs - -def get_all_env_libs(): - env_libs = [] - lib_deps = env.GetProjectOption('lib_deps') - for dep in lib_deps: - name = parse_pkg_uri(dep) - env_libs.append(name) - return env_libs - -def set_env_field(field, value): - proj = env.GetProjectConfig() - proj.set("env:" + env['PIOENV'], field, value) - -# All unused libs should be ignored so that if a library -# exists in .pio/lib_deps it will not break compilation. -def force_ignore_unused_libs(): - env_libs = get_all_env_libs() - known_libs = get_all_known_libs() - diff = (list(set(known_libs) - set(env_libs))) - lib_ignore = env.GetProjectOption('lib_ignore') + diff - if verbose: - print("Ignore libraries:", lib_ignore) - set_env_field('lib_ignore', lib_ignore) - -def apply_features_config(): - load_config() - for feature in FEATURE_CONFIG: - if not env.MarlinFeatureIsEnabled(feature): - continue - - feat = FEATURE_CONFIG[feature] - - if 'lib_deps' in feat and len(feat['lib_deps']): - blab("Adding lib_deps for %s... " % feature) - - # feat to add - deps_to_add = {} - for dep in feat['lib_deps']: - name = parse_pkg_uri(dep) - deps_to_add[name] = dep - - # Does the env already have the dependency? - deps = env.GetProjectOption('lib_deps') - for dep in deps: - name = parse_pkg_uri(dep) - if name in deps_to_add: - del deps_to_add[name] - - # Are there any libraries that should be ignored? - lib_ignore = env.GetProjectOption('lib_ignore') - for dep in deps: - name = parse_pkg_uri(dep) - if name in deps_to_add: - del deps_to_add[name] - - # Is there anything left? - if len(deps_to_add) > 0: - # Only add the missing dependencies - set_env_field('lib_deps', deps + list(deps_to_add.values())) - - if 'extra_scripts' in feat: - blab("Running extra_scripts for %s... " % feature) - env.SConscript(feat['extra_scripts'], exports="env") - - if 'src_filter' in feat: - blab("Adding src_filter for %s... " % feature) - src_filter = ' '.join(env.GetProjectOption('src_filter')) - # first we need to remove the references to the same folder - my_srcs = re.findall( r'[+-](<.*?>)', feat['src_filter']) - cur_srcs = re.findall( r'[+-](<.*?>)', src_filter) - for d in my_srcs: - if d in cur_srcs: - src_filter = re.sub(r'[+-]' + d, '', src_filter) - - src_filter = feat['src_filter'] + ' ' + src_filter - set_env_field('src_filter', [src_filter]) - env.Replace(SRC_FILTER=src_filter) - - if 'lib_ignore' in feat: - blab("Adding lib_ignore for %s... " % feature) - lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] - set_env_field('lib_ignore', lib_ignore) - -# -# Find a compiler, considering the OS -# -ENV_BUILD_PATH = os.path.join(env.Dictionary('PROJECT_BUILD_DIR'), env['PIOENV']) -GCC_PATH_CACHE = os.path.join(ENV_BUILD_PATH, ".gcc_path") -def search_compiler(): - try: - filepath = env.GetProjectOption('custom_gcc') - blab('Getting compiler from env') - return filepath - except: - pass - - if os.path.exists(GCC_PATH_CACHE): - blab('Getting g++ path from cache') - with open(GCC_PATH_CACHE, 'r') as f: - return f.read() - - # Find the current platform compiler by searching the $PATH - # which will be in a platformio toolchain bin folder - path_regex = re.escape(env['PROJECT_PACKAGES_DIR']) - gcc = "g++" - if env['PLATFORM'] == 'win32': - path_separator = ';' - path_regex += r'.*\\bin' - gcc += ".exe" - else: - path_separator = ':' - path_regex += r'/.+/bin' - - # Search for the compiler - for pathdir in env['ENV']['PATH'].split(path_separator): - if not re.search(path_regex, pathdir, re.IGNORECASE): - continue - for filepath in os.listdir(pathdir): - if not filepath.endswith(gcc): - continue - - # Cache the g++ path to no search always - if os.path.exists(ENV_BUILD_PATH): - blab('Caching g++ for current env') - with open(GCC_PATH_CACHE, 'w+') as f: - f.write(filepath) - - return filepath - - filepath = env.get('CXX') - blab("Couldn't find a compiler! Fallback to %s" % filepath) - return filepath - -# -# Use the compiler to get a list of all enabled features -# -def load_marlin_features(): - if 'MARLIN_FEATURES' in env: - return - - # Process defines - build_flags = env.get('BUILD_FLAGS') - build_flags = env.ParseFlagsExtended(build_flags) - - cxx = search_compiler() - cmd = [cxx] - - # Build flags from board.json - #if 'BOARD' in env: - # cmd += [env.BoardConfig().get("build.extra_flags")] - for s in build_flags['CPPDEFINES']: - if isinstance(s, tuple): - cmd += ['-D' + s[0] + '=' + str(s[1])] - else: - cmd += ['-D' + s] - - cmd += ['-D__MARLIN_DEPS__ -w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] - cmd = ' '.join(cmd) - blab(cmd) - define_list = subprocess.check_output(cmd, shell=True).splitlines() - marlin_features = {} - for define in define_list: - feature = define[8:].strip().decode().split(' ') - feature, definition = feature[0], ' '.join(feature[1:]) - marlin_features[feature] = definition - env['MARLIN_FEATURES'] = marlin_features - -# -# Return True if a matching feature is enabled -# -def MarlinFeatureIsEnabled(env, feature): - load_marlin_features() - r = re.compile('^' + feature + '$') - found = list(filter(r.match, env['MARLIN_FEATURES'])) - - # Defines could still be 'false' or '0', so check - some_on = False - if len(found): - for f in found: - val = env['MARLIN_FEATURES'][f] - if val in [ '', '1', 'true' ]: - some_on = True - elif val in env['MARLIN_FEATURES']: - some_on = env.MarlinFeatureIsEnabled(val) - - return some_on - -# -# Add a method for other PIO scripts to query enabled features -# -env.AddMethod(MarlinFeatureIsEnabled) - -# -# Add dependencies for enabled Marlin features -# -apply_features_config() -force_ignore_unused_libs() diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py deleted file mode 100644 index f7d3f0d03a..0000000000 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ /dev/null @@ -1,58 +0,0 @@ -import os,shutil -from SCons.Script import DefaultEnvironment -from platformio import util -try: - # PIO < 4.4 - from platformio.managers.package import PackageManager -except ImportError: - # PIO >= 4.4 - from platformio.package.meta import PackageSpec as PackageManager - -def parse_pkg_uri(spec): - if PackageManager.__name__ == 'PackageSpec': - return PackageManager(spec).name - else: - name, _, _ = PackageManager.parse_pkg_uri(spec) - return name - -def copytree(src, dst, symlinks=False, ignore=None): - for item in os.listdir(src): - s = os.path.join(src, item) - d = os.path.join(dst, item) - if os.path.isdir(s): - shutil.copytree(s, d, symlinks, ignore) - else: - shutil.copy2(s, d) - -env = DefaultEnvironment() -platform = env.PioPlatform() -board = env.BoardConfig() -variant = board.get("build.variant") - -platform_packages = env.GetProjectOption('platform_packages') -# if there's no framework defined, take it from the class name of platform -framewords = { - "Ststm32Platform": "framework-arduinoststm32", - "AtmelavrPlatform": "framework-arduino-avr" -} -if len(platform_packages) == 0: - platform_name = framewords[platform.__class__.__name__] -else: - platform_name = parse_pkg_uri(platform_packages[0]) - -FRAMEWORK_DIR = platform.get_package_dir(platform_name) -assert os.path.isdir(FRAMEWORK_DIR) -assert os.path.isdir("buildroot/share/PlatformIO/variants") - -variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) - -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) -assert os.path.isdir(source_dir) - -if os.path.isdir(variant_dir): - shutil.rmtree(variant_dir) - -if not os.path.isdir(variant_dir): - os.mkdir(variant_dir) - -copytree(source_dir, variant_dir) diff --git a/buildroot/share/PlatformIO/scripts/creality.py b/buildroot/share/PlatformIO/scripts/creality.py deleted file mode 100644 index b9d7d7039b..0000000000 --- a/buildroot/share/PlatformIO/scripts/creality.py +++ /dev/null @@ -1,17 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) - -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/creality.ld") - -for i, flag in enumerate(env['LINKFLAGS']): - if "-Wl,-T" in flag: - env['LINKFLAGS'][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env['LINKFLAGS'][i + 1] = custom_ld_script diff --git a/buildroot/share/PlatformIO/scripts/download_mks_assets.py b/buildroot/share/PlatformIO/scripts/download_mks_assets.py deleted file mode 100644 index ae2ce467e8..0000000000 --- a/buildroot/share/PlatformIO/scripts/download_mks_assets.py +++ /dev/null @@ -1,46 +0,0 @@ -Import("env") -import os -import requests -import zipfile -import tempfile -import shutil - -url = "https://github.com/makerbase-mks/Mks-Robin-Nano-Marlin2.0-Firmware/archive/master.zip" -zip_path = os.path.join(env.Dictionary("PROJECT_LIBDEPS_DIR"), "mks-assets.zip") -assets_path = os.path.join(env.Dictionary("PROJECT_BUILD_DIR"), env.Dictionary("PIOENV"), "assets") - -def download_mks_assets(): - print("Downloading MKS Assets") - r = requests.get(url, stream=True) - # the user may have a very clean workspace, - # so create the PROJECT_LIBDEPS_DIR directory if not exits - if os.path.exists(env.Dictionary("PROJECT_LIBDEPS_DIR")) == False: - os.mkdir(env.Dictionary("PROJECT_LIBDEPS_DIR")) - with open(zip_path, 'wb') as fd: - for chunk in r.iter_content(chunk_size=128): - fd.write(chunk) - -def copy_mks_assets(): - print("Copying MKS Assets") - output_path = tempfile.mkdtemp() - zip_obj = zipfile.ZipFile(zip_path, 'r') - zip_obj.extractall(output_path) - zip_obj.close() - if os.path.exists(assets_path) == True and os.path.isdir(assets_path) == False: - os.unlink(assets_path) - if os.path.exists(assets_path) == False: - os.mkdir(assets_path) - base_path = '' - for filename in os.listdir(output_path): - base_path = filename - for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_font')): - shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_font', filename), assets_path) - for filename in os.listdir(os.path.join(output_path, base_path, 'Firmware', 'mks_pic')): - shutil.copy(os.path.join(output_path, base_path, 'Firmware', 'mks_pic', filename), assets_path) - shutil.rmtree(output_path, ignore_errors=True) - -if os.path.exists(zip_path) == False: - download_mks_assets() - -if os.path.exists(assets_path) == False: - copy_mks_assets() diff --git a/buildroot/share/PlatformIO/scripts/fly_mini.py b/buildroot/share/PlatformIO/scripts/fly_mini.py deleted file mode 100644 index 34d132958d..0000000000 --- a/buildroot/share/PlatformIO/scripts/fly_mini.py +++ /dev/null @@ -1,16 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08005000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/fly_mini.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - diff --git a/buildroot/share/PlatformIO/scripts/generic_create_variant.py b/buildroot/share/PlatformIO/scripts/generic_create_variant.py deleted file mode 100644 index 0b82c69f5a..0000000000 --- a/buildroot/share/PlatformIO/scripts/generic_create_variant.py +++ /dev/null @@ -1,27 +0,0 @@ -import os,shutil -from SCons.Script import DefaultEnvironment -from platformio import util - -env = DefaultEnvironment() -platform = env.PioPlatform() -board = env.BoardConfig() - -FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32") -assert os.path.isdir(FRAMEWORK_DIR) -assert os.path.isdir("buildroot/share/PlatformIO/variants") - -mcu_type = board.get("build.mcu")[:-2] -variant = board.get("build.variant") -series = mcu_type[:7].upper() + "xx" -variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) - -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) -assert os.path.isdir(source_dir) - -if not os.path.isdir(variant_dir): - os.mkdir(variant_dir) - -for file_name in os.listdir(source_dir): - full_file_name = os.path.join(source_dir, file_name) - if os.path.isfile(full_file_name): - shutil.copy(full_file_name, variant_dir) diff --git a/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py b/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py deleted file mode 100644 index 6c8a4f6034..0000000000 --- a/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x0800A000 -env['CPPDEFINES'].remove(("VECT_TAB_ADDR", "0x8000000")) -#alternatively, for STSTM <=5.1.0 use line below -#env['CPPDEFINES'].remove(("VECT_TAB_ADDR", 134217728)) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x0800A000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/jgaurora_a5s_a1.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - -#append ${PROGNAME}.bin firmware after bootloader and save it as 'jgaurora_firmware.bin' -def addboot(source,target,env): - firmware = open(target[0].path, "rb") - lengthfirmware = os.path.getsize(target[0].path) - bootloader_dir = "buildroot/share/PlatformIO/scripts/jgaurora_bootloader.bin" - bootloader = open(bootloader_dir, "rb") - lengthbootloader = os.path.getsize(bootloader_dir) - firmware_with_boothloader_dir = target[0].dir.path +'/firmware_with_bootloader.bin' - if os.path.exists(firmware_with_boothloader_dir): - os.remove(firmware_with_boothloader_dir) - firmwareimage = open(firmware_with_boothloader_dir, "wb") - position = 0 - while position < lengthbootloader: - byte = bootloader.read(1) - firmwareimage.write(byte) - position += 1 - position = 0 - while position < lengthfirmware: - byte = firmware.read(1) - firmwareimage.write(byte) - position += 1 - bootloader.close() - firmware.close() - firmwareimage.close() - firmware_without_bootloader_dir = target[0].dir.path+'/firmware_for_sd_upload.bin' - if os.path.exists(firmware_without_bootloader_dir): - os.remove(firmware_without_bootloader_dir) - os.rename(target[0].path, firmware_without_bootloader_dir) - #os.rename(target[0].dir.path+'/firmware_with_bootloader.bin', target[0].dir.path+'/firmware.bin') - -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", addboot); - diff --git a/buildroot/share/PlatformIO/scripts/jgaurora_bootloader.bin b/buildroot/share/PlatformIO/scripts/jgaurora_bootloader.bin deleted file mode 100644 index c229e5b3bb..0000000000 Binary files a/buildroot/share/PlatformIO/scripts/jgaurora_bootloader.bin and /dev/null differ diff --git a/buildroot/share/PlatformIO/scripts/lerdge.py b/buildroot/share/PlatformIO/scripts/lerdge.py deleted file mode 100644 index fd934a1278..0000000000 --- a/buildroot/share/PlatformIO/scripts/lerdge.py +++ /dev/null @@ -1,46 +0,0 @@ -import os,sys -Import("env") - -from SCons.Script import DefaultEnvironment -board = DefaultEnvironment().BoardConfig() - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/lerdge.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - -def encryptByte(byte): - byte = 0xFF & ((byte << 6) | (byte >> 2)) - i = 0x58 + byte - j = 0x05 + byte + (i >> 8) - byte = (0xF8 & i) | (0x07 & j) - return byte - -def encrypt_file(input, output_file, file_length): - input_file = bytearray(input.read()) - for i in range(len(input_file)): - result = encryptByte(input_file[i]) - input_file[i] = result - - output_file.write(input_file) - return - -# Encrypt ${PROGNAME}.bin and save it as build.firmware -def encrypt(source, target, env): - print("Encrypting to:", board.get("build.firmware")) - firmware = open(target[0].path, "rb") - result = open(target[0].dir.path + "/" + board.get("build.firmware"), "wb") - length = os.path.getsize(target[0].path) - - encrypt_file(firmware, result, length) - - firmware.close() - result.close() - -if 'firmware' in board.get("build").keys(): - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); -else: - print("You need to define output file via board_build.firmware = 'filename' parameter") - exit(1); diff --git a/buildroot/share/PlatformIO/scripts/mks_encrypt.py b/buildroot/share/PlatformIO/scripts/mks_encrypt.py deleted file mode 100644 index 0d53cdfbe9..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_encrypt.py +++ /dev/null @@ -1,32 +0,0 @@ -import os,sys -Import("env") - -from SCons.Script import DefaultEnvironment -board = DefaultEnvironment().BoardConfig() - -# Encrypt ${PROGNAME}.bin and save it as build.firmware ('Robin.bin') -def encrypt(source, target, env): - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/'+ board.get("build.firmware"), "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() - -if 'firmware' in board.get("build").keys(): - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); -else: - print("You need to define output file via board_build.firmware = 'filename' parameter", file=sys.stderr) - exit(1); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin.py b/buildroot/share/PlatformIO/scripts/mks_robin.py deleted file mode 100644 index dd2342bf0d..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_robin.py +++ /dev/null @@ -1,39 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - -# Encrypt ${PROGNAME}.bin and save it as 'Robin.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_e3.py b/buildroot/share/PlatformIO/scripts/mks_robin_e3.py deleted file mode 100644 index 3af623cce0..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_robin_e3.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08005000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_e3.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_e3.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py b/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py deleted file mode 100644 index 2aab14bab7..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'mks_robin_e3p.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_e3p.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_lite.py b/buildroot/share/PlatformIO/scripts/mks_robin_lite.py deleted file mode 100644 index 2f3ae1fa9a..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_robin_lite.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08005000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/mksLite.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py b/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py deleted file mode 100644 index 67ad442d82..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08005000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/mksLite3.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py deleted file mode 100755 index d386698301..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_mini.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'Robin_mini.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_mini.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py deleted file mode 100755 index a68fd308d4..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'Robin_nano.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_nano.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py deleted file mode 100644 index 0047289adf..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - - -# Encrypt ${PROGNAME}.bin and save it as 'Robin_nano35.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_nano35.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_pro.py b/buildroot/share/PlatformIO/scripts/mks_robin_pro.py deleted file mode 100644 index 2ebf1ffb9d..0000000000 --- a/buildroot/share/PlatformIO/scripts/mks_robin_pro.py +++ /dev/null @@ -1,39 +0,0 @@ -import os -Import("env") - -# Relocate firmware from 0x08000000 to 0x08007000 -for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_ADDR": - env['CPPDEFINES'].remove(define) -env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) - -custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_pro.ld") -for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,-T" in flag: - env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script - elif flag == "-T": - env["LINKFLAGS"][i + 1] = custom_ld_script - -# Encrypt ${PROGNAME}.bin and save it as 'Robin.bin' -def encrypt(source, target, env): - import sys - - key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E] - - firmware = open(target[0].path, "rb") - robin = open(target[0].dir.path +'/Robin_pro.bin', "wb") - length = os.path.getsize(target[0].path) - position = 0 - try: - while position < length: - byte = firmware.read(1) - if position >= 320 and position < 31040: - byte = chr(ord(byte) ^ key[position & 31]) - if sys.version_info[0] > 2: - byte = bytes(byte, 'latin1') - robin.write(byte) - position += 1 - finally: - firmware.close() - robin.close() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/random-bin.py b/buildroot/share/PlatformIO/scripts/random-bin.py deleted file mode 100644 index 4d7ca5dc09..0000000000 --- a/buildroot/share/PlatformIO/scripts/random-bin.py +++ /dev/null @@ -1,5 +0,0 @@ -Import("env") - -from datetime import datetime - -env['PROGNAME'] = datetime.now().strftime("firmware-%Y%m%d-%H%M%S") diff --git a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py deleted file mode 100644 index d517f1c8d1..0000000000 --- a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py +++ /dev/null @@ -1,30 +0,0 @@ -import os,sys,shutil -Import("env") - -from SCons.Script import DefaultEnvironment -board = DefaultEnvironment().BoardConfig() - -def noencrypt(source, target, env): - firmware = os.path.join(target[0].dir.path, board.get("build.firmware")) - # do not overwrite encrypted firmware if present - if not os.path.isfile(firmware): - shutil.copy(target[0].path, firmware) - -if 'offset' in board.get("build").keys(): - LD_FLASH_OFFSET = board.get("build.offset") - - for define in env['CPPDEFINES']: - if define[0] == "VECT_TAB_OFFSET": - env['CPPDEFINES'].remove(define) - env['CPPDEFINES'].append(("VECT_TAB_OFFSET", LD_FLASH_OFFSET)) - - maximum_ram_size = board.get("upload.maximum_ram_size") - - for i, flag in enumerate(env["LINKFLAGS"]): - if "-Wl,--defsym=LD_FLASH_OFFSET" in flag: - env["LINKFLAGS"][i] = "-Wl,--defsym=LD_FLASH_OFFSET=" + LD_FLASH_OFFSET - if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: - env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) - - if 'firmware' in board.get("build").keys(): - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", noencrypt); diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c deleted file mode 100644 index cff269db0b..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - * Automatically generated from STM32F407Z(E-G)Tx.xml - */ -#include -#include - -/* ===== - * Note: Commented lines are alternative possibilities which are not used by default. - * If you change them, you should know what you're doing first. - * ===== - */ - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 E0_DIR - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 BLTOUCH_2 - {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 BLTOUCH_4 - {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 E1_EN - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS - {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK - {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED - {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 HEATER2 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 HEATER0 - {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 Z_EN - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 EXP_14 - {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 Z_DIR - {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 E0_EN - {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 EXP_8 - {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 EXP_7 - - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC - {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 - {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 TH_1 - {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 TH_2 - {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 - {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 - {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 EXP_3 - {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 EXP_6 - {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 EXP_5 - #endif - {NC, NP, 0} -}; -#endif - -//*** DAC *** - -#ifdef HAL_DAC_MODULE_ENABLED -const PinMap PinMap_DAC[] = { - {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - {NC, NP, 0} -}; -#endif - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SDA[] = { - {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - #endif - {NC, NP, 0} -}; -#endif - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SCL[] = { - {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - #endif - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -const PinMap PinMap_PWM[] = { - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 HEATER0 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 HEATER1 - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 HEATER2 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 BED - {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 FAN0 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 FAN2 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 EXTENSION1-4 - - /** - * Unused by specifications on BTT002. (PLEASE CONFIRM) - * Uncomment the corresponding line if you want to have HardwarePWM on some pins. - * WARNING: check timers' usage first to avoid conflicts. - * If you don't know what you're doing leave things as they are or you WILL break something (including hardware) - * If you alter this section DO NOT report bugs to Marlin team since they are most likely caused by you. Thank you. - */ - //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 BLTOUCH is a "servo" - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BLTOUCH is a "servo" - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - //{PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - //{PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - //{PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - //{PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - #endif - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_TX[] = { - {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; - -const PinMap PinMap_UART_RX[] = { - {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; - -const PinMap PinMap_UART_RTS[] = { - {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; - -const PinMap PinMap_UART_CTS[] = { - {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MOSI[] = { - {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; -#endif - -//*** CAN *** - -#ifdef HAL_CAN_MODULE_ENABLED -#error "CAN bus isn't available on this board. Driver should be disabled." -#endif - -//*** ETHERNET *** -#ifdef HAL_ETH_MODULE_ENABLED -#error "Ethernet port isn't available on this board. Driver should be disabled." -#endif - -//*** No QUADSPI *** - -//*** USB *** -#ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_FS[] = { - //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF used by LCD - //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS available on wifi port, if empty - //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID available on UART1_RX if not used - {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM - {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP - {NC, NP, 0} -}; - -const PinMap PinMap_USB_OTG_HS[] = { /* - #ifdef USE_USB_HS_IN_FS - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM - {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP - #else - #error "USB in HS mode isn't supported by the board" - {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 - {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 - {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 - {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 - {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 - {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP - {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR - {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT - #endif // USE_USB_HS_IN_FS - */ - {NC, NP, 0} -}; -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PinNamesVar.h b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PinNamesVar.h deleted file mode 100644 index b4bb9d45f8..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PinNamesVar.h +++ /dev/null @@ -1,50 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_OTG_FS_SOF = PA_8, - USB_OTG_FS_VBUS = PA_9, - USB_OTG_FS_ID = PA_10, - USB_OTG_FS_DM = PA_11, - USB_OTG_FS_DP = PA_12, - USB_OTG_HS_ULPI_D0 = PA_3, - USB_OTG_HS_SOF = PA_4, - USB_OTG_HS_ULPI_CK = PA_5, - USB_OTG_HS_ULPI_D1 = PB_0, - USB_OTG_HS_ULPI_D2 = PB_1, - USB_OTG_HS_ULPI_D7 = PB_5, - USB_OTG_HS_ULPI_D3 = PB_10, - USB_OTG_HS_ULPI_D4 = PB_11, - USB_OTG_HS_ID = PB_12, - USB_OTG_HS_ULPI_D5 = PB_12, - USB_OTG_HS_ULPI_D6 = PB_13, - USB_OTG_HS_VBUS = PB_13, - USB_OTG_HS_DM = PB_14, - USB_OTG_HS_DP = PB_15, - USB_OTG_HS_ULPI_STP = PC_0, - USB_OTG_HS_ULPI_DIR = PC_2, - USB_OTG_HS_ULPI_NXT = PC_3, -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h deleted file mode 100644 index e0e8239aac..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#define HAL_MODULE_ENABLED -#define HAL_ADC_MODULE_ENABLED -#define HAL_CRC_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -//#define HAL_RTC_MODULE_ENABLED Real Time Clock...do we use it? -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -#define HAL_USART_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -//#define HAL_UART_MODULE_ENABLED // by default -//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) - -#undef HAL_SD_MODULE_ENABLED -#undef HAL_DAC_MODULE_ENABLED -#undef HAL_FLASH_MODULE_ENABLED -#undef HAL_CAN_MODULE_ENABLED -#undef HAL_CAN_LEGACY_MODULE_ENABLED -#undef HAL_CEC_MODULE_ENABLED -#undef HAL_CRYP_MODULE_ENABLED -#undef HAL_DCMI_MODULE_ENABLED -#undef HAL_DMA2D_MODULE_ENABLED -#undef HAL_ETH_MODULE_ENABLED -#undef HAL_NAND_MODULE_ENABLED -#undef HAL_NOR_MODULE_ENABLED -#undef HAL_PCCARD_MODULE_ENABLED -#undef HAL_SRAM_MODULE_ENABLED -#undef HAL_SDRAM_MODULE_ENABLED -#undef HAL_HASH_MODULE_ENABLED -#undef HAL_EXTI_MODULE_ENABLED -#undef HAL_SMBUS_MODULE_ENABLED -#undef HAL_I2S_MODULE_ENABLED -#undef HAL_IWDG_MODULE_ENABLED -#undef HAL_LTDC_MODULE_ENABLED -#undef HAL_DSI_MODULE_ENABLED -#undef HAL_QSPI_MODULE_ENABLED -#undef HAL_RNG_MODULE_ENABLED -#undef HAL_SAI_MODULE_ENABLED -#undef HAL_IRDA_MODULE_ENABLED -#undef HAL_SMARTCARD_MODULE_ENABLED -#undef HAL_WWDG_MODULE_ENABLED -#undef HAL_HCD_MODULE_ENABLED -#undef HAL_FMPI2C_MODULE_ENABLED -#undef HAL_SPDIFRX_MODULE_ENABLED -#undef HAL_DFSDM_MODULE_ENABLED -#undef HAL_LPTIM_MODULE_ENABLED -#undef HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/ldscript.ld b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/ldscript.ld deleted file mode 100644 index 0c060d1751..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/ldscript.ld +++ /dev/null @@ -1,204 +0,0 @@ -/* -***************************************************************************** -** - -** File : LinkerScript.ld -** -** Abstract : Linker script for STM32F407ZGTx Device with -** 1024KByte FLASH, 128KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2014 Ac6

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of Ac6 nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200;; /* required amount of heap */ -_Min_Stack_Size = 0x400;; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 1024K -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text ALIGN(4): - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata ALIGN(4): - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCMRAM AT> FLASH - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.cpp b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.cpp deleted file mode 100644 index 1486b21830..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Pin number -// This array allows to wrap Arduino pin number(Dx or x) -// to STM32 PinName (PX_n) -const PinName digitalPin[] = { -#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio - PC_13, //D0 - PC_14, //D1 - OSC32_IN - PC_15, //D2 - OSC32_OUT - PH_0, //D3 - OSC_IN - PH_1, //D4 - OSC_OUT - PB_2, //D5 - BOOT1 - PB_10, //D6 - 1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 - PB_11, //D7 - 1:I2C2_SDA / USART3_RX / TIM2_CH4 - PB_12, //D8 - 1:SPI2_NSS / OTG_HS_ID - PB_13, //D9 - 1:SPI2_SCK 2:OTG_HS_VBUS - PB_14, //D10 - 1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM - PB_15, //D11 - SPI2_MOSI / TIM12_CH2 / OTG_HS_DP - PC_6, //D12 - 1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 - PC_7, //D13 - 1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 - PC_8, //D14 - 1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 - PC_9, //D15 - 1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 - PA_8, //D16 - 1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF - PA_9, //D17 - 1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS - PA_10, //D18 - 1:USART1_RX / TIM1_CH3 / OTG_FS_ID - PA_11, //D19 - 1:TIM1_CH4 / OTG_FS_DM - PA_12, //D20 - 1:OTG_FS_DP - PA_13, //D21 - 0:JTMS-SWDIO - PA_14, //D22 - 0:JTCK-SWCLK - PA_15, //D23 - 0:JTDI 1:SPI3_NSS / SPI1_NSS - PC_10, //D24 - 1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX - PC_11, //D25 - 1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX - PC_12, //D26 - 1:UART5_TX / SPI3_MOSI / SDIO_CK - PD_2, //D27 - 1:UART5_RX / SDIO_CMD - PB_3, //D28 - 0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK - PB_4, //D29 - 0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO - PB_5, //D30 - 1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI - PB_6, //D31 - 1:I2C1_SCL / TIM4_CH1 / USART1_TX - PB_7, //D32 - 1:I2C1_SDA / TIM4_CH2 / USART1_RX - PB_8, //D33 - 1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 - PB_9, //D34 - 1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS - PA_0, //D35/A0 - 1:UART4_TX / TIM5_CH1 2:ADC123_IN0 - PA_1, //D36/A1 - 1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 - PA_2, //D37/A2 - 1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 - PA_3, //D38/A3 - 1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 - PA_4, //D39/A4 - NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 - PA_5, //D40/A5 - NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 - PA_6, //D41/A6 - 1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 - PA_7, //D42/A7 - 1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 - PB_0, //D43/A8 - 1:TIM3_CH3 2:ADC12_IN8 - PB_1, //D44/A9 - 1:TIM3_CH4 2:ADC12_IN9 - PC_0, //D45/A10 - 1: 2:ADC123_IN10 - PC_1, //D46/A11 - 1: 2:ADC123_IN11 - PC_2, //D47/A12 - 1:SPI2_MISO 2:ADC123_IN12 - PC_3, //D48/A13 - 1:SPI2_MOSI 2:ADC123_IN13 - PC_4, //D49/A14 - 1: 2:ADC12_IN14 - PC_5, //D50/A15 - 1: 2:ADC12_IN15 - #if STM32F4X_PIN_NUM >= 144 - PF_3, //D51/A16 - 1:FSMC_A3 2:ADC3_IN9 - PF_4, //D52/A17 - 1:FSMC_A4 2:ADC3_IN14 - PF_5, //D53/A18 - 1:FSMC_A5 2:ADC3_IN15 - PF_6, //D54/A19 - 1:TIM10_CH1 2:ADC3_IN4 - PF_7, //D55/A20 - 1:TIM11_CH1 2:ADC3_IN5 - PF_8, //D56/A21 - 1:TIM13_CH1 2:ADC3_IN6 - PF_9, //D57/A22 - 1;TIM14_CH1 2:ADC3_IN7 - PF_10, //D58/A23 - 2:ADC3_IN8 - #endif -#endif -#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio - PE_2, //D59 - 1:FSMC_A23 - PE_3, //D60 - 1:FSMC_A19 - PE_4, //D61 - 1:FSMC_A20 - PE_5, //D62 - 1:FSMC_A21 - PE_6, //D63 - 1:FSMC_A22 - PE_7, //D64 - 1:FSMC_D4 - PE_8, //D65 - 1:FSMC_D5 - PE_9, //D66 - 1:FSMC_D6 / TIM1_CH1 - PE_10, //D67 - 1:FSMC_D7 - PE_11, //D68 - 1:FSMC_D8 / TIM1_CH2 - PE_12, //D69 - 1:FSMC_D9 - PE_13, //D70 - 1:FSMC_D10 / TIM1_CH3 - PE_14, //D71 - 1:FSMC_D11 / TIM1_CH4 - PE_15, //D72 - 1:FSMC_D12 - PD_8, //D73 - 1:FSMC_D13 / USART3_TX - PD_9, //D74 - 1:FSMC_D14 / USART3_RX - PD_10, //D75 - 1:FSMC_D15 - PD_11, //D76 - 1:FSMC_A16 - PD_12, //D77 - 1:FSMC_A17 / TIM4_CH1 - PD_13, //D78 - 1:FSMC_A18 / TIM4_CH2 - PD_14, //D79 - 1:FSMC_D0 / TIM4_CH3 - PD_15, //D80 - 1:FSMC_D1 / TIM4_CH4 - PD_0, //D81 - 1:FSMC_D2 - PD_1, //D82 - 1:FSMC_D3 - PD_3, //D83 - 1:FSMC_CLK - PD_4, //D84 - 1:FSMC_NOE - PD_5, //D85 - 1:USART2_TX - PD_6, //D86 - 1:USART2_RX - PD_7, //D87 - PE_0, //D88 - PE_1, //D89 -#endif -#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - PF_0, //D90 - 1:FSMC_A0 / I2C2_SDA - PF_1, //D91 - 1:FSMC_A1 / I2C2_SCL - PF_2, //D92 - 1:FSMC_A2 - PF_11, //D93 - PF_12, //D94 - 1:FSMC_A6 - PF_13, //D95 - 1:FSMC_A7 - PF_14, //D96 - 1:FSMC_A8 - PF_15, //D97 - 1:FSMC_A9 - PG_0, //D98 - 1:FSMC_A10 - PG_1, //D99 - 1:FSMC_A11 - PG_2, //D100 - 1:FSMC_A12 - PG_3, //D101 - 1:FSMC_A13 - PG_4, //D102 - 1:FSMC_A14 - PG_5, //D103 - 1:FSMC_A15 - PG_6, //D104 - PG_7, //D105 - PG_8, //D106 - PG_9, //D107 - 1:USART6_RX - PG_10, //D108 - 1:FSMC_NE3 - PG_11, //D109 - PG_12, //D110 - 1:FSMC_NE4 - PG_13, //D111 - 1:FSMC_A24 - PG_14, //D112 - 1:FSMC_A25 / USART6_TX - PG_15, //D113 -#endif -#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio - PI_8, //D114 - PI_9, //D115 - PI_10, //D116 - PI_11, //D117 - PH_2, //D118 - PH_3, //D119 - PH_4, //D120 - 1:I2C2_SCL - PH_5, //D121 - 1:I2C2_SDA - PH_6, //D122 - 1:TIM12_CH1 - PH_7, //D123 - 1:I2C3_SCL - PH_8, //D124 - 1:I2C3_SDA - PH_9, //D125 - 1:TIM12_CH2 - PH_10, //D126 - 1:TIM5_CH1 - PH_11, //D127 - 1:TIM5_CH2 - PH_12, //D128 - 1:TIM5_CH3 - PH_13, //D129 - PH_14, //D130 - PH_15, //D131 - PI_0, //D132 - 1:TIM5_CH4 / SPI2_NSS - PI_1, //D133 - 1:SPI2_SCK - PI_2, //D134 - 1:TIM8_CH4 /SPI2_MISO - PI_3, //D135 - 1:SPI2_MOS - PI_4, //D136 - PI_5, //D137 - 1:TIM8_CH1 - PI_6, //D138 - 1:TIM8_CH2 - PI_7, //D139 - 1:TIM8_CH3 -#endif -}; - -#ifdef __cplusplus -} -#endif - -// ------------------------ - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * @brief System Clock Configuration - * @param None - * @retval None - */ -WEAK void SystemClock_Config() { - - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; - - /**Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 8; - RCC_OscInitStruct.PLL.PLLN = 336; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 7; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } - - /**Configure the Systick interrupt time - */ - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); - - /**Configure the Systick - */ - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); -} - -#ifdef __cplusplus -} -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.h b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.h deleted file mode 100644 index ecc319f47c..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ - -#ifdef STM32F405RX - #define STM32F4X_PIN_NUM 64 //64 pins mcu, 51 gpio - #define STM32F4X_GPIO_NUM 51 - #define STM32F4X_ADC_NUM 16 -#elif defined(STM32F407_5VX) - #define STM32F4X_PIN_NUM 100 //100 pins mcu, 82 gpio - #define STM32F4X_GPIO_NUM 82 - #define STM32F4X_ADC_NUM 16 -#elif defined(STM32F407_5ZX) - #define STM32F4X_PIN_NUM 144 //144 pins mcu, 114 gpio - #define STM32F4X_GPIO_NUM 114 - #define STM32F4X_ADC_NUM 24 -#elif defined(STM32F407IX) - #define STM32F4X_PIN_NUM 176 //176 pins mcu, 140 gpio - #define STM32F4X_GPIO_NUM 140 - #define STM32F4X_ADC_NUM 24 -#else - #error "no match MCU defined" -#endif - -#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio - #define PC13 0 - #define PC14 1 //OSC32_IN - #define PC15 2 //OSC32_OUT - #define PH0 3 //OSC_IN - #define PH1 4 //OSC_OUT - #define PB2 5 //BOOT1 - #define PB10 6 //1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 - #define PB11 7 //1:I2C2_SDA / USART3_RX / TIM2_CH4 - #define PB12 8 //1:SPI2_NSS / OTG_HS_ID - #define PB13 9 //1:SPI2_SCK 2:OTG_HS_VBUS - #define PB14 10 //1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM - #define PB15 11 //SPI2_MOSI / TIM12_CH2 / OTG_HS_DP - #define PC6 12 //1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 - #define PC7 13 //1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 - #define PC8 14 //1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 - #define PC9 15 //1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 - #define PA8 16 //1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF - #define PA9 17 //1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS - #define PA10 18 //1:USART1_RX / TIM1_CH3 / OTG_FS_ID - #define PA11 19 //1:TIM1_CH4 / OTG_FS_DM - #define PA12 20 //1:OTG_FS_DP - #define PA13 21 //0:JTMS-SWDIO - #define PA14 22 //0:JTCK-SWCLK - #define PA15 23 //0:JTDI 1:SPI3_NSS / SPI1_NSS - #define PC10 24 //1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX - #define PC11 25 //1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX - #define PC12 26 //1:UART5_TX / SPI3_MOSI / SDIO_CK - #define PD2 27 //1:UART5_RX / SDIO_CMD - #define PB3 28 //0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK - #define PB4 29 //0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO - #define PB5 30 //1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI - #define PB6 31 //1:I2C1_SCL / TIM4_CH1 / USART1_TX - #define PB7 32 //1:I2C1_SDA / TIM4_CH2 / USART1_RX - #define PB8 33 //1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 - #define PB9 34 //1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS - #define PA0 35 //1:UART4_TX / TIM5_CH1 2:ADC123_IN0 - #define PA1 36 //1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 - #define PA2 37 //1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 - #define PA3 38 //1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 - #define PA4 39 //NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 - #define PA5 40 //NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 - #define PA6 41 //1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 - #define PA7 42 //1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 - #define PB0 43 //1:TIM3_CH3 2:ADC12_IN8 - #define PB1 44 //1:TIM3_CH4 2:ADC12_IN9 - #define PC0 45 //1: 2:ADC123_IN10 - #define PC1 46 //1: 2:ADC123_IN11 - #define PC2 47 //1:SPI2_MISO 2:ADC123_IN12 - #define PC3 48 //1:SPI2_MOSI 2:ADC123_IN13 - #define PC4 49 //1: 2:ADC12_IN14 - #define PC5 50 //1: 2:ADC12_IN15 - #if STM32F4X_PIN_NUM >= 144 - #define PF3 51 //1:FSMC_A3 2:ADC3_IN9 - #define PF4 52 //1:FSMC_A4 2:ADC3_IN14 - #define PF5 53 //1:FSMC_A5 2:ADC3_IN15 - #define PF6 54 //1:TIM10_CH1 2:ADC3_IN4 - #define PF7 55 //1:TIM11_CH1 2:ADC3_IN5 - #define PF8 56 //1:TIM13_CH1 2:ADC3_IN6 - #define PF9 57 //1;TIM14_CH1 2:ADC3_IN7 - #define PF10 58 //2:ADC3_IN8 - #endif -#endif -#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio - #define PE2 (35+STM32F4X_ADC_NUM) //1:FSMC_A23 - #define PE3 (36+STM32F4X_ADC_NUM) //1:FSMC_A19 - #define PE4 (37+STM32F4X_ADC_NUM) //1:FSMC_A20 - #define PE5 (38+STM32F4X_ADC_NUM) //1:FSMC_A21 - #define PE6 (39+STM32F4X_ADC_NUM) //1:FSMC_A22 - #define PE7 (40+STM32F4X_ADC_NUM) //1:FSMC_D4 - #define PE8 (41+STM32F4X_ADC_NUM) //1:FSMC_D5 - #define PE9 (42+STM32F4X_ADC_NUM) //1:FSMC_D6 / TIM1_CH1 - #define PE10 (43+STM32F4X_ADC_NUM) //1:FSMC_D7 - #define PE11 (44+STM32F4X_ADC_NUM) //1:FSMC_D8 / TIM1_CH2 - #define PE12 (45+STM32F4X_ADC_NUM) //1:FSMC_D9 - #define PE13 (46+STM32F4X_ADC_NUM) //1:FSMC_D10 / TIM1_CH3 - #define PE14 (47+STM32F4X_ADC_NUM) //1:FSMC_D11 / TIM1_CH4 - #define PE15 (48+STM32F4X_ADC_NUM) //1:FSMC_D12 - #define PD8 (49+STM32F4X_ADC_NUM) //1:FSMC_D13 / USART3_TX - #define PD9 (50+STM32F4X_ADC_NUM) //1:FSMC_D14 / USART3_RX - #define PD10 (51+STM32F4X_ADC_NUM) //1:FSMC_D15 - #define PD11 (52+STM32F4X_ADC_NUM) //1:FSMC_A16 - #define PD12 (53+STM32F4X_ADC_NUM) //1:FSMC_A17 / TIM4_CH1 - #define PD13 (54+STM32F4X_ADC_NUM) //1:FSMC_A18 / TIM4_CH2 - #define PD14 (55+STM32F4X_ADC_NUM) //1:FSMC_D0 / TIM4_CH3 - #define PD15 (56+STM32F4X_ADC_NUM) //1:FSMC_D1 / TIM4_CH4 - #define PD0 (57+STM32F4X_ADC_NUM) //1:FSMC_D2 - #define PD1 (58+STM32F4X_ADC_NUM) //1:FSMC_D3 - #define PD3 (59+STM32F4X_ADC_NUM) //1:FSMC_CLK - #define PD4 (60+STM32F4X_ADC_NUM) //1:FSMC_NOE - #define PD5 (61+STM32F4X_ADC_NUM) //1:USART2_TX - #define PD6 (62+STM32F4X_ADC_NUM) //1:USART2_RX - #define PD7 (63+STM32F4X_ADC_NUM) - #define PE0 (64+STM32F4X_ADC_NUM) - #define PE1 (65+STM32F4X_ADC_NUM) -#endif -#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - #define PF0 (66+STM32F4X_ADC_NUM) //1:FSMC_A0 / I2C2_SDA - #define PF1 (67+STM32F4X_ADC_NUM) //1:FSMC_A1 / I2C2_SCL - #define PF2 (68+STM32F4X_ADC_NUM) //1:FSMC_A2 - #define PF11 (69+STM32F4X_ADC_NUM) - #define PF12 (70+STM32F4X_ADC_NUM) //1:FSMC_A6 - #define PF13 (71+STM32F4X_ADC_NUM) //1:FSMC_A7 - #define PF14 (72+STM32F4X_ADC_NUM) //1:FSMC_A8 - #define PF15 (73+STM32F4X_ADC_NUM) //1:FSMC_A9 - #define PG0 (74+STM32F4X_ADC_NUM) //1:FSMC_A10 - #define PG1 (75+STM32F4X_ADC_NUM) //1:FSMC_A11 - #define PG2 (76+STM32F4X_ADC_NUM) //1:FSMC_A12 - #define PG3 (77+STM32F4X_ADC_NUM) //1:FSMC_A13 - #define PG4 (78+STM32F4X_ADC_NUM) //1:FSMC_A14 - #define PG5 (79+STM32F4X_ADC_NUM) //1:FSMC_A15 - #define PG6 (80+STM32F4X_ADC_NUM) - #define PG7 (81+STM32F4X_ADC_NUM) - #define PG8 (82+STM32F4X_ADC_NUM) - #define PG9 (83+STM32F4X_ADC_NUM) //1:USART6_RX - #define PG10 (84+STM32F4X_ADC_NUM) //1:FSMC_NE3 - #define PG11 (85+STM32F4X_ADC_NUM) - #define PG12 (86+STM32F4X_ADC_NUM) //1:FSMC_NE4 - #define PG13 (87+STM32F4X_ADC_NUM) //1:FSMC_A24 - #define PG14 (88+STM32F4X_ADC_NUM) //1:FSMC_A25 / USART6_TX - #define PG15 (89+STM32F4X_ADC_NUM) -#endif -#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio - #define PI8 (90+STM32F4X_ADC_NUM) - #define PI9 (91+STM32F4X_ADC_NUM) - #define PI10 (92+STM32F4X_ADC_NUM) - #define PI11 (93+STM32F4X_ADC_NUM) - #define PH2 (94+STM32F4X_ADC_NUM) - #define PH3 (95+STM32F4X_ADC_NUM) - #define PH4 (96+STM32F4X_ADC_NUM) //1:I2C2_SCL - #define PH5 (97+STM32F4X_ADC_NUM) //1:I2C2_SDA - #define PH6 (98+STM32F4X_ADC_NUM) //1:TIM12_CH1 - #define PH7 (99+STM32F4X_ADC_NUM) //1:I2C3_SCL - #define PH8 (100+STM32F4X_ADC_NUM) //1:I2C3_SDA - #define PH9 (101+STM32F4X_ADC_NUM) //1:TIM12_CH2 - #define PH10 (102+STM32F4X_ADC_NUM) //1:TIM5_CH1 - #define PH11 (103+STM32F4X_ADC_NUM) //1:TIM5_CH2 - #define PH12 (104+STM32F4X_ADC_NUM) //1:TIM5_CH3 - #define PH13 (105+STM32F4X_ADC_NUM) - #define PH14 (106+STM32F4X_ADC_NUM) - #define PH15 (107+STM32F4X_ADC_NUM) - #define PI0 (108+STM32F4X_ADC_NUM) //1:TIM5_CH4 / SPI2_NSS - #define PI1 (109+STM32F4X_ADC_NUM) //1:SPI2_SCK - #define PI2 (110+STM32F4X_ADC_NUM) //1:TIM8_CH4 /SPI2_MISO - #define PI3 (111+STM32F4X_ADC_NUM) //1:SPI2_MOS - #define PI4 (112+STM32F4X_ADC_NUM) - #define PI5 (113+STM32F4X_ADC_NUM) //1:TIM8_CH1 - #define PI6 (114+STM32F4X_ADC_NUM) //1:TIM8_CH2 - #define PI7 (115+STM32F4X_ADC_NUM) //1:TIM8_CH3 -#endif - -// This must be a literal -#define NUM_DIGITAL_PINS (STM32F4X_GPIO_NUM) -// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS (STM32F4X_ADC_NUM) -#define NUM_ANALOG_FIRST 35 - -// Below ADC, DAC and PWM definitions already done in the core -// Could be redefined here if needed -// ADC resolution is 12bits -//#define ADC_RESOLUTION 12 -//#define DACC_RESOLUTION 12 - -// PWM resolution -/* - * BEWARE: - * Changing this value from the default (1000) will affect the PWM output value of analogWrite (to a PWM pin) - * Since the pin is toggled on capture, if you change the frequency of the timer you have to adapt the compare value (analogWrite thinks you did) - */ -//#define PWM_FREQUENCY 20000 -//The bottom values are the default and don't need to be redefined -//#define PWM_RESOLUTION 8 -//#define PWM_MAX_DUTY_CYCLE 255 - -// Below SPI and I2C definitions already done in the core -// Could be redefined here if differs from the default one -// SPI Definitions -#define PIN_SPI_MOSI PB15 -#define PIN_SPI_MISO PB14 -#define PIN_SPI_SCK PB13 -#define PIN_SPI_SS PB12 - -// I2C Definitions -#define PIN_WIRE_SDA PB7 -#define PIN_WIRE_SCL PB6 - -// Timer Definitions -//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c -#define TIMER_TONE TIM7 -#define TIMER_SERVO TIM5 -#define TIMER_SERIAL TIM2 - -// UART Definitions -// Define here Serial instance number to map on Serial generic name -#define SERIAL_UART_INSTANCE 1 //ex: 2 for Serial2 (USART2) -// DEBUG_UART could be redefined to print on another instance than 'Serial' -//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 -// DEBUG_UART baudrate, default: 9600 if not defined -//#define DEBUG_UART_BAUDRATE x -// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART -//#define DEBUG_PINNAME_TX PX_n // PinName used for TX - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#define PIN_SERIAL_RX PA10 -#define PIN_SERIAL_TX PA9 - -#ifdef __cplusplus -} // extern "C" -#endif -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_HARDWARE Serial1 -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c deleted file mode 100644 index db0a439562..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c +++ /dev/null @@ -1,380 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - * Automatically generated from STM32F407Z(E-G)Tx.xml - */ -#include -#include - -/* ===== - * Note: Commented lines are alternative possibilities which are not used by default. - * If you change them, you should know what you're doing first. - * ===== - */ - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 E0_DIR - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 BLTOUCH_2 - {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 BLTOUCH_4 - {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 E1_EN - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS - {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK - {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED - {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 HEATER2 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 HEATER0 - {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 Z_EN - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 EXP_14 - {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 Z_DIR - {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 E0_EN - {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 EXP_8 - {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 EXP_7 - - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC - {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 - {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 TH_1 - {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 TH_2 - {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 - {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 - {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 EXP_3 - {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 EXP_6 - {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 EXP_5 - #endif - {NC, NP, 0} -}; -#endif - -//*** DAC *** - -#ifdef HAL_DAC_MODULE_ENABLED -const PinMap PinMap_DAC[] = { - {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - {NC, NP, 0} -}; -#endif - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SDA[] = { - {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio - #if STM32F4X_PIN_NUM >= 176 - {PH_5, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PH_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - #else - {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - #endif - #endif - {NC, NP, 0} -}; -#endif - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SCL[] = { - {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio - #if STM32F4X_PIN_NUM >= 176 - //{PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PH_4, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PH_7, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - #else - {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - #endif - #endif - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -const PinMap PinMap_PWM[] = { - - // Some pins can perform PWM from more than one timer. These were selected to utilize as many channels as - // possible from timers which were already dedicated to PWM output. - // TIM1 = [FAN4, FAN5, HEATER6, FAN7] - // TIM2 = [, HEATER1, BED, ] - // TIM3 = [, , HEATER2, HEATER0] - // TIM4 = [HEATER5, HEATER4, , HEATER3] - // TIM8 = [FAN3, HEATER7, FAN2, FAN6] - // TIM9 = [FAN0, FAN1, , ] - - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 HEATER0 - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 HEATER1 - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 HEATER2 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 HEATER3 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 HEATER4 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 HEATER5 - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 HEATER6 - {PI_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 HEATER7 - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BED - - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN0 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 FAN1 - {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 FAN2 - {PI_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 FAN3 - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 FAN4 - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 FAN5 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 FAN6 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 FAN7 - - - // Alternate timer assignments for pins commonly using PWM - //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N HEATER0 - //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N HEATER0 - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 HEATER1 - //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N HEATER2 - //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N HEATER2 - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 BED - //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 BED - //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 FAN2 - //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 FAN6 - - // Pins with an available timer channel, on a timer already allocated for PWM. - // These can be freely used for purposes requiring PWM, without creating new timer conflicts. - // This pins are very likely already used for other purposes and enabling PWM on them won't be useful. - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 BLTouch / Probe Output - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 ESP8266 connector. Available if 8266 isn't used - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 ESP8266 connector. Available if 8266 isn't used - - /* - * Pins not utilizing hardware PWM on the GTR. - * Uncomment the corresponding line if you want to have HardwarePWM on some pins. - * WARNING: check timers' usage first to avoid conflicts. - * If you don't know what you're doing leave things as they are or you WILL break something (including hardware) - */ - //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - //{PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - //{PH_6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_TX[] = { - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {NC, NP, 0} -}; - -const PinMap PinMap_UART_RX[] = { - {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - //{PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; - -const PinMap PinMap_UART_RTS[] = { - //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; - -const PinMap PinMap_UART_CTS[] = { - //{PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MOSI[] = { - //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; -#endif - -//*** CAN *** - -#ifdef HAL_CAN_MODULE_ENABLED -#error "CAN bus isn't available on this board. Driver should be disabled." -#endif - -//*** ETHERNET *** -#ifdef HAL_ETH_MODULE_ENABLED -#error "Ethernet port isn't available on this board. Driver should be disabled." -#endif - -//*** No QUADSPI *** - -//*** USB *** -#ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_FS[] = { - //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF used by LCD - //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS available on wifi port, if empty - //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID available on UART1_RX if not used - {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM - {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP - {NC, NP, 0} -}; - -const PinMap PinMap_USB_OTG_HS[] = { /* - #ifdef USE_USB_HS_IN_FS - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM - {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP - #else - #error "USB in HS mode isn't supported by the board" - {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 - {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 - {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 - {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 - {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 - {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP - {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR - {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT - #endif // USE_USB_HS_IN_FS - */ - {NC, NP, 0} -}; -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PinNamesVar.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PinNamesVar.h deleted file mode 100644 index b4bb9d45f8..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PinNamesVar.h +++ /dev/null @@ -1,50 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_OTG_FS_SOF = PA_8, - USB_OTG_FS_VBUS = PA_9, - USB_OTG_FS_ID = PA_10, - USB_OTG_FS_DM = PA_11, - USB_OTG_FS_DP = PA_12, - USB_OTG_HS_ULPI_D0 = PA_3, - USB_OTG_HS_SOF = PA_4, - USB_OTG_HS_ULPI_CK = PA_5, - USB_OTG_HS_ULPI_D1 = PB_0, - USB_OTG_HS_ULPI_D2 = PB_1, - USB_OTG_HS_ULPI_D7 = PB_5, - USB_OTG_HS_ULPI_D3 = PB_10, - USB_OTG_HS_ULPI_D4 = PB_11, - USB_OTG_HS_ID = PB_12, - USB_OTG_HS_ULPI_D5 = PB_12, - USB_OTG_HS_ULPI_D6 = PB_13, - USB_OTG_HS_VBUS = PB_13, - USB_OTG_HS_DM = PB_14, - USB_OTG_HS_DP = PB_15, - USB_OTG_HS_ULPI_STP = PC_0, - USB_OTG_HS_ULPI_DIR = PC_2, - USB_OTG_HS_ULPI_NXT = PC_3, -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h deleted file mode 100644 index e0e8239aac..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#define HAL_MODULE_ENABLED -#define HAL_ADC_MODULE_ENABLED -#define HAL_CRC_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -//#define HAL_RTC_MODULE_ENABLED Real Time Clock...do we use it? -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -#define HAL_USART_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -//#define HAL_UART_MODULE_ENABLED // by default -//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) - -#undef HAL_SD_MODULE_ENABLED -#undef HAL_DAC_MODULE_ENABLED -#undef HAL_FLASH_MODULE_ENABLED -#undef HAL_CAN_MODULE_ENABLED -#undef HAL_CAN_LEGACY_MODULE_ENABLED -#undef HAL_CEC_MODULE_ENABLED -#undef HAL_CRYP_MODULE_ENABLED -#undef HAL_DCMI_MODULE_ENABLED -#undef HAL_DMA2D_MODULE_ENABLED -#undef HAL_ETH_MODULE_ENABLED -#undef HAL_NAND_MODULE_ENABLED -#undef HAL_NOR_MODULE_ENABLED -#undef HAL_PCCARD_MODULE_ENABLED -#undef HAL_SRAM_MODULE_ENABLED -#undef HAL_SDRAM_MODULE_ENABLED -#undef HAL_HASH_MODULE_ENABLED -#undef HAL_EXTI_MODULE_ENABLED -#undef HAL_SMBUS_MODULE_ENABLED -#undef HAL_I2S_MODULE_ENABLED -#undef HAL_IWDG_MODULE_ENABLED -#undef HAL_LTDC_MODULE_ENABLED -#undef HAL_DSI_MODULE_ENABLED -#undef HAL_QSPI_MODULE_ENABLED -#undef HAL_RNG_MODULE_ENABLED -#undef HAL_SAI_MODULE_ENABLED -#undef HAL_IRDA_MODULE_ENABLED -#undef HAL_SMARTCARD_MODULE_ENABLED -#undef HAL_WWDG_MODULE_ENABLED -#undef HAL_HCD_MODULE_ENABLED -#undef HAL_FMPI2C_MODULE_ENABLED -#undef HAL_SPDIFRX_MODULE_ENABLED -#undef HAL_DFSDM_MODULE_ENABLED -#undef HAL_LPTIM_MODULE_ENABLED -#undef HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/ldscript.ld b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/ldscript.ld deleted file mode 100644 index 0c060d1751..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/ldscript.ld +++ /dev/null @@ -1,204 +0,0 @@ -/* -***************************************************************************** -** - -** File : LinkerScript.ld -** -** Abstract : Linker script for STM32F407ZGTx Device with -** 1024KByte FLASH, 128KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2014 Ac6

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of Ac6 nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200;; /* required amount of heap */ -_Min_Stack_Size = 0x400;; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 1024K -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text ALIGN(4): - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata ALIGN(4): - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCMRAM AT> FLASH - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.cpp b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.cpp deleted file mode 100644 index 1486b21830..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Pin number -// This array allows to wrap Arduino pin number(Dx or x) -// to STM32 PinName (PX_n) -const PinName digitalPin[] = { -#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio - PC_13, //D0 - PC_14, //D1 - OSC32_IN - PC_15, //D2 - OSC32_OUT - PH_0, //D3 - OSC_IN - PH_1, //D4 - OSC_OUT - PB_2, //D5 - BOOT1 - PB_10, //D6 - 1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 - PB_11, //D7 - 1:I2C2_SDA / USART3_RX / TIM2_CH4 - PB_12, //D8 - 1:SPI2_NSS / OTG_HS_ID - PB_13, //D9 - 1:SPI2_SCK 2:OTG_HS_VBUS - PB_14, //D10 - 1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM - PB_15, //D11 - SPI2_MOSI / TIM12_CH2 / OTG_HS_DP - PC_6, //D12 - 1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 - PC_7, //D13 - 1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 - PC_8, //D14 - 1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 - PC_9, //D15 - 1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 - PA_8, //D16 - 1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF - PA_9, //D17 - 1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS - PA_10, //D18 - 1:USART1_RX / TIM1_CH3 / OTG_FS_ID - PA_11, //D19 - 1:TIM1_CH4 / OTG_FS_DM - PA_12, //D20 - 1:OTG_FS_DP - PA_13, //D21 - 0:JTMS-SWDIO - PA_14, //D22 - 0:JTCK-SWCLK - PA_15, //D23 - 0:JTDI 1:SPI3_NSS / SPI1_NSS - PC_10, //D24 - 1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX - PC_11, //D25 - 1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX - PC_12, //D26 - 1:UART5_TX / SPI3_MOSI / SDIO_CK - PD_2, //D27 - 1:UART5_RX / SDIO_CMD - PB_3, //D28 - 0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK - PB_4, //D29 - 0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO - PB_5, //D30 - 1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI - PB_6, //D31 - 1:I2C1_SCL / TIM4_CH1 / USART1_TX - PB_7, //D32 - 1:I2C1_SDA / TIM4_CH2 / USART1_RX - PB_8, //D33 - 1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 - PB_9, //D34 - 1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS - PA_0, //D35/A0 - 1:UART4_TX / TIM5_CH1 2:ADC123_IN0 - PA_1, //D36/A1 - 1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 - PA_2, //D37/A2 - 1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 - PA_3, //D38/A3 - 1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 - PA_4, //D39/A4 - NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 - PA_5, //D40/A5 - NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 - PA_6, //D41/A6 - 1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 - PA_7, //D42/A7 - 1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 - PB_0, //D43/A8 - 1:TIM3_CH3 2:ADC12_IN8 - PB_1, //D44/A9 - 1:TIM3_CH4 2:ADC12_IN9 - PC_0, //D45/A10 - 1: 2:ADC123_IN10 - PC_1, //D46/A11 - 1: 2:ADC123_IN11 - PC_2, //D47/A12 - 1:SPI2_MISO 2:ADC123_IN12 - PC_3, //D48/A13 - 1:SPI2_MOSI 2:ADC123_IN13 - PC_4, //D49/A14 - 1: 2:ADC12_IN14 - PC_5, //D50/A15 - 1: 2:ADC12_IN15 - #if STM32F4X_PIN_NUM >= 144 - PF_3, //D51/A16 - 1:FSMC_A3 2:ADC3_IN9 - PF_4, //D52/A17 - 1:FSMC_A4 2:ADC3_IN14 - PF_5, //D53/A18 - 1:FSMC_A5 2:ADC3_IN15 - PF_6, //D54/A19 - 1:TIM10_CH1 2:ADC3_IN4 - PF_7, //D55/A20 - 1:TIM11_CH1 2:ADC3_IN5 - PF_8, //D56/A21 - 1:TIM13_CH1 2:ADC3_IN6 - PF_9, //D57/A22 - 1;TIM14_CH1 2:ADC3_IN7 - PF_10, //D58/A23 - 2:ADC3_IN8 - #endif -#endif -#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio - PE_2, //D59 - 1:FSMC_A23 - PE_3, //D60 - 1:FSMC_A19 - PE_4, //D61 - 1:FSMC_A20 - PE_5, //D62 - 1:FSMC_A21 - PE_6, //D63 - 1:FSMC_A22 - PE_7, //D64 - 1:FSMC_D4 - PE_8, //D65 - 1:FSMC_D5 - PE_9, //D66 - 1:FSMC_D6 / TIM1_CH1 - PE_10, //D67 - 1:FSMC_D7 - PE_11, //D68 - 1:FSMC_D8 / TIM1_CH2 - PE_12, //D69 - 1:FSMC_D9 - PE_13, //D70 - 1:FSMC_D10 / TIM1_CH3 - PE_14, //D71 - 1:FSMC_D11 / TIM1_CH4 - PE_15, //D72 - 1:FSMC_D12 - PD_8, //D73 - 1:FSMC_D13 / USART3_TX - PD_9, //D74 - 1:FSMC_D14 / USART3_RX - PD_10, //D75 - 1:FSMC_D15 - PD_11, //D76 - 1:FSMC_A16 - PD_12, //D77 - 1:FSMC_A17 / TIM4_CH1 - PD_13, //D78 - 1:FSMC_A18 / TIM4_CH2 - PD_14, //D79 - 1:FSMC_D0 / TIM4_CH3 - PD_15, //D80 - 1:FSMC_D1 / TIM4_CH4 - PD_0, //D81 - 1:FSMC_D2 - PD_1, //D82 - 1:FSMC_D3 - PD_3, //D83 - 1:FSMC_CLK - PD_4, //D84 - 1:FSMC_NOE - PD_5, //D85 - 1:USART2_TX - PD_6, //D86 - 1:USART2_RX - PD_7, //D87 - PE_0, //D88 - PE_1, //D89 -#endif -#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - PF_0, //D90 - 1:FSMC_A0 / I2C2_SDA - PF_1, //D91 - 1:FSMC_A1 / I2C2_SCL - PF_2, //D92 - 1:FSMC_A2 - PF_11, //D93 - PF_12, //D94 - 1:FSMC_A6 - PF_13, //D95 - 1:FSMC_A7 - PF_14, //D96 - 1:FSMC_A8 - PF_15, //D97 - 1:FSMC_A9 - PG_0, //D98 - 1:FSMC_A10 - PG_1, //D99 - 1:FSMC_A11 - PG_2, //D100 - 1:FSMC_A12 - PG_3, //D101 - 1:FSMC_A13 - PG_4, //D102 - 1:FSMC_A14 - PG_5, //D103 - 1:FSMC_A15 - PG_6, //D104 - PG_7, //D105 - PG_8, //D106 - PG_9, //D107 - 1:USART6_RX - PG_10, //D108 - 1:FSMC_NE3 - PG_11, //D109 - PG_12, //D110 - 1:FSMC_NE4 - PG_13, //D111 - 1:FSMC_A24 - PG_14, //D112 - 1:FSMC_A25 / USART6_TX - PG_15, //D113 -#endif -#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio - PI_8, //D114 - PI_9, //D115 - PI_10, //D116 - PI_11, //D117 - PH_2, //D118 - PH_3, //D119 - PH_4, //D120 - 1:I2C2_SCL - PH_5, //D121 - 1:I2C2_SDA - PH_6, //D122 - 1:TIM12_CH1 - PH_7, //D123 - 1:I2C3_SCL - PH_8, //D124 - 1:I2C3_SDA - PH_9, //D125 - 1:TIM12_CH2 - PH_10, //D126 - 1:TIM5_CH1 - PH_11, //D127 - 1:TIM5_CH2 - PH_12, //D128 - 1:TIM5_CH3 - PH_13, //D129 - PH_14, //D130 - PH_15, //D131 - PI_0, //D132 - 1:TIM5_CH4 / SPI2_NSS - PI_1, //D133 - 1:SPI2_SCK - PI_2, //D134 - 1:TIM8_CH4 /SPI2_MISO - PI_3, //D135 - 1:SPI2_MOS - PI_4, //D136 - PI_5, //D137 - 1:TIM8_CH1 - PI_6, //D138 - 1:TIM8_CH2 - PI_7, //D139 - 1:TIM8_CH3 -#endif -}; - -#ifdef __cplusplus -} -#endif - -// ------------------------ - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * @brief System Clock Configuration - * @param None - * @retval None - */ -WEAK void SystemClock_Config() { - - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; - - /**Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 8; - RCC_OscInitStruct.PLL.PLLN = 336; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 7; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } - - /**Configure the Systick interrupt time - */ - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); - - /**Configure the Systick - */ - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); -} - -#ifdef __cplusplus -} -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h deleted file mode 100644 index 2da195c6cf..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h +++ /dev/null @@ -1,322 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ - -#ifdef STM32F405RX - #define STM32F4X_PIN_NUM 64 //64 pins mcu, 51 gpio - #define STM32F4X_GPIO_NUM 51 - #define STM32F4X_ADC_NUM 16 -#elif defined(STM32F407_5VX) - #define STM32F4X_PIN_NUM 100 //100 pins mcu, 82 gpio - #define STM32F4X_GPIO_NUM 82 - #define STM32F4X_ADC_NUM 16 -#elif defined(STM32F407_5ZX) - #define STM32F4X_PIN_NUM 144 //144 pins mcu, 114 gpio - #define STM32F4X_GPIO_NUM 114 - #define STM32F4X_ADC_NUM 24 -#elif defined(STM32F407IX) - #define STM32F4X_PIN_NUM 176 //176 pins mcu, 140 gpio - #define STM32F4X_GPIO_NUM 140 - #define STM32F4X_ADC_NUM 24 -#else - #error "no match MCU defined" -#endif - -#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio - #define PC13 0 - #define PC14 1 //OSC32_IN - #define PC15 2 //OSC32_OUT - #define PH0 3 //OSC_IN - #define PH1 4 //OSC_OUT - #define PB2 5 //BOOT1 - #define PB10 6 //1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 - #define PB11 7 //1:I2C2_SDA / USART3_RX / TIM2_CH4 - #define PB12 8 //1:SPI2_NSS / OTG_HS_ID - #define PB13 9 //1:SPI2_SCK 2:OTG_HS_VBUS - #define PB14 10 //1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM - #define PB15 11 //SPI2_MOSI / TIM12_CH2 / OTG_HS_DP - #define PC6 12 //1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 - #define PC7 13 //1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 - #define PC8 14 //1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 - #define PC9 15 //1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 - #define PA8 16 //1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF - #define PA9 17 //1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS - #define PA10 18 //1:USART1_RX / TIM1_CH3 / OTG_FS_ID - #define PA11 19 //1:TIM1_CH4 / OTG_FS_DM - #define PA12 20 //1:OTG_FS_DP - #define PA13 21 //0:JTMS-SWDIO - #define PA14 22 //0:JTCK-SWCLK - #define PA15 23 //0:JTDI 1:SPI3_NSS / SPI1_NSS - #define PC10 24 //1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX - #define PC11 25 //1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX - #define PC12 26 //1:UART5_TX / SPI3_MOSI / SDIO_CK - #define PD2 27 //1:UART5_RX / SDIO_CMD - #define PB3 28 //0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK - #define PB4 29 //0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO - #define PB5 30 //1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI - #define PB6 31 //1:I2C1_SCL / TIM4_CH1 / USART1_TX - #define PB7 32 //1:I2C1_SDA / TIM4_CH2 / USART1_RX - #define PB8 33 //1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 - #define PB9 34 //1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS - #define PA0 35 //1:UART4_TX / TIM5_CH1 2:ADC123_IN0 - #define PA1 36 //1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 - #define PA2 37 //1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 - #define PA3 38 //1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 - #define PA4 39 //NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 - #define PA5 40 //NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 - #define PA6 41 //1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 - #define PA7 42 //1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 - #define PB0 43 //1:TIM3_CH3 2:ADC12_IN8 - #define PB1 44 //1:TIM3_CH4 2:ADC12_IN9 - #define PC0 45 //1: 2:ADC123_IN10 - #define PC1 46 //1: 2:ADC123_IN11 - #define PC2 47 //1:SPI2_MISO 2:ADC123_IN12 - #define PC3 48 //1:SPI2_MOSI 2:ADC123_IN13 - #define PC4 49 //1: 2:ADC12_IN14 - #define PC5 50 //1: 2:ADC12_IN15 - #if STM32F4X_PIN_NUM >= 144 - #define PF3 51 //1:FSMC_A3 2:ADC3_IN9 - #define PF4 52 //1:FSMC_A4 2:ADC3_IN14 - #define PF5 53 //1:FSMC_A5 2:ADC3_IN15 - #define PF6 54 //1:TIM10_CH1 2:ADC3_IN4 - #define PF7 55 //1:TIM11_CH1 2:ADC3_IN5 - #define PF8 56 //1:TIM13_CH1 2:ADC3_IN6 - #define PF9 57 //1;TIM14_CH1 2:ADC3_IN7 - #define PF10 58 //2:ADC3_IN8 - #endif -#endif -#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio - #define PE2 (35+STM32F4X_ADC_NUM) //1:FSMC_A23 - #define PE3 (36+STM32F4X_ADC_NUM) //1:FSMC_A19 - #define PE4 (37+STM32F4X_ADC_NUM) //1:FSMC_A20 - #define PE5 (38+STM32F4X_ADC_NUM) //1:FSMC_A21 - #define PE6 (39+STM32F4X_ADC_NUM) //1:FSMC_A22 - #define PE7 (40+STM32F4X_ADC_NUM) //1:FSMC_D4 - #define PE8 (41+STM32F4X_ADC_NUM) //1:FSMC_D5 - #define PE9 (42+STM32F4X_ADC_NUM) //1:FSMC_D6 / TIM1_CH1 - #define PE10 (43+STM32F4X_ADC_NUM) //1:FSMC_D7 - #define PE11 (44+STM32F4X_ADC_NUM) //1:FSMC_D8 / TIM1_CH2 - #define PE12 (45+STM32F4X_ADC_NUM) //1:FSMC_D9 - #define PE13 (46+STM32F4X_ADC_NUM) //1:FSMC_D10 / TIM1_CH3 - #define PE14 (47+STM32F4X_ADC_NUM) //1:FSMC_D11 / TIM1_CH4 - #define PE15 (48+STM32F4X_ADC_NUM) //1:FSMC_D12 - #define PD8 (49+STM32F4X_ADC_NUM) //1:FSMC_D13 / USART3_TX - #define PD9 (50+STM32F4X_ADC_NUM) //1:FSMC_D14 / USART3_RX - #define PD10 (51+STM32F4X_ADC_NUM) //1:FSMC_D15 - #define PD11 (52+STM32F4X_ADC_NUM) //1:FSMC_A16 - #define PD12 (53+STM32F4X_ADC_NUM) //1:FSMC_A17 / TIM4_CH1 - #define PD13 (54+STM32F4X_ADC_NUM) //1:FSMC_A18 / TIM4_CH2 - #define PD14 (55+STM32F4X_ADC_NUM) //1:FSMC_D0 / TIM4_CH3 - #define PD15 (56+STM32F4X_ADC_NUM) //1:FSMC_D1 / TIM4_CH4 - #define PD0 (57+STM32F4X_ADC_NUM) //1:FSMC_D2 - #define PD1 (58+STM32F4X_ADC_NUM) //1:FSMC_D3 - #define PD3 (59+STM32F4X_ADC_NUM) //1:FSMC_CLK - #define PD4 (60+STM32F4X_ADC_NUM) //1:FSMC_NOE - #define PD5 (61+STM32F4X_ADC_NUM) //1:USART2_TX - #define PD6 (62+STM32F4X_ADC_NUM) //1:USART2_RX - #define PD7 (63+STM32F4X_ADC_NUM) - #define PE0 (64+STM32F4X_ADC_NUM) - #define PE1 (65+STM32F4X_ADC_NUM) -#endif -#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - #define PF0 (66+STM32F4X_ADC_NUM) //1:FSMC_A0 / I2C2_SDA - #define PF1 (67+STM32F4X_ADC_NUM) //1:FSMC_A1 / I2C2_SCL - #define PF2 (68+STM32F4X_ADC_NUM) //1:FSMC_A2 - #define PF11 (69+STM32F4X_ADC_NUM) - #define PF12 (70+STM32F4X_ADC_NUM) //1:FSMC_A6 - #define PF13 (71+STM32F4X_ADC_NUM) //1:FSMC_A7 - #define PF14 (72+STM32F4X_ADC_NUM) //1:FSMC_A8 - #define PF15 (73+STM32F4X_ADC_NUM) //1:FSMC_A9 - #define PG0 (74+STM32F4X_ADC_NUM) //1:FSMC_A10 - #define PG1 (75+STM32F4X_ADC_NUM) //1:FSMC_A11 - #define PG2 (76+STM32F4X_ADC_NUM) //1:FSMC_A12 - #define PG3 (77+STM32F4X_ADC_NUM) //1:FSMC_A13 - #define PG4 (78+STM32F4X_ADC_NUM) //1:FSMC_A14 - #define PG5 (79+STM32F4X_ADC_NUM) //1:FSMC_A15 - #define PG6 (80+STM32F4X_ADC_NUM) - #define PG7 (81+STM32F4X_ADC_NUM) - #define PG8 (82+STM32F4X_ADC_NUM) - #define PG9 (83+STM32F4X_ADC_NUM) //1:USART6_RX - #define PG10 (84+STM32F4X_ADC_NUM) //1:FSMC_NE3 - #define PG11 (85+STM32F4X_ADC_NUM) - #define PG12 (86+STM32F4X_ADC_NUM) //1:FSMC_NE4 - #define PG13 (87+STM32F4X_ADC_NUM) //1:FSMC_A24 - #define PG14 (88+STM32F4X_ADC_NUM) //1:FSMC_A25 / USART6_TX - #define PG15 (89+STM32F4X_ADC_NUM) -#endif -#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio - #define PI8 (90+STM32F4X_ADC_NUM) - #define PI9 (91+STM32F4X_ADC_NUM) - #define PI10 (92+STM32F4X_ADC_NUM) - #define PI11 (93+STM32F4X_ADC_NUM) - #define PH2 (94+STM32F4X_ADC_NUM) - #define PH3 (95+STM32F4X_ADC_NUM) - #define PH4 (96+STM32F4X_ADC_NUM) //1:I2C2_SCL - #define PH5 (97+STM32F4X_ADC_NUM) //1:I2C2_SDA - #define PH6 (98+STM32F4X_ADC_NUM) //1:TIM12_CH1 - #define PH7 (99+STM32F4X_ADC_NUM) //1:I2C3_SCL - #define PH8 (100+STM32F4X_ADC_NUM) //1:I2C3_SDA - #define PH9 (101+STM32F4X_ADC_NUM) //1:TIM12_CH2 - #define PH10 (102+STM32F4X_ADC_NUM) //1:TIM5_CH1 - #define PH11 (103+STM32F4X_ADC_NUM) //1:TIM5_CH2 - #define PH12 (104+STM32F4X_ADC_NUM) //1:TIM5_CH3 - #define PH13 (105+STM32F4X_ADC_NUM) - #define PH14 (106+STM32F4X_ADC_NUM) - #define PH15 (107+STM32F4X_ADC_NUM) - #define PI0 (108+STM32F4X_ADC_NUM) //1:TIM5_CH4 / SPI2_NSS - #define PI1 (109+STM32F4X_ADC_NUM) //1:SPI2_SCK - #define PI2 (110+STM32F4X_ADC_NUM) //1:TIM8_CH4 /SPI2_MISO - #define PI3 (111+STM32F4X_ADC_NUM) //1:SPI2_MOS - #define PI4 (112+STM32F4X_ADC_NUM) - #define PI5 (113+STM32F4X_ADC_NUM) //1:TIM8_CH1 - #define PI6 (114+STM32F4X_ADC_NUM) //1:TIM8_CH2 - #define PI7 (115+STM32F4X_ADC_NUM) //1:TIM8_CH3 -#endif - - -// This must be a literal -#define NUM_DIGITAL_PINS (STM32F4X_GPIO_NUM) -// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS (STM32F4X_ADC_NUM) -#define NUM_ANALOG_FIRST 35 - -// Below ADC, DAC and PWM definitions already done in the core -// Could be redefined here if needed -// ADC resolution is 12bits -//#define ADC_RESOLUTION 12 -//#define DACC_RESOLUTION 12 - -// PWM resolution -/* - * BEWARE: - * Changing this value from the default (1000) will affect the PWM output value of analogWrite (to a PWM pin) - * Since the pin is toggled on capture, if you change the frequency of the timer you have to adapt the compare value (analogWrite thinks you did) - */ -//#define PWM_FREQUENCY 20000 -//The bottom values are the default and don't need to be redefined -//#define PWM_RESOLUTION 8 -//#define PWM_MAX_DUTY_CYCLE 255 - -// On-board LED pin number -#define LED_BUILTIN PA7 -#define LED_GREEN LED_BUILTIN - -// Below SPI and I2C definitions already done in the core -// Could be redefined here if differs from the default one -// SPI Definitions -#define PIN_SPI_MOSI PB15 -#define PIN_SPI_MISO PB14 -#define PIN_SPI_SCK PB13 -#define PIN_SPI_SS PB12 - -// I2C Definitions -#if STM32F4X_PIN_NUM >= 176 - #define PIN_WIRE_SDA PH5 - #define PIN_WIRE_SCL PH4 -#else - #define PIN_WIRE_SDA PB7 - #define PIN_WIRE_SCL PB6 -#endif - -// Timer Definitions -//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c -#define TIMER_TONE TIM10 -#define TIMER_SERVO TIM5 -#define TIMER_SERIAL TIM7 - -// UART Definitions -//#define ENABLE_HWSERIAL1 done automatically by the #define SERIAL_UART_INSTANCE below -#define ENABLE_HWSERIAL3 -#define ENABLE_HWSERIAL6 - -// Define here Serial instance number to map on Serial generic name (if not already used by SerialUSB) -#define SERIAL_UART_INSTANCE 1 //1 for Serial = Serial1 (USART1) - -// DEBUG_UART could be redefined to print on another instance than 'Serial' -//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 -// DEBUG_UART baudrate, default: 9600 if not defined -//#define DEBUG_UART_BAUDRATE x -// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART -//#define DEBUG_PINNAME_TX PX_n // PinName used for TX - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#define PIN_SERIAL_RX PA10 -#define PIN_SERIAL_TX PA9 - -// Optional PIN_SERIALn_RX and PIN_SERIALn_TX where 'n' is the U(S)ART number -// Used when user instanciate a hardware Serial using its peripheral name. -// Example: HardwareSerial mySerial(USART3); -// will use PIN_SERIAL3_RX and PIN_SERIAL3_TX if defined. -#define PIN_SERIAL1_RX PA10 -#define PIN_SERIAL1_TX PA9 -#define PIN_SERIAL3_RX PD9 -#define PIN_SERIAL3_TX PD8 -#define PIN_SERIAL6_RX PC7 -#define PIN_SERIAL6_TX PC6 -//#define PIN_SERIALLP1_RX x // For LPUART1 RX -//#define PIN_SERIALLP1_TX x // For LPUART1 TX - -#ifdef __cplusplus -} // extern "C" -#endif -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_HARDWARE Serial1 -#define SERIAL_PORT_HARDWARE_OPEN Serial3 -#define SERIAL_PORT_HARDWARE_OPEN1 Serial6 -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c deleted file mode 100644 index 6dc8b05158..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c +++ /dev/null @@ -1,372 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - * Automatically generated from STM32F407Z(E-G)Tx.xml - */ -#include -#include - -/* ===== - * Note: Commented lines are alternative possibilities which are not used by default. - * If you change them, you should know what you're doing first. - * ===== - */ - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 E0_DIR - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 BLTOUCH_2 - {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 BLTOUCH_4 - {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 E1_EN - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS - {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK - {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED - {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 HEATER2 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 HEATER0 - {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 Z_EN - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 EXP_14 - {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 Z_DIR - {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 E0_EN - {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 EXP_8 - {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 EXP_7 - - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC - {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 - {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 TH_1 - {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 TH_2 - {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 - {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 - {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 EXP_3 - {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 EXP_6 - {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 EXP_5 - #endif - {NC, NP, 0} -}; -#endif - -//*** DAC *** - -#ifdef HAL_DAC_MODULE_ENABLED -const PinMap PinMap_DAC[] = { - {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - {NC, NP, 0} -}; -#endif - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SDA[] = { - {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio - #if STM32F4X_PIN_NUM >= 176 - {PH_5, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PH_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - #else - {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - #endif - #endif - {NC, NP, 0} -}; -#endif - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SCL[] = { - {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio - #if STM32F4X_PIN_NUM >= 176 - //{PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PH_4, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PH_7, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - #else - {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - #endif - #endif - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -const PinMap PinMap_PWM[] = { - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 HEATER0 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 HEATER1 - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 HEATER2 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 BED - {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 FAN0 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 FAN2 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 EXTENSION1-4 - {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 BL-TOUCH-SERVO - - // These pins have been defined for something else on the board but they MIGHT be - // used by the user as PWM pins if they aren't used for their primary purpose. - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 ESP8266 connector. Available if 8266 isn't used - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 ESP8266 connector. Available if 8266 isn't used - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 I2C connector, SDA pin. Available if I2C isn't used. - // TIM5_CH1 is used by the Servo Library - {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 BL-TOUCH port. Available if Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN - - /** - * Unused by specifications on SKR-Pro. - * Uncomment the corresponding line if you want to have HardwarePWM on some pins. - * WARNING: check timers' usage first to avoid conflicts. - * If you don't know what you're doing leave things as they are or you WILL break something (including hardware) - * If you alter this section DO NOT report bugs to Marlin team since they are most likely caused by you. Thank you. - */ - //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 BLTOUCH is a "servo" - //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BLTOUCH is a "servo" - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - //{PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - //{PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - //{PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - #endif - #if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio - {PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - {PH_6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - {PI_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - {PI_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - #endif - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_TX[] = { - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {NC, NP, 0} -}; - -const PinMap PinMap_UART_RX[] = { - {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - //{PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; - -const PinMap PinMap_UART_RTS[] = { - //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; - -const PinMap PinMap_UART_CTS[] = { - //{PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - //{PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - #endif - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MOSI[] = { - {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; -#endif - -//*** CAN *** - -#ifdef HAL_CAN_MODULE_ENABLED -#error "CAN bus isn't available on this board. Driver should be disabled." -#endif - -//*** ETHERNET *** -#ifdef HAL_ETH_MODULE_ENABLED -#error "Ethernet port isn't available on this board. Driver should be disabled." -#endif - -//*** No QUADSPI *** - -//*** USB *** -#ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_FS[] = { - //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF used by LCD - //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS available on wifi port, if empty - //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID available on UART1_RX if not used - {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM - {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP - {NC, NP, 0} -}; - -const PinMap PinMap_USB_OTG_HS[] = { /* - #ifdef USE_USB_HS_IN_FS - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM - {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP - #else - #error "USB in HS mode isn't supported by the board" - {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 - {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 - {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 - {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 - {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 - {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP - {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR - {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT - #endif // USE_USB_HS_IN_FS - */ - {NC, NP, 0} -}; -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PinNamesVar.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PinNamesVar.h deleted file mode 100644 index b4bb9d45f8..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PinNamesVar.h +++ /dev/null @@ -1,50 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_OTG_FS_SOF = PA_8, - USB_OTG_FS_VBUS = PA_9, - USB_OTG_FS_ID = PA_10, - USB_OTG_FS_DM = PA_11, - USB_OTG_FS_DP = PA_12, - USB_OTG_HS_ULPI_D0 = PA_3, - USB_OTG_HS_SOF = PA_4, - USB_OTG_HS_ULPI_CK = PA_5, - USB_OTG_HS_ULPI_D1 = PB_0, - USB_OTG_HS_ULPI_D2 = PB_1, - USB_OTG_HS_ULPI_D7 = PB_5, - USB_OTG_HS_ULPI_D3 = PB_10, - USB_OTG_HS_ULPI_D4 = PB_11, - USB_OTG_HS_ID = PB_12, - USB_OTG_HS_ULPI_D5 = PB_12, - USB_OTG_HS_ULPI_D6 = PB_13, - USB_OTG_HS_VBUS = PB_13, - USB_OTG_HS_DM = PB_14, - USB_OTG_HS_DP = PB_15, - USB_OTG_HS_ULPI_STP = PC_0, - USB_OTG_HS_ULPI_DIR = PC_2, - USB_OTG_HS_ULPI_NXT = PC_3, -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h deleted file mode 100644 index e0e8239aac..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#define HAL_MODULE_ENABLED -#define HAL_ADC_MODULE_ENABLED -#define HAL_CRC_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -//#define HAL_RTC_MODULE_ENABLED Real Time Clock...do we use it? -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -#define HAL_USART_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -//#define HAL_UART_MODULE_ENABLED // by default -//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) - -#undef HAL_SD_MODULE_ENABLED -#undef HAL_DAC_MODULE_ENABLED -#undef HAL_FLASH_MODULE_ENABLED -#undef HAL_CAN_MODULE_ENABLED -#undef HAL_CAN_LEGACY_MODULE_ENABLED -#undef HAL_CEC_MODULE_ENABLED -#undef HAL_CRYP_MODULE_ENABLED -#undef HAL_DCMI_MODULE_ENABLED -#undef HAL_DMA2D_MODULE_ENABLED -#undef HAL_ETH_MODULE_ENABLED -#undef HAL_NAND_MODULE_ENABLED -#undef HAL_NOR_MODULE_ENABLED -#undef HAL_PCCARD_MODULE_ENABLED -#undef HAL_SRAM_MODULE_ENABLED -#undef HAL_SDRAM_MODULE_ENABLED -#undef HAL_HASH_MODULE_ENABLED -#undef HAL_EXTI_MODULE_ENABLED -#undef HAL_SMBUS_MODULE_ENABLED -#undef HAL_I2S_MODULE_ENABLED -#undef HAL_IWDG_MODULE_ENABLED -#undef HAL_LTDC_MODULE_ENABLED -#undef HAL_DSI_MODULE_ENABLED -#undef HAL_QSPI_MODULE_ENABLED -#undef HAL_RNG_MODULE_ENABLED -#undef HAL_SAI_MODULE_ENABLED -#undef HAL_IRDA_MODULE_ENABLED -#undef HAL_SMARTCARD_MODULE_ENABLED -#undef HAL_WWDG_MODULE_ENABLED -#undef HAL_HCD_MODULE_ENABLED -#undef HAL_FMPI2C_MODULE_ENABLED -#undef HAL_SPDIFRX_MODULE_ENABLED -#undef HAL_DFSDM_MODULE_ENABLED -#undef HAL_LPTIM_MODULE_ENABLED -#undef HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/ldscript.ld b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/ldscript.ld deleted file mode 100644 index 0c060d1751..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/ldscript.ld +++ /dev/null @@ -1,204 +0,0 @@ -/* -***************************************************************************** -** - -** File : LinkerScript.ld -** -** Abstract : Linker script for STM32F407ZGTx Device with -** 1024KByte FLASH, 128KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2014 Ac6

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of Ac6 nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200;; /* required amount of heap */ -_Min_Stack_Size = 0x400;; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 1024K -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text ALIGN(4): - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata ALIGN(4): - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCMRAM AT> FLASH - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.cpp b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.cpp deleted file mode 100644 index 1486b21830..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Pin number -// This array allows to wrap Arduino pin number(Dx or x) -// to STM32 PinName (PX_n) -const PinName digitalPin[] = { -#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio - PC_13, //D0 - PC_14, //D1 - OSC32_IN - PC_15, //D2 - OSC32_OUT - PH_0, //D3 - OSC_IN - PH_1, //D4 - OSC_OUT - PB_2, //D5 - BOOT1 - PB_10, //D6 - 1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 - PB_11, //D7 - 1:I2C2_SDA / USART3_RX / TIM2_CH4 - PB_12, //D8 - 1:SPI2_NSS / OTG_HS_ID - PB_13, //D9 - 1:SPI2_SCK 2:OTG_HS_VBUS - PB_14, //D10 - 1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM - PB_15, //D11 - SPI2_MOSI / TIM12_CH2 / OTG_HS_DP - PC_6, //D12 - 1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 - PC_7, //D13 - 1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 - PC_8, //D14 - 1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 - PC_9, //D15 - 1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 - PA_8, //D16 - 1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF - PA_9, //D17 - 1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS - PA_10, //D18 - 1:USART1_RX / TIM1_CH3 / OTG_FS_ID - PA_11, //D19 - 1:TIM1_CH4 / OTG_FS_DM - PA_12, //D20 - 1:OTG_FS_DP - PA_13, //D21 - 0:JTMS-SWDIO - PA_14, //D22 - 0:JTCK-SWCLK - PA_15, //D23 - 0:JTDI 1:SPI3_NSS / SPI1_NSS - PC_10, //D24 - 1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX - PC_11, //D25 - 1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX - PC_12, //D26 - 1:UART5_TX / SPI3_MOSI / SDIO_CK - PD_2, //D27 - 1:UART5_RX / SDIO_CMD - PB_3, //D28 - 0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK - PB_4, //D29 - 0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO - PB_5, //D30 - 1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI - PB_6, //D31 - 1:I2C1_SCL / TIM4_CH1 / USART1_TX - PB_7, //D32 - 1:I2C1_SDA / TIM4_CH2 / USART1_RX - PB_8, //D33 - 1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 - PB_9, //D34 - 1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS - PA_0, //D35/A0 - 1:UART4_TX / TIM5_CH1 2:ADC123_IN0 - PA_1, //D36/A1 - 1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 - PA_2, //D37/A2 - 1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 - PA_3, //D38/A3 - 1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 - PA_4, //D39/A4 - NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 - PA_5, //D40/A5 - NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 - PA_6, //D41/A6 - 1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 - PA_7, //D42/A7 - 1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 - PB_0, //D43/A8 - 1:TIM3_CH3 2:ADC12_IN8 - PB_1, //D44/A9 - 1:TIM3_CH4 2:ADC12_IN9 - PC_0, //D45/A10 - 1: 2:ADC123_IN10 - PC_1, //D46/A11 - 1: 2:ADC123_IN11 - PC_2, //D47/A12 - 1:SPI2_MISO 2:ADC123_IN12 - PC_3, //D48/A13 - 1:SPI2_MOSI 2:ADC123_IN13 - PC_4, //D49/A14 - 1: 2:ADC12_IN14 - PC_5, //D50/A15 - 1: 2:ADC12_IN15 - #if STM32F4X_PIN_NUM >= 144 - PF_3, //D51/A16 - 1:FSMC_A3 2:ADC3_IN9 - PF_4, //D52/A17 - 1:FSMC_A4 2:ADC3_IN14 - PF_5, //D53/A18 - 1:FSMC_A5 2:ADC3_IN15 - PF_6, //D54/A19 - 1:TIM10_CH1 2:ADC3_IN4 - PF_7, //D55/A20 - 1:TIM11_CH1 2:ADC3_IN5 - PF_8, //D56/A21 - 1:TIM13_CH1 2:ADC3_IN6 - PF_9, //D57/A22 - 1;TIM14_CH1 2:ADC3_IN7 - PF_10, //D58/A23 - 2:ADC3_IN8 - #endif -#endif -#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio - PE_2, //D59 - 1:FSMC_A23 - PE_3, //D60 - 1:FSMC_A19 - PE_4, //D61 - 1:FSMC_A20 - PE_5, //D62 - 1:FSMC_A21 - PE_6, //D63 - 1:FSMC_A22 - PE_7, //D64 - 1:FSMC_D4 - PE_8, //D65 - 1:FSMC_D5 - PE_9, //D66 - 1:FSMC_D6 / TIM1_CH1 - PE_10, //D67 - 1:FSMC_D7 - PE_11, //D68 - 1:FSMC_D8 / TIM1_CH2 - PE_12, //D69 - 1:FSMC_D9 - PE_13, //D70 - 1:FSMC_D10 / TIM1_CH3 - PE_14, //D71 - 1:FSMC_D11 / TIM1_CH4 - PE_15, //D72 - 1:FSMC_D12 - PD_8, //D73 - 1:FSMC_D13 / USART3_TX - PD_9, //D74 - 1:FSMC_D14 / USART3_RX - PD_10, //D75 - 1:FSMC_D15 - PD_11, //D76 - 1:FSMC_A16 - PD_12, //D77 - 1:FSMC_A17 / TIM4_CH1 - PD_13, //D78 - 1:FSMC_A18 / TIM4_CH2 - PD_14, //D79 - 1:FSMC_D0 / TIM4_CH3 - PD_15, //D80 - 1:FSMC_D1 / TIM4_CH4 - PD_0, //D81 - 1:FSMC_D2 - PD_1, //D82 - 1:FSMC_D3 - PD_3, //D83 - 1:FSMC_CLK - PD_4, //D84 - 1:FSMC_NOE - PD_5, //D85 - 1:USART2_TX - PD_6, //D86 - 1:USART2_RX - PD_7, //D87 - PE_0, //D88 - PE_1, //D89 -#endif -#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - PF_0, //D90 - 1:FSMC_A0 / I2C2_SDA - PF_1, //D91 - 1:FSMC_A1 / I2C2_SCL - PF_2, //D92 - 1:FSMC_A2 - PF_11, //D93 - PF_12, //D94 - 1:FSMC_A6 - PF_13, //D95 - 1:FSMC_A7 - PF_14, //D96 - 1:FSMC_A8 - PF_15, //D97 - 1:FSMC_A9 - PG_0, //D98 - 1:FSMC_A10 - PG_1, //D99 - 1:FSMC_A11 - PG_2, //D100 - 1:FSMC_A12 - PG_3, //D101 - 1:FSMC_A13 - PG_4, //D102 - 1:FSMC_A14 - PG_5, //D103 - 1:FSMC_A15 - PG_6, //D104 - PG_7, //D105 - PG_8, //D106 - PG_9, //D107 - 1:USART6_RX - PG_10, //D108 - 1:FSMC_NE3 - PG_11, //D109 - PG_12, //D110 - 1:FSMC_NE4 - PG_13, //D111 - 1:FSMC_A24 - PG_14, //D112 - 1:FSMC_A25 / USART6_TX - PG_15, //D113 -#endif -#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio - PI_8, //D114 - PI_9, //D115 - PI_10, //D116 - PI_11, //D117 - PH_2, //D118 - PH_3, //D119 - PH_4, //D120 - 1:I2C2_SCL - PH_5, //D121 - 1:I2C2_SDA - PH_6, //D122 - 1:TIM12_CH1 - PH_7, //D123 - 1:I2C3_SCL - PH_8, //D124 - 1:I2C3_SDA - PH_9, //D125 - 1:TIM12_CH2 - PH_10, //D126 - 1:TIM5_CH1 - PH_11, //D127 - 1:TIM5_CH2 - PH_12, //D128 - 1:TIM5_CH3 - PH_13, //D129 - PH_14, //D130 - PH_15, //D131 - PI_0, //D132 - 1:TIM5_CH4 / SPI2_NSS - PI_1, //D133 - 1:SPI2_SCK - PI_2, //D134 - 1:TIM8_CH4 /SPI2_MISO - PI_3, //D135 - 1:SPI2_MOS - PI_4, //D136 - PI_5, //D137 - 1:TIM8_CH1 - PI_6, //D138 - 1:TIM8_CH2 - PI_7, //D139 - 1:TIM8_CH3 -#endif -}; - -#ifdef __cplusplus -} -#endif - -// ------------------------ - -#ifdef __cplusplus -extern "C" { -#endif - - /** - * @brief System Clock Configuration - * @param None - * @retval None - */ -WEAK void SystemClock_Config() { - - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; - - /**Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 8; - RCC_OscInitStruct.PLL.PLLN = 336; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 7; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } - - /**Configure the Systick interrupt time - */ - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); - - /**Configure the Systick - */ - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); -} - -#ifdef __cplusplus -} -#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.h deleted file mode 100644 index 1ba0a18d6a..0000000000 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.h +++ /dev/null @@ -1,322 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ - -#ifdef STM32F405RX - #define STM32F4X_PIN_NUM 64 //64 pins mcu, 51 gpio - #define STM32F4X_GPIO_NUM 51 - #define STM32F4X_ADC_NUM 16 -#elif defined(STM32F407_5VX) - #define STM32F4X_PIN_NUM 100 //100 pins mcu, 82 gpio - #define STM32F4X_GPIO_NUM 82 - #define STM32F4X_ADC_NUM 16 -#elif defined(STM32F407_5ZX) - #define STM32F4X_PIN_NUM 144 //144 pins mcu, 114 gpio - #define STM32F4X_GPIO_NUM 114 - #define STM32F4X_ADC_NUM 24 -#elif defined(STM32F407IX) - #define STM32F4X_PIN_NUM 176 //176 pins mcu, 140 gpio - #define STM32F4X_GPIO_NUM 140 - #define STM32F4X_ADC_NUM 24 -#else - #error "no match MCU defined" -#endif - -#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio - #define PC13 0 - #define PC14 1 //OSC32_IN - #define PC15 2 //OSC32_OUT - #define PH0 3 //OSC_IN - #define PH1 4 //OSC_OUT - #define PB2 5 //BOOT1 - #define PB10 6 //1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 - #define PB11 7 //1:I2C2_SDA / USART3_RX / TIM2_CH4 - #define PB12 8 //1:SPI2_NSS / OTG_HS_ID - #define PB13 9 //1:SPI2_SCK 2:OTG_HS_VBUS - #define PB14 10 //1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM - #define PB15 11 //SPI2_MOSI / TIM12_CH2 / OTG_HS_DP - #define PC6 12 //1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 - #define PC7 13 //1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 - #define PC8 14 //1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 - #define PC9 15 //1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 - #define PA8 16 //1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF - #define PA9 17 //1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS - #define PA10 18 //1:USART1_RX / TIM1_CH3 / OTG_FS_ID - #define PA11 19 //1:TIM1_CH4 / OTG_FS_DM - #define PA12 20 //1:OTG_FS_DP - #define PA13 21 //0:JTMS-SWDIO - #define PA14 22 //0:JTCK-SWCLK - #define PA15 23 //0:JTDI 1:SPI3_NSS / SPI1_NSS - #define PC10 24 //1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX - #define PC11 25 //1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX - #define PC12 26 //1:UART5_TX / SPI3_MOSI / SDIO_CK - #define PD2 27 //1:UART5_RX / SDIO_CMD - #define PB3 28 //0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK - #define PB4 29 //0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO - #define PB5 30 //1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI - #define PB6 31 //1:I2C1_SCL / TIM4_CH1 / USART1_TX - #define PB7 32 //1:I2C1_SDA / TIM4_CH2 / USART1_RX - #define PB8 33 //1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 - #define PB9 34 //1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS - #define PA0 35 //1:UART4_TX / TIM5_CH1 2:ADC123_IN0 - #define PA1 36 //1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 - #define PA2 37 //1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 - #define PA3 38 //1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 - #define PA4 39 //NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 - #define PA5 40 //NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 - #define PA6 41 //1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 - #define PA7 42 //1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 - #define PB0 43 //1:TIM3_CH3 2:ADC12_IN8 - #define PB1 44 //1:TIM3_CH4 2:ADC12_IN9 - #define PC0 45 //1: 2:ADC123_IN10 - #define PC1 46 //1: 2:ADC123_IN11 - #define PC2 47 //1:SPI2_MISO 2:ADC123_IN12 - #define PC3 48 //1:SPI2_MOSI 2:ADC123_IN13 - #define PC4 49 //1: 2:ADC12_IN14 - #define PC5 50 //1: 2:ADC12_IN15 - #if STM32F4X_PIN_NUM >= 144 - #define PF3 51 //1:FSMC_A3 2:ADC3_IN9 - #define PF4 52 //1:FSMC_A4 2:ADC3_IN14 - #define PF5 53 //1:FSMC_A5 2:ADC3_IN15 - #define PF6 54 //1:TIM10_CH1 2:ADC3_IN4 - #define PF7 55 //1:TIM11_CH1 2:ADC3_IN5 - #define PF8 56 //1:TIM13_CH1 2:ADC3_IN6 - #define PF9 57 //1;TIM14_CH1 2:ADC3_IN7 - #define PF10 58 //2:ADC3_IN8 - #endif -#endif -#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio - #define PE2 (35+STM32F4X_ADC_NUM) //1:FSMC_A23 - #define PE3 (36+STM32F4X_ADC_NUM) //1:FSMC_A19 - #define PE4 (37+STM32F4X_ADC_NUM) //1:FSMC_A20 - #define PE5 (38+STM32F4X_ADC_NUM) //1:FSMC_A21 - #define PE6 (39+STM32F4X_ADC_NUM) //1:FSMC_A22 - #define PE7 (40+STM32F4X_ADC_NUM) //1:FSMC_D4 - #define PE8 (41+STM32F4X_ADC_NUM) //1:FSMC_D5 - #define PE9 (42+STM32F4X_ADC_NUM) //1:FSMC_D6 / TIM1_CH1 - #define PE10 (43+STM32F4X_ADC_NUM) //1:FSMC_D7 - #define PE11 (44+STM32F4X_ADC_NUM) //1:FSMC_D8 / TIM1_CH2 - #define PE12 (45+STM32F4X_ADC_NUM) //1:FSMC_D9 - #define PE13 (46+STM32F4X_ADC_NUM) //1:FSMC_D10 / TIM1_CH3 - #define PE14 (47+STM32F4X_ADC_NUM) //1:FSMC_D11 / TIM1_CH4 - #define PE15 (48+STM32F4X_ADC_NUM) //1:FSMC_D12 - #define PD8 (49+STM32F4X_ADC_NUM) //1:FSMC_D13 / USART3_TX - #define PD9 (50+STM32F4X_ADC_NUM) //1:FSMC_D14 / USART3_RX - #define PD10 (51+STM32F4X_ADC_NUM) //1:FSMC_D15 - #define PD11 (52+STM32F4X_ADC_NUM) //1:FSMC_A16 - #define PD12 (53+STM32F4X_ADC_NUM) //1:FSMC_A17 / TIM4_CH1 - #define PD13 (54+STM32F4X_ADC_NUM) //1:FSMC_A18 / TIM4_CH2 - #define PD14 (55+STM32F4X_ADC_NUM) //1:FSMC_D0 / TIM4_CH3 - #define PD15 (56+STM32F4X_ADC_NUM) //1:FSMC_D1 / TIM4_CH4 - #define PD0 (57+STM32F4X_ADC_NUM) //1:FSMC_D2 - #define PD1 (58+STM32F4X_ADC_NUM) //1:FSMC_D3 - #define PD3 (59+STM32F4X_ADC_NUM) //1:FSMC_CLK - #define PD4 (60+STM32F4X_ADC_NUM) //1:FSMC_NOE - #define PD5 (61+STM32F4X_ADC_NUM) //1:USART2_TX - #define PD6 (62+STM32F4X_ADC_NUM) //1:USART2_RX - #define PD7 (63+STM32F4X_ADC_NUM) - #define PE0 (64+STM32F4X_ADC_NUM) - #define PE1 (65+STM32F4X_ADC_NUM) -#endif -#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio - #define PF0 (66+STM32F4X_ADC_NUM) //1:FSMC_A0 / I2C2_SDA - #define PF1 (67+STM32F4X_ADC_NUM) //1:FSMC_A1 / I2C2_SCL - #define PF2 (68+STM32F4X_ADC_NUM) //1:FSMC_A2 - #define PF11 (69+STM32F4X_ADC_NUM) - #define PF12 (70+STM32F4X_ADC_NUM) //1:FSMC_A6 - #define PF13 (71+STM32F4X_ADC_NUM) //1:FSMC_A7 - #define PF14 (72+STM32F4X_ADC_NUM) //1:FSMC_A8 - #define PF15 (73+STM32F4X_ADC_NUM) //1:FSMC_A9 - #define PG0 (74+STM32F4X_ADC_NUM) //1:FSMC_A10 - #define PG1 (75+STM32F4X_ADC_NUM) //1:FSMC_A11 - #define PG2 (76+STM32F4X_ADC_NUM) //1:FSMC_A12 - #define PG3 (77+STM32F4X_ADC_NUM) //1:FSMC_A13 - #define PG4 (78+STM32F4X_ADC_NUM) //1:FSMC_A14 - #define PG5 (79+STM32F4X_ADC_NUM) //1:FSMC_A15 - #define PG6 (80+STM32F4X_ADC_NUM) - #define PG7 (81+STM32F4X_ADC_NUM) - #define PG8 (82+STM32F4X_ADC_NUM) - #define PG9 (83+STM32F4X_ADC_NUM) //1:USART6_RX - #define PG10 (84+STM32F4X_ADC_NUM) //1:FSMC_NE3 - #define PG11 (85+STM32F4X_ADC_NUM) - #define PG12 (86+STM32F4X_ADC_NUM) //1:FSMC_NE4 - #define PG13 (87+STM32F4X_ADC_NUM) //1:FSMC_A24 - #define PG14 (88+STM32F4X_ADC_NUM) //1:FSMC_A25 / USART6_TX - #define PG15 (89+STM32F4X_ADC_NUM) -#endif -#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio - #define PI8 (90+STM32F4X_ADC_NUM) - #define PI9 (91+STM32F4X_ADC_NUM) - #define PI10 (92+STM32F4X_ADC_NUM) - #define PI11 (93+STM32F4X_ADC_NUM) - #define PH2 (94+STM32F4X_ADC_NUM) - #define PH3 (95+STM32F4X_ADC_NUM) - #define PH4 (96+STM32F4X_ADC_NUM) //1:I2C2_SCL - #define PH5 (97+STM32F4X_ADC_NUM) //1:I2C2_SDA - #define PH6 (98+STM32F4X_ADC_NUM) //1:TIM12_CH1 - #define PH7 (99+STM32F4X_ADC_NUM) //1:I2C3_SCL - #define PH8 (100+STM32F4X_ADC_NUM) //1:I2C3_SDA - #define PH9 (101+STM32F4X_ADC_NUM) //1:TIM12_CH2 - #define PH10 (102+STM32F4X_ADC_NUM) //1:TIM5_CH1 - #define PH11 (103+STM32F4X_ADC_NUM) //1:TIM5_CH2 - #define PH12 (104+STM32F4X_ADC_NUM) //1:TIM5_CH3 - #define PH13 (105+STM32F4X_ADC_NUM) - #define PH14 (106+STM32F4X_ADC_NUM) - #define PH15 (107+STM32F4X_ADC_NUM) - #define PI0 (108+STM32F4X_ADC_NUM) //1:TIM5_CH4 / SPI2_NSS - #define PI1 (109+STM32F4X_ADC_NUM) //1:SPI2_SCK - #define PI2 (110+STM32F4X_ADC_NUM) //1:TIM8_CH4 /SPI2_MISO - #define PI3 (111+STM32F4X_ADC_NUM) //1:SPI2_MOS - #define PI4 (112+STM32F4X_ADC_NUM) - #define PI5 (113+STM32F4X_ADC_NUM) //1:TIM8_CH1 - #define PI6 (114+STM32F4X_ADC_NUM) //1:TIM8_CH2 - #define PI7 (115+STM32F4X_ADC_NUM) //1:TIM8_CH3 -#endif - - -// This must be a literal -#define NUM_DIGITAL_PINS (STM32F4X_GPIO_NUM) -// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS (STM32F4X_ADC_NUM) -#define NUM_ANALOG_FIRST 35 - -// Below ADC, DAC and PWM definitions already done in the core -// Could be redefined here if needed -// ADC resolution is 12bits -//#define ADC_RESOLUTION 12 -//#define DACC_RESOLUTION 12 - -// PWM resolution -/* - * BEWARE: - * Changing this value from the default (1000) will affect the PWM output value of analogWrite (to a PWM pin) - * Since the pin is toggled on capture, if you change the frequency of the timer you have to adapt the compare value (analogWrite thinks you did) - */ -//#define PWM_FREQUENCY 20000 -//The bottom values are the default and don't need to be redefined -//#define PWM_RESOLUTION 8 -//#define PWM_MAX_DUTY_CYCLE 255 - -// On-board LED pin number -#define LED_BUILTIN PA7 -#define LED_GREEN LED_BUILTIN - -// Below SPI and I2C definitions already done in the core -// Could be redefined here if differs from the default one -// SPI Definitions -#define PIN_SPI_MOSI PB15 -#define PIN_SPI_MISO PB14 -#define PIN_SPI_SCK PB13 -#define PIN_SPI_SS PB12 - -// I2C Definitions -#if STM32F4X_PIN_NUM >= 176 - #define PIN_WIRE_SDA PH5 - #define PIN_WIRE_SCL PH4 -#else - #define PIN_WIRE_SDA PB7 - #define PIN_WIRE_SCL PB6 -#endif - -// Timer Definitions -//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c -#define TIMER_TONE TIM2 -#define TIMER_SERVO TIM5 // Only 1 Servo PIN on SKR-PRO, so use the same timer as defined in PeripheralPins -#define TIMER_SERIAL TIM7 - -// UART Definitions -//#define ENABLE_HWSERIAL1 done automatically by the #define SERIAL_UART_INSTANCE below -#define ENABLE_HWSERIAL3 -#define ENABLE_HWSERIAL6 - -// Define here Serial instance number to map on Serial generic name (if not already used by SerialUSB) -#define SERIAL_UART_INSTANCE 1 //1 for Serial = Serial1 (USART1) - -// DEBUG_UART could be redefined to print on another instance than 'Serial' -//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 -// DEBUG_UART baudrate, default: 9600 if not defined -//#define DEBUG_UART_BAUDRATE x -// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART -//#define DEBUG_PINNAME_TX PX_n // PinName used for TX - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#define PIN_SERIAL_RX PA10 -#define PIN_SERIAL_TX PA9 - -// Optional PIN_SERIALn_RX and PIN_SERIALn_TX where 'n' is the U(S)ART number -// Used when user instanciate a hardware Serial using its peripheral name. -// Example: HardwareSerial mySerial(USART3); -// will use PIN_SERIAL3_RX and PIN_SERIAL3_TX if defined. -#define PIN_SERIAL1_RX PA10 -#define PIN_SERIAL1_TX PA9 -#define PIN_SERIAL3_RX PD9 -#define PIN_SERIAL3_TX PD8 -#define PIN_SERIAL6_RX PC7 -#define PIN_SERIAL6_TX PC6 -//#define PIN_SERIALLP1_RX x // For LPUART1 RX -//#define PIN_SERIALLP1_TX x // For LPUART1 TX - -#ifdef __cplusplus -} // extern "C" -#endif -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_HARDWARE Serial1 -#define SERIAL_PORT_HARDWARE_OPEN Serial3 -#define SERIAL_PORT_HARDWARE_OPEN1 Serial6 -#endif diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp deleted file mode 100755 index 6083664b94..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file wirish/boards/maple/board.cpp - * @author Marti Bolivar - * @brief Maple board file. - */ - -#include // For this board's header file - -/* Roger Clark. Added next to includes for changes to Serial */ -#include -#include - -#include // For stm32_pin_info and its contents - // (these go into PIN_MAP). - -#include "boards_private.h" // For PMAP_ROW(), which makes - // PIN_MAP easier to read. - -// boardInit(): nothing special to do for Maple. -// -// When defining your own board.cpp, you can put extra code in this -// function if you have anything you want done on reset, before main() -// or setup() are called. -// -// If there's nothing special you need done, feel free to leave this -// function out, as we do here. -/* -void boardInit(void) { -} -*/ - -// Pin map: this lets the basic I/O functions (digitalWrite(), -// analogRead(), pwmWrite()) translate from pin numbers to STM32 -// peripherals. -// -// PMAP_ROW() lets us specify a row (really a struct stm32_pin_info) -// in the pin map. Its arguments are: -// -// - GPIO device for the pin (&gpioa, etc.) -// - GPIO bit for the pin (0 through 15) -// - Timer device, or NULL if none -// - Timer channel (1 to 4, for PWM), or 0 if none -// - ADC device, or NULL if none -// - ADC channel, or ADCx if none - -extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - /* - gpio_dev *gpio_device; GPIO device - timer_dev *timer_device; Pin's timer device, if any. - const adc_dev *adc_device; ADC device, if any. - uint8 gpio_bit; Pin's GPIO port bit. - uint8 timer_channel; Timer channel, or 0 if none. - uint8 adc_channel; Pin ADC channel, or ADCx if none. - */ - - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, &timer3, &adc1, 2, 4, 9}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ - {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ - - - {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ - {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 */ - {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 */ - {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 */ - {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 */ - {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ - {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ - {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ - - {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ - - {&gpiod, NULL, NULL, 3, 0, ADCx} , /* PD3 FSMC_CLK */ - {&gpiod, NULL, NULL, 4, 0, ADCx} , /* PD4 FSMC_NOE */ - {&gpiod, NULL, NULL, 5, 0, ADCx} , /* PD5 FSMC_NWE */ - {&gpiod, NULL, NULL, 6, 0, ADCx} , /* PD6 FSMC_NWAIT */ - {&gpiod, NULL, NULL, 7, 0, ADCx} , /* PD7 FSMC_NE1/FSMC_NCE2 */ - {&gpiod, NULL, NULL, 8, 0, ADCx} , /* PD8 FSMC_D13 */ - {&gpiod, NULL, NULL, 9, 0, ADCx} , /* PD9 FSMC_D14 */ - {&gpiod, NULL, NULL, 10, 0, ADCx} , /* PD10 FSMC_D15 */ - {&gpiod, NULL, NULL, 11, 0, ADCx} , /* PD11 FSMC_A16 */ - {&gpiod, NULL, NULL, 12, 0, ADCx} , /* PD12 FSMC_A17 */ - {&gpiod, NULL, NULL, 13, 0, ADCx} , /* PD13 FSMC_A18 */ - {&gpiod, NULL, NULL, 14, 0, ADCx} , /* PD14 FSMC_D0 */ - {&gpiod, NULL, NULL, 15, 0, ADCx} , /* PD15 FSMC_D1 */ - - {&gpioe, NULL, NULL, 0, 0, ADCx} , /* PE0 */ - {&gpioe, NULL, NULL, 1, 0, ADCx} , /* PE1 */ - {&gpioe, NULL, NULL, 2, 0, ADCx} , /* PE2 */ - {&gpioe, NULL, NULL, 3, 0, ADCx} , /* PE3 */ - {&gpioe, NULL, NULL, 4, 0, ADCx} , /* PE4 */ - {&gpioe, NULL, NULL, 5, 0, ADCx} , /* PE5 */ - {&gpioe, NULL, NULL, 6, 0, ADCx} , /* PE6 */ - {&gpioe, NULL, NULL, 7, 0, ADCx} , /* PE7 */ - {&gpioe, NULL, NULL, 8, 0, ADCx} , /* PE8 */ - {&gpioe, NULL, NULL, 9, 0, ADCx} , /* PE9 */ - {&gpioe, NULL, NULL, 10, 0, ADCx} , /* PE10 */ - {&gpioe, NULL, NULL, 11, 0, ADCx} , /* PE11 */ - {&gpioe, NULL, NULL, 12, 0, ADCx} , /* PE12 */ - {&gpioe, NULL, NULL, 13, 0, ADCx} , /* PE13 */ - {&gpioe, NULL, NULL, 14, 0, ADCx} , /* PE14 */ - {&gpioe, NULL, NULL, 15, 0, ADCx} , /* PE15 */ - - {&gpiof, NULL, NULL, 0, 0, ADCx} , /* PF0 */ - {&gpiof, NULL, NULL, 1, 0, ADCx} , /* PF1 */ - {&gpiof, NULL, NULL, 2, 0, ADCx} , /* PF2 */ - {&gpiof, NULL, NULL, 3, 0, ADCx} , /* PF3 */ - {&gpiof, NULL, NULL, 4, 0, ADCx} , /* PF4 */ - {&gpiof, NULL, NULL, 5, 0, ADCx} , /* PF5 */ - {&gpiof, NULL, NULL, 6, 0, ADCx} , /* PF6 */ - {&gpiof, NULL, NULL, 7, 0, ADCx} , /* PF7 */ - {&gpiof, NULL, NULL, 8, 0, ADCx} , /* PF8 */ - {&gpiof, NULL, NULL, 9, 0, ADCx} , /* PF9 */ - {&gpiof, NULL, NULL, 10, 0, ADCx} , /* PF10 */ - {&gpiof, NULL, NULL, 11, 0, ADCx} , /* PF11 */ - {&gpiof, NULL, NULL, 12, 0, ADCx} , /* PF12 */ - {&gpiof, NULL, NULL, 13, 0, ADCx} , /* PF13 */ - {&gpiof, NULL, NULL, 14, 0, ADCx} , /* PF14 */ - {&gpiof, NULL, NULL, 15, 0, ADCx} , /* PF15 */ - - {&gpiog, NULL, NULL, 0, 0, ADCx} , /* PG0 */ - {&gpiog, NULL, NULL, 1, 0, ADCx} , /* PG1 */ - {&gpiog, NULL, NULL, 2, 0, ADCx} , /* PG2 */ - {&gpiog, NULL, NULL, 3, 0, ADCx} , /* PG3 */ - {&gpiog, NULL, NULL, 4, 0, ADCx} , /* PG4 */ - {&gpiog, NULL, NULL, 5, 0, ADCx} , /* PG5 */ - {&gpiog, NULL, NULL, 6, 0, ADCx} , /* PG6 */ - {&gpiog, NULL, NULL, 7, 0, ADCx} , /* PG7 */ - {&gpiog, NULL, NULL, 8, 0, ADCx} , /* PG8 */ - {&gpiog, NULL, NULL, 9, 0, ADCx} , /* PG9 */ - {&gpiog, NULL, NULL, 10, 0, ADCx} , /* PG10 */ - {&gpiog, NULL, NULL, 11, 0, ADCx} , /* PG11 */ - {&gpiog, NULL, NULL, 12, 0, ADCx} , /* PG12 */ - {&gpiog, NULL, NULL, 13, 0, ADCx} , /* PG13 */ - {&gpiog, NULL, NULL, 14, 0, ADCx} , /* PG14 */ - {&gpiog, NULL, NULL, 15, 0, ADCx} /* PG15 */ -}; - -/* Basically everything that is defined as having a timer us PWM */ -extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { - PA0,PA1,PA2,PA3,PA6,PA7,PA8,PA9,PA10,PB0,PB1,PB6,PB7,PB8,PB9,PC6,PC7,PC8,PC9 -}; - -/* Basically everything that is defined having ADC */ -extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = { - PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PB0,PB1,PC0,PC1,PC2,PC3,PC4,PC5 -}; - -/* not sure what this us used for */ -extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { - BOARD_JTMS_SWDIO_PIN, - BOARD_JTCK_SWCLK_PIN, BOARD_JTDI_PIN, BOARD_JTDO_PIN, BOARD_NJTRST_PIN -}; - - -#ifdef SERIAL_USB - DEFINE_HWSERIAL(Serial1, 1); - DEFINE_HWSERIAL(Serial2, 2); - DEFINE_HWSERIAL(Serial3, 3); - DEFINE_HWSERIAL_UART(Serial4, 4); - DEFINE_HWSERIAL_UART(Serial5, 5); -#else - DEFINE_HWSERIAL(Serial, 1); - DEFINE_HWSERIAL(Serial1, 2); - DEFINE_HWSERIAL(Serial2, 3); - DEFINE_HWSERIAL_UART(Serial3, 4); - DEFINE_HWSERIAL_UART(Serial4, 5); -#endif diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h b/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h deleted file mode 100755 index 20fd9d379f..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h +++ /dev/null @@ -1,240 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file maple_RET6.h - * @author Marti Bolivar - * @brief Private include file for Maple RET6 Edition in boards.h - * - * See maple.h for more information on these definitions. - */ - -#ifndef _BOARDS_GENERIC_STM32F103Z_H_ -#define _BOARDS_GENERIC_STM32F103Z_H_ - -/* A few of these values will seem strange given that it's a - * high-density board. */ - -#define CYCLES_PER_MICROSECOND 72 -#define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ - -// USARTS -#define BOARD_NR_USARTS 5 -#define BOARD_USART1_TX_PIN PA9 -#define BOARD_USART1_RX_PIN PA10 - -#define BOARD_USART2_TX_PIN PA2 -#define BOARD_USART2_RX_PIN PA3 - -#define BOARD_USART3_TX_PIN PB10 -#define BOARD_USART3_RX_PIN PB11 - -#define BOARD_USART4_TX_PIN PC10 -#define BOARD_USART4_RX_PIN PC11 - -#define BOARD_USART5_TX_PIN PC12 -#define BOARD_USART5_RX_PIN PD2 - -/* Note: - * - * SPI3 is unusable due to pin 43 (PB4) and NRST tie-together :(, but - * leave the definitions so as not to clutter things up. This is only - * OK since RET6 Ed. is specifically advertised as a beta board. */ -#define BOARD_NR_SPI 3 -#define BOARD_SPI1_NSS_PIN PA4 -#define BOARD_SPI1_SCK_PIN PA5 -#define BOARD_SPI1_MISO_PIN PA6 -#define BOARD_SPI1_MOSI_PIN PA7 - - - -#define BOARD_SPI2_NSS_PIN PB12 -#define BOARD_SPI2_SCK_PIN PB13 -#define BOARD_SPI2_MISO_PIN PB14 -#define BOARD_SPI2_MOSI_PIN PB15 - - -#define BOARD_SPI3_NSS_PIN PA15 -#define BOARD_SPI3_SCK_PIN PB3 -#define BOARD_SPI3_MISO_PIN PB4 -#define BOARD_SPI3_MOSI_PIN PB5 - - -/* GPIO A to E = 5 * 16 - BOOT1 not used = 79*/ -#define BOARD_NR_GPIO_PINS 112 -/* Note: NOT 19. The missing one is D38 a.k.a. BOARD_BUTTON_PIN, which - * isn't broken out to a header and is thus unusable for PWM. */ -#define BOARD_NR_PWM_PINS 19 -#define BOARD_NR_ADC_PINS 16 -#define BOARD_NR_USED_PINS 7 - -#define BOARD_JTMS_SWDIO_PIN 39 -#define BOARD_JTCK_SWCLK_PIN 40 -#define BOARD_JTDI_PIN 41 -#define BOARD_JTDO_PIN 42 -#define BOARD_NJTRST_PIN 43 - -/* USB configuration. BOARD_USB_DISC_DEV is the GPIO port containing - * the USB_DISC pin, and BOARD_USB_DISC_BIT is that pin's bit. */ -#define BOARD_USB_DISC_DEV GPIOC -#define BOARD_USB_DISC_BIT 12 - -/* - * SDIO Pins - */ -#define BOARD_SDIO_D0 PC8 -#define BOARD_SDIO_D1 PC9 -#define BOARD_SDIO_D2 PC10 -#define BOARD_SDIO_D3 PC11 -#define BOARD_SDIO_CLK PC12 -#define BOARD_SDIO_CMD PD2 - -/* Pin aliases: these give the GPIO port/bit for each pin as an - * enum. These are optional, but recommended. They make it easier to - * write code using low-level GPIO functionality. */ -enum { -PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, -PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, -PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, -PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15, -PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, -PF0,PF1,PF2,PF3,PF4,PF5,PF6,PF7,PF8,PF9,PF10,PF11,PF12,PF13,PF14,PF15, -PG0,PG1,PG2,PG3,PG4,PG5,PG6,PG7,PG8,PG9,PG10,PG11,PG12,PG13,PG14,PG15 -};/* Note PB2 is skipped as this is Boot1 and is not going to be much use as its likely to be pulled permanently low */ -/* -#define PA0 0 -#define PA1 1 -#define PA2 2 -#define PA3 3 -#define PA4 4 -#define PA5 5 -#define PA6 6 -#define PA7 7 -#define PA8 8 -#define PA9 9 -#define PA10 10 -#define PA11 11 -#define PA12 12 -#define PA13 13 -#define PA14 14 -#define PA15 15 -#define PB0 16 -#define PB1 17 -#define PB2 18 -#define PB3 19 -#define PB4 20 -#define PB5 21 -#define PB6 22 -#define PB7 23 -#define PB8 24 -#define PB9 25 -#define PB10 26 -#define PB11 27 -#define PB12 28 -#define PB13 29 -#define PB14 30 -#define PB15 31 -#define PC0 32 -#define PC1 33 -#define PC2 34 -#define PC3 35 -#define PC4 36 -#define PC5 37 -#define PC6 38 -#define PC7 39 -#define PC8 40 -#define PC9 41 -#define PC10 42 -#define PC11 43 -#define PC12 44 -#define PC13 45 -#define PC14 46 -#define PC15 47 -#define PD0 48 -#define PD1 49 -#define PD2 50 -#define PD3 51 -#define PD4 52 -#define PD5 53 -#define PD6 54 -#define PD7 55 -#define PD8 56 -#define PD9 57 -#define PD10 58 -#define PD11 59 -#define PD12 60 -#define PD13 61 -#define PD14 62 -#define PD15 63 -#define PE0 64 -#define PE1 65 -#define PE2 66 -#define PE3 67 -#define PE4 68 -#define PE5 69 -#define PE6 70 -#define PE7 71 -#define PE8 72 -#define PE9 73 -#define PE10 74 -#define PE11 75 -#define PE12 76 -#define PE13 77 -#define PE14 78 -#define PE15 79 -#define PF0 80 -#define PF1 81 -#define PF2 82 -#define PF3 83 -#define PF4 84 -#define PF5 85 -#define PF6 86 -#define PF7 87 -#define PF8 88 -#define PF9 89 -#define PF10 90 -#define PF11 91 -#define PF12 92 -#define PF13 93 -#define PF14 94 -#define PF15 95 -#define PG0 96 -#define PG1 97 -#define PG2 98 -#define PG3 99 -#define PG4 100 -#define PG5 101 -#define PG6 102 -#define PG7 103 -#define PG8 104 -#define PG9 105 -#define PG10 106 -#define PG11 107 -#define PG12 108 -#define PG13 109 -#define PG14 110 -#define PG15 111 */ -#endif diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/common.inc b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/common.inc deleted file mode 100755 index e086a58bca..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/common.inc +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Linker script for libmaple. - * - * Original author "lanchon" from ST forums, with modifications by LeafLabs. - */ - -OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") - -/* - * Configure other libraries we want in the link. - * - * libgcc, libc, and libm are common across supported toolchains. - * However, some toolchains require additional archives which aren't - * present everywhere (e.g. ARM's gcc-arm-embedded releases). - * - * To hack around this, we let the build system specify additional - * archives by putting the right extra_libs.inc (in a directory under - * toolchains/) in our search path. - */ -GROUP(libgcc.a libc.a libm.a) -INCLUDE extra_libs.inc - -/* - * These force the linker to search for vector table symbols. - * - * These symbols vary by STM32 family (and also within families). - * It's up to the build system to configure the link's search path - * properly for the target MCU. - */ -INCLUDE vector_symbols.inc - -/* STM32 vector table. */ -EXTERN(__stm32_vector_table) - -/* C runtime initialization function. */ -EXTERN(start_c) - -/* main entry point */ -EXTERN(main) - -/* Initial stack pointer value. */ -EXTERN(__msp_init) -PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram)); - -/* Reset vector and chip reset entry point */ -EXTERN(__start__) -ENTRY(__start__) -PROVIDE(__exc_reset = __start__); - -/* Heap boundaries, for libmaple */ -EXTERN(_lm_heap_start); -EXTERN(_lm_heap_end); - -SECTIONS -{ - .text : - { - __text_start__ = .; - /* - * STM32 vector table. Leave this here. Yes, really. - */ - *(.stm32.interrupt_vector) - - /* - * Program code and vague linking - */ - *(.text .text.* .gnu.linkonce.t.*) - *(.plt) - *(.gnu.warning) - *(.glue_7t) *(.glue_7) *(.vfp11_veneer) - - *(.ARM.extab* .gnu.linkonce.armextab.*) - *(.gcc_except_table) - *(.eh_frame_hdr) - *(.eh_frame) - - . = ALIGN(4); - KEEP(*(.init)) - - . = ALIGN(4); - __preinit_array_start = .; - KEEP (*(.preinit_array)) - __preinit_array_end = .; - - . = ALIGN(4); - __init_array_start = .; - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - __init_array_end = .; - - . = ALIGN(0x4); - KEEP (*crtbegin.o(.ctors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*crtend.o(.ctors)) - - . = ALIGN(4); - KEEP(*(.fini)) - - . = ALIGN(4); - __fini_array_start = .; - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - __fini_array_end = .; - - KEEP (*crtbegin.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*crtend.o(.dtors)) - } > REGION_TEXT - - /* - * End of text - */ - .text.align : - { - . = ALIGN(8); - __text_end__ = .; - } > REGION_TEXT - - /* - * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI - */ - __exidx_start = .; - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > REGION_RODATA - __exidx_end = .; - - /* - * .data - */ - .data : - { - __data_start__ = .; - LONG(0) - . = ALIGN(8); - - *(.got.plt) *(.got) - *(.data .data.* .gnu.linkonce.d.*) - - . = ALIGN(8); - __data_end__ = .; - } > REGION_DATA AT> REGION_RODATA - - /* - * Read-only data - */ - .rodata : - { - *(.rodata .rodata.* .gnu.linkonce.r.*) - /* .USER_FLASH: We allow users to allocate into Flash here */ - *(.USER_FLASH) - /* ROM image configuration; for C startup */ - . = ALIGN(4); - _lm_rom_img_cfgp = .; - LONG(LOADADDR(.data)); - /* - * Heap: Linker scripts may choose a custom heap by overriding - * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in - * internal SRAM, beginning after .bss, and growing towards - * the stack. - * - * I'm shoving these here naively; there's probably a cleaner way - * to go about this. [mbolivar] - */ - _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; - _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init; - } > REGION_RODATA - - /* - * .bss - */ - .bss : - { - . = ALIGN(8); - __bss_start__ = .; - *(.bss .bss.* .gnu.linkonce.b.*) - *(COMMON) - . = ALIGN (8); - __bss_end__ = .; - _end = __bss_end__; - } > REGION_BSS - - /* - * Debugging sections - */ - .stab 0 (NOLOAD) : { *(.stab) } - .stabstr 0 (NOLOAD) : { *(.stabstr) } - /* DWARF debug sections. - * Symbols in the DWARF debugging sections are relative to the beginning - * of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - - .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } - .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } - /DISCARD/ : { *(.note.GNU-stack) } -} diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/extra_libs.inc b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/extra_libs.inc deleted file mode 100755 index dd2c84fa45..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/extra_libs.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- - * releases (https://launchpad.net/gcc-arm-embedded/). - */ - -/* This is for the provided newlib. */ -GROUP(libnosys.a) diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103z_dfu.ld b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103z_dfu.ld deleted file mode 100755 index 81eaa8b06b..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103z_dfu.ld +++ /dev/null @@ -1,29 +0,0 @@ -/* - * libmaple linker script - * - * This build puts .text (and .rodata) in Flash, and - * .data/.bss/heap (of course) in SRAM, but links starting at the - * Flash and SRAM starting addresses (0x08000000 and 0x20000000 - * respectively). This will wipe out a Maple bootloader if there's one - * on the board, so only use this if you know what you're doing. - * - * This build is perfectly usable for upload over SWD, - * the system memory bootloader, etc. The name is just a historical - * artifact. - */ - - -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - rom (rx) : ORIGIN = 0x08002000, LENGTH = 504K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zc.ld b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zc.ld deleted file mode 100755 index 37bc3da0dc..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zc.ld +++ /dev/null @@ -1,27 +0,0 @@ -/* - * libmaple linker script - * - * This build puts .text (and .rodata) in Flash, and - * .data/.bss/heap (of course) in SRAM, but links starting at the - * Flash and SRAM starting addresses (0x08000000 and 0x20000000 - * respectively). This will wipe out a Maple bootloader if there's one - * on the board, so only use this if you know what you're doing. - * - * This build is perfectly usable for upload over SWD, - * the system memory bootloader, etc. The name is just a historical - * artifact. - */ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zd.ld b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zd.ld deleted file mode 100755 index f3f218059f..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zd.ld +++ /dev/null @@ -1,27 +0,0 @@ -/* - * libmaple linker script - * - * This build puts .text (and .rodata) in Flash, and - * .data/.bss/heap (of course) in SRAM, but links starting at the - * Flash and SRAM starting addresses (0x08000000 and 0x20000000 - * respectively). This will wipe out a Maple bootloader if there's one - * on the board, so only use this if you know what you're doing. - * - * This build is perfectly usable for upload over SWD, - * the system memory bootloader, etc. The name is just a historical - * artifact. - */ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103ze.ld b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103ze.ld deleted file mode 100755 index 2f86c3f071..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103ze.ld +++ /dev/null @@ -1,29 +0,0 @@ -/* - * libmaple linker script - * - * This build puts .text (and .rodata) in Flash, and - * .data/.bss/heap (of course) in SRAM, but links starting at the - * Flash and SRAM starting addresses (0x08000000 and 0x20000000 - * respectively). This will wipe out a Maple bootloader if there's one - * on the board, so only use this if you know what you're doing. - * - * This build is perfectly usable for upload over SWD, - * the system memory bootloader, etc. The name is just a historical - * artifact. - */ - - -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/vector_symbols.inc b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/vector_symbols.inc deleted file mode 100755 index f8519bba44..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/vector_symbols.inc +++ /dev/null @@ -1,78 +0,0 @@ -EXTERN(__msp_init) -EXTERN(__exc_reset) -EXTERN(__exc_nmi) -EXTERN(__exc_hardfault) -EXTERN(__exc_memmanage) -EXTERN(__exc_busfault) -EXTERN(__exc_usagefault) -EXTERN(__stm32reservedexception7) -EXTERN(__stm32reservedexception8) -EXTERN(__stm32reservedexception9) -EXTERN(__stm32reservedexception10) -EXTERN(__exc_svc) -EXTERN(__exc_debug_monitor) -EXTERN(__stm32reservedexception13) -EXTERN(__exc_pendsv) -EXTERN(__exc_systick) - -EXTERN(__irq_wwdg) -EXTERN(__irq_pvd) -EXTERN(__irq_tamper) -EXTERN(__irq_rtc) -EXTERN(__irq_flash) -EXTERN(__irq_rcc) -EXTERN(__irq_exti0) -EXTERN(__irq_exti1) -EXTERN(__irq_exti2) -EXTERN(__irq_exti3) -EXTERN(__irq_exti4) -EXTERN(__irq_dma1_channel1) -EXTERN(__irq_dma1_channel2) -EXTERN(__irq_dma1_channel3) -EXTERN(__irq_dma1_channel4) -EXTERN(__irq_dma1_channel5) -EXTERN(__irq_dma1_channel6) -EXTERN(__irq_dma1_channel7) -EXTERN(__irq_adc) -EXTERN(__irq_usb_hp_can_tx) -EXTERN(__irq_usb_lp_can_rx0) -EXTERN(__irq_can_rx1) -EXTERN(__irq_can_sce) -EXTERN(__irq_exti9_5) -EXTERN(__irq_tim1_brk) -EXTERN(__irq_tim1_up) -EXTERN(__irq_tim1_trg_com) -EXTERN(__irq_tim1_cc) -EXTERN(__irq_tim2) -EXTERN(__irq_tim3) -EXTERN(__irq_tim4) -EXTERN(__irq_i2c1_ev) -EXTERN(__irq_i2c1_er) -EXTERN(__irq_i2c2_ev) -EXTERN(__irq_i2c2_er) -EXTERN(__irq_spi1) -EXTERN(__irq_spi2) -EXTERN(__irq_usart1) -EXTERN(__irq_usart2) -EXTERN(__irq_usart3) -EXTERN(__irq_exti15_10) -EXTERN(__irq_rtcalarm) -EXTERN(__irq_usbwakeup) - -EXTERN(__irq_tim8_brk) -EXTERN(__irq_tim8_up) -EXTERN(__irq_tim8_trg_com) -EXTERN(__irq_tim8_cc) -EXTERN(__irq_adc3) -EXTERN(__irq_fsmc) -EXTERN(__irq_sdio) -EXTERN(__irq_tim5) -EXTERN(__irq_spi3) -EXTERN(__irq_uart4) -EXTERN(__irq_uart5) -EXTERN(__irq_tim6) -EXTERN(__irq_tim7) -EXTERN(__irq_dma2_channel1) -EXTERN(__irq_dma2_channel2) -EXTERN(__irq_dma2_channel3) -EXTERN(__irq_dma2_channel4_5) diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h b/buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h deleted file mode 100755 index d5dce114d5..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h +++ /dev/null @@ -1,2 +0,0 @@ -// API compatibility -#include "variant.h" diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/variant.h b/buildroot/share/PlatformIO/variants/CHITU_F103/variant.h deleted file mode 100755 index cd10bb3c07..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/variant.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) -#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) -#define portOutputRegister(port) ( &(port->regs->ODR) ) -#define portInputRegister(port) ( &(port->regs->IDR) ) - -#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) -#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) - -#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) - -static const uint8_t SS = BOARD_SPI1_NSS_PIN; -static const uint8_t SS1 = BOARD_SPI2_NSS_PIN; -static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; -static const uint8_t MISO = BOARD_SPI1_MISO_PIN; -static const uint8_t SCK = BOARD_SPI1_SCK_PIN; diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp deleted file mode 100755 index 2210e9844c..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * Copyright (c) 2011, 2012 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file wirish/boards.cpp - * @brief init() and board routines. - * - * This file is mostly interesting for the init() function, which - * configures Flash, the core clocks, and a variety of other available - * peripherals on the board so the rest of Wirish doesn't have to turn - * things on before using them. - * - * Prior to returning, init() calls boardInit(), which allows boards - * to perform any initialization they need to. This file includes a - * weak no-op definition of boardInit(), so boards that don't need any - * special initialization don't have to define their own. - * - * How init() works is chip-specific. See the boards_setup.cpp files - * under e.g. wirish/stm32f1/, wirish/stmf32f2 for the details, but be - * advised: their contents are unstable, and can/will change without - * notice. - */ - -#include -#include -#include -#include -#include -#include "boards_private.h" - -static void setup_flash(void); -static void setup_clocks(void); -static void setup_nvic(void); -static void setup_adcs(void); -static void setup_timers(void); - -/* - * Exported functions - */ - -void init(void) { - setup_flash(); - setup_clocks(); - setup_nvic(); - systick_init(SYSTICK_RELOAD_VAL); - wirish::priv::board_setup_gpio(); - setup_adcs(); - setup_timers(); - wirish::priv::board_setup_usb(); - wirish::priv::series_init(); - boardInit(); -} - -/* Provide a default no-op boardInit(). */ -__weak void boardInit(void) { -} - -/* You could farm this out to the files in boards/ if e.g. it takes - * too long to test on boards with lots of pins. */ -bool boardUsesPin(uint8 pin) { - for (int i = 0; i < BOARD_NR_USED_PINS; i++) { - if (pin == boardUsedPins[i]) { - return true; - } - } - return false; -} - -/* - * Auxiliary routines - */ - -static void setup_flash(void) { - // Turn on as many Flash "go faster" features as - // possible. flash_enable_features() just ignores any flags it - // can't support. - flash_enable_features(FLASH_PREFETCH | FLASH_ICACHE | FLASH_DCACHE); - // Configure the wait states, assuming we're operating at "close - // enough" to 3.3V. - flash_set_latency(FLASH_SAFE_WAIT_STATES); -} - -static void setup_clocks(void) { - // Turn on HSI. We'll switch to and run off of this while we're - // setting up the main PLL. - rcc_turn_on_clk(RCC_CLK_HSI); - - // Turn off and reset the clock subsystems we'll be using, as well - // as the clock security subsystem (CSS). Note that resetting CFGR - // to its default value of 0 implies a switch to HSI for SYSCLK. - RCC_BASE->CFGR = 0x00000000; - rcc_disable_css(); - rcc_turn_off_clk(RCC_CLK_PLL); - rcc_turn_off_clk(RCC_CLK_HSE); - wirish::priv::board_reset_pll(); - // Clear clock readiness interrupt flags and turn off clock - // readiness interrupts. - RCC_BASE->CIR = 0x00000000; -#if !USE_HSI_CLOCK - // Enable HSE, and wait until it's ready. - rcc_turn_on_clk(RCC_CLK_HSE); - while(!rcc_is_clk_ready(RCC_CLK_HSE)) - ; -#endif - // Configure AHBx, APBx, etc. prescalers and the main PLL. - wirish::priv::board_setup_clock_prescalers(); - rcc_configure_pll(&wirish::priv::w_board_pll_cfg); - - // Enable the PLL, and wait until it's ready. - rcc_turn_on_clk(RCC_CLK_PLL); - while(!rcc_is_clk_ready(RCC_CLK_PLL)) - ; - - // Finally, switch to the now-ready PLL as the main clock source. - rcc_switch_sysclk(RCC_CLKSRC_PLL); -} - -/* - * These addresses are where usercode starts when a bootloader is - * present. If no bootloader is present, the user NVIC usually starts - * at the Flash base address, 0x08000000. - */ -#if defined(BOOTLOADER_maple) - #define USER_ADDR_ROM 0x08005000 -#else - #define USER_ADDR_ROM 0x08000000 -#endif -#define USER_ADDR_RAM 0x20000C00 -extern char __text_start__; - -static void setup_nvic(void) { - -nvic_init((uint32)VECT_TAB_ADDR, 0); - -/* Roger Clark. We now control nvic vector table in boards.txt using the build.vect paramater -#ifdef VECT_TAB_FLASH - nvic_init(USER_ADDR_ROM, 0); -#elif defined VECT_TAB_RAM - nvic_init(USER_ADDR_RAM, 0); -#elif defined VECT_TAB_BASE - nvic_init((uint32)0x08000000, 0); -#elif defined VECT_TAB_ADDR - // A numerically supplied value - nvic_init((uint32)VECT_TAB_ADDR, 0); -#else - // Use the __text_start__ value from the linker script; this - // should be the start of the vector table. - nvic_init((uint32)&__text_start__, 0); -#endif - -*/ -} - -static void adc_default_config(adc_dev *dev) { - adc_enable_single_swstart(dev); - adc_set_sample_rate(dev, wirish::priv::w_adc_smp); -} - -static void setup_adcs(void) { - adc_set_prescaler(wirish::priv::w_adc_pre); - adc_foreach(adc_default_config); -} - -static void timer_default_config(timer_dev *dev) { - timer_adv_reg_map *regs = (dev->regs).adv; - const uint16 full_overflow = 0xFFFF; - const uint16 half_duty = 0x8FFF; - - timer_init(dev); - timer_pause(dev); - - regs->CR1 = TIMER_CR1_ARPE; - regs->PSC = 1; - regs->SR = 0; - regs->DIER = 0; - regs->EGR = TIMER_EGR_UG; - switch (dev->type) { - case TIMER_ADVANCED: - regs->BDTR = TIMER_BDTR_MOE | TIMER_BDTR_LOCK_OFF; - // fall-through - case TIMER_GENERAL: - timer_set_reload(dev, full_overflow); - for (uint8 channel = 1; channel <= 4; channel++) { - if (timer_has_cc_channel(dev, channel)) { - timer_set_compare(dev, channel, half_duty); - timer_oc_set_mode(dev, channel, TIMER_OC_MODE_PWM_1, - TIMER_OC_PE); - } - } - // fall-through - case TIMER_BASIC: - break; - } - - timer_generate_update(dev); - timer_resume(dev); -} - -static void setup_timers(void) { - timer_foreach(timer_default_config); -} diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp deleted file mode 100755 index c3f524720d..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2012 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. -*****************************************************************************/ - -/** - * @file wirish/stm32f1/boards_setup.cpp - * @author Marti Bolivar - * @brief STM32F1 chip setup. - * - * This file controls how init() behaves on the STM32F1. Be very - * careful when changing anything here. Many of these values depend - * upon each other. - */ - -#include "boards_private.h" - -#include -#include - -#include -#include - -// Allow boards to provide a PLL multiplier. This is useful for -// e.g. STM32F100 value line MCUs, which use slower multipliers. -// (We're leaving the default to RCC_PLLMUL_9 for now, since that -// works for F103 performance line MCUs, which is all that LeafLabs -// currently officially supports). -#ifndef BOARD_RCC_PLLMUL - #if !USE_HSI_CLOCK - #if F_CPU==128000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 - #elif F_CPU==72000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 - #elif F_CPU==48000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 - #elif F_CPU==16000000 - #define BOARD_RCC_PLLMUL RCC_PLLMUL_2 - #endif - #else - #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 - #endif -#endif - -namespace wirish { - namespace priv { - - static stm32f1_rcc_pll_data pll_data = {BOARD_RCC_PLLMUL}; -#if !USE_HSI_CLOCK - __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSE, &pll_data}; -#else - __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data}; -#endif - __weak adc_prescaler w_adc_pre = ADC_PRE_PCLK2_DIV_6; - __weak adc_smp_rate w_adc_smp = ADC_SMPR_55_5; - - __weak void board_reset_pll(void) { - // TODO - } - - __weak void board_setup_clock_prescalers(void) { - rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); - rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); - rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); - rcc_clk_disable(RCC_USB); -#if F_CPU == 72000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); -#elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); -#endif - } - - __weak void board_setup_gpio(void) { - /** - * PA14 is a pull up pin. But, some V5 boards it start with LOW state! And just behave properly when the Z- PROBE is actived at least once. - * So, if the sensor isnt actived, the PA14 pin will be forever in LOW state, telling Marlin the probe IS ALWAYS ACTIVE, that isnt the case! - * Chitu original firmware seems to start with every pullup PIN with HIGH to workaround this. - * So we are doing the same here. - * This hack only works if applied *before* the GPIO Init, it's the reason I did it here. - */ - #ifdef CHITU_V5_Z_MIN_BUGFIX - GPIOA->regs->BSRR = (1U << PA14); - #endif - gpio_init_all(); - } - - __weak void board_setup_usb(void) { -#ifdef SERIAL_USB -#ifdef GENERIC_BOOTLOADER - // Reset the USB interface on generic boards - developed by Victor PV - gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_OUTPUT_PP); - gpio_write_bit(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit,0); - - for (volatile unsigned int i = 0; i < 512; i++); // Only small delay seems to be needed, and USB pins will get configured in Serial.begin - gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_INPUT_FLOATING); -#endif - Serial.begin(); // Roger Clark. Changed SerialUSB to Serial for Arduino sketch compatibility -#endif - } - - __weak void series_init(void) { - // Initialize AFIO here, too, so peripheral remaps and external - // interrupts work out of the box. - afio_init(); - } - } -} diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start.S b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start.S deleted file mode 100755 index 8b181aa993..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start.S +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/* - * This file is a modified version of a file obtained from - * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the - * following text appeared: - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - */ - - .text - .code 16 - .thumb_func - - .globl __start__ - .type __start__, %function -__start__: - .fnstart - ldr r1,=__msp_init - mov sp,r1 - ldr r1,=start_c - bx r1 - .pool - .cantunwind - .fnend diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c deleted file mode 100755 index d305e6d5b9..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c +++ /dev/null @@ -1,144 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/* - * This file is a modified version of a file obtained from - * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the - * following text appeared: - * - * Copyright (c) 2006, 2007 CodeSourcery Inc - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - */ - -#include - -#include -#include -#include - -#include "rcc_private.h" - -#include -#include -#include "usart_private.h" - -#include -#include - -extern void __libc_init_array(void); - -extern int main(int, char**, char**); - -extern void exit(int) __attribute__((noreturn, weak)); - -/* The linker must ensure that these are at least 4-byte aligned. */ -extern char __data_start__, __data_end__; -extern char __bss_start__, __bss_end__; - -struct rom_img_cfg { - int *img_start; -}; - -extern char _lm_rom_img_cfgp; -extern void __lm_error(); -extern void timer_disable_all(); - - /* Turn off ADC */ -extern void adc_disable_all(); - - /* Turn off all USARTs */ -extern void usart_disable_all(); -extern void DisableEverything(); - -void __attribute__((noreturn)) start_c(void) { - struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; - int *src = img_cfg->img_start; - int *dst = (int*)&__data_start__; - int exit_code; - - asm("CPSID I"); - /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ - /* Set HSION bit */ - RCC_BASE->CR |= 0x00000001U; - - /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ - RCC_BASE->CFGR &= 0xF0FF0000U; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC_BASE->CR &= 0xFEF6FFFFU; - - /* Reset HSEBYP bit */ - RCC_BASE->CR &= 0xFFFBFFFFU; - - /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ - RCC_BASE->CFGR &= 0xFF80FFFFU; - - /* Disable all interrupts and clear pending bits */ - RCC_BASE->CIR = 0x009F0000U; - - USART1_BASE->CR1 = 0; - USART1_BASE->CR2 = 0; - USART1_BASE->CR3 = 0; - - memset(SDIO_BASE, 0, sizeof(sdio_reg_map)); - asm("CPSIE I"); - - /* Initialize .data, if necessary. */ - if (src != dst) { - int *end = (int*)&__data_end__; - while (dst < end) { - *dst++ = *src++; - } - } - - /* Zero .bss. */ - dst = (int*)&__bss_start__; - while (dst < (int*)&__bss_end__) { - *dst++ = 0; - } - - /* Run initializers. */ - __libc_init_array(); - - /* Jump to main. */ - exit_code = main(0, 0, 0); - if (exit) { - exit(exit_code); - } - - /* If exit is NULL, make sure we don't return. */ - for (;;) - continue; -} diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c deleted file mode 100755 index ec1c34dbad..0000000000 --- a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c +++ /dev/null @@ -1,176 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * Copyright (c) 2011, 2012 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file wirish/syscalls.c - * @brief newlib stubs - * - * Low level system routines used by newlib for basic I/O and memory - * allocation. You can override most of these. - */ - -#include - -#include -#include -#include - -/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then - * assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by - * the linker */ -#ifndef CONFIG_HEAP_START -extern char _lm_heap_start; -#define CONFIG_HEAP_START ((void *)&_lm_heap_start) -#endif -#ifndef CONFIG_HEAP_END -extern char _lm_heap_end; -#define CONFIG_HEAP_END ((void *)&_lm_heap_end) -#endif - -/* - * _sbrk -- Increment the program break. - * - * Get incr bytes more RAM (for use by the heap). malloc() and - * friends call this function behind the scenes. - */ -void *_sbrk(int incr) { - static void * pbreak = NULL; /* current program break */ - void * ret; - - if (pbreak == NULL) { - pbreak = CONFIG_HEAP_START; - } - - if ((CONFIG_HEAP_END - pbreak < incr) || - (pbreak - CONFIG_HEAP_START < -incr)) { - errno = ENOMEM; - return (void *)-1; - } - - ret = pbreak; - pbreak += incr; - return ret; -} - -__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { - return 1; -} - -__weak int _close(int fd __attribute__((unused))) { - return 0; -} - -__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { - st->st_mode = S_IFCHR; - return 0; -} - -__weak int _isatty(int fd __attribute__((unused))) { - return 1; -} - -__weak int isatty(int fd __attribute__((unused))) { - return 1; -} - -__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { - return -1; -} - -__weak unsigned char getch(void) { - return 0; -} - - -__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { - *buf = getch(); - - return 1; -} - -__weak void putch(unsigned char c __attribute__((unused))) { -} - -__weak void cgets(char *s, int bufsize) { - char *p; - int c; - int i; - - for (i = 0; i < bufsize; i++) { - *(s+i) = 0; - } -// memset(s, 0, bufsize); - - p = s; - - for (p = s; p < s + bufsize-1;) { - c = getch(); - switch (c) { - case '\r' : - case '\n' : - putch('\r'); - putch('\n'); - *p = '\n'; - return; - - case '\b' : - if (p > s) { - *p-- = 0; - putch('\b'); - putch(' '); - putch('\b'); - } - break; - - default : - putch(c); - *p++ = c; - break; - } - } - return; -} - -__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { - int i; - - for (i = 0; i < cnt; i++) - putch(buf[i]); - - return cnt; -} - -/* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { - cgets(s, bufsize); - return s; -} - -__weak void _exit(int exitcode __attribute__((unused))) { - while (1) - ; -} diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c deleted file mode 100644 index f0f2c4b80c..0000000000 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c +++ /dev/null @@ -1,404 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - * Automatically generated from STM32F407Z(E-G)Tx.xml - */ -#include -#include - -/* ===== - * Note: Commented lines are alternative possibilities which are not used per default. - * If you change them, you will have to know what you do - * ===== - */ - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -WEAK const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - //{PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - //{PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - //{PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - //{PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - //{PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - //{PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - //{PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - //{PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - //{PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - //{PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - //{PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - //{PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - //{PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - //{PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 - {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 - {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 - {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 - //{PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 - //{PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 - //{PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 - //{PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 - {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 - {NC, NP, 0} -}; -#endif - -//*** DAC *** - -#ifdef HAL_DAC_MODULE_ENABLED -WEAK const PinMap PinMap_DAC[] = { - //{PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - //{PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - {NC, NP, 0} -}; -#endif - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -WEAK const PinMap PinMap_I2C_SDA[] = { - {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - //{PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - //{PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - //{PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - //{PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_I2C_SCL[] = { - //{PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - //{PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - //{PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - //{PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -WEAK const PinMap PinMap_PWM[] = { - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - //{PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_TX[] = { - //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_UART_RX[] = { - //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - //{PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - //{PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_UART_RTS[] = { - //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_UART_CTS[] = { - //{PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - //{PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - //{PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_MOSI[] = { - {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - //{PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - //{PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - //{PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - //{PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - //{PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - //{PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - //{PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - //{PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - //{PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {NC, NP, 0} -}; -#endif - -//*** CAN *** - -#ifdef HAL_CAN_MODULE_ENABLED -WEAK const PinMap PinMap_CAN_RD[] = { - //{PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - //{PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - //{PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - //{PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - //{PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_CAN_TD[] = { - //{PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - //{PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - //{PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - //{PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - //{PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {NC, NP, 0} -}; -#endif - -//*** ETHERNET *** - -#ifdef HAL_ETH_MODULE_ENABLED -WEAK const PinMap PinMap_Ethernet[] = { - /* - {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS - {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK - {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO - {PA_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_COL - {PA_7, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS_DV|ETH_RX_DV - {PB_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD2 - {PB_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD3 - {PB_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT - {PB_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 - {PB_10, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RX_ER - {PB_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - {PB_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 - {PB_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 - {PC_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDC - {PC_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD2 - {PC_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_CLK - {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 - {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 - {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 - {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT - {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 - {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 - {NC, NP, 0} - */ -}; -#endif - -//*** No QUADSPI *** - -//*** USB *** - -#ifdef HAL_PCD_MODULE_ENABLED -WEAK const PinMap PinMap_USB_OTG_FS[] = { - //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID - {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM - {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_USB_OTG_HS[] = { - /* - #ifdef USE_USB_HS_IN_FS - {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM - {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP - #else - {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 - {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK - {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 - {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 - {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 - {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 - {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 - {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP - {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR - {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT - #endif // USE_USB_HS_IN_FS - */ - {NC, NP, 0} -}; -#endif diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PinNamesVar.h b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PinNamesVar.h deleted file mode 100644 index b4bb9d45f8..0000000000 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PinNamesVar.h +++ /dev/null @@ -1,50 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_OTG_FS_SOF = PA_8, - USB_OTG_FS_VBUS = PA_9, - USB_OTG_FS_ID = PA_10, - USB_OTG_FS_DM = PA_11, - USB_OTG_FS_DP = PA_12, - USB_OTG_HS_ULPI_D0 = PA_3, - USB_OTG_HS_SOF = PA_4, - USB_OTG_HS_ULPI_CK = PA_5, - USB_OTG_HS_ULPI_D1 = PB_0, - USB_OTG_HS_ULPI_D2 = PB_1, - USB_OTG_HS_ULPI_D7 = PB_5, - USB_OTG_HS_ULPI_D3 = PB_10, - USB_OTG_HS_ULPI_D4 = PB_11, - USB_OTG_HS_ID = PB_12, - USB_OTG_HS_ULPI_D5 = PB_12, - USB_OTG_HS_ULPI_D6 = PB_13, - USB_OTG_HS_VBUS = PB_13, - USB_OTG_HS_DM = PB_14, - USB_OTG_HS_DP = PB_15, - USB_OTG_HS_ULPI_STP = PC_0, - USB_OTG_HS_ULPI_DIR = PC_2, - USB_OTG_HS_ULPI_NXT = PC_3, -#endif diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/ldscript.ld b/buildroot/share/PlatformIO/variants/FLY_F407ZG/ldscript.ld deleted file mode 100644 index 40abfe19b5..0000000000 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/ldscript.ld +++ /dev/null @@ -1,207 +0,0 @@ -/* -***************************************************************************** -** - -** File : lscript.ld -** -** Abstract : Linker script for STM32F407(VZ)(EG)Tx Device with -** 512/1024KByte FLASH, 128KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2014 Ac6

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of Ac6 nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200;; /* required amount of heap */ -_Min_Stack_Size = 0x400;; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K -FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 1024K -32K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text ALIGN(4): - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata ALIGN(4): - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCMRAM AT> FLASH - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} - - diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp deleted file mode 100644 index 1c7aedd9ac..0000000000 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -const PinName digitalPin[] = { -PA_1, -PA_2, -PA_3, -PA_4, -PA_5, -PA_6, -PA_7, -PA_8, -PA_9, -PA_10, -PA_11, -PA_12, -PA_13, -PA_14, -PA_15, -PB_0, -PB_1, -PB_2, -PB_3, -PB_4, -PB_5, -PB_6, -PB_7, -PB_8, -PB_9, -PB_10, -PB_11, -PB_12, -PB_13, -PB_14, -PB_15, -PC_2, -PC_3, -PC_4, -PC_5, -PC_6, -PC_7, -PC_8, -PC_9, -PC_10, -PC_11, -PC_12, -PC_13, -PC_14, -PC_15, -PD_0, -PD_1, -PD_2, -PD_3, -PD_4, -PD_5, -PD_6, -PD_7, -PD_8, -PD_9, -PD_10, -PD_11, -PD_12, -PD_13, -PD_14, -PD_15, -PE_0, -PE_1, -PE_11, -PE_3, -PE_4, -PE_5, -PE_6, -PE_7, -PE_8, -PE_9, -PE_10, -PE_2, -PE_12, -PE_13, -PE_14, -PE_15, -PF_0, -PF_1, -PF_2, -PF_6, -PF_7, -PF_8, -PF_9, -PF_11, -PF_12, -PF_13, -PF_14, -PF_15, -PG_0, -PG_1, -PG_2, -PG_3, -PG_4, -PG_5, -PG_6, -PG_7, -PG_8, -PG_9, -PG_10, -PG_11, -PG_12, -PG_13, -PG_14, -PG_15, -PH_0, -PH_1, -PA_0, -PC_1, -PC_0, -PF_10, -PF_5, -PF_4, -PF_3, -}; - -#ifdef __cplusplus -} -#endif - -// ---------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief System Clock Configuration - * @param None - * @retval None - */ -WEAK void SystemClock_Config(void) -{ - - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; - - /**Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 8; - RCC_OscInitStruct.PLL.PLLN = 336; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 7; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } -} - -#ifdef __cplusplus -} -#endif diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h deleted file mode 100644 index ae973c89c5..0000000000 --- a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h +++ /dev/null @@ -1,239 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ - - -#define PA1 0 -#define PA2 1 -#define PA3 2 -#define PA4 3 -#define PA5 4 -#define PA6 5 -#define PA7 6 -#define PA8 7 -#define PA9 8 -#define PA10 9 -#define PA11 10 -#define PA12 11 -#define PA13 12 -#define PA14 13 -#define PA15 14 -#define PB0 15 -#define PB1 16 -#define PB2 17 -#define PB3 18 -#define PB4 19 -#define PB5 20 -#define PB6 21 -#define PB7 22 -#define PB8 23 -#define PB9 24 -#define PB10 25 -#define PB11 26 -#define PB12 27 -#define PB13 28 -#define PB14 29 -#define PB15 30 -#define PC2 31 -#define PC3 32 -#define PC4 33 -#define PC5 34 -#define PC6 35 -#define PC7 36 -#define PC8 37 -#define PC9 38 -#define PC10 39 -#define PC11 40 -#define PC12 41 -#define PC13 42 -#define PC14 43 -#define PC15 44 -#define PD0 45 -#define PD1 46 -#define PD2 47 -#define PD3 48 -#define PD4 49 -#define PD5 50 -#define PD6 51 -#define PD7 52 -#define PD8 53 -#define PD9 54 -#define PD10 55 -#define PD11 56 -#define PD12 57 -#define PD13 58 -#define PD14 59 -#define PD15 60 -#define PE0 61 -#define PE1 62 -#define PE11 63 -#define PE3 64 -#define PE4 65 -#define PE5 66 -#define PE6 67 -#define PE7 68 -#define PE8 69 -#define PE9 70 -#define PE10 71 -#define PE2 72 -#define PE12 73 -#define PE13 74 -#define PE14 75 -#define PE15 76 -#define PF0 77 -#define PF1 78 -#define PF2 79 -#define PF6 80 -#define PF7 81 -#define PF8 82 -#define PF9 83 -#define PF11 84 -#define PF12 85 -#define PF13 86 -#define PF14 87 -#define PF15 88 -#define PG0 89 -#define PG1 90 -#define PG2 91 -#define PG3 92 -#define PG4 93 -#define PG5 94 -#define PG6 95 -#define PG7 96 -#define PG8 97 -#define PG9 98 -#define PG10 99 -#define PG11 100 -#define PG12 101 -#define PG13 102 -#define PG14 103 -#define PG15 104 -#define PH0 105 -#define PH1 106 -#define PA0 107 -#define PC1 108 -#define PC0 109 -#define PF10 110 -#define PF5 111 -#define PF4 112 -#define PF3 113 - -// This must be a literal -#define NUM_DIGITAL_PINS 114 -// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS 7 -#define NUM_ANALOG_FIRST 107 - - -// Below SPI and I2C definitions already done in the core -// Could be redefined here if differs from the default one -// SPI Definitions -#define PIN_SPI_SS PF11 -#define PIN_SPI_MOSI PB15 -#define PIN_SPI_MISO PB14 -#define PIN_SPI_SCK PB13 - - - -//max6675 -//#define PIN_SPI_SS PA4 -//#define PIN_SPI_SCK PA5 -//#define PIN_SPI_MISO PA6 -//#define PIN_SPI_MOSI PA7 - - - - -// I2C Definitions -#define PIN_WIRE_SDA PB7 -#define PIN_WIRE_SCL PB6 - -// Timer Definitions -//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c -#define TIMER_TONE TIM6 - -// Do not use basic timer: OC is required -#define TIMER_SERVO TIM1 //TODO: advanced-control timers don't work - -// UART Definitions -// Define here Serial instance number to map on Serial generic name -#define SERIAL_UART_INSTANCE 1 //ex: 2 for Serial2 (USART2) -// DEBUG_UART could be redefined to print on another instance than 'Serial' -//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 -// DEBUG_UART baudrate, default: 9600 if not defined -//#define DEBUG_UART_BAUDRATE x -// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART -//#define DEBUG_PINNAME_TX PX_n // PinName used for TX - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#define PIN_SERIAL_RX PA10 -#define PIN_SERIAL_TX PA9 - -/* Extra HAL modules */ -//#define HAL_DAC_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED - -#ifdef __cplusplus -} // extern "C" -#endif -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_HARDWARE Serial1 -#endif - diff --git a/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c deleted file mode 100644 index 8cb0776ffa..0000000000 --- a/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c +++ /dev/null @@ -1,418 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - * Automatically generated from STM32F407Z(E-G)Tx.xml - */ -#include -#include - -/* ===== - * Note: Commented lines are alternative possibilities which are not used per default. - * If you change them, you will have to know what you do - * ===== - */ - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - //{PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - //{PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - //{PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - //{PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - //{PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - //{PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - //{PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - //{PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - //{PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 - {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 - {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 - {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 - {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 - {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 - {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 - //{PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 - {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 - {NC, NP, 0} -}; -#endif - -//*** DAC *** - -#ifdef HAL_DAC_MODULE_ENABLED -const PinMap PinMap_DAC[] = { - {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - {NC, NP, 0} -}; -#endif - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SDA[] = { - {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SCL[] = { - {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -const PinMap PinMap_PWM[] = { - {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_TX[] = { - {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_RX[] = { - {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_RTS[] = { - {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_CTS[] = { - {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MOSI[] = { - {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {NC, NP, 0} -}; -#endif - -//*** CAN *** - -#ifdef HAL_CAN_MODULE_ENABLED -const PinMap PinMap_CAN_RD[] = { - {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_CAN_MODULE_ENABLED -const PinMap PinMap_CAN_TD[] = { - {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {NC, NP, 0} -}; -#endif - -//*** ETHERNET *** - -#ifdef HAL_ETH_MODULE_ENABLED -const PinMap PinMap_Ethernet[] = { - {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS - {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK - {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO - {PA_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_COL - {PA_7, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS_DV|ETH_RX_DV - {PB_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD2 - {PB_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD3 - {PB_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT - {PB_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 - {PB_10, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RX_ER - {PB_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - {PB_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 - {PB_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 - {PC_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDC - {PC_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD2 - {PC_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_CLK - {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 - {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 - {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 - {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT - {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 - {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 - {NC, NP, 0} -}; -#endif - -//*** No QUADSPI *** - -//*** USB *** - -#ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_FS[] = { - //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID - {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM - {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP - {NC, NP, 0} -}; -#endif - -#ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_HS[] = { -#ifdef USE_USB_HS_IN_FS - {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM - {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP -#else - {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 - {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK - {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 - {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 - {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 - {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 - {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 - {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP - {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR - {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT -#endif /* USE_USB_HS_IN_FS */ - {NC, NP, 0} -}; -#endif diff --git a/buildroot/share/PlatformIO/variants/LERDGE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/LERDGE/PinNamesVar.h deleted file mode 100644 index b4bb9d45f8..0000000000 --- a/buildroot/share/PlatformIO/variants/LERDGE/PinNamesVar.h +++ /dev/null @@ -1,50 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_OTG_FS_SOF = PA_8, - USB_OTG_FS_VBUS = PA_9, - USB_OTG_FS_ID = PA_10, - USB_OTG_FS_DM = PA_11, - USB_OTG_FS_DP = PA_12, - USB_OTG_HS_ULPI_D0 = PA_3, - USB_OTG_HS_SOF = PA_4, - USB_OTG_HS_ULPI_CK = PA_5, - USB_OTG_HS_ULPI_D1 = PB_0, - USB_OTG_HS_ULPI_D2 = PB_1, - USB_OTG_HS_ULPI_D7 = PB_5, - USB_OTG_HS_ULPI_D3 = PB_10, - USB_OTG_HS_ULPI_D4 = PB_11, - USB_OTG_HS_ID = PB_12, - USB_OTG_HS_ULPI_D5 = PB_12, - USB_OTG_HS_ULPI_D6 = PB_13, - USB_OTG_HS_VBUS = PB_13, - USB_OTG_HS_DM = PB_14, - USB_OTG_HS_DP = PB_15, - USB_OTG_HS_ULPI_STP = PC_0, - USB_OTG_HS_ULPI_DIR = PC_2, - USB_OTG_HS_ULPI_NXT = PC_3, -#endif diff --git a/buildroot/share/PlatformIO/variants/LERDGE/variant.cpp b/buildroot/share/PlatformIO/variants/LERDGE/variant.cpp deleted file mode 100644 index ebc1922eb8..0000000000 --- a/buildroot/share/PlatformIO/variants/LERDGE/variant.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -const PinName digitalPin[] = { - PB_12, - PB_13, - PB_14, - PB_15, - PD_8, - PD_9, - PD_10, - PD_11, - PD_12, - PD_13, - PD_14, - PD_15, - PG_2, - PG_3, - PG_4, - PG_5, - PG_6, - PG_7, - PG_8, - PC_6, - PC_7, - PC_8, - PC_9, - PA_8, - PA_9, - PA_10, - PA_11, - PA_12, - PA_13, - PA_14, - PA_15, - PC_10, - PC_11, - PC_12, - PD_0, - PD_1, - PD_2, - PD_3, - PD_4, - PD_5, - PD_6, - PD_7, - PG_9, - PG_10, - PG_11, - PG_12, - PG_13, - PG_14, - PG_15, - PB_3, - PB_4, - PB_5, - PB_6, - PB_7, - PB_8, - PB_9, - PB_10, - PB_11, - PE_14, - PE_15, - PE_12, - PE_13, - PE_10, - PE_11, - PE_8, - PE_9, - PG_1, - PE_7, - PF_15, - PG_0, - PF_13, - PF_14, - PF_11, - PF_12, - PB_2, - PB_1, - PC_5, - PB_0, - PA_7, - PC_4, - PA_5, - PA_6, - PA_3, - PA_4, - PA_1, - PA_2, - PC_3, - PA_0, - PC_1, - PC_2, - PC_0, - PF_8, - PF_6, - PF_7, - PF_9, - PF_10, - PF_4, - PF_5, - PF_2, - PF_3, - PF_0, - PF_1, - PE_6, - PC_13, - PE_4, - PE_5, - PE_2, - PE_3, - PE_0, - PE_1, - PC_14, - PC_15, -}; - -#ifdef __cplusplus -} -#endif - -// ---------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -#define __fatal_error(X) - - -/** - * @brief System Clock Configuration - * - * The system Clock is configured for F4/F7 as follows: - * System Clock source = PLL (HSE) - * SYSCLK(Hz) = 168000000 - * HCLK(Hz) = 168000000 - * AHB Prescaler = 1 - * APB1 Prescaler = 4 - * APB2 Prescaler = 2 - * HSE Frequency(Hz) = HSE_VALUE - * PLL_M = HSE_VALUE/1000000 - * PLL_N = 336 - * PLL_P = 2 - * PLL_Q = 7 - * VDD(V) = 3.3 - * Main regulator output voltage = Scale1 mode - * Flash Latency(WS) = 5 - * - * The system Clock is configured for L4 as follows: - * System Clock source = PLL (MSI) - * SYSCLK(Hz) = 80000000 - * HCLK(Hz) = 80000000 - * AHB Prescaler = 1 - * APB1 Prescaler = 1 - * APB2 Prescaler = 1 - * MSI Frequency(Hz) = MSI_VALUE (4000000) - * LSE Frequency(Hz) = 32768 - * PLL_M = 1 - * PLL_N = 40 - * PLL_P = 7 - * PLL_Q = 2 - * PLL_R = 2 <= This is the source for SysClk, not as on F4/7 PLL_P - * Flash Latency(WS) = 4 - * @param None - * @retval None - * - * PLL is configured as follows: - * - * VCO_IN - * F4/F7 = HSE / M - * L4 = MSI / M - * VCO_OUT - * F4/F7 = HSE / M * N - * L4 = MSI / M * N - * PLLCLK - * F4/F7 = HSE / M * N / P - * L4 = MSI / M * N / R - * PLL48CK - * F4/F7 = HSE / M * N / Q - * L4 = MSI / M * N / Q USB Clock is obtained over PLLSAI1 - * - * SYSCLK = PLLCLK - * HCLK = SYSCLK / AHB_PRESC - * PCLKx = HCLK / APBx_PRESC - * - * Constraints on parameters: - * - * VCO_IN between 1MHz and 2MHz (2MHz recommended) - * VCO_OUT between 192MHz and 432MHz - * HSE = 8MHz - * M = 2 .. 63 (inclusive) - * N = 192 ... 432 (inclusive) - * P = 2, 4, 6, 8 - * Q = 2 .. 15 (inclusive) - * - * AHB_PRESC=1,2,4,8,16,64,128,256,512 - * APBx_PRESC=1,2,4,8,16 - * - * Output clocks: - * - * CPU SYSCLK max 168MHz - * USB,RNG,SDIO PLL48CK must be 48MHz for USB - * AHB HCLK max 168MHz - * APB1 PCLK1 max 42MHz - * APB2 PCLK2 max 84MHz - * - * Timers run from APBx if APBx_PRESC=1, else 2x APBx - */ -void SystemClock_Config(void) -{ - RCC_ClkInitTypeDef RCC_ClkInitStruct; - RCC_OscInitTypeDef RCC_OscInitStruct; - - __PWR_CLK_ENABLE(); - - /* The voltage scaling allows optimizing the power consumption when the device is - clocked below the maximum system frequency, to update the voltage scaling value - regarding system frequency refer to product datasheet. */ - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /* Enable HSE Oscillator and activate PLL with HSE as source */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.HSIState = RCC_HSI_OFF; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 - clocks dividers */ - RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - - RCC_OscInitStruct.PLL.PLLM = 25; - RCC_OscInitStruct.PLL.PLLN = 336; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 7; - - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - - if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - __fatal_error("HAL_RCC_OscConfig"); - } - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) - { - __fatal_error("HAL_RCC_ClockConfig"); - } - - /**Configure the Systick interrupt time */ - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); - - /**Configure the Systick */ - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); -} - -#ifdef __cplusplus -} -#endif diff --git a/buildroot/share/PlatformIO/variants/LERDGE/variant.h b/buildroot/share/PlatformIO/variants/LERDGE/variant.h deleted file mode 100644 index 87033a68e5..0000000000 --- a/buildroot/share/PlatformIO/variants/LERDGE/variant.h +++ /dev/null @@ -1,238 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ - -// Left Side -#define PB12 0 -#define PB13 1 -#define PB14 2 -#define PB15 3 -#define PD8 4 -#define PD9 5 -#define PD10 6 -#define PD11 7 -#define PD12 8 -#define PD13 9 -#define PD14 10 -#define PD15 11 -#define PG2 12 -#define PG3 13 -#define PG4 14 -#define PG5 15 -#define PG6 16 -#define PG7 17 -#define PG8 18 -#define PC6 19 -#define PC7 20 -#define PC8 21 -#define PC9 22 -#define PA8 23 -#define PA9 24 -#define PA10 25 -#define PA11 26 // USB_DM -#define PA12 27 // USB_DP -#define PA13 28 -#define PA14 29 -#define PA15 30 -#define PC10 31 -#define PC11 32 -#define PC12 33 -#define PD0 34 -#define PD1 35 -#define PD2 36 -#define PD3 37 -#define PD4 38 -#define PD5 39 -#define PD6 40 -#define PD7 41 -#define PG9 42 -#define PG10 43 -#define PG11 44 -#define PG12 45 -#define PG13 46 -#define PG14 47 -#define PG15 48 -#define PB3 49 -#define PB4 50 -#define PB5 51 -#define PB6 52 -#define PB7 53 -#define PB8 54 -#define PB9 55 - -// Right Side -#define PB10 56 -#define PB11 57 -#define PE14 58 -#define PE15 59 -#define PE12 60 -#define PE13 61 -#define PE10 62 -#define PE11 63 -#define PE8 64 -#define PE9 65 -#define PG1 66 -#define PE7 67 -#define PF15 68 -#define PG0 69 -#define PF13 70 -#define PF14 71 -#define PF11 72 -#define PF12 73 -#define PB2 74 -#define PB1 75 // A0 -#define PC5 76 // A1 -#define PB0 77 // A2 -#define PA7 78 // A3 -#define PC4 79 // A4 -#define PA5 80 // A5 -#define PA6 81 // A6 -#define PA3 82 // A7 -#define PA4 83 // A8 -#define PA1 84 // A9 -#define PA2 85 // A10 -#define PC3 86 // A11 -#define PA0 87 // A12/PA_0(WK_UP): BUT K_UP) -#define PC1 88 // A13 -#define PC2 89 // A14 -#define PC0 90 // A15 -#define PF8 91 // A16 -#define PF6 92 // A17 -#define PF7 93 // A18 -#define PF9 94 // LED D1 (active low) -#define PF10 95 // LED D2 (active low) -#define PF4 96 -#define PF5 97 -#define PF2 98 -#define PF3 99 -#define PF0 100 -#define PF1 101 -#define PE6 102 -#define PC13 103 -#define PE4 104 // BUT K0 -#define PE5 105 // BUT K1 -#define PE2 106 -#define PE3 107 -#define PE0 108 -#define PE1 109 -#define PC14 110 -#define PC15 111 -// This must be a literal -#define NUM_DIGITAL_PINS 112 -// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS 23 -#define NUM_ANALOG_FIRST 75 - - -// Below SPI and I2C definitions already done in the core -// Could be redefined here if differs from the default one -// SPI Definitions -#define PIN_SPI_SS PF11 -#define PIN_SPI_MOSI PB15 -#define PIN_SPI_MISO PB14 -#define PIN_SPI_SCK PB13 - - - -//max6675 -//#define PIN_SPI_SS PA4 -//#define PIN_SPI_SCK PA5 -//#define PIN_SPI_MISO PA6 -//#define PIN_SPI_MOSI PA7 - - - - -// I2C Definitions -#define PIN_WIRE_SDA PB7 -#define PIN_WIRE_SCL PB6 - -// Timer Definitions -//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c -#define TIMER_TONE TIM6 - -// Do not use basic timer: OC is required -#define TIMER_SERVO TIM1 //TODO: advanced-control timers don't work - -// UART Definitions -// Define here Serial instance number to map on Serial generic name -#define SERIAL_UART_INSTANCE 1 //ex: 2 for Serial2 (USART2) -// DEBUG_UART could be redefined to print on another instance than 'Serial' -//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 -// DEBUG_UART baudrate, default: 9600 if not defined -//#define DEBUG_UART_BAUDRATE x -// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART -//#define DEBUG_PINNAME_TX PX_n // PinName used for TX - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#define PIN_SERIAL_RX PA10 -#define PIN_SERIAL_TX PA9 - -/* Extra HAL modules */ -//#define HAL_DAC_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED - -#ifdef __cplusplus -} // extern "C" -#endif -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_HARDWARE Serial1 -#endif - diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c deleted file mode 100644 index c9d2bb88b8..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c +++ /dev/null @@ -1,425 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2020, STMicroelectronics - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - * Automatically generated from STM32F103V(F-G)Tx.xml - */ -#include "Arduino.h" -#include "PeripheralPins.h" - -/* ===== - * Note: Commented lines are alternative possibilities which are not used per default. - * If you change them, you will have to know what you do - * ===== - */ - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -WEAK const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 -#endif - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 -#endif - {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 -#endif - {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 -#endif - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 -#endif - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 -#endif - {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 -#endif - {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 -#endif - {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 - {NC, NP, 0} -}; -#endif - -//*** DAC *** - -#if defined(STM32F103xE) || defined(STM32F103xG) -#ifdef HAL_DAC_MODULE_ENABLED -WEAK const PinMap PinMap_DAC[] = { - {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - {NC, NP, 0} -}; -#endif -#endif - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -WEAK const PinMap PinMap_I2C_SDA[] = { - {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, - {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_I2C_MODULE_ENABLED -WEAK const PinMap PinMap_I2C_SCL[] = { - {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, - {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -WEAK const PinMap PinMap_PWM[] = { - {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 -#endif - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM2_CH2 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM5_CH2 -#endif - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM2_CH3 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 -#endif -#ifdef STM32F103xG - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 -#endif - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 - {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM5_CH4 -#else - {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 -#endif -#if defined(STM32F103xG) - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 -#endif - {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM3_CH1 -#if defined(STM32F103xG) - // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 -#endif - {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 - // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM8_CH1N -#if defined(STM32F103xG) - // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 -#endif - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM1_CH1 - // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 - {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM1_CH2 - // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 - {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM1_CH3 - // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 - {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM1_CH4 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 - {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 1, 0)}, // TIM2_CH1 - // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM3_CH3 - // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM8_CH2N -#endif - {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N -#endif - {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 2, 0)}, // TIM2_CH2 - // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 - {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 1, 0)}, // TIM3_CH1 - {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 2, 0)}, // TIM3_CH2 - {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM4_CH1 - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM4_CH2 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM4_CH3 -#if defined(STM32F103xG) - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 -#endif - {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM4_CH4 -#if defined(STM32F103xG) - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 -#endif - {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 3, 0)}, // TIM2_CH3 - // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 3, 0)}, // TIM2_CH3 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 4, 0)}, // TIM2_CH4 - // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 4, 0)}, // TIM2_CH4 - {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM1_CH1N - {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM1_CH2N -#if defined(STM32F103xG) - // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 -#endif - {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM1_CH3N -#if defined(STM32F103xG) - // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 -#endif - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 1, 0)}, // TIM3_CH1 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM8_CH1 -#endif - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 2, 0)}, // TIM3_CH2 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM8_CH2 -#endif - {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 - {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 4, 0)}, // TIM3_CH4 -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 -#endif - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 4, 0)}, // TIM4_CH4 -#if defined(STM32F103xG) - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 2, 0)}, // TIM9_CH2 -#endif - {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 1)}, // TIM1_CH1N - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 0)}, // TIM1_CH1 - {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 1)}, // TIM1_CH2N - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 0)}, // TIM1_CH2 - {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 1)}, // TIM1_CH3N - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 4, 0)}, // TIM1_CH4 - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_TX[] = { - {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART1_ENABLE)}, - {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, - {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#else - {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, -#endif -#if defined(STM32F103xE) || defined(STM32F103xG) - {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#endif - {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, - {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_RX[] = { - {PA_3, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, - {PA_10, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, - {PB_7, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART1_ENABLE)}, - {PB_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, - {PC_11, UART4, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, -#else - {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, -#endif -#if defined(STM32F103xE) || defined(STM32F103xG) - {PD_2, UART5, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, -#endif - {PD_6, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART2_ENABLE)}, - {PD_9, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_ENABLE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_RTS[] = { - {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, - {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, - {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_CTS[] = { - {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, - {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, - {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_MOSI[] = { - {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, - {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#else - {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, -#endif - {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, - {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#else - {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, -#endif - {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, - {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#else - {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, -#endif - {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#if defined(STM32F103xE) || defined(STM32F103xG) - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, - {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, -#else - {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, -#endif - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -//*** CAN *** - -#ifdef HAL_CAN_MODULE_ENABLED -WEAK const PinMap PinMap_CAN_RD[] = { - {PA_11, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, - {PB_8, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_2)}, - {PD_0, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_3)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_CAN_MODULE_ENABLED -WEAK const PinMap PinMap_CAN_TD[] = { - {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, - {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_2)}, - {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_3)}, - {NC, NP, 0} -}; -#endif - -//*** No ETHERNET *** - -//*** No QUADSPI *** - -//*** USB *** - -#ifdef HAL_PCD_MODULE_ENABLED -WEAK const PinMap PinMap_USB[] = { - {PA_11, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DM - {PA_12, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DP - {NC, NP, 0} -}; -#endif - -//*** No USB_OTG_FS *** - -//*** No USB_OTG_HS *** - -//*** SD *** - -#if defined(STM32F103xE) || defined(STM32F103xG) -#ifdef HAL_SD_MODULE_ENABLED -WEAK const PinMap PinMap_SD[] = { - {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D4 - {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D5 - {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D6 - {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D7 - {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D0 - {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D1 - {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D2 - {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D3 - {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CK - {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CMD - {NC, NP, 0} -}; -#endif -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h deleted file mode 100644 index d9076b4dfb..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PinNamesVar.h +++ /dev/null @@ -1,30 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_DM = PA_11, - USB_DP = PA_12, -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld deleted file mode 100644 index c9197c8b45..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/ldscript.ld +++ /dev/null @@ -1,200 +0,0 @@ -/* -****************************************************************************** -** - -** File : LinkerScript.ld -** -** Author : Auto-generated by STM32CubeIDE -** -** Abstract : Linker script for STM32F103V(8/B/C/E/F/GTx Device from STM32F1 series -** 64/128/256/512/768/1024Kbytes FLASH -** 20/20/48/64/64/96/96Kbytes RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** Distribution: The file is distributed as is without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2019 STMicroelectronics

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of STMicroelectronics nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of "RAM" Ram type memory */ -_Min_Heap_Size = 0x200; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Memories definition */ -MEMORY -{ - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE - FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET -} - -/* Sections */ -SECTIONS -{ - /* The startup code into "FLASH" Rom type memory */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data into "FLASH" Rom type memory */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data into "FLASH" Rom type memory */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { - . = ALIGN(4); - *(.ARM.extab* .gnu.linkonce.armextab.*) - . = ALIGN(4); - } >FLASH - .ARM : { - . = ALIGN(4); - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - . = ALIGN(4); - } >FLASH - - .preinit_array : - { - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - } >FLASH - .init_array : - { - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - } >FLASH - .fini_array : - { - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - . = ALIGN(4); - } >FLASH - - /* Used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections into "RAM" Ram type memory */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - - /* Uninitialized data section into "RAM" Ram type memory */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ - ._user_heap_stack : - { - . = ALIGN(8); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(8); - } >RAM - - - - /* Remove information from the compiler libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} - diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp deleted file mode 100644 index 25b4b51145..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.cpp +++ /dev/null @@ -1,235 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Digital PinName array -const PinName digitalPin[] = { - PA_0, //D0 - PA_1, //D1 - PA_2, //D2 - PA_3, //D3 - PA_4, //D4 - PA_5, //D5 - PA_6, //D6 - PA_7, //D7 - PA_8, //D8 - PA_9, //D9 - PA_10, //D10 - PA_11, //D11 - PA_12, //D12 - PA_13, //D13 - PA_14, //D14 - PA_15, //D15 - - PB_0, //D16 - PB_1, //D17 - PB_2, //D18 - PB_3, //D19 - PB_4, //D20 - PB_5, //D21 - PB_6, //D22 - PB_7, //D23 - PB_8, //D24 - PB_9, //D25 - PB_10, //D26 - PB_11, //D27 - PB_12, //D28 - PB_13, //D29 - PB_14, //D30 - PB_15, //D31 - - PC_0, //D32 - PC_1, //D33 - PC_2, //D34 - PC_3, //D35 - PC_4, //D36 - PC_5, //D37 - PC_6, //D38 - PC_7, //D39 - PC_8, //D40 - PC_9, //D41 - PC_10, //D42 - PC_11, //D43 - PC_12, //D44 - PC_13, //D45 - PC_14, //D46 - PC_15, //D47 - - PD_0, //D48 - PD_1, //D49 - PD_2, //D50 - PD_3, //D51 - PD_4, //D52 - PD_5, //D53 - PD_6, //D54 - PD_7, //D55 - PD_8, //D56 - PD_9, //D57 - PD_10, //D58 - PD_11, //D59 - PD_12, //D60 - PD_13, //D61 - PD_14, //D62 - PD_15, //D63 - - PE_0, //D64 - PE_1, //D65 - PE_2, //D66 - PE_3, //D67 - PE_4, //D68 - PE_5, //D69 - PE_6, //D70 - PE_7, //D71 - PE_8, //D72 - PE_9, //D73 - PE_10, //D74 - PE_11, //D75 - PE_12, //D76 - PE_13, //D77 - PE_14, //D78 - PE_15, //D79 -}; - -// Analog (Ax) pin number array -const uint32_t analogInputPin[] = { - 0, // A0, PA0 - 1, // A1, PA1 - 2, // A2, PA2 - 3, // A3, PA3 - 4, // A4, PA4 - 5, // A5, PA5 - 6, // A6, PA6 - 7, // A7, PA7 - 16, // A8, PB0 - 17, // A9, PB1 - 32, // A10, PC0 - 33, // A11, PC1 - 34, // A12, PC2 - 35, // A13, PC3 - 36, // A14, PC4 - 37, // A15, PC5 -}; - -/******************************************************************************/ -/* PLL (clocked by HSE) used as System clock source */ -/******************************************************************************/ -static bool SetSysClock_PLL_HSE(bool bypass) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; - bool ret = false; - - /* Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - if (bypass == false) { - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - } else { - RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; - } - RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { - /* Initializes the CPU, AHB and APB busses clocks */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) == HAL_OK) { - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB; - PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; - PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) == HAL_OK) { - ret = true; - } - } - } - return ret; -} - -/******************************************************************************/ -/* PLL (clocked by HSI) used as System clock source */ -/******************************************************************************/ -bool SetSysClock_PLL_HSI(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; - bool ret = false; - - /* Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSEState = RCC_HSE_OFF; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) { - /* Initializes the CPU, AHB and APB busses clocks */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) == HAL_OK) { - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB; - PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV4; - PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) == HAL_OK) { - ret = true; - } - } - } - return ret; -} - -WEAK void SystemClock_Config(void) -{ - /* - * If HSE_VALUE is not 8MHz and you want use it, then: - * - Redefine HSE_VALUE to the correct HSE_VALUE - * - Redefine SystemClock_Config() with the correct settings - */ -#if HSE_VALUE == 8000000U - /* 1- Try to start with HSE and external 8MHz xtal */ - if (SetSysClock_PLL_HSE(false) == false) { - /* 2- If fail try to start with HSE and external clock */ - if (SetSysClock_PLL_HSE(true) == false) { -#endif - /* 3- If fail start with HSI clock */ - if (SetSysClock_PLL_HSI() == false) { - Error_Handler(); - } -#if HSE_VALUE == 8000000U - } - } -#endif -} - -#ifdef __cplusplus -} -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h deleted file mode 100644 index b622b39376..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/variant.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -#ifndef _VARIANT_ARDUINO_STM32_ -#define _VARIANT_ARDUINO_STM32_ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ -#define PA0 0 -#define PA1 1 -#define PA2 2 -#define PA3 3 -#define PA4 4 -#define PA5 5 -#define PA6 6 -#define PA7 7 -#define PA8 8 -#define PA9 9 -#define PA10 10 -#define PA11 11 -#define PA12 12 -#define PA13 13 -#define PA14 14 -#define PA15 15 - -#define PB0 16 -#define PB1 17 -#define PB2 18 -#define PB3 19 -#define PB4 20 -#define PB5 21 -#define PB6 22 -#define PB7 23 -#define PB8 24 -#define PB9 25 -#define PB10 26 -#define PB11 27 -#define PB12 28 -#define PB13 29 -#define PB14 30 -#define PB15 31 - -#define PC0 32 -#define PC1 33 -#define PC2 34 -#define PC3 35 -#define PC4 36 -#define PC5 37 -#define PC6 38 -#define PC7 39 -#define PC8 40 -#define PC9 41 -#define PC10 42 -#define PC11 43 -#define PC12 44 -#define PC13 45 -#define PC14 46 -#define PC15 47 - -#define PD0 48 -#define PD1 49 -#define PD2 50 -#define PD3 51 -#define PD4 52 -#define PD5 53 -#define PD6 54 -#define PD7 55 -#define PD8 56 -#define PD9 57 -#define PD10 58 -#define PD11 59 -#define PD12 60 -#define PD13 61 -#define PD14 62 -#define PD15 63 - -#define PE0 64 -#define PE1 65 -#define PE2 66 -#define PE3 67 -#define PE4 68 -#define PE5 69 -#define PE6 70 -#define PE7 71 -#define PE8 72 -#define PE9 73 -#define PE10 74 -#define PE11 75 -#define PE12 76 -#define PE13 77 -#define PE14 78 -#define PE15 79 - -// This must be a literal -#define NUM_DIGITAL_PINS 80 -#define NUM_ANALOG_INPUTS 16 - -// On-board LED pin number -#ifndef LED_BUILTIN -#define LED_BUILTIN PB11 -#endif - -// On-board user button -#ifndef USER_BTN -#define USER_BTN PC13 -#endif - -// SPI Definitions -#define PIN_SPI_SS PC4 -#define PIN_SPI_MOSI PA7 -#define PIN_SPI_MISO PA6 -#define PIN_SPI_SCK PA5 - -// I2C Definitions -#define PIN_WIRE_SDA PB7 -#define PIN_WIRE_SCL PB6 - -// Timer Definitions (optional) -// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin -#define TIMER_TONE TIM3 -#define TIMER_SERVO TIM2 - -// UART Definitions -// Define here Serial instance number to map on Serial generic name -#define SERIAL_UART_INSTANCE 1 - -// Extra HAL modules -#if defined(STM32F103xE) || defined(STM32F103xG) -#define HAL_DAC_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED -#define HAL_SRAM_MODULE_ENABLED -#endif - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#define PIN_SERIAL_RX PA10 -#define PIN_SERIAL_TX PA9 - -#ifdef __cplusplus -} // extern "C" -#endif -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus - // These serial port names are intended to allow libraries and architecture-neutral - // sketches to automatically default to the correct port name for a particular type - // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, - // the first hardware serial port whose RX/TX pins are not dedicated to another use. - // - // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor - // - // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial - // - // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library - // - // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. - // - // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX - // pins are NOT connected to anything by default. - #define SERIAL_PORT_MONITOR Serial - #define SERIAL_PORT_HARDWARE Serial1 -#endif - -#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c deleted file mode 100644 index 5736e5206e..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PeripheralPins.c +++ /dev/null @@ -1,368 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - * Automatically generated from STM32F103Z(C-D-E|F-G))Tx.xml - */ -#include "Arduino.h" -#include "PeripheralPins.h" - -/* ===== - * Note: Commented lines are alternative possibilities which are not used per default. - * If you change them, you will have to know what you do - * ===== - */ - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -WEAK const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - // {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - // {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 - {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 - {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 - {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 - {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 - {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 - {NC, NP, 0} -}; -#endif - -//*** DAC *** - -#ifdef HAL_DAC_MODULE_ENABLED -WEAK const PinMap PinMap_DAC[] = { - {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - {NC, NP, 0} -}; -#endif - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -WEAK const PinMap PinMap_I2C_SDA[] = { - {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, - {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_I2C_MODULE_ENABLED -WEAK const PinMap PinMap_I2C_SCL[] = { - {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_I2C1_ENABLE)}, - {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -WEAK const PinMap PinMap_PWM[] = { - {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM2_CH2 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 2, 0)}, // TIM2_CH2 - {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM5_CH2 - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM2_CH3 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 3, 0)}, // TIM2_CH3 - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM5_CH3 -#ifdef STM32F103xG - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM9_CH1 -#endif - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM2_CH4 - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 4, 0)}, // TIM2_CH4 - {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM5_CH4 -#ifdef STM32F103xG - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM9_CH2 -#endif - {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM3_CH1 -#ifdef STM32F103xG - // {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM13_CH1 -#endif - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM3_CH2 - {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM8_CH1N -#ifdef STM32F103xG - // {PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM14_CH1 -#endif - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM1_CH1 - // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 1, 0)}, // TIM1_CH1 - {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM1_CH2 - // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 0)}, // TIM1_CH2 - {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM1_CH3 - // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 0)}, // TIM1_CH3 - {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM1_CH4 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 4, 0)}, // TIM1_CH4 - {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 1, 0)}, // TIM2_CH1 - // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 2, 1)}, // TIM1_CH2N - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM3_CH3 - // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 3, 0)}, // TIM3_CH3 - {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM8_CH2N - {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_PARTIAL, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 4, 0)}, // TIM3_CH4 - // {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM8_CH3N - {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_1, 2, 0)}, // TIM2_CH2 - // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 2, 0)}, // TIM2_CH2 - {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 1, 0)}, // TIM3_CH1 - {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_PARTIAL, 2, 0)}, // TIM3_CH2 - {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM4_CH1 - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM4_CH2 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM4_CH3 -#ifdef STM32F103xG - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM10_CH1 -#endif - {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM4_CH4 -#ifdef STM32F103xG - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM11_CH1 -#endif - // {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 3, 0)}, // TIM2_CH3 - {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 3, 0)}, // TIM2_CH3 - // {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_PARTIAL_2, 4, 0)}, // TIM2_CH4 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM2_ENABLE, 4, 0)}, // TIM2_CH4 - {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 1)}, // TIM1_CH1N - {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 1)}, // TIM1_CH2N -#ifdef STM32F103xG - // {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM12_CH1 -#endif - {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 1)}, // TIM1_CH3N -#ifdef STM32F103xG - // {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM12_CH2 -#endif - // {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 1, 0)}, // TIM3_CH1 - {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 1, 0)}, // TIM8_CH1 - // {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 2, 0)}, // TIM3_CH2 - {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 2, 0)}, // TIM8_CH2 - {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 3, 0)}, // TIM8_CH3 - {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM3_ENABLE, 4, 0)}, // TIM3_CH4 - // {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE, 4, 0)}, // TIM8_CH4 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM4_ENABLE, 4, 0)}, // TIM4_CH4 -#ifdef STM32F103xG - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM9_ENABLE, 2, 0)}, // TIM9_CH2 -#endif - {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 1)}, // TIM1_CH1N - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 1, 0)}, // TIM1_CH1 - {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 1)}, // TIM1_CH2N - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 2, 0)}, // TIM1_CH2 - {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 1)}, // TIM1_CH3N - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM1_ENABLE, 4, 0)}, // TIM1_CH4 -#ifdef STM32F103xG - {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM10_ENABLE, 1, 0)}, // TIM10_CH1 - {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM11_ENABLE, 1, 0)}, // TIM11_CH1 - {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM13_ENABLE, 1, 0)}, // TIM13_CH1 - {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_TIM14_ENABLE, 1, 0)}, // TIM14_CH1 -#endif - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_TX[] = { - {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART1_ENABLE)}, - {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, - {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, - {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_RX[] = { - {PA_3, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, - {PA_10, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, - {PB_7, USART1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART1_ENABLE)}, - {PB_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, - {PC_11, UART4, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, - // {PC_11, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, - {PD_2, UART5, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_NONE)}, - {PD_6, USART2, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART2_ENABLE)}, - {PD_9, USART3, STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, AFIO_USART3_ENABLE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_RTS[] = { - {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, - {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, - {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_CTS[] = { - {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_PARTIAL)}, - {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART2_ENABLE)}, - {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_USART3_ENABLE)}, - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_MOSI[] = { - {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, - {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, - {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, - {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_SPI1_ENABLE)}, - {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, - {NC, NP, 0} -}; -#endif - -//*** CAN *** - -#ifdef HAL_CAN_MODULE_ENABLED -WEAK const PinMap PinMap_CAN_RD[] = { - {PA_11, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, - {PB_8, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_2)}, - {PD_0, CAN1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_CAN1_3)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_CAN_MODULE_ENABLED -WEAK const PinMap PinMap_CAN_TD[] = { - {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, - {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_2)}, - {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_CAN1_3)}, - {NC, NP, 0} -}; -#endif - -//*** No ETHERNET *** - -//*** No QUADSPI *** - -//*** USB *** - -#ifdef HAL_PCD_MODULE_ENABLED -WEAK const PinMap PinMap_USB[] = { - {PA_11, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DM - {PA_12, USB, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, AFIO_NONE)}, // USB_DP - {NC, NP, 0} -}; -#endif - -//*** No USB_OTG_FS *** - -//*** No USB_OTG_HS *** - -//*** SD *** - -#ifdef HAL_SD_MODULE_ENABLED -WEAK const PinMap PinMap_SD[] = { - // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D4 - // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D5 - // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D6 - // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D7 - {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D0 - {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D1 - {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D2 - {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, AFIO_NONE)}, // SDIO_D3 - {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CK - {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, AFIO_NONE)}, // SDIO_CMD - {NC, NP, 0} -}; -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h deleted file mode 100644 index d9076b4dfb..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/PinNamesVar.h +++ /dev/null @@ -1,30 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_DM = PA_11, - USB_DP = PA_12, -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h deleted file mode 100644 index 014943f311..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/hal_conf_custom.h +++ /dev/null @@ -1,412 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f1xx_hal_conf_default.h - * @brief HAL default configuration file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F1xx_HAL_CONF_DEFAULT_H -#define __STM32F1xx_HAL_CONF_DEFAULT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief Include the default list of modules to be used in the HAL driver - * and manage module deactivation - */ -#include "stm32yyxx_hal_conf.h" -#if 0 -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -#define HAL_ADC_MODULE_ENABLED -#define HAL_CAN_MODULE_ENABLED -/*#define HAL_CAN_LEGACY_MODULE_ENABLED*/ -#define HAL_CEC_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED -#define HAL_CRC_MODULE_ENABLED -#define HAL_DAC_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_ETH_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_HCD_MODULE_ENABLED -#define HAL_I2C_MODULE_ENABLED -#define HAL_I2S_MODULE_ENABLED -#define HAL_IRDA_MODULE_ENABLED -#define HAL_IWDG_MODULE_ENABLED -#define HAL_NAND_MODULE_ENABLED -#define HAL_NOR_MODULE_ENABLED -#define HAL_PCCARD_MODULE_ENABLED -#define HAL_PCD_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_RTC_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED -#define HAL_SMARTCARD_MODULE_ENABLED -#define HAL_SPI_MODULE_ENABLED -#define HAL_SRAM_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -#define HAL_UART_MODULE_ENABLED -#define HAL_USART_MODULE_ENABLED -#define HAL_WWDG_MODULE_ENABLED -#define HAL_MMC_MODULE_ENABLED -#endif - -/* ########################## Oscillator Values adaptation ####################*/ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) -#if defined(USE_STM3210C_EVAL) -#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ -#else -#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ -#endif -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) -#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) -#define HSI_VALUE 8000000U /*!< Value of the Internal oscillator in Hz */ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) -#define LSI_VALUE 40000U /*!< LSI Typical Value in Hz */ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature. */ -/** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined (LSE_VALUE) -#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined (LSE_STARTUP_TIMEOUT) -#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#if !defined(VDD_VALUE) -#define VDD_VALUE 3300U /*!< Value of VDD in mv */ -#endif -#if !defined (TICK_INT_PRIORITY) -#define TICK_INT_PRIORITY 0x00U /*!< tick interrupt priority */ -#endif -#if !defined (USE_RTOS) -#define USE_RTOS 0U -#endif -#if !defined (PREFETCH_ENABLE) -#define PREFETCH_ENABLE 1U -#endif - -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ -#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ -#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ -#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ -#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ -#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ -#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ -#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ -#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ -#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2U -#define MAC_ADDR1 0U -#define MAC_ADDR2 0U -#define MAC_ADDR3 0U -#define MAC_ADDR4 0U -#define MAC_ADDR5 0U - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB 8U /* 8 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848 PHY Address*/ -#define DP83848_PHY_ADDRESS 0x01U -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY 0x000000FFU -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY 0x00000FFFU - -#define PHY_READ_TO 0x0000FFFFU -#define PHY_WRITE_TO 0x0000FFFFU - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ - -#define PHY_SR ((uint16_t)0x0010) /*!< PHY status register Offset */ -#define PHY_MICR ((uint16_t)0x0011) /*!< MII Interrupt Control Register */ -#define PHY_MISR ((uint16_t)0x0012) /*!< MII Interrupt Status and Misc. Control Register */ - -#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ -#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ - -#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ -#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ - -#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ -#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver -* Activated: CRC code is present inside driver -* Deactivated: CRC code cleaned from driver -*/ -#if !defined (USE_SPI_CRC) -#define USE_SPI_CRC 0U -#endif - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED -#include "stm32f1xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED -#include "stm32f1xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED -#include "stm32f1xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED -#include "stm32f1xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED -#include "stm32f1xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED -#include "stm32f1xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CAN_LEGACY_MODULE_ENABLED - #include "Legacy/stm32f1xx_hal_can_legacy.h" -#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED -#include "stm32f1xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED -#include "stm32f1xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED -#include "stm32f1xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED -#include "stm32f1xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED -#include "stm32f1xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED -#include "stm32f1xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED -#include "stm32f1xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED -#include "stm32f1xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED -#include "stm32f1xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED -#include "stm32f1xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED -#include "stm32f1xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED -#include "stm32f1xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED -#include "stm32f1xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED -#include "stm32f1xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED -#include "stm32f1xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED -#include "stm32f1xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED -#include "stm32f1xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED -#include "stm32f1xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED -#include "stm32f1xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED -#include "stm32f1xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED -#include "stm32f1xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED -#include "stm32f1xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED -#include "stm32f1xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED -#include "stm32f1xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED -#include "stm32f1xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED -#include "stm32f1xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ -#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ -void assert_failed(uint8_t *file, uint32_t line); -#else -#define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F1xx_HAL_CONF_DEFAULT_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld deleted file mode 100644 index 09088b622c..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld +++ /dev/null @@ -1,197 +0,0 @@ -/* -****************************************************************************** -** - -** File : LinkerScript.ld -** -** Author : Auto-generated by STM32CubeIDE -** -** Abstract : Linker script for STM32F103Z(C/D/E/G/GTx Device from STM32F1 series -** 256/386/512K/786/1024bytes FLASH -** 48/64/96Kbytes RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** Distribution: The file is distributed as is without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2019 STMicroelectronics

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of STMicroelectronics nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of "RAM" Ram type memory */ -_Min_Heap_Size = 0x200; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Memories definition */ -MEMORY -{ - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE - FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET -} - -/* Sections */ -SECTIONS -{ - /* The startup code into "FLASH" Rom type memory */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data into "FLASH" Rom type memory */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data into "FLASH" Rom type memory */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { - . = ALIGN(4); - *(.ARM.extab* .gnu.linkonce.armextab.*) - . = ALIGN(4); - } >FLASH - .ARM : { - . = ALIGN(4); - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - . = ALIGN(4); - } >FLASH - - .preinit_array : - { - . = ALIGN(4); - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - . = ALIGN(4); - } >FLASH - .init_array : - { - . = ALIGN(4); - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - . = ALIGN(4); - } >FLASH - .fini_array : - { - . = ALIGN(4); - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - . = ALIGN(4); - } >FLASH - - /* Used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections into "RAM" Ram type memory */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - - /* Uninitialized data section into "RAM" Ram type memory */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ - ._user_heap_stack : - { - . = ALIGN(8); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(8); - } >RAM - - /* Remove information from the compiler libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp deleted file mode 100644 index ff7ab771c0..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Digital PinName array -const PinName digitalPin[] = { - PA_0, //D0 - PA_1, //D1 - PA_2, //D2 - PA_3, //D3 - PA_4, //D4 - PA_5, //D5 - PA_6, //D6 - PA_7, //D7 - PA_8, //D8 - PA_9, //D9 - PA_10, //D10 - PA_11, //D11 - PA_12, //D12 - PA_13, //D13 - PA_14, //D14 - PA_15, //D15 - - PB_0, //D16 - PB_1, //D17 - PB_2, //D18 - PB_3, //D19 - PB_4, //D20 - PB_5, //D21 - PB_6, //D22 - PB_7, //D23 - PB_8, //D24 - PB_9, //D25 - PB_10, //D26 - PB_11, //D27 - PB_12, //D28 - PB_13, //D29 - PB_14, //D30 - PB_15, //D31 - - PC_0, //D32 - PC_1, //D33 - PC_2, //D34 - PC_3, //D35 - PC_4, //D36 - PC_5, //D37 - PC_6, //D38 - PC_7, //D39 - PC_8, //D40 - PC_9, //D41 - PC_10, //D42 - PC_11, //D43 - PC_12, //D44 - PC_13, //D45 - PC_14, //D46 - PC_15, //D47 - - PD_0, //D48 - PD_1, //D49 - PD_2, //D50 - PD_3, //D51 - PD_4, //D52 - PD_5, //D53 - PD_6, //D54 - PD_7, //D55 - PD_8, //D56 - PD_9, //D57 - PD_10, //D58 - PD_11, //D59 - PD_12, //D60 - PD_13, //D61 - PD_14, //D62 - PD_15, //D63 - - PE_0, //D64 - PE_1, //D65 - PE_2, //D66 - PE_3, //D67 - PE_4, //D68 - PE_5, //D69 - PE_6, //D70 - PE_7, //D71 - PE_8, //D72 - PE_9, //D73 - PE_10, //D74 - PE_11, //D75 - PE_12, //D76 - PE_13, //D77 - PE_14, //D78 - PE_15, //D79 - - PF_0, //D80 - PF_1, //D81 - PF_2, //D82 - PF_3, //D83 - PF_4, //D84 - PF_5, //D85 - PF_6, //D86 - PF_7, //D87 - PF_8, //D88 - PF_9, //D89 - PF_10, //D90 - PF_11, //D91 - PF_12, //D92 - PF_13, //D93 - PF_14, //D94 - PF_15, //D95 - - PG_0, //D96 - PG_1, //D97 - PG_2, //D98 - PG_3, //D99 - PG_4, //D100 - PG_5, //D101 - PG_6, //D102 - PG_7, //D103 - PG_8, //D104 - PG_9, //D105 - PG_10, //D106 - PG_11, //D107 - PG_12, //D108 - PG_13, //D109 - PG_14, //D110 - PG_15 //D111 -}; - -// Analog (Ax) pin number array -const uint32_t analogInputPin[] = { - 0, // A0, PA0 - 1, // A1, PA1 - 2, // A2, PA2 - 3, // A3, PA3 - 4, // A4, PA4 - 5, // A5, PA5 - 6, // A6, PA6 - 7, // A7, PA7 - 16, // A8, PB0 - 17, // A9, PB1 - 32, // A10, PC0 - 33, // A11, PC1 - 34, // A12, PC2 - 35, // A13, PC3 - 36, // A14, PC4 - 37, // A15, PC5 - 86, // A16, PF6 - 87, // A17, PF7 - 88, // A18, PF8 - 89, // A19, PF9 - 90 // A20, PF10 -}; - -#ifdef __cplusplus -} -#endif - -// ---------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief System Clock Configuration - * @param None - * @retval None - */ -WEAK void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {}; - - /* Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - Error_Handler(); - } - /* Initializes the CPU, AHB and APB busses clocks */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { - Error_Handler(); - } - - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB; - PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; - PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { - Error_Handler(); - } -} - - -#ifdef __cplusplus -} -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h deleted file mode 100644 index fb878f8b78..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/variant.h +++ /dev/null @@ -1,232 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - */ - -#ifndef _VARIANT_ARDUINO_STM32_ -#define _VARIANT_ARDUINO_STM32_ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ -#define PA0 0 -#define PA1 1 -#define PA2 2 -#define PA3 3 -#define PA4 4 -#define PA5 5 -#define PA6 6 -#define PA7 7 -#define PA8 8 -#define PA9 9 -#define PA10 10 -#define PA11 11 -#define PA12 12 -#define PA13 13 -#define PA14 14 -#define PA15 15 - -#define PB0 16 -#define PB1 17 -#define PB2 18 -#define PB3 19 -#define PB4 20 -#define PB5 21 -#define PB6 22 -#define PB7 23 -#define PB8 24 -#define PB9 25 -#define PB10 26 -#define PB11 27 -#define PB12 28 -#define PB13 29 -#define PB14 30 -#define PB15 31 - -#define PC0 32 -#define PC1 33 -#define PC2 34 -#define PC3 35 -#define PC4 36 -#define PC5 37 -#define PC6 38 -#define PC7 39 -#define PC8 40 -#define PC9 41 -#define PC10 42 -#define PC11 43 -#define PC12 44 -#define PC13 45 -#define PC14 46 -#define PC15 47 - -#define PD0 48 -#define PD1 49 -#define PD2 50 -#define PD3 51 -#define PD4 52 -#define PD5 53 -#define PD6 54 -#define PD7 55 -#define PD8 56 -#define PD9 57 -#define PD10 58 -#define PD11 59 -#define PD12 60 -#define PD13 61 -#define PD14 62 -#define PD15 63 - -#define PE0 64 -#define PE1 65 -#define PE2 66 -#define PE3 67 -#define PE4 68 -#define PE5 69 -#define PE6 70 -#define PE7 71 -#define PE8 72 -#define PE9 73 -#define PE10 74 -#define PE11 75 -#define PE12 76 -#define PE13 77 -#define PE14 78 -#define PE15 79 - -#define PF0 80 -#define PF1 81 -#define PF2 82 -#define PF3 83 -#define PF4 84 -#define PF5 85 -#define PF6 86 -#define PF7 87 -#define PF8 88 -#define PF9 89 -#define PF10 90 -#define PF11 91 -#define PF12 92 -#define PF13 93 -#define PF14 94 -#define PF15 95 - -#define PG0 96 -#define PG1 97 -#define PG2 98 -#define PG3 99 -#define PG4 100 -#define PG5 101 -#define PG6 102 -#define PG7 103 -#define PG8 104 -#define PG9 105 -#define PG10 106 -#define PG11 107 -#define PG12 108 -#define PG13 109 -#define PG14 110 -#define PG15 111 - -// This must be a literal -#define NUM_DIGITAL_PINS 112 -#define NUM_ANALOG_INPUTS 21 - -// On-board LED pin number -#ifdef ARDUINO_VCCGND_F103ZET6_MINI -#define LED_BUILTIN PG15 -#elif defined(ARDUINO_VCCGND_F103ZET6) -#define LED_BUILTIN PC13 -#elif !defined(LED_BUILTIN) -#define LED_BUILTIN PC13 -#endif - -// On-board user button -#ifndef USER_BTN -#define USER_BTN PB1 -#endif - -// SPI Definitions -#ifdef ARDUINO_VCCGND_F103ZET6 -#define PIN_SPI_SS PA15 -#define PIN_SPI_MOSI PB5 -#define PIN_SPI_MISO PB4 -#define PIN_SPI_SCK PB3 -#else -#define PIN_SPI_SS PC4 -#define PIN_SPI_MOSI PA7 -#define PIN_SPI_MISO PA6 -#define PIN_SPI_SCK PA5 -#endif - -// I2C Definitions -#define PIN_WIRE_SDA PB7 -#define PIN_WIRE_SCL PB6 - -// Timer Definitions (optional) -// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin -#define TIMER_TONE TIM6 -#define TIMER_SERVO TIM7 - -// UART Definitions -// Define here Serial instance number to map on Serial generic name -#define SERIAL_UART_INSTANCE 1 - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#define PIN_SERIAL_RX PA10 -#define PIN_SERIAL_TX PA9 - -// Default pin used for 'Serial2' instance -#define PIN_SERIAL2_RX PA3 -#define PIN_SERIAL2_TX PA2 - -// Default pin used for 'Serial3' instance -#define PIN_SERIAL3_RX PB11 -#define PIN_SERIAL3_TX PB10 - -/* Extra HAL modules */ -#define HAL_DAC_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED -#define HAL_SRAM_MODULE_ENABLED - -#ifdef __cplusplus -} // extern "C" -#endif -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus - // These serial port names are intended to allow libraries and architecture-neutral - // sketches to automatically default to the correct port name for a particular type - // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, - // the first hardware serial port whose RX/TX pins are not dedicated to another use. - // - // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor - // - // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial - // - // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library - // - // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. - // - // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX - // pins are NOT connected to anything by default. - #define SERIAL_PORT_MONITOR Serial - #define SERIAL_PORT_HARDWARE Serial1 -#endif - -#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c deleted file mode 100644 index d3c76713bf..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c +++ /dev/null @@ -1,440 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - * Automatically generated from STM32F407Z(E-G)Tx.xml - */ -#include "Arduino.h" -#include "PeripheralPins.h" - -/* ===== - * Note: Commented lines are alternative possibilities which are not used per default. - * If you change them, you will have to know what you do - * ===== - */ - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -WEAK const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - //{PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - //{PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - //{PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - //{PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - //{PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - //{PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 -#endif - {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - //{PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - //{PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - //{PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - //{PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - //{PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - //{PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 - //{PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 - //{PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 - {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 - {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 - {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 - //{PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 - //{PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 -#endif - {NC, NP, 0} -}; -#endif - -//*** DAC *** - -#ifdef HAL_DAC_MODULE_ENABLED -WEAK const PinMap PinMap_DAC[] = { - {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - {NC, NP, 0} -}; -#endif - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -WEAK const PinMap PinMap_I2C_SDA[] = { - {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, -#endif - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_I2C_SCL[] = { - {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, -#endif - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -WEAK const PinMap PinMap_PWM[] = { - {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - //{PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - //{PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 -#endif - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_TX[] = { - {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - //{PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, -#endif - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_UART_RX[] = { - {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - //{PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, -#endif - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_UART_RTS[] = { - {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, -#endif - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_UART_CTS[] = { - {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, -#endif - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_MOSI[] = { - {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {NC, NP, 0} -}; -#endif - -//*** CAN *** - -#ifdef HAL_CAN_MODULE_ENABLED -WEAK const PinMap PinMap_CAN_RD[] = { - {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_CAN_TD[] = { - {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - {NC, NP, 0} -}; -#endif - -//*** ETHERNET *** - -#ifdef HAL_ETH_MODULE_ENABLED -WEAK const PinMap PinMap_Ethernet[] = { - {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS - {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK - {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO - {PA_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_COL - {PA_7, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS_DV|ETH_RX_DV - {PB_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD2 - {PB_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD3 - {PB_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT - {PB_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 - {PB_10, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RX_ER - {PB_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - {PB_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 - {PB_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 - {PC_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDC - {PC_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD2 - {PC_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_CLK - {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 - {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 - {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 - #if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) - {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT - {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN - {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 - {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 - #endif - {NC, NP, 0} -}; -#endif - -//*** No QUADSPI *** - -//*** USB *** - -#ifdef HAL_PCD_MODULE_ENABLED -WEAK const PinMap PinMap_USB_OTG_FS[] = { - //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID - {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM - {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP - {NC, NP, 0} -}; - -WEAK const PinMap PinMap_USB_OTG_HS[] = { -#ifdef USE_USB_HS_IN_FS - {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS - {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM - {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP -#else - {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 - {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK - {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 - {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 - {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 - {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 - {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 - {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 - {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 - {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP - {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR - {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT -#endif /* USE_USB_HS_IN_FS */ - {NC, NP, 0} -}; -#endif - -//*** SD *** - -#ifdef HAL_SD_MODULE_ENABLED -WEAK const PinMap PinMap_SD[] = { - //{PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 - //{PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 - //{PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 - //{PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 - {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 - {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 - {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 - {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 - {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK - {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD - {NC, NP, 0} -}; -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PinNamesVar.h deleted file mode 100644 index b4bb9d45f8..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PinNamesVar.h +++ /dev/null @@ -1,50 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_OTG_FS_SOF = PA_8, - USB_OTG_FS_VBUS = PA_9, - USB_OTG_FS_ID = PA_10, - USB_OTG_FS_DM = PA_11, - USB_OTG_FS_DP = PA_12, - USB_OTG_HS_ULPI_D0 = PA_3, - USB_OTG_HS_SOF = PA_4, - USB_OTG_HS_ULPI_CK = PA_5, - USB_OTG_HS_ULPI_D1 = PB_0, - USB_OTG_HS_ULPI_D2 = PB_1, - USB_OTG_HS_ULPI_D7 = PB_5, - USB_OTG_HS_ULPI_D3 = PB_10, - USB_OTG_HS_ULPI_D4 = PB_11, - USB_OTG_HS_ID = PB_12, - USB_OTG_HS_ULPI_D5 = PB_12, - USB_OTG_HS_ULPI_D6 = PB_13, - USB_OTG_HS_VBUS = PB_13, - USB_OTG_HS_DM = PB_14, - USB_OTG_HS_DP = PB_15, - USB_OTG_HS_ULPI_STP = PC_0, - USB_OTG_HS_ULPI_DIR = PC_2, - USB_OTG_HS_ULPI_NXT = PC_3, -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/hal_conf_custom.h deleted file mode 100644 index 92e9fecb4d..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/hal_conf_custom.h +++ /dev/null @@ -1,496 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf.h - * @brief HAL configuration file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_CUSTOM -#define __STM32F4xx_HAL_CONF_CUSTOM - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ - /** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -#define HAL_ADC_MODULE_ENABLED -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ -#define HAL_CRC_MODULE_ENABLED -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -#define HAL_DAC_MODULE_ENABLED -/* #define HAL_DCMI_MODULE_ENABLED */ -#define HAL_DMA_MODULE_ENABLED -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ -#define HAL_FLASH_MODULE_ENABLED -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -/* #define HAL_EXTI_MODULE_ENABLED */ -#define HAL_I2C_MODULE_ENABLED -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ -/* #define HAL_IWDG_MODULE_ENABLED */ -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ -#define HAL_PWR_MODULE_ENABLED -/* #define HAL_QSPI_MODULE_ENABLED */ -#define HAL_RCC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ -#define HAL_RTC_MODULE_ENABLED -/* #define HAL_SAI_MODULE_ENABLED */ -#define HAL_SD_MODULE_ENABLED -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ -#define HAL_CORTEX_MODULE_ENABLED -#ifndef HAL_PCD_MODULE_ENABLED - #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) -#endif -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#ifndef HSE_VALUE -#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#ifndef HSE_STARTUP_TIMEOUT -#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#ifndef HSI_VALUE -#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#ifndef LSI_VALUE -#define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz -The real value may vary depending on the variations -in voltage and temperature. */ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#ifndef LSE_VALUE -#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#ifndef LSE_STARTUP_TIMEOUT -#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#ifndef EXTERNAL_CLOCK_VALUE -#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#if !defined (VDD_VALUE) -#define VDD_VALUE 3300U /*!< Value of VDD in mv */ -#endif -#if !defined (TICK_INT_PRIORITY) -#define TICK_INT_PRIORITY 0x00U /*!< tick interrupt priority */ -#endif -#if !defined (USE_RTOS) -#define USE_RTOS 0U -#endif -#if !defined (PREFETCH_ENABLE) -#define PREFETCH_ENABLE 1U -#endif -#if !defined (INSTRUCTION_CACHE_ENABLE) -#define INSTRUCTION_CACHE_ENABLE 1U -#endif -#if !defined (DATA_CACHE_ENABLE) -#define DATA_CACHE_ENABLE 1U -#endif - -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ -#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ -#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ -#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ -#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ -#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ -#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ -#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ -#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ -#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ -#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ -#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ -#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ -#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ -#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ -#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ -#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ -#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ -#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2U -#define MAC_ADDR1 0U -#define MAC_ADDR2 0U -#define MAC_ADDR3 0U -#define MAC_ADDR4 0U -#define MAC_ADDR5 0U - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848_PHY_ADDRESS Address*/ -#define DP83848_PHY_ADDRESS 0x01U -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY 0x000000FFU -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY 0x00000FFFU - -#define PHY_READ_TO 0x0000FFFFU -#define PHY_WRITE_TO 0x0000FFFFU - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ -#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ - -#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver - * Activated: CRC code is present inside driver - * Deactivated: CRC code cleaned from driver - */ -#ifndef USE_SPI_CRC -#define USE_SPI_CRC 0U -#endif - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED -#include "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED -#include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED -#include "stm32f4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED -#include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED -#include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED -#include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED -#include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CAN_LEGACY_MODULE_ENABLED -#include "stm32f4xx_hal_can_legacy.h" -#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED -#include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED -#include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED -#include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED -#include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED -#include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED -#include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED -#include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED -#include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED -#include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED -#include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED -#include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED -#include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED -#include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED -#include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED -#include "stm32f4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED -#include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED -#include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED -#include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED -#include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED -#include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED -#include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED -#include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED -#include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED -#include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED -#include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED -#include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED -#include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED -#include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED -#include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED -#include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED -#include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED -#include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_DSI_MODULE_ENABLED -#include "stm32f4xx_hal_dsi.h" -#endif /* HAL_DSI_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED -#include "stm32f4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED -#include "stm32f4xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_FMPI2C_MODULE_ENABLED -#include "stm32f4xx_hal_fmpi2c.h" -#endif /* HAL_FMPI2C_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED -#include "stm32f4xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED -#include "stm32f4xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32f4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED -#include "stm32f4xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ -#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ -void assert_failed(uint8_t *file, uint32_t line); -#else -#define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_CUSTOM_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/ldscript.ld deleted file mode 100644 index efe2db5cd4..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/ldscript.ld +++ /dev/null @@ -1,204 +0,0 @@ -/* -***************************************************************************** -** - -** File : lscript.ld -** -** Abstract : Linker script for STM32F407(VZ)(EG)Tx Device with -** 512/1024KByte FLASH, 128KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2014 Ac6

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of Ac6 nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20000000 + LD_MAX_DATA_SIZE; /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K -FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text ALIGN(4): - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata ALIGN(4): - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - _siccmram = LOADADDR(.ccmram); - - /* CCM-RAM section - * - * IMPORTANT NOTE! - * If initialized variables will be placed in this section, - * the startup code needs to be modified to copy the init-values. - */ - .ccmram : - { - . = ALIGN(4); - _sccmram = .; /* create a global symbol at ccmram start */ - *(.ccmram) - *(.ccmram*) - - . = ALIGN(4); - _eccmram = .; /* create a global symbol at ccmram end */ - } >CCMRAM AT> FLASH - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.cpp deleted file mode 100644 index e78718c8a6..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(ARDUINO_BLACK_F407VE) || defined(ARDUINO_BLACK_F407VG) -// Pin number -// This array allows to wrap Arduino pin number(Dx or x) -// to STM32 PinName (PX_n) -const PinName digitalPin[] = { - // Right Side - //Int //Ext - //3V3 //3V3 - //3V3 //3V3 - //BOOT0 //BOOT1 - //GND //GND - //GND //GND - PE_1, PE_0, // D0, D1 - PB_9, PB_8, - PB_7, PB_6, - PB_5, PB_3, - PD_7, PD_6, - PD_5, PD_4, // D10, D11 - PD_3, PD_2, - PD_1, PD_0, - PC_12, PC_11, - PC_10, PA_15, - PA_12, PA_11, // D20, D21 PA_11: USB_DM, PA_12: USB_DP - PA_10, PA_9, - PA_8, PC_9, - PC_8, PC_7, - PC_6, PD_15, - PD_14, PD_13, // D30, D31 - PD_12, PD_11, - PD_10, PD_9, - PD_8, PB_15, - // Left Side - //Ext //Int - //5V //5V - //5V //5V - //3V3 //3V3 - //3V3 //3V3 - //GND //GND - PE_2, PE_3, - PE_4, PE_5, // D40, D41 PE_4: BUT K0, PE_5: BUT K1 - PE_6, PC_13, - PC_0, PC_1, - PC_2, PC_3, - //VREF- //VREF+ - PA_0, PA_1, // PA_0(WK_UP): BUT K_UP) - PA_2, PA_3, // D50, D51 - PA_4, PA_5, - /*PA_6, PA_7,*/ // PA_6, PA_7: Moved to allow contiguous analog pins - PC_4, PC_5, - PB_0, PB_1, - PA_6, PA_7, // PA_6: LED D2, PA_7: LED D3 (active LOW) - PE_7, PE_8, // D60, D61 - PE_9, PE_10, - PE_11, PE_12, - PE_13, PE_14, - PE_15, PB_10, - PB_11, PB_12, // D70, D71 - PB_13, PB_14, - PB_4, -}; -#endif // ARDUINO_BLACK_F407VE || ARDUINO_BLACK_F407VG - -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) -const PinName digitalPin[] = { - // Left Side - //Ext //Int - //GND //5V - //GND //3V3 - PB_12, PB_13, - PB_14, PB_15, - PD_8, PD_9, - PD_10, PD_11, - PD_12, PD_13, - PD_14, PD_15, - PG_2, PG_3, - PG_4, PG_5, - PG_6, PG_7, - PG_8, PC_6, - PC_7, PC_8, - PC_9, PA_8, - PA_9, PA_10, - PA_11, PA_12, // PA_11: USB_DM, PA_12: USB_DP - PA_13, PA_14, - PA_15, PC_10, - PC_11, PC_12, - PD_0, PD_1, - PD_2, PD_3, - PD_4, PD_5, - PD_6, PD_7, - PG_9, PG_10, - PG_11, PG_12, - PG_13, PG_14, - PG_15, PB_3, - PB_4, PB_5, - PB_6, PB_7, - PB_8, PB_9, - - // Right Side - //Int //Ext - //3V3 //3V3 - //BOOT1 //BOOT0 - //GND //GND - //VREF+ //GND - PB_10, PB_11, - PE_14, PE_15, - PE_12, PE_13, - PE_10, PE_11, - PE_8, PE_9, - PG_1, PE_7, - PF_15, PG_0, - PF_13, PF_14, - PF_11, PF_12, - PB_2, // PB1 PB2 Inverted to allow contiguous analog pins - PB_1, - PC_5, PB_0, - PA_7, PC_4, - PA_5, PA_6, - PA_3, PA_4, - PA_1, PA_2, - PC_3, PA_0, // PA_0(WK_UP): BUT K_UP) - PC_1, PC_2, - /*PF_10,*/PC_0, // PF_10: Moved to allow contiguous analog pins - PF_8, /*PF_9,*/ // PF_9: Moved to allow contiguous analog pins - PF_6, PF_7, - PF_10, PF_9, // PF_10: LED D2, PF_9: LED D1 (active low) - PF_4, PF_5, - PF_2, PF_3, - PF_0, PF_1, - PE_6, PC_13, - PE_4, PE_5, // PE_4: BUT K0, PE_5: BUT K1 - PE_2, PE_3, - PE_0, PE_1, -}; -#endif // ARDUINO_BLACK_F407ZE || ARDUINO_BLACK_F407ZG - -#ifdef __cplusplus -} -#endif - -// ---------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief System Clock Configuration - * @param None - * @retval None - */ -WEAK void SystemClock_Config(void) -{ - - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; - - /**Configure the main internal regulator output voltage - */ - __HAL_RCC_PWR_CLK_ENABLE(); - - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 8; - RCC_OscInitStruct.PLL.PLLN = 336; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 7; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); - } - - /**Configure the Systick interrupt time - */ - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); - - /**Configure the Systick - */ - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); -} - -#ifdef __cplusplus -} -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.h deleted file mode 100644 index 4e7e299f1c..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.h +++ /dev/null @@ -1,353 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#ifndef _VARIANT_ARDUINO_STM32_ -#define _VARIANT_ARDUINO_STM32_ -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ -#if defined(ARDUINO_BLACK_F407VE) || defined(ARDUINO_BLACK_F407VG) -// Right Side -#define PE1 0 -#define PE0 1 -#define PB9 2 -#define PB8 3 -#define PB7 4 -#define PB6 5 -#define PB5 6 -#define PB3 7 -#define PD7 8 -#define PD6 9 -#define PD5 10 -#define PD4 11 -#define PD3 12 -#define PD2 13 -#define PD1 14 -#define PD0 15 -#define PC12 16 -#define PC11 17 -#define PC10 18 -#define PA15 19 -#define PA12 20 // USB_DP -#define PA11 21 // USB_DM -#define PA10 22 -#define PA9 23 -#define PA8 24 -#define PC9 25 -#define PC8 26 -#define PC7 27 -#define PC6 28 -#define PD15 29 -#define PD14 30 -#define PD13 31 -#define PD12 32 -#define PD11 33 -#define PD10 34 -#define PD9 35 -#define PD8 36 -#define PB15 37 -// Left Side -#define PE2 38 -#define PE3 39 -#define PE4 40 // BUT K0 -#define PE5 41 // BUT K1 -#define PE6 42 -#define PC13 43 -#define PC0 44 // A0 -#define PC1 45 // A1 -#define PC2 46 // A2 -#define PC3 47 // A3 -#define PA0 48 // A4/WK_UP: BUT K_UP -#define PA1 49 // A5 -#define PA2 50 // A6 -#define PA3 51 // A7 -#define PA4 52 // A8 -#define PA5 53 // A9 -#define PC4 54 // A10 -#define PC5 55 // A11 -#define PB0 56 // A12 -#define PB1 57 // A13 -#define PA6 58 // LED D2 -#define PA7 59 // LED D3 (active LOW) -#define PE7 60 -#define PE8 61 -#define PE9 62 -#define PE10 63 -#define PE11 64 -#define PE12 65 -#define PE13 66 -#define PE14 67 -#define PE15 68 -#define PB10 69 -#define PB11 70 -#define PB12 71 -#define PB13 72 -#define PB14 73 -#define PB4 74 - -// This must be a literal -#define NUM_DIGITAL_PINS 75 -// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS 14 -#define NUM_ANALOG_FIRST 44 - -// Below ADC, DAC and PWM definitions already done in the core -// Could be redefined here if needed -// ADC resolution is 12bits -//#define ADC_RESOLUTION 12 -//#define DACC_RESOLUTION 12 - -// PWM resolution -//#define PWM_RESOLUTION 8 -//#define PWM_FREQUENCY 20000 -//#define PWM_MAX_DUTY_CYCLE 255 - -// On-board LED pin number -#define LED_D2 PA6 -#define LED_D3 PA7 - -// Board specific button -#define BTN_K_UP PA0 - -#endif // ARDUINO_BLACK_F407VE || ARDUINO_BLACK_F407VG - -#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) -// Left Side -#define PB12 0 -#define PB13 1 -#define PB14 2 -#define PB15 3 -#define PD8 4 -#define PD9 5 -#define PD10 6 -#define PD11 7 -#define PD12 8 -#define PD13 9 -#define PD14 10 -#define PD15 11 -#define PG2 12 -#define PG3 13 -#define PG4 14 -#define PG5 15 -#define PG6 16 -#define PG7 17 -#define PG8 18 -#define PC6 19 -#define PC7 20 -#define PC8 21 -#define PC9 22 -#define PA8 23 -#define PA9 24 -#define PA10 25 -#define PA11 26 // USB_DM -#define PA12 27 // USB_DP -#define PA13 28 -#define PA14 29 -#define PA15 30 -#define PC10 31 -#define PC11 32 -#define PC12 33 -#define PD0 34 -#define PD1 35 -#define PD2 36 -#define PD3 37 -#define PD4 38 -#define PD5 39 -#define PD6 40 -#define PD7 41 -#define PG9 42 -#define PG10 43 -#define PG11 44 -#define PG12 45 -#define PG13 46 -#define PG14 47 -#define PG15 48 -#define PB3 49 -#define PB4 50 -#define PB5 51 -#define PB6 52 -#define PB7 53 -#define PB8 54 -#define PB9 55 - -// Right Side -#define PB10 56 -#define PB11 57 -#define PE14 58 -#define PE15 59 -#define PE12 60 -#define PE13 61 -#define PE10 62 -#define PE11 63 -#define PE8 64 -#define PE9 65 -#define PG1 66 -#define PE7 67 -#define PF15 68 -#define PG0 69 -#define PF13 70 -#define PF14 71 -#define PF11 72 -#define PF12 73 -#define PB2 74 -#define PB1 75 // A0 -#define PC5 76 // A1 -#define PB0 77 // A2 -#define PA7 78 // A3 -#define PC4 79 // A4 -#define PA5 80 // A5 -#define PA6 81 // A6 -#define PA3 82 // A7 -#define PA4 83 // A8 -#define PA1 84 // A9 -#define PA2 85 // A10 -#define PC3 86 // A11 -#define PA0 87 // A12/PA_0(WK_UP): BUT K_UP) -#define PC1 88 // A13 -#define PC2 89 // A14 -#define PC0 90 // A15 -#define PF8 91 // A16 -#define PF6 92 // A17 -#define PF7 93 // A18 -#define PF9 94 // LED D1 (active low) -#define PF10 95 // LED D2 (active low) -#define PF4 96 -#define PF5 97 -#define PF2 98 -#define PF3 99 -#define PF0 100 -#define PF1 101 -#define PE6 102 -#define PC13 103 -#define PE4 104 // BUT K0 -#define PE5 105 // BUT K1 -#define PE2 106 -#define PE3 107 -#define PE0 108 -#define PE1 109 - -// This must be a literal -#define NUM_DIGITAL_PINS 110 -// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS 19 -#define NUM_ANALOG_FIRST 75 - -// On-board LED pin number -#define LED_D2 PF10 -#define LED_D1 PF9 - -// Board specific button -#define BTN_WK_UP PA0 - -#endif // ARDUINO_BLACK_F407ZE || ARDUINO_BLACK_F407ZG - -#define LED_BUILTIN LED_D2 -#define LED_GREEN LED_D2 - -// On-board user button -#define BTN_K0 PE4 -#define BTN_K1 PE3 -#define USER_BTN BTN_K0 - -// Below SPI and I2C definitions already done in the core -// Could be redefined here if differs from the default one -// SPI Definitions -#define PIN_SPI_MOSI PB15 -#define PIN_SPI_MISO PB14 -#define PIN_SPI_SCK PB13 -#define PIN_SPI_SS PB12 -//#define PIN_SPI_SS1 PB0 // W25Q16 (on board flash) - -// I2C Definitions -#define PIN_WIRE_SDA PB7 -#define PIN_WIRE_SCL PB6 - -// Timer Definitions -//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c -#define TIMER_TONE TIM6 - -// Do not use basic timer: OC is required -#define TIMER_SERVO TIM2 //TODO: advanced-control timers don't work - -// UART Definitions -// Define here Serial instance number to map on Serial generic name -#define SERIAL_UART_INSTANCE 1 //ex: 2 for Serial2 (USART2) -// DEBUG_UART could be redefined to print on another instance than 'Serial' -//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 -// DEBUG_UART baudrate, default: 9600 if not defined -//#define DEBUG_UART_BAUDRATE x -// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART -//#define DEBUG_PINNAME_TX PX_n // PinName used for TX - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#define PIN_SERIAL_RX PA10 -#define PIN_SERIAL_TX PA9 - -/* Extra HAL modules */ -#define HAL_DAC_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED - -#ifdef __cplusplus -} // extern "C" -#endif -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_HARDWARE Serial1 -#endif - -#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c deleted file mode 100644 index cc700201aa..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2016, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ -#include "Arduino.h" -#include "PeripheralPins.h" - -// ===== -// Note: Commented lines are alternative possibilities which are not used per default. -// If you change them, you will have to know what you do -// ===== - - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -const PinMap PinMap_ADC[] = { - // {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - // {PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 - // {PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 - // {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - // {PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 - // {PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 - // {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - // {PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 - // {PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 - {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 - // {PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 - {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 - // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 - // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 - // {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 - // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - // {PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 - // {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 - {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 - // {PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 - {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - // {PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 - // {PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 - {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - // {PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 - // {PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 - {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 - // {PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 - {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - // {PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 - // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - // {PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 - {NC, NP, 0} -}; -#endif - -//*** DAC *** - -#ifdef HAL_DAC_MODULE_ENABLED -const PinMap PinMap_DAC[] = { - // {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 - // {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 - LD2 - {NC, NP, 0} -}; -#endif - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SDA[] = { - // {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - // {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - // {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PC_7, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, - // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - // {PC_12, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_I2C_MODULE_ENABLED -const PinMap PinMap_I2C_SCL[] = { - // {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - // {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - // {PC_6, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -const PinMap PinMap_PWM[] = { - {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - STLink Tx - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - STLink Tx - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - STLink Tx - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - STLink Rx - // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - STLink Rx - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - STLink Rx - {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - {PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 - // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N - // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - {PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // Fan0, TIM8_CH2N - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // Fan1, TIM8_CH3N - {PB_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // Fan2, TIM2_CH4 - {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // E0 Heater, TIM2_CH2 - {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // E1 Heater, TIM3_CH1 - {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // LED G, TIM3_CH2 - {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // LED R, TIM4_CH1 - {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // LED B, TIM4_CH2 - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - // {PB_8, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - // {PB_9, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 - // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N - {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 - // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 - // {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 - {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 - // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_TX[] = { - // {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_RX[] = { - // {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PC_5, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_RTS[] = { - // {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -const PinMap PinMap_UART_CTS[] = { - // {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PB_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, - // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, - // {PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MOSI[] = { - {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, - // {PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, - // {PC_1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI3)}, - // {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_7, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, - // {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {NC, NP, 0} -}; -#endif - -//*** CAN *** - -#ifdef HAL_CAN_MODULE_ENABLED -const PinMap PinMap_CAN_RD[] = { - // {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - // {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_CAN_MODULE_ENABLED -const PinMap PinMap_CAN_TD[] = { - // {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - // {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, - // {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, - {NC, NP, 0} -}; -#endif - -//*** ETHERNET *** - -//*** No Ethernet *** - -//*** QUADSPI *** - -#ifdef HAL_QSPI_MODULE_ENABLED -const PinMap PinMap_QUADSPI[] = { - // {PA_1, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 - // {PB_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK - // {PB_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK1_NCS - // {PC_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 - // {PC_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 - // {PC_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK2_NCS - {NC, NP, 0} -}; -#endif - -//*** USB *** - -#ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_FS[] = { - // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_OTG_FS_VBUS - // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID - {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM - {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP - {NC, NP, 0} -}; -#endif - -#ifdef HAL_PCD_MODULE_ENABLED -const PinMap PinMap_USB_OTG_HS[] = { - {NC, NP, 0} -}; -#endif - - diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h deleted file mode 100644 index bff3f21349..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h +++ /dev/null @@ -1,30 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, /* SYS_WKUP0 */ -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_OTG_FS_DM = PA_11, - USB_OTG_FS_DP = PA_12, -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld deleted file mode 100644 index 2a61072cb1..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld +++ /dev/null @@ -1,187 +0,0 @@ -/* -***************************************************************************** -** - -** File : LinkerScript.ld -** -** Abstract : Linker script for STM32F407VETx Device with -** 512KByte FLASH, 128KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2014 Ac6

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of Ac6 nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20020000; /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200;; /* required amount of heap */ -_Min_Stack_Size = 0x400;; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -FLASH (rx) : ORIGIN = 0x8010000, LENGTH = 512K -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text ALIGN(4): - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata ALIGN(4): - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - /*_siccmram = LOADADDR(.ccmram);*/ - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} - - diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp deleted file mode 100644 index 7e3df41f1b..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* - Copyright (c) 2011 Arduino. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Pin number -const PinName digitalPin[] = { - PA_0, //D0 - PA_1, //D1 - PA_2, //D2 - PA_3, //D3 - PA_4, //D4 - PA_5, //D5 - PA_6, //D6 - PA_7, //D7 - PA_8, //D8 - PA_9, //D9 - PA_10, //D10 - PA_11, //D11 - PA_12, //D12 - PA_13, //D13 - PA_14, //D14 - PA_15, //D15 - PB_0, //D16 - PB_1, //D17 - PB_2, //D18 - PB_3, //D19 - PB_4, //D20 - PB_5, //D21 - PB_6, //D22 - PB_7, //D23 - PB_8, //D24 - PB_9, //D25 - PB_10, //D26 - PB_11, //D27 - PB_12, //D28 - PB_13, //D29 - PB_14, //D30 - PB_15, //D31 - PC_0, //D32 - PC_1, //D33 - PC_2, //D34 - PC_3, //D35 - PC_4, //D36 - PC_5, //D37 - PC_6, //D38 - PC_7, //D39 - PC_8, //D40 - PC_9, //D41 - PC_10, //D42 - PC_11, //D43 - PC_12, //D44 - PC_13, //D45 - PC_14, //D46 - PC_15, //D47 - PD_0, //D48 - PD_1, //D49 - PD_2, //D50 - PD_3, //D51 - PD_4, //D52 - PD_5, //D53 - PD_6, //D54 - PD_7, //D55 - PD_8, //D56 - PD_9, //D57 - PD_10, //D58 - PD_11, //D59 - PD_12, //D60 - PD_13, //D61 - PD_14, //D62 - PD_15, //D63 - PE_0, //D64 - PE_1, //D65 - PE_2, //D66 - PE_3, //D67 - PE_4, //D68 - PE_5, //D69 - PE_6, //D70 - PE_7, //D71 - PE_8, //D72 - PE_9, //D73 - PE_10, //D74 - PE_11, //D75 - PE_12, //D76 - PE_13, //D77 - PE_14, //D78 - PE_15, //D79 - - //Duplicated ADC Pins - PA_3, //D80/A0 - PA_4, //D81/A1 - PC_0, //D82/A2 - PC_1, //D83/A3 - PC_2, //D84/A4 - PC_3, //D85/A5 - PC_4 //D86/A6 -}; - -#ifdef __cplusplus -} -#endif - -// ---------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief System Clock Configuration - * The system Clock is configured as follow : - * System Clock source = PLL (HSE) - * SYSCLK(Hz) = 180000000 - * HCLK(Hz) = 180000000 - * AHB Prescaler = 1 - * APB1 Prescaler = 4 - * APB2 Prescaler = 2 - * HSE Frequency(Hz) = 12000000 - * PLL_M = 6 - * PLL_N = 180 - * PLL_P = 2 - * PLL_Q = 7 - * VDD(V) = 3.3 - * Main regulator output voltage = Scale1 mode - * Flash Latency(WS) = 5 - * @param None - * @retval None - */ -WEAK void SystemClock_Config(void) -{ - RCC_ClkInitTypeDef RCC_ClkInitStruct; - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; - - - /* Enable Power Control clock */ - __HAL_RCC_PWR_CLK_ENABLE(); - -#ifdef HAL_PWR_MODULE_ENABLED - /* The voltage scaling allows optimizing the power consumption when the device is - clocked below the maximum system frequency, to update the voltage scaling value - regarding system frequency refer to product datasheet. */ - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); -#endif - - /* Enable HSE Oscillator and activate PLL with HSE as source */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 6; - RCC_OscInitStruct.PLL.PLLN = 180; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 7; - RCC_OscInitStruct.PLL.PLLR = 2; - HAL_RCC_OscConfig(&RCC_OscInitStruct); - - HAL_PWREx_EnableOverDrive(); - - /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 - clocks dividers */ - RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | - RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLRCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); - - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48; - PeriphClkInitStruct.PLLSAI.PLLSAIM = 6; - PeriphClkInitStruct.PLLSAI.PLLSAIN = 96; - PeriphClkInitStruct.PLLSAI.PLLSAIQ = 2; - PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV4; - PeriphClkInitStruct.PLLSAIDivQ = 1; - PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP; - HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); -} - -#ifdef __cplusplus -} -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h deleted file mode 100644 index ee4b1ef296..0000000000 --- a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - Copyright (c) 2011 Arduino. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef _VARIANT_ARDUINO_STM32_ -#define _VARIANT_ARDUINO_STM32_ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ - -#define PA0 0 //D0 -#define PA1 1 //D1 -#define PA2 2 //D2 -#define PA3 3 //D3 -#define PA4 4 //D4 -#define PA5 5 //D5 -#define PA6 6 //D6 -#define PA7 7 //D7 -#define PA8 8 //D8 -#define PA9 9 //D9 -#define PA10 10 //D10 -#define PA11 11 //D11 -#define PA12 12 //D12 -#define PA13 13 //D13 -#define PA14 14 //D14 -#define PA15 15 //D15 -#define PB0 16 //D16 -#define PB1 17 //D17 -#define PB2 18 //D18 -#define PB3 19 //D19 -#define PB4 20 //D20 -#define PB5 21 //D21 -#define PB6 22 //D22 -#define PB7 23 //D23 -#define PB8 24 //D24 -#define PB9 25 //D25 -#define PB10 26 //D26 -#define PB11 27 //D27 -#define PB12 28 //D28 -#define PB13 29 //D29 -#define PB14 30 //D30 -#define PB15 31 //D31 -#define PC0 32 //D32 -#define PC1 33 //D33 -#define PC2 34 //D34 -#define PC3 35 //D35 -#define PC4 36 //D36 -#define PC5 37 //D37 -#define PC6 38 //D38 -#define PC7 39 //D39 -#define PC8 40 //D40 -#define PC9 41 //D41 -#define PC10 42 //D42 -#define PC11 43 //D43 -#define PC12 44 //D44 -#define PC13 45 //D45 -#define PC14 46 //D46 -#define PC15 47 //D47 -#define PD0 48 //D48 -#define PD1 49 //D49 -#define PD2 50 //D50 -#define PD3 51 //D51 -#define PD4 52 //D52 -#define PD5 53 //D53 -#define PD6 54 //D54 -#define PD7 55 //D55 -#define PD8 56 //D56 -#define PD9 57 //D57 -#define PD10 58 //D58 -#define PD11 59 //D59 -#define PD12 60 //D60 -#define PD13 61 //D61 -#define PD14 62 //D62 -#define PD15 63 //D63 -#define PE0 64 //D64 -#define PE1 65 //D65 -#define PE2 66 //D66 -#define PE3 67 //D67 -#define PE4 68 //D68 -#define PE5 69 //D69 -#define PE6 70 //D70 -#define PE7 71 //D71 -#define PE8 72 //D72 -#define PE9 73 //D73 -#define PE10 74 //D74 -#define PE11 75 //D75 -#define PE12 76 //D76 -#define PE13 77 //D77 -#define PE14 78 //D78 -#define PE15 79 //D79 - -// This must be a literal with the same value as PEND -#define NUM_DIGITAL_PINS 87 -// This must be a literal with a value less than or equal to to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS 7 -#define NUM_ANALOG_FIRST 80 - -// PWM resolution -// #define PWM_RESOLUTION 12 -#define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans -#define PWM_MAX_DUTY_CYCLE 255 - -// SPI Definitions -#define PIN_SPI_SS PA4 -#define PIN_SPI_MOSI PA7 -#define PIN_SPI_MISO PA6 -#define PIN_SPI_SCK PA5 - -// I2C Definitions -#define PIN_WIRE_SDA PB9 -#define PIN_WIRE_SCL PB8 - -// Timer Definitions -// Do not use timer used by PWM pin. See PinMap_PWM. -#define TIMER_TONE TIM6 -#define TIMER_SERVO TIM5 -#define TIMER_SERIAL TIM7 - -// UART Definitions -//#define SERIAL_UART_INSTANCE 1 // Connected to EXP3 header -/* Enable Serial 3 */ -#define HAVE_HWSERIAL1 -#define HAVE_HWSERIAL3 - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#define PIN_SERIAL_RX PA10 -#define PIN_SERIAL_TX PA9 - -/* HAL configuration */ -#define HSE_VALUE 12000000U - -#define FLASH_PAGE_SIZE (4U * 1024U) - -#ifdef __cplusplus -} // extern "C" -#endif - -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_HARDWARE_OPEN Serial -#endif - -#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/board.cpp b/buildroot/share/PlatformIO/variants/MEEB_3DP/board.cpp deleted file mode 100644 index 5ddeb1f1d9..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/board.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file wirish/boards/maple/board.cpp - * @author Marti Bolivar - * @brief Maple board file. - */ - -#include // For this board's header file - - -/* Roger Clark. Added next to includes for changes to Serial */ -#include -#include - -#include // For stm32_pin_info and its contents - // (these go into PIN_MAP). - -#include "boards_private.h" // For PMAP_ROW(), which makes - // PIN_MAP easier to read. - -// boardInit(): nothing special to do for Maple. -// -// When defining your own board.cpp, you can put extra code in this -// function if you have anything you want done on reset, before main() -// or setup() are called. -// -// If there's nothing special you need done, feel free to leave this -// function out, as we do here. - -void boardInit(void) { - // afio_remap(AFIO_REMAP_I2C1); -} - -// Pin map: this lets the basic I/O functions (digitalWrite(), -// analogRead(), pwmWrite()) translate from pin numbers to STM32 -// peripherals. -// -// PMAP_ROW() lets us specify a row (really a struct stm32_pin_info) -// in the pin map. Its arguments are: -// -// - GPIO device for the pin (&gpioa, etc.) -// - GPIO bit for the pin (0 through 15) -// - Timer device, or NULL if none -// - Timer channel (1 to 4, for PWM), or 0 if none -// - ADC device, or NULL if none -// - ADC channel, or ADCx if none - -extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { - /* - gpio_dev *gpio_device; GPIO device - timer_dev *timer_device; Pin's timer device, if any. - const adc_dev *adc_device; ADC device, if any. - uint8 gpio_bit; Pin's GPIO port bit. - uint8 timer_channel; Timer channel, or 0 if none. - uint8 adc_channel; Pin ADC channel, or ADCx if none. - */ - - {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ - {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ - {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ - {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ - {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ - {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ - {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ - {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ - {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ - {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ - {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ - {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ - {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ - {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ - {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ - {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ - - {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ - {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ - {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ - {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ - {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ - {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ - {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ - {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ - {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ - {&gpiob, NULL, NULL, 9, 0, ADCx}, /* PB9 */ - {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ - {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ - {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ - {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ - {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ - {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ - - - {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ - {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ - {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ - {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ - {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ - {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ - {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 */ - {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 */ - {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 */ - {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 */ - {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ - {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ - {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ - {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC */ - {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ - {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ - - {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ - {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ - {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ -}; - -/* Basically everything that is defined as having a timer us PWM */ -extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { - PA0,PA1,PA2,PA3,PA6,PA7,PA8,PA9,PA10,PB0,PB1,PB6,PB7,PB8,PB9,PC6,PC7,PC8,PC9 -}; - -/* Basically everything that is defined having ADC */ -extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = { - PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PB0,PB1,PC0,PC1,PC2,PC3,PC4,PC5 -}; - -/* not sure what this us used for */ -extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { - BOARD_JTMS_SWDIO_PIN, - BOARD_JTCK_SWCLK_PIN, BOARD_JTDI_PIN, BOARD_JTDO_PIN, BOARD_NJTRST_PIN -}; - -DEFINE_HWSERIAL(Serial1, 1); -DEFINE_HWSERIAL(Serial2, 2); -DEFINE_HWSERIAL(Serial3, 3); -DEFINE_HWSERIAL_UART(Serial4, 4); -DEFINE_HWSERIAL_UART(Serial5, 5); - diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/board/board.h b/buildroot/share/PlatformIO/variants/MEEB_3DP/board/board.h deleted file mode 100644 index da9ffd893f..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/board/board.h +++ /dev/null @@ -1,125 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file maple_RET6.h - * @author Marti Bolivar - * @brief Private include file for Maple RET6 Edition in boards.h - * - * See maple.h for more information on these definitions. - */ - -#ifndef _BOARDS_GENERIC_STM32F103R_H_ -#define _BOARDS_GENERIC_STM32F103R_H_ - -/* A few of these values will seem strange given that it's a - * high-density board. */ - -#define CYCLES_PER_MICROSECOND 72 -#define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ - -// USARTS -#define BOARD_NR_USARTS 5 -#define BOARD_USART1_TX_PIN PA9 -#define BOARD_USART1_RX_PIN PA10 - -#define BOARD_USART2_TX_PIN PA2 -#define BOARD_USART2_RX_PIN PA3 - -#define BOARD_USART3_TX_PIN PB10 -#define BOARD_USART3_RX_PIN PB11 - -#define BOARD_USART4_TX_PIN PC10 -#define BOARD_USART4_RX_PIN PC11 - -#define BOARD_USART5_TX_PIN PC12 -#define BOARD_USART5_RX_PIN PD2 - -/* Note: - * - * SPI3 is unusable due to pin 43 (PB4) and NRST tie-together :(, but - * leave the definitions so as not to clutter things up. This is only - * OK since RET6 Ed. is specifically advertised as a beta board. */ -#define BOARD_NR_SPI 3 -#define BOARD_SPI1_NSS_PIN PA4 -#define BOARD_SPI1_SCK_PIN PA5 -#define BOARD_SPI1_MISO_PIN PA6 -#define BOARD_SPI1_MOSI_PIN PA7 - - - -#define BOARD_SPI2_NSS_PIN PB12 -#define BOARD_SPI2_SCK_PIN PB13 -#define BOARD_SPI2_MISO_PIN PB14 -#define BOARD_SPI2_MOSI_PIN PB15 - - -#define BOARD_SPI3_NSS_PIN PA15 -#define BOARD_SPI3_SCK_PIN PB3 -#define BOARD_SPI3_MISO_PIN PB4 -#define BOARD_SPI3_MOSI_PIN PB5 - - -/* GPIO A to E = 5 * 16 - BOOT1 not used = 79*/ -#define BOARD_NR_GPIO_PINS 51 -/* Note: NOT 19. The missing one is D38 a.k.a. BOARD_BUTTON_PIN, which - * isn't broken out to a header and is thus unusable for PWM. */ -#define BOARD_NR_PWM_PINS 19 -#define BOARD_NR_ADC_PINS 16 -#define BOARD_NR_USED_PINS 7 - -#define BOARD_JTMS_SWDIO_PIN 39 -#define BOARD_JTCK_SWCLK_PIN 40 -#define BOARD_JTDI_PIN 41 -#define BOARD_JTDO_PIN 42 -#define BOARD_NJTRST_PIN 43 - -/* USB configuration. BOARD_USB_DISC_DEV is the GPIO port containing - * the USB_DISC pin, and BOARD_USB_DISC_BIT is that pin's bit. */ -#define BOARD_USB_DISC_DEV GPIOC -#define BOARD_USB_DISC_BIT 12 - -/* - * SDIO Pins - */ -#define BOARD_SDIO_D0 PC8 -#define BOARD_SDIO_D1 PC9 -#define BOARD_SDIO_D2 PC10 -#define BOARD_SDIO_D3 PC11 -#define BOARD_SDIO_CLK PC12 -#define BOARD_SDIO_CMD PD2 - -/* Pin aliases: these give the GPIO port/bit for each pin as an - * enum. These are optional, but recommended. They make it easier to - * write code using low-level GPIO functionality. */ -enum { -PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, -PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, -PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, -PD0,PD1,PD2 -};/* Note PB2 is skipped as this is Boot1 and is not going to be much use as its likely to be pulled permanently low */ - -#endif diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/bootloader.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/bootloader.ld deleted file mode 100644 index ca56532fdd..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/bootloader.ld +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Linker script for Generic STM32F103RE boards, using the generic bootloader (which takes the lower 8k of memory) - */ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - rom (rx) : ORIGIN = 0x08002000, LENGTH = 504K -} - - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/common.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/common.inc deleted file mode 100644 index e086a58bca..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/common.inc +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Linker script for libmaple. - * - * Original author "lanchon" from ST forums, with modifications by LeafLabs. - */ - -OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") - -/* - * Configure other libraries we want in the link. - * - * libgcc, libc, and libm are common across supported toolchains. - * However, some toolchains require additional archives which aren't - * present everywhere (e.g. ARM's gcc-arm-embedded releases). - * - * To hack around this, we let the build system specify additional - * archives by putting the right extra_libs.inc (in a directory under - * toolchains/) in our search path. - */ -GROUP(libgcc.a libc.a libm.a) -INCLUDE extra_libs.inc - -/* - * These force the linker to search for vector table symbols. - * - * These symbols vary by STM32 family (and also within families). - * It's up to the build system to configure the link's search path - * properly for the target MCU. - */ -INCLUDE vector_symbols.inc - -/* STM32 vector table. */ -EXTERN(__stm32_vector_table) - -/* C runtime initialization function. */ -EXTERN(start_c) - -/* main entry point */ -EXTERN(main) - -/* Initial stack pointer value. */ -EXTERN(__msp_init) -PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram)); - -/* Reset vector and chip reset entry point */ -EXTERN(__start__) -ENTRY(__start__) -PROVIDE(__exc_reset = __start__); - -/* Heap boundaries, for libmaple */ -EXTERN(_lm_heap_start); -EXTERN(_lm_heap_end); - -SECTIONS -{ - .text : - { - __text_start__ = .; - /* - * STM32 vector table. Leave this here. Yes, really. - */ - *(.stm32.interrupt_vector) - - /* - * Program code and vague linking - */ - *(.text .text.* .gnu.linkonce.t.*) - *(.plt) - *(.gnu.warning) - *(.glue_7t) *(.glue_7) *(.vfp11_veneer) - - *(.ARM.extab* .gnu.linkonce.armextab.*) - *(.gcc_except_table) - *(.eh_frame_hdr) - *(.eh_frame) - - . = ALIGN(4); - KEEP(*(.init)) - - . = ALIGN(4); - __preinit_array_start = .; - KEEP (*(.preinit_array)) - __preinit_array_end = .; - - . = ALIGN(4); - __init_array_start = .; - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - __init_array_end = .; - - . = ALIGN(0x4); - KEEP (*crtbegin.o(.ctors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*crtend.o(.ctors)) - - . = ALIGN(4); - KEEP(*(.fini)) - - . = ALIGN(4); - __fini_array_start = .; - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - __fini_array_end = .; - - KEEP (*crtbegin.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*crtend.o(.dtors)) - } > REGION_TEXT - - /* - * End of text - */ - .text.align : - { - . = ALIGN(8); - __text_end__ = .; - } > REGION_TEXT - - /* - * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI - */ - __exidx_start = .; - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > REGION_RODATA - __exidx_end = .; - - /* - * .data - */ - .data : - { - __data_start__ = .; - LONG(0) - . = ALIGN(8); - - *(.got.plt) *(.got) - *(.data .data.* .gnu.linkonce.d.*) - - . = ALIGN(8); - __data_end__ = .; - } > REGION_DATA AT> REGION_RODATA - - /* - * Read-only data - */ - .rodata : - { - *(.rodata .rodata.* .gnu.linkonce.r.*) - /* .USER_FLASH: We allow users to allocate into Flash here */ - *(.USER_FLASH) - /* ROM image configuration; for C startup */ - . = ALIGN(4); - _lm_rom_img_cfgp = .; - LONG(LOADADDR(.data)); - /* - * Heap: Linker scripts may choose a custom heap by overriding - * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in - * internal SRAM, beginning after .bss, and growing towards - * the stack. - * - * I'm shoving these here naively; there's probably a cleaner way - * to go about this. [mbolivar] - */ - _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; - _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init; - } > REGION_RODATA - - /* - * .bss - */ - .bss : - { - . = ALIGN(8); - __bss_start__ = .; - *(.bss .bss.* .gnu.linkonce.b.*) - *(COMMON) - . = ALIGN (8); - __bss_end__ = .; - _end = __bss_end__; - } > REGION_BSS - - /* - * Debugging sections - */ - .stab 0 (NOLOAD) : { *(.stab) } - .stabstr 0 (NOLOAD) : { *(.stabstr) } - /* DWARF debug sections. - * Symbols in the DWARF debugging sections are relative to the beginning - * of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - - .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } - .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } - /DISCARD/ : { *(.note.GNU-stack) } -} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/extra_libs.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/extra_libs.inc deleted file mode 100644 index dd2c84fa45..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/extra_libs.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- - * releases (https://launchpad.net/gcc-arm-embedded/). - */ - -/* This is for the provided newlib. */ -GROUP(libnosys.a) diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/flash.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/flash.ld deleted file mode 100644 index 9e250cd747..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/flash.ld +++ /dev/null @@ -1,26 +0,0 @@ -/* - * libmaple linker script for "Flash" builds. - * - * A Flash build puts .text (and .rodata) in Flash, and - * .data/.bss/heap (of course) in SRAM, but offsets the sections by - * enough space to store the Maple bootloader, which lives in low - * Flash and uses low memory. - */ - -/* - * This pulls in the appropriate MEMORY declaration from the right - * subdirectory of stm32/mem/ (the environment must call ld with the - * right include directory flags to make this happen). Boards can also - * use this file to use any of libmaple's memory-related hooks (like - * where the heap should live). - */ -INCLUDE mem-flash.inc - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/jtag.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/jtag.ld deleted file mode 100644 index 0612f95862..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/jtag.ld +++ /dev/null @@ -1,31 +0,0 @@ -/* - * libmaple linker script for "JTAG" builds. - * - * A "JTAG" build puts .text (and .rodata) in Flash, and - * .data/.bss/heap (of course) in SRAM, but links starting at the - * Flash and SRAM starting addresses (0x08000000 and 0x20000000 - * respectively). This will wipe out a Maple bootloader if there's one - * on the board, so only use this if you know what you're doing. - * - * Of course, a "JTAG" build is perfectly usable for upload over SWD, - * the system memory bootloader, etc. The name is just a historical - * artifact. - */ - -/* - * This pulls in the appropriate MEMORY declaration from the right - * subdirectory of stm32/mem/ (the environment must call ld with the - * right include directory flags to make this happen). Boards can also - * use this file to use any of libmaple's memory-related hooks (like - * where the heap should live). - */ -INCLUDE mem-jtag.inc - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-flash.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-flash.inc deleted file mode 100644 index ddb8876fa5..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-flash.inc +++ /dev/null @@ -1,5 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K - rom (rx) : ORIGIN = 0x08005000, LENGTH = 492K -} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-jtag.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-jtag.inc deleted file mode 100644 index d3ed992481..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-jtag.inc +++ /dev/null @@ -1,5 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K -} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-ram.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-ram.inc deleted file mode 100644 index 360beafe9d..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-ram.inc +++ /dev/null @@ -1,5 +0,0 @@ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K - rom (rx) : ORIGIN = 0x08005000, LENGTH = 0K -} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/ram.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/ram.ld deleted file mode 100644 index 34b468e0a0..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/ram.ld +++ /dev/null @@ -1,25 +0,0 @@ -/* - * libmaple linker script for RAM builds. - * - * A Flash build puts .text, .rodata, and .data/.bss/heap (of course) - * in SRAM, but offsets the sections by enough space to store the - * Maple bootloader, which uses low memory. - */ - -/* - * This pulls in the appropriate MEMORY declaration from the right - * subdirectory of stm32/mem/ (the environment must call ld with the - * right include directory flags to make this happen). Boards can also - * use this file to use any of libmaple's memory-related hooks (like - * where the heap should live). - */ -INCLUDE mem-ram.inc - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", ram); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", ram); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb.ld deleted file mode 100644 index 094f2d2928..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb.ld +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Linker script for Generic STM32F103RB boards. - */ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K - rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K -} - - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb_bootloader.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb_bootloader.ld deleted file mode 100644 index d045db9f4b..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb_bootloader.ld +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Linker script for Generic STM32F103RB boards, using the generic bootloader (which takes the lower 8k of memory) - */ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K - rom (rx) : ORIGIN = 0x08002000, LENGTH = 120K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc.ld deleted file mode 100644 index c890d69f6d..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc.ld +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Linker script for Generic STM32F103RC boards. - */ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - rom (rx) : ORIGIN = 0x08000000, LENGTH = 256K -} - - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc_bootloader.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc_bootloader.ld deleted file mode 100644 index 00b811b0e6..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc_bootloader.ld +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Linker script for Generic STM32F103RC boards, using the generic bootloader (which takes the lower 8k of memory) - */ - -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - rom (rx) : ORIGIN = 0x08002000, LENGTH = 248K -} - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103re.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103re.ld deleted file mode 100644 index 9f74fd5292..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103re.ld +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Linker script for Generic STM32F103RE boards. - */ -MEMORY -{ - ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K -} - - -/* Provide memory region aliases for common.inc */ -REGION_ALIAS("REGION_TEXT", rom); -REGION_ALIAS("REGION_DATA", ram); -REGION_ALIAS("REGION_BSS", ram); -REGION_ALIAS("REGION_RODATA", rom); - -/* Let common.inc handle the real work. */ -INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/vector_symbols.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/vector_symbols.inc deleted file mode 100644 index f8519bba44..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/vector_symbols.inc +++ /dev/null @@ -1,78 +0,0 @@ -EXTERN(__msp_init) -EXTERN(__exc_reset) -EXTERN(__exc_nmi) -EXTERN(__exc_hardfault) -EXTERN(__exc_memmanage) -EXTERN(__exc_busfault) -EXTERN(__exc_usagefault) -EXTERN(__stm32reservedexception7) -EXTERN(__stm32reservedexception8) -EXTERN(__stm32reservedexception9) -EXTERN(__stm32reservedexception10) -EXTERN(__exc_svc) -EXTERN(__exc_debug_monitor) -EXTERN(__stm32reservedexception13) -EXTERN(__exc_pendsv) -EXTERN(__exc_systick) - -EXTERN(__irq_wwdg) -EXTERN(__irq_pvd) -EXTERN(__irq_tamper) -EXTERN(__irq_rtc) -EXTERN(__irq_flash) -EXTERN(__irq_rcc) -EXTERN(__irq_exti0) -EXTERN(__irq_exti1) -EXTERN(__irq_exti2) -EXTERN(__irq_exti3) -EXTERN(__irq_exti4) -EXTERN(__irq_dma1_channel1) -EXTERN(__irq_dma1_channel2) -EXTERN(__irq_dma1_channel3) -EXTERN(__irq_dma1_channel4) -EXTERN(__irq_dma1_channel5) -EXTERN(__irq_dma1_channel6) -EXTERN(__irq_dma1_channel7) -EXTERN(__irq_adc) -EXTERN(__irq_usb_hp_can_tx) -EXTERN(__irq_usb_lp_can_rx0) -EXTERN(__irq_can_rx1) -EXTERN(__irq_can_sce) -EXTERN(__irq_exti9_5) -EXTERN(__irq_tim1_brk) -EXTERN(__irq_tim1_up) -EXTERN(__irq_tim1_trg_com) -EXTERN(__irq_tim1_cc) -EXTERN(__irq_tim2) -EXTERN(__irq_tim3) -EXTERN(__irq_tim4) -EXTERN(__irq_i2c1_ev) -EXTERN(__irq_i2c1_er) -EXTERN(__irq_i2c2_ev) -EXTERN(__irq_i2c2_er) -EXTERN(__irq_spi1) -EXTERN(__irq_spi2) -EXTERN(__irq_usart1) -EXTERN(__irq_usart2) -EXTERN(__irq_usart3) -EXTERN(__irq_exti15_10) -EXTERN(__irq_rtcalarm) -EXTERN(__irq_usbwakeup) - -EXTERN(__irq_tim8_brk) -EXTERN(__irq_tim8_up) -EXTERN(__irq_tim8_trg_com) -EXTERN(__irq_tim8_cc) -EXTERN(__irq_adc3) -EXTERN(__irq_fsmc) -EXTERN(__irq_sdio) -EXTERN(__irq_tim5) -EXTERN(__irq_spi3) -EXTERN(__irq_uart4) -EXTERN(__irq_uart5) -EXTERN(__irq_tim6) -EXTERN(__irq_tim7) -EXTERN(__irq_dma2_channel1) -EXTERN(__irq_dma2_channel2) -EXTERN(__irq_dma2_channel3) -EXTERN(__irq_dma2_channel4_5) diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/pins_arduino.h b/buildroot/share/PlatformIO/variants/MEEB_3DP/pins_arduino.h deleted file mode 100644 index d5dce114d5..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/pins_arduino.h +++ /dev/null @@ -1,2 +0,0 @@ -// API compatibility -#include "variant.h" diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/variant.h b/buildroot/share/PlatformIO/variants/MEEB_3DP/variant.h deleted file mode 100644 index cd10bb3c07..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/variant.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) -#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) -#define portOutputRegister(port) ( &(port->regs->ODR) ) -#define portInputRegister(port) ( &(port->regs->IDR) ) - -#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) -#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) - -#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) - -static const uint8_t SS = BOARD_SPI1_NSS_PIN; -static const uint8_t SS1 = BOARD_SPI2_NSS_PIN; -static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; -static const uint8_t MISO = BOARD_SPI1_MISO_PIN; -static const uint8_t SCK = BOARD_SPI1_SCK_PIN; diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards.cpp b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards.cpp deleted file mode 100644 index 12321229de..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * Copyright (c) 2011, 2012 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file wirish/boards.cpp - * @brief init() and board routines. - * - * This file is mostly interesting for the init() function, which - * configures Flash, the core clocks, and a variety of other available - * peripherals on the board so the rest of Wirish doesn't have to turn - * things on before using them. - * - * Prior to returning, init() calls boardInit(), which allows boards - * to perform any initialization they need to. This file includes a - * weak no-op definition of boardInit(), so boards that don't need any - * special initialization don't have to define their own. - * - * How init() works is chip-specific. See the boards_setup.cpp files - * under e.g. wirish/stm32f1/, wirish/stmf32f2 for the details, but be - * advised: their contents are unstable, and can/will change without - * notice. - */ - -#include -#include -#include -#include -#include -#include "boards_private.h" - -static void setup_flash(void); -static void setup_clocks(void); -static void setup_nvic(void); -static void setup_adcs(void); -static void setup_timers(void); - -/* - * Exported functions - */ - -void init(void) { - setup_flash(); - setup_clocks(); - setup_nvic(); - systick_init(SYSTICK_RELOAD_VAL); - wirish::priv::board_setup_gpio(); - setup_adcs(); - setup_timers(); - wirish::priv::board_setup_usb(); - wirish::priv::series_init(); - boardInit(); -} - -/* Provide a default no-op boardInit(). */ -__weak void boardInit(void) { -} - -/* You could farm this out to the files in boards/ if e.g. it takes - * too long to test on boards with lots of pins. */ -bool boardUsesPin(uint8 pin) { - for (int i = 0; i < BOARD_NR_USED_PINS; i++) { - if (pin == boardUsedPins[i]) { - return true; - } - } - return false; -} - -/* - * Auxiliary routines - */ - -static void setup_flash(void) { - // Turn on as many Flash "go faster" features as - // possible. flash_enable_features() just ignores any flags it - // can't support. - flash_enable_features(FLASH_PREFETCH | FLASH_ICACHE | FLASH_DCACHE); - // Configure the wait states, assuming we're operating at "close - // enough" to 3.3V. - flash_set_latency(FLASH_SAFE_WAIT_STATES); -} - -static void setup_clocks(void) { - // Turn on HSI. We'll switch to and run off of this while we're - // setting up the main PLL. - rcc_turn_on_clk(RCC_CLK_HSI); - - // Turn off and reset the clock subsystems we'll be using, as well - // as the clock security subsystem (CSS). Note that resetting CFGR - // to its default value of 0 implies a switch to HSI for SYSCLK. - RCC_BASE->CFGR = 0x00000000; - rcc_disable_css(); - rcc_turn_off_clk(RCC_CLK_PLL); - rcc_turn_off_clk(RCC_CLK_HSE); - wirish::priv::board_reset_pll(); - // Clear clock readiness interrupt flags and turn off clock - // readiness interrupts. - RCC_BASE->CIR = 0x00000000; -#if !USE_HSI_CLOCK - // Enable HSE, and wait until it's ready. - rcc_turn_on_clk(RCC_CLK_HSE); - while (!rcc_is_clk_ready(RCC_CLK_HSE)) - ; -#endif - // Configure AHBx, APBx, etc. prescalers and the main PLL. - wirish::priv::board_setup_clock_prescalers(); - rcc_configure_pll(&wirish::priv::w_board_pll_cfg); - - // Enable the PLL, and wait until it's ready. - rcc_turn_on_clk(RCC_CLK_PLL); - while(!rcc_is_clk_ready(RCC_CLK_PLL)) - ; - - // Finally, switch to the now-ready PLL as the main clock source. - rcc_switch_sysclk(RCC_CLKSRC_PLL); -} - -/* - * These addresses are where usercode starts when a bootloader is - * present. If no bootloader is present, the user NVIC usually starts - * at the Flash base address, 0x08000000. - */ -#if defined(BOOTLOADER_maple) - #define USER_ADDR_ROM 0x08002000 -#else - #define USER_ADDR_ROM 0x08000000 -#endif -#define USER_ADDR_RAM 0x20000C00 -extern char __text_start__; - -static void setup_nvic(void) { - -nvic_init((uint32)VECT_TAB_ADDR, 0); - -/* Roger Clark. We now control nvic vector table in boards.txt using the build.vect paramater -#ifdef VECT_TAB_FLASH - nvic_init(USER_ADDR_ROM, 0); -#elif defined VECT_TAB_RAM - nvic_init(USER_ADDR_RAM, 0); -#elif defined VECT_TAB_BASE - nvic_init((uint32)0x08000000, 0); -#elif defined VECT_TAB_ADDR - // A numerically supplied value - nvic_init((uint32)VECT_TAB_ADDR, 0); -#else - // Use the __text_start__ value from the linker script; this - // should be the start of the vector table. - nvic_init((uint32)&__text_start__, 0); -#endif - -*/ -} - -static void adc_default_config(adc_dev *dev) { - adc_enable_single_swstart(dev); - adc_set_sample_rate(dev, wirish::priv::w_adc_smp); -} - -static void setup_adcs(void) { - adc_set_prescaler(wirish::priv::w_adc_pre); - adc_foreach(adc_default_config); -} - -static void timer_default_config(timer_dev *dev) { - timer_adv_reg_map *regs = (dev->regs).adv; - const uint16 full_overflow = 0xFFFF; - const uint16 half_duty = 0x8FFF; - - timer_init(dev); - timer_pause(dev); - - regs->CR1 = TIMER_CR1_ARPE; - regs->PSC = 1; - regs->SR = 0; - regs->DIER = 0; - regs->EGR = TIMER_EGR_UG; - switch (dev->type) { - case TIMER_ADVANCED: - regs->BDTR = TIMER_BDTR_MOE | TIMER_BDTR_LOCK_OFF; - // fall-through - case TIMER_GENERAL: - timer_set_reload(dev, full_overflow); - for (uint8 channel = 1; channel <= 4; channel++) { - if (timer_has_cc_channel(dev, channel)) { - timer_set_compare(dev, channel, half_duty); - timer_oc_set_mode(dev, channel, TIMER_OC_MODE_PWM_1, - TIMER_OC_PE); - } - } - // fall-through - case TIMER_BASIC: - break; - } - - timer_generate_update(dev); - timer_resume(dev); -} - -static void setup_timers(void) { - timer_foreach(timer_default_config); -} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards_setup.cpp b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards_setup.cpp deleted file mode 100644 index 44418a52a4..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards_setup.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2012 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. -*****************************************************************************/ - -/** - * @file wirish/stm32f1/boards_setup.cpp - * @author Marti Bolivar - * @brief STM32F1 chip setup. - * - * This file controls how init() behaves on the STM32F1. Be very - * careful when changing anything here. Many of these values depend - * upon each other. - */ - -#include "boards_private.h" - -#include -#include - -#include -#include - -// Allow boards to provide a PLL multiplier. This is useful for -// e.g. STM32F100 value line MCUs, which use slower multipliers. -// (We're leaving the default to RCC_PLLMUL_9 for now, since that -// works for F103 performance line MCUs, which is all that LeafLabs -// currently officially supports). - -namespace wirish { - namespace priv { - - static stm32f1_rcc_pll_data pll_data = {RCC_PLLMUL_6}; -#if !USE_HSI_CLOCK - __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSE, &pll_data}; -#else - __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data}; -#endif - __weak adc_prescaler w_adc_pre = ADC_PRE_PCLK2_DIV_6; - __weak adc_smp_rate w_adc_smp = ADC_SMPR_55_5; - - __weak void board_reset_pll(void) { - // TODO - } - - __weak void board_setup_clock_prescalers(void) { - rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); - rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); - rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); - rcc_clk_disable(RCC_USB); - #if F_CPU == 72000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); - #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); - #endif - } - - __weak void board_setup_gpio(void) { - gpio_init_all(); - } - - __weak void board_setup_usb(void) { -#ifdef SERIAL_USB - -#ifdef GENERIC_BOOTLOADER - //Reset the USB interface on generic boards - developed by Victor PV - gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_OUTPUT_PP); - gpio_write_bit(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit,0); - - for(volatile unsigned int i=0;i<512;i++);// Only small delay seems to be needed, and USB pins will get configured in Serial.begin - gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_INPUT_FLOATING); -#endif - - Serial.begin();// Roger Clark. Changed SerialUSB to Serial for Arduino sketch compatibility -#endif - } - - __weak void series_init(void) { - // Initialize AFIO here, too, so peripheral remaps and external - // interrupts work out of the box. - afio_init(); - } - - } -} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start.S b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start.S deleted file mode 100644 index 8b181aa993..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start.S +++ /dev/null @@ -1,57 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/* - * This file is a modified version of a file obtained from - * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the - * following text appeared: - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - */ - - .text - .code 16 - .thumb_func - - .globl __start__ - .type __start__, %function -__start__: - .fnstart - ldr r1,=__msp_init - mov sp,r1 - ldr r1,=start_c - bx r1 - .pool - .cantunwind - .fnend diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start_c.c b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start_c.c deleted file mode 100644 index 655fefb884..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start_c.c +++ /dev/null @@ -1,95 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2011 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/* - * This file is a modified version of a file obtained from - * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the - * following text appeared: - * - * Copyright (c) 2006, 2007 CodeSourcery Inc - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - */ - -#include - -extern void __libc_init_array(void); - -extern int main(int, char**, char**); - -extern void exit(int) __attribute__((noreturn, weak)); - -/* The linker must ensure that these are at least 4-byte aligned. */ -extern char __data_start__, __data_end__; -extern char __bss_start__, __bss_end__; - -struct rom_img_cfg { - int *img_start; -}; - -extern char _lm_rom_img_cfgp; - -void __attribute__((noreturn)) start_c(void) { - struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; - int *src = img_cfg->img_start; - int *dst = (int*)&__data_start__; - int exit_code; - - /* Initialize .data, if necessary. */ - if (src != dst) { - int *end = (int*)&__data_end__; - while (dst < end) { - *dst++ = *src++; - } - } - - /* Zero .bss. */ - dst = (int*)&__bss_start__; - while (dst < (int*)&__bss_end__) { - *dst++ = 0; - } - - /* Run initializers. */ - __libc_init_array(); - - /* Jump to main. */ - exit_code = main(0, 0, 0); - if (exit) { - exit(exit_code); - } - - /* If exit is NULL, make sure we don't return. */ - for (;;) - continue; -} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/syscalls.c b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/syscalls.c deleted file mode 100644 index d5f2d9fac3..0000000000 --- a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/syscalls.c +++ /dev/null @@ -1,176 +0,0 @@ -/****************************************************************************** - * The MIT License - * - * Copyright (c) 2010 Perry Hung. - * Copyright (c) 2011, 2012 LeafLabs, LLC. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - *****************************************************************************/ - -/** - * @file wirish/syscalls.c - * @brief newlib stubs - * - * Low level system routines used by newlib for basic I/O and memory - * allocation. You can override most of these. - */ - -#include - -#include -#include -#include - -/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then - * assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by - * the linker */ -#ifndef CONFIG_HEAP_START -extern char _lm_heap_start; -#define CONFIG_HEAP_START ((void *)&_lm_heap_start) -#endif -#ifndef CONFIG_HEAP_END -extern char _lm_heap_end; -#define CONFIG_HEAP_END ((void *)&_lm_heap_end) -#endif - -/* - * _sbrk -- Increment the program break. - * - * Get incr bytes more RAM (for use by the heap). malloc() and - * friends call this function behind the scenes. - */ -void *_sbrk(int incr) { - static void * pbreak = NULL; /* current program break */ - void * ret; - - if (pbreak == NULL) { - pbreak = CONFIG_HEAP_START; - } - - if ((CONFIG_HEAP_END - pbreak < incr) || - (pbreak - CONFIG_HEAP_START < -incr)) { - errno = ENOMEM; - return (void *)-1; - } - - ret = pbreak; - pbreak += incr; - return ret; -} - -__weak int _open(const char *path, int flags, ...) { - return 1; -} - -__weak int _close(int fd) { - return 0; -} - -__weak int _fstat(int fd, struct stat *st) { - st->st_mode = S_IFCHR; - return 0; -} - -__weak int _isatty(int fd) { - return 1; -} - -__weak int isatty(int fd) { - return 1; -} - -__weak int _lseek(int fd, off_t pos, int whence) { - return -1; -} - -__weak unsigned char getch(void) { - return 0; -} - - -__weak int _read(int fd, char *buf, size_t cnt) { - *buf = getch(); - - return 1; -} - -__weak void putch(unsigned char c) { -} - -__weak void cgets(char *s, int bufsize) { - char *p; - int c; - int i; - - for (i = 0; i < bufsize; i++) { - *(s+i) = 0; - } -// memset(s, 0, bufsize); - - p = s; - - for (p = s; p < s + bufsize-1;) { - c = getch(); - switch (c) { - case '\r' : - case '\n' : - putch('\r'); - putch('\n'); - *p = '\n'; - return; - - case '\b' : - if (p > s) { - *p-- = 0; - putch('\b'); - putch(' '); - putch('\b'); - } - break; - - default : - putch(c); - *p++ = c; - break; - } - } - return; -} - -__weak int _write(int fd, const char *buf, size_t cnt) { - int i; - - for (i = 0; i < cnt; i++) - putch(buf[i]); - - return cnt; -} - -/* Override fgets() in newlib with a version that does line editing */ -__weak char *fgets(char *s, int bufsize, void *f) { - cgets(s, bufsize); - return s; -} - -__weak void _exit(int exitcode) { - while (1) - ; -} diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c deleted file mode 100644 index 5335361a6a..0000000000 --- a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c +++ /dev/null @@ -1,274 +0,0 @@ - -/* - ******************************************************************************* - * Copyright (c) 2019, STMicroelectronics - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ******************************************************************************* - * Automatically generated from STM32F401V(D-E)Tx.xml - */ -#include "Arduino.h" -#include "PeripheralPins.h" - -/* ===== - * Note: Commented lines are alternative possibilities which are not used per default. - * If you change them, you will have to know what you do - * ===== - */ - -//*** ADC *** - -#ifdef HAL_ADC_MODULE_ENABLED -WEAK const PinMap PinMap_ADC[] = { - {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 - {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 - {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 - {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 - // {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 - // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 - // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 - // {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 - // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 - // {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 - // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 - // {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 - {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 - {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 - // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 - // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 - {NC, NP, 0} -}; -#endif - -//*** No DAC *** - -//*** I2C *** - -#ifdef HAL_I2C_MODULE_ENABLED -WEAK const PinMap PinMap_I2C_SDA[] = { - // {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)}, - // {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)}, - {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_I2C_MODULE_ENABLED -WEAK const PinMap PinMap_I2C_SCL[] = { - // {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, - {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, - // {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, - {NC, NP, 0} -}; -#endif - -//*** PWM *** - -#ifdef HAL_TIM_MODULE_ENABLED -WEAK const PinMap PinMap_PWM[] = { - // {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 - // {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - // {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 - // {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - // {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - // {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - // {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - // {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - // {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 - // {PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - // {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 - // {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - // {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - // {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - // {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 - // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - // {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 - {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 - // {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 - {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 - // {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 - // {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 - {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 - {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 - {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 - {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 - {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - // {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - // {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N - // {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 - // {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N - // {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 - // {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N - // {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 - {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 - {NC, NP, 0} -}; -#endif - -//*** SERIAL *** - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_TX[] = { - // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PA_11, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_RX[] = { - // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PA_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - // {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, - {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_RTS[] = { - // {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_UART_MODULE_ENABLED -WEAK const PinMap PinMap_UART_CTS[] = { - // {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, - {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - {NC, NP, 0} -}; -#endif - -//*** SPI *** - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_MOSI[] = { - {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_MISO[] = { - {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_SCLK[] = { - {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - {NC, NP, 0} -}; -#endif - -#ifdef HAL_SPI_MODULE_ENABLED -WEAK const PinMap PinMap_SPI_SSEL[] = { - {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, - // {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, - // {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, - // {PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - // {PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, - {NC, NP, 0} -}; -#endif - -//*** No CAN *** - -//*** No ETHERNET *** - -//*** No QUADSPI *** - -//*** USB *** - -#ifdef HAL_PCD_MODULE_ENABLED -WEAK const PinMap PinMap_USB_OTG_FS[] = { - // {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF - // {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS - // {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID - {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM - {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP - {NC, NP, 0} -}; -#endif - -//*** No USB_OTG_HS *** -//*** SD *** - -#ifdef HAL_SD_MODULE_ENABLED -WEAK const PinMap PinMap_SD[] = { - // {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 - // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 - // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 - // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 - {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 - {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 - {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 - {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 - {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK - {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD - {NC, NP, 0} -}; -#endif diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PinNamesVar.h deleted file mode 100644 index 6a1eb9b887..0000000000 --- a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PinNamesVar.h +++ /dev/null @@ -1,33 +0,0 @@ -/* SYS_WKUP */ -#ifdef PWR_WAKEUP_PIN1 - SYS_WKUP1 = PA_0, -#endif -#ifdef PWR_WAKEUP_PIN2 - SYS_WKUP2 = NC, -#endif -#ifdef PWR_WAKEUP_PIN3 - SYS_WKUP3 = NC, -#endif -#ifdef PWR_WAKEUP_PIN4 - SYS_WKUP4 = NC, -#endif -#ifdef PWR_WAKEUP_PIN5 - SYS_WKUP5 = NC, -#endif -#ifdef PWR_WAKEUP_PIN6 - SYS_WKUP6 = NC, -#endif -#ifdef PWR_WAKEUP_PIN7 - SYS_WKUP7 = NC, -#endif -#ifdef PWR_WAKEUP_PIN8 - SYS_WKUP8 = NC, -#endif -/* USB */ -#ifdef USBCON - USB_OTG_FS_SOF = PA_8, - USB_OTG_FS_VBUS = PA_9, - USB_OTG_FS_ID = PA_10, - USB_OTG_FS_DM = PA_11, - USB_OTG_FS_DP = PA_12, -#endif diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h deleted file mode 100644 index 0c7781997f..0000000000 --- a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h +++ /dev/null @@ -1,496 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf.h - * @brief HAL configuration file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2017 STMicroelectronics. - * All rights reserved.

- * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_CUSTOM -#define __STM32F4xx_HAL_CONF_CUSTOM - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ - /** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -#define HAL_ADC_MODULE_ENABLED -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ -#define HAL_CRC_MODULE_ENABLED -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ -//#define HAL_DAC_MODULE_ENABLED -/* #define HAL_DCMI_MODULE_ENABLED */ -#define HAL_DMA_MODULE_ENABLED -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ -#define HAL_FLASH_MODULE_ENABLED -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -/* #define HAL_EXTI_MODULE_ENABLED */ -#define HAL_I2C_MODULE_ENABLED -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ -#define HAL_IWDG_MODULE_ENABLED -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ -#define HAL_PWR_MODULE_ENABLED -/* #define HAL_QSPI_MODULE_ENABLED */ -#define HAL_RCC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ -#define HAL_RTC_MODULE_ENABLED -/* #define HAL_SAI_MODULE_ENABLED */ -#define HAL_SD_MODULE_ENABLED -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ -#define HAL_CORTEX_MODULE_ENABLED -#ifndef HAL_PCD_MODULE_ENABLED - #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) -#endif -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#ifndef HSE_VALUE -#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#ifndef HSE_STARTUP_TIMEOUT -#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#ifndef HSI_VALUE -#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#ifndef LSI_VALUE -#define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz -The real value may vary depending on the variations -in voltage and temperature. */ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#ifndef LSE_VALUE -#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#ifndef LSE_STARTUP_TIMEOUT -#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#ifndef EXTERNAL_CLOCK_VALUE -#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#if !defined (VDD_VALUE) -#define VDD_VALUE 3300U /*!< Value of VDD in mv */ -#endif -#if !defined (TICK_INT_PRIORITY) -#define TICK_INT_PRIORITY 0x00U /*!< tick interrupt priority */ -#endif -#if !defined (USE_RTOS) -#define USE_RTOS 0U -#endif -#if !defined (PREFETCH_ENABLE) -#define PREFETCH_ENABLE 1U -#endif -#if !defined (INSTRUCTION_CACHE_ENABLE) -#define INSTRUCTION_CACHE_ENABLE 1U -#endif -#if !defined (DATA_CACHE_ENABLE) -#define DATA_CACHE_ENABLE 1U -#endif - -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ -#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ -#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ -#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ -#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ -#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ -#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ -#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ -#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ -#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ -#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ -#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ -#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ -#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ -#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ -#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ -#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ -#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ -#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2U -#define MAC_ADDR1 0U -#define MAC_ADDR2 0U -#define MAC_ADDR3 0U -#define MAC_ADDR4 0U -#define MAC_ADDR5 0U - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848_PHY_ADDRESS Address*/ -#define DP83848_PHY_ADDRESS 0x01U -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY 0x000000FFU -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY 0x00000FFFU - -#define PHY_READ_TO 0x0000FFFFU -#define PHY_WRITE_TO 0x0000FFFFU - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ -#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ - -#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver - * Activated: CRC code is present inside driver - * Deactivated: CRC code cleaned from driver - */ -#ifndef USE_SPI_CRC -#define USE_SPI_CRC 0U -#endif - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED -#include "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED -#include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED -#include "stm32f4xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED -#include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED -#include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED -#include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED -#include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CAN_LEGACY_MODULE_ENABLED -#include "stm32f4xx_hal_can_legacy.h" -#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED -#include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED -#include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED -#include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED -#include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED -#include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED -#include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED -#include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED -#include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED -#include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED -#include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED -#include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED -#include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED -#include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED -#include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED -#include "stm32f4xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED -#include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED -#include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED -#include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED -#include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED -#include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED -#include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED -#include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED -#include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED -#include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED -#include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED -#include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED -#include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED -#include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED -#include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED -#include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED -#include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED -#include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -#ifdef HAL_DSI_MODULE_ENABLED -#include "stm32f4xx_hal_dsi.h" -#endif /* HAL_DSI_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED -#include "stm32f4xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_CEC_MODULE_ENABLED -#include "stm32f4xx_hal_cec.h" -#endif /* HAL_CEC_MODULE_ENABLED */ - -#ifdef HAL_FMPI2C_MODULE_ENABLED -#include "stm32f4xx_hal_fmpi2c.h" -#endif /* HAL_FMPI2C_MODULE_ENABLED */ - -#ifdef HAL_SPDIFRX_MODULE_ENABLED -#include "stm32f4xx_hal_spdifrx.h" -#endif /* HAL_SPDIFRX_MODULE_ENABLED */ - -#ifdef HAL_DFSDM_MODULE_ENABLED -#include "stm32f4xx_hal_dfsdm.h" -#endif /* HAL_DFSDM_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32f4xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_MMC_MODULE_ENABLED -#include "stm32f4xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ -#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ -void assert_failed(uint8_t *file, uint32_t line); -#else -#define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_CUSTOM_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld deleted file mode 100644 index f20a047c65..0000000000 --- a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld +++ /dev/null @@ -1,187 +0,0 @@ -/* -***************************************************************************** -** -** File : ldscript.ld -** -** Abstract : Linker script for STM32F401RETx Device with -** 512KByte FLASH, 96KByte RAM -** -** Set heap size, stack size and stack location according -** to application requirements. -** -** Set memory bank area and size if external memory is used. -** -** Target : STMicroelectronics STM32 -** -** -** Distribution: The file is distributed as is, without any warranty -** of any kind. -** -***************************************************************************** -** @attention -** -**

© COPYRIGHT(c) 2014 Ac6

-** -** Redistribution and use in source and binary forms, with or without modification, -** are permitted provided that the following conditions are met: -** 1. Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** 3. Neither the name of Ac6 nor the names of its contributors -** may be used to endorse or promote products derived from this software -** without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -** -***************************************************************************** -*/ - -/* Entry Point */ -ENTRY(Reset_Handler) - -/* Highest address of the user mode stack */ -_estack = 0x20018000; /* end of RAM */ -/* Generate a link error if heap and stack don't fit into RAM */ -_Min_Heap_Size = 0x200; /* required amount of heap */ -_Min_Stack_Size = 0x400; /* required amount of stack */ - -/* Specify the memory areas */ -MEMORY -{ -FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K -} - -/* Define output sections */ -SECTIONS -{ - /* The startup code goes first into FLASH */ - .isr_vector : - { - . = ALIGN(4); - KEEP(*(.isr_vector)) /* Startup code */ - . = ALIGN(4); - } >FLASH - - /* The program code and other data goes into FLASH */ - .text : - { - . = ALIGN(4); - *(.text) /* .text sections (code) */ - *(.text*) /* .text* sections (code) */ - *(.glue_7) /* glue arm to thumb code */ - *(.glue_7t) /* glue thumb to arm code */ - *(.eh_frame) - - KEEP (*(.init)) - KEEP (*(.fini)) - - . = ALIGN(4); - _etext = .; /* define a global symbols at end of code */ - } >FLASH - - /* Constant data goes into FLASH */ - .rodata : - { - . = ALIGN(4); - *(.rodata) /* .rodata sections (constants, strings, etc.) */ - *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ - . = ALIGN(4); - } >FLASH - - .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH - .ARM : { - __exidx_start = .; - *(.ARM.exidx*) - __exidx_end = .; - } >FLASH - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array*)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >FLASH - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array*)) - PROVIDE_HIDDEN (__init_array_end = .); - } >FLASH - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT(.fini_array.*))) - KEEP (*(.fini_array*)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >FLASH - - /* used by the startup to initialize data */ - _sidata = LOADADDR(.data); - - /* Initialized data sections goes into RAM, load LMA copy after code */ - .data : - { - . = ALIGN(4); - _sdata = .; /* create a global symbol at data start */ - *(.data) /* .data sections */ - *(.data*) /* .data* sections */ - - . = ALIGN(4); - _edata = .; /* define a global symbol at data end */ - } >RAM AT> FLASH - - - /* Uninitialized data section */ - . = ALIGN(4); - .bss : - { - /* This is used by the startup in order to initialize the .bss secion */ - _sbss = .; /* define a global symbol at bss start */ - __bss_start__ = _sbss; - *(.bss) - *(.bss*) - *(COMMON) - - . = ALIGN(4); - _ebss = .; /* define a global symbol at bss end */ - __bss_end__ = _ebss; - } >RAM - - /* User_heap_stack section, used to check that there is enough RAM left */ - ._user_heap_stack : - { - . = ALIGN(4); - PROVIDE ( end = . ); - PROVIDE ( _end = . ); - . = . + _Min_Heap_Size; - . = . + _Min_Stack_Size; - . = ALIGN(4); - } >RAM - - - - /* Remove information from the standard libraries */ - /DISCARD/ : - { - libc.a ( * ) - libm.a ( * ) - libgcc.a ( * ) - } - - .ARM.attributes 0 : { *(.ARM.attributes) } -} - - diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.cpp b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.cpp deleted file mode 100644 index 4ecbff0ecc..0000000000 --- a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#include "pins_arduino.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef ARDUINO_STEVAL -// Pin number -// This array allows to wrap Arduino pin number(Dx or x) -// to STM32 PinName (PX_n) -const PinName digitalPin[] = { - PA_9, // TX - PA_10, // RX - - // WIFI - PD_3, // CTS - PD_4, // RTS - PD_5, // TX - PD_6, // RX - PB_5, // WIFI_WAKEUP - PE_11, // WIFI_RESET - PE_12, // WIFI_BOOT - - // STATUS_LED - PE_1, //STATUS_LED - - // SPI USER - PB_12, // SPI_CS - PB_15, // SPI_MOSI - PB_14, // SPI_MISO - PB_13, // SPI_SCK - - // I2C USER - PB_7, // SDA - PB_6, // SCL - - // SPI - PA_4, // SPI_CS - PA_5, // SPI_SCK - PA_6, // SPI_MISO - PA_7, // SPI_MOSI - - // JTAG - PA_13, // JTAG_TMS/SWDIO - PA_14, // JTAG_TCK/SWCLK - PB_3, // JTAG_TDO/SWO - - // SDCARD - PC_8, // SDIO_D0 - PC_9, // SDIO_D1 - PA_15, // SD_CARD_DETECT - PC_10, // SDIO_D2 - PC_11, // SDIO_D3 - PC_12, // SDIO_CK - PD_2, // SDIO_CMD - - // OTG - PA_11, // OTG_DM - PA_12, // OTG_DP - - // IR/PROBE - PD_1, // IR_OUT - PC_1, // IR_ON - - // USER_PINS - PD_7, // USER3 - PB_9, // USER1 - PE_0, // USER2 - PB_4, // USER4 - - // USERKET - PE_7, // USER_BUTTON - - // ENDSTOPS - PD_8, // X_STOP - PD_9, // Y_STOP - PD_10, // Z_STOP - PD_11, // U_STOP - PA_8, // V_STOP - PD_0, // W_STOP - - // HEATERS - PD_13, // BED_HEAT_2 - PD_14, // BED_HEAT_1 - PD_15, // BED_HEAT_3 - PC_7, // E1_HEAT_PWM - PB_0, // E2_HEAT_PWM - PB_1, // E3_HEAT_PWM - - // THERMISTOR - PC_2, // BED_THERMISTOR_1 - PC_3, // BED_THERMISTOR_2 - PA_3, // BED_THERMISTOR_3 - PA_0, // E1_THERMISTOR - PA_1, // E2_THERMISTOR - PA_2, // E3_THERMISTOR - - // FANS - PC_4, // E1_FAN - PC_5, // E2_FAN - PE_8, // E3_FAN - - // X_MOTOR - PE_13, // X_RESET - PE_14, // X_PWM - PE_15, // X_DIR - - // Y_MOTOR - PE_10, // Y_RESET - PB_10, // Y_PWM - PE_9, // Y_DIR - - // Z_MOTOR - PC_15, // Z_RESET - PC_6, // Z_PWM - PC_0, // Z_DIR - - // E1_MOTOR - PC_14, // E1_RESET - PC_13, // E1_DIR - PD_12, // E1_PWM - - // E2_MOTOR - PE_4, // E2_RESET - PE_5, // E2_PWM - PE_6, // E2_DIR - - // E3_MOTOR - PE_3, // E3_RESET - PE_2, // E3_DIR - PB_8 // E3_PWM -}; -#endif - -#ifdef __cplusplus -} -#endif - -// ---------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif -/** - * @brief System Clock Configuration - * The system Clock is configured as follow : - * System Clock source = PLL (HSI) - * SYSCLK(Hz) = 84000000 - * HCLK(Hz) = 84000000 - * AHB Prescaler = 1 - * APB1 Prescaler = 2 - * APB2 Prescaler = 1 - * HSI Frequency(Hz) = 16000000 - * PLL_M = 16 - * PLL_N = 336 - * PLL_P = 4 - * PLL_Q = 7 - * VDD(V) = 3.3 - * Main regulator output voltage = Scale2 mode - * Flash Latency(WS) = 2 - * @param None - * @retval None - */ -WEAK void SystemClock_Config(void) -{ - RCC_OscInitTypeDef RCC_OscInitStruct = {}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; - - /* Configure the main internal regulator output voltage */ - __HAL_RCC_PWR_CLK_ENABLE(); - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); - - /* Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 15; - RCC_OscInitStruct.PLL.PLLN = 144; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; - RCC_OscInitStruct.PLL.PLLQ = 5; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - Error_Handler(); - } - /* Initializes the CPU, AHB and APB busses clocks */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { - Error_Handler(); - } -} - -#ifdef __cplusplus -} -#endif - - -// PA_0 54 // E1_THERMISTOR -// PA_1 55 // E2_THERMISTOR -// PA_2 56 // E3_THERMISTOR -// PA_3 53 // BED_THERMISTOR_3 -// PA_4 16 // SPI_CS -// PA_5 17 // SPI_SCK -// PA_6 18 // SPI_MISO -// PA_7 19 // SPI_MOSI -// PA_8 43 // V_STOP -// PA_9 0 //TX -// PA_10 1 //RX -// PA_11 30 //OTG_DM -// PA_12 31 //OTG_DP -// PA_13 20 // JTAG_TMS/SWDIO -// PA_14 21 // JTAG_TCK/SWCLK -// PA_15 25 // SD_CARD_DETECT -// PB_0 49 // E2_HEAT_PWM -// PB_1 50 // E3_HEAT_PWM -// PB_3 22 // JTAG_TDO/SWO -// PB_4 37 // USER4 -// PB_5 6 // WIFI_WAKEUP -// PB_6 15 // SCL -// PB_7 14 // SDA -// PB_8 77 // E3_PWM -// PB_9 35 // USER1 -// PB_10 64 // Y_PWM -// PB_12 10 // SPI_CS -// PB_13 13 // SPI_SCK -// PB_14 12 // SPI_MISO -// PB_15 11 // SPI_MOSI -// PC_0 68 // Z_DIR -// PC_1 33 //IR_ON -// PC_2 51 // BED_THERMISTOR_1 -// PC_3 52 // BED_THERMISTOR_2 -// PC_4 57 // E1_FAN -// PC_5 58 // E2_FAN -// PC_6 67 // Z_PWM -// PC_7 48 // E1_HEAT_PWM -// PC_8 23 // SDIO_D0 -// PC_9 24 // SDIO_D1 -// PC_10 26 // SDIO_D2 -// PC_11 27 // SDIO_D3 -// PC_12 28 // SDIO_CK -// PC_13 70 // E1_DIR -// PC_14 69 // E1_RESET -// PC_15 66 // Z_RESET -// PD_0 44 // W_STOP -// PD_1 32 //IR_OUT -// PD_2 29 // SDIO_CMD -// PD_3 2 // CTS -// PD_4 3 // RTS -// PD_5 4 // TX -// PD_6 5 // RX -// PD_7 34 // USER3 -// PD_8 39 // X_STOP -// PD_9 40 // Y_STOP -// PD_10 41 // Z_STOP -// PD_11 42 // U_STOP -// PD_12 71 // E1_PWM -// PD_13 45 // BED_HEAT_2 -// PD_14 46 // BED_HEAT_1 -// PD_15 47 // BED_HEAT_3 -// PE_0 36 // USER2 -// PE_1 9 // STATUS_LED -// PE_2 76 // E3_DIR -// PE_3 75 // E3_RESET -// PE_4 72 // E2_RESET -// PE_5 73 // E2_PWM -// PE_6 74 // E2_DIR -// PE_7 38 // USER_BUTTON -// PE_8 59 // E3_FAN -// PE_9 65 // Y_DIR -// PE_10 63 // Y_RESET -// PE_11 7 // WIFI_RESET -// PE_12 8 // WIFI_BOOT -// PE_13 60 // X_RESET -// PE_14 61 // X_PWM -// PE_15 62 // X_DIR diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.h b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.h deleted file mode 100644 index df7295ab17..0000000000 --- a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.h +++ /dev/null @@ -1,327 +0,0 @@ -/* - ******************************************************************************* - * Copyright (c) 2017, STMicroelectronics - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************* - */ - -#ifndef _VARIANT_ARDUINO_STM32_ -#define _VARIANT_ARDUINO_STM32_ -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ -#ifdef ARDUINO_STEVAL - - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ -// USART1_MAIN -#define PA9 0 //TX -#define PA10 1 //RX - -// WIFI (USART2) -#define PD3 2 // CTS -#define PD4 3 // RTS -#define PD5 4 // TX -#define PD6 5 // RX -#define PB5 6 // WIFI_WAKEUP -#define PE11 7 // WIFI_RESET -#define PE12 8 // WIFI_BOOT - -// STATUS_LED -#define PE1 9 // STATUS_LED - -// SPI USER -#define PB12 10 // SPI_CS -#define PB15 11 // SPI_MOSI -#define PB14 12 // SPI_MISO -#define PB13 13 // SPI_SCK - -// I2C USER -#define PB7 14 // SDA -#define PB6 15 // SCL - -// SPI -#define PA4 16 // SPI_CS -#define PA5 17 // SPI_SCK -#define PA6 18 // SPI_MISO -#define PA7 19 // SPI_MOSI - -// JTAG -#define PA13 20 // JTAG_TMS/SWDIO -#define PA14 21 // JTAG_TCK/SWCLK -#define PB3 22 // JTAG_TDO/SWO - -// SDCARD -#define PC8 23 // SDIO_D0 -#define PC9 24 // SDIO_D1 -#define PA15 25 // SD_CARD_DETECT -#define PC10 26 // SDIO_D2 -#define PC11 27 // SDIO_D3 -#define PC12 28 // SDIO_CK -#define PD2 29 // SDIO_CMD - -// OTG -#define PA11 30 //OTG_DM -#define PA12 31 //OTG_DP - -// IR/PROBE -#define PD1 32 //IR_OUT -#define PC1 33 //IR_ON - -// USER_PINS -#define PD7 34 // USER3 -#define PB9 35 // USER1 -#define PE0 36 // USER2 -#define PB4 37 // USER4 - -// USERKET -#define PE7 38 // USER_BUTTON - -// ENDSTOPS -#define PD8 39 // X_STOP -#define PD9 40 // Y_STOP -#define PD10 41 // Z_STOP -#define PD11 42 // U_STOP -#define PA8 43 // V_STOP -#define PD0 44 // W_STOP - -// HEATERS -#define PD13 45 // BED_HEAT_2 -#define PD14 46 // BED_HEAT_1 -#define PD15 47 // BED_HEAT_3 -#define PC7 48 // E1_HEAT_PWM -#define PB0 49 // E2_HEAT_PWM -#define PB1 50 // E3_HEAT_PWM - -// THERMISTOR -#define PC2 51 // BED_THERMISTOR_1 -#define PC3 52 // BED_THERMISTOR_2 -#define PA3 53 // BED_THERMISTOR_3 -#define PA0 54 // E1_THERMISTOR -#define PA1 55 // E2_THERMISTOR -#define PA2 56 // E3_THERMISTOR - -// FANS -#define PC4 57 // E1_FAN -#define PC5 58 // E2_FAN -#define PE8 59 // E3_FAN - -// X_MOTOR -#define PE13 60 // X_RESET -#define PE14 61 // X_PWM -#define PE15 62 // X_DIR - -// Y_MOTOR -#define PE10 63 // Y_RESET -#define PB10 64 // Y_PWM -#define PE9 65 // Y_DIR - -// Z_MOTOR -#define PC15 66 // Z_RESET -#define PC6 67 // Z_PWM -#define PC0 68 // Z_DIR - -// E1_MOTOR -#define PC14 69 // E1_RESET -#define PC13 70 // E1_DIR -#define PD12 71 // E1_PWM - -// E2_MOTOR -#define PE4 72 // E2_RESET -#define PE5 73 // E2_PWM -#define PE6 74 // E2_DIR - -// E3_MOTOR -#define PE3 75 // E3_RESET -#define PE2 76 // E3_DIR -#define PB8 77 // E3_PWM - -// This must be a literal -#define NUM_DIGITAL_PINS 78 -// This must be a literal with a value less than or equal to to MAX_ANALOG_INPUTS -#define NUM_ANALOG_INPUTS 6 -#define NUM_ANALOG_FIRST 51 - -// On-board LED pin number -#define LED_BUILTIN PE1 -#define LED_GREEN LED_BUILTIN - -// On-board user button -#define USER_BTN PE7 - -// UART Definitions -#define SERIAL_UART_INSTANCE 1 // Connected to ST-Link -//#define SERIAL_UART_INSTANCE 2 // Connected to WIFI - -// Default pin used for 'Serial' instance (ex: ST-Link) -// Mandatory for Firmata -#if SERIAL_UART_INSTANCE == 1 // ST-Link & J23 - #define PIN_SERIAL_RX PA10 - #define PIN_SERIAL_TX PA9 -#elif SERIAL_UART_INSTANCE == 2 // WIFI interface - #define PIN_SERIAL2_RX PD6 - #define PIN_SERIAL2_TX PD5 -#else - #error "Invalid setting for SERIAL_UART_INSTANCE." -#endif - -// Timer Definitions -#define TIMER_SERVO TIM4 // TIMER_SERVO must be defined in this file -#define TIMER_TONE TIM5 // TIMER_TONE must be defined in this file - -/* SD detect signal */ -/* - * By default, R67 is not provided, so SD card detect is not used. - * Note: SD CD (pin 16 of expansion connector J23) can be connected - * to GND in order to be able to use SD_DETECT_PIN - */ -/*#define SD_DETECT_PIN PA15*/ - -/* HAL configuration */ -#define HSE_VALUE 25000000U - -/* Extra HAL modules */ -#define HAL_SD_MODULE_ENABLED - -#endif - -#ifdef __cplusplus -} // extern "C" -#endif -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_HARDWARE Serial1 -#endif - -#endif // _VARIANT_ARDUINO_STM32_ - -// PA0 54 // E1_THERMISTOR -// PA1 55 // E2_THERMISTOR -// PA2 56 // E3_THERMISTOR -// PA3 53 // BED_THERMISTOR_3 -// PA4 16 // SPI_CS -// PA5 17 // SPI_SCK -// PA6 18 // SPI_MISO -// PA7 19 // SPI_MOSI -// PA8 43 // V_STOP -// PA9 0 //TX -// PA10 1 //RX -// PA11 30 //OTG_DM -// PA12 31 //OTG_DP -// PA13 20 // JTAG_TMS/SWDIO -// PA14 21 // JTAG_TCK/SWCLK -// PA15 25 // SD_CARD_DETECT -// PB0 49 // E2_HEAT_PWM -// PB1 50 // E3_HEAT_PWM -// PB3 22 // JTAG_TDO/SWO -// PB4 37 // USER4 -// PB5 6 // WIFI_WAKEUP -// PB6 15 // SCL -// PB7 14 // SDA -// PB8 77 // E3_PWM -// PB9 35 // USER1 -// PB10 64 // Y_PWM -// PB12 10 // SPI_CS -// PB13 13 // SPI_SCK -// PB14 12 // SPI_MISO -// PB15 11 // SPI_MOSI -// PC0 68 // Z_DIR -// PC1 33 //IR_ON -// PC2 51 // BED_THERMISTOR_1 -// PC3 52 // BED_THERMISTOR_2 -// PC4 57 // E1_FAN -// PC5 58 // E2_FAN -// PC6 67 // Z_PWM -// PC7 48 // E1_HEAT_PWM -// PC8 23 // SDIO_D0 -// PC9 24 // SDIO_D1 -// PC10 26 // SDIO_D2 -// PC11 27 // SDIO_D3 -// PC12 28 // SDIO_CK -// PC13 70 // E1_DIR -// PC14 69 // E1_RESET -// PC15 66 // Z_RESET -// PD0 44 // W_STOP -// PD1 32 //IR_OUT -// PD2 29 // SDIO_CMD -// PD3 2 // CTS -// PD4 3 // RTS -// PD5 4 // TX -// PD6 5 // RX -// PD7 34 // USER3 -// PD8 39 // X_STOP -// PD9 40 // Y_STOP -// PD10 41 // Z_STOP -// PD11 42 // U_STOP -// PD12 71 // E1_PWM -// PD13 45 // BED_HEAT_2 -// PD14 46 // BED_HEAT_1 -// PD15 47 // BED_HEAT_3 -// PE0 36 // USER2 -// PE1 9 // STATUS_LED -// PE2 76 // E3_DIR -// PE3 75 // E3_RESET -// PE4 72 // E2_RESET -// PE5 73 // E2_PWM -// PE6 74 // E2_DIR -// PE7 38 // USER_BUTTON -// PE8 59 // E3_FAN -// PE9 65 // Y_DIR -// PE10 63 // Y_RESET -// PE11 7 // WIFI_RESET -// PE12 8 // WIFI_BOOT -// PE13 60 // X_RESET -// PE14 61 // X_PWM -// PE15 62 // X_DIR diff --git a/buildroot/share/PlatformIO/variants/archim/.gitignore b/buildroot/share/PlatformIO/variants/archim/.gitignore deleted file mode 100644 index 2827c7d4f0..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Exception for libsam -!libsam_sam3x8e_gcc_rel.a diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile b/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile deleted file mode 100644 index 4332f36080..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# -# Copyright (c) 2011 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -SUBMAKE_OPTIONS=--no-builtin-rules --no-builtin-variables --no-print-directory - -#------------------------------------------------------------------------------- -# Rules -#------------------------------------------------------------------------------- - -all: arduino_due_x - -.PHONY: arduino_due_x -arduino_due_x: - @echo ------------------------------------------------------------------------------------ - @echo --- Making variant arduino_due_x - @$(MAKE) DEBUG=1 $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk -# @$(MAKE) $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk - @echo ------------------------------------------------------------------------------------ - -.PHONY: clean -clean: - @echo ------------------------------------------------------------------------------------ - @echo --- Cleaning variant arduino_due_x - @$(MAKE) DEBUG=1 $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk $@ -# @$(MAKE) $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk $@ - @echo ------------------------------------------------------------------------------------ - diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk deleted file mode 100644 index a3cc2337a8..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright (c) 2011 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -# Optimization level -# -O1 Optimize -# -O2 Optimize even more -# -O3 Optimize yet more -# -O0 Reduce compilation time and make debugging produce the expected results -# -Os Optimize for size -OPTIMIZATION = -g -O0 -DDEBUG diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk deleted file mode 100644 index 32f35d264c..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright (c) 2011 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -# Tool suffix when cross-compiling -CROSS_COMPILE = $(ARM_GCC_TOOLCHAIN)/arm-none-eabi- - -# Compilation tools -AR = $(CROSS_COMPILE)ar -CC = $(CROSS_COMPILE)gcc -CXX = $(CROSS_COMPILE)g++ -AS = $(CROSS_COMPILE)as -NM = $(CROSS_COMPILE)nm -ifeq ($(OS),Windows_NT) -RM=cs-rm -Rf -else -RM=rm -Rf -endif - -SEP=\\ - -# --------------------------------------------------------------------------------------- -# C Flags - -CFLAGS += -Wall -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -CFLAGS += -Werror-implicit-function-declaration -Wmain -Wparentheses -CFLAGS += -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -CFLAGS += -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef -CFLAGS += -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings -CFLAGS += -Wsign-compare -Waggregate-return -Wstrict-prototypes -CFLAGS += -Wmissing-prototypes -Wmissing-declarations -CFLAGS += -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -CFLAGS += -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long -CFLAGS += -Wunreachable-code -CFLAGS += -Wcast-align -#CFLAGS += -Wmissing-noreturn -#CFLAGS += -Wconversion - -CFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb -mlong-calls -ffunction-sections -fdata-sections -nostdlib -std=c99 -CFLAGS += $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) -D$(VARIANT) - -# To reduce application size use only integer printf function. -CFLAGS += -Dprintf=iprintf - -# --------------------------------------------------------------------------------------- -# CPP Flags - -CPPFLAGS += -Wall -Wchar-subscripts -Wcomment -Wformat=2 -CPPFLAGS += -Wmain -Wparentheses -Wcast-align -Wunreachable-code -CPPFLAGS += -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -CPPFLAGS += -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef -CPPFLAGS += -Wshadow -Wpointer-arith -Wwrite-strings -CPPFLAGS += -Wsign-compare -Waggregate-return -Wmissing-declarations -CPPFLAGS += -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -CPPFLAGS += -Wpacked -Wredundant-decls -Winline -Wlong-long -#CPPFLAGS += -Wmissing-noreturn -#CPPFLAGS += -Wconversion - -CPPFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb -mlong-calls -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -std=c++98 -CPPFLAGS += $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) - -# To reduce application size use only integer printf function. -CPPFLAGS += -Dprintf=iprintf - -# --------------------------------------------------------------------------------------- -# ASM Flags - -ASFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g $(OPTIMIZATION) $(INCLUDES) diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk deleted file mode 100644 index 3f8b1b7603..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk +++ /dev/null @@ -1,184 +0,0 @@ -# -# Copyright (c) 2012 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -# Makefile for compiling libArduino -.SUFFIXES: .o .a .c .s - -CHIP=__SAM3X8E__ -VARIANT=arduino_due_x -LIBNAME=libvariant_$(VARIANT) -TOOLCHAIN=gcc - -#------------------------------------------------------------------------------- -# Path -#------------------------------------------------------------------------------- - -# Output directories -OUTPUT_BIN = ../../../cores/arduino - -# Libraries -PROJECT_BASE_PATH = .. -SYSTEM_PATH = ../../../system -CMSIS_ROOT_PATH = $(SYSTEM_PATH)/CMSIS -CMSIS_ARM_PATH=$(CMSIS_ROOT_PATH)/CMSIS/Include -CMSIS_ATMEL_PATH=$(CMSIS_ROOT_PATH)/Device/ATMEL -#CMSIS_CHIP_PATH=$(CMSIS_ROOT_PATH)/Device/ATMEL/$(CHIP_SERIE) - -ARDUINO_PATH = ../../../cores/arduino -VARIANT_BASE_PATH = ../../../variants -VARIANT_PATH = ../../../variants/$(VARIANT) - -#------------------------------------------------------------------------------- -# Files -#------------------------------------------------------------------------------- - -#vpath %.h $(PROJECT_BASE_PATH) $(SYSTEM_PATH) $(VARIANT_PATH) -vpath %.cpp $(PROJECT_BASE_PATH) - -VPATH+=$(PROJECT_BASE_PATH) - -INCLUDES = -#INCLUDES += -I$(PROJECT_BASE_PATH) -INCLUDES += -I$(ARDUINO_PATH) -INCLUDES += -I$(ARDUINO_PATH)/USB -INCLUDES += -I$(SYSTEM_PATH) -INCLUDES += -I$(SYSTEM_PATH)/libsam -INCLUDES += -I$(SYSTEM_PATH)/USBHost -INCLUDES += -I$(VARIANT_BASE_PATH) -INCLUDES += -I$(VARIANT_PATH) -INCLUDES += -I$(CMSIS_ARM_PATH) -INCLUDES += -I$(CMSIS_ATMEL_PATH) - -#------------------------------------------------------------------------------- -ifdef DEBUG -include debug.mk -else -include release.mk -endif - -#------------------------------------------------------------------------------- -# Tools -#------------------------------------------------------------------------------- - -include $(TOOLCHAIN).mk - -#------------------------------------------------------------------------------- -ifdef DEBUG -OUTPUT_OBJ=debug -OUTPUT_LIB_POSTFIX=dbg -else -OUTPUT_OBJ=release -OUTPUT_LIB_POSTFIX=rel -endif - -OUTPUT_LIB=$(LIBNAME)_$(TOOLCHAIN)_$(OUTPUT_LIB_POSTFIX).a -OUTPUT_PATH=$(OUTPUT_OBJ)_$(VARIANT) - -#------------------------------------------------------------------------------- -# C source files and objects -#------------------------------------------------------------------------------- -C_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.c) - -C_OBJ_TEMP = $(patsubst %.c, %.o, $(notdir $(C_SRC))) - -# during development, remove some files -C_OBJ_FILTER= - -C_OBJ=$(filter-out $(C_OBJ_FILTER), $(C_OBJ_TEMP)) - -#------------------------------------------------------------------------------- -# CPP source files and objects -#------------------------------------------------------------------------------- -CPP_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.cpp) - -CPP_OBJ_TEMP = $(patsubst %.cpp, %.o, $(notdir $(CPP_SRC))) - -# during development, remove some files -CPP_OBJ_FILTER= - -CPP_OBJ=$(filter-out $(CPP_OBJ_FILTER), $(CPP_OBJ_TEMP)) - -#------------------------------------------------------------------------------- -# Assembler source files and objects -#------------------------------------------------------------------------------- -A_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.s) - -A_OBJ_TEMP=$(patsubst %.s, %.o, $(notdir $(A_SRC))) - -# during development, remove some files -A_OBJ_FILTER= - -A_OBJ=$(filter-out $(A_OBJ_FILTER), $(A_OBJ_TEMP)) - -#------------------------------------------------------------------------------- -# Rules -#------------------------------------------------------------------------------- -all: $(VARIANT) - -$(VARIANT): create_output $(OUTPUT_LIB) - -.PHONY: create_output -create_output: - @echo ------------------------------------------------------------------------------------ - @echo ------------------------- - @echo --- Preparing variant $(VARIANT) files in $(OUTPUT_PATH) $(OUTPUT_BIN) - @echo ------------------------- -# @echo *$(INCLUDES) -# @echo ------------------------- -# @echo *$(C_SRC) -# @echo ------------------------- -# @echo *$(C_OBJ) -# @echo ------------------------- -# @echo *$(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) -# @echo ------------------------- -# @echo *$(CPP_SRC) -# @echo ------------------------- -# @echo *$(CPP_OBJ) -# @echo ------------------------- -# @echo *$(addprefix $(OUTPUT_PATH)/, $(CPP_OBJ)) -# @echo ------------------------- -# @echo *$(A_SRC) -# @echo ------------------------- - - -@mkdir $(OUTPUT_PATH) 1>NUL 2>&1 - @echo ------------------------------------------------------------------------------------ - -$(addprefix $(OUTPUT_PATH)/,$(C_OBJ)): $(OUTPUT_PATH)/%.o: %.c -# @"$(CC)" -v -c $(CFLAGS) $< -o $@ - @"$(CC)" -c $(CFLAGS) $< -o $@ - -$(addprefix $(OUTPUT_PATH)/,$(CPP_OBJ)): $(OUTPUT_PATH)/%.o: %.cpp -# @"$(CC)" -c $(CPPFLAGS) $< -o $@ - @"$(CC)" -xc++ -c $(CPPFLAGS) $< -o $@ - -$(addprefix $(OUTPUT_PATH)/,$(A_OBJ)): $(OUTPUT_PATH)/%.o: %.s - @"$(AS)" -c $(ASFLAGS) $< -o $@ - -$(OUTPUT_LIB): $(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) $(addprefix $(OUTPUT_PATH)/, $(CPP_OBJ)) $(addprefix $(OUTPUT_PATH)/, $(A_OBJ)) - @"$(AR)" -v -r "$(OUTPUT_BIN)/$@" $^ - @"$(NM)" "$(OUTPUT_BIN)/$@" > "$(OUTPUT_BIN)/$@.txt" - - -.PHONY: clean -clean: - @echo ------------------------------------------------------------------------------------ - @echo --- Cleaning $(VARIANT) files [$(OUTPUT_PATH)$(SEP)*.o] - -@$(RM) $(OUTPUT_PATH) 1>NUL 2>&1 - -@$(RM) $(OUTPUT_BIN)/$(OUTPUT_LIB) 1>NUL 2>&1 - @echo ------------------------------------------------------------------------------------ - diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk deleted file mode 100644 index 2659255bff..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright (c) 2011 Arduino. All right reserved. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# - -# Optimization level -# -O1 Optimize -# -O2 Optimize even more -# -O3 Optimize yet more -# -O0 Reduce compilation time and make debugging produce the expected results -# -Os Optimize for size -OPTIMIZATION = -Os diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb deleted file mode 100644 index 4e8375b5f1..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb +++ /dev/null @@ -1,37 +0,0 @@ -#******************************************************* -# -# Connect to J-Link and debug application in flash on SAM3X. -# - -# Define 'reset' command -define reset - -# Connect to the J-Link gdb server -target remote localhost:2331 - -# Reset the chip to get to a known state -monitor reset - -# Select flash device -monitor flash device = AT91SAM3X8E - -# Enable flash download and flash breakpoints -monitor flash download = 1 - -# Load the program -load - -# Reset peripheral (RSTC_CR) -set *0x400e1a00 = 0xA5000004 - -# Initialize PC and stack pointer -mon reg sp=(0x80000) -#set *0x80004 = *0x80004 & 0xFFFFFFFE -mon reg pc=(0x80004) - -info reg - -break main - -# End of 'reset' command -end diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb deleted file mode 100644 index 15a1792a91..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb +++ /dev/null @@ -1,37 +0,0 @@ -#******************************************************* -# -# Connect to J-Link and debug application in sram on SAM3X. -# - -# Define 'reset' command -define reset - -# Connect to the J-Link gdb server -target remote localhost:2331 - -# Reset the chip to get to a known state -monitor reset - -# Select flash device -monitor flash device = AT91SAM3X8E - -# Enable flash download and flash breakpoints -monitor flash download = 1 - -# Load the program -load - -# Reset peripheral (RSTC_CR) -set *0x400e1a00 = 0xA5000004 - -# Initialize PC and stack pointer -mon reg sp=(0x20000000) -#set *0x20000004 = *0x20000004 & 0xFFFFFFFE -mon reg pc=(0x20000004) - -info reg - -break main - -# End of 'reset' command -end diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac deleted file mode 100644 index 959583582c..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac +++ /dev/null @@ -1,44 +0,0 @@ -// --------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// --------------------------------------------------------- -// The software is delivered "AS IS" without warranty or -// condition of any kind, either express, implied or -// statutory. This includes without limitation any warranty -// or condition with respect to merchantability or fitness -// for any particular purpose, or against the infringements of -// intellectual property rights of others. -// --------------------------------------------------------- -// File: at91sam3u-ek-flash.mac -// User setup file for CSPY debugger. -// --------------------------------------------------------- -__var __mac_i; -__var __mac_pt; - -/********************************************************************* -* -* execUserReset() -*/ -execUserReset() -{ - __message "------------------------------ execUserReset ---------------------------------"; - __message "-------------------------------Set PC Reset ----------------------------------"; - - __hwReset(0); - - // perpheral reset RSTC_CR - __writeMemory32(0xA5000004,0x400e1200,"Memory"); -} - -/********************************************************************* -* -* execUserPreload() -*/ -execUserPreload() -{ - __message "------------------------------ execUserPreload ---------------------------------"; - - __hwReset(0); //* Hardware Reset: CPU is automatically halted after the reset - - // perpheral reset RSTC_CR - __writeMemory32(0xA5000004,0x400e1200,"Memory"); -} diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac deleted file mode 100644 index d97a4ab6bb..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac +++ /dev/null @@ -1,44 +0,0 @@ -// --------------------------------------------------------- -// ATMEL Microcontroller Software Support - ROUSSET - -// --------------------------------------------------------- -// The software is delivered "AS IS" without warranty or -// condition of any kind, either express, implied or -// statutory. This includes without limitation any warranty -// or condition with respect to merchantability or fitness -// for any particular purpose, or against the infringements of -// intellectual property rights of others. -// --------------------------------------------------------- -// File: at91sam3u-ek-sram.mac -// User setup file for CSPY debugger. -// --------------------------------------------------------- -__var __mac_i; -__var __mac_pt; - -/********************************************************************* -* -* execUserReset() -*/ -execUserReset() -{ - __message "------------------------------ execUserReset ---------------------------------"; - __message "-------------------------------Set PC Reset ----------------------------------"; - - //__hwReset(50); - - // perpheral reset RSTC_CR - __writeMemory32(0xA5000004,0x400e1200,"Memory"); -} - -/********************************************************************* -* -* execUserPreload() -*/ -execUserPreload() -{ - __message "------------------------------ execUserPreload ---------------------------------"; - - __hwReset(0); //* Hardware Reset: CPU is automatically halted after the reset - - // perpheral reset RSTC_CR - __writeMemory32(0xA5000004,0x400e1200,"Memory"); -} diff --git a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a b/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a deleted file mode 100644 index 3e25e6cabd..0000000000 Binary files a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a and /dev/null differ diff --git a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt b/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt deleted file mode 100644 index 9b614811bd..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt +++ /dev/null @@ -1,576 +0,0 @@ - -adc10_sam3u.o: - -adc12_sam3u.o: - -adc_sam3snxa.o: - -pio.o: -00000000 T PIO_Clear -00000000 T PIO_Configure -00000000 T PIO_DisableInterrupt -00000000 T PIO_Get -00000000 T PIO_GetOutputDataStatus -00000000 T PIO_PullUp -00000000 T PIO_Set -00000000 T PIO_SetDebounceFilter -00000000 T PIO_SetInput -00000000 T PIO_SetOutput -00000000 T PIO_SetPeripheral - -pmc.o: -00000000 T pmc_clr_fast_startup_input -00000000 T pmc_disable_all_pck -00000000 T pmc_disable_all_periph_clk -00000000 T pmc_disable_interrupt -00000000 T pmc_disable_pck -00000000 T pmc_disable_periph_clk -00000000 T pmc_disable_pllack -00000000 T pmc_disable_udpck -00000000 T pmc_disable_upll_clock -00000000 T pmc_enable_all_pck -00000000 T pmc_enable_all_periph_clk -00000000 T pmc_enable_backupmode -00000000 T pmc_enable_interrupt -00000000 T pmc_enable_pck -00000000 T pmc_enable_periph_clk -00000000 T pmc_enable_pllack -00000000 T pmc_enable_sleepmode -00000000 T pmc_enable_udpck -00000000 T pmc_enable_upll_clock -00000000 T pmc_enable_waitmode -00000000 T pmc_get_interrupt_mask -00000000 T pmc_get_status -00000000 T pmc_get_writeprotect_status -00000000 T pmc_is_locked_pllack -00000000 T pmc_is_locked_upll -00000000 T pmc_is_pck_enabled -00000000 T pmc_is_periph_clk_enabled -00000000 T pmc_mck_set_prescaler -00000000 T pmc_mck_set_source -00000000 T pmc_osc_disable_fastrc -00000000 T pmc_osc_disable_xtal -00000000 T pmc_osc_enable_fastrc -00000000 T pmc_osc_is_ready_32kxtal -00000000 T pmc_osc_is_ready_mainck -00000000 T pmc_pck_set_prescaler -00000000 T pmc_pck_set_source -00000000 T pmc_set_fast_startup_input -00000000 T pmc_set_writeprotect -00000000 T pmc_switch_mainck_to_fastrc -00000000 T pmc_switch_mainck_to_xtal -00000000 T pmc_switch_mck_to_mainck -00000000 T pmc_switch_mck_to_pllack -00000000 T pmc_switch_mck_to_sclk -00000000 T pmc_switch_mck_to_upllck -00000000 T pmc_switch_pck_to_mainck -00000000 T pmc_switch_pck_to_pllack -00000000 T pmc_switch_pck_to_sclk -00000000 T pmc_switch_pck_to_upllck -00000000 T pmc_switch_sclk_to_32kxtal -00000000 T pmc_switch_udpck_to_pllack -00000000 T pmc_switch_udpck_to_upllck - -pwmc.o: -00000000 t FindClockConfiguration -00000000 T PWMC_ConfigureChannel -00000000 T PWMC_ConfigureChannelExt -00000000 T PWMC_ConfigureClocks -00000000 T PWMC_ConfigureComparisonUnit -00000000 T PWMC_ConfigureEventLineMode -00000000 T PWMC_ConfigureSyncChannel -00000000 T PWMC_DisableChannel -00000000 T PWMC_DisableChannelIt -00000000 T PWMC_DisableIt -00000000 T PWMC_DisableOverrideOutput -00000000 T PWMC_EnableChannel -00000000 T PWMC_EnableChannelIt -00000000 T PWMC_EnableFaultProtection -00000000 T PWMC_EnableIt -00000000 T PWMC_EnableOverrideOutput -00000000 T PWMC_FaultClear -00000000 T PWMC_SetDeadTime -00000000 T PWMC_SetDutyCycle -00000000 T PWMC_SetFaultMode -00000000 T PWMC_SetFaultProtectionValue -00000000 T PWMC_SetOverrideValue -00000000 T PWMC_SetPeriod -00000000 T PWMC_SetSyncChannelUpdatePeriod -00000000 T PWMC_SetSyncChannelUpdateUnlock -00000000 T PWMC_WriteBuffer - U __assert_func -00000000 r __func__.6793 -00000000 r __func__.6804 -00000000 r __func__.6819 -00000000 r __func__.6830 -00000000 r __func__.6841 -00000000 r __func__.6848 -00000000 r __func__.6932 -00000000 r __func__.6938 - -rtc.o: -00000000 T RTC_ClearSCCR -00000000 T RTC_DisableIt -00000000 T RTC_EnableIt -00000000 T RTC_GetDate -00000000 T RTC_GetHourMode -00000000 T RTC_GetSR -00000000 T RTC_GetTime -00000000 T RTC_SetDate -00000000 T RTC_SetDateAlarm -00000000 T RTC_SetHourMode -00000000 T RTC_SetTime -00000000 T RTC_SetTimeAlarm - U __assert_func -00000000 r __func__.6790 -00000000 r __func__.6799 -00000000 r __func__.6804 - -rtt.o: -00000000 T RTT_EnableIT -00000000 T RTT_GetStatus -00000000 T RTT_GetTime -00000000 T RTT_SetAlarm -00000000 T RTT_SetPrescaler - U __assert_func -00000000 r __func__.6797 -00000000 r __func__.6805 - -spi.o: -00000000 T SPI_Configure -00000000 T SPI_ConfigureNPCS -00000000 T SPI_Disable -00000000 T SPI_DisableIt -00000000 T SPI_Enable -00000000 T SPI_EnableIt -00000000 T SPI_GetStatus -00000000 T SPI_IsFinished -00000000 T SPI_Read -00000000 T SPI_Write - U pmc_enable_periph_clk - -tc.o: -00000000 T TC_Configure -00000000 T TC_FindMckDivisor -00000000 T TC_GetStatus -00000000 T TC_ReadCV -00000000 T TC_SetRA -00000000 T TC_SetRB -00000000 T TC_SetRC -00000000 T TC_Start -00000000 T TC_Stop - U __assert_func -00000000 r __func__.6792 -00000000 r __func__.6798 -00000000 r __func__.6804 - -timetick.o: -00000000 T GetTickCount -00000000 T Sleep -00000000 T TimeTick_Configure -00000000 T TimeTick_Increment -00000000 T Wait -00000000 b _dwTickCount - -twi.o: -00000000 T TWI_ByteReceived -00000000 T TWI_ByteSent -00000000 T TWI_ConfigureMaster -00000000 T TWI_ConfigureSlave -00000000 T TWI_Disable -00000000 T TWI_DisableIt -00000000 T TWI_EnableIt -00000000 T TWI_GetMaskedStatus -00000000 T TWI_GetStatus -00000000 T TWI_ReadByte -00000000 T TWI_SendSTOPCondition -00000000 T TWI_SetClock -00000000 T TWI_StartRead -00000000 T TWI_StartWrite -00000000 T TWI_Stop -00000000 T TWI_TransferComplete -00000000 T TWI_WriteByte - U __assert_func -00000000 r __func__.7151 -00000000 r __func__.7157 -00000000 r __func__.7172 -00000000 r __func__.7176 -00000000 r __func__.7184 -00000000 r __func__.7191 -00000000 r __func__.7195 -00000000 r __func__.7200 -00000000 r __func__.7208 -00000000 r __func__.7222 -00000000 r __func__.7227 -00000000 r __func__.7231 -00000000 r __func__.7236 -00000000 r __func__.7240 - -usart.o: -00000000 T USART_Configure -00000000 T USART_DisableIt -00000000 T USART_EnableIt -00000000 T USART_GetChar -00000000 T USART_GetStatus -00000000 T USART_IsDataAvailable -00000000 T USART_IsRxReady -00000000 T USART_PutChar -00000000 T USART_Read -00000000 T USART_ReadBuffer -00000000 T USART_SetIrdaFilter -00000000 T USART_SetReceiverEnabled -00000000 T USART_SetTransmitterEnabled -00000000 T USART_Write -00000000 T USART_WriteBuffer - U __assert_func -00000000 r __func__.7068 - -wdt.o: -00000000 T WDT_Disable -00000000 T WDT_Enable -00000000 T WDT_GetPeriod -00000000 T WDT_GetStatus -00000000 T WDT_Restart - -system_sam3xa.o: -00000000 D SystemCoreClock -00000000 T SystemCoreClockUpdate -00000000 T SystemInit -00000000 T system_init_flash - -startup_sam3xa.o: - U ADC_Handler - U BusFault_Handler - U CAN0_Handler - U CAN1_Handler - U DACC_Handler - U DMAC_Handler - U DebugMon_Handler - U EFC0_Handler - U EFC1_Handler - U EMAC_Handler - U HSMCI_Handler - U HardFault_Handler - U MemManage_Handler - U NMI_Handler - U PIOA_Handler - U PIOB_Handler - U PIOC_Handler - U PIOD_Handler - U PMC_Handler - U PWM_Handler - U PendSV_Handler - U RSTC_Handler - U RTC_Handler - U RTT_Handler -00000000 T Reset_Handler - U SMC_Handler - U SPI0_Handler - U SSC_Handler - U SUPC_Handler - U SVC_Handler - U SysTick_Handler - U TC0_Handler - U TC1_Handler - U TC2_Handler - U TC3_Handler - U TC4_Handler - U TC5_Handler - U TC6_Handler - U TC7_Handler - U TC8_Handler - U TRNG_Handler - U TWI0_Handler - U TWI1_Handler - U UART_Handler - U UOTGHS_Handler - U USART0_Handler - U USART1_Handler - U USART2_Handler - U USART3_Handler - U UsageFault_Handler - U WDT_Handler - U _erelocate - U _estack - U _etext - U _ezero - U _sfixed - U _srelocate - U _szero -00000000 R exception_table - U main - -adc.o: -00000000 T adc_configure_power_save -00000000 T adc_configure_sequence -00000000 T adc_configure_timing -00000000 T adc_configure_trigger -00000000 T adc_disable_all_channel -00000000 T adc_disable_anch -00000000 T adc_disable_channel -00000000 T adc_disable_channel_differential_input -00000000 T adc_disable_channel_input_offset -00000000 T adc_disable_interrupt -00000000 T adc_disable_tag -00000000 T adc_disable_ts -00000000 T adc_enable_all_channel -00000000 T adc_enable_anch -00000000 T adc_enable_channel -00000000 T adc_enable_channel_differential_input -00000000 T adc_enable_channel_input_offset -00000000 T adc_enable_interrupt -00000000 T adc_enable_tag -00000000 T adc_enable_ts -00000000 T adc_get_actual_adc_clock -00000000 T adc_get_channel_status -00000000 T adc_get_channel_value -00000000 T adc_get_comparison_mode -00000000 T adc_get_interrupt_mask -00000000 T adc_get_latest_value -00000000 T adc_get_overrun_status -00000000 T adc_get_pdc_base -00000000 T adc_get_status -00000000 T adc_get_tag -00000000 T adc_get_writeprotect_status -00000000 T adc_init -00000000 T adc_set_bias_current -00000000 T adc_set_channel_input_gain -00000000 T adc_set_comparison_channel -00000000 T adc_set_comparison_mode -00000000 T adc_set_comparison_window -00000000 T adc_set_resolution -00000000 T adc_set_writeprotect -00000000 T adc_start -00000000 T adc_start_sequencer -00000000 T adc_stop -00000000 T adc_stop_sequencer - -udp.o: - -udphs.o: - -uotghs.o: -00000000 T UOTGHS_Handler -00000000 B gpf_isr - -interrupt_sam_nvic.o: -00000000 D g_interrupt_enabled - -uotghs_device.o: -00000000 T UDD_Attach -00000000 T UDD_ClearIN -00000000 T UDD_ClearOUT -00000000 T UDD_ClearSetupInt -00000000 T UDD_Detach -00000000 T UDD_FifoByteCount -00000000 T UDD_GetFrameNumber -00000000 T UDD_Init -00000000 T UDD_InitEP -00000000 T UDD_InitEndpoints -00000000 T UDD_ReadWriteAllowed -00000000 T UDD_ReceivedSetupInt -00000000 T UDD_Recv -00000000 T UDD_Recv8 -00000000 T UDD_ReleaseRX -00000000 T UDD_ReleaseTX -00000000 T UDD_Send -00000000 T UDD_Send8 -00000000 T UDD_SetAddress -00000000 T UDD_SetStack -00000000 T UDD_Stall -00000000 T UDD_WaitForINOrOUT -00000000 T UDD_WaitIN -00000000 T UDD_WaitOUT - U g_interrupt_enabled - U gpf_isr - U pmc_enable_periph_clk - U pmc_enable_udpck - U pmc_enable_upll_clock - U pmc_switch_udpck_to_upllck -00000000 b ul_recv_fifo_ptr -00000000 b ul_send_fifo_ptr - -uotghs_host.o: -00000000 T UHD_BusReset -00000000 T UHD_GetVBUSState -00000000 t UHD_ISR -00000000 T UHD_Init -00000000 T UHD_Pipe0_Alloc -00000000 T UHD_Pipe_Alloc -00000000 T UHD_Pipe_Free -00000000 T UHD_Pipe_Is_Transfer_Complete -00000000 T UHD_Pipe_Read -00000000 T UHD_Pipe_Send -00000000 T UHD_Pipe_Write -00000000 T UHD_SetStack - U g_interrupt_enabled - U gpf_isr - U pmc_enable_periph_clk - U pmc_enable_udpck - U pmc_enable_upll_clock - U pmc_switch_udpck_to_upllck -00000000 b uhd_state - -dacc.o: -00000000 T dacc_disable_channel -00000000 T dacc_disable_interrupt -00000000 T dacc_disable_trigger -00000000 T dacc_enable_channel -00000000 T dacc_enable_flexible_selection -00000000 T dacc_enable_interrupt -00000000 T dacc_get_analog_control -00000000 T dacc_get_channel_status -00000000 T dacc_get_interrupt_mask -00000000 T dacc_get_interrupt_status -00000000 T dacc_get_pdc_base -00000000 T dacc_get_writeprotect_status -00000000 T dacc_reset -00000000 T dacc_set_analog_control -00000000 T dacc_set_channel_selection -00000000 T dacc_set_power_save -00000000 T dacc_set_timing -00000000 T dacc_set_transfer_mode -00000000 T dacc_set_trigger -00000000 T dacc_set_writeprotect -00000000 T dacc_write_conversion_data - -can.o: -00000000 R can_bit_time -00000000 T can_disable -00000000 T can_disable_autobaud_listen_mode -00000000 T can_disable_interrupt -00000000 T can_disable_low_power_mode -00000000 T can_disable_overload_frame -00000000 T can_disable_time_triggered_mode -00000000 T can_disable_timer_freeze -00000000 T can_disable_tx_repeat -00000000 T can_enable -00000000 T can_enable_autobaud_listen_mode -00000000 T can_enable_interrupt -00000000 T can_enable_low_power_mode -00000000 T can_enable_overload_frame -00000000 T can_enable_time_triggered_mode -00000000 T can_enable_timer_freeze -00000000 T can_enable_tx_repeat -00000000 T can_get_internal_timer_value -00000000 T can_get_interrupt_mask -00000000 T can_get_rx_error_cnt -00000000 T can_get_status -00000000 T can_get_timestamp_value -00000000 T can_get_tx_error_cnt -00000000 T can_global_send_abort_cmd -00000000 T can_global_send_transfer_cmd -00000000 T can_init -00000000 T can_mailbox_get_status -00000000 T can_mailbox_init -00000000 T can_mailbox_read -00000000 T can_mailbox_send_abort_cmd -00000000 T can_mailbox_send_transfer_cmd -00000000 T can_mailbox_set_timemark -00000000 T can_mailbox_tx_remote_frame -00000000 T can_mailbox_write -00000000 T can_reset_all_mailbox -00000000 T can_reset_internal_timer -00000000 T can_reset_mailbox_data -00000000 T can_set_rx_sync_stage -00000000 T can_set_timestamp_capture_point - U memset - -efc.o: -00000000 T efc_disable_frdy_interrupt -00000000 T efc_enable_frdy_interrupt -00000000 T efc_get_flash_access_mode -00000000 T efc_get_result -00000000 T efc_get_status -00000000 T efc_get_wait_state -00000000 T efc_init -00000000 T efc_perform_command -0000006c T efc_perform_fcr -00000000 T efc_perform_read_sequence -00000000 T efc_set_flash_access_mode -00000000 T efc_set_wait_state -00000068 T efc_write_fmr -00000000 b iap_perform_command.7049 - -gpbr.o: -00000000 T gpbr_read -00000000 T gpbr_write - -ssc.o: - U memset -00000000 T ssc_disable_interrupt -00000000 T ssc_disable_rx -00000000 T ssc_disable_tx -00000000 T ssc_disable_tx_frame_sync_data -00000000 T ssc_enable_interrupt -00000000 T ssc_enable_rx -00000000 T ssc_enable_tx -00000000 T ssc_enable_tx_frame_sync_data -00000000 T ssc_get_interrupt_mask -00000000 T ssc_get_rx_access -00000000 T ssc_get_rx_compare -00000000 T ssc_get_status -00000000 T ssc_get_tx_access -00000000 T ssc_get_writeprotect_status -00000000 T ssc_i2s_set_receiver -00000000 T ssc_i2s_set_transmitter -00000000 T ssc_is_rx_enabled -00000000 T ssc_is_rx_ready -00000000 T ssc_is_tx_empty -00000000 T ssc_is_tx_enabled -00000000 T ssc_is_tx_ready -00000000 T ssc_read -00000000 T ssc_read_sync_data -00000000 T ssc_reset -00000000 T ssc_set_clock_divider -00000000 T ssc_set_loop_mode -00000000 T ssc_set_normal_mode -00000000 T ssc_set_receiver -00000000 T ssc_set_rx_compare -00000000 T ssc_set_rx_stop_selection -00000000 T ssc_set_td_default_level -00000000 T ssc_set_transmitter -00000000 T ssc_set_writeprotect -00000000 T ssc_write -00000000 T ssc_write_sync_data - -trng.o: -00000000 T trng_disable -00000000 T trng_disable_interrupt -00000000 T trng_enable -00000000 T trng_enable_interrupt -00000000 T trng_get_interrupt_mask -00000000 T trng_get_interrupt_status -00000000 T trng_read_output_data - -rstc.o: -00000000 T rstc_disable_user_reset -00000000 T rstc_disable_user_reset_interrupt -00000000 T rstc_enable_user_reset -00000000 T rstc_enable_user_reset_interrupt -00000000 T rstc_get_reset_cause -00000000 T rstc_get_status -00000000 T rstc_reset_extern -00000000 T rstc_set_external_reset -00000000 T rstc_start_software_reset - -emac.o: -00000000 t circ_inc -00000000 T emac_dev_get_tx_load -00000000 T emac_dev_init -00000000 T emac_dev_read -00000000 T emac_dev_reset -00000000 T emac_dev_set_rx_callback -00000000 T emac_dev_set_tx_wakeup_callback -00000000 T emac_dev_write -00000000 T emac_handler -00000000 T emac_phy_read -00000000 T emac_phy_write -00000000 t emac_reset_rx_mem -00000000 t emac_reset_tx_mem -00000000 b gs_rx_desc -00000000 b gs_tx_callback -00000000 b gs_tx_desc -00000000 b gs_uc_rx_buffer -00000000 b gs_uc_tx_buffer - U memcpy diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld deleted file mode 100644 index 53f2b5f1f5..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld +++ /dev/null @@ -1,146 +0,0 @@ -/* ---------------------------------------------------------------------------- - * SAM Software Package License - * ---------------------------------------------------------------------------- - * Copyright (c) 2012, Atmel Corporation - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following condition is met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the disclaimer below. - * - * Atmel's name may not be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE - * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * ---------------------------------------------------------------------------- - */ - -OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -OUTPUT_ARCH(arm) -SEARCH_DIR(.) - -/* Memory Spaces Definitions */ -MEMORY -{ - rom (rx) : ORIGIN = 0x00080000, LENGTH = 0x00080000 /* Flash, 512K */ - sram0 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 /* sram0, 64K */ - sram1 (rwx) : ORIGIN = 0x20080000, LENGTH = 0x00008000 /* sram1, 32K */ - ram (rwx) : ORIGIN = 0x20070000, LENGTH = 0x00018000 /* sram, 96K */ -} - -/* Section Definitions */ -SECTIONS -{ - .text : - { - . = ALIGN(4); - _sfixed = .; - KEEP(*(.vectors .vectors.*)) - *(.text .text.* .gnu.linkonce.t.*) - *(.glue_7t) *(.glue_7) - *(.rodata .rodata* .gnu.linkonce.r.*) - *(.ARM.extab* .gnu.linkonce.armextab.*) - - /* Support C constructors, and C destructors in both user code - and the C library. This also provides support for C++ code. */ - . = ALIGN(4); - KEEP(*(.init)) - . = ALIGN(4); - __preinit_array_start = .; - KEEP (*(.preinit_array)) - __preinit_array_end = .; - - . = ALIGN(4); - __init_array_start = .; - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - __init_array_end = .; - - . = ALIGN(0x4); - KEEP (*crtbegin.o(.ctors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*crtend.o(.ctors)) - - . = ALIGN(4); - KEEP(*(.fini)) - - . = ALIGN(4); - __fini_array_start = .; - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - __fini_array_end = .; - - KEEP (*crtbegin.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*crtend.o(.dtors)) - - . = ALIGN(4); - _efixed = .; /* End of text section */ - } > rom - - /* .ARM.exidx is sorted, so has to go in its own output section. */ - PROVIDE_HIDDEN (__exidx_start = .); - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > rom - PROVIDE_HIDDEN (__exidx_end = .); - - . = ALIGN(4); - _etext = .; - - .relocate : AT (_etext) - { - . = ALIGN(4); - _srelocate = .; - *(.ramfunc .ramfunc.*); - *(.data .data.*); - . = ALIGN(4); - _erelocate = .; - } > ram - - /* .bss section which is used for uninitialized data */ - .bss ALIGN(4) (NOLOAD) : - { - . = ALIGN(4); - _sbss = . ; - _szero = .; - *(.bss .bss.*) - *(COMMON) - . = ALIGN(4); - _ebss = . ; - _ezero = .; - } > ram - - . = ALIGN(4); - _end = . ; - - /* .stack_dummy section doesn't contains any symbols. It is only - used for linker to calculate size of stack sections, and assign - values to stack symbols later */ - .stack_dummy : - { - *(.stack*) - } > ram - - /* Set stack top to end of ram, and stack limit move down by - * size of stack_dummy section */ - __StackTop = ORIGIN(ram) + LENGTH(ram); - __StackLimit = __StackTop - SIZEOF(.stack_dummy); - PROVIDE(_sstack = __StackLimit); - PROVIDE(_estack = __StackTop); -} diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld deleted file mode 100644 index 2a0d54e179..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld +++ /dev/null @@ -1,145 +0,0 @@ -/* ---------------------------------------------------------------------------- - * SAM Software Package License - * ---------------------------------------------------------------------------- - * Copyright (c) 2012, Atmel Corporation - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following condition is met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the disclaimer below. - * - * Atmel's name may not be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE - * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, - * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * ---------------------------------------------------------------------------- - */ - -OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -OUTPUT_ARCH(arm) -SEARCH_DIR(.) - -/* Memory Spaces Definitions */ -MEMORY -{ - rom (rx) : ORIGIN = 0x00080000, LENGTH = 0x00080000 /* Flash, 512K */ - sram0 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 /* sram0, 64K */ - sram1 (rwx) : ORIGIN = 0x20080000, LENGTH = 0x00008000 /* sram1, 32K */ - ram (rwx) : ORIGIN = 0x20070000, LENGTH = 0x00018000 /* sram, 96K */ -} - -/* The stack size used by the application. NOTE: you need to adjust */ -STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : 0x2000 ; - -/* Section Definitions */ -SECTIONS -{ - .text : - { - . = ALIGN(4); - _sfixed = .; - KEEP(*(.vectors .vectors.*)) - *(.text .text.* .gnu.linkonce.t.*) - *(.glue_7t) *(.glue_7) - *(.rodata .rodata* .gnu.linkonce.r.*) - *(.ARM.extab* .gnu.linkonce.armextab.*) - - /* Support C constructors, and C destructors in both user code - and the C library. This also provides support for C++ code. */ - . = ALIGN(4); - KEEP(*(.init)) - . = ALIGN(4); - __preinit_array_start = .; - KEEP (*(.preinit_array)) - __preinit_array_end = .; - - . = ALIGN(4); - __init_array_start = .; - KEEP (*(SORT(.init_array.*))) - KEEP (*(.init_array)) - __init_array_end = .; - - . = ALIGN(0x4); - KEEP (*crtbegin.o(.ctors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*crtend.o(.ctors)) - - . = ALIGN(4); - KEEP(*(.fini)) - - . = ALIGN(4); - __fini_array_start = .; - KEEP (*(.fini_array)) - KEEP (*(SORT(.fini_array.*))) - __fini_array_end = .; - - KEEP (*crtbegin.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*crtend.o(.dtors)) - - . = ALIGN(4); - _efixed = .; /* End of text section */ - } > ram - - . = ALIGN(4); - _etext = .; - - .relocate : AT (_etext) - { - . = ALIGN(4); - _srelocate = .; - *(.ramfunc .ramfunc.*); - *(.data .data.*); - . = ALIGN(4); - _erelocate = .; - } > ram - - /* .bss section which is used for uninitialized data */ - .bss (NOLOAD) : - { - . = ALIGN(4); - _sbss = . ; - _szero = .; - *(.bss .bss.*) - *(COMMON) - . = ALIGN(4); - _ebss = . ; - _ezero = .; - } > ram - - /* stack section */ - .stack (NOLOAD): - { - . = ALIGN(8); - _sstack = .; - . = . + STACK_SIZE; - . = ALIGN(8); - _estack = .; - } > ram - - /* .ARM.exidx is sorted, so has to go in its own output section. */ - PROVIDE_HIDDEN (__exidx_start = .); - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > ram - PROVIDE_HIDDEN (__exidx_end = .); - - . = ALIGN(4); - _end = . ; -} - diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf deleted file mode 100644 index 956230fbd3..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf +++ /dev/null @@ -1,49 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ -/*-Vector table start*/ -define symbol __ICFEDIT_vector_start__ = 0x00080000; /*Add for CMSIS*/ -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_RAM0_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM0_end__ = 0x20007FFF; -define symbol __ICFEDIT_region_RAM1_start__ = 0x20080000; -define symbol __ICFEDIT_region_RAM1_end__ = 0x20083FFF; -define symbol __ICFEDIT_region_ROM0_start__ = 0x00080000; -define symbol __ICFEDIT_region_ROM0_end__ = 0x0009FFFF; -define symbol __ICFEDIT_region_ROM1_start__ = 0x00100000; -define symbol __ICFEDIT_region_ROM1_end__ = 0x0011FFFF; -/*-Sizes-*/ -/*define symbol __ICFEDIT_size_cstack__ = 0x1000;*//*for nandflash*/ -define symbol __ICFEDIT_size_cstack__ = 0x2000; -define symbol __ICFEDIT_size_heap__ = 0x200; -/*-Specials-*/ -/*define symbol __ICFEDIT_region_RAM_VECT_start__ = __ICFEDIT_region_RAM0_start__;*/ /*Referenced for CMSIS*/ -/*define symbol __ICFEDIT_size_vectors__ = 0x100;*/ /*Referenced for CMSIS*/ -/*-Exports-*/ -/*export symbol __ICFEDIT_region_RAM_VECT_start__;*/ -export symbol __ICFEDIT_vector_start__; /*Add for CMSIS*/ -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -/*define region RAM_VECT_region = mem:[from __ICFEDIT_region_RAM_VECT_start__ size __ICFEDIT_size_vectors__];*/ /*Referenced for CMSIS*/ -/*define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__];*/ /*Referenced for CMSIS*/ -define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__ to __ICFEDIT_region_RAM0_end__]; -define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; -/*define region RAM_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__] | - mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];*/ /*Referenced for CMSIS*/ -define region ROM0_region = mem:[from __ICFEDIT_region_ROM0_start__ to __ICFEDIT_region_ROM0_end__]; -define region ROM1_region = mem:[from __ICFEDIT_region_ROM1_start__ to __ICFEDIT_region_ROM1_end__]; - -/*define block RamVect with alignment = 8, size = __ICFEDIT_size_vectors__ { };*/ -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -/*place at start of ROM0_region { readonly section .vectors };*/ /*Referenced for CMSIS*/ -place at address mem:__ICFEDIT_vector_start__ { readonly section .intvec }; /*Add for CMSIS*/ -place in ROM0_region { readonly }; -place in RAM0_region { readwrite, block HEAP }; -place in RAM1_region { block CSTACK }; /* for nandflash*/ -/*place in RAM_VECT_region { block RamVect };*/ /*Referenced for CMSIS*/ \ No newline at end of file diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf deleted file mode 100644 index d7d33537ac..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf +++ /dev/null @@ -1,33 +0,0 @@ -/*###ICF### Section handled by ICF editor, don't touch! ****/ -/*-Editor annotation file-*/ -/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ -/*-Vector table start*/ -define symbol __ICFEDIT_vector_start__ = 0x20000000; -/*-Memory Regions-*/ -define symbol __ICFEDIT_region_RAM0_start__ = 0x20000000; -define symbol __ICFEDIT_region_RAM0_end__ = 0x20007FFF; -define symbol __ICFEDIT_region_RAM1_start__ = 0x20080000; -define symbol __ICFEDIT_region_RAM1_end__ = 0x20083FFF; -/*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x900; -define symbol __ICFEDIT_size_heap__ = 0x200; -/*-Exports-*/ -export symbol __ICFEDIT_vector_start__; -/**** End of ICF editor section. ###ICF###*/ - -define memory mem with size = 4G; -define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__ to __ICFEDIT_region_RAM0_end__]; -define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; -/*define region RAM_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__] | - mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];*/ - -/* define block RamVect with alignment = 8, size = __ICFEDIT_size_vectors__ { }; */ -define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; -define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; - -initialize by copy { readwrite }; -do not initialize { section .noinit }; - -place at address mem:__ICFEDIT_vector_start__ { readonly section .intvec }; -place in RAM0_region { readonly }; -place in RAM1_region { readwrite, block CSTACK, block HEAP }; diff --git a/buildroot/share/PlatformIO/variants/archim/pins_arduino.h b/buildroot/share/PlatformIO/variants/archim/pins_arduino.h deleted file mode 100644 index 4e279aa7be..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/pins_arduino.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - Copyright (c) 2011 Arduino. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -// API compatibility -#include "variant.h" - diff --git a/buildroot/share/PlatformIO/variants/archim/variant.cpp b/buildroot/share/PlatformIO/variants/archim/variant.cpp deleted file mode 100644 index 72ad45ef46..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/variant.cpp +++ /dev/null @@ -1,485 +0,0 @@ -/* - Copyright (c) 2011 Arduino. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "variant.h" - -/* - * DUE Board pin | PORT | Label - * ----------------+--------+------- - * 0 | PA8 | "RX0" - * 1 | PA9 | "TX0" - * 2 TIOA0 | PB25 | - * 3 TIOA7 | PC28 | - * 4 NPCS1 | PA29 | - * TIOB6 | PC26 | - * 5 TIOA6 | PC25 | - * 6 PWML7 | PC24 | - * 7 PWML6 | PC23 | - * 8 PWML5 | PC22 | - * 9 PWML4 | PC21 | - * 10 NPCS0 | PA28 | - * TIOB7 | PC29 | - * 11 TIOA8 | PD7 | - * 12 TIOB8 | PD8 | - * 13 TIOB0 | PB27 | LED AMBER "L" - * 14 TXD3 | PD4 | "TX3" - * 15 RXD3 | PD5 | "RX3" - * 16 TXD1 | PA13 | "TX2" - * 17 RXD1 | PA12 | "RX2" - * 18 TXD0 | PA11 | "TX1" - * 19 RXD0 | PA10 | "RX1" - * 20 | PB12 | "SDA" - * 21 | PB13 | "SCL" - * 22 | PB26 | - * 23 | PA14 | - * 24 | PA15 | - * 25 | PD0 | - * 26 | PD1 | - * 27 | PD2 | - * 28 | PD3 | - * 29 | PD6 | - * 30 | PD9 | - * 31 | PA7 | - * 32 | PD10 | - * 33 | PC1 | - * 34 | PC2 | - * 35 | PC3 | - * 36 | PC4 | - * 37 | PC5 | - * 38 | PC6 | - * 39 | PC7 | - * 40 | PC8 | - * 41 | PC9 | - * 42 | PA19 | - * 43 | PA20 | - * 44 | PC19 | - * 45 | PC18 | - * 46 | PC17 | - * 47 | PC16 | - * 48 | PC15 | - * 49 | PC14 | - * 50 | PC13 | - * 51 | PC12 | - * 52 NPCS2 | PB21 | - * 53 | PB14 | - * 54 | PA16 | "A0" - * 55 | PA24 | "A1" - * 56 | PA23 | "A2" - * 57 | PA22 | "A3" - * 58 TIOB2 | PA6 | "A4" - * 69 | PA4 | "A5" - * 60 TIOB1 | PA3 | "A6" - * 61 TIOA1 | PA2 | "A7" - * 62 | PB17 | "A8" - * 63 | PB18 | "A9" - * 64 | PB19 | "A10" - * 65 | PB20 | "A11" - * 66 | PB15 | "DAC0" - * 67 | PB16 | "DAC1" - * 68 | PA1 | "CANRX" - * 69 | PA0 | "CANTX" - * 70 | PA17 | "SDA1" - * 71 | PA18 | "SCL1" - * 72 | PC30 | LED AMBER "RX" - * 73 | PA21 | LED AMBER "TX" - * 74 MISO | PA25 | - * 75 MOSI | PA26 | - * 76 SCLK | PA27 | - * 77 NPCS0 | PA28 | - * 78 NPCS3 | PB23 | unconnected! - * - * USB pin | PORT - * ----------------+-------- - * ID | PB11 - * VBOF | PB10 - * - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Pins descriptions - */ -extern const PinDescription g_APinDescription[]= -{ - // 0 .. 53 - Digital pins - // ---------------------- - // 0/1 - UART (Serial) - { PIOA, PIO_PA8A_URXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // URXD - { PIOA, PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // UTXD - - // 2 - { PIOB, PIO_PB25B_TIOA0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHA0 }, // TIOA0 - { PIOC, PIO_PC28B_TIOA7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA7 }, // TIOA7 - { PIOC, PIO_PC26B_TIOB6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB6 }, // TIOB6 - - // 5 - { PIOC, PIO_PC25B_TIOA6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA6 }, // TIOA6 - { PIOC, PIO_PC24B_PWML7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH7, NOT_ON_TIMER }, // PWML7 - { PIOC, PIO_PC23B_PWML6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH6, NOT_ON_TIMER }, // PWML6 - { PIOC, PIO_PC22B_PWML5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWML5 - { PIOC, PIO_PC21B_PWML4, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH4, NOT_ON_TIMER }, // PWML4 - // 10 - { PIOC, PIO_PC29B_TIOB7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB7 }, // TIOB7 - { PIOD, PIO_PD7B_TIOA8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA8 }, // TIOA8 - { PIOD, PIO_PD8B_TIOB8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB8 }, // TIOB8 - - // 13 - AMBER LED - { PIOB, PIO_PB27B_TIOB0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHB0 }, // TIOB0 - - // 14/15 - USART3 (Serial3) - { PIOD, PIO_PD4B_TXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD3 - { PIOD, PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD3 - - // 16/17 - USART1 (Serial2) - { PIOA, PIO_PA13A_TXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD1 - { PIOA, PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD1 - - // 18/19 - USART0 (Serial1) - { PIOA, PIO_PA11A_TXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD0 - { PIOA, PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD0 - - // 20/21 - TWI1 - { PIOB, PIO_PB12A_TWD1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD1 - SDA0 - { PIOB, PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK1 - SCL0 - - // 22 - { PIOB, PIO_PB26, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 22 - { PIOA, PIO_PA14, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 23 - { PIOA, PIO_PA15, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 24 - { PIOD, PIO_PD0, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 25 - - // 26 - { PIOD, PIO_PD1, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 26 - { PIOD, PIO_PD2, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 27 - { PIOD, PIO_PD3, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 28 - { PIOD, PIO_PD6, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 29 - - // 30 - { PIOD, PIO_PD9, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 30 - { PIOA, PIO_PA7, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 31 - { PIOD, PIO_PD10, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 32 - { PIOC, PIO_PC1, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 33 - - // 34 - { PIOC, PIO_PC2, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 34 - { PIOC, PIO_PC3, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 35 -//{ PIOC, PIO_PC3B_PWMH0, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH0, NOT_ON_TIMER }, // PWMH0 PIN 35 - { PIOC, PIO_PC4, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 36 - { PIOC, PIO_PC5, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 37 -//{ PIOC, PIO_PC5B_PWMH1, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH1, NOT_ON_TIMER }, // PWMH1 PIN 37 - - // 38 - { PIOC, PIO_PC6, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 38 - { PIOC, PIO_PC7, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 39 -//{ PIOC, PIO_PC7B_PWMH2, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH2, NOT_ON_TIMER }, // PWMH2 PIN 39 - { PIOC, PIO_PC8, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 40 -//{ PIOC, PIO_PC8B_PWML3, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH3, NOT_ON_TIMER }, // PWML3 PIN 40 - { PIOC, PIO_PC9, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 41 - - // 42 - { PIOA, PIO_PA19, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 42 - { PIOA, PIO_PA20, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 43 - { PIOC, PIO_PC19, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 44 -//{ PIOC, PIO_PC19B_PWMH5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWMH5 PIN 44 - { PIOC, PIO_PC18, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 45 - - // 46 - { PIOC, PIO_PC17, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 46 - { PIOC, PIO_PC16, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 47 - { PIOC, PIO_PC15, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 48 - { PIOC, PIO_PC14, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 49 - - // 50 - { PIOC, PIO_PC13, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 50 - { PIOC, PIO_PC12, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 51 - { PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52 - { PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53 - - - // 54 .. 65 - Analog pins - // ---------------------- - { PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0 - { PIOA, PIO_PA24X1_AD6, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC1, ADC6, NOT_ON_PWM, NOT_ON_TIMER }, // AD1 - { PIOA, PIO_PA23X1_AD5, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC2, ADC5, NOT_ON_PWM, NOT_ON_TIMER }, // AD2 - { PIOA, PIO_PA22X1_AD4, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC3, ADC4, NOT_ON_PWM, NOT_ON_TIMER }, // AD3 - // 58 -//{ PIOA, PIO_PA6X1_AD3, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // AD4 - { PIOA, PIO_PA6A_TIOB2, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_TIMER|PIN_ATTR_DIGITAL), ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // TIOB2 - { PIOA, PIO_PA4X1_AD2, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC5, ADC2, NOT_ON_PWM, NOT_ON_TIMER }, // AD5 - { PIOA, PIO_PA3X1_AD1, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC6, ADC1, NOT_ON_PWM, TC0_CHB1 }, // AD6 - { PIOA, PIO_PA2X1_AD0, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC7, ADC0, NOT_ON_PWM, TC0_CHA1 }, // AD7 - // 62 - { PIOB, PIO_PB17X1_AD10, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC8, ADC10, NOT_ON_PWM, NOT_ON_TIMER }, // AD8 - { PIOB, PIO_PB18X1_AD11, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC9, ADC11, NOT_ON_PWM, NOT_ON_TIMER }, // AD9 - { PIOB, PIO_PB19X1_AD12, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC10, ADC12, NOT_ON_PWM, NOT_ON_TIMER }, // AD10 - { PIOB, PIO_PB20X1_AD13, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC11, ADC13, NOT_ON_PWM, NOT_ON_TIMER }, // AD11 - - // 66/67 - DAC0/DAC1 - { PIOB, PIO_PB15X1_DAC0, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC12, DA0, NOT_ON_PWM, NOT_ON_TIMER }, // DAC0 - { PIOB, PIO_PB16X1_DAC1, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC13, DA1, NOT_ON_PWM, NOT_ON_TIMER }, // DAC1 - - // 68/69 - CANRX0/CANTX0 - { PIOA, PIO_PA1A_CANRX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC14, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX - { PIOA, PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC15, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX - - // 70/71 - TWI0 - { PIOA, PIO_PA17A_TWD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD0 - SDA1 - { PIOA, PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK0 - SCL1 - - // 72/73 - LEDs - { PIOC, PIO_PC30, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER RXL - { PIOA, PIO_PA21, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER TXL - - // 74/75/76 - SPI - { PIOA, PIO_PA25A_SPI0_MISO,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MISO - { PIOA, PIO_PA26A_SPI0_MOSI,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MOSI - { PIOA, PIO_PA27A_SPI0_SPCK,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // SPCK - - // 77 - SPI CS0 - { PIOA, PIO_PA28A_SPI0_NPCS0,ID_PIOA,PIO_PERIPH_A,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS0 - - // 78 - SPI CS3 (unconnected) - { PIOB, PIO_PB23B_SPI0_NPCS3,ID_PIOB,PIO_PERIPH_B,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS3 - - // 79 .. 84 - "All pins" masks - - // 79 - TWI0 all pins - { PIOA, PIO_PA17A_TWD0|PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 80 - TWI1 all pins - { PIOB, PIO_PB12A_TWD1|PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 81 - UART (Serial) all pins - { PIOA, PIO_PA8A_URXD|PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 82 - USART0 (Serial1) all pins - { PIOA, PIO_PA11A_TXD0|PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 83 - USART1 (Serial2) all pins - { PIOA, PIO_PA13A_TXD1|PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 84 - USART3 (Serial3) all pins - { PIOD, PIO_PD4B_TXD3|PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - - // 85 - USB -//{ PIOB, PIO_PB11A_UOTGID|PIO_PB10A_UOTGVBOF, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF - // 85 - PB11 only - { PIOB, PIO_PB11A_UOTGID, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF - - // 86 - SPI CS2 - { PIOB, PIO_PB21B_SPI0_NPCS2, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS2 - - // 87 - SPI CS1 - { PIOA, PIO_PA29A_SPI0_NPCS1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS1 - - // 88/89 - CANRX1/CANTX1 (same physical pin for 66/53) - { PIOB, PIO_PB15A_CANRX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX1 - { PIOB, PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX1 - - // 90 .. 91 - "All CAN pins" masks - // 90 - CAN0 all pins - { PIOA, PIO_PA1A_CANRX0|PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - // 91 - CAN1 all pins - { PIOB, PIO_PB15A_CANRX1|PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, - - // 92 - Extra AMBIT Pins - { PIOC, PIO_PC11, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 92 - { PIOB, PIO_PB2, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 93 - { PIOB, PIO_PB1, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 94 - { PIOB, PIO_PB0, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 95 - { PIOC, PIO_PC10, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 96 - { PIOB, PIO_PB24, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 97 - { PIOB, PIO_PB7, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 98 - { PIOB, PIO_PB6, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 99 - { PIOB, PIO_PB8, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 100 - { PIOB, PIO_PB5, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 101 - { PIOB, PIO_PB4, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 102 - { PIOB, PIO_PB3, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 103 - { PIOC, PIO_PC20, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 104 - { PIOB, PIO_PB22, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 105 - { PIOC, PIO_PC27, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 106 - { PIOB, PIO_PB10B_A18, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 107 - { PIOB, PIO_PB9, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 108 - { PIOA, PIO_PA5, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 109 - - // END - { NULL, 0, 0, PIO_NOT_A_PIN, PIO_DEFAULT, 0, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER } -} ; - - -uint8_t g_pinStatus[PINS_COUNT] = {0}; - -#ifdef __cplusplus -} -#endif - -/* - * UART objects - */ -RingBuffer rx_buffer1; -RingBuffer tx_buffer1; - -UARTClass Serial(UART, UART_IRQn, ID_UART, &rx_buffer1, &tx_buffer1); -void serialEvent() __attribute__((weak)); -void serialEvent() { } - -// IT handlers -void UART_Handler(void) -{ - Serial.IrqHandler(); -} - -// ---------------------------------------------------------------------------- -/* - * USART objects - */ -RingBuffer rx_buffer2; -RingBuffer rx_buffer3; -RingBuffer rx_buffer4; -RingBuffer tx_buffer2; -RingBuffer tx_buffer3; -RingBuffer tx_buffer4; - -USARTClass Serial1(USART0, USART0_IRQn, ID_USART0, &rx_buffer2, &tx_buffer2); -void serialEvent1() __attribute__((weak)); -void serialEvent1() { } -USARTClass Serial2(USART1, USART1_IRQn, ID_USART1, &rx_buffer3, &tx_buffer3); -void serialEvent2() __attribute__((weak)); -void serialEvent2() { } -USARTClass Serial3(USART3, USART3_IRQn, ID_USART3, &rx_buffer4, &tx_buffer4); -void serialEvent3() __attribute__((weak)); -void serialEvent3() { } - -// IT handlers -void USART0_Handler(void) -{ - Serial1.IrqHandler(); -} - -void USART1_Handler(void) -{ - Serial2.IrqHandler(); -} - -void USART3_Handler(void) -{ - Serial3.IrqHandler(); -} - -// ---------------------------------------------------------------------------- - -void serialEventRun(void) -{ - if (Serial.available()) serialEvent(); - if (Serial1.available()) serialEvent1(); - if (Serial2.available()) serialEvent2(); - if (Serial3.available()) serialEvent3(); -} - -// ---------------------------------------------------------------------------- - -#ifdef __cplusplus -extern "C" { -#endif - -void __libc_init_array(void); - -void init( void ) -{ - SystemInit(); - - // Set Systick to 1ms interval, common to all SAM3 variants - if (SysTick_Config(SystemCoreClock / 1000)) - { - // Capture error - while (true); - } - - // Initialize C library - __libc_init_array(); - - // Disable pull-up on every pin - for (unsigned i = 0; i < PINS_COUNT; i++) - digitalWrite(i, LOW); - - // Enable parallel access on PIO output data registers - PIOA->PIO_OWER = 0xFFFFFFFF; - PIOB->PIO_OWER = 0xFFFFFFFF; - PIOC->PIO_OWER = 0xFFFFFFFF; - PIOD->PIO_OWER = 0xFFFFFFFF; - - // Set USB Full Speed for Archim - udd_low_speed_disable(); - udd_high_speed_disable(); - - // Initialize Serial port U(S)ART pins - PIO_Configure( - g_APinDescription[PINS_UART].pPort, - g_APinDescription[PINS_UART].ulPinType, - g_APinDescription[PINS_UART].ulPin, - g_APinDescription[PINS_UART].ulPinConfiguration); - digitalWrite(0, HIGH); // Enable pullup for RX0 - PIO_Configure( - g_APinDescription[PINS_USART0].pPort, - g_APinDescription[PINS_USART0].ulPinType, - g_APinDescription[PINS_USART0].ulPin, - g_APinDescription[PINS_USART0].ulPinConfiguration); - PIO_Configure( - g_APinDescription[PINS_USART1].pPort, - g_APinDescription[PINS_USART1].ulPinType, - g_APinDescription[PINS_USART1].ulPin, - g_APinDescription[PINS_USART1].ulPinConfiguration); - PIO_Configure( - g_APinDescription[PINS_USART3].pPort, - g_APinDescription[PINS_USART3].ulPinType, - g_APinDescription[PINS_USART3].ulPin, - g_APinDescription[PINS_USART3].ulPinConfiguration); - - // Initialize USB pins - PIO_Configure( - g_APinDescription[PINS_USB].pPort, - g_APinDescription[PINS_USB].ulPinType, - g_APinDescription[PINS_USB].ulPin, - g_APinDescription[PINS_USB].ulPinConfiguration); - - // Initialize CAN pins - PIO_Configure( - g_APinDescription[PINS_CAN0].pPort, - g_APinDescription[PINS_CAN0].ulPinType, - g_APinDescription[PINS_CAN0].ulPin, - g_APinDescription[PINS_CAN0].ulPinConfiguration); - PIO_Configure( - g_APinDescription[PINS_CAN1].pPort, - g_APinDescription[PINS_CAN1].ulPinType, - g_APinDescription[PINS_CAN1].ulPin, - g_APinDescription[PINS_CAN1].ulPinConfiguration); - - // Initialize Analog Controller - pmc_enable_periph_clk(ID_ADC); - adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST); - adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1); - adc_configure_trigger(ADC, ADC_TRIG_SW, 0); // Disable hardware trigger. - adc_disable_interrupt(ADC, 0xFFFFFFFF); // Disable all ADC interrupts. - adc_disable_all_channel(ADC); - - // Initialize analogOutput module - analogOutputInit(); -} - -#ifdef __cplusplus -} -#endif - diff --git a/buildroot/share/PlatformIO/variants/archim/variant.h b/buildroot/share/PlatformIO/variants/archim/variant.h deleted file mode 100644 index 179a137353..0000000000 --- a/buildroot/share/PlatformIO/variants/archim/variant.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - Copyright (c) 2011 Arduino. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef _VARIANT_ARDUINO_DUE_X_ -#define _VARIANT_ARDUINO_DUE_X_ - -/*---------------------------------------------------------------------------- - * Definitions - *----------------------------------------------------------------------------*/ - -/** Frequency of the board main oscillator */ -#define VARIANT_MAINOSC 12000000 - -/** Master clock frequency */ -#define VARIANT_MCK 84000000 - -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ - -#include "Arduino.h" -#ifdef __cplusplus -#include "UARTClass.h" -#include "USARTClass.h" -#endif - -#ifdef __cplusplus -extern "C"{ -#endif // __cplusplus - -/** - * Libc porting layers - */ -#if defined ( __GNUC__ ) /* GCC CS3 */ -# include /** RedHat Newlib minimal stub */ -#endif - -/*---------------------------------------------------------------------------- - * Pins - *----------------------------------------------------------------------------*/ - -// Number of pins defined in PinDescription array -#define PINS_COUNT (79U) -#define NUM_DIGITAL_PINS (66U) -#define NUM_ANALOG_INPUTS (12U) -#define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) - -#define digitalPinToPort(P) ( g_APinDescription[P].pPort ) -#define digitalPinToBitMask(P) ( g_APinDescription[P].ulPin ) -//#define analogInPinToBit(P) ( ) -#define portOutputRegister(port) ( &(port->PIO_ODSR) ) -#define portInputRegister(port) ( &(port->PIO_PDSR) ) -#define digitalPinHasPWM(P) ( g_APinDescription[P].ulPWMChannel != NOT_ON_PWM || g_APinDescription[P].ulTCChannel != NOT_ON_TIMER ) - -/* - * portModeRegister(..) should return a register to set pin mode - * INPUT or OUTPUT by setting the corresponding bit to 0 or 1. - * Unfortunately on SAM architecture the PIO_OSR register is - * read-only and can be set only through the enable/disable registers - * pair PIO_OER/PIO_ODR. - */ -// #define portModeRegister(port) ( &(port->PIO_OSR) ) - -/* - * digitalPinToTimer(..) is AVR-specific and is not defined for SAM - * architecture. If you need to check if a pin supports PWM you must - * use digitalPinHasPWM(..). - * - * https://github.com/arduino/Arduino/issues/1833 - */ -// #define digitalPinToTimer(P) - -// Interrupts -#define digitalPinToInterrupt(p) ((p) < NUM_DIGITAL_PINS ? (p) : -1) - -// LEDs -#define PIN_LED_13 (13U) -#define PIN_LED_RXL (72U) -#define PIN_LED_TXL (73U) -#define PIN_LED PIN_LED_13 -#define PIN_LED2 PIN_LED_RXL -#define PIN_LED3 PIN_LED_TXL -#define LED_BUILTIN 13 - -/* - * SPI Interfaces - */ -#define SPI_INTERFACES_COUNT 1 - -#define SPI_INTERFACE SPI0 -#define SPI_INTERFACE_ID ID_SPI0 -#define SPI_CHANNELS_NUM 4 -#define PIN_SPI_SS0 (77U) -#define PIN_SPI_SS1 (87U) -#define PIN_SPI_SS2 (86U) -#define PIN_SPI_SS3 (78U) -#define PIN_SPI_MOSI (75U) -#define PIN_SPI_MISO (74U) -#define PIN_SPI_SCK (76U) -#define BOARD_SPI_SS0 (77U) //(10U) -#define BOARD_SPI_SS1 (4U) -#define BOARD_SPI_SS2 (52U) -#define BOARD_SPI_SS3 PIN_SPI_SS3 -#define BOARD_SPI_DEFAULT_SS BOARD_SPI_SS3 - -#define BOARD_PIN_TO_SPI_PIN(x) \ - (x==BOARD_SPI_SS0 ? PIN_SPI_SS0 : \ - (x==BOARD_SPI_SS1 ? PIN_SPI_SS1 : \ - (x==BOARD_SPI_SS2 ? PIN_SPI_SS2 : PIN_SPI_SS3 ))) -#define BOARD_PIN_TO_SPI_CHANNEL(x) \ - (x==BOARD_SPI_SS0 ? 0 : \ - (x==BOARD_SPI_SS1 ? 1 : \ - (x==BOARD_SPI_SS2 ? 2 : 3))) - -static const uint8_t SS = BOARD_SPI_SS0; -static const uint8_t SS1 = BOARD_SPI_SS1; -static const uint8_t SS2 = BOARD_SPI_SS2; -static const uint8_t SS3 = BOARD_SPI_SS3; -static const uint8_t MOSI = PIN_SPI_MOSI; -static const uint8_t MISO = PIN_SPI_MISO; -static const uint8_t SCK = PIN_SPI_SCK; - -/* - * Wire Interfaces - */ -#define WIRE_INTERFACES_COUNT 2 - -#define PIN_WIRE_SDA (20U) -#define PIN_WIRE_SCL (21U) -#define WIRE_INTERFACE TWI1 -#define WIRE_INTERFACE_ID ID_TWI1 -#define WIRE_ISR_HANDLER TWI1_Handler -#define WIRE_ISR_ID TWI1_IRQn - -#define PIN_WIRE1_SDA (70U) -#define PIN_WIRE1_SCL (71U) -#define WIRE1_INTERFACE TWI0 -#define WIRE1_INTERFACE_ID ID_TWI0 -#define WIRE1_ISR_HANDLER TWI0_Handler -#define WIRE1_ISR_ID TWI0_IRQn - -static const uint8_t SDA = PIN_WIRE_SDA; -static const uint8_t SCL = PIN_WIRE_SCL; -static const uint8_t SDA1 = PIN_WIRE1_SDA; -static const uint8_t SCL1 = PIN_WIRE1_SCL; - -/* - * UART/USART Interfaces - */ -// Serial -#define PINS_UART (81U) -// Serial1 -#define PINS_USART0 (82U) -// Serial2 -#define PINS_USART1 (83U) -// Serial3 -#define PINS_USART3 (84U) - -/* - * USB Interfaces - */ -#define PINS_USB (85U) - -/* - * Analog pins - */ -static const uint8_t A0 = 54; -static const uint8_t A1 = 55; -static const uint8_t A2 = 56; -static const uint8_t A3 = 57; -static const uint8_t A4 = 58; -static const uint8_t A5 = 59; -static const uint8_t A6 = 60; -static const uint8_t A7 = 61; -static const uint8_t A8 = 62; -static const uint8_t A9 = 63; -static const uint8_t A10 = 64; -static const uint8_t A11 = 65; -static const uint8_t DAC0 = 66; -static const uint8_t DAC1 = 67; -static const uint8_t CANRX = 68; -static const uint8_t CANTX = 69; -#define ADC_RESOLUTION 12 - -/* - * Complementary CAN pins - */ -static const uint8_t CAN1RX = 88; -static const uint8_t CAN1TX = 89; - -// CAN0 -#define PINS_CAN0 (90U) -// CAN1 -#define PINS_CAN1 (91U) - - -/* - * DACC - */ -#define DACC_INTERFACE DACC -#define DACC_INTERFACE_ID ID_DACC -#define DACC_RESOLUTION 12 -#define DACC_ISR_HANDLER DACC_Handler -#define DACC_ISR_ID DACC_IRQn - -/* - * PWM - */ -#define PWM_INTERFACE PWM -#define PWM_INTERFACE_ID ID_PWM -#define PWM_FREQUENCY 31000 -#define PWM_MAX_DUTY_CYCLE 255 -#define PWM_MIN_DUTY_CYCLE 0 -#define PWM_RESOLUTION 8 - -/* - * TC - */ -#define TC_INTERFACE TC0 -#define TC_INTERFACE_ID ID_TC0 -#define TC_FREQUENCY 100000 -#define TC_MAX_DUTY_CYCLE 255 -#define TC_MIN_DUTY_CYCLE 0 -#define TC_RESOLUTION 8 - -#ifdef __cplusplus -} -#endif - -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#ifdef __cplusplus - -extern UARTClass Serial; -extern USARTClass Serial1; -extern USARTClass Serial2; -extern USARTClass Serial3; - -#endif - -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_USBVIRTUAL SerialUSB -#define SERIAL_PORT_HARDWARE_OPEN Serial1 -#define SERIAL_PORT_HARDWARE_OPEN1 Serial2 -#define SERIAL_PORT_HARDWARE_OPEN2 Serial3 -#define SERIAL_PORT_HARDWARE Serial -#define SERIAL_PORT_HARDWARE1 Serial1 -#define SERIAL_PORT_HARDWARE2 Serial2 -#define SERIAL_PORT_HARDWARE3 Serial3 - -#endif /* _VARIANT_ARDUINO_DUE_X_ */ - diff --git a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h deleted file mode 100755 index 81f2ae3e19..0000000000 --- a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h +++ /dev/null @@ -1,461 +0,0 @@ -/* - pins_arduino.h - Pin definition functions for Arduino - Part of Arduino - http://www.arduino.cc/ - - Copyright (c) 2007 David A. Mellis - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General - Public License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA -*/ - -#ifndef Pins_Arduino_h -#define Pins_Arduino_h - -#include - -#define NUM_DIGITAL_PINS 86 -#define NUM_ANALOG_INPUTS 16 -#define analogInputToDigitalPin(p) ((p < 16) ? (p) + 54 : -1) -#define digitalPinHasPWM(p) (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46)) - -#define PIN_SPI_SS (53) -#define PIN_SPI_MOSI (51) -#define PIN_SPI_MISO (50) -#define PIN_SPI_SCK (52) - -static const uint8_t SS = PIN_SPI_SS; -static const uint8_t MOSI = PIN_SPI_MOSI; -static const uint8_t MISO = PIN_SPI_MISO; -static const uint8_t SCK = PIN_SPI_SCK; - -#define PIN_WIRE_SDA (20) -#define PIN_WIRE_SCL (21) - -static const uint8_t SDA = PIN_WIRE_SDA; -static const uint8_t SCL = PIN_WIRE_SCL; - -#define LED_BUILTIN 13 - -#define PIN_A0 (54) -#define PIN_A1 (55) -#define PIN_A2 (56) -#define PIN_A3 (57) -#define PIN_A4 (58) -#define PIN_A5 (59) -#define PIN_A6 (60) -#define PIN_A7 (61) -#define PIN_A8 (62) -#define PIN_A9 (63) -#define PIN_A10 (64) -#define PIN_A11 (65) -#define PIN_A12 (66) -#define PIN_A13 (67) -#define PIN_A14 (68) -#define PIN_A15 (69) - -static const uint8_t A0 = PIN_A0; -static const uint8_t A1 = PIN_A1; -static const uint8_t A2 = PIN_A2; -static const uint8_t A3 = PIN_A3; -static const uint8_t A4 = PIN_A4; -static const uint8_t A5 = PIN_A5; -static const uint8_t A6 = PIN_A6; -static const uint8_t A7 = PIN_A7; -static const uint8_t A8 = PIN_A8; -static const uint8_t A9 = PIN_A9; -static const uint8_t A10 = PIN_A10; -static const uint8_t A11 = PIN_A11; -static const uint8_t A12 = PIN_A12; -static const uint8_t A13 = PIN_A13; -static const uint8_t A14 = PIN_A14; -static const uint8_t A15 = PIN_A15; - -// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins) -// Only pins available for RECEIVE (TRANSMIT can be on any pin): -// (I've deliberately left out pin mapping to the Hardware USARTs - seems senseless to me) -// Pins: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69 - -#define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 13)) || \ - (((p) >= 50) && ((p) <= 53)) || \ - (((p) >= 62) && ((p) <= 69)) ? (&PCICR) : ((uint8_t *)0) ) - -#define digitalPinToPCICRbit(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? 0 : \ - ( (((p) >= 62) && ((p) <= 69)) ? 2 : \ - 0 ) ) - -#define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 13)) || (((p) >= 50) && ((p) <= 53)) ? (&PCMSK0) : \ - ( (((p) >= 62) && ((p) <= 69)) ? (&PCMSK2) : \ - ((uint8_t *)0) ) ) - -#define digitalPinToPCMSKbit(p) ( (((p) >= 10) && ((p) <= 13)) ? ((p) - 6) : \ - ( ((p) == 50) ? 3 : \ - ( ((p) == 51) ? 2 : \ - ( ((p) == 52) ? 1 : \ - ( ((p) == 53) ? 0 : \ - ( (((p) >= 62) && ((p) <= 69)) ? ((p) - 62) : \ - 0 ) ) ) ) ) ) - -#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : ((p) >= 18 && (p) <= 21 ? 23 - (p) : NOT_AN_INTERRUPT))) - -#ifdef ARDUINO_MAIN - -const uint16_t PROGMEM port_to_mode_PGM[] = { - NOT_A_PORT, - (uint16_t) &DDRA, - (uint16_t) &DDRB, - (uint16_t) &DDRC, - (uint16_t) &DDRD, - (uint16_t) &DDRE, - (uint16_t) &DDRF, - (uint16_t) &DDRG, - (uint16_t) &DDRH, - NOT_A_PORT, - (uint16_t) &DDRJ, - (uint16_t) &DDRK, - (uint16_t) &DDRL, -}; - -const uint16_t PROGMEM port_to_output_PGM[] = { - NOT_A_PORT, - (uint16_t) &PORTA, - (uint16_t) &PORTB, - (uint16_t) &PORTC, - (uint16_t) &PORTD, - (uint16_t) &PORTE, - (uint16_t) &PORTF, - (uint16_t) &PORTG, - (uint16_t) &PORTH, - NOT_A_PORT, - (uint16_t) &PORTJ, - (uint16_t) &PORTK, - (uint16_t) &PORTL, -}; - -const uint16_t PROGMEM port_to_input_PGM[] = { - NOT_A_PIN, - (uint16_t) &PINA, - (uint16_t) &PINB, - (uint16_t) &PINC, - (uint16_t) &PIND, - (uint16_t) &PINE, - (uint16_t) &PINF, - (uint16_t) &PING, - (uint16_t) &PINH, - NOT_A_PIN, - (uint16_t) &PINJ, - (uint16_t) &PINK, - (uint16_t) &PINL, -}; - -const uint8_t PROGMEM digital_pin_to_port_PGM[] = { - // PORTLIST - // ------------------------------------------- - PE , // PE 0 ** 0 ** USART0_RX - PE , // PE 1 ** 1 ** USART0_TX - PE , // PE 4 ** 2 ** PWM2 - PE , // PE 5 ** 3 ** PWM3 - PG , // PG 5 ** 4 ** PWM4 - PE , // PE 3 ** 5 ** PWM5 - PH , // PH 3 ** 6 ** PWM6 - PH , // PH 4 ** 7 ** PWM7 - PH , // PH 5 ** 8 ** PWM8 - PH , // PH 6 ** 9 ** PWM9 - PB , // PB 4 ** 10 ** PWM10 - PB , // PB 5 ** 11 ** PWM11 - PB , // PB 6 ** 12 ** PWM12 - PB , // PB 7 ** 13 ** PWM13 - PJ , // PJ 1 ** 14 ** USART3_TX - PJ , // PJ 0 ** 15 ** USART3_RX - PH , // PH 1 ** 16 ** USART2_TX - PH , // PH 0 ** 17 ** USART2_RX - PD , // PD 3 ** 18 ** USART1_TX - PD , // PD 2 ** 19 ** USART1_RX - PD , // PD 1 ** 20 ** I2C_SDA - PD , // PD 0 ** 21 ** I2C_SCL - PA , // PA 0 ** 22 ** D22 - PA , // PA 1 ** 23 ** D23 - PA , // PA 2 ** 24 ** D24 - PA , // PA 3 ** 25 ** D25 - PA , // PA 4 ** 26 ** D26 - PA , // PA 5 ** 27 ** D27 - PA , // PA 6 ** 28 ** D28 - PA , // PA 7 ** 29 ** D29 - PC , // PC 7 ** 30 ** D30 - PC , // PC 6 ** 31 ** D31 - PC , // PC 5 ** 32 ** D32 - PC , // PC 4 ** 33 ** D33 - PC , // PC 3 ** 34 ** D34 - PC , // PC 2 ** 35 ** D35 - PC , // PC 1 ** 36 ** D36 - PC , // PC 0 ** 37 ** D37 - PD , // PD 7 ** 38 ** D38 - PG , // PG 2 ** 39 ** D39 - PG , // PG 1 ** 40 ** D40 - PG , // PG 0 ** 41 ** D41 - PL , // PL 7 ** 42 ** D42 - PL , // PL 6 ** 43 ** D43 - PL , // PL 5 ** 44 ** D44 - PL , // PL 4 ** 45 ** D45 - PL , // PL 3 ** 46 ** D46 - PL , // PL 2 ** 47 ** D47 - PL , // PL 1 ** 48 ** D48 - PL , // PL 0 ** 49 ** D49 - PB , // PB 3 ** 50 ** SPI_MISO - PB , // PB 2 ** 51 ** SPI_MOSI - PB , // PB 1 ** 52 ** SPI_SCK - PB , // PB 0 ** 53 ** SPI_SS - PF , // PF 0 ** 54 ** A0 - PF , // PF 1 ** 55 ** A1 - PF , // PF 2 ** 56 ** A2 - PF , // PF 3 ** 57 ** A3 - PF , // PF 4 ** 58 ** A4 - PF , // PF 5 ** 59 ** A5 - PF , // PF 6 ** 60 ** A6 - PF , // PF 7 ** 61 ** A7 - PK , // PK 0 ** 62 ** A8 - PK , // PK 1 ** 63 ** A9 - PK , // PK 2 ** 64 ** A10 - PK , // PK 3 ** 65 ** A11 - PK , // PK 4 ** 66 ** A12 - PK , // PK 5 ** 67 ** A13 - PK , // PK 6 ** 68 ** A14 - PK , // PK 7 ** 69 ** A15 - PG , // PG 4 ** 70 ** D70 - PG , // PG 3 ** 71 ** D71 - PJ , // PJ 2 ** 72 ** D72 - PJ , // PJ 3 ** 73 ** D73 - PJ , // PJ 7 ** 74 ** D74 - PJ , // PJ 4 ** 75 ** D75 - PJ , // PJ 5 ** 76 ** D76 - PJ , // PJ 6 ** 77 ** D77 - PE , // PE 2 ** 78 ** D78 - PE , // PE 6 ** 79 ** D79 - PE , // PE 7 ** 80 ** D80 - PD , // PD 4 ** 81 ** D81 - PD , // PD 5 ** 82 ** D82 - PD , // PD 6 ** 83 ** D83 - PH , // PH 2 ** 84 ** D84 - PH , // PH 7 ** 85 ** D85 -}; - -const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { - // PIN IN PORT - // ------------------------------------------- - _BV( 0 ) , // PE 0 ** 0 ** USART0_RX - _BV( 1 ) , // PE 1 ** 1 ** USART0_TX - _BV( 4 ) , // PE 4 ** 2 ** PWM2 - _BV( 5 ) , // PE 5 ** 3 ** PWM3 - _BV( 5 ) , // PG 5 ** 4 ** PWM4 - _BV( 3 ) , // PE 3 ** 5 ** PWM5 - _BV( 3 ) , // PH 3 ** 6 ** PWM6 - _BV( 4 ) , // PH 4 ** 7 ** PWM7 - _BV( 5 ) , // PH 5 ** 8 ** PWM8 - _BV( 6 ) , // PH 6 ** 9 ** PWM9 - _BV( 4 ) , // PB 4 ** 10 ** PWM10 - _BV( 5 ) , // PB 5 ** 11 ** PWM11 - _BV( 6 ) , // PB 6 ** 12 ** PWM12 - _BV( 7 ) , // PB 7 ** 13 ** PWM13 - _BV( 1 ) , // PJ 1 ** 14 ** USART3_TX - _BV( 0 ) , // PJ 0 ** 15 ** USART3_RX - _BV( 1 ) , // PH 1 ** 16 ** USART2_TX - _BV( 0 ) , // PH 0 ** 17 ** USART2_RX - _BV( 3 ) , // PD 3 ** 18 ** USART1_TX - _BV( 2 ) , // PD 2 ** 19 ** USART1_RX - _BV( 1 ) , // PD 1 ** 20 ** I2C_SDA - _BV( 0 ) , // PD 0 ** 21 ** I2C_SCL - _BV( 0 ) , // PA 0 ** 22 ** D22 - _BV( 1 ) , // PA 1 ** 23 ** D23 - _BV( 2 ) , // PA 2 ** 24 ** D24 - _BV( 3 ) , // PA 3 ** 25 ** D25 - _BV( 4 ) , // PA 4 ** 26 ** D26 - _BV( 5 ) , // PA 5 ** 27 ** D27 - _BV( 6 ) , // PA 6 ** 28 ** D28 - _BV( 7 ) , // PA 7 ** 29 ** D29 - _BV( 7 ) , // PC 7 ** 30 ** D30 - _BV( 6 ) , // PC 6 ** 31 ** D31 - _BV( 5 ) , // PC 5 ** 32 ** D32 - _BV( 4 ) , // PC 4 ** 33 ** D33 - _BV( 3 ) , // PC 3 ** 34 ** D34 - _BV( 2 ) , // PC 2 ** 35 ** D35 - _BV( 1 ) , // PC 1 ** 36 ** D36 - _BV( 0 ) , // PC 0 ** 37 ** D37 - _BV( 7 ) , // PD 7 ** 38 ** D38 - _BV( 2 ) , // PG 2 ** 39 ** D39 - _BV( 1 ) , // PG 1 ** 40 ** D40 - _BV( 0 ) , // PG 0 ** 41 ** D41 - _BV( 7 ) , // PL 7 ** 42 ** D42 - _BV( 6 ) , // PL 6 ** 43 ** D43 - _BV( 5 ) , // PL 5 ** 44 ** D44 - _BV( 4 ) , // PL 4 ** 45 ** D45 - _BV( 3 ) , // PL 3 ** 46 ** D46 - _BV( 2 ) , // PL 2 ** 47 ** D47 - _BV( 1 ) , // PL 1 ** 48 ** D48 - _BV( 0 ) , // PL 0 ** 49 ** D49 - _BV( 3 ) , // PB 3 ** 50 ** SPI_MISO - _BV( 2 ) , // PB 2 ** 51 ** SPI_MOSI - _BV( 1 ) , // PB 1 ** 52 ** SPI_SCK - _BV( 0 ) , // PB 0 ** 53 ** SPI_SS - _BV( 0 ) , // PF 0 ** 54 ** A0 - _BV( 1 ) , // PF 1 ** 55 ** A1 - _BV( 2 ) , // PF 2 ** 56 ** A2 - _BV( 3 ) , // PF 3 ** 57 ** A3 - _BV( 4 ) , // PF 4 ** 58 ** A4 - _BV( 5 ) , // PF 5 ** 59 ** A5 - _BV( 6 ) , // PF 6 ** 60 ** A6 - _BV( 7 ) , // PF 7 ** 61 ** A7 - _BV( 0 ) , // PK 0 ** 62 ** A8 - _BV( 1 ) , // PK 1 ** 63 ** A9 - _BV( 2 ) , // PK 2 ** 64 ** A10 - _BV( 3 ) , // PK 3 ** 65 ** A11 - _BV( 4 ) , // PK 4 ** 66 ** A12 - _BV( 5 ) , // PK 5 ** 67 ** A13 - _BV( 6 ) , // PK 6 ** 68 ** A14 - _BV( 7 ) , // PK 7 ** 69 ** A15 - _BV( 4 ) , // PG 4 ** 70 ** D70 - _BV( 3 ) , // PG 3 ** 71 ** D71 - _BV( 2 ) , // PJ 2 ** 72 ** D72 - _BV( 3 ) , // PJ 3 ** 73 ** D73 - _BV( 7 ) , // PJ 7 ** 74 ** D74 - _BV( 4 ) , // PJ 4 ** 75 ** D75 - _BV( 5 ) , // PJ 5 ** 76 ** D76 - _BV( 6 ) , // PJ 6 ** 77 ** D77 - _BV( 2 ) , // PE 2 ** 78 ** D78 - _BV( 6 ) , // PE 6 ** 79 ** D79 - _BV( 7 ) , // PE 7 ** 80 ** D80 - _BV( 4 ) , // PD 4 ** 81 ** D81 - _BV( 5 ) , // PD 5 ** 82 ** D82 - _BV( 6 ) , // PD 6 ** 83 ** D83 - _BV( 2 ) , // PH 2 ** 84 ** D84 - _BV( 7 ) , // PH 7 ** 85 ** D85 -}; - -const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { - // TIMERS - // ------------------------------------------- - NOT_ON_TIMER , // PE 0 ** 0 ** USART0_RX - NOT_ON_TIMER , // PE 1 ** 1 ** USART0_TX - TIMER3B , // PE 4 ** 2 ** PWM2 - TIMER3C , // PE 5 ** 3 ** PWM3 - TIMER0B , // PG 5 ** 4 ** PWM4 - TIMER3A , // PE 3 ** 5 ** PWM5 - TIMER4A , // PH 3 ** 6 ** PWM6 - TIMER4B , // PH 4 ** 7 ** PWM7 - TIMER4C , // PH 5 ** 8 ** PWM8 - TIMER2B , // PH 6 ** 9 ** PWM9 - TIMER2A , // PB 4 ** 10 ** PWM10 - TIMER1A , // PB 5 ** 11 ** PWM11 - TIMER1B , // PB 6 ** 12 ** PWM12 - TIMER0A , // PB 7 ** 13 ** PWM13 - NOT_ON_TIMER , // PJ 1 ** 14 ** USART3_TX - NOT_ON_TIMER , // PJ 0 ** 15 ** USART3_RX - NOT_ON_TIMER , // PH 1 ** 16 ** USART2_TX - NOT_ON_TIMER , // PH 0 ** 17 ** USART2_RX - NOT_ON_TIMER , // PD 3 ** 18 ** USART1_TX - NOT_ON_TIMER , // PD 2 ** 19 ** USART1_RX - NOT_ON_TIMER , // PD 1 ** 20 ** I2C_SDA - NOT_ON_TIMER , // PD 0 ** 21 ** I2C_SCL - NOT_ON_TIMER , // PA 0 ** 22 ** D22 - NOT_ON_TIMER , // PA 1 ** 23 ** D23 - NOT_ON_TIMER , // PA 2 ** 24 ** D24 - NOT_ON_TIMER , // PA 3 ** 25 ** D25 - NOT_ON_TIMER , // PA 4 ** 26 ** D26 - NOT_ON_TIMER , // PA 5 ** 27 ** D27 - NOT_ON_TIMER , // PA 6 ** 28 ** D28 - NOT_ON_TIMER , // PA 7 ** 29 ** D29 - NOT_ON_TIMER , // PC 7 ** 30 ** D30 - NOT_ON_TIMER , // PC 6 ** 31 ** D31 - NOT_ON_TIMER , // PC 5 ** 32 ** D32 - NOT_ON_TIMER , // PC 4 ** 33 ** D33 - NOT_ON_TIMER , // PC 3 ** 34 ** D34 - NOT_ON_TIMER , // PC 2 ** 35 ** D35 - NOT_ON_TIMER , // PC 1 ** 36 ** D36 - NOT_ON_TIMER , // PC 0 ** 37 ** D37 - NOT_ON_TIMER , // PD 7 ** 38 ** D38 - NOT_ON_TIMER , // PG 2 ** 39 ** D39 - NOT_ON_TIMER , // PG 1 ** 40 ** D40 - NOT_ON_TIMER , // PG 0 ** 41 ** D41 - NOT_ON_TIMER , // PL 7 ** 42 ** D42 - NOT_ON_TIMER , // PL 6 ** 43 ** D43 - TIMER5C , // PL 5 ** 44 ** D44 - TIMER5B , // PL 4 ** 45 ** D45 - TIMER5A , // PL 3 ** 46 ** D46 - NOT_ON_TIMER , // PL 2 ** 47 ** D47 - NOT_ON_TIMER , // PL 1 ** 48 ** D48 - NOT_ON_TIMER , // PL 0 ** 49 ** D49 - NOT_ON_TIMER , // PB 3 ** 50 ** SPI_MISO - NOT_ON_TIMER , // PB 2 ** 51 ** SPI_MOSI - NOT_ON_TIMER , // PB 1 ** 52 ** SPI_SCK - NOT_ON_TIMER , // PB 0 ** 53 ** SPI_SS - NOT_ON_TIMER , // PF 0 ** 54 ** A0 - NOT_ON_TIMER , // PF 1 ** 55 ** A1 - NOT_ON_TIMER , // PF 2 ** 56 ** A2 - NOT_ON_TIMER , // PF 3 ** 57 ** A3 - NOT_ON_TIMER , // PF 4 ** 58 ** A4 - NOT_ON_TIMER , // PF 5 ** 59 ** A5 - NOT_ON_TIMER , // PF 6 ** 60 ** A6 - NOT_ON_TIMER , // PF 7 ** 61 ** A7 - NOT_ON_TIMER , // PK 0 ** 62 ** A8 - NOT_ON_TIMER , // PK 1 ** 63 ** A9 - NOT_ON_TIMER , // PK 2 ** 64 ** A10 - NOT_ON_TIMER , // PK 3 ** 65 ** A11 - NOT_ON_TIMER , // PK 4 ** 66 ** A12 - NOT_ON_TIMER , // PK 5 ** 67 ** A13 - NOT_ON_TIMER , // PK 6 ** 68 ** A14 - NOT_ON_TIMER , // PK 7 ** 69 ** A15 - NOT_ON_TIMER , // PG 4 ** 70 ** D70 - NOT_ON_TIMER , // PG 3 ** 71 ** D71 - NOT_ON_TIMER , // PJ 2 ** 72 ** D72 - NOT_ON_TIMER , // PJ 3 ** 73 ** D73 - NOT_ON_TIMER , // PJ 7 ** 74 ** D74 - NOT_ON_TIMER , // PJ 4 ** 75 ** D75 - NOT_ON_TIMER , // PJ 5 ** 76 ** D76 - NOT_ON_TIMER , // PJ 6 ** 77 ** D77 - NOT_ON_TIMER , // PE 2 ** 78 ** D78 - NOT_ON_TIMER , // PE 6 ** 79 ** D79 - NOT_ON_TIMER , // PE 7 ** 80 ** D80 - NOT_ON_TIMER , // PD 4 ** 81 ** D81 - NOT_ON_TIMER , // PD 5 ** 82 ** D82 - NOT_ON_TIMER , // PD 6 ** 83 ** D83 - NOT_ON_TIMER , // PH 2 ** 84 ** D84 - NOT_ON_TIMER , // PH 7 ** 85 ** D85 -}; - -#endif - -// These serial port names are intended to allow libraries and architecture-neutral -// sketches to automatically default to the correct port name for a particular type -// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, -// the first hardware serial port whose RX/TX pins are not dedicated to another use. -// -// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor -// -// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial -// -// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library -// -// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. -// -// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX -// pins are NOT connected to anything by default. -#define SERIAL_PORT_MONITOR Serial -#define SERIAL_PORT_HARDWARE Serial -#define SERIAL_PORT_HARDWARE1 Serial1 -#define SERIAL_PORT_HARDWARE2 Serial2 -#define SERIAL_PORT_HARDWARE3 Serial3 -#define SERIAL_PORT_HARDWARE_OPEN Serial1 -#define SERIAL_PORT_HARDWARE_OPEN1 Serial2 -#define SERIAL_PORT_HARDWARE_OPEN2 Serial3 - -#endif diff --git a/buildroot/share/atom/auto_build.py b/buildroot/share/atom/auto_build.py new file mode 100644 index 0000000000..494d63f8e8 --- /dev/null +++ b/buildroot/share/atom/auto_build.py @@ -0,0 +1,1238 @@ +####################################### +# +# Marlin 3D Printer Firmware +# Copyright (C) 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +# +# Based on Sprinter and grbl. +# Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +####################################### + +####################################### +# +# Revision: 2.0.1 +# +# Description: script to automate PlatformIO builds +# CLI: python auto_build.py build_option +# build_option (required) +# build executes -> platformio run -e target_env +# clean executes -> platformio run --target clean -e target_env +# upload executes -> platformio run --target upload -e target_env +# traceback executes -> platformio run --target upload -e target_env +# program executes -> platformio run --target program -e target_env +# test executes -> platformio test upload -e target_env +# remote executes -> platformio remote run --target upload -e target_env +# debug executes -> platformio debug -e target_env +# +# 'traceback' just uses the debug variant of the target environment if one exists +# +####################################### + +####################################### +# +# General program flow +# +# 1. Scans Configuration.h for the motherboard name and Marlin version. +# 2. Scans pins.h for the motherboard. +# returns the CPU(s) and platformio environment(s) used by the motherboard +# 3. If further info is needed then a popup gets it from the user. +# 4. The OUTPUT_WINDOW class creates a window to display the output of the PlatformIO program. +# 5. A thread is created by the OUTPUT_WINDOW class in order to execute the RUN_PIO function. +# 6. The RUN_PIO function uses a subprocess to run the CLI version of PlatformIO. +# 7. The "iter(pio_subprocess.stdout.readline, '')" function is used to stream the output of +# PlatformIO back to the RUN_PIO function. +# 8. Each line returned from PlatformIO is formatted to match the color coding seen in the +# PlatformIO GUI. +# 9. If there is a color change within a line then the line is broken at each color change +# and sent separately. +# 10. Each formatted segment (could be a full line or a split line) is put into the queue +# IO_queue as it arrives from the platformio subprocess. +# 11. The OUTPUT_WINDOW class periodically samples IO_queue. If data is available then it +# is written to the window. +# 12. The window stays open until the user closes it. +# 13. The OUTPUT_WINDOW class continues to execute as long as the window is open. This allows +# copying, saving, scrolling of the window. A right click popup is available. +# +####################################### + +import sys +import os + +pwd = os.getcwd() # make sure we're executing from the correct directory level +pwd = pwd.replace('\\', '/') +if 0 <= pwd.find('buildroot/share/atom'): + pwd = pwd[ : pwd.find('buildroot/share/atom')] + os.chdir(pwd) +print 'pwd: ', pwd + +num_args = len(sys.argv) +if num_args > 1: + build_type = str(sys.argv[1]) +else: + print 'Please specify build type' + exit() + +print'build_type: ', build_type + +print '\nWorking\n' + +python_ver = sys.version_info[0] # major version - 2 or 3 + +if python_ver == 2: + print "python version " + str(sys.version_info[0]) + "." + str(sys.version_info[1]) + "." + str(sys.version_info[2]) +else: + print "python version " + str(sys.version_info[0]) + print "This script only runs under python 2" + exit() + +import platform +current_OS = platform.system() + +#globals +target_env = '' +board_name = '' + + +######### +# Python 2 error messages: +# Can't find a usable init.tcl in the following directories ... +# error "invalid command name "tcl_findLibrary"" +# +# Fix for the above errors on my Win10 system: +# search all init.tcl files for the line "package require -exact Tcl" that has the highest 8.5.x number +# copy it into the first directory listed in the error messages +# set the environmental variables TCLLIBPATH and TCL_LIBRARY to the directory where you found the init.tcl file +# reboot +######### + + + +########################################################################################## +# +# popup to get input from user +# +########################################################################################## + +def get_answer(board_name, cpu_label_txt, cpu_a_txt, cpu_b_txt): + + + if python_ver == 2: + import Tkinter as tk + else: + import tkinter as tk + + def CPU_exit_3(): # forward declare functions + + CPU_exit_3_() + def CPU_exit_4(): + + CPU_exit_4_() + def kill_session(): + kill_session_() + + root_get_answer = tk.Tk() + + root_get_answer.chk_state_1 = 1 # declare variables used by TK and enable + + chk_state_1 = 0 # set initial state of check boxes + + + global get_answer_val + get_answer_val = 2 # return get_answer_val, set default to match chk_state_1 default + + + l1 = tk.Label(text=board_name, + fg = "light green", + bg = "dark green", + font = "Helvetica 12 bold").grid(row=1) + + l2 = tk.Label(text=cpu_label_txt, + fg = "light green", + bg = "dark green", + font = "Helvetica 16 bold italic").grid(row=2) + + b4 = tk.Checkbutton(text=cpu_a_txt, + fg = "black", + font = "Times 20 bold ", + variable=chk_state_1, onvalue=1, offvalue=0, + + command = CPU_exit_3).grid(row=3) + + b5 = tk.Checkbutton(text=cpu_b_txt, + fg = "black", + font = "Times 20 bold ", + variable=chk_state_1, onvalue=0, offvalue=1, + + command = CPU_exit_4).grid(row=4) # use same variable but inverted so they will track + b6 = tk.Button(text="CONFIRM", + fg = "blue", + font = "Times 20 bold ", + command = root_get_answer.destroy).grid(row=5, pady=4) + + b7 = tk.Button(text="CANCEL", + fg = "red", + font = "Times 12 bold ", + command = kill_session).grid(row=6, pady=4) + + + def CPU_exit_3_(): + global get_answer_val + get_answer_val = 1 + + def CPU_exit_4_(): + global get_answer_val + get_answer_val = 2 + + def kill_session_(): + raise SystemExit(0) # kill everything + + root_get_answer.mainloop() + +# end - get answer + + +# +# move custom board definitions from project folder to PlatformIO +# +def resolve_path(path): + import os + + # turn the selection into a partial path + + if 0 <= path.find('"'): + path = path[ path.find('"') : ] + if 0 <= path.find(', line '): + path = path.replace(', line ', ':') + path = path.replace('"', '') + + #get line and column numbers + line_num = 1 + column_num = 1 + line_start = path.find(':', 2) # use 2 here so don't eat Windows full path + column_start = path.find(':', line_start + 1) + if column_start == -1: + column_start = len(path) + column_end = path.find(':', column_start + 1) + if column_end == -1: + column_end = len(path) + if 0 <= line_start: + line_num = path[ line_start + 1 : column_start] + if line_num == '': + line_num = 1 + if not(column_start == column_end): + column_num = path[ column_start + 1 : column_end] + if column_num == '': + column_num = 0 + + index_end = path.find(',') + if 0 <= index_end: + path = path[ : index_end] # delete comma and anything after + index_end = path.find(':', 2) + if 0 <= index_end: + path = path[ : path.find(':', 2)] # delete the line number and anything after + + path = path.replace('\\','/') + + if 1 == path.find(':') and current_OS == 'Windows': + return path, line_num, column_num # found a full path - no need for further processing + elif 0 == path.find('/') and (current_OS == 'Linux' or current_OS == 'Darwin'): + return path, line_num, column_num # found a full path - no need for further processing + + else: + + # resolve as many '../' as we can + while 0 <= path.find('../'): + end = path.find('../') - 1 + start = path.find('/') + while 0 <= path.find('/',start) and end > path.find('/',start): + start = path.find('/',start) + 1 + path = path[0:start] + path[end + 4: ] + + # this is an alternative to the above - it just deletes the '../' section + # start_temp = path.find('../') + # while 0 <= path.find('../',start_temp): + # start = path.find('../',start_temp) + # start_temp = start + 1 + # if 0 <= start: + # path = path[start + 2 : ] + + + start = path.find('/') + if not(0 == start): # make sure path starts with '/' + while 0 == path.find(' '): # eat any spaces at the beginning + path = path[ 1 : ] + path = '/' + path + + if current_OS == 'Windows': + search_path = path.replace('/', '\\') # os.walk uses '\' in Windows + else: + search_path = path + + start_path = os.path.abspath('') + + # search project directory for the selection + found = False + full_path = '' + for root, directories, filenames in os.walk(start_path): + for filename in filenames: + if 0 <= root.find('.git'): # don't bother looking in this directory + break + full_path = os.path.join(root,filename) + if 0 <= full_path.find(search_path): + found = True + break + if found: + break + + return full_path, line_num, column_num + +# end - resolve_path + + +# +# Opens the file in the preferred editor at the line & column number +# If the preferred editor isn't already running then it tries the next. +# If none are open then the system default is used. +# +# Editor order: +# 1. Notepad++ (Windows only) +# 2. Sublime Text +# 3. Atom +# 4. System default (opens at line 1, column 1 only) +# +def open_file(path): + import subprocess + file_path, line_num, column_num = resolve_path(path) + + if file_path == '' : + return + + if current_OS == 'Windows': + + editor_note = subprocess.check_output('wmic process where "name=' + "'notepad++.exe'" + '" get ExecutablePath') + editor_sublime = subprocess.check_output('wmic process where "name=' + "'sublime_text.exe'" + '" get ExecutablePath') + editor_atom = subprocess.check_output('wmic process where "name=' + "'atom.exe'" + '" get ExecutablePath') + + if 0 <= editor_note.find('notepad++.exe'): + start = editor_note.find('\n') + 1 + end = editor_note.find('\n',start + 5) -4 + editor_note = editor_note[ start : end] + command = file_path , ' -n' + str(line_num) , ' -c' + str(column_num) + subprocess.Popen([editor_note, command]) + + elif 0 <= editor_sublime.find('sublime_text.exe'): + start = editor_sublime.find('\n') + 1 + end = editor_sublime.find('\n',start + 5) -4 + editor_sublime = editor_sublime[ start : end] + command = file_path + ':' + line_num + ':' + column_num + subprocess.Popen([editor_sublime, command]) + + elif 0 <= editor_atom.find('atom.exe'): + start = editor_atom.find('\n') + 1 + end = editor_atom.find('\n',start + 5) -4 + editor_atom = editor_atom[ start : end] + command = file_path + ':' + str(line_num) + ':' + str(column_num) + subprocess.Popen([editor_atom, command]) + + else: + os.startfile(resolve_path(path)) # open file with default app + + elif current_OS == 'Linux': + + command = file_path + ':' + str(line_num) + ':' + str(column_num) + index_end = command.find(',') + if 0 <= index_end: + command = command[ : index_end] # sometimes a comma magically appears, don't want it + running_apps = subprocess.Popen('ps ax -o cmd', stdout=subprocess.PIPE, shell=True) + (output, err) = running_apps.communicate() + temp = output.split('\n') + + def find_editor_linux(name, search_obj): + for line in search_obj: + if 0 <= line.find(name): + path = line + return True, path + return False , '' + + (success_sublime, editor_path_sublime) = find_editor_linux('sublime_text',temp) + (success_atom, editor_path_atom) = find_editor_linux('atom',temp) + + if success_sublime: + subprocess.Popen([editor_path_sublime, command]) + + elif success_atom: + subprocess.Popen([editor_path_atom, command]) + + else: + os.system('xdg-open ' + file_path ) + + elif current_OS == 'Darwin': # MAC + + command = file_path + ':' + str(line_num) + ':' + str(column_num) + index_end = command.find(',') + if 0 <= index_end: + command = command[ : index_end] # sometimes a comma magically appears, don't want it + running_apps = subprocess.Popen('ps axwww -o command', stdout=subprocess.PIPE, shell=True) + (output, err) = running_apps.communicate() + temp = output.split('\n') + + def find_editor_mac(name, search_obj): + for line in search_obj: + if 0 <= line.find(name): + path = line + if 0 <= path.find('-psn'): + path = path[ : path.find('-psn') - 1 ] + return True, path + return False , '' + + (success_sublime, editor_path_sublime) = find_editor_mac('Sublime',temp) + (success_atom, editor_path_atom) = find_editor_mac('Atom',temp) + + if success_sublime: + subprocess.Popen([editor_path_sublime, command]) + + elif success_atom: + subprocess.Popen([editor_path_atom, command]) + + else: + os.system('open ' + file_path ) +# end - open_file + + +# gets the last build environment +def get_build_last(): + env_last = '' + DIR_PWD = os.listdir('.') + if '.pioenvs' in DIR_PWD: + date_last = 0.0 + DIR__pioenvs = os.listdir('.pioenvs') + for name in DIR__pioenvs: + if 0 <= name.find('.') or 0 <= name.find('-'): # skip files in listing + continue + DIR_temp = os.listdir('.pioenvs/' + name) + for names_temp in DIR_temp: + + if 0 == names_temp.find('firmware.'): + date_temp = os.path.getmtime('.pioenvs/' + name + '/' + names_temp) + if date_temp > date_last: + date_last = date_temp + env_last = name + return env_last + + +# gets the board being built from the Configuration.h file +# returns: board name, major version of Marlin being used (1 or 2) +def get_board_name(): + board_name = '' + # get board name + + with open('Marlin/Configuration.h', 'r') as myfile: + Configuration_h = myfile.read() + + Configuration_h = Configuration_h.split('\n') + Marlin_ver = 0 # set version to invalid number + for lines in Configuration_h: + if 0 == lines.find('#define CONFIGURATION_H_VERSION 01'): + Marlin_ver = 1 + if 0 == lines.find('#define CONFIGURATION_H_VERSION 02'): + Marlin_ver = 2 + board = lines.find(' BOARD_') + 1 + motherboard = lines.find(' MOTHERBOARD ') + 1 + define = lines.find('#define ') + comment = lines.find('//') + if (comment == -1 or comment > board) and \ + board > motherboard and \ + motherboard > define and \ + define >= 0 : + spaces = lines.find(' ', board) # find the end of the board substring + if spaces == -1: + board_name = lines[board : ] + else: + board_name = lines[board : spaces] + break + + + return board_name, Marlin_ver + + +# extract first environment name it finds after the start position +# returns: environment name and position to start the next search from +def get_env_from_line(line, start_position): + env = '' + next_position = -1 + env_position = line.find('env:', start_position) + if 0 < env_position: + next_position = line.find(' ', env_position + 4) + if 0 < next_position: + env = line[env_position + 4 : next_position] + else: + env = line[env_position + 4 : ] # at the end of the line + return env, next_position + + + +#scans pins.h for board name and returns the environment(s) it finds +def get_starting_env(board_name_full, version): + # get environment starting point + + if version == 1: + path = 'Marlin/pins.h' + if version == 2: + path = 'Marlin/src/pins/pins.h' + with open(path, 'r') as myfile: + pins_h = myfile.read() + + env_A = '' + env_B = '' + env_C = '' + + board_name = board_name_full[ 6 : ] # only use the part after "BOARD_" since we're searching the pins.h file + pins_h = pins_h.split('\n') + environment = '' + board_line = '' + cpu_A = '' + cpu_B = '' + i = 0 + list_start_found = False + for lines in pins_h: + i = i + 1 # i is always one ahead of the index into pins_h + if 0 < lines.find("Unknown MOTHERBOARD value set in Configuration.h"): + break # no more + if 0 < lines.find('1280'): + list_start_found = True + if list_start_found == False: # skip lines until find start of CPU list + continue + board = lines.find(board_name) + comment_start = lines.find('// ') + cpu_A_loc = comment_start + cpu_B_loc = 0 + if board > 0: # need to look at the next line for environment info + cpu_line = pins_h[i] + comment_start = cpu_line.find('// ') + env_A, next_position = get_env_from_line(cpu_line, comment_start) # get name of environment & start of search for next + env_B, next_position = get_env_from_line(cpu_line, next_position) # get next environment, if it exists + env_C, next_position = get_env_from_line(cpu_line, next_position) # get next environment, if it exists + break + return env_A, env_B, env_C + + +# scans input string for CPUs that the users may need to select from +# returns: CPU name +def get_CPU_name(environment): + CPU_list = ('1280', '2560','644', '1284', 'LPC1768', 'DUE') + CPU_name = '' + for CPU in CPU_list: + if 0 < environment.find(CPU): + return CPU + + +# get environment to be used for the build +# returns: environment +def get_env(board_name, ver_Marlin): + def no_environment(): + print 'ERROR - no environment for this board' + print board_name + raise SystemExit(0) # no environment so quit + + def invalid_board(): + print 'ERROR - invalid board' + print board_name + raise SystemExit(0) # quit if unable to find board + + + CPU_question = ( ('1280', '2560', " 1280 or 2560 CPU? "), ('644', '1284', " 644 or 1284 CPU? ") ) + + if 0 < board_name.find('MELZI') : + get_answer(' ' + board_name + ' ', " Which flavor of Melzi? ", "Melzi (Optiboot bootloader)", "Melzi ") + if 1 == get_answer_val: + target_env = 'melzi_optiboot' + else: + target_env = 'melzi' + else: + env_A, env_B, env_C = get_starting_env(board_name, ver_Marlin) + + if env_A == '': + no_environment() + if env_B == '': + return env_A # only one environment so finished + + CPU_A = get_CPU_name(env_A) + CPU_B = get_CPU_name(env_B) + + for item in CPU_question: + if CPU_A == item[0]: + get_answer(' ' + board_name + ' ', item[2], item[0], item[1]) + if 2 == get_answer_val: + target_env = env_B + else: + target_env = env_A + return target_env + + if env_A == 'LPC1768': + if build_type == 'traceback' or (build_type == 'clean' and get_build_last() == 'LPC1768_debug_and_upload'): + target_env = 'LPC1768_debug_and_upload' + else: + target_env = 'LPC1768' + elif env_A == 'DUE': + target_env = 'DUE' + if build_type == 'traceback' or (build_type == 'clean' and get_build_last() == 'DUE_debug'): + target_env = 'DUE_debug' + elif env_B == 'DUE_USB': + get_answer(' ' + board_name + ' ', " DUE: need download port ", "USB (native USB) port", "Programming port ") + if 1 == get_answer_val: + target_env = 'DUE_USB' + else: + target_env = 'DUE' + else: + invalid_board() + + if build_type == 'traceback' and not(target_env == 'LPC1768_debug_and_upload' or target_env == 'DUE_debug') and Marlin_ver == 2: + print "ERROR - this board isn't setup for traceback" + print 'board_name: ', board_name + print 'target_env: ', target_env + raise SystemExit(0) + + return target_env +# end - get_env + +# puts screen text into queue so that the parent thread can fetch the data from this thread +import Queue +IO_queue = Queue.Queue() +PIO_queue = Queue.Queue() +def write_to_screen_queue(text, format_tag = 'normal'): + double_in = [text, format_tag] + IO_queue.put(double_in, block = False) + + +# +# send one line to the terminal screen with syntax highlighting +# +# input: unformatted text, flags from previous run +# returns: formatted text ready to go to the terminal, flags from this run +# +# This routine remembers the status from call to call because previous +# lines can affect how the current line is highlighted +# + +# 'static' variables - init here and then keep updating them from within print_line +warning = False +warning_FROM = False +error = False +standard = True +prev_line_COM = False +next_line_warning = False +warning_continue = False +line_counter = 0 + +def line_print(line_input): + + global warning + global warning_FROM + global error + global standard + global prev_line_COM + global next_line_warning + global warning_continue + global line_counter + + + + + # all '0' elements must precede all '1' elements or they'll be skipped + platformio_highlights = [ + ['Environment', 0, 'highlight_blue'], + ['[SKIP]', 1, 'warning'], + ['[ERROR]', 1, 'error'], + ['[SUCCESS]', 1, 'highlight_green'] + ] + + def write_to_screen_with_replace(text, highlights): # search for highlights & split line accordingly + did_something = False + for highlight in highlights: + found = text.find(highlight[0]) + if did_something == True: + break + if found >= 0 : + did_something = True + if 0 == highlight[1]: + found_1 = text.find(' ') + found_tab = text.find('\t') + if found_1 < 0 or found_1 > found_tab: + found_1 = found_tab + write_to_screen_queue(text[ : found_1 + 1 ]) + for highlight_2 in highlights: + if highlight[0] == highlight_2[0] : + continue + found = text.find(highlight_2[0]) + if found >= 0 : + found_space = text.find(' ', found_1 + 1) + found_tab = text.find('\t', found_1 + 1) + if found_space < 0 or found_space > found_tab: + found_space = found_tab + found_right = text.find(']', found + 1) + write_to_screen_queue(text[found_1 + 1 : found_space + 1 ], highlight[2]) + write_to_screen_queue(text[found_space + 1 : found + 1 ]) + write_to_screen_queue(text[found + 1 : found_right], highlight_2[2]) + write_to_screen_queue(text[found_right : ] + '\n') + break + break + if 1 == highlight[1]: + found_right = text.find(']', found + 1) + write_to_screen_queue(text[ : found + 1 ]) + write_to_screen_queue(text[found + 1 : found_right ], highlight[2]) + write_to_screen_queue(text[found_right : ] + '\n') + break + if did_something == False: + r_loc = text.find('\r') + 1 + if r_loc > 0 and r_loc < len(text): # need to split this line + text = text.split('\r') + for line in text: + write_to_screen_queue(line + '\n') + else: + write_to_screen_queue(text + '\n') + # end - write_to_screen_with_replace + + + + # scan the line + line_counter = line_counter + 1 + max_search = len(line_input) + if max_search > 3 : + max_search = 3 + beginning = line_input[:max_search] + + # set flags + if 0 < line_input.find(': warning: '): # start of warning block + warning = True + warning_FROM = False + error = False + standard = False + prev_line_COM = False + prev_line_COM = False + warning_continue = True + if 0 < line_input.find('Thank you') or 0 < line_input.find('SUMMARY') : + warning = False #standard line found + warning_FROM = False + error = False + standard = True + prev_line_COM = False + warning_continue = False + elif beginning == 'War' or \ + beginning == '#er' or \ + beginning == 'In ' or \ + (beginning != 'Com' and prev_line_COM == True and not(beginning == 'Arc' or beginning == 'Lin' or beginning == 'Ind') or \ + next_line_warning == True): + warning = True #warning found + warning_FROM = False + error = False + standard = False + prev_line_COM = False + elif beginning == 'Com' or \ + beginning == 'Ver' or \ + beginning == ' [E' or \ + beginning == 'Rem' or \ + beginning == 'Bui' or \ + beginning == 'Ind' or \ + beginning == 'PLA': + warning = False #standard line found + warning_FROM = False + error = False + standard = True + prev_line_COM = False + warning_continue = False + elif beginning == '***': + warning = False # error found + warning_FROM = False + error = True + standard = False + prev_line_COM = False + elif 0 < line_input.find(': error:') or \ + 0 < line_input.find(': fatal error:'): # start of warning /error block + warning = False # error found + warning_FROM = False + error = True + standard = False + prev_line_COM = False + warning_continue = True + elif beginning == 'fro' and warning == True or \ + beginning == '.pi' : # start of warning /error block + warning_FROM = True + prev_line_COM = False + warning_continue = True + elif warning_continue == True: + warning = True + warning_FROM = False # keep the warning status going until find a standard line or an error + error = False + standard = False + prev_line_COM = False + warning_continue = True + + else: + warning = False # unknown so assume standard line + warning_FROM = False + error = False + standard = True + prev_line_COM = False + warning_continue = False + + if beginning == 'Com': + prev_line_COM = True + + # print based on flags + if standard == True: + write_to_screen_with_replace(line_input, platformio_highlights) #print white on black with substitutions + if warning == True: + write_to_screen_queue(line_input + '\n', 'warning') + if error == True: + write_to_screen_queue(line_input + '\n', 'error') +# end - line_print + + + +def run_PIO(dummy): + + ########################################################################## + # # + # run Platformio # + # # + ########################################################################## + + + # build platformio run -e target_env + # clean platformio run --target clean -e target_env + # upload platformio run --target upload -e target_env + # traceback platformio run --target upload -e target_env + # program platformio run --target program -e target_env + # test platformio test upload -e target_env + # remote platformio remote run --target upload -e target_env + # debug platformio debug -e target_env + + + global build_type + global target_env + global board_name + print 'build_type: ', build_type + + import subprocess + import sys + + print 'starting platformio' + + if build_type == 'build': + # platformio run -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen(['platformio', 'run', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + + elif build_type == 'clean': + # platformio run --target clean -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen(['platformio', 'run', '--target', 'clean', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + + elif build_type == 'upload': + # platformio run --target upload -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen(['platformio', 'run', '--target', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + + elif build_type == 'traceback': + # platformio run --target upload -e target_env - select the debug environment if there is one + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen(['platformio', 'run', '--target', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + + elif build_type == 'program': + # platformio run --target program -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen(['platformio', 'run', '--target', 'program', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + + elif build_type == 'test': + #platformio test upload -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen(['platformio', 'test', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + + elif build_type == 'remote': + # platformio remote run --target upload -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen(['platformio', 'remote', 'run', '--target', 'program', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + + elif build_type == 'debug': + # platformio debug -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen(['platformio', 'debug', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + + else: + print 'ERROR - unknown build type: ', build_type + raise SystemExit(0) # kill everything + + # stream output from subprocess and split it into lines + for line in iter(pio_subprocess.stdout.readline, ''): + line_print(line.replace('\n', '')) + + + # append info used to run PlatformIO + write_to_screen_queue('\nBoard name: ' + board_name + '\n') # put build info at the bottom of the screen + write_to_screen_queue('Build type: ' + build_type + '\n') + write_to_screen_queue('Environment used: ' + target_env + '\n') +# end - run_PIO + + +######################################################################## + +import time +import threading +import Tkinter as tk +import ttk +import Queue +import subprocess +import sys +que = Queue.Queue() +#IO_queue = Queue.Queue() + +from Tkinter import Tk, Frame, Text, Scrollbar, Menu +from tkMessageBox import askokcancel + +import tkFileDialog +from tkMessageBox import askokcancel +import tkFileDialog + + + +class output_window(Text): + # based on Super Text + global continue_updates + continue_updates = True + + global search_position + search_position = '' # start with invalid search position + + global error_found + error_found = False # are there any errors? + + + def __init__(self): + + + self.root = tk.Tk() + self.frame = tk.Frame(self.root) + self.frame.pack(fill='both', expand=True) + + # text widget + #self.text = tk.Text(self.frame, borderwidth=3, relief="sunken") + Text.__init__(self, self.frame, borderwidth=3, relief="sunken") + self.config(tabs=(400,)) # configure Text widget tab stops + self.config(background = 'black', foreground = 'white', font= ("consolas", 12), wrap = 'word', undo = 'True') +# self.config(background = 'black', foreground = 'white', font= ("consolas", 12), wrap = 'none', undo = 'True') + self.config(height = 24, width = 100) + self.config(insertbackground = 'pale green') # keyboard insertion point + self.pack(side='left', fill='both', expand=True) + + self.tag_config('normal', foreground = 'white') + self.tag_config('warning', foreground = 'yellow' ) + self.tag_config('error', foreground = 'red') + self.tag_config('highlight_green', foreground = 'green') + self.tag_config('highlight_blue', foreground = 'cyan') + self.tag_config('error_highlight_inactive', background = 'dim gray') + self.tag_config('error_highlight_active', background = 'light grey') + + self.bind_class("Text","", self.select_all) # required in windows, works in others + self.bind_all("", self.scroll_errors) + self.bind_class("", self.rebuild) + + # scrollbar + + scrb = tk.Scrollbar(self.frame, orient='vertical', command=self.yview) + self.config(yscrollcommand=scrb.set) + scrb.pack(side='right', fill='y') + +# self.scrb_Y = tk.Scrollbar(self.frame, orient='vertical', command=self.yview) +# self.scrb_Y.config(yscrollcommand=self.scrb_Y.set) +# self.scrb_Y.pack(side='right', fill='y') +# +# self.scrb_X = tk.Scrollbar(self.frame, orient='horizontal', command=self.xview) +# self.scrb_X.config(xscrollcommand=self.scrb_X.set) +# self.scrb_X.pack(side='bottom', fill='x') + +# scrb_X = tk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.xview) # tk.HORIZONTAL now have a horizsontal scroll bar BUT... shrinks it to a postage stamp and hides far right behind the vertical scroll bar +# self.config(xscrollcommand=scrb_X.set) +# scrb_X.pack(side='bottom', fill='x') +# +# scrb= tk.Scrollbar(self, orient='vertical', command=self.yview) +# self.config(yscrollcommand=scrb.set) +# scrb.pack(side='right', fill='y') + +# self.config(height = 240, width = 1000) # didn't get the size baCK TO NORMAL +# self.pack(side='left', fill='both', expand=True) # didn't get the size baCK TO NORMAL + + + # pop-up menu + self.popup = tk.Menu(self, tearoff=0) + + self.popup.add_command(label='Copy', command=self._copy) + self.popup.add_command(label='Paste', command=self._paste) + self.popup.add_separator() + self.popup.add_command(label='Cut', command=self._cut) + self.popup.add_separator() + self.popup.add_command(label='Select All', command=self._select_all) + self.popup.add_command(label='Clear All', command=self._clear_all) + self.popup.add_separator() + self.popup.add_command(label='Save As', command=self._file_save_as) + self.popup.add_separator() + # self.popup.add_command(label='Repeat Build(CTL-shift-r)', command=self._rebuild) + self.popup.add_command(label='Repeat Build', command=self._rebuild) + self.popup.add_separator() + self.popup.add_command(label='Scroll Errors (CTL-shift-e)', command=self._scroll_errors) + self.popup.add_separator() + self.popup.add_command(label='Open File at Cursor', command=self._open_selected_file) + + if current_OS == 'Darwin': # MAC + self.bind('', self._show_popup) # macOS only + else: + self.bind('', self._show_popup) # Windows & Linux + + + # threading & subprocess section + + def start_thread(self, ): + global continue_updates + # create then start a secondary thread to run an arbitrary function + # must have at least one argument + self.secondary_thread = threading.Thread(target = lambda q, arg1: q.put(run_PIO(arg1)), args=(que, '')) + self.secondary_thread.start() + continue_updates = True + # check the Queue in 50ms + self.root.after(50, self.check_thread) + self.root.after(50, self.update) + + + def check_thread(self): # wait for user to kill the window + global continue_updates + if continue_updates == True: + self.root.after(10, self.check_thread) + + + def update(self): + global continue_updates + if continue_updates == True: + self.root.after(10, self.update)#method is called every 50ms + temp_text = ['0','0'] + if IO_queue.empty(): + if not(self.secondary_thread.is_alive()): + continue_updates = False # queue is exhausted and thread is dead so no need for further updates + else: + try: + temp_text = IO_queue.get(block = False) + except Queue.Empty: + continue_updates = False # queue is exhausted so no need for further updates + else: + self.insert('end', temp_text[0], temp_text[1]) + self.see("end") # make the last line visible (scroll text off the top) + + + # text editing section + + + def _scroll_errors(self): + global search_position + global error_found + if search_position == '': # first time so highlight all errors + countVar = tk.IntVar() + search_position = '1.0' + search_count = 0 + while not(search_position == '') and search_count < 100: + search_position = self.search("error", search_position, stopindex="end", count=countVar, nocase=1) + search_count = search_count + 1 + if not(search_position == ''): + error_found = True + end_pos = '{}+{}c'.format(search_position, 5) + self.tag_add("error_highlight_inactive", search_position, end_pos) + search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search + else: + break + + if error_found: + if search_position == '': + search_position = self.search("error", '1.0', stopindex="end", nocase=1) # new search + else: # remove active highlight + end_pos = '{}+{}c'.format(search_position, 5) + start_pos = '{}+{}c'.format(search_position, -1) + self.tag_remove("error_highlight_active", start_pos, end_pos) + search_position = self.search("error", search_position, stopindex="end", nocase=1) # finds first occurrence AGAIN on the first time through + if search_position == "": # wrap around + search_position = self.search("error", '1.0', stopindex="end", nocase=1) + end_pos = '{}+{}c'.format(search_position, 5) + self.tag_add("error_highlight_active", search_position, end_pos) # add active highlight + self.see(search_position) + search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search + + def scroll_errors(self, event): + self._scroll_errors() + + + def _rebuild(self): + #global board_name + #global Marlin_ver + #global target_env + #board_name, Marlin_ver = get_board_name() + #target_env = get_env(board_name, Marlin_ver) + self.start_thread() + + def rebuild(self, event): + print "event happened" + self._rebuild() + + + def _open_selected_file(self): + current_line = self.index('insert') + line_start = current_line[ : current_line.find('.')] + '.0' + line_end = current_line[ : current_line.find('.')] + '.200' + self.mark_set("path_start", line_start) + self.mark_set("path_end", line_end) + path = self.get("path_start", "path_end") + from_loc = path.find('from ') + colon_loc = path.find(': ') + if 0 <= from_loc and ((colon_loc == -1) or (from_loc < colon_loc)) : + path = path [ from_loc + 5 : ] + if 0 <= colon_loc: + path = path [ : colon_loc ] + if 0 <= path.find('\\') or 0 <= path.find('/'): # make sure it really contains a path + open_file(path) + + + def _file_save_as(self): + self.filename = tkFileDialog.asksaveasfilename(defaultextension = '.txt') + f = open(self.filename, 'w') + f.write(self.get('1.0', 'end')) + f.close() + + + + def copy(self, event): + try: + selection = self.get(*self.tag_ranges('sel')) + self.clipboard_clear() + self.clipboard_append(selection) + except TypeError: + pass + + def cut(self, event): + + try: + selection = self.get(*self.tag_ranges('sel')) + self.clipboard_clear() + self.clipboard_append(selection) + self.delete(*self.tag_ranges('sel')) + except TypeError: + pass + + def _show_popup(self, event): + '''right-click popup menu''' + + if self.root.focus_get() != self: + self.root.focus_set() + + try: + self.popup.tk_popup(event.x_root, event.y_root, 0) + finally: + self.popup.grab_release() + + def _cut(self): + + try: + selection = self.get(*self.tag_ranges('sel')) + self.clipboard_clear() + self.clipboard_append(selection) + self.delete(*self.tag_ranges('sel')) + except TypeError: + pass + + def cut(self, event): + self._cut() + + def _copy(self): + + try: + selection = self.get(*self.tag_ranges('sel')) + self.clipboard_clear() + self.clipboard_append(selection) + except TypeError: + pass + + def copy(self, event): + self._copy() + + def _paste(self): + + self.insert('insert', self.selection_get(selection='CLIPBOARD')) + + def _select_all(self): + self.tag_add('sel', '1.0', 'end') + + + def select_all(self, event): + self.tag_add('sel', '1.0', 'end') + + + def _clear_all(self): + '''erases all text''' + + isok = askokcancel('Clear All', 'Erase all text?', frame=self, + default='ok') + if isok: + self.delete('1.0', 'end') + + +# end - output_window + + + +def main(): + + + ########################################################################## + # # + # main program # + # # + ########################################################################## + + global build_type + global target_env + global board_name + + board_name, Marlin_ver = get_board_name() + + target_env = get_env(board_name, Marlin_ver) + + os.environ["BUILD_TYPE"] = build_type # let sub processes know what is happening + os.environ["TARGET_ENV"] = target_env + os.environ["BOARD_NAME"] = board_name + + auto_build = output_window() + auto_build.start_thread() # executes the "run_PIO" function + + auto_build.root.mainloop() + + + + +if __name__ == '__main__': + + main() diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/atom/avrdude.conf similarity index 99% rename from buildroot/share/vscode/avrdude.conf rename to buildroot/share/atom/avrdude.conf index 991d255750..1194847f77 100644 --- a/buildroot/share/vscode/avrdude.conf +++ b/buildroot/share/atom/avrdude.conf @@ -145,13 +145,13 @@ # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata page 2 at: +# at90s4433/2333's; see the at90s4433 errata at: # -# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf +# http://www.atmel.com/atmel/acrobat/doc1280.pdf # # INSTRUCTION FORMATS # -# Instruction formats are specified as a comma separated list of +# Instruction formats are specified as a comma seperated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, https://www.fischl.de/usbasp/"; + desc = "USBasp, http://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, https://savannah.nongnu.org/projects/avrdude"; + desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port download on http://www.electropol.fr +# disconnect port (download on http://electropol.free.fr) programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en592141 +# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 programmer id = "89isp"; desc = "Atmel at89isp cable"; diff --git a/buildroot/share/vscode/avrdude_5.10_linux b/buildroot/share/atom/avrdude_5.10_linux similarity index 100% rename from buildroot/share/vscode/avrdude_5.10_linux rename to buildroot/share/atom/avrdude_5.10_linux diff --git a/buildroot/share/vscode/avrdude_5.10_macOS b/buildroot/share/atom/avrdude_5.10_macOS similarity index 100% rename from buildroot/share/vscode/avrdude_5.10_macOS rename to buildroot/share/atom/avrdude_5.10_macOS diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/atom/avrdude_linux.conf similarity index 99% rename from buildroot/share/vscode/avrdude_linux.conf rename to buildroot/share/atom/avrdude_linux.conf index ff429a028c..46e7ace34b 100644 --- a/buildroot/share/vscode/avrdude_linux.conf +++ b/buildroot/share/atom/avrdude_linux.conf @@ -145,13 +145,13 @@ # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata page 2 at: +# at90s4433/2333's; see the at90s4433 errata at: # -# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf +# http://www.atmel.com/atmel/acrobat/doc1280.pdf # # INSTRUCTION FORMATS # -# Instruction formats are specified as a comma separated list of +# Instruction formats are specified as a comma seperated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, https://www.fischl.de/usbasp/"; + desc = "USBasp, http://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; type = usbtiny; ; @@ -596,7 +596,7 @@ programmer programmer id = "bsd"; - desc = "Brian Dean's Programmer, https://savannah.nongnu.org/projects/avrdude"; + desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; type = par; vcc = 2, 3, 4, 5; reset = 7; @@ -743,7 +743,7 @@ programmer programmer id = "atisp"; - desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; type = par; reset = ~6; sck = ~8; @@ -753,7 +753,7 @@ programmer programmer id = "ere-isp-avr"; - desc = "ERE ISP-AVR "; + desc = "ERE ISP-AVR "; type = par; reset = ~4; sck = 3; @@ -773,7 +773,7 @@ programmer ; # It is almost same as pony-stk200, except vcc on pin 5 to auto -# disconnect port download on http://www.electropol.fr +# disconnect port (download on http://electropol.free.fr) programmer id = "frank-stk200"; desc = "Frank STK200"; @@ -787,7 +787,7 @@ programmer ; # The AT98ISP Cable is a simple parallel dongle for AT89 family. -# https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en592141 +# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 programmer id = "89isp"; desc = "Atmel at89isp cable"; diff --git a/buildroot/share/vscode/avrdude_macOS.conf b/buildroot/share/atom/avrdude_macOS.conf similarity index 99% rename from buildroot/share/vscode/avrdude_macOS.conf rename to buildroot/share/atom/avrdude_macOS.conf index 6147a2259a..d933567452 100644 --- a/buildroot/share/vscode/avrdude_macOS.conf +++ b/buildroot/share/atom/avrdude_macOS.conf @@ -145,13 +145,13 @@ # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the -# at90s4433/2333's; see the at90s4433 errata page 2 at: +# at90s4433/2333's; see the at90s4433 errata at: # -# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf +# http://www.atmel.com/atmel/acrobat/doc1280.pdf # # INSTRUCTION FORMATS # -# Instruction formats are specified as a comma separated list of +# Instruction formats are specified as a comma seperated list of # string values containing information (bit specifiers) about each # of the 32 bits of the instruction. Bit specifiers may be one of # the following formats: @@ -416,13 +416,13 @@ programmer programmer id = "usbasp"; - desc = "USBasp, https://www.fischl.de/usbasp/"; + desc = "USBasp, http://www.fischl.de/usbasp/"; type = usbasp; ; programmer id = "usbtiny"; - desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; type = usbtiny; ; diff --git a/buildroot/share/vscode/create_custom_upload_command_CDC.py b/buildroot/share/atom/create_custom_upload_command_CDC.py similarity index 82% rename from buildroot/share/vscode/create_custom_upload_command_CDC.py rename to buildroot/share/atom/create_custom_upload_command_CDC.py index acfd1787fb..2fea2d5b53 100644 --- a/buildroot/share/vscode/create_custom_upload_command_CDC.py +++ b/buildroot/share/atom/create_custom_upload_command_CDC.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # # Builds custom upload command # 1) Run platformio as a subprocess to find a COM port @@ -10,9 +9,6 @@ # Will continue on if a COM port isn't found so that the compilation can be done. # -from __future__ import print_function -from __future__ import division - import subprocess import os import sys @@ -49,7 +45,7 @@ else: global description_CDC - print('\nLooking for Serial Port\n') + print '\nLooking for Serial Port\n' # stream output from subprocess and split it into lines pio_subprocess = subprocess.Popen(['platformio', 'device', 'list'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) @@ -70,7 +66,7 @@ else: com_CDC = com_last description_CDC = description_last - if com_CDC == '' and com_first != '': + if com_CDC == '' and not(com_first == ''): com_CDC = com_first description_CDC = description_first elif com_CDC == '': @@ -82,10 +78,10 @@ else: com_CDC = com_CDC.replace('\r', '') if com_CDC == 'COM_PORT_NOT_FOUND': - print(com_CDC, '\n') + print com_CDC, '\n' else: - print('FOUND: ', com_CDC) - print('DESCRIPTION: ', description_CDC, '\n') + print 'FOUND: ' ,com_CDC + print 'DESCRIPTION: ', description_CDC , '\n' if current_OS == 'Windows': @@ -97,7 +93,7 @@ else: avrdude_exe_path = 'buildroot\\share\\atom\\avrdude_5.10.exe' # source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' - source_path = '.pio\\build\\' + env.get("PIOENV") + '\\firmware.hex' + source_path = '.pioenvs\\' + env.get("PIOENV") + '\\firmware.hex' upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' @@ -107,18 +103,18 @@ else: get_com_port('usbmodem', 'Description:', 13) # avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' - avrdude_conf_path = 'buildroot/share/vscode/avrdude_macOS.conf' + avrdude_conf_path = 'buildroot/share/atom/avrdude_macOS.conf' - avrdude_exe_path = 'buildroot/share/vscode/avrdude_5.10_macOS' + avrdude_exe_path = 'buildroot/share/atom/avrdude_5.10_macOS' # source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' - source_path = '.pio/build/' + env.get("PIOENV") + '/firmware.hex' + source_path = '.pioenvs/' + env.get("PIOENV") + '/firmware.hex' # upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' - print('upload_string: ', upload_string) + print 'upload_string: ', upload_string @@ -127,12 +123,12 @@ else: get_com_port('/dev/tty', 'Description:', 13) # avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' - avrdude_conf_path = 'buildroot/share/vscode/avrdude_linux.conf' + avrdude_conf_path = 'buildroot/share/atom/avrdude_linux.conf' - avrdude_exe_path = 'buildroot/share/vscode/avrdude_5.10_linux' + avrdude_exe_path = 'buildroot/share/atom/avrdude_5.10_linux' # source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' - source_path = '.pio/build/' + env.get("PIOENV") + '/firmware.hex' + source_path = '.pioenvs/' + env.get("PIOENV") + '/firmware.hex' # upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' diff --git a/buildroot/share/vscode/create_custom_upload_command_DFU.py b/buildroot/share/atom/create_custom_upload_command_DFU.py similarity index 100% rename from buildroot/share/vscode/create_custom_upload_command_DFU.py rename to buildroot/share/atom/create_custom_upload_command_DFU.py diff --git a/buildroot/share/cmake/CMakeLists.txt b/buildroot/share/cmake/CMakeLists.txt index 9d3f24f990..1308f8bf97 100644 --- a/buildroot/share/cmake/CMakeLists.txt +++ b/buildroot/share/cmake/CMakeLists.txt @@ -47,8 +47,8 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/marlin-cma # cmake .. -DARDUINO_SDK_PATH="/path/to/arduino-1.x.x" # #====================================================================# #set(ARDUINO_SDK_PATH ${CMAKE_CURRENT_LIST_DIR}/arduino-1.6.8) -#set(ARDUINO_SDK_PATH /Applications/Arduino.app/Contents/Java) -#set(ARDUINO_SDK_PATH $HOME/ArduinoAddons/Arduino_1.6.x) +#set(ARDUINO_SDK_PATH /home/tom/git/BigBox-Dual-Marlin/ArduinoAddons/Arduino_1.6.x) +#set(ARDUINO_SDK_PATH /home/tom/test/arduino-1.6.11) #====================================================================# # Set included cmake files # #====================================================================# @@ -96,8 +96,8 @@ setup_motherboard(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/../../../Marlin) # Include Marlin.ino to compile libs not included in *.cpp files # #====================================================================# -file(GLOB_RECURSE SOURCES "../../../Marlin/*.cpp") -set(${PROJECT_NAME}_SRCS "${SOURCES};../../../Marlin/Marlin.ino") +file(GLOB SOURCES "../../../src/*.cpp") +set(${PROJECT_NAME}_SRCS "${SOURCES};../../../src/Marlin.ino") #====================================================================# # Define the port for uploading code to the Arduino # diff --git a/buildroot/share/extras/header.h b/buildroot/share/extras/header.h deleted file mode 100644 index 5d2c73dfbe..0000000000 --- a/buildroot/share/extras/header.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * $(filename) - */ - diff --git a/buildroot/share/extras/uncrustify.cfg b/buildroot/share/extras/uncrustify.cfg deleted file mode 100644 index 06661203f0..0000000000 --- a/buildroot/share/extras/uncrustify.cfg +++ /dev/null @@ -1,84 +0,0 @@ -# -# Uncrustify Configuration File -# File Created With UncrustifyX 0.4.3 (252) -# -align_assign_span = 1 -cmt_cpp_to_c = false -cmt_indent_multi = false -cmt_insert_file_header = "./header.h" -cmt_reflow_mode = 1 -cmt_sp_after_star_cont = 1 -cmt_sp_before_star_cont = 1 -cmt_star_cont = true -eat_blanks_after_open_brace = false -eat_blanks_before_close_brace = false -indent_align_assign = false -indent_case_brace = 0 -indent_columns = 2 -indent_cpp_lambda_body = false -indent_func_call_param = true -indent_func_def_param = true -indent_switch_case = 2 -indent_with_tabs = 0 -input_tab_size = 2 -mod_add_long_ifdef_else_comment = 40 -mod_add_long_ifdef_endif_comment = 40 -mod_full_brace_do = false -mod_full_brace_for = false -mod_full_brace_if = false -mod_full_brace_if_chain = true -mod_full_brace_while = false -mod_remove_extra_semicolon = true -newlines = lf -nl_after_brace_close = true -nl_after_brace_open = true -nl_assign_leave_one_liners = true -nl_brace_else = add -nl_class_leave_one_liners = true -nl_create_for_one_liner = true -nl_create_if_one_liner = false -nl_create_while_one_liner = true -nl_else_brace = remove -nl_end_of_file = add -nl_enum_brace = remove -nl_enum_leave_one_liners = true -nl_fdef_brace = remove -nl_for_brace = remove -nl_func_leave_one_liners = true -nl_getset_leave_one_liners = true -nl_if_brace = remove -nl_if_leave_one_liners = true -nl_multi_line_sparen_close = add -nl_squeeze_ifdef = false -nl_struct_brace = remove -nl_switch_brace = remove -nl_union_brace = remove -pp_define_at_level = true -pp_if_indent_code = true -pp_indent = add -pp_indent_at_level = true -pp_indent_count = 2 -pp_indent_if = 0 -sp_after_comma = add -sp_after_semi = add -sp_after_sparen = add -sp_arith = add -sp_assign = add -sp_assign_default = remove -sp_before_comma = remove -sp_before_sparen = add -sp_bool = add -sp_brace_else = add -sp_cmt_cpp_start = add -sp_compare = add -sp_cond_colon = add -sp_cond_question = add -sp_else_brace = add -sp_endif_cmt = true -sp_fparen_brace = add -sp_func_call_paren = remove -sp_func_proto_paren = remove -sp_inside_sparen = remove -sp_inside_square = remove -sp_paren_brace = add -sp_paren_paren = remove diff --git a/buildroot/share/fonts/NanumGothic.bdf b/buildroot/share/fonts/NanumGothic.bdf deleted file mode 100644 index 9bd13123f2..0000000000 --- a/buildroot/share/fonts/NanumGothic.bdf +++ /dev/null @@ -1,302670 +0,0 @@ -STARTFONT 2.1 -COMMENT -COMMENT Converted from OpenType font "NanumGothic.ttf" by "otf2bdf 3.0". -COMMENT -FONT -FreeType-NanumGothic-Medium-R-Normal--11-80-100-100-P-90-ISO10646-1 -SIZE 8 100 100 -FONTBOUNDINGBOX 11 13 0 -3 -STARTPROPERTIES 19 -FOUNDRY "FreeType" -FAMILY_NAME "NanumGothic" -WEIGHT_NAME "Medium" -SLANT "R" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -PIXEL_SIZE 11 -POINT_SIZE 80 -RESOLUTION_X 100 -RESOLUTION_Y 100 -SPACING "P" -AVERAGE_WIDTH 90 -CHARSET_REGISTRY "ISO10646" -CHARSET_ENCODING "1" -FONT_ASCENT 10 -FONT_DESCENT 2 -COPYRIGHT "Copyright 2011 NHN Corporation. All rights reserved. Font designed by Sandoll Communications Inc." -_OTF_FONTFILE "NanumGothic.ttf" -_OTF_PSNAME "NanumGothic" -ENDPROPERTIES -CHARS 17666 -STARTCHAR 0000 -ENCODING 0 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0001 -ENCODING 1 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0002 -ENCODING 2 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0003 -ENCODING 3 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0004 -ENCODING 4 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0005 -ENCODING 5 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0006 -ENCODING 6 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0007 -ENCODING 7 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0008 -ENCODING 8 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0009 -ENCODING 9 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 000A -ENCODING 10 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 000B -ENCODING 11 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 000C -ENCODING 12 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 000D -ENCODING 13 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 000E -ENCODING 14 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 000F -ENCODING 15 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0010 -ENCODING 16 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0011 -ENCODING 17 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0012 -ENCODING 18 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0013 -ENCODING 19 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0014 -ENCODING 20 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0015 -ENCODING 21 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0016 -ENCODING 22 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0017 -ENCODING 23 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0018 -ENCODING 24 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0019 -ENCODING 25 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 001A -ENCODING 26 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 001B -ENCODING 27 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 001C -ENCODING 28 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 001D -ENCODING 29 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 001E -ENCODING 30 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 001F -ENCODING 31 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0020 -ENCODING 32 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 0021 -ENCODING 33 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 1 9 2 -1 -BITMAP -80 -80 -80 -80 -80 -80 -00 -80 -80 -ENDCHAR -STARTCHAR 0022 -ENCODING 34 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 3 1 5 -BITMAP -A0 -A0 -A0 -ENDCHAR -STARTCHAR 0023 -ENCODING 35 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -48 -50 -F8 -50 -50 -F8 -50 -90 -90 -ENDCHAR -STARTCHAR 0024 -ENCODING 36 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 11 1 -2 -BITMAP -20 -70 -A0 -A0 -60 -20 -30 -28 -28 -F0 -20 -ENDCHAR -STARTCHAR 0025 -ENCODING 37 -SWIDTH 1080 0 -DWIDTH 12 0 -BBX 10 9 1 -1 -BITMAP -6100 -9200 -9200 -9400 -6980 -0A40 -1240 -1240 -2180 -ENDCHAR -STARTCHAR 0026 -ENCODING 38 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -1 -BITMAP -70 -48 -48 -50 -64 -94 -8C -8C -74 -ENDCHAR -STARTCHAR 0027 -ENCODING 39 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 3 1 5 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR 0028 -ENCODING 40 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 11 1 -2 -BITMAP -20 -40 -40 -80 -80 -80 -80 -80 -40 -40 -20 -ENDCHAR -STARTCHAR 0029 -ENCODING 41 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 11 0 -2 -BITMAP -80 -40 -20 -20 -20 -20 -20 -20 -20 -40 -80 -ENDCHAR -STARTCHAR 002A -ENCODING 42 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 4 1 2 -BITMAP -20 -F8 -20 -50 -ENDCHAR -STARTCHAR 002B -ENCODING 43 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 6 1 1 -BITMAP -20 -20 -FC -20 -20 -20 -ENDCHAR -STARTCHAR 002C -ENCODING 44 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 2 1 -2 -BITMAP -80 -80 -ENDCHAR -STARTCHAR 002D -ENCODING 45 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 1 1 4 -BITMAP -E0 -ENDCHAR -STARTCHAR 002E -ENCODING 46 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 1 1 -1 -BITMAP -80 -ENDCHAR -STARTCHAR 002F -ENCODING 47 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 4 9 0 -1 -BITMAP -10 -10 -20 -20 -20 -40 -40 -40 -80 -ENDCHAR -STARTCHAR 0030 -ENCODING 48 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -70 -88 -88 -88 -88 -88 -88 -98 -70 -ENDCHAR -STARTCHAR 0031 -ENCODING 49 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 2 9 2 -1 -BITMAP -40 -C0 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR 0032 -ENCODING 50 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -70 -90 -08 -10 -10 -20 -40 -80 -F8 -ENDCHAR -STARTCHAR 0033 -ENCODING 51 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -F0 -18 -08 -10 -60 -10 -08 -18 -F0 -ENDCHAR -STARTCHAR 0034 -ENCODING 52 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 9 0 -1 -BITMAP -08 -18 -28 -28 -48 -88 -FC -08 -08 -ENDCHAR -STARTCHAR 0035 -ENCODING 53 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -F8 -80 -80 -F0 -08 -08 -08 -18 -F0 -ENDCHAR -STARTCHAR 0036 -ENCODING 54 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -78 -C0 -80 -F0 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR 0037 -ENCODING 55 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -F8 -08 -10 -10 -20 -20 -20 -40 -40 -ENDCHAR -STARTCHAR 0038 -ENCODING 56 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -70 -88 -88 -90 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR 0039 -ENCODING 57 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -70 -88 -88 -88 -78 -08 -08 -10 -E0 -ENDCHAR -STARTCHAR 003A -ENCODING 58 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 6 1 1 -BITMAP -80 -00 -00 -00 -00 -80 -ENDCHAR -STARTCHAR 003B -ENCODING 59 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 8 1 -1 -BITMAP -80 -00 -00 -00 -00 -00 -80 -80 -ENDCHAR -STARTCHAR 003C -ENCODING 60 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 11 1 -2 -BITMAP -10 -10 -20 -40 -80 -80 -80 -40 -20 -10 -10 -ENDCHAR -STARTCHAR 003D -ENCODING 61 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 4 1 2 -BITMAP -FC -00 -00 -FC -ENDCHAR -STARTCHAR 003E -ENCODING 62 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 11 1 -2 -BITMAP -80 -80 -40 -20 -10 -10 -10 -20 -40 -80 -80 -ENDCHAR -STARTCHAR 003F -ENCODING 63 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -E0 -10 -10 -10 -20 -20 -40 -00 -40 -ENDCHAR -STARTCHAR 0040 -ENCODING 64 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3C -42 -9D -A5 -C5 -C9 -BE -42 -3C -ENDCHAR -STARTCHAR 0041 -ENCODING 65 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 8 9 0 -1 -BITMAP -18 -18 -24 -24 -24 -3E -42 -42 -81 -ENDCHAR -STARTCHAR 0042 -ENCODING 66 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -F0 -90 -88 -90 -E0 -98 -88 -88 -F0 -ENDCHAR -STARTCHAR 0043 -ENCODING 67 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 9 1 -1 -BITMAP -3C -40 -80 -80 -80 -80 -80 -40 -3C -ENDCHAR -STARTCHAR 0044 -ENCODING 68 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -1 -BITMAP -F0 -88 -84 -84 -84 -84 -84 -88 -F0 -ENDCHAR -STARTCHAR 0045 -ENCODING 69 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 9 1 -1 -BITMAP -F0 -80 -80 -80 -F0 -80 -80 -80 -F8 -ENDCHAR -STARTCHAR 0046 -ENCODING 70 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -F0 -80 -80 -80 -F0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 0047 -ENCODING 71 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 9 1 -1 -BITMAP -3C -40 -80 -80 -9E -82 -82 -42 -3E -ENDCHAR -STARTCHAR 0048 -ENCODING 72 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -1 -BITMAP -84 -84 -84 -84 -FC -84 -84 -84 -84 -ENDCHAR -STARTCHAR 0049 -ENCODING 73 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 9 1 -1 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 004A -ENCODING 74 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 9 0 -1 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -C0 -ENDCHAR -STARTCHAR 004B -ENCODING 75 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 9 1 -1 -BITMAP -88 -90 -90 -A0 -E0 -90 -90 -88 -84 -ENDCHAR -STARTCHAR 004C -ENCODING 76 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 9 1 -1 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -F0 -ENDCHAR -STARTCHAR 004D -ENCODING 77 -SWIDTH 990 0 -DWIDTH 11 0 -BBX 9 9 1 -1 -BITMAP -C180 -C180 -C280 -A280 -A480 -9480 -9480 -9880 -8880 -ENDCHAR -STARTCHAR 004E -ENCODING 78 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -1 -BITMAP -84 -C4 -C4 -A4 -94 -94 -8C -8C -84 -ENDCHAR -STARTCHAR 004F -ENCODING 79 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 9 1 -1 -BITMAP -38 -44 -82 -82 -82 -82 -82 -C4 -78 -ENDCHAR -STARTCHAR 0050 -ENCODING 80 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 9 1 -1 -BITMAP -F0 -88 -88 -88 -F0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 0051 -ENCODING 81 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 10 1 -2 -BITMAP -38 -44 -82 -82 -82 -82 -82 -C4 -78 -04 -ENDCHAR -STARTCHAR 0052 -ENCODING 82 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -F0 -88 -88 -88 -F0 -90 -90 -88 -88 -ENDCHAR -STARTCHAR 0053 -ENCODING 83 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -70 -80 -80 -80 -60 -10 -10 -10 -E0 -ENDCHAR -STARTCHAR 0054 -ENCODING 84 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 6 9 0 -1 -BITMAP -FC -10 -10 -10 -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR 0055 -ENCODING 85 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -1 -BITMAP -84 -84 -84 -84 -84 -84 -84 -C4 -78 -ENDCHAR -STARTCHAR 0056 -ENCODING 86 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 7 9 0 -1 -BITMAP -82 -42 -44 -44 -24 -28 -28 -18 -10 -ENDCHAR -STARTCHAR 0057 -ENCODING 87 -SWIDTH 990 0 -DWIDTH 11 0 -BBX 11 9 0 -1 -BITMAP -8420 -4620 -4A20 -4A40 -4A40 -2940 -3180 -3180 -3080 -ENDCHAR -STARTCHAR 0058 -ENCODING 88 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 7 9 0 -1 -BITMAP -42 -44 -24 -18 -10 -28 -24 -44 -82 -ENDCHAR -STARTCHAR 0059 -ENCODING 89 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 9 1 -1 -BITMAP -84 -88 -48 -50 -30 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 005A -ENCODING 90 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 6 9 0 -1 -BITMAP -FC -08 -08 -10 -20 -20 -40 -40 -FC -ENDCHAR -STARTCHAR 005B -ENCODING 91 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 1 11 2 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 005C -ENCODING 92 -SWIDTH 990 0 -DWIDTH 11 0 -BBX 9 9 1 -1 -BITMAP -8900 -8900 -5900 -FF80 -5500 -5600 -6600 -2200 -2200 -ENDCHAR -STARTCHAR 005D -ENCODING 93 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 11 1 -2 -BITMAP -C0 -40 -40 -40 -40 -40 -40 -40 -40 -40 -C0 -ENDCHAR -STARTCHAR 005E -ENCODING 94 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 5 1 3 -BITMAP -20 -50 -50 -88 -88 -ENDCHAR -STARTCHAR 005F -ENCODING 95 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 6 1 0 -2 -BITMAP -FC -ENDCHAR -STARTCHAR 0060 -ENCODING 96 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 2 2 0 7 -BITMAP -80 -40 -ENDCHAR -STARTCHAR 0061 -ENCODING 97 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 7 1 -1 -BITMAP -F0 -10 -10 -F0 -90 -90 -F0 -ENDCHAR -STARTCHAR 0062 -ENCODING 98 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 10 1 -1 -BITMAP -80 -80 -80 -F0 -88 -88 -88 -88 -88 -F0 -ENDCHAR -STARTCHAR 0063 -ENCODING 99 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 7 1 -1 -BITMAP -70 -80 -80 -80 -80 -80 -70 -ENDCHAR -STARTCHAR 0064 -ENCODING 100 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 10 1 -1 -BITMAP -08 -08 -08 -78 -98 -88 -88 -88 -98 -78 -ENDCHAR -STARTCHAR 0065 -ENCODING 101 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 7 1 -1 -BITMAP -60 -90 -88 -F8 -80 -80 -70 -ENDCHAR -STARTCHAR 0066 -ENCODING 102 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 4 10 0 -1 -BITMAP -30 -40 -40 -F0 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR 0067 -ENCODING 103 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 8 1 -2 -BITMAP -78 -88 -88 -88 -88 -78 -10 -F0 -ENDCHAR -STARTCHAR 0068 -ENCODING 104 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 10 1 -1 -BITMAP -80 -80 -80 -F0 -88 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR 0069 -ENCODING 105 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 10 1 -1 -BITMAP -80 -00 -00 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 006A -ENCODING 106 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 2 11 0 -2 -BITMAP -40 -00 -00 -40 -40 -40 -40 -40 -40 -40 -C0 -ENDCHAR -STARTCHAR 006B -ENCODING 107 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 10 1 -1 -BITMAP -80 -80 -80 -90 -A0 -A0 -C0 -A0 -A0 -90 -ENDCHAR -STARTCHAR 006C -ENCODING 108 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 10 1 -1 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 006D -ENCODING 109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 -1 -BITMAP -F6 -99 -89 -89 -89 -89 -89 -ENDCHAR -STARTCHAR 006E -ENCODING 110 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 -1 -BITMAP -F0 -88 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR 006F -ENCODING 111 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 -1 -BITMAP -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR 0070 -ENCODING 112 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 8 1 -2 -BITMAP -F0 -88 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR 0071 -ENCODING 113 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 8 1 -2 -BITMAP -78 -88 -88 -88 -88 -78 -08 -08 -ENDCHAR -STARTCHAR 0072 -ENCODING 114 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 7 1 -1 -BITMAP -E0 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 0073 -ENCODING 115 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 7 1 -1 -BITMAP -E0 -80 -80 -40 -20 -20 -E0 -ENDCHAR -STARTCHAR 0074 -ENCODING 116 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 4 9 0 -1 -BITMAP -40 -40 -F0 -40 -40 -40 -40 -40 -30 -ENDCHAR -STARTCHAR 0075 -ENCODING 117 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 -1 -BITMAP -88 -88 -88 -88 -88 -98 -68 -ENDCHAR -STARTCHAR 0076 -ENCODING 118 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 7 0 -1 -BITMAP -88 -48 -48 -50 -50 -30 -20 -ENDCHAR -STARTCHAR 0077 -ENCODING 119 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 9 7 0 -1 -BITMAP -8880 -8C80 -5480 -5500 -5500 -2300 -2200 -ENDCHAR -STARTCHAR 0078 -ENCODING 120 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -48 -50 -30 -20 -30 -48 -88 -ENDCHAR -STARTCHAR 0079 -ENCODING 121 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 8 0 -2 -BITMAP -88 -48 -50 -50 -20 -20 -20 -C0 -ENDCHAR -STARTCHAR 007A -ENCODING 122 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 7 0 -1 -BITMAP -78 -08 -10 -20 -40 -40 -F8 -ENDCHAR -STARTCHAR 007B -ENCODING 123 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 2 11 1 -2 -BITMAP -40 -80 -80 -80 -80 -80 -80 -80 -80 -80 -40 -ENDCHAR -STARTCHAR 007C -ENCODING 124 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 11 1 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 007D -ENCODING 125 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 3 11 0 -2 -BITMAP -C0 -40 -40 -40 -40 -20 -40 -40 -40 -40 -C0 -ENDCHAR -STARTCHAR 007E -ENCODING 126 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 2 1 3 -BITMAP -E0 -98 -ENDCHAR -STARTCHAR 00A0 -ENCODING 160 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 00A1 -ENCODING 161 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 8 1 0 -BITMAP -80 -00 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 00A2 -ENCODING 162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -38 -4C -90 -90 -94 -64 -38 -40 -ENDCHAR -STARTCHAR 00A3 -ENCODING 163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -38 -44 -40 -FC -20 -E4 -B4 -CC -ENDCHAR -STARTCHAR 00A4 -ENCODING 164 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 9 8 0 -1 -BITMAP -9C80 -6300 -4100 -4100 -4100 -4100 -7F00 -0080 -ENDCHAR -STARTCHAR 00A5 -ENCODING 165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -84 -48 -FC -30 -FC -10 -10 -10 -ENDCHAR -STARTCHAR 00A7 -ENCODING 167 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 9 0 -1 -BITMAP -60 -80 -40 -E0 -A0 -60 -20 -20 -E0 -ENDCHAR -STARTCHAR 00A8 -ENCODING 168 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 1 1 7 -BITMAP -90 -ENDCHAR -STARTCHAR 00A9 -ENCODING 169 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 9 9 0 -1 -BITMAP -1E00 -6100 -5C80 -A280 -A080 -A280 -5C80 -6100 -1E00 -ENDCHAR -STARTCHAR 00AA -ENCODING 170 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 5 1 3 -BITMAP -60 -60 -A0 -50 -F0 -ENDCHAR -STARTCHAR 00AB -ENCODING 171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -0D -16 -68 -B0 -78 -16 -0D -ENDCHAR -STARTCHAR 00AC -ENCODING 172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 4 1 -2 -BITMAP -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR 00AD -ENCODING 173 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 1 1 3 -BITMAP -E0 -ENDCHAR -STARTCHAR 00AE -ENCODING 174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3E00 -5900 -A500 -A480 -B880 -A480 -A500 -4200 -3C00 -ENDCHAR -STARTCHAR 00B0 -ENCODING 176 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 3 1 5 -BITMAP -E0 -A0 -E0 -ENDCHAR -STARTCHAR 00B1 -ENCODING 177 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 6 7 0 0 -BITMAP -10 -10 -FC -10 -10 -00 -FC -ENDCHAR -STARTCHAR 00B2 -ENCODING 178 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 2 3 1 5 -BITMAP -40 -40 -C0 -ENDCHAR -STARTCHAR 00B3 -ENCODING 179 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 1 3 2 5 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR 00B4 -ENCODING 180 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 1 2 1 6 -BITMAP -80 -80 -ENDCHAR -STARTCHAR 00B6 -ENCODING 182 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -78 -E8 -E8 -E8 -28 -28 -28 -28 -28 -ENDCHAR -STARTCHAR 00B7 -ENCODING 183 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 1 1 3 -BITMAP -80 -ENDCHAR -STARTCHAR 00B8 -ENCODING 184 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 2 2 1 -2 -BITMAP -80 -40 -ENDCHAR -STARTCHAR 00B9 -ENCODING 185 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 1 3 2 5 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR 00BA -ENCODING 186 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 5 1 3 -BITMAP -60 -90 -90 -60 -F0 -ENDCHAR -STARTCHAR 00BB -ENCODING 187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -D0 -2C -1A -05 -1A -2C -D0 -ENDCHAR -STARTCHAR 00BC -ENCODING 188 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -40 -44 -08 -10 -24 -4C -9C -04 -ENDCHAR -STARTCHAR 00BD -ENCODING 189 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -40 -48 -10 -10 -2C -54 -88 -18 -ENDCHAR -STARTCHAR 00BE -ENCODING 190 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -1 -BITMAP -C0 -20 -64 -E8 -10 -24 -4C -9C -04 -ENDCHAR -STARTCHAR 00BF -ENCODING 191 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 3 9 1 -1 -BITMAP -20 -00 -20 -20 -40 -80 -80 -80 -60 -ENDCHAR -STARTCHAR 00C0 -ENCODING 192 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -20 -10 -10 -28 -28 -24 -7C -44 -82 -ENDCHAR -STARTCHAR 00C1 -ENCODING 193 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -08 -10 -10 -28 -28 -24 -7C -44 -82 -ENDCHAR -STARTCHAR 00C2 -ENCODING 194 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 7 9 0 0 -BITMAP -10 -28 -10 -28 -28 -24 -7C -44 -82 -ENDCHAR -STARTCHAR 00C6 -ENCODING 198 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 8 7 1 0 -BITMAP -7F -50 -50 -9E -F0 -90 -9F -ENDCHAR -STARTCHAR 00C7 -ENCODING 199 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -3C -40 -40 -80 -80 -40 -2C -10 -18 -ENDCHAR -STARTCHAR 00C8 -ENCODING 200 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 0 -BITMAP -40 -00 -F0 -80 -80 -F0 -80 -80 -F0 -ENDCHAR -STARTCHAR 00C9 -ENCODING 201 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 0 -BITMAP -20 -40 -F0 -80 -80 -F0 -80 -80 -E0 -ENDCHAR -STARTCHAR 00CA -ENCODING 202 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 0 -BITMAP -60 -00 -F0 -80 -80 -F0 -80 -80 -F0 -ENDCHAR -STARTCHAR 00CB -ENCODING 203 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 0 -BITMAP -A0 -00 -F0 -80 -F0 -80 -80 -80 -F0 -ENDCHAR -STARTCHAR 00CD -ENCODING 205 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 9 2 0 -BITMAP -C0 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 00CE -ENCODING 206 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 9 1 0 -BITMAP -C0 -20 -00 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR 00CF -ENCODING 207 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 1 7 2 2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 00D0 -ENCODING 208 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 7 1 0 -BITMAP -7C -42 -42 -E2 -42 -42 -7C -ENDCHAR -STARTCHAR 00D1 -ENCODING 209 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -28 -10 -84 -C4 -A4 -A4 -94 -8C -8C -ENDCHAR -STARTCHAR 00D3 -ENCODING 211 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 10 1 -1 -BITMAP -10 -20 -78 -84 -84 -84 -84 -84 -C8 -30 -ENDCHAR -STARTCHAR 00D4 -ENCODING 212 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 10 1 -1 -BITMAP -30 -50 -78 -84 -84 -84 -84 -84 -C8 -30 -ENDCHAR -STARTCHAR 00D7 -ENCODING 215 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 5 1 1 -BITMAP -88 -90 -60 -50 -88 -ENDCHAR -STARTCHAR 00D8 -ENCODING 216 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 10 1 -2 -BITMAP -3C -44 -8A -92 -92 -A2 -A2 -44 -78 -80 -ENDCHAR -STARTCHAR 00D9 -ENCODING 217 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 10 1 -1 -BITMAP -40 -20 -04 -84 -84 -84 -84 -88 -88 -70 -ENDCHAR -STARTCHAR 00DA -ENCODING 218 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 10 1 -1 -BITMAP -10 -20 -04 -84 -84 -84 -84 -88 -88 -70 -ENDCHAR -STARTCHAR 00DB -ENCODING 219 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 10 1 -1 -BITMAP -20 -50 -04 -84 -84 -84 -84 -88 -88 -70 -ENDCHAR -STARTCHAR 00DC -ENCODING 220 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 10 1 -1 -BITMAP -50 -00 -04 -84 -84 -84 -84 -88 -88 -70 -ENDCHAR -STARTCHAR 00DE -ENCODING 222 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -80 -E0 -90 -90 -90 -E0 -80 -ENDCHAR -STARTCHAR 00DF -ENCODING 223 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 9 1 -1 -BITMAP -70 -88 -88 -88 -B0 -88 -84 -88 -38 -ENDCHAR -STARTCHAR 00E0 -ENCODING 224 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -40 -20 -60 -10 -10 -F0 -90 -90 -60 -ENDCHAR -STARTCHAR 00E1 -ENCODING 225 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -20 -20 -60 -10 -10 -F0 -90 -90 -60 -ENDCHAR -STARTCHAR 00E2 -ENCODING 226 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -60 -60 -60 -10 -10 -F0 -90 -90 -60 -ENDCHAR -STARTCHAR 00E4 -ENCODING 228 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -10 -60 -10 -10 -F0 -90 -90 -60 -ENDCHAR -STARTCHAR 00E6 -ENCODING 230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 -1 -BITMAP -66 -19 -11 -FF -90 -98 -66 -ENDCHAR -STARTCHAR 00E7 -ENCODING 231 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -70 -80 -80 -80 -80 -C0 -20 -30 -ENDCHAR -STARTCHAR 00E8 -ENCODING 232 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -40 -20 -60 -90 -90 -F0 -80 -80 -70 -ENDCHAR -STARTCHAR 00E9 -ENCODING 233 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -20 -20 -60 -90 -90 -F0 -80 -80 -70 -ENDCHAR -STARTCHAR 00EA -ENCODING 234 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -60 -40 -60 -90 -90 -F0 -80 -80 -70 -ENDCHAR -STARTCHAR 00EB -ENCODING 235 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -10 -60 -90 -90 -F0 -80 -80 -70 -ENDCHAR -STARTCHAR 00ED -ENCODING 237 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 8 2 0 -BITMAP -40 -80 -00 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 00EE -ENCODING 238 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 8 1 0 -BITMAP -C0 -80 -00 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR 00EF -ENCODING 239 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 7 1 0 -BITMAP -A0 -00 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR 00F0 -ENCODING 240 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -10 -20 -30 -D8 -88 -88 -88 -90 -60 -ENDCHAR -STARTCHAR 00F1 -ENCODING 241 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -40 -30 -70 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR 00F3 -ENCODING 243 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -10 -20 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR 00F4 -ENCODING 244 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -20 -50 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR 00F6 -ENCODING 246 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 8 1 -1 -BITMAP -50 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR 00F7 -ENCODING 247 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 7 5 0 1 -BITMAP -10 -00 -FE -00 -10 -ENDCHAR -STARTCHAR 00F8 -ENCODING 248 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 -1 -BITMAP -30 -D0 -A8 -A8 -C8 -D8 -60 -ENDCHAR -STARTCHAR 00F9 -ENCODING 249 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -40 -40 -00 -90 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR 00FA -ENCODING 250 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -20 -40 -00 -90 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR 00FB -ENCODING 251 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -60 -60 -00 -90 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR 00FC -ENCODING 252 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -10 -00 -90 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR 00FE -ENCODING 254 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -2 -BITMAP -80 -E0 -90 -88 -88 -88 -90 -E0 -80 -ENDCHAR -STARTCHAR 0111 -ENCODING 273 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 8 1 -1 -BITMAP -1C -68 -98 -88 -88 -88 -98 -60 -ENDCHAR -STARTCHAR 0126 -ENCODING 294 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 7 1 0 -BITMAP -84 -FE -84 -FC -84 -84 -84 -ENDCHAR -STARTCHAR 0127 -ENCODING 295 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -F0 -58 -64 -44 -44 -44 -44 -ENDCHAR -STARTCHAR 0131 -ENCODING 305 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 5 1 0 -BITMAP -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 0132 -ENCODING 306 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 8 1 -1 -BITMAP -84 -84 -84 -84 -84 -C4 -C4 -38 -ENDCHAR -STARTCHAR 0133 -ENCODING 307 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 9 1 -2 -BITMAP -A0 -00 -A0 -A0 -A0 -A0 -A0 -20 -20 -ENDCHAR -STARTCHAR 0138 -ENCODING 312 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -90 -E0 -A0 -A0 -90 -ENDCHAR -STARTCHAR 013F -ENCODING 319 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -80 -80 -80 -B0 -80 -80 -F0 -ENDCHAR -STARTCHAR 0140 -ENCODING 320 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 7 1 0 -BITMAP -80 -80 -80 -A0 -80 -80 -80 -ENDCHAR -STARTCHAR 0141 -ENCODING 321 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -20 -30 -20 -40 -A0 -20 -3C -ENDCHAR -STARTCHAR 0142 -ENCODING 322 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 7 1 0 -BITMAP -40 -40 -60 -40 -C0 -40 -40 -ENDCHAR -STARTCHAR 0149 -ENCODING 329 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -80 -98 -A4 -44 -44 -44 -44 -ENDCHAR -STARTCHAR 014A -ENCODING 330 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -2 -BITMAP -84 -C4 -A4 -A4 -94 -8C -8C -24 -1C -ENDCHAR -STARTCHAR 014B -ENCODING 331 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 -2 -BITMAP -F0 -88 -88 -88 -88 -08 -30 -ENDCHAR -STARTCHAR 0152 -ENCODING 338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -7F -90 -90 -8F -90 -90 -7F -ENDCHAR -STARTCHAR 0153 -ENCODING 339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 7 0 -1 -BITMAP -3B80 -4640 -8440 -87C0 -8400 -4400 -3BC0 -ENDCHAR -STARTCHAR 0166 -ENCODING 358 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -20 -20 -70 -20 -20 -20 -ENDCHAR -STARTCHAR 0167 -ENCODING 359 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 8 1 -1 -BITMAP -40 -40 -40 -E0 -40 -40 -40 -20 -ENDCHAR -STARTCHAR 02BC -ENCODING 700 -SWIDTH 180 0 -DWIDTH 2 0 -BBX 2 2 0 5 -BITMAP -C0 -40 -ENDCHAR -STARTCHAR 02C7 -ENCODING 711 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 2 1 6 -BITMAP -B0 -40 -ENDCHAR -STARTCHAR 02D0 -ENCODING 720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 4 5 1 -BITMAP -80 -00 -00 -80 -ENDCHAR -STARTCHAR 02D8 -ENCODING 728 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 3 2 2 6 -BITMAP -20 -C0 -ENDCHAR -STARTCHAR 02D9 -ENCODING 729 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 2 1 6 -BITMAP -80 -80 -ENDCHAR -STARTCHAR 02DA -ENCODING 730 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 2 1 6 -BITMAP -C0 -C0 -ENDCHAR -STARTCHAR 02DB -ENCODING 731 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 2 1 -2 -BITMAP -80 -80 -ENDCHAR -STARTCHAR 02DC -ENCODING 732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 1 3 7 -BITMAP -F8 -ENDCHAR -STARTCHAR 02DD -ENCODING 733 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 2 1 6 -BITMAP -A0 -A0 -ENDCHAR -STARTCHAR 0391 -ENCODING 913 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -30 -30 -48 -48 -78 -84 -84 -ENDCHAR -STARTCHAR 0392 -ENCODING 914 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 7 1 0 -BITMAP -F8 -84 -88 -F8 -84 -84 -F8 -ENDCHAR -STARTCHAR 0393 -ENCODING 915 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 0394 -ENCODING 916 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -30 -30 -48 -48 -48 -84 -FC -ENDCHAR -STARTCHAR 0395 -ENCODING 917 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F0 -80 -80 -F8 -80 -80 -F0 -ENDCHAR -STARTCHAR 0396 -ENCODING 918 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -08 -10 -20 -40 -40 -F8 -ENDCHAR -STARTCHAR 0397 -ENCODING 919 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 7 1 0 -BITMAP -84 -84 -84 -FC -84 -84 -84 -ENDCHAR -STARTCHAR 0398 -ENCODING 920 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 7 9 1 -1 -BITMAP -30 -4C -84 -82 -FA -82 -84 -4C -30 -ENDCHAR -STARTCHAR 0399 -ENCODING 921 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 7 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 039A -ENCODING 922 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -90 -A0 -E0 -90 -90 -88 -ENDCHAR -STARTCHAR 039B -ENCODING 923 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -30 -30 -48 -48 -48 -84 -84 -ENDCHAR -STARTCHAR 039C -ENCODING 924 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 7 1 0 -BITMAP -82 -C6 -C6 -CA -AA -AA -92 -ENDCHAR -STARTCHAR 039D -ENCODING 925 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -84 -C4 -A4 -A4 -94 -8C -8C -ENDCHAR -STARTCHAR 039E -ENCODING 926 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -00 -00 -78 -00 -00 -F8 -ENDCHAR -STARTCHAR 039F -ENCODING 927 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 7 9 1 -1 -BITMAP -30 -4C -84 -82 -82 -82 -84 -4C -30 -ENDCHAR -STARTCHAR 03A0 -ENCODING 928 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -88 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR 03A1 -ENCODING 929 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -88 -88 -F8 -80 -80 -80 -ENDCHAR -STARTCHAR 03A3 -ENCODING 931 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -40 -40 -20 -40 -80 -F8 -ENDCHAR -STARTCHAR 03A4 -ENCODING 932 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 03A5 -ENCODING 933 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -84 -48 -50 -30 -20 -20 -20 -ENDCHAR -STARTCHAR 03A6 -ENCODING 934 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 7 7 1 0 -BITMAP -10 -7C -92 -92 -92 -6C -10 -ENDCHAR -STARTCHAR 03A7 -ENCODING 935 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -48 -30 -20 -50 -48 -88 -ENDCHAR -STARTCHAR 03A8 -ENCODING 936 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 7 1 0 -BITMAP -92 -94 -94 -94 -7C -10 -10 -ENDCHAR -STARTCHAR 03A9 -ENCODING 937 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -30 -C8 -84 -84 -84 -C8 -30 -FC -ENDCHAR -STARTCHAR 03B1 -ENCODING 945 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 6 0 -1 -BITMAP -78 -90 -90 -90 -90 -68 -ENDCHAR -STARTCHAR 03B2 -ENCODING 946 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 10 0 -2 -BITMAP -20 -D0 -88 -90 -B0 -88 -88 -88 -F0 -80 -ENDCHAR -STARTCHAR 03B3 -ENCODING 947 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 7 0 -2 -BITMAP -90 -50 -20 -60 -50 -50 -70 -ENDCHAR -STARTCHAR 03B4 -ENCODING 948 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 9 0 -1 -BITMAP -20 -50 -40 -20 -D0 -88 -88 -90 -60 -ENDCHAR -STARTCHAR 03B5 -ENCODING 949 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 6 0 -1 -BITMAP -70 -80 -60 -80 -98 -60 -ENDCHAR -STARTCHAR 03B6 -ENCODING 950 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 9 0 -2 -BITMAP -70 -20 -40 -40 -80 -80 -70 -08 -30 -ENDCHAR -STARTCHAR 03B7 -ENCODING 951 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 6 0 -1 -BITMAP -F0 -90 -90 -90 -90 -10 -ENDCHAR -STARTCHAR 03B8 -ENCODING 952 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 9 0 -1 -BITMAP -20 -50 -88 -88 -F8 -88 -88 -50 -20 -ENDCHAR -STARTCHAR 03B9 -ENCODING 953 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 6 1 -1 -BITMAP -80 -80 -80 -80 -A0 -40 -ENDCHAR -STARTCHAR 03BA -ENCODING 954 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 5 0 0 -BITMAP -90 -A0 -E0 -90 -90 -ENDCHAR -STARTCHAR 03BB -ENCODING 955 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 9 0 -1 -BITMAP -80 -40 -40 -40 -40 -60 -60 -A0 -18 -ENDCHAR -STARTCHAR 03BC -ENCODING 956 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 7 0 -2 -BITMAP -88 -88 -88 -88 -98 -E0 -80 -ENDCHAR -STARTCHAR 03BD -ENCODING 957 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 5 1 0 -BITMAP -90 -A0 -A0 -A0 -40 -ENDCHAR -STARTCHAR 03BE -ENCODING 958 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 9 0 -2 -BITMAP -60 -40 -20 -40 -80 -80 -60 -10 -30 -ENDCHAR -STARTCHAR 03BF -ENCODING 959 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 6 0 -1 -BITMAP -70 -88 -88 -88 -50 -20 -ENDCHAR -STARTCHAR 03C0 -ENCODING 960 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 6 0 -1 -BITMAP -70 -50 -50 -50 -58 -90 -ENDCHAR -STARTCHAR 03C1 -ENCODING 961 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 7 0 -2 -BITMAP -70 -88 -88 -88 -D0 -A0 -80 -ENDCHAR -STARTCHAR 03C3 -ENCODING 963 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 7 0 -1 -BITMAP -38 -50 -88 -88 -88 -50 -20 -ENDCHAR -STARTCHAR 03C4 -ENCODING 964 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 6 1 -1 -BITMAP -E0 -40 -40 -40 -60 -40 -ENDCHAR -STARTCHAR 03C5 -ENCODING 965 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 6 0 -1 -BITMAP -90 -88 -88 -88 -90 -60 -ENDCHAR -STARTCHAR 03C6 -ENCODING 966 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 9 0 -2 -BITMAP -20 -20 -70 -A8 -A8 -A8 -B0 -60 -20 -ENDCHAR -STARTCHAR 03C7 -ENCODING 967 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 7 0 -2 -BITMAP -50 -30 -20 -20 -60 -50 -98 -ENDCHAR -STARTCHAR 03C8 -ENCODING 968 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 7 0 -2 -BITMAP -A8 -A8 -A8 -A8 -A8 -70 -20 -ENDCHAR -STARTCHAR 03C9 -ENCODING 969 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 6 0 -1 -BITMAP -90 -A8 -A8 -A8 -A8 -50 -ENDCHAR -STARTCHAR 0401 -ENCODING 1025 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 0 -BITMAP -50 -78 -80 -80 -80 -F8 -80 -80 -F8 -ENDCHAR -STARTCHAR 0410 -ENCODING 1040 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -30 -30 -48 -48 -78 -84 -84 -ENDCHAR -STARTCHAR 0411 -ENCODING 1041 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -F8 -80 -80 -F8 -84 -84 -FC -ENDCHAR -STARTCHAR 0412 -ENCODING 1042 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -F8 -84 -88 -F8 -84 -84 -FC -ENDCHAR -STARTCHAR 0413 -ENCODING 1043 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 4 7 1 0 -BITMAP -F0 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 0414 -ENCODING 1044 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 8 1 -2 -BITMAP -3C -24 -24 -24 -44 -44 -44 -BA -ENDCHAR -STARTCHAR 0415 -ENCODING 1045 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F0 -80 -80 -F8 -80 -80 -F8 -ENDCHAR -STARTCHAR 0416 -ENCODING 1046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 0 -1 -BITMAP -C080 -2900 -2A00 -1A00 -1E00 -1A00 -1A00 -2900 -C080 -ENDCHAR -STARTCHAR 0417 -ENCODING 1047 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -60 -90 -88 -10 -30 -08 -88 -98 -60 -ENDCHAR -STARTCHAR 0418 -ENCODING 1048 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -84 -8C -94 -A4 -A4 -C4 -84 -ENDCHAR -STARTCHAR 0419 -ENCODING 1049 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 0 -BITMAP -48 -20 -84 -8C -94 -A4 -A4 -C4 -84 -ENDCHAR -STARTCHAR 041A -ENCODING 1050 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -90 -A0 -E0 -90 -90 -88 -ENDCHAR -STARTCHAR 041B -ENCODING 1051 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 8 1 -1 -BITMAP -7C -44 -44 -44 -44 -44 -44 -80 -ENDCHAR -STARTCHAR 041C -ENCODING 1052 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 7 1 0 -BITMAP -82 -C6 -C6 -AA -AA -AA -92 -ENDCHAR -STARTCHAR 041D -ENCODING 1053 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -88 -88 -F8 -88 -88 -88 -ENDCHAR -STARTCHAR 041E -ENCODING 1054 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 7 9 1 -1 -BITMAP -30 -4C -84 -82 -82 -82 -84 -4C -30 -ENDCHAR -STARTCHAR 041F -ENCODING 1055 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -88 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR 0420 -ENCODING 1056 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -88 -88 -F8 -80 -80 -80 -ENDCHAR -STARTCHAR 0421 -ENCODING 1057 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -1 -BITMAP -30 -4C -84 -80 -80 -80 -84 -4C -30 -ENDCHAR -STARTCHAR 0422 -ENCODING 1058 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 0423 -ENCODING 1059 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -90 -50 -60 -20 -20 -40 -ENDCHAR -STARTCHAR 0424 -ENCODING 1060 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -30 -5C -94 -94 -94 -5C -30 -ENDCHAR -STARTCHAR 0425 -ENCODING 1061 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -88 -48 -30 -20 -30 -48 -8C -ENDCHAR -STARTCHAR 0426 -ENCODING 1062 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 9 1 -2 -BITMAP -84 -84 -84 -84 -84 -84 -84 -7C -02 -ENDCHAR -STARTCHAR 0427 -ENCODING 1063 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -90 -90 -90 -90 -70 -10 -ENDCHAR -STARTCHAR 0428 -ENCODING 1064 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 7 1 0 -BITMAP -92 -92 -92 -92 -92 -92 -FE -ENDCHAR -STARTCHAR 0429 -ENCODING 1065 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 8 1 -2 -BITMAP -92 -92 -92 -92 -92 -92 -92 -6E -ENDCHAR -STARTCHAR 042A -ENCODING 1066 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 7 7 1 0 -BITMAP -C0 -40 -40 -7C -42 -42 -7C -ENDCHAR -STARTCHAR 042B -ENCODING 1067 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 7 1 0 -BITMAP -82 -82 -82 -F2 -8A -8A -FA -ENDCHAR -STARTCHAR 042C -ENCODING 1068 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -80 -80 -80 -F8 -84 -84 -F8 -ENDCHAR -STARTCHAR 042D -ENCODING 1069 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -1 -BITMAP -30 -C8 -84 -04 -3C -04 -84 -C8 -30 -ENDCHAR -STARTCHAR 042E -ENCODING 1070 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 8 9 1 -1 -BITMAP -0C -92 -A2 -A1 -E1 -A1 -A2 -92 -0C -ENDCHAR -STARTCHAR 042F -ENCODING 1071 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 7 1 0 -BITMAP -FC -84 -84 -7C -84 -84 -84 -ENDCHAR -STARTCHAR 0430 -ENCODING 1072 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 6 1 -1 -BITMAP -F0 -88 -78 -88 -98 -60 -ENDCHAR -STARTCHAR 0431 -ENCODING 1073 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -30 -60 -90 -88 -88 -88 -98 -60 -ENDCHAR -STARTCHAR 0432 -ENCODING 1074 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 5 1 0 -BITMAP -F8 -88 -F0 -88 -F8 -ENDCHAR -STARTCHAR 0433 -ENCODING 1075 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -F0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 0434 -ENCODING 1076 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 8 7 0 -2 -BITMAP -3E -22 -22 -22 -42 -FE -81 -ENDCHAR -STARTCHAR 0435 -ENCODING 1077 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 6 1 -1 -BITMAP -F0 -88 -F8 -80 -90 -60 -ENDCHAR -STARTCHAR 0436 -ENCODING 1078 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 6 1 -1 -BITMAP -D4 -58 -38 -58 -54 -82 -ENDCHAR -STARTCHAR 0437 -ENCODING 1079 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 6 1 -1 -BITMAP -F0 -88 -30 -08 -88 -70 -ENDCHAR -STARTCHAR 0438 -ENCODING 1080 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 5 1 0 -BITMAP -88 -98 -A8 -C8 -88 -ENDCHAR -STARTCHAR 0439 -ENCODING 1081 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -F0 -00 -88 -98 -A8 -C8 -88 -ENDCHAR -STARTCHAR 043A -ENCODING 1082 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -B0 -C0 -A0 -A0 -90 -ENDCHAR -STARTCHAR 043B -ENCODING 1083 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 5 1 -1 -BITMAP -7C -44 -44 -44 -84 -ENDCHAR -STARTCHAR 043C -ENCODING 1084 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 5 1 0 -BITMAP -86 -C6 -CA -AA -B2 -ENDCHAR -STARTCHAR 043D -ENCODING 1085 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 5 1 0 -BITMAP -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR 043E -ENCODING 1086 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 6 1 -1 -BITMAP -F0 -88 -88 -88 -90 -60 -ENDCHAR -STARTCHAR 043F -ENCODING 1087 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 5 1 0 -BITMAP -F8 -88 -88 -88 -88 -ENDCHAR -STARTCHAR 0440 -ENCODING 1088 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 -2 -BITMAP -F0 -88 -88 -88 -90 -E0 -80 -ENDCHAR -STARTCHAR 0441 -ENCODING 1089 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 6 1 -1 -BITMAP -F0 -80 -80 -80 -90 -60 -ENDCHAR -STARTCHAR 0442 -ENCODING 1090 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 4 5 1 0 -BITMAP -F0 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 0443 -ENCODING 1091 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 7 1 -2 -BITMAP -90 -90 -50 -60 -20 -20 -40 -ENDCHAR -STARTCHAR 0444 -ENCODING 1092 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 9 1 -2 -BITMAP -10 -38 -D4 -92 -92 -92 -94 -78 -10 -ENDCHAR -STARTCHAR 0445 -ENCODING 1093 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 4 5 1 0 -BITMAP -90 -60 -20 -50 -90 -ENDCHAR -STARTCHAR 0446 -ENCODING 1094 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 7 1 -2 -BITMAP -88 -88 -88 -88 -88 -78 -04 -ENDCHAR -STARTCHAR 0447 -ENCODING 1095 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -90 -90 -90 -F0 -10 -ENDCHAR -STARTCHAR 0448 -ENCODING 1096 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 5 1 0 -BITMAP -94 -94 -94 -94 -FC -ENDCHAR -STARTCHAR 0449 -ENCODING 1097 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 6 1 -2 -BITMAP -A4 -A4 -A4 -A4 -A4 -5A -ENDCHAR -STARTCHAR 044A -ENCODING 1098 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 5 1 0 -BITMAP -C0 -40 -78 -44 -7C -ENDCHAR -STARTCHAR 044B -ENCODING 1099 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 5 1 0 -BITMAP -84 -84 -F4 -94 -F4 -ENDCHAR -STARTCHAR 044C -ENCODING 1100 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -80 -80 -F0 -90 -F0 -ENDCHAR -STARTCHAR 044D -ENCODING 1101 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 6 1 -1 -BITMAP -F0 -08 -78 -08 -90 -60 -ENDCHAR -STARTCHAR 044E -ENCODING 1102 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 6 1 -1 -BITMAP -BC -A2 -E2 -A2 -A2 -1C -ENDCHAR -STARTCHAR 044F -ENCODING 1103 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 5 1 0 -BITMAP -F8 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR 0451 -ENCODING 1105 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 5 8 1 -1 -BITMAP -40 -20 -D0 -88 -F8 -80 -90 -60 -ENDCHAR -STARTCHAR 1100 -ENCODING 4352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -F8 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 1101 -ENCODING 4353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -24 -24 -24 -24 -ENDCHAR -STARTCHAR 1102 -ENCODING 4354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 4 3 2 -BITMAP -80 -80 -80 -F8 -ENDCHAR -STARTCHAR 1103 -ENCODING 4355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -7C -80 -80 -80 -7C -ENDCHAR -STARTCHAR 1104 -ENCODING 4356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -FC -90 -90 -90 -FE -ENDCHAR -STARTCHAR 1105 -ENCODING 4357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -04 -7C -80 -FC -ENDCHAR -STARTCHAR 1106 -ENCODING 4358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -F0 -88 -88 -88 -F8 -ENDCHAR -STARTCHAR 1107 -ENCODING 4359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -08 -88 -F8 -88 -F8 -ENDCHAR -STARTCHAR 1108 -ENCODING 4360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -B0 -B4 -FC -B4 -EC -ENDCHAR -STARTCHAR 1109 -ENCODING 4361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -10 -10 -30 -28 -C4 -ENDCHAR -STARTCHAR 110A -ENCODING 4362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -08 -48 -68 -96 -20 -ENDCHAR -STARTCHAR 110B -ENCODING 4363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -78 -44 -84 -84 -78 -ENDCHAR -STARTCHAR 110C -ENCODING 4364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -FC -08 -10 -38 -C6 -ENDCHAR -STARTCHAR 110D -ENCODING 4365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -7E -12 -24 -5E -89 -ENDCHAR -STARTCHAR 110E -ENCODING 4366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -30 -FC -08 -30 -CC -ENDCHAR -STARTCHAR 110F -ENCODING 4367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -F8 -08 -F8 -08 -08 -ENDCHAR -STARTCHAR 1110 -ENCODING 4368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -7C -80 -FC -80 -FC -ENDCHAR -STARTCHAR 1111 -ENCODING 4369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -48 -48 -48 -FC -ENDCHAR -STARTCHAR 1112 -ENCODING 4370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -38 -FC -78 -44 -48 -30 -ENDCHAR -STARTCHAR 115F -ENCODING 4447 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 1160 -ENCODING 4448 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 1161 -ENCODING 4449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 4 -2 -BITMAP -80 -80 -80 -80 -80 -C0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 1162 -ENCODING 4450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -10 -90 -90 -90 -90 -F0 -90 -90 -90 -90 -10 -ENDCHAR -STARTCHAR 1163 -ENCODING 4451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 4 -2 -BITMAP -80 -80 -80 -C0 -80 -80 -C0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 1164 -ENCODING 4452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -10 -90 -90 -F0 -90 -90 -F0 -90 -90 -90 -10 -ENDCHAR -STARTCHAR 1165 -ENCODING 4453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 11 4 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 1166 -ENCODING 4454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -30 -30 -30 -B0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR 1167 -ENCODING 4455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 11 4 -2 -BITMAP -20 -20 -20 -E0 -20 -20 -E0 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 1168 -ENCODING 4456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -30 -30 -F0 -30 -30 -D0 -30 -30 -30 -ENDCHAR -STARTCHAR 1169 -ENCODING 4457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 4 1 1 -BITMAP -08 -08 -08 -FF -ENDCHAR -STARTCHAR 116A -ENCODING 4458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 2 -2 -BITMAP -04 -04 -04 -04 -44 -47 -44 -7C -84 -04 -04 -ENDCHAR -STARTCHAR 116B -ENCODING 4459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0080 -0280 -0280 -0280 -2280 -2380 -2280 -FA80 -0280 -0280 -0080 -ENDCHAR -STARTCHAR 116C -ENCODING 4460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -2 -BITMAP -02 -02 -02 -02 -22 -22 -22 -3E -C2 -02 -ENDCHAR -STARTCHAR 116D -ENCODING 4461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 4 1 1 -BITMAP -24 -24 -24 -FF -ENDCHAR -STARTCHAR 116E -ENCODING 4462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 5 0 0 -BITMAP -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 116F -ENCODING 4463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -01 -01 -01 -FF -11 -17 -11 -11 -ENDCHAR -STARTCHAR 1170 -ENCODING 4464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0080 -0280 -0280 -0280 -0280 -FA80 -2280 -2E80 -2280 -2280 -0080 -ENDCHAR -STARTCHAR 1171 -ENCODING 4465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -01 -01 -01 -FF -11 -11 -11 -11 -ENDCHAR -STARTCHAR 1172 -ENCODING 4466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 5 0 0 -BITMAP -FFC0 -1200 -1200 -1200 -1200 -ENDCHAR -STARTCHAR 1173 -ENCODING 4467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 1 1 2 -BITMAP -FF -ENDCHAR -STARTCHAR 1174 -ENCODING 4468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -01 -01 -01 -01 -01 -FD -01 -01 -ENDCHAR -STARTCHAR 1175 -ENCODING 4469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 11 5 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 11A8 -ENCODING 4520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -F8 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 11A9 -ENCODING 4521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -24 -24 -24 -24 -ENDCHAR -STARTCHAR 11AA -ENCODING 4522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -E4 -14 -14 -16 -19 -ENDCHAR -STARTCHAR 11AB -ENCODING 4523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 4 3 2 -BITMAP -80 -80 -80 -F8 -ENDCHAR -STARTCHAR 11AC -ENCODING 4524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -8E -82 -82 -86 -E9 -ENDCHAR -STARTCHAR 11AD -ENCODING 4525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -1C -BE -9C -92 -FC -ENDCHAR -STARTCHAR 11AE -ENCODING 4526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -7C -80 -80 -80 -7C -ENDCHAR -STARTCHAR 11AF -ENCODING 4527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -04 -7C -80 -FC -ENDCHAR -STARTCHAR 11B0 -ENCODING 4528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -24 -E4 -84 -E4 -ENDCHAR -STARTCHAR 11B1 -ENCODING 4529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -EC -34 -F4 -94 -EC -ENDCHAR -STARTCHAR 11B2 -ENCODING 4530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -F0 -34 -FC -94 -FC -ENDCHAR -STARTCHAR 11B3 -ENCODING 4531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -E4 -14 -64 -86 -E9 -ENDCHAR -STARTCHAR 11B4 -ENCODING 4532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -EC -30 -FC -90 -FC -ENDCHAR -STARTCHAR 11B5 -ENCODING 4533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -FE -2C -EC -8C -FE -ENDCHAR -STARTCHAR 11B6 -ENCODING 4534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -EC -3E -EC -12 -FC -ENDCHAR -STARTCHAR 11B7 -ENCODING 4535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -F0 -88 -88 -88 -F8 -ENDCHAR -STARTCHAR 11B8 -ENCODING 4536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -08 -88 -F8 -88 -F8 -ENDCHAR -STARTCHAR 11B9 -ENCODING 4537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -08 -28 -C8 -34 -D2 -ENDCHAR -STARTCHAR 11BA -ENCODING 4538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -10 -10 -30 -28 -C4 -ENDCHAR -STARTCHAR 11BB -ENCODING 4539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -08 -48 -68 -96 -20 -ENDCHAR -STARTCHAR 11BC -ENCODING 4540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -78 -44 -84 -84 -78 -ENDCHAR -STARTCHAR 11BD -ENCODING 4541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -FC -08 -10 -38 -C6 -ENDCHAR -STARTCHAR 11BE -ENCODING 4542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -30 -FC -08 -30 -CC -ENDCHAR -STARTCHAR 11BF -ENCODING 4543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -F8 -08 -F8 -08 -08 -ENDCHAR -STARTCHAR 11C0 -ENCODING 4544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -7C -80 -FC -80 -FC -ENDCHAR -STARTCHAR 11C1 -ENCODING 4545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -48 -48 -48 -FC -ENDCHAR -STARTCHAR 11C2 -ENCODING 4546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -38 -FC -78 -44 -48 -30 -ENDCHAR -STARTCHAR 2010 -ENCODING 8208 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 5 1 0 3 -BITMAP -F8 -ENDCHAR -STARTCHAR 2013 -ENCODING 8211 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 1 1 3 -BITMAP -E0 -ENDCHAR -STARTCHAR 2014 -ENCODING 8212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 1 0 3 -BITMAP -FF80 -ENDCHAR -STARTCHAR 2015 -ENCODING 8213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 1 0 3 -BITMAP -FF80 -ENDCHAR -STARTCHAR 2016 -ENCODING 8214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 4 -2 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR 2018 -ENCODING 8216 -SWIDTH 180 0 -DWIDTH 2 0 -BBX 2 3 0 5 -BITMAP -40 -80 -40 -ENDCHAR -STARTCHAR 2019 -ENCODING 8217 -SWIDTH 180 0 -DWIDTH 2 0 -BBX 2 3 0 5 -BITMAP -80 -40 -80 -ENDCHAR -STARTCHAR 201B -ENCODING 8219 -SWIDTH 180 0 -DWIDTH 2 0 -BBX 2 3 0 5 -BITMAP -C0 -80 -40 -ENDCHAR -STARTCHAR 201C -ENCODING 8220 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 3 1 5 -BITMAP -A0 -C0 -E0 -ENDCHAR -STARTCHAR 201D -ENCODING 8221 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 3 0 5 -BITMAP -E0 -60 -A0 -ENDCHAR -STARTCHAR 201F -ENCODING 8223 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 3 0 5 -BITMAP -E0 -A0 -40 -ENDCHAR -STARTCHAR 2020 -ENCODING 8224 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 5 1 1 -BITMAP -20 -F0 -20 -20 -20 -ENDCHAR -STARTCHAR 2021 -ENCODING 8225 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 5 1 1 -BITMAP -F0 -20 -F0 -20 -20 -ENDCHAR -STARTCHAR 2022 -ENCODING 8226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 3 4 2 -BITMAP -40 -C0 -C0 -ENDCHAR -STARTCHAR 2025 -ENCODING 8229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 1 2 3 -BITMAP -84 -ENDCHAR -STARTCHAR 2026 -ENCODING 8230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 1 1 3 -BITMAP -89 -ENDCHAR -STARTCHAR 2030 -ENCODING 8240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -C800 -D000 -D000 -FB00 -3680 -5680 -5B00 -8000 -ENDCHAR -STARTCHAR 2032 -ENCODING 8242 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 1 2 2 5 -BITMAP -80 -80 -ENDCHAR -STARTCHAR 2033 -ENCODING 8243 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 2 1 5 -BITMAP -60 -A0 -ENDCHAR -STARTCHAR 2034 -ENCODING 8244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 3 3 5 -BITMAP -B0 -D0 -40 -ENDCHAR -STARTCHAR 2035 -ENCODING 8245 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 2 2 0 6 -BITMAP -80 -40 -ENDCHAR -STARTCHAR 2036 -ENCODING 8246 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 2 4 0 4 -BITMAP -80 -40 -80 -40 -ENDCHAR -STARTCHAR 2039 -ENCODING 8249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -06 -18 -20 -C0 -60 -10 -0C -02 -ENDCHAR -STARTCHAR 203A -ENCODING 8250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -C0 -20 -18 -06 -01 -02 -0C -30 -40 -ENDCHAR -STARTCHAR 203B -ENCODING 8251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -B4 -48 -28 -96 -30 -48 -B4 -ENDCHAR -STARTCHAR 203C -ENCODING 8252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -90 -90 -90 -90 -90 -90 -10 -00 -90 -ENDCHAR -STARTCHAR 203E -ENCODING 8254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 0 0 0 8 -BITMAP -ENDCHAR -STARTCHAR 2042 -ENCODING 8258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -04 -1C -00 -00 -02 -A7 -27 -02 -ENDCHAR -STARTCHAR 2074 -ENCODING 8308 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 3 1 5 -BITMAP -40 -C0 -40 -ENDCHAR -STARTCHAR 207A -ENCODING 8314 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 1 4 2 4 -BITMAP -80 -80 -80 -80 -ENDCHAR -STARTCHAR 207B -ENCODING 8315 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 1 1 2 5 -BITMAP -80 -ENDCHAR -STARTCHAR 207C -ENCODING 8316 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 1 1 2 5 -BITMAP -80 -ENDCHAR -STARTCHAR 207D -ENCODING 8317 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 4 1 3 -BITMAP -80 -80 -80 -80 -ENDCHAR -STARTCHAR 207E -ENCODING 8318 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 3 1 4 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR 207F -ENCODING 8319 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 2 3 1 5 -BITMAP -C0 -C0 -80 -ENDCHAR -STARTCHAR 2081 -ENCODING 8321 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 1 2 2 -1 -BITMAP -80 -80 -ENDCHAR -STARTCHAR 2082 -ENCODING 8322 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 1 1 -1 -BITMAP -C0 -ENDCHAR -STARTCHAR 2083 -ENCODING 8323 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 2 2 1 -1 -BITMAP -40 -C0 -ENDCHAR -STARTCHAR 2084 -ENCODING 8324 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 2 1 -1 -BITMAP -40 -C0 -ENDCHAR -STARTCHAR 20A9 -ENCODING 8361 -SWIDTH 990 0 -DWIDTH 11 0 -BBX 9 9 1 -1 -BITMAP -8900 -8900 -5900 -FF80 -5500 -5600 -6600 -2200 -2200 -ENDCHAR -STARTCHAR 20AC -ENCODING 8364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -3C -40 -40 -70 -F0 -40 -20 -18 -ENDCHAR -STARTCHAR 2103 -ENCODING 8451 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 7 9 1 -1 -BITMAP -C0 -DC -22 -40 -40 -42 -42 -24 -1C -ENDCHAR -STARTCHAR 2109 -ENCODING 8457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 0 -BITMAP -80 -BE -20 -20 -3C -20 -20 -20 -ENDCHAR -STARTCHAR 2113 -ENCODING 8467 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 8 1 0 -BITMAP -30 -50 -50 -50 -60 -40 -D0 -20 -ENDCHAR -STARTCHAR 2116 -ENCODING 8470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -9000 -9400 -DA00 -D900 -B900 -B900 -9980 -0600 -ENDCHAR -STARTCHAR 2121 -ENCODING 8481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -F080 -2480 -2A80 -3280 -3E80 -3080 -3280 -0C00 -ENDCHAR -STARTCHAR 2122 -ENCODING 8482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 4 1 4 -BITMAP -F880 -4980 -4E80 -4080 -ENDCHAR -STARTCHAR 2126 -ENCODING 8486 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -70 -88 -84 -84 -84 -C8 -30 -FC -ENDCHAR -STARTCHAR 212B -ENCODING 8491 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 9 1 -1 -BITMAP -70 -70 -00 -20 -50 -50 -78 -88 -88 -ENDCHAR -STARTCHAR 2153 -ENCODING 8531 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -40 -48 -10 -10 -2C -44 -84 -1C -ENDCHAR -STARTCHAR 2154 -ENCODING 8532 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 7 9 1 -1 -BITMAP -C0 -20 -44 -C8 -10 -2C -42 -86 -0E -ENDCHAR -STARTCHAR 215B -ENCODING 8539 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -40 -44 -08 -10 -2C -54 -9C -1C -ENDCHAR -STARTCHAR 215C -ENCODING 8540 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 7 9 1 -1 -BITMAP -C0 -20 -24 -A8 -50 -2C -4A -8E -0E -ENDCHAR -STARTCHAR 215D -ENCODING 8541 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 7 9 1 -1 -BITMAP -C0 -C0 -24 -E8 -10 -2C -4A -8E -0E -ENDCHAR -STARTCHAR 215E -ENCODING 8542 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 9 1 -1 -BITMAP -E0 -44 -48 -88 -10 -2C -54 -9C -1C -ENDCHAR -STARTCHAR 2160 -ENCODING 8544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 7 5 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2161 -ENCODING 8545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 7 3 0 -BITMAP -90 -90 -90 -90 -90 -90 -90 -ENDCHAR -STARTCHAR 2162 -ENCODING 8546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -94 -94 -94 -94 -94 -94 -94 -ENDCHAR -STARTCHAR 2163 -ENCODING 8547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -C2 -A4 -A4 -A4 -98 -98 -98 -ENDCHAR -STARTCHAR 2164 -ENCODING 8548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -84 -44 -48 -48 -28 -30 -30 -ENDCHAR -STARTCHAR 2165 -ENCODING 8549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -8A -8A -92 -52 -52 -62 -22 -ENDCHAR -STARTCHAR 2166 -ENCODING 8550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -8B -4B -53 -53 -53 -53 -23 -ENDCHAR -STARTCHAR 2167 -ENCODING 8551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -9B -9B -AB -6B -6B -6B -6B -ENDCHAR -STARTCHAR 2168 -ENCODING 8552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -92 -92 -8C -84 -8C -92 -91 -ENDCHAR -STARTCHAR 2169 -ENCODING 8553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -44 -48 -30 -10 -30 -48 -C4 -ENDCHAR -STARTCHAR 2170 -ENCODING 8560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 7 5 0 -BITMAP -80 -00 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2171 -ENCODING 8561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 7 3 0 -BITMAP -90 -00 -90 -90 -90 -90 -90 -ENDCHAR -STARTCHAR 2172 -ENCODING 8562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -94 -00 -94 -94 -94 -94 -94 -ENDCHAR -STARTCHAR 2173 -ENCODING 8563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -80 -00 -A4 -A4 -A8 -98 -98 -ENDCHAR -STARTCHAR 2174 -ENCODING 8564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 5 3 0 -BITMAP -90 -90 -50 -60 -60 -ENDCHAR -STARTCHAR 2175 -ENCODING 8565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -04 -00 -94 -54 -54 -54 -24 -ENDCHAR -STARTCHAR 2176 -ENCODING 8566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -0A -00 -9A -AA -AA -AA -4A -ENDCHAR -STARTCHAR 2177 -ENCODING 8567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -02 -00 -97 -97 -67 -67 -67 -ENDCHAR -STARTCHAR 2178 -ENCODING 8568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -80 -00 -A4 -98 -88 -98 -A4 -ENDCHAR -STARTCHAR 2179 -ENCODING 8569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 5 3 0 -BITMAP -90 -60 -20 -60 -90 -ENDCHAR -STARTCHAR 2190 -ENCODING 8592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 3 1 2 -BITMAP -80 -FF -80 -ENDCHAR -STARTCHAR 2191 -ENCODING 8593 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 11 1 -2 -BITMAP -40 -40 -E0 -40 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR 2192 -ENCODING 8594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 4 1 1 -BITMAP -0100 -0080 -FF80 -0100 -ENDCHAR -STARTCHAR 2193 -ENCODING 8595 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 11 1 -2 -BITMAP -40 -40 -40 -40 -40 -40 -40 -40 -E0 -40 -40 -ENDCHAR -STARTCHAR 2194 -ENCODING 8596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 4 1 1 -BITMAP -0100 -8080 -FF80 -8100 -ENDCHAR -STARTCHAR 2195 -ENCODING 8597 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 11 1 -2 -BITMAP -40 -E0 -40 -40 -40 -40 -40 -40 -40 -C0 -40 -ENDCHAR -STARTCHAR 2196 -ENCODING 8598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -8000 -C000 -A000 -1000 -0800 -0800 -0400 -0200 -0100 -0080 -0040 -ENDCHAR -STARTCHAR 2197 -ENCODING 8599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -0180 -0080 -0100 -0200 -0400 -0800 -1000 -2000 -4000 -8000 -ENDCHAR -STARTCHAR 2198 -ENCODING 8600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -8000 -4000 -2000 -1000 -0800 -0400 -0400 -0200 -0100 -00C0 -00C0 -ENDCHAR -STARTCHAR 2199 -ENCODING 8601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -0080 -0100 -0200 -0400 -0800 -1000 -2000 -C000 -C000 -ENDCHAR -STARTCHAR 21B0 -ENCODING 8624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -8000 -FF80 -0080 -0080 -0080 -0080 -0080 -0080 -0080 -0080 -ENDCHAR -STARTCHAR 21B1 -ENCODING 8625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -2 -BITMAP -0100 -FF80 -8100 -8000 -8000 -8000 -8000 -8000 -8000 -ENDCHAR -STARTCHAR 21B2 -ENCODING 8626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0080 -0080 -0080 -0080 -0080 -0080 -0080 -0080 -FF80 -8000 -ENDCHAR -STARTCHAR 21B3 -ENCODING 8627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -FF -01 -ENDCHAR -STARTCHAR 21B4 -ENCODING 8628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -FE -01 -01 -01 -01 -01 -01 -01 -01 -03 -ENDCHAR -STARTCHAR 21BC -ENCODING 8636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 2 1 3 -BITMAP -40 -FF -ENDCHAR -STARTCHAR 21C0 -ENCODING 8640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 2 1 3 -BITMAP -0200 -FF80 -ENDCHAR -STARTCHAR 21C4 -ENCODING 8644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 7 0 0 -BITMAP -0080 -7FC0 -0040 -0000 -4000 -FFC0 -4000 -ENDCHAR -STARTCHAR 21C5 -ENCODING 8645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 11 2 -2 -BITMAP -40 -E8 -48 -48 -48 -48 -48 -48 -48 -58 -4C -ENDCHAR -STARTCHAR 21CD -ENCODING 8653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 0 0 -BITMAP -2000 -7F80 -8400 -7F80 -0400 -ENDCHAR -STARTCHAR 21CF -ENCODING 8655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 1 0 -BITMAP -0A00 -EF00 -1080 -FE80 -1100 -ENDCHAR -STARTCHAR 21D0 -ENCODING 8656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 4 0 1 -BITMAP -2000 -7F80 -8000 -7F80 -ENDCHAR -STARTCHAR 21D1 -ENCODING 8657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -5600 -9500 -1480 -1400 -1400 -1400 -1400 -1400 -ENDCHAR -STARTCHAR 21D2 -ENCODING 8658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 1 1 -BITMAP -0200 -FF00 -0080 -FE80 -0100 -ENDCHAR -STARTCHAR 21D3 -ENCODING 8659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -14 -14 -14 -14 -14 -14 -95 -55 -26 -24 -ENDCHAR -STARTCHAR 21D4 -ENCODING 8660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 5 0 1 -BITMAP -2100 -7F80 -8040 -7F40 -0080 -ENDCHAR -STARTCHAR 21E0 -ENCODING 8672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 4 1 1 -BITMAP -4000 -D580 -C000 -4000 -ENDCHAR -STARTCHAR 21E1 -ENCODING 8673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 9 4 -1 -BITMAP -40 -E0 -00 -40 -00 -00 -40 -00 -C0 -ENDCHAR -STARTCHAR 21E2 -ENCODING 8674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 3 1 1 -BITMAP -0100 -AD80 -0100 -ENDCHAR -STARTCHAR 21E3 -ENCODING 8675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 9 4 -2 -BITMAP -40 -40 -00 -C0 -00 -40 -00 -20 -C0 -ENDCHAR -STARTCHAR 21E6 -ENCODING 8678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 -1 -BITMAP -2000 -5000 -8F80 -8080 -8080 -5F00 -2000 -ENDCHAR -STARTCHAR 21E7 -ENCODING 8679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -2 -BITMAP -30 -48 -84 -4A -48 -48 -48 -48 -48 -78 -ENDCHAR -STARTCHAR 21E8 -ENCODING 8680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 -1 -BITMAP -0400 -0600 -F900 -8080 -8100 -7E00 -0400 -ENDCHAR -STARTCHAR 21E9 -ENCODING 8681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -2 -BITMAP -78 -48 -48 -48 -48 -48 -86 -44 -28 -10 -ENDCHAR -STARTCHAR 2200 -ENCODING 8704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -84 -84 -78 -48 -28 -30 -30 -ENDCHAR -STARTCHAR 2202 -ENCODING 8706 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 5 1 1 -BITMAP -60 -10 -F0 -A0 -E0 -ENDCHAR -STARTCHAR 2203 -ENCODING 8707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 0 -BITMAP -F8 -08 -08 -F8 -08 -08 -F8 -ENDCHAR -STARTCHAR 2206 -ENCODING 8710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -10 -30 -30 -48 -48 -84 -84 -FE -ENDCHAR -STARTCHAR 2207 -ENCODING 8711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -FF -41 -42 -22 -24 -18 -08 -ENDCHAR -STARTCHAR 2208 -ENCODING 8712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 1 0 -BITMAP -7E -80 -FE -80 -40 -3E -ENDCHAR -STARTCHAR 2209 -ENCODING 8713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -08 -7C -90 -FC -90 -D0 -28 -ENDCHAR -STARTCHAR 220B -ENCODING 8715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 0 -BITMAP -FC -02 -FE -02 -02 -FC -ENDCHAR -STARTCHAR 220C -ENCODING 8716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -10 -F8 -14 -FC -24 -2C -50 -ENDCHAR -STARTCHAR 220F -ENCODING 8719 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -FC -48 -48 -48 -48 -48 -48 -ENDCHAR -STARTCHAR 2211 -ENCODING 8721 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F8 -40 -20 -10 -20 -40 -F8 -ENDCHAR -STARTCHAR 2213 -ENCODING 8723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 0 -BITMAP -FE -00 -10 -10 -7C -10 -ENDCHAR -STARTCHAR 221A -ENCODING 8730 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 8 7 0 -1 -BITMAP -0F -10 -10 -10 -20 -A0 -60 -ENDCHAR -STARTCHAR 221D -ENCODING 8733 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 7 4 0 1 -BITMAP -76 -88 -88 -76 -ENDCHAR -STARTCHAR 221E -ENCODING 8734 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 9 4 0 1 -BITMAP -7700 -8880 -8880 -7700 -ENDCHAR -STARTCHAR 221F -ENCODING 8735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -80 -80 -80 -80 -80 -FC -ENDCHAR -STARTCHAR 2220 -ENCODING 8736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 2 0 -BITMAP -08 -08 -10 -20 -40 -F8 -ENDCHAR -STARTCHAR 2222 -ENCODING 8738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 1 -BITMAP -0C -38 -C4 -64 -18 -10 -ENDCHAR -STARTCHAR 2225 -ENCODING 8741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -0A -14 -28 -28 -50 -90 -A0 -ENDCHAR -STARTCHAR 2226 -ENCODING 8742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -02 -54 -24 -28 -50 -98 -A0 -ENDCHAR -STARTCHAR 2227 -ENCODING 8743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 0 -BITMAP -10 -30 -48 -44 -84 -ENDCHAR -STARTCHAR 2228 -ENCODING 8744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 0 -BITMAP -02 -84 -44 -48 -30 -10 -ENDCHAR -STARTCHAR 2229 -ENCODING 8745 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 7 1 0 -BITMAP -F8 -84 -84 -84 -84 -84 -04 -ENDCHAR -STARTCHAR 222A -ENCODING 8746 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 8 1 -1 -BITMAP -04 -84 -84 -84 -84 -84 -84 -F8 -ENDCHAR -STARTCHAR 222B -ENCODING 8747 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 9 1 -1 -BITMAP -30 -20 -40 -40 -40 -40 -40 -40 -80 -ENDCHAR -STARTCHAR 222C -ENCODING 8748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -36 -28 -48 -48 -48 -48 -48 -48 -B0 -ENDCHAR -STARTCHAR 222E -ENCODING 8750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -10 -20 -20 -60 -B0 -B0 -60 -40 -C0 -ENDCHAR -STARTCHAR 2234 -ENCODING 8756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -10 -00 -00 -00 -84 -ENDCHAR -STARTCHAR 2235 -ENCODING 8757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -84 -00 -00 -00 -10 -ENDCHAR -STARTCHAR 2236 -ENCODING 8758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 4 5 1 -BITMAP -80 -00 -00 -80 -ENDCHAR -STARTCHAR 2237 -ENCODING 8759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 5 3 1 -BITMAP -90 -00 -00 -00 -90 -ENDCHAR -STARTCHAR 223C -ENCODING 8764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 3 2 2 -BITMAP -60 -94 -08 -ENDCHAR -STARTCHAR 223D -ENCODING 8765 -SWIDTH 810 0 -DWIDTH 9 0 -BBX 8 4 0 1 -BITMAP -47 -89 -89 -F3 -ENDCHAR -STARTCHAR 2243 -ENCODING 8771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 3 2 2 -BITMAP -7C -00 -FC -ENDCHAR -STARTCHAR 2245 -ENCODING 8773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -79 -06 -00 -FF -7E -ENDCHAR -STARTCHAR 2248 -ENCODING 8776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 4 3 1 -BITMAP -F8 -00 -C0 -38 -ENDCHAR -STARTCHAR 2250 -ENCODING 8784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -20 -00 -F8 -00 -F8 -ENDCHAR -STARTCHAR 2251 -ENCODING 8785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 1 -BITMAP -10 -FE -00 -FE -00 -10 -ENDCHAR -STARTCHAR 2252 -ENCODING 8786 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -C0 -00 -7C -00 -7C -00 -04 -ENDCHAR -STARTCHAR 2253 -ENCODING 8787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 1 -BITMAP -04 -FE -00 -FE -00 -40 -ENDCHAR -STARTCHAR 225A -ENCODING 8794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -04 -48 -48 -30 -00 -FE -7C -ENDCHAR -STARTCHAR 2260 -ENCODING 8800 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 7 7 0 0 -BITMAP -08 -08 -FE -10 -FE -10 -20 -ENDCHAR -STARTCHAR 2261 -ENCODING 8801 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 5 5 2 1 -BITMAP -F8 -00 -F8 -00 -F8 -ENDCHAR -STARTCHAR 2262 -ENCODING 8802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 1 -BITMAP -08 -74 -FE -20 -FE -40 -ENDCHAR -STARTCHAR 2264 -ENCODING 8804 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -0C -30 -C0 -38 -04 -00 -7C -ENDCHAR -STARTCHAR 2265 -ENCODING 8805 -SWIDTH 630 0 -DWIDTH 7 0 -BBX 6 7 1 0 -BITMAP -C0 -30 -0C -30 -C0 -00 -F8 -ENDCHAR -STARTCHAR 2266 -ENCODING 8806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -0C -30 -C0 -30 -0C -FE -7C -ENDCHAR -STARTCHAR 2267 -ENCODING 8807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -60 -18 -0C -30 -C0 -FE -7C -ENDCHAR -STARTCHAR 226A -ENCODING 8810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -0D -16 -68 -B0 -78 -16 -0D -ENDCHAR -STARTCHAR 226B -ENCODING 8811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -D0 -2C -1A -05 -1A -2C -D0 -ENDCHAR -STARTCHAR 226E -ENCODING 8814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 1 -BITMAP -08 -30 -D0 -70 -18 -24 -ENDCHAR -STARTCHAR 226F -ENCODING 8815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 1 -BITMAP -70 -18 -14 -28 -30 -C0 -ENDCHAR -STARTCHAR 2270 -ENCODING 8816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -08 -0C -30 -D0 -38 -16 -FE -7C -ENDCHAR -STARTCHAR 2271 -ENCODING 8817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -F0 -10 -1C -30 -E0 -FC -78 -ENDCHAR -STARTCHAR 2272 -ENCODING 8818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -04 -38 -C0 -60 -1C -00 -FE -ENDCHAR -STARTCHAR 2273 -ENCODING 8819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -C0 -30 -0C -18 -E0 -00 -FE -ENDCHAR -STARTCHAR 2276 -ENCODING 8822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -0C -70 -F0 -CC -38 -1C -60 -ENDCHAR -STARTCHAR 2277 -ENCODING 8823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -E0 -18 -1C -EC -30 -E0 -1C -ENDCHAR -STARTCHAR 2279 -ENCODING 8825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -08 -E8 -18 -1C -FC -20 -E0 -3C -ENDCHAR -STARTCHAR 227A -ENCODING 8826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -04 -18 -E0 -30 -0C -ENDCHAR -STARTCHAR 227B -ENCODING 8827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -C0 -30 -0C -30 -C0 -ENDCHAR -STARTCHAR 2280 -ENCODING 8832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -10 -14 -18 -F0 -30 -1C -10 -ENDCHAR -STARTCHAR 2281 -ENCODING 8833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -D0 -20 -1C -30 -D0 -ENDCHAR -STARTCHAR 2282 -ENCODING 8834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 1 0 -BITMAP -7E -80 -80 -80 -80 -7E -ENDCHAR -STARTCHAR 2283 -ENCODING 8835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 0 -BITMAP -FC -02 -02 -02 -02 -FC -ENDCHAR -STARTCHAR 2284 -ENCODING 8836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -08 -7C -90 -90 -90 -D0 -28 -ENDCHAR -STARTCHAR 2285 -ENCODING 8837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -10 -F8 -14 -24 -24 -2C -50 -ENDCHAR -STARTCHAR 2286 -ENCODING 8838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -7F -80 -80 -80 -7F -00 -7E -ENDCHAR -STARTCHAR 2287 -ENCODING 8839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -7E -01 -01 -01 -FE -00 -7E -ENDCHAR -STARTCHAR 228A -ENCODING 8842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -7E -80 -80 -80 -7F -7E -08 -76 -ENDCHAR -STARTCHAR 228B -ENCODING 8843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -7E -01 -01 -01 -FE -7E -08 -76 -ENDCHAR -STARTCHAR 2295 -ENCODING 8853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -4200 -8900 -8880 -BE80 -8880 -8900 -4100 -3E00 -ENDCHAR -STARTCHAR 2296 -ENCODING 8854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -4200 -8100 -8080 -BE80 -8080 -8100 -4100 -3E00 -ENDCHAR -STARTCHAR 2297 -ENCODING 8855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -4200 -8300 -A480 -9880 -9880 -A500 -4100 -3E00 -ENDCHAR -STARTCHAR 2299 -ENCODING 8857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3E -41 -81 -99 -BD -99 -81 -41 -3E -ENDCHAR -STARTCHAR 22A3 -ENCODING 8867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -04 -04 -FC -04 -04 -ENDCHAR -STARTCHAR 22A4 -ENCODING 8868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 0 -BITMAP -F8 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 22A5 -ENCODING 8869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR 22BB -ENCODING 8891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -80 -44 -48 -28 -30 -10 -7C -ENDCHAR -STARTCHAR 22BC -ENCODING 8892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 3 0 -BITMAP -F8 -20 -50 -90 -88 -08 -ENDCHAR -STARTCHAR 22CE -ENCODING 8910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 1 -BITMAP -10 -30 -28 -48 -44 -84 -ENDCHAR -STARTCHAR 22CF -ENCODING 8911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -80 -44 -48 -28 -30 -10 -ENDCHAR -STARTCHAR 22DA -ENCODING 8922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -1C -70 -0E -FE -C0 -3C -70 -ENDCHAR -STARTCHAR 22DB -ENCODING 8923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -70 -3C -C0 -FE -0E -70 -1C -ENDCHAR -STARTCHAR 22EE -ENCODING 8942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 8 5 -1 -BITMAP -80 -00 -00 -80 -00 -00 -80 -80 -ENDCHAR -STARTCHAR 22EF -ENCODING 8943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 1 1 3 -BITMAP -89 -ENDCHAR -STARTCHAR 2306 -ENCODING 8966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 0 -BITMAP -F8 -00 -20 -50 -90 -ENDCHAR -STARTCHAR 2312 -ENCODING 8978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 2 2 6 -BITMAP -78 -84 -ENDCHAR -STARTCHAR 2314 -ENCODING 8980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -78 -84 -84 -44 -48 -30 -10 -ENDCHAR -STARTCHAR 2460 -ENCODING 9312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4440 -8440 -8440 -8440 -8440 -4440 -4080 -3F00 -ENDCHAR -STARTCHAR 2461 -ENCODING 9313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4E40 -9240 -8240 -8440 -8840 -5E40 -4080 -3F00 -ENDCHAR -STARTCHAR 2462 -ENCODING 9314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4C40 -9240 -8640 -8240 -9240 -4E40 -4080 -3F00 -ENDCHAR -STARTCHAR 2463 -ENCODING 9315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4440 -8C40 -8C40 -9440 -9E40 -4440 -4080 -3F00 -ENDCHAR -STARTCHAR 2464 -ENCODING 9316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4E40 -9040 -9E40 -8240 -9240 -4E40 -4080 -3F00 -ENDCHAR -STARTCHAR 2465 -ENCODING 9317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4E40 -9040 -9E40 -9240 -9240 -5E40 -4080 -3F00 -ENDCHAR -STARTCHAR 2466 -ENCODING 9318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5E40 -8240 -8440 -8440 -8840 -4840 -4080 -3F00 -ENDCHAR -STARTCHAR 2467 -ENCODING 9319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4E40 -9240 -8E40 -9240 -9240 -4E40 -4080 -3F00 -ENDCHAR -STARTCHAR 2468 -ENCODING 9320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5E40 -9240 -9240 -9E40 -8240 -4E40 -4080 -3F00 -ENDCHAR -STARTCHAR 2469 -ENCODING 9321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5740 -9540 -9940 -9940 -9540 -5740 -4080 -3F00 -ENDCHAR -STARTCHAR 246A -ENCODING 9322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5240 -9240 -9240 -9240 -9240 -5240 -4080 -3F00 -ENDCHAR -STARTCHAR 246B -ENCODING 9323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5740 -9140 -9140 -9240 -9440 -5740 -4080 -3F00 -ENDCHAR -STARTCHAR 246C -ENCODING 9324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5740 -9140 -9240 -9140 -9940 -5740 -4080 -3F00 -ENDCHAR -STARTCHAR 246D -ENCODING 9325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5240 -9240 -9540 -9940 -9F40 -5040 -4080 -3F00 -ENDCHAR -STARTCHAR 246E -ENCODING 9326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5640 -9440 -9740 -9140 -9940 -5740 -4080 -3F00 -ENDCHAR -STARTCHAR 246F -ENCODING 9327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4280 -5540 -9A40 -9D40 -9940 -9940 -5680 -2100 -1E00 -ENDCHAR -STARTCHAR 2470 -ENCODING 9328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5740 -9240 -9240 -9240 -9440 -5480 -2100 -1E00 -ENDCHAR -STARTCHAR 2471 -ENCODING 9329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4280 -5540 -9540 -9640 -9940 -9940 -5780 -2100 -1E00 -ENDCHAR -STARTCHAR 2472 -ENCODING 9330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4280 -5540 -98C0 -9540 -92C0 -9140 -5680 -2100 -1E00 -ENDCHAR -STARTCHAR 2473 -ENCODING 9331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5280 -6D40 -A4C0 -8CC0 -94C0 -A4C0 -7B80 -2100 -1E00 -ENDCHAR -STARTCHAR 2474 -ENCODING 9332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8440 -8C40 -8440 -8440 -8440 -8440 -8440 -4040 -4080 -ENDCHAR -STARTCHAR 2475 -ENCODING 9333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -9240 -8440 -8840 -9040 -9E40 -4040 -4080 -ENDCHAR -STARTCHAR 2476 -ENCODING 9334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -8240 -8640 -8140 -9140 -8E40 -4040 -4080 -ENDCHAR -STARTCHAR 2477 -ENCODING 9335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8440 -8440 -8A40 -9240 -9E40 -8240 -8240 -4040 -4080 -ENDCHAR -STARTCHAR 2478 -ENCODING 9336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9040 -9E40 -9240 -8140 -9240 -8E40 -4040 -4080 -ENDCHAR -STARTCHAR 2479 -ENCODING 9337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -9040 -9E40 -9140 -9140 -8E40 -4040 -4080 -ENDCHAR -STARTCHAR 247A -ENCODING 9338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9E40 -8240 -8240 -8440 -8440 -8840 -8840 -4840 -4080 -ENDCHAR -STARTCHAR 247B -ENCODING 9339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -9240 -8C40 -9240 -9140 -8E40 -4040 -4080 -ENDCHAR -STARTCHAR 247C -ENCODING 9340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -9140 -9340 -8D40 -9240 -8E40 -4040 -4080 -ENDCHAR -STARTCHAR 247D -ENCODING 9341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9740 -B540 -94C0 -98C0 -98C0 -9540 -9740 -4040 -4080 -ENDCHAR -STARTCHAR 247E -ENCODING 9342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9140 -B340 -9140 -9140 -9140 -9140 -9140 -4040 -4080 -ENDCHAR -STARTCHAR 247F -ENCODING 9343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9740 -A540 -9940 -9240 -9440 -9840 -9F40 -4040 -4080 -ENDCHAR -STARTCHAR 2480 -ENCODING 9344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9740 -B940 -9140 -9340 -90C0 -98C0 -9740 -4040 -4080 -ENDCHAR -STARTCHAR 2481 -ENCODING 9345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9140 -B340 -9540 -9540 -9FC0 -9140 -9140 -4040 -4080 -ENDCHAR -STARTCHAR 2482 -ENCODING 9346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9740 -B440 -9740 -9540 -90C0 -98C0 -9740 -4040 -4080 -ENDCHAR -STARTCHAR 2483 -ENCODING 9347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -4080 -4340 -A540 -9A40 -9D40 -98C0 -98C0 -9740 -4040 -4080 -ENDCHAR -STARTCHAR 2484 -ENCODING 9348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -4080 -4640 -B140 -9140 -9240 -9240 -9240 -9440 -4040 -4080 -ENDCHAR -STARTCHAR 2485 -ENCODING 9349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -4080 -5340 -B4C0 -9540 -9740 -98C0 -98C0 -9740 -4040 -4080 -ENDCHAR -STARTCHAR 2486 -ENCODING 9350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -4080 -4340 -A4C0 -98C0 -94C0 -97C0 -90C0 -9740 -4040 -4080 -ENDCHAR -STARTCHAR 2487 -ENCODING 9351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -4080 -5340 -AAC0 -8CC0 -8CC0 -94C0 -A4C0 -BB40 -4040 -4080 -ENDCHAR -STARTCHAR 249C -ENCODING 9372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -8E40 -9240 -9240 -9D40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 249D -ENCODING 9373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9040 -9040 -9E40 -9140 -9140 -9140 -9E40 -4040 -4080 -ENDCHAR -STARTCHAR 249E -ENCODING 9374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -9040 -9040 -9040 -9240 -8E40 -4040 -4080 -ENDCHAR -STARTCHAR 249F -ENCODING 9375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4240 -8240 -9E40 -9240 -A240 -A240 -9240 -9E40 -4040 -4080 -ENDCHAR -STARTCHAR 24A0 -ENCODING 9376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8C40 -9240 -9140 -9E40 -9040 -9240 -8E40 -4040 -4080 -ENDCHAR -STARTCHAR 24A1 -ENCODING 9377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8440 -8440 -8C40 -8440 -8440 -8440 -8440 -4440 -4080 -ENDCHAR -STARTCHAR 24A2 -ENCODING 9378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -9140 -9240 -8E40 -9240 -8E40 -4040 -4080 -ENDCHAR -STARTCHAR 24A3 -ENCODING 9379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9040 -9040 -9E40 -9240 -9140 -9140 -9140 -4040 -4080 -ENDCHAR -STARTCHAR 24A4 -ENCODING 9380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8440 -8040 -8440 -8440 -8440 -8440 -8440 -4040 -4080 -ENDCHAR -STARTCHAR 24A5 -ENCODING 9381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4440 -8040 -8440 -8440 -8440 -8440 -8440 -8440 -4C40 -4080 -ENDCHAR -STARTCHAR 24A6 -ENCODING 9382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9040 -9040 -9240 -9440 -9C40 -9240 -9240 -4040 -4080 -ENDCHAR -STARTCHAR 24A7 -ENCODING 9383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8440 -8440 -8440 -8440 -8440 -8440 -8440 -4040 -4080 -ENDCHAR -STARTCHAR 24A8 -ENCODING 9384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -BB40 -A4C0 -A4C0 -A4C0 -A4C0 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 24A9 -ENCODING 9385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -9E40 -9240 -9240 -9240 -9240 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 24AA -ENCODING 9386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -9140 -9140 -9240 -8E40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 24AB -ENCODING 9387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9E40 -9140 -9140 -9140 -9140 -9E40 -9040 -4040 -4080 -ENDCHAR -STARTCHAR 24AC -ENCODING 9388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8D40 -9240 -9140 -9140 -9240 -8D40 -8140 -4040 -4080 -ENDCHAR -STARTCHAR 24AD -ENCODING 9389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -8E40 -8840 -8840 -8840 -8840 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 24AE -ENCODING 9390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -9240 -8C40 -8240 -9240 -8E40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 24AF -ENCODING 9391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8840 -8840 -8C40 -8840 -8840 -8840 -8440 -4040 -4080 -ENDCHAR -STARTCHAR 24B0 -ENCODING 9392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -9240 -9240 -9240 -9240 -8E40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 24B1 -ENCODING 9393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -9240 -9240 -8A40 -8C40 -8C40 -8440 -4040 -4080 -ENDCHAR -STARTCHAR 24B2 -ENCODING 9394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -A4C0 -AD40 -AB40 -9340 -9240 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 24B3 -ENCODING 9395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -9240 -8C40 -8440 -8A40 -9240 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 24B4 -ENCODING 9396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -9140 -9240 -8A40 -8A40 -8C40 -8440 -8440 -4840 -4080 -ENDCHAR -STARTCHAR 24B5 -ENCODING 9397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -9E40 -8240 -8440 -8840 -9E40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 24B6 -ENCODING 9398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4480 -4C40 -8A40 -9240 -9E40 -9140 -6180 -2100 -1E00 -ENDCHAR -STARTCHAR 24B7 -ENCODING 9399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5E80 -5140 -9140 -9E40 -9140 -9140 -5E80 -2100 -1E00 -ENDCHAR -STARTCHAR 24B8 -ENCODING 9400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4C80 -5340 -A040 -A040 -A040 -A140 -5E80 -2100 -1E00 -ENDCHAR -STARTCHAR 24B9 -ENCODING 9401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4C80 -5340 -9140 -9140 -9140 -9140 -5E80 -2100 -1E00 -ENDCHAR -STARTCHAR 24BA -ENCODING 9402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4E80 -5040 -9040 -9E40 -9040 -9040 -5E80 -2100 -1E00 -ENDCHAR -STARTCHAR 24BB -ENCODING 9403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4E80 -5040 -9040 -9E40 -9040 -9040 -5080 -2100 -1E00 -ENDCHAR -STARTCHAR 24BC -ENCODING 9404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4C80 -5240 -A040 -A240 -A140 -A140 -5F80 -2100 -1E00 -ENDCHAR -STARTCHAR 24BD -ENCODING 9405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -5140 -9140 -9F40 -9140 -9140 -4180 -2100 -1E00 -ENDCHAR -STARTCHAR 24BE -ENCODING 9406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4440 -8440 -8440 -8440 -8440 -4080 -2100 -1E00 -ENDCHAR -STARTCHAR 24BF -ENCODING 9407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4280 -4240 -8240 -8240 -8240 -9240 -4C80 -2100 -1E00 -ENDCHAR -STARTCHAR 24C0 -ENCODING 9408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -5240 -9440 -9840 -9440 -9240 -4080 -2100 -1E00 -ENDCHAR -STARTCHAR 24C1 -ENCODING 9409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5080 -5040 -9040 -9040 -9040 -9040 -5E80 -2100 -1E00 -ENDCHAR -STARTCHAR 24C2 -ENCODING 9410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -6140 -B340 -B340 -AB40 -AD40 -6480 -2100 -1E00 -ENDCHAR -STARTCHAR 24C3 -ENCODING 9411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -5140 -9940 -9540 -9540 -9340 -4180 -2100 -1E00 -ENDCHAR -STARTCHAR 24C4 -ENCODING 9412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4E80 -5140 -A140 -A140 -A140 -9140 -5E80 -2100 -1E00 -ENDCHAR -STARTCHAR 24C5 -ENCODING 9413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4E80 -5140 -9140 -9340 -9C40 -9040 -5080 -2100 -1E00 -ENDCHAR -STARTCHAR 24C6 -ENCODING 9414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4E80 -5140 -A140 -A140 -A140 -A140 -5E80 -2100 -1E00 -ENDCHAR -STARTCHAR 24C7 -ENCODING 9415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5E80 -5140 -9140 -9E40 -9140 -9140 -5180 -2100 -1E00 -ENDCHAR -STARTCHAR 24C8 -ENCODING 9416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4C80 -5240 -9040 -8C40 -8340 -9140 -5E80 -2100 -1E00 -ENDCHAR -STARTCHAR 24C9 -ENCODING 9417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5E40 -8440 -8440 -8440 -8440 -4480 -2100 -1E00 -ENDCHAR -STARTCHAR 24CA -ENCODING 9418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5140 -9140 -9140 -9140 -9140 -5280 -2D00 -1E00 -ENDCHAR -STARTCHAR 24CB -ENCODING 9419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5140 -9240 -9240 -8A40 -8C40 -4480 -2100 -1E00 -ENDCHAR -STARTCHAR 24CC -ENCODING 9420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -44C0 -ACC0 -AD40 -AB40 -B340 -5280 -2100 -1E00 -ENDCHAR -STARTCHAR 24CD -ENCODING 9421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5240 -8C40 -8440 -8C40 -9240 -5080 -2100 -1E00 -ENDCHAR -STARTCHAR 24CE -ENCODING 9422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5140 -9240 -8C40 -8440 -8440 -4480 -2100 -1E00 -ENDCHAR -STARTCHAR 24CF -ENCODING 9423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5F80 -4240 -8240 -8440 -8840 -9040 -5F80 -2100 -1E00 -ENDCHAR -STARTCHAR 24D0 -ENCODING 9424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4E40 -9240 -8E40 -9240 -9F40 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 24D1 -ENCODING 9425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5040 -9E40 -9140 -9140 -9140 -5E40 -4080 -3F00 -ENDCHAR -STARTCHAR 24D2 -ENCODING 9426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4C40 -9240 -9040 -9040 -9240 -4E40 -4080 -3F00 -ENDCHAR -STARTCHAR 24D3 -ENCODING 9427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4280 -4240 -8E40 -9240 -9240 -9240 -5E40 -4080 -3F00 -ENDCHAR -STARTCHAR 24D4 -ENCODING 9428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5E40 -9240 -9E40 -9040 -9240 -4C40 -4080 -3F00 -ENDCHAR -STARTCHAR 24D5 -ENCODING 9429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4440 -8840 -8840 -8840 -8840 -4840 -4880 -3F00 -ENDCHAR -STARTCHAR 24D6 -ENCODING 9430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4E40 -9240 -9240 -8E40 -8240 -5E40 -4080 -3F00 -ENDCHAR -STARTCHAR 24D7 -ENCODING 9431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5040 -9040 -9E40 -9240 -9240 -5240 -4080 -3F00 -ENDCHAR -STARTCHAR 24D8 -ENCODING 9432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4440 -8040 -8440 -8440 -8440 -4440 -4080 -3F00 -ENDCHAR -STARTCHAR 24D9 -ENCODING 9433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4440 -8040 -8440 -8440 -8440 -4C40 -4080 -3F00 -ENDCHAR -STARTCHAR 24DA -ENCODING 9434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5040 -9240 -9440 -9C40 -9240 -5240 -4080 -3F00 -ENDCHAR -STARTCHAR 24DB -ENCODING 9435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4440 -8440 -8440 -8440 -8440 -4440 -4080 -3F00 -ENDCHAR -STARTCHAR 24DC -ENCODING 9436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -BB40 -A4C0 -A4C0 -A4C0 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 24DD -ENCODING 9437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5E40 -9240 -9240 -9240 -9240 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 24DE -ENCODING 9438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -8E40 -9140 -9140 -9240 -4C40 -4080 -3F00 -ENDCHAR -STARTCHAR 24DF -ENCODING 9439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5E40 -9140 -9140 -9240 -9E40 -5040 -5080 -3F00 -ENDCHAR -STARTCHAR 24E0 -ENCODING 9440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5E40 -9240 -9240 -9240 -8E40 -4240 -4080 -3F00 -ENDCHAR -STARTCHAR 24E1 -ENCODING 9441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -8C40 -8840 -8840 -8840 -4840 -4080 -3F00 -ENDCHAR -STARTCHAR 24E2 -ENCODING 9442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4E40 -9240 -8C40 -8240 -9240 -4E40 -4080 -3F00 -ENDCHAR -STARTCHAR 24E3 -ENCODING 9443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4840 -8840 -8840 -8840 -8840 -4440 -4080 -3F00 -ENDCHAR -STARTCHAR 24E4 -ENCODING 9444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -9240 -9240 -9240 -9240 -4E40 -4080 -3F00 -ENDCHAR -STARTCHAR 24E5 -ENCODING 9445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -9240 -9240 -8A40 -8C40 -4440 -4080 -3F00 -ENDCHAR -STARTCHAR 24E6 -ENCODING 9446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -A4C0 -AD40 -AD40 -9240 -5240 -4080 -3F00 -ENDCHAR -STARTCHAR 24E7 -ENCODING 9447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -9240 -8C40 -8440 -8A40 -5240 -4080 -3F00 -ENDCHAR -STARTCHAR 24E8 -ENCODING 9448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5240 -9240 -8A40 -8C40 -8440 -4840 -4080 -3F00 -ENDCHAR -STARTCHAR 24E9 -ENCODING 9449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5E40 -8240 -8440 -8840 -9E40 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 24EB -ENCODING 9451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7F80 -6DC0 -FFC0 -FFC0 -FFC0 -7FC0 -7F80 -3F00 -0C00 -ENDCHAR -STARTCHAR 24EC -ENCODING 9452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -6D80 -6FC0 -EFC0 -EEC0 -EDC0 -6BC0 -6880 -3F00 -0C00 -ENDCHAR -STARTCHAR 24ED -ENCODING 9453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7D80 -7EC0 -FEC0 -FDC0 -FFC0 -77C0 -7A80 -3F00 -0C00 -ENDCHAR -STARTCHAR 24EE -ENCODING 9454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -6F80 -6DC0 -EFC0 -EBC0 -EFC0 -6FC0 -6F80 -3F00 -0C00 -ENDCHAR -STARTCHAR 24EF -ENCODING 9455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -6880 -6FC0 -EFC0 -EEC0 -EFC0 -6FC0 -6A80 -3F00 -0C00 -ENDCHAR -STARTCHAR 24F0 -ENCODING 9456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7D80 -7EC0 -FFC0 -F2C0 -F7C0 -7FC0 -7A80 -3F00 -0C00 -ENDCHAR -STARTCHAR 24F1 -ENCODING 9457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7F80 -6FC0 -EFC0 -EDC0 -EFC0 -6FC0 -6B80 -3F00 -0C00 -ENDCHAR -STARTCHAR 24F2 -ENCODING 9458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -6D80 -6FC0 -EFC0 -E8C0 -EFC0 -77C0 -6A80 -3F00 -0C00 -ENDCHAR -STARTCHAR 24F3 -ENCODING 9459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -6D80 -6FC0 -EFC0 -EF40 -EDC0 -6FC0 -6880 -3F00 -0C00 -ENDCHAR -STARTCHAR 24F4 -ENCODING 9460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -6C80 -57C0 -FB40 -FB40 -EB40 -5FC0 -4480 -3F00 -0C00 -ENDCHAR -STARTCHAR 2500 -ENCODING 9472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 0 0 0 3 -BITMAP -ENDCHAR -STARTCHAR 2501 -ENCODING 9473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 1 0 3 -BITMAP -FFC0 -ENDCHAR -STARTCHAR 2502 -ENCODING 9474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 9 5 -1 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2503 -ENCODING 9475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 11 5 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 250C -ENCODING 9484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 5 5 -2 -BITMAP -70 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 250D -ENCODING 9485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 5 -2 -BITMAP -F8 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 250E -ENCODING 9486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 6 5 -2 -BITMAP -F0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 250F -ENCODING 9487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 5 -2 -BITMAP -F8 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2510 -ENCODING 9488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 5 1 -2 -BITMAP -E0 -10 -10 -10 -10 -ENDCHAR -STARTCHAR 2511 -ENCODING 9489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 0 -2 -BITMAP -F8 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2512 -ENCODING 9490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 1 -2 -BITMAP -F8 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2513 -ENCODING 9491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 0 -2 -BITMAP -F8 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2514 -ENCODING 9492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 5 5 4 -BITMAP -80 -80 -80 -80 -70 -ENDCHAR -STARTCHAR 2515 -ENCODING 9493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 5 4 -BITMAP -80 -80 -80 -80 -F8 -ENDCHAR -STARTCHAR 2516 -ENCODING 9494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 5 3 -BITMAP -80 -80 -80 -80 -80 -F8 -ENDCHAR -STARTCHAR 2517 -ENCODING 9495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 5 3 -BITMAP -80 -80 -80 -80 -80 -F8 -ENDCHAR -STARTCHAR 2518 -ENCODING 9496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 5 1 4 -BITMAP -10 -10 -10 -10 -E0 -ENDCHAR -STARTCHAR 2519 -ENCODING 9497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 0 4 -BITMAP -08 -08 -08 -08 -F8 -ENDCHAR -STARTCHAR 251A -ENCODING 9498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 0 3 -BITMAP -04 -04 -04 -04 -04 -FC -ENDCHAR -STARTCHAR 251B -ENCODING 9499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 0 3 -BITMAP -08 -08 -08 -08 -08 -F8 -ENDCHAR -STARTCHAR 251C -ENCODING 9500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 5 -1 -BITMAP -80 -80 -80 -80 -F0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 251D -ENCODING 9501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 5 -1 -BITMAP -80 -80 -80 -80 -F8 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 251E -ENCODING 9502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 10 5 -2 -BITMAP -80 -80 -80 -80 -80 -F8 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 251F -ENCODING 9503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 10 5 -1 -BITMAP -80 -80 -80 -80 -F0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2520 -ENCODING 9504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 5 -2 -BITMAP -80 -80 -80 -80 -80 -F0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2521 -ENCODING 9505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 10 5 -2 -BITMAP -80 -80 -80 -80 -80 -F8 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2522 -ENCODING 9506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 10 5 -1 -BITMAP -80 -80 -80 -80 -F8 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2523 -ENCODING 9507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 11 5 -2 -BITMAP -80 -80 -80 -80 -80 -F8 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2524 -ENCODING 9508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 1 -1 -BITMAP -10 -10 -10 -10 -F0 -10 -10 -10 -10 -ENDCHAR -STARTCHAR 2525 -ENCODING 9509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 0 -1 -BITMAP -08 -08 -08 -08 -F8 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2526 -ENCODING 9510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 10 1 -2 -BITMAP -08 -08 -08 -08 -08 -F8 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2527 -ENCODING 9511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 10 1 -1 -BITMAP -08 -08 -08 -08 -08 -F8 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2528 -ENCODING 9512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 11 1 -2 -BITMAP -08 -08 -08 -08 -08 -F8 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2529 -ENCODING 9513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 10 0 -2 -BITMAP -04 -04 -04 -04 -04 -F8 -04 -04 -04 -04 -ENDCHAR -STARTCHAR 252A -ENCODING 9514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 10 0 -1 -BITMAP -04 -04 -04 -04 -FC -04 -04 -04 -04 -04 -ENDCHAR -STARTCHAR 252B -ENCODING 9515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 11 0 -2 -BITMAP -08 -08 -08 -08 -08 -F8 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 252C -ENCODING 9516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 -2 -BITMAP -FF -08 -08 -08 -08 -ENDCHAR -STARTCHAR 252D -ENCODING 9517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 0 -2 -BITMAP -FF80 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 252E -ENCODING 9518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 1 -2 -BITMAP -FF80 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 252F -ENCODING 9519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 5 0 -2 -BITMAP -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2530 -ENCODING 9520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 6 1 -2 -BITMAP -FF -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2531 -ENCODING 9521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 6 0 -2 -BITMAP -FF80 -0400 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2532 -ENCODING 9522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 6 1 -2 -BITMAP -FF80 -0800 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 2533 -ENCODING 9523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 6 0 -2 -BITMAP -FFC0 -0400 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2534 -ENCODING 9524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 4 -BITMAP -08 -08 -08 -08 -FF -ENDCHAR -STARTCHAR 2535 -ENCODING 9525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 0 4 -BITMAP -0400 -0400 -0400 -0400 -FF80 -ENDCHAR -STARTCHAR 2536 -ENCODING 9526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 1 4 -BITMAP -0800 -0800 -0800 -0800 -FF80 -ENDCHAR -STARTCHAR 2537 -ENCODING 9527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 5 0 4 -BITMAP -0400 -0400 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR 2538 -ENCODING 9528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 6 0 3 -BITMAP -0400 -0400 -0400 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR 2539 -ENCODING 9529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 6 0 3 -BITMAP -0400 -0400 -0400 -0400 -0400 -FF80 -ENDCHAR -STARTCHAR 253A -ENCODING 9530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 6 1 3 -BITMAP -0800 -0800 -0800 -0800 -0800 -FF80 -ENDCHAR -STARTCHAR 253B -ENCODING 9531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 6 0 3 -BITMAP -0400 -0400 -0400 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR 253C -ENCODING 9532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -08 -08 -08 -FF -08 -08 -08 -08 -ENDCHAR -STARTCHAR 253D -ENCODING 9533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -0400 -0400 -0400 -0400 -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 253E -ENCODING 9534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -0400 -0400 -0400 -0400 -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 253F -ENCODING 9535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -0400 -0400 -0400 -0400 -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2540 -ENCODING 9536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -08 -08 -08 -08 -08 -FF -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2541 -ENCODING 9537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -0400 -0400 -0400 -FFC0 -0400 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2542 -ENCODING 9538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -08 -08 -08 -08 -FF -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2543 -ENCODING 9539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -2 -BITMAP -0400 -0400 -0400 -0400 -0400 -FB80 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2544 -ENCODING 9540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -0800 -0800 -0800 -0800 -0800 -FF80 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 2545 -ENCODING 9541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0400 -0400 -0400 -0400 -FF80 -0400 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2546 -ENCODING 9542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -0800 -0800 -FF80 -0800 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 2547 -ENCODING 9543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0400 -0400 -0400 -0400 -0400 -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2548 -ENCODING 9544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -0400 -0400 -0400 -FFC0 -0400 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2549 -ENCODING 9545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0400 -0400 -0400 -0400 -0400 -FF80 -0400 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 254A -ENCODING 9546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0800 -0800 -0800 -0800 -0800 -FF80 -0800 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 254B -ENCODING 9547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0400 -0400 -0400 -0400 -FFC0 -0400 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 2592 -ENCODING 9618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -81 -81 -81 -81 -81 -81 -FF -ENDCHAR -STARTCHAR 25A0 -ENCODING 9632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -FF -FF -FF -FF -FF -FF -FF -ENDCHAR -STARTCHAR 25A1 -ENCODING 9633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -81 -81 -81 -81 -81 -81 -FF -ENDCHAR -STARTCHAR 25A3 -ENCODING 9635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -BF -BF -BF -BF -BF -81 -FF -ENDCHAR -STARTCHAR 25A4 -ENCODING 9636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -81 -FF -FF -FF -FF -FF -FF -ENDCHAR -STARTCHAR 25A5 -ENCODING 9637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -FF -FF -FF -FF -FF -FF -FF -ENDCHAR -STARTCHAR 25A6 -ENCODING 9638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -FF -FF -FF -FF -FF -FF -FF -ENDCHAR -STARTCHAR 25A7 -ENCODING 9639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -D5 -EB -B5 -DB -AD -D7 -FF -ENDCHAR -STARTCHAR 25A8 -ENCODING 9640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -AB -D5 -AB -D5 -AB -D7 -FF -ENDCHAR -STARTCHAR 25A9 -ENCODING 9641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -BF -DF -AB -D7 -AB -D7 -FF -ENDCHAR -STARTCHAR 25B1 -ENCODING 9649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -7E -82 -82 -84 -FC -ENDCHAR -STARTCHAR 25B2 -ENCODING 9650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -08 -18 -1C -3C -7E -7F -FF -ENDCHAR -STARTCHAR 25B3 -ENCODING 9651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -08 -18 -24 -22 -42 -41 -FF -ENDCHAR -STARTCHAR 25B5 -ENCODING 9653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 6 1 1 -BITMAP -18 -14 -24 -42 -42 -FF -ENDCHAR -STARTCHAR 25B6 -ENCODING 9654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -80 -E0 -F8 -FC -F8 -F0 -C0 -80 -ENDCHAR -STARTCHAR 25B7 -ENCODING 9655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -C0 -B0 -88 -84 -88 -90 -E0 -80 -ENDCHAR -STARTCHAR 25B9 -ENCODING 9657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -C0 -A0 -98 -84 -88 -B0 -C0 -80 -ENDCHAR -STARTCHAR 25BC -ENCODING 9660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -FF -7F -7E -3C -1C -18 -08 -ENDCHAR -STARTCHAR 25BD -ENCODING 9661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -FF -41 -42 -22 -24 -18 -08 -ENDCHAR -STARTCHAR 25BF -ENCODING 9663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -FF -41 -42 -22 -24 -18 -08 -ENDCHAR -STARTCHAR 25C0 -ENCODING 9664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -02 -06 -1E -3E -FE -7E -1E -0E -02 -ENDCHAR -STARTCHAR 25C1 -ENCODING 9665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -02 -0E -12 -62 -82 -42 -32 -0A -06 -ENDCHAR -STARTCHAR 25C3 -ENCODING 9667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -02 -06 -1A -22 -C2 -62 -12 -0E -02 -ENDCHAR -STARTCHAR 25C6 -ENCODING 9670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -0800 -1C00 -3E00 -7F00 -FF80 -FF80 -7F00 -3E00 -1C00 -0800 -ENDCHAR -STARTCHAR 25C7 -ENCODING 9671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -0800 -1400 -2200 -4100 -8080 -8080 -4100 -2200 -1400 -0800 -ENDCHAR -STARTCHAR 25C8 -ENCODING 9672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -0C00 -1200 -2D00 -5E80 -BF40 -5E80 -2D00 -1200 -0C00 -ENDCHAR -STARTCHAR 25C9 -ENCODING 9673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3E -41 -81 -99 -BD -99 -81 -41 -3E -ENDCHAR -STARTCHAR 25CA -ENCODING 9674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -18 -24 -42 -C1 -42 -22 -14 -18 -ENDCHAR -STARTCHAR 25CB -ENCODING 9675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -3C -42 -81 -81 -81 -81 -42 -3C -ENDCHAR -STARTCHAR 25CC -ENCODING 9676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -4000 -0040 -0000 -8000 -0000 -0040 -0000 -0000 -0400 -ENDCHAR -STARTCHAR 25CE -ENCODING 9678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -4200 -BD00 -C280 -C280 -C280 -BD00 -4200 -3C00 -ENDCHAR -STARTCHAR 25CF -ENCODING 9679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -3C -7E -FF -FF -FF -FF -7E -3C -ENDCHAR -STARTCHAR 25D0 -ENCODING 9680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -1C -72 -71 -F1 -F1 -F1 -F1 -71 -3E -ENDCHAR -STARTCHAR 25D1 -ENCODING 9681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -38 -4E -8F -8F -8F -8F -8F -4E -3C -ENDCHAR -STARTCHAR 25E6 -ENCODING 9702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -78 -84 -84 -84 -4C -30 -ENDCHAR -STARTCHAR 25EF -ENCODING 9711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -8040 -8040 -8040 -8040 -4080 -2100 -1E00 -ENDCHAR -STARTCHAR 2605 -ENCODING 9733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -08 -18 -FF -3E -3C -3C -26 -42 -ENDCHAR -STARTCHAR 2606 -ENCODING 9734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -08 -18 -E7 -62 -24 -3A -66 -40 -ENDCHAR -STARTCHAR 260E -ENCODING 9742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 7 0 0 -BITMAP -1E00 -7780 -FFC0 -1240 -3100 -7180 -7F80 -ENDCHAR -STARTCHAR 260F -ENCODING 9743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 7 0 0 -BITMAP -3E00 -55C0 -9D40 -7BC0 -3280 -5280 -7F80 -ENDCHAR -STARTCHAR 261C -ENCODING 9756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 3 1 2 -BITMAP -FF -29 -1F -ENDCHAR -STARTCHAR 261D -ENCODING 9757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 8 4 -1 -BITMAP -80 -80 -80 -E0 -A0 -A0 -A0 -E0 -ENDCHAR -STARTCHAR 261E -ENCODING 9758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 3 1 2 -BITMAP -FF -94 -F8 -ENDCHAR -STARTCHAR 261F -ENCODING 9759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 8 4 0 -BITMAP -C0 -A0 -A0 -A0 -E0 -E0 -80 -80 -ENDCHAR -STARTCHAR 262F -ENCODING 9775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3C -42 -81 -83 -8F -9F -FF -7E -3C -ENDCHAR -STARTCHAR 2640 -ENCODING 9792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 8 3 -1 -BITMAP -70 -90 -90 -50 -20 -F0 -20 -20 -ENDCHAR -STARTCHAR 2642 -ENCODING 9794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -20 -50 -A8 -20 -20 -50 -90 -90 -70 -ENDCHAR -STARTCHAR 2660 -ENCODING 9824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -10 -30 -78 -7C -FC -FE -FE -30 -30 -ENDCHAR -STARTCHAR 2661 -ENCODING 9825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -FF -89 -81 -41 -42 -22 -14 -08 -ENDCHAR -STARTCHAR 2663 -ENCODING 9827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -3C00 -3C00 -1800 -FF00 -FF80 -FF00 -7B00 -1800 -ENDCHAR -STARTCHAR 2664 -ENCODING 9828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -10 -28 -48 -84 -82 -82 -A2 -7C -38 -ENDCHAR -STARTCHAR 2665 -ENCODING 9829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -77 -FF -FF -7F -7E -3C -1C -08 -ENDCHAR -STARTCHAR 2667 -ENCODING 9831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -2400 -2400 -5600 -B500 -8080 -9080 -7F00 -1C00 -ENDCHAR -STARTCHAR 2668 -ENCODING 9832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -0800 -3400 -2C00 -2C00 -6C00 -AC80 -A100 -7E00 -ENDCHAR -STARTCHAR 2669 -ENCODING 9833 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 7 1 0 -BITMAP -40 -40 -40 -40 -40 -C0 -80 -ENDCHAR -STARTCHAR 266A -ENCODING 9834 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -40 -60 -50 -50 -50 -40 -C0 -80 -ENDCHAR -STARTCHAR 266C -ENCODING 9836 -SWIDTH 720 0 -DWIDTH 8 0 -BBX 6 8 1 -1 -BITMAP -1C -64 -7C -44 -44 -4C -C8 -80 -ENDCHAR -STARTCHAR 266D -ENCODING 9837 -SWIDTH 540 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -80 -80 -E0 -90 -90 -A0 -E0 -ENDCHAR -STARTCHAR 266F -ENCODING 9839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -08 -08 -5C -E8 -48 -48 -FC -48 -08 -ENDCHAR -STARTCHAR 2716 -ENCODING 10006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 -1 -BITMAP -66 -FF -7E -3C -7E -FF -66 -ENDCHAR -STARTCHAR 271A -ENCODING 10010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -1C -1C -1C -FF -FF -FF -1C -1C -1C -ENDCHAR -STARTCHAR 273D -ENCODING 10045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -10 -DC -10 -4C -10 -10 -ENDCHAR -STARTCHAR 2756 -ENCODING 10070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -18 -1C -4A -E7 -63 -18 -1C -08 -ENDCHAR -STARTCHAR 2776 -ENCODING 10102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7B80 -73C0 -FBC0 -FBC0 -FBC0 -7BC0 -7B80 -3F00 -0C00 -ENDCHAR -STARTCHAR 2777 -ENCODING 10103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7180 -6FC0 -FFC0 -FDC0 -F7C0 -6FC0 -6180 -3F00 -0C00 -ENDCHAR -STARTCHAR 2778 -ENCODING 10104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7380 -6FC0 -FDC0 -FBC0 -FFC0 -6FC0 -7580 -3F00 -0C00 -ENDCHAR -STARTCHAR 2779 -ENCODING 10105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7B80 -7FC0 -F7C0 -EFC0 -FFC0 -7FC0 -7F80 -3F00 -0C00 -ENDCHAR -STARTCHAR 277A -ENCODING 10106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7180 -7FC0 -EFC0 -EDC0 -FFC0 -6FC0 -7580 -3F00 -0C00 -ENDCHAR -STARTCHAR 277B -ENCODING 10107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7380 -6DC0 -EFC0 -EDC0 -EFC0 -6FC0 -7580 -3F00 -0C00 -ENDCHAR -STARTCHAR 277C -ENCODING 10108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7F80 -7DC0 -FFC0 -FBC0 -FFC0 -77C0 -7780 -3F00 -0C00 -ENDCHAR -STARTCHAR 277D -ENCODING 10109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7380 -6DC0 -EDC0 -F3C0 -EFC0 -6FC0 -6D80 -3F00 -0C00 -ENDCHAR -STARTCHAR 277E -ENCODING 10110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7380 -6DC0 -EFC0 -EDC0 -F3C0 -6FC0 -7580 -3F00 -0C00 -ENDCHAR -STARTCHAR 277F -ENCODING 10111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -6D80 -6AC0 -EFC0 -EFC0 -EFC0 -6FC0 -6A80 -3F00 -0C00 -ENDCHAR -STARTCHAR 278A -ENCODING 10122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7B80 -73C0 -FBC0 -FBC0 -FBC0 -7BC0 -7B80 -3F00 -0C00 -ENDCHAR -STARTCHAR 278B -ENCODING 10123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7180 -75C0 -FDC0 -FBC0 -FBC0 -77C0 -6180 -3F00 -0C00 -ENDCHAR -STARTCHAR 278C -ENCODING 10124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7380 -75C0 -FDC0 -FBC0 -FDC0 -75C0 -7180 -3F00 -0C00 -ENDCHAR -STARTCHAR 278D -ENCODING 10125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7B80 -73C0 -F3C0 -EBC0 -E1C0 -61C0 -7B80 -3F00 -0C00 -ENDCHAR -STARTCHAR 278E -ENCODING 10126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7180 -77C0 -F3C0 -F1C0 -FDC0 -75C0 -7180 -3F00 -0C00 -ENDCHAR -STARTCHAR 278F -ENCODING 10127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7380 -75C0 -F7C0 -F1C0 -F5C0 -75C0 -7180 -3F00 -0C00 -ENDCHAR -STARTCHAR 2790 -ENCODING 10128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7180 -7DC0 -F9C0 -FBC0 -FBC0 -7BC0 -7380 -3F00 -0C00 -ENDCHAR -STARTCHAR 2791 -ENCODING 10129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7380 -75C0 -F5C0 -F3C0 -E5C0 -65C0 -7180 -3F00 -0C00 -ENDCHAR -STARTCHAR 2792 -ENCODING 10130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -7380 -75C0 -E5C0 -F1C0 -FDC0 -75C0 -7180 -3F00 -0C00 -ENDCHAR -STARTCHAR 2793 -ENCODING 10131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1F00 -6D80 -4AC0 -EAC0 -EAC0 -EAC0 -6AC0 -6880 -3F00 -0C00 -ENDCHAR -STARTCHAR 2963 -ENCODING 10595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -5600 -9500 -1480 -1400 -1400 -1400 -1400 -1400 -ENDCHAR -STARTCHAR 2965 -ENCODING 10597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -14 -14 -14 -14 -14 -14 -95 -55 -26 -24 -ENDCHAR -STARTCHAR 2AC5 -ENCODING 10949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -7E -80 -80 -80 -7F -00 -7E -ENDCHAR -STARTCHAR 2AC6 -ENCODING 10950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -7E -01 -01 -01 -FE -00 -7E -ENDCHAR -STARTCHAR 2ACB -ENCODING 10955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -7E -80 -80 -80 -7F -7E -08 -76 -ENDCHAR -STARTCHAR 2ACC -ENCODING 10956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -7E -01 -01 -01 -FE -7E -08 -76 -ENDCHAR -STARTCHAR 2F00 -ENCODING 12032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 1 1 3 -BITMAP -FF80 -ENDCHAR -STARTCHAR 2F04 -ENCODING 12036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -0400 -0800 -1000 -2000 -2000 -4080 -8100 -7F00 -ENDCHAR -STARTCHAR 2F06 -ENCODING 12038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -7F -00 -00 -00 -00 -00 -FF -ENDCHAR -STARTCHAR 2F08 -ENCODING 12040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -08 -08 -18 -18 -14 -22 -43 -81 -ENDCHAR -STARTCHAR 2F0A -ENCODING 12042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -78 -08 -08 -08 -18 -14 -22 -43 -81 -ENDCHAR -STARTCHAR 2F0B -ENCODING 12043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1C00 -0400 -2400 -2400 -2200 -4200 -4200 -8100 -8080 -ENDCHAR -STARTCHAR 2F11 -ENCODING 12049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -11 -11 -11 -11 -21 -21 -41 -86 -ENDCHAR -STARTCHAR 2F12 -ENCODING 12050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -10 -FF -11 -11 -11 -21 -21 -41 -86 -ENDCHAR -STARTCHAR 2F14 -ENCODING 12052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -80 -84 -88 -B0 -C0 -80 -82 -82 -FE -ENDCHAR -STARTCHAR 2F17 -ENCODING 12055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -08 -08 -FF -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2F18 -ENCODING 12056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 10 4 -1 -BITMAP -80 -80 -80 -C0 -A0 -90 -90 -80 -80 -80 -ENDCHAR -STARTCHAR 2F1C -ENCODING 12060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4200 -2200 -2400 -1800 -1800 -1400 -6300 -8180 -ENDCHAR -STARTCHAR 2F1D -ENCODING 12061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -FE -82 -82 -82 -82 -82 -FE -82 -ENDCHAR -STARTCHAR 2F1F -ENCODING 12063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -0800 -0800 -FF00 -0800 -0800 -0800 -0800 -FF80 -ENDCHAR -STARTCHAR 2F20 -ENCODING 12064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -0800 -FF80 -0800 -0800 -0800 -0800 -0800 -FF00 -ENDCHAR -STARTCHAR 2F23 -ENCODING 12067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -10 -1F -22 -42 -52 -8C -08 -30 -C0 -ENDCHAR -STARTCHAR 2F24 -ENCODING 12068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -0800 -FF00 -0800 -1800 -1400 -2200 -4100 -8080 -ENDCHAR -STARTCHAR 2F25 -ENCODING 12069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -10 -10 -FF -22 -24 -34 -0C -33 -C1 -ENDCHAR -STARTCHAR 2F26 -ENCODING 12070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -0400 -0800 -0800 -FF80 -0800 -0800 -0800 -3000 -ENDCHAR -STARTCHAR 2F28 -ENCODING 12072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -04 -04 -FF -04 -44 -24 -24 -04 -0C -ENDCHAR -STARTCHAR 2F29 -ENCODING 12073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -4A00 -4A00 -4A00 -4900 -8900 -8880 -0800 -3000 -ENDCHAR -STARTCHAR 2F2B -ENCODING 12075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -7F -40 -40 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 2F2D -ENCODING 12077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -08 -89 -89 -89 -89 -89 -FF -81 -ENDCHAR -STARTCHAR 2F2F -ENCODING 12079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -08 -08 -08 -08 -08 -08 -FF -ENDCHAR -STARTCHAR 2F30 -ENCODING 12080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -0100 -0100 -7E00 -8100 -8000 -8080 -8100 -7F00 -ENDCHAR -STARTCHAR 2F31 -ENCODING 12081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -1 -BITMAP -10 -10 -FE -92 -92 -92 -92 -96 -10 -10 -ENDCHAR -STARTCHAR 2F32 -ENCODING 12082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -08 -08 -08 -FF -08 -08 -08 -08 -ENDCHAR -STARTCHAR 2F38 -ENCODING 12088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -01 -7E -40 -40 -7F -81 -01 -07 -ENDCHAR -STARTCHAR 2F3C -ENCODING 12092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1000 -0800 -2000 -2200 -6100 -A100 -A080 -2200 -3E00 -ENDCHAR -STARTCHAR 2F3D -ENCODING 12093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -14 -12 -1F -F0 -11 -0E -0C -19 -75 -C3 -ENDCHAR -STARTCHAR 2F3E -ENCODING 12094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -03 -7C -7F -41 -41 -7F -80 -80 -80 -ENDCHAR -STARTCHAR 2F3F -ENCODING 12095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -F800 -0800 -FF00 -0800 -FF80 -0800 -0800 -3800 -ENDCHAR -STARTCHAR 2F40 -ENCODING 12096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF80 -0800 -FE00 -2200 -1400 -0800 -7600 -C100 -ENDCHAR -STARTCHAR 2F42 -ENCODING 12098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -FF -42 -24 -34 -18 -18 -66 -81 -ENDCHAR -STARTCHAR 2F43 -ENCODING 12099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0400 -3400 -0400 -6400 -0400 -1F80 -FC00 -0400 -0400 -ENDCHAR -STARTCHAR 2F44 -ENCODING 12100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -06 -78 -40 -7F -44 -84 -84 -84 -84 -ENDCHAR -STARTCHAR 2F45 -ENCODING 12101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF80 -2000 -3E00 -2100 -2100 -4200 -C200 -8E00 -ENDCHAR -STARTCHAR 2F46 -ENCODING 12102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -10 -10 -FF -18 -18 -28 -49 -8F -ENDCHAR -STARTCHAR 2F47 -ENCODING 12103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -FC -84 -84 -84 -FC -84 -84 -FC -84 -ENDCHAR -STARTCHAR 2F48 -ENCODING 12104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FE -02 -02 -02 -FE -02 -02 -FE -02 -ENDCHAR -STARTCHAR 2F49 -ENCODING 12105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 1 -1 -BITMAP -7E -42 -7E -42 -42 -7E -42 -42 -86 -ENDCHAR -STARTCHAR 2F4A -ENCODING 12106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF00 -1800 -2C00 -2A00 -C900 -8880 -0800 -0800 -ENDCHAR -STARTCHAR 2F4B -ENCODING 12107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -2000 -3F00 -4900 -8A00 -9800 -1800 -2400 -4300 -8180 -ENDCHAR -STARTCHAR 2F4C -ENCODING 12108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -0800 -4800 -4F00 -4800 -4800 -4800 -4800 -FF80 -ENDCHAR -STARTCHAR 2F4F -ENCODING 12111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4900 -4900 -FF80 -5200 -5200 -7F00 -8200 -8600 -ENDCHAR -STARTCHAR 2F50 -ENCODING 12112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4800 -4800 -4900 -7600 -4800 -4800 -4880 -7880 -C700 -ENDCHAR -STARTCHAR 2F51 -ENCODING 12113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7800 -0F00 -F000 -3F00 -D000 -1000 -1080 -0F00 -ENDCHAR -STARTCHAR 2F52 -ENCODING 12114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0700 -7800 -4800 -4800 -7F00 -4400 -4400 -7A80 -E300 -ENDCHAR -STARTCHAR 2F54 -ENCODING 12116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -08 -E9 -2A -2C -4C -8B -89 -38 -ENDCHAR -STARTCHAR 2F55 -ENCODING 12117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -49 -49 -5A -9A -14 -26 -43 -81 -ENDCHAR -STARTCHAR 2F56 -ENCODING 12118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0F00 -7200 -4A00 -4A00 -4A00 -4900 -4900 -8900 -8880 -ENDCHAR -STARTCHAR 2F57 -ENCODING 12119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -4300 -A300 -6400 -6400 -1800 -1800 -6600 -8180 -ENDCHAR -STARTCHAR 2F58 -ENCODING 12120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C600 -3800 -7600 -E100 -6200 -6400 -1800 -1800 -7600 -C180 -ENDCHAR -STARTCHAR 2F5A -ENCODING 12122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -4800 -7F80 -4000 -7C00 -4400 -8400 -8400 -8400 -ENDCHAR -STARTCHAR 2F5B -ENCODING 12123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -2400 -2400 -FF80 -0C00 -1400 -2400 -4400 -8C00 -ENDCHAR -STARTCHAR 2F5C -ENCODING 12124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -4800 -7F00 -8800 -8800 -FF80 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 2F5D -ENCODING 12125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0C00 -0A00 -0900 -FF00 -0800 -1800 -1400 -2200 -C300 -8080 -ENDCHAR -STARTCHAR 2F5E -ENCODING 12126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF00 -1000 -6200 -6400 -1A00 -1100 -2700 -F880 -ENDCHAR -STARTCHAR 2F5F -ENCODING 12127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -08 -08 -7F -0C -0A -08 -FF -ENDCHAR -STARTCHAR 2F60 -ENCODING 12128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0700 -7E00 -5200 -5200 -5200 -5200 -5500 -BD00 -8280 -ENDCHAR -STARTCHAR 2F61 -ENCODING 12129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -2000 -3C00 -2200 -3400 -4C00 -4400 -4C80 -F700 -ENDCHAR -STARTCHAR 2F62 -ENCODING 12130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -22 -22 -FF -22 -22 -3E -22 -22 -3E -22 -ENDCHAR -STARTCHAR 2F63 -ENCODING 12131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -7F00 -8800 -8800 -0800 -7E00 -0800 -0800 -FF80 -ENDCHAR -STARTCHAR 2F64 -ENCODING 12132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -49 -7F -49 -49 -7F -89 -89 -8B -ENDCHAR -STARTCHAR 2F65 -ENCODING 12133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -FE -12 -12 -FE -12 -12 -12 -FE -ENDCHAR -STARTCHAR 2F66 -ENCODING 12134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0900 -0900 -4800 -4F00 -4800 -4800 -B800 -8F80 -ENDCHAR -STARTCHAR 2F69 -ENCODING 12137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -1 -BITMAP -20 -20 -FE -82 -82 -FE -82 -82 -FE -82 -ENDCHAR -STARTCHAR 2F6A -ENCODING 12138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -7F -49 -49 -7F -62 -54 -8C -9E -E1 -ENDCHAR -STARTCHAR 2F6B -ENCODING 12139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -7F00 -9500 -9500 -9500 -9500 -9500 -9500 -FF80 -ENDCHAR -STARTCHAR 2F6C -ENCODING 12140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FE -82 -FE -82 -82 -FE -82 -FE -82 -ENDCHAR -STARTCHAR 2F6D -ENCODING 12141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -34 -08 -FF -19 -2A -48 -88 -18 -ENDCHAR -STARTCHAR 2F6E -ENCODING 12142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2000 -7F00 -4800 -8800 -FF00 -1800 -1400 -6200 -8180 -ENDCHAR -STARTCHAR 2F6F -ENCODING 12143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -2000 -2000 -2000 -7F00 -C100 -C100 -3F00 -4100 -ENDCHAR -STARTCHAR 2F70 -ENCODING 12144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -00 -00 -FF -4A -4A -49 -89 -18 -ENDCHAR -STARTCHAR 2F72 -ENCODING 12146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7800 -0800 -FF80 -1800 -2C00 -4B00 -8880 -0800 -ENDCHAR -STARTCHAR 2F73 -ENCODING 12147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8100 -BD00 -0400 -2200 -2200 -4200 -C100 -8080 -ENDCHAR -STARTCHAR 2F74 -ENCODING 12148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -FF00 -0000 -4200 -2200 -2400 -2400 -2400 -FF80 -ENDCHAR -STARTCHAR 2F75 -ENCODING 12149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -7780 -AA00 -AA00 -2200 -2200 -2200 -2200 -2600 -ENDCHAR -STARTCHAR 2F76 -ENCODING 12150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -49 -2A -08 -FF -18 -2C -4B -89 -08 -ENDCHAR -STARTCHAR 2F78 -ENCODING 12152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2000 -7F00 -8800 -0800 -FF80 -8900 -8900 -7F00 -8100 -ENDCHAR -STARTCHAR 2F7A -ENCODING 12154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -2400 -FF00 -0800 -7F00 -0800 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 2F7B -ENCODING 12155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -31 -33 -D5 -99 -77 -99 -11 -33 -ENDCHAR -STARTCHAR 2F7C -ENCODING 12156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -1100 -7E00 -1400 -FF80 -1800 -6200 -BC00 -2100 -3F00 -ENDCHAR -STARTCHAR 2F7D -ENCODING 12157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -10 -FF -A5 -A5 -A5 -A5 -A5 -83 -ENDCHAR -STARTCHAR 2F7F -ENCODING 12159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4200 -3E00 -4200 -3E00 -4200 -FF80 -0200 -0200 -ENDCHAR -STARTCHAR 2F80 -ENCODING 12160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -7E -09 -FF -7E -08 -FF -FF -08 -08 -ENDCHAR -STARTCHAR 2F81 -ENCODING 12161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -FF -99 -AD -DB -BD -E3 -81 -83 -ENDCHAR -STARTCHAR 2F82 -ENCODING 12162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -88 -FF -81 -81 -FF -88 -FF -80 -ENDCHAR -STARTCHAR 2F83 -ENCODING 12163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -1 -BITMAP -10 -20 -FE -82 -FE -82 -FE -82 -FE -82 -ENDCHAR -STARTCHAR 2F84 -ENCODING 12164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -22 -2E -F1 -08 -08 -7F -08 -FF -ENDCHAR -STARTCHAR 2F85 -ENCODING 12165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -10 -EF -81 -81 -FF -81 -81 -FF -81 -ENDCHAR -STARTCHAR 2F86 -ENCODING 12166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0200 -7C00 -0800 -FF80 -0800 -7E00 -4100 -7E00 -4100 -ENDCHAR -STARTCHAR 2F87 -ENCODING 12167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -7F00 -9A00 -DA00 -AA00 -3F80 -4200 -C200 -8200 -ENDCHAR -STARTCHAR 2F88 -ENCODING 12168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -7E -52 -4A -42 -FF -4A -4A -4A -86 -ENDCHAR -STARTCHAR 2F89 -ENCODING 12169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -42 -7E -42 -7E -51 -4E -5E -E1 -ENDCHAR -STARTCHAR 2F8A -ENCODING 12170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -3C -48 -FF -C9 -49 -7F -40 -41 -7F -ENDCHAR -STARTCHAR 2F8B -ENCODING 12171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -42 -DB -DB -DB -DB -DB -FF -42 -42 -82 -ENDCHAR -STARTCHAR 2F8E -ENCODING 12174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -1000 -7F00 -5500 -5500 -5500 -5500 -5500 -5500 -FF80 -ENDCHAR -STARTCHAR 2F8F -ENCODING 12175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -4F00 -A000 -4000 -5F80 -C200 -C200 -4200 -4200 -4600 -ENDCHAR -STARTCHAR 2F90 -ENCODING 12176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -FF00 -1800 -1900 -2600 -E600 -A200 -2900 -7080 -ENDCHAR -STARTCHAR 2F92 -ENCODING 12178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -7E00 -4200 -7E00 -7E00 -1400 -2480 -C700 -ENDCHAR -STARTCHAR 2F93 -ENCODING 12179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -3C -44 -FF -7F -49 -49 -7F -81 -83 -ENDCHAR -STARTCHAR 2F94 -ENCODING 12180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -FF80 -0000 -7E00 -7E00 -0000 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 2F95 -ENCODING 12181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -24 -42 -99 -24 -42 -FF -42 -7E -42 -ENDCHAR -STARTCHAR 2F96 -ENCODING 12182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0000 -7E00 -4200 -7E00 -0000 -2400 -2400 -FF80 -ENDCHAR -STARTCHAR 2F97 -ENCODING 12183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -18 -75 -96 -6C -DA -69 -89 -18 -ENDCHAR -STARTCHAR 2F99 -ENCODING 12185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -42 -7E -42 -7E -42 -7E -66 -81 -ENDCHAR -STARTCHAR 2F9A -ENCODING 12186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F00 -0800 -0800 -FF00 -5600 -5500 -A500 -A480 -4C00 -ENDCHAR -STARTCHAR 2F9B -ENCODING 12187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -7E00 -0800 -FF00 -2800 -4E00 -4800 -6800 -9F80 -ENDCHAR -STARTCHAR 2F9C -ENCODING 12188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -4200 -7E00 -4800 -4F00 -4800 -B800 -9F80 -ENDCHAR -STARTCHAR 2F9D -ENCODING 12189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4200 -7E00 -7E80 -4300 -FE00 -0A00 -7200 -8600 -ENDCHAR -STARTCHAR 2F9E -ENCODING 12190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0800 -7E00 -7E00 -4A00 -7E00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 2F9F -ENCODING 12191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2200 -2400 -FF80 -0800 -FF00 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 2FA0 -ENCODING 12192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -40 -7F -40 -7F -6E -A6 -AB -F1 -ENDCHAR -STARTCHAR 2FA2 -ENCODING 12194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -0000 -FF00 -8900 -FF00 -8000 -8080 -7F00 -ENDCHAR -STARTCHAR 2FA3 -ENCODING 12195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -18 -7F -A9 -AF -7F -81 -7F -81 -ENDCHAR -STARTCHAR 2FA5 -ENCODING 12197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4900 -7E00 -4900 -7E00 -0800 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 2FA6 -ENCODING 12198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -2400 -4300 -BF80 -0800 -7F00 -4A00 -2C00 -FF80 -ENDCHAR -STARTCHAR 2FA7 -ENCODING 12199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7E -FF -4A -4C -5E -E1 -ENDCHAR -STARTCHAR 2FA8 -ENCODING 12200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -99 -FF -81 -81 -81 -81 -83 -ENDCHAR -STARTCHAR 2FA9 -ENCODING 12201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4200 -7E00 -7F00 -4100 -7F00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 2FAC -ENCODING 12204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -FF -ED -AB -ED -AB -89 -8B -ENDCHAR -STARTCHAR 2FAD -ENCODING 12205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7F00 -FF80 -0000 -7E00 -4900 -7E00 -4100 -4600 -ENDCHAR -STARTCHAR 2FAE -ENCODING 12206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -1400 -E780 -1400 -E700 -2400 -E780 -2400 -4400 -4400 -ENDCHAR -STARTCHAR 2FAF -ENCODING 12207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -1000 -FF00 -A500 -9D00 -A500 -9D00 -FF00 -8100 -ENDCHAR -STARTCHAR 2FB0 -ENCODING 12208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -3C00 -0800 -7F00 -8900 -7F00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 2FB1 -ENCODING 12209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -FF00 -0000 -7E00 -7E00 -FF00 -4800 -FF80 -0800 -ENDCHAR -STARTCHAR 2FB3 -ENCODING 12211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -24 -FF -00 -7E -42 -7E -7E -42 -ENDCHAR -STARTCHAR 2FB4 -ENCODING 12212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -10 -7E -7E -42 -7E -7E -26 -C1 -ENDCHAR -STARTCHAR 2FB5 -ENCODING 12213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -8D00 -B100 -BD00 -B500 -BD00 -9580 -8D80 -F380 -ENDCHAR -STARTCHAR 2FB6 -ENCODING 12214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FD00 -3600 -D300 -5280 -FD00 -5500 -5300 -5280 -9100 -ENDCHAR -STARTCHAR 2FB7 -ENCODING 12215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1C00 -7E00 -8180 -7E00 -7E00 -7E00 -4900 -5E00 -E100 -ENDCHAR -STARTCHAR 2FB8 -ENCODING 12216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -24 -FF -10 -7E -42 -7E -7E -7E -42 -ENDCHAR -STARTCHAR 2FB9 -ENCODING 12217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -7800 -FF00 -1400 -6A00 -FF80 -4200 -7E00 -4200 -7E00 -ENDCHAR -STARTCHAR 2FBA -ENCODING 12218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -48 -7E -7E -48 -7F -AD -AB -A3 -ENDCHAR -STARTCHAR 2FBB -ENCODING 12219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -4E -52 -FF -FF -7E -42 -7E -46 -ENDCHAR -STARTCHAR 2FBC -ENCODING 12220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7E00 -7E00 -0000 -FF00 -BD00 -BD00 -A100 -8300 -ENDCHAR -STARTCHAR 2FC1 -ENCODING 12225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4900 -7E00 -4900 -7E00 -2A00 -2F00 -4880 -8F00 -ENDCHAR -STARTCHAR 2FC2 -ENCODING 12226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -3C00 -4800 -FE00 -C900 -7E00 -7E00 -4100 -9500 -9480 -ENDCHAR -STARTCHAR 2FC3 -ENCODING 12227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -7E00 -4200 -7E00 -7F80 -7F00 -0500 -AB00 -AB00 -ENDCHAR -STARTCHAR 2FC4 -ENCODING 12228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -1F -10 -FF -AD -DB -BF -AB -FF -81 -ENDCHAR -STARTCHAR 2FC5 -ENCODING 12229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9400 -FF00 -FF00 -A400 -A500 -BE00 -BC80 -E700 -ENDCHAR -STARTCHAR 2FC6 -ENCODING 12230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2A00 -6A00 -3500 -6A00 -BF80 -5400 -1C00 -E300 -ENDCHAR -STARTCHAR 2FC7 -ENCODING 12231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -A200 -F700 -A200 -F700 -F700 -F780 -EB80 -A200 -ENDCHAR -STARTCHAR 2FC8 -ENCODING 12232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -3C00 -FF80 -0800 -7E00 -7E00 -7E00 -2600 -C180 -ENDCHAR -STARTCHAR 2FC9 -ENCODING 12233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -7C00 -FF00 -6E00 -9980 -6E00 -AB80 -3C00 -4E00 -9100 -ENDCHAR -STARTCHAR 2FCA -ENCODING 12234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -6B00 -6D00 -7F00 -7F00 -FF80 -0000 -A500 -9480 -ENDCHAR -STARTCHAR 2FCD -ENCODING 12237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -BD00 -BD00 -BD00 -8100 -F700 -F780 -5500 -9500 -ENDCHAR -STARTCHAR 2FCE -ENCODING 12238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -F200 -FF80 -0200 -FF00 -F500 -0600 -A600 -7D00 -C880 -ENDCHAR -STARTCHAR 2FCF -ENCODING 12239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8100 -FF00 -FF00 -B600 -B600 -B600 -B580 -D900 -ENDCHAR -STARTCHAR 2FD0 -ENCODING 12240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4200 -7E00 -0000 -7F00 -8900 -FF80 -3C00 -C400 -ENDCHAR -STARTCHAR 2FD1 -ENCODING 12241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -FF00 -AD00 -EE80 -4200 -7E00 -7E00 -8200 -8200 -ENDCHAR -STARTCHAR 2FD2 -ENCODING 12242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -2F00 -FF80 -A500 -BB00 -C900 -FF00 -A500 -DB00 -FF00 -ENDCHAR -STARTCHAR 2FD3 -ENCODING 12243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -F700 -A700 -F100 -F700 -9700 -F700 -F700 -9880 -B700 -ENDCHAR -STARTCHAR 2FD4 -ENCODING 12244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7C00 -FF00 -7700 -D700 -F500 -1B00 -F700 -3880 -5F00 -ENDCHAR -STARTCHAR 3000 -ENCODING 12288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 3001 -ENCODING 12289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 2 1 -2 -BITMAP -80 -40 -ENDCHAR -STARTCHAR 3002 -ENCODING 12290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 3 1 -2 -BITMAP -C0 -C0 -C0 -ENDCHAR -STARTCHAR 3003 -ENCODING 12291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 2 3 2 -BITMAP -50 -A0 -ENDCHAR -STARTCHAR 3008 -ENCODING 12296 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 8 1 -1 -BITMAP -10 -20 -40 -80 -80 -80 -40 -20 -ENDCHAR -STARTCHAR 3009 -ENCODING 12297 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 7 1 0 -BITMAP -80 -40 -20 -10 -20 -40 -80 -ENDCHAR -STARTCHAR 300A -ENCODING 12298 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 4 8 0 -1 -BITMAP -30 -20 -60 -C0 -C0 -60 -20 -30 -ENDCHAR -STARTCHAR 300B -ENCODING 12299 -SWIDTH 450 0 -DWIDTH 5 0 -BBX 3 8 1 -1 -BITMAP -C0 -A0 -60 -20 -20 -60 -A0 -C0 -ENDCHAR -STARTCHAR 300C -ENCODING 12300 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 4 5 0 3 -BITMAP -F0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 300D -ENCODING 12301 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 4 5 0 -1 -BITMAP -10 -10 -10 -10 -F0 -ENDCHAR -STARTCHAR 300E -ENCODING 12302 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 4 5 0 3 -BITMAP -F0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR 300F -ENCODING 12303 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 4 4 0 -1 -BITMAP -30 -30 -30 -F0 -ENDCHAR -STARTCHAR 3010 -ENCODING 12304 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 9 0 -1 -BITMAP -E0 -C0 -C0 -80 -80 -80 -C0 -C0 -E0 -ENDCHAR -STARTCHAR 3011 -ENCODING 12305 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 9 1 -1 -BITMAP -E0 -60 -60 -20 -20 -20 -60 -60 -E0 -ENDCHAR -STARTCHAR 3012 -ENCODING 12306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -0000 -0000 -FF80 -0800 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 3013 -ENCODING 12307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 3 3 2 -BITMAP -F8 -00 -F8 -ENDCHAR -STARTCHAR 3014 -ENCODING 12308 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 10 1 -2 -BITMAP -40 -80 -00 -00 -00 -00 -00 -00 -80 -40 -ENDCHAR -STARTCHAR 3015 -ENCODING 12309 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 2 10 1 -2 -BITMAP -80 -40 -40 -40 -40 -40 -40 -40 -40 -80 -ENDCHAR -STARTCHAR 3016 -ENCODING 12310 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 9 1 -1 -BITMAP -E0 -C0 -C0 -80 -80 -80 -C0 -C0 -C0 -ENDCHAR -STARTCHAR 3017 -ENCODING 12311 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 9 1 -1 -BITMAP -E0 -A0 -A0 -60 -60 -60 -A0 -A0 -E0 -ENDCHAR -STARTCHAR 3018 -ENCODING 12312 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 10 1 -2 -BITMAP -60 -80 -80 -80 -80 -80 -80 -80 -E0 -60 -ENDCHAR -STARTCHAR 3019 -ENCODING 12313 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 9 1 -2 -BITMAP -80 -60 -60 -60 -60 -60 -60 -60 -C0 -ENDCHAR -STARTCHAR 301C -ENCODING 12316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 3 2 2 -BITMAP -60 -94 -08 -ENDCHAR -STARTCHAR 301E -ENCODING 12318 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 4 2 0 5 -BITMAP -50 -A0 -ENDCHAR -STARTCHAR 301F -ENCODING 12319 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 2 1 -1 -BITMAP -A0 -40 -ENDCHAR -STARTCHAR 3020 -ENCODING 12320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -38 -36 -AF -88 -64 -55 -3E -ENDCHAR -STARTCHAR 3036 -ENCODING 12342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -7F40 -8040 -BF40 -8440 -8440 -4480 -2500 -1E00 -ENDCHAR -STARTCHAR 3041 -ENCODING 12353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 -1 -BITMAP -20 -70 -28 -74 -B4 -E4 -08 -ENDCHAR -STARTCHAR 3042 -ENCODING 12354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -10 -1C -30 -14 -2A -59 -91 -72 -04 -ENDCHAR -STARTCHAR 3043 -ENCODING 12355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 0 -BITMAP -80 -84 -84 -84 -60 -ENDCHAR -STARTCHAR 3044 -ENCODING 12356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 6 1 0 -BITMAP -80 -82 -81 -81 -50 -20 -ENDCHAR -STARTCHAR 3045 -ENCODING 12357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 7 3 -1 -BITMAP -20 -20 -D0 -10 -10 -10 -20 -ENDCHAR -STARTCHAR 3046 -ENCODING 12358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -40 -30 -00 -F0 -88 -08 -08 -10 -20 -ENDCHAR -STARTCHAR 3047 -ENCODING 12359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 -1 -BITMAP -20 -00 -E0 -40 -60 -A0 -18 -ENDCHAR -STARTCHAR 3048 -ENCODING 12360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -20 -10 -00 -F8 -10 -30 -50 -90 -0E -ENDCHAR -STARTCHAR 3049 -ENCODING 12361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 -1 -BITMAP -40 -64 -40 -78 -C4 -CC -40 -ENDCHAR -STARTCHAR 304A -ENCODING 12362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -20 -73 -21 -3C -62 -A2 -A2 -64 -ENDCHAR -STARTCHAR 304B -ENCODING 12363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -10 -3A -E5 -24 -44 -44 -88 -10 -ENDCHAR -STARTCHAR 304C -ENCODING 12364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -21 -32 -E9 -49 -48 -48 -88 -90 -ENDCHAR -STARTCHAR 304D -ENCODING 12365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -20 -38 -54 -38 -48 -38 -CC -80 -70 -ENDCHAR -STARTCHAR 304E -ENCODING 12366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -42 -74 -A0 -38 -D0 -70 -98 -80 -E0 -ENDCHAR -STARTCHAR 304F -ENCODING 12367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 8 3 0 -BITMAP -20 -20 -40 -80 -40 -20 -20 -10 -ENDCHAR -STARTCHAR 3050 -ENCODING 12368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -20 -4C -40 -80 -40 -20 -20 -10 -ENDCHAR -STARTCHAR 3051 -ENCODING 12369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -44 -4F -84 -84 -A4 -C4 -44 -08 -ENDCHAR -STARTCHAR 3052 -ENCODING 12370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -89 -8A -BC -88 -C8 -88 -88 -10 -ENDCHAR -STARTCHAR 3053 -ENCODING 12371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -78 -00 -00 -00 -00 -80 -7C -ENDCHAR -STARTCHAR 3054 -ENCODING 12372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -01 -32 -08 -00 -00 -00 -80 -7C -ENDCHAR -STARTCHAR 3055 -ENCODING 12373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -20 -24 -78 -10 -08 -7C -80 -40 -70 -ENDCHAR -STARTCHAR 3056 -ENCODING 12374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -21 -22 -78 -10 -08 -7C -80 -40 -70 -ENDCHAR -STARTCHAR 3057 -ENCODING 12375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -80 -80 -80 -80 -80 -80 -84 -8C -78 -ENDCHAR -STARTCHAR 3058 -ENCODING 12376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -80 -84 -48 -80 -80 -80 -84 -4C -78 -ENDCHAR -STARTCHAR 3059 -ENCODING 12377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -08 -FF -18 -28 -28 -38 -08 -30 -ENDCHAR -STARTCHAR 305A -ENCODING 12378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 1 -1 -BITMAP -0A -08 -FE -08 -30 -48 -38 -10 -30 -ENDCHAR -STARTCHAR 305B -ENCODING 12379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -0400 -2400 -3F80 -E400 -2400 -2000 -2000 -1C00 -ENDCHAR -STARTCHAR 305C -ENCODING 12380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -0480 -4400 -7F00 -C400 -4400 -4800 -2000 -1C00 -ENDCHAR -STARTCHAR 305D -ENCODING 12381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -78 -10 -20 -40 -FC -10 -20 -20 -18 -ENDCHAR -STARTCHAR 305E -ENCODING 12382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -68 -1B -20 -40 -FC -10 -20 -20 -18 -ENDCHAR -STARTCHAR 305F -ENCODING 12383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -20 -38 -60 -2E -20 -40 -40 -CF -ENDCHAR -STARTCHAR 3060 -ENCODING 12384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -23 -70 -20 -4E -40 -40 -50 -8E -ENDCHAR -STARTCHAR 3061 -ENCODING 12385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 0 -BITMAP -20 -F8 -20 -40 -7C -02 -04 -1C -ENDCHAR -STARTCHAR 3062 -ENCODING 12386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -22 -FC -20 -20 -3C -22 -02 -1C -ENDCHAR -STARTCHAR 3063 -ENCODING 12387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 0 -BITMAP -38 -C4 -04 -04 -18 -ENDCHAR -STARTCHAR 3064 -ENCODING 12388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 6 1 0 -BITMAP -1E -E1 -01 -01 -02 -0C -ENDCHAR -STARTCHAR 3065 -ENCODING 12389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 1 -BITMAP -0180 -3C00 -C200 -0100 -0200 -0200 -1C00 -ENDCHAR -STARTCHAR 3066 -ENCODING 12390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -1E -E8 -10 -20 -20 -10 -1C -04 -ENDCHAR -STARTCHAR 3067 -ENCODING 12391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 -1 -BITMAP -1E00 -E800 -1280 -1000 -1000 -1000 -0C00 -ENDCHAR -STARTCHAR 3068 -ENCODING 12392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -40 -40 -3C -20 -40 -80 -80 -7C -ENDCHAR -STARTCHAR 3069 -ENCODING 12393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 0 -BITMAP -86 -40 -78 -40 -80 -80 -80 -78 -ENDCHAR -STARTCHAR 306A -ENCODING 12394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 0 -BITMAP -40 -F4 -42 -88 -88 -18 -2E -38 -ENDCHAR -STARTCHAR 306B -ENCODING 12395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -80 -9C -80 -80 -80 -A0 -9E -80 -ENDCHAR -STARTCHAR 306C -ENCODING 12396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -10 -18 -76 -D1 -D1 -A7 -CB -04 -ENDCHAR -STARTCHAR 306D -ENCODING 12397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -4000 -6C00 -B200 -6100 -4100 -CE00 -4B80 -0400 -ENDCHAR -STARTCHAR 306E -ENCODING 12398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -1C -2A -49 -91 -91 -A1 -46 -ENDCHAR -STARTCHAR 306F -ENCODING 12399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -44 -8E -94 -84 -84 -DE -55 -18 -ENDCHAR -STARTCHAR 3070 -ENCODING 12400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -03 -84 -86 -B8 -84 -84 -9E -A5 -98 -ENDCHAR -STARTCHAR 3071 -ENCODING 12401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -03 -85 -86 -B8 -84 -84 -9C -A7 -18 -ENDCHAR -STARTCHAR 3072 -ENCODING 12402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -C8 -4C -8A -88 -88 -88 -90 -60 -ENDCHAR -STARTCHAR 3073 -ENCODING 12403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0280 -E400 -4400 -4600 -8400 -8400 -8800 -8800 -7000 -ENDCHAR -STARTCHAR 3074 -ENCODING 12404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0380 -E500 -4400 -4600 -8400 -8400 -8800 -8800 -7000 -ENDCHAR -STARTCHAR 3075 -ENCODING 12405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -18 -00 -00 -18 -08 -A5 -44 -18 -ENDCHAR -STARTCHAR 3076 -ENCODING 12406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -18 -00 -00 -18 -08 -A5 -44 -18 -ENDCHAR -STARTCHAR 3077 -ENCODING 12407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -03 -1B -00 -00 -18 -08 -A5 -44 -18 -ENDCHAR -STARTCHAR 3078 -ENCODING 12408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 4 1 1 -BITMAP -30 -4C -82 -01 -ENDCHAR -STARTCHAR 3079 -ENCODING 12409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -03 -30 -48 -86 -01 -ENDCHAR -STARTCHAR 307A -ENCODING 12410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 2 -BITMAP -03 -30 -48 -86 -01 -ENDCHAR -STARTCHAR 307B -ENCODING 12411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -5E -84 -9E -84 -84 -DE -55 -18 -ENDCHAR -STARTCHAR 307C -ENCODING 12412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -9C -89 -BE -88 -88 -9C -AA -98 -ENDCHAR -STARTCHAR 307D -ENCODING 12413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -9D80 -8900 -BE00 -8800 -8800 -9C00 -AA00 -9800 -ENDCHAR -STARTCHAR 307E -ENCODING 12414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -10 -F8 -10 -78 -10 -70 -9C -E0 -ENDCHAR -STARTCHAR 307F -ENCODING 12415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 -1 -BITMAP -78 -10 -12 -7A -A6 -A5 -C4 -ENDCHAR -STARTCHAR 3080 -ENCODING 12416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -20 -79 -21 -60 -A0 -E2 -22 -1E -ENDCHAR -STARTCHAR 3081 -ENCODING 12417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 -1 -BITMAP -08 -5C -6B -51 -B1 -A1 -D3 -ENDCHAR -STARTCHAR 3082 -ENCODING 12418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -20 -70 -20 -A0 -74 -44 -44 -38 -ENDCHAR -STARTCHAR 3083 -ENCODING 12419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 0 -BITMAP -9C -62 -C2 -2C -20 -10 -ENDCHAR -STARTCHAR 3084 -ENCODING 12420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -48 -4F -35 -E1 -27 -10 -10 -08 -ENDCHAR -STARTCHAR 3085 -ENCODING 12421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 -1 -BITMAP -10 -B8 -D4 -94 -B4 -98 -20 -ENDCHAR -STARTCHAR 3086 -ENCODING 12422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -44 -5E -A5 -C5 -C5 -5E -08 -10 -ENDCHAR -STARTCHAR 3087 -ENCODING 12423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 -1 -BITMAP -20 -30 -20 -20 -E0 -B8 -40 -ENDCHAR -STARTCHAR 3088 -ENCODING 12424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -10 -1C -10 -10 -10 -78 -94 -60 -ENDCHAR -STARTCHAR 3089 -ENCODING 12425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -30 -00 -40 -40 -B8 -44 -04 -38 -ENDCHAR -STARTCHAR 308A -ENCODING 12426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 8 3 -1 -BITMAP -88 -88 -88 -88 -88 -10 -10 -20 -ENDCHAR -STARTCHAR 308B -ENCODING 12427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -70 -10 -28 -74 -84 -34 -2C -38 -ENDCHAR -STARTCHAR 308C -ENCODING 12428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -40 -2C -F2 -62 -44 -C4 -45 -02 -ENDCHAR -STARTCHAR 308D -ENCODING 12429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -70 -10 -20 -7C -84 -04 -04 -18 -ENDCHAR -STARTCHAR 308E -ENCODING 12430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 -1 -BITMAP -40 -68 -74 -44 -C4 -44 -40 -ENDCHAR -STARTCHAR 308F -ENCODING 12431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -20 -30 -FE -21 -61 -61 -22 -20 -ENDCHAR -STARTCHAR 3090 -ENCODING 12432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -38 -08 -0C -33 -51 -AD -AA -4C -ENDCHAR -STARTCHAR 3091 -ENCODING 12433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 0 -BITMAP -70 -38 -64 -14 -38 -20 -DC -A2 -ENDCHAR -STARTCHAR 3092 -ENCODING 12434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -30 -C0 -60 -D4 -98 -28 -40 -38 -ENDCHAR -STARTCHAR 3093 -ENCODING 12435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -10 -20 -20 -40 -70 -92 -8A -0C -ENDCHAR -STARTCHAR 30A1 -ENCODING 12449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 -1 -BITMAP -FC -04 -28 -30 -20 -20 -40 -ENDCHAR -STARTCHAR 30A2 -ENCODING 12450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 -1 -BITMAP -FE -04 -28 -30 -20 -20 -40 -ENDCHAR -STARTCHAR 30A3 -ENCODING 12451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 -1 -BITMAP -08 -10 -60 -A0 -20 -20 -20 -ENDCHAR -STARTCHAR 30A4 -ENCODING 12452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -04 -08 -10 -70 -90 -10 -10 -10 -ENDCHAR -STARTCHAR 30A5 -ENCODING 12453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 3 -1 -BITMAP -20 -F8 -88 -08 -10 -20 -ENDCHAR -STARTCHAR 30A6 -ENCODING 12454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -10 -10 -FC -84 -84 -04 -08 -18 -20 -ENDCHAR -STARTCHAR 30A7 -ENCODING 12455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 0 -BITMAP -7C -10 -10 -10 -FC -ENDCHAR -STARTCHAR 30A8 -ENCODING 12456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -10 -10 -10 -10 -ENDCHAR -STARTCHAR 30A9 -ENCODING 12457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 3 0 -BITMAP -D8 -20 -50 -90 -10 -20 -ENDCHAR -STARTCHAR 30AA -ENCODING 12458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -08 -FE -18 -28 -48 -88 -08 -10 -ENDCHAR -STARTCHAR 30AB -ENCODING 12459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -20 -7C -22 -22 -24 -44 -C4 -88 -ENDCHAR -STARTCHAR 30AC -ENCODING 12460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -21 -7C -22 -22 -24 -64 -44 -88 -ENDCHAR -STARTCHAR 30AD -ENCODING 12461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -20 -3C -E0 -10 -FC -10 -10 -10 -ENDCHAR -STARTCHAR 30AE -ENCODING 12462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -06 -20 -38 -E0 -20 -FC -20 -20 -10 -ENDCHAR -STARTCHAR 30AF -ENCODING 12463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -20 -3C -44 -84 -08 -10 -20 -40 -ENDCHAR -STARTCHAR 30B0 -ENCODING 12464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -21 -3C -44 -84 -08 -10 -20 -40 -ENDCHAR -STARTCHAR 30B1 -ENCODING 12465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -10 -3F -44 -84 -08 -08 -10 -ENDCHAR -STARTCHAR 30B2 -ENCODING 12466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2080 -2100 -7E00 -4800 -8800 -0800 -1000 -1000 -2000 -ENDCHAR -STARTCHAR 30B3 -ENCODING 12467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -FC -04 -04 -04 -04 -7C -ENDCHAR -STARTCHAR 30B4 -ENCODING 12468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -03 -00 -FC -04 -04 -04 -04 -FC -ENDCHAR -STARTCHAR 30B5 -ENCODING 12469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -48 -48 -FE -48 -48 -08 -10 -20 -ENDCHAR -STARTCHAR 30B6 -ENCODING 12470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0080 -4500 -4400 -FE00 -4400 -4800 -0800 -1000 -2000 -ENDCHAR -STARTCHAR 30B7 -ENCODING 12471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -20 -00 -C1 -02 -04 -18 -60 -ENDCHAR -STARTCHAR 30B8 -ENCODING 12472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -23 -00 -C1 -02 -04 -18 -60 -ENDCHAR -STARTCHAR 30B9 -ENCODING 12473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -78 -08 -10 -28 -44 -80 -ENDCHAR -STARTCHAR 30BA -ENCODING 12474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -01 -02 -7C -08 -08 -14 -26 -C2 -ENDCHAR -STARTCHAR 30BB -ENCODING 12475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -40 -44 -7A -C4 -48 -40 -40 -3C -ENDCHAR -STARTCHAR 30BC -ENCODING 12476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -21 -24 -7A -A4 -24 -20 -20 -3E -ENDCHAR -STARTCHAR 30BD -ENCODING 12477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 -1 -BITMAP -82 -84 -44 -08 -08 -10 -20 -ENDCHAR -STARTCHAR 30BE -ENCODING 12478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0080 -0400 -8400 -4400 -0800 -0800 -1000 -2000 -4000 -ENDCHAR -STARTCHAR 30BF -ENCODING 12479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -20 -7C -C4 -AC -18 -18 -68 -C0 -ENDCHAR -STARTCHAR 30C0 -ENCODING 12480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -21 -7C -C4 -AC -18 -18 -68 -C0 -ENDCHAR -STARTCHAR 30C1 -ENCODING 12481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -04 -78 -10 -10 -FC -10 -20 -20 -C0 -ENDCHAR -STARTCHAR 30C2 -ENCODING 12482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -04 -78 -11 -10 -FE -10 -10 -20 -40 -ENDCHAR -STARTCHAR 30C3 -ENCODING 12483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 -1 -BITMAP -A4 -04 -08 -08 -10 -20 -ENDCHAR -STARTCHAR 30C4 -ENCODING 12484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 -1 -BITMAP -20 -92 -84 -04 -08 -10 -20 -ENDCHAR -STARTCHAR 30C5 -ENCODING 12485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -0080 -2100 -9200 -8400 -0400 -0800 -1000 -2000 -ENDCHAR -STARTCHAR 30C6 -ENCODING 12486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -78 -00 -FE -10 -10 -20 -20 -40 -ENDCHAR -STARTCHAR 30C7 -ENCODING 12487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0280 -7C00 -0000 -FE00 -1000 -1000 -1000 -2000 -4000 -ENDCHAR -STARTCHAR 30C8 -ENCODING 12488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 8 3 -1 -BITMAP -80 -80 -C0 -B0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 30C9 -ENCODING 12489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -10 -90 -80 -80 -E0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 30CA -ENCODING 12490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -10 -10 -FC -10 -10 -20 -20 -40 -ENDCHAR -STARTCHAR 30CB -ENCODING 12491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -7C -00 -00 -00 -FC -ENDCHAR -STARTCHAR 30CC -ENCODING 12492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 0 -BITMAP -F8 -08 -18 -70 -30 -58 -88 -ENDCHAR -STARTCHAR 30CD -ENCODING 12493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -10 -10 -FC -08 -10 -74 -92 -10 -10 -ENDCHAR -STARTCHAR 30CE -ENCODING 12494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 -1 -BITMAP -08 -08 -10 -10 -20 -40 -80 -ENDCHAR -STARTCHAR 30CF -ENCODING 12495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -04 -22 -22 -41 -C1 -ENDCHAR -STARTCHAR 30D0 -ENCODING 12496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 6 1 1 -BITMAP -0080 -2400 -2400 -4200 -4200 -8100 -ENDCHAR -STARTCHAR 30D1 -ENCODING 12497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 1 -BITMAP -0100 -0280 -2500 -2400 -4200 -4200 -8100 -ENDCHAR -STARTCHAR 30D2 -ENCODING 12498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -80 -88 -B0 -C0 -80 -80 -80 -7C -ENDCHAR -STARTCHAR 30D3 -ENCODING 12499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -04 -88 -B0 -C0 -80 -80 -80 -78 -ENDCHAR -STARTCHAR 30D4 -ENCODING 12500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -06 -06 -88 -B0 -C0 -80 -80 -80 -78 -ENDCHAR -STARTCHAR 30D5 -ENCODING 12501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -FC -04 -04 -04 -08 -10 -60 -40 -ENDCHAR -STARTCHAR 30D6 -ENCODING 12502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -06 -F8 -04 -08 -08 -10 -20 -40 -80 -ENDCHAR -STARTCHAR 30D7 -ENCODING 12503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -06 -FA -04 -08 -08 -10 -20 -40 -80 -ENDCHAR -STARTCHAR 30D8 -ENCODING 12504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 4 1 1 -BITMAP -30 -48 -86 -01 -ENDCHAR -STARTCHAR 30D9 -ENCODING 12505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -03 -30 -48 -86 -01 -ENDCHAR -STARTCHAR 30DA -ENCODING 12506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 2 -BITMAP -03 -30 -48 -86 -01 -ENDCHAR -STARTCHAR 30DB -ENCODING 12507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -10 -FE -10 -14 -94 -92 -10 -20 -ENDCHAR -STARTCHAR 30DC -ENCODING 12508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -10 -FE -10 -10 -52 -91 -10 -10 -ENDCHAR -STARTCHAR 30DD -ENCODING 12509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -03 -11 -FE -10 -10 -52 -D1 -10 -10 -ENDCHAR -STARTCHAR 30DE -ENCODING 12510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 0 -BITMAP -FE -04 -0C -38 -10 -18 -ENDCHAR -STARTCHAR 30DF -ENCODING 12511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 7 3 -1 -BITMAP -60 -10 -C0 -20 -00 -C0 -30 -ENDCHAR -STARTCHAR 30E0 -ENCODING 12512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -10 -10 -10 -20 -22 -41 -FF -ENDCHAR -STARTCHAR 30E1 -ENCODING 12513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -04 -04 -28 -18 -1C -20 -C0 -ENDCHAR -STARTCHAR 30E2 -ENCODING 12514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -7E -10 -10 -FF -10 -10 -10 -0E -ENDCHAR -STARTCHAR 30E3 -ENCODING 12515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 0 -BITMAP -2C -F4 -28 -20 -20 -ENDCHAR -STARTCHAR 30E4 -ENCODING 12516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -40 -4E -F2 -24 -20 -20 -20 -10 -ENDCHAR -STARTCHAR 30E5 -ENCODING 12517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 0 -BITMAP -78 -08 -08 -08 -FC -ENDCHAR -STARTCHAR 30E6 -ENCODING 12518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 6 1 0 -BITMAP -7E -04 -04 -04 -04 -FF -ENDCHAR -STARTCHAR 30E7 -ENCODING 12519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 0 -BITMAP -F8 -08 -F8 -08 -F8 -ENDCHAR -STARTCHAR 30E8 -ENCODING 12520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -7C -04 -FC -04 -04 -FC -ENDCHAR -STARTCHAR 30E9 -ENCODING 12521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -78 -00 -FC -04 -04 -08 -10 -20 -ENDCHAR -STARTCHAR 30EA -ENCODING 12522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 8 3 -1 -BITMAP -90 -90 -90 -90 -10 -10 -20 -40 -ENDCHAR -STARTCHAR 30EB -ENCODING 12523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 -1 -BITMAP -0800 -4800 -4800 -4980 -4900 -4A00 -8C00 -ENDCHAR -STARTCHAR 30EC -ENCODING 12524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -80 -80 -80 -84 -8C -90 -E0 -ENDCHAR -STARTCHAR 30ED -ENCODING 12525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -FC -84 -84 -84 -84 -FC -ENDCHAR -STARTCHAR 30EE -ENCODING 12526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 3 -1 -BITMAP -F8 -88 -08 -10 -10 -20 -ENDCHAR -STARTCHAR 30EF -ENCODING 12527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 -1 -BITMAP -FC -84 -84 -04 -04 -08 -10 -ENDCHAR -STARTCHAR 30F0 -ENCODING 12528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -08 -08 -FC -48 -48 -48 -BE -08 -08 -ENDCHAR -STARTCHAR 30F1 -ENCODING 12529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -7E -03 -02 -1C -10 -10 -FF -ENDCHAR -STARTCHAR 30F2 -ENCODING 12530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -FC -04 -04 -FC -08 -10 -20 -40 -ENDCHAR -STARTCHAR 30F3 -ENCODING 12531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -80 -40 -02 -04 -18 -20 -C0 -ENDCHAR -STARTCHAR 30F4 -ENCODING 12532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 1 -1 -BITMAP -12 -10 -FE -84 -84 -04 -08 -18 -20 -ENDCHAR -STARTCHAR 30F5 -ENCODING 12533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 3 0 -BITMAP -F0 -48 -48 -48 -88 -10 -ENDCHAR -STARTCHAR 30F6 -ENCODING 12534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 -1 -BITMAP -20 -34 -48 -88 -10 -10 -20 -ENDCHAR -STARTCHAR 30FB -ENCODING 12539 -SWIDTH 270 0 -DWIDTH 3 0 -BBX 1 1 1 3 -BITMAP -80 -ENDCHAR -STARTCHAR 30FC -ENCODING 12540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 1 0 3 -BITMAP -FFC0 -ENDCHAR -STARTCHAR 3131 -ENCODING 12593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -F8 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 3132 -ENCODING 12594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -24 -24 -24 -24 -ENDCHAR -STARTCHAR 3133 -ENCODING 12595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -E4 -14 -16 -1A -19 -ENDCHAR -STARTCHAR 3134 -ENCODING 12596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -80 -80 -80 -80 -F8 -ENDCHAR -STARTCHAR 3135 -ENCODING 12597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -8E -82 -82 -86 -E9 -ENDCHAR -STARTCHAR 3136 -ENCODING 12598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 1 -BITMAP -1C -80 -BE -88 -94 -FC -ENDCHAR -STARTCHAR 3137 -ENCODING 12599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -80 -80 -80 -FC -ENDCHAR -STARTCHAR 3138 -ENCODING 12600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -FC -90 -90 -90 -FE -ENDCHAR -STARTCHAR 3139 -ENCODING 12601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -04 -FC -80 -FC -ENDCHAR -STARTCHAR 313A -ENCODING 12602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -24 -E4 -84 -E4 -ENDCHAR -STARTCHAR 313B -ENCODING 12603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -EC -34 -F4 -94 -EC -ENDCHAR -STARTCHAR 313C -ENCODING 12604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -F4 -34 -FC -94 -FC -ENDCHAR -STARTCHAR 313D -ENCODING 12605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -E4 -14 -E4 -86 -E9 -ENDCHAR -STARTCHAR 313E -ENCODING 12606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -30 -FC -90 -FC -ENDCHAR -STARTCHAR 313F -ENCODING 12607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -FE -2C -EC -8C -FE -ENDCHAR -STARTCHAR 3140 -ENCODING 12608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 6 2 1 -BITMAP -0C -E0 -3E -EC -12 -FC -ENDCHAR -STARTCHAR 3141 -ENCODING 12609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -F8 -88 -88 -88 -F8 -ENDCHAR -STARTCHAR 3142 -ENCODING 12610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -88 -88 -F8 -88 -F8 -ENDCHAR -STARTCHAR 3143 -ENCODING 12611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -B4 -B4 -FC -B4 -EC -ENDCHAR -STARTCHAR 3144 -ENCODING 12612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -28 -28 -C8 -34 -D2 -ENDCHAR -STARTCHAR 3145 -ENCODING 12613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -10 -20 -30 -48 -84 -ENDCHAR -STARTCHAR 3146 -ENCODING 12614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -48 -48 -EC -92 -20 -ENDCHAR -STARTCHAR 3147 -ENCODING 12615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -78 -44 -84 -44 -78 -ENDCHAR -STARTCHAR 3148 -ENCODING 12616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -FC -08 -10 -78 -86 -ENDCHAR -STARTCHAR 3149 -ENCODING 12617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -7E -12 -34 -CB -10 -ENDCHAR -STARTCHAR 314A -ENCODING 12618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 1 -BITMAP -30 -00 -FC -08 -38 -C4 -ENDCHAR -STARTCHAR 314B -ENCODING 12619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 5 3 1 -BITMAP -F8 -08 -F8 -08 -08 -ENDCHAR -STARTCHAR 314C -ENCODING 12620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -80 -FC -80 -FC -ENDCHAR -STARTCHAR 314D -ENCODING 12621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -FC -48 -48 -48 -FC -ENDCHAR -STARTCHAR 314E -ENCODING 12622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -78 -00 -FC -00 -78 -44 -78 -ENDCHAR -STARTCHAR 314F -ENCODING 12623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 4 -2 -BITMAP -80 -80 -80 -80 -80 -C0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 3150 -ENCODING 12624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -90 -90 -90 -90 -90 -F0 -90 -90 -90 -90 -90 -ENDCHAR -STARTCHAR 3151 -ENCODING 12625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 4 -2 -BITMAP -80 -80 -80 -C0 -80 -80 -80 -C0 -80 -80 -80 -ENDCHAR -STARTCHAR 3152 -ENCODING 12626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -90 -90 -90 -F0 -90 -90 -F0 -90 -90 -90 -90 -ENDCHAR -STARTCHAR 3153 -ENCODING 12627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 11 4 -2 -BITMAP -20 -20 -20 -20 -20 -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 3154 -ENCODING 12628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -30 -30 -30 -30 -30 -D0 -30 -30 -30 -30 -30 -ENDCHAR -STARTCHAR 3155 -ENCODING 12629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 11 4 -2 -BITMAP -20 -20 -20 -E0 -20 -20 -E0 -20 -20 -20 -20 -ENDCHAR -STARTCHAR 3156 -ENCODING 12630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -30 -30 -30 -D0 -30 -30 -D0 -30 -30 -30 -30 -ENDCHAR -STARTCHAR 3157 -ENCODING 12631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 4 0 1 -BITMAP -0400 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR 3158 -ENCODING 12632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0200 -0200 -0200 -0200 -2200 -2380 -2200 -2200 -FE00 -0200 -0200 -ENDCHAR -STARTCHAR 3159 -ENCODING 12633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0280 -0280 -0280 -0280 -2280 -2380 -2280 -2280 -FA80 -0280 -0280 -ENDCHAR -STARTCHAR 315A -ENCODING 12634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -01 -01 -01 -11 -11 -11 -11 -FF -01 -01 -ENDCHAR -STARTCHAR 315B -ENCODING 12635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 4 0 1 -BITMAP -1200 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR 315C -ENCODING 12636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 5 0 0 -BITMAP -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR 315D -ENCODING 12637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -01 -01 -01 -01 -FF -11 -17 -11 -11 -01 -ENDCHAR -STARTCHAR 315E -ENCODING 12638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0280 -0280 -0280 -0280 -0280 -FA80 -2280 -2E80 -2280 -2280 -0280 -ENDCHAR -STARTCHAR 315F -ENCODING 12639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -01 -01 -01 -01 -FF -11 -11 -11 -11 -01 -ENDCHAR -STARTCHAR 3160 -ENCODING 12640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 5 0 0 -BITMAP -FFC0 -1200 -1200 -1200 -1200 -ENDCHAR -STARTCHAR 3161 -ENCODING 12641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 1 0 2 -BITMAP -FFC0 -ENDCHAR -STARTCHAR 3162 -ENCODING 12642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -01 -01 -01 -01 -01 -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR 3163 -ENCODING 12643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 11 5 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 3164 -ENCODING 12644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 0 0 0 0 -BITMAP -ENDCHAR -STARTCHAR 3165 -ENCODING 12645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -90 -90 -90 -90 -FC -ENDCHAR -STARTCHAR 3166 -ENCODING 12646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -9C -90 -90 -90 -FC -ENDCHAR -STARTCHAR 3167 -ENCODING 12647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -84 -84 -84 -8A -69 -ENDCHAR -STARTCHAR 3168 -ENCODING 12648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -88 -88 -8C -94 -FC -ENDCHAR -STARTCHAR 3169 -ENCODING 12649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 1 1 -BITMAP -F800 -4A00 -CA00 -8B00 -CC80 -ENDCHAR -STARTCHAR 316A -ENCODING 12650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -EC -30 -F0 -90 -FE -ENDCHAR -STARTCHAR 316B -ENCODING 12651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 1 1 -BITMAP -C800 -5A00 -DA00 -9B00 -FC80 -ENDCHAR -STARTCHAR 316C -ENCODING 12652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -E0 -28 -EC -94 -FC -ENDCHAR -STARTCHAR 316D -ENCODING 12653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -FE -20 -EC -92 -EC -ENDCHAR -STARTCHAR 316E -ENCODING 12654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -F0 -B4 -BC -B4 -FC -ENDCHAR -STARTCHAR 316F -ENCODING 12655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -C8 -28 -28 -34 -D2 -ENDCHAR -STARTCHAR 3170 -ENCODING 12656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -E0 -A8 -AC -B4 -FC -ENDCHAR -STARTCHAR 3171 -ENCODING 12657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -7C -84 -84 -FC -10 -28 -28 -10 -ENDCHAR -STARTCHAR 3172 -ENCODING 12658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -BC -A4 -E4 -A4 -E4 -ENDCHAR -STARTCHAR 3173 -ENCODING 12659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -BC -B0 -F0 -B0 -FC -ENDCHAR -STARTCHAR 3174 -ENCODING 12660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -AB -A9 -E9 -AD -F3 -ENDCHAR -STARTCHAR 3175 -ENCODING 12661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 1 1 -BITMAP -8B00 -AA00 -CA00 -BA00 -D780 -ENDCHAR -STARTCHAR 3176 -ENCODING 12662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -8E -A2 -E2 -A6 -E9 -ENDCHAR -STARTCHAR 3177 -ENCODING 12663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -AC -B0 -EC -B0 -FC -ENDCHAR -STARTCHAR 3178 -ENCODING 12664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 8 3 -1 -BITMAP -08 -F8 -88 -F8 -20 -50 -50 -20 -ENDCHAR -STARTCHAR 3179 -ENCODING 12665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -B0 -FC -B4 -FC -10 -28 -28 -10 -ENDCHAR -STARTCHAR 317A -ENCODING 12666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 1 -BITMAP -3C -24 -64 -64 -94 -ENDCHAR -STARTCHAR 317B -ENCODING 12667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -48 -48 -48 -A8 -9E -ENDCHAR -STARTCHAR 317C -ENCODING 12668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -4E -48 -48 -A8 -9E -ENDCHAR -STARTCHAR 317D -ENCODING 12669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -4A -4A -4E -AA -9E -ENDCHAR -STARTCHAR 317E -ENCODING 12670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -0E -21 -62 -66 -99 -ENDCHAR -STARTCHAR 317F -ENCODING 12671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 4 3 2 -BITMAP -60 -60 -90 -F0 -ENDCHAR -STARTCHAR 3180 -ENCODING 12672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 5 2 1 -BITMAP -CC -AA -B2 -AA -CC -ENDCHAR -STARTCHAR 3181 -ENCODING 12673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 0 -BITMAP -30 -48 -84 -84 -48 -30 -ENDCHAR -STARTCHAR 3182 -ENCODING 12674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -20 -54 -96 -96 -79 -ENDCHAR -STARTCHAR 3183 -ENCODING 12675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -20 -52 -96 -95 -7F -ENDCHAR -STARTCHAR 3184 -ENCODING 12676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -FC -48 -48 -FC -10 -28 -28 -10 -ENDCHAR -STARTCHAR 3185 -ENCODING 12677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 5 1 1 -BITMAP -66 -FF -66 -95 -77 -ENDCHAR -STARTCHAR 3186 -ENCODING 12678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 6 3 0 -BITMAP -F8 -70 -88 -88 -90 -60 -ENDCHAR -STARTCHAR 3187 -ENCODING 12679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 11 2 -2 -BITMAP -04 -04 -04 -06 -84 -94 -94 -BE -44 -04 -04 -ENDCHAR -STARTCHAR 3188 -ENCODING 12680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -0080 -0280 -0280 -0280 -5380 -5280 -5280 -FB80 -0280 -0280 -ENDCHAR -STARTCHAR 3189 -ENCODING 12681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 11 2 -2 -BITMAP -02 -02 -02 -02 -42 -52 -52 -7E -82 -02 -02 -ENDCHAR -STARTCHAR 318A -ENCODING 12682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -01 -01 -01 -01 -FD -2F -29 -2F -29 -ENDCHAR -STARTCHAR 318B -ENCODING 12683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0080 -0280 -0280 -0280 -0280 -FA80 -5680 -5280 -5680 -1280 -0080 -ENDCHAR -STARTCHAR 318C -ENCODING 12684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -01 -01 -01 -01 -FF -29 -29 -29 -29 -ENDCHAR -STARTCHAR 318D -ENCODING 12685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 1 5 3 -BITMAP -80 -ENDCHAR -STARTCHAR 318E -ENCODING 12686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -10 -10 -10 -10 -10 -D0 -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR 3200 -ENCODING 12800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -BF40 -8140 -8140 -8140 -8140 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 3201 -ENCODING 12801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -9040 -9040 -9040 -9040 -9F40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 3202 -ENCODING 12802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -BF40 -A040 -A040 -A040 -BF40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 3203 -ENCODING 12803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -BF40 -8140 -BF40 -A040 -BF40 -8040 -4080 -4000 -ENDCHAR -STARTCHAR 3204 -ENCODING 12804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -9F40 -A140 -A140 -A140 -9F40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 3205 -ENCODING 12805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -4080 -4040 -8040 -A140 -9F40 -A140 -9F40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 3206 -ENCODING 12806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8440 -8440 -8C40 -8C40 -9240 -A140 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 3207 -ENCODING 12807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -4080 -4040 -8E40 -9140 -A140 -A140 -9140 -8E40 -4040 -4080 -ENDCHAR -STARTCHAR 3208 -ENCODING 12808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -BF40 -8440 -8C40 -9240 -A140 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 3209 -ENCODING 12809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -8040 -BF40 -8440 -8C40 -9A40 -A140 -4040 -4080 -ENDCHAR -STARTCHAR 320A -ENCODING 12810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -9F40 -8140 -BF40 -8140 -8140 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 320B -ENCODING 12811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -9F40 -A040 -9F40 -A040 -9F40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 320C -ENCODING 12812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8040 -BF40 -9240 -9240 -9240 -BF40 -8040 -4040 -4080 -ENDCHAR -STARTCHAR 320D -ENCODING 12813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4040 -8E40 -8040 -BF40 -8040 -9E40 -9140 -9E40 -4040 -4080 -ENDCHAR -STARTCHAR 320E -ENCODING 12814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -BD40 -8540 -8540 -89C0 -8940 -9140 -A140 -4140 -4080 -ENDCHAR -STARTCHAR 320F -ENCODING 12815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -8140 -A140 -A140 -A1C0 -A140 -BF40 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 3210 -ENCODING 12816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -BD40 -A140 -A140 -A1C0 -A140 -BD40 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 3211 -ENCODING 12817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -BD40 -8540 -BD40 -A1C0 -A140 -BF40 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 3212 -ENCODING 12818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -BD40 -A540 -A540 -A5C0 -A540 -BD40 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 3213 -ENCODING 12819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -8140 -A540 -A540 -BDC0 -A540 -BD40 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 3214 -ENCODING 12820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -9140 -9140 -9140 -99C0 -A940 -E540 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 3215 -ENCODING 12821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -9940 -A540 -A540 -A5C0 -A540 -9940 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 3216 -ENCODING 12822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -BD40 -8940 -8940 -99C0 -9540 -A540 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 3217 -ENCODING 12823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -9940 -8140 -BD40 -89C0 -9540 -A340 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 3218 -ENCODING 12824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -BD40 -8540 -BD40 -89C0 -8940 -9140 -A140 -4140 -4080 -ENDCHAR -STARTCHAR 3219 -ENCODING 12825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -BD40 -A140 -BD40 -A1C0 -A140 -BF40 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 321A -ENCODING 12826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -BD40 -8140 -9540 -95C0 -9540 -BF40 -8140 -4140 -4080 -ENDCHAR -STARTCHAR 321B -ENCODING 12827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4140 -9940 -8140 -BD40 -81C0 -9940 -A540 -9940 -4140 -4080 -ENDCHAR -STARTCHAR 321C -ENCODING 12828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -4080 -7F40 -8440 -9A40 -A140 -FFC0 -8440 -8440 -4440 -4080 -ENDCHAR -STARTCHAR 3231 -ENCODING 12849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -5280 -5640 -7F40 -9A40 -BFC0 -BA40 -9740 -9AC0 -5240 -4080 -ENDCHAR -STARTCHAR 3239 -ENCODING 12857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -4080 -5640 -9440 -AF40 -E440 -A440 -A240 -A2C0 -4140 -4080 -ENDCHAR -STARTCHAR 3251 -ENCODING 12881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5880 -6540 -A540 -8940 -9140 -A140 -7D80 -2100 -1E00 -ENDCHAR -STARTCHAR 3252 -ENCODING 12882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5380 -6CC0 -A4C0 -8940 -9240 -A440 -7F80 -2100 -1E00 -ENDCHAR -STARTCHAR 3253 -ENCODING 12883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5380 -6CC0 -A8C0 -8940 -90C0 -A4C0 -7B80 -2100 -1E00 -ENDCHAR -STARTCHAR 3254 -ENCODING 12884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5080 -6940 -A740 -8B40 -9740 -A140 -7880 -2100 -1E00 -ENDCHAR -STARTCHAR 3255 -ENCODING 12885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5280 -6840 -AF40 -8CC0 -90C0 -A4C0 -7B80 -2100 -1E00 -ENDCHAR -STARTCHAR 3256 -ENCODING 12886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5180 -6AC0 -A540 -8EC0 -94C0 -A4C0 -7B80 -2100 -1E00 -ENDCHAR -STARTCHAR 3257 -ENCODING 12887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5080 -6BC0 -A940 -8A40 -9240 -A240 -7A80 -2100 -1E00 -ENDCHAR -STARTCHAR 3258 -ENCODING 12888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5380 -6CC0 -ACC0 -8B40 -94C0 -A4C0 -7B80 -2100 -1E00 -ENDCHAR -STARTCHAR 3259 -ENCODING 12889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5380 -6CC0 -A4C0 -8CC0 -93C0 -A0C0 -7B80 -2100 -1E00 -ENDCHAR -STARTCHAR 325A -ENCODING 12890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -5180 -6AC0 -8CC0 -9CC0 -84C0 -ACC0 -5380 -2100 -1E00 -ENDCHAR -STARTCHAR 3260 -ENCODING 12896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -BE40 -8140 -8140 -8140 -4140 -4080 -3F00 -ENDCHAR -STARTCHAR 3261 -ENCODING 12897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -9040 -9040 -9040 -9F40 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 3262 -ENCODING 12898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -9F40 -A040 -A040 -9F40 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 3263 -ENCODING 12899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -5F40 -8140 -9F40 -A040 -9F40 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 3264 -ENCODING 12900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -9F40 -9140 -9140 -9F40 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 3265 -ENCODING 12901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -9140 -9F40 -9140 -9F40 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 3266 -ENCODING 12902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4440 -8440 -8C40 -9240 -A140 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 3267 -ENCODING 12903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -9E40 -9140 -A140 -9140 -9E40 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 3268 -ENCODING 12904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -BF40 -8440 -8A40 -B140 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 3269 -ENCODING 12905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4C40 -8040 -BF40 -8440 -8A40 -7140 -4080 -3F00 -ENDCHAR -STARTCHAR 326A -ENCODING 12906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -9F40 -8140 -BF40 -8140 -4140 -4080 -3F00 -ENDCHAR -STARTCHAR 326B -ENCODING 12907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -9F40 -A040 -9F40 -A040 -5F40 -4080 -3F00 -ENDCHAR -STARTCHAR 326C -ENCODING 12908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4080 -4040 -BF40 -9240 -9240 -BF40 -4040 -4080 -3F00 -ENDCHAR -STARTCHAR 326D -ENCODING 12909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -4080 -4E40 -8040 -BF40 -8040 -9E40 -9140 -5E80 -2080 -1F00 -ENDCHAR -STARTCHAR 326E -ENCODING 12910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -5D40 -8540 -8940 -9140 -A140 -4140 -4080 -3F00 -ENDCHAR -STARTCHAR 326F -ENCODING 12911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -4140 -A140 -A140 -A140 -BD40 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 3270 -ENCODING 12912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -7940 -A140 -A140 -A140 -BD40 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 3271 -ENCODING 12913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -5D40 -8540 -B940 -A140 -BD40 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 3272 -ENCODING 12914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -7D40 -A540 -A5C0 -A540 -BD40 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 3273 -ENCODING 12915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -4140 -A540 -BDC0 -A540 -BD40 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 3274 -ENCODING 12916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -4940 -8940 -9940 -9940 -A540 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 3275 -ENCODING 12917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -7940 -A540 -A540 -A540 -B940 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 3276 -ENCODING 12918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -5940 -8940 -9940 -9940 -A540 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 3277 -ENCODING 12919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -4140 -8140 -9940 -9940 -A540 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 3278 -ENCODING 12920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -4D40 -8540 -9D40 -8940 -9140 -6140 -4180 -3F00 -ENDCHAR -STARTCHAR 3279 -ENCODING 12921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -7940 -A140 -B940 -A140 -BD40 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 327A -ENCODING 12922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -5940 -8140 -9540 -9940 -BD40 -4140 -4180 -3F00 -ENDCHAR -STARTCHAR 327B -ENCODING 12923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4180 -4140 -8140 -BD40 -A540 -A540 -5940 -4180 -3F00 -ENDCHAR -STARTCHAR 327F -ENCODING 12927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3C00 -4300 -A500 -A800 -D380 -2880 -AC80 -A500 -4200 -3C00 -ENDCHAR -STARTCHAR 328A -ENCODING 12938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1F00 -7E80 -5140 -9D40 -9140 -9940 -5140 -6080 -3F00 -ENDCHAR -STARTCHAR 328B -ENCODING 12939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1F00 -6080 -4440 -9540 -A440 -8C40 -5240 -6180 -3F00 -ENDCHAR -STARTCHAR 328C -ENCODING 12940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1F00 -6480 -4540 -9E40 -8C40 -9640 -6540 -4C80 -3F00 -ENDCHAR -STARTCHAR 328D -ENCODING 12941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1F00 -6080 -4440 -9E40 -8C40 -9640 -6540 -4480 -3F00 -ENDCHAR -STARTCHAR 328E -ENCODING 12942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1F00 -6480 -4A40 -9140 -A440 -8C40 -5640 -7F80 -3F00 -ENDCHAR -STARTCHAR 328F -ENCODING 12943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1F00 -6080 -4440 -9E40 -8440 -8440 -4440 -7F80 -3F00 -ENDCHAR -STARTCHAR 3290 -ENCODING 12944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1F00 -6E80 -5140 -9140 -9E40 -9140 -5140 -4E80 -3F00 -ENDCHAR -STARTCHAR 3294 -ENCODING 12948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -4880 -5E40 -B440 -9840 -BF40 -9140 -5F80 -3F00 -ENDCHAR -STARTCHAR 329E -ENCODING 12958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -4A80 -7540 -A540 -BD40 -A540 -BD40 -6480 -2100 -1E00 -ENDCHAR -STARTCHAR 32A5 -ENCODING 12965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -4480 -4440 -BF40 -A540 -BF40 -8440 -4480 -3F00 -ENDCHAR -STARTCHAR 3380 -ENCODING 13184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -2 -BITMAP -0600 -4600 -A600 -9900 -9F00 -9900 -9080 -E000 -8000 -ENDCHAR -STARTCHAR 3381 -ENCODING 13185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -0200 -4600 -A500 -A500 -9F00 -9900 -9080 -ENDCHAR -STARTCHAR 3382 -ENCODING 13186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -0100 -0300 -2A80 -2A80 -2B80 -5440 -5C40 -6000 -8000 -ENDCHAR -STARTCHAR 3383 -ENCODING 13187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 7 0 0 -BITMAP -0100 -5300 -AA80 -AA80 -AB80 -AC40 -AC40 -ENDCHAR -STARTCHAR 3384 -ENCODING 13188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -8200 -8600 -A500 -C900 -CF00 -A900 -B880 -ENDCHAR -STARTCHAR 3388 -ENCODING 13192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -45 -AB -83 -87 -8B -AA -44 -ENDCHAR -STARTCHAR 3389 -ENCODING 13193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -0080 -9280 -ED80 -A580 -A380 -E580 -2D80 -1200 -ENDCHAR -STARTCHAR 338A -ENCODING 13194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -0F -48 -B8 -9F -98 -98 -98 -E0 -80 -ENDCHAR -STARTCHAR 338B -ENCODING 13195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -0F -68 -98 -9F -98 -98 -98 -ENDCHAR -STARTCHAR 338C -ENCODING 13196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -2 -BITMAP -0F -08 -58 -57 -58 -A8 -A8 -D0 -ENDCHAR -STARTCHAR 338D -ENCODING 13197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 -2 -BITMAP -4F80 -5880 -5880 -9480 -A780 -D080 -0700 -ENDCHAR -STARTCHAR 338E -ENCODING 13198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 -2 -BITMAP -F780 -D880 -D880 -D880 -D780 -0080 -0700 -ENDCHAR -STARTCHAR 338F -ENCODING 13199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -80 -82 -A5 -C9 -A9 -A9 -97 -09 -07 -ENDCHAR -STARTCHAR 3390 -ENCODING 13200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -90 -90 -97 -F1 -92 -94 -97 -ENDCHAR -STARTCHAR 3391 -ENCODING 13201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 7 0 0 -BITMAP -9200 -9200 -B2C0 -CE80 -D280 -B300 -B380 -ENDCHAR -STARTCHAR 3392 -ENCODING 13202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -3400 -B400 -B580 -BD00 -7500 -7500 -7700 -ENDCHAR -STARTCHAR 3393 -ENCODING 13203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4000 -B000 -B400 -9580 -7C80 -9500 -B500 -B200 -4100 -ENDCHAR -STARTCHAR 3394 -ENCODING 13204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -D400 -5400 -5580 -5D00 -5500 -5500 -5700 -ENDCHAR -STARTCHAR 3395 -ENCODING 13205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -2 -BITMAP -0100 -0280 -0280 -2A80 -4B00 -5300 -5200 -9500 -F200 -ENDCHAR -STARTCHAR 3396 -ENCODING 13206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0100 -0280 -5280 -AA80 -AB00 -AB00 -AA00 -AD00 -0200 -ENDCHAR -STARTCHAR 3397 -ENCODING 13207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -01 -0B -2B -DB -8D -8D -8A -9D -62 -ENDCHAR -STARTCHAR 3398 -ENCODING 13208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 0 -BITMAP -83 -85 -95 -A5 -E6 -A4 -9D -02 -ENDCHAR -STARTCHAR 3399 -ENCODING 13209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -80 -90 -AE -AA -AA -AA -AA -ENDCHAR -STARTCHAR 339A -ENCODING 13210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 1 0 -BITMAP -EF80 -AA80 -AA80 -AA80 -AA80 -ENDCHAR -STARTCHAR 339B -ENCODING 13211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 6 1 -2 -BITMAP -5F80 -5A80 -5A80 -AA80 -AA80 -D000 -ENDCHAR -STARTCHAR 339C -ENCODING 13212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 5 1 0 -BITMAP -FF80 -DA80 -DA80 -DA80 -DA80 -ENDCHAR -STARTCHAR 339D -ENCODING 13213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 6 1 -1 -BITMAP -FF80 -9A80 -8A80 -8A80 -9A80 -6000 -ENDCHAR -STARTCHAR 339E -ENCODING 13214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -8000 -8500 -AA80 -CA80 -CA80 -AA80 -AA80 -ENDCHAR -STARTCHAR 339F -ENCODING 13215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -0180 -0100 -0500 -FA80 -DA80 -DA80 -DA80 -DA80 -ENDCHAR -STARTCHAR 33A0 -ENCODING 13216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0180 -0100 -4500 -BA80 -9A80 -8A80 -8A80 -9A80 -6000 -ENDCHAR -STARTCHAR 33A1 -ENCODING 13217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 0 -BITMAP -06 -04 -48 -B4 -A4 -A4 -A4 -A4 -ENDCHAR -STARTCHAR 33A2 -ENCODING 13218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -0180 -8100 -8500 -AA80 -CA80 -CA80 -AA80 -AA80 -ENDCHAR -STARTCHAR 33A3 -ENCODING 13219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -0180 -0080 -2500 -DA80 -DA80 -DA80 -DA80 -DA80 -ENDCHAR -STARTCHAR 33A4 -ENCODING 13220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0180 -0080 -4500 -BA80 -9A80 -8A80 -8A80 -9A80 -6000 -ENDCHAR -STARTCHAR 33A5 -ENCODING 13221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 0 -BITMAP -06 -06 -48 -B4 -24 -24 -24 -24 -ENDCHAR -STARTCHAR 33A6 -ENCODING 13222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -0080 -8080 -8500 -AA80 -CA80 -CA80 -AA80 -AA80 -ENDCHAR -STARTCHAR 33A7 -ENCODING 13223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2000 -D200 -D200 -D400 -0700 -0C80 -1300 -1480 -0300 -ENDCHAR -STARTCHAR 33A8 -ENCODING 13224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2000 -D200 -D580 -D500 -5B00 -1400 -1300 -2480 -0300 -ENDCHAR -STARTCHAR 33A9 -ENCODING 13225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -F0 -96 -99 -F9 -87 -89 -89 -06 -ENDCHAR -STARTCHAR 33AA -ENCODING 13226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -1C00 -9400 -D700 -9880 -9300 -D480 -2500 -0200 -ENDCHAR -STARTCHAR 33AB -ENCODING 13227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -3C00 -B500 -B280 -DE80 -D180 -5280 -5280 -0100 -ENDCHAR -STARTCHAR 33AC -ENCODING 13228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4800 -B400 -B500 -9280 -7C80 -9180 -B280 -B280 -4100 -ENDCHAR -STARTCHAR 33AD -ENCODING 13229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -0080 -1280 -AD80 -8C80 -BC80 -CC80 -CC80 -3300 -ENDCHAR -STARTCHAR 33AE -ENCODING 13230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -0100 -BA00 -EA00 -7D00 -0680 -0900 -0A80 -1100 -ENDCHAR -STARTCHAR 33AF -ENCODING 13231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 8 0 0 -BITMAP -0880 -9540 -F540 -BB00 -0200 -0580 -0840 -0880 -ENDCHAR -STARTCHAR 33B0 -ENCODING 13232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 -2 -BITMAP -F7 -94 -92 -91 -95 -E2 -80 -ENDCHAR -STARTCHAR 33B1 -ENCODING 13233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 6 1 -1 -BITMAP -F7 -98 -96 -91 -99 -06 -ENDCHAR -STARTCHAR 33B2 -ENCODING 13234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 6 1 -2 -BITMAP -2F00 -5400 -5300 -5080 -A480 -D300 -ENDCHAR -STARTCHAR 33B3 -ENCODING 13235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 6 1 -1 -BITMAP -FF00 -AC00 -AB00 -A880 -AC80 -0300 -ENDCHAR -STARTCHAR 33B4 -ENCODING 13236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -09 -69 -99 -99 -96 -96 -96 -E0 -80 -ENDCHAR -STARTCHAR 33B5 -ENCODING 13237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -09 -69 -99 -99 -96 -96 -96 -ENDCHAR -STARTCHAR 33B6 -ENCODING 13238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -2 -BITMAP -0880 -0900 -4900 -5500 -5500 -9600 -A200 -D000 -ENDCHAR -STARTCHAR 33B7 -ENCODING 13239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -0880 -0900 -F900 -D500 -D500 -D600 -D200 -ENDCHAR -STARTCHAR 33B8 -ENCODING 13240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -89 -89 -A9 -C9 -C6 -A6 -96 -ENDCHAR -STARTCHAR 33B9 -ENCODING 13241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -9880 -9480 -9500 -B500 -B500 -F200 -D200 -ENDCHAR -STARTCHAR 33BA -ENCODING 13242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -2 -BITMAP -1280 -4A80 -AE80 -9F00 -9F00 -9D00 -A900 -C000 -8000 -ENDCHAR -STARTCHAR 33BB -ENCODING 13243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -1680 -5680 -B680 -AF00 -AB00 -A900 -A900 -ENDCHAR -STARTCHAR 33BC -ENCODING 13244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -0540 -0540 -2F40 -2F40 -2E80 -5680 -5280 -6000 -8000 -ENDCHAR -STARTCHAR 33BD -ENCODING 13245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -0A80 -2A80 -DE80 -DF00 -DF00 -DD00 -D900 -ENDCHAR -STARTCHAR 33BE -ENCODING 13246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -9280 -8E80 -AE80 -CF00 -CF00 -A900 -A900 -ENDCHAR -STARTCHAR 33BF -ENCODING 13247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 0 -BITMAP -9A80 -9A80 -BE80 -BF00 -B500 -D500 -D500 -ENDCHAR -STARTCHAR 33C0 -ENCODING 13248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -0600 -8900 -8880 -B080 -C880 -C900 -A600 -AF00 -ENDCHAR -STARTCHAR 33C1 -ENCODING 13249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -0600 -9900 -B080 -B080 -B080 -B900 -D600 -DF80 -ENDCHAR -STARTCHAR 33C2 -ENCODING 13250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 6 1 -1 -BITMAP -DF -55 -D5 -D5 -D0 -80 -ENDCHAR -STARTCHAR 33C3 -ENCODING 13251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -F0 -92 -95 -E9 -99 -99 -99 -67 -01 -ENDCHAR -STARTCHAR 33C4 -ENCODING 13252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 6 1 -1 -BITMAP -F7 -98 -88 -88 -95 -62 -ENDCHAR -STARTCHAR 33C5 -ENCODING 13253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -0080 -4280 -B580 -9880 -8880 -8880 -9980 -6600 -ENDCHAR -STARTCHAR 33C6 -ENCODING 13254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1000 -9000 -9000 -9000 -6000 -3780 -2A80 -4680 -4380 -ENDCHAR -STARTCHAR 33C7 -ENCODING 13255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -6000 -9000 -9200 -8500 -8900 -8900 -9900 -9980 -6600 -ENDCHAR -STARTCHAR 33C8 -ENCODING 13256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -1F00 -5880 -B900 -9F00 -9880 -9880 -9900 -6600 -ENDCHAR -STARTCHAR 33C9 -ENCODING 13257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -6000 -9000 -8800 -8480 -BD00 -8D00 -8B00 -9A00 -6200 -0200 -ENDCHAR -STARTCHAR 33CA -ENCODING 13258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 8 1 -1 -BITMAP -80 -E2 -9D -99 -97 -99 -99 -06 -ENDCHAR -STARTCHAR 33CB -ENCODING 13259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 7 2 0 -BITMAP -1E -12 -12 -FC -10 -10 -10 -ENDCHAR -STARTCHAR 33CF -ENCODING 13263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -84 -84 -A4 -C4 -C4 -A4 -A4 -02 -ENDCHAR -STARTCHAR 33D0 -ENCODING 13264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -80 -92 -AD -A5 -A5 -A5 -A5 -ENDCHAR -STARTCHAR 33D3 -ENCODING 13267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 0 -BITMAP -80 -80 -A4 -98 -90 -98 -A4 -ENDCHAR -STARTCHAR 33D6 -ENCODING 13270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -0080 -0280 -F580 -C980 -C980 -C980 -0980 -0600 -ENDCHAR -STARTCHAR 33D8 -ENCODING 13272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 6 1 -2 -BITMAP -DF -B5 -B5 -B5 -D5 -80 -ENDCHAR -STARTCHAR 33DB -ENCODING 13275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 -1 -BITMAP -EC -88 -68 -18 -98 -60 -ENDCHAR -STARTCHAR 33DC -ENCODING 13276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -6000 -9000 -8000 -8480 -7500 -0D00 -8D00 -9200 -6000 -ENDCHAR -STARTCHAR 33DD -ENCODING 13277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -A800 -FA00 -F500 -F480 -F880 -9480 -9480 -0300 -ENDCHAR -STARTCHAR 4E00 -ENCODING 19968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 1 1 3 -BITMAP -FF80 -ENDCHAR -STARTCHAR 4E01 -ENCODING 19969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -08 -08 -08 -08 -08 -08 -38 -ENDCHAR -STARTCHAR 4E03 -ENCODING 19971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -20 -20 -23 -7C -A0 -20 -21 -21 -3F -ENDCHAR -STARTCHAR 4E07 -ENCODING 19975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -20 -20 -3F -21 -21 -41 -CA -86 -ENDCHAR -STARTCHAR 4E08 -ENCODING 19976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -08 -FF -28 -68 -78 -18 -66 -C3 -ENDCHAR -STARTCHAR 4E09 -ENCODING 19977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 0 -BITMAP -7F00 -0000 -0000 -7E00 -0000 -0000 -0000 -FF80 -ENDCHAR -STARTCHAR 4E0A -ENCODING 19978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1000 -1000 -1000 -0F00 -1000 -1000 -1000 -1000 -FF80 -ENDCHAR -STARTCHAR 4E0B -ENCODING 19979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -10 -08 -14 -12 -10 -10 -10 -10 -ENDCHAR -STARTCHAR 4E0D -ENCODING 19981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -18 -2C -4B -89 -08 -08 -08 -ENDCHAR -STARTCHAR 4E11 -ENCODING 19985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -1200 -1200 -2200 -FF80 -2200 -2200 -2200 -FF00 -ENDCHAR -STARTCHAR 4E14 -ENCODING 19988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -4200 -7E00 -4200 -4200 -7E00 -4200 -FF80 -ENDCHAR -STARTCHAR 4E15 -ENCODING 19989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -1400 -2A00 -4900 -8880 -0800 -0800 -FF80 -ENDCHAR -STARTCHAR 4E16 -ENCODING 19990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5200 -5200 -FF80 -5200 -5200 -5200 -4E00 -7F00 -4000 -ENDCHAR -STARTCHAR 4E18 -ENCODING 19992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -06 -78 -40 -40 -7F -44 -44 -44 -FF -ENDCHAR -STARTCHAR 4E19 -ENCODING 19993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -FF -99 -99 -A5 -C3 -81 -83 -ENDCHAR -STARTCHAR 4E1E -ENCODING 19998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -04 -09 -EE -2A -4B -89 -18 -FF -ENDCHAR -STARTCHAR 4E2D -ENCODING 20013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -FF -89 -89 -89 -FF -08 -08 -08 -ENDCHAR -STARTCHAR 4E32 -ENCODING 20018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -7F -49 -7F -08 -FF -89 -FF -08 -08 -ENDCHAR -STARTCHAR 4E38 -ENCODING 20024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -1000 -FC00 -1200 -5200 -2200 -3A00 -2200 -C280 -8300 -ENDCHAR -STARTCHAR 4E39 -ENCODING 20025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -5200 -4A00 -4A00 -FF80 -4200 -4200 -8200 -8600 -ENDCHAR -STARTCHAR 4E3B -ENCODING 20027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -08 -FF -08 -08 -08 -7F -08 -08 -FF -ENDCHAR -STARTCHAR 4E42 -ENCODING 20034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -42 -C2 -A4 -24 -18 -18 -34 -63 -81 -ENDCHAR -STARTCHAR 4E43 -ENCODING 20035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FC -24 -24 -27 -21 -41 -41 -81 -86 -ENDCHAR -STARTCHAR 4E45 -ENCODING 20037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -10 -3C -44 -C4 -88 -18 -34 -63 -81 -ENDCHAR -STARTCHAR 4E4B -ENCODING 20043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -1000 -FE00 -0200 -0400 -0800 -7000 -E000 -C000 -BF80 -ENDCHAR -STARTCHAR 4E4D -ENCODING 20045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -20 -7F -D0 -8F -10 -0F -10 -10 -10 -ENDCHAR -STARTCHAR 4E4E -ENCODING 20046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0700 -F900 -4A00 -2A00 -0800 -FF80 -0800 -0800 -3800 -ENDCHAR -STARTCHAR 4E4F -ENCODING 20047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0700 -F800 -0800 -FF00 -0200 -0C00 -7000 -A000 -9F80 -ENDCHAR -STARTCHAR 4E56 -ENCODING 20054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -7C00 -FF80 -2C00 -ED00 -2E00 -6C80 -AF00 -2800 -0800 -ENDCHAR -STARTCHAR 4E58 -ENCODING 20056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0300 -7C00 -FF80 -ED00 -6E80 -B700 -4A00 -8980 -0800 -ENDCHAR -STARTCHAR 4E59 -ENCODING 20057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -0400 -0800 -1000 -2000 -2000 -4080 -8100 -7F00 -ENDCHAR -STARTCHAR 4E5D -ENCODING 20061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -2000 -2000 -FC00 -2400 -2400 -2400 -4480 -C480 -8300 -ENDCHAR -STARTCHAR 4E5E -ENCODING 20062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -2000 -7F00 -C000 -FC00 -0800 -1000 -2080 -4100 -7F00 -ENDCHAR -STARTCHAR 4E5F -ENCODING 20063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -4800 -4F00 -F900 -C900 -4900 -4900 -4E00 -4080 -7F00 -ENDCHAR -STARTCHAR 4E6B -ENCODING 20075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -F700 -5500 -5500 -B700 -0000 -FC00 -1000 -6080 -7F00 -ENDCHAR -STARTCHAR 4E6D -ENCODING 20077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -2000 -7E00 -BE00 -0000 -FC00 -1000 -2080 -7F00 -ENDCHAR -STARTCHAR 4E73 -ENCODING 20083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1400 -F400 -AC00 -F400 -1400 -2C00 -F480 -2480 -6700 -ENDCHAR -STARTCHAR 4E76 -ENCODING 20086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -0A -FF -7F -7F -7F -8B -FC -10 -61 -7F -ENDCHAR -STARTCHAR 4E77 -ENCODING 20087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5500 -D480 -4D00 -CE00 -B000 -FC00 -1000 -6080 -7F00 -ENDCHAR -STARTCHAR 4E7E -ENCODING 20094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -F400 -4F80 -F800 -FF00 -9200 -F200 -4400 -F880 -4F80 -ENDCHAR -STARTCHAR 4E82 -ENCODING 20098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FA00 -AA00 -7A00 -5200 -FA00 -FA00 -FA00 -AA80 -DB80 -ENDCHAR -STARTCHAR 4E86 -ENCODING 20102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -02 -04 -08 -08 -08 -08 -08 -30 -ENDCHAR -STARTCHAR 4E88 -ENCODING 20104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -04 -18 -FF -09 -0A -08 -08 -30 -ENDCHAR -STARTCHAR 4E8B -ENCODING 20107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7F00 -4900 -7F00 -FF00 -FF80 -0900 -FF00 -3800 -ENDCHAR -STARTCHAR 4E8C -ENCODING 20108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -7F -00 -00 -00 -00 -00 -FF -ENDCHAR -STARTCHAR 4E8E -ENCODING 20110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -0800 -FF80 -0800 -0800 -0800 -0800 -3000 -ENDCHAR -STARTCHAR 4E90 -ENCODING 20112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -1000 -FF80 -2000 -2000 -3F00 -2100 -0200 -0E00 -ENDCHAR -STARTCHAR 4E91 -ENCODING 20113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -00 -00 -FF -10 -22 -22 -4F -F1 -ENDCHAR -STARTCHAR 4E92 -ENCODING 20114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -2000 -3E00 -2200 -4200 -7E00 -4200 -0200 -FF80 -ENDCHAR -STARTCHAR 4E94 -ENCODING 20116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -1000 -1000 -1000 -7E00 -1200 -2200 -2200 -FF80 -ENDCHAR -STARTCHAR 4E95 -ENCODING 20117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -2400 -FF00 -2400 -2400 -FF80 -2400 -4400 -4400 -8400 -ENDCHAR -STARTCHAR 4E98 -ENCODING 20120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -00 -7E -42 -7E -42 -7E -00 -FF -ENDCHAR -STARTCHAR 4E9B -ENCODING 20123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -A500 -B600 -A400 -B480 -C700 -7F00 -0000 -0000 -FF80 -ENDCHAR -STARTCHAR 4E9E -ENCODING 20126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -1400 -1400 -6700 -8100 -6700 -1400 -1400 -FF80 -ENDCHAR -STARTCHAR 4EA1 -ENCODING 20129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -0800 -FF80 -4000 -4000 -4000 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR 4EA2 -ENCODING 20130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0000 -3C00 -2400 -2400 -2400 -4400 -C480 -8700 -ENDCHAR -STARTCHAR 4EA4 -ENCODING 20132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -FF -26 -C1 -24 -14 -08 -36 -C1 -ENDCHAR -STARTCHAR 4EA5 -ENCODING 20133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -1000 -6400 -2800 -1200 -6400 -CC00 -3200 -C100 -ENDCHAR -STARTCHAR 4EA6 -ENCODING 20134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -FF -14 -56 -A5 -A5 -24 -44 -98 -ENDCHAR -STARTCHAR 4EA8 -ENCODING 20136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7E00 -4200 -7E00 -FF00 -0400 -0800 -0800 -1800 -ENDCHAR -STARTCHAR 4EAB -ENCODING 20139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7E00 -7E00 -0000 -7E00 -0800 -FF80 -0800 -1800 -ENDCHAR -STARTCHAR 4EAC -ENCODING 20140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -00 -7E -42 -7E -08 -2A -49 -B9 -ENDCHAR -STARTCHAR 4EAD -ENCODING 20141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -7E -7E -00 -FF -81 -7F -08 -38 -ENDCHAR -STARTCHAR 4EAE -ENCODING 20142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E00 -7E00 -0000 -FF00 -A500 -2400 -6480 -C700 -ENDCHAR -STARTCHAR 4EB6 -ENCODING 20150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7F00 -A500 -7F00 -0000 -7E00 -7E00 -7E00 -FF80 -ENDCHAR -STARTCHAR 4EBA -ENCODING 20154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -08 -08 -18 -18 -14 -22 -43 -81 -ENDCHAR -STARTCHAR 4EC0 -ENCODING 20160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -C400 -C400 -7F80 -4400 -4400 -4400 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 4EC1 -ENCODING 20161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -4000 -5F00 -4000 -C000 -4000 -4000 -4000 -7F80 -4000 -ENDCHAR -STARTCHAR 4EC4 -ENCODING 20164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F80 -8800 -8800 -8800 -8800 -8C00 -9200 -A300 -E100 -ENDCHAR -STARTCHAR 4EC7 -ENCODING 20167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5000 -5000 -BE00 -9200 -9200 -5200 -5280 -6280 -6300 -ENDCHAR -STARTCHAR 4ECA -ENCODING 20170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -2400 -4300 -BD80 -0000 -7F00 -0200 -0200 -0400 -0800 -ENDCHAR -STARTCHAR 4ECB -ENCODING 20171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -1800 -2400 -4300 -A580 -2400 -2400 -2400 -4400 -8400 -ENDCHAR -STARTCHAR 4ECD -ENCODING 20173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -5E -52 -92 -93 -91 -51 -51 -61 -63 -ENDCHAR -STARTCHAR 4ED4 -ENCODING 20180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -5F00 -4200 -4400 -C400 -FF80 -4400 -4400 -4400 -5C00 -ENDCHAR -STARTCHAR 4ED5 -ENCODING 20181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -4400 -4400 -7F80 -C400 -C400 -4400 -4400 -4400 -5F00 -ENDCHAR -STARTCHAR 4ED6 -ENCODING 20182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -5400 -5500 -5F00 -F500 -D500 -5700 -5400 -5080 -5F00 -ENDCHAR -STARTCHAR 4ED7 -ENCODING 20183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -4400 -7F80 -4400 -D400 -CC00 -4C00 -4C00 -5B00 -6180 -ENDCHAR -STARTCHAR 4ED8 -ENCODING 20184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -4200 -5F80 -4200 -D200 -4A00 -4A00 -4200 -4200 -4600 -ENDCHAR -STARTCHAR 4ED9 -ENCODING 20185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -44 -55 -D5 -D5 -D5 -55 -55 -5F -51 -ENDCHAR -STARTCHAR 4EDD -ENCODING 20189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -18 -14 -24 -43 -81 -7E -08 -08 -FF -ENDCHAR -STARTCHAR 4EDF -ENCODING 20191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2300 -5C00 -4400 -4400 -FF80 -C400 -4400 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 4EE3 -ENCODING 20195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2A00 -4900 -4800 -FF00 -C800 -4400 -4400 -4280 -4300 -ENDCHAR -STARTCHAR 4EE4 -ENCODING 20196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -2400 -4300 -BD80 -0000 -7E00 -1100 -1200 -1000 -ENDCHAR -STARTCHAR 4EE5 -ENCODING 20197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4200 -5200 -4A00 -4200 -4200 -4A00 -7600 -8D00 -1080 -ENDCHAR -STARTCHAR 4EF0 -ENCODING 20208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -77 -65 -A5 -A5 -A5 -AD -B5 -84 -84 -ENDCHAR -STARTCHAR 4EF2 -ENCODING 20210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -44 -5F -65 -E5 -E5 -5F -44 -44 -44 -ENDCHAR -STARTCHAR 4EF6 -ENCODING 20214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5400 -5400 -5F00 -E400 -E400 -7F80 -4400 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 4EF7 -ENCODING 20215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -4A00 -5100 -6080 -D200 -D200 -5200 -5200 -7200 -6200 -ENDCHAR -STARTCHAR 4EFB -ENCODING 20219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2300 -5C00 -4400 -4400 -FF80 -C400 -4400 -4400 -7F80 -4000 -ENDCHAR -STARTCHAR 4F01 -ENCODING 20225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -1C00 -2600 -CB00 -C880 -4F00 -4800 -4800 -FF80 -ENDCHAR -STARTCHAR 4F09 -ENCODING 20233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -4000 -DE00 -D200 -D200 -5200 -5280 -7280 -6300 -ENDCHAR -STARTCHAR 4F0A -ENCODING 20234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -5F00 -4500 -7F80 -C500 -DF00 -4900 -4800 -5800 -6000 -ENDCHAR -STARTCHAR 4F0B -ENCODING 20235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -5E00 -5200 -4A00 -DB00 -D500 -5600 -5600 -6D00 -7080 -ENDCHAR -STARTCHAR 4F0D -ENCODING 20237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F00 -4800 -8800 -BF00 -8900 -4900 -4900 -4900 -7F80 -ENDCHAR -STARTCHAR 4F0E -ENCODING 20238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -7F80 -C400 -DF00 -5100 -4A00 -4400 -5B00 -6180 -ENDCHAR -STARTCHAR 4F0F -ENCODING 20239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2600 -4500 -4400 -7F80 -C400 -CC00 -4A00 -5200 -7100 -6080 -ENDCHAR -STARTCHAR 4F10 -ENCODING 20240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -4A00 -4F00 -7800 -C900 -C600 -4400 -4400 -5A80 -7100 -ENDCHAR -STARTCHAR 4F11 -ENCODING 20241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -4400 -7F80 -4C00 -CC00 -CE00 -5500 -6500 -6480 -4400 -ENDCHAR -STARTCHAR 4F2F -ENCODING 20271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -44 -5F -91 -91 -9F -51 -51 -5F -51 -ENDCHAR -STARTCHAR 4F34 -ENCODING 20276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5600 -5500 -A480 -9F00 -4400 -7F80 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 4F36 -ENCODING 20278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -5300 -BE80 -8000 -BF00 -8900 -8900 -8B00 -8800 -ENDCHAR -STARTCHAR 4F38 -ENCODING 20280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -44 -5F -55 -DF -D5 -5F -55 -44 -44 -ENDCHAR -STARTCHAR 4F3A -ENCODING 20282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7F -41 -5F -81 -9D -95 -5D -55 -41 -43 -ENDCHAR -STARTCHAR 4F3C -ENCODING 20284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -5900 -5500 -9500 -9100 -9200 -9200 -9F00 -B500 -8480 -ENDCHAR -STARTCHAR 4F3D -ENCODING 20285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -30 -53 -7B -5B -9B -9B -5B -6B -6B -5B -ENDCHAR -STARTCHAR 4F43 -ENCODING 20291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -5F -55 -55 -DF -D5 -55 -55 -5F -51 -ENDCHAR -STARTCHAR 4F46 -ENCODING 20294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -5F00 -5100 -5100 -DF00 -D100 -5F00 -4000 -4000 -7F80 -ENDCHAR -STARTCHAR 4F47 -ENCODING 20295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -5F00 -6080 -6080 -FF80 -C400 -4400 -4400 -4400 -4C00 -ENDCHAR -STARTCHAR 4F48 -ENCODING 20296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -7F80 -9400 -9F00 -7500 -7500 -5500 -5500 -4400 -ENDCHAR -STARTCHAR 4F4D -ENCODING 20301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -7F00 -9100 -9200 -9200 -4A00 -4A00 -4200 -7F80 -ENDCHAR -STARTCHAR 4F4E -ENCODING 20302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2300 -5C00 -5400 -5400 -DF00 -D200 -5E00 -7280 -4100 -7E00 -ENDCHAR -STARTCHAR 4F4F -ENCODING 20303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -4400 -7F00 -4400 -C400 -DF00 -4400 -4400 -4400 -7F80 -ENDCHAR -STARTCHAR 4F50 -ENCODING 20304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -4800 -7F80 -4800 -D000 -DF00 -6400 -6400 -4400 -7F80 -ENDCHAR -STARTCHAR 4F51 -ENCODING 20305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -4800 -7F80 -4800 -D000 -DF00 -7100 -7100 -5F00 -5100 -ENDCHAR -STARTCHAR 4F55 -ENCODING 20309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -5F80 -4100 -DD00 -D500 -D500 -5D00 -5500 -4100 -4300 -ENDCHAR -STARTCHAR 4F59 -ENCODING 20313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -18 -34 -43 -FF -08 -FF -2C -CB -B1 -ENDCHAR -STARTCHAR 4F5A -ENCODING 20314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3400 -5400 -5F00 -5400 -E400 -FF80 -4400 -4A00 -5100 -6080 -ENDCHAR -STARTCHAR 4F5B -ENCODING 20315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4C -7F -4D -BF -AC -AC -7F -55 -55 -64 -ENDCHAR -STARTCHAR 4F5C -ENCODING 20316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -5000 -5F80 -7400 -E700 -C400 -4700 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 4F69 -ENCODING 20329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F00 -6100 -7D00 -A900 -BD00 -BB00 -BB00 -B500 -A980 -C980 -ENDCHAR -STARTCHAR 4F6F -ENCODING 20335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3100 -4A00 -7F80 -4400 -DF00 -C400 -7F80 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 4F70 -ENCODING 20336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -4400 -9F00 -9100 -9100 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 4F73 -ENCODING 20339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -5F00 -4400 -4400 -FF80 -C400 -7F00 -4400 -4400 -7F80 -ENDCHAR -STARTCHAR 4F76 -ENCODING 20342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -4400 -7F80 -8400 -9F00 -4000 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 4F7A -ENCODING 20346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3C00 -4C00 -4A00 -5100 -FF80 -4400 -5E00 -4400 -4400 -7F00 -ENDCHAR -STARTCHAR 4F7E -ENCODING 20350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2E00 -5200 -5100 -7F80 -F100 -DF00 -5100 -5F00 -5100 -6300 -ENDCHAR -STARTCHAR 4F7F -ENCODING 20351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -4400 -9F00 -9500 -9F00 -5400 -4800 -5600 -6180 -ENDCHAR -STARTCHAR 4F81 -ENCODING 20353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -5400 -5F00 -5400 -E400 -FF80 -4A00 -4A00 -5280 -6300 -ENDCHAR -STARTCHAR 4F83 -ENCODING 20355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2F80 -3080 -3080 -4F80 -4000 -AD00 -2D00 -2D00 -3540 -35C0 -ENDCHAR -STARTCHAR 4F84 -ENCODING 20356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -4900 -8B00 -BC80 -8400 -5F00 -4400 -4400 -7F80 -ENDCHAR -STARTCHAR 4F86 -ENCODING 20358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -2A -4A -6B -BD -2C -4B -89 -08 -ENDCHAR -STARTCHAR 4F88 -ENCODING 20360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -4F00 -5200 -AC00 -9A00 -7780 -5900 -7600 -4C00 -7000 -ENDCHAR -STARTCHAR 4F8A -ENCODING 20362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6500 -5500 -9600 -BF00 -4A00 -4A00 -5200 -5280 -6300 -ENDCHAR -STARTCHAR 4F8B -ENCODING 20363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -41 -79 -53 -9B -AB -BB -8B -93 -91 -A3 -ENDCHAR -STARTCHAR 4F8D -ENCODING 20365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -5F00 -4400 -BF80 -8200 -BF80 -5200 -4A00 -4200 -4600 -ENDCHAR -STARTCHAR 4F8F -ENCODING 20367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3400 -5400 -5F00 -6400 -BF80 -8C00 -4E00 -5500 -6480 -4400 -ENDCHAR -STARTCHAR 4F91 -ENCODING 20369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -7F80 -4800 -9F00 -B100 -BF00 -5100 -5F00 -5100 -5300 -ENDCHAR -STARTCHAR 4F96 -ENCODING 20374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -2400 -3F00 -C080 -8000 -7F00 -5500 -7F00 -5500 -5700 -ENDCHAR -STARTCHAR 4F98 -ENCODING 20376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -6280 -CC00 -D800 -DF80 -6800 -4800 -4880 -4700 -ENDCHAR -STARTCHAR 4F9B -ENCODING 20379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -5200 -5200 -BF00 -9200 -7F80 -4000 -5200 -7100 -6080 -ENDCHAR -STARTCHAR 4F9D -ENCODING 20381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -7F80 -4C00 -CD00 -D200 -7200 -5100 -5500 -7880 -ENDCHAR -STARTCHAR 4FAE -ENCODING 20398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5F00 -B000 -BF00 -9500 -7F80 -5900 -5F00 -6100 -4600 -ENDCHAR -STARTCHAR 4FAF -ENCODING 20399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5E00 -4200 -7F80 -9000 -9F00 -A400 -BF80 -8C00 -9200 -A180 -ENDCHAR -STARTCHAR 4FB5 -ENCODING 20405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2F80 -2080 -3FC0 -6F80 -7F80 -B040 -3F80 -2500 -2700 -38C0 -ENDCHAR -STARTCHAR 4FB6 -ENCODING 20406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -5F -51 -9F -84 -48 -5F -61 -5F -61 -ENDCHAR -STARTCHAR 4FBF -ENCODING 20415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F80 -5F00 -9500 -9F00 -9F00 -5400 -4C00 -5600 -6180 -ENDCHAR -STARTCHAR 4FC2 -ENCODING 20418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -7C00 -5A00 -DC00 -C900 -7F00 -4400 -5700 -6480 -4400 -ENDCHAR -STARTCHAR 4FC3 -ENCODING 20419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -5100 -5100 -DF00 -C400 -D400 -5780 -5400 -6C00 -6780 -ENDCHAR -STARTCHAR 4FC4 -ENCODING 20420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -7500 -5300 -BF80 -9200 -5500 -7B00 -5200 -5680 -7500 -ENDCHAR -STARTCHAR 4FC9 -ENCODING 20425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F00 -4800 -5F00 -8900 -BF80 -8000 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 4FCA -ENCODING 20426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -4900 -5F00 -CC80 -FB00 -4800 -5F00 -6A00 -4E00 -7180 -ENDCHAR -STARTCHAR 4FCE -ENCODING 20430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -4900 -6900 -AF00 -4900 -4900 -6F00 -9900 -9F80 -ENDCHAR -STARTCHAR 4FD1 -ENCODING 20433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -4A -44 -9F -A5 -9F -65 -5F -65 -65 -ENDCHAR -STARTCHAR 4FD3 -ENCODING 20435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -5500 -5500 -EA00 -D500 -5500 -5F00 -4400 -4400 -7F80 -ENDCHAR -STARTCHAR 4FD4 -ENCODING 20436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -5100 -5F00 -D100 -DF00 -5100 -5F00 -4A00 -5280 -6300 -ENDCHAR -STARTCHAR 4FD7 -ENCODING 20439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4A -53 -65 -8C -92 -B1 -7F -52 -5E -52 -ENDCHAR -STARTCHAR 4FDA -ENCODING 20442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5500 -5500 -9F00 -9500 -5F00 -5F00 -4400 -4400 -7F80 -ENDCHAR -STARTCHAR 4FDD -ENCODING 20445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -5100 -5100 -CE00 -FF80 -4E00 -4D00 -5480 -6400 -ENDCHAR -STARTCHAR 4FDF -ENCODING 20447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4900 -7F00 -9080 -9F00 -A400 -7F80 -4C00 -5B00 -6180 -ENDCHAR -STARTCHAR 4FE0 -ENCODING 20448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -4400 -7F80 -5500 -D500 -F700 -6E80 -4A00 -5100 -6080 -ENDCHAR -STARTCHAR 4FE1 -ENCODING 20449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -4000 -7F80 -DF00 -C000 -5F00 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 4FEE -ENCODING 20462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -7900 -B600 -BF80 -A600 -BA00 -AD80 -A600 -9800 -ENDCHAR -STARTCHAR 4FEF -ENCODING 20463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -6500 -AF80 -A900 -BD00 -AB00 -A900 -A900 -AB00 -ENDCHAR -STARTCHAR 4FF1 -ENCODING 20465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -5100 -5F00 -D100 -DF00 -5F00 -7F80 -4000 -5A00 -6180 -ENDCHAR -STARTCHAR 4FF3 -ENCODING 20467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -4A00 -7B80 -8A00 -BB80 -8A00 -5B80 -6A00 -5200 -6200 -ENDCHAR -STARTCHAR 4FF5 -ENCODING 20469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -4400 -9F00 -BF80 -4D00 -5200 -7200 -5D00 -7080 -ENDCHAR -STARTCHAR 4FF8 -ENCODING 20472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F00 -4800 -9F00 -BF00 -9500 -7E80 -7F00 -4400 -4400 -ENDCHAR -STARTCHAR 4FFA -ENCODING 20474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -7F00 -4A00 -D500 -FF80 -D500 -5F00 -5F00 -4480 -4700 -ENDCHAR -STARTCHAR 5002 -ENCODING 20482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5100 -5200 -7F80 -9200 -9200 -9F80 -7200 -5200 -5200 -6200 -ENDCHAR -STARTCHAR 5006 -ENCODING 20486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F80 -8400 -BF00 -B700 -AF00 -BF00 -BD00 -A500 -A500 -ENDCHAR -STARTCHAR 5009 -ENCODING 20489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -3400 -7F00 -FF80 -7E00 -4200 -7E00 -7E00 -A100 -BE00 -ENDCHAR -STARTCHAR 500B -ENCODING 20491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -65 -65 -EF -E5 -EF -6B -6F -5F -61 -ENDCHAR -STARTCHAR 500D -ENCODING 20493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -5200 -8A00 -BF80 -8000 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 5011 -ENCODING 20497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7B -6B -7B -AB -BB -A1 -A1 -A1 -A1 -A3 -ENDCHAR -STARTCHAR 5012 -ENCODING 20498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -41 -7F -9B -BF -87 -93 -BF -93 -BD -83 -ENDCHAR -STARTCHAR 5016 -ENCODING 20502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -4400 -7F80 -CA00 -FF80 -4400 -5F00 -4400 -4400 -ENDCHAR -STARTCHAR 5019 -ENCODING 20505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4100 -7F80 -A800 -AF00 -B400 -BF80 -A600 -8900 -9080 -ENDCHAR -STARTCHAR 501A -ENCODING 20506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -3F00 -4A00 -5100 -FF80 -C100 -5D00 -5D00 -5500 -4300 -ENDCHAR -STARTCHAR 501C -ENCODING 20508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -55 -5F -DF -D5 -51 -5F -6F -69 -63 -ENDCHAR -STARTCHAR 501E -ENCODING 20510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -4000 -DF00 -D100 -5F00 -4400 -5500 -6480 -4C00 -ENDCHAR -STARTCHAR 501F -ENCODING 20511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -7F00 -4A00 -BF80 -8000 -5F00 -5100 -5F00 -5F00 -5100 -ENDCHAR -STARTCHAR 5021 -ENCODING 20513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3F -51 -5F -5F -C0 -5F -61 -5F -5F -61 -ENDCHAR -STARTCHAR 5023 -ENCODING 20515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -5200 -7B80 -A500 -9D00 -AB00 -A900 -AB00 -AF00 -D480 -ENDCHAR -STARTCHAR 5024 -ENCODING 20516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -4400 -8F00 -AF00 -A900 -6F00 -6F00 -7F80 -6000 -ENDCHAR -STARTCHAR 5026 -ENCODING 20518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -6900 -BF00 -8C00 -BF80 -9F00 -B280 -9600 -9100 -9F00 -ENDCHAR -STARTCHAR 5027 -ENCODING 20519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -7F00 -6080 -5F00 -C000 -FF80 -5500 -5500 -6480 -4C00 -ENDCHAR -STARTCHAR 5028 -ENCODING 20520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -6100 -6100 -9F00 -9F80 -A400 -AF00 -A880 -AF00 -C880 -ENDCHAR -STARTCHAR 502A -ENCODING 20522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5300 -6100 -9B00 -A100 -9F00 -4A00 -5200 -5280 -6300 -ENDCHAR -STARTCHAR 502B -ENCODING 20523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -5300 -5E80 -A000 -BF00 -6B00 -6B00 -7F00 -6B00 -6B00 -ENDCHAR -STARTCHAR 502C -ENCODING 20524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -4700 -4400 -DF00 -DF00 -D100 -5F00 -7F80 -4400 -4400 -ENDCHAR -STARTCHAR 502D -ENCODING 20525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -7F00 -8E00 -B580 -8800 -7F80 -5A00 -4600 -7900 -ENDCHAR -STARTCHAR 503B -ENCODING 20539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7B80 -6B00 -6B00 -BB00 -AB00 -BA80 -AA80 -BB00 -8A00 -8A00 -ENDCHAR -STARTCHAR 5043 -ENCODING 20547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F00 -6000 -6F00 -AF00 -AF00 -BF80 -AA00 -A700 -A800 -BF80 -ENDCHAR -STARTCHAR 5047 -ENCODING 20551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1D80 -3480 -3480 -5D80 -5000 -BF80 -5280 -5D00 -5180 -5240 -ENDCHAR -STARTCHAR 5048 -ENCODING 20552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -51 -5F -9F -90 -7F -65 -6B -5F -43 -ENDCHAR -STARTCHAR 5049 -ENCODING 20553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F00 -7F80 -8000 -9F00 -9F00 -4400 -5F00 -7F80 -4400 -ENDCHAR -STARTCHAR 504F -ENCODING 20559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -43 -7C -7F -A1 -BF -BF -B7 -BF -B7 -57 -ENDCHAR -STARTCHAR 5055 -ENCODING 20565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5400 -5D00 -5780 -9B00 -B400 -9F00 -5100 -5F00 -5100 -5F00 -ENDCHAR -STARTCHAR 505A -ENCODING 20570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -5200 -7B80 -9500 -9500 -BB00 -AA00 -AA00 -BD00 -8480 -ENDCHAR -STARTCHAR 505C -ENCODING 20572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -5F00 -9F00 -8000 -7F00 -7F00 -4400 -4400 -4C00 -ENDCHAR -STARTCHAR 5065 -ENCODING 20581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -7F00 -5F80 -A300 -BF00 -9F00 -B200 -BF00 -9200 -AF80 -ENDCHAR -STARTCHAR 5074 -ENCODING 20596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -79 -6B -AB -BB -AB -BB -BB -81 -A9 -A7 -ENDCHAR -STARTCHAR 5075 -ENCODING 20597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4780 -5F00 -D100 -DF00 -D100 -5F00 -5F00 -5A00 -6180 -ENDCHAR -STARTCHAR 5076 -ENCODING 20598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3F -55 -5F -55 -DF -C4 -7F -67 -79 -63 -ENDCHAR -STARTCHAR 5078 -ENCODING 20600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5C00 -4A00 -5F00 -A080 -BB00 -BB00 -6500 -7B00 -6B00 -6A80 -ENDCHAR -STARTCHAR 5080 -ENCODING 20608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F00 -6500 -9F00 -A500 -5F00 -4F00 -5780 -5480 -6700 -ENDCHAR -STARTCHAR 5085 -ENCODING 20613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -7F80 -5F00 -D500 -DF00 -DF00 -4100 -7F80 -4900 -4200 -ENDCHAR -STARTCHAR 508D -ENCODING 20621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -7F -52 -BF -A5 -BF -88 -9F -91 -A6 -ENDCHAR -STARTCHAR 5091 -ENCODING 20625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5100 -5F00 -6D00 -9780 -B100 -A500 -BF00 -8C00 -9700 -A500 -ENDCHAR -STARTCHAR 5098 -ENCODING 20632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -3400 -6B00 -AB80 -6D00 -2A00 -6D00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 5099 -ENCODING 20633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -7F00 -4A00 -BF80 -AF00 -B500 -AF00 -AF00 -B500 -D500 -ENDCHAR -STARTCHAR 50AC -ENCODING 20652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5480 -5480 -5F00 -9400 -9F80 -B400 -5F00 -5F00 -5F80 -5000 -ENDCHAR -STARTCHAR 50AD -ENCODING 20653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -6F00 -BF80 -BF00 -A400 -7F00 -7F00 -7F00 -5500 -ENDCHAR -STARTCHAR 50B2 -ENCODING 20658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -7A00 -5380 -BD00 -9500 -BB00 -9B00 -AB00 -AB00 -DC80 -ENDCHAR -STARTCHAR 50B3 -ENCODING 20659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -7F00 -BF00 -BF00 -8500 -BF00 -BF80 -9200 -8600 -ENDCHAR -STARTCHAR 50B5 -ENCODING 20661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -5F00 -BF80 -9F00 -9F00 -5100 -5F00 -5A00 -6180 -ENDCHAR -STARTCHAR 50B7 -ENCODING 20663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5F00 -7F00 -BF00 -9F00 -BF80 -9F00 -AB00 -9500 -8B00 -ENDCHAR -STARTCHAR 50BE -ENCODING 20670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -6200 -7F00 -B900 -AF00 -AF00 -A900 -BF00 -8D00 -9080 -ENDCHAR -STARTCHAR 50C5 -ENCODING 20677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -7F00 -9E00 -BF00 -A500 -BF00 -BF00 -9F00 -8400 -BF80 -ENDCHAR -STARTCHAR 50C9 -ENCODING 20681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -2400 -7E00 -8180 -7F00 -7F00 -0000 -2400 -6600 -9900 -ENDCHAR -STARTCHAR 50CA -ENCODING 20682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F80 -4A00 -5F00 -DF00 -C800 -FF80 -5F00 -7680 -5100 -5F00 -ENDCHAR -STARTCHAR 50CF -ENCODING 20687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5E00 -7F00 -B500 -9F00 -9B00 -6E00 -7500 -5C80 -6C00 -ENDCHAR -STARTCHAR 50D1 -ENCODING 20689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -7F80 -9F00 -BE80 -BF00 -A100 -AF00 -AF00 -A100 -ENDCHAR -STARTCHAR 50D5 -ENCODING 20693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5B00 -7F80 -8A00 -BF00 -5F00 -7F80 -4C00 -5A00 -6180 -ENDCHAR -STARTCHAR 50D6 -ENCODING 20694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -7F00 -9F00 -A100 -9E00 -BF80 -BF00 -BF00 -A100 -ENDCHAR -STARTCHAR 50DA -ENCODING 20698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -7F80 -6D00 -BF00 -A180 -9E00 -9E00 -9600 -A500 -A880 -ENDCHAR -STARTCHAR 50DE -ENCODING 20702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5D00 -6500 -BE00 -9F00 -9100 -5F80 -7680 -7500 -6300 -ENDCHAR -STARTCHAR 50E5 -ENCODING 20709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -5F00 -7F00 -9200 -BF00 -B780 -7F80 -4C00 -5480 -6300 -ENDCHAR -STARTCHAR 50E7 -ENCODING 20711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4E00 -5100 -7F00 -B780 -9F00 -8000 -5F00 -5F00 -5100 -5F00 -ENDCHAR -STARTCHAR 50ED -ENCODING 20717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F00 -7300 -BF80 -9280 -BD80 -8000 -BF00 -BF00 -BF00 -A100 -ENDCHAR -STARTCHAR 50F9 -ENCODING 20729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -4A00 -7F80 -BF00 -9F00 -5F00 -6100 -5F00 -5200 -6100 -ENDCHAR -STARTCHAR 50FB -ENCODING 20731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7A00 -6F80 -AD00 -BB00 -A780 -A200 -BA00 -EF80 -9A00 -AA00 -ENDCHAR -STARTCHAR 50FF -ENCODING 20735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -4A00 -BF00 -9F00 -BF80 -9500 -BF80 -8400 -BF80 -ENDCHAR -STARTCHAR 5100 -ENCODING 20736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -7F00 -5F00 -BF80 -8000 -7D00 -7F80 -7B00 -5200 -7580 -ENDCHAR -STARTCHAR 5101 -ENCODING 20737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -34 -5F -74 -BF -9C -9F -5B -6B -6F -61 -ENDCHAR -STARTCHAR 5104 -ENCODING 20740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -7F80 -8000 -9F00 -9F00 -9F00 -AD00 -AB00 -AE80 -ENDCHAR -STARTCHAR 5106 -ENCODING 20742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6A00 -7E00 -6B80 -A300 -BB00 -B700 -7500 -B900 -8B00 -9C80 -ENDCHAR -STARTCHAR 5109 -ENCODING 20745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -5300 -6F80 -A000 -BB00 -7B00 -4000 -5200 -7300 -6D00 -ENDCHAR -STARTCHAR 5112 -ENCODING 20754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4400 -7F80 -A480 -8400 -BF80 -BF00 -AA80 -AA80 -AB00 -ENDCHAR -STARTCHAR 511F -ENCODING 20767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -7F80 -6080 -9F00 -8000 -9F00 -9F00 -9F00 -8200 -B180 -ENDCHAR -STARTCHAR 5121 -ENCODING 20769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -55 -5F -9F -80 -BF -BF -BF -BF -AD -ENDCHAR -STARTCHAR 512A -ENCODING 20778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -5F00 -5F00 -9F00 -BF80 -BF80 -6F00 -5F00 -6A00 -7F80 -ENDCHAR -STARTCHAR 5132 -ENCODING 20786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7200 -4700 -7B00 -B780 -8300 -B700 -BD00 -AF00 -B700 -AD00 -ENDCHAR -STARTCHAR 5137 -ENCODING 20791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -7F00 -BE80 -8400 -BF80 -BF00 -BF00 -B300 -BE80 -D300 -ENDCHAR -STARTCHAR 513A -ENCODING 20794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6B00 -7D00 -BF80 -BD00 -BB80 -BD00 -BB80 -FD00 -B380 -CC00 -ENDCHAR -STARTCHAR 513C -ENCODING 20796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7B00 -7B00 -4000 -BF80 -BE00 -BF80 -BB00 -BB00 -B500 -4A80 -ENDCHAR -STARTCHAR 5140 -ENCODING 20800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -2400 -2400 -2400 -2400 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 5141 -ENCODING 20801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -2400 -2200 -FF00 -2400 -2400 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 5143 -ENCODING 20803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -0000 -0000 -FF00 -2400 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 5144 -ENCODING 20804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4100 -4100 -4100 -7E00 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 5145 -ENCODING 20805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2000 -2200 -FF00 -2500 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 5146 -ENCODING 20806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -1900 -9A00 -5A00 -1800 -6A00 -A900 -2800 -4880 -8700 -ENDCHAR -STARTCHAR 5147 -ENCODING 20807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4500 -7900 -5D00 -6500 -7E00 -1800 -2800 -4880 -8700 -ENDCHAR -STARTCHAR 5148 -ENCODING 20808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -4800 -7F00 -4800 -FF80 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 5149 -ENCODING 20809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -4A00 -2A00 -0800 -FF00 -2400 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 514B -ENCODING 20811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -0800 -7E00 -4100 -7E00 -5900 -2800 -6880 -8700 -ENDCHAR -STARTCHAR 514C -ENCODING 20812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -4200 -FF00 -C280 -4200 -7E00 -1800 -2880 -C700 -ENDCHAR -STARTCHAR 514D -ENCODING 20813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -3C00 -4400 -FF00 -C900 -4900 -7F00 -1800 -3880 -CF00 -ENDCHAR -STARTCHAR 514E -ENCODING 20814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -F800 -7F00 -4900 -4900 -7F00 -2A00 -6880 -8700 -ENDCHAR -STARTCHAR 5152 -ENCODING 20818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4100 -7F00 -4100 -4100 -7F00 -2400 -6480 -8700 -ENDCHAR -STARTCHAR 515C -ENCODING 20828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -DF00 -A500 -9D00 -DF00 -8100 -1400 -2400 -6480 -C700 -ENDCHAR -STARTCHAR 5162 -ENCODING 20834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF80 -4200 -FF00 -9900 -FF00 -6600 -6600 -BA80 -EB80 -ENDCHAR -STARTCHAR 5165 -ENCODING 20837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -78 -08 -08 -08 -18 -14 -22 -43 -81 -ENDCHAR -STARTCHAR 5167 -ENCODING 20839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -70 -08 -FF -89 -95 -A5 -C3 -81 -83 -ENDCHAR -STARTCHAR 5168 -ENCODING 20840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -78 -14 -26 -41 -FE -08 -7E -08 -FF -ENDCHAR -STARTCHAR 5169 -ENCODING 20841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -FF -ED -AB -EF -D5 -89 -8B -ENDCHAR -STARTCHAR 516A -ENCODING 20842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -78 -14 -7E -F5 -95 -BA -B5 -95 -B3 -ENDCHAR -STARTCHAR 516B -ENCODING 20843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1C00 -0400 -2400 -2400 -2200 -4200 -4200 -8100 -8080 -ENDCHAR -STARTCHAR 516C -ENCODING 20844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3C -24 -42 -D1 -91 -24 -22 -46 -F9 -ENDCHAR -STARTCHAR 516D -ENCODING 20845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -FF00 -0000 -0000 -2400 -2200 -4200 -C100 -8080 -ENDCHAR -STARTCHAR 516E -ENCODING 20846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1C00 -2200 -4300 -FF80 -A000 -3E00 -4200 -0200 -0C00 -ENDCHAR -STARTCHAR 5171 -ENCODING 20849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -2400 -FF00 -2400 -2400 -FF80 -2400 -4300 -8100 -ENDCHAR -STARTCHAR 5175 -ENCODING 20853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0200 -7C00 -4000 -7F00 -4400 -FF80 -0000 -2600 -C100 -ENDCHAR -STARTCHAR 5176 -ENCODING 20854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FF00 -2200 -3E00 -2200 -3E00 -FF80 -0000 -6600 -8100 -ENDCHAR -STARTCHAR 5177 -ENCODING 20855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -4200 -7E00 -7E00 -4200 -FF80 -6600 -8100 -ENDCHAR -STARTCHAR 5178 -ENCODING 20856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -14 -7E -55 -55 -7E -55 -FF -00 -66 -81 -ENDCHAR -STARTCHAR 517C -ENCODING 20860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -7F00 -9480 -7E00 -FF80 -7E00 -3400 -5700 -9500 -ENDCHAR -STARTCHAR 5180 -ENCODING 20864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1900 -EE80 -9F00 -7E00 -7E00 -7E00 -E700 -FF80 -6600 -8180 -ENDCHAR -STARTCHAR 5186 -ENCODING 20870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -89 -89 -89 -FF -81 -81 -81 -83 -ENDCHAR -STARTCHAR 518A -ENCODING 20874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -5500 -5500 -5500 -FF80 -5500 -5500 -5500 -4300 -ENDCHAR -STARTCHAR 518D -ENCODING 20877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -7E00 -7E00 -4A00 -FF80 -4200 -4200 -4200 -ENDCHAR -STARTCHAR 5192 -ENCODING 20882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -81 -FF -7E -7E -7E -7E -42 -ENDCHAR -STARTCHAR 5195 -ENCODING 20885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4100 -7E00 -3C00 -7F00 -C900 -7F00 -3880 -CF00 -ENDCHAR -STARTCHAR 5197 -ENCODING 20887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8100 -3C00 -2400 -2400 -2400 -4480 -4480 -8700 -ENDCHAR -STARTCHAR 51A0 -ENCODING 20896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8280 -7200 -0F00 -F600 -6600 -6600 -A080 -9F00 -ENDCHAR -STARTCHAR 51A5 -ENCODING 20901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8100 -FF00 -7E00 -7E00 -FF80 -0000 -6600 -8100 -ENDCHAR -STARTCHAR 51AA -ENCODING 20906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -7E00 -7E00 -7E00 -FF80 -7E00 -CB80 -4E00 -ENDCHAR -STARTCHAR 51AC -ENCODING 20908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -3E00 -6400 -F400 -9800 -6600 -9980 -0C00 -7800 -0E00 -ENDCHAR -STARTCHAR 51B6 -ENCODING 20918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -8A00 -5100 -1F00 -0080 -5F00 -6100 -A100 -9F00 -2100 -ENDCHAR -STARTCHAR 51B7 -ENCODING 20919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8C00 -5400 -2300 -5E80 -0000 -7F00 -8900 -8B00 -0800 -ENDCHAR -STARTCHAR 51BD -ENCODING 20925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -81 -BB -53 -1B -2B -5B -9B -93 -91 -A3 -ENDCHAR -STARTCHAR 51C4 -ENCODING 20932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -BF80 -BF00 -0900 -7F80 -7F00 -BF00 -9200 -8E00 -7100 -ENDCHAR -STARTCHAR 51C6 -ENCODING 20934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -9400 -5F00 -3400 -3F00 -5400 -5F00 -9400 -9F80 -9000 -ENDCHAR -STARTCHAR 51C9 -ENCODING 20937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -BF80 -4000 -1F00 -2100 -5F00 -4400 -9600 -A500 -C880 -ENDCHAR -STARTCHAR 51CB -ENCODING 20939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -65 -2F -2F -65 -6F -AF -AB -43 -ENDCHAR -STARTCHAR 51CC -ENCODING 20940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -BF00 -4800 -3F80 -1F00 -7800 -7E00 -B200 -8E00 -B180 -ENDCHAR -STARTCHAR 51CD -ENCODING 20941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -BF80 -4400 -3F00 -3F00 -6500 -7F00 -8C00 -B700 -C480 -ENDCHAR -STARTCHAR 51DC -ENCODING 20956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F80 -8000 -7F00 -2B00 -3F00 -4300 -9C00 -BF80 -9E00 -2580 -ENDCHAR -STARTCHAR 51DD -ENCODING 20957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2F00 -B900 -7A00 -2100 -3F80 -5680 -FF80 -9600 -BA00 -CB80 -ENDCHAR -STARTCHAR 51DE -ENCODING 20958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -D500 -7F00 -CC00 -FC80 -FF00 -4900 -A500 -9480 -ENDCHAR -STARTCHAR 51E1 -ENCODING 20961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7C00 -4400 -6400 -5400 -4C00 -4400 -4400 -8480 -8700 -ENDCHAR -STARTCHAR 51F0 -ENCODING 20976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -9200 -BE00 -BE00 -BE00 -FE00 -9180 -FF00 -8100 -ENDCHAR -STARTCHAR 51F1 -ENCODING 20977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D600 -F500 -0500 -F500 -0500 -F900 -F900 -A900 -7980 -D180 -ENDCHAR -STARTCHAR 51F6 -ENCODING 20982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -02 -85 -A5 -99 -99 -95 -A7 -C3 -FF -81 -ENDCHAR -STARTCHAR 51F8 -ENCODING 20984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3C -24 -24 -E7 -81 -81 -81 -FF -81 -ENDCHAR -STARTCHAR 51F9 -ENCODING 20985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -E7 -A5 -A5 -A5 -9D -81 -81 -FF -81 -ENDCHAR -STARTCHAR 51FA -ENCODING 20986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -49 -49 -49 -7F -08 -89 -89 -FF -81 -ENDCHAR -STARTCHAR 51FD -ENCODING 20989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -1000 -DB00 -AD00 -8900 -BD00 -FB00 -FF00 -8100 -ENDCHAR -STARTCHAR 5200 -ENCODING 20992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -11 -11 -11 -11 -21 -21 -41 -86 -ENDCHAR -STARTCHAR 5203 -ENCODING 20995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -09 -49 -51 -91 -11 -21 -61 -86 -ENDCHAR -STARTCHAR 5206 -ENCODING 20998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -4200 -C300 -FF80 -1200 -1200 -2200 -4200 -8C00 -ENDCHAR -STARTCHAR 5207 -ENCODING 20999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5F -45 -55 -E5 -45 -59 -69 -11 -17 -ENDCHAR -STARTCHAR 5208 -ENCODING 21000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -15 -95 -65 -25 -25 -35 -4D -81 -83 -ENDCHAR -STARTCHAR 520A -ENCODING 21002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -25 -25 -FD -25 -25 -21 -21 -23 -ENDCHAR -STARTCHAR 520E -ENCODING 21006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -41 -43 -FB -BB -DB -6B -AB -4B -C9 -B3 -ENDCHAR -STARTCHAR 5211 -ENCODING 21009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F9 -55 -55 -55 -FD -55 -55 -51 -91 -93 -ENDCHAR -STARTCHAR 5217 -ENCODING 21015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -45 -7D -4D -F5 -B5 -25 -41 -83 -ENDCHAR -STARTCHAR 521D -ENCODING 21021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -5F -E5 -25 -55 -E5 -D9 -49 -51 -57 -ENDCHAR -STARTCHAR 5224 -ENCODING 21028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -75 -AD -25 -FD -2D -F5 -45 -41 -83 -ENDCHAR -STARTCHAR 5225 -ENCODING 21029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F5 -95 -95 -F5 -45 -75 -55 -51 -91 -B3 -ENDCHAR -STARTCHAR 5229 -ENCODING 21033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -C5 -25 -F5 -65 -55 -B5 -A5 -21 -23 -ENDCHAR -STARTCHAR 522A -ENCODING 21034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F9 -DB -DB -DB -FF -DB -DB -DB -D9 -9B -ENDCHAR -STARTCHAR 522E -ENCODING 21038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -11 -E5 -25 -FD -25 -25 -FD -8D -F9 -8B -ENDCHAR -STARTCHAR 5230 -ENCODING 21040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -55 -5D -ED -25 -FD -25 -39 -E3 -ENDCHAR -STARTCHAR 5236 -ENCODING 21046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -A1 -FB -A3 -FB -23 -FB -AB -A9 -B9 -23 -ENDCHAR -STARTCHAR 5237 -ENCODING 21047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F9 -8B -FB -A3 -FB -EB -EB -EB -69 -23 -ENDCHAR -STARTCHAR 5238 -ENCODING 21048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -5200 -FF00 -9500 -FF80 -4200 -FF80 -1200 -2200 -CC00 -ENDCHAR -STARTCHAR 5239 -ENCODING 21049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -11 -75 -55 -AD -25 -FD -65 -B5 -A9 -23 -ENDCHAR -STARTCHAR 523A -ENCODING 21050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -FB -23 -FB -AB -AB -FB -B3 -A9 -23 -ENDCHAR -STARTCHAR 523B -ENCODING 21051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -FD -25 -D5 -55 -2D -55 -A1 -51 -8B -ENDCHAR -STARTCHAR 5243 -ENCODING 21059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -51 -53 -FB -2B -FB -FB -2B -EB -B9 -23 -ENDCHAR -STARTCHAR 5247 -ENCODING 21063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F1 -95 -95 -F5 -95 -F5 -F5 -01 -51 -8B -ENDCHAR -STARTCHAR 524A -ENCODING 21066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -71 -AD -AD -FD -8D -FD -8D -FD -89 -93 -ENDCHAR -STARTCHAR 524B -ENCODING 21067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -FD00 -2500 -F500 -9500 -F500 -6100 -6300 -A080 -9F00 -ENDCHAR -STARTCHAR 524C -ENCODING 21068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -FD -25 -FD -AD -FD -65 -B5 -A9 -23 -ENDCHAR -STARTCHAR 524D -ENCODING 21069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -F500 -9500 -F500 -9500 -F500 -9100 -B300 -ENDCHAR -STARTCHAR 5254 -ENCODING 21076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F9 -8B -FB -8B -FB -7B -BB -6B -E9 -5B -ENDCHAR -STARTCHAR 5256 -ENCODING 21078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -FD -55 -55 -FD -05 -F5 -8D -F1 -8B -ENDCHAR -STARTCHAR 525B -ENCODING 21083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F9 -D7 -D7 -97 -FB -F7 -F7 -F7 -D5 -9B -ENDCHAR -STARTCHAR 525D -ENCODING 21085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -41 -75 -55 -F5 -FD -AD -75 -79 -A9 -63 -ENDCHAR -STARTCHAR 5261 -ENCODING 21089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -29 -AD -B5 -55 -8D -AD -B5 -A5 -51 -8B -ENDCHAR -STARTCHAR 5269 -ENCODING 21097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -19 -E3 -FF -77 -EF -EF -33 -EB -A9 -23 -ENDCHAR -STARTCHAR 526A -ENCODING 21098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -F500 -F500 -F500 -B300 -0000 -FF00 -1100 -E700 -ENDCHAR -STARTCHAR 526F -ENCODING 21103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F9 -03 -FB -FB -03 -FB -AB -FB -F9 -8B -ENDCHAR -STARTCHAR 5272 -ENCODING 21106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -FD -AD -F5 -FD -FD -05 -F9 -F9 -8B -ENDCHAR -STARTCHAR 5275 -ENCODING 21109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -5B -FB -7B -7B -8B -FB -FB -C9 -FB -ENDCHAR -STARTCHAR 527D -ENCODING 21117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F9 -53 -FB -FB -03 -FB -FB -6B -A9 -E7 -ENDCHAR -STARTCHAR 527F -ENCODING 21119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -69 -D3 -6B -FB -FB -FB -FB -33 -F9 -AB -ENDCHAR -STARTCHAR 5283 -ENCODING 21123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -FB -EF -FB -FF -03 -FB -F9 -F9 -FF -ENDCHAR -STARTCHAR 5287 -ENCODING 21127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -3B -FF -FB -BB -FB -F7 -D9 -B5 -73 -ENDCHAR -STARTCHAR 5288 -ENCODING 21128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -9F80 -F500 -FF80 -FF80 -D200 -FF00 -1100 -2100 -C700 -ENDCHAR -STARTCHAR 5289 -ENCODING 21129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -41 -DB -D7 -FB -A3 -53 -FB -23 -69 -F3 -ENDCHAR -STARTCHAR 528D -ENCODING 21133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -5B -F7 -03 -DB -DB -03 -4B -D9 -A7 -ENDCHAR -STARTCHAR 5291 -ENCODING 21137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -FF -03 -DF -F7 -FF -8B -FB -FB -89 -8B -ENDCHAR -STARTCHAR 5292 -ENCODING 21138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -67 -93 -FF -F7 -EB -F3 -95 -D5 -AB -ENDCHAR -STARTCHAR 529B -ENCODING 21147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -10 -FF -11 -11 -11 -21 -21 -41 -86 -ENDCHAR -STARTCHAR 529F -ENCODING 21151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -04 -F4 -4F -45 -45 -45 -79 -C9 -11 -17 -ENDCHAR -STARTCHAR 52A0 -ENCODING 21152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -47 -F5 -55 -55 -55 -55 -55 -97 -B5 -ENDCHAR -STARTCHAR 52A3 -ENCODING 21155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -2A -4B -9C -30 -C8 -FF -11 -31 -C6 -ENDCHAR -STARTCHAR 52A4 -ENCODING 21156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -14 -E4 -8F -F5 -A5 -A5 -A5 -A5 -A9 -2B -ENDCHAR -STARTCHAR 52A9 -ENCODING 21161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -04 -E4 -9F -E5 -95 -E5 -95 -B9 -C9 -13 -ENDCHAR -STARTCHAR 52AA -ENCODING 21162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -FF -95 -62 -DD -10 -FF -11 -62 -86 -ENDCHAR -STARTCHAR 52AB -ENCODING 21163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -22 -22 -F2 -2F -FB -45 -55 -BD -C9 -13 -ENDCHAR -STARTCHAR 52BE -ENCODING 21182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -22 -FA -47 -D3 -63 -55 -D5 -A5 -D5 -8B -ENDCHAR -STARTCHAR 52C1 -ENCODING 21185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -FC -B4 -DF -D5 -AD -05 -F5 -25 -39 -CB -ENDCHAR -STARTCHAR 52C3 -ENCODING 21187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -F4 -2F -F5 -F5 -25 -FD -25 -29 -4B -ENDCHAR -STARTCHAR 52C5 -ENCODING 21189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -F4 -24 -FF -B5 -F5 -65 -B5 -B9 -2B -ENDCHAR -STARTCHAR 52C7 -ENCODING 21191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -14 -7F -7F -7F -08 -FF -31 -C3 -ENDCHAR -STARTCHAR 52C9 -ENCODING 21193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7400 -AF00 -F500 -AD00 -F500 -2D00 -6B00 -E080 -9F00 -ENDCHAR -STARTCHAR 52CD -ENCODING 21197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -FC -0F -F5 -95 -F5 -B5 -B5 -A9 -6B -ENDCHAR -STARTCHAR 52D2 -ENCODING 21202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -A4 -F4 -AF -E5 -F5 -D5 -F5 -F9 -49 -4B -ENDCHAR -STARTCHAR 52D5 -ENCODING 21205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -14 -E4 -F7 -F5 -B5 -F5 -F5 -F5 -35 -CB -ENDCHAR -STARTCHAR 52D6 -ENCODING 21206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F4 -94 -FF -F5 -05 -F5 -F5 -F5 -F5 -9B -ENDCHAR -STARTCHAR 52D8 -ENCODING 21208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -92 -FA -97 -F3 -73 -93 -FD -DD -FD -8B -ENDCHAR -STARTCHAR 52D9 -ENCODING 21209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -2F80 -5500 -F600 -5980 -6400 -CF00 -C500 -4900 -D300 -ENDCHAR -STARTCHAR 52DB -ENCODING 21211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F4 -94 -FF -F5 -95 -F5 -F5 -F5 -59 -9B -ENDCHAR -STARTCHAR 52DD -ENCODING 21213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -B500 -AE80 -CA00 -BF80 -F500 -BF80 -A500 -A900 -5600 -ENDCHAR -STARTCHAR 52DE -ENCODING 21214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BB -DB -77 -8C -FF -FF -12 -62 -C6 -ENDCHAR -STARTCHAR 52DF -ENCODING 21215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -2400 -7E00 -7E00 -7E00 -FF80 -5200 -FF80 -3200 -CC00 -ENDCHAR -STARTCHAR 52E2 -ENCODING 21218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF00 -F500 -B500 -F780 -F900 -1000 -FF00 -3100 -C600 -ENDCHAR -STARTCHAR 52E3 -ENCODING 21219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -22 -F2 -27 -FB -F5 -F5 -95 -F5 -F9 -9B -ENDCHAR -STARTCHAR 52E4 -ENCODING 21220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -94 -F4 -6F -F5 -D5 -F5 -F5 -F5 -59 -EB -ENDCHAR -STARTCHAR 52F3 -ENCODING 21235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -1A -E2 -FF -FB -FB -FB -FD -E5 -DD -CB -ENDCHAR -STARTCHAR 52F5 -ENCODING 21237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -FA -B2 -FF -FB -FB -FB -FB -EB -FD -DF -ENDCHAR -STARTCHAR 52F8 -ENCODING 21240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -52 -FA -F7 -EB -15 -FD -F5 -F5 -A5 -FB -ENDCHAR -STARTCHAR 52FA -ENCODING 21242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -40 -7F -C1 -81 -79 -01 -01 -01 -06 -ENDCHAR -STARTCHAR 52FB -ENCODING 21243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -40 -7F -C1 -FD -01 -1D -71 -01 -07 -ENDCHAR -STARTCHAR 52FE -ENCODING 21246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -40 -7F -E1 -A1 -29 -59 -E5 -01 -06 -ENDCHAR -STARTCHAR 52FF -ENCODING 21247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -20 -7F -55 -95 -A5 -49 -89 -11 -27 -ENDCHAR -STARTCHAR 5305 -ENCODING 21253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7F00 -4100 -F900 -C900 -4900 -7D00 -4200 -4080 -7F00 -ENDCHAR -STARTCHAR 5308 -ENCODING 21256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -7F -41 -A9 -93 -BB -6B -7D -41 -07 -ENDCHAR -STARTCHAR 530D -ENCODING 21261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -7F -55 -FF -FD -55 -7D -7D -55 -03 -ENDCHAR -STARTCHAR 530F -ENCODING 21263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -FF00 -A880 -9E80 -EA80 -FF00 -8B00 -E800 -A880 -6F00 -ENDCHAR -STARTCHAR 5310 -ENCODING 21264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -7F -41 -FD -C5 -39 -7D -7D -7D -03 -ENDCHAR -STARTCHAR 5315 -ENCODING 21269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -80 -84 -88 -B0 -C0 -80 -82 -82 -FE -ENDCHAR -STARTCHAR 5316 -ENCODING 21270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -2800 -4900 -4B00 -CC00 -C800 -4800 -4800 -4880 -4F00 -ENDCHAR -STARTCHAR 5317 -ENCODING 21271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -2400 -2500 -E700 -2400 -2400 -6400 -A400 -2480 -2700 -ENDCHAR -STARTCHAR 5319 -ENCODING 21273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F400 -F400 -F500 -0600 -FC00 -A480 -BF00 -E000 -BF80 -ENDCHAR -STARTCHAR 5320 -ENCODING 21280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8200 -BC00 -A000 -BF00 -A400 -A400 -FF80 -8000 -ENDCHAR -STARTCHAR 5321 -ENCODING 21281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8000 -BF00 -8800 -BE00 -8800 -FF00 -FF80 -8000 -ENDCHAR -STARTCHAR 5323 -ENCODING 21283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -8000 -BF00 -BF00 -A900 -BF00 -8800 -FF80 -8000 -ENDCHAR -STARTCHAR 532A -ENCODING 21290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -9400 -F700 -B700 -9400 -F700 -9400 -FF80 -8000 -ENDCHAR -STARTCHAR 532F -ENCODING 21295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -AA00 -9F00 -DF00 -9400 -AF00 -AF00 -D000 -FF80 -ENDCHAR -STARTCHAR 5339 -ENCODING 21305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -9400 -9400 -9400 -A500 -A700 -C000 -FF80 -8000 -ENDCHAR -STARTCHAR 533F -ENCODING 21311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -FF00 -9C00 -FF00 -B000 -DE00 -9E00 -A000 -FF80 -ENDCHAR -STARTCHAR 5340 -ENCODING 21312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -9E00 -A200 -9E00 -B700 -D500 -B700 -8000 -FF80 -ENDCHAR -STARTCHAR 5341 -ENCODING 21313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -08 -08 -FF -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR 5343 -ENCODING 21315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0E00 -F000 -0800 -0800 -FF80 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 5344 -ENCODING 21316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -2400 -2400 -FF80 -2400 -2400 -2400 -2400 -2400 -ENDCHAR -STARTCHAR 5347 -ENCODING 21319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -14 -E4 -24 -24 -FF -24 -24 -44 -84 -ENDCHAR -STARTCHAR 5348 -ENCODING 21320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F00 -4800 -8800 -0800 -FF80 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 5349 -ENCODING 21321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF00 -2A00 -2200 -FF80 -2200 -4200 -4200 -8200 -ENDCHAR -STARTCHAR 534A -ENCODING 21322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -2A -4B -89 -7E -08 -FF -08 -08 -08 -ENDCHAR -STARTCHAR 534D -ENCODING 21325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F1 -09 -09 -09 -FF -88 -88 -88 -8F -ENDCHAR -STARTCHAR 5351 -ENCODING 21329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7F00 -4900 -7F00 -4900 -7F00 -2800 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 5352 -ENCODING 21330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2400 -2400 -6700 -D900 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 5353 -ENCODING 21331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0F00 -7E00 -4100 -7E00 -4100 -7E00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 5354 -ENCODING 21332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -5F -49 -E9 -53 -52 -7F -5B -6B -7D -ENDCHAR -STARTCHAR 5357 -ENCODING 21335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -0800 -FF00 -9500 -BF00 -8900 -BF00 -8900 -8B00 -ENDCHAR -STARTCHAR 535A -ENCODING 21338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -7F80 -5F00 -D500 -5F00 -5F00 -4200 -7F80 -4A00 -4600 -ENDCHAR -STARTCHAR 535C -ENCODING 21340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 10 4 -1 -BITMAP -80 -80 -80 -C0 -A0 -90 -90 -80 -80 -80 -ENDCHAR -STARTCHAR 535E -ENCODING 21342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -00 -08 -0C -0E -09 -08 -08 -08 -ENDCHAR -STARTCHAR 5360 -ENCODING 21344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -1 -BITMAP -20 -20 -1E -20 -20 -FE -82 -82 -FE -82 -ENDCHAR -STARTCHAR 5366 -ENCODING 21350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -2200 -FA00 -FA00 -0300 -2280 -FA00 -2200 -3A00 -E200 -ENDCHAR -STARTCHAR 5368 -ENCODING 21352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -0F -7E -42 -4E -FF -81 -BD -BD -83 -ENDCHAR -STARTCHAR 536F -ENCODING 21359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -10 -67 -95 -95 -95 -95 -E7 -24 -C4 -ENDCHAR -STARTCHAR 5370 -ENCODING 21360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -30 -EF -89 -89 -F9 -89 -F9 -8B -08 -ENDCHAR -STARTCHAR 5371 -ENCODING 21361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7C00 -C400 -FF00 -5E00 -6200 -6200 -6600 -A080 -9F00 -ENDCHAR -STARTCHAR 5374 -ENCODING 21364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -27 -25 -FD -25 -FD -45 -55 -57 -FC -0C -ENDCHAR -STARTCHAR 5375 -ENCODING 21365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -17 -F5 -D5 -D5 -B7 -B5 -E7 -64 -C4 -ENDCHAR -STARTCHAR 5377 -ENCODING 21367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -5200 -FF00 -9500 -FF80 -6200 -BD80 -2C00 -2100 -3E00 -ENDCHAR -STARTCHAR 537D -ENCODING 21373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -F7 -95 -F5 -F5 -05 -95 -E7 -94 -F4 -ENDCHAR -STARTCHAR 537F -ENCODING 21375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -68 -DB -B7 -BB -B7 -BB -DF -D3 -5E -92 -ENDCHAR -STARTCHAR 5384 -ENCODING 21380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -80 -BE -A2 -A2 -A6 -A0 -A1 -BF -ENDCHAR -STARTCHAR 5393 -ENCODING 21395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -8800 -BF00 -BF00 -8000 -8800 -BF00 -8800 -FF80 -ENDCHAR -STARTCHAR 5398 -ENCODING 21400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -8000 -BF00 -BF00 -A900 -BF00 -BF00 -8800 -7F00 -ENDCHAR -STARTCHAR 539A -ENCODING 21402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -BE -BE -BE -80 -BE -FF -88 -98 -ENDCHAR -STARTCHAR 539F -ENCODING 21407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -8800 -BF00 -BF00 -A100 -BF00 -9600 -A500 -C880 -ENDCHAR -STARTCHAR 53A0 -ENCODING 21408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -B880 -AA80 -BA80 -AA80 -BA80 -BA80 -A880 -C700 -ENDCHAR -STARTCHAR 53A5 -ENCODING 21413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -AA00 -9380 -FE80 -DF00 -FA00 -A500 -A500 -4880 -ENDCHAR -STARTCHAR 53A6 -ENCODING 21414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -FF00 -BF00 -BF00 -BF00 -BF00 -FE00 -9400 -FB80 -ENDCHAR -STARTCHAR 53AD -ENCODING 21421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -BB00 -BA80 -BF80 -FA00 -CA00 -FB00 -FD00 -5C80 -ENDCHAR -STARTCHAR 53BB -ENCODING 21435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -7F00 -0800 -0800 -FF80 -1400 -2200 -4700 -F880 -ENDCHAR -STARTCHAR 53C3 -ENCODING 21443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -7E00 -4200 -9D00 -F700 -6A00 -B580 -5B00 -6C00 -7000 -ENDCHAR -STARTCHAR 53C8 -ENCODING 21448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4200 -2200 -2400 -1800 -1800 -1400 -6300 -8180 -ENDCHAR -STARTCHAR 53C9 -ENCODING 21449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -5200 -2A00 -2400 -1800 -1800 -3400 -6300 -8180 -ENDCHAR -STARTCHAR 53CA -ENCODING 21450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FC00 -2400 -2400 -2700 -3A00 -4A00 -4C00 -9A00 -E180 -ENDCHAR -STARTCHAR 53CB -ENCODING 21451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -2000 -FF80 -2000 -3E00 -5200 -4C00 -8C00 -9200 -6100 -ENDCHAR -STARTCHAR 53CD -ENCODING 21453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4000 -7F00 -5200 -5200 -8C00 -8C00 -9300 -A180 -ENDCHAR -STARTCHAR 53D4 -ENCODING 21460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -2F00 -3500 -2500 -FD00 -B500 -AA00 -AA00 -A500 -6880 -ENDCHAR -STARTCHAR 53D6 -ENCODING 21462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F800 -9F00 -F500 -9500 -F500 -9300 -F200 -1500 -1880 -ENDCHAR -STARTCHAR 53D7 -ENCODING 21463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -52 -4A -FF -81 -FF -24 -1C -E3 -ENDCHAR -STARTCHAR 53DB -ENCODING 21467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -E800 -D000 -EF00 -5500 -5500 -F200 -5200 -9500 -A880 -ENDCHAR -STARTCHAR 53E1 -ENCODING 21473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3000 -2700 -FD00 -7500 -ED00 -7300 -FA00 -F300 -9500 -F480 -ENDCHAR -STARTCHAR 53E2 -ENCODING 21474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -FF00 -2400 -FF00 -7E00 -FF80 -7F00 -7500 -F200 -1D80 -ENDCHAR -STARTCHAR 53E3 -ENCODING 21475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -FE -82 -82 -82 -82 -82 -FE -82 -ENDCHAR -STARTCHAR 53E4 -ENCODING 21476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF80 -0800 -0800 -7E00 -4200 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 53E5 -ENCODING 21477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -20 -7F -41 -81 -F9 -45 -79 -45 -07 -ENDCHAR -STARTCHAR 53E9 -ENCODING 21481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -99 -99 -99 -99 -99 -FB -88 -08 -ENDCHAR -STARTCHAR 53EA -ENCODING 21482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -42 -42 -42 -7E -00 -24 -43 -81 -ENDCHAR -STARTCHAR 53EB -ENCODING 21483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0100 -E900 -A900 -A900 -A900 -A900 -EF80 -9D00 -0100 -0100 -ENDCHAR -STARTCHAR 53EC -ENCODING 21484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -11 -21 -66 -80 -7E -41 -7E -41 -ENDCHAR -STARTCHAR 53ED -ENCODING 21485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DE00 -B200 -B200 -B200 -B200 -D200 -A100 -6100 -4080 -ENDCHAR -STARTCHAR 53EF -ENCODING 21487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -02 -7A -4A -4A -7A -4A -02 -06 -ENDCHAR -STARTCHAR 53F0 -ENCODING 21488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -2200 -2700 -F880 -0000 -0000 -7E00 -4100 -7E00 -4100 -ENDCHAR -STARTCHAR 53F1 -ENCODING 21489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -E800 -A900 -AA00 -AC00 -A800 -F800 -A880 -8880 -0F00 -ENDCHAR -STARTCHAR 53F2 -ENCODING 21490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -7F00 -4900 -4900 -7F00 -6800 -1000 -2C00 -C380 -ENDCHAR -STARTCHAR 53F3 -ENCODING 21491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -1000 -FF80 -2000 -2000 -7F00 -A100 -A100 -3F00 -2100 -ENDCHAR -STARTCHAR 53F8 -ENCODING 21496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -01 -FD -01 -79 -45 -79 -41 -03 -ENDCHAR -STARTCHAR 5403 -ENCODING 21507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -C800 -BF80 -B000 -BE00 -A400 -A800 -D080 -9080 -1F00 -ENDCHAR -STARTCHAR 5404 -ENCODING 21508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -3E00 -C200 -B400 -1C00 -6380 -FE00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 5408 -ENCODING 21512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -3400 -6300 -FF80 -0000 -7E00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 5409 -ENCODING 21513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF80 -0800 -FF00 -0000 -7E00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 540A -ENCODING 21514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FC -84 -FC -10 -FE -92 -92 -96 -10 -ENDCHAR -STARTCHAR 540C -ENCODING 21516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -81 -BF -BD -A5 -BD -A5 -81 -83 -ENDCHAR -STARTCHAR 540D -ENCODING 21517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -3E -62 -A4 -18 -70 -BF -21 -3F -21 -ENDCHAR -STARTCHAR 540E -ENCODING 21518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0300 -7C00 -4000 -7F80 -4000 -BF00 -A100 -BF00 -A100 -ENDCHAR -STARTCHAR 540F -ENCODING 21519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -0800 -7F00 -4900 -7F00 -2800 -1000 -2C00 -C380 -ENDCHAR -STARTCHAR 5410 -ENCODING 21520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -A400 -BF00 -A400 -A400 -E400 -A400 -8400 -3F80 -ENDCHAR -STARTCHAR 5411 -ENCODING 21521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -10 -FF -81 -BD -A5 -BD -A5 -81 -83 -ENDCHAR -STARTCHAR 541B -ENCODING 21531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -1200 -FF80 -7E00 -2000 -7F00 -C100 -BF00 -2100 -ENDCHAR -STARTCHAR 541D -ENCODING 21533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2400 -1800 -3600 -C180 -7E00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 541F -ENCODING 21535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0400 -CA00 -A900 -BE80 -A000 -BF00 -C100 -A200 -0200 -ENDCHAR -STARTCHAR 5420 -ENCODING 21536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -E500 -A500 -BF80 -A400 -AC00 -EA00 -B200 -3100 -2080 -ENDCHAR -STARTCHAR 5426 -ENCODING 21542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -18 -6E -89 -08 -7E -41 -7E -41 -ENDCHAR -STARTCHAR 5429 -ENCODING 21545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -EA00 -A900 -B080 -BF00 -A900 -E900 -9900 -3600 -ENDCHAR -STARTCHAR 542B -ENCODING 21547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -2400 -7F00 -8080 -7E00 -0200 -7E00 -4100 -7E00 -4100 -ENDCHAR -STARTCHAR 5433 -ENCODING 21555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -6200 -7E00 -4000 -7E00 -FF80 -1800 -6600 -C180 -ENDCHAR -STARTCHAR 5438 -ENCODING 21560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DE00 -D200 -D200 -DF00 -D500 -D600 -A600 -2B00 -5080 -ENDCHAR -STARTCHAR 5439 -ENCODING 21561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -E800 -AF00 -B500 -B500 -A400 -EC00 -AA00 -1100 -2080 -ENDCHAR -STARTCHAR 543B -ENCODING 21563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -E8 -AF -B7 -B7 -AB -AD -F5 -A9 -13 -ENDCHAR -STARTCHAR 543C -ENCODING 21564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3E00 -CA00 -CA00 -D200 -CE00 -B200 -D280 -D280 -3300 -ENDCHAR -STARTCHAR 543E -ENCODING 21566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -1000 -7E00 -FF80 -0000 -7E00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 5442 -ENCODING 21570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FC -84 -84 -FC -20 -FE -02 -FE -02 -ENDCHAR -STARTCHAR 5448 -ENCODING 21576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -41 -7E -00 -FF -08 -FF -08 -FF -ENDCHAR -STARTCHAR 544A -ENCODING 21578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -4800 -7F00 -4800 -FF80 -0800 -7E00 -4100 -7E00 -4100 -ENDCHAR -STARTCHAR 5451 -ENCODING 21585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0E00 -7000 -FF00 -2400 -4200 -FF80 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 5468 -ENCODING 21608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -89 -BD -BF -81 -BD -BD -A5 -83 -ENDCHAR -STARTCHAR 546A -ENCODING 21610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1F00 -D100 -B100 -BF00 -AA00 -CA00 -AA00 -1280 -2300 -ENDCHAR -STARTCHAR 5471 -ENCODING 21617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0300 -DE00 -B600 -B600 -B500 -B500 -D500 -9700 -3900 -2080 -ENDCHAR -STARTCHAR 5473 -ENCODING 21619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -C400 -BF00 -A400 -BF80 -A400 -CE00 -B500 -2480 -0400 -ENDCHAR -STARTCHAR 5475 -ENCODING 21621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF80 -A100 -BD00 -B500 -B500 -DD00 -B500 -0100 -0300 -ENDCHAR -STARTCHAR 547B -ENCODING 21627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -04 -C4 -BF -B5 -BF -B5 -BF -D5 -84 -04 -ENDCHAR -STARTCHAR 547C -ENCODING 21628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0300 -DC00 -B500 -AD00 -A400 -DF80 -A400 -0400 -0C00 -ENDCHAR -STARTCHAR 547D -ENCODING 21629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -3400 -6300 -BD80 -FF00 -9900 -9900 -FB00 -9800 -0800 -ENDCHAR -STARTCHAR 5480 -ENCODING 21632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -B100 -B100 -AF00 -B100 -EF00 -B100 -1100 -3F80 -ENDCHAR -STARTCHAR 5486 -ENCODING 21638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -DF00 -B100 -BD00 -B300 -BD00 -D100 -9300 -1080 -1F00 -ENDCHAR -STARTCHAR 548C -ENCODING 21644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -30 -CF -F9 -69 -59 -B9 -A9 -2F -29 -ENDCHAR -STARTCHAR 548E -ENCODING 21646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -7200 -D600 -A500 -7800 -DF80 -FE00 -4200 -4200 -7E00 -ENDCHAR -STARTCHAR 5490 -ENCODING 21648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0900 -C900 -A900 -B780 -B500 -AD00 -B300 -D100 -B100 -1300 -ENDCHAR -STARTCHAR 54A4 -ENCODING 21668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -E080 -C200 -DC00 -C580 -FE00 -C400 -8480 -0700 -ENDCHAR -STARTCHAR 54A8 -ENCODING 21672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -DF00 -2900 -6800 -9400 -2300 -7E80 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 54AB -ENCODING 21675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7700 -9500 -9500 -7700 -A500 -A500 -9880 -8800 -8780 -ENDCHAR -STARTCHAR 54AC -ENCODING 21676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -CA00 -D100 -B300 -CA00 -C400 -CC00 -1B00 -2180 -ENDCHAR -STARTCHAR 54B3 -ENCODING 21683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF80 -C400 -DA00 -CA00 -C500 -DA00 -1600 -1900 -3080 -ENDCHAR -STARTCHAR 54B8 -ENCODING 21688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -0500 -FF80 -BC00 -8500 -B500 -AE00 -B400 -AE80 -8900 -ENDCHAR -STARTCHAR 54BD -ENCODING 21693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -1F -D5 -D5 -DF -D5 -D7 -D9 -1F -11 -ENDCHAR -STARTCHAR 54C0 -ENCODING 21696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E00 -4200 -4200 -7E00 -2900 -E600 -3B00 -6080 -ENDCHAR -STARTCHAR 54C1 -ENCODING 21697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -42 -7E -42 -00 -F7 -99 -F7 -99 -ENDCHAR -STARTCHAR 54C4 -ENCODING 21700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -CA00 -BF00 -AA00 -AA00 -AA00 -DF80 -AA00 -1100 -2080 -ENDCHAR -STARTCHAR 54C8 -ENCODING 21704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -CA00 -D100 -AE80 -C000 -C000 -DF00 -9100 -1F00 -1100 -ENDCHAR -STARTCHAR 54C9 -ENCODING 21705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -F600 -2500 -FF80 -0400 -F500 -9500 -9600 -FE80 -0900 -ENDCHAR -STARTCHAR 54E1 -ENCODING 21729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -00 -7F -7F -7F -7F -26 -C1 -ENDCHAR -STARTCHAR 54E5 -ENCODING 21733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -7A -4A -7E -FF -02 -7A -7A -06 -ENDCHAR -STARTCHAR 54E8 -ENCODING 21736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -CD00 -B480 -BF00 -B100 -BF00 -D100 -BF00 -1100 -1300 -ENDCHAR -STARTCHAR 54ED -ENCODING 21741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -9900 -F700 -0A00 -FF00 -1800 -2400 -4200 -8180 -ENDCHAR -STARTCHAR 54EE -ENCODING 21742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -C500 -BF80 -C400 -DE00 -D780 -3C00 -0400 -0C00 -ENDCHAR -STARTCHAR 54F2 -ENCODING 21746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -FE00 -4F80 -FA00 -4A00 -D200 -7F00 -4100 -4100 -7F00 -ENDCHAR -STARTCHAR 54FA -ENCODING 21754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -C500 -DF80 -DF00 -D500 -DF00 -D500 -DF00 -1500 -1500 -ENDCHAR -STARTCHAR 5504 -ENCODING 21764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1F00 -F100 -BF00 -B100 -BF00 -F100 -9F00 -0B00 -1080 -ENDCHAR -STARTCHAR 5506 -ENCODING 21766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -C900 -BF00 -AA80 -BB00 -A800 -DF00 -A600 -0E00 -3180 -ENDCHAR -STARTCHAR 5507 -ENCODING 21767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -BE -FF -A9 -FE -81 -7F -41 -7F -ENDCHAR -STARTCHAR 550E -ENCODING 21774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -0D -DB -CB -DF -CB -D7 -DF -8B -09 -09 -ENDCHAR -STARTCHAR 5510 -ENCODING 21776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BF00 -8900 -FF80 -BF00 -BF00 -A100 -A100 -BF00 -ENDCHAR -STARTCHAR 551C -ENCODING 21788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -2E00 -C980 -0800 -FB00 -9C00 -F880 -9700 -ENDCHAR -STARTCHAR 552F -ENCODING 21807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -EA00 -BF80 -B200 -AF00 -B200 -EF00 -B200 -0F80 -1000 -ENDCHAR -STARTCHAR 5531 -ENCODING 21809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -0F -D1 -AF -AF -A0 -DF -9F -11 -1F -ENDCHAR -STARTCHAR 5535 -ENCODING 21813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF80 -CA00 -D500 -BF80 -B500 -BF00 -DF00 -9480 -0700 -ENDCHAR -STARTCHAR 553E -ENCODING 21822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0300 -DC00 -DF00 -D500 -BF80 -D500 -DF00 -8400 -3F80 -ENDCHAR -STARTCHAR 5544 -ENCODING 21828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -CA00 -DA80 -A700 -DE00 -ED00 -9500 -2480 -0C00 -ENDCHAR -STARTCHAR 5546 -ENCODING 21830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -24 -FF -A9 -AF -FD -A5 -BD -83 -ENDCHAR -STARTCHAR 554F -ENCODING 21839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -BD -A5 -BD -A5 -83 -ENDCHAR -STARTCHAR 5553 -ENCODING 21843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -E780 -F900 -9500 -F700 -8880 -FE00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 5556 -ENCODING 21846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -ED00 -B700 -AB00 -B180 -AD00 -B500 -F600 -0900 -1080 -ENDCHAR -STARTCHAR 555E -ENCODING 21854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1F00 -CA00 -CA00 -DB00 -D100 -DB00 -CA00 -8A00 -3F80 -ENDCHAR -STARTCHAR 5563 -ENCODING 21859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -DF -EB -CB -FF -EF -EB -AB -2E -32 -ENDCHAR -STARTCHAR 557C -ENCODING 21884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -CA00 -DF80 -D480 -DF00 -D500 -D500 -1700 -0400 -ENDCHAR -STARTCHAR 5580 -ENCODING 21888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF80 -E880 -EF80 -DA00 -CE00 -D180 -DF00 -9F00 -1100 -ENDCHAR -STARTCHAR 5584 -ENCODING 21892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -7F00 -FF00 -2A00 -FF80 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR 5586 -ENCODING 21894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -FF80 -4200 -FF00 -0000 -F700 -9900 -F700 -9900 -ENDCHAR -STARTCHAR 5587 -ENCODING 21895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -09 -FF -CB -FF -EF -FF -DB -AD -2D -0B -ENDCHAR -STARTCHAR 5589 -ENCODING 21897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1F00 -D100 -DF00 -E800 -EF00 -EC00 -EF00 -E600 -A900 -2880 -ENDCHAR -STARTCHAR 558A -ENCODING 21898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0300 -C200 -FF80 -EE00 -E280 -EF00 -F700 -AE00 -2580 -4980 -ENDCHAR -STARTCHAR 5598 -ENCODING 21912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1500 -D500 -DF00 -C000 -BF80 -DF00 -DB00 -DB00 -1B00 -1B00 -ENDCHAR -STARTCHAR 5599 -ENCODING 21913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -DE00 -DE00 -BF80 -DA80 -AB00 -CE00 -FD00 -2480 -0C00 -ENDCHAR -STARTCHAR 559A -ENCODING 21914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -DE00 -FF00 -DC80 -DD00 -D300 -C400 -BF80 -0A00 -3180 -ENDCHAR -STARTCHAR 559C -ENCODING 21916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7F00 -7E00 -4200 -7E00 -FF80 -7E00 -7E00 -4100 -ENDCHAR -STARTCHAR 559D -ENCODING 21917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -DF00 -D100 -CE00 -DF80 -B480 -DA80 -1E80 -1300 -ENDCHAR -STARTCHAR 55A7 -ENCODING 21927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -E080 -DF00 -DF00 -D100 -DF00 -DF00 -8000 -3F80 -ENDCHAR -STARTCHAR 55A9 -ENCODING 21929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1C00 -CB00 -BF80 -DF00 -D700 -DD00 -DF00 -1700 -1D80 -ENDCHAR -STARTCHAR 55AA -ENCODING 21930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -EF00 -AD00 -EF00 -FF80 -4900 -4600 -5A00 -E180 -ENDCHAR -STARTCHAR 55AB -ENCODING 21931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1300 -FA80 -FA80 -DA80 -F500 -C400 -FF80 -CC00 -1200 -2180 -ENDCHAR -STARTCHAR 55AC -ENCODING 21932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -1000 -FF00 -FF80 -3C00 -FF00 -BD00 -BD00 -8300 -ENDCHAR -STARTCHAR 55AE -ENCODING 21934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -F700 -0000 -7E00 -7E00 -7E00 -0800 -FF80 -0800 -ENDCHAR -STARTCHAR 55C5 -ENCODING 21957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -DF00 -D100 -DF00 -DF00 -C600 -FF00 -0A00 -3180 -ENDCHAR -STARTCHAR 55C7 -ENCODING 21959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -6E00 -ED00 -FF80 -7F00 -4100 -7D00 -4100 -7F00 -ENDCHAR -STARTCHAR 55D4 -ENCODING 21972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1700 -D880 -DF00 -DF00 -DF00 -DF00 -DF00 -9F80 -0A00 -3180 -ENDCHAR -STARTCHAR 55DA -ENCODING 21978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -B100 -BF00 -B000 -BF80 -BF80 -FE80 -1D00 -2B00 -ENDCHAR -STARTCHAR 55DC -ENCODING 21980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -DF00 -CA00 -BF80 -DC80 -CF00 -DF00 -DF00 -9F00 -1100 -ENDCHAR -STARTCHAR 55DF -ENCODING 21983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -DF80 -C400 -DF00 -C400 -DF80 -CF00 -9400 -2400 -3F80 -ENDCHAR -STARTCHAR 55E3 -ENCODING 21987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -F1 -0F -F7 -F7 -F7 -F7 -F1 -F3 -ENDCHAR -STARTCHAR 55E4 -ENCODING 21988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -D500 -DF00 -C000 -BF80 -DF00 -D500 -DF00 -0780 -3C80 -ENDCHAR -STARTCHAR 55FD -ENCODING 22013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1200 -FE00 -D380 -FC80 -F700 -FA00 -DA00 -B700 -3300 -1480 -ENDCHAR -STARTCHAR 55FE -ENCODING 22014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -D780 -FC00 -D300 -DE00 -EA00 -EF80 -AB00 -2B00 -5480 -ENDCHAR -STARTCHAR 5606 -ENCODING 22022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -FF00 -CE00 -DF00 -D500 -DF00 -DF00 -BF80 -0A00 -3180 -ENDCHAR -STARTCHAR 5609 -ENCODING 22025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0000 -7E00 -4100 -FF80 -4000 -F700 -5900 -B700 -ENDCHAR -STARTCHAR 5614 -ENCODING 22036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1F80 -DF00 -D900 -DF00 -DF00 -DE80 -DF00 -9000 -1F80 -ENDCHAR -STARTCHAR 5617 -ENCODING 22039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4A -FF -FF -7E -47 -7F -00 -7E -41 -7E -ENDCHAR -STARTCHAR 562F -ENCODING 22063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -BF80 -DF00 -DF00 -DF00 -DF00 -9F00 -2F00 -2F00 -ENDCHAR -STARTCHAR 5632 -ENCODING 22066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -13 -FF -D3 -FB -FB -EB -FB -BD -15 -15 -ENDCHAR -STARTCHAR 5634 -ENCODING 22068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0B00 -DF00 -DC80 -FB80 -DE00 -FF00 -DF00 -D480 -1F00 -2300 -ENDCHAR -STARTCHAR 5636 -ENCODING 22070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1B00 -FE00 -DA00 -DB80 -DB00 -DB00 -FD00 -DB00 -A500 -2500 -ENDCHAR -STARTCHAR 5653 -ENCODING 22099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -C700 -DF80 -EE80 -E480 -E700 -F700 -2F00 -2600 -5F80 -ENDCHAR -STARTCHAR 5668 -ENCODING 22120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -F700 -9900 -1200 -FF80 -6600 -FF80 -7F00 -9900 -ENDCHAR -STARTCHAR 566B -ENCODING 22123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -FF00 -C000 -DF00 -DF00 -DF00 -ED00 -EF00 -2E80 -ENDCHAR -STARTCHAR 5674 -ENCODING 22132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -BF80 -A900 -BF00 -BF00 -DF00 -BF00 -0A00 -3180 -ENDCHAR -STARTCHAR 5686 -ENCODING 22150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -DF80 -DF80 -C000 -CF00 -C000 -DF00 -DE80 -1E80 -1100 -ENDCHAR -STARTCHAR 56A5 -ENCODING 22181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -DF00 -CE00 -D180 -FD00 -DA80 -FD80 -D000 -1B00 -2A80 -ENDCHAR -STARTCHAR 56AC -ENCODING 22188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0F80 -EA00 -EF00 -ED00 -FF00 -F500 -FF00 -9F00 -1300 -2480 -ENDCHAR -STARTCHAR 56AE -ENCODING 22190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B00 -D700 -5F00 -EA80 -5F00 -9E00 -FF00 -BD00 -BD00 -8300 -ENDCHAR -STARTCHAR 56B4 -ENCODING 22196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7700 -7700 -FF80 -FA00 -FF80 -F500 -F200 -CB00 -F480 -ENDCHAR -STARTCHAR 56BC -ENCODING 22204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0300 -DC80 -BF00 -DF00 -C100 -DF80 -D700 -DF00 -9D00 -1300 -ENDCHAR -STARTCHAR 56CA -ENCODING 22218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -7E00 -FF00 -DA80 -2400 -7F00 -FF80 -2E00 -F180 -ENDCHAR -STARTCHAR 56CD -ENCODING 22221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF80 -F700 -F700 -9500 -F700 -FF80 -F700 -F700 -9900 -ENDCHAR -STARTCHAR 56D1 -ENCODING 22225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3F -FF -E4 -FF -FF -EF -B7 -3F -43 -ENDCHAR -STARTCHAR 56DA -ENCODING 22234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -89 -89 -99 -99 -A5 -A3 -FF -81 -ENDCHAR -STARTCHAR 56DB -ENCODING 22235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -A9 -A9 -A9 -A9 -C7 -81 -FF -81 -ENDCHAR -STARTCHAR 56DE -ENCODING 22238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -81 -BD -A5 -A5 -BD -81 -FF -81 -ENDCHAR -STARTCHAR 56E0 -ENCODING 22240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -89 -89 -FF -99 -95 -A3 -FF -81 -ENDCHAR -STARTCHAR 56F0 -ENCODING 22256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -89 -FF -99 -AD -CB -89 -FF -81 -ENDCHAR -STARTCHAR 56F9 -ENCODING 22265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -99 -A5 -FF -BF -93 -97 -FF -81 -ENDCHAR -STARTCHAR 56FA -ENCODING 22266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -89 -FF -89 -BD -A5 -BD -FF -81 -ENDCHAR -STARTCHAR 5703 -ENCODING 22275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -8F -FF -BF -BF -BF -CF -FF -81 -ENDCHAR -STARTCHAR 5704 -ENCODING 22276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -BF -91 -BD -FF -BD -BD -FF -81 -ENDCHAR -STARTCHAR 5708 -ENCODING 22280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -AD -FF -FF -A5 -DF -A3 -FF -81 -ENDCHAR -STARTCHAR 570B -ENCODING 22283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -8B -FF -BB -B5 -85 -FB -FF -81 -ENDCHAR -STARTCHAR 570D -ENCODING 22285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -BD -FF -BF -BF -BF -BF -FF -81 -ENDCHAR -STARTCHAR 5712 -ENCODING 22290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -BF -FF -81 -BF -B7 -CB -FF -81 -ENDCHAR -STARTCHAR 5713 -ENCODING 22291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -A3 -9D -FF -FF -FF -BF -FF -81 -ENDCHAR -STARTCHAR 5716 -ENCODING 22294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -BD -BD -FF -BF -D7 -BF -C3 -FF -ENDCHAR -STARTCHAR 5718 -ENCODING 22296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -CB -FF -FF -85 -FF -9D -FF -ENDCHAR -STARTCHAR 571F -ENCODING 22303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -0800 -0800 -FF00 -0800 -0800 -0800 -0800 -FF80 -ENDCHAR -STARTCHAR 5728 -ENCODING 22312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -2000 -FF00 -2400 -4400 -DF00 -C400 -4400 -4400 -7F80 -ENDCHAR -STARTCHAR 572D -ENCODING 22317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -7F00 -0800 -FF00 -0800 -0800 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 5730 -ENCODING 22320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5400 -5500 -F700 -7D00 -5500 -7500 -5700 -9080 -0F00 -ENDCHAR -STARTCHAR 573B -ENCODING 22331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -4E00 -5000 -F000 -4F80 -5200 -7200 -D200 -1200 -2200 -ENDCHAR -STARTCHAR 5740 -ENCODING 22336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -5200 -F200 -5380 -5200 -5200 -7200 -D200 -3F80 -ENDCHAR -STARTCHAR 5742 -ENCODING 22338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5000 -5000 -FF00 -5500 -5500 -7200 -9200 -1D00 -2880 -ENDCHAR -STARTCHAR 5747 -ENCODING 22343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -48 -5F -F1 -6D -41 -7F -41 -81 -07 -ENDCHAR -STARTCHAR 574A -ENCODING 22346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -5F80 -E800 -4F00 -4900 -6900 -5100 -9100 -2700 -ENDCHAR -STARTCHAR 574D -ENCODING 22349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5100 -5500 -F300 -5100 -5F80 -7100 -5100 -9100 -2300 -ENDCHAR -STARTCHAR 574E -ENCODING 22350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -4F00 -F500 -5500 -4400 -6C00 -CA00 -1100 -2080 -ENDCHAR -STARTCHAR 5750 -ENCODING 22352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -4A00 -4A00 -6D00 -AD00 -0800 -7F00 -0800 -0800 -FF80 -ENDCHAR -STARTCHAR 5751 -ENCODING 22353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -4000 -E000 -4E00 -4A00 -6A00 -5280 -B280 -2380 -ENDCHAR -STARTCHAR 5761 -ENCODING 22369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -5480 -F400 -5F00 -5900 -7600 -A600 -2F00 -3980 -ENDCHAR -STARTCHAR 5764 -ENCODING 22372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -44 -5F -F5 -5F -55 -55 -7F -84 -04 -ENDCHAR -STARTCHAR 5766 -ENCODING 22374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -4900 -E900 -4F00 -4900 -6F00 -6900 -8800 -3F80 -ENDCHAR -STARTCHAR 576A -ENCODING 22378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4400 -4D00 -F500 -5480 -4400 -7F80 -4400 -8400 -0400 -ENDCHAR -STARTCHAR 576E -ENCODING 22382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -4900 -EB00 -5C80 -5F00 -7100 -9100 -1F00 -1100 -ENDCHAR -STARTCHAR 5770 -ENCODING 22384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -51 -51 -F7 -5B -5B -77 -99 -11 -13 -ENDCHAR -STARTCHAR 5775 -ENCODING 22389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4300 -5E00 -5000 -F000 -5F80 -5200 -7200 -D200 -3F80 -ENDCHAR -STARTCHAR 577C -ENCODING 22396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -5000 -FF80 -5200 -5E00 -7700 -D280 -1200 -2200 -ENDCHAR -STARTCHAR 5782 -ENCODING 22402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -06 -7C -FF -2A -FF -2A -FF -08 -FF -ENDCHAR -STARTCHAR 5788 -ENCODING 22408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -4F00 -7800 -C400 -C400 -4280 -4B00 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 578B -ENCODING 22411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5500 -5500 -FD00 -5500 -9300 -8800 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 5793 -ENCODING 22419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -4800 -FA00 -4A00 -4500 -7A00 -9600 -1900 -3080 -ENDCHAR -STARTCHAR 57A0 -ENCODING 22432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -5100 -5F00 -F100 -5F00 -5500 -7300 -DF00 -3180 -ENDCHAR -STARTCHAR 57A2 -ENCODING 22434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4300 -5E00 -5000 -FF80 -5000 -7F00 -9900 -2F00 -2900 -ENDCHAR -STARTCHAR 57A3 -ENCODING 22435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -4000 -5F00 -F100 -5F00 -5100 -7F00 -8000 -3F80 -ENDCHAR -STARTCHAR 57C3 -ENCODING 22467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4A00 -5F00 -F000 -5F00 -4400 -5F80 -8C00 -1B00 -2180 -ENDCHAR -STARTCHAR 57C7 -ENCODING 22471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -42 -44 -FF -55 -5F -75 -5F -95 -15 -ENDCHAR -STARTCHAR 57C8 -ENCODING 22472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4900 -5F00 -EA80 -5B00 -4F00 -7200 -AA00 -0E00 -3180 -ENDCHAR -STARTCHAR 57CB -ENCODING 22475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5500 -5500 -FF00 -5500 -5F00 -7F00 -4400 -8400 -3F80 -ENDCHAR -STARTCHAR 57CE -ENCODING 22478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -4500 -5F80 -F480 -5B00 -5B00 -5A00 -AA00 -2580 -2900 -ENDCHAR -STARTCHAR 57DF -ENCODING 22495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -4300 -7F80 -C200 -5B00 -5B00 -6300 -BE00 -0580 -0900 -ENDCHAR -STARTCHAR 57E0 -ENCODING 22496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -5100 -FF00 -5F00 -5100 -7F00 -BF80 -0400 -0400 -ENDCHAR -STARTCHAR 57F0 -ENCODING 22512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5F00 -5480 -F000 -4400 -5F00 -6E00 -9500 -2480 -0400 -ENDCHAR -STARTCHAR 57F4 -ENCODING 22516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -5F80 -4400 -EF00 -5F00 -5900 -7F00 -5F00 -9F80 -1000 -ENDCHAR -STARTCHAR 57F7 -ENCODING 22519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F400 -4F00 -F500 -AD00 -F500 -4500 -F900 -4980 -5180 -ENDCHAR -STARTCHAR 57F9 -ENCODING 22521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -4900 -EA00 -5F80 -4000 -7F00 -9100 -1F00 -1100 -ENDCHAR -STARTCHAR 57FA -ENCODING 22522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FF00 -3E00 -2200 -3E00 -FF80 -4A00 -BF80 -0800 -FF00 -ENDCHAR -STARTCHAR 57FC -ENCODING 22524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -4A00 -F100 -5F80 -4100 -7D00 -5D00 -9500 -0300 -ENDCHAR -STARTCHAR 5800 -ENCODING 22528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -51 -5F -D0 -5D -5D -6F -B5 -2F -31 -ENDCHAR -STARTCHAR 5802 -ENCODING 22530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -2A00 -FF00 -BE80 -4200 -4200 -3E00 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 5805 -ENCODING 22533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -A500 -F500 -F200 -F500 -0880 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 5806 -ENCODING 22534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4A00 -5F80 -F200 -4F00 -5200 -6F00 -D200 -0F80 -1000 -ENDCHAR -STARTCHAR 5808 -ENCODING 22536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -6B -6B -E3 -6F -6F -6F -AF -29 -23 -ENDCHAR -STARTCHAR 5809 -ENCODING 22537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -4A00 -FF00 -4000 -5F00 -7F00 -9F00 -1100 -1300 -ENDCHAR -STARTCHAR 580A -ENCODING 22538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -1400 -7700 -7700 -FF80 -0000 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 581E -ENCODING 22558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -7F80 -5500 -F700 -5F00 -4400 -7F80 -8600 -1D80 -2400 -ENDCHAR -STARTCHAR 5821 -ENCODING 22561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -5F00 -C400 -FF80 -4E00 -7580 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR 5824 -ENCODING 22564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -5100 -5F00 -FF00 -5F80 -7400 -5700 -AC00 -2780 -ENDCHAR -STARTCHAR 5827 -ENCODING 22567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4400 -5F00 -FA80 -5B00 -4400 -7F80 -8400 -0B00 -1080 -ENDCHAR -STARTCHAR 582A -ENCODING 22570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -5F80 -4900 -EF00 -4E00 -4900 -7F80 -9700 -1800 -1F80 -ENDCHAR -STARTCHAR 582F -ENCODING 22575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7E00 -FF00 -4200 -FF00 -CF00 -FF80 -2400 -6480 -8700 -ENDCHAR -STARTCHAR 5830 -ENCODING 22576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F80 -6F00 -6900 -EF00 -6F00 -5F80 -6200 -AD00 -1F80 -ENDCHAR -STARTCHAR 5831 -ENCODING 22577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -FF00 -4900 -FB00 -AF00 -FD00 -4B00 -FB00 -4B00 -4C80 -ENDCHAR -STARTCHAR 5834 -ENCODING 22580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -5F00 -FF00 -4000 -7F80 -7F00 -AB00 -1500 -0B00 -ENDCHAR -STARTCHAR 5835 -ENCODING 22581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -4600 -FF80 -4900 -5F00 -7100 -8F00 -0F00 -1100 -ENDCHAR -STARTCHAR 583A -ENCODING 22586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5500 -5F00 -F500 -5F00 -6B00 -9A80 -2A00 -1200 -2200 -ENDCHAR -STARTCHAR 584A -ENCODING 22602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -5500 -FF00 -5500 -5F00 -6F00 -9700 -1480 -2700 -ENDCHAR -STARTCHAR 584B -ENCODING 22603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D700 -DB00 -6700 -9900 -FF00 -8900 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 584F -ENCODING 22607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -5500 -5F00 -E000 -5F80 -5F00 -7F00 -4000 -8A00 -3F80 -ENDCHAR -STARTCHAR 5851 -ENCODING 22609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5700 -FD00 -B700 -B500 -F700 -4500 -8900 -7E00 -0800 -FF80 -ENDCHAR -STARTCHAR 5854 -ENCODING 22612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -7F80 -4E00 -EA00 -5F00 -6080 -7F00 -9100 -1F00 -1100 -ENDCHAR -STARTCHAR 5857 -ENCODING 22615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -1200 -AF80 -0400 -7F00 -AD00 -8800 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 5858 -ENCODING 22616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -9F80 -9F00 -D500 -9F80 -9F00 -5F00 -A900 -2900 -2F00 -ENDCHAR -STARTCHAR 585A -ENCODING 22618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -5080 -FF00 -4A80 -5700 -7D00 -5500 -9A80 -3C00 -ENDCHAR -STARTCHAR 585E -ENCODING 22622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -2400 -7F00 -FF80 -2A00 -7F00 -8880 -FF00 -ENDCHAR -STARTCHAR 5861 -ENCODING 22625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5300 -5C80 -5F00 -DF00 -5F00 -5F00 -6F00 -9F80 -0A00 -3180 -ENDCHAR -STARTCHAR 5862 -ENCODING 22626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -5100 -FF00 -5000 -5F80 -7F00 -5E80 -9F00 -2B00 -ENDCHAR -STARTCHAR 5864 -ENCODING 22628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -5F00 -FF00 -5100 -5F00 -7F00 -5F00 -8A00 -3180 -ENDCHAR -STARTCHAR 5875 -ENCODING 22645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -FF00 -A500 -B680 -FF00 -BF00 -8800 -7F80 -ENDCHAR -STARTCHAR 5879 -ENCODING 22649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -F600 -F400 -B780 -F500 -F900 -2900 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 587C -ENCODING 22652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -5F00 -DF00 -5500 -5F00 -5F00 -BF80 -1200 -0600 -ENDCHAR -STARTCHAR 587E -ENCODING 22654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -0F00 -F500 -6500 -6580 -3780 -C800 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR 5883 -ENCODING 22659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -4A00 -FF80 -5F00 -5F00 -7100 -9F00 -0A80 -3380 -ENDCHAR -STARTCHAR 5885 -ENCODING 22661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -F600 -FF80 -F300 -3200 -C600 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR 5889 -ENCODING 22665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -6F00 -DF80 -6F00 -6F00 -6F00 -B500 -2F00 -3500 -ENDCHAR -STARTCHAR 5893 -ENCODING 22675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -2400 -7E00 -7E00 -4200 -7E00 -FF80 -4A00 -BF80 -FF00 -ENDCHAR -STARTCHAR 589C -ENCODING 22684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F600 -DF00 -DA00 -AF00 -FB00 -9500 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR 589E -ENCODING 22686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4E00 -5100 -7F80 -DF00 -5F00 -7F00 -5100 -9F00 -1F00 -ENDCHAR -STARTCHAR 589F -ENCODING 22687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -5F80 -E880 -6480 -6700 -7700 -AF00 -2600 -5F80 -ENDCHAR -STARTCHAR 58A8 -ENCODING 22696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -AD00 -7F00 -7F00 -FF80 -6500 -AC80 -7F00 -FF80 -ENDCHAR -STARTCHAR 58A9 -ENCODING 22697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -BA00 -BB80 -FB00 -8500 -BF00 -5300 -BF00 -1700 -3480 -ENDCHAR -STARTCHAR 58AE -ENCODING 22702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -BF80 -CA00 -B400 -AF00 -EF00 -8900 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 58B3 -ENCODING 22707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -5F80 -E900 -5F00 -5F00 -7F00 -5F00 -8A00 -3180 -ENDCHAR -STARTCHAR 58BA -ENCODING 22714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -5F00 -FF00 -5700 -5D00 -6400 -9F80 -0A00 -3180 -ENDCHAR -STARTCHAR 58BB -ENCODING 22715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -5F00 -EE80 -7F80 -5F00 -7100 -9F00 -1500 -1F00 -ENDCHAR -STARTCHAR 58BE -ENCODING 22718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -E900 -7F00 -EF00 -AB00 -DF00 -2880 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 58C1 -ENCODING 22721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -9F00 -F500 -8F80 -FF00 -F200 -0A00 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 58C5 -ENCODING 22725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -4A00 -AF00 -5A00 -AE00 -CF80 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR 58C7 -ENCODING 22727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -4000 -5F00 -DB00 -5F00 -4000 -7F00 -5F00 -9F00 -3F80 -ENDCHAR -STARTCHAR 58CE -ENCODING 22734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -7F00 -DF00 -5F00 -5F00 -6400 -BF80 -1B00 -2A80 -ENDCHAR -STARTCHAR 58D1 -ENCODING 22737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3000 -F700 -ED00 -5500 -EA00 -FF00 -F500 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR 58D3 -ENCODING 22739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -AB00 -BF80 -BA00 -BB00 -BC80 -D800 -BF00 -FF80 -ENDCHAR -STARTCHAR 58D5 -ENCODING 22741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -4000 -5F00 -FF00 -7F80 -7F80 -7B00 -9700 -1D00 -3C80 -ENDCHAR -STARTCHAR 58D8 -ENCODING 22744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -FF00 -FF00 -FF00 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR 58D9 -ENCODING 22745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -5F80 -EE00 -5F80 -6F00 -6F00 -AD00 -2F00 -3180 -ENDCHAR -STARTCHAR 58DE -ENCODING 22750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -4000 -5F00 -DF00 -4400 -5F00 -7F00 -9500 -3700 -3880 -ENDCHAR -STARTCHAR 58DF -ENCODING 22751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -F700 -F700 -F800 -FE00 -FE80 -B700 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR 58E4 -ENCODING 22756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF80 -8000 -9B00 -DB00 -BF00 -9F00 -4A00 -BF80 -3600 -1980 -ENDCHAR -STARTCHAR 58EB -ENCODING 22763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -0800 -FF80 -0800 -0800 -0800 -0800 -0800 -FF00 -ENDCHAR -STARTCHAR 58EC -ENCODING 22764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -07 -F8 -08 -08 -FF -08 -08 -08 -FF -ENDCHAR -STARTCHAR 58EF -ENCODING 22767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -A400 -A400 -FF80 -2400 -E400 -A400 -A400 -AF00 -A000 -ENDCHAR -STARTCHAR 58F9 -ENCODING 22777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7F00 -0000 -FF00 -BF00 -7E00 -4200 -7E00 -FF80 -ENDCHAR -STARTCHAR 58FA -ENCODING 22778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7F00 -0000 -FF00 -9480 -7700 -7700 -1400 -FF80 -ENDCHAR -STARTCHAR 58FB -ENCODING 22779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F80 -5500 -5700 -EF80 -5F00 -7100 -5F00 -9F00 -1300 -ENDCHAR -STARTCHAR 58FD -ENCODING 22781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -0000 -FF00 -7E00 -7E00 -FF80 -EF80 -E500 -9200 -ENDCHAR -STARTCHAR 590F -ENCODING 22799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -7E00 -7E00 -7E00 -4100 -7E00 -6400 -9C00 -E780 -ENDCHAR -STARTCHAR 5914 -ENCODING 22804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -5F00 -E780 -FF00 -9C00 -7E00 -7E00 -D400 -FF80 -ENDCHAR -STARTCHAR 5915 -ENCODING 22805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -10 -1F -22 -42 -52 -8C -08 -30 -C0 -ENDCHAR -STARTCHAR 5916 -ENCODING 22806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -4400 -7400 -4C00 -D400 -3300 -2480 -2400 -4400 -8400 -ENDCHAR -STARTCHAR 5919 -ENCODING 22809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -8200 -BE00 -9E00 -A600 -BA00 -AA00 -9180 -A100 -ENDCHAR -STARTCHAR 591A -ENCODING 22810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -3E00 -6400 -9800 -3400 -DF80 -3100 -4E00 -1800 -E000 -ENDCHAR -STARTCHAR 591C -ENCODING 22812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -2800 -4F00 -5500 -DE00 -EC00 -4600 -5B00 -5100 -ENDCHAR -STARTCHAR 5922 -ENCODING 22818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -7F00 -7F00 -0000 -FF00 -BF00 -C400 -1800 -E000 -ENDCHAR -STARTCHAR 5927 -ENCODING 22823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -0800 -FF00 -0800 -1800 -1400 -2200 -4100 -8080 -ENDCHAR -STARTCHAR 5929 -ENCODING 22825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -0800 -FF00 -0800 -1800 -2400 -4300 -8180 -ENDCHAR -STARTCHAR 592A -ENCODING 22826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -0800 -FF80 -0800 -1800 -1400 -3A00 -4900 -8080 -ENDCHAR -STARTCHAR 592B -ENCODING 22827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -7F -08 -FF -18 -14 -24 -43 -81 -ENDCHAR -STARTCHAR 592D -ENCODING 22829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7800 -0800 -FF00 -1800 -1400 -2400 -4300 -8180 -ENDCHAR -STARTCHAR 592E -ENCODING 22830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -7E00 -4900 -4900 -FF80 -1800 -3400 -6200 -8100 -ENDCHAR -STARTCHAR 5931 -ENCODING 22833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -7F00 -8800 -0800 -FF80 -1800 -2400 -6200 -8180 -ENDCHAR -STARTCHAR 5937 -ENCODING 22839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0800 -FF00 -7F00 -8800 -FF00 -1B00 -2600 -C180 -ENDCHAR -STARTCHAR 593E -ENCODING 22846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF80 -4A00 -4A00 -AD00 -9900 -2400 -4300 -8180 -ENDCHAR -STARTCHAR 5944 -ENCODING 22852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF00 -2400 -4A00 -FF80 -CA00 -7E00 -7E00 -4880 -0F00 -ENDCHAR -STARTCHAR 5947 -ENCODING 22855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -3400 -C300 -FF80 -0200 -7A00 -4A00 -7A00 -0600 -ENDCHAR -STARTCHAR 5948 -ENCODING 22856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -FF -14 -62 -BD -00 -FF -2A -4B -B9 -ENDCHAR -STARTCHAR 5949 -ENCODING 22857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -1000 -7F00 -FF80 -2A00 -FD00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 594E -ENCODING 22862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -2C00 -6A00 -BF80 -FF00 -0800 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 594F -ENCODING 22863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7F00 -7E00 -1400 -FF80 -7E00 -9180 -7E00 -3400 -C300 -ENDCHAR -STARTCHAR 5950 -ENCODING 22864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7800 -FF00 -D900 -6B00 -6F00 -FF80 -1800 -2400 -C380 -ENDCHAR -STARTCHAR 5951 -ENCODING 22865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -FF00 -F500 -3500 -E900 -2B00 -FF00 -1800 -6600 -8180 -ENDCHAR -STARTCHAR 5954 -ENCODING 22868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF00 -2400 -4A00 -BF00 -2C00 -2400 -FF80 -2400 -C400 -ENDCHAR -STARTCHAR 5955 -ENCODING 22869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -5600 -A500 -AD00 -4800 -FF80 -1800 -6600 -C180 -ENDCHAR -STARTCHAR 5957 -ENCODING 22871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF00 -2400 -7F00 -BF80 -2000 -FF00 -2200 -2F00 -F100 -ENDCHAR -STARTCHAR 595A -ENCODING 22874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0200 -7D00 -9D00 -2400 -1A00 -FF00 -FF00 -2400 -C380 -ENDCHAR -STARTCHAR 5960 -ENCODING 22880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5C -FE -FF -67 -7F -7F -FF -34 -C3 -ENDCHAR -STARTCHAR 5962 -ENCODING 22882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF80 -7600 -FD80 -FF00 -1400 -7E00 -C200 -3E00 -3E00 -ENDCHAR -STARTCHAR 5967 -ENCODING 22887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF00 -BD00 -AD00 -BF00 -AF00 -0800 -FF00 -2400 -C380 -ENDCHAR -STARTCHAR 596A -ENCODING 22890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF80 -6E00 -BF80 -7E00 -FE00 -7F00 -FF80 -2400 -2C00 -ENDCHAR -STARTCHAR 596B -ENCODING 22891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -FF -26 -E1 -ED -BF -BF -7F -AD -CD -ENDCHAR -STARTCHAR 596C -ENCODING 22892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -AF00 -FA00 -FD00 -BF80 -AB00 -0800 -FF00 -3400 -C380 -ENDCHAR -STARTCHAR 596D -ENCODING 22893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -EF00 -4A00 -EF00 -EF00 -FF00 -2400 -6200 -8100 -ENDCHAR -STARTCHAR 596E -ENCODING 22894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF80 -2B00 -DC80 -FC00 -7F00 -0000 -7F00 -7F00 -7F00 -ENDCHAR -STARTCHAR 5973 -ENCODING 22899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -10 -10 -FF -22 -24 -34 -0C -33 -C1 -ENDCHAR -STARTCHAR 5974 -ENCODING 22900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -E900 -5900 -A500 -A600 -6600 -6600 -E900 -9080 -ENDCHAR -STARTCHAR 5978 -ENCODING 22904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4400 -E400 -A400 -BF80 -A400 -4400 -6400 -D400 -8400 -ENDCHAR -STARTCHAR 597D -ENCODING 22909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4100 -E200 -A200 -A400 -BF80 -6400 -6400 -D400 -8C00 -ENDCHAR -STARTCHAR 5982 -ENCODING 22914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -47 -F5 -55 -95 -95 -65 -75 -D7 -85 -ENDCHAR -STARTCHAR 5983 -ENCODING 22915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4100 -E100 -A100 -AF00 -A800 -A800 -6880 -D880 -8F00 -ENDCHAR -STARTCHAR 5984 -ENCODING 22916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -4000 -6100 -7E00 -FF80 -2400 -2400 -1E00 -E100 -ENDCHAR -STARTCHAR 598A -ENCODING 22922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -E400 -A400 -BF80 -A400 -A400 -6400 -E400 -9F00 -ENDCHAR -STARTCHAR 5993 -ENCODING 22931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -A400 -BF00 -A900 -6600 -6600 -8B00 -9080 -ENDCHAR -STARTCHAR 5996 -ENCODING 22934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -E400 -A400 -BF80 -A400 -4600 -6A00 -9100 -9080 -ENDCHAR -STARTCHAR 5997 -ENCODING 22935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -E900 -BF00 -A080 -BF00 -4100 -6100 -E200 -8200 -ENDCHAR -STARTCHAR 5999 -ENCODING 22937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4500 -ED00 -AD00 -B480 -BD00 -6500 -6200 -8C00 -9000 -ENDCHAR -STARTCHAR 59A5 -ENCODING 22949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0100 -5200 -4200 -1000 -FF80 -6400 -1C00 -E300 -ENDCHAR -STARTCHAR 59A8 -ENCODING 22952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -A800 -AF00 -A900 -A900 -6900 -F100 -9700 -ENDCHAR -STARTCHAR 59AC -ENCODING 22956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -E400 -A800 -AF00 -B900 -5900 -6900 -EF00 -8900 -ENDCHAR -STARTCHAR 59B9 -ENCODING 22969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -A400 -BF00 -A600 -4E00 -7500 -9480 -8400 -ENDCHAR -STARTCHAR 59BB -ENCODING 22971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -7E00 -0900 -FF80 -7E00 -FF80 -2400 -1C00 -E300 -ENDCHAR -STARTCHAR 59BE -ENCODING 22974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -24 -FF -10 -10 -FF -24 -1C -E3 -ENDCHAR -STARTCHAR 59C3 -ENCODING 22979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -E200 -AA00 -AB00 -AA00 -AA00 -4A00 -EA00 -9F80 -ENDCHAR -STARTCHAR 59C6 -ENCODING 22982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -ED00 -B300 -BF80 -B500 -5300 -7F80 -9100 -8600 -ENDCHAR -STARTCHAR 59C9 -ENCODING 22985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -A400 -AF00 -B500 -B500 -5500 -F500 -8400 -ENDCHAR -STARTCHAR 59CB -ENCODING 22987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4800 -E900 -BF00 -A080 -AF00 -4900 -6900 -AF00 -8900 -ENDCHAR -STARTCHAR 59D0 -ENCODING 22992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -E900 -AF00 -A900 -A900 -4F00 -6900 -A900 -9F80 -ENDCHAR -STARTCHAR 59D1 -ENCODING 22993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -A400 -A400 -AF00 -4900 -6900 -DF00 -8900 -ENDCHAR -STARTCHAR 59D3 -ENCODING 22995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4A00 -EF00 -B200 -B200 -A200 -6F00 -6200 -8200 -9F80 -ENDCHAR -STARTCHAR 59D4 -ENCODING 22996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1600 -6800 -FF00 -2E00 -D180 -FF00 -2400 -1E00 -E100 -ENDCHAR -STARTCHAR 59D9 -ENCODING 23001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -8E00 -F200 -B200 -BF80 -D200 -D200 -5200 -B200 -9700 -ENDCHAR -STARTCHAR 59DA -ENCODING 23002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5A80 -FB00 -AB00 -AA00 -AB00 -5A80 -6A00 -F280 -9300 -ENDCHAR -STARTCHAR 59DC -ENCODING 23004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0800 -7F00 -FF80 -1000 -FF00 -2400 -1E00 -E100 -ENDCHAR -STARTCHAR 59DD -ENCODING 23005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4C00 -FF00 -B400 -BF80 -C600 -4E00 -7500 -9480 -8400 -ENDCHAR -STARTCHAR 59E6 -ENCODING 23014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF00 -2400 -1C00 -E300 -4400 -FF80 -A900 -6600 -9D00 -ENDCHAR -STARTCHAR 59E8 -ENCODING 23016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -9F80 -E400 -BF00 -BF00 -D400 -DF80 -4500 -AB00 -B080 -ENDCHAR -STARTCHAR 59EA -ENCODING 23018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4800 -E900 -AF00 -A080 -A400 -DF00 -6400 -A400 -9F80 -ENDCHAR -STARTCHAR 59EC -ENCODING 23020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -9200 -F600 -B700 -B500 -B500 -5700 -7200 -BF80 -9000 -ENDCHAR -STARTCHAR 59EE -ENCODING 23022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4000 -E000 -AF00 -A900 -AF00 -4900 -6F00 -E000 -9F80 -ENDCHAR -STARTCHAR 59F8 -ENCODING 23032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -9B80 -E900 -A900 -BD00 -AF80 -4900 -7100 -B100 -A100 -ENDCHAR -STARTCHAR 59FB -ENCODING 23035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5F -95 -F5 -BF -B5 -D7 -59 -BF -91 -ENDCHAR -STARTCHAR 59FF -ENCODING 23039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -DF00 -1900 -DE00 -6180 -1000 -FF80 -2400 -1E00 -E100 -ENDCHAR -STARTCHAR 5A01 -ENCODING 23041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -0500 -7F80 -BD00 -A500 -7D00 -AA00 -9280 -AE80 -C900 -ENDCHAR -STARTCHAR 5A03 -ENCODING 23043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -EF00 -A400 -BF80 -A400 -BF00 -6400 -E400 -9F80 -ENDCHAR -STARTCHAR 5A11 -ENCODING 23057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5500 -D500 -4E00 -C800 -B000 -FF80 -2400 -1E00 -E100 -ENDCHAR -STARTCHAR 5A18 -ENCODING 23064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -E900 -AF00 -A900 -AF00 -6D80 -6B00 -8D00 -9880 -ENDCHAR -STARTCHAR 5A1B -ENCODING 23067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4700 -5500 -F700 -B000 -BF00 -A500 -7F80 -AA00 -9180 -ENDCHAR -STARTCHAR 5A1C -ENCODING 23068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BB00 -9B00 -DB00 -BF00 -DB00 -DA80 -FE80 -5B00 -AA00 -AA00 -ENDCHAR -STARTCHAR 5A1F -ENCODING 23071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -49 -EF -A0 -AF -AF -71 -6F -91 -93 -ENDCHAR -STARTCHAR 5A20 -ENCODING 23072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -9F80 -FF00 -B000 -BF80 -BA80 -5B00 -7A00 -BF00 -A880 -ENDCHAR -STARTCHAR 5A25 -ENCODING 23077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4E00 -9B00 -EA00 -BF80 -AA00 -CE00 -5A00 -4A00 -AE00 -9F00 -ENDCHAR -STARTCHAR 5A29 -ENCODING 23081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -8E00 -F200 -BF00 -B500 -BF00 -C600 -6A00 -BA80 -B300 -ENDCHAR -STARTCHAR 5A36 -ENCODING 23094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F000 -FF00 -F500 -B200 -DD80 -FF80 -2400 -1C00 -F300 -ENDCHAR -STARTCHAR 5A3C -ENCODING 23100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -91 -EF -AF -A0 -BF -D1 -7F -BF -91 -ENDCHAR -STARTCHAR 5A41 -ENCODING 23105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7E00 -FF80 -7E00 -7F00 -7F00 -FF00 -2400 -1C00 -E300 -ENDCHAR -STARTCHAR 5A46 -ENCODING 23110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -9F00 -5A00 -A600 -B900 -FF80 -2400 -1E00 -F300 -ENDCHAR -STARTCHAR 5A49 -ENCODING 23113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -9F80 -F080 -AF00 -B700 -DB00 -CB00 -4B00 -B280 -9300 -ENDCHAR -STARTCHAR 5A5A -ENCODING 23130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4700 -9A00 -FF00 -BE80 -B900 -BF00 -D100 -7F00 -BF00 -9100 -ENDCHAR -STARTCHAR 5A62 -ENCODING 23138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -9F00 -F500 -BF00 -B500 -BF00 -CA00 -7F80 -A200 -8200 -ENDCHAR -STARTCHAR 5A66 -ENCODING 23142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -8F00 -FF80 -AF00 -BF80 -B480 -CF00 -7500 -B700 -8400 -ENDCHAR -STARTCHAR 5A92 -ENCODING 23186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -9F80 -EF00 -A900 -AF00 -DF80 -4600 -7D00 -9480 -8400 -ENDCHAR -STARTCHAR 5A9A -ENCODING 23194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -55 -FF -B0 -B7 -B7 -D9 -57 -A7 -A9 -ENDCHAR -STARTCHAR 5A9B -ENCODING 23195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -8F00 -F480 -BF00 -A800 -BF80 -CF00 -4900 -B600 -AD80 -ENDCHAR -STARTCHAR 5AA4 -ENCODING 23204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5500 -EF00 -B500 -AF00 -A400 -DA00 -7900 -B980 -9600 -ENDCHAR -STARTCHAR 5AC1 -ENCODING 23233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -9F80 -FF80 -AA00 -BA80 -CF00 -D600 -6B00 -9280 -8C00 -ENDCHAR -STARTCHAR 5AC2 -ENCODING 23234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -5D00 -FD00 -B500 -BF00 -A400 -5F00 -6900 -A600 -9980 -ENDCHAR -STARTCHAR 5AC4 -ENCODING 23236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -9200 -FF00 -B900 -BF00 -B900 -DF00 -5700 -AA80 -A600 -ENDCHAR -STARTCHAR 5AC9 -ENCODING 23241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8200 -9F80 -F400 -D700 -DA00 -DF80 -F200 -5600 -BD00 -A880 -ENDCHAR -STARTCHAR 5ACC -ENCODING 23244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8F00 -9C00 -FF80 -BF00 -AB00 -DF80 -DF00 -4B00 -BA80 -AA00 -ENDCHAR -STARTCHAR 5AE1 -ENCODING 23265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -9F80 -EA00 -BF00 -B500 -BF00 -DF00 -5F00 -BB00 -9300 -ENDCHAR -STARTCHAR 5AE6 -ENCODING 23270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -8D00 -FF80 -BF80 -A900 -CF00 -5F80 -5480 -B500 -8400 -ENDCHAR -STARTCHAR 5AE9 -ENCODING 23273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -BE00 -D380 -BB00 -F700 -FB00 -D900 -7500 -B300 -9480 -ENDCHAR -STARTCHAR 5B05 -ENCODING 23301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -FF00 -AD00 -BF80 -AD00 -DF00 -7F80 -8400 -8400 -ENDCHAR -STARTCHAR 5B09 -ENCODING 23305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -9F80 -FF00 -BF00 -B100 -CE00 -5F80 -7F00 -BF00 -9100 -ENDCHAR -STARTCHAR 5B0B -ENCODING 23307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5680 -FF00 -AF00 -B500 -AF00 -4F00 -7F80 -A400 -8400 -ENDCHAR -STARTCHAR 5B0C -ENCODING 23308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -9E00 -FF80 -BE80 -AE00 -DF00 -D100 -5F00 -BF00 -9100 -ENDCHAR -STARTCHAR 5B16 -ENCODING 23318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -9100 -FF80 -F200 -9F00 -7200 -FF00 -2400 -1E00 -E100 -ENDCHAR -STARTCHAR 5B2A -ENCODING 23338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -9F00 -FF00 -AD00 -BF00 -D100 -DF00 -4F00 -A200 -9980 -ENDCHAR -STARTCHAR 5B40 -ENCODING 23360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -9F -84 -DF -D5 -CF -CF -DF -57 -8F -8D -ENDCHAR -STARTCHAR 5B43 -ENCODING 23363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF80 -8000 -DB00 -BB00 -BF80 -DF00 -4A00 -7F80 -AF00 -9980 -ENDCHAR -STARTCHAR 5B50 -ENCODING 23376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -0400 -0800 -0800 -FF80 -0800 -0800 -0800 -3000 -ENDCHAR -STARTCHAR 5B51 -ENCODING 23377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -02 -0C -09 -FE -08 -08 -08 -38 -ENDCHAR -STARTCHAR 5B54 -ENCODING 23380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -F400 -1400 -2400 -3400 -C400 -2400 -2480 -2480 -C700 -ENDCHAR -STARTCHAR 5B55 -ENCODING 23381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FC00 -2700 -2100 -7D00 -8B00 -FF80 -0800 -0800 -3000 -ENDCHAR -STARTCHAR 5B57 -ENCODING 23383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8080 -7E00 -0400 -0800 -FF80 -0800 -0800 -3000 -ENDCHAR -STARTCHAR 5B58 -ENCODING 23384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF80 -2000 -3F00 -4200 -C400 -FF80 -4400 -4400 -4C00 -ENDCHAR -STARTCHAR 5B5A -ENCODING 23386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -7E00 -8900 -8100 -7E00 -0800 -FF80 -0800 -0800 -3800 -ENDCHAR -STARTCHAR 5B5C -ENCODING 23388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F000 -1400 -2780 -4900 -7900 -CE00 -5600 -4600 -4D00 -D080 -ENDCHAR -STARTCHAR 5B5D -ENCODING 23389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7D00 -1200 -FF80 -0800 -7E00 -C800 -FF00 -0800 -1800 -ENDCHAR -STARTCHAR 5B5F -ENCODING 23391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -0400 -FF80 -0800 -1000 -7F00 -5500 -5500 -FF80 -ENDCHAR -STARTCHAR 5B63 -ENCODING 23395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0200 -7C00 -FF00 -1C00 -7E00 -8580 -FF00 -0800 -1800 -ENDCHAR -STARTCHAR 5B64 -ENCODING 23396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -3E00 -5500 -5500 -7500 -D500 -5500 -5700 -7900 -A080 -ENDCHAR -STARTCHAR 5B69 -ENCODING 23401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -3F80 -4400 -5A00 -6A00 -C500 -4A00 -5600 -4D00 -D080 -ENDCHAR -STARTCHAR 5B6B -ENCODING 23403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E300 -3C00 -4500 -6A00 -C500 -5F00 -4D80 -5480 -C400 -ENDCHAR -STARTCHAR 5B70 -ENCODING 23408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -0400 -FF00 -F500 -0D00 -F500 -2700 -F900 -4980 -5180 -ENDCHAR -STARTCHAR 5B71 -ENCODING 23409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -9E00 -8400 -BF00 -8000 -F700 -FF80 -2600 -ENDCHAR -STARTCHAR 5B75 -ENCODING 23413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -EF00 -EE80 -DF00 -E900 -EA00 -DF80 -6200 -A600 -ENDCHAR -STARTCHAR 5B78 -ENCODING 23416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FB00 -7700 -9900 -FF00 -8080 -FE80 -0800 -FF80 -1800 -ENDCHAR -STARTCHAR 5B7A -ENCODING 23418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -3F80 -7F80 -5F00 -FF80 -4400 -5F00 -5B00 -9B00 -ENDCHAR -STARTCHAR 5B7C -ENCODING 23420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D200 -6F00 -BF80 -FF00 -F200 -0000 -7C00 -FF00 -0800 -1800 -ENDCHAR -STARTCHAR 5B85 -ENCODING 23429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -81 -8D -70 -1F -F0 -10 -11 -1F -ENDCHAR -STARTCHAR 5B87 -ENCODING 23431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8080 -FE80 -0800 -0800 -FF80 -0800 -0800 -3000 -ENDCHAR -STARTCHAR 5B88 -ENCODING 23432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8100 -8500 -FF80 -0400 -2400 -2400 -0400 -0C00 -ENDCHAR -STARTCHAR 5B89 -ENCODING 23433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -9100 -1000 -FF80 -2200 -2400 -1800 -3E00 -E100 -ENDCHAR -STARTCHAR 5B8B -ENCODING 23435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8100 -8900 -FF00 -1800 -2C00 -4B00 -8880 -0800 -ENDCHAR -STARTCHAR 5B8C -ENCODING 23436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8100 -3E00 -0000 -FF00 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 5B8F -ENCODING 23439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -91 -10 -FF -28 -2A -52 -97 -F9 -ENDCHAR -STARTCHAR 5B93 -ENCODING 23443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -9100 -0A00 -2200 -6600 -A900 -B280 -6200 -BE00 -ENDCHAR -STARTCHAR 5B95 -ENCODING 23445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -81 -FF -20 -20 -FE -C1 -3E -41 -ENDCHAR -STARTCHAR 5B96 -ENCODING 23446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8480 -7400 -1400 -7400 -F500 -1900 -2B00 -6C80 -ENDCHAR -STARTCHAR 5B97 -ENCODING 23447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8080 -7E00 -0000 -FF00 -2A00 -4A00 -8900 -B100 -ENDCHAR -STARTCHAR 5B98 -ENCODING 23448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -81 -7E -42 -7E -7F -41 -7F -41 -ENDCHAR -STARTCHAR 5B99 -ENCODING 23449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -89 -89 -7F -49 -7F -49 -7F -41 -ENDCHAR -STARTCHAR 5B9A -ENCODING 23450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8100 -7E00 -0800 -4800 -4E00 -4800 -B000 -9F80 -ENDCHAR -STARTCHAR 5B9B -ENCODING 23451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -C100 -7F00 -5900 -D900 -2900 -2B00 -4880 -8F00 -ENDCHAR -STARTCHAR 5B9C -ENCODING 23452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8100 -7E00 -4200 -7E00 -4200 -7E00 -4200 -FF80 -ENDCHAR -STARTCHAR 5BA2 -ENCODING 23458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A100 -FF00 -9800 -2600 -FF80 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 5BA3 -ENCODING 23459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8080 -FE80 -7E00 -4200 -7E00 -7E00 -0000 -FF80 -ENDCHAR -STARTCHAR 5BA4 -ENCODING 23460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8100 -FF00 -2200 -FF00 -0800 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 5BA5 -ENCODING 23461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -91 -FF -3E -42 -BE -3E -22 -26 -ENDCHAR -STARTCHAR 5BA6 -ENCODING 23462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -81 -7F -48 -7E -42 -7E -7F -40 -ENDCHAR -STARTCHAR 5BAC -ENCODING 23468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8A80 -0800 -7F00 -7900 -9600 -9600 -BA80 -9100 -ENDCHAR -STARTCHAR 5BAE -ENCODING 23470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -81 -FF -42 -7E -7F -41 -7F -41 -ENDCHAR -STARTCHAR 5BB0 -ENCODING 23472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -89 -7E -24 -FF -08 -7F -08 -08 -ENDCHAR -STARTCHAR 5BB3 -ENCODING 23475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -08 -7E -FF -00 -7F -7F -41 -ENDCHAR -STARTCHAR 5BB4 -ENCODING 23476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -42 -7E -7E -FF -64 -1C -F3 -ENDCHAR -STARTCHAR 5BB5 -ENCODING 23477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -AB00 -4B00 -FE80 -4200 -7E00 -7E00 -4200 -4600 -ENDCHAR -STARTCHAR 5BB6 -ENCODING 23478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8080 -7E00 -7B00 -9400 -7C00 -EB00 -8900 -3800 -ENDCHAR -STARTCHAR 5BB8 -ENCODING 23480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -81 -FF -7E -40 -7F -55 -9A -F1 -ENDCHAR -STARTCHAR 5BB9 -ENCODING 23481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -A5 -5A -B5 -62 -FF -42 -7E -42 -ENDCHAR -STARTCHAR 5BBF -ENCODING 23487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -A1 -5F -48 -DF -D1 -5F -5F -51 -ENDCHAR -STARTCHAR 5BC0 -ENCODING 23488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -5200 -8900 -0800 -F700 -1600 -6980 -8800 -ENDCHAR -STARTCHAR 5BC2 -ENCODING 23490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -C100 -3F00 -4500 -F500 -B200 -B200 -AD00 -4880 -ENDCHAR -STARTCHAR 5BC3 -ENCODING 23491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -BD00 -2800 -7F00 -C900 -7F00 -1C00 -6A80 -CF00 -ENDCHAR -STARTCHAR 5BC4 -ENCODING 23492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -1C00 -E300 -FF80 -7A00 -4A00 -7A00 -0600 -ENDCHAR -STARTCHAR 5BC5 -ENCODING 23493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8080 -FE80 -7E00 -4900 -7E00 -7E00 -2600 -C180 -ENDCHAR -STARTCHAR 5BC6 -ENCODING 23494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -AA80 -6500 -BB00 -7C00 -8800 -8900 -FF00 -8100 -ENDCHAR -STARTCHAR 5BC7 -ENCODING 23495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8480 -6700 -0400 -FE00 -6600 -6600 -A980 -BF00 -ENDCHAR -STARTCHAR 5BCC -ENCODING 23500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -7E -7E -00 -7F -7F -7F -81 -ENDCHAR -STARTCHAR 5BD0 -ENCODING 23504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A480 -AF00 -E400 -3F80 -E600 -AD00 -B480 -A400 -ENDCHAR -STARTCHAR 5BD2 -ENCODING 23506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A500 -7E00 -7E00 -FF80 -2200 -4B00 -8680 -3800 -ENDCHAR -STARTCHAR 5BD3 -ENCODING 23507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -4A -7E -7E -FF -8D -BB -83 -ENDCHAR -STARTCHAR 5BD4 -ENCODING 23508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF00 -7E00 -7E00 -0000 -FF00 -4E00 -6800 -9F80 -ENDCHAR -STARTCHAR 5BD7 -ENCODING 23511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF00 -B100 -DC00 -7E00 -FF80 -C980 -7E00 -4200 -ENDCHAR -STARTCHAR 5BDE -ENCODING 23518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -7E00 -4200 -7E00 -7E00 -FF00 -2400 -C380 -ENDCHAR -STARTCHAR 5BDF -ENCODING 23519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF00 -A600 -7E00 -C180 -FF00 -2A00 -4B00 -9900 -ENDCHAR -STARTCHAR 5BE1 -ENCODING 23521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -7E00 -4200 -7E00 -FF80 -7F00 -9280 -6C00 -ENDCHAR -STARTCHAR 5BE2 -ENCODING 23522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -AF80 -BF00 -EF00 -3F00 -F080 -AF00 -A600 -A900 -ENDCHAR -STARTCHAR 5BE4 -ENCODING 23524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -BF -A4 -EE -3F -E0 -AF -AF -A9 -ENDCHAR -STARTCHAR 5BE5 -ENCODING 23525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF00 -3700 -DD00 -2600 -DD80 -7A00 -7C00 -6000 -ENDCHAR -STARTCHAR 5BE6 -ENCODING 23526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E00 -FF80 -0000 -7E00 -4100 -7E00 -2600 -C100 -ENDCHAR -STARTCHAR 5BE7 -ENCODING 23527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -EA80 -7D00 -7F00 -5500 -FF80 -FF00 -0800 -1800 -ENDCHAR -STARTCHAR 5BE8 -ENCODING 23528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E80 -7E00 -2400 -FF80 -6A00 -FF80 -2C00 -CB00 -ENDCHAR -STARTCHAR 5BE9 -ENCODING 23529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -F700 -2C00 -FF80 -2E00 -FF80 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 5BEB -ENCODING 23531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -42 -76 -7E -7F -8B -5B -93 -ENDCHAR -STARTCHAR 5BEC -ENCODING 23532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -7E00 -4200 -7E00 -4200 -7E00 -2A80 -CF00 -ENDCHAR -STARTCHAR 5BEE -ENCODING 23534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -2500 -7E00 -C380 -3E00 -3E00 -6E00 -9100 -ENDCHAR -STARTCHAR 5BEF -ENCODING 23535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -C8 -FE -7F -00 -E7 -9D -83 -ENDCHAR -STARTCHAR 5BF5 -ENCODING 23541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF00 -6F00 -F100 -FF00 -9800 -FE00 -FF80 -BF00 -ENDCHAR -STARTCHAR 5BF6 -ENCODING 23542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF00 -7F00 -6F00 -7E00 -4200 -7E00 -2600 -C180 -ENDCHAR -STARTCHAR 5BF8 -ENCODING 23544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -04 -04 -FF -04 -44 -24 -24 -04 -0C -ENDCHAR -STARTCHAR 5BFA -ENCODING 23546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F00 -0800 -FF80 -0200 -0200 -FF00 -2200 -1200 -0C00 -ENDCHAR -STARTCHAR 5C01 -ENCODING 23553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -4100 -FF80 -4100 -F900 -4500 -F500 -4100 -5100 -E600 -ENDCHAR -STARTCHAR 5C04 -ENCODING 23556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -F100 -9100 -FF80 -F500 -9500 -F300 -7100 -9100 -B700 -ENDCHAR -STARTCHAR 5C07 -ENCODING 23559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -AF00 -BB00 -E600 -3900 -FF80 -A900 -A500 -A100 -A200 -ENDCHAR -STARTCHAR 5C08 -ENCODING 23560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E00 -7E00 -7E00 -FE00 -0300 -FF80 -2200 -0E00 -ENDCHAR -STARTCHAR 5C09 -ENCODING 23561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8900 -FF80 -F100 -8500 -FB00 -E900 -E900 -A300 -ENDCHAR -STARTCHAR 5C0A -ENCODING 23562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -7F00 -FF80 -6D00 -7E00 -7E00 -FF80 -4400 -2C00 -ENDCHAR -STARTCHAR 5C0B -ENCODING 23563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -FF80 -7E00 -FF00 -5900 -EF00 -FF80 -2200 -0C00 -ENDCHAR -STARTCHAR 5C0D -ENCODING 23565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -F100 -F900 -1780 -5100 -FD00 -F300 -2100 -3900 -C300 -ENDCHAR -STARTCHAR 5C0E -ENCODING 23566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D200 -3F80 -9F00 -1F00 -DF00 -4000 -BF80 -FF80 -2200 -1E00 -ENDCHAR -STARTCHAR 5C0F -ENCODING 23567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -4A00 -4A00 -4A00 -4900 -8900 -8880 -0800 -3000 -ENDCHAR -STARTCHAR 5C11 -ENCODING 23569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -2A00 -4A00 -4900 -4900 -8A80 -B400 -0C00 -3000 -C000 -ENDCHAR -STARTCHAR 5C16 -ENCODING 23574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -2A00 -4B00 -9900 -0000 -0800 -FF80 -1800 -2600 -C180 -ENDCHAR -STARTCHAR 5C19 -ENCODING 23577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -2C -4B -89 -7F -81 -9D -A5 -9D -A1 -83 -ENDCHAR -STARTCHAR 5C24 -ENCODING 23588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -1200 -FF00 -1000 -1800 -1800 -2800 -2800 -C880 -8F00 -ENDCHAR -STARTCHAR 5C28 -ENCODING 23592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -2400 -FF00 -3200 -3D00 -3600 -5D00 -5300 -9C80 -9F00 -ENDCHAR -STARTCHAR 5C31 -ENCODING 23601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F500 -0400 -FF80 -9200 -F600 -D600 -D600 -CA80 -5380 -ENDCHAR -STARTCHAR 5C38 -ENCODING 23608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -7F -40 -40 -80 -80 -80 -80 -ENDCHAR -STARTCHAR 5C39 -ENCODING 23609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -1200 -FF80 -1200 -1200 -7E00 -1000 -2000 -C000 -ENDCHAR -STARTCHAR 5C3A -ENCODING 23610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -41 -7F -48 -48 -44 -82 -81 -ENDCHAR -STARTCHAR 5C3B -ENCODING 23611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4100 -7F00 -5000 -7E00 -9200 -9280 -A280 -C300 -ENDCHAR -STARTCHAR 5C3C -ENCODING 23612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -81 -7F -90 -93 -9C -90 -91 -9F -ENDCHAR -STARTCHAR 5C3E -ENCODING 23614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -8100 -7F00 -BE00 -8F00 -B800 -FF00 -8880 -8F00 -ENDCHAR -STARTCHAR 5C3F -ENCODING 23615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -81 -FF -88 -F9 -9E -AA -A9 -59 -ENDCHAR -STARTCHAR 5C40 -ENCODING 23616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -81 -7F -7F -81 -BD -BD -A5 -83 -ENDCHAR -STARTCHAR 5C45 -ENCODING 23621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4100 -7F00 -4800 -7F80 -BF00 -A100 -A100 -BF00 -ENDCHAR -STARTCHAR 5C46 -ENCODING 23622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -7F -65 -BF -A5 -BF -BF -A1 -ENDCHAR -STARTCHAR 5C48 -ENCODING 23624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -81 -7F -A9 -A9 -BF -A9 -BF -A1 -ENDCHAR -STARTCHAR 5C4B -ENCODING 23627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -8100 -7F00 -7F00 -9200 -BF00 -BF00 -8800 -FF80 -ENDCHAR -STARTCHAR 5C4D -ENCODING 23629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8100 -FF00 -FF00 -9400 -BD00 -EA00 -9480 -E300 -ENDCHAR -STARTCHAR 5C4E -ENCODING 23630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -7F -69 -9A -BF -8A -B9 -A8 -ENDCHAR -STARTCHAR 5C51 -ENCODING 23633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -81 -FF -A9 -BF -FF -A1 -BF -A3 -ENDCHAR -STARTCHAR 5C55 -ENCODING 23637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -8100 -7F00 -BF00 -9400 -FF00 -A600 -AE00 -F180 -ENDCHAR -STARTCHAR 5C5B -ENCODING 23643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8100 -FF00 -9200 -FF00 -9200 -FF80 -A200 -A200 -ENDCHAR -STARTCHAR 5C60 -ENCODING 23648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -8900 -BE00 -FF80 -9A00 -FF00 -9F00 -9F00 -ENDCHAR -STARTCHAR 5C62 -ENCODING 23650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -A900 -FF00 -9E00 -BF00 -FF80 -B400 -7B00 -ENDCHAR -STARTCHAR 5C64 -ENCODING 23652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -8E00 -FF00 -FB80 -BF00 -BE00 -BE00 -BE00 -ENDCHAR -STARTCHAR 5C65 -ENCODING 23653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -A800 -DF00 -AF00 -CF00 -CF00 -A600 -3F80 -ENDCHAR -STARTCHAR 5C6C -ENCODING 23660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -88 -BF -BF -BF -FF -BF -BF -ENDCHAR -STARTCHAR 5C6F -ENCODING 23663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -0F00 -FC00 -4900 -4900 -7E00 -4800 -0880 -0F00 -ENDCHAR -STARTCHAR 5C71 -ENCODING 23665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -08 -89 -89 -89 -89 -89 -FF -81 -ENDCHAR -STARTCHAR 5C79 -ENCODING 23673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -EF80 -F000 -FE00 -E200 -E400 -E880 -B080 -1F00 -ENDCHAR -STARTCHAR 5C90 -ENCODING 23696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -DF80 -E400 -EF00 -E900 -E600 -E600 -8F00 -1080 -ENDCHAR -STARTCHAR 5C91 -ENCODING 23697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -8900 -3600 -7D80 -8000 -7F00 -0200 -0200 -0400 -ENDCHAR -STARTCHAR 5CA1 -ENCODING 23713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -A5 -95 -FF -AD -AD -BD -A5 -83 -ENDCHAR -STARTCHAR 5CA9 -ENCODING 23721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -8900 -7F00 -0000 -FF80 -2000 -7F00 -C100 -3F00 -4100 -ENDCHAR -STARTCHAR 5CAB -ENCODING 23723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -42 -42 -EF -EB -EB -EF -EB -EB -AF -09 -ENDCHAR -STARTCHAR 5CAC -ENCODING 23724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -4F -4B -EB -EF -EB -EB -EF -EB -A2 -02 -02 -ENDCHAR -STARTCHAR 5CB1 -ENCODING 23729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -4B00 -F400 -C400 -4280 -4300 -0800 -8900 -FF00 -8100 -ENDCHAR -STARTCHAR 5CB3 -ENCODING 23731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -7C00 -7F00 -4400 -4400 -FF80 -0800 -4900 -7F00 -4100 -ENDCHAR -STARTCHAR 5CB5 -ENCODING 23733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -FF80 -E200 -E200 -EF00 -E900 -E900 -8F00 -0900 -ENDCHAR -STARTCHAR 5CB7 -ENCODING 23735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -E900 -EF00 -EA00 -EF00 -EA00 -EA00 -8E80 -1900 -ENDCHAR -STARTCHAR 5CB8 -ENCODING 23736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -8900 -7F00 -FF80 -8000 -BF00 -8800 -FF00 -8800 -8800 -ENDCHAR -STARTCHAR 5CBA -ENCODING 23738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -0000 -1C00 -7E00 -8180 -FF00 -1100 -1100 -1600 -ENDCHAR -STARTCHAR 5CBE -ENCODING 23742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -E380 -E400 -E400 -EF00 -E880 -E880 -AF00 -0880 -ENDCHAR -STARTCHAR 5CC0 -ENCODING 23744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -89 -7F -08 -08 -FF -89 -FF -FF -81 -ENDCHAR -STARTCHAR 5CD9 -ENCODING 23769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -E400 -DF80 -E100 -DF80 -E900 -E900 -A500 -0700 -ENDCHAR -STARTCHAR 5CE0 -ENCODING 23776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -E400 -DF80 -E000 -DF80 -E600 -E500 -A400 -0400 -ENDCHAR -STARTCHAR 5CE8 -ENCODING 23784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -5B00 -EA00 -FF80 -EA00 -EF00 -FB00 -EA00 -AB80 -1D80 -ENDCHAR -STARTCHAR 5CEF -ENCODING 23791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -B100 -DC00 -3C00 -CB80 -7F00 -7E00 -FF00 -0800 -ENDCHAR -STARTCHAR 5CF0 -ENCODING 23792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -F500 -E600 -FB80 -EF00 -EF00 -FF80 -A200 -0200 -ENDCHAR -STARTCHAR 5CF4 -ENCODING 23796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -E900 -EF00 -E900 -EF00 -EF00 -E600 -8A80 -1300 -ENDCHAR -STARTCHAR 5CF6 -ENCODING 23798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -7E00 -4200 -7E00 -7F80 -7F00 -A500 -FD00 -8700 -ENDCHAR -STARTCHAR 5CFB -ENCODING 23803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4900 -FE80 -EA80 -FF00 -EC00 -EF00 -F600 -8600 -1980 -ENDCHAR -STARTCHAR 5CFD -ENCODING 23805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -E400 -ED00 -ED00 -FE80 -E600 -EA00 -9900 -1080 -ENDCHAR -STARTCHAR 5D07 -ENCODING 23815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -8900 -FF00 -FF00 -8100 -7E00 -FF00 -4A00 -C900 -9080 -ENDCHAR -STARTCHAR 5D0D -ENCODING 23821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -ED00 -ED00 -FD00 -F680 -EA00 -FD00 -9480 -0400 -ENDCHAR -STARTCHAR 5D0E -ENCODING 23822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -E600 -F900 -FF80 -E100 -EF00 -EF00 -8B00 -0300 -ENDCHAR -STARTCHAR 5D11 -ENCODING 23825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -0000 -7E00 -7E00 -7E00 -4900 -7600 -4880 -F700 -ENDCHAR -STARTCHAR 5D14 -ENCODING 23828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -8900 -FF00 -4800 -7F00 -C800 -FF00 -7F00 -7F80 -4000 -ENDCHAR -STARTCHAR 5D16 -ENCODING 23830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -0000 -FF80 -BF00 -8800 -FF00 -8800 -BF00 -FF80 -ENDCHAR -STARTCHAR 5D17 -ENCODING 23831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -89 -FF -00 -FF -A5 -FF -AB -BD -A3 -83 -ENDCHAR -STARTCHAR 5D19 -ENCODING 23833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -1800 -6600 -BD80 -0000 -7F00 -7F00 -9500 -9700 -ENDCHAR -STARTCHAR 5D27 -ENCODING 23847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -0000 -4600 -F900 -4D00 -7480 -C500 -CB00 -5C80 -ENDCHAR -STARTCHAR 5D29 -ENCODING 23849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -89 -FF -81 -F7 -95 -F7 -95 -F7 -99 -BB -ENDCHAR -STARTCHAR 5D4B -ENCODING 23883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -55 -EF -F0 -F7 -F7 -F5 -F7 -17 -15 -ENDCHAR -STARTCHAR 5D4C -ENCODING 23884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -0000 -9400 -F700 -9B00 -FB00 -9600 -F500 -9880 -ENDCHAR -STARTCHAR 5D50 -ENCODING 23888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -0000 -7E00 -7D00 -7D00 -B500 -BD00 -9380 -FF80 -ENDCHAR -STARTCHAR 5D69 -ENCODING 23913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -FF80 -0000 -7E00 -7E00 -FF00 -BD00 -BD00 -A300 -ENDCHAR -STARTCHAR 5D6C -ENCODING 23916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -8900 -FF00 -7F00 -7F00 -8900 -7F00 -2D00 -6F80 -8F00 -ENDCHAR -STARTCHAR 5D6F -ENCODING 23919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -5F80 -E400 -EF00 -E400 -DF80 -EF00 -EA00 -9200 -2F80 -ENDCHAR -STARTCHAR 5D87 -ENCODING 23943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5000 -F700 -F700 -F000 -FD00 -FE80 -FD00 -B000 -1F80 -ENDCHAR -STARTCHAR 5D8B -ENCODING 23947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -EF00 -E900 -EF00 -EF80 -EF00 -FE80 -9B00 -1B00 -ENDCHAR -STARTCHAR 5D9D -ENCODING 23965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5D00 -4600 -E900 -EF00 -FF00 -F100 -EF00 -EA00 -1F80 -ENDCHAR -STARTCHAR 5DA0 -ENCODING 23968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5E00 -FF80 -EF00 -FE80 -FF00 -F080 -F680 -B680 -1100 -ENDCHAR -STARTCHAR 5DA2 -ENCODING 23970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -FF00 -E900 -FF00 -FB80 -FF80 -EA00 -8A80 -1380 -ENDCHAR -STARTCHAR 5DAA -ENCODING 23978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -5A00 -FF00 -2400 -FF00 -7F00 -FF00 -2E00 -C980 -ENDCHAR -STARTCHAR 5DB8 -ENCODING 23992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4D80 -5B00 -E900 -F680 -FF00 -F480 -FF00 -E700 -8C80 -1400 -ENDCHAR -STARTCHAR 5DBA -ENCODING 23994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -6F80 -9200 -FF00 -0F00 -FF00 -5F00 -7500 -4880 -ENDCHAR -STARTCHAR 5DBC -ENCODING 23996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -5F00 -F500 -FF00 -FF00 -F700 -FF80 -E000 -AB00 -3080 -ENDCHAR -STARTCHAR 5DBD -ENCODING 23997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -A000 -5A80 -FE00 -DF80 -5A00 -DB00 -5B00 -D480 -ENDCHAR -STARTCHAR 5DCD -ENCODING 24013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -2400 -CF00 -FF00 -DB00 -4F00 -F700 -6600 -9B80 -ENDCHAR -STARTCHAR 5DD2 -ENCODING 24018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5900 -DB00 -8200 -FF80 -BB00 -BA80 -9D80 -8900 -8900 -7F00 -ENDCHAR -STARTCHAR 5DD6 -ENCODING 24022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -7F00 -5900 -2600 -FF80 -A400 -F780 -D300 -F200 -F580 -ENDCHAR -STARTCHAR 5DDD -ENCODING 24029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -49 -49 -49 -49 -49 -49 -49 -49 -89 -81 -ENDCHAR -STARTCHAR 5DDE -ENCODING 24030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -29 -29 -2B -BB -BB -BB -49 -49 -49 -81 -ENDCHAR -STARTCHAR 5DE1 -ENCODING 24033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9500 -5500 -9500 -6A00 -1500 -D500 -5500 -4000 -BF80 -ENDCHAR -STARTCHAR 5DE2 -ENCODING 24034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4A -52 -29 -7F -7F -7F -FF -18 -6E -89 -ENDCHAR -STARTCHAR 5DE5 -ENCODING 24037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -08 -08 -08 -08 -08 -08 -FF -ENDCHAR -STARTCHAR 5DE6 -ENCODING 24038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -1000 -FF80 -2000 -2000 -3F00 -4800 -8800 -8800 -7F00 -ENDCHAR -STARTCHAR 5DE7 -ENCODING 24039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1F80 -E800 -4800 -4F00 -4900 -6100 -C100 -0100 -0700 -ENDCHAR -STARTCHAR 5DE8 -ENCODING 24040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -80 -80 -FE -82 -FE -80 -80 -FF -ENDCHAR -STARTCHAR 5DEB -ENCODING 24043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4A00 -4A00 -4A00 -4A00 -AE00 -AD00 -0900 -FF80 -ENDCHAR -STARTCHAR 5DEE -ENCODING 24046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0800 -7E00 -0800 -FF80 -3F00 -4800 -8800 -FF00 -ENDCHAR -STARTCHAR 5DF1 -ENCODING 24049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -0100 -0100 -7E00 -8100 -8000 -8080 -8100 -7F00 -ENDCHAR -STARTCHAR 5DF2 -ENCODING 24050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0100 -8100 -7F00 -8000 -8000 -8000 -8080 -7F00 -ENDCHAR -STARTCHAR 5DF3 -ENCODING 24051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FC -82 -82 -FC -80 -80 -80 -82 -FE -ENDCHAR -STARTCHAR 5DF4 -ENCODING 24052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8900 -8900 -8900 -FF00 -8000 -8000 -8080 -FF00 -ENDCHAR -STARTCHAR 5DF7 -ENCODING 24055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -2400 -FF80 -2200 -7F00 -A280 -3C00 -2100 -3F00 -ENDCHAR -STARTCHAR 5DFD -ENCODING 24061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -24 -FF -FF -26 -C1 -ENDCHAR -STARTCHAR 5DFE -ENCODING 24062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -1 -BITMAP -10 -10 -FE -92 -92 -92 -92 -96 -10 -10 -ENDCHAR -STARTCHAR 5E02 -ENCODING 24066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -FF -08 -7F -49 -49 -49 -4B -08 -ENDCHAR -STARTCHAR 5E03 -ENCODING 24067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF80 -2000 -4800 -7F00 -C900 -C900 -4900 -4B00 -0800 -ENDCHAR -STARTCHAR 5E06 -ENCODING 24070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4E00 -4900 -E900 -DD00 -DD00 -DA00 -E900 -C900 -5180 -5180 -ENDCHAR -STARTCHAR 5E0C -ENCODING 24076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -3C00 -F600 -1100 -FF80 -3F00 -C900 -C900 -4B00 -0800 -ENDCHAR -STARTCHAR 5E11 -ENCODING 24081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -FF00 -9100 -6600 -5700 -8980 -7F00 -8900 -8B00 -0800 -ENDCHAR -STARTCHAR 5E16 -ENCODING 24086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -E380 -D200 -D200 -DF00 -D900 -E900 -4F00 -4900 -ENDCHAR -STARTCHAR 5E19 -ENCODING 24089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4C00 -EF00 -F400 -E400 -DF80 -E400 -C600 -4900 -5080 -ENDCHAR -STARTCHAR 5E1B -ENCODING 24091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -7E -42 -7E -7E -08 -FF -89 -89 -8B -ENDCHAR -STARTCHAR 5E1D -ENCODING 24093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -24 -FF -89 -FF -49 -49 -4A -08 -ENDCHAR -STARTCHAR 5E25 -ENCODING 24101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -42 -E2 -AF -AB -EB -8B -EB -9B -EB -92 -ENDCHAR -STARTCHAR 5E2B -ENCODING 24107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -FF80 -A400 -AF00 -ED00 -8D00 -ED00 -AD00 -ED00 -A400 -ENDCHAR -STARTCHAR 5E2D -ENCODING 24109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9200 -FF00 -9200 -9E00 -BF00 -A900 -A900 -AB00 -ENDCHAR -STARTCHAR 5E33 -ENCODING 24115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4800 -EF00 -DF00 -D800 -DF80 -ED00 -CB00 -4D00 -5880 -ENDCHAR -STARTCHAR 5E36 -ENCODING 24118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5A00 -FF80 -5B00 -8000 -FF00 -FE80 -4A00 -4E00 -0800 -ENDCHAR -STARTCHAR 5E38 -ENCODING 24120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -2A -FF -BF -42 -3E -7F -49 -4B -08 -ENDCHAR -STARTCHAR 5E3D -ENCODING 24125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -51 -EF -EF -EF -E9 -EF -CF -4F -49 -ENDCHAR -STARTCHAR 5E3F -ENCODING 24127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5100 -FF80 -F400 -F700 -FA00 -FF80 -D200 -5500 -5880 -ENDCHAR -STARTCHAR 5E40 -ENCODING 24128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -E400 -EF00 -EF00 -F100 -EF00 -CF00 -4B00 -5080 -ENDCHAR -STARTCHAR 5E44 -ENCODING 24132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5080 -EF00 -F000 -EF80 -F500 -FE00 -5F00 -5200 -5F80 -ENDCHAR -STARTCHAR 5E45 -ENCODING 24133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4000 -EF00 -EF00 -E000 -EF00 -F480 -EF00 -4F00 -5080 -ENDCHAR -STARTCHAR 5E47 -ENCODING 24135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -F100 -FF80 -F500 -5100 -E300 -7F00 -4900 -4900 -4B00 -ENDCHAR -STARTCHAR 5E4C -ENCODING 24140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5100 -EF00 -EF00 -ED00 -ED00 -FF80 -C600 -4A80 -5380 -ENDCHAR -STARTCHAR 5E55 -ENCODING 24149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -7E00 -7E00 -7E00 -FF80 -6A00 -FF80 -4A00 -4A00 -ENDCHAR -STARTCHAR 5E5F -ENCODING 24159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F00 -F600 -FF80 -E200 -FF00 -FF00 -DD00 -5680 -4580 -ENDCHAR -STARTCHAR 5E61 -ENCODING 24161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -ED00 -FF80 -E500 -FF80 -F500 -CF00 -4F00 -5100 -ENDCHAR -STARTCHAR 5E62 -ENCODING 24162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FF80 -E000 -FF00 -FF00 -FF00 -DF00 -4400 -5F80 -ENDCHAR -STARTCHAR 5E63 -ENCODING 24163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3400 -AF80 -FD00 -F500 -B300 -B580 -0800 -7F00 -8900 -8B00 -ENDCHAR -STARTCHAR 5E72 -ENCODING 24178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -08 -08 -08 -FF -08 -08 -08 -08 -ENDCHAR -STARTCHAR 5E73 -ENCODING 24179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -2A00 -4A00 -4900 -4800 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 5E74 -ENCODING 24180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7F00 -C800 -8800 -7F00 -4800 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 5E77 -ENCODING 24183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -2200 -FF00 -2200 -2200 -7F80 -C200 -4200 -C200 -8200 -ENDCHAR -STARTCHAR 5E78 -ENCODING 24184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F00 -0800 -FF80 -2400 -FF00 -0800 -7F00 -0800 -0800 -ENDCHAR -STARTCHAR 5E79 -ENCODING 24185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -F600 -4500 -E980 -9F00 -F200 -EF80 -F200 -4200 -4200 -ENDCHAR -STARTCHAR 5E7B -ENCODING 24187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -5F -51 -A1 -E1 -61 -51 -51 -79 -0B -ENDCHAR -STARTCHAR 5E7C -ENCODING 24188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -04 -44 -4F -A5 -E5 -45 -45 -79 -C9 -13 -ENDCHAR -STARTCHAR 5E7D -ENCODING 24189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -28 -AD -D5 -EF -AB -CD -F7 -89 -FF -ENDCHAR -STARTCHAR 5E7E -ENCODING 24190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -AD00 -4E00 -7A00 -8F00 -FF80 -4A00 -6600 -8C80 -B300 -ENDCHAR -STARTCHAR 5E84 -ENCODING 24196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8800 -8800 -8800 -BF00 -8800 -8800 -8800 -FF00 -ENDCHAR -STARTCHAR 5E87 -ENCODING 24199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -A400 -A400 -A500 -BE00 -A400 -A400 -BC80 -6700 -ENDCHAR -STARTCHAR 5E8A -ENCODING 24202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8800 -8800 -BF00 -8C00 -9C00 -AB00 -C900 -8800 -ENDCHAR -STARTCHAR 5E8F -ENCODING 24207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8000 -BE00 -8C00 -FF00 -8900 -8A00 -8800 -9800 -ENDCHAR -STARTCHAR 5E95 -ENCODING 24213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8200 -BC00 -A400 -BF00 -A400 -BA00 -E380 -BC00 -ENDCHAR -STARTCHAR 5E97 -ENCODING 24215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8800 -8F00 -8800 -8800 -BF00 -A100 -BF00 -A100 -ENDCHAR -STARTCHAR 5E9A -ENCODING 24218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8800 -BF00 -FF80 -8900 -BF00 -9400 -B200 -C100 -ENDCHAR -STARTCHAR 5E9C -ENCODING 24220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9100 -A100 -AF80 -E900 -E900 -A500 -A100 -A600 -ENDCHAR -STARTCHAR 5EA0 -ENCODING 24224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9200 -BF00 -8800 -BF00 -8800 -BF00 -8800 -8800 -ENDCHAR -STARTCHAR 5EA6 -ENCODING 24230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9400 -FF00 -9C00 -8000 -FE00 -9400 -9C00 -E300 -ENDCHAR -STARTCHAR 5EA7 -ENCODING 24231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -AA00 -AA00 -BB00 -DD00 -BF00 -8800 -8800 -FF80 -ENDCHAR -STARTCHAR 5EAB -ENCODING 24235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8800 -BF00 -BF00 -BF00 -BF00 -FF00 -8800 -8800 -ENDCHAR -STARTCHAR 5EAD -ENCODING 24237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -F100 -AE00 -A200 -BF80 -D200 -AF00 -B000 -DF80 -ENDCHAR -STARTCHAR 5EB5 -ENCODING 24245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8800 -FF00 -9E00 -E980 -BE00 -AA00 -BE80 -8F00 -ENDCHAR -STARTCHAR 5EB6 -ENCODING 24246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9200 -FF00 -9200 -9E00 -8000 -B500 -B500 -D480 -ENDCHAR -STARTCHAR 5EB7 -ENCODING 24247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BF00 -FF80 -8900 -BF00 -CF00 -BB00 -C900 -1800 -ENDCHAR -STARTCHAR 5EB8 -ENCODING 24248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BF00 -FF80 -BF00 -8800 -BF00 -C900 -BF00 -4B00 -ENDCHAR -STARTCHAR 5EBE -ENCODING 24254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9800 -AB00 -BB00 -A900 -BF00 -8C00 -B200 -4100 -ENDCHAR -STARTCHAR 5EC2 -ENCODING 24258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -A700 -A500 -FD00 -B700 -B500 -E700 -E700 -A500 -ENDCHAR -STARTCHAR 5EC8 -ENCODING 24264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -A100 -BF00 -BF00 -BF00 -9E00 -FE00 -7380 -ENDCHAR -STARTCHAR 5EC9 -ENCODING 24265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BC00 -FF00 -BF00 -FF80 -9500 -BF00 -B600 -D500 -ENDCHAR -STARTCHAR 5ECA -ENCODING 24266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9780 -BD00 -BD00 -CD00 -BD00 -DC80 -D500 -EC00 -ENDCHAR -STARTCHAR 5ED0 -ENCODING 24272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -7FC0 -7B80 -6700 -7B00 -7BC0 -6900 -7100 -6740 -9CC0 -ENDCHAR -STARTCHAR 5ED3 -ENCODING 24275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FB00 -BD00 -BD00 -8500 -FD00 -BC80 -D500 -3400 -ENDCHAR -STARTCHAR 5ED6 -ENCODING 24278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -F700 -D500 -B300 -9E00 -E900 -BE00 -BC00 -3000 -ENDCHAR -STARTCHAR 5EDA -ENCODING 24282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -F900 -B900 -8780 -BD00 -BB00 -B100 -B900 -E300 -ENDCHAR -STARTCHAR 5EDB -ENCODING 24283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BF00 -A900 -9E00 -BF00 -9400 -EB00 -BF00 -FF80 -ENDCHAR -STARTCHAR 5EDF -ENCODING 24287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -A700 -FD00 -FF00 -FD00 -FF00 -FD00 -A500 -2B00 -ENDCHAR -STARTCHAR 5EE0 -ENCODING 24288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BA00 -D780 -FD00 -CB00 -D900 -D900 -FB00 -CC80 -ENDCHAR -STARTCHAR 5EE2 -ENCODING 24290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -7FC0 -5F00 -5980 -7BC0 -4D00 -5F80 -7A80 -4B00 -9E80 -ENDCHAR -STARTCHAR 5EE3 -ENCODING 24291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -9E00 -FF00 -BF00 -A900 -BF00 -B200 -C100 -ENDCHAR -STARTCHAR 5EEC -ENCODING 24300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8800 -FF00 -CF00 -D500 -DF00 -DF00 -EB00 -FF80 -ENDCHAR -STARTCHAR 5EF3 -ENCODING 24307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -B400 -BF00 -DF00 -FF80 -F600 -FD00 -FF80 -ENDCHAR -STARTCHAR 5EF6 -ENCODING 24310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -C300 -5C00 -4400 -F700 -3400 -B400 -5F80 -6000 -BF80 -ENDCHAR -STARTCHAR 5EF7 -ENCODING 24311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -C300 -4C00 -4400 -FF00 -A400 -A400 -4F00 -E000 -BF80 -ENDCHAR -STARTCHAR 5EFA -ENCODING 24314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -7F80 -4500 -FF00 -BF00 -A400 -5F00 -4400 -BF80 -ENDCHAR -STARTCHAR 5EFB -ENCODING 24315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -5100 -5700 -FB00 -B700 -D100 -5F00 -F000 -BF80 -ENDCHAR -STARTCHAR 5F01 -ENCODING 24321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -2200 -FF00 -0100 -2400 -FF80 -2400 -2400 -4400 -8400 -ENDCHAR -STARTCHAR 5F04 -ENCODING 24324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -7E00 -FF00 -2400 -FF80 -2400 -4400 -8400 -ENDCHAR -STARTCHAR 5F0A -ENCODING 24330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3400 -AF80 -FD00 -F200 -B700 -B480 -2400 -FF80 -2400 -C400 -ENDCHAR -STARTCHAR 5F0F -ENCODING 24335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -0500 -FF00 -0400 -0400 -F400 -2400 -2200 -3A80 -E100 -ENDCHAR -STARTCHAR 5F11 -ENCODING 24337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A300 -4280 -AF80 -4200 -E200 -5E00 -6A00 -DA00 -CD80 -5900 -ENDCHAR -STARTCHAR 5F13 -ENCODING 24339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -01 -7E -40 -40 -7F -81 -01 -07 -ENDCHAR -STARTCHAR 5F14 -ENCODING 24340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -09 -7F -88 -88 -FF -89 -0B -08 -ENDCHAR -STARTCHAR 5F15 -ENCODING 24341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F1 -11 -11 -F1 -81 -F9 -89 -09 -09 -31 -ENDCHAR -STARTCHAR 5F17 -ENCODING 24343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -FF -25 -FF -A4 -A4 -FF -25 -47 -84 -ENDCHAR -STARTCHAR 5F18 -ENCODING 24344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E400 -2400 -2400 -E400 -8500 -E900 -2900 -2F00 -7C80 -ENDCHAR -STARTCHAR 5F1B -ENCODING 24347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -3400 -3500 -FF00 -B500 -9500 -F500 -3400 -3080 -CF00 -ENDCHAR -STARTCHAR 5F1F -ENCODING 24351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -24 -FF -09 -7F -88 -FF -11 -6B -88 -ENDCHAR -STARTCHAR 5F26 -ENCODING 24358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -2400 -3F80 -E400 -9900 -EA00 -2400 -2500 -4B00 -DC80 -ENDCHAR -STARTCHAR 5F27 -ENCODING 24359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0B00 -F500 -3500 -F500 -9500 -F500 -3500 -3700 -6E80 -C180 -ENDCHAR -STARTCHAR 5F29 -ENCODING 24361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -F500 -9500 -6600 -DD80 -7E00 -7E00 -7F00 -8100 -0600 -ENDCHAR -STARTCHAR 5F31 -ENCODING 24369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -11 -F7 -88 -FF -57 -BB -D5 -3B -ENDCHAR -STARTCHAR 5F35 -ENCODING 24373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -2F00 -E800 -8F00 -9F80 -EC80 -2B00 -2D00 -D900 -ENDCHAR -STARTCHAR 5F3A -ENCODING 24378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -3100 -EF00 -9F00 -9500 -F500 -3F00 -2700 -DC80 -ENDCHAR -STARTCHAR 5F3C -ENCODING 24380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -DF -51 -DF -96 -96 -DF -55 -5D -D7 -ENDCHAR -STARTCHAR 5F48 -ENCODING 24392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DB00 -3B00 -C000 -9F00 -9500 -DF00 -5F80 -4400 -C400 -ENDCHAR -STARTCHAR 5F4A -ENCODING 24394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF80 -3F00 -D500 -9F00 -9F80 -FF00 -3F00 -5F00 -FF80 -ENDCHAR -STARTCHAR 5F4C -ENCODING 24396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -5580 -DF00 -9E80 -B700 -ED00 -6E80 -5680 -E700 -ENDCHAR -STARTCHAR 5F4E -ENCODING 24398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -DF00 -4200 -BB80 -B500 -0800 -3F00 -7F00 -0100 -0700 -ENDCHAR -STARTCHAR 5F56 -ENCODING 24406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -3E00 -3C00 -0400 -FF80 -3500 -F600 -FA00 -6B00 -9900 -ENDCHAR -STARTCHAR 5F57 -ENCODING 24407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF80 -F700 -7F80 -C200 -7E00 -0100 -FF80 -7E00 -0100 -ENDCHAR -STARTCHAR 5F59 -ENCODING 24409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -3E -04 -FF -FF -7E -7E -FF -2E -C9 -ENDCHAR -STARTCHAR 5F5B -ENCODING 24411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -FF80 -7E00 -E700 -FF00 -FF00 -2400 -FF80 -C400 -ENDCHAR -STARTCHAR 5F62 -ENCODING 24418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5200 -5400 -5100 -F900 -5680 -5500 -5200 -9400 -9800 -ENDCHAR -STARTCHAR 5F66 -ENCODING 24422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F00 -2400 -FF80 -8600 -BA00 -8E00 -B100 -8E00 -B800 -ENDCHAR -STARTCHAR 5F67 -ENCODING 24423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -0900 -FF00 -E600 -9500 -9E00 -E500 -3E00 -CE80 -1100 -ENDCHAR -STARTCHAR 5F69 -ENCODING 24425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2A00 -AC00 -9080 -2100 -FA00 -6480 -B100 -AE00 -2400 -ENDCHAR -STARTCHAR 5F6A -ENCODING 24426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -3B00 -FA00 -F080 -A300 -BC80 -B100 -B200 -D480 -DF00 -ENDCHAR -STARTCHAR 5F6B -ENCODING 24427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -AB00 -FC00 -F900 -8B00 -FA80 -F900 -DA00 -9C00 -ENDCHAR -STARTCHAR 5F6C -ENCODING 24428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4900 -FE00 -5C80 -D900 -EA00 -4C80 -4900 -4A00 -4C00 -ENDCHAR -STARTCHAR 5F6D -ENCODING 24429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -F200 -F400 -0080 -F100 -F600 -0480 -A100 -7600 -C800 -ENDCHAR -STARTCHAR 5F70 -ENCODING 24432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -FA00 -FC00 -0100 -F100 -F280 -F500 -FA00 -2600 -2800 -ENDCHAR -STARTCHAR 5F71 -ENCODING 24433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F100 -F200 -F400 -F900 -0200 -F480 -F100 -B600 -EC00 -ENDCHAR -STARTCHAR 5F77 -ENCODING 24439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -C400 -BF80 -4800 -4F00 -C900 -C900 -5100 -5100 -6700 -ENDCHAR -STARTCHAR 5F79 -ENCODING 24441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4E00 -D200 -D280 -5300 -8000 -BF00 -5A00 -4400 -5A00 -6180 -ENDCHAR -STARTCHAR 5F7C -ENCODING 24444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -9F80 -D480 -5400 -9F00 -9900 -6600 -6600 -6B00 -7080 -ENDCHAR -STARTCHAR 5F7F -ENCODING 24447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4C -BF -CD -7F -AC -BF -8D -95 -B5 -A4 -ENDCHAR -STARTCHAR 5F80 -ENCODING 24448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -C400 -9F00 -2400 -4400 -DF00 -C400 -4400 -4400 -7F80 -ENDCHAR -STARTCHAR 5F81 -ENCODING 24449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -DF00 -A400 -5400 -5300 -D400 -D400 -5400 -5400 -7F80 -ENDCHAR -STARTCHAR 5F85 -ENCODING 24453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -DF00 -A400 -5F80 -4200 -FF80 -CA00 -4A00 -4200 -4600 -ENDCHAR -STARTCHAR 5F87 -ENCODING 24455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -90 -DF -7D -B5 -9D -95 -5D -41 -47 -ENDCHAR -STARTCHAR 5F8A -ENCODING 24458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -91 -B1 -5F -5B -9B -9F -51 -5F -51 -ENDCHAR -STARTCHAR 5F8B -ENCODING 24459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -9F00 -C500 -7F80 -9F00 -8400 -7F00 -7F80 -4400 -4400 -ENDCHAR -STARTCHAR 5F8C -ENCODING 24460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -4A -BC -CA -7F -9E -B2 -AC -8E -B1 -ENDCHAR -STARTCHAR 5F90 -ENCODING 24464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -CA00 -D100 -5E80 -4400 -BF80 -9500 -5500 -6480 -4C00 -ENDCHAR -STARTCHAR 5F91 -ENCODING 24465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -CD00 -B600 -5A00 -5500 -CD00 -DF00 -4400 -4400 -7F80 -ENDCHAR -STARTCHAR 5F92 -ENCODING 24466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -DF00 -A400 -4400 -7F80 -D400 -5700 -5400 -6C00 -6780 -ENDCHAR -STARTCHAR 5F97 -ENCODING 24471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -5100 -BF00 -5F00 -4000 -DF00 -FF80 -5200 -4A00 -4600 -ENDCHAR -STARTCHAR 5F98 -ENCODING 24472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -CA00 -BB80 -4A00 -7B80 -CA00 -FB80 -4A00 -5200 -5200 -ENDCHAR -STARTCHAR 5F99 -ENCODING 24473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -D400 -B700 -5400 -7F80 -D400 -D700 -5400 -5C00 -6780 -ENDCHAR -STARTCHAR 5F9E -ENCODING 24478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -9200 -BB00 -5480 -4400 -D400 -D700 -5400 -6C00 -6780 -ENDCHAR -STARTCHAR 5FA0 -ENCODING 24480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -9500 -5500 -5500 -AE80 -8E00 -5500 -6480 -4400 -ENDCHAR -STARTCHAR 5FA1 -ENCODING 24481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -50 -BF -B3 -53 -7F -AB -B3 -B3 -BF -82 -ENDCHAR -STARTCHAR 5FA8 -ENCODING 24488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -DF00 -B100 -5F00 -5F00 -C000 -DF80 -5F00 -4400 -7F80 -ENDCHAR -STARTCHAR 5FA9 -ENCODING 24489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -DF80 -9F00 -7100 -5F00 -9F00 -9F00 -6A00 -4E00 -7180 -ENDCHAR -STARTCHAR 5FAA -ENCODING 24490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -DE00 -9F80 -5400 -5F00 -D900 -DF00 -6F00 -6F00 -6900 -ENDCHAR -STARTCHAR 5FAE -ENCODING 24494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -BA00 -BB80 -4500 -7D00 -BB00 -AA00 -AE00 -BF00 -C480 -ENDCHAR -STARTCHAR 5FB5 -ENCODING 24501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -BA00 -FB80 -4500 -BF00 -BF00 -9300 -BB00 -BF00 -8480 -ENDCHAR -STARTCHAR 5FB7 -ENCODING 24503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -9F00 -6B00 -5F00 -8000 -BF80 -B500 -B280 -AE00 -ENDCHAR -STARTCHAR 5FB9 -ENCODING 24505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -BE00 -DB80 -5B00 -8700 -BF00 -BB00 -B900 -AB00 -AC80 -ENDCHAR -STARTCHAR 5FBD -ENCODING 24509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -B600 -BB80 -7D00 -AF00 -9B00 -9D00 -BB00 -B700 -5480 -ENDCHAR -STARTCHAR 5FC3 -ENCODING 24515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1000 -0800 -2000 -2200 -6100 -A100 -A080 -2200 -3E00 -ENDCHAR -STARTCHAR 5FC5 -ENCODING 24517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1200 -0A00 -2200 -A500 -A900 -A900 -B280 -6200 -BE00 -ENDCHAR -STARTCHAR 5FCC -ENCODING 24524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -0200 -7E00 -8100 -7F00 -0800 -A900 -A300 -BE80 -ENDCHAR -STARTCHAR 5FCD -ENCODING 24525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4900 -5100 -3100 -D600 -2900 -A900 -A280 -BE00 -ENDCHAR -STARTCHAR 5FD6 -ENCODING 24534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -4100 -FF80 -E100 -C900 -4900 -4900 -4100 -4100 -4600 -ENDCHAR -STARTCHAR 5FD7 -ENCODING 24535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -08 -FF -08 -FF -28 -69 -A3 -BC -ENDCHAR -STARTCHAR 5FD8 -ENCODING 24536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -4000 -4000 -7F00 -0000 -6900 -A500 -A280 -BC00 -ENDCHAR -STARTCHAR 5FD9 -ENCODING 24537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -F000 -D000 -5000 -5000 -5000 -5000 -4F80 -ENDCHAR -STARTCHAR 5FE0 -ENCODING 24544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8900 -8900 -FF00 -0800 -0900 -A500 -A280 -BC00 -ENDCHAR -STARTCHAR 5FEB -ENCODING 24555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF00 -E500 -C500 -7F80 -4C00 -4A00 -5100 -6080 -ENDCHAR -STARTCHAR 5FF5 -ENCODING 24565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -2400 -7F00 -8180 -7E00 -0200 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 5FFD -ENCODING 24573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7F00 -D500 -A900 -5900 -B600 -0800 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 5FFF -ENCODING 24575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -4200 -FF00 -9300 -2200 -C400 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR 600F -ENCODING 24591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF00 -F500 -D500 -FF80 -C400 -CA00 -5100 -6080 -ENDCHAR -STARTCHAR 6012 -ENCODING 24594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -FF00 -9500 -6200 -5500 -8880 -3000 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 6016 -ENCODING 24598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -7F80 -C800 -F400 -FF00 -7500 -5500 -5500 -5500 -4400 -ENDCHAR -STARTCHAR 601C -ENCODING 24604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -F100 -EE80 -C000 -5F00 -4900 -4900 -4B00 -4800 -ENDCHAR -STARTCHAR 601D -ENCODING 24605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4900 -7F00 -4900 -7F00 -2900 -6500 -A280 -BC00 -ENDCHAR -STARTCHAR 6020 -ENCODING 24608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -2200 -FF00 -0000 -7E00 -7E00 -4100 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 6021 -ENCODING 24609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4800 -E900 -FF00 -C080 -4000 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 6025 -ENCODING 24613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -3C00 -4800 -FE00 -FF80 -7E00 -0000 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 6027 -ENCODING 24615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -5400 -FF00 -F400 -D400 -4400 -5F00 -4400 -4400 -5F80 -ENDCHAR -STARTCHAR 6028 -ENCODING 24616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7700 -5900 -D900 -EB80 -4700 -A800 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 602A -ENCODING 24618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -EA00 -E600 -F980 -4400 -5F00 -4400 -4400 -7F80 -ENDCHAR -STARTCHAR 602F -ENCODING 24623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF00 -E400 -C400 -7F80 -4A00 -4900 -5700 -7880 -ENDCHAR -STARTCHAR 6041 -ENCODING 24641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2300 -5C00 -4400 -FF80 -C400 -5F00 -1000 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR 6042 -ENCODING 24642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -50 -FF -FD -F3 -5D -53 -5D -41 -43 -ENDCHAR -STARTCHAR 6043 -ENCODING 24643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -C400 -FF80 -C100 -5F80 -4900 -4900 -4100 -4600 -ENDCHAR -STARTCHAR 604D -ENCODING 24653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5500 -D500 -F500 -DF80 -4A00 -4A00 -4A00 -5280 -6380 -ENDCHAR -STARTCHAR 6050 -ENCODING 24656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -4A00 -4A00 -7680 -D300 -1000 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 6052 -ENCODING 24658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -E000 -FF00 -D100 -5F00 -5F00 -5100 -4000 -5F80 -ENDCHAR -STARTCHAR 6055 -ENCODING 24661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -F700 -5900 -A900 -7700 -8900 -3100 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR 6059 -ENCODING 24665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0800 -7F00 -0800 -FF00 -2800 -6900 -A280 -BC00 -ENDCHAR -STARTCHAR 605D -ENCODING 24669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -FF00 -5500 -F500 -CD00 -4B00 -B100 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR 6062 -ENCODING 24674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -7F80 -D000 -F200 -DB00 -5B00 -5600 -6600 -6900 -5080 -ENDCHAR -STARTCHAR 6063 -ENCODING 24675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -DF00 -2900 -4C00 -9200 -6180 -2900 -A500 -A300 -BC80 -ENDCHAR -STARTCHAR 6064 -ENCODING 24676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4800 -DF00 -FB00 -DB00 -5B00 -5B00 -5B00 -5B00 -7F80 -ENDCHAR -STARTCHAR 6065 -ENCODING 24677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -A200 -A500 -E400 -AD00 -EC80 -AC80 -F400 -A480 -2700 -ENDCHAR -STARTCHAR 6068 -ENCODING 24680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -F100 -DF00 -5500 -5700 -5200 -5D00 -7080 -ENDCHAR -STARTCHAR 6069 -ENCODING 24681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4900 -7D00 -6700 -7F00 -0800 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR 606A -ENCODING 24682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -D100 -EA00 -CE00 -7180 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 606C -ENCODING 24684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -C400 -FF80 -C400 -4400 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 606D -ENCODING 24685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -2400 -FF00 -2400 -FF80 -3400 -5300 -DA80 -5600 -B500 -ENDCHAR -STARTCHAR 606F -ENCODING 24687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4200 -7E00 -7E00 -7E00 -1800 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR 6070 -ENCODING 24688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -F100 -D080 -CE00 -4000 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 6085 -ENCODING 24709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -4900 -F100 -EF80 -D100 -5100 -4F00 -4A00 -4A80 -5300 -ENDCHAR -STARTCHAR 6089 -ENCODING 24713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0700 -7A00 -FF80 -1800 -6E00 -8980 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 608C -ENCODING 24716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -4A00 -BF00 -A500 -9F00 -7F00 -4C80 -5500 -6700 -4400 -ENDCHAR -STARTCHAR 608D -ENCODING 24717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -FF00 -C000 -5F00 -4400 -7F80 -4400 -4400 -ENDCHAR -STARTCHAR 6094 -ENCODING 24724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F80 -D000 -EF00 -D500 -7F80 -5500 -5F00 -4100 -4600 -ENDCHAR -STARTCHAR 6096 -ENCODING 24726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -DF80 -F080 -DF00 -4200 -4400 -5F80 -4400 -4C00 -ENDCHAR -STARTCHAR 609A -ENCODING 24730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -C400 -FF00 -D500 -5F00 -4E00 -5500 -6480 -4400 -ENDCHAR -STARTCHAR 609B -ENCODING 24731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4900 -FF00 -EA80 -DB00 -4800 -5F00 -5A00 -4E00 -7180 -ENDCHAR -STARTCHAR 609F -ENCODING 24735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4800 -FE00 -E900 -FF80 -4000 -5F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 60A0 -ENCODING 24736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6F80 -6900 -B600 -A200 -6500 -5880 -6900 -AB00 -BC80 -ENDCHAR -STARTCHAR 60A3 -ENCODING 24739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7E00 -7E00 -0800 -FF00 -FF00 -0800 -B100 -AB00 -BC80 -ENDCHAR -STARTCHAR 60A4 -ENCODING 24740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7F00 -5D00 -7500 -4D00 -7F00 -0000 -6900 -AB00 -BC80 -ENDCHAR -STARTCHAR 60A7 -ENCODING 24743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4D -7B -CB -DF -DB -5B -6F -6B -49 -4B -ENDCHAR -STARTCHAR 60B0 -ENCODING 24752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -D080 -EF00 -C000 -5F80 -5500 -5500 -6480 -4C00 -ENDCHAR -STARTCHAR 60B2 -ENCODING 24754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -F700 -1400 -F700 -E780 -4400 -3100 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 60B3 -ENCODING 24755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BE00 -BE00 -BE00 -BE00 -FF00 -3100 -AB00 -BC80 -ENDCHAR -STARTCHAR 60B4 -ENCODING 24756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -EA00 -EA00 -DB00 -6480 -5F80 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 60B6 -ENCODING 24758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -99 -A3 -D7 -DD -83 -ENDCHAR -STARTCHAR 60B8 -ENCODING 24760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5E00 -DF00 -EC00 -D700 -7E80 -7F80 -4400 -4400 -4C00 -ENDCHAR -STARTCHAR 60BC -ENCODING 24764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -C400 -FF00 -DF00 -5100 -5F00 -7F80 -4400 -4400 -ENDCHAR -STARTCHAR 60BD -ENCODING 24765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -DF00 -E500 -FF80 -5F00 -7F80 -5200 -4E00 -7900 -ENDCHAR -STARTCHAR 60C5 -ENCODING 24773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -DF00 -FF80 -C000 -5F00 -5500 -5F00 -5100 -5300 -ENDCHAR -STARTCHAR 60C7 -ENCODING 24775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -4000 -DF00 -FF00 -C000 -5F00 -4600 -7F80 -4400 -4C00 -ENDCHAR -STARTCHAR 60D1 -ENCODING 24785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -FF00 -0500 -F600 -F600 -1E80 -EB00 -B100 -AB00 -BC80 -ENDCHAR -STARTCHAR 60DA -ENCODING 24794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F00 -DB00 -EB00 -D500 -4B00 -4400 -6B00 -6980 -4E00 -ENDCHAR -STARTCHAR 60DC -ENCODING 24796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -7F00 -EA00 -DF80 -C000 -5F00 -5100 -5F00 -5F00 -5100 -ENDCHAR -STARTCHAR 60DF -ENCODING 24799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4A00 -FF80 -F200 -DF00 -5200 -4F00 -5200 -4F80 -5000 -ENDCHAR -STARTCHAR 60E0 -ENCODING 24800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7F00 -7F00 -4900 -7F00 -FF00 -2800 -AB00 -BC80 -ENDCHAR -STARTCHAR 60E1 -ENCODING 24801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -1400 -7700 -7700 -FF80 -0800 -A500 -A300 -BC80 -ENDCHAR -STARTCHAR 60F0 -ENCODING 24816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F80 -EF00 -FF80 -E000 -4F00 -4F00 -5100 -4F00 -5300 -ENDCHAR -STARTCHAR 60F1 -ENCODING 24817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4B -55 -F5 -EB -C4 -5F -5B -55 -5F -51 -ENDCHAR -STARTCHAR 60F3 -ENCODING 24819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -F900 -6F00 -A900 -DF00 -4F00 -1000 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 60F6 -ENCODING 24822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F100 -FF00 -DF00 -4000 -5F80 -5F00 -4400 -7F80 -ENDCHAR -STARTCHAR 60F9 -ENCODING 24825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1000 -FF00 -3E00 -4100 -BE00 -7100 -AB00 -BC80 -ENDCHAR -STARTCHAR 60FA -ENCODING 24826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -FF00 -D400 -5F00 -5400 -4F00 -4400 -5F80 -ENDCHAR -STARTCHAR 60FB -ENCODING 24827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -59 -67 -DB -E7 -E7 -5B -5B -41 -59 -67 -ENDCHAR -STARTCHAR 6101 -ENCODING 24833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3200 -EA80 -FB00 -6E00 -D500 -C880 -1000 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 6106 -ENCODING 24838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -8000 -3780 -C900 -D100 -5200 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 6108 -ENCODING 24840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7800 -3E00 -C180 -F500 -B600 -B500 -8C00 -6B00 -BC80 -ENDCHAR -STARTCHAR 6109 -ENCODING 24841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5C00 -4A00 -DF00 -E080 -DB00 -5B00 -5500 -5B00 -5700 -5980 -ENDCHAR -STARTCHAR 610D -ENCODING 24845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -9780 -F500 -AD00 -FA00 -E500 -9880 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 610E -ENCODING 24846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5F80 -DF00 -F100 -DF00 -5F00 -5F00 -6A00 -4E00 -7180 -ENDCHAR -STARTCHAR 610F -ENCODING 24847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF80 -0000 -7E00 -7E00 -7E00 -B900 -AB00 -BC80 -ENDCHAR -STARTCHAR 6115 -ENCODING 24853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5B00 -DB00 -E000 -DF00 -7F80 -4800 -4F00 -5100 -4700 -ENDCHAR -STARTCHAR 611A -ENCODING 24858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -0800 -FF00 -FF00 -B300 -AB00 -BC80 -ENDCHAR -STARTCHAR 611B -ENCODING 24859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0F00 -F200 -DF00 -EA80 -9D00 -7800 -9C00 -3C00 -C380 -ENDCHAR -STARTCHAR 611F -ENCODING 24863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0700 -FF00 -BD00 -8600 -BA00 -BA00 -8500 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 6127 -ENCODING 24871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F00 -D500 -FF00 -D500 -5F00 -4F00 -4F00 -5480 -6700 -ENDCHAR -STARTCHAR 6130 -ENCODING 24880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -FF00 -D500 -4D00 -5F80 -4A00 -4A80 -7380 -ENDCHAR -STARTCHAR 6134 -ENCODING 24884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5B00 -DF80 -FF00 -D100 -5F00 -5F00 -5F00 -6900 -6F00 -ENDCHAR -STARTCHAR 6137 -ENCODING 24887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -5500 -FF00 -FF80 -C000 -5F00 -5F00 -4A00 -4A00 -7F80 -ENDCHAR -STARTCHAR 613C -ENCODING 24892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5300 -5C80 -DF00 -FF00 -DF00 -5F00 -5F00 -5F80 -4A00 -7180 -ENDCHAR -STARTCHAR 613E -ENCODING 24894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5F00 -BF00 -A000 -9F00 -5D00 -7F00 -5D00 -5B80 -6980 -ENDCHAR -STARTCHAR 613F -ENCODING 24895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -BF00 -BF00 -A100 -BF00 -C900 -6900 -AB00 -BC80 -ENDCHAR -STARTCHAR 6142 -ENCODING 24898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -0A00 -BF00 -7F00 -BF00 -A500 -0800 -AB00 -BC80 -ENDCHAR -STARTCHAR 6144 -ENCODING 24900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -DF00 -FB00 -DF00 -4400 -5F80 -4E00 -7580 -4400 -ENDCHAR -STARTCHAR 6147 -ENCODING 24903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F600 -F680 -F980 -FF00 -F500 -BF00 -8800 -6B00 -BC80 -ENDCHAR -STARTCHAR 6148 -ENCODING 24904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4400 -EE00 -7600 -7500 -CE80 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR 614A -ENCODING 24906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5E00 -BF00 -BF00 -8B00 -7F80 -5F00 -5B00 -6A80 -4A00 -ENDCHAR -STARTCHAR 614B -ENCODING 24907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -F680 -0700 -F000 -9900 -F680 -B700 -3000 -AB00 -BC80 -ENDCHAR -STARTCHAR 614C -ENCODING 24908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -7F80 -C400 -FF80 -D080 -5F00 -5600 -5600 -5680 -6580 -ENDCHAR -STARTCHAR 6153 -ENCODING 24915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4A00 -DF00 -FF00 -C000 -5F00 -5F80 -4D00 -5500 -6C80 -ENDCHAR -STARTCHAR 6155 -ENCODING 24917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -7E00 -7E00 -7E00 -FF80 -4200 -9980 -5600 -B500 -ENDCHAR -STARTCHAR 6158 -ENCODING 24920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F00 -D300 -AA00 -BF00 -5600 -6B80 -5D00 -5E00 -7000 -ENDCHAR -STARTCHAR 6159 -ENCODING 24921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -F600 -B400 -F780 -F500 -F500 -3800 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR 615D -ENCODING 24925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -FF00 -B000 -DE00 -FF80 -0800 -AB00 -BC80 -ENDCHAR -STARTCHAR 615F -ENCODING 24927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -8A -B2 -FF -BB -BB -B7 -BB -BB -BD -87 -ENDCHAR -STARTCHAR 6162 -ENCODING 24930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -DF00 -E000 -DF00 -5F00 -5F00 -4A00 -4E00 -7980 -ENDCHAR -STARTCHAR 6163 -ENCODING 24931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5500 -DF80 -E000 -DF00 -5F00 -5F00 -5F00 -4A00 -7180 -ENDCHAR -STARTCHAR 6164 -ENCODING 24932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -F580 -F980 -F000 -9F00 -7200 -AD00 -9000 -AB00 -BC80 -ENDCHAR -STARTCHAR 6167 -ENCODING 24935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -FF00 -C200 -7E00 -FF80 -7E00 -1000 -AB00 -BC80 -ENDCHAR -STARTCHAR 6168 -ENCODING 24936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -7F00 -AD00 -BD00 -AD00 -7F80 -7A00 -7A00 -6680 -6900 -ENDCHAR -STARTCHAR 616B -ENCODING 24939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -9A00 -ED00 -8500 -9700 -5400 -6F80 -2800 -A300 -BC80 -ENDCHAR -STARTCHAR 616E -ENCODING 24942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0E00 -FF00 -B900 -9E00 -BF00 -BF00 -8800 -D700 -DE80 -ENDCHAR -STARTCHAR 6170 -ENCODING 24944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -FF80 -F100 -8500 -F900 -EB00 -0800 -AB00 -BC80 -ENDCHAR -STARTCHAR 6176 -ENCODING 24950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -FF00 -FF00 -A880 -DF00 -B200 -DC00 -E380 -ENDCHAR -STARTCHAR 6177 -ENCODING 24951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -DF00 -E500 -DF80 -5F00 -7300 -6D00 -7480 -6C00 -ENDCHAR -STARTCHAR 617D -ENCODING 24957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -4200 -9F80 -AA00 -AE80 -7F00 -7F00 -7D00 -7B80 -5D80 -ENDCHAR -STARTCHAR 617E -ENCODING 24958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -F700 -6B00 -9300 -F600 -F500 -0900 -A900 -A280 -BC00 -ENDCHAR -STARTCHAR 6181 -ENCODING 24961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -D700 -EB00 -DF00 -5F00 -4400 -5B00 -6980 -4E00 -ENDCHAR -STARTCHAR 6182 -ENCODING 24962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4200 -7E00 -FF00 -FF00 -5D00 -7E00 -A400 -FF80 -ENDCHAR -STARTCHAR 618A -ENCODING 24970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -7F00 -BF80 -AF00 -AF00 -AF00 -D500 -3100 -AB00 -BC80 -ENDCHAR -STARTCHAR 618E -ENCODING 24974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4E00 -5100 -BF80 -BF00 -9F00 -4000 -5F00 -5F00 -5F00 -5100 -ENDCHAR -STARTCHAR 6190 -ENCODING 24976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -4D00 -DF80 -EE00 -F580 -5D00 -5B80 -7F80 -5100 -6100 -ENDCHAR -STARTCHAR 6191 -ENCODING 24977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -BF00 -7F00 -A400 -BF00 -D500 -3000 -AB00 -BC80 -ENDCHAR -STARTCHAR 6194 -ENCODING 24980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F00 -D400 -FF00 -F700 -5C00 -5F00 -4100 -5A80 -6A80 -ENDCHAR -STARTCHAR 6198 -ENCODING 24984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -BF00 -BF00 -9100 -4E00 -7F80 -5F00 -5F00 -6100 -ENDCHAR -STARTCHAR 6199 -ENCODING 24985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -0800 -7E00 -4200 -FF80 -0000 -7E00 -7E00 -AB00 -BC80 -ENDCHAR -STARTCHAR 619A -ENCODING 24986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5680 -DB00 -FF00 -D500 -5F00 -5F00 -5F80 -4400 -4400 -ENDCHAR -STARTCHAR 61A4 -ENCODING 24996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -DF80 -E900 -DF00 -5F00 -5F00 -5F00 -4A00 -7180 -ENDCHAR -STARTCHAR 61A7 -ENCODING 24999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -DF80 -E000 -DF00 -5F00 -5F00 -5F00 -4400 -7F80 -ENDCHAR -STARTCHAR 61A9 -ENCODING 25001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3200 -E700 -F900 -F700 -9700 -F900 -0700 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 61AB -ENCODING 25003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5B -6B -DB -BB -A5 -5F -6B -65 -6B -61 -ENDCHAR -STARTCHAR 61AC -ENCODING 25004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -DF00 -FF00 -FF80 -5F00 -5100 -5F00 -5500 -6C80 -ENDCHAR -STARTCHAR 61AE -ENCODING 25006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5F80 -FB00 -FB00 -DF80 -5B00 -5F80 -4000 -5B00 -6A80 -ENDCHAR -STARTCHAR 61B2 -ENCODING 25010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF00 -7E00 -FF00 -7F00 -7F00 -1000 -AB00 -BC80 -ENDCHAR -STARTCHAR 61B6 -ENCODING 25014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -BF80 -A000 -9F00 -5F00 -5F00 -5D00 -6A80 -6E80 -ENDCHAR -STARTCHAR 61BA -ENCODING 25018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5E00 -DF80 -BB00 -9400 -5F80 -5000 -5600 -6F00 -6F00 -ENDCHAR -STARTCHAR 61BE -ENCODING 25022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5F80 -EF00 -A300 -AE00 -6E80 -6580 -6D00 -6A80 -6E00 -ENDCHAR -STARTCHAR 61C3 -ENCODING 25027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -F400 -4F00 -F500 -6500 -6500 -F700 -3800 -AB00 -BC80 -ENDCHAR -STARTCHAR 61C7 -ENCODING 25031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -E900 -7F00 -EF00 -BB00 -DF00 -6880 -A900 -A280 -BC00 -ENDCHAR -STARTCHAR 61C8 -ENCODING 25032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5B00 -EA80 -BD00 -B900 -7B80 -7500 -7F80 -6900 -6900 -ENDCHAR -STARTCHAR 61C9 -ENCODING 25033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -AF00 -F200 -EF00 -AC00 -AF00 -B500 -D300 -DE80 -ENDCHAR -STARTCHAR 61CA -ENCODING 25034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -DF00 -FF00 -DF00 -5F00 -4400 -7F80 -4A00 -7180 -ENDCHAR -STARTCHAR 61CB -ENCODING 25035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -FF00 -5F00 -D700 -EE80 -D600 -4200 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 61E6 -ENCODING 25062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4400 -BF00 -BF00 -9F00 -7F80 -5F00 -6B00 -6B00 -6B00 -ENDCHAR -STARTCHAR 61F2 -ENCODING 25074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -BB80 -C500 -BF00 -BB00 -BB00 -BC80 -3000 -AB00 -BC80 -ENDCHAR -STARTCHAR 61F6 -ENCODING 25078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9700 -BA80 -D500 -B800 -BB00 -BB00 -9B00 -BB00 -B300 -9480 -ENDCHAR -STARTCHAR 61F7 -ENCODING 25079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4000 -DF00 -FF00 -C400 -5F00 -5B00 -7300 -4D00 -5880 -ENDCHAR -STARTCHAR 61F8 -ENCODING 25080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -F400 -F500 -F300 -FE80 -BB00 -B200 -6B00 -BC80 -ENDCHAR -STARTCHAR 61FA -ENCODING 25082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5600 -5700 -AE00 -BF80 -B600 -5680 -7500 -5900 -7F80 -4580 -ENDCHAR -STARTCHAR 61FC -ENCODING 25084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5B00 -DB00 -FB00 -D000 -5F80 -7F00 -7700 -5C00 -5F80 -ENDCHAR -STARTCHAR 61FF -ENCODING 25087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -FF80 -E680 -FA00 -FD00 -0880 -E200 -0F00 -AD80 -F780 -ENDCHAR -STARTCHAR 6200 -ENCODING 25088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -DF00 -5A00 -E780 -DA80 -FA80 -DD00 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR 6207 -ENCODING 25095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4700 -FA00 -0F00 -FF80 -F900 -FF00 -4F00 -1D00 -AB00 -BC80 -ENDCHAR -STARTCHAR 6208 -ENCODING 25096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -14 -12 -1F -F0 -11 -0E -0C -19 -75 -C3 -ENDCHAR -STARTCHAR 620A -ENCODING 25098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -0A00 -7F80 -8900 -8A00 -8A00 -8400 -8400 -9A80 -B100 -ENDCHAR -STARTCHAR 620C -ENCODING 25100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -0900 -7F80 -4400 -4600 -7600 -8400 -8C00 -9A80 -A300 -ENDCHAR -STARTCHAR 620D -ENCODING 25101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -0A00 -7F00 -4800 -6A00 -BA00 -9400 -8C00 -9A80 -A300 -ENDCHAR -STARTCHAR 620E -ENCODING 25102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -0A00 -FF00 -2800 -2900 -F600 -2600 -4400 -5A80 -9100 -ENDCHAR -STARTCHAR 6210 -ENCODING 25104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -0900 -7F80 -4800 -7500 -5600 -9600 -B400 -8A80 -9100 -ENDCHAR -STARTCHAR 6211 -ENCODING 25105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1600 -E500 -2400 -FF00 -2500 -7600 -A400 -2A80 -7100 -ENDCHAR -STARTCHAR 6212 -ENCODING 25106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -0900 -FF00 -5800 -5500 -FE00 -5600 -5400 -5A80 -B100 -ENDCHAR -STARTCHAR 6216 -ENCODING 25110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -0900 -FF80 -0400 -F500 -F500 -9600 -3400 -CA80 -1100 -ENDCHAR -STARTCHAR 621A -ENCODING 25114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0500 -0400 -FF80 -9C00 -A500 -FD00 -DD00 -DA00 -DA80 -A500 -ENDCHAR -STARTCHAR 621F -ENCODING 25119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -F500 -4400 -FF80 -F500 -9500 -F200 -F200 -4E80 -4900 -ENDCHAR -STARTCHAR 6221 -ENCODING 25121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9500 -FD00 -9400 -7F80 -7500 -FD00 -DA00 -9A00 -FE80 -8900 -ENDCHAR -STARTCHAR 622A -ENCODING 25130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2600 -F500 -2400 -FF80 -FC00 -A500 -FE00 -FA00 -FE80 -8900 -ENDCHAR -STARTCHAR 622E -ENCODING 25134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -DA00 -5B00 -AA00 -FF80 -D300 -AB00 -D200 -EA00 -B580 -C900 -ENDCHAR -STARTCHAR 6230 -ENCODING 25136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FE00 -ED00 -FC00 -FF80 -AC00 -F300 -F300 -FA00 -2E80 -2900 -ENDCHAR -STARTCHAR 6231 -ENCODING 25137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2300 -3B00 -FA00 -FF80 -B200 -B300 -FB00 -FA00 -FD80 -8900 -ENDCHAR -STARTCHAR 6234 -ENCODING 25140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2600 -FD00 -FF80 -FC00 -FD00 -FD00 -FA00 -FA00 -5580 -8900 -ENDCHAR -STARTCHAR 6236 -ENCODING 25142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -03 -7C -7F -41 -41 -7F -80 -80 -80 -ENDCHAR -STARTCHAR 623E -ENCODING 25150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -80 -FF -FF -8A -FF -94 -B2 -C1 -ENDCHAR -STARTCHAR 623F -ENCODING 25151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0300 -7C00 -7F00 -8100 -7F00 -7F80 -9000 -9F00 -B100 -E700 -ENDCHAR -STARTCHAR 6240 -ENCODING 25152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1100 -E600 -F800 -9780 -9A00 -FA00 -8A00 -8A00 -9200 -ENDCHAR -STARTCHAR 6241 -ENCODING 25153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -03 -7C -7F -81 -7F -BF -B5 -BF -B5 -B5 -ENDCHAR -STARTCHAR 6247 -ENCODING 25159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -80 -7F -7F -7F -BB -DF -ED -99 -ENDCHAR -STARTCHAR 6248 -ENCODING 25160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0300 -7C00 -7F00 -7F00 -BE00 -BE00 -BF00 -A900 -B680 -BF00 -ENDCHAR -STARTCHAR 6249 -ENCODING 25161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -8000 -7F00 -7F00 -B700 -9400 -B780 -D400 -A400 -ENDCHAR -STARTCHAR 624B -ENCODING 25163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -F800 -0800 -FF00 -0800 -FF80 -0800 -0800 -3800 -ENDCHAR -STARTCHAR 624D -ENCODING 25165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -FF -08 -0A -0C -38 -C8 -08 -18 -ENDCHAR -STARTCHAR 6253 -ENCODING 25171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -E200 -4200 -5200 -6200 -C200 -4200 -4200 -C600 -ENDCHAR -STARTCHAR 6258 -ENCODING 25176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -E400 -4400 -6780 -D800 -C400 -4400 -4480 -C700 -ENDCHAR -STARTCHAR 626E -ENCODING 25198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -4A00 -E900 -5100 -5F80 -6900 -C900 -4900 -5100 -E600 -ENDCHAR -STARTCHAR 6271 -ENCODING 25201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5E00 -EA00 -4A00 -6B00 -5500 -D600 -5600 -6D00 -F080 -ENDCHAR -STARTCHAR 6276 -ENCODING 25206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF00 -4400 -5F80 -6400 -C600 -4A00 -5100 -D080 -ENDCHAR -STARTCHAR 6279 -ENCODING 25209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -5200 -F280 -5B00 -7200 -D200 -D200 -5280 -5A80 -F300 -ENDCHAR -STARTCHAR 627C -ENCODING 25212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5000 -F000 -5F00 -7900 -D900 -DB00 -5800 -6880 -E700 -ENDCHAR -STARTCHAR 627F -ENCODING 25215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -0400 -EA80 -3D00 -5E00 -4A00 -BD00 -8880 -1000 -ENDCHAR -STARTCHAR 6280 -ENCODING 25216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -4400 -7F00 -4900 -CA00 -4400 -4F00 -D100 -ENDCHAR -STARTCHAR 6284 -ENCODING 25220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4500 -ED00 -5480 -7480 -D500 -CD00 -4200 -4C00 -F000 -ENDCHAR -STARTCHAR 6289 -ENCODING 25225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF00 -4500 -4500 -FF80 -CC00 -4A00 -5100 -A080 -ENDCHAR -STARTCHAR 628A -ENCODING 25226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -F500 -5500 -5F00 -F000 -D000 -5000 -5080 -DF00 -ENDCHAR -STARTCHAR 6291 -ENCODING 25233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -53 -F5 -55 -75 -D5 -DD -75 -44 -84 -ENDCHAR -STARTCHAR 6292 -ENCODING 25234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4100 -EA00 -4400 -5F80 -6500 -C500 -4400 -4400 -CC00 -ENDCHAR -STARTCHAR 6295 -ENCODING 25237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4E00 -4A00 -F280 -5300 -6000 -DF00 -CA00 -4600 -4A00 -D180 -ENDCHAR -STARTCHAR 6297 -ENCODING 25239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -C000 -4000 -5E00 -5200 -9200 -5280 -7280 -A300 -ENDCHAR -STARTCHAR 6298 -ENCODING 25240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -4E00 -E800 -4800 -6F80 -EA00 -D200 -5200 -5200 -E200 -ENDCHAR -STARTCHAR 629B -ENCODING 25243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -9200 -FF00 -9B00 -9B00 -5B00 -9B00 -AF00 -A880 -AF00 -ENDCHAR -STARTCHAR 62AB -ENCODING 25259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -D480 -5400 -5F00 -5900 -AA00 -6600 -6B00 -B080 -ENDCHAR -STARTCHAR 62B1 -ENCODING 25265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F00 -F100 -5D00 -7300 -7D00 -D300 -5000 -5080 -DF00 -ENDCHAR -STARTCHAR 62B5 -ENCODING 25269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4700 -5A00 -F200 -5200 -5F00 -F200 -D200 -5E00 -7280 -DF00 -ENDCHAR -STARTCHAR 62B9 -ENCODING 25273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -4400 -5F00 -6600 -CE00 -5500 -5480 -C400 -ENDCHAR -STARTCHAR 62BC -ENCODING 25276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -5F -F5 -5F -75 -D5 -DF -44 -44 -C4 -ENDCHAR -STARTCHAR 62BD -ENCODING 25277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -44 -FF -55 -75 -DF -D5 -55 -5F -D1 -ENDCHAR -STARTCHAR 62C2 -ENCODING 25282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4A -5F -CB -5F -6A -6A -BF -4B -53 -A2 -ENDCHAR -STARTCHAR 62C7 -ENCODING 25287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -F500 -5100 -7F80 -7900 -9500 -5F00 -6100 -8600 -ENDCHAR -STARTCHAR 62C8 -ENCODING 25288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -E780 -4400 -6400 -5F00 -D100 -5100 -5F00 -D100 -ENDCHAR -STARTCHAR 62C9 -ENCODING 25289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF00 -4100 -7100 -4A00 -CA00 -4A00 -4200 -FF80 -ENDCHAR -STARTCHAR 62CC -ENCODING 25292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4D00 -F500 -5480 -5F00 -6400 -DF80 -4400 -4400 -C400 -ENDCHAR -STARTCHAR 62CD -ENCODING 25293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -44 -FF -51 -51 -7F -D1 -51 -5F -D1 -ENDCHAR -STARTCHAR 62CF -ENCODING 25295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -FF00 -9600 -7500 -8880 -7E00 -FF00 -FF80 -0800 -1000 -ENDCHAR -STARTCHAR 62D0 -ENCODING 25296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -51 -F1 -5F -44 -7F -C5 -49 -59 -D3 -ENDCHAR -STARTCHAR 62D2 -ENCODING 25298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5000 -F000 -5F00 -7100 -D100 -DF00 -5000 -5000 -DF80 -ENDCHAR -STARTCHAR 62D3 -ENCODING 25299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4400 -E800 -4800 -6F00 -D900 -E900 -4900 -4F00 -C900 -ENDCHAR -STARTCHAR 62D4 -ENCODING 25300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4900 -FF80 -4800 -6900 -4D00 -D200 -5600 -6D00 -C880 -ENDCHAR -STARTCHAR 62D6 -ENCODING 25302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F80 -F000 -6D00 -4F00 -FD00 -CD00 -4F00 -4880 -CF00 -ENDCHAR -STARTCHAR 62D7 -ENCODING 25303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -92 -92 -D2 -AF -AB -D3 -9D -BD -85 -8B -ENDCHAR -STARTCHAR 62D8 -ENCODING 25304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -4F -F1 -61 -5D -73 -DD -53 -41 -C7 -ENDCHAR -STARTCHAR 62D9 -ENCODING 25305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -55 -F5 -55 -7F -C4 -D5 -55 -5F -D1 -ENDCHAR -STARTCHAR 62DB -ENCODING 25307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -5F -E5 -49 -73 -C0 -DF -51 -5F -D1 -ENDCHAR -STARTCHAR 62DC -ENCODING 25308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2F00 -C200 -4F00 -E200 -4F00 -FF80 -4200 -4200 -8200 -ENDCHAR -STARTCHAR 62EC -ENCODING 25324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -E400 -5F80 -6400 -4400 -DF00 -5100 -5F00 -D100 -ENDCHAR -STARTCHAR 62ED -ENCODING 25325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -4280 -FF80 -4200 -4200 -7E00 -CA00 -4A00 -4E80 -F900 -ENDCHAR -STARTCHAR 62EE -ENCODING 25326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -4400 -7F00 -4000 -DF00 -5100 -5F00 -D100 -ENDCHAR -STARTCHAR 62EF -ENCODING 25327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4200 -C400 -7D00 -6F00 -D600 -B500 -6480 -4C00 -BF00 -ENDCHAR -STARTCHAR 62F1 -ENCODING 25329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4A00 -EA00 -5F00 -6A00 -7F80 -C000 -4A00 -5100 -E080 -ENDCHAR -STARTCHAR 62F3 -ENCODING 25331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3200 -5300 -7F00 -FF80 -2200 -FF00 -FE80 -FF00 -0800 -1800 -ENDCHAR -STARTCHAR 62F7 -ENCODING 25335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F00 -EA00 -7F80 -4500 -7E00 -EF00 -4100 -4100 -C700 -ENDCHAR -STARTCHAR 62FE -ENCODING 25342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -F100 -6080 -7F00 -4000 -DF00 -5100 -5F00 -9100 -ENDCHAR -STARTCHAR 62FF -ENCODING 25343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -7E00 -8180 -7E00 -0000 -7E00 -FF00 -FF80 -3800 -ENDCHAR -STARTCHAR 6301 -ENCODING 25345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -E400 -4400 -5F80 -FF80 -D100 -4900 -4900 -C600 -ENDCHAR -STARTCHAR 6307 -ENCODING 25351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5100 -5600 -F880 -5F00 -4000 -EF00 -D100 -4F00 -4F00 -D100 -ENDCHAR -STARTCHAR 6309 -ENCODING 25353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F480 -4800 -5F80 -E900 -DA00 -4600 -4D00 -9080 -ENDCHAR -STARTCHAR 6311 -ENCODING 25361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5A80 -FB00 -5B00 -6A00 -5B00 -EA80 -4A80 -5280 -A300 -ENDCHAR -STARTCHAR 632B -ENCODING 25387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5500 -D500 -5500 -5F00 -EE80 -9F00 -4400 -4400 -BF80 -ENDCHAR -STARTCHAR 632F -ENCODING 25391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5000 -EF00 -5000 -5F80 -EB00 -9B00 -6A00 -6F00 -B880 -ENDCHAR -STARTCHAR 633A -ENCODING 25402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -7600 -D200 -5200 -5F80 -CA00 -9200 -5700 -6800 -A780 -ENDCHAR -STARTCHAR 633B -ENCODING 25403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B100 -9600 -D200 -9600 -B700 -4E00 -B600 -9780 -B000 -AF80 -ENDCHAR -STARTCHAR 633D -ENCODING 25405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4E00 -F200 -5F00 -7500 -DF00 -C400 -4A00 -5A80 -E300 -ENDCHAR -STARTCHAR 633E -ENCODING 25406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -C400 -5500 -5500 -EE80 -8A00 -4A00 -5100 -A080 -ENDCHAR -STARTCHAR 6349 -ENCODING 25417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -F100 -5F00 -6400 -D400 -D700 -5400 -6C00 -E780 -ENDCHAR -STARTCHAR 634C -ENCODING 25420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -B9 -AB -EB -BB -93 -5B -9B -AB -A9 -BB -ENDCHAR -STARTCHAR 634F -ENCODING 25423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -5100 -5F00 -6400 -DF00 -4400 -4400 -DF80 -ENDCHAR -STARTCHAR 6350 -ENCODING 25424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -51 -EF -40 -7F -5F -D1 -5F -51 -D3 -ENDCHAR -STARTCHAR 6355 -ENCODING 25429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -5F80 -E400 -5F00 -5500 -FF00 -D500 -5F00 -5500 -9700 -ENDCHAR -STARTCHAR 6367 -ENCODING 25447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -E400 -5F00 -7F00 -7500 -EE80 -5F00 -4400 -8400 -ENDCHAR -STARTCHAR 6368 -ENCODING 25448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -F100 -7F80 -4400 -7F80 -DF00 -5100 -5100 -9F00 -ENDCHAR -STARTCHAR 636E -ENCODING 25454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5080 -FF00 -5200 -7F80 -D200 -DF00 -6880 -6F00 -A880 -ENDCHAR -STARTCHAR 6372 -ENCODING 25458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5600 -5500 -EE80 -4A00 -7F00 -5F00 -F280 -5600 -5100 -8F00 -ENDCHAR -STARTCHAR 6377 -ENCODING 25463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -DF00 -4500 -7F80 -DF00 -8400 -5700 -6C00 -A780 -ENDCHAR -STARTCHAR 637A -ENCODING 25466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -EA00 -5100 -5E80 -E000 -9F00 -5500 -5500 -AC80 -ENDCHAR -STARTCHAR 637B -ENCODING 25467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -4A00 -FF00 -6080 -7F00 -4100 -C600 -6B00 -6980 -AE00 -ENDCHAR -STARTCHAR 637F -ENCODING 25471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -DF00 -4500 -7F80 -7F00 -BF80 -5200 -4E00 -B900 -ENDCHAR -STARTCHAR 6383 -ENCODING 25475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4100 -FF80 -5F00 -5F80 -6480 -DF00 -5500 -5700 -8400 -ENDCHAR -STARTCHAR 6388 -ENCODING 25480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4500 -D500 -5F00 -6080 -5F00 -8A00 -4400 -4A00 -9180 -ENDCHAR -STARTCHAR 6389 -ENCODING 25481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -E400 -5F00 -7F00 -5100 -DF00 -7F80 -4400 -8400 -ENDCHAR -STARTCHAR 638C -ENCODING 25484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -FF00 -8100 -BF00 -0000 -7F00 -FF00 -FF80 -0800 -3800 -ENDCHAR -STARTCHAR 6392 -ENCODING 25490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4A00 -FB80 -4A00 -5B80 -6A00 -FB80 -4A00 -5200 -D200 -ENDCHAR -STARTCHAR 6396 -ENCODING 25494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -EC00 -5700 -7700 -FF00 -BD00 -5200 -5500 -9880 -ENDCHAR -STARTCHAR 6398 -ENCODING 25496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -51 -DF -54 -5D -5D -AF -75 -7F -B1 -ENDCHAR -STARTCHAR 639B -ENCODING 25499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4A00 -DE00 -7E00 -4100 -4A80 -BE00 -4A00 -4E00 -B200 -ENDCHAR -STARTCHAR 63A0 -ENCODING 25504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -E000 -5F00 -7100 -DF00 -C400 -4D00 -5480 -EC00 -ENDCHAR -STARTCHAR 63A1 -ENCODING 25505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -5F00 -F480 -5000 -6400 -DF00 -CE00 -5500 -6480 -C400 -ENDCHAR -STARTCHAR 63A2 -ENCODING 25506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5A80 -EA80 -5300 -6400 -5F00 -CE00 -5500 -6480 -C400 -ENDCHAR -STARTCHAR 63A5 -ENCODING 25509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -EA00 -5F80 -6400 -C800 -DF80 -4A00 -4600 -D900 -ENDCHAR -STARTCHAR 63A7 -ENCODING 25511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FA80 -4A80 -4B00 -7000 -DF00 -4400 -4400 -DF80 -ENDCHAR -STARTCHAR 63A8 -ENCODING 25512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4A00 -FF80 -5200 -4F00 -F200 -CF00 -5200 -4F80 -D000 -ENDCHAR -STARTCHAR 63A9 -ENCODING 25513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -EA00 -5F00 -7580 -D500 -9F00 -5F00 -4480 -8700 -ENDCHAR -STARTCHAR 63AA -ENCODING 25514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -EA00 -5F80 -6000 -4F00 -D100 -4F00 -4F00 -D100 -ENDCHAR -STARTCHAR 63C0 -ENCODING 25536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -E400 -5F00 -7F00 -DF00 -4E00 -5500 -6480 -C400 -ENDCHAR -STARTCHAR 63C4 -ENCODING 25540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5C00 -4A00 -DF00 -6080 -5B00 -DB00 -AD00 -5B00 -6B00 -AA80 -ENDCHAR -STARTCHAR 63C6 -ENCODING 25542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5D00 -4A00 -FB00 -5100 -7F80 -E400 -9F00 -4400 -5A00 -B100 -ENDCHAR -STARTCHAR 63CF -ENCODING 25551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -EA00 -4A00 -5F00 -7500 -DF00 -5500 -5F00 -D100 -ENDCHAR -STARTCHAR 63D0 -ENCODING 25552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -5F00 -4000 -5F80 -9400 -5700 -6C00 -A780 -ENDCHAR -STARTCHAR 63D6 -ENCODING 25558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -5F80 -7100 -DF00 -DF00 -5180 -7F00 -C100 -ENDCHAR -STARTCHAR 63DA -ENCODING 25562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -5F00 -5F80 -E800 -DF00 -6A80 -5500 -CB00 -ENDCHAR -STARTCHAR 63DB -ENCODING 25563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5E00 -F200 -7F00 -5B00 -D900 -BF80 -4400 -5B00 -B180 -ENDCHAR -STARTCHAR 63E1 -ENCODING 25569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5080 -FF00 -5000 -7F80 -D500 -DE00 -5F00 -6200 -FF80 -ENDCHAR -STARTCHAR 63ED -ENCODING 25581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -51 -FF -5F -68 -DF -F5 -5B -5F -D3 -ENDCHAR -STARTCHAR 63EE -ENCODING 25582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -6480 -FF00 -5F00 -7500 -DF00 -DF00 -7F80 -4400 -C400 -ENDCHAR -STARTCHAR 63F4 -ENCODING 25588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -5F00 -F480 -5F00 -4800 -DF80 -CF00 -5900 -5600 -B900 -ENDCHAR -STARTCHAR 63F6 -ENCODING 25590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -5B00 -DB00 -5B00 -5B00 -5A80 -9A80 -5B00 -6A00 -8A00 -ENDCHAR -STARTCHAR 63F7 -ENCODING 25591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -5E00 -FF80 -4C00 -7700 -5F00 -D500 -5F00 -5400 -C400 -ENDCHAR -STARTCHAR 640D -ENCODING 25613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -5F00 -7100 -DF00 -DF00 -5F00 -4A00 -F180 -ENDCHAR -STARTCHAR 640F -ENCODING 25615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4700 -7F80 -FF00 -5500 -5F00 -7F00 -C200 -7F80 -4A00 -8600 -ENDCHAR -STARTCHAR 6414 -ENCODING 25620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -EA00 -5600 -5D80 -7F00 -9500 -5F00 -4700 -9C80 -ENDCHAR -STARTCHAR 6416 -ENCODING 25622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -F600 -4C00 -4800 -FF00 -DF80 -4400 -5480 -9F00 -ENDCHAR -STARTCHAR 6417 -ENCODING 25623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FF00 -5100 -7F00 -5F80 -9F00 -6B00 -7F00 -A300 -ENDCHAR -STARTCHAR 641C -ENCODING 25628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -5F00 -FF00 -5500 -7F00 -4400 -DF00 -4A00 -4600 -D980 -ENDCHAR -STARTCHAR 6422 -ENCODING 25634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5B00 -DB00 -7080 -7F80 -C000 -9F00 -5F00 -5F00 -9100 -ENDCHAR -STARTCHAR 642C -ENCODING 25644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9300 -BD00 -FD00 -BD80 -6800 -BF00 -BB00 -BB00 -AB00 -BC80 -ENDCHAR -STARTCHAR 642D -ENCODING 25645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -7F80 -EE00 -4A00 -7F00 -E080 -DF00 -5100 -5F00 -9100 -ENDCHAR -STARTCHAR 643A -ENCODING 25658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -54 -5E -FF -5F -7F -C0 -DE -4B -59 -D3 -ENDCHAR -STARTCHAR 643E -ENCODING 25662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -CA00 -5B00 -6F80 -D400 -A700 -4700 -4400 -8400 -ENDCHAR -STARTCHAR 6458 -ENCODING 25688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -CA00 -5F00 -6500 -EF00 -AF00 -6F00 -6B00 -A300 -ENDCHAR -STARTCHAR 6460 -ENCODING 25696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -D700 -5B00 -5F00 -FF00 -8400 -5B00 -6980 -AE00 -ENDCHAR -STARTCHAR 6469 -ENCODING 25705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -7FC0 -7F80 -7BC0 -7380 -4100 -5F00 -7FC0 -4400 -8C00 -ENDCHAR -STARTCHAR 646F -ENCODING 25711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF00 -FD00 -F500 -FB80 -4600 -7800 -FF80 -0800 -1000 -ENDCHAR -STARTCHAR 6478 -ENCODING 25720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -E000 -5F00 -7F00 -DF00 -8400 -7F80 -4A00 -B180 -ENDCHAR -STARTCHAR 6479 -ENCODING 25721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -2400 -7E00 -4200 -7E00 -FF80 -F980 -7E00 -FF00 -1800 -ENDCHAR -STARTCHAR 647A -ENCODING 25722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5B -49 -F5 -4B -75 -C4 -DF -51 -5F -DF -ENDCHAR -STARTCHAR 6488 -ENCODING 25736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -6E80 -DB00 -5B00 -7F80 -6480 -9F00 -4900 -4900 -B200 -ENDCHAR -STARTCHAR 6491 -ENCODING 25745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -5F00 -E080 -6E80 -4E00 -DF00 -8400 -7F80 -4400 -8C00 -ENDCHAR -STARTCHAR 6492 -ENCODING 25746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9A00 -BA00 -DB80 -BD00 -BF00 -EF00 -B900 -BB00 -AB00 -AC80 -ENDCHAR -STARTCHAR 6493 -ENCODING 25747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -DF80 -5200 -5B00 -F780 -BF80 -4A00 -5280 -A300 -ENDCHAR -STARTCHAR 649A -ENCODING 25754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -9B00 -D780 -AA00 -9A00 -D500 -9880 -A100 -AD00 -AA80 -ENDCHAR -STARTCHAR 649E -ENCODING 25758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FF80 -4000 -5F00 -7F00 -9F00 -5F00 -4400 -BF80 -ENDCHAR -STARTCHAR 64A4 -ENCODING 25764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -BE00 -DB80 -BB00 -8300 -FB00 -BB00 -B900 -AB00 -AC80 -ENDCHAR -STARTCHAR 64A5 -ENCODING 25765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5D00 -4A00 -D100 -5F80 -6D80 -5D80 -9F00 -4D00 -4B00 -9580 -ENDCHAR -STARTCHAR 64AB -ENCODING 25771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5F80 -FB00 -7B00 -7F80 -DB00 -9B00 -5F80 -5B00 -AA80 -ENDCHAR -STARTCHAR 64AD -ENCODING 25773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -ED00 -5F80 -4E00 -F580 -DF00 -5F00 -5500 -9F00 -ENDCHAR -STARTCHAR 64AE -ENCODING 25774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9F00 -9F00 -DF00 -8000 -BF80 -DF00 -AB00 -BB00 -BB00 -8A80 -ENDCHAR -STARTCHAR 64B0 -ENCODING 25776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -6B00 -DF80 -5B00 -4A00 -FF00 -8A00 -7F80 -5A00 -A180 -ENDCHAR -STARTCHAR 64B2 -ENCODING 25778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5B00 -FF80 -4A00 -5F00 -7F00 -DF80 -4400 -4B00 -F180 -ENDCHAR -STARTCHAR 64BB -ENCODING 25787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A200 -9F00 -CF80 -A500 -8F80 -6F00 -9200 -9F80 -B200 -AF80 -ENDCHAR -STARTCHAR 64C1 -ENCODING 25793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -D500 -7F80 -6D00 -D780 -9D80 -7700 -5780 -A400 -ENDCHAR -STARTCHAR 64C4 -ENCODING 25796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -8700 -FF00 -BD00 -AF00 -7F80 -AD00 -BF00 -AD00 -D300 -ENDCHAR -STARTCHAR 64C5 -ENCODING 25797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4000 -FF00 -5B00 -5F00 -E000 -DF00 -5F00 -5F00 -BF80 -ENDCHAR -STARTCHAR 64C7 -ENCODING 25799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5A80 -DF80 -5F00 -4400 -DF80 -9F80 -5F00 -4400 -8400 -ENDCHAR -STARTCHAR 64CA -ENCODING 25802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F600 -F580 -F980 -FF00 -4600 -FD80 -7E00 -FF00 -FF80 -1800 -ENDCHAR -STARTCHAR 64CD -ENCODING 25805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -EF00 -5B00 -7B00 -C400 -DF80 -4E00 -5580 -9400 -ENDCHAR -STARTCHAR 64CE -ENCODING 25806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6400 -FF80 -FD00 -BA00 -7D80 -0600 -7C00 -FF80 -0800 -1800 -ENDCHAR -STARTCHAR 64D2 -ENCODING 25810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -5900 -DF80 -5F00 -5B00 -5F00 -9F00 -5A80 -5E80 -9100 -ENDCHAR -STARTCHAR 64D4 -ENCODING 25812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5E00 -FF80 -5B00 -5F00 -7F80 -9000 -6600 -6F00 -AF00 -ENDCHAR -STARTCHAR 64D8 -ENCODING 25816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -9F80 -FF80 -FF00 -F200 -0200 -7C00 -FF80 -0800 -3800 -ENDCHAR -STARTCHAR 64DA -ENCODING 25818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -DF00 -5700 -5000 -DF00 -9F00 -6A00 -6F00 -B680 -ENDCHAR -STARTCHAR 64E1 -ENCODING 25825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -C000 -5F00 -4000 -9F80 -4A00 -5F00 -5F00 -BF80 -ENDCHAR -STARTCHAR 64E2 -ENCODING 25826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5500 -EB00 -5680 -4A00 -FF80 -FF00 -5300 -5C00 -9F80 -ENDCHAR -STARTCHAR 64E5 -ENCODING 25829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -AF00 -F700 -FF00 -FF00 -7E00 -0800 -FF80 -0800 -3000 -ENDCHAR -STARTCHAR 64E6 -ENCODING 25830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -BF80 -DF00 -9B00 -AA00 -DF00 -BF80 -8400 -9500 -AC80 -ENDCHAR -STARTCHAR 64E7 -ENCODING 25831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7700 -9900 -7B00 -7B00 -FF80 -6200 -FF80 -FF00 -0800 -3000 -ENDCHAR -STARTCHAR 64EC -ENCODING 25836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AF00 -B900 -FB00 -A100 -BF80 -F680 -BF80 -9600 -AE00 -A980 -ENDCHAR -STARTCHAR 64F2 -ENCODING 25842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9B80 -A680 -FF00 -BF00 -BF00 -E680 -BE80 -BF80 -9A00 -A600 -ENDCHAR -STARTCHAR 64F4 -ENCODING 25844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -BF80 -FF80 -AE00 -BF80 -EF00 -B500 -BF00 -AF00 -B980 -ENDCHAR -STARTCHAR 64FA -ENCODING 25850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F00 -7F00 -D000 -5B00 -7B80 -FB00 -AB00 -7B00 -7A80 -AB00 -ENDCHAR -STARTCHAR 64FE -ENCODING 25854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F00 -5F00 -DF00 -5F00 -7F00 -FF00 -9F00 -5F00 -7E00 -BF80 -ENDCHAR -STARTCHAR 6500 -ENCODING 25856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -FF00 -DB00 -EE80 -1000 -FF80 -FA00 -FF80 -0800 -1000 -ENDCHAR -STARTCHAR 6504 -ENCODING 25860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8700 -8400 -FF80 -BD00 -A700 -FD00 -AF00 -A400 -BB00 -DE80 -ENDCHAR -STARTCHAR 6518 -ENCODING 25880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -4000 -DB00 -5B00 -7F00 -DF00 -8A00 -7F80 -6E00 -9980 -ENDCHAR -STARTCHAR 651D -ENCODING 25885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF00 -9E00 -D200 -BF00 -8200 -FF80 -BF00 -BF00 -BF80 -8900 -ENDCHAR -STARTCHAR 6523 -ENCODING 25891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -DF00 -4200 -FB80 -BA80 -8500 -7E00 -0800 -FF80 -3000 -ENDCHAR -STARTCHAR 652A -ENCODING 25898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5700 -5B00 -D700 -7F00 -7F00 -DF00 -9F00 -5F00 -4A80 -B380 -ENDCHAR -STARTCHAR 652B -ENCODING 25899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5B00 -D480 -5F00 -5F00 -FE00 -9F80 -7F00 -4B00 -BF80 -ENDCHAR -STARTCHAR 652C -ENCODING 25900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BA00 -BD00 -FF80 -BF80 -9F00 -9F00 -9F00 -9F00 -8A80 -B300 -ENDCHAR -STARTCHAR 652F -ENCODING 25903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF80 -0800 -FE00 -2200 -1400 -0800 -7600 -C100 -ENDCHAR -STARTCHAR 6536 -ENCODING 25910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -A800 -AF00 -A900 -B900 -B600 -E600 -A600 -2F00 -3080 -ENDCHAR -STARTCHAR 6537 -ENCODING 25911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -F400 -4F00 -8900 -F500 -2600 -2600 -2600 -2D00 -F080 -ENDCHAR -STARTCHAR 6538 -ENCODING 25912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4800 -6F00 -A900 -B900 -B600 -6600 -6600 -4D00 -5080 -ENDCHAR -STARTCHAR 6539 -ENCODING 25913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -E800 -2F80 -2900 -F900 -8600 -9600 -E600 -0900 -1080 -ENDCHAR -STARTCHAR 653B -ENCODING 25915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -F800 -4F80 -4900 -5A00 -5600 -7600 -CE00 -1900 -1080 -ENDCHAR -STARTCHAR 653E -ENCODING 25918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -F780 -4900 -7500 -5500 -9200 -9200 -9D00 -E880 -ENDCHAR -STARTCHAR 653F -ENCODING 25919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -F400 -2780 -A900 -B900 -A600 -A200 -B600 -CD00 -1880 -ENDCHAR -STARTCHAR 6545 -ENCODING 25925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -F780 -4900 -4900 -F500 -9600 -9600 -FD00 -8880 -ENDCHAR -STARTCHAR 6548 -ENCODING 25928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -F400 -4780 -9900 -B900 -6E00 -2600 -6600 -DD00 -9880 -ENDCHAR -STARTCHAR 654D -ENCODING 25933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -6200 -9380 -F200 -2F00 -F500 -B200 -B200 -AD00 -4880 -ENDCHAR -STARTCHAR 654E -ENCODING 25934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D400 -2400 -D780 -FD00 -4D00 -F500 -A200 -F200 -6500 -6880 -ENDCHAR -STARTCHAR 654F -ENCODING 25935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7C00 -8780 -7500 -BD00 -FD00 -D200 -FA00 -9500 -6880 -ENDCHAR -STARTCHAR 6551 -ENCODING 25937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5400 -5400 -F780 -4900 -DD00 -6D00 -6200 -D200 -4D00 -C880 -ENDCHAR -STARTCHAR 6556 -ENCODING 25942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F400 -4780 -F500 -4D00 -FD00 -7200 -5200 -9500 -A880 -ENDCHAR -STARTCHAR 6557 -ENCODING 25943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A800 -EF80 -A900 -E900 -B600 -E600 -A600 -AD00 -9880 -ENDCHAR -STARTCHAR 655E -ENCODING 25950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B200 -B400 -AF80 -F500 -8D00 -F300 -F200 -F200 -9500 -9480 -ENDCHAR -STARTCHAR 6562 -ENCODING 25954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -4400 -F700 -9500 -FD00 -9500 -F600 -B200 -D500 -1880 -ENDCHAR -STARTCHAR 6563 -ENCODING 25955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6400 -F400 -6780 -F500 -0D00 -FD00 -F200 -F200 -9500 -B880 -ENDCHAR -STARTCHAR 6566 -ENCODING 25958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FC00 -0400 -F780 -F500 -0D00 -FD00 -2200 -F200 -2D00 -4880 -ENDCHAR -STARTCHAR 656C -ENCODING 25964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5400 -FC00 -5780 -4500 -FD00 -EB00 -B200 -F300 -9500 -3880 -ENDCHAR -STARTCHAR 656D -ENCODING 25965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F000 -9400 -F780 -F500 -FD00 -4300 -F200 -6A00 -B500 -7880 -ENDCHAR -STARTCHAR 6572 -ENCODING 25970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FA00 -0200 -F380 -F200 -0F00 -F500 -ED00 -EA00 -ED00 -9880 -ENDCHAR -STARTCHAR 6574 -ENCODING 25972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -F500 -FD00 -6200 -DD80 -FF00 -0800 -2E00 -FF80 -ENDCHAR -STARTCHAR 6575 -ENCODING 25973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FA00 -5780 -FD00 -AD00 -FB00 -EA00 -EA00 -DD00 -9C80 -ENDCHAR -STARTCHAR 6577 -ENCODING 25975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5400 -FC00 -F780 -F500 -F500 -9D00 -FA00 -7200 -9500 -B880 -ENDCHAR -STARTCHAR 6578 -ENCODING 25976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FC00 -FF80 -FD00 -FD00 -FB00 -FA00 -5200 -2500 -D480 -ENDCHAR -STARTCHAR 657E -ENCODING 25982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -F400 -F780 -F500 -B500 -FD00 -0200 -F200 -F500 -9880 -ENDCHAR -STARTCHAR 6582 -ENCODING 25986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -D400 -FF80 -0500 -FD00 -EB00 -FA00 -5200 -D700 -AC80 -ENDCHAR -STARTCHAR 6583 -ENCODING 25987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B400 -AF80 -FD00 -D700 -B580 -0800 -FF80 -F700 -6880 -C700 -ENDCHAR -STARTCHAR 6585 -ENCODING 25989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FA00 -FB80 -FA00 -AA00 -FF00 -FD00 -2300 -FA00 -2500 -6880 -ENDCHAR -STARTCHAR 6587 -ENCODING 25991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -FF -42 -24 -34 -18 -18 -66 -81 -ENDCHAR -STARTCHAR 658C -ENCODING 25996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -5F00 -E280 -DF80 -CA00 -5A00 -7600 -BA00 -9780 -B900 -ENDCHAR -STARTCHAR 6590 -ENCODING 26000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -F700 -F700 -E780 -2400 -2800 -FF80 -2400 -3C00 -C380 -ENDCHAR -STARTCHAR 6591 -ENCODING 26001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF80 -7E00 -5600 -DA00 -5F00 -4A00 -6A00 -9A00 -2780 -ENDCHAR -STARTCHAR 6597 -ENCODING 26007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0400 -3400 -0400 -6400 -0400 -1F80 -FC00 -0400 -0400 -ENDCHAR -STARTCHAR 6599 -ENCODING 26009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -DD00 -E500 -4100 -F900 -6500 -D780 -CF00 -4100 -4100 -ENDCHAR -STARTCHAR 659B -ENCODING 26011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -7500 -A300 -F900 -B500 -F500 -B380 -FF00 -9100 -B100 -ENDCHAR -STARTCHAR 659C -ENCODING 26012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6100 -6900 -9500 -F100 -2500 -F100 -B380 -BF00 -B100 -4100 -ENDCHAR -STARTCHAR 659F -ENCODING 26015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -FD00 -7300 -9500 -7500 -9180 -FB00 -D500 -F900 -8100 -ENDCHAR -STARTCHAR 65A1 -ENCODING 26017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -F600 -4900 -ED80 -E500 -9500 -E680 -F900 -4100 -4100 -ENDCHAR -STARTCHAR 65A4 -ENCODING 26020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -06 -78 -40 -7F -44 -84 -84 -84 -84 -ENDCHAR -STARTCHAR 65A5 -ENCODING 26021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -06 -7C -40 -7F -44 -54 -4E -45 -84 -84 -ENDCHAR -STARTCHAR 65A7 -ENCODING 26023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2600 -E500 -1800 -E780 -7E00 -4000 -7F00 -8800 -8800 -ENDCHAR -STARTCHAR 65AB -ENCODING 26027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0300 -FC00 -4800 -6F80 -AA00 -AA00 -6A00 -9200 -1200 -ENDCHAR -STARTCHAR 65AC -ENCODING 26028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -F600 -4800 -F800 -F780 -D900 -F900 -F900 -4900 -5100 -ENDCHAR -STARTCHAR 65AF -ENCODING 26031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -F600 -9400 -F400 -9780 -F500 -F500 -0900 -9900 -8900 -ENDCHAR -STARTCHAR 65B0 -ENCODING 26032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -F600 -A800 -F800 -4780 -F900 -6900 -A900 -D900 -5100 -ENDCHAR -STARTCHAR 65B7 -ENCODING 26039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D100 -EE00 -DC00 -E780 -FD00 -F500 -FD00 -FD00 -8500 -ENDCHAR -STARTCHAR 65B9 -ENCODING 26041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF80 -2000 -3E00 -2100 -2100 -4200 -C200 -8E00 -ENDCHAR -STARTCHAR 65BC -ENCODING 26044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -4600 -F700 -4900 -7680 -6200 -A000 -A400 -A600 -E100 -ENDCHAR -STARTCHAR 65BD -ENCODING 26045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -EF80 -5C00 -6F00 -7D00 -AD00 -AD00 -A880 -EF00 -ENDCHAR -STARTCHAR 65C1 -ENCODING 26049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -24 -FF -89 -FF -20 -3E -62 -86 -ENDCHAR -STARTCHAR 65C5 -ENCODING 26053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2400 -2780 -7800 -2980 -3700 -3580 -5580 -5500 -5580 -BE40 -ENDCHAR -STARTCHAR 65CB -ENCODING 26059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F80 -F000 -9F00 -6500 -AD00 -AB00 -AC00 -B400 -F380 -ENDCHAR -STARTCHAR 65CC -ENCODING 26060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F80 -F000 -5A00 -6F00 -AA00 -AF00 -A200 -A200 -FF80 -ENDCHAR -STARTCHAR 65CF -ENCODING 26063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -F400 -5F00 -6A00 -6400 -AF80 -A600 -A900 -F080 -ENDCHAR -STARTCHAR 65D2 -ENCODING 26066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F80 -F400 -8F80 -6900 -BF80 -AD00 -AD00 -B580 -F580 -ENDCHAR -STARTCHAR 65D7 -ENCODING 26071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F80 -F900 -9F00 -6F00 -A900 -AF00 -BF80 -AB00 -F080 -ENDCHAR -STARTCHAR 65E0 -ENCODING 26080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -10 -10 -FF -18 -18 -28 -49 -8F -ENDCHAR -STARTCHAR 65E3 -ENCODING 26083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -EF00 -AA00 -EA00 -EF80 -0200 -A600 -C600 -9A80 -F300 -ENDCHAR -STARTCHAR 65E5 -ENCODING 26085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -FC -84 -84 -84 -FC -84 -84 -FC -84 -ENDCHAR -STARTCHAR 65E6 -ENCODING 26086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -4200 -7E00 -4200 -4200 -7E00 -0000 -FF80 -ENDCHAR -STARTCHAR 65E8 -ENCODING 26088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -1 -BITMAP -8C -F0 -82 -FE -00 -FC -84 -FC -FC -84 -ENDCHAR -STARTCHAR 65E9 -ENCODING 26089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4100 -7E00 -4100 -7E00 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 65EC -ENCODING 26092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -40 -7F -FD -C5 -7D -45 -7D -45 -06 -ENDCHAR -STARTCHAR 65ED -ENCODING 26093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -4700 -F900 -5900 -5700 -5900 -5900 -9700 -9080 -9F00 -ENDCHAR -STARTCHAR 65F1 -ENCODING 26097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -4200 -7E00 -FF00 -0800 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 65F4 -ENCODING 26100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -A400 -A400 -E400 -BF80 -A400 -E400 -8400 -0C00 -ENDCHAR -STARTCHAR 65FA -ENCODING 26106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -A400 -A400 -E400 -BF00 -A400 -E400 -A400 -9F80 -ENDCHAR -STARTCHAR 65FB -ENCODING 26107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -0000 -FF80 -2200 -1400 -3C00 -C300 -ENDCHAR -STARTCHAR 65FC -ENCODING 26108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -BF80 -A900 -E900 -AA00 -A600 -E600 -9B00 -3080 -ENDCHAR -STARTCHAR 65FD -ENCODING 26109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E700 -BC00 -B500 -F500 -B500 -BF00 -F400 -A480 -0780 -ENDCHAR -STARTCHAR 65FF -ENCODING 26111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -E800 -BF00 -B400 -E400 -BF80 -A400 -E400 -A400 -0400 -ENDCHAR -STARTCHAR 6606 -ENCODING 26118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4100 -7F00 -7F00 -4800 -7900 -4600 -7880 -C700 -ENDCHAR -STARTCHAR 6607 -ENCODING 26119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -1000 -7400 -2400 -FF80 -2400 -C400 -ENDCHAR -STARTCHAR 6609 -ENCODING 26121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -BF80 -A800 -EF00 -A900 -A900 -F100 -B100 -2300 -ENDCHAR -STARTCHAR 660A -ENCODING 26122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -0000 -FF00 -0800 -FF00 -3400 -C380 -ENDCHAR -STARTCHAR 660C -ENCODING 26124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -42 -7E -7E -FF -81 -FF -FF -81 -ENDCHAR -STARTCHAR 660E -ENCODING 26126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EF -A9 -AF -E9 -A9 -AF -E9 -11 -13 -ENDCHAR -STARTCHAR 660F -ENCODING 26127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -7800 -7F00 -4400 -7480 -8300 -7E00 -7E00 -7E00 -4100 -ENDCHAR -STARTCHAR 6610 -ENCODING 26128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -AA00 -B100 -F080 -BF00 -A900 -E900 -9900 -2600 -ENDCHAR -STARTCHAR 6611 -ENCODING 26129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0400 -EA00 -A900 -FE80 -A000 -BF00 -E100 -A200 -0400 -ENDCHAR -STARTCHAR 6613 -ENCODING 26131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -42 -7E -20 -7F -B5 -49 -13 -ENDCHAR -STARTCHAR 6614 -ENCODING 26132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -2400 -FF80 -0000 -7E00 -4200 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 6615 -ENCODING 26133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0300 -EC00 -B000 -AF80 -F200 -B200 -F200 -B200 -1200 -2200 -ENDCHAR -STARTCHAR 661E -ENCODING 26142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -A400 -BF00 -F500 -B700 -B900 -F900 -B100 -1300 -ENDCHAR -STARTCHAR 661F -ENCODING 26143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -7E -00 -48 -7F -FE -08 -FF -ENDCHAR -STARTCHAR 6620 -ENCODING 26144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -BF00 -B500 -F500 -BF80 -A400 -EA00 -B900 -3080 -ENDCHAR -STARTCHAR 6625 -ENCODING 26149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF00 -7F00 -1400 -FF80 -2200 -FF00 -FE80 -4200 -7E00 -ENDCHAR -STARTCHAR 6627 -ENCODING 26151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -C400 -BF00 -A400 -DF80 -A400 -AE00 -D500 -A480 -0400 -ENDCHAR -STARTCHAR 6628 -ENCODING 26152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -E800 -AF80 -B400 -E700 -A400 -E700 -A400 -0400 -ENDCHAR -STARTCHAR 662D -ENCODING 26157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -A5 -A9 -F3 -A0 -AF -F1 -AF -11 -ENDCHAR -STARTCHAR 662F -ENCODING 26159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -0000 -FF80 -4800 -4F00 -B800 -9F80 -ENDCHAR -STARTCHAR 6630 -ENCODING 26160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -7E00 -7E00 -0000 -FF00 -4F00 -4800 -FF80 -ENDCHAR -STARTCHAR 6631 -ENCODING 26161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -7E00 -7E00 -0800 -FF00 -2200 -2400 -FF80 -ENDCHAR -STARTCHAR 6634 -ENCODING 26164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -7E -30 -F7 -99 -E9 -2B -C8 -ENDCHAR -STARTCHAR 6636 -ENCODING 26166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -E500 -2D00 -EF00 -5500 -7700 -A900 -A600 -6180 -ENDCHAR -STARTCHAR 663A -ENCODING 26170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -0000 -FF80 -7F00 -9900 -A700 -8300 -ENDCHAR -STARTCHAR 663B -ENCODING 26171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -7E -00 -F7 -49 -59 -EB -08 -ENDCHAR -STARTCHAR 6641 -ENCODING 26177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -0000 -9900 -5A00 -EF00 -2880 -CF00 -ENDCHAR -STARTCHAR 6642 -ENCODING 26178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -A400 -BF80 -E100 -BF80 -A900 -E900 -A900 -0600 -ENDCHAR -STARTCHAR 6643 -ENCODING 26179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -4100 -7E00 -2C00 -FF80 -2400 -2480 -C700 -ENDCHAR -STARTCHAR 6644 -ENCODING 26180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -D500 -B500 -A500 -DF80 -AA00 -CA00 -AA00 -1280 -2300 -ENDCHAR -STARTCHAR 6649 -ENCODING 26185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4500 -FF00 -0000 -FF80 -7E00 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR 664B -ENCODING 26187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5500 -5600 -FF80 -0000 -7E00 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 664F -ENCODING 26191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -FF00 -9100 -FF80 -2200 -3C00 -E300 -ENDCHAR -STARTCHAR 6659 -ENCODING 26201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -C900 -BF00 -AA80 -DB00 -AF00 -BA00 -DA00 -8E00 -3180 -ENDCHAR -STARTCHAR 665B -ENCODING 26203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -B100 -BF00 -FF00 -B100 -FF00 -AA00 -1A80 -2380 -ENDCHAR -STARTCHAR 665D -ENCODING 26205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -7E -FF -7E -08 -FF -7E -7E -7E -FF -ENDCHAR -STARTCHAR 665E -ENCODING 26206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1900 -C600 -B900 -BF80 -CC00 -BF00 -B500 -D500 -9700 -0400 -ENDCHAR -STARTCHAR 665F -ENCODING 26207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -0A00 -7F00 -7600 -9400 -BA80 -9100 -ENDCHAR -STARTCHAR 6664 -ENCODING 26212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -A400 -BF00 -FF80 -A000 -AF00 -F100 -B100 -0F00 -ENDCHAR -STARTCHAR 6665 -ENCODING 26213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF80 -D080 -CF00 -C000 -DF80 -CA00 -CA00 -1280 -2300 -ENDCHAR -STARTCHAR 6666 -ENCODING 26214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -DF80 -B000 -AF00 -D500 -BF80 -B500 -DF00 -9100 -0600 -ENDCHAR -STARTCHAR 6667 -ENCODING 26215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -D400 -BF00 -B400 -DF80 -A400 -BF00 -D100 -3F00 -1100 -ENDCHAR -STARTCHAR 6668 -ENCODING 26216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -7F00 -7F00 -FF00 -8000 -BE00 -FF80 -AE00 -F380 -ENDCHAR -STARTCHAR 6669 -ENCODING 26217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EE00 -B200 -BF00 -F480 -BF00 -A600 -EA00 -9A80 -3380 -ENDCHAR -STARTCHAR 666B -ENCODING 26219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -C700 -BF00 -B100 -DF00 -B100 -BF00 -DF80 -8400 -0400 -ENDCHAR -STARTCHAR 666E -ENCODING 26222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -5600 -5600 -FF80 -7E00 -4200 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 666F -ENCODING 26223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -FF80 -7E00 -4200 -7E00 -6A00 -B980 -ENDCHAR -STARTCHAR 6673 -ENCODING 26227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -F800 -6F80 -DA00 -D200 -0000 -7E00 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 6674 -ENCODING 26228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -BF00 -BF80 -C000 -BF00 -B500 -DF00 -9100 -1300 -ENDCHAR -STARTCHAR 6676 -ENCODING 26230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -42 -7E -7E -00 -F7 -F7 -F7 -99 -ENDCHAR -STARTCHAR 6677 -ENCODING 26231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -7400 -D700 -7F80 -FE00 -4100 -7E00 -ENDCHAR -STARTCHAR 6678 -ENCODING 26232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -0400 -F700 -A900 -B600 -B600 -C980 -ENDCHAR -STARTCHAR 667A -ENCODING 26234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -F7 -F9 -65 -97 -00 -7E -7E -7E -42 -ENDCHAR -STARTCHAR 6684 -ENCODING 26244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -E080 -CF00 -DF00 -D100 -DF00 -DF00 -C000 -3F80 -ENDCHAR -STARTCHAR 6687 -ENCODING 26247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DB00 -D500 -D700 -D800 -DF00 -D300 -DB00 -D300 -1480 -ENDCHAR -STARTCHAR 6688 -ENCODING 26248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -3C -FF -08 -7F -7F -3E -7F -ENDCHAR -STARTCHAR 6689 -ENCODING 26249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF80 -E480 -DF00 -DF00 -DF00 -D500 -DF80 -C400 -0400 -ENDCHAR -STARTCHAR 668E -ENCODING 26254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -DF80 -AE00 -BF00 -D500 -B500 -BF80 -C400 -AB00 -3080 -ENDCHAR -STARTCHAR 6690 -ENCODING 26256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -BF80 -A000 -DF00 -BF00 -BF00 -CA00 -9F80 -0200 -ENDCHAR -STARTCHAR 6691 -ENCODING 26257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4100 -7F00 -7E00 -FF80 -7F00 -A100 -3F00 -3F00 -ENDCHAR -STARTCHAR 6696 -ENCODING 26262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0100 -DF00 -D480 -DF00 -C800 -DF80 -CF00 -D500 -D600 -2980 -ENDCHAR -STARTCHAR 6697 -ENCODING 26263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -A900 -AA00 -FF80 -AF00 -B100 -EF00 -0F00 -1100 -ENDCHAR -STARTCHAR 6698 -ENCODING 26264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -BF00 -BF00 -C000 -BF80 -AF00 -DB00 -B500 -0B00 -ENDCHAR -STARTCHAR 669D -ENCODING 26269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF80 -DF80 -D100 -CF00 -CF00 -DF80 -C000 -CB00 -1080 -ENDCHAR -STARTCHAR 66A0 -ENCODING 26272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -FF80 -0000 -7E00 -3C00 -FF00 -BD00 -8300 -ENDCHAR -STARTCHAR 66A2 -ENCODING 26274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -EF00 -EF00 -FF80 -E800 -FF00 -DF00 -5500 -4B00 -ENDCHAR -STARTCHAR 66AB -ENCODING 26283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2300 -F400 -B780 -F500 -F900 -2900 -7F00 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR 66AE -ENCODING 26286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -2400 -7E00 -7E00 -7E00 -FF80 -7E00 -C380 -7E00 -4200 -ENDCHAR -STARTCHAR 66B2 -ENCODING 26290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -BF80 -A000 -DF00 -BF00 -B100 -DF80 -8400 -0400 -ENDCHAR -STARTCHAR 66B3 -ENCODING 26291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1100 -FB80 -DB00 -CB80 -F100 -C000 -DF00 -BF80 -0100 -1F00 -ENDCHAR -STARTCHAR 66B4 -ENCODING 26292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -7F00 -2400 -FF00 -ED80 -3E00 -D100 -ENDCHAR -STARTCHAR 66B9 -ENCODING 26297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5F00 -9F00 -5400 -3F00 -FC00 -5600 -5F00 -BF80 -ENDCHAR -STARTCHAR 66BB -ENCODING 26299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -DF00 -DF00 -FF80 -DF00 -D100 -DF00 -9500 -2C80 -ENDCHAR -STARTCHAR 66BE -ENCODING 26302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1200 -FE00 -DB80 -DB00 -C300 -FF00 -CB00 -FD00 -9300 -1480 -ENDCHAR -STARTCHAR 66C4 -ENCODING 26308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -DF80 -A000 -BF00 -DF80 -B500 -BF00 -DF80 -A400 -0400 -ENDCHAR -STARTCHAR 66C6 -ENCODING 26310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -F700 -FF00 -AB00 -D680 -BF00 -A100 -BF00 -A100 -ENDCHAR -STARTCHAR 66C7 -ENCODING 26311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -7F00 -3E00 -FF00 -FF00 -6E00 -7E00 -FF80 -FF00 -ENDCHAR -STARTCHAR 66C9 -ENCODING 26313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -DF80 -D100 -DB00 -B380 -BF80 -CA00 -9A80 -3380 -ENDCHAR -STARTCHAR 66D6 -ENCODING 26326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1F00 -D500 -DF80 -ED80 -D980 -DE00 -DF00 -DA00 -C400 -3B80 -ENDCHAR -STARTCHAR 66D9 -ENCODING 26329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -DF00 -C400 -DF00 -DF80 -CF00 -F100 -CF00 -0F00 -ENDCHAR -STARTCHAR 66DC -ENCODING 26332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DB00 -BA80 -B500 -CA00 -BF00 -BF00 -D300 -BC00 -1F80 -ENDCHAR -STARTCHAR 66DD -ENCODING 26333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -DF00 -DF00 -DF00 -CA00 -BD80 -F680 -8E00 -3D00 -ENDCHAR -STARTCHAR 66E0 -ENCODING 26336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF80 -DF80 -EE00 -DF80 -EF00 -ED00 -EF00 -AF00 -3080 -ENDCHAR -STARTCHAR 66E6 -ENCODING 26342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -FF00 -DF00 -FF80 -DB00 -FF80 -FF00 -D200 -CA80 -1D00 -ENDCHAR -STARTCHAR 66F0 -ENCODING 26352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FE -02 -02 -02 -FE -02 -02 -FE -02 -ENDCHAR -STARTCHAR 66F2 -ENCODING 26354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -24 -FF -A5 -A5 -FF -A5 -A5 -FF -81 -ENDCHAR -STARTCHAR 66F3 -ENCODING 26355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -08 -7F -7F -49 -7F -0A -0C -35 -C3 -ENDCHAR -STARTCHAR 66F4 -ENCODING 26356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -7F00 -7F00 -4900 -7F00 -5000 -3C00 -C380 -ENDCHAR -STARTCHAR 66F7 -ENCODING 26359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -42 -7E -7F -D9 -67 -7F -43 -ENDCHAR -STARTCHAR 66F8 -ENCODING 26360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F00 -FF80 -7F00 -7F00 -FF80 -7E00 -4100 -7E00 -7E00 -ENDCHAR -STARTCHAR 66F9 -ENCODING 26361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -FF00 -FF00 -0000 -7E00 -7E00 -7E00 -4100 -ENDCHAR -STARTCHAR 66FA -ENCODING 26362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -FF00 -FF00 -0000 -7E00 -4200 -7E00 -7E00 -ENDCHAR -STARTCHAR 66FC -ENCODING 26364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -7E -FF -FF -00 -FE -18 -E7 -ENDCHAR -STARTCHAR 66FE -ENCODING 26366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1C00 -4300 -FF80 -6D00 -7E00 -7E00 -4200 -7E00 -7E00 -ENDCHAR -STARTCHAR 66FF -ENCODING 26367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -F700 -FF80 -6600 -9900 -FE80 -4100 -7E00 -7E00 -4100 -ENDCHAR -STARTCHAR 6700 -ENCODING 26368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -FF80 -9000 -FF00 -F500 -F200 -1D80 -ENDCHAR -STARTCHAR 6703 -ENCODING 26371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -3C00 -4200 -FF80 -AD00 -7F00 -7E00 -4200 -7E00 -7E00 -ENDCHAR -STARTCHAR 6708 -ENCODING 26376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 1 -1 -BITMAP -7E -42 -7E -42 -42 -7E -42 -42 -86 -ENDCHAR -STARTCHAR 6709 -ENCODING 26377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -FF -20 -3E -42 -FE -A2 -3E -22 -26 -ENDCHAR -STARTCHAR 670B -ENCODING 26379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -95 -F7 -95 -95 -F7 -99 -99 -BB -ENDCHAR -STARTCHAR 670D -ENCODING 26381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -A900 -EB00 -A800 -AF00 -ED00 -AA00 -AB00 -EC80 -ENDCHAR -STARTCHAR 6714 -ENCODING 26388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -97 -55 -F5 -D7 -D5 -F7 -45 -49 -8B -ENDCHAR -STARTCHAR 6715 -ENCODING 26389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -B100 -FF80 -A400 -A400 -FF00 -A600 -A900 -F080 -ENDCHAR -STARTCHAR 6717 -ENCODING 26391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -27 -F5 -95 -F7 -F5 -B7 -A5 -F9 -DB -ENDCHAR -STARTCHAR 671B -ENCODING 26395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2700 -F900 -8700 -8F00 -FB00 -0300 -FC00 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 671D -ENCODING 26397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -27 -F5 -25 -F7 -F5 -95 -F7 -F5 -29 -2B -ENDCHAR -STARTCHAR 671E -ENCODING 26398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FF00 -3E00 -3E00 -FF80 -7E00 -A380 -3E00 -7E00 -4600 -ENDCHAR -STARTCHAR 671F -ENCODING 26399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -97 -FD -95 -77 -95 -77 -F5 -45 -99 -8B -ENDCHAR -STARTCHAR 6726 -ENCODING 26406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -DF80 -AA00 -BF80 -DE80 -A000 -BF80 -D700 -BF00 -BD00 -4C80 -ENDCHAR -STARTCHAR 6727 -ENCODING 26407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D200 -BB80 -DB00 -FC80 -DB00 -DB00 -DB00 -DB00 -DA80 -DB00 -ENDCHAR -STARTCHAR 6728 -ENCODING 26408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF00 -1800 -2C00 -2A00 -C900 -8880 -0800 -0800 -ENDCHAR -STARTCHAR 672A -ENCODING 26410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -7F -08 -FF -18 -2C -4B -89 -08 -ENDCHAR -STARTCHAR 672B -ENCODING 26411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF80 -0800 -FF00 -1800 -2C00 -4B00 -8880 -0800 -ENDCHAR -STARTCHAR 672C -ENCODING 26412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF00 -1800 -2C00 -2A00 -C900 -BE80 -0800 -0800 -ENDCHAR -STARTCHAR 672D -ENCODING 26413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -F400 -6400 -6400 -D400 -D400 -4400 -4480 -4700 -ENDCHAR -STARTCHAR 672E -ENCODING 26414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -0A00 -FF00 -2A00 -2A00 -4A00 -4A00 -4A80 -CB00 -8800 -ENDCHAR -STARTCHAR 6731 -ENCODING 26417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -48 -7E -48 -FF -18 -2C -4B -89 -08 -ENDCHAR -STARTCHAR 6734 -ENCODING 26420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -2400 -FC00 -2400 -6600 -7500 -AC80 -A400 -2400 -2400 -ENDCHAR -STARTCHAR 6736 -ENCODING 26422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7C00 -2700 -2900 -4B00 -8800 -FF00 -1C00 -6A00 -8980 -ENDCHAR -STARTCHAR 673A -ENCODING 26426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -4E00 -EA00 -4A00 -6A00 -EA00 -5200 -5280 -5280 -5380 -ENDCHAR -STARTCHAR 673D -ENCODING 26429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -F400 -4800 -6F00 -E900 -D100 -C100 -4100 -4700 -ENDCHAR -STARTCHAR 6746 -ENCODING 26438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4400 -E400 -4400 -7F80 -E400 -6400 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 6749 -ENCODING 26441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -4600 -F800 -6100 -A600 -D800 -C080 -4100 -4600 -5800 -ENDCHAR -STARTCHAR 674E -ENCODING 26446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -1400 -6A00 -BF80 -0400 -0800 -FF00 -0800 -3800 -ENDCHAR -STARTCHAR 674F -ENCODING 26447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -1800 -2C00 -4B00 -8080 -7E00 -4100 -7E00 -4100 -ENDCHAR -STARTCHAR 6750 -ENCODING 26448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -4100 -FF80 -4100 -6300 -E500 -D900 -5100 -4100 -4600 -ENDCHAR -STARTCHAR 6751 -ENCODING 26449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -4100 -EF80 -4100 -6900 -D900 -D500 -C100 -4100 -4600 -ENDCHAR -STARTCHAR 6753 -ENCODING 26451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -48 -EF -51 -71 -EF -D1 -41 -41 -47 -ENDCHAR -STARTCHAR 6756 -ENCODING 26454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -EF80 -4200 -6A00 -EA00 -D400 -4600 -4B00 -5180 -ENDCHAR -STARTCHAR 675C -ENCODING 26460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -E200 -4F00 -6200 -E200 -C200 -4200 -4200 -5F80 -ENDCHAR -STARTCHAR 675E -ENCODING 26462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -E100 -4100 -6F00 -F000 -D000 -D000 -5080 -4F00 -ENDCHAR -STARTCHAR 675F -ENCODING 26463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0800 -7E00 -4900 -7E00 -1400 -6A00 -8980 -0800 -ENDCHAR -STARTCHAR 676D -ENCODING 26477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF00 -4000 -CE00 -F200 -7200 -5280 -5280 -6300 -ENDCHAR -STARTCHAR 676F -ENCODING 26479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -E200 -4600 -6D00 -D480 -D400 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 6770 -ENCODING 26480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF00 -1400 -6A00 -8980 -0800 -A900 -9500 -9480 -ENDCHAR -STARTCHAR 6771 -ENCODING 26481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -0800 -7E00 -7E00 -4900 -7E00 -1C00 -6A00 -8980 -ENDCHAR -STARTCHAR 6773 -ENCODING 26483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -18 -6E -C9 -7E -42 -7E -7E -42 -ENDCHAR -STARTCHAR 6775 -ENCODING 26485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -EF00 -5200 -7200 -DF80 -C200 -4200 -4200 -4200 -ENDCHAR -STARTCHAR 6777 -ENCODING 26487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -F500 -5500 -7F00 -F000 -5000 -5000 -5080 -4F00 -ENDCHAR -STARTCHAR 677B -ENCODING 26491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4500 -E900 -4900 -DF80 -E900 -4900 -4A00 -4A00 -7F80 -ENDCHAR -STARTCHAR 677E -ENCODING 26494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -4900 -E900 -5100 -7480 -E400 -C900 -4900 -4B00 -5C80 -ENDCHAR -STARTCHAR 677F -ENCODING 26495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5000 -F000 -5F00 -7500 -F500 -5200 -5200 -5D00 -6880 -ENDCHAR -STARTCHAR 6787 -ENCODING 26503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -5200 -F280 -5B00 -F200 -F200 -5200 -5280 -5A80 -7300 -ENDCHAR -STARTCHAR 6789 -ENCODING 26505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -E400 -4400 -7F00 -C400 -C400 -4400 -4400 -5F80 -ENDCHAR -STARTCHAR 678B -ENCODING 26507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -4800 -4700 -E900 -E900 -C900 -5100 -6300 -ENDCHAR -STARTCHAR 678F -ENCODING 26511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -E900 -5F80 -E900 -E900 -DF80 -4900 -4900 -4B00 -ENDCHAR -STARTCHAR 6790 -ENCODING 26512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -4E00 -F800 -4800 -6F80 -DA00 -CA00 -CA00 -5200 -5200 -ENDCHAR -STARTCHAR 6793 -ENCODING 26515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -4900 -E500 -4100 -6900 -E500 -C780 -DF00 -4100 -4100 -ENDCHAR -STARTCHAR 6795 -ENCODING 26517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF00 -5480 -6400 -E400 -D400 -CA00 -5A80 -5300 -ENDCHAR -STARTCHAR 6797 -ENCODING 26519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -FF00 -4600 -6600 -DB00 -DB00 -CA80 -4200 -4200 -ENDCHAR -STARTCHAR 679A -ENCODING 26522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -EF80 -4900 -5A00 -FE00 -E600 -4E00 -5900 -5080 -ENDCHAR -STARTCHAR 679C -ENCODING 26524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4900 -7F00 -7F00 -0800 -FF80 -1400 -6A00 -8980 -ENDCHAR -STARTCHAR 679D -ENCODING 26525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -4400 -7F00 -E900 -C600 -4400 -4F00 -5080 -ENDCHAR -STARTCHAR 67AF -ENCODING 26543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -4400 -6400 -EF00 -E900 -4900 -4F00 -4900 -ENDCHAR -STARTCHAR 67B0 -ENCODING 26544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4400 -ED00 -4D00 -5480 -E400 -FF80 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 67B3 -ENCODING 26547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -4F00 -E900 -4900 -6900 -EF00 -CA00 -4900 -4900 -5080 -ENDCHAR -STARTCHAR 67B6 -ENCODING 26550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -F700 -5500 -7700 -8800 -FF00 -1400 -6A00 -8980 -0800 -ENDCHAR -STARTCHAR 67B7 -ENCODING 26551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -50 -53 -DB -57 -D7 -F7 -77 -57 -6B -7B -ENDCHAR -STARTCHAR 67B8 -ENCODING 26552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -4F -F1 -51 -DF -EB -EF -4B -41 -43 -ENDCHAR -STARTCHAR 67BE -ENCODING 26558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -5500 -F500 -FF00 -5500 -5500 -5500 -4400 -ENDCHAR -STARTCHAR 67C4 -ENCODING 26564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4400 -E400 -5F00 -D500 -FB00 -5B00 -5100 -5100 -5300 -ENDCHAR -STARTCHAR 67CF -ENCODING 26575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -44 -FF -51 -D1 -FF -51 -51 -5F -51 -ENDCHAR -STARTCHAR 67D0 -ENCODING 26576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FF80 -3E00 -2200 -3E00 -0800 -FF80 -1400 -6A00 -8980 -ENDCHAR -STARTCHAR 67D1 -ENCODING 26577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4900 -FF80 -4900 -6900 -EF00 -C900 -4900 -4F00 -4900 -ENDCHAR -STARTCHAR 67D2 -ENCODING 26578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -0F00 -F800 -6880 -CF00 -0800 -FF00 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 67D3 -ENCODING 26579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5E00 -CA00 -7A80 -F300 -0800 -FF00 -1600 -6980 -8800 -ENDCHAR -STARTCHAR 67D4 -ENCODING 26580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -1C00 -FF00 -2900 -DA00 -0800 -FF80 -2E00 -C980 -ENDCHAR -STARTCHAR 67DA -ENCODING 26586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -44 -FF -55 -75 -DF -D5 -55 -5F -51 -ENDCHAR -STARTCHAR 67DD -ENCODING 26589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -4C00 -F000 -4F80 -7200 -F600 -D300 -5280 -5200 -6200 -ENDCHAR -STARTCHAR 67E9 -ENCODING 26601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5400 -F400 -5700 -5500 -FA00 -F200 -5500 -5F80 -5000 -ENDCHAR -STARTCHAR 67EC -ENCODING 26604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -08 -7E -6E -7E -1C -6A -89 -08 -ENDCHAR -STARTCHAR 67EF -ENCODING 26607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4100 -ED00 -4D00 -6D00 -ED00 -6D00 -4900 -4100 -4300 -ENDCHAR -STARTCHAR 67F0 -ENCODING 26608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -1800 -6E00 -8180 -3E00 -FF00 -2A00 -4B00 -9100 -ENDCHAR -STARTCHAR 67F1 -ENCODING 26609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4200 -FF00 -4400 -4400 -EF00 -E400 -4400 -4400 -5F80 -ENDCHAR -STARTCHAR 67F3 -ENCODING 26611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -5B -FB -5B -DB -FB -5B -7B -4A -52 -ENDCHAR -STARTCHAR 67F4 -ENCODING 26612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -B500 -A600 -B480 -C700 -0800 -FF00 -6E00 -8980 -0800 -ENDCHAR -STARTCHAR 67F5 -ENCODING 26613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5B00 -FB00 -5B00 -DF80 -FB00 -7B00 -5B00 -5B00 -5300 -ENDCHAR -STARTCHAR 67F6 -ENCODING 26614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -5F -FB -5B -DB -FB -73 -51 -5F -51 -ENDCHAR -STARTCHAR 67FB -ENCODING 26619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -1800 -6E00 -8900 -7E00 -7E00 -4200 -7E00 -FF80 -ENDCHAR -STARTCHAR 67FE -ENCODING 26622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -E400 -4C00 -CB00 -EC00 -6C00 -4C00 -4C00 -7F80 -ENDCHAR -STARTCHAR 6812 -ENCODING 26642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -48 -FF -5D -75 -FD -D5 -DD -41 -47 -ENDCHAR -STARTCHAR 6813 -ENCODING 26643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -4600 -EA00 -5100 -DF80 -E400 -6F00 -4400 -4400 -5F80 -ENDCHAR -STARTCHAR 6816 -ENCODING 26646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4A00 -EA00 -5F00 -DA80 -FB00 -7B00 -5880 -5F00 -5080 -ENDCHAR -STARTCHAR 6817 -ENCODING 26647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -24 -FF -FF -08 -FF -6E -89 -08 -ENDCHAR -STARTCHAR 6821 -ENCODING 26657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -EA00 -5100 -D080 -EA00 -6600 -4600 -5B00 -5080 -ENDCHAR -STARTCHAR 6822 -ENCODING 26658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -E400 -5F00 -D100 -FF00 -5100 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 682A -ENCODING 26666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4C00 -FF00 -5400 -DF80 -E600 -4E00 -5500 -5480 -4400 -ENDCHAR -STARTCHAR 682F -ENCODING 26671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4800 -FF80 -4F00 -E900 -FF00 -5900 -4F00 -4900 -4B00 -ENDCHAR -STARTCHAR 6838 -ENCODING 26680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -4400 -5A00 -EB00 -6E00 -5600 -4D00 -5080 -ENDCHAR -STARTCHAR 6839 -ENCODING 26681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5100 -EF00 -5100 -4F00 -F500 -F200 -5200 -4D00 -5880 -ENDCHAR -STARTCHAR 683C -ENCODING 26684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -F100 -4A00 -E600 -D980 -FF00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 683D -ENCODING 26685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -F600 -2500 -FF80 -2400 -FD00 -6500 -B600 -AE80 -2900 -ENDCHAR -STARTCHAR 6840 -ENCODING 26688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -7F00 -9A00 -FF80 -C200 -0800 -FF00 -1400 -6A00 -8900 -ENDCHAR -STARTCHAR 6841 -ENCODING 26689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4B80 -F000 -5800 -EF80 -F100 -5100 -4900 -4900 -4B00 -ENDCHAR -STARTCHAR 6842 -ENCODING 26690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -E400 -4400 -DF00 -E400 -7F00 -4400 -4400 -5F80 -ENDCHAR -STARTCHAR 6843 -ENCODING 26691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5A80 -FB00 -5B00 -CA00 -FB00 -6A80 -4A80 -5280 -6300 -ENDCHAR -STARTCHAR 6848 -ENCODING 26696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E00 -2400 -1E00 -E900 -0F00 -7C00 -6B80 -8800 -ENDCHAR -STARTCHAR 684E -ENCODING 26702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -E900 -4F00 -6080 -E400 -DF00 -4400 -4400 -5F80 -ENDCHAR -STARTCHAR 6850 -ENCODING 26704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -51 -FF -51 -DF -FB -5F -5B -51 -53 -ENDCHAR -STARTCHAR 6851 -ENCODING 26705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7C -E7 -00 -EF -9D -08 -FF -2E -C9 -ENDCHAR -STARTCHAR 6853 -ENCODING 26707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -E000 -5F00 -7100 -FF00 -DF00 -5100 -4000 -5F80 -ENDCHAR -STARTCHAR 6854 -ENCODING 26708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -4400 -5F00 -E000 -4F00 -5100 -4F00 -5100 -ENDCHAR -STARTCHAR 686D -ENCODING 26733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5000 -FF00 -5000 -7F80 -FA00 -DB00 -5A00 -6B00 -6C80 -ENDCHAR -STARTCHAR 6876 -ENCODING 26742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -42 -E4 -5F -F5 -FF -55 -5F -55 -55 -ENDCHAR -STARTCHAR 687F -ENCODING 26751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5100 -EF00 -4F00 -4000 -FF00 -C400 -5F80 -4400 -4400 -ENDCHAR -STARTCHAR 6881 -ENCODING 26753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5E00 -1B00 -9A80 -5280 -E600 -8800 -FF80 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 6885 -ENCODING 26757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F80 -F000 -6F00 -D500 -DF80 -5500 -5F00 -5100 -4600 -ENDCHAR -STARTCHAR 688F -ENCODING 26767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4C00 -EF00 -5400 -7F80 -E000 -4F00 -5100 -4F00 -5100 -ENDCHAR -STARTCHAR 6893 -ENCODING 26771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -4900 -7F80 -E400 -DF80 -4400 -4400 -4400 -ENDCHAR -STARTCHAR 6894 -ENCODING 26772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -FF80 -5000 -FF00 -FB00 -5F00 -5800 -5880 -6F00 -ENDCHAR -STARTCHAR 6897 -ENCODING 26775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4400 -FF00 -5500 -FF00 -F500 -5F00 -5400 -4C00 -7380 -ENDCHAR -STARTCHAR 689D -ENCODING 26781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -6A00 -B600 -B980 -A400 -BF00 -AF00 -9480 -8400 -ENDCHAR -STARTCHAR 689F -ENCODING 26783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4200 -7E00 -7F80 -7F00 -FE80 -1B00 -6E00 -8900 -ENDCHAR -STARTCHAR 68A1 -ENCODING 26785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F080 -4F00 -C000 -FF80 -6A00 -4A00 -5A80 -5300 -ENDCHAR -STARTCHAR 68A2 -ENCODING 26786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4E00 -5500 -F500 -5F80 -D100 -FF00 -7100 -5F00 -5100 -5300 -ENDCHAR -STARTCHAR 68A7 -ENCODING 26791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4400 -FF00 -4900 -DF80 -E000 -7F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 68A8 -ENCODING 26792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -15 -E5 -F5 -75 -AB -08 -FF -18 -6E -89 -ENDCHAR -STARTCHAR 68AD -ENCODING 26797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4900 -FE00 -4A80 -CB00 -F800 -7F00 -5600 -4E00 -7180 -ENDCHAR -STARTCHAR 68AF -ENCODING 26799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4A00 -FF00 -4500 -DF00 -F400 -FF00 -4C80 -7700 -4400 -ENDCHAR -STARTCHAR 68B0 -ENCODING 26800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -4300 -FF80 -5600 -D700 -FF00 -7600 -5600 -5580 -4980 -ENDCHAR -STARTCHAR 68B1 -ENCODING 26801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -55 -F5 -5F -F5 -FF -5D -55 -5F -51 -ENDCHAR -STARTCHAR 68B3 -ENCODING 26803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -EA00 -5F00 -C100 -F600 -7600 -5600 -5680 -6580 -ENDCHAR -STARTCHAR 68B5 -ENCODING 26805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -A700 -D680 -4A00 -3C00 -2400 -5400 -4C80 -8300 -ENDCHAR -STARTCHAR 68B6 -ENCODING 26806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -5100 -DE00 -F500 -7F00 -5C00 -6480 -6300 -ENDCHAR -STARTCHAR 68C4 -ENCODING 26820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE00 -4A00 -FF80 -7E00 -FF80 -1C00 -6E00 -8980 -ENDCHAR -STARTCHAR 68C5 -ENCODING 26821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -FF00 -5F00 -DF80 -E500 -5F00 -5E00 -6580 -4400 -ENDCHAR -STARTCHAR 68C9 -ENCODING 26825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -4F -F1 -4F -CF -E4 -FF -55 -55 -54 -ENDCHAR -STARTCHAR 68CB -ENCODING 26827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -5F00 -E900 -4E00 -E900 -EE00 -4900 -5F80 -4A00 -5100 -ENDCHAR -STARTCHAR 68CD -ENCODING 26829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -5F00 -E000 -F280 -5B00 -5200 -5A80 -7300 -ENDCHAR -STARTCHAR 68D2 -ENCODING 26834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -E400 -5F00 -FF80 -F500 -6E80 -5F00 -4400 -4400 -ENDCHAR -STARTCHAR 68D5 -ENCODING 26837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F080 -4F00 -E000 -FF00 -5500 -5500 -5480 -4C00 -ENDCHAR -STARTCHAR 68D7 -ENCODING 26839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -7F -2E -C9 -FF -FF -99 -6E -89 -ENDCHAR -STARTCHAR 68D8 -ENCODING 26840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF80 -4200 -FF00 -DA80 -FB00 -6600 -DB00 -CA80 -4200 -ENDCHAR -STARTCHAR 68DA -ENCODING 26842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5B -5B -DB -5B -DB -DB -5B -6B -6D -6D -ENDCHAR -STARTCHAR 68DF -ENCODING 26847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -E400 -5F00 -DF00 -F500 -FF00 -4600 -5D00 -5480 -ENDCHAR -STARTCHAR 68E0 -ENCODING 26848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -4A00 -FF00 -FE80 -4200 -7E00 -FF80 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 68E7 -ENCODING 26855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4780 -FD00 -4680 -5900 -EA00 -FF80 -4500 -4600 -5900 -ENDCHAR -STARTCHAR 68E8 -ENCODING 26856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -E780 -FD00 -9D00 -F300 -8C80 -FF00 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 68EE -ENCODING 26862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -1800 -6E00 -CB80 -FF00 -6600 -DB00 -CA80 -4200 -ENDCHAR -STARTCHAR 68F2 -ENCODING 26866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -FF00 -4500 -DF80 -FF00 -7F80 -4A00 -4600 -5900 -ENDCHAR -STARTCHAR 68F9 -ENCODING 26873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -E400 -5F00 -DF00 -F100 -7F00 -5F80 -4400 -4400 -ENDCHAR -STARTCHAR 68FA -ENCODING 26874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -F080 -4F00 -D100 -EF00 -7000 -4F00 -4F00 -5100 -ENDCHAR -STARTCHAR 6900 -ENCODING 26880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F080 -5B00 -D500 -DB00 -4B00 -4A00 -5280 -6300 -ENDCHAR -STARTCHAR 6905 -ENCODING 26885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -EA00 -5100 -FF80 -E100 -5D00 -5D00 -5300 -4300 -ENDCHAR -STARTCHAR 690D -ENCODING 26893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -5F80 -E200 -4700 -F700 -F900 -5700 -5700 -5F80 -5000 -ENDCHAR -STARTCHAR 690E -ENCODING 26894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4A00 -EF80 -5200 -6F00 -EA00 -CF00 -4A00 -4F80 -4800 -ENDCHAR -STARTCHAR 6912 -ENCODING 26898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5700 -EA80 -5300 -FF00 -F700 -7500 -7700 -5300 -5480 -ENDCHAR -STARTCHAR 6927 -ENCODING 26919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4E00 -F900 -5F80 -DF00 -F680 -F680 -5F00 -5600 -4200 -ENDCHAR -STARTCHAR 6930 -ENCODING 26928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -5A80 -EB00 -5B00 -DB00 -FA80 -5A80 -5B00 -6A00 -4A00 -ENDCHAR -STARTCHAR 693D -ENCODING 26941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -EE00 -5F80 -CA00 -F700 -CD00 -5D00 -7280 -4C00 -ENDCHAR -STARTCHAR 693F -ENCODING 26943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FF00 -4A00 -FF80 -F100 -6E80 -4E00 -5100 -4E00 -ENDCHAR -STARTCHAR 694A -ENCODING 26954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5100 -EF00 -4F00 -7F80 -E800 -DF00 -5B00 -5500 -4B00 -ENDCHAR -STARTCHAR 6953 -ENCODING 26963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -EF00 -5500 -DF00 -D700 -6F00 -6700 -6780 -7B80 -ENDCHAR -STARTCHAR 6954 -ENCODING 26964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B00 -5A80 -FA80 -5E80 -CD00 -C400 -5F80 -4400 -5B00 -7180 -ENDCHAR -STARTCHAR 6955 -ENCODING 26965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -EF00 -5F80 -5000 -EF00 -EF00 -4900 -4F00 -4B00 -ENDCHAR -STARTCHAR 6957 -ENCODING 26967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -7700 -D300 -5F80 -D700 -9700 -6F00 -7200 -5A00 -6F80 -ENDCHAR -STARTCHAR 6959 -ENCODING 26969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7E00 -4A00 -FF80 -7E00 -D700 -B300 -6E80 -6E00 -4A00 -5200 -ENDCHAR -STARTCHAR 695A -ENCODING 26970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FF00 -6600 -BB00 -2200 -FF00 -4900 -4E00 -B000 -9F80 -ENDCHAR -STARTCHAR 695E -ENCODING 26974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5A80 -FF00 -4000 -E400 -FF80 -4700 -4900 -5900 -5300 -ENDCHAR -STARTCHAR 6960 -ENCODING 26976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -E400 -5F00 -DA80 -EE80 -5E80 -5480 -5480 -5500 -ENDCHAR -STARTCHAR 6961 -ENCODING 26977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5C00 -4A00 -FF00 -6080 -DB00 -DB00 -5500 -5B00 -5700 -5A80 -ENDCHAR -STARTCHAR 6962 -ENCODING 26978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4E00 -5100 -FF00 -4680 -FF00 -F700 -5B00 -5F00 -5F00 -5100 -ENDCHAR -STARTCHAR 6963 -ENCODING 26979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -55 -FF -50 -DF -FF -79 -5F -6F -69 -ENDCHAR -STARTCHAR 6968 -ENCODING 26984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -E400 -4F00 -6F00 -F100 -4F00 -4F00 -4B00 -5080 -ENDCHAR -STARTCHAR 696B -ENCODING 26987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5100 -EF00 -5F80 -D100 -EF00 -7100 -4F00 -7F80 -4100 -ENDCHAR -STARTCHAR 696D -ENCODING 26989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5800 -5A00 -FF80 -2400 -FF00 -7F00 -FF80 -1C00 -6E00 -8980 -ENDCHAR -STARTCHAR 696E -ENCODING 26990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -E600 -5F80 -E500 -FF00 -6900 -4F00 -4F00 -4900 -ENDCHAR -STARTCHAR 696F -ENCODING 26991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -5E00 -FF80 -5400 -DF00 -F900 -5F00 -5F00 -6F00 -6900 -ENDCHAR -STARTCHAR 6975 -ENCODING 26997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F00 -EC00 -4700 -DF00 -EF00 -5D00 -6500 -4A80 -7F80 -ENDCHAR -STARTCHAR 6977 -ENCODING 26999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -5E80 -F380 -5F80 -D400 -FF00 -7100 -5F00 -5100 -5F00 -ENDCHAR -STARTCHAR 6978 -ENCODING 27000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -7100 -ED80 -7E80 -CE80 -DA00 -6B00 -6B00 -4C80 -4C80 -ENDCHAR -STARTCHAR 6979 -ENCODING 27001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5E00 -4A00 -F300 -5F00 -DF00 -EB00 -5F00 -5B00 -5B00 -7F80 -ENDCHAR -STARTCHAR 6995 -ENCODING 27029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FA80 -4900 -F700 -E900 -5F80 -4900 -4F00 -4900 -ENDCHAR -STARTCHAR 699B -ENCODING 27035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FF00 -4A00 -5F80 -F700 -FF80 -4400 -5F00 -5500 -ENDCHAR -STARTCHAR 699C -ENCODING 27036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -EA00 -5F80 -D480 -FF80 -6800 -4F00 -5900 -7300 -ENDCHAR -STARTCHAR 69A5 -ENCODING 27045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -5F00 -F500 -ED00 -5F00 -4A00 -4A80 -7300 -ENDCHAR -STARTCHAR 69A7 -ENCODING 27047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5600 -D600 -5F00 -DF00 -D600 -5F00 -5A00 -5F80 -5000 -ENDCHAR -STARTCHAR 69AE -ENCODING 27054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -DB00 -6600 -9D00 -FF00 -8900 -7E00 -1400 -6A00 -8980 -ENDCHAR -STARTCHAR 69B4 -ENCODING 27060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -5F -DB -5F -F5 -DF -55 -5F -5F -51 -ENDCHAR -STARTCHAR 69BB -ENCODING 27067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -51 -FF -5F -DB -E9 -5F -59 -57 -49 -ENDCHAR -STARTCHAR 69C1 -ENCODING 27073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -EF00 -4F00 -6000 -FF00 -DE80 -5E80 -5880 -5300 -ENDCHAR -STARTCHAR 69C3 -ENCODING 27075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4680 -F500 -D800 -FF00 -D600 -B580 -FF80 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 69CB -ENCODING 27083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -FF00 -5F80 -C400 -FF00 -DF80 -5580 -5F00 -5300 -ENDCHAR -STARTCHAR 69CC -ENCODING 27084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -4F00 -E500 -5700 -E400 -F700 -4D00 -4F00 -5800 -6780 -ENDCHAR -STARTCHAR 69CD -ENCODING 27085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -FF00 -5F80 -D100 -FF00 -DF00 -5F00 -7900 -6F00 -ENDCHAR -STARTCHAR 69D0 -ENCODING 27088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F500 -5F00 -D500 -FF00 -4F00 -5780 -5480 -6700 -ENDCHAR -STARTCHAR 69E8 -ENCODING 27112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B80 -7E80 -DB00 -5B00 -C300 -BE80 -4E80 -7B80 -4A00 -5200 -ENDCHAR -STARTCHAR 69EA -ENCODING 27114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5F00 -ED00 -5D00 -ED00 -9F80 -5A00 -5A00 -6580 -6980 -ENDCHAR -STARTCHAR 69FB -ENCODING 27131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5700 -5500 -FF00 -5500 -FF00 -B500 -5700 -5A00 -6D80 -6980 -ENDCHAR -STARTCHAR 69FD -ENCODING 27133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -FF00 -5B00 -DF00 -E000 -7F00 -5100 -5F00 -5100 -ENDCHAR -STARTCHAR 69FF -ENCODING 27135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -EE00 -4400 -DF00 -FF00 -7F00 -5F00 -4400 -7F80 -ENDCHAR -STARTCHAR 6A02 -ENCODING 27138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -9E00 -D700 -9E00 -FF80 -0800 -7F00 -2E00 -4980 -8800 -ENDCHAR -STARTCHAR 6A0A -ENCODING 27146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -EF80 -5300 -FA80 -DE00 -4A00 -FF00 -1800 -2600 -C100 -ENDCHAR -STARTCHAR 6A11 -ENCODING 27153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -6500 -ED00 -5580 -DA00 -C400 -5F00 -4E00 -7580 -4400 -ENDCHAR -STARTCHAR 6A13 -ENCODING 27155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F500 -5F00 -DF00 -D500 -7F80 -4A00 -4600 -7900 -ENDCHAR -STARTCHAR 6A17 -ENCODING 27159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4400 -FF00 -5E80 -C000 -FF00 -5F80 -4F00 -4100 -4300 -ENDCHAR -STARTCHAR 6A19 -ENCODING 27161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4A00 -FF00 -5F00 -C000 -FF00 -7F80 -4D00 -5500 -6C80 -ENDCHAR -STARTCHAR 6A1E -ENCODING 27166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5000 -F700 -5700 -D000 -FF00 -5F00 -5F00 -5000 -5F80 -ENDCHAR -STARTCHAR 6A1F -ENCODING 27167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FF80 -4000 -FF00 -FF00 -DF00 -5F80 -4400 -4400 -ENDCHAR -STARTCHAR 6A21 -ENCODING 27169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -E000 -5F00 -DF00 -FF00 -6400 -5F80 -4A00 -5180 -ENDCHAR -STARTCHAR 6A23 -ENCODING 27171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -5F00 -FF00 -5F80 -E400 -EE00 -C500 -5F00 -5C80 -6400 -ENDCHAR -STARTCHAR 6A35 -ENCODING 27189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2500 -2780 -7900 -2F80 -6980 -7600 -B7C0 -2000 -2D80 -2B40 -ENDCHAR -STARTCHAR 6A38 -ENCODING 27192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5B00 -FF80 -4A00 -DF00 -FF00 -7F80 -4400 -4B00 -5180 -ENDCHAR -STARTCHAR 6A39 -ENCODING 27193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -7D00 -DF80 -4100 -DF00 -9700 -5F00 -5900 -5D00 -7300 -ENDCHAR -STARTCHAR 6A3A -ENCODING 27194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -FF00 -4D00 -DF80 -ED00 -7F00 -5F80 -4400 -4400 -ENDCHAR -STARTCHAR 6A3D -ENCODING 27197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -5100 -FF80 -5F00 -DB00 -DF00 -7F00 -5F80 -4A00 -4600 -ENDCHAR -STARTCHAR 6A44 -ENCODING 27204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7A00 -5200 -FF80 -5B00 -DF00 -9B00 -5900 -5900 -6B00 -4480 -ENDCHAR -STARTCHAR 6A48 -ENCODING 27208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FF00 -4900 -DF00 -FF80 -DF80 -4A00 -4A80 -7300 -ENDCHAR -STARTCHAR 6A4B -ENCODING 27211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5E00 -FF80 -5E80 -CE00 -FF00 -5100 -5F00 -5F00 -5100 -ENDCHAR -STARTCHAR 6A52 -ENCODING 27218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4400 -FF80 -5E80 -C400 -FF00 -4000 -5F80 -4B00 -5C80 -ENDCHAR -STARTCHAR 6A53 -ENCODING 27219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5500 -F500 -5F00 -D100 -BB00 -7D00 -4F80 -5100 -6100 -ENDCHAR -STARTCHAR 6A58 -ENCODING 27224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4A00 -FF80 -4D00 -D400 -FF00 -5B00 -5E80 -5E80 -5100 -ENDCHAR -STARTCHAR 6A59 -ENCODING 27225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5D00 -4A00 -FB00 -5F00 -E080 -FF00 -5F00 -4A00 -4A00 -7F80 -ENDCHAR -STARTCHAR 6A5F -ENCODING 27231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -7E00 -D700 -5D00 -DF80 -FF80 -5300 -5A00 -5680 -6D00 -ENDCHAR -STARTCHAR 6A61 -ENCODING 27233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5E00 -DF00 -5500 -DF00 -FA00 -6F00 -5500 -5C80 -7C00 -ENDCHAR -STARTCHAR 6A6B -ENCODING 27243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -7F80 -EE00 -7F80 -C400 -FF00 -7F00 -5F00 -4A00 -7180 -ENDCHAR -STARTCHAR 6A80 -ENCODING 27264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4000 -FF00 -5B00 -DF00 -E000 -5F00 -5100 -5F00 -7F80 -ENDCHAR -STARTCHAR 6A84 -ENCODING 27268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5A00 -DB80 -6500 -BF00 -BF00 -DF00 -5500 -6B00 -6480 -ENDCHAR -STARTCHAR 6A89 -ENCODING 27273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5C00 -5700 -FE80 -5E80 -DF00 -E300 -5C00 -5F80 -4400 -5F00 -ENDCHAR -STARTCHAR 6A8D -ENCODING 27277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -DF80 -4000 -DF00 -FF00 -5F00 -5D00 -6A80 -6E80 -ENDCHAR -STARTCHAR 6A8E -ENCODING 27278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4B00 -FF80 -5B00 -DF00 -BF00 -7F00 -5A80 -5E80 -5100 -ENDCHAR -STARTCHAR 6A97 -ENCODING 27287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -9F80 -F500 -FF80 -F200 -CA00 -FF80 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 6A9C -ENCODING 27292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -FF00 -5F80 -DF00 -9F00 -5F00 -5100 -5F00 -5F00 -ENDCHAR -STARTCHAR 6AA2 -ENCODING 27298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -FF00 -5080 -DB00 -FB00 -4000 -4A00 -5700 -6580 -ENDCHAR -STARTCHAR 6AA3 -ENCODING 27299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -FD00 -5E80 -DF80 -FF00 -D100 -5F00 -5500 -5F00 -ENDCHAR -STARTCHAR 6AB3 -ENCODING 27315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -FF80 -4E00 -DF00 -B100 -5F00 -4F00 -4A00 -5180 -ENDCHAR -STARTCHAR 6ABB -ENCODING 27323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5E00 -5A00 -DF80 -5C00 -DB80 -BC00 -5F00 -5B00 -5B00 -7F80 -ENDCHAR -STARTCHAR 6AC2 -ENCODING 27330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5B00 -ED00 -5A80 -CA00 -FF00 -7F00 -5700 -5C00 -5F80 -ENDCHAR -STARTCHAR 6AC3 -ENCODING 27331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5F00 -EF00 -5F80 -DF00 -DF00 -6F00 -5500 -5F80 -5000 -ENDCHAR -STARTCHAR 6AD3 -ENCODING 27347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5E00 -DF00 -5F00 -DF00 -9A80 -6000 -5F00 -5100 -5F00 -ENDCHAR -STARTCHAR 6ADA -ENCODING 27354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5B -6D -DB -5B -EF -AB -65 -6B -6F -61 -ENDCHAR -STARTCHAR 6ADB -ENCODING 27355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -5F80 -ED00 -5B00 -E680 -DA80 -5A80 -6A80 -5F00 -5A00 -ENDCHAR -STARTCHAR 6AF6 -ENCODING 27382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -EF80 -5F00 -DF80 -DF00 -5F00 -5C00 -5B00 -6E80 -ENDCHAR -STARTCHAR 6AFB -ENCODING 27387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5B00 -FB00 -5B00 -DB00 -E480 -7F80 -5200 -4E00 -7900 -ENDCHAR -STARTCHAR 6B04 -ENCODING 27396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5B -6D -DB -5B -DF -EF -6F -6D -57 -65 -ENDCHAR -STARTCHAR 6B0A -ENCODING 27402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4A00 -FB00 -5B00 -D200 -FF80 -5F00 -5300 -5C00 -5F80 -ENDCHAR -STARTCHAR 6B0C -ENCODING 27404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F00 -C280 -6F80 -F600 -9680 -7B00 -7D00 -7780 -7500 -ENDCHAR -STARTCHAR 6B12 -ENCODING 27410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -DB00 -5A00 -FB80 -BB00 -BD80 -FF00 -1800 -6E00 -8900 -ENDCHAR -STARTCHAR 6B16 -ENCODING 27414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BA00 -BD00 -FB80 -FB80 -DF00 -9F00 -9F00 -9F00 -8A80 -B300 -ENDCHAR -STARTCHAR 6B20 -ENCODING 27424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -2000 -3F00 -4900 -8A00 -9800 -1800 -2400 -4300 -8180 -ENDCHAR -STARTCHAR 6B21 -ENCODING 27425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -F000 -1F00 -1500 -2500 -6C00 -CC00 -1200 -3100 -6080 -ENDCHAR -STARTCHAR 6B23 -ENCODING 27427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3400 -C400 -8F80 -FC80 -AD00 -A400 -A600 -A600 -A900 -B080 -ENDCHAR -STARTCHAR 6B32 -ENCODING 27442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6400 -9400 -F780 -6A80 -9B00 -8A00 -F600 -9500 -F900 -8880 -ENDCHAR -STARTCHAR 6B3A -ENCODING 27450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -F400 -9700 -FB00 -9B00 -F200 -FE00 -6500 -9900 -8880 -ENDCHAR -STARTCHAR 6B3D -ENCODING 27453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -6800 -AF00 -FB00 -4B00 -F200 -D600 -E500 -3900 -C880 -ENDCHAR -STARTCHAR 6B3E -ENCODING 27454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -F400 -F780 -0B00 -FB00 -0600 -F600 -B500 -B900 -4880 -ENDCHAR -STARTCHAR 6B46 -ENCODING 27462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -F800 -9F00 -6B00 -FB00 -F200 -9600 -F500 -F900 -8880 -ENDCHAR -STARTCHAR 6B47 -ENCODING 27463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -9400 -F780 -F500 -4B00 -F200 -F600 -D500 -F900 -3880 -ENDCHAR -STARTCHAR 6B4C -ENCODING 27468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FC00 -1400 -F780 -F680 -3700 -FA00 -F600 -B500 -F500 -3880 -ENDCHAR -STARTCHAR 6B4E -ENCODING 27470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4A00 -FE00 -3B80 -7D40 -5580 -7900 -7B00 -FA80 -2C80 -4440 -ENDCHAR -STARTCHAR 6B50 -ENCODING 27472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FC00 -8400 -F780 -FA80 -8300 -F200 -F200 -8500 -F900 -0880 -ENDCHAR -STARTCHAR 6B5F -ENCODING 27487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -DA00 -AA00 -BB80 -AE80 -DF00 -EA00 -FA00 -0300 -5500 -8C80 -ENDCHAR -STARTCHAR 6B61 -ENCODING 27489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FC00 -6400 -F700 -F700 -2B00 -F200 -F600 -A500 -FD00 -8880 -ENDCHAR -STARTCHAR 6B62 -ENCODING 27490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -0800 -4800 -4F00 -4800 -4800 -4800 -4800 -FF80 -ENDCHAR -STARTCHAR 6B63 -ENCODING 27491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -0800 -4800 -4F00 -4800 -4800 -4800 -FF80 -ENDCHAR -STARTCHAR 6B64 -ENCODING 27492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -2400 -A500 -A700 -BC00 -A400 -A400 -A400 -BC80 -C700 -ENDCHAR -STARTCHAR 6B65 -ENCODING 27493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -4F00 -4800 -FF80 -0800 -2900 -4A00 -9C00 -3800 -C000 -ENDCHAR -STARTCHAR 6B66 -ENCODING 27494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7D00 -FF80 -2400 -A400 -BA00 -A200 -BA80 -E100 -ENDCHAR -STARTCHAR 6B6A -ENCODING 27498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -1C00 -6B00 -8980 -0000 -FF00 -4E00 -4800 -FF00 -ENDCHAR -STARTCHAR 6B72 -ENCODING 27506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -FF80 -0700 -FF80 -FD00 -B600 -BA00 -D680 -A900 -ENDCHAR -STARTCHAR 6B77 -ENCODING 27511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -F700 -FF00 -AB00 -D680 -8800 -A700 -A800 -FF80 -ENDCHAR -STARTCHAR 6B78 -ENCODING 27512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -E100 -FF80 -8F00 -FF80 -F280 -6F00 -CB00 -EB00 -C200 -ENDCHAR -STARTCHAR 6B7B -ENCODING 27515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4400 -7500 -5700 -D400 -A400 -2480 -4480 -8700 -ENDCHAR -STARTCHAR 6B7F -ENCODING 27519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -F700 -4900 -6B00 -B000 -FF00 -E900 -4600 -CF00 -9180 -ENDCHAR -STARTCHAR 6B83 -ENCODING 27523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -4400 -4F00 -7500 -B500 -BF80 -C400 -4A00 -9900 -9080 -ENDCHAR -STARTCHAR 6B84 -ENCODING 27524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F600 -4E00 -7B00 -BC80 -EA00 -6500 -5A00 -CC00 -9000 -ENDCHAR -STARTCHAR 6B86 -ENCODING 27526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -F400 -4800 -6F00 -A080 -E000 -6F00 -4900 -4F00 -8900 -ENDCHAR -STARTCHAR 6B89 -ENCODING 27529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -49 -7F -AB -EF -4B -4F -81 -83 -ENDCHAR -STARTCHAR 6B8A -ENCODING 27530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -EC00 -4F00 -7400 -BF80 -E600 -CA00 -5500 -9480 -8400 -ENDCHAR -STARTCHAR 6B96 -ENCODING 27542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -EF80 -4200 -E700 -B700 -F900 -5700 -5700 -9F80 -9000 -ENDCHAR -STARTCHAR 6B98 -ENCODING 27544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -E600 -5D80 -E680 -B900 -EA00 -3F80 -4500 -8600 -9900 -ENDCHAR -STARTCHAR 6B9E -ENCODING 27550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -4F00 -6000 -BF00 -FF00 -DF00 -5F00 -8A00 -9180 -ENDCHAR -STARTCHAR 6BAE -ENCODING 27566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E600 -8900 -FE80 -BF00 -FF00 -4000 -4A00 -9B00 -9480 -ENDCHAR -STARTCHAR 6BAF -ENCODING 27567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -5F80 -EE00 -BF00 -F100 -4F00 -4F00 -8B00 -9180 -ENDCHAR -STARTCHAR 6BB2 -ENCODING 27570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1600 -EF00 -AA00 -FF80 -D600 -D680 -7500 -5900 -BF80 -8500 -ENDCHAR -STARTCHAR 6BB5 -ENCODING 27573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3E00 -EA00 -8A80 -F180 -8000 -EF00 -B900 -C600 -8F00 -9900 -ENDCHAR -STARTCHAR 6BB7 -ENCODING 27575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1600 -E600 -FA80 -F980 -FF00 -F500 -9600 -9D00 -A880 -ENDCHAR -STARTCHAR 6BBA -ENCODING 27578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A600 -6A00 -9A80 -E980 -4000 -FF00 -6500 -D600 -C700 -5980 -ENDCHAR -STARTCHAR 6BBC -ENCODING 27580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -F500 -F580 -0980 -F000 -6F00 -6500 -A200 -9500 -A880 -ENDCHAR -STARTCHAR 6BBF -ENCODING 27583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F600 -9680 -F580 -D800 -FF00 -D500 -F600 -D700 -8D80 -ENDCHAR -STARTCHAR 6BC1 -ENCODING 27585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7600 -9500 -F980 -9980 -F000 -0F00 -F100 -3600 -C700 -1980 -ENDCHAR -STARTCHAR 6BC5 -ENCODING 27589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -FA00 -6A80 -F980 -5000 -EF00 -B500 -7600 -AD00 -6880 -ENDCHAR -STARTCHAR 6BC6 -ENCODING 27590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F600 -F580 -F980 -8800 -D700 -AD00 -D500 -FE00 -8980 -ENDCHAR -STARTCHAR 6BCB -ENCODING 27595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4900 -4900 -FF80 -5200 -5200 -7F00 -8200 -8600 -ENDCHAR -STARTCHAR 6BCD -ENCODING 27597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -5200 -4A00 -FF80 -5200 -4A00 -7F00 -4200 -0600 -ENDCHAR -STARTCHAR 6BCF -ENCODING 27599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F00 -4000 -BE00 -4A00 -FF80 -5200 -7F00 -0200 -0600 -ENDCHAR -STARTCHAR 6BD2 -ENCODING 27602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7F00 -FF80 -0000 -7E00 -FF80 -4A00 -7F00 -0600 -ENDCHAR -STARTCHAR 6BD3 -ENCODING 27603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -8500 -EF00 -D080 -FD00 -ED00 -FD00 -AD80 -7580 -ENDCHAR -STARTCHAR 6BD4 -ENCODING 27604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4800 -4800 -4900 -7600 -4800 -4800 -4880 -7880 -C700 -ENDCHAR -STARTCHAR 6BD6 -ENCODING 27606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4900 -7600 -7880 -C700 -1200 -6D00 -A900 -B280 -FE00 -ENDCHAR -STARTCHAR 6BD7 -ENCODING 27607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -EA00 -EA80 -EF00 -EA00 -EA00 -EA00 -EA80 -8E80 -1300 -ENDCHAR -STARTCHAR 6BD8 -ENCODING 27608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -8900 -7F00 -7F00 -4800 -4900 -7E00 -7880 -CF00 -ENDCHAR -STARTCHAR 6BDB -ENCODING 27611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7800 -0F00 -F000 -3F00 -D000 -1000 -1080 -0F00 -ENDCHAR -STARTCHAR 6BEB -ENCODING 27627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7E00 -7E00 -FF00 -8E80 -7300 -7F00 -D080 -0F00 -ENDCHAR -STARTCHAR 6BEC -ENCODING 27628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2500 -C500 -5F00 -7500 -CE00 -6600 -CD00 -5480 -4C80 -7F00 -ENDCHAR -STARTCHAR 6C08 -ENCODING 27656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -0600 -F200 -FF00 -F200 -0300 -FF00 -9200 -F280 -FB00 -ENDCHAR -STARTCHAR 6C0F -ENCODING 27663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0700 -7800 -4800 -4800 -7F00 -4400 -4400 -7A80 -E300 -ENDCHAR -STARTCHAR 6C11 -ENCODING 27665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4100 -7F00 -4800 -4800 -7F00 -4400 -7C80 -C300 -ENDCHAR -STARTCHAR 6C13 -ENCODING 27667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -5100 -EF00 -9200 -9200 -8F80 -9200 -F680 -1900 -ENDCHAR -STARTCHAR 6C23 -ENCODING 27683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F00 -BE00 -0000 -FE00 -5A00 -FE00 -3280 -5980 -9500 -ENDCHAR -STARTCHAR 6C34 -ENCODING 27700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -08 -E9 -2A -2C -4C -8B -89 -38 -ENDCHAR -STARTCHAR 6C37 -ENCODING 27703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -48 -29 -EA -2C -2C -4A -89 -89 -38 -ENDCHAR -STARTCHAR 6C38 -ENCODING 27704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1000 -0800 -7800 -0900 -EA00 -2C00 -2A00 -C980 -9800 -ENDCHAR -STARTCHAR 6C3E -ENCODING 27710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -5100 -9100 -5100 -1700 -5000 -5000 -9080 -9F00 -ENDCHAR -STARTCHAR 6C40 -ENCODING 27712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8000 -5F80 -0200 -C200 -0200 -4200 -4200 -8200 -8C00 -ENDCHAR -STARTCHAR 6C41 -ENCODING 27713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -4400 -0400 -BF80 -4400 -0400 -4400 -4400 -8400 -8400 -ENDCHAR -STARTCHAR 6C42 -ENCODING 27714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0C00 -0A00 -FF00 -4900 -4A00 -2C00 -3200 -6900 -8880 -3000 -ENDCHAR -STARTCHAR 6C4E -ENCODING 27726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DE00 -5200 -9200 -5A00 -1600 -5200 -6200 -A280 -A300 -ENDCHAR -STARTCHAR 6C50 -ENCODING 27728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -C8 -48 -0F -89 -5D -26 -42 -44 -88 -90 -ENDCHAR -STARTCHAR 6C55 -ENCODING 27733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -84 -44 -25 -A5 -25 -65 -65 -BF -A1 -ENDCHAR -STARTCHAR 6C57 -ENCODING 27735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -4400 -0400 -8400 -3F80 -4400 -4400 -8400 -8400 -ENDCHAR -STARTCHAR 6C5A -ENCODING 27738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -4800 -0800 -FF80 -1000 -5F00 -9100 -8100 -8700 -ENDCHAR -STARTCHAR 6C5D -ENCODING 27741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -4800 -3F80 -9200 -5200 -1200 -4C00 -4E00 -9B00 -A100 -ENDCHAR -STARTCHAR 6C5E -ENCODING 27742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -08 -FF -09 -EA -2C -4E -CB -B9 -ENDCHAR -STARTCHAR 6C5F -ENCODING 27743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -C000 -5F00 -8400 -4400 -0400 -4400 -4400 -8400 -BF80 -ENDCHAR -STARTCHAR 6C60 -ENCODING 27744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5400 -1500 -9F00 -9500 -3500 -5700 -5400 -9080 -9F00 -ENDCHAR -STARTCHAR 6C68 -ENCODING 27752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -DF -51 -11 -D1 -1F -51 -51 -9F -91 -ENDCHAR -STARTCHAR 6C6A -ENCODING 27754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8000 -7F00 -0400 -C400 -1F00 -4400 -4400 -8400 -BF80 -ENDCHAR -STARTCHAR 6C6D -ENCODING 27757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -9C -44 -3F -A5 -2D -6B -73 -A1 -A3 -ENDCHAR -STARTCHAR 6C70 -ENCODING 27760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -0400 -BF80 -8400 -0C00 -4A00 -5A00 -B500 -A080 -ENDCHAR -STARTCHAR 6C72 -ENCODING 27762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BE00 -5200 -1200 -DB00 -1D00 -5500 -A600 -AE00 -D180 -ENDCHAR -STARTCHAR 6C76 -ENCODING 27766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -3F80 -9100 -4A00 -0C00 -4400 -4A00 -B100 -A080 -ENDCHAR -STARTCHAR 6C7A -ENCODING 27770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -4800 -1F00 -8900 -8900 -3F80 -4C00 -9200 -B300 -A080 -ENDCHAR -STARTCHAR 6C7D -ENCODING 27773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9000 -7F00 -2000 -9F00 -3E00 -4200 -8200 -8180 -8100 -ENDCHAR -STARTCHAR 6C7E -ENCODING 27774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -C600 -4A00 -9100 -6080 -3F00 -4900 -4900 -9100 -A600 -ENDCHAR -STARTCHAR 6C81 -ENCODING 27777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8C00 -4400 -0800 -E900 -2900 -6880 -A800 -8900 -8F00 -ENDCHAR -STARTCHAR 6C82 -ENCODING 27778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8300 -5E00 -1000 -DF80 -1200 -5200 -5200 -A200 -A200 -ENDCHAR -STARTCHAR 6C83 -ENCODING 27779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -5C00 -0400 -8400 -7F80 -0400 -4C00 -5200 -B100 -A080 -ENDCHAR -STARTCHAR 6C85 -ENCODING 27781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8000 -5F00 -0000 -FF00 -0A00 -5200 -5200 -B280 -A300 -ENDCHAR -STARTCHAR 6C86 -ENCODING 27782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -0000 -8000 -9E00 -1200 -5200 -5280 -A280 -A300 -ENDCHAR -STARTCHAR 6C87 -ENCODING 27783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C800 -4A00 -1100 -BF00 -5280 -1200 -5200 -5200 -A280 -A300 -ENDCHAR -STARTCHAR 6C88 -ENCODING 27784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -3F00 -A500 -8400 -0C00 -4C00 -5400 -B480 -A700 -ENDCHAR -STARTCHAR 6C8C -ENCODING 27788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4700 -3E00 -A500 -6500 -2500 -7F00 -6400 -8480 -8700 -ENDCHAR -STARTCHAR 6C90 -ENCODING 27792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -3F00 -8400 -8E00 -1600 -6500 -A480 -8400 -8400 -ENDCHAR -STARTCHAR 6C92 -ENCODING 27794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -4F00 -1100 -9600 -A000 -3F00 -5200 -4C00 -9E00 -A180 -ENDCHAR -STARTCHAR 6C93 -ENCODING 27795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -EA -2C -4A -99 -7E -41 -7E -7E -41 -ENDCHAR -STARTCHAR 6C94 -ENCODING 27796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -44 -A4 -A7 -25 -5F -61 -81 -83 -ENDCHAR -STARTCHAR 6C95 -ENCODING 27797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -D0 -50 -1F -AB -6B -15 -75 -69 -99 -97 -ENDCHAR -STARTCHAR 6C96 -ENCODING 27798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -84 -44 -3F -A5 -65 -3F -65 -84 -84 -84 -ENDCHAR -STARTCHAR 6C99 -ENCODING 27801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -84 -46 -15 -95 -55 -26 -4E -84 -98 -A0 -ENDCHAR -STARTCHAR 6C9A -ENCODING 27802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -1400 -9400 -9700 -1400 -5400 -5400 -9400 -FF80 -ENDCHAR -STARTCHAR 6C9B -ENCODING 27803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -0400 -8400 -9F00 -1500 -5500 -5500 -9500 -8400 -ENDCHAR -STARTCHAR 6CAB -ENCODING 27819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -3F80 -8400 -BF00 -0C00 -4E00 -B500 -A480 -8400 -ENDCHAR -STARTCHAR 6CAE -ENCODING 27822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -5100 -9100 -5F00 -1100 -5F00 -5100 -9100 -BF80 -ENDCHAR -STARTCHAR 6CB3 -ENCODING 27827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8000 -7F80 -8100 -DD00 -1500 -5D00 -5500 -8100 -8300 -ENDCHAR -STARTCHAR 6CB8 -ENCODING 27832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -8C -7F -0D -BF -6C -2C -7F -95 -95 -A4 -ENDCHAR -STARTCHAR 6CB9 -ENCODING 27833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -84 -44 -1F -A5 -65 -1F -65 -65 -9F -A1 -ENDCHAR -STARTCHAR 6CBB -ENCODING 27835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -4A00 -1100 -9F00 -4080 -1F00 -5100 -5100 -9F00 -9100 -ENDCHAR -STARTCHAR 6CBC -ENCODING 27836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -DF -49 -89 -73 -00 -5F -51 -9F -91 -ENDCHAR -STARTCHAR 6CBD -ENCODING 27837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -3F80 -8400 -4400 -1F00 -5100 -5100 -9F00 -9100 -ENDCHAR -STARTCHAR 6CBE -ENCODING 27838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -4400 -0780 -8400 -4400 -1F00 -5100 -5100 -9F00 -9100 -ENDCHAR -STARTCHAR 6CBF -ENCODING 27839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DE00 -5200 -9280 -5380 -2000 -5F00 -5100 -9F00 -9100 -ENDCHAR -STARTCHAR 6CC1 -ENCODING 27841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9F00 -6100 -2100 -A100 -DF00 -0C00 -4C00 -5400 -B480 -A300 -ENDCHAR -STARTCHAR 6CC2 -ENCODING 27842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -DF -61 -2F -AB -6B -6F -6B -A1 -A3 -ENDCHAR -STARTCHAR 6CC4 -ENCODING 27844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8A00 -5A00 -1A00 -BF80 -1A00 -5A00 -5600 -9F80 -9000 -ENDCHAR -STARTCHAR 6CC9 -ENCODING 27849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -7E -41 -7E -7E -09 -EA -2C -4B -B9 -ENDCHAR -STARTCHAR 6CCA -ENCODING 27850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -44 -1F -A1 -61 -1F -61 -61 -9F -A1 -ENDCHAR -STARTCHAR 6CCC -ENCODING 27852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8900 -4500 -8900 -AB00 -2B00 -6C80 -A800 -9900 -AF00 -ENDCHAR -STARTCHAR 6CD3 -ENCODING 27859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BA00 -4A00 -0A00 -BA00 -A400 -3500 -4D00 -4C80 -9780 -BC80 -ENDCHAR -STARTCHAR 6CD5 -ENCODING 27861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -1F00 -8400 -4400 -3F80 -4A00 -8900 -9700 -B880 -ENDCHAR -STARTCHAR 6CD7 -ENCODING 27863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -80 -7F -2D -AD -2D -73 -B1 -BF -A1 -ENDCHAR -STARTCHAR 6CDB -ENCODING 27867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8300 -7C00 -BF00 -4200 -0200 -4400 -A800 -B000 -CF80 -ENDCHAR -STARTCHAR 6CE1 -ENCODING 27873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -5F00 -2100 -BD00 -A500 -1D00 -5300 -5000 -9080 -9F00 -ENDCHAR -STARTCHAR 6CE2 -ENCODING 27874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F80 -2480 -A400 -9F00 -2900 -6A00 -6400 -AF00 -D180 -ENDCHAR -STARTCHAR 6CE3 -ENCODING 27875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -0000 -9100 -5200 -1200 -5200 -4A00 -BF80 -8000 -ENDCHAR -STARTCHAR 6CE5 -ENCODING 27877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -6100 -9F00 -A000 -2900 -6B00 -AC00 -A880 -AF00 -ENDCHAR -STARTCHAR 6CE8 -ENCODING 27880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -C800 -4400 -1F00 -C400 -0400 -5F00 -4400 -8400 -BF80 -ENDCHAR -STARTCHAR 6CEB -ENCODING 27883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -3F80 -8800 -AA00 -1C00 -4E00 -4900 -8B00 -BC80 -ENDCHAR -STARTCHAR 6CEE -ENCODING 27886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5600 -1500 -A480 -5F00 -0400 -7F80 -8400 -8400 -8400 -ENDCHAR -STARTCHAR 6CEF -ENCODING 27887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6100 -BF00 -6400 -2400 -7F00 -A400 -AA80 -F100 -ENDCHAR -STARTCHAR 6CF0 -ENCODING 27888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -1000 -7F00 -FF80 -4A00 -AD80 -0800 -FE00 -1900 -ENDCHAR -STARTCHAR 6CF3 -ENCODING 27891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8C00 -4000 -9D00 -8500 -3600 -5600 -9500 -A480 -8C00 -ENDCHAR -STARTCHAR 6D0B -ENCODING 27915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -4A00 -3F00 -8400 -9F00 -0400 -7F80 -8400 -8400 -8400 -ENDCHAR -STARTCHAR 6D0C -ENCODING 27916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -81 -79 -13 -9B -AB -3B -4B -93 -B1 -A3 -ENDCHAR -STARTCHAR 6D11 -ENCODING 27921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -5300 -1200 -AF80 -A200 -6600 -6600 -A500 -A900 -A880 -ENDCHAR -STARTCHAR 6D17 -ENCODING 27927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5400 -1F00 -A400 -8400 -3F80 -4A00 -9200 -9280 -A300 -ENDCHAR -STARTCHAR 6D19 -ENCODING 27929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5400 -1F00 -A400 -7F80 -0C00 -4E00 -5500 -A480 -8400 -ENDCHAR -STARTCHAR 6D1B -ENCODING 27931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -5F00 -1200 -AA00 -8E00 -3180 -5F00 -9100 -9F00 -9100 -ENDCHAR -STARTCHAR 6D1E -ENCODING 27934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -61 -3F -A1 -2F -6B -AF -A1 -A3 -ENDCHAR -STARTCHAR 6D25 -ENCODING 27941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -0500 -BF80 -5F00 -0400 -7F00 -BF80 -8400 -8400 -ENDCHAR -STARTCHAR 6D27 -ENCODING 27943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -7F80 -0800 -9F00 -7100 -3F00 -5100 -5F00 -9100 -9300 -ENDCHAR -STARTCHAR 6D29 -ENCODING 27945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -4800 -3F00 -BF00 -A500 -3F00 -4500 -4600 -9A80 -A100 -ENDCHAR -STARTCHAR 6D2A -ENCODING 27946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -4A00 -3F00 -8A00 -4A00 -0A00 -7F80 -4A00 -B100 -A080 -ENDCHAR -STARTCHAR 6D32 -ENCODING 27954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -95 -55 -15 -BF -7F -5D -55 -95 -A5 -A1 -ENDCHAR -STARTCHAR 6D35 -ENCODING 27957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -D0 -50 -1F -BD -75 -1D -55 -5D -81 -87 -ENDCHAR -STARTCHAR 6D36 -ENCODING 27958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -90 -5F -21 -B5 -6B -2B -77 -7F -A1 -83 -ENDCHAR -STARTCHAR 6D38 -ENCODING 27960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -6500 -1500 -9600 -BF80 -0A00 -4A00 -5200 -B280 -A300 -ENDCHAR -STARTCHAR 6D39 -ENCODING 27961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -4000 -9F00 -5100 -1F00 -5100 -5F00 -8000 -BF80 -ENDCHAR -STARTCHAR 6D3B -ENCODING 27963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -7C00 -0400 -BF80 -4400 -1F00 -5100 -5100 -9F00 -9100 -ENDCHAR -STARTCHAR 6D3D -ENCODING 27965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CC00 -4A00 -1100 -A080 -5E00 -0000 -5F00 -5100 -9F00 -9100 -ENDCHAR -STARTCHAR 6D3E -ENCODING 27966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8300 -7C00 -2B00 -AC00 -2A80 -6B00 -AA00 -AF00 -D880 -ENDCHAR -STARTCHAR 6D41 -ENCODING 27969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -0A00 -9700 -7900 -1A00 -5A00 -5A00 -AA80 -AB00 -ENDCHAR -STARTCHAR 6D59 -ENCODING 27993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -5600 -3C00 -9400 -9780 -3D00 -5500 -9500 -9900 -A900 -ENDCHAR -STARTCHAR 6D5A -ENCODING 27994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C800 -4900 -3F00 -8C80 -7B00 -0800 -5F00 -6A00 -8E00 -B180 -ENDCHAR -STARTCHAR 6D5C -ENCODING 27996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8300 -5C00 -1000 -9F00 -1200 -7F80 -9200 -B100 -A080 -ENDCHAR -STARTCHAR 6D63 -ENCODING 28003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -2080 -9E00 -4000 -3F00 -4A00 -9200 -9280 -A300 -ENDCHAR -STARTCHAR 6D66 -ENCODING 28006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8600 -4500 -3F80 -9F00 -6500 -1F00 -6500 -5F00 -A500 -A700 -ENDCHAR -STARTCHAR 6D69 -ENCODING 28009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -5400 -1F00 -A400 -7F80 -0400 -5F00 -5100 -9F00 -9100 -ENDCHAR -STARTCHAR 6D6A -ENCODING 28010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -84 -5F -21 -9F -61 -1F -65 -A6 -AF -B1 -ENDCHAR -STARTCHAR 6D6C -ENCODING 28012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -6500 -1F00 -A500 -1F00 -4400 -7F00 -8400 -BF80 -ENDCHAR -STARTCHAR 6D6E -ENCODING 28014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -5D00 -2500 -A080 -9F00 -0400 -7F80 -4400 -8400 -8C00 -ENDCHAR -STARTCHAR 6D74 -ENCODING 28020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8A00 -5300 -2D00 -8A00 -1100 -7E80 -9100 -9E00 -9100 -ENDCHAR -STARTCHAR 6D77 -ENCODING 28023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -5F80 -2000 -BF00 -9500 -3F80 -6900 -BF80 -A100 -8600 -ENDCHAR -STARTCHAR 6D78 -ENCODING 28024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -4100 -3F80 -8000 -3F00 -7F00 -4A00 -8E00 -B100 -ENDCHAR -STARTCHAR 6D79 -ENCODING 28025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -0400 -9500 -D500 -2E80 -6A00 -4A00 -9100 -A080 -ENDCHAR -STARTCHAR 6D7F -ENCODING 28031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5100 -9F00 -9100 -1F00 -5100 -9F00 -9200 -A180 -ENDCHAR -STARTCHAR 6D85 -ENCODING 28037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5100 -1F00 -DF00 -0000 -4400 -5F00 -8400 -BF80 -ENDCHAR -STARTCHAR 6D87 -ENCODING 28039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -5500 -AA00 -6A00 -1500 -4000 -BF00 -8400 -BF80 -ENDCHAR -STARTCHAR 6D88 -ENCODING 28040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5700 -2480 -BF00 -A100 -1F00 -6100 -5F00 -A100 -A300 -ENDCHAR -STARTCHAR 6D89 -ENCODING 28041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5700 -1400 -9400 -BF80 -1500 -5500 -6E00 -8C00 -B000 -ENDCHAR -STARTCHAR 6D8C -ENCODING 28044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -9F -4A -04 -DF -1F -65 -5F -A5 -A7 -ENDCHAR -STARTCHAR 6D8D -ENCODING 28045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -0600 -BF80 -8400 -1E00 -7F80 -4400 -8400 -8C00 -ENDCHAR -STARTCHAR 6D8E -ENCODING 28046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -B100 -5600 -A200 -B700 -1600 -7600 -9780 -B000 -AF80 -ENDCHAR -STARTCHAR 6D91 -ENCODING 28049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -0400 -9F00 -9500 -1F00 -4C00 -9700 -A480 -8400 -ENDCHAR -STARTCHAR 6D93 -ENCODING 28051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -DF -51 -9F -5F -11 -5F -5F -91 -93 -ENDCHAR -STARTCHAR 6D95 -ENCODING 28053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -4A00 -3F00 -8500 -9F00 -2400 -7F80 -4C80 -9700 -A400 -ENDCHAR -STARTCHAR 6DAF -ENCODING 28079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -6400 -AF00 -A400 -3F00 -6400 -AF00 -A400 -DF80 -ENDCHAR -STARTCHAR 6DB2 -ENCODING 28082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -1400 -9700 -A500 -2F00 -5E00 -9600 -9D00 -9880 -ENDCHAR -STARTCHAR 6DB5 -ENCODING 28085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -4800 -2D00 -B700 -2500 -6F00 -B500 -BF00 -A100 -ENDCHAR -STARTCHAR 6DC0 -ENCODING 28096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -2080 -9F00 -4400 -1400 -5700 -9400 -AC00 -C780 -ENDCHAR -STARTCHAR 6DC3 -ENCODING 28099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9600 -6900 -3F00 -8C00 -BF80 -1F00 -7280 -9600 -9100 -9F00 -ENDCHAR -STARTCHAR 6DC4 -ENCODING 28100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9480 -5500 -1500 -9480 -4000 -1F00 -5500 -5F00 -9F00 -9100 -ENDCHAR -STARTCHAR 6DC5 -ENCODING 28101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -5700 -3C00 -9400 -B780 -3D00 -5D00 -9500 -9500 -9900 -ENDCHAR -STARTCHAR 6DC6 -ENCODING 28102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9B00 -4600 -3900 -BF80 -5000 -1F00 -7F00 -B100 -9F00 -9300 -ENDCHAR -STARTCHAR 6DC7 -ENCODING 28103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F00 -1200 -9E00 -5200 -1E00 -5200 -7F80 -9200 -A180 -ENDCHAR -STARTCHAR 6DCB -ENCODING 28107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -5200 -3F00 -9200 -BA00 -3F00 -5700 -9A80 -9200 -9200 -ENDCHAR -STARTCHAR 6DCF -ENCODING 28111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5100 -9F00 -4000 -3F80 -4400 -7F00 -8A00 -B180 -ENDCHAR -STARTCHAR 6DD1 -ENCODING 28113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -5700 -1D00 -9500 -BB00 -3B00 -5A00 -D700 -9700 -B480 -ENDCHAR -STARTCHAR 6DD8 -ENCODING 28120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -90 -5F -31 -9D -A9 -3F -6B -BF -A1 -87 -ENDCHAR -STARTCHAR 6DD9 -ENCODING 28121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -2080 -9F00 -4000 -3F00 -5500 -5500 -A480 -8C00 -ENDCHAR -STARTCHAR 6DDA -ENCODING 28122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -7E00 -3F00 -A100 -BF00 -2500 -7F80 -A400 -CA00 -F180 -ENDCHAR -STARTCHAR 6DDE -ENCODING 28126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9300 -5500 -3500 -B500 -BA80 -2C00 -9500 -9500 -9700 -9C80 -ENDCHAR -STARTCHAR 6DE1 -ENCODING 28129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -5500 -1E00 -9A00 -7100 -1500 -5600 -5C00 -9B00 -A180 -ENDCHAR -STARTCHAR 6DE8 -ENCODING 28136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8200 -5D00 -2500 -9F00 -3F80 -4500 -5F00 -8400 -9800 -ENDCHAR -STARTCHAR 6DEA -ENCODING 28138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8C00 -5300 -3E80 -8000 -BF00 -2B00 -6B00 -7F00 -AB00 -AB00 -ENDCHAR -STARTCHAR 6DEB -ENCODING 28139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8200 -5D00 -2900 -A480 -9F00 -0400 -7F80 -8400 -8400 -BF00 -ENDCHAR -STARTCHAR 6DEE -ENCODING 28142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -5400 -1F00 -B400 -BF00 -1400 -5F00 -5400 -9F80 -9000 -ENDCHAR -STARTCHAR 6DF1 -ENCODING 28145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6D00 -9500 -7300 -0400 -7B00 -8E00 -9580 -A400 -ENDCHAR -STARTCHAR 6DF3 -ENCODING 28147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -1F00 -9F00 -8000 -1F00 -4200 -7F80 -8400 -8C00 -ENDCHAR -STARTCHAR 6DF5 -ENCODING 28149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -AB -6B -1B -A1 -5F -21 -7B -6B -AB -CB -ENDCHAR -STARTCHAR 6DF7 -ENCODING 28151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6100 -3F00 -FF00 -2400 -6500 -5E00 -9C80 -B300 -ENDCHAR -STARTCHAR 6DF8 -ENCODING 28152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -1F00 -BF80 -8000 -1F00 -5500 -5F00 -9100 -9300 -ENDCHAR -STARTCHAR 6DF9 -ENCODING 28153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -7F00 -1200 -BF00 -A580 -1F00 -5500 -9F00 -8480 -8700 -ENDCHAR -STARTCHAR 6DFA -ENCODING 28154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -4F00 -3900 -8680 -BB00 -0F00 -7F00 -4600 -8E80 -B100 -ENDCHAR -STARTCHAR 6DFB -ENCODING 28155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8700 -7800 -3F80 -8A00 -9300 -2980 -4900 -AD00 -AA80 -BA00 -ENDCHAR -STARTCHAR 6E17 -ENCODING 28183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -5F00 -0200 -A300 -BF80 -1600 -6B80 -BD00 -9600 -B800 -ENDCHAR -STARTCHAR 6E19 -ENCODING 28185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -5C00 -3F00 -AD00 -5B00 -1500 -7F80 -8C00 -9B00 -A180 -ENDCHAR -STARTCHAR 6E1A -ENCODING 28186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -5F00 -0A00 -BF80 -4600 -1F00 -7100 -5F00 -9F00 -9100 -ENDCHAR -STARTCHAR 6E1B -ENCODING 28187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -7F80 -2200 -BF00 -A300 -3B00 -B600 -BA00 -C580 -C900 -ENDCHAR -STARTCHAR 6E1F -ENCODING 28191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -1F00 -9F00 -4000 -3F00 -7F00 -8400 -8400 -8C00 -ENDCHAR -STARTCHAR 6E20 -ENCODING 28192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5F00 -D100 -7F00 -DF00 -0800 -FF00 -1600 -6980 -8800 -ENDCHAR -STARTCHAR 6E21 -ENCODING 28193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -2A00 -BF80 -AE00 -2000 -7F00 -AA00 -CE00 -D100 -ENDCHAR -STARTCHAR 6E23 -ENCODING 28195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -0C00 -9700 -A480 -1F00 -5F00 -9100 -9F00 -BF80 -ENDCHAR -STARTCHAR 6E24 -ENCODING 28196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -92 -BA -17 -BB -BB -0B -5B -F5 -95 -BB -ENDCHAR -STARTCHAR 6E25 -ENCODING 28197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6100 -BF00 -7F00 -2900 -7F00 -BF00 -A400 -DF80 -ENDCHAR -STARTCHAR 6E26 -ENCODING 28198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -9E -51 -16 -95 -3F -6F -AF -A9 -A3 -ENDCHAR -STARTCHAR 6E2B -ENCODING 28203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9500 -7F80 -1500 -9600 -5F00 -0400 -7F80 -8C00 -9700 -A480 -ENDCHAR -STARTCHAR 6E2C -ENCODING 28204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -B9 -6B -3B -AB -BB -2B -7B -81 -A9 -A7 -ENDCHAR -STARTCHAR 6E2D -ENCODING 28205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -9F -65 -9F -80 -1F -5F -5F -91 -93 -ENDCHAR -STARTCHAR 6E2F -ENCODING 28207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F00 -1200 -BF80 -9200 -3F00 -7280 -9E00 -9100 -9F00 -ENDCHAR -STARTCHAR 6E32 -ENCODING 28210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -3E80 -8000 -9F00 -1100 -5F00 -5F00 -8000 -BF80 -ENDCHAR -STARTCHAR 6E34 -ENCODING 28212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -9F -5F -91 -9F -1F -65 -AB -9F -83 -ENDCHAR -STARTCHAR 6E36 -ENCODING 28214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -7F80 -0E00 -9F00 -9500 -1500 -7F80 -8C00 -9300 -A180 -ENDCHAR -STARTCHAR 6E38 -ENCODING 28216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -5400 -3F80 -A700 -B900 -2A00 -6F80 -AA00 -AA00 -D600 -ENDCHAR -STARTCHAR 6E3A -ENCODING 28218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8200 -7300 -3700 -B680 -3A80 -3300 -5700 -B200 -B400 -8800 -ENDCHAR -STARTCHAR 6E3C -ENCODING 28220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F00 -0400 -9F00 -BF80 -0000 -7F00 -8C00 -9200 -E180 -ENDCHAR -STARTCHAR 6E3D -ENCODING 28221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7B00 -1200 -BF80 -8200 -3B00 -6B00 -BA00 -A680 -8D00 -ENDCHAR -STARTCHAR 6E3E -ENCODING 28222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6480 -1F00 -DF00 -1F00 -6500 -5F00 -BF80 -8400 -ENDCHAR -STARTCHAR 6E43 -ENCODING 28227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F80 -B200 -1700 -BA00 -1700 -7A00 -9F80 -A200 -C200 -ENDCHAR -STARTCHAR 6E44 -ENCODING 28228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -65 -3F -AF -29 -6F -AF -AF -C9 -ENDCHAR -STARTCHAR 6E4A -ENCODING 28234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -7F00 -0800 -BF00 -BF80 -1300 -6E80 -9F00 -9A00 -A100 -ENDCHAR -STARTCHAR 6E4D -ENCODING 28237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A500 -6500 -1F00 -8000 -7F80 -3F00 -6B00 -AB00 -AB00 -AB00 -ENDCHAR -STARTCHAR 6E56 -ENCODING 28246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -93 -55 -3D -93 -95 -3B -6D -BD -AD -87 -ENDCHAR -STARTCHAR 6E58 -ENCODING 28248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -97 -55 -3D -97 -B5 -3D -57 -95 -97 -95 -ENDCHAR -STARTCHAR 6E5B -ENCODING 28251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -7F80 -1100 -9E00 -9E00 -1100 -7F80 -AB00 -A800 -9F80 -ENDCHAR -STARTCHAR 6E5C -ENCODING 28252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5100 -9F00 -9F00 -3F80 -4400 -9700 -B400 -AF80 -ENDCHAR -STARTCHAR 6E5E -ENCODING 28254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4700 -0400 -9F00 -DF00 -2100 -5F00 -5F00 -9A00 -A180 -ENDCHAR -STARTCHAR 6E5F -ENCODING 28255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -1100 -9F00 -5F00 -0000 -7F00 -5F00 -8400 -BF80 -ENDCHAR -STARTCHAR 6E67 -ENCODING 28263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -4A -BF -BF -3F -44 -BF -89 -B3 -ENDCHAR -STARTCHAR 6E6B -ENCODING 28267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9A00 -7200 -1680 -BE80 -9700 -3A00 -7B00 -9500 -9500 -9480 -ENDCHAR -STARTCHAR 6E6E -ENCODING 28270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -4A00 -BF00 -6B00 -3F00 -4400 -5F00 -8400 -BF80 -ENDCHAR -STARTCHAR 6E6F -ENCODING 28271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5100 -9F00 -8000 -3F80 -5F00 -AB00 -B500 -8B00 -ENDCHAR -STARTCHAR 6E72 -ENCODING 28274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -83 -5D -25 -9F -3F -4F -5A -A6 -B9 -ENDCHAR -STARTCHAR 6E73 -ENCODING 28275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -0400 -9F00 -AA80 -2E80 -6E80 -6480 -A480 -A500 -ENDCHAR -STARTCHAR 6E7A -ENCODING 28282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9F00 -5900 -2900 -AF00 -A200 -2F80 -6600 -6B00 -AA80 -A200 -ENDCHAR -STARTCHAR 6E90 -ENCODING 28304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -6400 -2F00 -AF00 -2900 -6F00 -6D00 -AD00 -D480 -ENDCHAR -STARTCHAR 6E96 -ENCODING 28310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -5F00 -B400 -3F00 -5F00 -9F00 -0800 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 6E9C -ENCODING 28316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -8F -7B -3D -A7 -1F -65 -5F -9F -A1 -ENDCHAR -STARTCHAR 6E9D -ENCODING 28317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -7F00 -3F00 -BF80 -8400 -1F00 -7F80 -A580 -9F00 -9300 -ENDCHAR -STARTCHAR 6E9F -ENCODING 28319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF00 -6080 -3F00 -9100 -9F00 -1F00 -7F80 -4000 -9300 -A180 -ENDCHAR -STARTCHAR 6EA2 -ENCODING 28322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8E00 -5300 -3F00 -8E00 -1200 -6100 -BF00 -AD00 -BF80 -ENDCHAR -STARTCHAR 6EA5 -ENCODING 28325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8500 -7F80 -1F00 -A500 -5F00 -1F00 -4200 -BF80 -8A00 -8600 -ENDCHAR -STARTCHAR 6EAA -ENCODING 28330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -6500 -AE80 -5500 -0F00 -7E00 -BF80 -9A00 -E180 -ENDCHAR -STARTCHAR 6EAB -ENCODING 28331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5500 -1D00 -9F00 -0000 -7F00 -6B00 -AB00 -BF80 -ENDCHAR -STARTCHAR 6EAF -ENCODING 28335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -AB -6B -3B -BB -3B -7B -95 -95 -A7 -ENDCHAR -STARTCHAR 6EB1 -ENCODING 28337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -1F00 -8A00 -BF80 -1F00 -7F80 -8C00 -9600 -A500 -ENDCHAR -STARTCHAR 6EB6 -ENCODING 28342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -2A80 -9100 -AC00 -1300 -7F80 -5100 -9100 -9F00 -ENDCHAR -STARTCHAR 6EBA -ENCODING 28346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -49 -BF -A4 -3F -6D -BB -CD -9B -ENDCHAR -STARTCHAR 6EC2 -ENCODING 28354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -84 -7F -12 -BF -A5 -3F -48 -8F -91 -A6 -ENDCHAR -STARTCHAR 6EC4 -ENCODING 28356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8C00 -4B00 -1F80 -BF00 -9100 -1F00 -5F00 -7F00 -B100 -BF00 -ENDCHAR -STARTCHAR 6EC5 -ENCODING 28357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -4300 -3F80 -BC00 -AB00 -2F00 -AB00 -AA00 -D680 -D580 -ENDCHAR -STARTCHAR 6EC9 -ENCODING 28361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5F00 -1100 -DF00 -1500 -7F80 -4A00 -9280 -A300 -ENDCHAR -STARTCHAR 6ECB -ENCODING 28363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F80 -1200 -9200 -AA00 -2D00 -5200 -9B00 -BB00 -E680 -ENDCHAR -STARTCHAR 6ECC -ENCODING 28364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -6780 -3D00 -B600 -FD80 -7200 -7F80 -B300 -A680 -AA00 -ENDCHAR -STARTCHAR 6ECE -ENCODING 28366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B680 -DB00 -6700 -9900 -FF00 -8900 -6A00 -2C00 -4A00 -9100 -ENDCHAR -STARTCHAR 6ED1 -ENCODING 28369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5700 -9500 -7F80 -3F80 -5F00 -5100 -9F00 -9300 -ENDCHAR -STARTCHAR 6ED3 -ENCODING 28371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -84 -7F -25 -9F -92 -3F -44 -BF -84 -84 -ENDCHAR -STARTCHAR 6ED4 -ENCODING 28372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8300 -5D00 -2480 -A000 -1B00 -6100 -9B00 -A100 -9F00 -ENDCHAR -STARTCHAR 6EEF -ENCODING 28399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9E00 -7F00 -2E80 -AD80 -BF00 -2480 -5F00 -A500 -A700 -8400 -ENDCHAR -STARTCHAR 6EF4 -ENCODING 28404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -0A00 -BF00 -A500 -3F00 -6F00 -6F00 -AB00 -A300 -ENDCHAR -STARTCHAR 6EF8 -ENCODING 28408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BC00 -4400 -3F80 -BE00 -8200 -3F80 -7A00 -AA00 -BA00 -AA00 -ENDCHAR -STARTCHAR 6EFE -ENCODING 28414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -1200 -BF80 -9100 -1E00 -5500 -7300 -9D00 -B080 -ENDCHAR -STARTCHAR 6EFF -ENCODING 28415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F80 -1E00 -8400 -BF00 -3700 -7700 -BF00 -BD00 -A500 -ENDCHAR -STARTCHAR 6F01 -ENCODING 28417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -5E00 -1400 -BF00 -A500 -1F00 -5F00 -4000 -AB00 -AA80 -ENDCHAR -STARTCHAR 6F02 -ENCODING 28418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -4A00 -1F00 -9F00 -1F00 -4000 -BF80 -9500 -AC80 -ENDCHAR -STARTCHAR 6F06 -ENCODING 28422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -1C00 -A700 -8D80 -1E00 -7580 -8E00 -B700 -8D00 -ENDCHAR -STARTCHAR 6F0F -ENCODING 28431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6080 -BF00 -BF80 -3F00 -7E80 -B480 -BE80 -D500 -ENDCHAR -STARTCHAR 6F11 -ENCODING 28433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -7700 -2D00 -B600 -AF00 -3200 -7200 -B600 -AE80 -AB00 -ENDCHAR -STARTCHAR 6F14 -ENCODING 28436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -3F00 -8400 -5F00 -2500 -5F00 -5F00 -9200 -A180 -ENDCHAR -STARTCHAR 6F15 -ENCODING 28437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -7F80 -3F00 -AB00 -BF00 -0000 -5F00 -5100 -9F00 -9100 -ENDCHAR -STARTCHAR 6F20 -ENCODING 28448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -7F80 -1F00 -A100 -9F00 -1F00 -7F80 -8C00 -9B00 -A180 -ENDCHAR -STARTCHAR 6F22 -ENCODING 28450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F80 -1E00 -9F00 -A500 -1F00 -7F00 -BF80 -8E00 -B180 -ENDCHAR -STARTCHAR 6F23 -ENCODING 28451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -A200 -6F80 -2F00 -AB00 -0F00 -6F00 -AF80 -A200 -DF80 -ENDCHAR -STARTCHAR 6F2B -ENCODING 28459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5F00 -9F00 -BF00 -3F00 -4000 -BF00 -8C00 -B380 -ENDCHAR -STARTCHAR 6F2C -ENCODING 28460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -0400 -BF80 -5F00 -1100 -5F00 -9F00 -9200 -A180 -ENDCHAR -STARTCHAR 6F31 -ENCODING 28465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7A00 -1380 -BA80 -B700 -3A00 -5200 -BB00 -D500 -9480 -ENDCHAR -STARTCHAR 6F32 -ENCODING 28466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -B700 -5400 -1700 -B700 -2F00 -7600 -9700 -9700 -BC80 -ENDCHAR -STARTCHAR 6F38 -ENCODING 28472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -7A00 -1400 -BC00 -BB80 -3D00 -7D00 -FD00 -9500 -9500 -ENDCHAR -STARTCHAR 6F3F -ENCODING 28479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -BF00 -FC00 -FF80 -A900 -AA00 -E900 -2E00 -4E00 -9980 -ENDCHAR -STARTCHAR 6F41 -ENCODING 28481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -AF80 -D400 -EF00 -0F00 -5900 -AF00 -DF00 -D500 -4880 -ENDCHAR -STARTCHAR 6F51 -ENCODING 28497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BD00 -6A00 -1100 -B700 -CE80 -3500 -7700 -8D00 -9300 -B580 -ENDCHAR -STARTCHAR 6F54 -ENCODING 28500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9F00 -7280 -3A80 -B700 -8A00 -1C00 -7D00 -8700 -9500 -A480 -ENDCHAR -STARTCHAR 6F57 -ENCODING 28503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -5F00 -3F00 -A700 -9F00 -0400 -7F00 -4C00 -9700 -A480 -ENDCHAR -STARTCHAR 6F58 -ENCODING 28504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8300 -7E00 -BF80 -8E00 -1F00 -6580 -9F00 -9500 -9F00 -ENDCHAR -STARTCHAR 6F5A -ENCODING 28506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -3F80 -BF00 -6F00 -3700 -7F00 -B700 -AF00 -CF00 -ENDCHAR -STARTCHAR 6F5B -ENCODING 28507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -7500 -BF80 -BA80 -5580 -5F00 -9F00 -9F00 -A100 -ENDCHAR -STARTCHAR 6F5E -ENCODING 28510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B400 -5700 -5500 -BB00 -9200 -5500 -D780 -D500 -D700 -E500 -ENDCHAR -STARTCHAR 6F5F -ENCODING 28511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -BF -61 -3F -A1 -BF -1F -63 -9D -AD -A3 -ENDCHAR -STARTCHAR 6F62 -ENCODING 28514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F80 -0E00 -BF80 -4400 -1F00 -5F00 -5F00 -9A00 -A180 -ENDCHAR -STARTCHAR 6F64 -ENCODING 28516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -6D -3F -BF -3F -65 -BF -BF -A3 -ENDCHAR -STARTCHAR 6F6D -ENCODING 28525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -7F00 -3F00 -8000 -1F00 -6100 -9F00 -BF80 -8400 -ENDCHAR -STARTCHAR 6F6E -ENCODING 28526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -93 -7B -13 -BB -BB -2B -7B -BD -95 -95 -ENDCHAR -STARTCHAR 6F70 -ENCODING 28528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -1F00 -BF80 -5F00 -1F00 -5F00 -5F00 -9200 -B180 -ENDCHAR -STARTCHAR 6F7A -ENCODING 28538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -7F00 -2F00 -A200 -3F80 -6000 -A900 -CF80 -DB00 -ENDCHAR -STARTCHAR 6F7C -ENCODING 28540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -3F80 -8000 -9F00 -1F00 -5F00 -BF00 -8400 -BF80 -ENDCHAR -STARTCHAR 6F7D -ENCODING 28541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F00 -1B00 -9B00 -BF80 -1F00 -5100 -9F00 -9F00 -9100 -ENDCHAR -STARTCHAR 6F7E -ENCODING 28542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9500 -5600 -3F80 -8E00 -7580 -1900 -6F80 -9F80 -9100 -A100 -ENDCHAR -STARTCHAR 6F81 -ENCODING 28545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5700 -1400 -BF80 -4000 -1100 -7D80 -B500 -BD00 -E780 -ENDCHAR -STARTCHAR 6F84 -ENCODING 28548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9D00 -6A00 -1300 -AF80 -1F00 -5F00 -4000 -9200 -BF80 -ENDCHAR -STARTCHAR 6F88 -ENCODING 28552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7A00 -2B80 -BB00 -8700 -3F00 -7B00 -B900 -AB00 -AC80 -ENDCHAR -STARTCHAR 6F8D -ENCODING 28557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -7900 -3F80 -8100 -BD00 -2B00 -7900 -A900 -A900 -B300 -ENDCHAR -STARTCHAR 6F8E -ENCODING 28558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -BF00 -3A00 -8080 -B900 -3A00 -4080 -A900 -8E00 -B400 -ENDCHAR -STARTCHAR 6F90 -ENCODING 28560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -7F80 -2480 -9F00 -0000 -5F00 -7F80 -8B00 -BC80 -ENDCHAR -STARTCHAR 6F94 -ENCODING 28564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -6600 -3700 -BA00 -BF80 -3000 -5700 -B480 -B700 -A480 -ENDCHAR -STARTCHAR 6F97 -ENCODING 28567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -7F -2D -BF -3F -5F -BF -B3 -A3 -ENDCHAR -STARTCHAR 6FA3 -ENCODING 28579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7B00 -1500 -BC80 -BF00 -2A00 -7F80 -FA00 -9200 -9200 -ENDCHAR -STARTCHAR 6FA4 -ENCODING 28580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6A80 -BF00 -5F00 -3F80 -7380 -7C00 -9F00 -8400 -ENDCHAR -STARTCHAR 6FA7 -ENCODING 28583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8C00 -7F00 -3F00 -BF00 -8000 -3F80 -7F00 -BF00 -9200 -BF80 -ENDCHAR -STARTCHAR 6FAE -ENCODING 28590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8C00 -5F00 -2080 -BF00 -AF00 -3F00 -5F00 -9100 -9F00 -9F00 -ENDCHAR -STARTCHAR 6FAF -ENCODING 28591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -5F00 -3B00 -EA00 -5500 -3680 -7F80 -8C00 -9700 -A580 -ENDCHAR -STARTCHAR 6FB1 -ENCODING 28593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BB00 -4B00 -3D80 -AD80 -3F00 -AB00 -BA00 -DB00 -E480 -ENDCHAR -STARTCHAR 6FB3 -ENCODING 28595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -3F00 -BF00 -6D00 -3700 -4400 -BF80 -9A00 -A180 -ENDCHAR -STARTCHAR 6FB9 -ENCODING 28601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -7E00 -3F80 -B800 -AF00 -3F80 -6F00 -A000 -AF00 -CF00 -ENDCHAR -STARTCHAR 6FBE -ENCODING 28606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A200 -5F00 -0F80 -A500 -5F00 -2F00 -6200 -AF80 -B200 -AF80 -ENDCHAR -STARTCHAR 6FC0 -ENCODING 28608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7A00 -3B80 -BD00 -9500 -7F00 -A300 -B900 -AB00 -DC80 -ENDCHAR -STARTCHAR 6FC1 -ENCODING 28609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -6D -3F -9F -29 -7F -BF -BB -83 -ENDCHAR -STARTCHAR 6FC2 -ENCODING 28610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -3C00 -BF80 -BF00 -3F80 -BF00 -DB00 -EA80 -CA00 -ENDCHAR -STARTCHAR 6FC3 -ENCODING 28611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -7F00 -3F00 -BF00 -BF80 -2000 -7F00 -BF80 -AF00 -D980 -ENDCHAR -STARTCHAR 6FCA -ENCODING 28618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5700 -3F80 -8300 -BF80 -3E00 -7F00 -AE00 -AA80 -D500 -ENDCHAR -STARTCHAR 6FD5 -ENCODING 28629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -6100 -1F00 -9F00 -2700 -5B00 -BF80 -AD00 -CA80 -ENDCHAR -STARTCHAR 6FDA -ENCODING 28634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9900 -7F00 -1B00 -AC80 -BF00 -2480 -7F00 -4C00 -9700 -A480 -ENDCHAR -STARTCHAR 6FDF -ENCODING 28639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF80 -4000 -3B00 -B700 -B780 -1100 -5F00 -BF00 -A100 -A100 -ENDCHAR -STARTCHAR 6FE0 -ENCODING 28640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF80 -4000 -1F00 -9F00 -BF80 -3F80 -5B00 -6700 -9D00 -AC80 -ENDCHAR -STARTCHAR 6FE1 -ENCODING 28641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -7F80 -3F80 -9F00 -0000 -7F80 -BF00 -AB00 -AB00 -ENDCHAR -STARTCHAR 6FE4 -ENCODING 28644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -0000 -BF80 -BF00 -0000 -7F80 -BF80 -AD00 -BB00 -ENDCHAR -STARTCHAR 6FE9 -ENCODING 28649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -7F80 -1C00 -A700 -BF00 -1F00 -4000 -BF00 -8C00 -B380 -ENDCHAR -STARTCHAR 6FEB -ENCODING 28651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BA00 -7380 -BC00 -7800 -3B80 -4000 -BF00 -AB00 -BF80 -ENDCHAR -STARTCHAR 6FEC -ENCODING 28652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -2080 -BF00 -6B00 -1E00 -7180 -5F00 -9F00 -9100 -ENDCHAR -STARTCHAR 6FEF -ENCODING 28655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -5A80 -BF00 -BC80 -1F00 -6400 -BF00 -9C00 -9F80 -ENDCHAR -STARTCHAR 6FF1 -ENCODING 28657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -3F00 -9700 -6E00 -3F00 -5100 -5F00 -9A00 -A180 -ENDCHAR -STARTCHAR 6FFE -ENCODING 28670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -4F00 -3F80 -BD00 -AF00 -3500 -7F00 -AE00 -DD00 -EE80 -ENDCHAR -STARTCHAR 7001 -ENCODING 28673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F00 -1F00 -8400 -BF80 -1100 -7E80 -5E00 -9500 -BF00 -ENDCHAR -STARTCHAR 7005 -ENCODING 28677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BE80 -5F00 -1300 -AD00 -BF80 -3F80 -4400 -9F00 -8600 -BF00 -ENDCHAR -STARTCHAR 7006 -ENCODING 28678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -0000 -BF00 -7F00 -1F00 -6100 -7F00 -9E00 -B380 -ENDCHAR -STARTCHAR 7009 -ENCODING 28681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -3F80 -9100 -9F00 -1F00 -5F00 -AE80 -AF00 -A300 -ENDCHAR -STARTCHAR 700B -ENCODING 28683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -3E80 -9600 -FF00 -1600 -7F80 -9500 -9F00 -9F00 -ENDCHAR -STARTCHAR 700F -ENCODING 28687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -9D -AF -5F -FF -93 -2B -BF -FF -BD -F1 -ENDCHAR -STARTCHAR 7011 -ENCODING 28689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5F00 -1F00 -8A00 -3F00 -7F80 -B680 -9E00 -BD00 -ENDCHAR -STARTCHAR 7015 -ENCODING 28693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9780 -7A00 -3700 -BF00 -3500 -7F00 -DF00 -9500 -A480 -ENDCHAR -STARTCHAR 7018 -ENCODING 28696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -4E00 -3F00 -BD80 -BF00 -3F00 -7500 -AA00 -DF00 -FF80 -ENDCHAR -STARTCHAR 701A -ENCODING 28698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A200 -F700 -2500 -B580 -B500 -5500 -BA80 -FD00 -AA80 -A500 -ENDCHAR -STARTCHAR 701B -ENCODING 28699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -7F80 -0000 -BF00 -BF00 -2B00 -AF00 -D700 -FF80 -ED80 -ENDCHAR -STARTCHAR 701C -ENCODING 28700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BA00 -4200 -3B00 -BE80 -8680 -3E80 -DB00 -BB00 -DB80 -CE80 -ENDCHAR -STARTCHAR 701D -ENCODING 28701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6900 -BB00 -BF00 -2D80 -A900 -D400 -D700 -FF80 -ENDCHAR -STARTCHAR 701E -ENCODING 28702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -BF00 -3A80 -F800 -8700 -3F80 -DF00 -BB00 -CA00 -DE00 -ENDCHAR -STARTCHAR 701F -ENCODING 28703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7F80 -3F00 -BF80 -BF00 -3700 -7700 -BF00 -B700 -D700 -ENDCHAR -STARTCHAR 7023 -ENCODING 28707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -5F00 -3B00 -D300 -A480 -0C00 -7B00 -BB00 -8C00 -BF80 -ENDCHAR -STARTCHAR 7027 -ENCODING 28711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -7B80 -2B00 -B880 -BB00 -2B00 -7B00 -BB00 -AC80 -BB00 -ENDCHAR -STARTCHAR 7028 -ENCODING 28712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9700 -BA80 -1500 -BF00 -BD00 -3F00 -5700 -BF00 -DD00 -9480 -ENDCHAR -STARTCHAR 702F -ENCODING 28719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9A80 -7F00 -1300 -AD00 -BF80 -3F80 -5F00 -7F00 -A100 -BF00 -ENDCHAR -STARTCHAR 7037 -ENCODING 28727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -7B00 -AF00 -BF00 -3F00 -7F00 -BF00 -BF80 -B300 -ENDCHAR -STARTCHAR 703E -ENCODING 28734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -7F -2D -BF -3F -7B -BF -B7 -A5 -ENDCHAR -STARTCHAR 704C -ENCODING 28748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF80 -4A00 -3B00 -BB00 -9000 -1F00 -7F00 -A700 -9C00 -9F80 -ENDCHAR -STARTCHAR 7050 -ENCODING 28752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BE80 -7F00 -1B00 -AD00 -BF80 -0A00 -7F00 -BF00 -9600 -BF00 -ENDCHAR -STARTCHAR 7051 -ENCODING 28753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -7F00 -3E80 -BF80 -3F00 -7F00 -BB00 -BA80 -D300 -ENDCHAR -STARTCHAR 7058 -ENCODING 28760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AB00 -FD00 -3780 -BD00 -DF00 -3D00 -BF00 -FD00 -B780 -CC00 -ENDCHAR -STARTCHAR 705D -ENCODING 28765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -7A00 -3F00 -FF00 -0500 -7F00 -BF00 -BB00 -F480 -ENDCHAR -STARTCHAR 7063 -ENCODING 28771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AD00 -6F00 -3180 -EF00 -FF80 -0000 -7F00 -BF00 -8100 -8300 -ENDCHAR -STARTCHAR 706B -ENCODING 28779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -49 -49 -5A -9A -14 -26 -43 -81 -ENDCHAR -STARTCHAR 7070 -ENCODING 28784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -FF80 -4800 -4800 -5900 -6E00 -6C00 -9200 -B300 -C100 -ENDCHAR -STARTCHAR 7078 -ENCODING 28792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -3C -44 -98 -66 -C9 -4A -5C -66 -C1 -ENDCHAR -STARTCHAR 707C -ENCODING 28796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -48 -EF -D1 -D1 -4F -41 -61 -A1 -87 -ENDCHAR -STARTCHAR 707D -ENCODING 28797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4900 -5200 -5200 -2900 -4900 -5A00 -1400 -6200 -8180 -ENDCHAR -STARTCHAR 7085 -ENCODING 28805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4100 -7E00 -7E00 -4900 -4A00 -9A00 -6600 -C180 -ENDCHAR -STARTCHAR 708A -ENCODING 28810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -EF00 -ED00 -D500 -4400 -4A00 -AA00 -B100 -A080 -ENDCHAR -STARTCHAR 708E -ENCODING 28814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -4A -5A -66 -C9 -4A -5A -54 -63 -80 -ENDCHAR -STARTCHAR 7092 -ENCODING 28818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4500 -ED00 -ED00 -D480 -5500 -4D00 -A200 -AC00 -B000 -ENDCHAR -STARTCHAR 7098 -ENCODING 28824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -4C00 -E800 -EF80 -CA00 -4A00 -5200 -B200 -B200 -A200 -ENDCHAR -STARTCHAR 7099 -ENCODING 28825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -3F00 -7600 -A800 -7900 -CA00 -4A00 -5400 -6200 -C180 -ENDCHAR -STARTCHAR 709A -ENCODING 28826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -B480 -B500 -F500 -A600 -AA00 -E900 -B100 -1080 -ENDCHAR -STARTCHAR 70A1 -ENCODING 28833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -E200 -EA00 -CB00 -4A00 -4A00 -6A00 -AA00 -9F80 -ENDCHAR -STARTCHAR 70A4 -ENCODING 28836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -45 -E9 -C9 -D3 -5F -51 -B1 -BF -91 -ENDCHAR -STARTCHAR 70AB -ENCODING 28843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2200 -2200 -7FC0 -6200 -AC80 -2500 -2280 -5280 -55C0 -4E40 -ENDCHAR -STARTCHAR 70AC -ENCODING 28844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5000 -F000 -CF00 -D100 -5100 -4F00 -B000 -B000 -9F80 -ENDCHAR -STARTCHAR 70AD -ENCODING 28845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -89 -89 -FF -FF -88 -A9 -AA -B6 -B2 -C1 -ENDCHAR -STARTCHAR 70AF -ENCODING 28847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -51 -F1 -F7 -DB -5B -57 -BB -B1 -93 -ENDCHAR -STARTCHAR 70B3 -ENCODING 28851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4400 -E400 -DF00 -D500 -5B00 -7900 -B100 -9100 -9300 -ENDCHAR -STARTCHAR 70B7 -ENCODING 28855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4200 -FF00 -C400 -C400 -5F00 -4400 -6400 -A400 -9F80 -ENDCHAR -STARTCHAR 70B8 -ENCODING 28856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -EF80 -D400 -D700 -4400 -4780 -6400 -9400 -8400 -ENDCHAR -STARTCHAR 70B9 -ENCODING 28857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -0F00 -1000 -1000 -7E00 -4100 -7E00 -8000 -A500 -A480 -ENDCHAR -STARTCHAR 70C8 -ENCODING 28872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4500 -7500 -9500 -D500 -6100 -8300 -4500 -9500 -9480 -ENDCHAR -STARTCHAR 70CB -ENCODING 28875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -4400 -FF00 -CE00 -5500 -6480 -4400 -6500 -9500 -9480 -ENDCHAR -STARTCHAR 70CF -ENCODING 28879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4200 -7E00 -4000 -7F80 -7F00 -8D00 -AB00 -A300 -ENDCHAR -STARTCHAR 70D8 -ENCODING 28888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4A00 -FF00 -CA00 -CA00 -4A00 -5F80 -AA00 -B100 -9080 -ENDCHAR -STARTCHAR 70D9 -ENCODING 28889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -FA00 -D600 -CF00 -5980 -4F00 -B100 -AF00 -9100 -ENDCHAR -STARTCHAR 70DD -ENCODING 28893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -0400 -ED00 -2E00 -4B00 -9900 -7E00 -9500 -9480 -ENDCHAR -STARTCHAR 70DF -ENCODING 28895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -55 -F5 -DF -D5 -55 -5B -B9 -BF -91 -ENDCHAR -STARTCHAR 70F1 -ENCODING 28913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -57 -FB -DB -D1 -5F -5B -BF -99 -93 -ENDCHAR -STARTCHAR 70F9 -ENCODING 28921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7E00 -7E00 -0000 -FF00 -0800 -1900 -A500 -A480 -ENDCHAR -STARTCHAR 70FD -ENCODING 28925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6F00 -F600 -CE00 -D580 -5F00 -4F00 -BF80 -A400 -8400 -ENDCHAR -STARTCHAR 7104 -ENCODING 28932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -FF80 -1200 -7E00 -7F00 -A100 -3F00 -A500 -9480 -ENDCHAR -STARTCHAR 7109 -ENCODING 28937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -2E -28 -FF -3F -7F -01 -AD -A3 -ENDCHAR -STARTCHAR 710C -ENCODING 28940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4900 -FE00 -CA80 -D700 -4800 -5F00 -BA00 -A600 -9980 -ENDCHAR -STARTCHAR 7119 -ENCODING 28953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -E900 -CA00 -DF80 -4000 -4F00 -B100 -AF00 -9100 -ENDCHAR -STARTCHAR 711A -ENCODING 28954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FF00 -6600 -BB00 -A280 -4900 -4A00 -9A00 -2600 -C100 -ENDCHAR -STARTCHAR 711E -ENCODING 28958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4000 -FF00 -DF00 -C000 -5F00 -4600 -BF80 -A400 -8C00 -ENDCHAR -STARTCHAR 7121 -ENCODING 28961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F00 -D600 -D600 -FF80 -5600 -FF00 -4100 -A500 -9480 -ENDCHAR -STARTCHAR 7126 -ENCODING 28966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -7F -C8 -FF -4F -78 -7F -00 -65 -95 -ENDCHAR -STARTCHAR 7130 -ENCODING 28976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -4F -E9 -D3 -DC -5B -51 -BB -BF -91 -ENDCHAR -STARTCHAR 7136 -ENCODING 28982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -7500 -5F80 -A400 -2600 -4900 -9080 -5500 -9500 -9480 -ENDCHAR -STARTCHAR 7147 -ENCODING 28999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -6480 -FF00 -DF00 -D500 -5F00 -5F00 -BF80 -8400 -8400 -ENDCHAR -STARTCHAR 7149 -ENCODING 29001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -E400 -DF00 -DE80 -5480 -5F00 -BD00 -A480 -8400 -ENDCHAR -STARTCHAR 714A -ENCODING 29002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -EF00 -C000 -DF00 -5100 -5F00 -DF00 -A000 -BF80 -ENDCHAR -STARTCHAR 714C -ENCODING 29004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F100 -FF00 -DF00 -4000 -5F00 -DF00 -A400 -BF80 -ENDCHAR -STARTCHAR 714E -ENCODING 29006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0100 -F500 -F500 -B500 -9100 -9100 -A500 -9480 -ENDCHAR -STARTCHAR 7150 -ENCODING 29008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -EE00 -DF00 -D500 -5500 -5F80 -6400 -BB00 -B080 -ENDCHAR -STARTCHAR 7156 -ENCODING 29014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -5F00 -F480 -DF00 -C800 -5F80 -4F00 -B500 -9700 -A980 -ENDCHAR -STARTCHAR 7159 -ENCODING 29017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4600 -FF00 -DB00 -D900 -5F00 -5F00 -A400 -A400 -9F80 -ENDCHAR -STARTCHAR 715C -ENCODING 29020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -DF00 -C400 -5F00 -4900 -AA00 -AA00 -9F80 -ENDCHAR -STARTCHAR 715E -ENCODING 29022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F400 -AF80 -FD00 -1200 -FF00 -FD80 -6900 -9500 -9480 -ENDCHAR -STARTCHAR 7164 -ENCODING 29028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -5F80 -EE00 -D200 -CE00 -5F00 -4C00 -B700 -A480 -8400 -ENDCHAR -STARTCHAR 7165 -ENCODING 29029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2400 -2F00 -7900 -7F80 -AD80 -2A80 -3FC0 -6200 -5580 -58C0 -ENDCHAR -STARTCHAR 7166 -ENCODING 29030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF00 -B100 -EF00 -AB00 -EF00 -A300 -4900 -9500 -9480 -ENDCHAR -STARTCHAR 7167 -ENCODING 29031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -A500 -FB00 -AF00 -A900 -EF00 -0000 -A500 -9480 -ENDCHAR -STARTCHAR 7169 -ENCODING 29033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4400 -EF00 -D100 -CF00 -5100 -4F00 -6F00 -AB00 -9180 -ENDCHAR -STARTCHAR 716C -ENCODING 29036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -DF00 -DF80 -4800 -5F00 -4B00 -B500 -8B00 -ENDCHAR -STARTCHAR 716E -ENCODING 29038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7D00 -1200 -FF00 -3E00 -C100 -7F00 -3E00 -A500 -9480 -ENDCHAR -STARTCHAR 717D -ENCODING 29053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -50 -FF -DF -D0 -5F -5D -F7 -BF -AD -ENDCHAR -STARTCHAR 7184 -ENCODING 29060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F100 -FF00 -DF00 -5F00 -4400 -DB00 -9900 -AE80 -ENDCHAR -STARTCHAR 7189 -ENCODING 29065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -EF00 -DF00 -D100 -5F00 -5F00 -7F00 -AA00 -9180 -ENDCHAR -STARTCHAR 718A -ENCODING 29066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -7600 -CC80 -F700 -F500 -9680 -F700 -2000 -9500 -9480 -ENDCHAR -STARTCHAR 718F -ENCODING 29071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -FF00 -7F00 -6D00 -7F00 -7F00 -FF80 -9500 -9480 -ENDCHAR -STARTCHAR 7192 -ENCODING 29074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BA80 -DB00 -6700 -9900 -FF00 -8B00 -5200 -5A00 -2600 -C180 -ENDCHAR -STARTCHAR 7194 -ENCODING 29076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -EA80 -D100 -DE00 -5100 -7F80 -D100 -B100 -9F00 -ENDCHAR -STARTCHAR 7199 -ENCODING 29081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -A900 -F700 -F800 -A880 -F700 -4900 -A500 -9480 -ENDCHAR -STARTCHAR 719F -ENCODING 29087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -0F00 -F500 -6500 -E500 -F780 -4980 -8500 -A500 -9480 -ENDCHAR -STARTCHAR 71A2 -ENCODING 29090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5400 -5F00 -E600 -DD80 -C200 -7F00 -5700 -5F80 -B200 -AF80 -ENDCHAR -STARTCHAR 71AC -ENCODING 29100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -F900 -FD00 -7200 -9500 -B880 -4500 -9500 -9480 -ENDCHAR -STARTCHAR 71B1 -ENCODING 29105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF00 -F500 -6500 -F500 -4580 -F980 -4100 -9500 -9480 -ENDCHAR -STARTCHAR 71B9 -ENCODING 29113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0000 -7E00 -7E00 -FF80 -7E00 -7E00 -A500 -9480 -ENDCHAR -STARTCHAR 71BA -ENCODING 29114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -FF00 -DF00 -D100 -4E00 -7F80 -BF00 -9F00 -9100 -ENDCHAR -STARTCHAR 71BE -ENCODING 29118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F00 -D600 -FF80 -C200 -5F00 -5F00 -BE00 -9780 -0580 -ENDCHAR -STARTCHAR 71C1 -ENCODING 29121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -7F80 -E000 -DF00 -FF80 -5500 -5F00 -DF80 -8400 -8400 -ENDCHAR -STARTCHAR 71C3 -ENCODING 29123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -5F00 -D780 -EA00 -DB00 -4D00 -5480 -A000 -9B00 -AA80 -ENDCHAR -STARTCHAR 71C8 -ENCODING 29128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5D00 -4A00 -FB00 -DF00 -E080 -5F00 -7F00 -AA00 -8A00 -BF80 -ENDCHAR -STARTCHAR 71C9 -ENCODING 29129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -7E00 -BB80 -E700 -BF00 -7F00 -5300 -FD00 -D300 -1480 -ENDCHAR -STARTCHAR 71CE -ENCODING 29134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -FB00 -FF00 -F180 -5F00 -5F00 -AE00 -9500 -AC80 -ENDCHAR -STARTCHAR 71D0 -ENCODING 29136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -4D00 -FF80 -CE00 -D580 -5900 -7B80 -CF80 -B100 -A100 -ENDCHAR -STARTCHAR 71D2 -ENCODING 29138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FF00 -D200 -FB00 -7780 -7F80 -CA00 -B280 -A300 -ENDCHAR -STARTCHAR 71D4 -ENCODING 29140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -ED00 -DF80 -CD00 -5F80 -5500 -BF00 -BF00 -9100 -ENDCHAR -STARTCHAR 71D5 -ENCODING 29141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3C00 -4300 -DB00 -5680 -DB00 -0100 -5500 -9480 -ENDCHAR -STARTCHAR 71DF -ENCODING 29151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -D7 -EB -55 -89 -FF -FF -7E -7F -41 -7F -ENDCHAR -STARTCHAR 71E5 -ENCODING 29157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5100 -EF00 -DB00 -DB00 -4400 -5F80 -EE00 -BD80 -A400 -ENDCHAR -STARTCHAR 71E6 -ENCODING 29158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4B80 -DF00 -EB00 -9480 -6500 -4E00 -DF80 -AE00 -9580 -ENDCHAR -STARTCHAR 71E7 -ENCODING 29159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6300 -5500 -CF00 -D600 -C500 -7B00 -5700 -BA80 -9400 -2F80 -ENDCHAR -STARTCHAR 71ED -ENCODING 29165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -5B -DF -D0 -DF -7F -5B -BF -9F -03 -ENDCHAR -STARTCHAR 71EE -ENCODING 29166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5900 -FD80 -DD00 -BB00 -9A80 -9800 -7E00 -2400 -1800 -E700 -ENDCHAR -STARTCHAR 71FB -ENCODING 29179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -5C00 -FF00 -FF00 -DF00 -5F00 -4700 -BF80 -9B00 -AA80 -ENDCHAR -STARTCHAR 71FC -ENCODING 29180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -DF80 -DF00 -DF80 -5B00 -6A80 -DF00 -BB00 -BF80 -ENDCHAR -STARTCHAR 71FE -ENCODING 29182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF80 -7F00 -FF00 -FF80 -FF00 -F700 -6500 -9480 -ENDCHAR -STARTCHAR 71FF -ENCODING 29183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -5900 -EB00 -DA80 -D200 -5F00 -7F00 -D300 -BC00 -9F80 -ENDCHAR -STARTCHAR 7200 -ENCODING 29184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -BB00 -9200 -D200 -BF80 -AF00 -AF80 -D780 -EB00 -B500 -ENDCHAR -STARTCHAR 7206 -ENCODING 29190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5100 -FF00 -DF00 -DF00 -7F80 -5500 -EE80 -AE00 -BD00 -ENDCHAR -STARTCHAR 7210 -ENCODING 29200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -9F00 -DD00 -AF00 -6F00 -6D00 -AF00 -B700 -3F80 -ENDCHAR -STARTCHAR 721B -ENCODING 29211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5B -5B -ED -DB -A5 -6F -6F -97 -A5 -ENDCHAR -STARTCHAR 722A -ENCODING 29226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0F00 -7200 -4A00 -4A00 -4A00 -4900 -4900 -8900 -8880 -ENDCHAR -STARTCHAR 722C -ENCODING 29228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5800 -B700 -B700 -B700 -B400 -B480 -AF00 -A400 -A380 -ENDCHAR -STARTCHAR 722D -ENCODING 29229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7E00 -8900 -7E00 -FF80 -0A00 -7E00 -0800 -3000 -ENDCHAR -STARTCHAR 7230 -ENCODING 29232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -03 -7E -89 -7E -FF -3E -52 -4C -F3 -ENDCHAR -STARTCHAR 7232 -ENCODING 29234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -06 -7A -FF -42 -7E -7F -47 -B7 -D3 -ENDCHAR -STARTCHAR 7235 -ENCODING 29237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -7D00 -FF00 -7F00 -0100 -FF80 -9100 -E500 -E100 -8300 -ENDCHAR -STARTCHAR 7236 -ENCODING 29238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -4300 -A300 -6400 -6400 -1800 -1800 -6600 -8180 -ENDCHAR -STARTCHAR 723A -ENCODING 29242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2600 -E500 -1C00 -E380 -0000 -F700 -F500 -F500 -F700 -1400 -ENDCHAR -STARTCHAR 723B -ENCODING 29243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C600 -3800 -7600 -E100 -6200 -6400 -1800 -1800 -7600 -C180 -ENDCHAR -STARTCHAR 723D -ENCODING 29245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -AD00 -6A00 -8D00 -8A00 -7D00 -9400 -6200 -8180 -ENDCHAR -STARTCHAR 723E -ENCODING 29246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4A00 -FF80 -D700 -EF00 -9300 -EF00 -D700 -8B00 -ENDCHAR -STARTCHAR 7240 -ENCODING 29248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -A400 -BF00 -E600 -2600 -ED00 -AD00 -B480 -A400 -A400 -ENDCHAR -STARTCHAR 7246 -ENCODING 29254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -DF80 -D500 -DE80 -5F80 -DF00 -DF00 -DB00 -DF00 -D100 -ENDCHAR -STARTCHAR 7247 -ENCODING 29255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -4800 -7F80 -4000 -7C00 -4400 -8400 -8400 -8400 -ENDCHAR -STARTCHAR 7248 -ENCODING 29256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -57C0 -5400 -5400 -7F80 -4680 -7680 -5500 -5500 -5A80 -9C40 -ENDCHAR -STARTCHAR 724C -ENCODING 29260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -AF00 -B500 -EF00 -9500 -EF00 -AA00 -BF80 -A200 -A200 -ENDCHAR -STARTCHAR 7252 -ENCODING 29266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B500 -BF80 -B500 -F700 -8F00 -E400 -BF80 -AE00 -B580 -A400 -ENDCHAR -STARTCHAR 7258 -ENCODING 29272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -DF00 -C000 -FF00 -9F00 -DF00 -DF00 -D100 -CE00 -D980 -ENDCHAR -STARTCHAR 7259 -ENCODING 29273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -2400 -2400 -FF80 -0C00 -1400 -2400 -4400 -8C00 -ENDCHAR -STARTCHAR 725B -ENCODING 29275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -4800 -7F00 -8800 -8800 -FF80 -0800 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 725D -ENCODING 29277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -A800 -F900 -AA00 -2C00 -7800 -E800 -2880 -2880 -2700 -ENDCHAR -STARTCHAR 725F -ENCODING 29279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -2200 -FF00 -4800 -7F00 -8800 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 7261 -ENCODING 29281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -C400 -F400 -CF00 -5400 -6400 -C400 -4400 -4400 -5F80 -ENDCHAR -STARTCHAR 7262 -ENCODING 29282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8900 -2800 -7E00 -4800 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 7267 -ENCODING 29287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -A400 -F780 -A900 -2900 -3600 -E600 -2600 -2D00 -2880 -ENDCHAR -STARTCHAR 7269 -ENCODING 29289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -C8 -EF -D7 -5B -6B -CD -55 -49 -4F -ENDCHAR -STARTCHAR 7272 -ENCODING 29298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -CA00 -EF80 -D200 -D200 -5F00 -E200 -4200 -4200 -5F80 -ENDCHAR -STARTCHAR 7279 -ENCODING 29305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -DF00 -E400 -DF80 -4100 -7F80 -C900 -4900 -4100 -4600 -ENDCHAR -STARTCHAR 727D -ENCODING 29309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -3400 -FF00 -FE80 -0900 -7E00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 7280 -ENCODING 29312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -88 -BF -BF -BF -FF -88 -88 -ENDCHAR -STARTCHAR 7281 -ENCODING 29313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -15 -E5 -FD -75 -A9 -48 -7F -FF -08 -08 -ENDCHAR -STARTCHAR 72A2 -ENCODING 29346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -DF00 -E000 -DF00 -5F00 -7F00 -DF00 -5100 -5F00 -5980 -ENDCHAR -STARTCHAR 72A7 -ENCODING 29351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CA00 -DF00 -FF00 -FF80 -5F00 -FF80 -DF00 -5F00 -4780 -5D00 -ENDCHAR -STARTCHAR 72AC -ENCODING 29356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0C00 -0A00 -0900 -FF00 -0800 -1800 -1400 -2200 -C300 -8080 -ENDCHAR -STARTCHAR 72AF -ENCODING 29359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A000 -6F00 -C900 -C900 -4900 -AB00 -A800 -2800 -2880 -CF00 -ENDCHAR -STARTCHAR 72C0 -ENCODING 29376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A500 -A500 -A400 -FF80 -2400 -E600 -A600 -A900 -A900 -B080 -ENDCHAR -STARTCHAR 72C2 -ENCODING 29378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A000 -5F00 -C400 -C400 -2400 -7F00 -A400 -A400 -2400 -DF80 -ENDCHAR -STARTCHAR 72C4 -ENCODING 29380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -6400 -4C80 -B500 -3500 -6600 -A600 -2900 -2900 -D080 -ENDCHAR -STARTCHAR 72CE -ENCODING 29390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -55 -D5 -DF -55 -BF -B4 -44 -C4 -ENDCHAR -STARTCHAR 72D0 -ENCODING 29392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A300 -5D00 -D500 -D500 -5500 -D500 -D500 -5700 -6E80 -E180 -ENDCHAR -STARTCHAR 72D7 -ENCODING 29399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -A8 -4F -D1 -D1 -6F -D3 -AF -33 -21 -C3 -ENDCHAR -STARTCHAR 72D9 -ENCODING 29401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AF00 -4900 -C900 -CF00 -2900 -E900 -AF00 -2900 -2900 -DF80 -ENDCHAR -STARTCHAR 72E1 -ENCODING 29409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -5F00 -CA00 -D100 -3080 -EA00 -A600 -2400 -3B00 -D080 -ENDCHAR -STARTCHAR 72E9 -ENCODING 29417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -A4 -5F -D1 -C2 -5F -A2 -AA -2A -42 -C6 -ENDCHAR -STARTCHAR 72F8 -ENCODING 29432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -5500 -DF00 -D500 -BF00 -A400 -3F00 -4400 -DF80 -ENDCHAR -STARTCHAR 72F9 -ENCODING 29433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -FF80 -C400 -D500 -5500 -DF00 -EA80 -4A00 -5100 -E080 -ENDCHAR -STARTCHAR 72FC -ENCODING 29436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -4F00 -D100 -CF00 -5100 -AF00 -B500 -3200 -3500 -D880 -ENDCHAR -STARTCHAR 72FD -ENCODING 29437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF00 -5100 -D100 -DF00 -5100 -BF00 -BF00 -2000 -4B00 -D080 -ENDCHAR -STARTCHAR 730A -ENCODING 29450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A800 -5300 -D100 -DB00 -5100 -DF00 -CA00 -4A00 -5280 -E300 -ENDCHAR -STARTCHAR 7316 -ENCODING 29462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -AF -51 -CF -CF -C0 -DF -3F -5F -D1 -ENDCHAR -STARTCHAR 731B -ENCODING 29467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -4200 -DF80 -C400 -4C00 -C000 -5F00 -5B00 -FF80 -ENDCHAR -STARTCHAR 731C -ENCODING 29468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -DF00 -DF00 -DF80 -4000 -DF00 -B500 -3F00 -5100 -D300 -ENDCHAR -STARTCHAR 731D -ENCODING 29469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -5F00 -C900 -CA00 -5B00 -B480 -BF80 -2400 -4400 -C400 -ENDCHAR -STARTCHAR 7325 -ENCODING 29477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -5500 -DF00 -DF00 -4000 -BF80 -3200 -3700 -D980 -ENDCHAR -STARTCHAR 7329 -ENCODING 29481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF00 -5100 -DF00 -DF00 -5400 -DF00 -D400 -4F00 -4400 -DF80 -ENDCHAR -STARTCHAR 732A -ENCODING 29482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -5F00 -C600 -FF80 -4500 -DF00 -D100 -4F00 -4F00 -D100 -ENDCHAR -STARTCHAR 732B -ENCODING 29483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AA00 -5F80 -CA00 -CA00 -5F00 -D500 -DF00 -5500 -5F00 -D100 -ENDCHAR -STARTCHAR 7336 -ENCODING 29494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AE00 -5100 -EF80 -CA00 -5F00 -DB00 -DB00 -5F00 -5F00 -D100 -ENDCHAR -STARTCHAR 7337 -ENCODING 29495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3300 -9280 -FA00 -6780 -F200 -F200 -F200 -F500 -F500 -9880 -ENDCHAR -STARTCHAR 733E -ENCODING 29502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AF00 -5100 -D700 -DF80 -6080 -DF80 -DF00 -5F00 -5100 -D300 -ENDCHAR -STARTCHAR 733F -ENCODING 29503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -5F00 -DF80 -C000 -5F00 -D500 -DB00 -3A00 -4D00 -D880 -ENDCHAR -STARTCHAR 7344 -ENCODING 29508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FA00 -C300 -BA80 -FF80 -4200 -FA00 -C300 -7B00 -7D00 -AC80 -ENDCHAR -STARTCHAR 7345 -ENCODING 29509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D780 -FA00 -AF00 -EE80 -7E80 -E680 -FE80 -6F00 -7A00 -AA00 -ENDCHAR -STARTCHAR 7350 -ENCODING 29520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -5F00 -DF80 -C000 -5F00 -BF00 -B100 -3F80 -4400 -C400 -ENDCHAR -STARTCHAR 7352 -ENCODING 29522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -FD00 -F300 -5480 -B400 -0A00 -1000 -FF00 -C380 -ENDCHAR -STARTCHAR 7357 -ENCODING 29527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -B600 -A780 -FE80 -FF00 -FE00 -7F00 -6B00 -9480 -ENDCHAR -STARTCHAR 7368 -ENCODING 29544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -EB -DF -DF -69 -DF -5F -59 -C3 -ENDCHAR -STARTCHAR 736A -ENCODING 29546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AC00 -5F00 -E080 -DF00 -5F00 -DF00 -DF00 -5100 -5F00 -DF00 -ENDCHAR -STARTCHAR 7370 -ENCODING 29552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -FF00 -FC80 -DF00 -5F00 -DB00 -FF80 -5F00 -4400 -CC00 -ENDCHAR -STARTCHAR 7372 -ENCODING 29554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AA00 -5F80 -D000 -DF00 -7F00 -DF80 -C000 -5F00 -4600 -D980 -ENDCHAR -STARTCHAR 7375 -ENCODING 29557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B500 -D500 -DF00 -EB00 -5F00 -C000 -DF00 -5F00 -5F80 -E580 -ENDCHAR -STARTCHAR 7378 -ENCODING 29560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FA00 -FB00 -0280 -FF80 -FA00 -F200 -FA00 -F500 -9500 -F880 -ENDCHAR -STARTCHAR 737A -ENCODING 29562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9700 -FA80 -9300 -B800 -7B00 -FB00 -D300 -5B00 -7B00 -9480 -ENDCHAR -STARTCHAR 737B -ENCODING 29563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3A00 -FF00 -E280 -BF80 -FA00 -CA00 -B300 -FB00 -FC80 -DC80 -ENDCHAR -STARTCHAR 7384 -ENCODING 29572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -FF00 -1000 -6200 -6400 -1A00 -1100 -2700 -F880 -ENDCHAR -STARTCHAR 7386 -ENCODING 29574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -FF80 -4400 -A500 -A600 -4200 -5500 -7700 -DC80 -ENDCHAR -STARTCHAR 7387 -ENCODING 29575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9100 -7600 -5A00 -9500 -B900 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 7389 -ENCODING 29577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -08 -08 -7F -0C -0A -08 -FF -ENDCHAR -STARTCHAR 738B -ENCODING 29579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -08 -08 -7F -08 -08 -08 -FF -ENDCHAR -STARTCHAR 738E -ENCODING 29582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -4200 -4200 -E200 -4200 -4200 -6200 -C200 -0E00 -ENDCHAR -STARTCHAR 7394 -ENCODING 29588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -11 -F5 -55 -55 -F5 -55 -75 -95 -25 -21 -ENDCHAR -STARTCHAR 7396 -ENCODING 29590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -E800 -4E00 -5200 -F200 -4200 -6600 -C900 -1100 -2080 -ENDCHAR -STARTCHAR 7397 -ENCODING 29591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4400 -4400 -E400 -5F80 -4400 -6400 -C400 -0C00 -ENDCHAR -STARTCHAR 7398 -ENCODING 29592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4100 -4100 -E100 -4F00 -5000 -7000 -D080 -0F00 -ENDCHAR -STARTCHAR 739F -ENCODING 29599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -5F80 -5100 -EA00 -4A00 -6400 -C600 -1B00 -3180 -ENDCHAR -STARTCHAR 73A7 -ENCODING 29607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -4A00 -4900 -5F00 -E000 -4A00 -6A00 -8A00 -1280 -2300 -ENDCHAR -STARTCHAR 73A9 -ENCODING 29609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -4000 -4000 -FF00 -4A00 -6A00 -8A00 -1280 -2300 -ENDCHAR -STARTCHAR 73AD -ENCODING 29613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1200 -F200 -5280 -5B00 -F200 -5200 -5200 -7280 -9A80 -3300 -ENDCHAR -STARTCHAR 73B2 -ENCODING 29618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -EA00 -4900 -5F00 -E080 -5F00 -6900 -8900 -0B00 -0800 -ENDCHAR -STARTCHAR 73B3 -ENCODING 29619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0C00 -ED00 -5200 -5F80 -F200 -7200 -5200 -7200 -9280 -1100 -ENDCHAR -STARTCHAR 73B9 -ENCODING 29625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -5F80 -4400 -F900 -4A00 -6500 -4500 -8B00 -1C80 -ENDCHAR -STARTCHAR 73C0 -ENCODING 29632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -04 -E4 -5F -51 -F1 -5F -71 -D1 -1F -11 -ENDCHAR -STARTCHAR 73C2 -ENCODING 29634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -4100 -4D00 -ED00 -4D00 -4D00 -6D00 -C100 -0300 -ENDCHAR -STARTCHAR 73C9 -ENCODING 29641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5100 -5F00 -F400 -5400 -5F80 -7200 -9E80 -3100 -ENDCHAR -STARTCHAR 73CA -ENCODING 29642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -5B -5B -FB -5F -7B -5B -9B -11 -ENDCHAR -STARTCHAR 73CC -ENCODING 29644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0D00 -E500 -4900 -5900 -FA80 -5C80 -6800 -9900 -3700 -ENDCHAR -STARTCHAR 73CD -ENCODING 29645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -EA00 -5500 -6880 -F200 -4680 -4D00 -7200 -8C00 -1000 -ENDCHAR -STARTCHAR 73CF -ENCODING 29647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -4200 -4200 -4200 -EF00 -4300 -4300 -7200 -DF80 -ENDCHAR -STARTCHAR 73D6 -ENCODING 29654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -F500 -5500 -4D00 -FF00 -4A00 -6A00 -8A00 -1280 -2380 -ENDCHAR -STARTCHAR 73D9 -ENCODING 29657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0A00 -EA00 -5F00 -EA00 -4A00 -7F80 -6A00 -9100 -2080 -ENDCHAR -STARTCHAR 73DD -ENCODING 29661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -45 -4D -F7 -4D -5F -75 -85 -1B -ENDCHAR -STARTCHAR 73DE -ENCODING 29662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF00 -5A00 -5A00 -EE00 -7180 -7F00 -5100 -9F00 -1100 -ENDCHAR -STARTCHAR 73E0 -ENCODING 29664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -F400 -5F00 -5400 -FF80 -4600 -6E00 -9500 -1480 -0400 -ENDCHAR -STARTCHAR 73E3 -ENCODING 29667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -F0 -5F -5D -D5 -5D -75 -5D -91 -07 -ENDCHAR -STARTCHAR 73E4 -ENCODING 29668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF00 -5400 -5400 -FF80 -4400 -5500 -7500 -CF00 -1100 -ENDCHAR -STARTCHAR 73E5 -ENCODING 29669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -4900 -4F00 -E900 -4F00 -6900 -AF80 -0100 -0100 -ENDCHAR -STARTCHAR 73E6 -ENCODING 29670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -04 -FF -51 -5F -FB -5B -5F -7B -91 -13 -ENDCHAR -STARTCHAR 73E9 -ENCODING 29673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -F380 -5800 -4F80 -F100 -5100 -6900 -6900 -8900 -0B00 -ENDCHAR -STARTCHAR 73EA -ENCODING 29674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -5F00 -4400 -FF80 -4400 -4400 -7F00 -8400 -1F80 -ENDCHAR -STARTCHAR 73ED -ENCODING 29677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF80 -5A00 -5A00 -EA00 -6F80 -4A00 -6A00 -9200 -1780 -ENDCHAR -STARTCHAR 73F7 -ENCODING 29687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -FF00 -4200 -7F80 -CA00 -5E00 -5A00 -7900 -9D80 -3980 -ENDCHAR -STARTCHAR 73F9 -ENCODING 29689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0500 -C500 -5F80 -5400 -DB00 -5B00 -5B00 -AA00 -2680 -2500 -ENDCHAR -STARTCHAR 73FD -ENCODING 29693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -5600 -5200 -DF80 -4A00 -5A00 -5700 -9800 -2780 -ENDCHAR -STARTCHAR 73FE -ENCODING 29694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5100 -5F00 -FF00 -5100 -7F00 -8A00 -1A80 -3300 -ENDCHAR -STARTCHAR 7401 -ENCODING 29697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF80 -5000 -6F00 -E500 -4D00 -7700 -5400 -9C00 -2780 -ENDCHAR -STARTCHAR 7403 -ENCODING 29699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -E500 -5F80 -5480 -ED00 -4E00 -4600 -7D00 -9480 -0C00 -ENDCHAR -STARTCHAR 7405 -ENCODING 29701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5100 -5F00 -F100 -5F00 -7500 -5200 -9F00 -3080 -ENDCHAR -STARTCHAR 7406 -ENCODING 29702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5500 -5F00 -F500 -5F00 -4400 -7F00 -8400 -1F80 -ENDCHAR -STARTCHAR 7407 -ENCODING 29703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4400 -5F80 -D580 -5E00 -6A00 -8B00 -1100 -2300 -ENDCHAR -STARTCHAR 7409 -ENCODING 29705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -4A00 -5F00 -E080 -5600 -7600 -9600 -1680 -2580 -ENDCHAR -STARTCHAR 7413 -ENCODING 29715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5080 -4E00 -E000 -5F00 -6A00 -8A00 -1A80 -1300 -ENDCHAR -STARTCHAR 741B -ENCODING 29723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5A80 -4B00 -F400 -5F80 -6600 -8D00 -1480 -2400 -ENDCHAR -STARTCHAR 7420 -ENCODING 29728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -EA00 -5F00 -5B00 -DF00 -5B00 -7F80 -6A00 -9100 -2080 -ENDCHAR -STARTCHAR 7421 -ENCODING 29729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -D700 -8A80 -9300 -FF00 -BB00 -B700 -F500 -1300 -1480 -ENDCHAR -STARTCHAR 7422 -ENCODING 29730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4A00 -5B00 -EA00 -5E00 -6D00 -7500 -A480 -0C00 -ENDCHAR -STARTCHAR 7425 -ENCODING 29733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E700 -5F80 -5680 -FC80 -5700 -7A00 -9A00 -2A80 -3300 -ENDCHAR -STARTCHAR 7426 -ENCODING 29734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -4E00 -5100 -FF80 -4100 -7D00 -9D00 -1500 -0300 -ENDCHAR -STARTCHAR 7428 -ENCODING 29736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5100 -5F00 -FF00 -5200 -5B00 -7300 -9C80 -3380 -ENDCHAR -STARTCHAR 742A -ENCODING 29738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0900 -FF80 -4900 -4F00 -E900 -4F00 -6900 -DF80 -0A00 -3180 -ENDCHAR -STARTCHAR 742B -ENCODING 29739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -4400 -5F00 -DF00 -5500 -6E80 -5F00 -8400 -0400 -ENDCHAR -STARTCHAR 742C -ENCODING 29740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5080 -5F00 -D500 -5B00 -4B00 -6B00 -9280 -2300 -ENDCHAR -STARTCHAR 742E -ENCODING 29742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -5080 -4F00 -E000 -5F80 -6D00 -5500 -9480 -0C00 -ENDCHAR -STARTCHAR 742F -ENCODING 29743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -04 -FF -51 -4F -E9 -4F -68 -8F -0F -09 -ENDCHAR -STARTCHAR 7430 -ENCODING 29744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -ED00 -5700 -4B00 -F080 -4500 -7500 -C600 -0900 -1080 -ENDCHAR -STARTCHAR 7433 -ENCODING 29747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1200 -D200 -7F80 -5200 -DB00 -7500 -7680 -5280 -9200 -1200 -ENDCHAR -STARTCHAR 7434 -ENCODING 29748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -F700 -4200 -FF80 -7E00 -8180 -7E00 -0400 -0800 -ENDCHAR -STARTCHAR 7435 -ENCODING 29749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4200 -FF00 -FF80 -4800 -4900 -7600 -7880 -C700 -ENDCHAR -STARTCHAR 7436 -ENCODING 29750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -F700 -7F80 -C000 -FF00 -9100 -FF00 -8080 -7F00 -ENDCHAR -STARTCHAR 7438 -ENCODING 29752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E700 -5F00 -5100 -FF00 -5100 -7F00 -9F80 -0400 -0400 -ENDCHAR -STARTCHAR 743A -ENCODING 29754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1200 -EA00 -4F00 -7200 -E200 -4F80 -5400 -7500 -9700 -2C80 -ENDCHAR -STARTCHAR 743F -ENCODING 29759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -5F80 -4400 -FF00 -5F00 -5500 -7F80 -8400 -0400 -ENDCHAR -STARTCHAR 7440 -ENCODING 29760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -03 -FC -5F -55 -FF -44 -7F -97 -19 -11 -ENDCHAR -STARTCHAR 7441 -ENCODING 29761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -5F -51 -DF -5F -5F -7F -91 -1F -ENDCHAR -STARTCHAR 7443 -ENCODING 29763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5F00 -4A00 -DF80 -5100 -7E80 -4E00 -9100 -0E00 -ENDCHAR -STARTCHAR 7444 -ENCODING 29764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5080 -5E80 -DF00 -5100 -5F00 -7F00 -9100 -3F80 -ENDCHAR -STARTCHAR 744B -ENCODING 29771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5F80 -4000 -FF00 -5F00 -7F00 -8A00 -1F80 -0200 -ENDCHAR -STARTCHAR 7455 -ENCODING 29781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FB00 -5500 -5B00 -D000 -5F00 -5300 -FB00 -1300 -1480 -ENDCHAR -STARTCHAR 7457 -ENCODING 29783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0300 -FF00 -5480 -FF00 -5F80 -4F00 -6900 -9600 -2D00 -ENDCHAR -STARTCHAR 7459 -ENCODING 29785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -0D -F5 -55 -4D -E4 -5F -7B -95 -1F -11 -ENDCHAR -STARTCHAR 745A -ENCODING 29786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -13 -D5 -BD -93 -D5 -BB -6D -BD -2D -07 -ENDCHAR -STARTCHAR 745B -ENCODING 29787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -FF80 -4E00 -5F00 -D500 -5500 -7F80 -8600 -1900 -3080 -ENDCHAR -STARTCHAR 745C -ENCODING 29788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DC00 -8B00 -BE80 -FB00 -BB00 -AD00 -7B00 -AB00 -2A80 -ENDCHAR -STARTCHAR 745E -ENCODING 29790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1500 -F500 -5F00 -4000 -FF80 -5F00 -7A80 -9A80 -1A80 -1B00 -ENDCHAR -STARTCHAR 745F -ENCODING 29791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4200 -F700 -FF80 -1200 -6D00 -A900 -B280 -FC00 -ENDCHAR -STARTCHAR 7460 -ENCODING 29792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -0F -DB -5B -FD -40 -5F -5F -9F -11 -ENDCHAR -STARTCHAR 7462 -ENCODING 29794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -5A80 -5900 -D700 -4900 -7F80 -9100 -0F00 -1100 -ENDCHAR -STARTCHAR 7464 -ENCODING 29796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -EF00 -5E00 -5C00 -F800 -4F00 -5F80 -6400 -9F00 -1080 -ENDCHAR -STARTCHAR 7465 -ENCODING 29797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5500 -5B00 -FF00 -4000 -5F00 -7B00 -9B00 -3F80 -ENDCHAR -STARTCHAR 7468 -ENCODING 29800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -5B00 -5B80 -C000 -5F80 -5F00 -7F00 -9100 -1F00 -ENDCHAR -STARTCHAR 7469 -ENCODING 29801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B700 -DB00 -6600 -9D00 -FF00 -8080 -7E00 -7E00 -0A00 -FF00 -ENDCHAR -STARTCHAR 746A -ENCODING 29802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -54 -5F -FF -54 -5F -7F -9D -23 -ENDCHAR -STARTCHAR 746F -ENCODING 29807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1300 -FB00 -AB00 -BB00 -EB00 -BA80 -7A80 -AB00 -3A00 -2200 -ENDCHAR -STARTCHAR 747E -ENCODING 29822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -FF80 -4E00 -4400 -DF00 -5F00 -5F00 -6400 -9F00 -3F80 -ENDCHAR -STARTCHAR 7482 -ENCODING 29826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1100 -DF80 -5100 -5E00 -DE00 -7F80 -4A00 -5500 -AE80 -3F80 -ENDCHAR -STARTCHAR 7483 -ENCODING 29827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -5B00 -5F00 -FF00 -4400 -7F00 -9E80 -1080 -1100 -ENDCHAR -STARTCHAR 7487 -ENCODING 29831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -D780 -BC00 -A780 -DA80 -AE00 -6D80 -AE00 -2E00 -5B80 -ENDCHAR -STARTCHAR 7489 -ENCODING 29833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -DF80 -8F00 -AB00 -CF00 -BF00 -9F80 -D200 -3200 -2F80 -ENDCHAR -STARTCHAR 748B -ENCODING 29835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5F80 -4000 -FF00 -5F00 -7100 -9F80 -0400 -0400 -ENDCHAR -STARTCHAR 7498 -ENCODING 29848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1500 -CD00 -5F80 -4E00 -D580 -5900 -7B80 -4F80 -9100 -2100 -ENDCHAR -STARTCHAR 749C -ENCODING 29852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -DF80 -4E00 -5F80 -C400 -5F00 -7F00 -9F00 -0B00 -3080 -ENDCHAR -STARTCHAR 749E -ENCODING 29854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1B00 -FB00 -5F80 -4A00 -FF00 -5F00 -7F80 -8400 -0B00 -3180 -ENDCHAR -STARTCHAR 749F -ENCODING 29855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5F00 -5F00 -FF80 -5F00 -7100 -9F00 -1D00 -2C80 -ENDCHAR -STARTCHAR 74A1 -ENCODING 29857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -D600 -8F00 -AA00 -D700 -8700 -B600 -5700 -9000 -2F80 -ENDCHAR -STARTCHAR 74A3 -ENCODING 29859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D500 -6F00 -5D00 -FF80 -4500 -7F80 -FA00 -1680 -2900 -ENDCHAR -STARTCHAR 74A5 -ENCODING 29861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1A00 -FE00 -9B80 -9B00 -E700 -B700 -6900 -B500 -2700 -1C80 -ENDCHAR -STARTCHAR 74A7 -ENCODING 29863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -9F80 -F500 -FF80 -DF80 -F200 -FF00 -7F00 -0A00 -FF80 -ENDCHAR -STARTCHAR 74A8 -ENCODING 29864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -DB80 -5F00 -6B00 -D480 -6500 -4E00 -5F80 -8E00 -3580 -ENDCHAR -STARTCHAR 74AA -ENCODING 29866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0F00 -EF00 -4000 -FB00 -5B00 -5F80 -6E00 -9D80 -2400 -ENDCHAR -STARTCHAR 74B0 -ENCODING 29872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5F00 -4000 -FF80 -5F00 -7F00 -8A80 -3D00 -1880 -ENDCHAR -STARTCHAR 74B2 -ENCODING 29874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1700 -C900 -6F00 -DE00 -4500 -7F00 -5A80 -9600 -2F80 -ENDCHAR -STARTCHAR 74B5 -ENCODING 29877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1D00 -F700 -5D00 -5500 -DB00 -5500 -7F80 -CB00 -1080 -ENDCHAR -STARTCHAR 74B9 -ENCODING 29881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -8000 -BF80 -DF00 -8000 -7F80 -9F80 -2B00 -1B00 -ENDCHAR -STARTCHAR 74BD -ENCODING 29885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -7F80 -EF00 -5700 -AD00 -5300 -FF00 -7F00 -FF80 -ENDCHAR -STARTCHAR 74BF -ENCODING 29887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5080 -5F00 -F500 -4F00 -5180 -7F00 -9F00 -1F00 -ENDCHAR -STARTCHAR 74C6 -ENCODING 29894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1F00 -F200 -5F80 -5D00 -DF00 -5F00 -7F00 -9F00 -0A00 -1180 -ENDCHAR -STARTCHAR 74CA -ENCODING 29898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -F600 -7F00 -5F00 -D100 -5F00 -7F00 -9F00 -2E00 -3B80 -ENDCHAR -STARTCHAR 74CF -ENCODING 29903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1200 -FB80 -9B00 -B880 -FB00 -AB00 -BB00 -FB00 -2A80 -2B00 -ENDCHAR -STARTCHAR 74D4 -ENCODING 29908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FB00 -5480 -5B00 -C000 -5700 -5F80 -EA00 -0600 -3980 -ENDCHAR -STARTCHAR 74D8 -ENCODING 29912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1F80 -CA00 -5B00 -5B00 -CA00 -5F80 -7F00 -D300 -1C00 -1F80 -ENDCHAR -STARTCHAR 74DA -ENCODING 29914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1200 -DB00 -7F80 -5B00 -FF80 -5100 -7F00 -9F00 -1F00 -3100 -ENDCHAR -STARTCHAR 74DC -ENCODING 29916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0700 -7E00 -5200 -5200 -5200 -5200 -5500 -BD00 -8280 -ENDCHAR -STARTCHAR 74E0 -ENCODING 29920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2180 -7E80 -5680 -7E80 -8E80 -7E80 -4680 -7780 -5540 -3AC0 -ENDCHAR -STARTCHAR 74E2 -ENCODING 29922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F300 -6500 -FB00 -FB00 -FB00 -0B00 -FB00 -DB80 -D580 -ENDCHAR -STARTCHAR 74E3 -ENCODING 29923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4D00 -D780 -F700 -F700 -F780 -B500 -F500 -B780 -AB00 -9500 -ENDCHAR -STARTCHAR 74E6 -ENCODING 29926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -2000 -3C00 -2200 -3400 -4C00 -4400 -4C80 -F700 -ENDCHAR -STARTCHAR 74EE -ENCODING 29934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -5200 -A500 -7E00 -FF00 -2000 -3E00 -4C80 -F300 -ENDCHAR -STARTCHAR 74F7 -ENCODING 29943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -DF00 -2900 -DE00 -2100 -FF00 -2000 -3E00 -4C80 -F300 -ENDCHAR -STARTCHAR 7501 -ENCODING 29953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5400 -F400 -5700 -5500 -F500 -5700 -9900 -9B80 -9D00 -ENDCHAR -STARTCHAR 7504 -ENCODING 29956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -6400 -F700 -F500 -F500 -2700 -F980 -3A80 -CD80 -ENDCHAR -STARTCHAR 7511 -ENCODING 29969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F80 -F400 -AF00 -ED00 -F700 -F700 -F580 -F780 -9D80 -ENDCHAR -STARTCHAR 7515 -ENCODING 29973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -AF00 -EA00 -6F80 -8000 -FF00 -3E00 -2C80 -F380 -ENDCHAR -STARTCHAR 7518 -ENCODING 29976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -22 -22 -FF -22 -22 -3E -22 -22 -3E -22 -ENDCHAR -STARTCHAR 751A -ENCODING 29978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -3E00 -4200 -3E00 -FF80 -5400 -6700 -7F00 -4000 -ENDCHAR -STARTCHAR 751B -ENCODING 29979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A100 -AE00 -F200 -AF80 -A200 -E200 -AF00 -A880 -EF00 -A880 -ENDCHAR -STARTCHAR 751F -ENCODING 29983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -7F00 -8800 -8800 -0800 -7E00 -0800 -0800 -FF80 -ENDCHAR -STARTCHAR 7523 -ENCODING 29987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2400 -FF80 -A800 -BF00 -C800 -BF00 -8800 -FF80 -ENDCHAR -STARTCHAR 7525 -ENCODING 29989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -4F -CD -EF -CD -EF -5F -75 -C9 -13 -ENDCHAR -STARTCHAR 7526 -ENCODING 29990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F200 -4600 -F700 -FA00 -D700 -F200 -CF80 -6000 -BF80 -ENDCHAR -STARTCHAR 7528 -ENCODING 29992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -49 -7F -49 -49 -7F -89 -89 -8B -ENDCHAR -STARTCHAR 752B -ENCODING 29995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -0E -FF -08 -7F -89 -7F -89 -7F -89 -8B -ENDCHAR -STARTCHAR 752C -ENCODING 29996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FC -30 -FE -92 -FE -92 -FE -92 -96 -ENDCHAR -STARTCHAR 7530 -ENCODING 30000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 8 2 -1 -BITMAP -FE -12 -12 -FE -12 -12 -12 -FE -ENDCHAR -STARTCHAR 7531 -ENCODING 30001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -FF -89 -89 -FF -89 -89 -FF -81 -ENDCHAR -STARTCHAR 7532 -ENCODING 30002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FE -92 -92 -FE -92 -FE -10 -10 -10 -ENDCHAR -STARTCHAR 7533 -ENCODING 30003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -1 -BITMAP -10 -10 -FE -92 -FE -92 -FE -92 -10 -10 -ENDCHAR -STARTCHAR 7537 -ENCODING 30007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -49 -7F -7F -08 -FF -11 -21 -C7 -ENDCHAR -STARTCHAR 7538 -ENCODING 30008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -7F -41 -FD -D5 -7D -55 -7D -41 -07 -ENDCHAR -STARTCHAR 753A -ENCODING 30010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F000 -B780 -B200 -F200 -B200 -B200 -F200 -9200 -0600 -ENDCHAR -STARTCHAR 7547 -ENCODING 30023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -EF -E9 -F1 -EF -E1 -EF -E1 -A1 -03 -ENDCHAR -STARTCHAR 754C -ENCODING 30028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4900 -7F00 -7F00 -6600 -A580 -2400 -6400 -C400 -ENDCHAR -STARTCHAR 754F -ENCODING 30031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -4900 -7F00 -4900 -7F00 -FF00 -4A00 -7E00 -E180 -ENDCHAR -STARTCHAR 7551 -ENCODING 30033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -55 -F5 -D5 -DF -55 -55 -B5 -BF -91 -ENDCHAR -STARTCHAR 7553 -ENCODING 30035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -09 -EA -2C -4B -99 -7E -49 -7E -7E -41 -ENDCHAR -STARTCHAR 7554 -ENCODING 30036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -ED00 -ED00 -D480 -EF00 -E400 -DF80 -E400 -A400 -0400 -ENDCHAR -STARTCHAR 7559 -ENCODING 30041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -2F -E5 -95 -FB -00 -7F -7F -7F -41 -ENDCHAR -STARTCHAR 755B -ENCODING 30043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -EE00 -FB00 -FC80 -E900 -E680 -E900 -E200 -8C00 -1000 -ENDCHAR -STARTCHAR 755C -ENCODING 30044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -1400 -3A00 -FF00 -0080 -7F00 -7F00 -7F00 -8100 -ENDCHAR -STARTCHAR 755D -ENCODING 30045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F400 -0700 -F900 -DA00 -D200 -F200 -D500 -F900 -1080 -ENDCHAR -STARTCHAR 7562 -ENCODING 30050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -7F00 -8900 -7F00 -FF80 -4A00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 7565 -ENCODING 30053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E700 -E900 -D600 -E600 -D980 -EF00 -E900 -AF00 -0900 -ENDCHAR -STARTCHAR 7566 -ENCODING 30054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -EF00 -E400 -FF80 -E400 -E400 -EF00 -8400 -1F80 -ENDCHAR -STARTCHAR 756A -ENCODING 30058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -7C00 -2A00 -FF00 -2C00 -FF80 -4900 -7E00 -7E00 -4100 -ENDCHAR -STARTCHAR 756F -ENCODING 30063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -E900 -FF00 -EA80 -F700 -EF00 -E900 -F600 -8600 -1980 -ENDCHAR -STARTCHAR 7570 -ENCODING 30064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -7F00 -7F00 -0000 -2400 -FF00 -FF80 -2600 -C100 -ENDCHAR -STARTCHAR 7575 -ENCODING 30069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7E00 -FF80 -FF00 -FF80 -0000 -FF00 -FF00 -BF00 -FF00 -ENDCHAR -STARTCHAR 7576 -ENCODING 30070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4A -2A -FF -BF -3E -00 -7F -7F -89 -7F -ENDCHAR -STARTCHAR 7578 -ENCODING 30072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -EF80 -E600 -E980 -FF80 -E100 -EF00 -EF00 -8B00 -0300 -ENDCHAR -STARTCHAR 757A -ENCODING 30074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -7E -7E -7E -FF -7F -7F -7F -FF -ENDCHAR -STARTCHAR 757F -ENCODING 30079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -AD00 -5B00 -FF00 -0A00 -FF80 -FA00 -F600 -F480 -8B00 -ENDCHAR -STARTCHAR 7586 -ENCODING 30086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -3500 -FF00 -9F00 -FF80 -FF00 -BF00 -DF00 -DF80 -ENDCHAR -STARTCHAR 7587 -ENCODING 30087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -E000 -FF00 -EE00 -FF00 -FF80 -FF80 -B700 -1B00 -ENDCHAR -STARTCHAR 758A -ENCODING 30090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -FF -FF -FF -FF -C3 -7E -FF -ENDCHAR -STARTCHAR 758B -ENCODING 30091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0900 -0900 -4800 -4F00 -4800 -4800 -B800 -8F80 -ENDCHAR -STARTCHAR 758E -ENCODING 30094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -3F80 -4400 -CF00 -F500 -CF00 -C600 -ED00 -D480 -0400 -ENDCHAR -STARTCHAR 758F -ENCODING 30095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -3F00 -4900 -DF00 -E000 -D600 -D600 -F600 -D680 -2500 -ENDCHAR -STARTCHAR 7591 -ENCODING 30097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -AF00 -D100 -E600 -8F00 -E300 -CB00 -FA00 -6E00 -9380 -ENDCHAR -STARTCHAR 759D -ENCODING 30109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C400 -C400 -6500 -6500 -E500 -6500 -9F00 -A100 -ENDCHAR -STARTCHAR 75A5 -ENCODING 30117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C400 -CA00 -5300 -F280 -D200 -5200 -9200 -A200 -ENDCHAR -STARTCHAR 75AB -ENCODING 30123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -DC00 -D280 -5300 -E000 -FE00 -5200 -8C00 -B300 -ENDCHAR -STARTCHAR 75B1 -ENCODING 30129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C000 -DF00 -7D00 -7500 -DD00 -5300 -9080 -9F00 -ENDCHAR -STARTCHAR 75B2 -ENCODING 30130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C400 -DF00 -5500 -5F00 -EA00 -6A00 -AE00 -B180 -ENDCHAR -STARTCHAR 75B3 -ENCODING 30131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D100 -FF80 -5100 -5100 -DE00 -5100 -5E00 -9100 -ENDCHAR -STARTCHAR 75B5 -ENCODING 30133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D400 -F500 -7500 -6A00 -F400 -7400 -BC80 -F300 -ENDCHAR -STARTCHAR 75B8 -ENCODING 30136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C000 -DF00 -5100 -5F00 -D100 -5F00 -8000 -BF80 -ENDCHAR -STARTCHAR 75B9 -ENCODING 30137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -CC00 -D200 -6500 -4A00 -DD00 -5200 -8C00 -B000 -ENDCHAR -STARTCHAR 75BC -ENCODING 30140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C800 -DE00 -6A00 -4E00 -F180 -4C00 -8300 -9C00 -ENDCHAR -STARTCHAR 75BD -ENCODING 30141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -7F80 -C000 -DF00 -5100 -5F00 -D100 -5F00 -9100 -BF80 -ENDCHAR -STARTCHAR 75BE -ENCODING 30142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D000 -DF00 -6400 -4400 -FF00 -4C00 -9200 -A180 -ENDCHAR -STARTCHAR 75C2 -ENCODING 30146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D000 -FB00 -5B00 -5B00 -DB00 -6B00 -AB00 -DB00 -ENDCHAR -STARTCHAR 75C5 -ENCODING 30149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C000 -FF00 -5F00 -6500 -EB00 -6B00 -A100 -A300 -ENDCHAR -STARTCHAR 75C7 -ENCODING 30151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C000 -FF00 -4400 -D400 -D700 -5400 -9400 -BF80 -ENDCHAR -STARTCHAR 75CD -ENCODING 30157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FF00 -C400 -7F00 -7F00 -FF00 -4D00 -9200 -A100 -ENDCHAR -STARTCHAR 75D2 -ENCODING 30162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D200 -FF00 -4400 -5F00 -C400 -7F80 -8400 -8400 -ENDCHAR -STARTCHAR 75D4 -ENCODING 30164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C400 -DF00 -7F80 -C200 -7F00 -5200 -8A00 -8600 -ENDCHAR -STARTCHAR 75D5 -ENCODING 30165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -DE00 -D100 -DE00 -D100 -DF00 -5600 -9E00 -B100 -ENDCHAR -STARTCHAR 75D8 -ENCODING 30168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C000 -FF00 -5F00 -5100 -DF00 -5200 -8A00 -BF80 -ENDCHAR -STARTCHAR 75D9 -ENCODING 30169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FF00 -D500 -EA00 -5500 -C000 -7F00 -8400 -BF80 -ENDCHAR -STARTCHAR 75DB -ENCODING 30171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -DF00 -CC00 -7F00 -6500 -FF00 -7F00 -A500 -A700 -ENDCHAR -STARTCHAR 75E2 -ENCODING 30178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C900 -F300 -7B00 -D300 -FB00 -B500 -9100 -9300 -ENDCHAR -STARTCHAR 75F0 -ENCODING 30192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D500 -D600 -4A00 -5500 -D500 -6E00 -9A00 -A100 -ENDCHAR -STARTCHAR 75F2 -ENCODING 30194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D200 -FF00 -5200 -BF00 -BF00 -BF80 -D780 -9200 -ENDCHAR -STARTCHAR 75F4 -ENCODING 30196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D000 -FB00 -7280 -7E80 -D280 -5A80 -AB00 -A600 -ENDCHAR -STARTCHAR 75FA -ENCODING 30202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C400 -FF00 -7F00 -7F00 -CC00 -7F80 -8400 -8400 -ENDCHAR -STARTCHAR 75FC -ENCODING 30204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FF00 -E500 -7F00 -6500 -EF00 -6F00 -BF00 -A100 -ENDCHAR -STARTCHAR 7600 -ENCODING 30208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D200 -FB00 -5500 -DE80 -E900 -6800 -A900 -DE00 -ENDCHAR -STARTCHAR 760D -ENCODING 30221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -DF00 -DF00 -5F00 -FF80 -D000 -7F00 -B500 -8B00 -ENDCHAR -STARTCHAR 7619 -ENCODING 30233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FF00 -F600 -5E00 -F700 -FF00 -7F00 -8500 -BE80 -ENDCHAR -STARTCHAR 761F -ENCODING 30239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -DF00 -D500 -5B00 -5F00 -FF00 -6D00 -AD00 -FF80 -ENDCHAR -STARTCHAR 7620 -ENCODING 30240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -F700 -CC00 -7300 -DE00 -FF00 -5100 -9F00 -9300 -ENDCHAR -STARTCHAR 7621 -ENCODING 30241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -CC00 -FE00 -5F80 -DF00 -D100 -5F00 -BF00 -BF00 -ENDCHAR -STARTCHAR 7622 -ENCODING 30242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D300 -FD00 -7D80 -6800 -BF00 -7B00 -BB00 -DC80 -ENDCHAR -STARTCHAR 7624 -ENCODING 30244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -CF00 -FB00 -7D00 -6500 -DF00 -5F00 -9F00 -A100 -ENDCHAR -STARTCHAR 7626 -ENCODING 30246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -F700 -E500 -7F00 -7F00 -FF00 -5200 -8C00 -B300 -ENDCHAR -STARTCHAR 763B -ENCODING 30267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FF00 -FF80 -7F00 -7F00 -BF00 -BF80 -9C00 -BB00 -ENDCHAR -STARTCHAR 7642 -ENCODING 30274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FF00 -EB00 -5F00 -7280 -DE00 -5E00 -9700 -AC80 -ENDCHAR -STARTCHAR 764C -ENCODING 30284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -DE00 -DE00 -4000 -FF00 -FF00 -6500 -BF00 -A100 -ENDCHAR -STARTCHAR 764E -ENCODING 30286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FB00 -FB00 -7B00 -E100 -EF00 -6F00 -AF00 -A100 -ENDCHAR -STARTCHAR 7652 -ENCODING 30290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -DA00 -EF80 -7B00 -FD00 -FB00 -6B00 -B700 -DE80 -ENDCHAR -STARTCHAR 7656 -ENCODING 30294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FF80 -E800 -6D00 -FD00 -FF80 -6F00 -9A00 -AA00 -ENDCHAR -STARTCHAR 7661 -ENCODING 30305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -EF00 -F100 -7A00 -FF80 -FD00 -5600 -AE00 -C780 -ENDCHAR -STARTCHAR 7664 -ENCODING 30308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -DB80 -ED00 -7B00 -6D00 -FD00 -7D00 -BD00 -A400 -ENDCHAR -STARTCHAR 7669 -ENCODING 30313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D700 -FB00 -7800 -FF00 -BD00 -7700 -DB00 -9480 -ENDCHAR -STARTCHAR 766C -ENCODING 30316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C300 -F780 -7A00 -FF00 -BA00 -BF80 -AA00 -EA00 -ENDCHAR -STARTCHAR 7670 -ENCODING 30320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D300 -BF80 -7D00 -BB00 -BD00 -BB00 -A780 -BC00 -ENDCHAR -STARTCHAR 7672 -ENCODING 30322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FF00 -FF00 -5D00 -DF00 -DF00 -BF00 -AB00 -AC80 -ENDCHAR -STARTCHAR 7678 -ENCODING 30328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FA00 -1400 -6500 -3E00 -C980 -FF00 -1800 -2600 -C180 -ENDCHAR -STARTCHAR 767B -ENCODING 30331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7A00 -1500 -6200 -7F00 -FF80 -4200 -7E00 -2400 -FF80 -ENDCHAR -STARTCHAR 767C -ENCODING 30332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7A -95 -62 -EF -EA -EF -2A -26 -79 -ENDCHAR -STARTCHAR 767D -ENCODING 30333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -1 -BITMAP -20 -20 -FE -82 -82 -FE -82 -82 -FE -82 -ENDCHAR -STARTCHAR 767E -ENCODING 30334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -10 -7F -41 -41 -7F -41 -7F -41 -ENDCHAR -STARTCHAR 7684 -ENCODING 30340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -44 -EF -A9 -B5 -E5 -A3 -A1 -E1 -A7 -ENDCHAR -STARTCHAR 7686 -ENCODING 30342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -7B00 -4C00 -7880 -D700 -7E00 -4100 -7E00 -7E00 -4100 -ENDCHAR -STARTCHAR 7687 -ENCODING 30343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4100 -7E00 -7E00 -0000 -FF00 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR 768E -ENCODING 30350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF00 -AA00 -B100 -F100 -AA00 -A400 -E600 -9900 -1080 -ENDCHAR -STARTCHAR 7690 -ENCODING 30352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -7E00 -7E00 -0000 -6F00 -6F00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 7693 -ENCODING 30355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4C00 -FF00 -B400 -BF80 -E400 -BF00 -F100 -BF00 -1100 -ENDCHAR -STARTCHAR 76AE -ENCODING 30382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -7F -49 -49 -7F -62 -54 -8C -9E -E1 -ENDCHAR -STARTCHAR 76BA -ENCODING 30394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -F780 -FA80 -FA00 -B700 -4D00 -FB00 -EB00 -FF00 -BC80 -ENDCHAR -STARTCHAR 76BF -ENCODING 30399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 8 1 -1 -BITMAP -7F00 -9500 -9500 -9500 -9500 -9500 -9500 -FF80 -ENDCHAR -STARTCHAR 76C2 -ENCODING 30402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -0800 -FF00 -0800 -1800 -0000 -7F00 -9500 -FF80 -ENDCHAR -STARTCHAR 76C3 -ENCODING 30403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -1C00 -6B00 -8880 -7F00 -5500 -5500 -FF80 -ENDCHAR -STARTCHAR 76C6 -ENCODING 30406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1C00 -4200 -FF00 -1200 -2C00 -C000 -7F00 -5500 -FF80 -ENDCHAR -STARTCHAR 76C8 -ENCODING 30408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FC00 -2700 -3D00 -5900 -9B00 -A000 -7F00 -9500 -FF80 -ENDCHAR -STARTCHAR 76CA -ENCODING 30410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -4200 -BD00 -1C00 -4200 -C100 -FF00 -5600 -FF80 -ENDCHAR -STARTCHAR 76D2 -ENCODING 30418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -2400 -7F00 -8180 -7E00 -7E00 -0000 -7F00 -5500 -FF80 -ENDCHAR -STARTCHAR 76D6 -ENCODING 30422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0800 -7F00 -FF00 -0000 -7E00 -5500 -5500 -FF80 -ENDCHAR -STARTCHAR 76DB -ENCODING 30427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -7F00 -8500 -7600 -9680 -BB00 -8000 -7E00 -5500 -FF80 -ENDCHAR -STARTCHAR 76DC -ENCODING 30428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -5F00 -9900 -0A00 -4C00 -9200 -A100 -7E00 -5500 -FF80 -ENDCHAR -STARTCHAR 76DE -ENCODING 30430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1C00 -FF00 -0E00 -F700 -1700 -FC80 -F700 -7F00 -5500 -FF80 -ENDCHAR -STARTCHAR 76DF -ENCODING 30431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E700 -A700 -E900 -EF00 -AB00 -1000 -7F00 -5500 -FF80 -ENDCHAR -STARTCHAR 76E1 -ENCODING 30433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7E00 -FF80 -7E00 -FF80 -8100 -9480 -7F00 -9500 -FF80 -ENDCHAR -STARTCHAR 76E3 -ENCODING 30435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -A780 -D400 -F800 -A700 -F800 -7F00 -5500 -5500 -FF80 -ENDCHAR -STARTCHAR 76E4 -ENCODING 30436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -EA80 -DB00 -FF00 -D600 -A580 -0800 -7F00 -9500 -FF80 -ENDCHAR -STARTCHAR 76E7 -ENCODING 30439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1E00 -FF00 -9500 -9D00 -8000 -BE00 -BE00 -8000 -BF00 -FF80 -ENDCHAR -STARTCHAR 76EE -ENCODING 30446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FE -82 -FE -82 -82 -FE -82 -FE -82 -ENDCHAR -STARTCHAR 76F2 -ENCODING 30450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8000 -7F00 -7E00 -4100 -7E00 -7E00 -7E00 -4100 -ENDCHAR -STARTCHAR 76F4 -ENCODING 30452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0800 -3E00 -BE00 -A100 -BE00 -BE00 -7F80 -8000 -ENDCHAR -STARTCHAR 76F8 -ENCODING 30456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -49 -F9 -4F -69 -D9 -DF -C9 -4F -49 -ENDCHAR -STARTCHAR 76FC -ENCODING 30460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -A900 -F100 -B080 -AF00 -E500 -A900 -F900 -1600 -ENDCHAR -STARTCHAR 76FE -ENCODING 30462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0300 -7C00 -7F80 -4800 -7F00 -BF00 -BF00 -BF00 -A100 -ENDCHAR -STARTCHAR 7701 -ENCODING 30465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -2A -4B -9C -30 -FE -7E -7E -7E -41 -ENDCHAR -STARTCHAR 7704 -ENCODING 30468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -A4 -F7 -B5 -B5 -FF -B1 -E1 -A7 -ENDCHAR -STARTCHAR 7708 -ENCODING 30472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A400 -BF00 -F480 -A400 -E400 -A400 -AA00 -FA80 -9300 -ENDCHAR -STARTCHAR 7709 -ENCODING 30473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -89 -FF -BF -A1 -BF -BF -BF -A1 -ENDCHAR -STARTCHAR 770B -ENCODING 30475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -7C00 -7F00 -FF80 -2000 -7E00 -BE00 -3E00 -3E00 -2100 -ENDCHAR -STARTCHAR 771E -ENCODING 30494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4700 -7F00 -0000 -BF00 -BF00 -BF00 -BF00 -FF80 -6600 -8180 -ENDCHAR -STARTCHAR 7720 -ENCODING 30496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -B100 -EF00 -B200 -B200 -EF80 -B200 -F680 -1900 -ENDCHAR -STARTCHAR 7729 -ENCODING 30505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -BF80 -E400 -B900 -AA00 -E500 -A500 -EB00 -9C80 -ENDCHAR -STARTCHAR 7737 -ENCODING 30519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -5300 -FF00 -1C00 -E380 -7E00 -BF80 -4200 -3E00 -4200 -ENDCHAR -STARTCHAR 7738 -ENCODING 30520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C900 -AB00 -BC80 -CC00 -BF00 -D400 -A400 -DF80 -A400 -0400 -ENDCHAR -STARTCHAR 773A -ENCODING 30522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CA00 -AA80 -BB00 -DB00 -AA00 -DB00 -BA80 -CA00 -9280 -2300 -ENDCHAR -STARTCHAR 773C -ENCODING 30524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EF -A9 -EF -A9 -AF -ED -AA -EF -19 -ENDCHAR -STARTCHAR 7740 -ENCODING 30528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -7F00 -0800 -FF80 -3E00 -7E00 -A100 -BE00 -3E00 -ENDCHAR -STARTCHAR 774D -ENCODING 30541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -B100 -FF00 -BF00 -B100 -FF00 -AA00 -FA80 -3300 -ENDCHAR -STARTCHAR 775B -ENCODING 30555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -AF00 -FF80 -A000 -EF00 -B500 -EF00 -B100 -1300 -ENDCHAR -STARTCHAR 7761 -ENCODING 30561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -C300 -BC00 -BF00 -CD00 -BF80 -CD00 -BF00 -C400 -9F80 -ENDCHAR -STARTCHAR 7763 -ENCODING 30563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -2F -35 -F5 -B2 -DD -7E -41 -7E -7E -41 -ENDCHAR -STARTCHAR 7766 -ENCODING 30566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -A400 -FF80 -AA80 -F780 -A400 -BF00 -E400 -BF80 -ENDCHAR -STARTCHAR 776B -ENCODING 30571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -DF00 -DF00 -C500 -DF80 -DF00 -D400 -D700 -AC00 -2780 -ENDCHAR -STARTCHAR 7779 -ENCODING 30585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF00 -A500 -DF80 -A500 -CF00 -B900 -AF00 -CF00 -0900 -ENDCHAR -STARTCHAR 777E -ENCODING 30590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF00 -FF00 -0800 -7E00 -FF00 -2400 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 777F -ENCODING 30591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0E00 -1000 -FF00 -7E00 -9500 -7E00 -C380 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 778B -ENCODING 30603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D300 -DF00 -C000 -DF00 -DF00 -DF00 -DF00 -DF80 -CA00 -3180 -ENDCHAR -STARTCHAR 7791 -ENCODING 30609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -BF00 -D100 -AF00 -AF00 -DF80 -C000 -AB00 -1080 -ENDCHAR -STARTCHAR 779E -ENCODING 30622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -FF80 -CA00 -CE00 -DF00 -DE80 -DE80 -DF00 -D480 -9500 -ENDCHAR -STARTCHAR 77A5 -ENCODING 30629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3400 -AF80 -FD00 -F200 -B580 -7E00 -4200 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 77AC -ENCODING 30636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -D500 -C900 -DF00 -CB00 -DD00 -DD80 -D700 -1100 -ENDCHAR -STARTCHAR 77AD -ENCODING 30637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF80 -CA00 -DF00 -B180 -DF00 -DF00 -CE00 -D500 -2C80 -ENDCHAR -STARTCHAR 77B0 -ENCODING 30640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -FA00 -FF80 -DB00 -DF00 -DB00 -D900 -D900 -EB00 -8C80 -ENDCHAR -STARTCHAR 77B3 -ENCODING 30643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF00 -BF80 -C000 -BF00 -DF00 -B500 -BF00 -DF00 -BF80 -ENDCHAR -STARTCHAR 77BB -ENCODING 30651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -DE00 -BF80 -D400 -BA00 -BF80 -D000 -B600 -DF00 -2F00 -ENDCHAR -STARTCHAR 77BC -ENCODING 30652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -CC00 -D300 -AE80 -DB00 -DD00 -DB00 -D200 -DB00 -2580 -ENDCHAR -STARTCHAR 77BF -ENCODING 30655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -F7 -48 -FF -FF -48 -7F -ENDCHAR -STARTCHAR 77D7 -ENCODING 30679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -3E00 -6200 -7E00 -7F00 -FF80 -FF00 -DD00 -FF00 -FF80 -ENDCHAR -STARTCHAR 77DB -ENCODING 30683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -34 -08 -FF -19 -2A -48 -88 -18 -ENDCHAR -STARTCHAR 77DC -ENCODING 30684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E400 -2600 -4900 -FF80 -6000 -CF00 -C100 -4100 -C200 -ENDCHAR -STARTCHAR 77E2 -ENCODING 30690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2000 -7F00 -4800 -8800 -FF00 -1800 -1400 -6200 -8180 -ENDCHAR -STARTCHAR 77E3 -ENCODING 30691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -2200 -FF00 -2000 -7E00 -8800 -FF00 -1800 -2600 -C180 -ENDCHAR -STARTCHAR 77E5 -ENCODING 30693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -47 -75 -A5 -F5 -25 -25 -55 -97 -85 -ENDCHAR -STARTCHAR 77E9 -ENCODING 30697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8F80 -8800 -E800 -CF00 -E900 -4900 -4F00 -A800 -9F80 -8800 -ENDCHAR -STARTCHAR 77ED -ENCODING 30701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F80 -E000 -CF00 -4900 -EF00 -4000 -6900 -A600 -9F80 -ENDCHAR -STARTCHAR 77EE -ENCODING 30702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -9C00 -FF80 -CD00 -F480 -4400 -5F80 -AA00 -AE00 -9900 -ENDCHAR -STARTCHAR 77EF -ENCODING 30703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -9E00 -FF80 -CF00 -FF00 -5F00 -5100 -B700 -9700 -9100 -ENDCHAR -STARTCHAR 77F3 -ENCODING 30707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -2000 -2000 -2000 -7F00 -C100 -C100 -3F00 -4100 -ENDCHAR -STARTCHAR 7802 -ENCODING 30722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -ED00 -4D00 -4D00 -F480 -B500 -AD00 -A200 -6C00 -1000 -ENDCHAR -STARTCHAR 7812 -ENCODING 30738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F200 -5200 -9300 -9A00 -F200 -B200 -B280 -FA80 -B300 -ENDCHAR -STARTCHAR 7825 -ENCODING 30757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E700 -4A00 -4A00 -8F80 -EA00 -AA00 -AE80 -7980 -BE00 -ENDCHAR -STARTCHAR 7826 -ENCODING 30758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2500 -B700 -A480 -B700 -C000 -FF00 -2000 -7E00 -A100 -3E00 -ENDCHAR -STARTCHAR 7827 -ENCODING 30759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -F400 -4380 -4400 -6400 -AF00 -A900 -6900 -6F00 -4900 -ENDCHAR -STARTCHAR 782C -ENCODING 30764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -5F00 -8900 -E900 -AA00 -AA00 -AA00 -E200 -9F80 -ENDCHAR -STARTCHAR 7832 -ENCODING 30770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF00 -5080 -5E80 -EA80 -AF00 -A900 -A900 -6880 -8F00 -ENDCHAR -STARTCHAR 7834 -ENCODING 30772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -5F80 -5280 -9200 -FF00 -B900 -B600 -B200 -F500 -A880 -ENDCHAR -STARTCHAR 7845 -ENCODING 30789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -5F00 -8400 -FF80 -A400 -A400 -BF00 -E400 -BF80 -ENDCHAR -STARTCHAR 784F -ENCODING 30799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -4900 -8900 -ED00 -BB80 -A900 -A900 -F100 -1100 -ENDCHAR -STARTCHAR 785D -ENCODING 30813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0680 -7680 -2A40 -2F80 -7880 -5780 -D880 -5780 -7880 -0980 -ENDCHAR -STARTCHAR 786B -ENCODING 30827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -4A00 -9F00 -E080 -B600 -B600 -B600 -F680 -2500 -ENDCHAR -STARTCHAR 786C -ENCODING 30828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -5F00 -9500 -FF00 -B500 -BF00 -6400 -AC00 -1380 -ENDCHAR -STARTCHAR 786F -ENCODING 30831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -4900 -8F00 -EF00 -A900 -AF00 -A600 -EA80 -9300 -ENDCHAR -STARTCHAR 787C -ENCODING 30844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FB -5B -9B -DB -BB -BB -BB -DB -09 -ENDCHAR -STARTCHAR 7881 -ENCODING 30849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FF00 -3E00 -3E00 -2200 -FF80 -FF80 -7E00 -A200 -3E00 -ENDCHAR -STARTCHAR 7887 -ENCODING 30855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5080 -8F00 -E400 -AC00 -AB00 -BC00 -FC00 -2380 -ENDCHAR -STARTCHAR 788C -ENCODING 30860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF00 -4E00 -8200 -FF80 -B300 -AB00 -AD00 -F480 -8C00 -ENDCHAR -STARTCHAR 788D -ENCODING 30861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -4F00 -4F00 -E000 -BF80 -A100 -BF80 -6500 -8200 -ENDCHAR -STARTCHAR 788E -ENCODING 30862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -4900 -4900 -EB00 -B080 -BF80 -A400 -6400 -8400 -ENDCHAR -STARTCHAR 7891 -ENCODING 30865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5500 -9F00 -F500 -BF00 -AA00 -BF80 -E200 -8200 -ENDCHAR -STARTCHAR 7897 -ENCODING 30871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -5F00 -9080 -9F00 -F500 -B500 -AB00 -AB00 -F280 -1300 -ENDCHAR -STARTCHAR 78A3 -ENCODING 30883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -5F -91 -FF -BF -B5 -BB -FF -93 -ENDCHAR -STARTCHAR 78A7 -ENCODING 30887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -04 -FF -EF -79 -CF -FF -3E -41 -BE -21 -ENDCHAR -STARTCHAR 78A9 -ENCODING 30889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF80 -4400 -4F00 -EF00 -A900 -AF00 -AF00 -EB00 -9080 -ENDCHAR -STARTCHAR 78BA -ENCODING 30906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -5880 -8A00 -FF00 -BF00 -AA00 -AF00 -EF80 -8800 -ENDCHAR -STARTCHAR 78BB -ENCODING 30907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1F80 -E000 -4F00 -8F00 -E000 -BF00 -B680 -F680 -B880 -1100 -ENDCHAR -STARTCHAR 78BC -ENCODING 30908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -54 -9F -FF -B4 -BF -BF -FB -A3 -ENDCHAR -STARTCHAR 78C1 -ENCODING 30913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -5F80 -8800 -9200 -DB00 -BB00 -AB00 -B100 -DB00 -3680 -ENDCHAR -STARTCHAR 78C5 -ENCODING 30917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -5F00 -8A00 -9F80 -F480 -BF80 -A800 -AF00 -F900 -1300 -ENDCHAR -STARTCHAR 78CA -ENCODING 30922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -7E00 -A200 -3E00 -FF80 -4400 -F700 -9D00 -7700 -ENDCHAR -STARTCHAR 78CB -ENCODING 30923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0900 -FF80 -4400 -8F00 -E400 -BF80 -AF00 -AA00 -F200 -2F80 -ENDCHAR -STARTCHAR 78CE -ENCODING 30926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -5500 -9400 -8A00 -E500 -BF00 -BF80 -EA00 -9180 -ENDCHAR -STARTCHAR 78D0 -ENCODING 30928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -FA80 -BB00 -FF00 -D600 -BD80 -FF80 -7F00 -C100 -3F00 -ENDCHAR -STARTCHAR 78E8 -ENCODING 30952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -F780 -F700 -8000 -FF00 -BF00 -E100 -BF00 -ENDCHAR -STARTCHAR 78EC -ENCODING 30956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2600 -F680 -0900 -FF00 -F600 -8900 -FF00 -7E00 -FE00 -4200 -ENDCHAR -STARTCHAR 78EF -ENCODING 30959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F500 -AF00 -9D00 -FF80 -C500 -DF80 -DD00 -D280 -AD00 -ENDCHAR -STARTCHAR 78F5 -ENCODING 30965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -DB -5B -9B -DB -DF -DF -DF -DB -11 -ENDCHAR -STARTCHAR 78FB -ENCODING 30971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0100 -FF00 -9F80 -EE00 -BF00 -B580 -BF00 -F500 -9F00 -ENDCHAR -STARTCHAR 7901 -ENCODING 30977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -EF00 -5200 -9F00 -EB00 -AE00 -AF80 -A000 -F700 -9680 -ENDCHAR -STARTCHAR 790E -ENCODING 30990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0900 -FB80 -5900 -9A80 -E900 -BF80 -B480 -BF00 -FC00 -2780 -ENDCHAR -STARTCHAR 7916 -ENCODING 30998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1D00 -F700 -5D00 -9700 -FF00 -B700 -B700 -BF80 -EB00 -9080 -ENDCHAR -STARTCHAR 792A -ENCODING 31018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -5F00 -9000 -DF00 -BB00 -BF00 -BF00 -DF00 -2900 -ENDCHAR -STARTCHAR 792B -ENCODING 31019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1500 -D700 -BA80 -9700 -DB00 -CF80 -DF80 -CF00 -F480 -0400 -ENDCHAR -STARTCHAR 792C -ENCODING 31020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -FF80 -DB00 -EE80 -1800 -FF80 -7F00 -FE80 -A200 -3E00 -ENDCHAR -STARTCHAR 793A -ENCODING 31034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -00 -00 -FF -4A -4A -49 -89 -18 -ENDCHAR -STARTCHAR 793E -ENCODING 31038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E400 -0400 -F400 -4F00 -D400 -D400 -D400 -D400 -5F80 -ENDCHAR -STARTCHAR 7940 -ENCODING 31040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -0900 -F900 -EF00 -E800 -E800 -E880 -E880 -4F00 -ENDCHAR -STARTCHAR 7941 -ENCODING 31041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -05 -F5 -26 -B5 -B5 -B5 -B7 -24 -ENDCHAR -STARTCHAR 7947 -ENCODING 31047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E100 -0E00 -EA00 -4A00 -EF80 -EA00 -EA00 -EE80 -5900 -ENDCHAR -STARTCHAR 7948 -ENCODING 31048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E100 -0E00 -F800 -4F80 -DA00 -DA00 -DA00 -DA00 -5200 -ENDCHAR -STARTCHAR 7949 -ENCODING 31049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -0200 -EA00 -4A00 -EB80 -EA00 -EA00 -EA00 -CA00 -5F80 -ENDCHAR -STARTCHAR 7950 -ENCODING 31056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E400 -0F80 -E400 -E800 -EF00 -F900 -E900 -C700 -4900 -ENDCHAR -STARTCHAR 7956 -ENCODING 31062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -0900 -F900 -DF00 -D900 -DF00 -D900 -C900 -5F80 -ENDCHAR -STARTCHAR 7957 -ENCODING 31063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E700 -0A00 -EA00 -4F80 -EA00 -EA00 -EE80 -D980 -5E00 -ENDCHAR -STARTCHAR 795A -ENCODING 31066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E800 -0F80 -FC00 -D700 -D400 -D700 -D400 -C400 -4400 -ENDCHAR -STARTCHAR 795B -ENCODING 31067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -0200 -FF00 -4200 -D200 -DF80 -D400 -D500 -DB00 -5C80 -ENDCHAR -STARTCHAR 795C -ENCODING 31068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -0200 -0F80 -E200 -E200 -EF00 -E900 -E900 -CF00 -4900 -ENDCHAR -STARTCHAR 795D -ENCODING 31069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -0900 -E900 -4900 -EF00 -EA00 -EA00 -EA80 -5380 -ENDCHAR -STARTCHAR 795E -ENCODING 31070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -04 -E4 -0F -ED -4F -ED -EF -ED -E4 -44 -ENDCHAR -STARTCHAR 7960 -ENCODING 31072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EF -01 -EF -4F -EB -EF -EB -E1 -43 -ENDCHAR -STARTCHAR 7965 -ENCODING 31077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -0500 -EF80 -4200 -EF00 -E200 -DF80 -E200 -E200 -4200 -ENDCHAR -STARTCHAR 7968 -ENCODING 31080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -FF00 -9500 -FF00 -7E00 -0000 -FF00 -4A00 -B100 -ENDCHAR -STARTCHAR 796D -ENCODING 31085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -7700 -D500 -A200 -7F80 -8000 -FF00 -2A00 -4B00 -9900 -ENDCHAR -STARTCHAR 797A -ENCODING 31098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -1F80 -0900 -EF00 -E900 -EF00 -E900 -DF80 -E900 -5080 -ENDCHAR -STARTCHAR 797F -ENCODING 31103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -0F00 -0E00 -E200 -FF80 -F300 -EA00 -ED00 -DC80 -4C00 -ENDCHAR -STARTCHAR 7981 -ENCODING 31105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -6700 -DE80 -4A00 -7E00 -FF00 -2A00 -4B00 -9900 -ENDCHAR -STARTCHAR 798D -ENCODING 31117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EF -09 -EB -FF -F1 -F7 -F7 -F7 -51 -ENDCHAR -STARTCHAR 798E -ENCODING 31118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E780 -0400 -EF00 -EF00 -E900 -EF00 -EF00 -CB00 -5080 -ENDCHAR -STARTCHAR 798F -ENCODING 31119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF80 -0F00 -E900 -EF00 -EF00 -F480 -EF00 -EF00 -5080 -ENDCHAR -STARTCHAR 7991 -ENCODING 31121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EF -15 -EF -EF -E4 -FF -FF -F1 -51 -ENDCHAR -STARTCHAR 79A6 -ENCODING 31142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5300 -BE80 -7E80 -AA80 -7F00 -0000 -7F00 -FF80 -4A00 -9900 -ENDCHAR -STARTCHAR 79A7 -ENCODING 31143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -FF00 -5F00 -F100 -EE00 -FF80 -FF00 -DF00 -5100 -ENDCHAR -STARTCHAR 79AA -ENCODING 31146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -1F00 -E000 -EF00 -EF00 -EF00 -FF80 -C400 -4400 -ENDCHAR -STARTCHAR 79AE -ENCODING 31150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E600 -1F00 -1F00 -FF00 -E000 -FF80 -EF00 -EF00 -C900 -5F80 -ENDCHAR -STARTCHAR 79B1 -ENCODING 31153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F00 -0000 -FF80 -FF00 -E000 -FF80 -FB80 -D700 -5B00 -ENDCHAR -STARTCHAR 79B3 -ENCODING 31155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1F80 -E000 -1F80 -FF00 -FF80 -FF00 -EA00 -FF80 -DB00 -5D80 -ENDCHAR -STARTCHAR 79B9 -ENCODING 31161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -16 -68 -7E -49 -7E -08 -FF -8D -B3 -83 -ENDCHAR -STARTCHAR 79BD -ENCODING 31165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -6600 -FF80 -7D00 -7500 -7F00 -FF00 -9500 -BF00 -8300 -ENDCHAR -STARTCHAR 79BE -ENCODING 31166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7800 -0800 -FF80 -1800 -2C00 -4B00 -8880 -0800 -ENDCHAR -STARTCHAR 79BF -ENCODING 31167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7C00 -FF00 -6E00 -8900 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 79C0 -ENCODING 31168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0200 -7C00 -EF00 -6A00 -8180 -7C00 -2700 -6100 -8600 -ENDCHAR -STARTCHAR 79C1 -ENCODING 31169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3400 -C400 -4400 -F400 -6400 -6A00 -D900 -C900 -4B80 -5C00 -ENDCHAR -STARTCHAR 79C9 -ENCODING 31177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0200 -7C00 -FF00 -7F00 -FF80 -7F00 -1800 -6E00 -8900 -ENDCHAR -STARTCHAR 79CA -ENCODING 31178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7C00 -FF00 -6C00 -8F80 -7800 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 79CB -ENCODING 31179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3200 -C200 -4A80 -FB00 -6B00 -6600 -D600 -C900 -4900 -5080 -ENDCHAR -STARTCHAR 79D1 -ENCODING 31185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3100 -C900 -4500 -F100 -6900 -6500 -D780 -CE00 -4100 -4100 -ENDCHAR -STARTCHAR 79D2 -ENCODING 31186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -C500 -4D00 -EC80 -5480 -F500 -ED00 -C200 -4C00 -5000 -ENDCHAR -STARTCHAR 79D5 -ENCODING 31189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3200 -D200 -5280 -FB00 -5200 -F200 -D200 -5280 -5A80 -7300 -ENDCHAR -STARTCHAR 79D8 -ENCODING 31192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -C300 -E900 -5A00 -FB00 -FC80 -DD00 -5900 -5700 -ENDCHAR -STARTCHAR 79DF -ENCODING 31199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2F00 -C900 -4900 -EF00 -6900 -EF00 -C900 -4900 -5F80 -ENDCHAR -STARTCHAR 79E4 -ENCODING 31204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2F00 -C200 -FB00 -5280 -6200 -DF80 -C200 -4200 -4200 -ENDCHAR -STARTCHAR 79E6 -ENCODING 31206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -FF00 -7F00 -1400 -FF80 -7E00 -FF80 -1800 -6E00 -8900 -ENDCHAR -STARTCHAR 79E7 -ENCODING 31207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -C400 -5F00 -F500 -5500 -FF80 -C400 -CA00 -5900 -5080 -ENDCHAR -STARTCHAR 79E9 -ENCODING 31209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -CC00 -4F00 -F400 -4400 -7F80 -C400 -4600 -5900 -5080 -ENDCHAR -STARTCHAR 79FB -ENCODING 31227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -C700 -4900 -F600 -4E00 -FF80 -E900 -D700 -4400 -5800 -ENDCHAR -STARTCHAR 7A00 -ENCODING 31232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -CE00 -4B00 -FF80 -4C00 -7F00 -ED00 -4D00 -4D00 -4400 -ENDCHAR -STARTCHAR 7A05 -ENCODING 31237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2E00 -C900 -FF00 -5180 -F100 -EF00 -CA00 -4A80 -5300 -ENDCHAR -STARTCHAR 7A08 -ENCODING 31240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2F00 -D100 -4F00 -EF00 -4000 -7F00 -D400 -5F80 -4400 -4400 -ENDCHAR -STARTCHAR 7A0B -ENCODING 31243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -CF00 -4900 -EF00 -4300 -6C00 -DF80 -4400 -4400 -5F00 -ENDCHAR -STARTCHAR 7A0D -ENCODING 31245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1280 -6680 -2A40 -7F80 -2480 -7780 -7480 -A780 -2480 -2580 -ENDCHAR -STARTCHAR 7A14 -ENCODING 31252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -CA00 -4900 -FF80 -5F00 -E100 -E600 -5B00 -6980 -6E00 -ENDCHAR -STARTCHAR 7A17 -ENCODING 31255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -DF00 -5500 -FF00 -5500 -FF00 -FA00 -5F80 -4200 -4200 -ENDCHAR -STARTCHAR 7A19 -ENCODING 31257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -DF80 -4400 -EF00 -5F00 -D900 -FF00 -5F00 -5F80 -5000 -ENDCHAR -STARTCHAR 7A1A -ENCODING 31258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -CA00 -4F80 -F200 -5F00 -6A00 -EF00 -CA00 -4F80 -4800 -ENDCHAR -STARTCHAR 7A1C -ENCODING 31260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -DF00 -4400 -FF80 -5B80 -C800 -7F00 -5A00 -4E00 -7180 -ENDCHAR -STARTCHAR 7A1F -ENCODING 31263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7F00 -A500 -7F00 -0000 -7E00 -FF80 -2E00 -C980 -ENDCHAR -STARTCHAR 7A20 -ENCODING 31264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3F -D5 -5F -FF -55 -F7 -57 -5B -51 -ENDCHAR -STARTCHAR 7A2E -ENCODING 31278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2300 -DC00 -5F80 -FF00 -5500 -FF00 -7F00 -5F00 -4400 -5F80 -ENDCHAR -STARTCHAR 7A31 -ENCODING 31281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -CF00 -5480 -E400 -4F00 -7F80 -D500 -DF80 -5100 -5300 -ENDCHAR -STARTCHAR 7A36 -ENCODING 31286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6300 -C280 -5F80 -FB00 -5600 -FB00 -FE80 -5F00 -4580 -4500 -ENDCHAR -STARTCHAR 7A37 -ENCODING 31287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F00 -D500 -5F00 -FF80 -4B00 -F800 -EF00 -5A00 -4600 -5980 -ENDCHAR -STARTCHAR 7A3B -ENCODING 31291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2300 -CF00 -F480 -5000 -FB00 -F100 -DB00 -5F00 -5100 -ENDCHAR -STARTCHAR 7A3C -ENCODING 31292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -DF80 -5F80 -E600 -5E80 -E700 -7D00 -5D00 -5480 -4C00 -ENDCHAR -STARTCHAR 7A3D -ENCODING 31293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2500 -DF80 -4B00 -F400 -4700 -7F80 -DF00 -5100 -5F00 -5F00 -ENDCHAR -STARTCHAR 7A3F -ENCODING 31295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -DF80 -4F00 -EF00 -4000 -FF00 -FE80 -5E80 -5A80 -5100 -ENDCHAR -STARTCHAR 7A40 -ENCODING 31296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2600 -F500 -F580 -F980 -F000 -FF00 -2500 -F200 -5700 -A880 -ENDCHAR -STARTCHAR 7A46 -ENCODING 31302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -DF00 -5F00 -F100 -5F00 -F480 -5D00 -4700 -5F00 -5800 -ENDCHAR -STARTCHAR 7A49 -ENCODING 31305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -D080 -FF00 -5B00 -D000 -DF00 -5F80 -6200 -6200 -ENDCHAR -STARTCHAR 7A4D -ENCODING 31309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -DF00 -4F00 -FF80 -4F00 -7100 -DF00 -CF00 -4A00 -5180 -ENDCHAR -STARTCHAR 7A4E -ENCODING 31310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AF80 -C200 -9F00 -E900 -2F00 -CF00 -F900 -6F00 -DD00 -4880 -ENDCHAR -STARTCHAR 7A57 -ENCODING 31319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -DF80 -5F00 -FF00 -5F00 -E500 -7F80 -5B00 -5980 -6E00 -ENDCHAR -STARTCHAR 7A61 -ENCODING 31329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6400 -DF00 -5D00 -FE80 -5F80 -FF00 -7F00 -5B00 -5500 -5F00 -ENDCHAR -STARTCHAR 7A62 -ENCODING 31330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6C00 -CB00 -5F80 -E300 -5F80 -EE00 -5700 -5D00 -6780 -6D80 -ENDCHAR -STARTCHAR 7A69 -ENCODING 31337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2F00 -D500 -5F80 -FF00 -4000 -DF00 -FF00 -4400 -5B00 -6E80 -ENDCHAR -STARTCHAR 7A6B -ENCODING 31339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -DF80 -4C00 -F380 -5F00 -FC00 -7F80 -5F00 -4600 -5980 -ENDCHAR -STARTCHAR 7A70 -ENCODING 31344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F80 -C000 -5F80 -FF00 -5F80 -DF00 -EA00 -5F80 -5F00 -5980 -ENDCHAR -STARTCHAR 7A74 -ENCODING 31348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8100 -BD00 -0400 -2200 -2200 -4200 -C100 -8080 -ENDCHAR -STARTCHAR 7A76 -ENCODING 31350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A900 -3E00 -D000 -FC00 -1400 -2480 -6480 -8300 -ENDCHAR -STARTCHAR 7A79 -ENCODING 31353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -2E -40 -7F -7F -80 -FF -81 -07 -ENDCHAR -STARTCHAR 7A7A -ENCODING 31354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A480 -2500 -4700 -8000 -7F00 -0800 -0800 -FF80 -ENDCHAR -STARTCHAR 7A7D -ENCODING 31357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -A9 -4E -24 -FF -24 -FF -64 -84 -ENDCHAR -STARTCHAR 7A7F -ENCODING 31359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A900 -C600 -3F00 -4400 -FF80 -1C00 -6400 -8C00 -ENDCHAR -STARTCHAR 7A81 -ENCODING 31361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A900 -2E00 -CC00 -1200 -FF80 -1800 -2600 -C180 -ENDCHAR -STARTCHAR 7A84 -ENCODING 31364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -A9 -6E -E0 -7F -DF -1F -10 -10 -ENDCHAR -STARTCHAR 7A88 -ENCODING 31368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -2E -40 -44 -5F -A5 -75 -75 -CB -ENDCHAR -STARTCHAR 7A92 -ENCODING 31378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -EE80 -0000 -FF00 -2600 -FD00 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 7A93 -ENCODING 31379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A900 -D600 -2200 -FE00 -1100 -6900 -A280 -BC00 -ENDCHAR -STARTCHAR 7A95 -ENCODING 31381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A900 -4E00 -D900 -5A00 -1400 -EB00 -2880 -C700 -ENDCHAR -STARTCHAR 7A98 -ENCODING 31384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -6600 -7E00 -1200 -FF80 -7E00 -7F00 -A100 -3F00 -ENDCHAR -STARTCHAR 7A9F -ENCODING 31391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -6E -00 -7F -7F -69 -BF -C9 -BF -ENDCHAR -STARTCHAR 7AA9 -ENCODING 31401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -EF -00 -3E -4E -FF -BD -BD -A3 -ENDCHAR -STARTCHAR 7AAA -ENCODING 31402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -A680 -4400 -5F00 -BF00 -8000 -5F00 -4400 -BF80 -ENDCHAR -STARTCHAR 7AAE -ENCODING 31406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -AE -40 -FF -F7 -FF -F9 -71 -B3 -ENDCHAR -STARTCHAR 7AAF -ENCODING 31407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -E680 -2400 -FF00 -7F00 -FF80 -0000 -5500 -9500 -ENDCHAR -STARTCHAR 7ABA -ENCODING 31418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -EE00 -4000 -EF00 -4F00 -FF00 -6F00 -AA80 -9B80 -ENDCHAR -STARTCHAR 7AC4 -ENCODING 31428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -E680 -7F00 -7F00 -7F00 -4A00 -4A00 -6E00 -D980 -ENDCHAR -STARTCHAR 7AC5 -ENCODING 31429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2E00 -4400 -F780 -9D00 -FD00 -7200 -9500 -B880 -ENDCHAR -STARTCHAR 7AC7 -ENCODING 31431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -7F -7E -95 -6A -7F -7F -7F -C3 -ENDCHAR -STARTCHAR 7ACA -ENCODING 31434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -EF -27 -CF -EF -E9 -6F -F7 -51 -ENDCHAR -STARTCHAR 7ACB -ENCODING 31435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -FF00 -0000 -4200 -2200 -2400 -2400 -2400 -FF80 -ENDCHAR -STARTCHAR 7AD7 -ENCODING 31447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -E300 -0B00 -AA80 -AA80 -B300 -AD00 -3200 -CC00 -1000 -ENDCHAR -STARTCHAR 7AD9 -ENCODING 31449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -F780 -A400 -A400 -AF00 -A900 -B900 -CF00 -0900 -ENDCHAR -STARTCHAR 7ADD -ENCODING 31453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -FF80 -2100 -A900 -A900 -A600 -B600 -6600 -9F80 -ENDCHAR -STARTCHAR 7ADF -ENCODING 31455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF80 -0000 -7E00 -7E00 -4200 -7E00 -2480 -C700 -ENDCHAR -STARTCHAR 7AE0 -ENCODING 31456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF00 -0000 -7E00 -7E00 -4200 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 7AE3 -ENCODING 31459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4900 -FE00 -AA80 -B700 -CF00 -A900 -5600 -8600 -1980 -ENDCHAR -STARTCHAR 7AE5 -ENCODING 31461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FF80 -0000 -7E00 -7E00 -4900 -7E00 -FF00 -FF80 -ENDCHAR -STARTCHAR 7AEA -ENCODING 31466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -F500 -9600 -F700 -F980 -FF00 -2400 -2400 -FF80 -ENDCHAR -STARTCHAR 7AED -ENCODING 31469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5F -FF -11 -BF -CF -B5 -FB -9F -13 -ENDCHAR -STARTCHAR 7AEF -ENCODING 31471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -F500 -1F00 -A000 -BF80 -DF00 -DA80 -7A80 -9A80 -1B00 -ENDCHAR -STARTCHAR 7AF6 -ENCODING 31478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -A500 -FF80 -F700 -9900 -F700 -7600 -BE80 -D900 -ENDCHAR -STARTCHAR 7AF9 -ENCODING 31481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -7780 -AA00 -AA00 -2200 -2200 -2200 -2200 -2600 -ENDCHAR -STARTCHAR 7AFA -ENCODING 31482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4400 -7780 -AA00 -8100 -0000 -7F00 -0000 -0000 -FF00 -ENDCHAR -STARTCHAR 7AFF -ENCODING 31487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -7F00 -0800 -0800 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 7B0F -ENCODING 31503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -4000 -7F00 -9500 -A500 -4900 -9100 -2600 -ENDCHAR -STARTCHAR 7B11 -ENCODING 31505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -0300 -7C00 -0800 -FF80 -1800 -6600 -8100 -ENDCHAR -STARTCHAR 7B19 -ENCODING 31513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -4800 -4800 -7F00 -FE00 -8800 -0800 -FF80 -ENDCHAR -STARTCHAR 7B1B -ENCODING 31515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7780 -AA00 -0800 -7F00 -8900 -7F00 -8900 -7F00 -8100 -ENDCHAR -STARTCHAR 7B1E -ENCODING 31518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -BA00 -2200 -FF00 -0100 -7E00 -4100 -7E00 -4100 -ENDCHAR -STARTCHAR 7B20 -ENCODING 31520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -0800 -FF00 -0000 -2200 -2400 -2400 -FF80 -ENDCHAR -STARTCHAR 7B26 -ENCODING 31526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -2200 -4200 -5F80 -D200 -CA00 -4200 -4600 -ENDCHAR -STARTCHAR 7B2C -ENCODING 31532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -FF00 -0900 -7F00 -FF00 -3100 -4B00 -8800 -ENDCHAR -STARTCHAR 7B2D -ENCODING 31533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -1800 -7E00 -8180 -7F00 -1100 -1600 -1000 -ENDCHAR -STARTCHAR 7B39 -ENCODING 31545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -5200 -5200 -FF80 -5200 -4E00 -7F00 -4000 -ENDCHAR -STARTCHAR 7B46 -ENCODING 31558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -7F00 -FF80 -7F00 -FF00 -0800 -FF80 -0800 -ENDCHAR -STARTCHAR 7B49 -ENCODING 31561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -7E00 -0800 -FF00 -0400 -FF00 -2400 -0C00 -ENDCHAR -STARTCHAR 7B4B -ENCODING 31563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -F400 -9F00 -F500 -9500 -F500 -9900 -AB00 -ENDCHAR -STARTCHAR 7B4C -ENCODING 31564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -3800 -1400 -6200 -FF00 -7E00 -0800 -FF00 -ENDCHAR -STARTCHAR 7B4D -ENCODING 31565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4400 -7F80 -AA00 -7F00 -8100 -FD00 -7D00 -7D00 -4300 -ENDCHAR -STARTCHAR 7B4F -ENCODING 31567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7780 -AA00 -AE00 -4F00 -F900 -C600 -4400 -5A80 -5100 -ENDCHAR -STARTCHAR 7B50 -ENCODING 31568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -FF00 -BE00 -8800 -BE00 -BF00 -FF00 -8000 -ENDCHAR -STARTCHAR 7B51 -ENCODING 31569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -0000 -EE00 -4E00 -4E00 -6E00 -D280 -1180 -ENDCHAR -STARTCHAR 7B52 -ENCODING 31570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -FF00 -8100 -BD00 -BD00 -A500 -BD00 -A300 -ENDCHAR -STARTCHAR 7B54 -ENCODING 31572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -1800 -6600 -BD00 -0000 -7E00 -4200 -7E00 -ENDCHAR -STARTCHAR 7B56 -ENCODING 31574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -FF00 -0800 -7F00 -9900 -AF00 -4B00 -8980 -ENDCHAR -STARTCHAR 7B60 -ENCODING 31584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7780 -AA00 -4800 -4F00 -F100 -5F00 -4F00 -6100 -C300 -ENDCHAR -STARTCHAR 7B6C -ENCODING 31596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -0A00 -7F00 -8900 -7600 -9400 -BA80 -9100 -ENDCHAR -STARTCHAR 7B6E -ENCODING 31598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -0000 -FF00 -4A00 -4A00 -6D00 -AD00 -FF80 -ENDCHAR -STARTCHAR 7B75 -ENCODING 31605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -C300 -5C00 -6B00 -2C00 -4F80 -4000 -BF80 -ENDCHAR -STARTCHAR 7B7D -ENCODING 31613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -A800 -BE00 -BE00 -8000 -7E00 -FF80 -3400 -C380 -ENDCHAR -STARTCHAR 7B87 -ENCODING 31623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -FF00 -8900 -BF00 -BD00 -BD00 -FF00 -8100 -ENDCHAR -STARTCHAR 7B8B -ENCODING 31627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AE00 -3F00 -CD00 -F700 -0800 -FF00 -0C80 -F300 -ENDCHAR -STARTCHAR 7B8F -ENCODING 31631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -7E00 -C900 -FE00 -FF80 -7200 -0E00 -3000 -ENDCHAR -STARTCHAR 7B94 -ENCODING 31636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -4400 -1F00 -D100 -3F00 -5100 -9F00 -9100 -ENDCHAR -STARTCHAR 7B95 -ENCODING 31637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -FF00 -2200 -3E00 -3E00 -FF80 -2600 -C100 -ENDCHAR -STARTCHAR 7B97 -ENCODING 31639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -7E00 -7E00 -7E00 -7E00 -FF80 -2400 -C400 -ENDCHAR -STARTCHAR 7B9A -ENCODING 31642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -6500 -9500 -FD00 -0500 -F500 -F100 -9300 -ENDCHAR -STARTCHAR 7B9D -ENCODING 31645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7780 -AA00 -4900 -FF80 -4900 -6F00 -C900 -4F00 -C900 -ENDCHAR -STARTCHAR 7BA1 -ENCODING 31649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -FF00 -FF00 -4200 -7E00 -7E00 -4200 -7E00 -ENDCHAR -STARTCHAR 7BAD -ENCODING 31661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AE00 -FF80 -0000 -F500 -B500 -D500 -B500 -B300 -ENDCHAR -STARTCHAR 7BB1 -ENCODING 31665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -4F00 -F900 -4F00 -6900 -DF00 -CF00 -4900 -ENDCHAR -STARTCHAR 7BB4 -ENCODING 31668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -0600 -FF80 -FD00 -B600 -B600 -CE80 -9100 -ENDCHAR -STARTCHAR 7BB8 -ENCODING 31672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -BA00 -7D00 -1200 -FF80 -BE00 -2200 -3E00 -3E00 -ENDCHAR -STARTCHAR 7BC0 -ENCODING 31680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -F700 -9500 -F500 -F500 -F500 -F700 -8400 -ENDCHAR -STARTCHAR 7BC1 -ENCODING 31681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -BA00 -7E00 -7E00 -7E00 -0000 -FF00 -7F00 -FF80 -ENDCHAR -STARTCHAR 7BC4 -ENCODING 31684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -F700 -F500 -B500 -F700 -F400 -F480 -2700 -ENDCHAR -STARTCHAR 7BC6 -ENCODING 31686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7780 -A800 -3E00 -3C00 -FF80 -F500 -DE00 -6B00 -D980 -ENDCHAR -STARTCHAR 7BC7 -ENCODING 31687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -A300 -7E00 -7F00 -7F00 -FF00 -D500 -FF00 -D500 -ENDCHAR -STARTCHAR 7BC9 -ENCODING 31689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -EE00 -6E80 -D100 -1000 -FF80 -2E00 -C980 -ENDCHAR -STARTCHAR 7BD2 -ENCODING 31698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -BA00 -7E00 -8180 -7E00 -4200 -7E00 -5E00 -E300 -ENDCHAR -STARTCHAR 7BE0 -ENCODING 31712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -EE00 -4F00 -B900 -BF00 -A400 -7F00 -6A00 -5580 -ENDCHAR -STARTCHAR 7BE4 -ENCODING 31716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -7F00 -7F00 -7F00 -4800 -7F00 -AD00 -AB00 -ENDCHAR -STARTCHAR 7BE9 -ENCODING 31721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -4F80 -E200 -EF00 -8A80 -EA80 -9B00 -E200 -ENDCHAR -STARTCHAR 7C07 -ENCODING 31751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -EA00 -4F00 -F400 -6F00 -AF00 -A600 -AF00 -E880 -ENDCHAR -STARTCHAR 7C12 -ENCODING 31762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -7E00 -7E00 -7E00 -7E00 -FF80 -5A00 -B300 -FD00 -ENDCHAR -STARTCHAR 7C1E -ENCODING 31774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -FF00 -F700 -0000 -7E00 -7E00 -7E00 -FF80 -0800 -ENDCHAR -STARTCHAR 7C21 -ENCODING 31777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AA00 -F700 -9900 -F700 -BD00 -BD00 -BD00 -8300 -ENDCHAR -STARTCHAR 7C27 -ENCODING 31783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -FF00 -3C00 -0000 -FF80 -7F00 -4900 -7F00 -E380 -ENDCHAR -STARTCHAR 7C2A -ENCODING 31786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -FF00 -6600 -DF00 -7680 -FF80 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR 7C2B -ENCODING 31787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -FF00 -FF80 -7F00 -AD00 -6F00 -FF00 -EF00 -AD00 -ENDCHAR -STARTCHAR 7C3D -ENCODING 31805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -BA00 -7E00 -8180 -7F00 -7F00 -2200 -6600 -9900 -ENDCHAR -STARTCHAR 7C3E -ENCODING 31806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -FF80 -FF00 -BF00 -FF80 -BF00 -B600 -D500 -ENDCHAR -STARTCHAR 7C3F -ENCODING 31807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -AE00 -7F80 -1F00 -A500 -1F00 -7F80 -9200 -8E00 -ENDCHAR -STARTCHAR 7C43 -ENCODING 31811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AC00 -F780 -9800 -E700 -F000 -7F00 -5500 -FF80 -ENDCHAR -STARTCHAR 7C4C -ENCODING 31820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -FF00 -7E00 -FF00 -7F00 -0000 -7F00 -FF00 -F600 -ENDCHAR -STARTCHAR 7C4D -ENCODING 31821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -FF80 -4500 -FF80 -FF00 -6900 -DF00 -4900 -ENDCHAR -STARTCHAR 7C60 -ENCODING 31840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -EA00 -FF00 -FF00 -0F00 -FF00 -FF00 -FF80 -BF00 -ENDCHAR -STARTCHAR 7C64 -ENCODING 31844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7780 -EC00 -BD00 -FF00 -DD00 -D300 -5A00 -5E80 -E500 -ENDCHAR -STARTCHAR 7C6C -ENCODING 31852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -F500 -F780 -FE00 -FF00 -F700 -F780 -9400 -ENDCHAR -STARTCHAR 7C73 -ENCODING 31859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -49 -2A -08 -FF -18 -2C -4B -89 -08 -ENDCHAR -STARTCHAR 7C83 -ENCODING 31875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -F200 -F280 -4F00 -F200 -5200 -F200 -5280 -4E80 -5300 -ENDCHAR -STARTCHAR 7C89 -ENCODING 31881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -D900 -E900 -5100 -FF80 -6500 -E500 -C900 -5900 -5700 -ENDCHAR -STARTCHAR 7C92 -ENCODING 31890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -DF80 -E000 -4900 -E900 -6900 -DA00 -CA00 -4200 -5F80 -ENDCHAR -STARTCHAR 7C95 -ENCODING 31893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -42 -E4 -EF -49 -E9 -6F -E9 -C9 -4F -49 -ENDCHAR -STARTCHAR 7C97 -ENCODING 31895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -D900 -E900 -4F00 -F900 -6900 -5F00 -C900 -4900 -5F80 -ENDCHAR -STARTCHAR 7C98 -ENCODING 31896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -D400 -D380 -4400 -F400 -6F00 -5900 -C900 -CF00 -4900 -ENDCHAR -STARTCHAR 7C9F -ENCODING 31903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -9500 -FF00 -2A00 -FF80 -1C00 -6A00 -8900 -ENDCHAR -STARTCHAR 7CA5 -ENCODING 31909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -CB -6D -55 -CB -BC -DB -55 -2D -49 -CB -ENDCHAR -STARTCHAR 7CA7 -ENCODING 31911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -DF80 -E800 -4A00 -EA00 -7700 -F200 -D200 -5200 -5F80 -ENDCHAR -STARTCHAR 7CAE -ENCODING 31918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -EF00 -E900 -4F00 -E900 -6F00 -ED00 -CA00 -4D00 -5880 -ENDCHAR -STARTCHAR 7CB1 -ENCODING 31921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -9B00 -7A80 -B600 -8800 -2C00 -FF00 -6E00 -8980 -ENDCHAR -STARTCHAR 7CB2 -ENCODING 31922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -3F00 -F500 -5600 -6980 -AA00 -FF00 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 7CB3 -ENCODING 31923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -E400 -EF00 -5500 -EF00 -4F00 -EC00 -C400 -5A00 -5180 -ENDCHAR -STARTCHAR 7CB9 -ENCODING 31929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -DF80 -E900 -4900 -EB00 -5680 -6400 -FF80 -C400 -4400 -ENDCHAR -STARTCHAR 7CBE -ENCODING 31934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -FF00 -5F80 -E000 -4F00 -F500 -CF00 -5100 -5300 -ENDCHAR -STARTCHAR 7CCA -ENCODING 31946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4B -EB -FF -4B -EB -5B -F7 -5B -55 -45 -ENDCHAR -STARTCHAR 7CD6 -ENCODING 31958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -FF00 -5500 -FF80 -5F00 -FF00 -5900 -5900 -6F00 -ENDCHAR -STARTCHAR 7CDE -ENCODING 31966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -FF00 -2C00 -FF80 -4900 -7F00 -FF00 -FF80 -2000 -C300 -ENDCHAR -STARTCHAR 7CDF -ENCODING 31967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -FF80 -FF00 -5A80 -FF00 -4000 -EF00 -5100 -4F00 -5100 -ENDCHAR -STARTCHAR 7CE0 -ENCODING 31968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF80 -FF00 -5300 -FF80 -5F00 -FA80 -5700 -5B00 -6480 -ENDCHAR -STARTCHAR 7CE7 -ENCODING 31975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -EF00 -EF00 -4000 -FF80 -4F00 -EF00 -CF00 -5F00 -5F80 -ENDCHAR -STARTCHAR 7CFB -ENCODING 31995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -06 -78 -12 -64 -1A -FF -2C -4B -89 -ENDCHAR -STARTCHAR 7CFE -ENCODING 31998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -C900 -A900 -6900 -5900 -F980 -D700 -D900 -D100 -4100 -ENDCHAR -STARTCHAR 7D00 -ENCODING 32000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -AF00 -C100 -6100 -EF00 -5800 -E800 -D880 -C880 -4F00 -ENDCHAR -STARTCHAR 7D02 -ENCODING 32002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -6100 -AF80 -4100 -6900 -F500 -D500 -D100 -D100 -4300 -ENDCHAR -STARTCHAR 7D04 -ENCODING 32004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -C8 -AF -49 -55 -F5 -D3 -D1 -D1 -47 -ENDCHAR -STARTCHAR 7D05 -ENCODING 32005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -4F00 -A200 -4200 -5200 -F200 -D200 -D200 -D200 -5F80 -ENDCHAR -STARTCHAR 7D06 -ENCODING 32006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -4F00 -A200 -C200 -6F80 -F200 -E200 -E200 -D200 -4C00 -ENDCHAR -STARTCHAR 7D07 -ENCODING 32007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4800 -AF80 -5000 -7E00 -E200 -E400 -D880 -D080 -5F00 -ENDCHAR -STARTCHAR 7D08 -ENCODING 32008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -A800 -BE00 -4A00 -7A00 -EE00 -EE00 -EA00 -D280 -6300 -ENDCHAR -STARTCHAR 7D0A -ENCODING 32010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -3C00 -6380 -9400 -2A00 -1F00 -EA00 -4B00 -8900 -ENDCHAR -STARTCHAR 7D0B -ENCODING 32011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -BF80 -4900 -6A00 -F600 -E600 -DE00 -D900 -5080 -ENDCHAR -STARTCHAR 7D0D -ENCODING 32013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4C -A4 -BF -55 -B5 -F7 -F9 -F1 -D1 -53 -ENDCHAR -STARTCHAR 7D10 -ENCODING 32016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -6F00 -C500 -6500 -FF80 -4900 -E900 -E900 -C900 -5F80 -ENDCHAR -STARTCHAR 7D14 -ENCODING 32020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -BC00 -4D00 -6D00 -ED00 -EF00 -E400 -E480 -4300 -ENDCHAR -STARTCHAR 7D17 -ENCODING 32023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6D00 -AD00 -4D00 -7480 -E500 -EE00 -E200 -DC00 -5000 -ENDCHAR -STARTCHAR 7D18 -ENCODING 32024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6800 -A800 -5F80 -6800 -EA00 -4A00 -ED00 -ED00 -D500 -5E80 -ENDCHAR -STARTCHAR 7D19 -ENCODING 32025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -4A00 -AA00 -CA00 -6F80 -EA00 -EA00 -EA00 -DE80 -5900 -ENDCHAR -STARTCHAR 7D1A -ENCODING 32026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -BE00 -4A00 -6A00 -EB00 -5D00 -ED00 -F200 -D500 -6880 -ENDCHAR -STARTCHAR 7D1B -ENCODING 32027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4600 -A900 -C900 -7100 -EF80 -E500 -E500 -D900 -5700 -ENDCHAR -STARTCHAR 7D20 -ENCODING 32032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E00 -FF80 -1400 -3A00 -FF00 -0800 -6A00 -8900 -ENDCHAR -STARTCHAR 7D21 -ENCODING 32033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -E400 -BF80 -4400 -6700 -F500 -E900 -D900 -D100 -5300 -ENDCHAR -STARTCHAR 7D22 -ENCODING 32034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -91 -A5 -1A -D3 -3C -6A -89 -ENDCHAR -STARTCHAR 7D2B -ENCODING 32043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2500 -B600 -B480 -C700 -1400 -3800 -1B00 -FC80 -6A00 -8900 -ENDCHAR -STARTCHAR 7D2C -ENCODING 32044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -64 -AF -4D -6D -EF -ED -ED -EF -49 -ENDCHAR -STARTCHAR 7D2E -ENCODING 32046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -F400 -5400 -B480 -3700 -3400 -1A00 -FF00 -6A00 -8900 -ENDCHAR -STARTCHAR 7D2F -ENCODING 32047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7F -89 -7F -54 -3A -FF -6A -89 -ENDCHAR -STARTCHAR 7D30 -ENCODING 32048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -75 -B5 -55 -6F -F5 -F5 -F5 -CF -51 -ENDCHAR -STARTCHAR 7D33 -ENCODING 32051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -A4 -AF -55 -6F -F5 -EF -E5 -C4 -44 -ENDCHAR -STARTCHAR 7D35 -ENCODING 32053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -B080 -D080 -7F80 -E400 -E400 -E400 -E400 -4C00 -ENDCHAR -STARTCHAR 7D39 -ENCODING 32057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -65 -A5 -49 -73 -EF -E9 -E9 -CF -49 -ENDCHAR -STARTCHAR 7D3A -ENCODING 32058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -A900 -5F80 -6900 -F900 -5F00 -E900 -D900 -DF00 -4900 -ENDCHAR -STARTCHAR 7D42 -ENCODING 32066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -6F00 -A900 -DA00 -6600 -EF00 -FB80 -E000 -EC00 -4300 -ENDCHAR -STARTCHAR 7D43 -ENCODING 32067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -6200 -AF80 -C400 -6500 -EA00 -E700 -E500 -DB80 -5C80 -ENDCHAR -STARTCHAR 7D44 -ENCODING 32068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -A900 -6900 -6F00 -E900 -EF00 -E900 -D900 -5F80 -ENDCHAR -STARTCHAR 7D45 -ENCODING 32069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -71 -B1 -57 -77 -F7 -F7 -F5 -D1 -53 -ENDCHAR -STARTCHAR 7D46 -ENCODING 32070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6D00 -AD00 -5480 -6F00 -E400 -FF80 -E400 -D400 -4400 -ENDCHAR -STARTCHAR 7D50 -ENCODING 32080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6400 -BF80 -4400 -6F00 -E000 -EF00 -D900 -DF00 -4900 -ENDCHAR -STARTCHAR 7D5E -ENCODING 32094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -4A00 -6900 -F080 -4900 -E600 -E600 -C900 -5080 -ENDCHAR -STARTCHAR 7D61 -ENCODING 32097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -A900 -D600 -6700 -F980 -EF00 -E900 -DF00 -4900 -ENDCHAR -STARTCHAR 7D62 -ENCODING 32098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -68 -AF -DF -7B -EF -EB -EF -E1 -43 -ENDCHAR -STARTCHAR 7D66 -ENCODING 32102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -A900 -5F80 -6000 -EF00 -E900 -E900 -CF00 -4900 -ENDCHAR -STARTCHAR 7D68 -ENCODING 32104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -A280 -DF80 -4A00 -AA00 -FF00 -EB00 -EA00 -CE80 -5500 -ENDCHAR -STARTCHAR 7D6A -ENCODING 32106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -B5 -D5 -5F -75 -F5 -F7 -F9 -FF -51 -ENDCHAR -STARTCHAR 7D6E -ENCODING 32110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -F7 -99 -67 -99 -76 -1B -FC -6A -89 -ENDCHAR -STARTCHAR 7D71 -ENCODING 32113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -8F80 -A500 -4B00 -6C80 -EA00 -DA00 -EA00 -DA80 -5380 -ENDCHAR -STARTCHAR 7D72 -ENCODING 32114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4D00 -A500 -4200 -5500 -FF00 -DB00 -DB00 -DA80 -4200 -ENDCHAR -STARTCHAR 7D73 -ENCODING 32115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -B900 -4600 -BB80 -EF00 -EA00 -FF80 -E200 -4200 -ENDCHAR -STARTCHAR 7D76 -ENCODING 32118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6E00 -AA00 -DF00 -7B00 -EB00 -4F00 -E800 -E880 -EF00 -ENDCHAR -STARTCHAR 7D79 -ENCODING 32121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -69 -AF -40 -6F -EF -E9 -EF -D1 -4B -ENDCHAR -STARTCHAR 7D7F -ENCODING 32127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -A500 -DF80 -7500 -EF00 -4600 -ED00 -F500 -E480 -4C00 -ENDCHAR -STARTCHAR 7D8E -ENCODING 32142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -BE00 -CA00 -D200 -BF80 -EA00 -FA00 -FB00 -DC00 -6780 -ENDCHAR -STARTCHAR 7D8F -ENCODING 32143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -6F00 -AD00 -5280 -6400 -FF80 -E900 -EA00 -C500 -4880 -ENDCHAR -STARTCHAR 7D93 -ENCODING 32147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -6B00 -AD00 -5600 -6D00 -EB00 -EF00 -E400 -D400 -5F80 -ENDCHAR -STARTCHAR 7D9C -ENCODING 32156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -B080 -4F00 -A000 -FF80 -ED00 -F500 -D480 -4C00 -ENDCHAR -STARTCHAR 7DA0 -ENCODING 32160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -6F00 -AE00 -4200 -7F80 -F500 -EE00 -ED00 -D480 -4C00 -ENDCHAR -STARTCHAR 7DA2 -ENCODING 32162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -75 -B7 -4F -75 -F1 -F7 -D7 -D7 -53 -ENDCHAR -STARTCHAR 7DAC -ENCODING 32172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -6D00 -AD00 -5F00 -7080 -FF00 -E900 -E600 -C700 -5900 -ENDCHAR -STARTCHAR 7DAD -ENCODING 32173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -AA00 -AF80 -5A00 -7F00 -EA00 -EF00 -EA00 -EF80 -4800 -ENDCHAR -STARTCHAR 7DB1 -ENCODING 32177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -BB -B7 -53 -BF -FF -FF -FF -F9 -53 -ENDCHAR -STARTCHAR 7DB2 -ENCODING 32178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -7B -B7 -DF -75 -FF -F5 -F7 -F1 -51 -ENDCHAR -STARTCHAR 7DB4 -ENCODING 32180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -B700 -C900 -B280 -FF80 -F700 -E900 -F700 -5480 -ENDCHAR -STARTCHAR 7DB5 -ENCODING 32181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -AF00 -B480 -5000 -A400 -FF00 -E600 -ED00 -D480 -4400 -ENDCHAR -STARTCHAR 7DB8 -ENCODING 32184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -A900 -B080 -4E00 -7F00 -F680 -F680 -FF00 -D680 -5700 -ENDCHAR -STARTCHAR 7DBA -ENCODING 32186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -AF80 -C600 -6980 -FF80 -4100 -EF00 -EF00 -EB00 -C300 -ENDCHAR -STARTCHAR 7DBB -ENCODING 32187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -B080 -4F00 -6400 -EC00 -EB00 -EC00 -D400 -5380 -ENDCHAR -STARTCHAR 7DBD -ENCODING 32189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6780 -AF00 -7100 -6F00 -D100 -EF00 -FF80 -E400 -4400 -ENDCHAR -STARTCHAR 7DBE -ENCODING 32190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -C400 -5F80 -FB80 -4400 -EF00 -FA00 -CE00 -5180 -ENDCHAR -STARTCHAR 7DBF -ENCODING 32191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -AF -C9 -6F -EF -44 -FF -F5 -D5 -54 -ENDCHAR -STARTCHAR 7DC7 -ENCODING 32199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A80 -7500 -B500 -4A80 -6000 -EF00 -F480 -EF00 -CF00 -5080 -ENDCHAR -STARTCHAR 7DCA -ENCODING 32202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -F5 -F2 -FD -14 -3A -FF -6E -89 -ENDCHAR -STARTCHAR 7DCB -ENCODING 32203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -AA00 -BB80 -4A00 -7B80 -EA00 -FB80 -EA00 -CA00 -5200 -ENDCHAR -STARTCHAR 7DD6 -ENCODING 32214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6F00 -A500 -5F80 -6500 -CF00 -F900 -EF00 -EF00 -4900 -ENDCHAR -STARTCHAR 7DD8 -ENCODING 32216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -A200 -DF80 -5E00 -B280 -FF00 -BD00 -BE00 -9780 -6500 -ENDCHAR -STARTCHAR 7DDA -ENCODING 32218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -AF00 -5100 -AF00 -E500 -FA00 -EA00 -CD00 -5C80 -ENDCHAR -STARTCHAR 7DDD -ENCODING 32221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -6900 -AF00 -DF80 -6900 -EF00 -EF00 -E980 -DF00 -4100 -ENDCHAR -STARTCHAR 7DDE -ENCODING 32222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B00 -BD00 -D580 -BD80 -F000 -5F00 -D500 -FB00 -F300 -5580 -ENDCHAR -STARTCHAR 7DE0 -ENCODING 32224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -A900 -5F80 -B480 -EF00 -ED00 -ED00 -ED00 -4400 -ENDCHAR -STARTCHAR 7DE1 -ENCODING 32225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -A900 -CF00 -6F80 -FE80 -4100 -EF00 -EF00 -EF00 -4900 -ENDCHAR -STARTCHAR 7DE3 -ENCODING 32227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -6F00 -AE00 -C200 -BF80 -F680 -ED00 -F700 -DA80 -4400 -ENDCHAR -STARTCHAR 7DE8 -ENCODING 32232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -BE00 -DF00 -5100 -BF00 -FF80 -FE80 -FF80 -DE80 -6D80 -ENDCHAR -STARTCHAR 7DE9 -ENCODING 32233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -6F00 -B480 -4F00 -A400 -FF80 -EF00 -ED00 -D600 -4D80 -ENDCHAR -STARTCHAR 7DEC -ENCODING 32236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -BF80 -A400 -5F00 -BB00 -F700 -FB00 -F700 -FF00 -5100 -ENDCHAR -STARTCHAR 7DEF -ENCODING 32239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -BF80 -4000 -6F00 -EF00 -FF00 -EA00 -DF80 -4200 -ENDCHAR -STARTCHAR 7DF4 -ENCODING 32244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -A400 -DF00 -7F00 -FF00 -E600 -FD00 -D480 -4400 -ENDCHAR -STARTCHAR 7DFB -ENCODING 32251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5E00 -B200 -D780 -5F00 -BB00 -EB00 -FD00 -E900 -DF00 -4480 -ENDCHAR -STARTCHAR 7E09 -ENCODING 32265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -AA00 -BF00 -5080 -BF80 -E000 -EF00 -EF00 -F100 -4F00 -ENDCHAR -STARTCHAR 7E0A -ENCODING 32266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -6900 -B080 -CE00 -6E00 -F100 -FF80 -F700 -F700 -5F80 -ENDCHAR -STARTCHAR 7E15 -ENCODING 32277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -7500 -B500 -4B00 -AF00 -E000 -FF00 -F700 -D700 -5F80 -ENDCHAR -STARTCHAR 7E1B -ENCODING 32283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -7F80 -BF00 -5480 -7F80 -FF00 -E100 -DF80 -D900 -4200 -ENDCHAR -STARTCHAR 7E1D -ENCODING 32285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B80 -AF00 -C000 -5700 -B700 -F700 -F700 -FF80 -EA00 -5180 -ENDCHAR -STARTCHAR 7E1E -ENCODING 32286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -A000 -AF00 -4F00 -6000 -FF00 -F680 -F680 -D480 -5100 -ENDCHAR -STARTCHAR 7E1F -ENCODING 32287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -7000 -BF00 -5F80 -7B00 -FD80 -F100 -FF80 -D500 -4300 -ENDCHAR -STARTCHAR 7E21 -ENCODING 32289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -B480 -CF00 -6A00 -FF80 -E400 -EF00 -E400 -4400 -ENDCHAR -STARTCHAR 7E23 -ENCODING 32291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F80 -F200 -DD00 -F600 -8500 -FF80 -B680 -B680 -AA00 -ENDCHAR -STARTCHAR 7E2B -ENCODING 32299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -AF00 -A500 -5F80 -A200 -D700 -F700 -F780 -DA00 -5780 -ENDCHAR -STARTCHAR 7E2E -ENCODING 32302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -B880 -4F00 -B200 -F700 -EC80 -EF00 -EF00 -4C80 -ENDCHAR -STARTCHAR 7E2F -ENCODING 32303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -B080 -CF00 -6F00 -F500 -EF00 -EF00 -CB00 -5080 -ENDCHAR -STARTCHAR 7E31 -ENCODING 32305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B00 -B500 -DF00 -CF00 -BA80 -F200 -F780 -F600 -D600 -5B80 -ENDCHAR -STARTCHAR 7E37 -ENCODING 32311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -BF80 -4F00 -BF00 -F500 -FF80 -EA00 -C600 -5900 -ENDCHAR -STARTCHAR 7E3D -ENCODING 32317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -B700 -5B00 -B700 -FF00 -E400 -FB00 -D980 -4600 -ENDCHAR -STARTCHAR 7E3E -ENCODING 32318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -AF00 -5F80 -6F00 -E900 -EF00 -EF00 -EB00 -5180 -ENDCHAR -STARTCHAR 7E41 -ENCODING 32321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -B780 -FD00 -D300 -FC80 -3400 -2A00 -FF00 -6E00 -8900 -ENDCHAR -STARTCHAR 7E43 -ENCODING 32323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -55 -B5 -DF -5F -B7 -FF -F7 -FF -D7 -5B -ENDCHAR -STARTCHAR 7E46 -ENCODING 32326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5B00 -BA80 -AB00 -5680 -7A00 -F580 -E600 -FD00 -FE00 -5800 -ENDCHAR -STARTCHAR 7E47 -ENCODING 32327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -7E00 -A500 -4600 -C300 -7F00 -F700 -2700 -BA80 -F200 -ENDCHAR -STARTCHAR 7E52 -ENCODING 32338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -B100 -BF80 -7F00 -BF00 -E000 -EF00 -EF00 -CF00 -5100 -ENDCHAR -STARTCHAR 7E54 -ENCODING 32340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -BF00 -D680 -DF80 -8200 -FF00 -FD00 -FE00 -D680 -4580 -ENDCHAR -STARTCHAR 7E55 -ENCODING 32341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -7F80 -AF00 -DF80 -6D00 -FF80 -E000 -EF00 -CF00 -4900 -ENDCHAR -STARTCHAR 7E5E -ENCODING 32350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -BF00 -C900 -7F00 -F380 -FF80 -EA00 -EA80 -5300 -ENDCHAR -STARTCHAR 7E61 -ENCODING 32353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -BF80 -5F00 -BF00 -FD00 -FF00 -F500 -DF00 -6F00 -ENDCHAR -STARTCHAR 7E69 -ENCODING 32361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -B700 -DB00 -4E00 -B700 -FB00 -F680 -FB00 -D680 -4700 -ENDCHAR -STARTCHAR 7E6A -ENCODING 32362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -D080 -5F00 -BF00 -FF00 -FF00 -F100 -FF00 -5F00 -ENDCHAR -STARTCHAR 7E6B -ENCODING 32363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F600 -F580 -F980 -FF00 -4600 -FD80 -2A00 -FF00 -2E00 -C900 -ENDCHAR -STARTCHAR 7E6D -ENCODING 32365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -EF00 -AF00 -F700 -F500 -B700 -AB00 -ENDCHAR -STARTCHAR 7E70 -ENCODING 32368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -6900 -CF00 -FF00 -7F00 -C000 -FF80 -E600 -CD80 -5400 -ENDCHAR -STARTCHAR 7E79 -ENCODING 32377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -B680 -BF00 -4F00 -6400 -DF80 -FF80 -EF00 -E400 -4400 -ENDCHAR -STARTCHAR 7E7C -ENCODING 32380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5900 -BF00 -DD00 -BF80 -FF80 -5900 -FF00 -FD00 -DF80 -5F80 -ENDCHAR -STARTCHAR 7E82 -ENCODING 32386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -6200 -5E00 -7E00 -FF80 -5200 -9980 -7C00 -6A00 -ENDCHAR -STARTCHAR 7E8C -ENCODING 32396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -A000 -5F00 -7F00 -FF00 -FF00 -FF00 -DF00 -5980 -ENDCHAR -STARTCHAR 7E8F -ENCODING 32399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -DB00 -DF00 -B600 -FF00 -B600 -AB00 -AF00 -4F80 -ENDCHAR -STARTCHAR 7E93 -ENCODING 32403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -7F00 -BF00 -DF00 -6700 -F680 -FF80 -EA00 -C600 -5900 -ENDCHAR -STARTCHAR 7E96 -ENCODING 32406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5600 -B700 -DA00 -5F80 -B600 -F680 -F500 -F500 -DB80 -4580 -ENDCHAR -STARTCHAR 7E98 -ENCODING 32408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -BB00 -DF80 -DF00 -BF80 -F100 -FF00 -FF00 -C000 -5980 -ENDCHAR -STARTCHAR 7E9B -ENCODING 32411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -7F00 -FF80 -5A00 -7F00 -7F00 -D500 -F600 -FF00 -B700 -ENDCHAR -STARTCHAR 7E9C -ENCODING 32412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9A00 -DF80 -DB80 -BB80 -FF00 -5F00 -DF00 -FF00 -CA80 -7300 -ENDCHAR -STARTCHAR 7F36 -ENCODING 32566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2000 -7F00 -8800 -0800 -FF80 -8900 -8900 -7F00 -8100 -ENDCHAR -STARTCHAR 7F38 -ENCODING 32568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -FF00 -C200 -4200 -F200 -D200 -D200 -D200 -F200 -9F80 -ENDCHAR -STARTCHAR 7F3A -ENCODING 32570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -E400 -CF00 -4500 -F500 -5F80 -D400 -DA00 -F900 -1080 -ENDCHAR -STARTCHAR 7F4C -ENCODING 32588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -9900 -FF00 -6700 -B900 -7F00 -FF80 -8900 -7F00 -ENDCHAR -STARTCHAR 7F50 -ENCODING 32592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9F80 -EA00 -DF00 -5F00 -EA00 -EF80 -FF00 -EB00 -EE00 -8F80 -ENDCHAR -STARTCHAR 7F54 -ENCODING 32596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -A5 -FF -89 -FF -A1 -BD -81 -83 -ENDCHAR -STARTCHAR 7F55 -ENCODING 32597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -A900 -2E00 -C000 -7F00 -0800 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 7F6A -ENCODING 32618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -0000 -F700 -1400 -F700 -E780 -2400 -C400 -ENDCHAR -STARTCHAR 7F6B -ENCODING 32619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -2200 -FA00 -FA00 -0300 -FA80 -3A00 -E200 -ENDCHAR -STARTCHAR 7F6E -ENCODING 32622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -FF80 -1000 -BF00 -A100 -BF00 -A100 -FF80 -ENDCHAR -STARTCHAR 7F70 -ENCODING 32624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -F1 -FD -F5 -F5 -05 -F1 -F3 -ENDCHAR -STARTCHAR 7F72 -ENCODING 32626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -1100 -7E00 -FF80 -3400 -FE00 -3E00 -3E00 -ENDCHAR -STARTCHAR 7F75 -ENCODING 32629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -00 -7F -7F -7F -7F -AD -AB -ENDCHAR -STARTCHAR 7F77 -ENCODING 32631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -6500 -7680 -0700 -F400 -9700 -F480 -B700 -ENDCHAR -STARTCHAR 7F79 -ENCODING 32633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -4800 -EA00 -FF00 -DF00 -5F00 -5200 -4F80 -ENDCHAR -STARTCHAR 7F85 -ENCODING 32645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -4800 -AA00 -6F00 -EF00 -EB00 -DE00 -CF80 -ENDCHAR -STARTCHAR 7F88 -ENCODING 32648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -AF -FF -EA -FF -FF -FD -4F -ENDCHAR -STARTCHAR 7F8A -ENCODING 32650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -2400 -FF00 -0800 -7F00 -0800 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 7F8C -ENCODING 32652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0800 -7F00 -0800 -FF00 -2400 -2400 -4480 -8700 -ENDCHAR -STARTCHAR 7F8E -ENCODING 32654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0800 -7F00 -FF80 -0800 -FF00 -1800 -2600 -C180 -ENDCHAR -STARTCHAR 7F94 -ENCODING 32660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0800 -0800 -7E00 -FF00 -0000 -5900 -9500 -9480 -ENDCHAR -STARTCHAR 7F9A -ENCODING 32666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -A400 -AA00 -E900 -5E80 -E000 -7F00 -C500 -4700 -8400 -ENDCHAR -STARTCHAR 7F9E -ENCODING 32670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0800 -7F00 -FF80 -4000 -7E00 -4A00 -FF80 -FF00 -ENDCHAR -STARTCHAR 7FA4 -ENCODING 32676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F500 -5500 -FF80 -5200 -FF00 -7F80 -D200 -F200 -5200 -ENDCHAR -STARTCHAR 7FA8 -ENCODING 32680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -7F00 -0800 -FF80 -4800 -8F00 -5400 -4A00 -B100 -ENDCHAR -STARTCHAR 7FA9 -ENCODING 32681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -7F00 -FF80 -3200 -C900 -FF80 -F500 -2680 -5B00 -ENDCHAR -STARTCHAR 7FB2 -ENCODING 32690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -7F00 -FF80 -E500 -FF80 -6D00 -D200 -3680 -3900 -ENDCHAR -STARTCHAR 7FB8 -ENCODING 32696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -0000 -7F00 -1800 -DB00 -D300 -DD00 -BD00 -D580 -ENDCHAR -STARTCHAR 7FB9 -ENCODING 32697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -FF00 -5A00 -B500 -FF00 -FF80 -FF00 -3C00 -C380 -ENDCHAR -STARTCHAR 7FBD -ENCODING 32701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -31 -33 -D5 -99 -77 -99 -11 -33 -ENDCHAR -STARTCHAR 7FC1 -ENCODING 32705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3C -52 -A5 -7E -00 -FF -FF -9D -33 -ENDCHAR -STARTCHAR 7FC5 -ENCODING 32709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5B00 -E900 -5700 -4900 -EB00 -B700 -4500 -6900 -9F80 -ENDCHAR -STARTCHAR 7FCA -ENCODING 32714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5F -ED -0D -B7 -B5 -CF -77 -85 -0B -ENDCHAR -STARTCHAR 7FCC -ENCODING 32716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -7300 -BF00 -DD00 -0800 -FF00 -2400 -2400 -FF80 -ENDCHAR -STARTCHAR 7FCE -ENCODING 32718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -A5 -AD -EF -17 -E5 -6F -77 -65 -4D -ENDCHAR -STARTCHAR 7FD2 -ENCODING 32722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -7D -F7 -BB -08 -7E -7E -42 -7E -ENDCHAR -STARTCHAR 7FD4 -ENCODING 32724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -BF -A5 -ED -57 -F7 -6D -D7 -57 -85 -8F -ENDCHAR -STARTCHAR 7FD5 -ENCODING 32725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -7E00 -8180 -7E00 -0000 -FF00 -7500 -FF00 -BB00 -ENDCHAR -STARTCHAR 7FDF -ENCODING 32735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -73 -BF -DD -7F -CF -FF -48 -7F -ENDCHAR -STARTCHAR 7FE0 -ENCODING 32736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -7F00 -D500 -8800 -FF00 -6200 -DD00 -FF80 -0800 -ENDCHAR -STARTCHAR 7FE1 -ENCODING 32737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -F700 -F700 -1780 -E400 -FF00 -7700 -BB00 -5500 -BB00 -ENDCHAR -STARTCHAR 7FE9 -ENCODING 32745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -15 -E3 -F5 -FB -83 -FF -FB -AB -5D -ENDCHAR -STARTCHAR 7FEB -ENCODING 32747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -D000 -D000 -EF80 -4600 -F600 -F600 -F680 -8980 -ENDCHAR -STARTCHAR 7FF0 -ENCODING 32752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -F600 -4900 -EF80 -E500 -AE80 -F500 -EE80 -5480 -4D00 -ENDCHAR -STARTCHAR 7FF9 -ENCODING 32761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2F00 -F500 -F500 -9F00 -B500 -FD00 -FB00 -6500 -A080 -BF00 -ENDCHAR -STARTCHAR 7FFC -ENCODING 32764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -BB00 -DD00 -7F00 -4900 -FF00 -3C00 -FF00 -E380 -ENDCHAR -STARTCHAR 8000 -ENCODING 32768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -ED00 -FF00 -FA00 -BF80 -AA00 -AF00 -AE00 -CF80 -ENDCHAR -STARTCHAR 8001 -ENCODING 32769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -1100 -7E00 -1400 -FF80 -1800 -6200 -BC00 -2100 -3F00 -ENDCHAR -STARTCHAR 8003 -ENCODING 32771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1100 -7D00 -1200 -FF80 -1300 -7C00 -BF00 -2100 -0200 -0E00 -ENDCHAR -STARTCHAR 8005 -ENCODING 32773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1100 -7E00 -1400 -FF80 -1600 -7F00 -A100 -3F00 -3F00 -2100 -ENDCHAR -STARTCHAR 8006 -ENCODING 32774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1100 -7E00 -FF80 -3600 -FD00 -3F00 -7E00 -4200 -7E00 -7E00 -ENDCHAR -STARTCHAR 8009 -ENCODING 32777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1100 -7E00 -FF80 -1000 -7E00 -A000 -3F00 -7D00 -7D00 -0600 -ENDCHAR -STARTCHAR 800C -ENCODING 32780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -10 -FF -A5 -A5 -A5 -A5 -A5 -83 -ENDCHAR -STARTCHAR 8010 -ENCODING 32784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2100 -4780 -F900 -ED00 -ED00 -EB00 -E900 -E900 -9300 -ENDCHAR -STARTCHAR 8015 -ENCODING 32789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -F500 -4F80 -E500 -4500 -FF80 -6900 -D900 -C900 -5100 -ENDCHAR -STARTCHAR 8017 -ENCODING 32791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -EC00 -4400 -EF00 -4C00 -F580 -6E00 -D400 -C480 -4700 -ENDCHAR -STARTCHAR 8018 -ENCODING 32792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -EF00 -4000 -E000 -4F80 -F400 -6500 -D900 -CF00 -5C80 -ENDCHAR -STARTCHAR 802D -ENCODING 32813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 0 -BITMAP -4600 -FF00 -5D00 -FF80 -5D00 -FF80 -5500 -FA00 -D680 -6D00 -ENDCHAR -STARTCHAR 8033 -ENCODING 32819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4200 -3E00 -4200 -3E00 -4200 -FF80 -0200 -0200 -ENDCHAR -STARTCHAR 8036 -ENCODING 32822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -95 -F5 -96 -F5 -95 -B5 -D7 -14 -ENDCHAR -STARTCHAR 803D -ENCODING 32829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -A400 -BF00 -F480 -A600 -E600 -A600 -EA00 -AA80 -3300 -ENDCHAR -STARTCHAR 803F -ENCODING 32831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -A400 -AC80 -ED00 -AB00 -F700 -A600 -E500 -A900 -3080 -ENDCHAR -STARTCHAR 8043 -ENCODING 32835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -A400 -AF00 -ED00 -AF00 -ED00 -BF80 -E900 -A900 -2B00 -ENDCHAR -STARTCHAR 8046 -ENCODING 32838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -A600 -A900 -FE80 -A000 -FF00 -A500 -E500 -A700 -2400 -ENDCHAR -STARTCHAR 804A -ENCODING 32842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -E8 -BB -DB -BB -DB -BB -DB -AA -32 -ENDCHAR -STARTCHAR 8056 -ENCODING 32854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -F500 -F500 -9700 -F000 -FF00 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 8058 -ENCODING 32856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -BF00 -F500 -BF00 -FF80 -A800 -EF00 -2100 -2300 -ENDCHAR -STARTCHAR 805A -ENCODING 32858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F000 -FF00 -F700 -FD80 -1600 -7800 -CE00 -2A00 -C980 -ENDCHAR -STARTCHAR 805E -ENCODING 32862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -FF -81 -BF -BD -BD -BD -87 -ENDCHAR -STARTCHAR 806F -ENCODING 32879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -B600 -BB00 -F680 -BF80 -F680 -F680 -BB00 -2A00 -3200 -ENDCHAR -STARTCHAR 8070 -ENCODING 32880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -B700 -FB00 -B700 -FF00 -A400 -FB00 -B980 -2600 -ENDCHAR -STARTCHAR 8072 -ENCODING 32882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4680 -F500 -0800 -FF00 -F200 -8D80 -7F00 -4200 -FF80 -1E00 -ENDCHAR -STARTCHAR 8073 -ENCODING 32883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -DD00 -D700 -D400 -6F80 -FF00 -7E00 -4200 -7F80 -FE00 -ENDCHAR -STARTCHAR 8077 -ENCODING 32887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -BF00 -B680 -DF80 -A200 -DF00 -BF00 -DD00 -3280 -2500 -ENDCHAR -STARTCHAR 807D -ENCODING 32893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -EF00 -F700 -AF00 -E000 -FF80 -FB00 -7980 -B600 -ENDCHAR -STARTCHAR 807E -ENCODING 32894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -6F00 -F700 -F700 -F780 -B700 -FF00 -7E00 -7E00 -FF80 -ENDCHAR -STARTCHAR 807F -ENCODING 32895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -7E -09 -FF -7E -08 -FF -FF -08 -08 -ENDCHAR -STARTCHAR 8084 -ENCODING 32900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -DF00 -E500 -8F80 -EF00 -C400 -FF00 -7F80 -A400 -8400 -ENDCHAR -STARTCHAR 8085 -ENCODING 32901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F00 -FF80 -7F00 -AD00 -EF00 -FF00 -EF00 -AD00 -AD00 -ENDCHAR -STARTCHAR 8086 -ENCODING 32902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -E500 -8F80 -EF00 -8400 -FF00 -AF80 -A400 -D400 -ENDCHAR -STARTCHAR 8087 -ENCODING 32903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -FF80 -9D00 -F200 -FF00 -FF80 -7E00 -0800 -FF80 -0800 -ENDCHAR -STARTCHAR 8089 -ENCODING 32905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -08 -FF -99 -AD -DB -BD -E3 -81 -83 -ENDCHAR -STARTCHAR 808B -ENCODING 32907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -E4 -A4 -AF -E5 -A5 -E5 -A5 -A9 -A9 -F3 -ENDCHAR -STARTCHAR 808C -ENCODING 32908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -AA00 -EA00 -AA00 -AA00 -EA00 -AA00 -AA80 -F180 -ENDCHAR -STARTCHAR 8096 -ENCODING 32918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -4A00 -8900 -FE80 -4200 -7E00 -4200 -7E00 -4200 -4600 -ENDCHAR -STARTCHAR 809B -ENCODING 32923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -A200 -E200 -A200 -A200 -E200 -A200 -AF80 -E000 -ENDCHAR -STARTCHAR 809D -ENCODING 32925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -A400 -E400 -A400 -BF80 -E400 -A400 -A400 -E400 -ENDCHAR -STARTCHAR 80A1 -ENCODING 32929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -AA00 -EB80 -9000 -AF00 -E900 -A600 -A600 -E900 -ENDCHAR -STARTCHAR 80A2 -ENCODING 32930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A400 -BF80 -E400 -BF00 -A900 -E600 -A600 -AF00 -F180 -ENDCHAR -STARTCHAR 80A5 -ENCODING 32933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -B500 -F500 -B500 -AF00 -F000 -B080 -B080 -EF00 -ENDCHAR -STARTCHAR 80A9 -ENCODING 32937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -03 -7F -41 -7F -7F -7F -A1 -BF -A3 -ENDCHAR -STARTCHAR 80AA -ENCODING 32938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A400 -BF80 -E800 -AF00 -E900 -A900 -A900 -B100 -F300 -ENDCHAR -STARTCHAR 80AF -ENCODING 32943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -4E -FF -00 -7E -42 -7E -7E -42 -46 -ENDCHAR -STARTCHAR 80B1 -ENCODING 32945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -A800 -BF80 -E800 -AA00 -EA00 -AD00 -B500 -B700 -7C80 -ENDCHAR -STARTCHAR 80B2 -ENCODING 32946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -22 -FF -7E -42 -7E -7E -42 -46 -ENDCHAR -STARTCHAR 80B4 -ENCODING 32948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6600 -3C00 -3300 -FF80 -2000 -FE00 -FE00 -4200 -7E00 -4600 -ENDCHAR -STARTCHAR 80BA -ENCODING 32954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -A400 -E400 -BF00 -B500 -F500 -B500 -B500 -E400 -ENDCHAR -STARTCHAR 80C3 -ENCODING 32963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FE -FE -FE -00 -FC -FC -FC -84 -8C -ENDCHAR -STARTCHAR 80C4 -ENCODING 32964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -FF -00 -7E -7E -42 -7E -46 -ENDCHAR -STARTCHAR 80CC -ENCODING 32972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1500 -E600 -6480 -9700 -7E00 -4200 -7E00 -7E00 -4200 -4600 -ENDCHAR -STARTCHAR 80CE -ENCODING 32974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A800 -A900 -FF00 -A080 -A000 -EF00 -A900 -AF00 -E900 -ENDCHAR -STARTCHAR 80DA -ENCODING 32986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -A400 -E400 -A600 -AD00 -F480 -A400 -A400 -FF80 -ENDCHAR -STARTCHAR 80DB -ENCODING 32987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EF -B5 -F5 -AF -B5 -EF -B4 -A4 -E4 -ENDCHAR -STARTCHAR 80DE -ENCODING 32990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -BF00 -B100 -FF00 -B300 -AF00 -F300 -B000 -B080 -EF00 -ENDCHAR -STARTCHAR 80E1 -ENCODING 32993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -47 -45 -F5 -47 -45 -F5 -97 -F9 -99 -0B -ENDCHAR -STARTCHAR 80E4 -ENCODING 32996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -AA00 -9600 -BE00 -8200 -BE00 -BE00 -BE00 -A680 -AD80 -ENDCHAR -STARTCHAR 80E5 -ENCODING 32997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0F00 -F000 -9F80 -7E00 -7E00 -4200 -7E00 -4600 -ENDCHAR -STARTCHAR 80F1 -ENCODING 33009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -B500 -B500 -ED00 -BF80 -EA00 -AA00 -AA00 -B280 -7380 -ENDCHAR -STARTCHAR 80F4 -ENCODING 33012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -B1 -FF -B7 -BB -F7 -BB -B1 -F3 -ENDCHAR -STARTCHAR 80F8 -ENCODING 33016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -E8 -BF -B1 -E5 -BF -F7 -BB -BF -B1 -63 -ENDCHAR -STARTCHAR 80FD -ENCODING 33021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -9900 -F600 -1700 -F000 -9900 -FB00 -F400 -9880 -B700 -ENDCHAR -STARTCHAR 8102 -ENCODING 33026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -AE00 -A880 -EF00 -A000 -EF00 -A900 -AF00 -AF00 -6900 -ENDCHAR -STARTCHAR 8105 -ENCODING 33029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -7E -E6 -FF -75 -FF -42 -7E -7E -46 -ENDCHAR -STARTCHAR 8106 -ENCODING 33030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7400 -5700 -5900 -7FC0 -5B80 -7A80 -5A80 -5B80 -5A40 -BB80 -ENDCHAR -STARTCHAR 8107 -ENCODING 33031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF00 -A500 -C900 -B300 -D200 -BB00 -B680 -B680 -6D00 -ENDCHAR -STARTCHAR 8108 -ENCODING 33032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -BC00 -B100 -F600 -B680 -F700 -B600 -B500 -B700 -5C80 -ENDCHAR -STARTCHAR 810A -ENCODING 33034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -FB00 -E700 -7E00 -C380 -7E00 -7E00 -4200 -4600 -ENDCHAR -STARTCHAR 8118 -ENCODING 33048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -B080 -EE00 -A000 -BF00 -EA00 -AA00 -AA80 -F380 -ENDCHAR -STARTCHAR 811A -ENCODING 33050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -CB -AB -BF -CB -BF -D3 -B7 -BF -B6 -C2 -ENDCHAR -STARTCHAR 811B -ENCODING 33051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -AB00 -F500 -B500 -AB00 -E000 -BF00 -A400 -FF80 -ENDCHAR -STARTCHAR 8123 -ENCODING 33059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -BE -FF -A6 -FB -BF -A1 -BF -A3 -ENDCHAR -STARTCHAR 8129 -ENCODING 33065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F80 -7900 -A600 -A980 -BF00 -AF00 -A900 -AF00 -8B00 -ENDCHAR -STARTCHAR 812B -ENCODING 33067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -B100 -FF80 -A900 -A900 -EF00 -AA00 -AA80 -F300 -ENDCHAR -STARTCHAR 812F -ENCODING 33071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E500 -BF80 -A400 -FF00 -B500 -BF00 -F500 -BF00 -B500 -F500 -ENDCHAR -STARTCHAR 8139 -ENCODING 33081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -AF00 -E800 -AF00 -BF80 -ED00 -AB00 -AF00 -F880 -ENDCHAR -STARTCHAR 813E -ENCODING 33086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -B500 -FF00 -B500 -BF00 -FA00 -BF80 -A200 -E200 -ENDCHAR -STARTCHAR 814B -ENCODING 33099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF80 -AA00 -D700 -B700 -B700 -D500 -B200 -B500 -D880 -ENDCHAR -STARTCHAR 814E -ENCODING 33102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -F5 -F2 -F5 -7E -42 -7E -42 -46 -ENDCHAR -STARTCHAR 8150 -ENCODING 33104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BF00 -EA00 -A200 -BF00 -CD00 -DB00 -CD00 -5300 -ENDCHAR -STARTCHAR 8151 -ENCODING 33105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF80 -B500 -D900 -BF80 -BD00 -DB00 -BB00 -A900 -EB00 -ENDCHAR -STARTCHAR 8154 -ENCODING 33108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -B680 -EA80 -B300 -E000 -BF00 -A400 -A400 -FF80 -ENDCHAR -STARTCHAR 8155 -ENCODING 33109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF80 -B080 -CF00 -B700 -B700 -CB00 -AB00 -B280 -D300 -ENDCHAR -STARTCHAR 8165 -ENCODING 33125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -AF00 -EF00 -A000 -AA00 -EF00 -BF00 -A200 -FF80 -ENDCHAR -STARTCHAR 8166 -ENCODING 33126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -EB -B5 -B5 -EB -A4 -FF -BB -B5 -BF -71 -ENDCHAR -STARTCHAR 816B -ENCODING 33131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E300 -BC00 -BF80 -FF00 -BF00 -F500 -BF00 -A400 -7F80 -ENDCHAR -STARTCHAR 8170 -ENCODING 33136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF80 -AA00 -DF00 -BF00 -A400 -DF80 -AA00 -A600 -D900 -ENDCHAR -STARTCHAR 8171 -ENCODING 33137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C200 -B700 -D300 -DF80 -D700 -CF00 -B200 -BF00 -D200 -EF80 -ENDCHAR -STARTCHAR 8178 -ENCODING 33144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -BF00 -DF00 -A000 -BF80 -CF00 -BA80 -B500 -4B00 -ENDCHAR -STARTCHAR 8179 -ENCODING 33145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -AF80 -BF00 -F100 -AF00 -EF00 -AF00 -BA00 -A600 -7980 -ENDCHAR -STARTCHAR 817A -ENCODING 33146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -B100 -FF00 -BF00 -E500 -BE00 -AE00 -AD00 -7C80 -ENDCHAR -STARTCHAR 817F -ENCODING 33151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D700 -A500 -D700 -B700 -A600 -D500 -AE80 -B800 -D780 -ENDCHAR -STARTCHAR 8180 -ENCODING 33152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -AA00 -FF80 -B480 -FF80 -A800 -AF00 -B900 -F700 -ENDCHAR -STARTCHAR 8188 -ENCODING 33160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -AF00 -EF00 -A000 -BF00 -FB00 -B080 -BE80 -F500 -ENDCHAR -STARTCHAR 818A -ENCODING 33162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C500 -BF80 -BF00 -D500 -BF00 -BF00 -D500 -BF80 -A900 -C600 -ENDCHAR -STARTCHAR 818F -ENCODING 33167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -FF -7E -7E -FF -BF -3E -7E -7E -7E -46 -ENDCHAR -STARTCHAR 819A -ENCODING 33178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -1F -FF -FF -9E -E9 -FF -B6 -BF -BF -23 -ENDCHAR -STARTCHAR 819C -ENCODING 33180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -DF80 -AA00 -A000 -DF00 -BF00 -BF00 -DF80 -A400 -AB00 -D180 -ENDCHAR -STARTCHAR 819D -ENCODING 33181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -AF00 -F480 -AB00 -B480 -ED00 -AF00 -B580 -CC00 -ENDCHAR -STARTCHAR 81A0 -ENCODING 33184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DB00 -A900 -DB00 -A600 -BD80 -DA00 -A500 -BE00 -5800 -ENDCHAR -STARTCHAR 81A3 -ENCODING 33187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF80 -AB00 -D000 -BF00 -AA00 -DF00 -BF00 -A400 -5F80 -ENDCHAR -STARTCHAR 81A8 -ENCODING 33192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C880 -BD00 -DE00 -C080 -DD00 -DE00 -C480 -D900 -CF00 -5A00 -ENDCHAR -STARTCHAR 81B3 -ENCODING 33203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -BF00 -BF00 -FF00 -AD00 -BF80 -E000 -BF00 -BF00 -F100 -ENDCHAR -STARTCHAR 81B5 -ENCODING 33205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -BF80 -A400 -FF80 -A900 -B700 -F700 -BF80 -A400 -C400 -ENDCHAR -STARTCHAR 81BA -ENCODING 33210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BF00 -B400 -EF00 -8000 -BF00 -A100 -BF00 -A300 -ENDCHAR -STARTCHAR 81BD -ENCODING 33213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C800 -DE00 -DF80 -D700 -D800 -DF80 -D000 -D600 -DF00 -6F00 -ENDCHAR -STARTCHAR 81BE -ENCODING 33214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -AB00 -BE80 -DF00 -BF00 -BF00 -DF00 -B100 -BF00 -DF00 -ENDCHAR -STARTCHAR 81BF -ENCODING 33215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CA00 -DF00 -DF00 -DF00 -C000 -DF80 -DF00 -DF80 -DF00 -7980 -ENDCHAR -STARTCHAR 81C0 -ENCODING 33216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F680 -B580 -B700 -F200 -5580 -7E00 -4100 -7E00 -4600 -ENDCHAR -STARTCHAR 81C2 -ENCODING 33218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -9F00 -FF80 -FF00 -F200 -7E00 -4100 -7E00 -7E00 -4600 -ENDCHAR -STARTCHAR 81C6 -ENCODING 33222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF00 -BF80 -C000 -BF00 -BF00 -DF00 -BD00 -B900 -EE80 -ENDCHAR -STARTCHAR 81CD -ENCODING 33229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -DF80 -C800 -DF80 -DF00 -BF80 -D100 -DF00 -DF00 -D100 -E100 -ENDCHAR -STARTCHAR 81D8 -ENCODING 33240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -B500 -BF00 -DB00 -BF00 -C000 -BF00 -BF00 -BF80 -7580 -ENDCHAR -STARTCHAR 81DF -ENCODING 33247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CA00 -DF80 -C180 -EF80 -DD00 -D680 -F700 -FD00 -FB80 -7580 -ENDCHAR -STARTCHAR 81E3 -ENCODING 33251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -88 -FF -81 -81 -FF -88 -FF -80 -ENDCHAR -STARTCHAR 81E5 -ENCODING 33253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FA00 -A200 -A200 -F200 -9200 -9200 -F600 -A500 -F900 -8880 -ENDCHAR -STARTCHAR 81E7 -ENCODING 33255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0300 -BF80 -C200 -DE80 -DF00 -D700 -DE00 -DA00 -DE80 -8900 -ENDCHAR -STARTCHAR 81E8 -ENCODING 33256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF80 -D000 -EF00 -AF00 -A000 -FF80 -D680 -FF80 -9680 -ENDCHAR -STARTCHAR 81EA -ENCODING 33258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -1 -BITMAP -10 -20 -FE -82 -FE -82 -FE -82 -FE -82 -ENDCHAR -STARTCHAR 81ED -ENCODING 33261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -7E00 -4100 -7E00 -7E00 -1200 -FF80 -2400 -C380 -ENDCHAR -STARTCHAR 81F3 -ENCODING 33267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -22 -2E -F1 -08 -08 -7F -08 -FF -ENDCHAR -STARTCHAR 81F4 -ENCODING 33268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -4400 -5780 -F900 -CD00 -4D00 -F200 -4200 -F500 -0880 -ENDCHAR -STARTCHAR 81FA -ENCODING 33274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -0000 -7E00 -0000 -FF00 -2600 -7F00 -7E00 -FF80 -ENDCHAR -STARTCHAR 81FB -ENCODING 33275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -AF00 -EA00 -FF80 -5F00 -FF80 -4600 -ED00 -1480 -ENDCHAR -STARTCHAR 81FC -ENCODING 33276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -10 -EF -81 -81 -FF -81 -81 -FF -81 -ENDCHAR -STARTCHAR 81FE -ENCODING 33278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -EF -89 -EF -89 -FF -99 -14 -62 -81 -ENDCHAR -STARTCHAR 8205 -ENCODING 33285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -FF -FF -FF -00 -7F -89 -7F -FF -11 -E3 -ENDCHAR -STARTCHAR 8207 -ENCODING 33287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7300 -9900 -F300 -9900 -7B00 -9900 -FF80 -6600 -8100 -ENDCHAR -STARTCHAR 8208 -ENCODING 33288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -A500 -E700 -BD00 -FF00 -A500 -FF80 -2600 -C100 -ENDCHAR -STARTCHAR 820A -ENCODING 33290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7F00 -8800 -FE00 -7F00 -1000 -EF00 -8100 -FF00 -ENDCHAR -STARTCHAR 820C -ENCODING 33292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0200 -7C00 -0800 -FF80 -0800 -7E00 -4100 -7E00 -4100 -ENDCHAR -STARTCHAR 820D -ENCODING 33293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -18 -34 -62 -FF -FF -08 -7E -42 -7E -42 -ENDCHAR -STARTCHAR 8212 -ENCODING 33298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -6F00 -A100 -F600 -4F80 -F280 -F300 -9200 -F200 -9400 -ENDCHAR -STARTCHAR 821B -ENCODING 33307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -7F00 -9A00 -DA00 -AA00 -3F80 -4200 -C200 -8200 -ENDCHAR -STARTCHAR 821C -ENCODING 33308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -5200 -4A00 -FF00 -F200 -DF00 -BF80 -4200 -8200 -ENDCHAR -STARTCHAR 821E -ENCODING 33310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F00 -D500 -FF80 -5500 -FF80 -7F00 -EA00 -7F80 -8200 -ENDCHAR -STARTCHAR 821F -ENCODING 33311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -7E -52 -4A -42 -FF -4A -4A -4A -86 -ENDCHAR -STARTCHAR 8221 -ENCODING 33313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -EF00 -D200 -D200 -9200 -E200 -D200 -D200 -9200 -AF80 -ENDCHAR -STARTCHAR 822A -ENCODING 33322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -EF00 -E000 -E000 -9E00 -EA00 -EA00 -EA00 -AA80 -7180 -ENDCHAR -STARTCHAR 822B -ENCODING 33323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -E200 -EF80 -E400 -9700 -E500 -E900 -E900 -A900 -F300 -ENDCHAR -STARTCHAR 822C -ENCODING 33324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -F500 -D980 -B980 -B000 -DF00 -D500 -D200 -9700 -B880 -ENDCHAR -STARTCHAR 8235 -ENCODING 33333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -EF80 -E880 -E880 -9900 -EB00 -E400 -E800 -A880 -E700 -ENDCHAR -STARTCHAR 8236 -ENCODING 33334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -22 -FF -D9 -B9 -B9 -DF -D9 -D9 -9F -39 -ENDCHAR -STARTCHAR 8237 -ENCODING 33335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -E200 -DF80 -A400 -B500 -DA00 -D700 -D500 -9700 -AC80 -ENDCHAR -STARTCHAR 8239 -ENCODING 33337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -E900 -D900 -A980 -B980 -DF00 -D900 -D900 -9F00 -A900 -ENDCHAR -STARTCHAR 8240 -ENCODING 33344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -EF00 -EA80 -D000 -9F00 -E200 -EF80 -E200 -A200 -A400 -ENDCHAR -STARTCHAR 8245 -ENCODING 33349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -E600 -D900 -AF80 -9200 -EF00 -DB00 -DB00 -9280 -A600 -ENDCHAR -STARTCHAR 8247 -ENCODING 33351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -FA00 -E900 -E900 -AB80 -E500 -F900 -EB00 -A800 -F780 -ENDCHAR -STARTCHAR 8259 -ENCODING 33369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -EF00 -FF80 -EF00 -B900 -EF00 -EF00 -EF00 -B880 -F700 -ENDCHAR -STARTCHAR 8264 -ENCODING 33380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -FF80 -EF00 -FF80 -A400 -FB00 -FF80 -FF00 -AB00 -7D80 -ENDCHAR -STARTCHAR 8266 -ENCODING 33382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5D00 -FA00 -BF80 -FC00 -BB80 -FC00 -EF00 -F700 -B700 -7F80 -ENDCHAR -STARTCHAR 826E -ENCODING 33390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -42 -7E -42 -7E -51 -4E -5E -E1 -ENDCHAR -STARTCHAR 826F -ENCODING 33391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -7E -42 -7E -42 -7F -4A -4C -7E -E1 -ENDCHAR -STARTCHAR 8271 -ENCODING 33393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A700 -F900 -4700 -F900 -D700 -6B00 -FB00 -F900 -6700 -9C80 -ENDCHAR -STARTCHAR 8272 -ENCODING 33394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -3C -48 -FF -C9 -49 -7F -40 -41 -7F -ENDCHAR -STARTCHAR 8276 -ENCODING 33398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6400 -F700 -F900 -FF00 -0A80 -FA80 -F700 -F800 -5880 -E700 -ENDCHAR -STARTCHAR 8278 -ENCODING 33400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -42 -DB -DB -DB -DB -DB -FF -42 -42 -82 -ENDCHAR -STARTCHAR 827E -ENCODING 33406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -0200 -2400 -1400 -0800 -1C00 -6600 -8180 -ENDCHAR -STARTCHAR 828B -ENCODING 33419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -7F00 -0800 -0800 -FF80 -0800 -0800 -3800 -ENDCHAR -STARTCHAR 828D -ENCODING 33421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -4000 -7F00 -8100 -FD00 -0100 -0100 -0700 -ENDCHAR -STARTCHAR 828E -ENCODING 33422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -FF00 -0100 -7F00 -8000 -FF00 -8100 -0700 -ENDCHAR -STARTCHAR 8292 -ENCODING 33426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -24 -FF -2C -08 -FF -40 -40 -40 -7F -ENDCHAR -STARTCHAR 8299 -ENCODING 33433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -7F00 -0800 -FF00 -1800 -1400 -6200 -8180 -ENDCHAR -STARTCHAR 829A -ENCODING 33434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -0F00 -FC00 -4900 -7E00 -4800 -0880 -0F00 -ENDCHAR -STARTCHAR 829D -ENCODING 33437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3400 -FF00 -0200 -0400 -5800 -6000 -A000 -9F80 -ENDCHAR -STARTCHAR 829F -ENCODING 33439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -3C80 -6700 -C000 -7E00 -2400 -1C00 -E300 -ENDCHAR -STARTCHAR 82A5 -ENCODING 33445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -1800 -6600 -A580 -2400 -2400 -4400 -8400 -ENDCHAR -STARTCHAR 82A6 -ENCODING 33446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0300 -7C00 -7F00 -4100 -7F00 -8100 -8000 -8000 -ENDCHAR -STARTCHAR 82A9 -ENCODING 33449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3C00 -2400 -7F00 -8180 -7F00 -0200 -0400 -0800 -ENDCHAR -STARTCHAR 82AC -ENCODING 33452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -3C00 -4200 -BF80 -9200 -2200 -6200 -8C00 -ENDCHAR -STARTCHAR 82AD -ENCODING 33453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -FF00 -8900 -8900 -FF00 -8000 -8080 -7F00 -ENDCHAR -STARTCHAR 82AE -ENCODING 33454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -3000 -FF00 -8900 -9500 -A300 -C100 -8300 -ENDCHAR -STARTCHAR 82AF -ENCODING 33455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -FF80 -2400 -0800 -2600 -6100 -A100 -A280 -3C00 -ENDCHAR -STARTCHAR 82B1 -ENCODING 33457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -2800 -4900 -CE00 -C800 -4800 -4880 -4F00 -ENDCHAR -STARTCHAR 82B3 -ENCODING 33459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2C00 -FF00 -2000 -3F00 -2100 -4100 -4200 -8600 -ENDCHAR -STARTCHAR 82B7 -ENCODING 33463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -0800 -4800 -4F00 -4800 -4800 -4800 -FF80 -ENDCHAR -STARTCHAR 82B8 -ENCODING 33464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -7E00 -0000 -FF80 -2000 -2200 -4F00 -F100 -ENDCHAR -STARTCHAR 82B9 -ENCODING 33465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -7E00 -4000 -7F00 -4400 -8400 -8400 -8400 -ENDCHAR -STARTCHAR 82BB -ENCODING 33467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -7F -D5 -7D -23 -C0 -7F -D5 -7D -E3 -ENDCHAR -STARTCHAR 82BC -ENCODING 33468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0600 -F800 -0F00 -F000 -0F00 -F000 -1080 -0F00 -ENDCHAR -STARTCHAR 82BD -ENCODING 33469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -7F00 -2400 -FF00 -0C00 -1400 -6400 -8C00 -ENDCHAR -STARTCHAR 82BF -ENCODING 33471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2000 -5E00 -4A00 -CB00 -D100 -5100 -7100 -6300 -ENDCHAR -STARTCHAR 82D1 -ENCODING 33489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -6400 -4F00 -7900 -5900 -AB00 -2800 -4880 -8700 -ENDCHAR -STARTCHAR 82D2 -ENCODING 33490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2C00 -7E00 -4900 -7E00 -C980 -7E00 -4100 -4600 -ENDCHAR -STARTCHAR 82D4 -ENCODING 33492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1000 -2200 -FF00 -0000 -7E00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 82D5 -ENCODING 33493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -FF00 -3100 -C600 -7F00 -4100 -7F00 -4100 -ENDCHAR -STARTCHAR 82D7 -ENCODING 33495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -FF80 -2400 -7F00 -8900 -7F00 -8900 -7F00 -8100 -ENDCHAR -STARTCHAR 82DB -ENCODING 33499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -FF00 -0200 -7A00 -4A00 -7A00 -4A00 -0600 -ENDCHAR -STARTCHAR 82DE -ENCODING 33502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4000 -7F00 -8100 -F900 -7900 -4200 -4080 -7F00 -ENDCHAR -STARTCHAR 82DF -ENCODING 33503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -3F00 -4100 -BD00 -C500 -3D00 -4500 -0700 -ENDCHAR -STARTCHAR 82E1 -ENCODING 33505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2600 -6200 -5200 -4A00 -4200 -5600 -ED00 -1080 -ENDCHAR -STARTCHAR 82E5 -ENCODING 33509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2C00 -1000 -FF80 -2000 -7F00 -A100 -3F00 -2100 -ENDCHAR -STARTCHAR 82E6 -ENCODING 33510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2C00 -0800 -FF80 -0800 -7E00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 82E7 -ENCODING 33511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2C00 -FF00 -8100 -FF00 -0800 -0800 -0800 -3000 -ENDCHAR -STARTCHAR 82F1 -ENCODING 33521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2C00 -7E00 -4A00 -4A00 -FF80 -1800 -6600 -C180 -ENDCHAR -STARTCHAR 82FD -ENCODING 33533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2600 -7E00 -5200 -5200 -5200 -9500 -9F00 -F280 -ENDCHAR -STARTCHAR 82FE -ENCODING 33534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3400 -0A00 -2A00 -A500 -A900 -B080 -6200 -FE00 -ENDCHAR -STARTCHAR 8301 -ENCODING 33537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2C00 -4900 -4900 -7F00 -0800 -8900 -8900 -FF00 -ENDCHAR -STARTCHAR 8302 -ENCODING 33538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -FF80 -1100 -FF80 -8A00 -8A00 -8C00 -9480 -A300 -ENDCHAR -STARTCHAR 8303 -ENCODING 33539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -E400 -5F00 -9100 -5100 -5600 -5000 -9080 -9F00 -ENDCHAR -STARTCHAR 8304 -ENCODING 33540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -6400 -4700 -F500 -5500 -5500 -5500 -9700 -B500 -ENDCHAR -STARTCHAR 8305 -ENCODING 33541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -FF -00 -7E -14 -FF -19 -6A -88 -18 -ENDCHAR -STARTCHAR 8309 -ENCODING 33545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -0800 -FF00 -6E00 -8980 -0800 -ENDCHAR -STARTCHAR 8317 -ENCODING 33559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1000 -7E00 -E400 -1800 -3F00 -E100 -3F00 -2100 -ENDCHAR -STARTCHAR 8328 -ENCODING 33576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3400 -DF00 -1900 -2900 -6C00 -DE00 -3300 -6100 -ENDCHAR -STARTCHAR 832B -ENCODING 33579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -24 -FF -44 -44 -FF -10 -50 -50 -9F -ENDCHAR -STARTCHAR 832F -ENCODING 33583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2000 -2600 -4400 -DF00 -C400 -4A00 -5100 -6080 -ENDCHAR -STARTCHAR 8331 -ENCODING 33585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -4800 -7F00 -FF00 -1800 -6E00 -8980 -0800 -ENDCHAR -STARTCHAR 8334 -ENCODING 33588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -FF00 -BD00 -A500 -BD00 -A500 -FF00 -8100 -ENDCHAR -STARTCHAR 8335 -ENCODING 33589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -8900 -8900 -FF00 -9900 -B500 -FF00 -8100 -ENDCHAR -STARTCHAR 8336 -ENCODING 33590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3C00 -3C00 -6A00 -8900 -7E00 -2A00 -4B00 -8900 -ENDCHAR -STARTCHAR 8338 -ENCODING 33592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -FF00 -7E00 -4200 -7E00 -4380 -FE00 -0200 -ENDCHAR -STARTCHAR 8339 -ENCODING 33593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -4700 -F500 -5500 -D500 -2500 -5700 -8900 -ENDCHAR -STARTCHAR 8340 -ENCODING 33600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -6400 -7F00 -4100 -FD00 -C500 -7D00 -7D00 -4300 -ENDCHAR -STARTCHAR 8347 -ENCODING 33607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4000 -CF00 -A000 -5F80 -C200 -4200 -4200 -4600 -ENDCHAR -STARTCHAR 8349 -ENCODING 33609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -7E00 -7E00 -4100 -7E00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 834A -ENCODING 33610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2500 -FD00 -5500 -5500 -FD00 -5500 -9100 -9300 -ENDCHAR -STARTCHAR 834F -ENCODING 33615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2000 -5F00 -4400 -C400 -FF80 -4400 -4400 -5F00 -ENDCHAR -STARTCHAR 8351 -ENCODING 33617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -0800 -FF00 -FF00 -FF00 -9900 -2700 -C180 -ENDCHAR -STARTCHAR 8352 -ENCODING 33618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -7F00 -0000 -3200 -5200 -5280 -9300 -ENDCHAR -STARTCHAR 8373 -ENCODING 33651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -FF80 -0000 -FF00 -7E00 -4200 -7E00 -2400 -FF80 -ENDCHAR -STARTCHAR 8377 -ENCODING 33655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4000 -7F80 -4100 -DD00 -E500 -5D00 -4100 -4300 -ENDCHAR -STARTCHAR 837B -ENCODING 33659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -8000 -6400 -4D00 -B500 -6400 -AA00 -2900 -5080 -ENDCHAR -STARTCHAR 8389 -ENCODING 33673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1100 -E500 -2500 -FD00 -6500 -B500 -A900 -2300 -ENDCHAR -STARTCHAR 838A -ENCODING 33674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -A400 -E400 -3F80 -E400 -A400 -A400 -AF00 -ENDCHAR -STARTCHAR 838E -ENCODING 33678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -C000 -5600 -9500 -5480 -6500 -4E00 -8800 -B000 -ENDCHAR -STARTCHAR 8396 -ENCODING 33686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -FF00 -5200 -5200 -2900 -FF00 -0800 -FF80 -ENDCHAR -STARTCHAR 8398 -ENCODING 33688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -2400 -FF80 -0800 -FF00 -0800 -0800 -ENDCHAR -STARTCHAR 839E -ENCODING 33694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -FF00 -0000 -FF00 -2400 -6480 -8700 -ENDCHAR -STARTCHAR 83A2 -ENCODING 33698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -4A00 -4B00 -BD00 -2400 -6200 -8180 -ENDCHAR -STARTCHAR 83A9 -ENCODING 33705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0200 -7E00 -8900 -7E00 -0800 -FF80 -0800 -3800 -ENDCHAR -STARTCHAR 83AA -ENCODING 33706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2600 -E500 -2400 -FF80 -7500 -B600 -2A80 -7100 -ENDCHAR -STARTCHAR 83AB -ENCODING 33707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2400 -FF80 -7E00 -7E00 -4200 -7E00 -FF80 -3400 -C380 -ENDCHAR -STARTCHAR 83BD -ENCODING 33725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3500 -FF00 -2600 -E500 -2400 -FF00 -2400 -C400 -ENDCHAR -STARTCHAR 83C1 -ENCODING 33729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -7F00 -FF80 -0000 -7E00 -7E00 -4100 -4600 -ENDCHAR -STARTCHAR 83C5 -ENCODING 33733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -FF00 -4200 -7E00 -7E00 -7E00 -4100 -ENDCHAR -STARTCHAR 83C9 -ENCODING 33737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3C00 -2400 -3C00 -FF00 -4800 -3600 -6A00 -9100 -ENDCHAR -STARTCHAR 83CA -ENCODING 33738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4000 -7F00 -B500 -B500 -7F00 -3500 -D300 -1300 -ENDCHAR -STARTCHAR 83CC -ENCODING 33740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -8500 -B900 -FF00 -B500 -CB00 -FF00 -8100 -ENDCHAR -STARTCHAR 83D3 -ENCODING 33747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7F00 -4900 -7F00 -7F00 -FF80 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 83D6 -ENCODING 33750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -7E00 -7E00 -0000 -FF00 -FF00 -FF00 -8100 -ENDCHAR -STARTCHAR 83DC -ENCODING 33756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FE00 -5100 -4A00 -4800 -FF00 -1400 -6A00 -8980 -ENDCHAR -STARTCHAR 83E9 -ENCODING 33769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -2400 -FF80 -7E00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR 83EB -ENCODING 33771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -0800 -7F00 -7F00 -0800 -FF00 -7F00 -FF80 -ENDCHAR -STARTCHAR 83EF -ENCODING 33775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -FF00 -FF80 -2A00 -FF00 -FF00 -0800 -0800 -ENDCHAR -STARTCHAR 83F0 -ENCODING 33776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0300 -FE00 -5600 -7500 -D500 -5700 -5700 -E980 -ENDCHAR -STARTCHAR 83F1 -ENCODING 33777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -7F00 -FF80 -2700 -FE00 -5400 -1C00 -E300 -ENDCHAR -STARTCHAR 83F2 -ENCODING 33778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -F780 -1400 -F700 -6400 -A780 -6400 -4400 -ENDCHAR -STARTCHAR 83F4 -ENCODING 33780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1000 -FF00 -2E00 -7F80 -FE00 -4A00 -7E80 -0F00 -ENDCHAR -STARTCHAR 83F9 -ENCODING 33785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -C000 -5F00 -9100 -5F00 -1100 -5F00 -5100 -BF80 -ENDCHAR -STARTCHAR 83FD -ENCODING 33789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4000 -3F00 -4500 -F500 -B200 -B200 -B500 -4880 -ENDCHAR -STARTCHAR 8403 -ENCODING 33795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -FF00 -0000 -2400 -6600 -9900 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 8404 -ENCODING 33796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4000 -7F00 -BD00 -5100 -7F00 -5500 -7D00 -0700 -ENDCHAR -STARTCHAR 840A -ENCODING 33802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -4A00 -4A00 -BD00 -2C00 -4A00 -8900 -ENDCHAR -STARTCHAR 840C -ENCODING 33804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -EF00 -9900 -EF00 -9900 -EF00 -9900 -1300 -ENDCHAR -STARTCHAR 840D -ENCODING 33805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -BF00 -4400 -9600 -9500 -7F80 -4400 -8400 -8400 -ENDCHAR -STARTCHAR 840E -ENCODING 33806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -7E00 -FF80 -2C00 -D300 -FF80 -2400 -1E00 -E100 -ENDCHAR -STARTCHAR 8429 -ENCODING 33833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2200 -C200 -4A80 -FB00 -6600 -D500 -C900 -4880 -ENDCHAR -STARTCHAR 842C -ENCODING 33836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -4A00 -7E00 -7E00 -FF00 -8D00 -B300 -8300 -ENDCHAR -STARTCHAR 8431 -ENCODING 33841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -FE80 -7E00 -4200 -7E00 -7E00 -FF80 -ENDCHAR -STARTCHAR 8438 -ENCODING 33848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2800 -CF00 -EF00 -8900 -FF00 -1800 -2600 -C100 -ENDCHAR -STARTCHAR 843D -ENCODING 33853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -8800 -5F00 -AA00 -A400 -7B00 -9F00 -9F00 -9100 -ENDCHAR -STARTCHAR 8449 -ENCODING 33865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -5200 -FF80 -5E00 -7F00 -FF80 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 8457 -ENCODING 33879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1100 -7E00 -FF80 -3200 -FE00 -2200 -3E00 -3E00 -ENDCHAR -STARTCHAR 845B -ENCODING 33883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -7E00 -7E00 -7E00 -2000 -7F00 -F700 -7F00 -4300 -ENDCHAR -STARTCHAR 8461 -ENCODING 33889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4000 -7F00 -FD00 -FD00 -5500 -7D00 -7D00 -5700 -ENDCHAR -STARTCHAR 8463 -ENCODING 33891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7F00 -FF00 -0800 -7E00 -4900 -7E00 -FF00 -FF80 -ENDCHAR -STARTCHAR 8466 -ENCODING 33894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -FF00 -0000 -7E00 -7E00 -FF00 -FF80 -0800 -ENDCHAR -STARTCHAR 846B -ENCODING 33899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4000 -4700 -F900 -4700 -F900 -9F00 -F900 -8B00 -ENDCHAR -STARTCHAR 846C -ENCODING 33900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF80 -4900 -F680 -6700 -A400 -FF80 -2400 -C400 -ENDCHAR -STARTCHAR 846F -ENCODING 33903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4400 -6800 -AF00 -4D00 -F500 -D300 -D100 -C300 -ENDCHAR -STARTCHAR 8475 -ENCODING 33909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FA00 -6500 -6200 -FD80 -0800 -FF00 -3400 -C300 -ENDCHAR -STARTCHAR 847A -ENCODING 33914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -7E00 -7E00 -0000 -FF00 -7E00 -7E00 -FF00 -0200 -ENDCHAR -STARTCHAR 8490 -ENCODING 33936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1000 -7E00 -7E00 -4900 -7E00 -2D00 -6F80 -8F00 -ENDCHAR -STARTCHAR 8494 -ENCODING 33940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0400 -FF00 -A400 -FF80 -BF80 -A900 -E900 -8200 -ENDCHAR -STARTCHAR 8499 -ENCODING 33945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -2400 -FF00 -BF00 -0000 -FF00 -F500 -DA00 -7A00 -D980 -ENDCHAR -STARTCHAR 849C -ENCODING 33948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -E700 -0000 -FF80 -EB00 -DB00 -CA80 -4600 -ENDCHAR -STARTCHAR 84A1 -ENCODING 33953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -2400 -FF00 -8880 -7F00 -1E00 -6200 -C600 -ENDCHAR -STARTCHAR 84B2 -ENCODING 33970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -8500 -7F80 -8400 -BF00 -7F00 -7F00 -A500 -A500 -ENDCHAR -STARTCHAR 84B8 -ENCODING 33976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -0400 -ED00 -4A00 -9100 -7E00 -9500 -9480 -ENDCHAR -STARTCHAR 84BB -ENCODING 33979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0000 -FF00 -F700 -FF00 -5700 -BB00 -5500 -AB00 -ENDCHAR -STARTCHAR 84BC -ENCODING 33980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1800 -7E00 -FF80 -7E00 -7E00 -4000 -BE00 -BE00 -ENDCHAR -STARTCHAR 84BF -ENCODING 33983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF80 -0000 -7E00 -3C00 -FF00 -BD00 -BD00 -A300 -ENDCHAR -STARTCHAR 84C0 -ENCODING 33984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0300 -EC00 -4A00 -6500 -DF00 -4E00 -5500 -D480 -ENDCHAR -STARTCHAR 84C2 -ENCODING 33986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -2400 -FF00 -FF00 -4200 -7E00 -7E00 -FF80 -2600 -C100 -ENDCHAR -STARTCHAR 84C4 -ENCODING 33988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -1600 -3B00 -FC80 -7F00 -4900 -7F00 -7F00 -ENDCHAR -STARTCHAR 84C6 -ENCODING 33990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF80 -FF00 -9200 -BF00 -A900 -A900 -AB00 -ENDCHAR -STARTCHAR 84C9 -ENCODING 33993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF00 -5900 -B600 -6380 -FE00 -7E00 -4200 -ENDCHAR -STARTCHAR 84CB -ENCODING 33995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7F00 -0800 -FF00 -2200 -FD00 -7E00 -5500 -FF80 -ENDCHAR -STARTCHAR 84CD -ENCODING 33997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -FF80 -3300 -FF00 -0000 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR 84D1 -ENCODING 34001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -0000 -7E00 -FF80 -7E00 -2500 -FA00 -6180 -ENDCHAR -STARTCHAR 84DA -ENCODING 34010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4800 -4F00 -7A00 -FF00 -E600 -6B80 -6E00 -5800 -ENDCHAR -STARTCHAR 84EC -ENCODING 34028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4F00 -9A00 -8E00 -3F80 -C400 -5F00 -4400 -BF80 -ENDCHAR -STARTCHAR 84EE -ENCODING 34030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -C400 -3F00 -DF00 -1F00 -DF00 -7F80 -4400 -BF80 -ENDCHAR -STARTCHAR 84F4 -ENCODING 34036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -7F00 -7F00 -7F00 -FF00 -0200 -FF80 -2C00 -ENDCHAR -STARTCHAR 84FC -ENCODING 34044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -5700 -FF00 -A600 -D980 -6E00 -7C00 -6000 -ENDCHAR -STARTCHAR 8511 -ENCODING 34065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -7F00 -9500 -7F00 -FF80 -8400 -B600 -9A80 -A100 -ENDCHAR -STARTCHAR 8513 -ENCODING 34067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -7E00 -7E00 -0000 -FF00 -FF00 -FE00 -2400 -FF80 -ENDCHAR -STARTCHAR 8514 -ENCODING 34068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7F00 -4100 -BD00 -3D00 -7D00 -7D00 -7D00 -0300 -ENDCHAR -STARTCHAR 8517 -ENCODING 34071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -FF80 -9400 -BF00 -FF00 -8000 -B500 -D500 -ENDCHAR -STARTCHAR 8518 -ENCODING 34072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1400 -7A00 -EB00 -3700 -D980 -6E00 -7C00 -6000 -ENDCHAR -STARTCHAR 851A -ENCODING 34074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -F900 -8900 -FF80 -F500 -8300 -F900 -E900 -A300 -ENDCHAR -STARTCHAR 851E -ENCODING 34078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -FF80 -7E00 -7F00 -7F00 -FF80 -6400 -FB00 -ENDCHAR -STARTCHAR 8521 -ENCODING 34081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7F00 -D600 -A600 -7F00 -FF00 -2A00 -4B00 -9900 -ENDCHAR -STARTCHAR 8523 -ENCODING 34083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -AF00 -B200 -FD00 -FF80 -A900 -A500 -A200 -ENDCHAR -STARTCHAR 8525 -ENCODING 34085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7F00 -5D00 -6500 -7D00 -7F00 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR 852C -ENCODING 34092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0400 -FF00 -6900 -DF00 -ED00 -CD00 -F580 -D580 -ENDCHAR -STARTCHAR 852D -ENCODING 34093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -E400 -AF00 -D080 -C600 -BF00 -BF00 -EB00 -9F00 -ENDCHAR -STARTCHAR 852F -ENCODING 34095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0400 -FF80 -BF00 -DF00 -B500 -BF00 -FE00 -9580 -ENDCHAR -STARTCHAR 853D -ENCODING 34109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2400 -B400 -AF80 -F500 -D300 -B200 -B500 -B480 -ENDCHAR -STARTCHAR 853F -ENCODING 34111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -8200 -FF00 -4200 -7E00 -7F00 -B700 -B300 -ENDCHAR -STARTCHAR 8541 -ENCODING 34113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -7F00 -FF80 -7F00 -FF00 -FF00 -FF80 -2200 -2600 -ENDCHAR -STARTCHAR 8543 -ENCODING 34115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -2A00 -FF00 -2C00 -FF80 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 8549 -ENCODING 34121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4800 -7F00 -FF00 -CF00 -7F00 -0000 -5500 -9480 -ENDCHAR -STARTCHAR 854E -ENCODING 34126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -FF00 -7E00 -BD80 -FF00 -BD00 -BD00 -A300 -ENDCHAR -STARTCHAR 8553 -ENCODING 34131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -FF00 -EE80 -6E00 -7E00 -FF80 -2200 -FD00 -ENDCHAR -STARTCHAR 8559 -ENCODING 34137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -7E00 -7E00 -4900 -FE00 -1C00 -AB00 -BC80 -ENDCHAR -STARTCHAR 8563 -ENCODING 34147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7C00 -2A00 -FF00 -C300 -7F00 -DA00 -7F80 -8200 -ENDCHAR -STARTCHAR 8568 -ENCODING 34152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF80 -AA00 -FB80 -9680 -DB00 -FA00 -A500 -C880 -ENDCHAR -STARTCHAR 8569 -ENCODING 34153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -9F00 -5F00 -9F00 -3F80 -5000 -BF00 -8B00 -9700 -ENDCHAR -STARTCHAR 856A -ENCODING 34154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4000 -FF00 -D600 -FF80 -FF00 -0000 -5500 -9480 -ENDCHAR -STARTCHAR 856D -ENCODING 34157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7F00 -FF80 -7F00 -AD00 -6F00 -FF00 -EF00 -AD00 -ENDCHAR -STARTCHAR 8584 -ENCODING 34180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF80 -1F00 -A500 -7F00 -5F00 -7F80 -9200 -8600 -ENDCHAR -STARTCHAR 8587 -ENCODING 34183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7A00 -BB80 -C300 -BF00 -BB00 -AE00 -AF00 -A480 -ENDCHAR -STARTCHAR 858F -ENCODING 34191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -7F00 -FF80 -0000 -7E00 -7E00 -3C00 -AB00 -BC80 -ENDCHAR -STARTCHAR 8591 -ENCODING 34193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -FF00 -4900 -7F00 -3600 -7F00 -7F00 -7F00 -FF80 -ENDCHAR -STARTCHAR 8594 -ENCODING 34196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -4A00 -FF80 -0000 -7F00 -BD00 -BD00 -7F00 -ENDCHAR -STARTCHAR 859B -ENCODING 34203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4200 -EF00 -9100 -E500 -8F80 -FF00 -F200 -9200 -ENDCHAR -STARTCHAR 85A6 -ENCODING 34214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF80 -FF00 -9500 -FF00 -A000 -BF00 -DB00 -DB00 -ENDCHAR -STARTCHAR 85A8 -ENCODING 34216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -7F00 -7F00 -FF00 -8080 -FF00 -F600 -2880 -C700 -ENDCHAR -STARTCHAR 85A9 -ENCODING 34217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -FF00 -CA00 -CF00 -DF80 -BA00 -DF00 -9200 -AF80 -ENDCHAR -STARTCHAR 85AA -ENCODING 34218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -7F00 -2100 -F600 -5400 -F780 -F500 -6900 -B900 -2900 -ENDCHAR -STARTCHAR 85AF -ENCODING 34223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -FF00 -7E00 -FF80 -3F00 -C100 -3F00 -3F00 -ENDCHAR -STARTCHAR 85B0 -ENCODING 34224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -FF00 -7F00 -6D00 -FF00 -FF80 -A500 -9480 -ENDCHAR -STARTCHAR 85BA -ENCODING 34234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF80 -F700 -AD00 -EE80 -4100 -7E00 -7E00 -8100 -ENDCHAR -STARTCHAR 85C1 -ENCODING 34241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -0000 -7E00 -3C00 -FF00 -BD00 -FF80 -3400 -CB80 -ENDCHAR -STARTCHAR 85C9 -ENCODING 34249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -5500 -EF00 -F500 -4F80 -FF00 -A900 -DF00 -4900 -ENDCHAR -STARTCHAR 85CD -ENCODING 34253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -F400 -A780 -F800 -F700 -F000 -7F00 -5500 -FF80 -ENDCHAR -STARTCHAR 85CE -ENCODING 34254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -7E00 -FF80 -7E00 -FF80 -5500 -8080 -7F00 -FF80 -ENDCHAR -STARTCHAR 85CF -ENCODING 34255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0300 -BF80 -DE00 -DF00 -D700 -DE00 -DD80 -4900 -ENDCHAR -STARTCHAR 85D5 -ENCODING 34261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -6F00 -ED00 -EF00 -4F00 -FF00 -7280 -D480 -5100 -ENDCHAR -STARTCHAR 85DC -ENCODING 34268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -F400 -F700 -6B00 -DF00 -6E00 -AB80 -2E00 -D100 -ENDCHAR -STARTCHAR 85DD -ENCODING 34269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -F500 -B580 -F780 -0000 -7E00 -FF80 -FF00 -ENDCHAR -STARTCHAR 85E4 -ENCODING 34276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -E800 -B500 -FF00 -BF80 -ED80 -BC00 -AF00 -7D00 -ENDCHAR -STARTCHAR 85E5 -ENCODING 34277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -5A00 -9600 -DB00 -A580 -FF80 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 85E9 -ENCODING 34281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -BF00 -5500 -BF80 -9600 -7F80 -A500 -9F00 -9F00 -ENDCHAR -STARTCHAR 85EA -ENCODING 34282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -F200 -FB80 -F500 -F500 -F300 -FA00 -9300 -F480 -ENDCHAR -STARTCHAR 85F7 -ENCODING 34295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0400 -EF00 -E500 -FF80 -FF00 -E900 -AF00 -EF00 -ENDCHAR -STARTCHAR 85FA -ENCODING 34298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -F700 -F700 -F700 -A900 -FF00 -E900 -B900 -B700 -ENDCHAR -STARTCHAR 85FB -ENCODING 34299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -5E00 -1E00 -BF00 -BF00 -4400 -BF00 -9A00 -A500 -ENDCHAR -STARTCHAR 85FF -ENCODING 34303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -FF00 -FF00 -8900 -0800 -FF00 -C800 -7F00 -7F00 -ENDCHAR -STARTCHAR 8602 -ENCODING 34306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -6E00 -BD00 -3D00 -FB80 -0800 -FF80 -2E00 -C980 -ENDCHAR -STARTCHAR 8606 -ENCODING 34310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1000 -FF00 -DF00 -BE00 -BE00 -BE00 -B500 -FF80 -ENDCHAR -STARTCHAR 8607 -ENCODING 34311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4100 -E300 -FF80 -F200 -F700 -0E80 -FA00 -E200 -ENDCHAR -STARTCHAR 860A -ENCODING 34314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4F00 -AD00 -AB00 -6F00 -DF00 -F700 -F700 -5F80 -ENDCHAR -STARTCHAR 8616 -ENCODING 34326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -F500 -9F80 -9200 -FF00 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 8617 -ENCODING 34327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -F500 -FF80 -D200 -2800 -FF00 -3400 -CB80 -ENDCHAR -STARTCHAR 861A -ENCODING 34330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -4400 -E500 -FF80 -FF00 -B200 -FF80 -F200 -F200 -ENDCHAR -STARTCHAR 862D -ENCODING 34349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -F700 -9900 -F700 -FF00 -EF00 -BF00 -AF00 -8900 -ENDCHAR -STARTCHAR 863F -ENCODING 34367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -FF00 -FF00 -6A00 -CF00 -FF00 -4F00 -EA00 -CF80 -ENDCHAR -STARTCHAR 864E -ENCODING 34382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -0E -7F -91 -BF -9E -84 -94 -A5 -C7 -ENDCHAR -STARTCHAR 8650 -ENCODING 34384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -0E00 -FF80 -9700 -F900 -9E00 -BF00 -FF80 -A000 -BF00 -ENDCHAR -STARTCHAR 8654 -ENCODING 34388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0F00 -FF80 -FF00 -9F00 -8800 -FF00 -B200 -8C00 -F380 -ENDCHAR -STARTCHAR 8655 -ENCODING 34389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -0E00 -FF00 -BF00 -BE00 -B600 -D600 -F680 -9900 -EF80 -ENDCHAR -STARTCHAR 865B -ENCODING 34395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -0F00 -FF00 -BD00 -D100 -9E00 -D500 -B700 -9400 -FF80 -ENDCHAR -STARTCHAR 865C -ENCODING 34396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -0E -FF -B1 -BF -FF -BF -FF -91 -E3 -ENDCHAR -STARTCHAR 865E -ENCODING 34398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1E00 -1000 -FF00 -D100 -9F00 -D100 -CE00 -BF00 -FF80 -F300 -ENDCHAR -STARTCHAR 865F -ENCODING 34399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A700 -EF80 -1680 -EC80 -9700 -F600 -B600 -3A80 -DB00 -ENDCHAR -STARTCHAR 8667 -ENCODING 34407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2780 -3A00 -FA00 -F780 -BA00 -FB00 -F880 -F880 -F900 -4300 -ENDCHAR -STARTCHAR 8679 -ENCODING 34425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -4F00 -F200 -D200 -D200 -D200 -F200 -5200 -7200 -DF80 -ENDCHAR -STARTCHAR 868A -ENCODING 34442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF80 -E900 -E600 -E600 -6600 -7600 -8900 -1080 -ENDCHAR -STARTCHAR 868C -ENCODING 34444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4300 -EC00 -D200 -DF00 -E200 -4F80 -5200 -F200 -1200 -ENDCHAR -STARTCHAR 8693 -ENCODING 34451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -43 -E3 -EF -E9 -EF -43 -63 -63 -9D -ENDCHAR -STARTCHAR 86A3 -ENCODING 34467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -4100 -E900 -D900 -DC80 -E400 -4600 -5500 -7B00 -8C80 -ENDCHAR -STARTCHAR 86A4 -ENCODING 34468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -2C00 -5C00 -3380 -C800 -7E00 -7E00 -0900 -FF00 -ENDCHAR -STARTCHAR 86A9 -ENCODING 34473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -8900 -FF00 -1000 -FF80 -7E00 -4900 -7F00 -0B00 -FC80 -ENDCHAR -STARTCHAR 86C7 -ENCODING 34503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4F00 -F080 -F880 -E800 -EB00 -E400 -5800 -7880 -D700 -ENDCHAR -STARTCHAR 86CB -ENCODING 34507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -4900 -6E00 -BF00 -0800 -7E00 -7E00 -0900 -FE80 -ENDCHAR -STARTCHAR 86D4 -ENCODING 34516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -4F -F1 -F7 -F7 -F7 -F7 -71 -6F -91 -ENDCHAR -STARTCHAR 86D9 -ENCODING 34521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -EF00 -E400 -EF80 -E400 -E400 -5F00 -7400 -DF80 -ENDCHAR -STARTCHAR 86DB -ENCODING 34523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4A00 -EF00 -F200 -FF80 -E600 -E500 -6B00 -7280 -8200 -ENDCHAR -STARTCHAR 86DF -ENCODING 34527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -EA00 -E900 -D080 -E900 -4600 -6600 -8900 -1080 -ENDCHAR -STARTCHAR 86E4 -ENCODING 34532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -4600 -E900 -DF80 -E000 -EF00 -4900 -6900 -6F00 -9900 -ENDCHAR -STARTCHAR 86ED -ENCODING 34541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4400 -E900 -FF00 -E080 -E400 -FF00 -6400 -6400 -9F80 -ENDCHAR -STARTCHAR 86FE -ENCODING 34558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -5B00 -EA00 -FF80 -EF00 -FB00 -6A00 -6B80 -9D00 -ENDCHAR -STARTCHAR 8700 -ENCODING 34560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -A5 -FF -7F -FD -55 -7D -F3 -03 -ENDCHAR -STARTCHAR 8702 -ENCODING 34562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -F600 -E600 -FB80 -EF00 -4F00 -6F80 -6200 -9200 -ENDCHAR -STARTCHAR 8703 -ENCODING 34563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -BE -FF -A6 -FB -FF -49 -7F -F8 -ENDCHAR -STARTCHAR 8708 -ENCODING 34568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4700 -5500 -F700 -F000 -EF00 -E500 -7F80 -EA00 -1180 -ENDCHAR -STARTCHAR 8718 -ENCODING 34584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -53 -FF -FB -FF -EB -4B -6B -F7 -17 -ENDCHAR -STARTCHAR 871A -ENCODING 34586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -F700 -F700 -E780 -2400 -0800 -7F00 -7F00 -0F00 -F080 -ENDCHAR -STARTCHAR 871C -ENCODING 34588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FA80 -AD00 -B280 -FC00 -7F00 -4900 -7F00 -FF00 -ENDCHAR -STARTCHAR 874E -ENCODING 34638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -51 -EF -EF -E8 -FF -55 -77 -6F -83 -ENDCHAR -STARTCHAR 8755 -ENCODING 34645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6200 -E200 -9F00 -EB00 -EB00 -EB00 -8F00 -F300 -F300 -8C80 -ENDCHAR -STARTCHAR 8757 -ENCODING 34647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -E900 -EF00 -EF00 -E000 -FF80 -6F00 -6400 -9F80 -ENDCHAR -STARTCHAR 875F -ENCODING 34655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -4F -55 -EF -E0 -EF -EF -6F -69 -9B -ENDCHAR -STARTCHAR 8766 -ENCODING 34662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -5500 -F700 -FC00 -FB00 -F300 -7B00 -7300 -B480 -ENDCHAR -STARTCHAR 8768 -ENCODING 34664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -1200 -FE80 -C100 -4200 -FF00 -FF00 -7300 -DC80 -ENDCHAR -STARTCHAR 8774 -ENCODING 34676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4B -4B -FF -EB -EB -FF -F7 -7F -75 -A7 -ENDCHAR -STARTCHAR 8776 -ENCODING 34678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4D00 -5F80 -ED00 -EF00 -EF80 -E400 -7F80 -6600 -8D00 -1480 -ENDCHAR -STARTCHAR 8778 -ENCODING 34680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -49 -EF -ED -FF -F1 -57 -77 -75 -91 -ENDCHAR -STARTCHAR 8782 -ENCODING 34690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B80 -5F00 -F700 -BF00 -B700 -FE80 -5A80 -5B00 -FA00 -3200 -ENDCHAR -STARTCHAR 878D -ENCODING 34701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -0200 -F700 -F680 -0680 -F680 -F700 -EB00 -AB00 -B680 -ENDCHAR -STARTCHAR 879F -ENCODING 34719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5080 -EF00 -E900 -EF00 -EF00 -5F80 -6000 -E900 -1080 -ENDCHAR -STARTCHAR 87A2 -ENCODING 34722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B680 -DB00 -6600 -9D00 -FF00 -8880 -7E00 -7E00 -0F00 -F900 -ENDCHAR -STARTCHAR 87B3 -ENCODING 34739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -4D00 -FF80 -FF80 -E900 -E900 -EF00 -6F00 -6400 -9F80 -ENDCHAR -STARTCHAR 87BA -ENCODING 34746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5500 -EF00 -EF00 -ED00 -E700 -5F80 -6200 -6B00 -9280 -ENDCHAR -STARTCHAR 87C4 -ENCODING 34756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF00 -F500 -F500 -FB80 -4980 -7F00 -8900 -7F00 -FF00 -ENDCHAR -STARTCHAR 87E0 -ENCODING 34784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -5E00 -ED00 -FF80 -ED00 -FF80 -5500 -6F00 -7500 -8F00 -ENDCHAR -STARTCHAR 87EC -ENCODING 34796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5680 -FF00 -EF00 -F500 -EF00 -4F00 -7F80 -6400 -8400 -ENDCHAR -STARTCHAR 87EF -ENCODING 34799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -FF80 -E900 -FF00 -FB80 -7F80 -6A00 -8A80 -1300 -ENDCHAR -STARTCHAR 87F2 -ENCODING 34802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F00 -7F00 -0F00 -F100 -4200 -FF00 -FF00 -3300 -DC80 -ENDCHAR -STARTCHAR 87F9 -ENCODING 34809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -E480 -FD00 -B700 -FF80 -B200 -7F00 -8F00 -7B00 -FC80 -ENDCHAR -STARTCHAR 87FB -ENCODING 34811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -5F80 -EF00 -FF80 -E000 -FB00 -FF80 -7F00 -6A80 -9D80 -ENDCHAR -STARTCHAR 87FE -ENCODING 34814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4E00 -FF80 -F700 -F000 -FF00 -F700 -7000 -FF00 -3F00 -ENDCHAR -STARTCHAR 8805 -ENCODING 34821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5700 -FB00 -EA00 -F700 -FB00 -F680 -7B00 -7680 -A700 -ENDCHAR -STARTCHAR 881F -ENCODING 34847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4D00 -4D00 -FF00 -FF00 -FF00 -E000 -5F00 -7F00 -FF80 -3580 -ENDCHAR -STARTCHAR 8822 -ENCODING 34850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7600 -2E00 -7B00 -DF80 -FE00 -3E00 -FF00 -7700 -FE80 -ENDCHAR -STARTCHAR 8823 -ENCODING 34851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5F80 -F500 -FF00 -FF00 -FF00 -7200 -7F00 -BF00 -2900 -ENDCHAR -STARTCHAR 8831 -ENCODING 34865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7E00 -FE00 -4200 -FF00 -FF00 -FF00 -0000 -7F00 -FF80 -ENDCHAR -STARTCHAR 8836 -ENCODING 34870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -7680 -FF80 -7F00 -7F00 -FF00 -FF00 -FF80 -ENDCHAR -STARTCHAR 883B -ENCODING 34875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9A00 -DF00 -4200 -E380 -FD00 -0800 -7F00 -7F00 -0B00 -F480 -ENDCHAR -STARTCHAR 8840 -ENCODING 34880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -1000 -7F00 -5500 -5500 -5500 -5500 -5500 -5500 -FF80 -ENDCHAR -STARTCHAR 8846 -ENCODING 34886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7F00 -9500 -FF80 -0600 -7900 -6D00 -AA00 -4A00 -8900 -ENDCHAR -STARTCHAR 884C -ENCODING 34892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -4F00 -A000 -4000 -5F80 -C200 -C200 -4200 -4200 -4600 -ENDCHAR -STARTCHAR 884D -ENCODING 34893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5000 -CF00 -C000 -5780 -C200 -CA00 -5200 -5200 -6600 -ENDCHAR -STARTCHAR 8852 -ENCODING 34898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -8B80 -BC00 -5380 -7100 -9900 -9100 -5500 -7D00 -4300 -ENDCHAR -STARTCHAR 8853 -ENCODING 34899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -9700 -BC00 -5380 -7500 -B500 -B500 -B500 -B100 -9300 -ENDCHAR -STARTCHAR 8857 -ENCODING 34903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -FF80 -8800 -4B80 -FD00 -8900 -BD00 -8900 -BD00 -8300 -ENDCHAR -STARTCHAR 8859 -ENCODING 34905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -BF80 -B800 -5780 -7D00 -8100 -BD00 -6500 -7D00 -6700 -ENDCHAR -STARTCHAR 885B -ENCODING 34907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -BF00 -FC00 -4380 -BD00 -BD00 -BD00 -A900 -BD00 -8B00 -ENDCHAR -STARTCHAR 885D -ENCODING 34909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -B380 -FC00 -7F80 -BD00 -AD00 -7D00 -7D00 -4D00 -7300 -ENDCHAR -STARTCHAR 8861 -ENCODING 34913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -9B80 -BC00 -6F80 -7D00 -BD00 -BD00 -5900 -5900 -6700 -ENDCHAR -STARTCHAR 8862 -ENCODING 34914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F80 -BC00 -FC00 -BF80 -A900 -BD00 -FD00 -A900 -BF00 -ENDCHAR -STARTCHAR 8863 -ENCODING 34915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -FF00 -1800 -1900 -2600 -E600 -A200 -2900 -7080 -ENDCHAR -STARTCHAR 8868 -ENCODING 34920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0800 -7F00 -FF80 -1900 -6600 -A200 -3900 -6080 -ENDCHAR -STARTCHAR 886B -ENCODING 34923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -4600 -E800 -2100 -5600 -E800 -D080 -4300 -4C00 -5800 -ENDCHAR -STARTCHAR 8870 -ENCODING 34928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -7E00 -2200 -FF80 -FF00 -1900 -6600 -BB00 -6180 -ENDCHAR -STARTCHAR 8872 -ENCODING 34930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4C -44 -FF -55 -75 -DB -F9 -51 -51 -53 -ENDCHAR -STARTCHAR 8877 -ENCODING 34935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0800 -7F00 -8900 -7F00 -6900 -A600 -3A00 -E180 -ENDCHAR -STARTCHAR 887E -ENCODING 34942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -6600 -BD80 -7E00 -0200 -0C00 -FF80 -6A00 -BE00 -6180 -ENDCHAR -STARTCHAR 887F -ENCODING 34943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -E900 -3F80 -6000 -EF00 -E100 -4100 -4200 -4200 -ENDCHAR -STARTCHAR 8881 -ENCODING 34945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F00 -FF80 -0000 -7E00 -7E00 -1900 -6600 -AA00 -7100 -ENDCHAR -STARTCHAR 8882 -ENCODING 34946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -EF00 -2500 -6500 -FF80 -E400 -4A00 -5900 -5080 -ENDCHAR -STARTCHAR 8888 -ENCODING 34952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -F700 -5500 -7700 -8800 -FF00 -2A00 -E400 -2B00 -7180 -ENDCHAR -STARTCHAR 888B -ENCODING 34955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -4900 -FE00 -C480 -4B00 -FF80 -2900 -6600 -BA00 -6180 -ENDCHAR -STARTCHAR 888D -ENCODING 34957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -F080 -3E80 -6B00 -EF00 -EB00 -4800 -4880 -4F00 -ENDCHAR -STARTCHAR 8892 -ENCODING 34962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -E900 -2F00 -6900 -E900 -EF00 -4900 -4000 -5F80 -ENDCHAR -STARTCHAR 8896 -ENCODING 34966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -44 -FF -35 -75 -FF -F5 -55 -5F -51 -ENDCHAR -STARTCHAR 8897 -ENCODING 34967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -E900 -3280 -4D00 -EA00 -EC80 -4B00 -4400 -5800 -ENDCHAR -STARTCHAR 889E -ENCODING 34974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2400 -FF80 -4200 -7E00 -6900 -A600 -3B00 -6180 -ENDCHAR -STARTCHAR 88AB -ENCODING 34987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -F480 -5400 -7F00 -D900 -B600 -5200 -5F00 -6980 -ENDCHAR -STARTCHAR 88B4 -ENCODING 34996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -EA00 -3F80 -6000 -DF00 -E800 -4F00 -5100 -4600 -ENDCHAR -STARTCHAR 88C1 -ENCODING 35009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -F500 -2400 -FF80 -2500 -FD00 -6E00 -D600 -7E80 -C900 -ENDCHAR -STARTCHAR 88C2 -ENCODING 35010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4500 -F500 -F500 -CB00 -0800 -FF80 -6600 -BB00 -6180 -ENDCHAR -STARTCHAR 88CF -ENCODING 35023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7F00 -4900 -7F00 -FF00 -FF80 -2900 -FE00 -6180 -ENDCHAR -STARTCHAR 88D4 -ENCODING 35028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -2900 -FE00 -6100 -FF00 -A700 -FD00 -BD00 -A500 -ENDCHAR -STARTCHAR 88D5 -ENCODING 35029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -4900 -F500 -2600 -6A00 -D900 -FF80 -4900 -4F00 -4900 -ENDCHAR -STARTCHAR 88D9 -ENCODING 35033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4500 -FF80 -4500 -6F00 -C800 -BF00 -6900 -4F00 -4900 -ENDCHAR -STARTCHAR 88DC -ENCODING 35036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -5F80 -E400 -5F00 -7500 -DF00 -F500 -5F00 -5500 -5500 -ENDCHAR -STARTCHAR 88DD -ENCODING 35037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A200 -E200 -3F80 -E200 -AF00 -8800 -FF80 -2900 -EE00 -7180 -ENDCHAR -STARTCHAR 88DF -ENCODING 35039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5500 -9500 -6F00 -8C00 -3000 -FF80 -2500 -FA00 -6180 -ENDCHAR -STARTCHAR 88E1 -ENCODING 35041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5500 -F500 -3F00 -7500 -FF00 -FF00 -4400 -4400 -5F80 -ENDCHAR -STARTCHAR 88E8 -ENCODING 35048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F500 -3F00 -7500 -FF00 -FA00 -5F80 -4200 -4200 -ENDCHAR -STARTCHAR 88F3 -ENCODING 35059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -FF00 -8080 -BE80 -3E00 -0800 -FF80 -2900 -FE00 -6180 -ENDCHAR -STARTCHAR 88F4 -ENCODING 35060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -F700 -F700 -A780 -2800 -0800 -FF00 -6600 -BB00 -6100 -ENDCHAR -STARTCHAR 88F5 -ENCODING 35061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -F700 -F700 -1400 -FF80 -6A00 -A400 -3B00 -6180 -ENDCHAR -STARTCHAR 88F8 -ENCODING 35064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5500 -EF00 -3500 -6F00 -FF80 -E600 -4D00 -5480 -4400 -ENDCHAR -STARTCHAR 88FD -ENCODING 35069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A500 -FD00 -FD00 -FD00 -BB00 -2900 -F780 -2500 -FA00 -6180 -ENDCHAR -STARTCHAR 8907 -ENCODING 35079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5F80 -FF00 -3100 -5F00 -EF00 -EF00 -7A00 -4E00 -7180 -ENDCHAR -STARTCHAR 8910 -ENCODING 35088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -2F80 -2880 -7F80 -1F80 -3400 -6F80 -BA80 -2D80 -2F80 -2180 -ENDCHAR -STARTCHAR 8912 -ENCODING 35090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -5F00 -DF00 -FF80 -5E00 -6D80 -3E00 -EE00 -F180 -ENDCHAR -STARTCHAR 8913 -ENCODING 35091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5700 -D500 -5700 -7200 -DF80 -B600 -5B00 -5A80 -5200 -ENDCHAR -STARTCHAR 8918 -ENCODING 35096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4F00 -FF80 -2000 -6F00 -EF00 -FF00 -4A00 -5F80 -4200 -ENDCHAR -STARTCHAR 8919 -ENCODING 35097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5B00 -EA80 -3B00 -6F00 -F100 -AF00 -4F00 -5100 -5300 -ENDCHAR -STARTCHAR 8925 -ENCODING 35109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -5000 -FF00 -3F80 -7700 -F980 -6100 -5F80 -4900 -4300 -ENDCHAR -STARTCHAR 892A -ENCODING 35114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5700 -4D00 -E700 -5500 -6700 -D680 -AD00 -4E80 -5800 -5780 -ENDCHAR -STARTCHAR 8936 -ENCODING 35126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5F -4D -F7 -2F -55 -EF -F1 -4F -4F -51 -ENDCHAR -STARTCHAR 8938 -ENCODING 35128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -FF80 -5F00 -7F00 -D500 -BF80 -4A00 -4600 -7900 -ENDCHAR -STARTCHAR 893B -ENCODING 35131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -F400 -FF00 -ED00 -F580 -F980 -2600 -FA00 -6180 -ENDCHAR -STARTCHAR 8941 -ENCODING 35137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF00 -8D00 -CF00 -5A00 -6700 -DE80 -AE80 -8F00 -8B80 -B680 -ENDCHAR -STARTCHAR 8944 -ENCODING 35140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -F700 -F700 -FF00 -FF00 -2400 -FF80 -EE00 -7180 -ENDCHAR -STARTCHAR 895F -ENCODING 35167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -5B80 -DB00 -6D80 -6900 -DF00 -7F80 -4D00 -5500 -6C80 -ENDCHAR -STARTCHAR 8964 -ENCODING 35172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5E00 -5A00 -DF80 -5C00 -6B80 -DC00 -BF00 -5B00 -5B00 -7F80 -ENDCHAR -STARTCHAR 896A -ENCODING 35178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -5F80 -FF00 -5F00 -6500 -DF80 -FB00 -5600 -5680 -6D00 -ENDCHAR -STARTCHAR 8972 -ENCODING 35186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F700 -F100 -0700 -F700 -F880 -F700 -0800 -FF00 -EE00 -7180 -ENDCHAR -STARTCHAR 897F -ENCODING 35199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -1800 -FF00 -A900 -AB00 -C700 -8100 -FF00 -8100 -ENDCHAR -STARTCHAR 8981 -ENCODING 35201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -1400 -FF00 -FF00 -1000 -FF80 -2400 -1E00 -E100 -ENDCHAR -STARTCHAR 8983 -ENCODING 35203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -FF00 -FF00 -7E00 -4100 -7E00 -7E00 -FF80 -0800 -ENDCHAR -STARTCHAR 8986 -ENCODING 35206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -FF00 -FF00 -5F00 -F100 -9F00 -9F00 -6A00 -7F80 -ENDCHAR -STARTCHAR 8987 -ENCODING 35207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -FF00 -FF00 -F700 -7500 -F700 -F700 -F500 -2B00 -ENDCHAR -STARTCHAR 898B -ENCODING 35211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -7E00 -4200 -7E00 -7E00 -1400 -2480 -C700 -ENDCHAR -STARTCHAR 898F -ENCODING 35215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -4900 -EF00 -4900 -EF00 -4900 -4F00 -AA00 -AA80 -9380 -ENDCHAR -STARTCHAR 8993 -ENCODING 35219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0300 -7E00 -C900 -FE00 -7E00 -4200 -7E00 -7E00 -2880 -C700 -ENDCHAR -STARTCHAR 8996 -ENCODING 35222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -0900 -FF00 -EF00 -E900 -EF00 -E600 -EA80 -5380 -ENDCHAR -STARTCHAR 89A1 -ENCODING 35233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -2500 -B700 -B700 -B500 -E700 -3E00 -CE80 -1980 -ENDCHAR -STARTCHAR 89A9 -ENCODING 35241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4700 -F900 -5700 -F900 -5700 -F700 -F600 -F680 -9980 -ENDCHAR -STARTCHAR 89AA -ENCODING 35242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -F900 -AF00 -6900 -FF00 -F900 -6F00 -E600 -DA80 -5B00 -ENDCHAR -STARTCHAR 89B2 -ENCODING 35250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AF00 -F900 -6F00 -F900 -DF00 -F900 -4F00 -F600 -7680 -CB80 -ENDCHAR -STARTCHAR 89BA -ENCODING 35258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7B00 -7700 -6B00 -FF80 -FE80 -7E00 -7E00 -1880 -E700 -ENDCHAR -STARTCHAR 89BD -ENCODING 35261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F800 -FF80 -FF00 -FF00 -0000 -7E00 -4100 -7F00 -7E80 -E700 -ENDCHAR -STARTCHAR 89C0 -ENCODING 35264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6700 -F500 -F700 -F500 -2700 -F500 -F700 -F600 -F680 -8980 -ENDCHAR -STARTCHAR 89D2 -ENCODING 35282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -3C -44 -FF -7F -49 -49 -7F -81 -83 -ENDCHAR -STARTCHAR 89E3 -ENCODING 35299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -6500 -A500 -FB00 -B600 -F700 -FA00 -9F80 -9200 -B200 -ENDCHAR -STARTCHAR 89F4 -ENCODING 35316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -EF00 -BF00 -EF00 -EF00 -DF80 -EF00 -9700 -AB00 -AF00 -ENDCHAR -STARTCHAR 89F8 -ENCODING 35320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -EF -AF -E8 -EF -FF -EF -AF -AD -A3 -ENDCHAR -STARTCHAR 8A00 -ENCODING 35328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -FF80 -0000 -7E00 -7E00 -0000 -7E00 -7E00 -4200 -ENDCHAR -STARTCHAR 8A02 -ENCODING 35330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF80 -F200 -0200 -E200 -E200 -0200 -E200 -E200 -A600 -ENDCHAR -STARTCHAR 8A03 -ENCODING 35331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -0400 -FC00 -F400 -0600 -F500 -F480 -9400 -F400 -9400 -ENDCHAR -STARTCHAR 8A08 -ENCODING 35336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -0200 -F200 -FF80 -0200 -E200 -E200 -A200 -E200 -A200 -ENDCHAR -STARTCHAR 8A0A -ENCODING 35338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -EA00 -0A00 -FE00 -EA00 -0A00 -EA00 -E980 -B180 -ENDCHAR -STARTCHAR 8A0C -ENCODING 35340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -F200 -0200 -E200 -E200 -0200 -E200 -A200 -FF80 -ENDCHAR -STARTCHAR 8A0E -ENCODING 35342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E100 -0100 -F100 -EF80 -0900 -E500 -E500 -A100 -E100 -A300 -ENDCHAR -STARTCHAR 8A13 -ENCODING 35347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -E9 -0B -EB -EB -EB -EB -AB -F1 -91 -ENDCHAR -STARTCHAR 8A16 -ENCODING 35350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -0800 -EF80 -E800 -1E00 -E200 -E400 -A880 -F080 -BF00 -ENDCHAR -STARTCHAR 8A17 -ENCODING 35351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E300 -1C00 -E400 -E500 -FE00 -0400 -E400 -A480 -E700 -ENDCHAR -STARTCHAR 8A18 -ENCODING 35352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -E100 -0100 -EF00 -E900 -0800 -E800 -A880 -EF00 -ENDCHAR -STARTCHAR 8A1B -ENCODING 35355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EC00 -0C00 -EC80 -F500 -1200 -EC00 -F400 -B400 -F480 -B300 -ENDCHAR -STARTCHAR 8A1D -ENCODING 35357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -E900 -0900 -FF80 -E200 -0500 -E900 -F100 -A200 -ENDCHAR -STARTCHAR 8A1F -ENCODING 35359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E600 -E900 -0900 -ED00 -F480 -0600 -E900 -EB00 -BC80 -ENDCHAR -STARTCHAR 8A23 -ENCODING 35363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0400 -FF00 -E500 -0500 -FF80 -E400 -AA00 -F900 -B080 -ENDCHAR -STARTCHAR 8A25 -ENCODING 35365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EC -E4 -1F -F5 -F7 -19 -F1 -F1 -B3 -ENDCHAR -STARTCHAR 8A2A -ENCODING 35370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0400 -FF80 -E800 -0700 -E900 -E900 -A900 -F100 -B300 -ENDCHAR -STARTCHAR 8A2D -ENCODING 35373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -FA80 -0B00 -E800 -EF00 -0900 -E600 -E700 -A900 -ENDCHAR -STARTCHAR 8A31 -ENCODING 35377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -0800 -EF00 -EA00 -1200 -FF80 -E200 -A200 -E200 -A200 -ENDCHAR -STARTCHAR 8A34 -ENCODING 35380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E300 -0C00 -E800 -EF80 -EA00 -0F00 -EA80 -F200 -B200 -ENDCHAR -STARTCHAR 8A36 -ENCODING 35382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -E100 -0D00 -F500 -F500 -0D00 -F500 -A100 -E300 -ENDCHAR -STARTCHAR 8A3A -ENCODING 35386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0E00 -EB00 -FC80 -1100 -E200 -EC80 -AB00 -E400 -B800 -ENDCHAR -STARTCHAR 8A3B -ENCODING 35387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0200 -EF00 -E400 -0400 -EF00 -E400 -A400 -E400 -BF80 -ENDCHAR -STARTCHAR 8A50 -ENCODING 35408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -0800 -EF80 -EC00 -1700 -E400 -E700 -A400 -E400 -A400 -ENDCHAR -STARTCHAR 8A54 -ENCODING 35412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EF -E5 -09 -F3 -E0 -0F -E9 -EF -A9 -ENDCHAR -STARTCHAR 8A55 -ENCODING 35413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -ED00 -0D00 -F480 -F400 -1F80 -E400 -E400 -A400 -ENDCHAR -STARTCHAR 8A5B -ENCODING 35419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -E900 -0900 -EF00 -E900 -0F00 -E900 -E900 -BF80 -ENDCHAR -STARTCHAR 8A5E -ENCODING 35422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -E1 -1F -ED -EB -0D -EB -A1 -E3 -ENDCHAR -STARTCHAR 8A60 -ENCODING 35424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E600 -0000 -EC00 -E500 -FA00 -0E00 -F500 -B480 -EC00 -ENDCHAR -STARTCHAR 8A62 -ENCODING 35426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -E8 -0F -F1 -FD -13 -ED -F3 -AD -E1 -A3 -ENDCHAR -STARTCHAR 8A63 -ENCODING 35427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -0B00 -EC80 -EF00 -0000 -EF00 -E900 -AF00 -EF00 -A900 -ENDCHAR -STARTCHAR 8A66 -ENCODING 35430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -0280 -FF80 -E200 -0200 -FE00 -EA00 -AA00 -FD80 -A100 -ENDCHAR -STARTCHAR 8A69 -ENCODING 35433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0F00 -E400 -1F80 -E100 -FF80 -E900 -A500 -E100 -A700 -ENDCHAR -STARTCHAR 8A6D -ENCODING 35437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -0E00 -F200 -FF80 -1700 -F500 -1500 -F700 -F480 -9700 -ENDCHAR -STARTCHAR 8A6E -ENCODING 35438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EC00 -E600 -0900 -FF00 -E480 -0F00 -E400 -E400 -BF80 -ENDCHAR -STARTCHAR 8A70 -ENCODING 35440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0400 -EF80 -E400 -0F00 -E000 -EF00 -A900 -EF00 -A900 -ENDCHAR -STARTCHAR 8A71 -ENCODING 35441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -1C00 -E400 -FF80 -0400 -E400 -EF00 -A900 -EF00 -A900 -ENDCHAR -STARTCHAR 8A72 -ENCODING 35442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -E400 -E900 -0A00 -E500 -EB00 -B600 -ED00 -B080 -ENDCHAR -STARTCHAR 8A73 -ENCODING 35443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -0500 -EF80 -E400 -0F00 -E400 -FF80 -A400 -E400 -A400 -ENDCHAR -STARTCHAR 8A75 -ENCODING 35445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0C00 -EF00 -F400 -0400 -FF80 -EA00 -AA00 -EA80 -B300 -ENDCHAR -STARTCHAR 8A79 -ENCODING 35449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7C00 -FF80 -D700 -7F00 -7F80 -7F00 -8000 -BF00 -BF00 -ENDCHAR -STARTCHAR 8A85 -ENCODING 35461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EC00 -0C00 -EF00 -F400 -1F80 -E600 -EE00 -BD00 -F480 -A400 -ENDCHAR -STARTCHAR 8A87 -ENCODING 35463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -EA00 -FF80 -0000 -FF80 -EF00 -B100 -E100 -A600 -ENDCHAR -STARTCHAR 8A8C -ENCODING 35468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0400 -FF80 -E400 -0F00 -E400 -FB00 -B880 -F980 -A600 -ENDCHAR -STARTCHAR 8A8D -ENCODING 35469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -ED00 -1500 -EB00 -F400 -0A00 -F900 -F980 -A600 -ENDCHAR -STARTCHAR 8A93 -ENCODING 35475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -4800 -FF80 -DA00 -7E00 -FF80 -7E00 -7E00 -7E00 -7E00 -ENDCHAR -STARTCHAR 8A95 -ENCODING 35477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D180 -1600 -F100 -DD80 -CD00 -1D00 -D780 -D800 -D780 -ENDCHAR -STARTCHAR 8A98 -ENCODING 35480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E300 -1C00 -FF00 -EF00 -F080 -1E00 -EB00 -E900 -B300 -ENDCHAR -STARTCHAR 8A9E -ENCODING 35486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -E400 -0F00 -FF80 -E000 -0F00 -E900 -A900 -EF00 -ENDCHAR -STARTCHAR 8AA0 -ENCODING 35488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -0300 -FF80 -D200 -1B00 -D700 -D700 -BA00 -D580 -AD00 -ENDCHAR -STARTCHAR 8AA1 -ENCODING 35489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C300 -0300 -FF80 -D600 -1680 -DF00 -D700 -B600 -E580 -A980 -ENDCHAR -STARTCHAR 8AA3 -ENCODING 35491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -E400 -0D00 -F500 -FF00 -1600 -E400 -A400 -FF80 -ENDCHAR -STARTCHAR 8AA4 -ENCODING 35492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E700 -F500 -1700 -F000 -FF00 -0500 -FF80 -AA00 -F180 -ENDCHAR -STARTCHAR 8AA5 -ENCODING 35493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0C00 -EF00 -F400 -1F80 -E400 -EF00 -B100 -EF00 -B100 -ENDCHAR -STARTCHAR 8AA6 -ENCODING 35494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -EA -1F -F5 -FF -15 -FF -F5 -B5 -ENDCHAR -STARTCHAR 8AA8 -ENCODING 35496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -0F80 -F000 -1F00 -ED00 -FF80 -1500 -FF00 -F100 -A600 -ENDCHAR -STARTCHAR 8AAA -ENCODING 35498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -F100 -1F80 -F100 -F100 -0F00 -EA00 -EA80 -B300 -ENDCHAR -STARTCHAR 8AB0 -ENCODING 35504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -0A00 -EF80 -FA00 -1F00 -EA00 -EF00 -AA00 -EF80 -A800 -ENDCHAR -STARTCHAR 8AB2 -ENCODING 35506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -F500 -1F00 -FF00 -E400 -1F80 -EF00 -F480 -A400 -ENDCHAR -STARTCHAR 8AB9 -ENCODING 35513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C600 -0600 -FB80 -C600 -1B00 -CA00 -FB80 -AA00 -EA00 -B200 -ENDCHAR -STARTCHAR 8ABC -ENCODING 35516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -F080 -EF00 -0900 -EF00 -E900 -AF00 -E900 -BF80 -ENDCHAR -STARTCHAR 8ABE -ENCODING 35518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -BD -BF -BD -81 -BD -BD -ENDCHAR -STARTCHAR 8ABF -ENCODING 35519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -F5 -17 -F7 -F5 -17 -F7 -BB -F1 -ENDCHAR -STARTCHAR 8AC2 -ENCODING 35522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -E8 -0F -E9 -F3 -04 -FB -F1 -BF -FF -B1 -ENDCHAR -STARTCHAR 8AC4 -ENCODING 35524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -EF00 -EF00 -0000 -FF00 -E200 -BF80 -E400 -AC00 -ENDCHAR -STARTCHAR 8AC7 -ENCODING 35527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0C80 -EF00 -ED00 -0C80 -E500 -ED00 -B600 -E900 -B080 -ENDCHAR -STARTCHAR 8ACB -ENCODING 35531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F00 -FF00 -FF80 -0000 -FF00 -F500 -BF00 -F100 -B300 -ENDCHAR -STARTCHAR 8ACD -ENCODING 35533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -0F00 -F480 -EF00 -0500 -FF80 -ED00 -A700 -E400 -AC00 -ENDCHAR -STARTCHAR 8ACF -ENCODING 35535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DE00 -F700 -1A80 -D700 -DB00 -1700 -D900 -D700 -C680 -ENDCHAR -STARTCHAR 8AD2 -ENCODING 35538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -E000 -EF00 -1100 -EF00 -ED00 -AD00 -F480 -A400 -ENDCHAR -STARTCHAR 8AD6 -ENCODING 35542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C600 -1900 -FE80 -C000 -1F00 -DB00 -DF00 -BB00 -DB00 -9B00 -ENDCHAR -STARTCHAR 8ADB -ENCODING 35547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EC00 -1700 -F500 -FF00 -F500 -1F00 -E600 -E900 -B080 -ENDCHAR -STARTCHAR 8ADC -ENCODING 35548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F500 -1F80 -F500 -F700 -0F00 -E400 -FF80 -A700 -EC80 -9400 -ENDCHAR -STARTCHAR 8AE1 -ENCODING 35553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E600 -0900 -FF80 -FF00 -E600 -0000 -FF00 -F700 -BF80 -ENDCHAR -STARTCHAR 8AE6 -ENCODING 35558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -E900 -FF80 -1480 -EF00 -0D00 -ED00 -ED00 -A400 -ENDCHAR -STARTCHAR 8AE7 -ENCODING 35559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -0F80 -F280 -EF80 -1400 -EF00 -F100 -AF00 -B100 -EF00 -ENDCHAR -STARTCHAR 8AEA -ENCODING 35562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -EF00 -EF00 -0000 -FF80 -1F80 -E400 -E400 -AC00 -ENDCHAR -STARTCHAR 8AEB -ENCODING 35563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -1F80 -E400 -DF00 -1F00 -DF00 -C600 -BD00 -D480 -A400 -ENDCHAR -STARTCHAR 8AED -ENCODING 35565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DC00 -0B00 -FE80 -DF00 -D700 -1D00 -DF00 -D700 -DD80 -ENDCHAR -STARTCHAR 8AEE -ENCODING 35566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1700 -ED00 -F700 -0D00 -F880 -EF00 -B100 -EF00 -B100 -ENDCHAR -STARTCHAR 8AF1 -ENCODING 35569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F00 -FF80 -E000 -1F00 -FF00 -FF00 -B400 -FF80 -A400 -ENDCHAR -STARTCHAR 8AF6 -ENCODING 35574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -1F80 -E900 -EF00 -0F00 -E900 -FF80 -B700 -FF80 -B000 -ENDCHAR -STARTCHAR 8AF7 -ENCODING 35575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -F300 -1D00 -DF00 -DF00 -1F00 -DF00 -D780 -A980 -ENDCHAR -STARTCHAR 8AF8 -ENCODING 35576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0F00 -E600 -FF80 -0500 -EF00 -F900 -AF00 -EF00 -A900 -ENDCHAR -STARTCHAR 8AFA -ENCODING 35578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -E600 -E900 -1F80 -F600 -F300 -B480 -F300 -BC00 -ENDCHAR -STARTCHAR 8AFE -ENCODING 35582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -1F80 -EE00 -E400 -1F80 -E800 -FF00 -B900 -EF00 -A900 -ENDCHAR -STARTCHAR 8B00 -ENCODING 35584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -1F80 -E900 -EF00 -0F00 -FF80 -E600 -AD00 -F480 -A400 -ENDCHAR -STARTCHAR 8B01 -ENCODING 35585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EF -EF -11 -EF -EF -15 -FB -EF -A3 -ENDCHAR -STARTCHAR 8B02 -ENCODING 35586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -1F -E0 -EF -0F -EF -E9 -AB -ENDCHAR -STARTCHAR 8B04 -ENCODING 35588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CD00 -B500 -BE00 -D980 -BF80 -E000 -A600 -A600 -BF00 -DF00 -ENDCHAR -STARTCHAR 8B0E -ENCODING 35598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D200 -1680 -E700 -D780 -0200 -D700 -D700 -BA80 -DA00 -A780 -ENDCHAR -STARTCHAR 8B10 -ENCODING 35600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C500 -0A00 -FD00 -D980 -1E00 -C000 -DF00 -B700 -D700 -BF80 -ENDCHAR -STARTCHAR 8B14 -ENCODING 35604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -0700 -FF80 -DE80 -1700 -D000 -DF00 -BF80 -D800 -8F00 -ENDCHAR -STARTCHAR 8B16 -ENCODING 35606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -1F00 -EA80 -F700 -0F00 -FA00 -E600 -B980 -ENDCHAR -STARTCHAR 8B17 -ENCODING 35607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F00 -E900 -FF80 -1480 -FF80 -E800 -AF00 -E900 -B300 -ENDCHAR -STARTCHAR 8B19 -ENCODING 35609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CD00 -1E00 -FF00 -DF00 -0B00 -DF80 -DF00 -AB00 -DA80 -AA00 -ENDCHAR -STARTCHAR 8B1A -ENCODING 35610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -F100 -1E80 -EE00 -F100 -1F80 -F700 -F700 -BF80 -ENDCHAR -STARTCHAR 8B1B -ENCODING 35611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -1F80 -FF00 -FF80 -0400 -EF00 -FF80 -BF80 -F100 -9300 -ENDCHAR -STARTCHAR 8B1D -ENCODING 35613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C900 -1900 -F500 -DB80 -1900 -D700 -3B00 -D500 -E500 -CB00 -ENDCHAR -STARTCHAR 8B20 -ENCODING 35616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -0F00 -F600 -0400 -F800 -EF00 -1F80 -E400 -EF00 -9100 -ENDCHAR -STARTCHAR 8B28 -ENCODING 35624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -1F80 -E000 -FF00 -1F00 -FF00 -E400 -BF80 -EE00 -B180 -ENDCHAR -STARTCHAR 8B2B -ENCODING 35627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -E900 -DF00 -1480 -DE80 -DE80 -BE80 -D880 -B100 -ENDCHAR -STARTCHAR 8B2C -ENCODING 35628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DB00 -E900 -1B00 -EE80 -D580 -1A00 -C500 -BE00 -D800 -ENDCHAR -STARTCHAR 8B33 -ENCODING 35635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -F700 -1500 -F700 -FD00 -1E80 -DD00 -B000 -DF80 -ENDCHAR -STARTCHAR 8B39 -ENCODING 35641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -1F80 -EE00 -E400 -1F00 -FF00 -FF00 -BF00 -E400 -BF80 -ENDCHAR -STARTCHAR 8B41 -ENCODING 35649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -1F80 -E000 -FF00 -1F80 -ED00 -FF00 -BF80 -E400 -A400 -ENDCHAR -STARTCHAR 8B49 -ENCODING 35657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -ED00 -F680 -0900 -FE80 -EF00 -0F00 -E800 -EA00 -BF80 -ENDCHAR -STARTCHAR 8B4E -ENCODING 35662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -CF00 -E600 -1F80 -F700 -FF00 -1B00 -FF00 -FF00 -B300 -ENDCHAR -STARTCHAR 8B4F -ENCODING 35663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 0 -BITMAP -D600 -1F00 -F500 -DF80 -1D00 -DF80 -D300 -DA00 -D680 -AD00 -ENDCHAR -STARTCHAR 8B58 -ENCODING 35672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CA00 -1F00 -F600 -FF80 -0200 -DF00 -DF00 -DD80 -D380 -8500 -ENDCHAR -STARTCHAR 8B5A -ENCODING 35674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -FF00 -1F00 -EF00 -F100 -0F00 -EF00 -FF80 -A400 -ENDCHAR -STARTCHAR 8B5C -ENCODING 35676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -1F80 -FB00 -FB00 -1F80 -FF00 -F100 -BF00 -FF00 -B100 -ENDCHAR -STARTCHAR 8B66 -ENCODING 35686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5400 -FF80 -7D00 -BE00 -4180 -FF80 -7E00 -7E00 -7E00 -7E00 -ENDCHAR -STARTCHAR 8B6C -ENCODING 35692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -FF00 -8F80 -FF00 -0000 -FF80 -7E00 -7E00 -7E00 -7E00 -ENDCHAR -STARTCHAR 8B6F -ENCODING 35695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -F680 -1F00 -EF00 -FF80 -1980 -FF00 -E400 -A400 -ENDCHAR -STARTCHAR 8B70 -ENCODING 35696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -1F80 -FF00 -FF80 -0400 -EB00 -1F80 -FF00 -EA80 -BD80 -ENDCHAR -STARTCHAR 8B74 -ENCODING 35700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C200 -1700 -C700 -DF80 -0700 -F700 -D700 -D700 -D800 -A780 -ENDCHAR -STARTCHAR 8B77 -ENCODING 35703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -1F80 -EF00 -F200 -1F00 -FF80 -E000 -BF00 -E600 -B980 -ENDCHAR -STARTCHAR 8B7D -ENCODING 35709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7300 -7B00 -5900 -7B00 -FF80 -7F00 -FE80 -7E00 -7E00 -7E00 -ENDCHAR -STARTCHAR 8B80 -ENCODING 35712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF80 -FF00 -DB00 -1F00 -DF00 -DF00 -BF00 -DF00 -B980 -ENDCHAR -STARTCHAR 8B8A -ENCODING 35722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -DF00 -5A00 -FB80 -DA80 -FD80 -6000 -BF00 -1C00 -E780 -ENDCHAR -STARTCHAR 8B90 -ENCODING 35728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A600 -EA00 -EE00 -E600 -7F00 -FF80 -7E00 -7E00 -7E00 -7E00 -ENDCHAR -STARTCHAR 8B92 -ENCODING 35730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C800 -1600 -F900 -DE00 -0B00 -D800 -1600 -DF00 -CD80 -BB00 -ENDCHAR -STARTCHAR 8B93 -ENCODING 35731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -FF80 -FF00 -1F80 -FF00 -0A00 -FF80 -FF00 -B980 -ENDCHAR -STARTCHAR 8B96 -ENCODING 35734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D600 -1700 -EA00 -DF80 -1600 -DA80 -D900 -DD00 -FB80 -C500 -ENDCHAR -STARTCHAR 8B9A -ENCODING 35738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -DA00 -1B00 -FB80 -DF00 -1D80 -DF00 -D100 -BF00 -C000 -BB80 -ENDCHAR -STARTCHAR 8C37 -ENCODING 35895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -24 -42 -99 -24 -42 -FF -42 -7E -42 -ENDCHAR -STARTCHAR 8C3F -ENCODING 35903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F600 -D900 -4A80 -A600 -5500 -FF80 -6900 -E700 -9900 -ENDCHAR -STARTCHAR 8C41 -ENCODING 35905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -F500 -DA80 -FE00 -F500 -F900 -4F80 -F900 -F700 -9900 -ENDCHAR -STARTCHAR 8C46 -ENCODING 35910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0000 -7E00 -4200 -7E00 -0000 -2400 -2400 -FF80 -ENDCHAR -STARTCHAR 8C48 -ENCODING 35912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -8900 -7F00 -FF00 -0000 -7E00 -4200 -7E00 -2400 -FF80 -ENDCHAR -STARTCHAR 8C4A -ENCODING 35914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -FF00 -FF00 -FF00 -0000 -FF80 -7E00 -7E00 -2400 -FF80 -ENDCHAR -STARTCHAR 8C4C -ENCODING 35916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -F080 -AF00 -F700 -1700 -AB00 -EB00 -CA80 -1300 -ENDCHAR -STARTCHAR 8C55 -ENCODING 35925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -18 -75 -96 -6C -DA -69 -89 -18 -ENDCHAR -STARTCHAR 8C5A -ENCODING 35930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -AA00 -FB00 -AE00 -BE00 -F500 -AD00 -B480 -EC00 -ENDCHAR -STARTCHAR 8C61 -ENCODING 35937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -3C00 -FF00 -8900 -7F00 -3500 -DE00 -EA00 -7B00 -D880 -ENDCHAR -STARTCHAR 8C6A -ENCODING 35946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7E00 -7E00 -FF00 -FF00 -3500 -FE00 -FA00 -9900 -ENDCHAR -STARTCHAR 8C6B -ENCODING 35947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -2E00 -DF00 -5500 -FB00 -6F00 -5F00 -5D00 -7480 -8C00 -ENDCHAR -STARTCHAR 8C79 -ENCODING 35961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -34 -C8 -BF -A9 -71 -EF -B1 -51 -91 -67 -ENDCHAR -STARTCHAR 8C7A -ENCODING 35962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3100 -C100 -BF80 -6200 -6200 -E500 -D900 -7900 -9100 -6600 -ENDCHAR -STARTCHAR 8C82 -ENCODING 35970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -2F -C5 -B5 -69 -F3 -6F -B9 -59 -9F -69 -ENDCHAR -STARTCHAR 8C8A -ENCODING 35978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -CF80 -C400 -6F00 -4900 -E900 -AF00 -5900 -AF00 -6900 -ENDCHAR -STARTCHAR 8C8C -ENCODING 35980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -CF00 -B900 -6F00 -E900 -6F00 -A600 -5600 -AA80 -7380 -ENDCHAR -STARTCHAR 8C9D -ENCODING 35997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -42 -7E -42 -7E -42 -7E -66 -81 -ENDCHAR -STARTCHAR 8C9E -ENCODING 35998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -0F -08 -7E -7E -42 -7E -7E -26 -C1 -ENDCHAR -STARTCHAR 8CA0 -ENCODING 36000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -3C -C8 -FE -7E -41 -7E -7E -26 -C1 -ENDCHAR -STARTCHAR 8CA1 -ENCODING 36001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E100 -9100 -E100 -9F80 -E200 -9500 -E900 -0900 -A100 -9600 -ENDCHAR -STARTCHAR 8CA2 -ENCODING 36002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -0000 -7E00 -7E00 -7E00 -7E00 -2600 -C180 -ENDCHAR -STARTCHAR 8CA7 -ENCODING 36007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -FF -B2 -FE -42 -7E -7E -00 -C3 -ENDCHAR -STARTCHAR 8CA8 -ENCODING 36008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2B00 -4C80 -CF00 -4000 -7E00 -7E00 -4100 -7E00 -2600 -C180 -ENDCHAR -STARTCHAR 8CA9 -ENCODING 36009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF80 -A800 -E800 -AF00 -F500 -F300 -1200 -B500 -9880 -ENDCHAR -STARTCHAR 8CAA -ENCODING 36010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -7E00 -8180 -7E00 -7E00 -4100 -7E00 -7E00 -2000 -C300 -ENDCHAR -STARTCHAR 8CAB -ENCODING 36011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -FF80 -7E00 -7E00 -4100 -7E00 -7E00 -2600 -C100 -ENDCHAR -STARTCHAR 8CAC -ENCODING 36012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E00 -FF80 -7E00 -7E00 -4200 -7E00 -6600 -8180 -ENDCHAR -STARTCHAR 8CAF -ENCODING 36015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AF00 -F080 -B080 -FF80 -A200 -E200 -A200 -A200 -9C00 -ENDCHAR -STARTCHAR 8CB0 -ENCODING 36016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -FF80 -5C00 -7F00 -7E00 -4100 -7E00 -7E00 -2600 -C180 -ENDCHAR -STARTCHAR 8CB3 -ENCODING 36019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0500 -FF80 -0400 -F400 -FC00 -F400 -8A00 -F200 -5280 -8900 -ENDCHAR -STARTCHAR 8CB4 -ENCODING 36020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7E00 -7E00 -FF80 -7E00 -7E00 -4100 -7E00 -6600 -8100 -ENDCHAR -STARTCHAR 8CB6 -ENCODING 36022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E300 -BC00 -E400 -BF00 -E100 -A200 -F400 -9800 -B780 -ENDCHAR -STARTCHAR 8CB7 -ENCODING 36023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -00 -7F -7F -7F -7F -26 -C1 -ENDCHAR -STARTCHAR 8CB8 -ENCODING 36024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -4F80 -FC80 -4700 -7E00 -7E00 -4200 -7E00 -0000 -C300 -ENDCHAR -STARTCHAR 8CBB -ENCODING 36027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -FF -FF -FF -FF -42 -7E -7E -26 -C1 -ENDCHAR -STARTCHAR 8CBC -ENCODING 36028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A400 -E780 -A400 -A400 -EF00 -F100 -1100 -AF00 -B100 -ENDCHAR -STARTCHAR 8CBD -ENCODING 36029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A800 -E900 -BF00 -E080 -AF00 -E900 -A900 -AF00 -9100 -ENDCHAR -STARTCHAR 8CBF -ENCODING 36031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -1F -65 -B7 -D8 -7E -7E -7E -41 -7E -C3 -ENDCHAR -STARTCHAR 8CC0 -ENCODING 36032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -F700 -5500 -B700 -7F00 -7F00 -4100 -7F00 -6600 -8180 -ENDCHAR -STARTCHAR 8CC1 -ENCODING 36033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -22 -FF -7E -7E -41 -7E -26 -C1 -ENDCHAR -STARTCHAR 8CC2 -ENCODING 36034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AF00 -F900 -B600 -EF00 -B880 -EF00 -2900 -AF00 -9900 -ENDCHAR -STARTCHAR 8CC3 -ENCODING 36035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -DC00 -FF00 -5F00 -7E00 -4100 -7E00 -7E00 -2600 -C180 -ENDCHAR -STARTCHAR 8CC4 -ENCODING 36036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -A800 -EF00 -B900 -FF00 -A900 -EF00 -A900 -AB00 -ENDCHAR -STARTCHAR 8CC7 -ENCODING 36039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -DF -5D -B3 -7E -7E -41 -7E -7E -C3 -ENDCHAR -STARTCHAR 8CC8 -ENCODING 36040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -FF -00 -7E -7E -7E -7E -E3 -ENDCHAR -STARTCHAR 8CCA -ENCODING 36042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -A280 -FF80 -AA00 -EB00 -BF00 -EA00 -2A00 -B680 -A900 -ENDCHAR -STARTCHAR 8CD1 -ENCODING 36049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF00 -B000 -DF00 -B000 -DF80 -DA00 -1A00 -D700 -A880 -ENDCHAR -STARTCHAR 8CD3 -ENCODING 36051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -D8 -FE -7E -42 -7E -26 -C1 -ENDCHAR -STARTCHAR 8CDA -ENCODING 36058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -5A00 -AD00 -FF80 -4200 -7E00 -7E00 -2600 -C100 -ENDCHAR -STARTCHAR 8CDC -ENCODING 36060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EF -B1 -EF -AF -E8 -FF -1B -D5 -AB -ENDCHAR -STARTCHAR 8CDE -ENCODING 36062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4A -FF -BF -3E -00 -7E -42 -7E -7E -E3 -ENDCHAR -STARTCHAR 8CE0 -ENCODING 36064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -E900 -AA00 -BF80 -E000 -EF00 -2900 -AF00 -A900 -ENDCHAR -STARTCHAR 8CE2 -ENCODING 36066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -9500 -F700 -0880 -7E00 -4100 -7F00 -7E00 -E300 -ENDCHAR -STARTCHAR 8CE3 -ENCODING 36067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -00 -FF -00 -7E -42 -7E -7E -C3 -ENDCHAR -STARTCHAR 8CE4 -ENCODING 36068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -A700 -FD00 -A680 -B900 -EA00 -FF80 -0500 -C680 -BF00 -ENDCHAR -STARTCHAR 8CE6 -ENCODING 36070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -BE80 -FF80 -AA00 -BA00 -F600 -FA00 -1A00 -D580 -B900 -ENDCHAR -STARTCHAR 8CEA -ENCODING 36074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -FF -AA -88 -7E -42 -7E -7E -E3 -ENDCHAR -STARTCHAR 8CED -ENCODING 36077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AF00 -E500 -BF80 -E500 -AF00 -F900 -0F00 -AF00 -A900 -ENDCHAR -STARTCHAR 8CF4 -ENCODING 36084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -F480 -4B00 -FF00 -D900 -FF00 -6F00 -BF00 -D500 -4880 -ENDCHAR -STARTCHAR 8CFB -ENCODING 36091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E500 -BF80 -BF00 -F500 -BF00 -F500 -E100 -1F80 -A900 -A200 -ENDCHAR -STARTCHAR 8CFC -ENCODING 36092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -BF80 -FF00 -AA00 -FF80 -BF00 -FF80 -D580 -BF00 -B300 -ENDCHAR -STARTCHAR 8CFD -ENCODING 36093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -24 -3C -FF -C3 -7E -7E -7E -E3 -ENDCHAR -STARTCHAR 8D04 -ENCODING 36100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6F00 -6500 -4580 -6900 -7E00 -7E00 -7E00 -7E00 -E300 -ENDCHAR -STARTCHAR 8D05 -ENCODING 36101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -F780 -FD00 -7200 -BD80 -7F00 -7F00 -7F00 -7F00 -E380 -ENDCHAR -STARTCHAR 8D07 -ENCODING 36103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -FF00 -4A00 -6E80 -9900 -7E00 -4200 -7E00 -7E00 -C300 -ENDCHAR -STARTCHAR 8D08 -ENCODING 36104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E600 -B100 -FF80 -BF00 -FF00 -EF00 -1100 -AF00 -AF00 -ENDCHAR -STARTCHAR 8D0A -ENCODING 36106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AA00 -FF00 -FF80 -7680 -AB80 -7E00 -4100 -7E00 -0000 -E380 -ENDCHAR -STARTCHAR 8D0D -ENCODING 36109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EE00 -BF80 -F600 -B900 -FF80 -B000 -FF00 -BF00 -9F00 -ENDCHAR -STARTCHAR 8D13 -ENCODING 36115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0100 -C280 -FF80 -FE00 -FE80 -FA80 -FD00 -3D00 -FF80 -D500 -ENDCHAR -STARTCHAR 8D16 -ENCODING 36118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -E000 -BF80 -BF00 -FF00 -FF00 -1F00 -BF00 -9980 -ENDCHAR -STARTCHAR 8D64 -ENCODING 36196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F00 -0800 -0800 -FF00 -5600 -5500 -A500 -A480 -4C00 -ENDCHAR -STARTCHAR 8D66 -ENCODING 36198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -F400 -2780 -2500 -FD00 -ED00 -EA00 -EA00 -6500 -A880 -ENDCHAR -STARTCHAR 8D6B -ENCODING 36203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -F700 -4200 -FF80 -6500 -FD00 -FD00 -AD80 -A500 -EA00 -ENDCHAR -STARTCHAR 8D70 -ENCODING 36208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -0800 -7E00 -0800 -FF00 -2800 -4E00 -4800 -6800 -9F80 -ENDCHAR -STARTCHAR 8D73 -ENCODING 36211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -F500 -2500 -2500 -F500 -2780 -BF00 -A100 -C100 -BF80 -ENDCHAR -STARTCHAR 8D74 -ENCODING 36212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -2400 -F400 -2600 -FF00 -2500 -B400 -A400 -E400 -BF80 -ENDCHAR -STARTCHAR 8D77 -ENCODING 36215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -FF00 -2100 -2700 -F800 -A800 -B880 -A700 -E000 -1F80 -ENDCHAR -STARTCHAR 8D85 -ENCODING 36229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1000 -1780 -7A80 -1280 -7D80 -1780 -5C80 -5780 -6000 -9FC0 -ENDCHAR -STARTCHAR 8D8A -ENCODING 36234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -4300 -FF80 -4A00 -FB00 -4F00 -BA00 -C580 -C000 -BF80 -ENDCHAR -STARTCHAR 8D99 -ENCODING 36249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B00 -4B00 -F280 -4F00 -FF00 -4900 -BF00 -CB00 -C000 -BF80 -ENDCHAR -STARTCHAR 8DA3 -ENCODING 36259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2E00 -7B80 -2B40 -2F80 -7B80 -2E80 -7A80 -6F40 -6200 -9FC0 -ENDCHAR -STARTCHAR 8DA8 -ENCODING 36264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -EF00 -5E80 -4F00 -F900 -4F00 -BE80 -CF00 -C900 -BF80 -ENDCHAR -STARTCHAR 8DB3 -ENCODING 36275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -4200 -7E00 -4800 -4F00 -4800 -B800 -9F80 -ENDCHAR -STARTCHAR 8DBA -ENCODING 36282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A400 -AF00 -E400 -5F80 -C400 -E600 -CA00 -F900 -D080 -ENDCHAR -STARTCHAR 8DBE -ENCODING 36286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -A200 -A200 -EA00 -4B80 -CA00 -AA00 -CA00 -AA00 -DF80 -ENDCHAR -STARTCHAR 8DC6 -ENCODING 36294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A400 -A900 -EF00 -4080 -B000 -CF00 -B900 -EF00 -8900 -ENDCHAR -STARTCHAR 8DCB -ENCODING 36299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E600 -A500 -AF80 -E500 -4D00 -AE00 -CA00 -D200 -A500 -C880 -ENDCHAR -STARTCHAR 8DCC -ENCODING 36300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AC00 -AF00 -F400 -4400 -FF80 -C400 -E600 -C900 -9080 -ENDCHAR -STARTCHAR 8DCF -ENCODING 36303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F0 -B3 -BF -F7 -57 -F7 -D7 -D7 -E7 -3B -ENDCHAR -STARTCHAR 8DDB -ENCODING 36315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -B500 -F400 -5F00 -F900 -D600 -F600 -9D00 -2880 -ENDCHAR -STARTCHAR 8DDD -ENCODING 36317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -A800 -A800 -EF00 -C900 -EF00 -C800 -E800 -DF80 -ENDCHAR -STARTCHAR 8DE1 -ENCODING 36321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A400 -BF80 -E600 -5700 -F680 -D680 -DA80 -EA00 -9600 -ENDCHAR -STARTCHAR 8DE3 -ENCODING 36323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AC00 -AF00 -F400 -4400 -FF80 -CA00 -CA00 -EA80 -9300 -ENDCHAR -STARTCHAR 8DE8 -ENCODING 36328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -AA00 -EF00 -5080 -DF80 -E800 -CF00 -E100 -C700 -ENDCHAR -STARTCHAR 8DEF -ENCODING 36335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AF00 -A900 -F600 -4700 -B980 -CF00 -C900 -EF00 -8900 -ENDCHAR -STARTCHAR 8DF3 -ENCODING 36339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -AA80 -BB00 -EB00 -4A00 -EB00 -DA80 -CA00 -F280 -9380 -ENDCHAR -STARTCHAR 8E0A -ENCODING 36362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -AA -BF -F5 -DF -F5 -DF -F5 -D5 -ENDCHAR -STARTCHAR 8E0F -ENCODING 36367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -BB00 -AA00 -EB00 -5480 -EF00 -D100 -CF00 -EF00 -9100 -ENDCHAR -STARTCHAR 8E10 -ENCODING 36368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -A700 -BD00 -E680 -5900 -CA00 -FF80 -C500 -E680 -D900 -ENDCHAR -STARTCHAR 8E1E -ENCODING 36382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -B080 -AF00 -F200 -DF80 -FF00 -D880 -FF00 -A880 -ENDCHAR -STARTCHAR 8E2A -ENCODING 36394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -B080 -EF00 -4000 -DF80 -ED00 -CD00 -F480 -CC00 -ENDCHAR -STARTCHAR 8E30 -ENCODING 36400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DC00 -AB00 -BE80 -DE80 -D700 -FD00 -DF00 -F700 -9980 -ENDCHAR -STARTCHAR 8E35 -ENCODING 36405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -BC00 -BF80 -EF00 -5500 -CF00 -EF00 -DF00 -E400 -DF80 -ENDCHAR -STARTCHAR 8E42 -ENCODING 36418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -A600 -BF80 -FB00 -C400 -FF80 -C600 -ED00 -D480 -ENDCHAR -STARTCHAR 8E44 -ENCODING 36420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -AA00 -FF80 -5480 -EF00 -D500 -F500 -D500 -8400 -ENDCHAR -STARTCHAR 8E47 -ENCODING 36423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -7E00 -FF00 -7E00 -C380 -3E00 -6800 -9F80 -ENDCHAR -STARTCHAR 8E48 -ENCODING 36424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E100 -AF00 -B480 -F000 -DF00 -F100 -DF00 -FF00 -9100 -ENDCHAR -STARTCHAR 8E49 -ENCODING 36425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -BF80 -A400 -EF00 -4400 -FF80 -CF00 -CA00 -F200 -EF80 -ENDCHAR -STARTCHAR 8E4A -ENCODING 36426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E100 -AF00 -B480 -EA00 -C500 -FF00 -DF80 -EE00 -9180 -ENDCHAR -STARTCHAR 8E59 -ENCODING 36441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0500 -FF00 -9D00 -FA00 -DA80 -A500 -7E00 -0800 -6E00 -BF80 -ENDCHAR -STARTCHAR 8E5F -ENCODING 36447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -AF00 -FF80 -4F00 -EF00 -D100 -EF00 -CA00 -9180 -ENDCHAR -STARTCHAR 8E60 -ENCODING 36448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -B500 -FF00 -5500 -F500 -DF80 -DF00 -FE80 -9D80 -ENDCHAR -STARTCHAR 8E74 -ENCODING 36468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CB00 -BE80 -A200 -DF80 -5700 -FF00 -D700 -D700 -EB80 -9580 -ENDCHAR -STARTCHAR 8E76 -ENCODING 36470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF80 -EE00 -E580 -DE80 -EF00 -ED00 -E900 -AB00 -3280 -ENDCHAR -STARTCHAR 8E81 -ENCODING 36481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -AF00 -A000 -FF80 -DF80 -FF80 -C600 -ED00 -9480 -ENDCHAR -STARTCHAR 8E87 -ENCODING 36487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -BF80 -A400 -EF00 -5F80 -E500 -CF00 -D900 -EF00 -CF00 -ENDCHAR -STARTCHAR 8E8A -ENCODING 36490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -BF00 -A000 -DF80 -5F00 -E000 -DF80 -DF80 -FB00 -9B00 -ENDCHAR -STARTCHAR 8E8D -ENCODING 36493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -BD00 -BE80 -EA00 -CF80 -FF00 -D300 -EC00 -CF80 -ENDCHAR -STARTCHAR 8EAA -ENCODING 36522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CA00 -BF80 -BB00 -DB00 -5B00 -E880 -DC80 -DE80 -EE80 -9100 -ENDCHAR -STARTCHAR 8EAB -ENCODING 36523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4200 -7E00 -7E80 -4300 -FE00 -0A00 -7200 -8600 -ENDCHAR -STARTCHAR 8EAC -ENCODING 36524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -FF -91 -F7 -F8 -98 -FF -59 -91 -33 -ENDCHAR -STARTCHAR 8EC0 -ENCODING 36544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -F000 -B700 -F700 -F000 -BD00 -FE80 -7D00 -B000 -7F80 -ENDCHAR -STARTCHAR 8ECA -ENCODING 36554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0800 -7E00 -7E00 -4A00 -7E00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 8ECB -ENCODING 36555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FC00 -2400 -F400 -F400 -B400 -F400 -FC80 -2480 -2700 -ENDCHAR -STARTCHAR 8ECC -ENCODING 36556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F400 -4400 -FE00 -F500 -D500 -F500 -F900 -4980 -5180 -ENDCHAR -STARTCHAR 8ECD -ENCODING 36557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -89 -7E -7E -7E -4A -7E -FF -08 -ENDCHAR -STARTCHAR 8ED2 -ENCODING 36562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -F200 -4200 -F200 -FF80 -D200 -F200 -F200 -4200 -4200 -ENDCHAR -STARTCHAR 8EDF -ENCODING 36575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F400 -4780 -FA80 -FB00 -D300 -F600 -F500 -4900 -4880 -ENDCHAR -STARTCHAR 8EEB -ENCODING 36587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -E600 -4900 -F280 -ED00 -EA00 -E480 -EB00 -4400 -5800 -ENDCHAR -STARTCHAR 8EF8 -ENCODING 36600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -42 -F2 -4F -FB -FB -DF -FB -FB -4F -49 -ENDCHAR -STARTCHAR 8EFB -ENCODING 36603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -F100 -EF00 -DB00 -EB00 -DB00 -EF00 -F100 -4100 -4300 -ENDCHAR -STARTCHAR 8EFE -ENCODING 36606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -E280 -5F80 -E200 -E200 -DE00 -EA00 -FA00 -4D80 -5900 -ENDCHAR -STARTCHAR 8F03 -ENCODING 36611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -4600 -E900 -E880 -D900 -E600 -F600 -4900 -5080 -ENDCHAR -STARTCHAR 8F05 -ENCODING 36613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F700 -4900 -F600 -E700 -E880 -EF00 -F900 -4F00 -4900 -ENDCHAR -STARTCHAR 8F09 -ENCODING 36617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2600 -FD00 -FF80 -2400 -FD00 -FD00 -AA00 -FA00 -FE80 -2900 -ENDCHAR -STARTCHAR 8F12 -ENCODING 36626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -EE00 -4E00 -EE00 -EE00 -EE00 -EE00 -EE00 -5680 -4580 -ENDCHAR -STARTCHAR 8F13 -ENCODING 36627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FE00 -4A00 -FF00 -ED00 -EF00 -E600 -F600 -4A80 -5300 -ENDCHAR -STARTCHAR 8F14 -ENCODING 36628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -EF80 -4200 -EF00 -EA80 -EF00 -EA80 -FF00 -4A80 -4B00 -ENDCHAR -STARTCHAR 8F15 -ENCODING 36629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -EB00 -4D00 -F600 -EB00 -EA80 -EF00 -F200 -4200 -5F80 -ENDCHAR -STARTCHAR 8F1B -ENCODING 36635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -E400 -FF00 -F480 -FE80 -F500 -FF00 -FF00 -5480 -5500 -ENDCHAR -STARTCHAR 8F1C -ENCODING 36636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A80 -FD00 -4D00 -EA80 -E000 -DF00 -EA80 -FF00 -4F00 -4880 -ENDCHAR -STARTCHAR 8F1D -ENCODING 36637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -D480 -EF00 -EF00 -F500 -AF00 -AF00 -BF80 -C400 -8400 -ENDCHAR -STARTCHAR 8F1E -ENCODING 36638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -F7 -57 -EF -F3 -EF -F5 -F7 -51 -53 -ENDCHAR -STARTCHAR 8F1F -ENCODING 36639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -E700 -4900 -F680 -E400 -FF00 -F700 -EB00 -5700 -5480 -ENDCHAR -STARTCHAR 8F26 -ENCODING 36646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -F700 -FF80 -BD00 -FF00 -7E00 -7E00 -7E00 -FF80 -0800 -ENDCHAR -STARTCHAR 8F27 -ENCODING 36647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -F500 -4F80 -E500 -E500 -DF80 -E500 -F900 -4900 -5100 -ENDCHAR -STARTCHAR 8F29 -ENCODING 36649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -F700 -F780 -A800 -FF00 -7F00 -7F00 -7F00 -FF80 -0800 -ENDCHAR -STARTCHAR 8F2A -ENCODING 36650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -E600 -4900 -FE80 -EF00 -F680 -F680 -EF00 -5680 -5700 -ENDCHAR -STARTCHAR 8F2F -ENCODING 36655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -E900 -4F00 -FF80 -E900 -EF00 -EF00 -E980 -5F00 -4100 -ENDCHAR -STARTCHAR 8F33 -ENCODING 36659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF00 -EF00 -E600 -FF80 -E900 -F680 -EF00 -4A00 -5100 -ENDCHAR -STARTCHAR 8F38 -ENCODING 36664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -E600 -4F00 -F080 -FE80 -F700 -FF00 -FF00 -5680 -5D80 -ENDCHAR -STARTCHAR 8F39 -ENCODING 36665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -FF80 -EF00 -D900 -EF00 -DF00 -E700 -FD00 -4600 -5980 -ENDCHAR -STARTCHAR 8F3B -ENCODING 36667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -F000 -4F00 -EF00 -E000 -DF00 -EA80 -FF00 -4F00 -4880 -ENDCHAR -STARTCHAR 8F3E -ENCODING 36670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -F880 -4F00 -ED00 -EF00 -DD00 -EF80 -FE00 -5700 -5C80 -ENDCHAR -STARTCHAR 8F3F -ENCODING 36671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CB00 -BD00 -BD00 -EF00 -FF00 -BD00 -FF80 -0000 -6600 -8100 -ENDCHAR -STARTCHAR 8F44 -ENCODING 36676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -EF80 -4A80 -EF00 -EF00 -EF80 -E000 -EF00 -4F00 -4900 -ENDCHAR -STARTCHAR 8F45 -ENCODING 36677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -4F80 -E000 -EF00 -EF00 -E680 -FB00 -4700 -4880 -ENDCHAR -STARTCHAR 8F49 -ENCODING 36681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -EF00 -4F00 -EF00 -EF00 -E500 -EE80 -EF80 -4900 -4200 -ENDCHAR -STARTCHAR 8F4D -ENCODING 36685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -FE00 -5780 -FF00 -F700 -FF00 -FD00 -FD00 -5700 -5E80 -ENDCHAR -STARTCHAR 8F4E -ENCODING 36686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -EE00 -5F80 -E900 -FE80 -E000 -FF00 -F700 -5700 -5100 -ENDCHAR -STARTCHAR 8F5D -ENCODING 36701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F300 -FB00 -FB00 -9900 -FF80 -7F00 -CA80 -7E00 -FF00 -0800 -ENDCHAR -STARTCHAR 8F5F -ENCODING 36703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7E00 -7E00 -7E00 -FF00 -FF80 -F700 -DA80 -6700 -6700 -ENDCHAR -STARTCHAR 8F62 -ENCODING 36706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -F700 -6A80 -F700 -FB00 -BF80 -FF80 -EF00 -5480 -4400 -ENDCHAR -STARTCHAR 8F9B -ENCODING 36763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2200 -2400 -FF80 -0800 -FF00 -0800 -0800 -0800 -ENDCHAR -STARTCHAR 8F9C -ENCODING 36764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E00 -4100 -7E00 -FF00 -E780 -FF00 -0800 -0800 -ENDCHAR -STARTCHAR 8FA3 -ENCODING 36771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -EF80 -A200 -AF00 -FA80 -4F00 -F600 -4B00 -5280 -8200 -ENDCHAR -STARTCHAR 8FA6 -ENCODING 36774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5100 -F380 -BA80 -D700 -F780 -5900 -F900 -9B80 -A900 -B900 -ENDCHAR -STARTCHAR 8FA8 -ENCODING 36776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -EF80 -9B00 -DB00 -FF80 -5A00 -FF80 -4A00 -8A00 -9200 -ENDCHAR -STARTCHAR 8FAD -ENCODING 36781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1200 -F780 -F500 -6500 -FF80 -CA00 -FF00 -EA00 -CA00 -9200 -ENDCHAR -STARTCHAR 8FAF -ENCODING 36783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5900 -E780 -DB00 -DB00 -E780 -5A00 -FB80 -9A00 -9A00 -9A00 -ENDCHAR -STARTCHAR 8FB0 -ENCODING 36784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -40 -7F -40 -7F -6E -A6 -AB -F1 -ENDCHAR -STARTCHAR 8FB1 -ENCODING 36785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -BE00 -8000 -FF80 -BE00 -E300 -FF80 -2200 -0600 -ENDCHAR -STARTCHAR 8FB2 -ENCODING 36786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -14 -7F -7F -7F -FF -80 -BE -FF -BE -E3 -ENDCHAR -STARTCHAR 8FC2 -ENCODING 36802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -4400 -8400 -7F80 -0400 -C400 -4400 -4C00 -BF80 -ENDCHAR -STARTCHAR 8FC5 -ENCODING 36805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BE00 -4200 -8A00 -7E00 -0A00 -D200 -5280 -5100 -BF80 -ENDCHAR -STARTCHAR 8FCE -ENCODING 36814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8F00 -5500 -9500 -5500 -1500 -DD00 -7500 -4400 -BF80 -ENDCHAR -STARTCHAR 8FD1 -ENCODING 36817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -5E00 -9000 -5F00 -1200 -D200 -6200 -4200 -BF80 -ENDCHAR -STARTCHAR 8FD4 -ENCODING 36820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -5E00 -9000 -5F00 -1900 -D600 -5600 -7900 -BF80 -ENDCHAR -STARTCHAR 8FE6 -ENCODING 36838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -5300 -3B00 -DB00 -1B00 -DB00 -6B00 -7B00 -C000 -BF80 -ENDCHAR -STARTCHAR 8FEA -ENCODING 36842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8400 -4400 -9F00 -6500 -1F00 -E500 -5F00 -6100 -BF80 -ENDCHAR -STARTCHAR 8FEB -ENCODING 36843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -9100 -5100 -1F00 -D100 -5100 -5F00 -C000 -BF80 -ENDCHAR -STARTCHAR 8FED -ENCODING 36845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5400 -1F00 -A400 -3F80 -CC00 -4A00 -5100 -E000 -BF80 -ENDCHAR -STARTCHAR 8FF0 -ENCODING 36848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -4900 -BF00 -5A00 -1A00 -DA00 -5A80 -6B00 -C000 -BF80 -ENDCHAR -STARTCHAR 8FF2 -ENCODING 36850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -9F00 -4400 -3F80 -C800 -5100 -7F00 -E080 -BF80 -ENDCHAR -STARTCHAR 8FF7 -ENCODING 36855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9500 -5500 -9600 -7F00 -0C00 -CE00 -5700 -6500 -C400 -BF80 -ENDCHAR -STARTCHAR 8FF9 -ENCODING 36857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -3F80 -9B00 -1B00 -EB00 -6A80 -5200 -D600 -BF80 -ENDCHAR -STARTCHAR 8FFD -ENCODING 36861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -1100 -DF00 -1000 -DF00 -5100 -5F00 -C000 -BF80 -ENDCHAR -STARTCHAR 9000 -ENCODING 36864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5100 -9F00 -5F00 -1500 -D600 -5F00 -7100 -BF80 -ENDCHAR -STARTCHAR 9001 -ENCODING 36865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9600 -5300 -BE80 -4400 -3F00 -CC00 -5A00 -6100 -BF80 -ENDCHAR -STARTCHAR 9002 -ENCODING 36866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8300 -5C00 -BF80 -4400 -1F00 -D100 -5F00 -5100 -BF80 -ENDCHAR -STARTCHAR 9003 -ENCODING 36867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8C00 -6D00 -1D00 -CC00 -1A00 -ED00 -4D00 -5300 -E000 -BF80 -ENDCHAR -STARTCHAR 9005 -ENCODING 36869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -5C00 -1000 -9F80 -1F00 -E900 -6900 -6F00 -C000 -BF80 -ENDCHAR -STARTCHAR 9006 -ENCODING 36870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9200 -4A00 -BF80 -5500 -1500 -DF00 -4400 -4800 -BF80 -ENDCHAR -STARTCHAR 9008 -ENCODING 36872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -2100 -EF00 -2B00 -EF00 -6B00 -6300 -C000 -BF80 -ENDCHAR -STARTCHAR 900B -ENCODING 36875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8500 -7F00 -0400 -BF00 -2500 -FF00 -7F00 -6500 -E700 -BF80 -ENDCHAR -STARTCHAR 900D -ENCODING 36877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8600 -5500 -2480 -FF00 -1F00 -D100 -5F00 -5100 -D300 -BF80 -ENDCHAR -STARTCHAR 900F -ENCODING 36879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -5C00 -BF00 -5700 -2000 -DE00 -4B00 -5100 -E300 -BF80 -ENDCHAR -STARTCHAR 9010 -ENCODING 36880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -4900 -9E00 -7C00 -2600 -DB00 -6280 -4C00 -BF80 -ENDCHAR -STARTCHAR 9011 -ENCODING 36881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8600 -4600 -BF00 -5500 -1600 -CA00 -5500 -6500 -C800 -BF80 -ENDCHAR -STARTCHAR 9014 -ENCODING 36884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8400 -5A00 -A100 -5E00 -3F00 -D600 -6500 -4C00 -BF80 -ENDCHAR -STARTCHAR 9015 -ENCODING 36885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -5500 -AA00 -5500 -0000 -DF00 -7F00 -4000 -BF80 -ENDCHAR -STARTCHAR 9017 -ENCODING 36887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -4000 -9F00 -5F00 -0000 -D200 -7F80 -4000 -BF80 -ENDCHAR -STARTCHAR 9019 -ENCODING 36889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -7F00 -8000 -5F00 -1F00 -DF00 -5F00 -5100 -BF80 -ENDCHAR -STARTCHAR 901A -ENCODING 36890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -4A00 -9F00 -6500 -1F00 -DF00 -6500 -6500 -BF80 -ENDCHAR -STARTCHAR 901D -ENCODING 36893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9100 -5700 -3C00 -9780 -1D00 -F500 -5500 -7500 -C800 -BF80 -ENDCHAR -STARTCHAR 901E -ENCODING 36894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5100 -9F00 -4000 -1F00 -DF00 -7F00 -4000 -BF80 -ENDCHAR -STARTCHAR 901F -ENCODING 36895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -0400 -9F00 -1500 -DF00 -5600 -6580 -C400 -BF80 -ENDCHAR -STARTCHAR 9020 -ENCODING 36896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -5F00 -2400 -BF80 -0400 -DF00 -5100 -5F00 -D100 -BF80 -ENDCHAR -STARTCHAR 9021 -ENCODING 36897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -5200 -3F80 -9700 -2800 -CE00 -5A00 -6C00 -D300 -BF80 -ENDCHAR -STARTCHAR 9022 -ENCODING 36898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -5F00 -0A00 -F700 -0400 -DF00 -5F00 -5F00 -C400 -BF80 -ENDCHAR -STARTCHAR 9023 -ENCODING 36899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -9F00 -5500 -1F00 -DF00 -4400 -7F80 -C400 -BF80 -ENDCHAR -STARTCHAR 902E -ENCODING 36910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -3F80 -8500 -1F00 -D500 -4A00 -7500 -C800 -BF80 -ENDCHAR -STARTCHAR 9031 -ENCODING 36913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5500 -9F00 -5500 -1F00 -DF00 -6B00 -6300 -BF80 -ENDCHAR -STARTCHAR 9032 -ENCODING 36914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -5400 -1F00 -F400 -3F00 -DF00 -5400 -5F00 -C000 -BF80 -ENDCHAR -STARTCHAR 9035 -ENCODING 36917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -8400 -7F80 -0F00 -F400 -5F00 -7F80 -C000 -BF80 -ENDCHAR -STARTCHAR 9038 -ENCODING 36920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9000 -5E00 -2400 -BF00 -2500 -DF00 -4D00 -5480 -E700 -BF80 -ENDCHAR -STARTCHAR 903C -ENCODING 36924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -5F00 -9F00 -4000 -1F00 -DF00 -5F00 -4000 -BF80 -ENDCHAR -STARTCHAR 903E -ENCODING 36926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9C00 -5200 -AF00 -BB00 -3D00 -FD00 -6B00 -6B00 -BF80 -ENDCHAR -STARTCHAR 9041 -ENCODING 36929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -5E00 -9F80 -6F00 -2F00 -E900 -6F00 -4F00 -BF80 -ENDCHAR -STARTCHAR 9042 -ENCODING 36930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9E00 -7100 -BF00 -5B00 -2A00 -FE00 -7500 -4C00 -BF80 -ENDCHAR -STARTCHAR 9047 -ENCODING 36935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5F00 -9500 -5F00 -3F00 -E680 -7900 -6300 -BF80 -ENDCHAR -STARTCHAR 904A -ENCODING 36938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9400 -5780 -3C00 -E700 -1A00 -EF80 -6A00 -6E00 -F200 -BF80 -ENDCHAR -STARTCHAR 904B -ENCODING 36939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6480 -9F00 -5F00 -1F00 -DF00 -7F80 -4400 -BF80 -ENDCHAR -STARTCHAR 904D -ENCODING 36941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8300 -7E00 -3F00 -BF00 -2000 -FF00 -7F00 -7700 -D700 -BF80 -ENDCHAR -STARTCHAR 904E -ENCODING 36942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5100 -9700 -7F00 -2F00 -EB00 -6F00 -E100 -BF80 -ENDCHAR -STARTCHAR 9050 -ENCODING 36944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BB00 -6900 -AB00 -B800 -3F00 -E500 -7B00 -6300 -E480 -BF80 -ENDCHAR -STARTCHAR 9051 -ENCODING 36945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -1F00 -9F00 -0000 -3F00 -DF00 -7F80 -4000 -BF80 -ENDCHAR -STARTCHAR 9053 -ENCODING 36947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -7F80 -0400 -DF00 -1F00 -D100 -5F00 -5F00 -C000 -BF80 -ENDCHAR -STARTCHAR 9054 -ENCODING 36948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -8400 -7F00 -3F00 -DF00 -4400 -7F00 -C400 -BF80 -ENDCHAR -STARTCHAR 9055 -ENCODING 36949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -5F00 -3F00 -DF00 -1100 -CE00 -5F00 -5F80 -C400 -BF80 -ENDCHAR -STARTCHAR 9059 -ENCODING 36953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -5F00 -3600 -8C00 -3F00 -FF80 -4400 -5F00 -C000 -BF80 -ENDCHAR -STARTCHAR 905C -ENCODING 36956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -B900 -5700 -9500 -9B00 -3F00 -D700 -6A80 -4A00 -BF80 -ENDCHAR -STARTCHAR 905D -ENCODING 36957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6B00 -BF00 -5600 -2500 -D600 -6500 -4400 -BF80 -ENDCHAR -STARTCHAR 905E -ENCODING 36958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -7F00 -AF80 -7680 -2C00 -F700 -7680 -7B00 -BF80 -ENDCHAR -STARTCHAR 9060 -ENCODING 36960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -3F80 -C000 -1F00 -DF00 -5700 -6700 -C500 -BF80 -ENDCHAR -STARTCHAR 9061 -ENCODING 36961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AB00 -6B00 -3B00 -BB00 -3B00 -FB00 -5500 -5500 -E500 -BF80 -ENDCHAR -STARTCHAR 9063 -ENCODING 36963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -9F00 -7F80 -1F00 -DF00 -5F00 -5100 -DF00 -BF80 -ENDCHAR -STARTCHAR 9069 -ENCODING 36969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -0A00 -9F00 -2F00 -EF00 -6B00 -6F00 -E300 -BF80 -ENDCHAR -STARTCHAR 906D -ENCODING 36973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -7F80 -1F00 -9F00 -1F00 -0000 -DF00 -5100 -5F00 -BF80 -ENDCHAR -STARTCHAR 906E -ENCODING 36974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -2A00 -BF00 -2A00 -EE00 -7700 -7680 -D480 -BF80 -ENDCHAR -STARTCHAR 906F -ENCODING 36975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -B700 -6E00 -B580 -AF00 -3700 -EF00 -6A80 -5600 -BF80 -ENDCHAR -STARTCHAR 9072 -ENCODING 36978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5F00 -9D00 -7D00 -2C00 -EF00 -7F80 -4400 -BF80 -ENDCHAR -STARTCHAR 9075 -ENCODING 36981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9E00 -5F00 -BF80 -5B00 -1500 -FF00 -4200 -5600 -BF80 -ENDCHAR -STARTCHAR 9077 -ENCODING 36983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -7F00 -AB00 -BF00 -3F80 -FF00 -5700 -5F00 -BF80 -ENDCHAR -STARTCHAR 9078 -ENCODING 36984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BB00 -7B80 -BB00 -4A00 -3F00 -FF80 -4A00 -5100 -BF80 -ENDCHAR -STARTCHAR 907A -ENCODING 36986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -0E00 -DB00 -1F00 -DF00 -5F00 -4E00 -F300 -BF80 -ENDCHAR -STARTCHAR 907C -ENCODING 36988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -2B00 -9F00 -3E80 -F200 -5E00 -6500 -CC00 -BF80 -ENDCHAR -STARTCHAR 907D -ENCODING 36989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8700 -4800 -3F00 -BF00 -3F00 -F600 -7F00 -5B00 -C480 -BF80 -ENDCHAR -STARTCHAR 907F -ENCODING 36991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BA00 -6F80 -2B00 -BB00 -2780 -FA00 -6F00 -5A00 -D200 -BF80 -ENDCHAR -STARTCHAR 9080 -ENCODING 36992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -7A00 -3B80 -BD00 -3F00 -DB00 -6B00 -7B00 -C480 -BF80 -ENDCHAR -STARTCHAR 9081 -ENCODING 36993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8A00 -7F80 -9F00 -5F00 -1F00 -BF00 -6700 -7900 -E100 -BF80 -ENDCHAR -STARTCHAR 9082 -ENCODING 36994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8700 -5A80 -3E80 -B900 -3A00 -FB00 -7F80 -6900 -E900 -BF80 -ENDCHAR -STARTCHAR 9083 -ENCODING 36995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -3300 -CA00 -3F00 -FA00 -6600 -5D00 -EC00 -BF80 -ENDCHAR -STARTCHAR 9084 -ENCODING 36996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -7F00 -8000 -7F00 -1F00 -DF00 -5B00 -6500 -BF80 -ENDCHAR -STARTCHAR 9087 -ENCODING 36999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -5600 -BF80 -7900 -3B00 -F900 -7B00 -6700 -BF80 -ENDCHAR -STARTCHAR 9088 -ENCODING 37000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -B700 -AD00 -B700 -1500 -EF00 -5A00 -6D80 -D580 -BF80 -ENDCHAR -STARTCHAR 908A -ENCODING 37002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -5F00 -1F00 -9F00 -3F80 -D700 -7F00 -4900 -D300 -BF80 -ENDCHAR -STARTCHAR 908F -ENCODING 37007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -7F00 -9500 -B780 -1500 -BF00 -BD00 -DF80 -BF80 -ENDCHAR -STARTCHAR 9091 -ENCODING 37009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -0000 -FF00 -8900 -FF00 -8000 -8080 -7F00 -ENDCHAR -STARTCHAR 9095 -ENCODING 37013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -9200 -4900 -7E00 -7E00 -0000 -FF00 -FF00 -8080 -FF00 -ENDCHAR -STARTCHAR 9099 -ENCODING 37017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2780 -2500 -F500 -8600 -8500 -8500 -8500 -F480 -0700 -0400 -ENDCHAR -STARTCHAR 90A2 -ENCODING 37026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -55 -55 -FD -55 -55 -57 -94 -94 -ENDCHAR -STARTCHAR 90A3 -ENCODING 37027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -55 -FD -56 -55 -FD -55 -97 -B4 -ENDCHAR -STARTCHAR 90A6 -ENCODING 37030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -27 -35 -E5 -26 -F5 -25 -F5 -45 -47 -84 -ENDCHAR -STARTCHAR 90A8 -ENCODING 37032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2780 -3500 -C500 -B500 -B500 -B500 -F480 -2480 -2F00 -3C00 -ENDCHAR -STARTCHAR 90AA -ENCODING 37034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -55 -55 -F6 -25 -55 -95 -97 -24 -ENDCHAR -STARTCHAR 90AF -ENCODING 37039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9700 -9500 -FD00 -9500 -9500 -F500 -9480 -9480 -F700 -9400 -ENDCHAR -STARTCHAR 90B0 -ENCODING 37040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4780 -5500 -5500 -FD00 -0D00 -0500 -F480 -9480 -F700 -9400 -ENDCHAR -STARTCHAR 90B1 -ENCODING 37041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -17 -E5 -85 -F5 -A5 -A5 -BF -C4 -04 -ENDCHAR -STARTCHAR 90B5 -ENCODING 37045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F780 -4D00 -5500 -B600 -0500 -F480 -9480 -F700 -9400 -ENDCHAR -STARTCHAR 90B8 -ENCODING 37048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5700 -A500 -A500 -FD00 -9500 -A480 -D700 -0C00 -F400 -ENDCHAR -STARTCHAR 90C1 -ENCODING 37057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4780 -4500 -FD00 -7500 -9500 -F500 -5480 -7480 -5700 -7400 -ENDCHAR -STARTCHAR 90CA -ENCODING 37066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -27 -FD -55 -96 -9E -65 -25 -55 -97 -84 -ENDCHAR -STARTCHAR 90DE -ENCODING 37086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2780 -F500 -9500 -F500 -9500 -F500 -D480 -A480 -F700 -CC00 -ENDCHAR -STARTCHAR 90E1 -ENCODING 37089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -55 -FD -F6 -45 -F5 -D5 -77 -54 -ENDCHAR -STARTCHAR 90E8 -ENCODING 37096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2780 -F500 -9500 -5500 -FD00 -0500 -F480 -9480 -F700 -9400 -ENDCHAR -STARTCHAR 90ED -ENCODING 37101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -27 -FD -F5 -F6 -05 -F5 -25 -FD -27 -44 -ENDCHAR -STARTCHAR 90F5 -ENCODING 37109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1F80 -E500 -FD00 -B600 -FD00 -B480 -FC80 -7F00 -0400 -ENDCHAR -STARTCHAR 90FD -ENCODING 37117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2F80 -F500 -3500 -FD00 -3500 -F500 -9480 -7480 -7700 -9400 -ENDCHAR -STARTCHAR 9102 -ENCODING 37122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -DF80 -DD00 -0500 -F500 -FD00 -4480 -7700 -9400 -3400 -ENDCHAR -STARTCHAR 9112 -ENCODING 37138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -FF00 -BD00 -7D00 -9D00 -7C80 -AC80 -FD00 -4C00 -9400 -ENDCHAR -STARTCHAR 9115 -ENCODING 37141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B80 -9B00 -D700 -DB00 -7B00 -C280 -DA80 -5B00 -9600 -9A00 -ENDCHAR -STARTCHAR 9119 -ENCODING 37145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8D00 -FD00 -FD00 -FD00 -FC80 -FC80 -8F00 -FC00 -ENDCHAR -STARTCHAR 9127 -ENCODING 37159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F780 -DD00 -FD00 -8500 -F500 -F480 -5480 -5F00 -E400 -ENDCHAR -STARTCHAR 912D -ENCODING 37165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -B300 -FD00 -FD00 -9D00 -FD00 -FC80 -FA80 -5500 -8C00 -ENDCHAR -STARTCHAR 9132 -ENCODING 37170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -FD00 -0500 -FE00 -FD00 -FC80 -FC80 -2700 -2400 -ENDCHAR -STARTCHAR 9149 -ENCODING 37193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -18 -7F -A9 -AF -7F -81 -7F -81 -ENDCHAR -STARTCHAR 914A -ENCODING 37194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F780 -6200 -F200 -F200 -F200 -9200 -F200 -F200 -9600 -ENDCHAR -STARTCHAR 914B -ENCODING 37195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -4300 -FD80 -FF00 -6B00 -6F00 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR 914C -ENCODING 37196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F4 -64 -F7 -F9 -FD -B5 -93 -F1 -F1 -93 -ENDCHAR -STARTCHAR 914D -ENCODING 37197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -6100 -F100 -F700 -F800 -9800 -F880 -F880 -9700 -ENDCHAR -STARTCHAR 914E -ENCODING 37198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -6100 -F780 -F100 -F500 -F500 -9300 -F100 -F100 -9300 -ENDCHAR -STARTCHAR 9152 -ENCODING 37202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -4A00 -9F00 -6B00 -2B00 -6900 -5F00 -9F00 -A100 -ENDCHAR -STARTCHAR 9162 -ENCODING 37218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -6800 -FF80 -FC00 -FB00 -B400 -9300 -F400 -F400 -9400 -ENDCHAR -STARTCHAR 9169 -ENCODING 37225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F4 -67 -F9 -FD -F2 -BC -9F -F5 -F7 -95 -ENDCHAR -STARTCHAR 916A -ENCODING 37226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -6700 -F500 -FE00 -F300 -B580 -9F00 -F900 -FF00 -9900 -ENDCHAR -STARTCHAR 916C -ENCODING 37228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -FB -6B -FB -D7 -B7 -BB -9B -FB -FB -91 -ENDCHAR -STARTCHAR 9175 -ENCODING 37237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -4E80 -F500 -BF80 -B200 -BE00 -FF80 -9200 -F200 -9600 -ENDCHAR -STARTCHAR 9177 -ENCODING 37239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -6A00 -FF00 -FA00 -FF80 -B200 -9F00 -F900 -FF00 -8900 -ENDCHAR -STARTCHAR 9178 -ENCODING 37240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -6500 -FF00 -B680 -BF80 -BC00 -9F00 -F500 -F600 -8980 -ENDCHAR -STARTCHAR 9187 -ENCODING 37255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -6000 -FF00 -FF00 -F000 -BF80 -9100 -FF80 -F200 -9600 -ENDCHAR -STARTCHAR 9189 -ENCODING 37257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -6F00 -F500 -D700 -BE80 -B200 -9F80 -F200 -F200 -9200 -ENDCHAR -STARTCHAR 918B -ENCODING 37259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F500 -6F80 -F500 -FF80 -F000 -BF00 -9900 -FF00 -FF00 -9900 -ENDCHAR -STARTCHAR 918D -ENCODING 37261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -6F00 -FF00 -D000 -FF80 -9A00 -FB00 -FE00 -9B80 -ENDCHAR -STARTCHAR 9192 -ENCODING 37266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -6F00 -FF00 -F000 -BA00 -9F80 -FF00 -F200 -9F80 -ENDCHAR -STARTCHAR 919C -ENCODING 37276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -6F00 -FB00 -DF00 -DB00 -BF00 -9700 -F780 -FA80 -9300 -ENDCHAR -STARTCHAR 91AB -ENCODING 37291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E780 -A800 -D700 -FF00 -FF80 -7F00 -A700 -7F00 -7F00 -ENDCHAR -STARTCHAR 91AC -ENCODING 37292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -AC00 -FF00 -3D00 -FF80 -AB00 -FF80 -FF00 -A700 -FF00 -FF00 -ENDCHAR -STARTCHAR 91AE -ENCODING 37294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F600 -6F80 -FA00 -DF00 -BA00 -BF00 -9A00 -FF80 -FE80 -9D80 -ENDCHAR -STARTCHAR 91AF -ENCODING 37295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -4F00 -EF00 -A100 -AD80 -AD80 -9F00 -EF00 -EF00 -8F80 -ENDCHAR -STARTCHAR 91B1 -ENCODING 37297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -ED00 -5680 -E900 -DF80 -A580 -AF80 -EB00 -E700 -AA80 -ENDCHAR -STARTCHAR 91B4 -ENCODING 37300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F600 -4F00 -EF00 -AF00 -A000 -AF80 -9F00 -EF00 -E500 -9F80 -ENDCHAR -STARTCHAR 91B5 -ENCODING 37301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E700 -4400 -EF00 -EF00 -E800 -AF00 -B200 -F700 -F680 -9E00 -ENDCHAR -STARTCHAR 91C0 -ENCODING 37312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EF80 -4000 -EF00 -AF00 -AF80 -AF00 -A500 -EF80 -FF00 -AC80 -ENDCHAR -STARTCHAR 91C7 -ENCODING 37319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7E00 -4900 -8800 -0800 -FF00 -1A00 -6980 -8800 -ENDCHAR -STARTCHAR 91C9 -ENCODING 37321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -D4 -EF -CD -ED -6F -6D -CD -4F -49 -ENDCHAR -STARTCHAR 91CB -ENCODING 37323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3F00 -D680 -FF00 -EF00 -5F80 -FF80 -E400 -DF00 -4400 -ENDCHAR -STARTCHAR 91CC -ENCODING 37324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4900 -7E00 -4900 -7E00 -0800 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR 91CD -ENCODING 37325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1600 -6800 -FF00 -7F00 -4900 -7F00 -7F00 -FF00 -0800 -FF80 -ENDCHAR -STARTCHAR 91CE -ENCODING 37326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -D100 -F600 -D200 -FF80 -F280 -4300 -3200 -C600 -ENDCHAR -STARTCHAR 91CF -ENCODING 37327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -FF00 -7E00 -7E00 -7E00 -FF00 -FF80 -ENDCHAR -STARTCHAR 91D0 -ENCODING 37328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F780 -FE00 -DD80 -FF80 -BF00 -BF00 -BF00 -BF00 -FF80 -ENDCHAR -STARTCHAR 91D1 -ENCODING 37329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -2400 -4300 -BF80 -0800 -7F00 -4A00 -2C00 -FF80 -ENDCHAR -STARTCHAR 91D7 -ENCODING 37335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -65 -95 -FD -25 -FD -B5 -B5 -39 -C3 -ENDCHAR -STARTCHAR 91D8 -ENCODING 37336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -6F80 -E200 -F200 -4200 -F200 -D200 -D200 -3200 -C600 -ENDCHAR -STARTCHAR 91DC -ENCODING 37340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2600 -E500 -1800 -6600 -FD80 -0800 -7F00 -2C00 -FF00 -ENDCHAR -STARTCHAR 91DD -ENCODING 37341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6200 -6200 -9200 -EF80 -4200 -F200 -D200 -D200 -3200 -C200 -ENDCHAR -STARTCHAR 91E3 -ENCODING 37347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -E4 -9F -E9 -55 -F5 -D3 -E1 -71 -C7 -ENDCHAR -STARTCHAR 91E7 -ENCODING 37351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -49 -6B -9B -EB -FB -4B -DB -FB -6B -91 -ENDCHAR -STARTCHAR 91EA -ENCODING 37354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -6F00 -9200 -E200 -4200 -FF80 -D200 -E200 -7200 -C600 -ENDCHAR -STARTCHAR 91F5 -ENCODING 37365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6F00 -6900 -9D00 -EB00 -F500 -4600 -D600 -E600 -7D00 -D080 -ENDCHAR -STARTCHAR 920D -ENCODING 37389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6700 -BE00 -ED00 -4D00 -ED00 -EF00 -EC00 -6480 -C700 -ENDCHAR -STARTCHAR 9210 -ENCODING 37392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4600 -A600 -9900 -F680 -E000 -DF00 -E100 -7200 -C200 -ENDCHAR -STARTCHAR 9211 -ENCODING 37393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F80 -A800 -E800 -4F00 -ED00 -EB00 -F200 -7500 -D880 -ENDCHAR -STARTCHAR 9212 -ENCODING 37394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5E00 -AA00 -EA00 -4B00 -ED00 -ED00 -F200 -7500 -D880 -ENDCHAR -STARTCHAR 9217 -ENCODING 37399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AA00 -A900 -FF00 -4A00 -EA00 -EA00 -EA00 -7280 -D300 -ENDCHAR -STARTCHAR 921E -ENCODING 37406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -68 -AF -99 -E9 -4F -F1 -DF -E1 -31 -C3 -ENDCHAR -STARTCHAR 9234 -ENCODING 37428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -6600 -9900 -EF80 -4000 -FF00 -D500 -E500 -7500 -C400 -ENDCHAR -STARTCHAR 923A -ENCODING 37434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -E200 -9200 -E200 -FF00 -D300 -E300 -F200 -CF80 -ENDCHAR -STARTCHAR 923F -ENCODING 37439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -4F -B5 -F5 -55 -EF -F5 -F5 -6F -D1 -ENDCHAR -STARTCHAR 9240 -ENCODING 37440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -4F -AB -93 -EF -EB -EF -EA -E2 -C2 -ENDCHAR -STARTCHAR 9245 -ENCODING 37445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F80 -A800 -E800 -4F00 -E900 -EF00 -E800 -7F80 -C800 -ENDCHAR -STARTCHAR 9249 -ENCODING 37449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -6200 -BF80 -E400 -4500 -FA00 -E700 -E500 -7B00 -DC80 -ENDCHAR -STARTCHAR 9257 -ENCODING 37463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -6900 -9F80 -E900 -4900 -FF00 -D900 -E900 -7F00 -C900 -ENDCHAR -STARTCHAR 925B -ENCODING 37467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4E00 -AA00 -9A80 -F180 -E000 -EF00 -E900 -6F00 -C900 -ENDCHAR -STARTCHAR 925E -ENCODING 37470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4300 -A300 -9F80 -EA00 -EB00 -EB00 -EE00 -7E80 -C500 -ENDCHAR -STARTCHAR 9262 -ENCODING 37474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -A4 -AF -E4 -46 -ED -F5 -FF -64 -C4 -ENDCHAR -STARTCHAR 9264 -ENCODING 37476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -6F -99 -F1 -4F -FB -DF -EB -71 -C3 -ENDCHAR -STARTCHAR 9265 -ENCODING 37477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -A500 -9F00 -E400 -4D00 -ED00 -ED00 -ED80 -7500 -C400 -ENDCHAR -STARTCHAR 9266 -ENCODING 37478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F80 -9200 -8200 -E200 -EB00 -EA00 -EA00 -EA00 -DF80 -ENDCHAR -STARTCHAR 9280 -ENCODING 37504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -A900 -AF00 -E900 -EF00 -ED00 -EB00 -6F00 -D980 -ENDCHAR -STARTCHAR 9283 -ENCODING 37507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -A500 -EB00 -5C80 -E000 -EA00 -EA00 -6A80 -D300 -ENDCHAR -STARTCHAR 9285 -ENCODING 37509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5F -B1 -F7 -51 -F7 -F7 -FB -71 -D3 -ENDCHAR -STARTCHAR 9291 -ENCODING 37521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -6A00 -AF00 -F200 -E200 -5F80 -EA00 -EA00 -6A80 -D380 -ENDCHAR -STARTCHAR 9293 -ENCODING 37523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4C00 -A600 -AA00 -E900 -FF80 -E400 -EF00 -E400 -DF80 -ENDCHAR -STARTCHAR 9296 -ENCODING 37526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -6A00 -9F00 -EA00 -4F80 -E600 -EA00 -EB00 -7280 -C200 -ENDCHAR -STARTCHAR 9298 -ENCODING 37528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -A7 -A9 -F6 -42 -EC -DF -E9 -6F -C9 -ENDCHAR -STARTCHAR 929C -ENCODING 37532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -DB80 -A400 -7F80 -4900 -BD00 -AD00 -6D00 -4D00 -7300 -ENDCHAR -STARTCHAR 92B3 -ENCODING 37555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4600 -A900 -E900 -5F80 -E900 -EF00 -EA00 -6A80 -D300 -ENDCHAR -STARTCHAR 92B6 -ENCODING 37558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -A500 -AF80 -F480 -4B00 -E600 -ED00 -F500 -6480 -CC00 -ENDCHAR -STARTCHAR 92B7 -ENCODING 37559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -AD00 -B480 -EF00 -4900 -EF00 -E900 -EF00 -6900 -CB00 -ENDCHAR -STARTCHAR 92B9 -ENCODING 37561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4300 -AC00 -BF80 -F280 -E000 -EE00 -E700 -6900 -D300 -ENDCHAR -STARTCHAR 92CC -ENCODING 37580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5900 -AE00 -F100 -5F80 -E900 -F900 -EB00 -7800 -9780 -ENDCHAR -STARTCHAR 92CF -ENCODING 37583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -A400 -ED00 -4D00 -F500 -E680 -EA00 -7900 -D080 -ENDCHAR -STARTCHAR 92D2 -ENCODING 37586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -B600 -E600 -5B80 -EF00 -EF00 -FF80 -6200 -C200 -ENDCHAR -STARTCHAR 92E4 -ENCODING 37604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5A -B6 -B7 -DB -57 -FB -F7 -FF -75 -87 -ENDCHAR -STARTCHAR 92EA -ENCODING 37610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -BF80 -A400 -FF00 -5500 -FF00 -F500 -FF00 -7500 -D500 -ENDCHAR -STARTCHAR 92F8 -ENCODING 37624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -B080 -EF00 -5200 -EF80 -EF00 -F880 -7F00 -D880 -ENDCHAR -STARTCHAR 92FC -ENCODING 37628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5F -BB -B7 -FF -FF -FF -FF -7B -93 -ENDCHAR -STARTCHAR 9304 -ENCODING 37636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -AE00 -E200 -4F80 -EB00 -EB00 -E500 -7A80 -C400 -ENDCHAR -STARTCHAR 9310 -ENCODING 37648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -AA00 -9F80 -FA00 -5F00 -EA00 -EF00 -EA00 -6F80 -C800 -ENDCHAR -STARTCHAR 9318 -ENCODING 37656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4300 -AC00 -9F80 -EB00 -FF80 -EB00 -EF80 -E200 -DF80 -ENDCHAR -STARTCHAR 931A -ENCODING 37658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -6F00 -AA80 -FF00 -4500 -FF80 -ED00 -E700 -6400 -CC00 -ENDCHAR -STARTCHAR 931E -ENCODING 37662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -6000 -AF00 -E900 -4F00 -EF00 -E200 -FF80 -6400 -CC00 -ENDCHAR -STARTCHAR 931F -ENCODING 37663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -6C80 -AF00 -ED00 -4880 -E480 -ED00 -F600 -6900 -D080 -ENDCHAR -STARTCHAR 9320 -ENCODING 37664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F00 -9080 -EF00 -4200 -EA00 -EB00 -EA00 -7400 -D380 -ENDCHAR -STARTCHAR 9321 -ENCODING 37665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -6F80 -9600 -E980 -5F80 -E100 -EF00 -EF00 -6900 -C300 -ENDCHAR -STARTCHAR 9322 -ENCODING 37666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -A900 -BE00 -E680 -4B00 -EA00 -DF80 -E500 -6680 -D900 -ENDCHAR -STARTCHAR 9324 -ENCODING 37668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -6F80 -A900 -EF00 -4900 -EF00 -E900 -FF80 -6900 -D080 -ENDCHAR -STARTCHAR 9326 -ENCODING 37670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6F00 -9900 -EF00 -4F00 -EF80 -EC80 -EC80 -6D80 -CC00 -ENDCHAR -STARTCHAR 9328 -ENCODING 37672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4900 -BF80 -A900 -EF00 -F500 -F500 -EF00 -6F00 -D100 -ENDCHAR -STARTCHAR 932B -ENCODING 37675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -4F -A9 -EF -4F -E8 -EF -F7 -6B -D7 -ENDCHAR -STARTCHAR 932E -ENCODING 37678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -4F -B5 -EF -D5 -F7 -F7 -F7 -6F -D1 -ENDCHAR -STARTCHAR 932F -ENCODING 37679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -BF00 -A900 -FF80 -4000 -EF00 -E900 -EF00 -6F00 -C900 -ENDCHAR -STARTCHAR 9348 -ENCODING 37704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -BF80 -AD00 -EF00 -4D00 -ED00 -FF80 -E600 -6900 -D080 -ENDCHAR -STARTCHAR 934A -ENCODING 37706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -A400 -EF00 -5D00 -EF00 -E600 -ED00 -7480 -C400 -ENDCHAR -STARTCHAR 934B -ENCODING 37707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -4F -A9 -EF -4D -FF -F7 -F7 -7B -D1 -ENDCHAR -STARTCHAR 934D -ENCODING 37709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -B500 -FF80 -5700 -F000 -FF00 -F500 -7700 -A980 -ENDCHAR -STARTCHAR 9354 -ENCODING 37716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -B680 -AF00 -EF00 -E000 -DF80 -EF00 -F900 -C300 -ENDCHAR -STARTCHAR 935B -ENCODING 37723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B00 -B500 -9580 -DD80 -5000 -FF00 -FB00 -D300 -7300 -9480 -ENDCHAR -STARTCHAR 936E -ENCODING 37742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4E00 -AB00 -FE80 -5E80 -F700 -FD00 -FF00 -7700 -9D80 -ENDCHAR -STARTCHAR 9375 -ENCODING 37749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -D700 -B300 -DF80 -5F00 -EF00 -EA00 -F700 -7A00 -EF80 -ENDCHAR -STARTCHAR 937C -ENCODING 37756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4300 -A280 -BF80 -FE00 -5280 -FF00 -FD00 -FD00 -5380 -F580 -ENDCHAR -STARTCHAR 937E -ENCODING 37758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4300 -AC00 -1F80 -EF00 -EF00 -F500 -EF00 -6F00 -DF80 -ENDCHAR -STARTCHAR 938C -ENCODING 37772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -DE00 -BF80 -FF00 -5F80 -EB00 -FF00 -EB00 -DA80 -0A00 -ENDCHAR -STARTCHAR 9394 -ENCODING 37780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -B680 -E900 -5680 -E900 -FF80 -E900 -6F00 -C900 -ENDCHAR -STARTCHAR 9396 -ENCODING 37782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5480 -AD00 -9D00 -EF00 -4F00 -E900 -EF00 -EF00 -6B00 -D080 -ENDCHAR -STARTCHAR 939A -ENCODING 37786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -AF00 -A500 -F700 -4400 -FF00 -ED00 -EF00 -7800 -D780 -ENDCHAR -STARTCHAR 93A3 -ENCODING 37795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B680 -DB00 -6700 -9D00 -FF00 -9900 -7E00 -FF80 -2A00 -FF00 -ENDCHAR -STARTCHAR 93A7 -ENCODING 37799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5480 -B480 -AF00 -FF80 -4000 -EF00 -EF00 -E000 -6900 -DF80 -ENDCHAR -STARTCHAR 93AC -ENCODING 37804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -A000 -AF00 -EF00 -4000 -FF00 -F680 -F680 -7680 -D100 -ENDCHAR -STARTCHAR 93AD -ENCODING 37805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -AE80 -AF00 -F700 -5700 -F700 -F700 -FF80 -6A00 -D180 -ENDCHAR -STARTCHAR 93B0 -ENCODING 37808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4E00 -B100 -BE80 -EE00 -E900 -F100 -FF80 -EF00 -9F80 -ENDCHAR -STARTCHAR 93C3 -ENCODING 37827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5200 -D380 -BE00 -D600 -5B00 -FD00 -FF80 -DB00 -5B00 -FC80 -ENDCHAR -STARTCHAR 93D1 -ENCODING 37841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -A900 -FF00 -5480 -FE80 -F680 -F680 -7A80 -9100 -ENDCHAR -STARTCHAR 93DE -ENCODING 37854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -BF00 -FF80 -5F00 -FF00 -FA80 -FF00 -6A80 -AB00 -ENDCHAR -STARTCHAR 93E1 -ENCODING 37857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -9F80 -E000 -4F00 -EF00 -E900 -EF00 -6A80 -F380 -ENDCHAR -STARTCHAR 93E4 -ENCODING 37860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -BF80 -EF00 -5F00 -F500 -FF80 -EA00 -6600 -DD00 -ENDCHAR -STARTCHAR 93F6 -ENCODING 37878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -AF00 -BF00 -F300 -4C00 -EF00 -FF80 -E600 -6D00 -D480 -ENDCHAR -STARTCHAR 9404 -ENCODING 37892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -BF80 -AE00 -FF80 -4400 -FF00 -FF00 -FF00 -6B00 -9080 -ENDCHAR -STARTCHAR 9418 -ENCODING 37912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -BF80 -E000 -4F00 -EF00 -F500 -FF00 -6400 -DF80 -ENDCHAR -STARTCHAR 9425 -ENCODING 37925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -7F00 -9F00 -FF80 -4D00 -FF80 -E000 -EF00 -6F00 -C900 -ENDCHAR -STARTCHAR 942B -ENCODING 37931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -6F00 -BF00 -FB00 -4E00 -EF00 -ED80 -F680 -7680 -D180 -ENDCHAR -STARTCHAR 9435 -ENCODING 37941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B00 -DF00 -BF80 -C200 -5F00 -E300 -FF00 -DD00 -7E80 -8500 -ENDCHAR -STARTCHAR 9438 -ENCODING 37944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -B680 -FF00 -4F00 -FF80 -FB80 -FC00 -7F00 -C400 -ENDCHAR -STARTCHAR 9444 -ENCODING 37956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -A000 -FF80 -4400 -EA00 -FF80 -FB80 -7700 -9B00 -ENDCHAR -STARTCHAR 9451 -ENCODING 37969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5D00 -BA00 -BF80 -FE00 -5B80 -FC00 -EF00 -F700 -7700 -9F80 -ENDCHAR -STARTCHAR 9452 -ENCODING 37970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -AF00 -FF00 -FF00 -AE80 -F700 -BD00 -FF00 -2A00 -FF00 -ENDCHAR -STARTCHAR 945B -ENCODING 37979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -BF80 -D600 -5F80 -FF00 -FB00 -FF00 -6F00 -E980 -ENDCHAR -STARTCHAR 947D -ENCODING 38013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -DB00 -BB80 -DF80 -5A00 -FF00 -F100 -FF00 -6000 -9980 -ENDCHAR -STARTCHAR 947F -ENCODING 38015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F680 -FD80 -F800 -F700 -B600 -B500 -6E80 -9980 -FF00 -7E00 -ENDCHAR -STARTCHAR 9577 -ENCODING 38263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7E -FF -4A -4C -5E -E1 -ENDCHAR -STARTCHAR 9580 -ENCODING 38272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -99 -FF -81 -81 -81 -81 -83 -ENDCHAR -STARTCHAR 9583 -ENCODING 38275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -89 -99 -B5 -A3 -83 -ENDCHAR -STARTCHAR 9589 -ENCODING 38281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -89 -FF -99 -F9 -8B -ENDCHAR -STARTCHAR 958B -ENCODING 38283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -BF -95 -FF -A5 -A7 -ENDCHAR -STARTCHAR 958F -ENCODING 38287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -BF -89 -BD -FF -83 -ENDCHAR -STARTCHAR 9591 -ENCODING 38289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -89 -FF -B5 -CB -8B -ENDCHAR -STARTCHAR 9592 -ENCODING 38290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -BD -BD -BD -A5 -AF -ENDCHAR -STARTCHAR 9593 -ENCODING 38291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -99 -FF -BD -A5 -BD -BD -83 -ENDCHAR -STARTCHAR 9594 -ENCODING 38292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -FF -95 -99 -A7 -83 -ENDCHAR -STARTCHAR 9598 -ENCODING 38296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -BD -BD -AB -BD -8B -ENDCHAR -STARTCHAR 95A3 -ENCODING 38307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -F7 -99 -F7 -9D -B9 -FF -BD -A7 -ENDCHAR -STARTCHAR 95A4 -ENCODING 38308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -9D -FF -BD -BD -A3 -ENDCHAR -STARTCHAR 95A5 -ENCODING 38309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -99 -F7 -AB -FD -AF -B7 -A3 -ENDCHAR -STARTCHAR 95A8 -ENCODING 38312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -89 -FF -81 -BD -FF -83 -ENDCHAR -STARTCHAR 95AD -ENCODING 38317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -81 -BD -BD -BD -BD -81 -ENDCHAR -STARTCHAR 95B1 -ENCODING 38321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -9D -A7 -FF -BF -9F -E3 -ENDCHAR -STARTCHAR 95BB -ENCODING 38331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -9D -ED -BF -A3 -BF -A3 -ENDCHAR -STARTCHAR 95BC -ENCODING 38332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -A5 -FB -BD -D3 -DF -F3 -ENDCHAR -STARTCHAR 95C7 -ENCODING 38343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -BF -FF -81 -BD -BD -A5 -ENDCHAR -STARTCHAR 95CA -ENCODING 38346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -E7 -99 -DF -BF -DF -93 -ENDCHAR -STARTCHAR 95D4 -ENCODING 38356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -BD -FF -BF -BF -FF -83 -ENDCHAR -STARTCHAR 95D5 -ENCODING 38357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -D5 -F7 -FF -F5 -AB -83 -ENDCHAR -STARTCHAR 95D6 -ENCODING 38358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -BD -BD -BD -BF -EB -C7 -ENDCHAR -STARTCHAR 95DC -ENCODING 38364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -E7 -B7 -FF -DB -F7 -AB -ENDCHAR -STARTCHAR 95E1 -ENCODING 38369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -99 -F7 -DB -A5 -BF -BD -FF -89 -ENDCHAR -STARTCHAR 95E2 -ENCODING 38370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -F5 -DF -FF -DF -B5 -83 -ENDCHAR -STARTCHAR 961C -ENCODING 38428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4200 -7E00 -7F00 -4100 -7F00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 9621 -ENCODING 38433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E300 -BC00 -C400 -C400 -BF80 -A400 -E400 -8400 -8400 -ENDCHAR -STARTCHAR 962A -ENCODING 38442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -B000 -DF00 -D900 -B500 -B600 -F600 -9D00 -A880 -ENDCHAR -STARTCHAR 962E -ENCODING 38446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -A000 -C000 -DF00 -AA00 -AA00 -EA00 -9280 -A300 -ENDCHAR -STARTCHAR 9632 -ENCODING 38450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A400 -BF80 -C800 -AF00 -A900 -9900 -E900 -9100 -9300 -ENDCHAR -STARTCHAR 963B -ENCODING 38459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -A900 -A900 -CF00 -A900 -AF00 -E900 -8900 -9F80 -ENDCHAR -STARTCHAR 963F -ENCODING 38463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -A100 -CD00 -D500 -B500 -AD00 -F500 -8100 -8300 -ENDCHAR -STARTCHAR 9640 -ENCODING 38464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -B080 -D880 -AB00 -AE00 -A800 -E800 -8880 -8F00 -ENDCHAR -STARTCHAR 9642 -ENCODING 38466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -B480 -D400 -DF00 -B500 -B600 -F600 -AD00 -A880 -ENDCHAR -STARTCHAR 9644 -ENCODING 38468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -A900 -C900 -D780 -D500 -B500 -B300 -F100 -9100 -9300 -ENDCHAR -STARTCHAR 964B -ENCODING 38475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -A200 -DF00 -DB00 -BF00 -B900 -D900 -9F80 -9000 -ENDCHAR -STARTCHAR 964C -ENCODING 38476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -A400 -AF00 -D100 -B100 -AF00 -F100 -8F00 -9100 -ENDCHAR -STARTCHAR 964D -ENCODING 38477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -AF00 -DA00 -CE00 -D580 -BF00 -B400 -F380 -9C00 -8400 -ENDCHAR -STARTCHAR 9650 -ENCODING 38480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -B100 -DF00 -D100 -BF00 -B700 -F200 -9F00 -B880 -ENDCHAR -STARTCHAR 965B -ENCODING 38491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -B300 -DF00 -D280 -DF00 -A400 -A400 -FF00 -8400 -BF80 -ENDCHAR -STARTCHAR 965C -ENCODING 38492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -A400 -BF80 -C500 -D500 -BD00 -A680 -CA00 -9100 -A080 -ENDCHAR -STARTCHAR 965D -ENCODING 38493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -C400 -D700 -D500 -BD00 -EA80 -8A00 -9100 -A080 -ENDCHAR -STARTCHAR 965E -ENCODING 38494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E600 -BA00 -DF80 -CA00 -B200 -B600 -C400 -9F00 -8400 -BF80 -ENDCHAR -STARTCHAR 965F -ENCODING 38495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -AA00 -CB00 -CA00 -DF80 -AA80 -B300 -F600 -8C00 -9000 -ENDCHAR -STARTCHAR 9662 -ENCODING 38498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -D080 -CE00 -C000 -BF00 -AA00 -EA00 -9280 -A300 -ENDCHAR -STARTCHAR 9663 -ENCODING 38499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -C400 -DF00 -BF00 -B500 -BF00 -FF80 -8400 -8400 -ENDCHAR -STARTCHAR 9664 -ENCODING 38500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AA00 -C900 -DE80 -C400 -BF00 -A500 -F500 -9480 -8C00 -ENDCHAR -STARTCHAR 966A -ENCODING 38506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -C900 -CA00 -BF80 -A000 -AF00 -F100 -8F00 -9100 -ENDCHAR -STARTCHAR 9670 -ENCODING 38512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E400 -AB00 -DF80 -DE00 -BF00 -A000 -FF00 -8900 -9F00 -ENDCHAR -STARTCHAR 9673 -ENCODING 38515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -C400 -DF00 -DF00 -B500 -BF00 -EE00 -9580 -8400 -ENDCHAR -STARTCHAR 9675 -ENCODING 38517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -C400 -DF80 -CB00 -B800 -DF00 -AA00 -8E00 -B180 -ENDCHAR -STARTCHAR 9676 -ENCODING 38518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -E8 -BF -D9 -EF -D5 -BF -B7 -DF -93 -83 -ENDCHAR -STARTCHAR 9677 -ENCODING 38519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -E8 -AF -A9 -D3 -BC -BB -B1 -FF -9F -91 -ENDCHAR -STARTCHAR 9678 -ENCODING 38520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -C400 -DF80 -AA80 -B300 -E400 -9F00 -8400 -BF80 -ENDCHAR -STARTCHAR 967D -ENCODING 38525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -BF00 -DF00 -A000 -BF80 -FF00 -AA80 -9500 -8B00 -ENDCHAR -STARTCHAR 9685 -ENCODING 38533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -B5 -DF -DF -A4 -BF -F7 -9D -91 -ENDCHAR -STARTCHAR 9686 -ENCODING 38534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -AF00 -D600 -D980 -AE00 -B400 -DF00 -BF00 -8400 -BF80 -ENDCHAR -STARTCHAR 968A -ENCODING 38538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -B100 -FF80 -DA80 -EB00 -BE00 -DD00 -A480 -8C00 -ENDCHAR -STARTCHAR 968B -ENCODING 38539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -BF80 -DF00 -EF00 -C000 -AF00 -AF00 -EF00 -9100 -9300 -ENDCHAR -STARTCHAR 968D -ENCODING 38541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -B100 -DF00 -DF00 -A000 -BF00 -FF00 -8400 -BF80 -ENDCHAR -STARTCHAR 968E -ENCODING 38542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -BB00 -D380 -DB00 -D400 -BF00 -B100 -DF00 -9100 -9F00 -ENDCHAR -STARTCHAR 9694 -ENCODING 38548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -AF00 -CF00 -C000 -BF00 -B700 -FE80 -9480 -9500 -ENDCHAR -STARTCHAR 9695 -ENCODING 38549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -AF00 -C000 -DF00 -BF00 -BF00 -FF00 -8A00 -9180 -ENDCHAR -STARTCHAR 9698 -ENCODING 38552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -B100 -EE80 -CE00 -B100 -BF80 -FB00 -9B00 -BF80 -ENDCHAR -STARTCHAR 9699 -ENCODING 38553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E600 -BD00 -E480 -DF00 -DF00 -B100 -BF00 -D500 -A480 -8C00 -ENDCHAR -STARTCHAR 969B -ENCODING 38555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F000 -BD00 -DB00 -F900 -DF80 -A000 -BF00 -D500 -9480 -AC00 -ENDCHAR -STARTCHAR 969C -ENCODING 38556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -DF80 -C000 -DF00 -BF00 -BF00 -FF80 -8400 -8400 -ENDCHAR -STARTCHAR 96A3 -ENCODING 38563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F500 -AD00 -DF80 -CE00 -B580 -BD00 -DB80 -8F80 -9100 -A100 -ENDCHAR -STARTCHAR 96A7 -ENCODING 38567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F700 -A900 -EF00 -D680 -CD00 -B700 -DB00 -9680 -AF80 -ENDCHAR -STARTCHAR 96A8 -ENCODING 38568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF80 -CA00 -D780 -A700 -B700 -D700 -9500 -9800 -AF80 -ENDCHAR -STARTCHAR 96AA -ENCODING 38570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EC00 -AA00 -DF00 -E080 -DB00 -BB00 -A000 -EA00 -9B00 -A580 -ENDCHAR -STARTCHAR 96B1 -ENCODING 38577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -B500 -DF00 -DF80 -BF00 -DF00 -8000 -9D00 -AE80 -ENDCHAR -STARTCHAR 96B7 -ENCODING 38583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -4300 -FF80 -EF00 -0A80 -FB00 -E500 -DB00 -4480 -ENDCHAR -STARTCHAR 96BB -ENCODING 38587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -7F -C8 -FF -78 -7F -00 -FE -18 -E7 -ENDCHAR -STARTCHAR 96C0 -ENCODING 38592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -CB00 -9480 -1800 -6800 -FF00 -7F00 -7F00 -7F00 -4000 -ENDCHAR -STARTCHAR 96C1 -ENCODING 38593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -AA00 -AF00 -BA00 -FF00 -AA00 -AF00 -AF80 -2800 -ENDCHAR -STARTCHAR 96C4 -ENCODING 38596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -4A00 -FF80 -5A00 -7F00 -AA00 -CF00 -DA00 -FA00 -1F80 -ENDCHAR -STARTCHAR 96C5 -ENCODING 38597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F500 -AA00 -AF80 -BA00 -FF00 -2A00 -6F00 -AA00 -AF80 -6800 -ENDCHAR -STARTCHAR 96C6 -ENCODING 38598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -7F00 -FF00 -C800 -7F00 -7F00 -FF00 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR 96C7 -ENCODING 38599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -81 -FF -BF -E4 -FF -BC -BF -ENDCHAR -STARTCHAR 96C9 -ENCODING 38601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -8A00 -EF80 -DA00 -FF00 -4A00 -6F00 -6A00 -9F80 -8800 -ENDCHAR -STARTCHAR 96CB -ENCODING 38603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -7F -C8 -FE -78 -7F -00 -E7 -BD -83 -ENDCHAR -STARTCHAR 96CC -ENCODING 38604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -5500 -D780 -FE00 -DF00 -DE00 -D700 -EE00 -9F80 -0400 -ENDCHAR -STARTCHAR 96CD -ENCODING 38605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -4800 -EF00 -6A00 -5F00 -EB00 -2E00 -4F80 -8800 -ENDCHAR -STARTCHAR 96CE -ENCODING 38606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0A00 -EA00 -AF80 -FA00 -BF00 -AA00 -EF00 -AA00 -BF80 -C800 -ENDCHAR -STARTCHAR 96D5 -ENCODING 38613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F500 -B500 -FF80 -BA00 -F700 -9600 -F700 -F600 -9780 -B400 -ENDCHAR -STARTCHAR 96D6 -ENCODING 38614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E500 -9A00 -EF80 -4A00 -FF00 -DA00 -FF00 -5A00 -7F80 -D800 -ENDCHAR -STARTCHAR 96D9 -ENCODING 38617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6500 -F780 -FF00 -B900 -E600 -F780 -FE00 -2400 -1800 -E780 -ENDCHAR -STARTCHAR 96DB -ENCODING 38619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -F500 -F780 -FA00 -7700 -8600 -F700 -F600 -F780 -B400 -ENDCHAR -STARTCHAR 96DC -ENCODING 38620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -F600 -AF80 -AA00 -F700 -4A00 -F700 -6A00 -D780 -4800 -ENDCHAR -STARTCHAR 96E2 -ENCODING 38626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2500 -F500 -F780 -FA00 -F700 -4600 -F700 -F600 -9780 -B400 -ENDCHAR -STARTCHAR 96E3 -ENCODING 38627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A500 -F600 -EF80 -FA00 -DF00 -FA00 -FF00 -FA00 -6F80 -9800 -ENDCHAR -STARTCHAR 96E8 -ENCODING 38632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -FF -ED -AB -ED -AB -89 -8B -ENDCHAR -STARTCHAR 96E9 -ENCODING 38633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -EE80 -6E00 -7E00 -FF80 -4000 -7E00 -4600 -ENDCHAR -STARTCHAR 96EA -ENCODING 38634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -EE80 -8880 -6600 -7F00 -FF80 -0100 -7F00 -ENDCHAR -STARTCHAR 96EF -ENCODING 38639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -EE80 -EE80 -0800 -FF80 -2400 -1C00 -E380 -ENDCHAR -STARTCHAR 96F0 -ENCODING 38640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -EE80 -0000 -1C00 -4200 -FF00 -3200 -CC00 -ENDCHAR -STARTCHAR 96F2 -ENCODING 38642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -EF00 -8900 -6600 -7E00 -FF80 -2200 -FD00 -ENDCHAR -STARTCHAR 96F6 -ENCODING 38646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -EE80 -7E00 -6600 -BD80 -7E00 -1100 -1600 -ENDCHAR -STARTCHAR 96F7 -ENCODING 38647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -EF -89 -66 -7F -7F -49 -7F -ENDCHAR -STARTCHAR 96F9 -ENCODING 38649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -EE80 -EE80 -3E00 -F900 -C900 -7A80 -7F00 -ENDCHAR -STARTCHAR 96FB -ENCODING 38651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -EF00 -6E00 -7E00 -4900 -7E00 -7E80 -0F00 -ENDCHAR -STARTCHAR 9700 -ENCODING 38656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -EE80 -6E00 -FF80 -1000 -FF00 -A500 -A700 -ENDCHAR -STARTCHAR 9706 -ENCODING 38662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -8900 -6E00 -CC00 -6F00 -AF00 -4000 -FF80 -ENDCHAR -STARTCHAR 9707 -ENCODING 38663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -EE80 -0800 -FF00 -8000 -FF00 -BE00 -E300 -ENDCHAR -STARTCHAR 9711 -ENCODING 38673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -FF -EF -6E -44 -C7 -3F -5F -9F -ENDCHAR -STARTCHAR 9713 -ENCODING 38675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -8880 -0000 -7F00 -7700 -7F00 -2480 -C700 -ENDCHAR -STARTCHAR 9716 -ENCODING 38678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -EE80 -6E00 -4200 -FF00 -6500 -DA80 -4200 -ENDCHAR -STARTCHAR 9719 -ENCODING 38681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -8880 -2400 -FF80 -7E00 -4900 -FF80 -C380 -ENDCHAR -STARTCHAR 971C -ENCODING 38684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -EF -EF -4F -FF -A9 -DF -49 -ENDCHAR -STARTCHAR 971E -ENCODING 38686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -8880 -0000 -FF00 -FF00 -FF00 -F600 -8D80 -ENDCHAR -STARTCHAR 9727 -ENCODING 38695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -8880 -EC00 -4700 -FD80 -6400 -CF00 -4B00 -ENDCHAR -STARTCHAR 9730 -ENCODING 38704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -8880 -6400 -F780 -0D00 -F500 -F700 -B880 -ENDCHAR -STARTCHAR 9732 -ENCODING 38706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -EE80 -0C00 -EF00 -E600 -AF80 -F900 -CF00 -ENDCHAR -STARTCHAR 9739 -ENCODING 38713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -EE80 -0800 -FF00 -F500 -8F80 -FF00 -F200 -ENDCHAR -STARTCHAR 973D -ENCODING 38717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -8900 -EF00 -FF80 -F700 -AF00 -7E00 -7E00 -8100 -ENDCHAR -STARTCHAR 9742 -ENCODING 38722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -89 -EF -FF -F6 -B3 -F7 -AE -FF -ENDCHAR -STARTCHAR 9744 -ENCODING 38724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -BF -EF -66 -F9 -EF -ED -AF -EB -ENDCHAR -STARTCHAR 9748 -ENCODING 38728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -EE80 -6E00 -B500 -4A00 -FF00 -2900 -FF80 -ENDCHAR -STARTCHAR 9751 -ENCODING 38737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7F00 -FF80 -0000 -7E00 -4900 -7E00 -4100 -4600 -ENDCHAR -STARTCHAR 9756 -ENCODING 38742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF00 -0F00 -BF80 -A000 -AF00 -D500 -6F00 -D100 -1300 -ENDCHAR -STARTCHAR 975C -ENCODING 38748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -FF00 -EA80 -FF00 -0300 -EF80 -DD00 -E300 -9200 -AC00 -ENDCHAR -STARTCHAR 975E -ENCODING 38750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -1400 -E780 -1400 -E700 -2400 -E780 -2400 -4400 -4400 -ENDCHAR -STARTCHAR 9761 -ENCODING 38753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -F700 -F780 -F700 -9400 -F700 -F700 -F700 -2400 -ENDCHAR -STARTCHAR 9762 -ENCODING 38754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -1000 -FF00 -A500 -9D00 -A500 -9D00 -FF00 -8100 -ENDCHAR -STARTCHAR 9769 -ENCODING 38761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -3C00 -0800 -7F00 -8900 -7F00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR 976D -ENCODING 38765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -AF -F3 -A5 -ED -ED -DD -E5 -F9 -49 -57 -ENDCHAR -STARTCHAR 9774 -ENCODING 38772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A600 -FA00 -AA80 -EB00 -FA00 -DA00 -EA00 -FA80 -4A80 -4B80 -ENDCHAR -STARTCHAR 9777 -ENCODING 38775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -AF -F3 -A3 -EF -E9 -EF -EB -F3 -43 -4D -ENDCHAR -STARTCHAR 977A -ENCODING 38778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A200 -F200 -AF80 -E200 -FF80 -D600 -F500 -FB00 -5280 -4200 -ENDCHAR -STARTCHAR 978B -ENCODING 38795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A200 -FF00 -A200 -EF80 -F000 -D200 -FF00 -F200 -4200 -5F80 -ENDCHAR -STARTCHAR 978D -ENCODING 38797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A200 -FF00 -AC80 -EC80 -EF80 -D500 -EA00 -F600 -4500 -4880 -ENDCHAR -STARTCHAR 978F -ENCODING 38799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -7E80 -D380 -FF00 -3C00 -7F00 -7F00 -FF80 -0800 -ENDCHAR -STARTCHAR 97A0 -ENCODING 38816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -A8 -FF -B1 -FF -EF -DF -E7 -FF -45 -43 -ENDCHAR -STARTCHAR 97A8 -ENCODING 38824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -AF -F9 -EF -4F -E8 -EF -D5 -EB -4F -43 -ENDCHAR -STARTCHAR 97AB -ENCODING 38827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -A8 -FF -A9 -FF -EF -DF -EF -FF -4F -43 -ENDCHAR -STARTCHAR 97AD -ENCODING 38829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A800 -EF80 -B700 -F680 -F700 -F700 -F200 -F600 -5600 -5580 -ENDCHAR -STARTCHAR 97C6 -ENCODING 38854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -BF80 -F600 -AF80 -D500 -EF80 -E500 -F780 -FC00 -5700 -5F80 -ENDCHAR -STARTCHAR 97CB -ENCODING 38859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -FF00 -0000 -7E00 -7E00 -FF00 -4800 -FF80 -0800 -ENDCHAR -STARTCHAR 97D3 -ENCODING 38867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF00 -4F80 -E000 -EF00 -AF00 -E200 -FF00 -4F80 -4200 -ENDCHAR -STARTCHAR 97DC -ENCODING 38876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -EF00 -FD00 -1280 -E400 -EF00 -E880 -CF00 -FF00 -4880 -ENDCHAR -STARTCHAR 97F3 -ENCODING 38899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -24 -FF -00 -7E -42 -7E -7E -42 -ENDCHAR -STARTCHAR 97F6 -ENCODING 38902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -4F -F5 -A5 -A5 -FB -FF -99 -F9 -FF -99 -ENDCHAR -STARTCHAR 97FB -ENCODING 38907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -F900 -AF00 -FF00 -0900 -EF00 -AF00 -EF00 -E500 -A880 -ENDCHAR -STARTCHAR 97FF -ENCODING 38911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B80 -D700 -BF00 -DA80 -9F80 -7F00 -FF80 -7E00 -7E00 -7E00 -ENDCHAR -STARTCHAR 9800 -ENCODING 38912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4A00 -FF80 -AF00 -F200 -0F00 -EF80 -A000 -FF00 -E600 -B980 -ENDCHAR -STARTCHAR 9801 -ENCODING 38913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -10 -7E -7E -42 -7E -7E -26 -C1 -ENDCHAR -STARTCHAR 9802 -ENCODING 38914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -44 -5F -5F -51 -5F -5F -4B -D1 -ENDCHAR -STARTCHAR 9803 -ENCODING 38915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F80 -8400 -BF00 -DF00 -9100 -9F00 -BF00 -EA00 -3180 -ENDCHAR -STARTCHAR 9805 -ENCODING 38917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1F80 -E400 -5F00 -5F00 -5100 -7F00 -9F00 -0A00 -3180 -ENDCHAR -STARTCHAR 9806 -ENCODING 38918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F80 -D400 -DF00 -DF00 -D900 -DF00 -DF00 -DF00 -9880 -ENDCHAR -STARTCHAR 9808 -ENCODING 38920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -8400 -3F00 -DF00 -9100 -3F00 -5F00 -9A00 -A180 -ENDCHAR -STARTCHAR 980A -ENCODING 38922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -4400 -5F00 -FF00 -5100 -5F00 -7F00 -CA00 -3180 -ENDCHAR -STARTCHAR 980C -ENCODING 38924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -6F80 -A400 -AF00 -DF00 -6900 -AF00 -AF00 -DB00 -1080 -ENDCHAR -STARTCHAR 9810 -ENCODING 38928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF80 -2400 -4F00 -FF00 -5900 -6F00 -4F00 -4D00 -D080 -ENDCHAR -STARTCHAR 9811 -ENCODING 38929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF80 -0400 -FF00 -6F00 -A900 -AF00 -AF00 -BD00 -0880 -ENDCHAR -STARTCHAR 9812 -ENCODING 38930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -6F80 -A400 -9F00 -9F00 -E880 -5F00 -5F00 -A500 -E880 -ENDCHAR -STARTCHAR 9813 -ENCODING 38931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F80 -6200 -CF00 -DF00 -D900 -EF00 -5F00 -7700 -0880 -ENDCHAR -STARTCHAR 9817 -ENCODING 38935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -F400 -DF00 -C900 -FF00 -9900 -EF00 -AF00 -D500 -C880 -ENDCHAR -STARTCHAR 9818 -ENCODING 38936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F80 -A400 -9F00 -6F00 -F900 -5F00 -5F00 -7F00 -4880 -ENDCHAR -STARTCHAR 982D -ENCODING 38957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -0400 -EF00 -AF00 -E900 -AF00 -AF00 -3F00 -D080 -ENDCHAR -STARTCHAR 9830 -ENCODING 38960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -F200 -4F00 -D900 -DF00 -FF00 -6900 -6F00 -9500 -8880 -ENDCHAR -STARTCHAR 9838 -ENCODING 38968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -BF00 -D900 -DF00 -7900 -FF00 -4F00 -F500 -0880 -ENDCHAR -STARTCHAR 9839 -ENCODING 38969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF80 -4400 -FF00 -6F00 -D900 -AF00 -AF00 -BD00 -F880 -ENDCHAR -STARTCHAR 983B -ENCODING 38971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -C400 -BF00 -C900 -FF00 -C900 -DF00 -EF00 -4F00 -9080 -ENDCHAR -STARTCHAR 9846 -ENCODING 38982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -D200 -F700 -F700 -4880 -F700 -E700 -D500 -4880 -ENDCHAR -STARTCHAR 984C -ENCODING 38988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -F900 -0F00 -FF00 -AF00 -B500 -C900 -BF80 -ENDCHAR -STARTCHAR 984D -ENCODING 38989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -F200 -D700 -7900 -E700 -6900 -9700 -F700 -F500 -9880 -ENDCHAR -STARTCHAR 984E -ENCODING 38990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -F200 -0700 -F700 -F900 -4700 -F700 -9500 -6880 -ENDCHAR -STARTCHAR 9854 -ENCODING 38996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2F80 -F200 -5700 -F700 -A900 -F700 -C700 -9500 -E880 -ENDCHAR -STARTCHAR 9858 -ENCODING 39000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F780 -A200 -F700 -F700 -CD00 -F700 -F700 -AD00 -A880 -ENDCHAR -STARTCHAR 985A -ENCODING 39002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF80 -F200 -0700 -F700 -D900 -F700 -F700 -A500 -9880 -ENDCHAR -STARTCHAR 985E -ENCODING 39006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D000 -EF80 -FF00 -6900 -DF00 -5F00 -F900 -4F00 -E500 -9880 -ENDCHAR -STARTCHAR 9865 -ENCODING 39013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -F400 -FF00 -FF00 -0900 -EF00 -EF00 -D500 -C880 -ENDCHAR -STARTCHAR 9867 -ENCODING 39015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -F200 -9700 -F700 -F900 -F700 -D700 -F500 -C880 -ENDCHAR -STARTCHAR 986B -ENCODING 39019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F000 -0F80 -F700 -F900 -9700 -6700 -F900 -F700 -F500 -E880 -ENDCHAR -STARTCHAR 986F -ENCODING 39023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -F200 -9700 -F700 -E900 -F700 -CF00 -F500 -E880 -ENDCHAR -STARTCHAR 98A8 -ENCODING 39080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -8D00 -B100 -BD00 -B500 -BD00 -9580 -8D80 -F380 -ENDCHAR -STARTCHAR 98AF -ENCODING 39087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5F00 -F300 -1D00 -DF00 -DF00 -DF00 -5F00 -A780 -3980 -ENDCHAR -STARTCHAR 98B1 -ENCODING 39089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FA00 -9B00 -EF00 -F880 -FB00 -FC80 -F700 -BC80 -EB00 -ENDCHAR -STARTCHAR 98C4 -ENCODING 39108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -F300 -AD00 -F700 -F700 -1700 -F700 -D780 -D980 -ENDCHAR -STARTCHAR 98C7 -ENCODING 39111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F300 -B780 -D200 -ED80 -B780 -AD80 -F500 -BC80 -D300 -ENDCHAR -STARTCHAR 98DB -ENCODING 39131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FD00 -3600 -D300 -5280 -FD00 -5500 -5300 -5280 -9100 -ENDCHAR -STARTCHAR 98DC -ENCODING 39132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2E80 -ED00 -FD80 -6D80 -DF00 -FF00 -DD80 -ED00 -F580 -ENDCHAR -STARTCHAR 98DF -ENCODING 39135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1C00 -7E00 -8180 -7E00 -7E00 -7E00 -4900 -5E00 -E100 -ENDCHAR -STARTCHAR 98E1 -ENCODING 39137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8C00 -5F00 -2080 -1F00 -1F00 -5F00 -5500 -9E00 -B180 -ENDCHAR -STARTCHAR 98E2 -ENCODING 39138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6E00 -9A00 -EA00 -EA00 -EA00 -9A00 -EA00 -EA00 -F280 -9180 -ENDCHAR -STARTCHAR 98ED -ENCODING 39149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6400 -E780 -F800 -FC00 -FF00 -9480 -F500 -F500 -F900 -8B00 -ENDCHAR -STARTCHAR 98EE -ENCODING 39150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6400 -A400 -FF00 -ED00 -ED00 -9400 -F600 -8600 -F900 -9080 -ENDCHAR -STARTCHAR 98EF -ENCODING 39151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6F80 -E800 -9800 -EF00 -ED00 -AD00 -EA00 -EA00 -F500 -9880 -ENDCHAR -STARTCHAR 98F4 -ENCODING 39156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -A400 -F500 -EB00 -E480 -AF00 -E900 -E900 -EF00 -8900 -ENDCHAR -STARTCHAR 98FC -ENCODING 39164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -6F -91 -EF -E1 -EF -9B -EF -EB -E1 -83 -ENDCHAR -STARTCHAR 98FD -ENCODING 39165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6800 -AF00 -F080 -FF00 -FB00 -AF00 -EB00 -E800 -E880 -8F00 -ENDCHAR -STARTCHAR 98FE -ENCODING 39166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6800 -BF80 -EA00 -E200 -EF00 -AA80 -EA80 -EA80 -EB00 -8200 -ENDCHAR -STARTCHAR 9903 -ENCODING 39171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6400 -AF80 -EA00 -E900 -F080 -A900 -E600 -E400 -EF00 -9180 -ENDCHAR -STARTCHAR 9909 -ENCODING 39177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -44 -A4 -FF -F7 -F7 -B7 -F7 -97 -F1 -91 -ENDCHAR -STARTCHAR 990A -ENCODING 39178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -7F00 -FF80 -2A00 -FF00 -FF80 -7F00 -5E00 -E380 -ENDCHAR -STARTCHAR 990C -ENCODING 39180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -6F80 -F900 -8F00 -E900 -EF00 -E900 -E980 -EF00 -8100 -ENDCHAR -STARTCHAR 9910 -ENCODING 39184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -3F00 -F600 -7E00 -B580 -4A00 -FF80 -7E00 -7D00 -FB80 -ENDCHAR -STARTCHAR 9913 -ENCODING 39187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -BB00 -CA80 -FF80 -EA00 -AF00 -FB00 -EA00 -EA80 -9D00 -ENDCHAR -STARTCHAR 9918 -ENCODING 39192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6200 -F600 -8900 -EE80 -E200 -AF00 -EB00 -EB00 -F280 -8400 -ENDCHAR -STARTCHAR 991E -ENCODING 39198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6A00 -A900 -EE00 -E680 -EB00 -AA00 -FF80 -8500 -E680 -9900 -ENDCHAR -STARTCHAR 9920 -ENCODING 39200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6500 -E900 -8F80 -E900 -E900 -AF80 -E900 -8900 -E900 -9100 -ENDCHAR -STARTCHAR 9928 -ENCODING 39208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF80 -F080 -EF00 -E900 -AF00 -E800 -EF00 -EF00 -8900 -ENDCHAR -STARTCHAR 9945 -ENCODING 39237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -E900 -1F00 -E000 -AF80 -EF80 -EF00 -8900 -E600 -9980 -ENDCHAR -STARTCHAR 9949 -ENCODING 39241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -FF80 -0700 -E200 -EF00 -AF00 -EF80 -8F00 -E200 -9F80 -ENDCHAR -STARTCHAR 994B -ENCODING 39243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6200 -EF00 -0F00 -EF80 -EF00 -AF00 -EF00 -8F00 -ED00 -9080 -ENDCHAR -STARTCHAR 994C -ENCODING 39244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7F00 -D680 -1F00 -FF80 -EA00 -BF00 -EA00 -9F80 -EB00 -9080 -ENDCHAR -STARTCHAR 994D -ENCODING 39245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6900 -AF00 -EF00 -EF80 -ED00 -BF80 -E000 -EF00 -EF00 -8900 -ENDCHAR -STARTCHAR 9951 -ENCODING 39249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -BE00 -DF00 -D500 -DF80 -BF80 -D300 -DA00 -D680 -AD00 -ENDCHAR -STARTCHAR 9952 -ENCODING 39250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6400 -CF00 -1F00 -E900 -FF80 -BB80 -FF80 -8A00 -EA80 -9300 -ENDCHAR -STARTCHAR 9954 -ENCODING 39252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -CA00 -6E00 -FF00 -E400 -FF80 -7E00 -4D00 -FB00 -ENDCHAR -STARTCHAR 9957 -ENCODING 39255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4B80 -F700 -5F00 -DE80 -6300 -BC00 -FF80 -3E00 -3E00 -FF00 -ENDCHAR -STARTCHAR 9996 -ENCODING 39318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -24 -FF -10 -7E -42 -7E -7E -7E -42 -ENDCHAR -STARTCHAR 9999 -ENCODING 39321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0600 -7800 -FF00 -1400 -6A00 -FF80 -4200 -7E00 -4200 -7E00 -ENDCHAR -STARTCHAR 999D -ENCODING 39325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2500 -C300 -F500 -D500 -4F00 -EE80 -F400 -ED00 -AF00 -ENDCHAR -STARTCHAR 99A5 -ENCODING 39333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -EF80 -FF00 -6900 -EF00 -DF00 -E700 -ED00 -E600 -9980 -ENDCHAR -STARTCHAR 99A8 -ENCODING 39336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F680 -F900 -0F00 -F600 -8F80 -FC00 -EF00 -FF00 -7E00 -7E00 -ENDCHAR -STARTCHAR 99AC -ENCODING 39340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -48 -7E -7E -48 -7F -AD -AB -A3 -ENDCHAR -STARTCHAR 99AD -ENCODING 39341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -F900 -A500 -F500 -A500 -F200 -D200 -B500 -3880 -ENDCHAR -STARTCHAR 99AE -ENCODING 39342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -64 -3F -3F -64 -7F -B7 -AD -43 -ENDCHAR -STARTCHAR 99B1 -ENCODING 39345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -A200 -F200 -AF80 -F200 -F600 -F600 -B500 -9900 -2880 -ENDCHAR -STARTCHAR 99B3 -ENCODING 39347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -CA00 -EB00 -CF00 -FB00 -FB00 -BB00 -BA00 -9880 -2F00 -ENDCHAR -STARTCHAR 99B4 -ENCODING 39348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F9 -AB -FB -FB -AB -FB -BB -9B -31 -ENDCHAR -STARTCHAR 99B9 -ENCODING 39353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -F9 -C9 -F9 -CF -F9 -99 -9F -39 -ENDCHAR -STARTCHAR 99C1 -ENCODING 39361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FD00 -A300 -FD00 -F500 -A500 -F200 -B600 -9D00 -3880 -ENDCHAR -STARTCHAR 99D0 -ENCODING 39376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -A200 -FF80 -A200 -F200 -FF00 -B200 -B200 -9200 -2F80 -ENDCHAR -STARTCHAR 99D1 -ENCODING 39377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -F500 -A600 -FD80 -7F00 -7E00 -7E00 -4800 -FF00 -AB00 -ENDCHAR -STARTCHAR 99D2 -ENCODING 39378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F4 -CF -F9 -D1 -EF -FB -BF -DB -91 -23 -ENDCHAR -STARTCHAR 99D5 -ENCODING 39381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -47 -F5 -77 -00 -7F -48 -7E -7F -AD -AB -ENDCHAR -STARTCHAR 99D9 -ENCODING 39385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F500 -C500 -E900 -CF80 -ED00 -FB00 -BB00 -B900 -9900 -2B00 -ENDCHAR -STARTCHAR 99DD -ENCODING 39389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -AF80 -E880 -A880 -E500 -F700 -F400 -B400 -9480 -2700 -ENDCHAR -STARTCHAR 99DF -ENCODING 39391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -EF -CF -EF -CF -FF -B9 -9F -29 -ENDCHAR -STARTCHAR 99ED -ENCODING 39405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -FF80 -E400 -C900 -E600 -F500 -F900 -B200 -9D00 -6880 -ENDCHAR -STARTCHAR 99F1 -ENCODING 39409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -C700 -E900 -D600 -E700 -F980 -BF00 -B900 -9F00 -6900 -ENDCHAR -STARTCHAR 99FF -ENCODING 39423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -C900 -EF00 -CA80 -EF00 -F700 -B900 -A600 -A700 -7880 -ENDCHAR -STARTCHAR 9A01 -ENCODING 39425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -CF00 -EF00 -CD00 -EF00 -EF80 -E400 -AF00 -A900 -6300 -ENDCHAR -STARTCHAR 9A08 -ENCODING 39432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F500 -A500 -EF80 -A500 -E500 -FF80 -E500 -A900 -9900 -7100 -ENDCHAR -STARTCHAR 9A0E -ENCODING 39438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -CF00 -E600 -C900 -FF80 -F100 -EF00 -AF00 -9B00 -6300 -ENDCHAR -STARTCHAR 9A0F -ENCODING 39439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -CF80 -E900 -CF00 -E900 -EF00 -DF80 -A000 -A900 -7080 -ENDCHAR -STARTCHAR 9A19 -ENCODING 39449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -E1 -CE -EF -C9 -CF -EF -EF -FF -BF -7D -ENDCHAR -STARTCHAR 9A2B -ENCODING 39467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2400 -3C00 -FF80 -7F80 -C800 -7C00 -FF00 -AF00 -ENDCHAR -STARTCHAR 9A30 -ENCODING 39472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CD00 -BF00 -AA00 -DF80 -BF00 -FF80 -BF00 -BF00 -BF00 -DF00 -ENDCHAR -STARTCHAR 9A36 -ENCODING 39478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F8 -CF -FF -CF -ED -F8 -BF -BF -9F -2B -ENDCHAR -STARTCHAR 9A37 -ENCODING 39479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -CB00 -EE00 -E980 -C200 -FF00 -AF00 -9300 -6E80 -ENDCHAR -STARTCHAR 9A40 -ENCODING 39488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -7E00 -7E00 -7E00 -FF80 -7E00 -C980 -7C00 -BF00 -AB00 -ENDCHAR -STARTCHAR 9A43 -ENCODING 39491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -CF00 -F680 -EF00 -CF00 -E000 -EF80 -AB00 -7480 -ENDCHAR -STARTCHAR 9A45 -ENCODING 39493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF80 -CF00 -ED00 -EF00 -CD00 -EA80 -ED00 -A800 -6F80 -ENDCHAR -STARTCHAR 9A4D -ENCODING 39501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -CF00 -FF80 -C900 -EF00 -EF80 -D000 -EF80 -A680 -7B00 -ENDCHAR -STARTCHAR 9A55 -ENCODING 39509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E300 -CE00 -FF80 -CF00 -FE80 -EF00 -F100 -F700 -B700 -7100 -ENDCHAR -STARTCHAR 9A57 -ENCODING 39511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E600 -C600 -EF00 -D080 -EF00 -EF00 -E000 -A900 -AD00 -7280 -ENDCHAR -STARTCHAR 9A5A -ENCODING 39514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5400 -FF80 -8D00 -F380 -4C00 -7F00 -4800 -7F00 -AD00 -AB00 -ENDCHAR -STARTCHAR 9A5B -ENCODING 39515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EF00 -EE80 -CF00 -EF00 -CF80 -E980 -EF00 -A200 -6200 -ENDCHAR -STARTCHAR 9A5F -ENCODING 39519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FC00 -EF00 -CD00 -FE80 -C700 -EC00 -FB00 -ED00 -7C80 -ENDCHAR -STARTCHAR 9A62 -ENCODING 39522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -C600 -EF00 -D480 -F700 -F700 -F700 -F000 -FF80 -7F80 -ENDCHAR -STARTCHAR 9A65 -ENCODING 39525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E700 -DF80 -F780 -CF00 -EF00 -EF00 -E900 -FF80 -AD00 -7080 -ENDCHAR -STARTCHAR 9A69 -ENCODING 39529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7280 -6FC0 -7780 -6B80 -7700 -77C0 -6F80 -5500 -D7C0 -3400 -ENDCHAR -STARTCHAR 9A6A -ENCODING 39530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -DF00 -F480 -EF80 -CF00 -EF00 -FA00 -F780 -7F80 -ENDCHAR -STARTCHAR 9AA8 -ENCODING 39592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -4E -52 -FF -FF -7E -42 -7E -46 -ENDCHAR -STARTCHAR 9AB8 -ENCODING 39608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E200 -9F80 -F400 -F900 -F600 -AD00 -E900 -E200 -AD00 -A880 -ENDCHAR -STARTCHAR 9AD3 -ENCODING 39635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -AF80 -EA00 -FF80 -E700 -BF00 -ED00 -EF00 -AD00 -B780 -ENDCHAR -STARTCHAR 9AD4 -ENCODING 39636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E600 -AF00 -EF00 -FF00 -F000 -AF80 -EF00 -EF00 -A600 -FF80 -ENDCHAR -STARTCHAR 9AD8 -ENCODING 39640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7E00 -7E00 -0000 -FF00 -BD00 -BD00 -A100 -8300 -ENDCHAR -STARTCHAR 9AE5 -ENCODING 39653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7600 -8100 -E600 -FF00 -C800 -7E00 -FF80 -7E00 -4600 -ENDCHAR -STARTCHAR 9AEE -ENCODING 39662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7300 -7500 -7600 -F980 -F600 -1600 -FF80 -3200 -4C00 -F380 -ENDCHAR -STARTCHAR 9B1A -ENCODING 39706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7600 -4100 -FF80 -F600 -7F00 -EF00 -B100 -4F00 -9B80 -ENDCHAR -STARTCHAR 9B27 -ENCODING 39719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -FF -A5 -FF -81 -89 -FF -BF -AB -AF -8B -ENDCHAR -STARTCHAR 9B2A -ENCODING 39722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -FF -A5 -FF -81 -F3 -FF -FB -D7 -F7 -81 -ENDCHAR -STARTCHAR 9B31 -ENCODING 39729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5900 -CB00 -4900 -0000 -FF80 -6A00 -7900 -9680 -EB00 -FC00 -ENDCHAR -STARTCHAR 9B3C -ENCODING 39740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4900 -7E00 -4900 -7E00 -2A00 -2F00 -4880 -8F00 -ENDCHAR -STARTCHAR 9B41 -ENCODING 39745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -F500 -B300 -F500 -B500 -F380 -7700 -7900 -B880 -BF00 -ENDCHAR -STARTCHAR 9B42 -ENCODING 39746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -1500 -FF00 -5500 -BF00 -AC00 -EF80 -1480 -3380 -ENDCHAR -STARTCHAR 9B43 -ENCODING 39747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -F500 -DF80 -F500 -D500 -FA00 -7300 -BB00 -A480 -BF00 -ENDCHAR -STARTCHAR 9B44 -ENCODING 39748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -DF00 -B500 -BF00 -D500 -BF00 -AE00 -CB80 -B480 -2380 -ENDCHAR -STARTCHAR 9B45 -ENCODING 39749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -D200 -FF80 -D200 -F700 -BA80 -BA00 -A080 -BF00 -ENDCHAR -STARTCHAR 9B4F -ENCODING 39759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -CF00 -FB00 -6F00 -DB00 -4F00 -F700 -AB80 -6A80 -9300 -ENDCHAR -STARTCHAR 9B54 -ENCODING 39764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -AF80 -DB00 -BF00 -BF00 -BF00 -9A80 -E700 -ENDCHAR -STARTCHAR 9B5A -ENCODING 39770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -3C00 -4800 -FE00 -C900 -7E00 -7E00 -4100 -9500 -9480 -ENDCHAR -STARTCHAR 9B6F -ENCODING 39791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7800 -FF00 -7F00 -7F00 -A500 -FE80 -4200 -7E00 -7E00 -ENDCHAR -STARTCHAR 9B8E -ENCODING 39822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -6200 -A380 -F200 -D200 -FF00 -F880 -F880 -FF00 -C880 -ENDCHAR -STARTCHAR 9B91 -ENCODING 39825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6F00 -A880 -FE80 -DB00 -FF00 -FB00 -B800 -F880 -EF00 -ENDCHAR -STARTCHAR 9B9F -ENCODING 39839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -6F80 -AC80 -E400 -DF80 -E500 -EE00 -9200 -F500 -E880 -ENDCHAR -STARTCHAR 9BAB -ENCODING 39851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -EF80 -A600 -E900 -D080 -E900 -E600 -A600 -FD00 -D080 -ENDCHAR -STARTCHAR 9BAE -ENCODING 39854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -6500 -AF00 -F200 -DF00 -F200 -FF80 -F200 -F200 -F200 -ENDCHAR -STARTCHAR 9BC9 -ENCODING 39881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -EB00 -AB00 -EF00 -DB00 -EF00 -EF00 -E200 -F200 -CF80 -ENDCHAR -STARTCHAR 9BD6 -ENCODING 39894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -EF80 -AF00 -EF80 -E000 -EF00 -EB00 -8F00 -B900 -EB00 -ENDCHAR -STARTCHAR 9BE4 -ENCODING 39908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -6900 -AF00 -FF00 -D000 -FA00 -FE80 -EB00 -FE80 -FB80 -ENDCHAR -STARTCHAR 9BE8 -ENCODING 39912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -6F80 -A000 -FF00 -D900 -FF00 -F200 -EB00 -FA80 -CE00 -ENDCHAR -STARTCHAR 9C0D -ENCODING 39949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4E00 -DA00 -CE80 -FE80 -EF00 -FA00 -FF00 -8B00 -8C80 -8C80 -ENDCHAR -STARTCHAR 9C10 -ENCODING 39952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F00 -F680 -AF00 -EF00 -E000 -EF80 -0700 -F900 -E700 -ENDCHAR -STARTCHAR 9C12 -ENCODING 39954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -6F80 -AF00 -F900 -DF00 -FF00 -F700 -FD00 -F600 -E980 -ENDCHAR -STARTCHAR 9C15 -ENCODING 39957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2F80 -7A40 -5A40 -7F80 -7800 -7FC0 -7980 -5E80 -5980 -AA40 -ENDCHAR -STARTCHAR 9C25 -ENCODING 39973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2780 -7740 -5740 -7780 -6D80 -7540 -7300 -4580 -6D40 -B900 -ENDCHAR -STARTCHAR 9C32 -ENCODING 39986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -4780 -FD00 -7200 -BD80 -7800 -FE00 -7E00 -7E00 -9500 -ENDCHAR -STARTCHAR 9C3B -ENCODING 39995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -E900 -AF00 -E000 -EF00 -EF00 -E000 -8F00 -F600 -F980 -ENDCHAR -STARTCHAR 9C47 -ENCODING 40007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -EF80 -B700 -F300 -EF80 -F700 -F700 -1700 -BA80 -B600 -ENDCHAR -STARTCHAR 9C49 -ENCODING 40009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5400 -B780 -FD00 -AA00 -B580 -7F00 -C900 -7F00 -8100 -A480 -ENDCHAR -STARTCHAR 9C57 -ENCODING 40023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4D00 -ED00 -BF80 -EA00 -F580 -ED00 -F780 -9B80 -9900 -9100 -ENDCHAR -STARTCHAR 9CE5 -ENCODING 40165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -7E00 -4200 -7E00 -7F80 -7F00 -0500 -AB00 -AB00 -ENDCHAR -STARTCHAR 9CE7 -ENCODING 40167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -7E00 -7F00 -7F00 -B500 -B700 -3C00 -4480 -8700 -ENDCHAR -STARTCHAR 9CE9 -ENCODING 40169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -8F00 -CF00 -B100 -AF00 -AF80 -AF00 -BE80 -9B00 -1B00 -ENDCHAR -STARTCHAR 9CF3 -ENCODING 40179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FE00 -BE00 -A600 -BE00 -BA00 -BD00 -8500 -FD80 -CD00 -ENDCHAR -STARTCHAR 9CF4 -ENCODING 40180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF00 -BF00 -B100 -BF00 -BF80 -DF00 -BE80 -1D00 -2B00 -ENDCHAR -STARTCHAR 9CF6 -ENCODING 40182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -FF80 -1480 -7F00 -4200 -7E00 -7F00 -7F00 -AD00 -AB00 -ENDCHAR -STARTCHAR 9D09 -ENCODING 40201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -AF00 -A900 -FF00 -2F80 -6F00 -BA80 -B700 -7300 -ENDCHAR -STARTCHAR 9D1B -ENCODING 40219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -7F -AF -50 -EE -7E -7C -7F -BF -AB -ENDCHAR -STARTCHAR 9D26 -ENCODING 40230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7E00 -FF80 -3E00 -C380 -7E00 -7E00 -7F00 -AD00 -AB00 -ENDCHAR -STARTCHAR 9D28 -ENCODING 40232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -EF00 -DF00 -E900 -DE00 -DF80 -EF00 -5D00 -5500 -4300 -ENDCHAR -STARTCHAR 9D3B -ENCODING 40251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -2F00 -A900 -AF00 -2F80 -7F00 -EA80 -9500 -9300 -ENDCHAR -STARTCHAR 9D51 -ENCODING 40273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AF00 -EF00 -0900 -EF00 -EF80 -AF00 -ED00 -B680 -A300 -ENDCHAR -STARTCHAR 9D5D -ENCODING 40285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -6000 -B700 -B700 -F900 -A700 -7780 -B700 -AE80 -AF00 -D300 -ENDCHAR -STARTCHAR 9D60 -ENCODING 40288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C400 -CF00 -FF00 -C900 -FF00 -0F80 -FF00 -9A80 -F700 -9300 -ENDCHAR -STARTCHAR 9D61 -ENCODING 40289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FF00 -3F00 -F900 -6F00 -EF80 -EF80 -EE80 -EF00 -9900 -ENDCHAR -STARTCHAR 9D6C -ENCODING 40300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -EF00 -EF00 -F500 -EF00 -EF80 -F700 -EB00 -EA80 -7100 -ENDCHAR -STARTCHAR 9D72 -ENCODING 40306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -EF00 -AF00 -F900 -0F00 -EF80 -AF00 -E880 -F480 -B300 -ENDCHAR -STARTCHAR 9DA9 -ENCODING 40361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -6780 -FE00 -7D80 -7E00 -7E00 -4000 -7F00 -B500 -B700 -ENDCHAR -STARTCHAR 9DAF -ENCODING 40367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B700 -EE00 -DD00 -FF00 -C300 -7E00 -7C00 -7F80 -AD00 -AB00 -ENDCHAR -STARTCHAR 9DB4 -ENCODING 40372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -DF00 -A900 -FF00 -FF80 -AF80 -FD00 -FF00 -8B00 -ENDCHAR -STARTCHAR 9DC4 -ENCODING 40388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3400 -EF00 -CF00 -6900 -AF00 -FF80 -5F00 -FF00 -6F00 -9300 -ENDCHAR -STARTCHAR 9DD7 -ENCODING 40407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -8F00 -FF00 -F900 -8F00 -DF80 -BF80 -DE80 -FF00 -8B00 -ENDCHAR -STARTCHAR 9DF2 -ENCODING 40434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F500 -FF80 -F680 -DB00 -9000 -7E00 -7E00 -7F00 -8100 -AF00 -ENDCHAR -STARTCHAR 9DF8 -ENCODING 40440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -6700 -F700 -B700 -6400 -F780 -F700 -F700 -EE80 -9300 -ENDCHAR -STARTCHAR 9DF9 -ENCODING 40441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -AA00 -FF00 -A800 -B700 -BE00 -BF80 -BF00 -DB00 -ENDCHAR -STARTCHAR 9DFA -ENCODING 40442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -FE00 -AD80 -FF00 -D000 -7E00 -7E00 -7F00 -7F00 -AF00 -ENDCHAR -STARTCHAR 9E1A -ENCODING 40474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F200 -F700 -F700 -F900 -F700 -4780 -F780 -AF00 -6E80 -D100 -ENDCHAR -STARTCHAR 9E1E -ENCODING 40478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -4300 -FB80 -DA80 -7900 -7E00 -7E00 -7F80 -7F00 -B500 -ENDCHAR -STARTCHAR 9E75 -ENCODING 40565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -1F -10 -FF -AD -DB -BF -AB -FF -81 -ENDCHAR -STARTCHAR 9E79 -ENCODING 40569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -7100 -4F80 -FE00 -B980 -FD00 -DB00 -BD00 -F380 -9280 -ENDCHAR -STARTCHAR 9E7D -ENCODING 40573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F800 -CF00 -EB00 -9E80 -EB00 -CF00 -FF00 -7F00 -9500 -FF80 -ENDCHAR -STARTCHAR 9E7F -ENCODING 40575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9400 -FF00 -FF00 -A400 -A500 -BE00 -BC80 -E700 -ENDCHAR -STARTCHAR 9E92 -ENCODING 40594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2500 -FF80 -E500 -F700 -F500 -E700 -F500 -DF80 -ED00 -D880 -ENDCHAR -STARTCHAR 9E93 -ENCODING 40595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -DB00 -4A00 -FF80 -FF00 -FF00 -A500 -B680 -E700 -ENDCHAR -STARTCHAR 9E97 -ENCODING 40599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -9900 -8800 -FF00 -FF00 -FF00 -A500 -BE80 -E700 -ENDCHAR -STARTCHAR 9E9D -ENCODING 40605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -B500 -7700 -2100 -7F80 -7D00 -F500 -9300 -ENDCHAR -STARTCHAR 9E9F -ENCODING 40607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2B00 -F700 -EF80 -F700 -FA80 -A500 -BB80 -E780 -B500 -F900 -ENDCHAR -STARTCHAR 9EA5 -ENCODING 40613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2A00 -6A00 -3500 -6A00 -BF80 -5400 -1C00 -E300 -ENDCHAR -STARTCHAR 9EB4 -ENCODING 40628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -F700 -DC80 -FE80 -E480 -DF00 -F700 -ED00 -6300 -9F80 -ENDCHAR -STARTCHAR 9EB5 -ENCODING 40629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -F200 -DF00 -7E80 -EE80 -DE80 -FE80 -6F00 -6880 -9F80 -ENDCHAR -STARTCHAR 9EBB -ENCODING 40635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -A200 -F700 -A200 -F700 -F700 -F780 -EB80 -A200 -ENDCHAR -STARTCHAR 9EBE -ENCODING 40638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -F700 -F780 -F780 -8600 -B800 -BF00 -E880 -8F00 -ENDCHAR -STARTCHAR 9EC3 -ENCODING 40643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF00 -3C00 -FF80 -0800 -7E00 -7E00 -7E00 -2600 -C180 -ENDCHAR -STARTCHAR 9ECD -ENCODING 40653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0200 -7C00 -FF00 -6E00 -9980 -6E00 -AB80 -3C00 -4E00 -9100 -ENDCHAR -STARTCHAR 9ECE -ENCODING 40654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -E700 -FB00 -5500 -BF00 -6600 -C980 -3A00 -4C00 -9B00 -ENDCHAR -STARTCHAR 9ED1 -ENCODING 40657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -6B00 -6D00 -7F00 -7F00 -FF80 -0000 -A500 -9480 -ENDCHAR -STARTCHAR 9ED4 -ENCODING 40660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F600 -B600 -D900 -FF00 -F080 -3F00 -C100 -E900 -E200 -ENDCHAR -STARTCHAR 9ED8 -ENCODING 40664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F300 -B280 -D200 -FF80 -2200 -F200 -F500 -1500 -E880 -C880 -ENDCHAR -STARTCHAR 9EDB -ENCODING 40667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -CB80 -DC80 -4300 -7E00 -6D00 -FF00 -FF80 -4500 -9480 -ENDCHAR -STARTCHAR 9EDC -ENCODING 40668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -F2 -DB -BB -DB -FF -F2 -7B -DB -FF -E9 -ENDCHAR -STARTCHAR 9EDE -ENCODING 40670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F200 -B200 -B380 -F200 -F200 -3F00 -C880 -EF00 -E880 -ENDCHAR -STARTCHAR 9EE8 -ENCODING 40680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2A00 -FF00 -BE80 -3E00 -7F00 -6D00 -FF00 -FF80 -4500 -9480 -ENDCHAR -STARTCHAR 9EF4 -ENCODING 40692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7600 -BA00 -C380 -7B00 -BF00 -BB00 -B900 -BD00 -AB00 -D480 -ENDCHAR -STARTCHAR 9F07 -ENCODING 40711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -F700 -FD00 -7200 -AD80 -DB00 -7E00 -9F00 -F780 -1F00 -ENDCHAR -STARTCHAR 9F08 -ENCODING 40712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B400 -F780 -DA00 -B580 -7F00 -7F00 -FF00 -FF00 -FF00 -1F80 -ENDCHAR -STARTCHAR 9F0E -ENCODING 40718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -3C00 -BD00 -BD00 -BD00 -8100 -F700 -F780 -5500 -9500 -ENDCHAR -STARTCHAR 9F13 -ENCODING 40723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -F200 -FF80 -0200 -FF00 -F500 -0600 -A600 -7D00 -C880 -ENDCHAR -STARTCHAR 9F20 -ENCODING 40736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -8100 -FF00 -FF00 -B600 -B600 -B600 -B580 -D900 -ENDCHAR -STARTCHAR 9F3B -ENCODING 40763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -7E00 -4200 -7E00 -0000 -7F00 -8900 -FF80 -3C00 -C400 -ENDCHAR -STARTCHAR 9F4A -ENCODING 40778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -FF00 -AD00 -EE80 -4200 -7E00 -7E00 -8200 -8200 -ENDCHAR -STARTCHAR 9F4B -ENCODING 40779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -F600 -6F00 -E880 -7E00 -4100 -7E00 -ED00 -AD00 -ENDCHAR -STARTCHAR 9F4E -ENCODING 40782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0900 -FE00 -E900 -7F00 -4100 -7D00 -BD00 -BD00 -A700 -ENDCHAR -STARTCHAR 9F52 -ENCODING 40786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2800 -2F00 -FF80 -A500 -BB00 -C900 -FF00 -A500 -DB00 -FF00 -ENDCHAR -STARTCHAR 9F5F -ENCODING 40799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -A700 -B500 -F500 -F700 -B500 -F700 -F500 -B500 -FF80 -ENDCHAR -STARTCHAR 9F61 -ENCODING 40801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -B500 -FD00 -EF80 -B000 -9700 -F480 -F480 -B500 -F400 -ENDCHAR -STARTCHAR 9F67 -ENCODING 40807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -4500 -F700 -4800 -2E00 -FF80 -AB00 -F500 -DB00 -FF00 -ENDCHAR -STARTCHAR 9F6A -ENCODING 40810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A700 -B900 -F900 -4900 -F700 -D600 -F700 -FA00 -FE00 -9B80 -ENDCHAR -STARTCHAR 9F6C -ENCODING 40812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2F80 -B200 -F700 -6500 -BF80 -9000 -F700 -B500 -F700 -9500 -ENDCHAR -STARTCHAR 9F77 -ENCODING 40823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2F00 -B880 -FF00 -B800 -BF80 -DB80 -FE00 -FF00 -FA00 -9780 -ENDCHAR -STARTCHAR 9F8D -ENCODING 40845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -F700 -A700 -F100 -F700 -9700 -F700 -F700 -9880 -B700 -ENDCHAR -STARTCHAR 9F90 -ENCODING 40848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FF00 -B700 -F900 -F700 -F400 -CE00 -FE80 -5700 -ENDCHAR -STARTCHAR 9F95 -ENCODING 40853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3C00 -DF80 -7E00 -0000 -FF00 -FF00 -F800 -FF00 -FF80 -B700 -ENDCHAR -STARTCHAR 9F9C -ENCODING 40860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7C00 -FF00 -7700 -D700 -F500 -1B00 -F700 -3880 -5F00 -ENDCHAR -STARTCHAR AC00 -ENCODING 44032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1100 -1180 -2100 -4100 -8100 -0100 -0100 -0100 -ENDCHAR -STARTCHAR AC01 -ENCODING 44033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -3180 -6100 -8100 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR AC02 -ENCODING 44034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -0900 -1180 -2100 -C100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR AC03 -ENCODING 44035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0900 -1180 -2100 -C100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR AC04 -ENCODING 44036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1180 -2100 -4100 -8100 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR AC05 -ENCODING 44037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0900 -1180 -2100 -C100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR AC06 -ENCODING 44038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -1180 -2100 -C000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR AC07 -ENCODING 44039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -6100 -8100 -0000 -7F00 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR AC08 -ENCODING 44040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -6100 -8000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR AC09 -ENCODING 44041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -6100 -8000 -7F00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR AC0A -ENCODING 44042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -6100 -8000 -7F00 -1900 -7900 -8900 -7F00 -ENDCHAR -STARTCHAR AC0B -ENCODING 44043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -1180 -2100 -C000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR AC0C -ENCODING 44044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -1180 -2100 -C000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR AC0D -ENCODING 44045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -1180 -2100 -C000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR AC0E -ENCODING 44046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -1180 -2100 -C000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR AC0F -ENCODING 44047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -1180 -2100 -C000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR AC10 -ENCODING 44048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1180 -6100 -8100 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR AC11 -ENCODING 44049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -6100 -8000 -4100 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR AC12 -ENCODING 44050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -6100 -8000 -4A00 -4A00 -7200 -4D00 -7480 -ENDCHAR -STARTCHAR AC13 -ENCODING 44051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1180 -2100 -4100 -8100 -0800 -0800 -3400 -4300 -ENDCHAR -STARTCHAR AC14 -ENCODING 44052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1180 -2100 -4100 -8000 -2200 -2200 -5500 -8980 -ENDCHAR -STARTCHAR AC15 -ENCODING 44053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1180 -6100 -8100 -3C00 -6200 -4100 -6200 -3C00 -ENDCHAR -STARTCHAR AC16 -ENCODING 44054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1180 -6100 -8100 -0000 -3F00 -0200 -0C00 -7300 -ENDCHAR -STARTCHAR AC17 -ENCODING 44055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -3100 -6100 -9C00 -0000 -7F00 -0200 -1C00 -6380 -ENDCHAR -STARTCHAR AC18 -ENCODING 44056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -0900 -1180 -2100 -C100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR AC19 -ENCODING 44057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -6100 -8000 -7F00 -4000 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR AC1A -ENCODING 44058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1180 -6100 -8100 -0000 -7F00 -2200 -2200 -7F00 -ENDCHAR -STARTCHAR AC1B -ENCODING 44059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -3180 -C100 -1C00 -0000 -7F00 -0000 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR AC1C -ENCODING 44060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -15 -27 -25 -45 -85 -05 -05 -05 -ENDCHAR -STARTCHAR AC1D -ENCODING 44061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -27 -45 -85 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AC1E -ENCODING 44062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -17 -25 -C5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR AC1F -ENCODING 44063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -1700 -2500 -C500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR AC20 -ENCODING 44064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -2700 -4500 -8500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR AC21 -ENCODING 44065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -1700 -2500 -C500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR AC22 -ENCODING 44066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR AC23 -ENCODING 44067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -17 -25 -C5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR AC24 -ENCODING 44068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -17 -65 -85 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR AC25 -ENCODING 44069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR AC26 -ENCODING 44070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR AC27 -ENCODING 44071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR AC28 -ENCODING 44072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR AC29 -ENCODING 44073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR AC2A -ENCODING 44074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AC2B -ENCODING 44075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR AC2C -ENCODING 44076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -27 -45 -85 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR AC2D -ENCODING 44077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -27 -45 -85 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR AC2E -ENCODING 44078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -1700 -2500 -C500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR AC2F -ENCODING 44079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -2700 -4500 -8500 -0500 -0900 -0C00 -3200 -4180 -ENDCHAR -STARTCHAR AC30 -ENCODING 44080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -2700 -4500 -8500 -0000 -1200 -1200 -3500 -4C80 -ENDCHAR -STARTCHAR AC31 -ENCODING 44081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -27 -45 -85 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR AC32 -ENCODING 44082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -1700 -2500 -C500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR AC33 -ENCODING 44083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -1500 -2700 -4500 -8500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR AC34 -ENCODING 44084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -17 -25 -C5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AC35 -ENCODING 44085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR AC36 -ENCODING 44086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -17 -25 -C5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR AC37 -ENCODING 44087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -27 -45 -85 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR AC38 -ENCODING 44088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -1100 -2180 -4100 -8100 -0100 -0100 -0100 -ENDCHAR -STARTCHAR AC39 -ENCODING 44089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -6180 -8100 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR AC3A -ENCODING 44090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR AC3B -ENCODING 44091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR AC3C -ENCODING 44092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -2100 -4180 -8100 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR AC3D -ENCODING 44093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -1100 -2180 -C100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR AC3E -ENCODING 44094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR AC3F -ENCODING 44095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR AC40 -ENCODING 44096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0980 -1100 -1180 -6100 -8000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR AC41 -ENCODING 44097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR AC42 -ENCODING 44098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR AC43 -ENCODING 44099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR AC44 -ENCODING 44100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR AC45 -ENCODING 44101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR AC46 -ENCODING 44102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR AC47 -ENCODING 44103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR AC48 -ENCODING 44104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR AC49 -ENCODING 44105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR AC4A -ENCODING 44106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR AC4B -ENCODING 44107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -2180 -4100 -8100 -0800 -0800 -3400 -4300 -ENDCHAR -STARTCHAR AC4C -ENCODING 44108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR AC4D -ENCODING 44109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -1100 -6180 -8100 -3C00 -6200 -4100 -6200 -3C00 -ENDCHAR -STARTCHAR AC4E -ENCODING 44110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR AC4F -ENCODING 44111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR AC50 -ENCODING 44112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR AC51 -ENCODING 44113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR AC52 -ENCODING 44114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -1100 -2180 -C100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR AC53 -ENCODING 44115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -1100 -2180 -C000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR AC54 -ENCODING 44116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -17 -15 -25 -27 -45 -85 -05 -05 -05 -ENDCHAR -STARTCHAR AC55 -ENCODING 44117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -15 -27 -C5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AC56 -ENCODING 44118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -15 -27 -C5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR AC57 -ENCODING 44119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -1500 -2700 -C500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR AC58 -ENCODING 44120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1700 -2500 -4700 -8500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR AC59 -ENCODING 44121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -1500 -2700 -C500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR AC5A -ENCODING 44122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR AC5B -ENCODING 44123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -15 -27 -C5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR AC5C -ENCODING 44124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -17 -15 -27 -45 -80 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR AC5D -ENCODING 44125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR AC5E -ENCODING 44126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR AC5F -ENCODING 44127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR AC60 -ENCODING 44128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR AC61 -ENCODING 44129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR AC62 -ENCODING 44130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AC63 -ENCODING 44131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR AC64 -ENCODING 44132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -15 -27 -C5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR AC65 -ENCODING 44133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -15 -27 -C5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR AC66 -ENCODING 44134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -1500 -2700 -C500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR AC67 -ENCODING 44135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -15 -27 -C5 -00 -08 -14 -63 -ENDCHAR -STARTCHAR AC68 -ENCODING 44136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -1500 -2700 -C500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR AC69 -ENCODING 44137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -15 -27 -C5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR AC6A -ENCODING 44138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -1500 -2700 -C500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR AC6B -ENCODING 44139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -1700 -2500 -4700 -8500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR AC6C -ENCODING 44140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -15 -27 -C5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AC6D -ENCODING 44141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR AC6E -ENCODING 44142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -15 -27 -C5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR AC6F -ENCODING 44143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -25 -47 -85 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR AC70 -ENCODING 44144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -17 -21 -41 -81 -01 -01 -01 -ENDCHAR -STARTCHAR AC71 -ENCODING 44145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -21 -C1 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AC72 -ENCODING 44146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -17 -21 -41 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR AC73 -ENCODING 44147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -1700 -2100 -4100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AC74 -ENCODING 44148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -17 -11 -61 -81 -01 -20 -20 -3F -ENDCHAR -STARTCHAR AC75 -ENCODING 44149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -17 -21 -41 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR AC76 -ENCODING 44150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -17 -21 -C1 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR AC77 -ENCODING 44151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -21 -C1 -00 -3F -20 -20 -3F -ENDCHAR -STARTCHAR AC78 -ENCODING 44152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -21 -C0 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR AC79 -ENCODING 44153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -17 -21 -C1 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR AC7A -ENCODING 44154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -21 -C0 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AC7B -ENCODING 44155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -17 -21 -C1 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR AC7C -ENCODING 44156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -17 -21 -C1 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR AC7D -ENCODING 44157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -17 -21 -C1 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR AC7E -ENCODING 44158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -17 -21 -C1 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AC7F -ENCODING 44159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -17 -21 -C1 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR AC80 -ENCODING 44160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -61 -C1 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR AC81 -ENCODING 44161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -21 -C0 -41 -41 -3F -41 -3F -ENDCHAR -STARTCHAR AC82 -ENCODING 44162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -1700 -2100 -4100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR AC83 -ENCODING 44163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -1700 -3100 -6100 -8100 -0800 -0C00 -1600 -6180 -ENDCHAR -STARTCHAR AC84 -ENCODING 44164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -1700 -2100 -C100 -0000 -1200 -2200 -3300 -4C80 -ENDCHAR -STARTCHAR AC85 -ENCODING 44165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -21 -C1 -1E -21 -41 -21 -1E -ENDCHAR -STARTCHAR AC86 -ENCODING 44166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -1700 -2100 -C100 -0000 -3F00 -0200 -0E00 -7180 -ENDCHAR -STARTCHAR AC87 -ENCODING 44167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0900 -1700 -2100 -C100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR AC88 -ENCODING 44168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -17 -21 -41 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AC89 -ENCODING 44169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -21 -C0 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR AC8A -ENCODING 44170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -17 -61 -C1 -00 -7F -12 -12 -7F -ENDCHAR -STARTCHAR AC8B -ENCODING 44171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -37 -C1 -1C -00 -7F -00 -1C -22 -1E -ENDCHAR -STARTCHAR AC8C -ENCODING 44172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -1D -25 -25 -45 -85 -05 -05 -05 -ENDCHAR -STARTCHAR AC8D -ENCODING 44173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -1D -25 -C5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AC8E -ENCODING 44174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -1D -25 -C5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR AC8F -ENCODING 44175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -1D00 -2500 -C500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR AC90 -ENCODING 44176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -3D00 -6500 -8500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR AC91 -ENCODING 44177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -1D00 -2500 -C500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR AC92 -ENCODING 44178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR AC93 -ENCODING 44179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -1D -25 -C5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR AC94 -ENCODING 44180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -3D -65 -85 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR AC95 -ENCODING 44181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR AC96 -ENCODING 44182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR AC97 -ENCODING 44183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR AC98 -ENCODING 44184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR AC99 -ENCODING 44185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR AC9A -ENCODING 44186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AC9B -ENCODING 44187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR AC9C -ENCODING 44188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -3D -65 -85 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR AC9D -ENCODING 44189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -3D -65 -85 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR AC9E -ENCODING 44190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -1D00 -2500 -C500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR AC9F -ENCODING 44191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -1D00 -2500 -4500 -8100 -0800 -0C00 -3600 -6180 -ENDCHAR -STARTCHAR ACA0 -ENCODING 44192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -3D00 -6500 -8500 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR ACA1 -ENCODING 44193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -3D -65 -85 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR ACA2 -ENCODING 44194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -1D00 -2500 -C500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR ACA3 -ENCODING 44195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -1500 -3D00 -4500 -8100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR ACA4 -ENCODING 44196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -1D -25 -C5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR ACA5 -ENCODING 44197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR ACA6 -ENCODING 44198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -1D -25 -C5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR ACA7 -ENCODING 44199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -3D -45 -81 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR ACA8 -ENCODING 44200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -11 -2F -41 -81 -01 -01 -01 -ENDCHAR -STARTCHAR ACA9 -ENCODING 44201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -1F -21 -C1 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR ACAA -ENCODING 44202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -1F -21 -C1 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR ACAB -ENCODING 44203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0F00 -1100 -2F00 -4100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR ACAC -ENCODING 44204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -1F -61 -81 -01 -20 -20 -3F -ENDCHAR -STARTCHAR ACAD -ENCODING 44205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -0F -11 -2F -41 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR ACAE -ENCODING 44206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -11 -2F -C1 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR ACAF -ENCODING 44207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -1F -21 -C1 -00 -3F -20 -20 -3F -ENDCHAR -STARTCHAR ACB0 -ENCODING 44208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -1F -21 -C0 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR ACB1 -ENCODING 44209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -11 -2F -C1 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR ACB2 -ENCODING 44210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -11 -2F -C1 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR ACB3 -ENCODING 44211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -11 -2F -C1 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR ACB4 -ENCODING 44212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -11 -2F -C1 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR ACB5 -ENCODING 44213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -11 -2F -C1 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR ACB6 -ENCODING 44214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -11 -2F -C1 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR ACB7 -ENCODING 44215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -11 -2F -C1 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR ACB8 -ENCODING 44216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -2F -C1 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR ACB9 -ENCODING 44217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -1F -21 -C0 -41 -41 -3F -41 -3F -ENDCHAR -STARTCHAR ACBA -ENCODING 44218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0F00 -1100 -2F00 -4100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR ACBB -ENCODING 44219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0F00 -1100 -1F00 -6100 -8100 -0800 -0C00 -1600 -6180 -ENDCHAR -STARTCHAR ACBC -ENCODING 44220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0F00 -1100 -2F00 -C100 -0000 -1200 -2200 -3300 -4C80 -ENDCHAR -STARTCHAR ACBD -ENCODING 44221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -11 -1F -61 -81 -1E -21 -21 -1E -ENDCHAR -STARTCHAR ACBE -ENCODING 44222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0F00 -1100 -2F00 -4100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR ACBF -ENCODING 44223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0F00 -1100 -2F00 -C100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR ACC0 -ENCODING 44224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -0F -11 -2F -41 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR ACC1 -ENCODING 44225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -2F -C1 -00 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR ACC2 -ENCODING 44226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -0F -11 -2F -41 -00 -3F -12 -3F -ENDCHAR -STARTCHAR ACC3 -ENCODING 44227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -11 -2F -C1 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR ACC4 -ENCODING 44228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -1D -15 -25 -7D -C5 -85 -05 -05 -05 -ENDCHAR -STARTCHAR ACC5 -ENCODING 44229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -15 -3D -C5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR ACC6 -ENCODING 44230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -15 -3D -C5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR ACC7 -ENCODING 44231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -1500 -3D00 -C500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR ACC8 -ENCODING 44232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1D00 -2500 -3D00 -4500 -8500 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR ACC9 -ENCODING 44233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -1500 -3D00 -C500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR ACCA -ENCODING 44234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR ACCB -ENCODING 44235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -15 -3D -C5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR ACCC -ENCODING 44236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -1D -15 -7D -85 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR ACCD -ENCODING 44237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR ACCE -ENCODING 44238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR ACCF -ENCODING 44239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR ACD0 -ENCODING 44240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR ACD1 -ENCODING 44241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR ACD2 -ENCODING 44242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR ACD3 -ENCODING 44243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR ACD4 -ENCODING 44244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -15 -3D -C5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR ACD5 -ENCODING 44245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -1D -25 -7D -85 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR ACD6 -ENCODING 44246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -1500 -3D00 -C500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR ACD7 -ENCODING 44247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1D00 -1500 -3D00 -4500 -8500 -0900 -0C00 -3600 -6180 -ENDCHAR -STARTCHAR ACD8 -ENCODING 44248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -1500 -3D00 -C500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR ACD9 -ENCODING 44249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -15 -3D -C5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR ACDA -ENCODING 44250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -1500 -3D00 -C500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR ACDB -ENCODING 44251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -1D00 -2500 -5D00 -8100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR ACDC -ENCODING 44252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -15 -3D -C5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR ACDD -ENCODING 44253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR ACDE -ENCODING 44254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -15 -3D -C5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR ACDF -ENCODING 44255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -25 -5D -81 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR ACE0 -ENCODING 44256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -0080 -0080 -0080 -0880 -0880 -0900 -0800 -FFC0 -ENDCHAR -STARTCHAR ACE1 -ENCODING 44257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0880 -0900 -0800 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR ACE2 -ENCODING 44258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -0800 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR ACE3 -ENCODING 44259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -0800 -FFC0 -0000 -7900 -0B00 -0A80 -0C00 -ENDCHAR -STARTCHAR ACE4 -ENCODING 44260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0880 -0900 -0800 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR ACE5 -ENCODING 44261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -0800 -FFC0 -0700 -2100 -2100 -2280 -1000 -ENDCHAR -STARTCHAR ACE6 -ENCODING 44262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -12 -FF -00 -06 -8F -86 -89 -76 -ENDCHAR -STARTCHAR ACE7 -ENCODING 44263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0880 -0900 -0800 -FFC0 -0000 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR ACE8 -ENCODING 44264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0900 -0800 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR ACE9 -ENCODING 44265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -12 -FF -00 -7F -11 -71 -41 -71 -ENDCHAR -STARTCHAR ACEA -ENCODING 44266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0900 -0800 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR ACEB -ENCODING 44267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -12 -FF -00 -79 -1F -79 -49 -76 -ENDCHAR -STARTCHAR ACEC -ENCODING 44268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0900 -0800 -FFC0 -0000 -7900 -0900 -3900 -4280 -3CC0 -ENDCHAR -STARTCHAR ACED -ENCODING 44269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -12 -FF -00 -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR ACEE -ENCODING 44270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -12 -FF -00 -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR ACEF -ENCODING 44271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0900 -0800 -FFC0 -0000 -7B00 -0800 -7F80 -4480 -3B80 -ENDCHAR -STARTCHAR ACF0 -ENCODING 44272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0880 -0900 -0800 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR ACF1 -ENCODING 44273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0880 -0900 -0800 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR ACF2 -ENCODING 44274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -0800 -FFC0 -0000 -4900 -7B00 -4A80 -7C00 -ENDCHAR -STARTCHAR ACF3 -ENCODING 44275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0880 -0900 -0800 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR ACF4 -ENCODING 44276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -0100 -0800 -FFC0 -0000 -1200 -1300 -6C80 -ENDCHAR -STARTCHAR ACF5 -ENCODING 44277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0880 -0900 -0800 -FFC0 -0000 -1F00 -2100 -2180 -1F00 -ENDCHAR -STARTCHAR ACF6 -ENCODING 44278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0880 -0900 -0800 -FFC0 -0000 -3F00 -0300 -0E00 -7180 -ENDCHAR -STARTCHAR ACF7 -ENCODING 44279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -12 -FF -00 -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR ACF8 -ENCODING 44280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -0100 -0800 -FFC0 -3F00 -0080 -3F00 -0080 -ENDCHAR -STARTCHAR ACF9 -ENCODING 44281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -01 -12 -FF -00 -3E -40 -7E -7E -ENDCHAR -STARTCHAR ACFA -ENCODING 44282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -0100 -0800 -FFC0 -0000 -3F00 -1200 -3F00 -ENDCHAR -STARTCHAR ACFB -ENCODING 44283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -12 -FF -00 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR ACFC -ENCODING 44284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -0480 -1480 -14C0 -1480 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR ACFD -ENCODING 44285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1480 -14C0 -1080 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR ACFE -ENCODING 44286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -3F00 -0880 -0880 -ENDCHAR -STARTCHAR ACFF -ENCODING 44287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -3900 -0900 -0A80 -0800 -ENDCHAR -STARTCHAR AD00 -ENCODING 44288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1480 -1480 -10C0 -FE80 -0080 -2080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR AD01 -ENCODING 44289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0300 -2080 -2100 -2280 -1800 -ENDCHAR -STARTCHAR AD02 -ENCODING 44290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR AD03 -ENCODING 44291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR AD04 -ENCODING 44292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR AD05 -ENCODING 44293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR AD06 -ENCODING 44294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -7F80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR AD07 -ENCODING 44295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR AD08 -ENCODING 44296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR AD09 -ENCODING 44297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR AD0A -ENCODING 44298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR AD0B -ENCODING 44299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR AD0C -ENCODING 44300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1480 -14C0 -1080 -FE80 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR AD0D -ENCODING 44301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1480 -14C0 -1080 -FE80 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR AD0E -ENCODING 44302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -0900 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR AD0F -ENCODING 44303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1480 -14C0 -1080 -FE80 -0080 -0400 -0400 -1A00 -2180 -ENDCHAR -STARTCHAR AD10 -ENCODING 44304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -1100 -1100 -2A80 -4400 -ENDCHAR -STARTCHAR AD11 -ENCODING 44305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1480 -14C0 -1080 -FE80 -0080 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR AD12 -ENCODING 44306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -1F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR AD13 -ENCODING 44307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR AD14 -ENCODING 44308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -1F80 -3F00 -0080 -ENDCHAR -STARTCHAR AD15 -ENCODING 44309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR AD16 -ENCODING 44310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -0480 -14C0 -1080 -FE80 -0000 -1F00 -1100 -3F80 -ENDCHAR -STARTCHAR AD17 -ENCODING 44311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0480 -14C0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR AD18 -ENCODING 44312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -0A80 -2A80 -2B80 -2A80 -2280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR AD19 -ENCODING 44313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR AD1A -ENCODING 44314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR AD1B -ENCODING 44315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR AD1C -ENCODING 44316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7A80 -0A80 -2A80 -2B80 -2A80 -FE80 -0280 -2000 -2000 -2000 -1FC0 -ENDCHAR -STARTCHAR AD1D -ENCODING 44317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR AD1E -ENCODING 44318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR AD1F -ENCODING 44319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR AD20 -ENCODING 44320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -2B80 -2280 -FE80 -0000 -3F80 -0080 -3F80 -2000 -3F80 -ENDCHAR -STARTCHAR AD21 -ENCODING 44321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR AD22 -ENCODING 44322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR AD23 -ENCODING 44323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR AD24 -ENCODING 44324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR AD25 -ENCODING 44325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR AD26 -ENCODING 44326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR AD27 -ENCODING 44327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR AD28 -ENCODING 44328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR AD29 -ENCODING 44329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -2A80 -2B80 -2280 -FE80 -0000 -2080 -3F80 -2080 -3F80 -ENDCHAR -STARTCHAR AD2A -ENCODING 44330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -2900 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR AD2B -ENCODING 44331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR AD2C -ENCODING 44332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7A80 -0A80 -2A80 -2B80 -2280 -FE80 -0280 -1100 -1100 -3A80 -2640 -ENDCHAR -STARTCHAR AD2D -ENCODING 44333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -2A80 -2B80 -2280 -FE80 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR AD2E -ENCODING 44334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR AD2F -ENCODING 44335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR AD30 -ENCODING 44336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -1F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR AD31 -ENCODING 44337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR AD32 -ENCODING 44338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -0A80 -2B80 -2280 -FE80 -0000 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR AD33 -ENCODING 44339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -0A80 -2B80 -2280 -FA80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR AD34 -ENCODING 44340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -29 -29 -29 -21 -FD -01 -01 -01 -ENDCHAR -STARTCHAR AD35 -ENCODING 44341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -05 -29 -29 -21 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AD36 -ENCODING 44342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -29 -21 -FD -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR AD37 -ENCODING 44343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -2900 -2100 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AD38 -ENCODING 44344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -05 -09 -29 -29 -21 -FD -01 -41 -40 -7F -ENDCHAR -STARTCHAR AD39 -ENCODING 44345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -29 -21 -FD -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR AD3A -ENCODING 44346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR AD3B -ENCODING 44347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -29 -21 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR AD3C -ENCODING 44348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -29 -21 -FD -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR AD3D -ENCODING 44349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR AD3E -ENCODING 44350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR AD3F -ENCODING 44351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR AD40 -ENCODING 44352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR AD41 -ENCODING 44353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR AD42 -ENCODING 44354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR AD43 -ENCODING 44355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR AD44 -ENCODING 44356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -29 -21 -FD -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR AD45 -ENCODING 44357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -05 -29 -29 -21 -FD -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR AD46 -ENCODING 44358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -29 -21 -FD -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR AD47 -ENCODING 44359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -2900 -2900 -2100 -FD00 -0100 -0800 -0C00 -3600 -6180 -ENDCHAR -STARTCHAR AD48 -ENCODING 44360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -29 -21 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR AD49 -ENCODING 44361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -29 -29 -21 -FD -01 -3E -41 -41 -3E -ENDCHAR -STARTCHAR AD4A -ENCODING 44362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -2900 -2100 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR AD4B -ENCODING 44363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0900 -2900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR AD4C -ENCODING 44364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -29 -21 -FD -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR AD4D -ENCODING 44365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR AD4E -ENCODING 44366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -29 -21 -FD -01 -7F -12 -3F -ENDCHAR -STARTCHAR AD4F -ENCODING 44367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -29 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR AD50 -ENCODING 44368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -0080 -0080 -0080 -1480 -1480 -1400 -1400 -FFC0 -ENDCHAR -STARTCHAR AD51 -ENCODING 44369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR AD52 -ENCODING 44370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR AD53 -ENCODING 44371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -7900 -0B00 -0A80 -0C00 -ENDCHAR -STARTCHAR AD54 -ENCODING 44372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -0080 -1480 -1500 -1400 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR AD55 -ENCODING 44373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0700 -2100 -2100 -2280 -1000 -ENDCHAR -STARTCHAR AD56 -ENCODING 44374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -06 -8F -86 -89 -76 -ENDCHAR -STARTCHAR AD57 -ENCODING 44375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR AD58 -ENCODING 44376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR AD59 -ENCODING 44377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -7F -11 -71 -41 -71 -ENDCHAR -STARTCHAR AD5A -ENCODING 44378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR AD5B -ENCODING 44379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -79 -1F -79 -49 -76 -ENDCHAR -STARTCHAR AD5C -ENCODING 44380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR AD5D -ENCODING 44381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR AD5E -ENCODING 44382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR AD5F -ENCODING 44383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -F7 -1F -77 -89 -76 -ENDCHAR -STARTCHAR AD60 -ENCODING 44384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR AD61 -ENCODING 44385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -0080 -0080 -1500 -1400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR AD62 -ENCODING 44386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -4900 -7B00 -4A80 -7C00 -ENDCHAR -STARTCHAR AD63 -ENCODING 44387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -0080 -0080 -1500 -1400 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR AD64 -ENCODING 44388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -1200 -1300 -6C80 -ENDCHAR -STARTCHAR AD65 -ENCODING 44389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0C00 -3300 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR AD66 -ENCODING 44390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -3F00 -0600 -3B80 -ENDCHAR -STARTCHAR AD67 -ENCODING 44391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR AD68 -ENCODING 44392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -3F00 -0080 -3F00 -0080 -ENDCHAR -STARTCHAR AD69 -ENCODING 44393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -01 -2A -FF -00 -3E -40 -7E -7E -ENDCHAR -STARTCHAR AD6A -ENCODING 44394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -1500 -1400 -FFC0 -0000 -3F00 -1200 -3F00 -ENDCHAR -STARTCHAR AD6B -ENCODING 44395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -01 -2A -FF -00 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR AD6C -ENCODING 44396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -0080 -0100 -0100 -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR AD6D -ENCODING 44397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR AD6E -ENCODING 44398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0400 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR AD6F -ENCODING 44399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0400 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR AD70 -ENCODING 44400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -0100 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR AD71 -ENCODING 44401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0400 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR AD72 -ENCODING 44402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -0300 -4780 -4300 -4480 -3B00 -ENDCHAR -STARTCHAR AD73 -ENCODING 44403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -0400 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR AD74 -ENCODING 44404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR AD75 -ENCODING 44405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR AD76 -ENCODING 44406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR AD77 -ENCODING 44407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR AD78 -ENCODING 44408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR AD79 -ENCODING 44409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -3300 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR AD7A -ENCODING 44410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR AD7B -ENCODING 44411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -7B00 -0800 -7F80 -4480 -3B80 -ENDCHAR -STARTCHAR AD7C -ENCODING 44412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR AD7D -ENCODING 44413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -2480 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR AD7E -ENCODING 44414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0400 -0400 -4900 -7B00 -4A80 -7C00 -ENDCHAR -STARTCHAR AD7F -ENCODING 44415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -0400 -0400 -0C00 -1300 -6080 -ENDCHAR -STARTCHAR AD80 -ENCODING 44416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0400 -0400 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR AD81 -ENCODING 44417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -0400 -1F00 -2180 -2180 -1F00 -ENDCHAR -STARTCHAR AD82 -ENCODING 44418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -0400 -3F00 -0200 -0E00 -7180 -ENDCHAR -STARTCHAR AD83 -ENCODING 44419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -1E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR AD84 -ENCODING 44420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0400 -0400 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR AD85 -ENCODING 44421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -3F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR AD86 -ENCODING 44422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -0100 -FFC0 -0400 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR AD87 -ENCODING 44423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0400 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR AD88 -ENCODING 44424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -0480 -0480 -0480 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR AD89 -ENCODING 44425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -FD -21 -27 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AD8A -ENCODING 44426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -27 -21 -7F -09 -09 -09 -ENDCHAR -STARTCHAR AD8B -ENCODING 44427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -0900 -FD00 -2700 -2100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AD8C -ENCODING 44428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -09 -FF -21 -27 -21 -41 -40 -7F -ENDCHAR -STARTCHAR AD8D -ENCODING 44429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -27 -21 -47 -42 -45 -30 -ENDCHAR -STARTCHAR AD8E -ENCODING 44430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR AD8F -ENCODING 44431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -FD -27 -21 -3F -40 -7E -ENDCHAR -STARTCHAR AD90 -ENCODING 44432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -09 -FF -21 -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR AD91 -ENCODING 44433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR AD92 -ENCODING 44434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR AD93 -ENCODING 44435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR AD94 -ENCODING 44436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR AD95 -ENCODING 44437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR AD96 -ENCODING 44438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR AD97 -ENCODING 44439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR AD98 -ENCODING 44440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -FD -27 -21 -7F -41 -7F -ENDCHAR -STARTCHAR AD99 -ENCODING 44441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -FD -27 -21 -41 -7F -7F -ENDCHAR -STARTCHAR AD9A -ENCODING 44442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -27 -21 -52 -72 -55 -78 -ENDCHAR -STARTCHAR AD9B -ENCODING 44443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -FD -27 -21 -08 -14 -63 -ENDCHAR -STARTCHAR AD9C -ENCODING 44444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -FF00 -2100 -2700 -0100 -2200 -2200 -7500 -C880 -ENDCHAR -STARTCHAR AD9D -ENCODING 44445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -FF -21 -27 -01 -3E -41 -41 -3E -ENDCHAR -STARTCHAR AD9E -ENCODING 44446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -0900 -FD00 -2700 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR AD9F -ENCODING 44447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0900 -0900 -FD00 -2700 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR ADA0 -ENCODING 44448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -27 -21 -7F -3F -01 -01 -ENDCHAR -STARTCHAR ADA1 -ENCODING 44449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR ADA2 -ENCODING 44450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -FD -27 -21 -7F -12 -3F -ENDCHAR -STARTCHAR ADA3 -ENCODING 44451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -27 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR ADA4 -ENCODING 44452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -0A80 -0A80 -FE80 -1280 -1680 -1280 -1280 -1280 -0280 -ENDCHAR -STARTCHAR ADA5 -ENCODING 44453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -13 -13 -FB -2B -21 -7F -01 -01 -01 -ENDCHAR -STARTCHAR ADA6 -ENCODING 44454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -13 -13 -FB -2B -21 -3F -09 -09 -09 -ENDCHAR -STARTCHAR ADA7 -ENCODING 44455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -1300 -1300 -FB00 -2B00 -2100 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR ADA8 -ENCODING 44456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -1280 -0080 -2000 -3F80 -ENDCHAR -STARTCHAR ADA9 -ENCODING 44457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -1300 -1300 -FB00 -2B00 -2100 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR ADAA -ENCODING 44458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR ADAB -ENCODING 44459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -13 -13 -FB -2B -21 -3F -40 -7F -ENDCHAR -STARTCHAR ADAC -ENCODING 44460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -1F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR ADAD -ENCODING 44461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -1F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR ADAE -ENCODING 44462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR ADAF -ENCODING 44463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -1E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR ADB0 -ENCODING 44464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -3900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR ADB1 -ENCODING 44465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -1F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR ADB2 -ENCODING 44466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR ADB3 -ENCODING 44467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR ADB4 -ENCODING 44468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -13 -13 -FB -2B -21 -3F -41 -7F -ENDCHAR -STARTCHAR ADB5 -ENCODING 44469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -13 -13 -FB -2B -21 -41 -7F -7F -ENDCHAR -STARTCHAR ADB6 -ENCODING 44470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -1300 -1300 -FB00 -2B00 -2100 -4200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR ADB7 -ENCODING 44471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7A80 -0A80 -0A80 -FE80 -1280 -1680 -1280 -0480 -0600 -1B00 -30C0 -ENDCHAR -STARTCHAR ADB8 -ENCODING 44472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -13 -13 -FB -2B -21 -02 -22 -55 -08 -ENDCHAR -STARTCHAR ADB9 -ENCODING 44473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -13 -13 -FB -2B -21 -3E -41 -61 -1E -ENDCHAR -STARTCHAR ADBA -ENCODING 44474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -1300 -1300 -FB00 -2B00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR ADBB -ENCODING 44475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR ADBC -ENCODING 44476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -13 -13 -FB -2B -21 -3F -01 -3F -01 -ENDCHAR -STARTCHAR ADBD -ENCODING 44477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR ADBE -ENCODING 44478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -13 -13 -FB -2B -21 -3F -12 -3F -ENDCHAR -STARTCHAR ADBF -ENCODING 44479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -0A80 -0A80 -FE80 -1680 -0E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR ADC0 -ENCODING 44480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -0480 -0480 -0480 -FE80 -1080 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR ADC1 -ENCODING 44481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -09 -FD -21 -20 -7F -01 -01 -01 -ENDCHAR -STARTCHAR ADC2 -ENCODING 44482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR ADC3 -ENCODING 44483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -0900 -FD00 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR ADC4 -ENCODING 44484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -09 -FF -21 -21 -21 -41 -40 -7F -ENDCHAR -STARTCHAR ADC5 -ENCODING 44485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -21 -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR ADC6 -ENCODING 44486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR ADC7 -ENCODING 44487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -FD -21 -00 -3F -40 -7E -ENDCHAR -STARTCHAR ADC8 -ENCODING 44488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -FF -21 -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR ADC9 -ENCODING 44489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR ADCA -ENCODING 44490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR ADCB -ENCODING 44491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR ADCC -ENCODING 44492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR ADCD -ENCODING 44493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR ADCE -ENCODING 44494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR ADCF -ENCODING 44495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR ADD0 -ENCODING 44496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -09 -FF -21 -20 -7F -41 -41 -7F -ENDCHAR -STARTCHAR ADD1 -ENCODING 44497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -09 -FF -21 -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR ADD2 -ENCODING 44498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -21 -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR ADD3 -ENCODING 44499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -0900 -FF00 -2100 -2100 -2800 -0C00 -3200 -6180 -ENDCHAR -STARTCHAR ADD4 -ENCODING 44500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -21 -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR ADD5 -ENCODING 44501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -21 -00 -3E -41 -63 -1C -ENDCHAR -STARTCHAR ADD6 -ENCODING 44502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -0900 -FD00 -2100 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR ADD7 -ENCODING 44503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0900 -0900 -FD00 -2100 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR ADD8 -ENCODING 44504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -FD -21 -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR ADD9 -ENCODING 44505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR ADDA -ENCODING 44506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -FD -21 -00 -7F -12 -3F -ENDCHAR -STARTCHAR ADDB -ENCODING 44507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -FD -21 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR ADDC -ENCODING 44508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -0080 -0100 -0100 -FFC0 -1200 -1200 -1200 -1200 -ENDCHAR -STARTCHAR ADDD -ENCODING 44509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR ADDE -ENCODING 44510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR ADDF -ENCODING 44511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR ADE0 -ENCODING 44512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -0100 -FFC0 -1200 -3200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR ADE1 -ENCODING 44513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -2180 -2100 -2280 -1800 -ENDCHAR -STARTCHAR ADE2 -ENCODING 44514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -01 -02 -FD -24 -06 -8F -86 -89 -76 -ENDCHAR -STARTCHAR ADE3 -ENCODING 44515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR ADE4 -ENCODING 44516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR ADE5 -ENCODING 44517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -01 -02 -FD -24 -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR ADE6 -ENCODING 44518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -01 -02 -FD -24 -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR ADE7 -ENCODING 44519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -01 -02 -FD -24 -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR ADE8 -ENCODING 44520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -01 -02 -FD -24 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR ADE9 -ENCODING 44521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -01 -02 -FD -24 -66 -18 -7F -48 -77 -ENDCHAR -STARTCHAR ADEA -ENCODING 44522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -01 -02 -FD -24 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR ADEB -ENCODING 44523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -01 -02 -FD -24 -66 -1F -76 -89 -76 -ENDCHAR -STARTCHAR ADEC -ENCODING 44524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR ADED -ENCODING 44525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -2080 -3F00 -3F80 -ENDCHAR -STARTCHAR ADEE -ENCODING 44526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -4900 -7B00 -4A80 -7C00 -ENDCHAR -STARTCHAR ADEF -ENCODING 44527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1000 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR ADF0 -ENCODING 44528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR ADF1 -ENCODING 44529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1000 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR ADF2 -ENCODING 44530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR ADF3 -ENCODING 44531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -1100 -1E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR ADF4 -ENCODING 44532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR ADF5 -ENCODING 44533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -01 -01 -02 -FD -24 -7E -40 -7E -7E -ENDCHAR -STARTCHAR ADF6 -ENCODING 44534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -0100 -FFC0 -1200 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR ADF7 -ENCODING 44535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -1100 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR ADF8 -ENCODING 44536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -0080 -0080 -0080 -0080 -0100 -0100 -0100 -FFC0 -ENDCHAR -STARTCHAR ADF9 -ENCODING 44537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0000 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR ADFA -ENCODING 44538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR ADFB -ENCODING 44539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0000 -7900 -0B00 -0A80 -0C00 -ENDCHAR -STARTCHAR ADFC -ENCODING 44540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -0100 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR ADFD -ENCODING 44541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0700 -2100 -2100 -2280 -1000 -ENDCHAR -STARTCHAR ADFE -ENCODING 44542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0300 -4780 -4300 -4480 -3B00 -ENDCHAR -STARTCHAR ADFF -ENCODING 44543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0000 -0000 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR AE00 -ENCODING 44544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR AE01 -ENCODING 44545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0000 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR AE02 -ENCODING 44546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR AE03 -ENCODING 44547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -3C80 -0F80 -3C80 -2480 -3B00 -ENDCHAR -STARTCHAR AE04 -ENCODING 44548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR AE05 -ENCODING 44549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR AE06 -ENCODING 44550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR AE07 -ENCODING 44551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -7B80 -0F80 -3B80 -4480 -3B00 -ENDCHAR -STARTCHAR AE08 -ENCODING 44552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0000 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR AE09 -ENCODING 44553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0000 -2080 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR AE0A -ENCODING 44554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0000 -4900 -7B00 -4A80 -7C00 -ENDCHAR -STARTCHAR AE0B -ENCODING 44555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -0100 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR AE0C -ENCODING 44556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0000 -1200 -1300 -6C80 -ENDCHAR -STARTCHAR AE0D -ENCODING 44557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -0080 -0100 -FFC0 -0000 -0000 -1F00 -2100 -2180 -1F00 -ENDCHAR -STARTCHAR AE0E -ENCODING 44558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0000 -3F00 -0600 -3B80 -ENDCHAR -STARTCHAR AE0F -ENCODING 44559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR AE10 -ENCODING 44560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -3F00 -0080 -3F00 -0080 -ENDCHAR -STARTCHAR AE11 -ENCODING 44561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR AE12 -ENCODING 44562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0000 -3F00 -1200 -3F00 -ENDCHAR -STARTCHAR AE13 -ENCODING 44563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -0100 -FFC0 -0000 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR AE14 -ENCODING 44564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -0480 -0480 -0480 -0480 -0480 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR AE15 -ENCODING 44565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AE16 -ENCODING 44566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR AE17 -ENCODING 44567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -0900 -0100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AE18 -ENCODING 44568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -09 -FD -01 -01 -40 -7F -ENDCHAR -STARTCHAR AE19 -ENCODING 44569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR AE1A -ENCODING 44570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR AE1B -ENCODING 44571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -3F -40 -7E -ENDCHAR -STARTCHAR AE1C -ENCODING 44572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -7E -01 -7F -40 -3F -ENDCHAR -STARTCHAR AE1D -ENCODING 44573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR AE1E -ENCODING 44574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR AE1F -ENCODING 44575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR AE20 -ENCODING 44576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR AE21 -ENCODING 44577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR AE22 -ENCODING 44578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR AE23 -ENCODING 44579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR AE24 -ENCODING 44580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -7F -41 -7F -ENDCHAR -STARTCHAR AE25 -ENCODING 44581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -41 -7F -7F -ENDCHAR -STARTCHAR AE26 -ENCODING 44582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR AE27 -ENCODING 44583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -01 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR AE28 -ENCODING 44584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR AE29 -ENCODING 44585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -01 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR AE2A -ENCODING 44586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -0900 -0100 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR AE2B -ENCODING 44587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0900 -0900 -0500 -F900 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR AE2C -ENCODING 44588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR AE2D -ENCODING 44589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR AE2E -ENCODING 44590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -09 -01 -FD -00 -7F -12 -3F -ENDCHAR -STARTCHAR AE2F -ENCODING 44591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -09 -05 -F9 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR AE30 -ENCODING 44592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -11 -21 -41 -81 -01 -01 -01 -ENDCHAR -STARTCHAR AE31 -ENCODING 44593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -61 -81 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AE32 -ENCODING 44594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -11 -21 -41 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR AE33 -ENCODING 44595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -1100 -2100 -4100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AE34 -ENCODING 44596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -31 -61 -81 -01 -20 -20 -3F -ENDCHAR -STARTCHAR AE35 -ENCODING 44597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -11 -21 -41 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR AE36 -ENCODING 44598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -11 -21 -C1 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR AE37 -ENCODING 44599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -61 -81 -00 -3F -20 -20 -3F -ENDCHAR -STARTCHAR AE38 -ENCODING 44600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -61 -80 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR AE39 -ENCODING 44601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -11 -21 -C1 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR AE3A -ENCODING 44602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -21 -C0 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AE3B -ENCODING 44603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -11 -21 -C1 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR AE3C -ENCODING 44604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -11 -21 -C1 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR AE3D -ENCODING 44605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -11 -21 -C1 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR AE3E -ENCODING 44606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -11 -21 -C1 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AE3F -ENCODING 44607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -11 -21 -C1 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR AE40 -ENCODING 44608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -61 -81 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR AE41 -ENCODING 44609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -61 -80 -41 -41 -3F -41 -3F -ENDCHAR -STARTCHAR AE42 -ENCODING 44610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -1100 -2100 -4100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR AE43 -ENCODING 44611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -1100 -1100 -6100 -8100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR AE44 -ENCODING 44612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -1100 -2100 -4100 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR AE45 -ENCODING 44613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -21 -C1 -1E -21 -41 -21 -1E -ENDCHAR -STARTCHAR AE46 -ENCODING 44614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -1100 -6100 -8100 -0000 -3F00 -0200 -0E00 -7180 -ENDCHAR -STARTCHAR AE47 -ENCODING 44615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0900 -1100 -2100 -C100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR AE48 -ENCODING 44616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -11 -21 -41 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AE49 -ENCODING 44617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -11 -21 -C1 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR AE4A -ENCODING 44618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -61 -81 -00 -7F -12 -12 -7F -ENDCHAR -STARTCHAR AE4B -ENCODING 44619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -11 -21 -C1 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR AE4C -ENCODING 44620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -2900 -4900 -4980 -9100 -9100 -2100 -0100 -0100 -0100 -ENDCHAR -STARTCHAR AE4D -ENCODING 44621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4980 -4900 -9100 -2100 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR AE4E -ENCODING 44622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4980 -4900 -9100 -2100 -0000 -7E00 -1100 -1100 -1100 -ENDCHAR -STARTCHAR AE4F -ENCODING 44623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2900 -4980 -9100 -2100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR AE50 -ENCODING 44624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4900 -4980 -8900 -9100 -2100 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR AE51 -ENCODING 44625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2900 -4980 -9100 -2100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR AE52 -ENCODING 44626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -24C0 -C880 -1000 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR AE53 -ENCODING 44627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -2900 -4980 -9100 -2100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR AE54 -ENCODING 44628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4980 -D100 -A100 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR AE55 -ENCODING 44629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -24C0 -C880 -1000 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR AE56 -ENCODING 44630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4980 -D100 -A100 -0000 -7F00 -1900 -7900 -8900 -7F00 -ENDCHAR -STARTCHAR AE57 -ENCODING 44631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -24C0 -C880 -1000 -3400 -0C80 -3F80 -4480 -3F00 -ENDCHAR -STARTCHAR AE58 -ENCODING 44632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -24C0 -C880 -1000 -3900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR AE59 -ENCODING 44633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -24C0 -C880 -1000 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR AE5A -ENCODING 44634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -24C0 -C880 -1000 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR AE5B -ENCODING 44635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -24C0 -C880 -1000 -3B00 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR AE5C -ENCODING 44636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4980 -4900 -9100 -2100 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR AE5D -ENCODING 44637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4980 -4900 -9100 -2100 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR AE5E -ENCODING 44638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2900 -4980 -9100 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR AE5F -ENCODING 44639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4900 -4980 -8900 -9100 -2100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR AE60 -ENCODING 44640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4900 -4980 -9100 -2100 -0000 -2200 -2200 -5600 -8980 -ENDCHAR -STARTCHAR AE61 -ENCODING 44641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4900 -5180 -A100 -0100 -3C00 -6200 -4100 -6200 -3C00 -ENDCHAR -STARTCHAR AE62 -ENCODING 44642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2900 -4980 -9100 -2100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR AE63 -ENCODING 44643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -24C0 -C880 -1000 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR AE64 -ENCODING 44644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -2900 -4980 -9100 -2100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR AE65 -ENCODING 44645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4980 -5100 -A100 -0000 -7F00 -4000 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR AE66 -ENCODING 44646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -2900 -4980 -9100 -2100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR AE67 -ENCODING 44647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -24C0 -C880 -1000 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR AE68 -ENCODING 44648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -2680 -2680 -2A80 -2980 -4A80 -9280 -1280 -0280 -0280 -0280 -ENDCHAR -STARTCHAR AE69 -ENCODING 44649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -4D -4D -93 -95 -25 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AE6A -ENCODING 44650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DD -4D -53 -95 -25 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR AE6B -ENCODING 44651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DD00 -4D00 -5300 -9500 -2500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR AE6C -ENCODING 44652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6E80 -2680 -2680 -2980 -4A80 -8A80 -1280 -0280 -1000 -1000 -1FC0 -ENDCHAR -STARTCHAR AE6D -ENCODING 44653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DD00 -4D00 -5300 -9500 -2500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR AE6E -ENCODING 44654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR AE6F -ENCODING 44655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DD -4D -53 -95 -25 -00 -3F -40 -7F -ENDCHAR -STARTCHAR AE70 -ENCODING 44656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -4D -53 -95 -A5 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR AE71 -ENCODING 44657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR AE72 -ENCODING 44658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR AE73 -ENCODING 44659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR AE74 -ENCODING 44660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR AE75 -ENCODING 44661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR AE76 -ENCODING 44662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR AE77 -ENCODING 44663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR AE78 -ENCODING 44664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -4D -4B -95 -95 -25 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR AE79 -ENCODING 44665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -4D -4B -95 -95 -25 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR AE7A -ENCODING 44666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DD00 -4D00 -5300 -9500 -2500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR AE7B -ENCODING 44667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -DD00 -4D00 -4D00 -9300 -9500 -2500 -0500 -0900 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR AE7C -ENCODING 44668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -DD00 -4D00 -4B00 -9500 -9500 -2500 -0000 -1200 -2200 -3300 -4C80 -ENDCHAR -STARTCHAR AE7D -ENCODING 44669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -4D -53 -95 -A5 -01 -1E -21 -41 -21 -1E -ENDCHAR -STARTCHAR AE7E -ENCODING 44670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DD00 -4D00 -5300 -9500 -2500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR AE7F -ENCODING 44671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR AE80 -ENCODING 44672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DD -4D -53 -95 -25 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AE81 -ENCODING 44673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR AE82 -ENCODING 44674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DD -4D -53 -95 -25 -00 -3F -12 -3F -ENDCHAR -STARTCHAR AE83 -ENCODING 44675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2680 -2980 -CA80 -1080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR AE84 -ENCODING 44676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -2980 -4900 -4900 -9180 -9100 -2100 -0100 -0100 -0100 -ENDCHAR -STARTCHAR AE85 -ENCODING 44677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4980 -4900 -9180 -2100 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR AE86 -ENCODING 44678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR AE87 -ENCODING 44679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR AE88 -ENCODING 44680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -2980 -4900 -8900 -1180 -2100 -4000 -4000 -7E00 -ENDCHAR -STARTCHAR AE89 -ENCODING 44681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2980 -4900 -9180 -2100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR AE8A -ENCODING 44682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR AE8B -ENCODING 44683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR AE8C -ENCODING 44684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2980 -4900 -5180 -A100 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR AE8D -ENCODING 44685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR AE8E -ENCODING 44686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -3B00 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR AE8F -ENCODING 44687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -3400 -0C80 -3F80 -4480 -3F00 -ENDCHAR -STARTCHAR AE90 -ENCODING 44688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -3900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR AE91 -ENCODING 44689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR AE92 -ENCODING 44690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR AE93 -ENCODING 44691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -3B00 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR AE94 -ENCODING 44692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR AE95 -ENCODING 44693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR AE96 -ENCODING 44694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR AE97 -ENCODING 44695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR AE98 -ENCODING 44696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR AE99 -ENCODING 44697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2980 -4900 -9180 -2100 -1800 -2600 -4100 -2200 -1C00 -ENDCHAR -STARTCHAR AE9A -ENCODING 44698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR AE9B -ENCODING 44699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR AE9C -ENCODING 44700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR AE9D -ENCODING 44701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -3F80 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR AE9E -ENCODING 44702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -2980 -4900 -9180 -2100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR AE9F -ENCODING 44703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -2480 -C8C0 -1000 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR AEA0 -ENCODING 44704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -4F -55 -95 -93 -25 -05 -05 -01 -ENDCHAR -STARTCHAR AEA1 -ENCODING 44705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DD -4B -55 -93 -25 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AEA2 -ENCODING 44706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DD -4B -55 -93 -25 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR AEA3 -ENCODING 44707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DD00 -4B00 -5500 -9300 -2500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR AEA4 -ENCODING 44708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DD -4F -4D -95 -27 -05 -01 -20 -3F -ENDCHAR -STARTCHAR AEA5 -ENCODING 44709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DD00 -4B00 -5500 -9300 -2500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR AEA6 -ENCODING 44710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR AEA7 -ENCODING 44711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DD -4B -55 -93 -25 -00 -3F -40 -7F -ENDCHAR -STARTCHAR AEA8 -ENCODING 44712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR AEA9 -ENCODING 44713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR AEAA -ENCODING 44714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR AEAB -ENCODING 44715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR AEAC -ENCODING 44716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR AEAD -ENCODING 44717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR AEAE -ENCODING 44718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR AEAF -ENCODING 44719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR AEB0 -ENCODING 44720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DD -4B -55 -93 -25 -00 -3F -41 -7F -ENDCHAR -STARTCHAR AEB1 -ENCODING 44721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DD -4B -55 -93 -25 -00 -21 -3F -3F -ENDCHAR -STARTCHAR AEB2 -ENCODING 44722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DD00 -4B00 -5500 -9300 -2500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR AEB3 -ENCODING 44723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DD -4B -55 -93 -25 -01 -08 -14 -63 -ENDCHAR -STARTCHAR AEB4 -ENCODING 44724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DD00 -4B00 -5500 -9300 -2500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR AEB5 -ENCODING 44725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DD -4B -55 -93 -25 -0D -33 -41 -21 -1E -ENDCHAR -STARTCHAR AEB6 -ENCODING 44726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DD00 -4B00 -5500 -9300 -2500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR AEB7 -ENCODING 44727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR AEB8 -ENCODING 44728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DD -4B -55 -93 -25 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AEB9 -ENCODING 44729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR AEBA -ENCODING 44730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DD -4B -55 -93 -25 -00 -3F -12 -3F -ENDCHAR -STARTCHAR AEBB -ENCODING 44731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2580 -2A80 -C980 -1080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR AEBC -ENCODING 44732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -29 -4F -49 -91 -91 -21 -01 -01 -01 -ENDCHAR -STARTCHAR AEBD -ENCODING 44733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -27 -49 -91 -21 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AEBE -ENCODING 44734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -27 -49 -91 -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR AEBF -ENCODING 44735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2900 -4F00 -9100 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AEC0 -ENCODING 44736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -29 -4F -49 -91 -21 -01 -40 -40 -3F -ENDCHAR -STARTCHAR AEC1 -ENCODING 44737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -29 -4F -91 -21 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR AEC2 -ENCODING 44738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR AEC3 -ENCODING 44739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -29 -4F -91 -21 -00 -7E -40 -7E -ENDCHAR -STARTCHAR AEC4 -ENCODING 44740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -4F -59 -B1 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR AEC5 -ENCODING 44741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR AEC6 -ENCODING 44742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AEC7 -ENCODING 44743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR AEC8 -ENCODING 44744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR AEC9 -ENCODING 44745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR AECA -ENCODING 44746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AECB -ENCODING 44747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR AECC -ENCODING 44748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -29 -4F -99 -31 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR AECD -ENCODING 44749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -29 -4F -99 -31 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR AECE -ENCODING 44750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2900 -4F00 -9100 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR AECF -ENCODING 44751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2500 -2900 -4F00 -4900 -9100 -2100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR AED0 -ENCODING 44752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2500 -2900 -4F00 -9900 -3100 -0100 -1200 -2200 -3300 -4C80 -ENDCHAR -STARTCHAR AED1 -ENCODING 44753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -29 -4F -99 -31 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR AED2 -ENCODING 44754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2900 -4F00 -9100 -2100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR AED3 -ENCODING 44755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -2900 -4F00 -9100 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR AED4 -ENCODING 44756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -29 -4F -91 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AED5 -ENCODING 44757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR AED6 -ENCODING 44758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -29 -4F -91 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR AED7 -ENCODING 44759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -4F -91 -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR AED8 -ENCODING 44760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -6E80 -2680 -2680 -2680 -2A80 -4A80 -9280 -1280 -0280 -0280 -0280 -ENDCHAR -STARTCHAR AED9 -ENCODING 44761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -4D -4D -95 -95 -25 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AEDA -ENCODING 44762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DB -4B -57 -93 -21 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR AEDB -ENCODING 44763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4B00 -5700 -9300 -2100 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR AEDC -ENCODING 44764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6E80 -2680 -2680 -2680 -4A80 -8A80 -1280 -0280 -1000 -1000 -1FC0 -ENDCHAR -STARTCHAR AEDD -ENCODING 44765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4B00 -5700 -9300 -2100 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR AEDE -ENCODING 44766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR AEDF -ENCODING 44767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DB -4B -57 -93 -21 -00 -3F -40 -7F -ENDCHAR -STARTCHAR AEE0 -ENCODING 44768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR AEE1 -ENCODING 44769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR AEE2 -ENCODING 44770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR AEE3 -ENCODING 44771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR AEE4 -ENCODING 44772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR AEE5 -ENCODING 44773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR AEE6 -ENCODING 44774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR AEE7 -ENCODING 44775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR AEE8 -ENCODING 44776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -4D -4D -9D -95 -25 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR AEE9 -ENCODING 44777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DB -4B -57 -93 -21 -00 -21 -3F -3F -ENDCHAR -STARTCHAR AEEA -ENCODING 44778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4B00 -5700 -9300 -2100 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR AEEB -ENCODING 44779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6E80 -2680 -2680 -2680 -4A80 -8A80 -1280 -0480 -0600 -1B00 -20C0 -ENDCHAR -STARTCHAR AEEC -ENCODING 44780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4B00 -5700 -9300 -2100 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR AEED -ENCODING 44781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -4D -4D -9D -95 -25 -01 -3E -21 -21 -3E -ENDCHAR -STARTCHAR AEEE -ENCODING 44782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4B00 -5700 -9300 -2100 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR AEEF -ENCODING 44783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR AEF0 -ENCODING 44784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DB -4B -57 -93 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AEF1 -ENCODING 44785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR AEF2 -ENCODING 44786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DB -4B -57 -93 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR AEF3 -ENCODING 44787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2580 -2B80 -C980 -1080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR AEF4 -ENCODING 44788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -27 -49 -49 -8F -91 -21 -01 -01 -01 -ENDCHAR -STARTCHAR AEF5 -ENCODING 44789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -2F -49 -93 -21 -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR AEF6 -ENCODING 44790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -2F -49 -93 -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR AEF7 -ENCODING 44791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2F00 -4900 -9300 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AEF8 -ENCODING 44792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -27 -49 -49 -97 -21 -01 -40 -40 -3F -ENDCHAR -STARTCHAR AEF9 -ENCODING 44793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -2F -49 -93 -21 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR AEFA -ENCODING 44794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -27 -49 -97 -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR AEFB -ENCODING 44795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -2F -49 -93 -21 -00 -7E -40 -7E -ENDCHAR -STARTCHAR AEFC -ENCODING 44796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -27 -49 -4F -B1 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR AEFD -ENCODING 44797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -27 -49 -97 -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR AEFE -ENCODING 44798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -27 -49 -97 -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AEFF -ENCODING 44799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -27 -49 -97 -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR AF00 -ENCODING 44800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -27 -49 -97 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR AF01 -ENCODING 44801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -27 -49 -97 -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR AF02 -ENCODING 44802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -27 -49 -97 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR AF03 -ENCODING 44803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -27 -49 -97 -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR AF04 -ENCODING 44804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -2F -49 -93 -21 -00 -7F -41 -7F -ENDCHAR -STARTCHAR AF05 -ENCODING 44805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -2F -49 -93 -21 -01 -41 -7F -7F -ENDCHAR -STARTCHAR AF06 -ENCODING 44806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2F00 -4900 -9300 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR AF07 -ENCODING 44807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2500 -2700 -4900 -4F00 -9100 -2100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR AF08 -ENCODING 44808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2500 -2700 -4900 -9F00 -3100 -0000 -1200 -2200 -3300 -4C80 -ENDCHAR -STARTCHAR AF09 -ENCODING 44809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -2F -49 -93 -21 -0C -32 -41 -23 -1C -ENDCHAR -STARTCHAR AF0A -ENCODING 44810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2F00 -4900 -9300 -2100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR AF0B -ENCODING 44811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -2700 -4900 -9700 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR AF0C -ENCODING 44812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -2F -49 -93 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AF0D -ENCODING 44813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -27 -49 -4F -B1 -00 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR AF0E -ENCODING 44814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -2F -49 -93 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR AF0F -ENCODING 44815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -27 -49 -97 -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR AF10 -ENCODING 44816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -2680 -2680 -2A80 -2A80 -4E80 -9280 -1280 -0280 -0280 -0280 -ENDCHAR -STARTCHAR AF11 -ENCODING 44817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DB -4D -53 -9D -21 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AF12 -ENCODING 44818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DB -4D -53 -9D -21 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR AF13 -ENCODING 44819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4D00 -5300 -9D00 -2100 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR AF14 -ENCODING 44820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DB -4D -4B -95 -23 -03 -01 -20 -3F -ENDCHAR -STARTCHAR AF15 -ENCODING 44821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4D00 -5300 -9D00 -2100 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR AF16 -ENCODING 44822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR AF17 -ENCODING 44823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DB -4D -53 -9D -21 -00 -3F -40 -7F -ENDCHAR -STARTCHAR AF18 -ENCODING 44824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR AF19 -ENCODING 44825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR AF1A -ENCODING 44826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR AF1B -ENCODING 44827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR AF1C -ENCODING 44828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR AF1D -ENCODING 44829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR AF1E -ENCODING 44830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR AF1F -ENCODING 44831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR AF20 -ENCODING 44832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DB -4D -53 -9D -21 -00 -3F -41 -7F -ENDCHAR -STARTCHAR AF21 -ENCODING 44833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DB -4D -53 -9D -21 -00 -21 -3F -3F -ENDCHAR -STARTCHAR AF22 -ENCODING 44834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4D00 -5300 -9D00 -2100 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR AF23 -ENCODING 44835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DB -4D -57 -93 -23 -01 -08 -14 -63 -ENDCHAR -STARTCHAR AF24 -ENCODING 44836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4D00 -5300 -9D00 -2100 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR AF25 -ENCODING 44837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DB -4D -57 -93 -23 -0D -33 -41 -21 -1E -ENDCHAR -STARTCHAR AF26 -ENCODING 44838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -DB00 -4D00 -5300 -9D00 -2100 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR AF27 -ENCODING 44839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR AF28 -ENCODING 44840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DB -4D -53 -9D -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AF29 -ENCODING 44841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR AF2A -ENCODING 44842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -DB -4D -53 -9D -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR AF2B -ENCODING 44843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6D80 -2680 -2B80 -C980 -1080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR AF2C -ENCODING 44844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7F80 -0880 -0880 -0880 -1080 -1480 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR AF2D -ENCODING 44845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -1480 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR AF2E -ENCODING 44846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1480 -0400 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR AF2F -ENCODING 44847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1480 -0400 -FFC0 -0000 -7900 -0B00 -0A80 -0C00 -ENDCHAR -STARTCHAR AF30 -ENCODING 44848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -1480 -0400 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR AF31 -ENCODING 44849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1480 -0400 -FFC0 -0700 -2100 -2100 -2280 -1000 -ENDCHAR -STARTCHAR AF32 -ENCODING 44850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -1480 -0400 -FFC0 -0000 -0300 -4000 -4780 -4480 -3B80 -ENDCHAR -STARTCHAR AF33 -ENCODING 44851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0880 -1480 -0400 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR AF34 -ENCODING 44852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -1480 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR AF35 -ENCODING 44853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -28 -08 -F7 -7F -11 -71 -41 -71 -ENDCHAR -STARTCHAR AF36 -ENCODING 44854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -28 -08 -F7 -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR AF37 -ENCODING 44855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -28 -08 -F7 -79 -1F -79 -49 -76 -ENDCHAR -STARTCHAR AF38 -ENCODING 44856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -28 -08 -F7 -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR AF39 -ENCODING 44857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -28 -08 -F7 -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR AF3A -ENCODING 44858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -28 -08 -F7 -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR AF3B -ENCODING 44859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -28 -08 -F7 -F7 -1F -77 -89 -76 -ENDCHAR -STARTCHAR AF3C -ENCODING 44860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -1480 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR AF3D -ENCODING 44861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -1480 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR AF3E -ENCODING 44862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1480 -0400 -FFC0 -0000 -4900 -7B00 -4A80 -7C00 -ENDCHAR -STARTCHAR AF3F -ENCODING 44863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -1480 -0400 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR AF40 -ENCODING 44864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0880 -1480 -0400 -FFC0 -0000 -1200 -1300 -6C80 -ENDCHAR -STARTCHAR AF41 -ENCODING 44865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -1480 -0400 -FFC0 -0000 -1F00 -2100 -2180 -1F00 -ENDCHAR -STARTCHAR AF42 -ENCODING 44866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -1480 -0400 -FFC0 -0000 -3F00 -0200 -0E00 -7180 -ENDCHAR -STARTCHAR AF43 -ENCODING 44867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -1480 -FFC0 -0000 -0E00 -0000 -3F00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR AF44 -ENCODING 44868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0880 -1480 -0400 -FFC0 -3F00 -0080 -3F00 -0080 -ENDCHAR -STARTCHAR AF45 -ENCODING 44869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -11 -28 -08 -F7 -3E -40 -7E -7E -ENDCHAR -STARTCHAR AF46 -ENCODING 44870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0880 -1480 -0400 -FFC0 -0000 -3F00 -1200 -3F00 -ENDCHAR -STARTCHAR AF47 -ENCODING 44871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -28 -08 -F7 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR AF48 -ENCODING 44872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2280 -2280 -2480 -3480 -10C0 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR AF49 -ENCODING 44873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -1280 -2280 -34C0 -1080 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR AF4A -ENCODING 44874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -3F00 -0880 -0880 -ENDCHAR -STARTCHAR AF4B -ENCODING 44875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -3900 -0900 -0A80 -0800 -ENDCHAR -STARTCHAR AF4C -ENCODING 44876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -2500 -4500 -6180 -2100 -FD00 -4000 -4000 -7E00 -ENDCHAR -STARTCHAR AF4D -ENCODING 44877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0300 -2080 -2100 -2280 -1800 -ENDCHAR -STARTCHAR AF4E -ENCODING 44878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR AF4F -ENCODING 44879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR AF50 -ENCODING 44880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2280 -3480 -10C0 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR AF51 -ENCODING 44881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR AF52 -ENCODING 44882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR AF53 -ENCODING 44883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR AF54 -ENCODING 44884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR AF55 -ENCODING 44885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR AF56 -ENCODING 44886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR AF57 -ENCODING 44887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR AF58 -ENCODING 44888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -3F80 -2080 -3F80 -ENDCHAR -STARTCHAR AF59 -ENCODING 44889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR AF5A -ENCODING 44890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -0900 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR AF5B -ENCODING 44891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR AF5C -ENCODING 44892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -1280 -2280 -34C0 -1080 -FE80 -0080 -1100 -1100 -3300 -4C80 -ENDCHAR -STARTCHAR AF5D -ENCODING 44893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -1280 -2280 -34C0 -1080 -FE80 -0080 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR AF5E -ENCODING 44894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -1F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR AF5F -ENCODING 44895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR AF60 -ENCODING 44896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -1F80 -3F00 -0080 -ENDCHAR -STARTCHAR AF61 -ENCODING 44897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR AF62 -ENCODING 44898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -6C80 -2280 -24C0 -1080 -FE80 -0000 -1F00 -1100 -3F80 -ENDCHAR -STARTCHAR AF63 -ENCODING 44899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -2280 -34C0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR AF64 -ENCODING 44900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -2680 -2680 -2680 -5980 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR AF65 -ENCODING 44901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -4D -4D -B3 -25 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AF66 -ENCODING 44902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -77 -25 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR AF67 -ENCODING 44903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -4D00 -7700 -2500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AF68 -ENCODING 44904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -4D -4F -25 -25 -D5 -05 -20 -3F -ENDCHAR -STARTCHAR AF69 -ENCODING 44905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -4D00 -7700 -2500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR AF6A -ENCODING 44906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR AF6B -ENCODING 44907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -4D -77 -25 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR AF6C -ENCODING 44908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR AF6D -ENCODING 44909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR AF6E -ENCODING 44910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR AF6F -ENCODING 44911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR AF70 -ENCODING 44912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR AF71 -ENCODING 44913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR AF72 -ENCODING 44914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR AF73 -ENCODING 44915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -4D00 -2700 -2500 -F500 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR AF74 -ENCODING 44916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -4D -77 -25 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR AF75 -ENCODING 44917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -4D -77 -25 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR AF76 -ENCODING 44918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -4D00 -7700 -2500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR AF77 -ENCODING 44919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -4D -77 -25 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR AF78 -ENCODING 44920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -4D00 -7700 -2500 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR AF79 -ENCODING 44921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -4D -4D -B3 -25 -FD -00 -3E -41 -41 -3E -ENDCHAR -STARTCHAR AF7A -ENCODING 44922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -4D00 -7700 -2500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR AF7B -ENCODING 44923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -4D00 -2700 -2500 -F500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR AF7C -ENCODING 44924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -77 -25 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR AF7D -ENCODING 44925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR AF7E -ENCODING 44926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -4D -77 -25 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR AF7F -ENCODING 44927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -4D -27 -25 -F5 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR AF80 -ENCODING 44928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -D9 -45 -45 -45 -65 -21 -21 -FD -01 -01 -01 -ENDCHAR -STARTCHAR AF81 -ENCODING 44929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AF82 -ENCODING 44930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR AF83 -ENCODING 44931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4500 -4900 -2100 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AF84 -ENCODING 44932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -D9 -25 -45 -55 -11 -FD -01 -41 -40 -40 -7F -ENDCHAR -STARTCHAR AF85 -ENCODING 44933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR AF86 -ENCODING 44934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR AF87 -ENCODING 44935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -45 -49 -21 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR AF88 -ENCODING 44936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -25 -55 -11 -FD -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR AF89 -ENCODING 44937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR AF8A -ENCODING 44938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR AF8B -ENCODING 44939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR AF8C -ENCODING 44940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR AF8D -ENCODING 44941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR AF8E -ENCODING 44942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR AF8F -ENCODING 44943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR AF90 -ENCODING 44944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -25 -45 -55 -11 -FD -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR AF91 -ENCODING 44945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -25 -45 -55 -11 -FD -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR AF92 -ENCODING 44946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR AF93 -ENCODING 44947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -45 -49 -21 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR AF94 -ENCODING 44948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR AF95 -ENCODING 44949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -DD -25 -45 -55 -11 -FD -01 -3E -41 -41 -3E -ENDCHAR -STARTCHAR AF96 -ENCODING 44950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4500 -4900 -2100 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR AF97 -ENCODING 44951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4500 -4900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR AF98 -ENCODING 44952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR AF99 -ENCODING 44953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR AF9A -ENCODING 44954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -45 -49 -21 -FD -01 -7F -12 -3F -ENDCHAR -STARTCHAR AF9B -ENCODING 44955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR AF9C -ENCODING 44956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7780 -0880 -1080 -1080 -1080 -2A80 -0A00 -0A00 -FFC0 -ENDCHAR -STARTCHAR AF9D -ENCODING 44957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR AF9E -ENCODING 44958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR AF9F -ENCODING 44959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -7900 -0B00 -0A80 -0C00 -ENDCHAR -STARTCHAR AFA0 -ENCODING 44960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -11 -21 -14 -FF -00 -40 -40 -7E -ENDCHAR -STARTCHAR AFA1 -ENCODING 44961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0700 -2100 -2100 -2280 -1000 -ENDCHAR -STARTCHAR AFA2 -ENCODING 44962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -06 -8F -86 -89 -76 -ENDCHAR -STARTCHAR AFA3 -ENCODING 44963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR AFA4 -ENCODING 44964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -11 -34 -FF -00 -7E -01 -7E -7E -ENDCHAR -STARTCHAR AFA5 -ENCODING 44965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -7F -11 -71 -41 -71 -ENDCHAR -STARTCHAR AFA6 -ENCODING 44966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR AFA7 -ENCODING 44967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -79 -1F -79 -49 -76 -ENDCHAR -STARTCHAR AFA8 -ENCODING 44968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR AFA9 -ENCODING 44969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR AFAA -ENCODING 44970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR AFAB -ENCODING 44971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -F7 -1F -77 -89 -76 -ENDCHAR -STARTCHAR AFAC -ENCODING 44972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR AFAD -ENCODING 44973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -2000 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR AFAE -ENCODING 44974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -4900 -7B00 -4A80 -7C00 -ENDCHAR -STARTCHAR AFAF -ENCODING 44975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR AFB0 -ENCODING 44976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -1200 -1300 -6C80 -ENDCHAR -STARTCHAR AFB1 -ENCODING 44977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0C00 -3300 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR AFB2 -ENCODING 44978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -3F00 -0600 -3B80 -ENDCHAR -STARTCHAR AFB3 -ENCODING 44979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR AFB4 -ENCODING 44980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -3F00 -0080 -3F00 -0080 -ENDCHAR -STARTCHAR AFB5 -ENCODING 44981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -11 -34 -FF -00 -3E -40 -7E -7E -ENDCHAR -STARTCHAR AFB6 -ENCODING 44982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0880 -1280 -0A00 -FFC0 -0000 -3F00 -1200 -3F00 -ENDCHAR -STARTCHAR AFB7 -ENCODING 44983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -34 -FF -00 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR AFB8 -ENCODING 44984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7F80 -0880 -0880 -0880 -0900 -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR AFB9 -ENCODING 44985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0400 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR AFBA -ENCODING 44986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -0400 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR AFBB -ENCODING 44987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -0400 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR AFBC -ENCODING 44988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -0900 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR AFBD -ENCODING 44989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -0400 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR AFBE -ENCODING 44990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -0300 -4780 -4300 -4480 -3B00 -ENDCHAR -STARTCHAR AFBF -ENCODING 44991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B80 -0880 -0880 -FFC0 -0400 -0400 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR AFC0 -ENCODING 44992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR AFC1 -ENCODING 44993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR AFC2 -ENCODING 44994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR AFC3 -ENCODING 44995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR AFC4 -ENCODING 44996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR AFC5 -ENCODING 44997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -3300 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR AFC6 -ENCODING 44998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR AFC7 -ENCODING 44999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0400 -7B00 -0800 -7F80 -4480 -3B80 -ENDCHAR -STARTCHAR AFC8 -ENCODING 45000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0400 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR AFC9 -ENCODING 45001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0400 -2480 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR AFCA -ENCODING 45002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -0400 -0400 -4900 -7B00 -4A80 -7C00 -ENDCHAR -STARTCHAR AFCB -ENCODING 45003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0400 -0400 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR AFCC -ENCODING 45004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -0400 -0400 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR AFCD -ENCODING 45005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0400 -0400 -1F00 -2180 -2180 -1F00 -ENDCHAR -STARTCHAR AFCE -ENCODING 45006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0400 -0400 -3F00 -0200 -0E00 -7180 -ENDCHAR -STARTCHAR AFCF -ENCODING 45007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -1E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR AFD0 -ENCODING 45008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -0400 -0400 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR AFD1 -ENCODING 45009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -3F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR AFD2 -ENCODING 45010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B80 -0880 -0880 -FFC0 -0400 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR AFD3 -ENCODING 45011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -0400 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR AFD4 -ENCODING 45012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -6C80 -1280 -1280 -2480 -2480 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR AFD5 -ENCODING 45013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -7F -01 -01 -01 -ENDCHAR -STARTCHAR AFD6 -ENCODING 45014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -7F -09 -09 -09 -ENDCHAR -STARTCHAR AFD7 -ENCODING 45015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2500 -2900 -FD00 -2700 -2100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR AFD8 -ENCODING 45016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -25 -25 -2F -F1 -27 -21 -40 -7F -ENDCHAR -STARTCHAR AFD9 -ENCODING 45017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -47 -42 -45 -30 -ENDCHAR -STARTCHAR AFDA -ENCODING 45018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR AFDB -ENCODING 45019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -3F -40 -7E -ENDCHAR -STARTCHAR AFDC -ENCODING 45020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -27 -29 -FF -21 -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR AFDD -ENCODING 45021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR AFDE -ENCODING 45022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR AFDF -ENCODING 45023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR AFE0 -ENCODING 45024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR AFE1 -ENCODING 45025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR AFE2 -ENCODING 45026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR AFE3 -ENCODING 45027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR AFE4 -ENCODING 45028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -7F -41 -7F -ENDCHAR -STARTCHAR AFE5 -ENCODING 45029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -41 -7F -7F -ENDCHAR -STARTCHAR AFE6 -ENCODING 45030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -52 -72 -55 -78 -ENDCHAR -STARTCHAR AFE7 -ENCODING 45031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -08 -14 -63 -ENDCHAR -STARTCHAR AFE8 -ENCODING 45032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2500 -2900 -FF00 -2100 -2700 -0100 -2200 -2200 -7500 -C880 -ENDCHAR -STARTCHAR AFE9 -ENCODING 45033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -29 -FF -21 -27 -01 -3E -41 -41 -3E -ENDCHAR -STARTCHAR AFEA -ENCODING 45034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2500 -2900 -FD00 -2700 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR AFEB -ENCODING 45035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2500 -2900 -FD00 -2700 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR AFEC -ENCODING 45036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -7F -3F -01 -01 -ENDCHAR -STARTCHAR AFED -ENCODING 45037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR AFEE -ENCODING 45038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -25 -29 -FD -27 -21 -7F -12 -3F -ENDCHAR -STARTCHAR AFEF -ENCODING 45039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -27 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR AFF0 -ENCODING 45040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -F980 -2580 -2580 -2580 -2980 -FD80 -1180 -1680 -1180 -1180 -0180 -ENDCHAR -STARTCHAR AFF1 -ENCODING 45041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2580 -2980 -FD80 -1180 -1680 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR AFF2 -ENCODING 45042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -4B -53 -FB -2B -21 -3F -09 -09 -09 -ENDCHAR -STARTCHAR AFF3 -ENCODING 45043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -4B00 -5300 -FB00 -2B00 -2100 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR AFF4 -ENCODING 45044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2580 -2580 -2980 -FD80 -1180 -1680 -1180 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR AFF5 -ENCODING 45045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -4B00 -5300 -FB00 -2B00 -2100 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR AFF6 -ENCODING 45046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR AFF7 -ENCODING 45047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -4B -53 -FB -2B -21 -3F -40 -7F -ENDCHAR -STARTCHAR AFF8 -ENCODING 45048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2680 -2580 -FD80 -1180 -1000 -3F80 -0080 -3F80 -2000 -3F80 -ENDCHAR -STARTCHAR AFF9 -ENCODING 45049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0000 -1F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR AFFA -ENCODING 45050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR AFFB -ENCODING 45051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0000 -1E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR AFFC -ENCODING 45052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0000 -3900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR AFFD -ENCODING 45053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0000 -1F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR AFFE -ENCODING 45054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR AFFF -ENCODING 45055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR B000 -ENCODING 45056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7D80 -2580 -2580 -FD80 -1180 -1680 -1180 -0000 -3F80 -2080 -3F80 -ENDCHAR -STARTCHAR B001 -ENCODING 45057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7D80 -2580 -2580 -FD80 -1180 -1680 -1000 -2080 -3F80 -2080 -3F80 -ENDCHAR -STARTCHAR B002 -ENCODING 45058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -4B00 -5300 -FB00 -2B00 -2100 -4200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B003 -ENCODING 45059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -4B -53 -FB -2B -21 -08 -1C -63 -ENDCHAR -STARTCHAR B004 -ENCODING 45060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7D80 -2580 -2580 -FD80 -1180 -1680 -0180 -1100 -1100 -2A80 -6440 -ENDCHAR -STARTCHAR B005 -ENCODING 45061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -4B -53 -FB -2B -21 -3E -41 -61 -1E -ENDCHAR -STARTCHAR B006 -ENCODING 45062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -4B00 -5300 -FB00 -2B00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B007 -ENCODING 45063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR B008 -ENCODING 45064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -4B -53 -FB -2B -21 -3F -01 -3F -01 -ENDCHAR -STARTCHAR B009 -ENCODING 45065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR B00A -ENCODING 45066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -4B -53 -FB -2B -21 -3F -12 -3F -ENDCHAR -STARTCHAR B00B -ENCODING 45067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2A80 -FE80 -1680 -0E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR B00C -ENCODING 45068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -1280 -1280 -1280 -2480 -FE80 -1080 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR B00D -ENCODING 45069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B00E -ENCODING 45070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B00F -ENCODING 45071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2500 -2900 -FD00 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B010 -ENCODING 45072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -25 -29 -FF -21 -21 -21 -41 -40 -7F -ENDCHAR -STARTCHAR B011 -ENCODING 45073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B012 -ENCODING 45074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B013 -ENCODING 45075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -3F -40 -7E -ENDCHAR -STARTCHAR B014 -ENCODING 45076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -25 -FF -21 -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR B015 -ENCODING 45077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR B016 -ENCODING 45078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR B017 -ENCODING 45079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B018 -ENCODING 45080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B019 -ENCODING 45081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B01A -ENCODING 45082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR B01B -ENCODING 45083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR B01C -ENCODING 45084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -25 -29 -FF -21 -20 -7F -41 -41 -7F -ENDCHAR -STARTCHAR B01D -ENCODING 45085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -25 -25 -29 -FF -21 -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR B01E -ENCODING 45086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR B01F -ENCODING 45087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -08 -14 -63 -ENDCHAR -STARTCHAR B020 -ENCODING 45088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B021 -ENCODING 45089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B022 -ENCODING 45090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2500 -2900 -FD00 -2100 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B023 -ENCODING 45091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2500 -2900 -FD00 -2100 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B024 -ENCODING 45092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR B025 -ENCODING 45093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR B026 -ENCODING 45094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -25 -29 -FD -21 -00 -7F -12 -3F -ENDCHAR -STARTCHAR B027 -ENCODING 45095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -25 -29 -FD -21 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B028 -ENCODING 45096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7F80 -0880 -0880 -0880 -0900 -FFC0 -1200 -1200 -1200 -1200 -ENDCHAR -STARTCHAR B029 -ENCODING 45097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR B02A -ENCODING 45098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B02B -ENCODING 45099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B02C -ENCODING 45100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -77 -11 -11 -12 -ED -24 -64 -40 -7E -ENDCHAR -STARTCHAR B02D -ENCODING 45101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -2180 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B02E -ENCODING 45102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EE -11 -11 -11 -EE -24 -06 -8F -86 -89 -76 -ENDCHAR -STARTCHAR B02F -ENCODING 45103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR B030 -ENCODING 45104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -EE -11 -11 -11 -EE -24 -7E -01 -7E -7E -ENDCHAR -STARTCHAR B031 -ENCODING 45105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EE -11 -11 -11 -EE -24 -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR B032 -ENCODING 45106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EE -11 -11 -11 -EE -24 -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR B033 -ENCODING 45107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EE -11 -11 -11 -EE -24 -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR B034 -ENCODING 45108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EE -11 -11 -11 -EE -24 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B035 -ENCODING 45109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EE -11 -11 -11 -EE -24 -66 -18 -7F -48 -77 -ENDCHAR -STARTCHAR B036 -ENCODING 45110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EE -11 -11 -11 -EE -24 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR B037 -ENCODING 45111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EE -11 -11 -11 -EE -24 -66 -1F -76 -89 -76 -ENDCHAR -STARTCHAR B038 -ENCODING 45112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR B039 -ENCODING 45113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -2080 -3F00 -3F80 -ENDCHAR -STARTCHAR B03A -ENCODING 45114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -4900 -7B00 -4A80 -7C00 -ENDCHAR -STARTCHAR B03B -ENCODING 45115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1000 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR B03C -ENCODING 45116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR B03D -ENCODING 45117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1000 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR B03E -ENCODING 45118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR B03F -ENCODING 45119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -1100 -1E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR B040 -ENCODING 45120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR B041 -ENCODING 45121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -EE -11 -11 -11 -EE -24 -7E -40 -7E -7E -ENDCHAR -STARTCHAR B042 -ENCODING 45122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B80 -0880 -0880 -FFC0 -1200 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR B043 -ENCODING 45123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7700 -0880 -0880 -0880 -FFC0 -1100 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR B044 -ENCODING 45124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7F80 -0880 -0880 -0880 -0880 -0880 -1080 -1100 -FFC0 -ENDCHAR -STARTCHAR B045 -ENCODING 45125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0000 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B046 -ENCODING 45126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -21 -00 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR B047 -ENCODING 45127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -21 -00 -FF -00 -F2 -16 -15 -18 -ENDCHAR -STARTCHAR B048 -ENCODING 45128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -0880 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B049 -ENCODING 45129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -21 -00 -FF -0E -42 -42 -45 -20 -ENDCHAR -STARTCHAR B04A -ENCODING 45130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0000 -4300 -4000 -4780 -4480 -3B80 -ENDCHAR -STARTCHAR B04B -ENCODING 45131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -11 -21 -00 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR B04C -ENCODING 45132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B04D -ENCODING 45133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1000 -FFC0 -0000 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B04E -ENCODING 45134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0000 -3F80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR B04F -ENCODING 45135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1000 -FFC0 -0000 -3C80 -0F80 -3C80 -2480 -3B00 -ENDCHAR -STARTCHAR B050 -ENCODING 45136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1000 -FFC0 -0000 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B051 -ENCODING 45137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1000 -FFC0 -0000 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR B052 -ENCODING 45138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1000 -FFC0 -0000 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR B053 -ENCODING 45139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0000 -7B00 -0800 -7F80 -4480 -3B80 -ENDCHAR -STARTCHAR B054 -ENCODING 45140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0000 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B055 -ENCODING 45141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0000 -2080 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B056 -ENCODING 45142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -11 -21 -00 -FF -00 -92 -F6 -95 -F8 -ENDCHAR -STARTCHAR B057 -ENCODING 45143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -0880 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B058 -ENCODING 45144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -11 -21 -00 -FF -00 -24 -26 -D9 -ENDCHAR -STARTCHAR B059 -ENCODING 45145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0000 -1E00 -2100 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR B05A -ENCODING 45146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -11 -21 -00 -FF -00 -7E -0C -77 -ENDCHAR -STARTCHAR B05B -ENCODING 45147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1000 -FFC0 -0000 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR B05C -ENCODING 45148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -11 -21 -00 -FF -7E -01 -7E -01 -ENDCHAR -STARTCHAR B05D -ENCODING 45149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7F80 -0880 -0880 -0880 -FFC0 -0000 -3F80 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B05E -ENCODING 45150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -11 -21 -00 -FF -00 -7E -24 -7E -ENDCHAR -STARTCHAR B05F -ENCODING 45151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0880 -1000 -FFC0 -0000 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR B060 -ENCODING 45152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -45 -45 -49 -89 -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR B061 -ENCODING 45153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B062 -ENCODING 45154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B063 -ENCODING 45155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4500 -4900 -0100 -FF00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B064 -ENCODING 45156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -25 -45 -41 -FD -01 -01 -40 -7F -ENDCHAR -STARTCHAR B065 -ENCODING 45157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B066 -ENCODING 45158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B067 -ENCODING 45159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -3F -40 -7E -ENDCHAR -STARTCHAR B068 -ENCODING 45160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -3F00 -0080 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR B069 -ENCODING 45161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -0000 -1B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B06A -ENCODING 45162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -0000 -3F80 -3C80 -2480 -3B00 -ENDCHAR -STARTCHAR B06B -ENCODING 45163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -3000 -0A80 -3B80 -2280 -3B80 -ENDCHAR -STARTCHAR B06C -ENCODING 45164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B06D -ENCODING 45165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -3100 -0A00 -3B80 -2200 -3B80 -ENDCHAR -STARTCHAR B06E -ENCODING 45166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B06F -ENCODING 45167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -3380 -0F80 -3B00 -2480 -3B00 -ENDCHAR -STARTCHAR B070 -ENCODING 45168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -7F -41 -7F -ENDCHAR -STARTCHAR B071 -ENCODING 45169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -41 -7F -7F -ENDCHAR -STARTCHAR B072 -ENCODING 45170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR B073 -ENCODING 45171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -08 -14 -63 -ENDCHAR -STARTCHAR B074 -ENCODING 45172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B075 -ENCODING 45173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B076 -ENCODING 45174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4500 -4900 -0100 -FF00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B077 -ENCODING 45175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR B078 -ENCODING 45176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR B079 -ENCODING 45177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -0F00 -1000 -1F80 -1000 -1F80 -ENDCHAR -STARTCHAR B07A -ENCODING 45178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -45 -49 -01 -FF -01 -7F -12 -3F -ENDCHAR -STARTCHAR B07B -ENCODING 45179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6C80 -2280 -2480 -0080 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR B07C -ENCODING 45180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -25 -25 -29 -49 -49 -91 -21 -01 -01 -01 -ENDCHAR -STARTCHAR B07D -ENCODING 45181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -25 -25 -49 -89 -11 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B07E -ENCODING 45182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -29 -49 -91 -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B07F -ENCODING 45183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2900 -4900 -9100 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B080 -ENCODING 45184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -25 -25 -49 -49 -91 -11 -01 -40 -40 -3F -ENDCHAR -STARTCHAR B081 -ENCODING 45185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -29 -49 -91 -21 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B082 -ENCODING 45186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B083 -ENCODING 45187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -29 -49 -91 -21 -00 -7E -40 -7E -ENDCHAR -STARTCHAR B084 -ENCODING 45188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -25 -29 -49 -B1 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B085 -ENCODING 45189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B086 -ENCODING 45190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B087 -ENCODING 45191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B088 -ENCODING 45192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B089 -ENCODING 45193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B08A -ENCODING 45194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B08B -ENCODING 45195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B08C -ENCODING 45196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -25 -25 -49 -91 -11 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B08D -ENCODING 45197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -25 -25 -49 -91 -11 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B08E -ENCODING 45198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2900 -4900 -9100 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B08F -ENCODING 45199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -2500 -2500 -4900 -4900 -9100 -1100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B090 -ENCODING 45200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2900 -4900 -9100 -2100 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B091 -ENCODING 45201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -25 -25 -49 -91 -11 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR B092 -ENCODING 45202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -2900 -4900 -9100 -2100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B093 -ENCODING 45203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -2900 -4900 -9100 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B094 -ENCODING 45204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -29 -49 -91 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B095 -ENCODING 45205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B096 -ENCODING 45206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -29 -49 -91 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B097 -ENCODING 45207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -29 -49 -91 -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B098 -ENCODING 45208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8100 -8180 -8100 -8100 -FD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B099 -ENCODING 45209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -8100 -FD00 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B09A -ENCODING 45210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8180 -8100 -FD00 -0000 -7E00 -1100 -1100 -1100 -ENDCHAR -STARTCHAR B09B -ENCODING 45211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -8180 -8900 -7100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B09C -ENCODING 45212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8180 -8100 -FD00 -0100 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B09D -ENCODING 45213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -8180 -8900 -7100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B09E -ENCODING 45214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -8180 -FD00 -0000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR B09F -ENCODING 45215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8180 -8100 -FD00 -0000 -7F00 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B0A0 -ENCODING 45216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -FD00 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR B0A1 -ENCODING 45217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -FD00 -0000 -7F00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR B0A2 -ENCODING 45218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -FD00 -0000 -7F00 -1900 -7900 -8900 -7F00 -ENDCHAR -STARTCHAR B0A3 -ENCODING 45219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -8180 -FD00 -0000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR B0A4 -ENCODING 45220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -8180 -FD00 -0000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR B0A5 -ENCODING 45221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -8180 -FD00 -0000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR B0A6 -ENCODING 45222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -8180 -FD00 -0000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR B0A7 -ENCODING 45223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -8180 -FD00 -0000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR B0A8 -ENCODING 45224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8180 -8100 -FD00 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR B0A9 -ENCODING 45225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8180 -8100 -FD00 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR B0AA -ENCODING 45226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -8180 -8900 -7100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B0AB -ENCODING 45227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8180 -8100 -FD00 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR B0AC -ENCODING 45228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8180 -8100 -FD00 -0100 -2200 -2200 -5700 -8980 -ENDCHAR -STARTCHAR B0AD -ENCODING 45229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8180 -8100 -FD00 -0100 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR B0AE -ENCODING 45230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8100 -8180 -8100 -FD00 -0000 -3E00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B0AF -ENCODING 45231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -FD00 -0100 -1C00 -0000 -7F00 -0200 -1C00 -6380 -ENDCHAR -STARTCHAR B0B0 -ENCODING 45232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -8100 -8180 -8900 -7100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR B0B1 -ENCODING 45233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -FD00 -0000 -7F00 -4000 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR B0B2 -ENCODING 45234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8100 -8180 -8900 -7100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR B0B3 -ENCODING 45235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8180 -FD00 -0100 -1C00 -0000 -7F00 -0000 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR B0B4 -ENCODING 45236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -85 -85 -87 -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR B0B5 -ENCODING 45237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -85 -87 -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B0B6 -ENCODING 45238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -9D -65 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B0B7 -ENCODING 45239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -8700 -9D00 -6500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B0B8 -ENCODING 45240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8500 -8500 -8500 -8700 -8500 -FD00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B0B9 -ENCODING 45241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -8700 -9D00 -6500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B0BA -ENCODING 45242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B0BB -ENCODING 45243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -87 -9D -65 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B0BC -ENCODING 45244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -87 -85 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B0BD -ENCODING 45245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B0BE -ENCODING 45246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B0BF -ENCODING 45247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B0C0 -ENCODING 45248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B0C1 -ENCODING 45249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B0C2 -ENCODING 45250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B0C3 -ENCODING 45251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B0C4 -ENCODING 45252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -85 -87 -85 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B0C5 -ENCODING 45253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -87 -85 -FD -00 -21 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B0C6 -ENCODING 45254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -8700 -9D00 -6500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B0C7 -ENCODING 45255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8500 -8500 -8500 -8700 -8500 -FD00 -0100 -0800 -0C00 -3200 -4180 -ENDCHAR -STARTCHAR B0C8 -ENCODING 45256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8500 -8500 -8500 -8700 -8500 -FD00 -0500 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR B0C9 -ENCODING 45257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -85 -87 -85 -FD -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B0CA -ENCODING 45258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -8700 -9D00 -6500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B0CB -ENCODING 45259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -8700 -FD00 -0500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B0CC -ENCODING 45260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -9D -65 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B0CD -ENCODING 45261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B0CE -ENCODING 45262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -87 -9D -65 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B0CF -ENCODING 45263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -87 -FD -05 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B0D0 -ENCODING 45264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -8100 -8180 -8100 -FD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B0D1 -ENCODING 45265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -8180 -FD00 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B0D2 -ENCODING 45266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B0D3 -ENCODING 45267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B0D4 -ENCODING 45268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -8100 -FD80 -0100 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B0D5 -ENCODING 45269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -8980 -7100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B0D6 -ENCODING 45270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR B0D7 -ENCODING 45271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR B0D8 -ENCODING 45272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8180 -8100 -8180 -FD00 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR B0D9 -ENCODING 45273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR B0DA -ENCODING 45274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR B0DB -ENCODING 45275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR B0DC -ENCODING 45276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR B0DD -ENCODING 45277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR B0DE -ENCODING 45278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR B0DF -ENCODING 45279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR B0E0 -ENCODING 45280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -8180 -FD00 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR B0E1 -ENCODING 45281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR B0E2 -ENCODING 45282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B0E3 -ENCODING 45283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR B0E4 -ENCODING 45284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR B0E5 -ENCODING 45285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8180 -8100 -8180 -FD00 -0100 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR B0E6 -ENCODING 45286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR B0E7 -ENCODING 45287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B0E8 -ENCODING 45288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR B0E9 -ENCODING 45289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR B0EA -ENCODING 45290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8180 -8100 -8980 -7100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR B0EB -ENCODING 45291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8180 -8100 -FD80 -0000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR B0EC -ENCODING 45292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -85 -85 -87 -85 -85 -8F -75 -05 -05 -ENDCHAR -STARTCHAR B0ED -ENCODING 45293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -9F -65 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B0EE -ENCODING 45294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -9F -65 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B0EF -ENCODING 45295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8700 -8500 -9F00 -6500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B0F0 -ENCODING 45296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -87 -85 -FF -05 -05 -20 -3F -ENDCHAR -STARTCHAR B0F1 -ENCODING 45297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8700 -8500 -9F00 -6500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B0F2 -ENCODING 45298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B0F3 -ENCODING 45299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -87 -85 -9F -65 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B0F4 -ENCODING 45300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B0F5 -ENCODING 45301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B0F6 -ENCODING 45302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B0F7 -ENCODING 45303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B0F8 -ENCODING 45304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B0F9 -ENCODING 45305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B0FA -ENCODING 45306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B0FB -ENCODING 45307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B0FC -ENCODING 45308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -87 -85 -9F -65 -00 -3F -41 -7F -ENDCHAR -STARTCHAR B0FD -ENCODING 45309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -87 -85 -9F -65 -00 -21 -3F -3F -ENDCHAR -STARTCHAR B0FE -ENCODING 45310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8700 -8500 -9F00 -6500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B0FF -ENCODING 45311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -87 -85 -9F -65 -00 -08 -14 -63 -ENDCHAR -STARTCHAR B100 -ENCODING 45312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8700 -8500 -9F00 -6500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B101 -ENCODING 45313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -9F -65 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR B102 -ENCODING 45314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8700 -8500 -9F00 -6500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B103 -ENCODING 45315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8700 -8500 -FF00 -0500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B104 -ENCODING 45316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -9F -65 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B105 -ENCODING 45317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B106 -ENCODING 45318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -87 -85 -9F -65 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B107 -ENCODING 45319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -87 -85 -FF -05 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B108 -ENCODING 45320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -8F -81 -81 -81 -FD -01 -01 -01 -ENDCHAR -STARTCHAR B109 -ENCODING 45321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -81 -7D -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B10A -ENCODING 45322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -87 -81 -85 -79 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B10B -ENCODING 45323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8F00 -8100 -8100 -7D00 -0100 -7200 -1200 -1700 -0C80 -ENDCHAR -STARTCHAR B10C -ENCODING 45324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -81 -7D -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR B10D -ENCODING 45325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -87 -81 -85 -79 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B10E -ENCODING 45326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -8F -81 -FD -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B10F -ENCODING 45327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -87 -81 -85 -79 -00 -7E -40 -7E -ENDCHAR -STARTCHAR B110 -ENCODING 45328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B111 -ENCODING 45329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -8F -81 -FD -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B112 -ENCODING 45330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -FD -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B113 -ENCODING 45331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -FD -00 -75 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B114 -ENCODING 45332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -8F -81 -FD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B115 -ENCODING 45333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -8F -81 -FD -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B116 -ENCODING 45334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -8F -81 -FD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B117 -ENCODING 45335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -8F -81 -FD -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B118 -ENCODING 45336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -81 -7D -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B119 -ENCODING 45337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -FD -00 -41 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B11A -ENCODING 45338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8700 -8100 -8500 -7900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B11B -ENCODING 45339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -81 -7D -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR B11C -ENCODING 45340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -8F00 -8100 -8100 -7D00 -0000 -1200 -2200 -3300 -4C80 -ENDCHAR -STARTCHAR B11D -ENCODING 45341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -81 -7D -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR B11E -ENCODING 45342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8700 -8100 -8500 -7900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B11F -ENCODING 45343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8F00 -8100 -FD00 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B120 -ENCODING 45344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -87 -81 -85 -79 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B121 -ENCODING 45345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -8F -81 -FD -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B122 -ENCODING 45346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -87 -81 -85 -79 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B123 -ENCODING 45347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -FD -01 -1C -00 -7F -22 -1E -ENDCHAR -STARTCHAR B124 -ENCODING 45348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -85 -9D -85 -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR B125 -ENCODING 45349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -9D -85 -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B126 -ENCODING 45350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -8D -85 -9D -65 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B127 -ENCODING 45351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8D00 -8500 -9D00 -6500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B128 -ENCODING 45352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8500 -8500 -9D00 -8500 -8500 -FD00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B129 -ENCODING 45353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8D00 -8500 -9D00 -6500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B12A -ENCODING 45354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B12B -ENCODING 45355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -8D -85 -9D -65 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B12C -ENCODING 45356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -9D -85 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B12D -ENCODING 45357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B12E -ENCODING 45358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B12F -ENCODING 45359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B130 -ENCODING 45360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B131 -ENCODING 45361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B132 -ENCODING 45362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B133 -ENCODING 45363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B134 -ENCODING 45364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -9D -85 -85 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B135 -ENCODING 45365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -9D -85 -FD -05 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B136 -ENCODING 45366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8D00 -8500 -9D00 -6500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B137 -ENCODING 45367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8500 -8500 -9D00 -8500 -8500 -FD00 -0500 -0900 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B138 -ENCODING 45368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8500 -8500 -9D00 -8500 -8500 -FD00 -0000 -2200 -2200 -3300 -4C80 -ENDCHAR -STARTCHAR B139 -ENCODING 45369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -9D -85 -85 -FD -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B13A -ENCODING 45370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8D00 -8500 -9D00 -6500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B13B -ENCODING 45371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -9D00 -8500 -FD00 -0100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B13C -ENCODING 45372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -8D -85 -9D -65 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B13D -ENCODING 45373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B13E -ENCODING 45374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -8D -85 -9D -65 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B13F -ENCODING 45375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -9D -85 -FD -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B140 -ENCODING 45376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -8F -81 -8F -81 -81 -FD -01 -01 -01 -ENDCHAR -STARTCHAR B141 -ENCODING 45377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -8F -81 -8F -81 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B142 -ENCODING 45378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -87 -81 -8F -85 -79 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B143 -ENCODING 45379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8700 -8100 -8F00 -8500 -7900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B144 -ENCODING 45380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -8F -81 -8F -81 -FD -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR B145 -ENCODING 45381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -87 -81 -8F -85 -79 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B146 -ENCODING 45382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B147 -ENCODING 45383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -87 -81 -8F -85 -79 -00 -7E -40 -7E -ENDCHAR -STARTCHAR B148 -ENCODING 45384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -8F -81 -8F -81 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B149 -ENCODING 45385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B14A -ENCODING 45386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B14B -ENCODING 45387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B14C -ENCODING 45388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B14D -ENCODING 45389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B14E -ENCODING 45390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B14F -ENCODING 45391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B150 -ENCODING 45392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -8F -81 -8F -81 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B151 -ENCODING 45393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -8F -81 -8F -81 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B152 -ENCODING 45394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8700 -8100 -8F00 -8500 -7900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B153 -ENCODING 45395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -87 -81 -8F -85 -79 -00 -08 -14 -63 -ENDCHAR -STARTCHAR B154 -ENCODING 45396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8F00 -8100 -8F00 -8100 -FD00 -0000 -1200 -3200 -3300 -4C80 -ENDCHAR -STARTCHAR B155 -ENCODING 45397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -8F -81 -8F -81 -FD -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR B156 -ENCODING 45398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8700 -8100 -8F00 -8500 -7900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B157 -ENCODING 45399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8F00 -8100 -8F00 -FD00 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B158 -ENCODING 45400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -8F -81 -8F -81 -FD -00 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B159 -ENCODING 45401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B15A -ENCODING 45402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -87 -81 -8F -85 -79 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B15B -ENCODING 45403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8F -81 -8F -FD -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B15C -ENCODING 45404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -85 -85 -9D -85 -9D -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR B15D -ENCODING 45405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -8D -9D -9D -65 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B15E -ENCODING 45406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -8D -9D -9D -65 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B15F -ENCODING 45407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8D00 -9D00 -9D00 -6500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B160 -ENCODING 45408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8500 -9D00 -8500 -9D00 -8500 -FD00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B161 -ENCODING 45409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8D00 -9D00 -9D00 -6500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B162 -ENCODING 45410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B163 -ENCODING 45411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -8D -9D -9D -65 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B164 -ENCODING 45412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B165 -ENCODING 45413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B166 -ENCODING 45414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B167 -ENCODING 45415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B168 -ENCODING 45416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B169 -ENCODING 45417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B16A -ENCODING 45418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B16B -ENCODING 45419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B16C -ENCODING 45420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -8D -9D -9D -65 -00 -3F -41 -7F -ENDCHAR -STARTCHAR B16D -ENCODING 45421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -8D -9D -9D -65 -00 -21 -3F -3F -ENDCHAR -STARTCHAR B16E -ENCODING 45422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8D00 -9D00 -9D00 -6500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B16F -ENCODING 45423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -8D -9D -9D -65 -00 -08 -14 -63 -ENDCHAR -STARTCHAR B170 -ENCODING 45424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8D00 -9D00 -9D00 -6500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B171 -ENCODING 45425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -8D -9D -9D -65 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR B172 -ENCODING 45426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8D00 -9D00 -9D00 -6500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B173 -ENCODING 45427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8D00 -8500 -9D00 -FD00 -0100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B174 -ENCODING 45428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -8D -9D -9D -65 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B175 -ENCODING 45429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B176 -ENCODING 45430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -8D -9D -9D -65 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B177 -ENCODING 45431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -8D -85 -9D -FD -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B178 -ENCODING 45432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -2000 -2000 -2000 -2000 -3F80 -0400 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR B179 -ENCODING 45433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B17A -ENCODING 45434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -40 -7F -08 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR B17B -ENCODING 45435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -4000 -4000 -7F00 -0800 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR B17C -ENCODING 45436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0400 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B17D -ENCODING 45437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -40 -7F -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B17E -ENCODING 45438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -FF -00 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B17F -ENCODING 45439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -40 -40 -7F -08 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR B180 -ENCODING 45440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B181 -ENCODING 45441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -FF -00 -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR B182 -ENCODING 45442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -3F80 -0400 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR B183 -ENCODING 45443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -FF -00 -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR B184 -ENCODING 45444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -FF -00 -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B185 -ENCODING 45445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -FF -00 -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR B186 -ENCODING 45446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -FF -00 -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR B187 -ENCODING 45447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -FF -00 -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR B188 -ENCODING 45448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B189 -ENCODING 45449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B18A -ENCODING 45450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -40 -7F -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR B18B -ENCODING 45451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0400 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B18C -ENCODING 45452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -40 -7F -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR B18D -ENCODING 45453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR B18E -ENCODING 45454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -40 -40 -7F -08 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR B18F -ENCODING 45455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -FF -00 -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR B190 -ENCODING 45456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -40 -40 -7F -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR B191 -ENCODING 45457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -40 -40 -7F -FF -00 -3E -40 -7E -7E -ENDCHAR -STARTCHAR B192 -ENCODING 45458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0400 -FFC0 -0000 -3F80 -1200 -1200 -7F80 -ENDCHAR -STARTCHAR B193 -ENCODING 45459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -3F80 -0400 -FFC0 -0000 -1E00 -0000 -3F80 -1100 -1E00 -ENDCHAR -STARTCHAR B194 -ENCODING 45460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4080 -4080 -4080 -7CC0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B195 -ENCODING 45461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR B196 -ENCODING 45462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B197 -ENCODING 45463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B198 -ENCODING 45464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4080 -4080 -7C80 -10C0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B199 -ENCODING 45465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B19A -ENCODING 45466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B19B -ENCODING 45467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR B19C -ENCODING 45468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4080 -7CC0 -1080 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B19D -ENCODING 45469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B19E -ENCODING 45470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B19F -ENCODING 45471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR B1A0 -ENCODING 45472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B1A1 -ENCODING 45473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR B1A2 -ENCODING 45474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B1A3 -ENCODING 45475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR B1A4 -ENCODING 45476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR B1A5 -ENCODING 45477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR B1A6 -ENCODING 45478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR B1A7 -ENCODING 45479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR B1A8 -ENCODING 45480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4080 -4080 -4080 -7CC0 -1080 -FE80 -0080 -1100 -1100 -2B00 -4480 -ENDCHAR -STARTCHAR B1A9 -ENCODING 45481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -3E00 -4100 -4200 -3C00 -ENDCHAR -STARTCHAR B1AA -ENCODING 45482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR B1AB -ENCODING 45483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR B1AC -ENCODING 45484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR B1AD -ENCODING 45485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR B1AE -ENCODING 45486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8100 -8100 -D980 -2100 -FD00 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR B1AF -ENCODING 45487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4080 -4080 -3CC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR B1B0 -ENCODING 45488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -05 -85 -85 -87 -F5 -25 -1D -E5 -05 -01 -ENDCHAR -STARTCHAR B1B1 -ENCODING 45489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B1B2 -ENCODING 45490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B1B3 -ENCODING 45491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F700 -2500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B1B4 -ENCODING 45492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -85 -77 -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR B1B5 -ENCODING 45493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F700 -2500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B1B6 -ENCODING 45494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B1B7 -ENCODING 45495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F7 -25 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR B1B8 -ENCODING 45496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR B1B9 -ENCODING 45497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR B1BA -ENCODING 45498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR B1BB -ENCODING 45499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B1BC -ENCODING 45500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR B1BD -ENCODING 45501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B1BE -ENCODING 45502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B1BF -ENCODING 45503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F700 -2500 -F500 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR B1C0 -ENCODING 45504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F7 -25 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR B1C1 -ENCODING 45505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F7 -25 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR B1C2 -ENCODING 45506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F700 -2500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B1C3 -ENCODING 45507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F7 -25 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR B1C4 -ENCODING 45508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F700 -2500 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B1C5 -ENCODING 45509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR B1C6 -ENCODING 45510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F700 -2500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B1C7 -ENCODING 45511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F700 -2500 -F500 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B1C8 -ENCODING 45512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B1C9 -ENCODING 45513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B1CA -ENCODING 45514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F7 -25 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B1CB -ENCODING 45515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F7 -25 -F5 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B1CC -ENCODING 45516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4080 -4080 -4080 -4080 -7C80 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B1CD -ENCODING 45517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -D9 -21 -FD -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B1CE -ENCODING 45518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -D9 -21 -FD -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B1CF -ENCODING 45519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -D900 -2100 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B1D0 -ENCODING 45520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -79 -21 -21 -FF -01 -40 -40 -7F -ENDCHAR -STARTCHAR B1D1 -ENCODING 45521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -D9 -21 -FD -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B1D2 -ENCODING 45522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B1D3 -ENCODING 45523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -D9 -21 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR B1D4 -ENCODING 45524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -79 -21 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR B1D5 -ENCODING 45525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR B1D6 -ENCODING 45526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR B1D7 -ENCODING 45527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B1D8 -ENCODING 45528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B1D9 -ENCODING 45529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B1DA -ENCODING 45530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR B1DB -ENCODING 45531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR B1DC -ENCODING 45532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -79 -21 -FF -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR B1DD -ENCODING 45533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -79 -21 -FF -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR B1DE -ENCODING 45534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -D9 -21 -FD -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR B1DF -ENCODING 45535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -79 -21 -FF -01 -08 -08 -36 -41 -ENDCHAR -STARTCHAR B1E0 -ENCODING 45536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -D9 -21 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B1E1 -ENCODING 45537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -D9 -21 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B1E2 -ENCODING 45538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -D900 -2100 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B1E3 -ENCODING 45539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -7900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B1E4 -ENCODING 45540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -D9 -21 -FD -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR B1E5 -ENCODING 45541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR B1E6 -ENCODING 45542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -D9 -21 -FD -01 -7F -12 -3F -ENDCHAR -STARTCHAR B1E7 -ENCODING 45543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B1E8 -ENCODING 45544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -2000 -2000 -2000 -2000 -3F80 -1200 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR B1E9 -ENCODING 45545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -1200 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B1EA -ENCODING 45546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -40 -7F -24 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR B1EB -ENCODING 45547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -4000 -4000 -7F00 -2400 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR B1EC -ENCODING 45548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -1200 -1200 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B1ED -ENCODING 45549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -40 -7F -24 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B1EE -ENCODING 45550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B1EF -ENCODING 45551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -40 -40 -7F -24 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR B1F0 -ENCODING 45552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -3F80 -1200 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B1F1 -ENCODING 45553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR B1F2 -ENCODING 45554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR B1F3 -ENCODING 45555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR B1F4 -ENCODING 45556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B1F5 -ENCODING 45557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR B1F6 -ENCODING 45558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR B1F7 -ENCODING 45559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR B1F8 -ENCODING 45560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -40 -40 -7F -24 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR B1F9 -ENCODING 45561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -1200 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B1FA -ENCODING 45562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -40 -7F -24 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR B1FB -ENCODING 45563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -1200 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B1FC -ENCODING 45564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -40 -7F -24 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR B1FD -ENCODING 45565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -1200 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR B1FE -ENCODING 45566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -40 -40 -7F -24 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR B1FF -ENCODING 45567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR B200 -ENCODING 45568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -40 -40 -7F -24 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR B201 -ENCODING 45569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -40 -40 -7F -24 -DB -3E -40 -7E -7E -ENDCHAR -STARTCHAR B202 -ENCODING 45570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -40 -40 -7F -24 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR B203 -ENCODING 45571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -24 -DB -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B204 -ENCODING 45572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2000 -2000 -2000 -2000 -3F80 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR B205 -ENCODING 45573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B206 -ENCODING 45574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B207 -ENCODING 45575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B208 -ENCODING 45576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR B209 -ENCODING 45577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B20A -ENCODING 45578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR B20B -ENCODING 45579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B20C -ENCODING 45580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B20D -ENCODING 45581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -08 -7F -71 -41 -71 -ENDCHAR -STARTCHAR B20E -ENCODING 45582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -08 -7F -79 -89 -76 -ENDCHAR -STARTCHAR B20F -ENCODING 45583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR B210 -ENCODING 45584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR B211 -ENCODING 45585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR B212 -ENCODING 45586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR B213 -ENCODING 45587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR B214 -ENCODING 45588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B215 -ENCODING 45589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0400 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B216 -ENCODING 45590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR B217 -ENCODING 45591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0400 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B218 -ENCODING 45592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR B219 -ENCODING 45593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR B21A -ENCODING 45594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -40 -40 -7F -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR B21B -ENCODING 45595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR B21C -ENCODING 45596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR B21D -ENCODING 45597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -40 -40 -7F -00 -FF -08 -7E -7E -7E -ENDCHAR -STARTCHAR B21E -ENCODING 45598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR B21F -ENCODING 45599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B220 -ENCODING 45600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4080 -4080 -4080 -7C80 -0080 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR B221 -ENCODING 45601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR B222 -ENCODING 45602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B223 -ENCODING 45603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR B224 -ENCODING 45604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -F9 -01 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR B225 -ENCODING 45605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B226 -ENCODING 45606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -46 -4F -49 -36 -ENDCHAR -STARTCHAR B227 -ENCODING 45607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -79 -DD -27 -21 -3F -40 -7E -ENDCHAR -STARTCHAR B228 -ENCODING 45608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -7F -3F -40 -3F -ENDCHAR -STARTCHAR B229 -ENCODING 45609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -77 -31 -41 -71 -ENDCHAR -STARTCHAR B22A -ENCODING 45610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -77 -79 -49 -77 -ENDCHAR -STARTCHAR B22B -ENCODING 45611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B22C -ENCODING 45612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -52 -72 -85 -68 -ENDCHAR -STARTCHAR B22D -ENCODING 45613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B22E -ENCODING 45614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B22F -ENCODING 45615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -76 -37 -49 -76 -ENDCHAR -STARTCHAR B230 -ENCODING 45616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -79 -DD -27 -21 -7F -41 -7F -ENDCHAR -STARTCHAR B231 -ENCODING 45617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -79 -DD -27 -21 -41 -7F -7F -ENDCHAR -STARTCHAR B232 -ENCODING 45618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR B233 -ENCODING 45619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -79 -DD -27 -21 -08 -14 -63 -ENDCHAR -STARTCHAR B234 -ENCODING 45620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8100 -8100 -7900 -0100 -FD00 -2100 -2700 -0100 -2200 -3300 -CC80 -ENDCHAR -STARTCHAR B235 -ENCODING 45621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B236 -ENCODING 45622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -7900 -DD00 -2700 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B237 -ENCODING 45623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -7900 -DD00 -2300 -3D00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B238 -ENCODING 45624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B239 -ENCODING 45625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -27 -21 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B23A -ENCODING 45626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -79 -DD -27 -21 -3F -12 -3F -ENDCHAR -STARTCHAR B23B -ENCODING 45627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -DD -23 -3D -23 -1C -22 -1E -ENDCHAR -STARTCHAR B23C -ENCODING 45628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4280 -4280 -4280 -7A80 -0280 -FE80 -1280 -1680 -1280 -1280 -0280 -ENDCHAR -STARTCHAR B23D -ENCODING 45629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B23E -ENCODING 45630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B23F -ENCODING 45631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F500 -1D00 -E500 -2900 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B240 -ENCODING 45632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -4280 -4280 -7A80 -0280 -FA80 -1680 -0080 -2000 -3F80 -ENDCHAR -STARTCHAR B241 -ENCODING 45633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F500 -1D00 -E500 -2900 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B242 -ENCODING 45634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR B243 -ENCODING 45635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -3F -40 -7F -ENDCHAR -STARTCHAR B244 -ENCODING 45636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -0F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR B245 -ENCODING 45637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -0F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR B246 -ENCODING 45638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR B247 -ENCODING 45639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -0E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR B248 -ENCODING 45640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -2900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR B249 -ENCODING 45641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -0F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR B24A -ENCODING 45642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -2B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR B24B -ENCODING 45643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR B24C -ENCODING 45644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -3F -41 -7F -ENDCHAR -STARTCHAR B24D -ENCODING 45645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -41 -7F -7F -ENDCHAR -STARTCHAR B24E -ENCODING 45646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F500 -1D00 -E500 -2900 -4200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B24F -ENCODING 45647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -08 -1C -63 -ENDCHAR -STARTCHAR B250 -ENCODING 45648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -02 -22 -55 -08 -ENDCHAR -STARTCHAR B251 -ENCODING 45649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -3E -41 -61 -1E -ENDCHAR -STARTCHAR B252 -ENCODING 45650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8500 -8500 -F500 -1D00 -E500 -2900 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B253 -ENCODING 45651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR B254 -ENCODING 45652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -3F -01 -3F -01 -ENDCHAR -STARTCHAR B255 -ENCODING 45653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR B256 -ENCODING 45654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -85 -85 -F5 -1D -E5 -29 -3F -12 -3F -ENDCHAR -STARTCHAR B257 -ENCODING 45655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4280 -4280 -3A80 -FE80 -1680 -1E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR B258 -ENCODING 45656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4080 -4080 -4080 -4080 -3C80 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR B259 -ENCODING 45657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR B25A -ENCODING 45658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B25B -ENCODING 45659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR B25C -ENCODING 45660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -79 -01 -FD -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR B25D -ENCODING 45661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B25E -ENCODING 45662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR B25F -ENCODING 45663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -79 -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR B260 -ENCODING 45664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -79 -01 -FF -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR B261 -ENCODING 45665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR B262 -ENCODING 45666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR B263 -ENCODING 45667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B264 -ENCODING 45668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR B265 -ENCODING 45669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B266 -ENCODING 45670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B267 -ENCODING 45671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR B268 -ENCODING 45672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -79 -01 -FF -21 -20 -7F -41 -41 -7F -ENDCHAR -STARTCHAR B269 -ENCODING 45673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -79 -01 -FF -21 -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR B26A -ENCODING 45674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR B26B -ENCODING 45675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -79 -01 -FD -21 -08 -14 -63 -ENDCHAR -STARTCHAR B26C -ENCODING 45676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B26D -ENCODING 45677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B26E -ENCODING 45678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -7900 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B26F -ENCODING 45679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -7900 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B270 -ENCODING 45680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B271 -ENCODING 45681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B272 -ENCODING 45682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -79 -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR B273 -ENCODING 45683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B274 -ENCODING 45684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2000 -2000 -2000 -3F80 -0000 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR B275 -ENCODING 45685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B276 -ENCODING 45686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B277 -ENCODING 45687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B278 -ENCODING 45688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -3200 -2000 -3F00 -ENDCHAR -STARTCHAR B279 -ENCODING 45689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B27A -ENCODING 45690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR B27B -ENCODING 45691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR B27C -ENCODING 45692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B27D -ENCODING 45693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR B27E -ENCODING 45694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR B27F -ENCODING 45695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR B280 -ENCODING 45696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR B281 -ENCODING 45697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR B282 -ENCODING 45698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR B283 -ENCODING 45699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR B284 -ENCODING 45700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B285 -ENCODING 45701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -1200 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B286 -ENCODING 45702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR B287 -ENCODING 45703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -1400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR B288 -ENCODING 45704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR B289 -ENCODING 45705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -1200 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR B28A -ENCODING 45706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR B28B -ENCODING 45707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR B28C -ENCODING 45708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR B28D -ENCODING 45709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -40 -40 -7F -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR B28E -ENCODING 45710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR B28F -ENCODING 45711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR B290 -ENCODING 45712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -2000 -2000 -2000 -2000 -3F80 -0000 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR B291 -ENCODING 45713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B292 -ENCODING 45714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B293 -ENCODING 45715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B294 -ENCODING 45716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B295 -ENCODING 45717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B296 -ENCODING 45718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B297 -ENCODING 45719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR B298 -ENCODING 45720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B299 -ENCODING 45721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B29A -ENCODING 45722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR B29B -ENCODING 45723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR B29C -ENCODING 45724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B29D -ENCODING 45725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR B29E -ENCODING 45726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR B29F -ENCODING 45727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR B2A0 -ENCODING 45728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B2A1 -ENCODING 45729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B2A2 -ENCODING 45730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR B2A3 -ENCODING 45731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B2A4 -ENCODING 45732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR B2A5 -ENCODING 45733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0000 -1F00 -2100 -2100 -1F00 -ENDCHAR -STARTCHAR B2A6 -ENCODING 45734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B2A7 -ENCODING 45735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR B2A8 -ENCODING 45736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR B2A9 -ENCODING 45737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -40 -40 -7F -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR B2AA -ENCODING 45738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F80 -1200 -1200 -7F80 -ENDCHAR -STARTCHAR B2AB -ENCODING 45739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -40 -40 -7F -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B2AC -ENCODING 45740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4080 -4080 -4080 -4080 -7C80 -0080 -0080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B2AD -ENCODING 45741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B2AE -ENCODING 45742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B2AF -ENCODING 45743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -F900 -0100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B2B0 -ENCODING 45744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -79 -01 -01 -FF -01 -40 -40 -7F -ENDCHAR -STARTCHAR B2B1 -ENCODING 45745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B2B2 -ENCODING 45746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B2B3 -ENCODING 45747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -3F -40 -7E -ENDCHAR -STARTCHAR B2B4 -ENCODING 45748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -79 -01 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR B2B5 -ENCODING 45749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR B2B6 -ENCODING 45750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR B2B7 -ENCODING 45751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B2B8 -ENCODING 45752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B2B9 -ENCODING 45753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B2BA -ENCODING 45754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR B2BB -ENCODING 45755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR B2BC -ENCODING 45756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -7F -41 -7F -ENDCHAR -STARTCHAR B2BD -ENCODING 45757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -41 -7F -7F -ENDCHAR -STARTCHAR B2BE -ENCODING 45758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR B2BF -ENCODING 45759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -F9 -01 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR B2C0 -ENCODING 45760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B2C1 -ENCODING 45761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -F9 -01 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B2C2 -ENCODING 45762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -F900 -0100 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B2C3 -ENCODING 45763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -7900 -0100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B2C4 -ENCODING 45764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR B2C5 -ENCODING 45765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR B2C6 -ENCODING 45766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -F9 -01 -FD -00 -7F -12 -3F -ENDCHAR -STARTCHAR B2C7 -ENCODING 45767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -79 -01 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B2C8 -ENCODING 45768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -81 -81 -81 -7D -01 -01 -01 -ENDCHAR -STARTCHAR B2C9 -ENCODING 45769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -81 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B2CA -ENCODING 45770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -85 -79 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B2CB -ENCODING 45771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -8100 -8500 -7900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B2CC -ENCODING 45772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -81 -FD -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR B2CD -ENCODING 45773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -85 -79 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B2CE -ENCODING 45774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -FD -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B2CF -ENCODING 45775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -81 -81 -81 -85 -79 -00 -7E -40 -7E -ENDCHAR -STARTCHAR B2D0 -ENCODING 45776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B2D1 -ENCODING 45777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -FD -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B2D2 -ENCODING 45778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -FD -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B2D3 -ENCODING 45779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -FD -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B2D4 -ENCODING 45780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -FD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B2D5 -ENCODING 45781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -FD -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B2D6 -ENCODING 45782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -FD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B2D7 -ENCODING 45783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -FD -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B2D8 -ENCODING 45784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -81 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B2D9 -ENCODING 45785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -81 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B2DA -ENCODING 45786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -8100 -8500 -7900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B2DB -ENCODING 45787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -81 -FD -01 -08 -08 -36 -41 -ENDCHAR -STARTCHAR B2DC -ENCODING 45788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -8100 -8500 -7900 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B2DD -ENCODING 45789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -81 -FD -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR B2DE -ENCODING 45790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -8100 -8500 -7900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B2DF -ENCODING 45791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8100 -8100 -8100 -FD00 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B2E0 -ENCODING 45792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -85 -79 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B2E1 -ENCODING 45793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -FD -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B2E2 -ENCODING 45794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -81 -81 -81 -81 -81 -FD -00 -7F -12 -12 -7F -ENDCHAR -STARTCHAR B2E3 -ENCODING 45795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -81 -81 -81 -FD -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B2E4 -ENCODING 45796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8100 -8180 -8100 -8100 -FD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B2E5 -ENCODING 45797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8180 -8100 -FD00 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B2E6 -ENCODING 45798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8180 -8100 -FD00 -0000 -7E00 -1100 -1100 -1100 -ENDCHAR -STARTCHAR B2E7 -ENCODING 45799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -8180 -8100 -F900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B2E8 -ENCODING 45800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8180 -8100 -FD00 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B2E9 -ENCODING 45801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -8180 -8100 -F900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B2EA -ENCODING 45802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -8180 -FD00 -0000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR B2EB -ENCODING 45803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8180 -8100 -FD00 -0000 -7F00 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B2EC -ENCODING 45804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -8100 -FD00 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR B2ED -ENCODING 45805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -8100 -FD00 -0000 -7F00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR B2EE -ENCODING 45806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -8100 -FD00 -0000 -7F00 -1900 -7900 -8900 -7F00 -ENDCHAR -STARTCHAR B2EF -ENCODING 45807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -8100 -FD00 -0000 -7900 -1900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR B2F0 -ENCODING 45808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -8180 -FD00 -0000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR B2F1 -ENCODING 45809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -8180 -FD00 -0000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR B2F2 -ENCODING 45810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -8180 -FD00 -0000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR B2F3 -ENCODING 45811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -8100 -FD00 -0000 -7600 -1000 -7F00 -8900 -7600 -ENDCHAR -STARTCHAR B2F4 -ENCODING 45812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8180 -8100 -FD00 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR B2F5 -ENCODING 45813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8180 -8100 -FD00 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR B2F6 -ENCODING 45814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -8180 -8100 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B2F7 -ENCODING 45815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8180 -8100 -FD00 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR B2F8 -ENCODING 45816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -8100 -8100 -FD00 -0000 -2200 -2200 -5700 -8980 -ENDCHAR -STARTCHAR B2F9 -ENCODING 45817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8180 -8100 -FD00 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR B2FA -ENCODING 45818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8180 -8100 -FD00 -0000 -3F00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B2FB -ENCODING 45819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -FD00 -0100 -1C00 -0000 -7F00 -0200 -0C00 -7380 -ENDCHAR -STARTCHAR B2FC -ENCODING 45820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8100 -8180 -8100 -F900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR B2FD -ENCODING 45821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -8180 -FD00 -0000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR B2FE -ENCODING 45822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8100 -8180 -8100 -F900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR B2FF -ENCODING 45823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -8100 -FD00 -0100 -1C00 -0000 -7F00 -2200 -1C00 -ENDCHAR -STARTCHAR B300 -ENCODING 45824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -85 -85 -87 -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR B301 -ENCODING 45825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -85 -87 -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B302 -ENCODING 45826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -85 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B303 -ENCODING 45827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8700 -8500 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B304 -ENCODING 45828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -8500 -8700 -8500 -FD00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B305 -ENCODING 45829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8700 -8500 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B306 -ENCODING 45830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B307 -ENCODING 45831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -87 -85 -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B308 -ENCODING 45832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -87 -85 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B309 -ENCODING 45833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B30A -ENCODING 45834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B30B -ENCODING 45835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B30C -ENCODING 45836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B30D -ENCODING 45837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B30E -ENCODING 45838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B30F -ENCODING 45839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B310 -ENCODING 45840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -85 -87 -85 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B311 -ENCODING 45841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -85 -87 -85 -FD -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B312 -ENCODING 45842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8700 -8500 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B313 -ENCODING 45843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -8500 -8700 -8500 -FD00 -0100 -0800 -0C00 -1600 -6180 -ENDCHAR -STARTCHAR B314 -ENCODING 45844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -8500 -8700 -8500 -FD00 -0000 -1200 -3200 -3300 -4C80 -ENDCHAR -STARTCHAR B315 -ENCODING 45845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -85 -87 -85 -FD -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B316 -ENCODING 45846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8700 -8500 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B317 -ENCODING 45847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8700 -9D00 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B318 -ENCODING 45848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -85 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B319 -ENCODING 45849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B31A -ENCODING 45850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -87 -85 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B31B -ENCODING 45851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -87 -9D -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B31C -ENCODING 45852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -8100 -8100 -8180 -8100 -FD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B31D -ENCODING 45853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR B31E -ENCODING 45854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B31F -ENCODING 45855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B320 -ENCODING 45856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -8100 -8100 -FD80 -0100 -4000 -4000 -7E00 -ENDCHAR -STARTCHAR B321 -ENCODING 45857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -8100 -8180 -F900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B322 -ENCODING 45858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR B323 -ENCODING 45859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR B324 -ENCODING 45860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -7E00 -0100 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR B325 -ENCODING 45861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR B326 -ENCODING 45862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR B327 -ENCODING 45863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR B328 -ENCODING 45864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR B329 -ENCODING 45865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR B32A -ENCODING 45866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR B32B -ENCODING 45867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR B32C -ENCODING 45868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR B32D -ENCODING 45869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR B32E -ENCODING 45870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B32F -ENCODING 45871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR B330 -ENCODING 45872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR B331 -ENCODING 45873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -8100 -8180 -F900 -1800 -2600 -4100 -2200 -1C00 -ENDCHAR -STARTCHAR B332 -ENCODING 45874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR B333 -ENCODING 45875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B334 -ENCODING 45876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR B335 -ENCODING 45877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR B336 -ENCODING 45878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -8100 -8180 -F900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR B337 -ENCODING 45879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -8100 -FD80 -0000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR B338 -ENCODING 45880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -F5 -85 -87 -85 -85 -87 -F5 -05 -05 -ENDCHAR -STARTCHAR B339 -ENCODING 45881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -87 -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B33A -ENCODING 45882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -87 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B33B -ENCODING 45883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -8500 -8700 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B33C -ENCODING 45884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -87 -85 -FF -05 -05 -20 -3F -ENDCHAR -STARTCHAR B33D -ENCODING 45885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -8500 -8700 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B33E -ENCODING 45886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B33F -ENCODING 45887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -85 -87 -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B340 -ENCODING 45888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B341 -ENCODING 45889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B342 -ENCODING 45890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B343 -ENCODING 45891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B344 -ENCODING 45892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B345 -ENCODING 45893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B346 -ENCODING 45894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B347 -ENCODING 45895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B348 -ENCODING 45896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -85 -87 -F5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR B349 -ENCODING 45897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -85 -87 -F5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR B34A -ENCODING 45898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -8500 -8700 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B34B -ENCODING 45899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -85 -87 -F5 -00 -08 -14 -63 -ENDCHAR -STARTCHAR B34C -ENCODING 45900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -8500 -8700 -F500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B34D -ENCODING 45901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -87 -F5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR B34E -ENCODING 45902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -8500 -8700 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B34F -ENCODING 45903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -8500 -9F00 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B350 -ENCODING 45904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -87 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B351 -ENCODING 45905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B352 -ENCODING 45906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -85 -87 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B353 -ENCODING 45907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -85 -9F -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B354 -ENCODING 45908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -8F -81 -81 -81 -FD -01 -01 -01 -ENDCHAR -STARTCHAR B355 -ENCODING 45909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -81 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B356 -ENCODING 45910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -81 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B357 -ENCODING 45911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -8700 -8100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B358 -ENCODING 45912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -81 -FD -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR B359 -ENCODING 45913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -87 -81 -FD -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B35A -ENCODING 45914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -81 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B35B -ENCODING 45915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -81 -FD -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR B35C -ENCODING 45916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B35D -ENCODING 45917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -81 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B35E -ENCODING 45918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -FD -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B35F -ENCODING 45919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -FD -00 -75 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B360 -ENCODING 45920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -81 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B361 -ENCODING 45921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -81 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B362 -ENCODING 45922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -81 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B363 -ENCODING 45923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -81 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B364 -ENCODING 45924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -81 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B365 -ENCODING 45925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -81 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B366 -ENCODING 45926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -8700 -8100 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B367 -ENCODING 45927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -81 -FD -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR B368 -ENCODING 45928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -8700 -8100 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B369 -ENCODING 45929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -81 -FD -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR B36A -ENCODING 45930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -8700 -8100 -FD00 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B36B -ENCODING 45931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8F00 -8100 -FD00 -0100 -1C00 -0000 -3F00 -0E00 -7380 -ENDCHAR -STARTCHAR B36C -ENCODING 45932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -87 -81 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B36D -ENCODING 45933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -81 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B36E -ENCODING 45934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -81 -FD -00 -7F -12 -12 -7F -ENDCHAR -STARTCHAR B36F -ENCODING 45935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -81 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B370 -ENCODING 45936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -85 -9D -85 -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR B371 -ENCODING 45937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -9D -85 -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B372 -ENCODING 45938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -85 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B373 -ENCODING 45939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8D00 -8500 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B374 -ENCODING 45940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -9D00 -8500 -8500 -FD00 -0500 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B375 -ENCODING 45941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8D00 -8500 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B376 -ENCODING 45942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B377 -ENCODING 45943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -8D -85 -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B378 -ENCODING 45944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -9D -85 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B379 -ENCODING 45945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B37A -ENCODING 45946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B37B -ENCODING 45947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B37C -ENCODING 45948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B37D -ENCODING 45949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B37E -ENCODING 45950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B37F -ENCODING 45951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B380 -ENCODING 45952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -9D -85 -85 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B381 -ENCODING 45953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -9D -85 -85 -FD -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B382 -ENCODING 45954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8D00 -8500 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B383 -ENCODING 45955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -9D00 -8500 -8500 -FD00 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B384 -ENCODING 45956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -9D00 -8500 -8500 -FD00 -0000 -2200 -2200 -3500 -4C80 -ENDCHAR -STARTCHAR B385 -ENCODING 45957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -9D -85 -85 -FD -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B386 -ENCODING 45958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8D00 -8500 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B387 -ENCODING 45959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -8D00 -9D00 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B388 -ENCODING 45960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -85 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B389 -ENCODING 45961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B38A -ENCODING 45962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -8D -85 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B38B -ENCODING 45963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -8D -9D -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B38C -ENCODING 45964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -8F -81 -8F -81 -81 -FD -01 -01 -01 -ENDCHAR -STARTCHAR B38D -ENCODING 45965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -81 -87 -FD -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR B38E -ENCODING 45966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -81 -87 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B38F -ENCODING 45967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8F00 -8100 -8700 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B390 -ENCODING 45968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -8F -81 -8F -81 -FD -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR B391 -ENCODING 45969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -81 -87 -FD -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B392 -ENCODING 45970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B393 -ENCODING 45971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -8F -81 -87 -FD -00 -7E -40 -7E -ENDCHAR -STARTCHAR B394 -ENCODING 45972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -8F -81 -8F -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B395 -ENCODING 45973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B396 -ENCODING 45974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B397 -ENCODING 45975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B398 -ENCODING 45976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B399 -ENCODING 45977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B39A -ENCODING 45978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B39B -ENCODING 45979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B39C -ENCODING 45980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -8F -81 -87 -FD -00 -7F -41 -7F -ENDCHAR -STARTCHAR B39D -ENCODING 45981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -8F -81 -87 -FD -01 -41 -7F -7F -ENDCHAR -STARTCHAR B39E -ENCODING 45982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8F00 -8100 -8700 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B39F -ENCODING 45983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -8F -81 -87 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR B3A0 -ENCODING 45984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8F00 -8100 -8F00 -8100 -FD00 -0000 -1200 -3200 -3300 -4C80 -ENDCHAR -STARTCHAR B3A1 -ENCODING 45985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -8F -81 -8F -81 -FD -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR B3A2 -ENCODING 45986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8F00 -8100 -8700 -FD00 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B3A3 -ENCODING 45987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8F00 -8700 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B3A4 -ENCODING 45988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -81 -87 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B3A5 -ENCODING 45989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B3A6 -ENCODING 45990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -8F -81 -87 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B3A7 -ENCODING 45991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -8F -87 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B3A8 -ENCODING 45992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -9D -85 -9D -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR B3A9 -ENCODING 45993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -8D -85 -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B3AA -ENCODING 45994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -8D -85 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B3AB -ENCODING 45995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -8D00 -8500 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B3AC -ENCODING 45996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -9D00 -8500 -9D00 -8500 -FD00 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B3AD -ENCODING 45997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -8D00 -8500 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B3AE -ENCODING 45998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B3AF -ENCODING 45999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -8D -85 -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B3B0 -ENCODING 46000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B3B1 -ENCODING 46001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B3B2 -ENCODING 46002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B3B3 -ENCODING 46003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B3B4 -ENCODING 46004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B3B5 -ENCODING 46005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B3B6 -ENCODING 46006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B3B7 -ENCODING 46007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B3B8 -ENCODING 46008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -8D -85 -F5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR B3B9 -ENCODING 46009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -8D -85 -F5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR B3BA -ENCODING 46010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -8D00 -8500 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B3BB -ENCODING 46011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -8D -85 -F5 -00 -08 -14 -63 -ENDCHAR -STARTCHAR B3BC -ENCODING 46012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -8D00 -8500 -F500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B3BD -ENCODING 46013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -8D -85 -F5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR B3BE -ENCODING 46014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -8D00 -8500 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B3BF -ENCODING 46015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9D00 -9D00 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B3C0 -ENCODING 46016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -8D -85 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B3C1 -ENCODING 46017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B3C2 -ENCODING 46018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -8D -85 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B3C3 -ENCODING 46019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -9D -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B3C4 -ENCODING 46020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -2000 -2000 -2000 -3F80 -0400 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR B3C5 -ENCODING 46021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B3C6 -ENCODING 46022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -76 -08 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR B3C7 -ENCODING 46023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7E00 -4000 -7600 -0800 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR B3C8 -ENCODING 46024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0400 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B3C9 -ENCODING 46025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -76 -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B3CA -ENCODING 46026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -FF -00 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B3CB -ENCODING 46027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B3CC -ENCODING 46028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B3CD -ENCODING 46029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -FF -00 -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR B3CE -ENCODING 46030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR B3CF -ENCODING 46031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -FF -00 -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR B3D0 -ENCODING 46032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F80 -0400 -FFC0 -0000 -7900 -0900 -3900 -4280 -3C40 -ENDCHAR -STARTCHAR B3D1 -ENCODING 46033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -FF -00 -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR B3D2 -ENCODING 46034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -FF -00 -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR B3D3 -ENCODING 46035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -FF -00 -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR B3D4 -ENCODING 46036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B3D5 -ENCODING 46037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B3D6 -ENCODING 46038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -76 -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR B3D7 -ENCODING 46039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0400 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B3D8 -ENCODING 46040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -76 -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR B3D9 -ENCODING 46041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR B3DA -ENCODING 46042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -40 -76 -08 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR B3DB -ENCODING 46043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F80 -0400 -FFC0 -0000 -1E00 -0000 -3F00 -0E00 -7180 -ENDCHAR -STARTCHAR B3DC -ENCODING 46044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -40 -76 -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR B3DD -ENCODING 46045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3F80 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B3DE -ENCODING 46046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -40 -76 -08 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR B3DF -ENCODING 46047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -FF -00 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B3E0 -ENCODING 46048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -4080 -4080 -4080 -7CC0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B3E1 -ENCODING 46049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR B3E2 -ENCODING 46050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B3E3 -ENCODING 46051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B3E4 -ENCODING 46052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -4080 -4080 -7C80 -10C0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B3E5 -ENCODING 46053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B3E6 -ENCODING 46054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B3E7 -ENCODING 46055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR B3E8 -ENCODING 46056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -4080 -7CC0 -1080 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B3E9 -ENCODING 46057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B3EA -ENCODING 46058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B3EB -ENCODING 46059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR B3EC -ENCODING 46060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B3ED -ENCODING 46061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR B3EE -ENCODING 46062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B3EF -ENCODING 46063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR B3F0 -ENCODING 46064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR B3F1 -ENCODING 46065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR B3F2 -ENCODING 46066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR B3F3 -ENCODING 46067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR B3F4 -ENCODING 46068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR B3F5 -ENCODING 46069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -3E00 -4100 -4200 -3C00 -ENDCHAR -STARTCHAR B3F6 -ENCODING 46070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR B3F7 -ENCODING 46071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR B3F8 -ENCODING 46072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR B3F9 -ENCODING 46073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR B3FA -ENCODING 46074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8100 -D980 -2100 -FD00 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR B3FB -ENCODING 46075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4080 -7CC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR B3FC -ENCODING 46076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -4280 -4280 -4280 -7B80 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR B3FD -ENCODING 46077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -FD -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B3FE -ENCODING 46078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -FD -01 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B3FF -ENCODING 46079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -2500 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B400 -ENCODING 46080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -85 -F7 -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR B401 -ENCODING 46081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -2500 -FD00 -0100 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B402 -ENCODING 46082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B403 -ENCODING 46083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F7 -25 -FD -01 -3F -40 -7F -ENDCHAR -STARTCHAR B404 -ENCODING 46084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR B405 -ENCODING 46085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR B406 -ENCODING 46086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR B407 -ENCODING 46087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B408 -ENCODING 46088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR B409 -ENCODING 46089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B40A -ENCODING 46090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B40B -ENCODING 46091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -2500 -F500 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR B40C -ENCODING 46092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F7 -25 -FD -01 -3F -41 -7F -ENDCHAR -STARTCHAR B40D -ENCODING 46093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F7 -25 -FD -01 -21 -3F -3F -ENDCHAR -STARTCHAR B40E -ENCODING 46094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -2500 -FD00 -0100 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B40F -ENCODING 46095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F7 -25 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR B410 -ENCODING 46096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7A80 -4280 -4380 -7A80 -1280 -FE80 -0000 -1100 -1100 -1980 -6640 -ENDCHAR -STARTCHAR B411 -ENCODING 46097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -FD -09 -37 -41 -23 -1C -ENDCHAR -STARTCHAR B412 -ENCODING 46098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -2500 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B413 -ENCODING 46099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -2500 -F500 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B414 -ENCODING 46100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -FD -01 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B415 -ENCODING 46101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B416 -ENCODING 46102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F7 -25 -FD -01 -3F -12 -3F -ENDCHAR -STARTCHAR B417 -ENCODING 46103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -25 -F5 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B418 -ENCODING 46104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4080 -4080 -4080 -7E80 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B419 -ENCODING 46105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -D9 -21 -FD -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B41A -ENCODING 46106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -D9 -21 -FD -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B41B -ENCODING 46107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -D900 -2100 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B41C -ENCODING 46108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4080 -4080 -7C80 -1080 -1080 -FF80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B41D -ENCODING 46109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -D9 -21 -FD -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B41E -ENCODING 46110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B41F -ENCODING 46111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -D9 -21 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR B420 -ENCODING 46112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -F9 -21 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR B421 -ENCODING 46113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR B422 -ENCODING 46114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR B423 -ENCODING 46115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B424 -ENCODING 46116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B425 -ENCODING 46117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B426 -ENCODING 46118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR B427 -ENCODING 46119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR B428 -ENCODING 46120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -F9 -21 -FF -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR B429 -ENCODING 46121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -F9 -21 -FF -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR B42A -ENCODING 46122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -D9 -21 -FD -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR B42B -ENCODING 46123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -F9 -21 -FF -01 -08 -08 -36 -41 -ENDCHAR -STARTCHAR B42C -ENCODING 46124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -D9 -21 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B42D -ENCODING 46125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -D9 -21 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B42E -ENCODING 46126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -D900 -2100 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B42F -ENCODING 46127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -F900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B430 -ENCODING 46128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -D9 -21 -FD -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR B431 -ENCODING 46129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR B432 -ENCODING 46130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -D9 -21 -FD -01 -7F -12 -3F -ENDCHAR -STARTCHAR B433 -ENCODING 46131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B434 -ENCODING 46132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -2000 -2000 -2000 -3F80 -1200 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR B435 -ENCODING 46133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -40 -5A -24 -FF -00 -7E -01 -01 -ENDCHAR -STARTCHAR B436 -ENCODING 46134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -5A -24 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR B437 -ENCODING 46135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7E00 -4000 -5A00 -2400 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR B438 -ENCODING 46136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -2000 -2000 -1F00 -1200 -FFC0 -2000 -2000 -3F00 -ENDCHAR -STARTCHAR B439 -ENCODING 46137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -5A -24 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B43A -ENCODING 46138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B43B -ENCODING 46139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -40 -5A -24 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR B43C -ENCODING 46140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -40 -40 -7F -24 -DB -7E -01 -7E -7E -ENDCHAR -STARTCHAR B43D -ENCODING 46141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR B43E -ENCODING 46142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR B43F -ENCODING 46143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR B440 -ENCODING 46144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B441 -ENCODING 46145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR B442 -ENCODING 46146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR B443 -ENCODING 46147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR B444 -ENCODING 46148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -40 -5A -24 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR B445 -ENCODING 46149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -40 -5A -24 -FF -00 -41 -7E -7F -ENDCHAR -STARTCHAR B446 -ENCODING 46150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -5A -24 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR B447 -ENCODING 46151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -5A -24 -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR B448 -ENCODING 46152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -5A -24 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR B449 -ENCODING 46153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -40 -5A -24 -FF -00 -3E -41 -42 -3C -ENDCHAR -STARTCHAR B44A -ENCODING 46154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -40 -5A -24 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR B44B -ENCODING 46155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR B44C -ENCODING 46156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -40 -5A -24 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR B44D -ENCODING 46157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -40 -40 -7F -24 -DB -3E -40 -7E -7E -ENDCHAR -STARTCHAR B44E -ENCODING 46158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -40 -5A -24 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR B44F -ENCODING 46159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -24 -DB -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B450 -ENCODING 46160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -2000 -2000 -2000 -3F80 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR B451 -ENCODING 46161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B452 -ENCODING 46162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B453 -ENCODING 46163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B454 -ENCODING 46164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR B455 -ENCODING 46165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B456 -ENCODING 46166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR B457 -ENCODING 46167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR B458 -ENCODING 46168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B459 -ENCODING 46169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -08 -7F -71 -41 -71 -ENDCHAR -STARTCHAR B45A -ENCODING 46170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -08 -7F -79 -89 -76 -ENDCHAR -STARTCHAR B45B -ENCODING 46171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR B45C -ENCODING 46172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR B45D -ENCODING 46173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR B45E -ENCODING 46174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR B45F -ENCODING 46175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR B460 -ENCODING 46176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B461 -ENCODING 46177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0400 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B462 -ENCODING 46178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR B463 -ENCODING 46179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0400 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B464 -ENCODING 46180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR B465 -ENCODING 46181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR B466 -ENCODING 46182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -40 -7F -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR B467 -ENCODING 46183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR B468 -ENCODING 46184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR B469 -ENCODING 46185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -40 -40 -7F -00 -FF -08 -7E -7E -7E -ENDCHAR -STARTCHAR B46A -ENCODING 46186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR B46B -ENCODING 46187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B46C -ENCODING 46188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4080 -4080 -7C80 -0080 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR B46D -ENCODING 46189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR B46E -ENCODING 46190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B46F -ENCODING 46191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR B470 -ENCODING 46192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -F9 -01 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR B471 -ENCODING 46193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B472 -ENCODING 46194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -46 -4F -49 -36 -ENDCHAR -STARTCHAR B473 -ENCODING 46195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -3F -40 -7E -ENDCHAR -STARTCHAR B474 -ENCODING 46196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -7F -3F -40 -3F -ENDCHAR -STARTCHAR B475 -ENCODING 46197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -77 -31 -41 -71 -ENDCHAR -STARTCHAR B476 -ENCODING 46198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -77 -79 -49 -77 -ENDCHAR -STARTCHAR B477 -ENCODING 46199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B478 -ENCODING 46200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -52 -72 -85 -68 -ENDCHAR -STARTCHAR B479 -ENCODING 46201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B47A -ENCODING 46202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B47B -ENCODING 46203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -76 -37 -49 -76 -ENDCHAR -STARTCHAR B47C -ENCODING 46204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -7F -41 -7F -ENDCHAR -STARTCHAR B47D -ENCODING 46205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -41 -7F -7F -ENDCHAR -STARTCHAR B47E -ENCODING 46206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR B47F -ENCODING 46207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -08 -14 -63 -ENDCHAR -STARTCHAR B480 -ENCODING 46208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F900 -0100 -FD00 -2100 -2700 -0100 -2200 -3300 -CC80 -ENDCHAR -STARTCHAR B481 -ENCODING 46209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B482 -ENCODING 46210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -7900 -DD00 -2700 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B483 -ENCODING 46211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -7900 -DD00 -2300 -3D00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B484 -ENCODING 46212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B485 -ENCODING 46213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B486 -ENCODING 46214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -79 -DD -27 -21 -3F -12 -3F -ENDCHAR -STARTCHAR B487 -ENCODING 46215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -DD -23 -3D -23 -1C -22 -1E -ENDCHAR -STARTCHAR B488 -ENCODING 46216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -4280 -4280 -7A80 -0280 -FE80 -1280 -1680 -1280 -1280 -0280 -ENDCHAR -STARTCHAR B489 -ENCODING 46217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F5 -1D -E5 -29 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B48A -ENCODING 46218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F5 -1D -E5 -29 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B48B -ENCODING 46219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F500 -1D00 -E500 -2900 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B48C -ENCODING 46220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -4280 -7A80 -0280 -FA80 -1680 -0080 -2000 -3F80 -ENDCHAR -STARTCHAR B48D -ENCODING 46221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F500 -1D00 -E500 -2900 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B48E -ENCODING 46222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR B48F -ENCODING 46223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F5 -1D -E5 -29 -3F -40 -7F -ENDCHAR -STARTCHAR B490 -ENCODING 46224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -0F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR B491 -ENCODING 46225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -0F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR B492 -ENCODING 46226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR B493 -ENCODING 46227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -0E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR B494 -ENCODING 46228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -2900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR B495 -ENCODING 46229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -0F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR B496 -ENCODING 46230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -2B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR B497 -ENCODING 46231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR B498 -ENCODING 46232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F5 -1D -E5 -29 -3F -41 -7F -ENDCHAR -STARTCHAR B499 -ENCODING 46233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F5 -1D -E5 -29 -41 -7F -7F -ENDCHAR -STARTCHAR B49A -ENCODING 46234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F500 -1D00 -E500 -2900 -4200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B49B -ENCODING 46235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F5 -1D -E5 -29 -08 -1C -63 -ENDCHAR -STARTCHAR B49C -ENCODING 46236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F5 -1D -E5 -29 -02 -22 -55 -08 -ENDCHAR -STARTCHAR B49D -ENCODING 46237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -4280 -7A80 -0280 -FE80 -1280 -1680 -0000 -1F80 -2080 -1F80 -ENDCHAR -STARTCHAR B49E -ENCODING 46238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F500 -1D00 -E500 -2900 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B49F -ENCODING 46239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR B4A0 -ENCODING 46240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F5 -1D -E5 -29 -3F -01 -3F -01 -ENDCHAR -STARTCHAR B4A1 -ENCODING 46241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR B4A2 -ENCODING 46242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F5 -1D -E5 -29 -3F -12 -3F -ENDCHAR -STARTCHAR B4A3 -ENCODING 46243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4280 -3A80 -FE80 -1680 -1E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR B4A4 -ENCODING 46244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4080 -4080 -4080 -7C80 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR B4A5 -ENCODING 46245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR B4A6 -ENCODING 46246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B4A7 -ENCODING 46247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR B4A8 -ENCODING 46248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -F9 -01 -FF -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR B4A9 -ENCODING 46249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B4AA -ENCODING 46250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR B4AB -ENCODING 46251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR B4AC -ENCODING 46252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -F9 -01 -FF -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR B4AD -ENCODING 46253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR B4AE -ENCODING 46254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR B4AF -ENCODING 46255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B4B0 -ENCODING 46256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR B4B1 -ENCODING 46257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B4B2 -ENCODING 46258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B4B3 -ENCODING 46259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR B4B4 -ENCODING 46260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -7F -41 -7F -ENDCHAR -STARTCHAR B4B5 -ENCODING 46261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -F9 -01 -FF -21 -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR B4B6 -ENCODING 46262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR B4B7 -ENCODING 46263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -F900 -0100 -FF00 -2100 -2800 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B4B8 -ENCODING 46264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B4B9 -ENCODING 46265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -F9 -01 -FF -21 -3E -41 -41 -3E -ENDCHAR -STARTCHAR B4BA -ENCODING 46266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -7900 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B4BB -ENCODING 46267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -7900 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B4BC -ENCODING 46268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B4BD -ENCODING 46269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B4BE -ENCODING 46270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -79 -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR B4BF -ENCODING 46271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -79 -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B4C0 -ENCODING 46272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -2000 -2000 -2000 -3F80 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR B4C1 -ENCODING 46273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR B4C2 -ENCODING 46274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B4C3 -ENCODING 46275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B4C4 -ENCODING 46276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -2000 -2000 -3F80 -0000 -FFC0 -1200 -3200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR B4C5 -ENCODING 46277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B4C6 -ENCODING 46278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR B4C7 -ENCODING 46279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR B4C8 -ENCODING 46280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B4C9 -ENCODING 46281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR B4CA -ENCODING 46282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR B4CB -ENCODING 46283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR B4CC -ENCODING 46284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR B4CD -ENCODING 46285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR B4CE -ENCODING 46286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR B4CF -ENCODING 46287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR B4D0 -ENCODING 46288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -2000 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B4D1 -ENCODING 46289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR B4D2 -ENCODING 46290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR B4D3 -ENCODING 46291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -1400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR B4D4 -ENCODING 46292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR B4D5 -ENCODING 46293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -2000 -2000 -3F80 -0000 -FFC0 -1200 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR B4D6 -ENCODING 46294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR B4D7 -ENCODING 46295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR B4D8 -ENCODING 46296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR B4D9 -ENCODING 46297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -40 -40 -7F -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR B4DA -ENCODING 46298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR B4DB -ENCODING 46299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR B4DC -ENCODING 46300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -2000 -2000 -2000 -2000 -3F80 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR B4DD -ENCODING 46301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B4DE -ENCODING 46302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F00 -0000 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B4DF -ENCODING 46303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F00 -0000 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B4E0 -ENCODING 46304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B4E1 -ENCODING 46305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F00 -0000 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B4E2 -ENCODING 46306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B4E3 -ENCODING 46307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B4E4 -ENCODING 46308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B4E5 -ENCODING 46309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR B4E6 -ENCODING 46310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR B4E7 -ENCODING 46311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR B4E8 -ENCODING 46312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B4E9 -ENCODING 46313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR B4EA -ENCODING 46314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR B4EB -ENCODING 46315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR B4EC -ENCODING 46316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B4ED -ENCODING 46317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B4EE -ENCODING 46318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F00 -0000 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR B4EF -ENCODING 46319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B4F0 -ENCODING 46320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2000 -3F00 -0000 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR B4F1 -ENCODING 46321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -2000 -3F80 -0000 -FFC0 -0000 -1F00 -2100 -2100 -1F00 -ENDCHAR -STARTCHAR B4F2 -ENCODING 46322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -2000 -3F00 -0000 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR B4F3 -ENCODING 46323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR B4F4 -ENCODING 46324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -2000 -3F00 -0000 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR B4F5 -ENCODING 46325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -40 -40 -7F -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR B4F6 -ENCODING 46326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -2000 -3F00 -0000 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR B4F7 -ENCODING 46327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -40 -7F -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B4F8 -ENCODING 46328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4080 -4080 -4080 -7E80 -0080 -0080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B4F9 -ENCODING 46329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B4FA -ENCODING 46330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B4FB -ENCODING 46331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -F900 -0100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B4FC -ENCODING 46332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -81 -79 -05 -F9 -01 -40 -7F -ENDCHAR -STARTCHAR B4FD -ENCODING 46333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B4FE -ENCODING 46334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B4FF -ENCODING 46335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -3F -40 -7E -ENDCHAR -STARTCHAR B500 -ENCODING 46336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -3F00 -0080 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR B501 -ENCODING 46337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -0000 -1B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B502 -ENCODING 46338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -0000 -3F80 -3C80 -2480 -3B00 -ENDCHAR -STARTCHAR B503 -ENCODING 46339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -3000 -0A80 -3B80 -2280 -3B80 -ENDCHAR -STARTCHAR B504 -ENCODING 46340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B505 -ENCODING 46341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -3100 -0A00 -3B80 -2200 -3B80 -ENDCHAR -STARTCHAR B506 -ENCODING 46342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B507 -ENCODING 46343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -3380 -0F80 -3B00 -2480 -3B00 -ENDCHAR -STARTCHAR B508 -ENCODING 46344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -7F -41 -7F -ENDCHAR -STARTCHAR B509 -ENCODING 46345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -41 -7F -7F -ENDCHAR -STARTCHAR B50A -ENCODING 46346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR B50B -ENCODING 46347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -F9 -01 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR B50C -ENCODING 46348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B50D -ENCODING 46349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -01 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B50E -ENCODING 46350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -F900 -0100 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B50F -ENCODING 46351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR B510 -ENCODING 46352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR B511 -ENCODING 46353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -0F00 -1000 -1F80 -1000 -1F80 -ENDCHAR -STARTCHAR B512 -ENCODING 46354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -F9 -01 -FD -00 -7F -12 -3F -ENDCHAR -STARTCHAR B513 -ENCODING 46355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4080 -7C80 -0080 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR B514 -ENCODING 46356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -81 -81 -81 -81 -FD -01 -01 -01 -ENDCHAR -STARTCHAR B515 -ENCODING 46357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -81 -81 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B516 -ENCODING 46358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -81 -81 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B517 -ENCODING 46359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -8100 -8100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B518 -ENCODING 46360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -81 -81 -FD -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR B519 -ENCODING 46361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -81 -81 -FD -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B51A -ENCODING 46362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B51B -ENCODING 46363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -81 -81 -FD -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR B51C -ENCODING 46364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -81 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B51D -ENCODING 46365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B51E -ENCODING 46366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B51F -ENCODING 46367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B520 -ENCODING 46368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B521 -ENCODING 46369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B522 -ENCODING 46370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B523 -ENCODING 46371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B524 -ENCODING 46372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -81 -81 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B525 -ENCODING 46373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -81 -81 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B526 -ENCODING 46374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8100 -8100 -8100 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B527 -ENCODING 46375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8100 -8100 -FD00 -0100 -0800 -0800 -1600 -6180 -ENDCHAR -STARTCHAR B528 -ENCODING 46376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8100 -8100 -FD00 -0100 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR B529 -ENCODING 46377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -81 -81 -FD -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR B52A -ENCODING 46378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -8100 -8100 -FD00 -0000 -3F00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B52B -ENCODING 46379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -8100 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B52C -ENCODING 46380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -81 -81 -81 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B52D -ENCODING 46381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B52E -ENCODING 46382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -81 -81 -81 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B52F -ENCODING 46383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -81 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B530 -ENCODING 46384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9100 -9100 -9180 -9100 -9100 -FD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B531 -ENCODING 46385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9100 -9180 -9100 -FD00 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B532 -ENCODING 46386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -9100 -9180 -9100 -4D00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B533 -ENCODING 46387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9100 -4D00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B534 -ENCODING 46388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9100 -9180 -9100 -FD00 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B535 -ENCODING 46389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9100 -4D00 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B536 -ENCODING 46390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR B537 -ENCODING 46391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -9100 -9180 -9100 -4D00 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR B538 -ENCODING 46392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9180 -9100 -FD00 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR B539 -ENCODING 46393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR B53A -ENCODING 46394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR B53B -ENCODING 46395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR B53C -ENCODING 46396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR B53D -ENCODING 46397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR B53E -ENCODING 46398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR B53F -ENCODING 46399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR B540 -ENCODING 46400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9100 -9180 -9100 -FD00 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR B541 -ENCODING 46401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9100 -9180 -9100 -FD00 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR B542 -ENCODING 46402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9100 -4D00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B543 -ENCODING 46403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9100 -9180 -9100 -FD00 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR B544 -ENCODING 46404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9100 -9180 -9100 -FD00 -0000 -2200 -2200 -5500 -8980 -ENDCHAR -STARTCHAR B545 -ENCODING 46405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9100 -9180 -9100 -FD00 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR B546 -ENCODING 46406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9100 -4D00 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR B547 -ENCODING 46407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B548 -ENCODING 46408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -9100 -9180 -9100 -4D00 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR B549 -ENCODING 46409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9100 -9180 -9D00 -4000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR B54A -ENCODING 46410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -9100 -9180 -9100 -4D00 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR B54B -ENCODING 46411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9180 -9100 -FD00 -0100 -1C00 -0000 -7F00 -2200 -1C00 -ENDCHAR -STARTCHAR B54C -ENCODING 46412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -A3 -A3 -A3 -A3 -A3 -FB -03 -03 -03 -ENDCHAR -STARTCHAR B54D -ENCODING 46413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -A3 -A3 -A3 -FB -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B54E -ENCODING 46414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -A5 -A3 -A5 -DD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B54F -ENCODING 46415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -A500 -A300 -A500 -DD00 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B550 -ENCODING 46416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FB00 -A300 -A300 -A300 -A300 -FB00 -0300 -2300 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B551 -ENCODING 46417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -A500 -A300 -A500 -DD00 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B552 -ENCODING 46418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B553 -ENCODING 46419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -A5 -A3 -A5 -DD -00 -3F -40 -7F -ENDCHAR -STARTCHAR B554 -ENCODING 46420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -A3 -A3 -FB -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B555 -ENCODING 46421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B556 -ENCODING 46422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B557 -ENCODING 46423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B558 -ENCODING 46424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B559 -ENCODING 46425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B55A -ENCODING 46426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B55B -ENCODING 46427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B55C -ENCODING 46428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -A3 -A3 -A3 -FB -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B55D -ENCODING 46429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -A3 -A3 -A3 -FB -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B55E -ENCODING 46430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -A500 -A300 -A500 -DD00 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B55F -ENCODING 46431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FB00 -A300 -A300 -A300 -A300 -FB00 -0300 -0900 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B560 -ENCODING 46432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FB00 -A300 -A300 -A300 -A300 -FB00 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR B561 -ENCODING 46433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -A3 -A3 -A3 -FB -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B562 -ENCODING 46434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -A500 -A300 -A500 -DD00 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B563 -ENCODING 46435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -A500 -A300 -ED00 -1100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B564 -ENCODING 46436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -A5 -A3 -A5 -DD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B565 -ENCODING 46437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B566 -ENCODING 46438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -A5 -A3 -A5 -DD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B567 -ENCODING 46439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A3 -ED -11 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B568 -ENCODING 46440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FD00 -9100 -9180 -9100 -9100 -9180 -5D00 -0100 -0100 -ENDCHAR -STARTCHAR B569 -ENCODING 46441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR B56A -ENCODING 46442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B56B -ENCODING 46443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B56C -ENCODING 46444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -9180 -9100 -9100 -FD80 -0100 -4000 -4000 -7E00 -ENDCHAR -STARTCHAR B56D -ENCODING 46445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B56E -ENCODING 46446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR B56F -ENCODING 46447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR B570 -ENCODING 46448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -7E00 -0100 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR B571 -ENCODING 46449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR B572 -ENCODING 46450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR B573 -ENCODING 46451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR B574 -ENCODING 46452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR B575 -ENCODING 46453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR B576 -ENCODING 46454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR B577 -ENCODING 46455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR B578 -ENCODING 46456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR B579 -ENCODING 46457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR B57A -ENCODING 46458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B57B -ENCODING 46459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR B57C -ENCODING 46460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR B57D -ENCODING 46461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9180 -4D00 -1800 -2600 -4100 -2200 -1C00 -ENDCHAR -STARTCHAR B57E -ENCODING 46462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR B57F -ENCODING 46463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B580 -ENCODING 46464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR B581 -ENCODING 46465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR B582 -ENCODING 46466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -9180 -9100 -9180 -4D00 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR B583 -ENCODING 46467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -9180 -9100 -9D80 -4000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR B584 -ENCODING 46468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -DD -A5 -A7 -A5 -A5 -A3 -DD -05 -05 -01 -ENDCHAR -STARTCHAR B585 -ENCODING 46469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -A3 -A5 -A3 -DD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B586 -ENCODING 46470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -A3 -A5 -A3 -DD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B587 -ENCODING 46471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -A300 -A500 -A300 -DD00 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B588 -ENCODING 46472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -A7 -A5 -A5 -FF -05 -01 -20 -3F -ENDCHAR -STARTCHAR B589 -ENCODING 46473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -A300 -A500 -A300 -DD00 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B58A -ENCODING 46474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B58B -ENCODING 46475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -A3 -A5 -A3 -DD -00 -3F -40 -7F -ENDCHAR -STARTCHAR B58C -ENCODING 46476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B58D -ENCODING 46477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B58E -ENCODING 46478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B58F -ENCODING 46479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B590 -ENCODING 46480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B591 -ENCODING 46481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B592 -ENCODING 46482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B593 -ENCODING 46483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B594 -ENCODING 46484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -A3 -A5 -A3 -DD -00 -3F -41 -7F -ENDCHAR -STARTCHAR B595 -ENCODING 46485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -A3 -A5 -A3 -DD -00 -21 -3F -3F -ENDCHAR -STARTCHAR B596 -ENCODING 46486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -A300 -A500 -A300 -DD00 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B597 -ENCODING 46487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -A3 -A5 -A3 -DD -01 -08 -14 -63 -ENDCHAR -STARTCHAR B598 -ENCODING 46488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -A300 -A500 -A300 -DD00 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B599 -ENCODING 46489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -A3 -A5 -A3 -DD -0D -33 -41 -21 -1E -ENDCHAR -STARTCHAR B59A -ENCODING 46490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -A300 -A500 -A300 -DD00 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B59B -ENCODING 46491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -A300 -A500 -EB00 -1100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B59C -ENCODING 46492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -A3 -A5 -A3 -DD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B59D -ENCODING 46493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B59E -ENCODING 46494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -A3 -A5 -A3 -DD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B59F -ENCODING 46495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A3 -A5 -EB -11 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B5A0 -ENCODING 46496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -97 -91 -91 -91 -FD -01 -01 -01 -ENDCHAR -STARTCHAR B5A1 -ENCODING 46497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -91 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B5A2 -ENCODING 46498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -97 -91 -4D -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B5A3 -ENCODING 46499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -9700 -9100 -4D00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B5A4 -ENCODING 46500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -91 -FD -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR B5A5 -ENCODING 46501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -97 -91 -4D -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B5A6 -ENCODING 46502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -91 -DD -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B5A7 -ENCODING 46503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -91 -97 -91 -4D -00 -7E -40 -7E -ENDCHAR -STARTCHAR B5A8 -ENCODING 46504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B5A9 -ENCODING 46505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -91 -DD -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B5AA -ENCODING 46506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -FD -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B5AB -ENCODING 46507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -FD -00 -75 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B5AC -ENCODING 46508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -91 -DD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B5AD -ENCODING 46509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -91 -DD -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B5AE -ENCODING 46510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -91 -DD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B5AF -ENCODING 46511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -91 -DD -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B5B0 -ENCODING 46512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -91 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B5B1 -ENCODING 46513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -91 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B5B2 -ENCODING 46514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -9700 -9100 -4D00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B5B3 -ENCODING 46515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -91 -FD -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR B5B4 -ENCODING 46516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9100 -9700 -9100 -9100 -FD00 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR B5B5 -ENCODING 46517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -91 -FD -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR B5B6 -ENCODING 46518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -9700 -9100 -4D00 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B5B7 -ENCODING 46519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9700 -9100 -DD00 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B5B8 -ENCODING 46520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -97 -91 -4D -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B5B9 -ENCODING 46521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -91 -DD -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B5BA -ENCODING 46522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -91 -97 -91 -4D -00 -3F -12 -3F -ENDCHAR -STARTCHAR B5BB -ENCODING 46523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -FD -01 -1C -00 -7F -22 -1E -ENDCHAR -STARTCHAR B5BC -ENCODING 46524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -A3 -AF -A3 -A3 -A3 -FB -03 -03 -03 -ENDCHAR -STARTCHAR B5BD -ENCODING 46525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -AF -A3 -A3 -FB -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B5BE -ENCODING 46526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -A3 -A7 -A3 -D9 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B5BF -ENCODING 46527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -A300 -A700 -A300 -D900 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B5C0 -ENCODING 46528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FB00 -A300 -AF00 -A300 -A300 -FB00 -0300 -2300 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B5C1 -ENCODING 46529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -A300 -A700 -A300 -D900 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B5C2 -ENCODING 46530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B5C3 -ENCODING 46531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -A3 -A7 -A3 -D9 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B5C4 -ENCODING 46532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -AF -A3 -FB -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B5C5 -ENCODING 46533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B5C6 -ENCODING 46534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B5C7 -ENCODING 46535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B5C8 -ENCODING 46536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B5C9 -ENCODING 46537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B5CA -ENCODING 46538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B5CB -ENCODING 46539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B5CC -ENCODING 46540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -AF -A3 -A3 -FB -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B5CD -ENCODING 46541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -AF -A3 -A3 -FB -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B5CE -ENCODING 46542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -A300 -A700 -A300 -D900 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B5CF -ENCODING 46543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FB00 -A300 -AF00 -A300 -A300 -FB00 -0300 -0900 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B5D0 -ENCODING 46544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FB00 -A300 -AF00 -A300 -A300 -FB00 -0000 -2200 -2200 -3500 -4C80 -ENDCHAR -STARTCHAR B5D1 -ENCODING 46545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FB -A3 -AF -A3 -A3 -FB -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B5D2 -ENCODING 46546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -A300 -A700 -A300 -D900 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B5D3 -ENCODING 46547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -A300 -A700 -EB00 -1100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B5D4 -ENCODING 46548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -A3 -A7 -A3 -D9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B5D5 -ENCODING 46549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B5D6 -ENCODING 46550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -A3 -A7 -A3 -D9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B5D7 -ENCODING 46551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -A3 -A7 -EB -11 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B5D8 -ENCODING 46552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -97 -91 -97 -91 -91 -FD -01 -01 -01 -ENDCHAR -STARTCHAR B5D9 -ENCODING 46553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -93 -91 -4D -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR B5DA -ENCODING 46554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -93 -91 -4D -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B5DB -ENCODING 46555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9700 -9300 -9100 -4D00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B5DC -ENCODING 46556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -97 -91 -97 -FD -01 -01 -20 -3F -ENDCHAR -STARTCHAR B5DD -ENCODING 46557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -93 -91 -4D -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B5DE -ENCODING 46558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B5DF -ENCODING 46559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -97 -93 -91 -4D -00 -7E -40 -7E -ENDCHAR -STARTCHAR B5E0 -ENCODING 46560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B5E1 -ENCODING 46561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B5E2 -ENCODING 46562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B5E3 -ENCODING 46563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B5E4 -ENCODING 46564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B5E5 -ENCODING 46565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B5E6 -ENCODING 46566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B5E7 -ENCODING 46567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B5E8 -ENCODING 46568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -97 -93 -91 -4D -00 -7F -41 -7F -ENDCHAR -STARTCHAR B5E9 -ENCODING 46569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -97 -93 -91 -4D -01 -41 -7F -7F -ENDCHAR -STARTCHAR B5EA -ENCODING 46570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9700 -9300 -9100 -4D00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B5EB -ENCODING 46571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -97 -93 -91 -4D -00 -08 -14 -63 -ENDCHAR -STARTCHAR B5EC -ENCODING 46572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -9700 -9100 -9700 -9100 -FD00 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR B5ED -ENCODING 46573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -93 -91 -4D -0C -32 -41 -23 -1C -ENDCHAR -STARTCHAR B5EE -ENCODING 46574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9700 -9300 -9100 -4D00 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B5EF -ENCODING 46575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9700 -9700 -DD00 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B5F0 -ENCODING 46576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -93 -91 -4D -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B5F1 -ENCODING 46577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B5F2 -ENCODING 46578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -97 -93 -91 -4D -00 -3F -12 -3F -ENDCHAR -STARTCHAR B5F3 -ENCODING 46579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -97 -97 -DD -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B5F4 -ENCODING 46580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -DB -A3 -AD -A3 -AD -A3 -DB -03 -03 -ENDCHAR -STARTCHAR B5F5 -ENCODING 46581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -AD -A3 -AD -D9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B5F6 -ENCODING 46582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -AD -A3 -AD -D9 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B5F7 -ENCODING 46583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -AD00 -A300 -AD00 -D900 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B5F8 -ENCODING 46584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -A5 -A3 -A5 -FB -03 -01 -20 -3F -ENDCHAR -STARTCHAR B5F9 -ENCODING 46585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -AD00 -A300 -AD00 -D900 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B5FA -ENCODING 46586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B5FB -ENCODING 46587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -AD -A3 -AD -D9 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B5FC -ENCODING 46588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B5FD -ENCODING 46589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B5FE -ENCODING 46590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B5FF -ENCODING 46591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B600 -ENCODING 46592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B601 -ENCODING 46593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B602 -ENCODING 46594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B603 -ENCODING 46595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B604 -ENCODING 46596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -AD -A3 -AD -D9 -00 -3F -41 -7F -ENDCHAR -STARTCHAR B605 -ENCODING 46597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -AD -A3 -AD -D9 -00 -21 -3F -3F -ENDCHAR -STARTCHAR B606 -ENCODING 46598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -AD00 -A300 -AD00 -D900 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B607 -ENCODING 46599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -AD -A7 -A3 -DB -01 -08 -14 -63 -ENDCHAR -STARTCHAR B608 -ENCODING 46600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -AD00 -A300 -AD00 -D900 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B609 -ENCODING 46601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -AD -A7 -A3 -DB -0D -33 -41 -21 -1E -ENDCHAR -STARTCHAR B60A -ENCODING 46602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -AD00 -A300 -AD00 -D900 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR B60B -ENCODING 46603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -AD00 -A700 -EB00 -1100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B60C -ENCODING 46604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -AD -A3 -AD -D9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B60D -ENCODING 46605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B60E -ENCODING 46606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -AD -A3 -AD -D9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B60F -ENCODING 46607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -AD -A7 -EB -11 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B610 -ENCODING 46608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7F80 -4400 -4400 -4400 -3F80 -0400 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR B611 -ENCODING 46609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B612 -ENCODING 46610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -08 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR B613 -ENCODING 46611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -EE00 -8800 -7F00 -0800 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR B614 -ENCODING 46612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0400 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B615 -ENCODING 46613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B616 -ENCODING 46614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B617 -ENCODING 46615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EE -88 -7F -08 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR B618 -ENCODING 46616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B619 -ENCODING 46617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B61A -ENCODING 46618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -0400 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B61B -ENCODING 46619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR B61C -ENCODING 46620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B61D -ENCODING 46621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR B61E -ENCODING 46622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR B61F -ENCODING 46623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR B620 -ENCODING 46624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EE -88 -7F -08 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR B621 -ENCODING 46625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EE -88 -7F -08 -FF -00 -41 -7E -7F -ENDCHAR -STARTCHAR B622 -ENCODING 46626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR B623 -ENCODING 46627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -08 -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR B624 -ENCODING 46628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR B625 -ENCODING 46629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR B626 -ENCODING 46630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -EE -88 -7F -08 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR B627 -ENCODING 46631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -6F -FF -00 -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR B628 -ENCODING 46632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -EE -88 -7F -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR B629 -ENCODING 46633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3B80 -4400 -4400 -3380 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR B62A -ENCODING 46634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EE -88 -7F -08 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR B62B -ENCODING 46635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -6F -FF -00 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B62C -ENCODING 46636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6E80 -4880 -4880 -4880 -6EC0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B62D -ENCODING 46637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR B62E -ENCODING 46638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B62F -ENCODING 46639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B630 -ENCODING 46640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7E80 -4880 -4880 -24C0 -1080 -FE80 -0000 -2000 -3F00 -ENDCHAR -STARTCHAR B631 -ENCODING 46641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B632 -ENCODING 46642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B633 -ENCODING 46643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR B634 -ENCODING 46644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -4880 -6E80 -10C0 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B635 -ENCODING 46645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B636 -ENCODING 46646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B637 -ENCODING 46647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR B638 -ENCODING 46648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B639 -ENCODING 46649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR B63A -ENCODING 46650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B63B -ENCODING 46651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR B63C -ENCODING 46652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR B63D -ENCODING 46653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR B63E -ENCODING 46654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR B63F -ENCODING 46655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR B640 -ENCODING 46656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR B641 -ENCODING 46657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -3E00 -4100 -4200 -3C00 -ENDCHAR -STARTCHAR B642 -ENCODING 46658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR B643 -ENCODING 46659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR B644 -ENCODING 46660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR B645 -ENCODING 46661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR B646 -ENCODING 46662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -9100 -D980 -2100 -2D00 -D000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR B647 -ENCODING 46663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -6C80 -4880 -6EC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR B648 -ENCODING 46664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -9280 -9280 -9280 -7D80 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR B649 -ENCODING 46665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A7 -35 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B64A -ENCODING 46666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A7 -35 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B64B -ENCODING 46667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -A500 -A700 -3500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B64C -ENCODING 46668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -A5 -A5 -17 -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR B64D -ENCODING 46669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -A500 -A700 -3500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B64E -ENCODING 46670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR B64F -ENCODING 46671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -A5 -A7 -35 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR B650 -ENCODING 46672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR B651 -ENCODING 46673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR B652 -ENCODING 46674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR B653 -ENCODING 46675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR B654 -ENCODING 46676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR B655 -ENCODING 46677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR B656 -ENCODING 46678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR B657 -ENCODING 46679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR B658 -ENCODING 46680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -A5 -A7 -35 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR B659 -ENCODING 46681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -A5 -A7 -35 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR B65A -ENCODING 46682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -A500 -A700 -3500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B65B -ENCODING 46683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -A5 -A7 -35 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR B65C -ENCODING 46684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -A500 -A700 -3500 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B65D -ENCODING 46685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A7 -35 -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR B65E -ENCODING 46686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -A500 -A700 -3500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B65F -ENCODING 46687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR B660 -ENCODING 46688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -A5 -A7 -35 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B661 -ENCODING 46689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR B662 -ENCODING 46690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -A5 -A7 -35 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B663 -ENCODING 46691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -5280 -7B80 -1280 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR B664 -ENCODING 46692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -6E80 -4880 -4880 -4880 -7E80 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B665 -ENCODING 46693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B666 -ENCODING 46694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B667 -ENCODING 46695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -9100 -D900 -0100 -3D00 -C100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B668 -ENCODING 46696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -4880 -4880 -7E80 -1080 -1080 -FF80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B669 -ENCODING 46697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B66A -ENCODING 46698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B66B -ENCODING 46699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -3F -40 -7E -ENDCHAR -STARTCHAR B66C -ENCODING 46700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -7E -01 -7F -40 -3F -ENDCHAR -STARTCHAR B66D -ENCODING 46701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR B66E -ENCODING 46702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR B66F -ENCODING 46703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B670 -ENCODING 46704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B671 -ENCODING 46705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B672 -ENCODING 46706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR B673 -ENCODING 46707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR B674 -ENCODING 46708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -7F -41 -7F -ENDCHAR -STARTCHAR B675 -ENCODING 46709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -41 -7F -7F -ENDCHAR -STARTCHAR B676 -ENCODING 46710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -52 -72 -55 -78 -ENDCHAR -STARTCHAR B677 -ENCODING 46711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -08 -14 -63 -ENDCHAR -STARTCHAR B678 -ENCODING 46712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B679 -ENCODING 46713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B67A -ENCODING 46714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -9100 -D900 -0100 -3D00 -C100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B67B -ENCODING 46715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -DD00 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B67C -ENCODING 46716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -7F -3F -01 -01 -ENDCHAR -STARTCHAR B67D -ENCODING 46717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR B67E -ENCODING 46718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -91 -D9 -01 -3D -C1 -7F -12 -3F -ENDCHAR -STARTCHAR B67F -ENCODING 46719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B680 -ENCODING 46720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 8 0 0 -BITMAP -3F80 -4400 -4400 -4400 -3F80 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR B681 -ENCODING 46721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -EE -88 -7F -24 -FF -00 -7E -01 -01 -ENDCHAR -STARTCHAR B682 -ENCODING 46722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -24 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR B683 -ENCODING 46723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -EE00 -8800 -7F00 -2400 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR B684 -ENCODING 46724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EE -88 -C8 -26 -24 -DB -40 -40 -7E -ENDCHAR -STARTCHAR B685 -ENCODING 46725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -24 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR B686 -ENCODING 46726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B687 -ENCODING 46727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EE -88 -7F -24 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR B688 -ENCODING 46728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -3F00 -0080 -3F00 -3F00 -ENDCHAR -STARTCHAR B689 -ENCODING 46729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B68A -ENCODING 46730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B68B -ENCODING 46731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR B68C -ENCODING 46732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B68D -ENCODING 46733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR B68E -ENCODING 46734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR B68F -ENCODING 46735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR B690 -ENCODING 46736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EE -88 -7F -24 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR B691 -ENCODING 46737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EE -88 -7F -24 -FF -00 -41 -7E -7F -ENDCHAR -STARTCHAR B692 -ENCODING 46738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -24 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR B693 -ENCODING 46739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -24 -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR B694 -ENCODING 46740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -24 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR B695 -ENCODING 46741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -EE -88 -7F -24 -FF -00 -3E -41 -42 -3C -ENDCHAR -STARTCHAR B696 -ENCODING 46742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -EE -88 -7F -24 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR B697 -ENCODING 46743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -24 -DB -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR B698 -ENCODING 46744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -EE -88 -7F -24 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR B699 -ENCODING 46745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3B80 -4400 -4400 -3380 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR B69A -ENCODING 46746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -EE -88 -7F -24 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR B69B -ENCODING 46747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -24 -DB -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B69C -ENCODING 46748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -4400 -4400 -4400 -3F80 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR B69D -ENCODING 46749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B69E -ENCODING 46750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B69F -ENCODING 46751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B6A0 -ENCODING 46752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR B6A1 -ENCODING 46753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B6A2 -ENCODING 46754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR B6A3 -ENCODING 46755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0400 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR B6A4 -ENCODING 46756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B6A5 -ENCODING 46757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -08 -7F -71 -41 -71 -ENDCHAR -STARTCHAR B6A6 -ENCODING 46758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -08 -7F -79 -89 -76 -ENDCHAR -STARTCHAR B6A7 -ENCODING 46759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR B6A8 -ENCODING 46760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR B6A9 -ENCODING 46761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR B6AA -ENCODING 46762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR B6AB -ENCODING 46763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -3F80 -0000 -FFC0 -0400 -7B00 -0800 -3F80 -4480 -3B80 -ENDCHAR -STARTCHAR B6AC -ENCODING 46764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B6AD -ENCODING 46765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -2400 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR B6AE -ENCODING 46766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR B6AF -ENCODING 46767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0400 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR B6B0 -ENCODING 46768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR B6B1 -ENCODING 46769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR B6B2 -ENCODING 46770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -EE -88 -7F -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR B6B3 -ENCODING 46771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR B6B4 -ENCODING 46772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR B6B5 -ENCODING 46773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -77 -88 -88 -7F -00 -FF -08 -7E -7E -7E -ENDCHAR -STARTCHAR B6B6 -ENCODING 46774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR B6B7 -ENCODING 46775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B6B8 -ENCODING 46776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -4880 -4880 -7E80 -0080 -FE80 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR B6B9 -ENCODING 46777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -3E -01 -01 -01 -ENDCHAR -STARTCHAR B6BA -ENCODING 46778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B6BB -ENCODING 46779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -72 -12 -15 -10 -ENDCHAR -STARTCHAR B6BC -ENCODING 46780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -91 -91 -49 -FF -27 -21 -40 -7F -ENDCHAR -STARTCHAR B6BD -ENCODING 46781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B6BE -ENCODING 46782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -46 -4F -49 -36 -ENDCHAR -STARTCHAR B6BF -ENCODING 46783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -3F -40 -7E -ENDCHAR -STARTCHAR B6C0 -ENCODING 46784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -7F -3F -40 -3F -ENDCHAR -STARTCHAR B6C1 -ENCODING 46785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -77 -31 -41 -71 -ENDCHAR -STARTCHAR B6C2 -ENCODING 46786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -77 -79 -49 -77 -ENDCHAR -STARTCHAR B6C3 -ENCODING 46787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B6C4 -ENCODING 46788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -52 -72 -85 -68 -ENDCHAR -STARTCHAR B6C5 -ENCODING 46789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B6C6 -ENCODING 46790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B6C7 -ENCODING 46791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -76 -37 -49 -76 -ENDCHAR -STARTCHAR B6C8 -ENCODING 46792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -7F -41 -7F -ENDCHAR -STARTCHAR B6C9 -ENCODING 46793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -41 -7F -7F -ENDCHAR -STARTCHAR B6CA -ENCODING 46794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR B6CB -ENCODING 46795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -08 -14 -63 -ENDCHAR -STARTCHAR B6CC -ENCODING 46796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B6CD -ENCODING 46797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B6CE -ENCODING 46798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -9100 -FD00 -1D00 -E100 -2700 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B6CF -ENCODING 46799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -FD00 -DD00 -2300 -3D00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B6D0 -ENCODING 46800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B6D1 -ENCODING 46801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -27 -21 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B6D2 -ENCODING 46802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -91 -FD -1D -E1 -27 -3F -12 -3F -ENDCHAR -STARTCHAR B6D3 -ENCODING 46803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -DD -23 -3D -23 -1C -22 -1E -ENDCHAR -STARTCHAR B6D4 -ENCODING 46804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7D80 -5180 -5180 -7D80 -0180 -FD80 -1180 -1680 -1180 -1180 -0180 -ENDCHAR -STARTCHAR B6D5 -ENCODING 46805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B6D6 -ENCODING 46806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B6D7 -ENCODING 46807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -A300 -FB00 -FB00 -2B00 -2100 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B6D8 -ENCODING 46808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7E80 -5280 -7A80 -0280 -FA80 -1680 -0080 -2000 -3F80 -ENDCHAR -STARTCHAR B6D9 -ENCODING 46809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -A300 -FB00 -FB00 -2B00 -2100 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B6DA -ENCODING 46810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR B6DB -ENCODING 46811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -3F -40 -7F -ENDCHAR -STARTCHAR B6DC -ENCODING 46812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -0F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR B6DD -ENCODING 46813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -0F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR B6DE -ENCODING 46814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR B6DF -ENCODING 46815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -0E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR B6E0 -ENCODING 46816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -2900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR B6E1 -ENCODING 46817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -0F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR B6E2 -ENCODING 46818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -2B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR B6E3 -ENCODING 46819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR B6E4 -ENCODING 46820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -3F -41 -7F -ENDCHAR -STARTCHAR B6E5 -ENCODING 46821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -41 -7F -7F -ENDCHAR -STARTCHAR B6E6 -ENCODING 46822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -A300 -FB00 -FB00 -2B00 -2100 -4200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B6E7 -ENCODING 46823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -08 -1C -63 -ENDCHAR -STARTCHAR B6E8 -ENCODING 46824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -02 -22 -55 -08 -ENDCHAR -STARTCHAR B6E9 -ENCODING 46825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -3E -41 -61 -1E -ENDCHAR -STARTCHAR B6EA -ENCODING 46826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -A300 -FB00 -FB00 -2B00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B6EB -ENCODING 46827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR B6EC -ENCODING 46828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -3F -01 -3F -01 -ENDCHAR -STARTCHAR B6ED -ENCODING 46829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR B6EE -ENCODING 46830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FB -A3 -FB -FB -2B -21 -3F -12 -3F -ENDCHAR -STARTCHAR B6EF -ENCODING 46831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5A80 -5280 -6E80 -FE80 -1680 -1E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR B6F0 -ENCODING 46832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -4880 -4880 -4880 -7E80 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR B6F1 -ENCODING 46833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -01 -FD -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR B6F2 -ENCODING 46834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B6F3 -ENCODING 46835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR B6F4 -ENCODING 46836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -FD -01 -FF -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR B6F5 -ENCODING 46837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B6F6 -ENCODING 46838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR B6F7 -ENCODING 46839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -91 -FD -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR B6F8 -ENCODING 46840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -FD -01 -FF -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR B6F9 -ENCODING 46841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR B6FA -ENCODING 46842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR B6FB -ENCODING 46843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B6FC -ENCODING 46844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR B6FD -ENCODING 46845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B6FE -ENCODING 46846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B6FF -ENCODING 46847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR B700 -ENCODING 46848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -FD -01 -FF -20 -7F -41 -41 -7F -ENDCHAR -STARTCHAR B701 -ENCODING 46849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -FD -01 -FF -21 -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR B702 -ENCODING 46850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR B703 -ENCODING 46851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -91 -FD -01 -FD -21 -08 -14 -63 -ENDCHAR -STARTCHAR B704 -ENCODING 46852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B705 -ENCODING 46853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -FD -01 -FD -21 -21 -3E -41 -41 -3E -ENDCHAR -STARTCHAR B706 -ENCODING 46854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -9100 -FD00 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B707 -ENCODING 46855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -FD00 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B708 -ENCODING 46856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -91 -FD -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B709 -ENCODING 46857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B70A -ENCODING 46858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -91 -FD -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR B70B -ENCODING 46859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -FD -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B70C -ENCODING 46860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -4400 -3F80 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR B70D -ENCODING 46861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR B70E -ENCODING 46862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B70F -ENCODING 46863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B710 -ENCODING 46864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -7700 -0000 -FFC0 -1200 -3200 -2000 -3F00 -ENDCHAR -STARTCHAR B711 -ENCODING 46865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B712 -ENCODING 46866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR B713 -ENCODING 46867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR B714 -ENCODING 46868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -77 -88 -88 -7F -00 -FF -24 -5B -7E -7E -ENDCHAR -STARTCHAR B715 -ENCODING 46869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR B716 -ENCODING 46870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR B717 -ENCODING 46871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR B718 -ENCODING 46872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR B719 -ENCODING 46873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR B71A -ENCODING 46874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR B71B -ENCODING 46875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR B71C -ENCODING 46876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR B71D -ENCODING 46877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR B71E -ENCODING 46878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR B71F -ENCODING 46879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -1400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR B720 -ENCODING 46880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR B721 -ENCODING 46881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR B722 -ENCODING 46882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR B723 -ENCODING 46883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR B724 -ENCODING 46884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR B725 -ENCODING 46885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -77 -88 -88 -7F -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR B726 -ENCODING 46886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR B727 -ENCODING 46887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -7F -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR B728 -ENCODING 46888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7F80 -4400 -4400 -4400 -4400 -3F80 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR B729 -ENCODING 46889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B72A -ENCODING 46890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR B72B -ENCODING 46891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR B72C -ENCODING 46892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B72D -ENCODING 46893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B72E -ENCODING 46894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B72F -ENCODING 46895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0000 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B730 -ENCODING 46896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B731 -ENCODING 46897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR B732 -ENCODING 46898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR B733 -ENCODING 46899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR B734 -ENCODING 46900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B735 -ENCODING 46901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR B736 -ENCODING 46902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR B737 -ENCODING 46903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR B738 -ENCODING 46904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR B739 -ENCODING 46905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B73A -ENCODING 46906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR B73B -ENCODING 46907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F80 -4400 -4400 -3F80 -0000 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR B73C -ENCODING 46908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR B73D -ENCODING 46909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0000 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR B73E -ENCODING 46910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR B73F -ENCODING 46911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR B740 -ENCODING 46912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR B741 -ENCODING 46913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -77 -88 -88 -67 -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR B742 -ENCODING 46914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7700 -4400 -3F80 -0000 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR B743 -ENCODING 46915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -77 -88 -88 -67 -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR B744 -ENCODING 46916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -4880 -4880 -4880 -7E80 -0080 -0080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B745 -ENCODING 46917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B746 -ENCODING 46918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -3F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR B747 -ENCODING 46919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR B748 -ENCODING 46920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -4880 -4880 -7E80 -0080 -FF80 -0080 -2080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B749 -ENCODING 46921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR B74A -ENCODING 46922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR B74B -ENCODING 46923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -1F80 -2000 -3F00 -ENDCHAR -STARTCHAR B74C -ENCODING 46924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -4880 -7E80 -0080 -FF80 -0000 -3F80 -0080 -3F80 -2000 -3F80 -ENDCHAR -STARTCHAR B74D -ENCODING 46925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR B74E -ENCODING 46926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR B74F -ENCODING 46927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B750 -ENCODING 46928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR B751 -ENCODING 46929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B752 -ENCODING 46930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR B753 -ENCODING 46931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR B754 -ENCODING 46932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -4880 -4880 -7E80 -0080 -FF80 -0000 -3F80 -2080 -2080 -3F80 -ENDCHAR -STARTCHAR B755 -ENCODING 46933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -4880 -4880 -7E80 -0080 -FF80 -0000 -2080 -3F80 -2080 -3F80 -ENDCHAR -STARTCHAR B756 -ENCODING 46934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -2900 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR B757 -ENCODING 46935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR B758 -ENCODING 46936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -1100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR B759 -ENCODING 46937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -1F00 -2080 -3180 -0E00 -ENDCHAR -STARTCHAR B75A -ENCODING 46938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR B75B -ENCODING 46939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -DD00 -0100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B75C -ENCODING 46940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -3F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR B75D -ENCODING 46941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR B75E -ENCODING 46942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7C80 -4880 -6C80 -0080 -FF80 -0080 -3F80 -0900 -1F80 -ENDCHAR -STARTCHAR B75F -ENCODING 46943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -DD -01 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B760 -ENCODING 46944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -91 -91 -91 -91 -FD -01 -01 -01 -ENDCHAR -STARTCHAR B761 -ENCODING 46945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -91 -4D -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR B762 -ENCODING 46946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -91 -4D -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B763 -ENCODING 46947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -9100 -9100 -4D00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B764 -ENCODING 46948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -91 -91 -FD -01 -41 -40 -40 -3F -ENDCHAR -STARTCHAR B765 -ENCODING 46949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -91 -4D -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B766 -ENCODING 46950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B767 -ENCODING 46951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -91 -91 -91 -4D -00 -7E -40 -7E -ENDCHAR -STARTCHAR B768 -ENCODING 46952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -91 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B769 -ENCODING 46953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B76A -ENCODING 46954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B76B -ENCODING 46955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B76C -ENCODING 46956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B76D -ENCODING 46957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B76E -ENCODING 46958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B76F -ENCODING 46959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B770 -ENCODING 46960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -91 -91 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B771 -ENCODING 46961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -91 -FD -00 -41 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B772 -ENCODING 46962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -9100 -9100 -4D00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B773 -ENCODING 46963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -91 -91 -FD -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR B774 -ENCODING 46964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -9100 -9100 -4D00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B775 -ENCODING 46965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -91 -91 -91 -91 -FD -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR B776 -ENCODING 46966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -9100 -9100 -4D00 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B777 -ENCODING 46967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -9100 -9100 -DD00 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B778 -ENCODING 46968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -91 -4D -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B779 -ENCODING 46969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B77A -ENCODING 46970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -91 -91 -91 -4D -00 -3F -12 -3F -ENDCHAR -STARTCHAR B77B -ENCODING 46971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -91 -91 -DD -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B77C -ENCODING 46972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -F900 -8180 -8100 -8100 -FD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B77D -ENCODING 46973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8180 -8100 -FD00 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B77E -ENCODING 46974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -0900 -F180 -8100 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B77F -ENCODING 46975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8100 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B780 -ENCODING 46976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -F980 -8100 -8100 -FD00 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B781 -ENCODING 46977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8100 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B782 -ENCODING 46978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR B783 -ENCODING 46979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -0900 -F180 -8100 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR B784 -ENCODING 46980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F980 -8100 -FD00 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR B785 -ENCODING 46981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -6600 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR B786 -ENCODING 46982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR B787 -ENCODING 46983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -6000 -1900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR B788 -ENCODING 46984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -6200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR B789 -ENCODING 46985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -6600 -1800 -7E00 -8800 -7700 -ENDCHAR -STARTCHAR B78A -ENCODING 46986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -6000 -1700 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR B78B -ENCODING 46987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -6600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR B78C -ENCODING 46988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8180 -8100 -FD00 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR B78D -ENCODING 46989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8180 -8100 -FD00 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR B78E -ENCODING 46990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8100 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR B78F -ENCODING 46991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8180 -8100 -FD00 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR B790 -ENCODING 46992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8180 -8100 -FD00 -0000 -2200 -2200 -5500 -8980 -ENDCHAR -STARTCHAR B791 -ENCODING 46993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8180 -8100 -FD00 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR B792 -ENCODING 46994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8180 -8100 -FD00 -0000 -3F00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B793 -ENCODING 46995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B794 -ENCODING 46996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -0900 -F180 -8100 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR B795 -ENCODING 46997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -8D00 -7000 -3E00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR B796 -ENCODING 46998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8180 -8100 -FD00 -0000 -7F00 -2200 -2200 -7F00 -ENDCHAR -STARTCHAR B797 -ENCODING 46999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F980 -8100 -FD00 -0100 -1C00 -0000 -7F00 -2200 -1E00 -ENDCHAR -STARTCHAR B798 -ENCODING 47000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -F5 -87 -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR B799 -ENCODING 47001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -87 -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B79A -ENCODING 47002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -F7 -85 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B79B -ENCODING 47003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -F700 -8500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B79C -ENCODING 47004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -F700 -8500 -8500 -FD00 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B79D -ENCODING 47005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -F700 -8500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B79E -ENCODING 47006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E7 -95 -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B79F -ENCODING 47007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -F7 -85 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR B7A0 -ENCODING 47008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F7 -85 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B7A1 -ENCODING 47009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E7 -95 -65 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR B7A2 -ENCODING 47010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E7 -95 -65 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR B7A3 -ENCODING 47011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E7 -95 -65 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B7A4 -ENCODING 47012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E7 -95 -65 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR B7A5 -ENCODING 47013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E7 -95 -65 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B7A6 -ENCODING 47014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E7 -95 -65 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B7A7 -ENCODING 47015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -E700 -9500 -6500 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR B7A8 -ENCODING 47016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -87 -85 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B7A9 -ENCODING 47017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -87 -85 -FD -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B7AA -ENCODING 47018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -F700 -8500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B7AB -ENCODING 47019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -F500 -8700 -8500 -FD00 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B7AC -ENCODING 47020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -F700 -8500 -8500 -FD00 -0000 -1200 -2200 -3500 -4C80 -ENDCHAR -STARTCHAR B7AD -ENCODING 47021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -87 -85 -FD -00 -3E -41 -41 -3E -ENDCHAR -STARTCHAR B7AE -ENCODING 47022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -F700 -8500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B7AF -ENCODING 47023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -E700 -9500 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B7B0 -ENCODING 47024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -F7 -85 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B7B1 -ENCODING 47025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E7 -95 -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B7B2 -ENCODING 47026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -F7 -85 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B7B3 -ENCODING 47027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E7 -95 -65 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B7B4 -ENCODING 47028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0980 -F900 -8100 -8180 -8100 -FD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B7B5 -ENCODING 47029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F980 -8100 -8180 -FD00 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B7B6 -ENCODING 47030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B7B7 -ENCODING 47031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B7B8 -ENCODING 47032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0980 -F900 -8100 -8180 -FD00 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B7B9 -ENCODING 47033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B7BA -ENCODING 47034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR B7BB -ENCODING 47035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR B7BC -ENCODING 47036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -3E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR B7BD -ENCODING 47037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -6600 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR B7BE -ENCODING 47038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR B7BF -ENCODING 47039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -6000 -1900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR B7C0 -ENCODING 47040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -6200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR B7C1 -ENCODING 47041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -6600 -1800 -7E00 -8800 -7700 -ENDCHAR -STARTCHAR B7C2 -ENCODING 47042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -6000 -1700 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR B7C3 -ENCODING 47043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -6600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR B7C4 -ENCODING 47044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR B7C5 -ENCODING 47045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR B7C6 -ENCODING 47046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR B7C7 -ENCODING 47047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F980 -8100 -8180 -FD00 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR B7C8 -ENCODING 47048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR B7C9 -ENCODING 47049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F980 -8100 -8180 -FD00 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR B7CA -ENCODING 47050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR B7CB -ENCODING 47051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B7CC -ENCODING 47052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR B7CD -ENCODING 47053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -3E00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR B7CE -ENCODING 47054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -0980 -F100 -8180 -FD00 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR B7CF -ENCODING 47055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -8D80 -7000 -1C00 -7F00 -1C00 -2200 -1E00 -ENDCHAR -STARTCHAR B7D0 -ENCODING 47056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -F5 -15 -17 -F5 -85 -87 -FD -05 -05 -ENDCHAR -STARTCHAR B7D1 -ENCODING 47057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -F5 -87 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B7D2 -ENCODING 47058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -F5 -87 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B7D3 -ENCODING 47059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -8700 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B7D4 -ENCODING 47060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -F7 -85 -97 -65 -05 -20 -3F -ENDCHAR -STARTCHAR B7D5 -ENCODING 47061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -8700 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B7D6 -ENCODING 47062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B7D7 -ENCODING 47063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -87 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR B7D8 -ENCODING 47064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR B7D9 -ENCODING 47065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR B7DA -ENCODING 47066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR B7DB -ENCODING 47067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B7DC -ENCODING 47068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR B7DD -ENCODING 47069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B7DE -ENCODING 47070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B7DF -ENCODING 47071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -E500 -9700 -6500 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR B7E0 -ENCODING 47072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -87 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR B7E1 -ENCODING 47073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -87 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR B7E2 -ENCODING 47074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -8700 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B7E3 -ENCODING 47075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -87 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR B7E4 -ENCODING 47076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -8700 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B7E5 -ENCODING 47077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -F5 -87 -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR B7E6 -ENCODING 47078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -8700 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B7E7 -ENCODING 47079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -E500 -9700 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B7E8 -ENCODING 47080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -F5 -87 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B7E9 -ENCODING 47081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B7EA -ENCODING 47082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -87 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B7EB -ENCODING 47083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -E5 -97 -65 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B7EC -ENCODING 47084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -09 -09 -F1 -87 -81 -81 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR B7ED -ENCODING 47085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -11 -F1 -87 -81 -F9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B7EE -ENCODING 47086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -11 -F7 -81 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B7EF -ENCODING 47087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1100 -F700 -8100 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B7F0 -ENCODING 47088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -11 -11 -F7 -81 -81 -F9 -01 -20 -20 -3F -ENDCHAR -STARTCHAR B7F1 -ENCODING 47089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -11 -F7 -81 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B7F2 -ENCODING 47090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E7 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B7F3 -ENCODING 47091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -11 -F7 -81 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR B7F4 -ENCODING 47092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -11 -F7 -81 -F9 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B7F5 -ENCODING 47093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E7 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B7F6 -ENCODING 47094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E7 -89 -71 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B7F7 -ENCODING 47095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E7 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B7F8 -ENCODING 47096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E7 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B7F9 -ENCODING 47097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E7 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B7FA -ENCODING 47098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E7 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B7FB -ENCODING 47099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E7 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B7FC -ENCODING 47100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -11 -F1 -87 -81 -F9 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B7FD -ENCODING 47101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -11 -F7 -81 -81 -F9 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B7FE -ENCODING 47102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1100 -F700 -8100 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B7FF -ENCODING 47103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F100 -1100 -F100 -8700 -8100 -F900 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B800 -ENCODING 47104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F100 -1100 -F100 -8700 -8100 -F900 -0000 -2200 -2200 -7500 -C880 -ENDCHAR -STARTCHAR B801 -ENCODING 47105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -11 -F1 -87 -81 -F9 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B802 -ENCODING 47106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1100 -F700 -8100 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B803 -ENCODING 47107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -1100 -E700 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B804 -ENCODING 47108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -11 -F7 -81 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B805 -ENCODING 47109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E7 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B806 -ENCODING 47110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -11 -F7 -81 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B807 -ENCODING 47111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -11 -F7 -81 -F9 -01 -1C -00 -7F -22 -1E -ENDCHAR -STARTCHAR B808 -ENCODING 47112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -F5 -8D -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR B809 -ENCODING 47113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -8D -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B80A -ENCODING 47114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -FD -85 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B80B -ENCODING 47115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -8500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B80C -ENCODING 47116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -ED00 -8500 -8500 -FD00 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B80D -ENCODING 47117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -8500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B80E -ENCODING 47118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E5 -95 -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B80F -ENCODING 47119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -FD -85 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR B810 -ENCODING 47120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -FD -85 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B811 -ENCODING 47121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E5 -95 -61 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR B812 -ENCODING 47122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E5 -95 -61 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR B813 -ENCODING 47123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E5 -95 -61 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B814 -ENCODING 47124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E5 -95 -61 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR B815 -ENCODING 47125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E5 -95 -61 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B816 -ENCODING 47126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E5 -95 -61 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B817 -ENCODING 47127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -E500 -9500 -6100 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR B818 -ENCODING 47128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -8D -85 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B819 -ENCODING 47129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -FD -85 -85 -FD -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B81A -ENCODING 47130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -8500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B81B -ENCODING 47131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -F500 -8D00 -8500 -FD00 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B81C -ENCODING 47132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -8500 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B81D -ENCODING 47133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -8D -85 -FD -00 -3E -41 -41 -3E -ENDCHAR -STARTCHAR B81E -ENCODING 47134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -8500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B81F -ENCODING 47135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -E500 -9500 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B820 -ENCODING 47136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -FD -85 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B821 -ENCODING 47137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E5 -95 -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B822 -ENCODING 47138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -FD -85 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B823 -ENCODING 47139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -E5 -95 -61 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B824 -ENCODING 47140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -11 -17 -F1 -81 -87 -81 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR B825 -ENCODING 47141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -17 -F1 -87 -81 -F9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B826 -ENCODING 47142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -17 -F1 -83 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B827 -ENCODING 47143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1700 -F100 -8300 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B828 -ENCODING 47144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -11 -17 -F1 -87 -81 -F9 -01 -20 -20 -3F -ENDCHAR -STARTCHAR B829 -ENCODING 47145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -17 -F1 -83 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B82A -ENCODING 47146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B82B -ENCODING 47147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -17 -F1 -83 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR B82C -ENCODING 47148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -17 -F1 -87 -F9 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B82D -ENCODING 47149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B82E -ENCODING 47150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B82F -ENCODING 47151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B830 -ENCODING 47152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B831 -ENCODING 47153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B832 -ENCODING 47154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B833 -ENCODING 47155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B834 -ENCODING 47156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -17 -F1 -87 -81 -F9 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B835 -ENCODING 47157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -17 -F1 -87 -81 -F9 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B836 -ENCODING 47158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1700 -F100 -8300 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B837 -ENCODING 47159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F100 -1700 -F100 -8700 -8100 -F900 -0100 -0800 -0800 -3600 -4180 -ENDCHAR -STARTCHAR B838 -ENCODING 47160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F100 -1700 -F100 -8700 -8100 -F900 -0000 -2200 -2200 -7500 -C880 -ENDCHAR -STARTCHAR B839 -ENCODING 47161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -17 -F1 -87 -81 -F9 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B83A -ENCODING 47162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1700 -F100 -8300 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B83B -ENCODING 47163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -1300 -E700 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B83C -ENCODING 47164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -17 -F1 -83 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B83D -ENCODING 47165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B83E -ENCODING 47166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -17 -F1 -83 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B83F -ENCODING 47167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -13 -E7 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B840 -ENCODING 47168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -1D -F5 -85 -8D -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR B841 -ENCODING 47169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -F5 -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B842 -ENCODING 47170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -F5 -85 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B843 -ENCODING 47171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -8500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B844 -ENCODING 47172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1D00 -E500 -8D00 -8500 -F500 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B845 -ENCODING 47173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -8500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B846 -ENCODING 47174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B847 -ENCODING 47175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -F5 -85 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR B848 -ENCODING 47176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR B849 -ENCODING 47177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR B84A -ENCODING 47178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR B84B -ENCODING 47179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B84C -ENCODING 47180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR B84D -ENCODING 47181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B84E -ENCODING 47182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B84F -ENCODING 47183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -E500 -9500 -6100 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR B850 -ENCODING 47184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -F5 -85 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR B851 -ENCODING 47185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -1D -F5 -8D -85 -F5 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B852 -ENCODING 47186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -8500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B853 -ENCODING 47187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1D00 -F500 -8D00 -8500 -F500 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B854 -ENCODING 47188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -8500 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B855 -ENCODING 47189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -F5 -8D -FD -09 -37 -41 -23 -1C -ENDCHAR -STARTCHAR B856 -ENCODING 47190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -8500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B857 -ENCODING 47191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -E500 -9500 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B858 -ENCODING 47192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -F5 -85 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B859 -ENCODING 47193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B85A -ENCODING 47194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -F5 -85 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B85B -ENCODING 47195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -E5 -95 -61 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B85C -ENCODING 47196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -0080 -3F80 -2000 -2000 -3F80 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR B85D -ENCODING 47197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR B85E -ENCODING 47198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -08 -F7 -7E -11 -11 -10 -ENDCHAR -STARTCHAR B85F -ENCODING 47199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -08 -F7 -F2 -16 -15 -18 -ENDCHAR -STARTCHAR B860 -ENCODING 47200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B861 -ENCODING 47201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -08 -F7 -07 -42 -45 -20 -ENDCHAR -STARTCHAR B862 -ENCODING 47202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B863 -ENCODING 47203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -08 -F7 -7E -40 -7E -ENDCHAR -STARTCHAR B864 -ENCODING 47204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0400 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B865 -ENCODING 47205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -0000 -3B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B866 -ENCODING 47206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -3300 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B867 -ENCODING 47207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -3000 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR B868 -ENCODING 47208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B869 -ENCODING 47209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -3300 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR B86A -ENCODING 47210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B86B -ENCODING 47211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR B86C -ENCODING 47212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B86D -ENCODING 47213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0400 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B86E -ENCODING 47214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -08 -F7 -12 -72 -95 -78 -ENDCHAR -STARTCHAR B86F -ENCODING 47215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0400 -FFC0 -0400 -0C00 -1B00 -6180 -ENDCHAR -STARTCHAR B870 -ENCODING 47216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -08 -F7 -20 -26 -5D -80 -ENDCHAR -STARTCHAR B871 -ENCODING 47217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B872 -ENCODING 47218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -7E -40 -7F -08 -F7 -7E -02 -7F -ENDCHAR -STARTCHAR B873 -ENCODING 47219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -0E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR B874 -ENCODING 47220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -7E -40 -7F -08 -F7 -7E -01 -7F -ENDCHAR -STARTCHAR B875 -ENCODING 47221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR B876 -ENCODING 47222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -08 -F7 -7F -24 -7E -ENDCHAR -STARTCHAR B877 -ENCODING 47223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3B00 -0400 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR B878 -ENCODING 47224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -7C80 -4080 -7CC0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B879 -ENCODING 47225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR B87A -ENCODING 47226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B87B -ENCODING 47227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B87C -ENCODING 47228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -7C80 -4080 -7CC0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B87D -ENCODING 47229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B87E -ENCODING 47230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0300 -0480 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B87F -ENCODING 47231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR B880 -ENCODING 47232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0000 -3F00 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B881 -ENCODING 47233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0000 -3B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B882 -ENCODING 47234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B883 -ENCODING 47235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0000 -3C80 -3F00 -4480 -3B00 -ENDCHAR -STARTCHAR B884 -ENCODING 47236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0000 -3900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B885 -ENCODING 47237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0000 -3F00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR B886 -ENCODING 47238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0000 -3B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B887 -ENCODING 47239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0300 -3880 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR B888 -ENCODING 47240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR B889 -ENCODING 47241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR B88A -ENCODING 47242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -9200 -F200 -9500 -7800 -ENDCHAR -STARTCHAR B88B -ENCODING 47243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8180 -7900 -3D00 -C000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR B88C -ENCODING 47244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR B88D -ENCODING 47245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -7C80 -4080 -7CC0 -1080 -FE80 -0000 -1F00 -2080 -1F00 -ENDCHAR -STARTCHAR B88E -ENCODING 47246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8180 -7900 -2D00 -D000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR B88F -ENCODING 47247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR B890 -ENCODING 47248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR B891 -ENCODING 47249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0000 -3F00 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR B892 -ENCODING 47250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR B893 -ENCODING 47251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3800 -0480 -3C80 -40C0 -3C80 -FE80 -0E00 -3F80 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR B894 -ENCODING 47252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -65 -15 -75 -87 -D5 -25 -FD -05 -05 -01 -ENDCHAR -STARTCHAR B895 -ENCODING 47253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B896 -ENCODING 47254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B897 -ENCODING 47255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -8700 -F500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B898 -ENCODING 47256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -0A80 -7280 -7B80 -1280 -FA80 -0280 -1000 -1F80 -ENDCHAR -STARTCHAR B899 -ENCODING 47257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -8700 -F500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR B89A -ENCODING 47258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR B89B -ENCODING 47259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR B89C -ENCODING 47260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR B89D -ENCODING 47261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR B89E -ENCODING 47262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR B89F -ENCODING 47263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR B8A0 -ENCODING 47264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR B8A1 -ENCODING 47265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR B8A2 -ENCODING 47266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR B8A3 -ENCODING 47267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR B8A4 -ENCODING 47268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR B8A5 -ENCODING 47269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR B8A6 -ENCODING 47270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -8700 -F500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B8A7 -ENCODING 47271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR B8A8 -ENCODING 47272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7A80 -0A80 -7A80 -4380 -7A80 -1280 -FE80 -1100 -1100 -1A80 -2640 -ENDCHAR -STARTCHAR B8A9 -ENCODING 47273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -87 -F5 -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR B8AA -ENCODING 47274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -8700 -F500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B8AB -ENCODING 47275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR B8AC -ENCODING 47276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B8AD -ENCODING 47277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR B8AE -ENCODING 47278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR B8AF -ENCODING 47279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR B8B0 -ENCODING 47280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -7C80 -4080 -7C80 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B8B1 -ENCODING 47281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -3E -01 -01 -01 -ENDCHAR -STARTCHAR B8B2 -ENCODING 47282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B8B3 -ENCODING 47283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -72 -12 -15 -10 -ENDCHAR -STARTCHAR B8B4 -ENCODING 47284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -7D -21 -FF -01 -40 -40 -7F -ENDCHAR -STARTCHAR B8B5 -ENCODING 47285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B8B6 -ENCODING 47286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -07 -4F -42 -45 -37 -ENDCHAR -STARTCHAR B8B7 -ENCODING 47287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR B8B8 -ENCODING 47288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -7D -20 -FF -01 -7F -40 -7F -ENDCHAR -STARTCHAR B8B9 -ENCODING 47289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR B8BA -ENCODING 47290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -77 -79 -49 -76 -ENDCHAR -STARTCHAR B8BB -ENCODING 47291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B8BC -ENCODING 47292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -72 -32 -45 -70 -ENDCHAR -STARTCHAR B8BD -ENCODING 47293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B8BE -ENCODING 47294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B8BF -ENCODING 47295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR B8C0 -ENCODING 47296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -7D -21 -FF -00 -7F -41 -7F -ENDCHAR -STARTCHAR B8C1 -ENCODING 47297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -7D -21 -FE -41 -7F -41 -7F -ENDCHAR -STARTCHAR B8C2 -ENCODING 47298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -12 -72 -55 -70 -ENDCHAR -STARTCHAR B8C3 -ENCODING 47299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -7D -21 -FF -08 -08 -36 -41 -ENDCHAR -STARTCHAR B8C4 -ENCODING 47300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B8C5 -ENCODING 47301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -7D -21 -FF -00 -3E -41 -3E -ENDCHAR -STARTCHAR B8C6 -ENCODING 47302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -F900 -8100 -7900 -3D00 -C100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B8C7 -ENCODING 47303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0900 -7900 -8100 -7900 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B8C8 -ENCODING 47304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B8C9 -ENCODING 47305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B8CA -ENCODING 47306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -3F -12 -3F -ENDCHAR -STARTCHAR B8CB -ENCODING 47307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -0C -33 -0C -32 -1E -ENDCHAR -STARTCHAR B8CC -ENCODING 47308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -0080 -3F80 -2000 -2000 -3F80 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR B8CD -ENCODING 47309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -7E -40 -7F -24 -DB -7E -01 -01 -ENDCHAR -STARTCHAR B8CE -ENCODING 47310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -24 -DB -7E -11 -11 -10 -ENDCHAR -STARTCHAR B8CF -ENCODING 47311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -24 -DB -F2 -16 -15 -18 -ENDCHAR -STARTCHAR B8D0 -ENCODING 47312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -1200 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B8D1 -ENCODING 47313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -24 -DB -07 -42 -45 -20 -ENDCHAR -STARTCHAR B8D2 -ENCODING 47314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B8D3 -ENCODING 47315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -24 -DB -7E -40 -7E -ENDCHAR -STARTCHAR B8D4 -ENCODING 47316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -1200 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B8D5 -ENCODING 47317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -0000 -3B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B8D6 -ENCODING 47318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -3300 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B8D7 -ENCODING 47319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -3000 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR B8D8 -ENCODING 47320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B8D9 -ENCODING 47321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -3300 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR B8DA -ENCODING 47322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B8DB -ENCODING 47323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR B8DC -ENCODING 47324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -24 -DB -7E -41 -7F -ENDCHAR -STARTCHAR B8DD -ENCODING 47325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -1200 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B8DE -ENCODING 47326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -24 -DB -12 -72 -95 -78 -ENDCHAR -STARTCHAR B8DF -ENCODING 47327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -1200 -FFC0 -0400 -0C00 -1A00 -6180 -ENDCHAR -STARTCHAR B8E0 -ENCODING 47328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -24 -DB -20 -26 -5D -80 -ENDCHAR -STARTCHAR B8E1 -ENCODING 47329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -1200 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B8E2 -ENCODING 47330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -7E -40 -7F -24 -DB -7E -02 -7F -ENDCHAR -STARTCHAR B8E3 -ENCODING 47331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -0E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR B8E4 -ENCODING 47332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -7E -40 -7F -24 -DB -7E -01 -7F -ENDCHAR -STARTCHAR B8E5 -ENCODING 47333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR B8E6 -ENCODING 47334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -24 -DB -7F -24 -7E -ENDCHAR -STARTCHAR B8E7 -ENCODING 47335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2D00 -1200 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR B8E8 -ENCODING 47336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -0080 -3F80 -2000 -3F80 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR B8E9 -ENCODING 47337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR B8EA -ENCODING 47338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -F7 -08 -08 -77 -11 -10 -ENDCHAR -STARTCHAR B8EB -ENCODING 47339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -F7 -08 -68 -12 -17 -18 -ENDCHAR -STARTCHAR B8EC -ENCODING 47340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR B8ED -ENCODING 47341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -F7 -08 -0E -42 -45 -20 -ENDCHAR -STARTCHAR B8EE -ENCODING 47342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -0400 -0300 -4780 -4480 -3B00 -ENDCHAR -STARTCHAR B8EF -ENCODING 47343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -F7 -08 -3E -40 -7E -ENDCHAR -STARTCHAR B8F0 -ENCODING 47344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B8F1 -ENCODING 47345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -0400 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B8F2 -ENCODING 47346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -0400 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B8F3 -ENCODING 47347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -0400 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR B8F4 -ENCODING 47348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -0400 -7900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B8F5 -ENCODING 47349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -0400 -3F80 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR B8F6 -ENCODING 47350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -0400 -7F80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B8F7 -ENCODING 47351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -0400 -3B00 -3B80 -4480 -3B00 -ENDCHAR -STARTCHAR B8F8 -ENCODING 47352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B8F9 -ENCODING 47353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -FFC0 -0400 -2480 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B8FA -ENCODING 47354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -F7 -08 -9A -F2 -95 -F8 -ENDCHAR -STARTCHAR B8FB -ENCODING 47355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -0400 -1A00 -6180 -ENDCHAR -STARTCHAR B8FC -ENCODING 47356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -F7 -08 -28 -26 -5D -80 -ENDCHAR -STARTCHAR B8FD -ENCODING 47357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B8FE -ENCODING 47358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -F7 -08 -7C -02 -3F -40 -ENDCHAR -STARTCHAR B8FF -ENCODING 47359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR B900 -ENCODING 47360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -7E -40 -7F -F7 -08 -7E -01 -7E -ENDCHAR -STARTCHAR B901 -ENCODING 47361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -0400 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR B902 -ENCODING 47362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -F7 -08 -08 -76 -7E -ENDCHAR -STARTCHAR B903 -ENCODING 47363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR B904 -ENCODING 47364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -7C80 -4080 -7C80 -0080 -FE80 -1080 -1380 -1080 -1080 -ENDCHAR -STARTCHAR B905 -ENCODING 47365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -27 -7E -01 -01 -01 -ENDCHAR -STARTCHAR B906 -ENCODING 47366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B907 -ENCODING 47367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -27 -62 -12 -15 -18 -ENDCHAR -STARTCHAR B908 -ENCODING 47368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -79 -81 -79 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR B909 -ENCODING 47369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B90A -ENCODING 47370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR B90B -ENCODING 47371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -79 -81 -79 -FD -27 -3E -40 -7E -ENDCHAR -STARTCHAR B90C -ENCODING 47372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -7F -3F -40 -3F -ENDCHAR -STARTCHAR B90D -ENCODING 47373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR B90E -ENCODING 47374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR B90F -ENCODING 47375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B910 -ENCODING 47376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR B911 -ENCODING 47377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B912 -ENCODING 47378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B913 -ENCODING 47379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR B914 -ENCODING 47380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -79 -81 -79 -FD -27 -3E -41 -7F -ENDCHAR -STARTCHAR B915 -ENCODING 47381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -27 -41 -7F -41 -3E -ENDCHAR -STARTCHAR B916 -ENCODING 47382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR B917 -ENCODING 47383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -79 -81 -79 -FD -27 -08 -14 -63 -ENDCHAR -STARTCHAR B918 -ENCODING 47384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8100 -FD00 -2100 -2700 -0100 -2200 -3700 -CC80 -ENDCHAR -STARTCHAR B919 -ENCODING 47385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -27 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B91A -ENCODING 47386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -7900 -8100 -7900 -FD00 -2700 -1C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B91B -ENCODING 47387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0900 -7900 -F100 -0900 -F700 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B91C -ENCODING 47388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B91D -ENCODING 47389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B91E -ENCODING 47390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -79 -81 -79 -FD -27 -2D -12 -3F -ENDCHAR -STARTCHAR B91F -ENCODING 47391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F1 -09 -F7 -2C -33 -0C -32 -1E -ENDCHAR -STARTCHAR B920 -ENCODING 47392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -7A80 -4280 -7A80 -0280 -FE80 -1280 -1680 -1280 -0280 -ENDCHAR -STARTCHAR B921 -ENCODING 47393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR B922 -ENCODING 47394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1900 -0480 -0480 -0480 -ENDCHAR -STARTCHAR B923 -ENCODING 47395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR B924 -ENCODING 47396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -3A80 -4280 -7A80 -FE80 -1680 -1280 -2000 -3F80 -ENDCHAR -STARTCHAR B925 -ENCODING 47397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR B926 -ENCODING 47398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -ED -22 -45 -42 -45 -32 -ENDCHAR -STARTCHAR B927 -ENCODING 47399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR B928 -ENCODING 47400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -ED -20 -7F -3F -40 -3F -ENDCHAR -STARTCHAR B929 -ENCODING 47401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -ED -20 -7F -39 -41 -38 -ENDCHAR -STARTCHAR B92A -ENCODING 47402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -ED -20 -77 -3D -45 -37 -ENDCHAR -STARTCHAR B92B -ENCODING 47403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -ED -20 -75 -37 -45 -37 -ENDCHAR -STARTCHAR B92C -ENCODING 47404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -E500 -1500 -ED00 -2000 -5200 -7200 -4500 -7080 -ENDCHAR -STARTCHAR B92D -ENCODING 47405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -ED -20 -77 -37 -44 -37 -ENDCHAR -STARTCHAR B92E -ENCODING 47406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -ED -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B92F -ENCODING 47407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -ED -20 -72 -37 -45 -72 -ENDCHAR -STARTCHAR B930 -ENCODING 47408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F00 -2080 -3F80 -ENDCHAR -STARTCHAR B931 -ENCODING 47409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR B932 -ENCODING 47410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -2100 -3900 -2A80 -3800 -ENDCHAR -STARTCHAR B933 -ENCODING 47411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -0400 -0600 -1900 -2080 -ENDCHAR -STARTCHAR B934 -ENCODING 47412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -0100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR B935 -ENCODING 47413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F00 -2080 -3080 -0F00 -ENDCHAR -STARTCHAR B936 -ENCODING 47414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR B937 -ENCODING 47415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -E500 -1500 -ED00 -2000 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR B938 -ENCODING 47416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F80 -0080 -1F80 -0080 -ENDCHAR -STARTCHAR B939 -ENCODING 47417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -ED -20 -3F -3F -40 -3F -ENDCHAR -STARTCHAR B93A -ENCODING 47418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR B93B -ENCODING 47419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -E5 -15 -E5 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR B93C -ENCODING 47420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -7C80 -4080 -7C80 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR B93D -ENCODING 47421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -FD -21 -20 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B93E -ENCODING 47422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B93F -ENCODING 47423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -21 -62 -12 -15 -18 -ENDCHAR -STARTCHAR B940 -ENCODING 47424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -79 -01 -FD -11 -50 -40 -7F -ENDCHAR -STARTCHAR B941 -ENCODING 47425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B942 -ENCODING 47426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR B943 -ENCODING 47427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -79 -81 -79 -FD -21 -3E -40 -7E -ENDCHAR -STARTCHAR B944 -ENCODING 47428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR B945 -ENCODING 47429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR B946 -ENCODING 47430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR B947 -ENCODING 47431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B948 -ENCODING 47432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR B949 -ENCODING 47433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B94A -ENCODING 47434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B94B -ENCODING 47435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR B94C -ENCODING 47436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -FD -21 -20 -7F -41 -41 -7F -ENDCHAR -STARTCHAR B94D -ENCODING 47437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -21 -41 -7F -41 -3E -ENDCHAR -STARTCHAR B94E -ENCODING 47438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR B94F -ENCODING 47439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -7900 -8100 -7900 -0100 -FF00 -2900 -2C00 -1600 -6180 -ENDCHAR -STARTCHAR B950 -ENCODING 47440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B951 -ENCODING 47441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -79 -81 -79 -01 -FD -20 -3E -41 -3E -ENDCHAR -STARTCHAR B952 -ENCODING 47442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -7900 -8100 -7900 -FD00 -2100 -1C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR B953 -ENCODING 47443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0900 -7900 -F900 -0100 -FD00 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B954 -ENCODING 47444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -81 -79 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B955 -ENCODING 47445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B956 -ENCODING 47446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -79 -81 -79 -FD -21 -2D -12 -3F -ENDCHAR -STARTCHAR B957 -ENCODING 47447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -F9 -01 -FD -2C -33 -0C -32 -1E -ENDCHAR -STARTCHAR B958 -ENCODING 47448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -0080 -3F80 -2000 -3F80 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR B959 -ENCODING 47449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR B95A -ENCODING 47450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -DB -24 -00 -77 -11 -10 -ENDCHAR -STARTCHAR B95B -ENCODING 47451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -DB -24 -60 -12 -17 -18 -ENDCHAR -STARTCHAR B95C -ENCODING 47452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR B95D -ENCODING 47453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -DB -24 -06 -42 -45 -20 -ENDCHAR -STARTCHAR B95E -ENCODING 47454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1200 -0100 -4780 -4480 -3B00 -ENDCHAR -STARTCHAR B95F -ENCODING 47455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -DB -24 -3E -40 -7E -ENDCHAR -STARTCHAR B960 -ENCODING 47456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B961 -ENCODING 47457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1200 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B962 -ENCODING 47458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1200 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B963 -ENCODING 47459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1200 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR B964 -ENCODING 47460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1200 -7900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B965 -ENCODING 47461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1200 -3F80 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR B966 -ENCODING 47462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1200 -7F80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B967 -ENCODING 47463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1200 -3900 -3B80 -4480 -3B00 -ENDCHAR -STARTCHAR B968 -ENCODING 47464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B969 -ENCODING 47465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -FFC0 -1200 -3280 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B96A -ENCODING 47466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -DB -24 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR B96B -ENCODING 47467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -1500 -0C00 -1A00 -6180 -ENDCHAR -STARTCHAR B96C -ENCODING 47468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -DB -24 -20 -26 -5D -80 -ENDCHAR -STARTCHAR B96D -ENCODING 47469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -1200 -1F00 -2080 -3F00 -ENDCHAR -STARTCHAR B96E -ENCODING 47470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -DB -24 -7C -02 -3F -40 -ENDCHAR -STARTCHAR B96F -ENCODING 47471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1F00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR B970 -ENCODING 47472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -7E -40 -7F -DB -24 -7E -01 -7E -ENDCHAR -STARTCHAR B971 -ENCODING 47473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1200 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR B972 -ENCODING 47474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -DB -24 -00 -7E -7E -ENDCHAR -STARTCHAR B973 -ENCODING 47475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F80 -0000 -FFC0 -1F00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR B974 -ENCODING 47476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -0080 -3F80 -2000 -2000 -3F80 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR B975 -ENCODING 47477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR B976 -ENCODING 47478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR B977 -ENCODING 47479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -FF -00 -F2 -16 -15 -18 -ENDCHAR -STARTCHAR B978 -ENCODING 47480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B979 -ENCODING 47481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -FF -00 -07 -42 -45 -20 -ENDCHAR -STARTCHAR B97A -ENCODING 47482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR B97B -ENCODING 47483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7E -40 -7F -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR B97C -ENCODING 47484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B97D -ENCODING 47485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -0000 -3B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR B97E -ENCODING 47486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -3300 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR B97F -ENCODING 47487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -3000 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR B980 -ENCODING 47488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR B981 -ENCODING 47489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -3300 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR B982 -ENCODING 47490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR B983 -ENCODING 47491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR B984 -ENCODING 47492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B985 -ENCODING 47493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B986 -ENCODING 47494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -FF -00 -12 -72 -95 -78 -ENDCHAR -STARTCHAR B987 -ENCODING 47495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -0C00 -1A00 -6180 -ENDCHAR -STARTCHAR B988 -ENCODING 47496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -7E -40 -7F -FF -00 -20 -26 -5D -80 -ENDCHAR -STARTCHAR B989 -ENCODING 47497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR B98A -ENCODING 47498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -0E00 -7180 -ENDCHAR -STARTCHAR B98B -ENCODING 47499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -0E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR B98C -ENCODING 47500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -7E -40 -7F -FF -00 -7E -01 -7F -ENDCHAR -STARTCHAR B98D -ENCODING 47501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -FFC0 -0000 -3F80 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR B98E -ENCODING 47502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3F80 -1200 -7F80 -ENDCHAR -STARTCHAR B98F -ENCODING 47503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -3F00 -0000 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR B990 -ENCODING 47504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -79 -81 -F9 -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR B991 -ENCODING 47505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -3E -01 -01 -01 -ENDCHAR -STARTCHAR B992 -ENCODING 47506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -36 -09 -09 -09 -ENDCHAR -STARTCHAR B993 -ENCODING 47507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -72 -12 -15 -10 -ENDCHAR -STARTCHAR B994 -ENCODING 47508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -81 -F9 -01 -FD -01 -40 -7F -ENDCHAR -STARTCHAR B995 -ENCODING 47509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -47 -41 -47 -30 -ENDCHAR -STARTCHAR B996 -ENCODING 47510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -07 -4F -42 -45 -37 -ENDCHAR -STARTCHAR B997 -ENCODING 47511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -3F -40 -7E -ENDCHAR -STARTCHAR B998 -ENCODING 47512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -3F -3F -40 -3F -ENDCHAR -STARTCHAR B999 -ENCODING 47513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR B99A -ENCODING 47514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -77 -79 -49 -76 -ENDCHAR -STARTCHAR B99B -ENCODING 47515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR B99C -ENCODING 47516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -72 -32 -45 -70 -ENDCHAR -STARTCHAR B99D -ENCODING 47517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR B99E -ENCODING 47518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR B99F -ENCODING 47519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR B9A0 -ENCODING 47520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -7F -41 -7F -ENDCHAR -STARTCHAR B9A1 -ENCODING 47521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -41 -7F -7F -ENDCHAR -STARTCHAR B9A2 -ENCODING 47522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -12 -72 -55 -70 -ENDCHAR -STARTCHAR B9A3 -ENCODING 47523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -7F -81 -08 -14 -63 -ENDCHAR -STARTCHAR B9A4 -ENCODING 47524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -22 -22 -55 -08 -ENDCHAR -STARTCHAR B9A5 -ENCODING 47525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -7F -81 -3E -41 -63 -1C -ENDCHAR -STARTCHAR B9A6 -ENCODING 47526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3C80 -7C80 -4080 -3C80 -FF80 -0080 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR B9A7 -ENCODING 47527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0900 -7900 -8100 -7900 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR B9A8 -ENCODING 47528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -7F -01 -3F -01 -ENDCHAR -STARTCHAR B9A9 -ENCODING 47529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR B9AA -ENCODING 47530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -3F -12 -3F -ENDCHAR -STARTCHAR B9AB -ENCODING 47531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -09 -79 -81 -79 -FD -0C -33 -0C -32 -1E -ENDCHAR -STARTCHAR B9AC -ENCODING 47532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -F9 -81 -81 -81 -FD -01 -01 -01 -ENDCHAR -STARTCHAR B9AD -ENCODING 47533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -81 -81 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B9AE -ENCODING 47534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -11 -F1 -81 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR B9AF -ENCODING 47535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1100 -F100 -8100 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR B9B0 -ENCODING 47536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -F9 -81 -81 -FD -01 -20 -20 -3F -ENDCHAR -STARTCHAR B9B1 -ENCODING 47537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -11 -F1 -81 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR B9B2 -ENCODING 47538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR B9B3 -ENCODING 47539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -11 -F1 -81 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR B9B4 -ENCODING 47540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -81 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B9B5 -ENCODING 47541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR B9B6 -ENCODING 47542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B9B7 -ENCODING 47543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR B9B8 -ENCODING 47544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B9B9 -ENCODING 47545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR B9BA -ENCODING 47546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B9BB -ENCODING 47547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR B9BC -ENCODING 47548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -81 -81 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B9BD -ENCODING 47549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -81 -81 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR B9BE -ENCODING 47550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1100 -F100 -8100 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B9BF -ENCODING 47551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -8100 -8100 -FD00 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B9C0 -ENCODING 47552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1100 -F100 -8100 -F900 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR B9C1 -ENCODING 47553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -81 -81 -FD -01 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B9C2 -ENCODING 47554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -1100 -F100 -8100 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR B9C3 -ENCODING 47555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -1100 -E100 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR B9C4 -ENCODING 47556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -11 -F1 -81 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B9C5 -ENCODING 47557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR B9C6 -ENCODING 47558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -11 -F1 -81 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B9C7 -ENCODING 47559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -11 -E1 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR B9C8 -ENCODING 47560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8900 -8980 -8900 -8900 -F900 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B9C9 -ENCODING 47561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -8900 -F900 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR B9CA -ENCODING 47562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR B9CB -ENCODING 47563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR B9CC -ENCODING 47564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8980 -8900 -F900 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B9CD -ENCODING 47565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -F900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR B9CE -ENCODING 47566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -0600 -4000 -4F00 -4900 -7700 -ENDCHAR -STARTCHAR B9CF -ENCODING 47567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8980 -8900 -F900 -0000 -7F00 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR B9D0 -ENCODING 47568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR B9D1 -ENCODING 47569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -7F00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR B9D2 -ENCODING 47570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -7F00 -1900 -7900 -8900 -7F00 -ENDCHAR -STARTCHAR B9D3 -ENCODING 47571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -7000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR B9D4 -ENCODING 47572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -7000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR B9D5 -ENCODING 47573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -7000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR B9D6 -ENCODING 47574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -7000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR B9D7 -ENCODING 47575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -7000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR B9D8 -ENCODING 47576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8980 -8900 -F900 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR B9D9 -ENCODING 47577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8980 -8900 -F900 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR B9DA -ENCODING 47578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR B9DB -ENCODING 47579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8980 -8900 -F900 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR B9DC -ENCODING 47580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR B9DD -ENCODING 47581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8980 -8900 -F900 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR B9DE -ENCODING 47582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8980 -8900 -F900 -0000 -3E00 -0400 -1E00 -6100 -ENDCHAR -STARTCHAR B9DF -ENCODING 47583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -8900 -7000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR B9E0 -ENCODING 47584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR B9E1 -ENCODING 47585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -7F00 -4000 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR B9E2 -ENCODING 47586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8900 -8980 -8900 -F900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR B9E3 -ENCODING 47587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -F900 -0100 -1C00 -0000 -7F00 -2200 -1C00 -ENDCHAR -STARTCHAR B9E4 -ENCODING 47588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -95 -95 -97 -95 -95 -F5 -05 -05 -05 -ENDCHAR -STARTCHAR B9E5 -ENCODING 47589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -97 -95 -95 -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR B9E6 -ENCODING 47590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR B9E7 -ENCODING 47591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9500 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR B9E8 -ENCODING 47592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -9500 -9500 -9700 -9500 -F500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR B9E9 -ENCODING 47593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9500 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR B9EA -ENCODING 47594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR B9EB -ENCODING 47595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -97 -95 -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR B9EC -ENCODING 47596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -97 -95 -F5 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR B9ED -ENCODING 47597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR B9EE -ENCODING 47598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR B9EF -ENCODING 47599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR B9F0 -ENCODING 47600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR B9F1 -ENCODING 47601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR B9F2 -ENCODING 47602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR B9F3 -ENCODING 47603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR B9F4 -ENCODING 47604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -97 -95 -95 -F5 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR B9F5 -ENCODING 47605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -95 -97 -95 -F5 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR B9F6 -ENCODING 47606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9500 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR B9F7 -ENCODING 47607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -9500 -9500 -9700 -9500 -F500 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR B9F8 -ENCODING 47608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -9500 -9700 -9500 -9500 -F500 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR B9F9 -ENCODING 47609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -97 -95 -95 -F5 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR B9FA -ENCODING 47610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -9500 -9500 -9700 -9500 -F500 -0000 -3F00 -0200 -1E00 -2180 -ENDCHAR -STARTCHAR B9FB -ENCODING 47611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9500 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR B9FC -ENCODING 47612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR B9FD -ENCODING 47613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR B9FE -ENCODING 47614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -97 -95 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR B9FF -ENCODING 47615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BA00 -ENCODING 47616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -8900 -8980 -8900 -F900 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BA01 -ENCODING 47617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -8980 -F900 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BA02 -ENCODING 47618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR BA03 -ENCODING 47619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR BA04 -ENCODING 47620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8980 -8900 -8900 -F980 -0100 -4000 -4000 -7E00 -ENDCHAR -STARTCHAR BA05 -ENCODING 47621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -F900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR BA06 -ENCODING 47622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR BA07 -ENCODING 47623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR BA08 -ENCODING 47624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -F980 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR BA09 -ENCODING 47625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR BA0A -ENCODING 47626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR BA0B -ENCODING 47627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR BA0C -ENCODING 47628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR BA0D -ENCODING 47629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR BA0E -ENCODING 47630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR BA0F -ENCODING 47631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR BA10 -ENCODING 47632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR BA11 -ENCODING 47633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR BA12 -ENCODING 47634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BA13 -ENCODING 47635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR BA14 -ENCODING 47636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR BA15 -ENCODING 47637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8980 -8900 -8980 -F900 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR BA16 -ENCODING 47638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR BA17 -ENCODING 47639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR BA18 -ENCODING 47640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR BA19 -ENCODING 47641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR BA1A -ENCODING 47642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8980 -8900 -8980 -F900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR BA1B -ENCODING 47643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8980 -8900 -8980 -7000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR BA1C -ENCODING 47644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -F5 -95 -97 -95 -95 -97 -F5 -05 -05 -ENDCHAR -STARTCHAR BA1D -ENCODING 47645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BA1E -ENCODING 47646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BA1F -ENCODING 47647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BA20 -ENCODING 47648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -97 -95 -F7 -05 -05 -20 -3F -ENDCHAR -STARTCHAR BA21 -ENCODING 47649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BA22 -ENCODING 47650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BA23 -ENCODING 47651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -97 -95 -97 -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BA24 -ENCODING 47652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BA25 -ENCODING 47653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BA26 -ENCODING 47654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BA27 -ENCODING 47655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BA28 -ENCODING 47656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BA29 -ENCODING 47657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BA2A -ENCODING 47658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BA2B -ENCODING 47659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BA2C -ENCODING 47660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -97 -95 -97 -F5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR BA2D -ENCODING 47661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -97 -95 -97 -F5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR BA2E -ENCODING 47662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BA2F -ENCODING 47663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -97 -95 -97 -F5 -00 -08 -14 -63 -ENDCHAR -STARTCHAR BA30 -ENCODING 47664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -F500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BA31 -ENCODING 47665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -F5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR BA32 -ENCODING 47666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BA33 -ENCODING 47667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BA34 -ENCODING 47668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BA35 -ENCODING 47669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BA36 -ENCODING 47670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -97 -95 -97 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BA37 -ENCODING 47671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BA38 -ENCODING 47672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -8F -89 -89 -89 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR BA39 -ENCODING 47673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -89 -89 -F9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BA3A -ENCODING 47674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -8F -89 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BA3B -ENCODING 47675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8F00 -8900 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BA3C -ENCODING 47676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -89 -89 -F9 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR BA3D -ENCODING 47677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -8F -89 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR BA3E -ENCODING 47678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR BA3F -ENCODING 47679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -8F -89 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR BA40 -ENCODING 47680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -89 -F9 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BA41 -ENCODING 47681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR BA42 -ENCODING 47682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -89 -F9 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BA43 -ENCODING 47683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BA44 -ENCODING 47684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BA45 -ENCODING 47685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BA46 -ENCODING 47686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BA47 -ENCODING 47687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR BA48 -ENCODING 47688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -8F -89 -F9 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BA49 -ENCODING 47689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -89 -89 -F9 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR BA4A -ENCODING 47690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8F00 -8900 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BA4B -ENCODING 47691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -8F -89 -F9 -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR BA4C -ENCODING 47692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8F00 -8900 -F900 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BA4D -ENCODING 47693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -89 -89 -F9 -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR BA4E -ENCODING 47694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8F00 -8900 -8900 -F900 -0000 -3F00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR BA4F -ENCODING 47695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8F00 -8900 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR BA50 -ENCODING 47696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -8F -89 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BA51 -ENCODING 47697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR BA52 -ENCODING 47698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -8F -89 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BA53 -ENCODING 47699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -F9 -01 -1C -00 -7F -1C -22 -1E -ENDCHAR -STARTCHAR BA54 -ENCODING 47700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -95 -9D -95 -95 -95 -F5 -05 -05 -05 -ENDCHAR -STARTCHAR BA55 -ENCODING 47701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -9D -95 -95 -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BA56 -ENCODING 47702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BA57 -ENCODING 47703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BA58 -ENCODING 47704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -9500 -9D00 -9500 -9500 -F500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BA59 -ENCODING 47705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BA5A -ENCODING 47706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BA5B -ENCODING 47707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -9D -95 -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BA5C -ENCODING 47708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -9D -95 -F5 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BA5D -ENCODING 47709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BA5E -ENCODING 47710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BA5F -ENCODING 47711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BA60 -ENCODING 47712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BA61 -ENCODING 47713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BA62 -ENCODING 47714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BA63 -ENCODING 47715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BA64 -ENCODING 47716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -9D -95 -95 -F5 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BA65 -ENCODING 47717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -9D -95 -95 -F5 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR BA66 -ENCODING 47718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BA67 -ENCODING 47719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -9500 -9500 -9D00 -9500 -F500 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR BA68 -ENCODING 47720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -9500 -9D00 -9500 -9500 -F500 -0000 -2200 -2200 -3500 -4C80 -ENDCHAR -STARTCHAR BA69 -ENCODING 47721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -9D -95 -95 -F5 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR BA6A -ENCODING 47722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BA6B -ENCODING 47723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9500 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BA6C -ENCODING 47724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BA6D -ENCODING 47725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BA6E -ENCODING 47726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -9D -95 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BA6F -ENCODING 47727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -95 -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BA70 -ENCODING 47728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -89 -89 -8F -89 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR BA71 -ENCODING 47729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -8F -89 -8F -89 -F9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BA72 -ENCODING 47730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BA73 -ENCODING 47731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8F00 -8900 -8F00 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BA74 -ENCODING 47732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -89 -8F -F9 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR BA75 -ENCODING 47733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR BA76 -ENCODING 47734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR BA77 -ENCODING 47735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -8F -89 -8F -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR BA78 -ENCODING 47736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -8F -89 -8F -F9 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BA79 -ENCODING 47737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR BA7A -ENCODING 47738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BA7B -ENCODING 47739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BA7C -ENCODING 47740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BA7D -ENCODING 47741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BA7E -ENCODING 47742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BA7F -ENCODING 47743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR BA80 -ENCODING 47744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -8F -89 -8F -F9 -00 -7F -41 -7F -ENDCHAR -STARTCHAR BA81 -ENCODING 47745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -8F -89 -8F -F9 -01 -41 -7F -7F -ENDCHAR -STARTCHAR BA82 -ENCODING 47746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8F00 -8900 -8F00 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BA83 -ENCODING 47747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -8F -89 -8F -89 -F9 -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR BA84 -ENCODING 47748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8F00 -8900 -8F00 -F900 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR BA85 -ENCODING 47749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -8F -89 -8F -89 -F9 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR BA86 -ENCODING 47750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8F00 -8900 -8F00 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR BA87 -ENCODING 47751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8F00 -8900 -FF00 -0100 -1C00 -0000 -3F00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR BA88 -ENCODING 47752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BA89 -ENCODING 47753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR BA8A -ENCODING 47754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -8F -89 -8F -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BA8B -ENCODING 47755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -8F -89 -8F -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BA8C -ENCODING 47756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -95 -9D -95 -95 -9D -95 -F5 -05 -05 -05 -ENDCHAR -STARTCHAR BA8D -ENCODING 47757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BA8E -ENCODING 47758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BA8F -ENCODING 47759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BA90 -ENCODING 47760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -95 -9D -F5 -05 -01 -20 -3F -ENDCHAR -STARTCHAR BA91 -ENCODING 47761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BA92 -ENCODING 47762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BA93 -ENCODING 47763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -95 -9D -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BA94 -ENCODING 47764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BA95 -ENCODING 47765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BA96 -ENCODING 47766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BA97 -ENCODING 47767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BA98 -ENCODING 47768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BA99 -ENCODING 47769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BA9A -ENCODING 47770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BA9B -ENCODING 47771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BA9C -ENCODING 47772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -95 -9D -F5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR BA9D -ENCODING 47773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -95 -9D -F5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR BA9E -ENCODING 47774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BA9F -ENCODING 47775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -9D -95 -F5 -00 -08 -14 -63 -ENDCHAR -STARTCHAR BAA0 -ENCODING 47776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -F500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BAA1 -ENCODING 47777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -F5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR BAA2 -ENCODING 47778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BAA3 -ENCODING 47779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9D00 -9500 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BAA4 -ENCODING 47780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BAA5 -ENCODING 47781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BAA6 -ENCODING 47782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -95 -9D -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BAA7 -ENCODING 47783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BAA8 -ENCODING 47784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -2080 -2080 -2080 -3F80 -0400 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR BAA9 -ENCODING 47785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BAAA -ENCODING 47786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -41 -76 -08 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR BAAB -ENCODING 47787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR BAAC -ENCODING 47788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BAAD -ENCODING 47789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -41 -76 -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BAAE -ENCODING 47790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BAAF -ENCODING 47791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -76 -08 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR BAB0 -ENCODING 47792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BAB1 -ENCODING 47793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BAB2 -ENCODING 47794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0400 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR BAB3 -ENCODING 47795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR BAB4 -ENCODING 47796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BAB5 -ENCODING 47797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR BAB6 -ENCODING 47798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR BAB7 -ENCODING 47799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR BAB8 -ENCODING 47800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BAB9 -ENCODING 47801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR BABA -ENCODING 47802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -41 -76 -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR BABB -ENCODING 47803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -0000 -0400 -0C00 -1A00 -6180 -ENDCHAR -STARTCHAR BABC -ENCODING 47804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -41 -76 -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR BABD -ENCODING 47805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR BABE -ENCODING 47806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -41 -76 -08 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR BABF -ENCODING 47807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR BAC0 -ENCODING 47808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -41 -76 -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR BAC1 -ENCODING 47809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR BAC2 -ENCODING 47810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -76 -08 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR BAC3 -ENCODING 47811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0400 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR BAC4 -ENCODING 47812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -4480 -4480 -4480 -7CC0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BAC5 -ENCODING 47813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR BAC6 -ENCODING 47814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR BAC7 -ENCODING 47815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR BAC8 -ENCODING 47816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -4480 -4480 -7C80 -10C0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BAC9 -ENCODING 47817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR BACA -ENCODING 47818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BACB -ENCODING 47819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR BACC -ENCODING 47820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -1F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BACD -ENCODING 47821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BACE -ENCODING 47822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR BACF -ENCODING 47823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR BAD0 -ENCODING 47824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BAD1 -ENCODING 47825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR BAD2 -ENCODING 47826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR BAD3 -ENCODING 47827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR BAD4 -ENCODING 47828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR BAD5 -ENCODING 47829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR BAD6 -ENCODING 47830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR BAD7 -ENCODING 47831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR BAD8 -ENCODING 47832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -4480 -4480 -7CC0 -1080 -FE80 -0000 -1100 -1100 -2B80 -4480 -ENDCHAR -STARTCHAR BAD9 -ENCODING 47833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -4480 -4480 -7CC0 -1080 -FE80 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR BADA -ENCODING 47834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR BADB -ENCODING 47835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR BADC -ENCODING 47836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR BADD -ENCODING 47837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR BADE -ENCODING 47838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8900 -8980 -7100 -FD00 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR BADF -ENCODING 47839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -4480 -7CC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR BAE0 -ENCODING 47840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -65 -95 -95 -97 -F5 -25 -1D -E5 -05 -01 -ENDCHAR -STARTCHAR BAE1 -ENCODING 47841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F7 -25 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BAE2 -ENCODING 47842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F7 -25 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BAE3 -ENCODING 47843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F700 -2500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BAE4 -ENCODING 47844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -95 -F7 -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR BAE5 -ENCODING 47845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F700 -2500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR BAE6 -ENCODING 47846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR BAE7 -ENCODING 47847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F7 -25 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR BAE8 -ENCODING 47848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR BAE9 -ENCODING 47849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR BAEA -ENCODING 47850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR BAEB -ENCODING 47851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR BAEC -ENCODING 47852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR BAED -ENCODING 47853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR BAEE -ENCODING 47854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR BAEF -ENCODING 47855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR BAF0 -ENCODING 47856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F7 -25 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR BAF1 -ENCODING 47857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F7 -25 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR BAF2 -ENCODING 47858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F700 -2500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BAF3 -ENCODING 47859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F7 -25 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR BAF4 -ENCODING 47860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F700 -2500 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BAF5 -ENCODING 47861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F7 -25 -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR BAF6 -ENCODING 47862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F700 -2500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BAF7 -ENCODING 47863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR BAF8 -ENCODING 47864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F7 -25 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BAF9 -ENCODING 47865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR BAFA -ENCODING 47866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F7 -25 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR BAFB -ENCODING 47867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7B80 -1280 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR BAFC -ENCODING 47868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4480 -4480 -4480 -7C80 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BAFD -ENCODING 47869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BAFE -ENCODING 47870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BAFF -ENCODING 47871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8900 -7100 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BB00 -ENCODING 47872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -F9 -21 -21 -FF -01 -41 -40 -7F -ENDCHAR -STARTCHAR BB01 -ENCODING 47873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BB02 -ENCODING 47874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR BB03 -ENCODING 47875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR BB04 -ENCODING 47876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -F9 -21 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR BB05 -ENCODING 47877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR BB06 -ENCODING 47878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR BB07 -ENCODING 47879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BB08 -ENCODING 47880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR BB09 -ENCODING 47881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BB0A -ENCODING 47882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR BB0B -ENCODING 47883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR BB0C -ENCODING 47884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -7F -41 -7F -ENDCHAR -STARTCHAR BB0D -ENCODING 47885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -F9 -21 -FF -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR BB0E -ENCODING 47886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR BB0F -ENCODING 47887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -F9 -21 -FF -01 -08 -08 -36 -41 -ENDCHAR -STARTCHAR BB10 -ENCODING 47888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR BB11 -ENCODING 47889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -F9 -21 -FF -00 -3E -41 -41 -3E -ENDCHAR -STARTCHAR BB12 -ENCODING 47890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8900 -7100 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BB13 -ENCODING 47891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -F900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR BB14 -ENCODING 47892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR BB15 -ENCODING 47893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR BB16 -ENCODING 47894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -7F -12 -3F -ENDCHAR -STARTCHAR BB17 -ENCODING 47895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR BB18 -ENCODING 47896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -2080 -2080 -2080 -3F80 -1200 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR BB19 -ENCODING 47897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -41 -5A -24 -FF -00 -7E -01 -01 -ENDCHAR -STARTCHAR BB1A -ENCODING 47898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -41 -5A -24 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR BB1B -ENCODING 47899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7F00 -4100 -5A00 -2400 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR BB1C -ENCODING 47900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -1200 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BB1D -ENCODING 47901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -41 -5A -24 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BB1E -ENCODING 47902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BB1F -ENCODING 47903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -5A -24 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR BB20 -ENCODING 47904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -1200 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BB21 -ENCODING 47905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BB22 -ENCODING 47906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR BB23 -ENCODING 47907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR BB24 -ENCODING 47908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BB25 -ENCODING 47909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR BB26 -ENCODING 47910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR BB27 -ENCODING 47911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR BB28 -ENCODING 47912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -5A -24 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR BB29 -ENCODING 47913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR BB2A -ENCODING 47914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -41 -5A -24 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR BB2B -ENCODING 47915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR BB2C -ENCODING 47916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -41 -5A -24 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR BB2D -ENCODING 47917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -41 -5A -24 -FF -00 -3E -41 -42 -3C -ENDCHAR -STARTCHAR BB2E -ENCODING 47918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -41 -5A -24 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR BB2F -ENCODING 47919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR BB30 -ENCODING 47920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -41 -5A -24 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR BB31 -ENCODING 47921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR BB32 -ENCODING 47922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -41 -5A -24 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR BB33 -ENCODING 47923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -1200 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR BB34 -ENCODING 47924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -2080 -2080 -2080 -3F80 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR BB35 -ENCODING 47925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BB36 -ENCODING 47926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0880 -ENDCHAR -STARTCHAR BB37 -ENCODING 47927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR BB38 -ENCODING 47928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR BB39 -ENCODING 47929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR BB3A -ENCODING 47930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR BB3B -ENCODING 47931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BB3C -ENCODING 47932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BB3D -ENCODING 47933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BB3E -ENCODING 47934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR BB3F -ENCODING 47935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR BB40 -ENCODING 47936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR BB41 -ENCODING 47937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR BB42 -ENCODING 47938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR BB43 -ENCODING 47939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR BB44 -ENCODING 47940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BB45 -ENCODING 47941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0400 -2480 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR BB46 -ENCODING 47942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR BB47 -ENCODING 47943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0400 -0400 -0C00 -1300 -6180 -ENDCHAR -STARTCHAR BB48 -ENCODING 47944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR BB49 -ENCODING 47945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR BB4A -ENCODING 47946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -41 -7E -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR BB4B -ENCODING 47947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR BB4C -ENCODING 47948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR BB4D -ENCODING 47949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F80 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BB4E -ENCODING 47950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR BB4F -ENCODING 47951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0400 -0E00 -0000 -3F80 -1100 -1E00 -ENDCHAR -STARTCHAR BB50 -ENCODING 47952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4480 -4480 -7C80 -0080 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR BB51 -ENCODING 47953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR BB52 -ENCODING 47954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR BB53 -ENCODING 47955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR BB54 -ENCODING 47956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -F9 -01 -FD -21 -27 -41 -40 -7F -ENDCHAR -STARTCHAR BB55 -ENCODING 47957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR BB56 -ENCODING 47958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -21 -46 -4F -49 -36 -ENDCHAR -STARTCHAR BB57 -ENCODING 47959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -3F -40 -7E -ENDCHAR -STARTCHAR BB58 -ENCODING 47960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -8F -F9 -01 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR BB59 -ENCODING 47961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -21 -77 -31 -41 -71 -ENDCHAR -STARTCHAR BB5A -ENCODING 47962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -21 -77 -79 -49 -77 -ENDCHAR -STARTCHAR BB5B -ENCODING 47963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -21 -75 -77 -45 -77 -ENDCHAR -STARTCHAR BB5C -ENCODING 47964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -21 -52 -72 -85 -68 -ENDCHAR -STARTCHAR BB5D -ENCODING 47965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -21 -77 -77 -44 -77 -ENDCHAR -STARTCHAR BB5E -ENCODING 47966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -21 -77 -75 -45 -77 -ENDCHAR -STARTCHAR BB5F -ENCODING 47967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -21 -76 -37 -49 -76 -ENDCHAR -STARTCHAR BB60 -ENCODING 47968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -7F -41 -7F -ENDCHAR -STARTCHAR BB61 -ENCODING 47969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -F9 -01 -FD -21 -27 -41 -7F -41 -7F -ENDCHAR -STARTCHAR BB62 -ENCODING 47970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR BB63 -ENCODING 47971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -8F -F9 -01 -FD -21 -29 -08 -36 -41 -ENDCHAR -STARTCHAR BB64 -ENCODING 47972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR BB65 -ENCODING 47973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR BB66 -ENCODING 47974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -F900 -DD00 -2700 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BB67 -ENCODING 47975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -7900 -DD00 -2300 -3D00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR BB68 -ENCODING 47976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR BB69 -ENCODING 47977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -21 -3F -3F -20 -3F -ENDCHAR -STARTCHAR BB6A -ENCODING 47978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -DD -27 -21 -3F -12 -3F -ENDCHAR -STARTCHAR BB6B -ENCODING 47979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -23 -3D -23 -1C -22 -1E -ENDCHAR -STARTCHAR BB6C -ENCODING 47980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -4A80 -4A80 -7A80 -0280 -FE80 -1280 -1680 -1280 -1280 -0280 -ENDCHAR -STARTCHAR BB6D -ENCODING 47981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BB6E -ENCODING 47982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BB6F -ENCODING 47983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F500 -1D00 -E500 -2900 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BB70 -ENCODING 47984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -4A80 -7A80 -0280 -FA80 -1680 -0080 -2000 -3F80 -ENDCHAR -STARTCHAR BB71 -ENCODING 47985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F500 -1D00 -E500 -2900 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR BB72 -ENCODING 47986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR BB73 -ENCODING 47987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3F -40 -7F -ENDCHAR -STARTCHAR BB74 -ENCODING 47988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -0F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR BB75 -ENCODING 47989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -0F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR BB76 -ENCODING 47990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR BB77 -ENCODING 47991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -0E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR BB78 -ENCODING 47992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -2900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR BB79 -ENCODING 47993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -0F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR BB7A -ENCODING 47994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -2B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR BB7B -ENCODING 47995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR BB7C -ENCODING 47996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3F -41 -7F -ENDCHAR -STARTCHAR BB7D -ENCODING 47997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -41 -7F -7F -ENDCHAR -STARTCHAR BB7E -ENCODING 47998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F500 -1D00 -E500 -2900 -4200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BB7F -ENCODING 47999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -08 -1C -63 -ENDCHAR -STARTCHAR BB80 -ENCODING 48000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -02 -22 -55 -08 -ENDCHAR -STARTCHAR BB81 -ENCODING 48001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3E -41 -61 -1E -ENDCHAR -STARTCHAR BB82 -ENCODING 48002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F500 -1D00 -E500 -2900 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BB83 -ENCODING 48003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR BB84 -ENCODING 48004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3F -01 -3F -01 -ENDCHAR -STARTCHAR BB85 -ENCODING 48005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR BB86 -ENCODING 48006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3F -12 -3F -ENDCHAR -STARTCHAR BB87 -ENCODING 48007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -7A80 -FE80 -1680 -1E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR BB88 -ENCODING 48008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4480 -4480 -4480 -7C80 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR BB89 -ENCODING 48009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR BB8A -ENCODING 48010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR BB8B -ENCODING 48011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR BB8C -ENCODING 48012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -F9 -01 -FD -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR BB8D -ENCODING 48013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR BB8E -ENCODING 48014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR BB8F -ENCODING 48015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR BB90 -ENCODING 48016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -F9 -01 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR BB91 -ENCODING 48017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR BB92 -ENCODING 48018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR BB93 -ENCODING 48019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR BB94 -ENCODING 48020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR BB95 -ENCODING 48021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR BB96 -ENCODING 48022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR BB97 -ENCODING 48023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR BB98 -ENCODING 48024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -7F -41 -7F -ENDCHAR -STARTCHAR BB99 -ENCODING 48025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -41 -7F -7F -ENDCHAR -STARTCHAR BB9A -ENCODING 48026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR BB9B -ENCODING 48027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -08 -14 -63 -ENDCHAR -STARTCHAR BB9C -ENCODING 48028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR BB9D -ENCODING 48029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR BB9E -ENCODING 48030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -F900 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BB9F -ENCODING 48031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -7900 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR BBA0 -ENCODING 48032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR BBA1 -ENCODING 48033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR BBA2 -ENCODING 48034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR BBA3 -ENCODING 48035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR BBA4 -ENCODING 48036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -2080 -2080 -2080 -3F80 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR BBA5 -ENCODING 48037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR BBA6 -ENCODING 48038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR BBA7 -ENCODING 48039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR BBA8 -ENCODING 48040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -1200 -3200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR BBA9 -ENCODING 48041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR BBAA -ENCODING 48042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR BBAB -ENCODING 48043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR BBAC -ENCODING 48044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BBAD -ENCODING 48045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR BBAE -ENCODING 48046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR BBAF -ENCODING 48047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR BBB0 -ENCODING 48048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR BBB1 -ENCODING 48049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR BBB2 -ENCODING 48050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR BBB3 -ENCODING 48051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR BBB4 -ENCODING 48052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BBB5 -ENCODING 48053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR BBB6 -ENCODING 48054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR BBB7 -ENCODING 48055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -1100 -1500 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR BBB8 -ENCODING 48056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR BBB9 -ENCODING 48057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR BBBA -ENCODING 48058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR BBBB -ENCODING 48059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR BBBC -ENCODING 48060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR BBBD -ENCODING 48061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -41 -41 -7E -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR BBBE -ENCODING 48062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -2080 -3F00 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR BBBF -ENCODING 48063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR BBC0 -ENCODING 48064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -2080 -2080 -2080 -2080 -3F80 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR BBC1 -ENCODING 48065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR BBC2 -ENCODING 48066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR BBC3 -ENCODING 48067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR BBC4 -ENCODING 48068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BBC5 -ENCODING 48069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR BBC6 -ENCODING 48070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR BBC7 -ENCODING 48071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR BBC8 -ENCODING 48072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BBC9 -ENCODING 48073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR BBCA -ENCODING 48074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR BBCB -ENCODING 48075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR BBCC -ENCODING 48076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR BBCD -ENCODING 48077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR BBCE -ENCODING 48078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR BBCF -ENCODING 48079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR BBD0 -ENCODING 48080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BBD1 -ENCODING 48081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -2080 -3F00 -3F80 -ENDCHAR -STARTCHAR BBD2 -ENCODING 48082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR BBD3 -ENCODING 48083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -2080 -3F00 -0000 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR BBD4 -ENCODING 48084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR BBD5 -ENCODING 48085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR BBD6 -ENCODING 48086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR BBD7 -ENCODING 48087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR BBD8 -ENCODING 48088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR BBD9 -ENCODING 48089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -41 -41 -7E -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR BBDA -ENCODING 48090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -2080 -3F80 -0000 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR BBDB -ENCODING 48091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -41 -41 -7E -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR BBDC -ENCODING 48092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -F9 -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR BBDD -ENCODING 48093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BBDE -ENCODING 48094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BBDF -ENCODING 48095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8900 -7100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BBE0 -ENCODING 48096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -71 -05 -F9 -01 -40 -7F -ENDCHAR -STARTCHAR BBE1 -ENCODING 48097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BBE2 -ENCODING 48098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BBE3 -ENCODING 48099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -3F -40 -7E -ENDCHAR -STARTCHAR BBE4 -ENCODING 48100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -3F00 -0080 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR BBE5 -ENCODING 48101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -0000 -1B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BBE6 -ENCODING 48102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -0000 -3F80 -3C80 -2480 -3B00 -ENDCHAR -STARTCHAR BBE7 -ENCODING 48103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -3000 -0A80 -3B80 -2280 -3B80 -ENDCHAR -STARTCHAR BBE8 -ENCODING 48104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BBE9 -ENCODING 48105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -3100 -0A00 -3B80 -2200 -3B80 -ENDCHAR -STARTCHAR BBEA -ENCODING 48106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR BBEB -ENCODING 48107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -3380 -0F80 -3B00 -2480 -3B00 -ENDCHAR -STARTCHAR BBEC -ENCODING 48108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -7F -41 -7F -ENDCHAR -STARTCHAR BBED -ENCODING 48109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -41 -7F -7F -ENDCHAR -STARTCHAR BBEE -ENCODING 48110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR BBEF -ENCODING 48111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR BBF0 -ENCODING 48112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR BBF1 -ENCODING 48113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR BBF2 -ENCODING 48114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8900 -7100 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BBF3 -ENCODING 48115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR BBF4 -ENCODING 48116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR BBF5 -ENCODING 48117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -0F00 -1000 -1F80 -1000 -1F80 -ENDCHAR -STARTCHAR BBF6 -ENCODING 48118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -71 -FD -00 -7F -12 -3F -ENDCHAR -STARTCHAR BBF7 -ENCODING 48119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -4480 -7C80 -0080 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR BBF8 -ENCODING 48120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -89 -89 -89 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR BBF9 -ENCODING 48121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -89 -F9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BBFA -ENCODING 48122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BBFB -ENCODING 48123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8900 -8900 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BBFC -ENCODING 48124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -89 -F9 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR BBFD -ENCODING 48125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR BBFE -ENCODING 48126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR BBFF -ENCODING 48127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -89 -F9 -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR BC00 -ENCODING 48128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -F9 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BC01 -ENCODING 48129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR BC02 -ENCODING 48130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -F9 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BC03 -ENCODING 48131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BC04 -ENCODING 48132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BC05 -ENCODING 48133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BC06 -ENCODING 48134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BC07 -ENCODING 48135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR BC08 -ENCODING 48136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -89 -F9 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BC09 -ENCODING 48137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -89 -F9 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR BC0A -ENCODING 48138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8900 -8900 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BC0B -ENCODING 48139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -89 -F9 -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR BC0C -ENCODING 48140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8900 -8900 -F900 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR BC0D -ENCODING 48141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -89 -F9 -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR BC0E -ENCODING 48142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -8900 -8900 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR BC0F -ENCODING 48143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8900 -8900 -8900 -F900 -0100 -1C00 -0000 -3F00 -0C00 -7380 -ENDCHAR -STARTCHAR BC10 -ENCODING 48144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BC11 -ENCODING 48145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -89 -89 -89 -F9 -00 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BC12 -ENCODING 48146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -89 -89 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BC13 -ENCODING 48147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -89 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BC14 -ENCODING 48148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -8900 -F900 -8980 -8900 -8900 -F900 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BC15 -ENCODING 48149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8980 -8900 -F900 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BC16 -ENCODING 48150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8980 -8900 -F900 -0000 -7E00 -1100 -1100 -1100 -ENDCHAR -STARTCHAR BC17 -ENCODING 48151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -8900 -F900 -0000 -7200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR BC18 -ENCODING 48152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8980 -8900 -F900 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR BC19 -ENCODING 48153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -F900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR BC1A -ENCODING 48154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -7000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR BC1B -ENCODING 48155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8980 -8900 -F900 -0000 -7F00 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR BC1C -ENCODING 48156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -F900 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR BC1D -ENCODING 48157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -F900 -0100 -7F00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR BC1E -ENCODING 48158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -F900 -0000 -7F00 -1900 -7900 -8900 -7F00 -ENDCHAR -STARTCHAR BC1F -ENCODING 48159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -F900 -0000 -7900 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR BC20 -ENCODING 48160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -7000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR BC21 -ENCODING 48161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -7000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR BC22 -ENCODING 48162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -7000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR BC23 -ENCODING 48163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -7000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR BC24 -ENCODING 48164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8980 -8900 -F900 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR BC25 -ENCODING 48165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -8900 -F900 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR BC26 -ENCODING 48166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BC27 -ENCODING 48167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8980 -8900 -F900 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR BC28 -ENCODING 48168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -F900 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR BC29 -ENCODING 48169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8980 -8900 -F900 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR BC2A -ENCODING 48170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -F900 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR BC2B -ENCODING 48171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -7000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR BC2C -ENCODING 48172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8900 -F900 -8980 -8900 -F900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR BC2D -ENCODING 48173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -F900 -0000 -7F00 -4000 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR BC2E -ENCODING 48174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F900 -8980 -8900 -F900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR BC2F -ENCODING 48175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -8900 -7000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR BC30 -ENCODING 48176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -95 -F5 -97 -95 -95 -F5 -05 -05 -05 -ENDCHAR -STARTCHAR BC31 -ENCODING 48177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F7 -95 -95 -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BC32 -ENCODING 48178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BC33 -ENCODING 48179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9700 -9500 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BC34 -ENCODING 48180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -9500 -9500 -F500 -9700 -9500 -F500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BC35 -ENCODING 48181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9700 -9500 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BC36 -ENCODING 48182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BC37 -ENCODING 48183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F5 -97 -95 -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BC38 -ENCODING 48184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F7 -95 -F5 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BC39 -ENCODING 48185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BC3A -ENCODING 48186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BC3B -ENCODING 48187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BC3C -ENCODING 48188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BC3D -ENCODING 48189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BC3E -ENCODING 48190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BC3F -ENCODING 48191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BC40 -ENCODING 48192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F5 -97 -95 -F5 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BC41 -ENCODING 48193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F5 -97 -95 -F5 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR BC42 -ENCODING 48194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9700 -9500 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BC43 -ENCODING 48195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -9500 -9500 -F500 -9700 -9500 -F500 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR BC44 -ENCODING 48196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -9500 -9500 -F700 -9500 -9500 -F500 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR BC45 -ENCODING 48197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F5 -97 -95 -F5 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR BC46 -ENCODING 48198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9700 -9500 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BC47 -ENCODING 48199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9700 -9500 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BC48 -ENCODING 48200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BC49 -ENCODING 48201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F7 -95 -F5 -00 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BC4A -ENCODING 48202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F5 -97 -95 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BC4B -ENCODING 48203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -95 -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BC4C -ENCODING 48204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -8980 -F900 -8900 -8980 -8900 -F900 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BC4D -ENCODING 48205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -8980 -F900 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BC4E -ENCODING 48206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR BC4F -ENCODING 48207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR BC50 -ENCODING 48208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -8900 -F980 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR BC51 -ENCODING 48209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -F900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR BC52 -ENCODING 48210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR BC53 -ENCODING 48211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR BC54 -ENCODING 48212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -7E00 -0100 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR BC55 -ENCODING 48213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR BC56 -ENCODING 48214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR BC57 -ENCODING 48215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR BC58 -ENCODING 48216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR BC59 -ENCODING 48217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR BC5A -ENCODING 48218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR BC5B -ENCODING 48219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR BC5C -ENCODING 48220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR BC5D -ENCODING 48221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F980 -8900 -8980 -F900 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR BC5E -ENCODING 48222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BC5F -ENCODING 48223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR BC60 -ENCODING 48224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR BC61 -ENCODING 48225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -F900 -1800 -2600 -4100 -2200 -1C00 -ENDCHAR -STARTCHAR BC62 -ENCODING 48226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR BC63 -ENCODING 48227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR BC64 -ENCODING 48228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR BC65 -ENCODING 48229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR BC66 -ENCODING 48230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F980 -8900 -8980 -F900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR BC67 -ENCODING 48231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F980 -8900 -8980 -7000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR BC68 -ENCODING 48232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -95 -95 -97 -F5 -95 -97 -F5 -05 -05 -ENDCHAR -STARTCHAR BC69 -ENCODING 48233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BC6A -ENCODING 48234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BC6B -ENCODING 48235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F700 -9500 -9700 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BC6C -ENCODING 48236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -95 -F7 -95 -F7 -05 -05 -20 -3F -ENDCHAR -STARTCHAR BC6D -ENCODING 48237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F700 -9500 -9700 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BC6E -ENCODING 48238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BC6F -ENCODING 48239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F7 -95 -97 -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BC70 -ENCODING 48240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BC71 -ENCODING 48241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BC72 -ENCODING 48242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BC73 -ENCODING 48243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BC74 -ENCODING 48244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BC75 -ENCODING 48245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BC76 -ENCODING 48246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BC77 -ENCODING 48247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BC78 -ENCODING 48248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F7 -95 -97 -F5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR BC79 -ENCODING 48249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F7 -95 -97 -F5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR BC7A -ENCODING 48250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F700 -9500 -9700 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BC7B -ENCODING 48251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F7 -95 -97 -F5 -00 -08 -14 -63 -ENDCHAR -STARTCHAR BC7C -ENCODING 48252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F700 -9500 -9700 -F500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BC7D -ENCODING 48253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -F5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR BC7E -ENCODING 48254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F700 -9500 -9700 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BC7F -ENCODING 48255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F700 -9500 -9700 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BC80 -ENCODING 48256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BC81 -ENCODING 48257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BC82 -ENCODING 48258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F7 -95 -97 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BC83 -ENCODING 48259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F7 -95 -97 -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BC84 -ENCODING 48260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -89 -FF -89 -89 -89 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR BC85 -ENCODING 48261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -89 -F9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BC86 -ENCODING 48262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -8F -89 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BC87 -ENCODING 48263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8F00 -8900 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BC88 -ENCODING 48264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -8F -89 -F9 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR BC89 -ENCODING 48265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -8F -89 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR BC8A -ENCODING 48266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR BC8B -ENCODING 48267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -89 -F9 -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR BC8C -ENCODING 48268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -F9 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BC8D -ENCODING 48269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR BC8E -ENCODING 48270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -F9 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BC8F -ENCODING 48271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BC90 -ENCODING 48272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BC91 -ENCODING 48273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BC92 -ENCODING 48274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BC93 -ENCODING 48275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR BC94 -ENCODING 48276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -8F -89 -F9 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BC95 -ENCODING 48277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -89 -F9 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR BC96 -ENCODING 48278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8F00 -8900 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BC97 -ENCODING 48279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8F00 -8900 -F900 -0100 -0800 -1800 -3600 -4180 -ENDCHAR -STARTCHAR BC98 -ENCODING 48280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8F00 -8900 -F900 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BC99 -ENCODING 48281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -89 -F9 -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR BC9A -ENCODING 48282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8F00 -8900 -F900 -0000 -3F00 -0200 -0C00 -7380 -ENDCHAR -STARTCHAR BC9B -ENCODING 48283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -FF00 -8900 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR BC9C -ENCODING 48284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -8F -89 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BC9D -ENCODING 48285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR BC9E -ENCODING 48286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -8F -89 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BC9F -ENCODING 48287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BCA0 -ENCODING 48288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -95 -F5 -9D -95 -95 -F5 -05 -05 -05 -ENDCHAR -STARTCHAR BCA1 -ENCODING 48289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F5 -9D -95 -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BCA2 -ENCODING 48290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BCA3 -ENCODING 48291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9D00 -9500 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BCA4 -ENCODING 48292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -9500 -9500 -F500 -9D00 -9500 -F500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BCA5 -ENCODING 48293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9D00 -9500 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BCA6 -ENCODING 48294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BCA7 -ENCODING 48295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F5 -9D -95 -F5 -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR BCA8 -ENCODING 48296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -FD -95 -F5 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BCA9 -ENCODING 48297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BCAA -ENCODING 48298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BCAB -ENCODING 48299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BCAC -ENCODING 48300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BCAD -ENCODING 48301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BCAE -ENCODING 48302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BCAF -ENCODING 48303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BCB0 -ENCODING 48304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F5 -9D -95 -F5 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BCB1 -ENCODING 48305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -FD -95 -95 -F5 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR BCB2 -ENCODING 48306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9D00 -9500 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BCB3 -ENCODING 48307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -9500 -9500 -FD00 -9500 -9500 -F500 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR BCB4 -ENCODING 48308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -9500 -9500 -FD00 -9500 -9500 -F500 -0000 -2200 -2200 -3500 -4C80 -ENDCHAR -STARTCHAR BCB5 -ENCODING 48309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -F5 -9D -95 -F5 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR BCB6 -ENCODING 48310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9D00 -9500 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BCB7 -ENCODING 48311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9D00 -9500 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BCB8 -ENCODING 48312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BCB9 -ENCODING 48313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BCBA -ENCODING 48314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F5 -9D -95 -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BCBB -ENCODING 48315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -9D -95 -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BCBC -ENCODING 48316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -8F -F9 -89 -8F -89 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR BCBD -ENCODING 48317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -8F -F9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BCBE -ENCODING 48318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BCBF -ENCODING 48319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -FF00 -8900 -8F00 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BCC0 -ENCODING 48320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -8F -F9 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR BCC1 -ENCODING 48321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR BCC2 -ENCODING 48322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR BCC3 -ENCODING 48323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -FF -89 -8F -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR BCC4 -ENCODING 48324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -8F -F9 -8F -F9 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BCC5 -ENCODING 48325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR BCC6 -ENCODING 48326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -71 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BCC7 -ENCODING 48327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BCC8 -ENCODING 48328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BCC9 -ENCODING 48329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BCCA -ENCODING 48330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BCCB -ENCODING 48331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR BCCC -ENCODING 48332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -FF -89 -8F -F9 -00 -7F -41 -7F -ENDCHAR -STARTCHAR BCCD -ENCODING 48333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -8F -F9 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR BCCE -ENCODING 48334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -FF00 -8900 -8F00 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BCCF -ENCODING 48335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -8F -F9 -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR BCD0 -ENCODING 48336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -FF00 -8900 -8F00 -F900 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR BCD1 -ENCODING 48337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -8F -F9 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR BCD2 -ENCODING 48338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -FF00 -8900 -8F00 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR BCD3 -ENCODING 48339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -FF00 -8900 -8F00 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR BCD4 -ENCODING 48340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BCD5 -ENCODING 48341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -8F -F9 -8F -F9 -00 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BCD6 -ENCODING 48342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -FF -89 -8F -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BCD7 -ENCODING 48343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -FF -89 -8F -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BCD8 -ENCODING 48344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -95 -95 -9D -F5 -95 -9D -95 -F5 -05 -05 -05 -ENDCHAR -STARTCHAR BCD9 -ENCODING 48345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -F5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BCDA -ENCODING 48346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -F5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BCDB -ENCODING 48347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -FD00 -9500 -9D00 -F500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BCDC -ENCODING 48348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -9500 -9500 -FD00 -9500 -9D00 -F500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BCDD -ENCODING 48349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -FD00 -9500 -9D00 -F500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BCDE -ENCODING 48350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BCDF -ENCODING 48351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -FD -95 -9D -F5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BCE0 -ENCODING 48352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BCE1 -ENCODING 48353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BCE2 -ENCODING 48354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BCE3 -ENCODING 48355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BCE4 -ENCODING 48356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BCE5 -ENCODING 48357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BCE6 -ENCODING 48358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BCE7 -ENCODING 48359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BCE8 -ENCODING 48360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -FD -95 -9D -F5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR BCE9 -ENCODING 48361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -FD -95 -9D -F5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR BCEA -ENCODING 48362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -FD00 -9500 -9D00 -F500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BCEB -ENCODING 48363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -FD -9D -95 -F5 -00 -08 -14 -63 -ENDCHAR -STARTCHAR BCEC -ENCODING 48364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -FD00 -9500 -9D00 -F500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BCED -ENCODING 48365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -9D -95 -F5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR BCEE -ENCODING 48366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -FD00 -9500 -9D00 -F500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BCEF -ENCODING 48367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -FD00 -9500 -9D00 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BCF0 -ENCODING 48368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -F5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BCF1 -ENCODING 48369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BCF2 -ENCODING 48370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -FD -95 -9D -F5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BCF3 -ENCODING 48371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -FD -95 -9D -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BCF4 -ENCODING 48372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -2080 -2080 -3F80 -2080 -2080 -3F80 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR BCF5 -ENCODING 48373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BCF6 -ENCODING 48374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0400 -FFC0 -0000 -3F00 -0880 -0880 -0880 -ENDCHAR -STARTCHAR BCF7 -ENCODING 48375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -4000 -4100 -7E00 -4100 -3E00 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR BCF8 -ENCODING 48376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -3F00 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BCF9 -ENCODING 48377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BCFA -ENCODING 48378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BCFB -ENCODING 48379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR BCFC -ENCODING 48380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -3F00 -0400 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BCFD -ENCODING 48381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BCFE -ENCODING 48382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR BCFF -ENCODING 48383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR BD00 -ENCODING 48384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BD01 -ENCODING 48385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR BD02 -ENCODING 48386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR BD03 -ENCODING 48387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR BD04 -ENCODING 48388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BD05 -ENCODING 48389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR BD06 -ENCODING 48390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR BD07 -ENCODING 48391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0400 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR BD08 -ENCODING 48392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR BD09 -ENCODING 48393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR BD0A -ENCODING 48394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR BD0B -ENCODING 48395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR BD0C -ENCODING 48396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR BD0D -ENCODING 48397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR BD0E -ENCODING 48398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR BD0F -ENCODING 48399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -0400 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR BD10 -ENCODING 48400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4480 -4480 -7C80 -4480 -7CC0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BD11 -ENCODING 48401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR BD12 -ENCODING 48402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR BD13 -ENCODING 48403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR BD14 -ENCODING 48404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4480 -4480 -7C80 -4480 -7CC0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BD15 -ENCODING 48405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR BD16 -ENCODING 48406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BD17 -ENCODING 48407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR BD18 -ENCODING 48408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -1F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BD19 -ENCODING 48409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BD1A -ENCODING 48410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR BD1B -ENCODING 48411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR BD1C -ENCODING 48412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BD1D -ENCODING 48413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR BD1E -ENCODING 48414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR BD1F -ENCODING 48415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR BD20 -ENCODING 48416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR BD21 -ENCODING 48417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR BD22 -ENCODING 48418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR BD23 -ENCODING 48419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR BD24 -ENCODING 48420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4480 -7C80 -4480 -7CC0 -1080 -FE80 -0000 -1100 -1100 -2B80 -4480 -ENDCHAR -STARTCHAR BD25 -ENCODING 48421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -3E00 -4100 -4200 -3C00 -ENDCHAR -STARTCHAR BD26 -ENCODING 48422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR BD27 -ENCODING 48423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR BD28 -ENCODING 48424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR BD29 -ENCODING 48425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR BD2A -ENCODING 48426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -8900 -F900 -8980 -7100 -FD00 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR BD2B -ENCODING 48427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4480 -7C80 -7CC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR BD2C -ENCODING 48428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4A80 -4A80 -7A80 -4A80 -7B80 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR BD2D -ENCODING 48429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -65 -FD -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BD2E -ENCODING 48430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -65 -FD -01 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BD2F -ENCODING 48431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9700 -6500 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BD30 -ENCODING 48432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F5 -95 -F7 -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR BD31 -ENCODING 48433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9700 -6500 -FD00 -0100 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR BD32 -ENCODING 48434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR BD33 -ENCODING 48435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F5 -97 -65 -FD -01 -3F -40 -7F -ENDCHAR -STARTCHAR BD34 -ENCODING 48436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR BD35 -ENCODING 48437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR BD36 -ENCODING 48438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR BD37 -ENCODING 48439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR BD38 -ENCODING 48440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR BD39 -ENCODING 48441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR BD3A -ENCODING 48442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR BD3B -ENCODING 48443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR BD3C -ENCODING 48444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F5 -97 -65 -FD -01 -3F -41 -7F -ENDCHAR -STARTCHAR BD3D -ENCODING 48445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F5 -97 -65 -FD -01 -21 -3F -3F -ENDCHAR -STARTCHAR BD3E -ENCODING 48446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9700 -6500 -FD00 -0100 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BD3F -ENCODING 48447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F5 -97 -65 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR BD40 -ENCODING 48448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4A80 -7A80 -4A80 -7B80 -1280 -FE80 -0000 -1100 -1100 -1A80 -2640 -ENDCHAR -STARTCHAR BD41 -ENCODING 48449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -65 -FD -09 -37 -41 -23 -1C -ENDCHAR -STARTCHAR BD42 -ENCODING 48450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -9700 -6500 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BD43 -ENCODING 48451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR BD44 -ENCODING 48452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -97 -65 -FD -01 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BD45 -ENCODING 48453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR BD46 -ENCODING 48454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -95 -F5 -97 -65 -FD -01 -3F -12 -3F -ENDCHAR -STARTCHAR BD47 -ENCODING 48455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -6B80 -1280 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR BD48 -ENCODING 48456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4480 -4480 -7C80 -4480 -7C80 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BD49 -ENCODING 48457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -F9 -89 -F9 -21 -FF -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BD4A -ENCODING 48458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BD4B -ENCODING 48459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8900 -7100 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BD4C -ENCODING 48460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -F9 -21 -FF -01 -40 -40 -7F -ENDCHAR -STARTCHAR BD4D -ENCODING 48461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BD4E -ENCODING 48462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR BD4F -ENCODING 48463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR BD50 -ENCODING 48464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -F9 -20 -FF -01 -7F -40 -7F -ENDCHAR -STARTCHAR BD51 -ENCODING 48465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR BD52 -ENCODING 48466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR BD53 -ENCODING 48467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BD54 -ENCODING 48468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR BD55 -ENCODING 48469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BD56 -ENCODING 48470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR BD57 -ENCODING 48471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR BD58 -ENCODING 48472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -F9 -89 -F9 -21 -FF -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR BD59 -ENCODING 48473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -F9 -89 -F9 -21 -FF -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR BD5A -ENCODING 48474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR BD5B -ENCODING 48475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR BD5C -ENCODING 48476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR BD5D -ENCODING 48477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR BD5E -ENCODING 48478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8900 -7100 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BD5F -ENCODING 48479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -F900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR BD60 -ENCODING 48480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR BD61 -ENCODING 48481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR BD62 -ENCODING 48482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -7F -12 -3F -ENDCHAR -STARTCHAR BD63 -ENCODING 48483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR BD64 -ENCODING 48484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -2080 -2080 -3F80 -2080 -2080 -3F80 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR BD65 -ENCODING 48485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -01 -01 -ENDCHAR -STARTCHAR BD66 -ENCODING 48486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR BD67 -ENCODING 48487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -4000 -4100 -7E00 -4100 -3E00 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR BD68 -ENCODING 48488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -3F00 -1200 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BD69 -ENCODING 48489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BD6A -ENCODING 48490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BD6B -ENCODING 48491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR BD6C -ENCODING 48492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -3F00 -0080 -3F00 -3F00 -ENDCHAR -STARTCHAR BD6D -ENCODING 48493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BD6E -ENCODING 48494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR BD6F -ENCODING 48495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR BD70 -ENCODING 48496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BD71 -ENCODING 48497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR BD72 -ENCODING 48498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR BD73 -ENCODING 48499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR BD74 -ENCODING 48500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR BD75 -ENCODING 48501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -41 -7E -41 -3E -FF -00 -41 -7E -7F -ENDCHAR -STARTCHAR BD76 -ENCODING 48502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR BD77 -ENCODING 48503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR BD78 -ENCODING 48504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR BD79 -ENCODING 48505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -3E -41 -42 -3C -ENDCHAR -STARTCHAR BD7A -ENCODING 48506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR BD7B -ENCODING 48507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR BD7C -ENCODING 48508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR BD7D -ENCODING 48509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR BD7E -ENCODING 48510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR BD7F -ENCODING 48511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -3F80 -2080 -3F00 -1200 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR BD80 -ENCODING 48512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2080 -2080 -3F80 -2080 -3F80 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR BD81 -ENCODING 48513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BD82 -ENCODING 48514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR BD83 -ENCODING 48515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR BD84 -ENCODING 48516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR BD85 -ENCODING 48517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR BD86 -ENCODING 48518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR BD87 -ENCODING 48519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BD88 -ENCODING 48520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BD89 -ENCODING 48521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -FFC0 -0400 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BD8A -ENCODING 48522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -FFC0 -0400 -3F80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR BD8B -ENCODING 48523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR BD8C -ENCODING 48524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR BD8D -ENCODING 48525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR BD8E -ENCODING 48526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR BD8F -ENCODING 48527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR BD90 -ENCODING 48528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BD91 -ENCODING 48529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0400 -2480 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR BD92 -ENCODING 48530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR BD93 -ENCODING 48531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0400 -0400 -0C00 -1300 -6180 -ENDCHAR -STARTCHAR BD94 -ENCODING 48532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR BD95 -ENCODING 48533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR BD96 -ENCODING 48534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -41 -7F -7E -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR BD97 -ENCODING 48535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR BD98 -ENCODING 48536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR BD99 -ENCODING 48537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -FFC0 -0400 -3F80 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BD9A -ENCODING 48538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F80 -1200 -1200 -7F80 -ENDCHAR -STARTCHAR BD9B -ENCODING 48539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR BD9C -ENCODING 48540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4480 -7C80 -4480 -7C80 -0080 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR BD9D -ENCODING 48541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -3E -01 -01 -01 -ENDCHAR -STARTCHAR BD9E -ENCODING 48542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR BD9F -ENCODING 48543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -72 -12 -15 -10 -ENDCHAR -STARTCHAR BDA0 -ENCODING 48544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -71 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR BDA1 -ENCODING 48545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR BDA2 -ENCODING 48546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR BDA3 -ENCODING 48547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -3F -40 -7E -ENDCHAR -STARTCHAR BDA4 -ENCODING 48548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -FF -89 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR BDA5 -ENCODING 48549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR BDA6 -ENCODING 48550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR BDA7 -ENCODING 48551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR BDA8 -ENCODING 48552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR BDA9 -ENCODING 48553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR BDAA -ENCODING 48554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR BDAB -ENCODING 48555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR BDAC -ENCODING 48556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -7F -41 -7F -ENDCHAR -STARTCHAR BDAD -ENCODING 48557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -41 -7F -7F -ENDCHAR -STARTCHAR BDAE -ENCODING 48558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR BDAF -ENCODING 48559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -08 -14 -63 -ENDCHAR -STARTCHAR BDB0 -ENCODING 48560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -F900 -8F00 -F900 -0100 -FD00 -2000 -2200 -2200 -7500 -C880 -ENDCHAR -STARTCHAR BDB1 -ENCODING 48561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -3E -41 -63 -1C -ENDCHAR -STARTCHAR BDB2 -ENCODING 48562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -F900 -1D00 -E100 -2700 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BDB3 -ENCODING 48563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -7900 -DD00 -2300 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR BDB4 -ENCODING 48564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR BDB5 -ENCODING 48565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -27 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR BDB6 -ENCODING 48566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -1D -E1 -27 -3F -12 -3F -ENDCHAR -STARTCHAR BDB7 -ENCODING 48567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -DD -23 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR BDB8 -ENCODING 48568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4A80 -7A80 -4A80 -7A80 -0280 -FE80 -1280 -1680 -1280 -1280 -0280 -ENDCHAR -STARTCHAR BDB9 -ENCODING 48569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BDBA -ENCODING 48570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR BDBB -ENCODING 48571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -3900 -0500 -0680 -0040 -ENDCHAR -STARTCHAR BDBC -ENCODING 48572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -4A80 -7A80 -4A80 -3280 -FE80 -1680 -1280 -2000 -3F80 -ENDCHAR -STARTCHAR BDBD -ENCODING 48573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR BDBE -ENCODING 48574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -F500 -DD00 -2D00 -2000 -4F80 -4700 -4500 -3200 -ENDCHAR -STARTCHAR BDBF -ENCODING 48575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR BDC0 -ENCODING 48576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -20 -1F -7F -40 -3F -ENDCHAR -STARTCHAR BDC1 -ENCODING 48577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -20 -1F -39 -41 -38 -ENDCHAR -STARTCHAR BDC2 -ENCODING 48578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -20 -77 -35 -45 -37 -ENDCHAR -STARTCHAR BDC3 -ENCODING 48579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -20 -1D -77 -45 -37 -ENDCHAR -STARTCHAR BDC4 -ENCODING 48580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -20 -52 -72 -45 -70 -ENDCHAR -STARTCHAR BDC5 -ENCODING 48581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -20 -1F -77 -44 -37 -ENDCHAR -STARTCHAR BDC6 -ENCODING 48582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -20 -57 -75 -45 -77 -ENDCHAR -STARTCHAR BDC7 -ENCODING 48583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -27 -7F -77 -45 -72 -ENDCHAR -STARTCHAR BDC8 -ENCODING 48584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR BDC9 -ENCODING 48585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR BDCA -ENCODING 48586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -2100 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR BDCB -ENCODING 48587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -0400 -0E00 -3180 -ENDCHAR -STARTCHAR BDCC -ENCODING 48588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -0100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR BDCD -ENCODING 48589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -1F00 -2080 -3080 -0F00 -ENDCHAR -STARTCHAR BDCE -ENCODING 48590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR BDCF -ENCODING 48591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -9500 -F500 -F500 -DD00 -2D00 -2000 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR BDD0 -ENCODING 48592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -1F80 -0080 -1F80 -0080 -ENDCHAR -STARTCHAR BDD1 -ENCODING 48593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -20 -3F -3F -40 -3F -ENDCHAR -STARTCHAR BDD2 -ENCODING 48594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -4A80 -7A80 -7A80 -0280 -FA80 -1680 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR BDD3 -ENCODING 48595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -95 -F5 -F5 -DD -2D -3C -33 -0C -32 -1E -ENDCHAR -STARTCHAR BDD4 -ENCODING 48596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -4480 -4480 -7C80 -4480 -7C80 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR BDD5 -ENCODING 48597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -F9 -89 -F9 -01 -FD -21 -20 -7F -01 -01 -ENDCHAR -STARTCHAR BDD6 -ENCODING 48598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR BDD7 -ENCODING 48599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR BDD8 -ENCODING 48600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -F9 -89 -F9 -01 -FD -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR BDD9 -ENCODING 48601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR BDDA -ENCODING 48602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR BDDB -ENCODING 48603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR BDDC -ENCODING 48604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR BDDD -ENCODING 48605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR BDDE -ENCODING 48606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR BDDF -ENCODING 48607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR BDE0 -ENCODING 48608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR BDE1 -ENCODING 48609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR BDE2 -ENCODING 48610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR BDE3 -ENCODING 48611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR BDE4 -ENCODING 48612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -7F -41 -7F -ENDCHAR -STARTCHAR BDE5 -ENCODING 48613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -41 -7F -7F -ENDCHAR -STARTCHAR BDE6 -ENCODING 48614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR BDE7 -ENCODING 48615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -08 -14 -63 -ENDCHAR -STARTCHAR BDE8 -ENCODING 48616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR BDE9 -ENCODING 48617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -F9 -89 -F9 -01 -FD -21 -3E -41 -41 -3E -ENDCHAR -STARTCHAR BDEA -ENCODING 48618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -F900 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BDEB -ENCODING 48619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -8900 -7900 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR BDEC -ENCODING 48620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR BDED -ENCODING 48621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR BDEE -ENCODING 48622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -89 -F9 -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR BDEF -ENCODING 48623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -89 -79 -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR BDF0 -ENCODING 48624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2080 -2080 -3F80 -2080 -3F80 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR BDF1 -ENCODING 48625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR BDF2 -ENCODING 48626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR BDF3 -ENCODING 48627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR BDF4 -ENCODING 48628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -1200 -3200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR BDF5 -ENCODING 48629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR BDF6 -ENCODING 48630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR BDF7 -ENCODING 48631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR BDF8 -ENCODING 48632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BDF9 -ENCODING 48633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR BDFA -ENCODING 48634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR BDFB -ENCODING 48635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR BDFC -ENCODING 48636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR BDFD -ENCODING 48637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR BDFE -ENCODING 48638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR BDFF -ENCODING 48639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR BE00 -ENCODING 48640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BE01 -ENCODING 48641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR BE02 -ENCODING 48642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR BE03 -ENCODING 48643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -1100 -1500 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR BE04 -ENCODING 48644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR BE05 -ENCODING 48645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -1200 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR BE06 -ENCODING 48646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR BE07 -ENCODING 48647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR BE08 -ENCODING 48648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR BE09 -ENCODING 48649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -7E -41 -7E -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR BE0A -ENCODING 48650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2000 -2080 -3F80 -3F00 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR BE0B -ENCODING 48651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7E -41 -7E -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR BE0C -ENCODING 48652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -2080 -2080 -3F80 -2080 -2080 -3F80 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR BE0D -ENCODING 48653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BE0E -ENCODING 48654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR BE0F -ENCODING 48655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -4000 -4100 -7E00 -4100 -3E00 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR BE10 -ENCODING 48656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BE11 -ENCODING 48657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BE12 -ENCODING 48658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR BE13 -ENCODING 48659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR BE14 -ENCODING 48660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -2080 -3F00 -2080 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BE15 -ENCODING 48661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR BE16 -ENCODING 48662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR BE17 -ENCODING 48663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR BE18 -ENCODING 48664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR BE19 -ENCODING 48665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR BE1A -ENCODING 48666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR BE1B -ENCODING 48667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR BE1C -ENCODING 48668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BE1D -ENCODING 48669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR BE1E -ENCODING 48670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR BE1F -ENCODING 48671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2080 -3F00 -2080 -3F00 -0000 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR BE20 -ENCODING 48672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR BE21 -ENCODING 48673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -3E -41 -42 -3C -ENDCHAR -STARTCHAR BE22 -ENCODING 48674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR BE23 -ENCODING 48675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR BE24 -ENCODING 48676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR BE25 -ENCODING 48677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -7F -41 -7E -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR BE26 -ENCODING 48678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -40 -41 -7E -41 -3E -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR BE27 -ENCODING 48679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -40 -7F -41 -7E -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR BE28 -ENCODING 48680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -89 -F9 -89 -F9 -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR BE29 -ENCODING 48681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BE2A -ENCODING 48682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BE2B -ENCODING 48683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8900 -7100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BE2C -ENCODING 48684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -F9 -05 -F9 -01 -40 -7F -ENDCHAR -STARTCHAR BE2D -ENCODING 48685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BE2E -ENCODING 48686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR BE2F -ENCODING 48687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -3F -40 -7E -ENDCHAR -STARTCHAR BE30 -ENCODING 48688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -7E -01 -7F -40 -3F -ENDCHAR -STARTCHAR BE31 -ENCODING 48689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR BE32 -ENCODING 48690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR BE33 -ENCODING 48691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BE34 -ENCODING 48692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR BE35 -ENCODING 48693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BE36 -ENCODING 48694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR BE37 -ENCODING 48695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR BE38 -ENCODING 48696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -7F -41 -7F -ENDCHAR -STARTCHAR BE39 -ENCODING 48697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -41 -7F -7F -ENDCHAR -STARTCHAR BE3A -ENCODING 48698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR BE3B -ENCODING 48699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR BE3C -ENCODING 48700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR BE3D -ENCODING 48701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR BE3E -ENCODING 48702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8900 -7100 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BE3F -ENCODING 48703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -F900 -0100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR BE40 -ENCODING 48704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR BE41 -ENCODING 48705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR BE42 -ENCODING 48706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -71 -FD -00 -7F -12 -3F -ENDCHAR -STARTCHAR BE43 -ENCODING 48707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -F9 -01 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR BE44 -ENCODING 48708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -89 -F9 -89 -89 -89 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR BE45 -ENCODING 48709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -89 -F9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BE46 -ENCODING 48710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BE47 -ENCODING 48711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8900 -8900 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BE48 -ENCODING 48712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -89 -F9 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR BE49 -ENCODING 48713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR BE4A -ENCODING 48714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR BE4B -ENCODING 48715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -89 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR BE4C -ENCODING 48716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -F9 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BE4D -ENCODING 48717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR BE4E -ENCODING 48718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -F9 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BE4F -ENCODING 48719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BE50 -ENCODING 48720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BE51 -ENCODING 48721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BE52 -ENCODING 48722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BE53 -ENCODING 48723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR BE54 -ENCODING 48724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -89 -F9 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BE55 -ENCODING 48725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -89 -F9 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR BE56 -ENCODING 48726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8900 -8900 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BE57 -ENCODING 48727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -89 -F9 -89 -F9 -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR BE58 -ENCODING 48728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -8900 -F900 -8900 -8900 -F900 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BE59 -ENCODING 48729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -89 -89 -F9 -89 -89 -F9 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR BE5A -ENCODING 48730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -8900 -F900 -8900 -8900 -F900 -0000 -3F00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR BE5B -ENCODING 48731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -8900 -F900 -8900 -F900 -0100 -1C00 -0000 -3F00 -0200 -0C00 -7380 -ENDCHAR -STARTCHAR BE5C -ENCODING 48732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BE5D -ENCODING 48733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR BE5E -ENCODING 48734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -89 -F9 -89 -89 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BE5F -ENCODING 48735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -89 -F9 -89 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BE60 -ENCODING 48736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -D500 -DD00 -D580 -D500 -D500 -DD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BE61 -ENCODING 48737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD00 -D580 -D500 -D900 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BE62 -ENCODING 48738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D500 -DD00 -D580 -D500 -D900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR BE63 -ENCODING 48739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -D500 -D900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR BE64 -ENCODING 48740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD00 -D580 -D500 -D900 -0100 -4000 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR BE65 -ENCODING 48741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -D500 -D900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR BE66 -ENCODING 48742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -DD00 -0000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR BE67 -ENCODING 48743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D500 -DD00 -D580 -D500 -D900 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR BE68 -ENCODING 48744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD80 -D500 -DD00 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR BE69 -ENCODING 48745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -DD00 -0000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR BE6A -ENCODING 48746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD80 -D500 -DD00 -0000 -FE00 -1900 -7900 -8900 -7E00 -ENDCHAR -STARTCHAR BE6B -ENCODING 48747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -DD00 -0000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR BE6C -ENCODING 48748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -DD00 -0000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR BE6D -ENCODING 48749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -DD00 -0000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR BE6E -ENCODING 48750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -DD00 -0000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR BE6F -ENCODING 48751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -DD00 -0000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR BE70 -ENCODING 48752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD00 -D580 -D500 -D900 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR BE71 -ENCODING 48753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD80 -D500 -D500 -D900 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR BE72 -ENCODING 48754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -D500 -D900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BE73 -ENCODING 48755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD00 -D580 -D500 -D900 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR BE74 -ENCODING 48756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD00 -D580 -D500 -D900 -0000 -2200 -2200 -5500 -8980 -ENDCHAR -STARTCHAR BE75 -ENCODING 48757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD00 -D580 -D500 -D900 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR BE76 -ENCODING 48758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -D500 -D900 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR BE77 -ENCODING 48759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -DD00 -0000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR BE78 -ENCODING 48760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D500 -DD00 -D580 -D500 -D900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR BE79 -ENCODING 48761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD00 -D580 -DD00 -0000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR BE7A -ENCODING 48762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D500 -DD00 -D580 -D500 -D900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR BE7B -ENCODING 48763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD80 -D500 -DD00 -0100 -1C00 -0000 -7F00 -2200 -1C00 -ENDCHAR -STARTCHAR BE7C -ENCODING 48764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EB -EB -EB -DB -EB -EB -EB -DB -03 -03 -03 -ENDCHAR -STARTCHAR BE7D -ENCODING 48765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EB -EB -DB -EB -EB -DB -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BE7E -ENCODING 48766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -EB -ED -D5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BE7F -ENCODING 48767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -EB00 -ED00 -D500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BE80 -ENCODING 48768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -EB00 -EB00 -DB00 -EB00 -EB00 -DB00 -0300 -2300 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BE81 -ENCODING 48769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -EB00 -ED00 -D500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BE82 -ENCODING 48770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BE83 -ENCODING 48771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FD -EB -ED -D5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BE84 -ENCODING 48772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EB -EB -DB -EB -DB -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BE85 -ENCODING 48773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BE86 -ENCODING 48774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BE87 -ENCODING 48775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BE88 -ENCODING 48776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BE89 -ENCODING 48777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BE8A -ENCODING 48778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BE8B -ENCODING 48779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BE8C -ENCODING 48780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EB -EB -DB -EB -EB -DB -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BE8D -ENCODING 48781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EB -EB -DB -EB -EB -DB -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR BE8E -ENCODING 48782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -EB00 -ED00 -D500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BE8F -ENCODING 48783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -EB00 -EB00 -DB00 -EB00 -EB00 -DB00 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR BE90 -ENCODING 48784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -EB00 -EB00 -DB00 -EB00 -EB00 -DB00 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR BE91 -ENCODING 48785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EB -EB -DB -EB -EB -DB -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR BE92 -ENCODING 48786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -EB00 -ED00 -D500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BE93 -ENCODING 48787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -DD00 -EB00 -ED00 -1100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BE94 -ENCODING 48788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -EB -ED -D5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BE95 -ENCODING 48789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BE96 -ENCODING 48790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FD -EB -ED -D5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BE97 -ENCODING 48791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DD -EB -ED -11 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BE98 -ENCODING 48792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -D580 -DD00 -D500 -D580 -D500 -DD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BE99 -ENCODING 48793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD80 -D500 -D580 -D900 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR BE9A -ENCODING 48794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR BE9B -ENCODING 48795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR BE9C -ENCODING 48796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D500 -D580 -DD00 -D500 -DD80 -0100 -4000 -4000 -7E00 -ENDCHAR -STARTCHAR BE9D -ENCODING 48797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR BE9E -ENCODING 48798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR BE9F -ENCODING 48799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR BEA0 -ENCODING 48800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -7E00 -0100 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR BEA1 -ENCODING 48801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR BEA2 -ENCODING 48802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR BEA3 -ENCODING 48803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR BEA4 -ENCODING 48804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR BEA5 -ENCODING 48805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR BEA6 -ENCODING 48806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR BEA7 -ENCODING 48807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR BEA8 -ENCODING 48808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -D500 -D500 -DD80 -D500 -D580 -D900 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR BEA9 -ENCODING 48809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR BEAA -ENCODING 48810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BEAB -ENCODING 48811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR BEAC -ENCODING 48812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR BEAD -ENCODING 48813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -D580 -D900 -1800 -2600 -4100 -2200 -1C00 -ENDCHAR -STARTCHAR BEAE -ENCODING 48814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR BEAF -ENCODING 48815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR BEB0 -ENCODING 48816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR BEB1 -ENCODING 48817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR BEB2 -ENCODING 48818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D500 -DD80 -D500 -D580 -D900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR BEB3 -ENCODING 48819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -DD80 -D500 -DD80 -0000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR BEB4 -ENCODING 48820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -4D -ED -FF -ED -ED -EB -15 -05 -05 -01 -ENDCHAR -STARTCHAR BEB5 -ENCODING 48821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FB -ED -EB -D5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BEB6 -ENCODING 48822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FB -ED -EB -D5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BEB7 -ENCODING 48823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FB00 -ED00 -EB00 -D500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BEB8 -ENCODING 48824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -EF -FD -ED -DF -05 -01 -20 -3F -ENDCHAR -STARTCHAR BEB9 -ENCODING 48825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FB00 -ED00 -EB00 -D500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BEBA -ENCODING 48826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BEBB -ENCODING 48827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FB -ED -EB -D5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BEBC -ENCODING 48828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BEBD -ENCODING 48829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BEBE -ENCODING 48830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BEBF -ENCODING 48831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BEC0 -ENCODING 48832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BEC1 -ENCODING 48833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BEC2 -ENCODING 48834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BEC3 -ENCODING 48835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BEC4 -ENCODING 48836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FB -ED -EB -D5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR BEC5 -ENCODING 48837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FB -ED -EB -D5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR BEC6 -ENCODING 48838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FB00 -ED00 -EB00 -D500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BEC7 -ENCODING 48839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FB -ED -EB -D5 -01 -08 -14 -63 -ENDCHAR -STARTCHAR BEC8 -ENCODING 48840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FB00 -ED00 -EB00 -D500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BEC9 -ENCODING 48841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FB -ED -EB -D5 -0D -33 -41 -21 -1E -ENDCHAR -STARTCHAR BECA -ENCODING 48842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FB00 -ED00 -EB00 -D500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BECB -ENCODING 48843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -DB00 -ED00 -EB00 -1100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BECC -ENCODING 48844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FB -ED -EB -D5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BECD -ENCODING 48845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BECE -ENCODING 48846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FB -ED -EB -D5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BECF -ENCODING 48847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -DB -ED -EB -11 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BED0 -ENCODING 48848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -B5 -DF -B5 -B5 -B5 -DD -01 -01 -01 -ENDCHAR -STARTCHAR BED1 -ENCODING 48849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DF -B5 -B5 -DD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BED2 -ENCODING 48850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D5 -DD -D7 -D5 -D9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BED3 -ENCODING 48851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DD00 -D700 -D500 -D900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BED4 -ENCODING 48852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DF -B5 -B5 -DD -01 -41 -40 -40 -3F -ENDCHAR -STARTCHAR BED5 -ENCODING 48853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D5 -DD -D7 -D5 -D9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR BED6 -ENCODING 48854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR BED7 -ENCODING 48855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DF -B5 -B5 -DD -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR BED8 -ENCODING 48856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DF -B5 -DD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BED9 -ENCODING 48857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR BEDA -ENCODING 48858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BEDB -ENCODING 48859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BEDC -ENCODING 48860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BEDD -ENCODING 48861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BEDE -ENCODING 48862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BEDF -ENCODING 48863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR BEE0 -ENCODING 48864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DF -B5 -B5 -DD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BEE1 -ENCODING 48865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D5 -DD -D7 -D5 -D9 -01 -41 -7F -7F -ENDCHAR -STARTCHAR BEE2 -ENCODING 48866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DD00 -D700 -D500 -D900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BEE3 -ENCODING 48867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DD -B7 -B5 -DD -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR BEE4 -ENCODING 48868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -B500 -B500 -DF00 -B500 -B500 -DD00 -0000 -2200 -2200 -7500 -CC80 -ENDCHAR -STARTCHAR BEE5 -ENCODING 48869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DF -B5 -B5 -DD -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR BEE6 -ENCODING 48870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DD00 -D700 -D500 -D900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR BEE7 -ENCODING 48871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -B500 -DF00 -B500 -FD00 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR BEE8 -ENCODING 48872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D5 -DD -D7 -D5 -D9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BEE9 -ENCODING 48873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR BEEA -ENCODING 48874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D5 -DD -D7 -D5 -D9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BEEB -ENCODING 48875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B5 -FD -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BEEC -ENCODING 48876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EB -EB -EB -DB -EF -EB -EB -DB -03 -03 -03 -ENDCHAR -STARTCHAR BEED -ENCODING 48877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -FB -EF -EB -D1 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BEEE -ENCODING 48878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -FB -EF -EB -D1 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BEEF -ENCODING 48879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FB00 -EF00 -EB00 -D100 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BEF0 -ENCODING 48880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -EB -FD -EB -DB -03 -01 -20 -3F -ENDCHAR -STARTCHAR BEF1 -ENCODING 48881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FB00 -EF00 -EB00 -D100 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BEF2 -ENCODING 48882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BEF3 -ENCODING 48883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FB -EF -EB -D1 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BEF4 -ENCODING 48884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BEF5 -ENCODING 48885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BEF6 -ENCODING 48886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BEF7 -ENCODING 48887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BEF8 -ENCODING 48888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BEF9 -ENCODING 48889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BEFA -ENCODING 48890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BEFB -ENCODING 48891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BEFC -ENCODING 48892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FB -EF -EB -D1 -00 -3F -41 -7F -ENDCHAR -STARTCHAR BEFD -ENCODING 48893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FB -EF -EB -D1 -00 -21 -3F -3F -ENDCHAR -STARTCHAR BEFE -ENCODING 48894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FB00 -EF00 -EB00 -D100 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BEFF -ENCODING 48895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FB -EF -EB -D3 -00 -08 -14 -63 -ENDCHAR -STARTCHAR BF00 -ENCODING 48896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FB00 -EF00 -EB00 -D100 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BF01 -ENCODING 48897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -EB -EB -DF -EB -EB -DB -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR BF02 -ENCODING 48898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FB00 -EF00 -EB00 -D100 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BF03 -ENCODING 48899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -DB00 -EF00 -EB00 -1100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BF04 -ENCODING 48900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -FB -EF -EB -D1 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BF05 -ENCODING 48901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BF06 -ENCODING 48902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FB -EF -EB -D1 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BF07 -ENCODING 48903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DB -EF -EB -11 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BF08 -ENCODING 48904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -B7 -DD -B5 -B7 -B5 -DD -01 -01 -01 -ENDCHAR -STARTCHAR BF09 -ENCODING 48905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DF -B5 -B7 -DD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BF0A -ENCODING 48906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D5 -DF -D7 -D5 -D9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BF0B -ENCODING 48907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DF00 -D700 -D500 -D900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BF0C -ENCODING 48908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -B7 -FD -B7 -DD -01 -01 -20 -3F -ENDCHAR -STARTCHAR BF0D -ENCODING 48909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D5 -DF -D7 -D5 -D9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR BF0E -ENCODING 48910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR BF0F -ENCODING 48911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D5 -DF -D7 -D5 -D9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR BF10 -ENCODING 48912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BF11 -ENCODING 48913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR BF12 -ENCODING 48914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BF13 -ENCODING 48915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BF14 -ENCODING 48916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BF15 -ENCODING 48917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BF16 -ENCODING 48918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BF17 -ENCODING 48919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR BF18 -ENCODING 48920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B7 -DD -B7 -B5 -D9 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR BF19 -ENCODING 48921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B7 -DD -B7 -B5 -D9 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR BF1A -ENCODING 48922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DF00 -D700 -D500 -D900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BF1B -ENCODING 48923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DF -B5 -B7 -DD -01 -08 -1C -36 -41 -ENDCHAR -STARTCHAR BF1C -ENCODING 48924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -B500 -B700 -DD00 -B700 -B500 -D900 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR BF1D -ENCODING 48925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -DF -B5 -B7 -DD -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR BF1E -ENCODING 48926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DF00 -D700 -D500 -D900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR BF1F -ENCODING 48927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -B500 -DF00 -B700 -FD00 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR BF20 -ENCODING 48928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D5 -DF -D7 -D5 -D9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BF21 -ENCODING 48929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR BF22 -ENCODING 48930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D5 -DF -D7 -D5 -D9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BF23 -ENCODING 48931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DF -B7 -FD -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BF24 -ENCODING 48932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -4B -EB -FD -EB -ED -EB -13 -03 -03 -ENDCHAR -STARTCHAR BF25 -ENCODING 48933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -FD -EB -ED -D1 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BF26 -ENCODING 48934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -FD -EB -ED -D1 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BF27 -ENCODING 48935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FD00 -EB00 -ED00 -D100 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR BF28 -ENCODING 48936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -ED -FB -ED -DB -03 -01 -20 -3F -ENDCHAR -STARTCHAR BF29 -ENCODING 48937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FD00 -EB00 -ED00 -D100 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR BF2A -ENCODING 48938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR BF2B -ENCODING 48939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FD -EB -ED -D1 -00 -3F -40 -7F -ENDCHAR -STARTCHAR BF2C -ENCODING 48940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR BF2D -ENCODING 48941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR BF2E -ENCODING 48942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR BF2F -ENCODING 48943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR BF30 -ENCODING 48944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR BF31 -ENCODING 48945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR BF32 -ENCODING 48946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR BF33 -ENCODING 48947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR BF34 -ENCODING 48948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FD -EB -ED -D1 -00 -3F -41 -7F -ENDCHAR -STARTCHAR BF35 -ENCODING 48949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FD -EB -ED -D1 -00 -21 -3F -3F -ENDCHAR -STARTCHAR BF36 -ENCODING 48950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FD00 -EB00 -ED00 -D100 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR BF37 -ENCODING 48951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FD -EF -EB -D3 -01 -08 -14 -63 -ENDCHAR -STARTCHAR BF38 -ENCODING 48952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FD00 -EB00 -ED00 -D100 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BF39 -ENCODING 48953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -FD -EF -EB -D3 -0D -33 -41 -21 -1E -ENDCHAR -STARTCHAR BF3A -ENCODING 48954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -FD00 -EB00 -ED00 -D100 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR BF3B -ENCODING 48955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -EB00 -DD00 -EF00 -EB00 -1100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR BF3C -ENCODING 48956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -FD -EB -ED -D1 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BF3D -ENCODING 48957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR BF3E -ENCODING 48958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -EB -FD -EB -ED -D1 -00 -3F -12 -3F -ENDCHAR -STARTCHAR BF3F -ENCODING 48959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -EB -DD -EF -EB -11 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR BF40 -ENCODING 48960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -4C80 -4C80 -7B80 -4C80 -4C80 -7B80 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR BF41 -ENCODING 48961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BF42 -ENCODING 48962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -6E -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR BF43 -ENCODING 48963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -1100 -9900 -FF00 -9900 -6E00 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR BF44 -ENCODING 48964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -4C80 -3F80 -4C80 -3F80 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR BF45 -ENCODING 48965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -6E -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BF46 -ENCODING 48966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BF47 -ENCODING 48967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -11 -99 -FF -99 -6E -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR BF48 -ENCODING 48968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -4C80 -3F80 -4C80 -3F80 -0400 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BF49 -ENCODING 48969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BF4A -ENCODING 48970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR BF4B -ENCODING 48971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR BF4C -ENCODING 48972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BF4D -ENCODING 48973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR BF4E -ENCODING 48974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR BF4F -ENCODING 48975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR BF50 -ENCODING 48976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BF51 -ENCODING 48977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR BF52 -ENCODING 48978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -6E -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR BF53 -ENCODING 48979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -6E -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR BF54 -ENCODING 48980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -6E -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR BF55 -ENCODING 48981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR BF56 -ENCODING 48982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -11 -99 -FF -99 -6E -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR BF57 -ENCODING 48983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR BF58 -ENCODING 48984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -11 -99 -FF -99 -6E -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR BF59 -ENCODING 48985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR BF5A -ENCODING 48986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -11 -99 -FF -99 -6E -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR BF5B -ENCODING 48987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -0400 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR BF5C -ENCODING 48988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -0A80 -5A80 -7E80 -5A80 -6EC0 -1080 -1280 -EC80 -0080 -ENDCHAR -STARTCHAR BF5D -ENCODING 48989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR BF5E -ENCODING 48990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR BF5F -ENCODING 48991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR BF60 -ENCODING 48992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -5C80 -6C80 -5C80 -6CC0 -1080 -FE80 -0000 -2000 -3F00 -ENDCHAR -STARTCHAR BF61 -ENCODING 48993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR BF62 -ENCODING 48994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BF63 -ENCODING 48995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR BF64 -ENCODING 48996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -1F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BF65 -ENCODING 48997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BF66 -ENCODING 48998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR BF67 -ENCODING 48999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR BF68 -ENCODING 49000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BF69 -ENCODING 49001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR BF6A -ENCODING 49002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR BF6B -ENCODING 49003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR BF6C -ENCODING 49004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR BF6D -ENCODING 49005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR BF6E -ENCODING 49006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR BF6F -ENCODING 49007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR BF70 -ENCODING 49008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR BF71 -ENCODING 49009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -3E00 -4100 -4200 -3C00 -ENDCHAR -STARTCHAR BF72 -ENCODING 49010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR BF73 -ENCODING 49011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR BF74 -ENCODING 49012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR BF75 -ENCODING 49013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR BF76 -ENCODING 49014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -B900 -F900 -F980 -2100 -2D00 -D000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR BF77 -ENCODING 49015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7E80 -5A80 -6CC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR BF78 -ENCODING 49016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -0280 -B680 -7E80 -B780 -7A80 -1280 -0A80 -7280 -0280 -0080 -ENDCHAR -STARTCHAR BF79 -ENCODING 49017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FF -25 -FD -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BF7A -ENCODING 49018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FF -25 -FD -01 -3F -09 -09 -09 -ENDCHAR -STARTCHAR BF7B -ENCODING 49019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -FF00 -2500 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BF7C -ENCODING 49020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -6D -FD -ED -D7 -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR BF7D -ENCODING 49021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -FF00 -2500 -FD00 -0100 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR BF7E -ENCODING 49022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR BF7F -ENCODING 49023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FD -FF -25 -FD -01 -3F -40 -7F -ENDCHAR -STARTCHAR BF80 -ENCODING 49024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR BF81 -ENCODING 49025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR BF82 -ENCODING 49026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR BF83 -ENCODING 49027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR BF84 -ENCODING 49028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR BF85 -ENCODING 49029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR BF86 -ENCODING 49030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR BF87 -ENCODING 49031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR BF88 -ENCODING 49032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FD -FF -25 -FD -01 -3F -41 -7F -ENDCHAR -STARTCHAR BF89 -ENCODING 49033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FD -FF -25 -FD -01 -21 -3F -3F -ENDCHAR -STARTCHAR BF8A -ENCODING 49034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -FF00 -2500 -FD00 -0100 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR BF8B -ENCODING 49035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FD -FF -25 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR BF8C -ENCODING 49036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -FF00 -2500 -FD00 -0100 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR BF8D -ENCODING 49037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FF -25 -FD -09 -37 -41 -23 -1C -ENDCHAR -STARTCHAR BF8E -ENCODING 49038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -FF00 -2500 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BF8F -ENCODING 49039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR BF90 -ENCODING 49040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FF -25 -FD -01 -3F -3F -01 -01 -ENDCHAR -STARTCHAR BF91 -ENCODING 49041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR BF92 -ENCODING 49042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -ED -FD -FF -25 -FD -01 -3F -12 -3F -ENDCHAR -STARTCHAR BF93 -ENCODING 49043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7680 -7E80 -7F80 -1280 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR BF94 -ENCODING 49044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -5A80 -5A80 -7E80 -5A80 -7E80 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BF95 -ENCODING 49045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -7F -01 -01 -01 -ENDCHAR -STARTCHAR BF96 -ENCODING 49046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -7F -09 -09 -09 -ENDCHAR -STARTCHAR BF97 -ENCODING 49047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -B900 -F900 -F900 -0100 -3D00 -C100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR BF98 -ENCODING 49048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B9 -D9 -B9 -D9 -21 -FD -01 -40 -7F -ENDCHAR -STARTCHAR BF99 -ENCODING 49049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BF9A -ENCODING 49050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR BF9B -ENCODING 49051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -3F -40 -7E -ENDCHAR -STARTCHAR BF9C -ENCODING 49052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -7E -01 -7F -40 -3F -ENDCHAR -STARTCHAR BF9D -ENCODING 49053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR BF9E -ENCODING 49054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR BF9F -ENCODING 49055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR BFA0 -ENCODING 49056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR BFA1 -ENCODING 49057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR BFA2 -ENCODING 49058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR BFA3 -ENCODING 49059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR BFA4 -ENCODING 49060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -7F -41 -7F -ENDCHAR -STARTCHAR BFA5 -ENCODING 49061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -41 -7F -7F -ENDCHAR -STARTCHAR BFA6 -ENCODING 49062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -52 -72 -55 -78 -ENDCHAR -STARTCHAR BFA7 -ENCODING 49063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -08 -14 -63 -ENDCHAR -STARTCHAR BFA8 -ENCODING 49064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -22 -22 -55 -08 -ENDCHAR -STARTCHAR BFA9 -ENCODING 49065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -3E -41 -63 -1C -ENDCHAR -STARTCHAR BFAA -ENCODING 49066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -B900 -F900 -F900 -0100 -3D00 -C100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BFAB -ENCODING 49067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -B500 -D900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR BFAC -ENCODING 49068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -7F -3F -01 -01 -ENDCHAR -STARTCHAR BFAD -ENCODING 49069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR BFAE -ENCODING 49070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B9 -F9 -F9 -01 -3D -C1 -7F -12 -3F -ENDCHAR -STARTCHAR BFAF -ENCODING 49071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR BFB0 -ENCODING 49072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -4C80 -4C80 -7B80 -4C80 -4C80 -7B80 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR BFB1 -ENCODING 49073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -11 -99 -FF -99 -66 -FF -00 -7E -01 -01 -ENDCHAR -STARTCHAR BFB2 -ENCODING 49074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -66 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR BFB3 -ENCODING 49075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -1100 -9900 -FF00 -9900 -6600 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR BFB4 -ENCODING 49076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -99 -7F -99 -77 -24 -DB -40 -40 -7E -ENDCHAR -STARTCHAR BFB5 -ENCODING 49077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -66 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR BFB6 -ENCODING 49078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR BFB7 -ENCODING 49079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -11 -99 -FF -99 -66 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR BFB8 -ENCODING 49080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -3F00 -0080 -3F00 -3F00 -ENDCHAR -STARTCHAR BFB9 -ENCODING 49081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR BFBA -ENCODING 49082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR BFBB -ENCODING 49083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR BFBC -ENCODING 49084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR BFBD -ENCODING 49085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR BFBE -ENCODING 49086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR BFBF -ENCODING 49087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR BFC0 -ENCODING 49088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -11 -99 -FF -99 -66 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR BFC1 -ENCODING 49089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -11 -99 -FF -99 -66 -FF -00 -41 -7E -7F -ENDCHAR -STARTCHAR BFC2 -ENCODING 49090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -66 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR BFC3 -ENCODING 49091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -66 -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR BFC4 -ENCODING 49092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -99 -FF -99 -66 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR BFC5 -ENCODING 49093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -1200 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR BFC6 -ENCODING 49094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -11 -99 -FF -99 -66 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR BFC7 -ENCODING 49095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR BFC8 -ENCODING 49096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -11 -99 -FF -99 -66 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR BFC9 -ENCODING 49097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR BFCA -ENCODING 49098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -11 -99 -FF -99 -66 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR BFCB -ENCODING 49099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0C80 -7F80 -4C80 -3F80 -1200 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR BFCC -ENCODING 49100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4C80 -4C80 -7B80 -4C80 -7B80 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR BFCD -ENCODING 49101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR BFCE -ENCODING 49102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR BFCF -ENCODING 49103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR BFD0 -ENCODING 49104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -4C80 -3F80 -4C80 -3F80 -0000 -FFC0 -0400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR BFD1 -ENCODING 49105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR BFD2 -ENCODING 49106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR BFD3 -ENCODING 49107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -0400 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR BFD4 -ENCODING 49108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -4C80 -3F80 -4C80 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR BFD5 -ENCODING 49109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -08 -7F -71 -41 -71 -ENDCHAR -STARTCHAR BFD6 -ENCODING 49110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -08 -7F -79 -89 -76 -ENDCHAR -STARTCHAR BFD7 -ENCODING 49111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR BFD8 -ENCODING 49112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR BFD9 -ENCODING 49113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR BFDA -ENCODING 49114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR BFDB -ENCODING 49115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR BFDC -ENCODING 49116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR BFDD -ENCODING 49117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -2400 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR BFDE -ENCODING 49118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR BFDF -ENCODING 49119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0000 -FFC0 -0400 -0400 -0C00 -1300 -6180 -ENDCHAR -STARTCHAR BFE0 -ENCODING 49120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR BFE1 -ENCODING 49121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR BFE2 -ENCODING 49122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -11 -99 -FF -FF -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR BFE3 -ENCODING 49123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR BFE4 -ENCODING 49124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR BFE5 -ENCODING 49125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -19 -FF -99 -7F -00 -FF -08 -7E -7E -7E -ENDCHAR -STARTCHAR BFE6 -ENCODING 49126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR BFE7 -ENCODING 49127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR BFE8 -ENCODING 49128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7E80 -5A80 -5A80 -2480 -FE80 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR BFE9 -ENCODING 49129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -3E -01 -01 -01 -ENDCHAR -STARTCHAR BFEA -ENCODING 49130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR BFEB -ENCODING 49131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -72 -12 -15 -10 -ENDCHAR -STARTCHAR BFEC -ENCODING 49132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B1 -F9 -B5 -D9 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR BFED -ENCODING 49133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR BFEE -ENCODING 49134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -46 -4F -49 -36 -ENDCHAR -STARTCHAR BFEF -ENCODING 49135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -3F -40 -7E -ENDCHAR -STARTCHAR BFF0 -ENCODING 49136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -7F -3F -40 -3F -ENDCHAR -STARTCHAR BFF1 -ENCODING 49137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -77 -31 -41 -71 -ENDCHAR -STARTCHAR BFF2 -ENCODING 49138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR BFF3 -ENCODING 49139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR BFF4 -ENCODING 49140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -72 -72 -85 -68 -ENDCHAR -STARTCHAR BFF5 -ENCODING 49141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR BFF6 -ENCODING 49142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR BFF7 -ENCODING 49143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -77 -37 -49 -76 -ENDCHAR -STARTCHAR BFF8 -ENCODING 49144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -7F -41 -7F -ENDCHAR -STARTCHAR BFF9 -ENCODING 49145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -41 -7F -7F -ENDCHAR -STARTCHAR BFFA -ENCODING 49146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR BFFB -ENCODING 49147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -08 -14 -63 -ENDCHAR -STARTCHAR BFFC -ENCODING 49148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -22 -22 -55 -08 -ENDCHAR -STARTCHAR BFFD -ENCODING 49149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -3E -41 -63 -1C -ENDCHAR -STARTCHAR BFFE -ENCODING 49150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -B500 -FD00 -F500 -1D00 -E100 -2700 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR BFFF -ENCODING 49151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -B500 -D900 -FD00 -2700 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C000 -ENCODING 49152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C001 -ENCODING 49153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C002 -ENCODING 49154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -F5 -1D -E1 -27 -3F -12 -3F -ENDCHAR -STARTCHAR C003 -ENCODING 49155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -FD -27 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C004 -ENCODING 49156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -2 -BITMAP -0080 -3680 -FE80 -B680 -B680 -4A80 -FE80 -1680 -1280 -0280 -ENDCHAR -STARTCHAR C005 -ENCODING 49157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C006 -ENCODING 49158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR C007 -ENCODING 49159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -3900 -0500 -0680 -0040 -ENDCHAR -STARTCHAR C008 -ENCODING 49160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3680 -7E80 -7680 -6A80 -FE80 -1680 -1280 -2000 -3F80 -ENDCHAR -STARTCHAR C009 -ENCODING 49161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR C00A -ENCODING 49162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -FD00 -DD00 -2D00 -2000 -4F80 -4700 -4500 -3200 -ENDCHAR -STARTCHAR C00B -ENCODING 49163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR C00C -ENCODING 49164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -20 -1F -7F -40 -3F -ENDCHAR -STARTCHAR C00D -ENCODING 49165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -20 -1F -39 -41 -38 -ENDCHAR -STARTCHAR C00E -ENCODING 49166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -20 -77 -35 -45 -37 -ENDCHAR -STARTCHAR C00F -ENCODING 49167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -20 -1D -77 -45 -37 -ENDCHAR -STARTCHAR C010 -ENCODING 49168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -20 -52 -72 -45 -70 -ENDCHAR -STARTCHAR C011 -ENCODING 49169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -20 -1F -77 -44 -37 -ENDCHAR -STARTCHAR C012 -ENCODING 49170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -20 -57 -75 -45 -77 -ENDCHAR -STARTCHAR C013 -ENCODING 49171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -27 -7F -77 -45 -72 -ENDCHAR -STARTCHAR C014 -ENCODING 49172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR C015 -ENCODING 49173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR C016 -ENCODING 49174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -2100 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR C017 -ENCODING 49175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -0400 -0E00 -3180 -ENDCHAR -STARTCHAR C018 -ENCODING 49176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -0100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR C019 -ENCODING 49177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -1F00 -2080 -3080 -0F00 -ENDCHAR -STARTCHAR C01A -ENCODING 49178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR C01B -ENCODING 49179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -ED00 -FD00 -FD00 -DD00 -2D00 -2000 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR C01C -ENCODING 49180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -1F80 -0080 -1F80 -0080 -ENDCHAR -STARTCHAR C01D -ENCODING 49181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -20 -3F -3F -40 -3F -ENDCHAR -STARTCHAR C01E -ENCODING 49182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3680 -7E80 -7680 -0A80 -FA80 -1680 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR C01F -ENCODING 49183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -ED -FD -FD -DD -2D -3C -33 -0C -32 -1E -ENDCHAR -STARTCHAR C020 -ENCODING 49184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -4A80 -7E80 -5A80 -5A80 -2480 -FE80 -1080 -1080 -1080 -0080 -ENDCHAR -STARTCHAR C021 -ENCODING 49185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR C022 -ENCODING 49186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C023 -ENCODING 49187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C024 -ENCODING 49188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B1 -F9 -B5 -D9 -ED -11 -01 -40 -7F -ENDCHAR -STARTCHAR C025 -ENCODING 49189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C026 -ENCODING 49190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR C027 -ENCODING 49191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR C028 -ENCODING 49192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -7F -3F -40 -3F -ENDCHAR -STARTCHAR C029 -ENCODING 49193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR C02A -ENCODING 49194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR C02B -ENCODING 49195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR C02C -ENCODING 49196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR C02D -ENCODING 49197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR C02E -ENCODING 49198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C02F -ENCODING 49199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR C030 -ENCODING 49200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -7F -41 -7F -ENDCHAR -STARTCHAR C031 -ENCODING 49201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -41 -7F -7F -ENDCHAR -STARTCHAR C032 -ENCODING 49202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR C033 -ENCODING 49203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -08 -14 -63 -ENDCHAR -STARTCHAR C034 -ENCODING 49204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C035 -ENCODING 49205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C036 -ENCODING 49206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -B500 -FD00 -FD00 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C037 -ENCODING 49207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -B500 -D900 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C038 -ENCODING 49208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C039 -ENCODING 49209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C03A -ENCODING 49210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B5 -FD -FD -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR C03B -ENCODING 49211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C03C -ENCODING 49212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -4C80 -4C80 -7B80 -4C80 -7B80 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR C03D -ENCODING 49213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR C03E -ENCODING 49214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C03F -ENCODING 49215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C040 -ENCODING 49216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -4C80 -3F80 -4C80 -3300 -FFC0 -1200 -3200 -2000 -3F00 -ENDCHAR -STARTCHAR C041 -ENCODING 49217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C042 -ENCODING 49218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR C043 -ENCODING 49219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C044 -ENCODING 49220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -19 -FF -99 -7F -00 -FF -24 -5B -7E -7E -ENDCHAR -STARTCHAR C045 -ENCODING 49221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR C046 -ENCODING 49222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR C047 -ENCODING 49223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR C048 -ENCODING 49224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR C049 -ENCODING 49225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR C04A -ENCODING 49226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR C04B -ENCODING 49227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR C04C -ENCODING 49228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR C04D -ENCODING 49229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR C04E -ENCODING 49230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C04F -ENCODING 49231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -1400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR C050 -ENCODING 49232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR C051 -ENCODING 49233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0000 -FFC0 -1200 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C052 -ENCODING 49234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C053 -ENCODING 49235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR C054 -ENCODING 49236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR C055 -ENCODING 49237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -19 -FF -99 -7F -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR C056 -ENCODING 49238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0880 -4C80 -7F80 -7F80 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C057 -ENCODING 49239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR C058 -ENCODING 49240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -4C80 -4C80 -7B80 -4C80 -4C80 -7B80 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR C059 -ENCODING 49241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR C05A -ENCODING 49242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C05B -ENCODING 49243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C05C -ENCODING 49244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -4C80 -3F80 -4C80 -3F80 -0000 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C05D -ENCODING 49245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C05E -ENCODING 49246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C05F -ENCODING 49247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C060 -ENCODING 49248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -4C80 -3F80 -4C80 -3B80 -0000 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C061 -ENCODING 49249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR C062 -ENCODING 49250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR C063 -ENCODING 49251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR C064 -ENCODING 49252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C065 -ENCODING 49253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR C066 -ENCODING 49254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR C067 -ENCODING 49255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR C068 -ENCODING 49256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C069 -ENCODING 49257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -4C80 -3F80 -4C80 -3F80 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C06A -ENCODING 49258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C06B -ENCODING 49259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR C06C -ENCODING 49260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR C06D -ENCODING 49261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR C06E -ENCODING 49262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C06F -ENCODING 49263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR C070 -ENCODING 49264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR C071 -ENCODING 49265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -19 -FF -99 -7F -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR C072 -ENCODING 49266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0880 -4C80 -7F80 -4C80 -3300 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C073 -ENCODING 49267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -19 -FF -99 -7F -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR C074 -ENCODING 49268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -15 -B5 -FD -B5 -DD -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR C075 -ENCODING 49269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C076 -ENCODING 49270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -3F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR C077 -ENCODING 49271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR C078 -ENCODING 49272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -B9 -D9 -B9 -D9 -05 -F9 -01 -40 -7F -ENDCHAR -STARTCHAR C079 -ENCODING 49273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C07A -ENCODING 49274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C07B -ENCODING 49275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -1F80 -2000 -3F00 -ENDCHAR -STARTCHAR C07C -ENCODING 49276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -7E -01 -7F -40 -3F -ENDCHAR -STARTCHAR C07D -ENCODING 49277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR C07E -ENCODING 49278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR C07F -ENCODING 49279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C080 -ENCODING 49280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C081 -ENCODING 49281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C082 -ENCODING 49282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR C083 -ENCODING 49283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR C084 -ENCODING 49284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -3F80 -2080 -3F80 -ENDCHAR -STARTCHAR C085 -ENCODING 49285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR C086 -ENCODING 49286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -2900 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR C087 -ENCODING 49287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR C088 -ENCODING 49288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -1100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR C089 -ENCODING 49289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -1F00 -2080 -3180 -0E00 -ENDCHAR -STARTCHAR C08A -ENCODING 49290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR C08B -ENCODING 49291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -B500 -D900 -0100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C08C -ENCODING 49292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -3F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR C08D -ENCODING 49293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR C08E -ENCODING 49294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -5C80 -7C80 -7C80 -0080 -FF80 -0080 -3F80 -0900 -1F80 -ENDCHAR -STARTCHAR C08F -ENCODING 49295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -B5 -D9 -01 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C090 -ENCODING 49296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -B5 -DD -B5 -B5 -B5 -DD -01 -01 -01 -ENDCHAR -STARTCHAR C091 -ENCODING 49297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -FD -B5 -B5 -DD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C092 -ENCODING 49298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D5 -DD -D5 -D5 -D9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C093 -ENCODING 49299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DD00 -D500 -D500 -D900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C094 -ENCODING 49300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -FD -B5 -B5 -DD -01 -41 -40 -40 -3F -ENDCHAR -STARTCHAR C095 -ENCODING 49301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D5 -DD -D5 -D5 -D9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C096 -ENCODING 49302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C097 -ENCODING 49303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D5 -DD -D5 -D5 -D9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR C098 -ENCODING 49304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -FD -B5 -DD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C099 -ENCODING 49305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR C09A -ENCODING 49306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C09B -ENCODING 49307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C09C -ENCODING 49308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C09D -ENCODING 49309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C09E -ENCODING 49310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C09F -ENCODING 49311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR C0A0 -ENCODING 49312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -FD -B5 -B5 -DD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C0A1 -ENCODING 49313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -FD -B5 -B5 -DD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C0A2 -ENCODING 49314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DD00 -D500 -D500 -D900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C0A3 -ENCODING 49315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -FD -B5 -B5 -DD -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR C0A4 -ENCODING 49316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DD00 -D500 -D500 -D900 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C0A5 -ENCODING 49317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -B5 -B5 -FD -B5 -B5 -DD -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR C0A6 -ENCODING 49318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D500 -DD00 -D500 -D500 -D900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR C0A7 -ENCODING 49319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -B500 -DD00 -B500 -FD00 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C0A8 -ENCODING 49320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D5 -DD -D5 -D5 -D9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C0A9 -ENCODING 49321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR C0AA -ENCODING 49322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D5 -DD -D5 -D5 -D9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C0AB -ENCODING 49323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -B5 -DD -B5 -FD -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C0AC -ENCODING 49324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -2100 -6180 -5100 -9900 -8900 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C0AD -ENCODING 49325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -5180 -D900 -8900 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C0AE -ENCODING 49326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2100 -2100 -2180 -5100 -8900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C0AF -ENCODING 49327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -7180 -D900 -8900 -0000 -7200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR C0B0 -ENCODING 49328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -5180 -D900 -8900 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR C0B1 -ENCODING 49329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -2180 -5100 -8900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C0B2 -ENCODING 49330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -5180 -8900 -0000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR C0B3 -ENCODING 49331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -5180 -D900 -8900 -0000 -7F00 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR C0B4 -ENCODING 49332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -5100 -8900 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR C0B5 -ENCODING 49333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -5100 -8900 -0000 -7F00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR C0B6 -ENCODING 49334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -5100 -8900 -0000 -7F00 -1900 -7900 -8900 -7F00 -ENDCHAR -STARTCHAR C0B7 -ENCODING 49335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -5180 -8900 -0000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR C0B8 -ENCODING 49336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -5180 -8900 -0000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR C0B9 -ENCODING 49337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -5180 -8900 -0000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR C0BA -ENCODING 49338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -5180 -8900 -0000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR C0BB -ENCODING 49339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -5180 -8900 -0000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR C0BC -ENCODING 49340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -5180 -D900 -8900 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR C0BD -ENCODING 49341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -5180 -D900 -8900 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR C0BE -ENCODING 49342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -2180 -5100 -8900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C0BF -ENCODING 49343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -5180 -D900 -8900 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR C0C0 -ENCODING 49344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -5180 -D900 -8900 -0000 -2200 -2200 -5500 -8880 -ENDCHAR -STARTCHAR C0C1 -ENCODING 49345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2100 -5180 -D900 -8900 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR C0C2 -ENCODING 49346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -2180 -5100 -8900 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR C0C3 -ENCODING 49347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -5180 -8900 -0000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR C0C4 -ENCODING 49348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2100 -2100 -2180 -5100 -8900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR C0C5 -ENCODING 49349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -5100 -8900 -0000 -7F00 -4000 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR C0C6 -ENCODING 49350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -2100 -2100 -2180 -5100 -8900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR C0C7 -ENCODING 49351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2100 -5180 -8900 -0000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR C0C8 -ENCODING 49352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -25 -45 -67 -65 -95 -95 -05 -05 -05 -ENDCHAR -STARTCHAR C0C9 -ENCODING 49353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -65 -67 -95 -8D -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C0CA -ENCODING 49354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -25 -67 -95 -85 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C0CB -ENCODING 49355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2500 -6700 -9500 -8500 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C0CC -ENCODING 49356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2500 -2500 -6500 -6700 -9500 -8D00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C0CD -ENCODING 49357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2500 -6700 -9500 -8500 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C0CE -ENCODING 49358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C0CF -ENCODING 49359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -25 -67 -95 -85 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C0D0 -ENCODING 49360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -67 -D5 -9D -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C0D1 -ENCODING 49361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C0D2 -ENCODING 49362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C0D3 -ENCODING 49363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C0D4 -ENCODING 49364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C0D5 -ENCODING 49365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C0D6 -ENCODING 49366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C0D7 -ENCODING 49367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C0D8 -ENCODING 49368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -65 -67 -D5 -8D -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C0D9 -ENCODING 49369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -65 -67 -D5 -9D -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR C0DA -ENCODING 49370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2500 -6700 -9500 -8500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C0DB -ENCODING 49371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2500 -2500 -6500 -6700 -9500 -8D00 -0100 -0800 -0C00 -3600 -6180 -ENDCHAR -STARTCHAR C0DC -ENCODING 49372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2500 -2500 -6500 -6700 -9500 -8D00 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR C0DD -ENCODING 49373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -65 -67 -D5 -8D -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C0DE -ENCODING 49374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2500 -6700 -9500 -8500 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C0DF -ENCODING 49375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6500 -6700 -9500 -0500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C0E0 -ENCODING 49376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -25 -67 -95 -85 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C0E1 -ENCODING 49377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C0E2 -ENCODING 49378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -25 -67 -95 -85 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C0E3 -ENCODING 49379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -67 -95 -05 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C0E4 -ENCODING 49380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -2100 -6100 -5180 -9900 -8900 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C0E5 -ENCODING 49381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -5100 -D980 -8900 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C0E6 -ENCODING 49382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2100 -2180 -2100 -5180 -8900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C0E7 -ENCODING 49383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -2100 -5180 -8900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR C0E8 -ENCODING 49384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -7100 -D900 -8980 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR C0E9 -ENCODING 49385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -2100 -5180 -8900 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C0EA -ENCODING 49386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR C0EB -ENCODING 49387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -2100 -2180 -2100 -5180 -8900 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR C0EC -ENCODING 49388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2180 -2100 -5180 -8900 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR C0ED -ENCODING 49389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR C0EE -ENCODING 49390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR C0EF -ENCODING 49391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR C0F0 -ENCODING 49392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR C0F1 -ENCODING 49393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR C0F2 -ENCODING 49394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR C0F3 -ENCODING 49395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR C0F4 -ENCODING 49396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -5100 -D980 -8900 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR C0F5 -ENCODING 49397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -5100 -D980 -8900 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR C0F6 -ENCODING 49398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -2100 -5180 -8900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C0F7 -ENCODING 49399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -7100 -D980 -8900 -0100 -0800 -0C00 -3600 -6100 -ENDCHAR -STARTCHAR C0F8 -ENCODING 49400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -2100 -5180 -8900 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR C0F9 -ENCODING 49401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2180 -5100 -D980 -8900 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR C0FA -ENCODING 49402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -2100 -5180 -8900 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR C0FB -ENCODING 49403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR C0FC -ENCODING 49404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -2100 -2180 -2100 -5180 -8900 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR C0FD -ENCODING 49405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR C0FE -ENCODING 49406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -2100 -2180 -2100 -5180 -8900 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR C0FF -ENCODING 49407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2100 -2180 -5100 -8980 -0000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR C100 -ENCODING 49408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -27 -45 -65 -67 -95 -95 -05 -05 -05 -ENDCHAR -STARTCHAR C101 -ENCODING 49409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -27 -65 -97 -85 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C102 -ENCODING 49410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -27 -65 -97 -85 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C103 -ENCODING 49411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2700 -6500 -9700 -8500 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C104 -ENCODING 49412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2500 -2500 -6700 -6500 -9500 -8F00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C105 -ENCODING 49413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2700 -6500 -9700 -8500 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C106 -ENCODING 49414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C107 -ENCODING 49415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -27 -65 -97 -85 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C108 -ENCODING 49416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -27 -65 -97 -9D -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C109 -ENCODING 49417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C10A -ENCODING 49418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C10B -ENCODING 49419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C10C -ENCODING 49420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C10D -ENCODING 49421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C10E -ENCODING 49422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C10F -ENCODING 49423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C110 -ENCODING 49424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -67 -65 -97 -8D -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C111 -ENCODING 49425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -27 -65 -97 -85 -00 -21 -3F -3F -ENDCHAR -STARTCHAR C112 -ENCODING 49426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2700 -6500 -9700 -8500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C113 -ENCODING 49427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -27 -65 -97 -85 -00 -08 -14 -63 -ENDCHAR -STARTCHAR C114 -ENCODING 49428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2700 -6500 -9700 -8500 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C115 -ENCODING 49429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -67 -65 -97 -8D -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C116 -ENCODING 49430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2700 -6500 -9700 -8500 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C117 -ENCODING 49431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6700 -6500 -9700 -0500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C118 -ENCODING 49432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -27 -65 -97 -85 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C119 -ENCODING 49433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C11A -ENCODING 49434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -27 -65 -97 -85 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C11B -ENCODING 49435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -67 -65 -97 -05 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C11C -ENCODING 49436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -27 -61 -51 -99 -89 -01 -01 -01 -ENDCHAR -STARTCHAR C11D -ENCODING 49437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -51 -D9 -89 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C11E -ENCODING 49438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -51 -D9 -89 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C11F -ENCODING 49439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2700 -5100 -D900 -8900 -0000 -7200 -1200 -1500 -1480 -ENDCHAR -STARTCHAR C120 -ENCODING 49440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -51 -D9 -89 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR C121 -ENCODING 49441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -27 -51 -89 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C122 -ENCODING 49442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -57 -89 -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C123 -ENCODING 49443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -51 -D9 -89 -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR C124 -ENCODING 49444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -51 -89 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C125 -ENCODING 49445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -57 -89 -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR C126 -ENCODING 49446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -51 -89 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C127 -ENCODING 49447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -51 -89 -00 -75 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C128 -ENCODING 49448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -57 -89 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C129 -ENCODING 49449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -57 -89 -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C12A -ENCODING 49450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -57 -89 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C12B -ENCODING 49451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -57 -89 -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR C12C -ENCODING 49452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -71 -D9 -89 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C12D -ENCODING 49453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -51 -D9 -89 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C12E -ENCODING 49454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2100 -2700 -5100 -8900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C12F -ENCODING 49455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2700 -7100 -D900 -8900 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR C130 -ENCODING 49456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2700 -5100 -D900 -8900 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR C131 -ENCODING 49457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -51 -D9 -89 -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR C132 -ENCODING 49458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2100 -2700 -5100 -8900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR C133 -ENCODING 49459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2100 -5700 -8900 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C134 -ENCODING 49460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -27 -51 -89 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C135 -ENCODING 49461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -57 -89 -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR C136 -ENCODING 49462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -2700 -5100 -D900 -8900 -0000 -3F00 -1200 -1200 -7F80 -ENDCHAR -STARTCHAR C137 -ENCODING 49463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -57 -89 -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C138 -ENCODING 49464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -25 -4D -65 -65 -95 -95 -05 -05 -05 -ENDCHAR -STARTCHAR C139 -ENCODING 49465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -6D -65 -95 -8D -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C13A -ENCODING 49466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -25 -6D -95 -85 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C13B -ENCODING 49467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2500 -6D00 -9500 -8500 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C13C -ENCODING 49468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2500 -2500 -6D00 -6500 -9500 -8D00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C13D -ENCODING 49469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2500 -6D00 -9500 -8500 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C13E -ENCODING 49470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C13F -ENCODING 49471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -25 -6D -95 -85 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C140 -ENCODING 49472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -6D -D5 -9D -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C141 -ENCODING 49473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C142 -ENCODING 49474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C143 -ENCODING 49475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C144 -ENCODING 49476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C145 -ENCODING 49477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C146 -ENCODING 49478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C147 -ENCODING 49479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C148 -ENCODING 49480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -6D -65 -95 -8D -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C149 -ENCODING 49481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -6D -65 -95 -8D -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR C14A -ENCODING 49482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2500 -6D00 -9500 -8500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C14B -ENCODING 49483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2500 -2500 -6D00 -6500 -9500 -8D00 -0100 -0800 -0C00 -3600 -6180 -ENDCHAR -STARTCHAR C14C -ENCODING 49484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2500 -2500 -6D00 -6500 -9500 -8D00 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR C14D -ENCODING 49485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -6D -65 -95 -8D -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C14E -ENCODING 49486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2500 -6D00 -9500 -8500 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C14F -ENCODING 49487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6D00 -6500 -9500 -0100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C150 -ENCODING 49488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -25 -6D -95 -85 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C151 -ENCODING 49489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C152 -ENCODING 49490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -25 -6D -95 -85 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C153 -ENCODING 49491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -65 -95 -01 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C154 -ENCODING 49492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -27 -21 -67 -51 -99 -89 -01 -01 -01 -ENDCHAR -STARTCHAR C155 -ENCODING 49493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -27 -21 -67 -D1 -89 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C156 -ENCODING 49494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -27 -21 -53 -89 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C157 -ENCODING 49495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2700 -2100 -5300 -8900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C158 -ENCODING 49496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -27 -21 -67 -D1 -89 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR C159 -ENCODING 49497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -27 -21 -53 -89 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C15A -ENCODING 49498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C15B -ENCODING 49499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -27 -21 -53 -89 -00 -7E -40 -7E -ENDCHAR -STARTCHAR C15C -ENCODING 49500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -27 -21 -57 -89 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C15D -ENCODING 49501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR C15E -ENCODING 49502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C15F -ENCODING 49503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C160 -ENCODING 49504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C161 -ENCODING 49505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C162 -ENCODING 49506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C163 -ENCODING 49507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR C164 -ENCODING 49508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -27 -21 -57 -D1 -89 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C165 -ENCODING 49509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -27 -21 -57 -D1 -89 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C166 -ENCODING 49510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2700 -2100 -5300 -8900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C167 -ENCODING 49511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2700 -2100 -6700 -D100 -8900 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR C168 -ENCODING 49512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2700 -2100 -6700 -D100 -8900 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR C169 -ENCODING 49513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -27 -21 -67 -D1 -89 -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR C16A -ENCODING 49514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2700 -2100 -5300 -8900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR C16B -ENCODING 49515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2300 -5700 -8900 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C16C -ENCODING 49516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -27 -21 -53 -89 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C16D -ENCODING 49517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR C16E -ENCODING 49518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -27 -21 -53 -89 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C16F -ENCODING 49519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -23 -57 -89 -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C170 -ENCODING 49520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -25 -2D -45 -6D -65 -95 -95 -05 -05 -05 -ENDCHAR -STARTCHAR C171 -ENCODING 49521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -2D -65 -9D -85 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C172 -ENCODING 49522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -2D -65 -9D -85 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C173 -ENCODING 49523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2D00 -6500 -9D00 -8500 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C174 -ENCODING 49524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2500 -2D00 -4500 -6D00 -9500 -9500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C175 -ENCODING 49525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2D00 -6500 -9D00 -8500 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C176 -ENCODING 49526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C177 -ENCODING 49527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -2D -65 -9D -85 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C178 -ENCODING 49528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -2D -25 -6D -B5 -95 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C179 -ENCODING 49529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C17A -ENCODING 49530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C17B -ENCODING 49531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C17C -ENCODING 49532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C17D -ENCODING 49533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C17E -ENCODING 49534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C17F -ENCODING 49535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C180 -ENCODING 49536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -2D -65 -9D -85 -00 -3F -41 -7F -ENDCHAR -STARTCHAR C181 -ENCODING 49537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -2D -65 -9D -85 -00 -21 -3F -3F -ENDCHAR -STARTCHAR C182 -ENCODING 49538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2D00 -6500 -9D00 -8500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C183 -ENCODING 49539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -2D -6D -95 -85 -00 -08 -14 -63 -ENDCHAR -STARTCHAR C184 -ENCODING 49540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2D00 -6500 -9D00 -8500 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C185 -ENCODING 49541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -25 -2D -45 -6D -95 -95 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C186 -ENCODING 49542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -2D00 -6500 -9D00 -8500 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C187 -ENCODING 49543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6D00 -6D00 -9500 -0100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C188 -ENCODING 49544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -2D -65 -9D -85 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C189 -ENCODING 49545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C18A -ENCODING 49546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -2D -65 -9D -85 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C18B -ENCODING 49547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -6D -6D -95 -01 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C18C -ENCODING 49548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -0400 -0C00 -0C00 -1200 -3100 -4480 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR C18D -ENCODING 49549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6580 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C18E -ENCODING 49550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6580 -0400 -FFC0 -0000 -3F00 -0880 -0880 -0880 -ENDCHAR -STARTCHAR C18F -ENCODING 49551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -3400 -4300 -0800 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR C190 -ENCODING 49552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6180 -0400 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C191 -ENCODING 49553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -18 -34 -43 -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C192 -ENCODING 49554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C193 -ENCODING 49555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -18 -34 -43 -08 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR C194 -ENCODING 49556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1E00 -6180 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C195 -ENCODING 49557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C196 -ENCODING 49558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1E00 -6180 -0400 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR C197 -ENCODING 49559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR C198 -ENCODING 49560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C199 -ENCODING 49561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C19A -ENCODING 49562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR C19B -ENCODING 49563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR C19C -ENCODING 49564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6580 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C19D -ENCODING 49565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6580 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C19E -ENCODING 49566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -18 -34 -43 -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR C19F -ENCODING 49567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6580 -0400 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR C1A0 -ENCODING 49568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -18 -34 -43 -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR C1A1 -ENCODING 49569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6580 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C1A2 -ENCODING 49570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -18 -34 -43 -08 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR C1A3 -ENCODING 49571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0400 -FFC0 -0E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR C1A4 -ENCODING 49572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -18 -34 -43 -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR C1A5 -ENCODING 49573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1E00 -6180 -0400 -FFC0 -0000 -3F80 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C1A6 -ENCODING 49574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -18 -34 -43 -08 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR C1A7 -ENCODING 49575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0400 -FFC0 -1E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR C1A8 -ENCODING 49576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -1080 -1880 -2C80 -44C0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C1A9 -ENCODING 49577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -1080 -2880 -56C0 -1080 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C1AA -ENCODING 49578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -3F00 -0880 -0880 -ENDCHAR -STARTCHAR C1AB -ENCODING 49579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -3900 -0900 -0A80 -0800 -ENDCHAR -STARTCHAR C1AC -ENCODING 49580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -1080 -2C80 -4680 -10C0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C1AD -ENCODING 49581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C1AE -ENCODING 49582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C1AF -ENCODING 49583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -3F80 -2000 -3F00 -ENDCHAR -STARTCHAR C1B0 -ENCODING 49584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -3880 -66C0 -1080 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C1B1 -ENCODING 49585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C1B2 -ENCODING 49586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C1B3 -ENCODING 49587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR C1B4 -ENCODING 49588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C1B5 -ENCODING 49589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR C1B6 -ENCODING 49590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR C1B7 -ENCODING 49591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR C1B8 -ENCODING 49592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR C1B9 -ENCODING 49593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -2080 -3F00 -3F80 -ENDCHAR -STARTCHAR C1BA -ENCODING 49594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -0900 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR C1BB -ENCODING 49595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -2100 -3100 -CD80 -2100 -FD00 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR C1BC -ENCODING 49596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -1100 -1100 -2A80 -4400 -ENDCHAR -STARTCHAR C1BD -ENCODING 49597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -1080 -2C80 -56C0 -1080 -FE80 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C1BE -ENCODING 49598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -1F00 -0300 -1F80 -2000 -ENDCHAR -STARTCHAR C1BF -ENCODING 49599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -0600 -0000 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR C1C0 -ENCODING 49600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -3F00 -1F80 -0080 -ENDCHAR -STARTCHAR C1C1 -ENCODING 49601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR C1C2 -ENCODING 49602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1080 -1880 -66C0 -1080 -FE80 -0000 -3F80 -1100 -3F80 -ENDCHAR -STARTCHAR C1C3 -ENCODING 49603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1080 -3880 -54C0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR C1C4 -ENCODING 49604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -2280 -3280 -4A80 -4780 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR C1C5 -ENCODING 49605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -9F -25 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C1C6 -ENCODING 49606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -9F -25 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C1C7 -ENCODING 49607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6500 -9F00 -2500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C1C8 -ENCODING 49608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -3280 -6A80 -4E80 -1380 -1280 -FE80 -0280 -1000 -1000 -1F80 -ENDCHAR -STARTCHAR C1C9 -ENCODING 49609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6500 -9F00 -2500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C1CA -ENCODING 49610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR C1CB -ENCODING 49611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -65 -9F -25 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR C1CC -ENCODING 49612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -3280 -4F80 -1280 -FE80 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C1CD -ENCODING 49613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR C1CE -ENCODING 49614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR C1CF -ENCODING 49615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C1D0 -ENCODING 49616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR C1D1 -ENCODING 49617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C1D2 -ENCODING 49618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C1D3 -ENCODING 49619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR C1D4 -ENCODING 49620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -3280 -6A80 -4F80 -1280 -FE80 -0000 -1F80 -2080 -2080 -1F80 -ENDCHAR -STARTCHAR C1D5 -ENCODING 49621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -65 -9F -25 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR C1D6 -ENCODING 49622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6500 -9F00 -2500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C1D7 -ENCODING 49623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -3280 -6A80 -5F80 -1280 -FE80 -0080 -0400 -0400 -1B00 -2080 -ENDCHAR -STARTCHAR C1D8 -ENCODING 49624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1280 -3280 -6A80 -4F80 -1280 -FE80 -0000 -1100 -1100 -1A80 -2640 -ENDCHAR -STARTCHAR C1D9 -ENCODING 49625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -9F -25 -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR C1DA -ENCODING 49626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6500 -9F00 -2500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C1DB -ENCODING 49627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -0E00 -1E00 -0100 -0F00 -30C0 -ENDCHAR -STARTCHAR C1DC -ENCODING 49628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -9F -25 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C1DD -ENCODING 49629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C1DE -ENCODING 49630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -65 -9F -25 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR C1DF -ENCODING 49631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1280 -3280 -4B80 -1280 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR C1E0 -ENCODING 49632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1080 -1880 -2480 -4280 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C1E1 -ENCODING 49633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -21 -FD -00 -3E -01 -01 -01 -ENDCHAR -STARTCHAR C1E2 -ENCODING 49634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -21 -FD -00 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C1E3 -ENCODING 49635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -21 -FD -00 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C1E4 -ENCODING 49636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -31 -59 -8D -21 -21 -FF -01 -41 -40 -7F -ENDCHAR -STARTCHAR C1E5 -ENCODING 49637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -21 -FD -00 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C1E6 -ENCODING 49638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C1E7 -ENCODING 49639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -21 -FD -00 -3F -40 -7E -ENDCHAR -STARTCHAR C1E8 -ENCODING 49640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -31 -CD -21 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR C1E9 -ENCODING 49641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR C1EA -ENCODING 49642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR C1EB -ENCODING 49643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C1EC -ENCODING 49644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C1ED -ENCODING 49645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C1EE -ENCODING 49646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR C1EF -ENCODING 49647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR C1F0 -ENCODING 49648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -31 -59 -AD -21 -FF -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR C1F1 -ENCODING 49649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -31 -59 -AD -21 -FF -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR C1F2 -ENCODING 49650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -21 -FD -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR C1F3 -ENCODING 49651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -31 -59 -AD -21 -FF -01 -08 -08 -36 -41 -ENDCHAR -STARTCHAR C1F4 -ENCODING 49652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -21 -FD -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C1F5 -ENCODING 49653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -21 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C1F6 -ENCODING 49654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -3100 -CD00 -2100 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C1F7 -ENCODING 49655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -7100 -8900 -2100 -FD00 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR C1F8 -ENCODING 49656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -21 -FD -00 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C1F9 -ENCODING 49657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR C1FA -ENCODING 49658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -21 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR C1FB -ENCODING 49659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -71 -89 -21 -FD -0C -33 -0C -32 -1E -ENDCHAR -STARTCHAR C1FC -ENCODING 49660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -0400 -0C00 -0C00 -1A00 -3100 -4080 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR C1FD -ENCODING 49661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -7380 -1200 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C1FE -ENCODING 49662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -18 -34 -43 -24 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR C1FF -ENCODING 49663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1800 -3400 -4300 -2400 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR C200 -ENCODING 49664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -1200 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C201 -ENCODING 49665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -18 -34 -43 -24 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C202 -ENCODING 49666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C203 -ENCODING 49667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -18 -34 -43 -24 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR C204 -ENCODING 49668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1E00 -7380 -1200 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C205 -ENCODING 49669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C206 -ENCODING 49670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C207 -ENCODING 49671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR C208 -ENCODING 49672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C209 -ENCODING 49673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C20A -ENCODING 49674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR C20B -ENCODING 49675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR C20C -ENCODING 49676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -7380 -1200 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C20D -ENCODING 49677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -7380 -1200 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C20E -ENCODING 49678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -18 -34 -43 -24 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR C20F -ENCODING 49679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -7380 -1200 -FFC0 -0000 -0400 -0C00 -1300 -6180 -ENDCHAR -STARTCHAR C210 -ENCODING 49680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -18 -34 -43 -24 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR C211 -ENCODING 49681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -7380 -1200 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C212 -ENCODING 49682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -18 -34 -43 -24 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR C213 -ENCODING 49683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -0E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR C214 -ENCODING 49684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -18 -34 -43 -24 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR C215 -ENCODING 49685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR C216 -ENCODING 49686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 0 -BITMAP -18 -34 -43 -24 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR C217 -ENCODING 49687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -1200 -FFC0 -1E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR C218 -ENCODING 49688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -0C00 -0E00 -3300 -4080 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR C219 -ENCODING 49689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C21A -ENCODING 49690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C21B -ENCODING 49691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C21C -ENCODING 49692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR C21D -ENCODING 49693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C21E -ENCODING 49694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR C21F -ENCODING 49695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -0400 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C220 -ENCODING 49696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1E00 -6180 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C221 -ENCODING 49697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -08 -7F -71 -41 -71 -ENDCHAR -STARTCHAR C222 -ENCODING 49698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -08 -7F -79 -89 -76 -ENDCHAR -STARTCHAR C223 -ENCODING 49699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR C224 -ENCODING 49700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR C225 -ENCODING 49701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR C226 -ENCODING 49702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR C227 -ENCODING 49703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR C228 -ENCODING 49704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C229 -ENCODING 49705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -0400 -2480 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C22A -ENCODING 49706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C22B -ENCODING 49707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6180 -0000 -FFC0 -0400 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR C22C -ENCODING 49708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR C22D -ENCODING 49709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6180 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C22E -ENCODING 49710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -08 -18 -34 -C3 -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR C22F -ENCODING 49711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1E00 -6180 -0000 -FFC0 -0400 -1E00 -0000 -3F00 -0E00 -7180 -ENDCHAR -STARTCHAR C230 -ENCODING 49712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR C231 -ENCODING 49713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1E00 -6180 -0000 -FFC0 -0400 -3F80 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C232 -ENCODING 49714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6180 -0000 -FFC0 -0400 -3F80 -1200 -1200 -7F80 -ENDCHAR -STARTCHAR C233 -ENCODING 49715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -F7 -08 -3C -66 -18 -26 -3C -ENDCHAR -STARTCHAR C234 -ENCODING 49716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1080 -2880 -4680 -0080 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR C235 -ENCODING 49717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -DD -27 -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR C236 -ENCODING 49718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -DD -27 -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C237 -ENCODING 49719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -DD -27 -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C238 -ENCODING 49720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -11 -31 -49 -81 -FD -27 -21 -40 -7E -ENDCHAR -STARTCHAR C239 -ENCODING 49721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -DD -27 -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C23A -ENCODING 49722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -46 -4F -49 -36 -ENDCHAR -STARTCHAR C23B -ENCODING 49723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -DD -27 -21 -3F -40 -7E -ENDCHAR -STARTCHAR C23C -ENCODING 49724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -7F -3F -40 -3F -ENDCHAR -STARTCHAR C23D -ENCODING 49725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -77 -31 -41 -71 -ENDCHAR -STARTCHAR C23E -ENCODING 49726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -77 -79 -49 -77 -ENDCHAR -STARTCHAR C23F -ENCODING 49727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -75 -77 -45 -77 -ENDCHAR -STARTCHAR C240 -ENCODING 49728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -52 -72 -85 -68 -ENDCHAR -STARTCHAR C241 -ENCODING 49729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -77 -77 -44 -77 -ENDCHAR -STARTCHAR C242 -ENCODING 49730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C243 -ENCODING 49731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -76 -37 -49 -76 -ENDCHAR -STARTCHAR C244 -ENCODING 49732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -DD -27 -21 -7F -41 -7F -ENDCHAR -STARTCHAR C245 -ENCODING 49733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -DD -27 -21 -41 -7F -7F -ENDCHAR -STARTCHAR C246 -ENCODING 49734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -DD -27 -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR C247 -ENCODING 49735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -DD -27 -21 -08 -14 -63 -ENDCHAR -STARTCHAR C248 -ENCODING 49736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -3700 -4900 -8D00 -0100 -FD00 -2100 -2200 -2200 -5500 -C880 -ENDCHAR -STARTCHAR C249 -ENCODING 49737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -DD -27 -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C24A -ENCODING 49738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -3100 -CD00 -DD00 -2700 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C24B -ENCODING 49739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -3900 -C500 -DD00 -2300 -2D00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR C24C -ENCODING 49740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -DD -27 -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C24D -ENCODING 49741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -27 -21 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C24E -ENCODING 49742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -DD -27 -21 -3F -12 -3F -ENDCHAR -STARTCHAR C24F -ENCODING 49743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -DD -23 -2D -33 -0C -32 -1E -ENDCHAR -STARTCHAR C250 -ENCODING 49744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -3280 -3A80 -4A80 -0280 -FE80 -1280 -1E80 -1280 -1280 -0280 -ENDCHAR -STARTCHAR C251 -ENCODING 49745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -1680 -2A80 -4A80 -0280 -FE80 -1280 -1000 -3F80 -0080 -0080 -ENDCHAR -STARTCHAR C252 -ENCODING 49746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -95 -1D -E5 -29 -32 -09 -09 -09 -ENDCHAR -STARTCHAR C253 -ENCODING 49747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6500 -9500 -1D00 -E500 -2900 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C254 -ENCODING 49748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -1280 -2A80 -4A80 -0280 -FE80 -1280 -1680 -2280 -2000 -3F80 -ENDCHAR -STARTCHAR C255 -ENCODING 49749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6500 -9500 -1D00 -E500 -2900 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C256 -ENCODING 49750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1100 -2280 -2100 -2280 -1900 -ENDCHAR -STARTCHAR C257 -ENCODING 49751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -65 -95 -1D -E5 -29 -3F -40 -7F -ENDCHAR -STARTCHAR C258 -ENCODING 49752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -3680 -4A80 -0280 -FE80 -1000 -3F80 -0080 -3F80 -2000 -3F80 -ENDCHAR -STARTCHAR C259 -ENCODING 49753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1000 -3F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR C25A -ENCODING 49754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1000 -3B80 -1E80 -2280 -1B80 -ENDCHAR -STARTCHAR C25B -ENCODING 49755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1000 -3A80 -1B80 -2280 -1B80 -ENDCHAR -STARTCHAR C25C -ENCODING 49756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1000 -2900 -3900 -2280 -3840 -ENDCHAR -STARTCHAR C25D -ENCODING 49757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1000 -3B80 -1B80 -2200 -1B80 -ENDCHAR -STARTCHAR C25E -ENCODING 49758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C25F -ENCODING 49759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1000 -3900 -1B80 -2280 -3900 -ENDCHAR -STARTCHAR C260 -ENCODING 49760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -1680 -2A80 -4A80 -0280 -FE80 -1000 -3F80 -2080 -2080 -3F80 -ENDCHAR -STARTCHAR C261 -ENCODING 49761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -65 -95 -1D -E5 -29 -41 -7F -7F -ENDCHAR -STARTCHAR C262 -ENCODING 49762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -95 -1D -E5 -29 -42 -72 -55 -70 -ENDCHAR -STARTCHAR C263 -ENCODING 49763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -95 -1D -E5 -29 -08 -0C -32 -41 -ENDCHAR -STARTCHAR C264 -ENCODING 49764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -95 -1D -E5 -29 -02 -22 -55 -08 -ENDCHAR -STARTCHAR C265 -ENCODING 49765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1280 -1680 -2A80 -4A80 -0280 -FE80 -1000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C266 -ENCODING 49766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2500 -6500 -9500 -1D00 -E500 -2900 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C267 -ENCODING 49767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR C268 -ENCODING 49768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -25 -65 -95 -1D -E5 -29 -3F -01 -3F -01 -ENDCHAR -STARTCHAR C269 -ENCODING 49769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C26A -ENCODING 49770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -25 -65 -95 -1D -E5 -29 -3F -12 -3F -ENDCHAR -STARTCHAR C26B -ENCODING 49771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -1280 -2A80 -4280 -FE80 -1680 -1E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR C26C -ENCODING 49772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0880 -1080 -1880 -2480 -4280 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR C26D -ENCODING 49773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -31 -79 -8D -01 -FD -21 -20 -7F -01 -01 -ENDCHAR -STARTCHAR C26E -ENCODING 49774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C26F -ENCODING 49775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C270 -ENCODING 49776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -31 -59 -85 -01 -FD -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR C271 -ENCODING 49777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C272 -ENCODING 49778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR C273 -ENCODING 49779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR C274 -ENCODING 49780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -31 -CD -01 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR C275 -ENCODING 49781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR C276 -ENCODING 49782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR C277 -ENCODING 49783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR C278 -ENCODING 49784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR C279 -ENCODING 49785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR C27A -ENCODING 49786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C27B -ENCODING 49787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR C27C -ENCODING 49788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -31 -49 -85 -01 -FD -21 -20 -7F -41 -7F -ENDCHAR -STARTCHAR C27D -ENCODING 49789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -31 -CD -01 -FD -21 -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR C27E -ENCODING 49790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR C27F -ENCODING 49791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -1100 -3100 -7900 -8500 -0100 -FD00 -2100 -2800 -0C00 -3200 -4180 -ENDCHAR -STARTCHAR C280 -ENCODING 49792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C281 -ENCODING 49793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -11 -31 -49 -85 -01 -FD -21 -3E -41 -41 -3E -ENDCHAR -STARTCHAR C282 -ENCODING 49794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -3100 -CD00 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C283 -ENCODING 49795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -3900 -C500 -1D00 -E100 -2C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR C284 -ENCODING 49796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C285 -ENCODING 49797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C286 -ENCODING 49798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR C287 -ENCODING 49799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -39 -C5 -1D -E1 -2C -33 -0C -32 -1E -ENDCHAR -STARTCHAR C288 -ENCODING 49800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -0C00 -0A00 -3300 -4080 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR C289 -ENCODING 49801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -1200 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C28A -ENCODING 49802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C28B -ENCODING 49803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C28C -ENCODING 49804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -0400 -0A00 -3180 -0000 -FFC0 -1200 -3200 -2000 -3F00 -ENDCHAR -STARTCHAR C28D -ENCODING 49805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C28E -ENCODING 49806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR C28F -ENCODING 49807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C290 -ENCODING 49808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1E00 -6180 -0000 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C291 -ENCODING 49809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR C292 -ENCODING 49810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR C293 -ENCODING 49811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR C294 -ENCODING 49812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR C295 -ENCODING 49813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR C296 -ENCODING 49814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR C297 -ENCODING 49815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR C298 -ENCODING 49816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -1200 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C299 -ENCODING 49817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR C29A -ENCODING 49818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C29B -ENCODING 49819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6180 -0000 -FFC0 -1100 -1500 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR C29C -ENCODING 49820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR C29D -ENCODING 49821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -1200 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C29E -ENCODING 49822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C29F -ENCODING 49823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR C2A0 -ENCODING 49824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR C2A1 -ENCODING 49825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -18 -26 -C1 -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR C2A2 -ENCODING 49826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0400 -0C00 -1A00 -6180 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C2A3 -ENCODING 49827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -26 -C1 -00 -FF -3E -66 -18 -26 -3C -ENDCHAR -STARTCHAR C2A4 -ENCODING 49828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -0400 -0C00 -0C00 -1200 -3100 -4080 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR C2A5 -ENCODING 49829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C2A6 -ENCODING 49830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0C00 -1A00 -2180 -0000 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C2A7 -ENCODING 49831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0C00 -1A00 -2180 -0000 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C2A8 -ENCODING 49832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C2A9 -ENCODING 49833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0C00 -1A00 -2180 -0000 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C2AA -ENCODING 49834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -24 -C3 -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C2AB -ENCODING 49835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -0C00 -1A00 -2180 -0000 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C2AC -ENCODING 49836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1A00 -6180 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C2AD -ENCODING 49837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -1A00 -6180 -0000 -FFC0 -0000 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C2AE -ENCODING 49838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -24 -C3 -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR C2AF -ENCODING 49839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -24 -C3 -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR C2B0 -ENCODING 49840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -24 -C3 -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C2B1 -ENCODING 49841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -24 -C3 -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR C2B2 -ENCODING 49842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -24 -C3 -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR C2B3 -ENCODING 49843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -24 -C3 -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR C2B4 -ENCODING 49844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C2B5 -ENCODING 49845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6180 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C2B6 -ENCODING 49846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0C00 -1A00 -2180 -0000 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C2B7 -ENCODING 49847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1200 -6180 -0000 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR C2B8 -ENCODING 49848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0C00 -1A00 -2180 -0000 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR C2B9 -ENCODING 49849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0400 -0C00 -1300 -6180 -0000 -FFC0 -0000 -1F00 -2100 -2100 -1F00 -ENDCHAR -STARTCHAR C2BA -ENCODING 49850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -0C00 -1A00 -2180 -0000 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C2BB -ENCODING 49851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -24 -C3 -00 -FF -1C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR C2BC -ENCODING 49852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -0C00 -1A00 -2180 -0000 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR C2BD -ENCODING 49853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -18 -24 -C3 -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR C2BE -ENCODING 49854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -0C00 -1A00 -2180 -0000 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C2BF -ENCODING 49855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -08 -18 -24 -C3 -00 -FF -3C -7F -1C -22 -3C -ENDCHAR -STARTCHAR C2C0 -ENCODING 49856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -31 -49 -81 -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR C2C1 -ENCODING 49857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FF -01 -3E -01 -01 -01 -ENDCHAR -STARTCHAR C2C2 -ENCODING 49858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FF -01 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C2C3 -ENCODING 49859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FF -01 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C2C4 -ENCODING 49860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -49 -81 -05 -F9 -01 -40 -7E -ENDCHAR -STARTCHAR C2C5 -ENCODING 49861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FF -01 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C2C6 -ENCODING 49862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C2C7 -ENCODING 49863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -01 -FF -01 -3F -40 -7E -ENDCHAR -STARTCHAR C2C8 -ENCODING 49864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -3F00 -0080 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR C2C9 -ENCODING 49865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -0000 -1B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C2CA -ENCODING 49866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -0000 -3F80 -3C80 -2480 -3B00 -ENDCHAR -STARTCHAR C2CB -ENCODING 49867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -3000 -0A80 -3B80 -2280 -3B80 -ENDCHAR -STARTCHAR C2CC -ENCODING 49868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C2CD -ENCODING 49869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -3100 -0A00 -3B80 -2200 -3B80 -ENDCHAR -STARTCHAR C2CE -ENCODING 49870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR C2CF -ENCODING 49871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -3380 -0F80 -3B00 -2480 -3B00 -ENDCHAR -STARTCHAR C2D0 -ENCODING 49872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -01 -FF -01 -7F -41 -7F -ENDCHAR -STARTCHAR C2D1 -ENCODING 49873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -01 -FF -01 -41 -7F -7F -ENDCHAR -STARTCHAR C2D2 -ENCODING 49874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FF -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR C2D3 -ENCODING 49875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -01 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR C2D4 -ENCODING 49876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FF -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C2D5 -ENCODING 49877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C2D6 -ENCODING 49878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -3100 -CD00 -0100 -FF00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C2D7 -ENCODING 49879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -0600 -0000 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR C2D8 -ENCODING 49880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -31 -CD -01 -FF -01 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C2D9 -ENCODING 49881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -0F00 -1000 -1F80 -1000 -1F80 -ENDCHAR -STARTCHAR C2DA -ENCODING 49882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -31 -CD -01 -FF -01 -3F -12 -3F -ENDCHAR -STARTCHAR C2DB -ENCODING 49883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -1080 -3880 -4480 -0080 -FE80 -0600 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR C2DC -ENCODING 49884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -21 -21 -51 -C9 -89 -01 -01 -01 -ENDCHAR -STARTCHAR C2DD -ENCODING 49885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -51 -D9 -89 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C2DE -ENCODING 49886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -21 -51 -89 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C2DF -ENCODING 49887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2100 -2100 -5100 -8900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C2E0 -ENCODING 49888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -51 -D9 -89 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR C2E1 -ENCODING 49889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -21 -51 -89 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C2E2 -ENCODING 49890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -51 -89 -01 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C2E3 -ENCODING 49891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -51 -D9 -89 -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR C2E4 -ENCODING 49892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -D1 -89 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C2E5 -ENCODING 49893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -51 -89 -01 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR C2E6 -ENCODING 49894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -51 -89 -01 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C2E7 -ENCODING 49895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -51 -89 -01 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C2E8 -ENCODING 49896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -51 -89 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C2E9 -ENCODING 49897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -51 -89 -01 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C2EA -ENCODING 49898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -51 -89 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C2EB -ENCODING 49899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -2100 -5100 -D100 -8900 -0000 -7700 -1000 -7F80 -4500 -7F00 -ENDCHAR -STARTCHAR C2EC -ENCODING 49900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -51 -D9 -89 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C2ED -ENCODING 49901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -51 -D9 -89 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C2EE -ENCODING 49902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2100 -2100 -5100 -8900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C2EF -ENCODING 49903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -51 -D9 -89 -01 -08 -14 -36 -41 -ENDCHAR -STARTCHAR C2F0 -ENCODING 49904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2100 -2100 -5100 -8900 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C2F1 -ENCODING 49905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -51 -D9 -89 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR C2F2 -ENCODING 49906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2100 -2100 -5100 -8900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR C2F3 -ENCODING 49907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -2100 -2100 -5100 -8900 -0100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C2F4 -ENCODING 49908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -21 -51 -89 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C2F5 -ENCODING 49909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -51 -89 -01 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR C2F6 -ENCODING 49910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -21 -21 -51 -D9 -89 -00 -7F -12 -12 -7F -ENDCHAR -STARTCHAR C2F7 -ENCODING 49911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -21 -51 -89 -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C2F8 -ENCODING 49912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -2880 -2880 -5CC0 -5280 -9280 -1080 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C2F9 -ENCODING 49913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -2C80 -5CC0 -9280 -1080 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C2FA -ENCODING 49914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4900 -4900 -D980 -B500 -2100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C2FB -ENCODING 49915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -2C80 -5CC0 -9280 -1080 -0000 -3900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C2FC -ENCODING 49916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -2880 -5CC0 -9280 -1080 -0080 -2080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C2FD -ENCODING 49917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4900 -D980 -B500 -2100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C2FE -ENCODING 49918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C2FF -ENCODING 49919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -4900 -4900 -D980 -B500 -2100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR C300 -ENCODING 49920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2880 -5CC0 -9A80 -1080 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C301 -ENCODING 49921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C302 -ENCODING 49922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -3B00 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C303 -ENCODING 49923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -3400 -0C80 -3F80 -4480 -3F00 -ENDCHAR -STARTCHAR C304 -ENCODING 49924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -3900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C305 -ENCODING 49925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C306 -ENCODING 49926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR C307 -ENCODING 49927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -3B00 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR C308 -ENCODING 49928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -2C80 -5CC0 -9280 -1080 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C309 -ENCODING 49929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -2880 -5CC0 -9280 -1080 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C30A -ENCODING 49930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4900 -D980 -B500 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C30B -ENCODING 49931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -4900 -4900 -D980 -B500 -2100 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR C30C -ENCODING 49932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -2C80 -5EC0 -9280 -1080 -0000 -1100 -1100 -2A80 -4440 -ENDCHAR -STARTCHAR C30D -ENCODING 49933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -2C80 -5EC0 -9280 -1080 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C30E -ENCODING 49934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4900 -D980 -B500 -2100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR C30F -ENCODING 49935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR C310 -ENCODING 49936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4900 -4900 -D980 -B500 -2100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR C311 -ENCODING 49937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -2880 -5CC0 -9280 -0000 -3F80 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR C312 -ENCODING 49938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -4900 -4900 -D980 -B500 -2100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR C313 -ENCODING 49939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -5CC0 -9A80 -1080 -0080 -0E00 -0000 -3F80 -1100 -0E00 -ENDCHAR -STARTCHAR C314 -ENCODING 49940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2980 -2980 -2980 -2980 -6980 -5580 -9580 -2180 -0180 -0180 -0180 -ENDCHAR -STARTCHAR C315 -ENCODING 49941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2980 -2980 -2980 -5580 -9580 -2180 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C316 -ENCODING 49942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -55 -D3 -AD -45 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C317 -ENCODING 49943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -5500 -D300 -AD00 -4500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C318 -ENCODING 49944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2980 -2980 -2980 -5980 -9580 -2180 -0180 -1180 -1000 -1000 -1FC0 -ENDCHAR -STARTCHAR C319 -ENCODING 49945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -5500 -D300 -AD00 -4500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C31A -ENCODING 49946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR C31B -ENCODING 49947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -55 -55 -D3 -AD -45 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C31C -ENCODING 49948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2980 -2980 -7980 -9580 -2180 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C31D -ENCODING 49949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR C31E -ENCODING 49950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR C31F -ENCODING 49951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C320 -ENCODING 49952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C321 -ENCODING 49953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C322 -ENCODING 49954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C323 -ENCODING 49955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR C324 -ENCODING 49956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2980 -2980 -2980 -5980 -9580 -2180 -0000 -1F80 -2080 -2080 -1F80 -ENDCHAR -STARTCHAR C325 -ENCODING 49957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2980 -2980 -2980 -6980 -9580 -2180 -0000 -1080 -1F80 -1080 -1F80 -ENDCHAR -STARTCHAR C326 -ENCODING 49958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -5500 -D300 -AD00 -4500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C327 -ENCODING 49959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -55 -55 -D3 -AD -45 -01 -08 -14 -63 -ENDCHAR -STARTCHAR C328 -ENCODING 49960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2980 -2980 -2980 -6980 -9580 -2180 -0000 -0900 -1900 -1A80 -2640 -ENDCHAR -STARTCHAR C329 -ENCODING 49961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2980 -2980 -2980 -5580 -9580 -2180 -0000 -1F00 -1080 -1080 -1F00 -ENDCHAR -STARTCHAR C32A -ENCODING 49962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -5500 -D300 -AD00 -4500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C32B -ENCODING 49963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR C32C -ENCODING 49964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -55 -D3 -AD -45 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C32D -ENCODING 49965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C32E -ENCODING 49966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -55 -55 -D3 -AD -45 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C32F -ENCODING 49967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -6980 -9680 -2080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR C330 -ENCODING 49968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4900 -4900 -5180 -5100 -B900 -A580 -2100 -0100 -0100 -ENDCHAR -STARTCHAR C331 -ENCODING 49969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR C332 -ENCODING 49970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C333 -ENCODING 49971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR C334 -ENCODING 49972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -2480 -24C0 -2880 -5C80 -92C0 -0080 -2000 -2000 -3F00 -ENDCHAR -STARTCHAR C335 -ENCODING 49973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4980 -D900 -B580 -2100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C336 -ENCODING 49974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C337 -ENCODING 49975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR C338 -ENCODING 49976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -3F00 -0080 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR C339 -ENCODING 49977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C33A -ENCODING 49978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -3B00 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C33B -ENCODING 49979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -3400 -0C80 -3F80 -4480 -3F00 -ENDCHAR -STARTCHAR C33C -ENCODING 49980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -3900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C33D -ENCODING 49981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C33E -ENCODING 49982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR C33F -ENCODING 49983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -3B00 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR C340 -ENCODING 49984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR C341 -ENCODING 49985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR C342 -ENCODING 49986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C343 -ENCODING 49987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR C344 -ENCODING 49988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR C345 -ENCODING 49989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -28C0 -5C80 -92C0 -1080 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C346 -ENCODING 49990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR C347 -ENCODING 49991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR C348 -ENCODING 49992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR C349 -ENCODING 49993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -3F80 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR C34A -ENCODING 49994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -4900 -4980 -D900 -B580 -2100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR C34B -ENCODING 49995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -28C0 -5C80 -92C0 -0000 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR C34C -ENCODING 49996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2A80 -2B80 -2A80 -6A80 -9580 -2280 -0280 -0280 -0080 -ENDCHAR -STARTCHAR C34D -ENCODING 49997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -53 -D5 -AB -45 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C34E -ENCODING 49998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -53 -D5 -AB -45 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C34F -ENCODING 49999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -5300 -D500 -AB00 -4500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C350 -ENCODING 50000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -2B80 -2A80 -5A80 -9780 -0280 -0080 -1000 -1F80 -ENDCHAR -STARTCHAR C351 -ENCODING 50001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -5300 -D500 -AB00 -4500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C352 -ENCODING 50002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR C353 -ENCODING 50003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -55 -53 -D5 -AB -45 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C354 -ENCODING 50004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C355 -ENCODING 50005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR C356 -ENCODING 50006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR C357 -ENCODING 50007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C358 -ENCODING 50008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C359 -ENCODING 50009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C35A -ENCODING 50010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C35B -ENCODING 50011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR C35C -ENCODING 50012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -55 -53 -D5 -AB -45 -00 -3F -41 -7F -ENDCHAR -STARTCHAR C35D -ENCODING 50013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -55 -53 -D5 -AB -45 -00 -21 -3F -3F -ENDCHAR -STARTCHAR C35E -ENCODING 50014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -5300 -D500 -AB00 -4500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C35F -ENCODING 50015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -55 -53 -D5 -AB -45 -01 -08 -14 -63 -ENDCHAR -STARTCHAR C360 -ENCODING 50016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -5300 -D500 -AB00 -4500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C361 -ENCODING 50017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -53 -D5 -AB -45 -0D -33 -41 -21 -1E -ENDCHAR -STARTCHAR C362 -ENCODING 50018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -5300 -D500 -AB00 -4500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C363 -ENCODING 50019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR C364 -ENCODING 50020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -53 -D5 -AB -45 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C365 -ENCODING 50021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C366 -ENCODING 50022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -55 -53 -D5 -AB -45 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C367 -ENCODING 50023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -2980 -6A80 -9580 -2080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR C368 -ENCODING 50024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2480 -2B80 -5C80 -5A80 -9280 -1080 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C369 -ENCODING 50025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2F80 -5E80 -9280 -1080 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C36A -ENCODING 50026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -4F -D9 -B5 -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C36B -ENCODING 50027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4F00 -D900 -B500 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C36C -ENCODING 50028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2F80 -5C80 -9280 -1080 -0080 -2080 -2000 -2000 -1F80 -ENDCHAR -STARTCHAR C36D -ENCODING 50029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -4F -D9 -B5 -21 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C36E -ENCODING 50030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -0380 -2780 -2380 -2480 -1B00 -ENDCHAR -STARTCHAR C36F -ENCODING 50031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -4F -D9 -B5 -21 -00 -7E -40 -7E -ENDCHAR -STARTCHAR C370 -ENCODING 50032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2780 -5C80 -9A80 -1080 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C371 -ENCODING 50033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -3B80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C372 -ENCODING 50034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2780 -5C80 -DA80 -1080 -0000 -3B80 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C373 -ENCODING 50035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -3880 -0A80 -3B80 -2280 -3B80 -ENDCHAR -STARTCHAR C374 -ENCODING 50036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C375 -ENCODING 50037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -3B80 -0A00 -3B80 -2200 -3B80 -ENDCHAR -STARTCHAR C376 -ENCODING 50038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C377 -ENCODING 50039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -3B80 -0F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR C378 -ENCODING 50040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2780 -5E80 -9280 -1080 -0000 -1F80 -2080 -2080 -1F80 -ENDCHAR -STARTCHAR C379 -ENCODING 50041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2780 -5E80 -9280 -1080 -0000 -2080 -1F80 -2080 -1F80 -ENDCHAR -STARTCHAR C37A -ENCODING 50042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4F00 -D900 -B500 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C37B -ENCODING 50043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -4F -D9 -B5 -21 -00 -08 -14 -63 -ENDCHAR -STARTCHAR C37C -ENCODING 50044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -2780 -5E80 -9280 -1080 -0000 -0900 -1900 -1A80 -2640 -ENDCHAR -STARTCHAR C37D -ENCODING 50045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2780 -5C80 -9280 -1080 -0000 -0F00 -1080 -1080 -0F00 -ENDCHAR -STARTCHAR C37E -ENCODING 50046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4F00 -D900 -B500 -2100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR C37F -ENCODING 50047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -0E00 -1E00 -0100 -0F00 -30C0 -ENDCHAR -STARTCHAR C380 -ENCODING 50048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -4F -D9 -B5 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C381 -ENCODING 50049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -1F80 -1000 -1F80 -1000 -1F80 -ENDCHAR -STARTCHAR C382 -ENCODING 50050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -4F -D9 -B5 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C383 -ENCODING 50051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2780 -5C80 -9280 -0080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR C384 -ENCODING 50052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2980 -2980 -2980 -2F80 -6980 -5580 -9580 -2180 -0180 -0180 -0180 -ENDCHAR -STARTCHAR C385 -ENCODING 50053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -53 -57 -D3 -AB -43 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C386 -ENCODING 50054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -53 -57 -D3 -AB -43 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C387 -ENCODING 50055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5700 -D300 -AB00 -4300 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C388 -ENCODING 50056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2980 -2980 -2F80 -7980 -9580 -2180 -0180 -1180 -1000 -1000 -1FC0 -ENDCHAR -STARTCHAR C389 -ENCODING 50057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5700 -D300 -AB00 -4300 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C38A -ENCODING 50058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR C38B -ENCODING 50059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -57 -D3 -AB -43 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C38C -ENCODING 50060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2980 -2F80 -6980 -9580 -2180 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C38D -ENCODING 50061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR C38E -ENCODING 50062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR C38F -ENCODING 50063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C390 -ENCODING 50064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C391 -ENCODING 50065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C392 -ENCODING 50066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C393 -ENCODING 50067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR C394 -ENCODING 50068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -57 -D3 -AB -43 -00 -3F -41 -7F -ENDCHAR -STARTCHAR C395 -ENCODING 50069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -57 -D3 -AB -43 -00 -21 -3F -3F -ENDCHAR -STARTCHAR C396 -ENCODING 50070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5700 -D300 -AB00 -4300 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C397 -ENCODING 50071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -53 -D7 -AB -43 -00 -08 -14 -63 -ENDCHAR -STARTCHAR C398 -ENCODING 50072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5700 -D300 -AB00 -4300 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C399 -ENCODING 50073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -53 -53 -D7 -AB -43 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR C39A -ENCODING 50074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5700 -D300 -AB00 -4300 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C39B -ENCODING 50075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR C39C -ENCODING 50076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -53 -57 -D3 -AB -43 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C39D -ENCODING 50077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C39E -ENCODING 50078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -57 -D3 -AB -43 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C39F -ENCODING 50079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2A80 -6980 -9580 -2080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR C3A0 -ENCODING 50080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -4B -49 -51 -BF -A5 -21 -01 -01 -01 -ENDCHAR -STARTCHAR C3A1 -ENCODING 50081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -4B -DB -B5 -21 -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR C3A2 -ENCODING 50082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -4B -DB -B5 -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C3A3 -ENCODING 50083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4B00 -DB00 -B500 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C3A4 -ENCODING 50084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -4B -5B -B9 -25 -01 -00 -20 -3F -ENDCHAR -STARTCHAR C3A5 -ENCODING 50085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -4B -DB -B5 -21 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C3A6 -ENCODING 50086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -0380 -2780 -2380 -2480 -1B00 -ENDCHAR -STARTCHAR C3A7 -ENCODING 50087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -4B -DB -B5 -21 -00 -7E -40 -7E -ENDCHAR -STARTCHAR C3A8 -ENCODING 50088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C3A9 -ENCODING 50089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -3B80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C3AA -ENCODING 50090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -3B80 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C3AB -ENCODING 50091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -3880 -0A80 -3B80 -2280 -3B80 -ENDCHAR -STARTCHAR C3AC -ENCODING 50092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C3AD -ENCODING 50093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -3B80 -0A00 -3B80 -2200 -3B80 -ENDCHAR -STARTCHAR C3AE -ENCODING 50094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C3AF -ENCODING 50095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -3B80 -0F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR C3B0 -ENCODING 50096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -4B -DB -B5 -21 -00 -7F -41 -7F -ENDCHAR -STARTCHAR C3B1 -ENCODING 50097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -4B -DB -B5 -21 -01 -41 -7F -7F -ENDCHAR -STARTCHAR C3B2 -ENCODING 50098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4B00 -DB00 -B500 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C3B3 -ENCODING 50099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -4B -DB -B5 -21 -00 -08 -14 -63 -ENDCHAR -STARTCHAR C3B4 -ENCODING 50100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4B00 -DB00 -B500 -2100 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C3B5 -ENCODING 50101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -4B -DB -B5 -21 -0C -32 -41 -23 -1C -ENDCHAR -STARTCHAR C3B6 -ENCODING 50102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4B00 -DB00 -B500 -2100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR C3B7 -ENCODING 50103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -0E00 -1E00 -0100 -0F00 -30C0 -ENDCHAR -STARTCHAR C3B8 -ENCODING 50104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -4B -DB -B5 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C3B9 -ENCODING 50105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -1F80 -1000 -1F80 -1000 -1F80 -ENDCHAR -STARTCHAR C3BA -ENCODING 50106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -4B -DB -B5 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C3BB -ENCODING 50107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2580 -2480 -5F80 -9280 -0080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR C3BC -ENCODING 50108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2980 -2A80 -2980 -6A80 -9580 -2180 -0180 -0180 -0080 -ENDCHAR -STARTCHAR C3BD -ENCODING 50109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -53 -5D -DD -AB -43 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C3BE -ENCODING 50110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -53 -5D -DD -AB -43 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C3BF -ENCODING 50111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5D00 -DD00 -AB00 -4300 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C3C0 -ENCODING 50112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2980 -2B80 -2980 -6B80 -5580 -9580 -2180 -0180 -1000 -1000 -1FC0 -ENDCHAR -STARTCHAR C3C1 -ENCODING 50113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5D00 -DD00 -AB00 -4300 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C3C2 -ENCODING 50114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR C3C3 -ENCODING 50115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -5D -DD -AB -43 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C3C4 -ENCODING 50116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C3C5 -ENCODING 50117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR C3C6 -ENCODING 50118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR C3C7 -ENCODING 50119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C3C8 -ENCODING 50120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C3C9 -ENCODING 50121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C3CA -ENCODING 50122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C3CB -ENCODING 50123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR C3CC -ENCODING 50124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -5D -DD -AB -43 -00 -3F -41 -7F -ENDCHAR -STARTCHAR C3CD -ENCODING 50125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -5D -DD -AB -43 -00 -21 -3F -3F -ENDCHAR -STARTCHAR C3CE -ENCODING 50126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5D00 -DD00 -AB00 -4300 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C3CF -ENCODING 50127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -5D -D7 -AB -43 -01 -08 -14 -63 -ENDCHAR -STARTCHAR C3D0 -ENCODING 50128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5D00 -DD00 -AB00 -4300 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C3D1 -ENCODING 50129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -53 -5D -D7 -AB -43 -0D -33 -41 -21 -1E -ENDCHAR -STARTCHAR C3D2 -ENCODING 50130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5300 -5D00 -DD00 -AB00 -4300 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C3D3 -ENCODING 50131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR C3D4 -ENCODING 50132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -53 -5D -DD -AB -43 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C3D5 -ENCODING 50133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C3D6 -ENCODING 50134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -53 -5D -DD -AB -43 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C3D7 -ENCODING 50135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2980 -2B80 -6A80 -9580 -2080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR C3D8 -ENCODING 50136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1100 -1200 -1300 -2B00 -6480 -4840 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR C3D9 -ENCODING 50137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D00 -4880 -0400 -0400 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR C3DA -ENCODING 50138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -08 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR C3DB -ENCODING 50139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -2400 -5600 -9900 -0800 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR C3DC -ENCODING 50140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -48C0 -0400 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C3DD -ENCODING 50141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C3DE -ENCODING 50142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C3DF -ENCODING 50143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D80 -4880 -0400 -FFC0 -0000 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C3E0 -ENCODING 50144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -3300 -4C80 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C3E1 -ENCODING 50145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C3E2 -ENCODING 50146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -2B00 -4C80 -0400 -FFC0 -0000 -7B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR C3E3 -ENCODING 50147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR C3E4 -ENCODING 50148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C3E5 -ENCODING 50149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C3E6 -ENCODING 50150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR C3E7 -ENCODING 50151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR C3E8 -ENCODING 50152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D00 -4880 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C3E9 -ENCODING 50153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D00 -4880 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C3EA -ENCODING 50154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR C3EB -ENCODING 50155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -08 -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR C3EC -ENCODING 50156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR C3ED -ENCODING 50157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D00 -4880 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C3EE -ENCODING 50158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -20 -24 -56 -99 -08 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR C3EF -ENCODING 50159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR C3F0 -ENCODING 50160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -20 -24 -56 -99 -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR C3F1 -ENCODING 50161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR C3F2 -ENCODING 50162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -24 -56 -99 -08 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR C3F3 -ENCODING 50163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -0400 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR C3F4 -ENCODING 50164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2480 -5C80 -8A80 -10C0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C3F5 -ENCODING 50165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2880 -5C80 -92C0 -1080 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C3F6 -ENCODING 50166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C3F7 -ENCODING 50167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR C3F8 -ENCODING 50168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2880 -5C80 -9280 -10C0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C3F9 -ENCODING 50169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C3FA -ENCODING 50170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C3FB -ENCODING 50171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR C3FC -ENCODING 50172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -1F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C3FD -ENCODING 50173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C3FE -ENCODING 50174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C3FF -ENCODING 50175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR C400 -ENCODING 50176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C401 -ENCODING 50177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR C402 -ENCODING 50178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR C403 -ENCODING 50179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR C404 -ENCODING 50180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR C405 -ENCODING 50181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR C406 -ENCODING 50182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR C407 -ENCODING 50183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR C408 -ENCODING 50184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2480 -2880 -5C80 -92C0 -1080 -FE80 -0000 -1100 -1100 -2B80 -4480 -ENDCHAR -STARTCHAR C409 -ENCODING 50185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -3E00 -4100 -4200 -3C00 -ENDCHAR -STARTCHAR C40A -ENCODING 50186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR C40B -ENCODING 50187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR C40C -ENCODING 50188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR C40D -ENCODING 50189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR C40E -ENCODING 50190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -5100 -5900 -A580 -2100 -2D00 -D000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR C40F -ENCODING 50191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2480 -7C80 -12C0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR C410 -ENCODING 50192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2A80 -2A80 -7A80 -9680 -2180 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR C411 -ENCODING 50193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C412 -ENCODING 50194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR C413 -ENCODING 50195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR C414 -ENCODING 50196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -55 -55 -AD -07 -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR C415 -ENCODING 50197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR C416 -ENCODING 50198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C417 -ENCODING 50199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR C418 -ENCODING 50200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR C419 -ENCODING 50201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR C41A -ENCODING 50202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR C41B -ENCODING 50203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C41C -ENCODING 50204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR C41D -ENCODING 50205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C41E -ENCODING 50206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C41F -ENCODING 50207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -D500 -2F00 -2500 -FD00 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR C420 -ENCODING 50208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR C421 -ENCODING 50209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -1080 -1F80 -1F80 -ENDCHAR -STARTCHAR C422 -ENCODING 50210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -2900 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR C423 -ENCODING 50211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR C424 -ENCODING 50212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -2A80 -6A80 -D680 -2180 -1280 -FE80 -0000 -1100 -1100 -3A80 -6440 -ENDCHAR -STARTCHAR C425 -ENCODING 50213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0400 -1B80 -2080 -1180 -0E00 -ENDCHAR -STARTCHAR C426 -ENCODING 50214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR C427 -ENCODING 50215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5500 -D500 -2F00 -2500 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C428 -ENCODING 50216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -1F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR C429 -ENCODING 50217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C42A -ENCODING 50218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9780 -1280 -7E80 -0000 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR C42B -ENCODING 50219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -55 -D5 -2F -25 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C42C -ENCODING 50220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -7680 -4B80 -1080 -0880 -0880 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C42D -ENCODING 50221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C42E -ENCODING 50222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C42F -ENCODING 50223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5100 -5900 -A500 -0100 -3D00 -C100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C430 -ENCODING 50224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -49 -79 -99 -A5 -11 -11 -FF -01 -41 -40 -7F -ENDCHAR -STARTCHAR C431 -ENCODING 50225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C432 -ENCODING 50226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C433 -ENCODING 50227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -3F -40 -7E -ENDCHAR -STARTCHAR C434 -ENCODING 50228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -49 -79 -A5 -11 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR C435 -ENCODING 50229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR C436 -ENCODING 50230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR C437 -ENCODING 50231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C438 -ENCODING 50232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C439 -ENCODING 50233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C43A -ENCODING 50234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR C43B -ENCODING 50235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR C43C -ENCODING 50236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -49 -49 -B9 -A5 -11 -FF -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR C43D -ENCODING 50237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -49 -69 -99 -A5 -11 -FF -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR C43E -ENCODING 50238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -52 -72 -55 -78 -ENDCHAR -STARTCHAR C43F -ENCODING 50239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -08 -14 -63 -ENDCHAR -STARTCHAR C440 -ENCODING 50240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C441 -ENCODING 50241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C442 -ENCODING 50242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -5100 -5900 -A500 -0100 -3D00 -C100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C443 -ENCODING 50243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -F900 -2500 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C444 -ENCODING 50244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -7F -3F -01 -01 -ENDCHAR -STARTCHAR C445 -ENCODING 50245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR C446 -ENCODING 50246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -51 -59 -A5 -01 -3D -C1 -7F -12 -3F -ENDCHAR -STARTCHAR C447 -ENCODING 50247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C448 -ENCODING 50248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1200 -1200 -2B00 -2480 -4840 -0000 -1100 -1100 -FFC0 -ENDCHAR -STARTCHAR C449 -ENCODING 50249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -20 -24 -56 -99 -24 -FF -00 -7E -01 -01 -ENDCHAR -STARTCHAR C44A -ENCODING 50250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -24 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR C44B -ENCODING 50251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -2400 -5600 -9900 -2400 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR C44C -ENCODING 50252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -24 -66 -99 -24 -24 -DB -40 -40 -7E -ENDCHAR -STARTCHAR C44D -ENCODING 50253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -24 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C44E -ENCODING 50254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C44F -ENCODING 50255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -24 -56 -99 -24 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR C450 -ENCODING 50256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -3F00 -0080 -3F00 -3F00 -ENDCHAR -STARTCHAR C451 -ENCODING 50257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C452 -ENCODING 50258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C453 -ENCODING 50259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR C454 -ENCODING 50260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C455 -ENCODING 50261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C456 -ENCODING 50262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR C457 -ENCODING 50263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR C458 -ENCODING 50264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -24 -56 -99 -24 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR C459 -ENCODING 50265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -24 -56 -99 -24 -FF -00 -41 -7E -7F -ENDCHAR -STARTCHAR C45A -ENCODING 50266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -24 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR C45B -ENCODING 50267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -24 -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR C45C -ENCODING 50268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -24 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR C45D -ENCODING 50269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -20 -24 -56 -99 -24 -FF -00 -3E -41 -42 -3C -ENDCHAR -STARTCHAR C45E -ENCODING 50270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -20 -24 -56 -99 -24 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR C45F -ENCODING 50271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR C460 -ENCODING 50272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -20 -24 -56 -99 -24 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR C461 -ENCODING 50273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR C462 -ENCODING 50274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -20 -24 -56 -99 -24 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR C463 -ENCODING 50275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1200 -2D00 -4880 -1200 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR C464 -ENCODING 50276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1200 -1200 -2B00 -2C80 -4840 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR C465 -ENCODING 50277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D80 -48C0 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C466 -ENCODING 50278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C467 -ENCODING 50279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C468 -ENCODING 50280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D80 -48C0 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR C469 -ENCODING 50281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C46A -ENCODING 50282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR C46B -ENCODING 50283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -0400 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C46C -ENCODING 50284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -3300 -4C80 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C46D -ENCODING 50285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -08 -7F -71 -41 -71 -ENDCHAR -STARTCHAR C46E -ENCODING 50286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -08 -7F -79 -89 -76 -ENDCHAR -STARTCHAR C46F -ENCODING 50287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR C470 -ENCODING 50288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR C471 -ENCODING 50289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR C472 -ENCODING 50290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR C473 -ENCODING 50291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR C474 -ENCODING 50292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D80 -48C0 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C475 -ENCODING 50293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D00 -4880 -0000 -FFC0 -0400 -2480 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C476 -ENCODING 50294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C477 -ENCODING 50295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -0400 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR C478 -ENCODING 50296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR C479 -ENCODING 50297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D80 -48C0 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C47A -ENCODING 50298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -2000 -2400 -5600 -8980 -0000 -FF00 -0800 -7E00 -0400 -7F00 -ENDCHAR -STARTCHAR C47B -ENCODING 50299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR C47C -ENCODING 50300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR C47D -ENCODING 50301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -24 -56 -99 -00 -FF -08 -7E -7E -7E -ENDCHAR -STARTCHAR C47E -ENCODING 50302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C47F -ENCODING 50303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR C480 -ENCODING 50304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -5A80 -1080 -0080 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR C481 -ENCODING 50305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR C482 -ENCODING 50306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C483 -ENCODING 50307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C484 -ENCODING 50308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -69 -95 -21 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR C485 -ENCODING 50309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C486 -ENCODING 50310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -46 -4F -49 -36 -ENDCHAR -STARTCHAR C487 -ENCODING 50311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -3F -40 -7E -ENDCHAR -STARTCHAR C488 -ENCODING 50312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -7F -3F -40 -3F -ENDCHAR -STARTCHAR C489 -ENCODING 50313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -77 -31 -41 -71 -ENDCHAR -STARTCHAR C48A -ENCODING 50314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -77 -79 -49 -77 -ENDCHAR -STARTCHAR C48B -ENCODING 50315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -75 -77 -45 -77 -ENDCHAR -STARTCHAR C48C -ENCODING 50316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -52 -72 -85 -68 -ENDCHAR -STARTCHAR C48D -ENCODING 50317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -77 -77 -44 -77 -ENDCHAR -STARTCHAR C48E -ENCODING 50318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C48F -ENCODING 50319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -76 -37 -49 -76 -ENDCHAR -STARTCHAR C490 -ENCODING 50320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -7F -41 -7F -ENDCHAR -STARTCHAR C491 -ENCODING 50321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -41 -7F -7F -ENDCHAR -STARTCHAR C492 -ENCODING 50322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR C493 -ENCODING 50323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -08 -14 -63 -ENDCHAR -STARTCHAR C494 -ENCODING 50324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -4900 -4F00 -B500 -A500 -0100 -FD00 -2000 -2200 -2200 -5500 -8880 -ENDCHAR -STARTCHAR C495 -ENCODING 50325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C496 -ENCODING 50326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -7900 -A500 -DD00 -2700 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C497 -ENCODING 50327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -F900 -2500 -DD00 -2300 -3D00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C498 -ENCODING 50328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C499 -ENCODING 50329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -27 -21 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C49A -ENCODING 50330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -DD -27 -21 -3F -12 -3F -ENDCHAR -STARTCHAR C49B -ENCODING 50331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -DD -23 -3D -23 -1C -22 -1E -ENDCHAR -STARTCHAR C49C -ENCODING 50332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2980 -2980 -6980 -9580 -2180 -0180 -FD80 -1180 -1680 -1180 -0180 -ENDCHAR -STARTCHAR C49D -ENCODING 50333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C49E -ENCODING 50334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR C49F -ENCODING 50335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -3900 -0500 -0680 -0040 -ENDCHAR -STARTCHAR C4A0 -ENCODING 50336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -2A80 -5680 -0280 -FA80 -1680 -0080 -2000 -3F80 -ENDCHAR -STARTCHAR C4A1 -ENCODING 50337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR C4A2 -ENCODING 50338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR C4A3 -ENCODING 50339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR C4A4 -ENCODING 50340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -0F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR C4A5 -ENCODING 50341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -0F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR C4A6 -ENCODING 50342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR C4A7 -ENCODING 50343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -0E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C4A8 -ENCODING 50344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -2900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C4A9 -ENCODING 50345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -0F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C4AA -ENCODING 50346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -2B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C4AB -ENCODING 50347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR C4AC -ENCODING 50348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR C4AD -ENCODING 50349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR C4AE -ENCODING 50350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -2100 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR C4AF -ENCODING 50351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -0400 -0E00 -3180 -ENDCHAR -STARTCHAR C4B0 -ENCODING 50352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -0100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR C4B1 -ENCODING 50353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -1F00 -2080 -3080 -0F00 -ENDCHAR -STARTCHAR C4B2 -ENCODING 50354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR C4B3 -ENCODING 50355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR C4B4 -ENCODING 50356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -1F80 -0080 -1F80 -0080 -ENDCHAR -STARTCHAR C4B5 -ENCODING 50357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C4B6 -ENCODING 50358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2A80 -6A80 -9680 -0E80 -7280 -1480 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR C4B7 -ENCODING 50359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2A80 -6A80 -9680 -FE80 -1680 -1E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR C4B8 -ENCODING 50360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -5C80 -4A80 -1080 -0080 -FE80 -0880 -0880 -0880 -0880 -ENDCHAR -STARTCHAR C4B9 -ENCODING 50361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR C4BA -ENCODING 50362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C4BB -ENCODING 50363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C4BC -ENCODING 50364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -49 -69 -95 -A5 -01 -FF -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR C4BD -ENCODING 50365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C4BE -ENCODING 50366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR C4BF -ENCODING 50367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR C4C0 -ENCODING 50368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -7F -3F -40 -3F -ENDCHAR -STARTCHAR C4C1 -ENCODING 50369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR C4C2 -ENCODING 50370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR C4C3 -ENCODING 50371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR C4C4 -ENCODING 50372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR C4C5 -ENCODING 50373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR C4C6 -ENCODING 50374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C4C7 -ENCODING 50375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR C4C8 -ENCODING 50376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -7F -41 -7F -ENDCHAR -STARTCHAR C4C9 -ENCODING 50377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -41 -7F -7F -ENDCHAR -STARTCHAR C4CA -ENCODING 50378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR C4CB -ENCODING 50379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -08 -14 -63 -ENDCHAR -STARTCHAR C4CC -ENCODING 50380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C4CD -ENCODING 50381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C4CE -ENCODING 50382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -7900 -A500 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C4CF -ENCODING 50383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -F900 -2500 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C4D0 -ENCODING 50384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C4D1 -ENCODING 50385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C4D2 -ENCODING 50386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -79 -A5 -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR C4D3 -ENCODING 50387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C4D4 -ENCODING 50388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1200 -1300 -2C80 -4800 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR C4D5 -ENCODING 50389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR C4D6 -ENCODING 50390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C4D7 -ENCODING 50391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C4D8 -ENCODING 50392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -1200 -3300 -4C80 -0800 -FFC0 -1200 -3200 -2000 -3F00 -ENDCHAR -STARTCHAR C4D9 -ENCODING 50393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C4DA -ENCODING 50394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR C4DB -ENCODING 50395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C4DC -ENCODING 50396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -24 -56 -99 -00 -FF -24 -5B -7E -7E -ENDCHAR -STARTCHAR C4DD -ENCODING 50397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR C4DE -ENCODING 50398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR C4DF -ENCODING 50399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR C4E0 -ENCODING 50400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR C4E1 -ENCODING 50401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR C4E2 -ENCODING 50402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR C4E3 -ENCODING 50403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR C4E4 -ENCODING 50404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR C4E5 -ENCODING 50405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR C4E6 -ENCODING 50406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C4E7 -ENCODING 50407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -1400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR C4E8 -ENCODING 50408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR C4E9 -ENCODING 50409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D80 -48C0 -0000 -FFC0 -1200 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C4EA -ENCODING 50410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C4EB -ENCODING 50411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR C4EC -ENCODING 50412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR C4ED -ENCODING 50413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -24 -56 -99 -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR C4EE -ENCODING 50414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1000 -1200 -2B00 -44C0 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C4EF -ENCODING 50415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -56 -99 -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR C4F0 -ENCODING 50416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1200 -1200 -1300 -2B00 -4480 -4840 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR C4F1 -ENCODING 50417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D80 -48C0 -0000 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C4F2 -ENCODING 50418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C4F3 -ENCODING 50419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C4F4 -ENCODING 50420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2F80 -48C0 -0000 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C4F5 -ENCODING 50421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C4F6 -ENCODING 50422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -5A -91 -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C4F7 -ENCODING 50423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C4F8 -ENCODING 50424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -3300 -4C80 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C4F9 -ENCODING 50425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -5A -91 -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR C4FA -ENCODING 50426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -3300 -4C80 -0000 -FFC0 -0000 -7F80 -0C80 -7C80 -4480 -7F80 -ENDCHAR -STARTCHAR C4FB -ENCODING 50427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -5A -91 -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR C4FC -ENCODING 50428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -5A -91 -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C4FD -ENCODING 50429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -5A -91 -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR C4FE -ENCODING 50430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -5A -91 -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR C4FF -ENCODING 50431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -2B00 -4C80 -0000 -FFC0 -0000 -3B00 -0800 -7F80 -4480 -7B00 -ENDCHAR -STARTCHAR C500 -ENCODING 50432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D80 -48C0 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C501 -ENCODING 50433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1200 -1300 -2D00 -4880 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C502 -ENCODING 50434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C503 -ENCODING 50435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR C504 -ENCODING 50436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR C505 -ENCODING 50437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR C506 -ENCODING 50438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C507 -ENCODING 50439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -5A -91 -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR C508 -ENCODING 50440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR C509 -ENCODING 50441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -24 -24 -5A -91 -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR C50A -ENCODING 50442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1000 -1200 -2B00 -4C80 -0000 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C50B -ENCODING 50443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -24 -24 -5A -91 -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR C50C -ENCODING 50444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -3C80 -5A80 -9280 -1080 -0080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C50D -ENCODING 50445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C50E -ENCODING 50446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -3F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR C50F -ENCODING 50447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR C510 -ENCODING 50448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -3480 -4A80 -5280 -0080 -FF80 -0080 -2080 -2000 -3F80 -ENDCHAR -STARTCHAR C511 -ENCODING 50449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C512 -ENCODING 50450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C513 -ENCODING 50451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -1F80 -2000 -3F00 -ENDCHAR -STARTCHAR C514 -ENCODING 50452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -3480 -5A80 -0080 -FF80 -0000 -3F80 -0080 -3F80 -2000 -3F80 -ENDCHAR -STARTCHAR C515 -ENCODING 50453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR C516 -ENCODING 50454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR C517 -ENCODING 50455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C518 -ENCODING 50456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C519 -ENCODING 50457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C51A -ENCODING 50458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR C51B -ENCODING 50459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR C51C -ENCODING 50460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -3480 -4A80 -5280 -0080 -FF80 -0000 -3F80 -2080 -2080 -3F80 -ENDCHAR -STARTCHAR C51D -ENCODING 50461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR C51E -ENCODING 50462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -2900 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR C51F -ENCODING 50463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR C520 -ENCODING 50464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -1100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR C521 -ENCODING 50465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -1F00 -2080 -3180 -0E00 -ENDCHAR -STARTCHAR C522 -ENCODING 50466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR C523 -ENCODING 50467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -F900 -2500 -1F00 -E100 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C524 -ENCODING 50468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -3F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR C525 -ENCODING 50469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR C526 -ENCODING 50470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -2880 -2C80 -5280 -0080 -FF80 -0080 -3F80 -0900 -1F80 -ENDCHAR -STARTCHAR C527 -ENCODING 50471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -F9 -25 -1F -E1 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C528 -ENCODING 50472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2480 -2880 -5C80 -5A80 -9280 -1080 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C529 -ENCODING 50473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2480 -5C80 -9280 -1080 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C52A -ENCODING 50474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -49 -D9 -B5 -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C52B -ENCODING 50475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4900 -D900 -B500 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C52C -ENCODING 50476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2480 -5C80 -9280 -1080 -0080 -2080 -2000 -2000 -1F80 -ENDCHAR -STARTCHAR C52D -ENCODING 50477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -49 -D9 -B5 -21 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C52E -ENCODING 50478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -0380 -2780 -2380 -2480 -1B00 -ENDCHAR -STARTCHAR C52F -ENCODING 50479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -49 -D9 -B5 -21 -00 -7E -40 -7E -ENDCHAR -STARTCHAR C530 -ENCODING 50480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -5C80 -8A80 -1080 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C531 -ENCODING 50481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -3B80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C532 -ENCODING 50482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -3B80 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C533 -ENCODING 50483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -3880 -0A80 -3B80 -2280 -3B80 -ENDCHAR -STARTCHAR C534 -ENCODING 50484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C535 -ENCODING 50485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -3B80 -0A00 -3B80 -2200 -3B80 -ENDCHAR -STARTCHAR C536 -ENCODING 50486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C537 -ENCODING 50487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -3B80 -0F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR C538 -ENCODING 50488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2480 -5C80 -8A80 -1080 -0000 -1F80 -2080 -2080 -1F80 -ENDCHAR -STARTCHAR C539 -ENCODING 50489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2480 -5E80 -9280 -1080 -0000 -2080 -1F80 -2080 -1F80 -ENDCHAR -STARTCHAR C53A -ENCODING 50490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4900 -D900 -B500 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C53B -ENCODING 50491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2480 -5C80 -4A80 -9280 -1080 -0400 -0600 -1B00 -2080 -ENDCHAR -STARTCHAR C53C -ENCODING 50492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4900 -D900 -B500 -2100 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C53D -ENCODING 50493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -2480 -2480 -2880 -5C80 -9280 -1080 -0000 -0F00 -1080 -1080 -0F00 -ENDCHAR -STARTCHAR C53E -ENCODING 50494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -4900 -4900 -D900 -B500 -2100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR C53F -ENCODING 50495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -0E00 -1E00 -0100 -0F00 -30C0 -ENDCHAR -STARTCHAR C540 -ENCODING 50496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -49 -49 -D9 -B5 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C541 -ENCODING 50497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -1F80 -1000 -1F80 -1000 -1F80 -ENDCHAR -STARTCHAR C542 -ENCODING 50498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -49 -49 -D9 -B5 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C543 -ENCODING 50499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -2480 -2480 -5C80 -9280 -0080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR C544 -ENCODING 50500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8900 -8980 -8900 -8900 -7100 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C545 -ENCODING 50501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8980 -8900 -7100 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C546 -ENCODING 50502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C547 -ENCODING 50503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR C548 -ENCODING 50504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8980 -8900 -7100 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR C549 -ENCODING 50505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8980 -8900 -7100 -0000 -4700 -4100 -4300 -7C80 -ENDCHAR -STARTCHAR C54A -ENCODING 50506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -0600 -4000 -4F00 -4900 -7700 -ENDCHAR -STARTCHAR C54B -ENCODING 50507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR C54C -ENCODING 50508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR C54D -ENCODING 50509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -7F00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR C54E -ENCODING 50510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -7F00 -1900 -7900 -8900 -7F00 -ENDCHAR -STARTCHAR C54F -ENCODING 50511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8900 -8980 -D900 -2000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR C550 -ENCODING 50512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8900 -8980 -D900 -2000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR C551 -ENCODING 50513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8900 -8980 -D900 -2000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR C552 -ENCODING 50514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8900 -8980 -D900 -2000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR C553 -ENCODING 50515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -7600 -1000 -7F00 -8900 -7600 -ENDCHAR -STARTCHAR C554 -ENCODING 50516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8980 -8900 -7100 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR C555 -ENCODING 50517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -8900 -7100 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR C556 -ENCODING 50518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C557 -ENCODING 50519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8980 -8900 -7100 -0100 -0800 -0C00 -3600 -4100 -ENDCHAR -STARTCHAR C558 -ENCODING 50520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8980 -8900 -7100 -0000 -2200 -2200 -5500 -8980 -ENDCHAR -STARTCHAR C559 -ENCODING 50521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8980 -8900 -7100 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR C55A -ENCODING 50522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR C55B -ENCODING 50523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8900 -8980 -D900 -2000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR C55C -ENCODING 50524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR C55D -ENCODING 50525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -7100 -0000 -7F00 -4000 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR C55E -ENCODING 50526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8980 -8900 -7100 -0000 -7F00 -2200 -2200 -7F00 -ENDCHAR -STARTCHAR C55F -ENCODING 50527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8900 -8980 -D900 -2000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR C560 -ENCODING 50528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -95 -95 -97 -95 -95 -65 -05 -05 -05 -ENDCHAR -STARTCHAR C561 -ENCODING 50529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -95 -97 -95 -65 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C562 -ENCODING 50530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C563 -ENCODING 50531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9500 -6500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C564 -ENCODING 50532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -9500 -9500 -9700 -9500 -6500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C565 -ENCODING 50533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9500 -6500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C566 -ENCODING 50534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C567 -ENCODING 50535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -97 -95 -65 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C568 -ENCODING 50536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -97 -95 -65 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C569 -ENCODING 50537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C56A -ENCODING 50538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C56B -ENCODING 50539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C56C -ENCODING 50540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C56D -ENCODING 50541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C56E -ENCODING 50542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C56F -ENCODING 50543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C570 -ENCODING 50544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -95 -97 -95 -65 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C571 -ENCODING 50545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -95 -97 -95 -65 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR C572 -ENCODING 50546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9500 -6500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C573 -ENCODING 50547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -9500 -9500 -9700 -9500 -6500 -0100 -0800 -0C00 -3200 -4180 -ENDCHAR -STARTCHAR C574 -ENCODING 50548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -9500 -9500 -9700 -9500 -6500 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR C575 -ENCODING 50549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -95 -97 -95 -65 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C576 -ENCODING 50550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9500 -6500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C577 -ENCODING 50551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9500 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C578 -ENCODING 50552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C579 -ENCODING 50553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C57A -ENCODING 50554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -97 -95 -65 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C57B -ENCODING 50555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -95 -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C57C -ENCODING 50556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -8900 -8980 -8900 -7100 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C57D -ENCODING 50557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -8980 -7100 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C57E -ENCODING 50558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C57F -ENCODING 50559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR C580 -ENCODING 50560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -8900 -7180 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR C581 -ENCODING 50561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7100 -8980 -8900 -8980 -7100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C582 -ENCODING 50562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8980 -8900 -D980 -2000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR C583 -ENCODING 50563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR C584 -ENCODING 50564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR C585 -ENCODING 50565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8980 -8900 -D980 -2000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR C586 -ENCODING 50566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8980 -8900 -D980 -2000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR C587 -ENCODING 50567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -7900 -1900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR C588 -ENCODING 50568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8980 -8900 -D980 -2000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR C589 -ENCODING 50569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8980 -8900 -D980 -2000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR C58A -ENCODING 50570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8980 -8900 -D980 -2000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR C58B -ENCODING 50571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8980 -8900 -D980 -2000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR C58C -ENCODING 50572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -8980 -7100 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR C58D -ENCODING 50573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -8980 -7100 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR C58E -ENCODING 50574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C58F -ENCODING 50575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -8980 -7100 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR C590 -ENCODING 50576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR C591 -ENCODING 50577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8980 -8900 -8980 -7100 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR C592 -ENCODING 50578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR C593 -ENCODING 50579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8980 -8900 -D980 -2000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR C594 -ENCODING 50580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR C595 -ENCODING 50581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -7F00 -4000 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR C596 -ENCODING 50582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7100 -8980 -8900 -8980 -7100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR C597 -ENCODING 50583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8980 -8900 -8980 -7100 -0100 -1C00 -0000 -7F00 -2200 -1C00 -ENDCHAR -STARTCHAR C598 -ENCODING 50584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -97 -95 -95 -97 -95 -65 -05 -05 -05 -ENDCHAR -STARTCHAR C599 -ENCODING 50585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C59A -ENCODING 50586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C59B -ENCODING 50587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -6500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C59C -ENCODING 50588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -9500 -9700 -9500 -9500 -6700 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C59D -ENCODING 50589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -6500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C59E -ENCODING 50590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C59F -ENCODING 50591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -97 -95 -97 -65 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C5A0 -ENCODING 50592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -97 -95 -97 -65 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C5A1 -ENCODING 50593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C5A2 -ENCODING 50594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C5A3 -ENCODING 50595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C5A4 -ENCODING 50596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C5A5 -ENCODING 50597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C5A6 -ENCODING 50598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C5A7 -ENCODING 50599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C5A8 -ENCODING 50600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -97 -95 -97 -65 -00 -3F -41 -7F -ENDCHAR -STARTCHAR C5A9 -ENCODING 50601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -97 -95 -97 -65 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR C5AA -ENCODING 50602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -6500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C5AB -ENCODING 50603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -97 -95 -97 -65 -00 -08 -14 -63 -ENDCHAR -STARTCHAR C5AC -ENCODING 50604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -6500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C5AD -ENCODING 50605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR C5AE -ENCODING 50606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -6500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C5AF -ENCODING 50607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9700 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C5B0 -ENCODING 50608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C5B1 -ENCODING 50609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C5B2 -ENCODING 50610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -97 -95 -97 -65 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C5B3 -ENCODING 50611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -97 -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C5B4 -ENCODING 50612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -8F -89 -89 -89 -71 -01 -01 -01 -ENDCHAR -STARTCHAR C5B5 -ENCODING 50613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -89 -71 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C5B6 -ENCODING 50614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -8F -89 -71 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C5B7 -ENCODING 50615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -8900 -8F00 -8900 -7100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C5B8 -ENCODING 50616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -8F -89 -71 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR C5B9 -ENCODING 50617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8F00 -8900 -7100 -0000 -4700 -4100 -4300 -7480 -ENDCHAR -STARTCHAR C5BA -ENCODING 50618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -8F -D9 -21 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C5BB -ENCODING 50619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -89 -71 -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR C5BC -ENCODING 50620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -71 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C5BD -ENCODING 50621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -71 -00 -77 -11 -71 -41 -79 -ENDCHAR -STARTCHAR C5BE -ENCODING 50622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -71 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C5BF -ENCODING 50623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -8F -D9 -21 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C5C0 -ENCODING 50624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -8F -D9 -21 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C5C1 -ENCODING 50625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -8F -D9 -21 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C5C2 -ENCODING 50626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -8F -D9 -21 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C5C3 -ENCODING 50627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -8F -D9 -21 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR C5C4 -ENCODING 50628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -89 -71 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C5C5 -ENCODING 50629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -89 -71 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C5C6 -ENCODING 50630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8F00 -8900 -8900 -7100 -0000 -4A00 -7200 -4D00 -7480 -ENDCHAR -STARTCHAR C5C7 -ENCODING 50631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8F00 -8900 -7100 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR C5C8 -ENCODING 50632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8F00 -8900 -8900 -7100 -0000 -1200 -1200 -3300 -4C80 -ENDCHAR -STARTCHAR C5C9 -ENCODING 50633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -89 -71 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR C5CA -ENCODING 50634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8F00 -8900 -7100 -0000 -3F00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C5CB -ENCODING 50635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -8900 -8F00 -D900 -2100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C5CC -ENCODING 50636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -89 -71 -00 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C5CD -ENCODING 50637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -8F -D9 -21 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR C5CE -ENCODING 50638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8F00 -8900 -8900 -7100 -0000 -3F00 -1200 -1200 -7F80 -ENDCHAR -STARTCHAR C5CF -ENCODING 50639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -8F -D9 -21 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C5D0 -ENCODING 50640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -95 -8D -95 -95 -95 -65 -05 -05 -05 -ENDCHAR -STARTCHAR C5D1 -ENCODING 50641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -95 -9D -95 -65 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C5D2 -ENCODING 50642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -65 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C5D3 -ENCODING 50643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -6500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C5D4 -ENCODING 50644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -9500 -9500 -9D00 -9500 -6500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C5D5 -ENCODING 50645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -6500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C5D6 -ENCODING 50646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C5D7 -ENCODING 50647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -9D -95 -65 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C5D8 -ENCODING 50648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -9D -95 -65 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C5D9 -ENCODING 50649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C5DA -ENCODING 50650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C5DB -ENCODING 50651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C5DC -ENCODING 50652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C5DD -ENCODING 50653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C5DE -ENCODING 50654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C5DF -ENCODING 50655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C5E0 -ENCODING 50656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -95 -9D -95 -65 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C5E1 -ENCODING 50657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -9D -95 -95 -65 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR C5E2 -ENCODING 50658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -6500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C5E3 -ENCODING 50659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -9500 -9500 -9D00 -9500 -6500 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR C5E4 -ENCODING 50660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -6500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C5E5 -ENCODING 50661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -95 -9D -95 -65 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C5E6 -ENCODING 50662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -6500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C5E7 -ENCODING 50663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9D00 -9500 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C5E8 -ENCODING 50664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -65 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C5E9 -ENCODING 50665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C5EA -ENCODING 50666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -9D -95 -65 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C5EB -ENCODING 50667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -9D -95 -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C5EC -ENCODING 50668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -89 -89 -8F -89 -71 -01 -01 -01 -ENDCHAR -STARTCHAR C5ED -ENCODING 50669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -89 -8F -71 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C5EE -ENCODING 50670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -89 -8F -71 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C5EF -ENCODING 50671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -8F00 -8900 -8F00 -7100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C5F0 -ENCODING 50672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -89 -8F -71 -01 -20 -20 -20 -3F -ENDCHAR -STARTCHAR C5F1 -ENCODING 50673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -8F -89 -8F -71 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C5F2 -ENCODING 50674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -8F -89 -DF -21 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C5F3 -ENCODING 50675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -71 -8F -89 -8F -71 -00 -7E -40 -7E -ENDCHAR -STARTCHAR C5F4 -ENCODING 50676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -8F -71 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C5F5 -ENCODING 50677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -8F -89 -DF -21 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR C5F6 -ENCODING 50678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -8F -71 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C5F7 -ENCODING 50679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -8F -71 -00 -75 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C5F8 -ENCODING 50680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -8F -89 -DF -21 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C5F9 -ENCODING 50681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -8F -89 -DF -21 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C5FA -ENCODING 50682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -8F -89 -DF -21 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C5FB -ENCODING 50683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -8F -89 -DF -21 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR C5FC -ENCODING 50684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -89 -8F -71 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C5FD -ENCODING 50685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -89 -8F -71 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C5FE -ENCODING 50686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8F00 -8900 -8900 -8F00 -7100 -0000 -4A00 -7200 -4D00 -7480 -ENDCHAR -STARTCHAR C5FF -ENCODING 50687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8F00 -8900 -8900 -8F00 -7100 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR C600 -ENCODING 50688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8F00 -8900 -8900 -8F00 -7100 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR C601 -ENCODING 50689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -89 -8F -71 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR C602 -ENCODING 50690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -8F00 -8900 -8F00 -7100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR C603 -ENCODING 50691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -8F00 -8900 -DF00 -2100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C604 -ENCODING 50692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -8F -89 -8F -71 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C605 -ENCODING 50693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -8F -71 -00 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C606 -ENCODING 50694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8F00 -8900 -8900 -8F00 -7100 -0000 -3F00 -1200 -1200 -7F80 -ENDCHAR -STARTCHAR C607 -ENCODING 50695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -8F -89 -8F -71 -01 -1C -00 -7F -22 -1E -ENDCHAR -STARTCHAR C608 -ENCODING 50696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -95 -9D -95 -95 -9D -95 -65 -05 -05 -05 -ENDCHAR -STARTCHAR C609 -ENCODING 50697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -65 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C60A -ENCODING 50698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -65 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C60B -ENCODING 50699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -6500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C60C -ENCODING 50700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -9D00 -9500 -9500 -9D00 -6500 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C60D -ENCODING 50701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -6500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C60E -ENCODING 50702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C60F -ENCODING 50703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -95 -9D -65 -00 -3F -40 -7F -ENDCHAR -STARTCHAR C610 -ENCODING 50704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -9D -95 -9D -65 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C611 -ENCODING 50705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C612 -ENCODING 50706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C613 -ENCODING 50707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C614 -ENCODING 50708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C615 -ENCODING 50709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C616 -ENCODING 50710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C617 -ENCODING 50711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C618 -ENCODING 50712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -9D -95 -95 -9D -65 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C619 -ENCODING 50713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -9D -95 -95 -9D -65 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR C61A -ENCODING 50714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -6500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C61B -ENCODING 50715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -9D00 -9500 -9500 -9D00 -6500 -0500 -0900 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR C61C -ENCODING 50716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -9D00 -9500 -9500 -9D00 -6500 -0000 -1200 -3200 -7500 -4C80 -ENDCHAR -STARTCHAR C61D -ENCODING 50717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -9D -95 -65 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR C61E -ENCODING 50718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -6500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C61F -ENCODING 50719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C620 -ENCODING 50720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -65 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C621 -ENCODING 50721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C622 -ENCODING 50722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -9D -95 -9D -65 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C623 -ENCODING 50723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C624 -ENCODING 50724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1E00 -2100 -2080 -2080 -2100 -1E00 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR C625 -ENCODING 50725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C626 -ENCODING 50726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -62 -41 -7E -08 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR C627 -ENCODING 50727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -1C00 -6200 -4100 -7E00 -0800 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR C628 -ENCODING 50728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0400 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C629 -ENCODING 50729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -62 -41 -7E -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C62A -ENCODING 50730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C62B -ENCODING 50731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -1C -62 -41 -7E -08 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR C62C -ENCODING 50732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C62D -ENCODING 50733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0400 -FFC0 -0000 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C62E -ENCODING 50734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0400 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR C62F -ENCODING 50735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR C630 -ENCODING 50736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0400 -FFC0 -0000 -7900 -0900 -3900 -4280 -3C40 -ENDCHAR -STARTCHAR C631 -ENCODING 50737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C632 -ENCODING 50738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR C633 -ENCODING 50739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0400 -FFC0 -0000 -7B00 -0800 -7F80 -4480 -3B80 -ENDCHAR -STARTCHAR C634 -ENCODING 50740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C635 -ENCODING 50741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C636 -ENCODING 50742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -62 -41 -7E -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR C637 -ENCODING 50743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0400 -FFC0 -0000 -0400 -0C00 -1300 -6180 -ENDCHAR -STARTCHAR C638 -ENCODING 50744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -62 -41 -7E -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR C639 -ENCODING 50745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C63A -ENCODING 50746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -1C -62 -41 -7E -08 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR C63B -ENCODING 50747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0400 -FFC0 -0000 -1E00 -0000 -3F00 -0E00 -7180 -ENDCHAR -STARTCHAR C63C -ENCODING 50748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -1C -62 -41 -7E -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR C63D -ENCODING 50749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1E00 -2100 -2080 -1F00 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR C63E -ENCODING 50750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -1C -62 -41 -7E -08 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR C63F -ENCODING 50751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -0400 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR C640 -ENCODING 50752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -4480 -4480 -4480 -38C0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C641 -ENCODING 50753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -4480 -4480 -38C0 -1080 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C642 -ENCODING 50754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -8900 -C980 -3100 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C643 -ENCODING 50755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -8900 -C980 -3100 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR C644 -ENCODING 50756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -4480 -4480 -4480 -38C0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C645 -ENCODING 50757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -8900 -C980 -3100 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C646 -ENCODING 50758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C647 -ENCODING 50759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -8900 -C980 -3100 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR C648 -ENCODING 50760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3C80 -4480 -3C80 -10C0 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C649 -ENCODING 50761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C64A -ENCODING 50762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C64B -ENCODING 50763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR C64C -ENCODING 50764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C64D -ENCODING 50765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR C64E -ENCODING 50766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR C64F -ENCODING 50767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR C650 -ENCODING 50768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -4480 -4480 -38C0 -1080 -FE80 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C651 -ENCODING 50769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -4480 -4480 -38C0 -1080 -FE80 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C652 -ENCODING 50770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -8900 -C980 -3100 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR C653 -ENCODING 50771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -4480 -4480 -3880 -10C0 -FE80 -0080 -0400 -0400 -1B00 -2080 -ENDCHAR -STARTCHAR C654 -ENCODING 50772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -4480 -4480 -38C0 -1080 -FE80 -0000 -1100 -1100 -2B80 -4480 -ENDCHAR -STARTCHAR C655 -ENCODING 50773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -4480 -4480 -38C0 -1080 -FE80 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C656 -ENCODING 50774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -8900 -C980 -3100 -FD00 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR C657 -ENCODING 50775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR C658 -ENCODING 50776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -8900 -C980 -3100 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR C659 -ENCODING 50777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR C65A -ENCODING 50778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -8900 -C980 -3100 -FD00 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR C65B -ENCODING 50779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1000 -6C80 -4480 -2CC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR C65C -ENCODING 50780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -4A80 -4A80 -4A80 -3380 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR C65D -ENCODING 50781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -4A80 -4A80 -3B80 -1280 -FE80 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C65E -ENCODING 50782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -65 -FD -01 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C65F -ENCODING 50783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -6500 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C660 -ENCODING 50784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3280 -4A80 -4A80 -4B80 -3A80 -1280 -FE80 -0280 -2000 -2000 -1FC0 -ENDCHAR -STARTCHAR C661 -ENCODING 50785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -6500 -FD00 -0100 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C662 -ENCODING 50786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR C663 -ENCODING 50787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -97 -65 -FD -01 -3F -40 -7F -ENDCHAR -STARTCHAR C664 -ENCODING 50788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C665 -ENCODING 50789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR C666 -ENCODING 50790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR C667 -ENCODING 50791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C668 -ENCODING 50792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR C669 -ENCODING 50793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C66A -ENCODING 50794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C66B -ENCODING 50795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR C66C -ENCODING 50796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -4A80 -4A80 -3B80 -1280 -FE80 -0000 -3F80 -2080 -2080 -3F80 -ENDCHAR -STARTCHAR C66D -ENCODING 50797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -97 -65 -FD -01 -21 -3F -3F -ENDCHAR -STARTCHAR C66E -ENCODING 50798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -6500 -FD00 -0100 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C66F -ENCODING 50799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -4A80 -4A80 -3B80 -1280 -FE80 -0080 -0400 -0400 -1B00 -2080 -ENDCHAR -STARTCHAR C670 -ENCODING 50800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -6500 -FD00 -0100 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C671 -ENCODING 50801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -4A80 -4A80 -3B80 -1280 -FE80 -0280 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C672 -ENCODING 50802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -6500 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C673 -ENCODING 50803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR C674 -ENCODING 50804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -65 -FD -01 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C675 -ENCODING 50805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C676 -ENCODING 50806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -97 -65 -FD -01 -3F -12 -3F -ENDCHAR -STARTCHAR C677 -ENCODING 50807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -4A80 -6B80 -1280 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR C678 -ENCODING 50808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -4480 -4480 -4480 -3880 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C679 -ENCODING 50809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -21 -FF -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C67A -ENCODING 50810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C67B -ENCODING 50811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -8900 -C900 -3100 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C67C -ENCODING 50812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -49 -85 -49 -71 -21 -FF -01 -41 -40 -7F -ENDCHAR -STARTCHAR C67D -ENCODING 50813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C67E -ENCODING 50814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C67F -ENCODING 50815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -89 -C9 -31 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR C680 -ENCODING 50816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -85 -79 -21 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR C681 -ENCODING 50817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR C682 -ENCODING 50818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR C683 -ENCODING 50819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C684 -ENCODING 50820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C685 -ENCODING 50821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C686 -ENCODING 50822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR C687 -ENCODING 50823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR C688 -ENCODING 50824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -21 -FF -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR C689 -ENCODING 50825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -21 -FF -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR C68A -ENCODING 50826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR C68B -ENCODING 50827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -21 -FF -01 -08 -08 -36 -41 -ENDCHAR -STARTCHAR C68C -ENCODING 50828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C68D -ENCODING 50829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -21 -FF -00 -3E -41 -41 -3E -ENDCHAR -STARTCHAR C68E -ENCODING 50830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -8900 -C900 -3100 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C68F -ENCODING 50831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -D900 -8900 -5900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C690 -ENCODING 50832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR C691 -ENCODING 50833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR C692 -ENCODING 50834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -89 -C9 -31 -FD -01 -7F -12 -3F -ENDCHAR -STARTCHAR C693 -ENCODING 50835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -59 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C694 -ENCODING 50836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1E00 -2100 -2080 -2100 -1E00 -0000 -1100 -1100 -FFC0 -ENDCHAR -STARTCHAR C695 -ENCODING 50837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -1200 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C696 -ENCODING 50838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -1200 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C697 -ENCODING 50839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -1200 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C698 -ENCODING 50840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -1200 -1200 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C699 -ENCODING 50841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -1200 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C69A -ENCODING 50842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C69B -ENCODING 50843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3100 -2080 -3F00 -1200 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C69C -ENCODING 50844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -1F00 -1200 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C69D -ENCODING 50845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C69E -ENCODING 50846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C69F -ENCODING 50847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR C6A0 -ENCODING 50848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C6A1 -ENCODING 50849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C6A2 -ENCODING 50850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR C6A3 -ENCODING 50851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR C6A4 -ENCODING 50852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2100 -1E00 -1200 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C6A5 -ENCODING 50853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -1200 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C6A6 -ENCODING 50854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -1200 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C6A7 -ENCODING 50855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -1200 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR C6A8 -ENCODING 50856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -1200 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR C6A9 -ENCODING 50857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -1200 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C6AA -ENCODING 50858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -1200 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C6AB -ENCODING 50859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR C6AC -ENCODING 50860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -1200 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR C6AD -ENCODING 50861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR C6AE -ENCODING 50862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3100 -2080 -3F00 -1200 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C6AF -ENCODING 50863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2080 -1F00 -1200 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR C6B0 -ENCODING 50864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1E00 -2100 -2080 -2100 -1E00 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR C6B1 -ENCODING 50865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C6B2 -ENCODING 50866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C6B3 -ENCODING 50867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C6B4 -ENCODING 50868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR C6B5 -ENCODING 50869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C6B6 -ENCODING 50870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR C6B7 -ENCODING 50871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C6B8 -ENCODING 50872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C6B9 -ENCODING 50873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C6BA -ENCODING 50874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0400 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR C6BB -ENCODING 50875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR C6BC -ENCODING 50876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR C6BD -ENCODING 50877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR C6BE -ENCODING 50878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR C6BF -ENCODING 50879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR C6C0 -ENCODING 50880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C6C1 -ENCODING 50881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -0400 -2480 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C6C2 -ENCODING 50882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C6C3 -ENCODING 50883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -0400 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR C6C4 -ENCODING 50884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR C6C5 -ENCODING 50885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C6C6 -ENCODING 50886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -1C -62 -41 -7E -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR C6C7 -ENCODING 50887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR C6C8 -ENCODING 50888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR C6C9 -ENCODING 50889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -42 -41 -3E -00 -FF -08 -7E -7E -7E -ENDCHAR -STARTCHAR C6CA -ENCODING 50890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C6CB -ENCODING 50891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR C6CC -ENCODING 50892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -4480 -4480 -3880 -0080 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR C6CD -ENCODING 50893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -71 -01 -FD -21 -20 -7F -01 -01 -ENDCHAR -STARTCHAR C6CE -ENCODING 50894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -1D -E1 -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C6CF -ENCODING 50895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -1D -E1 -27 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C6D0 -ENCODING 50896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -71 -01 -FF -21 -27 -41 -40 -7F -ENDCHAR -STARTCHAR C6D1 -ENCODING 50897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -1D -E1 -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C6D2 -ENCODING 50898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -27 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR C6D3 -ENCODING 50899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -49 -89 -79 -1D -E1 -27 -3F -40 -7E -ENDCHAR -STARTCHAR C6D4 -ENCODING 50900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -87 -79 -01 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR C6D5 -ENCODING 50901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -27 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR C6D6 -ENCODING 50902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -27 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR C6D7 -ENCODING 50903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -27 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR C6D8 -ENCODING 50904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -27 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR C6D9 -ENCODING 50905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -27 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR C6DA -ENCODING 50906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -27 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C6DB -ENCODING 50907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -27 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR C6DC -ENCODING 50908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -79 -01 -FD -21 -27 -00 -7F -41 -7F -ENDCHAR -STARTCHAR C6DD -ENCODING 50909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -71 -01 -FD -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR C6DE -ENCODING 50910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -1D -E1 -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR C6DF -ENCODING 50911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -49 -89 -79 -1D -E1 -27 -08 -14 -63 -ENDCHAR -STARTCHAR C6E0 -ENCODING 50912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8F00 -7100 -0100 -FD00 -2100 -2200 -2200 -5500 -8880 -ENDCHAR -STARTCHAR C6E1 -ENCODING 50913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -8F -71 -01 -FD -21 -3E -41 -41 -3E -ENDCHAR -STARTCHAR C6E2 -ENCODING 50914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -4900 -8900 -7900 -1D00 -E100 -2700 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C6E3 -ENCODING 50915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -C900 -8900 -7100 -FD00 -2300 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C6E4 -ENCODING 50916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -1D -E1 -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C6E5 -ENCODING 50917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -27 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C6E6 -ENCODING 50918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -49 -89 -79 -1D -E1 -27 -3F -12 -3F -ENDCHAR -STARTCHAR C6E7 -ENCODING 50919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -FD -23 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C6E8 -ENCODING 50920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -4A80 -4A80 -7A80 -0280 -FE80 -1280 -1680 -1280 -1280 -0280 -ENDCHAR -STARTCHAR C6E9 -ENCODING 50921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -4A80 -4E80 -3A80 -0280 -FE80 -1000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C6EA -ENCODING 50922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C6EB -ENCODING 50923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F500 -1D00 -E500 -2900 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C6EC -ENCODING 50924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -4A80 -4A80 -3A80 -0280 -FE80 -1280 -1680 -2280 -2000 -3F80 -ENDCHAR -STARTCHAR C6ED -ENCODING 50925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F500 -1D00 -E500 -2900 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C6EE -ENCODING 50926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR C6EF -ENCODING 50927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3F -40 -7F -ENDCHAR -STARTCHAR C6F0 -ENCODING 50928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -4680 -7A80 -0280 -FE80 -1000 -3F80 -0080 -3F80 -2000 -3F80 -ENDCHAR -STARTCHAR C6F1 -ENCODING 50929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1000 -0F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR C6F2 -ENCODING 50930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR C6F3 -ENCODING 50931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1000 -0E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C6F4 -ENCODING 50932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1000 -2900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C6F5 -ENCODING 50933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1000 -0F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C6F6 -ENCODING 50934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1000 -2B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C6F7 -ENCODING 50935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR C6F8 -ENCODING 50936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -4A80 -4E80 -3A80 -0280 -FE80 -1000 -3F80 -2080 -2080 -3F80 -ENDCHAR -STARTCHAR C6F9 -ENCODING 50937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -4680 -7A80 -0280 -FE80 -1280 -1000 -2080 -3F80 -2080 -3F80 -ENDCHAR -STARTCHAR C6FA -ENCODING 50938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F500 -1D00 -E500 -2900 -4200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C6FB -ENCODING 50939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -08 -1C -63 -ENDCHAR -STARTCHAR C6FC -ENCODING 50940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -02 -22 -55 -08 -ENDCHAR -STARTCHAR C6FD -ENCODING 50941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -4A80 -4E80 -3A80 -0280 -FE80 -1000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C6FE -ENCODING 50942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -F500 -1D00 -E500 -2900 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C6FF -ENCODING 50943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR C700 -ENCODING 50944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3F -01 -3F -01 -ENDCHAR -STARTCHAR C701 -ENCODING 50945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C702 -ENCODING 50946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -95 -F5 -1D -E5 -29 -3F -12 -3F -ENDCHAR -STARTCHAR C703 -ENCODING 50947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -6A80 -4A80 -3280 -FE80 -1680 -1E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR C704 -ENCODING 50948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -4480 -4280 -4480 -3880 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR C705 -ENCODING 50949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -01 -FD -20 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C706 -ENCODING 50950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C707 -ENCODING 50951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C708 -ENCODING 50952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -01 -FD -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR C709 -ENCODING 50953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C70A -ENCODING 50954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -00 -46 -4F -49 -36 -ENDCHAR -STARTCHAR C70B -ENCODING 50955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -49 -89 -79 -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR C70C -ENCODING 50956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -85 -79 -01 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR C70D -ENCODING 50957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -00 -77 -31 -41 -71 -ENDCHAR -STARTCHAR C70E -ENCODING 50958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR C70F -ENCODING 50959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR C710 -ENCODING 50960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -00 -72 -72 -85 -68 -ENDCHAR -STARTCHAR C711 -ENCODING 50961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR C712 -ENCODING 50962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C713 -ENCODING 50963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -00 -77 -37 -49 -76 -ENDCHAR -STARTCHAR C714 -ENCODING 50964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -01 -FD -20 -7F -41 -41 -7F -ENDCHAR -STARTCHAR C715 -ENCODING 50965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -01 -FD -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR C716 -ENCODING 50966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR C717 -ENCODING 50967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7900 -8900 -8900 -7900 -0100 -FD00 -2100 -2800 -0C00 -3200 -6180 -ENDCHAR -STARTCHAR C718 -ENCODING 50968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C719 -ENCODING 50969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -01 -FD -20 -3E -41 -41 -3E -ENDCHAR -STARTCHAR C71A -ENCODING 50970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -4900 -8900 -7900 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C71B -ENCODING 50971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -C900 -8900 -7100 -1D00 -E100 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C71C -ENCODING 50972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -49 -89 -79 -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C71D -ENCODING 50973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C71E -ENCODING 50974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -49 -89 -79 -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR C71F -ENCODING 50975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -89 -71 -1D -E1 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C720 -ENCODING 50976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1E00 -2100 -2080 -2100 -1E00 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR C721 -ENCODING 50977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -1200 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C722 -ENCODING 50978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C723 -ENCODING 50979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C724 -ENCODING 50980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -1200 -3200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR C725 -ENCODING 50981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C726 -ENCODING 50982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR C727 -ENCODING 50983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C728 -ENCODING 50984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C729 -ENCODING 50985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR C72A -ENCODING 50986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR C72B -ENCODING 50987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR C72C -ENCODING 50988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR C72D -ENCODING 50989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR C72E -ENCODING 50990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR C72F -ENCODING 50991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR C730 -ENCODING 50992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -1200 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C731 -ENCODING 50993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -1200 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C732 -ENCODING 50994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C733 -ENCODING 50995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -1100 -1500 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR C734 -ENCODING 50996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR C735 -ENCODING 50997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -1200 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C736 -ENCODING 50998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C737 -ENCODING 50999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -1100 -0E00 -0000 -3F00 -0E00 -7180 -ENDCHAR -STARTCHAR C738 -ENCODING 51000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR C739 -ENCODING 51001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -42 -41 -3E -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR C73A -ENCODING 51002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3100 -2080 -3F00 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C73B -ENCODING 51003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR C73C -ENCODING 51004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1E00 -2100 -2080 -2080 -2100 -1E00 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR C73D -ENCODING 51005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2100 -1E00 -0000 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C73E -ENCODING 51006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2080 -3300 -0C00 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C73F -ENCODING 51007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2080 -3300 -0C00 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C740 -ENCODING 51008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1F00 -2080 -2080 -1F00 -0000 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C741 -ENCODING 51009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2080 -3300 -0C00 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C742 -ENCODING 51010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C743 -ENCODING 51011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -2080 -3300 -0C00 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C744 -ENCODING 51012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C745 -ENCODING 51013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR C746 -ENCODING 51014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR C747 -ENCODING 51015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR C748 -ENCODING 51016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C749 -ENCODING 51017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR C74A -ENCODING 51018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0000 -7F80 -0A80 -7A80 -4280 -7F80 -ENDCHAR -STARTCHAR C74B -ENCODING 51019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -42 -41 -3E -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR C74C -ENCODING 51020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2100 -1E00 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C74D -ENCODING 51021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2100 -1E00 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C74E -ENCODING 51022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2080 -3300 -0C00 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C74F -ENCODING 51023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2100 -1E00 -0000 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR C750 -ENCODING 51024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -2080 -3300 -0C00 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR C751 -ENCODING 51025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2100 -1E00 -0000 -FFC0 -0000 -1F00 -2100 -2100 -1F00 -ENDCHAR -STARTCHAR C752 -ENCODING 51026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2100 -1E00 -0000 -FFC0 -0000 -3F00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C753 -ENCODING 51027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0000 -1E00 -0000 -3F00 -0E00 -7180 -ENDCHAR -STARTCHAR C754 -ENCODING 51028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2100 -1E00 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -0080 -ENDCHAR -STARTCHAR C755 -ENCODING 51029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2080 -3F00 -0000 -FFC0 -0000 -3F80 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C756 -ENCODING 51030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -2100 -2100 -1E00 -0000 -FFC0 -0000 -3F80 -1200 -1200 -7F80 -ENDCHAR -STARTCHAR C757 -ENCODING 51031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 12 0 -3 -BITMAP -1F00 -2100 -2100 -1F00 -0000 -FFC0 -0000 -1E00 -0000 -3F80 -1100 -1E00 -ENDCHAR -STARTCHAR C758 -ENCODING 51032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -4480 -4480 -4480 -3880 -0080 -0080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C759 -ENCODING 51033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C75A -ENCODING 51034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C75B -ENCODING 51035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -8900 -C900 -3100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C75C -ENCODING 51036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -49 -85 -49 -71 -01 -FF -01 -40 -40 -7F -ENDCHAR -STARTCHAR C75D -ENCODING 51037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C75E -ENCODING 51038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C75F -ENCODING 51039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -89 -C9 -31 -FD -00 -3F -40 -7E -ENDCHAR -STARTCHAR C760 -ENCODING 51040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -85 -79 -01 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR C761 -ENCODING 51041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR C762 -ENCODING 51042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR C763 -ENCODING 51043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C764 -ENCODING 51044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C765 -ENCODING 51045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C766 -ENCODING 51046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR C767 -ENCODING 51047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR C768 -ENCODING 51048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -01 -FF -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR C769 -ENCODING 51049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -89 -C9 -31 -FD -00 -41 -7F -7F -ENDCHAR -STARTCHAR C76A -ENCODING 51050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR C76B -ENCODING 51051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -89 -89 -79 -01 -FF -01 -08 -08 -36 -41 -ENDCHAR -STARTCHAR C76C -ENCODING 51052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C76D -ENCODING 51053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C76E -ENCODING 51054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -8900 -C900 -3100 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C76F -ENCODING 51055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -D900 -8900 -7900 -0100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C770 -ENCODING 51056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -89 -C9 -31 -FD -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR C771 -ENCODING 51057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR C772 -ENCODING 51058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -89 -C9 -31 -FD -00 -7F -12 -3F -ENDCHAR -STARTCHAR C773 -ENCODING 51059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -D9 -89 -79 -01 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C774 -ENCODING 51060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -49 -89 -89 -89 -89 -49 -71 -01 -01 -01 -ENDCHAR -STARTCHAR C775 -ENCODING 51061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -89 -71 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C776 -ENCODING 51062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -89 -71 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C777 -ENCODING 51063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -8900 -8900 -8900 -7100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C778 -ENCODING 51064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -89 -71 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR C779 -ENCODING 51065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -89 -71 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C77A -ENCODING 51066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -D9 -21 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C77B -ENCODING 51067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -71 -89 -89 -89 -71 -00 -7E -40 -7E -ENDCHAR -STARTCHAR C77C -ENCODING 51068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -71 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C77D -ENCODING 51069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -71 -00 -77 -11 -71 -41 -79 -ENDCHAR -STARTCHAR C77E -ENCODING 51070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -71 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C77F -ENCODING 51071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -D9 -21 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C780 -ENCODING 51072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -D9 -21 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C781 -ENCODING 51073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -D9 -21 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C782 -ENCODING 51074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -D9 -21 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C783 -ENCODING 51075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -71 -00 -77 -10 -7F -45 -7F -ENDCHAR -STARTCHAR C784 -ENCODING 51076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -89 -71 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C785 -ENCODING 51077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -89 -71 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C786 -ENCODING 51078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -8900 -8900 -8900 -7100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C787 -ENCODING 51079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8900 -8900 -7100 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR C788 -ENCODING 51080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8900 -8900 -7100 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR C789 -ENCODING 51081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -89 -71 -00 -1E -21 -21 -1E -ENDCHAR -STARTCHAR C78A -ENCODING 51082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -8900 -8900 -8900 -8900 -7100 -0000 -3F00 -0200 -0E00 -3180 -ENDCHAR -STARTCHAR C78B -ENCODING 51083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7100 -8900 -8900 -D900 -2100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C78C -ENCODING 51084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -89 -71 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C78D -ENCODING 51085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -D9 -21 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR C78E -ENCODING 51086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -89 -89 -89 -89 -71 -00 -7F -12 -12 -7F -ENDCHAR -STARTCHAR C78F -ENCODING 51087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -71 -89 -89 -D9 -21 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C790 -ENCODING 51088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1100 -2180 -7100 -C900 -8500 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C791 -ENCODING 51089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -3180 -4900 -8500 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C792 -ENCODING 51090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -1100 -1180 -6900 -8500 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C793 -ENCODING 51091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -1100 -1180 -6900 -8500 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR C794 -ENCODING 51092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -3180 -6900 -8500 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR C795 -ENCODING 51093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -1100 -1180 -6900 -8500 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C796 -ENCODING 51094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -1100 -1180 -6D00 -8000 -0600 -0000 -4F00 -4600 -4900 -7700 -ENDCHAR -STARTCHAR C797 -ENCODING 51095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -3180 -6900 -8500 -0000 -7F00 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR C798 -ENCODING 51096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -1100 -1180 -7900 -8500 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR C799 -ENCODING 51097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -3180 -4D00 -8000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR C79A -ENCODING 51098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -7900 -8D00 -0000 -7F00 -1900 -7900 -8900 -7F00 -ENDCHAR -STARTCHAR C79B -ENCODING 51099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -3180 -4D00 -8000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR C79C -ENCODING 51100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -3180 -4D00 -8000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR C79D -ENCODING 51101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -3180 -4D00 -8000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR C79E -ENCODING 51102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -3180 -4D00 -8000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR C79F -ENCODING 51103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -3180 -4D00 -8000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR C7A0 -ENCODING 51104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1180 -7900 -8500 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR C7A1 -ENCODING 51105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -1100 -1180 -7900 -8500 -0000 -4100 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR C7A2 -ENCODING 51106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -1100 -1180 -6900 -8500 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C7A3 -ENCODING 51107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -1180 -7900 -8500 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR C7A4 -ENCODING 51108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -3180 -4900 -8500 -0000 -2200 -2200 -5500 -8880 -ENDCHAR -STARTCHAR C7A5 -ENCODING 51109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -3180 -7900 -8500 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR C7A6 -ENCODING 51110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -3180 -6900 -8500 -0000 -3F00 -0200 -0C00 -7300 -ENDCHAR -STARTCHAR C7A7 -ENCODING 51111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -3180 -4D00 -8000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR C7A8 -ENCODING 51112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -1100 -1180 -6900 -8500 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR C7A9 -ENCODING 51113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -3180 -4D00 -8000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR C7AA -ENCODING 51114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -1100 -1180 -6900 -8500 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR C7AB -ENCODING 51115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1100 -3180 -4D00 -8000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR C7AC -ENCODING 51116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -0A80 -1280 -1380 -2A80 -6A80 -C680 -0280 -0280 -0280 -ENDCHAR -STARTCHAR C7AD -ENCODING 51117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -25 -27 -55 -8D -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C7AE -ENCODING 51118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -27 -55 -8D -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C7AF -ENCODING 51119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -2700 -5500 -8D00 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C7B0 -ENCODING 51120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -2500 -2700 -D500 -8D00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C7B1 -ENCODING 51121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -2700 -5500 -8D00 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C7B2 -ENCODING 51122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C7B3 -ENCODING 51123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -27 -55 -8D -00 -3F -40 -7F -ENDCHAR -STARTCHAR C7B4 -ENCODING 51124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -27 -55 -8D -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C7B5 -ENCODING 51125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C7B6 -ENCODING 51126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C7B7 -ENCODING 51127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C7B8 -ENCODING 51128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C7B9 -ENCODING 51129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C7BA -ENCODING 51130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C7BB -ENCODING 51131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C7BC -ENCODING 51132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -25 -27 -D5 -8D -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C7BD -ENCODING 51133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -25 -27 -55 -8D -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR C7BE -ENCODING 51134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -2700 -5500 -8D00 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C7BF -ENCODING 51135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -2500 -2700 -D500 -8D00 -0100 -0800 -0C00 -3200 -6180 -ENDCHAR -STARTCHAR C7C0 -ENCODING 51136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -2500 -2700 -D500 -8D00 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR C7C1 -ENCODING 51137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -25 -27 -D5 -8D -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C7C2 -ENCODING 51138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -2700 -5500 -8D00 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C7C3 -ENCODING 51139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -2500 -2700 -D500 -0500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C7C4 -ENCODING 51140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -27 -55 -8D -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C7C5 -ENCODING 51141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C7C6 -ENCODING 51142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -27 -55 -8D -00 -3F -12 -3F -ENDCHAR -STARTCHAR C7C7 -ENCODING 51143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -27 -D5 -05 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C7C8 -ENCODING 51144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -1100 -1180 -2100 -3100 -5180 -8900 -8500 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C7C9 -ENCODING 51145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -3100 -4980 -8500 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR C7CA -ENCODING 51146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C7CB -ENCODING 51147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR C7CC -ENCODING 51148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -3100 -4900 -8580 -0100 -4100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR C7CD -ENCODING 51149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -1180 -1100 -6980 -8500 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C7CE -ENCODING 51150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -1180 -1100 -7980 -8500 -0000 -0600 -4000 -4F00 -4900 -7700 -ENDCHAR -STARTCHAR C7CF -ENCODING 51151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR C7D0 -ENCODING 51152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -1180 -1100 -7980 -8500 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR C7D1 -ENCODING 51153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR C7D2 -ENCODING 51154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR C7D3 -ENCODING 51155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR C7D4 -ENCODING 51156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR C7D5 -ENCODING 51157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR C7D6 -ENCODING 51158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR C7D7 -ENCODING 51159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR C7D8 -ENCODING 51160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -3100 -7980 -8500 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR C7D9 -ENCODING 51161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR C7DA -ENCODING 51162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C7DB -ENCODING 51163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR C7DC -ENCODING 51164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR C7DD -ENCODING 51165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1180 -3100 -4980 -8500 -0000 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR C7DE -ENCODING 51166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR C7DF -ENCODING 51167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR C7E0 -ENCODING 51168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR C7E1 -ENCODING 51169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR C7E2 -ENCODING 51170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -1180 -1100 -6980 -8500 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR C7E3 -ENCODING 51171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -1180 -3100 -4D80 -8000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR C7E4 -ENCODING 51172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -0B80 -1280 -1280 -2B80 -4A80 -8680 -0280 -0280 -0280 -ENDCHAR -STARTCHAR C7E5 -ENCODING 51173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -25 -57 -8D -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C7E6 -ENCODING 51174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -25 -57 -8D -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C7E7 -ENCODING 51175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -2500 -5700 -8D00 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C7E8 -ENCODING 51176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -2700 -2500 -D500 -8F00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C7E9 -ENCODING 51177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -2500 -5700 -8D00 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C7EA -ENCODING 51178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C7EB -ENCODING 51179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -25 -57 -8D -00 -3F -40 -7F -ENDCHAR -STARTCHAR C7EC -ENCODING 51180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -17 -25 -57 -8D -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C7ED -ENCODING 51181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C7EE -ENCODING 51182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C7EF -ENCODING 51183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C7F0 -ENCODING 51184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C7F1 -ENCODING 51185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C7F2 -ENCODING 51186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C7F3 -ENCODING 51187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C7F4 -ENCODING 51188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -25 -57 -8D -00 -3F -41 -7F -ENDCHAR -STARTCHAR C7F5 -ENCODING 51189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -25 -57 -8D -00 -21 -3F -3F -ENDCHAR -STARTCHAR C7F6 -ENCODING 51190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -2500 -5700 -8D00 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C7F7 -ENCODING 51191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -25 -57 -8D -00 -08 -14 -63 -ENDCHAR -STARTCHAR C7F8 -ENCODING 51192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -2500 -5700 -8D00 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C7F9 -ENCODING 51193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -25 -57 -8D -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR C7FA -ENCODING 51194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -2500 -5700 -8D00 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C7FB -ENCODING 51195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -2700 -2500 -D700 -0500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C7FC -ENCODING 51196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -25 -57 -8D -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C7FD -ENCODING 51197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C7FE -ENCODING 51198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -25 -57 -8D -00 -3F -12 -3F -ENDCHAR -STARTCHAR C7FF -ENCODING 51199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -27 -25 -D7 -05 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C800 -ENCODING 51200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -17 -31 -71 -C9 -85 -01 -01 -01 -ENDCHAR -STARTCHAR C801 -ENCODING 51201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -17 -31 -49 -85 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C802 -ENCODING 51202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -11 -17 -69 -85 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C803 -ENCODING 51203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1100 -1700 -6900 -8500 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C804 -ENCODING 51204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -17 -31 -49 -85 -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR C805 -ENCODING 51205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -11 -17 -69 -85 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C806 -ENCODING 51206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -37 -49 -85 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C807 -ENCODING 51207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -11 -17 -69 -85 -00 -7E -40 -7E -ENDCHAR -STARTCHAR C808 -ENCODING 51208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -17 -79 -85 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C809 -ENCODING 51209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -37 -49 -85 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR C80A -ENCODING 51210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -17 -69 -85 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C80B -ENCODING 51211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -37 -49 -85 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C80C -ENCODING 51212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -37 -49 -85 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C80D -ENCODING 51213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -37 -49 -85 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C80E -ENCODING 51214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -37 -49 -85 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C80F -ENCODING 51215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -37 -49 -85 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR C810 -ENCODING 51216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -17 -11 -69 -85 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C811 -ENCODING 51217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -17 -31 -69 -85 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C812 -ENCODING 51218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1100 -1700 -6900 -8500 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C813 -ENCODING 51219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -17 -31 -69 -85 -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR C814 -ENCODING 51220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1100 -1700 -6900 -8500 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C815 -ENCODING 51221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -17 -31 -49 -85 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C816 -ENCODING 51222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1700 -3100 -4900 -8500 -0000 -3F00 -0200 -0C00 -7380 -ENDCHAR -STARTCHAR C817 -ENCODING 51223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -3700 -4900 -8500 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C818 -ENCODING 51224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -11 -17 -69 -85 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C819 -ENCODING 51225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -37 -49 -85 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR C81A -ENCODING 51226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -11 -17 -69 -85 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C81B -ENCODING 51227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -37 -49 -85 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C81C -ENCODING 51228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -0A80 -1680 -1280 -2A80 -4A80 -8680 -0280 -0280 -0280 -ENDCHAR -STARTCHAR C81D -ENCODING 51229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -2D -25 -D5 -8D -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C81E -ENCODING 51230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -2D -55 -8D -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C81F -ENCODING 51231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -2D00 -5500 -8D00 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C820 -ENCODING 51232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -2D00 -6500 -D500 -8D00 -0500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C821 -ENCODING 51233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -2D00 -5500 -8D00 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C822 -ENCODING 51234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C823 -ENCODING 51235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -2D -55 -8D -00 -3F -40 -7F -ENDCHAR -STARTCHAR C824 -ENCODING 51236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -2D -55 -8D -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C825 -ENCODING 51237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C826 -ENCODING 51238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C827 -ENCODING 51239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C828 -ENCODING 51240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C829 -ENCODING 51241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C82A -ENCODING 51242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C82B -ENCODING 51243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C82C -ENCODING 51244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -2D -25 -D5 -8D -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C82D -ENCODING 51245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -2D -25 -D5 -8D -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR C82E -ENCODING 51246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -2D00 -5500 -8D00 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C82F -ENCODING 51247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -2D00 -2500 -D500 -8D00 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR C830 -ENCODING 51248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -2D00 -5500 -8D00 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C831 -ENCODING 51249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -2D -25 -D5 -8D -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C832 -ENCODING 51250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -2D00 -5500 -8D00 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C833 -ENCODING 51251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -2500 -2D00 -D500 -0100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C834 -ENCODING 51252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -2D -55 -8D -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C835 -ENCODING 51253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C836 -ENCODING 51254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -2D -55 -8D -00 -3F -12 -3F -ENDCHAR -STARTCHAR C837 -ENCODING 51255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -25 -2D -D5 -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C838 -ENCODING 51256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -17 -11 -37 -71 -C9 -85 -01 -01 -01 -ENDCHAR -STARTCHAR C839 -ENCODING 51257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -17 -11 -6B -85 -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR C83A -ENCODING 51258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -17 -11 -6B -85 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C83B -ENCODING 51259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1700 -1100 -6B00 -8500 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C83C -ENCODING 51260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -37 -49 -89 -01 -41 -40 -40 -3F -ENDCHAR -STARTCHAR C83D -ENCODING 51261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -17 -11 -6B -85 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C83E -ENCODING 51262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C83F -ENCODING 51263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -17 -11 -6B -85 -00 -7E -40 -7E -ENDCHAR -STARTCHAR C840 -ENCODING 51264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -77 -8D -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C841 -ENCODING 51265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR C842 -ENCODING 51266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C843 -ENCODING 51267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C844 -ENCODING 51268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C845 -ENCODING 51269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C846 -ENCODING 51270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C847 -ENCODING 51271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR C848 -ENCODING 51272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -37 -49 -85 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C849 -ENCODING 51273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -37 -49 -85 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C84A -ENCODING 51274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1700 -1100 -6B00 -8500 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C84B -ENCODING 51275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -17 -11 -6B -85 -00 -08 -14 -63 -ENDCHAR -STARTCHAR C84C -ENCODING 51276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0F00 -1100 -3700 -4900 -8500 -0100 -2200 -3200 -7500 -4C80 -ENDCHAR -STARTCHAR C84D -ENCODING 51277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -11 -37 -49 -85 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C84E -ENCODING 51278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1700 -1100 -6B00 -8500 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR C84F -ENCODING 51279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1300 -3700 -4900 -8500 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C850 -ENCODING 51280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -17 -11 -6B -85 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C851 -ENCODING 51281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR C852 -ENCODING 51282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -17 -11 -6B -85 -00 -3F -12 -3F -ENDCHAR -STARTCHAR C853 -ENCODING 51283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -13 -37 -49 -85 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C854 -ENCODING 51284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -1D -25 -2D -55 -95 -8D -05 -05 -05 -ENDCHAR -STARTCHAR C855 -ENCODING 51285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -25 -5D -8D -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C856 -ENCODING 51286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -25 -5D -8D -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C857 -ENCODING 51287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -2500 -5D00 -8D00 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C858 -ENCODING 51288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -25 -6D -95 -05 -01 -20 -3F -ENDCHAR -STARTCHAR C859 -ENCODING 51289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -2500 -5D00 -8D00 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C85A -ENCODING 51290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR C85B -ENCODING 51291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -25 -5D -8D -00 -3F -40 -7F -ENDCHAR -STARTCHAR C85C -ENCODING 51292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C85D -ENCODING 51293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR C85E -ENCODING 51294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR C85F -ENCODING 51295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR C860 -ENCODING 51296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C861 -ENCODING 51297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR C862 -ENCODING 51298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C863 -ENCODING 51299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR C864 -ENCODING 51300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -25 -5D -8D -00 -3F -41 -7F -ENDCHAR -STARTCHAR C865 -ENCODING 51301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -25 -5D -8D -00 -21 -3F -3F -ENDCHAR -STARTCHAR C866 -ENCODING 51302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -2500 -5D00 -8D00 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR C867 -ENCODING 51303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -2D -55 -8D -00 -08 -14 -63 -ENDCHAR -STARTCHAR C868 -ENCODING 51304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -2500 -5D00 -8D00 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C869 -ENCODING 51305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -2D -55 -8D -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR C86A -ENCODING 51306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -2500 -5D00 -8D00 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR C86B -ENCODING 51307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -2D00 -2D00 -D500 -0100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR C86C -ENCODING 51308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -25 -5D -8D -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C86D -ENCODING 51309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C86E -ENCODING 51310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -25 -5D -8D -00 -3F -12 -3F -ENDCHAR -STARTCHAR C86F -ENCODING 51311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -2D -2D -D5 -01 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C870 -ENCODING 51312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F00 -0100 -0200 -0C00 -3300 -6480 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR C871 -ENCODING 51313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0400 -0400 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR C872 -ENCODING 51314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -0C -77 -08 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR C873 -ENCODING 51315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7E00 -0C00 -7700 -0800 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR C874 -ENCODING 51316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0300 -0C00 -7380 -0400 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C875 -ENCODING 51317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -0C -77 -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C876 -ENCODING 51318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C877 -ENCODING 51319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -0C -77 -08 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR C878 -ENCODING 51320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0C00 -7380 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C879 -ENCODING 51321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C87A -ENCODING 51322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -0000 -3B80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR C87B -ENCODING 51323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR C87C -ENCODING 51324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C87D -ENCODING 51325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C87E -ENCODING 51326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR C87F -ENCODING 51327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR C880 -ENCODING 51328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C881 -ENCODING 51329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C882 -ENCODING 51330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -0C -77 -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR C883 -ENCODING 51331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0400 -FFC0 -0000 -0400 -0C00 -1300 -6180 -ENDCHAR -STARTCHAR C884 -ENCODING 51332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -0C -77 -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR C885 -ENCODING 51333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C886 -ENCODING 51334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0400 -FFC0 -0000 -3F00 -0100 -0E00 -7180 -ENDCHAR -STARTCHAR C887 -ENCODING 51335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -0000 -1E00 -0000 -3F00 -0E00 -7180 -ENDCHAR -STARTCHAR C888 -ENCODING 51336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -0C -77 -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR C889 -ENCODING 51337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0E00 -7180 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR C88A -ENCODING 51338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -0C -77 -08 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR C88B -ENCODING 51339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0C00 -7380 -0400 -FFC0 -0000 -1E00 -0000 -3F80 -1100 -1E00 -ENDCHAR -STARTCHAR C88C -ENCODING 51340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1880 -2C80 -42C0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C88D -ENCODING 51341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0880 -3C80 -52C0 -1080 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C88E -ENCODING 51342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -3F00 -0880 -0880 -ENDCHAR -STARTCHAR C88F -ENCODING 51343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -3900 -0900 -0A80 -0800 -ENDCHAR -STARTCHAR C890 -ENCODING 51344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3C80 -0C80 -1C80 -62C0 -1080 -FE80 -0000 -2000 -3F00 -ENDCHAR -STARTCHAR C891 -ENCODING 51345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C892 -ENCODING 51346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C893 -ENCODING 51347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -3F80 -2000 -3F00 -ENDCHAR -STARTCHAR C894 -ENCODING 51348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -1880 -66C0 -1080 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C895 -ENCODING 51349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C896 -ENCODING 51350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C897 -ENCODING 51351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR C898 -ENCODING 51352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C899 -ENCODING 51353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR C89A -ENCODING 51354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR C89B -ENCODING 51355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR C89C -ENCODING 51356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR C89D -ENCODING 51357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1880 -66C0 -1080 -FE80 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C89E -ENCODING 51358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -0900 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR C89F -ENCODING 51359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1880 -66C0 -1080 -FE80 -0080 -0400 -0600 -1B00 -2080 -ENDCHAR -STARTCHAR C8A0 -ENCODING 51360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -1100 -1100 -2A80 -4400 -ENDCHAR -STARTCHAR C8A1 -ENCODING 51361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -1880 -66C0 -1080 -FE80 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C8A2 -ENCODING 51362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -1F00 -0300 -1F80 -2000 -ENDCHAR -STARTCHAR C8A3 -ENCODING 51363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR C8A4 -ENCODING 51364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -3F00 -1F80 -0080 -ENDCHAR -STARTCHAR C8A5 -ENCODING 51365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR C8A6 -ENCODING 51366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3C80 -0880 -7EC0 -1080 -FE80 -0000 -3F80 -1100 -3F80 -ENDCHAR -STARTCHAR C8A7 -ENCODING 51367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -0880 -76C0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR C8A8 -ENCODING 51368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -1280 -6A80 -8780 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR C8A9 -ENCODING 51369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -25 -DF -25 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C8AA -ENCODING 51370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -25 -DF -25 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C8AB -ENCODING 51371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -2500 -DF00 -2500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C8AC -ENCODING 51372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -75 -8F -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR C8AD -ENCODING 51373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -2500 -DF00 -2500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C8AE -ENCODING 51374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR C8AF -ENCODING 51375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -DF -25 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR C8B0 -ENCODING 51376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C8B1 -ENCODING 51377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR C8B2 -ENCODING 51378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR C8B3 -ENCODING 51379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C8B4 -ENCODING 51380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR C8B5 -ENCODING 51381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C8B6 -ENCODING 51382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C8B7 -ENCODING 51383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR C8B8 -ENCODING 51384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -DF -25 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR C8B9 -ENCODING 51385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -DF -25 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR C8BA -ENCODING 51386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -2500 -DF00 -2500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C8BB -ENCODING 51387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -DF -25 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR C8BC -ENCODING 51388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7A80 -0A80 -3280 -4F80 -1280 -FE80 -0000 -1100 -1100 -3A80 -2640 -ENDCHAR -STARTCHAR C8BD -ENCODING 51389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -3280 -4F80 -1280 -FE80 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C8BE -ENCODING 51390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -2500 -DF00 -2500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C8BF -ENCODING 51391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR C8C0 -ENCODING 51392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -25 -DF -25 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C8C1 -ENCODING 51393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C8C2 -ENCODING 51394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -DF -25 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR C8C3 -ENCODING 51395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -1280 -6F80 -1280 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR C8C4 -ENCODING 51396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -1880 -2C80 -4280 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C8C5 -ENCODING 51397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -21 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C8C6 -ENCODING 51398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -21 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C8C7 -ENCODING 51399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -FD00 -2100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C8C8 -ENCODING 51400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -09 -31 -CD -21 -21 -FF -01 -41 -40 -7F -ENDCHAR -STARTCHAR C8C9 -ENCODING 51401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -21 -FD -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C8CA -ENCODING 51402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C8CB -ENCODING 51403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -FD -21 -FD -00 -3F -40 -7E -ENDCHAR -STARTCHAR C8CC -ENCODING 51404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -31 -CD -21 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR C8CD -ENCODING 51405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR C8CE -ENCODING 51406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR C8CF -ENCODING 51407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C8D0 -ENCODING 51408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C8D1 -ENCODING 51409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C8D2 -ENCODING 51410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR C8D3 -ENCODING 51411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR C8D4 -ENCODING 51412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -09 -31 -CD -21 -FF -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR C8D5 -ENCODING 51413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -09 -31 -CD -21 -FF -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR C8D6 -ENCODING 51414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -21 -FD -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR C8D7 -ENCODING 51415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -09 -31 -CD -21 -FF -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR C8D8 -ENCODING 51416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -21 -FD -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C8D9 -ENCODING 51417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -09 -31 -CD -21 -FF -00 -3E -41 -41 -3E -ENDCHAR -STARTCHAR C8DA -ENCODING 51418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -FD00 -2100 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C8DB -ENCODING 51419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -ED00 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C8DC -ENCODING 51420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -21 -FD -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR C8DD -ENCODING 51421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR C8DE -ENCODING 51422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -FD -21 -FD -00 -7F -12 -3F -ENDCHAR -STARTCHAR C8DF -ENCODING 51423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C8E0 -ENCODING 51424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F00 -0100 -0200 -0400 -1B00 -6080 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR C8E1 -ENCODING 51425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -1200 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C8E2 -ENCODING 51426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -0C -77 -24 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR C8E3 -ENCODING 51427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7E00 -0C00 -7700 -2400 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR C8E4 -ENCODING 51428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -1200 -1200 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C8E5 -ENCODING 51429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -0C -77 -24 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C8E6 -ENCODING 51430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR C8E7 -ENCODING 51431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -0C -77 -24 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR C8E8 -ENCODING 51432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -3F00 -0080 -3F00 -3F00 -ENDCHAR -STARTCHAR C8E9 -ENCODING 51433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C8EA -ENCODING 51434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C8EB -ENCODING 51435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR C8EC -ENCODING 51436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C8ED -ENCODING 51437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C8EE -ENCODING 51438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR C8EF -ENCODING 51439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR C8F0 -ENCODING 51440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -0C -77 -24 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR C8F1 -ENCODING 51441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -0C -77 -24 -FF -00 -41 -7E -7F -ENDCHAR -STARTCHAR C8F2 -ENCODING 51442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -0C -77 -24 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR C8F3 -ENCODING 51443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -0C -77 -24 -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR C8F4 -ENCODING 51444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -0C -77 -24 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR C8F5 -ENCODING 51445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -1200 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C8F6 -ENCODING 51446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -0C -77 -24 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR C8F7 -ENCODING 51447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR C8F8 -ENCODING 51448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -0C -77 -24 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR C8F9 -ENCODING 51449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR C8FA -ENCODING 51450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -0C -77 -24 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR C8FB -ENCODING 51451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0E00 -7180 -1200 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR C8FC -ENCODING 51452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0300 -0400 -1B00 -6080 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR C8FD -ENCODING 51453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C8FE -ENCODING 51454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C8FF -ENCODING 51455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C900 -ENCODING 51456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR C901 -ENCODING 51457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C902 -ENCODING 51458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR C903 -ENCODING 51459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -0400 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C904 -ENCODING 51460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0C00 -7380 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C905 -ENCODING 51461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0C00 -7380 -0000 -FFC0 -0400 -3F80 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C906 -ENCODING 51462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0C00 -7380 -0000 -FFC0 -0400 -3F80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR C907 -ENCODING 51463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR C908 -ENCODING 51464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR C909 -ENCODING 51465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR C90A -ENCODING 51466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR C90B -ENCODING 51467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR C90C -ENCODING 51468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C90D -ENCODING 51469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0000 -FFC0 -0400 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C90E -ENCODING 51470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C90F -ENCODING 51471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0000 -FFC0 -0400 -0400 -0C00 -1300 -6080 -ENDCHAR -STARTCHAR C910 -ENCODING 51472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR C911 -ENCODING 51473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C912 -ENCODING 51474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -0C -73 -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR C913 -ENCODING 51475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR C914 -ENCODING 51476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR C915 -ENCODING 51477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -1C -E3 -00 -FF -08 -7E -7E -7E -ENDCHAR -STARTCHAR C916 -ENCODING 51478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C917 -ENCODING 51479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR C918 -ENCODING 51480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -1880 -6680 -0080 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR C919 -ENCODING 51481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR C91A -ENCODING 51482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C91B -ENCODING 51483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C91C -ENCODING 51484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -19 -79 -85 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR C91D -ENCODING 51485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C91E -ENCODING 51486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -46 -4F -49 -36 -ENDCHAR -STARTCHAR C91F -ENCODING 51487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -ED -DD -27 -21 -3F -40 -7E -ENDCHAR -STARTCHAR C920 -ENCODING 51488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -7F -3F -40 -3F -ENDCHAR -STARTCHAR C921 -ENCODING 51489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -77 -31 -41 -71 -ENDCHAR -STARTCHAR C922 -ENCODING 51490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -77 -79 -49 -77 -ENDCHAR -STARTCHAR C923 -ENCODING 51491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -75 -77 -45 -77 -ENDCHAR -STARTCHAR C924 -ENCODING 51492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -52 -72 -85 -68 -ENDCHAR -STARTCHAR C925 -ENCODING 51493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -77 -77 -44 -77 -ENDCHAR -STARTCHAR C926 -ENCODING 51494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C927 -ENCODING 51495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -76 -37 -49 -76 -ENDCHAR -STARTCHAR C928 -ENCODING 51496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -ED -DD -27 -21 -7F -41 -7F -ENDCHAR -STARTCHAR C929 -ENCODING 51497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -ED -DD -27 -21 -41 -7F -7F -ENDCHAR -STARTCHAR C92A -ENCODING 51498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR C92B -ENCODING 51499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -ED -DD -27 -21 -08 -14 -63 -ENDCHAR -STARTCHAR C92C -ENCODING 51500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0F00 -3100 -CD00 -0100 -FD00 -2000 -2200 -2200 -5500 -C880 -ENDCHAR -STARTCHAR C92D -ENCODING 51501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C92E -ENCODING 51502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -ED00 -DD00 -2700 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C92F -ENCODING 51503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -ED00 -DD00 -2300 -3D00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C930 -ENCODING 51504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C931 -ENCODING 51505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -27 -21 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C932 -ENCODING 51506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -ED -DD -27 -21 -3F -12 -3F -ENDCHAR -STARTCHAR C933 -ENCODING 51507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -DD -23 -3D -23 -1C -22 -1E -ENDCHAR -STARTCHAR C934 -ENCODING 51508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -3280 -CE80 -0280 -FE80 -1280 -1680 -1280 -1280 -0280 -ENDCHAR -STARTCHAR C935 -ENCODING 51509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C936 -ENCODING 51510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C937 -ENCODING 51511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -2500 -D500 -1D00 -E500 -2900 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C938 -ENCODING 51512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -1280 -7A80 -0280 -FA80 -1680 -0080 -2000 -3F80 -ENDCHAR -STARTCHAR C939 -ENCODING 51513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -2500 -D500 -1D00 -E500 -2900 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR C93A -ENCODING 51514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR C93B -ENCODING 51515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -3F -40 -7F -ENDCHAR -STARTCHAR C93C -ENCODING 51516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -0F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR C93D -ENCODING 51517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -0F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR C93E -ENCODING 51518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR C93F -ENCODING 51519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -0E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR C940 -ENCODING 51520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -2900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR C941 -ENCODING 51521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -0F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR C942 -ENCODING 51522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -2B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR C943 -ENCODING 51523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR C944 -ENCODING 51524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -3F -41 -7F -ENDCHAR -STARTCHAR C945 -ENCODING 51525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -41 -7F -7F -ENDCHAR -STARTCHAR C946 -ENCODING 51526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -2500 -D500 -1D00 -E500 -2900 -4200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C947 -ENCODING 51527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -08 -1C -63 -ENDCHAR -STARTCHAR C948 -ENCODING 51528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -02 -22 -55 -08 -ENDCHAR -STARTCHAR C949 -ENCODING 51529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -3E -41 -61 -1E -ENDCHAR -STARTCHAR C94A -ENCODING 51530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -2500 -D500 -1D00 -E500 -2900 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C94B -ENCODING 51531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR C94C -ENCODING 51532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -3F -01 -3F -01 -ENDCHAR -STARTCHAR C94D -ENCODING 51533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR C94E -ENCODING 51534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -25 -D5 -1D -E5 -29 -3F -12 -3F -ENDCHAR -STARTCHAR C94F -ENCODING 51535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3280 -4A80 -FE80 -1680 -1E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR C950 -ENCODING 51536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3C80 -0480 -0880 -1880 -6680 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR C951 -ENCODING 51537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -09 -31 -CD -01 -FD -20 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C952 -ENCODING 51538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR C953 -ENCODING 51539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR C954 -ENCODING 51540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -09 -31 -CD -01 -FD -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR C955 -ENCODING 51541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR C956 -ENCODING 51542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR C957 -ENCODING 51543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -ED -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR C958 -ENCODING 51544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -31 -CD -01 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR C959 -ENCODING 51545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR C95A -ENCODING 51546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR C95B -ENCODING 51547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR C95C -ENCODING 51548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR C95D -ENCODING 51549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR C95E -ENCODING 51550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR C95F -ENCODING 51551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR C960 -ENCODING 51552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -09 -31 -CD -01 -FD -20 -7F -41 -41 -7F -ENDCHAR -STARTCHAR C961 -ENCODING 51553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -09 -31 -CD -01 -FD -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR C962 -ENCODING 51554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR C963 -ENCODING 51555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7900 -0900 -3100 -CD00 -0100 -FF00 -2100 -2800 -0C00 -3600 -6180 -ENDCHAR -STARTCHAR C964 -ENCODING 51556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C965 -ENCODING 51557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C966 -ENCODING 51558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -ED00 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C967 -ENCODING 51559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -ED00 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C968 -ENCODING 51560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR C969 -ENCODING 51561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR C96A -ENCODING 51562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -ED -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR C96B -ENCODING 51563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C96C -ENCODING 51564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0300 -0400 -1B00 -6080 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR C96D -ENCODING 51565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR C96E -ENCODING 51566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C96F -ENCODING 51567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C970 -ENCODING 51568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0000 -FFC0 -1200 -3200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR C971 -ENCODING 51569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C972 -ENCODING 51570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR C973 -ENCODING 51571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C974 -ENCODING 51572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0C00 -7380 -0000 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C975 -ENCODING 51573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR C976 -ENCODING 51574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR C977 -ENCODING 51575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR C978 -ENCODING 51576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR C979 -ENCODING 51577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR C97A -ENCODING 51578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR C97B -ENCODING 51579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR C97C -ENCODING 51580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0300 -0C00 -7380 -0000 -FFC0 -1200 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C97D -ENCODING 51581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR C97E -ENCODING 51582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C97F -ENCODING 51583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -1400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR C980 -ENCODING 51584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR C981 -ENCODING 51585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR C982 -ENCODING 51586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C983 -ENCODING 51587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR C984 -ENCODING 51588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR C985 -ENCODING 51589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -1C -E3 -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR C986 -ENCODING 51590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0600 -3980 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C987 -ENCODING 51591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR C988 -ENCODING 51592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F00 -0100 -0200 -0C00 -1300 -6080 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR C989 -ENCODING 51593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7380 -0000 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C98A -ENCODING 51594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3B80 -0000 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR C98B -ENCODING 51595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3B80 -0000 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR C98C -ENCODING 51596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0300 -0C00 -7380 -0000 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C98D -ENCODING 51597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3B80 -0000 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR C98E -ENCODING 51598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C98F -ENCODING 51599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0600 -3B80 -0000 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR C990 -ENCODING 51600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0E00 -7180 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C991 -ENCODING 51601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR C992 -ENCODING 51602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR C993 -ENCODING 51603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR C994 -ENCODING 51604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C995 -ENCODING 51605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR C996 -ENCODING 51606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR C997 -ENCODING 51607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR C998 -ENCODING 51608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C999 -ENCODING 51609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7380 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C99A -ENCODING 51610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3B80 -0000 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR C99B -ENCODING 51611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0200 -0E00 -7180 -0000 -FFC0 -0000 -0400 -0C00 -1300 -6180 -ENDCHAR -STARTCHAR C99C -ENCODING 51612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -0600 -3B80 -0000 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR C99D -ENCODING 51613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0100 -0E00 -7180 -0000 -FFC0 -0000 -1F00 -2100 -2100 -1F00 -ENDCHAR -STARTCHAR C99E -ENCODING 51614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -0600 -3B80 -0000 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR C99F -ENCODING 51615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR C9A0 -ENCODING 51616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -0600 -3B80 -0000 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR C9A1 -ENCODING 51617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -1C -E3 -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR C9A2 -ENCODING 51618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -0600 -3B80 -0000 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR C9A3 -ENCODING 51619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -1C -E3 -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR C9A4 -ENCODING 51620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -31 -59 -85 -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR C9A5 -ENCODING 51621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -01 -FF -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C9A6 -ENCODING 51622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -01 -FF -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C9A7 -ENCODING 51623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -FD00 -0100 -FF00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C9A8 -ENCODING 51624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -19 -39 -C5 -05 -F9 -01 -40 -7F -ENDCHAR -STARTCHAR C9A9 -ENCODING 51625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -01 -FF -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR C9AA -ENCODING 51626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR C9AB -ENCODING 51627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -FD -01 -FF -01 -3F -40 -7E -ENDCHAR -STARTCHAR C9AC -ENCODING 51628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -7E -01 -7F -40 -3F -ENDCHAR -STARTCHAR C9AD -ENCODING 51629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR C9AE -ENCODING 51630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR C9AF -ENCODING 51631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C9B0 -ENCODING 51632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR C9B1 -ENCODING 51633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C9B2 -ENCODING 51634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR C9B3 -ENCODING 51635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR C9B4 -ENCODING 51636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -FD -01 -FF -01 -7F -41 -7F -ENDCHAR -STARTCHAR C9B5 -ENCODING 51637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -FD -01 -FF -01 -41 -7F -7F -ENDCHAR -STARTCHAR C9B6 -ENCODING 51638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -01 -FF -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR C9B7 -ENCODING 51639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -FD -01 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR C9B8 -ENCODING 51640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -01 -FF -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR C9B9 -ENCODING 51641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -01 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR C9BA -ENCODING 51642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -FD00 -0100 -FF00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR C9BB -ENCODING 51643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -ED00 -0100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR C9BC -ENCODING 51644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -FD -01 -FF -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR C9BD -ENCODING 51645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR C9BE -ENCODING 51646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -11 -FD -01 -FF -01 -7F -12 -3F -ENDCHAR -STARTCHAR C9BF -ENCODING 51647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -ED -01 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR C9C0 -ENCODING 51648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -11 -31 -31 -C9 -85 -01 -01 -01 -ENDCHAR -STARTCHAR C9C1 -ENCODING 51649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -31 -49 -85 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR C9C2 -ENCODING 51650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -11 -11 -69 -85 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR C9C3 -ENCODING 51651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1100 -1100 -6900 -8500 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR C9C4 -ENCODING 51652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -31 -49 -85 -01 -20 -20 -20 -3F -ENDCHAR -STARTCHAR C9C5 -ENCODING 51653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -11 -11 -69 -85 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR C9C6 -ENCODING 51654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -31 -49 -85 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR C9C7 -ENCODING 51655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -31 -69 -85 -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR C9C8 -ENCODING 51656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -69 -85 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR C9C9 -ENCODING 51657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -31 -49 -85 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR C9CA -ENCODING 51658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -69 -85 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C9CB -ENCODING 51659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -31 -49 -85 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR C9CC -ENCODING 51660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -31 -49 -85 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR C9CD -ENCODING 51661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -31 -49 -85 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR C9CE -ENCODING 51662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -31 -49 -85 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR C9CF -ENCODING 51663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -31 -49 -85 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR C9D0 -ENCODING 51664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -31 -49 -85 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR C9D1 -ENCODING 51665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -31 -49 -85 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR C9D2 -ENCODING 51666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1100 -1100 -6900 -8500 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C9D3 -ENCODING 51667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -11 -31 -49 -85 -08 -14 -36 -41 -ENDCHAR -STARTCHAR C9D4 -ENCODING 51668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1100 -1100 -6900 -8500 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR C9D5 -ENCODING 51669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -31 -49 -85 -01 -3E -21 -21 -3E -ENDCHAR -STARTCHAR C9D6 -ENCODING 51670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -3100 -4900 -8500 -0000 -3F00 -0200 -0C00 -7380 -ENDCHAR -STARTCHAR C9D7 -ENCODING 51671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -1100 -3100 -4900 -8500 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR C9D8 -ENCODING 51672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -11 -11 -69 -85 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR C9D9 -ENCODING 51673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -69 -85 -00 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR C9DA -ENCODING 51674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -11 -31 -49 -85 -00 -7F -12 -12 -7F -ENDCHAR -STARTCHAR C9DB -ENCODING 51675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -11 -31 -49 -85 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR C9DC -ENCODING 51676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -2480 -2480 -5CC0 -4A80 -9280 -1080 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C9DD -ENCODING 51677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -3480 -5AC0 -8A80 -1080 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C9DE -ENCODING 51678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -4900 -6980 -9500 -2100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR C9DF -ENCODING 51679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -4900 -6980 -9500 -2100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR C9E0 -ENCODING 51680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -2480 -54C0 -8A80 -1080 -0080 -2080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR C9E1 -ENCODING 51681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -4900 -6980 -9500 -2100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR C9E2 -ENCODING 51682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -24C0 -5A80 -8880 -1000 -0300 -2000 -2780 -2480 -3B80 -ENDCHAR -STARTCHAR C9E3 -ENCODING 51683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -4900 -6980 -9500 -2100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR C9E4 -ENCODING 51684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -34C0 -CA80 -1080 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR C9E5 -ENCODING 51685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -34C0 -CA80 -1000 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR C9E6 -ENCODING 51686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -34C0 -CA80 -1000 -3B00 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR C9E7 -ENCODING 51687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -34C0 -CA80 -1080 -0000 -3C80 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR C9E8 -ENCODING 51688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -34C0 -CA80 -1000 -3900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR C9E9 -ENCODING 51689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -34C0 -CA80 -1000 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR C9EA -ENCODING 51690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -34C0 -CA80 -1000 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR C9EB -ENCODING 51691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -34C0 -CA80 -1000 -3B00 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR C9EC -ENCODING 51692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -24C0 -5A80 -8A80 -1080 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR C9ED -ENCODING 51693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -24C0 -5A80 -8A80 -1080 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR C9EE -ENCODING 51694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -4900 -6980 -9500 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR C9EF -ENCODING 51695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -1480 -2480 -34C0 -4A80 -8A80 -1080 -0400 -0400 -1B00 -20C0 -ENDCHAR -STARTCHAR C9F0 -ENCODING 51696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -24C0 -5A80 -8A80 -1080 -0000 -1100 -1100 -2A80 -4440 -ENDCHAR -STARTCHAR C9F1 -ENCODING 51697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -2480 -5AC0 -8A80 -1080 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR C9F2 -ENCODING 51698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -4900 -6980 -9500 -2100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR C9F3 -ENCODING 51699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -34C0 -CA80 -1000 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR C9F4 -ENCODING 51700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -4900 -6980 -9500 -2100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR C9F5 -ENCODING 51701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -34C0 -CA80 -1000 -3F80 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR C9F6 -ENCODING 51702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -4900 -6980 -9500 -2100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR C9F7 -ENCODING 51703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -34C0 -CA80 -1000 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR C9F8 -ENCODING 51704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2980 -2980 -2980 -5580 -5580 -9580 -2180 -0180 -0180 -0180 -ENDCHAR -STARTCHAR C9F9 -ENCODING 51705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2580 -2980 -5580 -9580 -2180 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR C9FA -ENCODING 51706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -53 -AD -25 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR C9FB -ENCODING 51707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -5300 -AD00 -2500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR C9FC -ENCODING 51708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7980 -2580 -2980 -5D80 -9580 -2180 -0180 -1180 -1000 -1000 -1FC0 -ENDCHAR -STARTCHAR C9FD -ENCODING 51709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -5300 -AD00 -2500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR C9FE -ENCODING 51710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR C9FF -ENCODING 51711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -55 -53 -AD -25 -00 -3F -40 -7F -ENDCHAR -STARTCHAR CA00 -ENCODING 51712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2980 -6980 -9580 -2180 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CA01 -ENCODING 51713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR CA02 -ENCODING 51714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR CA03 -ENCODING 51715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR CA04 -ENCODING 51716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR CA05 -ENCODING 51717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR CA06 -ENCODING 51718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR CA07 -ENCODING 51719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR CA08 -ENCODING 51720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7D80 -2580 -2980 -5980 -9580 -2180 -0000 -1F80 -2080 -2080 -1F80 -ENDCHAR -STARTCHAR CA09 -ENCODING 51721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2580 -2980 -5980 -9580 -2180 -0000 -1080 -1F80 -1080 -1F80 -ENDCHAR -STARTCHAR CA0A -ENCODING 51722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -5300 -AD00 -2500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR CA0B -ENCODING 51723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7980 -2580 -2980 -2980 -5580 -9580 -2080 -0400 -0600 -0B00 -30C0 -ENDCHAR -STARTCHAR CA0C -ENCODING 51724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7980 -2580 -2980 -5580 -9580 -2180 -0000 -0900 -1900 -1A80 -2640 -ENDCHAR -STARTCHAR CA0D -ENCODING 51725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2580 -2980 -5580 -9580 -2180 -0000 -1F00 -1080 -1080 -1F00 -ENDCHAR -STARTCHAR CA0E -ENCODING 51726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -5300 -AD00 -2500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR CA0F -ENCODING 51727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR CA10 -ENCODING 51728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -53 -AD -25 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CA11 -ENCODING 51729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CA12 -ENCODING 51730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -55 -53 -AD -25 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CA13 -ENCODING 51731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6980 -9680 -2080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR CA14 -ENCODING 51732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -24C0 -2480 -5C80 -4AC0 -9280 -1080 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CA15 -ENCODING 51733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR CA16 -ENCODING 51734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR CA17 -ENCODING 51735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR CA18 -ENCODING 51736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -24C0 -5C80 -8A80 -10C0 -0080 -2080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CA19 -ENCODING 51737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -4980 -6900 -9580 -2100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR CA1A -ENCODING 51738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CA1B -ENCODING 51739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR CA1C -ENCODING 51740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -3F00 -0080 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR CA1D -ENCODING 51741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CA1E -ENCODING 51742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -3B00 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CA1F -ENCODING 51743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -3400 -0C80 -3F80 -4480 -3F00 -ENDCHAR -STARTCHAR CA20 -ENCODING 51744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -3900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CA21 -ENCODING 51745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR CA22 -ENCODING 51746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR CA23 -ENCODING 51747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -3B00 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR CA24 -ENCODING 51748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR CA25 -ENCODING 51749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR CA26 -ENCODING 51750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CA27 -ENCODING 51751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR CA28 -ENCODING 51752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR CA29 -ENCODING 51753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -6C80 -2480 -24C0 -5A80 -8AC0 -1080 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR CA2A -ENCODING 51754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR CA2B -ENCODING 51755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR CA2C -ENCODING 51756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR CA2D -ENCODING 51757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -3F80 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR CA2E -ENCODING 51758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -D900 -4980 -6900 -9580 -2100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR CA2F -ENCODING 51759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -24C0 -3480 -CAC0 -1000 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR CA30 -ENCODING 51760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -2B80 -2A80 -5A80 -9580 -2280 -0280 -0280 -0080 -ENDCHAR -STARTCHAR CA31 -ENCODING 51761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -53 -55 -AB -25 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CA32 -ENCODING 51762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -53 -55 -AB -25 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CA33 -ENCODING 51763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5300 -5500 -AB00 -2500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR CA34 -ENCODING 51764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2780 -2A80 -5E80 -9380 -2280 -0080 -1000 -1F80 -ENDCHAR -STARTCHAR CA35 -ENCODING 51765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5300 -5500 -AB00 -2500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR CA36 -ENCODING 51766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR CA37 -ENCODING 51767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -53 -55 -AB -25 -00 -3F -40 -7F -ENDCHAR -STARTCHAR CA38 -ENCODING 51768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CA39 -ENCODING 51769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR CA3A -ENCODING 51770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR CA3B -ENCODING 51771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR CA3C -ENCODING 51772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR CA3D -ENCODING 51773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR CA3E -ENCODING 51774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR CA3F -ENCODING 51775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR CA40 -ENCODING 51776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -53 -55 -AB -25 -00 -3F -41 -7F -ENDCHAR -STARTCHAR CA41 -ENCODING 51777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -53 -55 -AB -25 -00 -21 -3F -3F -ENDCHAR -STARTCHAR CA42 -ENCODING 51778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5300 -5500 -AB00 -2500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR CA43 -ENCODING 51779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -53 -55 -AB -25 -01 -08 -14 -63 -ENDCHAR -STARTCHAR CA44 -ENCODING 51780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5300 -5500 -AB00 -2500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CA45 -ENCODING 51781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -53 -55 -AB -25 -0D -33 -41 -21 -1E -ENDCHAR -STARTCHAR CA46 -ENCODING 51782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5300 -5500 -AB00 -2500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR CA47 -ENCODING 51783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR CA48 -ENCODING 51784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -53 -55 -AB -25 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CA49 -ENCODING 51785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CA4A -ENCODING 51786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -53 -55 -AB -25 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CA4B -ENCODING 51787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2980 -6A80 -9580 -2080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR CA4C -ENCODING 51788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -6C80 -2480 -2480 -2780 -5C80 -4A80 -9280 -2080 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CA4D -ENCODING 51789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -49 -6F -95 -95 -21 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CA4E -ENCODING 51790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -4F -69 -95 -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR CA4F -ENCODING 51791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4F00 -6900 -9500 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CA50 -ENCODING 51792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -2480 -2780 -5480 -8A80 -1080 -0080 -2080 -2000 -2000 -1F80 -ENDCHAR -STARTCHAR CA51 -ENCODING 51793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -4F -69 -95 -21 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR CA52 -ENCODING 51794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR CA53 -ENCODING 51795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -4F -69 -95 -21 -00 -7E -40 -7E -ENDCHAR -STARTCHAR CA54 -ENCODING 51796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -2780 -3480 -CA80 -1080 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CA55 -ENCODING 51797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR CA56 -ENCODING 51798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CA57 -ENCODING 51799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR CA58 -ENCODING 51800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR CA59 -ENCODING 51801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR CA5A -ENCODING 51802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CA5B -ENCODING 51803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR CA5C -ENCODING 51804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -49 -4F -B5 -95 -21 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CA5D -ENCODING 51805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -2480 -3780 -4A80 -8A80 -1080 -0000 -2080 -1F80 -2080 -1F80 -ENDCHAR -STARTCHAR CA5E -ENCODING 51806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4F00 -6900 -9500 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CA5F -ENCODING 51807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -1480 -2780 -3480 -4A80 -8A80 -1080 -0400 -0600 -1B00 -20C0 -ENDCHAR -STARTCHAR CA60 -ENCODING 51808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -4900 -4F00 -B500 -9500 -2100 -0000 -2200 -2200 -7500 -C880 -ENDCHAR -STARTCHAR CA61 -ENCODING 51809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -49 -4F -B5 -95 -21 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR CA62 -ENCODING 51810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4F00 -6900 -9500 -2100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR CA63 -ENCODING 51811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4F00 -6900 -9500 -2100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR CA64 -ENCODING 51812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -4F -69 -95 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CA65 -ENCODING 51813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR CA66 -ENCODING 51814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -4F -69 -95 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CA67 -ENCODING 51815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -4F -69 -95 -21 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR CA68 -ENCODING 51816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2980 -2980 -2F80 -5980 -5580 -9580 -2180 -0180 -0180 -0180 -ENDCHAR -STARTCHAR CA69 -ENCODING 51817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -53 -57 -AB -23 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CA6A -ENCODING 51818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -53 -57 -AB -23 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CA6B -ENCODING 51819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5300 -5700 -AB00 -2300 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR CA6C -ENCODING 51820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7980 -2580 -2A80 -5D80 -9180 -2180 -0080 -1000 -1F80 -ENDCHAR -STARTCHAR CA6D -ENCODING 51821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5300 -5700 -AB00 -2300 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR CA6E -ENCODING 51822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR CA6F -ENCODING 51823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -53 -57 -AB -23 -00 -3F -40 -7F -ENDCHAR -STARTCHAR CA70 -ENCODING 51824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CA71 -ENCODING 51825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR CA72 -ENCODING 51826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR CA73 -ENCODING 51827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR CA74 -ENCODING 51828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR CA75 -ENCODING 51829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR CA76 -ENCODING 51830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR CA77 -ENCODING 51831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR CA78 -ENCODING 51832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -53 -57 -AB -23 -00 -3F -41 -7F -ENDCHAR -STARTCHAR CA79 -ENCODING 51833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -53 -57 -AB -23 -00 -21 -3F -3F -ENDCHAR -STARTCHAR CA7A -ENCODING 51834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5300 -5700 -AB00 -2300 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR CA7B -ENCODING 51835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -53 -57 -AB -23 -00 -08 -14 -63 -ENDCHAR -STARTCHAR CA7C -ENCODING 51836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5300 -5700 -AB00 -2300 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CA7D -ENCODING 51837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7980 -2580 -2B80 -6980 -9580 -2180 -0000 -1F00 -1080 -1080 -1F00 -ENDCHAR -STARTCHAR CA7E -ENCODING 51838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5300 -5700 -AB00 -2300 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR CA7F -ENCODING 51839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR CA80 -ENCODING 51840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -53 -57 -AB -23 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CA81 -ENCODING 51841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CA82 -ENCODING 51842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -53 -57 -AB -23 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CA83 -ENCODING 51843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2A80 -6980 -9580 -2080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR CA84 -ENCODING 51844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -6C80 -2480 -2580 -2480 -5D80 -4A80 -9280 -2080 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CA85 -ENCODING 51845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -4B -6B -95 -21 -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR CA86 -ENCODING 51846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -4B -6B -95 -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR CA87 -ENCODING 51847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4B00 -6B00 -9500 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CA88 -ENCODING 51848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7C80 -2580 -2580 -5E80 -8880 -1080 -0000 -1000 -1F80 -ENDCHAR -STARTCHAR CA89 -ENCODING 51849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -4B -6B -95 -21 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR CA8A -ENCODING 51850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR CA8B -ENCODING 51851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -4B -6B -95 -21 -00 -7E -40 -7E -ENDCHAR -STARTCHAR CA8C -ENCODING 51852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CA8D -ENCODING 51853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR CA8E -ENCODING 51854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CA8F -ENCODING 51855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR CA90 -ENCODING 51856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR CA91 -ENCODING 51857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR CA92 -ENCODING 51858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CA93 -ENCODING 51859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR CA94 -ENCODING 51860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -4B -6B -95 -21 -00 -7F -41 -7F -ENDCHAR -STARTCHAR CA95 -ENCODING 51861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -4B -6B -95 -21 -01 -41 -7F -7F -ENDCHAR -STARTCHAR CA96 -ENCODING 51862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4B00 -6B00 -9500 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CA97 -ENCODING 51863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -4B -6B -95 -21 -00 -08 -14 -63 -ENDCHAR -STARTCHAR CA98 -ENCODING 51864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2B00 -4900 -6B00 -9500 -2100 -0000 -2200 -2200 -7500 -C880 -ENDCHAR -STARTCHAR CA99 -ENCODING 51865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -4B -6B -95 -21 -0C -32 -41 -23 -1C -ENDCHAR -STARTCHAR CA9A -ENCODING 51866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4B00 -6B00 -9500 -2100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR CA9B -ENCODING 51867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FB00 -4900 -6F00 -9500 -2100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR CA9C -ENCODING 51868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -4B -6B -95 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CA9D -ENCODING 51869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR CA9E -ENCODING 51870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -4B -6B -95 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CA9F -ENCODING 51871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FB -49 -6F -95 -21 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR CAA0 -ENCODING 51872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2580 -2A80 -2980 -5A80 -9580 -2180 -0180 -0180 -0080 -ENDCHAR -STARTCHAR CAA1 -ENCODING 51873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -57 -55 -AB -23 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CAA2 -ENCODING 51874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -57 -55 -AB -23 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CAA3 -ENCODING 51875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5700 -5500 -AB00 -2300 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR CAA4 -ENCODING 51876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7980 -2680 -2A80 -5D80 -9180 -2180 -0080 -1000 -1F80 -ENDCHAR -STARTCHAR CAA5 -ENCODING 51877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5700 -5500 -AB00 -2300 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR CAA6 -ENCODING 51878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR CAA7 -ENCODING 51879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -57 -55 -AB -23 -00 -3F -40 -7F -ENDCHAR -STARTCHAR CAA8 -ENCODING 51880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CAA9 -ENCODING 51881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -3B80 -0480 -3C80 -2080 -1C00 -ENDCHAR -STARTCHAR CAAA -ENCODING 51882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -3B80 -0680 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR CAAB -ENCODING 51883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -3A00 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR CAAC -ENCODING 51884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -3900 -0900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR CAAD -ENCODING 51885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -3B80 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR CAAE -ENCODING 51886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -3100 -0A80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR CAAF -ENCODING 51887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -3B80 -0F80 -3B80 -2280 -3B00 -ENDCHAR -STARTCHAR CAB0 -ENCODING 51888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -57 -55 -AB -23 -00 -3F -41 -7F -ENDCHAR -STARTCHAR CAB1 -ENCODING 51889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -57 -55 -AB -23 -00 -21 -3F -3F -ENDCHAR -STARTCHAR CAB2 -ENCODING 51890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5700 -5500 -AB00 -2300 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR CAB3 -ENCODING 51891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -57 -55 -AB -23 -00 -08 -14 -63 -ENDCHAR -STARTCHAR CAB4 -ENCODING 51892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5700 -5500 -AB00 -2300 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CAB5 -ENCODING 51893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -57 -55 -AB -23 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR CAB6 -ENCODING 51894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -5700 -5500 -AB00 -2300 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR CAB7 -ENCODING 51895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR CAB8 -ENCODING 51896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -57 -55 -AB -23 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CAB9 -ENCODING 51897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CABA -ENCODING 51898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -57 -55 -AB -23 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CABB -ENCODING 51899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7980 -2B80 -6A80 -9580 -2080 -0E00 -3F80 -0F00 -1100 -0F00 -ENDCHAR -STARTCHAR CABC -ENCODING 51900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7F00 -0900 -1100 -1B00 -2480 -4C80 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR CABD -ENCODING 51901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0900 -3B00 -4480 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CABE -ENCODING 51902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -36 -C9 -08 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR CABF -ENCODING 51903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7600 -3600 -C900 -0800 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR CAC0 -ENCODING 51904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4480 -0400 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CAC1 -ENCODING 51905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -36 -C9 -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR CAC2 -ENCODING 51906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CAC3 -ENCODING 51907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -36 -C9 -08 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR CAC4 -ENCODING 51908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1900 -6680 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CAC5 -ENCODING 51909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CAC6 -ENCODING 51910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CAC7 -ENCODING 51911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CAC8 -ENCODING 51912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CAC9 -ENCODING 51913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR CACA -ENCODING 51914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR CACB -ENCODING 51915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR CACC -ENCODING 51916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4480 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR CACD -ENCODING 51917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4480 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CACE -ENCODING 51918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -36 -C9 -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR CACF -ENCODING 51919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0900 -3B00 -4480 -0400 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR CAD0 -ENCODING 51920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -36 -C9 -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR CAD1 -ENCODING 51921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4480 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR CAD2 -ENCODING 51922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -76 -36 -C9 -08 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR CAD3 -ENCODING 51923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1B00 -6480 -0400 -FFC0 -0000 -1E00 -0000 -3F00 -0E00 -7180 -ENDCHAR -STARTCHAR CAD4 -ENCODING 51924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -76 -36 -C9 -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR CAD5 -ENCODING 51925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR CAD6 -ENCODING 51926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -36 -C9 -08 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR CAD7 -ENCODING 51927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -0400 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR CAD8 -ENCODING 51928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2480 -2480 -DA80 -10C0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CAD9 -ENCODING 51929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -1480 -3480 -4AC0 -1080 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CADA -ENCODING 51930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR CADB -ENCODING 51931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR CADC -ENCODING 51932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7E80 -2480 -5A80 -00C0 -1080 -FE80 -0000 -2000 -3F00 -ENDCHAR -STARTCHAR CADD -ENCODING 51933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR CADE -ENCODING 51934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CADF -ENCODING 51935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR CAE0 -ENCODING 51936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -3480 -5AC0 -1080 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CAE1 -ENCODING 51937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CAE2 -ENCODING 51938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CAE3 -ENCODING 51939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR CAE4 -ENCODING 51940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CAE5 -ENCODING 51941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR CAE6 -ENCODING 51942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR CAE7 -ENCODING 51943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR CAE8 -ENCODING 51944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR CAE9 -ENCODING 51945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR CAEA -ENCODING 51946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR CAEB -ENCODING 51947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR CAEC -ENCODING 51948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -1480 -3480 -4AC0 -1080 -FE80 -0000 -1100 -1100 -2B00 -4480 -ENDCHAR -STARTCHAR CAED -ENCODING 51949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -3E00 -4100 -4200 -3C00 -ENDCHAR -STARTCHAR CAEE -ENCODING 51950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR CAEF -ENCODING 51951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR CAF0 -ENCODING 51952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR CAF1 -ENCODING 51953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR CAF2 -ENCODING 51954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -B580 -2100 -2D00 -D000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR CAF3 -ENCODING 51955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7480 -3480 -5AC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR CAF4 -ENCODING 51956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -2680 -2A80 -DE80 -3180 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR CAF5 -ENCODING 51957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -55 -AF -25 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CAF6 -ENCODING 51958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -55 -AF -25 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CAF7 -ENCODING 51959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -5500 -AF00 -2500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CAF8 -ENCODING 51960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -55 -AD -07 -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR CAF9 -ENCODING 51961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -5500 -AF00 -2500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR CAFA -ENCODING 51962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR CAFB -ENCODING 51963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -55 -AF -25 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR CAFC -ENCODING 51964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CAFD -ENCODING 51965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR CAFE -ENCODING 51966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR CAFF -ENCODING 51967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR CB00 -ENCODING 51968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR CB01 -ENCODING 51969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR CB02 -ENCODING 51970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR CB03 -ENCODING 51971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR CB04 -ENCODING 51972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -55 -AF -25 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR CB05 -ENCODING 51973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -55 -AF -25 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR CB06 -ENCODING 51974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -5500 -AF00 -2500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CB07 -ENCODING 51975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -55 -AF -25 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR CB08 -ENCODING 51976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7E80 -2680 -2A80 -D580 -1280 -FE80 -0000 -1100 -1100 -1A80 -6440 -ENDCHAR -STARTCHAR CB09 -ENCODING 51977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -55 -AF -25 -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR CB0A -ENCODING 51978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -FD00 -5500 -AF00 -2500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CB0B -ENCODING 51979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR CB0C -ENCODING 51980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -55 -AF -25 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CB0D -ENCODING 51981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CB0E -ENCODING 51982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -55 -AF -25 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR CB0F -ENCODING 51983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6E80 -2A80 -D780 -1280 -7E80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR CB10 -ENCODING 51984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -1280 -2480 -DA80 -1080 -0880 -0880 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CB11 -ENCODING 51985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CB12 -ENCODING 51986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -7F -09 -09 -09 -ENDCHAR -STARTCHAR CB13 -ENCODING 51987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4900 -B500 -0100 -3D00 -C100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CB14 -ENCODING 51988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -29 -69 -95 -11 -11 -FF -01 -41 -40 -7F -ENDCHAR -STARTCHAR CB15 -ENCODING 51989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -47 -42 -45 -30 -ENDCHAR -STARTCHAR CB16 -ENCODING 51990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR CB17 -ENCODING 51991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -3F -40 -7E -ENDCHAR -STARTCHAR CB18 -ENCODING 51992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -69 -95 -11 -FF -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR CB19 -ENCODING 51993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR CB1A -ENCODING 51994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR CB1B -ENCODING 51995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR CB1C -ENCODING 51996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR CB1D -ENCODING 51997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR CB1E -ENCODING 51998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR CB1F -ENCODING 51999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR CB20 -ENCODING 52000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -29 -69 -95 -11 -FF -00 -7F -41 -41 -7F -ENDCHAR -STARTCHAR CB21 -ENCODING 52001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -29 -69 -95 -11 -FF -00 -41 -7F -41 -7F -ENDCHAR -STARTCHAR CB22 -ENCODING 52002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -52 -72 -55 -78 -ENDCHAR -STARTCHAR CB23 -ENCODING 52003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -08 -14 -63 -ENDCHAR -STARTCHAR CB24 -ENCODING 52004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -22 -22 -55 -08 -ENDCHAR -STARTCHAR CB25 -ENCODING 52005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -3E -41 -63 -1C -ENDCHAR -STARTCHAR CB26 -ENCODING 52006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4900 -B500 -0100 -3D00 -C100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CB27 -ENCODING 52007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -E900 -6900 -B500 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR CB28 -ENCODING 52008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -7F -3F -01 -01 -ENDCHAR -STARTCHAR CB29 -ENCODING 52009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR CB2A -ENCODING 52010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -B5 -01 -3D -C1 -7F -12 -3F -ENDCHAR -STARTCHAR CB2B -ENCODING 52011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR CB2C -ENCODING 52012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 8 0 0 -BITMAP -7F00 -0900 -1200 -2F80 -4C00 -1000 -1100 -FFC0 -ENDCHAR -STARTCHAR CB2D -ENCODING 52013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -76 -36 -C9 -24 -FF -00 -7E -01 -01 -ENDCHAR -STARTCHAR CB2E -ENCODING 52014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -36 -C9 -24 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR CB2F -ENCODING 52015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7600 -3600 -C900 -2400 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR CB30 -ENCODING 52016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -32 -CD -24 -24 -DB -40 -40 -7E -ENDCHAR -STARTCHAR CB31 -ENCODING 52017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -36 -C9 -24 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR CB32 -ENCODING 52018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CB33 -ENCODING 52019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -36 -C9 -24 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR CB34 -ENCODING 52020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -3F00 -0080 -3F00 -3F00 -ENDCHAR -STARTCHAR CB35 -ENCODING 52021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CB36 -ENCODING 52022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CB37 -ENCODING 52023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CB38 -ENCODING 52024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CB39 -ENCODING 52025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR CB3A -ENCODING 52026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR CB3B -ENCODING 52027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR CB3C -ENCODING 52028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -36 -C9 -24 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR CB3D -ENCODING 52029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -36 -C9 -24 -FF -00 -41 -7E -7F -ENDCHAR -STARTCHAR CB3E -ENCODING 52030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -36 -C9 -24 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR CB3F -ENCODING 52031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -36 -C9 -24 -FF -00 -08 -18 -66 -81 -ENDCHAR -STARTCHAR CB40 -ENCODING 52032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -36 -C9 -24 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR CB41 -ENCODING 52033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4480 -1200 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR CB42 -ENCODING 52034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -76 -36 -C9 -24 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR CB43 -ENCODING 52035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR CB44 -ENCODING 52036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -76 -36 -C9 -24 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR CB45 -ENCODING 52037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR CB46 -ENCODING 52038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -36 -C9 -24 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR CB47 -ENCODING 52039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -3B00 -4480 -1200 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR CB48 -ENCODING 52040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7F00 -0900 -3900 -46C0 -0C00 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR CB49 -ENCODING 52041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4480 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CB4A -ENCODING 52042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR CB4B -ENCODING 52043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR CB4C -ENCODING 52044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4C80 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR CB4D -ENCODING 52045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR CB4E -ENCODING 52046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR CB4F -ENCODING 52047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0400 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR CB50 -ENCODING 52048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1B00 -6480 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CB51 -ENCODING 52049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -08 -7F -71 -41 -71 -ENDCHAR -STARTCHAR CB52 -ENCODING 52050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -08 -7F -79 -89 -76 -ENDCHAR -STARTCHAR CB53 -ENCODING 52051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR CB54 -ENCODING 52052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR CB55 -ENCODING 52053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR CB56 -ENCODING 52054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR CB57 -ENCODING 52055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR CB58 -ENCODING 52056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4480 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR CB59 -ENCODING 52057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4C80 -0000 -FFC0 -0400 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CB5A -ENCODING 52058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR CB5B -ENCODING 52059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0400 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR CB5C -ENCODING 52060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR CB5D -ENCODING 52061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4480 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR CB5E -ENCODING 52062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -76 -36 -C9 -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR CB5F -ENCODING 52063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR CB60 -ENCODING 52064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR CB61 -ENCODING 52065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -76 -89 -00 -FF -08 -7E -7E -7E -ENDCHAR -STARTCHAR CB62 -ENCODING 52066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR CB63 -ENCODING 52067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR CB64 -ENCODING 52068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -1480 -3480 -4A80 -1080 -0080 -FE80 -1080 -1380 -1080 -0080 -ENDCHAR -STARTCHAR CB65 -ENCODING 52069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -3E -01 -01 -01 -ENDCHAR -STARTCHAR CB66 -ENCODING 52070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR CB67 -ENCODING 52071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -72 -12 -15 -10 -ENDCHAR -STARTCHAR CB68 -ENCODING 52072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -69 -95 -01 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR CB69 -ENCODING 52073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR CB6A -ENCODING 52074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -46 -4F -49 -36 -ENDCHAR -STARTCHAR CB6B -ENCODING 52075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -3F -40 -7E -ENDCHAR -STARTCHAR CB6C -ENCODING 52076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -7F -3F -40 -3F -ENDCHAR -STARTCHAR CB6D -ENCODING 52077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -77 -31 -41 -71 -ENDCHAR -STARTCHAR CB6E -ENCODING 52078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -77 -79 -49 -77 -ENDCHAR -STARTCHAR CB6F -ENCODING 52079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -75 -77 -45 -77 -ENDCHAR -STARTCHAR CB70 -ENCODING 52080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -52 -72 -85 -68 -ENDCHAR -STARTCHAR CB71 -ENCODING 52081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -77 -77 -44 -77 -ENDCHAR -STARTCHAR CB72 -ENCODING 52082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CB73 -ENCODING 52083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -76 -37 -49 -76 -ENDCHAR -STARTCHAR CB74 -ENCODING 52084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -7F -41 -7F -ENDCHAR -STARTCHAR CB75 -ENCODING 52085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -41 -7F -7F -ENDCHAR -STARTCHAR CB76 -ENCODING 52086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR CB77 -ENCODING 52087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -08 -14 -63 -ENDCHAR -STARTCHAR CB78 -ENCODING 52088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2F00 -6900 -9500 -0100 -FD00 -2100 -2200 -2200 -5500 -8880 -ENDCHAR -STARTCHAR CB79 -ENCODING 52089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -2F -69 -95 -01 -FD -21 -3E -41 -41 -3E -ENDCHAR -STARTCHAR CB7A -ENCODING 52090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -6900 -6900 -9500 -1D00 -E100 -2700 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CB7B -ENCODING 52091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -6900 -6D00 -9100 -DD00 -2300 -3D00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR CB7C -ENCODING 52092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR CB7D -ENCODING 52093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -27 -21 -3F -3F -20 -3F -ENDCHAR -STARTCHAR CB7E -ENCODING 52094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -1D -E1 -27 -3F -12 -3F -ENDCHAR -STARTCHAR CB7F -ENCODING 52095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -DD -23 -3D -23 -1C -22 -1E -ENDCHAR -STARTCHAR CB80 -ENCODING 52096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2680 -6A80 -9680 -0280 -FA80 -1680 -1280 -1280 -0080 -ENDCHAR -STARTCHAR CB81 -ENCODING 52097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CB82 -ENCODING 52098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR CB83 -ENCODING 52099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -3900 -0500 -0680 -0040 -ENDCHAR -STARTCHAR CB84 -ENCODING 52100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -5680 -0280 -FA80 -1680 -0080 -2000 -3F80 -ENDCHAR -STARTCHAR CB85 -ENCODING 52101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR CB86 -ENCODING 52102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR CB87 -ENCODING 52103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR CB88 -ENCODING 52104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -0F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR CB89 -ENCODING 52105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -0F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR CB8A -ENCODING 52106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR CB8B -ENCODING 52107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -0E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR CB8C -ENCODING 52108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -2900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR CB8D -ENCODING 52109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -0F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR CB8E -ENCODING 52110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -2B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR CB8F -ENCODING 52111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR CB90 -ENCODING 52112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR CB91 -ENCODING 52113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR CB92 -ENCODING 52114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -2100 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR CB93 -ENCODING 52115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -0400 -0E00 -3180 -ENDCHAR -STARTCHAR CB94 -ENCODING 52116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -0100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR CB95 -ENCODING 52117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -1F00 -2080 -3080 -0F00 -ENDCHAR -STARTCHAR CB96 -ENCODING 52118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR CB97 -ENCODING 52119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR CB98 -ENCODING 52120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -1F80 -0080 -1F80 -0080 -ENDCHAR -STARTCHAR CB99 -ENCODING 52121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CB9A -ENCODING 52122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -D680 -0E80 -7280 -1480 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR CB9B -ENCODING 52123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -6A80 -6A80 -1680 -FE80 -1680 -1E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR CB9C -ENCODING 52124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -1280 -2480 -5A80 -1080 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR CB9D -ENCODING 52125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -01 -FD -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR CB9E -ENCODING 52126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR CB9F -ENCODING 52127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR CBA0 -ENCODING 52128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -69 -95 -01 -FD -11 -01 -40 -7F -ENDCHAR -STARTCHAR CBA1 -ENCODING 52129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR CBA2 -ENCODING 52130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR CBA3 -ENCODING 52131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR CBA4 -ENCODING 52132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -7F -3F -40 -3F -ENDCHAR -STARTCHAR CBA5 -ENCODING 52133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR CBA6 -ENCODING 52134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR CBA7 -ENCODING 52135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR CBA8 -ENCODING 52136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR CBA9 -ENCODING 52137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR CBAA -ENCODING 52138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CBAB -ENCODING 52139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR CBAC -ENCODING 52140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -01 -FD -21 -7F -41 -7F -ENDCHAR -STARTCHAR CBAD -ENCODING 52141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -01 -FD -21 -41 -7F -7F -ENDCHAR -STARTCHAR CBAE -ENCODING 52142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR CBAF -ENCODING 52143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -01 -FD -21 -08 -14 -63 -ENDCHAR -STARTCHAR CBB0 -ENCODING 52144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR CBB1 -ENCODING 52145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -01 -FD -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR CBB2 -ENCODING 52146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -6900 -6900 -9500 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CBB3 -ENCODING 52147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -6900 -6D00 -9100 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR CBB4 -ENCODING 52148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -69 -95 -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR CBB5 -ENCODING 52149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR CBB6 -ENCODING 52150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -69 -69 -95 -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR CBB7 -ENCODING 52151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -69 -6D -91 -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR CBB8 -ENCODING 52152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7F00 -0900 -1900 -66C0 -0C00 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR CBB9 -ENCODING 52153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR CBBA -ENCODING 52154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR CBBB -ENCODING 52155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR CBBC -ENCODING 52156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1900 -6680 -0000 -FFC0 -1200 -3200 -2000 -3F00 -ENDCHAR -STARTCHAR CBBD -ENCODING 52157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR CBBE -ENCODING 52158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR CBBF -ENCODING 52159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR CBC0 -ENCODING 52160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -76 -89 -00 -FF -24 -5B -7E -7E -ENDCHAR -STARTCHAR CBC1 -ENCODING 52161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR CBC2 -ENCODING 52162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR CBC3 -ENCODING 52163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR CBC4 -ENCODING 52164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR CBC5 -ENCODING 52165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR CBC6 -ENCODING 52166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR CBC7 -ENCODING 52167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR CBC8 -ENCODING 52168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR CBC9 -ENCODING 52169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR CBCA -ENCODING 52170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR CBCB -ENCODING 52171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -1400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR CBCC -ENCODING 52172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR CBCD -ENCODING 52173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR CBCE -ENCODING 52174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR CBCF -ENCODING 52175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR CBD0 -ENCODING 52176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR CBD1 -ENCODING 52177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -76 -89 -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR CBD2 -ENCODING 52178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR CBD3 -ENCODING 52179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR CBD4 -ENCODING 52180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7F00 -0900 -1100 -2B00 -44C0 -0800 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR CBD5 -ENCODING 52181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR CBD6 -ENCODING 52182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR CBD7 -ENCODING 52183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR CBD8 -ENCODING 52184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -32 -CD -00 -00 -FF -40 -40 -7E -ENDCHAR -STARTCHAR CBD9 -ENCODING 52185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR CBDA -ENCODING 52186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR CBDB -ENCODING 52187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR CBDC -ENCODING 52188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -76 -89 -00 -FF -7E -01 -7E -7E -ENDCHAR -STARTCHAR CBDD -ENCODING 52189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR CBDE -ENCODING 52190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR CBDF -ENCODING 52191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR CBE0 -ENCODING 52192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR CBE1 -ENCODING 52193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR CBE2 -ENCODING 52194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR CBE3 -ENCODING 52195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR CBE4 -ENCODING 52196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1100 -2B00 -4C80 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR CBE5 -ENCODING 52197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -2080 -3F00 -3F80 -ENDCHAR -STARTCHAR CBE6 -ENCODING 52198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR CBE7 -ENCODING 52199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0900 -3B00 -4C80 -0000 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR CBE8 -ENCODING 52200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR CBE9 -ENCODING 52201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0900 -3B00 -4C80 -0000 -FFC0 -0000 -1F00 -2100 -2100 -1F00 -ENDCHAR -STARTCHAR CBEA -ENCODING 52202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR CBEB -ENCODING 52203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR CBEC -ENCODING 52204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR CBED -ENCODING 52205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -76 -76 -89 -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR CBEE -ENCODING 52206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3B00 -1B00 -6480 -0000 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR CBEF -ENCODING 52207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -76 -76 -89 -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR CBF0 -ENCODING 52208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -49 -69 -95 -21 -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR CBF1 -ENCODING 52209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CBF2 -ENCODING 52210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -3F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR CBF3 -ENCODING 52211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR CBF4 -ENCODING 52212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -FD -49 -B5 -01 -05 -F9 -01 -40 -7F -ENDCHAR -STARTCHAR CBF5 -ENCODING 52213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR CBF6 -ENCODING 52214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR CBF7 -ENCODING 52215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -1F80 -2000 -3F00 -ENDCHAR -STARTCHAR CBF8 -ENCODING 52216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -7E -01 -7F -40 -3F -ENDCHAR -STARTCHAR CBF9 -ENCODING 52217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR CBFA -ENCODING 52218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR CBFB -ENCODING 52219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR CBFC -ENCODING 52220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR CBFD -ENCODING 52221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR CBFE -ENCODING 52222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR CBFF -ENCODING 52223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR CC00 -ENCODING 52224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -3F80 -2080 -3F80 -ENDCHAR -STARTCHAR CC01 -ENCODING 52225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR CC02 -ENCODING 52226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -2900 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR CC03 -ENCODING 52227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR CC04 -ENCODING 52228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -1100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR CC05 -ENCODING 52229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -1F00 -2080 -3180 -0E00 -ENDCHAR -STARTCHAR CC06 -ENCODING 52230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR CC07 -ENCODING 52231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -E900 -6900 -B500 -1F00 -E100 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR CC08 -ENCODING 52232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -3F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR CC09 -ENCODING 52233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR CC0A -ENCODING 52234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7C80 -2480 -5A80 -0080 -FF80 -0080 -3F80 -0900 -1F80 -ENDCHAR -STARTCHAR CC0B -ENCODING 52235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E9 -69 -B5 -1F -E1 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR CC0C -ENCODING 52236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -6C80 -2480 -2480 -2480 -5C80 -4A80 -9280 -2080 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CC0D -ENCODING 52237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -29 -49 -AD -95 -21 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CC0E -ENCODING 52238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -49 -69 -95 -21 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR CC0F -ENCODING 52239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4900 -6900 -9500 -2100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CC10 -ENCODING 52240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -2480 -2480 -5480 -8A80 -1080 -0080 -2080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CC11 -ENCODING 52241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -49 -69 -95 -21 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR CC12 -ENCODING 52242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -69 -95 -21 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR CC13 -ENCODING 52243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -49 -69 -95 -21 -00 -7E -40 -7E -ENDCHAR -STARTCHAR CC14 -ENCODING 52244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -49 -69 -95 -21 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CC15 -ENCODING 52245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -69 -95 -21 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR CC16 -ENCODING 52246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -69 -95 -21 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CC17 -ENCODING 52247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -69 -95 -21 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR CC18 -ENCODING 52248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -69 -95 -21 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR CC19 -ENCODING 52249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -69 -95 -21 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR CC1A -ENCODING 52250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -69 -95 -21 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CC1B -ENCODING 52251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -69 -95 -21 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR CC1C -ENCODING 52252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -29 -49 -A9 -95 -21 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CC1D -ENCODING 52253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -29 -49 -A9 -95 -21 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR CC1E -ENCODING 52254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4900 -6900 -9500 -2100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CC1F -ENCODING 52255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -49 -69 -95 -21 -00 -08 -14 -63 -ENDCHAR -STARTCHAR CC20 -ENCODING 52256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -D900 -4900 -6900 -9500 -2100 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CC21 -ENCODING 52257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -29 -49 -A9 -95 -21 -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR CC22 -ENCODING 52258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -2900 -4900 -A900 -9500 -2100 -0000 -3F00 -0200 -0C00 -3380 -ENDCHAR -STARTCHAR CC23 -ENCODING 52259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4900 -6900 -9500 -2100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR CC24 -ENCODING 52260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -D9 -49 -69 -95 -21 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CC25 -ENCODING 52261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -69 -95 -21 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR CC26 -ENCODING 52262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -D9 -49 -69 -95 -21 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CC27 -ENCODING 52263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -29 -49 -A9 -95 -21 -1C -00 -7F -22 -1E -ENDCHAR -STARTCHAR CC28 -ENCODING 52264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1100 -1180 -3100 -4900 -8500 -0100 -0100 -0100 -ENDCHAR -STARTCHAR CC29 -ENCODING 52265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1180 -7100 -8D00 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR CC2A -ENCODING 52266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -2000 -0100 -F900 -1180 -3100 -C900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR CC2B -ENCODING 52267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -F900 -1180 -3100 -C900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR CC2C -ENCODING 52268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1100 -1180 -7100 -8900 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR CC2D -ENCODING 52269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -F900 -1180 -3100 -C900 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR CC2E -ENCODING 52270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1180 -6D00 -8000 -0600 -4000 -4F00 -4900 -7700 -ENDCHAR -STARTCHAR CC2F -ENCODING 52271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -F900 -1180 -3100 -C900 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR CC30 -ENCODING 52272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -3180 -CD00 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR CC31 -ENCODING 52273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -6600 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR CC32 -ENCODING 52274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR CC33 -ENCODING 52275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -6000 -1900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR CC34 -ENCODING 52276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -6200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR CC35 -ENCODING 52277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -6600 -1800 -7E00 -8800 -7700 -ENDCHAR -STARTCHAR CC36 -ENCODING 52278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -6000 -1700 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR CC37 -ENCODING 52279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -6600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR CC38 -ENCODING 52280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1180 -7100 -8D00 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR CC39 -ENCODING 52281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1180 -7100 -8D00 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR CC3A -ENCODING 52282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -F900 -1180 -3100 -C900 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR CC3B -ENCODING 52283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1100 -7180 -8D00 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR CC3C -ENCODING 52284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1180 -7100 -8D00 -0000 -2200 -2200 -5500 -8880 -ENDCHAR -STARTCHAR CC3D -ENCODING 52285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1180 -7100 -8D00 -0100 -3E00 -4200 -4200 -3C00 -ENDCHAR -STARTCHAR CC3E -ENCODING 52286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1180 -7100 -8D00 -0000 -3E00 -0200 -1C00 -6300 -ENDCHAR -STARTCHAR CC3F -ENCODING 52287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR CC40 -ENCODING 52288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -2000 -0100 -F900 -1180 -3100 -C900 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR CC41 -ENCODING 52289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -3E00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR CC42 -ENCODING 52290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -F900 -1180 -3100 -C900 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR CC43 -ENCODING 52291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -1180 -3100 -C800 -1C00 -7F00 -1C00 -2200 -1E00 -ENDCHAR -STARTCHAR CC44 -ENCODING 52292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -15 -27 -25 -55 -8D -05 -05 -05 -ENDCHAR -STARTCHAR CC45 -ENCODING 52293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -17 -75 -8D -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CC46 -ENCODING 52294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -35 -CD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CC47 -ENCODING 52295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1700 -3500 -CD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CC48 -ENCODING 52296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -F500 -1700 -2500 -5500 -8D00 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CC49 -ENCODING 52297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1700 -3500 -CD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR CC4A -ENCODING 52298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -75 -8D -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR CC4B -ENCODING 52299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -F5 -17 -35 -CD -00 -3F -40 -7F -ENDCHAR -STARTCHAR CC4C -ENCODING 52300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F7 -25 -DD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CC4D -ENCODING 52301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -75 -8D -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR CC4E -ENCODING 52302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -75 -8D -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR CC4F -ENCODING 52303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -75 -8D -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR CC50 -ENCODING 52304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -75 -8D -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR CC51 -ENCODING 52305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -75 -8D -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR CC52 -ENCODING 52306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -75 -8D -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CC53 -ENCODING 52307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1700 -7500 -8D00 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR CC54 -ENCODING 52308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -17 -75 -8D -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CC55 -ENCODING 52309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -17 -75 -8D -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR CC56 -ENCODING 52310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1700 -3500 -CD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CC57 -ENCODING 52311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -F500 -1700 -7500 -8D00 -0100 -0800 -0C00 -3200 -4180 -ENDCHAR -STARTCHAR CC58 -ENCODING 52312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -F500 -1700 -7500 -8D00 -0000 -1200 -3200 -7500 -4C80 -ENDCHAR -STARTCHAR CC59 -ENCODING 52313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -17 -75 -8D -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR CC5A -ENCODING 52314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1700 -3500 -CD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CC5B -ENCODING 52315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1700 -7500 -8D00 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR CC5C -ENCODING 52316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -35 -CD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CC5D -ENCODING 52317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -75 -8D -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR CC5E -ENCODING 52318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -F5 -17 -35 -CD -00 -3F -12 -3F -ENDCHAR -STARTCHAR CC5F -ENCODING 52319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -17 -75 -8D -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR CC60 -ENCODING 52320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -0980 -1100 -2100 -7980 -8500 -0100 -0100 -0100 -ENDCHAR -STARTCHAR CC61 -ENCODING 52321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR CC62 -ENCODING 52322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR CC63 -ENCODING 52323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR CC64 -ENCODING 52324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F980 -1100 -1100 -7180 -8900 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR CC65 -ENCODING 52325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR CC66 -ENCODING 52326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0180 -F900 -1180 -6D00 -8000 -0600 -4000 -4F00 -4900 -7700 -ENDCHAR -STARTCHAR CC67 -ENCODING 52327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR CC68 -ENCODING 52328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0180 -F900 -3180 -CD00 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR CC69 -ENCODING 52329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -6600 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR CC6A -ENCODING 52330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR CC6B -ENCODING 52331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -6000 -1900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR CC6C -ENCODING 52332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -6200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR CC6D -ENCODING 52333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -6600 -1800 -7E00 -8800 -7700 -ENDCHAR -STARTCHAR CC6E -ENCODING 52334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -6000 -1700 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR CC6F -ENCODING 52335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -6600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR CC70 -ENCODING 52336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F980 -1100 -3180 -CD00 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR CC71 -ENCODING 52337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR CC72 -ENCODING 52338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR CC73 -ENCODING 52339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR CC74 -ENCODING 52340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR CC75 -ENCODING 52341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F980 -1100 -3180 -CD00 -0100 -3E00 -4200 -4200 -3C00 -ENDCHAR -STARTCHAR CC76 -ENCODING 52342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR CC77 -ENCODING 52343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR CC78 -ENCODING 52344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR CC79 -ENCODING 52345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -3E00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR CC7A -ENCODING 52346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -F980 -1100 -3180 -C900 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR CC7B -ENCODING 52347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -1100 -3180 -C800 -1C00 -7F00 -1C00 -2200 -1E00 -ENDCHAR -STARTCHAR CC7C -ENCODING 52348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -65 -65 -17 -25 -25 -57 -8D -05 -05 -ENDCHAR -STARTCHAR CC7D -ENCODING 52349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -37 -CD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CC7E -ENCODING 52350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -37 -CD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CC7F -ENCODING 52351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F700 -1500 -3700 -CD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CC80 -ENCODING 52352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -65 -F5 -17 -25 -57 -85 -05 -20 -3F -ENDCHAR -STARTCHAR CC81 -ENCODING 52353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F700 -1500 -3700 -CD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR CC82 -ENCODING 52354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR CC83 -ENCODING 52355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -F7 -15 -37 -CD -00 -3F -40 -7F -ENDCHAR -STARTCHAR CC84 -ENCODING 52356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR CC85 -ENCODING 52357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR CC86 -ENCODING 52358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR CC87 -ENCODING 52359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR CC88 -ENCODING 52360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR CC89 -ENCODING 52361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR CC8A -ENCODING 52362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CC8B -ENCODING 52363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F700 -1500 -7700 -8D00 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR CC8C -ENCODING 52364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -F7 -15 -37 -CD -00 -3F -41 -7F -ENDCHAR -STARTCHAR CC8D -ENCODING 52365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -F7 -15 -37 -CD -00 -21 -3F -3F -ENDCHAR -STARTCHAR CC8E -ENCODING 52366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F700 -1500 -3700 -CD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CC8F -ENCODING 52367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -F7 -15 -37 -CD -00 -08 -14 -63 -ENDCHAR -STARTCHAR CC90 -ENCODING 52368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F700 -1500 -3700 -CD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CC91 -ENCODING 52369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -37 -CD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR CC92 -ENCODING 52370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F700 -1500 -3700 -CD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CC93 -ENCODING 52371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F700 -1500 -7700 -8D00 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR CC94 -ENCODING 52372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -37 -CD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CC95 -ENCODING 52373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR CC96 -ENCODING 52374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -F7 -15 -37 -CD -00 -3F -12 -3F -ENDCHAR -STARTCHAR CC97 -ENCODING 52375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -15 -77 -8D -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR CC98 -ENCODING 52376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -17 -31 -49 -85 -01 -01 -01 -ENDCHAR -STARTCHAR CC99 -ENCODING 52377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -0F -31 -CD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CC9A -ENCODING 52378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -F9 -11 -33 -49 -81 -77 -09 -09 -09 -ENDCHAR -STARTCHAR CC9B -ENCODING 52379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -F9 -11 -33 -49 -81 -72 -12 -15 -10 -ENDCHAR -STARTCHAR CC9C -ENCODING 52380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -09 -17 -79 -85 -01 -40 -40 -3F -ENDCHAR -STARTCHAR CC9D -ENCODING 52381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -F9 -11 -33 -49 -81 -47 -41 -47 -30 -ENDCHAR -STARTCHAR CC9E -ENCODING 52382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -06 -41 -46 -49 -36 -ENDCHAR -STARTCHAR CC9F -ENCODING 52383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -F9 -11 -33 -49 -81 -3F -40 -7E -ENDCHAR -STARTCHAR CCA0 -ENCODING 52384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -37 -CD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CCA1 -ENCODING 52385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR CCA2 -ENCODING 52386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR CCA3 -ENCODING 52387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR CCA4 -ENCODING 52388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -00 -72 -72 -45 -70 -ENDCHAR -STARTCHAR CCA5 -ENCODING 52389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR CCA6 -ENCODING 52390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CCA7 -ENCODING 52391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR CCA8 -ENCODING 52392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -0F -31 -CD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CCA9 -ENCODING 52393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -0F -31 -CD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR CCAA -ENCODING 52394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -F9 -11 -33 -49 -81 -12 -72 -55 -70 -ENDCHAR -STARTCHAR CCAB -ENCODING 52395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -0F00 -3100 -CD00 -0100 -0800 -0800 -3600 -4180 -ENDCHAR -STARTCHAR CCAC -ENCODING 52396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -0F00 -3100 -CD00 -0100 -2200 -3200 -7500 -4880 -ENDCHAR -STARTCHAR CCAD -ENCODING 52397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -71 -8D -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR CCAE -ENCODING 52398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -0100 -F900 -1100 -3300 -4900 -8100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CCAF -ENCODING 52399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1700 -3100 -CD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR CCB0 -ENCODING 52400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -F9 -11 -33 -49 -81 -7F -3F -01 -01 -ENDCHAR -STARTCHAR CCB1 -ENCODING 52401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR CCB2 -ENCODING 52402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -F9 -11 -33 -49 -81 -7F -12 -3F -ENDCHAR -STARTCHAR CCB3 -ENCODING 52403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -31 -CD -1C -33 -0C -32 -1E -ENDCHAR -STARTCHAR CCB4 -ENCODING 52404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -15 -2D -25 -D5 -8D -05 -05 -05 -ENDCHAR -STARTCHAR CCB5 -ENCODING 52405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -1D -65 -9D -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CCB6 -ENCODING 52406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -35 -CD -01 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CCB7 -ENCODING 52407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1500 -3500 -CD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CCB8 -ENCODING 52408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -F500 -1500 -2D00 -6500 -9500 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CCB9 -ENCODING 52409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1500 -3500 -CD00 -0100 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR CCBA -ENCODING 52410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -1D -75 -89 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR CCBB -ENCODING 52411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -F5 -15 -35 -CD -01 -3F -40 -7F -ENDCHAR -STARTCHAR CCBC -ENCODING 52412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -2D -DD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CCBD -ENCODING 52413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -1D -75 -89 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR CCBE -ENCODING 52414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -1D -75 -89 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR CCBF -ENCODING 52415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -1D -75 -89 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR CCC0 -ENCODING 52416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -1D -75 -89 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR CCC1 -ENCODING 52417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -1D -75 -89 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR CCC2 -ENCODING 52418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -1D -75 -89 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CCC3 -ENCODING 52419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1D00 -7500 -8900 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR CCC4 -ENCODING 52420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -1D -65 -9D -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CCC5 -ENCODING 52421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -1D -65 -9D -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR CCC6 -ENCODING 52422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1500 -3500 -CD00 -0100 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CCC7 -ENCODING 52423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -F500 -1D00 -6500 -9D00 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR CCC8 -ENCODING 52424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1500 -3500 -CD00 -0100 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CCC9 -ENCODING 52425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -1D -65 -9D -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR CCCA -ENCODING 52426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1500 -3500 -CD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CCCB -ENCODING 52427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1D00 -7500 -8900 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR CCCC -ENCODING 52428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -35 -CD -01 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CCCD -ENCODING 52429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -1D -75 -89 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR CCCE -ENCODING 52430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -F5 -15 -35 -CD -01 -3F -12 -3F -ENDCHAR -STARTCHAR CCCF -ENCODING 52431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -1D -75 -89 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR CCD0 -ENCODING 52432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -17 -11 -37 -49 -85 -01 -01 -01 -ENDCHAR -STARTCHAR CCD1 -ENCODING 52433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -FB -11 -37 -49 -81 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CCD2 -ENCODING 52434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -FB -11 -37 -49 -81 -77 -09 -09 -09 -ENDCHAR -STARTCHAR CCD3 -ENCODING 52435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -FB -11 -37 -49 -81 -72 -12 -15 -10 -ENDCHAR -STARTCHAR CCD4 -ENCODING 52436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -0F -11 -37 -CD -01 -40 -40 -3F -ENDCHAR -STARTCHAR CCD5 -ENCODING 52437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -FB -11 -37 -49 -81 -47 -41 -47 -30 -ENDCHAR -STARTCHAR CCD6 -ENCODING 52438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -06 -41 -46 -49 -36 -ENDCHAR -STARTCHAR CCD7 -ENCODING 52439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -FB -11 -37 -49 -81 -3F -40 -7E -ENDCHAR -STARTCHAR CCD8 -ENCODING 52440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -00 -3F -3F -40 -3F -ENDCHAR -STARTCHAR CCD9 -ENCODING 52441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR CCDA -ENCODING 52442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR CCDB -ENCODING 52443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR CCDC -ENCODING 52444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -00 -72 -72 -45 -70 -ENDCHAR -STARTCHAR CCDD -ENCODING 52445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR CCDE -ENCODING 52446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CCDF -ENCODING 52447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR CCE0 -ENCODING 52448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -FB -11 -37 -49 -81 -3F -41 -7F -ENDCHAR -STARTCHAR CCE1 -ENCODING 52449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -FB -11 -37 -49 -81 -01 -3F -7F -ENDCHAR -STARTCHAR CCE2 -ENCODING 52450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -FB -11 -37 -49 -81 -12 -72 -55 -70 -ENDCHAR -STARTCHAR CCE3 -ENCODING 52451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -FB -11 -37 -49 -81 -08 -14 -63 -ENDCHAR -STARTCHAR CCE4 -ENCODING 52452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FF00 -0900 -3700 -CD00 -0000 -2200 -3200 -7500 -4880 -ENDCHAR -STARTCHAR CCE5 -ENCODING 52453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -FB -11 -37 -49 -81 -3E -41 -23 -1C -ENDCHAR -STARTCHAR CCE6 -ENCODING 52454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -0100 -FB00 -1100 -3700 -4900 -8100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CCE7 -ENCODING 52455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FF00 -1100 -3700 -CD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR CCE8 -ENCODING 52456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -FB -11 -37 -49 -81 -7F -3F -01 -01 -ENDCHAR -STARTCHAR CCE9 -ENCODING 52457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR CCEA -ENCODING 52458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -FB -11 -37 -49 -81 -7F -12 -3F -ENDCHAR -STARTCHAR CCEB -ENCODING 52459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -11 -37 -CD -1C -33 -0C -32 -1E -ENDCHAR -STARTCHAR CCEC -ENCODING 52460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -F5 -1D -25 -2D -D5 -8D -05 -05 -05 -ENDCHAR -STARTCHAR CCED -ENCODING 52461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -03 -F3 -17 -3D -CB -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CCEE -ENCODING 52462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -03 -F3 -17 -3D -CB -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CCEF -ENCODING 52463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0300 -F300 -1700 -3D00 -CB00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CCF0 -ENCODING 52464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -F500 -1D00 -2500 -6D00 -9500 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CCF1 -ENCODING 52465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0300 -F300 -1700 -3D00 -CB00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR CCF2 -ENCODING 52466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR CCF3 -ENCODING 52467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -03 -F3 -17 -3D -CB -00 -3F -40 -7F -ENDCHAR -STARTCHAR CCF4 -ENCODING 52468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR CCF5 -ENCODING 52469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR CCF6 -ENCODING 52470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR CCF7 -ENCODING 52471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR CCF8 -ENCODING 52472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR CCF9 -ENCODING 52473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR CCFA -ENCODING 52474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CCFB -ENCODING 52475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1500 -7D00 -8900 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR CCFC -ENCODING 52476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -03 -F3 -17 -3D -CB -00 -3F -41 -7F -ENDCHAR -STARTCHAR CCFD -ENCODING 52477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -03 -F3 -17 -3D -CB -00 -21 -3F -3F -ENDCHAR -STARTCHAR CCFE -ENCODING 52478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0300 -F300 -1700 -3D00 -CB00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CCFF -ENCODING 52479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -03 -F3 -17 -3D -CB -00 -08 -14 -63 -ENDCHAR -STARTCHAR CD00 -ENCODING 52480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0300 -F300 -1700 -3D00 -CB00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CD01 -ENCODING 52481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -15 -6D -9D -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR CD02 -ENCODING 52482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0300 -F300 -1700 -3D00 -CB00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CD03 -ENCODING 52483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -1500 -7D00 -8900 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR CD04 -ENCODING 52484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -03 -F3 -17 -3D -CB -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CD05 -ENCODING 52485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR CD06 -ENCODING 52486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -03 -F3 -17 -3D -CB -00 -3F -12 -3F -ENDCHAR -STARTCHAR CD07 -ENCODING 52487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -15 -7D -89 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR CD08 -ENCODING 52488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1E00 -0000 -3F00 -0200 -0E00 -7180 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR CD09 -ENCODING 52489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0E00 -7180 -0400 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR CD0A -ENCODING 52490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -08 -F7 -7E -11 -11 -10 -ENDCHAR -STARTCHAR CD0B -ENCODING 52491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -08 -F7 -E0 -14 -16 -19 -ENDCHAR -STARTCHAR CD0C -ENCODING 52492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CD0D -ENCODING 52493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -08 -F7 -07 -42 -45 -20 -ENDCHAR -STARTCHAR CD0E -ENCODING 52494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0300 -2480 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CD0F -ENCODING 52495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -00 -3E -1C -E7 -08 -F7 -7E -40 -7E -ENDCHAR -STARTCHAR CD10 -ENCODING 52496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0E00 -7180 -0400 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CD11 -ENCODING 52497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CD12 -ENCODING 52498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CD13 -ENCODING 52499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CD14 -ENCODING 52500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CD15 -ENCODING 52501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3F00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR CD16 -ENCODING 52502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR CD17 -ENCODING 52503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0300 -3880 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR CD18 -ENCODING 52504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0400 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CD19 -ENCODING 52505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0E00 -7180 -0400 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CD1A -ENCODING 52506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -08 -F7 -12 -72 -95 -78 -ENDCHAR -STARTCHAR CD1B -ENCODING 52507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0400 -FFC0 -0000 -0400 -1A00 -6180 -ENDCHAR -STARTCHAR CD1C -ENCODING 52508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -08 -F7 -20 -26 -5D -80 -ENDCHAR -STARTCHAR CD1D -ENCODING 52509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0400 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CD1E -ENCODING 52510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -3C -00 -3E -1C -E7 -08 -F7 -7E -02 -7F -ENDCHAR -STARTCHAR CD1F -ENCODING 52511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CD20 -ENCODING 52512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -3C -00 -3E -1C -E7 -08 -F7 -7E -01 -7F -ENDCHAR -STARTCHAR CD21 -ENCODING 52513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR CD22 -ENCODING 52514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -00 -3E -1C -E7 -08 -F7 -7F -24 -7E -ENDCHAR -STARTCHAR CD23 -ENCODING 52515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR CD24 -ENCODING 52516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7C80 -0480 -1880 -66C0 -1080 -1080 -FE80 -0080 -0080 -ENDCHAR -STARTCHAR CD25 -ENCODING 52517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR CD26 -ENCODING 52518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -6600 -1100 -1100 -ENDCHAR -STARTCHAR CD27 -ENCODING 52519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -E200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR CD28 -ENCODING 52520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7C80 -1880 -66C0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CD29 -ENCODING 52521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -0F00 -4200 -4500 -3000 -ENDCHAR -STARTCHAR CD2A -ENCODING 52522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0600 -0900 -4600 -4900 -3600 -ENDCHAR -STARTCHAR CD2B -ENCODING 52523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -3E00 -4000 -7E00 -ENDCHAR -STARTCHAR CD2C -ENCODING 52524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7C80 -18C0 -6680 -1000 -FF00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CD2D -ENCODING 52525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0000 -7700 -7100 -4100 -7100 -ENDCHAR -STARTCHAR CD2E -ENCODING 52526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR CD2F -ENCODING 52527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0000 -7900 -7E00 -8900 -7600 -ENDCHAR -STARTCHAR CD30 -ENCODING 52528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0000 -7200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR CD31 -ENCODING 52529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0000 -7E00 -7E00 -8800 -7700 -ENDCHAR -STARTCHAR CD32 -ENCODING 52530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0000 -7700 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR CD33 -ENCODING 52531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0600 -7100 -7600 -8900 -7600 -ENDCHAR -STARTCHAR CD34 -ENCODING 52532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -3E00 -4100 -7F00 -ENDCHAR -STARTCHAR CD35 -ENCODING 52533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -4000 -7E00 -7F00 -ENDCHAR -STARTCHAR CD36 -ENCODING 52534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -9200 -F200 -9500 -7800 -ENDCHAR -STARTCHAR CD37 -ENCODING 52535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -7900 -3100 -ED80 -2100 -DD00 -0800 -0C00 -3200 -4100 -ENDCHAR -STARTCHAR CD38 -ENCODING 52536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR CD39 -ENCODING 52537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7C80 -1880 -66C0 -1080 -FE80 -0000 -1F00 -2080 -1F00 -ENDCHAR -STARTCHAR CD3A -ENCODING 52538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -3E00 -0200 -3F00 -4000 -ENDCHAR -STARTCHAR CD3B -ENCODING 52539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CD3C -ENCODING 52540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -7E00 -0100 -3F00 -ENDCHAR -STARTCHAR CD3D -ENCODING 52541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -0000 -7E00 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR CD3E -ENCODING 52542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -0100 -7900 -3100 -CD80 -2100 -DC00 -1C00 -2200 -7F00 -ENDCHAR -STARTCHAR CD3F -ENCODING 52543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -7100 -0900 -7900 -8580 -FD00 -1C00 -6200 -1C00 -2200 -3C00 -ENDCHAR -STARTCHAR CD40 -ENCODING 52544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -65 -F5 -15 -27 -DD -25 -FD -05 -05 -01 -ENDCHAR -STARTCHAR CD41 -ENCODING 52545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CD42 -ENCODING 52546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -1900 -0480 -0480 -0480 -ENDCHAR -STARTCHAR CD43 -ENCODING 52547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR CD44 -ENCODING 52548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3280 -7A80 -1280 -6F80 -1280 -FA80 -0280 -1000 -1F80 -ENDCHAR -STARTCHAR CD45 -ENCODING 52549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR CD46 -ENCODING 52550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -06 -41 -46 -49 -36 -ENDCHAR -STARTCHAR CD47 -ENCODING 52551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR CD48 -ENCODING 52552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -00 -3F -3F -40 -3F -ENDCHAR -STARTCHAR CD49 -ENCODING 52553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -00 -3F -39 -41 -38 -ENDCHAR -STARTCHAR CD4A -ENCODING 52554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR CD4B -ENCODING 52555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -00 -3D -77 -45 -37 -ENDCHAR -STARTCHAR CD4C -ENCODING 52556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -00 -72 -72 -45 -70 -ENDCHAR -STARTCHAR CD4D -ENCODING 52557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -00 -3F -77 -44 -37 -ENDCHAR -STARTCHAR CD4E -ENCODING 52558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CD4F -ENCODING 52559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR CD50 -ENCODING 52560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -1F00 -2080 -3F80 -ENDCHAR -STARTCHAR CD51 -ENCODING 52561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR CD52 -ENCODING 52562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -2100 -3900 -2A80 -3800 -ENDCHAR -STARTCHAR CD53 -ENCODING 52563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR CD54 -ENCODING 52564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -0100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR CD55 -ENCODING 52565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -1F00 -2080 -3080 -0F00 -ENDCHAR -STARTCHAR CD56 -ENCODING 52566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR CD57 -ENCODING 52567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -7500 -7700 -A500 -FD00 -0000 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CD58 -ENCODING 52568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -1F80 -0080 -1F80 -0080 -ENDCHAR -STARTCHAR CD59 -ENCODING 52569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -00 -7F -3F -40 -3F -ENDCHAR -STARTCHAR CD5A -ENCODING 52570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -3280 -7A80 -1380 -6A80 -1280 -FE80 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR CD5B -ENCODING 52571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -77 -A5 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR CD5C -ENCODING 52572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -0080 -7C80 -0480 -1880 -6680 -1080 -1080 -FF80 -0080 -0080 -ENDCHAR -STARTCHAR CD5D -ENCODING 52573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -11 -ED -7F -01 -01 -01 -ENDCHAR -STARTCHAR CD5E -ENCODING 52574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -11 -ED -77 -09 -09 -09 -ENDCHAR -STARTCHAR CD5F -ENCODING 52575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -11 -ED -72 -12 -15 -10 -ENDCHAR -STARTCHAR CD60 -ENCODING 52576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -CD -11 -FF -01 -40 -40 -7F -ENDCHAR -STARTCHAR CD61 -ENCODING 52577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -11 -ED -47 -41 -47 -30 -ENDCHAR -STARTCHAR CD62 -ENCODING 52578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -06 -41 -46 -49 -36 -ENDCHAR -STARTCHAR CD63 -ENCODING 52579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -79 -31 -CD -11 -ED -3F -40 -7E -ENDCHAR -STARTCHAR CD64 -ENCODING 52580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -CD -10 -FF -01 -7F -40 -7F -ENDCHAR -STARTCHAR CD65 -ENCODING 52581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR CD66 -ENCODING 52582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR CD67 -ENCODING 52583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR CD68 -ENCODING 52584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -00 -72 -72 -45 -70 -ENDCHAR -STARTCHAR CD69 -ENCODING 52585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR CD6A -ENCODING 52586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CD6B -ENCODING 52587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR CD6C -ENCODING 52588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -CD -11 -FF -00 -7F -41 -7F -ENDCHAR -STARTCHAR CD6D -ENCODING 52589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -CD -11 -FE -41 -7F -41 -7F -ENDCHAR -STARTCHAR CD6E -ENCODING 52590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -11 -ED -12 -72 -55 -70 -ENDCHAR -STARTCHAR CD6F -ENCODING 52591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -CD -11 -FF -01 -08 -14 -63 -ENDCHAR -STARTCHAR CD70 -ENCODING 52592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -11 -ED -22 -22 -55 -08 -ENDCHAR -STARTCHAR CD71 -ENCODING 52593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -CD -11 -FF -00 -3E -41 -3E -ENDCHAR -STARTCHAR CD72 -ENCODING 52594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -0100 -7900 -3100 -CD00 -1100 -ED00 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CD73 -ENCODING 52595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -7100 -0900 -7900 -8500 -FD00 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CD74 -ENCODING 52596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -11 -ED -7F -3F -01 -01 -ENDCHAR -STARTCHAR CD75 -ENCODING 52597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR CD76 -ENCODING 52598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -79 -31 -CD -11 -ED -7F -12 -3F -ENDCHAR -STARTCHAR CD77 -ENCODING 52599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FD -1C -33 -0C -32 -1E -ENDCHAR -STARTCHAR CD78 -ENCODING 52600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1E00 -0000 -3F00 -0200 -1E00 -6180 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR CD79 -ENCODING 52601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR CD7A -ENCODING 52602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR CD7B -ENCODING 52603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -7000 -0A00 -0B00 -0C80 -ENDCHAR -STARTCHAR CD7C -ENCODING 52604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -0C00 -3F00 -0600 -3B80 -1200 -FFC0 -0000 -2000 -3F00 -ENDCHAR -STARTCHAR CD7D -ENCODING 52605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -0380 -2100 -2280 -1000 -ENDCHAR -STARTCHAR CD7E -ENCODING 52606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0300 -2480 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CD7F -ENCODING 52607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR CD80 -ENCODING 52608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0000 -3F80 -3F00 -3F00 -ENDCHAR -STARTCHAR CD81 -ENCODING 52609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0000 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CD82 -ENCODING 52610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CD83 -ENCODING 52611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0000 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CD84 -ENCODING 52612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0000 -3900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CD85 -ENCODING 52613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0000 -3F00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR CD86 -ENCODING 52614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0000 -3B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR CD87 -ENCODING 52615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0300 -3880 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR CD88 -ENCODING 52616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -1200 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CD89 -ENCODING 52617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -2000 -3F00 -3F80 -ENDCHAR -STARTCHAR CD8A -ENCODING 52618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -0900 -3900 -4A80 -3C00 -ENDCHAR -STARTCHAR CD8B -ENCODING 52619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR CD8C -ENCODING 52620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR CD8D -ENCODING 52621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -1E00 -2180 -2100 -1E00 -ENDCHAR -STARTCHAR CD8E -ENCODING 52622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -3F00 -0100 -3F80 -ENDCHAR -STARTCHAR CD8F -ENCODING 52623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CD90 -ENCODING 52624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR CD91 -ENCODING 52625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -0000 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR CD92 -ENCODING 52626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1E00 -0000 -1F00 -0E00 -7380 -1200 -FFC0 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR CD93 -ENCODING 52627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -1200 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR CD94 -ENCODING 52628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR CD95 -ENCODING 52629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0400 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR CD96 -ENCODING 52630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -F7 -08 -7E -11 -11 -10 -ENDCHAR -STARTCHAR CD97 -ENCODING 52631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -F7 -08 -E8 -14 -16 -19 -ENDCHAR -STARTCHAR CD98 -ENCODING 52632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR CD99 -ENCODING 52633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -F7 -08 -0F -42 -45 -20 -ENDCHAR -STARTCHAR CD9A -ENCODING 52634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0400 -0300 -4780 -4480 -3B00 -ENDCHAR -STARTCHAR CD9B -ENCODING 52635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -00 -3E -1C -E7 -F7 -08 -7E -40 -7E -ENDCHAR -STARTCHAR CD9C -ENCODING 52636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 12 0 -3 -BITMAP -1E00 -0000 -3F00 -1A00 -2100 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CD9D -ENCODING 52637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0400 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CD9E -ENCODING 52638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0400 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CD9F -ENCODING 52639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0400 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CDA0 -ENCODING 52640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0400 -7900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CDA1 -ENCODING 52641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0400 -3F80 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR CDA2 -ENCODING 52642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0400 -7F80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR CDA3 -ENCODING 52643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0400 -3B00 -3B80 -4480 -3B00 -ENDCHAR -STARTCHAR CDA4 -ENCODING 52644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0400 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CDA5 -ENCODING 52645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -2480 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CDA6 -ENCODING 52646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -F7 -08 -9A -F2 -95 -F8 -ENDCHAR -STARTCHAR CDA7 -ENCODING 52647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0400 -0C00 -1A00 -6180 -ENDCHAR -STARTCHAR CDA8 -ENCODING 52648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -F7 -08 -28 -26 -5D -80 -ENDCHAR -STARTCHAR CDA9 -ENCODING 52649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0400 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CDAA -ENCODING 52650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -3C -00 -3E -1C -E7 -F7 -08 -7E -02 -7F -ENDCHAR -STARTCHAR CDAB -ENCODING 52651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CDAC -ENCODING 52652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -3C -00 -3E -1C -E7 -F7 -08 -7E -01 -7F -ENDCHAR -STARTCHAR CDAD -ENCODING 52653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0400 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR CDAE -ENCODING 52654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -00 -3E -1C -E7 -F7 -08 -7F -24 -7E -ENDCHAR -STARTCHAR CDAF -ENCODING 52655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR CDB0 -ENCODING 52656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -0080 -7C80 -1880 -6680 -0080 -FE80 -1080 -1380 -1080 -1080 -ENDCHAR -STARTCHAR CDB1 -ENCODING 52657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -7E -01 -01 -01 -ENDCHAR -STARTCHAR CDB2 -ENCODING 52658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR CDB3 -ENCODING 52659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -62 -12 -15 -18 -ENDCHAR -STARTCHAR CDB4 -ENCODING 52660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -31 -79 -31 -CD -FF -27 -21 -40 -7F -ENDCHAR -STARTCHAR CDB5 -ENCODING 52661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR CDB6 -ENCODING 52662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR CDB7 -ENCODING 52663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -3E -40 -7E -ENDCHAR -STARTCHAR CDB8 -ENCODING 52664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -7F -3F -40 -3F -ENDCHAR -STARTCHAR CDB9 -ENCODING 52665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR CDBA -ENCODING 52666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR CDBB -ENCODING 52667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR CDBC -ENCODING 52668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR CDBD -ENCODING 52669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR CDBE -ENCODING 52670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CDBF -ENCODING 52671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR CDC0 -ENCODING 52672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -3E -41 -7F -ENDCHAR -STARTCHAR CDC1 -ENCODING 52673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -41 -7F -41 -3E -ENDCHAR -STARTCHAR CDC2 -ENCODING 52674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR CDC3 -ENCODING 52675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -08 -0C -33 -40 -ENDCHAR -STARTCHAR CDC4 -ENCODING 52676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -7900 -3700 -CD00 -0100 -FD00 -2100 -2200 -3300 -CC80 -ENDCHAR -STARTCHAR CDC5 -ENCODING 52677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -3E -41 -63 -1C -ENDCHAR -STARTCHAR CDC6 -ENCODING 52678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -0100 -7900 -3900 -C500 -FD00 -2700 -1C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CDC7 -ENCODING 52679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -7100 -0900 -7D00 -8100 -FF00 -2000 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CDC8 -ENCODING 52680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR CDC9 -ENCODING 52681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR CDCA -ENCODING 52682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -79 -39 -C5 -FD -27 -2D -12 -3F -ENDCHAR -STARTCHAR CDCB -ENCODING 52683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FF -0D -33 -0C -32 -1E -ENDCHAR -STARTCHAR CDCC -ENCODING 52684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -7A80 -3280 -4A80 -0280 -FE80 -1280 -1680 -1280 -0280 -ENDCHAR -STARTCHAR CDCD -ENCODING 52685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -1F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CDCE -ENCODING 52686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0000 -1D80 -0480 -0400 -ENDCHAR -STARTCHAR CDCF -ENCODING 52687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -3100 -0900 -0A80 -0840 -ENDCHAR -STARTCHAR CDD0 -ENCODING 52688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -7A80 -3680 -4E80 -0280 -FE80 -1280 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CDD1 -ENCODING 52689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR CDD2 -ENCODING 52690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -42 -47 -45 -32 -ENDCHAR -STARTCHAR CDD3 -ENCODING 52691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0000 -3F80 -3F80 -ENDCHAR -STARTCHAR CDD4 -ENCODING 52692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -7F -3F -40 -3F -ENDCHAR -STARTCHAR CDD5 -ENCODING 52693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -7F -39 -41 -38 -ENDCHAR -STARTCHAR CDD6 -ENCODING 52694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -77 -3D -45 -37 -ENDCHAR -STARTCHAR CDD7 -ENCODING 52695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -75 -3F -45 -37 -ENDCHAR -STARTCHAR CDD8 -ENCODING 52696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -7500 -FD00 -1500 -ED00 -2100 -7200 -3200 -4500 -7080 -ENDCHAR -STARTCHAR CDD9 -ENCODING 52697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -77 -3F -44 -37 -ENDCHAR -STARTCHAR CDDA -ENCODING 52698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -77 -35 -45 -77 -ENDCHAR -STARTCHAR CDDB -ENCODING 52699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -72 -37 -45 -72 -ENDCHAR -STARTCHAR CDDC -ENCODING 52700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0000 -3F80 -3F80 -ENDCHAR -STARTCHAR CDDD -ENCODING 52701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0000 -3F80 -3F80 -ENDCHAR -STARTCHAR CDDE -ENCODING 52702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0100 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR CDDF -ENCODING 52703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0400 -0600 -1900 -2080 -ENDCHAR -STARTCHAR CDE0 -ENCODING 52704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0100 -0900 -3E80 -0040 -ENDCHAR -STARTCHAR CDE1 -ENCODING 52705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0400 -3B80 -2080 -1F00 -ENDCHAR -STARTCHAR CDE2 -ENCODING 52706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0E00 -0180 -0F80 -1040 -ENDCHAR -STARTCHAR CDE3 -ENCODING 52707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -7500 -FD00 -1500 -ED00 -2100 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CDE4 -ENCODING 52708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0000 -1F80 -1F80 -0080 -ENDCHAR -STARTCHAR CDE5 -ENCODING 52709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -3F -7F -40 -3F -ENDCHAR -STARTCHAR CDE6 -ENCODING 52710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -1080 -0280 -3A80 -3A80 -4680 -FE80 -1680 -0000 -1F80 -1F80 -ENDCHAR -STARTCHAR CDE7 -ENCODING 52711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -75 -FD -15 -ED -21 -1C -7F -32 -1E -ENDCHAR -STARTCHAR CDE8 -ENCODING 52712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -0080 -7C80 -1880 -6680 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR CDE9 -ENCODING 52713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -21 -7E -01 -01 -01 -ENDCHAR -STARTCHAR CDEA -ENCODING 52714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR CDEB -ENCODING 52715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -21 -62 -12 -15 -18 -ENDCHAR -STARTCHAR CDEC -ENCODING 52716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -CD -01 -FD -11 -51 -40 -7F -ENDCHAR -STARTCHAR CDED -ENCODING 52717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR CDEE -ENCODING 52718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR CDEF -ENCODING 52719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -79 -39 -C5 -FD -21 -3E -40 -7E -ENDCHAR -STARTCHAR CDF0 -ENCODING 52720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 12 1 -3 -BITMAP -71 -01 -79 -31 -CD -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR CDF1 -ENCODING 52721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR CDF2 -ENCODING 52722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR CDF3 -ENCODING 52723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR CDF4 -ENCODING 52724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR CDF5 -ENCODING 52725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR CDF6 -ENCODING 52726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CDF7 -ENCODING 52727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR CDF8 -ENCODING 52728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -CD -01 -FD -20 -7F -41 -7F -ENDCHAR -STARTCHAR CDF9 -ENCODING 52729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -49 -FD -20 -61 -7F -41 -7F -ENDCHAR -STARTCHAR CDFA -ENCODING 52730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR CDFB -ENCODING 52731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -7900 -3100 -CD00 -0100 -FD00 -2100 -0800 -1600 -6180 -ENDCHAR -STARTCHAR CDFC -ENCODING 52732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR CDFD -ENCODING 52733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -79 -31 -CD -01 -FD -21 -3E -41 -3E -ENDCHAR -STARTCHAR CDFE -ENCODING 52734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -0100 -7900 -3900 -C500 -FD00 -2100 -1C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CDFF -ENCODING 52735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -7100 -0900 -7D00 -8100 -FD00 -2000 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CE00 -ENCODING 52736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -79 -39 -C5 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR CE01 -ENCODING 52737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR CE02 -ENCODING 52738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -79 -39 -C5 -FD -21 -2D -12 -3F -ENDCHAR -STARTCHAR CE03 -ENCODING 52739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -7D -81 -FD -0D -33 -0C -32 -1E -ENDCHAR -STARTCHAR CE04 -ENCODING 52740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1E00 -0000 -3F00 -0E00 -7180 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR CE05 -ENCODING 52741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -7E -01 -01 -ENDCHAR -STARTCHAR CE06 -ENCODING 52742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -7E -11 -11 -10 -ENDCHAR -STARTCHAR CE07 -ENCODING 52743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -E0 -14 -16 -19 -ENDCHAR -STARTCHAR CE08 -ENCODING 52744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -1200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR CE09 -ENCODING 52745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -07 -42 -45 -20 -ENDCHAR -STARTCHAR CE0A -ENCODING 52746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1200 -0100 -4780 -4480 -3B00 -ENDCHAR -STARTCHAR CE0B -ENCODING 52747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -7E -40 -7E -ENDCHAR -STARTCHAR CE0C -ENCODING 52748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 12 0 -3 -BITMAP -1E00 -0000 -3F00 -0C00 -3300 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CE0D -ENCODING 52749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1200 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CE0E -ENCODING 52750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1200 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CE0F -ENCODING 52751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1200 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CE10 -ENCODING 52752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1200 -7900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CE11 -ENCODING 52753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1200 -3F80 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR CE12 -ENCODING 52754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1200 -7F80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR CE13 -ENCODING 52755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1200 -3900 -3B80 -4480 -3B00 -ENDCHAR -STARTCHAR CE14 -ENCODING 52756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -1200 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CE15 -ENCODING 52757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -40 -7E -7F -ENDCHAR -STARTCHAR CE16 -ENCODING 52758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR CE17 -ENCODING 52759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -08 -18 -66 -81 -ENDCHAR -STARTCHAR CE18 -ENCODING 52760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -20 -26 -5D -80 -ENDCHAR -STARTCHAR CE19 -ENCODING 52761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -1200 -1F00 -2080 -3F00 -ENDCHAR -STARTCHAR CE1A -ENCODING 52762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -7E -02 -7F -ENDCHAR -STARTCHAR CE1B -ENCODING 52763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -0D00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CE1C -ENCODING 52764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -7E -01 -7F -ENDCHAR -STARTCHAR CE1D -ENCODING 52765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1200 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR CE1E -ENCODING 52766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -00 -3E -1C -E7 -DB -24 -7F -24 -7E -ENDCHAR -STARTCHAR CE1F -ENCODING 52767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -1F00 -1F00 -2080 -FFC0 -1F00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR CE20 -ENCODING 52768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -1E00 -0000 -3F00 -0200 -0C00 -7380 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR CE21 -ENCODING 52769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR CE22 -ENCODING 52770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -00 -FF -7E -11 -11 -10 -ENDCHAR -STARTCHAR CE23 -ENCODING 52771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -00 -FF -E0 -14 -16 -19 -ENDCHAR -STARTCHAR CE24 -ENCODING 52772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CE25 -ENCODING 52773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -00 -FF -07 -42 -45 -20 -ENDCHAR -STARTCHAR CE26 -ENCODING 52774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0300 -2480 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CE27 -ENCODING 52775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -00 -3E -1C -E7 -00 -FF -7E -40 -7E -ENDCHAR -STARTCHAR CE28 -ENCODING 52776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0E00 -7180 -0000 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CE29 -ENCODING 52777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CE2A -ENCODING 52778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CE2B -ENCODING 52779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CE2C -ENCODING 52780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CE2D -ENCODING 52781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3F00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR CE2E -ENCODING 52782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR CE2F -ENCODING 52783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0300 -3880 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR CE30 -ENCODING 52784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CE31 -ENCODING 52785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CE32 -ENCODING 52786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -00 -FF -12 -72 -95 -78 -ENDCHAR -STARTCHAR CE33 -ENCODING 52787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0000 -0400 -1E00 -6180 -ENDCHAR -STARTCHAR CE34 -ENCODING 52788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -3C -00 -3E -1C -E7 -00 -FF -20 -26 -5D -80 -ENDCHAR -STARTCHAR CE35 -ENCODING 52789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1E00 -0000 -3F00 -0C00 -7380 -0000 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CE36 -ENCODING 52790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -3C -00 -3E -1C -E7 -00 -FF -7E -02 -7F -ENDCHAR -STARTCHAR CE37 -ENCODING 52791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CE38 -ENCODING 52792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -3C -00 -3E -1C -E7 -00 -FF -7E -01 -7F -ENDCHAR -STARTCHAR CE39 -ENCODING 52793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -0000 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR CE3A -ENCODING 52794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -3C -00 -3E -1C -E7 -00 -FF -7F -24 -7E -ENDCHAR -STARTCHAR CE3B -ENCODING 52795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -1E00 -0100 -3F80 -0000 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR CE3C -ENCODING 52796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -21 -F9 -09 -31 -CD -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR CE3D -ENCODING 52797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CE3E -ENCODING 52798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -77 -09 -09 -09 -ENDCHAR -STARTCHAR CE3F -ENCODING 52799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -72 -12 -15 -10 -ENDCHAR -STARTCHAR CE40 -ENCODING 52800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -21 -F9 -31 -CD -01 -FD -01 -40 -7F -ENDCHAR -STARTCHAR CE41 -ENCODING 52801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -47 -41 -47 -30 -ENDCHAR -STARTCHAR CE42 -ENCODING 52802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -06 -41 -46 -49 -36 -ENDCHAR -STARTCHAR CE43 -ENCODING 52803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -3F -40 -7E -ENDCHAR -STARTCHAR CE44 -ENCODING 52804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -00 -3F -3F -40 -3F -ENDCHAR -STARTCHAR CE45 -ENCODING 52805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR CE46 -ENCODING 52806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR CE47 -ENCODING 52807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR CE48 -ENCODING 52808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -00 -72 -72 -45 -70 -ENDCHAR -STARTCHAR CE49 -ENCODING 52809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR CE4A -ENCODING 52810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CE4B -ENCODING 52811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR CE4C -ENCODING 52812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -3F -41 -7F -ENDCHAR -STARTCHAR CE4D -ENCODING 52813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -01 -3F -7F -ENDCHAR -STARTCHAR CE4E -ENCODING 52814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -12 -72 -55 -70 -ENDCHAR -STARTCHAR CE4F -ENCODING 52815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -7F -81 -08 -0C -33 -40 -ENDCHAR -STARTCHAR CE50 -ENCODING 52816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -22 -22 -55 -08 -ENDCHAR -STARTCHAR CE51 -ENCODING 52817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -7F -81 -3E -41 -23 -1C -ENDCHAR -STARTCHAR CE52 -ENCODING 52818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -0100 -7900 -3100 -CD00 -3F00 -C100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CE53 -ENCODING 52819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -7100 -0900 -7900 -8500 -FF00 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR CE54 -ENCODING 52820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -7F -3F -01 -01 -ENDCHAR -STARTCHAR CE55 -ENCODING 52821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR CE56 -ENCODING 52822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -79 -31 -CD -3F -C1 -7F -12 -3F -ENDCHAR -STARTCHAR CE57 -ENCODING 52823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -71 -09 -79 -85 -FF -1C -33 -0C -32 -1E -ENDCHAR -STARTCHAR CE58 -ENCODING 52824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -09 -11 -31 -49 -85 -01 -01 -01 -ENDCHAR -STARTCHAR CE59 -ENCODING 52825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -09 -31 -CD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CE5A -ENCODING 52826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -F9 -11 -31 -49 -80 -7F -09 -09 -09 -ENDCHAR -STARTCHAR CE5B -ENCODING 52827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -0100 -F900 -1100 -3100 -4900 -8000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CE5C -ENCODING 52828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -09 -11 -69 -85 -01 -20 -20 -3F -ENDCHAR -STARTCHAR CE5D -ENCODING 52829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -F9 -11 -31 -49 -87 -41 -42 -45 -30 -ENDCHAR -STARTCHAR CE5E -ENCODING 52830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -06 -41 -46 -49 -36 -ENDCHAR -STARTCHAR CE5F -ENCODING 52831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -09 -31 -CD -00 -3F -40 -40 -3F -ENDCHAR -STARTCHAR CE60 -ENCODING 52832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -31 -CD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CE61 -ENCODING 52833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -31 -CD -00 -77 -11 -71 -41 -79 -ENDCHAR -STARTCHAR CE62 -ENCODING 52834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR CE63 -ENCODING 52835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR CE64 -ENCODING 52836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -00 -72 -72 -45 -70 -ENDCHAR -STARTCHAR CE65 -ENCODING 52837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR CE66 -ENCODING 52838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR CE67 -ENCODING 52839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR CE68 -ENCODING 52840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -09 -31 -CD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CE69 -ENCODING 52841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -09 -31 -CD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR CE6A -ENCODING 52842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -F9 -11 -31 -49 -80 -12 -72 -55 -70 -ENDCHAR -STARTCHAR CE6B -ENCODING 52843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -09 -31 -CD -01 -08 -14 -36 -41 -ENDCHAR -STARTCHAR CE6C -ENCODING 52844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -0100 -F900 -1100 -3100 -4900 -8000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CE6D -ENCODING 52845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR CE6E -ENCODING 52846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -2100 -0100 -F900 -1100 -3100 -4900 -8000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR CE6F -ENCODING 52847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -1100 -3100 -CD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR CE70 -ENCODING 52848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -21 -01 -F9 -11 -31 -49 -80 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CE71 -ENCODING 52849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR CE72 -ENCODING 52850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -01 -F9 -11 -31 -49 -80 -3F -12 -3F -ENDCHAR -STARTCHAR CE73 -ENCODING 52851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -11 -31 -CD -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR CE74 -ENCODING 52852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -F100 -1180 -2100 -4100 -8100 -0100 -0100 -0100 -ENDCHAR -STARTCHAR CE75 -ENCODING 52853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F100 -1180 -6100 -8100 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR CE76 -ENCODING 52854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -0900 -F180 -2100 -C100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR CE77 -ENCODING 52855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0900 -F180 -2100 -C100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR CE78 -ENCODING 52856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -F180 -1100 -6100 -8100 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR CE79 -ENCODING 52857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0900 -F180 -2100 -C100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR CE7A -ENCODING 52858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR CE7B -ENCODING 52859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0900 -F180 -2100 -C100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR CE7C -ENCODING 52860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F180 -1100 -6100 -8000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR CE7D -ENCODING 52861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR CE7E -ENCODING 52862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR CE7F -ENCODING 52863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR CE80 -ENCODING 52864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR CE81 -ENCODING 52865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR CE82 -ENCODING 52866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR CE83 -ENCODING 52867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR CE84 -ENCODING 52868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F100 -1180 -6100 -8100 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR CE85 -ENCODING 52869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F180 -1100 -6100 -8000 -4100 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR CE86 -ENCODING 52870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0900 -F180 -2100 -C100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CE87 -ENCODING 52871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -1100 -F180 -1100 -6100 -8100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR CE88 -ENCODING 52872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0900 -F180 -2100 -C100 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR CE89 -ENCODING 52873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F100 -1180 -6100 -8100 -3C00 -6200 -4100 -6200 -3C00 -ENDCHAR -STARTCHAR CE8A -ENCODING 52874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0900 -F180 -2100 -C100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR CE8B -ENCODING 52875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR CE8C -ENCODING 52876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -0900 -F180 -2100 -C100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR CE8D -ENCODING 52877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR CE8E -ENCODING 52878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0900 -F180 -2100 -C100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR CE8F -ENCODING 52879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0900 -F180 -2100 -C000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR CE90 -ENCODING 52880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -F5 -27 -25 -45 -85 -05 -05 -05 -ENDCHAR -STARTCHAR CE91 -ENCODING 52881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -27 -65 -85 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CE92 -ENCODING 52882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -F7 -25 -C5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CE93 -ENCODING 52883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -F700 -2500 -C500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR CE94 -ENCODING 52884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -F700 -2500 -4500 -8500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CE95 -ENCODING 52885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -F700 -2500 -C500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR CE96 -ENCODING 52886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR CE97 -ENCODING 52887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -F7 -25 -C5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR CE98 -ENCODING 52888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F7 -25 -C5 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CE99 -ENCODING 52889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR CE9A -ENCODING 52890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR CE9B -ENCODING 52891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR CE9C -ENCODING 52892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR CE9D -ENCODING 52893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR CE9E -ENCODING 52894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CE9F -ENCODING 52895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR CEA0 -ENCODING 52896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -27 -65 -85 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CEA1 -ENCODING 52897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -27 -65 -85 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR CEA2 -ENCODING 52898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -F700 -2500 -C500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR CEA3 -ENCODING 52899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -F700 -2500 -4500 -8500 -0900 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR CEA4 -ENCODING 52900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -F500 -2700 -6500 -8500 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR CEA5 -ENCODING 52901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -F5 -27 -65 -85 -00 -3E -21 -21 -3E -ENDCHAR -STARTCHAR CEA6 -ENCODING 52902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -F700 -2500 -C500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR CEA7 -ENCODING 52903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -1500 -7700 -6500 -8500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR CEA8 -ENCODING 52904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -F7 -25 -C5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CEA9 -ENCODING 52905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR CEAA -ENCODING 52906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -F7 -25 -C5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CEAB -ENCODING 52907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -77 -65 -85 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR CEAC -ENCODING 52908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0980 -F100 -1100 -2180 -4100 -8100 -0100 -0100 -0100 -ENDCHAR -STARTCHAR CEAD -ENCODING 52909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0980 -F100 -1180 -6100 -8100 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR CEAE -ENCODING 52910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR CEAF -ENCODING 52911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR CEB0 -ENCODING 52912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -F100 -2100 -4180 -8100 -4000 -4000 -7E00 -ENDCHAR -STARTCHAR CEB1 -ENCODING 52913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -F100 -2180 -C100 -0600 -4100 -4200 -4500 -3000 -ENDCHAR -STARTCHAR CEB2 -ENCODING 52914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR CEB3 -ENCODING 52915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -7E00 -4000 -7E00 -ENDCHAR -STARTCHAR CEB4 -ENCODING 52916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -7E00 -0100 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR CEB5 -ENCODING 52917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR CEB6 -ENCODING 52918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR CEB7 -ENCODING 52919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR CEB8 -ENCODING 52920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR CEB9 -ENCODING 52921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR CEBA -ENCODING 52922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR CEBB -ENCODING 52923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR CEBC -ENCODING 52924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -7F00 -4100 -7F00 -ENDCHAR -STARTCHAR CEBD -ENCODING 52925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -4100 -7F00 -7F00 -ENDCHAR -STARTCHAR CEBE -ENCODING 52926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CEBF -ENCODING 52927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR CEC0 -ENCODING 52928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR CEC1 -ENCODING 52929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0980 -F100 -1180 -6100 -8100 -3C00 -6200 -4100 -6200 -3C00 -ENDCHAR -STARTCHAR CEC2 -ENCODING 52930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -3E00 -0400 -3F00 -4000 -ENDCHAR -STARTCHAR CEC3 -ENCODING 52931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR CEC4 -ENCODING 52932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -3F00 -7E00 -0100 -ENDCHAR -STARTCHAR CEC5 -ENCODING 52933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR CEC6 -ENCODING 52934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -0980 -F100 -2180 -C100 -0000 -3E00 -2200 -7F00 -ENDCHAR -STARTCHAR CEC7 -ENCODING 52935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -0980 -F100 -2180 -C000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR CEC8 -ENCODING 52936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -F5 -15 -17 -F5 -25 -47 -85 -05 -05 -ENDCHAR -STARTCHAR CEC9 -ENCODING 52937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -F5 -27 -C5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CECA -ENCODING 52938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -F5 -27 -C5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CECB -ENCODING 52939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -2700 -C500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR CECC -ENCODING 52940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -F7 -25 -47 -85 -05 -20 -3F -ENDCHAR -STARTCHAR CECD -ENCODING 52941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -2700 -C500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR CECE -ENCODING 52942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR CECF -ENCODING 52943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -27 -C5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR CED0 -ENCODING 52944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CED1 -ENCODING 52945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR CED2 -ENCODING 52946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR CED3 -ENCODING 52947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR CED4 -ENCODING 52948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR CED5 -ENCODING 52949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR CED6 -ENCODING 52950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CED7 -ENCODING 52951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR CED8 -ENCODING 52952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -27 -C5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR CED9 -ENCODING 52953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -27 -C5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR CEDA -ENCODING 52954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -2700 -C500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR CEDB -ENCODING 52955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -27 -C5 -00 -08 -14 -63 -ENDCHAR -STARTCHAR CEDC -ENCODING 52956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -2700 -C500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CEDD -ENCODING 52957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -F5 -27 -C5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR CEDE -ENCODING 52958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1700 -F500 -2700 -C500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR CEDF -ENCODING 52959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -1700 -7500 -6700 -8500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR CEE0 -ENCODING 52960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -17 -F5 -27 -C5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CEE1 -ENCODING 52961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR CEE2 -ENCODING 52962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -17 -F5 -27 -C5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CEE3 -ENCODING 52963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -17 -75 -67 -85 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR CEE4 -ENCODING 52964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -FF -11 -21 -41 -81 -01 -01 -01 -ENDCHAR -STARTCHAR CEE5 -ENCODING 52965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F7 -11 -21 -C1 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CEE6 -ENCODING 52966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -F7 -21 -41 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR CEE7 -ENCODING 52967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -F700 -2100 -4100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CEE8 -ENCODING 52968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -F7 -11 -61 -81 -01 -20 -20 -3F -ENDCHAR -STARTCHAR CEE9 -ENCODING 52969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -F7 -21 -41 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR CEEA -ENCODING 52970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR CEEB -ENCODING 52971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F7 -11 -21 -C1 -00 -3F -20 -20 -3F -ENDCHAR -STARTCHAR CEEC -ENCODING 52972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F7 -11 -21 -C0 -3F -01 -3F -20 -3F -ENDCHAR -STARTCHAR CEED -ENCODING 52973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR CEEE -ENCODING 52974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CEEF -ENCODING 52975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR CEF0 -ENCODING 52976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR CEF1 -ENCODING 52977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR CEF2 -ENCODING 52978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CEF3 -ENCODING 52979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR CEF4 -ENCODING 52980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F7 -11 -21 -C1 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CEF5 -ENCODING 52981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F7 -11 -21 -C0 -41 -41 -3F -41 -3F -ENDCHAR -STARTCHAR CEF6 -ENCODING 52982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -F700 -2100 -4100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CEF7 -ENCODING 52983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0900 -F700 -1100 -6100 -8100 -0800 -0800 -3600 -4180 -ENDCHAR -STARTCHAR CEF8 -ENCODING 52984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F700 -1100 -2100 -C100 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR CEF9 -ENCODING 52985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F7 -11 -21 -C1 -1E -21 -41 -21 -1E -ENDCHAR -STARTCHAR CEFA -ENCODING 52986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -F700 -2100 -4100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR CEFB -ENCODING 52987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0900 -7700 -2100 -C100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR CEFC -ENCODING 52988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -F7 -21 -41 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CEFD -ENCODING 52989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR CEFE -ENCODING 52990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -F7 -21 -41 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CEFF -ENCODING 52991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -77 -21 -C1 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR CF00 -ENCODING 52992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -15 -FD -25 -25 -45 -85 -05 -05 -05 -ENDCHAR -STARTCHAR CF01 -ENCODING 52993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -FD -25 -45 -85 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CF02 -ENCODING 52994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -FD -25 -C5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CF03 -ENCODING 52995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -2500 -C500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR CF04 -ENCODING 52996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -FD00 -2500 -4500 -8500 -2500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CF05 -ENCODING 52997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -2500 -C500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR CF06 -ENCODING 52998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR CF07 -ENCODING 52999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -FD -25 -C5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR CF08 -ENCODING 53000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -FD -25 -45 -80 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CF09 -ENCODING 53001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR CF0A -ENCODING 53002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR CF0B -ENCODING 53003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR CF0C -ENCODING 53004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR CF0D -ENCODING 53005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR CF0E -ENCODING 53006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CF0F -ENCODING 53007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR CF10 -ENCODING 53008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -FD -25 -45 -85 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CF11 -ENCODING 53009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -FD -25 -45 -85 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR CF12 -ENCODING 53010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -2500 -C500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR CF13 -ENCODING 53011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -1500 -1500 -FD00 -2500 -4500 -8100 -0800 -0C00 -3200 -4180 -ENDCHAR -STARTCHAR CF14 -ENCODING 53012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -2500 -C500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CF15 -ENCODING 53013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -FD -25 -45 -81 -1E -21 -41 -21 -1E -ENDCHAR -STARTCHAR CF16 -ENCODING 53014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1500 -FD00 -2500 -C500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR CF17 -ENCODING 53015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -1500 -7D00 -6500 -8100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR CF18 -ENCODING 53016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -15 -FD -25 -C5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CF19 -ENCODING 53017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR CF1A -ENCODING 53018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -15 -FD -25 -C5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CF1B -ENCODING 53019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -15 -7D -65 -81 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR CF1C -ENCODING 53020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -F1 -11 -2F -41 -81 -01 -01 -01 -ENDCHAR -STARTCHAR CF1D -ENCODING 53021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -0F -F1 -2F -41 -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR CF1E -ENCODING 53022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -0F -F1 -2F -41 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR CF1F -ENCODING 53023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0F00 -F100 -2F00 -4100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CF20 -ENCODING 53024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -0F -F1 -11 -6F -81 -01 -20 -20 -3F -ENDCHAR -STARTCHAR CF21 -ENCODING 53025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -0F -F1 -2F -41 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR CF22 -ENCODING 53026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR CF23 -ENCODING 53027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -0F -F1 -2F -41 -00 -7E -40 -7E -ENDCHAR -STARTCHAR CF24 -ENCODING 53028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -F1 -1F -21 -C0 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CF25 -ENCODING 53029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR CF26 -ENCODING 53030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CF27 -ENCODING 53031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR CF28 -ENCODING 53032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR CF29 -ENCODING 53033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR CF2A -ENCODING 53034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CF2B -ENCODING 53035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR CF2C -ENCODING 53036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -F1 -1F -61 -81 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR CF2D -ENCODING 53037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -F1 -1F -61 -80 -41 -41 -3F -41 -3F -ENDCHAR -STARTCHAR CF2E -ENCODING 53038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0F00 -F100 -2F00 -4100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR CF2F -ENCODING 53039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -0F00 -F100 -1F00 -6100 -8100 -0800 -0800 -3600 -4180 -ENDCHAR -STARTCHAR CF30 -ENCODING 53040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -FF00 -1100 -6F00 -C100 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR CF31 -ENCODING 53041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -0F -F1 -1F -61 -81 -1E -21 -41 -21 -1E -ENDCHAR -STARTCHAR CF32 -ENCODING 53042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0F00 -F100 -2F00 -4100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR CF33 -ENCODING 53043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0F00 -7100 -2F00 -C100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR CF34 -ENCODING 53044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -0F -F1 -2F -41 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CF35 -ENCODING 53045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR CF36 -ENCODING 53046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -0F -F1 -2F -41 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CF37 -ENCODING 53047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -0F -71 -2F -C1 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR CF38 -ENCODING 53048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -15 -1D -F5 -25 -3D -45 -85 -05 -05 -05 -ENDCHAR -STARTCHAR CF39 -ENCODING 53049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -F5 -3D -C5 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CF3A -ENCODING 53050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -F5 -3D -C5 -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR CF3B -ENCODING 53051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -3D00 -C500 -0000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR CF3C -ENCODING 53052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -F5 -2D -45 -85 -01 -20 -3F -ENDCHAR -STARTCHAR CF3D -ENCODING 53053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -3D00 -C500 -0700 -4100 -4100 -4680 -3000 -ENDCHAR -STARTCHAR CF3E -ENCODING 53054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR CF3F -ENCODING 53055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -F5 -3D -C5 -00 -3F -40 -7F -ENDCHAR -STARTCHAR CF40 -ENCODING 53056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR CF41 -ENCODING 53057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR CF42 -ENCODING 53058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR CF43 -ENCODING 53059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR CF44 -ENCODING 53060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR CF45 -ENCODING 53061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR CF46 -ENCODING 53062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR CF47 -ENCODING 53063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR CF48 -ENCODING 53064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -F5 -3D -C5 -00 -3F -41 -7F -ENDCHAR -STARTCHAR CF49 -ENCODING 53065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -F5 -3D -C5 -00 -21 -3F -3F -ENDCHAR -STARTCHAR CF4A -ENCODING 53066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -3D00 -C500 -0000 -4A00 -7200 -4D00 -7080 -ENDCHAR -STARTCHAR CF4B -ENCODING 53067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -F5 -3D -C5 -00 -08 -14 -63 -ENDCHAR -STARTCHAR CF4C -ENCODING 53068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -3D00 -C500 -0000 -1200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR CF4D -ENCODING 53069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -F5 -3D -C5 -0C -33 -41 -21 -1E -ENDCHAR -STARTCHAR CF4E -ENCODING 53070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -1D00 -F500 -3D00 -C500 -0000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR CF4F -ENCODING 53071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7500 -1D00 -7500 -7D00 -8100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR CF50 -ENCODING 53072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -1D -F5 -3D -C5 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR CF51 -ENCODING 53073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR CF52 -ENCODING 53074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -1D -F5 -3D -C5 -00 -3F -12 -3F -ENDCHAR -STARTCHAR CF53 -ENCODING 53075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -75 -1D -75 -7D -81 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR CF54 -ENCODING 53076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -0080 -0080 -3F80 -0080 -0880 -0900 -0800 -FFC0 -ENDCHAR -STARTCHAR CF55 -ENCODING 53077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0900 -0800 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CF56 -ENCODING 53078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -0800 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR CF57 -ENCODING 53079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -0800 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR CF58 -ENCODING 53080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0900 -0800 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CF59 -ENCODING 53081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -0800 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR CF5A -ENCODING 53082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CF5B -ENCODING 53083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -3E80 -0100 -0800 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR CF5C -ENCODING 53084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0900 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CF5D -ENCODING 53085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CF5E -ENCODING 53086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CF5F -ENCODING 53087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CF60 -ENCODING 53088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CF61 -ENCODING 53089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR CF62 -ENCODING 53090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR CF63 -ENCODING 53091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR CF64 -ENCODING 53092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0900 -0800 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR CF65 -ENCODING 53093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0900 -0800 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CF66 -ENCODING 53094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -0800 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR CF67 -ENCODING 53095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0900 -0800 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR CF68 -ENCODING 53096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -0800 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR CF69 -ENCODING 53097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0900 -0800 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR CF6A -ENCODING 53098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -3E80 -0100 -0800 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR CF6B -ENCODING 53099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR CF6C -ENCODING 53100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -3E80 -0100 -0800 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR CF6D -ENCODING 53101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR CF6E -ENCODING 53102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -3E80 -0100 -0800 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR CF6F -ENCODING 53103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0400 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR CF70 -ENCODING 53104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -0480 -7C80 -0480 -14C0 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CF71 -ENCODING 53105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -7C80 -04C0 -1080 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CF72 -ENCODING 53106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -3F00 -0880 -0880 -ENDCHAR -STARTCHAR CF73 -ENCODING 53107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -3900 -0900 -0A80 -0800 -ENDCHAR -STARTCHAR CF74 -ENCODING 53108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -7C80 -1480 -10C0 -FE80 -0080 -2080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR CF75 -ENCODING 53109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR CF76 -ENCODING 53110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CF77 -ENCODING 53111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -3F80 -2000 -3F00 -ENDCHAR -STARTCHAR CF78 -ENCODING 53112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -7CC0 -1480 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CF79 -ENCODING 53113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CF7A -ENCODING 53114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CF7B -ENCODING 53115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR CF7C -ENCODING 53116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CF7D -ENCODING 53117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR CF7E -ENCODING 53118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR CF7F -ENCODING 53119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR CF80 -ENCODING 53120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -7C80 -04C0 -1080 -FE80 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR CF81 -ENCODING 53121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -2080 -3F00 -3F80 -ENDCHAR -STARTCHAR CF82 -ENCODING 53122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -0900 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR CF83 -ENCODING 53123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR CF84 -ENCODING 53124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -1100 -1100 -2A80 -4400 -ENDCHAR -STARTCHAR CF85 -ENCODING 53125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -0480 -7C80 -04C0 -1080 -FE80 -0080 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR CF86 -ENCODING 53126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -1F00 -0300 -1F80 -2000 -ENDCHAR -STARTCHAR CF87 -ENCODING 53127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR CF88 -ENCODING 53128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -3F00 -1F80 -0080 -ENDCHAR -STARTCHAR CF89 -ENCODING 53129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR CF8A -ENCODING 53130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -3C80 -04C0 -1080 -FE80 -0000 -3F80 -1100 -3F80 -ENDCHAR -STARTCHAR CF8B -ENCODING 53131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3C80 -7C80 -14C0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR CF8C -ENCODING 53132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -0A80 -7A80 -0B80 -2A80 -2280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR CF8D -ENCODING 53133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CF8E -ENCODING 53134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR CF8F -ENCODING 53135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR CF90 -ENCODING 53136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -0D -FD -17 -25 -D5 -00 -20 -3F -ENDCHAR -STARTCHAR CF91 -ENCODING 53137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR CF92 -ENCODING 53138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR CF93 -ENCODING 53139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR CF94 -ENCODING 53140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CF95 -ENCODING 53141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR CF96 -ENCODING 53142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR CF97 -ENCODING 53143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR CF98 -ENCODING 53144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR CF99 -ENCODING 53145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR CF9A -ENCODING 53146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR CF9B -ENCODING 53147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR CF9C -ENCODING 53148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR CF9D -ENCODING 53149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -1080 -1F80 -1F80 -ENDCHAR -STARTCHAR CF9E -ENCODING 53150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -2900 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR CF9F -ENCODING 53151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR CFA0 -ENCODING 53152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -1100 -1900 -2E80 -0040 -ENDCHAR -STARTCHAR CFA1 -ENCODING 53153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -7A80 -0B80 -1280 -FE80 -0080 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR CFA2 -ENCODING 53154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR CFA3 -ENCODING 53155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -0E00 -1F80 -0100 -0F80 -3040 -ENDCHAR -STARTCHAR CFA4 -ENCODING 53156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -1F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR CFA5 -ENCODING 53157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR CFA6 -ENCODING 53158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -3A80 -0B80 -1280 -FE80 -0000 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR CFA7 -ENCODING 53159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3A80 -7A80 -0B80 -1280 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR CFA8 -ENCODING 53160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -F9 -09 -29 -21 -FD -01 -01 -01 -ENDCHAR -STARTCHAR CFA9 -ENCODING 53161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR CFAA -ENCODING 53162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR CFAB -ENCODING 53163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -7900 -0900 -2100 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR CFAC -ENCODING 53164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -F9 -29 -21 -DD -01 -40 -7F -ENDCHAR -STARTCHAR CFAD -ENCODING 53165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR CFAE -ENCODING 53166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR CFAF -ENCODING 53167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR CFB0 -ENCODING 53168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -05 -79 -29 -FD -00 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR CFB1 -ENCODING 53169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR CFB2 -ENCODING 53170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR CFB3 -ENCODING 53171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR CFB4 -ENCODING 53172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR CFB5 -ENCODING 53173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR CFB6 -ENCODING 53174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR CFB7 -ENCODING 53175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR CFB8 -ENCODING 53176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -7F -41 -7F -ENDCHAR -STARTCHAR CFB9 -ENCODING 53177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -41 -7F -7F -ENDCHAR -STARTCHAR CFBA -ENCODING 53178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR CFBB -ENCODING 53179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR CFBC -ENCODING 53180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR CFBD -ENCODING 53181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR CFBE -ENCODING 53182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -7900 -0900 -2100 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR CFBF -ENCODING 53183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -F900 -0900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR CFC0 -ENCODING 53184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR CFC1 -ENCODING 53185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR CFC2 -ENCODING 53186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -21 -FD -01 -7F -12 -3F -ENDCHAR -STARTCHAR CFC3 -ENCODING 53187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -09 -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR CFC4 -ENCODING 53188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -0080 -0080 -3F80 -0080 -1280 -1300 -1200 -FFC0 -ENDCHAR -STARTCHAR CFC5 -ENCODING 53189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR CFC6 -ENCODING 53190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR CFC7 -ENCODING 53191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR CFC8 -ENCODING 53192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -3F00 -1300 -1200 -FFC0 -2000 -2000 -3F00 -ENDCHAR -STARTCHAR CFC9 -ENCODING 53193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR CFCA -ENCODING 53194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR CFCB -ENCODING 53195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR CFCC -ENCODING 53196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -3F00 -0080 -3F00 -3F00 -ENDCHAR -STARTCHAR CFCD -ENCODING 53197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CFCE -ENCODING 53198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CFCF -ENCODING 53199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CFD0 -ENCODING 53200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CFD1 -ENCODING 53201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR CFD2 -ENCODING 53202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR CFD3 -ENCODING 53203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR CFD4 -ENCODING 53204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -3F00 -2080 -3F80 -ENDCHAR -STARTCHAR CFD5 -ENCODING 53205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -2080 -3F00 -3F80 -ENDCHAR -STARTCHAR CFD6 -ENCODING 53206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR CFD7 -ENCODING 53207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR CFD8 -ENCODING 53208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR CFD9 -ENCODING 53209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR CFDA -ENCODING 53210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR CFDB -ENCODING 53211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR CFDC -ENCODING 53212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR CFDD -ENCODING 53213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR CFDE -ENCODING 53214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -3E80 -0100 -1400 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR CFDF -ENCODING 53215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -1200 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR CFE0 -ENCODING 53216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -0100 -0100 -FFC0 -0400 -0400 -0400 -0400 -ENDCHAR -STARTCHAR CFE1 -ENCODING 53217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR CFE2 -ENCODING 53218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -08 -7E -11 -11 -10 -ENDCHAR -STARTCHAR CFE3 -ENCODING 53219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7F00 -0500 -7A00 -0000 -FF00 -0800 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR CFE4 -ENCODING 53220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0100 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR CFE5 -ENCODING 53221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -08 -47 -42 -45 -30 -ENDCHAR -STARTCHAR CFE6 -ENCODING 53222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -0700 -4780 -4300 -4480 -3B00 -ENDCHAR -STARTCHAR CFE7 -ENCODING 53223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -05 -7A -00 -FF -08 -7E -40 -7E -ENDCHAR -STARTCHAR CFE8 -ENCODING 53224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR CFE9 -ENCODING 53225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR CFEA -ENCODING 53226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -3F80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR CFEB -ENCODING 53227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR CFEC -ENCODING 53228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -3500 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR CFED -ENCODING 53229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -3700 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR CFEE -ENCODING 53230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -3500 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR CFEF -ENCODING 53231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -3700 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR CFF0 -ENCODING 53232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR CFF1 -ENCODING 53233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -2480 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR CFF2 -ENCODING 53234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -08 -92 -F6 -95 -F8 -ENDCHAR -STARTCHAR CFF3 -ENCODING 53235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0100 -FFC0 -0400 -0400 -0C00 -1A00 -6180 -ENDCHAR -STARTCHAR CFF4 -ENCODING 53236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -08 -20 -26 -5D -80 -ENDCHAR -STARTCHAR CFF5 -ENCODING 53237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0100 -FFC0 -0400 -1F00 -2180 -2180 -1F00 -ENDCHAR -STARTCHAR CFF6 -ENCODING 53238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -05 -7A -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR CFF7 -ENCODING 53239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -1E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR CFF8 -ENCODING 53240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -05 -7A -00 -FF -08 -7E -01 -7F -ENDCHAR -STARTCHAR CFF9 -ENCODING 53241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -3F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR CFFA -ENCODING 53242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -05 -7A -00 -FF -08 -7F -24 -7E -ENDCHAR -STARTCHAR CFFB -ENCODING 53243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0400 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR CFFC -ENCODING 53244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -7C80 -0480 -0480 -FE80 -1080 -1380 -1080 -1080 -0080 -ENDCHAR -STARTCHAR CFFD -ENCODING 53245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -3E -01 -01 -01 -ENDCHAR -STARTCHAR CFFE -ENCODING 53246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR CFFF -ENCODING 53247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -72 -12 -15 -10 -ENDCHAR -STARTCHAR D000 -ENCODING 53248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -09 -FF -21 -27 -21 -40 -40 -7F -ENDCHAR -STARTCHAR D001 -ENCODING 53249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D002 -ENCODING 53250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR D003 -ENCODING 53251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -3F -40 -7E -ENDCHAR -STARTCHAR D004 -ENCODING 53252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -FF -09 -FF -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR D005 -ENCODING 53253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR D006 -ENCODING 53254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR D007 -ENCODING 53255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D008 -ENCODING 53256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR D009 -ENCODING 53257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D00A -ENCODING 53258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR D00B -ENCODING 53259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR D00C -ENCODING 53260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -7F -41 -7F -ENDCHAR -STARTCHAR D00D -ENCODING 53261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -41 -7F -7F -ENDCHAR -STARTCHAR D00E -ENCODING 53262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -52 -72 -55 -78 -ENDCHAR -STARTCHAR D00F -ENCODING 53263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -08 -14 -63 -ENDCHAR -STARTCHAR D010 -ENCODING 53264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D011 -ENCODING 53265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -FF -09 -FF -21 -20 -3E -41 -41 -3E -ENDCHAR -STARTCHAR D012 -ENCODING 53266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1900 -6900 -DF00 -2100 -2700 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D013 -ENCODING 53267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -7900 -0900 -FD00 -2700 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D014 -ENCODING 53268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR D015 -ENCODING 53269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR D016 -ENCODING 53270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -19 -69 -DF -21 -27 -3F -12 -3F -ENDCHAR -STARTCHAR D017 -ENCODING 53271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -27 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D018 -ENCODING 53272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -7A80 -0A80 -0A80 -FE80 -1280 -1680 -1280 -1280 -0280 -ENDCHAR -STARTCHAR D019 -ENCODING 53273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -13 -73 -FB -2B -21 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D01A -ENCODING 53274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -13 -73 -FB -2B -21 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D01B -ENCODING 53275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -1300 -7300 -FB00 -2B00 -2100 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR D01C -ENCODING 53276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -0A80 -3A80 -FE80 -1680 -1280 -0080 -2000 -3F80 -ENDCHAR -STARTCHAR D01D -ENCODING 53277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -1300 -7300 -FB00 -2B00 -2100 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR D01E -ENCODING 53278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -27C0 -2380 -2280 -1900 -ENDCHAR -STARTCHAR D01F -ENCODING 53279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -13 -73 -FB -2B -21 -3F -40 -7F -ENDCHAR -STARTCHAR D020 -ENCODING 53280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -1F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR D021 -ENCODING 53281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -1F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR D022 -ENCODING 53282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -3B80 -1A80 -2280 -1B80 -ENDCHAR -STARTCHAR D023 -ENCODING 53283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -1E80 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR D024 -ENCODING 53284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -3900 -3900 -2280 -3800 -ENDCHAR -STARTCHAR D025 -ENCODING 53285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -1F80 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR D026 -ENCODING 53286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR D027 -ENCODING 53287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0380 -3F80 -3B80 -2280 -3900 -ENDCHAR -STARTCHAR D028 -ENCODING 53288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -13 -73 -FB -2B -21 -3F -41 -7F -ENDCHAR -STARTCHAR D029 -ENCODING 53289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -13 -73 -FB -2B -21 -41 -7F -7F -ENDCHAR -STARTCHAR D02A -ENCODING 53290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -1300 -7300 -FB00 -2B00 -2100 -4200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D02B -ENCODING 53291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -13 -73 -FB -2B -21 -08 -1C -63 -ENDCHAR -STARTCHAR D02C -ENCODING 53292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -13 -73 -FB -2B -21 -02 -22 -55 -08 -ENDCHAR -STARTCHAR D02D -ENCODING 53293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -0A80 -7E80 -0A80 -FE80 -1280 -1080 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR D02E -ENCODING 53294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F300 -1300 -7300 -FB00 -2B00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D02F -ENCODING 53295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR D030 -ENCODING 53296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F3 -13 -73 -FB -2B -21 -3F -01 -3F -01 -ENDCHAR -STARTCHAR D031 -ENCODING 53297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0000 -1F80 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR D032 -ENCODING 53298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F3 -13 -73 -FB -2B -21 -3F -12 -3F -ENDCHAR -STARTCHAR D033 -ENCODING 53299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -3A80 -0A80 -FE80 -1680 -0E00 -1980 -0600 -1900 -0F00 -ENDCHAR -STARTCHAR D034 -ENCODING 53300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -0480 -7C80 -0480 -0480 -FE80 -1080 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR D035 -ENCODING 53301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -09 -FF -21 -20 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D036 -ENCODING 53302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DD -21 -01 -36 -09 -09 -09 -ENDCHAR -STARTCHAR D037 -ENCODING 53303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DD -21 -01 -72 -12 -15 -10 -ENDCHAR -STARTCHAR D038 -ENCODING 53304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -09 -09 -FF -21 -21 -41 -40 -7F -ENDCHAR -STARTCHAR D039 -ENCODING 53305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DD -21 -01 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D03A -ENCODING 53306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR D03B -ENCODING 53307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -19 -69 -DD -21 -01 -3F -40 -7E -ENDCHAR -STARTCHAR D03C -ENCODING 53308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -09 -FF -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR D03D -ENCODING 53309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR D03E -ENCODING 53310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR D03F -ENCODING 53311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D040 -ENCODING 53312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR D041 -ENCODING 53313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D042 -ENCODING 53314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR D043 -ENCODING 53315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR D044 -ENCODING 53316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -09 -FF -21 -20 -7F -41 -41 -7F -ENDCHAR -STARTCHAR D045 -ENCODING 53317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -09 -FF -21 -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR D046 -ENCODING 53318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DD -21 -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR D047 -ENCODING 53319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -0900 -F900 -0900 -FF00 -2100 -2100 -2800 -0C00 -3200 -4180 -ENDCHAR -STARTCHAR D048 -ENCODING 53320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DD -21 -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D049 -ENCODING 53321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -09 -FF -21 -21 -3E -41 -41 -3E -ENDCHAR -STARTCHAR D04A -ENCODING 53322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -1900 -6900 -DD00 -2100 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D04B -ENCODING 53323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -7900 -0900 -FD00 -2100 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D04C -ENCODING 53324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -19 -69 -DD -21 -01 -7F -01 -3F -01 -ENDCHAR -STARTCHAR D04D -ENCODING 53325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR D04E -ENCODING 53326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -19 -69 -DD -21 -01 -3F -12 -3F -ENDCHAR -STARTCHAR D04F -ENCODING 53327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -79 -09 -FD -21 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D050 -ENCODING 53328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -0100 -0100 -FFC0 -1200 -1200 -1200 -1200 -ENDCHAR -STARTCHAR D051 -ENCODING 53329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -05 -7A -00 -FF -24 -7E -01 -01 -ENDCHAR -STARTCHAR D052 -ENCODING 53330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -24 -7E -11 -11 -10 -ENDCHAR -STARTCHAR D053 -ENCODING 53331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7F00 -0500 -7A00 -0000 -FF00 -2400 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR D054 -ENCODING 53332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0100 -FFC0 -1200 -3200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR D055 -ENCODING 53333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -24 -47 -42 -45 -30 -ENDCHAR -STARTCHAR D056 -ENCODING 53334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -0300 -4780 -4300 -4480 -3B00 -ENDCHAR -STARTCHAR D057 -ENCODING 53335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -05 -7A -00 -FF -24 -7E -40 -7E -ENDCHAR -STARTCHAR D058 -ENCODING 53336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D059 -ENCODING 53337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D05A -ENCODING 53338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D05B -ENCODING 53339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR D05C -ENCODING 53340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D05D -ENCODING 53341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -3300 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR D05E -ENCODING 53342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D05F -ENCODING 53343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR D060 -ENCODING 53344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -1200 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR D061 -ENCODING 53345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -05 -7A -00 -FF -64 -41 -7F -7F -ENDCHAR -STARTCHAR D062 -ENCODING 53346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -24 -92 -F6 -95 -F8 -ENDCHAR -STARTCHAR D063 -ENCODING 53347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -24 -08 -18 -66 -81 -ENDCHAR -STARTCHAR D064 -ENCODING 53348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -24 -20 -26 -5D -80 -ENDCHAR -STARTCHAR D065 -ENCODING 53349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7F -05 -7A -00 -FF -24 -3E -41 -42 -3C -ENDCHAR -STARTCHAR D066 -ENCODING 53350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -05 -7A -00 -FF -24 -7E -04 -7F -ENDCHAR -STARTCHAR D067 -ENCODING 53351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -2100 -1E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR D068 -ENCODING 53352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7F -05 -7A -00 -FF -24 -7E -01 -7F -ENDCHAR -STARTCHAR D069 -ENCODING 53353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -1200 -3F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR D06A -ENCODING 53354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -05 -7A -00 -FF -24 -7F -24 -7E -ENDCHAR -STARTCHAR D06B -ENCODING 53355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -2100 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR D06C -ENCODING 53356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -0080 -0080 -0080 -3F00 -0080 -0100 -0100 -FFC0 -ENDCHAR -STARTCHAR D06D -ENCODING 53357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0100 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D06E -ENCODING 53358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR D06F -ENCODING 53359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR D070 -ENCODING 53360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -0100 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D071 -ENCODING 53361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR D072 -ENCODING 53362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR D073 -ENCODING 53363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR D074 -ENCODING 53364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D075 -ENCODING 53365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR D076 -ENCODING 53366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR D077 -ENCODING 53367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR D078 -ENCODING 53368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR D079 -ENCODING 53369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR D07A -ENCODING 53370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR D07B -ENCODING 53371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR D07C -ENCODING 53372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0080 -0100 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR D07D -ENCODING 53373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0100 -FFC0 -0000 -2080 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D07E -ENCODING 53374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR D07F -ENCODING 53375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -0400 -0C00 -3300 -4080 -ENDCHAR -STARTCHAR D080 -ENCODING 53376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR D081 -ENCODING 53377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -0080 -3F00 -0080 -0100 -FFC0 -0000 -1F00 -2180 -2180 -1F00 -ENDCHAR -STARTCHAR D082 -ENCODING 53378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR D083 -ENCODING 53379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR D084 -ENCODING 53380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR D085 -ENCODING 53381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -01 -7E -02 -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR D086 -ENCODING 53382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F80 -0080 -3F00 -0100 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR D087 -ENCODING 53383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -01 -7E -02 -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR D088 -ENCODING 53384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -79 -09 -09 -1F -E1 -01 -01 -01 -ENDCHAR -STARTCHAR D089 -ENCODING 53385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D08A -ENCODING 53386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D08B -ENCODING 53387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -7900 -0900 -0100 -FF00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D08C -ENCODING 53388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -F9 -09 -FD -01 -01 -40 -7F -ENDCHAR -STARTCHAR D08D -ENCODING 53389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR D08E -ENCODING 53390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR D08F -ENCODING 53391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -3F -40 -7E -ENDCHAR -STARTCHAR D090 -ENCODING 53392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -3F00 -0080 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR D091 -ENCODING 53393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -0000 -1B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D092 -ENCODING 53394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -0000 -3F80 -3C80 -2480 -3B00 -ENDCHAR -STARTCHAR D093 -ENCODING 53395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -3000 -0A80 -3B80 -2280 -3B80 -ENDCHAR -STARTCHAR D094 -ENCODING 53396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D095 -ENCODING 53397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -3100 -0A00 -3B80 -2200 -3B80 -ENDCHAR -STARTCHAR D096 -ENCODING 53398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D097 -ENCODING 53399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -3380 -0F80 -3B00 -2480 -3B00 -ENDCHAR -STARTCHAR D098 -ENCODING 53400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -7F -41 -7F -ENDCHAR -STARTCHAR D099 -ENCODING 53401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -41 -7F -7F -ENDCHAR -STARTCHAR D09A -ENCODING 53402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR D09B -ENCODING 53403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -08 -14 -63 -ENDCHAR -STARTCHAR D09C -ENCODING 53404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D09D -ENCODING 53405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR D09E -ENCODING 53406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -7900 -0900 -0100 -FF00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D09F -ENCODING 53407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR D0A0 -ENCODING 53408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR D0A1 -ENCODING 53409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -0F00 -1000 -1F80 -1000 -1F80 -ENDCHAR -STARTCHAR D0A2 -ENCODING 53410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -79 -09 -01 -FF -01 -7F -12 -3F -ENDCHAR -STARTCHAR D0A3 -ENCODING 53411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -3C80 -7C80 -0480 -0080 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR D0A4 -ENCODING 53412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -F1 -11 -21 -41 -81 -01 -01 -01 -ENDCHAR -STARTCHAR D0A5 -ENCODING 53413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -11 -21 -C1 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D0A6 -ENCODING 53414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -F1 -21 -41 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D0A7 -ENCODING 53415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -F100 -2100 -4100 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D0A8 -ENCODING 53416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -F1 -11 -61 -81 -01 -21 -20 -3F -ENDCHAR -STARTCHAR D0A9 -ENCODING 53417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -F1 -21 -41 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR D0AA -ENCODING 53418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR D0AB -ENCODING 53419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -F1 -21 -41 -00 -7E -40 -7E -ENDCHAR -STARTCHAR D0AC -ENCODING 53420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -11 -21 -C0 -3F -01 -3F -20 -3F -ENDCHAR -STARTCHAR D0AD -ENCODING 53421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR D0AE -ENCODING 53422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D0AF -ENCODING 53423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D0B0 -ENCODING 53424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D0B1 -ENCODING 53425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D0B2 -ENCODING 53426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D0B3 -ENCODING 53427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR D0B4 -ENCODING 53428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -11 -21 -C1 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR D0B5 -ENCODING 53429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -11 -21 -C0 -41 -41 -3F -41 -3F -ENDCHAR -STARTCHAR D0B6 -ENCODING 53430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -F100 -2100 -4100 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D0B7 -ENCODING 53431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -09 -F1 -11 -61 -81 -08 -0C -36 -41 -ENDCHAR -STARTCHAR D0B8 -ENCODING 53432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -F100 -2100 -4100 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR D0B9 -ENCODING 53433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -09 -F9 -11 -61 -81 -1E -21 -41 -21 -1E -ENDCHAR -STARTCHAR D0BA -ENCODING 53434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -0900 -F100 -2100 -4100 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR D0BB -ENCODING 53435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -0900 -7100 -2100 -C100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR D0BC -ENCODING 53436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -09 -F1 -21 -41 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D0BD -ENCODING 53437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR D0BE -ENCODING 53438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -09 -F1 -21 -41 -00 -3F -12 -3F -ENDCHAR -STARTCHAR D0BF -ENCODING 53439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -09 -71 -21 -C1 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D0C0 -ENCODING 53440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -F900 -8180 -8100 -8100 -FD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR D0C1 -ENCODING 53441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F980 -8100 -8100 -FD00 -0000 -7E00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR D0C2 -ENCODING 53442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR D0C3 -ENCODING 53443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR D0C4 -ENCODING 53444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8100 -F980 -8100 -8100 -FD00 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR D0C5 -ENCODING 53445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR D0C6 -ENCODING 53446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR D0C7 -ENCODING 53447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR D0C8 -ENCODING 53448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR D0C9 -ENCODING 53449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -7F00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR D0CA -ENCODING 53450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR D0CB -ENCODING 53451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -6000 -1900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR D0CC -ENCODING 53452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -6200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR D0CD -ENCODING 53453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -6600 -1800 -7E00 -8800 -7700 -ENDCHAR -STARTCHAR D0CE -ENCODING 53454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -6000 -1700 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR D0CF -ENCODING 53455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -6600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR D0D0 -ENCODING 53456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F980 -8100 -8100 -FD00 -0000 -7E00 -4100 -4100 -7E00 -ENDCHAR -STARTCHAR D0D1 -ENCODING 53457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F980 -8100 -8100 -FD00 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR D0D2 -ENCODING 53458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR D0D3 -ENCODING 53459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F900 -8180 -8100 -FD00 -0100 -0800 -1800 -3600 -4100 -ENDCHAR -STARTCHAR D0D4 -ENCODING 53460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F900 -8180 -8100 -FD00 -0000 -2200 -2200 -5500 -8880 -ENDCHAR -STARTCHAR D0D5 -ENCODING 53461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F900 -8180 -8100 -FD00 -0100 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR D0D6 -ENCODING 53462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR D0D7 -ENCODING 53463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR D0D8 -ENCODING 53464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR D0D9 -ENCODING 53465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -3E00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR D0DA -ENCODING 53466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8100 -F980 -8100 -FD00 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR D0DB -ENCODING 53467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8100 -F180 -8100 -7800 -1C00 -7F00 -1C00 -2200 -1E00 -ENDCHAR -STARTCHAR D0DC -ENCODING 53468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -85 -F5 -87 -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR D0DD -ENCODING 53469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -F5 -87 -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D0DE -ENCODING 53470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -85 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D0DF -ENCODING 53471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -8500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D0E0 -ENCODING 53472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -8500 -F700 -8500 -8500 -FD00 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D0E1 -ENCODING 53473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -8500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR D0E2 -ENCODING 53474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -E7 -85 -F5 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D0E3 -ENCODING 53475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F7 -85 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR D0E4 -ENCODING 53476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -F7 -85 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D0E5 -ENCODING 53477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -E7 -85 -F5 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR D0E6 -ENCODING 53478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -E7 -85 -F5 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR D0E7 -ENCODING 53479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -E7 -85 -F5 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D0E8 -ENCODING 53480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -E7 -85 -F5 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR D0E9 -ENCODING 53481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -E7 -85 -F5 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D0EA -ENCODING 53482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -E7 -85 -F5 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D0EB -ENCODING 53483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -E700 -8500 -F500 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR D0EC -ENCODING 53484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -F5 -87 -85 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR D0ED -ENCODING 53485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -F5 -87 -85 -FD -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR D0EE -ENCODING 53486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -8500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D0EF -ENCODING 53487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -F500 -8700 -8500 -FD00 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR D0F0 -ENCODING 53488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -F500 -8700 -8500 -FD00 -0000 -2200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR D0F1 -ENCODING 53489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -F5 -87 -85 -FD -00 -3E -41 -41 -3E -ENDCHAR -STARTCHAR D0F2 -ENCODING 53490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -F700 -8500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D0F3 -ENCODING 53491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -E700 -8500 -F500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D0F4 -ENCODING 53492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -F7 -85 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D0F5 -ENCODING 53493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -E7 -85 -F5 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D0F6 -ENCODING 53494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F7 -85 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR D0F7 -ENCODING 53495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -E7 -85 -F5 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D0F8 -ENCODING 53496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -8180 -F900 -8100 -8180 -8100 -FD00 -0100 -0100 -0100 -ENDCHAR -STARTCHAR D0F9 -ENCODING 53497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR D0FA -ENCODING 53498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR D0FB -ENCODING 53499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR D0FC -ENCODING 53500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -F100 -8100 -B980 -4100 -4000 -4000 -7E00 -ENDCHAR -STARTCHAR D0FD -ENCODING 53501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR D0FE -ENCODING 53502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR D0FF -ENCODING 53503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR D100 -ENCODING 53504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -3E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR D101 -ENCODING 53505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -6600 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR D102 -ENCODING 53506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR D103 -ENCODING 53507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -6000 -1900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR D104 -ENCODING 53508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -6200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR D105 -ENCODING 53509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -6600 -1800 -7E00 -8800 -7700 -ENDCHAR -STARTCHAR D106 -ENCODING 53510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -6000 -1700 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR D107 -ENCODING 53511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -6600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR D108 -ENCODING 53512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR D109 -ENCODING 53513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR D10A -ENCODING 53514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR D10B -ENCODING 53515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR D10C -ENCODING 53516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR D10D -ENCODING 53517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F980 -8100 -8180 -FD00 -0100 -3E00 -4100 -4100 -3E00 -ENDCHAR -STARTCHAR D10E -ENCODING 53518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR D10F -ENCODING 53519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR D110 -ENCODING 53520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR D111 -ENCODING 53521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -3E00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR D112 -ENCODING 53522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -8180 -F900 -8180 -FD00 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR D113 -ENCODING 53523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F100 -8180 -F100 -8180 -7800 -1C00 -7F00 -1C00 -2200 -1E00 -ENDCHAR -STARTCHAR D114 -ENCODING 53524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -F5 -85 -87 -F5 -85 -87 -F5 -05 -05 -ENDCHAR -STARTCHAR D115 -ENCODING 53525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -F5 -87 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D116 -ENCODING 53526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -F5 -87 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D117 -ENCODING 53527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -F500 -8700 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D118 -ENCODING 53528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -F7 -85 -B7 -45 -05 -20 -3F -ENDCHAR -STARTCHAR D119 -ENCODING 53529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -F500 -8700 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR D11A -ENCODING 53530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D11B -ENCODING 53531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -F5 -87 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR D11C -ENCODING 53532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR D11D -ENCODING 53533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR D11E -ENCODING 53534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR D11F -ENCODING 53535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D120 -ENCODING 53536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR D121 -ENCODING 53537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D122 -ENCODING 53538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D123 -ENCODING 53539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -E500 -8700 -F500 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR D124 -ENCODING 53540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -F5 -87 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR D125 -ENCODING 53541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -F5 -87 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR D126 -ENCODING 53542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -F500 -8700 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D127 -ENCODING 53543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -F5 -87 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR D128 -ENCODING 53544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -F500 -8700 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR D129 -ENCODING 53545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -F5 -87 -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR D12A -ENCODING 53546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -F500 -8700 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D12B -ENCODING 53547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8700 -E500 -8700 -F500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D12C -ENCODING 53548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -F5 -87 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D12D -ENCODING 53549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D12E -ENCODING 53550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -87 -F5 -87 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR D12F -ENCODING 53551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -87 -E5 -87 -F5 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D130 -ENCODING 53552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -F7 -81 -81 -81 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR D131 -ENCODING 53553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -81 -F7 -81 -81 -F9 -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D132 -ENCODING 53554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -81 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D133 -ENCODING 53555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -F700 -8100 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D134 -ENCODING 53556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -81 -81 -F7 -81 -81 -F9 -01 -20 -20 -3F -ENDCHAR -STARTCHAR D135 -ENCODING 53557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -81 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR D136 -ENCODING 53558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR D137 -ENCODING 53559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -81 -F7 -81 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR D138 -ENCODING 53560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -81 -F7 -81 -F9 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D139 -ENCODING 53561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR D13A -ENCODING 53562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -81 -F7 -81 -F9 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D13B -ENCODING 53563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D13C -ENCODING 53564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D13D -ENCODING 53565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D13E -ENCODING 53566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D13F -ENCODING 53567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR D140 -ENCODING 53568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -81 -F7 -81 -81 -F9 -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR D141 -ENCODING 53569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -81 -F7 -81 -81 -F9 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR D142 -ENCODING 53570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -F700 -8100 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D143 -ENCODING 53571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F100 -8100 -F700 -8100 -8100 -F900 -0100 -0800 -0800 -3600 -4180 -ENDCHAR -STARTCHAR D144 -ENCODING 53572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F100 -8100 -F700 -8100 -8100 -F900 -0100 -2200 -2200 -7500 -C880 -ENDCHAR -STARTCHAR D145 -ENCODING 53573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -81 -F7 -81 -81 -F9 -01 -3E -21 -21 -3E -ENDCHAR -STARTCHAR D146 -ENCODING 53574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -F700 -8100 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR D147 -ENCODING 53575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -F700 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR D148 -ENCODING 53576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -81 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D149 -ENCODING 53577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR D14A -ENCODING 53578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -81 -F7 -81 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR D14B -ENCODING 53579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F7 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D14C -ENCODING 53580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -85 -ED -85 -85 -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR D14D -ENCODING 53581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -ED -85 -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D14E -ENCODING 53582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -FD -85 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D14F -ENCODING 53583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -FD00 -8500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D150 -ENCODING 53584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -8500 -ED00 -8500 -8500 -FD00 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D151 -ENCODING 53585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -FD00 -8500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR D152 -ENCODING 53586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -ED -85 -F1 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D153 -ENCODING 53587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -FD -85 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR D154 -ENCODING 53588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -ED -85 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D155 -ENCODING 53589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -ED -85 -F1 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR D156 -ENCODING 53590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -ED -85 -F1 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR D157 -ENCODING 53591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -ED -85 -F1 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D158 -ENCODING 53592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -ED -85 -F1 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR D159 -ENCODING 53593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -ED -85 -F1 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D15A -ENCODING 53594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -ED -85 -F1 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D15B -ENCODING 53595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -ED00 -8500 -F100 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR D15C -ENCODING 53596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -ED -85 -85 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR D15D -ENCODING 53597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -ED -85 -85 -FD -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR D15E -ENCODING 53598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -FD00 -8500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D15F -ENCODING 53599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -ED00 -8500 -8500 -FD00 -0100 -0800 -0C00 -3600 -4180 -ENDCHAR -STARTCHAR D160 -ENCODING 53600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -FD00 -8500 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR D161 -ENCODING 53601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -ED -85 -85 -FD -00 -3E -41 -41 -3E -ENDCHAR -STARTCHAR D162 -ENCODING 53602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -FD00 -8500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D163 -ENCODING 53603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8500 -ED00 -8500 -F100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D164 -ENCODING 53604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -FD -85 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D165 -ENCODING 53605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -ED -85 -F1 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D166 -ENCODING 53606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -85 -FD -85 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR D167 -ENCODING 53607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -85 -ED -85 -F1 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D168 -ENCODING 53608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -87 -F1 -81 -87 -81 -F9 -01 -01 -01 -ENDCHAR -STARTCHAR D169 -ENCODING 53609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -F3 -81 -F9 -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR D16A -ENCODING 53610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -F3 -81 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D16B -ENCODING 53611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8700 -F300 -8100 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D16C -ENCODING 53612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F1 -81 -87 -F1 -87 -81 -F9 -01 -20 -20 -3F -ENDCHAR -STARTCHAR D16D -ENCODING 53613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -F3 -81 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR D16E -ENCODING 53614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR D16F -ENCODING 53615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -87 -F3 -81 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR D170 -ENCODING 53616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D171 -ENCODING 53617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR D172 -ENCODING 53618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D173 -ENCODING 53619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D174 -ENCODING 53620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D175 -ENCODING 53621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D176 -ENCODING 53622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D177 -ENCODING 53623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR D178 -ENCODING 53624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -87 -F3 -81 -F9 -00 -7F -41 -7F -ENDCHAR -STARTCHAR D179 -ENCODING 53625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -87 -F3 -81 -F9 -01 -41 -7F -7F -ENDCHAR -STARTCHAR D17A -ENCODING 53626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8700 -F300 -8100 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D17B -ENCODING 53627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -87 -F3 -81 -F9 -00 -08 -14 -63 -ENDCHAR -STARTCHAR D17C -ENCODING 53628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F100 -8700 -F100 -8700 -8100 -F900 -0000 -2200 -2200 -7500 -C880 -ENDCHAR -STARTCHAR D17D -ENCODING 53629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -F3 -81 -F9 -0C -32 -41 -23 -1C -ENDCHAR -STARTCHAR D17E -ENCODING 53630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8700 -F300 -8100 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR D17F -ENCODING 53631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8300 -F700 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR D180 -ENCODING 53632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -87 -F3 -81 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D181 -ENCODING 53633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR D182 -ENCODING 53634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -87 -F3 -81 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR D183 -ENCODING 53635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -83 -F7 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D184 -ENCODING 53636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F5 -85 -8D -E5 -85 -8D -85 -FD -05 -05 -05 -ENDCHAR -STARTCHAR D185 -ENCODING 53637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -F5 -85 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D186 -ENCODING 53638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -F5 -85 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D187 -ENCODING 53639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8D00 -F500 -8500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D188 -ENCODING 53640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F500 -8500 -8D00 -E500 -8D00 -8500 -FD00 -0500 -4000 -4000 -3F80 -ENDCHAR -STARTCHAR D189 -ENCODING 53641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8D00 -F500 -8500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR D18A -ENCODING 53642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D18B -ENCODING 53643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -8D -F5 -85 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR D18C -ENCODING 53644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR D18D -ENCODING 53645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR D18E -ENCODING 53646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR D18F -ENCODING 53647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D190 -ENCODING 53648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR D191 -ENCODING 53649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D192 -ENCODING 53650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D193 -ENCODING 53651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8D00 -ED00 -8500 -F100 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR D194 -ENCODING 53652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -8D -F5 -85 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR D195 -ENCODING 53653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -8D -F5 -85 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR D196 -ENCODING 53654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8D00 -F500 -8500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D197 -ENCODING 53655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -8D -F5 -8D -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR D198 -ENCODING 53656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8D00 -F500 -8500 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR D199 -ENCODING 53657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -F5 -8D -FD -09 -37 -41 -23 -1C -ENDCHAR -STARTCHAR D19A -ENCODING 53658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8D00 -F500 -8500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D19B -ENCODING 53659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -8D00 -ED00 -8500 -F100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D19C -ENCODING 53660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -F5 -85 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D19D -ENCODING 53661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D19E -ENCODING 53662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -8D -F5 -85 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR D19F -ENCODING 53663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -8D -ED -85 -F1 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D1A0 -ENCODING 53664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -2000 -3F00 -2000 -2000 -3F80 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR D1A1 -ENCODING 53665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D1A2 -ENCODING 53666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -08 -F7 -7E -11 -11 -10 -ENDCHAR -STARTCHAR D1A3 -ENCODING 53667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -08 -F7 -F2 -16 -15 -18 -ENDCHAR -STARTCHAR D1A4 -ENCODING 53668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D1A5 -ENCODING 53669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -08 -F7 -07 -42 -45 -20 -ENDCHAR -STARTCHAR D1A6 -ENCODING 53670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR D1A7 -ENCODING 53671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -08 -F7 -7E -40 -7E -ENDCHAR -STARTCHAR D1A8 -ENCODING 53672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0400 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D1A9 -ENCODING 53673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -0000 -3B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D1AA -ENCODING 53674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -3300 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D1AB -ENCODING 53675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -3000 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR D1AC -ENCODING 53676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D1AD -ENCODING 53677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -3300 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR D1AE -ENCODING 53678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D1AF -ENCODING 53679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR D1B0 -ENCODING 53680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D1B1 -ENCODING 53681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0400 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D1B2 -ENCODING 53682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -08 -F7 -12 -72 -95 -78 -ENDCHAR -STARTCHAR D1B3 -ENCODING 53683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -0400 -1A00 -6180 -ENDCHAR -STARTCHAR D1B4 -ENCODING 53684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -08 -F7 -20 -26 -5D -80 -ENDCHAR -STARTCHAR D1B5 -ENCODING 53685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D1B6 -ENCODING 53686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -08 -F7 -7E -02 -7F -ENDCHAR -STARTCHAR D1B7 -ENCODING 53687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -0E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR D1B8 -ENCODING 53688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -08 -F7 -7E -01 -7F -ENDCHAR -STARTCHAR D1B9 -ENCODING 53689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR D1BA -ENCODING 53690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0400 -FFC0 -0000 -3F80 -1200 -7F80 -ENDCHAR -STARTCHAR D1BB -ENCODING 53691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3B00 -0400 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR D1BC -ENCODING 53692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -4080 -7C80 -4080 -7CC0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D1BD -ENCODING 53693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR D1BE -ENCODING 53694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR D1BF -ENCODING 53695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR D1C0 -ENCODING 53696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -4080 -7C80 -4080 -7CC0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D1C1 -ENCODING 53697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR D1C2 -ENCODING 53698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0300 -0480 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR D1C3 -ENCODING 53699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR D1C4 -ENCODING 53700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0000 -3F00 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D1C5 -ENCODING 53701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0000 -3B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D1C6 -ENCODING 53702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D1C7 -ENCODING 53703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0000 -3C80 -3F00 -4480 -3B00 -ENDCHAR -STARTCHAR D1C8 -ENCODING 53704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0000 -3900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D1C9 -ENCODING 53705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0000 -3F00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR D1CA -ENCODING 53706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0000 -3B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D1CB -ENCODING 53707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0300 -3880 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR D1CC -ENCODING 53708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR D1CD -ENCODING 53709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR D1CE -ENCODING 53710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -9200 -F200 -9500 -7800 -ENDCHAR -STARTCHAR D1CF -ENCODING 53711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8180 -7900 -3D00 -C000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR D1D0 -ENCODING 53712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR D1D1 -ENCODING 53713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8180 -7900 -3D00 -C000 -3E00 -4100 -4200 -3C00 -ENDCHAR -STARTCHAR D1D2 -ENCODING 53714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7900 -F900 -8180 -7900 -2D00 -D000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR D1D3 -ENCODING 53715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR D1D4 -ENCODING 53716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR D1D5 -ENCODING 53717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE80 -0000 -3F00 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR D1D6 -ENCODING 53718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7900 -F900 -8100 -7980 -3D00 -C000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR D1D7 -ENCODING 53719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -3C80 -6CC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR D1D8 -ENCODING 53720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -4280 -7A80 -4280 -7B80 -1280 -1280 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR D1D9 -ENCODING 53721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D1DA -ENCODING 53722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D1DB -ENCODING 53723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -8700 -F500 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D1DC -ENCODING 53724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -4280 -7280 -7B80 -1280 -FA80 -0280 -1000 -1F80 -ENDCHAR -STARTCHAR D1DD -ENCODING 53725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -8700 -F500 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR D1DE -ENCODING 53726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR D1DF -ENCODING 53727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR D1E0 -ENCODING 53728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR D1E1 -ENCODING 53729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR D1E2 -ENCODING 53730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR D1E3 -ENCODING 53731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR D1E4 -ENCODING 53732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR D1E5 -ENCODING 53733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR D1E6 -ENCODING 53734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR D1E7 -ENCODING 53735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR D1E8 -ENCODING 53736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR D1E9 -ENCODING 53737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR D1EA -ENCODING 53738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -8700 -F500 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D1EB -ENCODING 53739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR D1EC -ENCODING 53740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -8700 -F500 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR D1ED -ENCODING 53741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -87 -F5 -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR D1EE -ENCODING 53742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -F500 -8700 -F500 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D1EF -ENCODING 53743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0000 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR D1F0 -ENCODING 53744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D1F1 -ENCODING 53745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR D1F2 -ENCODING 53746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -F5 -87 -F5 -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR D1F3 -ENCODING 53747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4380 -3A80 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR D1F4 -ENCODING 53748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4080 -7C80 -4080 -7C80 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D1F5 -ENCODING 53749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -3E -01 -01 -01 -ENDCHAR -STARTCHAR D1F6 -ENCODING 53750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -36 -09 -09 -09 -ENDCHAR -STARTCHAR D1F7 -ENCODING 53751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -72 -12 -15 -10 -ENDCHAR -STARTCHAR D1F8 -ENCODING 53752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -21 -FF -01 -40 -40 -7F -ENDCHAR -STARTCHAR D1F9 -ENCODING 53753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D1FA -ENCODING 53754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -07 -4F -42 -45 -37 -ENDCHAR -STARTCHAR D1FB -ENCODING 53755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR D1FC -ENCODING 53756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -00 -3F -3F -40 -3F -ENDCHAR -STARTCHAR D1FD -ENCODING 53757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR D1FE -ENCODING 53758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -00 -77 -79 -49 -76 -ENDCHAR -STARTCHAR D1FF -ENCODING 53759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D200 -ENCODING 53760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -00 -72 -32 -45 -70 -ENDCHAR -STARTCHAR D201 -ENCODING 53761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D202 -ENCODING 53762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D203 -ENCODING 53763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR D204 -ENCODING 53764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -7F -41 -7F -ENDCHAR -STARTCHAR D205 -ENCODING 53765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -41 -7F -7F -ENDCHAR -STARTCHAR D206 -ENCODING 53766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -12 -72 -55 -70 -ENDCHAR -STARTCHAR D207 -ENCODING 53767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -21 -FF -01 -08 -14 -63 -ENDCHAR -STARTCHAR D208 -ENCODING 53768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D209 -ENCODING 53769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -21 -FF -00 -3E -41 -3E -ENDCHAR -STARTCHAR D20A -ENCODING 53770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -F900 -8100 -7900 -3D00 -C100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D20B -ENCODING 53771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -7900 -D900 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D20C -ENCODING 53772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -7F -01 -3F -01 -ENDCHAR -STARTCHAR D20D -ENCODING 53773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D20E -ENCODING 53774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -FD -01 -3F -12 -3F -ENDCHAR -STARTCHAR D20F -ENCODING 53775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -D9 -21 -FD -0C -33 -0C -32 -1E -ENDCHAR -STARTCHAR D210 -ENCODING 53776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -2000 -3F00 -2000 -2000 -3F80 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR D211 -ENCODING 53777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -7E -01 -01 -ENDCHAR -STARTCHAR D212 -ENCODING 53778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -7E -11 -11 -10 -ENDCHAR -STARTCHAR D213 -ENCODING 53779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -F2 -16 -15 -18 -ENDCHAR -STARTCHAR D214 -ENCODING 53780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -3F00 -2000 -3F80 -1200 -FFC0 -2000 -2000 -3F00 -ENDCHAR -STARTCHAR D215 -ENCODING 53781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -07 -42 -45 -20 -ENDCHAR -STARTCHAR D216 -ENCODING 53782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR D217 -ENCODING 53783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -24 -DB -7E -40 -7E -ENDCHAR -STARTCHAR D218 -ENCODING 53784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -3F00 -0080 -3F00 -3F00 -ENDCHAR -STARTCHAR D219 -ENCODING 53785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -0000 -3B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D21A -ENCODING 53786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -3300 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D21B -ENCODING 53787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -3000 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR D21C -ENCODING 53788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D21D -ENCODING 53789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -3300 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR D21E -ENCODING 53790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D21F -ENCODING 53791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR D220 -ENCODING 53792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -24 -DB -7E -41 -7F -ENDCHAR -STARTCHAR D221 -ENCODING 53793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -24 -DB -41 -7E -7F -ENDCHAR -STARTCHAR D222 -ENCODING 53794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -12 -72 -95 -78 -ENDCHAR -STARTCHAR D223 -ENCODING 53795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -08 -18 -66 -81 -ENDCHAR -STARTCHAR D224 -ENCODING 53796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -20 -26 -5D -80 -ENDCHAR -STARTCHAR D225 -ENCODING 53797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -3E -41 -42 -3C -ENDCHAR -STARTCHAR D226 -ENCODING 53798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -7E -02 -7F -ENDCHAR -STARTCHAR D227 -ENCODING 53799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -0E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR D228 -ENCODING 53800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -24 -DB -7E -01 -7F -ENDCHAR -STARTCHAR D229 -ENCODING 53801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR D22A -ENCODING 53802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -24 -DB -7F -24 -7E -ENDCHAR -STARTCHAR D22B -ENCODING 53803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2D00 -1200 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR D22C -ENCODING 53804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR D22D -ENCODING 53805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D22E -ENCODING 53806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -F7 -08 -08 -77 -11 -10 -ENDCHAR -STARTCHAR D22F -ENCODING 53807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -F7 -08 -68 -12 -17 -18 -ENDCHAR -STARTCHAR D230 -ENCODING 53808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR D231 -ENCODING 53809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -F7 -08 -0E -42 -45 -20 -ENDCHAR -STARTCHAR D232 -ENCODING 53810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0400 -0300 -4780 -4480 -3B00 -ENDCHAR -STARTCHAR D233 -ENCODING 53811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -F7 -08 -3E -40 -7E -ENDCHAR -STARTCHAR D234 -ENCODING 53812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D235 -ENCODING 53813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0400 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D236 -ENCODING 53814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0400 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D237 -ENCODING 53815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0400 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR D238 -ENCODING 53816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0400 -7900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D239 -ENCODING 53817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0400 -3F80 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR D23A -ENCODING 53818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0400 -7F80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D23B -ENCODING 53819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0400 -3B00 -3B80 -4480 -3B00 -ENDCHAR -STARTCHAR D23C -ENCODING 53820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D23D -ENCODING 53821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -2480 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D23E -ENCODING 53822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -F7 -08 -9A -F2 -95 -F8 -ENDCHAR -STARTCHAR D23F -ENCODING 53823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -0400 -1A00 -6180 -ENDCHAR -STARTCHAR D240 -ENCODING 53824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -F7 -08 -28 -26 -5D -80 -ENDCHAR -STARTCHAR D241 -ENCODING 53825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0400 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D242 -ENCODING 53826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -F7 -08 -7C -02 -3F -40 -ENDCHAR -STARTCHAR D243 -ENCODING 53827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1E00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR D244 -ENCODING 53828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -F7 -08 -7E -01 -7E -ENDCHAR -STARTCHAR D245 -ENCODING 53829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0400 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR D246 -ENCODING 53830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -F7 -08 -08 -76 -7E -ENDCHAR -STARTCHAR D247 -ENCODING 53831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1E00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR D248 -ENCODING 53832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4080 -7C80 -4080 -7C80 -0080 -FE80 -1080 -1380 -1080 -1080 -ENDCHAR -STARTCHAR D249 -ENCODING 53833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -7E -01 -01 -01 -ENDCHAR -STARTCHAR D24A -ENCODING 53834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR D24B -ENCODING 53835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -62 -12 -15 -18 -ENDCHAR -STARTCHAR D24C -ENCODING 53836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -79 -81 -79 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR D24D -ENCODING 53837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D24E -ENCODING 53838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR D24F -ENCODING 53839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -3E -40 -7E -ENDCHAR -STARTCHAR D250 -ENCODING 53840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -7F -3F -40 -3F -ENDCHAR -STARTCHAR D251 -ENCODING 53841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR D252 -ENCODING 53842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D253 -ENCODING 53843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D254 -ENCODING 53844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR D255 -ENCODING 53845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D256 -ENCODING 53846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D257 -ENCODING 53847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR D258 -ENCODING 53848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -3E -41 -7F -ENDCHAR -STARTCHAR D259 -ENCODING 53849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -41 -7F -41 -3E -ENDCHAR -STARTCHAR D25A -ENCODING 53850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR D25B -ENCODING 53851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -08 -14 -63 -ENDCHAR -STARTCHAR D25C -ENCODING 53852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F900 -8700 -F900 -0100 -FD00 -2100 -2200 -3700 -CC80 -ENDCHAR -STARTCHAR D25D -ENCODING 53853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -3E -41 -63 -1C -ENDCHAR -STARTCHAR D25E -ENCODING 53854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -F900 -8100 -7900 -FD00 -2700 -1C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D25F -ENCODING 53855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7900 -8100 -7900 -F100 -0900 -F700 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D260 -ENCODING 53856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR D261 -ENCODING 53857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F1 -09 -F7 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D262 -ENCODING 53858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -F9 -81 -79 -FD -27 -2D -12 -3F -ENDCHAR -STARTCHAR D263 -ENCODING 53859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FF -0D -33 -0C -32 -1E -ENDCHAR -STARTCHAR D264 -ENCODING 53860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7A80 -4280 -7A80 -4280 -7A80 -0280 -FE80 -1280 -1680 -1280 -0280 -ENDCHAR -STARTCHAR D265 -ENCODING 53861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D266 -ENCODING 53862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1900 -0480 -0480 -0480 -ENDCHAR -STARTCHAR D267 -ENCODING 53863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR D268 -ENCODING 53864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -7A80 -4280 -7A80 -FE80 -1680 -1280 -2000 -3F80 -ENDCHAR -STARTCHAR D269 -ENCODING 53865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR D26A -ENCODING 53866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -ED -22 -45 -42 -45 -32 -ENDCHAR -STARTCHAR D26B -ENCODING 53867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR D26C -ENCODING 53868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -ED -20 -7F -3F -40 -3F -ENDCHAR -STARTCHAR D26D -ENCODING 53869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -ED -20 -7F -39 -41 -38 -ENDCHAR -STARTCHAR D26E -ENCODING 53870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -ED -20 -77 -3D -45 -37 -ENDCHAR -STARTCHAR D26F -ENCODING 53871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -ED -20 -75 -37 -45 -37 -ENDCHAR -STARTCHAR D270 -ENCODING 53872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -E500 -F500 -F500 -1500 -ED00 -2000 -5200 -7200 -4500 -7080 -ENDCHAR -STARTCHAR D271 -ENCODING 53873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -ED -20 -77 -37 -44 -37 -ENDCHAR -STARTCHAR D272 -ENCODING 53874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -ED -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D273 -ENCODING 53875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -ED -20 -72 -37 -45 -72 -ENDCHAR -STARTCHAR D274 -ENCODING 53876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F00 -2080 -3F80 -ENDCHAR -STARTCHAR D275 -ENCODING 53877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR D276 -ENCODING 53878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -2100 -3900 -2A80 -3800 -ENDCHAR -STARTCHAR D277 -ENCODING 53879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -0400 -0600 -1900 -2080 -ENDCHAR -STARTCHAR D278 -ENCODING 53880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -0100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR D279 -ENCODING 53881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F00 -2080 -3080 -0F00 -ENDCHAR -STARTCHAR D27A -ENCODING 53882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR D27B -ENCODING 53883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -E500 -F500 -F500 -1500 -ED00 -2000 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D27C -ENCODING 53884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F80 -0080 -1F80 -0080 -ENDCHAR -STARTCHAR D27D -ENCODING 53885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -ED -20 -3F -3F -40 -3F -ENDCHAR -STARTCHAR D27E -ENCODING 53886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -7A80 -4280 -3A80 -FA80 -1680 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR D27F -ENCODING 53887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -E5 -F5 -F5 -15 -E5 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D280 -ENCODING 53888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4080 -7C80 -4080 -7C80 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR D281 -ENCODING 53889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -01 -FD -20 -7F -01 -01 -ENDCHAR -STARTCHAR D282 -ENCODING 53890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR D283 -ENCODING 53891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -21 -62 -12 -15 -18 -ENDCHAR -STARTCHAR D284 -ENCODING 53892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -01 -FD -11 -51 -40 -7F -ENDCHAR -STARTCHAR D285 -ENCODING 53893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D286 -ENCODING 53894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR D287 -ENCODING 53895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -F9 -81 -79 -FD -21 -3E -40 -7E -ENDCHAR -STARTCHAR D288 -ENCODING 53896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR D289 -ENCODING 53897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR D28A -ENCODING 53898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D28B -ENCODING 53899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D28C -ENCODING 53900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR D28D -ENCODING 53901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D28E -ENCODING 53902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D28F -ENCODING 53903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR D290 -ENCODING 53904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -01 -FD -20 -7F -41 -7F -ENDCHAR -STARTCHAR D291 -ENCODING 53905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -FD -21 -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR D292 -ENCODING 53906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR D293 -ENCODING 53907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -F9 -81 -79 -FD -21 -08 -14 -63 -ENDCHAR -STARTCHAR D294 -ENCODING 53908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D295 -ENCODING 53909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -01 -FD -21 -3E -41 -3E -ENDCHAR -STARTCHAR D296 -ENCODING 53910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -F900 -8100 -7900 -FD00 -2100 -1C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D297 -ENCODING 53911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7900 -8100 -7900 -F900 -0100 -FD00 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D298 -ENCODING 53912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -F9 -81 -79 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR D299 -ENCODING 53913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D29A -ENCODING 53914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -F9 -81 -79 -FD -21 -2D -12 -3F -ENDCHAR -STARTCHAR D29B -ENCODING 53915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -F9 -01 -FD -0D -33 -0C -32 -1E -ENDCHAR -STARTCHAR D29C -ENCODING 53916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR D29D -ENCODING 53917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -DB -24 -7E -01 -01 -ENDCHAR -STARTCHAR D29E -ENCODING 53918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -DB -24 -00 -77 -11 -10 -ENDCHAR -STARTCHAR D29F -ENCODING 53919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -DB -24 -60 -12 -17 -18 -ENDCHAR -STARTCHAR D2A0 -ENCODING 53920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR D2A1 -ENCODING 53921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -DB -24 -06 -42 -45 -20 -ENDCHAR -STARTCHAR D2A2 -ENCODING 53922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1200 -0100 -4780 -4480 -3B00 -ENDCHAR -STARTCHAR D2A3 -ENCODING 53923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -DB -24 -3E -40 -7E -ENDCHAR -STARTCHAR D2A4 -ENCODING 53924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D2A5 -ENCODING 53925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1200 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D2A6 -ENCODING 53926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1200 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D2A7 -ENCODING 53927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1200 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR D2A8 -ENCODING 53928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1200 -7900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D2A9 -ENCODING 53929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1200 -3F80 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR D2AA -ENCODING 53930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1200 -7F80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D2AB -ENCODING 53931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1200 -3900 -3B80 -4480 -3B00 -ENDCHAR -STARTCHAR D2AC -ENCODING 53932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -1200 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D2AD -ENCODING 53933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -DB -24 -40 -7E -7F -ENDCHAR -STARTCHAR D2AE -ENCODING 53934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -DB -24 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR D2AF -ENCODING 53935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -DB -24 -08 -18 -66 -81 -ENDCHAR -STARTCHAR D2B0 -ENCODING 53936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -DB -24 -20 -26 -5D -80 -ENDCHAR -STARTCHAR D2B1 -ENCODING 53937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -1200 -1F00 -2080 -3F00 -ENDCHAR -STARTCHAR D2B2 -ENCODING 53938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -DB -24 -7C -02 -3F -40 -ENDCHAR -STARTCHAR D2B3 -ENCODING 53939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1F00 -3E00 -0100 -1F00 -6080 -ENDCHAR -STARTCHAR D2B4 -ENCODING 53940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -DB -24 -7E -01 -7E -ENDCHAR -STARTCHAR D2B5 -ENCODING 53941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1200 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR D2B6 -ENCODING 53942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -DB -24 -00 -7E -7E -ENDCHAR -STARTCHAR D2B7 -ENCODING 53943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1F00 -3300 -0C00 -1300 -1E00 -ENDCHAR -STARTCHAR D2B8 -ENCODING 53944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -2000 -3F00 -2000 -2000 -3F80 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR D2B9 -ENCODING 53945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D2BA -ENCODING 53946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR D2BB -ENCODING 53947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -FF -00 -F2 -16 -15 -18 -ENDCHAR -STARTCHAR D2BC -ENCODING 53948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D2BD -ENCODING 53949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -FF -00 -07 -42 -45 -20 -ENDCHAR -STARTCHAR D2BE -ENCODING 53950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR D2BF -ENCODING 53951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D2C0 -ENCODING 53952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D2C1 -ENCODING 53953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -0000 -3B80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D2C2 -ENCODING 53954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR D2C3 -ENCODING 53955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -3000 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR D2C4 -ENCODING 53956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D2C5 -ENCODING 53957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -3300 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR D2C6 -ENCODING 53958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -3100 -0A80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D2C7 -ENCODING 53959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR D2C8 -ENCODING 53960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D2C9 -ENCODING 53961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D2CA -ENCODING 53962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -FF -00 -12 -72 -95 -78 -ENDCHAR -STARTCHAR D2CB -ENCODING 53963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -2000 -3F00 -2000 -3F80 -0000 -FFC0 -0000 -0400 -1A00 -6180 -ENDCHAR -STARTCHAR D2CC -ENCODING 53964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -FF -00 -20 -26 -5D -80 -ENDCHAR -STARTCHAR D2CD -ENCODING 53965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -7E -40 -7F -FF -00 -3E -41 -42 -3C -ENDCHAR -STARTCHAR D2CE -ENCODING 53966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -FF -00 -7E -02 -7F -ENDCHAR -STARTCHAR D2CF -ENCODING 53967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -7E -7E -00 -FF -1C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR D2D0 -ENCODING 53968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -7E -40 -7F -FF -00 -7E -01 -7F -ENDCHAR -STARTCHAR D2D1 -ENCODING 53969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -2000 -3F00 -3F00 -0000 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR D2D2 -ENCODING 53970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -40 -7F -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR D2D3 -ENCODING 53971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -40 -7E -7E -00 -FF -3C -66 -18 -26 -3C -ENDCHAR -STARTCHAR D2D4 -ENCODING 53972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -4080 -7C80 -4080 -4080 -7E80 -0080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D2D5 -ENCODING 53973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -3E -01 -01 -01 -ENDCHAR -STARTCHAR D2D6 -ENCODING 53974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -36 -09 -09 -09 -ENDCHAR -STARTCHAR D2D7 -ENCODING 53975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -72 -12 -15 -10 -ENDCHAR -STARTCHAR D2D8 -ENCODING 53976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -01 -FF -01 -40 -40 -7F -ENDCHAR -STARTCHAR D2D9 -ENCODING 53977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D2DA -ENCODING 53978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -07 -4F -42 -45 -37 -ENDCHAR -STARTCHAR D2DB -ENCODING 53979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -3F -40 -7E -ENDCHAR -STARTCHAR D2DC -ENCODING 53980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -00 -FF -01 -7F -40 -7F -ENDCHAR -STARTCHAR D2DD -ENCODING 53981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR D2DE -ENCODING 53982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -00 -77 -79 -49 -76 -ENDCHAR -STARTCHAR D2DF -ENCODING 53983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D2E0 -ENCODING 53984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -00 -72 -32 -45 -70 -ENDCHAR -STARTCHAR D2E1 -ENCODING 53985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D2E2 -ENCODING 53986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D2E3 -ENCODING 53987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR D2E4 -ENCODING 53988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -01 -FF -00 -7F -41 -7F -ENDCHAR -STARTCHAR D2E5 -ENCODING 53989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -79 -81 -79 -81 -79 -01 -FE -41 -7F -41 -7F -ENDCHAR -STARTCHAR D2E6 -ENCODING 53990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -12 -72 -55 -70 -ENDCHAR -STARTCHAR D2E7 -ENCODING 53991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -7F -81 -08 -14 -63 -ENDCHAR -STARTCHAR D2E8 -ENCODING 53992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D2E9 -ENCODING 53993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -7F -81 -3E -41 -63 -1C -ENDCHAR -STARTCHAR D2EA -ENCODING 53994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -3C80 -7C80 -4080 -3C80 -FF80 -0080 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR D2EB -ENCODING 53995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -7900 -F900 -0100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D2EC -ENCODING 53996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -7F -01 -3F -01 -ENDCHAR -STARTCHAR D2ED -ENCODING 53997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D2EE -ENCODING 53998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -F9 -81 -79 -3F -C1 -3F -12 -3F -ENDCHAR -STARTCHAR D2EF -ENCODING 53999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -79 -F9 -01 -FD -0C -33 -0C -32 -1E -ENDCHAR -STARTCHAR D2F0 -ENCODING 54000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -F9 -81 -81 -81 -FD -01 -01 -01 -ENDCHAR -STARTCHAR D2F1 -ENCODING 54001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -F9 -81 -81 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D2F2 -ENCODING 54002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -81 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D2F3 -ENCODING 54003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -F100 -8100 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D2F4 -ENCODING 54004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -81 -F9 -81 -81 -FD -01 -20 -20 -3F -ENDCHAR -STARTCHAR D2F5 -ENCODING 54005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -81 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR D2F6 -ENCODING 54006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR D2F7 -ENCODING 54007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -81 -F1 -81 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR D2F8 -ENCODING 54008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -F9 -81 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D2F9 -ENCODING 54009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR D2FA -ENCODING 54010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D2FB -ENCODING 54011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D2FC -ENCODING 54012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D2FD -ENCODING 54013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D2FE -ENCODING 54014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D2FF -ENCODING 54015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR D300 -ENCODING 54016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -F9 -81 -81 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR D301 -ENCODING 54017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -F9 -81 -81 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR D302 -ENCODING 54018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -F100 -8100 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D303 -ENCODING 54019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -8100 -F900 -8100 -8100 -FD00 -0100 -0800 -0800 -3600 -4180 -ENDCHAR -STARTCHAR D304 -ENCODING 54020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -F100 -8100 -F900 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR D305 -ENCODING 54021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -81 -F9 -81 -81 -FD -01 -3E -21 -21 -3E -ENDCHAR -STARTCHAR D306 -ENCODING 54022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -F100 -8100 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR D307 -ENCODING 54023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F100 -8100 -F100 -8900 -7100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR D308 -ENCODING 54024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -81 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D309 -ENCODING 54025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR D30A -ENCODING 54026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F1 -81 -F1 -81 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR D30B -ENCODING 54027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F1 -81 -F1 -89 -71 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D30C -ENCODING 54028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2480 -2480 -2480 -24C0 -2480 -2480 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D30D -ENCODING 54029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -2880 -28C0 -2880 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D30E -ENCODING 54030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -2880 -28C0 -2880 -FE80 -0000 -3F00 -0880 -0880 -0880 -ENDCHAR -STARTCHAR D30F -ENCODING 54031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0000 -3900 -0900 -0A80 -0800 -ENDCHAR -STARTCHAR D310 -ENCODING 54032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -2880 -28C0 -2880 -FE80 -0080 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D311 -ENCODING 54033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0300 -2080 -2100 -2280 -1800 -ENDCHAR -STARTCHAR D312 -ENCODING 54034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5100 -5180 -5D00 -A000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR D313 -ENCODING 54035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR D314 -ENCODING 54036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D315 -ENCODING 54037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5100 -5180 -5D00 -A000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR D316 -ENCODING 54038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0000 -3F80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR D317 -ENCODING 54039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5100 -5180 -5D00 -A000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR D318 -ENCODING 54040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5100 -5180 -5D00 -A000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR D319 -ENCODING 54041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5100 -5180 -5D00 -A000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR D31A -ENCODING 54042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5100 -5180 -5D00 -A000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR D31B -ENCODING 54043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5100 -5180 -5D00 -A000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR D31C -ENCODING 54044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -2880 -28C0 -2880 -FE80 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR D31D -ENCODING 54045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -28C0 -2880 -2880 -FE80 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D31E -ENCODING 54046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0000 -2900 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR D31F -ENCODING 54047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -2880 -28C0 -2880 -FE80 -0080 -0400 -0C00 -1B00 -2080 -ENDCHAR -STARTCHAR D320 -ENCODING 54048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -2880 -28C0 -2880 -FE80 -0000 -1100 -1100 -2A80 -44C0 -ENDCHAR -STARTCHAR D321 -ENCODING 54049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -2880 -28C0 -2880 -FE80 -0080 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR D322 -ENCODING 54050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0000 -1F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR D323 -ENCODING 54051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5100 -5180 -5D00 -A000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR D324 -ENCODING 54052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0000 -1F80 -3F00 -0080 -ENDCHAR -STARTCHAR D325 -ENCODING 54053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0000 -3F80 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D326 -ENCODING 54054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -2880 -28C0 -2880 -FE80 -0000 -1F00 -1100 -3F80 -ENDCHAR -STARTCHAR D327 -ENCODING 54055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5100 -5180 -5D00 -A000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR D328 -ENCODING 54056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4A80 -4A80 -4B80 -4A80 -4A80 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR D329 -ENCODING 54057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4B80 -4A80 -4A80 -FE80 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D32A -ENCODING 54058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -FA80 -0000 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR D32B -ENCODING 54059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -FA80 -0000 -3900 -0500 -0680 -0040 -ENDCHAR -STARTCHAR D32C -ENCODING 54060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -FA80 -4A80 -4A80 -4B80 -4A80 -FE80 -0280 -1280 -1000 -1000 -1FC0 -ENDCHAR -STARTCHAR D32D -ENCODING 54061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -FA80 -0380 -2080 -2080 -2340 -1800 -ENDCHAR -STARTCHAR D32E -ENCODING 54062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D32F -ENCODING 54063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -FA80 -0000 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR D330 -ENCODING 54064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4B80 -4A80 -FE80 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR D331 -ENCODING 54065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR D332 -ENCODING 54066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR D333 -ENCODING 54067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D334 -ENCODING 54068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D335 -ENCODING 54069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D336 -ENCODING 54070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D337 -ENCODING 54071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR D338 -ENCODING 54072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4A80 -4B80 -4A80 -FE80 -0000 -1F80 -2080 -2080 -1F80 -ENDCHAR -STARTCHAR D339 -ENCODING 54073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4A80 -4B80 -4A80 -FE80 -0000 -1080 -1F80 -1080 -1F80 -ENDCHAR -STARTCHAR D33A -ENCODING 54074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -FA80 -0000 -2500 -3900 -2680 -3840 -ENDCHAR -STARTCHAR D33B -ENCODING 54075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -FA80 -4A80 -4A80 -4B80 -4A80 -FE80 -0080 -0400 -0600 -1900 -20C0 -ENDCHAR -STARTCHAR D33C -ENCODING 54076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -FA80 -4A80 -4A80 -4B80 -4A80 -FE80 -0000 -0900 -1900 -1A80 -2640 -ENDCHAR -STARTCHAR D33D -ENCODING 54077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4A80 -4B80 -4A80 -FE80 -0000 -1F00 -1080 -1080 -1F00 -ENDCHAR -STARTCHAR D33E -ENCODING 54078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -FA80 -0000 -1F80 -0100 -0FC0 -1000 -ENDCHAR -STARTCHAR D33F -ENCODING 54079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9700 -9D00 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D340 -ENCODING 54080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -FA80 -0000 -1F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR D341 -ENCODING 54081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D342 -ENCODING 54082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -FA80 -0000 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR D343 -ENCODING 54083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -97 -9D -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D344 -ENCODING 54084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2480 -24C0 -2480 -2480 -24C0 -2480 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D345 -ENCODING 54085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2880 -28C0 -2880 -28C0 -FE80 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D346 -ENCODING 54086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -3F00 -0880 -0880 -ENDCHAR -STARTCHAR D347 -ENCODING 54087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -3900 -0900 -0A80 -0800 -ENDCHAR -STARTCHAR D348 -ENCODING 54088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -5180 -5100 -5100 -FD80 -0100 -4000 -4000 -7E00 -ENDCHAR -STARTCHAR D349 -ENCODING 54089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0300 -2080 -2100 -2280 -1800 -ENDCHAR -STARTCHAR D34A -ENCODING 54090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -0600 -4F00 -4600 -4900 -3600 -ENDCHAR -STARTCHAR D34B -ENCODING 54091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR D34C -ENCODING 54092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -7E00 -0100 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR D34D -ENCODING 54093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -7E00 -1100 -7100 -4100 -7100 -ENDCHAR -STARTCHAR D34E -ENCODING 54094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -7600 -1900 -7900 -8900 -7600 -ENDCHAR -STARTCHAR D34F -ENCODING 54095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -6800 -1900 -7F00 -8900 -7E00 -ENDCHAR -STARTCHAR D350 -ENCODING 54096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -7200 -1200 -7200 -8500 -6800 -ENDCHAR -STARTCHAR D351 -ENCODING 54097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR D352 -ENCODING 54098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -6200 -1500 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR D353 -ENCODING 54099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -7600 -1F00 -7600 -8900 -7600 -ENDCHAR -STARTCHAR D354 -ENCODING 54100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -3F80 -2080 -3F80 -ENDCHAR -STARTCHAR D355 -ENCODING 54101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR D356 -ENCODING 54102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -2900 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR D357 -ENCODING 54103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR D358 -ENCODING 54104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -1100 -1100 -2A80 -4400 -ENDCHAR -STARTCHAR D359 -ENCODING 54105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0C00 -1300 -2080 -1100 -0E00 -ENDCHAR -STARTCHAR D35A -ENCODING 54106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -1F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR D35B -ENCODING 54107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR D35C -ENCODING 54108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -1F80 -3F00 -0080 -ENDCHAR -STARTCHAR D35D -ENCODING 54109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -7F00 -4000 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR D35E -ENCODING 54110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -7C80 -28C0 -2880 -28C0 -FE80 -0000 -1F00 -1100 -3F80 -ENDCHAR -STARTCHAR D35F -ENCODING 54111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -5180 -5100 -5D80 -A000 -1C00 -7F00 -1C00 -2200 -1C00 -ENDCHAR -STARTCHAR D360 -ENCODING 54112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -2 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -4A80 -4B80 -F280 -0280 -0280 -ENDCHAR -STARTCHAR D361 -ENCODING 54113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D362 -ENCODING 54114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR D363 -ENCODING 54115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -3900 -0500 -0680 -0040 -ENDCHAR -STARTCHAR D364 -ENCODING 54116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4A80 -4B80 -4A80 -FF80 -0280 -0280 -1000 -1F80 -ENDCHAR -STARTCHAR D365 -ENCODING 54117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0380 -2080 -2080 -2340 -1800 -ENDCHAR -STARTCHAR D366 -ENCODING 54118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D367 -ENCODING 54119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR D368 -ENCODING 54120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D369 -ENCODING 54121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR D36A -ENCODING 54122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR D36B -ENCODING 54123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D36C -ENCODING 54124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D36D -ENCODING 54125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D36E -ENCODING 54126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D36F -ENCODING 54127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR D370 -ENCODING 54128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR D371 -ENCODING 54129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -1080 -1F80 -1F80 -ENDCHAR -STARTCHAR D372 -ENCODING 54130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -2500 -3900 -2680 -3840 -ENDCHAR -STARTCHAR D373 -ENCODING 54131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR D374 -ENCODING 54132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -0900 -1900 -2E80 -0040 -ENDCHAR -STARTCHAR D375 -ENCODING 54133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0600 -1980 -2080 -1080 -0F00 -ENDCHAR -STARTCHAR D376 -ENCODING 54134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -1F80 -0100 -0FC0 -1000 -ENDCHAR -STARTCHAR D377 -ENCODING 54135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9700 -9500 -9F00 -6500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D378 -ENCODING 54136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -1F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR D379 -ENCODING 54137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D37A -ENCODING 54138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4B80 -4A80 -4B80 -FA80 -0000 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR D37B -ENCODING 54139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -97 -95 -9F -65 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D37C -ENCODING 54140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -49 -49 -4F -49 -49 -49 -FD -01 -01 -01 -ENDCHAR -STARTCHAR D37D -ENCODING 54141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -57 -51 -51 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D37E -ENCODING 54142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -51 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D37F -ENCODING 54143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5100 -5700 -5100 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D380 -ENCODING 54144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -57 -51 -51 -FD -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR D381 -ENCODING 54145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -51 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR D382 -ENCODING 54146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR D383 -ENCODING 54147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -51 -57 -51 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR D384 -ENCODING 54148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -57 -51 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D385 -ENCODING 54149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR D386 -ENCODING 54150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D387 -ENCODING 54151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D388 -ENCODING 54152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D389 -ENCODING 54153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D38A -ENCODING 54154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D38B -ENCODING 54155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR D38C -ENCODING 54156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -57 -51 -51 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR D38D -ENCODING 54157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -57 -51 -51 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR D38E -ENCODING 54158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5100 -5700 -5100 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D38F -ENCODING 54159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -57 -51 -51 -FD -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR D390 -ENCODING 54160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -5100 -5700 -5100 -5100 -FD00 -0000 -2200 -2200 -3500 -4C80 -ENDCHAR -STARTCHAR D391 -ENCODING 54161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -57 -51 -51 -FD -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR D392 -ENCODING 54162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5100 -5700 -5100 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR D393 -ENCODING 54163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5100 -5700 -5D00 -A100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR D394 -ENCODING 54164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -51 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D395 -ENCODING 54165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR D396 -ENCODING 54166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -51 -57 -51 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR D397 -ENCODING 54167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -57 -5D -A1 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D398 -ENCODING 54168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4A80 -4E80 -4A80 -4A80 -4A80 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR D399 -ENCODING 54169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4E80 -4A80 -4A80 -FE80 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D39A -ENCODING 54170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4E80 -4A80 -FA80 -0000 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR D39B -ENCODING 54171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4E80 -4A80 -FA80 -0000 -3900 -0500 -0680 -0040 -ENDCHAR -STARTCHAR D39C -ENCODING 54172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -FA80 -4A80 -4E80 -4A80 -4A80 -FE80 -0280 -1280 -1000 -1000 -1FC0 -ENDCHAR -STARTCHAR D39D -ENCODING 54173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4E80 -4A80 -FA80 -0380 -2080 -2080 -2340 -1800 -ENDCHAR -STARTCHAR D39E -ENCODING 54174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D39F -ENCODING 54175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4A80 -4E80 -4A80 -FA80 -0000 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR D3A0 -ENCODING 54176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4E80 -4A80 -FE80 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR D3A1 -ENCODING 54177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR D3A2 -ENCODING 54178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR D3A3 -ENCODING 54179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D3A4 -ENCODING 54180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D3A5 -ENCODING 54181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D3A6 -ENCODING 54182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D3A7 -ENCODING 54183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR D3A8 -ENCODING 54184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4E80 -4A80 -4A80 -FE80 -0000 -1F80 -2080 -2080 -1F80 -ENDCHAR -STARTCHAR D3A9 -ENCODING 54185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4E80 -4A80 -4A80 -FE80 -0000 -1080 -1F80 -1080 -1F80 -ENDCHAR -STARTCHAR D3AA -ENCODING 54186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4E80 -4A80 -FA80 -0000 -2500 -3900 -2680 -3840 -ENDCHAR -STARTCHAR D3AB -ENCODING 54187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -FA80 -4A80 -4E80 -4A80 -4A80 -FE80 -0080 -0400 -0600 -1900 -20C0 -ENDCHAR -STARTCHAR D3AC -ENCODING 54188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4E80 -4A80 -FA80 -0000 -0900 -1900 -2E80 -0040 -ENDCHAR -STARTCHAR D3AD -ENCODING 54189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4E80 -4A80 -4A80 -FE80 -0000 -1F00 -1080 -1080 -1F00 -ENDCHAR -STARTCHAR D3AE -ENCODING 54190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4E80 -4A80 -FA80 -0000 -1F80 -0100 -0FC0 -1000 -ENDCHAR -STARTCHAR D3AF -ENCODING 54191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9500 -9500 -9D00 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D3B0 -ENCODING 54192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4A80 -4E80 -4A80 -FA80 -0000 -1F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR D3B1 -ENCODING 54193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D3B2 -ENCODING 54194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4A80 -4E80 -4A80 -FA80 -0000 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR D3B3 -ENCODING 54195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -95 -95 -9D -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D3B4 -ENCODING 54196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -57 -51 -51 -57 -51 -FD -01 -01 -01 -ENDCHAR -STARTCHAR D3B5 -ENCODING 54197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -57 -53 -51 -F9 -00 -3F -01 -01 -01 -ENDCHAR -STARTCHAR D3B6 -ENCODING 54198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -57 -53 -51 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D3B7 -ENCODING 54199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5700 -5300 -5100 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D3B8 -ENCODING 54200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -57 -51 -57 -51 -FD -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR D3B9 -ENCODING 54201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -57 -53 -51 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR D3BA -ENCODING 54202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR D3BB -ENCODING 54203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -57 -53 -51 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR D3BC -ENCODING 54204 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -57 -51 -57 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D3BD -ENCODING 54205 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR D3BE -ENCODING 54206 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D3BF -ENCODING 54207 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D3C0 -ENCODING 54208 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D3C1 -ENCODING 54209 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D3C2 -ENCODING 54210 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D3C3 -ENCODING 54211 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR D3C4 -ENCODING 54212 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -57 -51 -57 -51 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR D3C5 -ENCODING 54213 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -57 -51 -57 -51 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR D3C6 -ENCODING 54214 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5700 -5300 -5100 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D3C7 -ENCODING 54215 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -57 -53 -51 -F9 -00 -08 -14 -63 -ENDCHAR -STARTCHAR D3C8 -ENCODING 54216 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -F900 -5700 -5100 -5700 -5100 -FD00 -0000 -1200 -3200 -3500 -4C80 -ENDCHAR -STARTCHAR D3C9 -ENCODING 54217 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -57 -51 -57 -51 -FD -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR D3CA -ENCODING 54218 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5700 -5300 -5100 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR D3CB -ENCODING 54219 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5300 -5700 -5D00 -A100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR D3CC -ENCODING 54220 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -57 -53 -51 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D3CD -ENCODING 54221 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR D3CE -ENCODING 54222 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -57 -53 -51 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR D3CF -ENCODING 54223 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -53 -57 -5D -A1 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D3D0 -ENCODING 54224 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4A80 -4E80 -4A80 -4A80 -4E80 -4A80 -FE80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR D3D1 -ENCODING 54225 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D3D2 -ENCODING 54226 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR D3D3 -ENCODING 54227 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -3900 -0500 -0680 -0040 -ENDCHAR -STARTCHAR D3D4 -ENCODING 54228 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FE80 -0280 -0080 -1000 -1F80 -ENDCHAR -STARTCHAR D3D5 -ENCODING 54229 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0380 -2080 -2080 -2340 -1800 -ENDCHAR -STARTCHAR D3D6 -ENCODING 54230 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D3D7 -ENCODING 54231 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR D3D8 -ENCODING 54232 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4E80 -4A80 -4E80 -FE80 -0000 -1F80 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR D3D9 -ENCODING 54233 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -77 -09 -79 -41 -38 -ENDCHAR -STARTCHAR D3DA -ENCODING 54234 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -77 -0D -75 -45 -37 -ENDCHAR -STARTCHAR D3DB -ENCODING 54235 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -74 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D3DC -ENCODING 54236 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D3DD -ENCODING 54237 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -77 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D3DE -ENCODING 54238 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D3DF -ENCODING 54239 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -77 -1F -77 -45 -76 -ENDCHAR -STARTCHAR D3E0 -ENCODING 54240 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR D3E1 -ENCODING 54241 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -FA80 -4E80 -4A80 -4E80 -4A80 -FE80 -0000 -1080 -1F80 -1080 -1F80 -ENDCHAR -STARTCHAR D3E2 -ENCODING 54242 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -2500 -3900 -2680 -3840 -ENDCHAR -STARTCHAR D3E3 -ENCODING 54243 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -FA80 -4E80 -4A80 -4E80 -4A80 -FE80 -0280 -0480 -0600 -0900 -30C0 -ENDCHAR -STARTCHAR D3E4 -ENCODING 54244 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -0900 -1900 -2E80 -0040 -ENDCHAR -STARTCHAR D3E5 -ENCODING 54245 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4E80 -4A80 -4E80 -FA80 -0680 -1980 -2080 -1080 -0F00 -ENDCHAR -STARTCHAR D3E6 -ENCODING 54246 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -1F80 -0100 -0FC0 -1000 -ENDCHAR -STARTCHAR D3E7 -ENCODING 54247 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -9D00 -9500 -9D00 -6100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D3E8 -ENCODING 54248 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -1F80 -1F80 -0080 -0080 -ENDCHAR -STARTCHAR D3E9 -ENCODING 54249 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D3EA -ENCODING 54250 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -FA80 -4E80 -4A80 -4A80 -FA80 -0000 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR D3EB -ENCODING 54251 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -9D -95 -9D -61 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D3EC -ENCODING 54252 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -1200 -1200 -1200 -1200 -7F80 -0400 -0400 -FFC0 -ENDCHAR -STARTCHAR D3ED -ENCODING 54253 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D3EE -ENCODING 54254 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -24 -76 -08 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR D3EF -ENCODING 54255 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7E00 -2400 -7600 -0800 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR D3F0 -ENCODING 54256 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D3F1 -ENCODING 54257 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -24 -76 -08 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR D3F2 -ENCODING 54258 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR D3F3 -ENCODING 54259 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -24 -76 -08 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR D3F4 -ENCODING 54260 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -3F80 -0400 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D3F5 -ENCODING 54261 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D3F6 -ENCODING 54262 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D3F7 -ENCODING 54263 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR D3F8 -ENCODING 54264 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D3F9 -ENCODING 54265 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR D3FA -ENCODING 54266 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR D3FB -ENCODING 54267 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR D3FC -ENCODING 54268 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR D3FD -ENCODING 54269 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D3FE -ENCODING 54270 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -24 -76 -08 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR D3FF -ENCODING 54271 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -0000 -0400 -0C00 -1300 -6080 -ENDCHAR -STARTCHAR D400 -ENCODING 54272 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -24 -76 -08 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR D401 -ENCODING 54273 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR D402 -ENCODING 54274 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -24 -76 -08 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR D403 -ENCODING 54275 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR D404 -ENCODING 54276 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -24 -76 -08 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR D405 -ENCODING 54277 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR D406 -ENCODING 54278 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -24 -76 -08 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR D407 -ENCODING 54279 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0400 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR D408 -ENCODING 54280 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7E80 -2480 -2480 -2480 -7EC0 -1080 -1080 -FE80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D409 -ENCODING 54281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR D40A -ENCODING 54282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR D40B -ENCODING 54283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -7200 -1200 -1500 -1000 -ENDCHAR -STARTCHAR D40C -ENCODING 54284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -4900 -FD80 -2100 -DD00 -0000 -4000 -7E00 -ENDCHAR -STARTCHAR D40D -ENCODING 54285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -4700 -4200 -4500 -3000 -ENDCHAR -STARTCHAR D40E -ENCODING 54286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR D40F -ENCODING 54287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR D410 -ENCODING 54288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -1F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D411 -ENCODING 54289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -3300 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D412 -ENCODING 54290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -0000 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D413 -ENCODING 54291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -3000 -0C80 -3F00 -4480 -3F00 -ENDCHAR -STARTCHAR D414 -ENCODING 54292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -3100 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D415 -ENCODING 54293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -3300 -0C00 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR D416 -ENCODING 54294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -3000 -0B80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D417 -ENCODING 54295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -3300 -0F80 -3B00 -4480 -3B00 -ENDCHAR -STARTCHAR D418 -ENCODING 54296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR D419 -ENCODING 54297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR D41A -ENCODING 54298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -1200 -7200 -5500 -7800 -ENDCHAR -STARTCHAR D41B -ENCODING 54299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR D41C -ENCODING 54300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -2200 -2200 -5500 -8800 -ENDCHAR -STARTCHAR D41D -ENCODING 54301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -7C80 -2480 -2480 -7EC0 -1080 -FE80 -0000 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR D41E -ENCODING 54302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR D41F -ENCODING 54303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -0E00 -1E00 -0100 -0F00 -3080 -ENDCHAR -STARTCHAR D420 -ENCODING 54304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -7E00 -3F00 -0100 -ENDCHAR -STARTCHAR D421 -ENCODING 54305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -1F00 -2000 -3F00 -2000 -1F80 -ENDCHAR -STARTCHAR D422 -ENCODING 54306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -F900 -4900 -4980 -B100 -FD00 -0000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR D423 -ENCODING 54307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -7C80 -2480 -7EC0 -1080 -FE00 -0E00 -3F80 -0E00 -1100 -0E00 -ENDCHAR -STARTCHAR D424 -ENCODING 54308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -0280 -7A80 -4A80 -4B80 -FE80 -1280 -0E80 -7280 -0280 -0080 -ENDCHAR -STARTCHAR D425 -ENCODING 54309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -57 -FD -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D426 -ENCODING 54310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -57 -FD -FD -00 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D427 -ENCODING 54311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -5700 -FD00 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D428 -ENCODING 54312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -55 -55 -FF -25 -F5 -05 -20 -3F -ENDCHAR -STARTCHAR D429 -ENCODING 54313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -5700 -FD00 -FD00 -0000 -4700 -4100 -4780 -3000 -ENDCHAR -STARTCHAR D42A -ENCODING 54314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -0380 -2780 -2380 -2280 -1B00 -ENDCHAR -STARTCHAR D42B -ENCODING 54315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -55 -57 -FD -FD -00 -3F -40 -7F -ENDCHAR -STARTCHAR D42C -ENCODING 54316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -1F00 -0080 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR D42D -ENCODING 54317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -1B00 -0480 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR D42E -ENCODING 54318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -0000 -1F80 -3A80 -2280 -1B80 -ENDCHAR -STARTCHAR D42F -ENCODING 54319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -1800 -0680 -3B80 -2280 -1B80 -ENDCHAR -STARTCHAR D430 -ENCODING 54320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -3100 -0900 -3900 -2280 -3C00 -ENDCHAR -STARTCHAR D431 -ENCODING 54321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -1980 -0600 -3B80 -2200 -1B80 -ENDCHAR -STARTCHAR D432 -ENCODING 54322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -0000 -3B80 -3A80 -2280 -3B80 -ENDCHAR -STARTCHAR D433 -ENCODING 54323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -3380 -0FC0 -3B80 -2280 -3980 -ENDCHAR -STARTCHAR D434 -ENCODING 54324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -55 -57 -FD -FD -00 -3F -41 -7F -ENDCHAR -STARTCHAR D435 -ENCODING 54325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -55 -57 -FD -FD -00 -21 -3F -3F -ENDCHAR -STARTCHAR D436 -ENCODING 54326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -5700 -FD00 -FD00 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D437 -ENCODING 54327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -55 -57 -FD -FD -00 -08 -14 -63 -ENDCHAR -STARTCHAR D438 -ENCODING 54328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -5700 -FD00 -FD00 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR D439 -ENCODING 54329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -57 -FD -FD -08 -37 -41 -23 -1C -ENDCHAR -STARTCHAR D43A -ENCODING 54330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -5700 -FD00 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D43B -ENCODING 54331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -0E00 -1E00 -0180 -0F00 -30C0 -ENDCHAR -STARTCHAR D43C -ENCODING 54332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -57 -FD -FD -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D43D -ENCODING 54333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -1F80 -2000 -1F80 -2000 -1F80 -ENDCHAR -STARTCHAR D43E -ENCODING 54334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F5 -55 -57 -FD -FD -00 -3F -12 -3F -ENDCHAR -STARTCHAR D43F -ENCODING 54335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -6B80 -1280 -FE80 -0E00 -1180 -0E00 -1100 -0F00 -ENDCHAR -STARTCHAR D440 -ENCODING 54336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -2480 -2480 -2480 -7E80 -1080 -1080 -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D441 -ENCODING 54337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D442 -ENCODING 54338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D443 -ENCODING 54339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4900 -4900 -B100 -FD00 -0100 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D444 -ENCODING 54340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -49 -49 -FD -21 -21 -FF -01 -41 -40 -7F -ENDCHAR -STARTCHAR D445 -ENCODING 54341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -47 -42 -45 -30 -ENDCHAR -STARTCHAR D446 -ENCODING 54342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR D447 -ENCODING 54343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -3F -40 -7E -ENDCHAR -STARTCHAR D448 -ENCODING 54344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -7E -01 -7F -40 -3F -ENDCHAR -STARTCHAR D449 -ENCODING 54345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR D44A -ENCODING 54346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR D44B -ENCODING 54347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D44C -ENCODING 54348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR D44D -ENCODING 54349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D44E -ENCODING 54350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR D44F -ENCODING 54351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR D450 -ENCODING 54352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -7F -41 -7F -ENDCHAR -STARTCHAR D451 -ENCODING 54353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -41 -7F -7F -ENDCHAR -STARTCHAR D452 -ENCODING 54354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -52 -72 -55 -78 -ENDCHAR -STARTCHAR D453 -ENCODING 54355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR D454 -ENCODING 54356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D455 -ENCODING 54357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR D456 -ENCODING 54358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4900 -4900 -B100 -FD00 -0100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D457 -ENCODING 54359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4900 -FD00 -2100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D458 -ENCODING 54360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -7F -3F -01 -01 -ENDCHAR -STARTCHAR D459 -ENCODING 54361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR D45A -ENCODING 54362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -7F -12 -3F -ENDCHAR -STARTCHAR D45B -ENCODING 54363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -21 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D45C -ENCODING 54364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -1200 -1200 -1200 -7F80 -1200 -1200 -1200 -FFC0 -ENDCHAR -STARTCHAR D45D -ENCODING 54365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -24 -7E -24 -FF -00 -7E -01 -01 -ENDCHAR -STARTCHAR D45E -ENCODING 54366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -24 -7E -24 -FF -00 -7E -11 -11 -10 -ENDCHAR -STARTCHAR D45F -ENCODING 54367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7E00 -2400 -7E00 -2400 -FF00 -0000 -F200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR D460 -ENCODING 54368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -1200 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D461 -ENCODING 54369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -24 -7E -24 -FF -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR D462 -ENCODING 54370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -0300 -2780 -2300 -2480 -1B00 -ENDCHAR -STARTCHAR D463 -ENCODING 54371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -24 -7E -24 -FF -00 -7E -40 -7E -ENDCHAR -STARTCHAR D464 -ENCODING 54372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -3F80 -1200 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D465 -ENCODING 54373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -3F00 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D466 -ENCODING 54374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -3B80 -0C80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D467 -ENCODING 54375 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -3C80 -0C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR D468 -ENCODING 54376 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -7900 -0900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D469 -ENCODING 54377 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -3B80 -0C00 -3F80 -2400 -3B80 -ENDCHAR -STARTCHAR D46A -ENCODING 54378 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -7F80 -0A80 -7A80 -4280 -3F80 -ENDCHAR -STARTCHAR D46B -ENCODING 54379 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -7B00 -0F80 -7B00 -4480 -3B00 -ENDCHAR -STARTCHAR D46C -ENCODING 54380 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -24 -7E -24 -FF -00 -7E -41 -7F -ENDCHAR -STARTCHAR D46D -ENCODING 54381 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D46E -ENCODING 54382 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -24 -7E -24 -FF -00 -92 -F2 -95 -F8 -ENDCHAR -STARTCHAR D46F -ENCODING 54383 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -0000 -0400 -0C00 -1300 -6080 -ENDCHAR -STARTCHAR D470 -ENCODING 54384 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -24 -7E -24 -FF -00 -24 -26 -59 -80 -ENDCHAR -STARTCHAR D471 -ENCODING 54385 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -7E -24 -7E -24 -FF -00 -3E -41 -42 -3C -ENDCHAR -STARTCHAR D472 -ENCODING 54386 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -24 -7E -24 -FF -00 -7E -04 -7F -ENDCHAR -STARTCHAR D473 -ENCODING 54387 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -0E00 -3F00 -0300 -1F00 -6080 -ENDCHAR -STARTCHAR D474 -ENCODING 54388 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -24 -7E -24 -FF -00 -7E -7F -01 -ENDCHAR -STARTCHAR D475 -ENCODING 54389 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -1F00 -2000 -3F00 -3F00 -ENDCHAR -STARTCHAR D476 -ENCODING 54390 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -24 -7E -24 -FF -00 -7F -24 -7E -ENDCHAR -STARTCHAR D477 -ENCODING 54391 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -1200 -FFC0 -0E00 -3F80 -0E00 -1100 -1E00 -ENDCHAR -STARTCHAR D478 -ENCODING 54392 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -1200 -1200 -1200 -7F80 -0000 -FFC0 -0400 -0400 -0400 -ENDCHAR -STARTCHAR D479 -ENCODING 54393 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D47A -ENCODING 54394 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0400 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR D47B -ENCODING 54395 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0400 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR D47C -ENCODING 54396 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0400 -2400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR D47D -ENCODING 54397 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0400 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR D47E -ENCODING 54398 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR D47F -ENCODING 54399 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0400 -3F00 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D480 -ENCODING 54400 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D481 -ENCODING 54401 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -08 -7F -71 -41 -71 -ENDCHAR -STARTCHAR D482 -ENCODING 54402 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0400 -3F80 -0C80 -3C80 -4480 -3F80 -ENDCHAR -STARTCHAR D483 -ENCODING 54403 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR D484 -ENCODING 54404 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR D485 -ENCODING 54405 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -08 -7F -7E -88 -77 -ENDCHAR -STARTCHAR D486 -ENCODING 54406 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR D487 -ENCODING 54407 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR D488 -ENCODING 54408 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0400 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR D489 -ENCODING 54409 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0400 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D48A -ENCODING 54410 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0400 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR D48B -ENCODING 54411 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0400 -0400 -0C00 -1300 -6080 -ENDCHAR -STARTCHAR D48C -ENCODING 54412 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0400 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR D48D -ENCODING 54413 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0400 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR D48E -ENCODING 54414 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -2 -BITMAP -7E -24 -7F -00 -FF -08 -7E -04 -7F -ENDCHAR -STARTCHAR D48F -ENCODING 54415 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -F7 -08 -3C -7C -02 -3E -C1 -ENDCHAR -STARTCHAR D490 -ENCODING 54416 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0400 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR D491 -ENCODING 54417 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -24 -24 -7F -00 -FF -08 -7E -7E -7E -ENDCHAR -STARTCHAR D492 -ENCODING 54418 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0400 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR D493 -ENCODING 54419 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -F7 -08 -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR D494 -ENCODING 54420 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7C80 -2480 -2480 -2480 -7E80 -0080 -FE80 -1080 -1380 -1080 -1080 -ENDCHAR -STARTCHAR D495 -ENCODING 54421 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -3E -01 -01 -01 -ENDCHAR -STARTCHAR D496 -ENCODING 54422 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -36 -09 -09 -09 -ENDCHAR -STARTCHAR D497 -ENCODING 54423 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -72 -12 -15 -10 -ENDCHAR -STARTCHAR D498 -ENCODING 54424 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -F9 -01 -FD -27 -21 -40 -7F -ENDCHAR -STARTCHAR D499 -ENCODING 54425 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D49A -ENCODING 54426 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -46 -4F -49 -36 -ENDCHAR -STARTCHAR D49B -ENCODING 54427 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -3F -40 -7E -ENDCHAR -STARTCHAR D49C -ENCODING 54428 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -7F -3F -40 -3F -ENDCHAR -STARTCHAR D49D -ENCODING 54429 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -77 -31 -41 -71 -ENDCHAR -STARTCHAR D49E -ENCODING 54430 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D49F -ENCODING 54431 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D4A0 -ENCODING 54432 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -52 -72 -85 -68 -ENDCHAR -STARTCHAR D4A1 -ENCODING 54433 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D4A2 -ENCODING 54434 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D4A3 -ENCODING 54435 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -76 -37 -49 -76 -ENDCHAR -STARTCHAR D4A4 -ENCODING 54436 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -7F -41 -7F -ENDCHAR -STARTCHAR D4A5 -ENCODING 54437 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -41 -7F -7F -ENDCHAR -STARTCHAR D4A6 -ENCODING 54438 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR D4A7 -ENCODING 54439 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -08 -14 -63 -ENDCHAR -STARTCHAR D4A8 -ENCODING 54440 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D4A9 -ENCODING 54441 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -57 -51 -FD -01 -FD -21 -3E -41 -41 -3E -ENDCHAR -STARTCHAR D4AA -ENCODING 54442 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -5100 -FD00 -1D00 -E100 -2700 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D4AB -ENCODING 54443 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -4900 -FD00 -DD00 -2300 -3D00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D4AC -ENCODING 54444 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -7F -01 -3F -01 -ENDCHAR -STARTCHAR D4AD -ENCODING 54445 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -27 -21 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D4AE -ENCODING 54446 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -51 -FD -1D -E1 -27 -3F -12 -3F -ENDCHAR -STARTCHAR D4AF -ENCODING 54447 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -DD -23 -3D -23 -1C -22 -1E -ENDCHAR -STARTCHAR D4B0 -ENCODING 54448 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -2 -BITMAP -0080 -7A80 -4A80 -4A80 -7E80 -0280 -FE80 -1680 -1280 -0280 -ENDCHAR -STARTCHAR D4B1 -ENCODING 54449 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -3F80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR D4B2 -ENCODING 54450 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -1F80 -0480 -0480 -0480 -ENDCHAR -STARTCHAR D4B3 -ENCODING 54451 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -3900 -0500 -0680 -0040 -ENDCHAR -STARTCHAR D4B4 -ENCODING 54452 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -2A80 -5280 -FE80 -1680 -1280 -2000 -3F80 -ENDCHAR -STARTCHAR D4B5 -ENCODING 54453 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR D4B6 -ENCODING 54454 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -F500 -1500 -ED00 -2000 -4F80 -4700 -4500 -3200 -ENDCHAR -STARTCHAR D4B7 -ENCODING 54455 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR D4B8 -ENCODING 54456 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -ED -20 -1F -7F -40 -3F -ENDCHAR -STARTCHAR D4B9 -ENCODING 54457 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -ED -20 -1F -39 -41 -38 -ENDCHAR -STARTCHAR D4BA -ENCODING 54458 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -ED -20 -77 -35 -45 -37 -ENDCHAR -STARTCHAR D4BB -ENCODING 54459 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -ED -20 -1D -77 -45 -37 -ENDCHAR -STARTCHAR D4BC -ENCODING 54460 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -ED -20 -52 -72 -45 -70 -ENDCHAR -STARTCHAR D4BD -ENCODING 54461 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -ED -20 -1F -77 -44 -37 -ENDCHAR -STARTCHAR D4BE -ENCODING 54462 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -ED -20 -57 -75 -45 -77 -ENDCHAR -STARTCHAR D4BF -ENCODING 54463 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -ED -27 -7F -77 -45 -72 -ENDCHAR -STARTCHAR D4C0 -ENCODING 54464 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -1F80 -2080 -3F80 -ENDCHAR -STARTCHAR D4C1 -ENCODING 54465 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR D4C2 -ENCODING 54466 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -2100 -3900 -2A80 -3840 -ENDCHAR -STARTCHAR D4C3 -ENCODING 54467 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -0400 -0E00 -3180 -ENDCHAR -STARTCHAR D4C4 -ENCODING 54468 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -0100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR D4C5 -ENCODING 54469 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -1F00 -2080 -3080 -0F00 -ENDCHAR -STARTCHAR D4C6 -ENCODING 54470 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR D4C7 -ENCODING 54471 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F500 -5500 -F500 -1500 -ED00 -2000 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D4C8 -ENCODING 54472 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -1F80 -0080 -1F80 -0080 -ENDCHAR -STARTCHAR D4C9 -ENCODING 54473 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -ED -20 -3F -3F -40 -3F -ENDCHAR -STARTCHAR D4CA -ENCODING 54474 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -0080 -7A80 -2A80 -7A80 -0280 -FA80 -1680 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR D4CB -ENCODING 54475 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F5 -55 -F5 -15 -E5 -3C -33 -0C -32 -1E -ENDCHAR -STARTCHAR D4CC -ENCODING 54476 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -7E80 -2480 -2480 -2480 -7E80 -0080 -FE80 -1080 -1080 -1080 -1080 -ENDCHAR -STARTCHAR D4CD -ENCODING 54477 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -01 -FD -21 -3E -01 -01 -01 -ENDCHAR -STARTCHAR D4CE -ENCODING 54478 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -01 -FD -21 -36 -09 -09 -09 -ENDCHAR -STARTCHAR D4CF -ENCODING 54479 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -01 -FD -21 -72 -12 -15 -10 -ENDCHAR -STARTCHAR D4D0 -ENCODING 54480 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -49 -49 -FD -01 -FD -11 -11 -40 -40 -7F -ENDCHAR -STARTCHAR D4D1 -ENCODING 54481 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -01 -FD -21 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D4D2 -ENCODING 54482 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -20 -46 -4F -49 -36 -ENDCHAR -STARTCHAR D4D3 -ENCODING 54483 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -51 -FD -01 -FD -21 -3F -40 -7E -ENDCHAR -STARTCHAR D4D4 -ENCODING 54484 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -49 -FD -01 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR D4D5 -ENCODING 54485 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -20 -77 -31 -41 -71 -ENDCHAR -STARTCHAR D4D6 -ENCODING 54486 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -20 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D4D7 -ENCODING 54487 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -20 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D4D8 -ENCODING 54488 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -20 -52 -72 -85 -68 -ENDCHAR -STARTCHAR D4D9 -ENCODING 54489 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -20 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D4DA -ENCODING 54490 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -20 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D4DB -ENCODING 54491 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -20 -77 -37 -49 -76 -ENDCHAR -STARTCHAR D4DC -ENCODING 54492 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -FD -49 -49 -FD -01 -FD -21 -20 -7F -41 -7F -ENDCHAR -STARTCHAR D4DD -ENCODING 54493 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -51 -FD -01 -FD -21 -41 -7F -7F -ENDCHAR -STARTCHAR D4DE -ENCODING 54494 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -01 -FD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR D4DF -ENCODING 54495 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -FD00 -4900 -4900 -FD00 -0100 -FD00 -2100 -2800 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR D4E0 -ENCODING 54496 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -01 -FD -21 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D4E1 -ENCODING 54497 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -01 -FD -21 -3E -41 -63 -1C -ENDCHAR -STARTCHAR D4E2 -ENCODING 54498 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -5100 -FD00 -0100 -FD00 -2100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D4E3 -ENCODING 54499 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -7900 -4900 -FD00 -1D00 -E100 -3C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D4E4 -ENCODING 54500 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -51 -FD -01 -FD -21 -7F -01 -3F -01 -ENDCHAR -STARTCHAR D4E5 -ENCODING 54501 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -20 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D4E6 -ENCODING 54502 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -79 -51 -FD -01 -FD -21 -3F -12 -3F -ENDCHAR -STARTCHAR D4E7 -ENCODING 54503 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -79 -49 -FD -1D -E1 -3C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D4E8 -ENCODING 54504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -3F80 -1200 -1200 -1200 -7F80 -0000 -FFC0 -1200 -1200 -1200 -ENDCHAR -STARTCHAR D4E9 -ENCODING 54505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D4EA -ENCODING 54506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR D4EB -ENCODING 54507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR D4EC -ENCODING 54508 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -1200 -3200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR D4ED -ENCODING 54509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR D4EE -ENCODING 54510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -24 -02 -8F -89 -76 -ENDCHAR -STARTCHAR D4EF -ENCODING 54511 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR D4F0 -ENCODING 54512 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D4F1 -ENCODING 54513 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -24 -7F -71 -41 -71 -ENDCHAR -STARTCHAR D4F2 -ENCODING 54514 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -24 -7F -79 -89 -76 -ENDCHAR -STARTCHAR D4F3 -ENCODING 54515 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -24 -79 -7F -49 -76 -ENDCHAR -STARTCHAR D4F4 -ENCODING 54516 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -24 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR D4F5 -ENCODING 54517 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -24 -7F -7E -88 -77 -ENDCHAR -STARTCHAR D4F6 -ENCODING 54518 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -24 -FF -75 -85 -7F -ENDCHAR -STARTCHAR D4F7 -ENCODING 54519 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -24 -72 -77 -89 -76 -ENDCHAR -STARTCHAR D4F8 -ENCODING 54520 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -1200 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR D4F9 -ENCODING 54521 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -3200 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR D4FA -ENCODING 54522 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR D4FB -ENCODING 54523 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -1100 -1500 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR D4FC -ENCODING 54524 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR D4FD -ENCODING 54525 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -1200 -1F00 -2080 -2080 -1F00 -ENDCHAR -STARTCHAR D4FE -ENCODING 54526 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR D4FF -ENCODING 54527 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -3E -7C -02 -3E -C1 -ENDCHAR -STARTCHAR D500 -ENCODING 54528 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -3F00 -0080 -3F80 -ENDCHAR -STARTCHAR D501 -ENCODING 54529 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -24 -24 -7F -00 -FF -24 -7E -7E -7E -ENDCHAR -STARTCHAR D502 -ENCODING 54530 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -1200 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR D503 -ENCODING 54531 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -1E -7F -1C -22 -3C -ENDCHAR -STARTCHAR D504 -ENCODING 54532 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -3F80 -1200 -1200 -1200 -1200 -7F80 -0000 -0000 -FFC0 -ENDCHAR -STARTCHAR D505 -ENCODING 54533 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D506 -ENCODING 54534 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -3F00 -0880 -0880 -0800 -ENDCHAR -STARTCHAR D507 -ENCODING 54535 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -7900 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR D508 -ENCODING 54536 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0000 -2000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D509 -ENCODING 54537 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -2380 -2100 -2280 -1800 -ENDCHAR -STARTCHAR D50A -ENCODING 54538 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR D50B -ENCODING 54539 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -3F00 -2000 -3F00 -ENDCHAR -STARTCHAR D50C -ENCODING 54540 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -3F80 -0000 -FFC0 -0000 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D50D -ENCODING 54541 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -7E -11 -71 -41 -71 -ENDCHAR -STARTCHAR D50E -ENCODING 54542 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -77 -19 -79 -89 -76 -ENDCHAR -STARTCHAR D50F -ENCODING 54543 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -79 -19 -7F -49 -76 -ENDCHAR -STARTCHAR D510 -ENCODING 54544 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -F2 -12 -72 -85 -68 -ENDCHAR -STARTCHAR D511 -ENCODING 54545 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -77 -18 -7F -48 -77 -ENDCHAR -STARTCHAR D512 -ENCODING 54546 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -FF -15 -F5 -85 -7F -ENDCHAR -STARTCHAR D513 -ENCODING 54547 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -F6 -1F -F6 -89 -76 -ENDCHAR -STARTCHAR D514 -ENCODING 54548 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0000 -3F00 -2080 -2080 -3F00 -ENDCHAR -STARTCHAR D515 -ENCODING 54549 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0000 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D516 -ENCODING 54550 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR D517 -ENCODING 54551 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3F00 -1200 -1200 -3F80 -0000 -FFC0 -0000 -0400 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR D518 -ENCODING 54552 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -1200 -1300 -2C80 -4000 -ENDCHAR -STARTCHAR D519 -ENCODING 54553 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -1F00 -2080 -2100 -1E00 -ENDCHAR -STARTCHAR D51A -ENCODING 54554 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -3F00 -0200 -3F80 -ENDCHAR -STARTCHAR D51B -ENCODING 54555 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -1C -7E -06 -3E -C1 -ENDCHAR -STARTCHAR D51C -ENCODING 54556 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -2 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -3F00 -3F80 -0080 -ENDCHAR -STARTCHAR D51D -ENCODING 54557 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -7E -24 -24 -7F -00 -FF -3E -40 -7E -7E -ENDCHAR -STARTCHAR D51E -ENCODING 54558 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -3F00 -1200 -3F00 -0000 -FFC0 -0000 -3F80 -1200 -3F00 -ENDCHAR -STARTCHAR D51F -ENCODING 54559 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -7E -24 -24 -7F -00 -FF -1C -7F -1C -22 -3C -ENDCHAR -STARTCHAR D520 -ENCODING 54560 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -FD -49 -49 -49 -FD -01 -FF -01 -01 -01 -ENDCHAR -STARTCHAR D521 -ENCODING 54561 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D522 -ENCODING 54562 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D523 -ENCODING 54563 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4900 -4900 -B100 -FD00 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D524 -ENCODING 54564 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -FD -05 -F9 -01 -40 -7F -ENDCHAR -STARTCHAR D525 -ENCODING 54565 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -47 -42 -45 -30 -ENDCHAR -STARTCHAR D526 -ENCODING 54566 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -06 -4F -46 -49 -36 -ENDCHAR -STARTCHAR D527 -ENCODING 54567 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -3F -40 -7E -ENDCHAR -STARTCHAR D528 -ENCODING 54568 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -7E -01 -7F -40 -3F -ENDCHAR -STARTCHAR D529 -ENCODING 54569 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR D52A -ENCODING 54570 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -00 -7F -79 -49 -76 -ENDCHAR -STARTCHAR D52B -ENCODING 54571 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -60 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D52C -ENCODING 54572 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -62 -12 -72 -85 -68 -ENDCHAR -STARTCHAR D52D -ENCODING 54573 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -62 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D52E -ENCODING 54574 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -62 -15 -75 -85 -7F -ENDCHAR -STARTCHAR D52F -ENCODING 54575 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -67 -1F -76 -49 -76 -ENDCHAR -STARTCHAR D530 -ENCODING 54576 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -7F -41 -7F -ENDCHAR -STARTCHAR D531 -ENCODING 54577 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -41 -7F -7F -ENDCHAR -STARTCHAR D532 -ENCODING 54578 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -52 -72 -55 -78 -ENDCHAR -STARTCHAR D533 -ENCODING 54579 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -08 -14 -63 -ENDCHAR -STARTCHAR D534 -ENCODING 54580 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D535 -ENCODING 54581 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -01 -3E -41 -63 -1C -ENDCHAR -STARTCHAR D536 -ENCODING 54582 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4900 -4900 -B100 -FD00 -0000 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D537 -ENCODING 54583 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -4900 -FD00 -0100 -FD00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D538 -ENCODING 54584 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -7F -3F -01 -01 -ENDCHAR -STARTCHAR D539 -ENCODING 54585 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -1E -20 -3F -20 -3F -ENDCHAR -STARTCHAR D53A -ENCODING 54586 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -49 -49 -B1 -FD -00 -7F -12 -3F -ENDCHAR -STARTCHAR D53B -ENCODING 54587 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -49 -FD -01 -FD -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D53C -ENCODING 54588 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -49 -49 -49 -49 -49 -49 -FD -01 -01 -01 -ENDCHAR -STARTCHAR D53D -ENCODING 54589 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -51 -51 -51 -FD -00 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D53E -ENCODING 54590 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -51 -F9 -00 -7F -09 -09 -09 -ENDCHAR -STARTCHAR D53F -ENCODING 54591 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5100 -5100 -5100 -F900 -0000 -7200 -1200 -1500 -0080 -ENDCHAR -STARTCHAR D540 -ENCODING 54592 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -51 -51 -51 -FD -01 -21 -20 -20 -3F -ENDCHAR -STARTCHAR D541 -ENCODING 54593 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -51 -F9 -07 -41 -42 -45 -30 -ENDCHAR -STARTCHAR D542 -ENCODING 54594 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -07 -4F -47 -49 -36 -ENDCHAR -STARTCHAR D543 -ENCODING 54595 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -51 -51 -51 -F9 -00 -7E -40 -7E -ENDCHAR -STARTCHAR D544 -ENCODING 54596 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -51 -51 -FD -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D545 -ENCODING 54597 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -77 -11 -71 -41 -71 -ENDCHAR -STARTCHAR D546 -ENCODING 54598 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D547 -ENCODING 54599 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -71 -15 -77 -45 -77 -ENDCHAR -STARTCHAR D548 -ENCODING 54600 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -72 -12 -72 -45 -70 -ENDCHAR -STARTCHAR D549 -ENCODING 54601 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -77 -14 -77 -44 -77 -ENDCHAR -STARTCHAR D54A -ENCODING 54602 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -62 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D54B -ENCODING 54603 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -77 -1F -77 -45 -72 -ENDCHAR -STARTCHAR D54C -ENCODING 54604 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -51 -51 -51 -FD -00 -3F -41 -41 -3F -ENDCHAR -STARTCHAR D54D -ENCODING 54605 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -51 -51 -51 -FD -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR D54E -ENCODING 54606 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5100 -5100 -5100 -F900 -0000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D54F -ENCODING 54607 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -51 -51 -51 -FD -01 -08 -0C -36 -41 -ENDCHAR -STARTCHAR D550 -ENCODING 54608 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5100 -5100 -5100 -F900 -0000 -2200 -3200 -5D00 -0080 -ENDCHAR -STARTCHAR D551 -ENCODING 54609 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -F9 -51 -51 -51 -51 -FD -01 -1E -21 -21 -1E -ENDCHAR -STARTCHAR D552 -ENCODING 54610 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5100 -5100 -5100 -F900 -0000 -3F00 -0600 -3B00 -0080 -ENDCHAR -STARTCHAR D553 -ENCODING 54611 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -0100 -F900 -5100 -5100 -5D00 -A100 -1C00 -3C00 -0200 -1E00 -6180 -ENDCHAR -STARTCHAR D554 -ENCODING 54612 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -51 -F9 -00 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D555 -ENCODING 54613 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -3F -20 -3F -20 -3F -ENDCHAR -STARTCHAR D556 -ENCODING 54614 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -51 -51 -51 -F9 -00 -3F -12 -3F -ENDCHAR -STARTCHAR D557 -ENCODING 54615 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -01 -F9 -51 -51 -5D -A1 -1C -7F -1E -22 -1E -ENDCHAR -STARTCHAR D558 -ENCODING 54616 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0100 -7180 -8900 -8900 -8900 -7100 -0100 -0100 -ENDCHAR -STARTCHAR D559 -ENCODING 54617 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0180 -7900 -8900 -7900 -0000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR D55A -ENCODING 54618 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7000 -0100 -FD00 -7180 -8900 -8900 -7000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR D55B -ENCODING 54619 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD00 -7180 -8900 -8900 -7000 -7200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR D55C -ENCODING 54620 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0100 -7180 -8900 -7100 -0100 -4000 -4000 -7F00 -ENDCHAR -STARTCHAR D55D -ENCODING 54621 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD00 -7180 -8900 -8900 -7000 -0F00 -4200 -4500 -2000 -ENDCHAR -STARTCHAR D55E -ENCODING 54622 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -7900 -0600 -8900 -8600 -8900 -7600 -ENDCHAR -STARTCHAR D55F -ENCODING 54623 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7000 -0100 -FD00 -7180 -8900 -8900 -7000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR D560 -ENCODING 54624 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD80 -8900 -7900 -0000 -7E00 -0100 -7E00 -4000 -7F00 -ENDCHAR -STARTCHAR D561 -ENCODING 54625 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -7900 -0000 -7700 -7100 -4100 -7100 -ENDCHAR -STARTCHAR D562 -ENCODING 54626 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -7900 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR D563 -ENCODING 54627 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -7900 -0000 -7900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR D564 -ENCODING 54628 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -7900 -0000 -7200 -7200 -4500 -7080 -ENDCHAR -STARTCHAR D565 -ENCODING 54629 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD80 -8900 -7900 -0000 -7700 -1800 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR D566 -ENCODING 54630 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -7900 -0000 -7F00 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR D567 -ENCODING 54631 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -7900 -0600 -7100 -7600 -4900 -7600 -ENDCHAR -STARTCHAR D568 -ENCODING 54632 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0180 -7900 -8900 -7900 -0000 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR D569 -ENCODING 54633 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -4980 -8900 -7900 -0000 -4100 -7E00 -4100 -7E00 -ENDCHAR -STARTCHAR D56A -ENCODING 54634 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD00 -7180 -8900 -8900 -7000 -0200 -7200 -5500 -7880 -ENDCHAR -STARTCHAR D56B -ENCODING 54635 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0100 -7980 -8900 -7900 -0100 -0800 -1400 -6300 -ENDCHAR -STARTCHAR D56C -ENCODING 54636 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD00 -7180 -8900 -8900 -7000 -2200 -2200 -5500 -0800 -ENDCHAR -STARTCHAR D56D -ENCODING 54637 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0180 -7900 -8900 -7900 -0000 -3E00 -4100 -3E00 -ENDCHAR -STARTCHAR D56E -ENCODING 54638 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD00 -7180 -8900 -8900 -7000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR D56F -ENCODING 54639 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -6800 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR D570 -ENCODING 54640 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7000 -0100 -FD00 -7180 -8900 -8900 -7000 -7E00 -0100 -3F00 -ENDCHAR -STARTCHAR D571 -ENCODING 54641 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -7900 -0000 -7F00 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR D572 -ENCODING 54642 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7000 -0100 -FD00 -7180 -8900 -8900 -7000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR D573 -ENCODING 54643 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F900 -7980 -8900 -6800 -1C00 -7F00 -1C00 -2200 -1E00 -ENDCHAR -STARTCHAR D574 -ENCODING 54644 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -0280 -FE80 -0280 -3B80 -4A80 -4A80 -3A80 -0280 -0280 -0280 -ENDCHAR -STARTCHAR D575 -ENCODING 54645 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -07 -75 -95 -75 -00 -7F -01 -01 -ENDCHAR -STARTCHAR D576 -ENCODING 54646 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -77 -95 -95 -61 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D577 -ENCODING 54647 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FD00 -7700 -9500 -9500 -6100 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR D578 -ENCODING 54648 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -FD00 -0500 -7700 -9500 -7500 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D579 -ENCODING 54649 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -77 -95 -95 -61 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D57A -ENCODING 54650 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -F7 -95 -F5 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D57B -ENCODING 54651 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FD -77 -95 -95 -61 -3F -40 -7F -ENDCHAR -STARTCHAR D57C -ENCODING 54652 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FF -95 -75 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D57D -ENCODING 54653 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -F7 -95 -F5 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR D57E -ENCODING 54654 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -F7 -95 -F5 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR D57F -ENCODING 54655 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -F7 -95 -F5 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D580 -ENCODING 54656 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -F7 -95 -F5 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR D581 -ENCODING 54657 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -F7 -95 -F5 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D582 -ENCODING 54658 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -F7 -95 -F5 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D583 -ENCODING 54659 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -F700 -9500 -F500 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR D584 -ENCODING 54660 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -07 -75 -95 -75 -00 -3F -41 -3F -ENDCHAR -STARTCHAR D585 -ENCODING 54661 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -97 -95 -75 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR D586 -ENCODING 54662 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FD00 -7700 -9500 -9500 -6100 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D587 -ENCODING 54663 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -FD00 -0700 -7500 -9500 -7100 -0800 -0C00 -1200 -6180 -ENDCHAR -STARTCHAR D588 -ENCODING 54664 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -FD00 -0700 -7500 -9500 -7500 -0000 -1200 -3300 -4C80 -ENDCHAR -STARTCHAR D589 -ENCODING 54665 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -07 -75 -95 -75 -00 -3E -41 -3E -ENDCHAR -STARTCHAR D58A -ENCODING 54666 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FD00 -7700 -9500 -9500 -6100 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR D58B -ENCODING 54667 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -F700 -9500 -F500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D58C -ENCODING 54668 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -77 -95 -95 -61 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D58D -ENCODING 54669 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -F7 -95 -F5 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D58E -ENCODING 54670 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FD -77 -95 -95 -61 -3F -12 -3F -ENDCHAR -STARTCHAR D58F -ENCODING 54671 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -F7 -95 -F5 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D590 -ENCODING 54672 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0180 -7100 -8900 -8980 -8900 -7100 -0100 -0100 -ENDCHAR -STARTCHAR D591 -ENCODING 54673 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -7E00 -0100 -0100 -ENDCHAR -STARTCHAR D592 -ENCODING 54674 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -7E00 -1100 -1100 -ENDCHAR -STARTCHAR D593 -ENCODING 54675 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -7200 -1200 -1500 -1880 -ENDCHAR -STARTCHAR D594 -ENCODING 54676 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 0 -BITMAP -7100 -FD80 -3100 -4900 -8980 -5900 -2000 -4000 -7E00 -ENDCHAR -STARTCHAR D595 -ENCODING 54677 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -0F00 -4200 -4500 -2000 -ENDCHAR -STARTCHAR D596 -ENCODING 54678 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0600 -8900 -8600 -8900 -7600 -ENDCHAR -STARTCHAR D597 -ENCODING 54679 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -7F00 -4000 -7E00 -ENDCHAR -STARTCHAR D598 -ENCODING 54680 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0000 -3F00 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR D599 -ENCODING 54681 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0000 -7700 -7100 -4100 -7100 -ENDCHAR -STARTCHAR D59A -ENCODING 54682 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR D59B -ENCODING 54683 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0000 -7900 -7E00 -8900 -7E00 -ENDCHAR -STARTCHAR D59C -ENCODING 54684 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0000 -7200 -7200 -4500 -7080 -ENDCHAR -STARTCHAR D59D -ENCODING 54685 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0000 -7E00 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR D59E -ENCODING 54686 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0000 -7F00 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR D59F -ENCODING 54687 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0600 -7100 -7600 -4900 -7600 -ENDCHAR -STARTCHAR D5A0 -ENCODING 54688 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -7E00 -4100 -7F00 -ENDCHAR -STARTCHAR D5A1 -ENCODING 54689 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -4100 -7E00 -7F00 -ENDCHAR -STARTCHAR D5A2 -ENCODING 54690 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -0200 -7200 -5500 -7880 -ENDCHAR -STARTCHAR D5A3 -ENCODING 54691 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -0800 -1400 -6300 -ENDCHAR -STARTCHAR D5A4 -ENCODING 54692 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -2200 -2200 -5500 -0800 -ENDCHAR -STARTCHAR D5A5 -ENCODING 54693 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD80 -0100 -7980 -8900 -7900 -0000 -3E00 -4100 -3E00 -ENDCHAR -STARTCHAR D5A6 -ENCODING 54694 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -3E00 -0600 -3F00 -4000 -ENDCHAR -STARTCHAR D5A7 -ENCODING 54695 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -6800 -1C00 -3C00 -0200 -1E00 -6100 -ENDCHAR -STARTCHAR D5A8 -ENCODING 54696 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -7E00 -0100 -3F00 -ENDCHAR -STARTCHAR D5A9 -ENCODING 54697 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -7900 -0000 -7F00 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR D5AA -ENCODING 54698 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -7000 -0100 -FD80 -7100 -8980 -8900 -7000 -7F00 -2200 -7F00 -ENDCHAR -STARTCHAR D5AB -ENCODING 54699 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -0100 -F980 -7900 -8980 -6800 -1C00 -7F00 -1C00 -2200 -1E00 -ENDCHAR -STARTCHAR D5AC -ENCODING 54700 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -2 -BITMAP -01 -75 -05 -F7 -65 -95 -97 -95 -65 -05 -ENDCHAR -STARTCHAR D5AD -ENCODING 54701 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FF -75 -97 -95 -61 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D5AE -ENCODING 54702 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FF -75 -97 -95 -61 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D5AF -ENCODING 54703 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FF00 -7500 -9700 -9500 -6100 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR D5B0 -ENCODING 54704 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -65 -FD -67 -95 -97 -75 -05 -40 -7F -ENDCHAR -STARTCHAR D5B1 -ENCODING 54705 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FF -75 -97 -95 -61 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D5B2 -ENCODING 54706 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D5B3 -ENCODING 54707 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FF -75 -97 -95 -61 -3F -40 -7F -ENDCHAR -STARTCHAR D5B4 -ENCODING 54708 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -3E -01 -3F -40 -3F -ENDCHAR -STARTCHAR D5B5 -ENCODING 54709 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR D5B6 -ENCODING 54710 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR D5B7 -ENCODING 54711 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D5B8 -ENCODING 54712 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR D5B9 -ENCODING 54713 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D5BA -ENCODING 54714 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D5BB -ENCODING 54715 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F700 -F500 -9700 -F500 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR D5BC -ENCODING 54716 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FF -75 -97 -95 -61 -3F -41 -7F -ENDCHAR -STARTCHAR D5BD -ENCODING 54717 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FF -75 -97 -95 -61 -21 -3F -3F -ENDCHAR -STARTCHAR D5BE -ENCODING 54718 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FF00 -7500 -9700 -9500 -6100 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D5BF -ENCODING 54719 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FF -75 -97 -95 -61 -08 -1C -63 -ENDCHAR -STARTCHAR D5C0 -ENCODING 54720 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -6100 -0500 -FF00 -7500 -9700 -9500 -6100 -1200 -3200 -6D80 -ENDCHAR -STARTCHAR D5C1 -ENCODING 54721 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FF -75 -97 -95 -61 -3E -41 -21 -1E -ENDCHAR -STARTCHAR D5C2 -ENCODING 54722 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FF00 -7500 -9700 -9500 -6100 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR D5C3 -ENCODING 54723 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F700 -F500 -9700 -F500 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D5C4 -ENCODING 54724 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FF -75 -97 -95 -61 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D5C5 -ENCODING 54725 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D5C6 -ENCODING 54726 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FF -75 -97 -95 -61 -3F -12 -3F -ENDCHAR -STARTCHAR D5C7 -ENCODING 54727 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F7 -F5 -97 -F5 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D5C8 -ENCODING 54728 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -71 -8F -89 -89 -71 -01 -01 -ENDCHAR -STARTCHAR D5C9 -ENCODING 54729 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -7F -89 -79 -00 -7F -01 -01 -ENDCHAR -STARTCHAR D5CA -ENCODING 54730 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -49 -31 -77 -09 -09 -09 -ENDCHAR -STARTCHAR D5CB -ENCODING 54731 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -49 -31 -72 -12 -15 -10 -ENDCHAR -STARTCHAR D5CC -ENCODING 54732 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -7F -89 -79 -01 -20 -20 -3F -ENDCHAR -STARTCHAR D5CD -ENCODING 54733 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -49 -31 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D5CE -ENCODING 54734 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7F -89 -79 -06 -41 -46 -49 -36 -ENDCHAR -STARTCHAR D5CF -ENCODING 54735 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -FD -73 -89 -49 -31 -3F -40 -7E -ENDCHAR -STARTCHAR D5D0 -ENCODING 54736 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -8F -79 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D5D1 -ENCODING 54737 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7F -89 -79 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR D5D2 -ENCODING 54738 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -8F -79 -00 -77 -15 -75 -45 -77 -ENDCHAR -STARTCHAR D5D3 -ENCODING 54739 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7F -89 -79 -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D5D4 -ENCODING 54740 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7F -89 -79 -00 -72 -72 -45 -70 -ENDCHAR -STARTCHAR D5D5 -ENCODING 54741 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7F -89 -79 -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D5D6 -ENCODING 54742 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7F -89 -79 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D5D7 -ENCODING 54743 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7F -89 -79 -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR D5D8 -ENCODING 54744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -7F -89 -79 -00 -3F -41 -3F -ENDCHAR -STARTCHAR D5D9 -ENCODING 54745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -4F -89 -79 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR D5DA -ENCODING 54746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -49 -31 -12 -72 -55 -70 -ENDCHAR -STARTCHAR D5DB -ENCODING 54747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0100 -7F00 -8900 -7900 -0100 -0800 -1600 -6180 -ENDCHAR -STARTCHAR D5DC -ENCODING 54748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -49 -31 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D5DD -ENCODING 54749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -7F -89 -79 -00 -3E -41 -3E -ENDCHAR -STARTCHAR D5DE -ENCODING 54750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -0100 -FD00 -7300 -8900 -4900 -3100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D5DF -ENCODING 54751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -7F00 -8900 -6900 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D5E0 -ENCODING 54752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -49 -31 -7F -3F -01 -01 -ENDCHAR -STARTCHAR D5E1 -ENCODING 54753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7F -89 -79 -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D5E2 -ENCODING 54754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -FD -73 -89 -49 -31 -7F -12 -3F -ENDCHAR -STARTCHAR D5E3 -ENCODING 54755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7F -89 -69 -1C -33 -0C -32 -1E -ENDCHAR -STARTCHAR D5E4 -ENCODING 54756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -0280 -FE80 -0280 -3A80 -4E80 -4A80 -4A80 -3A80 -0280 -0280 -ENDCHAR -STARTCHAR D5E5 -ENCODING 54757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -05 -7D -95 -75 -00 -7F -01 -01 -ENDCHAR -STARTCHAR D5E6 -ENCODING 54758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -75 -95 -95 -60 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D5E7 -ENCODING 54759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FD00 -7500 -9500 -9500 -6000 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR D5E8 -ENCODING 54760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -FD00 -0500 -7D00 -9500 -7500 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D5E9 -ENCODING 54761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -75 -95 -95 -60 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D5EA -ENCODING 54762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D5EB -ENCODING 54763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FD -75 -95 -95 -60 -3F -40 -7F -ENDCHAR -STARTCHAR D5EC -ENCODING 54764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -8D -75 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D5ED -ENCODING 54765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR D5EE -ENCODING 54766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR D5EF -ENCODING 54767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D5F0 -ENCODING 54768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR D5F1 -ENCODING 54769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D5F2 -ENCODING 54770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D5F3 -ENCODING 54771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -FD00 -9500 -F100 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR D5F4 -ENCODING 54772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -05 -7D -95 -75 -00 -3F -41 -3F -ENDCHAR -STARTCHAR D5F5 -ENCODING 54773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -9D -95 -75 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR D5F6 -ENCODING 54774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FD00 -7500 -9500 -9500 -6000 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D5F7 -ENCODING 54775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -FD00 -0500 -7D00 -9500 -7500 -0900 -0C00 -3200 -4180 -ENDCHAR -STARTCHAR D5F8 -ENCODING 54776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -6100 -0500 -FD00 -7500 -9500 -9500 -6000 -1200 -3200 -6D80 -ENDCHAR -STARTCHAR D5F9 -ENCODING 54777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -05 -7D -95 -75 -00 -3F -41 -3E -ENDCHAR -STARTCHAR D5FA -ENCODING 54778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FD00 -7500 -9500 -9500 -6000 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR D5FB -ENCODING 54779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -FD00 -9500 -F100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D5FC -ENCODING 54780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -75 -95 -95 -60 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D5FD -ENCODING 54781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D5FE -ENCODING 54782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FD -75 -95 -95 -60 -3F -12 -3F -ENDCHAR -STARTCHAR D5FF -ENCODING 54783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D600 -ENCODING 54784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -77 -89 -8F -89 -71 -01 -01 -ENDCHAR -STARTCHAR D601 -ENCODING 54785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -03 -79 -8B -79 -00 -7F -01 -01 -ENDCHAR -STARTCHAR D602 -ENCODING 54786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -4B -31 -77 -09 -09 -09 -ENDCHAR -STARTCHAR D603 -ENCODING 54787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -4B -31 -72 -12 -15 -10 -ENDCHAR -STARTCHAR D604 -ENCODING 54788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -7B -89 -7B -01 -20 -20 -3F -ENDCHAR -STARTCHAR D605 -ENCODING 54789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -4B -31 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D606 -ENCODING 54790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -7B -06 -41 -46 -49 -36 -ENDCHAR -STARTCHAR D607 -ENCODING 54791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -FD -73 -89 -4B -31 -3F -40 -7E -ENDCHAR -STARTCHAR D608 -ENCODING 54792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FF -89 -7B -01 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D609 -ENCODING 54793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -7B -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR D60A -ENCODING 54794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -7B -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D60B -ENCODING 54795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -7B -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D60C -ENCODING 54796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -7B -00 -72 -72 -45 -70 -ENDCHAR -STARTCHAR D60D -ENCODING 54797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -7B -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D60E -ENCODING 54798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -7B -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D60F -ENCODING 54799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -7B -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR D610 -ENCODING 54800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -03 -79 -8B -79 -00 -3F -41 -3F -ENDCHAR -STARTCHAR D611 -ENCODING 54801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -4B -89 -7B -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR D612 -ENCODING 54802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -4B -31 -12 -72 -55 -70 -ENDCHAR -STARTCHAR D613 -ENCODING 54803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0300 -7900 -8B00 -7900 -0100 -0800 -1600 -6180 -ENDCHAR -STARTCHAR D614 -ENCODING 54804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0300 -7900 -8B00 -7900 -0000 -1200 -3300 -4C80 -ENDCHAR -STARTCHAR D615 -ENCODING 54805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -03 -79 -8B -79 -00 -3E -41 -3E -ENDCHAR -STARTCHAR D616 -ENCODING 54806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -0100 -FD00 -7300 -8900 -4B00 -3100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D617 -ENCODING 54807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -7B00 -8900 -6B00 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D618 -ENCODING 54808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -73 -89 -4B -31 -7F -3F -01 -01 -ENDCHAR -STARTCHAR D619 -ENCODING 54809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -7B -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D61A -ENCODING 54810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -FD -73 -89 -4B -31 -7F -12 -3F -ENDCHAR -STARTCHAR D61B -ENCODING 54811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -7B -89 -6B -1C -33 -0C -32 -1E -ENDCHAR -STARTCHAR D61C -ENCODING 54812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3A80 -0280 -FE80 -0280 -3680 -4A80 -4E80 -4A80 -3280 -0280 -0280 -ENDCHAR -STARTCHAR D61D -ENCODING 54813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -7D -95 -95 -61 -7F -01 -01 -01 -ENDCHAR -STARTCHAR D61E -ENCODING 54814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -7D -95 -95 -61 -3F -09 -09 -09 -ENDCHAR -STARTCHAR D61F -ENCODING 54815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FD00 -7D00 -9500 -9500 -6100 -7200 -0A00 -0D00 -0080 -ENDCHAR -STARTCHAR D620 -ENCODING 54816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6500 -0500 -FD00 -0D00 -7500 -9D00 -7500 -0500 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D621 -ENCODING 54817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -7D -95 -95 -61 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D622 -ENCODING 54818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -07 -4F -47 -45 -36 -ENDCHAR -STARTCHAR D623 -ENCODING 54819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FD -7D -95 -95 -61 -3F -40 -7F -ENDCHAR -STARTCHAR D624 -ENCODING 54820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -95 -75 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D625 -ENCODING 54821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -36 -09 -39 -41 -38 -ENDCHAR -STARTCHAR D626 -ENCODING 54822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -00 -3F -75 -45 -37 -ENDCHAR -STARTCHAR D627 -ENCODING 54823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -30 -0D -77 -45 -37 -ENDCHAR -STARTCHAR D628 -ENCODING 54824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -62 -12 -72 -45 -78 -ENDCHAR -STARTCHAR D629 -ENCODING 54825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -33 -0C -77 -44 -37 -ENDCHAR -STARTCHAR D62A -ENCODING 54826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D62B -ENCODING 54827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -FD00 -9500 -F100 -6700 -1F80 -7700 -4500 -7300 -ENDCHAR -STARTCHAR D62C -ENCODING 54828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FD -7D -95 -95 -61 -3F -41 -7F -ENDCHAR -STARTCHAR D62D -ENCODING 54829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -65 -05 -FD -9D -95 -75 -00 -21 -3F -21 -3F -ENDCHAR -STARTCHAR D62E -ENCODING 54830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FD00 -7D00 -9500 -9500 -6100 -5200 -7200 -5500 -7080 -ENDCHAR -STARTCHAR D62F -ENCODING 54831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FD -7D -95 -9D -61 -08 -1C -63 -ENDCHAR -STARTCHAR D630 -ENCODING 54832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -6100 -0500 -FD00 -7D00 -9500 -9500 -6100 -1200 -3200 -6D80 -ENDCHAR -STARTCHAR D631 -ENCODING 54833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -7D -95 -9D -61 -3E -41 -21 -1E -ENDCHAR -STARTCHAR D632 -ENCODING 54834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -FD00 -7D00 -9500 -9500 -6100 -3F00 -0200 -1F80 -2000 -ENDCHAR -STARTCHAR D633 -ENCODING 54835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -FD00 -9500 -F100 -1C00 -3F00 -0200 -1F00 -6080 -ENDCHAR -STARTCHAR D634 -ENCODING 54836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -FD -7D -95 -95 -61 -3F -3F -01 -01 -ENDCHAR -STARTCHAR D635 -ENCODING 54837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -3F -40 -3F -40 -3F -ENDCHAR -STARTCHAR D636 -ENCODING 54838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -61 -05 -FD -7D -95 -95 -61 -3F -12 -3F -ENDCHAR -STARTCHAR D637 -ENCODING 54839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -FD -95 -F1 -1C -23 -1C -22 -1E -ENDCHAR -STARTCHAR D638 -ENCODING 54840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -0E00 -0000 -7F80 -0000 -1E00 -2100 -1E00 -0400 -FFC0 -ENDCHAR -STARTCHAR D639 -ENCODING 54841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1F00 -0400 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D63A -ENCODING 54842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -0000 -3B80 -0880 -0800 -ENDCHAR -STARTCHAR D63B -ENCODING 54843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3000 -0900 -0B80 -0C00 -ENDCHAR -STARTCHAR D63C -ENCODING 54844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0400 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D63D -ENCODING 54845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -0300 -2100 -2280 -1000 -ENDCHAR -STARTCHAR D63E -ENCODING 54846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -08 -F7 -06 -8F -89 -76 -ENDCHAR -STARTCHAR D63F -ENCODING 54847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1F00 -2000 -3F00 -ENDCHAR -STARTCHAR D640 -ENCODING 54848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1F00 -0400 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D641 -ENCODING 54849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -08 -F7 -7F -71 -41 -71 -ENDCHAR -STARTCHAR D642 -ENCODING 54850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -08 -F7 -7F -79 -89 -76 -ENDCHAR -STARTCHAR D643 -ENCODING 54851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -08 -F7 -79 -7F -49 -76 -ENDCHAR -STARTCHAR D644 -ENCODING 54852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -08 -F7 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR D645 -ENCODING 54853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0400 -FFC0 -0C00 -3F80 -4400 -3F80 -ENDCHAR -STARTCHAR D646 -ENCODING 54854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -08 -F7 -FF -75 -85 -7F -ENDCHAR -STARTCHAR D647 -ENCODING 54855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -08 -F7 -76 -77 -89 -76 -ENDCHAR -STARTCHAR D648 -ENCODING 54856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0400 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D649 -ENCODING 54857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0400 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D64A -ENCODING 54858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR D64B -ENCODING 54859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0400 -FFC0 -0000 -0400 -1E00 -6180 -ENDCHAR -STARTCHAR D64C -ENCODING 54860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR D64D -ENCODING 54861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0400 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D64E -ENCODING 54862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3E00 -0100 -1F80 -2000 -ENDCHAR -STARTCHAR D64F -ENCODING 54863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -08 -FF -00 -7E -3C -C3 -ENDCHAR -STARTCHAR D650 -ENCODING 54864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3F00 -0080 -3F00 -ENDCHAR -STARTCHAR D651 -ENCODING 54865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0400 -FFC0 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D652 -ENCODING 54866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -0000 -3F00 -3F00 -ENDCHAR -STARTCHAR D653 -ENCODING 54867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -08 -F7 -1C -7F -24 -3C -ENDCHAR -STARTCHAR D654 -ENCODING 54868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7E80 -0080 -3880 -44C0 -3C80 -1080 -FE80 -0080 -0080 -ENDCHAR -STARTCHAR D655 -ENCODING 54869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7E80 -4480 -3CC0 -1080 -FE80 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D656 -ENCODING 54870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -3300 -0880 -0880 -ENDCHAR -STARTCHAR D657 -ENCODING 54871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -7100 -0900 -0A80 -0C40 -ENDCHAR -STARTCHAR D658 -ENCODING 54872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7E80 -4480 -3CC0 -1080 -FE80 -0080 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D659 -ENCODING 54873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -0780 -2100 -2280 -1800 -ENDCHAR -STARTCHAR D65A -ENCODING 54874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0600 -8900 -8600 -8900 -7600 -ENDCHAR -STARTCHAR D65B -ENCODING 54875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -1F00 -2000 -3F00 -ENDCHAR -STARTCHAR D65C -ENCODING 54876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7E80 -44C0 -3C80 -1000 -FF00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D65D -ENCODING 54877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0000 -7F00 -7100 -4100 -7100 -ENDCHAR -STARTCHAR D65E -ENCODING 54878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0000 -7F00 -7900 -8900 -7600 -ENDCHAR -STARTCHAR D65F -ENCODING 54879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0000 -7900 -7E00 -8900 -7600 -ENDCHAR -STARTCHAR D660 -ENCODING 54880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0000 -7200 -7200 -8500 -7800 -ENDCHAR -STARTCHAR D661 -ENCODING 54881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0000 -7700 -7F00 -4800 -7700 -ENDCHAR -STARTCHAR D662 -ENCODING 54882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0000 -7F00 -7500 -8500 -7F00 -ENDCHAR -STARTCHAR D663 -ENCODING 54883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0000 -7700 -7600 -4900 -7600 -ENDCHAR -STARTCHAR D664 -ENCODING 54884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -1F00 -2080 -3F80 -ENDCHAR -STARTCHAR D665 -ENCODING 54885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -2000 -3F00 -3F80 -ENDCHAR -STARTCHAR D666 -ENCODING 54886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -0900 -3900 -2A80 -3C40 -ENDCHAR -STARTCHAR D667 -ENCODING 54887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7E80 -4480 -3CC0 -1080 -FE80 -0080 -0400 -0A00 -31C0 -ENDCHAR -STARTCHAR D668 -ENCODING 54888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -1100 -1100 -2A80 -4400 -ENDCHAR -STARTCHAR D669 -ENCODING 54889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3880 -0080 -7E80 -4480 -3CC0 -1080 -FE80 -0080 -1F00 -2080 -1F00 -ENDCHAR -STARTCHAR D66A -ENCODING 54890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -1F00 -0100 -1F80 -2000 -ENDCHAR -STARTCHAR D66B -ENCODING 54891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -F500 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D66C -ENCODING 54892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -3F00 -0080 -1F80 -ENDCHAR -STARTCHAR D66D -ENCODING 54893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0000 -7E00 -7E00 -4000 -3F00 -ENDCHAR -STARTCHAR D66E -ENCODING 54894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -1800 -0080 -7C80 -3C80 -64C0 -1880 -FE80 -0E00 -1100 -3F80 -ENDCHAR -STARTCHAR D66F -ENCODING 54895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7000 -C900 -3100 -C980 -7900 -FD00 -0000 -1C00 -7F00 -3200 -1E00 -ENDCHAR -STARTCHAR D670 -ENCODING 54896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -7A80 -0280 -7A80 -4B80 -7A80 -1280 -FE80 -0280 -0280 -ENDCHAR -STARTCHAR D671 -ENCODING 54897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -7E80 -4B80 -3A80 -1280 -FE80 -0000 -3F80 -0080 -0080 -ENDCHAR -STARTCHAR D672 -ENCODING 54898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -1900 -0480 -0480 -0480 -ENDCHAR -STARTCHAR D673 -ENCODING 54899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -3900 -0900 -0A80 -0040 -ENDCHAR -STARTCHAR D674 -ENCODING 54900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3280 -0280 -7E80 -4A80 -3B80 -1280 -FE80 -0280 -2000 -2000 -1FC0 -ENDCHAR -STARTCHAR D675 -ENCODING 54901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -2380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR D676 -ENCODING 54902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -42 -47 -45 -32 -ENDCHAR -STARTCHAR D677 -ENCODING 54903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -1F80 -2000 -3F80 -ENDCHAR -STARTCHAR D678 -ENCODING 54904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -7F -3F -40 -3F -ENDCHAR -STARTCHAR D679 -ENCODING 54905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -7F -39 -41 -38 -ENDCHAR -STARTCHAR D67A -ENCODING 54906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -77 -3D -45 -37 -ENDCHAR -STARTCHAR D67B -ENCODING 54907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -75 -3F -45 -37 -ENDCHAR -STARTCHAR D67C -ENCODING 54908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -9700 -D500 -2500 -D100 -7200 -3200 -4500 -7080 -ENDCHAR -STARTCHAR D67D -ENCODING 54909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -77 -3F -44 -37 -ENDCHAR -STARTCHAR D67E -ENCODING 54910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -77 -35 -45 -77 -ENDCHAR -STARTCHAR D67F -ENCODING 54911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -72 -37 -45 -72 -ENDCHAR -STARTCHAR D680 -ENCODING 54912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -1F00 -2080 -3F80 -ENDCHAR -STARTCHAR D681 -ENCODING 54913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -2080 -3F80 -3F80 -ENDCHAR -STARTCHAR D682 -ENCODING 54914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -0100 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR D683 -ENCODING 54915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -7E80 -4A80 -3B80 -1280 -FE80 -0080 -0400 -0A00 -3180 -ENDCHAR -STARTCHAR D684 -ENCODING 54916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -0100 -1100 -2A80 -0400 -ENDCHAR -STARTCHAR D685 -ENCODING 54917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -7E80 -4B80 -3A80 -1280 -FE80 -0000 -1F80 -2080 -1F00 -ENDCHAR -STARTCHAR D686 -ENCODING 54918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -1F80 -0100 -0F80 -1040 -ENDCHAR -STARTCHAR D687 -ENCODING 54919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -6100 -0500 -F500 -9700 -D500 -2500 -D100 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D688 -ENCODING 54920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -1F80 -0080 -1F80 -0080 -ENDCHAR -STARTCHAR D689 -ENCODING 54921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -3F -7F -40 -3F -ENDCHAR -STARTCHAR D68A -ENCODING 54922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -3080 -0280 -7A80 -7B80 -4A80 -3280 -FE80 -1F80 -0900 -1F80 -ENDCHAR -STARTCHAR D68B -ENCODING 54923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -61 -05 -F5 -97 -D5 -25 -D1 -1C -7F -32 -1E -ENDCHAR -STARTCHAR D68C -ENCODING 54924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -0080 -7E80 -0080 -3C80 -4480 -3C80 -1080 -FF80 -0080 -0080 -ENDCHAR -STARTCHAR D68D -ENCODING 54925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -21 -FF -00 -7F -01 -01 -ENDCHAR -STARTCHAR D68E -ENCODING 54926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FF -36 -09 -09 -09 -ENDCHAR -STARTCHAR D68F -ENCODING 54927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FF -62 -12 -15 -10 -ENDCHAR -STARTCHAR D690 -ENCODING 54928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -21 -FF -01 -40 -40 -7F -ENDCHAR -STARTCHAR D691 -ENCODING 54929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FF -47 -41 -47 -30 -ENDCHAR -STARTCHAR D692 -ENCODING 54930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -FD -00 -46 -4F -49 -36 -ENDCHAR -STARTCHAR D693 -ENCODING 54931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -F9 -79 -C9 -31 -FF -3E -40 -7E -ENDCHAR -STARTCHAR D694 -ENCODING 54932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -20 -FF -01 -7F -40 -7F -ENDCHAR -STARTCHAR D695 -ENCODING 54933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -FD -00 -77 -31 -41 -71 -ENDCHAR -STARTCHAR D696 -ENCODING 54934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -FD -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D697 -ENCODING 54935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -FD -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D698 -ENCODING 54936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -FD -00 -72 -72 -85 -68 -ENDCHAR -STARTCHAR D699 -ENCODING 54937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -FD -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D69A -ENCODING 54938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -FD -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D69B -ENCODING 54939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -FD -00 -77 -37 -49 -76 -ENDCHAR -STARTCHAR D69C -ENCODING 54940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FF -00 -7F -41 -3E -ENDCHAR -STARTCHAR D69D -ENCODING 54941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -21 -FE -41 -7F -41 -7F -ENDCHAR -STARTCHAR D69E -ENCODING 54942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FF -12 -72 -55 -78 -ENDCHAR -STARTCHAR D69F -ENCODING 54943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -0100 -FD00 -8900 -7900 -2100 -FF00 -0100 -0800 -1600 -6180 -ENDCHAR -STARTCHAR D6A0 -ENCODING 54944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FF -22 -22 -55 -08 -ENDCHAR -STARTCHAR D6A1 -ENCODING 54945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -21 -FF -01 -3E -41 -3E -ENDCHAR -STARTCHAR D6A2 -ENCODING 54946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -0100 -F900 -7900 -C900 -3100 -FF00 -3C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D6A3 -ENCODING 54947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -C900 -3100 -C900 -7900 -F500 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D6A4 -ENCODING 54948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FF -3E -01 -3F -01 -ENDCHAR -STARTCHAR D6A5 -ENCODING 54949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -FD -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D6A6 -ENCODING 54950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -F9 -79 -C9 -31 -FF -2D -12 -3F -ENDCHAR -STARTCHAR D6A7 -ENCODING 54951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -F5 -0C -33 -0C -32 -1E -ENDCHAR -STARTCHAR D6A8 -ENCODING 54952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -0E00 -0000 -7F80 -0000 -1E00 -2100 -1E00 -1100 -FFC0 -ENDCHAR -STARTCHAR D6A9 -ENCODING 54953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D6AA -ENCODING 54954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -0000 -3B80 -0880 -0800 -ENDCHAR -STARTCHAR D6AB -ENCODING 54955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -3000 -0900 -0B80 -0C00 -ENDCHAR -STARTCHAR D6AC -ENCODING 54956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -1200 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D6AD -ENCODING 54957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -0300 -2100 -2280 -1000 -ENDCHAR -STARTCHAR D6AE -ENCODING 54958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -06 -8F -89 -76 -ENDCHAR -STARTCHAR D6AF -ENCODING 54959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -1F00 -2000 -3F00 -ENDCHAR -STARTCHAR D6B0 -ENCODING 54960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -1200 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D6B1 -ENCODING 54961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -7F -71 -41 -71 -ENDCHAR -STARTCHAR D6B2 -ENCODING 54962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -7F -79 -89 -76 -ENDCHAR -STARTCHAR D6B3 -ENCODING 54963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -79 -7F -49 -76 -ENDCHAR -STARTCHAR D6B4 -ENCODING 54964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR D6B5 -ENCODING 54965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -7F -7E -88 -77 -ENDCHAR -STARTCHAR D6B6 -ENCODING 54966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -FF -75 -85 -7F -ENDCHAR -STARTCHAR D6B7 -ENCODING 54967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -76 -77 -89 -76 -ENDCHAR -STARTCHAR D6B8 -ENCODING 54968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -1F00 -2080 -3F80 -ENDCHAR -STARTCHAR D6B9 -ENCODING 54969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -1200 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D6BA -ENCODING 54970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR D6BB -ENCODING 54971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -1200 -FFC0 -0000 -0400 -1E00 -6180 -ENDCHAR -STARTCHAR D6BC -ENCODING 54972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR D6BD -ENCODING 54973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -1E00 -2100 -2180 -1E00 -ENDCHAR -STARTCHAR D6BE -ENCODING 54974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -3E00 -0100 -1F80 -2000 -ENDCHAR -STARTCHAR D6BF -ENCODING 54975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -E7 -18 -00 -7E -3C -C3 -ENDCHAR -STARTCHAR D6C0 -ENCODING 54976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -3F00 -0080 -3F00 -ENDCHAR -STARTCHAR D6C1 -ENCODING 54977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -1C -FF -3C -42 -3E -FF -00 -7E -7E -7E -ENDCHAR -STARTCHAR D6C2 -ENCODING 54978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -2100 -1E00 -FFC0 -0000 -3F00 -3F00 -ENDCHAR -STARTCHAR D6C3 -ENCODING 54979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -1C -7F -24 -3C -ENDCHAR -STARTCHAR D6C4 -ENCODING 54980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -0000 -7F80 -1100 -2100 -1E00 -0000 -FFC0 -0400 -0400 -ENDCHAR -STARTCHAR D6C5 -ENCODING 54981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0400 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D6C6 -ENCODING 54982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -0400 -3B80 -0880 -0800 -ENDCHAR -STARTCHAR D6C7 -ENCODING 54983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3400 -0900 -0B80 -0C00 -ENDCHAR -STARTCHAR D6C8 -ENCODING 54984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0400 -2400 -2000 -3F80 -ENDCHAR -STARTCHAR D6C9 -ENCODING 54985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -0700 -2100 -2280 -1000 -ENDCHAR -STARTCHAR D6CA -ENCODING 54986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -63 -1C -62 -3E -F7 -08 -06 -8F -89 -76 -ENDCHAR -STARTCHAR D6CB -ENCODING 54987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1F00 -2000 -3F00 -ENDCHAR -STARTCHAR D6CC -ENCODING 54988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 12 0 -3 -BITMAP -0E00 -0000 -7F80 -3300 -0C00 -FFC0 -0400 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D6CD -ENCODING 54989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -63 -1C -62 -3E -F7 -08 -7F -71 -41 -71 -ENDCHAR -STARTCHAR D6CE -ENCODING 54990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -63 -1C -62 -3E -F7 -08 -7F -79 -89 -76 -ENDCHAR -STARTCHAR D6CF -ENCODING 54991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -63 -1C -62 -3E -F7 -08 -79 -7F -49 -76 -ENDCHAR -STARTCHAR D6D0 -ENCODING 54992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -63 -1C -62 -3E -F7 -08 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR D6D1 -ENCODING 54993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 12 0 -3 -BITMAP -0E00 -0000 -7F80 -3300 -0C00 -FFC0 -0400 -3F80 -0C00 -3F80 -4400 -3F80 -ENDCHAR -STARTCHAR D6D2 -ENCODING 54994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -63 -1C -62 -3E -F7 -08 -FF -75 -85 -7F -ENDCHAR -STARTCHAR D6D3 -ENCODING 54995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -63 -1C -62 -3E -F7 -08 -76 -77 -89 -76 -ENDCHAR -STARTCHAR D6D4 -ENCODING 54996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0400 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D6D5 -ENCODING 54997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -2400 -3F00 -3F80 -ENDCHAR -STARTCHAR D6D6 -ENCODING 54998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -4D00 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR D6D7 -ENCODING 54999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0400 -0C00 -1A00 -6180 -ENDCHAR -STARTCHAR D6D8 -ENCODING 55000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1400 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR D6D9 -ENCODING 55001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0400 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D6DA -ENCODING 55002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3E00 -0100 -1F80 -2000 -ENDCHAR -STARTCHAR D6DB -ENCODING 55003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -0C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D6DC -ENCODING 55004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3F00 -0080 -3F00 -ENDCHAR -STARTCHAR D6DD -ENCODING 55005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -1C -63 -1C -62 -3E -F7 -08 -7E -7E -7E -ENDCHAR -STARTCHAR D6DE -ENCODING 55006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -0400 -3B00 -3F00 -ENDCHAR -STARTCHAR D6DF -ENCODING 55007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -0400 -0E00 -3F80 -1200 -1E00 -ENDCHAR -STARTCHAR D6E0 -ENCODING 55008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -0080 -7E80 -4480 -3C80 -0080 -FE80 -1080 -1380 -1080 -1080 -ENDCHAR -STARTCHAR D6E1 -ENCODING 55009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -00 -3F -01 -01 -ENDCHAR -STARTCHAR D6E2 -ENCODING 55010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -00 -3F -09 -09 -ENDCHAR -STARTCHAR D6E3 -ENCODING 55011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -62 -12 -15 -18 -ENDCHAR -STARTCHAR D6E4 -ENCODING 55012 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -89 -79 -01 -FF -21 -67 -40 -7F -ENDCHAR -STARTCHAR D6E5 -ENCODING 55013 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -07 -41 -47 -30 -ENDCHAR -STARTCHAR D6E6 -ENCODING 55014 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -07 -46 -4F -49 -36 -ENDCHAR -STARTCHAR D6E7 -ENCODING 55015 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -00 -7E -7E -ENDCHAR -STARTCHAR D6E8 -ENCODING 55016 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 12 1 -3 -BITMAP -71 -01 -FD -CF -31 -FD -21 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR D6E9 -ENCODING 55017 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -07 -77 -31 -41 -71 -ENDCHAR -STARTCHAR D6EA -ENCODING 55018 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -07 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D6EB -ENCODING 55019 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -07 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D6EC -ENCODING 55020 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -07 -72 -72 -85 -68 -ENDCHAR -STARTCHAR D6ED -ENCODING 55021 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -07 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D6EE -ENCODING 55022 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -07 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D6EF -ENCODING 55023 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -07 -76 -37 -49 -76 -ENDCHAR -STARTCHAR D6F0 -ENCODING 55024 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -87 -79 -01 -FD -20 -7F -41 -7F -ENDCHAR -STARTCHAR D6F1 -ENCODING 55025 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -41 -7F -41 -3E -ENDCHAR -STARTCHAR D6F2 -ENCODING 55026 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -12 -72 -55 -78 -ENDCHAR -STARTCHAR D6F3 -ENCODING 55027 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -09 -0C -33 -40 -ENDCHAR -STARTCHAR D6F4 -ENCODING 55028 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -C900 -3100 -C900 -6900 -DD00 -2700 -0200 -2200 -5D00 -0080 -ENDCHAR -STARTCHAR D6F5 -ENCODING 55029 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -87 -79 -01 -FD -20 -3E -41 -3E -ENDCHAR -STARTCHAR D6F6 -ENCODING 55030 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -C900 -3100 -C900 -6900 -DD00 -2700 -1C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D6F7 -ENCODING 55031 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -FD00 -7100 -8900 -7100 -FD00 -0700 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D6F8 -ENCODING 55032 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -00 -3F -3F -01 -ENDCHAR -STARTCHAR D6F9 -ENCODING 55033 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -07 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D6FA -ENCODING 55034 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -C9 -31 -C9 -69 -DD -27 -00 -3F -3F -ENDCHAR -STARTCHAR D6FB -ENCODING 55035 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -0F -33 -0C -32 -1E -ENDCHAR -STARTCHAR D6FC -ENCODING 55036 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -FE80 -4A80 -4A80 -7A80 -0280 -FE80 -1280 -1680 -1280 -ENDCHAR -STARTCHAR D6FD -ENCODING 55037 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -7E80 -4E80 -3A80 -0280 -FE80 -1000 -3F80 -0080 -0080 -ENDCHAR -STARTCHAR D6FE -ENCODING 55038 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0000 -1D80 -0480 -0400 -ENDCHAR -STARTCHAR D6FF -ENCODING 55039 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -3100 -0900 -0A80 -0840 -ENDCHAR -STARTCHAR D700 -ENCODING 55040 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -7E80 -4A80 -3A80 -0280 -FE80 -1280 -2680 -2000 -3F80 -ENDCHAR -STARTCHAR D701 -ENCODING 55041 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0380 -2080 -23C0 -1800 -ENDCHAR -STARTCHAR D702 -ENCODING 55042 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -2100 -2380 -2280 -1900 -ENDCHAR -STARTCHAR D703 -ENCODING 55043 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0000 -3F80 -3F80 -ENDCHAR -STARTCHAR D704 -ENCODING 55044 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 12 0 -3 -BITMAP -3280 -0280 -7E80 -4E80 -3280 -FE80 -1000 -3F80 -0080 -3F80 -2000 -3F80 -ENDCHAR -STARTCHAR D705 -ENCODING 55045 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -3F80 -1C80 -2080 -1C00 -ENDCHAR -STARTCHAR D706 -ENCODING 55046 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -3B80 -1E80 -2280 -1B80 -ENDCHAR -STARTCHAR D707 -ENCODING 55047 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -3A80 -1F80 -2280 -1B80 -ENDCHAR -STARTCHAR D708 -ENCODING 55048 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -3900 -1900 -2280 -3840 -ENDCHAR -STARTCHAR D709 -ENCODING 55049 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -3B80 -1F80 -2200 -1B80 -ENDCHAR -STARTCHAR D70A -ENCODING 55050 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -3B80 -1A80 -2280 -3B80 -ENDCHAR -STARTCHAR D70B -ENCODING 55051 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -3900 -1B80 -2280 -3900 -ENDCHAR -STARTCHAR D70C -ENCODING 55052 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0000 -3F80 -3F80 -ENDCHAR -STARTCHAR D70D -ENCODING 55053 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0000 -3F80 -3F80 -ENDCHAR -STARTCHAR D70E -ENCODING 55054 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0100 -3900 -2A80 -3C00 -ENDCHAR -STARTCHAR D70F -ENCODING 55055 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0400 -0600 -1900 -2080 -ENDCHAR -STARTCHAR D710 -ENCODING 55056 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0100 -0900 -3E80 -0040 -ENDCHAR -STARTCHAR D711 -ENCODING 55057 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3280 -0280 -7E80 -4E80 -3A80 -0280 -FE80 -1000 -1F80 -2080 -1F80 -ENDCHAR -STARTCHAR D712 -ENCODING 55058 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0E00 -0180 -0F80 -1040 -ENDCHAR -STARTCHAR D713 -ENCODING 55059 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -0600 -1F80 -0F00 -30C0 -ENDCHAR -STARTCHAR D714 -ENCODING 55060 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0000 -1F80 -1F80 -0080 -ENDCHAR -STARTCHAR D715 -ENCODING 55061 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -1F80 -3F80 -2000 -1F80 -ENDCHAR -STARTCHAR D716 -ENCODING 55062 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 0 -1 -BITMAP -3080 -0280 -7A80 -4A80 -3A80 -FE80 -1680 -0000 -1F80 -1F80 -ENDCHAR -STARTCHAR D717 -ENCODING 55063 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3080 -4A80 -3280 -4A80 -3280 -FA80 -1480 -0E00 -3F80 -1900 -0F00 -ENDCHAR -STARTCHAR D718 -ENCODING 55064 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3880 -0080 -7E80 -2480 -4480 -3C80 -0080 -FE80 -1080 -1080 -1080 -ENDCHAR -STARTCHAR D719 -ENCODING 55065 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -01 -FD -20 -7F -01 -01 -ENDCHAR -STARTCHAR D71A -ENCODING 55066 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -21 -00 -3F -09 -09 -ENDCHAR -STARTCHAR D71B -ENCODING 55067 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -21 -62 -12 -15 -18 -ENDCHAR -STARTCHAR D71C -ENCODING 55068 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -01 -FD -21 -60 -40 -7F -ENDCHAR -STARTCHAR D71D -ENCODING 55069 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -21 -07 -41 -47 -30 -ENDCHAR -STARTCHAR D71E -ENCODING 55070 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -01 -46 -4F -49 -36 -ENDCHAR -STARTCHAR D71F -ENCODING 55071 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -C9 -31 -C9 -69 -DD -21 -00 -7E -7E -ENDCHAR -STARTCHAR D720 -ENCODING 55072 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 12 1 -3 -BITMAP -31 -01 -FD -49 -31 -FD -20 -7F -01 -7F -40 -7F -ENDCHAR -STARTCHAR D721 -ENCODING 55073 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -01 -77 -31 -41 -71 -ENDCHAR -STARTCHAR D722 -ENCODING 55074 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -01 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D723 -ENCODING 55075 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -01 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D724 -ENCODING 55076 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -01 -72 -72 -85 -68 -ENDCHAR -STARTCHAR D725 -ENCODING 55077 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -01 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D726 -ENCODING 55078 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -01 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D727 -ENCODING 55079 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -01 -76 -37 -49 -76 -ENDCHAR -STARTCHAR D728 -ENCODING 55080 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -01 -FD -20 -7F -41 -7F -ENDCHAR -STARTCHAR D729 -ENCODING 55081 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 12 1 -3 -BITMAP -31 -01 -FD -89 -79 -01 -FD -20 -41 -7F -41 -7F -ENDCHAR -STARTCHAR D72A -ENCODING 55082 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -21 -12 -72 -55 -78 -ENDCHAR -STARTCHAR D72B -ENCODING 55083 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -0100 -FD00 -8900 -7900 -0100 -FD00 -2100 -0800 -1600 -6180 -ENDCHAR -STARTCHAR D72C -ENCODING 55084 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -C900 -3100 -C900 -6900 -DD00 -2100 -0200 -2200 -5D00 -0080 -ENDCHAR -STARTCHAR D72D -ENCODING 55085 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -01 -FD -21 -3E -41 -3E -ENDCHAR -STARTCHAR D72E -ENCODING 55086 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -C900 -3100 -C900 -6900 -DD00 -2100 -1C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D72F -ENCODING 55087 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -FD00 -7100 -8900 -7100 -FD00 -0100 -0C00 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D730 -ENCODING 55088 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -C9 -31 -C9 -69 -DD -21 -00 -3F -3F -01 -ENDCHAR -STARTCHAR D731 -ENCODING 55089 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -01 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D732 -ENCODING 55090 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -C9 -31 -C9 -69 -DD -21 -00 -3F -3F -ENDCHAR -STARTCHAR D733 -ENCODING 55091 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -FD -71 -89 -71 -FD -0D -33 -0C -32 -1E -ENDCHAR -STARTCHAR D734 -ENCODING 55092 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -0000 -7F80 -1100 -2100 -1E00 -0000 -FFC0 -1200 -1200 -ENDCHAR -STARTCHAR D735 -ENCODING 55093 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -1200 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D736 -ENCODING 55094 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1200 -2980 -0880 -0800 -ENDCHAR -STARTCHAR D737 -ENCODING 55095 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3200 -0900 -0B80 -0C00 -ENDCHAR -STARTCHAR D738 -ENCODING 55096 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -1200 -3200 -2000 -3F80 -ENDCHAR -STARTCHAR D739 -ENCODING 55097 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1300 -2100 -2280 -1000 -ENDCHAR -STARTCHAR D73A -ENCODING 55098 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -1200 -0100 -4780 -4480 -3B00 -ENDCHAR -STARTCHAR D73B -ENCODING 55099 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1F00 -2000 -3F00 -ENDCHAR -STARTCHAR D73C -ENCODING 55100 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 12 0 -3 -BITMAP -0E00 -0000 -7F80 -3300 -0C00 -FFC0 -1200 -3F00 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D73D -ENCODING 55101 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -1200 -3F80 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D73E -ENCODING 55102 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -1200 -3F80 -3C80 -4480 -3B00 -ENDCHAR -STARTCHAR D73F -ENCODING 55103 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -1200 -3C80 -3F80 -2480 -3B00 -ENDCHAR -STARTCHAR D740 -ENCODING 55104 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -1200 -7900 -3900 -4280 -3400 -ENDCHAR -STARTCHAR D741 -ENCODING 55105 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -1200 -3F80 -3F00 -4400 -3B80 -ENDCHAR -STARTCHAR D742 -ENCODING 55106 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -1200 -7F80 -3A80 -4280 -3F80 -ENDCHAR -STARTCHAR D743 -ENCODING 55107 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -1200 -3900 -3B80 -4480 -3B00 -ENDCHAR -STARTCHAR D744 -ENCODING 55108 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -1200 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D745 -ENCODING 55109 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3200 -3F00 -3F80 -ENDCHAR -STARTCHAR D746 -ENCODING 55110 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -5B00 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR D747 -ENCODING 55111 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -1100 -0400 -1A00 -6180 -ENDCHAR -STARTCHAR D748 -ENCODING 55112 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1200 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR D749 -ENCODING 55113 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -1200 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D74A -ENCODING 55114 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3E00 -0100 -1F80 -2000 -ENDCHAR -STARTCHAR D74B -ENCODING 55115 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -2D00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D74C -ENCODING 55116 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3F00 -0080 -3F00 -ENDCHAR -STARTCHAR D74D -ENCODING 55117 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -1200 -3F00 -3F00 -3F00 -ENDCHAR -STARTCHAR D74E -ENCODING 55118 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1200 -3F00 -3F00 -ENDCHAR -STARTCHAR D74F -ENCODING 55119 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3180 -0E00 -3100 -1F00 -FFC0 -2100 -0E00 -3F80 -1200 -1E00 -ENDCHAR -STARTCHAR D750 -ENCODING 55120 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 0 -BITMAP -0E00 -0000 -7F80 -0000 -1E00 -2100 -1E00 -0000 -FFC0 -ENDCHAR -STARTCHAR D751 -ENCODING 55121 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0000 -3F00 -0080 -0080 -ENDCHAR -STARTCHAR D752 -ENCODING 55122 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -0000 -3B80 -0880 -0800 -ENDCHAR -STARTCHAR D753 -ENCODING 55123 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3000 -0900 -0B80 -0C00 -ENDCHAR -STARTCHAR D754 -ENCODING 55124 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0000 -2000 -2000 -3F80 -ENDCHAR -STARTCHAR D755 -ENCODING 55125 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -0300 -2100 -2280 -1000 -ENDCHAR -STARTCHAR D756 -ENCODING 55126 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -3300 -0C00 -FFC0 -0380 -4000 -4780 -4480 -3B80 -ENDCHAR -STARTCHAR D757 -ENCODING 55127 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D758 -ENCODING 55128 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0080 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D759 -ENCODING 55129 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0880 -3880 -2080 -3880 -ENDCHAR -STARTCHAR D75A -ENCODING 55130 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -7F -79 -89 -76 -ENDCHAR -STARTCHAR D75B -ENCODING 55131 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -79 -7F -49 -76 -ENDCHAR -STARTCHAR D75C -ENCODING 55132 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -F2 -72 -85 -68 -ENDCHAR -STARTCHAR D75D -ENCODING 55133 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -7F -7E -88 -77 -ENDCHAR -STARTCHAR D75E -ENCODING 55134 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -FF -75 -85 -7F -ENDCHAR -STARTCHAR D75F -ENCODING 55135 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -76 -77 -89 -76 -ENDCHAR -STARTCHAR D760 -ENCODING 55136 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D761 -ENCODING 55137 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -2080 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D762 -ENCODING 55138 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -4900 -7900 -4A80 -7C00 -ENDCHAR -STARTCHAR D763 -ENCODING 55139 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0000 -0400 -1A00 -6180 -ENDCHAR -STARTCHAR D764 -ENCODING 55140 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -1000 -1300 -2E80 -4000 -ENDCHAR -STARTCHAR D765 -ENCODING 55141 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -0000 -3F00 -2080 -3F00 -ENDCHAR -STARTCHAR D766 -ENCODING 55142 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3E00 -0100 -1F80 -2000 -ENDCHAR -STARTCHAR D767 -ENCODING 55143 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -E7 -18 -00 -7E -3C -C3 -ENDCHAR -STARTCHAR D768 -ENCODING 55144 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -2 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -3F00 -0080 -3F00 -ENDCHAR -STARTCHAR D769 -ENCODING 55145 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 11 0 -2 -BITMAP -0E00 -0000 -7F80 -2100 -1E00 -0000 -FFC0 -2000 -3F00 -2000 -3F80 -ENDCHAR -STARTCHAR D76A -ENCODING 55146 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -0E00 -3380 -0C00 -1300 -3100 -0E00 -FFC0 -0000 -3F00 -3F00 -ENDCHAR -STARTCHAR D76B -ENCODING 55147 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -1C -FF -3C -42 -3E -FF -00 -1C -7F -24 -3C -ENDCHAR -STARTCHAR D76C -ENCODING 55148 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 0 -2 -BITMAP -3C80 -0080 -7E80 -0080 -3C80 -4480 -3C80 -0080 -FF80 -0080 -0080 -ENDCHAR -STARTCHAR D76D -ENCODING 55149 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -3E -01 -01 -01 -ENDCHAR -STARTCHAR D76E -ENCODING 55150 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -36 -09 -09 -09 -ENDCHAR -STARTCHAR D76F -ENCODING 55151 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -62 -12 -15 -10 -ENDCHAR -STARTCHAR D770 -ENCODING 55152 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -49 -79 -01 -FD -01 -40 -40 -7F -ENDCHAR -STARTCHAR D771 -ENCODING 55153 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -47 -41 -47 -30 -ENDCHAR -STARTCHAR D772 -ENCODING 55154 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -7D -80 -46 -4F -49 -36 -ENDCHAR -STARTCHAR D773 -ENCODING 55155 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -3E -40 -7E -ENDCHAR -STARTCHAR D774 -ENCODING 55156 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -00 -FF -01 -7F -40 -7F -ENDCHAR -STARTCHAR D775 -ENCODING 55157 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -7D -80 -77 -31 -41 -71 -ENDCHAR -STARTCHAR D776 -ENCODING 55158 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -7D -80 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D777 -ENCODING 55159 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -7D -80 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D778 -ENCODING 55160 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -7D -80 -72 -72 -85 -68 -ENDCHAR -STARTCHAR D779 -ENCODING 55161 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -7D -80 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D77A -ENCODING 55162 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -7D -80 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D77B -ENCODING 55163 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -7D -80 -77 -37 -49 -76 -ENDCHAR -STARTCHAR D77C -ENCODING 55164 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -01 -FD -00 -7F -41 -7F -ENDCHAR -STARTCHAR D77D -ENCODING 55165 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -01 -FC -41 -7F -41 -7F -ENDCHAR -STARTCHAR D77E -ENCODING 55166 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -12 -72 -55 -78 -ENDCHAR -STARTCHAR D77F -ENCODING 55167 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -08 -0C -33 -40 -ENDCHAR -STARTCHAR D780 -ENCODING 55168 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -22 -22 -55 -08 -ENDCHAR -STARTCHAR D781 -ENCODING 55169 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -89 -79 -01 -FD -01 -3E -41 -3E -ENDCHAR -STARTCHAR D782 -ENCODING 55170 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -0100 -F900 -7900 -C900 -3100 -FD00 -3C00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D783 -ENCODING 55171 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -C900 -3100 -C900 -7900 -7500 -8C00 -0000 -3F00 -1E00 -6180 -ENDCHAR -STARTCHAR D784 -ENCODING 55172 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -3E -01 -3F -01 -ENDCHAR -STARTCHAR D785 -ENCODING 55173 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -7D -80 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D786 -ENCODING 55174 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -F9 -79 -C9 -31 -FD -2D -12 -3F -ENDCHAR -STARTCHAR D787 -ENCODING 55175 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -C9 -31 -C9 -79 -75 -8C -33 -0C -32 -1E -ENDCHAR -STARTCHAR D788 -ENCODING 55176 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -71 -49 -89 -49 -71 -01 -01 -ENDCHAR -STARTCHAR D789 -ENCODING 55177 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -79 -89 -79 -00 -7F -01 -01 -ENDCHAR -STARTCHAR D78A -ENCODING 55178 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -71 -89 -49 -31 -77 -09 -09 -09 -ENDCHAR -STARTCHAR D78B -ENCODING 55179 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -71 -89 -49 -31 -72 -12 -15 -10 -ENDCHAR -STARTCHAR D78C -ENCODING 55180 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -79 -89 -79 -01 -20 -20 -3F -ENDCHAR -STARTCHAR D78D -ENCODING 55181 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -71 -89 -49 -31 -47 -41 -47 -30 -ENDCHAR -STARTCHAR D78E -ENCODING 55182 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -79 -06 -41 -46 -49 -36 -ENDCHAR -STARTCHAR D78F -ENCODING 55183 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -FD -71 -89 -49 -31 -3F -40 -7E -ENDCHAR -STARTCHAR D790 -ENCODING 55184 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -89 -79 -00 -3F -01 -3F -40 -3F -ENDCHAR -STARTCHAR D791 -ENCODING 55185 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -79 -00 -37 -71 -41 -71 -ENDCHAR -STARTCHAR D792 -ENCODING 55186 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -79 -00 -77 -79 -49 -77 -ENDCHAR -STARTCHAR D793 -ENCODING 55187 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -79 -00 -75 -77 -45 -77 -ENDCHAR -STARTCHAR D794 -ENCODING 55188 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -79 -00 -72 -72 -45 -70 -ENDCHAR -STARTCHAR D795 -ENCODING 55189 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -79 -00 -77 -77 -44 -77 -ENDCHAR -STARTCHAR D796 -ENCODING 55190 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -79 -00 -77 -75 -45 -77 -ENDCHAR -STARTCHAR D797 -ENCODING 55191 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -79 -02 -75 -72 -45 -72 -ENDCHAR -STARTCHAR D798 -ENCODING 55192 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -79 -89 -79 -00 -3F -41 -3F -ENDCHAR -STARTCHAR D799 -ENCODING 55193 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -49 -89 -79 -00 -41 -3F -41 -3F -ENDCHAR -STARTCHAR D79A -ENCODING 55194 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -71 -89 -49 -31 -12 -72 -55 -70 -ENDCHAR -STARTCHAR D79B -ENCODING 55195 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -FD00 -0100 -7900 -8900 -7900 -0100 -0800 -1600 -6180 -ENDCHAR -STARTCHAR D79C -ENCODING 55196 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -71 -89 -49 -31 -22 -22 -55 -08 -ENDCHAR -STARTCHAR D79D -ENCODING 55197 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -FD -01 -79 -89 -79 -00 -3E -41 -3E -ENDCHAR -STARTCHAR D79E -ENCODING 55198 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -3100 -0100 -FD00 -7100 -8900 -4900 -3100 -3F00 -0200 -1F00 -2080 -ENDCHAR -STARTCHAR D79F -ENCODING 55199 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 11 1 -2 -BITMAP -7100 -0100 -F900 -7900 -8900 -6900 -1C00 -3C00 -0300 -1E00 -6180 -ENDCHAR -STARTCHAR D7A0 -ENCODING 55200 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -31 -01 -FD -71 -89 -49 -31 -7F -3F -01 -01 -ENDCHAR -STARTCHAR D7A1 -ENCODING 55201 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -79 -00 -3F -3F -20 -3F -ENDCHAR -STARTCHAR D7A2 -ENCODING 55202 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -01 -FD -71 -89 -49 -31 -7F -12 -3F -ENDCHAR -STARTCHAR D7A3 -ENCODING 55203 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 11 1 -2 -BITMAP -71 -01 -F9 -79 -89 -69 -1C -33 -0C -32 -1E -ENDCHAR -STARTCHAR F900 -ENCODING 63744 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -8900 -7F00 -FF00 -0000 -7E00 -4200 -7E00 -2400 -FF80 -ENDCHAR -STARTCHAR F901 -ENCODING 63745 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -7F00 -7F00 -4900 -7F00 -5000 -3C00 -C380 -ENDCHAR -STARTCHAR F902 -ENCODING 63746 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -0800 -7E00 -7E00 -4A00 -7E00 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR F903 -ENCODING 63747 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -FF -00 -7E -7E -7E -7E -E3 -ENDCHAR -STARTCHAR F904 -ENCODING 63748 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -5700 -9500 -7F80 -3F80 -5F00 -5100 -9F00 -9300 -ENDCHAR -STARTCHAR F905 -ENCODING 63749 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -7F -49 -7F -08 -FF -89 -FF -08 -08 -ENDCHAR -STARTCHAR F906 -ENCODING 63750 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -20 -7F -41 -81 -F9 -45 -79 -45 -07 -ENDCHAR -STARTCHAR F907 -ENCODING 63751 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7C00 -FF00 -7700 -D700 -F500 -1B00 -F700 -3880 -5F00 -ENDCHAR -STARTCHAR F908 -ENCODING 63752 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7C00 -FF00 -7700 -D700 -F500 -1B00 -F700 -3880 -5F00 -ENDCHAR -STARTCHAR F909 -ENCODING 63753 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -FF00 -F500 -3500 -E900 -2B00 -FF00 -1800 -6600 -8180 -ENDCHAR -STARTCHAR F90A -ENCODING 63754 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -2400 -4300 -BF80 -0800 -7F00 -4A00 -2C00 -FF80 -ENDCHAR -STARTCHAR F90B -ENCODING 63755 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -09 -FF -CB -FF -EF -FF -DB -AD -2D -0B -ENDCHAR -STARTCHAR F90C -ENCODING 63756 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -FF -14 -62 -BD -00 -FF -2A -4B -B9 -ENDCHAR -STARTCHAR F90D -ENCODING 63757 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9700 -BA80 -D500 -B800 -BB00 -BB00 -9B00 -BB00 -B300 -9480 -ENDCHAR -STARTCHAR F90E -ENCODING 63758 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -D700 -FB00 -7800 -FF00 -BD00 -7700 -DB00 -9480 -ENDCHAR -STARTCHAR F90F -ENCODING 63759 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -4800 -AA00 -6F00 -EF00 -EB00 -DE00 -CF80 -ENDCHAR -STARTCHAR F910 -ENCODING 63760 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -FF00 -FF00 -6A00 -CF00 -FF00 -4F00 -EA00 -CF80 -ENDCHAR -STARTCHAR F911 -ENCODING 63761 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5500 -EF00 -EF00 -ED00 -E700 -5F80 -6200 -6B00 -9280 -ENDCHAR -STARTCHAR F912 -ENCODING 63762 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -5500 -EF00 -3500 -6F00 -FF80 -E600 -4D00 -5480 -4400 -ENDCHAR -STARTCHAR F913 -ENCODING 63763 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -7F00 -9500 -B780 -1500 -BF00 -BD00 -DF80 -BF80 -ENDCHAR -STARTCHAR F914 -ENCODING 63764 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -9E00 -D700 -9E00 -FF80 -0800 -7F00 -2E00 -4980 -8800 -ENDCHAR -STARTCHAR F915 -ENCODING 63765 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -5F00 -1200 -AA00 -8E00 -3180 -5F00 -9100 -9F00 -9100 -ENDCHAR -STARTCHAR F916 -ENCODING 63766 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -4F00 -FA00 -D600 -CF00 -5980 -4F00 -B100 -AF00 -9100 -ENDCHAR -STARTCHAR F917 -ENCODING 63767 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF00 -5A00 -5A00 -EE00 -7180 -7F00 -5100 -9F00 -1100 -ENDCHAR -STARTCHAR F918 -ENCODING 63768 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -8800 -5F00 -AA00 -A400 -7B00 -9F00 -9F00 -9100 -ENDCHAR -STARTCHAR F919 -ENCODING 63769 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -6700 -F500 -FE00 -F300 -B580 -9F00 -F900 -FF00 -9900 -ENDCHAR -STARTCHAR F91A -ENCODING 63770 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -C700 -E900 -D600 -E700 -F980 -BF00 -B900 -9F00 -6900 -ENDCHAR -STARTCHAR F91B -ENCODING 63771 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FA00 -AA00 -7A00 -5200 -FA00 -FA00 -FA00 -AA80 -DB80 -ENDCHAR -STARTCHAR F91C -ENCODING 63772 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -17 -F5 -D5 -D5 -B7 -B5 -E7 -64 -C4 -ENDCHAR -STARTCHAR F91D -ENCODING 63773 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -5B -6D -DB -5B -DF -EF -6F -6D -57 -65 -ENDCHAR -STARTCHAR F91E -ENCODING 63774 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5B -5B -ED -DB -A5 -6F -6F -97 -A5 -ENDCHAR -STARTCHAR F91F -ENCODING 63775 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -F700 -9900 -F700 -FF00 -EF00 -BF00 -AF00 -8900 -ENDCHAR -STARTCHAR F920 -ENCODING 63776 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -4300 -FB80 -DA80 -7900 -7E00 -7E00 -7F80 -7F00 -B500 -ENDCHAR -STARTCHAR F921 -ENCODING 63777 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -0000 -7E00 -7D00 -7D00 -B500 -BD00 -9380 -FF80 -ENDCHAR -STARTCHAR F922 -ENCODING 63778 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BA00 -7380 -BC00 -7800 -3B80 -4000 -BF00 -AB00 -BF80 -ENDCHAR -STARTCHAR F923 -ENCODING 63779 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -F400 -A780 -F800 -F700 -F000 -7F00 -5500 -FF80 -ENDCHAR -STARTCHAR F924 -ENCODING 63780 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5E00 -5A00 -DF80 -5C00 -6B80 -DC00 -BF00 -5B00 -5B00 -7F80 -ENDCHAR -STARTCHAR F925 -ENCODING 63781 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4400 -FF00 -4100 -7100 -4A00 -CA00 -4A00 -4200 -FF80 -ENDCHAR -STARTCHAR F926 -ENCODING 63782 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D500 -B500 -BF00 -DB00 -BF00 -C000 -BF00 -BF00 -BF80 -7580 -ENDCHAR -STARTCHAR F927 -ENCODING 63783 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4D00 -4D00 -FF00 -FF00 -FF00 -E000 -5F00 -7F00 -FF80 -3580 -ENDCHAR -STARTCHAR F928 -ENCODING 63784 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9780 -BD00 -BD00 -CD00 -BD00 -DC80 -D500 -EC00 -ENDCHAR -STARTCHAR F929 -ENCODING 63785 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -27 -F5 -95 -F7 -F5 -B7 -A5 -F9 -DB -ENDCHAR -STARTCHAR F92A -ENCODING 63786 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -84 -5F -21 -9F -61 -1F -65 -A6 -AF -B1 -ENDCHAR -STARTCHAR F92B -ENCODING 63787 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A400 -4F00 -D100 -CF00 -5100 -AF00 -B500 -3200 -3500 -D880 -ENDCHAR -STARTCHAR F92C -ENCODING 63788 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2780 -F500 -9500 -F500 -9500 -F500 -D480 -A480 -F700 -CC00 -ENDCHAR -STARTCHAR F92D -ENCODING 63789 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -2A -4A -6B -BD -2C -4B -89 -08 -ENDCHAR -STARTCHAR F92E -ENCODING 63790 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8C00 -5400 -2300 -5E80 -0000 -7F00 -8900 -8B00 -0800 -ENDCHAR -STARTCHAR F92F -ENCODING 63791 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BB -DB -77 -8C -FF -FF -12 -62 -C6 -ENDCHAR -STARTCHAR F930 -ENCODING 63792 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -8700 -FF00 -BD00 -AF00 -7F80 -AD00 -BF00 -AD00 -D300 -ENDCHAR -STARTCHAR F931 -ENCODING 63793 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -5E00 -DF00 -5F00 -DF00 -9A80 -6000 -5F00 -5100 -5F00 -ENDCHAR -STARTCHAR F932 -ENCODING 63794 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4700 -9F00 -DD00 -AF00 -6F00 -6D00 -AF00 -B700 -3F80 -ENDCHAR -STARTCHAR F933 -ENCODING 63795 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1E00 -FF00 -9500 -9D00 -8000 -BE00 -BE00 -8000 -BF00 -FF80 -ENDCHAR -STARTCHAR F934 -ENCODING 63796 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -1100 -7E00 -1400 -FF80 -1800 -6200 -BC00 -2100 -3F00 -ENDCHAR -STARTCHAR F935 -ENCODING 63797 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -1000 -FF00 -DF00 -BE00 -BE00 -BE00 -B500 -FF80 -ENDCHAR -STARTCHAR F936 -ENCODING 63798 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -0E -FF -B1 -BF -FF -BF -FF -91 -E3 -ENDCHAR -STARTCHAR F937 -ENCODING 63799 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AF00 -A900 -F600 -4700 -B980 -CF00 -C900 -EF00 -8900 -ENDCHAR -STARTCHAR F938 -ENCODING 63800 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -EE80 -0C00 -EF00 -E600 -AF80 -F900 -CF00 -ENDCHAR -STARTCHAR F939 -ENCODING 63801 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7800 -FF00 -7F00 -7F00 -A500 -FE80 -4200 -7E00 -7E00 -ENDCHAR -STARTCHAR F93A -ENCODING 63802 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -FE00 -AD80 -FF00 -D000 -7E00 -7E00 -7F00 -7F00 -AF00 -ENDCHAR -STARTCHAR F93B -ENCODING 63803 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF00 -4E00 -8200 -FF80 -B300 -AB00 -AD00 -F480 -8C00 -ENDCHAR -STARTCHAR F93C -ENCODING 63804 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -0F00 -0E00 -E200 -FF80 -F300 -EA00 -ED00 -DC80 -4C00 -ENDCHAR -STARTCHAR F93D -ENCODING 63805 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -6F00 -AE00 -4200 -7F80 -F500 -EE00 -ED00 -D480 -4C00 -ENDCHAR -STARTCHAR F93E -ENCODING 63806 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3C00 -2400 -3C00 -FF00 -4800 -3600 -6A00 -9100 -ENDCHAR -STARTCHAR F93F -ENCODING 63807 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -AE00 -E200 -4F80 -EB00 -EB00 -E500 -7A80 -C400 -ENDCHAR -STARTCHAR F940 -ENCODING 63808 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9400 -FF00 -FF00 -A400 -A500 -BE00 -BC80 -E700 -ENDCHAR -STARTCHAR F941 -ENCODING 63809 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -C600 -1900 -FE80 -C000 -1F00 -DB00 -DF00 -BB00 -DB00 -9B00 -ENDCHAR -STARTCHAR F942 -ENCODING 63810 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -F700 -F700 -F800 -FE00 -FE80 -B700 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR F943 -ENCODING 63811 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -0800 -7E00 -FF00 -2400 -FF80 -2400 -4400 -8400 -ENDCHAR -STARTCHAR F944 -ENCODING 63812 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -EA00 -FF00 -FF00 -0F00 -FF00 -FF00 -FF80 -BF00 -ENDCHAR -STARTCHAR F945 -ENCODING 63813 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF00 -6F00 -F700 -F700 -F780 -B700 -FF00 -7E00 -7E00 -FF80 -ENDCHAR -STARTCHAR F946 -ENCODING 63814 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -8900 -2800 -7E00 -4800 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR F947 -ENCODING 63815 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -7E00 -A200 -3E00 -FF80 -4400 -F700 -9D00 -7700 -ENDCHAR -STARTCHAR F948 -ENCODING 63816 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -AF00 -F900 -B600 -EF00 -B880 -EF00 -2900 -AF00 -9900 -ENDCHAR -STARTCHAR F949 -ENCODING 63817 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -FF -EF -89 -66 -7F -7F -49 -7F -ENDCHAR -STARTCHAR F94A -ENCODING 63818 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -FF00 -FF00 -FF00 -0800 -7F00 -FF80 -ENDCHAR -STARTCHAR F94B -ENCODING 63819 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -A900 -FF00 -9E00 -BF00 -FF80 -B400 -7B00 -ENDCHAR -STARTCHAR F94C -ENCODING 63820 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F00 -F500 -5F00 -DF00 -D500 -7F80 -4A00 -4600 -7900 -ENDCHAR -STARTCHAR F94D -ENCODING 63821 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8100 -7E00 -3F00 -A100 -BF00 -2500 -7F80 -A400 -CA00 -F180 -ENDCHAR -STARTCHAR F94E -ENCODING 63822 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -BF00 -6080 -BF00 -BF80 -3F00 -7E80 -B480 -BE80 -D500 -ENDCHAR -STARTCHAR F94F -ENCODING 63823 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -7F -89 -7F -54 -3A -FF -6A -89 -ENDCHAR -STARTCHAR F950 -ENCODING 63824 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -AF00 -BF80 -4F00 -BF00 -F500 -FF80 -EA00 -C600 -5900 -ENDCHAR -STARTCHAR F951 -ENCODING 63825 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -A200 -DF00 -DB00 -BF00 -B900 -D900 -9F80 -9000 -ENDCHAR -STARTCHAR F952 -ENCODING 63826 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -A4 -F4 -AF -E5 -F5 -D5 -F5 -F9 -49 -4B -ENDCHAR -STARTCHAR F953 -ENCODING 63827 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -E4 -A4 -AF -E5 -A5 -E5 -A5 -A9 -A9 -F3 -ENDCHAR -STARTCHAR F954 -ENCODING 63828 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -3F80 -8000 -7F00 -2B00 -3F00 -4300 -9C00 -BF80 -9E00 -2580 -ENDCHAR -STARTCHAR F955 -ENCODING 63829 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -BF00 -4800 -3F80 -1F00 -7800 -7E00 -B200 -8E00 -B180 -ENDCHAR -STARTCHAR F956 -ENCODING 63830 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -DF00 -4400 -FF80 -5B80 -C800 -7F00 -5A00 -4E00 -7180 -ENDCHAR -STARTCHAR F957 -ENCODING 63831 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -BF00 -C400 -5F80 -FB80 -4400 -EF00 -FA00 -CE00 -5180 -ENDCHAR -STARTCHAR F958 -ENCODING 63832 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -0800 -7F00 -FF80 -2700 -FE00 -5400 -1C00 -E300 -ENDCHAR -STARTCHAR F959 -ENCODING 63833 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -C400 -DF80 -CB00 -B800 -DF00 -AA00 -8E00 -B180 -ENDCHAR -STARTCHAR F95A -ENCODING 63834 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -DF80 -FF00 -DB00 -1F00 -DF00 -DF00 -BF00 -DF00 -B980 -ENDCHAR -STARTCHAR F95B -ENCODING 63835 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -FF00 -9600 -7500 -8880 -7E00 -FF00 -FF80 -0800 -1000 -ENDCHAR -STARTCHAR F95C -ENCODING 63836 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -9E00 -D700 -9E00 -FF80 -0800 -7F00 -2E00 -4980 -8800 -ENDCHAR -STARTCHAR F95D -ENCODING 63837 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -EA00 -1F80 -EE00 -E400 -1F80 -E800 -FF00 -B900 -EF00 -A900 -ENDCHAR -STARTCHAR F95E -ENCODING 63838 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -5200 -4A00 -4A00 -FF80 -4200 -4200 -8200 -8600 -ENDCHAR -STARTCHAR F95F -ENCODING 63839 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -EA80 -7D00 -7F00 -5500 -FF80 -FF00 -0800 -1800 -ENDCHAR -STARTCHAR F960 -ENCODING 63840 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -FF00 -9500 -6200 -5500 -8880 -3000 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR F961 -ENCODING 63841 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9100 -7600 -5A00 -9500 -B900 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR F962 -ENCODING 63842 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -7F00 -7F00 -0000 -2400 -FF00 -FF80 -2600 -C100 -ENDCHAR -STARTCHAR F963 -ENCODING 63843 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -2400 -2500 -E700 -2400 -2400 -6400 -A400 -2480 -2700 -ENDCHAR -STARTCHAR F964 -ENCODING 63844 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0100 -FF00 -9F80 -EE00 -BF00 -B580 -BF00 -F500 -9F00 -ENDCHAR -STARTCHAR F965 -ENCODING 63845 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -7F80 -5F00 -9500 -9F00 -9F00 -5400 -4C00 -5600 -6180 -ENDCHAR -STARTCHAR F966 -ENCODING 63846 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5000 -DF80 -9F00 -7100 -5F00 -9F00 -9F00 -6A00 -4E00 -7180 -ENDCHAR -STARTCHAR F967 -ENCODING 63847 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -18 -2C -4B -89 -08 -08 -08 -ENDCHAR -STARTCHAR F968 -ENCODING 63848 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -8900 -4500 -8900 -AB00 -2B00 -6C80 -A800 -9900 -AF00 -ENDCHAR -STARTCHAR F969 -ENCODING 63849 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -FC00 -FF80 -FD00 -FD00 -FB00 -FA00 -5200 -2500 -D480 -ENDCHAR -STARTCHAR F96A -ENCODING 63850 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -FF -91 -A5 -1A -D3 -3C -6A -89 -ENDCHAR -STARTCHAR F96B -ENCODING 63851 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -7E00 -4200 -9D00 -F700 -6A00 -B580 -5B00 -6C00 -7000 -ENDCHAR -STARTCHAR F96C -ENCODING 63852 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -2400 -7F00 -FF80 -2A00 -7F00 -8880 -FF00 -ENDCHAR -STARTCHAR F96D -ENCODING 63853 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -2A -4B -9C -30 -FE -7E -7E -7E -41 -ENDCHAR -STARTCHAR F96E -ENCODING 63854 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -5200 -FF80 -5E00 -7F00 -FF80 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR F96F -ENCODING 63855 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -F100 -1F80 -F100 -F100 -0F00 -EA00 -EA80 -B300 -ENDCHAR -STARTCHAR F970 -ENCODING 63856 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A600 -6A00 -9A80 -E980 -4000 -FF00 -6500 -D600 -C700 -5980 -ENDCHAR -STARTCHAR F971 -ENCODING 63857 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7F -40 -7F -40 -7F -6E -A6 -AB -F1 -ENDCHAR -STARTCHAR F972 -ENCODING 63858 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -4400 -3F00 -A500 -8400 -0C00 -4C00 -5400 -B480 -A700 -ENDCHAR -STARTCHAR F973 -ENCODING 63859 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -F100 -6080 -7F00 -4000 -DF00 -5100 -5F00 -9100 -ENDCHAR -STARTCHAR F974 -ENCODING 63860 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -2C00 -1000 -FF80 -2000 -7F00 -A100 -3F00 -2100 -ENDCHAR -STARTCHAR F975 -ENCODING 63861 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -E000 -5F00 -7100 -DF00 -C400 -4D00 -5480 -EC00 -ENDCHAR -STARTCHAR F976 -ENCODING 63862 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E700 -E900 -D600 -E600 -D980 -EF00 -E900 -AF00 -0900 -ENDCHAR -STARTCHAR F977 -ENCODING 63863 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -7E00 -7E00 -0000 -FF00 -A500 -2400 -6480 -C700 -ENDCHAR -STARTCHAR F978 -ENCODING 63864 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -08 -FF -ED -AB -EF -D5 -89 -8B -ENDCHAR -STARTCHAR F979 -ENCODING 63865 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -BF80 -4000 -1F00 -2100 -5F00 -4400 -9600 -A500 -C880 -ENDCHAR -STARTCHAR F97A -ENCODING 63866 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5E00 -1B00 -9A80 -5280 -E600 -8800 -FF80 -1800 -6E00 -8980 -ENDCHAR -STARTCHAR F97B -ENCODING 63867 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F00 -EF00 -EF00 -4000 -FF80 -4F00 -EF00 -CF00 -5F00 -5F80 -ENDCHAR -STARTCHAR F97C -ENCODING 63868 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -7E -42 -7E -42 -7F -4A -4C -7E -E1 -ENDCHAR -STARTCHAR F97D -ENCODING 63869 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -1F80 -E000 -EF00 -1100 -EF00 -ED00 -AD00 -F480 -A400 -ENDCHAR -STARTCHAR F97E -ENCODING 63870 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -FF00 -7E00 -7E00 -7E00 -FF00 -FF80 -ENDCHAR -STARTCHAR F97F -ENCODING 63871 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -FA -B2 -FF -FB -FB -FB -FB -EB -FD -DF -ENDCHAR -STARTCHAR F980 -ENCODING 63872 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -FC -84 -84 -FC -20 -FE -02 -FE -02 -ENDCHAR -STARTCHAR F981 -ENCODING 63873 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -10 -10 -FF -22 -24 -34 -0C -33 -C1 -ENDCHAR -STARTCHAR F982 -ENCODING 63874 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -8800 -FF00 -CF00 -D500 -DF00 -DF00 -EB00 -FF80 -ENDCHAR -STARTCHAR F983 -ENCODING 63875 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 10 0 -1 -BITMAP -2400 -2780 -7800 -2980 -3700 -3580 -5580 -5500 -5580 -BE40 -ENDCHAR -STARTCHAR F984 -ENCODING 63876 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8800 -4F00 -3F80 -BD00 -AF00 -3500 -7F00 -AE00 -DD00 -EE80 -ENDCHAR -STARTCHAR F985 -ENCODING 63877 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -5F00 -9000 -DF00 -BB00 -BF00 -BF00 -DF00 -2900 -ENDCHAR -STARTCHAR F986 -ENCODING 63878 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -F7 -F7 -F7 -81 -BD -BD -BD -BD -81 -ENDCHAR -STARTCHAR F987 -ENCODING 63879 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -DF00 -F480 -EF80 -CF00 -EF00 -FA00 -F780 -7F80 -ENDCHAR -STARTCHAR F988 -ENCODING 63880 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -9900 -8800 -FF00 -FF00 -FF00 -A500 -BE80 -E700 -ENDCHAR -STARTCHAR F989 -ENCODING 63881 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1400 -E700 -FB00 -5500 -BF00 -6600 -C980 -3A00 -4C00 -9B00 -ENDCHAR -STARTCHAR F98A -ENCODING 63882 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -10 -10 -FF -11 -11 -11 -21 -21 -41 -86 -ENDCHAR -STARTCHAR F98B -ENCODING 63883 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -F700 -FF00 -AB00 -D680 -BF00 -A100 -BF00 -A100 -ENDCHAR -STARTCHAR F98C -ENCODING 63884 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -F700 -FF00 -AB00 -D680 -8800 -A700 -A800 -FF80 -ENDCHAR -STARTCHAR F98D -ENCODING 63885 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4500 -F700 -6A80 -F700 -FB00 -BF80 -FF80 -EF00 -5480 -4400 -ENDCHAR -STARTCHAR F98E -ENCODING 63886 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -7F00 -C800 -8800 -7F00 -4800 -FF80 -0800 -0800 -0800 -ENDCHAR -STARTCHAR F98F -ENCODING 63887 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -4D00 -DF80 -EE00 -F580 -5D00 -5B80 -7F80 -5100 -6100 -ENDCHAR -STARTCHAR F990 -ENCODING 63888 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5A00 -DF00 -5A00 -E780 -DA80 -FA80 -DD00 -A900 -A300 -BC80 -ENDCHAR -STARTCHAR F991 -ENCODING 63889 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -9B00 -D780 -AA00 -9A00 -D500 -9880 -A100 -AD00 -AA80 -ENDCHAR -STARTCHAR F992 -ENCODING 63890 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -A200 -6F80 -2F00 -AB00 -0F00 -6F00 -AF80 -A200 -DF80 -ENDCHAR -STARTCHAR F993 -ENCODING 63891 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -E400 -DF00 -DE80 -5480 -5F00 -BD00 -A480 -8400 -ENDCHAR -STARTCHAR F994 -ENCODING 63892 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2200 -DF80 -8F00 -AB00 -CF00 -BF00 -9F80 -D200 -3200 -2F80 -ENDCHAR -STARTCHAR F995 -ENCODING 63893 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0600 -7C00 -FF00 -6C00 -8F80 -7800 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR F996 -ENCODING 63894 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -A400 -DF00 -7F00 -FF00 -E600 -FD00 -D480 -4400 -ENDCHAR -STARTCHAR F997 -ENCODING 63895 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E900 -B600 -BB00 -F680 -BF80 -F680 -F680 -BB00 -2A00 -3200 -ENDCHAR -STARTCHAR F998 -ENCODING 63896 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -F700 -FF80 -BD00 -FF00 -7E00 -7E00 -7E00 -FF80 -0800 -ENDCHAR -STARTCHAR F999 -ENCODING 63897 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -C400 -3F00 -DF00 -1F00 -DF00 -7F80 -4400 -BF80 -ENDCHAR -STARTCHAR F99A -ENCODING 63898 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F80 -9F00 -5500 -1F00 -DF00 -4400 -7F80 -C400 -BF80 -ENDCHAR -STARTCHAR F99B -ENCODING 63899 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -7F80 -A400 -EF00 -5D00 -EF00 -E600 -ED00 -7480 -C400 -ENDCHAR -STARTCHAR F99C -ENCODING 63900 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -01 -F9 -45 -7D -4D -F5 -B5 -25 -41 -83 -ENDCHAR -STARTCHAR F99D -ENCODING 63901 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -2A -4B -9C -30 -C8 -FF -11 -31 -C6 -ENDCHAR -STARTCHAR F99E -ENCODING 63902 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -1F -D5 -D5 -DF -D5 -D7 -D9 -1F -11 -ENDCHAR -STARTCHAR F99F -ENCODING 63903 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4500 -7500 -9500 -D500 -6100 -8300 -4500 -9500 -9480 -ENDCHAR -STARTCHAR F9A0 -ENCODING 63904 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F900 -4500 -F500 -F500 -CB00 -0800 -FF80 -6600 -BB00 -6180 -ENDCHAR -STARTCHAR F9A1 -ENCODING 63905 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -EE00 -F100 -1F80 -F100 -F100 -0F00 -EA00 -EA80 -B300 -ENDCHAR -STARTCHAR F9A2 -ENCODING 63906 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -BC00 -FF00 -BF00 -FF80 -9500 -BF00 -B600 -D500 -ENDCHAR -STARTCHAR F9A3 -ENCODING 63907 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -2400 -7F00 -8180 -7E00 -0200 -6900 -A300 -BC80 -ENDCHAR -STARTCHAR F9A4 -ENCODING 63908 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -4A00 -FF00 -6080 -7F00 -4100 -C600 -6B00 -6980 -AE00 -ENDCHAR -STARTCHAR F9A5 -ENCODING 63909 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -E600 -8900 -FE80 -BF00 -FF00 -4000 -4A00 -9B00 -9480 -ENDCHAR -STARTCHAR F9A6 -ENCODING 63910 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -FF80 -FF00 -BF00 -FF80 -BF00 -B600 -D500 -ENDCHAR -STARTCHAR F9A7 -ENCODING 63911 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B500 -D500 -DF00 -EB00 -5F00 -C000 -DF00 -5F00 -5F80 -E580 -ENDCHAR -STARTCHAR F9A8 -ENCODING 63912 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -1800 -2400 -4300 -BD80 -0000 -7E00 -1100 -1200 -1000 -ENDCHAR -STARTCHAR F9A9 -ENCODING 63913 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -99 -A5 -FF -BF -93 -97 -FF -81 -ENDCHAR -STARTCHAR F9AA -ENCODING 63914 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -EA80 -7D00 -7F00 -5500 -FF80 -FF00 -0800 -1800 -ENDCHAR -STARTCHAR F9AB -ENCODING 63915 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -6F80 -9200 -FF00 -0F00 -FF00 -5F00 -7500 -4880 -ENDCHAR -STARTCHAR F9AC -ENCODING 63916 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -4A00 -F100 -EE80 -C000 -5F00 -4900 -4900 -4B00 -4800 -ENDCHAR -STARTCHAR F9AD -ENCODING 63917 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -EA00 -4900 -5F00 -E080 -5F00 -6900 -8900 -0B00 -0800 -ENDCHAR -STARTCHAR F9AE -ENCODING 63918 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -B700 -DB00 -6600 -9D00 -FF00 -8080 -7E00 -7E00 -0A00 -FF00 -ENDCHAR -STARTCHAR F9AF -ENCODING 63919 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -A400 -AA00 -E900 -5E80 -E000 -7F00 -C500 -4700 -8400 -ENDCHAR -STARTCHAR F9B0 -ENCODING 63920 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F400 -A600 -A900 -FE80 -A000 -FF00 -A500 -E500 -A700 -2400 -ENDCHAR -STARTCHAR F9B1 -ENCODING 63921 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4600 -6600 -9900 -EF80 -4000 -FF00 -D500 -E500 -7500 -C400 -ENDCHAR -STARTCHAR F9B2 -ENCODING 63922 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7F00 -FF00 -EE80 -7E00 -6600 -BD80 -7E00 -1100 -1600 -ENDCHAR -STARTCHAR F9B3 -ENCODING 63923 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -EE80 -6E00 -B500 -4A00 -FF00 -2900 -FF80 -ENDCHAR -STARTCHAR F9B4 -ENCODING 63924 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -4F80 -A400 -9F00 -6F00 -F900 -5F00 -5F00 -7F00 -4880 -ENDCHAR -STARTCHAR F9B5 -ENCODING 63925 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -41 -79 -53 -9B -AB -BB -8B -93 -91 -A3 -ENDCHAR -STARTCHAR F9B6 -ENCODING 63926 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E600 -1F00 -1F00 -FF00 -E000 -FF80 -EF00 -EF00 -C900 -5F80 -ENDCHAR -STARTCHAR F9B7 -ENCODING 63927 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F600 -4F00 -EF00 -AF00 -A000 -AF80 -9F00 -EF00 -E500 -9F80 -ENDCHAR -STARTCHAR F9B8 -ENCODING 63928 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -FF00 -4300 -FF80 -EF00 -0A80 -FB00 -E500 -DB00 -4480 -ENDCHAR -STARTCHAR F9B9 -ENCODING 63929 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -1400 -7700 -7700 -FF80 -0800 -A500 -A300 -BC80 -ENDCHAR -STARTCHAR F9BA -ENCODING 63930 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -02 -04 -08 -08 -08 -08 -08 -30 -ENDCHAR -STARTCHAR F9BB -ENCODING 63931 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -7F80 -6D00 -BF00 -A180 -9E00 -9E00 -9600 -A500 -A880 -ENDCHAR -STARTCHAR F9BC -ENCODING 63932 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -FE80 -2500 -7E00 -C380 -3E00 -3E00 -6E00 -9100 -ENDCHAR -STARTCHAR F9BD -ENCODING 63933 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -81 -FF -88 -F9 -9E -AA -A9 -59 -ENDCHAR -STARTCHAR F9BE -ENCODING 63934 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -DD00 -E500 -4100 -F900 -6500 -D780 -CF00 -4100 -4100 -ENDCHAR -STARTCHAR F9BF -ENCODING 63935 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4100 -9E00 -D700 -9E00 -FF80 -0800 -7F00 -2E00 -4980 -8800 -ENDCHAR -STARTCHAR F9C0 -ENCODING 63936 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -5F80 -FB00 -FF00 -F180 -5F00 -5F00 -AE00 -9500 -AC80 -ENDCHAR -STARTCHAR F9C1 -ENCODING 63937 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -FF00 -EB00 -5F00 -7280 -DE00 -5E00 -9700 -AC80 -ENDCHAR -STARTCHAR F9C2 -ENCODING 63938 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -FF00 -5700 -FF00 -A600 -D980 -6E00 -7C00 -6000 -ENDCHAR -STARTCHAR F9C3 -ENCODING 63939 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -2B00 -9F00 -3E80 -F200 -5E00 -6500 -CC00 -BF80 -ENDCHAR -STARTCHAR F9C4 -ENCODING 63940 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4800 -F700 -A700 -F100 -F700 -9700 -F700 -F700 -9880 -B700 -ENDCHAR -STARTCHAR F9C5 -ENCODING 63941 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -3C -FF -08 -7F -7F -3E -7F -ENDCHAR -STARTCHAR F9C6 -ENCODING 63942 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -A000 -C000 -DF00 -AA00 -AA00 -EA00 -9280 -A300 -ENDCHAR -STARTCHAR F9C7 -ENCODING 63943 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -41 -DB -D7 -FB -A3 -53 -FB -23 -69 -F3 -ENDCHAR -STARTCHAR F9C8 -ENCODING 63944 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -4500 -E900 -4900 -DF80 -E900 -4900 -4A00 -4A00 -7F80 -ENDCHAR -STARTCHAR F9C9 -ENCODING 63945 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -48 -5B -FB -5B -DB -FB -5B -7B -4A -52 -ENDCHAR -STARTCHAR F9CA -ENCODING 63946 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8400 -7F00 -0A00 -9700 -7900 -1A00 -5A00 -5A00 -AA80 -AB00 -ENDCHAR -STARTCHAR F9CB -ENCODING 63947 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -8F -7B -3D -A7 -1F -65 -5F -9F -A1 -ENDCHAR -STARTCHAR F9CC -ENCODING 63948 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF80 -4A00 -5F00 -E080 -5600 -7600 -9600 -1680 -2580 -ENDCHAR -STARTCHAR F9CD -ENCODING 63949 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -2F -E5 -95 -FB -00 -7F -7F -7F -41 -ENDCHAR -STARTCHAR F9CE -ENCODING 63950 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0400 -FF00 -4A00 -9F00 -E080 -B600 -B600 -B600 -F680 -2500 -ENDCHAR -STARTCHAR F9CF -ENCODING 63951 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -6F00 -C500 -6500 -FF80 -4900 -E900 -E900 -C900 -5F80 -ENDCHAR -STARTCHAR F9D0 -ENCODING 63952 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -D000 -EF80 -FF00 -6900 -DF00 -5F00 -F900 -4F00 -E500 -9880 -ENDCHAR -STARTCHAR F9D1 -ENCODING 63953 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -FF00 -0000 -0000 -2400 -2200 -4200 -C100 -8080 -ENDCHAR -STARTCHAR F9D2 -ENCODING 63954 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -DA00 -5B00 -AA00 -FF80 -D300 -AB00 -D200 -EA00 -B580 -C900 -ENDCHAR -STARTCHAR F9D3 -ENCODING 63955 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E400 -BF00 -C400 -DF80 -AA80 -B300 -E400 -9F00 -8400 -BF80 -ENDCHAR -STARTCHAR F9D4 -ENCODING 63956 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4C00 -5300 -5E80 -A000 -BF00 -6B00 -6B00 -7F00 -6B00 -6B00 -ENDCHAR -STARTCHAR F9D5 -ENCODING 63957 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8900 -FF00 -1800 -6600 -BD80 -0000 -7F00 -7F00 -9500 -9700 -ENDCHAR -STARTCHAR F9D6 -ENCODING 63958 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -8C00 -5300 -3E80 -8000 -BF00 -2B00 -6B00 -7F00 -AB00 -AB00 -ENDCHAR -STARTCHAR F9D7 -ENCODING 63959 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -E600 -4900 -FE80 -EF00 -F680 -F680 -EF00 -5680 -5700 -ENDCHAR -STARTCHAR F9D8 -ENCODING 63960 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -9F00 -C500 -7F80 -9F00 -8400 -7F00 -7F80 -4400 -4400 -ENDCHAR -STARTCHAR F9D9 -ENCODING 63961 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4000 -5F80 -DF00 -FB00 -DF00 -4400 -5F80 -4E00 -7580 -4400 -ENDCHAR -STARTCHAR F9DA -ENCODING 63962 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -FF -24 -FF -FF -08 -FF -6E -89 -08 -ENDCHAR -STARTCHAR F9DB -ENCODING 63963 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9100 -7600 -5A00 -9500 -B900 -FF80 -0800 -0800 -ENDCHAR -STARTCHAR F9DC -ENCODING 63964 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -AF00 -D600 -D980 -AE00 -B400 -DF00 -BF00 -8400 -BF80 -ENDCHAR -STARTCHAR F9DD -ENCODING 63965 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -31 -C5 -25 -F5 -65 -55 -B5 -A5 -21 -23 -ENDCHAR -STARTCHAR F9DE -ENCODING 63966 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -0800 -7F00 -4900 -7F00 -2800 -1000 -2C00 -C380 -ENDCHAR -STARTCHAR F9DF -ENCODING 63967 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -A800 -DF00 -AF00 -CF00 -CF00 -A600 -3F80 -ENDCHAR -STARTCHAR F9E0 -ENCODING 63968 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -7E -7E -42 -7E -20 -7F -B5 -49 -13 -ENDCHAR -STARTCHAR F9E1 -ENCODING 63969 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -1400 -6A00 -BF80 -0400 -0800 -FF00 -0800 -3800 -ENDCHAR -STARTCHAR F9E2 -ENCODING 63970 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -15 -E5 -F5 -75 -AB -08 -FF -18 -6E -89 -ENDCHAR -STARTCHAR F9E3 -ENCODING 63971 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -9F00 -6100 -9F00 -A000 -2900 -6B00 -AC00 -A880 -AF00 -ENDCHAR -STARTCHAR F9E4 -ENCODING 63972 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -5500 -5F00 -F500 -5F00 -4400 -7F00 -8400 -1F80 -ENDCHAR -STARTCHAR F9E5 -ENCODING 63973 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -7F80 -C900 -F300 -7B00 -D300 -FB00 -B500 -9100 -9300 -ENDCHAR -STARTCHAR F9E6 -ENCODING 63974 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF00 -FF00 -4800 -EA00 -FF00 -DF00 -5F00 -5200 -4F80 -ENDCHAR -STARTCHAR F9E7 -ENCODING 63975 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -0000 -7F00 -4900 -7F00 -FF00 -FF80 -2900 -FE00 -6180 -ENDCHAR -STARTCHAR F9E8 -ENCODING 63976 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F00 -5500 -F500 -3F00 -7500 -FF00 -FF00 -4400 -4400 -5F80 -ENDCHAR -STARTCHAR F9E9 -ENCODING 63977 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4900 -7E00 -4900 -7E00 -0800 -7F00 -0800 -FF80 -ENDCHAR -STARTCHAR F9EA -ENCODING 63978 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2500 -F500 -F780 -FA00 -F700 -4600 -F700 -F600 -9780 -B400 -ENDCHAR -STARTCHAR F9EB -ENCODING 63979 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -FF80 -FF00 -9C00 -FF00 -B000 -DE00 -9E00 -A000 -FF80 -ENDCHAR -STARTCHAR F9EC -ENCODING 63980 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -49 -BF -A4 -3F -6D -BB -CD -9B -ENDCHAR -STARTCHAR F9ED -ENCODING 63981 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF00 -2400 -1800 -3600 -C180 -7E00 -4200 -7E00 -4200 -ENDCHAR -STARTCHAR F9EE -ENCODING 63982 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5500 -4D00 -FF80 -CE00 -D580 -5900 -7B80 -CF80 -B100 -A100 -ENDCHAR -STARTCHAR F9EF -ENCODING 63983 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1500 -CD00 -5F80 -4E00 -D580 -5900 -7B80 -4F80 -9100 -2100 -ENDCHAR -STARTCHAR F9F0 -ENCODING 63984 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -FF80 -2400 -F700 -F700 -F700 -A900 -FF00 -E900 -B900 -B700 -ENDCHAR -STARTCHAR F9F1 -ENCODING 63985 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -F500 -AD00 -DF80 -CE00 -B580 -BD00 -DB80 -8F80 -9100 -A100 -ENDCHAR -STARTCHAR F9F2 -ENCODING 63986 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4D00 -ED00 -BF80 -EA00 -F580 -ED00 -F780 -9B80 -9900 -9100 -ENDCHAR -STARTCHAR F9F3 -ENCODING 63987 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2B00 -F700 -EF80 -F700 -FA80 -A500 -BB80 -E780 -B500 -F900 -ENDCHAR -STARTCHAR F9F4 -ENCODING 63988 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4200 -4200 -FF00 -4600 -6600 -DB00 -DB00 -CA80 -4200 -4200 -ENDCHAR -STARTCHAR F9F5 -ENCODING 63989 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -9200 -5200 -3F00 -9200 -BA00 -3F00 -5700 -9A80 -9200 -9200 -ENDCHAR -STARTCHAR F9F6 -ENCODING 63990 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -EF80 -D000 -EF00 -AF00 -A000 -FF80 -D680 -FF80 -9680 -ENDCHAR -STARTCHAR F9F7 -ENCODING 63991 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -0800 -FF00 -0000 -4200 -2200 -2400 -2400 -2400 -FF80 -ENDCHAR -STARTCHAR F9F8 -ENCODING 63992 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -AA00 -0800 -FF00 -0000 -2200 -2400 -2400 -FF80 -ENDCHAR -STARTCHAR F9F9 -ENCODING 63993 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -DF80 -E000 -4900 -E900 -6900 -DA00 -CA00 -4200 -5F80 -ENDCHAR -STARTCHAR F9FA -ENCODING 63994 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -A500 -A500 -A400 -FF80 -2400 -E600 -A600 -A900 -A900 -B080 -ENDCHAR -STARTCHAR F9FB -ENCODING 63995 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -1000 -3F00 -7600 -A800 -7900 -CA00 -4A00 -5400 -6200 -C180 -ENDCHAR -STARTCHAR F9FC -ENCODING 63996 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -CA00 -1F00 -F600 -FF80 -0200 -DF00 -DF00 -DD80 -D380 -8500 -ENDCHAR -STARTCHAR F9FD -ENCODING 63997 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -C400 -C400 -7F80 -4400 -4400 -4400 -4400 -4400 -4400 -ENDCHAR -STARTCHAR F9FE -ENCODING 63998 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2400 -FF80 -3C00 -3C00 -6A00 -8900 -7E00 -2A00 -4B00 -8900 -ENDCHAR -STARTCHAR F9FF -ENCODING 63999 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -21 -FB -23 -FB -AB -AB -FB -B3 -A9 -23 -ENDCHAR -STARTCHAR FA00 -ENCODING 64000 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -5F -45 -55 -E5 -45 -59 -69 -11 -17 -ENDCHAR -STARTCHAR FA01 -ENCODING 64001 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -9400 -FF00 -9C00 -8000 -FE00 -9400 -9C00 -E300 -ENDCHAR -STARTCHAR FA02 -ENCODING 64002 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -5F80 -4400 -E800 -4800 -6F00 -D900 -E900 -4900 -4F00 -C900 -ENDCHAR -STARTCHAR FA03 -ENCODING 64003 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4400 -FF80 -FF00 -5500 -FF80 -5F00 -FF00 -5900 -5900 -6F00 -ENDCHAR -STARTCHAR FA04 -ENCODING 64004 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 10 1 -1 -BITMAP -08 -FF -81 -8D -70 -1F -F0 -10 -11 -1F -ENDCHAR -STARTCHAR FA05 -ENCODING 64005 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -BF -61 -3F -A1 -2F -6B -AF -A1 -A3 -ENDCHAR -STARTCHAR FA06 -ENCODING 64006 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -7E00 -7E00 -7F00 -2400 -FF00 -ED80 -3E00 -D100 -ENDCHAR -STARTCHAR FA07 -ENCODING 64007 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -4F80 -F000 -4F00 -EF00 -E000 -DF00 -EA80 -FF00 -4F00 -4880 -ENDCHAR -STARTCHAR FA08 -ENCODING 64008 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -2000 -4F00 -A000 -4000 -5F80 -C200 -C200 -4200 -4200 -4600 -ENDCHAR -STARTCHAR FA09 -ENCODING 64009 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -E800 -AF00 -DA00 -CE00 -D580 -BF00 -B400 -F380 -9C00 -8400 -ENDCHAR -STARTCHAR FA0A -ENCODING 64010 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -7E00 -4200 -7E00 -4200 -7E00 -7E00 -1400 -2480 -C700 -ENDCHAR -STARTCHAR FA0B -ENCODING 64011 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -1 -BITMAP -0800 -FF80 -FB00 -BD00 -BD00 -8500 -FD00 -BC80 -D500 -3400 -ENDCHAR -STARTCHAR FF01 -ENCODING 65281 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 9 5 -1 -BITMAP -80 -80 -80 -80 -80 -80 -00 -80 -80 -ENDCHAR -STARTCHAR FF02 -ENCODING 65282 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 3 4 5 -BITMAP -C0 -C0 -C0 -ENDCHAR -STARTCHAR FF03 -ENCODING 65283 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -28 -28 -7C -28 -28 -FC -48 -50 -50 -ENDCHAR -STARTCHAR FF04 -ENCODING 65284 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -20 -70 -A0 -A0 -A0 -60 -30 -30 -30 -F0 -20 -ENDCHAR -STARTCHAR FF05 -ENCODING 65285 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 9 1 -1 -BITMAP -E200 -A400 -A400 -A800 -EB00 -1480 -1480 -2480 -2300 -ENDCHAR -STARTCHAR FF06 -ENCODING 65286 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -70 -48 -48 -50 -64 -94 -8C -88 -74 -ENDCHAR -STARTCHAR FF07 -ENCODING 65287 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 3 5 5 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR FF08 -ENCODING 65288 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 11 7 -2 -BITMAP -20 -40 -40 -80 -80 -80 -80 -80 -40 -40 -20 -ENDCHAR -STARTCHAR FF09 -ENCODING 65289 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 1 -2 -BITMAP -80 -80 -40 -40 -40 -40 -40 -40 -40 -80 -80 -ENDCHAR -STARTCHAR FF0A -ENCODING 65290 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 4 3 2 -BITMAP -20 -D0 -60 -50 -ENDCHAR -STARTCHAR FF0B -ENCODING 65291 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 6 2 1 -BITMAP -10 -10 -FC -10 -10 -10 -ENDCHAR -STARTCHAR FF0C -ENCODING 65292 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 2 0 -2 -BITMAP -40 -80 -ENDCHAR -STARTCHAR FF0D -ENCODING 65293 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 1 4 4 -BITMAP -E0 -ENDCHAR -STARTCHAR FF0E -ENCODING 65294 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 1 1 -1 -BITMAP -80 -ENDCHAR -STARTCHAR FF0F -ENCODING 65295 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -10 -10 -20 -20 -20 -40 -40 -40 -80 -ENDCHAR -STARTCHAR FF10 -ENCODING 65296 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -38 -48 -44 -84 -84 -84 -44 -48 -38 -ENDCHAR -STARTCHAR FF11 -ENCODING 65297 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 9 4 -1 -BITMAP -40 -C0 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR FF12 -ENCODING 65298 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -70 -90 -08 -10 -10 -20 -40 -80 -F8 -ENDCHAR -STARTCHAR FF13 -ENCODING 65299 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -F0 -18 -08 -10 -60 -10 -08 -18 -F0 -ENDCHAR -STARTCHAR FF14 -ENCODING 65300 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -08 -18 -28 -28 -48 -88 -FC -08 -08 -ENDCHAR -STARTCHAR FF15 -ENCODING 65301 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -F0 -80 -80 -F0 -10 -08 -08 -10 -E0 -ENDCHAR -STARTCHAR FF16 -ENCODING 65302 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -78 -80 -80 -F0 -88 -88 -88 -98 -70 -ENDCHAR -STARTCHAR FF17 -ENCODING 65303 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -F8 -08 -10 -10 -20 -20 -20 -40 -40 -ENDCHAR -STARTCHAR FF18 -ENCODING 65304 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -38 -44 -44 -48 -38 -44 -84 -44 -78 -ENDCHAR -STARTCHAR FF19 -ENCODING 65305 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -F0 -88 -88 -88 -F8 -08 -08 -10 -E0 -ENDCHAR -STARTCHAR FF1A -ENCODING 65306 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 6 5 1 -BITMAP -80 -00 -00 -00 -00 -80 -ENDCHAR -STARTCHAR FF1B -ENCODING 65307 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 8 4 -1 -BITMAP -40 -00 -00 -00 -00 -00 -40 -80 -ENDCHAR -STARTCHAR FF1C -ENCODING 65308 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -10 -10 -20 -40 -80 -80 -80 -40 -20 -10 -10 -ENDCHAR -STARTCHAR FF1D -ENCODING 65309 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 4 2 2 -BITMAP -FC -00 -00 -FC -ENDCHAR -STARTCHAR FF1E -ENCODING 65310 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 11 3 -2 -BITMAP -80 -80 -40 -20 -10 -10 -10 -20 -40 -80 -80 -ENDCHAR -STARTCHAR FF1F -ENCODING 65311 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -E0 -10 -10 -10 -20 -20 -40 -00 -40 -ENDCHAR -STARTCHAR FF20 -ENCODING 65312 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -3C -43 -9B -A5 -A5 -A5 -BE -41 -3E -ENDCHAR -STARTCHAR FF21 -ENCODING 65313 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -08 -18 -14 -24 -22 -3E -42 -41 -81 -ENDCHAR -STARTCHAR FF22 -ENCODING 65314 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -F0 -90 -90 -90 -E0 -90 -88 -90 -F0 -ENDCHAR -STARTCHAR FF23 -ENCODING 65315 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -3C -40 -80 -80 -80 -80 -80 -40 -3C -ENDCHAR -STARTCHAR FF24 -ENCODING 65316 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -F0 -88 -84 -84 -84 -84 -84 -88 -F0 -ENDCHAR -STARTCHAR FF25 -ENCODING 65317 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -F0 -80 -80 -80 -F0 -80 -80 -80 -F0 -ENDCHAR -STARTCHAR FF26 -ENCODING 65318 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -F0 -80 -80 -80 -F0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR FF27 -ENCODING 65319 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -3C -40 -80 -80 -9E -82 -82 -42 -3E -ENDCHAR -STARTCHAR FF28 -ENCODING 65320 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -84 -84 -84 -84 -FC -84 -84 -84 -84 -ENDCHAR -STARTCHAR FF29 -ENCODING 65321 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 9 5 -1 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR FF2A -ENCODING 65322 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 9 4 -1 -BITMAP -20 -20 -20 -20 -20 -20 -20 -40 -C0 -ENDCHAR -STARTCHAR FF2B -ENCODING 65323 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -88 -88 -90 -A0 -A0 -D0 -90 -88 -84 -ENDCHAR -STARTCHAR FF2C -ENCODING 65324 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -F0 -ENDCHAR -STARTCHAR FF2D -ENCODING 65325 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 9 1 -1 -BITMAP -81 -C3 -C3 -A3 -A5 -A5 -95 -99 -89 -ENDCHAR -STARTCHAR FF2E -ENCODING 65326 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -84 -C4 -A4 -A4 -94 -94 -8C -84 -84 -ENDCHAR -STARTCHAR FF2F -ENCODING 65327 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -78 -C4 -84 -82 -82 -82 -82 -C4 -78 -ENDCHAR -STARTCHAR FF30 -ENCODING 65328 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -F0 -90 -88 -90 -F0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR FF31 -ENCODING 65329 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 10 2 -2 -BITMAP -78 -C4 -82 -82 -82 -82 -84 -C4 -78 -04 -ENDCHAR -STARTCHAR FF32 -ENCODING 65330 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -F8 -88 -88 -88 -F0 -90 -88 -88 -84 -ENDCHAR -STARTCHAR FF33 -ENCODING 65331 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -70 -80 -80 -C0 -20 -10 -10 -10 -E0 -ENDCHAR -STARTCHAR FF34 -ENCODING 65332 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -FC -10 -10 -10 -10 -10 -10 -10 -10 -ENDCHAR -STARTCHAR FF35 -ENCODING 65333 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -84 -84 -84 -84 -84 -84 -84 -44 -78 -ENDCHAR -STARTCHAR FF36 -ENCODING 65334 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 7 9 2 -1 -BITMAP -82 -84 -84 -44 -48 -48 -28 -30 -10 -ENDCHAR -STARTCHAR FF37 -ENCODING 65335 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -8440 -8C40 -4C40 -4A40 -5280 -5280 -5280 -3100 -2100 -ENDCHAR -STARTCHAR FF38 -ENCODING 65336 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -84 -44 -48 -30 -10 -30 -48 -44 -84 -ENDCHAR -STARTCHAR FF39 -ENCODING 65337 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 9 2 -1 -BITMAP -84 -44 -48 -28 -30 -10 -10 -10 -10 -ENDCHAR -STARTCHAR FF3A -ENCODING 65338 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 -1 -BITMAP -F8 -10 -10 -20 -20 -40 -80 -80 -F8 -ENDCHAR -STARTCHAR FF3B -ENCODING 65339 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 8 -2 -BITMAP -C0 -80 -80 -80 -80 -80 -80 -80 -80 -80 -C0 -ENDCHAR -STARTCHAR FF3C -ENCODING 65340 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 10 1 -2 -BITMAP -8000 -8000 -4000 -2000 -1000 -0800 -0400 -0200 -0100 -0080 -ENDCHAR -STARTCHAR FF3D -ENCODING 65341 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 1 -2 -BITMAP -C0 -40 -40 -40 -40 -40 -40 -40 -40 -40 -C0 -ENDCHAR -STARTCHAR FF3E -ENCODING 65342 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 5 2 3 -BITMAP -10 -30 -48 -48 -84 -ENDCHAR -STARTCHAR FF3F -ENCODING 65343 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 1 2 -2 -BITMAP -FC -ENDCHAR -STARTCHAR FF40 -ENCODING 65344 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 2 4 7 -BITMAP -80 -40 -ENDCHAR -STARTCHAR FF41 -ENCODING 65345 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 7 3 -1 -BITMAP -F0 -10 -10 -70 -90 -90 -F0 -ENDCHAR -STARTCHAR FF42 -ENCODING 65346 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 9 3 0 -BITMAP -80 -80 -F0 -90 -88 -88 -88 -90 -F0 -ENDCHAR -STARTCHAR FF43 -ENCODING 65347 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 7 3 -1 -BITMAP -70 -C0 -80 -80 -80 -C0 -70 -ENDCHAR -STARTCHAR FF44 -ENCODING 65348 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 10 3 -1 -BITMAP -08 -08 -08 -78 -98 -88 -88 -88 -98 -68 -ENDCHAR -STARTCHAR FF45 -ENCODING 65349 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 -1 -BITMAP -70 -90 -88 -F8 -80 -80 -70 -ENDCHAR -STARTCHAR FF46 -ENCODING 65350 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 10 3 -1 -BITMAP -30 -20 -40 -F0 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR FF47 -ENCODING 65351 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 8 3 -2 -BITMAP -F8 -98 -88 -88 -98 -78 -10 -F0 -ENDCHAR -STARTCHAR FF48 -ENCODING 65352 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 10 3 -1 -BITMAP -80 -80 -80 -F0 -90 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR FF49 -ENCODING 65353 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 10 5 -1 -BITMAP -80 -00 -00 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR FF4A -ENCODING 65354 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 4 -2 -BITMAP -40 -00 -00 -40 -40 -40 -40 -40 -40 -40 -C0 -ENDCHAR -STARTCHAR FF4B -ENCODING 65355 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 10 3 -1 -BITMAP -80 -80 -80 -90 -A0 -A0 -C0 -A0 -90 -90 -ENDCHAR -STARTCHAR FF4C -ENCODING 65356 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 10 5 -1 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR FF4D -ENCODING 65357 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 8 7 1 -1 -BITMAP -F7 -89 -89 -89 -89 -89 -89 -ENDCHAR -STARTCHAR FF4E -ENCODING 65358 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 -1 -BITMAP -F0 -90 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR FF4F -ENCODING 65359 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 7 2 -1 -BITMAP -38 -4C -84 -84 -84 -4C -38 -ENDCHAR -STARTCHAR FF50 -ENCODING 65360 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 8 3 -2 -BITMAP -70 -90 -88 -88 -90 -F0 -80 -80 -ENDCHAR -STARTCHAR FF51 -ENCODING 65361 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 8 3 -2 -BITMAP -78 -98 -88 -88 -98 -78 -08 -08 -ENDCHAR -STARTCHAR FF52 -ENCODING 65362 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 7 4 -1 -BITMAP -E0 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR FF53 -ENCODING 65363 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 7 3 -1 -BITMAP -70 -80 -C0 -20 -10 -10 -E0 -ENDCHAR -STARTCHAR FF54 -ENCODING 65364 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 9 3 -1 -BITMAP -40 -40 -F0 -40 -40 -40 -40 -40 -30 -ENDCHAR -STARTCHAR FF55 -ENCODING 65365 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 -1 -BITMAP -88 -88 -88 -88 -88 -98 -E8 -ENDCHAR -STARTCHAR FF56 -ENCODING 65366 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 5 7 3 -1 -BITMAP -88 -90 -90 -50 -60 -60 -20 -ENDCHAR -STARTCHAR FF57 -ENCODING 65367 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 7 1 -1 -BITMAP -8880 -9900 -9900 -5500 -6500 -6600 -6200 -ENDCHAR -STARTCHAR FF58 -ENCODING 65368 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 7 3 -1 -BITMAP -90 -50 -60 -20 -60 -90 -90 -ENDCHAR -STARTCHAR FF59 -ENCODING 65369 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 8 3 -2 -BITMAP -90 -90 -50 -60 -60 -20 -40 -C0 -ENDCHAR -STARTCHAR FF5A -ENCODING 65370 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 4 7 3 -1 -BITMAP -F0 -10 -20 -20 -40 -80 -F0 -ENDCHAR -STARTCHAR FF5B -ENCODING 65371 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 3 11 7 -2 -BITMAP -60 -40 -40 -40 -40 -80 -40 -40 -40 -40 -60 -ENDCHAR -STARTCHAR FF5C -ENCODING 65372 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 1 11 5 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR FF5D -ENCODING 65373 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 2 11 1 -2 -BITMAP -80 -80 -80 -80 -40 -40 -40 -80 -80 -80 -80 -ENDCHAR -STARTCHAR FF5E -ENCODING 65374 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 3 2 2 -BITMAP -60 -94 -08 -ENDCHAR -STARTCHAR FFE0 -ENCODING 65504 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 0 -BITMAP -38 -4C -90 -90 -94 -64 -38 -40 -ENDCHAR -STARTCHAR FFE1 -ENCODING 65505 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -38 -44 -40 -FC -20 -E4 -B4 -CC -ENDCHAR -STARTCHAR FFE2 -ENCODING 65506 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 9 4 1 -2 -BITMAP -FF80 -0080 -0080 -0080 -ENDCHAR -STARTCHAR FFE3 -ENCODING 65507 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 0 0 0 8 -BITMAP -ENDCHAR -STARTCHAR FFE5 -ENCODING 65509 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 6 8 2 -1 -BITMAP -84 -48 -FC -30 -FC -10 -10 -10 -ENDCHAR -STARTCHAR FFE6 -ENCODING 65510 -SWIDTH 900 0 -DWIDTH 10 0 -BBX 10 9 0 -1 -BITMAP -4480 -4C80 -4C80 -FFC0 -2A80 -3300 -3300 -1300 -1100 -ENDCHAR -ENDFONT diff --git a/buildroot/share/fonts/README.md b/buildroot/share/fonts/README.md index b80de8e26e..ee9d8e00bb 100644 --- a/buildroot/share/fonts/README.md +++ b/buildroot/share/fonts/README.md @@ -1,10 +1,11 @@ # Marlin fonts + ## Author and license The original author of the following font files is [A. Hardtung](https://github.com/AnHardt). Any copyright is dedicated to the Public Domain. -https://creativecommons.org/publicdomain/zero/1.0/ +http://creativecommons.org/publicdomain/zero/1.0/ - HD44780_C.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) - HD44780_J.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) @@ -15,7 +16,8 @@ https://creativecommons.org/publicdomain/zero/1.0/ - ISO10646_Kana.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) - Marlin_symbols.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) -Additional changes to the original font files distributed with Marlin are copyrighted under the terms of the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.txt) license. +Additional changes to the original font files being distritubted with Marlin are copyrighted under the terms of the [GPLv3](http://www.gnu.org/licenses/gpl-3.0.txt) license. + ## Documentation -For detailed information about adding new fonts to Marlin [see this article](https://marlinfw.org/docs/development/fonts.html). +For detailed information about [adding new fonts](http://www.marlinfw.org/docs/development/fonts.html) to Marlin visit our documentation website. diff --git a/buildroot/share/fonts/genallfont.sh b/buildroot/share/fonts/genallfont.sh index 66f8e2c84f..cc0e3f27b8 100755 --- a/buildroot/share/fonts/genallfont.sh +++ b/buildroot/share/fonts/genallfont.sh @@ -29,81 +29,66 @@ DN_EXEC=$(dirname $(my_getpath "$0") ) EXEC_WXGGEN="${DN_EXEC}/uxggenpages.sh" -# -# Locate the bdf2u8g command -# EXEC_BDF2U8G=`which bdf2u8g` [ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G="${DN_EXEC}/bdf2u8g" [ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G="${PWD}/bdf2u8g" [ -x "${EXEC_BDF2U8G}" ] || { EOL=$'\n' ; echo "ERR: Can't find bdf2u8g!${EOL}See uxggenpages.md for bdf2u8g build instructions." >&2 ; exit 1; } -# -# Get language arguments -# -LANG_ARG="$@" - -# -# Use 6x12 combined font data for Western languages -# +#FN_FONT="${1:-}" FN_FONT="${DN_EXEC}/marlin-6x12-3.bdf" +[ "$1" = "" ] || FN_FONT="$1" -# -# Change to working directory 'Marlin' -# -OLDWD=`pwd` -[[ $(basename "$OLDWD") != 'Marlin' && -d "Marlin" ]] && cd Marlin -[[ -f "Configuration.h" ]] || { echo -n "cd to the 'Marlin' folder to run " ; basename $0 ; exit 1; } +DN_FONT0=`dirname ${FN_FONT}` +DN_FONT="$(my_getpath ${DN_FONT0})" +FN_FONT="$(my_getpath "${DN_FONT}")/"`basename ${FN_FONT}` +[ -z "${FN_FONT}" ] && FN_FONT=${DN_DATA}/../${FN_FONT_BASE}.bdf +[ -f "${FN_FONT}" ] || FN_FONT=${DN_EXEC}/${FN_FONT_BASE}.bdf +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/wenquanyi/${FN_FONT_BASE}.bdf" +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/X11/misc/${FN_FONT_BASE}.bdf" +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/misc/${FN_FONT_BASE}.bdf" +#echo "genallfont.sh: FN_FONT=${FN_FONT}" + +DN_WORK=./tmp1 -# -# Compile the 'genpages' command in-place -# (cd ${DN_EXEC}; gcc -o genpages genpages.c getline.c) -# -# By default loop through all languages -# -LANGS_DEFAULT="an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana ko_KR nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test" +LANGS_DEFAULT="an bg ca zh_CN zh_TW cz da de el el-gr en es eu fi fr gl hr it jp-kana nl pl pt pt-br ru sk tr uk test" -# -# Generate data for language list MARLIN_LANGS or all if not provided -# -for LANG in ${LANG_ARG:=$LANGS_DEFAULT} ; do +for LANG in ${MARLIN_LANGS:=$LANGS_DEFAULT} ; do echo "Generating Marlin language data for '${LANG}'" >&2 - case "$LANG" in - zh_* ) FONTFILE="wenquanyi_12pt" ;; - ko_* ) FONTFILE="${DN_EXEC}/NanumGothic.bdf" ;; - * ) FONTFILE="${DN_EXEC}/marlin-6x12-3.bdf" ;; - esac - DN_WORK=`mktemp -d` + rm -rf ${DN_WORK}/ + mkdir -p ${DN_WORK} cp Configuration.h ${DN_WORK}/ cp src/lcd/language/language_${LANG}.h ${DN_WORK}/ - cd "${DN_WORK}" - ${EXEC_WXGGEN} "${FONTFILE}" + cd ${DN_WORK}/ + ${EXEC_WXGGEN} "${FN_FONT}" sed -i fontutf8-data.h -e 's|fonts//|fonts/|g' -e 's|fonts//|fonts/|g' -e 's|[/0-9a-zA-Z_\-]*buildroot/share/fonts|buildroot/share/fonts|' 2>/dev/null - cd - >/dev/null - mv ${DN_WORK}/fontutf8-data.h src/lcd/dogm/fontdata/langdata_${LANG}.h - rm -rf ${DN_WORK} + cd ../ + mv ${DN_WORK}/fontutf8-data.h src/lcd/dogm/language_data_${LANG}.h + rm -rf ${DN_WORK}/ done # # Generate default ASCII font (char range 0-255): -# Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h +# Marlin/src/lcd/dogm/dogm_font_data_ISO10646_1.h # #if [ "${MARLIN_LANGS}" == "${LANGS_DEFAULT}" ]; then if [ 1 = 1 ]; then - DN_WORK=`mktemp -d` - cd ${DN_WORK} + rm -rf ${DN_WORK}/ + mkdir -p ${DN_WORK} + cd ${DN_WORK}/ ${EXEC_BDF2U8G} -b 1 -e 127 ${FN_FONT} ISO10646_1_5x7 tmp1.h >/dev/null ${EXEC_BDF2U8G} -b 1 -e 255 ${FN_FONT} ISO10646_1_5x7 tmp2.h >/dev/null - TMP1=$(cat tmp1.h) - TMP2=$(cat tmp2.h) - cd - >/dev/null - rm -rf ${DN_WORK} + TMP1=$(cat tmp1.h) ; rm tmp1.h + TMP2=$(cat tmp2.h) ; rm tmp2.h - cat <src/lcd/dogm/fontdata/fontdata_ISO10646_1.h + cat <../src/lcd/dogm/dogm_font_data_ISO10646_1.h /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -116,7 +101,7 @@ if [ 1 = 1 ]; then * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . * */ #include @@ -133,8 +118,6 @@ $TMP2 #endif EOF + rmdir ../${DN_WORK} + cd - >/dev/null fi - -(cd ${DN_EXEC}; rm genpages) - -cd "$OLDWD" diff --git a/buildroot/share/fonts/genpages.c b/buildroot/share/fonts/genpages.c index 2a87b19d47..c18ecd9fa8 100644 --- a/buildroot/share/fonts/genpages.c +++ b/buildroot/share/fonts/genpages.c @@ -157,7 +157,7 @@ uint8_t* get_utf8_value(uint8_t *pstart, wchar_t *pval) { } void usage(char* progname) { - fprintf(stderr, "usage: %s\n", progname); + fprintf(stderr, "Usage: %s\n", progname); fprintf(stderr, " read data from stdin\n"); } diff --git a/buildroot/share/fonts/get-bdf2u8g.sh b/buildroot/share/fonts/get-bdf2u8g.sh index 5851bf93e3..e7dca2bef4 100755 --- a/buildroot/share/fonts/get-bdf2u8g.sh +++ b/buildroot/share/fonts/get-bdf2u8g.sh @@ -12,10 +12,6 @@ HERE=$(pwd) -for CMD in curl unzip patch make; do - which $CMD >/dev/null || { echo "'$CMD' is required for this script." ; exit 1 ; } -done - [[ $HERE =~ 'buildroot/share/fonts'$ ]] || { echo "Change to buildroot/share/fonts to run $(basename $0)" ; exit 1; } # Download u8glib diff --git a/buildroot/share/fonts/getline.h b/buildroot/share/fonts/getline.h index f21f8ce29f..180a218dc7 100644 --- a/buildroot/share/fonts/getline.h +++ b/buildroot/share/fonts/getline.h @@ -1,5 +1,6 @@ + #ifndef MYGETLINE_H -#define MYGETLINE_H +#define MYGETLINE_H 1 //#include "config.h" @@ -10,3 +11,4 @@ #endif #endif // MYGETLINE_H + diff --git a/buildroot/share/fonts/marlin-6x12-1.bdf b/buildroot/share/fonts/marlin-6x12-1.bdf index b40fce0152..11609c13d8 100644 --- a/buildroot/share/fonts/marlin-6x12-1.bdf +++ b/buildroot/share/fonts/marlin-6x12-1.bdf @@ -108,14 +108,17 @@ STARTCHAR uni0006 ENCODING 6 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 1 +BBX 5 9 0 -1 BITMAP E0 -8C -EA -8C -8A -0A +80 +C0 +B0 +A8 +28 +30 +28 +28 ENDCHAR STARTCHAR uni0007 ENCODING 7 @@ -1643,7 +1646,7 @@ STARTCHAR twosuperior ENCODING 178 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -1655,7 +1658,7 @@ STARTCHAR threesuperior ENCODING 179 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP C0 20 @@ -1724,7 +1727,7 @@ STARTCHAR onesuperior ENCODING 185 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 C0 @@ -26789,7 +26792,7 @@ STARTCHAR zerosuperior ENCODING 8304 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -26813,7 +26816,7 @@ STARTCHAR foursuperior ENCODING 8308 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 80 80 @@ -26825,7 +26828,7 @@ STARTCHAR fivesuperior ENCODING 8309 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP E0 80 @@ -26837,7 +26840,7 @@ STARTCHAR sixsuperior ENCODING 8310 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 60 80 @@ -26849,7 +26852,7 @@ STARTCHAR sevensuperior ENCODING 8311 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP E0 20 @@ -26861,7 +26864,7 @@ STARTCHAR eightsuperior ENCODING 8312 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -26873,7 +26876,7 @@ STARTCHAR ninesuperior ENCODING 8313 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -26913,7 +26916,7 @@ STARTCHAR parenleftsuperior ENCODING 8317 SWIDTH 480 0 DWIDTH 6 0 -BBX 2 5 1 4 +BBX 2 5 1 5 BITMAP 40 80 @@ -26925,7 +26928,7 @@ STARTCHAR parenrightsuperior ENCODING 8318 SWIDTH 480 0 DWIDTH 6 0 -BBX 2 5 1 4 +BBX 2 5 1 5 BITMAP 80 40 @@ -26937,7 +26940,7 @@ STARTCHAR nsuperior ENCODING 8319 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 4 1 4 +BBX 3 4 1 5 BITMAP C0 A0 diff --git a/buildroot/share/fonts/marlin-6x12-2.bdf b/buildroot/share/fonts/marlin-6x12-2.bdf index d36a6e9f63..9a612e3fb4 100644 --- a/buildroot/share/fonts/marlin-6x12-2.bdf +++ b/buildroot/share/fonts/marlin-6x12-2.bdf @@ -108,14 +108,17 @@ STARTCHAR uni0006 ENCODING 6 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 1 +BBX 5 9 0 -1 BITMAP E0 -8C -EA -8C -8A -0A +80 +C0 +B0 +A8 +28 +30 +28 +28 ENDCHAR STARTCHAR uni0007 ENCODING 7 @@ -1641,7 +1644,7 @@ STARTCHAR twosuperior ENCODING 178 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -1653,7 +1656,7 @@ STARTCHAR threesuperior ENCODING 179 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP C0 20 @@ -1722,7 +1725,7 @@ STARTCHAR onesuperior ENCODING 185 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 C0 @@ -26787,7 +26790,7 @@ STARTCHAR zerosuperior ENCODING 8304 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -26811,7 +26814,7 @@ STARTCHAR foursuperior ENCODING 8308 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 80 80 @@ -26823,7 +26826,7 @@ STARTCHAR fivesuperior ENCODING 8309 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP E0 80 @@ -26835,7 +26838,7 @@ STARTCHAR sixsuperior ENCODING 8310 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 60 80 @@ -26847,7 +26850,7 @@ STARTCHAR sevensuperior ENCODING 8311 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP E0 20 @@ -26859,7 +26862,7 @@ STARTCHAR eightsuperior ENCODING 8312 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -26871,7 +26874,7 @@ STARTCHAR ninesuperior ENCODING 8313 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -26911,7 +26914,7 @@ STARTCHAR parenleftsuperior ENCODING 8317 SWIDTH 480 0 DWIDTH 6 0 -BBX 2 5 1 4 +BBX 2 5 1 5 BITMAP 40 80 @@ -26923,7 +26926,7 @@ STARTCHAR parenrightsuperior ENCODING 8318 SWIDTH 480 0 DWIDTH 6 0 -BBX 2 5 1 4 +BBX 2 5 1 5 BITMAP 80 40 @@ -26935,7 +26938,7 @@ STARTCHAR nsuperior ENCODING 8319 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 4 1 4 +BBX 3 4 1 5 BITMAP C0 A0 diff --git a/buildroot/share/fonts/marlin-6x12-3.bdf b/buildroot/share/fonts/marlin-6x12-3.bdf index bc7a8827c0..0dc909c5f4 100644 --- a/buildroot/share/fonts/marlin-6x12-3.bdf +++ b/buildroot/share/fonts/marlin-6x12-3.bdf @@ -1,10 +1,9 @@ STARTFONT 2.1 -FONT -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 +FONT -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 SIZE 12 75 75 -FONTBOUNDINGBOX 12 15 0 -2 -COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +FONTBOUNDINGBOX 6 12 0 -2 COMMENT "Marlin 6x12 Fixed, for menu display" -COMMENT "This font is based on the X Windows' 6x12 '-Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1'. Marlin symbols added at position 1-9. Added jp-kana data. Other missing char data from wqy-bitmapsong-bdf-1.0.0-RC1. Some chars tweaked for LCD display, such as ',;c69' etc." +COMMENT "This font is base on the X Windows' 6x12 '-Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1', added Marlin symbols at position 1-9, added jp-kana data, the other missing char data were from wqy-bitmapsong-bdf-1.0.0-RC1; some chars were tweak for display on LCD screen, such as ',;c69' etc." STARTPROPERTIES 23 FONTNAME_REGISTRY "" FOUNDRY "Marlin" @@ -14,9 +13,9 @@ SLANT "R" SETWIDTH_NAME "SemiCondensed" ADD_STYLE_NAME "" PIXEL_SIZE 12 -POINT_SIZE 90 -RESOLUTION_X 100 -RESOLUTION_Y 100 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 SPACING "C" AVERAGE_WIDTH 60 CHARSET_REGISTRY "ISO10646" @@ -30,7 +29,8 @@ DEFAULT_CHAR 0 FONT_DESCENT 2 FONT_ASCENT 10 ENDPROPERTIES -CHARS 33809 +CHARS 33727 + STARTCHAR uni0001 ENCODING 1 SWIDTH 545 0 @@ -106,15 +106,19 @@ B8 ENDCHAR STARTCHAR uni0006 ENCODING 6 -SWIDTH 504 0 -DWIDTH 7 0 -BBX 8 5 0 1 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 BITMAP -D8 -6C -36 -6C -D8 +E0 +80 +C0 +B0 +A8 +28 +30 +28 +28 ENDCHAR STARTCHAR uni0007 ENCODING 7 @@ -1640,7 +1644,7 @@ STARTCHAR twosuperior ENCODING 178 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -1652,7 +1656,7 @@ STARTCHAR threesuperior ENCODING 179 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP C0 20 @@ -1721,7 +1725,7 @@ STARTCHAR onesuperior ENCODING 185 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 C0 @@ -19347,6 +19351,7 @@ BITMAP 48 90 ENDCHAR + STARTCHAR U_1100 ENCODING 4352 SWIDTH 1000 0 @@ -19679,6 +19684,7 @@ BITMAP 5220 89C0 ENDCHAR + STARTCHAR uni1680 ENCODING 5760 SWIDTH 480 0 @@ -22356,1402 +22362,6 @@ BITMAP 40 80 ENDCHAR -STARTCHAR uni1EA0 -ENCODING 7840 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 -2 -BITMAP -20 -50 -88 -88 -F8 -88 -88 -00 -20 -ENDCHAR -STARTCHAR uni1EA1 -ENCODING 7841 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 7 0 -2 -BITMAP -70 -08 -78 -88 -78 -00 -20 -ENDCHAR -STARTCHAR uni1EA2 -ENCODING 7842 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -18 -08 -10 -20 -50 -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR uni1EA3 -ENCODING 7843 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 0 -BITMAP -30 -10 -20 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR uni1EA4 -ENCODING 7844 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -04 -28 -50 -20 -50 -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR uni1EA5 -ENCODING 7845 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -04 -08 -30 -48 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR uni1EA6 -ENCODING 7846 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -08 -24 -50 -20 -50 -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR uni1EA7 -ENCODING 7847 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -10 -08 -30 -48 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR uni1EA8 -ENCODING 7848 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -0C -04 -28 -50 -20 -50 -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR uni1EA9 -ENCODING 7849 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -0C -04 -08 -30 -48 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR uni1EAA -ENCODING 7850 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -28 -50 -20 -50 -00 -70 -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR uni1EAB -ENCODING 7851 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -28 -50 -00 -30 -48 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR uni1EAC -ENCODING 7852 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 -1 -BITMAP -20 -50 -00 -70 -88 -88 -F8 -88 -88 -20 -ENDCHAR -STARTCHAR uni1EAD -ENCODING 7853 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 -2 -BITMAP -30 -48 -00 -70 -08 -78 -88 -78 -00 -20 -ENDCHAR -STARTCHAR uni1EAE -ENCODING 7854 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -10 -20 -88 -70 -00 -70 -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR uni1EAF -ENCODING 7855 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -08 -10 -48 -30 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR uni1EB0 -ENCODING 7856 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -40 -20 -88 -70 -00 -70 -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR uni1EB1 -ENCODING 7857 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -40 -20 -48 -30 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR uni1EB2 -ENCODING 7858 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -30 -10 -A8 -70 -00 -70 -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR uni1EB3 -ENCODING 7859 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -18 -08 -10 -48 -30 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR uni1EB4 -ENCODING 7860 -SWIDTH 500 0 -DWIDTH 6 0 -BBX 5 11 0 0 -BITMAP -28 -50 -88 -70 -00 -70 -88 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR uni1EB5 -ENCODING 7861 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -14 -28 -00 -48 -30 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR uni1EB6 -ENCODING 7862 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 -1 -BITMAP -88 -70 -00 -70 -88 -88 -F8 -88 -88 -20 -ENDCHAR -STARTCHAR uni1EB7 -ENCODING 7863 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 -2 -BITMAP -48 -30 -00 -70 -08 -78 -88 -78 -00 -20 -ENDCHAR -STARTCHAR uni1EB8 -ENCODING 7864 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 -2 -BITMAP -F8 -80 -80 -F0 -80 -80 -F8 -00 -20 -ENDCHAR -STARTCHAR uni1EB9 -ENCODING 7865 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 7 0 -2 -BITMAP -70 -88 -F0 -80 -78 -00 -20 -ENDCHAR -STARTCHAR uni1EBA -ENCODING 7866 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -30 -10 -20 -00 -F8 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR uni1EBB -ENCODING 7867 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 0 -BITMAP -30 -10 -20 -00 -70 -88 -F0 -80 -78 -ENDCHAR -STARTCHAR uni1EBC -ENCODING 7868 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -28 -50 -00 -F8 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR uni1EBD -ENCODING 7869 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 8 0 0 -BITMAP -28 -50 -00 -70 -88 -F0 -80 -78 -ENDCHAR -STARTCHAR uni1EBE -ENCODING 7870 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -02 -24 -50 -00 -F8 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR uni1EBF -ENCODING 7871 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -04 -08 -20 -50 -00 -70 -88 -F0 -80 -78 -ENDCHAR -STARTCHAR uni1EC0 -ENCODING 7872 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -08 -24 -50 -00 -F8 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR uni1EC1 -ENCODING 7873 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -10 -08 -20 -50 -00 -70 -88 -F0 -80 -78 -ENDCHAR -STARTCHAR uni1EC2 -ENCODING 7874 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -0C -24 -58 -00 -F8 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR uni1EC3 -ENCODING 7875 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -18 -08 -10 -60 -90 -00 -60 -90 -F0 -80 -70 -ENDCHAR -STARTCHAR uni1EC4 -ENCODING 7876 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 7 11 0 0 -BITMAP -0A -14 -20 -50 -00 -F8 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR uni1EC5 -ENCODING 7877 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -28 -50 -00 -20 -50 -00 -70 -88 -F0 -80 -78 -ENDCHAR -STARTCHAR uni1EC6 -ENCODING 7878 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 12 0 -2 -BITMAP -20 -50 -00 -F8 -80 -80 -F0 -80 -80 -F8 -00 -20 -ENDCHAR -STARTCHAR uni1EC7 -ENCODING 7879 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 -2 -BITMAP -20 -50 -00 -70 -88 -F0 -80 -78 -00 -20 -ENDCHAR -STARTCHAR uni1EC8 -ENCODING 7880 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -30 -10 -20 -00 -F8 -20 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR uni1EC9 -ENCODING 7881 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 3 9 2 0 -BITMAP -60 -20 -40 -00 -C0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR uni1ECA -ENCODING 7882 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 -2 -BITMAP -F8 -20 -20 -20 -20 -20 -F8 -00 -20 -ENDCHAR -STARTCHAR uni1ECB -ENCODING 7883 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 3 9 2 -2 -BITMAP -40 -00 -C0 -40 -40 -40 -E0 -00 -40 -ENDCHAR -STARTCHAR uni1ECC -ENCODING 7884 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 -2 -BITMAP -70 -88 -88 -88 -88 -88 -70 -00 -20 -ENDCHAR -STARTCHAR uni1ECD -ENCODING 7885 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 7 0 -2 -BITMAP -70 -88 -88 -88 -70 -00 -20 -ENDCHAR -STARTCHAR uni1ECE -ENCODING 7886 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -30 -10 -20 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ECF -ENCODING 7887 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 0 -BITMAP -30 -10 -20 -00 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ED0 -ENCODING 7888 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 7 10 0 0 -BITMAP -22 -54 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ED1 -ENCODING 7889 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -04 -08 -20 -50 -00 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ED2 -ENCODING 7890 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -08 -24 -50 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ED3 -ENCODING 7891 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -10 -08 -20 -50 -00 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ED4 -ENCODING 7892 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -0C -24 -58 -00 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ED5 -ENCODING 7893 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -18 -08 -30 -50 -00 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ED6 -ENCODING 7894 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -28 -50 -20 -50 -00 -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ED7 -ENCODING 7895 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -28 -50 -00 -20 -50 -00 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1ED8 -ENCODING 7896 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 12 0 -2 -BITMAP -20 -50 -00 -70 -88 -88 -88 -88 -88 -70 -00 -20 -ENDCHAR -STARTCHAR uni1ED9 -ENCODING 7897 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 -2 -BITMAP -20 -50 -00 -70 -88 -88 -88 -70 -00 -20 -ENDCHAR -STARTCHAR uni1EDA -ENCODING 7898 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -20 -40 -10 -08 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EDB -ENCODING 7899 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 0 -BITMAP -20 -40 -10 -08 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EDC -ENCODING 7900 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -80 -50 -08 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EDD -ENCODING 7901 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 0 -BITMAP -80 -40 -10 -08 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EDE -ENCODING 7902 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -60 -20 -50 -08 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EDF -ENCODING 7903 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -60 -20 -40 -10 -08 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EE0 -ENCODING 7904 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 0 -BITMAP -50 -A0 -10 -08 -70 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EE1 -ENCODING 7905 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 0 -BITMAP -50 -A0 -10 -08 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EE2 -ENCODING 7906 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 11 0 -2 -BITMAP -10 -08 -70 -88 -88 -88 -88 -88 -70 -00 -20 -ENDCHAR -STARTCHAR uni1EE3 -ENCODING 7907 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 5 9 0 -2 -BITMAP -10 -08 -70 -88 -88 -88 -70 -00 -20 -ENDCHAR -STARTCHAR uni1EE4 -ENCODING 7908 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 9 0 -2 -BITMAP -88 -88 -88 -88 -88 -88 -70 -00 -20 -ENDCHAR -STARTCHAR uni1EE5 -ENCODING 7909 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 7 0 -2 -BITMAP -88 -88 -88 -88 -70 -00 -20 -ENDCHAR -STARTCHAR uni1EE6 -ENCODING 7910 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -30 -10 -20 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EE7 -ENCODING 7911 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 5 10 0 0 -BITMAP -30 -10 -20 -00 -00 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EE8 -ENCODING 7912 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -10 -2C -04 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EE9 -ENCODING 7913 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -10 -20 -0C -04 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EEA -ENCODING 7914 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -40 -2C -04 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EEB -ENCODING 7915 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -40 -20 -0C -04 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EEC -ENCODING 7916 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -30 -10 -2C -04 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EED -ENCODING 7917 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 10 0 0 -BITMAP -30 -10 -20 -0C -04 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EEE -ENCODING 7918 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 0 -BITMAP -28 -50 -0C -04 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EEF -ENCODING 7919 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 9 0 0 -BITMAP -28 -50 -0C -04 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni1EF0 -ENCODING 7920 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 11 0 -2 -BITMAP -0C -04 -88 -88 -88 -88 -88 -88 -70 -00 -20 -ENDCHAR -STARTCHAR uni1EF1 -ENCODING 7921 -SWIDTH 583 0 -DWIDTH 7 0 -BBX 6 9 0 -2 -BITMAP -0C -04 -88 -88 -88 -88 -70 -00 -20 -ENDCHAR STARTCHAR Ygrave ENCODING 7922 SWIDTH 480 0 @@ -28514,7 +27124,7 @@ STARTCHAR zerosuperior ENCODING 8304 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -28538,7 +27148,7 @@ STARTCHAR foursuperior ENCODING 8308 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 80 80 @@ -28550,7 +27160,7 @@ STARTCHAR fivesuperior ENCODING 8309 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP E0 80 @@ -28562,7 +27172,7 @@ STARTCHAR sixsuperior ENCODING 8310 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 60 80 @@ -28574,7 +27184,7 @@ STARTCHAR sevensuperior ENCODING 8311 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP E0 20 @@ -28586,7 +27196,7 @@ STARTCHAR eightsuperior ENCODING 8312 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -28598,7 +27208,7 @@ STARTCHAR ninesuperior ENCODING 8313 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 5 1 4 +BBX 3 5 1 5 BITMAP 40 A0 @@ -28638,7 +27248,7 @@ STARTCHAR parenleftsuperior ENCODING 8317 SWIDTH 480 0 DWIDTH 6 0 -BBX 2 5 1 4 +BBX 2 5 1 5 BITMAP 40 80 @@ -28650,7 +27260,7 @@ STARTCHAR parenrightsuperior ENCODING 8318 SWIDTH 480 0 DWIDTH 6 0 -BBX 2 5 1 4 +BBX 2 5 1 5 BITMAP 80 40 @@ -28662,7 +27272,7 @@ STARTCHAR nsuperior ENCODING 8319 SWIDTH 480 0 DWIDTH 6 0 -BBX 3 4 1 4 +BBX 3 4 1 5 BITMAP C0 A0 @@ -65855,6 +64465,8 @@ B8 D4 D4 ENDCHAR + + STARTCHAR U_2E80 ENCODING 11904 SWIDTH 1000 0 @@ -73074,8 +71686,8 @@ ENDCHAR STARTCHAR U_3099 ENCODING 12441 SWIDTH 1000 0 -DWIDTH 6 0 -BBX 4 3 0 5 +DWIDTH 12 0 +BBX 4 3 0 7 BITMAP 20 90 @@ -73084,8 +71696,8 @@ ENDCHAR STARTCHAR U_309B ENCODING 12443 SWIDTH 1000 0 -DWIDTH 6 0 -BBX 4 3 0 5 +DWIDTH 12 0 +BBX 4 3 0 6 BITMAP 20 90 @@ -73094,18 +71706,20 @@ ENDCHAR STARTCHAR U_309C ENCODING 12444 SWIDTH 1000 0 -DWIDTH 6 0 -BBX 3 3 0 5 +DWIDTH 12 0 +BBX 3 3 0 6 BITMAP 40 A0 40 ENDCHAR + + STARTCHAR u30A0 ENCODING 12448 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 3 0 3 +BBX 5 3 0 1 BITMAP F8 00 @@ -73115,47 +71729,43 @@ STARTCHAR u30A1 ENCODING 12449 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 4 4 0 0 BITMAP F0 10 60 40 -80 ENDCHAR STARTCHAR u30A2 ENCODING 12450 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP F8 08 28 30 20 -20 40 ENDCHAR STARTCHAR u30A3 ENCODING 12451 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 3 4 1 0 BITMAP -10 -20 -60 -A0 20 +40 +C0 +40 ENDCHAR STARTCHAR u30A4 ENCODING 12452 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 4 6 0 0 BITMAP -08 10 20 60 @@ -73167,33 +71777,31 @@ STARTCHAR u30A5 ENCODING 12453 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 4 4 0 0 BITMAP 20 F0 90 -10 20 ENDCHAR STARTCHAR u30A6 ENCODING 12454 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 20 F8 88 -88 08 10 -60 +20 ENDCHAR STARTCHAR u30A7 ENCODING 12455 SWIDTH 545 0 DWIDTH 6 0 -BBX 3 4 0 0 +BBX 3 4 1 0 BITMAP E0 40 @@ -73204,24 +71812,22 @@ STARTCHAR u30A8 ENCODING 12456 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP F8 20 20 20 -20 F8 ENDCHAR STARTCHAR u30A9 ENCODING 12457 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 4 4 0 0 BITMAP 20 F0 -20 60 A0 ENDCHAR @@ -73229,11 +71835,10 @@ STARTCHAR u30AA ENCODING 12458 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 10 F8 -10 30 50 90 @@ -73243,101 +71848,92 @@ STARTCHAR u30AB ENCODING 12459 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 40 F8 48 48 48 -48 -98 +90 ENDCHAR STARTCHAR u30AC ENCODING 12460 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -08 +00 40 F8 48 48 48 -48 -98 +90 ENDCHAR STARTCHAR u30AD ENCODING 12461 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 20 F8 20 -20 F8 -10 -10 +20 +20 ENDCHAR STARTCHAR u30AE ENCODING 12462 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -08 +00 +20 +F8 20 F8 20 20 -F8 -10 -10 ENDCHAR STARTCHAR u30AF ENCODING 12463 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 4 5 0 0 BITMAP -40 -78 -48 -88 -08 +70 +90 10 -60 +20 +C0 ENDCHAR STARTCHAR u30B0 ENCODING 12464 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -08 -40 -78 -48 -88 -08 +00 +70 +90 10 -60 +20 +C0 ENDCHAR STARTCHAR u30B1 ENCODING 12465 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP -80 -F8 -90 +40 +78 90 10 10 @@ -73347,13 +71943,12 @@ STARTCHAR u30B2 ENCODING 12466 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -28 -80 -F8 -90 +00 +40 +78 90 10 10 @@ -73363,71 +71958,65 @@ STARTCHAR u30BB3 ENCODING 12467 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP F8 08 08 08 -08 F8 ENDCHAR STARTCHAR u30B4 ENCODING 12468 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 00 F8 08 08 08 -08 F8 ENDCHAR STARTCHAR u30BB5 ENCODING 12469 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 50 F8 50 -50 -50 10 20 +40 ENDCHAR STARTCHAR u30B6 ENCODING 12470 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -08 +00 50 F8 50 -50 -50 10 20 +40 ENDCHAR STARTCHAR u30B7 ENCODING 12471 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP C0 08 C8 -08 10 E0 ENDCHAR @@ -73435,19 +72024,13 @@ STARTCHAR u30B8 ENCODING 12472 SWIDTH 545 0 DWIDTH 6 0 -BBX 7 13 0 0 +BBX 5 7 0 0 BITMAP -02 -00 -00 -00 -28 28 00 C0 08 C8 -08 10 E0 ENDCHAR @@ -73455,10 +72038,9 @@ STARTCHAR u30B9 ENCODING 12473 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP -70 -10 +F8 10 20 50 @@ -73468,13 +72050,11 @@ STARTCHAR u30BA ENCODING 12474 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 00 -70 -10 +F8 10 20 50 @@ -73484,10 +72064,9 @@ STARTCHAR u30BB ENCODING 12475 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 40 -40 F8 48 50 @@ -73498,11 +72077,10 @@ STARTCHAR u30BC ENCODING 12476 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -08 -40 +00 40 F8 48 @@ -73514,42 +72092,37 @@ STARTCHAR u30BD ENCODING 12477 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP 88 -48 +88 48 10 -10 -20 +60 ENDCHAR STARTCHAR u30BE ENCODING 12478 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 00 88 -48 +88 48 10 -10 -20 +60 ENDCHAR STARTCHAR u30BF ENCODING 12479 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 5 0 0 BITMAP -40 78 48 A8 -18 10 60 ENDCHAR @@ -73557,15 +72130,13 @@ STARTCHAR u30C0 ENCODING 12480 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -08 -40 +00 78 48 A8 -18 10 60 ENDCHAR @@ -73573,30 +72144,28 @@ STARTCHAR u30C1 ENCODING 12481 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 10 -60 +E0 20 F8 20 -20 40 ENDCHAR STARTCHAR u30C2 ENCODING 12482 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -08 +00 10 -60 +E0 20 F8 20 -20 40 ENDCHAR STARTCHAR u30C3 @@ -73614,72 +72183,66 @@ STARTCHAR u30C4 ENCODING 12484 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP A8 A8 -A8 08 10 -60 +20 ENDCHAR STARTCHAR u30C5 ENCODING 12485 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 00 A8 A8 -A8 08 10 -60 +20 ENDCHAR STARTCHAR u30C6 ENCODING 12486 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 70 00 F8 20 20 -20 40 ENDCHAR STARTCHAR u30C7 ENCODING 12487 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -08 +00 70 00 F8 20 20 -20 40 ENDCHAR STARTCHAR u30C8 ENCODING 12488 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 7 1 0 +BBX 3 6 1 0 BITMAP 80 80 C0 A0 -90 80 80 ENDCHAR @@ -73687,15 +72250,14 @@ STARTCHAR u30C9 ENCODING 12489 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 9 1 0 +BBX 4 8 1 0 BITMAP 50 -10 +00 80 80 C0 A0 -90 80 80 ENDCHAR @@ -73703,10 +72265,9 @@ STARTCHAR u30CA ENCODING 12490 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 20 -20 F8 20 20 @@ -73717,41 +72278,38 @@ STARTCHAR u30CB ENCODING 12491 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP 70 00 00 00 -00 F8 ENDCHAR STARTCHAR u30CC ENCODING 12492 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP -78 +F8 08 -28 -10 -28 -C0 +50 +20 +D0 ENDCHAR STARTCHAR u30CD ENCODING 12493 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 20 -70 +F8 10 20 70 A8 -20 ENDCHAR STARTCHAR u30CE ENCODING 12494 @@ -73762,7 +72320,7 @@ BITMAP 20 20 20 -40 +20 40 80 ENDCHAR @@ -73770,12 +72328,11 @@ STARTCHAR u30CF ENCODING 12495 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP 10 -50 -50 -48 +88 +88 88 88 ENDCHAR @@ -73783,15 +72340,13 @@ STARTCHAR u30D0 ENCODING 12496 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 00 10 -50 -50 -48 +88 +88 88 88 ENDCHAR @@ -73799,15 +72354,14 @@ STARTCHAR u30D1 ENCODING 12497 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 18 18 00 10 -50 -50 -48 +88 +88 88 88 ENDCHAR @@ -73815,57 +72369,52 @@ STARTCHAR u30D2 ENCODING 12498 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 6 0 0 +BBX 5 6 0 0 BITMAP 80 -90 -E0 +80 +F8 80 80 -70 +78 ENDCHAR STARTCHAR u30D3 ENCODING 12499 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 -00 -80 -90 -E0 80 80 -70 +F8 +80 +80 +78 ENDCHAR STARTCHAR u30D4 ENCODING 12500 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 18 -18 -00 +98 80 -90 -E0 +F8 80 80 -70 +78 ENDCHAR STARTCHAR u30D5 ENCODING 12501 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP F8 08 08 -08 10 60 ENDCHAR @@ -73873,15 +72422,13 @@ STARTCHAR u30D6 ENCODING 12502 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 00 F8 08 08 -08 10 60 ENDCHAR @@ -73889,7 +72436,7 @@ STARTCHAR u30D7 ENCODING 12503 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 18 18 @@ -73897,7 +72444,6 @@ BITMAP F8 08 08 -08 10 60 ENDCHAR @@ -73905,79 +72451,72 @@ STARTCHAR u30D8 ENCODING 12504 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 1 +BBX 5 4 0 1 BITMAP -60 +40 A0 10 -10 08 ENDCHAR STARTCHAR u30D9 ENCODING 12505 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 1 +BBX 5 6 0 1 BITMAP 28 -28 00 -60 +40 A0 10 -10 08 ENDCHAR STARTCHAR u30DA ENCODING 12506 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 8 0 1 +BBX 5 6 0 1 BITMAP 18 18 -00 -60 +40 A0 10 -10 08 ENDCHAR STARTCHAR u30DB ENCODING 12507 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 20 F8 20 A8 A8 -A8 20 ENDCHAR STARTCHAR u30DC ENCODING 12508 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -08 +00 20 F8 20 A8 A8 -A8 20 ENDCHAR STARTCHAR u30DD ENCODING 12509 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 18 18 @@ -73986,18 +72525,16 @@ F8 20 A8 A8 -A8 20 ENDCHAR STARTCHAR u30DE ENCODING 12510 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP F8 08 -08 50 20 10 @@ -74006,26 +72543,23 @@ STARTCHAR u30DF ENCODING 12511 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 6 1 0 +BBX 4 5 1 0 BITMAP E0 00 E0 00 -C0 -30 +F0 ENDCHAR STARTCHAR u30E0 ENCODING 12512 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 5 0 0 BITMAP 20 -20 -20 40 -48 +88 F8 08 ENDCHAR @@ -74033,11 +72567,10 @@ STARTCHAR u30E1 ENCODING 12513 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP 08 -48 -30 +28 10 28 C0 @@ -74046,12 +72579,11 @@ STARTCHAR u30E2 ENCODING 12514 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP -F0 -40 F8 40 +F8 40 38 ENDCHAR @@ -74059,11 +72591,10 @@ STARTCHAR u30E3 ENCODING 12515 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 5 0 0 +BBX 5 4 0 0 BITMAP 40 F8 -48 50 40 ENDCHAR @@ -74071,10 +72602,9 @@ STARTCHAR u30E4 ENCODING 12516 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 40 -40 F8 48 50 @@ -74085,25 +72615,23 @@ STARTCHAR u30E5 ENCODING 12517 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 4 4 0 0 BITMAP 60 20 20 -20 F0 ENDCHAR STARTCHAR u30E6 ENCODING 12518 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP 70 10 10 10 -10 F8 ENDCHAR STARTCHAR u30E7 @@ -74122,52 +72650,47 @@ STARTCHAR u30E8 ENCODING 12520 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP F8 08 F8 08 -08 F8 ENDCHAR STARTCHAR u30E9 ENCODING 12521 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 70 00 F8 08 -08 10 -60 +20 ENDCHAR STARTCHAR u30EA ENCODING 12522 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 7 0 0 +BBX 4 6 0 0 BITMAP -10 90 90 90 90 10 -60 +20 ENDCHAR STARTCHAR u30EB ENCODING 12523 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 5 0 0 BITMAP 20 -20 -A0 A0 A8 A8 @@ -74177,58 +72700,54 @@ STARTCHAR u30EC ENCODING 12524 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 4 5 0 0 BITMAP 80 80 -80 -88 -B0 +90 +A0 C0 ENDCHAR STARTCHAR u30ED ENCODING 12525 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP F8 88 88 88 -88 F8 ENDCHAR STARTCHAR u30EE ENCODING 12526 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 4 4 0 0 BITMAP F0 90 10 -10 -60 +20 ENDCHAR STARTCHAR u30EF ENCODING 12527 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP F8 88 -88 08 10 -60 +20 ENDCHAR STARTCHAR u30F0 ENCODING 12528 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 0 +BBX 5 6 0 0 BITMAP 10 F8 @@ -74236,18 +72755,16 @@ F8 50 F8 10 -10 ENDCHAR STARTCHAR u30F1 ENCODING 12529 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP -70 -10 -20 -20 +F8 +08 +30 20 F8 ENDCHAR @@ -74255,25 +72772,23 @@ STARTCHAR u30F2 ENCODING 12530 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP F8 08 F8 08 -10 -60 +30 ENDCHAR STARTCHAR u30F3 ENCODING 12531 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 6 0 0 +BBX 5 5 0 0 BITMAP C0 08 08 -08 10 E0 ENDCHAR @@ -74281,39 +72796,36 @@ STARTCHAR u30F4 ENCODING 12532 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -08 +00 20 F8 88 -88 08 10 -60 +20 ENDCHAR STARTCHAR u30F5 ENCODING 12533 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 4 4 0 0 BITMAP 40 F0 50 -50 -B0 +A0 ENDCHAR STARTCHAR u30F6 ENCODING 12534 SWIDTH 545 0 DWIDTH 6 0 -BBX 4 5 0 0 +BBX 4 4 0 0 BITMAP -80 +40 F0 -A0 20 40 ENDCHAR @@ -74321,14 +72833,12 @@ STARTCHAR u30F7 ENCODING 12535 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 00 F8 88 -88 08 10 60 @@ -74337,31 +72847,28 @@ STARTCHAR u30F8 ENCODING 12536 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 8 0 0 BITMAP 28 -08 +00 10 F8 50 50 F8 10 -10 ENDCHAR STARTCHAR u30F9 ENCODING 12537 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 00 -70 -10 -20 -20 +F8 +08 +30 20 F8 ENDCHAR @@ -74369,23 +72876,21 @@ STARTCHAR u30FA ENCODING 12538 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 9 0 0 +BBX 5 7 0 0 BITMAP 28 -28 00 F8 08 F8 08 -10 -60 +30 ENDCHAR STARTCHAR u30FB ENCODING 12539 SWIDTH 545 0 DWIDTH 6 0 -BBX 2 2 2 3 +BBX 2 2 2 2 BITMAP C0 C0 @@ -74394,16 +72899,15 @@ STARTCHAR u30FC ENCODING 12540 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 2 0 3 +BBX 5 1 0 2 BITMAP -80 -78 +F8 ENDCHAR STARTCHAR u30FD ENCODING 12541 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 4 0 2 +BBX 5 4 0 1 BITMAP 80 60 @@ -74414,11 +72918,9 @@ STARTCHAR u30FE ENCODING 12542 SWIDTH 545 0 DWIDTH 6 0 -BBX 5 7 0 2 +BBX 5 5 0 1 BITMAP 28 -28 -00 80 60 10 @@ -74437,6 +72939,8 @@ F8 08 08 ENDCHAR + + STARTCHAR U_3105 ENCODING 12549 SWIDTH 1000 0 @@ -585860,6 +584364,8 @@ FFE0 2140 C620 ENDCHAR + + STARTCHAR ff ENCODING 64256 SWIDTH 480 0 @@ -585994,6 +584500,8 @@ BITMAP 08 F0 ENDCHAR + + STARTCHAR U_FE30 ENCODING 65072 SWIDTH 0 0 @@ -588222,6 +586730,7 @@ E380 0800 1C00 ENDCHAR + STARTCHAR uniFFFD ENCODING 65533 SWIDTH 480 0 diff --git a/buildroot/share/fonts/marlin-6x9.bdf b/buildroot/share/fonts/marlin-6x9.bdf deleted file mode 100644 index 0b26834710..0000000000 --- a/buildroot/share/fonts/marlin-6x9.bdf +++ /dev/null @@ -1,16606 +0,0 @@ -STARTFONT 2.1 -FONT -Misc-Fixed-Medium-R-Normal--9-90-75-75-C-60-ISO10646-1 -SIZE 9 75 75 -FONTBOUNDINGBOX 6 9 0 -2 -COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" -STARTPROPERTIES 24 -FONTNAME_REGISTRY "" -FOUNDRY "Misc" -FAMILY_NAME "Fixed" -WEIGHT_NAME "Medium" -SLANT "R" -SETWIDTH_NAME "Normal" -ADD_STYLE_NAME "" -PIXEL_SIZE 9 -POINT_SIZE 90 -RESOLUTION_X 75 -RESOLUTION_Y 75 -SPACING "C" -AVERAGE_WIDTH 60 -CHARSET_REGISTRY "ISO10646" -CHARSET_ENCODING "1" -COPYRIGHT "Public domain font. Share and enjoy." -_XMBDFED_INFO "Edited with xmbdfed 4.5." -CAP_HEIGHT 6 -X_HEIGHT 4 -WEIGHT 10 -QUAD_WIDTH 6 -DEFAULT_CHAR 0 -FONT_DESCENT 2 -FONT_ASCENT 7 -ENDPROPERTIES -CHARS 1305 -STARTCHAR char0 -ENCODING 0 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -50 -80 -10 -80 -10 -A0 -ENDCHAR -STARTCHAR uni0001 -ENCODING 1 -SWIDTH 1000 0 -DWIDTH 0 0 -BBX 5 7 0 0 -BITMAP -40 -F0 -C8 -88 -98 -78 -10 -ENDCHAR -STARTCHAR uni0002 -ENCODING 2 -SWIDTH 1000 0 -DWIDTH 0 0 -BBX 5 7 0 0 -BITMAP -C0 -F8 -88 -88 -88 -88 -F8 -ENDCHAR -STARTCHAR uni0003 -ENCODING 3 -SWIDTH 1000 0 -DWIDTH 0 0 -BBX 5 5 0 1 -BITMAP -20 -30 -F8 -30 -20 -ENDCHAR -STARTCHAR uni0004 -ENCODING 4 -SWIDTH 1000 0 -DWIDTH 0 0 -BBX 5 7 0 0 -BITMAP -20 -70 -F8 -20 -20 -20 -E0 -ENDCHAR -STARTCHAR uni0005 -ENCODING 5 -SWIDTH 1000 0 -DWIDTH 0 0 -BBX 5 7 0 0 -BITMAP -20 -70 -A8 -B8 -88 -70 -20 -ENDCHAR -STARTCHAR uni0006 -ENCODING 6 -SWIDTH 1000 0 -DWIDTH 0 0 -BBX 6 5 0 0 -BITMAP -B0 -D8 -6C -D8 -B0 -ENDCHAR -STARTCHAR uni0007 -ENCODING 7 -SWIDTH 1000 0 -DWIDTH 0 0 -BBX 5 8 0 -1 -BITMAP -F8 -A8 -88 -88 -88 -88 -A8 -F8 -ENDCHAR -STARTCHAR uni0008 -ENCODING 8 -SWIDTH 1000 0 -DWIDTH 0 0 -BBX 5 9 0 -2 -BITMAP -20 -50 -50 -50 -50 -88 -A8 -88 -70 -ENDCHAR -STARTCHAR uni0009 -ENCODING 9 -SWIDTH 1000 0 -DWIDTH 0 0 -BBX 3 3 0 3 -BITMAP -40 -A0 -40 -ENDCHAR -STARTCHAR space -ENCODING 32 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 5 -2 -BITMAP -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 6 2 0 -BITMAP -80 -80 -80 -80 -00 -80 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 3 -BITMAP -A0 -A0 -A0 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -50 -50 -F8 -50 -F8 -50 -50 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -20 -70 -A8 -A0 -70 -28 -A8 -70 -20 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 8 0 -1 -BITMAP -40 -A8 -48 -10 -20 -48 -54 -08 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -60 -90 -90 -60 -98 -90 -68 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 3 2 3 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 7 2 -1 -BITMAP -40 -80 -80 -80 -80 -80 -40 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 7 2 -1 -BITMAP -80 -40 -40 -40 -40 -40 -80 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -88 -50 -F8 -50 -88 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -20 -F8 -20 -20 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 4 2 -2 -BITMAP -C0 -40 -40 -80 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 1 0 2 -BITMAP -F8 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 0 -BITMAP -C0 -C0 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -10 -10 -20 -40 -80 -80 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -40 -C0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -10 -20 -40 -F0 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -20 -60 -10 -10 -E0 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -10 -30 -50 -90 -F8 -10 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -80 -E0 -10 -10 -E0 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -80 -E0 -90 -90 -60 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -10 -10 -20 -40 -40 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -60 -90 -90 -60 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -90 -70 -10 -60 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 5 2 0 -BITMAP -C0 -C0 -00 -C0 -C0 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 7 2 -2 -BITMAP -C0 -C0 -00 -C0 -40 -40 -80 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -18 -60 -80 -60 -18 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 1 -BITMAP -F8 -00 -F8 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -C0 -30 -08 -30 -C0 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -60 -90 -10 -60 -40 -00 -40 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -90 -A8 -B0 -80 -70 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -50 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F0 -88 -F0 -88 -88 -F0 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -80 -80 -90 -60 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -E0 -90 -90 -90 -90 -E0 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -80 -E0 -80 -80 -F0 -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -80 -E0 -80 -80 -80 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -80 -B0 -90 -60 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -90 -F0 -90 -90 -90 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -E0 -40 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -38 -10 -10 -10 -90 -60 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -A0 -C0 -A0 -90 -90 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -80 -80 -80 -80 -F0 -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -D8 -A8 -A8 -88 -88 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -D0 -B0 -90 -90 -90 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -E0 -90 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 -1 -BITMAP -60 -90 -90 -D0 -B0 -60 -10 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -E0 -90 -90 -E0 -90 -90 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -40 -20 -90 -60 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -90 -90 -F0 -60 -60 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -88 -A8 -A8 -D8 -88 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -50 -20 -20 -50 -88 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -88 -50 -20 -20 -20 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -10 -20 -40 -80 -F0 -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -E0 -80 -80 -80 -80 -E0 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -80 -40 -20 -10 -10 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -E0 -20 -20 -20 -20 -E0 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 3 -BITMAP -20 -50 -88 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 1 0 -2 -BITMAP -F8 -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 4 -BITMAP -80 -40 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -70 -90 -90 -70 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -80 -E0 -90 -90 -E0 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -70 -80 -80 -70 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -10 -10 -70 -90 -90 -70 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -20 -50 -40 -E0 -40 -40 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -60 -90 -90 -70 -10 -60 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -80 -E0 -90 -90 -90 -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -40 -00 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 8 1 -2 -BITMAP -20 -00 -60 -20 -20 -20 -A0 -40 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -80 -A0 -C0 -A0 -90 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -C0 -40 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -D0 -A8 -A8 -88 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -E0 -90 -90 -90 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -60 -90 -90 -60 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -E0 -90 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -70 -90 -90 -70 -10 -10 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -A0 -D0 -80 -80 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -70 -C0 -30 -E0 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -40 -40 -E0 -40 -50 -20 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -90 -90 -90 -70 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -90 -90 -60 -60 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -A8 -A8 -50 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -90 -60 -60 -90 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -90 -90 -90 -70 -90 -60 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -F0 -20 -40 -F0 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -20 -40 -40 -80 -40 -40 -20 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 2 -1 -BITMAP -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -80 -40 -40 -20 -40 -40 -80 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 2 1 3 -BITMAP -50 -A0 -ENDCHAR -STARTCHAR space -ENCODING 160 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 5 -2 -BITMAP -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 6 2 0 -BITMAP -80 -00 -80 -80 -80 -80 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -1 -BITMAP -20 -70 -A0 -A0 -70 -20 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -30 -48 -40 -F0 -40 -40 -F8 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -A8 -50 -88 -50 -A8 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -50 -F8 -20 -F8 -20 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 2 -1 -BITMAP -80 -80 -80 -00 -80 -80 -80 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 -1 -BITMAP -70 -80 -60 -90 -60 -10 -E0 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 5 -BITMAP -A0 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 7 0 0 -BITMAP -78 -84 -94 -A4 -94 -84 -78 -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -60 -A0 -60 -00 -E0 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -28 -50 -A0 -50 -28 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 3 1 0 -BITMAP -F0 -10 -10 -ENDCHAR -STARTCHAR hyphen -ENCODING 173 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 1 1 2 -BITMAP -F0 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 7 0 0 -BITMAP -78 -84 -B4 -A4 -A4 -84 -78 -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 1 1 5 -BITMAP -F0 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 3 1 2 -BITMAP -60 -90 -60 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -20 -20 -F8 -20 -20 -00 -F8 -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -40 -A0 -20 -40 -E0 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -C0 -20 -40 -20 -C0 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 4 -BITMAP -40 -80 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 1 -1 -BITMAP -90 -90 -B0 -D0 -80 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -78 -E8 -E8 -68 -28 -28 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 2 2 -BITMAP -80 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 -2 -BITMAP -40 -80 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -40 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -40 -A0 -40 -00 -E0 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -A0 -50 -28 -50 -A0 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -40 -C0 -40 -50 -70 -30 -78 -10 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -40 -C0 -40 -50 -68 -08 -10 -38 -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -C0 -20 -40 -30 -F0 -30 -78 -10 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -00 -20 -60 -80 -90 -60 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -40 -20 -20 -50 -70 -88 -88 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -20 -20 -50 -70 -88 -88 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -50 -20 -50 -70 -88 -88 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -28 -50 -20 -50 -70 -88 -88 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -50 -00 -20 -50 -70 -88 -88 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -50 -20 -50 -70 -88 -88 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -78 -A0 -F0 -A0 -A0 -B8 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -60 -90 -80 -80 -90 -60 -20 -40 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -20 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -00 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -80 -40 -E0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -20 -40 -E0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -40 -A0 -E0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -A0 -00 -E0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -48 -E8 -48 -48 -70 -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -A0 -90 -D0 -B0 -90 -90 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -20 -60 -90 -90 -90 -60 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -60 -90 -90 -90 -60 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -60 -90 -90 -90 -60 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -A0 -60 -90 -90 -90 -60 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -00 -60 -90 -90 -90 -60 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -88 -50 -20 -50 -88 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -10 -70 -B0 -B0 -D0 -D0 -E0 -80 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -20 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -00 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -20 -88 -50 -20 -20 -20 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -E0 -90 -90 -E0 -80 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -A0 -A0 -90 -A0 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -20 -00 -70 -90 -90 -70 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -70 -90 -90 -70 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -00 -70 -90 -90 -70 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -A0 -00 -70 -90 -90 -70 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -50 -00 -70 -90 -90 -70 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -20 -70 -90 -90 -70 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -70 -A8 -B0 -78 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -70 -80 -80 -70 -20 -40 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -20 -00 -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -00 -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -50 -00 -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -80 -40 -00 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -20 -40 -00 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -40 -A0 -00 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -A0 -00 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -30 -60 -10 -70 -90 -90 -60 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -A0 -00 -E0 -90 -90 -90 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -20 -00 -60 -90 -90 -60 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -60 -90 -90 -60 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -00 -60 -90 -90 -60 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -A0 -00 -60 -90 -90 -60 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -50 -00 -60 -90 -90 -60 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -00 -F8 -00 -20 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -70 -B0 -D0 -E0 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -20 -00 -90 -90 -90 -70 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -90 -90 -90 -70 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -00 -90 -90 -90 -70 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -50 -00 -90 -90 -90 -70 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -20 -40 -00 -90 -90 -90 -70 -90 -60 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -80 -80 -E0 -90 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -50 -00 -90 -90 -90 -70 -90 -60 -ENDCHAR -STARTCHAR Amacron -ENCODING 256 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -70 -00 -20 -50 -70 -88 -88 -ENDCHAR -STARTCHAR amacron -ENCODING 257 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -70 -00 -70 -90 -90 -70 -ENDCHAR -STARTCHAR Abreve -ENCODING 258 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -90 -60 -20 -50 -70 -88 -88 -ENDCHAR -STARTCHAR abreve -ENCODING 259 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -00 -70 -90 -90 -70 -ENDCHAR -STARTCHAR Aogonek -ENCODING 260 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -20 -50 -88 -F8 -88 -88 -10 -08 -ENDCHAR -STARTCHAR aogonek -ENCODING 261 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -70 -90 -90 -70 -20 -10 -ENDCHAR -STARTCHAR Cacute -ENCODING 262 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -60 -90 -80 -90 -60 -ENDCHAR -STARTCHAR cacute -ENCODING 263 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -70 -80 -80 -70 -ENDCHAR -STARTCHAR Ccircumflex -ENCODING 264 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -60 -90 -80 -90 -60 -ENDCHAR -STARTCHAR ccircumflex -ENCODING 265 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -00 -70 -80 -80 -70 -ENDCHAR -STARTCHAR Cdotaccent -ENCODING 266 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -00 -60 -90 -80 -90 -60 -ENDCHAR -STARTCHAR cdotaccent -ENCODING 267 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -20 -00 -70 -80 -80 -70 -ENDCHAR -STARTCHAR Ccaron -ENCODING 268 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -60 -90 -80 -90 -60 -ENDCHAR -STARTCHAR ccaron -ENCODING 269 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -00 -70 -80 -80 -70 -ENDCHAR -STARTCHAR Dcaron -ENCODING 270 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -E0 -90 -90 -90 -E0 -ENDCHAR -STARTCHAR dcaron -ENCODING 271 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -A0 -50 -10 -70 -90 -90 -70 -ENDCHAR -STARTCHAR Dcroat -ENCODING 272 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -48 -E8 -48 -48 -70 -ENDCHAR -STARTCHAR dcroat -ENCODING 273 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -10 -38 -70 -90 -90 -70 -ENDCHAR -STARTCHAR Emacron -ENCODING 274 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -F0 -00 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR emacron -ENCODING 275 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -00 -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR Ebreve -ENCODING 276 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR ebreve -ENCODING 277 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -00 -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR Edotaccent -ENCODING 278 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -00 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR edotaccent -ENCODING 279 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -40 -00 -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR Eogonek -ENCODING 280 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -F0 -80 -E0 -80 -80 -F0 -40 -20 -ENDCHAR -STARTCHAR eogonek -ENCODING 281 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -60 -B0 -C0 -70 -40 -20 -ENDCHAR -STARTCHAR Ecaron -ENCODING 282 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR ecaron -ENCODING 283 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -00 -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR Gcircumflex -ENCODING 284 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -70 -80 -B0 -90 -60 -ENDCHAR -STARTCHAR gcircumflex -ENCODING 285 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -20 -50 -00 -60 -90 -90 -70 -10 -60 -ENDCHAR -STARTCHAR Gbreve -ENCODING 286 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -70 -80 -B0 -90 -60 -ENDCHAR -STARTCHAR gbreve -ENCODING 287 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -90 -60 -00 -60 -90 -90 -70 -10 -60 -ENDCHAR -STARTCHAR Gdotaccent -ENCODING 288 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -00 -70 -80 -B0 -90 -60 -ENDCHAR -STARTCHAR gdotaccent -ENCODING 289 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -20 -00 -60 -90 -90 -70 -10 -60 -ENDCHAR -STARTCHAR Gcommaaccent -ENCODING 290 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -60 -90 -80 -B0 -90 -60 -20 -40 -ENDCHAR -STARTCHAR gcommaaccent -ENCODING 291 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -20 -40 -60 -90 -90 -70 -10 -60 -ENDCHAR -STARTCHAR Hcircumflex -ENCODING 292 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -00 -90 -F0 -90 -90 -ENDCHAR -STARTCHAR hcircumflex -ENCODING 293 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -A8 -80 -E0 -90 -90 -90 -ENDCHAR -STARTCHAR Hbar -ENCODING 294 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -50 -F8 -50 -70 -50 -50 -ENDCHAR -STARTCHAR hbar -ENCODING 295 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -40 -E0 -70 -48 -48 -48 -ENDCHAR -STARTCHAR Itilde -ENCODING 296 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -A0 -70 -20 -20 -20 -70 -ENDCHAR -STARTCHAR itilde -ENCODING 297 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -A0 -00 -60 -20 -20 -70 -ENDCHAR -STARTCHAR Imacron -ENCODING 298 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -E0 -00 -E0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR imacron -ENCODING 299 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -E0 -00 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR Ibreve -ENCODING 300 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -00 -70 -20 -20 -70 -ENDCHAR -STARTCHAR ibreve -ENCODING 301 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -00 -60 -20 -20 -70 -ENDCHAR -STARTCHAR Iogonek -ENCODING 302 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 8 1 -2 -BITMAP -E0 -40 -40 -40 -40 -E0 -40 -20 -ENDCHAR -STARTCHAR iogonek -ENCODING 303 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 8 1 -2 -BITMAP -40 -00 -C0 -40 -40 -E0 -40 -20 -ENDCHAR -STARTCHAR Idotaccent -ENCODING 304 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -40 -00 -E0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR dotlessi -ENCODING 305 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 1 0 -BITMAP -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR IJ -ENCODING 306 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -B8 -88 -88 -88 -A8 -90 -ENDCHAR -STARTCHAR ij -ENCODING 307 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -88 -00 -98 -88 -88 -88 -28 -10 -ENDCHAR -STARTCHAR Jcircumflex -ENCODING 308 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -28 -38 -10 -10 -90 -60 -ENDCHAR -STARTCHAR jcircumflex -ENCODING 309 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -20 -50 -00 -60 -20 -20 -20 -A0 -40 -ENDCHAR -STARTCHAR Kcommaaccent -ENCODING 310 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -90 -A0 -C0 -A0 -90 -90 -40 -80 -ENDCHAR -STARTCHAR kcommaaccent -ENCODING 311 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -80 -80 -A0 -C0 -A0 -90 -40 -80 -ENDCHAR -STARTCHAR kgreenlandic -ENCODING 312 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -B0 -C0 -A0 -90 -ENDCHAR -STARTCHAR Lacute -ENCODING 313 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -10 -20 -80 -80 -80 -80 -F0 -ENDCHAR -STARTCHAR lacute -ENCODING 314 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -40 -80 -C0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR Lcommaaccent -ENCODING 315 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -80 -80 -80 -80 -80 -F0 -20 -40 -ENDCHAR -STARTCHAR lcommaaccent -ENCODING 316 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 8 1 -2 -BITMAP -C0 -40 -40 -40 -40 -E0 -40 -80 -ENDCHAR -STARTCHAR Lcaron -ENCODING 317 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -80 -80 -80 -80 -F0 -ENDCHAR -STARTCHAR lcaron -ENCODING 318 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -A0 -40 -C0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR Ldot -ENCODING 319 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -80 -A0 -80 -80 -F0 -ENDCHAR -STARTCHAR ldot -ENCODING 320 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -C0 -40 -50 -40 -40 -E0 -ENDCHAR -STARTCHAR Lslash -ENCODING 321 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -40 -40 -60 -C0 -40 -78 -ENDCHAR -STARTCHAR lslash -ENCODING 322 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -C0 -40 -60 -C0 -40 -E0 -ENDCHAR -STARTCHAR Nacute -ENCODING 323 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -90 -D0 -B0 -90 -90 -ENDCHAR -STARTCHAR nacute -ENCODING 324 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -E0 -90 -90 -90 -ENDCHAR -STARTCHAR Ncommaaccent -ENCODING 325 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -90 -D0 -B0 -90 -90 -90 -40 -80 -ENDCHAR -STARTCHAR ncommaaccent -ENCODING 326 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -E0 -90 -90 -90 -40 -80 -ENDCHAR -STARTCHAR Ncaron -ENCODING 327 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -90 -D0 -B0 -90 -90 -ENDCHAR -STARTCHAR ncaron -ENCODING 328 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -A0 -40 -00 -E0 -90 -90 -90 -ENDCHAR -STARTCHAR napostrophe -ENCODING 329 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -C0 -40 -B0 -28 -28 -28 -ENDCHAR -STARTCHAR Eng -ENCODING 330 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -90 -D0 -B0 -90 -90 -90 -10 -20 -ENDCHAR -STARTCHAR eng -ENCODING 331 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -E0 -90 -90 -90 -10 -20 -ENDCHAR -STARTCHAR Omacron -ENCODING 332 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -F8 -00 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR omacron -ENCODING 333 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -00 -60 -90 -90 -60 -ENDCHAR -STARTCHAR Obreve -ENCODING 334 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -88 -70 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR obreve -ENCODING 335 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -00 -60 -90 -90 -60 -ENDCHAR -STARTCHAR Ohungarumlaut -ENCODING 336 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -48 -90 -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR ohungarumlaut -ENCODING 337 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -48 -90 -00 -60 -90 -90 -60 -ENDCHAR -STARTCHAR OE -ENCODING 338 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -78 -A0 -B0 -A0 -A0 -78 -ENDCHAR -STARTCHAR oe -ENCODING 339 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -50 -A8 -B0 -58 -ENDCHAR -STARTCHAR Racute -ENCODING 340 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -E0 -90 -E0 -A0 -90 -ENDCHAR -STARTCHAR racute -ENCODING 341 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -A0 -D0 -80 -80 -ENDCHAR -STARTCHAR Rcommaaccent -ENCODING 342 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -E0 -90 -90 -E0 -90 -90 -40 -80 -ENDCHAR -STARTCHAR rcommaaccent -ENCODING 343 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -A0 -D0 -80 -80 -40 -80 -ENDCHAR -STARTCHAR Rcaron -ENCODING 344 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -A0 -40 -E0 -90 -E0 -A0 -90 -ENDCHAR -STARTCHAR rcaron -ENCODING 345 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -A0 -40 -00 -A0 -D0 -80 -80 -ENDCHAR -STARTCHAR Sacute -ENCODING 346 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -70 -80 -60 -10 -E0 -ENDCHAR -STARTCHAR sacute -ENCODING 347 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -70 -C0 -30 -E0 -ENDCHAR -STARTCHAR Scircumflex -ENCODING 348 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -70 -80 -60 -10 -E0 -ENDCHAR -STARTCHAR scircumflex -ENCODING 349 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -50 -00 -70 -C0 -30 -E0 -ENDCHAR -STARTCHAR Scedilla -ENCODING 350 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -60 -90 -40 -20 -90 -60 -20 -40 -ENDCHAR -STARTCHAR scedilla -ENCODING 351 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -70 -C0 -30 -E0 -20 -40 -ENDCHAR -STARTCHAR Scaron -ENCODING 352 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -70 -80 -60 -10 -E0 -ENDCHAR -STARTCHAR scaron -ENCODING 353 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -00 -70 -C0 -30 -E0 -ENDCHAR -STARTCHAR Tcommaaccent -ENCODING 354 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -F8 -20 -20 -20 -20 -20 -10 -20 -ENDCHAR -STARTCHAR tcommaaccent -ENCODING 355 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -40 -40 -E0 -40 -50 -20 -20 -40 -ENDCHAR -STARTCHAR Tcaron -ENCODING 356 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -50 -20 -F8 -20 -20 -20 -20 -ENDCHAR -STARTCHAR tcaron -ENCODING 357 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -40 -E0 -40 -50 -20 -ENDCHAR -STARTCHAR Tbar -ENCODING 358 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -20 -20 -70 -20 -20 -ENDCHAR -STARTCHAR tbar -ENCODING 359 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -40 -40 -E0 -E0 -50 -20 -ENDCHAR -STARTCHAR Utilde -ENCODING 360 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -A0 -00 -90 -90 -90 -60 -ENDCHAR -STARTCHAR utilde -ENCODING 361 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -A0 -00 -90 -90 -90 -70 -ENDCHAR -STARTCHAR Umacron -ENCODING 362 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -F0 -00 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR umacron -ENCODING 363 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -00 -90 -90 -90 -70 -ENDCHAR -STARTCHAR Ubreve -ENCODING 364 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -00 -90 -90 -90 -60 -ENDCHAR -STARTCHAR ubreve -ENCODING 365 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -00 -90 -90 -90 -70 -ENDCHAR -STARTCHAR Uring -ENCODING 366 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -60 -90 -60 -90 -90 -90 -60 -ENDCHAR -STARTCHAR uring -ENCODING 367 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -60 -90 -60 -90 -90 -90 -70 -ENDCHAR -STARTCHAR Uhungarumlaut -ENCODING 368 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -48 -90 -00 -90 -90 -90 -60 -ENDCHAR -STARTCHAR uhungarumlaut -ENCODING 369 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -48 -90 -00 -90 -90 -90 -70 -ENDCHAR -STARTCHAR Uogonek -ENCODING 370 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -90 -90 -90 -90 -90 -60 -40 -20 -ENDCHAR -STARTCHAR uogonek -ENCODING 371 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -90 -90 -90 -70 -40 -20 -ENDCHAR -STARTCHAR Wcircumflex -ENCODING 372 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -50 -00 -88 -A8 -D8 -88 -ENDCHAR -STARTCHAR wcircumflex -ENCODING 373 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -50 -00 -88 -A8 -A8 -50 -ENDCHAR -STARTCHAR Ycircumflex -ENCODING 374 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -50 -00 -88 -50 -20 -20 -ENDCHAR -STARTCHAR ycircumflex -ENCODING 375 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -20 -50 -00 -90 -90 -90 -70 -90 -60 -ENDCHAR -STARTCHAR Ydieresis -ENCODING 376 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -50 -00 -88 -50 -20 -20 -20 -ENDCHAR -STARTCHAR Zacute -ENCODING 377 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -F0 -20 -40 -80 -F0 -ENDCHAR -STARTCHAR zacute -ENCODING 378 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -F0 -20 -40 -F0 -ENDCHAR -STARTCHAR Zdotaccent -ENCODING 379 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -00 -F0 -20 -40 -80 -F0 -ENDCHAR -STARTCHAR zdotaccent -ENCODING 380 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -20 -00 -F0 -20 -40 -F0 -ENDCHAR -STARTCHAR Zcaron -ENCODING 381 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -F0 -20 -40 -80 -F0 -ENDCHAR -STARTCHAR zcaron -ENCODING 382 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -00 -F0 -20 -40 -F0 -ENDCHAR -STARTCHAR longs -ENCODING 383 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -20 -50 -C0 -40 -40 -40 -ENDCHAR -STARTCHAR uni018F -ENCODING 399 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -10 -F0 -90 -60 -ENDCHAR -STARTCHAR florin -ENCODING 402 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -20 -50 -40 -E0 -40 -40 -40 -80 -ENDCHAR -STARTCHAR Ohorn -ENCODING 416 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 6 0 0 -BITMAP -64 -94 -98 -90 -90 -60 -ENDCHAR -STARTCHAR ohorn -ENCODING 417 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 1 0 -BITMAP -68 -90 -90 -60 -ENDCHAR -STARTCHAR Uhorn -ENCODING 431 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 1 0 -BITMAP -A8 -A8 -B0 -A0 -A0 -40 -ENDCHAR -STARTCHAR uhorn -ENCODING 432 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 1 0 -BITMAP -A8 -B0 -A0 -60 -ENDCHAR -STARTCHAR uni01B5 -ENCODING 437 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -10 -F0 -40 -80 -F0 -ENDCHAR -STARTCHAR uni01B6 -ENCODING 438 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -F0 -F0 -40 -F0 -ENDCHAR -STARTCHAR uni01D1 -ENCODING 465 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -60 -90 -90 -90 -60 -ENDCHAR -STARTCHAR uni01D2 -ENCODING 466 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -00 -60 -90 -90 -60 -ENDCHAR -STARTCHAR Gcaron -ENCODING 486 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -20 -70 -80 -B0 -90 -60 -ENDCHAR -STARTCHAR gcaron -ENCODING 487 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -50 -20 -00 -60 -90 -90 -70 -10 -60 -ENDCHAR -STARTCHAR Aringacute -ENCODING 506 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -20 -40 -A0 -40 -A0 -E0 -A0 -ENDCHAR -STARTCHAR aringacute -ENCODING 507 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -10 -20 -50 -70 -90 -90 -70 -ENDCHAR -STARTCHAR AEacute -ENCODING 508 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -20 -78 -A0 -F0 -A0 -B8 -ENDCHAR -STARTCHAR aeacute -ENCODING 509 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -20 -00 -70 -A8 -B0 -78 -ENDCHAR -STARTCHAR Oslashacute -ENCODING 510 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -10 -20 -70 -B0 -D0 -D0 -E0 -ENDCHAR -STARTCHAR oslashacute -ENCODING 511 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -70 -B0 -D0 -E0 -ENDCHAR -STARTCHAR Scommaaccent -ENCODING 536 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -60 -90 -40 -20 -90 -60 -20 -40 -ENDCHAR -STARTCHAR scommaaccent -ENCODING 537 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -70 -C0 -30 -E0 -20 -40 -ENDCHAR -STARTCHAR Tcommaaccent -ENCODING 538 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -F8 -20 -20 -20 -20 -20 -10 -20 -ENDCHAR -STARTCHAR tcommaaccent -ENCODING 539 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -40 -40 -E0 -40 -50 -20 -20 -40 -ENDCHAR -STARTCHAR uni0258 -ENCODING 600 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -60 -D0 -30 -E0 -ENDCHAR -STARTCHAR uni0259 -ENCODING 601 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -E0 -30 -D0 -60 -ENDCHAR -STARTCHAR uni02BB -ENCODING 699 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 3 -BITMAP -40 -80 -C0 -ENDCHAR -STARTCHAR afii57929 -ENCODING 700 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 3 -BITMAP -C0 -40 -80 -ENDCHAR -STARTCHAR afii64937 -ENCODING 701 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 3 -BITMAP -C0 -80 -40 -ENDCHAR -STARTCHAR circumflex -ENCODING 710 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 2 1 5 -BITMAP -40 -A0 -ENDCHAR -STARTCHAR caron -ENCODING 711 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 2 1 5 -BITMAP -A0 -40 -ENDCHAR -STARTCHAR macron -ENCODING 713 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 5 -BITMAP -E0 -ENDCHAR -STARTCHAR breve -ENCODING 728 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 2 1 5 -BITMAP -90 -60 -ENDCHAR -STARTCHAR dotaccent -ENCODING 729 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 2 5 -BITMAP -80 -ENDCHAR -STARTCHAR ring -ENCODING 730 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 4 -BITMAP -40 -A0 -40 -ENDCHAR -STARTCHAR ogonek -ENCODING 731 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 -2 -BITMAP -80 -40 -ENDCHAR -STARTCHAR tilde -ENCODING 732 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 2 1 5 -BITMAP -50 -A0 -ENDCHAR -STARTCHAR hungarumlaut -ENCODING 733 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 5 -BITMAP -48 -90 -ENDCHAR -STARTCHAR gravecomb -ENCODING 768 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 1 5 -BITMAP -80 -40 -ENDCHAR -STARTCHAR acutecomb -ENCODING 769 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 5 -BITMAP -40 -80 -ENDCHAR -STARTCHAR uni0302 -ENCODING 770 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 2 1 5 -BITMAP -40 -A0 -ENDCHAR -STARTCHAR tildecomb -ENCODING 771 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 2 1 5 -BITMAP -50 -A0 -ENDCHAR -STARTCHAR uni0304 -ENCODING 772 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 6 -BITMAP -E0 -ENDCHAR -STARTCHAR uni0305 -ENCODING 773 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 1 0 6 -BITMAP -F8 -ENDCHAR -STARTCHAR uni0306 -ENCODING 774 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 5 -BITMAP -88 -70 -ENDCHAR -STARTCHAR uni0307 -ENCODING 775 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 2 6 -BITMAP -80 -ENDCHAR -STARTCHAR uni0308 -ENCODING 776 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 6 -BITMAP -A0 -ENDCHAR -STARTCHAR hookabovecomb -ENCODING 777 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 4 -BITMAP -C0 -20 -40 -ENDCHAR -STARTCHAR uni030A -ENCODING 778 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 4 -BITMAP -40 -A0 -40 -ENDCHAR -STARTCHAR uni030B -ENCODING 779 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 5 -BITMAP -48 -90 -ENDCHAR -STARTCHAR uni030C -ENCODING 780 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 2 1 5 -BITMAP -A0 -40 -ENDCHAR -STARTCHAR uni030D -ENCODING 781 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 2 2 5 -BITMAP -80 -80 -ENDCHAR -STARTCHAR uni030E -ENCODING 782 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 2 1 5 -BITMAP -A0 -A0 -ENDCHAR -STARTCHAR uni030F -ENCODING 783 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 5 -BITMAP -90 -48 -ENDCHAR -STARTCHAR uni0310 -ENCODING 784 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 5 -BITMAP -A8 -70 -ENDCHAR -STARTCHAR uni0311 -ENCODING 785 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 5 -BITMAP -70 -88 -ENDCHAR -STARTCHAR uni0312 -ENCODING 786 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 4 -BITMAP -40 -80 -C0 -ENDCHAR -STARTCHAR uni0313 -ENCODING 787 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 4 -BITMAP -C0 -40 -80 -ENDCHAR -STARTCHAR uni0314 -ENCODING 788 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 4 -BITMAP -C0 -80 -40 -ENDCHAR -STARTCHAR dotbelowcomb -ENCODING 803 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 2 -2 -BITMAP -80 -ENDCHAR -STARTCHAR uni0324 -ENCODING 804 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 -2 -BITMAP -A0 -ENDCHAR -STARTCHAR uni0374 -ENCODING 884 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 5 -BITMAP -40 -80 -ENDCHAR -STARTCHAR uni0375 -ENCODING 885 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 -2 -BITMAP -40 -80 -ENDCHAR -STARTCHAR uni037A -ENCODING 890 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 -2 -BITMAP -80 -C0 -ENDCHAR -STARTCHAR uni037E -ENCODING 894 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 7 2 -2 -BITMAP -C0 -C0 -00 -C0 -40 -40 -80 -ENDCHAR -STARTCHAR tonos -ENCODING 900 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 2 2 5 -BITMAP -80 -80 -ENDCHAR -STARTCHAR dieresistonos -ENCODING 901 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 5 -BITMAP -20 -A8 -ENDCHAR -STARTCHAR Alphatonos -ENCODING 902 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -80 -B0 -48 -48 -78 -48 -48 -ENDCHAR -STARTCHAR anoteleia -ENCODING 903 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 2 2 -BITMAP -80 -ENDCHAR -STARTCHAR Epsilontonos -ENCODING 904 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -80 -B8 -20 -30 -20 -20 -38 -ENDCHAR -STARTCHAR Etatonos -ENCODING 905 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -80 -A8 -28 -38 -28 -28 -28 -ENDCHAR -STARTCHAR Iotatonos -ENCODING 906 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -80 -B8 -10 -10 -10 -10 -38 -ENDCHAR -STARTCHAR Omicrontonos -ENCODING 908 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -80 -B0 -48 -48 -48 -48 -30 -ENDCHAR -STARTCHAR Upsilontonos -ENCODING 910 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -80 -A8 -28 -28 -10 -10 -10 -ENDCHAR -STARTCHAR Omegatonos -ENCODING 911 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -80 -B0 -48 -48 -48 -30 -78 -ENDCHAR -STARTCHAR iotadieresistonos -ENCODING 912 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -A8 -00 -20 -20 -20 -10 -ENDCHAR -STARTCHAR Alpha -ENCODING 913 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -50 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR Beta -ENCODING 914 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F0 -88 -F0 -88 -88 -F0 -ENDCHAR -STARTCHAR Gamma -ENCODING 915 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR Delta -ENCODING 916 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -20 -50 -50 -88 -F8 -ENDCHAR -STARTCHAR Epsilon -ENCODING 917 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -80 -E0 -80 -80 -F0 -ENDCHAR -STARTCHAR Zeta -ENCODING 918 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -10 -20 -40 -80 -F0 -ENDCHAR -STARTCHAR Eta -ENCODING 919 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -90 -F0 -90 -90 -90 -ENDCHAR -STARTCHAR Theta -ENCODING 920 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -F8 -88 -88 -70 -ENDCHAR -STARTCHAR Iota -ENCODING 921 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -E0 -40 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR Kappa -ENCODING 922 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -A0 -C0 -A0 -90 -90 -ENDCHAR -STARTCHAR Lambda -ENCODING 923 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -20 -50 -50 -88 -88 -ENDCHAR -STARTCHAR Mu -ENCODING 924 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -D8 -A8 -A8 -88 -88 -ENDCHAR -STARTCHAR Nu -ENCODING 925 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -D0 -B0 -90 -90 -90 -ENDCHAR -STARTCHAR Xi -ENCODING 926 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -00 -60 -00 -00 -F0 -ENDCHAR -STARTCHAR Omicron -ENCODING 927 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR Pi -ENCODING 928 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -90 -90 -90 -90 -90 -ENDCHAR -STARTCHAR Rho -ENCODING 929 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -E0 -90 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR Sigma -ENCODING 931 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -80 -40 -40 -80 -F0 -ENDCHAR -STARTCHAR Tau -ENCODING 932 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR Upsilon -ENCODING 933 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -88 -50 -20 -20 -20 -ENDCHAR -STARTCHAR Phi -ENCODING 934 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -70 -A8 -A8 -70 -20 -ENDCHAR -STARTCHAR Chi -ENCODING 935 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -50 -20 -20 -50 -88 -ENDCHAR -STARTCHAR Psi -ENCODING 936 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -A8 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR Omega -ENCODING 937 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -88 -88 -50 -D8 -ENDCHAR -STARTCHAR Iotadieresis -ENCODING 938 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -A0 -00 -E0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR Upsilondieresis -ENCODING 939 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -50 -00 -88 -50 -20 -20 -20 -ENDCHAR -STARTCHAR alphatonos -ENCODING 940 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -10 -20 -00 -70 -90 -90 -70 -ENDCHAR -STARTCHAR epsilontonos -ENCODING 941 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -10 -20 -00 -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR etatonos -ENCODING 942 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -10 -20 -00 -B0 -C8 -88 -88 -08 -08 -ENDCHAR -STARTCHAR iotatonos -ENCODING 943 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -40 -80 -00 -80 -80 -A0 -40 -ENDCHAR -STARTCHAR upsilondieresistonos -ENCODING 944 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -A8 -00 -88 -88 -88 -70 -ENDCHAR -STARTCHAR alpha -ENCODING 945 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -70 -90 -90 -70 -ENDCHAR -STARTCHAR beta -ENCODING 946 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -60 -90 -E0 -90 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR gamma -ENCODING 947 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -88 -88 -50 -50 -20 -20 -ENDCHAR -STARTCHAR delta -ENCODING 948 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -80 -70 -88 -88 -70 -ENDCHAR -STARTCHAR epsilon -ENCODING 949 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -60 -B0 -C0 -70 -ENDCHAR -STARTCHAR zeta -ENCODING 950 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -F8 -20 -40 -40 -30 -08 -30 -ENDCHAR -STARTCHAR eta -ENCODING 951 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -B0 -C8 -88 -88 -08 -08 -ENDCHAR -STARTCHAR theta -ENCODING 952 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -F0 -90 -90 -60 -ENDCHAR -STARTCHAR iota -ENCODING 953 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 1 0 -BITMAP -80 -80 -A0 -40 -ENDCHAR -STARTCHAR kappa -ENCODING 954 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -90 -A0 -C0 -B0 -ENDCHAR -STARTCHAR lambda -ENCODING 955 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -08 -68 -98 -88 -ENDCHAR -STARTCHAR mu -ENCODING 956 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -88 -88 -98 -E8 -80 -80 -ENDCHAR -STARTCHAR nu -ENCODING 957 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -88 -50 -20 -ENDCHAR -STARTCHAR xi -ENCODING 958 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -F8 -20 -40 -70 -80 -70 -08 -10 -ENDCHAR -STARTCHAR omicron -ENCODING 959 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -60 -90 -90 -60 -ENDCHAR -STARTCHAR pi -ENCODING 960 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -50 -50 -50 -ENDCHAR -STARTCHAR rho -ENCODING 961 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -70 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR sigma1 -ENCODING 962 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -70 -88 -80 -70 -08 -30 -ENDCHAR -STARTCHAR sigma -ENCODING 963 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -78 -90 -88 -70 -ENDCHAR -STARTCHAR tau -ENCODING 964 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -F0 -40 -50 -20 -ENDCHAR -STARTCHAR upsilon -ENCODING 965 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -88 -88 -70 -ENDCHAR -STARTCHAR phi -ENCODING 966 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -90 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR chi -ENCODING 967 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -88 -50 -20 -50 -88 -88 -ENDCHAR -STARTCHAR psi -ENCODING 968 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -A8 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR omega -ENCODING 969 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -50 -88 -A8 -50 -ENDCHAR -STARTCHAR iotadieresis -ENCODING 970 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -A0 -00 -40 -40 -50 -20 -ENDCHAR -STARTCHAR upsilondieresis -ENCODING 971 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -50 -00 -88 -88 -88 -70 -ENDCHAR -STARTCHAR omicrontonos -ENCODING 972 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -20 -00 -70 -88 -88 -70 -ENDCHAR -STARTCHAR upsilontonos -ENCODING 973 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -20 -00 -88 -88 -88 -70 -ENDCHAR -STARTCHAR omegatonos -ENCODING 974 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -20 -00 -50 -88 -A8 -50 -ENDCHAR -STARTCHAR uni03D0 -ENCODING 976 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -60 -90 -90 -F0 -88 -70 -ENDCHAR -STARTCHAR theta1 -ENCODING 977 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -50 -38 -D0 -50 -20 -ENDCHAR -STARTCHAR Upsilon1 -ENCODING 978 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -90 -A8 -40 -40 -40 -40 -ENDCHAR -STARTCHAR uni03D3 -ENCODING 979 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -D0 -28 -60 -A0 -20 -20 -ENDCHAR -STARTCHAR uni03D4 -ENCODING 980 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -A0 -00 -90 -A8 -40 -40 -40 -ENDCHAR -STARTCHAR phi1 -ENCODING 981 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -20 -20 -70 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR omega1 -ENCODING 982 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -88 -A8 -50 -ENDCHAR -STARTCHAR uni03D7 -ENCODING 983 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -10 -20 -00 -88 -48 -70 -88 -08 -30 -ENDCHAR -STARTCHAR uni03DA -ENCODING 986 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -30 -48 -80 -80 -80 -70 -08 -10 -ENDCHAR -STARTCHAR uni03DB -ENCODING 987 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -2 -BITMAP -08 -70 -80 -80 -70 -08 -30 -ENDCHAR -STARTCHAR uni03DC -ENCODING 988 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -80 -80 -E0 -80 -80 -ENDCHAR -STARTCHAR uni03DD -ENCODING 989 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -2 -BITMAP -F0 -80 -80 -E0 -80 -80 -ENDCHAR -STARTCHAR uni03DE -ENCODING 990 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -80 -88 -98 -A8 -C8 -08 -ENDCHAR -STARTCHAR uni03DF -ENCODING 991 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -20 -40 -80 -F8 -08 -10 -20 -20 -ENDCHAR -STARTCHAR uni03E0 -ENCODING 992 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -50 -50 -98 -A8 -A8 -ENDCHAR -STARTCHAR uni03E1 -ENCODING 993 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -E0 -10 -30 -48 -18 -28 -08 -08 -ENDCHAR -STARTCHAR uni03E2 -ENCODING 994 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -A8 -A8 -A8 -A8 -78 -08 -F0 -ENDCHAR -STARTCHAR uni03E3 -ENCODING 995 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 -1 -BITMAP -A8 -A8 -78 -08 -F0 -ENDCHAR -STARTCHAR uni03E4 -ENCODING 996 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -48 -A8 -88 -78 -08 -08 -ENDCHAR -STARTCHAR uni03E5 -ENCODING 997 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -50 -90 -70 -10 -ENDCHAR -STARTCHAR uni03E6 -ENCODING 998 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -80 -80 -B0 -C8 -88 -08 -F0 -ENDCHAR -STARTCHAR uni03E7 -ENCODING 999 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -70 -A8 -48 -08 -F0 -ENDCHAR -STARTCHAR uni03E8 -ENCODING 1000 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -08 -70 -80 -78 -ENDCHAR -STARTCHAR uni03E9 -ENCODING 1001 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -88 -70 -80 -78 -ENDCHAR -STARTCHAR uni03EA -ENCODING 1002 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -50 -A8 -20 -50 -88 -F8 -ENDCHAR -STARTCHAR uni03EB -ENCODING 1003 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -50 -A8 -20 -50 -70 -ENDCHAR -STARTCHAR uni03EC -ENCODING 1004 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -08 -70 -80 -F0 -88 -70 -ENDCHAR -STARTCHAR uni03ED -ENCODING 1005 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -08 -70 -80 -D8 -70 -ENDCHAR -STARTCHAR uni03EE -ENCODING 1006 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -20 -F8 -A8 -20 -70 -ENDCHAR -STARTCHAR uni03EF -ENCODING 1007 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -20 -30 -20 -F8 -A0 -20 -60 -20 -ENDCHAR -STARTCHAR uni03F0 -ENCODING 1008 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -48 -70 -88 -ENDCHAR -STARTCHAR uni03F1 -ENCODING 1009 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -70 -88 -88 -F0 -80 -78 -ENDCHAR -STARTCHAR uni03F2 -ENCODING 1010 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -70 -88 -80 -78 -ENDCHAR -STARTCHAR uni03F3 -ENCODING 1011 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -10 -00 -30 -10 -10 -90 -90 -60 -ENDCHAR -STARTCHAR uni03F4 -ENCODING 1012 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -F8 -88 -88 -70 -ENDCHAR -STARTCHAR uni03F5 -ENCODING 1013 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -70 -E0 -80 -70 -ENDCHAR -STARTCHAR uni0400 -ENCODING 1024 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -20 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR afii10023 -ENCODING 1025 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -50 -00 -F0 -80 -E0 -80 -F0 -ENDCHAR -STARTCHAR afii10051 -ENCODING 1026 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -F8 -20 -30 -28 -28 -28 -08 -10 -ENDCHAR -STARTCHAR afii10052 -ENCODING 1027 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -F0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR afii10053 -ENCODING 1028 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -E0 -80 -88 -70 -ENDCHAR -STARTCHAR afii10054 -ENCODING 1029 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -40 -20 -90 -60 -ENDCHAR -STARTCHAR afii10055 -ENCODING 1030 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -E0 -40 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR afii10056 -ENCODING 1031 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -A0 -00 -E0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR afii10057 -ENCODING 1032 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -38 -10 -10 -10 -90 -60 -ENDCHAR -STARTCHAR afii10058 -ENCODING 1033 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -60 -A0 -B0 -A8 -A8 -B0 -ENDCHAR -STARTCHAR afii10059 -ENCODING 1034 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -A0 -A0 -F0 -A8 -A8 -B0 -ENDCHAR -STARTCHAR afii10060 -ENCODING 1035 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -20 -30 -28 -28 -28 -ENDCHAR -STARTCHAR afii10061 -ENCODING 1036 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -10 -20 -90 -A0 -C0 -A0 -90 -ENDCHAR -STARTCHAR uni040D -ENCODING 1037 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -40 -20 -88 -98 -A8 -C8 -88 -ENDCHAR -STARTCHAR afii10062 -ENCODING 1038 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -48 -30 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10145 -ENCODING 1039 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -88 -88 -88 -88 -88 -F8 -20 -20 -ENDCHAR -STARTCHAR afii10017 -ENCODING 1040 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -50 -88 -F8 -88 -88 -ENDCHAR -STARTCHAR afii10018 -ENCODING 1041 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F0 -80 -F0 -88 -88 -F0 -ENDCHAR -STARTCHAR afii10019 -ENCODING 1042 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F0 -88 -F0 -88 -88 -F0 -ENDCHAR -STARTCHAR afii10020 -ENCODING 1043 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR afii10021 -ENCODING 1044 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -30 -50 -50 -50 -50 -F8 -88 -ENDCHAR -STARTCHAR afii10022 -ENCODING 1045 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -80 -E0 -80 -80 -F0 -ENDCHAR -STARTCHAR afii10024 -ENCODING 1046 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -A8 -A8 -70 -A8 -A8 -A8 -ENDCHAR -STARTCHAR afii10025 -ENCODING 1047 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -30 -08 -88 -70 -ENDCHAR -STARTCHAR afii10026 -ENCODING 1048 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -B0 -D0 -90 -90 -90 -ENDCHAR -STARTCHAR afii10027 -ENCODING 1049 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -90 -60 -90 -B0 -D0 -90 -90 -ENDCHAR -STARTCHAR afii10028 -ENCODING 1050 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -A0 -C0 -A0 -90 -90 -ENDCHAR -STARTCHAR afii10029 -ENCODING 1051 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -38 -48 -48 -48 -48 -88 -ENDCHAR -STARTCHAR afii10030 -ENCODING 1052 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -D8 -A8 -A8 -88 -88 -ENDCHAR -STARTCHAR afii10031 -ENCODING 1053 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -90 -90 -F0 -90 -90 -90 -ENDCHAR -STARTCHAR afii10032 -ENCODING 1054 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR afii10033 -ENCODING 1055 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR afii10034 -ENCODING 1056 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -E0 -90 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR afii10035 -ENCODING 1057 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -80 -80 -90 -60 -ENDCHAR -STARTCHAR afii10036 -ENCODING 1058 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR afii10037 -ENCODING 1059 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10038 -ENCODING 1060 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -70 -A8 -A8 -70 -20 -ENDCHAR -STARTCHAR afii10039 -ENCODING 1061 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -50 -20 -20 -50 -88 -ENDCHAR -STARTCHAR afii10040 -ENCODING 1062 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -90 -90 -90 -90 -90 -F8 -08 -10 -ENDCHAR -STARTCHAR afii10041 -ENCODING 1063 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -88 -88 -78 -08 -08 -ENDCHAR -STARTCHAR afii10042 -ENCODING 1064 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -A8 -A8 -A8 -A8 -A8 -F8 -ENDCHAR -STARTCHAR afii10043 -ENCODING 1065 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -A8 -A8 -A8 -A8 -A8 -F8 -08 -10 -ENDCHAR -STARTCHAR afii10044 -ENCODING 1066 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -C0 -40 -70 -48 -48 -70 -ENDCHAR -STARTCHAR afii10045 -ENCODING 1067 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -88 -E8 -98 -98 -E8 -ENDCHAR -STARTCHAR afii10046 -ENCODING 1068 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -80 -E0 -90 -90 -E0 -ENDCHAR -STARTCHAR afii10047 -ENCODING 1069 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -38 -08 -88 -70 -ENDCHAR -STARTCHAR afii10048 -ENCODING 1070 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -90 -A8 -E8 -E8 -A8 -90 -ENDCHAR -STARTCHAR afii10049 -ENCODING 1071 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -70 -90 -90 -70 -90 -90 -ENDCHAR -STARTCHAR afii10065 -ENCODING 1072 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -70 -90 -90 -78 -ENDCHAR -STARTCHAR afii10066 -ENCODING 1073 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -10 -60 -80 -E0 -90 -90 -60 -ENDCHAR -STARTCHAR afii10067 -ENCODING 1074 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -C0 -A0 -D0 -E0 -ENDCHAR -STARTCHAR afii10068 -ENCODING 1075 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -F0 -80 -80 -80 -ENDCHAR -STARTCHAR afii10069 -ENCODING 1076 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 -1 -BITMAP -30 -50 -50 -F8 -88 -ENDCHAR -STARTCHAR afii10070 -ENCODING 1077 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 0 0 -BITMAP -60 -90 -E0 -70 -ENDCHAR -STARTCHAR afii10072 -ENCODING 1078 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -A8 -70 -70 -A8 -ENDCHAR -STARTCHAR afii10073 -ENCODING 1079 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -60 -50 -30 -E0 -ENDCHAR -STARTCHAR afii10074 -ENCODING 1080 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -98 -A8 -C8 -ENDCHAR -STARTCHAR afii10075 -ENCODING 1081 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -88 -70 -00 -88 -98 -A8 -C8 -ENDCHAR -STARTCHAR afii10076 -ENCODING 1082 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -90 -A0 -E0 -90 -ENDCHAR -STARTCHAR afii10077 -ENCODING 1083 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -38 -48 -48 -88 -ENDCHAR -STARTCHAR afii10078 -ENCODING 1084 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -D8 -A8 -88 -ENDCHAR -STARTCHAR afii10079 -ENCODING 1085 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -F8 -88 -88 -ENDCHAR -STARTCHAR afii10080 -ENCODING 1086 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -70 -88 -88 -70 -ENDCHAR -STARTCHAR afii10081 -ENCODING 1087 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -88 -88 -88 -ENDCHAR -STARTCHAR afii10082 -ENCODING 1088 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -F0 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR afii10083 -ENCODING 1089 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -70 -88 -80 -78 -ENDCHAR -STARTCHAR afii10084 -ENCODING 1090 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -20 -20 -20 -ENDCHAR -STARTCHAR afii10085 -ENCODING 1091 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -88 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10086 -ENCODING 1092 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -20 -20 -70 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR afii10087 -ENCODING 1093 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -90 -60 -60 -90 -ENDCHAR -STARTCHAR afii10088 -ENCODING 1094 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -90 -90 -90 -F8 -08 -10 -ENDCHAR -STARTCHAR afii10089 -ENCODING 1095 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -88 -78 -08 -ENDCHAR -STARTCHAR afii10090 -ENCODING 1096 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -A8 -A8 -A8 -F8 -ENDCHAR -STARTCHAR afii10091 -ENCODING 1097 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -A8 -A8 -A8 -F8 -08 -10 -ENDCHAR -STARTCHAR afii10092 -ENCODING 1098 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -C0 -70 -48 -70 -ENDCHAR -STARTCHAR afii10093 -ENCODING 1099 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -E8 -98 -E8 -ENDCHAR -STARTCHAR afii10094 -ENCODING 1100 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -80 -E0 -90 -E0 -ENDCHAR -STARTCHAR afii10095 -ENCODING 1101 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 0 0 -BITMAP -E0 -50 -30 -E0 -ENDCHAR -STARTCHAR afii10096 -ENCODING 1102 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -90 -E8 -E8 -90 -ENDCHAR -STARTCHAR afii10097 -ENCODING 1103 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 0 0 -BITMAP -70 -90 -70 -90 -ENDCHAR -STARTCHAR uni0450 -ENCODING 1104 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -20 -00 -60 -90 -E0 -70 -ENDCHAR -STARTCHAR afii10071 -ENCODING 1105 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -A0 -00 -60 -90 -E0 -70 -ENDCHAR -STARTCHAR afii10099 -ENCODING 1106 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -40 -E0 -40 -70 -48 -48 -08 -10 -ENDCHAR -STARTCHAR afii10100 -ENCODING 1107 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -F0 -80 -80 -80 -ENDCHAR -STARTCHAR afii10101 -ENCODING 1108 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -70 -A0 -C0 -70 -ENDCHAR -STARTCHAR afii10102 -ENCODING 1109 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -70 -C0 -30 -E0 -ENDCHAR -STARTCHAR afii10103 -ENCODING 1110 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -40 -00 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR afii10104 -ENCODING 1111 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -A0 -00 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR afii10105 -ENCODING 1112 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -10 -00 -30 -10 -10 -10 -90 -60 -ENDCHAR -STARTCHAR afii10106 -ENCODING 1113 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -60 -B0 -A8 -B0 -ENDCHAR -STARTCHAR afii10107 -ENCODING 1114 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -A0 -F0 -A8 -B0 -ENDCHAR -STARTCHAR afii10108 -ENCODING 1115 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -40 -E0 -40 -70 -48 -48 -ENDCHAR -STARTCHAR afii10109 -ENCODING 1116 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -40 -00 -90 -A0 -E0 -90 -ENDCHAR -STARTCHAR uni045D -ENCODING 1117 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -40 -20 -00 -88 -98 -A8 -C8 -ENDCHAR -STARTCHAR afii10110 -ENCODING 1118 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -48 -30 -00 -88 -88 -78 -08 -70 -ENDCHAR -STARTCHAR afii10193 -ENCODING 1119 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -88 -88 -88 -F8 -20 -20 -ENDCHAR -STARTCHAR afii10146 -ENCODING 1122 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -40 -E0 -40 -70 -48 -48 -70 -ENDCHAR -STARTCHAR afii10194 -ENCODING 1123 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -40 -40 -E0 -70 -48 -70 -ENDCHAR -STARTCHAR uni0470 -ENCODING 1136 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -A8 -A8 -A8 -70 -20 -20 -ENDCHAR -STARTCHAR uni0471 -ENCODING 1137 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -A8 -A8 -70 -20 -ENDCHAR -STARTCHAR afii10147 -ENCODING 1138 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -F8 -88 -88 -70 -ENDCHAR -STARTCHAR afii10195 -ENCODING 1139 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -70 -A8 -D8 -70 -ENDCHAR -STARTCHAR afii10148 -ENCODING 1140 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -90 -B0 -E0 -40 -40 -ENDCHAR -STARTCHAR afii10196 -ENCODING 1141 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -80 -B0 -60 -40 -ENDCHAR -STARTCHAR afii10050 -ENCODING 1168 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -10 -F0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR afii10098 -ENCODING 1169 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -10 -F0 -80 -80 -80 -ENDCHAR -STARTCHAR uni0492 -ENCODING 1170 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -78 -40 -F0 -40 -40 -40 -ENDCHAR -STARTCHAR uni0493 -ENCODING 1171 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -78 -40 -E0 -40 -ENDCHAR -STARTCHAR uni0496 -ENCODING 1174 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 8 0 -2 -BITMAP -A8 -A8 -70 -A8 -A8 -AC -04 -04 -ENDCHAR -STARTCHAR uni0497 -ENCODING 1175 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 6 0 -2 -BITMAP -A8 -70 -70 -A8 -04 -04 -ENDCHAR -STARTCHAR uni049A -ENCODING 1178 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 1 -2 -BITMAP -90 -A0 -C0 -A0 -90 -90 -08 -08 -ENDCHAR -STARTCHAR uni049B -ENCODING 1179 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 1 -2 -BITMAP -90 -A0 -E0 -90 -08 -08 -ENDCHAR -STARTCHAR uni04AE -ENCODING 1198 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -88 -50 -20 -20 -20 -ENDCHAR -STARTCHAR uni04AF -ENCODING 1199 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -88 -88 -50 -20 -20 -20 -ENDCHAR -STARTCHAR uni04B0 -ENCODING 1200 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -88 -50 -F8 -20 -20 -ENDCHAR -STARTCHAR uni04B1 -ENCODING 1201 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -88 -88 -50 -F8 -20 -20 -ENDCHAR -STARTCHAR uni04B2 -ENCODING 1202 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 8 0 -2 -BITMAP -88 -50 -20 -20 -50 -88 -04 -04 -ENDCHAR -STARTCHAR uni04B3 -ENCODING 1203 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 1 -2 -BITMAP -90 -60 -60 -90 -08 -08 -ENDCHAR -STARTCHAR uni04BA -ENCODING 1210 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -80 -80 -F0 -88 -88 -88 -ENDCHAR -STARTCHAR uni04BB -ENCODING 1211 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -80 -80 -E0 -90 -90 -90 -ENDCHAR -STARTCHAR uni04D8 -ENCODING 1240 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -90 -10 -F0 -90 -60 -ENDCHAR -STARTCHAR afii10846 -ENCODING 1241 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -E0 -30 -D0 -60 -ENDCHAR -STARTCHAR uni04E2 -ENCODING 1250 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 0 -BITMAP -E0 -00 -E0 -40 -40 -40 -E0 -ENDCHAR -STARTCHAR uni04E3 -ENCODING 1251 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -E0 -00 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR uni04E8 -ENCODING 1256 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -F8 -88 -88 -70 -ENDCHAR -STARTCHAR uni04E9 -ENCODING 1257 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -60 -F0 -90 -60 -ENDCHAR -STARTCHAR uni04EE -ENCODING 1262 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -F0 -00 -90 -90 -90 -90 -60 -ENDCHAR -STARTCHAR uni04EF -ENCODING 1263 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -00 -90 -90 -90 -70 -ENDCHAR -STARTCHAR afii57664 -ENCODING 1488 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -90 -48 -B0 -88 -ENDCHAR -STARTCHAR afii57665 -ENCODING 1489 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F0 -10 -10 -F8 -ENDCHAR -STARTCHAR afii57666 -ENCODING 1490 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 1 0 -BITMAP -80 -40 -60 -A0 -ENDCHAR -STARTCHAR afii57667 -ENCODING 1491 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -10 -10 -10 -ENDCHAR -STARTCHAR afii57668 -ENCODING 1492 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -08 -88 -88 -ENDCHAR -STARTCHAR afii57669 -ENCODING 1493 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 4 2 0 -BITMAP -C0 -40 -40 -40 -ENDCHAR -STARTCHAR afii57670 -ENCODING 1494 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -20 -10 -10 -ENDCHAR -STARTCHAR afii57671 -ENCODING 1495 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -48 -48 -48 -ENDCHAR -STARTCHAR afii57672 -ENCODING 1496 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -98 -A8 -88 -F8 -ENDCHAR -STARTCHAR afii57673 -ENCODING 1497 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 2 -BITMAP -C0 -40 -ENDCHAR -STARTCHAR afii57674 -ENCODING 1498 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -F8 -08 -08 -08 -08 -08 -ENDCHAR -STARTCHAR afii57675 -ENCODING 1499 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -08 -08 -F0 -ENDCHAR -STARTCHAR afii57676 -ENCODING 1500 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -80 -80 -F8 -08 -10 -60 -ENDCHAR -STARTCHAR afii57677 -ENCODING 1501 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -48 -48 -78 -ENDCHAR -STARTCHAR afii57678 -ENCODING 1502 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -90 -A8 -48 -98 -ENDCHAR -STARTCHAR afii57679 -ENCODING 1503 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 6 2 -2 -BITMAP -C0 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR afii57680 -ENCODING 1504 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -30 -10 -10 -F0 -ENDCHAR -STARTCHAR afii57681 -ENCODING 1505 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -F0 -50 -50 -60 -ENDCHAR -STARTCHAR afii57682 -ENCODING 1506 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -D8 -48 -50 -E0 -ENDCHAR -STARTCHAR afii57683 -ENCODING 1507 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -F8 -48 -48 -08 -08 -08 -ENDCHAR -STARTCHAR afii57684 -ENCODING 1508 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -48 -08 -F0 -ENDCHAR -STARTCHAR afii57685 -ENCODING 1509 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -90 -48 -50 -60 -40 -40 -ENDCHAR -STARTCHAR afii57686 -ENCODING 1510 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -90 -48 -30 -F8 -ENDCHAR -STARTCHAR afii57687 -ENCODING 1511 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -F8 -08 -88 -B0 -80 -80 -ENDCHAR -STARTCHAR afii57688 -ENCODING 1512 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F0 -08 -08 -08 -ENDCHAR -STARTCHAR afii57689 -ENCODING 1513 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -A8 -E8 -88 -F0 -ENDCHAR -STARTCHAR afii57690 -ENCODING 1514 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -F8 -48 -48 -C8 -ENDCHAR -STARTCHAR afii57716 -ENCODING 1520 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -D8 -48 -48 -48 -ENDCHAR -STARTCHAR afii57717 -ENCODING 1521 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -D8 -48 -08 -08 -ENDCHAR -STARTCHAR afii57718 -ENCODING 1522 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 2 -BITMAP -D8 -48 -ENDCHAR -STARTCHAR uni05F3 -ENCODING 1523 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 2 2 2 -BITMAP -40 -80 -ENDCHAR -STARTCHAR uni05F4 -ENCODING 1524 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 2 -BITMAP -48 -90 -ENDCHAR -STARTCHAR uni1E02 -ENCODING 7682 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -00 -F0 -88 -F0 -88 -F0 -ENDCHAR -STARTCHAR uni1E03 -ENCODING 7683 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -80 -80 -E0 -90 -90 -E0 -ENDCHAR -STARTCHAR uni1E0A -ENCODING 7690 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -00 -E0 -90 -90 -90 -E0 -ENDCHAR -STARTCHAR uni1E0B -ENCODING 7691 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -10 -10 -70 -90 -90 -70 -ENDCHAR -STARTCHAR uni1E1E -ENCODING 7710 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -00 -F0 -80 -E0 -80 -80 -ENDCHAR -STARTCHAR uni1E1F -ENCODING 7711 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -00 -20 -50 -E0 -40 -40 -ENDCHAR -STARTCHAR uni1E40 -ENCODING 7744 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -88 -D8 -A8 -A8 -88 -88 -ENDCHAR -STARTCHAR uni1E41 -ENCODING 7745 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -00 -D0 -A8 -A8 -88 -ENDCHAR -STARTCHAR uni1E56 -ENCODING 7766 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -00 -E0 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR uni1E57 -ENCODING 7767 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -2 -BITMAP -40 -00 -E0 -90 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR uni1E60 -ENCODING 7776 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -00 -70 -80 -60 -10 -E0 -ENDCHAR -STARTCHAR uni1E61 -ENCODING 7777 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -20 -00 -70 -C0 -30 -E0 -ENDCHAR -STARTCHAR uni1E6A -ENCODING 7786 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -00 -F8 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni1E6B -ENCODING 7787 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -00 -40 -E0 -40 -50 -20 -ENDCHAR -STARTCHAR Wgrave -ENCODING 7808 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -40 -20 -88 -88 -A8 -D8 -88 -ENDCHAR -STARTCHAR wgrave -ENCODING 7809 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -40 -20 -00 -88 -A8 -A8 -50 -ENDCHAR -STARTCHAR Wacute -ENCODING 7810 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -20 -88 -88 -A8 -D8 -88 -ENDCHAR -STARTCHAR wacute -ENCODING 7811 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -20 -00 -88 -A8 -A8 -50 -ENDCHAR -STARTCHAR Wdieresis -ENCODING 7812 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -50 -00 -88 -88 -A8 -D8 -88 -ENDCHAR -STARTCHAR wdieresis -ENCODING 7813 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -50 -00 -88 -A8 -A8 -50 -ENDCHAR -STARTCHAR Ygrave -ENCODING 7922 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -40 -20 -88 -50 -20 -20 -20 -ENDCHAR -STARTCHAR ygrave -ENCODING 7923 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -40 -20 -00 -90 -90 -90 -70 -90 -60 -ENDCHAR -STARTCHAR uni2010 -ENCODING 8208 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 1 1 2 -BITMAP -F0 -ENDCHAR -STARTCHAR uni2011 -ENCODING 8209 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 1 1 2 -BITMAP -F0 -ENDCHAR -STARTCHAR figuredash -ENCODING 8210 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 1 0 2 -BITMAP -F8 -ENDCHAR -STARTCHAR endash -ENCODING 8211 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 1 0 2 -BITMAP -F8 -ENDCHAR -STARTCHAR emdash -ENCODING 8212 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 2 -BITMAP -FC -ENDCHAR -STARTCHAR afii00208 -ENCODING 8213 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 2 -BITMAP -FC -ENDCHAR -STARTCHAR uni2016 -ENCODING 8214 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -A0 -A0 -A0 -A0 -A0 -A0 -ENDCHAR -STARTCHAR underscoredbl -ENCODING 8215 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 3 0 -2 -BITMAP -FC -00 -FC -ENDCHAR -STARTCHAR quoteleft -ENCODING 8216 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 3 -BITMAP -40 -80 -C0 -ENDCHAR -STARTCHAR quoteright -ENCODING 8217 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 3 -BITMAP -C0 -40 -80 -ENDCHAR -STARTCHAR quotesinglbase -ENCODING 8218 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 -2 -BITMAP -C0 -40 -80 -ENDCHAR -STARTCHAR quotereversed -ENCODING 8219 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 3 -BITMAP -C0 -80 -40 -ENDCHAR -STARTCHAR quotedblleft -ENCODING 8220 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 3 -BITMAP -48 -90 -D8 -ENDCHAR -STARTCHAR quotedblright -ENCODING 8221 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 3 -BITMAP -D8 -48 -90 -ENDCHAR -STARTCHAR quotedblbase -ENCODING 8222 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 -2 -BITMAP -D8 -48 -90 -ENDCHAR -STARTCHAR uni201F -ENCODING 8223 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 3 -BITMAP -D8 -90 -48 -ENDCHAR -STARTCHAR dagger -ENCODING 8224 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -20 -20 -F8 -20 -20 -20 -20 -ENDCHAR -STARTCHAR daggerdbl -ENCODING 8225 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -20 -20 -F8 -20 -F8 -20 -20 -ENDCHAR -STARTCHAR bullet -ENCODING 8226 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 1 -BITMAP -60 -F0 -F0 -60 -ENDCHAR -STARTCHAR uni2023 -ENCODING 8227 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 0 -BITMAP -80 -C0 -E0 -C0 -80 -ENDCHAR -STARTCHAR onedotenleader -ENCODING 8228 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 2 0 -BITMAP -80 -ENDCHAR -STARTCHAR twodotenleader -ENCODING 8229 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 0 -BITMAP -A0 -ENDCHAR -STARTCHAR ellipsis -ENCODING 8230 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 1 0 0 -BITMAP -A8 -ENDCHAR -STARTCHAR uni2027 -ENCODING 8231 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 1 2 2 -BITMAP -C0 -ENDCHAR -STARTCHAR perthousand -ENCODING 8240 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 8 0 -1 -BITMAP -40 -A8 -48 -10 -20 -68 -D4 -28 -ENDCHAR -STARTCHAR minute -ENCODING 8242 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 3 -BITMAP -40 -40 -80 -ENDCHAR -STARTCHAR second -ENCODING 8243 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 3 -BITMAP -48 -48 -90 -ENDCHAR -STARTCHAR uni2034 -ENCODING 8244 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 3 0 3 -BITMAP -54 -54 -A8 -ENDCHAR -STARTCHAR uni2035 -ENCODING 8245 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 3 2 3 -BITMAP -80 -80 -40 -ENDCHAR -STARTCHAR uni2036 -ENCODING 8246 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 3 -BITMAP -90 -90 -48 -ENDCHAR -STARTCHAR uni2037 -ENCODING 8247 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 3 0 3 -BITMAP -A8 -A8 -54 -ENDCHAR -STARTCHAR guilsinglleft -ENCODING 8249 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 0 -BITMAP -20 -40 -80 -40 -20 -ENDCHAR -STARTCHAR guilsinglright -ENCODING 8250 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 0 -BITMAP -80 -40 -20 -40 -80 -ENDCHAR -STARTCHAR exclamdbl -ENCODING 8252 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -A0 -A0 -A0 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni203E -ENCODING 8254 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 5 -BITMAP -FC -ENDCHAR -STARTCHAR fraction -ENCODING 8260 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -10 -10 -20 -40 -80 -80 -ENDCHAR -STARTCHAR zerosuperior -ENCODING 8304 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -40 -A0 -A0 -A0 -40 -ENDCHAR -STARTCHAR uni2071 -ENCODING 8305 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -40 -00 -C0 -40 -E0 -ENDCHAR -STARTCHAR foursuperior -ENCODING 8308 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -A0 -E0 -20 -20 -ENDCHAR -STARTCHAR fivesuperior -ENCODING 8309 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -E0 -80 -C0 -20 -C0 -ENDCHAR -STARTCHAR sixsuperior -ENCODING 8310 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -40 -80 -C0 -A0 -40 -ENDCHAR -STARTCHAR sevensuperior -ENCODING 8311 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -E0 -20 -40 -40 -40 -ENDCHAR -STARTCHAR eightsuperior -ENCODING 8312 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -40 -A0 -40 -A0 -40 -ENDCHAR -STARTCHAR ninesuperior -ENCODING 8313 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -40 -A0 -60 -20 -40 -ENDCHAR -STARTCHAR uni207A -ENCODING 8314 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -40 -E0 -40 -ENDCHAR -STARTCHAR uni207B -ENCODING 8315 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 2 -BITMAP -E0 -ENDCHAR -STARTCHAR uni207C -ENCODING 8316 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -E0 -00 -E0 -ENDCHAR -STARTCHAR parenleftsuperior -ENCODING 8317 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 5 1 1 -BITMAP -40 -80 -80 -80 -40 -ENDCHAR -STARTCHAR parenrightsuperior -ENCODING 8318 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 5 2 1 -BITMAP -80 -40 -40 -40 -80 -ENDCHAR -STARTCHAR nsuperior -ENCODING 8319 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 1 1 -BITMAP -C0 -A0 -A0 -A0 -ENDCHAR -STARTCHAR zeroinferior -ENCODING 8320 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -40 -A0 -A0 -A0 -40 -ENDCHAR -STARTCHAR oneinferior -ENCODING 8321 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -40 -C0 -40 -40 -E0 -ENDCHAR -STARTCHAR twoinferior -ENCODING 8322 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -40 -A0 -20 -40 -E0 -ENDCHAR -STARTCHAR threeinferior -ENCODING 8323 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -C0 -20 -40 -20 -C0 -ENDCHAR -STARTCHAR fourinferior -ENCODING 8324 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -A0 -A0 -E0 -20 -20 -ENDCHAR -STARTCHAR fiveinferior -ENCODING 8325 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -E0 -80 -C0 -20 -C0 -ENDCHAR -STARTCHAR sixinferior -ENCODING 8326 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -40 -80 -C0 -A0 -40 -ENDCHAR -STARTCHAR seveninferior -ENCODING 8327 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -E0 -20 -40 -40 -40 -ENDCHAR -STARTCHAR eightinferior -ENCODING 8328 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -40 -A0 -40 -A0 -40 -ENDCHAR -STARTCHAR nineinferior -ENCODING 8329 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -2 -BITMAP -40 -A0 -60 -20 -40 -ENDCHAR -STARTCHAR uni208A -ENCODING 8330 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 -2 -BITMAP -40 -E0 -40 -ENDCHAR -STARTCHAR uni208B -ENCODING 8331 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 -1 -BITMAP -E0 -ENDCHAR -STARTCHAR uni208C -ENCODING 8332 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 -2 -BITMAP -E0 -00 -E0 -ENDCHAR -STARTCHAR parenleftinferior -ENCODING 8333 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 5 1 -2 -BITMAP -40 -80 -80 -80 -40 -ENDCHAR -STARTCHAR parenrightinferior -ENCODING 8334 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 5 2 -2 -BITMAP -80 -40 -40 -40 -80 -ENDCHAR -STARTCHAR franc -ENCODING 8355 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -80 -E8 -B0 -A0 -A0 -ENDCHAR -STARTCHAR lira -ENCODING 8356 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -30 -48 -E0 -40 -E0 -40 -F8 -ENDCHAR -STARTCHAR peseta -ENCODING 8359 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -60 -50 -F8 -50 -60 -40 -ENDCHAR -STARTCHAR dong -ENCODING 8363 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 1 -2 -BITMAP -10 -38 -70 -90 -90 -70 -00 -F0 -ENDCHAR -STARTCHAR Euro -ENCODING 8364 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -38 -40 -F0 -F0 -40 -38 -ENDCHAR -STARTCHAR uni20AF -ENCODING 8367 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -40 -E0 -50 -48 -48 -E8 -D0 -ENDCHAR -STARTCHAR uni20D0 -ENCODING 8400 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 5 -BITMAP -40 -F8 -ENDCHAR -STARTCHAR uni20D1 -ENCODING 8401 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 5 -BITMAP -10 -F8 -ENDCHAR -STARTCHAR uni20D2 -ENCODING 8402 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 9 2 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uni20D3 -ENCODING 8403 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 6 2 -1 -BITMAP -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uni20D4 -ENCODING 8404 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 4 -BITMAP -B0 -C8 -E0 -ENDCHAR -STARTCHAR uni20D5 -ENCODING 8405 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 4 -BITMAP -68 -98 -38 -ENDCHAR -STARTCHAR uni20D6 -ENCODING 8406 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 4 -BITMAP -40 -F8 -40 -ENDCHAR -STARTCHAR uni20D7 -ENCODING 8407 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 4 -BITMAP -10 -F8 -10 -ENDCHAR -STARTCHAR uni2102 -ENCODING 8450 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -A8 -A0 -A0 -A8 -70 -ENDCHAR -STARTCHAR afii61248 -ENCODING 8453 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -40 -80 -40 -10 -28 -10 -ENDCHAR -STARTCHAR afii61289 -ENCODING 8467 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -20 -50 -50 -60 -40 -B0 -ENDCHAR -STARTCHAR uni2115 -ENCODING 8469 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -C8 -E8 -E8 -D8 -D8 -C8 -ENDCHAR -STARTCHAR afii61352 -ENCODING 8470 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 6 0 0 -BITMAP -90 -D0 -D0 -B8 -B4 -98 -ENDCHAR -STARTCHAR uni211A -ENCODING 8474 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -70 -A8 -A8 -A8 -A8 -70 -18 -ENDCHAR -STARTCHAR uni211D -ENCODING 8477 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F0 -A8 -A8 -B0 -A8 -A8 -ENDCHAR -STARTCHAR trademark -ENCODING 8482 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 3 0 3 -BITMAP -FC -5C -54 -ENDCHAR -STARTCHAR uni2124 -ENCODING 8484 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -28 -50 -50 -A0 -F8 -ENDCHAR -STARTCHAR Omega -ENCODING 8486 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -88 -88 -88 -50 -D8 -ENDCHAR -STARTCHAR estimated -ENCODING 8494 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -D8 -F8 -C0 -70 -ENDCHAR -STARTCHAR oneeighth -ENCODING 8539 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -40 -C0 -40 -50 -68 -10 -28 -10 -ENDCHAR -STARTCHAR threeeighths -ENCODING 8540 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -C0 -20 -40 -30 -E8 -10 -28 -10 -ENDCHAR -STARTCHAR fiveeighths -ENCODING 8541 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -E0 -80 -C0 -30 -E8 -10 -28 -10 -ENDCHAR -STARTCHAR seveneighths -ENCODING 8542 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -E0 -20 -40 -50 -68 -10 -28 -10 -ENDCHAR -STARTCHAR arrowleft -ENCODING 8592 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -40 -F8 -40 -20 -ENDCHAR -STARTCHAR arrowup -ENCODING 8593 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -70 -A8 -20 -20 -20 -ENDCHAR -STARTCHAR arrowright -ENCODING 8594 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -10 -F8 -10 -20 -ENDCHAR -STARTCHAR arrowdown -ENCODING 8595 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -20 -20 -A8 -70 -20 -ENDCHAR -STARTCHAR arrowboth -ENCODING 8596 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 3 0 1 -BITMAP -48 -FC -48 -ENDCHAR -STARTCHAR arrowupdn -ENCODING 8597 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -20 -70 -A8 -20 -A8 -70 -20 -ENDCHAR -STARTCHAR uni21A4 -ENCODING 8612 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -48 -F8 -48 -20 -ENDCHAR -STARTCHAR uni21A5 -ENCODING 8613 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -70 -A8 -20 -20 -70 -ENDCHAR -STARTCHAR uni21A6 -ENCODING 8614 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -90 -F8 -90 -20 -ENDCHAR -STARTCHAR uni21A7 -ENCODING 8615 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -70 -20 -20 -A8 -70 -20 -ENDCHAR -STARTCHAR arrowupdnbse -ENCODING 8616 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -20 -70 -A8 -20 -A8 -70 -20 -F8 -ENDCHAR -STARTCHAR arrowdblleft -ENCODING 8656 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -78 -80 -78 -20 -ENDCHAR -STARTCHAR arrowdblup -ENCODING 8657 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -50 -D8 -50 -50 -50 -ENDCHAR -STARTCHAR arrowdblright -ENCODING 8658 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -F0 -08 -F0 -20 -ENDCHAR -STARTCHAR arrowdbldown -ENCODING 8659 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -50 -50 -50 -D8 -70 -20 -ENDCHAR -STARTCHAR arrowdblboth -ENCODING 8660 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 5 0 0 -BITMAP -30 -78 -84 -78 -30 -ENDCHAR -STARTCHAR uni21D5 -ENCODING 8661 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -20 -70 -D8 -50 -D8 -70 -20 -ENDCHAR -STARTCHAR universal -ENCODING 8704 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -88 -88 -F8 -88 -50 -20 -ENDCHAR -STARTCHAR uni2201 -ENCODING 8705 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -40 -A0 -80 -80 -80 -A0 -40 -ENDCHAR -STARTCHAR partialdiff -ENCODING 8706 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -60 -10 -70 -90 -90 -60 -ENDCHAR -STARTCHAR existential -ENCODING 8707 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -10 -70 -10 -10 -F0 -ENDCHAR -STARTCHAR uni2204 -ENCODING 8708 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -40 -F0 -50 -70 -50 -50 -F0 -40 -ENDCHAR -STARTCHAR emptyset -ENCODING 8709 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -78 -98 -A8 -A8 -C8 -F0 -ENDCHAR -STARTCHAR Delta -ENCODING 8710 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -20 -50 -50 -88 -F8 -ENDCHAR -STARTCHAR gradient -ENCODING 8711 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -88 -50 -50 -20 -20 -ENDCHAR -STARTCHAR element -ENCODING 8712 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -70 -80 -F0 -80 -70 -ENDCHAR -STARTCHAR notelement -ENCODING 8713 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 -1 -BITMAP -20 -70 -A0 -F0 -A0 -70 -20 -ENDCHAR -STARTCHAR suchthat -ENCODING 8715 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -E0 -10 -F0 -10 -E0 -ENDCHAR -STARTCHAR uni220C -ENCODING 8716 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 -1 -BITMAP -40 -E0 -50 -F0 -50 -E0 -40 -ENDCHAR -STARTCHAR product -ENCODING 8719 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -F8 -50 -50 -50 -50 -50 -50 -50 -ENDCHAR -STARTCHAR uni2210 -ENCODING 8720 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -50 -50 -50 -50 -50 -50 -50 -F8 -ENDCHAR -STARTCHAR summation -ENCODING 8721 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -40 -20 -20 -40 -F8 -ENDCHAR -STARTCHAR minus -ENCODING 8722 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 1 0 2 -BITMAP -F8 -ENDCHAR -STARTCHAR uni2213 -ENCODING 8723 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -F8 -00 -20 -20 -F8 -20 -20 -ENDCHAR -STARTCHAR fraction -ENCODING 8725 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -10 -10 -20 -40 -80 -80 -ENDCHAR -STARTCHAR uni2218 -ENCODING 8728 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -40 -A0 -40 -ENDCHAR -STARTCHAR periodcentered -ENCODING 8729 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -40 -E0 -40 -ENDCHAR -STARTCHAR radical -ENCODING 8730 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -0C -08 -08 -08 -10 -D0 -30 -30 -10 -ENDCHAR -STARTCHAR proportional -ENCODING 8733 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 1 -BITMAP -50 -A0 -A0 -50 -ENDCHAR -STARTCHAR infinity -ENCODING 8734 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 1 -BITMAP -50 -A8 -A8 -50 -ENDCHAR -STARTCHAR orthogonal -ENCODING 8735 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -80 -80 -80 -80 -F8 -ENDCHAR -STARTCHAR uni2221 -ENCODING 8737 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -1 -BITMAP -50 -20 -50 -90 -F8 -10 -ENDCHAR -STARTCHAR uni2224 -ENCODING 8740 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -40 -40 -60 -C0 -40 -40 -ENDCHAR -STARTCHAR uni2225 -ENCODING 8741 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -A0 -A0 -A0 -A0 -A0 -A0 -ENDCHAR -STARTCHAR uni2226 -ENCODING 8742 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -50 -58 -70 -D0 -50 -50 -ENDCHAR -STARTCHAR logicaland -ENCODING 8743 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -20 -50 -50 -88 -ENDCHAR -STARTCHAR logicalor -ENCODING 8744 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -50 -50 -20 -ENDCHAR -STARTCHAR intersection -ENCODING 8745 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -70 -88 -88 -88 -ENDCHAR -STARTCHAR union -ENCODING 8746 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 0 -BITMAP -88 -88 -88 -70 -ENDCHAR -STARTCHAR integral -ENCODING 8747 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -10 -28 -20 -20 -20 -20 -20 -A0 -40 -ENDCHAR -STARTCHAR uni222E -ENCODING 8750 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -10 -28 -20 -70 -A8 -70 -20 -A0 -40 -ENDCHAR -STARTCHAR therefore -ENCODING 8756 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 1 -BITMAP -20 -00 -00 -88 -ENDCHAR -STARTCHAR uni2235 -ENCODING 8757 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 4 0 1 -BITMAP -88 -00 -00 -20 -ENDCHAR -STARTCHAR uni2236 -ENCODING 8758 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 4 2 1 -BITMAP -80 -00 -00 -80 -ENDCHAR -STARTCHAR uni2237 -ENCODING 8759 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 1 -BITMAP -90 -00 -00 -90 -ENDCHAR -STARTCHAR uni2238 -ENCODING 8760 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 2 -BITMAP -20 -00 -F8 -ENDCHAR -STARTCHAR uni2239 -ENCODING 8761 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -08 -00 -E0 -00 -08 -ENDCHAR -STARTCHAR uni223A -ENCODING 8762 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -88 -00 -F8 -00 -88 -ENDCHAR -STARTCHAR uni223B -ENCODING 8763 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -1 -BITMAP -20 -00 -50 -A0 -00 -40 -ENDCHAR -STARTCHAR similar -ENCODING 8764 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 2 1 1 -BITMAP -50 -A0 -ENDCHAR -STARTCHAR uni223D -ENCODING 8765 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 2 1 1 -BITMAP -A0 -50 -ENDCHAR -STARTCHAR uni2243 -ENCODING 8771 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 0 -BITMAP -50 -A0 -00 -F0 -ENDCHAR -STARTCHAR congruent -ENCODING 8773 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 -1 -BITMAP -50 -A0 -00 -F0 -00 -F0 -ENDCHAR -STARTCHAR approxequal -ENCODING 8776 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -40 -A8 -50 -A8 -10 -ENDCHAR -STARTCHAR uni2249 -ENCODING 8777 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -10 -50 -A8 -70 -A8 -50 -40 -ENDCHAR -STARTCHAR uni2259 -ENCODING 8793 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 1 -BITMAP -20 -50 -00 -F8 -00 -F8 -ENDCHAR -STARTCHAR uni225F -ENCODING 8799 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -60 -10 -20 -00 -20 -00 -F8 -00 -F8 -ENDCHAR -STARTCHAR notequal -ENCODING 8800 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -10 -F8 -20 -F8 -40 -ENDCHAR -STARTCHAR equivalence -ENCODING 8801 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -F8 -00 -F8 -00 -F8 -ENDCHAR -STARTCHAR uni2262 -ENCODING 8802 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -10 -F8 -20 -F8 -20 -F8 -40 -ENDCHAR -STARTCHAR uni2263 -ENCODING 8803 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -F8 -00 -F8 -00 -F8 -00 -F8 -ENDCHAR -STARTCHAR lessequal -ENCODING 8804 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -18 -60 -80 -60 -98 -60 -18 -ENDCHAR -STARTCHAR greaterequal -ENCODING 8805 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -C0 -30 -08 -30 -C8 -30 -C0 -ENDCHAR -STARTCHAR uni226A -ENCODING 8810 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -28 -50 -A0 -50 -28 -ENDCHAR -STARTCHAR uni226B -ENCODING 8811 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -A0 -50 -28 -50 -A0 -ENDCHAR -STARTCHAR propersubset -ENCODING 8834 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 1 -BITMAP -70 -80 -80 -70 -ENDCHAR -STARTCHAR propersuperset -ENCODING 8835 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 1 -BITMAP -E0 -10 -10 -E0 -ENDCHAR -STARTCHAR notsubset -ENCODING 8836 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -20 -70 -A0 -A0 -70 -20 -ENDCHAR -STARTCHAR uni2285 -ENCODING 8837 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -40 -E0 -50 -50 -E0 -40 -ENDCHAR -STARTCHAR reflexsubset -ENCODING 8838 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -70 -80 -80 -70 -00 -F0 -ENDCHAR -STARTCHAR reflexsuperset -ENCODING 8839 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -E0 -10 -10 -E0 -00 -F0 -ENDCHAR -STARTCHAR uni2288 -ENCODING 8840 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -20 -70 -A0 -A0 -70 -20 -F0 -20 -ENDCHAR -STARTCHAR uni2289 -ENCODING 8841 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -40 -E0 -50 -50 -E0 -40 -F0 -40 -ENDCHAR -STARTCHAR uni228A -ENCODING 8842 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 -1 -BITMAP -70 -80 -80 -70 -20 -F0 -40 -ENDCHAR -STARTCHAR uni228B -ENCODING 8843 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 7 1 -1 -BITMAP -E0 -10 -10 -E0 -20 -F0 -40 -ENDCHAR -STARTCHAR circleplus -ENCODING 8853 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -A8 -F8 -A8 -70 -ENDCHAR -STARTCHAR uni2296 -ENCODING 8854 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -88 -F8 -88 -70 -ENDCHAR -STARTCHAR circlemultiply -ENCODING 8855 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -D8 -A8 -D8 -70 -ENDCHAR -STARTCHAR uni2298 -ENCODING 8856 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -98 -A8 -C8 -70 -ENDCHAR -STARTCHAR uni2299 -ENCODING 8857 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -88 -A8 -88 -70 -ENDCHAR -STARTCHAR uni22A2 -ENCODING 8866 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -80 -80 -F8 -80 -80 -ENDCHAR -STARTCHAR uni22A3 -ENCODING 8867 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -08 -08 -F8 -08 -08 -ENDCHAR -STARTCHAR uni22A4 -ENCODING 8868 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR perpendicular -ENCODING 8869 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -20 -20 -20 -20 -F8 -ENDCHAR -STARTCHAR uni22A6 -ENCODING 8870 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 0 -BITMAP -80 -80 -E0 -80 -80 -ENDCHAR -STARTCHAR uni22A7 -ENCODING 8871 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 0 -BITMAP -80 -E0 -80 -E0 -80 -ENDCHAR -STARTCHAR uni22A8 -ENCODING 8872 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -80 -F8 -80 -F8 -80 -ENDCHAR -STARTCHAR uni22C0 -ENCODING 8896 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -50 -50 -50 -88 -88 -88 -ENDCHAR -STARTCHAR uni22C1 -ENCODING 8897 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -88 -88 -88 -50 -50 -50 -20 -20 -ENDCHAR -STARTCHAR uni22C2 -ENCODING 8898 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -70 -88 -88 -88 -88 -88 -88 -88 -ENDCHAR -STARTCHAR uni22C3 -ENCODING 8899 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -88 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR dotmath -ENCODING 8901 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 2 2 -BITMAP -80 -ENDCHAR -STARTCHAR uni22EE -ENCODING 8942 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 2 -1 -BITMAP -80 -00 -00 -80 -00 -00 -80 -ENDCHAR -STARTCHAR uni22EF -ENCODING 8943 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 1 0 2 -BITMAP -A8 -ENDCHAR -STARTCHAR uni22F0 -ENCODING 8944 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -08 -00 -00 -20 -00 -00 -80 -ENDCHAR -STARTCHAR uni22F1 -ENCODING 8945 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -80 -00 -00 -20 -00 -00 -08 -ENDCHAR -STARTCHAR uni2300 -ENCODING 8960 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -78 -98 -A8 -C8 -F0 -ENDCHAR -STARTCHAR house -ENCODING 8962 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -50 -88 -88 -88 -F8 -ENDCHAR -STARTCHAR uni2308 -ENCODING 8968 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -E0 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uni2309 -ENCODING 8969 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -E0 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR uni230A -ENCODING 8970 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -80 -80 -80 -80 -80 -E0 -ENDCHAR -STARTCHAR uni230B -ENCODING 8971 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -20 -20 -20 -20 -20 -E0 -ENDCHAR -STARTCHAR revlogicalnot -ENCODING 8976 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 3 1 0 -BITMAP -F0 -80 -80 -ENDCHAR -STARTCHAR integraltp -ENCODING 8992 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 8 3 -2 -BITMAP -40 -A0 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR integralbt -ENCODING 8993 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 8 1 -1 -BITMAP -20 -20 -20 -20 -20 -20 -A0 -40 -ENDCHAR -STARTCHAR uni23BA -ENCODING 9146 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 6 -BITMAP -FC -ENDCHAR -STARTCHAR uni23BB -ENCODING 9147 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 4 -BITMAP -FC -ENDCHAR -STARTCHAR uni23BC -ENCODING 9148 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 0 -BITMAP -FC -ENDCHAR -STARTCHAR uni23BD -ENCODING 9149 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 -2 -BITMAP -FC -ENDCHAR -STARTCHAR uni2409 -ENCODING 9225 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -A0 -E0 -A0 -00 -38 -10 -10 -ENDCHAR -STARTCHAR uni240A -ENCODING 9226 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -80 -80 -80 -C0 -38 -20 -30 -20 -ENDCHAR -STARTCHAR uni240B -ENCODING 9227 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -A0 -A0 -40 -40 -38 -10 -10 -10 -ENDCHAR -STARTCHAR uni240C -ENCODING 9228 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -E0 -80 -C0 -80 -38 -20 -30 -20 -ENDCHAR -STARTCHAR uni240D -ENCODING 9229 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -60 -80 -60 -00 -30 -28 -30 -28 -ENDCHAR -STARTCHAR uni2424 -ENCODING 9252 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -90 -D0 -B0 -90 -20 -20 -20 -38 -ENDCHAR -STARTCHAR SF100000 -ENCODING 9472 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 2 -BITMAP -FC -ENDCHAR -STARTCHAR uni2501 -ENCODING 9473 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 2 0 2 -BITMAP -FC -FC -ENDCHAR -STARTCHAR SF110000 -ENCODING 9474 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 9 3 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uni2503 -ENCODING 9475 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 9 2 -2 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR SF010000 -ENCODING 9484 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 3 -2 -BITMAP -E0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR SF030000 -ENCODING 9488 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 0 -2 -BITMAP -F0 -10 -10 -10 -10 -ENDCHAR -STARTCHAR SF020000 -ENCODING 9492 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 3 2 -BITMAP -80 -80 -80 -80 -E0 -ENDCHAR -STARTCHAR SF040000 -ENCODING 9496 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 0 2 -BITMAP -10 -10 -10 -10 -F0 -ENDCHAR -STARTCHAR SF080000 -ENCODING 9500 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 9 3 -2 -BITMAP -80 -80 -80 -80 -E0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR SF090000 -ENCODING 9508 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 0 -2 -BITMAP -10 -10 -10 -10 -F0 -10 -10 -10 -10 -ENDCHAR -STARTCHAR SF060000 -ENCODING 9516 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 5 0 -2 -BITMAP -FC -10 -10 -10 -10 -ENDCHAR -STARTCHAR SF070000 -ENCODING 9524 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 5 0 2 -BITMAP -10 -10 -10 -10 -FC -ENDCHAR -STARTCHAR SF050000 -ENCODING 9532 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -10 -10 -10 -10 -FC -10 -10 -10 -10 -ENDCHAR -STARTCHAR uni254C -ENCODING 9548 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 1 0 2 -BITMAP -D8 -ENDCHAR -STARTCHAR uni254D -ENCODING 9549 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 2 0 2 -BITMAP -D8 -D8 -ENDCHAR -STARTCHAR uni254E -ENCODING 9550 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 8 3 -1 -BITMAP -80 -80 -80 -80 -00 -80 -80 -80 -ENDCHAR -STARTCHAR uni254F -ENCODING 9551 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 8 2 -1 -BITMAP -C0 -C0 -C0 -C0 -00 -C0 -C0 -C0 -ENDCHAR -STARTCHAR SF430000 -ENCODING 9552 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 3 0 1 -BITMAP -FC -00 -FC -ENDCHAR -STARTCHAR SF240000 -ENCODING 9553 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 9 2 -2 -BITMAP -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -A0 -ENDCHAR -STARTCHAR SF510000 -ENCODING 9554 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 3 -2 -BITMAP -E0 -80 -E0 -80 -80 -80 -ENDCHAR -STARTCHAR SF520000 -ENCODING 9555 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 2 -2 -BITMAP -F0 -A0 -A0 -A0 -A0 -ENDCHAR -STARTCHAR SF390000 -ENCODING 9556 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 2 -2 -BITMAP -F0 -80 -B0 -A0 -A0 -A0 -ENDCHAR -STARTCHAR SF220000 -ENCODING 9557 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 0 -2 -BITMAP -F0 -10 -F0 -10 -10 -10 -ENDCHAR -STARTCHAR SF210000 -ENCODING 9558 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 -2 -BITMAP -F8 -28 -28 -28 -28 -ENDCHAR -STARTCHAR SF250000 -ENCODING 9559 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 -2 -BITMAP -F8 -08 -E8 -28 -28 -28 -ENDCHAR -STARTCHAR SF500000 -ENCODING 9560 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 3 1 -BITMAP -80 -80 -80 -E0 -80 -E0 -ENDCHAR -STARTCHAR SF490000 -ENCODING 9561 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 2 2 -BITMAP -A0 -A0 -A0 -A0 -F0 -ENDCHAR -STARTCHAR SF380000 -ENCODING 9562 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 2 1 -BITMAP -A0 -A0 -A0 -B0 -80 -F0 -ENDCHAR -STARTCHAR SF280000 -ENCODING 9563 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 0 1 -BITMAP -10 -10 -10 -F0 -10 -F0 -ENDCHAR -STARTCHAR SF270000 -ENCODING 9564 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 2 -BITMAP -28 -28 -28 -28 -F8 -ENDCHAR -STARTCHAR SF260000 -ENCODING 9565 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 1 -BITMAP -28 -28 -28 -E8 -08 -F8 -ENDCHAR -STARTCHAR SF360000 -ENCODING 9566 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 9 3 -2 -BITMAP -80 -80 -80 -E0 -80 -E0 -80 -80 -80 -ENDCHAR -STARTCHAR SF370000 -ENCODING 9567 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 2 -2 -BITMAP -A0 -A0 -A0 -A0 -B0 -A0 -A0 -A0 -A0 -ENDCHAR -STARTCHAR SF420000 -ENCODING 9568 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 2 -2 -BITMAP -A0 -A0 -A0 -B0 -80 -B0 -A0 -A0 -A0 -ENDCHAR -STARTCHAR SF190000 -ENCODING 9569 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 0 -2 -BITMAP -10 -10 -10 -F0 -10 -F0 -10 -10 -10 -ENDCHAR -STARTCHAR SF200000 -ENCODING 9570 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -28 -28 -28 -28 -E8 -28 -28 -28 -28 -ENDCHAR -STARTCHAR SF230000 -ENCODING 9571 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -28 -28 -28 -E8 -08 -E8 -28 -28 -28 -ENDCHAR -STARTCHAR SF470000 -ENCODING 9572 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 6 0 -2 -BITMAP -FC -00 -FC -10 -10 -10 -ENDCHAR -STARTCHAR SF480000 -ENCODING 9573 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 5 0 -2 -BITMAP -FC -28 -28 -28 -28 -ENDCHAR -STARTCHAR SF410000 -ENCODING 9574 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 6 0 -2 -BITMAP -FC -00 -EC -28 -28 -28 -ENDCHAR -STARTCHAR SF450000 -ENCODING 9575 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 6 0 1 -BITMAP -10 -10 -10 -FC -00 -FC -ENDCHAR -STARTCHAR SF460000 -ENCODING 9576 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 5 0 2 -BITMAP -28 -28 -28 -28 -FC -ENDCHAR -STARTCHAR SF400000 -ENCODING 9577 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 6 0 1 -BITMAP -28 -28 -28 -EC -00 -FC -ENDCHAR -STARTCHAR SF540000 -ENCODING 9578 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -10 -10 -10 -FC -10 -FC -10 -10 -10 -ENDCHAR -STARTCHAR SF530000 -ENCODING 9579 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -28 -28 -28 -28 -FC -28 -28 -28 -28 -ENDCHAR -STARTCHAR SF440000 -ENCODING 9580 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -28 -28 -28 -EC -00 -EC -28 -28 -28 -ENDCHAR -STARTCHAR uni256D -ENCODING 9581 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 3 -2 -BITMAP -20 -40 -80 -80 -80 -ENDCHAR -STARTCHAR uni256E -ENCODING 9582 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 0 -2 -BITMAP -C0 -20 -10 -10 -10 -ENDCHAR -STARTCHAR uni256F -ENCODING 9583 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 5 0 2 -BITMAP -10 -10 -10 -20 -C0 -ENDCHAR -STARTCHAR uni2570 -ENCODING 9584 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 3 2 -BITMAP -80 -80 -80 -40 -20 -ENDCHAR -STARTCHAR uni2571 -ENCODING 9585 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -04 -04 -08 -10 -10 -20 -40 -40 -80 -ENDCHAR -STARTCHAR uni2572 -ENCODING 9586 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -80 -80 -40 -20 -20 -10 -08 -08 -04 -ENDCHAR -STARTCHAR uni2573 -ENCODING 9587 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -84 -84 -48 -30 -30 -30 -48 -48 -84 -ENDCHAR -STARTCHAR upblock -ENCODING 9600 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 4 0 3 -BITMAP -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2581 -ENCODING 9601 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 -2 -BITMAP -FC -ENDCHAR -STARTCHAR uni2582 -ENCODING 9602 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 2 0 -2 -BITMAP -FC -FC -ENDCHAR -STARTCHAR uni2583 -ENCODING 9603 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 4 0 -2 -BITMAP -FC -FC -FC -FC -ENDCHAR -STARTCHAR dnblock -ENCODING 9604 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 5 0 -2 -BITMAP -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2585 -ENCODING 9605 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 6 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2586 -ENCODING 9606 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 7 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2587 -ENCODING 9607 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 8 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR block -ENCODING 9608 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -FC -FC -FC -FC -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni2589 -ENCODING 9609 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -F8 -ENDCHAR -STARTCHAR uni258A -ENCODING 9610 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 0 -2 -BITMAP -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -ENDCHAR -STARTCHAR uni258B -ENCODING 9611 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 9 0 -2 -BITMAP -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -F0 -ENDCHAR -STARTCHAR lfblock -ENCODING 9612 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 9 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni258D -ENCODING 9613 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 9 0 -2 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR uni258E -ENCODING 9614 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 9 0 -2 -BITMAP -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -C0 -ENDCHAR -STARTCHAR uni258F -ENCODING 9615 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 9 0 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR rtblock -ENCODING 9616 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 9 3 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR ltshade -ENCODING 9617 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -A8 -00 -54 -00 -A8 -00 -54 -00 -A8 -ENDCHAR -STARTCHAR shade -ENCODING 9618 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -54 -A8 -54 -A8 -54 -A8 -54 -A8 -54 -ENDCHAR -STARTCHAR dkshade -ENCODING 9619 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -FC -A8 -FC -54 -FC -A8 -FC -54 -FC -ENDCHAR -STARTCHAR uni2594 -ENCODING 9620 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 1 0 6 -BITMAP -FC -ENDCHAR -STARTCHAR uni2595 -ENCODING 9621 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 9 5 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR uni2596 -ENCODING 9622 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 0 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni2597 -ENCODING 9623 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 3 -2 -BITMAP -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni2598 -ENCODING 9624 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 0 3 -BITMAP -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni2599 -ENCODING 9625 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -E0 -E0 -E0 -E0 -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR uni259A -ENCODING 9626 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -E0 -E0 -E0 -E0 -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni259B -ENCODING 9627 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -FC -FC -FC -FC -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni259C -ENCODING 9628 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -FC -FC -FC -FC -1C -1C -1C -1C -1C -ENDCHAR -STARTCHAR uni259D -ENCODING 9629 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 3 3 -BITMAP -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni259E -ENCODING 9630 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -1C -1C -1C -1C -E0 -E0 -E0 -E0 -E0 -ENDCHAR -STARTCHAR uni259F -ENCODING 9631 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -1C -1C -1C -1C -FC -FC -FC -FC -FC -ENDCHAR -STARTCHAR filledbox -ENCODING 9632 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -F8 -F8 -F8 -F8 -F8 -ENDCHAR -STARTCHAR H22073 -ENCODING 9633 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -F8 -88 -88 -88 -F8 -ENDCHAR -STARTCHAR uni25A2 -ENCODING 9634 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR uni25A3 -ENCODING 9635 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -F8 -88 -A8 -88 -F8 -ENDCHAR -STARTCHAR H18543 -ENCODING 9642 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -E0 -E0 -E0 -ENDCHAR -STARTCHAR H18551 -ENCODING 9643 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -E0 -A0 -E0 -ENDCHAR -STARTCHAR filledrect -ENCODING 9644 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 1 -BITMAP -F8 -F8 -F8 -ENDCHAR -STARTCHAR uni25AD -ENCODING 9645 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 1 -BITMAP -F8 -88 -F8 -ENDCHAR -STARTCHAR uni25AE -ENCODING 9646 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -F0 -F0 -F0 -F0 -F0 -ENDCHAR -STARTCHAR uni25AF -ENCODING 9647 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -90 -90 -90 -90 -F0 -ENDCHAR -STARTCHAR uni25B0 -ENCODING 9648 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 1 -BITMAP -78 -F8 -F0 -ENDCHAR -STARTCHAR uni25B1 -ENCODING 9649 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 1 -BITMAP -78 -88 -F0 -ENDCHAR -STARTCHAR triagup -ENCODING 9650 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -20 -70 -70 -F8 -F8 -ENDCHAR -STARTCHAR uni25B3 -ENCODING 9651 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -20 -50 -50 -88 -F8 -ENDCHAR -STARTCHAR uni25B4 -ENCODING 9652 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 1 1 -BITMAP -40 -40 -E0 -E0 -ENDCHAR -STARTCHAR uni25B5 -ENCODING 9653 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 1 1 -BITMAP -40 -40 -A0 -E0 -ENDCHAR -STARTCHAR uni25B6 -ENCODING 9654 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -C0 -F0 -F8 -F0 -C0 -ENDCHAR -STARTCHAR uni25B7 -ENCODING 9655 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -C0 -B0 -88 -B0 -C0 -ENDCHAR -STARTCHAR uni25B8 -ENCODING 9656 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 3 1 1 -BITMAP -C0 -F0 -C0 -ENDCHAR -STARTCHAR uni25B9 -ENCODING 9657 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 3 1 1 -BITMAP -C0 -B0 -C0 -ENDCHAR -STARTCHAR triagrt -ENCODING 9658 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 1 -BITMAP -E0 -F8 -E0 -ENDCHAR -STARTCHAR uni25BB -ENCODING 9659 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 1 -BITMAP -E0 -98 -E0 -ENDCHAR -STARTCHAR triagdn -ENCODING 9660 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -F8 -70 -70 -20 -20 -ENDCHAR -STARTCHAR uni25BD -ENCODING 9661 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -F8 -88 -50 -50 -20 -20 -ENDCHAR -STARTCHAR uni25BE -ENCODING 9662 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 1 1 -BITMAP -E0 -E0 -40 -40 -ENDCHAR -STARTCHAR uni25BF -ENCODING 9663 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 4 1 1 -BITMAP -E0 -A0 -40 -40 -ENDCHAR -STARTCHAR uni25C0 -ENCODING 9664 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -18 -78 -F8 -78 -18 -ENDCHAR -STARTCHAR uni25C1 -ENCODING 9665 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -18 -68 -88 -68 -18 -ENDCHAR -STARTCHAR uni25C2 -ENCODING 9666 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 3 1 1 -BITMAP -30 -F0 -30 -ENDCHAR -STARTCHAR uni25C3 -ENCODING 9667 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 3 1 1 -BITMAP -30 -D0 -30 -ENDCHAR -STARTCHAR triaglf -ENCODING 9668 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 1 -BITMAP -38 -F8 -38 -ENDCHAR -STARTCHAR uni25C5 -ENCODING 9669 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 3 0 1 -BITMAP -38 -C8 -38 -ENDCHAR -STARTCHAR uni25C6 -ENCODING 9670 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 5 0 0 -BITMAP -30 -78 -FC -78 -30 -ENDCHAR -STARTCHAR lozenge -ENCODING 9674 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -20 -50 -50 -88 -50 -50 -20 -ENDCHAR -STARTCHAR circle -ENCODING 9675 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -88 -88 -88 -70 -ENDCHAR -STARTCHAR H18533 -ENCODING 9679 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -F8 -F8 -F8 -70 -ENDCHAR -STARTCHAR invbullet -ENCODING 9688 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -FC -FC -CC -84 -84 -CC -FC -FC -FC -ENDCHAR -STARTCHAR invcircle -ENCODING 9689 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -FC -FC -CC -B4 -B4 -CC -FC -FC -FC -ENDCHAR -STARTCHAR openbullet -ENCODING 9702 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 4 1 1 -BITMAP -60 -90 -90 -60 -ENDCHAR -STARTCHAR uni2600 -ENCODING 9728 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -20 -A8 -70 -F8 -70 -A8 -20 -ENDCHAR -STARTCHAR uni2639 -ENCODING 9785 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 8 0 -1 -BITMAP -78 -84 -CC -84 -B4 -CC -84 -78 -ENDCHAR -STARTCHAR smileface -ENCODING 9786 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 8 0 -1 -BITMAP -78 -84 -CC -84 -CC -B4 -84 -78 -ENDCHAR -STARTCHAR invsmileface -ENCODING 9787 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 8 0 -1 -BITMAP -78 -FC -B4 -FC -B4 -CC -FC -78 -ENDCHAR -STARTCHAR sun -ENCODING 9788 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -20 -A8 -70 -D8 -70 -A8 -20 -ENDCHAR -STARTCHAR uni263F -ENCODING 9791 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 8 0 -1 -BITMAP -88 -70 -88 -88 -70 -20 -F8 -20 -ENDCHAR -STARTCHAR female -ENCODING 9792 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -70 -88 -88 -70 -20 -F8 -20 -ENDCHAR -STARTCHAR uni2641 -ENCODING 9793 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 -1 -BITMAP -20 -F8 -20 -70 -88 -88 -70 -ENDCHAR -STARTCHAR male -ENCODING 9794 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 6 7 0 -1 -BITMAP -1C -0C -14 -70 -88 -88 -70 -ENDCHAR -STARTCHAR spade -ENCODING 9824 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -70 -F8 -F8 -20 -70 -ENDCHAR -STARTCHAR uni2661 -ENCODING 9825 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -50 -A8 -88 -88 -50 -20 -ENDCHAR -STARTCHAR uni2662 -ENCODING 9826 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -50 -88 -50 -20 -ENDCHAR -STARTCHAR club -ENCODING 9827 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -70 -A8 -F8 -A8 -20 -70 -ENDCHAR -STARTCHAR uni2664 -ENCODING 9828 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -20 -50 -88 -F8 -20 -70 -ENDCHAR -STARTCHAR heart -ENCODING 9829 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -50 -F8 -F8 -F8 -70 -20 -ENDCHAR -STARTCHAR diamond -ENCODING 9830 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -20 -70 -F8 -70 -20 -ENDCHAR -STARTCHAR uni2669 -ENCODING 9833 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 6 1 0 -BITMAP -20 -20 -20 -20 -E0 -C0 -ENDCHAR -STARTCHAR musicalnote -ENCODING 9834 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -30 -28 -20 -20 -E0 -C0 -ENDCHAR -STARTCHAR musicalnotedbl -ENCODING 9835 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 6 0 0 -BITMAP -60 -58 -48 -C8 -D8 -18 -ENDCHAR -STARTCHAR uni27E8 -ENCODING 10216 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 7 2 -1 -BITMAP -40 -40 -80 -80 -80 -40 -40 -ENDCHAR -STARTCHAR uni27E9 -ENCODING 10217 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 2 7 2 -1 -BITMAP -80 -80 -40 -40 -40 -80 -80 -ENDCHAR -STARTCHAR uni2800 -ENCODING 10240 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 5 -2 -BITMAP -00 -ENDCHAR -STARTCHAR uni2801 -ENCODING 10241 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 1 5 -BITMAP -80 -ENDCHAR -STARTCHAR uni2802 -ENCODING 10242 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 1 3 -BITMAP -80 -ENDCHAR -STARTCHAR uni2803 -ENCODING 10243 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 3 1 3 -BITMAP -80 -00 -80 -ENDCHAR -STARTCHAR uni2804 -ENCODING 10244 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 1 1 -BITMAP -80 -ENDCHAR -STARTCHAR uni2805 -ENCODING 10245 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 5 1 1 -BITMAP -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2806 -ENCODING 10246 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 3 1 1 -BITMAP -80 -00 -80 -ENDCHAR -STARTCHAR uni2807 -ENCODING 10247 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 5 1 1 -BITMAP -80 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2808 -ENCODING 10248 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 3 5 -BITMAP -80 -ENDCHAR -STARTCHAR uni2809 -ENCODING 10249 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 5 -BITMAP -A0 -ENDCHAR -STARTCHAR uni280A -ENCODING 10250 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 3 -BITMAP -20 -00 -80 -ENDCHAR -STARTCHAR uni280B -ENCODING 10251 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 3 -BITMAP -A0 -00 -80 -ENDCHAR -STARTCHAR uni280C -ENCODING 10252 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni280D -ENCODING 10253 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni280E -ENCODING 10254 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni280F -ENCODING 10255 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2810 -ENCODING 10256 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 3 3 -BITMAP -80 -ENDCHAR -STARTCHAR uni2811 -ENCODING 10257 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 3 -BITMAP -80 -00 -20 -ENDCHAR -STARTCHAR uni2812 -ENCODING 10258 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 3 -BITMAP -A0 -ENDCHAR -STARTCHAR uni2813 -ENCODING 10259 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 3 -BITMAP -80 -00 -A0 -ENDCHAR -STARTCHAR uni2814 -ENCODING 10260 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -20 -00 -80 -ENDCHAR -STARTCHAR uni2815 -ENCODING 10261 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2816 -ENCODING 10262 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -A0 -00 -80 -ENDCHAR -STARTCHAR uni2817 -ENCODING 10263 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2818 -ENCODING 10264 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 3 3 3 -BITMAP -80 -00 -80 -ENDCHAR -STARTCHAR uni2819 -ENCODING 10265 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 3 -BITMAP -A0 -00 -20 -ENDCHAR -STARTCHAR uni281A -ENCODING 10266 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 3 -BITMAP -20 -00 -A0 -ENDCHAR -STARTCHAR uni281B -ENCODING 10267 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 3 -BITMAP -A0 -00 -A0 -ENDCHAR -STARTCHAR uni281C -ENCODING 10268 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni281D -ENCODING 10269 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni281E -ENCODING 10270 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni281F -ENCODING 10271 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2820 -ENCODING 10272 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 3 1 -BITMAP -80 -ENDCHAR -STARTCHAR uni2821 -ENCODING 10273 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni2822 -ENCODING 10274 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -80 -00 -20 -ENDCHAR -STARTCHAR uni2823 -ENCODING 10275 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni2824 -ENCODING 10276 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 1 -BITMAP -A0 -ENDCHAR -STARTCHAR uni2825 -ENCODING 10277 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni2826 -ENCODING 10278 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -80 -00 -A0 -ENDCHAR -STARTCHAR uni2827 -ENCODING 10279 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni2828 -ENCODING 10280 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 5 3 1 -BITMAP -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2829 -ENCODING 10281 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni282A -ENCODING 10282 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni282B -ENCODING 10283 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni282C -ENCODING 10284 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni282D -ENCODING 10285 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni282E -ENCODING 10286 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni282F -ENCODING 10287 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni2830 -ENCODING 10288 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 3 3 1 -BITMAP -80 -00 -80 -ENDCHAR -STARTCHAR uni2831 -ENCODING 10289 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni2832 -ENCODING 10290 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -A0 -00 -20 -ENDCHAR -STARTCHAR uni2833 -ENCODING 10291 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni2834 -ENCODING 10292 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -20 -00 -A0 -ENDCHAR -STARTCHAR uni2835 -ENCODING 10293 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni2836 -ENCODING 10294 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 1 -BITMAP -A0 -00 -A0 -ENDCHAR -STARTCHAR uni2837 -ENCODING 10295 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -80 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni2838 -ENCODING 10296 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 5 3 1 -BITMAP -80 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2839 -ENCODING 10297 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni283A -ENCODING 10298 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni283B -ENCODING 10299 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni283C -ENCODING 10300 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni283D -ENCODING 10301 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni283E -ENCODING 10302 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -20 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni283F -ENCODING 10303 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 1 -BITMAP -A0 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni2840 -ENCODING 10304 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 1 -1 -BITMAP -80 -ENDCHAR -STARTCHAR uni2841 -ENCODING 10305 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 1 -1 -BITMAP -80 -00 -00 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2842 -ENCODING 10306 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 5 1 -1 -BITMAP -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2843 -ENCODING 10307 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 1 -1 -BITMAP -80 -00 -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2844 -ENCODING 10308 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 3 1 -1 -BITMAP -80 -00 -80 -ENDCHAR -STARTCHAR uni2845 -ENCODING 10309 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 1 -1 -BITMAP -80 -00 -00 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2846 -ENCODING 10310 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 5 1 -1 -BITMAP -80 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2847 -ENCODING 10311 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 1 -1 -BITMAP -80 -00 -80 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2848 -ENCODING 10312 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2849 -ENCODING 10313 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni284A -ENCODING 10314 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni284B -ENCODING 10315 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni284C -ENCODING 10316 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni284D -ENCODING 10317 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni284E -ENCODING 10318 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni284F -ENCODING 10319 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2850 -ENCODING 10320 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2851 -ENCODING 10321 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2852 -ENCODING 10322 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2853 -ENCODING 10323 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2854 -ENCODING 10324 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2855 -ENCODING 10325 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2856 -ENCODING 10326 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2857 -ENCODING 10327 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2858 -ENCODING 10328 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2859 -ENCODING 10329 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni285A -ENCODING 10330 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni285B -ENCODING 10331 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni285C -ENCODING 10332 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni285D -ENCODING 10333 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni285E -ENCODING 10334 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni285F -ENCODING 10335 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni2860 -ENCODING 10336 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 -1 -BITMAP -20 -00 -80 -ENDCHAR -STARTCHAR uni2861 -ENCODING 10337 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2862 -ENCODING 10338 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2863 -ENCODING 10339 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2864 -ENCODING 10340 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 -1 -BITMAP -A0 -00 -80 -ENDCHAR -STARTCHAR uni2865 -ENCODING 10341 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2866 -ENCODING 10342 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2867 -ENCODING 10343 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2868 -ENCODING 10344 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2869 -ENCODING 10345 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni286A -ENCODING 10346 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni286B -ENCODING 10347 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni286C -ENCODING 10348 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni286D -ENCODING 10349 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni286E -ENCODING 10350 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni286F -ENCODING 10351 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2870 -ENCODING 10352 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2871 -ENCODING 10353 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2872 -ENCODING 10354 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2873 -ENCODING 10355 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2874 -ENCODING 10356 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2875 -ENCODING 10357 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2876 -ENCODING 10358 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2877 -ENCODING 10359 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2878 -ENCODING 10360 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni2879 -ENCODING 10361 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni287A -ENCODING 10362 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni287B -ENCODING 10363 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -20 -00 -80 -ENDCHAR -STARTCHAR uni287C -ENCODING 10364 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni287D -ENCODING 10365 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni287E -ENCODING 10366 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni287F -ENCODING 10367 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -A0 -00 -80 -ENDCHAR -STARTCHAR uni2880 -ENCODING 10368 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 1 3 -1 -BITMAP -80 -ENDCHAR -STARTCHAR uni2881 -ENCODING 10369 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni2882 -ENCODING 10370 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni2883 -ENCODING 10371 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni2884 -ENCODING 10372 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 -1 -BITMAP -80 -00 -20 -ENDCHAR -STARTCHAR uni2885 -ENCODING 10373 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni2886 -ENCODING 10374 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni2887 -ENCODING 10375 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni2888 -ENCODING 10376 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 3 -1 -BITMAP -80 -00 -00 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2889 -ENCODING 10377 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni288A -ENCODING 10378 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni288B -ENCODING 10379 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni288C -ENCODING 10380 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni288D -ENCODING 10381 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni288E -ENCODING 10382 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni288F -ENCODING 10383 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni2890 -ENCODING 10384 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 5 3 -1 -BITMAP -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2891 -ENCODING 10385 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni2892 -ENCODING 10386 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni2893 -ENCODING 10387 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni2894 -ENCODING 10388 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni2895 -ENCODING 10389 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni2896 -ENCODING 10390 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni2897 -ENCODING 10391 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni2898 -ENCODING 10392 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 3 -1 -BITMAP -80 -00 -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR uni2899 -ENCODING 10393 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni289A -ENCODING 10394 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni289B -ENCODING 10395 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -00 -00 -20 -ENDCHAR -STARTCHAR uni289C -ENCODING 10396 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni289D -ENCODING 10397 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni289E -ENCODING 10398 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni289F -ENCODING 10399 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -80 -00 -20 -ENDCHAR -STARTCHAR uni28A0 -ENCODING 10400 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 3 3 -1 -BITMAP -80 -00 -80 -ENDCHAR -STARTCHAR uni28A1 -ENCODING 10401 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28A2 -ENCODING 10402 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28A3 -ENCODING 10403 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28A4 -ENCODING 10404 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 -1 -BITMAP -A0 -00 -20 -ENDCHAR -STARTCHAR uni28A5 -ENCODING 10405 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28A6 -ENCODING 10406 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28A7 -ENCODING 10407 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28A8 -ENCODING 10408 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 3 -1 -BITMAP -80 -00 -00 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni28A9 -ENCODING 10409 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28AA -ENCODING 10410 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28AB -ENCODING 10411 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28AC -ENCODING 10412 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28AD -ENCODING 10413 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28AE -ENCODING 10414 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28AF -ENCODING 10415 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28B0 -ENCODING 10416 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 5 3 -1 -BITMAP -80 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni28B1 -ENCODING 10417 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28B2 -ENCODING 10418 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28B3 -ENCODING 10419 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28B4 -ENCODING 10420 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28B5 -ENCODING 10421 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28B6 -ENCODING 10422 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28B7 -ENCODING 10423 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28B8 -ENCODING 10424 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 1 7 3 -1 -BITMAP -80 -00 -80 -00 -80 -00 -80 -ENDCHAR -STARTCHAR uni28B9 -ENCODING 10425 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28BA -ENCODING 10426 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28BB -ENCODING 10427 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -20 -00 -20 -ENDCHAR -STARTCHAR uni28BC -ENCODING 10428 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28BD -ENCODING 10429 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28BE -ENCODING 10430 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28BF -ENCODING 10431 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -A0 -00 -20 -ENDCHAR -STARTCHAR uni28C0 -ENCODING 10432 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 1 1 -1 -BITMAP -A0 -ENDCHAR -STARTCHAR uni28C1 -ENCODING 10433 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28C2 -ENCODING 10434 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28C3 -ENCODING 10435 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28C4 -ENCODING 10436 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 -1 -BITMAP -80 -00 -A0 -ENDCHAR -STARTCHAR uni28C5 -ENCODING 10437 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28C6 -ENCODING 10438 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28C7 -ENCODING 10439 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28C8 -ENCODING 10440 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28C9 -ENCODING 10441 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28CA -ENCODING 10442 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28CB -ENCODING 10443 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28CC -ENCODING 10444 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28CD -ENCODING 10445 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28CE -ENCODING 10446 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28CF -ENCODING 10447 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28D0 -ENCODING 10448 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28D1 -ENCODING 10449 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28D2 -ENCODING 10450 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28D3 -ENCODING 10451 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28D4 -ENCODING 10452 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28D5 -ENCODING 10453 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28D6 -ENCODING 10454 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28D7 -ENCODING 10455 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28D8 -ENCODING 10456 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28D9 -ENCODING 10457 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28DA -ENCODING 10458 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28DB -ENCODING 10459 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -00 -00 -A0 -ENDCHAR -STARTCHAR uni28DC -ENCODING 10460 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28DD -ENCODING 10461 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28DE -ENCODING 10462 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28DF -ENCODING 10463 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -80 -00 -A0 -ENDCHAR -STARTCHAR uni28E0 -ENCODING 10464 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 -1 -BITMAP -20 -00 -A0 -ENDCHAR -STARTCHAR uni28E1 -ENCODING 10465 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28E2 -ENCODING 10466 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28E3 -ENCODING 10467 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28E4 -ENCODING 10468 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 3 1 -1 -BITMAP -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28E5 -ENCODING 10469 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -00 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28E6 -ENCODING 10470 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -80 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28E7 -ENCODING 10471 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -80 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28E8 -ENCODING 10472 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28E9 -ENCODING 10473 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28EA -ENCODING 10474 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28EB -ENCODING 10475 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28EC -ENCODING 10476 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -00 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28ED -ENCODING 10477 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -00 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28EE -ENCODING 10478 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -80 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28EF -ENCODING 10479 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -80 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28F0 -ENCODING 10480 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28F1 -ENCODING 10481 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28F2 -ENCODING 10482 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28F3 -ENCODING 10483 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28F4 -ENCODING 10484 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -20 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28F5 -ENCODING 10485 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -20 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28F6 -ENCODING 10486 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 5 1 -1 -BITMAP -A0 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28F7 -ENCODING 10487 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -80 -00 -A0 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28F8 -ENCODING 10488 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28F9 -ENCODING 10489 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28FA -ENCODING 10490 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28FB -ENCODING 10491 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -20 -00 -A0 -ENDCHAR -STARTCHAR uni28FC -ENCODING 10492 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -20 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28FD -ENCODING 10493 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -20 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28FE -ENCODING 10494 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -20 -00 -A0 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR uni28FF -ENCODING 10495 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 3 7 1 -1 -BITMAP -A0 -00 -A0 -00 -A0 -00 -A0 -ENDCHAR -STARTCHAR fi -ENCODING 64257 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -20 -50 -40 -F0 -50 -50 -ENDCHAR -STARTCHAR fl -ENCODING 64258 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -30 -50 -50 -F0 -50 -50 -ENDCHAR -STARTCHAR uniFFFD -ENCODING 65533 -SWIDTH 640 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -70 -D8 -A8 -E8 -D8 -D8 -F8 -D8 -70 -ENDCHAR -ENDFONT diff --git a/buildroot/share/fonts/uxggenpages.md b/buildroot/share/fonts/uxggenpages.md index 5e40c392f7..314b5d5c06 100644 --- a/buildroot/share/fonts/uxggenpages.md +++ b/buildroot/share/fonts/uxggenpages.md @@ -99,12 +99,12 @@ At this time, the font file `marlin-6x12-3.bdf` is used to generate the font dat - [WQY](http://wenq.org/) - [WQY 9pt bitmap font](http://wenq.org/daily/wqy-bitmapfont-bdf-gb18030-nightly_build.tar.gz) -- [unifont (16x8 or 16x16)](https://unifoundry.com/unifont.html) +- [unifont (16x8 or 16x16)](http://unifoundry.com/unifont.html) Documents related to the old version of the language engine: -- [Marlin Fonts Documentation](https://www.marlinfw.org/docs/development/fonts.html) -- [Marlin LCD Language](https://marlinfw.org/docs/development/lcd_language.html) +- [Marlin Fonts Documentation](http://www.marlinfw.org/docs/development/fonts.html) +- [Marlin LCD Language](http://marlinfw.org/docs/development/lcd_language.html) - [U8GLIB](https://github.com/olikraus/u8glib.git) - [UTF-8 for U8GLIB](https://github.com/yhfudev/u8glib-fontutf8.git) - [Standalone test project for the Marlin UTF-8 language engine](https://github.com/yhfudev/marlin-fontutf8.git) diff --git a/buildroot/share/fonts/uxggenpages.sh b/buildroot/share/fonts/uxggenpages.sh index a99fd99024..6cf6c49769 100755 --- a/buildroot/share/fonts/uxggenpages.sh +++ b/buildroot/share/fonts/uxggenpages.sh @@ -139,13 +139,11 @@ BEGIN { } EOF -AWK=$(which gawk || which awk) - grep -Hrn _UxGT . | grep '"' \ | sed 's/_UxGT("/\n&/g;s/[^\n]*\n_UxGT("\([^"]*\)[^\n]*/\1 /g;s/.$//' \ | ${EXEC_GENPAGES} \ | sort -k 1n -k 2n | uniq \ - | "$AWK" -v EXEC_PREFIX=${DN_EXEC} -f "proc.awk" \ + | gawk -v EXEC_PREFIX=${DN_EXEC} -f "proc.awk" \ | while read PAGE BEGIN END UTF8BEGIN UTF8END; do \ if [ ! -f ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h ]; then \ ${EXEC_BDF2U8G} -u ${PAGE} -b ${BEGIN} -e ${END} ${FN_FONT} fontpage_${PAGE}_${BEGIN}_${END} ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h > /dev/null 2>&1 ; @@ -171,6 +169,6 @@ cat <fontutf8-data.h */ #include $TMPA -#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +#define FONTDATA_ITEM(page, begin, end, data) {page, begin, end, NUM_ARRAY(data), data} static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {$TMPB}; EOF diff --git a/buildroot/share/git/README.md b/buildroot/share/git/README.md index 4dcd7c15a7..de93e4c202 100755 --- a/buildroot/share/git/README.md +++ b/buildroot/share/git/README.md @@ -18,7 +18,7 @@ The following scripts can be used on any system with a GNU environment to speed File|Description ----|----------- -mfadd [user]|Add and Fetch Remote - Add and fetch another user's Marlin fork. Optionally, check out one of their branches. +mfadd [user]|Add and Fetch Remote - Add another Github user's fork of Marlin as a remote, then fetch it. Optionally, check out one of their branches. mfinit|Init Working Copy - Create a remote named '`upstream`' (for use by the other scripts) pointing to the '`MarlinFirmware`' fork. This only needs to be used once. Newer versions of Github Desktop may create `upstream` on your behalf. #### Branches @@ -41,15 +41,14 @@ mfqp|Quick Patch - Commit all current changes as "patch", then do `mfrb`, follow File|Description ----|----------- -mfdoc|Build the documentation with Jekyll and preview it locally. -mfpub|Build and publish the documentation to marlinfw.org. +mfdoc|Build the documentation and preview it locally. +mfpub|Build the documentation and publish it to marlinfw.org via Github. #### Utilities File|Description ----|----------- ghtp -[h/s]|Set the protocol to use for all remotes. -h for HTTPS, -s for SSL. -ghpc [-f]|Push current branch to 'origin' or to the remote indicated by the error. mfinfo|This utility script is used by the other scripts to get:
- The upstream project ('`MarlinFirmware`')
- the '`origin`' project (i.e., your Github username),
- the repository name ('`Marlin`'),
- the PR target branch ('`bugfix-1.1.x`'), and
- the current branch (or the first command-line argument).

By itself, `mfinfo` simply prints these values to the console. mfclean     |Prune your merged and remotely-deleted branches. @@ -57,4 +56,4 @@ mfclean     |Prune your merged and remotely-deleted bra ### Examples -For a demonstration of these scripts see the video [Marlin Live - May 9 2019](https://youtu.be/rwT4G0uVTIY). There is also an old write-up at [#3193](https://github.com/MarlinFirmware/Marlin/issues/3193). +Coming Soon! diff --git a/buildroot/share/git/firstpush b/buildroot/share/git/firstpush index 9a68fc5afd..60767f04bc 100755 --- a/buildroot/share/git/firstpush +++ b/buildroot/share/git/firstpush @@ -6,7 +6,7 @@ # commit log to watch Travis CI progress. # -[[ $# == 0 ]] || { echo "usage: `basename $0`" 1>&2 ; exit 1; } +[[ $# == 0 ]] || { echo "Usage: `basename $0`" 1>&2 ; exit 1; } MFINFO=$(mfinfo) || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" @@ -14,15 +14,15 @@ FORK=${INFO[1]} REPO=${INFO[2]} BRANCH=${INFO[5]} -git push --set-upstream origin HEAD:$BRANCH +git push --set-upstream origin $BRANCH -OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }') +TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') URL="https://github.com/$FORK/$REPO/commits/$BRANCH" -if [ -z "$OPEN" ]; then +if [ -z "$TOOL" ]; then echo "Can't find a tool to open the URL:" echo $URL else echo "Viewing commits on $BRANCH..." - "$OPEN" "$URL" + "$TOOL" "$URL" fi diff --git a/buildroot/share/git/ghpc b/buildroot/share/git/ghpc deleted file mode 100755 index a3def15e25..0000000000 --- a/buildroot/share/git/ghpc +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env bash -# -# ghpc (GitHub Push Current) -# -# - Push current branch to its remote. Try the following until it works: -# - Plain 'git push' -# - 'git push -f' -# - Try the 'git push' command from the 'git push' error message -# - Try adding '-f' to that command -# - -yay() { echo "SUCCESS" ; } -boo() { echo "FAIL" ; } - -FORCE=$([[ "$1" == "--force" || "$1" == "-f" ]] && echo 1) - -if [[ ! $FORCE ]]; then - echo -n "trying 'git push' ...... " - git push >/dev/null 2>&1 && { yay ; exit ; } - boo -fi - -echo -n "trying 'git push -f' ... " - -# Get the error output from the failed push -# and get the recommended 'git push' line -git push -f 2>&1 | { - CMD="" - - ltrim() { - [[ "$1" =~ [^[:space:]].* ]] - printf "%s" "$BASH_REMATCH" - } - - while IFS= read -r line - do - #echo "$line" - if [[ -z "$CMD" && $line =~ "git push" ]]; then - CMD=$(ltrim "$line") - fi - done - - # if a command was found try it - if [[ -n "$CMD" ]]; then - - boo - - if [[ ! $FORCE ]]; then - echo -n "trying '$CMD' ...... " - $CMD >/dev/null 2>&1 && { yay ; exit ; } - boo - fi - - fCMD=${CMD/ push / push -f } - echo -n "trying '$fCMD' ... " - $fCMD >/dev/null 2>&1 && { yay ; exit ; } - boo - - exit 1 - - else - - yay - - fi -} - -[[ ${PIPESTATUS[1]} == 1 ]] && echo "Sorry! Failed to push current branch." diff --git a/buildroot/share/git/ghtp b/buildroot/share/git/ghtp index 14afd8a27b..83f461ef10 100755 --- a/buildroot/share/git/ghtp +++ b/buildroot/share/git/ghtp @@ -5,15 +5,13 @@ # Set all remotes in the current repo to HTTPS or SSH connection. # Useful when switching environments, using public wifi, etc. # -# Optionally, specify a particular remote to change. -# GH_SSH="git@github\.com:" GH_HTTPS="https:\/\/github\.com\/" case "$1" in - -[Hh]) TYPE=HTTPS ; MATCH="git@" ; REPLACE="$GH_SSH/$GH_HTTPS" ;; - -[Ss]) TYPE=SSH ; MATCH="https:" ; REPLACE="$GH_HTTPS/$GH_SSH" ;; + -[Hh]) TYPE=HTTPS ; MATCH="git@" ; FORMULA="$GH_SSH/$GH_HTTPS" ;; + -[Ss]) TYPE=SSH ; MATCH="https:" ; FORMULA="$GH_HTTPS/$GH_SSH" ;; *) echo "Usage: `basename $0` -h | -s" 1>&2 echo -e " \e[0;92m-h\e[0m to switch to HTTPS" 1>&2 @@ -22,18 +20,14 @@ case "$1" in ;; esac -AWK=$(which gawk || which awk) +REMOTES=$(git remote -v | egrep "\t$MATCH" | gawk '{print $1 " " $2}' | sort -u | sed "s/$FORMULA/") -# Match all or specified remotes of the other type -REGEX="\t$MATCH" ; [[ $# > 1 ]] && REGEX="^$2$REGEX" +if [[ -z $REMOTES ]]; then + echo "Nothing to do." ; exit +fi -REMOTES=$(git remote -v | egrep "$REGEX" | "$AWK" '{print $1 " " $2}' | sort -u | sed "s/$REPLACE/") - -[[ -z $REMOTES ]] && { echo "Nothing to do." ; exit ; } - -# Update a remote for each results pair echo "$REMOTES" | xargs -n2 git remote set-url echo -n "Remotes set to $TYPE: " -echo "$REMOTES" | "$AWK" '{printf "%s ", $1}' +echo "$REMOTES" | gawk '{printf "%s ", $1}' echo diff --git a/buildroot/share/git/mfadd b/buildroot/share/git/mfadd index 30be1ec0f7..48a810b7c6 100755 --- a/buildroot/share/git/mfadd +++ b/buildroot/share/git/mfadd @@ -1,24 +1,20 @@ #!/usr/bin/env bash # -# mfadd user[:branch] [copyname] +# mfadd # # Add a remote and fetch it. Optionally copy a branch. # -# Examples: -# mfadd thefork -# mfadd thefork:patch-1 -# mfadd thefork:patch-1 the_patch_12345 +# Example: mfadd thinkyhead:patch-1 copy_of_patch-1 # -[[ $# > 0 && $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` user[:branch] [copyname]" 1>&2 ; exit 1; } +[[ $# > 0 && $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "Usage: `basename $0` (user | ref copyname)" 1>&2 ; exit 1; } -# If a colon or slash is included, split the parts -if [[ $1 =~ ":" || $1 =~ "/" ]]; then - [[ $1 =~ ":" ]] && IFS=':' || IFS="/" - read -a DATA <<< "$1" +# If a colon is included, split the parts +if [[ $1 =~ ":" ]]; then + IFS=':' read -a DATA <<< "$1" USER=${DATA[0]} BRANCH=${DATA[1]} - NAME=${2:-$BRANCH} + NAME=$2 else USER=$1 fi @@ -33,4 +29,4 @@ echo "Adding and fetching $USER..." git remote add "$USER" "git@github.com:$USER/$REPO.git" >/dev/null 2>&1 || echo "Remote exists." git fetch "$USER" -[[ ! -z "$BRANCH" && ! -z "$NAME" ]] && git checkout -b "$NAME" --track "$USER/$BRANCH" +[[ ! -z "$BRANCH" && ! -z "$NAME" ]] && git checkout $USER/$BRANCH -b $NAME diff --git a/buildroot/share/git/mfclean b/buildroot/share/git/mfclean index fd131c4263..f38997405b 100755 --- a/buildroot/share/git/mfclean +++ b/buildroot/share/git/mfclean @@ -6,8 +6,6 @@ # Great way to clean up your branches after messing around a lot # -AWK=$(which gawk || which awk) - KEEP="RC|RCBugFix|dev|master|bugfix-1|bugfix-2" echo "Fetching latest upstream and origin..." @@ -20,7 +18,7 @@ git branch --merged | egrep -v "^\*|$KEEP" | xargs -n 1 git branch -d echo echo "Pruning Remotely-deleted Branches..." -git branch -vv | egrep -v "^\*|$KEEP" | grep ': gone]' | "$AWK" '{print $1}' | xargs -n 1 git branch -D +git branch -vv | egrep -v "^\*|$KEEP" | grep ': gone]' | gawk '{print $1}' | xargs -n 1 git branch -D echo # List fork branches that don't match local branches diff --git a/buildroot/share/git/mfdoc b/buildroot/share/git/mfdoc index ce21419016..dde571dd04 100755 --- a/buildroot/share/git/mfdoc +++ b/buildroot/share/git/mfdoc @@ -16,23 +16,20 @@ BRANCH=${INFO[5]} [[ $ORG == "MarlinFirmware" && $REPO == "MarlinDocumentation" ]] || { echo "Wrong repository." 1>&2; exit 1; } opensite() { + TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') URL="http://127.0.0.1:4000/" - OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }') - if [ -z "$OPEN" ]; then + if [ -z "$TOOL" ]; then echo "Can't find a tool to open the URL:" echo $URL else echo "Opening preview site in the browser..." - "$OPEN" "$URL" + "$TOOL" "$URL" fi } echo "Previewing MarlinDocumentation..." -bundle exec jekyll serve --watch --incremental | { - while IFS= read -r line - do - [[ $line =~ "Server running" ]] && opensite - echo "$line" - done -} +# wait to open the url for about 8s +( sleep 45; opensite ) & + +bundle exec jekyll serve --watch --incremental diff --git a/buildroot/share/git/mffp b/buildroot/share/git/mffp index 2663a4a137..b8b7b37a79 100755 --- a/buildroot/share/git/mffp +++ b/buildroot/share/git/mffp @@ -1,14 +1,14 @@ #!/usr/bin/env bash # -# mffp [1|2|3] [commit-id] +# mffp # # Push the given commit (or HEAD) upstream immediately. # By default: `git push upstream HEAD:bugfix-1.1.x` # -[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` [1|2|3] [commit-id]" 1>&2 ; exit 1; } +[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "Usage: `basename $0` [1|2] [commit-id]" 1>&2 ; exit 1; } -if [[ $1 == '1' || $1 == '2' || $1 == '3' ]]; then +if [[ $1 == '1' || $1 == '2' ]]; then MFINFO=$(mfinfo "$1") || exit 1 REF=${2:-HEAD} else diff --git a/buildroot/share/git/mfhelp b/buildroot/share/git/mfhelp deleted file mode 100755 index 1afc4c686b..0000000000 --- a/buildroot/share/git/mfhelp +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash -# -# mfhelp -# - -cat <&2 +} + +[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { usage; exit 1; } + CURR=$(git branch 2>/dev/null | grep ^* | sed 's/\* //g') [[ -z $CURR ]] && { echo "No git repository here!" 1>&2 ; exit 1; } [[ $CURR == "(no"* ]] && { echo "Git is busy with merge, rebase, etc." 1>&2 ; exit 1; } @@ -22,40 +28,30 @@ REPO=$(git remote get-url upstream 2>/dev/null | sed -E 's/.*\/(.*)\.git/\1/') ORG=$(git remote get-url upstream 2>/dev/null | sed -E 's/.*[\/:](.*)\/.*$/\1/') [[ $ORG == MarlinFirmware ]] || { echo "`basename $0`: Not a Marlin repository." 1>&2 ; exit 1; } -FORK=$(git remote get-url origin 2>/dev/null | sed -E 's/.*[\/:](.*)\/.*$/\1/') - -# Defaults if no arguments given -BRANCH=$CURR -INDEX=1 - -while [[ $# -gt 0 ]]; do - opt="$1" ; shift ; val="$1" - - IFS='=' read -a PARTS <<<"$opt" - [[ "${PARTS[1]}" != "" ]] && { EQUALS=1 ; opt="${PARTS[0]}" ; val="${PARTS[1]}" ; } - - GOODVAL=1 - if [[ "$val" =~ ^-{1,2}.* || ! "$opt" =~ ^-{1,2}.* ]]; then - GOODVAL=0 - val="" - fi - - case "$opt" in - -*|--*) MORE="$MORE$opt " ; [[ $EQUALS == 1 ]] && MORE="$MORE=$val" ;; - 1|2|3) INDEX=$opt ;; - *) BRANCH="$opt" ;; - esac - -done - case "$REPO" in - Marlin ) TARG=bugfix-2.0.x ; [[ $INDEX == 1 ]] && TARG=bugfix-1.1.x ; [[ $INDEX == 3 ]] && TARG=dev-2.1.x ;; - Configurations ) TARG=import-2.0.x ;; + Marlin ) TARG=bugfix-1.1.x ; + [[ $# > 0 ]] && [[ $1 == 2 ]] && TARG=bugfix-2.0.x + ;; MarlinDocumentation ) TARG=master ;; esac -[[ $BRANCH =~ ^[123]$ ]] && USAGE=1 +FORK=$(git remote get-url origin 2>/dev/null | sed -E 's/.*[\/:](.*)\/.*$/\1/') -[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3] [branch]" 1>&2 ; exit 1 ; } +# BRANCH can be given as the last argument +case "$#" in + 0 ) BRANCH=$CURR ;; + 1 ) + case "$1" in + 1|2) BRANCH=$CURR ;; + *) BRANCH=$1 ;; + esac + ;; + 2 ) + case "$1" in + 1|2) BRANCH=$2 ;; + *) usage ; exit 1 ;; + esac + ;; +esac -echo "$ORG $FORK $REPO $TARG $BRANCH $CURR $MORE" +echo "$ORG $FORK $REPO $TARG $BRANCH $CURR" diff --git a/buildroot/share/git/mfinit b/buildroot/share/git/mfinit index bc2495ad95..05bab8767d 100755 --- a/buildroot/share/git/mfinit +++ b/buildroot/share/git/mfinit @@ -5,7 +5,7 @@ # Create the upstream remote for a forked repository # -[[ $# == 0 ]] || { echo "usage: `basename $0`" 1>&2 ; exit 1; } +[[ $# == 0 ]] || { echo "Usage: `basename $0`" 1>&2 ; exit 1; } [[ -z $(git branch 2>/dev/null | grep ^* | sed 's/\* //g') ]] && { echo "No git repository here!" 1>&2 ; exit 1; } diff --git a/buildroot/share/git/mfnew b/buildroot/share/git/mfnew index e491fea191..a33c3f081a 100755 --- a/buildroot/share/git/mfnew +++ b/buildroot/share/git/mfnew @@ -6,7 +6,7 @@ # usage() { - echo "usage: `basename $0` [1|2|3] [name]" 1>&2 + echo "Usage: `basename $0` [1|2] [name]" 1>&2 } [[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { usage; exit 1; } @@ -19,12 +19,12 @@ BRANCH=pr_for_$TARG-$(date +"%G-%m-%d_%H.%M.%S") # BRANCH can be given as the last argument case "$#" in 1 ) case "$1" in - 1|2|3) ;; + 1|2) ;; *) BRANCH=$1 ;; esac ;; 2 ) case "$1" in - 1|2|3) BRANCH=$2 ;; + 1|2) BRANCH=$2 ;; *) usage ; exit 1 ;; esac ;; diff --git a/buildroot/share/git/mfpr b/buildroot/share/git/mfpr index b853c6929e..2750195b7e 100755 --- a/buildroot/share/git/mfpr +++ b/buildroot/share/git/mfpr @@ -1,11 +1,11 @@ #!/usr/bin/env bash # -# mfpr [1|2|3] +# mfpr # -# Make a PR against bugfix-1.1.x or bugfix-2.0.x +# Make a PR of the current branch against RCBugFix or dev # -[[ $# < 2 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` [1|2|3] [branch]" 1>&2 ; exit 1; } +[[ $# < 2 && $1 != "-h" && $1 != "--help" ]] || { echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1; } MFINFO=$(mfinfo "$@") || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" @@ -23,15 +23,15 @@ OLDBRANCH=${INFO[5]} # See if it's been pushed yet if [ -z "$(git branch -vv | grep ^\* | grep \\[origin)" ]; then firstpush; fi -OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }') +TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') URL="https://github.com/$ORG/$REPO/compare/$TARG...$FORK:$BRANCH?expand=1" -if [ -z "$OPEN" ]; then +if [ -z "$TOOL" ]; then echo "Can't find a tool to open the URL:" echo $URL else echo "Opening a New PR Form..." - "$OPEN" "$URL" + "$TOOL" "$URL" fi [[ $BRANCH != $OLDBRANCH ]] && git checkout $OLDBRANCH diff --git a/buildroot/share/git/mfpub b/buildroot/share/git/mfpub index 6a912e5515..85b890510a 100755 --- a/buildroot/share/git/mfpub +++ b/buildroot/share/git/mfpub @@ -5,8 +5,8 @@ # Use Jekyll to generate Marlin Documentation, which is then # git-pushed to Github to publish it to the live site. # This publishes the current branch, and doesn't force -# changes to be pushed to the 'master' branch. Be sure to -# push any permanent changes to 'master'. +# changes to be pushed to the 'master' branch. Be sure to push +# any permanent changes to 'master'. # [[ $# < 2 && $1 != "-h" && $1 != "--help" ]] || { echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1; } @@ -18,60 +18,47 @@ FORK=${INFO[1]} REPO=${INFO[2]} TARG=${INFO[3]} BRANCH=${INFO[4]} -CURR=${INFO[5]} if [[ $ORG != "MarlinFirmware" || $REPO != "MarlinDocumentation" ]]; then echo "Wrong repository." exit fi +# Check out the named branch (or stay in current) +git checkout $BRANCH + if [[ $BRANCH == "gh-pages" ]]; then echo "Can't build from 'gh-pages.' Only the Jekyll branches (based on 'master')." exit fi -# Check out the named branch (or stay in current) - -if [[ $BRANCH != $CURR ]]; then - echo "Stashing any changes to files..." - [[ $(git stash) != "No local "* ]] && HAS_STASH=1 - git checkout $BRANCH -fi +echo "Stashing any changes to files..." +echo "Don't forget to update and push 'master'!" +# GOJF Card +[[ $(git stash) != "No local "* ]] && HAS_STASH=1 COMMIT=$( git log --format="%H" -n 1 ) # Clean out changes and other junk in the branch git clean -d -f -opensite() { - URL="$1" - OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }') - if [ -z "$OPEN" ]; then - echo "Can't find a tool to open the URL:" - echo $URL - else - echo "Opening the site in the browser..." - "$OPEN" "$URL" - fi -} - # Push 'master' to the fork and make a proper PR... -if [[ $BRANCH == $TARG ]]; then +if [[ $BRANCH == "master" ]]; then # Don't lose upstream changes! git fetch upstream # Rebase onto latest master - if git rebase upstream/$TARG; then + if git rebase upstream/master; then # Allow working directly with the main fork echo - echo -n "Pushing to origin/$TARG... " - git push origin HEAD:$TARG + echo -n "Pushing to origin/master... " + git push -f origin echo - echo -n "Pushing to upstream/$TARG... " - git push upstream HEAD:$TARG + echo -n "Pushing to upstream/master... " + git push -f upstream else @@ -82,7 +69,7 @@ if [[ $BRANCH == $TARG ]]; then else - if [ -z "$(git branch -vv | grep ^\* | grep \\\[origin)" ]; then + if [ -z "$(git branch -vv | grep ^\* | grep \\[origin)" ]; then firstpush else echo @@ -90,7 +77,16 @@ else git push -f origin fi - opensite "https://github.com/$ORG/$REPO/compare/$TARG...$FORK:$BRANCH?expand=1" + TOOL=$(which gnome-open xdg-open open | awk '{ print $1 }') + URL="https://github.com/$ORG/$REPO/compare/$TARG...$FORK:$BRANCH?expand=1" + + if [ -z "$TOOL" ]; then + echo "Can't find a tool to open the URL:" + echo $URL + else + echo "Opening a New PR Form..." + "$TOOL" "$URL" + fi fi @@ -101,38 +97,31 @@ fi echo echo "Generating MarlinDocumentation..." -rm -rf build - # build the site statically and proof it bundle exec jekyll build --profile --trace --no-watch -bundle exec htmlproofer ./build --only-4xx --allow-hash-href --check-favicon --check-html --url-swap ".*marlinfw.org/:/" +bundle exec htmlproofer ./_site --only-4xx --allow-hash-href --check-favicon --check-html --url-swap ".*marlinfw.org/:/" # Sync the built site into a temporary folder TMPFOLDER=$( mktemp -d ) -rsync -av build/ ${TMPFOLDER}/ +rsync -av _site/ ${TMPFOLDER}/ # Clean out changes and other junk in the branch git reset --hard git clean -d -f # Copy built-site into the gh-pages branch -git checkout gh-pages || { echo "Something went wrong!"; exit 1; } +git checkout gh-pages rsync -av ${TMPFOLDER}/ ./ # Commit and push the new live site directly git add --all git commit --message "Built from ${COMMIT}" -git push -f origin -git push -f upstream | { - while IFS= read -r line - do - [[ $line =~ "gh-pages -> gh-pages" ]] && opensite "https://marlinfw.org/" - echo "$line" - done -} +git push upstream # remove the temporary folder rm -rf ${TMPFOLDER} # Go back to the branch we started from -git checkout $CURR && [[ $HAS_STASH == 1 ]] && git stash pop +git checkout $BRANCH + +[[ $HAS_STASH == 1 ]] && git stash pop diff --git a/buildroot/share/git/mfqp b/buildroot/share/git/mfqp index 5650d08252..e00e7e52e9 100755 --- a/buildroot/share/git/mfqp +++ b/buildroot/share/git/mfqp @@ -1,30 +1,27 @@ #!/usr/bin/env bash # -# mfqp [1|2|3] +# mfqp # -# - git add . -# - git commit --amend -# - ghpc +# Add all changed files, commit as "patch", do `mfrb` and `git push -f` # +[[ $# < 2 && $1 != "-h" && $1 != "--help" ]] || { echo "Usage: `basename $0` [1|2]" 1>&2 ; exit 1; } + MFINFO=$(mfinfo "$@") || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" REPO=${INFO[2]} TARG=${INFO[3]} CURR=${INFO[5]} -IND=6 -while [ $IND -lt ${#INFO[@]} ]; do - ARG=${INFO[$IND]} - case "$ARG" in - -h|--help ) USAGE=1 ;; - * ) USAGE=1 ; echo "unknown option: $ARG" ;; - esac - let IND+=1 -done +git add . +git commit -m "patch" -[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; } - -[[ $CURR == $TARG && $REPO != "MarlinDocumentation" ]] && { echo "Don't alter the PR Target branch."; exit 1 ; } - -git add . && git commit --amend && git push -f +if [[ $CURR == $TARG ]]; then + if [[ $REPO == "MarlinDocumentation" ]]; then + git rebase -i HEAD~2 && git push -f + else + echo "Don't alter the PR Target branch."; exit 1 + fi +else + mfrb "$@" && git push -f +fi diff --git a/buildroot/share/git/mfrb b/buildroot/share/git/mfrb index 071b0b3d59..32d50559fa 100755 --- a/buildroot/share/git/mfrb +++ b/buildroot/share/git/mfrb @@ -2,26 +2,18 @@ # # mfrb # -# Do "git rebase -i" against the "target" branch (bugfix-1.1.x, bugfix-2.0.x, dev-2.1.x, or master) +# Do "git rebase -i" against the "target" branch (bugfix-1.1.x, bugfix-2.0.x, or master) # +[[ $# < 2 && $1 != "-h" && $1 != "--help" ]] || { echo "Usage: `basename $0` [1|2]" 1>&2 ; exit 1; } + MFINFO=$(mfinfo "$@") || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" TARG=${INFO[3]} CURR=${INFO[5]} -IND=6 -while [ $IND -lt ${#INFO[@]} ]; do - ARG=${INFO[$IND]} - case "$ARG" in - -q|--quick ) QUICK=1 ;; - -h|--help ) USAGE=1 ;; - * ) USAGE=1 ; echo "unknown option: $ARG" ;; - esac - let IND+=1 -done - -[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; } - -[[ $QUICK ]] || git fetch upstream -git rebase upstream/$TARG && git rebase -i upstream/$TARG +# If the branch isn't currently the PR target +if [[ $TARG != $CURR ]]; then + git fetch upstream + git rebase upstream/$TARG && git rebase -i upstream/$TARG +fi diff --git a/buildroot/share/git/mftest b/buildroot/share/git/mftest deleted file mode 100755 index cfb5dd05f3..0000000000 --- a/buildroot/share/git/mftest +++ /dev/null @@ -1,236 +0,0 @@ -#!/usr/bin/env bash -# -# mftest Select a test to apply and build -# mftest -b [#] Build the auto-detected environment -# mftest -u [#] Upload the auto-detected environment -# mftest [name] [index] [-y] Set config options and optionally build a test -# - -MFINFO=$(mfinfo) || exit 1 -[[ -d Marlin/src ]] || { echo "Please 'cd' up to repo root." ; exit 1 ; } - -TESTPATH=buildroot/tests - -STATE_FILE=$( echo ./.pio/.mftestrc ) -SED=$(which gsed || which sed) - -shopt -s extglob nocasematch - -# Matching patterns -ISNUM='^[0-9]+$' -ISCMD='^(restore|opt|exec|use|pins|env)_' -ISEXEC='^exec_' -ISCONT='\\ *$' - -# Get the environment and test number from the command -TESTENV=${1:-'-'} -CHOICE=${2:-0} -AUTOENV=0 - -# Allow shorthand for test name -case $TESTENV in - tree) pio run -d . -e include_tree ; exit 1 ;; - due) TESTENV='DUE' ;; - esp) TESTENV='esp32' ;; - lin*) TESTENV='linux_native' ;; - lpc?(8)) TESTENV='LPC1768' ;; - lpc9) TESTENV='LPC1769' ;; - m128) TESTENV='mega1280' ;; - m256) TESTENV='mega2560' ;; - mega) TESTENV='mega2560' ;; - stm) TESTENV='STM32F103RE' ;; - f1) TESTENV='STM32F103RE' ;; - f4) TESTENV='STM32F4' ;; - f7) TESTENV='STM32F7' ;; - s6) TESTENV='FYSETC_S6' ;; - teensy) TESTENV='teensy31' ;; - t31) TESTENV='teensy31' ;; - t32) TESTENV='teensy31' ;; - t35) TESTENV='teensy35' ;; - t36) TESTENV='teensy35' ;; - t40) TESTENV='teensy41' ;; - t41) TESTENV='teensy41' ;; - --h|--help) echo -e "$(basename $0) : Marlin Firmware test, build, and upload\n" - echo "Usage: $(basename $0) ................. Select env and test to apply / run" - echo " $(basename $0) [-y] env ........ Select a test for env to apply / run" - echo " $(basename $0) [-y] env test ... Apply / run the specified env test" - echo " $(basename $0) -b [variant] .... Auto-build the specified variant" - echo " $(basename $0) -u [variant] .... Auto-build and upload the specified variant" - echo - echo "env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36 t40|t41" - exit - ;; - - # Build with the last-built env - -r) [[ -f "$STATE_FILE" ]] || { echo "No previous (-r) build state found." ; exit 1 ; } - read TESTENV <"$STATE_FILE" - pio run -d . -e $TESTENV - exit - ;; - - -[bu]) MB=$( grep -E "^\s*#define MOTHERBOARD" Marlin/Configuration.h | awk '{ print $3 }' | $SED 's/BOARD_//' ) - [[ -z $MB ]] && { echo "Error - Can't read MOTHERBOARD setting." ; exit 1 ; } - BLINE=$( grep -E "define\s+BOARD_$MB\b" Marlin/src/core/boards.h ) - BNUM=$( $SED -E 's/^.+BOARD_[^ ]+ +([0-9]+).+$/\1/' <<<"$BLINE" ) - BDESC=$( $SED -E 's/^.+\/\/ *(.+)$/\1/' <<<"$BLINE" ) - [[ -z $BNUM ]] && { echo "Error - Can't find $MB in boards list." ; exit 1 ; } - readarray -t ENVS <<< $( grep -EA1 "MB\(.*\b$MB\b.*\)" Marlin/src/pins/pins.h | grep -E '#include.+//.+env:.+' | grep -oE 'env:[^ ]+' | $SED -E 's/env://' ) - [[ -z $ENVS ]] && { echo "Error - Can't find target(s) for $MB ($BNUM)." ; exit 1 ; } - ECOUNT=${#ENVS[*]} - - if [[ $ECOUNT == 1 ]]; then - TARGET=$ENVS - else - if [[ $CHOICE == 0 ]]; then - # - # List env names and numbers. Get selection. - # - echo "Available targets for \"$BDESC\" | $MB ($BNUM):" - - IND=0 ; for ENV in "${ENVS[@]}"; do let IND++ ; echo " $IND) $ENV" ; done - - if [[ $ECOUNT > 1 ]]; then - for (( ; ; )) - do - read -p "Select a target for '$MB' (1-$ECOUNT) : " CHOICE - [[ -z "$CHOICE" ]] && { echo '(canceled)' ; exit 1 ; } - [[ $CHOICE =~ $ISNUM ]] && ((CHOICE >= 1 && CHOICE <= ECOUNT)) && break - echo ">>> Invalid environment choice '$CHOICE'." - done - echo - fi - else - echo "Detected \"$BDESC\" | $MB ($BNUM)." - [[ $CHOICE > $ECOUNT ]] && { echo "Environment selection out of range." ; exit 1 ; } - fi - TARGET="${ENVS[$CHOICE-1]}" - echo "Selected $TARGET" - fi - - echo "$TARGET" >"$STATE_FILE" - - if [[ $TESTENV == "-u" ]]; then - echo "Build/Uploading environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -t upload -e $TARGET - else - echo "Building environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -e $TARGET - fi - exit - ;; - - # The -y flag may come first - -y) TESTENV=${2:-'-'} ; CHOICE=${3:-0} ;; - - -[a-z]) echo "Unknown flag $TESTENV" ; exit 1 ;; - -) ;; -esac - -# -# List available tests and ask for selection -# - -if [[ $TESTENV == '-' ]]; then - IND=0 - NAMES=() - for FILE in $( ls -1 $TESTPATH/*-tests ) - do - let IND++ - TNAME=${FILE/-tests/} - TNAME=${TNAME/$TESTPATH\//} - NAMES+=($TNAME) - (( IND < 10 )) && echo -n " " - echo " $IND) $TNAME" - done - - echo - for (( ; ; )) - do - read -p "Select a test to apply (1-$IND) : " NAMEIND - [[ -z "$NAMEIND" ]] && { echo '(canceled)' ; exit 1 ; } - [[ $NAMEIND =~ $ISNUM ]] && ((NAMEIND >= 1 && NAMEIND <= IND)) && { TESTENV=${NAMES[$NAMEIND-1]} ; echo ; break ; } - echo "Invalid selection." - done -fi - -# Get the contents of the test file -OUT=$( cat $TESTPATH/$TESTENV-tests 2>/dev/null ) || { echo "Can't find test '$TESTENV'." ; exit 1 ; } - -# Count up the number of tests -TESTCOUNT=$( awk "/$ISEXEC/{a++}END{print a}" <<<"$OUT" ) - -# User entered a number? -(( CHOICE && CHOICE > TESTCOUNT )) && { echo "Invalid test selection '$CHOICE' (1-$TESTCOUNT)." ; exit 1 ; } - -if [[ $CHOICE == 0 ]]; then - # - # List test descriptions with numbers and get selection - # - echo "Available '$TESTENV' tests:" ; echo "$OUT" | { - IND=0 - while IFS= read -r LINE - do - if [[ $LINE =~ $ISEXEC ]]; then - DESC=$( "$SED" -E 's/^.+"(.*)".*$/\1/g' <<<"$LINE" ) - (( ++IND < 10 )) && echo -n " " - echo " $IND) $DESC" - fi - done - } - CHOICE=1 - if [[ $TESTCOUNT > 1 ]]; then - for (( ; ; )) - do - read -p "Select a '$TESTENV' test (1-$TESTCOUNT) : " CHOICE - [[ -z "$CHOICE" ]] && { echo '(canceled)' ; exit 1 ; } - [[ $CHOICE =~ $ISNUM ]] && ((CHOICE >= 1 && CHOICE <= TESTCOUNT)) && break - echo ">>> Invalid test selection '$CHOICE'." - done - fi -fi - -# -# Run the specified test lines -# -echo "$OUT" | { - IND=0 - GOTX=0 - CMD="" - while IFS= read -r LINE - do - if [[ $LINE =~ $ISCMD || $GOTX == 1 ]]; then - ((!IND)) && let IND++ - if [[ $LINE =~ $ISEXEC ]]; then - ((IND++ > CHOICE)) && break - else - ((!HEADER)) && { - HEADER=1 - echo -e "\n#\n# Test $TESTENV ($CHOICE) $DESC\n#" - } - ((IND == CHOICE)) && { - GOTX=1 - [[ $CMD == "" ]] && CMD="$LINE" || CMD=$( echo -e "$CMD$LINE" | $SED -e 's/\\//g' ) - [[ $LINE =~ $ISCONT ]] || { echo $CMD ; eval "$CMD" ; CMD="" ; } - } - fi - fi - done -} - -# Make clear it's a TEST -opt_set CUSTOM_MACHINE_NAME "\"$TESTENV-tests ($CHOICE)\"" - -# Get a -y parameter the lazy way -[[ "$2" == "-y" || "$3" == "-y" ]] && BUILD_YES='Y' - -# Build the test too? -if [[ $BUILD_YES != 'Y' ]]; then - echo - read -p "Build $TESTENV test #$CHOICE (y/N) ? " BUILD_YES -fi - -[[ $BUILD_YES == 'Y' || $BUILD_YES == 'Yes' ]] && { - pio run -d . -e $TESTENV - echo "$TESTENV" >"$STATE_FILE" -} diff --git a/buildroot/share/git/mfup b/buildroot/share/git/mfup index 691259e2a9..f28d76aa44 100755 --- a/buildroot/share/git/mfup +++ b/buildroot/share/git/mfup @@ -7,7 +7,7 @@ # - Force-push the branch to 'origin' # -[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` [1|2] [branch]" 1>&2 ; exit 1; } +[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "Usage: `basename $0` [1|2] [branch]" 1>&2 ; exit 1; } MFINFO=$(mfinfo "$@") || exit 1 IFS=' ' read -a INFO <<< "$MFINFO" diff --git a/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino b/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino index 6dcfb67c54..dc2ce41ce1 100644 --- a/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino +++ b/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino @@ -5,7 +5,7 @@ #undef digitalPinToPCICR #define digitalPinToPCICR(p) ( ((p) >= 10 && (p) <= 15) || \ ((p) >= 50 && (p) <= 53) || \ - ((p) >= 62 && (p) <= 69) ? (&PCICR) : nullptr) + ((p) >= 62 && (p) <= 69) ? &PCICR : (uint8_t *)0) #endif void setup() { diff --git a/buildroot/share/pixmaps/MarlinIcons.psd b/buildroot/share/pixmaps/MarlinIcons.psd deleted file mode 100644 index 4575236dbb..0000000000 Binary files a/buildroot/share/pixmaps/MarlinIcons.psd and /dev/null differ diff --git a/buildroot/share/scripts/MarlinMesh.scad b/buildroot/share/scripts/MarlinMesh.scad index 6d78bb9649..7616ded699 100644 --- a/buildroot/share/scripts/MarlinMesh.scad +++ b/buildroot/share/scripts/MarlinMesh.scad @@ -10,13 +10,17 @@ * * \**************************************/ -$t = 0.15; // comment out during animation! -X = 0; Y = 1; -L = 0; R = 1; F = 2; B = 3; +//$t = 0.15; // comment out during animation // -// Sample Mesh - Replace with your own +// Mesh info and points // + +mesh_width = 200; // X Size in mm of the probed area +mesh_height = 200; // Y Size... +zprobe_offset = 0; // Added to the points +NAN = 0; // Z to use for un-measured points + measured_z = [ [ -1.20, -1.13, -1.09, -1.03, -1.19 ], [ -1.16, -1.25, -1.27, -1.25, -1.08 ], @@ -25,28 +29,6 @@ measured_z = [ [ -1.13, -0.99, -1.03, -1.06, -1.32 ] ]; -// -// An offset to add to all points in the mesh -// -zadjust = 0; - -// -// Mesh characteristics -// -bed_size = [ 200, 200 ]; - -mesh_inset = [ 10, 10, 10, 10 ]; // L, F, R, B - -mesh_bounds = [ - [ mesh_inset[L], mesh_inset[F] ], - [ bed_size[X] - mesh_inset[R], bed_size[Y] - mesh_inset[B] ] -]; - -mesh_size = mesh_bounds[1] - mesh_bounds[0]; - - // NOTE: Marlin meshes already subtract the probe offset -NAN = 0; // Z to use for un-measured points - // // Geometry // @@ -63,7 +45,6 @@ alternation = 2; // direction change modulus (try it) show_plane = true; show_labels = true; -show_coords = true; arrow_length = 5; label_font_lg = "Arial"; @@ -81,8 +62,8 @@ mean_value = (big_z + lil_z) / 2.0; mesh_points_y = len(measured_z); mesh_points_x = len(measured_z[0]); -xspace = mesh_size[X] / (mesh_points_x - 1); -yspace = mesh_size[Y] / (mesh_points_y - 1); +xspace = mesh_width / (mesh_points_x - 1); +yspace = mesh_height / (mesh_points_y - 1); // At $t=0 and $t=1 scale will be 100% z_scale_factor = min_z_scale + (($t > 0.5) ? 1.0 - $t : $t) * (max_z_scale - min_z_scale) * 2; @@ -91,8 +72,6 @@ z_scale_factor = min_z_scale + (($t > 0.5) ? 1.0 - $t : $t) * (max_z_scale - min // Min and max recursive functions for 1D and 2D arrays // Return the smallest or largest value in the array // -function some_1D(b,i) = (i//" -# ... or similar path leading to this file. -# -# Warning: The program modifies files in place, so be sure to back them up first if needed. -# Can be run multiple times if needed. Only modifies files which don't have -# correct #define CONFIG_EXAMPLES_DIR line. -# -# Invocation: -#------------- -# 1. Change directory to your MarlinFirmware/Configurations working copy -# 2. python3 config-labels.py -# -#----------------------------------- -# 2020-05-10 GMW original -# 2020-06-05 SRL style tweaks -#----------------------------------- -# -import sys -import os -from pathlib import Path -from distutils.dir_util import copy_tree # for copy_tree, because shutil.copytree can't handle existing files, dirs - -# Modify input_examples_dir and output_examples_dir for your installation -# No trailing slash -# Setting output_examples_dir = input_examples_dir causes the program to insert into the existing files. - -input_examples_dir = r'config/examples' -# output_examples_dir = input_examples_dir -output_examples_dir = r'config/examples' - -#------------------------------------- - -files_to_mod = ['Configuration.h', 'Configuration_adv.h', '_Bootscreen.h', '_Statusscreen.h'] - -macro_name = 'CONFIG_EXAMPLES_DIR' -def_macro_name = '#define ' + macro_name - -filenum = 0 -different_out_dir = not (output_examples_dir == input_examples_dir) - -#---------------------------------------------- -def process_file(subdir: str, filename: str): -#---------------------------------------------- - global filenum - filenum += 1 - - print(str(filenum) + ' ' + filename + ': ' + subdir) - - def_line = (def_macro_name + ' "' + subdir.replace('\\', '/') + '"') - - #------------------------ - # Read file - #------------------------ - lines = [] - infilepath = os.path.join(input_examples_dir, subdir, filename) - try: - # UTF-8 because some files contain unicode chars - with open(infilepath, 'rt', encoding="utf-8") as infile: - lines = infile.readlines() - - except Exception as e: - print('Failed to read file: ' + str(e) ) - raise Exception - - lines = [line.rstrip('\r\n') for line in lines] - - #------------------------ - # Process lines - #------------------------ - file_modified = False - - # region state machine - # -1 = before pragma once; - # 0 = region to place define; - # 1 = past region to place define - region = -1 - - outlines = [] - for line in lines: - outline = line - - if (region == -1) and (def_macro_name in line): - outline = None - file_modified = True - - elif (region == -1) and ('pragma once' in line): - region = 0 - - elif (region == 0): - if (line.strip() == ''): - pass - elif (def_macro_name in line): - region = 1 - if line == def_line: # leave it as is - pass - else: - outline = def_line - file_modified = True - else: # some other string - outlines.append(def_line) - outlines.append('') - region = 1 - file_modified = True - - elif (region == 1): - if (def_macro_name in line): - outline = None - file_modified = True - else: - pass - - # end if - if outline is not None: - outlines.append(outline) - # end for - - #------------------------- - # Output file - #------------------------- - outdir = os.path.join(output_examples_dir, subdir) - outfilepath = os.path.join(outdir, filename) - - if file_modified: - # Note: no need to create output dirs, as the initial copy_tree - # will do that. - - print(' writing ' + str(outfilepath)) - try: - # Preserve unicode chars; Avoid CR-LF on Windows. - with open(outfilepath, "w", encoding="utf-8", newline='\n') as outfile: - outfile.write("\n".join(outlines)) - outfile.write("\n") - - except Exception as e: - print('Failed to write file: ' + str(e) ) - raise Exception - else: - print(' no change for ' + str(outfilepath)) - -#---------- -def main(): -#---------- - global filenum - global input_examples_dir - global output_examples_dir - filenum = 0 - - #-------------------------------- - # Check for requirements - #-------------------------------- - input_examples_dir = input_examples_dir.strip() - input_examples_dir = input_examples_dir.rstrip('\\/') - output_examples_dir = output_examples_dir.strip() - output_examples_dir = output_examples_dir.rstrip('\\/') - - for dir in [input_examples_dir, output_examples_dir]: - if not (os.path.exists(dir)): - print('Directory not found: ' + dir) - sys.exit(1) - - #-------------------------------- - # Copy tree if necessary. - #-------------------------------- - # This includes files that are not otherwise included in the - # insertion of the define statement. - # - if different_out_dir: - print('Copying files to new directory: ' + output_examples_dir) - try: - copy_tree(input_examples_dir, output_examples_dir) - except Exception as e: - print('Failed to copy directory: ' + str(e) ) - raise Exception - - #----------------------------- - # Find and process files - #----------------------------- - len_input_examples_dir = len(input_examples_dir); - len_input_examples_dir += 1 - - for filename in files_to_mod: - input_path = Path(input_examples_dir) - filepathlist = input_path.rglob(filename) - - for filepath in filepathlist: - fulldirpath = str(filepath.parent) - subdir = fulldirpath[len_input_examples_dir:] - - process_file(subdir, filename) - -#============== -print('--- Starting config-labels ---') -main() -print('--- Done ---') diff --git a/buildroot/share/scripts/createSpeedLookupTable.py b/buildroot/share/scripts/createSpeedLookupTable.py index da24c7c811..ade28ee333 100755 --- a/buildroot/share/scripts/createSpeedLookupTable.py +++ b/buildroot/share/scripts/createSpeedLookupTable.py @@ -1,8 +1,5 @@ #!/usr/bin/env python -from __future__ import print_function -from __future__ import division - """ Generate the stepper delay lookup table for Marlin firmware. """ import argparse @@ -19,35 +16,35 @@ args = parser.parse_args() cpu_freq = args.cpu_freq * 1000000 timer_freq = cpu_freq / args.divider -print("#ifndef SPEED_LOOKUPTABLE_H") -print("#define SPEED_LOOKUPTABLE_H") -print() -print('#include "MarlinCore.h"') -print() +print "#ifndef SPEED_LOOKUPTABLE_H" +print "#define SPEED_LOOKUPTABLE_H" +print +print '#include "Marlin.h"' +print -print("const uint16_t speed_lookuptable_fast[256][2] PROGMEM = {") +print "const uint16_t speed_lookuptable_fast[256][2] PROGMEM = {" a = [ timer_freq / ((i*256)+(args.cpu_freq*2)) for i in range(256) ] b = [ a[i] - a[i+1] for i in range(255) ] b.append(b[-1]) for i in range(32): - print(" ", end=' ') + print " ", for j in range(8): - print("{%d, %d}," % (a[8*i+j], b[8*i+j]), end=' ') - print() -print("};") -print() + print "{%d, %d}," % (a[8*i+j], b[8*i+j]), + print +print "};" +print -print("const uint16_t speed_lookuptable_slow[256][2] PROGMEM = {") +print "const uint16_t speed_lookuptable_slow[256][2] PROGMEM = {" a = [ timer_freq / ((i*8)+(args.cpu_freq*2)) for i in range(256) ] b = [ a[i] - a[i+1] for i in range(255) ] b.append(b[-1]) for i in range(32): - print(" ", end=' ') + print " ", for j in range(8): - print("{%d, %d}," % (a[8*i+j], b[8*i+j]), end=' ') - print() -print("};") -print() + print "{%d, %d}," % (a[8*i+j], b[8*i+j]), + print +print "};" +print -print("#endif") +print "#endif" diff --git a/buildroot/share/scripts/createTemperatureLookupMarlin.py b/buildroot/share/scripts/createTemperatureLookupMarlin.py index b2d8964f55..83147c502b 100755 --- a/buildroot/share/scripts/createTemperatureLookupMarlin.py +++ b/buildroot/share/scripts/createTemperatureLookupMarlin.py @@ -1,11 +1,11 @@ -#!/usr/bin/env python +#!/usr/bin/python """Thermistor Value Lookup Table Generator Generates lookup to temperature values for use in a microcontroller in C format based on: -https://en.wikipedia.org/wiki/Steinhart-Hart_equation +http://en.wikipedia.org/wiki/Steinhart-Hart_equation The main use is for Arduino programs that read data from the circuit board described here: -https://reprap.org/wiki/Temperature_Sensor_v2.0 +http://reprap.org/wiki/Temperature_Sensor_v2.0 Usage: python createTemperatureLookupMarlin.py [options] @@ -18,9 +18,6 @@ Options: --num-temps=... the number of temperature points to calculate (default: 36) """ -from __future__ import print_function -from __future__ import division - from math import * import sys import getopt @@ -50,9 +47,9 @@ class Thermistor: a = y1 - (b + l1**2 *c)*l1 if c < 0: - print("//////////////////////////////////////////////////////////////////////////////////////") - print("// WARNING: negative coefficient 'c'! Something may be wrong with the measurements! //") - print("//////////////////////////////////////////////////////////////////////////////////////") + print "//////////////////////////////////////////////////////////////////////////////////////" + print "// WARNING: negative coefficient 'c'! Something may be wrong with the measurements! //" + print "//////////////////////////////////////////////////////////////////////////////////////" c = -c self.c1 = a # Steinhart-Hart coefficients self.c2 = b @@ -100,7 +97,7 @@ def main(argv): try: opts, args = getopt.getopt(argv, "h", ["help", "rp=", "t1=", "t2=", "t3=", "num-temps="]) except getopt.GetoptError as err: - print(str(err)) + print str(err) usage() sys.exit(2) @@ -132,27 +129,27 @@ def main(argv): up_bound = t.temp(1); min_temp = int(TMIN if TMIN > low_bound else low_bound) max_temp = int(TMAX if TMAX < up_bound else up_bound) - temps = list(range(max_temp, TMIN+step, step)); + temps = range(max_temp, TMIN+step, step); - print("// Thermistor lookup table for Marlin") - print("// ./createTemperatureLookupMarlin.py --rp=%s --t1=%s:%s --t2=%s:%s --t3=%s:%s --num-temps=%s" % (rp, t1, r1, t2, r2, t3, r3, num_temps)) - print("// Steinhart-Hart Coefficients: a=%.15g, b=%.15g, c=%.15g " % (t.c1, t.c2, t.c3)) - print("// Theoretical limits of thermistor: %.2f to %.2f degC" % (low_bound, up_bound)) - print() - print("const short temptable[][2] PROGMEM = {") + print "// Thermistor lookup table for Marlin" + print "// ./createTemperatureLookupMarlin.py --rp=%s --t1=%s:%s --t2=%s:%s --t3=%s:%s --num-temps=%s" % (rp, t1, r1, t2, r2, t3, r3, num_temps) + print "// Steinhart-Hart Coefficients: a=%.15g, b=%.15g, c=%.15g " % (t.c1, t.c2, t.c3) + print "// Theoretical limits of thermistor: %.2f to %.2f degC" % (low_bound, up_bound) + print + print "const short temptable[][2] PROGMEM = {" for temp in temps: adc = t.adc(temp) - print(" { OV(%7.2f), %4s }%s // v=%.3f\tr=%.3f\tres=%.3f degC/count" % (adc , temp, \ + print " { OV(%7.2f), %4s }%s // v=%.3f\tr=%.3f\tres=%.3f degC/count" % (adc , temp, \ ',' if temp != temps[-1] else ' ', \ t.voltage(adc), \ t.resist( adc), \ t.resol( adc) \ - )) - print("};") + ) + print "};" def usage(): - print(__doc__) + print __doc__ if __name__ == "__main__": main(sys.argv[1:]) diff --git a/buildroot/share/scripts/findMissingTranslations.sh b/buildroot/share/scripts/findMissingTranslations.sh index 0cf77366d2..c223d2a063 100755 --- a/buildroot/share/scripts/findMissingTranslations.sh +++ b/buildroot/share/scripts/findMissingTranslations.sh @@ -29,8 +29,8 @@ fi echo -n "Building list of missing strings..." -for i in $(awk '/Language_Str/{print $3}' language_en.h); do - [[ $i == "MSG_CUBED" ]] && continue +for i in $(awk '/#ifndef/{print $2}' language_en.h); do + [[ $i == "LANGUAGE_EN_H" || $i == "CHARSIZE" ]] && continue LANG_LIST="" for j in $TEST_LANGS; do [[ $(grep -c " ${i} " language_${j}.h) -eq 0 ]] && LANG_LIST="$LANG_LIST $j" diff --git a/buildroot/share/scripts/g29_auto.py b/buildroot/share/scripts/g29_auto.py index ffcb0d9f31..884e62b2a2 100755 --- a/buildroot/share/scripts/g29_auto.py +++ b/buildroot/share/scripts/g29_auto.py @@ -1,12 +1,10 @@ -#!/usr/bin/env python +#!/usr/bin/python3 # This file is for preprocessing gcode and the new G29 Autobedleveling from Marlin # It will analyse the first 2 Layer and return the maximum size for this part # After this it will replace with g29_keyword = ';MarlinG29Script' with the new G29 LRFB # the new file will be created in the same folder. -from __future__ import print_function - # your gcode-file/folder folder = './' my_file = 'test.gcode' diff --git a/buildroot/share/scripts/pinsformat.js b/buildroot/share/scripts/pinsformat.js deleted file mode 100755 index a82c2f2659..0000000000 --- a/buildroot/share/scripts/pinsformat.js +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env node - -// -// Formatter script for pins_MYPINS.h files -// -// Usage: mffmt [infile] [outfile] -// -// With no parameters convert STDIN to STDOUT -// - -const fs = require("fs"); - -// String lpad / rpad -String.prototype.lpad = function(len, chr) { - if (!len) return this; - if (chr === undefined) chr = ' '; - var s = this+'', need = len - s.length; - if (need > 0) s = new Array(need+1).join(chr) + s; - return s; -}; - -String.prototype.rpad = function(len, chr) { - if (!len) return this; - if (chr === undefined) chr = ' '; - var s = this+'', need = len - s.length; - if (need > 0) s += new Array(need+1).join(chr); - return s; -}; - -const mpatt = [ '-?\\d+', 'P[A-I]\\d+', 'P\\d_\\d+' ], - definePatt = new RegExp(`^\\s*(//)?#define\\s+[A-Z_][A-Z0-9_]+\\s+(${mpatt[0]}|${mpatt[1]}|${mpatt[2]})\\s*(//.*)?$`, 'gm'), - ppad = [ 3, 4, 5 ], - col_comment = 50, - col_value_rj = col_comment - 3; - -var mexpr = []; -for (let m of mpatt) mexpr.push(new RegExp('^' + m + '$')); - -const argv = process.argv.slice(2), argc = argv.length; - -var src_file = 0, src_name = 'STDIN', dst_file, do_log = false; -if (argc > 0) { - let ind = 0; - if (argv[0] == '-v') { do_log = true; ind++; } - dst_file = src_file = src_name = argv[ind++]; - if (ind < argc) dst_file = argv[ind]; -} - -// Read from file or STDIN until it terminates -const filtered = process_text(fs.readFileSync(src_file).toString()); -if (dst_file) - fs.writeFileSync(dst_file, filtered); -else - console.log(filtered); - -// Find the pin pattern so non-pin defines can be skipped -function get_pin_pattern(txt) { - var r, m = 0, match_count = [ 0, 0, 0 ]; - definePatt.lastIndex = 0; - while ((r = definePatt.exec(txt)) !== null) { - let ind = -1; - if (mexpr.some((p) => { - ind++; - const didmatch = r[2].match(p); - return r[2].match(p); - }) ) { - const m = ++match_count[ind]; - if (m >= 10) { - return { match: mpatt[ind], pad:ppad[ind] }; - } - } - } - return null; -} - -function process_text(txt) { - if (!txt.length) return '(no text)'; - const patt = get_pin_pattern(txt); - if (!patt) return txt; - const pindefPatt = new RegExp(`^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(${patt.match})\\s*(//.*)?$`), - noPinPatt = new RegExp(`^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(-1)\\s*(//.*)?$`), - skipPatt = new RegExp('^(\\s*(//)?#define)\\s+(AT90USB|USBCON|BOARD_.+|.+_MACHINE_NAME|.+_SERIAL)\\s+(.+)\\s*(//.*)?$'), - aliasPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([A-Z_][A-Z0-9_()]+)\\s*(//.*)?$'), - switchPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'), - undefPatt = new RegExp('^(\\s*(//)?#undef)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'), - defPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([-_\\w]+)\\s*(//.*)?$'), - condPatt = new RegExp('^(\\s*(//)?#(if|ifn?def|else|elif)(\\s+\\S+)*)\\s+(//.*)$'), - commPatt = new RegExp('^\\s{20,}(//.*)?$'); - const col_value_lj = col_comment - patt.pad - 2; - var r, out = '', check_comment_next = false; - txt.split('\n').forEach((line) => { - if (check_comment_next) - check_comment_next = ((r = commPatt.exec(line)) !== null); - - if (check_comment_next) - // Comments in column 45 - line = ''.rpad(col_comment) + r[1]; - - else if ((r = pindefPatt.exec(line)) !== null) { - // - // #define MY_PIN [pin] - // - if (do_log) console.log("pin:", line); - const pinnum = r[4].charAt(0) == 'P' ? r[4] : r[4].lpad(patt.pad); - line = r[1] + ' ' + r[3]; - line = line.rpad(col_value_lj) + pinnum; - if (r[5]) line = line.rpad(col_comment) + r[5]; - } - else if ((r = noPinPatt.exec(line)) !== null) { - // - // #define MY_PIN -1 - // - if (do_log) console.log("pin -1:", line); - line = r[1] + ' ' + r[3]; - line = line.rpad(col_value_lj) + '-1'; - if (r[5]) line = line.rpad(col_comment) + r[5]; - } - else if ((r = skipPatt.exec(line)) !== null) { - // - // #define SKIP_ME - // - if (do_log) console.log("skip:", line); - } - else if ((r = aliasPatt.exec(line)) !== null) { - // - // #define ALIAS OTHER - // - if (do_log) console.log("alias:", line); - line = r[1] + ' ' + r[3]; - line += r[4].lpad(col_value_rj + 1 - line.length); - if (r[5]) line = line.rpad(col_comment) + r[5]; - } - else if ((r = switchPatt.exec(line)) !== null) { - // - // #define SWITCH - // - if (do_log) console.log("switch:", line); - line = r[1] + ' ' + r[3]; - if (r[4]) line = line.rpad(col_comment) + r[4]; - check_comment_next = true; - } - else if ((r = defPatt.exec(line)) !== null) { - // - // #define ... - // - if (do_log) console.log("def:", line); - line = r[1] + ' ' + r[3] + ' '; - line += r[4].lpad(col_value_rj + 1 - line.length); - if (r[5]) line = line.rpad(col_comment - 1) + ' ' + r[5]; - } - else if ((r = undefPatt.exec(line)) !== null) { - // - // #undef ... - // - if (do_log) console.log("undef:", line); - line = r[1] + ' ' + r[3]; - if (r[4]) line = line.rpad(col_comment) + r[4]; - } - else if ((r = condPatt.exec(line)) !== null) { - // - // #if ... - // - if (do_log) console.log("cond:", line); - line = r[1].rpad(col_comment) + r[5]; - check_comment_next = true; - } - out += line + '\n'; - }); - return out.replace(/\n\n+/g, '\n\n').replace(/\n\n$/g, '\n'); -} diff --git a/buildroot/share/sublime/MarlinFirmware.sublime-project b/buildroot/share/sublime/MarlinFirmware.sublime-project index 9b5234f7a1..e4e362cd16 100644 --- a/buildroot/share/sublime/MarlinFirmware.sublime-project +++ b/buildroot/share/sublime/MarlinFirmware.sublime-project @@ -2,16 +2,6 @@ "folders": [ { - "folder_exclude_patterns": - [ - ".pio*", - "MarlinFirmware/lib", - "Marlin/lib", - "datatmp", - ".vscode" - ], - "binary_file_patterns": - [ "*.psd", "*.png", "*.jpg", "*.jpeg", "*.bdf", "*.patch", "avrdude_5.*", "*.svg" ], "file_exclude_patterns": [ "Marlin/platformio.ini", @@ -21,14 +11,17 @@ "Marlin/*/.travis.yml", "Marlin/*/.gitignore" ], + "folder_exclude_patterns": + [ + ".pio*", + "MarlinFirmware/lib", + "Marlin/lib", + "src/lib", + "datatmp", + "Marlin/*/src", + ".vscode" + ], "path": "../../.." } - ], - "settings": - { - "ensure_newline_at_eof_on_save": true, - "tab_size": 2, - "translate_tabs_to_spaces": true, - "trim_trailing_white_space_on_save": true - } + ] } diff --git a/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax b/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax index d1571e3ad8..ab1b499710 100644 --- a/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax +++ b/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax @@ -2,7 +2,6 @@ --- # # G-Code (RepRap, not ISO-6983) -# Author: @thinkyhead # # RapRap G-Code is very simple. # @@ -10,10 +9,10 @@ # name: G-Code (RepRap) file_extensions: - - [ g, gco, gcode ] + - [ gco, gcode ] scope: source.gcode variables: - decimal: '[+-]?\d+(\.\d*)?' + decimal: '[+-]?\d+(\.(\d+)?)?' contexts: prototype: @@ -25,11 +24,11 @@ contexts: pop: true main: - - meta_scope: line.gcode + - meta_content_scope: ctx.line.gcode - match: '([Nn]\s*(\d+))' captures: - 1: entity.nword.gcode + 1: ctx.gcode_line_num 2: constant.numeric.line-number.gcode - match: () @@ -40,7 +39,7 @@ contexts: - meta_content_scope: ctx.command.gcode # M20 S2 P/path/to/file/name.gco - - match: ([Mm](20))\s*((S)(2)\s*(P)) + - match: ([Mm](20))(\s*(S)(2)\s*(P)) captures: 1: entity.command.gcode markup.bold.gcode 2: constant.numeric.command.gcode @@ -50,15 +49,15 @@ contexts: 6: keyword.param.gcode set: gcode_string_arg - # M117 or M118 - Commands taking a string + # command followed by data - match: ([Mm]\s*(11[78]))\b captures: 1: entity.command.gcode markup.bold.gcode 2: constant.numeric.command.gcode set: gcode_string_arg - # Other commands, followed by data - - match: ([GMTgmt]\s*(\d+)((\.)(\d+))?) + # command followed by data + - match: '([GMTgmt]\s*(\d+)((\.)(\d+))?)' captures: 1: entity.command.gcode markup.bold.gcode 2: constant.numeric.command.gcode @@ -74,36 +73,16 @@ contexts: - meta_content_scope: ctx.params.gcode # M32 [S] [P] !/path/file.gco# - - match: \! - scope: punctuation.string.path.open.gcode + - match: '!' + scope: entity.string.filename.open push: gcode_path_arg # asterisk starts a checksum - match: \* - scope: punctuation.marker.checksum.gcode + scope: entity.checksum.gcode set: gcode_checksum - # parameter and single-quoted value - - match: ([A-Za-z])\s*(') - captures: - 1: keyword.param.gcode - 2: punctuation.quote.single.open.gcode - push: gcode_string_arg_quoted_single - - # parameter and double-quoted value - - match: ([A-Za-z])\s*(") - captures: - 1: keyword.param.gcode - 2: punctuation.quote.double.open.gcode - push: gcode_string_arg_quoted_double - - # parameter and list of values - - match: ([Ee])\s*(({{decimal}}\s*:\s*)+{{decimal}}) - captures: - 1: keyword.param.gcode - 2: constant.numeric.param.gcode - - # parameter and numeric value + # parameter and value - match: ([A-Za-z])\s*({{decimal}}) captures: 1: keyword.param.gcode @@ -117,67 +96,27 @@ contexts: - match: () set: syntax_error - gcode_string_arg_quoted_single: - - meta_content_scope: string.quoted.single.gcode - - - match: ([^'\\]+) - - - match: (\\) - scope: punctuation.string.escape.gcode - push: escape_char - - - match: (') - scope: punctuation.quote.single.close.gcode - pop: true - - - match: () - set: syntax_error - - gcode_string_arg_quoted_double: - - meta_content_scope: string.quoted.double.gcode - - - match: ([^"\\]+) - - - match: (\\) - scope: punctuation.string.escape.gcode - push: escape_char - - - match: (") - scope: punctuation.quote.double.close.gcode - pop: true - - - match: () - set: syntax_error - gcode_string_arg: - meta_content_scope: ctx.string.gcode - match: ([^;]+) scope: string.unquoted.gcode - escape_char: - - meta_scope: string.escape.gcode punctuation.string.escape.gcode - - - match: '.' - pop: true - gcode_path_arg: - - meta_content_scope: string.unquoted.path.gcode + - meta_content_scope: ctx.path.gcode + + - match: ([^#]+) + scope: string.unquoted.path.gcode - match: (#) - scope: punctuation.string.path.close.gcode + scope: entity.string.path.close.gcode pop: true gcode_checksum: - - meta_content_scope: constant.numeric.checksum.gcode - - meta_include_prototype: false + - meta_content_scope: ctx.checksum.gcode - match: \d+ - - - match: ( *)$ - pop: true - - - include: mixin_comment + scope: constant.numeric.checksum.gcode - match: () set: syntax_error @@ -190,30 +129,15 @@ contexts: # Comments begin with a ';' and finish at the end of the line. mixin_comment: - match: ^\s*; - scope: punctuation.comment.line.start + scope: punctuation.definition.comment.line.start set: gcode_comment - match: \s*; - scope: punctuation.comment.eol.start + scope: punctuation.definition.comment.eol.start set: gcode_comment - - match: \s*\( - scope: punctuation.paren.comment.open - push: gcode_comment_paren # Comment to end of line. gcode_comment: - - meta_content_scope: comment.gcode - - match: \s*$ - pop: true - - gcode_comment_paren: - - meta_content_scope: paren.comment.gcode - - - match: '[^)]+' - - - match: '[)]' - scope: punctuation.paren.comment.close - pop: true - + - meta_scope: comment.gcode - match: \s*$ pop: true diff --git a/buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode b/buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode deleted file mode 100644 index 643f271f1e..0000000000 --- a/buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode +++ /dev/null @@ -1,106 +0,0 @@ -; SYNTAX TEST "G-code.sublime-syntax" - -; This is a G-code comment -;^comment - -G1 X100 Y100 ; Move to 100,100 -;^entity.command.gcode -; ^keyword.param.gcode -; ^constant.numeric.param.gcode -; ^comment - -T0 (This is a comment) S12 -;^entity.command.gcode -; ^punctuation.paren.comment.open -; ^paren.comment.gcode -; ^punctuation.paren.comment.close -; ^keyword.param.gcode -; ^constant.numeric.param.gcode - -M20 P'/path/to/macro/macro.g' R12 -;<-entity.command.gcode -;^constant.numeric.command.gcode -; ^keyword.param.gcode -; ^punctuation.quote.single.open.gcode -; ^string.quoted.single.gcode -; ^punctuation.quote.single.close.gcode -; ^keyword.param.gcode -; ^constant.numeric.param.gcode - -M117 This is a message ; and comment -;<-entity.command.gcode -;^constant.numeric.command.gcode -; ^string.unquoted.gcode -; ^punctuation.comment.eol.start -; ^comment.gcode - -M118 This is a message ; and comment -;<-entity.command.gcode -;^constant.numeric.command.gcode -; ^string.unquoted.gcode -; ^punctuation.comment.eol.start -; ^comment.gcode - -M98 P'/path/to/macro/macro.g' R12 -;<-entity.command.gcode -;^constant.numeric.command.gcode -; ^keyword.param.gcode -; ^punctuation.quote.single.open.gcode -; ^string.quoted.single.gcode -; ^punctuation.quote.single.close.gcode - -M98 P"/path/to/macro/macro.g" R12 -;<-entity.command.gcode -;^constant.numeric.command.gcode -; ^keyword.param.gcode -; ^punctuation.quote.double.open.gcode -; ^string.quoted.double.gcode -; ^punctuation.quote.double.close.gcode - -M32 S100 P0 !/path/file.gco# -;<-entity.command.gcode -;^constant.numeric.command.gcode -; ^keyword.param.gcode -; ^constant.numeric.param.gcode -; ^punctuation.string.path.open.gcode -; ^string.unquoted.path.gcode -; ^punctuation.string.path.close.gcode - -G28 ; Home All -;<-entity.command.gcode -;^constant.numeric.command.gcode -; ^punctuation.comment.eol.start -; ^comment.gcode - -N123 G1 X5 Y0 *64 ; EOL Comment -;<-entity.nword.gcode -;^constant.numeric.line-number.gcode -; ^entity.command.gcode -; ^constant.numeric.command.gcode -; ^keyword.param.gcode -; ^constant.numeric.param.gcode -; ^punctuation.marker.checksum.gcode -; ^constant.numeric.checksum.gcode - -N234 G1 X-5 Y+2 *64 error -;<-entity.nword.gcode -;^constant.numeric.line-number.gcode -; ^entity.command.gcode -; ^constant.numeric.command.gcode -; ^keyword.param.gcode -; ^constant.numeric.param.gcode -; ^punctuation.marker.checksum.gcode -; ^constant.numeric.checksum.gcode -; ^invalid.error.syntax.gcode - -N234 M107 *64 -; ^-invalid.error.syntax.gcode - -M92 E304.5:304.5:420:420:420:420 ; EOL Comment -;<-entity.command.gcode -;^constant.numeric.command.gcode -; ^keyword.param.gcode -; ^constant.numeric.param.gcode -; ^constant.numeric.param.gcode -; ^punctuation.comment.eol.start -; ^comment.gcode diff --git a/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu b/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu index 60939d12e7..b1c34930b4 100644 --- a/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu +++ b/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu @@ -7,60 +7,60 @@ "caption": "PIO Build", "command": "webdevshell", "args": { - "command": "python buildroot/share/vscode/auto_build.py build" + "command": "python buildroot/share/atom/auto_build.py build" } }, { "caption": "PIO Clean", "command": "webdevshell", "args": { - "command": "python buildroot/share/vscode/auto_build.py clean" + "command": "python buildroot/share/atom/auto_build.py clean" } }, { "caption": "PIO Upload", "command": "webdevshell", "args": { - "command": "python buildroot/share/vscode/auto_build.py upload" + "command": "python buildroot/share/atom/auto_build.py upload" } }, { "caption": "PIO Upload (traceback)", "command": "webdevshell", "args": { - "command": "python buildroot/share/vscode/auto_build.py traceback" + "command": "python buildroot/share/atom/auto_build.py traceback" } }, { "caption": "PIO Upload using Programmer", "command": "webdevshell", "args": { - "command": "python buildroot/share/vscode/auto_build.py program" + "command": "python buildroot/share/atom/auto_build.py program" } }, { "caption": "PIO Test", "command": "webdevshell", "args": { - "command": "python buildroot/share/vscode/auto_build.py test" + "command": "python buildroot/share/atom/auto_build.py test" } }, { "caption": "PIO Debug", "command": "webdevshell", "args": { - "command": "python buildroot/share/vscode/auto_build.py debug" + "command": "python buildroot/share/atom/auto_build.py debug" } }, { "caption": "PIO Remote", "command": "webdevshell", "args": { - "command": "python buildroot/share/vscode/auto_build.py remote" + "command": "python buildroot/share/atom/auto_build.py remote" } } ], "id": "AutoBuild", "mnemonic": "A" } -] +] \ No newline at end of file diff --git a/buildroot/share/tests/DUE_tests b/buildroot/share/tests/DUE_tests new file mode 100755 index 0000000000..100cdd570b --- /dev/null +++ b/buildroot/share/tests/DUE_tests @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_RAMPS4DUE_EFB +opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS +opt_set E0_AUTO_FAN_PIN 8 +opt_set EXTRUDER_AUTO_FAN_SPEED 100 +exec_test $1 $2 "RAMPS4DUE_EFB S_CURVE_ACCELERATION EEPROM_SETTINGS" diff --git a/buildroot/share/tests/LPC1768_tests b/buildroot/share/tests/LPC1768_tests new file mode 100755 index 0000000000..b9f1e0cf45 --- /dev/null +++ b/buildroot/share/tests/LPC1768_tests @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB +exec_test $1 $2 "Build Re-ARM Default Configuration" + +restore_configs +opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB +opt_enable VIKI2 SDSUPPORT +exec_test $1 $2 "ReARM EFB VIKI2 and SDSUPPORT" + +restore_configs +use_example_configs Mks/Sbase +exec_test $1 $2 "MKS SBASE Example Config" + +restore_configs +use_example_configs Azteeg/X5GT +exec_test $1 $2 "Azteeg X5GT Example Config" + +restore_configs +opt_set MOTHERBOARD BOARD_MKS_SBASE +opt_set EXTRUDERS 2 +opt_enable NUM_SERVOS +opt_set NUM_SERVOS 1 +opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER +exec_test $1 $2 "MKS_SBASE SWITCHING_EXTRUDER" + +restore_configs +opt_set MOTHERBOARD BOARD_MKS_SBASE +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_0 1 +opt_set TEMP_SENSOR_1 5 +opt_set TEMP_SENSOR_BED 1 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT +opt_enable FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY +opt_enable FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE +opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY +opt_enable PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT +opt_enable_adv ADVANCED_PAUSE_FEATURE LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA PARK_HEAD_ON_PAUSE +opt_set GRID_MAX_POINTS_X 16 +exec_test $1 $2 "MKS SBASE Many Features" + +restore_configs +opt_set MOTHERBOARD BOARD_MKS_SBASE +opt_enable COREYX +opt_set_adv FAN_MIN_PWM 50 +opt_set_adv FAN_KICKSTART_TIME 100 +opt_set_adv XY_FREQUENCY_LIMIT 15 +opt_enable_adv SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER FAN_KICKSTART_TIME +opt_enable_adv ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED ADVANCED_OK +opt_enable_adv VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS ACTION_ON_KILL +opt_enable_adv EXTRA_FAN_SPEED FWERETRACT Z_DUAL_STEPPER_DRIVERS Z_DUAL_ENDSTOPS +opt_enable_adv MENU_ADDAUTOSTART SDCARD_SORT_ALPHA +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER BABYSTEPPING DAC_MOTOR_CURRENT_DEFAULT +opt_enable FILAMENT_LCD_DISPLAY FILAMENT_WIDTH_SENSOR +opt_enable FAN_SOFT_PWM SDSUPPORT +opt_enable USE_XMAX_PLUG +exec_test $1 $2 "MKS SBASE Many less common options" + +#clean up +restore_configs diff --git a/buildroot/share/tests/STM32F1_tests b/buildroot/share/tests/STM32F1_tests new file mode 100755 index 0000000000..0d1fd90991 --- /dev/null +++ b/buildroot/share/tests/STM32F1_tests @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_STM32F1R +opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT +exec_test $1 $2 "STM32F1R EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT" + +#cleanup +restore_configs diff --git a/buildroot/share/tests/megaatmega2560_tests b/buildroot/share/tests/megaatmega2560_tests new file mode 100755 index 0000000000..d4857670d5 --- /dev/null +++ b/buildroot/share/tests/megaatmega2560_tests @@ -0,0 +1,320 @@ +#!/usr/bin/env bash + +# exit on first failure +set -e + +# +# Backup pins_RAMPS.h +# +cp Marlin/src/pins/pins_RAMPS.h Marlin/src/pins/pins_RAMPS.h.backup +# +# Build with the default configurations +# +restore_configs +exec_test $1 $2 "Default Configuration" +# +# Test 2 extruders (one MAX6675) and heated bed on basic RAMPS 1.4 +# Test a "Fix Mounted" Probe with Safe Homing, some arc options, +# linear bed leveling, M48, leveling debug, and firmware retraction. +# +opt_set MOTHERBOARD BOARD_RAMPS_14_EEB +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_0 -2 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_BED 1 +opt_set POWER_SUPPLY 1 +opt_enable PIDTEMPBED FIX_MOUNTED_PROBE Z_SAFE_HOMING +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS PINS_DEBUGGING +opt_enable BLINKM PCA9632 RGB_LED NEOPIXEL_LED AUTO_POWER_CONTROL NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR +opt_enable AUTO_BED_LEVELING_LINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE +opt_enable_adv ARC_P_CIRCLES ADVANCED_PAUSE_FEATURE CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS POWER_LOSS_RECOVERY POWER_LOSS_PIN POWER_LOSS_STATE +opt_enable_adv FWRETRACT MAX7219_DEBUG LED_CONTROL_MENU CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CODEPENDENT_XY_HOMING +opt_set GRID_MAX_POINTS_X 16 +opt_set_adv FANMUX0_PIN 53 +exec_test $1 $2 "Extruders(2) MAX6675 Fixed Probe etc" +# +# Test a probeless build of AUTO_BED_LEVELING_UBL, with lots of extruders +# +restore_configs +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO +opt_set EXTRUDERS 5 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_2 5 +opt_set TEMP_SENSOR_3 20 +opt_set TEMP_SENSOR_4 999 +opt_set TEMP_SENSOR_BED 1 +opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_EDITING ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION +opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT +opt_enable_adv SDCARD_SORT_ALPHA STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES LIGHTWEIGHT_UI +opt_enable_adv CUSTOM_USER_MENUS I2C_POSITION_ENCODERS BABYSTEPPING BABYSTEP_XY LIN_ADVANCE NANODLP_Z_SYNC QUICK_HOME JUNCTION_DEVIATION +exec_test $1 $2 "Probeless build of AUTO_BED_LEVELING_UBL, with lots of extruders" +# +# Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language +# +opt_enable Z_PROBE_SLED SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE +opt_set LCD_LANGUAGE jp-kana +opt_disable SEGMENT_LEVELED_MOVES +opt_enable_adv BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING +exec_test $1 $2 "Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language" +# +# Test a Servo Probe +# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES +# +restore_configs +opt_enable NUM_SERVOS Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE +opt_set NUM_SERVOS 1 +opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT +opt_enable_adv NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET +exec_test $1 $2 "Servo Probe with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS etc" +# +# Test MESH_BED_LEVELING feature, with LCD +# +restore_configs +opt_enable MESH_BED_LEVELING G26_MESH_EDITING MESH_G28_REST_ORIGIN LCD_BED_LEVELING ULTIMAKERCONTROLLER +exec_test $1 $2 "MESH_BED_LEVELING feature, with LCD" +# +# Test MINIRAMBO for PWM_MOTOR_CURRENT +# PROBE_MANUALLY feature, with LCD support, +# ULTIMAKERCONTROLLER, FILAMENT_LCD_DISPLAY, FILAMENT_WIDTH_SENSOR, +# PRINTCOUNTER, NOZZLE_PARK_FEATURE, NOZZLE_CLEAN_FEATURE, PCA9632, +# Z_DUAL_ENDSTOPS, BEZIER_CURVE_SUPPORT, EXPERIMENTAL_I2CBUS, +# ADVANCED_PAUSE_FEATURE, ADVANCED_PAUSE_CONTINUOUS_PURGE, PARK_HEAD_ON_PAUSE, LCD_INFO_MENU, +# EEPROM_SETTINGS, EEPROM_CHITCHAT, M100_FREE_MEMORY_WATCHER, +# INCH_MODE_SUPPORT, TEMPERATURE_UNITS_SUPPORT +# +restore_configs +opt_set MOTHERBOARD BOARD_MINIRAMBO +opt_enable PROBE_MANUALLY AUTO_BED_LEVELING_BILINEAR G26_MESH_EDITING LCD_BED_LEVELING ULTIMAKERCONTROLLER +opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT M100_FREE_MEMORY_WATCHER M100_FREE_MEMORY_DUMPER M100_FREE_MEMORY_CORRUPTOR INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT +opt_enable ULTIMAKERCONTROLLER SDSUPPORT +opt_enable PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE PCA9632 +opt_enable_adv BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS +opt_enable_adv ADVANCED_PAUSE_FEATURE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES PARK_HEAD_ON_PAUSE LCD_INFO_MENU M114_DETAIL +opt_set_adv PWM_MOTOR_CURRENT {1300,1300,1250} +opt_set_adv I2C_SLAVE_ADDRESS 63 +exec_test $1 $2 "MINIRAMBO for PWM_MOTOR_CURRENT etc" +# +# Mixing Extruder with 5 steppers, Cyrillic +# +restore_configs +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO +opt_enable MIXING_EXTRUDER CR10_STOCKDISPLAY +opt_set MIXING_STEPPERS 5 +opt_set LCD_LANGUAGE ru +exec_test $1 $2 "Mixing Extruder with 5 steppers, Cyrillic" +# +# Test DUAL_X_CARRIAGE +# +restore_configs +opt_set MOTHERBOARD BOARD_RUMBA +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 1 +opt_enable USE_XMAX_PLUG +opt_enable_adv DUAL_X_CARRIAGE +exec_test $1 $2 "DUAL_X_CARRIAGE" +# +# Test SPEAKER with BOARD_BQ_ZUM_MEGA_3D and BQ_LCD_SMART_CONTROLLER +# +#restore_configs +#opt_set MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D +#opt_set LCD_FEEDBACK_FREQUENCY_DURATION_MS 10 +#opt_set LCD_FEEDBACK_FREQUENCY_HZ 100 +#opt_enable BQ_LCD_SMART_CONTROLLER SPEAKER +# +# Test SWITCHING_EXTRUDER +# +restore_configs +opt_set MOTHERBOARD BOARD_RUMBA +opt_set EXTRUDERS 2 +opt_enable NUM_SERVOS +opt_set NUM_SERVOS 1 +opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER +exec_test $1 $2 "SWITCHING_EXTRUDER" +# +# Enable COREXY +# +#restore_configs +#opt_enable COREXY +#exec_test $1 $2 "Stuff" +# +# Test many less common options +# +restore_configs +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO +opt_enable COREYX +opt_set_adv FAN_MIN_PWM 50 +opt_set_adv FAN_KICKSTART_TIME 100 +opt_set_adv XY_FREQUENCY_LIMIT 15 +opt_enable_adv SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER FAN_KICKSTART_TIME +opt_enable_adv ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED ADVANCED_OK +opt_enable_adv VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS ACTION_ON_KILL +opt_enable_adv EXTRA_FAN_SPEED FWERETRACT Z_DUAL_STEPPER_DRIVERS Z_DUAL_ENDSTOPS +opt_enable_adv MENU_ADDAUTOSTART SDCARD_SORT_ALPHA +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER BABYSTEPPING DAC_MOTOR_CURRENT_DEFAULT +opt_enable FILAMENT_LCD_DISPLAY FILAMENT_WIDTH_SENSOR +opt_enable ENDSTOP_INTERRUPTS_FEATURE FAN_SOFT_PWM SDSUPPORT +opt_enable USE_XMAX_PLUG +opt_enable SWITCHING_TOOLHEAD NUM_SERVOS DEBUG_LEVELING_FEATURE +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 -4 +opt_set SERVO_DELAY "{ 300, 300, 300 }" +exec_test $1 $2 "Many less common options" +# +######## Other Standard LCD/Panels ############## +# +# ULTRA_LCD +# +#restore_configs +#opt_enable ULTRA_LCD +#exec_test $1 $2 "Stuff" +# +# DOGLCD +# +#restore_configs +#opt_enable DOGLCD +#exec_test $1 $2 "Stuff" +# +# MAKRPANEL +# Needs to use Melzi and Sanguino hardware +# +#restore_configs +#opt_enable MAKRPANEL +#exec_test $1 $2 "Stuff" +# +# REPRAP_DISCOUNT_SMART_CONTROLLER, SDSUPPORT, BABYSTEPPING, RIGIDBOARD_V2, and DAC_MOTOR_CURRENT_DEFAULT +# +#restore_configs +#opt_set MOTHERBOARD BOARD_RIGIDBOARD_V2 +#opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT BABYSTEPPING DAC_MOTOR_CURRENT_DEFAULT +#exec_test $1 $2 "Stuff" +# # +# G3D_PANEL with SDCARD_SORT_ALPHA and STATUS_MESSAGE_SCROLLING +# +#restore_configs +#opt_enable G3D_PANEL SDSUPPORT +#opt_enable_adv SDCARD_SORT_ALPHA STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES +#opt_set_adv SDSORT_GCODE true +#opt_set_adv SDSORT_USES_RAM true +#opt_set_adv SDSORT_USES_STACK true +#opt_set_adv SDSORT_CACHE_NAMES true +#exec_test $1 $2 "Stuff" +# +# Test a full-featured CR-10S config +# +use_example_configs Creality/CR-10S +opt_enable SHOW_CUSTOM_BOOTSCREEN +exec_test $1 $2 "Full-featured CR-10S config" +# +# REPRAPWORLD_KEYPAD +# +# Cant find configuration details to get it to compile +#restore_configs +#opt_enable ULTRA_LCD REPRAPWORLD_KEYPAD REPRAPWORLD_KEYPAD_MOVE_STEP +#exec_test $1 $2 "Stuff" +# +# RA_CONTROL_PANEL +# +#restore_configs +#opt_enable RA_CONTROL_PANEL PINS_DEBUGGING +#exec_test $1 $2 "Stuff" +# +######## I2C LCD/PANELS ############## +# +# !!!ATTENTION!!! +# Most I2C configurations are failing at the moment because they require +# a different Liquid Crystal library "LiquidTWI2". +# +# LCD_SAINSMART_I2C_1602 +# +#restore_configs +#opt_enable LCD_SAINSMART_I2C_1602 +#exec_test $1 $2 "Stuff" +# +# LCD_I2C_PANELOLU2 +# +#restore_configs +#opt_enable LCD_I2C_PANELOLU2 +#exec_test $1 $2 "Stuff" +# +# LCD_I2C_VIKI +# +#restore_configs +#opt_enable LCD_I2C_VIKI +#exec_test $1 $2 "Stuff" +# +# LCM1602 +# +#restore_configs +#opt_enable LCM1602 +#exec_test $1 $2 "Stuff" +# +# Language files test with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +# +#restore_configs +#opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT +#for lang in an bg ca zh_CN zh_TW cz da de el el-gr en es eu fi fr gl hr it jp-kana nl pl pt pt-br ru sk tr uk test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done +# +#restore_configs +#opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT +#for lang in an bg ca zh_CN zh_TW cz da de el el-gr en es eu fi fr gl hr it jp-kana nl pl pt pt-br ru sk tr uk test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done +# +# +######## Example Configurations ############## +# +# BQ Hephestos 2 +#restore_configs +#use_example_configs Hephestos_2 +#exec_test $1 $2 "Stuff" +# +# Delta Config (generic) + ABL bilinear + PROBE_MANUALLY +use_example_configs delta/generic +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_CALIBRATION_MENU AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY +exec_test $1 $2 "Delta Config (generic) + ABL bilinear + PROBE_MANUALLY" +# +# Delta Config (generic) + UBL + ALLEN_KEY + OLED_PANEL_TINYBOY2 + EEPROM_SETTINGS +# +use_example_configs delta/generic +opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 Z_PROBE_ALLEN_KEY EEPROM_SETTINGS EEPROM_CHITCHAT +opt_enable OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY +exec_test $1 $2 "Delta Config (generic) + UBL + ALLEN_KEY + OLED_PANEL_TINYBOY2 + EEPROM_SETTINGS" +# +# Delta Config (FLSUN AC because it's complex) +# +use_example_configs delta/FLSUN/auto_calibrate +exec_test $1 $2 "Delta Config (FLSUN AC because it's complex)" +# +# Makibox Config need to check board type for Teensy++ 2.0 +# +#use_example_configs makibox +#exec_test $1 $2 "Stuff" +# +# SCARA with TMC2130 +# +use_example_configs SCARA +opt_enable AUTO_BED_LEVELING_BILINEAR FIX_MOUNTED_PROBE USE_ZMIN_PLUG EEPROM_SETTINGS EEPROM_CHITCHAT ULTIMAKERCONTROLLER +opt_set X_DRIVER_TYPE TMC2130 +opt_set Y_DRIVER_TYPE TMC2130 +opt_set Z_DRIVER_TYPE TMC2130 +opt_set E0_DRIVER_TYPE TMC2130 +opt_enable_adv MONITOR_DRIVER_STATUS STEALTHCHOP HYBRID_THRESHOLD SENSORLESS_HOMING +exec_test $1 $2 "SCARA with TMC2130" +# +# TMC2208 Config +# +restore_configs +opt_set X_DRIVER_TYPE TMC2208 +opt_set Y_DRIVER_TYPE TMC2208 +opt_set Z_DRIVER_TYPE TMC2208 +opt_set E0_DRIVER_TYPE TMC2208 +opt_enable_adv MONITOR_DRIVER_STATUS STEALTHCHOP HYBRID_THRESHOLD TMC_DEBUG +exec_test $1 $2 "TMC2208 Config" +# +# tvrrug Config need to check board type for sanguino atmega644p +# +#use_example_configs tvrrug/Round2 +#exec_test $1 $2 "Stuff" +# +# + +#clean up +restore_configs diff --git a/buildroot/share/tests/start_tests b/buildroot/share/tests/start_tests new file mode 100755 index 0000000000..53c24f44d8 --- /dev/null +++ b/buildroot/share/tests/start_tests @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +export PATH="$PATH:$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )" +export PATH="$PATH:./buildroot/bin" + +# exit on first failure +set -e + +exec_test () { + printf "\033[0;32m[Test $2] \033[0m$3... " + if build_marlin_pio $1 "-e $2"; then + printf "\033[0;32mPassed\033[0m\n" + return 0 + else + env_restore + printf "\033[0;31mFailed!\033[0m\n" + return 1 + fi +} +export -f exec_test + +env_backup +printf "Running \033[0;32m$2\033[0m Tests\n" + +if [[ $3 = "--deep-clean" ]]; then + echo "Deleting all PlatformIO caches, downloads and installed packages..." + env_clean --deep +fi + +if [[ $2 = "ALL" ]]; then + dir_list=("$(dirname "${BASH_SOURCE[0]}")"/*) + declare -a tests=(${dir_list[@]/*start_tests/}) + for f in "${tests[@]}"; do + testenv=$(basename $f | cut -d"_" -f1) + printf "Running \033[0;32m$f\033[0m Tests\n" + exec_test $1 "$testenv --target clean" "Setup Build Environment" + $f $1 $testenv + done +else + exec_test $1 "$2 --target clean" "Setup Build Environment" + $2_tests $1 $2 +fi +printf "\033[0;32mAll tests completed successfully\033[0m\n" +env_restore diff --git a/buildroot/share/tests/teensy35_tests b/buildroot/share/tests/teensy35_tests new file mode 100755 index 0000000000..0adb977cbc --- /dev/null +++ b/buildroot/share/tests/teensy35_tests @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY35_36 +cp Marlin/src/pins/pins_RAMPS.h Marlin/src/pins/pins_RAMPS.h.backup +# +# Test Teensy3.5 with default config +# +exec_test $1 $2 "Teensy3.5 with default config" +# +# Test as many features together as possible +# +restore_configs +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_0 1 +opt_set TEMP_SENSOR_1 5 +opt_set TEMP_SENSOR_BED 1 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT +opt_enable FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY +opt_enable FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE +opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY +opt_enable PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER +opt_enable_adv ADVANCED_PAUSE_FEATURE LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA PARK_HEAD_ON_PAUSE +opt_set_adv I2C_SLAVE_ADDRESS 63 +opt_set GRID_MAX_POINTS_X 16 +exec_test $1 $2 "As many features together as possible" +# +# Test a Sled Z Probe with Linear leveling +# +restore_configs +opt_enable Z_PROBE_SLED +opt_enable AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE EEPROM_SETTINGS +exec_test $1 $2 "Sled Z Probe with Linear leveling" +# +# Test a Servo Probe +# +# restore_configs +# opt_enable NUM_SERVOS Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE +# opt_set NUM_SERVOS 1 +# opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS +# exec_test $1 $2 "Servo Probe" +# +# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES +# +# opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS +# opt_enable_adv EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES +# exec_test $1 $2 "...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES" +# +# Test MESH_BED_LEVELING feature, with LCD +# +restore_configs +opt_enable MESH_BED_LEVELING MESH_G28_REST_ORIGIN MANUAL_BED_LEVELING ULTIMAKERCONTROLLER +exec_test $1 $2 "MESH_BED_LEVELING feature, with LCD" +# +# Mixing Extruder +# +restore_configs +opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 +opt_set MIXING_STEPPERS 2 +exec_test $1 $2 "Mixing Extruder" +# +# Test SWITCHING_EXTRUDER +# +# restore_configs +# opt_set EXTRUDERS 2 +# opt_enable NUM_SERVOS +# opt_set NUM_SERVOS 1 +# opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER +# exec_test $1 $2 "SWITCHING_EXTRUDER" +# +# Enable COREXY +# +restore_configs +opt_enable COREXY +exec_test $1 $2 "COREXY" +# +# Enable COREXZ +# +restore_configs +opt_enable COREXZ +exec_test $1 $2 "COREXZ" +# +# Enable Z_DUAL_STEPPER_DRIVERS, Z_DUAL_ENDSTOPS +# +restore_configs +opt_enable_adv Z_DUAL_STEPPER_DRIVERS Z_DUAL_ENDSTOPS +pins_set RAMPS X_MAX_PIN -1 +opt_add_adv Z2_MAX_PIN 2 +opt_enable USE_XMAX_PLUG +exec_test $1 $2 "Z_DUAL_STEPPER_DRIVERS, Z_DUAL_ENDSTOPS" + +#cleanup +restore_configs diff --git a/buildroot/share/vscode/AutoBuildMarlin/.gitignore b/buildroot/share/vscode/AutoBuildMarlin/.gitignore new file mode 100644 index 0000000000..5df8049bff --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/.gitignore @@ -0,0 +1,2 @@ +out +node_modules diff --git a/buildroot/share/vscode/AutoBuildMarlin/.vscodeignore b/buildroot/share/vscode/AutoBuildMarlin/.vscodeignore new file mode 100644 index 0000000000..5ff3c19320 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/.vscodeignore @@ -0,0 +1,9 @@ +.vscode/** +.vscode-test/** +out/test/** +test/** +src/** +**/*.map +.gitignore +tsconfig.json +vsc-extension-quickstart.md diff --git a/buildroot/share/vscode/AutoBuildMarlin/README.md b/buildroot/share/vscode/AutoBuildMarlin/README.md new file mode 100644 index 0000000000..e3e9323f52 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/README.md @@ -0,0 +1,52 @@ +# Auto Build support for Visual Studio Code +This `Visual Studio Code` extension provides access to the `Auto Build` script. + +## Installation + +Get the MarlinFirmware repository from GitHub. Open the directory `buildroot/share/vscode` and copy the `AutoBuildMarlin` folder to the `Visual Studio Code` extension directory. Relaunch `Visual Studio Code` to complete the installation. + +To find the `Visual Studio Code` extension directory: + +- Windows - Use Windows Explorer's address bar to open `C:/Users/USERNAME/.vscode/extensions`. +- Mac - Use the Finder's `Go` menu to open `~/.vscode/extensions`. +- Linux - In the Terminal type `open ~/.vscode/extensions`. + +### 3. Install the PlatformIO extension +Click on `View` > `Command Palette...` + +![](./resources/view_command_palette.png) + +Find and click on `Extensions: Install Extensions` + +![](./resources/install_extensions.png) + +Type `platformio` into the search box and click on `Install` under `PlatformIO IDE`. + +![](./resources/platformio_install.png) + +## Usage + +This extension adds the Auto Build icon ![](./media/AB.svg) to the Activities bar. + +### 1. Open the Marlin folder +Click on `File` > `Open Folder...` + +![](./resources/Open_Folder.png) + +This brings up the `Open Folder` dialog. Select the folder that has the `platformio.ini` file in it. + +![](./resources/Open_Marlin.png) + +You should see something like the following. If not, click on the Explorer icon in the Activities bar. + +![](./resources/Activity_bar.png) + +### 2. Click on the Auto Build Icon ![](./media/AB.svg) +This brings up the Auto Build menu icon bar. +![](./resources/AB_menu.png) + +### 3. Click on one of the four icons +- ![](./resources/B_small.svg) - Clicking on it starts `PIO Build` +- ![](./resources/C_small.svg) - Clicking on it starts `PIO Clean` +- ![](./resources/U_small.svg) - Clicking on it starts `PIO Upload` +- ![](./resources/Ut_small.svg) - Clicking on it starts `PIO Upload (traceback)` diff --git a/buildroot/share/vscode/AutoBuildMarlin/extension.js b/buildroot/share/vscode/AutoBuildMarlin/extension.js new file mode 100644 index 0000000000..8277517955 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/extension.js @@ -0,0 +1,37 @@ +'use strict'; + +var vscode = require('vscode'); + +function activate(context) { + + console.log('Extension "AutoBuildMarlin" is now active!'); + + var NEXT_TERM_ID = 1; + var pio_build = vscode.commands.registerCommand('piobuild', function () { + const terminal = vscode.window.createTerminal(`#${NEXT_TERM_ID++}`); + terminal.sendText("python buildroot/share/atom/auto_build.py build"); + }); + var pio_clean = vscode.commands.registerCommand('pioclean', function () { + const terminal = vscode.window.createTerminal(`#${NEXT_TERM_ID++}`); + terminal.sendText("python buildroot/share/atom/auto_build.py clean"); + }); + var pio_upload = vscode.commands.registerCommand('pioupload', function () { + const terminal = vscode.window.createTerminal(`#${NEXT_TERM_ID++}`); + terminal.sendText("python buildroot/share/atom/auto_build.py upload"); + }); + var pio_traceback = vscode.commands.registerCommand('piotraceback', function () { + const terminal = vscode.window.createTerminal(`#${NEXT_TERM_ID++}`); + terminal.sendText("python buildroot/share/atom/auto_build.py traceback"); + }); + + context.subscriptions.push(pio_build); + context.subscriptions.push(pio_clean); + context.subscriptions.push(pio_upload); + context.subscriptions.push(pio_traceback); +} +exports.activate = activate; + +// this method is called when your extension is deactivated +function deactivate() { +} +exports.deactivate = deactivate; diff --git a/buildroot/share/vscode/AutoBuildMarlin/media/AB.svg b/buildroot/share/vscode/AutoBuildMarlin/media/AB.svg new file mode 100644 index 0000000000..ac6dbb8a9a --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/media/AB.svg @@ -0,0 +1,12 @@ + + + VScode view icon + + Layer 2 + AB + + + Layer 1 + + + \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/package-lock.json b/buildroot/share/vscode/AutoBuildMarlin/package-lock.json new file mode 100644 index 0000000000..6933834984 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/package-lock.json @@ -0,0 +1,3323 @@ +{ + "name": "auto-build", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", + "dev": true + }, + "@types/node": { + "version": "7.0.65", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.65.tgz", + "integrity": "sha512-iUdyWWikcQnGvIZnYh5ZxnxeREykndA9+iGdo068NGNutibWknDjmmNMq/8cnS1eaTCcgqJsPsFppw3XJWNlUg==", + "dev": true + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "block-stream": { + "version": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "gulp-remote-src-vscode": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", + "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "node.extend": "1.1.6", + "request": "2.85.0", + "through2": "2.0.3", + "vinyl": "2.1.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.6" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "event-stream": { + "version": "3.3.4", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "node.extend": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true, + "requires": { + "is": "3.2.1" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + }, + "dependencies": { + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "0.1.1", + "ansi-red": "0.1.1", + "arr-diff": "1.1.0", + "arr-union": "2.1.0", + "extend-shallow": "1.1.4" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-slice": "0.2.3" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + } + } + }, + "querystringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tslib": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz", + "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==", + "dev": true + }, + "tslint": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", + "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.4.1", + "commander": "2.15.1", + "diff": "3.5.0", + "glob": "7.1.2", + "js-yaml": "3.12.0", + "minimatch": "3.0.4", + "resolve": "1.7.1", + "semver": "5.5.0", + "tslib": "1.9.2", + "tsutils": "2.27.1" + } + }, + "tsutils": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.1.tgz", + "integrity": "sha512-AE/7uzp32MmaHvNNFES85hhUDHFdFZp6OAiZcd6y4ZKKIg6orJTm8keYWBhIhrJQH3a4LzNKat7ZPXZt5aTf6w==", + "dev": true, + "requires": { + "tslib": "1.9.2" + } + }, + "typescript": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz", + "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==", + "dev": true + }, + "url-parse": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.0.tgz", + "integrity": "sha512-ERuGxDiQ6Xw/agN4tuoCRbmwRuZP0cJ1lJxJubXr5Q/5cDa78+Dc4wfvtxzhzhkm5VvmW6Mf8EVj9SPGN4l8Lg==", + "dev": true, + "requires": { + "querystringify": "2.0.0", + "requires-port": "1.0.0" + } + }, + "vscode": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.17.tgz", + "integrity": "sha512-yNMyrgEua2qyW7+trNNYhA6PeldRrBcwtLtlazkdtzcmkHMKECM/08bPF8HF2ZFuwHgD+8FQsdqd/DvJYQYjJg==", + "dev": true, + "requires": { + "glob": "7.1.2", + "gulp-chmod": "2.0.0", + "gulp-filter": "5.1.0", + "gulp-gunzip": "1.0.0", + "gulp-remote-src-vscode": "0.5.0", + "gulp-symdest": "1.1.0", + "gulp-untar": "0.0.6", + "gulp-vinyl-zip": "2.1.0", + "mocha": "4.1.0", + "request": "2.85.0", + "semver": "5.5.0", + "source-map-support": "0.5.5", + "url-parse": "1.4.0", + "vinyl-source-stream": "1.1.2" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.6" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", + "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "duplexify": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "event-stream": { + "version": "3.3.4", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "0.1.1", + "color-support": "1.1.3", + "time-stamp": "1.1.0" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", + "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "gulp-chmod": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", + "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", + "dev": true, + "requires": { + "deep-assign": "1.0.0", + "stat-mode": "0.2.2", + "through2": "2.0.3" + } + }, + "gulp-filter": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", + "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", + "dev": true, + "requires": { + "multimatch": "2.1.0", + "plugin-error": "0.1.2", + "streamfilter": "1.0.7" + } + }, + "gulp-gunzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", + "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", + "dev": true, + "requires": { + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-symdest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", + "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "mkdirp": "0.5.1", + "queue": "3.1.0", + "vinyl-fs": "2.4.4" + } + }, + "gulp-untar": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz", + "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "gulp-util": "3.0.8", + "streamifier": "0.1.1", + "tar": "2.2.1", + "through2": "2.0.3" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.2", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-vinyl-zip": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", + "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "queue": "4.4.2", + "through2": "2.0.3", + "vinyl": "2.1.0", + "vinyl-fs": "2.4.4", + "yauzl": "2.9.1", + "yazl": "2.4.3" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "queue": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", + "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.1" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.6" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "queue": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", + "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz", + "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "source-map": "0.6.1" + } + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamfilter": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", + "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "streamifier": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", + "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "strip-bom": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "requires": { + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "3.5.4", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.6", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.4", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "vinyl-source-stream": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", + "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", + "dev": true, + "requires": { + "through2": "2.0.3", + "vinyl": "0.4.6" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + }, + "yazl": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", + "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13" + } + } + } + } + } +} diff --git a/buildroot/share/vscode/AutoBuildMarlin/package.json b/buildroot/share/vscode/AutoBuildMarlin/package.json new file mode 100644 index 0000000000..3bff1098d7 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/package.json @@ -0,0 +1,96 @@ +{ + "name": "auto-build", + "displayName": "Auto Build Marlin", + "description": "Auto Build Marlin for VS code", + "version": "0.1.0", + "publisher": "marlinfirmware", + "engines": { + "vscode": "^1.23.0" + }, + "enableProposedApi": true, + "categories": [ + "Other" + ], + "activationEvents": [ + "onCommand:piobuild", + "onCommand:pioclean", + "onCommand:pioupload", + "onCommand:piotraceback" + ], + "main": "./extension", + "contributes": { + "viewsContainers": { + "activitybar": [ + { + "id": "auto-build", + "title": "Auto Build Marlin", + "icon": "media/AB.svg" + } + ] + }, + "views": { + "auto-build": [ + { + "id": "autobuild", + "name": " " + } + ] + }, + "commands": [ + { + "command": "piobuild", + "title": "PIO Build", + "icon": "resources/B32x32_white.svg" + }, + { + "command": "pioclean", + "title": "PIO Clean", + "icon": "resources/C32x32_white.svg" + }, + { + "command": "pioupload", + "title": "PIO Upload", + "icon": "resources/U32x32_white.svg" + }, + { + "command": "piotraceback", + "title": "PIO Upload (traceback)", + "icon": "resources/Ut32x32_white.svg" + } + ], + "menus": { + "view/title": [ + { + "command": "piobuild", + "group": "navigation@1" + }, + { + "command": "pioclean", + "group": "navigation@2" + }, + { + "command": "pioupload", + "group": "navigation@3" + }, + { + "command": "piotraceback", + "group": "navigation@4" + } + ] + } + }, + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", + "postinstall": "node ./node_modules/vscode/bin/install", + "test": "npm run compile && node ./node_modules/vscode/bin/test" + }, + "devDependencies": { + "vscode": "^1.1.17", + "typescript": "^2.6.1", + "tslint": "^5.8.0", + "@types/node": "^7.0.43", + "@types/mocha": "^2.2.42" + } +} diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/AB_menu.png b/buildroot/share/vscode/AutoBuildMarlin/resources/AB_menu.png new file mode 100644 index 0000000000..2cb282c918 Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/AB_menu.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Activity_bar.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Activity_bar.png new file mode 100644 index 0000000000..d78e2c82f4 Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/Activity_bar.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/B24x24_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/B24x24_white.svg new file mode 100644 index 0000000000..1d6c667233 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/B24x24_white.svg @@ -0,0 +1 @@ +B \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/B32x32_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/B32x32_white.svg new file mode 100644 index 0000000000..375b6f5f03 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/B32x32_white.svg @@ -0,0 +1 @@ +B \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/B_small.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/B_small.svg new file mode 100644 index 0000000000..c830b2713a --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/B_small.svg @@ -0,0 +1 @@ +B \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Build.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Build.png new file mode 100644 index 0000000000..86ed4782be Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/Build.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/C32x32_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/C32x32_white.svg new file mode 100644 index 0000000000..43f93ce040 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/C32x32_white.svg @@ -0,0 +1 @@ +C \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/C_small.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/C_small.svg new file mode 100644 index 0000000000..f8ee33d7ad --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/C_small.svg @@ -0,0 +1 @@ +C \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Clean.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Clean.png new file mode 100644 index 0000000000..6ce41877a6 Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/Clean.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Folder.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Folder.png new file mode 100644 index 0000000000..b8ae9ac902 Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Folder.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Marlin.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Marlin.png new file mode 100644 index 0000000000..aa22232a8e Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Marlin.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/T32x32_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/T32x32_white.svg new file mode 100644 index 0000000000..fb3e249e8d --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/T32x32_white.svg @@ -0,0 +1 @@ +T \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Traceback.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Traceback.png new file mode 100644 index 0000000000..4ee9f976fb Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/Traceback.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/U32x32_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/U32x32_white.svg new file mode 100644 index 0000000000..028c9e5474 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/U32x32_white.svg @@ -0,0 +1 @@ +U \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/U_small.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/U_small.svg new file mode 100644 index 0000000000..eb3a431b9d --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/U_small.svg @@ -0,0 +1 @@ +U \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Upload.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Upload.png new file mode 100644 index 0000000000..8de383e5d1 Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/Upload.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Ut32x32_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/Ut32x32_white.svg new file mode 100644 index 0000000000..fc8858ea18 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/Ut32x32_white.svg @@ -0,0 +1 @@ +Ut \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Ut_small.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/Ut_small.svg new file mode 100644 index 0000000000..accc458a42 --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/resources/Ut_small.svg @@ -0,0 +1 @@ +Ut \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/install_extensions.png b/buildroot/share/vscode/AutoBuildMarlin/resources/install_extensions.png new file mode 100644 index 0000000000..4904c1d758 Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/install_extensions.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/platformio_install.png b/buildroot/share/vscode/AutoBuildMarlin/resources/platformio_install.png new file mode 100644 index 0000000000..e1ff7fd3b3 Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/platformio_install.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/view_command_palette.png b/buildroot/share/vscode/AutoBuildMarlin/resources/view_command_palette.png new file mode 100644 index 0000000000..6fa3e9b016 Binary files /dev/null and b/buildroot/share/vscode/AutoBuildMarlin/resources/view_command_palette.png differ diff --git a/buildroot/share/vscode/AutoBuildMarlin/tsconfig.json b/buildroot/share/vscode/AutoBuildMarlin/tsconfig.json new file mode 100644 index 0000000000..58c698568f --- /dev/null +++ b/buildroot/share/vscode/AutoBuildMarlin/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": [ + "es6" + ], + "sourceMap": true, + "rootDir": "." + } +} diff --git a/buildroot/share/vscode/auto_build.py b/buildroot/share/vscode/auto_build.py deleted file mode 100644 index 5dd2d0d8a3..0000000000 --- a/buildroot/share/vscode/auto_build.py +++ /dev/null @@ -1,1303 +0,0 @@ -#!/usr/bin/env python -####################################### -# -# Marlin 3D Printer Firmware -# Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] -# -# Based on Sprinter and grbl. -# Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -####################################### - -####################################### -# -# Revision: 2.1.0 -# -# Description: script to automate PlatformIO builds -# CLI: python auto_build.py build_option -# build_option (required) -# build executes -> platformio run -e target_env -# clean executes -> platformio run --target clean -e target_env -# upload executes -> platformio run --target upload -e target_env -# traceback executes -> platformio run --target upload -e target_env -# program executes -> platformio run --target program -e target_env -# test executes -> platformio test upload -e target_env -# remote executes -> platformio remote run --target upload -e target_env -# debug executes -> platformio debug -e target_env -# -# 'traceback' just uses the debug variant of the target environment if one exists -# -####################################### - -####################################### -# -# General program flow -# -# 1. Scans Configuration.h for the motherboard name and Marlin version. -# 2. Scans pins.h for the motherboard. -# returns the CPU(s) and platformio environment(s) used by the motherboard -# 3. If further info is needed then a popup gets it from the user. -# 4. The OUTPUT_WINDOW class creates a window to display the output of the PlatformIO program. -# 5. A thread is created by the OUTPUT_WINDOW class in order to execute the RUN_PIO function. -# 6. The RUN_PIO function uses a subprocess to run the CLI version of PlatformIO. -# 7. The "iter(pio_subprocess.stdout.readline, '')" function is used to stream the output of -# PlatformIO back to the RUN_PIO function. -# 8. Each line returned from PlatformIO is formatted to match the color coding seen in the -# PlatformIO GUI. -# 9. If there is a color change within a line then the line is broken at each color change -# and sent separately. -# 10. Each formatted segment (could be a full line or a split line) is put into the queue -# IO_queue as it arrives from the platformio subprocess. -# 11. The OUTPUT_WINDOW class periodically samples IO_queue. If data is available then it -# is written to the window. -# 12. The window stays open until the user closes it. -# 13. The OUTPUT_WINDOW class continues to execute as long as the window is open. This allows -# copying, saving, scrolling of the window. A right click popup is available. -# -####################################### - -from __future__ import print_function -from __future__ import division - -import sys -import os - -pwd = os.getcwd() # make sure we're executing from the correct directory level -pwd = pwd.replace('\\', '/') -if 0 <= pwd.find('buildroot/share/atom'): - pwd = pwd[:pwd.find('buildroot/share/atom')] - os.chdir(pwd) -print('pwd: ', pwd) - -num_args = len(sys.argv) -if num_args > 1: - build_type = str(sys.argv[1]) -else: - print('Please specify build type') - exit() - -print('build_type: ', build_type) - -print('\nWorking\n') - -python_ver = sys.version_info[0] # major version - 2 or 3 - -print("python version " + str(sys.version_info[0]) + "." + str(sys.version_info[1]) + "." + str(sys.version_info[2])) - -import platform -current_OS = platform.system() - -#globals -target_env = '' -board_name = '' - -from datetime import datetime, date, time - -######### -# Python 2 error messages: -# Can't find a usable init.tcl in the following directories ... -# error "invalid command name "tcl_findLibrary"" -# -# Fix for the above errors on my Win10 system: -# search all init.tcl files for the line "package require -exact Tcl" that has the highest 8.5.x number -# copy it into the first directory listed in the error messages -# set the environmental variables TCLLIBPATH and TCL_LIBRARY to the directory where you found the init.tcl file -# reboot -######### - -########################################################################################## -# -# popup to get input from user -# -########################################################################################## - -def get_answer(board_name, cpu_label_txt, cpu_a_txt, cpu_b_txt): - - if python_ver == 2: - import Tkinter as tk - else: - import tkinter as tk - - def CPU_exit_3(): # forward declare functions - CPU_exit_3_() - - def got_answer(): - got_answer_() - - def kill_session(): - kill_session_() - - root_get_answer = tk.Tk() - root_get_answer.title('') - #root_get_answer.withdraw() - #root_get_answer.deiconify() - root_get_answer.attributes("-topmost", True) - - def disable_event(): - pass - - root_get_answer.protocol("WM_DELETE_WINDOW", disable_event) - root_get_answer.resizable(False, False) - - root_get_answer.radio_state = 1 # declare variables used by TK and enable - - global get_answer_val - get_answer_val = 2 # return get_answer_val, set default to match radio_state default - - radio_state = tk.IntVar() - radio_state.set(get_answer_val) - - l1 = tk.Label(text=board_name, fg="light green", bg="dark green", - font="default 14 bold").grid(row=0, columnspan=2, sticky='EW', ipadx=2, ipady=2) - - l2 = tk.Label(text=cpu_label_txt).grid(row=1, pady=4, columnspan=2, sticky='EW') - - b4 = tk.Radiobutton( - text=cpu_a_txt, - fg="black", - bg="lightgray", - relief=tk.SUNKEN, - selectcolor="green", - variable=radio_state, - value=1, - indicatoron=0, - command=CPU_exit_3 - ).grid(row=2, pady=1, ipady=2, ipadx=10, columnspan=2) - - b5 = tk.Radiobutton( - text=cpu_b_txt, - fg="black", - bg="lightgray", - relief=tk.SUNKEN, - selectcolor="green", - variable=radio_state, - value=2, - indicatoron=0, - command=CPU_exit_3 - ).grid(row=3, pady=1, ipady=2, ipadx=10, columnspan=2) # use same variable but inverted so they will track - - b6 = tk.Button(text="Cancel", fg="red", command=kill_session).grid(row=4, column=0, padx=4, pady=4, ipadx=2, ipady=2) - - b7 = tk.Button(text="Continue", fg="green", command=got_answer).grid(row=4, column=1, padx=4, pady=4, ipadx=2, ipady=2) - - def got_answer_(): - root_get_answer.destroy() - - def CPU_exit_3_(): - global get_answer_val - get_answer_val = radio_state.get() - - def kill_session_(): - raise SystemExit(0) # kill everything - - root_get_answer.mainloop() - -# end - get answer - - -# -# move custom board definitions from project folder to PlatformIO -# -def resolve_path(path): - import os - - # turn the selection into a partial path - - if 0 <= path.find('"'): - path = path[path.find('"'):] - if 0 <= path.find(', line '): - path = path.replace(', line ', ':') - path = path.replace('"', '') - - # get line and column numbers - line_num = 1 - column_num = 1 - line_start = path.find(':', 2) # use 2 here so don't eat Windows full path - column_start = path.find(':', line_start + 1) - if column_start == -1: - column_start = len(path) - column_end = path.find(':', column_start + 1) - if column_end == -1: - column_end = len(path) - if 0 <= line_start: - line_num = path[line_start + 1:column_start] - if line_num == '': - line_num = 1 - if column_start != column_end: - column_num = path[column_start + 1:column_end] - if column_num == '': - column_num = 0 - - index_end = path.find(',') - if 0 <= index_end: - path = path[:index_end] # delete comma and anything after - index_end = path.find(':', 2) - if 0 <= index_end: - path = path[:path.find(':', 2)] # delete the line number and anything after - - path = path.replace('\\', '/') - - if 1 == path.find(':') and current_OS == 'Windows': - return path, line_num, column_num # found a full path - no need for further processing - elif 0 == path.find('/') and (current_OS == 'Linux' or current_OS == 'Darwin'): - return path, line_num, column_num # found a full path - no need for further processing - - else: - - # resolve as many '../' as we can - while 0 <= path.find('../'): - end = path.find('../') - 1 - start = path.find('/') - while 0 <= path.find('/', start) and end > path.find('/', start): - start = path.find('/', start) + 1 - path = path[0:start] + path[end + 4:] - - # this is an alternative to the above - it just deletes the '../' section - # start_temp = path.find('../') - # while 0 <= path.find('../',start_temp): - # start = path.find('../',start_temp) - # start_temp = start + 1 - # if 0 <= start: - # path = path[start + 2 : ] - - start = path.find('/') - if start != 0: # make sure path starts with '/' - while 0 == path.find(' '): # eat any spaces at the beginning - path = path[1:] - path = '/' + path - - if current_OS == 'Windows': - search_path = path.replace('/', '\\') # os.walk uses '\' in Windows - else: - search_path = path - - start_path = os.path.abspath('') - - # search project directory for the selection - found = False - full_path = '' - for root, directories, filenames in os.walk(start_path): - for filename in filenames: - if 0 <= root.find('.git'): # don't bother looking in this directory - break - full_path = os.path.join(root, filename) - if 0 <= full_path.find(search_path): - found = True - break - if found: - break - - return full_path, line_num, column_num - -# end - resolve_path - - -# -# Open the file in the preferred editor at the line & column number -# If the preferred editor isn't already running then it tries the next. -# If none are open then the system default is used. -# -# Editor order: -# 1. Notepad++ (Windows only) -# 2. Sublime Text -# 3. Atom -# 4. System default (opens at line 1, column 1 only) -# -def open_file(path): - import subprocess - file_path, line_num, column_num = resolve_path(path) - - if file_path == '': - return - - if current_OS == 'Windows': - - editor_note = subprocess.check_output('wmic process where "name=' + "'notepad++.exe'" + '" get ExecutablePath') - editor_sublime = subprocess.check_output('wmic process where "name=' + "'sublime_text.exe'" + '" get ExecutablePath') - editor_atom = subprocess.check_output('wmic process where "name=' + "'atom.exe'" + '" get ExecutablePath') - - if 0 <= editor_note.find('notepad++.exe'): - start = editor_note.find('\n') + 1 - end = editor_note.find('\n', start + 5) - 4 - editor_note = editor_note[start:end] - command = file_path, ' -n' + str(line_num), ' -c' + str(column_num) - subprocess.Popen([editor_note, command]) - - elif 0 <= editor_sublime.find('sublime_text.exe'): - start = editor_sublime.find('\n') + 1 - end = editor_sublime.find('\n', start + 5) - 4 - editor_sublime = editor_sublime[start:end] - command = file_path + ':' + line_num + ':' + column_num - subprocess.Popen([editor_sublime, command]) - - elif 0 <= editor_atom.find('atom.exe'): - start = editor_atom.find('\n') + 1 - end = editor_atom.find('\n', start + 5) - 4 - editor_atom = editor_atom[start:end] - command = file_path + ':' + str(line_num) + ':' + str(column_num) - subprocess.Popen([editor_atom, command]) - - else: - os.startfile(resolve_path(path)) # open file with default app - - elif current_OS == 'Linux': - - command = file_path + ':' + str(line_num) + ':' + str(column_num) - index_end = command.find(',') - if 0 <= index_end: - command = command[:index_end] # sometimes a comma magically appears, don't want it - running_apps = subprocess.Popen('ps ax -o cmd', stdout=subprocess.PIPE, shell=True) - (output, err) = running_apps.communicate() - temp = output.split('\n') - - def find_editor_linux(name, search_obj): - for line in search_obj: - if 0 <= line.find(name): - path = line - return True, path - return False, '' - - (success_sublime, editor_path_sublime) = find_editor_linux('sublime_text', temp) - (success_atom, editor_path_atom) = find_editor_linux('atom', temp) - - if success_sublime: - subprocess.Popen([editor_path_sublime, command]) - - elif success_atom: - subprocess.Popen([editor_path_atom, command]) - - else: - os.system('xdg-open ' + file_path) - - elif current_OS == 'Darwin': # MAC - - command = file_path + ':' + str(line_num) + ':' + str(column_num) - index_end = command.find(',') - if 0 <= index_end: - command = command[:index_end] # sometimes a comma magically appears, don't want it - running_apps = subprocess.Popen('ps axwww -o command', stdout=subprocess.PIPE, shell=True) - (output, err) = running_apps.communicate() - temp = output.split('\n') - - def find_editor_mac(name, search_obj): - for line in search_obj: - if 0 <= line.find(name): - path = line - if 0 <= path.find('-psn'): - path = path[:path.find('-psn') - 1] - return True, path - return False, '' - - (success_sublime, editor_path_sublime) = find_editor_mac('Sublime', temp) - (success_atom, editor_path_atom) = find_editor_mac('Atom', temp) - - if success_sublime: - subprocess.Popen([editor_path_sublime, command]) - - elif success_atom: - subprocess.Popen([editor_path_atom, command]) - - else: - os.system('open ' + file_path) - -# end - open_file - - -# Get the last build environment -def get_build_last(): - env_last = '' - DIR_PWD = os.listdir('.') - if '.pio' in DIR_PWD: - date_last = 0.0 - DIR__pioenvs = os.listdir('.pio') - for name in DIR__pioenvs: - if 0 <= name.find('.') or 0 <= name.find('-'): # skip files in listing - continue - DIR_temp = os.listdir('.pio/build/' + name) - for names_temp in DIR_temp: - - if 0 == names_temp.find('firmware.'): - date_temp = os.path.getmtime('.pio/build/' + name + '/' + names_temp) - if date_temp > date_last: - date_last = date_temp - env_last = name - return env_last - - -# Get the board being built from the Configuration.h file -# return: board name, major version of Marlin being used (1 or 2) -def get_board_name(): - board_name = '' - # get board name - - with open('Marlin/Configuration.h', 'r') as myfile: - Configuration_h = myfile.read() - - Configuration_h = Configuration_h.split('\n') - Marlin_ver = 0 # set version to invalid number - for lines in Configuration_h: - if 0 == lines.find('#define CONFIGURATION_H_VERSION 01'): - Marlin_ver = 1 - if 0 == lines.find('#define CONFIGURATION_H_VERSION 02'): - Marlin_ver = 2 - board = lines.find(' BOARD_') + 1 - motherboard = lines.find(' MOTHERBOARD ') + 1 - define = lines.find('#define ') - comment = lines.find('//') - if (comment == -1 or comment > board) and \ - board > motherboard and \ - motherboard > define and \ - define >= 0 : - spaces = lines.find(' ', board) # find the end of the board substring - if spaces == -1: - board_name = lines[board:] - else: - board_name = lines[board:spaces] - break - - return board_name, Marlin_ver - - -# extract first environment name found after the start position -# return: environment name and position to start the next search from -def get_env_from_line(line, start_position): - env = '' - next_position = -1 - env_position = line.find('env:', start_position) - if 0 < env_position: - next_position = line.find(' ', env_position + 4) - if 0 < next_position: - env = line[env_position + 4:next_position] - else: - env = line[env_position + 4:] # at the end of the line - return env, next_position - - -# scan pins.h for board name and return the environment(s) found -def get_starting_env(board_name_full, version): - # get environment starting point - - if version == 1: - path = 'Marlin/pins.h' - if version == 2: - path = 'Marlin/src/pins/pins.h' - with open(path, 'r') as myfile: - pins_h = myfile.read() - - env_A = '' - env_B = '' - env_C = '' - - board_name = board_name_full[6:] # only use the part after "BOARD_" since we're searching the pins.h file - pins_h = pins_h.split('\n') - environment = '' - board_line = '' - cpu_A = '' - cpu_B = '' - i = 0 - list_start_found = False - for lines in pins_h: - i = i + 1 # i is always one ahead of the index into pins_h - if 0 < lines.find("Unknown MOTHERBOARD value set in Configuration.h"): - break # no more - if 0 < lines.find('1280'): - list_start_found = True - if list_start_found == False: # skip lines until find start of CPU list - continue - board = lines.find(board_name) - comment_start = lines.find('// ') - cpu_A_loc = comment_start - cpu_B_loc = 0 - if board > 0: # need to look at the next line for environment info - cpu_line = pins_h[i] - comment_start = cpu_line.find('// ') - env_A, next_position = get_env_from_line(cpu_line, comment_start) # get name of environment & start of search for next - env_B, next_position = get_env_from_line(cpu_line, next_position) # get next environment, if it exists - env_C, next_position = get_env_from_line(cpu_line, next_position) # get next environment, if it exists - break - return env_A, env_B, env_C - - -# Scan input string for CPUs that users may need to select from -# return: CPU name -def get_CPU_name(environment): - CPU_list = ('1280', '2560', '644', '1284', 'LPC1768', 'DUE') - CPU_name = '' - for CPU in CPU_list: - if 0 < environment.find(CPU): - return CPU - - -# get environment to be used for the build -# return: environment -def get_env(board_name, ver_Marlin): - - def no_environment(): - print('ERROR - no environment for this board') - print(board_name) - raise SystemExit(0) # no environment so quit - - def invalid_board(): - print('ERROR - invalid board') - print(board_name) - raise SystemExit(0) # quit if unable to find board - - CPU_question = (('1280', '2560', '1280 or 2560 CPU?'), ('644', '1284', '644 or 1284 CPU?')) - - if 0 < board_name.find('MELZI'): - get_answer( - board_name, " Which flavor of Melzi? ", "Melzi (Optiboot bootloader)", "Melzi " - ) - if 1 == get_answer_val: - target_env = 'melzi_optiboot' - else: - target_env = 'melzi' - else: - env_A, env_B, env_C = get_starting_env(board_name, ver_Marlin) - - if env_A == '': - no_environment() - if env_B == '': - return env_A # only one environment so finished - - CPU_A = get_CPU_name(env_A) - CPU_B = get_CPU_name(env_B) - - for item in CPU_question: - if CPU_A == item[0]: - get_answer(board_name, item[2], item[0], item[1]) - if 2 == get_answer_val: - target_env = env_B - else: - target_env = env_A - return target_env - - if env_A == 'LPC1768': - if build_type == 'traceback' or (build_type == 'clean' and get_build_last() == 'LPC1768_debug_and_upload'): - target_env = 'LPC1768_debug_and_upload' - else: - target_env = 'LPC1768' - elif env_A == 'DUE': - target_env = 'DUE' - if build_type == 'traceback' or (build_type == 'clean' and get_build_last() == 'DUE_debug'): - target_env = 'DUE_debug' - elif env_B == 'DUE_USB': - get_answer(board_name, 'DUE Download Port?', '(Native) USB port', 'Programming port') - if 1 == get_answer_val: - target_env = 'DUE_USB' - else: - target_env = 'DUE' - elif env_A == 'STM32F103RC_btt' or env_A == 'STM32F103RE_btt': - if env_A == 'STM32F103RE_btt': - get_answer(board_name, 'MCU Type?', 'STM32F103RC', 'STM32F103RE') - if 1 == get_answer_val: - env_A = 'STM32F103RC_btt' - target_env = env_A - if env_A == 'STM32F103RC_btt': - get_answer(board_name, 'RCT6 Flash Size?', '512K', '256K') - if 1 == get_answer_val: - target_env += '_512K' - get_answer(board_name, 'USB Support?', 'USB', 'No USB') - if 1 == get_answer_val: - target_env += '_USB' - else: - invalid_board() - - if build_type == 'traceback' and target_env != 'LPC1768_debug_and_upload' and target_env != 'DUE_debug' and Marlin_ver == 2: - print("ERROR - this board isn't setup for traceback") - print('board_name: ', board_name) - print('target_env: ', target_env) - raise SystemExit(0) - - return target_env - -# end - get_env - - -# puts screen text into queue so that the parent thread can fetch the data from this thread -if python_ver == 2: - import Queue as queue -else: - import queue as queue -IO_queue = queue.Queue() - - -#PIO_queue = queue.Queue() not used! -def write_to_screen_queue(text, format_tag='normal'): - double_in = [text, format_tag] - IO_queue.put(double_in, block=False) - - -# -# send one line to the terminal screen with syntax highlighting -# -# input: unformatted text, flags from previous run -# return: formatted text ready to go to the terminal, flags from this run -# -# This routine remembers the status from call to call because previous -# lines can affect how the current line is highlighted -# - -# 'static' variables - init here and then keep updating them from within print_line -warning = False -warning_FROM = False -error = False -standard = True -prev_line_COM = False -next_line_warning = False -warning_continue = False -line_counter = 0 - - -def line_print(line_input): - - global warning - global warning_FROM - global error - global standard - global prev_line_COM - global next_line_warning - global warning_continue - global line_counter - - # all '0' elements must precede all '1' elements or they'll be skipped - platformio_highlights = [ - ['Environment', 0, 'highlight_blue'], ['[SKIP]', 1, 'warning'], ['[IGNORED]', 1, 'warning'], ['[ERROR]', 1, 'error'], - ['[FAILED]', 1, 'error'], ['[SUCCESS]', 1, 'highlight_green'] - ] - - def write_to_screen_with_replace(text, highlights): # search for highlights & split line accordingly - did_something = False - for highlight in highlights: - found = text.find(highlight[0]) - if did_something == True: - break - if found >= 0: - did_something = True - if 0 == highlight[1]: - found_1 = text.find(' ') - found_tab = text.find('\t') - if found_1 < 0 or found_1 > found_tab: - found_1 = found_tab - write_to_screen_queue(text[:found_1 + 1]) - for highlight_2 in highlights: - if highlight[0] == highlight_2[0]: - continue - found = text.find(highlight_2[0]) - if found >= 0: - found_space = text.find(' ', found_1 + 1) - found_tab = text.find('\t', found_1 + 1) - if found_space < 0 or found_space > found_tab: - found_space = found_tab - found_right = text.find(']', found + 1) - write_to_screen_queue(text[found_1 + 1:found_space + 1], highlight[2]) - write_to_screen_queue(text[found_space + 1:found + 1]) - write_to_screen_queue(text[found + 1:found_right], highlight_2[2]) - write_to_screen_queue(text[found_right:] + '\n') - break - break - if 1 == highlight[1]: - found_right = text.find(']', found + 1) - write_to_screen_queue(text[:found + 1]) - write_to_screen_queue(text[found + 1:found_right], highlight[2]) - write_to_screen_queue(text[found_right:] + '\n' + '\n') - break - if did_something == False: - r_loc = text.find('\r') + 1 - if r_loc > 0 and r_loc < len(text): # need to split this line - text = text.split('\r') - for line in text: - if line != '': - write_to_screen_queue(line + '\n') - else: - write_to_screen_queue(text + '\n') - - # end - write_to_screen_with_replace - -# scan the line - line_counter = line_counter + 1 - max_search = len(line_input) - if max_search > 3: - max_search = 3 - beginning = line_input[:max_search] - - # set flags - if 0 < line_input.find(': warning: '): # start of warning block - warning = True - warning_FROM = False - error = False - standard = False - prev_line_COM = False - prev_line_COM = False - warning_continue = True - if 0 < line_input.find('Thank you') or 0 < line_input.find('SUMMARY'): - warning = False #standard line found - warning_FROM = False - error = False - standard = True - prev_line_COM = False - warning_continue = False - elif beginning == 'War' or \ - beginning == '#er' or \ - beginning == 'In ' or \ - (beginning != 'Com' and prev_line_COM == True and not(beginning == 'Arc' or beginning == 'Lin' or beginning == 'Ind') or \ - next_line_warning == True): - warning = True #warning found - warning_FROM = False - error = False - standard = False - prev_line_COM = False - elif beginning == 'Com' or \ - beginning == 'Ver' or \ - beginning == ' [E' or \ - beginning == 'Rem' or \ - beginning == 'Bui' or \ - beginning == 'Ind' or \ - beginning == 'PLA': - warning = False #standard line found - warning_FROM = False - error = False - standard = True - prev_line_COM = False - warning_continue = False - elif beginning == '***': - warning = False # error found - warning_FROM = False - error = True - standard = False - prev_line_COM = False - elif 0 < line_input.find(': error:') or \ - 0 < line_input.find(': fatal error:'): # start of warning /error block - warning = False # error found - warning_FROM = False - error = True - standard = False - prev_line_COM = False - warning_continue = True - elif beginning == 'fro' and warning == True or \ - beginning == '.pi' : # start of warning /error block - warning_FROM = True - prev_line_COM = False - warning_continue = True - elif warning_continue == True: - warning = True - warning_FROM = False # keep the warning status going until find a standard line or an error - error = False - standard = False - prev_line_COM = False - warning_continue = True - - else: - warning = False # unknown so assume standard line - warning_FROM = False - error = False - standard = True - prev_line_COM = False - warning_continue = False - - if beginning == 'Com': - prev_line_COM = True - -# print based on flags - if standard == True: - write_to_screen_with_replace(line_input, platformio_highlights) #print white on black with substitutions - if warning == True: - write_to_screen_queue(line_input + '\n', 'warning') - if error == True: - write_to_screen_queue(line_input + '\n', 'error') - -# end - line_print - - -########################################################################## -# # -# run Platformio # -# # -########################################################################## - -# build platformio run -e target_env -# clean platformio run --target clean -e target_env -# upload platformio run --target upload -e target_env -# traceback platformio run --target upload -e target_env -# program platformio run --target program -e target_env -# test platformio test upload -e target_env -# remote platformio remote run --target upload -e target_env -# debug platformio debug -e target_env - - -def sys_PIO(): - - ########################################################################## - # # - # run Platformio inside the same shell as this Python script # - # # - ########################################################################## - - global build_type - global target_env - - import os - - print('build_type: ', build_type) - print('starting platformio') - - if build_type == 'build': - # pio_result = os.system("echo -en '\033c'") - pio_result = os.system('platformio run -e ' + target_env) - elif build_type == 'clean': - pio_result = os.system('platformio run --target clean -e ' + target_env) - elif build_type == 'upload': - pio_result = os.system('platformio run --target upload -e ' + target_env) - elif build_type == 'traceback': - pio_result = os.system('platformio run --target upload -e ' + target_env) - elif build_type == 'program': - pio_result = os.system('platformio run --target program -e ' + target_env) - elif build_type == 'test': - pio_result = os.system('platformio test upload -e ' + target_env) - elif build_type == 'remote': - pio_result = os.system('platformio remote run --target program -e ' + target_env) - elif build_type == 'debug': - pio_result = os.system('platformio debug -e ' + target_env) - else: - print('ERROR - unknown build type: ', build_type) - raise SystemExit(0) # kill everything - - # stream output from subprocess and split it into lines - #for line in iter(pio_subprocess.stdout.readline, ''): - # line_print(line.replace('\n', '')) - - # append info used to run PlatformIO - # write_to_screen_queue('\nBoard name: ' + board_name + '\n') # put build info at the bottom of the screen - # write_to_screen_queue('Build type: ' + build_type + '\n') - # write_to_screen_queue('Environment used: ' + target_env + '\n') - # write_to_screen_queue(str(datetime.now()) + '\n') - -# end - sys_PIO - - -def run_PIO(dummy): - - global build_type - global target_env - global board_name - print('build_type: ', build_type) - - import subprocess - import sys - - print('starting platformio') - - if build_type == 'build': - # platformio run -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen( - ['platformio', 'run', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - - elif build_type == 'clean': - # platformio run --target clean -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen( - ['platformio', 'run', '--target', 'clean', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - - elif build_type == 'upload': - # platformio run --target upload -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen( - ['platformio', 'run', '--target', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - - elif build_type == 'traceback': - # platformio run --target upload -e target_env - select the debug environment if there is one - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen( - ['platformio', 'run', '--target', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - - elif build_type == 'program': - # platformio run --target program -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen( - ['platformio', 'run', '--target', 'program', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - - elif build_type == 'test': - #platformio test upload -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen( - ['platformio', 'test', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - - elif build_type == 'remote': - # platformio remote run --target upload -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen( - ['platformio', 'remote', 'run', '--target', 'program', '-e', target_env], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT - ) - - elif build_type == 'debug': - # platformio debug -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen( - ['platformio', 'debug', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - - else: - print('ERROR - unknown build type: ', build_type) - raise SystemExit(0) # kill everything - -# stream output from subprocess and split it into lines - if python_ver == 2: - for line in iter(pio_subprocess.stdout.readline, ''): - line_print(line.replace('\n', '')) - else: - for line in iter(pio_subprocess.stdout.readline, b''): - line = line.decode('utf-8') - line_print(line.replace('\n', '')) - -# append info used to run PlatformIO - write_to_screen_queue('\nBoard name: ' + board_name + '\n') # put build info at the bottom of the screen - write_to_screen_queue('Build type: ' + build_type + '\n') - write_to_screen_queue('Environment used: ' + target_env + '\n') - write_to_screen_queue(str(datetime.now()) + '\n') - -# end - run_PIO - -######################################################################## - -import time -import threading -if python_ver == 2: - import Tkinter as tk - import Queue as queue - import ttk - from Tkinter import Tk, Frame, Text, Scrollbar, Menu - #from tkMessageBox import askokcancel this is not used: removed - import tkFileDialog as fileDialog -else: - import tkinter as tk - import queue as queue - from tkinter import ttk, Tk, Frame, Text, Menu -import subprocess -import sys -que = queue.Queue() -#IO_queue = queue.Queue() - - -class output_window(Text): - # based on Super Text - global continue_updates - continue_updates = True - - global search_position - search_position = '' # start with invalid search position - - global error_found - error_found = False # are there any errors? - - def __init__(self): - - self.root = tk.Tk() - self.root.attributes("-topmost", True) - self.frame = tk.Frame(self.root) - self.frame.pack(fill='both', expand=True) - - # text widget - #self.text = tk.Text(self.frame, borderwidth=3, relief="sunken") - Text.__init__(self, self.frame, borderwidth=3, relief="sunken") - self.config(tabs=(400, )) # configure Text widget tab stops - self.config(background='black', foreground='white', font=("consolas", 12), wrap='word', undo='True') - #self.config(background = 'black', foreground = 'white', font= ("consolas", 12), wrap = 'none', undo = 'True') - self.config(height=24, width=100) - self.config(insertbackground='pale green') # keyboard insertion point - self.pack(side='left', fill='both', expand=True) - - self.tag_config('normal', foreground='white') - self.tag_config('warning', foreground='yellow') - self.tag_config('error', foreground='red') - self.tag_config('highlight_green', foreground='green') - self.tag_config('highlight_blue', foreground='cyan') - self.tag_config('error_highlight_inactive', background='dim gray') - self.tag_config('error_highlight_active', background='light grey') - - self.bind_class("Text", "", self.select_all) # required in windows, works in others - self.bind_all("", self.scroll_errors) - self.bind_class("", self.rebuild) - - # scrollbar - - scrb = tk.Scrollbar(self.frame, orient='vertical', command=self.yview) - self.config(yscrollcommand=scrb.set) - scrb.pack(side='right', fill='y') - - #self.scrb_Y = tk.Scrollbar(self.frame, orient='vertical', command=self.yview) - #self.scrb_Y.config(yscrollcommand=self.scrb_Y.set) - #self.scrb_Y.pack(side='right', fill='y') - - #self.scrb_X = tk.Scrollbar(self.frame, orient='horizontal', command=self.xview) - #self.scrb_X.config(xscrollcommand=self.scrb_X.set) - #self.scrb_X.pack(side='bottom', fill='x') - - #scrb_X = tk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.xview) # tk.HORIZONTAL now have a horizsontal scroll bar BUT... shrinks it to a postage stamp and hides far right behind the vertical scroll bar - #self.config(xscrollcommand=scrb_X.set) - #scrb_X.pack(side='bottom', fill='x') - - #scrb= tk.Scrollbar(self, orient='vertical', command=self.yview) - #self.config(yscrollcommand=scrb.set) - #scrb.pack(side='right', fill='y') - - #self.config(height = 240, width = 1000) # didn't get the size baCK TO NORMAL - #self.pack(side='left', fill='both', expand=True) # didn't get the size baCK TO NORMAL - - # pop-up menu - self.popup = tk.Menu(self, tearoff=0) - - self.popup.add_command(label='Copy', command=self._copy) - self.popup.add_command(label='Paste', command=self._paste) - self.popup.add_separator() - self.popup.add_command(label='Cut', command=self._cut) - self.popup.add_separator() - self.popup.add_command(label='Select All', command=self._select_all) - self.popup.add_command(label='Clear All', command=self._clear_all) - self.popup.add_separator() - self.popup.add_command(label='Save As', command=self._file_save_as) - self.popup.add_separator() - #self.popup.add_command(label='Repeat Build(CTL-shift-r)', command=self._rebuild) - self.popup.add_command(label='Repeat Build', command=self._rebuild) - self.popup.add_separator() - self.popup.add_command(label='Scroll Errors (CTL-shift-e)', command=self._scroll_errors) - self.popup.add_separator() - self.popup.add_command(label='Open File at Cursor', command=self._open_selected_file) - - if current_OS == 'Darwin': # MAC - self.bind('', self._show_popup) # macOS only - else: - self.bind('', self._show_popup) # Windows & Linux - -# threading & subprocess section - - def start_thread(self, ): - global continue_updates - # create then start a secondary thread to run an arbitrary function - # must have at least one argument - self.secondary_thread = threading.Thread(target=lambda q, arg1: q.put(run_PIO(arg1)), args=(que, '')) - self.secondary_thread.start() - continue_updates = True - # check the Queue in 50ms - self.root.after(50, self.check_thread) - self.root.after(50, self.update) - - def check_thread(self): # wait for user to kill the window - global continue_updates - if continue_updates == True: - self.root.after(10, self.check_thread) - - def update(self): - global continue_updates - if continue_updates == True: - self.root.after(10, self.update) #method is called every 50ms - temp_text = ['0', '0'] - if IO_queue.empty(): - if not (self.secondary_thread.is_alive()): - continue_updates = False # queue is exhausted and thread is dead so no need for further updates - else: - try: - temp_text = IO_queue.get(block=False) - except Queue.Empty: - continue_updates = False # queue is exhausted so no need for further updates - else: - self.insert('end', temp_text[0], temp_text[1]) - self.see("end") # make the last line visible (scroll text off the top) - -# text editing section - - def _scroll_errors(self): - global search_position - global error_found - if search_position == '': # first time so highlight all errors - countVar = tk.IntVar() - search_position = '1.0' - search_count = 0 - while search_position != '' and search_count < 100: - search_position = self.search("error", search_position, stopindex="end", count=countVar, nocase=1) - search_count = search_count + 1 - if search_position != '': - error_found = True - end_pos = '{}+{}c'.format(search_position, 5) - self.tag_add("error_highlight_inactive", search_position, end_pos) - search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search - else: - break - - if error_found: - if search_position == '': - search_position = self.search("error", '1.0', stopindex="end", nocase=1) # new search - else: # remove active highlight - end_pos = '{}+{}c'.format(search_position, 5) - start_pos = '{}+{}c'.format(search_position, -1) - self.tag_remove("error_highlight_active", start_pos, end_pos) - search_position = self.search( - "error", search_position, stopindex="end", nocase=1 - ) # finds first occurrence AGAIN on the first time through - if search_position == "": # wrap around - search_position = self.search("error", '1.0', stopindex="end", nocase=1) - end_pos = '{}+{}c'.format(search_position, 5) - self.tag_add("error_highlight_active", search_position, end_pos) # add active highlight - self.see(search_position) - search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search - - def scroll_errors(self, event): - self._scroll_errors() - - def _rebuild(self): - #global board_name - #global Marlin_ver - #global target_env - #board_name, Marlin_ver = get_board_name() - #target_env = get_env(board_name, Marlin_ver) - self.start_thread() - - def rebuild(self, event): - print("event happened") - self._rebuild() - - def _open_selected_file(self): - current_line = self.index('insert') - line_start = current_line[:current_line.find('.')] + '.0' - line_end = current_line[:current_line.find('.')] + '.200' - self.mark_set("path_start", line_start) - self.mark_set("path_end", line_end) - path = self.get("path_start", "path_end") - from_loc = path.find('from ') - colon_loc = path.find(': ') - if 0 <= from_loc and ((colon_loc == -1) or (from_loc < colon_loc)): - path = path[from_loc + 5:] - if 0 <= colon_loc: - path = path[:colon_loc] - if 0 <= path.find('\\') or 0 <= path.find('/'): # make sure it really contains a path - open_file(path) - - def _file_save_as(self): - self.filename = fileDialog.asksaveasfilename(defaultextension='.txt') - f = open(self.filename, 'w') - f.write(self.get('1.0', 'end')) - f.close() - - def copy(self, event): - try: - selection = self.get(*self.tag_ranges('sel')) - self.clipboard_clear() - self.clipboard_append(selection) - except TypeError: - pass - - def cut(self, event): - try: - selection = self.get(*self.tag_ranges('sel')) - self.clipboard_clear() - self.clipboard_append(selection) - self.delete(*self.tag_ranges('sel')) - except TypeError: - pass - - def _show_popup(self, event): - '''right-click popup menu''' - - if self.root.focus_get() != self: - self.root.focus_set() - - try: - self.popup.tk_popup(event.x_root, event.y_root, 0) - finally: - self.popup.grab_release() - - def _cut(self): - try: - selection = self.get(*self.tag_ranges('sel')) - self.clipboard_clear() - self.clipboard_append(selection) - self.delete(*self.tag_ranges('sel')) - except TypeError: - pass - - def cut(self, event): - self._cut() - - def _copy(self): - - try: - selection = self.get(*self.tag_ranges('sel')) - self.clipboard_clear() - self.clipboard_append(selection) - except TypeError: - pass - - def copy(self, event): - self._copy() - - def _paste(self): - self.insert('insert', self.selection_get(selection='CLIPBOARD')) - - def _select_all(self): - self.tag_add('sel', '1.0', 'end') - - def select_all(self, event): - self.tag_add('sel', '1.0', 'end') - - def _clear_all(self): - #'''erases all text''' - # - #isok = askokcancel('Clear All', 'Erase all text?', frame=self, - # default='ok') - #if isok: - # self.delete('1.0', 'end') - self.delete('1.0', 'end') - -# end - output_window - - -def main(): - - ########################################################################## - # # - # main program # - # # - ########################################################################## - - global build_type - global target_env - global board_name - - board_name, Marlin_ver = get_board_name() - - target_env = get_env(board_name, Marlin_ver) - - # Re-use the VSCode terminal, if possible - if os.environ.get('PLATFORMIO_CALLER', '') == 'vscode': - sys_PIO() - else: - auto_build = output_window() - auto_build.start_thread() # executes the "run_PIO" function - - auto_build.root.mainloop() - - -if __name__ == '__main__': - - main() diff --git a/buildroot/tests/.gitattributes b/buildroot/tests/.gitattributes deleted file mode 100644 index 6313b56c57..0000000000 --- a/buildroot/tests/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/buildroot/tests/ARMED-tests b/buildroot/tests/ARMED-tests deleted file mode 100644 index e5959a4383..0000000000 --- a/buildroot/tests/ARMED-tests +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F1 ARMED -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -use_example_configs ArmEd -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2208 -exec_test $1 $2 "ArmEd Example Configuration with mixed TMC Drivers" - -# clean up -restore_configs diff --git a/buildroot/tests/BIGTREE_BTT002-tests b/buildroot/tests/BIGTREE_BTT002-tests deleted file mode 100644 index 64e6322eca..0000000000 --- a/buildroot/tests/BIGTREE_BTT002-tests +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F407VGT6 BigTreeTech BTT002 V1.0 -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_BTT_BTT002_V1_0 -opt_set SERIAL_PORT 1 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -exec_test $1 $2 "BigTreeTech BTT002 Default Configuration plus TMC steppers" - -# clean up -restore_configs diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests deleted file mode 100644 index e8d47562aa..0000000000 --- a/buildroot/tests/BIGTREE_GTR_V1_0-tests +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for BigTreeTech GTR 1.0 -# - -# exit on first failure -set -e - -restore_configs -opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 -opt_set SERIAL_PORT -1 -opt_set EXTRUDERS 8 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 -opt_set TEMP_SENSOR_5 1 -opt_set TEMP_SENSOR_6 1 -opt_set TEMP_SENSOR_7 1 -# Not necessary to enable auto-fan for all extruders to hit problematic code paths -opt_set E0_AUTO_FAN_PIN PC10 -opt_set E1_AUTO_FAN_PIN PC11 -opt_set E2_AUTO_FAN_PIN PC12 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2130 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -exec_test $1 $2 "BigTreeTech GTR 8 Extruders with Auto-Fan and Mixed TMC Drivers" - -restore_configs -opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 -opt_set SERIAL_PORT -1 -opt_set EXTRUDERS 6 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 -opt_set TEMP_SENSOR_5 1 -opt_set NUM_Z_STEPPER_DRIVERS 3 -opt_set DEFAULT_Kp_LIST "{ 22.2, 20.0, 21.0, 19.0, 18.0, 17.0 }" -opt_set DEFAULT_Ki_LIST "{ 1.08 }" -opt_set DEFAULT_Kd_LIST "{ 114.0, 112.0, 110.0, 108.0 }" -opt_enable TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_MIGRATION_FEATURE TOOLCHANGE_FS_INIT_BEFORE_SWAP TOOLCHANGE_FS_PRIME_FIRST_USED PID_PARAMS_PER_HOTEND -exec_test $1 $2 "BigTreeTech GTR 6 Extruders Triple Z" - -# clean up -restore_configs diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO-tests deleted file mode 100644 index 1295f5858c..0000000000 --- a/buildroot/tests/BIGTREE_SKR_PRO-tests +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F407ZG BigTreeTech SKR Pro -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 -opt_set SERIAL_PORT 1 -exec_test $1 $2 "BigTreeTech SKR Pro Default Configuration" - -restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 -opt_set SERIAL_PORT -1 -opt_set EXTRUDERS 3 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set E0_AUTO_FAN_PIN PC10 -opt_set E1_AUTO_FAN_PIN PC11 -opt_set E2_AUTO_FAN_PIN PC12 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING -exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" - -# clean up -restore_configs diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests deleted file mode 100755 index 7f488f6126..0000000000 --- a/buildroot/tests/DUE-tests +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for DUE (Atmel SAM3X8E ARM Cortex-M3) -# - -# exit on first failure -set -e - -restore_configs -opt_set LCD_LANGUAGE bg -opt_set MOTHERBOARD BOARD_RAMPS4DUE_EFB -opt_set TEMP_SENSOR_0 -2 -opt_set TEMP_SENSOR_BED 2 -opt_set GRID_MAX_POINTS_X 16 -opt_set FANMUX0_PIN 53 -opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING ASSISTED_TRAMMING \ - EEPROM_SETTINGS SDSUPPORT BINARY_FILE_TRANSFER \ - BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ - NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ - NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_DISTANCE_MM FILAMENT_RUNOUT_SENSOR \ - AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ - SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE CALIBRATION_GCODE \ - BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \ - FWRETRACT ARC_SUPPORT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ - PSU_CONTROL AUTO_POWER_CONTROL \ - PIDTEMPBED SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER \ - PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL \ - EXTENSIBLE_UI -opt_add EXTUI_EXAMPLE -opt_set E0_AUTO_FAN_PIN 8 -opt_set EXTRUDER_AUTO_FAN_SPEED 100 -opt_set TEMP_SENSOR_CHAMBER 3 -opt_add TEMP_CHAMBER_PIN 6 -opt_set HEATER_CHAMBER_PIN 45 -exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options." - -restore_configs -opt_set MOTHERBOARD BOARD_RADDS -opt_enable USE_XMAX_PLUG USE_YMAX_PLUG ENDSTOPPULLUPS BLTOUCH AUTO_BED_LEVELING_BILINEAR \ - Z_MULTI_ENDSTOPS Z_STEPPER_AUTO_ALIGN Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS \ - Z_SAFE_HOMING - #TOUCH_UI_FTDI_EVE LCD_ALEPHOBJECTS_CLCD_UI OTHER_PIN_LAYOUT -opt_set NUM_Z_STEPPER_DRIVERS 3 -opt_add Z2_MAX_ENDSTOP_INVERTING false -opt_add Z3_MAX_ENDSTOP_INVERTING false -opt_add Z2_MAX_PIN 2 -opt_add Z3_MAX_PIN 3 -pins_set ramps/RAMPS X_MAX_PIN -1 -pins_set ramps/RAMPS Y_MAX_PIN -1 -exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN" - -# -# Test SWITCHING_EXTRUDER -# -restore_configs -opt_set LCD_LANGUAGE fi -opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF -opt_set EXTRUDERS 2 -opt_set NUM_SERVOS 1 -opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER BEEP_ON_FEEDRATE_CHANGE POWER_LOSS_RECOVERY -exec_test $1 $2 "RAMPS4DUE_EEF with SWITCHING_EXTRUDER, POWER_LOSS_RECOVERY" diff --git a/buildroot/tests/FLYF407ZG-tests b/buildroot/tests/FLYF407ZG-tests deleted file mode 100644 index f1a65da6cb..0000000000 --- a/buildroot/tests/FLYF407ZG-tests +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for FLYF407ZG -# - -# exit on first failure -set -e - -# Build examples -restore_configs -opt_set MOTHERBOARD BOARD_FLYF407ZG -opt_set SERIAL_PORT -1 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2130 -exec_test $1 $2 "FLYF407ZG Default Config with mixed TMC Drivers" - -# cleanup -restore_configs diff --git a/buildroot/tests/FYSETC_F6_13-tests b/buildroot/tests/FYSETC_F6_13-tests deleted file mode 100644 index 631a117785..0000000000 --- a/buildroot/tests/FYSETC_F6_13-tests +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for AVR ATmega FYSETC F6 1.3 -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_FYSETC_F6_13 -opt_enable DGUS_LCD_UI_FYSETC -exec_test $1 $2 "FYSETC F6 1.3 with DGUS" - -# clean up -restore_configs diff --git a/buildroot/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6-tests deleted file mode 100644 index c75629156b..0000000000 --- a/buildroot/tests/FYSETC_S6-tests +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for FYSETC_S6 -# - -# exit on first failure -set -e - -# Build examples -restore_configs -use_example_configs FYSETC/S6 -opt_set Y_DRIVER_TYPE TMC2209 -opt_set Z_DRIVER_TYPE TMC2130 -exec_test $1 $2 "FYSETC S6 Example" - -# cleanup -restore_configs diff --git a/buildroot/tests/LERDGEX-tests b/buildroot/tests/LERDGEX-tests deleted file mode 100644 index c2d72e0d77..0000000000 --- a/buildroot/tests/LERDGEX-tests +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for LERDGEX environment -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_LERDGE_X -opt_set SERIAL_PORT 1 -exec_test $1 $2 "LERDGE X with Default Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests deleted file mode 100755 index 2f206f02f2..0000000000 --- a/buildroot/tests/LPC1768-tests +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for LPC1768 (NXP ARM Cortex-M3) -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -#restore_configs -#opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB -#exec_test $1 $2 "Default Configuration" - -restore_configs -opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB -opt_enable VIKI2 SDSUPPORT SDCARD_READONLY SERIAL_PORT_2 NEOPIXEL_LED -opt_set NEOPIXEL_PIN P1_16 -exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), NeoPixel" - -#restore_configs -#use_example_configs Mks/Sbase -#exec_test $1 $2 "MKS SBASE Example Config" - -restore_configs -opt_set MOTHERBOARD BOARD_MKS_SBASE -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_set NUM_SERVOS 2 -opt_set SERVO_DELAY "{ 300, 300 }" -opt_enable SWITCHING_NOZZLE SWITCHING_NOZZLE_E1_SERVO_NR ULTIMAKERCONTROLLER -exec_test $1 $2 "MKS SBASE with SWITCHING_NOZZLE" - -restore_configs -opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 -1 -opt_set TEMP_SENSOR_BED 5 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ - FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING \ - NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ - PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ - Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ - HOST_KEEPALIVE_FEATURE HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT \ - LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER -opt_set GRID_MAX_POINTS_X 16 -opt_set NOZZLE_TO_PROBE_OFFSET "{ 0, 0, 0 }" -exec_test $1 $2 "Re-ARM with NOZZLE_AS_PROBE and many features." - -# clean up -restore_configs diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests deleted file mode 100755 index 4314b0d5ff..0000000000 --- a/buildroot/tests/LPC1769-tests +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for LPC1769 (NXP ARM Cortex-M3) -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -use_example_configs Azteeg/X5GT -exec_test $1 $2 "Azteeg X5GT Example Configuration" - -restore_configs -opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 -1 -opt_set TEMP_SENSOR_BED 5 -opt_enable VIKI2 SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ - FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ - PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ - Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ - LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER -opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Smoothieboard with many features" - -restore_configs -opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 -1 -opt_set TEMP_SENSOR_BED 5 -opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ - FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET \ - PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ - Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ - LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER -opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI" - -#restore_configs -#opt_set MOTHERBOARD BOARD_AZTEEG_X5_MINI_WIFI -#opt_enable COREYX USE_XMAX_PLUG DAC_MOTOR_CURRENT_DEFAULT \ -# REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT BABYSTEPPING \ -# AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS \ -# FILAMENT_LCD_DISPLAY FILAMENT_WIDTH_SENSOR FAN_SOFT_PWM \ -# SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER FAN_KICKSTART_TIME \ -# SD_ABORT_ON_ENDSTOP_HIT ADVANCED_OK GCODE_MACROS \ -# VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS \ -# EXTRA_FAN_SPEED FWRETRACT MENU_ADDAUTOSTART SDCARD_SORT_ALPHA -#opt_set FAN_MIN_PWM 50 -#opt_set FAN_KICKSTART_TIME 100 -#opt_set XY_FREQUENCY_LIMIT 15 -#exec_test $1 $2 "Azteeg X5 MINI WIFI Many less common options" - -restore_configs -use_example_configs delta/generic -opt_set MOTHERBOARD BOARD_COHESION3D_REMIX -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130 -opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT MECHANICAL_GANTRY_CALIBRATION \ - TMC_USE_SW_SPI MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z HYBRID_THRESHOLD \ - SENSORLESS_PROBING Z_SAFE_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY Z_STALL_SENSITIVITY TMC_DEBUG \ - EXPERIMENTAL_I2CBUS -opt_disable PSU_CONTROL -exec_test $1 $2 "Cohesion3D Remix DELTA + ABL Bilinear + EEPROM + SENSORLESS_PROBING" - -# clean up -restore_configs diff --git a/buildroot/tests/SAMD51_grandcentral_m4-tests b/buildroot/tests/SAMD51_grandcentral_m4-tests deleted file mode 100644 index fbaf5fb7e5..0000000000 --- a/buildroot/tests/SAMD51_grandcentral_m4-tests +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for Adafruit Grand Central M4 (ATMEL ARM Cortex-M4) -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set SERIAL_PORT -1 -opt_set MOTHERBOARD BOARD_AGCM4_RAMPS_144 -opt_set TEMP_SENSOR_0 11 -opt_set TEMP_SENSOR_BED 11 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2209 -opt_set Z_DRIVER_TYPE TMC2209 -opt_set Z2_DRIVER_TYPE TMC2209 -opt_set E0_DRIVER_TYPE TMC2209 -opt_set RESTORE_LEVELING_AFTER_G28 false -opt_set LCD_LANGUAGE it -opt_set NUM_Z_STEPPER_DRIVERS 2 -opt_set HOMING_BUMP_MM "{ 0, 0, 0 }" -opt_set SDCARD_CONNECTION LCD -opt_enable ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION BLTOUCH Z_MIN_PROBE_REPEATABILITY_TEST \ - FILAMENT_RUNOUT_SENSOR G26_MESH_VALIDATION MESH_EDIT_GFX_OVERLAY Z_SAFE_HOMING \ - EEPROM_SETTINGS NOZZLE_PARK_FEATURE SDSUPPORT SD_CHECK_AND_RETRY \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER Z_STEPPER_AUTO_ALIGN ADAPTIVE_STEP_SMOOTHING \ - STATUS_MESSAGE_SCROLLING LCD_SET_PROGRESS_MANUALLY SHOW_REMAINING_TIME USE_M73_REMAINING_TIME \ - LONG_FILENAME_HOST_SUPPORT SCROLL_LONG_FILENAMES BABYSTEPPING DOUBLECLICK_FOR_Z_BABYSTEPPING \ - MOVE_Z_WHEN_IDLE BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ - LIN_ADVANCE ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE MONITOR_DRIVER_STATUS SENSORLESS_HOMING \ - SQUARE_WAVE_STEPPING TMC_DEBUG EXPERIMENTAL_SCURVE -exec_test $1 $2 "Build Grand Central M4 Default Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan-tests deleted file mode 100644 index 20bd111fa9..0000000000 --- a/buildroot/tests/STM32F070CB_malyan-tests +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F070CB Malyan M200 v2 -# - -# exit on first failure -set -e - -restore_configs -opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 -opt_set SERIAL_PORT -1 -exec_test $1 $2 "Malyan M200 v2 Default Config" - -# cleanup -restore_configs diff --git a/buildroot/tests/STM32F070RB_malyan-tests b/buildroot/tests/STM32F070RB_malyan-tests deleted file mode 100644 index 58237a70eb..0000000000 --- a/buildroot/tests/STM32F070RB_malyan-tests +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F070RB Malyan M200 v2 -# - -# exit on first failure -set -e - -restore_configs -opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 -opt_set SERIAL_PORT -1 -exec_test $1 $2 "Malyan M200 v2 Default Config" - -# cleanup -restore_configs diff --git a/buildroot/tests/STM32F103CB_malyan-tests b/buildroot/tests/STM32F103CB_malyan-tests deleted file mode 100644 index e594cb43db..0000000000 --- a/buildroot/tests/STM32F103CB_malyan-tests +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103CB Malyan M200 -# - -# exit on first failure -set -e - -use_example_configs Malyan/M200 -exec_test $1 $2 "Malyan M200" - -# cleanup -restore_configs diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests deleted file mode 100644 index ad15ee7237..0000000000 --- a/buildroot/tests/STM32F103RC_btt-tests +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103RC BigTreeTech (SKR Mini E3) -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2209 -opt_set Z_DRIVER_TYPE TMC2209 -opt_set E0_DRIVER_TYPE TMC2209 -opt_set X_SLAVE_ADDRESS 0 -opt_set Y_SLAVE_ADDRESS 1 -opt_set Z_SLAVE_ADDRESS 2 -opt_set E0_SLAVE_ADDRESS 3 - -exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" - -# clean up -restore_configs diff --git a/buildroot/tests/STM32F103RC_btt_USB-tests b/buildroot/tests/STM32F103RC_btt_USB-tests deleted file mode 100644 index 8f7fff0b32..0000000000 --- a/buildroot/tests/STM32F103RC_btt_USB-tests +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103RC BigTreeTech (SKR Mini v1.1) -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -exec_test $1 $2 "BigTreeTech SKR Mini v1.1 - Basic Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/STM32F103RC_fysetc-tests b/buildroot/tests/STM32F103RC_fysetc-tests deleted file mode 100644 index dfa85d9bb6..0000000000 --- a/buildroot/tests/STM32F103RC_fysetc-tests +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103RC FYSETC -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -use_example_configs "Creality/Ender-3/FYSETC Cheetah 1.2/base" -exec_test $1 $2 "Cheetah 1.2 Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/STM32F103RC_meeb-tests b/buildroot/tests/STM32F103RC_meeb-tests deleted file mode 100644 index 74e770d3c8..0000000000 --- a/buildroot/tests/STM32F103RC_meeb-tests +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103RC MEEB_3DP (ccrobot-online.com) -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_CCROBOT_MEEB_3DP -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2208 -opt_set Z_DRIVER_TYPE TMC2208 -opt_set E0_DRIVER_TYPE TMC2208 -exec_test $1 $2 "MEEB_3DP - Basic Config with TMC2208 SW Serial" - -# clean up -restore_configs diff --git a/buildroot/tests/STM32F103RE-tests b/buildroot/tests/STM32F103RE-tests deleted file mode 100755 index 63fe5ba393..0000000000 --- a/buildroot/tests/STM32F103RE-tests +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103RE -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_STM32F103RE -opt_set EXTRUDERS 2 -opt_set SERIAL_PORT -1 -opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT \ - PAREN_COMMENTS GCODE_MOTION_MODES SINGLENOZZLE TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_PARK \ - BAUD_RATE_GCODE GCODE_MACROS NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE -exec_test $1 $2 "STM32F1R EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT PAREN_COMMENTS GCODE_MOTION_MODES" - -# cleanup -restore_configs diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests deleted file mode 100644 index ca723c7aa2..0000000000 --- a/buildroot/tests/STM32F103RET6_creality-tests +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103RET6_creality -# - -# exit on first failure -set -e - -# -# Build with configs included in the PR -# -use_example_configs "Creality/Ender-3 V2" -opt_enable MARLIN_DEV_MODE -exec_test $1 $2 "Ender 3 v2" - -restore_configs diff --git a/buildroot/tests/STM32F103RE_btt-tests b/buildroot/tests/STM32F103RE_btt-tests deleted file mode 100644 index 9a829a553e..0000000000 --- a/buildroot/tests/STM32F103RE_btt-tests +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103RE BigTreeTech (SKR E3 DIP v1.0) -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Config with mixed TMC Drivers" - -# clean up -restore_configs diff --git a/buildroot/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB-tests deleted file mode 100644 index 77751d776e..0000000000 --- a/buildroot/tests/STM32F103RE_btt_USB-tests +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103RE BigTreeTech (SKR E3 DIP v1.0) -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/STM32F103VE_longer-tests b/buildroot/tests/STM32F103VE_longer-tests deleted file mode 100755 index 85b22c1284..0000000000 --- a/buildroot/tests/STM32F103VE_longer-tests +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103VET6 -# - -# exit on first failure -set -e - -use_example_configs Alfawise/U20 -opt_set MOTHERBOARD BOARD_LONGER3D_LK -opt_set SERIAL_PORT 1 -opt_enable BAUD_RATE_GCODE -exec_test $1 $2 "Full-featured U20 config" - -# cleanup -restore_configs diff --git a/buildroot/tests/STM32F4-tests b/buildroot/tests/STM32F4-tests deleted file mode 100644 index b5beb73663..0000000000 --- a/buildroot/tests/STM32F4-tests +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F4 disco_f407vg -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -use_example_configs STM32/STM32F4 -exec_test $1 $2 "STM32F4 Default Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/STM32F401VE_STEVAL-tests b/buildroot/tests/STM32F401VE_STEVAL-tests deleted file mode 100644 index 2811014c13..0000000000 --- a/buildroot/tests/STM32F401VE_STEVAL-tests +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F401VE_STEVAL -# - -# exit on first failure -set -e - -# Build examples -restore_configs -opt_set MOTHERBOARD BOARD_STEVAL_3DP001V1 -opt_set SERIAL_PORT -1 -exec_test $1 $2 "STM32F401VE_STEVAL Default Config" - -# cleanup -restore_configs diff --git a/buildroot/tests/STM32F407VE_black-tests b/buildroot/tests/STM32F407VE_black-tests deleted file mode 100755 index 908382ec2a..0000000000 --- a/buildroot/tests/STM32F407VE_black-tests +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F407VET6 -# - -# exit on first failure -set -e - -restore_configs -use_example_configs STM32/Black_STM32F407VET6 -opt_enable BAUD_RATE_GCODE -exec_test $1 $2 "Full-featured Sample Black STM32F407VET6 config" - -# cleanup -restore_configs diff --git a/buildroot/tests/STM32F7-tests b/buildroot/tests/STM32F7-tests deleted file mode 100644 index 281222f156..0000000000 --- a/buildroot/tests/STM32F7-tests +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F7 -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_REMRAM_V1 -opt_set SERIAL_PORT 1 -exec_test $1 $2 "Default Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/at90usb1286_cdc-tests b/buildroot/tests/at90usb1286_cdc-tests deleted file mode 100644 index 812e2ebcae..0000000000 --- a/buildroot/tests/at90usb1286_cdc-tests +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for AT90USB1286 ARMED -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_BRAINWAVE_PRO -exec_test $1 $2 "Default Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/at90usb1286_dfu-tests b/buildroot/tests/at90usb1286_dfu-tests deleted file mode 100644 index 7571994ec4..0000000000 --- a/buildroot/tests/at90usb1286_dfu-tests +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for AT90USB1286 ARMED -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_PRINTRBOARD -exec_test $1 $2 "Default Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32-tests deleted file mode 100755 index 204e7aa708..0000000000 --- a/buildroot/tests/esp32-tests +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for ESP32 -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 -opt_enable WIFISUPPORT WEBSUPPORT GCODE_MACROS BAUD_RATE_GCODE M115_GEOMETRY_REPORT REPETIER_GCODE_M360 -opt_add WIFI_SSID "\"ssid\"" -opt_add WIFI_PWD "\"password\"" -opt_set TX_BUFFER_SIZE 64 -exec_test $1 $2 "ESP32 with WIFISUPPORT and WEBSUPPORT" - -# -# Build with TMC drivers using hardware serial -# -restore_configs -opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2208 -opt_set Z_DRIVER_TYPE TMC2209 -opt_set E0_DRIVER_TYPE TMC2209 -opt_set X_HARDWARE_SERIAL Serial1 -opt_set Y_HARDWARE_SERIAL Serial1 -opt_set Z_HARDWARE_SERIAL Serial1 -opt_set E0_HARDWARE_SERIAL Serial1 -opt_set X_SLAVE_ADDRESS 0 -opt_set Y_SLAVE_ADDRESS 1 -opt_set Z_SLAVE_ADDRESS 2 -opt_set E0_SLAVE_ADDRESS 3 -opt_enable HOTEND_IDLE_TIMEOUT -exec_test $1 $2 "ESP32, TMC HW Serial, Hotend Idle" - -# cleanup -restore_configs diff --git a/buildroot/tests/jgaurora_a5s_a1-tests b/buildroot/tests/jgaurora_a5s_a1-tests deleted file mode 100644 index c6cc9e3f9c..0000000000 --- a/buildroot/tests/jgaurora_a5s_a1-tests +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F103ZE JGAurora A5S A1 -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -use_example_configs JGAurora/A5S -exec_test $1 $2 "JGAurora/A5S Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/linux_native-tests b/buildroot/tests/linux_native-tests deleted file mode 100755 index 38f531dadc..0000000000 --- a/buildroot/tests/linux_native-tests +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for Linux x86_64 -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_LINUX_RAMPS -opt_set TEMP_SENSOR_BED 1 -opt_enable PIDTEMPBED EEPROM_SETTINGS BAUD_RATE_GCODE -exec_test $1 $2 "Linux with EEPROM" - -# cleanup -restore_configs diff --git a/buildroot/tests/malyan_M300-tests b/buildroot/tests/malyan_M300-tests deleted file mode 100755 index 1955accaa5..0000000000 --- a/buildroot/tests/malyan_M300-tests +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F070CB Malyan M300 -# - -# exit on first failure -set -e - -restore_configs -use_example_configs "delta/Malyan M300" -opt_disable AUTO_BED_LEVELING_3POINT -opt_set LCD_SERIAL_PORT 1 -exec_test $1 $2 "Malyan M300 (delta)" - -# cleanup -restore_configs diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests deleted file mode 100644 index ce13d4a6e8..0000000000 --- a/buildroot/tests/mega1280-tests +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for AVR ATmega1280 -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -#restore_configs -#exec_test $1 $2 "Default Configuration" - -# -# Test MESH_BED_LEVELING feature, with LCD -# -restore_configs -opt_set LCD_LANGUAGE an -opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING \ - EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ - SENSORLESS_BACKOFF_MM HOMING_BACKOFF_POST_MM HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ - MESH_BED_LEVELING ENABLE_LEVELING_FADE_HEIGHT MESH_G28_REST_ORIGIN \ - G26_MESH_VALIDATION MESH_EDIT_MENU GCODE_QUOTED_STRINGS \ - EXTERNAL_CLOSED_LOOP_CONTROLLER POWER_MONITOR_CURRENT POWER_MONITOR_VOLTAGE -opt_set POWER_MONITOR_CURRENT_PIN 14 -opt_set POWER_MONITOR_VOLTAGE_PIN 15 -opt_set CLOSED_LOOP_ENABLE_PIN 44 -opt_set CLOSED_LOOP_MOVE_COMPLETE_PIN 45 -exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, Power Monitor, and LCD" - -# -# Test DUAL_X_CARRIAGE -# -restore_configs -opt_set MOTHERBOARD BOARD_TT_OSCAR -opt_set LCD_LANGUAGE pt -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_enable USE_XMAX_PLUG DUAL_X_CARRIAGE REPRAPWORLD_KEYPAD -opt_set REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 -exec_test $1 $2 "TT Oscar | DUAL_X_CARRIAGE" - -# -# Delta Config (generic) + Probeless -# -use_example_configs delta/generic -opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_AUTO_CALIBRATION DELTA_CALIBRATION_MENU -exec_test $1 $2 "RAMPS | DELTA | RRD LCD | DELTA_AUTO_CALIBRATION | DELTA_CALIBRATION_MENU" - -# -# Delta Config (generic) + ABL bilinear + BLTOUCH -use_example_configs delta/generic -opt_set LCD_LANGUAGE cz -opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_CALIBRATION_MENU AUTO_BED_LEVELING_BILINEAR BLTOUCH -exec_test $1 $2 "DELTA | RRD LCD | ABL Bilinear | BLTOUCH" - -# clean up -restore_configs diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests deleted file mode 100755 index d3fd5c0192..0000000000 --- a/buildroot/tests/mega2560-tests +++ /dev/null @@ -1,327 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for AVR ATmega2560 -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -#restore_configs -#exec_test $1 $2 "Default Configuration" - -# -# Test a probeless build of AUTO_BED_LEVELING_UBL, with lots of extruders -# -use_example_configs AnimationExample -opt_set SHOW_CUSTOM_BOOTSCREEN -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set LCD_LANGUAGE fr -opt_set EXTRUDERS 5 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 5 -opt_set TEMP_SENSOR_3 20 -opt_set TEMP_SENSOR_4 1000 -opt_set TEMP_SENSOR_BED 1 -opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ - SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS \ - EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ - MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \ - LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ - BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL -exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE ..." - -# -# Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language -# -use_example_configs AnimationExample -opt_set SHOW_CUSTOM_BOOTSCREEN -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set LCD_LANGUAGE fr -opt_set EXTRUDERS 5 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 5 -opt_set TEMP_SENSOR_3 20 -opt_set TEMP_SENSOR_4 1000 -opt_set TEMP_SENSOR_BED 1 -opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ - SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS \ - EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ - MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ - LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ - BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ - Z_PROBE_SLED SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE -opt_set LCD_LANGUAGE jp_kana -opt_disable SEGMENT_LEVELED_MOVES -opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL M114_DETAIL -exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sled Probe | Skew | JP-Kana | Babystep offsets ..." - -# -# Test a Servo Probe -# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES -# -restore_configs -opt_set LCD_LANGUAGE zh_CN -opt_set EXTRUDERS 5 -opt_set NUM_SERVOS 1 -opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ - AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ - NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ - PRUSA_MMU2 MMU2_MENUS PRUSA_MMU2_S_MODE DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ - FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING -exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2 | Servo | 3-Point + Debug | G38 ..." - -# -# Test MINIRAMBO with PWM_MOTOR_CURRENT and many features -# -restore_configs -opt_set MOTHERBOARD BOARD_MEGACONTROLLER -opt_set LCD_LANGUAGE de -opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT \ - MINIPANEL SDSUPPORT PCA9632 LCD_INFO_MENU \ - AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY LCD_BED_LEVELING G26_MESH_VALIDATION MESH_EDIT_MENU \ - LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ - INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT EXPERIMENTAL_I2CBUS M100_FREE_MEMORY_WATCHER \ - NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE \ - ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES \ - PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 M114_DETAIL \ - USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE -opt_set CONTROLLERFAN_SPEED_IDLE 128 -opt_add M100_FREE_MEMORY_DUMPER -opt_add M100_FREE_MEMORY_CORRUPTOR -opt_set PWM_MOTOR_CURRENT "{ 1300, 1300, 1250 }" -opt_set I2C_SLAVE_ADDRESS 63 -exec_test $1 $2 "MEGACONTROLLER | Minipanel | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." - -# -# Mixing Extruder with 5 steppers, Greek -# -restore_configs -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set LCD_LANGUAGE el_gr -opt_enable MIXING_EXTRUDER GRADIENT_MIX GRADIENT_VTOOL CR10_STOCKDISPLAY \ - USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_IGNORE_Z -opt_set MIXING_STEPPERS 5 -opt_set LCD_LANGUAGE ru -exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" - -# -# Test SPEAKER with BOARD_BQ_ZUM_MEGA_3D and BQ_LCD_SMART_CONTROLLER -# -#restore_configs -#opt_set MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D -#opt_set LCD_FEEDBACK_FREQUENCY_DURATION_MS 10 -#opt_set LCD_FEEDBACK_FREQUENCY_HZ 100 -#opt_enable BQ_LCD_SMART_CONTROLLER SPEAKER - -# -# Enable COREXY -# -#restore_configs -#opt_enable COREXY -#exec_test $1 $2 "Stuff" - -# -# Test many less common options -# -restore_configs -opt_set MOTHERBOARD BOARD_MIGHTYBOARD_REVE -opt_set TEMP_SENSOR_0 -2 -opt_set DIGIPOT_I2C_NUM_CHANNELS 5 -opt_set LCD_LANGUAGE it -opt_set MIXING_STEPPERS 2 -opt_set SERVO_DELAY "{ 300, 300, 300 }" -opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ - BABYSTEPPING BABYSTEP_DISPLAY_TOTAL FILAMENT_LCD_DISPLAY \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER MENU_ADDAUTOSTART SDSUPPORT SDCARD_SORT_ALPHA \ - ENDSTOP_NOISE_THRESHOLD FAN_SOFT_PWM \ - FIX_MOUNTED_PROBE AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE FILAMENT_WIDTH_SENSOR PROBE_OFFSET_WIZARD \ - Z_SAFE_HOMING SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER \ - SD_ABORT_ON_ENDSTOP_HIT HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT ADVANCED_OK M114_DETAIL \ - VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS EXTRA_FAN_SPEED FWRETRACT \ - USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_USE_Z_ONLY -opt_set FAN_MIN_PWM 50 -opt_set FAN_KICKSTART_TIME 100 -opt_set XY_FREQUENCY_LIMIT 15 -opt_add FILWIDTH_PIN 5 -exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home Y > X | FW Retract ..." - -######## Other Standard LCD/Panels ############## -# -# ULTRA_LCD -# -#restore_configs -#opt_enable ULTRA_LCD -#exec_test $1 $2 "Stuff" -# -# DOGLCD -# -#restore_configs -#opt_enable DOGLCD -#exec_test $1 $2 "Stuff" -# -# MAKRPANEL -# Needs to use Melzi and Sanguino hardware -# -#restore_configs -#opt_enable MAKRPANEL -#exec_test $1 $2 "Stuff" -# -# REPRAP_DISCOUNT_SMART_CONTROLLER, SDSUPPORT, BABYSTEPPING, RIGIDBOARD_V2, and DAC_MOTOR_CURRENT_DEFAULT -# -#restore_configs -#opt_set MOTHERBOARD BOARD_RIGIDBOARD_V2 -#opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT BABYSTEPPING DAC_MOTOR_CURRENT_DEFAULT -#exec_test $1 $2 "Stuff" -# # -# G3D_PANEL with SDCARD_SORT_ALPHA and STATUS_MESSAGE_SCROLLING -# -#restore_configs -#opt_enable G3D_PANEL SDSUPPORT SDCARD_SORT_ALPHA STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES -#opt_set SDSORT_GCODE true -#opt_set SDSORT_USES_RAM true -#opt_set SDSORT_USES_STACK true -#opt_set SDSORT_CACHE_NAMES true -#exec_test $1 $2 "Stuff" -# -# REPRAPWORLD_KEYPAD -# -# Cant find configuration details to get it to compile -#restore_configs -#opt_enable ULTRA_LCD REPRAPWORLD_KEYPAD REPRAPWORLD_KEYPAD_MOVE_STEP -#exec_test $1 $2 "Stuff" -# -# RA_CONTROL_PANEL -# -#restore_configs -#opt_enable RA_CONTROL_PANEL PINS_DEBUGGING -#exec_test $1 $2 "Stuff" - -######## I2C LCD/PANELS ############## -# -# !!!ATTENTION!!! -# Most I2C configurations are failing at the moment because they require -# a different Liquid Crystal library "LiquidTWI2". -# -# LCD_SAINSMART_I2C_1602 -# -#restore_configs -#opt_enable LCD_SAINSMART_I2C_1602 -#exec_test $1 $2 "Stuff" -# -# LCD_I2C_PANELOLU2 -# -#restore_configs -#opt_enable LCD_I2C_PANELOLU2 -#exec_test $1 $2 "Stuff" -# -# LCD_I2C_VIKI -# -#restore_configs -#opt_enable LCD_I2C_VIKI -#exec_test $1 $2 "Stuff" -# -# LCM1602 -# -#restore_configs -#opt_enable LCM1602 -#exec_test $1 $2 "Stuff" - -# -# Language files test with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -# -#restore_configs -#opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done -# -#restore_configs -#opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT -#for lang in an bg ca cz da de el el_gr en es eu fi fr gl hr hu it jp_kana nl pl pt pt_br ro ru sk tr uk vi zh_CN zh_TW test; do opt_set LCD_LANGUAGE $lang; echo "compile with language $lang ..."; exec_test $1 $2 "Stuff"; done - -######## Example Configurations ############## -# -# Test a full-featured CR-10S config -# -use_example_configs Creality/CR-10S -exec_test $1 $2 "Full-featured CR-10S config" - -# -# BQ Hephestos 2 -#restore_configs -#use_example_configs Hephestos_2 -#exec_test $1 $2 "Stuff" - -# -# Delta Config (generic) + UBL + ALLEN_KEY + EEPROM_SETTINGS + OLED_PANEL_TINYBOY2 -# -use_example_configs delta/generic -opt_enable RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS EEPROM_CHITCHAT \ - Z_PROBE_ALLEN_KEY AUTO_BED_LEVELING_UBL \ - OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY DELTA_CALIBRATION_MENU -opt_set LCD_LANGUAGE ko_KR -opt_set X_DRIVER_TYPE L6470 -opt_set Y_DRIVER_TYPE L6470 -opt_set Z_DRIVER_TYPE L6470 -opt_add L6470_CHAIN_SCK_PIN 53 -opt_add L6470_CHAIN_MISO_PIN 49 -opt_add L6470_CHAIN_MOSI_PIN 40 -opt_add L6470_CHAIN_SS_PIN 42 -opt_add "ENABLE_RESET_L64XX_CHIPS(V) NOOP" -exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." - -# -# Delta Config (FLSUN AC because it's complex) -# -use_example_configs delta/FLSUN/auto_calibrate -exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" - -# -# Makibox Config need to check board type for Teensy++ 2.0 -# -#use_example_configs makibox -#exec_test $1 $2 "Stuff" - -# -# Test mixed TMC config -# -restore_configs -opt_set LCD_LANGUAGE vi -opt_set X_DRIVER_TYPE TMC2160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set Z_DRIVER_TYPE TMC2208_STANDALONE -opt_set E0_DRIVER_TYPE TMC2130 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ - MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE \ - MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD \ - USE_ZMIN_PLUG SENSORLESS_HOMING TMC_DEBUG M114_DETAIL -exec_test $1 $2 "RAMPS | Mixed TMC | Sensorless | RRDFGSC | Games" - -# -# SCARA with Mixed TMC -# -use_example_configs SCARA/Morgan -opt_set LCD_LANGUAGE es -opt_enable USE_ZMIN_PLUG FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR PAUSE_BEFORE_DEPLOY_STOW \ - MKS_12864OLED EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL Z_SAFE_HOMING \ - STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD SENSORLESS_HOMING SQUARE_WAVE_STEPPING -opt_set X_MAX_ENDSTOP_INVERTING false -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130_STANDALONE -opt_set E0_DRIVER_TYPE TMC2660 -exec_test $1 $2 "RAMPS | SCARA | Mixed TMC | EEPROM" - -# -# tvrrug Config need to check board type for sanguino atmega644p -# -#use_example_configs tvrrug/Round2 -#exec_test $1 $2 "Stuff" - -# clean up -restore_configs diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin-tests deleted file mode 100644 index d635062205..0000000000 --- a/buildroot/tests/mks_robin-tests +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for MKS Robin -# (STM32F1 genericSTM32F103ZE) -# - -# exit on first failure -set -e - -use_example_configs Mks/Robin -opt_disable TFT_320x240 -opt_enable FSMC_GRAPHICAL_TFT -exec_test $1 $2 "MKS Robin base configuration" - -# cleanup -restore_configs diff --git a/buildroot/tests/mks_robin_lite-tests b/buildroot/tests/mks_robin_lite-tests deleted file mode 100644 index 34809641ec..0000000000 --- a/buildroot/tests/mks_robin_lite-tests +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for STM32F1 genericSTM32F103RC -# - -# exit on first failure -set -e - -restore_configs -opt_set MOTHERBOARD BOARD_MKS_ROBIN_LITE -opt_set SERIAL_PORT -1 -opt_enable EEPROM_SETTINGS -opt_enable SDSUPPORT -exec_test $1 $2 "Default Configuration with Fallback SD EEPROM" - -# cleanup -restore_configs diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini-tests deleted file mode 100644 index 1c40ea4535..0000000000 --- a/buildroot/tests/mks_robin_mini-tests +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for MKS Robin mini -# (STM32F1 genericSTM32F103VE) -# - -# exit on first failure -set -e - -use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_MINI -opt_set EXTRUDERS 1 -opt_set TEMP_SENSOR_1 0 -exec_test $1 $2 "MKS Robin mini" - -# cleanup -restore_configs diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests deleted file mode 100644 index 92c97be756..0000000000 --- a/buildroot/tests/mks_robin_nano35-tests +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for MKS Robin nano -# (STM32F1 genericSTM32F103VE) -# - -# exit on first failure -set -e - -use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -opt_disable TFT_320x240 -opt_enable TOUCH_SCREEN -opt_enable FSMC_GRAPHICAL_TFT -exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" - -use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 -opt_disable TFT_320x240 -opt_enable TOUCH_SCREEN -opt_enable SPI_GRAPHICAL_TFT -exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" - -use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO -opt_disable TFT_320x240 -opt_disable TOUCH_SCREEN -opt_enable TFT_LVGL_UI_FSMC -exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" - -use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 -opt_disable TFT_320x240 -opt_disable TOUCH_SCREEN -opt_enable TFT_LVGL_UI_SPI -exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" - -use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 -opt_disable TFT_320x240 -opt_enable TOUCH_SCREEN -opt_enable TFT_480x320_SPI -exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" - -# cleanup -restore_configs diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests deleted file mode 100644 index 7ae4670fed..0000000000 --- a/buildroot/tests/mks_robin_pro-tests +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for MKS Robin Pro -# - -# exit on first failure -set -e - -use_example_configs Mks/Robin_Pro -opt_enable EMERGENCY_PARSER -opt_set SDCARD_CONNECTION LCD -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set TEMP_SENSOR_BED 1 -opt_disable THERMAL_PROTECTION_HOTENDS -exec_test $1 $2 "MKS Robin Pro with TMC Drivers, hotend thermal protection disabled" - -# cleanup -#restore_configs diff --git a/buildroot/tests/mks_robin_stm32-tests b/buildroot/tests/mks_robin_stm32-tests deleted file mode 100644 index 4aa146fa52..0000000000 --- a/buildroot/tests/mks_robin_stm32-tests +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for MKS Robin (HAL/STM32) -# - -# exit on first failure -set -e - -use_example_configs Mks/Robin -exec_test $1 $2 "MKS Robin base configuration" - -# cleanup -restore_configs diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests deleted file mode 100644 index ec8af16c23..0000000000 --- a/buildroot/tests/rambo-tests +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for AVR ATmega2560 RAMBo -# - -# exit on first failure -set -e - -# -# Lots of options - Formerly the first Mega2560 test -# -restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_0 -2 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_BED 2 -opt_set TEMP_SENSOR_PROBE 1 -opt_add TEMP_PROBE_PIN 12 -opt_set TEMP_SENSOR_CHAMBER 3 -opt_add TEMP_CHAMBER_PIN 3 -opt_add HEATER_CHAMBER_PIN 45 -opt_set GRID_MAX_POINTS_X 16 -opt_set FANMUX0_PIN 53 -opt_disable USE_WATCHDOG -opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ - PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ - EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ - BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ - NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ - PID_PARAMS_PER_HOTEND PID_AUTOTUNE_MENU PID_EDIT_MENU LCD_SHOW_E_TOTAL \ - PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 LEVEL_BED_CORNERS \ - NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR FILAMENT_RUNOUT_DISTANCE_MM \ - ADVANCED_PAUSE_FEATURE FILAMENT_LOAD_UNLOAD_GCODES FILAMENT_UNLOAD_ALL_EXTRUDERS \ - PASSWORD_FEATURE PASSWORD_ON_STARTUP PASSWORD_ON_SD_PRINT_MENU PASSWORD_AFTER_SD_PRINT_END PASSWORD_AFTER_SD_PRINT_ABORT \ - AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DISTINCT_E_FACTORS \ - SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ - BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \ - FWRETRACT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ - PSU_CONTROL AUTO_POWER_CONTROL POWER_LOSS_RECOVERY POWER_LOSS_PIN POWER_LOSS_STATE \ - SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ - HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL -opt_add DEBUG_POWER_LOSS_RECOVERY -exec_test $1 $2 "RAMBO | EXTRUDERS 2 | CHAR LCD + SD | FIX Probe | ABL-Linear | Advanced Pause | PLR | LEDs ..." - -# -# Full size Rambo Dual Endstop CNC -# -restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set EXTRUDERS 0 -opt_set TEMP_SENSOR_0 999 -opt_set DUMMY_THERMISTOR_999_VALUE 170 -opt_set DIGIPOT_MOTOR_CURRENT '{ 120, 120, 120, 120, 120 }' -opt_enable USE_XMAX_PLUG USE_YMAX_PLUG USE_ZMAX_PLUG \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER REVERSE_ENCODER_DIRECTION SDSUPPORT EEPROM_SETTINGS \ - S_CURVE_ACCELERATION X_DUAL_STEPPER_DRIVERS X_DUAL_ENDSTOPS Y_DUAL_STEPPER_DRIVERS Y_DUAL_ENDSTOPS \ - ADAPTIVE_STEP_SMOOTHING CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES -opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS -exec_test $1 $2 "Rambo CNC Configuration" - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_EINSY_RAMBO -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130 -opt_set E0_DRIVER_TYPE TMC2130 -exec_test $1 $2 "Einsy RAMBo with TMC2130" - -# clean up -restore_configs diff --git a/buildroot/tests/rumba32-tests b/buildroot/tests/rumba32-tests deleted file mode 100644 index 42f9beb9af..0000000000 --- a/buildroot/tests/rumba32-tests +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for rumba32 -# - -# exit on first failure -set -e - -# Build examples -restore_configs -opt_set MOTHERBOARD BOARD_RUMBA32_V1_0 -opt_set SERIAL_PORT -1 -opt_disable PIDTEMP -opt_enable PIDTEMPBED -opt_set TEMP_SENSOR_BED 1 -opt_disable THERMAL_PROTECTION_BED -opt_set X_DRIVER_TYPE TMC2130 -exec_test $1 $2 "RUMBA32 V1.0 with TMC2130, PID Bed, and bed thermal protection disabled" - -# Build examples -restore_configs -opt_set MOTHERBOARD BOARD_RUMBA32_V1_1 -opt_set SERIAL_PORT -1 -opt_enable PIDTEMPBED EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -opt_set TEMP_SENSOR_BED 1 -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2208 -exec_test $1 $2 "RUMBA32 V1.1 with TMC2130, TMC2208, PID Bed, EEPROM settings, and graphic LCD controller" - -# Build examples -restore_configs -opt_set MOTHERBOARD BOARD_RUMBA32_MKS -opt_set SERIAL_PORT -1 -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2208 -exec_test $1 $2 "RUMBA32 MKS Default Config with Mixed TMC Drivers" - -# cleanup -restore_configs diff --git a/buildroot/tests/run_tests b/buildroot/tests/run_tests deleted file mode 100755 index d01107f45a..0000000000 --- a/buildroot/tests/run_tests +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash -# -# run_tests -# -export PATH="$PATH:$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )" -export PATH="$PATH:./buildroot/bin" - -# exit on first failure -set -e - -exec_test () { - printf "\n\033[0;32m[Test $2] \033[0m$3...\n" - if platformio run --project-dir $1 -e $2 --silent; then - printf "\033[0;32mPassed\033[0m\n" - return 0 - else - git reset --hard HEAD - printf "\033[0;31mFailed!\033[0m\n" - return 1 - fi -} -export -f exec_test - -printf "Running \033[0;32m$2\033[0m Tests\n" - -if [[ $2 = "ALL" ]]; then - dir_list=("$(dirname "${BASH_SOURCE[0]}")"/*) - declare -a tests=(${dir_list[@]/*run_tests/}) - for f in "${tests[@]}"; do - testenv=$(basename $f | cut -d"-" -f1) - printf "Running \033[0;32m$f\033[0m Tests\n" - exec_test $1 "$testenv --target clean" "Setup Build Environment" - $f $1 $testenv - git reset --hard HEAD - done -else - exec_test $1 "$2 --target clean" "Setup Build Environment" - $2-tests $1 $2 - git reset --hard HEAD -fi -printf "\033[0;32mAll tests completed successfully\033[0m\n" diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p-tests deleted file mode 100644 index 7181f961c4..0000000000 --- a/buildroot/tests/sanguino1284p-tests +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for AVR ATmega 1284p -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 -exec_test $1 $2 "Default Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/sanguino644p-tests b/buildroot/tests/sanguino644p-tests deleted file mode 100644 index 41626b23f7..0000000000 --- a/buildroot/tests/sanguino644p-tests +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for AVR ATmega 644p -# - -# exit on first failure -set -e - -# -# Build with the default configurations -# -restore_configs -opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 -exec_test $1 $2 "Default Configuration" - -# clean up -restore_configs diff --git a/buildroot/tests/teensy31-tests b/buildroot/tests/teensy31-tests deleted file mode 100755 index be377b15af..0000000000 --- a/buildroot/tests/teensy31-tests +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for Teensy 3.1/3.2 (ARM Cortex-M4) -# - -# exit on first failure -set -e - -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY31_32 -exec_test $1 $2 "Teensy3.1 with default config" - -# -# Test many features together -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY31_32 -opt_set TEMP_SENSOR_0 1 -opt_set TEMP_SENSOR_BED 1 -opt_enable EEPROM_SETTINGS FILAMENT_WIDTH_SENSOR CALIBRATION_GCODE BAUD_RATE_GCODE \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR DEBUG_LEVELING_FEATURE Z_MIN_PROBE_REPEATABILITY_TEST \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET PRINTCOUNTER SLOW_PWM_HEATERS PIDTEMPBED \ - INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER \ - NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE PARK_HEAD_ON_PAUSE \ - ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES \ - PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ - HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT -opt_set I2C_SLAVE_ADDRESS 63 -opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Teensy3.1 with many features" diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35-tests deleted file mode 100755 index c729f212a4..0000000000 --- a/buildroot/tests/teensy35-tests +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for Teensy 3.5/3.6 (ARM Cortex-M4) -# - -# exit on first failure -set -e - -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -exec_test $1 $2 "Teensy3.5 with default config" - -# -# Test as many features together as possible -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_0 1 -opt_set TEMP_SENSOR_1 5 -opt_set TEMP_SENSOR_BED 1 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ - FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ - PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER \ - ADVANCED_PAUSE_FEATURE ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES PARK_HEAD_ON_PAUSE \ - PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ - HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT -opt_set I2C_SLAVE_ADDRESS 63 -opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Teensy3.5 with many features" - -# -# Test a Sled Z Probe with Linear leveling -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_enable EEPROM_SETTINGS Z_PROBE_SLED Z_SAFE_HOMING AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE GCODE_MACROS -exec_test $1 $2 "Sled Z Probe with Linear leveling" - -# -# Test a Servo Probe -# -# restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY35_36 -# opt_enable Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE \ -# AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS -# opt_set NUM_SERVOS 1 -# exec_test $1 $2 "Servo Probe" -# -# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES -# -# opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS \ -# EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES -# exec_test $1 $2 "...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES" - -# -# Test MAGNETIC_PARKING_EXTRUDER with LCD -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_enable MAGNETIC_PARKING_EXTRUDER ULTIMAKERCONTROLLER -exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" - -# -# Mixing Extruder -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -opt_set MIXING_STEPPERS 2 -exec_test $1 $2 "Mixing Extruder" - -# -# Test SWITCHING_EXTRUDER -# -# restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY35_36 -# opt_set EXTRUDERS 2 -# opt_set NUM_SERVOS 1 -# opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER -# exec_test $1 $2 "SWITCHING_EXTRUDER" - -# -# Enable COREXY -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_enable COREXY -opt_set X_DRIVER_TYPE TMC5160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true -opt_add X_CS_PIN 46 -opt_add Y_CS_PIN 47 -opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING -exec_test $1 $2 "Teensy 3.5/3.6 COREXY" - -# -# Enable COREXZ -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_enable COREXZ -exec_test $1 $2 "Teensy 3.5/3.6 COREXZ" - -# -# Enable Dual Z with Dual Z endstops -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_enable Z_MULTI_ENDSTOPS -opt_set NUM_Z_STEPPER_DRIVERS 2 -pins_set ramps/RAMPS X_MAX_PIN -1 -opt_add Z2_MAX_PIN 2 -opt_enable USE_XMAX_PLUG -exec_test $1 $2 "Dual Z with Dual Z endstops" - -# Clean up -restore_configs diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests deleted file mode 100644 index 8d32d131e9..0000000000 --- a/buildroot/tests/teensy41-tests +++ /dev/null @@ -1,124 +0,0 @@ -#!/usr/bin/env bash -# -# Build tests for Teensy 4.0/4.1 (ARM Cortex-M7) -# - -# exit on first failure -set -e - -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -exec_test $1 $2 "Teensy4.1 with default config" - -# -# Test as many features together as possible -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_0 1 -opt_set TEMP_SENSOR_1 5 -opt_set TEMP_SENSOR_BED 1 -opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ - FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET \ - PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ - ADVANCED_PAUSE_FEATURE ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES PARK_HEAD_ON_PAUSE \ - PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ - HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT -opt_add EXTUI_EXAMPLE -opt_set I2C_SLAVE_ADDRESS 63 -opt_set GRID_MAX_POINTS_X 16 -exec_test $1 $2 "Teensy4.1 with many features" - -# -# Test a Sled Z Probe with Linear leveling -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_enable EEPROM_SETTINGS Z_PROBE_SLED Z_SAFE_HOMING AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE GCODE_MACROS -exec_test $1 $2 "Sled Z Probe with Linear leveling" - -# -# Test a Servo Probe -# -# restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY41 -# opt_enable Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE \ -# AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS -# opt_set NUM_SERVOS 1 -# exec_test $1 $2 "Servo Probe" -# -# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES -# -# opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS \ -# EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES -# exec_test $1 $2 "...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES" - -# -# Test MAGNETIC_PARKING_EXTRUDER with LCD -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_enable MAGNETIC_PARKING_EXTRUDER -exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" - -# -# Mixing Extruder -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL -opt_set MIXING_STEPPERS 2 -exec_test $1 $2 "Mixing Extruder" - -# -# Test SWITCHING_EXTRUDER -# -# restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY41 -# opt_set EXTRUDERS 2 -# opt_set NUM_SERVOS 1 -# opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER -# exec_test $1 $2 "SWITCHING_EXTRUDER" - -# -# Enable COREXY -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_enable COREXY -opt_set X_DRIVER_TYPE TMC5160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true -opt_add X_CS_PIN 46 -opt_add Y_CS_PIN 47 -opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING -exec_test $1 $2 "Teensy 4.0/4.1 COREXY" - -# -# Enable COREXZ -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_enable COREXZ -exec_test $1 $2 "Teensy 4.0/4.1 COREXZ" - -# -# Enable Dual Z with Dual Z endstops -# -restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_enable Z_MULTI_ENDSTOPS -opt_set NUM_Z_STEPPER_DRIVERS 2 -pins_set ramps/RAMPS X_MAX_PIN -1 -opt_add Z2_MAX_PIN 2 -opt_enable USE_XMAX_PLUG -exec_test $1 $2 "Dual Z with Dual Z endstops" - -# Clean up -restore_configs diff --git a/config/README.md b/config/README.md deleted file mode 100644 index 68cbe1a786..0000000000 --- a/config/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Where have all the configurations gone? - -## https://github.com/MarlinFirmware/Configurations/archive/release-2.0.7.2.zip diff --git a/data/www/index.html b/data/www/index.html deleted file mode 100644 index d3291de8de..0000000000 --- a/data/www/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - Marlin - - - - - - -
- - - -
-
-
    - -
    -
    - - -
    -
    -
    -
    - - -
    -
    - #controls -
    -
    -
    - - diff --git a/data/www/marlin-logo.png b/data/www/marlin-logo.png deleted file mode 100644 index d0ce790141..0000000000 Binary files a/data/www/marlin-logo.png and /dev/null differ diff --git a/data/www/marlin.css b/data/www/marlin.css deleted file mode 100644 index b29ec2e24c..0000000000 --- a/data/www/marlin.css +++ /dev/null @@ -1,166 +0,0 @@ -/* CSS reset */ - -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; - font-family: Impact, Charcoal, sans-serif; - } -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; - } -body { line-height: 1; } -ol, ul { list-style: none; } -blockquote, q { quotes: none; } -blockquote:before, blockquote:after, -q:before, q:after { content: ''; content: none; } -table { - border-collapse: collapse; - border-spacing: 0; - } - -/* Custom */ - -/* Tabs */ -* { box-sizing: border-box; } -body { - display: flex; - justify-content: center; - padding: 0px; - background: #1e1e1e; - color: #efefef; - } -h1 { - margin: 0; - font-size: 2em; - } -.tabs { - display: flex; - width: 100%; - flex-wrap: wrap; - background: #e5e5e5; - } -.input { - position: absolute; - opacity: 0; - } -.label { - width: 100%; - padding: 18px 28px; - background: #e5e5e5; - cursor: pointer; - font-weight: bold; - font-size: 18px; - color: #7f7f7f; - transition: background 0.1s, color 0.1s; - border-style: solid; - border-width: 0 0 4px 0; - border-color: #acacac; - } -.label:hover { - background: #d8d8d8; - } -.label:active { - background: #ccc; - } -.input:focus + .label { - z-index: 1; - } -.input:checked + .label { - background: #1e1e1e; - color: #efefef; - border-width: 4px 0 0 0; - border-color: #65a57d; - } -.panel { - display: none; - width: 100%; - padding: 20px 30px 30px; - background: #1e1e1e; - color: #e5e5e5; - } -.panel .panel-content { - width: 100%; - max-width: 800px; - } - -@media (min-width: 600px) { - .label { width: auto; } - .panel { order: 99; } -} - -.input:checked + .label + .panel { display: block; } - -#logo { - width: 130px; - height: 58px; - margin-right: 20px; - background: url(marlin-logo.png) no-repeat center center; - } - -input[type="text"], textarea { - background-color: #2c2c2c; - border: solid 2px #314b3b; - color: #e5e5e5; - outline: none; - } - -input[type="text"]:focus, textarea:focus { - border-color: #4d7a5e; - } - -ul#serial-output { - width: 100%; - height: 300px; - overflow-y: scroll; - background-color: #2c2c2c; - border: solid 2px #314b3b; - } - -ul#serial-output li { - padding: 4px; - font-family: "Lucida Console", Monaco, monospace; - font-size: 0.8em; - } - -ul#serial-output li:nth-child(odd) { - background-color: #3c3c3c; - } - -div.form-wrapper { - display: flex; - width: 100%; - margin: 6px 0; - } - -div.form-wrapper input { - font-size: 1.2em; - padding: 4px 6px; - } - -div.form-wrapper input[type="text"] { - flex: 1 1 auto; - } - -div.form-wrapper input[type="submit"], -div.form-wrapper button { - border: solid 2px #314b3b; - background-color: #4d7a5e; - color: #e5e5e5; - } diff --git a/data/www/marlin.js b/data/www/marlin.js deleted file mode 100644 index 0a95045aff..0000000000 --- a/data/www/marlin.js +++ /dev/null @@ -1,24 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - const ws = new WebSocket(`ws://${location.host}/ws`); - - ws.onmessage = (e) => { - if (typeof e.data === 'string') { - let node = document.createElement('li'); - let text = document.createTextNode(e.data); - node.appendChild(text); - document.getElementById('serial-output').appendChild(node); - } - }; - - document.getElementById('serial-command-form').addEventListener('submit', (e) => { - e.preventDefault(); - - let value = document.getElementById('serial-command').value.trim(); - - if (!value) return; - - ws.send(`${value}\n`); - - document.getElementById('serial-command').value = ''; - }); -}); diff --git a/frameworks/CMSIS/LPC1768/driver/debug_frmwrk.c b/frameworks/CMSIS/LPC1768/driver/debug_frmwrk.c new file mode 100644 index 0000000000..62e9b00016 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/debug_frmwrk.c @@ -0,0 +1,306 @@ +/********************************************************************** +* $Id$ debug_frmwrk.c 2010-05-21 +* +* @file debug_frmwrk.c +* @brief Contains some utilities that used for debugging through UART +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +#include "debug_frmwrk.h" +#include "lpc17xx_pinsel.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ + #include "lpc17xx_libcfg.h" +#else + #include "lpc17xx_libcfg_default.h" +#endif + +#ifdef _DBGFWK + +/* Debug framework */ +static Bool debug_frmwrk_initialized = FALSE; + +void (*_db_msg)(LPC_UART_TypeDef *UARTx, const void *s) = UARTPuts; +void (*_db_msg_)(LPC_UART_TypeDef *UARTx, const void *s) = UARTPuts_; +void (*_db_char)(LPC_UART_TypeDef *UARTx, uint8_t ch) = UARTPutChar; +void (*_db_dec)(LPC_UART_TypeDef *UARTx, uint8_t decn) = UARTPutHex; +void (*_db_dec_16)(LPC_UART_TypeDef *UARTx, uint16_t decn) = UARTPutHex16; +void (*_db_dec_32)(LPC_UART_TypeDef *UARTx, uint32_t decn) = UARTPutHex32; +void (*_db_hex)(LPC_UART_TypeDef *UARTx, uint8_t hexn) = UARTPutDec; +void (*_db_hex_16)(LPC_UART_TypeDef *UARTx, uint16_t hexn) = UARTPutDec16; +void (*_db_hex_32)(LPC_UART_TypeDef *UARTx, uint32_t hexn) = UARTPutDec32; +uint8_t (*_db_get_char)(LPC_UART_TypeDef *UARTx) = UARTGetChar; + + +/*********************************************************************//** + * @brief Puts a character to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] ch Character to put + * @return None + **********************************************************************/ +void UARTPutChar(LPC_UART_TypeDef *UARTx, uint8_t ch) { + if (debug_frmwrk_initialized) + UART_Send(UARTx, &ch, 1, BLOCKING); +} + +/*********************************************************************//** + * @brief Get a character to UART port + * @param[in] UARTx Pointer to UART peripheral + * @return character value that returned + **********************************************************************/ +uint8_t UARTGetChar(LPC_UART_TypeDef *UARTx) { + uint8_t tmp = 0; + + if (debug_frmwrk_initialized) + UART_Receive(UARTx, &tmp, 1, BLOCKING); + + return(tmp); +} + +/*********************************************************************//** + * @brief Puts a string to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] str string to put + * @return None + **********************************************************************/ +void UARTPuts(LPC_UART_TypeDef *UARTx, const void *str) { + if (!debug_frmwrk_initialized) return; + + uint8_t *s = (uint8_t*)str; + while (*s) UARTPutChar(UARTx, *s++); +} + +/*********************************************************************//** + * @brief Puts a string to UART port and print new line + * @param[in] UARTx Pointer to UART peripheral + * @param[in] str String to put + * @return None + **********************************************************************/ +void UARTPuts_(LPC_UART_TypeDef *UARTx, const void *str) { + if (!debug_frmwrk_initialized) return; + + UARTPuts (UARTx, str); + UARTPuts (UARTx, "\n\r"); +} + +/*********************************************************************//** + * @brief Puts a decimal number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] decnum Decimal number (8-bit long) + * @return None + **********************************************************************/ +void UARTPutDec(LPC_UART_TypeDef *UARTx, uint8_t decnum) { + if (!debug_frmwrk_initialized) return; + + uint8_t c1 = decnum%10; + uint8_t c2 = (decnum / 10) % 10; + uint8_t c3 = (decnum / 100) % 10; + UARTPutChar(UARTx, '0'+c3); + UARTPutChar(UARTx, '0'+c2); + UARTPutChar(UARTx, '0'+c1); +} + +/*********************************************************************//** + * @brief Puts a decimal number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] decnum Decimal number (8-bit long) + * @return None + **********************************************************************/ +void UARTPutDec16(LPC_UART_TypeDef *UARTx, uint16_t decnum) { + if (!debug_frmwrk_initialized) return; + + uint8_t c1 = decnum%10; + uint8_t c2 = (decnum / 10) % 10; + uint8_t c3 = (decnum / 100) % 10; + uint8_t c4 = (decnum / 1000) % 10; + uint8_t c5 = (decnum / 10000) % 10; + UARTPutChar(UARTx, '0'+c5); + UARTPutChar(UARTx, '0'+c4); + UARTPutChar(UARTx, '0'+c3); + UARTPutChar(UARTx, '0'+c2); + UARTPutChar(UARTx, '0'+c1); +} + +/*********************************************************************//** + * @brief Puts a decimal number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] decnum Decimal number (8-bit long) + * @return None + **********************************************************************/ +void UARTPutDec32(LPC_UART_TypeDef *UARTx, uint32_t decnum) { + if (!debug_frmwrk_initialized) return; + + const uint8_t c1 = decnum % 10, + c2 = (decnum / 10) % 10, + c3 = (decnum / 100) % 10, + c4 = (decnum / 1000) % 10, + c5 = (decnum / 10000) % 10, + c6 = (decnum / 100000) % 10, + c7 = (decnum / 1000000) % 10, + c8 = (decnum / 10000000) % 10, + c9 = (decnum / 100000000) % 10, + c10 = (decnum / 1000000000) % 10; + UARTPutChar(UARTx, '0' + c10); + UARTPutChar(UARTx, '0' + c9); + UARTPutChar(UARTx, '0' + c8); + UARTPutChar(UARTx, '0' + c7); + UARTPutChar(UARTx, '0' + c6); + UARTPutChar(UARTx, '0' + c5); + UARTPutChar(UARTx, '0' + c4); + UARTPutChar(UARTx, '0' + c3); + UARTPutChar(UARTx, '0' + c2); + UARTPutChar(UARTx, '0' + c1); +} + +/*********************************************************************//** + * @brief Puts a hex number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] hexnum Hex number (8-bit long) + * @return None + **********************************************************************/ +void UARTPutHex(LPC_UART_TypeDef *UARTx, uint8_t hexnum) { + if (!debug_frmwrk_initialized) return; + + UARTPuts(UARTx, "0x"); + uint8_t nibble, i = 1; + do { + nibble = (hexnum >> (4 * i)) & 0x0F; + UARTPutChar(UARTx, (nibble > 9) ? ('A' + nibble - 10) : ('0' + nibble)); + } while (i--); +} + +/*********************************************************************//** + * @brief Puts a hex number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] hexnum Hex number (16-bit long) + * @return None + **********************************************************************/ +void UARTPutHex16(LPC_UART_TypeDef *UARTx, uint16_t hexnum) { + if (!debug_frmwrk_initialized) return; + + UARTPuts(UARTx, "0x"); + uint8_t nibble, i = 3; + do { + nibble = (hexnum >> (4 * i)) & 0x0F; + UARTPutChar(UARTx, (nibble > 9) ? ('A' + nibble - 10) : ('0' + nibble)); + } while (i--); +} + +/*********************************************************************//** + * @brief Puts a hex number to UART port + * @param[in] UARTx Pointer to UART peripheral + * @param[in] hexnum Hex number (32-bit long) + * @return None + **********************************************************************/ +void UARTPutHex32(LPC_UART_TypeDef *UARTx, uint32_t hexnum) { + if (!debug_frmwrk_initialized) return; + + UARTPuts(UARTx, "0x"); + uint8_t nibble, i = 7; + do { + nibble = (hexnum >> (4 * i)) & 0x0F; + UARTPutChar(UARTx, (nibble > 9) ? ('A' + nibble - 10) : ('0' + nibble)); + } while (i--); +} + +/*********************************************************************//** + * @brief print function that supports format as same as printf() + * function of library + * @param[in] None + * @return None + **********************************************************************/ +//void _printf (const char *format, ...) { +// static char buffer[512 + 1]; +// va_list vArgs; +// char *tmp; +// va_start(vArgs, format); +// vsprintf((char *)buffer, (char const *)format, vArgs); +// va_end(vArgs); +// +// _DBG(buffer); +//} + +/*********************************************************************//** + * @brief Initialize Debug frame work through initializing UART port + * @param[in] None + * @return None + **********************************************************************/ +void debug_frmwrk_init(void) { + UART_CFG_Type UARTConfigStruct; + PINSEL_CFG_Type PinCfg; + + #if (USED_UART_DEBUG_PORT==0) + /* + * Initialize UART0 pin connect + */ + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 2; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 3; + PINSEL_ConfigPin(&PinCfg); + + #elif (USED_UART_DEBUG_PORT==1) + /* + * Initialize UART1 pin connect + */ + PinCfg.Funcnum = 1; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = 15; + PinCfg.Portnum = 0; + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum = 16; + PINSEL_ConfigPin(&PinCfg); + #endif + + /* Initialize UART Configuration parameter structure to default state: + * Baudrate = 9600bps + * 8 data bit + * 1 Stop bit + * None parity + */ + UART_ConfigStructInit(&UARTConfigStruct); + + // Re-configure baudrate to 115200bps + UARTConfigStruct.Baud_rate = 115200; + + // Initialize DEBUG_UART_PORT peripheral with given to corresponding parameter + UART_Init((LPC_UART_TypeDef *)DEBUG_UART_PORT, &UARTConfigStruct); + + // Enable UART Transmit + UART_TxCmd((LPC_UART_TypeDef *)DEBUG_UART_PORT, ENABLE); + + debug_frmwrk_initialized = TRUE; +} + +#endif // _DBGFWK diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_adc.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_adc.c new file mode 100644 index 0000000000..2b6574c39a --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_adc.c @@ -0,0 +1,358 @@ +/********************************************************************** +* $Id$ lpc17xx_adc.c 2010-06-18 +*//** +* @file lpc17xx_adc.c +* @brief Contains all functions support for ADC firmware library on LPC17xx +* @version 3.1 +* @date 26. July. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup ADC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_adc.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _ADC + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup ADC_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Initial for ADC + * + Set bit PCADC + * + Set clock for ADC + * + Set Clock Frequency + * @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC + * @param[in] rate ADC conversion rate, should be <=200KHz + * @return None + **********************************************************************/ +void ADC_Init(LPC_ADC_TypeDef *ADCx, uint32_t rate) +{ + uint32_t ADCPClk, temp, tmp; + + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_RATE(rate)); + + // Turn on power and clock + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCAD, ENABLE); + + ADCx->ADCR = 0; + + //Enable PDN bit + tmp = ADC_CR_PDN; + // Set clock frequency + ADCPClk = CLKPWR_GetPCLK(CLKPWR_PCLKSEL_ADC); + /* The APB clock (PCLK_ADC0) is divided by (CLKDIV+1) to produce the clock for + * A/D converter, which should be less than or equal to 13MHz. + * A fully conversion requires 65 of these clocks. + * ADC clock = PCLK_ADC0 / (CLKDIV + 1); + * ADC rate = ADC clock / 65; + */ + temp = rate * 65; + temp = (ADCPClk * 2 + temp)/(2 * temp) - 1; //get the round value by fomular: (2*A + B)/(2*B) + tmp |= ADC_CR_CLKDIV(temp); + + ADCx->ADCR = tmp; +} + + +/*********************************************************************//** +* @brief Close ADC +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @return None +**********************************************************************/ +void ADC_DeInit(LPC_ADC_TypeDef *ADCx) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + if (ADCx->ADCR & ADC_CR_START_MASK) //need to stop START bits before DeInit + ADCx->ADCR &= ~ADC_CR_START_MASK; + // Clear SEL bits + ADCx->ADCR &= ~0xFF; + // Clear PDN bit + ADCx->ADCR &= ~ADC_CR_PDN; + // Turn on power and clock + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCAD, DISABLE); +} + + +/*********************************************************************//** +* @brief Get Result conversion from A/D data register +* @param[in] channel number which want to read back the result +* @return Result of conversion +*********************************************************************/ +uint32_t ADC_GetData(uint32_t channel) +{ + uint32_t adc_value; + + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel)); + + adc_value = *(uint32_t *)((&LPC_ADC->ADDR0) + channel); + return ADC_GDR_RESULT(adc_value); +} + +/*********************************************************************//** +* @brief Set start mode for ADC +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] start_mode Start mode choose one of modes in +* 'ADC_START_OPT' enumeration type definition, should be: +* - ADC_START_CONTINUOUS +* - ADC_START_NOW +* - ADC_START_ON_EINT0 +* - ADC_START_ON_CAP01 +* - ADC_START_ON_MAT01 +* - ADC_START_ON_MAT03 +* - ADC_START_ON_MAT10 +* - ADC_START_ON_MAT11 +* @return None +*********************************************************************/ +void ADC_StartCmd(LPC_ADC_TypeDef *ADCx, uint8_t start_mode) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_START_OPT(start_mode)); + + ADCx->ADCR &= ~ADC_CR_START_MASK; + ADCx->ADCR |=ADC_CR_START_MODE_SEL((uint32_t)start_mode); +} + + +/*********************************************************************//** +* @brief ADC Burst mode setting +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] NewState +* - 1: Set Burst mode +* - 0: reset Burst mode +* @return None +**********************************************************************/ +void ADC_BurstCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + + ADCx->ADCR &= ~ADC_CR_BURST; + if (NewState){ + ADCx->ADCR |= ADC_CR_BURST; + } +} + +/*********************************************************************//** +* @brief Set AD conversion in power mode +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] NewState +* - 1: AD converter is optional +* - 0: AD Converter is in power down mode +* @return None +**********************************************************************/ +void ADC_PowerdownCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + + ADCx->ADCR &= ~ADC_CR_PDN; + if (NewState){ + ADCx->ADCR |= ADC_CR_PDN; + } +} + +/*********************************************************************//** +* @brief Set Edge start configuration +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] EdgeOption is ADC_START_ON_RISING and ADC_START_ON_FALLING +* 0:ADC_START_ON_RISING +* 1:ADC_START_ON_FALLING +* @return None +**********************************************************************/ +void ADC_EdgeStartConfig(LPC_ADC_TypeDef *ADCx, uint8_t EdgeOption) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_START_ON_EDGE_OPT(EdgeOption)); + + ADCx->ADCR &= ~ADC_CR_EDGE; + if (EdgeOption){ + ADCx->ADCR |= ADC_CR_EDGE; + } +} + +/*********************************************************************//** +* @brief ADC interrupt configuration +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] IntType: type of interrupt, should be: +* - ADC_ADINTEN0: Interrupt channel 0 +* - ADC_ADINTEN1: Interrupt channel 1 +* ... +* - ADC_ADINTEN7: Interrupt channel 7 +* - ADC_ADGINTEN: Individual channel/global flag done generate an interrupt +* @param[in] NewState: +* - SET : enable ADC interrupt +* - RESET: disable ADC interrupt +* @return None +**********************************************************************/ +void ADC_IntConfig (LPC_ADC_TypeDef *ADCx, ADC_TYPE_INT_OPT IntType, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_TYPE_INT_OPT(IntType)); + + ADCx->ADINTEN &= ~ADC_INTEN_CH(IntType); + if (NewState){ + ADCx->ADINTEN |= ADC_INTEN_CH(IntType); + } +} + +/*********************************************************************//** +* @brief Enable/Disable ADC channel number +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] Channel channel number +* @param[in] NewState Enable or Disable +* +* @return None +**********************************************************************/ +void ADC_ChannelCmd (LPC_ADC_TypeDef *ADCx, uint8_t Channel, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(Channel)); + + if (NewState == ENABLE) { + ADCx->ADCR |= ADC_CR_CH_SEL(Channel); + } else { + if (ADCx->ADCR & ADC_CR_START_MASK) //need to stop START bits before disable channel + ADCx->ADCR &= ~ADC_CR_START_MASK; + ADCx->ADCR &= ~ADC_CR_CH_SEL(Channel); + } +} + +/*********************************************************************//** +* @brief Get ADC result +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] channel: channel number, should be 0...7 +* @return Data conversion +**********************************************************************/ +uint16_t ADC_ChannelGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel) +{ + uint32_t adc_value; + + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel)); + + adc_value = *(uint32_t *) ((&ADCx->ADDR0) + channel); + return ADC_DR_RESULT(adc_value); +} + +/*********************************************************************//** +* @brief Get ADC Chanel status from ADC data register +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] channel: channel number, should be 0..7 +* @param[in] StatusType +* 0:Burst status +* 1:Done status +* @return SET / RESET +**********************************************************************/ +FlagStatus ADC_ChannelGetStatus(LPC_ADC_TypeDef *ADCx, uint8_t channel, uint32_t StatusType) +{ + uint32_t temp; + + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel)); + CHECK_PARAM(PARAM_ADC_DATA_STATUS(StatusType)); + + temp = *(uint32_t *) ((&ADCx->ADDR0) + channel); + if (StatusType) { + temp &= ADC_DR_DONE_FLAG; + }else{ + temp &= ADC_DR_OVERRUN_FLAG; + } + if (temp) { + return SET; + } else { + return RESET; + } + +} + +/*********************************************************************//** +* @brief Get ADC Data from AD Global register +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @return Result of conversion +**********************************************************************/ +uint32_t ADC_GlobalGetData(LPC_ADC_TypeDef *ADCx) +{ + CHECK_PARAM(PARAM_ADCx(ADCx)); + + return ((uint32_t)(ADCx->ADGDR)); +} + +/*********************************************************************//** +* @brief Get ADC Chanel status from AD global data register +* @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC +* @param[in] StatusType +* 0:Burst status +* 1:Done status +* @return SET / RESET +**********************************************************************/ +FlagStatus ADC_GlobalGetStatus(LPC_ADC_TypeDef *ADCx, uint32_t StatusType) +{ + uint32_t temp; + + CHECK_PARAM(PARAM_ADCx(ADCx)); + CHECK_PARAM(PARAM_ADC_DATA_STATUS(StatusType)); + + temp = ADCx->ADGDR; + if (StatusType){ + temp &= ADC_DR_DONE_FLAG; + }else{ + temp &= ADC_DR_OVERRUN_FLAG; + } + if (temp){ + return SET; + }else{ + return RESET; + } +} + +/** + * @} + */ + +#endif /* _ADC */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_can.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_can.c new file mode 100644 index 0000000000..be8b767cfd --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_can.c @@ -0,0 +1,1936 @@ +/********************************************************************** +* $Id$ lpc17xx_can.c 2011-03-09 +*//** +* @file lpc17xx_can.c +* @brief Contains all functions support for CAN firmware library on LPC17xx +* @version 3.3 +* @date 09. March. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup CAN + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_can.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _CAN + +/* Private Variables ---------------------------------------------------------- */ +/** @defgroup CAN_Private_Variables CAN Private Variables + * @{ + */ + +FunctionalState FULLCAN_ENABLE; + + +/* Counts number of filters (CAN message objects) used */ +uint16_t CANAF_FullCAN_cnt = 0; +uint16_t CANAF_std_cnt = 0; +uint16_t CANAF_gstd_cnt = 0; +uint16_t CANAF_ext_cnt = 0; +uint16_t CANAF_gext_cnt = 0; + +/* End of Private Variables ----------------------------------------------------*/ +/** + * @} + */ + +/* Private Variables ---------------------------------------------------------- */ +static void can_SetBaudrate (LPC_CAN_TypeDef *CANx, uint32_t baudrate); + +/*********************************************************************//** + * @brief Setting CAN baud rate (bps) + * @param[in] CANx point to LPC_CAN_TypeDef object, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] baudrate: is the baud rate value will be set + * @return None + ***********************************************************************/ +static void can_SetBaudrate (LPC_CAN_TypeDef *CANx, uint32_t baudrate) +{ + uint32_t result = 0; + uint8_t NT, TSEG1, TSEG2, BRFail; + uint32_t CANPclk = 0; + uint32_t BRP; + CHECK_PARAM(PARAM_CANx(CANx)); + + if (CANx == LPC_CAN1) + { + CANPclk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_CAN1); + } + else + { + CANPclk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_CAN2); + } + result = CANPclk / baudrate; + /* Calculate suitable nominal time value + * NT (nominal time) = (TSEG1 + TSEG2 + 3) + * NT <= 24 + * TSEG1 >= 2*TSEG2 + */ + BRFail = 1; + for(NT=24;NT>0;NT=NT-2) + { + if ((result%NT)==0) + { + BRP = result / NT - 1; + NT--; + TSEG2 = (NT/3) - 1; + TSEG1 = NT -(NT/3) - 1; + BRFail = 0; + break; + } + } + if(BRFail) + while(1); // Failed to calculate exact CAN baud rate + /* Enter reset mode */ + CANx->MOD = 0x01; + /* Set bit timing + * Default: SAM = 0x00; + * SJW = 0x03; + */ + CANx->BTR = (TSEG2<<20)|(TSEG1<<16)|(3<<14)|BRP; + /* Return to normal operating */ + CANx->MOD = 0; +} +/* End of Private Functions ----------------------------------------------------*/ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup CAN_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initialize CAN peripheral with given baudrate + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] baudrate: the value of CAN baudrate will be set (bps) + * @return None + *********************************************************************/ +void CAN_Init(LPC_CAN_TypeDef *CANx, uint32_t baudrate) +{ + uint16_t i; + CHECK_PARAM(PARAM_CANx(CANx)); + + if(CANx == LPC_CAN1) + { + /* Turn on power and clock for CAN1 */ + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN1, ENABLE); + /* Set clock divide for CAN1 */ + } + else + { + /* Turn on power and clock for CAN1 */ + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN2, ENABLE); + /* Set clock divide for CAN2 */ + } + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_CAN1, CLKPWR_PCLKSEL_CCLK_DIV_2); + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_CAN2, CLKPWR_PCLKSEL_CCLK_DIV_2); + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_ACF, CLKPWR_PCLKSEL_CCLK_DIV_2); + + CANx->MOD = 1; // Enter Reset Mode + CANx->IER = 0; // Disable All CAN Interrupts + CANx->GSR = 0; + /* Request command to release Rx, Tx buffer and clear data overrun */ + //CANx->CMR = CAN_CMR_AT | CAN_CMR_RRB | CAN_CMR_CDO; + CANx->CMR = (1<<1)|(1<<2)|(1<<3); + /* Read to clear interrupt pending in interrupt capture register */ + i = CANx->ICR; + CANx->MOD = 0;// Return Normal operating + + //Reset CANAF value + LPC_CANAF->AFMR = 0x01; + + //clear ALUT RAM + for (i = 0; i < 512; i++) { + LPC_CANAF_RAM->mask[i] = 0x00; + } + + LPC_CANAF->SFF_sa = 0x00; + LPC_CANAF->SFF_GRP_sa = 0x00; + LPC_CANAF->EFF_sa = 0x00; + LPC_CANAF->EFF_GRP_sa = 0x00; + LPC_CANAF->ENDofTable = 0x00; + + LPC_CANAF->AFMR = 0x00; + /* Set baudrate */ + can_SetBaudrate (CANx, baudrate); +} + +/********************************************************************//** + * @brief CAN deInit + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @return None + *********************************************************************/ +void CAN_DeInit(LPC_CAN_TypeDef *CANx) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + + if(CANx == LPC_CAN1) + { + /* Turn on power and clock for CAN1 */ + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN1, DISABLE); + } + else + { + /* Turn on power and clock for CAN1 */ + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN2, DISABLE); + } +} + +/********************************************************************//** + * @brief Setup Acceptance Filter Look-Up Table + * @param[in] CANAFx pointer to LPC_CANAF_TypeDef + * Should be: LPC_CANAF + * @param[in] AFSection the pointer to AF_SectionDef structure + * It contain information about 5 sections will be install in AFLUT + * @return CAN Error could be: + * - CAN_OBJECTS_FULL_ERROR: No more rx or tx objects available + * - CAN_AF_ENTRY_ERROR: table error-violation of ascending numerical order + * - CAN_OK: ID is added into table successfully + *********************************************************************/ +CAN_ERROR CAN_SetupAFLUT(LPC_CANAF_TypeDef* CANAFx, AF_SectionDef* AFSection) +{ + uint8_t ctrl1,ctrl2; + uint8_t dis1, dis2; + uint16_t SID, ID_temp,i, count = 0; + uint32_t EID, entry, buf; + uint16_t lowerSID, upperSID; + uint32_t lowerEID, upperEID; + + CHECK_PARAM(PARAM_CANAFx(CANAFx)); + CANAFx->AFMR = 0x01; + +/***** setup FullCAN Table *****/ + if(AFSection->FullCAN_Sec == NULL) + { + FULLCAN_ENABLE = DISABLE; + } + else + { + FULLCAN_ENABLE = ENABLE; + for(i=0;i<(AFSection->FC_NumEntry);i++) + { + if(count + 1 > 64) + { + return CAN_OBJECTS_FULL_ERROR; + } + ctrl1 = AFSection->FullCAN_Sec->controller; + SID = AFSection->FullCAN_Sec->id_11; + dis1 = AFSection->FullCAN_Sec->disable; + + CHECK_PARAM(PARAM_CTRL(ctrl1)); + CHECK_PARAM(PARAM_ID_11(SID)); + CHECK_PARAM(PARAM_MSG_DISABLE(dis1)); + entry = 0x00; //reset entry value + if((CANAF_FullCAN_cnt & 0x00000001)==0) + { + if(count!=0x00) + { + buf = LPC_CANAF_RAM->mask[count-1]; + ID_temp = (buf & 0xE7FF); //mask controller & identifier bits + if(ID_temp > ((ctrl1<<13)|SID)) + { + return CAN_AF_ENTRY_ERROR; + } + } + entry = (ctrl1<<29)|(dis1<<28)|(SID<<16)|(1<<27); + LPC_CANAF_RAM->mask[count] &= 0x0000FFFF; + LPC_CANAF_RAM->mask[count] |= entry; + CANAF_FullCAN_cnt++; + if(CANAF_FullCAN_cnt == AFSection->FC_NumEntry) //this is the lastest FullCAN entry + count++; + } + else + { + buf = LPC_CANAF_RAM->mask[count]; + ID_temp = (buf >>16) & 0xE7FF; + if(ID_temp > ((ctrl1<<13)|SID)) + { + return CAN_AF_ENTRY_ERROR; + } + entry = (ctrl1<<13)|(dis1<<12)|(SID<<0)|(1<<11); + LPC_CANAF_RAM->mask[count] &= 0xFFFF0000; + LPC_CANAF_RAM->mask[count]|= entry; + count++; + CANAF_FullCAN_cnt++; + } + AFSection->FullCAN_Sec = (FullCAN_Entry *)((uint32_t)(AFSection->FullCAN_Sec)+ sizeof(FullCAN_Entry)); + } + } + +/***** Setup Explicit Standard Frame Format Section *****/ + if(AFSection->SFF_Sec != NULL) + { + for(i=0;i<(AFSection->SFF_NumEntry);i++) + { + if(count + 1 > 512) + { + return CAN_OBJECTS_FULL_ERROR; + } + ctrl1 = AFSection->SFF_Sec->controller; + SID = AFSection->SFF_Sec->id_11; + dis1 = AFSection->SFF_Sec->disable; + + //check parameter + CHECK_PARAM(PARAM_CTRL(ctrl1)); + CHECK_PARAM(PARAM_ID_11(SID)); + CHECK_PARAM(PARAM_MSG_DISABLE(dis1)); + + entry = 0x00; //reset entry value + if((CANAF_std_cnt & 0x00000001)==0) + { + if(CANAF_std_cnt !=0 ) + { + buf = LPC_CANAF_RAM->mask[count-1]; + ID_temp = (buf & 0xE7FF); //mask controller & identifier bits + if(ID_temp > ((ctrl1<<13)|SID)) + { + return CAN_AF_ENTRY_ERROR; + } + } + entry = (ctrl1<<29)|(dis1<<28)|(SID<<16); + LPC_CANAF_RAM->mask[count] &= 0x0000FFFF; + LPC_CANAF_RAM->mask[count] |= entry; + CANAF_std_cnt++; + if(CANAF_std_cnt == AFSection->SFF_NumEntry)//if this is the last SFF entry + count++; + } + else + { + buf = LPC_CANAF_RAM->mask[count]; + ID_temp = (buf >>16) & 0xE7FF; + if(ID_temp > ((ctrl1<<13)|SID)) + { + return CAN_AF_ENTRY_ERROR; + } + entry = (ctrl1<<13)|(dis1<<12)|(SID<<0); + LPC_CANAF_RAM->mask[count] &= 0xFFFF0000; + LPC_CANAF_RAM->mask[count] |= entry; + count++; + CANAF_std_cnt++; + } + AFSection->SFF_Sec = (SFF_Entry *)((uint32_t)(AFSection->SFF_Sec)+ sizeof(SFF_Entry)); + } + } + +/***** Setup Group of Standard Frame Format Identifier Section *****/ + if(AFSection->SFF_GPR_Sec != NULL) + { + for(i=0;i<(AFSection->SFF_GPR_NumEntry);i++) + { + if(count + 1 > 512) + { + return CAN_OBJECTS_FULL_ERROR; + } + ctrl1 = AFSection->SFF_GPR_Sec->controller1; + ctrl2 = AFSection->SFF_GPR_Sec->controller2; + dis1 = AFSection->SFF_GPR_Sec->disable1; + dis2 = AFSection->SFF_GPR_Sec->disable2; + lowerSID = AFSection->SFF_GPR_Sec->lowerID; + upperSID = AFSection->SFF_GPR_Sec->upperID; + + /* check parameter */ + CHECK_PARAM(PARAM_CTRL(ctrl1)); + CHECK_PARAM(PARAM_CTRL(ctrl2)); + CHECK_PARAM(PARAM_MSG_DISABLE(dis1)); + CHECK_PARAM(PARAM_MSG_DISABLE(dis2)); + CHECK_PARAM(PARAM_ID_11(lowerSID)); + CHECK_PARAM(PARAM_ID_11(upperSID)); + + entry = 0x00; + if(CANAF_gstd_cnt!=0) + { + buf = LPC_CANAF_RAM->mask[count-1]; + ID_temp = buf & 0xE7FF; + if((ctrl1 != ctrl2)||(lowerSID > upperSID)||(ID_temp > ((ctrl1<<13)|lowerSID))) + { + return CAN_AF_ENTRY_ERROR; + } + } + entry = (ctrl1 << 29)|(dis1 << 28)|(lowerSID << 16)| \ + (ctrl2 << 13)|(dis2 << 12)|(upperSID << 0); + LPC_CANAF_RAM->mask[count] = entry; + CANAF_gstd_cnt++; + count++; + AFSection->SFF_GPR_Sec = (SFF_GPR_Entry *)((uint32_t)(AFSection->SFF_GPR_Sec)+ sizeof(SFF_GPR_Entry)); + } + } + +/***** Setup Explicit Extend Frame Format Identifier Section *****/ + if(AFSection->EFF_Sec != NULL) + { + for(i=0;i<(AFSection->EFF_NumEntry);i++) + { + if(count + 1 > 512) + { + return CAN_OBJECTS_FULL_ERROR; + } + EID = AFSection->EFF_Sec->ID_29; + ctrl1 = AFSection->EFF_Sec->controller; + + // check parameter + CHECK_PARAM(PARAM_ID_29(EID)); + CHECK_PARAM(PARAM_CTRL(ctrl1)); + + entry = (ctrl1 << 29)|(EID << 0); + if(CANAF_ext_cnt != 0) + { + buf = LPC_CANAF_RAM->mask[count-1]; +// EID_temp = buf & 0x0FFFFFFF; + if(buf > entry) + { + return CAN_AF_ENTRY_ERROR; + } + } + LPC_CANAF_RAM->mask[count] = entry; + CANAF_ext_cnt ++; + count++; + AFSection->EFF_Sec = (EFF_Entry *)((uint32_t)(AFSection->EFF_Sec)+ sizeof(EFF_Entry)); + } + } + +/***** Setup Group of Extended Frame Format Identifier Section *****/ + if(AFSection->EFF_GPR_Sec != NULL) + { + for(i=0;i<(AFSection->EFF_GPR_NumEntry);i++) + { + if(count + 2 > 512) + { + return CAN_OBJECTS_FULL_ERROR; + } + ctrl1 = AFSection->EFF_GPR_Sec->controller1; + ctrl2 = AFSection->EFF_GPR_Sec->controller2; + lowerEID = AFSection->EFF_GPR_Sec->lowerEID; + upperEID = AFSection->EFF_GPR_Sec->upperEID; + + //check parameter + CHECK_PARAM(PARAM_CTRL(ctrl1)); + CHECK_PARAM(PARAM_CTRL(ctrl2)); + CHECK_PARAM(PARAM_ID_29(lowerEID)); + CHECK_PARAM(PARAM_ID_29(upperEID)); + + entry = 0x00; + if(CANAF_gext_cnt != 0) + { + buf = LPC_CANAF_RAM->mask[count-1]; +// EID_temp = buf & 0x0FFFFFFF; + if((ctrl1 != ctrl2) || (lowerEID > upperEID) || (buf > ((ctrl1 << 29)|(lowerEID << 0)))) + { + return CAN_AF_ENTRY_ERROR; + } + } + entry = (ctrl1 << 29)|(lowerEID << 0); + LPC_CANAF_RAM->mask[count++] = entry; + entry = (ctrl2 << 29)|(upperEID << 0); + LPC_CANAF_RAM->mask[count++] = entry; + CANAF_gext_cnt++; + AFSection->EFF_GPR_Sec = (EFF_GPR_Entry *)((uint32_t)(AFSection->EFF_GPR_Sec)+ sizeof(EFF_GPR_Entry)); + } + } + //update address values + LPC_CANAF->SFF_sa = ((CANAF_FullCAN_cnt + 1)>>1)<<2; + LPC_CANAF->SFF_GRP_sa = LPC_CANAF->SFF_sa + (((CANAF_std_cnt+1)>>1)<< 2); + LPC_CANAF->EFF_sa = LPC_CANAF->SFF_GRP_sa + (CANAF_gstd_cnt << 2); + LPC_CANAF->EFF_GRP_sa = LPC_CANAF->EFF_sa + (CANAF_ext_cnt << 2); + LPC_CANAF->ENDofTable = LPC_CANAF->EFF_GRP_sa + (CANAF_gext_cnt << 3); + + if(FULLCAN_ENABLE == DISABLE) + { + LPC_CANAF->AFMR = 0x00; // Normal mode + } + else + { + LPC_CANAF->AFMR = 0x04; + } + return CAN_OK; +} +/********************************************************************//** + * @brief Add Explicit ID into AF Look-Up Table dynamically. + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] id: The ID of entry will be added + * @param[in] format: is the type of ID Frame Format, should be: + * - STD_ID_FORMAT: 11-bit ID value + * - EXT_ID_FORMAT: 29-bit ID value + * @return CAN Error, could be: + * - CAN_OBJECTS_FULL_ERROR: No more rx or tx objects available + * - CAN_ID_EXIT_ERROR: ID exited in table + * - CAN_OK: ID is added into table successfully + *********************************************************************/ +CAN_ERROR CAN_LoadExplicitEntry(LPC_CAN_TypeDef* CANx, uint32_t id, CAN_ID_FORMAT_Type format) +{ + uint32_t tmp0 = 0; + uint32_t buf0=0, buf1=0; + int16_t cnt1=0, cnt2=0, bound1=0, total=0; + + + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_ID_FORMAT(format)); + + if (CANx == LPC_CAN1) + { + tmp0 = 0; + } + else if (CANx == LPC_CAN2) + { + tmp0 = 1; + } + + /* Acceptance Filter Memory full - return */ + total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \ + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + if (total >= 512){ //don't have enough space + return CAN_OBJECTS_FULL_ERROR; + } + + /* Setup Acceptance Filter Configuration + Acceptance Filter Mode Register = Off */ + LPC_CANAF->AFMR = 0x00000001; + +/*********** Add Explicit Standard Identifier Frame Format entry *********/ + if(format == STD_ID_FORMAT) + { + id &= 0x07FF; + id |= (tmp0 << 13); /* Add controller number */ + /* Move all remaining sections one place up + if new entry will increase FullCAN list */ + if ((CANAF_std_cnt & 0x0001) == 0) + { + cnt1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1); + bound1 = total - cnt1; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + while(bound1--) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + buf0 = buf1; + } + } + if (CANAF_std_cnt == 0) + { + cnt2 = (CANAF_FullCAN_cnt + 1)>>1; + /* For entering first ID */ + LPC_CANAF_RAM->mask[cnt2] = 0x0000FFFF | (id << 16); + } + else if (CANAF_std_cnt == 1) + { + cnt2 = (CANAF_FullCAN_cnt + 1)>>1; + /* For entering second ID */ + if (((LPC_CANAF_RAM->mask[cnt2] >> 16)& 0xE7FF) > id) + { + LPC_CANAF_RAM->mask[cnt2] = (LPC_CANAF_RAM->mask[cnt2] >> 16) | (id << 16); + } + else + { + LPC_CANAF_RAM->mask[cnt2] = (LPC_CANAF_RAM->mask[cnt2] & 0xFFFF0000) | id; + } + } + else + { + /* Find where to insert new ID */ + cnt1 = (CANAF_FullCAN_cnt+1)>>1; + cnt2 = CANAF_std_cnt; + bound1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1); + while (cnt1 < bound1) + { + /* Loop through standard existing IDs */ + if (((LPC_CANAF_RAM->mask[cnt1] >> 16) & 0xE7FF) > id) + { + cnt2 = cnt1 * 2; + break; + } + + if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000E7FF) > id) + { + cnt2 = cnt1 * 2 + 1; + break; + } + + cnt1++; + } + /* cnt1 = U32 where to insert new ID */ + /* cnt2 = U16 where to insert new ID */ + + if (cnt1 == bound1) + { + /* Adding ID as last entry */ + /* Even number of IDs exists */ + if ((CANAF_std_cnt & 0x0001) == 0) + { + LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16); + } + /* Odd number of IDs exists */ + else + { + LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id; + } + } + else + { + buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ + if ((cnt2 & 0x0001) == 0) + { + /* Insert new mask to even address*/ + buf1 = (id << 16) | (buf0 >> 16); + } + else + { + /* Insert new mask to odd address */ + buf1 = (buf0 & 0xFFFF0000) | id; + } + LPC_CANAF_RAM->mask[cnt1] = buf1;/* Insert mask */ + bound1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1)-1; + /* Move all remaining standard mask entries one place up */ + while (cnt1 < bound1) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16); + buf0 = buf1; + } + + if ((CANAF_std_cnt & 0x0001) == 0) + { + /* Even number of IDs exists */ + LPC_CANAF_RAM->mask[cnt1+1] = (buf0 <<16) |(0x0000FFFF); + } + } + } + CANAF_std_cnt++; + //update address values + LPC_CANAF->SFF_GRP_sa +=0x04 ; + LPC_CANAF->EFF_sa +=0x04 ; + LPC_CANAF->EFF_GRP_sa +=0x04; + LPC_CANAF->ENDofTable +=0x04; + } + +/*********** Add Explicit Extended Identifier Frame Format entry *********/ + else + { + /* Add controller number */ + id |= (tmp0) << 29; + + cnt1 = ((CANAF_FullCAN_cnt+1)>>1)+(((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt); + cnt2 = 0; + while (cnt2 < CANAF_ext_cnt) + { + /* Loop through extended existing masks*/ + if (LPC_CANAF_RAM->mask[cnt1] > id) + { + break; + } + cnt1++;/* cnt1 = U32 where to insert new mask */ + cnt2++; + } + + buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ + LPC_CANAF_RAM->mask[cnt1] = id; /* Insert mask */ + + CANAF_ext_cnt++; + + bound1 = total; + /* Move all remaining extended mask entries one place up*/ + while (cnt2 < bound1) + { + cnt1++; + cnt2++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + buf0 = buf1; + } + /* update address values */ + LPC_CANAF->EFF_GRP_sa += 4; + LPC_CANAF->ENDofTable += 4; + } + if(CANAF_FullCAN_cnt == 0) //not use FullCAN mode + { + LPC_CANAF->AFMR = 0x00;//not use FullCAN mode + } + else + { + LPC_CANAF->AFMR = 0x04; + } + + return CAN_OK; +} + +/********************************************************************//** + * @brief Load FullCAN entry into AFLUT + * @param[in] CANx: CAN peripheral selected, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] id: identifier of entry that will be added + * @return CAN_ERROR, could be: + * - CAN_OK: loading is successful + * - CAN_ID_EXIT_ERROR: ID exited in FullCAN Section + * - CAN_OBJECTS_FULL_ERROR: no more space available + *********************************************************************/ +CAN_ERROR CAN_LoadFullCANEntry (LPC_CAN_TypeDef* CANx, uint16_t id) +{ + uint32_t ctrl0 = 0; + uint32_t buf0=0, buf1=0, buf2=0; + uint32_t tmp0=0, tmp1=0, tmp2=0; + int16_t cnt1=0, cnt2=0, bound1=0, total=0; + + CHECK_PARAM(PARAM_CANx(CANx)); + + if (CANx == LPC_CAN1) + { + ctrl0 = 0; + } + else if (CANx == LPC_CAN2) + { + ctrl0 = 1; + } + + /* Acceptance Filter Memory full - return */ + total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \ + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + //don't have enough space for this fullCAN Entry and its Object(3*32 bytes) + if ((total >=508)||(CANAF_FullCAN_cnt>=64)){ + return CAN_OBJECTS_FULL_ERROR; + } + /* Setup Acceptance Filter Configuration + Acceptance Filter Mode Register = Off */ + LPC_CANAF->AFMR = 0x00000001; + + /* Add mask for standard identifiers */ + id &= 0x07FF; + id |= (ctrl0 << 13) | (1 << 11); /* Add controller number */ +// total = ((CANAF_std_cnt + 1) >> 1)+ CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + /* Move all remaining sections one place up + if new entry will increase FullCAN list */ + if (((CANAF_FullCAN_cnt & 0x0001) == 0)&&(total!=0)) + { + //then remove remaining section + cnt1 = (CANAF_FullCAN_cnt >> 1); + bound1 = total; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + + while (bound1--) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + buf0 = buf1; + } + } + if (CANAF_FullCAN_cnt == 0) + { + /* For entering first ID */ + LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16); + } + else if (CANAF_FullCAN_cnt == 1) + { + /* For entering second ID */ + if (((LPC_CANAF_RAM->mask[0] >> 16)& 0xE7FF) > id) + { + LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16); + } + else + { + LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id; + } + } + else + { + /* Find where to insert new ID */ + cnt1 = 0; + cnt2 = CANAF_FullCAN_cnt; + bound1 = (CANAF_FullCAN_cnt - 1) >> 1; + while (cnt1 <= bound1) + { + /* Loop through standard existing IDs */ + if (((LPC_CANAF_RAM->mask[cnt1] >> 16) & 0xE7FF) > (id & 0xE7FF)) + { + cnt2 = cnt1 * 2; + break; + } + + if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000E7FF) > (id & 0xE7FF)) + { + cnt2 = cnt1 * 2 + 1; + break; + } + + cnt1++; + } + /* cnt1 = U32 where to insert new ID */ + /* cnt2 = U16 where to insert new ID */ + + if (cnt1 > bound1) + { + /* Adding ID as last entry */ + /* Even number of IDs exists */ + if ((CANAF_FullCAN_cnt & 0x0001) == 0) + { + LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16); + } + /* Odd number of IDs exists */ + else + { + LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id; + } + } + else + { + buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ + if ((cnt2 & 0x0001) == 0) + { + /* Insert new mask to even address*/ + buf1 = (id << 16) | (buf0 >> 16); + } + else + { + /* Insert new mask to odd address */ + buf1 = (buf0 & 0xFFFF0000) | id; + } + LPC_CANAF_RAM->mask[cnt1] = buf1;/* Insert mask */ + bound1 = CANAF_FullCAN_cnt >> 1; + /* Move all remaining standard mask entries one place up */ + while (cnt1 < bound1) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16); + buf0 = buf1; + } + + if ((CANAF_FullCAN_cnt & 0x0001) == 0) + { + /* Even number of IDs exists */ + LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) + | (0x0000FFFF); + } + } + } + //restruct FulCAN Object Section + bound1 = CANAF_FullCAN_cnt - cnt2; + cnt1 = total - (CANAF_FullCAN_cnt)*3 + cnt2*3 + 1; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + buf1 = LPC_CANAF_RAM->mask[cnt1+1]; + buf2 = LPC_CANAF_RAM->mask[cnt1+2]; + LPC_CANAF_RAM->mask[cnt1]=LPC_CANAF_RAM->mask[cnt1+1]= LPC_CANAF_RAM->mask[cnt1+2]=0x00; + cnt1+=3; + while(bound1--) + { + tmp0 = LPC_CANAF_RAM->mask[cnt1]; + tmp1 = LPC_CANAF_RAM->mask[cnt1+1]; + tmp2 = LPC_CANAF_RAM->mask[cnt1+2]; + LPC_CANAF_RAM->mask[cnt1]= buf0; + LPC_CANAF_RAM->mask[cnt1+1]= buf1; + LPC_CANAF_RAM->mask[cnt1+2]= buf2; + buf0 = tmp0; + buf1 = tmp1; + buf2 = tmp2; + cnt1+=3; + } + CANAF_FullCAN_cnt++; + //update address values + LPC_CANAF->SFF_sa +=0x04; + LPC_CANAF->SFF_GRP_sa +=0x04 ; + LPC_CANAF->EFF_sa +=0x04 ; + LPC_CANAF->EFF_GRP_sa +=0x04; + LPC_CANAF->ENDofTable +=0x04; + + LPC_CANAF->AFMR = 0x04; + return CAN_OK; +} + +/********************************************************************//** + * @brief Load Group entry into AFLUT + * @param[in] CANx: CAN peripheral selected, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] lowerID, upperID: lower and upper identifier of entry + * @param[in] format: type of ID format, should be: + * - STD_ID_FORMAT: Standard ID format (11-bit value) + * - EXT_ID_FORMAT: Extended ID format (29-bit value) + * @return CAN_ERROR, could be: + * - CAN_OK: loading is successful + * - CAN_CONFLICT_ID_ERROR: Conflict ID occurs + * - CAN_OBJECTS_FULL_ERROR: no more space available + *********************************************************************/ +CAN_ERROR CAN_LoadGroupEntry(LPC_CAN_TypeDef* CANx, uint32_t lowerID, \ + uint32_t upperID, CAN_ID_FORMAT_Type format) +{ + uint16_t tmp = 0; + uint32_t buf0, buf1, entry1, entry2, LID,UID; + int16_t cnt1, bound1, total; + //LPC_CANAF_RAM_TypeDef *AFLUTTest = LPC_CANAF_RAM; + + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_ID_FORMAT(format)); + + if(lowerID > upperID) return CAN_CONFLICT_ID_ERROR; + if(CANx == LPC_CAN1) + { + tmp = 0; + } + else + { + tmp = 1; + } + + total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \ + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + + /* Setup Acceptance Filter Configuration + Acceptance Filter Mode Register = Off */ + LPC_CANAF->AFMR = 0x00000001; + +/*********Add Group of Standard Identifier Frame Format************/ + if(format == STD_ID_FORMAT) + { + if ((total >= 512)){//don't have enough space + return CAN_OBJECTS_FULL_ERROR; + } + lowerID &=0x7FF; //mask ID + upperID &=0x7FF; + entry1 = (tmp << 29)|(lowerID << 16)|(tmp << 13)|(upperID << 0); + cnt1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1); + + //if this is the first Group standard ID entry + if(CANAF_gstd_cnt == 0) + { + LPC_CANAF_RAM->mask[cnt1] = entry1; + } + else + { + //find the position to add new Group entry + bound1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt; + while(cnt1 < bound1) + { + //compare controller first + while((LPC_CANAF_RAM->mask[cnt1] >> 29)< (entry1 >> 29))//increase until meet greater or equal controller + cnt1++; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + if((LPC_CANAF_RAM->mask[cnt1] >> 29)> (entry1 >> 29)) //meet greater controller + { + //add at this position + LPC_CANAF_RAM->mask[cnt1] = entry1; + break; + } + else //meet equal controller + { + LID = (buf0 >> 16)&0x7FF; + UID = buf0 & 0x7FF; + if (upperID <= LID) + { + //add new entry before this entry + LPC_CANAF_RAM->mask[cnt1] = entry1; + break; + } + else if (lowerID >= UID) + { + //load next entry to compare + cnt1 ++; + } + else + return CAN_CONFLICT_ID_ERROR; + } + } + if(cnt1 >= bound1) + { + //add new entry at the last position in this list + buf0 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = entry1; + } + + //remove all remaining entry of this section one place up + bound1 = total - cnt1; + while(bound1--) + { + cnt1++; + buf1 = LPC_CANAF_RAM->mask[cnt1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + buf0 = buf1; + } + } + CANAF_gstd_cnt++; + //update address values + LPC_CANAF->EFF_sa +=0x04 ; + LPC_CANAF->EFF_GRP_sa +=0x04; + LPC_CANAF->ENDofTable +=0x04; + } + + +/*********Add Group of Extended Identifier Frame Format************/ + else + { + if ((total >= 511)){//don't have enough space + return CAN_OBJECTS_FULL_ERROR; + } + lowerID &= 0x1FFFFFFF; //mask ID + upperID &= 0x1FFFFFFF; + entry1 = (tmp << 29)|(lowerID << 0); + entry2 = (tmp << 29)|(upperID << 0); + + cnt1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt + CANAF_ext_cnt; + //if this is the first Group standard ID entry + if(CANAF_gext_cnt == 0) + { + LPC_CANAF_RAM->mask[cnt1] = entry1; + LPC_CANAF_RAM->mask[cnt1+1] = entry2; + } + else + { + //find the position to add new Group entry + bound1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt \ + + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + while(cnt1 < bound1) + { + while((LPC_CANAF_RAM->mask[cnt1] >>29)< tmp) //increase until meet greater or equal controller + cnt1++; + buf0 = LPC_CANAF_RAM->mask[cnt1]; + buf1 = LPC_CANAF_RAM->mask[cnt1+1]; + if((LPC_CANAF_RAM->mask[cnt1] >> 29)> (entry1 >> 29)) //meet greater controller + { + //add at this position + LPC_CANAF_RAM->mask[cnt1] = entry1; + LPC_CANAF_RAM->mask[++cnt1] = entry2; + break; + } + else //meet equal controller + { + LID = buf0 & 0x1FFFFFFF; //mask ID + UID = buf1 & 0x1FFFFFFF; + if (upperID <= LID) + { + //add new entry before this entry + LPC_CANAF_RAM->mask[cnt1] = entry1; + LPC_CANAF_RAM->mask[++cnt1] = entry2; + break; + } + else if (lowerID >= UID) + { + //load next entry to compare + cnt1 +=2; + } + else + return CAN_CONFLICT_ID_ERROR; + } + } + if(cnt1 >= bound1) + { + //add new entry at the last position in this list + buf0 = LPC_CANAF_RAM->mask[cnt1]; + buf1 = LPC_CANAF_RAM->mask[cnt1+1]; + LPC_CANAF_RAM->mask[cnt1] = entry1; + LPC_CANAF_RAM->mask[++cnt1] = entry2; + } + //remove all remaining entry of this section two place up + bound1 = total - cnt1 + 1; + cnt1++; + while(bound1>0) + { + entry1 = LPC_CANAF_RAM->mask[cnt1]; + entry2 = LPC_CANAF_RAM->mask[cnt1+1]; + LPC_CANAF_RAM->mask[cnt1] = buf0; + LPC_CANAF_RAM->mask[cnt1+1] = buf1; + buf0 = entry1; + buf1 = entry2; + cnt1 +=2; + bound1 -=2; + } + } + CANAF_gext_cnt++; + //update address values + LPC_CANAF->ENDofTable +=0x08; + } + LPC_CANAF->AFMR = 0x04; + return CAN_OK; +} + +/********************************************************************//** + * @brief Remove AFLUT entry (FullCAN entry and Explicit Standard entry) + * @param[in] EntryType: the type of entry that want to remove, should be: + * - FULLCAN_ENTRY + * - EXPLICIT_STANDARD_ENTRY + * - GROUP_STANDARD_ENTRY + * - EXPLICIT_EXTEND_ENTRY + * - GROUP_EXTEND_ENTRY + * @param[in] position: the position of this entry in its section + * Note: the first position is 0 + * @return CAN_ERROR, could be: + * - CAN_OK: removing is successful + * - CAN_ENTRY_NOT_EXIT_ERROR: entry want to remove is not exit + *********************************************************************/ +CAN_ERROR CAN_RemoveEntry(AFLUT_ENTRY_Type EntryType, uint16_t position) +{ + uint16_t cnt, bound, total; + uint32_t buf0, buf1; + CHECK_PARAM(PARAM_AFLUT_ENTRY_TYPE(EntryType)); + CHECK_PARAM(PARAM_POSITION(position)); + + /* Setup Acceptance Filter Configuration + Acceptance Filter Mode Register = Off */ + LPC_CANAF->AFMR = 0x00000001; + total = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt + 1) >> 1) + \ + CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); + + +/************** Remove FullCAN Entry *************/ + if(EntryType == FULLCAN_ENTRY) + { + if((CANAF_FullCAN_cnt==0)||(position >= CANAF_FullCAN_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = position >> 1; + buf0 = LPC_CANAF_RAM->mask[cnt]; + bound = (CANAF_FullCAN_cnt - position -1)>>1; + if((position & 0x0001) == 0) //event position + { + while(bound--) + { + //remove all remaining FullCAN entry one place down + buf1 = LPC_CANAF_RAM->mask[cnt+1]; + LPC_CANAF_RAM->mask[cnt] = (buf1 >> 16) | (buf0 << 16); + buf0 = buf1; + cnt++; + } + } + else //odd position + { + while(bound--) + { + //remove all remaining FullCAN entry one place down + buf1 = LPC_CANAF_RAM->mask[cnt+1]; + LPC_CANAF_RAM->mask[cnt] = (buf0 & 0xFFFF0000)|(buf1 >> 16); + LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+1] << 16; + buf0 = buf1<<16; + cnt++; + } + } + if((CANAF_FullCAN_cnt & 0x0001) == 0) + { + if((position & 0x0001)==0) + LPC_CANAF_RAM->mask[cnt] = (buf0 << 16) | (0x0000FFFF); + else + LPC_CANAF_RAM->mask[cnt] = buf0 | 0x0000FFFF; + } + else + { + //remove all remaining section one place down + cnt = (CANAF_FullCAN_cnt + 1)>>1; + bound = total + CANAF_FullCAN_cnt * 3; + while(bound>cnt) + { + LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; + cnt++; + } + LPC_CANAF_RAM->mask[cnt-1]=0x00; + //update address values + LPC_CANAF->SFF_sa -=0x04; + LPC_CANAF->SFF_GRP_sa -=0x04 ; + LPC_CANAF->EFF_sa -=0x04 ; + LPC_CANAF->EFF_GRP_sa -=0x04; + LPC_CANAF->ENDofTable -=0x04; + } + CANAF_FullCAN_cnt--; + + //delete its FullCAN Object in the FullCAN Object section + //remove all remaining FullCAN Object three place down + cnt = total + position * 3; + bound = (CANAF_FullCAN_cnt - position + 1) * 3; + + while(bound) + { + LPC_CANAF_RAM->mask[cnt]=LPC_CANAF_RAM->mask[cnt+3];; + LPC_CANAF_RAM->mask[cnt+1]=LPC_CANAF_RAM->mask[cnt+4]; + LPC_CANAF_RAM->mask[cnt+2]=LPC_CANAF_RAM->mask[cnt+5]; + bound -=3; + cnt +=3; + } + } + } + +/************** Remove Explicit Standard ID Entry *************/ + else if(EntryType == EXPLICIT_STANDARD_ENTRY) + { + if((CANAF_std_cnt==0)||(position >= CANAF_std_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = ((CANAF_FullCAN_cnt+1)>>1)+ (position >> 1); + buf0 = LPC_CANAF_RAM->mask[cnt]; + bound = (CANAF_std_cnt - position - 1)>>1; + if((position & 0x0001) == 0) //event position + { + while(bound--) + { + //remove all remaining FullCAN entry one place down + buf1 = LPC_CANAF_RAM->mask[cnt+1]; + LPC_CANAF_RAM->mask[cnt] = (buf1 >> 16) | (buf0 << 16); + buf0 = buf1; + cnt++; + } + } + else //odd position + { + while(bound--) + { + //remove all remaining FullCAN entry one place down + buf1 = LPC_CANAF_RAM->mask[cnt+1]; + LPC_CANAF_RAM->mask[cnt] = (buf0 & 0xFFFF0000)|(buf1 >> 16); + LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+1] << 16; + buf0 = buf1<<16; + cnt++; + } + } + if((CANAF_std_cnt & 0x0001) == 0) + { + if((position & 0x0001)==0) + LPC_CANAF_RAM->mask[cnt] = (buf0 << 16) | (0x0000FFFF); + else + LPC_CANAF_RAM->mask[cnt] = buf0 | 0x0000FFFF; + } + else + { + //remove all remaining section one place down + cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1); + bound = total + CANAF_FullCAN_cnt * 3; + while(bound>cnt) + { + LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; + cnt++; + } + LPC_CANAF_RAM->mask[cnt-1]=0x00; + //update address value + LPC_CANAF->SFF_GRP_sa -=0x04 ; + LPC_CANAF->EFF_sa -=0x04 ; + LPC_CANAF->EFF_GRP_sa -=0x04; + LPC_CANAF->ENDofTable -=0x04; + } + CANAF_std_cnt--; + } + } + +/************** Remove Group of Standard ID Entry *************/ + else if(EntryType == GROUP_STANDARD_ENTRY) + { + if((CANAF_gstd_cnt==0)||(position >= CANAF_gstd_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1)+ position + 1; + bound = total + CANAF_FullCAN_cnt * 3; + while (cntmask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; + cnt++; + } + LPC_CANAF_RAM->mask[cnt-1]=0x00; + } + CANAF_gstd_cnt--; + //update address value + LPC_CANAF->EFF_sa -=0x04; + LPC_CANAF->EFF_GRP_sa -=0x04; + LPC_CANAF->ENDofTable -=0x04; + } + +/************** Remove Explicit Extended ID Entry *************/ + else if(EntryType == EXPLICIT_EXTEND_ENTRY) + { + if((CANAF_ext_cnt==0)||(position >= CANAF_ext_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1)+ CANAF_gstd_cnt + position + 1; + bound = total + CANAF_FullCAN_cnt * 3; + while (cntmask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; + cnt++; + } + LPC_CANAF_RAM->mask[cnt-1]=0x00; + } + CANAF_ext_cnt--; + LPC_CANAF->EFF_GRP_sa -=0x04; + LPC_CANAF->ENDofTable -=0x04; + } + +/************** Remove Group of Extended ID Entry *************/ + else + { + if((CANAF_gext_cnt==0)||(position >= CANAF_gext_cnt)) + { + return CAN_ENTRY_NOT_EXIT_ERROR; + } + else + { + cnt = total - (CANAF_gext_cnt<<1) + (position<<1); + bound = total + CANAF_FullCAN_cnt * 3; + while (cntmask[cnt] = LPC_CANAF_RAM->mask[cnt+2]; + LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+3]; + cnt+=2; + } + } + CANAF_gext_cnt--; + LPC_CANAF->ENDofTable -=0x08; + } + LPC_CANAF->AFMR = 0x04; + return CAN_OK; +} + +/********************************************************************//** + * @brief Send message data + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] CAN_Msg point to the CAN_MSG_Type Structure, it contains message + * information such as: ID, DLC, RTR, ID Format + * @return Status: + * - SUCCESS: send message successfully + * - ERROR: send message unsuccessfully + *********************************************************************/ +Status CAN_SendMsg (LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg) +{ + uint32_t data; + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_ID_FORMAT(CAN_Msg->format)); + if(CAN_Msg->format==STD_ID_FORMAT) + { + CHECK_PARAM(PARAM_ID_11(CAN_Msg->id)); + } + else + { + CHECK_PARAM(PARAM_ID_29(CAN_Msg->id)); + } + CHECK_PARAM(PARAM_DLC(CAN_Msg->len)); + CHECK_PARAM(PARAM_FRAME_TYPE(CAN_Msg->type)); + + //Check status of Transmit Buffer 1 + if (CANx->SR & (1<<2)) + { + /* Transmit Channel 1 is available */ + /* Write frame informations and frame data into its CANxTFI1, + * CANxTID1, CANxTDA1, CANxTDB1 register */ + CANx->TFI1 &= ~0x000F0000; + CANx->TFI1 |= (CAN_Msg->len)<<16; + if(CAN_Msg->type == REMOTE_FRAME) + { + CANx->TFI1 |= (1<<30); //set bit RTR + } + else + { + CANx->TFI1 &= ~(1<<30); + } + if(CAN_Msg->format == EXT_ID_FORMAT) + { + CANx->TFI1 |= (0x80000000); //set bit FF + } + else + { + CANx->TFI1 &= ~(0x80000000); + } + + /* Write CAN ID*/ + CANx->TID1 = CAN_Msg->id; + + /*Write first 4 data bytes*/ + data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24); + CANx->TDA1 = data; + + /*Write second 4 data bytes*/ + data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24); + CANx->TDB1 = data; + + /*Write transmission request*/ + CANx->CMR = 0x21; + return SUCCESS; + } + //check status of Transmit Buffer 2 + else if(CANx->SR & (1<<10)) + { + /* Transmit Channel 2 is available */ + /* Write frame informations and frame data into its CANxTFI2, + * CANxTID2, CANxTDA2, CANxTDB2 register */ + CANx->TFI2 &= ~0x000F0000; + CANx->TFI2 |= (CAN_Msg->len)<<16; + if(CAN_Msg->type == REMOTE_FRAME) + { + CANx->TFI2 |= (1<<30); //set bit RTR + } + else + { + CANx->TFI2 &= ~(1<<30); + } + if(CAN_Msg->format == EXT_ID_FORMAT) + { + CANx->TFI2 |= (0x80000000); //set bit FF + } + else + { + CANx->TFI2 &= ~(0x80000000); + } + + /* Write CAN ID*/ + CANx->TID2 = CAN_Msg->id; + + /*Write first 4 data bytes*/ + data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24); + CANx->TDA2 = data; + + /*Write second 4 data bytes*/ + data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24); + CANx->TDB2 = data; + + /*Write transmission request*/ + CANx->CMR = 0x41; + return SUCCESS; + } + //check status of Transmit Buffer 3 + else if (CANx->SR & (1<<18)) + { + /* Transmit Channel 3 is available */ + /* Write frame informations and frame data into its CANxTFI3, + * CANxTID3, CANxTDA3, CANxTDB3 register */ + CANx->TFI3 &= ~0x000F0000; + CANx->TFI3 |= (CAN_Msg->len)<<16; + if(CAN_Msg->type == REMOTE_FRAME) + { + CANx->TFI3 |= (1<<30); //set bit RTR + } + else + { + CANx->TFI3 &= ~(1<<30); + } + if(CAN_Msg->format == EXT_ID_FORMAT) + { + CANx->TFI3 |= (0x80000000); //set bit FF + } + else + { + CANx->TFI3 &= ~(0x80000000); + } + + /* Write CAN ID*/ + CANx->TID3 = CAN_Msg->id; + + /*Write first 4 data bytes*/ + data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24); + CANx->TDA3 = data; + + /*Write second 4 data bytes*/ + data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24); + CANx->TDB3 = data; + + /*Write transmission request*/ + CANx->CMR = 0x81; + return SUCCESS; + } + else + { + return ERROR; + } +} + +/********************************************************************//** + * @brief Receive message data + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] CAN_Msg point to the CAN_MSG_Type Struct, it will contain received + * message information such as: ID, DLC, RTR, ID Format + * @return Status: + * - SUCCESS: receive message successfully + * - ERROR: receive message unsuccessfully + *********************************************************************/ +Status CAN_ReceiveMsg (LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg) +{ + uint32_t data; + + CHECK_PARAM(PARAM_CANx(CANx)); + + //check status of Receive Buffer + if((CANx->SR &0x00000001)) + { + /* Receive message is available */ + /* Read frame informations */ + CAN_Msg->format = (uint8_t)(((CANx->RFS) & 0x80000000)>>31); + CAN_Msg->type = (uint8_t)(((CANx->RFS) & 0x40000000)>>30); + CAN_Msg->len = (uint8_t)(((CANx->RFS) & 0x000F0000)>>16); + + + /* Read CAN message identifier */ + CAN_Msg->id = CANx->RID; + + /* Read the data if received message was DATA FRAME */ + if (CAN_Msg->type == DATA_FRAME) + { + /* Read first 4 data bytes */ + data = CANx->RDA; + *((uint8_t *) &CAN_Msg->dataA[0])= data & 0x000000FF; + *((uint8_t *) &CAN_Msg->dataA[1])= (data & 0x0000FF00)>>8;; + *((uint8_t *) &CAN_Msg->dataA[2])= (data & 0x00FF0000)>>16; + *((uint8_t *) &CAN_Msg->dataA[3])= (data & 0xFF000000)>>24; + + /* Read second 4 data bytes */ + data = CANx->RDB; + *((uint8_t *) &CAN_Msg->dataB[0])= data & 0x000000FF; + *((uint8_t *) &CAN_Msg->dataB[1])= (data & 0x0000FF00)>>8; + *((uint8_t *) &CAN_Msg->dataB[2])= (data & 0x00FF0000)>>16; + *((uint8_t *) &CAN_Msg->dataB[3])= (data & 0xFF000000)>>24; + + /*release receive buffer*/ + CANx->CMR = 0x04; + } + else + { + /* Received Frame is a Remote Frame, not have data, we just receive + * message information only */ + CANx->CMR = 0x04; /*release receive buffer*/ + return SUCCESS; + } + } + else + { + // no receive message available + return ERROR; + } + return SUCCESS; +} + +/********************************************************************//** + * @brief Receive FullCAN Object + * @param[in] CANAFx: CAN Acceptance Filter register, should be: LPC_CANAF + * @param[in] CAN_Msg point to the CAN_MSG_Type Struct, it will contain received + * message information such as: ID, DLC, RTR, ID Format + * @return CAN_ERROR, could be: + * - CAN_FULL_OBJ_NOT_RCV: FullCAN Object is not be received + * - CAN_OK: Received FullCAN Object successful + * + *********************************************************************/ +CAN_ERROR FCAN_ReadObj (LPC_CANAF_TypeDef* CANAFx, CAN_MSG_Type *CAN_Msg) +{ + uint32_t *pSrc, data; + uint32_t interrut_word, msg_idx, test_bit, head_idx, tail_idx; + + CHECK_PARAM(PARAM_CANAFx(CANAFx)); + + interrut_word = 0; + + if (LPC_CANAF->FCANIC0 != 0) + { + interrut_word = LPC_CANAF->FCANIC0; + head_idx = 0; + tail_idx = 31; + } + else if (LPC_CANAF->FCANIC1 != 0) + { + interrut_word = LPC_CANAF->FCANIC1; + head_idx = 32; + tail_idx = 63; + } + + if (interrut_word != 0) + { + /* Detect for interrupt pending */ + msg_idx = 0; + for (msg_idx = head_idx; msg_idx <= tail_idx; msg_idx++) + { + test_bit = interrut_word & 0x1; + interrut_word = interrut_word >> 1; + + if (test_bit) + { + pSrc = (uint32_t *) (LPC_CANAF->ENDofTable + LPC_CANAF_RAM_BASE + msg_idx * 12); + + /* Has been finished updating the content */ + if ((*pSrc & 0x03000000L) == 0x03000000L) + { + /*clear semaphore*/ + *pSrc &= 0xFCFFFFFF; + + /*Set to DatA*/ + pSrc++; + /* Copy to dest buf */ + data = *pSrc; + *((uint8_t *) &CAN_Msg->dataA[0])= data & 0x000000FF; + *((uint8_t *) &CAN_Msg->dataA[1])= (data & 0x0000FF00)>>8; + *((uint8_t *) &CAN_Msg->dataA[2])= (data & 0x00FF0000)>>16; + *((uint8_t *) &CAN_Msg->dataA[3])= (data & 0xFF000000)>>24; + + /*Set to DatB*/ + pSrc++; + /* Copy to dest buf */ + data = *pSrc; + *((uint8_t *) &CAN_Msg->dataB[0])= data & 0x000000FF; + *((uint8_t *) &CAN_Msg->dataB[1])= (data & 0x0000FF00)>>8; + *((uint8_t *) &CAN_Msg->dataB[2])= (data & 0x00FF0000)>>16; + *((uint8_t *) &CAN_Msg->dataB[3])= (data & 0xFF000000)>>24; + /*Back to Dat1*/ + pSrc -= 2; + + CAN_Msg->id = *pSrc & 0x7FF; + CAN_Msg->len = (uint8_t) (*pSrc >> 16) & 0x0F; + CAN_Msg->format = 0; //FullCAN Object ID always is 11-bit value + CAN_Msg->type = (uint8_t)(*pSrc >> 30) &0x01; + /*Re-read semaphore*/ + if ((*pSrc & 0x03000000L) == 0) + { + return CAN_OK; + } + } + } + } + } + return CAN_FULL_OBJ_NOT_RCV; +} +/********************************************************************//** + * @brief Get CAN Control Status + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] arg: type of CAN status to get from CAN status register + * Should be: + * - CANCTRL_GLOBAL_STS: CAN Global Status + * - CANCTRL_INT_CAP: CAN Interrupt and Capture + * - CANCTRL_ERR_WRN: CAN Error Warning Limit + * - CANCTRL_STS: CAN Control Status + * @return Current Control Status that you want to get value + *********************************************************************/ +uint32_t CAN_GetCTRLStatus (LPC_CAN_TypeDef* CANx, CAN_CTRL_STS_Type arg) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_CTRL_STS_TYPE(arg)); + + switch (arg) + { + case CANCTRL_GLOBAL_STS: + return CANx->GSR; + + case CANCTRL_INT_CAP: + return CANx->ICR; + + case CANCTRL_ERR_WRN: + return CANx->EWL; + + default: // CANCTRL_STS + return CANx->SR; + } +} +/********************************************************************//** + * @brief Get CAN Central Status + * @param[in] CANCRx point to LPC_CANCR_TypeDef, should be: LPC_CANCR + * @param[in] arg: type of CAN status to get from CAN Central status register + * Should be: + * - CANCR_TX_STS: Central CAN Tx Status + * - CANCR_RX_STS: Central CAN Rx Status + * - CANCR_MS: Central CAN Miscellaneous Status + * @return Current Central Status that you want to get value + *********************************************************************/ +uint32_t CAN_GetCRStatus (LPC_CANCR_TypeDef* CANCRx, CAN_CR_STS_Type arg) +{ + CHECK_PARAM(PARAM_CANCRx(CANCRx)); + CHECK_PARAM(PARAM_CR_STS_TYPE(arg)); + + switch (arg) + { + case CANCR_TX_STS: + return CANCRx->CANTxSR; + + case CANCR_RX_STS: + return CANCRx->CANRxSR; + + default: // CANCR_MS + return CANCRx->CANMSR; + } +} +/********************************************************************//** + * @brief Enable/Disable CAN Interrupt + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] arg: type of CAN interrupt that you want to enable/disable + * Should be: + * - CANINT_RIE: CAN Receiver Interrupt Enable + * - CANINT_TIE1: CAN Transmit Interrupt Enable + * - CANINT_EIE: CAN Error Warning Interrupt Enable + * - CANINT_DOIE: CAN Data Overrun Interrupt Enable + * - CANINT_WUIE: CAN Wake-Up Interrupt Enable + * - CANINT_EPIE: CAN Error Passive Interrupt Enable + * - CANINT_ALIE: CAN Arbitration Lost Interrupt Enable + * - CANINT_BEIE: CAN Bus Error Interrupt Enable + * - CANINT_IDIE: CAN ID Ready Interrupt Enable + * - CANINT_TIE2: CAN Transmit Interrupt Enable for Buffer2 + * - CANINT_TIE3: CAN Transmit Interrupt Enable for Buffer3 + * - CANINT_FCE: FullCAN Interrupt Enable + * @param[in] NewState: New state of this function, should be: + * - ENABLE + * - DISABLE + * @return none + *********************************************************************/ +void CAN_IRQCmd (LPC_CAN_TypeDef* CANx, CAN_INT_EN_Type arg, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_INT_EN_TYPE(arg)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if(NewState == ENABLE) + { + if(arg==CANINT_FCE) + { + LPC_CANAF->AFMR = 0x01; + LPC_CANAF->FCANIE = 0x01; + LPC_CANAF->AFMR = 0x04; + } + else + CANx->IER |= (1 << arg); + } + else + { + if(arg==CANINT_FCE){ + LPC_CANAF->AFMR = 0x01; + LPC_CANAF->FCANIE = 0x01; + LPC_CANAF->AFMR = 0x00; + } + else + CANx->IER &= ~(1 << arg); + } +} + +/********************************************************************//** + * @brief Setting Acceptance Filter mode + * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: LPC_CANAF + * @param[in] AFMode: type of AF mode that you want to set, should be: + * - CAN_Normal: Normal mode + * - CAN_AccOff: Acceptance Filter Off Mode + * - CAN_AccBP: Acceptance Fileter Bypass Mode + * - CAN_eFCAN: FullCAN Mode Enhancement + * @return none + *********************************************************************/ +void CAN_SetAFMode (LPC_CANAF_TypeDef* CANAFx, CAN_AFMODE_Type AFMode) +{ + CHECK_PARAM(PARAM_CANAFx(CANAFx)); + CHECK_PARAM(PARAM_AFMODE_TYPE(AFMode)); + + switch(AFMode) + { + case CAN_Normal: + CANAFx->AFMR = 0x00; + break; + case CAN_AccOff: + CANAFx->AFMR = 0x01; + break; + case CAN_AccBP: + CANAFx->AFMR = 0x02; + break; + case CAN_eFCAN: + CANAFx->AFMR = 0x04; + break; + } +} + +/********************************************************************//** + * @brief Enable/Disable CAN Mode + * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] mode: type of CAN mode that you want to enable/disable, should be: + * - CAN_OPERATING_MODE: Normal Operating Mode + * - CAN_RESET_MODE: Reset Mode + * - CAN_LISTENONLY_MODE: Listen Only Mode + * - CAN_SELFTEST_MODE: Self Test Mode + * - CAN_TXPRIORITY_MODE: Transmit Priority Mode + * - CAN_SLEEP_MODE: Sleep Mode + * - CAN_RXPOLARITY_MODE: Receive Polarity Mode + * - CAN_TEST_MODE: Test Mode + * @param[in] NewState: New State of this function, should be: + * - ENABLE + * - DISABLE + * @return none + *********************************************************************/ +void CAN_ModeConfig(LPC_CAN_TypeDef* CANx, CAN_MODE_Type mode, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + CHECK_PARAM(PARAM_MODE_TYPE(mode)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + switch(mode) + { + case CAN_OPERATING_MODE: + CANx->MOD = 0x00; + break; + case CAN_RESET_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_RM; + else + CANx->MOD &= ~CAN_MOD_RM; + break; + case CAN_LISTENONLY_MODE: + CANx->MOD |=CAN_MOD_RM;//Enter Reset mode + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_LOM; + else + CANx->MOD &=~CAN_MOD_LOM; + CANx->MOD &=~CAN_MOD_RM;//Release Reset mode + break; + case CAN_SELFTEST_MODE: + CANx->MOD |=CAN_MOD_RM;//Enter Reset mode + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_STM; + else + CANx->MOD &=~CAN_MOD_STM; + CANx->MOD &=~CAN_MOD_RM;//Release Reset mode + break; + case CAN_TXPRIORITY_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_TPM; + else + CANx->MOD &=~CAN_MOD_TPM; + break; + case CAN_SLEEP_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_SM; + else + CANx->MOD &=~CAN_MOD_SM; + break; + case CAN_RXPOLARITY_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_RPM; + else + CANx->MOD &=~CAN_MOD_RPM; + break; + case CAN_TEST_MODE: + if(NewState == ENABLE) + CANx->MOD |=CAN_MOD_TM; + else + CANx->MOD &=~CAN_MOD_TM; + break; + } +} +/*********************************************************************//** + * @brief Set CAN command request + * @param[in] CANx point to CAN peripheral selected, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @param[in] CMRType command request type, should be: + * - CAN_CMR_TR: Transmission request + * - CAN_CMR_AT: Abort Transmission request + * - CAN_CMR_RRB: Release Receive Buffer request + * - CAN_CMR_CDO: Clear Data Overrun request + * - CAN_CMR_SRR: Self Reception request + * - CAN_CMR_STB1: Select Tx Buffer 1 request + * - CAN_CMR_STB2: Select Tx Buffer 2 request + * - CAN_CMR_STB3: Select Tx Buffer 3 request + * @return CANICR (CAN interrupt and Capture register) value + **********************************************************************/ +void CAN_SetCommand(LPC_CAN_TypeDef* CANx, uint32_t CMRType) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + CANx->CMR |= CMRType; +} + +/*********************************************************************//** + * @brief Get CAN interrupt status + * @param[in] CANx point to CAN peripheral selected, should be: + * - LPC_CAN1: CAN1 peripheral + * - LPC_CAN2: CAN2 peripheral + * @return CANICR (CAN interrupt and Capture register) value + **********************************************************************/ +uint32_t CAN_IntGetStatus(LPC_CAN_TypeDef* CANx) +{ + CHECK_PARAM(PARAM_CANx(CANx)); + return CANx->ICR; +} + +/*********************************************************************//** + * @brief Check if FullCAN interrupt enable or not + * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: LPC_CANAF + * @return IntStatus, could be: + * - SET: if FullCAN interrupt is enable + * - RESET: if FullCAN interrupt is disable + **********************************************************************/ +IntStatus CAN_FullCANIntGetStatus (LPC_CANAF_TypeDef* CANAFx) +{ + CHECK_PARAM( PARAM_CANAFx(CANAFx)); + if (CANAFx->FCANIE) + return SET; + return RESET; +} + +/*********************************************************************//** + * @brief Get value of FullCAN interrupt and capture register + * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: LPC_CANAF + * @param[in] type: FullCAN IC type, should be: + * - FULLCAN_IC0: FullCAN Interrupt Capture 0 + * - FULLCAN_IC1: FullCAN Interrupt Capture 1 + * @return FCANIC0 or FCANIC1 (FullCAN interrupt and Capture register) value + **********************************************************************/ +uint32_t CAN_FullCANPendGetStatus(LPC_CANAF_TypeDef* CANAFx, FullCAN_IC_Type type) +{ + CHECK_PARAM(PARAM_CANAFx(CANAFx)); + CHECK_PARAM( PARAM_FULLCAN_IC(type)); + if (type == FULLCAN_IC0) + return CANAFx->FCANIC0; + return CANAFx->FCANIC1; +} +/* End of Public Variables ---------------------------------------------------------- */ +/** + * @} + */ + +#endif /* _CAN */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_clkpwr.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_clkpwr.c new file mode 100644 index 0000000000..4f518e15a8 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_clkpwr.c @@ -0,0 +1,350 @@ +/********************************************************************** +* $Id$ lpc17xx_clkpwr.c 2010-06-18 +*//** +* @file lpc17xx_clkpwr.c +* @brief Contains all functions support for Clock and Power Control +* firmware library on LPC17xx +* @version 3.0 +* @date 18. June. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup CLKPWR + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_clkpwr.h" + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup CLKPWR_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Set value of each Peripheral Clock Selection + * @param[in] ClkType Peripheral Clock Selection of each type, + * should be one of the following: + * - CLKPWR_PCLKSEL_WDT : WDT + - CLKPWR_PCLKSEL_TIMER0 : Timer 0 + - CLKPWR_PCLKSEL_TIMER1 : Timer 1 + - CLKPWR_PCLKSEL_UART0 : UART 0 + - CLKPWR_PCLKSEL_UART1 : UART 1 + - CLKPWR_PCLKSEL_PWM1 : PWM 1 + - CLKPWR_PCLKSEL_I2C0 : I2C 0 + - CLKPWR_PCLKSEL_SPI : SPI + - CLKPWR_PCLKSEL_SSP1 : SSP 1 + - CLKPWR_PCLKSEL_DAC : DAC + - CLKPWR_PCLKSEL_ADC : ADC + - CLKPWR_PCLKSEL_CAN1 : CAN 1 + - CLKPWR_PCLKSEL_CAN2 : CAN 2 + - CLKPWR_PCLKSEL_ACF : ACF + - CLKPWR_PCLKSEL_QEI : QEI + - CLKPWR_PCLKSEL_PCB : PCB + - CLKPWR_PCLKSEL_I2C1 : I2C 1 + - CLKPWR_PCLKSEL_SSP0 : SSP 0 + - CLKPWR_PCLKSEL_TIMER2 : Timer 2 + - CLKPWR_PCLKSEL_TIMER3 : Timer 3 + - CLKPWR_PCLKSEL_UART2 : UART 2 + - CLKPWR_PCLKSEL_UART3 : UART 3 + - CLKPWR_PCLKSEL_I2C2 : I2C 2 + - CLKPWR_PCLKSEL_I2S : I2S + - CLKPWR_PCLKSEL_RIT : RIT + - CLKPWR_PCLKSEL_SYSCON : SYSCON + - CLKPWR_PCLKSEL_MC : MC + + * @param[in] DivVal Value of divider, should be: + * - CLKPWR_PCLKSEL_CCLK_DIV_4 : PCLK_peripheral = CCLK/4 + * - CLKPWR_PCLKSEL_CCLK_DIV_1 : PCLK_peripheral = CCLK/1 + * - CLKPWR_PCLKSEL_CCLK_DIV_2 : PCLK_peripheral = CCLK/2 + * + * @return none + **********************************************************************/ +void CLKPWR_SetPCLKDiv (uint32_t ClkType, uint32_t DivVal) +{ + uint32_t bitpos; + + bitpos = (ClkType < 32) ? (ClkType) : (ClkType - 32); + + /* PCLKSEL0 selected */ + if (ClkType < 32) + { + /* Clear two bit at bit position */ + LPC_SC->PCLKSEL0 &= (~(CLKPWR_PCLKSEL_BITMASK(bitpos))); + + /* Set two selected bit */ + LPC_SC->PCLKSEL0 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal)); + } + /* PCLKSEL1 selected */ + else + { + /* Clear two bit at bit position */ + LPC_SC->PCLKSEL1 &= ~(CLKPWR_PCLKSEL_BITMASK(bitpos)); + + /* Set two selected bit */ + LPC_SC->PCLKSEL1 |= (CLKPWR_PCLKSEL_SET(bitpos, DivVal)); + } +} + + +/*********************************************************************//** + * @brief Get current value of each Peripheral Clock Selection + * @param[in] ClkType Peripheral Clock Selection of each type, + * should be one of the following: + * - CLKPWR_PCLKSEL_WDT : WDT + - CLKPWR_PCLKSEL_TIMER0 : Timer 0 + - CLKPWR_PCLKSEL_TIMER1 : Timer 1 + - CLKPWR_PCLKSEL_UART0 : UART 0 + - CLKPWR_PCLKSEL_UART1 : UART 1 + - CLKPWR_PCLKSEL_PWM1 : PWM 1 + - CLKPWR_PCLKSEL_I2C0 : I2C 0 + - CLKPWR_PCLKSEL_SPI : SPI + - CLKPWR_PCLKSEL_SSP1 : SSP 1 + - CLKPWR_PCLKSEL_DAC : DAC + - CLKPWR_PCLKSEL_ADC : ADC + - CLKPWR_PCLKSEL_CAN1 : CAN 1 + - CLKPWR_PCLKSEL_CAN2 : CAN 2 + - CLKPWR_PCLKSEL_ACF : ACF + - CLKPWR_PCLKSEL_QEI : QEI + - CLKPWR_PCLKSEL_PCB : PCB + - CLKPWR_PCLKSEL_I2C1 : I2C 1 + - CLKPWR_PCLKSEL_SSP0 : SSP 0 + - CLKPWR_PCLKSEL_TIMER2 : Timer 2 + - CLKPWR_PCLKSEL_TIMER3 : Timer 3 + - CLKPWR_PCLKSEL_UART2 : UART 2 + - CLKPWR_PCLKSEL_UART3 : UART 3 + - CLKPWR_PCLKSEL_I2C2 : I2C 2 + - CLKPWR_PCLKSEL_I2S : I2S + - CLKPWR_PCLKSEL_RIT : RIT + - CLKPWR_PCLKSEL_SYSCON : SYSCON + - CLKPWR_PCLKSEL_MC : MC + + * @return Value of Selected Peripheral Clock Selection + **********************************************************************/ +uint32_t CLKPWR_GetPCLKSEL (uint32_t ClkType) +{ + uint32_t bitpos, retval; + + if (ClkType < 32) + { + bitpos = ClkType; + retval = LPC_SC->PCLKSEL0; + } + else + { + bitpos = ClkType - 32; + retval = LPC_SC->PCLKSEL1; + } + + retval = CLKPWR_PCLKSEL_GET(bitpos, retval); + return retval; +} + + + +/*********************************************************************//** + * @brief Get current value of each Peripheral Clock + * @param[in] ClkType Peripheral Clock Selection of each type, + * should be one of the following: + * - CLKPWR_PCLKSEL_WDT : WDT + - CLKPWR_PCLKSEL_TIMER0 : Timer 0 + - CLKPWR_PCLKSEL_TIMER1 : Timer 1 + - CLKPWR_PCLKSEL_UART0 : UART 0 + - CLKPWR_PCLKSEL_UART1 : UART 1 + - CLKPWR_PCLKSEL_PWM1 : PWM 1 + - CLKPWR_PCLKSEL_I2C0 : I2C 0 + - CLKPWR_PCLKSEL_SPI : SPI + - CLKPWR_PCLKSEL_SSP1 : SSP 1 + - CLKPWR_PCLKSEL_DAC : DAC + - CLKPWR_PCLKSEL_ADC : ADC + - CLKPWR_PCLKSEL_CAN1 : CAN 1 + - CLKPWR_PCLKSEL_CAN2 : CAN 2 + - CLKPWR_PCLKSEL_ACF : ACF + - CLKPWR_PCLKSEL_QEI : QEI + - CLKPWR_PCLKSEL_PCB : PCB + - CLKPWR_PCLKSEL_I2C1 : I2C 1 + - CLKPWR_PCLKSEL_SSP0 : SSP 0 + - CLKPWR_PCLKSEL_TIMER2 : Timer 2 + - CLKPWR_PCLKSEL_TIMER3 : Timer 3 + - CLKPWR_PCLKSEL_UART2 : UART 2 + - CLKPWR_PCLKSEL_UART3 : UART 3 + - CLKPWR_PCLKSEL_I2C2 : I2C 2 + - CLKPWR_PCLKSEL_I2S : I2S + - CLKPWR_PCLKSEL_RIT : RIT + - CLKPWR_PCLKSEL_SYSCON : SYSCON + - CLKPWR_PCLKSEL_MC : MC + + * @return Value of Selected Peripheral Clock + **********************************************************************/ +uint32_t CLKPWR_GetPCLK (uint32_t ClkType) +{ + uint32_t retval, div; + + retval = SystemCoreClock; + div = CLKPWR_GetPCLKSEL(ClkType); + + switch (div) + { + case 0: + div = 4; + break; + + case 1: + div = 1; + break; + + case 2: + div = 2; + break; + + case 3: + div = 8; + break; + } + retval /= div; + + return retval; +} + + + +/*********************************************************************//** + * @brief Configure power supply for each peripheral according to NewState + * @param[in] PPType Type of peripheral used to enable power, + * should be one of the following: + * - CLKPWR_PCONP_PCTIM0 : Timer 0 + - CLKPWR_PCONP_PCTIM1 : Timer 1 + - CLKPWR_PCONP_PCUART0 : UART 0 + - CLKPWR_PCONP_PCUART1 : UART 1 + - CLKPWR_PCONP_PCPWM1 : PWM 1 + - CLKPWR_PCONP_PCI2C0 : I2C 0 + - CLKPWR_PCONP_PCSPI : SPI + - CLKPWR_PCONP_PCRTC : RTC + - CLKPWR_PCONP_PCSSP1 : SSP 1 + - CLKPWR_PCONP_PCAD : ADC + - CLKPWR_PCONP_PCAN1 : CAN 1 + - CLKPWR_PCONP_PCAN2 : CAN 2 + - CLKPWR_PCONP_PCGPIO : GPIO + - CLKPWR_PCONP_PCRIT : RIT + - CLKPWR_PCONP_PCMC : MC + - CLKPWR_PCONP_PCQEI : QEI + - CLKPWR_PCONP_PCI2C1 : I2C 1 + - CLKPWR_PCONP_PCSSP0 : SSP 0 + - CLKPWR_PCONP_PCTIM2 : Timer 2 + - CLKPWR_PCONP_PCTIM3 : Timer 3 + - CLKPWR_PCONP_PCUART2 : UART 2 + - CLKPWR_PCONP_PCUART3 : UART 3 + - CLKPWR_PCONP_PCI2C2 : I2C 2 + - CLKPWR_PCONP_PCI2S : I2S + - CLKPWR_PCONP_PCGPDMA : GPDMA + - CLKPWR_PCONP_PCENET : Ethernet + - CLKPWR_PCONP_PCUSB : USB + * + * @param[in] NewState New state of Peripheral Power, should be: + * - ENABLE : Enable power for this peripheral + * - DISABLE : Disable power for this peripheral + * + * @return none + **********************************************************************/ +void CLKPWR_ConfigPPWR (uint32_t PPType, FunctionalState NewState) +{ + if (NewState == ENABLE) + { + LPC_SC->PCONP |= PPType & CLKPWR_PCONP_BITMASK; + } + else if (NewState == DISABLE) + { + LPC_SC->PCONP &= (~PPType) & CLKPWR_PCONP_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enter Sleep mode with co-operated instruction by the Cortex-M3. + * @param[in] None + * @return None + **********************************************************************/ +void CLKPWR_Sleep(void) +{ + LPC_SC->PCON = 0x00; + /* Sleep Mode*/ + __WFI(); +} + + +/*********************************************************************//** + * @brief Enter Deep Sleep mode with co-operated instruction by the Cortex-M3. + * @param[in] None + * @return None + **********************************************************************/ +void CLKPWR_DeepSleep(void) +{ + /* Deep-Sleep Mode, set SLEEPDEEP bit */ + SCB->SCR = 0x4; + LPC_SC->PCON = 0x00; + /* Deep Sleep Mode*/ + __WFI(); +} + + +/*********************************************************************//** + * @brief Enter Power Down mode with co-operated instruction by the Cortex-M3. + * @param[in] None + * @return None + **********************************************************************/ +void CLKPWR_PowerDown(void) +{ + /* Deep-Sleep Mode, set SLEEPDEEP bit */ + SCB->SCR = 0x4; + LPC_SC->PCON = 0x01; + /* Power Down Mode*/ + __WFI(); +} + + +/*********************************************************************//** + * @brief Enter Deep Power Down mode with co-operated instruction by the Cortex-M3. + * @param[in] None + * @return None + **********************************************************************/ +void CLKPWR_DeepPowerDown(void) +{ + /* Deep-Sleep Mode, set SLEEPDEEP bit */ + SCB->SCR = 0x4; + LPC_SC->PCON = 0x03; + /* Deep Power Down Mode*/ + __WFI(); +} + +/** + * @} + */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_dac.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_dac.c new file mode 100644 index 0000000000..f13bf3b6a9 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_dac.c @@ -0,0 +1,151 @@ +/********************************************************************** +* $Id$ lpc17xx_dac.c 2010-05-21 +*//** +* @file lpc17xx_dac.c +* @brief Contains all functions support for DAC firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup DAC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_dac.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _DAC + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup DAC_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Initial ADC configuration + * - Maximum current is 700 uA + * - Value to AOUT is 0 + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @return None + ***********************************************************************/ +void DAC_Init(LPC_DAC_TypeDef *DACx) +{ + CHECK_PARAM(PARAM_DACx(DACx)); + /* Set default clock divider for DAC */ + // CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_DAC, CLKPWR_PCLKSEL_CCLK_DIV_4); + //Set maximum current output + DAC_SetBias(LPC_DAC,DAC_MAX_CURRENT_700uA); +} + +/*********************************************************************//** + * @brief Update value to DAC + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @param[in] dac_value : value 10 bit to be converted to output + * @return None + ***********************************************************************/ +void DAC_UpdateValue (LPC_DAC_TypeDef *DACx,uint32_t dac_value) +{ + uint32_t tmp; + CHECK_PARAM(PARAM_DACx(DACx)); + tmp = DACx->DACR & DAC_BIAS_EN; + tmp |= DAC_VALUE(dac_value); + // Update value + DACx->DACR = tmp; +} + +/*********************************************************************//** + * @brief Set Maximum current for DAC + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @param[in] bias : 0 is 700 uA + * 1 350 uA + * @return None + ***********************************************************************/ +void DAC_SetBias (LPC_DAC_TypeDef *DACx,uint32_t bias) +{ + CHECK_PARAM(PARAM_DAC_CURRENT_OPT(bias)); + DACx->DACR &=~DAC_BIAS_EN; + if (bias == DAC_MAX_CURRENT_350uA) + { + DACx->DACR |= DAC_BIAS_EN; + } +} + +/*********************************************************************//** + * @brief To enable the DMA operation and control DMA timer + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @param[in] DAC_ConverterConfigStruct pointer to DAC_CONVERTER_CFG_Type + * - DBLBUF_ENA : enable/disable DACR double buffering feature + * - CNT_ENA : enable/disable timer out counter + * - DMA_ENA : enable/disable DMA access + * @return None + ***********************************************************************/ +void DAC_ConfigDAConverterControl (LPC_DAC_TypeDef *DACx,DAC_CONVERTER_CFG_Type *DAC_ConverterConfigStruct) +{ + CHECK_PARAM(PARAM_DACx(DACx)); + DACx->DACCTRL &= ~DAC_DACCTRL_MASK; + if (DAC_ConverterConfigStruct->DBLBUF_ENA) + DACx->DACCTRL |= DAC_DBLBUF_ENA; + if (DAC_ConverterConfigStruct->CNT_ENA) + DACx->DACCTRL |= DAC_CNT_ENA; + if (DAC_ConverterConfigStruct->DMA_ENA) + DACx->DACCTRL |= DAC_DMA_ENA; +} + +/*********************************************************************//** + * @brief Set reload value for interrupt/DMA counter + * @param[in] DACx pointer to LPC_DAC_TypeDef, should be: LPC_DAC + * @param[in] time_out time out to reload for interrupt/DMA counter + * @return None + ***********************************************************************/ +void DAC_SetDMATimeOut(LPC_DAC_TypeDef *DACx, uint32_t time_out) +{ + CHECK_PARAM(PARAM_DACx(DACx)); + DACx->DACCNTVAL = DAC_CCNT_VALUE(time_out); +} + +/** + * @} + */ + +#endif /* _DAC */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_emac.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_emac.c new file mode 100644 index 0000000000..f0e4e4627e --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_emac.c @@ -0,0 +1,963 @@ +/********************************************************************** +* $Id$ lpc17xx_emac.c 2010-05-21 +*//** +* @file lpc17xx_emac.c +* @brief Contains all functions support for Ethernet MAC firmware +* library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup EMAC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_emac.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _EMAC + +/* Private Variables ---------------------------------------------------------- */ +/** @defgroup EMAC_Private_Variables EMAC Private Variables + * @{ + */ + +/* MII Mgmt Configuration register - Clock divider setting */ +const uint8_t EMAC_clkdiv[] = { 4, 6, 8, 10, 14, 20, 28, 36, 40, 44, 48, 52, 56, 60, 64}; + +/* EMAC local DMA Descriptors */ + +/** Rx Descriptor data array */ +static RX_Desc Rx_Desc[EMAC_NUM_RX_FRAG]; + +/** Rx Status data array - Must be 8-Byte aligned */ +#if defined ( __CC_ARM ) +static __align(8) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG]; +#elif defined ( __ICCARM__ ) +#pragma data_alignment=8 +static RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG]; +#elif defined ( __GNUC__ ) +static __attribute__ ((aligned (8))) RX_Stat Rx_Stat[EMAC_NUM_RX_FRAG]; +#endif + +/** Tx Descriptor data array */ +static TX_Desc Tx_Desc[EMAC_NUM_TX_FRAG]; +/** Tx Status data array */ +static TX_Stat Tx_Stat[EMAC_NUM_TX_FRAG]; + +/* EMAC local DMA buffers */ +/** Rx buffer data */ +static uint32_t rx_buf[EMAC_NUM_RX_FRAG][EMAC_ETH_MAX_FLEN>>2]; +/** Tx buffer data */ +static uint32_t tx_buf[EMAC_NUM_TX_FRAG][EMAC_ETH_MAX_FLEN>>2]; + +/** + * @} + */ + +/* Private Functions ---------------------------------------------------------- */ +static void rx_descr_init (void); +static void tx_descr_init (void); +static int32_t write_PHY (uint32_t PhyReg, uint16_t Value); +static int32_t read_PHY (uint32_t PhyReg); + +static void setEmacAddr(uint8_t abStationAddr[]); +static int32_t emac_CRCCalc(uint8_t frame_no_fcs[], int32_t frame_len); + + +/*--------------------------- rx_descr_init ---------------------------------*/ +/*********************************************************************//** + * @brief Initializes RX Descriptor + * @param[in] None + * @return None + ***********************************************************************/ +static void rx_descr_init (void) +{ + /* Initialize Receive Descriptor and Status array. */ + uint32_t i; + + for (i = 0; i < EMAC_NUM_RX_FRAG; i++) { + Rx_Desc[i].Packet = (uint32_t)&rx_buf[i]; + Rx_Desc[i].Ctrl = EMAC_RCTRL_INT | (EMAC_ETH_MAX_FLEN - 1); + Rx_Stat[i].Info = 0; + Rx_Stat[i].HashCRC = 0; + } + + /* Set EMAC Receive Descriptor Registers. */ + LPC_EMAC->RxDescriptor = (uint32_t)&Rx_Desc[0]; + LPC_EMAC->RxStatus = (uint32_t)&Rx_Stat[0]; + LPC_EMAC->RxDescriptorNumber = EMAC_NUM_RX_FRAG - 1; + + /* Rx Descriptors Point to 0 */ + LPC_EMAC->RxConsumeIndex = 0; +} + + +/*--------------------------- tx_descr_init ---- ----------------------------*/ +/*********************************************************************//** + * @brief Initializes TX Descriptor + * @param[in] None + * @return None + ***********************************************************************/ +static void tx_descr_init (void) { + /* Initialize Transmit Descriptor and Status array. */ + uint32_t i; + + for (i = 0; i < EMAC_NUM_TX_FRAG; i++) { + Tx_Desc[i].Packet = (uint32_t)&tx_buf[i]; + Tx_Desc[i].Ctrl = 0; + Tx_Stat[i].Info = 0; + } + + /* Set EMAC Transmit Descriptor Registers. */ + LPC_EMAC->TxDescriptor = (uint32_t)&Tx_Desc[0]; + LPC_EMAC->TxStatus = (uint32_t)&Tx_Stat[0]; + LPC_EMAC->TxDescriptorNumber = EMAC_NUM_TX_FRAG - 1; + + /* Tx Descriptors Point to 0 */ + LPC_EMAC->TxProduceIndex = 0; +} + + +/*--------------------------- write_PHY -------------------------------------*/ +/*********************************************************************//** + * @brief Write value to PHY device + * @param[in] PhyReg: PHY Register address + * @param[in] Value: Value to write + * @return 0 - if success + * 1 - if fail + ***********************************************************************/ +static int32_t write_PHY (uint32_t PhyReg, uint16_t Value) +{ + /* Write a data 'Value' to PHY register 'PhyReg'. */ + uint32_t tout; + + LPC_EMAC->MADR = EMAC_DEF_ADR | PhyReg; + LPC_EMAC->MWTD = Value; + + /* Wait until operation completed */ + tout = 0; + for (tout = 0; tout < EMAC_MII_WR_TOUT; tout++) { + if ((LPC_EMAC->MIND & EMAC_MIND_BUSY) == 0) { + return (0); + } + } + // Time out! + return (-1); +} + + +/*--------------------------- read_PHY --------------------------------------*/ +/*********************************************************************//** + * @brief Read value from PHY device + * @param[in] PhyReg: PHY Register address + * @return 0 - if success + * 1 - if fail + ***********************************************************************/ +static int32_t read_PHY (uint32_t PhyReg) +{ + /* Read a PHY register 'PhyReg'. */ + uint32_t tout; + + LPC_EMAC->MADR = EMAC_DEF_ADR | PhyReg; + LPC_EMAC->MCMD = EMAC_MCMD_READ; + + /* Wait until operation completed */ + tout = 0; + for (tout = 0; tout < EMAC_MII_RD_TOUT; tout++) { + if ((LPC_EMAC->MIND & EMAC_MIND_BUSY) == 0) { + LPC_EMAC->MCMD = 0; + return (LPC_EMAC->MRDD); + } + } + // Time out! + return (-1); +} + +/*********************************************************************//** + * @brief Set Station MAC address for EMAC module + * @param[in] abStationAddr Pointer to Station address that contains 6-bytes + * of MAC address (should be in order from MAC Address 1 to MAC Address 6) + * @return None + **********************************************************************/ +static void setEmacAddr(uint8_t abStationAddr[]) +{ + /* Set the Ethernet MAC Address registers */ + LPC_EMAC->SA0 = ((uint32_t)abStationAddr[5] << 8) | (uint32_t)abStationAddr[4]; + LPC_EMAC->SA1 = ((uint32_t)abStationAddr[3] << 8) | (uint32_t)abStationAddr[2]; + LPC_EMAC->SA2 = ((uint32_t)abStationAddr[1] << 8) | (uint32_t)abStationAddr[0]; +} + + +/*********************************************************************//** + * @brief Calculates CRC code for number of bytes in the frame + * @param[in] frame_no_fcs Pointer to the first byte of the frame + * @param[in] frame_len length of the frame without the FCS + * @return the CRC as a 32 bit integer + **********************************************************************/ +static int32_t emac_CRCCalc(uint8_t frame_no_fcs[], int32_t frame_len) +{ + int i; // iterator + int j; // another iterator + char byte; // current byte + int crc; // CRC result + int q0, q1, q2, q3; // temporary variables + crc = 0xFFFFFFFF; + for (i = 0; i < frame_len; i++) { + byte = *frame_no_fcs++; + for (j = 0; j < 2; j++) { + if (((crc >> 28) ^ (byte >> 3)) & 0x00000001) { + q3 = 0x04C11DB7; + } else { + q3 = 0x00000000; + } + if (((crc >> 29) ^ (byte >> 2)) & 0x00000001) { + q2 = 0x09823B6E; + } else { + q2 = 0x00000000; + } + if (((crc >> 30) ^ (byte >> 1)) & 0x00000001) { + q1 = 0x130476DC; + } else { + q1 = 0x00000000; + } + if (((crc >> 31) ^ (byte >> 0)) & 0x00000001) { + q0 = 0x2608EDB8; + } else { + q0 = 0x00000000; + } + crc = (crc << 4) ^ q3 ^ q2 ^ q1 ^ q0; + byte >>= 4; + } + } + return crc; +} +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup EMAC_Public_Functions + * @{ + */ + + +/*********************************************************************//** + * @brief Initializes the EMAC peripheral according to the specified +* parameters in the EMAC_ConfigStruct. + * @param[in] EMAC_ConfigStruct Pointer to a EMAC_CFG_Type structure +* that contains the configuration information for the +* specified EMAC peripheral. + * @return None + * + * Note: This function will initialize EMAC module according to procedure below: + * - Remove the soft reset condition from the MAC + * - Configure the PHY via the MIIM interface of the MAC + * - Select RMII mode + * - Configure the transmit and receive DMA engines, including the descriptor arrays + * - Configure the host registers (MAC1,MAC2 etc.) in the MAC + * - Enable the receive and transmit data paths + * In default state after initializing, only Rx Done and Tx Done interrupt are enabled, + * all remain interrupts are disabled + * (Ref. from LPC17xx UM) + **********************************************************************/ +Status EMAC_Init(EMAC_CFG_Type *EMAC_ConfigStruct) +{ + /* Initialize the EMAC Ethernet controller. */ + int32_t regv,tout, tmp; + + /* Set up clock and power for Ethernet module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCENET, ENABLE); + + /* Reset all EMAC internal modules */ + LPC_EMAC->MAC1 = EMAC_MAC1_RES_TX | EMAC_MAC1_RES_MCS_TX | EMAC_MAC1_RES_RX | + EMAC_MAC1_RES_MCS_RX | EMAC_MAC1_SIM_RES | EMAC_MAC1_SOFT_RES; + + LPC_EMAC->Command = EMAC_CR_REG_RES | EMAC_CR_TX_RES | EMAC_CR_RX_RES | EMAC_CR_PASS_RUNT_FRM; + + /* A short delay after reset. */ + for (tout = 100; tout; tout--); + + /* Initialize MAC control registers. */ + LPC_EMAC->MAC1 = EMAC_MAC1_PASS_ALL; + LPC_EMAC->MAC2 = EMAC_MAC2_CRC_EN | EMAC_MAC2_PAD_EN; + LPC_EMAC->MAXF = EMAC_ETH_MAX_FLEN; + /* + * Find the clock that close to desired target clock + */ + tmp = SystemCoreClock / EMAC_MCFG_MII_MAXCLK; + for (tout = 0; tout < sizeof (EMAC_clkdiv); tout++){ + if (EMAC_clkdiv[tout] >= tmp) break; + } + tout++; + // Write to MAC configuration register and reset + LPC_EMAC->MCFG = EMAC_MCFG_CLK_SEL(tout) | EMAC_MCFG_RES_MII; + // release reset + LPC_EMAC->MCFG &= ~(EMAC_MCFG_RES_MII); + LPC_EMAC->CLRT = EMAC_CLRT_DEF; + LPC_EMAC->IPGR = EMAC_IPGR_P2_DEF; + + /* Enable Reduced MII interface. */ + LPC_EMAC->Command = EMAC_CR_RMII | EMAC_CR_PASS_RUNT_FRM; + + /* Reset Reduced MII Logic. */ +// LPC_EMAC->SUPP = EMAC_SUPP_RES_RMII; + + for (tout = 100; tout; tout--); + LPC_EMAC->SUPP = 0; + + /* Put the DP83848C in reset mode */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_BMCR_RESET); + + /* Wait for hardware reset to end. */ + for (tout = EMAC_PHY_RESP_TOUT; tout>=0; tout--) { + regv = read_PHY (EMAC_PHY_REG_BMCR); + if (!(regv & (EMAC_PHY_BMCR_RESET | EMAC_PHY_BMCR_POWERDOWN))) { + /* Reset complete, device not Power Down. */ + break; + } + if (tout == 0){ + // Time out, return ERROR + return (ERROR); + } + } + + // Set PHY mode + if (EMAC_SetPHYMode(EMAC_ConfigStruct->Mode) < 0){ + return (ERROR); + } + + // Set EMAC address + setEmacAddr(EMAC_ConfigStruct->pbEMAC_Addr); + + /* Initialize Tx and Rx DMA Descriptors */ + rx_descr_init (); + tx_descr_init (); + + // Set Receive Filter register: enable broadcast and multicast + LPC_EMAC->RxFilterCtrl = EMAC_RFC_MCAST_EN | EMAC_RFC_BCAST_EN | EMAC_RFC_PERFECT_EN; + + /* Enable Rx Done and Tx Done interrupt for EMAC */ + LPC_EMAC->IntEnable = EMAC_INT_RX_DONE | EMAC_INT_TX_DONE; + + /* Reset all interrupts */ + LPC_EMAC->IntClear = 0xFFFF; + + /* Enable receive and transmit mode of MAC Ethernet core */ + LPC_EMAC->Command |= (EMAC_CR_RX_EN | EMAC_CR_TX_EN); + LPC_EMAC->MAC1 |= EMAC_MAC1_REC_EN; + + return SUCCESS; +} + + +/*********************************************************************//** + * @brief De-initializes the EMAC peripheral registers to their +* default reset values. + * @param[in] None + * @return None + **********************************************************************/ +void EMAC_DeInit(void) +{ + // Disable all interrupt + LPC_EMAC->IntEnable = 0x00; + // Clear all pending interrupt + LPC_EMAC->IntClear = (0xFF) | (EMAC_INT_SOFT_INT | EMAC_INT_WAKEUP); + + /* TurnOff clock and power for Ethernet module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCENET, DISABLE); +} + + +/*********************************************************************//** + * @brief Check specified PHY status in EMAC peripheral + * @param[in] ulPHYState Specified PHY Status Type, should be: + * - EMAC_PHY_STAT_LINK: Link Status + * - EMAC_PHY_STAT_SPEED: Speed Status + * - EMAC_PHY_STAT_DUP: Duplex Status + * @return Status of specified PHY status (0 or 1). + * (-1) if error. + * + * Note: + * For EMAC_PHY_STAT_LINK, return value: + * - 0: Link Down + * - 1: Link Up + * For EMAC_PHY_STAT_SPEED, return value: + * - 0: 10Mbps + * - 1: 100Mbps + * For EMAC_PHY_STAT_DUP, return value: + * - 0: Half-Duplex + * - 1: Full-Duplex + **********************************************************************/ +int32_t EMAC_CheckPHYStatus(uint32_t ulPHYState) +{ + int32_t regv, tmp; +#ifdef MCB_LPC_1768 + regv = read_PHY (EMAC_PHY_REG_STS); + switch(ulPHYState){ + case EMAC_PHY_STAT_LINK: + tmp = (regv & EMAC_PHY_SR_LINK) ? 1 : 0; + break; + case EMAC_PHY_STAT_SPEED: + tmp = (regv & EMAC_PHY_SR_SPEED) ? 0 : 1; + break; + case EMAC_PHY_STAT_DUP: + tmp = (regv & EMAC_PHY_SR_FULL_DUP) ? 1 : 0; + break; +#elif defined(IAR_LPC_1768) + /* Use IAR_LPC_1768 board: + * FSZ8721BL doesn't have Status Register + * so we read Basic Mode Status Register (0x01h) instead + */ + regv = read_PHY (EMAC_PHY_REG_BMSR); + switch(ulPHYState){ + case EMAC_PHY_STAT_LINK: + tmp = (regv & EMAC_PHY_BMSR_LINK_STATUS) ? 1 : 0; + break; + case EMAC_PHY_STAT_SPEED: + tmp = (regv & EMAC_PHY_SR_100_SPEED) ? 1 : 0; + break; + case EMAC_PHY_STAT_DUP: + tmp = (regv & EMAC_PHY_SR_FULL_DUP) ? 1 : 0; + break; +#endif + default: + tmp = -1; + break; + } + return (tmp); +} + + +/*********************************************************************//** + * @brief Set specified PHY mode in EMAC peripheral + * @param[in] ulPHYMode Specified PHY mode, should be: + * - EMAC_MODE_AUTO + * - EMAC_MODE_10M_FULL + * - EMAC_MODE_10M_HALF + * - EMAC_MODE_100M_FULL + * - EMAC_MODE_100M_HALF + * @return Return (0) if no error, otherwise return (-1) + **********************************************************************/ +int32_t EMAC_SetPHYMode(uint32_t ulPHYMode) +{ + int32_t id1, id2, tout; + + /* Check if this is a DP83848C PHY. */ + id1 = read_PHY (EMAC_PHY_REG_IDR1); + id2 = read_PHY (EMAC_PHY_REG_IDR2); + +#ifdef MCB_LPC_1768 + if (((id1 << 16) | (id2 & 0xFFF0)) == EMAC_DP83848C_ID) { + switch(ulPHYMode){ + case EMAC_MODE_AUTO: + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_AUTO_NEG); +#elif defined(IAR_LPC_1768) /* Use IAR LPC1768 KickStart board */ + if (((id1 << 16) | id2) == EMAC_KSZ8721BL_ID) { + /* Configure the PHY device */ + switch(ulPHYMode){ + case EMAC_MODE_AUTO: + /* Use auto-negotiation about the link speed. */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_AUTO_NEG); +// write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_BMCR_AN); +#endif + /* Wait to complete Auto_Negotiation */ + for (tout = EMAC_PHY_RESP_TOUT; tout>=0; tout--) { + + } + break; + case EMAC_MODE_10M_FULL: + /* Connect at 10MBit full-duplex */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_FULLD_10M); + break; + case EMAC_MODE_10M_HALF: + /* Connect at 10MBit half-duplex */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_HALFD_10M); + break; + case EMAC_MODE_100M_FULL: + /* Connect at 100MBit full-duplex */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_FULLD_100M); + break; + case EMAC_MODE_100M_HALF: + /* Connect at 100MBit half-duplex */ + write_PHY (EMAC_PHY_REG_BMCR, EMAC_PHY_HALFD_100M); + break; + default: + // un-supported + return (-1); + } + } + // It's not correct module ID + else { + return (-1); + } + + // Update EMAC configuration with current PHY status + if (EMAC_UpdatePHYStatus() < 0){ + return (-1); + } + + // Complete + return (0); +} + + +/*********************************************************************//** + * @brief Auto-Configures value for the EMAC configuration register to + * match with current PHY mode + * @param[in] None + * @return Return (0) if no error, otherwise return (-1) + * + * Note: The EMAC configuration will be auto-configured: + * - Speed mode. + * - Half/Full duplex mode + **********************************************************************/ +int32_t EMAC_UpdatePHYStatus(void) +{ + int32_t regv, tout; + + /* Check the link status. */ +#ifdef MCB_LPC_1768 + for (tout = EMAC_PHY_RESP_TOUT; tout>=0; tout--) { + regv = read_PHY (EMAC_PHY_REG_STS); + if (regv & EMAC_PHY_SR_LINK) { + /* Link is on. */ + break; + } + if (tout == 0){ + // time out + return (-1); + } + } + /* Configure Full/Half Duplex mode. */ + if (regv & EMAC_PHY_SR_DUP) { + /* Full duplex is enabled. */ + LPC_EMAC->MAC2 |= EMAC_MAC2_FULL_DUP; + LPC_EMAC->Command |= EMAC_CR_FULL_DUP; + LPC_EMAC->IPGT = EMAC_IPGT_FULL_DUP; + } else { + /* Half duplex mode. */ + LPC_EMAC->IPGT = EMAC_IPGT_HALF_DUP; + } + if (regv & EMAC_PHY_SR_SPEED) { + /* 10MBit mode. */ + LPC_EMAC->SUPP = 0; + } else { + /* 100MBit mode. */ + LPC_EMAC->SUPP = EMAC_SUPP_SPEED; + } +#elif defined(IAR_LPC_1768) + for (tout = EMAC_PHY_RESP_TOUT; tout>=0; tout--) { + regv = read_PHY (EMAC_PHY_REG_BMSR); + if (regv & EMAC_PHY_BMSR_LINK_STATUS) { + /* Link is on. */ + break; + } + if (tout == 0){ + // time out + return (-1); + } + } + + /* Configure Full/Half Duplex mode. */ + if (regv & EMAC_PHY_SR_FULL_DUP) { + /* Full duplex is enabled. */ + LPC_EMAC->MAC2 |= EMAC_MAC2_FULL_DUP; + LPC_EMAC->Command |= EMAC_CR_FULL_DUP; + LPC_EMAC->IPGT = EMAC_IPGT_FULL_DUP; + } else { + /* Half duplex mode. */ + LPC_EMAC->IPGT = EMAC_IPGT_HALF_DUP; + } + + /* Configure 100MBit/10MBit mode. */ + if (!(regv & EMAC_PHY_SR_100_SPEED)) { + /* 10MBit mode. */ + LPC_EMAC->SUPP = 0; + } else { + /* 100MBit mode. */ + LPC_EMAC->SUPP = EMAC_SUPP_SPEED; + } +#endif + // Complete + return (0); +} + + +/*********************************************************************//** + * @brief Enable/Disable hash filter functionality for specified destination + * MAC address in EMAC module + * @param[in] dstMAC_addr Pointer to the first MAC destination address, should + * be 6-bytes length, in order LSB to the MSB + * @param[in] NewState New State of this command, should be: + * - ENABLE. + * - DISABLE. + * @return None + * + * Note: + * The standard Ethernet cyclic redundancy check (CRC) function is calculated from + * the 6 byte destination address in the Ethernet frame (this CRC is calculated + * anyway as part of calculating the CRC of the whole frame), then bits [28:23] out of + * the 32 bits CRC result are taken to form the hash. The 6 bit hash is used to access + * the hash table: it is used as an index in the 64 bit HashFilter register that has been + * programmed with accept values. If the selected accept value is 1, the frame is + * accepted. + **********************************************************************/ +void EMAC_SetHashFilter(uint8_t dstMAC_addr[], FunctionalState NewState) +{ + uint32_t *pReg; + uint32_t tmp; + int32_t crc; + + // Calculate the CRC from the destination MAC address + crc = emac_CRCCalc(dstMAC_addr, 6); + // Extract the value from CRC to get index value for hash filter table + crc = (crc >> 23) & 0x3F; + + pReg = (crc > 31) ? ((uint32_t *)&LPC_EMAC->HashFilterH) \ + : ((uint32_t *)&LPC_EMAC->HashFilterL); + tmp = (crc > 31) ? (crc - 32) : crc; + if (NewState == ENABLE) { + (*pReg) |= (1UL << tmp); + } else { + (*pReg) &= ~(1UL << tmp); + } + // Enable Rx Filter + LPC_EMAC->Command &= ~EMAC_CR_PASS_RX_FILT; +} + +/*********************************************************************//** + * @brief Enable/Disable Filter mode for each specified type EMAC peripheral + * @param[in] ulFilterMode Filter mode, should be: + * - EMAC_RFC_UCAST_EN: all frames of unicast types + * will be accepted + * - EMAC_RFC_BCAST_EN: broadcast frame will be + * accepted + * - EMAC_RFC_MCAST_EN: all frames of multicast + * types will be accepted + * - EMAC_RFC_UCAST_HASH_EN: The imperfect hash + * filter will be applied to unicast addresses + * - EMAC_RFC_MCAST_HASH_EN: The imperfect hash + * filter will be applied to multicast addresses + * - EMAC_RFC_PERFECT_EN: the destination address + * will be compared with the 6 byte station address + * programmed in the station address by the filter + * - EMAC_RFC_MAGP_WOL_EN: the result of the magic + * packet filter will generate a WoL interrupt when + * there is a match + * - EMAC_RFC_PFILT_WOL_EN: the result of the perfect address + * matching filter and the imperfect hash filter will + * generate a WoL interrupt when there is a match + * @param[in] NewState New State of this command, should be: + * - ENABLE + * - DISABLE + * @return None + **********************************************************************/ +void EMAC_SetFilterMode(uint32_t ulFilterMode, FunctionalState NewState) +{ + if (NewState == ENABLE){ + LPC_EMAC->RxFilterCtrl |= ulFilterMode; + } else { + LPC_EMAC->RxFilterCtrl &= ~ulFilterMode; + } +} + +/*********************************************************************//** + * @brief Get status of Wake On LAN Filter for each specified + * type in EMAC peripheral, clear this status if it is set + * @param[in] ulWoLMode WoL Filter mode, should be: + * - EMAC_WOL_UCAST: unicast frames caused WoL + * - EMAC_WOL_UCAST: broadcast frame caused WoL + * - EMAC_WOL_MCAST: multicast frame caused WoL + * - EMAC_WOL_UCAST_HASH: unicast frame that passes the + * imperfect hash filter caused WoL + * - EMAC_WOL_MCAST_HASH: multicast frame that passes the + * imperfect hash filter caused WoL + * - EMAC_WOL_PERFECT:perfect address matching filter + * caused WoL + * - EMAC_WOL_RX_FILTER: the receive filter caused WoL + * - EMAC_WOL_MAG_PACKET: the magic packet filter caused WoL + * @return SET/RESET + **********************************************************************/ +FlagStatus EMAC_GetWoLStatus(uint32_t ulWoLMode) +{ + if (LPC_EMAC->RxFilterWoLStatus & ulWoLMode) { + LPC_EMAC->RxFilterWoLClear = ulWoLMode; + return SET; + } else { + return RESET; + } +} + + +/*********************************************************************//** + * @brief Write data to Tx packet data buffer at current index due to + * TxProduceIndex + * @param[in] pDataStruct Pointer to a EMAC_PACKETBUF_Type structure + * data that contain specified information about + * Packet data buffer. + * @return None + **********************************************************************/ +void EMAC_WritePacketBuffer(EMAC_PACKETBUF_Type *pDataStruct) +{ + uint32_t idx,len; + uint32_t *sp,*dp; + + idx = LPC_EMAC->TxProduceIndex; + sp = (uint32_t *)pDataStruct->pbDataBuf; + dp = (uint32_t *)Tx_Desc[idx].Packet; + /* Copy frame data to EMAC packet buffers. */ + for (len = (pDataStruct->ulDataLen + 3) >> 2; len; len--) { + *dp++ = *sp++; + } + Tx_Desc[idx].Ctrl = (pDataStruct->ulDataLen - 1) | (EMAC_TCTRL_INT | EMAC_TCTRL_LAST); +} + +/*********************************************************************//** + * @brief Read data from Rx packet data buffer at current index due + * to RxConsumeIndex + * @param[in] pDataStruct Pointer to a EMAC_PACKETBUF_Type structure + * data that contain specified information about + * Packet data buffer. + * @return None + **********************************************************************/ +void EMAC_ReadPacketBuffer(EMAC_PACKETBUF_Type *pDataStruct) +{ + uint32_t idx, len; + uint32_t *dp, *sp; + + idx = LPC_EMAC->RxConsumeIndex; + dp = (uint32_t *)pDataStruct->pbDataBuf; + sp = (uint32_t *)Rx_Desc[idx].Packet; + + if (pDataStruct->pbDataBuf != NULL) { + for (len = (pDataStruct->ulDataLen + 3) >> 2; len; len--) { + *dp++ = *sp++; + } + } +} + +/*********************************************************************//** + * @brief Enable/Disable interrupt for each type in EMAC + * @param[in] ulIntType Interrupt Type, should be: + * - EMAC_INT_RX_OVERRUN: Receive Overrun + * - EMAC_INT_RX_ERR: Receive Error + * - EMAC_INT_RX_FIN: Receive Descriptor Finish + * - EMAC_INT_RX_DONE: Receive Done + * - EMAC_INT_TX_UNDERRUN: Transmit Under-run + * - EMAC_INT_TX_ERR: Transmit Error + * - EMAC_INT_TX_FIN: Transmit descriptor finish + * - EMAC_INT_TX_DONE: Transmit Done + * - EMAC_INT_SOFT_INT: Software interrupt + * - EMAC_INT_WAKEUP: Wakeup interrupt + * @param[in] NewState New State of this function, should be: + * - ENABLE. + * - DISABLE. + * @return None + **********************************************************************/ +void EMAC_IntCmd(uint32_t ulIntType, FunctionalState NewState) +{ + if (NewState == ENABLE) { + LPC_EMAC->IntEnable |= ulIntType; + } else { + LPC_EMAC->IntEnable &= ~(ulIntType); + } +} + +/*********************************************************************//** + * @brief Check whether if specified interrupt flag is set or not + * for each interrupt type in EMAC and clear interrupt pending + * if it is set. + * @param[in] ulIntType Interrupt Type, should be: + * - EMAC_INT_RX_OVERRUN: Receive Overrun + * - EMAC_INT_RX_ERR: Receive Error + * - EMAC_INT_RX_FIN: Receive Descriptor Finish + * - EMAC_INT_RX_DONE: Receive Done + * - EMAC_INT_TX_UNDERRUN: Transmit Under-run + * - EMAC_INT_TX_ERR: Transmit Error + * - EMAC_INT_TX_FIN: Transmit descriptor finish + * - EMAC_INT_TX_DONE: Transmit Done + * - EMAC_INT_SOFT_INT: Software interrupt + * - EMAC_INT_WAKEUP: Wakeup interrupt + * @return New state of specified interrupt (SET or RESET) + **********************************************************************/ +IntStatus EMAC_IntGetStatus(uint32_t ulIntType) +{ + if (LPC_EMAC->IntStatus & ulIntType) { + LPC_EMAC->IntClear = ulIntType; + return SET; + } else { + return RESET; + } +} + + +/*********************************************************************//** + * @brief Check whether if the current RxConsumeIndex is not equal to the + * current RxProduceIndex. + * @param[in] None + * @return TRUE if they're not equal, otherwise return FALSE + * + * Note: In case the RxConsumeIndex is not equal to the RxProduceIndex, + * it means there're available data has been received. They should be read + * out and released the Receive Data Buffer by updating the RxConsumeIndex value. + **********************************************************************/ +Bool EMAC_CheckReceiveIndex(void) +{ + if (LPC_EMAC->RxConsumeIndex != LPC_EMAC->RxProduceIndex) { + return TRUE; + } else { + return FALSE; + } +} + + +/*********************************************************************//** + * @brief Check whether if the current TxProduceIndex is not equal to the + * current RxProduceIndex - 1. + * @param[in] None + * @return TRUE if they're not equal, otherwise return FALSE + * + * Note: In case the RxConsumeIndex is equal to the RxProduceIndex - 1, + * it means the transmit buffer is available and data can be written to transmit + * buffer to be sent. + **********************************************************************/ +Bool EMAC_CheckTransmitIndex(void) +{ + uint32_t tmp = LPC_EMAC->TxConsumeIndex; + if (LPC_EMAC->TxProduceIndex == ( tmp - 1 )) + { + return FALSE; + } + else if( ( tmp == 0 ) && ( LPC_EMAC->TxProduceIndex == ( EMAC_NUM_TX_FRAG - 1 ) ) ) + { + return FALSE; + } + else + { + return TRUE; + } +} + + + +/*********************************************************************//** + * @brief Get current status value of receive data (due to RxConsumeIndex) + * @param[in] ulRxStatType Received Status type, should be one of following: + * - EMAC_RINFO_CTRL_FRAME: Control Frame + * - EMAC_RINFO_VLAN: VLAN Frame + * - EMAC_RINFO_FAIL_FILT: RX Filter Failed + * - EMAC_RINFO_MCAST: Multicast Frame + * - EMAC_RINFO_BCAST: Broadcast Frame + * - EMAC_RINFO_CRC_ERR: CRC Error in Frame + * - EMAC_RINFO_SYM_ERR: Symbol Error from PHY + * - EMAC_RINFO_LEN_ERR: Length Error + * - EMAC_RINFO_RANGE_ERR: Range error(exceeded max size) + * - EMAC_RINFO_ALIGN_ERR: Alignment error + * - EMAC_RINFO_OVERRUN: Receive overrun + * - EMAC_RINFO_NO_DESCR: No new Descriptor available + * - EMAC_RINFO_LAST_FLAG: last Fragment in Frame + * - EMAC_RINFO_ERR: Error Occurred (OR of all error) + * @return Current value of receive data (due to RxConsumeIndex) + **********************************************************************/ +FlagStatus EMAC_CheckReceiveDataStatus(uint32_t ulRxStatType) +{ + uint32_t idx; + idx = LPC_EMAC->RxConsumeIndex; + return (((Rx_Stat[idx].Info) & ulRxStatType) ? SET : RESET); +} + + +/*********************************************************************//** + * @brief Get size of current Received data in received buffer (due to + * RxConsumeIndex) + * @param[in] None + * @return Size of received data + **********************************************************************/ +uint32_t EMAC_GetReceiveDataSize(void) +{ + uint32_t idx; + idx =LPC_EMAC->RxConsumeIndex; + return ((Rx_Stat[idx].Info) & EMAC_RINFO_SIZE); +} + +/*********************************************************************//** + * @brief Increase the RxConsumeIndex (after reading the Receive buffer + * to release the Receive buffer) and wrap-around the index if + * it reaches the maximum Receive Number + * @param[in] None + * @return None + **********************************************************************/ +void EMAC_UpdateRxConsumeIndex(void) +{ + // Get current Rx consume index + uint32_t idx = LPC_EMAC->RxConsumeIndex; + + /* Release frame from EMAC buffer */ + if (++idx == EMAC_NUM_RX_FRAG) idx = 0; + LPC_EMAC->RxConsumeIndex = idx; +} + +/*********************************************************************//** + * @brief Increase the TxProduceIndex (after writting to the Transmit buffer + * to enable the Transmit buffer) and wrap-around the index if + * it reaches the maximum Transmit Number + * @param[in] None + * @return None + **********************************************************************/ +void EMAC_UpdateTxProduceIndex(void) +{ + // Get current Tx produce index + uint32_t idx = LPC_EMAC->TxProduceIndex; + + /* Start frame transmission */ + if (++idx == EMAC_NUM_TX_FRAG) idx = 0; + LPC_EMAC->TxProduceIndex = idx; +} + + +/** + * @} + */ + +#endif /* _EMAC */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_exti.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_exti.c new file mode 100644 index 0000000000..805bee4b09 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_exti.c @@ -0,0 +1,171 @@ +/********************************************************************** +* $Id$ lpc17xx_exti.c 2010-06-18 +*//** +* @file lpc17xx_exti.c +* @brief Contains all functions support for External interrupt firmware +* library on LPC17xx +* @version 3.0 +* @date 18. June. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup EXTI + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_exti.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _EXTI + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup EXTI_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Initial for EXT + * - Set EXTINT, EXTMODE, EXTPOLAR registers to default value + * @param[in] None + * @return None + **********************************************************************/ +void EXTI_Init(void) +{ + LPC_SC->EXTINT = 0xF; + LPC_SC->EXTMODE = 0x0; + LPC_SC->EXTPOLAR = 0x0; +} + + +/*********************************************************************//** +* @brief Close EXT +* @param[in] None +* @return None +**********************************************************************/ +void EXTI_DeInit(void) +{ + ; +} + +/*********************************************************************//** + * @brief Configuration for EXT + * - Set EXTINT, EXTMODE, EXTPOLAR register + * @param[in] EXTICfg Pointer to a EXTI_InitTypeDef structure + * that contains the configuration information for the + * specified external interrupt + * @return None + **********************************************************************/ +void EXTI_Config(EXTI_InitTypeDef *EXTICfg) +{ + LPC_SC->EXTINT = 0x0; + EXTI_SetMode(EXTICfg->EXTI_Line, EXTICfg->EXTI_Mode); + EXTI_SetPolarity(EXTICfg->EXTI_Line, EXTICfg->EXTI_polarity); +} + +/*********************************************************************//** +* @brief Set mode for EXTI pin +* @param[in] EXTILine external interrupt line, should be: +* - EXTI_EINT0: external interrupt line 0 +* - EXTI_EINT1: external interrupt line 1 +* - EXTI_EINT2: external interrupt line 2 +* - EXTI_EINT3: external interrupt line 3 +* @param[in] mode external mode, should be: +* - EXTI_MODE_LEVEL_SENSITIVE +* - EXTI_MODE_EDGE_SENSITIVE +* @return None +*********************************************************************/ +void EXTI_SetMode(EXTI_LINE_ENUM EXTILine, EXTI_MODE_ENUM mode) +{ + if(mode == EXTI_MODE_EDGE_SENSITIVE) + { + LPC_SC->EXTMODE |= (1 << EXTILine); + } + else if(mode == EXTI_MODE_LEVEL_SENSITIVE) + { + LPC_SC->EXTMODE &= ~(1 << EXTILine); + } +} + +/*********************************************************************//** +* @brief Set polarity for EXTI pin +* @param[in] EXTILine external interrupt line, should be: +* - EXTI_EINT0: external interrupt line 0 +* - EXTI_EINT1: external interrupt line 1 +* - EXTI_EINT2: external interrupt line 2 +* - EXTI_EINT3: external interrupt line 3 +* @param[in] polarity external polarity value, should be: +* - EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE +* - EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE +* @return None +*********************************************************************/ +void EXTI_SetPolarity(EXTI_LINE_ENUM EXTILine, EXTI_POLARITY_ENUM polarity) +{ + if(polarity == EXTI_POLARITY_HIGH_ACTIVE_OR_RISING_EDGE) + { + LPC_SC->EXTPOLAR |= (1 << EXTILine); + } + else if(polarity == EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE) + { + LPC_SC->EXTPOLAR &= ~(1 << EXTILine); + } +} + +/*********************************************************************//** +* @brief Clear External interrupt flag +* @param[in] EXTILine external interrupt line, should be: +* - EXTI_EINT0: external interrupt line 0 +* - EXTI_EINT1: external interrupt line 1 +* - EXTI_EINT2: external interrupt line 2 +* - EXTI_EINT3: external interrupt line 3 +* @return None +*********************************************************************/ +void EXTI_ClearEXTIFlag(EXTI_LINE_ENUM EXTILine) +{ + LPC_SC->EXTINT = (1 << EXTILine); +} + +/** + * @} + */ + +#endif /* _EXTI */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpdma.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpdma.c new file mode 100644 index 0000000000..0267de3d17 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpdma.c @@ -0,0 +1,463 @@ +/********************************************************************** +* $Id$ lpc17xx_gpdma.c 2010-03-21 +*//** +* @file lpc17xx_gpdma.c +* @brief Contains all functions support for GPDMA firmware +* library on LPC17xx +* @version 2.1 +* @date 25. July. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup GPDMA + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_gpdma.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + +#ifdef _GPDMA + + +/* Private Variables ---------------------------------------------------------- */ +/** @defgroup GPDMA_Private_Variables GPDMA Private Variables + * @{ + */ + +/** + * @brief Lookup Table of Connection Type matched with + * Peripheral Data (FIFO) register base address + */ +//#ifdef __IAR_SYSTEMS_ICC__ +volatile const void *GPDMA_LUTPerAddr[] = { + (&LPC_SSP0->DR), // SSP0 Tx + (&LPC_SSP0->DR), // SSP0 Rx + (&LPC_SSP1->DR), // SSP1 Tx + (&LPC_SSP1->DR), // SSP1 Rx + (&LPC_ADC->ADGDR), // ADC + (&LPC_I2S->I2STXFIFO), // I2S Tx + (&LPC_I2S->I2SRXFIFO), // I2S Rx + (&LPC_DAC->DACR), // DAC + (&LPC_UART0->/*RBTHDLR.*/THR), // UART0 Tx + (&LPC_UART0->/*RBTHDLR.*/RBR), // UART0 Rx + (&LPC_UART1->/*RBTHDLR.*/THR), // UART1 Tx + (&LPC_UART1->/*RBTHDLR.*/RBR), // UART1 Rx + (&LPC_UART2->/*RBTHDLR.*/THR), // UART2 Tx + (&LPC_UART2->/*RBTHDLR.*/RBR), // UART2 Rx + (&LPC_UART3->/*RBTHDLR.*/THR), // UART3 Tx + (&LPC_UART3->/*RBTHDLR.*/RBR), // UART3 Rx + (&LPC_TIM0->MR0), // MAT0.0 + (&LPC_TIM0->MR1), // MAT0.1 + (&LPC_TIM1->MR0), // MAT1.0 + (&LPC_TIM1->MR1), // MAT1.1 + (&LPC_TIM2->MR0), // MAT2.0 + (&LPC_TIM2->MR1), // MAT2.1 + (&LPC_TIM3->MR0), // MAT3.0 + (&LPC_TIM3->MR1) // MAT3.1 +}; +//#else +//const uint32_t GPDMA_LUTPerAddr[] = { +// ((uint32_t)&LPC_SSP0->DR), // SSP0 Tx +// ((uint32_t)&LPC_SSP0->DR), // SSP0 Rx +// ((uint32_t)&LPC_SSP1->DR), // SSP1 Tx +// ((uint32_t)&LPC_SSP1->DR), // SSP1 Rx +// ((uint32_t)&LPC_ADC->ADGDR), // ADC +// ((uint32_t)&LPC_I2S->I2STXFIFO), // I2S Tx +// ((uint32_t)&LPC_I2S->I2SRXFIFO), // I2S Rx +// ((uint32_t)&LPC_DAC->DACR), // DAC +// ((uint32_t)&LPC_UART0->/*RBTHDLR.*/THR), // UART0 Tx +// ((uint32_t)&LPC_UART0->/*RBTHDLR.*/RBR), // UART0 Rx +// ((uint32_t)&LPC_UART1->/*RBTHDLR.*/THR), // UART1 Tx +// ((uint32_t)&LPC_UART1->/*RBTHDLR.*/RBR), // UART1 Rx +// ((uint32_t)&LPC_UART2->/*RBTHDLR.*/THR), // UART2 Tx +// ((uint32_t)&LPC_UART2->/*RBTHDLR.*/RBR), // UART2 Rx +// ((uint32_t)&LPC_UART3->/*RBTHDLR.*/THR), // UART3 Tx +// ((uint32_t)&LPC_UART3->/*RBTHDLR.*/RBR), // UART3 Rx +// ((uint32_t)&LPC_TIM0->MR0), // MAT0.0 +// ((uint32_t)&LPC_TIM0->MR1), // MAT0.1 +// ((uint32_t)&LPC_TIM1->MR0), // MAT1.0 +// ((uint32_t)&LPC_TIM1->MR1), // MAT1.1 +// ((uint32_t)&LPC_TIM2->MR0), // MAT2.0 +// ((uint32_t)&LPC_TIM2->MR1), // MAT2.1 +// ((uint32_t)&LPC_TIM3->MR0), // MAT3.0 +// ((uint32_t)&LPC_TIM3->MR1) // MAT3.1 +//}; +//#endif +/** + * @brief Lookup Table of GPDMA Channel Number matched with + * GPDMA channel pointer + */ +const LPC_GPDMACH_TypeDef *pGPDMACh[8] = { + LPC_GPDMACH0, // GPDMA Channel 0 + LPC_GPDMACH1, // GPDMA Channel 1 + LPC_GPDMACH2, // GPDMA Channel 2 + LPC_GPDMACH3, // GPDMA Channel 3 + LPC_GPDMACH4, // GPDMA Channel 4 + LPC_GPDMACH5, // GPDMA Channel 5 + LPC_GPDMACH6, // GPDMA Channel 6 + LPC_GPDMACH7 // GPDMA Channel 7 +}; +/** + * @brief Optimized Peripheral Source and Destination burst size + */ +const uint8_t GPDMA_LUTPerBurst[] = { + GPDMA_BSIZE_4, // SSP0 Tx + GPDMA_BSIZE_4, // SSP0 Rx + GPDMA_BSIZE_4, // SSP1 Tx + GPDMA_BSIZE_4, // SSP1 Rx + GPDMA_BSIZE_1, // ADC + GPDMA_BSIZE_32, // I2S channel 0 + GPDMA_BSIZE_32, // I2S channel 1 + GPDMA_BSIZE_1, // DAC + GPDMA_BSIZE_1, // UART0 Tx + GPDMA_BSIZE_1, // UART0 Rx + GPDMA_BSIZE_1, // UART1 Tx + GPDMA_BSIZE_1, // UART1 Rx + GPDMA_BSIZE_1, // UART2 Tx + GPDMA_BSIZE_1, // UART2 Rx + GPDMA_BSIZE_1, // UART3 Tx + GPDMA_BSIZE_1, // UART3 Rx + GPDMA_BSIZE_1, // MAT0.0 + GPDMA_BSIZE_1, // MAT0.1 + GPDMA_BSIZE_1, // MAT1.0 + GPDMA_BSIZE_1, // MAT1.1 + GPDMA_BSIZE_1, // MAT2.0 + GPDMA_BSIZE_1, // MAT2.1 + GPDMA_BSIZE_1, // MAT3.0 + GPDMA_BSIZE_1 // MAT3.1 +}; +/** + * @brief Optimized Peripheral Source and Destination transfer width + */ +const uint8_t GPDMA_LUTPerWid[] = { + GPDMA_WIDTH_BYTE, // SSP0 Tx + GPDMA_WIDTH_BYTE, // SSP0 Rx + GPDMA_WIDTH_BYTE, // SSP1 Tx + GPDMA_WIDTH_BYTE, // SSP1 Rx + GPDMA_WIDTH_WORD, // ADC + GPDMA_WIDTH_WORD, // I2S channel 0 + GPDMA_WIDTH_WORD, // I2S channel 1 + GPDMA_WIDTH_BYTE, // DAC + GPDMA_WIDTH_BYTE, // UART0 Tx + GPDMA_WIDTH_BYTE, // UART0 Rx + GPDMA_WIDTH_BYTE, // UART1 Tx + GPDMA_WIDTH_BYTE, // UART1 Rx + GPDMA_WIDTH_BYTE, // UART2 Tx + GPDMA_WIDTH_BYTE, // UART2 Rx + GPDMA_WIDTH_BYTE, // UART3 Tx + GPDMA_WIDTH_BYTE, // UART3 Rx + GPDMA_WIDTH_WORD, // MAT0.0 + GPDMA_WIDTH_WORD, // MAT0.1 + GPDMA_WIDTH_WORD, // MAT1.0 + GPDMA_WIDTH_WORD, // MAT1.1 + GPDMA_WIDTH_WORD, // MAT2.0 + GPDMA_WIDTH_WORD, // MAT2.1 + GPDMA_WIDTH_WORD, // MAT3.0 + GPDMA_WIDTH_WORD // MAT3.1 +}; + +/** + * @} + */ + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup GPDMA_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initialize GPDMA controller + * @param None + * @return None + *********************************************************************/ +void GPDMA_Init(void) +{ + /* Enable GPDMA clock */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCGPDMA, ENABLE); + + // Reset all channel configuration register + LPC_GPDMACH0->DMACCConfig = 0; + LPC_GPDMACH1->DMACCConfig = 0; + LPC_GPDMACH2->DMACCConfig = 0; + LPC_GPDMACH3->DMACCConfig = 0; + LPC_GPDMACH4->DMACCConfig = 0; + LPC_GPDMACH5->DMACCConfig = 0; + LPC_GPDMACH6->DMACCConfig = 0; + LPC_GPDMACH7->DMACCConfig = 0; + + /* Clear all DMA interrupt and error flag */ + LPC_GPDMA->DMACIntTCClear = 0xFF; + LPC_GPDMA->DMACIntErrClr = 0xFF; +} + +/********************************************************************//** + * @brief Setup GPDMA channel peripheral according to the specified + * parameters in the GPDMAChannelConfig. + * @param[in] GPDMAChannelConfig Pointer to a GPDMA_CH_CFG_Type + * structure that contains the configuration + * information for the specified GPDMA channel peripheral. + * @return ERROR if selected channel is enabled before + * or SUCCESS if channel is configured successfully + *********************************************************************/ +Status GPDMA_Setup(GPDMA_Channel_CFG_Type *GPDMAChannelConfig) +{ + LPC_GPDMACH_TypeDef *pDMAch; + uint32_t tmp1, tmp2; + + if (LPC_GPDMA->DMACEnbldChns & (GPDMA_DMACEnbldChns_Ch(GPDMAChannelConfig->ChannelNum))) { + // This channel is enabled, return ERROR, need to release this channel first + return ERROR; + } + + // Get Channel pointer + pDMAch = (LPC_GPDMACH_TypeDef *) pGPDMACh[GPDMAChannelConfig->ChannelNum]; + + // Reset the Interrupt status + LPC_GPDMA->DMACIntTCClear = GPDMA_DMACIntTCClear_Ch(GPDMAChannelConfig->ChannelNum); + LPC_GPDMA->DMACIntErrClr = GPDMA_DMACIntErrClr_Ch(GPDMAChannelConfig->ChannelNum); + + // Clear DMA configure + pDMAch->DMACCControl = 0x00; + pDMAch->DMACCConfig = 0x00; + + /* Assign Linker List Item value */ + pDMAch->DMACCLLI = GPDMAChannelConfig->DMALLI; + + /* Set value to Channel Control Registers */ + switch (GPDMAChannelConfig->TransferType) + { + // Memory to memory + case GPDMA_TRANSFERTYPE_M2M: + // Assign physical source and destination address + pDMAch->DMACCSrcAddr = GPDMAChannelConfig->SrcMemAddr; + pDMAch->DMACCDestAddr = GPDMAChannelConfig->DstMemAddr; + pDMAch->DMACCControl + = GPDMA_DMACCxControl_TransferSize(GPDMAChannelConfig->TransferSize) \ + | GPDMA_DMACCxControl_SBSize(GPDMA_BSIZE_32) \ + | GPDMA_DMACCxControl_DBSize(GPDMA_BSIZE_32) \ + | GPDMA_DMACCxControl_SWidth(GPDMAChannelConfig->TransferWidth) \ + | GPDMA_DMACCxControl_DWidth(GPDMAChannelConfig->TransferWidth) \ + | GPDMA_DMACCxControl_SI \ + | GPDMA_DMACCxControl_DI \ + | GPDMA_DMACCxControl_I; + break; + // Memory to peripheral + case GPDMA_TRANSFERTYPE_M2P: + // Assign physical source + pDMAch->DMACCSrcAddr = GPDMAChannelConfig->SrcMemAddr; + // Assign peripheral destination address + pDMAch->DMACCDestAddr = (uint32_t)GPDMA_LUTPerAddr[GPDMAChannelConfig->DstConn]; + pDMAch->DMACCControl + = GPDMA_DMACCxControl_TransferSize((uint32_t)GPDMAChannelConfig->TransferSize) \ + | GPDMA_DMACCxControl_SBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_DBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_SWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_DWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_SI \ + | GPDMA_DMACCxControl_I; + break; + // Peripheral to memory + case GPDMA_TRANSFERTYPE_P2M: + // Assign peripheral source address + pDMAch->DMACCSrcAddr = (uint32_t)GPDMA_LUTPerAddr[GPDMAChannelConfig->SrcConn]; + // Assign memory destination address + pDMAch->DMACCDestAddr = GPDMAChannelConfig->DstMemAddr; + pDMAch->DMACCControl + = GPDMA_DMACCxControl_TransferSize((uint32_t)GPDMAChannelConfig->TransferSize) \ + | GPDMA_DMACCxControl_SBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_SWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DI \ + | GPDMA_DMACCxControl_I; + break; + // Peripheral to peripheral + case GPDMA_TRANSFERTYPE_P2P: + // Assign peripheral source address + pDMAch->DMACCSrcAddr = (uint32_t)GPDMA_LUTPerAddr[GPDMAChannelConfig->SrcConn]; + // Assign peripheral destination address + pDMAch->DMACCDestAddr = (uint32_t)GPDMA_LUTPerAddr[GPDMAChannelConfig->DstConn]; + pDMAch->DMACCControl + = GPDMA_DMACCxControl_TransferSize((uint32_t)GPDMAChannelConfig->TransferSize) \ + | GPDMA_DMACCxControl_SBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DBSize((uint32_t)GPDMA_LUTPerBurst[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_SWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->SrcConn]) \ + | GPDMA_DMACCxControl_DWidth((uint32_t)GPDMA_LUTPerWid[GPDMAChannelConfig->DstConn]) \ + | GPDMA_DMACCxControl_I; + break; + // Do not support any more transfer type, return ERROR + default: + return ERROR; + } + + /* Re-Configure DMA Request Select for source peripheral */ + if (GPDMAChannelConfig->SrcConn > 15) + { + LPC_SC->DMAREQSEL |= (1<<(GPDMAChannelConfig->SrcConn - 16)); + } else { + LPC_SC->DMAREQSEL &= ~(1<<(GPDMAChannelConfig->SrcConn - 8)); + } + + /* Re-Configure DMA Request Select for Destination peripheral */ + if (GPDMAChannelConfig->DstConn > 15) + { + LPC_SC->DMAREQSEL |= (1<<(GPDMAChannelConfig->DstConn - 16)); + } else { + LPC_SC->DMAREQSEL &= ~(1<<(GPDMAChannelConfig->DstConn - 8)); + } + + /* Enable DMA channels, little endian */ + LPC_GPDMA->DMACConfig = GPDMA_DMACConfig_E; + while (!(LPC_GPDMA->DMACConfig & GPDMA_DMACConfig_E)); + + // Calculate absolute value for Connection number + tmp1 = GPDMAChannelConfig->SrcConn; + tmp1 = ((tmp1 > 15) ? (tmp1 - 8) : tmp1); + tmp2 = GPDMAChannelConfig->DstConn; + tmp2 = ((tmp2 > 15) ? (tmp2 - 8) : tmp2); + + // Configure DMA Channel, enable Error Counter and Terminate counter + pDMAch->DMACCConfig = GPDMA_DMACCxConfig_IE | GPDMA_DMACCxConfig_ITC /*| GPDMA_DMACCxConfig_E*/ \ + | GPDMA_DMACCxConfig_TransferType((uint32_t)GPDMAChannelConfig->TransferType) \ + | GPDMA_DMACCxConfig_SrcPeripheral(tmp1) \ + | GPDMA_DMACCxConfig_DestPeripheral(tmp2); + + return SUCCESS; +} + + +/*********************************************************************//** + * @brief Enable/Disable DMA channel + * @param[in] channelNum GPDMA channel, should be in range from 0 to 7 + * @param[in] NewState New State of this command, should be: + * - ENABLE. + * - DISABLE. + * @return None + **********************************************************************/ +void GPDMA_ChannelCmd(uint8_t channelNum, FunctionalState NewState) +{ + LPC_GPDMACH_TypeDef *pDMAch; + + // Get Channel pointer + pDMAch = (LPC_GPDMACH_TypeDef *) pGPDMACh[channelNum]; + + if (NewState == ENABLE) { + pDMAch->DMACCConfig |= GPDMA_DMACCxConfig_E; + } else { + pDMAch->DMACCConfig &= ~GPDMA_DMACCxConfig_E; + } +} +/*********************************************************************//** + * @brief Check if corresponding channel does have an active interrupt + * request or not + * @param[in] type type of status, should be: + * - GPDMA_STAT_INT: GPDMA Interrupt Status + * - GPDMA_STAT_INTTC: GPDMA Interrupt Terminal Count Request Status + * - GPDMA_STAT_INTERR: GPDMA Interrupt Error Status + * - GPDMA_STAT_RAWINTTC: GPDMA Raw Interrupt Terminal Count Status + * - GPDMA_STAT_RAWINTERR: GPDMA Raw Error Interrupt Status + * - GPDMA_STAT_ENABLED_CH:GPDMA Enabled Channel Status + * @param[in] channel GPDMA channel, should be in range from 0 to 7 + * @return IntStatus status of DMA channel interrupt after masking + * Should be: + * - SET: the corresponding channel has no active interrupt request + * - RESET: the corresponding channel does have an active interrupt request + **********************************************************************/ +IntStatus GPDMA_IntGetStatus(GPDMA_Status_Type type, uint8_t channel) +{ + CHECK_PARAM(PARAM_GPDMA_STAT(type)); + CHECK_PARAM(PARAM_GPDMA_CHANNEL(channel)); + + switch (type) + { + case GPDMA_STAT_INT: //check status of DMA channel interrupts + if (LPC_GPDMA->DMACIntStat & (GPDMA_DMACIntStat_Ch(channel))) + return SET; + return RESET; + case GPDMA_STAT_INTTC: // check terminal count interrupt request status for DMA + if (LPC_GPDMA->DMACIntTCStat & GPDMA_DMACIntTCStat_Ch(channel)) + return SET; + return RESET; + case GPDMA_STAT_INTERR: //check interrupt status for DMA channels + if (LPC_GPDMA->DMACIntErrStat & GPDMA_DMACIntTCClear_Ch(channel)) + return SET; + return RESET; + case GPDMA_STAT_RAWINTTC: //check status of the terminal count interrupt for DMA channels + if (LPC_GPDMA->DMACRawIntErrStat & GPDMA_DMACRawIntTCStat_Ch(channel)) + return SET; + return RESET; + case GPDMA_STAT_RAWINTERR: //check status of the error interrupt for DMA channels + if (LPC_GPDMA->DMACRawIntTCStat & GPDMA_DMACRawIntErrStat_Ch(channel)) + return SET; + return RESET; + default: //check enable status for DMA channels + if (LPC_GPDMA->DMACEnbldChns & GPDMA_DMACEnbldChns_Ch(channel)) + return SET; + return RESET; + } +} + +/*********************************************************************//** + * @brief Clear one or more interrupt requests on DMA channels + * @param[in] type type of interrupt request, should be: + * - GPDMA_STATCLR_INTTC: GPDMA Interrupt Terminal Count Request Clear + * - GPDMA_STATCLR_INTERR: GPDMA Interrupt Error Clear + * @param[in] channel GPDMA channel, should be in range from 0 to 7 + * @return None + **********************************************************************/ +void GPDMA_ClearIntPending(GPDMA_StateClear_Type type, uint8_t channel) +{ + CHECK_PARAM(PARAM_GPDMA_STATCLR(type)); + CHECK_PARAM(PARAM_GPDMA_CHANNEL(channel)); + + if (type == GPDMA_STATCLR_INTTC) // clears the terminal count interrupt request on DMA channel + LPC_GPDMA->DMACIntTCClear = GPDMA_DMACIntTCClear_Ch(channel); + else // clear the error interrupt request + LPC_GPDMA->DMACIntErrClr = GPDMA_DMACIntErrClr_Ch(channel); +} + +/** + * @} + */ + +#endif /* _GPDMA */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpio.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpio.c new file mode 100644 index 0000000000..8f0cd3953a --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_gpio.c @@ -0,0 +1,762 @@ +/********************************************************************** +* $Id$ lpc17xx_gpio.c 2010-05-21 +*//** +* @file lpc17xx_gpio.c +* @brief Contains all functions support for GPIO firmware +* library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup GPIO + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_gpio.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _GPIO + +/* Private Functions ---------------------------------------------------------- */ + +static LPC_GPIO_TypeDef *GPIO_GetPointer(uint8_t portNum); +static GPIO_HalfWord_TypeDef *FIO_HalfWordGetPointer(uint8_t portNum); +static GPIO_Byte_TypeDef *FIO_ByteGetPointer(uint8_t portNum); + +/*********************************************************************//** + * @brief Get pointer to GPIO peripheral due to GPIO port + * @param[in] portNum Port Number value, should be in range from 0 to 4. + * @return Pointer to GPIO peripheral + **********************************************************************/ +static LPC_GPIO_TypeDef *GPIO_GetPointer(uint8_t portNum) +{ + LPC_GPIO_TypeDef *pGPIO = NULL; + + switch (portNum) { + case 0: + pGPIO = LPC_GPIO0; + break; + case 1: + pGPIO = LPC_GPIO1; + break; + case 2: + pGPIO = LPC_GPIO2; + break; + case 3: + pGPIO = LPC_GPIO3; + break; + case 4: + pGPIO = LPC_GPIO4; + break; + default: + break; + } + + return pGPIO; +} + +/*********************************************************************//** + * @brief Get pointer to FIO peripheral in halfword accessible style + * due to FIO port + * @param[in] portNum Port Number value, should be in range from 0 to 4. + * @return Pointer to FIO peripheral + **********************************************************************/ +static GPIO_HalfWord_TypeDef *FIO_HalfWordGetPointer(uint8_t portNum) +{ + GPIO_HalfWord_TypeDef *pFIO = NULL; + + switch (portNum) { + case 0: + pFIO = GPIO0_HalfWord; + break; + case 1: + pFIO = GPIO1_HalfWord; + break; + case 2: + pFIO = GPIO2_HalfWord; + break; + case 3: + pFIO = GPIO3_HalfWord; + break; + case 4: + pFIO = GPIO4_HalfWord; + break; + default: + break; + } + + return pFIO; +} + +/*********************************************************************//** + * @brief Get pointer to FIO peripheral in byte accessible style + * due to FIO port + * @param[in] portNum Port Number value, should be in range from 0 to 4. + * @return Pointer to FIO peripheral + **********************************************************************/ +static GPIO_Byte_TypeDef *FIO_ByteGetPointer(uint8_t portNum) +{ + GPIO_Byte_TypeDef *pFIO = NULL; + + switch (portNum) { + case 0: + pFIO = GPIO0_Byte; + break; + case 1: + pFIO = GPIO1_Byte; + break; + case 2: + pFIO = GPIO2_Byte; + break; + case 3: + pFIO = GPIO3_Byte; + break; + case 4: + pFIO = GPIO4_Byte; + break; + default: + break; + } + + return pFIO; +} + +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup GPIO_Public_Functions + * @{ + */ + + +/* GPIO ------------------------------------------------------------------------------ */ + +/*********************************************************************//** + * @brief Set Direction for GPIO port. + * @param[in] portNum Port Number value, should be in range from 0 to 4 + * @param[in] bitValue Value that contains all bits to set direction, + * in range from 0 to 0xFFFFFFFF. + * example: value 0x5 to set direction for bit 0 and bit 1. + * @param[in] dir Direction value, should be: + * - 0: Input. + * - 1: Output. + * @return None + * + * Note: All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void GPIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir) +{ + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum); + + if (pGPIO != NULL) { + // Enable Output + if (dir) { + pGPIO->FIODIR |= bitValue; + } + // Enable Input + else { + pGPIO->FIODIR &= ~bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Set Value for bits that have output direction on GPIO port. + * @param[in] portNum Port number value, should be in range from 0 to 4 + * @param[in] bitValue Value that contains all bits on GPIO to set, + * in range from 0 to 0xFFFFFFFF. + * example: value 0x5 to set bit 0 and bit 1. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void GPIO_SetValue(uint8_t portNum, uint32_t bitValue) +{ + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum); + + if (pGPIO != NULL) { + pGPIO->FIOSET = bitValue; + } +} + +/*********************************************************************//** + * @brief Clear Value for bits that have output direction on GPIO port. + * @param[in] portNum Port number value, should be in range from 0 to 4 + * @param[in] bitValue Value that contains all bits on GPIO to clear, + * in range from 0 to 0xFFFFFFFF. + * example: value 0x5 to clear bit 0 and bit 1. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void GPIO_ClearValue(uint8_t portNum, uint32_t bitValue) +{ + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum); + + if (pGPIO != NULL) { + pGPIO->FIOCLR = bitValue; + } +} + +/*********************************************************************//** + * @brief Read Current state on port pin that have input direction of GPIO + * @param[in] portNum Port number to read value, in range from 0 to 4 + * @return Current value of GPIO port. + * + * Note: Return value contain state of each port pin (bit) on that GPIO regardless + * its direction is input or output. + **********************************************************************/ +uint32_t GPIO_ReadValue(uint8_t portNum) +{ + LPC_GPIO_TypeDef *pGPIO = GPIO_GetPointer(portNum); + + if (pGPIO != NULL) { + return pGPIO->FIOPIN; + } + + return (0); +} + +/*********************************************************************//** + * @brief Enable GPIO interrupt (just used for P0.0-P0.30, P2.0-P2.13) + * @param[in] portNum Port number to read value, should be: 0 or 2 + * @param[in] bitValue Value that contains all bits on GPIO to enable, + * in range from 0 to 0xFFFFFFFF. + * @param[in] edgeState state of edge, should be: + * - 0: Rising edge + * - 1: Falling edge + * @return None + **********************************************************************/ +void GPIO_IntCmd(uint8_t portNum, uint32_t bitValue, uint8_t edgeState) +{ + if((portNum == 0)&&(edgeState == 0)) + LPC_GPIOINT->IO0IntEnR = bitValue; + else if ((portNum == 2)&&(edgeState == 0)) + LPC_GPIOINT->IO2IntEnR = bitValue; + else if ((portNum == 0)&&(edgeState == 1)) + LPC_GPIOINT->IO0IntEnF = bitValue; + else if ((portNum == 2)&&(edgeState == 1)) + LPC_GPIOINT->IO2IntEnF = bitValue; + else + //Error + while(1); +} + +/*********************************************************************//** + * @brief Get GPIO Interrupt Status (just used for P0.0-P0.30, P2.0-P2.13) + * @param[in] portNum Port number to read value, should be: 0 or 2 + * @param[in] pinNum Pin number, should be: 0..30(with port 0) and 0..13 + * (with port 2) + * @param[in] edgeState state of edge, should be: + * - 0: Rising edge + * - 1: Falling edge + * @return Bool could be: + * - ENABLE: Interrupt has been generated due to a rising + * edge on P0.0 + * - DISABLE: A rising edge has not been detected on P0.0 + **********************************************************************/ +FunctionalState GPIO_GetIntStatus(uint8_t portNum, uint32_t pinNum, uint8_t edgeState) +{ + if((portNum == 0) && (edgeState == 0))//Rising Edge + return ((FunctionalState)(((LPC_GPIOINT->IO0IntStatR)>>pinNum)& 0x1)); + else if ((portNum == 2) && (edgeState == 0)) + return ((FunctionalState)(((LPC_GPIOINT->IO2IntStatR)>>pinNum)& 0x1)); + else if ((portNum == 0) && (edgeState == 1))//Falling Edge + return ((FunctionalState)(((LPC_GPIOINT->IO0IntStatF)>>pinNum)& 0x1)); + else if ((portNum == 2) && (edgeState == 1)) + return ((FunctionalState)(((LPC_GPIOINT->IO2IntStatF)>>pinNum)& 0x1)); + else + //Error + while(1); +} +/*********************************************************************//** + * @brief Clear GPIO interrupt (just used for P0.0-P0.30, P2.0-P2.13) + * @param[in] portNum Port number to read value, should be: 0 or 2 + * @param[in] bitValue Value that contains all bits on GPIO to enable, + * in range from 0 to 0xFFFFFFFF. + * @return None + **********************************************************************/ +void GPIO_ClearInt(uint8_t portNum, uint32_t bitValue) +{ + if(portNum == 0) + LPC_GPIOINT->IO0IntClr = bitValue; + else if (portNum == 2) + LPC_GPIOINT->IO2IntClr = bitValue; + else + //Invalid portNum + while(1); +} + +/* FIO word accessible ----------------------------------------------------------------- */ +/* Stub function for FIO (word-accessible) style */ + +/** + * @brief The same with GPIO_SetDir() + */ +void FIO_SetDir(uint8_t portNum, uint32_t bitValue, uint8_t dir) +{ + GPIO_SetDir(portNum, bitValue, dir); +} + +/** + * @brief The same with GPIO_SetValue() + */ +void FIO_SetValue(uint8_t portNum, uint32_t bitValue) +{ + GPIO_SetValue(portNum, bitValue); +} + +/** + * @brief The same with GPIO_ClearValue() + */ +void FIO_ClearValue(uint8_t portNum, uint32_t bitValue) +{ + GPIO_ClearValue(portNum, bitValue); +} + +/** + * @brief The same with GPIO_ReadValue() + */ +uint32_t FIO_ReadValue(uint8_t portNum) +{ + return (GPIO_ReadValue(portNum)); +} + +/** + * @brief The same with GPIO_IntCmd() + */ +void FIO_IntCmd(uint8_t portNum, uint32_t bitValue, uint8_t edgeState) +{ + GPIO_IntCmd(portNum, bitValue, edgeState); +} + +/** + * @brief The same with GPIO_GetIntStatus() + */ +FunctionalState FIO_GetIntStatus(uint8_t portNum, uint32_t pinNum, uint8_t edgeState) +{ + return (GPIO_GetIntStatus(portNum, pinNum, edgeState)); +} + +/** + * @brief The same with GPIO_ClearInt() + */ +void FIO_ClearInt(uint8_t portNum, uint32_t bitValue) +{ + GPIO_ClearInt(portNum, bitValue); +} +/*********************************************************************//** + * @brief Set mask value for bits in FIO port + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] bitValue Value that contains all bits in to set, + * in range from 0 to 0xFFFFFFFF. + * @param[in] maskValue Mask value contains state value for each bit: + * - 0: not mask. + * - 1: mask. + * @return None + * + * Note: + * - All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + * - After executing this function, in mask register, value '0' on each bit + * enables an access to the corresponding physical pin via a read or write access, + * while value '1' on bit (masked) that corresponding pin will not be changed + * with write access and if read, will not be reflected in the updated pin. + **********************************************************************/ +void FIO_SetMask(uint8_t portNum, uint32_t bitValue, uint8_t maskValue) +{ + LPC_GPIO_TypeDef *pFIO = GPIO_GetPointer(portNum); + if(pFIO != NULL) { + // Mask + if (maskValue){ + pFIO->FIOMASK |= bitValue; + } + // Un-mask + else { + pFIO->FIOMASK &= ~bitValue; + } + } +} + + +/* FIO halfword accessible ------------------------------------------------------------- */ + +/*********************************************************************//** + * @brief Set direction for FIO port in halfword accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @param[in] bitValue Value that contains all bits in to set direction, + * in range from 0 to 0xFFFF. + * @param[in] dir Direction value, should be: + * - 0: Input. + * - 1: Output. + * @return None + * + * Note: All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_HalfWordSetDir(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue, uint8_t dir) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Output direction + if (dir) { + // Upper + if(halfwordNum) { + pFIO->FIODIRU |= bitValue; + } + // lower + else { + pFIO->FIODIRL |= bitValue; + } + } + // Input direction + else { + // Upper + if(halfwordNum) { + pFIO->FIODIRU &= ~bitValue; + } + // lower + else { + pFIO->FIODIRL &= ~bitValue; + } + } + } +} + + +/*********************************************************************//** + * @brief Set mask value for bits in FIO port in halfword accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @param[in] bitValue Value that contains all bits in to set, + * in range from 0 to 0xFFFF. + * @param[in] maskValue Mask value contains state value for each bit: + * - 0: not mask. + * - 1: mask. + * @return None + * + * Note: + * - All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + * - After executing this function, in mask register, value '0' on each bit + * enables an access to the corresponding physical pin via a read or write access, + * while value '1' on bit (masked) that corresponding pin will not be changed + * with write access and if read, will not be reflected in the updated pin. + **********************************************************************/ +void FIO_HalfWordSetMask(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue, uint8_t maskValue) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Mask + if (maskValue){ + // Upper + if(halfwordNum) { + pFIO->FIOMASKU |= bitValue; + } + // lower + else { + pFIO->FIOMASKL |= bitValue; + } + } + // Un-mask + else { + // Upper + if(halfwordNum) { + pFIO->FIOMASKU &= ~bitValue; + } + // lower + else { + pFIO->FIOMASKL &= ~bitValue; + } + } + } +} + + +/*********************************************************************//** + * @brief Set bits for FIO port in halfword accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @param[in] bitValue Value that contains all bits in to set, + * in range from 0 to 0xFFFF. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_HalfWordSetValue(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Upper + if(halfwordNum) { + pFIO->FIOSETU = bitValue; + } + // lower + else { + pFIO->FIOSETL = bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Clear bits for FIO port in halfword accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @param[in] bitValue Value that contains all bits in to clear, + * in range from 0 to 0xFFFF. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_HalfWordClearValue(uint8_t portNum, uint8_t halfwordNum, uint16_t bitValue) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Upper + if(halfwordNum) { + pFIO->FIOCLRU = bitValue; + } + // lower + else { + pFIO->FIOCLRL = bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Read Current state on port pin that have input direction of GPIO + * in halfword accessible style. + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] halfwordNum HalfWord part number, should be 0 (lower) or 1(upper) + * @return Current value of FIO port pin of specified halfword. + * Note: Return value contain state of each port pin (bit) on that FIO regardless + * its direction is input or output. + **********************************************************************/ +uint16_t FIO_HalfWordReadValue(uint8_t portNum, uint8_t halfwordNum) +{ + GPIO_HalfWord_TypeDef *pFIO = FIO_HalfWordGetPointer(portNum); + if(pFIO != NULL) { + // Upper + if(halfwordNum) { + return (pFIO->FIOPINU); + } + // lower + else { + return (pFIO->FIOPINL); + } + } + return (0); +} + + +/* FIO Byte accessible ------------------------------------------------------------ */ + +/*********************************************************************//** + * @brief Set direction for FIO port in byte accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @param[in] bitValue Value that contains all bits in to set direction, + * in range from 0 to 0xFF. + * @param[in] dir Direction value, should be: + * - 0: Input. + * - 1: Output. + * @return None + * + * Note: All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_ByteSetDir(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t dir) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if(pFIO != NULL) { + // Output direction + if (dir) { + if (byteNum <= 3) { + pFIO->FIODIR[byteNum] |= bitValue; + } + } + // Input direction + else { + if (byteNum <= 3) { + pFIO->FIODIR[byteNum] &= ~bitValue; + } + } + } +} + +/*********************************************************************//** + * @brief Set mask value for bits in FIO port in byte accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @param[in] bitValue Value that contains all bits in to set mask, + * in range from 0 to 0xFF. + * @param[in] maskValue Mask value contains state value for each bit: + * - 0: not mask. + * - 1: mask. + * @return None + * + * Note: + * - All remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + * - After executing this function, in mask register, value '0' on each bit + * enables an access to the corresponding physical pin via a read or write access, + * while value '1' on bit (masked) that corresponding pin will not be changed + * with write access and if read, will not be reflected in the updated pin. + **********************************************************************/ +void FIO_ByteSetMask(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t maskValue) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if(pFIO != NULL) { + // Mask + if (maskValue) { + if (byteNum <= 3) { + pFIO->FIOMASK[byteNum] |= bitValue; + } + } + // Un-mask + else { + if (byteNum <= 3) { + pFIO->FIOMASK[byteNum] &= ~bitValue; + } + } + } +} + + +/*********************************************************************//** + * @brief Set bits for FIO port in byte accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @param[in] bitValue Value that contains all bits in to set, + * in range from 0 to 0xFF. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_ByteSetValue(uint8_t portNum, uint8_t byteNum, uint8_t bitValue) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if (pFIO != NULL) { + if (byteNum <= 3){ + pFIO->FIOSET[byteNum] = bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Clear bits for FIO port in byte accessible style + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @param[in] bitValue Value that contains all bits in to clear, + * in range from 0 to 0xFF. + * @return None + * + * Note: + * - For all bits that has been set as input direction, this function will + * not effect. + * - For all remaining bits that are not activated in bitValue (value '0') + * will not be effected by this function. + **********************************************************************/ +void FIO_ByteClearValue(uint8_t portNum, uint8_t byteNum, uint8_t bitValue) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if (pFIO != NULL) { + if (byteNum <= 3){ + pFIO->FIOCLR[byteNum] = bitValue; + } + } +} + + +/*********************************************************************//** + * @brief Read Current state on port pin that have input direction of GPIO + * in byte accessible style. + * @param[in] portNum Port number, in range from 0 to 4 + * @param[in] byteNum Byte part number, should be in range from 0 to 3 + * @return Current value of FIO port pin of specified byte part. + * Note: Return value contain state of each port pin (bit) on that FIO regardless + * its direction is input or output. + **********************************************************************/ +uint8_t FIO_ByteReadValue(uint8_t portNum, uint8_t byteNum) +{ + GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum); + if (pFIO != NULL) { + if (byteNum <= 3){ + return (pFIO->FIOPIN[byteNum]); + } + } + return (0); +} + +/** + * @} + */ + +#endif /* _GPIO */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2c.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2c.c new file mode 100644 index 0000000000..99b29e017c --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2c.c @@ -0,0 +1,1344 @@ +/********************************************************************** +* $Id$ lpc17xx_i2c.c 2011-03-31 +*//** +* @file lpc17xx_i2c.c +* @brief Contains all functions support for I2C firmware +* library on LPC17xx +* @version 2.1 +* @date 31. Mar. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup I2C + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_i2c.h" +#include "lpc17xx_clkpwr.h" +#include "lpc17xx_pinsel.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _I2C + + +/* Private Types -------------------------------------------------------------- */ +/** @defgroup I2C_Private_Types I2C Private Types + * @{ + */ + +/** + * @brief I2C device configuration structure type + */ +typedef struct +{ + uint32_t txrx_setup; /* Transmission setup */ + int32_t dir; /* Current direction phase, 0 - write, 1 - read */ +} I2C_CFG_T; + +/** + * @} + */ + +/* Private Variables ---------------------------------------------------------- */ +/** + * @brief II2C driver data for I2C0, I2C1 and I2C2 + */ +static I2C_CFG_T i2cdat[3]; + +static uint32_t I2C_MasterComplete[3]; +static uint32_t I2C_SlaveComplete[3]; + +static uint32_t I2C_MonitorBufferIndex; + +/* Private Functions ---------------------------------------------------------- */ + +/* Get I2C number */ +static int32_t I2C_getNum(LPC_I2C_TypeDef *I2Cx); + +/* Generate a start condition on I2C bus (in master mode only) */ +static uint32_t I2C_Start (LPC_I2C_TypeDef *I2Cx); + +/* Generate a stop condition on I2C bus (in master mode only) */ +static void I2C_Stop (LPC_I2C_TypeDef *I2Cx); + +/* I2C send byte subroutine */ +static uint32_t I2C_SendByte (LPC_I2C_TypeDef *I2Cx, uint8_t databyte); + +/* I2C get byte subroutine */ +static uint32_t I2C_GetByte (LPC_I2C_TypeDef *I2Cx, uint8_t *retdat, Bool ack); + +/* I2C set clock (hz) */ +static void I2C_SetClock (LPC_I2C_TypeDef *I2Cx, uint32_t target_clock); + +/*--------------------------------------------------------------------------------*/ +/********************************************************************//** + * @brief Convert from I2C peripheral to number + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return I2C number, could be: 0..2 + *********************************************************************/ +static int32_t I2C_getNum(LPC_I2C_TypeDef *I2Cx){ + if (I2Cx == LPC_I2C0) { + return (0); + } else if (I2Cx == LPC_I2C1) { + return (1); + } else if (I2Cx == LPC_I2C2) { + return (2); + } + return (-1); +} + +/********************************************************************//** + * @brief Generate a start condition on I2C bus (in master mode only) + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return value of I2C status register after generate a start condition + *********************************************************************/ +static uint32_t I2C_Start (LPC_I2C_TypeDef *I2Cx) +{ + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + + // Enter to Master Transmitter mode + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + // Wait for complete + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +/********************************************************************//** + * @brief Generate a stop condition on I2C bus (in master mode only) + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + *********************************************************************/ +static void I2C_Stop (LPC_I2C_TypeDef *I2Cx) +{ + + /* Make sure start bit is not active */ + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + { + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + } + + I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; + + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; +} + +/********************************************************************//** + * @brief Send a byte + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] databyte: number of byte + * @return value of I2C status register after sending + *********************************************************************/ +static uint32_t I2C_SendByte (LPC_I2C_TypeDef *I2Cx, uint8_t databyte) +{ + uint32_t CodeStatus = I2Cx->I2STAT & I2C_STAT_CODE_BITMASK; + + if((CodeStatus != I2C_I2STAT_M_TX_START) && + (CodeStatus != I2C_I2STAT_M_TX_RESTART) && + (CodeStatus != I2C_I2STAT_M_TX_SLAW_ACK) && + (CodeStatus != I2C_I2STAT_M_TX_DAT_ACK) ) + { + return CodeStatus; + } + + /* Make sure start bit is not active */ + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + { + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + } + I2Cx->I2DAT = databyte & I2C_I2DAT_BITMASK; + + I2Cx->I2CONSET = I2C_I2CONSET_AA; + + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +/********************************************************************//** + * @brief Get a byte + * @param[in] I2Cx: I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[out] retdat pointer to return data + * @param[in] ack assert acknowledge or not, should be: TRUE/FALSE + * @return value of I2C status register after sending + *********************************************************************/ +static uint32_t I2C_GetByte (LPC_I2C_TypeDef *I2Cx, uint8_t *retdat, Bool ack) +{ + *retdat = (uint8_t) (I2Cx->I2DAT & I2C_I2DAT_BITMASK); + + if (ack == TRUE) + { + I2Cx->I2CONSET = I2C_I2CONSET_AA; + } + else + { + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC; + } + + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +/*********************************************************************//** + * @brief Setup clock rate for I2C peripheral + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] target_clock : clock of SSP (Hz) + * @return None + ***********************************************************************/ +static void I2C_SetClock (LPC_I2C_TypeDef *I2Cx, uint32_t target_clock) +{ + uint32_t temp; + + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + + // Get PCLK of I2C controller + if (I2Cx == LPC_I2C0) + { + temp = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_I2C0) / target_clock; + } + else if (I2Cx == LPC_I2C1) + { + temp = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_I2C1) / target_clock; + } + else if (I2Cx == LPC_I2C2) + { + temp = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_I2C2) / target_clock; + } + + /* Set the I2C clock value to register */ + I2Cx->I2SCLH = (uint32_t)(temp / 2); + I2Cx->I2SCLL = (uint32_t)(temp - I2Cx->I2SCLH); +} +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup I2C_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initializes the I2Cx peripheral with specified parameter. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] clockrate Target clock rate value to initialized I2C + * peripheral (Hz) + * @return None + *********************************************************************/ +void I2C_Init(LPC_I2C_TypeDef *I2Cx, uint32_t clockrate) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + + if (I2Cx==LPC_I2C0) + { + /* Set up clock and power for I2C0 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C0, ENABLE); + /* As default, peripheral clock for I2C0 module + * is set to FCCLK / 2 */ + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_I2C0, CLKPWR_PCLKSEL_CCLK_DIV_2); + } + else if (I2Cx==LPC_I2C1) + { + /* Set up clock and power for I2C1 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C1, ENABLE); + /* As default, peripheral clock for I2C1 module + * is set to FCCLK / 2 */ + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_I2C1, CLKPWR_PCLKSEL_CCLK_DIV_2); + } + else if (I2Cx==LPC_I2C2) + { + /* Set up clock and power for I2C2 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C2, ENABLE); + /* As default, peripheral clock for I2C2 module + * is set to FCCLK / 2 */ + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_I2C2, CLKPWR_PCLKSEL_CCLK_DIV_2); + } + else { + // Up-Support this device + return; + } + + /* Set clock rate */ + I2C_SetClock(I2Cx, clockrate); + /* Set I2C operation to default */ + I2Cx->I2CONCLR = (I2C_I2CONCLR_AAC | I2C_I2CONCLR_STAC | I2C_I2CONCLR_I2ENC); +} + +/*********************************************************************//** + * @brief De-initializes the I2C peripheral registers to their + * default reset values. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + **********************************************************************/ +void I2C_DeInit(LPC_I2C_TypeDef* I2Cx) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + + /* Disable I2C control */ + I2Cx->I2CONCLR = I2C_I2CONCLR_I2ENC; + + if (I2Cx==LPC_I2C0) + { + /* Disable power for I2C0 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C0, DISABLE); + } + else if (I2Cx==LPC_I2C1) + { + /* Disable power for I2C1 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C1, DISABLE); + } + else if (I2Cx==LPC_I2C2) + { + /* Disable power for I2C2 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCI2C2, DISABLE); + } +} + +/*********************************************************************//** + * @brief Enable or disable I2C peripheral's operation + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] NewState New State of I2Cx peripheral's operation + * @return none + **********************************************************************/ +void I2C_Cmd(LPC_I2C_TypeDef* I2Cx, en_I2C_Mode Mode, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + + if (NewState == ENABLE) + { + if(Mode != I2C_SLAVE_MODE) + I2Cx->I2CONSET = I2C_I2CONSET_I2EN; + else + I2Cx->I2CONSET = I2C_I2CONSET_I2EN | I2C_I2CONSET_AA; + } + else + { + I2Cx->I2CONCLR = I2C_I2CONCLR_I2ENC; + } +} + +/*********************************************************************//** + * @brief Enable/Disable interrupt for I2C peripheral + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] NewState New State of I2C peripheral interrupt in NVIC core + * should be: + * - ENABLE: enable interrupt for this I2C peripheral + * - DISABLE: disable interrupt for this I2C peripheral + * @return None + **********************************************************************/ +void I2C_IntCmd (LPC_I2C_TypeDef *I2Cx, Bool NewState) +{ + if (NewState) + { + if(I2Cx == LPC_I2C0) + { + NVIC_EnableIRQ(I2C0_IRQn); + } + else if (I2Cx == LPC_I2C1) + { + NVIC_EnableIRQ(I2C1_IRQn); + } + else if (I2Cx == LPC_I2C2) + { + NVIC_EnableIRQ(I2C2_IRQn); + } + } + else + { + if(I2Cx == LPC_I2C0) + { + NVIC_DisableIRQ(I2C0_IRQn); + } + else if (I2Cx == LPC_I2C1) + { + NVIC_DisableIRQ(I2C1_IRQn); + } + else if (I2Cx == LPC_I2C2) + { + NVIC_DisableIRQ(I2C2_IRQn); + } + } + return; +} + + +/*********************************************************************//** + * @brief Handle I2C Master states. + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] CodeStatus I2C state + * @param[in] TransferCfg Pointer to a I2C_S_SETUP_Type structure that + * contains specified information about the + * configuration for master transfer. + * @return It can be + * - I2C_OK + * -I2C_BYTE_RECV + * -I2C_BYTE_SENT + * -I2C_SEND_END + * -I2C_RECV_END + * - I2C_ERR + * - I2C_NAK_RECV + **********************************************************************/ +int32_t I2C_MasterHanleStates(LPC_I2C_TypeDef *I2Cx, uint32_t CodeStatus, I2C_M_SETUP_Type *TransferCfg) +{ + uint8_t *txdat; + uint8_t *rxdat; + uint8_t tmp; + int32_t Ret = I2C_OK; + + //get buffer to send/receive + txdat = (uint8_t *) &TransferCfg->tx_data[TransferCfg->tx_count]; + rxdat = (uint8_t *) &TransferCfg->rx_data[TransferCfg->rx_count]; + + switch(CodeStatus) + { + case I2C_I2STAT_M_TX_START: + case I2C_I2STAT_M_TX_RESTART: + //case I2C_I2STAT_M_RX_START: + //case I2C_I2STAT_M_RX_RESTART + // Send data first + if(TransferCfg->tx_count < TransferCfg->tx_length) + { + /* Send slave address + WR direction bit = 0 ----------------------------------- */ + I2C_SendByte(I2Cx, (TransferCfg->sl_addr7bit << 1)); + Ret = I2C_BYTE_SENT; + } + else if (TransferCfg->rx_count < TransferCfg->rx_length) + { + /* Send slave address + RD direction bit = 1 ----------------------------------- */ + I2C_SendByte(I2Cx, ((TransferCfg->sl_addr7bit << 1) | 0x01)); + Ret = I2C_BYTE_SENT; + } + break; + case I2C_I2STAT_M_TX_SLAW_ACK: + case I2C_I2STAT_M_TX_DAT_ACK: + + if(TransferCfg->tx_count < TransferCfg->tx_length) + { + I2C_SendByte(I2Cx, *txdat); + + txdat++; + + TransferCfg->tx_count++; + + Ret = I2C_BYTE_SENT; + } + else + { + I2C_Stop(I2Cx); + + Ret = I2C_SEND_END; + + } + break; + case I2C_I2STAT_M_TX_DAT_NACK: + I2C_Stop(I2Cx); + Ret = I2C_SEND_END; + break; + case I2C_I2STAT_M_RX_ARB_LOST: + //case I2C_I2STAT_M_TX_ARB_LOST: + I2Cx->I2CONSET = I2C_I2CONSET_STA|I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + case I2C_I2STAT_M_RX_SLAR_ACK: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + + Ret = I2C_BYTE_RECV; + break; + case I2C_I2STAT_M_RX_DAT_ACK: + if (TransferCfg->rx_count rx_length) + { + if (TransferCfg->rx_count < (TransferCfg->rx_length - 2)) + { + I2C_GetByte(I2Cx, &tmp, TRUE); + + Ret = I2C_BYTE_RECV; + } + else // the next byte is the last byte, send NACK instead. + { + I2C_GetByte(I2Cx, &tmp, FALSE); + Ret = I2C_BYTE_RECV; + } + *rxdat++ = tmp; + + TransferCfg->rx_count++; + } + else + { + Ret = I2C_RECV_END; + } + + break; + case I2C_I2STAT_M_RX_DAT_NACK: + I2C_GetByte(I2Cx, &tmp, FALSE); + *rxdat++ = tmp; + TransferCfg->rx_count++; + I2C_Stop(I2Cx); + Ret = I2C_RECV_END; + break; + case I2C_I2STAT_M_RX_SLAR_NACK: + case I2C_I2STAT_M_TX_SLAW_NACK: + case I2C_I2STAT_BUS_ERROR: + // Send STOP condition + I2C_Stop(I2Cx); + Ret = I2C_ERR; + break; + /* No status information */ + case I2C_I2STAT_NO_INF: + default: + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + } + + return Ret; +} + +/*********************************************************************//** + * @brief Handle I2C Slave states. + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] CodeStatus I2C state + * @param[in] TransferCfg Pointer to a I2C_S_SETUP_Type structure that + * contains specified information about the + * configuration for master transfer. + * @return It can be + * - I2C_OK + * -I2C_BYTE_RECV + * -I2C_BYTE_SENT + * -I2C_SEND_END + * -I2C_RECV_END + * - I2C_ERR + * - I2C_NAK_RECV + **********************************************************************/ +int32_t I2C_SlaveHanleStates(LPC_I2C_TypeDef *I2Cx, uint32_t CodeStatus, I2C_S_SETUP_Type *TransferCfg) +{ + + int32_t Ret = I2C_OK; + uint8_t *txdat; + uint8_t *rxdat; + + //get buffer to send/receive + txdat = (uint8_t *) &TransferCfg->tx_data[TransferCfg->tx_count]; + rxdat = (uint8_t *) &TransferCfg->rx_data[TransferCfg->rx_count]; + + switch (CodeStatus) + { + /* Reading phase -------------------------------------------------------- */ + /* Own SLA+R has been received, ACK has been returned */ + case I2C_I2STAT_S_RX_SLAW_ACK: + + /* General call address has been received, ACK has been returned */ + case I2C_I2STAT_S_RX_GENCALL_ACK: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + /* Arbitration has been lost in Slave Address + R/W bit as bus Master. General Call has + been received and ACK has been returned.*/ + case I2C_I2STAT_S_RX_ARB_LOST_M_GENCALL: + I2Cx->I2CONSET = I2C_I2CONSET_AA|I2C_I2CONSET_STA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + /* Previously addressed with own SLA; + * DATA byte has been received; + * ACK has been returned */ + case I2C_I2STAT_S_RX_ARB_LOST_M_SLA: + case I2C_I2STAT_S_RX_PRE_SLA_DAT_ACK: + + /* + * All data bytes that over-flow the specified receive + * data length, just ignore them. + */ + if ((TransferCfg->rx_count < TransferCfg->rx_length) && (TransferCfg->rx_data != NULL)) + { + *rxdat++ = (uint8_t)I2Cx->I2DAT; + + TransferCfg->rx_count++; + + Ret = I2C_BYTE_RECV; + } + if(TransferCfg->rx_count == (TransferCfg->rx_length) ) { + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC|I2C_I2CONCLR_SIC; + Ret = I2C_BYTE_RECV; + } + else { + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + } + + break; + /* DATA has been received, Only the first data byte will be received with ACK. Additional + data will be received with NOT ACK. */ + case I2C_I2STAT_S_RX_PRE_GENCALL_DAT_ACK: + if ((TransferCfg->rx_count < TransferCfg->rx_length) && (TransferCfg->rx_data != NULL)) + { + *rxdat++ = (uint8_t)I2Cx->I2DAT; + + TransferCfg->rx_count++; + + Ret = I2C_BYTE_RECV; + } + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC|I2C_I2CONCLR_SIC; + break; + + /* Writing phase -------------------------------------------------------- */ + /* Own SLA+R has been received, ACK has been returned */ + case I2C_I2STAT_S_TX_SLAR_ACK: + + /* Data has been transmitted, ACK has been received */ + case I2C_I2STAT_S_TX_DAT_ACK: + /* + * All data bytes that over-flow the specified receive + * data length, just ignore them. + */ + if ((TransferCfg->tx_count < TransferCfg->tx_length) && (TransferCfg->tx_data != NULL)) + { + I2Cx->I2DAT = *txdat++; + + TransferCfg->tx_count++; + + Ret = I2C_BYTE_SENT; + } + + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + /* Arbitration lost in Slave Address and R/W bit as bus Master. Own Slave Address + Read + has been received, ACK has been returned. */ + case I2C_I2STAT_S_TX_ARB_LOST_M_SLA: + if ((TransferCfg->tx_count < TransferCfg->tx_length) && (TransferCfg->tx_data != NULL)) + { + I2Cx->I2DAT = *txdat++; + + TransferCfg->tx_count++; + + Ret = I2C_BYTE_SENT; + } + I2Cx->I2CONSET = I2C_I2CONSET_AA|I2C_I2CONSET_STA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + + case I2C_I2STAT_S_TX_LAST_DAT_ACK: + /* Data has been transmitted, NACK has been received, + * that means there's no more data to send, exit now */ + /* + * Note: Don't wait for stop event since in slave transmit mode, + * since there no proof lets us know when a stop signal has been received + * on slave side. + */ + case I2C_I2STAT_S_TX_DAT_NACK: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + Ret = I2C_SEND_END; + break; + + /* Previously addressed with own SLA; + * DATA byte has been received; + * NOT ACK has been returned */ + case I2C_I2STAT_S_RX_PRE_SLA_DAT_NACK: + + /* DATA has been received, NOT ACK has been returned */ + case I2C_I2STAT_S_RX_PRE_GENCALL_DAT_NACK: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + Ret = I2C_RECV_END; + break; + + /* + * Note that: Return code only let us know a stop condition mixed + * with a repeat start condition in the same code value. + * So we should provide a time-out. In case this is really a stop + * condition, this will return back after time out condition. Otherwise, + * next session that is slave receive data will be completed. + */ + + /* A Stop or a repeat start condition */ + case I2C_I2STAT_S_RX_STA_STO_SLVREC_SLVTRX: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + Ret = I2C_STA_STO_RECV; + break; + + /* No status information */ + case I2C_I2STAT_NO_INF: + /* Other status must be captured */ + default: + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + break; + + } + + return Ret; +} +/*********************************************************************//** + * @brief General Master Interrupt handler for I2C peripheral + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + **********************************************************************/ +void I2C_MasterHandler(LPC_I2C_TypeDef *I2Cx) +{ + uint32_t i2cId = I2C_getNum(I2Cx); + uint8_t returnCode; + I2C_M_SETUP_Type *txrx_setup; + int32_t Ret = I2C_OK; + + txrx_setup = (I2C_M_SETUP_Type *) i2cdat[i2cId].txrx_setup; + + returnCode = (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); + + // Save current status + txrx_setup->status = returnCode; + + Ret = I2C_MasterHanleStates(I2Cx, returnCode, txrx_setup); + + if(I2C_CheckError(Ret)) + { + if(txrx_setup->retransmissions_count < txrx_setup->retransmissions_max) + { + // Retry + txrx_setup->retransmissions_count ++; + txrx_setup->tx_count = 0; + txrx_setup->rx_count = 0; + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + I2Cx->I2CONSET = I2C_I2CONSET_STA; + return; + } + else + { + goto s_int_end; + } + } + else if (Ret & I2C_SEND_END) + { + // If no need to wait for data from Slave + if(txrx_setup->rx_count >= (txrx_setup->rx_length)) + { + goto s_int_end; + } + else // Start to wait for data from Slave + { + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + I2Cx->I2CONSET = I2C_I2CONSET_STA; + return; + } + } + else if (Ret & I2C_RECV_END) + { + goto s_int_end; + } + else + { + return; + } + +s_int_end: + // Disable interrupt + I2C_IntCmd(I2Cx, FALSE); + + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC | I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC; + + I2C_MasterComplete[i2cId] = TRUE; + +} + + +/*********************************************************************//** + * @brief General Slave Interrupt handler for I2C peripheral + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + **********************************************************************/ +void I2C_SlaveHandler (LPC_I2C_TypeDef *I2Cx) +{ + uint32_t i2cId = I2C_getNum(I2Cx); + uint8_t returnCode; + I2C_S_SETUP_Type *txrx_setup; + uint32_t timeout; + int32_t Ret = I2C_OK; + + txrx_setup = (I2C_S_SETUP_Type *) i2cdat[i2cId].txrx_setup; + +handle_state: + + returnCode = (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); + // Save current status + txrx_setup->status = returnCode; + + + Ret = I2C_SlaveHanleStates(I2Cx, returnCode, txrx_setup); + + if(I2C_CheckError(Ret)) + { + goto s_int_end; + } + else if (Ret & I2C_STA_STO_RECV) + { + // Temporally lock the interrupt for timeout condition + I2C_IntCmd(I2Cx, FALSE); + // enable time out + timeout = I2C_SLAVE_TIME_OUT; + while(1) + { + if (I2Cx->I2CONSET & I2C_I2CONSET_SI) + { + // re-Enable interrupt + I2C_IntCmd(I2Cx, TRUE); + goto handle_state; + } + else + { + timeout--; + if (timeout == 0) + { + // timeout occur, it's really a stop condition + txrx_setup->status |= I2C_SETUP_STATUS_DONE; + goto s_int_end; + } + } + } + } + else if(Ret &I2C_SEND_END) + { + goto s_int_end; + } + else + { + return; + } + +s_int_end: + // Disable interrupt + I2C_IntCmd(I2Cx, FALSE); + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC | I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC; + + I2C_SlaveComplete[i2cId] = TRUE; +} + +/*********************************************************************//** + * @brief Transmit and Receive data in master mode + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] TransferCfg Pointer to a I2C_M_SETUP_Type structure that + * contains specified information about the + * configuration for master transfer. + * @param[in] Opt a I2C_TRANSFER_OPT_Type type that selected for + * interrupt or polling mode. + * @return SUCCESS or ERROR + * + * Note: + * - In case of using I2C to transmit data only, either transmit length set to 0 + * or transmit data pointer set to NULL. + * - In case of using I2C to receive data only, either receive length set to 0 + * or receive data pointer set to NULL. + * - In case of using I2C to transmit followed by receive data, transmit length, + * transmit data pointer, receive length and receive data pointer should be set + * corresponding. + **********************************************************************/ +Status I2C_MasterTransferData(LPC_I2C_TypeDef *I2Cx, I2C_M_SETUP_Type *TransferCfg, \ + I2C_TRANSFER_OPT_Type Opt) +{ + uint32_t i2cId = I2C_getNum(I2Cx); uint32_t CodeStatus; + int32_t Ret = I2C_OK; + + // Reset I2C setup value to default state + TransferCfg->tx_count = 0; + TransferCfg->rx_count = 0; + TransferCfg->status = 0; + + if (Opt == I2C_TRANSFER_POLLING) + { + /* First Start condition -------------------------------------------------------------- */ + TransferCfg->retransmissions_count = 0; +retry: + // Reset I2C setup value to default state + TransferCfg->tx_count = 0; + TransferCfg->rx_count = 0; + + // Start command + CodeStatus = I2C_Start(I2Cx); + + while(1) // send data first and then receive data from Slave. + { + Ret = I2C_MasterHanleStates(I2Cx, CodeStatus, TransferCfg); + if(I2C_CheckError(Ret)) + { + TransferCfg->retransmissions_count++; + if (TransferCfg->retransmissions_count > TransferCfg->retransmissions_max){ + // save status + TransferCfg->status = CodeStatus | I2C_SETUP_STATUS_NOACKF; + goto error; + } else { + goto retry; + } + } + else if( (Ret & I2C_BYTE_SENT) || + (Ret & I2C_BYTE_RECV)) + { + // Wait for sending ends + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + } + else if (Ret & I2C_SEND_END) // already send all data + { + // If no need to wait for data from Slave + if(TransferCfg->rx_count >= (TransferCfg->rx_length)) + { + break; + } + else + { + I2C_Start(I2Cx); + } + } + else if (Ret & I2C_RECV_END) // already receive all data + { + break; + } + CodeStatus = I2Cx->I2STAT & I2C_STAT_CODE_BITMASK; + } + return SUCCESS; +error: + return ERROR; + } + + else if (Opt == I2C_TRANSFER_INTERRUPT) + { + // Setup tx_rx data, callback and interrupt handler + i2cdat[i2cId].txrx_setup = (uint32_t) TransferCfg; + + // Set direction phase, write first + i2cdat[i2cId].dir = 0; + + /* First Start condition -------------------------------------------------------------- */ + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + I2C_IntCmd(I2Cx, TRUE); + + return (SUCCESS); + } + + return ERROR; +} + +/*********************************************************************//** + * @brief Receive and Transmit data in slave mode + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] TransferCfg Pointer to a I2C_S_SETUP_Type structure that + * contains specified information about the + * configuration for master transfer. + * @param[in] Opt I2C_TRANSFER_OPT_Type type that selected for + * interrupt or polling mode. + * @return SUCCESS or ERROR + * + * Note: + * The mode of slave's operation depends on the command sent from master on + * the I2C bus. If the master send a SLA+W command, this sub-routine will + * use receive data length and receive data pointer. If the master send a SLA+R + * command, this sub-routine will use transmit data length and transmit data + * pointer. + * If the master issue an repeat start command or a stop command, the slave will + * enable an time out condition, during time out condition, if there's no activity + * on I2C bus, the slave will exit, otherwise (i.e. the master send a SLA+R/W), + * the slave then switch to relevant operation mode. The time out should be used + * because the return status code can not show difference from stop and repeat + * start command in slave operation. + * In case of the expected data length from master is greater than data length + * that slave can support: + * - In case of reading operation (from master): slave will return I2C_I2DAT_IDLE_CHAR + * value. + * - In case of writing operation (from master): slave will ignore remain data from master. + **********************************************************************/ +Status I2C_SlaveTransferData(LPC_I2C_TypeDef *I2Cx, I2C_S_SETUP_Type *TransferCfg, \ + I2C_TRANSFER_OPT_Type Opt) +{ + int32_t Ret = I2C_OK; + + uint32_t CodeStatus; + uint32_t timeout; + int32_t time_en; + uint32_t i2cId = I2C_getNum(I2Cx); + // Reset I2C setup value to default state + TransferCfg->tx_count = 0; + TransferCfg->rx_count = 0; + TransferCfg->status = 0; + + // Polling option + if (Opt == I2C_TRANSFER_POLLING) + { + /* Set AA bit to ACK command on I2C bus */ + I2Cx->I2CONSET = I2C_I2CONSET_AA; + + /* Clear SI bit to be ready ... */ + I2Cx->I2CONCLR = (I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC|I2C_I2CONCLR_STOC); + + time_en = 0; + timeout = 0; + + while (1) + { + /* Check SI flag ready */ + if (I2Cx->I2CONSET & I2C_I2CONSET_SI) + { + time_en = 0; + + CodeStatus = (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); + + Ret = I2C_SlaveHanleStates(I2Cx, CodeStatus, TransferCfg); + if(I2C_CheckError(Ret)) + { + goto s_error; + } + else if(Ret & I2C_STA_STO_RECV) + { + time_en = 1; + timeout = 0; + } + else if (Ret & I2C_SEND_END) + { + goto s_end_stage; + } + } + else if (time_en) + { + if (timeout++ > I2C_SLAVE_TIME_OUT) + { + // it's really a stop condition, goto end stage + goto s_end_stage; + } + } + } + +s_end_stage: + /* Clear AA bit to disable ACK on I2C bus */ + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC; + + // Check if there's no error during operation + // Update status + TransferCfg->status = CodeStatus | I2C_SETUP_STATUS_DONE; + return SUCCESS; + +s_error: + /* Clear AA bit to disable ACK on I2C bus */ + I2Cx->I2CONCLR = I2C_I2CONCLR_AAC; + + // Update status + TransferCfg->status = CodeStatus; + return ERROR; + } + + else if (Opt == I2C_TRANSFER_INTERRUPT) + { + // Setup tx_rx data, callback and interrupt handler + i2cdat[i2cId].txrx_setup = (uint32_t) TransferCfg; + + // Set direction phase, read first + i2cdat[i2cId].dir = 1; + + // Enable AA + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC; + I2C_IntCmd(I2Cx, TRUE); + + return (SUCCESS); + } + + return ERROR; +} + +/*********************************************************************//** + * @brief Set Own slave address in I2C peripheral corresponding to + * parameter specified in OwnSlaveAddrConfigStruct. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] OwnSlaveAddrConfigStruct Pointer to a I2C_OWNSLAVEADDR_CFG_Type + * structure that contains the configuration information for the +* specified I2C slave address. + * @return None + **********************************************************************/ +void I2C_SetOwnSlaveAddr(LPC_I2C_TypeDef *I2Cx, I2C_OWNSLAVEADDR_CFG_Type *OwnSlaveAddrConfigStruct) +{ + uint32_t tmp; + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + CHECK_PARAM(PARAM_I2C_SLAVEADDR_CH(OwnSlaveAddrConfigStruct->SlaveAddrChannel)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(OwnSlaveAddrConfigStruct->GeneralCallState)); + + tmp = (((uint32_t)(OwnSlaveAddrConfigStruct->SlaveAddr_7bit << 1)) \ + | ((OwnSlaveAddrConfigStruct->GeneralCallState == ENABLE) ? 0x01 : 0x00))& I2C_I2ADR_BITMASK; + switch (OwnSlaveAddrConfigStruct->SlaveAddrChannel) + { + case 0: + I2Cx->I2ADR0 = tmp; + I2Cx->I2MASK0 = I2C_I2MASK_MASK((uint32_t) \ + (OwnSlaveAddrConfigStruct->SlaveAddrMaskValue)); + break; + case 1: + I2Cx->I2ADR1 = tmp; + I2Cx->I2MASK1 = I2C_I2MASK_MASK((uint32_t) \ + (OwnSlaveAddrConfigStruct->SlaveAddrMaskValue)); + break; + case 2: + I2Cx->I2ADR2 = tmp; + I2Cx->I2MASK2 = I2C_I2MASK_MASK((uint32_t) \ + (OwnSlaveAddrConfigStruct->SlaveAddrMaskValue)); + break; + case 3: + I2Cx->I2ADR3 = tmp; + I2Cx->I2MASK3 = I2C_I2MASK_MASK((uint32_t) \ + (OwnSlaveAddrConfigStruct->SlaveAddrMaskValue)); + break; + } +} + + +/*********************************************************************//** + * @brief Configures functionality in I2C monitor mode + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] MonitorCfgType Monitor Configuration type, should be: + * - I2C_MONITOR_CFG_SCL_OUTPUT: I2C module can 'stretch' + * the clock line (hold it low) until it has had time to + * respond to an I2C interrupt. + * - I2C_MONITOR_CFG_MATCHALL: When this bit is set to '1' + * and the I2C is in monitor mode, an interrupt will be + * generated on ANY address received. + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable this function. + * - DISABLE: Disable this function. + * @return None + **********************************************************************/ +void I2C_MonitorModeConfig(LPC_I2C_TypeDef *I2Cx, uint32_t MonitorCfgType, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + CHECK_PARAM(PARAM_I2C_MONITOR_CFG(MonitorCfgType)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + I2Cx->MMCTRL |= MonitorCfgType; + } + else + { + I2Cx->MMCTRL &= (~MonitorCfgType) & I2C_I2MMCTRL_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enable/Disable I2C monitor mode + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable monitor mode. + * - DISABLE: Disable monitor mode. + * @return None + **********************************************************************/ +void I2C_MonitorModeCmd(LPC_I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + I2Cx->MMCTRL |= I2C_I2MMCTRL_MM_ENA; + I2Cx->I2CONSET = I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC; + } + else + { + I2Cx->MMCTRL &= (~I2C_I2MMCTRL_MM_ENA) & I2C_I2MMCTRL_BITMASK; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC | I2C_I2CONCLR_STAC | I2C_I2CONCLR_AAC; + } + I2C_MonitorBufferIndex = 0; +} + + +/*********************************************************************//** + * @brief Get data from I2C data buffer in monitor mode. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + * Note: In monitor mode, the I2C module may lose the ability to stretch + * the clock (stall the bus) if the ENA_SCL bit is not set. This means that + * the processor will have a limited amount of time to read the contents of + * the data received on the bus. If the processor reads the I2DAT shift + * register, as it ordinarily would, it could have only one bit-time to + * respond to the interrupt before the received data is overwritten by + * new data. + **********************************************************************/ +uint8_t I2C_MonitorGetDatabuffer(LPC_I2C_TypeDef *I2Cx) +{ + CHECK_PARAM(PARAM_I2Cx(I2Cx)); + return ((uint8_t)(I2Cx->I2DATA_BUFFER)); +} + +/*********************************************************************//** + * @brief Get data from I2C data buffer in monitor mode. + * @param[in] I2Cx I2C peripheral selected, should be + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return None + * Note: In monitor mode, the I2C module may lose the ability to stretch + * the clock (stall the bus) if the ENA_SCL bit is not set. This means that + * the processor will have a limited amount of time to read the contents of + * the data received on the bus. If the processor reads the I2DAT shift + * register, as it ordinarily would, it could have only one bit-time to + * respond to the interrupt before the received data is overwritten by + * new data. + **********************************************************************/ +BOOL_8 I2C_MonitorHandler(LPC_I2C_TypeDef *I2Cx, uint8_t *buffer, uint32_t size) +{ + BOOL_8 ret=FALSE; + + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; + + buffer[I2C_MonitorBufferIndex] = (uint8_t)(I2Cx->I2DATA_BUFFER); + I2C_MonitorBufferIndex++; + if(I2C_MonitorBufferIndex >= size) + { + ret = TRUE; + } + return ret; +} +/*********************************************************************//** + * @brief Get status of Master Transfer + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return Master transfer status, could be: + * - TRUE master transfer completed + * - FALSE master transfer have not completed yet + **********************************************************************/ +uint32_t I2C_MasterTransferComplete(LPC_I2C_TypeDef *I2Cx) +{ + uint32_t retval, tmp; + tmp = I2C_getNum(I2Cx); + retval = I2C_MasterComplete[tmp]; + I2C_MasterComplete[tmp] = FALSE; + return retval; +} + +/*********************************************************************//** + * @brief Get status of Slave Transfer + * @param[in] I2Cx I2C peripheral selected, should be: + * - LPC_I2C0 + * - LPC_I2C1 + * - LPC_I2C2 + * @return Complete status, could be: TRUE/FALSE + **********************************************************************/ +uint32_t I2C_SlaveTransferComplete(LPC_I2C_TypeDef *I2Cx) +{ + uint32_t retval, tmp; + tmp = I2C_getNum(I2Cx); + retval = I2C_SlaveComplete[tmp]; + I2C_SlaveComplete[tmp] = FALSE; + return retval; +} + + + +/** + * @} + */ + +#endif /* _I2C */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2s.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2s.c new file mode 100644 index 0000000000..f57fd2f1be --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_i2s.c @@ -0,0 +1,663 @@ +/********************************************************************** +* $Id$ lpc17xx_i2s.c 2010-09-23 +*//** +* @file lpc17xx_i2s.c +* @brief Contains all functions support for I2S firmware +* library on LPC17xx +* @version 3.1 +* @date 23. Sep. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup I2S + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_i2s.h" +#include "lpc17xx_clkpwr.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _I2S + +/* Private Functions ---------------------------------------------------------- */ + +static uint8_t i2s_GetWordWidth(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode); +static uint8_t i2s_GetChannel(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode); + +/********************************************************************//** + * @brief Get I2S wordwidth value + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is the I2S mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return The wordwidth value, should be: 8,16 or 32 + *********************************************************************/ +static uint8_t i2s_GetWordWidth(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + uint8_t value; + + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) { + value = (I2Sx->I2SDAO) & 0x03; /* get wordwidth bit */ + } else { + value = (I2Sx->I2SDAI) & 0x03; /* get wordwidth bit */ + } + switch (value) { + case I2S_WORDWIDTH_8: + return 8; + case I2S_WORDWIDTH_16: + return 16; + default: + return 32; + } +} + +/********************************************************************//** + * @brief Get I2S channel value + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is the I2S mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return The channel value, should be: 1(mono) or 2(stereo) + *********************************************************************/ +static uint8_t i2s_GetChannel(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + uint8_t value; + + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) { + value = ((I2Sx->I2SDAO) & 0x04)>>2; /* get bit[2] */ + } else { + value = ((I2Sx->I2SDAI) & 0x04)>>2; /* get bit[2] */ + } + if(value == I2S_MONO) return 1; + return 2; +} + +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup I2S_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initialize I2S + * - Turn on power and clock + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @return none + *********************************************************************/ +void I2S_Init(LPC_I2S_TypeDef *I2Sx) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + // Turn on power and clock + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCI2S, ENABLE); + LPC_I2S->I2SDAI = LPC_I2S->I2SDAO = 0x00; +} + +/********************************************************************//** + * @brief Configuration I2S, setting: + * - master/slave mode + * - wordwidth value + * - channel mode + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @param[in] ConfigStruct pointer to I2S_CFG_Type structure + * which will be initialized. + * @return none + *********************************************************************/ +void I2S_Config(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode, I2S_CFG_Type* ConfigStruct) +{ + uint32_t bps, config; + + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + CHECK_PARAM(PARAM_I2S_WORDWIDTH(ConfigStruct->wordwidth)); + CHECK_PARAM(PARAM_I2S_CHANNEL(ConfigStruct->mono)); + CHECK_PARAM(PARAM_I2S_STOP(ConfigStruct->stop)); + CHECK_PARAM(PARAM_I2S_RESET(ConfigStruct->reset)); + CHECK_PARAM(PARAM_I2S_WS_SEL(ConfigStruct->ws_sel)); + CHECK_PARAM(PARAM_I2S_MUTE(ConfigStruct->mute)); + + /* Setup clock */ + bps = (ConfigStruct->wordwidth +1)*8; + + /* Calculate audio config */ + config = (bps - 1)<<6 | (ConfigStruct->ws_sel)<<5 | (ConfigStruct->reset)<<4 | + (ConfigStruct->stop)<<3 | (ConfigStruct->mono)<<2 | (ConfigStruct->wordwidth); + + if(TRMode == I2S_RX_MODE){ + LPC_I2S->I2SDAI = config; + }else{ + LPC_I2S->I2SDAO = config; + } +} + +/********************************************************************//** + * @brief DeInitial both I2S transmit or receive + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @return none + *********************************************************************/ +void I2S_DeInit(LPC_I2S_TypeDef *I2Sx) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + // Turn off power and clock + CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCI2S, DISABLE); +} + +/********************************************************************//** + * @brief Get I2S Buffer Level + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode Transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return current level of Transmit/Receive Buffer + *********************************************************************/ +uint8_t I2S_GetLevel(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if(TRMode == I2S_TX_MODE) + { + return ((I2Sx->I2SSTATE >> 16) & 0xFF); + } + else + { + return ((I2Sx->I2SSTATE >> 8) & 0xFF); + } +} + +/********************************************************************//** + * @brief I2S Start: clear all STOP,RESET and MUTE bit, ready to operate + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @return none + *********************************************************************/ +void I2S_Start(LPC_I2S_TypeDef *I2Sx) +{ + //Clear STOP,RESET and MUTE bit + I2Sx->I2SDAO &= ~I2S_DAI_RESET; + I2Sx->I2SDAI &= ~I2S_DAI_RESET; + I2Sx->I2SDAO &= ~I2S_DAI_STOP; + I2Sx->I2SDAI &= ~I2S_DAI_STOP; + I2Sx->I2SDAO &= ~I2S_DAI_MUTE; +} + +/********************************************************************//** + * @brief I2S Send data + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] BufferData pointer to uint32_t is the data will be send + * @return none + *********************************************************************/ +void I2S_Send(LPC_I2S_TypeDef *I2Sx, uint32_t BufferData) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + I2Sx->I2STXFIFO = BufferData; +} + +/********************************************************************//** + * @brief I2S Receive Data + * @param[in] I2Sx pointer to LPC_I2S_TypeDef + * @return received value + *********************************************************************/ +uint32_t I2S_Receive(LPC_I2S_TypeDef* I2Sx) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + + return (I2Sx->I2SRXFIFO); + +} + +/********************************************************************//** + * @brief I2S Pause + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_Pause(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) //Transmit mode + { + I2Sx->I2SDAO |= I2S_DAO_STOP; + } else //Receive mode + { + I2Sx->I2SDAI |= I2S_DAI_STOP; + } +} + +/********************************************************************//** + * @brief I2S Mute + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_Mute(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) //Transmit mode + { + I2Sx->I2SDAO |= I2S_DAO_MUTE; + } else //Receive mode + { + I2Sx->I2SDAI |= I2S_DAI_MUTE; + } +} + +/********************************************************************//** + * @brief I2S Stop + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_Stop(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) //Transmit mode + { + I2Sx->I2SDAO &= ~I2S_DAO_MUTE; + I2Sx->I2SDAO |= I2S_DAO_STOP; + I2Sx->I2SDAO |= I2S_DAO_RESET; + } else //Receive mode + { + I2Sx->I2SDAI |= I2S_DAI_STOP; + I2Sx->I2SDAI |= I2S_DAI_RESET; + } +} + +/********************************************************************//** + * @brief Set frequency for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] Freq is the frequency for I2S will be set. It can range + * from 16-96 kHz(16, 22.05, 32, 44.1, 48, 96kHz) + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return Status: ERROR or SUCCESS + *********************************************************************/ +Status I2S_FreqConfig(LPC_I2S_TypeDef *I2Sx, uint32_t Freq, uint8_t TRMode) { + + uint32_t i2s_clk; + uint8_t channel, wordwidth; + uint32_t x, y; + uint64_t divider; + uint16_t dif; + uint16_t x_divide, y_divide; + uint16_t err, ErrorOptimal = 0xFFFF; + + uint32_t N; + + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PRAM_I2S_FREQ(Freq)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + //Get the frequency of PCLK_I2S + i2s_clk = CLKPWR_GetPCLK(CLKPWR_PCLKSEL_I2S); + + if(TRMode == I2S_TX_MODE) + { + channel = i2s_GetChannel(I2Sx,I2S_TX_MODE); + wordwidth = i2s_GetWordWidth(I2Sx,I2S_TX_MODE); + } + else + { + channel = i2s_GetChannel(I2Sx,I2S_RX_MODE); + wordwidth = i2s_GetWordWidth(I2Sx,I2S_RX_MODE); + } + + /* Calculate X and Y divider + * The MCLK rate for the I2S transmitter is determined by the value + * in the I2STXRATE/I2SRXRATE register. The required I2STXRATE/I2SRXRATE + * setting depends on the desired audio sample rate desired, the format + * (stereo/mono) used, and the data size. + * The formula is: + * I2S_MCLK = PCLK_I2S * (X/Y) / 2 + * In that, Y must be greater than or equal to X. X should divides evenly + * into Y. + * We have: + * I2S_MCLK = Freq * channel*wordwidth * (I2STXBITRATE+1); + * So: (X/Y) = (Freq * channel*wordwidth * (I2STXBITRATE+1))*2/PCLK_I2S + * We use a loop function to chose the most suitable X,Y value + */ + + /* divider is a fixed point number with 16 fractional bits */ + divider = (((uint64_t)Freq *channel*wordwidth * 2)<<16) / i2s_clk; + + /* find N that make x/y <= 1 -> divider <= 2^16 */ + for(N=64;N>0;N--){ + if((divider*N) < (1<<16)) break; + } + + if(N == 0) return ERROR; + + divider *= N; + + for (y = 255; y > 0; y--) { + x = y * divider; + if(x & (0xFF000000)) continue; + dif = x & 0xFFFF; + if(dif>0x8000) err = 0x10000-dif; + else err = dif; + if (err == 0) + { + y_divide = y; + break; + } + else if (err < ErrorOptimal) + { + ErrorOptimal = err; + y_divide = y; + } + } + x_divide = ((uint64_t)y_divide * Freq *(channel*wordwidth)* N * 2)/i2s_clk; + if(x_divide >= 256) x_divide = 0xFF; + if(x_divide == 0) x_divide = 1; + + if (TRMode == I2S_TX_MODE)// Transmitter + { + I2Sx->I2STXBITRATE = N-1; + I2Sx->I2STXRATE = y_divide | (x_divide << 8); + } else //Receiver + { + I2Sx->I2SRXBITRATE = N-1; + I2Sx->I2STXRATE = y_divide | (x_divide << 8); + } + return SUCCESS; +} + +/********************************************************************//** + * @brief I2S set bitrate + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] bitrate value will be set + * bitrate value should be in range: 0 .. 63 + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_SetBitRate(LPC_I2S_TypeDef *I2Sx, uint8_t bitrate, uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_BITRATE(bitrate)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if(TRMode == I2S_TX_MODE) + { + I2Sx->I2STXBITRATE = bitrate; + } + else + { + I2Sx->I2SRXBITRATE = bitrate; + } +} + +/********************************************************************//** + * @brief Configuration operating mode for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] ModeConfig pointer to I2S_MODEConf_Type will be used to + * configure + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_ModeConfig(LPC_I2S_TypeDef *I2Sx, I2S_MODEConf_Type* ModeConfig, + uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_CLKSEL(ModeConfig->clksel)); + CHECK_PARAM(PARAM_I2S_4PIN(ModeConfig->fpin)); + CHECK_PARAM(PARAM_I2S_MCLK(ModeConfig->mcena)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_TX_MODE) { + I2Sx->I2STXMODE &= ~0x0F; //clear bit 3:0 in I2STXMODE register + if (ModeConfig->clksel == I2S_CLKSEL_MCLK) { + I2Sx->I2STXMODE |= 0x02; + } + if (ModeConfig->fpin == I2S_4PIN_ENABLE) { + I2Sx->I2STXMODE |= (1 << 2); + } + if (ModeConfig->mcena == I2S_MCLK_ENABLE) { + I2Sx->I2STXMODE |= (1 << 3); + } + } else { + I2Sx->I2SRXMODE &= ~0x0F; //clear bit 3:0 in I2STXMODE register + if (ModeConfig->clksel == I2S_CLKSEL_MCLK) { + I2Sx->I2SRXMODE |= 0x02; + } + if (ModeConfig->fpin == I2S_4PIN_ENABLE) { + I2Sx->I2SRXMODE |= (1 << 2); + } + if (ModeConfig->mcena == I2S_MCLK_ENABLE) { + I2Sx->I2SRXMODE |= (1 << 3); + } + } +} + +/********************************************************************//** + * @brief Configure DMA operation for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] DMAConfig pointer to I2S_DMAConf_Type will be used to configure + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return none + *********************************************************************/ +void I2S_DMAConfig(LPC_I2S_TypeDef *I2Sx, I2S_DMAConf_Type* DMAConfig, + uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_DMA(DMAConfig->DMAIndex)); + CHECK_PARAM(PARAM_I2S_DMA_DEPTH(DMAConfig->depth)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_RX_MODE) { + if (DMAConfig->DMAIndex == I2S_DMA_1) { + LPC_I2S->I2SDMA1 = (DMAConfig->depth) << 8; + } else { + LPC_I2S->I2SDMA2 = (DMAConfig->depth) << 8; + } + } else { + if (DMAConfig->DMAIndex == I2S_DMA_1) { + LPC_I2S->I2SDMA1 = (DMAConfig->depth) << 16; + } else { + LPC_I2S->I2SDMA2 = (DMAConfig->depth) << 16; + } + } +} + +/********************************************************************//** + * @brief Enable/Disable DMA operation for I2S + * @param[in] I2Sx: I2S peripheral selected, should be: LPC_I2S + * @param[in] DMAIndex chose what DMA is used, should be: + * - I2S_DMA_1 = 0: DMA1 + * - I2S_DMA_2 = 1: DMA2 + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @param[in] NewState is new state of DMA operation, should be: + * - ENABLE + * - DISABLE + * @return none + *********************************************************************/ +void I2S_DMACmd(LPC_I2S_TypeDef *I2Sx, uint8_t DMAIndex, uint8_t TRMode, + FunctionalState NewState) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + CHECK_PARAM(PARAM_I2S_DMA(DMAIndex)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + + if (TRMode == I2S_RX_MODE) { + if (DMAIndex == I2S_DMA_1) { + if (NewState == ENABLE) + I2Sx->I2SDMA1 |= 0x01; + else + I2Sx->I2SDMA1 &= ~0x01; + } else { + if (NewState == ENABLE) + I2Sx->I2SDMA2 |= 0x01; + else + I2Sx->I2SDMA2 &= ~0x01; + } + } else { + if (DMAIndex == I2S_DMA_1) { + if (NewState == ENABLE) + I2Sx->I2SDMA1 |= 0x02; + else + I2Sx->I2SDMA1 &= ~0x02; + } else { + if (NewState == ENABLE) + I2Sx->I2SDMA2 |= 0x02; + else + I2Sx->I2SDMA2 &= ~0x02; + } + } +} + +/********************************************************************//** + * @brief Configure IRQ for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @param[in] level is the FIFO level that triggers IRQ request + * @return none + *********************************************************************/ +void I2S_IRQConfig(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode, uint8_t level) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_I2S_TRX(TRMode)); + CHECK_PARAM(PARAM_I2S_IRQ_LEVEL(level)); + + if (TRMode == I2S_RX_MODE) { + I2Sx->I2SIRQ |= (level << 8); + } else { + I2Sx->I2SIRQ |= (level << 16); + } +} + +/********************************************************************//** + * @brief Enable/Disable IRQ for I2S + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @param[in] NewState is new state of DMA operation, should be: + * - ENABLE + * - DISABLE + * @return none + *********************************************************************/ +void I2S_IRQCmd(LPC_I2S_TypeDef *I2Sx, uint8_t TRMode, FunctionalState NewState) { + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (TRMode == I2S_RX_MODE) { + if (NewState == ENABLE) + I2Sx->I2SIRQ |= 0x01; + else + I2Sx->I2SIRQ &= ~0x01; + //Enable DMA + + } else { + if (NewState == ENABLE) + I2Sx->I2SIRQ |= 0x02; + else + I2Sx->I2SIRQ &= ~0x02; + } +} + +/********************************************************************//** + * @brief Get I2S interrupt status + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return FunctionState should be: + * - ENABLE: interrupt is enable + * - DISABLE: interrupt is disable + *********************************************************************/ +FunctionalState I2S_GetIRQStatus(LPC_I2S_TypeDef *I2Sx,uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + if(TRMode == I2S_TX_MODE) + return ((FunctionalState)((I2Sx->I2SIRQ >> 1)&0x01)); + else + return ((FunctionalState)((I2Sx->I2SIRQ)&0x01)); +} + +/********************************************************************//** + * @brief Get I2S interrupt depth + * @param[in] I2Sx I2S peripheral selected, should be: LPC_I2S + * @param[in] TRMode is transmit/receive mode, should be: + * - I2S_TX_MODE = 0: transmit mode + * - I2S_RX_MODE = 1: receive mode + * @return depth of FIFO level on which to create an irq request + *********************************************************************/ +uint8_t I2S_GetIRQDepth(LPC_I2S_TypeDef *I2Sx,uint8_t TRMode) +{ + CHECK_PARAM(PARAM_I2Sx(I2Sx)); + if(TRMode == I2S_TX_MODE) + return (((I2Sx->I2SIRQ)>>16)&0xFF); + else + return (((I2Sx->I2SIRQ)>>8)&0xFF); +} +/** + * @} + */ + +#endif /* _I2S */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_iap.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_iap.c new file mode 100644 index 0000000000..f915f0c35e --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_iap.c @@ -0,0 +1,308 @@ +/********************************************************************** +* $Id$ lpc17xx_iap.c 2012-04-18 +*//** +* @file lpc17xx_iap.c + * @brief Contains all functions support for IAP on lpc17xx +* @version 1.0 +* @date 18. April. 2012 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ +#include "lpc17xx_iap.h" +#include "system_LPC17xx.h" + +// IAP Command +typedef void (*IAP)(uint32_t *cmd,uint32_t *result); +IAP iap_entry = (IAP) IAP_LOCATION; +#define IAP_Call iap_entry + +/** @addtogroup IAP_Public_Functions IAP Public Function + * @ingroup IAP + * @{ + */ + + +/*********************************************************************//** + * @brief Get Sector Number + * + * @param[in] adr Sector Address + * + * @return Sector Number. + * + **********************************************************************/ + uint32_t GetSecNum (uint32_t adr) +{ + uint32_t n; + + n = adr >> 12; // 4kB Sector + if (n >= 0x10) { + n = 0x0E + (n >> 3); // 32kB Sector + } + + return (n); // Sector Number +} + +/*********************************************************************//** + * @brief Prepare sector(s) for write operation + * + * @param[in] start_sec The number of start sector + * @param[in] end_sec The number of end sector + * + * @return CMD_SUCCESS/BUSY/INVALID_SECTOR. + * + **********************************************************************/ +IAP_STATUS_CODE PrepareSector(uint32_t start_sec, uint32_t end_sec) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_PREPARE; // Prepare Sector for Write + command.param[0] = start_sec; // Start Sector + command.param[1] = end_sec; // End Sector + IAP_Call (&command.cmd, &command.status); // Call IAP Command + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Copy RAM to Flash + * + * @param[in] dest destination buffer (in Flash memory). + * @param[in] source source buffer (in RAM). + * @param[in] size the write size. + * + * @return CMD_SUCCESS. + * SRC_ADDR_ERROR/DST_ADDR_ERROR + * SRC_ADDR_NOT_MAPPED/DST_ADDR_NOT_MAPPED + * COUNT_ERROR/SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION + * BUSY + * + **********************************************************************/ +IAP_STATUS_CODE CopyRAM2Flash(uint8_t * dest, uint8_t* source, IAP_WRITE_SIZE size) +{ + uint32_t sec; + IAP_STATUS_CODE status; + IAP_COMMAND_Type command; + + // Prepare sectors + sec = GetSecNum((uint32_t)dest); + status = PrepareSector(sec, sec); + if(status != CMD_SUCCESS) + return status; + + // write + command.cmd = IAP_COPY_RAM2FLASH; // Copy RAM to Flash + command.param[0] = (uint32_t)dest; // Destination Flash Address + command.param[1] = (uint32_t)source; // Source RAM Address + command.param[2] = size; // Number of bytes + command.param[3] = SystemCoreClock / 1000; // CCLK in kHz + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + return (IAP_STATUS_CODE)command.status; // Finished without Errors +} + +/*********************************************************************//** + * @brief Erase sector(s) + * + * @param[in] start_sec The number of start sector + * @param[in] end_sec The number of end sector + * + * @return CMD_SUCCESS. + * INVALID_SECTOR + * SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION + * BUSY + * + **********************************************************************/ +IAP_STATUS_CODE EraseSector(uint32_t start_sec, uint32_t end_sec) +{ + IAP_COMMAND_Type command; + IAP_STATUS_CODE status; + + // Prepare sectors + status = PrepareSector(start_sec, end_sec); + if(status != CMD_SUCCESS) + return status; + + // Erase sectors + command.cmd = IAP_ERASE; // Prepare Sector for Write + command.param[0] = start_sec; // Start Sector + command.param[1] = end_sec; // End Sector + command.param[2] = SystemCoreClock / 1000; // CCLK in kHz + IAP_Call (&command.cmd, &command.status); // Call IAP Command + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Blank check sector(s) + * + * @param[in] start_sec The number of start sector + * @param[in] end_sec The number of end sector + * @param[out] first_nblank_loc The offset of the first non-blank word + * @param[out] first_nblank_val The value of the first non-blank word + * + * @return CMD_SUCCESS. + * INVALID_SECTOR + * SECTOR_NOT_BLANK + * BUSY + * + **********************************************************************/ +IAP_STATUS_CODE BlankCheckSector(uint32_t start_sec, uint32_t end_sec, + uint32_t *first_nblank_loc, + uint32_t *first_nblank_val) +{ + IAP_COMMAND_Type command; + + command.cmd = IAP_BLANK_CHECK; // Prepare Sector for Write + command.param[0] = start_sec; // Start Sector + command.param[1] = end_sec; // End Sector + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + if(command.status == SECTOR_NOT_BLANK) + { + // Update out value + if(first_nblank_loc != NULL) + *first_nblank_loc = command.result[0]; + if(first_nblank_val != NULL) + *first_nblank_val = command.result[1]; + } + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Read part identification number + * + * @param[out] partID Part ID + * + * @return CMD_SUCCESS + * + **********************************************************************/ +IAP_STATUS_CODE ReadPartID(uint32_t *partID) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_READ_PART_ID; + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + if(command.status == CMD_SUCCESS) + { + if(partID != NULL) + *partID = command.result[0]; + } + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Read boot code version. The version is interpreted as .. + * + * @param[out] major The major + * @param[out] minor The minor + * + * @return CMD_SUCCESS + * + **********************************************************************/ +IAP_STATUS_CODE ReadBootCodeVer(uint8_t *major, uint8_t* minor) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_READ_BOOT_VER; + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + if(command.status == CMD_SUCCESS) + { + if(major != NULL) + *major = (command.result[0] >> 8) & 0xFF; + if(minor != NULL) + *minor = (command.result[0]) & 0xFF; + } + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Read Device serial number. + * + * @param[out] uid Serial number. + * + * @return CMD_SUCCESS + * + **********************************************************************/ +IAP_STATUS_CODE ReadDeviceSerialNum(uint32_t *uid) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_READ_SERIAL_NUMBER; + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + if(command.status == CMD_SUCCESS) + { + if(uid != NULL) + { + uint32_t i = 0; + for(i = 0; i < 4; i++) + uid[i] = command.result[i]; + } + } + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief compare the memory contents at two locations. + * + * @param[in] addr1 The address of the 1st buffer (in RAM/Flash). + * @param[in] addr2 The address of the 2nd buffer (in RAM/Flash). + * @param[in] size Number of bytes to be compared; should be a multiple of 4. + * + * @return CMD_SUCCESS + * COMPARE_ERROR + * COUNT_ERROR (Byte count is not a multiple of 4) + * ADDR_ERROR + * ADDR_NOT_MAPPED + * + **********************************************************************/ +IAP_STATUS_CODE Compare(uint8_t *addr1, uint8_t *addr2, uint32_t size) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_COMPARE; + command.param[0] = (uint32_t)addr1; + command.param[1] = (uint32_t)addr2; + command.param[2] = size; + IAP_Call (&command.cmd, &command.status); // Call IAP Command + + return (IAP_STATUS_CODE)command.status; +} + +/*********************************************************************//** + * @brief Re-invoke ISP. + * + * @param[in] None. + * + * @return None. + * + **********************************************************************/ +void InvokeISP(void) +{ + IAP_COMMAND_Type command; + command.cmd = IAP_REINVOKE_ISP; + IAP_Call (&command.cmd, &command.status); // Call IAP Command +} + +/** + * @} + */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_libcfg_default.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_libcfg_default.c new file mode 100644 index 0000000000..4f883e3077 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_libcfg_default.c @@ -0,0 +1,76 @@ +/********************************************************************** +* $Id$ lpc17xx_libcfg_default.c 2010-05-21 +*//** +* @file lpc17xx_libcfg_default.c +* @brief Library configuration source file (default), used to build +* library without examples +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Library group ----------------------------------------------------------- */ +/** @addtogroup LIBCFG_DEFAULT + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_libcfg_default.h" + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup LIBCFG_DEFAULT_Public_Functions + * @{ + */ + +#ifndef __BUILD_WITH_EXAMPLE__ + +#ifdef DEBUG +/******************************************************************************* +* @brief Reports the name of the source file and the source line number +* where the CHECK_PARAM error has occurred. +* @param[in] file Pointer to the source file name +* @param[in] line assert_param error line source number +* @return None +*******************************************************************************/ +void check_failed(uint8_t *file, uint32_t line) +{ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + + /* Infinite loop */ + while(1); +} +#endif /* DEBUG */ + +#endif /* __BUILD_WITH_EXAMPLE__ */ + +/** + * @} + */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_mcpwm.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_mcpwm.c new file mode 100644 index 0000000000..cd9318b4fe --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_mcpwm.c @@ -0,0 +1,509 @@ +/********************************************************************** +* $Id$ lpc17xx_mcpwm.c 2010-05-21 +*//** +* @file lpc17xx_mcpwm.c +* @brief Contains all functions support for Motor Control PWM firmware +* library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup MCPWM + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_mcpwm.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _MCPWM + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup MCPWM_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Initializes the MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected, + * Should be: LPC_MCPWM + * @return None + **********************************************************************/ +void MCPWM_Init(LPC_MCPWM_TypeDef *MCPWMx) +{ + + /* Turn On MCPWM PCLK */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCMC, ENABLE); + /* As default, peripheral clock for MCPWM module + * is set to FCCLK / 2 */ + // CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_MC, CLKPWR_PCLKSEL_CCLK_DIV_2); + + MCPWMx->MCCAP_CLR = MCPWM_CAPCLR_CAP(0) | MCPWM_CAPCLR_CAP(1) | MCPWM_CAPCLR_CAP(2); + MCPWMx->MCINTFLAG_CLR = MCPWM_INT_ILIM(0) | MCPWM_INT_ILIM(1) | MCPWM_INT_ILIM(2) \ + | MCPWM_INT_IMAT(0) | MCPWM_INT_IMAT(1) | MCPWM_INT_IMAT(2) \ + | MCPWM_INT_ICAP(0) | MCPWM_INT_ICAP(1) | MCPWM_INT_ICAP(2); + MCPWMx->MCINTEN_CLR = MCPWM_INT_ILIM(0) | MCPWM_INT_ILIM(1) | MCPWM_INT_ILIM(2) \ + | MCPWM_INT_IMAT(0) | MCPWM_INT_IMAT(1) | MCPWM_INT_IMAT(2) \ + | MCPWM_INT_ICAP(0) | MCPWM_INT_ICAP(1) | MCPWM_INT_ICAP(2); +} + + +/*********************************************************************//** + * @brief Configures each channel in MCPWM peripheral according to the + * specified parameters in the MCPWM_CHANNEL_CFG_Type. + * @param[in] MCPWMx Motor Control PWM peripheral selected + * should be: LPC_MCPWM + * @param[in] channelNum Channel number, should be: 0..2. + * @param[in] channelSetup Pointer to a MCPWM_CHANNEL_CFG_Type structure +* that contains the configuration information for the +* specified MCPWM channel. + * @return None + **********************************************************************/ +void MCPWM_ConfigChannel(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channelNum, + MCPWM_CHANNEL_CFG_Type * channelSetup) +{ + if (channelNum <= 2) { + if (channelNum == 0) { + MCPWMx->MCTIM0 = channelSetup->channelTimercounterValue; + MCPWMx->MCPER0 = channelSetup->channelPeriodValue; + MCPWMx->MCPW0 = channelSetup->channelPulsewidthValue; + } else if (channelNum == 1) { + MCPWMx->MCTIM1 = channelSetup->channelTimercounterValue; + MCPWMx->MCPER1 = channelSetup->channelPeriodValue; + MCPWMx->MCPW1 = channelSetup->channelPulsewidthValue; + } else if (channelNum == 2) { + MCPWMx->MCTIM2 = channelSetup->channelTimercounterValue; + MCPWMx->MCPER2 = channelSetup->channelPeriodValue; + MCPWMx->MCPW2 = channelSetup->channelPulsewidthValue; + } else { + return; + } + + if (channelSetup->channelType /* == MCPWM_CHANNEL_CENTER_MODE */){ + MCPWMx->MCCON_SET = MCPWM_CON_CENTER(channelNum); + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_CENTER(channelNum); + } + + if (channelSetup->channelPolarity /* == MCPWM_CHANNEL_PASSIVE_HI */){ + MCPWMx->MCCON_SET = MCPWM_CON_POLAR(channelNum); + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_POLAR(channelNum); + } + + if (channelSetup->channelDeadtimeEnable /* == ENABLE */){ + MCPWMx->MCCON_SET = MCPWM_CON_DTE(channelNum); + MCPWMx->MCDEADTIME &= ~(MCPWM_DT(channelNum, 0x3FF)); + MCPWMx->MCDEADTIME |= MCPWM_DT(channelNum, channelSetup->channelDeadtimeValue); + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_DTE(channelNum); + } + + if (channelSetup->channelUpdateEnable /* == ENABLE */){ + MCPWMx->MCCON_CLR = MCPWM_CON_DISUP(channelNum); + } else { + MCPWMx->MCCON_SET = MCPWM_CON_DISUP(channelNum); + } + } +} + + +/*********************************************************************//** + * @brief Write to MCPWM shadow registers - Update the value for period + * and pulse width in MCPWM peripheral. + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channelNum Channel Number, should be: 0..2. + * @param[in] channelSetup Pointer to a MCPWM_CHANNEL_CFG_Type structure +* that contains the configuration information for the +* specified MCPWM channel. + * @return None + **********************************************************************/ +void MCPWM_WriteToShadow(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channelNum, + MCPWM_CHANNEL_CFG_Type *channelSetup) +{ + if (channelNum == 0){ + MCPWMx->MCPER0 = channelSetup->channelPeriodValue; + MCPWMx->MCPW0 = channelSetup->channelPulsewidthValue; + } else if (channelNum == 1) { + MCPWMx->MCPER1 = channelSetup->channelPeriodValue; + MCPWMx->MCPW1 = channelSetup->channelPulsewidthValue; + } else if (channelNum == 2) { + MCPWMx->MCPER2 = channelSetup->channelPeriodValue; + MCPWMx->MCPW2 = channelSetup->channelPulsewidthValue; + } +} + + + +/*********************************************************************//** + * @brief Configures capture function in MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channelNum MCI (Motor Control Input pin) number + * Should be: 0..2 + * @param[in] captureConfig Pointer to a MCPWM_CAPTURE_CFG_Type structure +* that contains the configuration information for the +* specified MCPWM capture. + * @return + **********************************************************************/ +void MCPWM_ConfigCapture(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channelNum, + MCPWM_CAPTURE_CFG_Type *captureConfig) +{ + if (channelNum <= 2) { + + if (captureConfig->captureFalling /* == ENABLE */) { + MCPWMx->MCCAPCON_SET = MCPWM_CAPCON_CAPMCI_FE(captureConfig->captureChannel, channelNum); + } else { + MCPWMx->MCCAPCON_CLR = MCPWM_CAPCON_CAPMCI_FE(captureConfig->captureChannel, channelNum); + } + + if (captureConfig->captureRising /* == ENABLE */) { + MCPWMx->MCCAPCON_SET = MCPWM_CAPCON_CAPMCI_RE(captureConfig->captureChannel, channelNum); + } else { + MCPWMx->MCCAPCON_CLR = MCPWM_CAPCON_CAPMCI_RE(captureConfig->captureChannel, channelNum); + } + + if (captureConfig->timerReset /* == ENABLE */){ + MCPWMx->MCCAPCON_SET = MCPWM_CAPCON_RT(captureConfig->captureChannel); + } else { + MCPWMx->MCCAPCON_CLR = MCPWM_CAPCON_RT(captureConfig->captureChannel); + } + + if (captureConfig->hnfEnable /* == ENABLE */){ + MCPWMx->MCCAPCON_SET = MCPWM_CAPCON_HNFCAP(channelNum); + } else { + MCPWMx->MCCAPCON_CLR = MCPWM_CAPCON_HNFCAP(channelNum); + } + } +} + + +/*********************************************************************//** + * @brief Clears current captured value in specified capture channel + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] captureChannel Capture channel number, should be: 0..2 + * @return None + **********************************************************************/ +void MCPWM_ClearCapture(LPC_MCPWM_TypeDef *MCPWMx, uint32_t captureChannel) +{ + MCPWMx->MCCAP_CLR = MCPWM_CAPCLR_CAP(captureChannel); +} + +/*********************************************************************//** + * @brief Get current captured value in specified capture channel + * @param[in] MCPWMx Motor Control PWM peripheral selected, + * Should be: LPC_MCPWM + * @param[in] captureChannel Capture channel number, should be: 0..2 + * @return None + **********************************************************************/ +uint32_t MCPWM_GetCapture(LPC_MCPWM_TypeDef *MCPWMx, uint32_t captureChannel) +{ + if (captureChannel == 0){ + return (MCPWMx->MCCR0); + } else if (captureChannel == 1) { + return (MCPWMx->MCCR1); + } else if (captureChannel == 2) { + return (MCPWMx->MCCR2); + } + return (0); +} + + +/*********************************************************************//** + * @brief Configures Count control in MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channelNum Channel number, should be: 0..2 + * @param[in] countMode Count mode, should be: + * - ENABLE: Enables count mode. + * - DISABLE: Disable count mode, the channel is in timer mode. + * @param[in] countConfig Pointer to a MCPWM_COUNT_CFG_Type structure +* that contains the configuration information for the +* specified MCPWM count control. + * @return None + **********************************************************************/ +void MCPWM_CountConfig(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channelNum, + uint32_t countMode, MCPWM_COUNT_CFG_Type *countConfig) +{ + if (channelNum <= 2) { + if (countMode /* == ENABLE */){ + MCPWMx->MCCNTCON_SET = MCPWM_CNTCON_CNTR(channelNum); + if (countConfig->countFalling /* == ENABLE */) { + MCPWMx->MCCNTCON_SET = MCPWM_CNTCON_TCMCI_FE(countConfig->counterChannel,channelNum); + } else { + MCPWMx->MCCNTCON_CLR = MCPWM_CNTCON_TCMCI_FE(countConfig->counterChannel,channelNum); + } + if (countConfig->countRising /* == ENABLE */) { + MCPWMx->MCCNTCON_SET = MCPWM_CNTCON_TCMCI_RE(countConfig->counterChannel,channelNum); + } else { + MCPWMx->MCCNTCON_CLR = MCPWM_CNTCON_TCMCI_RE(countConfig->counterChannel,channelNum); + } + } else { + MCPWMx->MCCNTCON_CLR = MCPWM_CNTCON_CNTR(channelNum); + } + } +} + + +/*********************************************************************//** + * @brief Start MCPWM activity for each MCPWM channel + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channel0 State of this command on channel 0: + * - ENABLE: 'Start' command will effect on channel 0 + * - DISABLE: 'Start' command will not effect on channel 0 + * @param[in] channel1 State of this command on channel 1: + * - ENABLE: 'Start' command will effect on channel 1 + * - DISABLE: 'Start' command will not effect on channel 1 + * @param[in] channel2 State of this command on channel 2: + * - ENABLE: 'Start' command will effect on channel 2 + * - DISABLE: 'Start' command will not effect on channel 2 + * @return None + **********************************************************************/ +void MCPWM_Start(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channel0, + uint32_t channel1, uint32_t channel2) +{ + uint32_t regVal = 0; + regVal = (channel0 ? MCPWM_CON_RUN(0) : 0) | (channel1 ? MCPWM_CON_RUN(1) : 0) \ + | (channel2 ? MCPWM_CON_RUN(2) : 0); + MCPWMx->MCCON_SET = regVal; +} + + +/*********************************************************************//** + * @brief Stop MCPWM activity for each MCPWM channel + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] channel0 State of this command on channel 0: + * - ENABLE: 'Stop' command will effect on channel 0 + * - DISABLE: 'Stop' command will not effect on channel 0 + * @param[in] channel1 State of this command on channel 1: + * - ENABLE: 'Stop' command will effect on channel 1 + * - DISABLE: 'Stop' command will not effect on channel 1 + * @param[in] channel2 State of this command on channel 2: + * - ENABLE: 'Stop' command will effect on channel 2 + * - DISABLE: 'Stop' command will not effect on channel 2 + * @return None + **********************************************************************/ +void MCPWM_Stop(LPC_MCPWM_TypeDef *MCPWMx, uint32_t channel0, + uint32_t channel1, uint32_t channel2) +{ + uint32_t regVal = 0; + regVal = (channel0 ? MCPWM_CON_RUN(0) : 0) | (channel1 ? MCPWM_CON_RUN(1) : 0) \ + | (channel2 ? MCPWM_CON_RUN(2) : 0); + MCPWMx->MCCON_CLR = regVal; +} + + +/*********************************************************************//** + * @brief Enables/Disables 3-phase AC motor mode on MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] acMode State of this command, should be: + * - ENABLE. + * - DISABLE. + * @return None + **********************************************************************/ +void MCPWM_ACMode(LPC_MCPWM_TypeDef *MCPWMx, uint32_t acMode) +{ + if (acMode){ + MCPWMx->MCCON_SET = MCPWM_CON_ACMODE; + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_ACMODE; + } +} + + +/*********************************************************************//** + * @brief Enables/Disables 3-phase DC motor mode on MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] dcMode State of this command, should be: + * - ENABLE. + * - DISABLE. + * @param[in] outputInvered Polarity of the MCOB outputs for all 3 channels, + * should be: + * - ENABLE: The MCOB outputs have opposite polarity + * from the MCOA outputs. + * - DISABLE: The MCOB outputs have the same basic + * polarity as the MCOA outputs. + * @param[in] outputPattern A value contains bits that enables/disables the specified + * output pins route to the internal MCOA0 signal, should be: + - MCPWM_PATENT_A0: MCOA0 tracks internal MCOA0 + - MCPWM_PATENT_B0: MCOB0 tracks internal MCOA0 + - MCPWM_PATENT_A1: MCOA1 tracks internal MCOA0 + - MCPWM_PATENT_B1: MCOB1 tracks internal MCOA0 + - MCPWM_PATENT_A2: MCOA2 tracks internal MCOA0 + - MCPWM_PATENT_B2: MCOB2 tracks internal MCOA0 + * @return None + * + * Note: all these outputPatent values above can be ORed together for using as input parameter. + **********************************************************************/ +void MCPWM_DCMode(LPC_MCPWM_TypeDef *MCPWMx, uint32_t dcMode, + uint32_t outputInvered, uint32_t outputPattern) +{ + if (dcMode){ + MCPWMx->MCCON_SET = MCPWM_CON_DCMODE; + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_DCMODE; + } + + if (outputInvered) { + MCPWMx->MCCON_SET = MCPWM_CON_INVBDC; + } else { + MCPWMx->MCCON_CLR = MCPWM_CON_INVBDC; + } + + MCPWMx->MCCCP = outputPattern; +} + + +/*********************************************************************//** + * @brief Configures the specified interrupt in MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be: LPC_MCPWM + * @param[in] ulIntType Interrupt type, should be: + * - MCPWM_INTFLAG_LIM0: Limit interrupt for channel (0) + * - MCPWM_INTFLAG_MAT0: Match interrupt for channel (0) + * - MCPWM_INTFLAG_CAP0: Capture interrupt for channel (0) + * - MCPWM_INTFLAG_LIM1: Limit interrupt for channel (1) + * - MCPWM_INTFLAG_MAT1: Match interrupt for channel (1) + * - MCPWM_INTFLAG_CAP1: Capture interrupt for channel (1) + * - MCPWM_INTFLAG_LIM2: Limit interrupt for channel (2) + * - MCPWM_INTFLAG_MAT2: Match interrupt for channel (2) + * - MCPWM_INTFLAG_CAP2: Capture interrupt for channel (2) + * - MCPWM_INTFLAG_ABORT: Fast abort interrupt + * @param[in] NewState New State of this command, should be: + * - ENABLE. + * - DISABLE. + * @return None + * + * Note: all these ulIntType values above can be ORed together for using as input parameter. + **********************************************************************/ +void MCPWM_IntConfig(LPC_MCPWM_TypeDef *MCPWMx, uint32_t ulIntType, FunctionalState NewState) +{ + if (NewState) { + MCPWMx->MCINTEN_SET = ulIntType; + } else { + MCPWMx->MCINTEN_CLR = ulIntType; + } +} + + +/*********************************************************************//** + * @brief Sets/Forces the specified interrupt for MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected + * Should be LPC_MCPWM + * @param[in] ulIntType Interrupt type, should be: + * - MCPWM_INTFLAG_LIM0: Limit interrupt for channel (0) + * - MCPWM_INTFLAG_MAT0: Match interrupt for channel (0) + * - MCPWM_INTFLAG_CAP0: Capture interrupt for channel (0) + * - MCPWM_INTFLAG_LIM1: Limit interrupt for channel (1) + * - MCPWM_INTFLAG_MAT1: Match interrupt for channel (1) + * - MCPWM_INTFLAG_CAP1: Capture interrupt for channel (1) + * - MCPWM_INTFLAG_LIM2: Limit interrupt for channel (2) + * - MCPWM_INTFLAG_MAT2: Match interrupt for channel (2) + * - MCPWM_INTFLAG_CAP2: Capture interrupt for channel (2) + * - MCPWM_INTFLAG_ABORT: Fast abort interrupt + * @return None + * Note: all these ulIntType values above can be ORed together for using as input parameter. + **********************************************************************/ +void MCPWM_IntSet(LPC_MCPWM_TypeDef *MCPWMx, uint32_t ulIntType) +{ + MCPWMx->MCINTFLAG_SET = ulIntType; +} + + +/*********************************************************************//** + * @brief Clear the specified interrupt pending for MCPWM peripheral + * @param[in] MCPWMx Motor Control PWM peripheral selected, + * should be: LPC_MCPWM + * @param[in] ulIntType Interrupt type, should be: + * - MCPWM_INTFLAG_LIM0: Limit interrupt for channel (0) + * - MCPWM_INTFLAG_MAT0: Match interrupt for channel (0) + * - MCPWM_INTFLAG_CAP0: Capture interrupt for channel (0) + * - MCPWM_INTFLAG_LIM1: Limit interrupt for channel (1) + * - MCPWM_INTFLAG_MAT1: Match interrupt for channel (1) + * - MCPWM_INTFLAG_CAP1: Capture interrupt for channel (1) + * - MCPWM_INTFLAG_LIM2: Limit interrupt for channel (2) + * - MCPWM_INTFLAG_MAT2: Match interrupt for channel (2) + * - MCPWM_INTFLAG_CAP2: Capture interrupt for channel (2) + * - MCPWM_INTFLAG_ABORT: Fast abort interrupt + * @return None + * Note: all these ulIntType values above can be ORed together for using as input parameter. + **********************************************************************/ +void MCPWM_IntClear(LPC_MCPWM_TypeDef *MCPWMx, uint32_t ulIntType) +{ + MCPWMx->MCINTFLAG_CLR = ulIntType; +} + + +/*********************************************************************//** + * @brief Check whether if the specified interrupt in MCPWM is set or not + * @param[in] MCPWMx Motor Control PWM peripheral selected, + * should be: LPC_MCPWM + * @param[in] ulIntType Interrupt type, should be: + * - MCPWM_INTFLAG_LIM0: Limit interrupt for channel (0) + * - MCPWM_INTFLAG_MAT0: Match interrupt for channel (0) + * - MCPWM_INTFLAG_CAP0: Capture interrupt for channel (0) + * - MCPWM_INTFLAG_LIM1: Limit interrupt for channel (1) + * - MCPWM_INTFLAG_MAT1: Match interrupt for channel (1) + * - MCPWM_INTFLAG_CAP1: Capture interrupt for channel (1) + * - MCPWM_INTFLAG_LIM2: Limit interrupt for channel (2) + * - MCPWM_INTFLAG_MAT2: Match interrupt for channel (2) + * - MCPWM_INTFLAG_CAP2: Capture interrupt for channel (2) + * - MCPWM_INTFLAG_ABORT: Fast abort interrupt + * @return None + **********************************************************************/ +FlagStatus MCPWM_GetIntStatus(LPC_MCPWM_TypeDef *MCPWMx, uint32_t ulIntType) +{ + return ((MCPWMx->MCINTFLAG & ulIntType) ? SET : RESET); +} + +/** + * @} + */ + +#endif /* _MCPWM */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_nvic.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_nvic.c new file mode 100644 index 0000000000..3e01e47902 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_nvic.c @@ -0,0 +1,148 @@ +/********************************************************************** +* $Id$ lpc17xx_nvic.c 2010-05-21 +*//** +* @file lpc17xx_nvic.c +* @brief Contains all expansion functions support for +* NVIC firmware library on LPC17xx. The main +* NVIC functions are defined in core_cm3.h +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup NVIC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_nvic.h" + + +/* Private Macros ------------------------------------------------------------- */ +/** @addtogroup NVIC_Private_Macros + * @{ + */ + +/* Vector table offset bit mask */ +#define NVIC_VTOR_MASK 0x3FFFFF80 + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup NVIC_Public_Functions + * @{ + */ + + +/*****************************************************************************//** + * @brief De-initializes the NVIC peripheral registers to their default + * reset values. + * @param None + * @return None + * + * These following NVIC peripheral registers will be de-initialized: + * - Disable Interrupt (32 IRQ interrupt sources that matched with LPC17xx) + * - Clear all Pending Interrupts (32 IRQ interrupt source that matched with LPC17xx) + * - Clear all Interrupt Priorities (32 IRQ interrupt source that matched with LPC17xx) + *******************************************************************************/ +void NVIC_DeInit(void) +{ + uint8_t tmp; + + /* Disable all interrupts */ + NVIC->ICER[0] = 0xFFFFFFFF; + NVIC->ICER[1] = 0x00000001; + /* Clear all pending interrupts */ + NVIC->ICPR[0] = 0xFFFFFFFF; + NVIC->ICPR[1] = 0x00000001; + + /* Clear all interrupt priority */ + for (tmp = 0; tmp < 32; tmp++) { + NVIC->IP[tmp] = 0x00; + } +} + +/*****************************************************************************//** + * @brief De-initializes the SCB peripheral registers to their default + * reset values. + * @param none + * @return none + * + * These following SCB NVIC peripheral registers will be de-initialized: + * - Interrupt Control State register + * - Interrupt Vector Table Offset register + * - Application Interrupt/Reset Control register + * - System Control register + * - Configuration Control register + * - System Handlers Priority Registers + * - System Handler Control and State Register + * - Configurable Fault Status Register + * - Hard Fault Status Register + * - Debug Fault Status Register + *******************************************************************************/ +void NVIC_SCBDeInit(void) +{ + uint8_t tmp; + + SCB->ICSR = 0x0A000000; + SCB->VTOR = 0x00000000; + SCB->AIRCR = 0x05FA0000; + SCB->SCR = 0x00000000; + SCB->CCR = 0x00000000; + + for (tmp = 0; tmp < (sizeof(SCB->SHP) / sizeof(SCB->SHP[0])); tmp++) { + SCB->SHP[tmp] = 0x00; + } + + SCB->SHCSR = 0x00000000; + SCB->CFSR = 0xFFFFFFFF; + SCB->HFSR = 0xFFFFFFFF; + SCB->DFSR = 0xFFFFFFFF; +} + + +/*****************************************************************************//** + * @brief Set Vector Table Offset value + * @param offset Offset value + * @return None + *******************************************************************************/ +void NVIC_SetVTOR(uint32_t offset) +{ +// SCB->VTOR = (offset & NVIC_VTOR_MASK); + SCB->VTOR = offset; +} + +/** + * @} + */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_pinsel.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_pinsel.c new file mode 100644 index 0000000000..740c1eae99 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_pinsel.c @@ -0,0 +1,318 @@ +/********************************************************************** +* $Id$ lpc17xx_pinsel.c 2010-05-21 +*//** +* @file lpc17xx_pinsel.c +* @brief Contains all functions support for Pin connect block firmware +* library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup PINSEL + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_pinsel.h" + +/* Public Functions ----------------------------------------------------------- */ + +static void set_PinFunc ( uint8_t portnum, uint8_t pinnum, uint8_t funcnum); +static void set_ResistorMode ( uint8_t portnum, uint8_t pinnum, uint8_t modenum); +static void set_OpenDrainMode( uint8_t portnum, uint8_t pinnum, uint8_t modenum); + +/*********************************************************************//** + * @brief Setup the pin selection function + * @param[in] portnum PORT number, + * should be one of the following: + * - PINSEL_PORT_0 : Port 0 + * - PINSEL_PORT_1 : Port 1 + * - PINSEL_PORT_2 : Port 2 + * - PINSEL_PORT_3 : Port 3 + * + * @param[in] pinnum Pin number, + * should be one of the following: + - PINSEL_PIN_0 : Pin 0 + - PINSEL_PIN_1 : Pin 1 + - PINSEL_PIN_2 : Pin 2 + - PINSEL_PIN_3 : Pin 3 + - PINSEL_PIN_4 : Pin 4 + - PINSEL_PIN_5 : Pin 5 + - PINSEL_PIN_6 : Pin 6 + - PINSEL_PIN_7 : Pin 7 + - PINSEL_PIN_8 : Pin 8 + - PINSEL_PIN_9 : Pin 9 + - PINSEL_PIN_10 : Pin 10 + - PINSEL_PIN_11 : Pin 11 + - PINSEL_PIN_12 : Pin 12 + - PINSEL_PIN_13 : Pin 13 + - PINSEL_PIN_14 : Pin 14 + - PINSEL_PIN_15 : Pin 15 + - PINSEL_PIN_16 : Pin 16 + - PINSEL_PIN_17 : Pin 17 + - PINSEL_PIN_18 : Pin 18 + - PINSEL_PIN_19 : Pin 19 + - PINSEL_PIN_20 : Pin 20 + - PINSEL_PIN_21 : Pin 21 + - PINSEL_PIN_22 : Pin 22 + - PINSEL_PIN_23 : Pin 23 + - PINSEL_PIN_24 : Pin 24 + - PINSEL_PIN_25 : Pin 25 + - PINSEL_PIN_26 : Pin 26 + - PINSEL_PIN_27 : Pin 27 + - PINSEL_PIN_28 : Pin 28 + - PINSEL_PIN_29 : Pin 29 + - PINSEL_PIN_30 : Pin 30 + - PINSEL_PIN_31 : Pin 31 + + * @param[in] funcnum Function number, + * should be one of the following: + * - PINSEL_FUNC_0 : default function + * - PINSEL_FUNC_1 : first alternate function + * - PINSEL_FUNC_2 : second alternate function + * - PINSEL_FUNC_3 : third alternate function + * + * @return None + **********************************************************************/ +static void set_PinFunc ( uint8_t portnum, uint8_t pinnum, uint8_t funcnum) +{ + uint32_t pinnum_t = pinnum; + uint32_t pinselreg_idx = 2 * portnum; + uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINSEL0; + + if (pinnum_t >= 16) { + pinnum_t -= 16; + pinselreg_idx++; + } + *(uint32_t *)(pPinCon + pinselreg_idx) &= ~(0x03UL << (pinnum_t * 2)); + *(uint32_t *)(pPinCon + pinselreg_idx) |= ((uint32_t)funcnum) << (pinnum_t * 2); +} + +/*********************************************************************//** + * @brief Setup resistor mode for each pin + * @param[in] portnum PORT number, + * should be one of the following: + * - PINSEL_PORT_0 : Port 0 + * - PINSEL_PORT_1 : Port 1 + * - PINSEL_PORT_2 : Port 2 + * - PINSEL_PORT_3 : Port 3 + * @param[in] pinnum Pin number, + * should be one of the following: + - PINSEL_PIN_0 : Pin 0 + - PINSEL_PIN_1 : Pin 1 + - PINSEL_PIN_2 : Pin 2 + - PINSEL_PIN_3 : Pin 3 + - PINSEL_PIN_4 : Pin 4 + - PINSEL_PIN_5 : Pin 5 + - PINSEL_PIN_6 : Pin 6 + - PINSEL_PIN_7 : Pin 7 + - PINSEL_PIN_8 : Pin 8 + - PINSEL_PIN_9 : Pin 9 + - PINSEL_PIN_10 : Pin 10 + - PINSEL_PIN_11 : Pin 11 + - PINSEL_PIN_12 : Pin 12 + - PINSEL_PIN_13 : Pin 13 + - PINSEL_PIN_14 : Pin 14 + - PINSEL_PIN_15 : Pin 15 + - PINSEL_PIN_16 : Pin 16 + - PINSEL_PIN_17 : Pin 17 + - PINSEL_PIN_18 : Pin 18 + - PINSEL_PIN_19 : Pin 19 + - PINSEL_PIN_20 : Pin 20 + - PINSEL_PIN_21 : Pin 21 + - PINSEL_PIN_22 : Pin 22 + - PINSEL_PIN_23 : Pin 23 + - PINSEL_PIN_24 : Pin 24 + - PINSEL_PIN_25 : Pin 25 + - PINSEL_PIN_26 : Pin 26 + - PINSEL_PIN_27 : Pin 27 + - PINSEL_PIN_28 : Pin 28 + - PINSEL_PIN_29 : Pin 29 + - PINSEL_PIN_30 : Pin 30 + - PINSEL_PIN_31 : Pin 31 + + * @param[in] modenum: Mode number, + * should be one of the following: + - PINSEL_PINMODE_PULLUP : Internal pull-up resistor + - PINSEL_PINMODE_TRISTATE : Tri-state + - PINSEL_PINMODE_PULLDOWN : Internal pull-down resistor + + * @return None + **********************************************************************/ +void set_ResistorMode ( uint8_t portnum, uint8_t pinnum, uint8_t modenum) +{ + uint32_t pinnum_t = pinnum; + uint32_t pinmodereg_idx = 2 * portnum; + uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINMODE0; + + if (pinnum_t >= 16) { + pinnum_t -= 16; + pinmodereg_idx++ ; + } + + *(uint32_t *)(pPinCon + pinmodereg_idx) &= ~(0x03UL << (pinnum_t * 2)); + *(uint32_t *)(pPinCon + pinmodereg_idx) |= ((uint32_t)modenum) << (pinnum_t * 2); +} + +/*********************************************************************//** + * @brief Setup Open drain mode for each pin + * @param[in] portnum PORT number, + * should be one of the following: + * - PINSEL_PORT_0 : Port 0 + * - PINSEL_PORT_1 : Port 1 + * - PINSEL_PORT_2 : Port 2 + * - PINSEL_PORT_3 : Port 3 + * + * @param[in] pinnum Pin number, + * should be one of the following: + - PINSEL_PIN_0 : Pin 0 + - PINSEL_PIN_1 : Pin 1 + - PINSEL_PIN_2 : Pin 2 + - PINSEL_PIN_3 : Pin 3 + - PINSEL_PIN_4 : Pin 4 + - PINSEL_PIN_5 : Pin 5 + - PINSEL_PIN_6 : Pin 6 + - PINSEL_PIN_7 : Pin 7 + - PINSEL_PIN_8 : Pin 8 + - PINSEL_PIN_9 : Pin 9 + - PINSEL_PIN_10 : Pin 10 + - PINSEL_PIN_11 : Pin 11 + - PINSEL_PIN_12 : Pin 12 + - PINSEL_PIN_13 : Pin 13 + - PINSEL_PIN_14 : Pin 14 + - PINSEL_PIN_15 : Pin 15 + - PINSEL_PIN_16 : Pin 16 + - PINSEL_PIN_17 : Pin 17 + - PINSEL_PIN_18 : Pin 18 + - PINSEL_PIN_19 : Pin 19 + - PINSEL_PIN_20 : Pin 20 + - PINSEL_PIN_21 : Pin 21 + - PINSEL_PIN_22 : Pin 22 + - PINSEL_PIN_23 : Pin 23 + - PINSEL_PIN_24 : Pin 24 + - PINSEL_PIN_25 : Pin 25 + - PINSEL_PIN_26 : Pin 26 + - PINSEL_PIN_27 : Pin 27 + - PINSEL_PIN_28 : Pin 28 + - PINSEL_PIN_29 : Pin 29 + - PINSEL_PIN_30 : Pin 30 + - PINSEL_PIN_31 : Pin 31 + + * @param[in] modenum Open drain mode number, + * should be one of the following: + * - PINSEL_PINMODE_NORMAL : Pin is in the normal (not open drain) mode + * - PINSEL_PINMODE_OPENDRAIN : Pin is in the open drain mode + * + * @return None + **********************************************************************/ +void set_OpenDrainMode( uint8_t portnum, uint8_t pinnum, uint8_t modenum) +{ + uint32_t *pPinCon = (uint32_t *)&LPC_PINCON->PINMODE_OD0; + + if (modenum == PINSEL_PINMODE_OPENDRAIN){ + *(uint32_t *)(pPinCon + portnum) |= (0x01UL << pinnum); + } else { + *(uint32_t *)(pPinCon + portnum) &= ~(0x01UL << pinnum); + } +} + +/* End of Public Functions ---------------------------------------------------- */ + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup PINSEL_Public_Functions + * @{ + */ +/*********************************************************************//** + * @brief Configure trace function + * @param[in] NewState State of the Trace function configuration, + * should be one of the following: + * - ENABLE : Enable Trace Function + * - DISABLE : Disable Trace Function + * + * @return None + **********************************************************************/ +void PINSEL_ConfigTraceFunc(FunctionalState NewState) +{ + if (NewState == ENABLE) { + LPC_PINCON->PINSEL10 |= (0x01UL << 3); + } else if (NewState == DISABLE) { + LPC_PINCON->PINSEL10 &= ~(0x01UL << 3); + } +} + +/*********************************************************************//** + * @brief Setup I2C0 pins + * @param[in] i2cPinMode I2C pin mode, + * should be one of the following: + * - PINSEL_I2C_Normal_Mode : The standard drive mode + * - PINSEL_I2C_Fast_Mode : Fast Mode Plus drive mode + * + * @param[in] filterSlewRateEnable should be: + * - ENABLE: Enable filter and slew rate. + * - DISABLE: Disable filter and slew rate. + * + * @return None + **********************************************************************/ +void PINSEL_SetI2C0Pins(uint8_t i2cPinMode, FunctionalState filterSlewRateEnable) +{ + uint32_t regVal; + + if (i2cPinMode == PINSEL_I2C_Fast_Mode){ + regVal = PINSEL_I2CPADCFG_SCLDRV0 | PINSEL_I2CPADCFG_SDADRV0; + } + + if (filterSlewRateEnable == DISABLE){ + regVal = PINSEL_I2CPADCFG_SCLI2C0 | PINSEL_I2CPADCFG_SDAI2C0; + } + LPC_PINCON->I2CPADCFG = regVal; +} + + +/*********************************************************************//** + * @brief Configure Pin corresponding to specified parameters passed + * in the PinCfg + * @param[in] PinCfg Pointer to a PINSEL_CFG_Type structure + * that contains the configuration information for the + * specified pin. + * @return None + **********************************************************************/ +void PINSEL_ConfigPin(PINSEL_CFG_Type *PinCfg) +{ + set_PinFunc(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->Funcnum); + set_ResistorMode(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->Pinmode); + set_OpenDrainMode(PinCfg->Portnum, PinCfg->Pinnum, PinCfg->OpenDrain); +} + + +/** + * @} + */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_pwm.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_pwm.c new file mode 100644 index 0000000000..f52aa5ce85 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_pwm.c @@ -0,0 +1,588 @@ +/********************************************************************** +* $Id$ lpc17xx_pwm.c 2011-03-31 +*//** +* @file lpc17xx_pwm.c +* @brief Contains all functions support for PWM firmware library on LPC17xx +* @version 2.1 +* @date 31. Mar. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup PWM + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_pwm.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _PWM + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup PWM_Public_Functions + * @{ + */ + + +/*********************************************************************//** + * @brief Check whether specified interrupt flag in PWM is set or not + * @param[in] PWMx: PWM peripheral, should be LPC_PWM1 + * @param[in] IntFlag: PWM interrupt flag, should be: + * - PWM_INTSTAT_MR0: Interrupt flag for PWM match channel 0 + * - PWM_INTSTAT_MR1: Interrupt flag for PWM match channel 1 + * - PWM_INTSTAT_MR2: Interrupt flag for PWM match channel 2 + * - PWM_INTSTAT_MR3: Interrupt flag for PWM match channel 3 + * - PWM_INTSTAT_MR4: Interrupt flag for PWM match channel 4 + * - PWM_INTSTAT_MR5: Interrupt flag for PWM match channel 5 + * - PWM_INTSTAT_MR6: Interrupt flag for PWM match channel 6 + * - PWM_INTSTAT_CAP0: Interrupt flag for capture input 0 + * - PWM_INTSTAT_CAP1: Interrupt flag for capture input 1 + * @return New State of PWM interrupt flag (SET or RESET) + **********************************************************************/ +IntStatus PWM_GetIntStatus(LPC_PWM_TypeDef *PWMx, uint32_t IntFlag) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM_INTSTAT(IntFlag)); + + return ((PWMx->IR & IntFlag) ? SET : RESET); +} + + + +/*********************************************************************//** + * @brief Clear specified PWM Interrupt pending + * @param[in] PWMx: PWM peripheral, should be LPC_PWM1 + * @param[in] IntFlag: PWM interrupt flag, should be: + * - PWM_INTSTAT_MR0: Interrupt flag for PWM match channel 0 + * - PWM_INTSTAT_MR1: Interrupt flag for PWM match channel 1 + * - PWM_INTSTAT_MR2: Interrupt flag for PWM match channel 2 + * - PWM_INTSTAT_MR3: Interrupt flag for PWM match channel 3 + * - PWM_INTSTAT_MR4: Interrupt flag for PWM match channel 4 + * - PWM_INTSTAT_MR5: Interrupt flag for PWM match channel 5 + * - PWM_INTSTAT_MR6: Interrupt flag for PWM match channel 6 + * - PWM_INTSTAT_CAP0: Interrupt flag for capture input 0 + * - PWM_INTSTAT_CAP1: Interrupt flag for capture input 1 + * @return None + **********************************************************************/ +void PWM_ClearIntPending(LPC_PWM_TypeDef *PWMx, uint32_t IntFlag) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM_INTSTAT(IntFlag)); + PWMx->IR = IntFlag; +} + + + +/*****************************************************************************//** +* @brief Fills each PWM_InitStruct member with its default value: +* - If PWMCounterMode = PWM_MODE_TIMER: +* + PrescaleOption = PWM_TIMER_PRESCALE_USVAL +* + PrescaleValue = 1 +* - If PWMCounterMode = PWM_MODE_COUNTER: +* + CountInputSelect = PWM_COUNTER_PCAP1_0 +* + CounterOption = PWM_COUNTER_RISING +* @param[in] PWMTimerCounterMode Timer or Counter mode, should be: +* - PWM_MODE_TIMER: Counter of PWM peripheral is in Timer mode +* - PWM_MODE_COUNTER: Counter of PWM peripheral is in Counter mode +* @param[in] PWM_InitStruct Pointer to structure (PWM_TIMERCFG_Type or +* PWM_COUNTERCFG_Type) which will be initialized. +* @return None +* Note: PWM_InitStruct pointer will be assigned to corresponding structure +* (PWM_TIMERCFG_Type or PWM_COUNTERCFG_Type) due to PWMTimerCounterMode. +*******************************************************************************/ +void PWM_ConfigStructInit(uint8_t PWMTimerCounterMode, void *PWM_InitStruct) +{ + PWM_TIMERCFG_Type *pTimeCfg; + PWM_COUNTERCFG_Type *pCounterCfg; + CHECK_PARAM(PARAM_PWM_TC_MODE(PWMTimerCounterMode)); + + pTimeCfg = (PWM_TIMERCFG_Type *) PWM_InitStruct; + pCounterCfg = (PWM_COUNTERCFG_Type *) PWM_InitStruct; + + if (PWMTimerCounterMode == PWM_MODE_TIMER ) + { + pTimeCfg->PrescaleOption = PWM_TIMER_PRESCALE_USVAL; + pTimeCfg->PrescaleValue = 1; + } + else if (PWMTimerCounterMode == PWM_MODE_COUNTER) + { + pCounterCfg->CountInputSelect = PWM_COUNTER_PCAP1_0; + pCounterCfg->CounterOption = PWM_COUNTER_RISING; + } +} + + +/*********************************************************************//** + * @brief Initializes the PWMx peripheral corresponding to the specified + * parameters in the PWM_ConfigStruct. + * @param[in] PWMx PWM peripheral, should be LPC_PWM1 + * @param[in] PWMTimerCounterMode Timer or Counter mode, should be: + * - PWM_MODE_TIMER: Counter of PWM peripheral is in Timer mode + * - PWM_MODE_COUNTER: Counter of PWM peripheral is in Counter mode + * @param[in] PWM_ConfigStruct Pointer to structure (PWM_TIMERCFG_Type or + * PWM_COUNTERCFG_Type) which will be initialized. + * @return None + * Note: PWM_ConfigStruct pointer will be assigned to corresponding structure + * (PWM_TIMERCFG_Type or PWM_COUNTERCFG_Type) due to PWMTimerCounterMode. + **********************************************************************/ +void PWM_Init(LPC_PWM_TypeDef *PWMx, uint32_t PWMTimerCounterMode, void *PWM_ConfigStruct) +{ + PWM_TIMERCFG_Type *pTimeCfg; + PWM_COUNTERCFG_Type *pCounterCfg; + uint64_t clkdlycnt; + + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM_TC_MODE(PWMTimerCounterMode)); + + pTimeCfg = (PWM_TIMERCFG_Type *)PWM_ConfigStruct; + pCounterCfg = (PWM_COUNTERCFG_Type *)PWM_ConfigStruct; + + + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCPWM1, ENABLE); + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_PWM1, CLKPWR_PCLKSEL_CCLK_DIV_4); + // Get peripheral clock of PWM1 + clkdlycnt = (uint64_t) CLKPWR_GetPCLK (CLKPWR_PCLKSEL_PWM1); + + + // Clear all interrupts pending + PWMx->IR = 0xFF & PWM_IR_BITMASK; + PWMx->TCR = 0x00; + PWMx->CTCR = 0x00; + PWMx->MCR = 0x00; + PWMx->CCR = 0x00; + PWMx->PCR = 0x00; + PWMx->LER = 0x00; + + if (PWMTimerCounterMode == PWM_MODE_TIMER) + { + CHECK_PARAM(PARAM_PWM_TIMER_PRESCALE(pTimeCfg->PrescaleOption)); + + /* Absolute prescale value */ + if (pTimeCfg->PrescaleOption == PWM_TIMER_PRESCALE_TICKVAL) + { + PWMx->PR = pTimeCfg->PrescaleValue - 1; + } + /* uSecond prescale value */ + else + { + clkdlycnt = (clkdlycnt * pTimeCfg->PrescaleValue) / 1000000; + PWMx->PR = ((uint32_t) clkdlycnt) - 1; + } + + } + else if (PWMTimerCounterMode == PWM_MODE_COUNTER) + { + CHECK_PARAM(PARAM_PWM_COUNTER_INPUTSEL(pCounterCfg->CountInputSelect)); + CHECK_PARAM(PARAM_PWM_COUNTER_EDGE(pCounterCfg->CounterOption)); + + PWMx->CTCR |= (PWM_CTCR_MODE((uint32_t)pCounterCfg->CounterOption)) \ + | (PWM_CTCR_SELECT_INPUT((uint32_t)pCounterCfg->CountInputSelect)); + } +} + +/*********************************************************************//** + * @brief De-initializes the PWM peripheral registers to their +* default reset values. + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @return None + **********************************************************************/ +void PWM_DeInit (LPC_PWM_TypeDef *PWMx) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + + // Disable PWM control (timer, counter and PWM) + PWMx->TCR = 0x00; + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCPWM1, DISABLE); + +} + + +/*********************************************************************//** + * @brief Enable/Disable PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable PWM peripheral + * - DISABLE: Disable PWM peripheral + * @return None + **********************************************************************/ +void PWM_Cmd(LPC_PWM_TypeDef *PWMx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + PWMx->TCR |= PWM_TCR_PWM_ENABLE; + } + else + { + PWMx->TCR &= (~PWM_TCR_PWM_ENABLE) & PWM_TCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enable/Disable Counter in PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable Counter in PWM peripheral + * - DISABLE: Disable Counter in PWM peripheral + * @return None + **********************************************************************/ +void PWM_CounterCmd(LPC_PWM_TypeDef *PWMx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + if (NewState == ENABLE) + { + PWMx->TCR |= PWM_TCR_COUNTER_ENABLE; + } + else + { + PWMx->TCR &= (~PWM_TCR_COUNTER_ENABLE) & PWM_TCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Reset Counter in PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @return None + **********************************************************************/ +void PWM_ResetCounter(LPC_PWM_TypeDef *PWMx) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + PWMx->TCR |= PWM_TCR_COUNTER_RESET; + PWMx->TCR &= (~PWM_TCR_COUNTER_RESET) & PWM_TCR_BITMASK; +} + + +/*********************************************************************//** + * @brief Configures match for PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] PWM_MatchConfigStruct Pointer to a PWM_MATCHCFG_Type structure +* that contains the configuration information for the +* specified PWM match function. + * @return None + **********************************************************************/ +void PWM_ConfigMatch(LPC_PWM_TypeDef *PWMx, PWM_MATCHCFG_Type *PWM_MatchConfigStruct) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_MATCH_CHANNEL(PWM_MatchConfigStruct->MatchChannel)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->IntOnMatch)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->ResetOnMatch)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->StopOnMatch)); + + //interrupt on MRn + if (PWM_MatchConfigStruct->IntOnMatch == ENABLE) + { + PWMx->MCR |= PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); + } + else + { + PWMx->MCR &= (~PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ + & PWM_MCR_BITMASK; + } + + //reset on MRn + if (PWM_MatchConfigStruct->ResetOnMatch == ENABLE) + { + PWMx->MCR |= PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); + } + else + { + PWMx->MCR &= (~PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ + & PWM_MCR_BITMASK; + } + + //stop on MRn + if (PWM_MatchConfigStruct->StopOnMatch == ENABLE) + { + PWMx->MCR |= PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); + } + else + { + PWMx->MCR &= (~PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ + & PWM_MCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Configures capture input for PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] PWM_CaptureConfigStruct Pointer to a PWM_CAPTURECFG_Type structure +* that contains the configuration information for the +* specified PWM capture input function. + * @return None + **********************************************************************/ +void PWM_ConfigCapture(LPC_PWM_TypeDef *PWMx, PWM_CAPTURECFG_Type *PWM_CaptureConfigStruct) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_CAPTURE_CHANNEL(PWM_CaptureConfigStruct->CaptureChannel)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_CaptureConfigStruct->FallingEdge)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_CaptureConfigStruct->IntOnCaption)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_CaptureConfigStruct->RisingEdge)); + + if (PWM_CaptureConfigStruct->RisingEdge == ENABLE) + { + PWMx->CCR |= PWM_CCR_CAP_RISING(PWM_CaptureConfigStruct->CaptureChannel); + } + else + { + PWMx->CCR &= (~PWM_CCR_CAP_RISING(PWM_CaptureConfigStruct->CaptureChannel)) \ + & PWM_CCR_BITMASK; + } + + if (PWM_CaptureConfigStruct->FallingEdge == ENABLE) + { + PWMx->CCR |= PWM_CCR_CAP_FALLING(PWM_CaptureConfigStruct->CaptureChannel); + } + else + { + PWMx->CCR &= (~PWM_CCR_CAP_FALLING(PWM_CaptureConfigStruct->CaptureChannel)) \ + & PWM_CCR_BITMASK; + } + + if (PWM_CaptureConfigStruct->IntOnCaption == ENABLE) + { + PWMx->CCR |= PWM_CCR_INT_ON_CAP(PWM_CaptureConfigStruct->CaptureChannel); + } + else + { + PWMx->CCR &= (~PWM_CCR_INT_ON_CAP(PWM_CaptureConfigStruct->CaptureChannel)) \ + & PWM_CCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Read value of capture register PWM peripheral + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] CaptureChannel: capture channel number, should be in + * range 0 to 1 + * @return Value of capture register + **********************************************************************/ +uint32_t PWM_GetCaptureValue(LPC_PWM_TypeDef *PWMx, uint8_t CaptureChannel) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_CAPTURE_CHANNEL(CaptureChannel)); + + switch (CaptureChannel) + { + case 0: + return PWMx->CR0; + + case 1: + return PWMx->CR1; + + default: + return (0); + } +} + + +/********************************************************************//** + * @brief Update value for each PWM channel with update type option + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] MatchChannel Match channel + * @param[in] MatchValue Match value + * @param[in] UpdateType Type of Update, should be: + * - PWM_MATCH_UPDATE_NOW: The update value will be updated for + * this channel immediately + * - PWM_MATCH_UPDATE_NEXT_RST: The update value will be updated for + * this channel on next reset by a PWM Match event. + * @return None + *********************************************************************/ +void PWM_MatchUpdate(LPC_PWM_TypeDef *PWMx, uint8_t MatchChannel, \ + uint32_t MatchValue, uint8_t UpdateType) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_MATCH_CHANNEL(MatchChannel)); + CHECK_PARAM(PARAM_PWM_MATCH_UPDATE(UpdateType)); + + switch (MatchChannel) + { + case 0: + PWMx->MR0 = MatchValue; + break; + + case 1: + PWMx->MR1 = MatchValue; + break; + + case 2: + PWMx->MR2 = MatchValue; + break; + + case 3: + PWMx->MR3 = MatchValue; + break; + + case 4: + PWMx->MR4 = MatchValue; + break; + + case 5: + PWMx->MR5 = MatchValue; + break; + + case 6: + PWMx->MR6 = MatchValue; + break; + } + + // Write Latch register + PWMx->LER |= PWM_LER_EN_MATCHn_LATCH(MatchChannel); + + // In case of update now + if (UpdateType == PWM_MATCH_UPDATE_NOW) + { + PWMx->TCR |= PWM_TCR_COUNTER_RESET; + PWMx->TCR &= (~PWM_TCR_COUNTER_RESET) & PWM_TCR_BITMASK; + } +} + +/********************************************************************//** + * @brief Update value for multi PWM channel with update type option + * at the same time + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] MatchStruct Structure that contents match value of 7 pwm channels + * @param[in] UpdateType Type of Update, should be: + * - PWM_MATCH_UPDATE_NOW: The update value will be updated for + * this channel immediately + * - PWM_MATCH_UPDATE_NEXT_RST: The update value will be updated for + * this channel on next reset by a PWM Match event. + * @return None + *********************************************************************/ +void PWM_MultiMatchUpdate(LPC_PWM_TypeDef *PWMx, PWM_Match_T *MatchStruct , uint8_t UpdateType) +{ + uint8_t LatchValue = 0; + uint8_t i; + + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM_MATCH_UPDATE(UpdateType)); + + //Update match value + for(i=0;i<7;i++) + { + if(MatchStruct[i].Status == SET) + { + if(i<4) + *((volatile unsigned int *)(&(PWMx->MR0) + i)) = MatchStruct[i].Matchvalue; + else + { + *((volatile unsigned int *)(&(PWMx->MR4) + (i-4))) = MatchStruct[i].Matchvalue; + } + LatchValue |=(1<LER = LatchValue; + + // In case of update now + if (UpdateType == PWM_MATCH_UPDATE_NOW) + { + PWMx->TCR |= PWM_TCR_COUNTER_RESET; + PWMx->TCR &= (~PWM_TCR_COUNTER_RESET) & PWM_TCR_BITMASK; + } +} +/********************************************************************//** + * @brief Configure Edge mode for each PWM channel + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] PWMChannel PWM channel, should be in range from 2 to 6 + * @param[in] ModeOption PWM mode option, should be: + * - PWM_CHANNEL_SINGLE_EDGE: Single Edge mode + * - PWM_CHANNEL_DUAL_EDGE: Dual Edge mode + * @return None + * Note: PWM Channel 1 can not be selected for mode option + *********************************************************************/ +void PWM_ChannelConfig(LPC_PWM_TypeDef *PWMx, uint8_t PWMChannel, uint8_t ModeOption) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_EDGE_MODE_CHANNEL(PWMChannel)); + CHECK_PARAM(PARAM_PWM_CHANNEL_EDGE(ModeOption)); + + // Single edge mode + if (ModeOption == PWM_CHANNEL_SINGLE_EDGE) + { + PWMx->PCR &= (~PWM_PCR_PWMSELn(PWMChannel)) & PWM_PCR_BITMASK; + } + // Double edge mode + else if (PWM_CHANNEL_DUAL_EDGE) + { + PWMx->PCR |= PWM_PCR_PWMSELn(PWMChannel); + } +} + + + +/********************************************************************//** + * @brief Enable/Disable PWM channel output + * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 + * @param[in] PWMChannel PWM channel, should be in range from 1 to 6 + * @param[in] NewState New State of this function, should be: + * - ENABLE: Enable this PWM channel output + * - DISABLE: Disable this PWM channel output + * @return None + *********************************************************************/ +void PWM_ChannelCmd(LPC_PWM_TypeDef *PWMx, uint8_t PWMChannel, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_PWMx(PWMx)); + CHECK_PARAM(PARAM_PWM1_CHANNEL(PWMChannel)); + + if (NewState == ENABLE) + { + PWMx->PCR |= PWM_PCR_PWMENAn(PWMChannel); + } + else + { + PWMx->PCR &= (~PWM_PCR_PWMENAn(PWMChannel)) & PWM_PCR_BITMASK; + } +} + +/** + * @} + */ + +#endif /* _PWM */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_qei.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_qei.c new file mode 100644 index 0000000000..01259ff686 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_qei.c @@ -0,0 +1,514 @@ +/********************************************************************** +* $Id$ lpc17xx_qei.c 2010-05-21 +*//** +* @file lpc17xx_qei.c +* @brief Contains all functions support for QEI firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup QEI + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_qei.h" +#include "lpc17xx_clkpwr.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _QEI + +/* Private Types -------------------------------------------------------------- */ +/** @defgroup QEI_Private_Types QEI Private Types + * @{ + */ + +/** + * @brief QEI configuration union type definition + */ +typedef union { + QEI_CFG_Type bmQEIConfig; + uint32_t ulQEIConfig; +} QEI_CFGOPT_Type; + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup QEI_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Resets value for each type of QEI value, such as velocity, + * counter, position, etc.. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulResetType QEI Reset Type, should be one of the following: + * - QEI_RESET_POS: Reset Position Counter + * - QEI_RESET_POSOnIDX: Reset Position Counter on Index signal + * - QEI_RESET_VEL: Reset Velocity + * - QEI_RESET_IDX: Reset Index Counter + * @return None + **********************************************************************/ +void QEI_Reset(LPC_QEI_TypeDef *QEIx, uint32_t ulResetType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_RESET(ulResetType)); + + QEIx->QEICON = ulResetType; +} + +/*********************************************************************//** + * @brief Initializes the QEI peripheral according to the specified +* parameters in the QEI_ConfigStruct. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] QEI_ConfigStruct Pointer to a QEI_CFG_Type structure +* that contains the configuration information for the +* specified QEI peripheral + * @return None + **********************************************************************/ +void QEI_Init(LPC_QEI_TypeDef *QEIx, QEI_CFG_Type *QEI_ConfigStruct) +{ + + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_DIRINV(QEI_ConfigStruct->DirectionInvert)); + CHECK_PARAM(PARAM_QEI_SIGNALMODE(QEI_ConfigStruct->SignalMode)); + CHECK_PARAM(PARAM_QEI_CAPMODE(QEI_ConfigStruct->CaptureMode)); + CHECK_PARAM(PARAM_QEI_INVINX(QEI_ConfigStruct->InvertIndex)); + + /* Set up clock and power for QEI module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCQEI, ENABLE); + + /* As default, peripheral clock for QEI module + * is set to FCCLK / 2 */ + CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_QEI, CLKPWR_PCLKSEL_CCLK_DIV_1); + + // Reset all remaining value in QEI peripheral + QEIx->QEICON = QEI_CON_RESP | QEI_CON_RESV | QEI_CON_RESI; + QEIx->QEIMAXPOS = 0x00; + QEIx->CMPOS0 = 0x00; + QEIx->CMPOS1 = 0x00; + QEIx->CMPOS2 = 0x00; + QEIx->INXCMP = 0x00; + QEIx->QEILOAD = 0x00; + QEIx->VELCOMP = 0x00; + QEIx->FILTER = 0x00; + // Disable all Interrupt + QEIx->QEIIEC = QEI_IECLR_BITMASK; + // Clear all Interrupt pending + QEIx->QEICLR = QEI_INTCLR_BITMASK; + // Set QEI configuration value corresponding to its setting up value + QEIx->QEICONF = ((QEI_CFGOPT_Type *)QEI_ConfigStruct)->ulQEIConfig; +} + + +/*********************************************************************//** + * @brief De-initializes the QEI peripheral registers to their +* default reset values. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return None + **********************************************************************/ +void QEI_DeInit(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + + /* Turn off clock and power for QEI module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCQEI, DISABLE); +} + + +/*****************************************************************************//** +* @brief Fills each QIE_InitStruct member with its default value: +* - DirectionInvert = QEI_DIRINV_NONE +* - SignalMode = QEI_SIGNALMODE_QUAD +* - CaptureMode = QEI_CAPMODE_4X +* - InvertIndex = QEI_INVINX_NONE +* @param[in] QIE_InitStruct Pointer to a QEI_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void QEI_ConfigStructInit(QEI_CFG_Type *QIE_InitStruct) +{ + QIE_InitStruct->CaptureMode = QEI_CAPMODE_4X; + QIE_InitStruct->DirectionInvert = QEI_DIRINV_NONE; + QIE_InitStruct->InvertIndex = QEI_INVINX_NONE; + QIE_InitStruct->SignalMode = QEI_SIGNALMODE_QUAD; +} + + +/*********************************************************************//** + * @brief Check whether if specified flag status is set or not + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulFlagType Status Flag Type, should be one of the following: + * - QEI_STATUS_DIR: Direction Status + * @return New Status of this status flag (SET or RESET) + **********************************************************************/ +FlagStatus QEI_GetStatus(LPC_QEI_TypeDef *QEIx, uint32_t ulFlagType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_STATUS(ulFlagType)); + return ((QEIx->QEISTAT & ulFlagType) ? SET : RESET); +} + +/*********************************************************************//** + * @brief Get current position value in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return Current position value of QEI peripheral + **********************************************************************/ +uint32_t QEI_GetPosition(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->QEIPOS); +} + +/*********************************************************************//** + * @brief Set max position value for QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulMaxPos Max position value to set + * @return None + **********************************************************************/ +void QEI_SetMaxPosition(LPC_QEI_TypeDef *QEIx, uint32_t ulMaxPos) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + QEIx->QEIMAXPOS = ulMaxPos; +} + +/*********************************************************************//** + * @brief Set position compare value for QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] bPosCompCh Compare Position channel, should be: + * - QEI_COMPPOS_CH_0: QEI compare position channel 0 + * - QEI_COMPPOS_CH_1: QEI compare position channel 1 + * - QEI_COMPPOS_CH_2: QEI compare position channel 2 + * @param[in] ulPosComp Compare Position value to set + * @return None + **********************************************************************/ +void QEI_SetPositionComp(LPC_QEI_TypeDef *QEIx, uint8_t bPosCompCh, uint32_t ulPosComp) +{ + uint32_t *tmp; + + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_COMPPOS_CH(bPosCompCh)); + tmp = (uint32_t *) (&(QEIx->CMPOS0) + bPosCompCh * 4); + *tmp = ulPosComp; + +} + +/*********************************************************************//** + * @brief Get current index counter of QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return Current value of QEI index counter + **********************************************************************/ +uint32_t QEI_GetIndex(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->INXCNT); +} + +/*********************************************************************//** + * @brief Set value for index compare in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIndexComp Compare Index Value to set + * @return None + **********************************************************************/ +void QEI_SetIndexComp(LPC_QEI_TypeDef *QEIx, uint32_t ulIndexComp) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + QEIx->INXCMP = ulIndexComp; +} + +/*********************************************************************//** + * @brief Set timer reload value for QEI peripheral. When the velocity timer is + * over-flow, the value that set for Timer Reload register will be loaded + * into the velocity timer for next period. The calculated velocity in RPM + * therefore will be affect by this value. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] QEIReloadStruct QEI reload structure + * @return None + **********************************************************************/ +void QEI_SetTimerReload(LPC_QEI_TypeDef *QEIx, QEI_RELOADCFG_Type *QEIReloadStruct) +{ + uint64_t pclk; + + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_TIMERRELOAD(QEIReloadStruct->ReloadOption)); + + if (QEIReloadStruct->ReloadOption == QEI_TIMERRELOAD_TICKVAL) { + QEIx->QEILOAD = QEIReloadStruct->ReloadValue - 1; + } else { + pclk = (uint64_t)CLKPWR_GetPCLK(CLKPWR_PCLKSEL_QEI); + pclk = (pclk /(1000000/QEIReloadStruct->ReloadValue)) - 1; + QEIx->QEILOAD = (uint32_t)pclk; + } +} + +/*********************************************************************//** + * @brief Get current timer counter in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return Current timer counter in QEI peripheral + **********************************************************************/ +uint32_t QEI_GetTimer(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->QEITIME); +} + +/*********************************************************************//** + * @brief Get current velocity pulse counter in current time period + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return Current velocity pulse counter value + **********************************************************************/ +uint32_t QEI_GetVelocity(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->QEIVEL); +} + +/*********************************************************************//** + * @brief Get the most recently measured velocity of the QEI. When + * the Velocity timer in QEI is over-flow, the current velocity + * value will be loaded into Velocity Capture register. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @return The most recently measured velocity value + **********************************************************************/ +uint32_t QEI_GetVelocityCap(LPC_QEI_TypeDef *QEIx) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + return (QEIx->QEICAP); +} + +/*********************************************************************//** + * @brief Set Velocity Compare value for QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulVelComp Compare Velocity value to set + * @return None + **********************************************************************/ +void QEI_SetVelocityComp(LPC_QEI_TypeDef *QEIx, uint32_t ulVelComp) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + QEIx->VELCOMP = ulVelComp; +} + +/*********************************************************************//** + * @brief Set value of sampling count for the digital filter in + * QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulSamplingPulse Value of sampling count to set + * @return None + **********************************************************************/ +void QEI_SetDigiFilter(LPC_QEI_TypeDef *QEIx, uint32_t ulSamplingPulse) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + QEIx->FILTER = ulSamplingPulse; +} + +/*********************************************************************//** + * @brief Check whether if specified interrupt flag status in QEI + * peripheral is set or not + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIntType Interrupt Flag Status type, should be: + - QEI_INTFLAG_INX_Int: index pulse was detected interrupt + - QEI_INTFLAG_TIM_Int: Velocity timer over flow interrupt + - QEI_INTFLAG_VELC_Int: Capture velocity is less than compare interrupt + - QEI_INTFLAG_DIR_Int: Change of direction interrupt + - QEI_INTFLAG_ERR_Int: An encoder phase error interrupt + - QEI_INTFLAG_ENCLK_Int: An encoder clock pulse was detected interrupt + - QEI_INTFLAG_POS0_Int: position 0 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS1_Int: position 1 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS2_Int: position 2 compare value is equal to the + current position interrupt + - QEI_INTFLAG_REV_Int: Index compare value is equal to the current + index count interrupt + - QEI_INTFLAG_POS0REV_Int: Combined position 0 and revolution count interrupt + - QEI_INTFLAG_POS1REV_Int: Combined position 1 and revolution count interrupt + - QEI_INTFLAG_POS2REV_Int: Combined position 2 and revolution count interrupt + * @return New State of specified interrupt flag status (SET or RESET) + **********************************************************************/ +FlagStatus QEI_GetIntStatus(LPC_QEI_TypeDef *QEIx, uint32_t ulIntType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_INTFLAG(ulIntType)); + + return((QEIx->QEIINTSTAT & ulIntType) ? SET : RESET); +} + +/*********************************************************************//** + * @brief Enable/Disable specified interrupt in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIntType Interrupt Flag Status type, should be: + * - QEI_INTFLAG_INX_Int: index pulse was detected interrupt + * - QEI_INTFLAG_TIM_Int: Velocity timer over flow interrupt + * - QEI_INTFLAG_VELC_Int: Capture velocity is less than compare interrupt + * - QEI_INTFLAG_DIR_Int: Change of direction interrupt + * - QEI_INTFLAG_ERR_Int: An encoder phase error interrupt + * - QEI_INTFLAG_ENCLK_Int: An encoder clock pulse was detected interrupt + * - QEI_INTFLAG_POS0_Int: position 0 compare value is equal to the + * current position interrupt + * - QEI_INTFLAG_POS1_Int: position 1 compare value is equal to the + * current position interrupt + * - QEI_INTFLAG_POS2_Int: position 2 compare value is equal to the + * current position interrupt + * - QEI_INTFLAG_REV_Int: Index compare value is equal to the current + * index count interrupt + * - QEI_INTFLAG_POS0REV_Int: Combined position 0 and revolution count interrupt + * - QEI_INTFLAG_POS1REV_Int: Combined position 1 and revolution count interrupt + * - QEI_INTFLAG_POS2REV_Int: Combined position 2 and revolution count interrupt + * @param[in] NewState New function state, should be: + * - DISABLE + * - ENABLE + * @return None + **********************************************************************/ +void QEI_IntCmd(LPC_QEI_TypeDef *QEIx, uint32_t ulIntType, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_INTFLAG(ulIntType)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) { + QEIx->QEIIES = ulIntType; + } else { + QEIx->QEIIEC = ulIntType; + } +} + + +/*********************************************************************//** + * @brief Sets (forces) specified interrupt in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIntType Interrupt Flag Status type, should be: + - QEI_INTFLAG_INX_Int: index pulse was detected interrupt + - QEI_INTFLAG_TIM_Int: Velocity timer over flow interrupt + - QEI_INTFLAG_VELC_Int: Capture velocity is less than compare interrupt + - QEI_INTFLAG_DIR_Int: Change of direction interrupt + - QEI_INTFLAG_ERR_Int: An encoder phase error interrupt + - QEI_INTFLAG_ENCLK_Int: An encoder clock pulse was detected interrupt + - QEI_INTFLAG_POS0_Int: position 0 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS1_Int: position 1 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS2_Int: position 2 compare value is equal to the + current position interrupt + - QEI_INTFLAG_REV_Int: Index compare value is equal to the current + index count interrupt + - QEI_INTFLAG_POS0REV_Int: Combined position 0 and revolution count interrupt + - QEI_INTFLAG_POS1REV_Int: Combined position 1 and revolution count interrupt + - QEI_INTFLAG_POS2REV_Int: Combined position 2 and revolution count interrupt + * @return None + **********************************************************************/ +void QEI_IntSet(LPC_QEI_TypeDef *QEIx, uint32_t ulIntType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_INTFLAG(ulIntType)); + + QEIx->QEISET = ulIntType; +} + +/*********************************************************************//** + * @brief Clear (force) specified interrupt (pending) in QEI peripheral + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulIntType Interrupt Flag Status type, should be: + - QEI_INTFLAG_INX_Int: index pulse was detected interrupt + - QEI_INTFLAG_TIM_Int: Velocity timer over flow interrupt + - QEI_INTFLAG_VELC_Int: Capture velocity is less than compare interrupt + - QEI_INTFLAG_DIR_Int: Change of direction interrupt + - QEI_INTFLAG_ERR_Int: An encoder phase error interrupt + - QEI_INTFLAG_ENCLK_Int: An encoder clock pulse was detected interrupt + - QEI_INTFLAG_POS0_Int: position 0 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS1_Int: position 1 compare value is equal to the + current position interrupt + - QEI_INTFLAG_POS2_Int: position 2 compare value is equal to the + current position interrupt + - QEI_INTFLAG_REV_Int: Index compare value is equal to the current + index count interrupt + - QEI_INTFLAG_POS0REV_Int: Combined position 0 and revolution count interrupt + - QEI_INTFLAG_POS1REV_Int: Combined position 1 and revolution count interrupt + - QEI_INTFLAG_POS2REV_Int: Combined position 2 and revolution count interrupt + * @return None + **********************************************************************/ +void QEI_IntClear(LPC_QEI_TypeDef *QEIx, uint32_t ulIntType) +{ + CHECK_PARAM(PARAM_QEIx(QEIx)); + CHECK_PARAM(PARAM_QEI_INTFLAG(ulIntType)); + + QEIx->QEICLR = ulIntType; +} + + +/*********************************************************************//** + * @brief Calculates the actual velocity in RPM passed via velocity + * capture value and Pulse Per Round (of the encoder) value + * parameter input. + * @param[in] QEIx QEI peripheral, should be LPC_QEI + * @param[in] ulVelCapValue Velocity capture input value that can + * be got from QEI_GetVelocityCap() function + * @param[in] ulPPR Pulse per round of encoder + * @return The actual value of velocity in RPM (Round per minute) + **********************************************************************/ +uint32_t QEI_CalculateRPM(LPC_QEI_TypeDef *QEIx, uint32_t ulVelCapValue, uint32_t ulPPR) +{ + uint64_t rpm, clock, Load, edges; + + // Get current Clock rate for timer input + clock = (uint64_t)CLKPWR_GetPCLK(CLKPWR_PCLKSEL_QEI); + // Get Timer load value (velocity capture period) + Load = (uint64_t)(QEIx->QEILOAD + 1); + // Get Edge + edges = (uint64_t)((QEIx->QEICONF & QEI_CONF_CAPMODE) ? 4 : 2); + // Calculate RPM + rpm = ((clock * ulVelCapValue * 60) / (Load * ulPPR * edges)); + + return (uint32_t)(rpm); +} + + +/** + * @} + */ + +#endif /* _QEI */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_rit.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_rit.c new file mode 100644 index 0000000000..ab89ed3be3 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_rit.c @@ -0,0 +1,199 @@ +/********************************************************************** +* $Id$ lpc17xx_rit.c 2010-05-21 +*//** +* @file lpc17xx_rit.c +* @brief Contains all functions support for RIT firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup RIT + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_rit.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + +#ifdef _RIT + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup RIT_Public_Functions + * @{ + */ + +/******************************************************************************//* + * @brief Initial for RIT + * - Turn on power and clock + * - Setup default register values + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @return None + *******************************************************************************/ +void RIT_Init(LPC_RIT_TypeDef *RITx) +{ + CHECK_PARAM(PARAM_RITx(RITx)); + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCRIT, ENABLE); + //Set up default register values + RITx->RICOMPVAL = 0xFFFFFFFF; + RITx->RIMASK = 0x00000000; + RITx->RICTRL = 0x0C; + RITx->RICOUNTER = 0x00000000; + // Turn on power and clock + +} +/******************************************************************************//* + * @brief DeInitial for RIT + * - Turn off power and clock + * - ReSetup default register values + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @return None + *******************************************************************************/ +void RIT_DeInit(LPC_RIT_TypeDef *RITx) +{ + CHECK_PARAM(PARAM_RITx(RITx)); + + // Turn off power and clock + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCRIT, DISABLE); + //ReSetup default register values + RITx->RICOMPVAL = 0xFFFFFFFF; + RITx->RIMASK = 0x00000000; + RITx->RICTRL = 0x0C; + RITx->RICOUNTER = 0x00000000; +} + +/******************************************************************************//* + * @brief Set compare value, mask value and time counter value + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @param[in] time_interval: timer interval value (ms) + * @return None + *******************************************************************************/ +void RIT_TimerConfig(LPC_RIT_TypeDef *RITx, uint32_t time_interval) +{ + uint32_t clock_rate, cmp_value; + CHECK_PARAM(PARAM_RITx(RITx)); + + // Get PCLK value of RIT + clock_rate = CLKPWR_GetPCLK(CLKPWR_PCLKSEL_RIT); + + /* calculate compare value for RIT to generate interrupt at + * specified time interval + * COMPVAL = (RIT_PCLK * time_interval)/1000 + * (with time_interval unit is millisecond) + */ + cmp_value = (clock_rate /1000) * time_interval; + RITx->RICOMPVAL = cmp_value; + + /* Set timer enable clear bit to clear timer to 0 whenever + * counter value equals the contents of RICOMPVAL + */ + RITx->RICTRL |= (1<<1); +} + + +/******************************************************************************//* + * @brief Enable/Disable Timer + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @param[in] NewState New State of this function + * -ENABLE: Enable Timer + * -DISABLE: Disable Timer + * @return None + *******************************************************************************/ +void RIT_Cmd(LPC_RIT_TypeDef *RITx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RITx(RITx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + //Enable or Disable Timer + if(NewState==ENABLE) + { + RITx->RICTRL |= RIT_CTRL_TEN; + } + else + { + RITx->RICTRL &= ~RIT_CTRL_TEN; + } +} + +/******************************************************************************//* + * @brief Timer Enable/Disable on debug + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @param[in] NewState New State of this function + * -ENABLE: The timer is halted whenever a hardware break condition occurs + * -DISABLE: Hardware break has no effect on the timer operation + * @return None + *******************************************************************************/ +void RIT_TimerDebugCmd(LPC_RIT_TypeDef *RITx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RITx(RITx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + //Timer Enable/Disable on break + if(NewState==ENABLE) + { + RITx->RICTRL |= RIT_CTRL_ENBR; + } + else + { + RITx->RICTRL &= ~RIT_CTRL_ENBR; + } +} +/******************************************************************************//* + * @brief Check whether interrupt flag is set or not + * @param[in] RITx is RIT peripheral selected, should be: LPC_RIT + * @return Current interrupt status, could be: SET/RESET + *******************************************************************************/ +IntStatus RIT_GetIntStatus(LPC_RIT_TypeDef *RITx) +{ + IntStatus result; + CHECK_PARAM(PARAM_RITx(RITx)); + if((RITx->RICTRL&RIT_CTRL_INTEN)==1) result= SET; + else return RESET; + //clear interrupt flag + RITx->RICTRL |= RIT_CTRL_INTEN; + return result; +} + +/** + * @} + */ + +#endif /* _RIT */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_rtc.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_rtc.c new file mode 100644 index 0000000000..c47f938365 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_rtc.c @@ -0,0 +1,783 @@ +/********************************************************************** +* $Id$ lpc17xx_rtc.c 2011-06-06 +*//** +* @file lpc17xx_rtc.c +* @brief Contains all functions support for RTC firmware library on LPC17xx +* @version 3.1 +* @date 6. June. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup RTC + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_rtc.h" +#include "lpc17xx_clkpwr.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _RTC + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup RTC_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initializes the RTC peripheral. + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @return None + *********************************************************************/ +void RTC_Init (LPC_RTC_TypeDef *RTCx) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + /* Set up clock and power for RTC module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCRTC, ENABLE); + + // Clear all register to be default + RTCx->ILR = 0x00; + RTCx->CCR = 0x00; + RTCx->CIIR = 0x00; + RTCx->AMR = 0xFF; + RTCx->CALIBRATION = 0x00; +} + + +/*********************************************************************//** + * @brief De-initializes the RTC peripheral registers to their +* default reset values. + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @return None + **********************************************************************/ +void RTC_DeInit(LPC_RTC_TypeDef *RTCx) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + RTCx->CCR = 0x00; + // Disable power and clock for RTC module + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCRTC, DISABLE); +} + +/*********************************************************************//** + * @brief Reset clock tick counter in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @return None + **********************************************************************/ +void RTC_ResetClockTickCounter(LPC_RTC_TypeDef *RTCx) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + RTCx->CCR |= RTC_CCR_CTCRST; + RTCx->CCR &= (~RTC_CCR_CTCRST) & RTC_CCR_BITMASK; +} + +/*********************************************************************//** + * @brief Start/Stop RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] NewState New State of this function, should be: + * - ENABLE: The time counters are enabled + * - DISABLE: The time counters are disabled + * @return None + **********************************************************************/ +void RTC_Cmd (LPC_RTC_TypeDef *RTCx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + RTCx->CCR |= RTC_CCR_CLKEN; + } + else + { + RTCx->CCR &= (~RTC_CCR_CLKEN) & RTC_CCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enable/Disable Counter increment interrupt for each time type + * in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] CntIncrIntType: Counter Increment Interrupt type, + * an increment of this type value below will generates + * an interrupt, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @param[in] NewState New State of this function, should be: + * - ENABLE: Counter Increment interrupt for this + * time type are enabled + * - DISABLE: Counter Increment interrupt for this + * time type are disabled + * @return None + **********************************************************************/ +void RTC_CntIncrIntConfig (LPC_RTC_TypeDef *RTCx, uint32_t CntIncrIntType, \ + FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + CHECK_PARAM(PARAM_RTC_TIMETYPE(CntIncrIntType)); + + if (NewState == ENABLE) + { + switch (CntIncrIntType) + { + case RTC_TIMETYPE_SECOND: + RTCx->CIIR |= RTC_CIIR_IMSEC; + break; + case RTC_TIMETYPE_MINUTE: + RTCx->CIIR |= RTC_CIIR_IMMIN; + break; + case RTC_TIMETYPE_HOUR: + RTCx->CIIR |= RTC_CIIR_IMHOUR; + break; + case RTC_TIMETYPE_DAYOFWEEK: + RTCx->CIIR |= RTC_CIIR_IMDOW; + break; + case RTC_TIMETYPE_DAYOFMONTH: + RTCx->CIIR |= RTC_CIIR_IMDOM; + break; + case RTC_TIMETYPE_DAYOFYEAR: + RTCx->CIIR |= RTC_CIIR_IMDOY; + break; + case RTC_TIMETYPE_MONTH: + RTCx->CIIR |= RTC_CIIR_IMMON; + break; + case RTC_TIMETYPE_YEAR: + RTCx->CIIR |= RTC_CIIR_IMYEAR; + break; + } + } + else + { + switch (CntIncrIntType) + { + case RTC_TIMETYPE_SECOND: + RTCx->CIIR &= (~RTC_CIIR_IMSEC) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_MINUTE: + RTCx->CIIR &= (~RTC_CIIR_IMMIN) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_HOUR: + RTCx->CIIR &= (~RTC_CIIR_IMHOUR) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFWEEK: + RTCx->CIIR &= (~RTC_CIIR_IMDOW) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFMONTH: + RTCx->CIIR &= (~RTC_CIIR_IMDOM) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFYEAR: + RTCx->CIIR &= (~RTC_CIIR_IMDOY) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_MONTH: + RTCx->CIIR &= (~RTC_CIIR_IMMON) & RTC_CIIR_BITMASK; + break; + case RTC_TIMETYPE_YEAR: + RTCx->CIIR &= (~RTC_CIIR_IMYEAR) & RTC_CIIR_BITMASK; + break; + } + } +} + + +/*********************************************************************//** + * @brief Enable/Disable Alarm interrupt for each time type + * in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] AlarmTimeType: Alarm Time Interrupt type, + * an matching of this type value below with current time + * in RTC will generates an interrupt, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @param[in] NewState New State of this function, should be: + * - ENABLE: Alarm interrupt for this + * time type are enabled + * - DISABLE: Alarm interrupt for this + * time type are disabled + * @return None + **********************************************************************/ +void RTC_AlarmIntConfig (LPC_RTC_TypeDef *RTCx, uint32_t AlarmTimeType, \ + FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + CHECK_PARAM(PARAM_RTC_TIMETYPE(AlarmTimeType)); + + if (NewState == ENABLE) + { + switch (AlarmTimeType) + { + case RTC_TIMETYPE_SECOND: + RTCx->AMR &= (~RTC_AMR_AMRSEC) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_MINUTE: + RTCx->AMR &= (~RTC_AMR_AMRMIN) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_HOUR: + RTCx->AMR &= (~RTC_AMR_AMRHOUR) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFWEEK: + RTCx->AMR &= (~RTC_AMR_AMRDOW) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFMONTH: + RTCx->AMR &= (~RTC_AMR_AMRDOM) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_DAYOFYEAR: + RTCx->AMR &= (~RTC_AMR_AMRDOY) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_MONTH: + RTCx->AMR &= (~RTC_AMR_AMRMON) & RTC_AMR_BITMASK; + break; + case RTC_TIMETYPE_YEAR: + RTCx->AMR &= (~RTC_AMR_AMRYEAR) & RTC_AMR_BITMASK; + break; + } + } + else + { + switch (AlarmTimeType) + { + case RTC_TIMETYPE_SECOND: + RTCx->AMR |= (RTC_AMR_AMRSEC); + break; + case RTC_TIMETYPE_MINUTE: + RTCx->AMR |= (RTC_AMR_AMRMIN); + break; + case RTC_TIMETYPE_HOUR: + RTCx->AMR |= (RTC_AMR_AMRHOUR); + break; + case RTC_TIMETYPE_DAYOFWEEK: + RTCx->AMR |= (RTC_AMR_AMRDOW); + break; + case RTC_TIMETYPE_DAYOFMONTH: + RTCx->AMR |= (RTC_AMR_AMRDOM); + break; + case RTC_TIMETYPE_DAYOFYEAR: + RTCx->AMR |= (RTC_AMR_AMRDOY); + break; + case RTC_TIMETYPE_MONTH: + RTCx->AMR |= (RTC_AMR_AMRMON); + break; + case RTC_TIMETYPE_YEAR: + RTCx->AMR |= (RTC_AMR_AMRYEAR); + break; + } + } +} + + +/*********************************************************************//** + * @brief Set current time value for each time type in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Timetype: Time Type, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @param[in] TimeValue Time value to set + * @return None + **********************************************************************/ +void RTC_SetTime (LPC_RTC_TypeDef *RTCx, uint32_t Timetype, uint32_t TimeValue) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_TIMETYPE(Timetype)); + + switch ( Timetype) + { + case RTC_TIMETYPE_SECOND: + CHECK_PARAM(TimeValue <= RTC_SECOND_MAX); + + RTCx->SEC = TimeValue & RTC_SEC_MASK; + break; + + case RTC_TIMETYPE_MINUTE: + CHECK_PARAM(TimeValue <= RTC_MINUTE_MAX); + + RTCx->MIN = TimeValue & RTC_MIN_MASK; + break; + + case RTC_TIMETYPE_HOUR: + CHECK_PARAM(TimeValue <= RTC_HOUR_MAX); + + RTCx->HOUR = TimeValue & RTC_HOUR_MASK; + break; + + case RTC_TIMETYPE_DAYOFWEEK: + CHECK_PARAM(TimeValue <= RTC_DAYOFWEEK_MAX); + + RTCx->DOW = TimeValue & RTC_DOW_MASK; + break; + + case RTC_TIMETYPE_DAYOFMONTH: + CHECK_PARAM((TimeValue <= RTC_DAYOFMONTH_MAX) \ + && (TimeValue >= RTC_DAYOFMONTH_MIN)); + + RTCx->DOM = TimeValue & RTC_DOM_MASK; + break; + + case RTC_TIMETYPE_DAYOFYEAR: + CHECK_PARAM((TimeValue >= RTC_DAYOFYEAR_MIN) \ + && (TimeValue <= RTC_DAYOFYEAR_MAX)); + + RTCx->DOY = TimeValue & RTC_DOY_MASK; + break; + + case RTC_TIMETYPE_MONTH: + CHECK_PARAM((TimeValue >= RTC_MONTH_MIN) \ + && (TimeValue <= RTC_MONTH_MAX)); + + RTCx->MONTH = TimeValue & RTC_MONTH_MASK; + break; + + case RTC_TIMETYPE_YEAR: + CHECK_PARAM(TimeValue <= RTC_YEAR_MAX); + + RTCx->YEAR = TimeValue & RTC_YEAR_MASK; + break; + } +} + +/*********************************************************************//** + * @brief Get current time value for each type time type + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Timetype: Time Type, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @return Value of time according to specified time type + **********************************************************************/ +uint32_t RTC_GetTime(LPC_RTC_TypeDef *RTCx, uint32_t Timetype) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_TIMETYPE(Timetype)); + + switch (Timetype) + { + case RTC_TIMETYPE_SECOND: + return (RTCx->SEC & RTC_SEC_MASK); + case RTC_TIMETYPE_MINUTE: + return (RTCx->MIN & RTC_MIN_MASK); + case RTC_TIMETYPE_HOUR: + return (RTCx->HOUR & RTC_HOUR_MASK); + case RTC_TIMETYPE_DAYOFWEEK: + return (RTCx->DOW & RTC_DOW_MASK); + case RTC_TIMETYPE_DAYOFMONTH: + return (RTCx->DOM & RTC_DOM_MASK); + case RTC_TIMETYPE_DAYOFYEAR: + return (RTCx->DOY & RTC_DOY_MASK); + case RTC_TIMETYPE_MONTH: + return (RTCx->MONTH & RTC_MONTH_MASK); + case RTC_TIMETYPE_YEAR: + return (RTCx->YEAR & RTC_YEAR_MASK); + default: + return (0); + } +} + + +/*********************************************************************//** + * @brief Set full of time in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] pFullTime Pointer to a RTC_TIME_Type structure that + * contains time value in full. + * @return None + **********************************************************************/ +void RTC_SetFullTime (LPC_RTC_TypeDef *RTCx, RTC_TIME_Type *pFullTime) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + RTCx->DOM = pFullTime->DOM & RTC_DOM_MASK; + RTCx->DOW = pFullTime->DOW & RTC_DOW_MASK; + RTCx->DOY = pFullTime->DOY & RTC_DOY_MASK; + RTCx->HOUR = pFullTime->HOUR & RTC_HOUR_MASK; + RTCx->MIN = pFullTime->MIN & RTC_MIN_MASK; + RTCx->SEC = pFullTime->SEC & RTC_SEC_MASK; + RTCx->MONTH = pFullTime->MONTH & RTC_MONTH_MASK; + RTCx->YEAR = pFullTime->YEAR & RTC_YEAR_MASK; +} + + +/*********************************************************************//** + * @brief Get full of time in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] pFullTime Pointer to a RTC_TIME_Type structure that + * will be stored time in full. + * @return None + **********************************************************************/ +void RTC_GetFullTime (LPC_RTC_TypeDef *RTCx, RTC_TIME_Type *pFullTime) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + pFullTime->DOM = RTCx->DOM & RTC_DOM_MASK; + pFullTime->DOW = RTCx->DOW & RTC_DOW_MASK; + pFullTime->DOY = RTCx->DOY & RTC_DOY_MASK; + pFullTime->HOUR = RTCx->HOUR & RTC_HOUR_MASK; + pFullTime->MIN = RTCx->MIN & RTC_MIN_MASK; + pFullTime->SEC = RTCx->SEC & RTC_SEC_MASK; + pFullTime->MONTH = RTCx->MONTH & RTC_MONTH_MASK; + pFullTime->YEAR = RTCx->YEAR & RTC_YEAR_MASK; +} + + +/*********************************************************************//** + * @brief Set alarm time value for each time type + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Timetype: Time Type, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @param[in] ALValue Alarm time value to set + * @return None + **********************************************************************/ +void RTC_SetAlarmTime (LPC_RTC_TypeDef *RTCx, uint32_t Timetype, uint32_t ALValue) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + switch (Timetype) + { + case RTC_TIMETYPE_SECOND: + CHECK_PARAM(ALValue <= RTC_SECOND_MAX); + + RTCx->ALSEC = ALValue & RTC_SEC_MASK; + break; + + case RTC_TIMETYPE_MINUTE: + CHECK_PARAM(ALValue <= RTC_MINUTE_MAX); + + RTCx->ALMIN = ALValue & RTC_MIN_MASK; + break; + + case RTC_TIMETYPE_HOUR: + CHECK_PARAM(ALValue <= RTC_HOUR_MAX); + + RTCx->ALHOUR = ALValue & RTC_HOUR_MASK; + break; + + case RTC_TIMETYPE_DAYOFWEEK: + CHECK_PARAM(ALValue <= RTC_DAYOFWEEK_MAX); + + RTCx->ALDOW = ALValue & RTC_DOW_MASK; + break; + + case RTC_TIMETYPE_DAYOFMONTH: + CHECK_PARAM((ALValue <= RTC_DAYOFMONTH_MAX) \ + && (ALValue >= RTC_DAYOFMONTH_MIN)); + + RTCx->ALDOM = ALValue & RTC_DOM_MASK; + break; + + case RTC_TIMETYPE_DAYOFYEAR: + CHECK_PARAM((ALValue >= RTC_DAYOFYEAR_MIN) \ + && (ALValue <= RTC_DAYOFYEAR_MAX)); + + RTCx->ALDOY = ALValue & RTC_DOY_MASK; + break; + + case RTC_TIMETYPE_MONTH: + CHECK_PARAM((ALValue >= RTC_MONTH_MIN) \ + && (ALValue <= RTC_MONTH_MAX)); + + RTCx->ALMON = ALValue & RTC_MONTH_MASK; + break; + + case RTC_TIMETYPE_YEAR: + CHECK_PARAM(ALValue <= RTC_YEAR_MAX); + + RTCx->ALYEAR = ALValue & RTC_YEAR_MASK; + break; + } +} + + + +/*********************************************************************//** + * @brief Get alarm time value for each time type + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Timetype: Time Type, should be: + * - RTC_TIMETYPE_SECOND + * - RTC_TIMETYPE_MINUTE + * - RTC_TIMETYPE_HOUR + * - RTC_TIMETYPE_DAYOFWEEK + * - RTC_TIMETYPE_DAYOFMONTH + * - RTC_TIMETYPE_DAYOFYEAR + * - RTC_TIMETYPE_MONTH + * - RTC_TIMETYPE_YEAR + * @return Value of Alarm time according to specified time type + **********************************************************************/ +uint32_t RTC_GetAlarmTime (LPC_RTC_TypeDef *RTCx, uint32_t Timetype) +{ + switch (Timetype) + { + case RTC_TIMETYPE_SECOND: + return (RTCx->ALSEC & RTC_SEC_MASK); + case RTC_TIMETYPE_MINUTE: + return (RTCx->ALMIN & RTC_MIN_MASK); + case RTC_TIMETYPE_HOUR: + return (RTCx->ALHOUR & RTC_HOUR_MASK); + case RTC_TIMETYPE_DAYOFWEEK: + return (RTCx->ALDOW & RTC_DOW_MASK); + case RTC_TIMETYPE_DAYOFMONTH: + return (RTCx->ALDOM & RTC_DOM_MASK); + case RTC_TIMETYPE_DAYOFYEAR: + return (RTCx->ALDOY & RTC_DOY_MASK); + case RTC_TIMETYPE_MONTH: + return (RTCx->ALMON & RTC_MONTH_MASK); + case RTC_TIMETYPE_YEAR: + return (RTCx->ALYEAR & RTC_YEAR_MASK); + default: + return (0); + } +} + + +/*********************************************************************//** + * @brief Set full of alarm time in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] pFullTime Pointer to a RTC_TIME_Type structure that + * contains alarm time value in full. + * @return None + **********************************************************************/ +void RTC_SetFullAlarmTime (LPC_RTC_TypeDef *RTCx, RTC_TIME_Type *pFullTime) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + RTCx->ALDOM = pFullTime->DOM & RTC_DOM_MASK; + RTCx->ALDOW = pFullTime->DOW & RTC_DOW_MASK; + RTCx->ALDOY = pFullTime->DOY & RTC_DOY_MASK; + RTCx->ALHOUR = pFullTime->HOUR & RTC_HOUR_MASK; + RTCx->ALMIN = pFullTime->MIN & RTC_MIN_MASK; + RTCx->ALSEC = pFullTime->SEC & RTC_SEC_MASK; + RTCx->ALMON = pFullTime->MONTH & RTC_MONTH_MASK; + RTCx->ALYEAR = pFullTime->YEAR & RTC_YEAR_MASK; +} + + +/*********************************************************************//** + * @brief Get full of alarm time in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] pFullTime Pointer to a RTC_TIME_Type structure that + * will be stored alarm time in full. + * @return None + **********************************************************************/ +void RTC_GetFullAlarmTime (LPC_RTC_TypeDef *RTCx, RTC_TIME_Type *pFullTime) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + + pFullTime->DOM = RTCx->ALDOM & RTC_DOM_MASK; + pFullTime->DOW = RTCx->ALDOW & RTC_DOW_MASK; + pFullTime->DOY = RTCx->ALDOY & RTC_DOY_MASK; + pFullTime->HOUR = RTCx->ALHOUR & RTC_HOUR_MASK; + pFullTime->MIN = RTCx->ALMIN & RTC_MIN_MASK; + pFullTime->SEC = RTCx->ALSEC & RTC_SEC_MASK; + pFullTime->MONTH = RTCx->ALMON & RTC_MONTH_MASK; + pFullTime->YEAR = RTCx->ALYEAR & RTC_YEAR_MASK; +} + + +/*********************************************************************//** + * @brief Check whether if specified Location interrupt in + * RTC peripheral is set or not + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] IntType Interrupt location type, should be: + * - RTC_INT_COUNTER_INCREASE: Counter Increment Interrupt + * block generated an interrupt. + * - RTC_INT_ALARM: Alarm generated an + * interrupt. + * @return New state of specified Location interrupt in RTC peripheral + * (SET or RESET) + **********************************************************************/ +IntStatus RTC_GetIntPending (LPC_RTC_TypeDef *RTCx, uint32_t IntType) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_INT(IntType)); + + return ((RTCx->ILR & IntType) ? SET : RESET); +} + + +/*********************************************************************//** + * @brief Clear specified Location interrupt pending in + * RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] IntType Interrupt location type, should be: + * - RTC_INT_COUNTER_INCREASE: Clear Counter Increment + * Interrupt pending. + * - RTC_INT_ALARM: Clear alarm interrupt pending + * @return None + **********************************************************************/ +void RTC_ClearIntPending (LPC_RTC_TypeDef *RTCx, uint32_t IntType) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_INT(IntType)); + + RTCx->ILR |= IntType; +} + +/*********************************************************************//** + * @brief Enable/Disable calibration counter in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] NewState New State of this function, should be: + * - ENABLE: The calibration counter is enabled and counting + * - DISABLE: The calibration counter is disabled and reset to zero + * @return None + **********************************************************************/ +void RTC_CalibCounterCmd(LPC_RTC_TypeDef *RTCx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + RTCx->CCR &= (~RTC_CCR_CCALEN) & RTC_CCR_BITMASK; + } + else + { + RTCx->CCR |= RTC_CCR_CCALEN; + } +} + + +/*********************************************************************//** + * @brief Configures Calibration in RTC peripheral + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] CalibValue Calibration value, should be in range from + * 0 to 131,072 + * @param[in] CalibDir Calibration Direction, should be: + * - RTC_CALIB_DIR_FORWARD: Forward calibration + * - RTC_CALIB_DIR_BACKWARD: Backward calibration + * @return None + **********************************************************************/ +void RTC_CalibConfig(LPC_RTC_TypeDef *RTCx, uint32_t CalibValue, uint8_t CalibDir) +{ + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_CALIB_DIR(CalibDir)); + CHECK_PARAM(CalibValue < RTC_CALIBRATION_MAX); + + RTCx->CALIBRATION = ((CalibValue) & RTC_CALIBRATION_CALVAL_MASK) \ + | ((CalibDir == RTC_CALIB_DIR_BACKWARD) ? RTC_CALIBRATION_LIBDIR : 0); +} + + +/*********************************************************************//** + * @brief Write value to General purpose registers + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Channel General purpose registers Channel number, + * should be in range from 0 to 4. + * @param[in] Value Value to write + * @return None + * Note: These General purpose registers can be used to store important + * information when the main power supply is off. The value in these + * registers is not affected by chip reset. + **********************************************************************/ +void RTC_WriteGPREG (LPC_RTC_TypeDef *RTCx, uint8_t Channel, uint32_t Value) +{ + uint32_t *preg; + + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_GPREG_CH(Channel)); + + preg = (uint32_t *)&RTCx->GPREG0; + preg += Channel; + *preg = Value; +} + + +/*********************************************************************//** + * @brief Read value from General purpose registers + * @param[in] RTCx RTC peripheral selected, should be LPC_RTC + * @param[in] Channel General purpose registers Channel number, + * should be in range from 0 to 4. + * @return Read Value + * Note: These General purpose registers can be used to store important + * information when the main power supply is off. The value in these + * registers is not affected by chip reset. + **********************************************************************/ +uint32_t RTC_ReadGPREG (LPC_RTC_TypeDef *RTCx, uint8_t Channel) +{ + uint32_t *preg; + uint32_t value; + + CHECK_PARAM(PARAM_RTCx(RTCx)); + CHECK_PARAM(PARAM_RTC_GPREG_CH(Channel)); + + preg = (uint32_t *)&RTCx->GPREG0; + preg += Channel; + value = *preg; + return (value); +} + +/** + * @} + */ + +#endif /* _RTC */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_spi.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_spi.c new file mode 100644 index 0000000000..a690b39fc9 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_spi.c @@ -0,0 +1,443 @@ +/********************************************************************** +* $Id$ lpc17xx_spi.c 2010-05-21 +*//** +* @file lpc17xx_spi.c +* @brief Contains all functions support for SPI firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup SPI + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_spi.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + +#ifdef _SPI + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup SPI_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Setup clock rate for SPI device + * @param[in] SPIx SPI peripheral definition, should be LPC_SPI + * @param[in] target_clock : clock of SPI (Hz) + * @return None + ***********************************************************************/ +void SPI_SetClock (LPC_SPI_TypeDef *SPIx, uint32_t target_clock) +{ + uint32_t spi_pclk; + uint32_t prescale, temp; + + CHECK_PARAM(PARAM_SPIx(SPIx)); + + if (SPIx == LPC_SPI){ + spi_pclk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SPI); + } else { + return; + } + + prescale = 8; + // Find closest clock to target clock + while (1){ + temp = target_clock * prescale; + if (temp >= spi_pclk){ + break; + } + prescale += 2; + if(prescale >= 254){ + break; + } + } + + // Write to register + SPIx->SPCCR = SPI_SPCCR_COUNTER(prescale); +} + + +/*********************************************************************//** + * @brief De-initializes the SPIx peripheral registers to their +* default reset values. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return None + **********************************************************************/ +void SPI_DeInit(LPC_SPI_TypeDef *SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + if (SPIx == LPC_SPI){ + /* Set up clock and power for SPI module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSPI, DISABLE); + } +} + +/*********************************************************************//** + * @brief Get data bit size per transfer + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return number of bit per transfer, could be 8-16 + **********************************************************************/ +uint8_t SPI_GetDataSize (LPC_SPI_TypeDef *SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + return ((SPIx->SPCR)>>8 & 0xF); +} + +/********************************************************************//** + * @brief Initializes the SPIx peripheral according to the specified +* parameters in the UART_ConfigStruct. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @param[in] SPI_ConfigStruct Pointer to a SPI_CFG_Type structure +* that contains the configuration information for the +* specified SPI peripheral. + * @return None + *********************************************************************/ +void SPI_Init(LPC_SPI_TypeDef *SPIx, SPI_CFG_Type *SPI_ConfigStruct) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_SPIx(SPIx)); + + if(SPIx == LPC_SPI){ + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSPI, ENABLE); + } else { + return; + } + + // Configure SPI, interrupt is disable as default + tmp = ((SPI_ConfigStruct->CPHA) | (SPI_ConfigStruct->CPOL) \ + | (SPI_ConfigStruct->DataOrder) | (SPI_ConfigStruct->Databit) \ + | (SPI_ConfigStruct->Mode) | SPI_SPCR_BIT_EN) & SPI_SPCR_BITMASK; + // write back to SPI control register + SPIx->SPCR = tmp; + + // Set clock rate for SPI peripheral + SPI_SetClock(SPIx, SPI_ConfigStruct->ClockRate); + + // If interrupt flag is set, Write '1' to Clear interrupt flag + if (SPIx->SPINT & SPI_SPINT_INTFLAG){ + SPIx->SPINT = SPI_SPINT_INTFLAG; + } +} + + + +/*****************************************************************************//** +* @brief Fills each SPI_InitStruct member with its default value: +* - CPHA = SPI_CPHA_FIRST +* - CPOL = SPI_CPOL_HI +* - ClockRate = 1000000 +* - DataOrder = SPI_DATA_MSB_FIRST +* - Databit = SPI_DATABIT_8 +* - Mode = SPI_MASTER_MODE +* @param[in] SPI_InitStruct Pointer to a SPI_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void SPI_ConfigStructInit(SPI_CFG_Type *SPI_InitStruct) +{ + SPI_InitStruct->CPHA = SPI_CPHA_FIRST; + SPI_InitStruct->CPOL = SPI_CPOL_HI; + SPI_InitStruct->ClockRate = 1000000; + SPI_InitStruct->DataOrder = SPI_DATA_MSB_FIRST; + SPI_InitStruct->Databit = SPI_DATABIT_8; + SPI_InitStruct->Mode = SPI_MASTER_MODE; +} + +/*********************************************************************//** + * @brief Transmit a single data through SPIx peripheral + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @param[in] Data Data to transmit (must be 16 or 8-bit long, + * this depend on SPI data bit number configured) + * @return none + **********************************************************************/ +void SPI_SendData(LPC_SPI_TypeDef* SPIx, uint16_t Data) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + SPIx->SPDR = Data & SPI_SPDR_BITMASK; +} + + + +/*********************************************************************//** + * @brief Receive a single data from SPIx peripheral + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return Data received (16-bit long) + **********************************************************************/ +uint16_t SPI_ReceiveData(LPC_SPI_TypeDef* SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + return ((uint16_t) (SPIx->SPDR & SPI_SPDR_BITMASK)); +} + +/*********************************************************************//** + * @brief SPI Read write data function + * @param[in] SPIx Pointer to SPI peripheral, should be LPC_SPI + * @param[in] dataCfg Pointer to a SPI_DATA_SETUP_Type structure that + * contains specified information about transmit + * data configuration. + * @param[in] xfType Transfer type, should be: + * - SPI_TRANSFER_POLLING: Polling mode + * - SPI_TRANSFER_INTERRUPT: Interrupt mode + * @return Actual Data length has been transferred in polling mode. + * In interrupt mode, always return (0) + * Return (-1) if error. + * Note: This function can be used in both master and slave mode. + ***********************************************************************/ +int32_t SPI_ReadWrite (LPC_SPI_TypeDef *SPIx, SPI_DATA_SETUP_Type *dataCfg, \ + SPI_TRANSFER_Type xfType) +{ + uint8_t *rdata8; + uint8_t *wdata8; + uint16_t *rdata16; + uint16_t *wdata16; + uint32_t stat; + uint32_t temp; + uint8_t dataword; + + //read for empty buffer + temp = SPIx->SPDR; + //dummy to clear status + temp = SPIx->SPSR; + dataCfg->counter = 0; + dataCfg->status = 0; + + if(SPI_GetDataSize (SPIx) == 8) + dataword = 0; + else dataword = 1; + if (xfType == SPI_TRANSFER_POLLING){ + + if (dataword == 0){ + rdata8 = (uint8_t *)dataCfg->rx_data; + wdata8 = (uint8_t *)dataCfg->tx_data; + } else { + rdata16 = (uint16_t *)dataCfg->rx_data; + wdata16 = (uint16_t *)dataCfg->tx_data; + } + + while(dataCfg->counter < dataCfg->length) + { + // Write data to buffer + if(dataCfg->tx_data == NULL){ + if (dataword == 0){ + SPI_SendData(SPIx, 0xFF); + } else { + SPI_SendData(SPIx, 0xFFFF); + } + } else { + if (dataword == 0){ + SPI_SendData(SPIx, *wdata8); + wdata8++; + } else { + SPI_SendData(SPIx, *wdata16); + wdata16++; + } + } + // Wait for transfer complete + while (!((stat = SPIx->SPSR) & SPI_SPSR_SPIF)); + // Check for error + if (stat & (SPI_SPSR_ABRT | SPI_SPSR_MODF | SPI_SPSR_ROVR | SPI_SPSR_WCOL)){ + // save status + dataCfg->status = stat | SPI_STAT_ERROR; + return (dataCfg->counter); + } + // Read data from SPI dat + temp = (uint32_t) SPI_ReceiveData(SPIx); + + // Store data to destination + if (dataCfg->rx_data != NULL) + { + if (dataword == 0){ + *(rdata8) = (uint8_t) temp; + rdata8++; + } else { + *(rdata16) = (uint16_t) temp; + rdata16++; + } + } + // Increase counter + if (dataword == 0){ + dataCfg->counter++; + } else { + dataCfg->counter += 2; + } + } + + // Return length of actual data transferred + // save status + dataCfg->status = stat | SPI_STAT_DONE; + return (dataCfg->counter); + } + // Interrupt mode + else { + + // Check if interrupt flag is already set + if(SPIx->SPINT & SPI_SPINT_INTFLAG){ + SPIx->SPINT = SPI_SPINT_INTFLAG; + } + if (dataCfg->counter < dataCfg->length){ + // Write data to buffer + if(dataCfg->tx_data == NULL){ + if (dataword == 0){ + SPI_SendData(SPIx, 0xFF); + } else { + SPI_SendData(SPIx, 0xFFFF); + } + } else { + if (dataword == 0){ + SPI_SendData(SPIx, (*(uint8_t *)dataCfg->tx_data)); + } else { + SPI_SendData(SPIx, (*(uint16_t *)dataCfg->tx_data)); + } + } + SPI_IntCmd(SPIx, ENABLE); + } else { + // Save status + dataCfg->status = SPI_STAT_DONE; + } + return (0); + } +} + + +/********************************************************************//** + * @brief Enable or disable SPIx interrupt. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @param[in] NewState New state of specified UART interrupt type, + * should be: + * - ENALBE: Enable this SPI interrupt. +* - DISALBE: Disable this SPI interrupt. + * @return None + *********************************************************************/ +void SPI_IntCmd(LPC_SPI_TypeDef *SPIx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SPIx->SPCR |= SPI_SPCR_SPIE; + } + else + { + SPIx->SPCR &= (~SPI_SPCR_SPIE) & SPI_SPCR_BITMASK; + } +} + + +/********************************************************************//** + * @brief Checks whether the SPI interrupt flag is set or not. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return The new state of SPI Interrupt Flag (SET or RESET) + *********************************************************************/ +IntStatus SPI_GetIntStatus (LPC_SPI_TypeDef *SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + return ((SPIx->SPINT & SPI_SPINT_INTFLAG) ? SET : RESET); +} + +/********************************************************************//** + * @brief Clear SPI interrupt flag. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return None + *********************************************************************/ +void SPI_ClearIntPending(LPC_SPI_TypeDef *SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + SPIx->SPINT = SPI_SPINT_INTFLAG; +} + +/********************************************************************//** + * @brief Get current value of SPI Status register in SPIx peripheral. + * @param[in] SPIx SPI peripheral selected, should be LPC_SPI + * @return Current value of SPI Status register in SPI peripheral. + * Note: The return value of this function must be used with + * SPI_CheckStatus() to determine current flag status + * corresponding to each SPI status type. Because some flags in + * SPI Status register will be cleared after reading, the next reading + * SPI Status register could not be correct. So this function used to + * read SPI status register in one time only, then the return value + * used to check all flags. + *********************************************************************/ +uint32_t SPI_GetStatus(LPC_SPI_TypeDef* SPIx) +{ + CHECK_PARAM(PARAM_SPIx(SPIx)); + + return (SPIx->SPSR & SPI_SPSR_BITMASK); +} + +/********************************************************************//** + * @brief Checks whether the specified SPI Status flag is set or not + * via inputSPIStatus parameter. + * @param[in] inputSPIStatus Value to check status of each flag type. + * This value is the return value from SPI_GetStatus(). + * @param[in] SPIStatus Specifies the SPI status flag to check, + * should be one of the following: + - SPI_STAT_ABRT: Slave abort. + - SPI_STAT_MODF: Mode fault. + - SPI_STAT_ROVR: Read overrun. + - SPI_STAT_WCOL: Write collision. + - SPI_STAT_SPIF: SPI transfer complete. + * @return The new state of SPIStatus (SET or RESET) + *********************************************************************/ +FlagStatus SPI_CheckStatus (uint32_t inputSPIStatus, uint8_t SPIStatus) +{ + CHECK_PARAM(PARAM_SPI_STAT(SPIStatus)); + + return ((inputSPIStatus & SPIStatus) ? SET : RESET); +} + + +/** + * @} + */ + +#endif /* _SPI */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_ssp.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_ssp.c new file mode 100644 index 0000000000..a5f0c645bd --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_ssp.c @@ -0,0 +1,694 @@ +/********************************************************************** +* $Id$ lpc17xx_ssp.c 2010-06-18 +*//** +* @file lpc17xx_ssp.c +* @brief Contains all functions support for SSP firmware library on LPC17xx +* @version 3.0 +* @date 18. June. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup SSP + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_ssp.h" +#include "lpc17xx_clkpwr.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _SSP + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup SSP_Public_Functions + * @{ + */ +static void setSSPclock (LPC_SSP_TypeDef *SSPx, uint32_t target_clock); + +/*********************************************************************//** + * @brief Setup clock rate for SSP device + * @param[in] SSPx SSP peripheral definition, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] target_clock : clock of SSP (Hz) + * @return None + ***********************************************************************/ +static void setSSPclock (LPC_SSP_TypeDef *SSPx, uint32_t target_clock) +{ + uint32_t prescale, cr0_div, cmp_clk, ssp_clk; + + CHECK_PARAM(PARAM_SSPx(SSPx)); + + /* The SSP clock is derived from the (main system oscillator / 2), + so compute the best divider from that clock */ + if (SSPx == LPC_SSP0){ + ssp_clk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SSP0); + } else if (SSPx == LPC_SSP1) { + ssp_clk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_SSP1); + } else { + return; + } + + /* Find closest divider to get at or under the target frequency. + Use smallest prescale possible and rely on the divider to get + the closest target frequency */ + cr0_div = 0; + cmp_clk = 0xFFFFFFFF; + prescale = 2; + while (cmp_clk > target_clock) + { + cmp_clk = ssp_clk / ((cr0_div + 1) * prescale); + if (cmp_clk > target_clock) + { + cr0_div++; + if (cr0_div > 0xFF) + { + cr0_div = 0; + prescale += 2; + } + } + } + + /* Write computed prescaler and divider back to register */ + SSPx->CR0 &= (~SSP_CR0_SCR(0xFF)) & SSP_CR0_BITMASK; + SSPx->CR0 |= (SSP_CR0_SCR(cr0_div)) & SSP_CR0_BITMASK; + SSPx->CPSR = prescale & SSP_CPSR_BITMASK; +} + +/** + * @} + */ + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup SSP_Public_Functions + * @{ + */ + +/********************************************************************//** + * @brief Initializes the SSPx peripheral according to the specified +* parameters in the SSP_ConfigStruct. + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] SSP_ConfigStruct Pointer to a SSP_CFG_Type structure +* that contains the configuration information for the +* specified SSP peripheral. + * @return None + *********************************************************************/ +void SSP_Init(LPC_SSP_TypeDef *SSPx, SSP_CFG_Type *SSP_ConfigStruct) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_SSPx(SSPx)); + + if(SSPx == LPC_SSP0) { + /* Set up clock and power for SSP0 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP0, ENABLE); + } else if(SSPx == LPC_SSP1) { + /* Set up clock and power for SSP1 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP1, ENABLE); + } else { + return; + } + + /* Configure SSP, interrupt is disable, LoopBack mode is disable, + * SSP is disable, Slave output is disable as default + */ + tmp = ((SSP_ConfigStruct->CPHA) | (SSP_ConfigStruct->CPOL) \ + | (SSP_ConfigStruct->FrameFormat) | (SSP_ConfigStruct->Databit)) + & SSP_CR0_BITMASK; + // write back to SSP control register + SSPx->CR0 = tmp; + + tmp = SSP_ConfigStruct->Mode & SSP_CR1_BITMASK; + // Write back to CR1 + SSPx->CR1 = tmp; + + // Set clock rate for SSP peripheral + setSSPclock(SSPx, SSP_ConfigStruct->ClockRate); +} + +/*********************************************************************//** + * @brief De-initializes the SSPx peripheral registers to their +* default reset values. + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @return None + **********************************************************************/ +void SSP_DeInit(LPC_SSP_TypeDef* SSPx) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + + if (SSPx == LPC_SSP0){ + /* Set up clock and power for SSP0 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP0, DISABLE); + } else if (SSPx == LPC_SSP1) { + /* Set up clock and power for SSP1 module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCSSP1, DISABLE); + } +} + +/*****************************************************************************//** +* @brief Get data size bit selected +* @param[in] SSPx pointer to LPC_SSP_TypeDef structure, should be: +* - LPC_SSP0: SSP0 peripheral +* - LPC_SSP1: SSP1 peripheral +* @return Data size, could be: +* - SSP_DATABIT_4: 4 bit transfer +* - SSP_DATABIT_5: 5 bit transfer +* ... +* - SSP_DATABIT_16: 16 bit transfer +*******************************************************************************/ +uint8_t SSP_GetDataSize(LPC_SSP_TypeDef* SSPx) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + return (SSPx->CR0 & (0xF)); +} + +/*****************************************************************************//** +* @brief Fills each SSP_InitStruct member with its default value: +* - CPHA = SSP_CPHA_FIRST +* - CPOL = SSP_CPOL_HI +* - ClockRate = 1000000 +* - Databit = SSP_DATABIT_8 +* - Mode = SSP_MASTER_MODE +* - FrameFormat = SSP_FRAME_SSP +* @param[in] SSP_InitStruct Pointer to a SSP_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void SSP_ConfigStructInit(SSP_CFG_Type *SSP_InitStruct) +{ + SSP_InitStruct->CPHA = SSP_CPHA_FIRST; + SSP_InitStruct->CPOL = SSP_CPOL_HI; + SSP_InitStruct->ClockRate = 1000000; + SSP_InitStruct->Databit = SSP_DATABIT_8; + SSP_InitStruct->Mode = SSP_MASTER_MODE; + SSP_InitStruct->FrameFormat = SSP_FRAME_SPI; +} + + +/*********************************************************************//** + * @brief Enable or disable SSP peripheral's operation + * @param[in] SSPx SSP peripheral, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] NewState New State of SSPx peripheral's operation + * @return none + **********************************************************************/ +void SSP_Cmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SSPx->CR1 |= SSP_CR1_SSP_EN; + } + else + { + SSPx->CR1 &= (~SSP_CR1_SSP_EN) & SSP_CR1_BITMASK; + } +} + +/*********************************************************************//** + * @brief Enable or disable Loop Back mode function in SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] NewState New State of Loop Back mode, should be: + * - ENABLE: Enable this function + * - DISABLE: Disable this function + * @return None + **********************************************************************/ +void SSP_LoopBackCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SSPx->CR1 |= SSP_CR1_LBM_EN; + } + else + { + SSPx->CR1 &= (~SSP_CR1_LBM_EN) & SSP_CR1_BITMASK; + } +} + +/*********************************************************************//** + * @brief Enable or disable Slave Output function in SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] NewState New State of Slave Output function, should be: + * - ENABLE: Slave Output in normal operation + * - DISABLE: Slave Output is disabled. This blocks + * SSP controller from driving the transmit data + * line (MISO) + * Note: This function is available when SSP peripheral in Slave mode + * @return None + **********************************************************************/ +void SSP_SlaveOutputCmd(LPC_SSP_TypeDef* SSPx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SSPx->CR1 &= (~SSP_CR1_SO_DISABLE) & SSP_CR1_BITMASK; + } + else + { + SSPx->CR1 |= SSP_CR1_SO_DISABLE; + } +} + + + +/*********************************************************************//** + * @brief Transmit a single data through SSPx peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] Data Data to transmit (must be 16 or 8-bit long, + * this depend on SSP data bit number configured) + * @return none + **********************************************************************/ +void SSP_SendData(LPC_SSP_TypeDef* SSPx, uint16_t Data) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + + SSPx->DR = SSP_DR_BITMASK(Data); +} + + + +/*********************************************************************//** + * @brief Receive a single data from SSPx peripheral + * @param[in] SSPx SSP peripheral selected, should be + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @return Data received (16-bit long) + **********************************************************************/ +uint16_t SSP_ReceiveData(LPC_SSP_TypeDef* SSPx) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + + return ((uint16_t) (SSP_DR_BITMASK(SSPx->DR))); +} + +/*********************************************************************//** + * @brief SSP Read write data function + * @param[in] SSPx Pointer to SSP peripheral, should be + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] dataCfg Pointer to a SSP_DATA_SETUP_Type structure that + * contains specified information about transmit + * data configuration. + * @param[in] xfType Transfer type, should be: + * - SSP_TRANSFER_POLLING: Polling mode + * - SSP_TRANSFER_INTERRUPT: Interrupt mode + * @return Actual Data length has been transferred in polling mode. + * In interrupt mode, always return (0) + * Return (-1) if error. + * Note: This function can be used in both master and slave mode. + ***********************************************************************/ +int32_t SSP_ReadWrite (LPC_SSP_TypeDef *SSPx, SSP_DATA_SETUP_Type *dataCfg, \ + SSP_TRANSFER_Type xfType) +{ + uint8_t *rdata8; + uint8_t *wdata8; + uint16_t *rdata16; + uint16_t *wdata16; + uint32_t stat; + uint32_t tmp; + int32_t dataword; + + dataCfg->rx_cnt = 0; + dataCfg->tx_cnt = 0; + dataCfg->status = 0; + + + /* Clear all remaining data in RX FIFO */ + while (SSPx->SR & SSP_SR_RNE){ + tmp = (uint32_t) SSP_ReceiveData(SSPx); + } + + // Clear status + SSPx->ICR = SSP_ICR_BITMASK; + if(SSP_GetDataSize(SSPx)>SSP_DATABIT_8) + dataword = 1; + else dataword = 0; + + // Polling mode ---------------------------------------------------------------------- + if (xfType == SSP_TRANSFER_POLLING){ + if (dataword == 0){ + rdata8 = (uint8_t *)dataCfg->rx_data; + wdata8 = (uint8_t *)dataCfg->tx_data; + } else { + rdata16 = (uint16_t *)dataCfg->rx_data; + wdata16 = (uint16_t *)dataCfg->tx_data; + } + while ((dataCfg->tx_cnt < dataCfg->length) || (dataCfg->rx_cnt < dataCfg->length)){ + if ((SSPx->SR & SSP_SR_TNF) && (dataCfg->tx_cnt < dataCfg->length)){ + // Write data to buffer + if(dataCfg->tx_data == NULL){ + if (dataword == 0){ + SSP_SendData(SSPx, 0xFF); + dataCfg->tx_cnt++; + } else { + SSP_SendData(SSPx, 0xFFFF); + dataCfg->tx_cnt += 2; + } + } else { + if (dataword == 0){ + SSP_SendData(SSPx, *wdata8); + wdata8++; + dataCfg->tx_cnt++; + } else { + SSP_SendData(SSPx, *wdata16); + wdata16++; + dataCfg->tx_cnt += 2; + } + } + } + + // Check overrun error + if ((stat = SSPx->RIS) & SSP_RIS_ROR){ + // save status and return + dataCfg->status = stat | SSP_STAT_ERROR; + return (-1); + } + + // Check for any data available in RX FIFO + while ((SSPx->SR & SSP_SR_RNE) && (dataCfg->rx_cnt < dataCfg->length)){ + // Read data from SSP data + tmp = SSP_ReceiveData(SSPx); + + // Store data to destination + if (dataCfg->rx_data != NULL) + { + if (dataword == 0){ + *(rdata8) = (uint8_t) tmp; + rdata8++; + } else { + *(rdata16) = (uint16_t) tmp; + rdata16++; + } + } + // Increase counter + if (dataword == 0){ + dataCfg->rx_cnt++; + } else { + dataCfg->rx_cnt += 2; + } + } + } + + // save status + dataCfg->status = SSP_STAT_DONE; + + if (dataCfg->tx_data != NULL){ + return dataCfg->tx_cnt; + } else if (dataCfg->rx_data != NULL){ + return dataCfg->rx_cnt; + } else { + return (0); + } + } + + // Interrupt mode ---------------------------------------------------------------------- + else if (xfType == SSP_TRANSFER_INTERRUPT){ + + while ((SSPx->SR & SSP_SR_TNF) && (dataCfg->tx_cnt < dataCfg->length)){ + // Write data to buffer + if(dataCfg->tx_data == NULL){ + if (dataword == 0){ + SSP_SendData(SSPx, 0xFF); + dataCfg->tx_cnt++; + } else { + SSP_SendData(SSPx, 0xFFFF); + dataCfg->tx_cnt += 2; + } + } else { + if (dataword == 0){ + SSP_SendData(SSPx, (*(uint8_t *)((uint32_t)dataCfg->tx_data + dataCfg->tx_cnt))); + dataCfg->tx_cnt++; + } else { + SSP_SendData(SSPx, (*(uint16_t *)((uint32_t)dataCfg->tx_data + dataCfg->tx_cnt))); + dataCfg->tx_cnt += 2; + } + } + + // Check error + if ((stat = SSPx->RIS) & SSP_RIS_ROR){ + // save status and return + dataCfg->status = stat | SSP_STAT_ERROR; + return (-1); + } + + // Check for any data available in RX FIFO + while ((SSPx->SR & SSP_SR_RNE) && (dataCfg->rx_cnt < dataCfg->length)){ + // Read data from SSP data + tmp = SSP_ReceiveData(SSPx); + + // Store data to destination + if (dataCfg->rx_data != NULL) + { + if (dataword == 0){ + *(uint8_t *)((uint32_t)dataCfg->rx_data + dataCfg->rx_cnt) = (uint8_t) tmp; + } else { + *(uint16_t *)((uint32_t)dataCfg->rx_data + dataCfg->rx_cnt) = (uint16_t) tmp; + } + } + // Increase counter + if (dataword == 0){ + dataCfg->rx_cnt++; + } else { + dataCfg->rx_cnt += 2; + } + } + } + + // If there more data to sent or receive + if ((dataCfg->rx_cnt < dataCfg->length) || (dataCfg->tx_cnt < dataCfg->length)){ + // Enable all interrupt + SSPx->IMSC = SSP_IMSC_BITMASK; + } else { + // Save status + dataCfg->status = SSP_STAT_DONE; + } + return (0); + } + + return (-1); +} + +/*********************************************************************//** + * @brief Checks whether the specified SSP status flag is set or not + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] FlagType Type of flag to check status, should be one + * of following: + * - SSP_STAT_TXFIFO_EMPTY: TX FIFO is empty + * - SSP_STAT_TXFIFO_NOTFULL: TX FIFO is not full + * - SSP_STAT_RXFIFO_NOTEMPTY: RX FIFO is not empty + * - SSP_STAT_RXFIFO_FULL: RX FIFO is full + * - SSP_STAT_BUSY: SSP peripheral is busy + * @return New State of specified SSP status flag + **********************************************************************/ +FlagStatus SSP_GetStatus(LPC_SSP_TypeDef* SSPx, uint32_t FlagType) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_STAT(FlagType)); + + return ((SSPx->SR & FlagType) ? SET : RESET); +} + +/*********************************************************************//** + * @brief Enable or disable specified interrupt type in SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] IntType Interrupt type in SSP peripheral, should be: + * - SSP_INTCFG_ROR: Receive Overrun interrupt + * - SSP_INTCFG_RT: Receive Time out interrupt + * - SSP_INTCFG_RX: RX FIFO is at least half full interrupt + * - SSP_INTCFG_TX: TX FIFO is at least half empty interrupt + * @param[in] NewState New State of specified interrupt type, should be: + * - ENABLE: Enable this interrupt type + * - DISABLE: Disable this interrupt type + * @return None + * Note: We can enable/disable multi-interrupt type by OR multi value + **********************************************************************/ +void SSP_IntConfig(LPC_SSP_TypeDef *SSPx, uint32_t IntType, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + + if (NewState == ENABLE) + { + SSPx->IMSC |= IntType; + } + else + { + SSPx->IMSC &= (~IntType) & SSP_IMSC_BITMASK; + } +} + +/*********************************************************************//** + * @brief Check whether the specified Raw interrupt status flag is + * set or not + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] RawIntType Raw Interrupt Type, should be: + * - SSP_INTSTAT_RAW_ROR: Receive Overrun interrupt + * - SSP_INTSTAT_RAW_RT: Receive Time out interrupt + * - SSP_INTSTAT_RAW_RX: RX FIFO is at least half full interrupt + * - SSP_INTSTAT_RAW_TX: TX FIFO is at least half empty interrupt + * @return New State of specified Raw interrupt status flag in SSP peripheral + * Note: Enabling/Disabling specified interrupt in SSP peripheral does not + * effect to Raw Interrupt Status flag. + **********************************************************************/ +IntStatus SSP_GetRawIntStatus(LPC_SSP_TypeDef *SSPx, uint32_t RawIntType) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_INTSTAT_RAW(RawIntType)); + + return ((SSPx->RIS & RawIntType) ? SET : RESET); +} + +/*********************************************************************//** + * @brief Get Raw Interrupt Status register + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @return Raw Interrupt Status (RIS) register value + **********************************************************************/ +uint32_t SSP_GetRawIntStatusReg(LPC_SSP_TypeDef *SSPx) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + return (SSPx->RIS); +} + +/*********************************************************************//** + * @brief Check whether the specified interrupt status flag is + * set or not + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] IntType Raw Interrupt Type, should be: + * - SSP_INTSTAT_ROR: Receive Overrun interrupt + * - SSP_INTSTAT_RT: Receive Time out interrupt + * - SSP_INTSTAT_RX: RX FIFO is at least half full interrupt + * - SSP_INTSTAT_TX: TX FIFO is at least half empty interrupt + * @return New State of specified interrupt status flag in SSP peripheral + * Note: Enabling/Disabling specified interrupt in SSP peripheral effects + * to Interrupt Status flag. + **********************************************************************/ +IntStatus SSP_GetIntStatus (LPC_SSP_TypeDef *SSPx, uint32_t IntType) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_INTSTAT(IntType)); + + return ((SSPx->MIS & IntType) ? SET :RESET); +} + +/*********************************************************************//** + * @brief Clear specified interrupt pending in SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] IntType Interrupt pending to clear, should be: + * - SSP_INTCLR_ROR: clears the "frame was received when + * RxFIFO was full" interrupt. + * - SSP_INTCLR_RT: clears the "Rx FIFO was not empty and + * has not been read for a timeout period" interrupt. + * @return None + **********************************************************************/ +void SSP_ClearIntPending(LPC_SSP_TypeDef *SSPx, uint32_t IntType) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_INTCLR(IntType)); + + SSPx->ICR = IntType; +} + +/*********************************************************************//** + * @brief Enable/Disable DMA function for SSP peripheral + * @param[in] SSPx SSP peripheral selected, should be: + * - LPC_SSP0: SSP0 peripheral + * - LPC_SSP1: SSP1 peripheral + * @param[in] DMAMode Type of DMA, should be: + * - SSP_DMA_TX: DMA for the transmit FIFO + * - SSP_DMA_RX: DMA for the Receive FIFO + * @param[in] NewState New State of DMA function on SSP peripheral, + * should be: + * - ENALBE: Enable this function + * - DISABLE: Disable this function + * @return None + **********************************************************************/ +void SSP_DMACmd(LPC_SSP_TypeDef *SSPx, uint32_t DMAMode, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_SSPx(SSPx)); + CHECK_PARAM(PARAM_SSP_DMA(DMAMode)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + SSPx->DMACR |= DMAMode; + } + else + { + SSPx->DMACR &= (~DMAMode) & SSP_DMA_BITMASK; + } +} + +/** + * @} + */ + +#endif /* _SSP */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_systick.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_systick.c new file mode 100644 index 0000000000..bc10c1c6d5 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_systick.c @@ -0,0 +1,193 @@ +/********************************************************************** +* $Id$ lpc17xx_systick.c 2010-05-21 +*//** +* @file lpc17xx_systick.c +* @brief Contains all functions support for SYSTICK firmware library +* on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup SYSTICK + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_systick.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _SYSTICK + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup SYSTICK_Public_Functions + * @{ + */ +/*********************************************************************//** + * @brief Initial System Tick with using internal CPU clock source + * @param[in] time time interval(ms) + * @return None + **********************************************************************/ +void SYSTICK_InternalInit(uint32_t time) +{ + uint32_t cclk; + float maxtime; + + cclk = SystemCoreClock; + /* With internal CPU clock frequency for LPC17xx is 'SystemCoreClock' + * And limit 24 bit for RELOAD value + * So the maximum time can be set: + * 1/SystemCoreClock * (2^24) * 1000 (ms) + */ + //check time value is available or not + maxtime = (1<<24)/(SystemCoreClock / 1000); + if(time > maxtime) + //Error loop + while(1); + else + { + //Select CPU clock is System Tick clock source + SysTick->CTRL |= ST_CTRL_CLKSOURCE; + /* Set RELOAD value + * RELOAD = (SystemCoreClock/1000) * time - 1 + * with time base is millisecond + */ + SysTick->LOAD = (cclk/1000)*time - 1; + } +} + +/*********************************************************************//** + * @brief Initial System Tick with using external clock source + * @param[in] freq external clock frequency(Hz) + * @param[in] time time interval(ms) + * @return None + **********************************************************************/ +void SYSTICK_ExternalInit(uint32_t freq, uint32_t time) +{ + float maxtime; + + /* With external clock frequency for LPC17xx is 'freq' + * And limit 24 bit for RELOAD value + * So the maximum time can be set: + * 1/freq * (2^24) * 1000 (ms) + */ + //check time value is available or not + maxtime = (1<<24)/(freq / 1000); + if (time>maxtime) + //Error Loop + while(1); + else + { + //Select external clock is System Tick clock source + SysTick->CTRL &= ~ ST_CTRL_CLKSOURCE; + /* Set RELOAD value + * RELOAD = (freq/1000) * time - 1 + * with time base is millisecond + */ + maxtime = (freq/1000)*time - 1; + SysTick->LOAD = (freq/1000)*time - 1; + } +} + +/*********************************************************************//** + * @brief Enable/disable System Tick counter + * @param[in] NewState System Tick counter status, should be: + * - ENABLE + * - DISABLE + * @return None + **********************************************************************/ +void SYSTICK_Cmd(FunctionalState NewState) +{ + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if(NewState == ENABLE) + //Enable System Tick counter + SysTick->CTRL |= ST_CTRL_ENABLE; + else + //Disable System Tick counter + SysTick->CTRL &= ~ST_CTRL_ENABLE; +} + +/*********************************************************************//** + * @brief Enable/disable System Tick interrupt + * @param[in] NewState System Tick interrupt status, should be: + * - ENABLE + * - DISABLE + * @return None + **********************************************************************/ +void SYSTICK_IntCmd(FunctionalState NewState) +{ + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if(NewState == ENABLE) + //Enable System Tick counter + SysTick->CTRL |= ST_CTRL_TICKINT; + else + //Disable System Tick counter + SysTick->CTRL &= ~ST_CTRL_TICKINT; +} + +/*********************************************************************//** + * @brief Get current value of System Tick counter + * @param[in] None + * @return current value of System Tick counter + **********************************************************************/ +uint32_t SYSTICK_GetCurrentValue(void) +{ + return (SysTick->VAL); +} + +/*********************************************************************//** + * @brief Clear Counter flag + * @param[in] None + * @return None + **********************************************************************/ +void SYSTICK_ClearCounterFlag(void) +{ + SysTick->CTRL &= ~ST_CTRL_COUNTFLAG; +} +/** + * @} + */ + +#endif /* _SYSTICK */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_timer.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_timer.c new file mode 100644 index 0000000000..0e697dc3e5 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_timer.c @@ -0,0 +1,609 @@ +/********************************************************************** +* $Id$ lpc17xx_timer.c 2011-03-10 +*//** +* @file lpc17xx_timer.c +* @brief Contains all functions support for Timer firmware library +* on LPC17xx +* @version 3.1 +* @date 10. March. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup TIM + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_timer.h" +#include "lpc17xx_clkpwr.h" +#include "lpc17xx_pinsel.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + +#ifdef _TIM + +/* Private Functions ---------------------------------------------------------- */ + +static uint32_t getPClock (uint32_t timernum); +static uint32_t converUSecToVal (uint32_t timernum, uint32_t usec); +static uint32_t converPtrToTimeNum (LPC_TIM_TypeDef *TIMx); + + +/*********************************************************************//** + * @brief Get peripheral clock of each timer controller + * @param[in] timernum Timer number + * @return Peripheral clock of timer + **********************************************************************/ +static uint32_t getPClock (uint32_t timernum) +{ + uint32_t clkdlycnt; + switch (timernum) + { + case 0: + clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER0); + break; + + case 1: + clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER1); + break; + + case 2: + clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER2); + break; + + case 3: + clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER3); + break; + } + return clkdlycnt; +} + + +/*********************************************************************//** + * @brief Convert a time to a timer count value + * @param[in] timernum Timer number + * @param[in] usec Time in microseconds + * @return The number of required clock ticks to give the time delay + **********************************************************************/ +uint32_t converUSecToVal (uint32_t timernum, uint32_t usec) +{ + uint64_t clkdlycnt; + + // Get Pclock of timer + clkdlycnt = (uint64_t) getPClock(timernum); + + clkdlycnt = (clkdlycnt * usec) / 1000000; + return (uint32_t) clkdlycnt; +} + + +/*********************************************************************//** + * @brief Convert a timer register pointer to a timer number + * @param[in] TIMx Pointer to LPC_TIM_TypeDef, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @return The timer number (0 to 3) or 0xFFFF FFFF if register pointer is bad + **********************************************************************/ +uint32_t converPtrToTimeNum (LPC_TIM_TypeDef *TIMx) +{ + uint32_t tnum = 0xFFFFFFFF; + + if (TIMx == LPC_TIM0) + { + tnum = 0; + } + else if (TIMx == LPC_TIM1) + { + tnum = 1; + } + else if (TIMx == LPC_TIM2) + { + tnum = 2; + } + else if (TIMx == LPC_TIM3) + { + tnum = 3; + } + + return tnum; +} + +/* End of Private Functions ---------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup TIM_Public_Functions + * @{ + */ + +/*********************************************************************//** + * @brief Get Interrupt Status + * @param[in] TIMx Timer selection, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] IntFlag: interrupt type, should be: + * - TIM_MR0_INT: Interrupt for Match channel 0 + * - TIM_MR1_INT: Interrupt for Match channel 1 + * - TIM_MR2_INT: Interrupt for Match channel 2 + * - TIM_MR3_INT: Interrupt for Match channel 3 + * - TIM_CR0_INT: Interrupt for Capture channel 0 + * - TIM_CR1_INT: Interrupt for Capture channel 1 + * @return FlagStatus + * - SET : interrupt + * - RESET : no interrupt + **********************************************************************/ +FlagStatus TIM_GetIntStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) +{ + uint8_t temp; + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); + temp = (TIMx->IR)& TIM_IR_CLR(IntFlag); + if (temp) + return SET; + + return RESET; + +} +/*********************************************************************//** + * @brief Get Capture Interrupt Status + * @param[in] TIMx Timer selection, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] IntFlag: interrupt type, should be: + * - TIM_MR0_INT: Interrupt for Match channel 0 + * - TIM_MR1_INT: Interrupt for Match channel 1 + * - TIM_MR2_INT: Interrupt for Match channel 2 + * - TIM_MR3_INT: Interrupt for Match channel 3 + * - TIM_CR0_INT: Interrupt for Capture channel 0 + * - TIM_CR1_INT: Interrupt for Capture channel 1 + * @return FlagStatus + * - SET : interrupt + * - RESET : no interrupt + **********************************************************************/ +FlagStatus TIM_GetIntCaptureStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) +{ + uint8_t temp; + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); + temp = (TIMx->IR) & (1<<(4+IntFlag)); + if(temp) + return SET; + return RESET; +} +/*********************************************************************//** + * @brief Clear Interrupt pending + * @param[in] TIMx Timer selection, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] IntFlag: interrupt type, should be: + * - TIM_MR0_INT: Interrupt for Match channel 0 + * - TIM_MR1_INT: Interrupt for Match channel 1 + * - TIM_MR2_INT: Interrupt for Match channel 2 + * - TIM_MR3_INT: Interrupt for Match channel 3 + * - TIM_CR0_INT: Interrupt for Capture channel 0 + * - TIM_CR1_INT: Interrupt for Capture channel 1 + * @return None + **********************************************************************/ +void TIM_ClearIntPending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); + TIMx->IR = TIM_IR_CLR(IntFlag); +} + +/*********************************************************************//** + * @brief Clear Capture Interrupt pending + * @param[in] TIMx Timer selection, should be + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] IntFlag interrupt type, should be: + * - TIM_MR0_INT: Interrupt for Match channel 0 + * - TIM_MR1_INT: Interrupt for Match channel 1 + * - TIM_MR2_INT: Interrupt for Match channel 2 + * - TIM_MR3_INT: Interrupt for Match channel 3 + * - TIM_CR0_INT: Interrupt for Capture channel 0 + * - TIM_CR1_INT: Interrupt for Capture channel 1 + * @return None + **********************************************************************/ +void TIM_ClearIntCapturePending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag)); + TIMx->IR = (1<<(4+IntFlag)); +} + +/*********************************************************************//** + * @brief Configuration for Timer at initial time + * @param[in] TimerCounterMode timer counter mode, should be: + * - TIM_TIMER_MODE: Timer mode + * - TIM_COUNTER_RISING_MODE: Counter rising mode + * - TIM_COUNTER_FALLING_MODE: Counter falling mode + * - TIM_COUNTER_ANY_MODE:Counter on both edges + * @param[in] TIM_ConfigStruct pointer to TIM_TIMERCFG_Type or + * TIM_COUNTERCFG_Type + * @return None + **********************************************************************/ +void TIM_ConfigStructInit(TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct) +{ + if (TimerCounterMode == TIM_TIMER_MODE ) + { + TIM_TIMERCFG_Type * pTimeCfg = (TIM_TIMERCFG_Type *)TIM_ConfigStruct; + pTimeCfg->PrescaleOption = TIM_PRESCALE_USVAL; + pTimeCfg->PrescaleValue = 1; + } + else + { + TIM_COUNTERCFG_Type * pCounterCfg = (TIM_COUNTERCFG_Type *)TIM_ConfigStruct; + pCounterCfg->CountInputSelect = TIM_COUNTER_INCAP0; + } +} + +/*********************************************************************//** + * @brief Initial Timer/Counter device + * Set Clock frequency for Timer + * Set initial configuration for Timer + * @param[in] TIMx Timer selection, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] TimerCounterMode Timer counter mode, should be: + * - TIM_TIMER_MODE: Timer mode + * - TIM_COUNTER_RISING_MODE: Counter rising mode + * - TIM_COUNTER_FALLING_MODE: Counter falling mode + * - TIM_COUNTER_ANY_MODE:Counter on both edges + * @param[in] TIM_ConfigStruct pointer to TIM_TIMERCFG_Type + * that contains the configuration information for the + * specified Timer peripheral. + * @return None + **********************************************************************/ +void TIM_Init(LPC_TIM_TypeDef *TIMx, TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct) +{ + TIM_TIMERCFG_Type *pTimeCfg; + TIM_COUNTERCFG_Type *pCounterCfg; + + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_MODE_OPT(TimerCounterMode)); + + //set power + + if (TIMx== LPC_TIM0) + { + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM0, ENABLE); + //PCLK_Timer0 = CCLK/4 + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER0, CLKPWR_PCLKSEL_CCLK_DIV_4); + } + else if (TIMx== LPC_TIM1) + { + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM1, ENABLE); + //PCLK_Timer1 = CCLK/4 + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER1, CLKPWR_PCLKSEL_CCLK_DIV_4); + + } + + else if (TIMx== LPC_TIM2) + { + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, ENABLE); + //PCLK_Timer2= CCLK/4 + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER2, CLKPWR_PCLKSEL_CCLK_DIV_4); + } + else if (TIMx== LPC_TIM3) + { + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM3, ENABLE); + //PCLK_Timer3= CCLK/4 + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER3, CLKPWR_PCLKSEL_CCLK_DIV_4); + + } + + TIMx->CCR &= ~TIM_CTCR_MODE_MASK; + TIMx->CCR |= TIM_TIMER_MODE; + + TIMx->TC =0; + TIMx->PC =0; + TIMx->PR =0; + TIMx->TCR |= (1<<1); //Reset Counter + TIMx->TCR &= ~(1<<1); //release reset + if (TimerCounterMode == TIM_TIMER_MODE ) + { + pTimeCfg = (TIM_TIMERCFG_Type *)TIM_ConfigStruct; + if (pTimeCfg->PrescaleOption == TIM_PRESCALE_TICKVAL) + { + TIMx->PR = pTimeCfg->PrescaleValue -1 ; + } + else + { + TIMx->PR = converUSecToVal (converPtrToTimeNum(TIMx),pTimeCfg->PrescaleValue)-1; + } + } + else + { + + pCounterCfg = (TIM_COUNTERCFG_Type *)TIM_ConfigStruct; + TIMx->CCR &= ~TIM_CTCR_INPUT_MASK; + if (pCounterCfg->CountInputSelect == TIM_COUNTER_INCAP1) + TIMx->CCR |= _BIT(2); + } + + // Clear interrupt pending + TIMx->IR = 0xFFFFFFFF; + +} + +/*********************************************************************//** + * @brief Close Timer/Counter device + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @return None + **********************************************************************/ +void TIM_DeInit (LPC_TIM_TypeDef *TIMx) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + // Disable timer/counter + TIMx->TCR = 0x00; + + // Disable power + if (TIMx== LPC_TIM0) + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM0, DISABLE); + + else if (TIMx== LPC_TIM1) + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM1, DISABLE); + + else if (TIMx== LPC_TIM2) + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, DISABLE); + + else if (TIMx== LPC_TIM3) + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, DISABLE); + +} + +/*********************************************************************//** + * @brief Start/Stop Timer/Counter device + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] NewState + * - ENABLE : set timer enable + * - DISABLE : disable timer + * @return None + **********************************************************************/ +void TIM_Cmd(LPC_TIM_TypeDef *TIMx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + if (NewState == ENABLE) + { + TIMx->TCR |= TIM_ENABLE; + } + else + { + TIMx->TCR &= ~TIM_ENABLE; + } +} + +/*********************************************************************//** + * @brief Reset Timer/Counter device, + * Make TC and PC are synchronously reset on the next + * positive edge of PCLK + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @return None + **********************************************************************/ +void TIM_ResetCounter(LPC_TIM_TypeDef *TIMx) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + TIMx->TCR |= TIM_RESET; + TIMx->TCR &= ~TIM_RESET; +} + +/*********************************************************************//** + * @brief Configuration for Match register + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] TIM_MatchConfigStruct Pointer to TIM_MATCHCFG_Type + * - MatchChannel : choose channel 0 or 1 + * - IntOnMatch : if SET, interrupt will be generated when MRxx match + * the value in TC + * - StopOnMatch : if SET, TC and PC will be stopped whenM Rxx match + * the value in TC + * - ResetOnMatch : if SET, Reset on MR0 when MRxx match + * the value in TC + * -ExtMatchOutputType: Select output for external match + * + 0: Do nothing for external output pin if match + * + 1: Force external output pin to low if match + * + 2: Force external output pin to high if match + * + 3: Toggle external output pin if match + * MatchValue: Set the value to be compared with TC value + * @return None + **********************************************************************/ +void TIM_ConfigMatch(LPC_TIM_TypeDef *TIMx, TIM_MATCHCFG_Type *TIM_MatchConfigStruct) +{ + + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_EXTMATCH_OPT(TIM_MatchConfigStruct->ExtMatchOutputType)); + + switch(TIM_MatchConfigStruct->MatchChannel) + { + case 0: + TIMx->MR0 = TIM_MatchConfigStruct->MatchValue; + break; + case 1: + TIMx->MR1 = TIM_MatchConfigStruct->MatchValue; + break; + case 2: + TIMx->MR2 = TIM_MatchConfigStruct->MatchValue; + break; + case 3: + TIMx->MR3 = TIM_MatchConfigStruct->MatchValue; + break; + default: + //Error match value + //Error loop + while(1); + } + //interrupt on MRn + TIMx->MCR &=~TIM_MCR_CHANNEL_MASKBIT(TIM_MatchConfigStruct->MatchChannel); + + if (TIM_MatchConfigStruct->IntOnMatch) + TIMx->MCR |= TIM_INT_ON_MATCH(TIM_MatchConfigStruct->MatchChannel); + + //reset on MRn + if (TIM_MatchConfigStruct->ResetOnMatch) + TIMx->MCR |= TIM_RESET_ON_MATCH(TIM_MatchConfigStruct->MatchChannel); + + //stop on MRn + if (TIM_MatchConfigStruct->StopOnMatch) + TIMx->MCR |= TIM_STOP_ON_MATCH(TIM_MatchConfigStruct->MatchChannel); + + // match output type + + TIMx->EMR &= ~TIM_EM_MASK(TIM_MatchConfigStruct->MatchChannel); + TIMx->EMR |= TIM_EM_SET(TIM_MatchConfigStruct->MatchChannel,TIM_MatchConfigStruct->ExtMatchOutputType); +} +/*********************************************************************//** + * @brief Update Match value + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] MatchChannel Match channel, should be: 0..3 + * @param[in] MatchValue updated match value + * @return None + **********************************************************************/ +void TIM_UpdateMatchValue(LPC_TIM_TypeDef *TIMx,uint8_t MatchChannel, uint32_t MatchValue) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + switch(MatchChannel) + { + case 0: + TIMx->MR0 = MatchValue; + break; + case 1: + TIMx->MR1 = MatchValue; + break; + case 2: + TIMx->MR2 = MatchValue; + break; + case 3: + TIMx->MR3 = MatchValue; + break; + default: + //Error Loop + while(1); + } + +} +/*********************************************************************//** + * @brief Configuration for Capture register + * @param[in] TIMx Pointer to timer device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * - CaptureChannel: set the channel to capture data + * - RisingEdge : if SET, Capture at rising edge + * - FallingEdge : if SET, Capture at falling edge + * - IntOnCaption : if SET, Capture generate interrupt + * @param[in] TIM_CaptureConfigStruct Pointer to TIM_CAPTURECFG_Type + * @return None + **********************************************************************/ +void TIM_ConfigCapture(LPC_TIM_TypeDef *TIMx, TIM_CAPTURECFG_Type *TIM_CaptureConfigStruct) +{ + + CHECK_PARAM(PARAM_TIMx(TIMx)); + TIMx->CCR &= ~TIM_CCR_CHANNEL_MASKBIT(TIM_CaptureConfigStruct->CaptureChannel); + + if (TIM_CaptureConfigStruct->RisingEdge) + TIMx->CCR |= TIM_CAP_RISING(TIM_CaptureConfigStruct->CaptureChannel); + + if (TIM_CaptureConfigStruct->FallingEdge) + TIMx->CCR |= TIM_CAP_FALLING(TIM_CaptureConfigStruct->CaptureChannel); + + if (TIM_CaptureConfigStruct->IntOnCaption) + TIMx->CCR |= TIM_INT_ON_CAP(TIM_CaptureConfigStruct->CaptureChannel); +} + +/*********************************************************************//** + * @brief Read value of capture register in timer/counter device + * @param[in] TIMx Pointer to timer/counter device, should be: + * - LPC_TIM0: TIMER0 peripheral + * - LPC_TIM1: TIMER1 peripheral + * - LPC_TIM2: TIMER2 peripheral + * - LPC_TIM3: TIMER3 peripheral + * @param[in] CaptureChannel: capture channel number, should be: + * - TIM_COUNTER_INCAP0: CAPn.0 input pin for TIMERn + * - TIM_COUNTER_INCAP1: CAPn.1 input pin for TIMERn + * @return Value of capture register + **********************************************************************/ +uint32_t TIM_GetCaptureValue(LPC_TIM_TypeDef *TIMx, TIM_COUNTER_INPUT_OPT CaptureChannel) +{ + CHECK_PARAM(PARAM_TIMx(TIMx)); + CHECK_PARAM(PARAM_TIM_COUNTER_INPUT_OPT(CaptureChannel)); + + if(CaptureChannel==0) + return TIMx->CR0; + else + return TIMx->CR1; +} + +/** + * @} + */ + +#endif /* _TIMER */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_uart.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_uart.c new file mode 100644 index 0000000000..c7da45399a --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_uart.c @@ -0,0 +1,1382 @@ +/********************************************************************** +* $Id$ lpc17xx_uart.c 2011-06-06 +*//** +* @file lpc17xx_uart.c +* @brief Contains all functions support for UART firmware library +* on LPC17xx +* @version 3.2 +* @date 25. July. 2011 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2011, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup UART + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_uart.h" +#include "lpc17xx_clkpwr.h" + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _UART + +/* Private Functions ---------------------------------------------------------- */ + +static Status uart_set_divisors(LPC_UART_TypeDef *UARTx, uint32_t baudrate); + + +/*********************************************************************//** + * @brief Determines best dividers to get a target clock rate + * @param[in] UARTx Pointer to selected UART peripheral, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] baudrate Desired UART baud rate. + * @return Error status, could be: + * - SUCCESS + * - ERROR + **********************************************************************/ +static Status uart_set_divisors(LPC_UART_TypeDef *UARTx, uint32_t baudrate) +{ + Status errorStatus = ERROR; + + uint32_t uClk; + uint32_t d, m, bestd, bestm, tmp; + uint64_t best_divisor, divisor; + uint32_t current_error, best_error; + uint32_t recalcbaud; + + /* get UART block clock */ + if (UARTx == (LPC_UART_TypeDef *)LPC_UART0) + { + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART0); + } + else if (UARTx == (LPC_UART_TypeDef *)LPC_UART1) + { + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART1); + } + else if (UARTx == LPC_UART2) + { + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART2); + } + else if (UARTx == LPC_UART3) + { + uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART3); + } + + + /* In the Uart IP block, baud rate is calculated using FDR and DLL-DLM registers + * The formula is : + * BaudRate= uClk * (mulFracDiv/(mulFracDiv+dividerAddFracDiv) / (16 * (DLL) + * It involves floating point calculations. That's the reason the formulae are adjusted with + * Multiply and divide method.*/ + /* The value of mulFracDiv and dividerAddFracDiv should comply to the following expressions: + * 0 < mulFracDiv <= 15, 0 <= dividerAddFracDiv <= 15 */ + best_error = 0xFFFFFFFF; /* Worst case */ + bestd = 0; + bestm = 0; + best_divisor = 0; + for (m = 1 ; m <= 15 ;m++) + { + for (d = 0 ; d < m ; d++) + { + divisor = ((uint64_t)uClk<<28)*m/(baudrate*(m+d)); + current_error = divisor & 0xFFFFFFFF; + + tmp = divisor>>32; + + /* Adjust error */ + if(current_error > ((uint32_t)1<<31)){ + current_error = -current_error; + tmp++; + } + + if(tmp<1 || tmp>65536) /* Out of range */ + continue; + + if( current_error < best_error){ + best_error = current_error; + best_divisor = tmp; + bestd = d; + bestm = m; + if(best_error == 0) break; + } + } /* end of inner for loop */ + + if (best_error == 0) + break; + } /* end of outer for loop */ + + if(best_divisor == 0) return ERROR; /* can not find best match */ + + recalcbaud = (uClk>>4) * bestm/(best_divisor * (bestm + bestd)); + + /* reuse best_error to evaluate baud error*/ + if(baudrate>recalcbaud) best_error = baudrate - recalcbaud; + else best_error = recalcbaud -baudrate; + + best_error = best_error * 100 / baudrate; + + if (best_error < UART_ACCEPTED_BAUDRATE_ERROR) + { + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN; + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/DLM = UART_LOAD_DLM(best_divisor); + ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/DLL = UART_LOAD_DLL(best_divisor); + /* Then reset DLAB bit */ + ((LPC_UART1_TypeDef *)UARTx)->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK; + ((LPC_UART1_TypeDef *)UARTx)->FDR = (UART_FDR_MULVAL(bestm) \ + | UART_FDR_DIVADDVAL(bestd)) & UART_FDR_BITMASK; + } + else + { + UARTx->LCR |= UART_LCR_DLAB_EN; + UARTx->/*DLIER.*/DLM = UART_LOAD_DLM(best_divisor); + UARTx->/*RBTHDLR.*/DLL = UART_LOAD_DLL(best_divisor); + /* Then reset DLAB bit */ + UARTx->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK; + UARTx->FDR = (UART_FDR_MULVAL(bestm) \ + | UART_FDR_DIVADDVAL(bestd)) & UART_FDR_BITMASK; + } + errorStatus = SUCCESS; + } + + return errorStatus; +} + +/* End of Private Functions ---------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup UART_Public_Functions + * @{ + */ +/* UART Init/DeInit functions -------------------------------------------------*/ +/********************************************************************//** + * @brief Initializes the UARTx peripheral according to the specified + * parameters in the UART_ConfigStruct. + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] UART_ConfigStruct Pointer to a UART_CFG_Type structure +* that contains the configuration information for the +* specified UART peripheral. + * @return None + *********************************************************************/ +void UART_Init(LPC_UART_TypeDef *UARTx, UART_CFG_Type *UART_ConfigStruct) +{ + uint32_t tmp; + + // For debug mode + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_UART_DATABIT(UART_ConfigStruct->Databits)); + CHECK_PARAM(PARAM_UART_STOPBIT(UART_ConfigStruct->Stopbits)); + CHECK_PARAM(PARAM_UART_PARITY(UART_ConfigStruct->Parity)); + +#ifdef _UART0 + if(UARTx == (LPC_UART_TypeDef *)LPC_UART0) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART0, ENABLE); + } +#endif + +#ifdef _UART1 + if(((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART1, ENABLE); + } +#endif + +#ifdef _UART2 + if(UARTx == LPC_UART2) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, ENABLE); + } +#endif + +#ifdef _UART3 + if(UARTx == LPC_UART3) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART3, ENABLE); + } +#endif + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + /* FIFOs are empty */ + ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN \ + | UART_FCR_RX_RS | UART_FCR_TX_RS); + // Disable FIFO + ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = 0; + + // Dummy reading + while (((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_RDR) + { + tmp = ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR; + } + + ((LPC_UART1_TypeDef *)UARTx)->TER = UART_TER_TXEN; + // Wait for current transmit complete + while (!(((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_THRE)); + // Disable Tx + ((LPC_UART1_TypeDef *)UARTx)->TER = 0; + + // Disable interrupt + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER = 0; + // Set LCR to default state + ((LPC_UART1_TypeDef *)UARTx)->LCR = 0; + // Set ACR to default state + ((LPC_UART1_TypeDef *)UARTx)->ACR = 0; + // Set Modem Control to default state + ((LPC_UART1_TypeDef *)UARTx)->MCR = 0; + // Set RS485 control to default state + ((LPC_UART1_TypeDef *)UARTx)->RS485CTRL = 0; + // Set RS485 delay timer to default state + ((LPC_UART1_TypeDef *)UARTx)->RS485DLY = 0; + // Set RS485 addr match to default state + ((LPC_UART1_TypeDef *)UARTx)->ADRMATCH = 0; + //Dummy Reading to Clear Status + tmp = ((LPC_UART1_TypeDef *)UARTx)->MSR; + tmp = ((LPC_UART1_TypeDef *)UARTx)->LSR; + } + else + { + /* FIFOs are empty */ + UARTx->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS); + // Disable FIFO + UARTx->/*IIFCR.*/FCR = 0; + + // Dummy reading + while (UARTx->LSR & UART_LSR_RDR) + { + tmp = UARTx->/*RBTHDLR.*/RBR; + } + + UARTx->TER = UART_TER_TXEN; + // Wait for current transmit complete + while (!(UARTx->LSR & UART_LSR_THRE)); + // Disable Tx + UARTx->TER = 0; + + // Disable interrupt + UARTx->/*DLIER.*/IER = 0; + // Set LCR to default state + UARTx->LCR = 0; + // Set ACR to default state + UARTx->ACR = 0; + // Dummy reading + tmp = UARTx->LSR; + } + + if (UARTx == LPC_UART3) + { + // Set IrDA to default state + UARTx->ICR = 0; + } + + // Set Line Control register ---------------------------- + + uart_set_divisors(UARTx, (UART_ConfigStruct->Baud_rate)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + tmp = (((LPC_UART1_TypeDef *)UARTx)->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) \ + & UART_LCR_BITMASK; + } + else + { + tmp = (UARTx->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) & UART_LCR_BITMASK; + } + + switch (UART_ConfigStruct->Databits){ + case UART_DATABIT_5: + tmp |= UART_LCR_WLEN5; + break; + case UART_DATABIT_6: + tmp |= UART_LCR_WLEN6; + break; + case UART_DATABIT_7: + tmp |= UART_LCR_WLEN7; + break; + case UART_DATABIT_8: + default: + tmp |= UART_LCR_WLEN8; + break; + } + + if (UART_ConfigStruct->Parity == UART_PARITY_NONE) + { + // Do nothing... + } + else + { + tmp |= UART_LCR_PARITY_EN; + switch (UART_ConfigStruct->Parity) + { + case UART_PARITY_ODD: + tmp |= UART_LCR_PARITY_ODD; + break; + + case UART_PARITY_EVEN: + tmp |= UART_LCR_PARITY_EVEN; + break; + + case UART_PARITY_SP_1: + tmp |= UART_LCR_PARITY_F_1; + break; + + case UART_PARITY_SP_0: + tmp |= UART_LCR_PARITY_F_0; + break; + default: + break; + } + } + + switch (UART_ConfigStruct->Stopbits){ + case UART_STOPBIT_2: + tmp |= UART_LCR_STOPBIT_SEL; + break; + case UART_STOPBIT_1: + default: + // Do no thing + break; + } + + + // Write back to LCR, configure FIFO and Disable Tx + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->LCR = (uint8_t)(tmp & UART_LCR_BITMASK); + } + else + { + UARTx->LCR = (uint8_t)(tmp & UART_LCR_BITMASK); + } +} + +/*********************************************************************//** + * @brief De-initializes the UARTx peripheral registers to their + * default reset values. + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return None + **********************************************************************/ +void UART_DeInit(LPC_UART_TypeDef* UARTx) +{ + // For debug mode + CHECK_PARAM(PARAM_UARTx(UARTx)); + + UART_TxCmd(UARTx, DISABLE); + +#ifdef _UART0 + if (UARTx == (LPC_UART_TypeDef *)LPC_UART0) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART0, DISABLE); + } +#endif + +#ifdef _UART1 + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART1, DISABLE); + } +#endif + +#ifdef _UART2 + if (UARTx == LPC_UART2) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART2, DISABLE); + } +#endif + +#ifdef _UART3 + if (UARTx == LPC_UART3) + { + /* Set up clock and power for UART module */ + CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCUART3, DISABLE); + } +#endif +} + +/*****************************************************************************//** +* @brief Fills each UART_InitStruct member with its default value: +* - 9600 bps +* - 8-bit data +* - 1 Stopbit +* - None Parity +* @param[in] UART_InitStruct Pointer to a UART_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void UART_ConfigStructInit(UART_CFG_Type *UART_InitStruct) +{ + UART_InitStruct->Baud_rate = 9600; + UART_InitStruct->Databits = UART_DATABIT_8; + UART_InitStruct->Parity = UART_PARITY_NONE; + UART_InitStruct->Stopbits = UART_STOPBIT_1; +} + +/* UART Send/Recieve functions -------------------------------------------------*/ +/*********************************************************************//** + * @brief Transmit a single data through UART peripheral + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] Data Data to transmit (must be 8-bit long) + * @return None + **********************************************************************/ +void UART_SendByte(LPC_UART_TypeDef* UARTx, uint8_t Data) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT; + } + else + { + UARTx->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT; + } + +} + + +/*********************************************************************//** + * @brief Receive a single data from UART peripheral + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return Data received + **********************************************************************/ +uint8_t UART_ReceiveByte(LPC_UART_TypeDef* UARTx) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + return (((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT); + } + else + { + return (UARTx->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT); + } +} + +/*********************************************************************//** + * @brief Send a block of data via UART peripheral + * @param[in] UARTx Selected UART peripheral used to send data, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] txbuf Pointer to Transmit buffer + * @param[in] buflen Length of Transmit buffer + * @param[in] flag Flag used in UART transfer, should be + * NONE_BLOCKING or BLOCKING + * @return Number of bytes sent. + * + * Note: when using UART in BLOCKING mode, a time-out condition is used + * via defined symbol UART_BLOCKING_TIMEOUT. + **********************************************************************/ +uint32_t UART_Send(LPC_UART_TypeDef *UARTx, uint8_t *txbuf, + uint32_t buflen, TRANSFER_BLOCK_Type flag) +{ + uint32_t bToSend, bSent, timeOut, fifo_cnt; + uint8_t *pChar = txbuf; + + bToSend = buflen; + + // blocking mode + if (flag == BLOCKING) { + bSent = 0; + while (bToSend){ + timeOut = UART_BLOCKING_TIMEOUT; + // Wait for THR empty with timeout + while (!(UARTx->LSR & UART_LSR_THRE)) { + if (timeOut == 0) break; + timeOut--; + } + // Time out! + if(timeOut == 0) break; + fifo_cnt = UART_TX_FIFO_SIZE; + while (fifo_cnt && bToSend){ + UART_SendByte(UARTx, (*pChar++)); + fifo_cnt--; + bToSend--; + bSent++; + } + } + } + // None blocking mode + else { + bSent = 0; + while (bToSend) { + if (!(UARTx->LSR & UART_LSR_THRE)){ + break; + } + fifo_cnt = UART_TX_FIFO_SIZE; + while (fifo_cnt && bToSend) { + UART_SendByte(UARTx, (*pChar++)); + bToSend--; + fifo_cnt--; + bSent++; + } + } + } + return bSent; +} + +/*********************************************************************//** + * @brief Receive a block of data via UART peripheral + * @param[in] UARTx Selected UART peripheral used to send data, + * should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[out] rxbuf Pointer to Received buffer + * @param[in] buflen Length of Received buffer + * @param[in] flag Flag mode, should be NONE_BLOCKING or BLOCKING + + * @return Number of bytes received + * + * Note: when using UART in BLOCKING mode, a time-out condition is used + * via defined symbol UART_BLOCKING_TIMEOUT. + **********************************************************************/ +uint32_t UART_Receive(LPC_UART_TypeDef *UARTx, uint8_t *rxbuf, \ + uint32_t buflen, TRANSFER_BLOCK_Type flag) +{ + uint32_t bToRecv, bRecv, timeOut; + uint8_t *pChar = rxbuf; + + bToRecv = buflen; + + // Blocking mode + if (flag == BLOCKING) { + bRecv = 0; + while (bToRecv){ + timeOut = UART_BLOCKING_TIMEOUT; + while (!(UARTx->LSR & UART_LSR_RDR)){ + if (timeOut == 0) break; + timeOut--; + } + // Time out! + if(timeOut == 0) break; + // Get data from the buffer + (*pChar++) = UART_ReceiveByte(UARTx); + bToRecv--; + bRecv++; + } + } + // None blocking mode + else { + bRecv = 0; + while (bToRecv) { + if (!(UARTx->LSR & UART_LSR_RDR)) { + break; + } else { + (*pChar++) = UART_ReceiveByte(UARTx); + bRecv++; + bToRecv--; + } + } + } + return bRecv; +} + +/*********************************************************************//** + * @brief Force BREAK character on UART line, output pin UARTx TXD is + forced to logic 0. + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return None + **********************************************************************/ +void UART_ForceBreak(LPC_UART_TypeDef* UARTx) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_BREAK_EN; + } + else + { + UARTx->LCR |= UART_LCR_BREAK_EN; + } +} + + +/********************************************************************//** + * @brief Enable or disable specified UART interrupt. + * @param[in] UARTx UART peripheral selected, should be + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] UARTIntCfg Specifies the interrupt flag, + * should be one of the following: + - UART_INTCFG_RBR : RBR Interrupt enable + - UART_INTCFG_THRE : THR Interrupt enable + - UART_INTCFG_RLS : RX line status interrupt enable + - UART1_INTCFG_MS : Modem status interrupt enable (UART1 only) + - UART1_INTCFG_CTS : CTS1 signal transition interrupt enable (UART1 only) + - UART_INTCFG_ABEO : Enables the end of auto-baud interrupt + - UART_INTCFG_ABTO : Enables the auto-baud time-out interrupt + * @param[in] NewState New state of specified UART interrupt type, + * should be: + * - ENALBE: Enable this UART interrupt type. +* - DISALBE: Disable this UART interrupt type. + * @return None + *********************************************************************/ +void UART_IntConfig(LPC_UART_TypeDef *UARTx, UART_INT_Type UARTIntCfg, FunctionalState NewState) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + switch(UARTIntCfg){ + case UART_INTCFG_RBR: + tmp = UART_IER_RBRINT_EN; + break; + case UART_INTCFG_THRE: + tmp = UART_IER_THREINT_EN; + break; + case UART_INTCFG_RLS: + tmp = UART_IER_RLSINT_EN; + break; + case UART1_INTCFG_MS: + tmp = UART1_IER_MSINT_EN; + break; + case UART1_INTCFG_CTS: + tmp = UART1_IER_CTSINT_EN; + break; + case UART_INTCFG_ABEO: + tmp = UART_IER_ABEOINT_EN; + break; + case UART_INTCFG_ABTO: + tmp = UART_IER_ABTOINT_EN; + break; + } + + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) + { + CHECK_PARAM((PARAM_UART_INTCFG(UARTIntCfg)) || (PARAM_UART1_INTCFG(UARTIntCfg))); + } + else + { + CHECK_PARAM(PARAM_UART_INTCFG(UARTIntCfg)); + } + + if (NewState == ENABLE) + { + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER |= tmp; + } + else + { + UARTx->/*DLIER.*/IER |= tmp; + } + } + else + { + if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER &= (~tmp) & UART1_IER_BITMASK; + } + else + { + UARTx->/*DLIER.*/IER &= (~tmp) & UART_IER_BITMASK; + } + } +} + + +/********************************************************************//** + * @brief Get current value of Line Status register in UART peripheral. + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return Current value of Line Status register in UART peripheral. + * Note: The return value of this function must be ANDed with each member in + * UART_LS_Type enumeration to determine current flag status + * corresponding to each Line status type. Because some flags in + * Line Status register will be cleared after reading, the next reading + * Line Status register could not be correct. So this function used to + * read Line status register in one time only, then the return value + * used to check all flags. + *********************************************************************/ +uint8_t UART_GetLineStatus(LPC_UART_TypeDef* UARTx) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + return ((((LPC_UART1_TypeDef *)LPC_UART1)->LSR) & UART_LSR_BITMASK); + } + else + { + return ((UARTx->LSR) & UART_LSR_BITMASK); + } +} + +/********************************************************************//** + * @brief Get Interrupt Identification value + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return Current value of UART UIIR register in UART peripheral. + *********************************************************************/ +uint32_t UART_GetIntId(LPC_UART_TypeDef* UARTx) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + return (UARTx->IIR & 0x03CF); +} + +/*********************************************************************//** + * @brief Check whether if UART is busy or not + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @return RESET if UART is not busy, otherwise return SET. + **********************************************************************/ +FlagStatus UART_CheckBusy(LPC_UART_TypeDef *UARTx) +{ + if (UARTx->LSR & UART_LSR_TEMT){ + return RESET; + } else { + return SET; + } +} + + +/*********************************************************************//** + * @brief Configure FIFO function on selected UART peripheral + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] FIFOCfg Pointer to a UART_FIFO_CFG_Type Structure that + * contains specified information about FIFO configuration + * @return none + **********************************************************************/ +void UART_FIFOConfig(LPC_UART_TypeDef *UARTx, UART_FIFO_CFG_Type *FIFOCfg) +{ + uint8_t tmp = 0; + + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_UART_FIFO_LEVEL(FIFOCfg->FIFO_Level)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_DMAMode)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_ResetRxBuf)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(FIFOCfg->FIFO_ResetTxBuf)); + + tmp |= UART_FCR_FIFO_EN; + switch (FIFOCfg->FIFO_Level){ + case UART_FIFO_TRGLEV0: + tmp |= UART_FCR_TRG_LEV0; + break; + case UART_FIFO_TRGLEV1: + tmp |= UART_FCR_TRG_LEV1; + break; + case UART_FIFO_TRGLEV2: + tmp |= UART_FCR_TRG_LEV2; + break; + case UART_FIFO_TRGLEV3: + default: + tmp |= UART_FCR_TRG_LEV3; + break; + } + + if (FIFOCfg->FIFO_ResetTxBuf == ENABLE) + { + tmp |= UART_FCR_TX_RS; + } + if (FIFOCfg->FIFO_ResetRxBuf == ENABLE) + { + tmp |= UART_FCR_RX_RS; + } + if (FIFOCfg->FIFO_DMAMode == ENABLE) + { + tmp |= UART_FCR_DMAMODE_SEL; + } + + + //write to FIFO control register + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK; + } + else + { + UARTx->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK; + } +} + +/*****************************************************************************//** +* @brief Fills each UART_FIFOInitStruct member with its default value: +* - FIFO_DMAMode = DISABLE +* - FIFO_Level = UART_FIFO_TRGLEV0 +* - FIFO_ResetRxBuf = ENABLE +* - FIFO_ResetTxBuf = ENABLE +* - FIFO_State = ENABLE + +* @param[in] UART_FIFOInitStruct Pointer to a UART_FIFO_CFG_Type structure +* which will be initialized. +* @return None +*******************************************************************************/ +void UART_FIFOConfigStructInit(UART_FIFO_CFG_Type *UART_FIFOInitStruct) +{ + UART_FIFOInitStruct->FIFO_DMAMode = DISABLE; + UART_FIFOInitStruct->FIFO_Level = UART_FIFO_TRGLEV0; + UART_FIFOInitStruct->FIFO_ResetRxBuf = ENABLE; + UART_FIFOInitStruct->FIFO_ResetTxBuf = ENABLE; +} + + +/*********************************************************************//** + * @brief Start/Stop Auto Baudrate activity + * @param[in] UARTx UART peripheral selected, should be + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] ABConfigStruct A pointer to UART_AB_CFG_Type structure that + * contains specified information about UART + * auto baudrate configuration + * @param[in] NewState New State of Auto baudrate activity, should be: + * - ENABLE: Start this activity + * - DISABLE: Stop this activity + * Note: Auto-baudrate mode enable bit will be cleared once this mode + * completed. + * @return none + **********************************************************************/ +void UART_ABCmd(LPC_UART_TypeDef *UARTx, UART_AB_CFG_Type *ABConfigStruct, \ + FunctionalState NewState) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + tmp = 0; + if (NewState == ENABLE) { + if (ABConfigStruct->ABMode == UART_AUTOBAUD_MODE1){ + tmp |= UART_ACR_MODE; + } + if (ABConfigStruct->AutoRestart == ENABLE){ + tmp |= UART_ACR_AUTO_RESTART; + } + } + + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + if (NewState == ENABLE) + { + // Clear DLL and DLM value + ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN; + ((LPC_UART1_TypeDef *)UARTx)->DLL = 0; + ((LPC_UART1_TypeDef *)UARTx)->DLM = 0; + ((LPC_UART1_TypeDef *)UARTx)->LCR &= ~UART_LCR_DLAB_EN; + // FDR value must be reset to default value + ((LPC_UART1_TypeDef *)UARTx)->FDR = 0x10; + ((LPC_UART1_TypeDef *)UARTx)->ACR = UART_ACR_START | tmp; + } + else + { + ((LPC_UART1_TypeDef *)UARTx)->ACR = 0; + } + } + else + { + if (NewState == ENABLE) + { + // Clear DLL and DLM value + UARTx->LCR |= UART_LCR_DLAB_EN; + UARTx->DLL = 0; + UARTx->DLM = 0; + UARTx->LCR &= ~UART_LCR_DLAB_EN; + // FDR value must be reset to default value + UARTx->FDR = 0x10; + UARTx->ACR = UART_ACR_START | tmp; + } + else + { + UARTx->ACR = 0; + } + } +} + +/*********************************************************************//** + * @brief Clear Autobaud Interrupt Pending + * @param[in] UARTx UART peripheral selected, should be + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] ABIntType type of auto-baud interrupt, should be: + * - UART_AUTOBAUD_INTSTAT_ABEO: End of Auto-baud interrupt + * - UART_AUTOBAUD_INTSTAT_ABTO: Auto-baud time out interrupt + * @return none + **********************************************************************/ +void UART_ABClearIntPending(LPC_UART_TypeDef *UARTx, UART_ABEO_Type ABIntType) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + UARTx->ACR |= ABIntType; + } + else + UARTx->ACR |= ABIntType; +} + +/*********************************************************************//** + * @brief Enable/Disable transmission on UART TxD pin + * @param[in] UARTx UART peripheral selected, should be: + * - LPC_UART0: UART0 peripheral + * - LPC_UART1: UART1 peripheral + * - LPC_UART2: UART2 peripheral + * - LPC_UART3: UART3 peripheral + * @param[in] NewState New State of Tx transmission function, should be: + * - ENABLE: Enable this function + - DISABLE: Disable this function + * @return none + **********************************************************************/ +void UART_TxCmd(LPC_UART_TypeDef *UARTx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_UARTx(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->TER |= UART_TER_TXEN; + } + else + { + UARTx->TER |= UART_TER_TXEN; + } + } + else + { + if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1) + { + ((LPC_UART1_TypeDef *)UARTx)->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK; + } + else + { + UARTx->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK; + } + } +} + +/* UART IrDA functions ---------------------------------------------------*/ + +#ifdef _UART3 + +/*********************************************************************//** + * @brief Enable or disable inverting serial input function of IrDA + * on UART peripheral. + * @param[in] UARTx UART peripheral selected, should be LPC_UART3 (only) + * @param[in] NewState New state of inverting serial input, should be: + * - ENABLE: Enable this function. + * - DISABLE: Disable this function. + * @return none + **********************************************************************/ +void UART_IrDAInvtInputCmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_UART_IrDA(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + UARTx->ICR |= UART_ICR_IRDAINV; + } + else if (NewState == DISABLE) + { + UARTx->ICR &= (~UART_ICR_IRDAINV) & UART_ICR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Enable or disable IrDA function on UART peripheral. + * @param[in] UARTx UART peripheral selected, should be LPC_UART3 (only) + * @param[in] NewState New state of IrDA function, should be: + * - ENABLE: Enable this function. + * - DISABLE: Disable this function. + * @return none + **********************************************************************/ +void UART_IrDACmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState) +{ + CHECK_PARAM(PARAM_UART_IrDA(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + if (NewState == ENABLE) + { + UARTx->ICR |= UART_ICR_IRDAEN; + } + else + { + UARTx->ICR &= (~UART_ICR_IRDAEN) & UART_ICR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Configure Pulse divider for IrDA function on UART peripheral. + * @param[in] UARTx UART peripheral selected, should be LPC_UART3 (only) + * @param[in] PulseDiv Pulse Divider value from Peripheral clock, + * should be one of the following: + - UART_IrDA_PULSEDIV2 : Pulse width = 2 * Tpclk + - UART_IrDA_PULSEDIV4 : Pulse width = 4 * Tpclk + - UART_IrDA_PULSEDIV8 : Pulse width = 8 * Tpclk + - UART_IrDA_PULSEDIV16 : Pulse width = 16 * Tpclk + - UART_IrDA_PULSEDIV32 : Pulse width = 32 * Tpclk + - UART_IrDA_PULSEDIV64 : Pulse width = 64 * Tpclk + - UART_IrDA_PULSEDIV128 : Pulse width = 128 * Tpclk + - UART_IrDA_PULSEDIV256 : Pulse width = 256 * Tpclk + + * @return none + **********************************************************************/ +void UART_IrDAPulseDivConfig(LPC_UART_TypeDef *UARTx, UART_IrDA_PULSE_Type PulseDiv) +{ + uint32_t tmp, tmp1; + CHECK_PARAM(PARAM_UART_IrDA(UARTx)); + CHECK_PARAM(PARAM_UART_IrDA_PULSEDIV(PulseDiv)); + + tmp1 = UART_ICR_PULSEDIV(PulseDiv); + tmp = UARTx->ICR & (~UART_ICR_PULSEDIV(7)); + tmp |= tmp1 | UART_ICR_FIXPULSE_EN; + UARTx->ICR = tmp & UART_ICR_BITMASK; +} + +#endif + + +/* UART1 FullModem function ---------------------------------------------*/ + +#ifdef _UART1 + +/*********************************************************************//** + * @brief Force pin DTR/RTS corresponding to given state (Full modem mode) + * @param[in] UARTx LPC_UART1 (only) + * @param[in] Pin Pin that NewState will be applied to, should be: + * - UART1_MODEM_PIN_DTR: DTR pin. + * - UART1_MODEM_PIN_RTS: RTS pin. + * @param[in] NewState New State of DTR/RTS pin, should be: + * - INACTIVE: Force the pin to inactive signal. + - ACTIVE: Force the pin to active signal. + * @return none + **********************************************************************/ +void UART_FullModemForcePinState(LPC_UART1_TypeDef *UARTx, UART_MODEM_PIN_Type Pin, \ + UART1_SignalState NewState) +{ + uint8_t tmp = 0; + + CHECK_PARAM(PARAM_UART1_MODEM(UARTx)); + CHECK_PARAM(PARAM_UART1_MODEM_PIN(Pin)); + CHECK_PARAM(PARAM_UART1_SIGNALSTATE(NewState)); + + switch (Pin){ + case UART1_MODEM_PIN_DTR: + tmp = UART1_MCR_DTR_CTRL; + break; + case UART1_MODEM_PIN_RTS: + tmp = UART1_MCR_RTS_CTRL; + break; + default: + break; + } + + if (NewState == ACTIVE){ + UARTx->MCR |= tmp; + } else { + UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Configure Full Modem mode for UART peripheral + * @param[in] UARTx LPC_UART1 (only) + * @param[in] Mode Full Modem mode, should be: + * - UART1_MODEM_MODE_LOOPBACK: Loop back mode. + * - UART1_MODEM_MODE_AUTO_RTS: Auto-RTS mode. + * - UART1_MODEM_MODE_AUTO_CTS: Auto-CTS mode. + * @param[in] NewState New State of this mode, should be: + * - ENABLE: Enable this mode. + - DISABLE: Disable this mode. + * @return none + **********************************************************************/ +void UART_FullModemConfigMode(LPC_UART1_TypeDef *UARTx, UART_MODEM_MODE_Type Mode, \ + FunctionalState NewState) +{ + uint8_t tmp; + + CHECK_PARAM(PARAM_UART1_MODEM(UARTx)); + CHECK_PARAM(PARAM_UART1_MODEM_MODE(Mode)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); + + switch(Mode){ + case UART1_MODEM_MODE_LOOPBACK: + tmp = UART1_MCR_LOOPB_EN; + break; + case UART1_MODEM_MODE_AUTO_RTS: + tmp = UART1_MCR_AUTO_RTS_EN; + break; + case UART1_MODEM_MODE_AUTO_CTS: + tmp = UART1_MCR_AUTO_CTS_EN; + break; + default: + break; + } + + if (NewState == ENABLE) + { + UARTx->MCR |= tmp; + } + else + { + UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK; + } +} + + +/*********************************************************************//** + * @brief Get current status of modem status register + * @param[in] UARTx LPC_UART1 (only) + * @return Current value of modem status register + * Note: The return value of this function must be ANDed with each member + * UART_MODEM_STAT_type enumeration to determine current flag status + * corresponding to each modem flag status. Because some flags in + * modem status register will be cleared after reading, the next reading + * modem register could not be correct. So this function used to + * read modem status register in one time only, then the return value + * used to check all flags. + **********************************************************************/ +uint8_t UART_FullModemGetStatus(LPC_UART1_TypeDef *UARTx) +{ + CHECK_PARAM(PARAM_UART1_MODEM(UARTx)); + return ((UARTx->MSR) & UART1_MSR_BITMASK); +} + + +/* UART RS485 functions --------------------------------------------------------------*/ + +/*********************************************************************//** + * @brief Configure UART peripheral in RS485 mode according to the specified +* parameters in the RS485ConfigStruct. + * @param[in] UARTx LPC_UART1 (only) + * @param[in] RS485ConfigStruct Pointer to a UART1_RS485_CTRLCFG_Type structure +* that contains the configuration information for specified UART +* in RS485 mode. + * @return None + **********************************************************************/ +void UART_RS485Config(LPC_UART1_TypeDef *UARTx, UART1_RS485_CTRLCFG_Type *RS485ConfigStruct) +{ + uint32_t tmp; + + CHECK_PARAM(PARAM_UART1_MODEM(UARTx)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->AutoAddrDetect_State)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->AutoDirCtrl_State)); + CHECK_PARAM(PARAM_UART1_RS485_CFG_DELAYVALUE(RS485ConfigStruct->DelayValue)); + CHECK_PARAM(PARAM_SETSTATE(RS485ConfigStruct->DirCtrlPol_Level)); + CHECK_PARAM(PARAM_UART_RS485_DIRCTRL_PIN(RS485ConfigStruct->DirCtrlPin)); + CHECK_PARAM(PARAM_UART1_RS485_CFG_MATCHADDRVALUE(RS485ConfigStruct->MatchAddrValue)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->NormalMultiDropMode_State)); + CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->Rx_State)); + + tmp = 0; + // If Auto Direction Control is enabled - This function is used in Master mode + if (RS485ConfigStruct->AutoDirCtrl_State == ENABLE) + { + tmp |= UART1_RS485CTRL_DCTRL_EN; + + // Set polar + if (RS485ConfigStruct->DirCtrlPol_Level == SET) + { + tmp |= UART1_RS485CTRL_OINV_1; + } + + // Set pin according to + if (RS485ConfigStruct->DirCtrlPin == UART1_RS485_DIRCTRL_DTR) + { + tmp |= UART1_RS485CTRL_SEL_DTR; + } + + // Fill delay time + UARTx->RS485DLY = RS485ConfigStruct->DelayValue & UART1_RS485DLY_BITMASK; + } + + // MultiDrop mode is enable + if (RS485ConfigStruct->NormalMultiDropMode_State == ENABLE) + { + tmp |= UART1_RS485CTRL_NMM_EN; + } + + // Auto Address Detect function + if (RS485ConfigStruct->AutoAddrDetect_State == ENABLE) + { + tmp |= UART1_RS485CTRL_AADEN; + // Fill Match Address + UARTx->ADRMATCH = RS485ConfigStruct->MatchAddrValue & UART1_RS485ADRMATCH_BITMASK; + } + + + // Receiver is disable + if (RS485ConfigStruct->Rx_State == DISABLE) + { + tmp |= UART1_RS485CTRL_RX_DIS; + } + + // write back to RS485 control register + UARTx->RS485CTRL = tmp & UART1_RS485CTRL_BITMASK; + + // Enable Parity function and leave parity in stick '0' parity as default + UARTx->LCR |= (UART_LCR_PARITY_F_0 | UART_LCR_PARITY_EN); +} + +/*********************************************************************//** + * @brief Enable/Disable receiver in RS485 module in UART1 + * @param[in] UARTx LPC_UART1 (only) + * @param[in] NewState New State of command, should be: + * - ENABLE: Enable this function. + * - DISABLE: Disable this function. + * @return None + **********************************************************************/ +void UART_RS485ReceiverCmd(LPC_UART1_TypeDef *UARTx, FunctionalState NewState) +{ + if (NewState == ENABLE){ + UARTx->RS485CTRL &= ~UART1_RS485CTRL_RX_DIS; + } else { + UARTx->RS485CTRL |= UART1_RS485CTRL_RX_DIS; + } +} + +/*********************************************************************//** + * @brief Send data on RS485 bus with specified parity stick value (9-bit mode). + * @param[in] UARTx LPC_UART1 (only) + * @param[in] pDatFrm Pointer to data frame. + * @param[in] size Size of data. + * @param[in] ParityStick Parity Stick value, should be 0 or 1. + * @return None + **********************************************************************/ +uint32_t UART_RS485Send(LPC_UART1_TypeDef *UARTx, uint8_t *pDatFrm, \ + uint32_t size, uint8_t ParityStick) +{ + uint8_t tmp, save; + uint32_t cnt; + + if (ParityStick){ + save = tmp = UARTx->LCR & UART_LCR_BITMASK; + tmp &= ~(UART_LCR_PARITY_EVEN); + UARTx->LCR = tmp; + cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING); + while (!(UARTx->LSR & UART_LSR_TEMT)); + UARTx->LCR = save; + } else { + cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING); + while (!(UARTx->LSR & UART_LSR_TEMT)); + } + return cnt; +} + +/*********************************************************************//** + * @brief Send Slave address frames on RS485 bus. + * @param[in] UARTx LPC_UART1 (only) + * @param[in] SlvAddr Slave Address. + * @return None + **********************************************************************/ +void UART_RS485SendSlvAddr(LPC_UART1_TypeDef *UARTx, uint8_t SlvAddr) +{ + UART_RS485Send(UARTx, &SlvAddr, 1, 1); +} + +/*********************************************************************//** + * @brief Send Data frames on RS485 bus. + * @param[in] UARTx LPC_UART1 (only) + * @param[in] pData Pointer to data to be sent. + * @param[in] size Size of data frame to be sent. + * @return None + **********************************************************************/ +uint32_t UART_RS485SendData(LPC_UART1_TypeDef *UARTx, uint8_t *pData, uint32_t size) +{ + return (UART_RS485Send(UARTx, pData, size, 0)); +} + +#endif /* _UART1 */ + +#endif /* _UART */ + +/** + * @} + */ + +/** + * @} + */ +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/driver/lpc17xx_wdt.c b/frameworks/CMSIS/LPC1768/driver/lpc17xx_wdt.c new file mode 100644 index 0000000000..39e0f9e682 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/driver/lpc17xx_wdt.c @@ -0,0 +1,274 @@ +/********************************************************************** +* $Id$ lpc17xx_wdt.c 2010-05-21 +*//** +* @file lpc17xx_wdt.c +* @brief Contains all functions support for WDT firmware library +* on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @addtogroup WDT + * @{ + */ + +/* Includes ------------------------------------------------------------------- */ +#include "lpc17xx_wdt.h" +#include "lpc17xx_clkpwr.h" +#include "lpc17xx_pinsel.h" + + +/* If this source file built with example, the LPC17xx FW library configuration + * file in each example directory ("lpc17xx_libcfg.h") must be included, + * otherwise the default FW library configuration file must be included instead + */ +#ifdef __BUILD_WITH_EXAMPLE__ +#include "lpc17xx_libcfg.h" +#else +#include "lpc17xx_libcfg_default.h" +#endif /* __BUILD_WITH_EXAMPLE__ */ + + +#ifdef _WDT + +/* Private Functions ---------------------------------------------------------- */ + +static uint8_t WDT_SetTimeOut (uint8_t clk_source, uint32_t timeout); + +/********************************************************************//** + * @brief Set WDT time out value and WDT mode + * @param[in] clk_source select Clock source for WDT device + * @param[in] timeout value of time-out for WDT (us) + * @return None + *********************************************************************/ +static uint8_t WDT_SetTimeOut (uint8_t clk_source, uint32_t timeout) +{ + + uint32_t pclk_wdt = 0; + uint32_t tempval = 0; + + switch ((WDT_CLK_OPT) clk_source) + { + case WDT_CLKSRC_IRC: + pclk_wdt = 4000000; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + // Check if it valid + if (tempval >= WDT_TIMEOUT_MIN) + { + LPC_WDT->WDTC = tempval; + return SUCCESS; + } + + break; + + case WDT_CLKSRC_PCLK: + + // Get WDT clock with CCLK divider = 4 + pclk_wdt = SystemCoreClock / 4; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + + if (tempval >= WDT_TIMEOUT_MIN) + { + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_4); + LPC_WDT->WDTC = (uint32_t) tempval; + return SUCCESS; + } + + // Get WDT clock with CCLK divider = 2 + pclk_wdt = SystemCoreClock / 2; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + + if (tempval >= WDT_TIMEOUT_MIN) + { + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_2); + LPC_WDT->WDTC = (uint32_t) tempval; + return SUCCESS; + } + + // Get WDT clock with CCLK divider = 1 + pclk_wdt = SystemCoreClock; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + + if (tempval >= WDT_TIMEOUT_MIN) + { + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_1); + LPC_WDT->WDTC = (uint32_t) tempval; + return SUCCESS; + } + break ; + + + case WDT_CLKSRC_RTC: + pclk_wdt = 32768; + // Calculate TC in WDT + tempval = ((((uint64_t)pclk_wdt * (uint64_t)timeout / 4) / (uint64_t)WDT_US_INDEX)); + // Check if it valid + if (tempval >= WDT_TIMEOUT_MIN) + { + LPC_WDT->WDTC = (uint32_t) tempval; + return SUCCESS; + } + + break; + +// Error parameter + default: + break; +} + + return ERROR; +} + +/* End of Private Functions --------------------------------------------------- */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @addtogroup WDT_Public_Functions + * @{ + */ + + +/*********************************************************************//** +* @brief Initial for Watchdog function +* Clock source = RTC , +* @param[in] ClkSrc Select clock source, should be: +* - WDT_CLKSRC_IRC: Clock source from Internal RC oscillator +* - WDT_CLKSRC_PCLK: Selects the APB peripheral clock (PCLK) +* - WDT_CLKSRC_RTC: Selects the RTC oscillator +* @param[in] WDTMode WDT mode, should be: +* - WDT_MODE_INT_ONLY: Use WDT to generate interrupt only +* - WDT_MODE_RESET: Use WDT to generate interrupt and reset MCU +* @return None + **********************************************************************/ +void WDT_Init (WDT_CLK_OPT ClkSrc, WDT_MODE_OPT WDTMode) +{ + CHECK_PARAM(PARAM_WDT_CLK_OPT(ClkSrc)); + CHECK_PARAM(PARAM_WDT_MODE_OPT(WDTMode)); + CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_4); + + //Set clock source + LPC_WDT->WDCLKSEL &= ~WDT_WDCLKSEL_MASK; + LPC_WDT->WDCLKSEL |= ClkSrc; + //Set WDT mode + if (WDTMode == WDT_MODE_RESET){ + LPC_WDT->WDMOD |= WDT_WDMOD(WDTMode); + } +} + +/*********************************************************************//** +* @brief Start WDT activity with given timeout value +* @param[in] TimeOut WDT reset after timeout if it is not feed +* @return None + **********************************************************************/ +void WDT_Start(uint32_t TimeOut) +{ + uint32_t ClkSrc; + + ClkSrc = LPC_WDT->WDCLKSEL; + ClkSrc &=WDT_WDCLKSEL_MASK; + WDT_SetTimeOut(ClkSrc,TimeOut); + //enable watchdog + LPC_WDT->WDMOD |= WDT_WDMOD_WDEN; + WDT_Feed(); +} + +/********************************************************************//** + * @brief Read WDT Time out flag + * @param[in] None + * @return Time out flag status of WDT + *********************************************************************/ +FlagStatus WDT_ReadTimeOutFlag (void) +{ + return ((FlagStatus)((LPC_WDT->WDMOD & WDT_WDMOD_WDTOF) >>2)); +} + +/********************************************************************//** + * @brief Clear WDT Time out flag + * @param[in] None + * @return None + *********************************************************************/ +void WDT_ClrTimeOutFlag (void) +{ + LPC_WDT->WDMOD &=~WDT_WDMOD_WDTOF; +} + +/********************************************************************//** + * @brief Update WDT timeout value and feed + * @param[in] TimeOut TimeOut value to be updated + * @return None + *********************************************************************/ +void WDT_UpdateTimeOut ( uint32_t TimeOut) +{ + uint32_t ClkSrc; + ClkSrc = LPC_WDT->WDCLKSEL; + ClkSrc &=WDT_WDCLKSEL_MASK; + WDT_SetTimeOut(ClkSrc,TimeOut); + WDT_Feed(); +} + + +/********************************************************************//** + * @brief After set WDTEN, call this function to start Watchdog + * or reload the Watchdog timer + * @param[in] None + * + * @return None + *********************************************************************/ +void WDT_Feed (void) +{ + // Disable irq interrupt + __disable_irq(); + LPC_WDT->WDFEED = 0xAA; + LPC_WDT->WDFEED = 0x55; + // Then enable irq interrupt + __enable_irq(); +} + +/********************************************************************//** + * @brief Get the current value of WDT + * @param[in] None + * @return current value of WDT + *********************************************************************/ +uint32_t WDT_GetCurrentCount(void) +{ + return LPC_WDT->WDTV; +} + +/** + * @} + */ + +#endif /* _WDT */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/LPC17xx.h b/frameworks/CMSIS/LPC1768/include/LPC17xx.h new file mode 100644 index 0000000000..2276260195 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/LPC17xx.h @@ -0,0 +1,1078 @@ +/**************************************************************************//** + * @file LPC17xx.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File for + * NXP LPC17xx Device Series + * @version: V1.09 + * @date: 25. July. 2011 + * + * @note + * Copyright (C) 2009 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + + +#ifndef __LPC17xx_H__ +#define __LPC17xx_H__ + +/* + * ========================================================================== + * ---------- Interrupt Number Definition ----------------------------------- + * ========================================================================== + */ + +/** @addtogroup LPC17xx_System + * @{ + */ + +/** @brief IRQ interrupt source definition */ +typedef enum IRQn +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** LPC17xx Specific Interrupt Numbers *******************************************************/ + WDT_IRQn = 0, /*!< Watchdog Timer Interrupt */ + TIMER0_IRQn = 1, /*!< Timer0 Interrupt */ + TIMER1_IRQn = 2, /*!< Timer1 Interrupt */ + TIMER2_IRQn = 3, /*!< Timer2 Interrupt */ + TIMER3_IRQn = 4, /*!< Timer3 Interrupt */ + UART0_IRQn = 5, /*!< UART0 Interrupt */ + UART1_IRQn = 6, /*!< UART1 Interrupt */ + UART2_IRQn = 7, /*!< UART2 Interrupt */ + UART3_IRQn = 8, /*!< UART3 Interrupt */ + PWM1_IRQn = 9, /*!< PWM1 Interrupt */ + I2C0_IRQn = 10, /*!< I2C0 Interrupt */ + I2C1_IRQn = 11, /*!< I2C1 Interrupt */ + I2C2_IRQn = 12, /*!< I2C2 Interrupt */ + SPI_IRQn = 13, /*!< SPI Interrupt */ + SSP0_IRQn = 14, /*!< SSP0 Interrupt */ + SSP1_IRQn = 15, /*!< SSP1 Interrupt */ + PLL0_IRQn = 16, /*!< PLL0 Lock (Main PLL) Interrupt */ + RTC_IRQn = 17, /*!< Real Time Clock Interrupt */ + EINT0_IRQn = 18, /*!< External Interrupt 0 Interrupt */ + EINT1_IRQn = 19, /*!< External Interrupt 1 Interrupt */ + EINT2_IRQn = 20, /*!< External Interrupt 2 Interrupt */ + EINT3_IRQn = 21, /*!< External Interrupt 3 Interrupt */ + ADC_IRQn = 22, /*!< A/D Converter Interrupt */ + BOD_IRQn = 23, /*!< Brown-Out Detect Interrupt */ + USB_IRQn = 24, /*!< USB Interrupt */ + CAN_IRQn = 25, /*!< CAN Interrupt */ + DMA_IRQn = 26, /*!< General Purpose DMA Interrupt */ + I2S_IRQn = 27, /*!< I2S Interrupt */ + ENET_IRQn = 28, /*!< Ethernet Interrupt */ + RIT_IRQn = 29, /*!< Repetitive Interrupt Timer Interrupt */ + MCPWM_IRQn = 30, /*!< Motor Control PWM Interrupt */ + QEI_IRQn = 31, /*!< Quadrature Encoder Interface Interrupt */ + PLL1_IRQn = 32, /*!< PLL1 Lock (USB PLL) Interrupt */ + USBActivity_IRQn = 33, /*!< USB Activity Interrupt */ + CANActivity_IRQn = 34 /*!< CAN Activity Interrupt */ +} IRQn_Type; + + +/* + * ========================================================================== + * ----------- Processor and Core Peripheral Section ------------------------ + * ========================================================================== + */ + +/* Configuration of the Cortex-M3 Processor and Core Peripherals */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ +#define __NVIC_PRIO_BITS 5 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 1 /*!< Set to 1 if different SysTick Config is used */ + + +#include "core_cm3.h" /* Cortex-M3 processor and core peripherals */ +#include "system_LPC17xx.h" /* System Header */ + + +/******************************************************************************/ +/* Device Specific Peripheral registers structures */ +/******************************************************************************/ + +#if defined ( __CC_ARM ) +#pragma anon_unions +#endif + +/*------------- System Control (SC) ------------------------------------------*/ +/** @brief System Control (SC) register structure definition */ +typedef struct +{ + __IO uint32_t FLASHCFG; /* Flash Accelerator Module */ + uint32_t RESERVED0[31]; + __IO uint32_t PLL0CON; /* Clocking and Power Control */ + __IO uint32_t PLL0CFG; + __I uint32_t PLL0STAT; + __O uint32_t PLL0FEED; + uint32_t RESERVED1[4]; + __IO uint32_t PLL1CON; + __IO uint32_t PLL1CFG; + __I uint32_t PLL1STAT; + __O uint32_t PLL1FEED; + uint32_t RESERVED2[4]; + __IO uint32_t PCON; + __IO uint32_t PCONP; + uint32_t RESERVED3[15]; + __IO uint32_t CCLKCFG; + __IO uint32_t USBCLKCFG; + __IO uint32_t CLKSRCSEL; + __IO uint32_t CANSLEEPCLR; + __IO uint32_t CANWAKEFLAGS; + uint32_t RESERVED4[10]; + __IO uint32_t EXTINT; /* External Interrupts */ + uint32_t RESERVED5; + __IO uint32_t EXTMODE; + __IO uint32_t EXTPOLAR; + uint32_t RESERVED6[12]; + __IO uint32_t RSID; /* Reset */ + uint32_t RESERVED7[7]; + __IO uint32_t SCS; /* Syscon Miscellaneous Registers */ + __IO uint32_t IRCTRIM; /* Clock Dividers */ + __IO uint32_t PCLKSEL0; + __IO uint32_t PCLKSEL1; + uint32_t RESERVED8[4]; + __IO uint32_t USBIntSt; /* USB Device/OTG Interrupt Register */ + __IO uint32_t DMAREQSEL; + __IO uint32_t CLKOUTCFG; /* Clock Output Configuration */ + } LPC_SC_TypeDef; + +/*------------- Pin Connect Block (PINCON) -----------------------------------*/ +/** @brief Pin Connect Block (PINCON) register structure definition */ +typedef struct +{ + __IO uint32_t PINSEL0; + __IO uint32_t PINSEL1; + __IO uint32_t PINSEL2; + __IO uint32_t PINSEL3; + __IO uint32_t PINSEL4; + __IO uint32_t PINSEL5; + __IO uint32_t PINSEL6; + __IO uint32_t PINSEL7; + __IO uint32_t PINSEL8; + __IO uint32_t PINSEL9; + __IO uint32_t PINSEL10; + uint32_t RESERVED0[5]; + __IO uint32_t PINMODE0; + __IO uint32_t PINMODE1; + __IO uint32_t PINMODE2; + __IO uint32_t PINMODE3; + __IO uint32_t PINMODE4; + __IO uint32_t PINMODE5; + __IO uint32_t PINMODE6; + __IO uint32_t PINMODE7; + __IO uint32_t PINMODE8; + __IO uint32_t PINMODE9; + __IO uint32_t PINMODE_OD0; + __IO uint32_t PINMODE_OD1; + __IO uint32_t PINMODE_OD2; + __IO uint32_t PINMODE_OD3; + __IO uint32_t PINMODE_OD4; + __IO uint32_t I2CPADCFG; +} LPC_PINCON_TypeDef; + +/*------------- General Purpose Input/Output (GPIO) --------------------------*/ +/** @brief General Purpose Input/Output (GPIO) register structure definition */ +typedef struct +{ + union { + __IO uint32_t FIODIR; + struct { + __IO uint16_t FIODIRL; + __IO uint16_t FIODIRH; + }; + struct { + __IO uint8_t FIODIR0; + __IO uint8_t FIODIR1; + __IO uint8_t FIODIR2; + __IO uint8_t FIODIR3; + }; + }; + uint32_t RESERVED0[3]; + union { + __IO uint32_t FIOMASK; + struct { + __IO uint16_t FIOMASKL; + __IO uint16_t FIOMASKH; + }; + struct { + __IO uint8_t FIOMASK0; + __IO uint8_t FIOMASK1; + __IO uint8_t FIOMASK2; + __IO uint8_t FIOMASK3; + }; + }; + union { + __IO uint32_t FIOPIN; + struct { + __IO uint16_t FIOPINL; + __IO uint16_t FIOPINH; + }; + struct { + __IO uint8_t FIOPIN0; + __IO uint8_t FIOPIN1; + __IO uint8_t FIOPIN2; + __IO uint8_t FIOPIN3; + }; + }; + union { + __IO uint32_t FIOSET; + struct { + __IO uint16_t FIOSETL; + __IO uint16_t FIOSETH; + }; + struct { + __IO uint8_t FIOSET0; + __IO uint8_t FIOSET1; + __IO uint8_t FIOSET2; + __IO uint8_t FIOSET3; + }; + }; + union { + __O uint32_t FIOCLR; + struct { + __O uint16_t FIOCLRL; + __O uint16_t FIOCLRH; + }; + struct { + __O uint8_t FIOCLR0; + __O uint8_t FIOCLR1; + __O uint8_t FIOCLR2; + __O uint8_t FIOCLR3; + }; + }; +} LPC_GPIO_TypeDef; + +/** @brief General Purpose Input/Output interrupt (GPIOINT) register structure definition */ +typedef struct +{ + __I uint32_t IntStatus; + __I uint32_t IO0IntStatR; + __I uint32_t IO0IntStatF; + __O uint32_t IO0IntClr; + __IO uint32_t IO0IntEnR; + __IO uint32_t IO0IntEnF; + uint32_t RESERVED0[3]; + __I uint32_t IO2IntStatR; + __I uint32_t IO2IntStatF; + __O uint32_t IO2IntClr; + __IO uint32_t IO2IntEnR; + __IO uint32_t IO2IntEnF; +} LPC_GPIOINT_TypeDef; + +/*------------- Timer (TIM) --------------------------------------------------*/ +/** @brief Timer (TIM) register structure definition */ +typedef struct +{ + __IO uint32_t IR; + __IO uint32_t TCR; + __IO uint32_t TC; + __IO uint32_t PR; + __IO uint32_t PC; + __IO uint32_t MCR; + __IO uint32_t MR0; + __IO uint32_t MR1; + __IO uint32_t MR2; + __IO uint32_t MR3; + __IO uint32_t CCR; + __I uint32_t CR0; + __I uint32_t CR1; + uint32_t RESERVED0[2]; + __IO uint32_t EMR; + uint32_t RESERVED1[12]; + __IO uint32_t CTCR; +} LPC_TIM_TypeDef; + +/*------------- Pulse-Width Modulation (PWM) ---------------------------------*/ +/** @brief Pulse-Width Modulation (PWM) register structure definition */ +typedef struct +{ + __IO uint32_t IR; + __IO uint32_t TCR; + __IO uint32_t TC; + __IO uint32_t PR; + __IO uint32_t PC; + __IO uint32_t MCR; + __IO uint32_t MR0; + __IO uint32_t MR1; + __IO uint32_t MR2; + __IO uint32_t MR3; + __IO uint32_t CCR; + __I uint32_t CR0; + __I uint32_t CR1; + __I uint32_t CR2; + __I uint32_t CR3; + uint32_t RESERVED0; + __IO uint32_t MR4; + __IO uint32_t MR5; + __IO uint32_t MR6; + __IO uint32_t PCR; + __IO uint32_t LER; + uint32_t RESERVED1[7]; + __IO uint32_t CTCR; +} LPC_PWM_TypeDef; + +/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/ +/** @brief Universal Asynchronous Receiver Transmitter (UART) register structure definition */ +typedef struct +{ + union { + __I uint8_t RBR; + __O uint8_t THR; + __IO uint8_t DLL; + uint32_t RESERVED0; + }; + union { + __IO uint8_t DLM; + __IO uint32_t IER; + }; + union { + __I uint32_t IIR; + __O uint8_t FCR; + }; + __IO uint8_t LCR; + uint8_t RESERVED1[7]; + __I uint8_t LSR; + uint8_t RESERVED2[7]; + __IO uint8_t SCR; + uint8_t RESERVED3[3]; + __IO uint32_t ACR; + __IO uint8_t ICR; + uint8_t RESERVED4[3]; + __IO uint8_t FDR; + uint8_t RESERVED5[7]; + __IO uint8_t TER; + uint8_t RESERVED6[39]; + __I uint8_t FIFOLVL; +} LPC_UART_TypeDef; + +/** @brief Universal Asynchronous Receiver Transmitter 0 (UART0) register structure definition */ +typedef struct +{ + union { + __I uint8_t RBR; + __O uint8_t THR; + __IO uint8_t DLL; + uint32_t RESERVED0; + }; + union { + __IO uint8_t DLM; + __IO uint32_t IER; + }; + union { + __I uint32_t IIR; + __O uint8_t FCR; + }; + __IO uint8_t LCR; + uint8_t RESERVED1[7]; + __I uint8_t LSR; + uint8_t RESERVED2[7]; + __IO uint8_t SCR; + uint8_t RESERVED3[3]; + __IO uint32_t ACR; + __IO uint8_t ICR; + uint8_t RESERVED4[3]; + __IO uint8_t FDR; + uint8_t RESERVED5[7]; + __IO uint8_t TER; + uint8_t RESERVED6[39]; + __I uint8_t FIFOLVL; +} LPC_UART0_TypeDef; + +/** @brief Universal Asynchronous Receiver Transmitter 1 (UART1) register structure definition */ +typedef struct +{ + union { + __I uint8_t RBR; + __O uint8_t THR; + __IO uint8_t DLL; + uint32_t RESERVED0; + }; + union { + __IO uint8_t DLM; + __IO uint32_t IER; + }; + union { + __I uint32_t IIR; + __O uint8_t FCR; + }; + __IO uint8_t LCR; + uint8_t RESERVED1[3]; + __IO uint8_t MCR; + uint8_t RESERVED2[3]; + __I uint8_t LSR; + uint8_t RESERVED3[3]; + __I uint8_t MSR; + uint8_t RESERVED4[3]; + __IO uint8_t SCR; + uint8_t RESERVED5[3]; + __IO uint32_t ACR; + uint32_t RESERVED6; + __IO uint32_t FDR; + uint32_t RESERVED7; + __IO uint8_t TER; + uint8_t RESERVED8[27]; + __IO uint8_t RS485CTRL; + uint8_t RESERVED9[3]; + __IO uint8_t ADRMATCH; + uint8_t RESERVED10[3]; + __IO uint8_t RS485DLY; + uint8_t RESERVED11[3]; + __I uint8_t FIFOLVL; +} LPC_UART1_TypeDef; + +/*------------- Serial Peripheral Interface (SPI) ----------------------------*/ +/** @brief Serial Peripheral Interface (SPI) register structure definition */ +typedef struct +{ + __IO uint32_t SPCR; + __I uint32_t SPSR; + __IO uint32_t SPDR; + __IO uint32_t SPCCR; + uint32_t RESERVED0[3]; + __IO uint32_t SPINT; +} LPC_SPI_TypeDef; + +/*------------- Synchronous Serial Communication (SSP) -----------------------*/ +/** @brief Synchronous Serial Communication (SSP) register structure definition */ +typedef struct +{ + __IO uint32_t CR0; + __IO uint32_t CR1; + __IO uint32_t DR; + __I uint32_t SR; + __IO uint32_t CPSR; + __IO uint32_t IMSC; + __IO uint32_t RIS; + __IO uint32_t MIS; + __IO uint32_t ICR; + __IO uint32_t DMACR; +} LPC_SSP_TypeDef; + +/*------------- Inter-Integrated Circuit (I2C) -------------------------------*/ +/** @brief Inter-Integrated Circuit (I2C) register structure definition */ +typedef struct +{ + __IO uint32_t I2CONSET; + __I uint32_t I2STAT; + __IO uint32_t I2DAT; + __IO uint32_t I2ADR0; + __IO uint32_t I2SCLH; + __IO uint32_t I2SCLL; + __O uint32_t I2CONCLR; + __IO uint32_t MMCTRL; + __IO uint32_t I2ADR1; + __IO uint32_t I2ADR2; + __IO uint32_t I2ADR3; + __I uint32_t I2DATA_BUFFER; + __IO uint32_t I2MASK0; + __IO uint32_t I2MASK1; + __IO uint32_t I2MASK2; + __IO uint32_t I2MASK3; +} LPC_I2C_TypeDef; + +/*------------- Inter IC Sound (I2S) -----------------------------------------*/ +/** @brief Inter IC Sound (I2S) register structure definition */ +typedef struct +{ + __IO uint32_t I2SDAO; + __IO uint32_t I2SDAI; + __O uint32_t I2STXFIFO; + __I uint32_t I2SRXFIFO; + __I uint32_t I2SSTATE; + __IO uint32_t I2SDMA1; + __IO uint32_t I2SDMA2; + __IO uint32_t I2SIRQ; + __IO uint32_t I2STXRATE; + __IO uint32_t I2SRXRATE; + __IO uint32_t I2STXBITRATE; + __IO uint32_t I2SRXBITRATE; + __IO uint32_t I2STXMODE; + __IO uint32_t I2SRXMODE; +} LPC_I2S_TypeDef; + +/*------------- Repetitive Interrupt Timer (RIT) -----------------------------*/ +/** @brief Repetitive Interrupt Timer (RIT) register structure definition */ +typedef struct +{ + __IO uint32_t RICOMPVAL; + __IO uint32_t RIMASK; + __IO uint8_t RICTRL; + uint8_t RESERVED0[3]; + __IO uint32_t RICOUNTER; +} LPC_RIT_TypeDef; + +/*------------- Real-Time Clock (RTC) ----------------------------------------*/ +/** @brief Real-Time Clock (RTC) register structure definition */ +typedef struct +{ + __IO uint8_t ILR; + uint8_t RESERVED0[7]; + __IO uint8_t CCR; + uint8_t RESERVED1[3]; + __IO uint8_t CIIR; + uint8_t RESERVED2[3]; + __IO uint8_t AMR; + uint8_t RESERVED3[3]; + __I uint32_t CTIME0; + __I uint32_t CTIME1; + __I uint32_t CTIME2; + __IO uint8_t SEC; + uint8_t RESERVED4[3]; + __IO uint8_t MIN; + uint8_t RESERVED5[3]; + __IO uint8_t HOUR; + uint8_t RESERVED6[3]; + __IO uint8_t DOM; + uint8_t RESERVED7[3]; + __IO uint8_t DOW; + uint8_t RESERVED8[3]; + __IO uint16_t DOY; + uint16_t RESERVED9; + __IO uint8_t MONTH; + uint8_t RESERVED10[3]; + __IO uint16_t YEAR; + uint16_t RESERVED11; + __IO uint32_t CALIBRATION; + __IO uint32_t GPREG0; + __IO uint32_t GPREG1; + __IO uint32_t GPREG2; + __IO uint32_t GPREG3; + __IO uint32_t GPREG4; + __IO uint8_t RTC_AUXEN; + uint8_t RESERVED12[3]; + __IO uint8_t RTC_AUX; + uint8_t RESERVED13[3]; + __IO uint8_t ALSEC; + uint8_t RESERVED14[3]; + __IO uint8_t ALMIN; + uint8_t RESERVED15[3]; + __IO uint8_t ALHOUR; + uint8_t RESERVED16[3]; + __IO uint8_t ALDOM; + uint8_t RESERVED17[3]; + __IO uint8_t ALDOW; + uint8_t RESERVED18[3]; + __IO uint16_t ALDOY; + uint16_t RESERVED19; + __IO uint8_t ALMON; + uint8_t RESERVED20[3]; + __IO uint16_t ALYEAR; + uint16_t RESERVED21; +} LPC_RTC_TypeDef; + +/*------------- Watchdog Timer (WDT) -----------------------------------------*/ +/** @brief Watchdog Timer (WDT) register structure definition */ +typedef struct +{ + __IO uint8_t WDMOD; + uint8_t RESERVED0[3]; + __IO uint32_t WDTC; + __O uint8_t WDFEED; + uint8_t RESERVED1[3]; + __I uint32_t WDTV; + __IO uint32_t WDCLKSEL; +} LPC_WDT_TypeDef; + +/*------------- Analog-to-Digital Converter (ADC) ----------------------------*/ +/** @brief Analog-to-Digital Converter (ADC) register structure definition */ +typedef struct +{ + __IO uint32_t ADCR; + __IO uint32_t ADGDR; + uint32_t RESERVED0; + __IO uint32_t ADINTEN; + __I uint32_t ADDR0; + __I uint32_t ADDR1; + __I uint32_t ADDR2; + __I uint32_t ADDR3; + __I uint32_t ADDR4; + __I uint32_t ADDR5; + __I uint32_t ADDR6; + __I uint32_t ADDR7; + __I uint32_t ADSTAT; + __IO uint32_t ADTRM; +} LPC_ADC_TypeDef; + +/*------------- Digital-to-Analog Converter (DAC) ----------------------------*/ +/** @brief Digital-to-Analog Converter (DAC) register structure definition */ +typedef struct +{ + __IO uint32_t DACR; + __IO uint32_t DACCTRL; + __IO uint16_t DACCNTVAL; +} LPC_DAC_TypeDef; + +/*------------- Motor Control Pulse-Width Modulation (MCPWM) -----------------*/ +/** @brief Motor Control Pulse-Width Modulation (MCPWM) register structure definition */ +typedef struct +{ + __I uint32_t MCCON; + __O uint32_t MCCON_SET; + __O uint32_t MCCON_CLR; + __I uint32_t MCCAPCON; + __O uint32_t MCCAPCON_SET; + __O uint32_t MCCAPCON_CLR; + __IO uint32_t MCTIM0; + __IO uint32_t MCTIM1; + __IO uint32_t MCTIM2; + __IO uint32_t MCPER0; + __IO uint32_t MCPER1; + __IO uint32_t MCPER2; + __IO uint32_t MCPW0; + __IO uint32_t MCPW1; + __IO uint32_t MCPW2; + __IO uint32_t MCDEADTIME; + __IO uint32_t MCCCP; + __IO uint32_t MCCR0; + __IO uint32_t MCCR1; + __IO uint32_t MCCR2; + __I uint32_t MCINTEN; + __O uint32_t MCINTEN_SET; + __O uint32_t MCINTEN_CLR; + __I uint32_t MCCNTCON; + __O uint32_t MCCNTCON_SET; + __O uint32_t MCCNTCON_CLR; + __I uint32_t MCINTFLAG; + __O uint32_t MCINTFLAG_SET; + __O uint32_t MCINTFLAG_CLR; + __O uint32_t MCCAP_CLR; +} LPC_MCPWM_TypeDef; + +/*------------- Quadrature Encoder Interface (QEI) ---------------------------*/ +/** @brief Quadrature Encoder Interface (QEI) register structure definition */ +typedef struct +{ + __O uint32_t QEICON; + __I uint32_t QEISTAT; + __IO uint32_t QEICONF; + __I uint32_t QEIPOS; + __IO uint32_t QEIMAXPOS; + __IO uint32_t CMPOS0; + __IO uint32_t CMPOS1; + __IO uint32_t CMPOS2; + __I uint32_t INXCNT; + __IO uint32_t INXCMP; + __IO uint32_t QEILOAD; + __I uint32_t QEITIME; + __I uint32_t QEIVEL; + __I uint32_t QEICAP; + __IO uint32_t VELCOMP; + __IO uint32_t FILTER; + uint32_t RESERVED0[998]; + __O uint32_t QEIIEC; + __O uint32_t QEIIES; + __I uint32_t QEIINTSTAT; + __I uint32_t QEIIE; + __O uint32_t QEICLR; + __O uint32_t QEISET; +} LPC_QEI_TypeDef; + +/*------------- Controller Area Network (CAN) --------------------------------*/ +/** @brief Controller Area Network Acceptance Filter RAM (CANAF_RAM)structure definition */ +typedef struct +{ + __IO uint32_t mask[512]; /* ID Masks */ +} LPC_CANAF_RAM_TypeDef; + +/** @brief Controller Area Network Acceptance Filter(CANAF) register structure definition */ +typedef struct /* Acceptance Filter Registers */ +{ + __IO uint32_t AFMR; + __IO uint32_t SFF_sa; + __IO uint32_t SFF_GRP_sa; + __IO uint32_t EFF_sa; + __IO uint32_t EFF_GRP_sa; + __IO uint32_t ENDofTable; + __I uint32_t LUTerrAd; + __I uint32_t LUTerr; + __IO uint32_t FCANIE; + __IO uint32_t FCANIC0; + __IO uint32_t FCANIC1; +} LPC_CANAF_TypeDef; + +/** @brief Controller Area Network Central (CANCR) register structure definition */ +typedef struct /* Central Registers */ +{ + __I uint32_t CANTxSR; + __I uint32_t CANRxSR; + __I uint32_t CANMSR; +} LPC_CANCR_TypeDef; + +/** @brief Controller Area Network Controller (CAN) register structure definition */ +typedef struct /* Controller Registers */ +{ + __IO uint32_t MOD; + __O uint32_t CMR; + __IO uint32_t GSR; + __I uint32_t ICR; + __IO uint32_t IER; + __IO uint32_t BTR; + __IO uint32_t EWL; + __I uint32_t SR; + __IO uint32_t RFS; + __IO uint32_t RID; + __IO uint32_t RDA; + __IO uint32_t RDB; + __IO uint32_t TFI1; + __IO uint32_t TID1; + __IO uint32_t TDA1; + __IO uint32_t TDB1; + __IO uint32_t TFI2; + __IO uint32_t TID2; + __IO uint32_t TDA2; + __IO uint32_t TDB2; + __IO uint32_t TFI3; + __IO uint32_t TID3; + __IO uint32_t TDA3; + __IO uint32_t TDB3; +} LPC_CAN_TypeDef; + +/*------------- General Purpose Direct Memory Access (GPDMA) -----------------*/ +/** @brief General Purpose Direct Memory Access (GPDMA) register structure definition */ +typedef struct /* Common Registers */ +{ + __I uint32_t DMACIntStat; + __I uint32_t DMACIntTCStat; + __O uint32_t DMACIntTCClear; + __I uint32_t DMACIntErrStat; + __O uint32_t DMACIntErrClr; + __I uint32_t DMACRawIntTCStat; + __I uint32_t DMACRawIntErrStat; + __I uint32_t DMACEnbldChns; + __IO uint32_t DMACSoftBReq; + __IO uint32_t DMACSoftSReq; + __IO uint32_t DMACSoftLBReq; + __IO uint32_t DMACSoftLSReq; + __IO uint32_t DMACConfig; + __IO uint32_t DMACSync; +} LPC_GPDMA_TypeDef; + +/** @brief General Purpose Direct Memory Access Channel (GPDMACH) register structure definition */ +typedef struct /* Channel Registers */ +{ + __IO uint32_t DMACCSrcAddr; + __IO uint32_t DMACCDestAddr; + __IO uint32_t DMACCLLI; + __IO uint32_t DMACCControl; + __IO uint32_t DMACCConfig; +} LPC_GPDMACH_TypeDef; + +/*------------- Universal Serial Bus (USB) -----------------------------------*/ +/** @brief Universal Serial Bus (USB) register structure definition */ +typedef struct +{ + __I uint32_t HcRevision; /* USB Host Registers */ + __IO uint32_t HcControl; + __IO uint32_t HcCommandStatus; + __IO uint32_t HcInterruptStatus; + __IO uint32_t HcInterruptEnable; + __IO uint32_t HcInterruptDisable; + __IO uint32_t HcHCCA; + __I uint32_t HcPeriodCurrentED; + __IO uint32_t HcControlHeadED; + __IO uint32_t HcControlCurrentED; + __IO uint32_t HcBulkHeadED; + __IO uint32_t HcBulkCurrentED; + __I uint32_t HcDoneHead; + __IO uint32_t HcFmInterval; + __I uint32_t HcFmRemaining; + __I uint32_t HcFmNumber; + __IO uint32_t HcPeriodicStart; + __IO uint32_t HcLSTreshold; + __IO uint32_t HcRhDescriptorA; + __IO uint32_t HcRhDescriptorB; + __IO uint32_t HcRhStatus; + __IO uint32_t HcRhPortStatus1; + __IO uint32_t HcRhPortStatus2; + uint32_t RESERVED0[40]; + __I uint32_t Module_ID; + + __I uint32_t OTGIntSt; /* USB On-The-Go Registers */ + __IO uint32_t OTGIntEn; + __O uint32_t OTGIntSet; + __O uint32_t OTGIntClr; + __IO uint32_t OTGStCtrl; + __IO uint32_t OTGTmr; + uint32_t RESERVED1[58]; + + __I uint32_t USBDevIntSt; /* USB Device Interrupt Registers */ + __IO uint32_t USBDevIntEn; + __O uint32_t USBDevIntClr; + __O uint32_t USBDevIntSet; + + __O uint32_t USBCmdCode; /* USB Device SIE Command Registers */ + __I uint32_t USBCmdData; + + __I uint32_t USBRxData; /* USB Device Transfer Registers */ + __O uint32_t USBTxData; + __I uint32_t USBRxPLen; + __O uint32_t USBTxPLen; + __IO uint32_t USBCtrl; + __O uint32_t USBDevIntPri; + + __I uint32_t USBEpIntSt; /* USB Device Endpoint Interrupt Regs */ + __IO uint32_t USBEpIntEn; + __O uint32_t USBEpIntClr; + __O uint32_t USBEpIntSet; + __O uint32_t USBEpIntPri; + + __IO uint32_t USBReEp; /* USB Device Endpoint Realization Reg*/ + __O uint32_t USBEpInd; + __IO uint32_t USBMaxPSize; + + __I uint32_t USBDMARSt; /* USB Device DMA Registers */ + __O uint32_t USBDMARClr; + __O uint32_t USBDMARSet; + uint32_t RESERVED2[9]; + __IO uint32_t USBUDCAH; + __I uint32_t USBEpDMASt; + __O uint32_t USBEpDMAEn; + __O uint32_t USBEpDMADis; + __I uint32_t USBDMAIntSt; + __IO uint32_t USBDMAIntEn; + uint32_t RESERVED3[2]; + __I uint32_t USBEoTIntSt; + __O uint32_t USBEoTIntClr; + __O uint32_t USBEoTIntSet; + __I uint32_t USBNDDRIntSt; + __O uint32_t USBNDDRIntClr; + __O uint32_t USBNDDRIntSet; + __I uint32_t USBSysErrIntSt; + __O uint32_t USBSysErrIntClr; + __O uint32_t USBSysErrIntSet; + uint32_t RESERVED4[15]; + + union { + __I uint32_t I2C_RX; /* USB OTG I2C Registers */ + __O uint32_t I2C_TX; + }; + __I uint32_t I2C_STS; + __IO uint32_t I2C_CTL; + __IO uint32_t I2C_CLKHI; + __O uint32_t I2C_CLKLO; + uint32_t RESERVED5[824]; + + union { + __IO uint32_t USBClkCtrl; /* USB Clock Control Registers */ + __IO uint32_t OTGClkCtrl; + }; + union { + __I uint32_t USBClkSt; + __I uint32_t OTGClkSt; + }; +} LPC_USB_TypeDef; + +/*------------- Ethernet Media Access Controller (EMAC) ----------------------*/ +/** @brief Ethernet Media Access Controller (EMAC) register structure definition */ +typedef struct +{ + __IO uint32_t MAC1; /* MAC Registers */ + __IO uint32_t MAC2; + __IO uint32_t IPGT; + __IO uint32_t IPGR; + __IO uint32_t CLRT; + __IO uint32_t MAXF; + __IO uint32_t SUPP; + __IO uint32_t TEST; + __IO uint32_t MCFG; + __IO uint32_t MCMD; + __IO uint32_t MADR; + __O uint32_t MWTD; + __I uint32_t MRDD; + __I uint32_t MIND; + uint32_t RESERVED0[2]; + __IO uint32_t SA0; + __IO uint32_t SA1; + __IO uint32_t SA2; + uint32_t RESERVED1[45]; + __IO uint32_t Command; /* Control Registers */ + __I uint32_t Status; + __IO uint32_t RxDescriptor; + __IO uint32_t RxStatus; + __IO uint32_t RxDescriptorNumber; + __I uint32_t RxProduceIndex; + __IO uint32_t RxConsumeIndex; + __IO uint32_t TxDescriptor; + __IO uint32_t TxStatus; + __IO uint32_t TxDescriptorNumber; + __IO uint32_t TxProduceIndex; + __I uint32_t TxConsumeIndex; + uint32_t RESERVED2[10]; + __I uint32_t TSV0; + __I uint32_t TSV1; + __I uint32_t RSV; + uint32_t RESERVED3[3]; + __IO uint32_t FlowControlCounter; + __I uint32_t FlowControlStatus; + uint32_t RESERVED4[34]; + __IO uint32_t RxFilterCtrl; /* Rx Filter Registers */ + __IO uint32_t RxFilterWoLStatus; + __IO uint32_t RxFilterWoLClear; + uint32_t RESERVED5; + __IO uint32_t HashFilterL; + __IO uint32_t HashFilterH; + uint32_t RESERVED6[882]; + __I uint32_t IntStatus; /* Module Control Registers */ + __IO uint32_t IntEnable; + __O uint32_t IntClear; + __O uint32_t IntSet; + uint32_t RESERVED7; + __IO uint32_t PowerDown; + uint32_t RESERVED8; + __IO uint32_t Module_ID; +} LPC_EMAC_TypeDef; + + +#if defined ( __CC_ARM ) +#pragma no_anon_unions +#endif + + +/******************************************************************************/ +/* Peripheral memory map */ +/******************************************************************************/ +/* Base addresses */ +#define LPC_FLASH_BASE (0x00000000UL) +#define LPC_RAM_BASE (0x10000000UL) +#ifdef __LPC17XX_REV00 +#define LPC_AHBRAM0_BASE (0x20000000UL) +#define LPC_AHBRAM1_BASE (0x20004000UL) +#else +#define LPC_AHBRAM0_BASE (0x2007C000UL) +#define LPC_AHBRAM1_BASE (0x20080000UL) +#endif +#define LPC_GPIO_BASE (0x2009C000UL) +#define LPC_APB0_BASE (0x40000000UL) +#define LPC_APB1_BASE (0x40080000UL) +#define LPC_AHB_BASE (0x50000000UL) +#define LPC_CM3_BASE (0xE0000000UL) + +/* APB0 peripherals */ +#define LPC_WDT_BASE (LPC_APB0_BASE + 0x00000) +#define LPC_TIM0_BASE (LPC_APB0_BASE + 0x04000) +#define LPC_TIM1_BASE (LPC_APB0_BASE + 0x08000) +#define LPC_UART0_BASE (LPC_APB0_BASE + 0x0C000) +#define LPC_UART1_BASE (LPC_APB0_BASE + 0x10000) +#define LPC_PWM1_BASE (LPC_APB0_BASE + 0x18000) +#define LPC_I2C0_BASE (LPC_APB0_BASE + 0x1C000) +#define LPC_SPI_BASE (LPC_APB0_BASE + 0x20000) +#define LPC_RTC_BASE (LPC_APB0_BASE + 0x24000) +#define LPC_GPIOINT_BASE (LPC_APB0_BASE + 0x28080) +#define LPC_PINCON_BASE (LPC_APB0_BASE + 0x2C000) +#define LPC_SSP1_BASE (LPC_APB0_BASE + 0x30000) +#define LPC_ADC_BASE (LPC_APB0_BASE + 0x34000) +#define LPC_CANAF_RAM_BASE (LPC_APB0_BASE + 0x38000) +#define LPC_CANAF_BASE (LPC_APB0_BASE + 0x3C000) +#define LPC_CANCR_BASE (LPC_APB0_BASE + 0x40000) +#define LPC_CAN1_BASE (LPC_APB0_BASE + 0x44000) +#define LPC_CAN2_BASE (LPC_APB0_BASE + 0x48000) +#define LPC_I2C1_BASE (LPC_APB0_BASE + 0x5C000) + +/* APB1 peripherals */ +#define LPC_SSP0_BASE (LPC_APB1_BASE + 0x08000) +#define LPC_DAC_BASE (LPC_APB1_BASE + 0x0C000) +#define LPC_TIM2_BASE (LPC_APB1_BASE + 0x10000) +#define LPC_TIM3_BASE (LPC_APB1_BASE + 0x14000) +#define LPC_UART2_BASE (LPC_APB1_BASE + 0x18000) +#define LPC_UART3_BASE (LPC_APB1_BASE + 0x1C000) +#define LPC_I2C2_BASE (LPC_APB1_BASE + 0x20000) +#define LPC_I2S_BASE (LPC_APB1_BASE + 0x28000) +#define LPC_RIT_BASE (LPC_APB1_BASE + 0x30000) +#define LPC_MCPWM_BASE (LPC_APB1_BASE + 0x38000) +#define LPC_QEI_BASE (LPC_APB1_BASE + 0x3C000) +#define LPC_SC_BASE (LPC_APB1_BASE + 0x7C000) + +/* AHB peripherals */ +#define LPC_EMAC_BASE (LPC_AHB_BASE + 0x00000) +#define LPC_GPDMA_BASE (LPC_AHB_BASE + 0x04000) +#define LPC_GPDMACH0_BASE (LPC_AHB_BASE + 0x04100) +#define LPC_GPDMACH1_BASE (LPC_AHB_BASE + 0x04120) +#define LPC_GPDMACH2_BASE (LPC_AHB_BASE + 0x04140) +#define LPC_GPDMACH3_BASE (LPC_AHB_BASE + 0x04160) +#define LPC_GPDMACH4_BASE (LPC_AHB_BASE + 0x04180) +#define LPC_GPDMACH5_BASE (LPC_AHB_BASE + 0x041A0) +#define LPC_GPDMACH6_BASE (LPC_AHB_BASE + 0x041C0) +#define LPC_GPDMACH7_BASE (LPC_AHB_BASE + 0x041E0) +#define LPC_USB_BASE (LPC_AHB_BASE + 0x0C000) + +/* GPIOs */ +#define LPC_GPIO0_BASE (LPC_GPIO_BASE + 0x00000) +#define LPC_GPIO1_BASE (LPC_GPIO_BASE + 0x00020) +#define LPC_GPIO2_BASE (LPC_GPIO_BASE + 0x00040) +#define LPC_GPIO3_BASE (LPC_GPIO_BASE + 0x00060) +#define LPC_GPIO4_BASE (LPC_GPIO_BASE + 0x00080) + +/******************************************************************************/ +/* Peripheral declaration */ +/******************************************************************************/ +#define LPC_SC ((LPC_SC_TypeDef *) LPC_SC_BASE ) +#define LPC_GPIO0 ((LPC_GPIO_TypeDef *) LPC_GPIO0_BASE ) +#define LPC_GPIO1 ((LPC_GPIO_TypeDef *) LPC_GPIO1_BASE ) +#define LPC_GPIO2 ((LPC_GPIO_TypeDef *) LPC_GPIO2_BASE ) +#define LPC_GPIO3 ((LPC_GPIO_TypeDef *) LPC_GPIO3_BASE ) +#define LPC_GPIO4 ((LPC_GPIO_TypeDef *) LPC_GPIO4_BASE ) +#define LPC_WDT ((LPC_WDT_TypeDef *) LPC_WDT_BASE ) +#define LPC_TIM0 ((LPC_TIM_TypeDef *) LPC_TIM0_BASE ) +#define LPC_TIM1 ((LPC_TIM_TypeDef *) LPC_TIM1_BASE ) +#define LPC_TIM2 ((LPC_TIM_TypeDef *) LPC_TIM2_BASE ) +#define LPC_TIM3 ((LPC_TIM_TypeDef *) LPC_TIM3_BASE ) +#define LPC_RIT ((LPC_RIT_TypeDef *) LPC_RIT_BASE ) +#define LPC_UART0 ((LPC_UART_TypeDef *) LPC_UART0_BASE ) +#define LPC_UART1 ((LPC_UART1_TypeDef *) LPC_UART1_BASE ) +#define LPC_UART2 ((LPC_UART_TypeDef *) LPC_UART2_BASE ) +#define LPC_UART3 ((LPC_UART_TypeDef *) LPC_UART3_BASE ) +#define LPC_PWM1 ((LPC_PWM_TypeDef *) LPC_PWM1_BASE ) +#define LPC_I2C0 ((LPC_I2C_TypeDef *) LPC_I2C0_BASE ) +#define LPC_I2C1 ((LPC_I2C_TypeDef *) LPC_I2C1_BASE ) +#define LPC_I2C2 ((LPC_I2C_TypeDef *) LPC_I2C2_BASE ) +#define LPC_I2S ((LPC_I2S_TypeDef *) LPC_I2S_BASE ) +#define LPC_SPI ((LPC_SPI_TypeDef *) LPC_SPI_BASE ) +#define LPC_RTC ((LPC_RTC_TypeDef *) LPC_RTC_BASE ) +#define LPC_GPIOINT ((LPC_GPIOINT_TypeDef *) LPC_GPIOINT_BASE ) +#define LPC_PINCON ((LPC_PINCON_TypeDef *) LPC_PINCON_BASE ) +#define LPC_SSP0 ((LPC_SSP_TypeDef *) LPC_SSP0_BASE ) +#define LPC_SSP1 ((LPC_SSP_TypeDef *) LPC_SSP1_BASE ) +#define LPC_ADC ((LPC_ADC_TypeDef *) LPC_ADC_BASE ) +#define LPC_DAC ((LPC_DAC_TypeDef *) LPC_DAC_BASE ) +#define LPC_CANAF_RAM ((LPC_CANAF_RAM_TypeDef *) LPC_CANAF_RAM_BASE) +#define LPC_CANAF ((LPC_CANAF_TypeDef *) LPC_CANAF_BASE ) +#define LPC_CANCR ((LPC_CANCR_TypeDef *) LPC_CANCR_BASE ) +#define LPC_CAN1 ((LPC_CAN_TypeDef *) LPC_CAN1_BASE ) +#define LPC_CAN2 ((LPC_CAN_TypeDef *) LPC_CAN2_BASE ) +#define LPC_MCPWM ((LPC_MCPWM_TypeDef *) LPC_MCPWM_BASE ) +#define LPC_QEI ((LPC_QEI_TypeDef *) LPC_QEI_BASE ) +#define LPC_EMAC ((LPC_EMAC_TypeDef *) LPC_EMAC_BASE ) +#define LPC_GPDMA ((LPC_GPDMA_TypeDef *) LPC_GPDMA_BASE ) +#define LPC_GPDMACH0 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH0_BASE ) +#define LPC_GPDMACH1 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH1_BASE ) +#define LPC_GPDMACH2 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH2_BASE ) +#define LPC_GPDMACH3 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH3_BASE ) +#define LPC_GPDMACH4 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH4_BASE ) +#define LPC_GPDMACH5 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH5_BASE ) +#define LPC_GPDMACH6 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH6_BASE ) +#define LPC_GPDMACH7 ((LPC_GPDMACH_TypeDef *) LPC_GPDMACH7_BASE ) +#define LPC_USB ((LPC_USB_TypeDef *) LPC_USB_BASE ) + +/** + * @} + */ + +#endif // __LPC17xx_H__ diff --git a/frameworks/CMSIS/LPC1768/include/arm_common_tables.h b/frameworks/CMSIS/LPC1768/include/arm_common_tables.h new file mode 100644 index 0000000000..d55c46349f --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/arm_common_tables.h @@ -0,0 +1,35 @@ +/* ---------------------------------------------------------------------- +* Copyright (C) 2010 ARM Limited. All rights reserved. +* +* $Date: 11. November 2010 +* $Revision: V1.0.2 +* +* Project: CMSIS DSP Library +* Title: arm_common_tables.h +* +* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions +* +* Target Processor: Cortex-M4/Cortex-M3 +* +* Version 1.0.2 2010/11/11 +* Documentation updated. +* +* Version 1.0.1 2010/10/05 +* Production release and review comments incorporated. +* +* Version 1.0.0 2010/09/20 +* Production release and review comments incorporated. +* -------------------------------------------------------------------- */ + +#ifndef _ARM_COMMON_TABLES_H +#define _ARM_COMMON_TABLES_H + +#include "arm_math.h" + +extern uint16_t armBitRevTable[256]; +extern q15_t armRecipTableQ15[64]; +extern q31_t armRecipTableQ31[64]; +extern const q31_t realCoefAQ31[1024]; +extern const q31_t realCoefBQ31[1024]; + +#endif /* ARM_COMMON_TABLES_H */ diff --git a/frameworks/CMSIS/LPC1768/include/arm_math.h b/frameworks/CMSIS/LPC1768/include/arm_math.h new file mode 100644 index 0000000000..dc9acf670b --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/arm_math.h @@ -0,0 +1,7064 @@ +/* ---------------------------------------------------------------------- + * Copyright (C) 2010 ARM Limited. All rights reserved. + * + * $Date: 15. July 2011 + * $Revision: V1.0.10 + * + * Project: CMSIS DSP Library + * Title: arm_math.h + * + * Description: Public header file for CMSIS DSP Library + * + * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 + * + * Version 1.0.10 2011/7/15 + * Big Endian support added and Merged M0 and M3/M4 Source code. + * + * Version 1.0.3 2010/11/29 + * Re-organized the CMSIS folders and updated documentation. + * + * Version 1.0.2 2010/11/11 + * Documentation updated. + * + * Version 1.0.1 2010/10/05 + * Production release and review comments incorporated. + * + * Version 1.0.0 2010/09/20 + * Production release and review comments incorporated. + * -------------------------------------------------------------------- */ + +/** + \mainpage CMSIS DSP Software Library + * + * Introduction + * + * This user manual describes the CMSIS DSP software library, + * a suite of common signal processing functions for use on Cortex-M processor based devices. + * + * The library is divided into a number of modules each covering a specific category: + * - Basic math functions + * - Fast math functions + * - Complex math functions + * - Filters + * - Matrix functions + * - Transforms + * - Motor control functions + * - Statistical functions + * - Support functions + * - Interpolation functions + * + * The library has separate functions for operating on 8-bit integers, 16-bit integers, + * 32-bit integer and 32-bit floating-point values. + * + * Processor Support + * + * The library is completely written in C and is fully CMSIS compliant. + * High performance is achieved through maximum use of Cortex-M4 intrinsics. + * + * The supplied library source code also builds and runs on the Cortex-M3 and Cortex-M0 processor, + * with the DSP intrinsics being emulated through software. + * + * + * Toolchain Support + * + * The library has been developed and tested with MDK-ARM version 4.21. + * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. + * + * Using the Library + * + * The library installer contains prebuilt versions of the libraries in the Lib folder. + * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4) + * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4) + * - arm_cortexM4l_math.lib (Little endian on Cortex-M4) + * - arm_cortexM4b_math.lib (Big endian on Cortex-M4) + * - arm_cortexM3l_math.lib (Little endian on Cortex-M3) + * - arm_cortexM3b_math.lib (Big endian on Cortex-M3) + * - arm_cortexM0l_math.lib (Little endian on Cortex-M0) + * - arm_cortexM0b_math.lib (Big endian on Cortex-M3) + * + * The library functions are declared in the public file arm_math.h which is placed in the Include folder. + * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single + * public header file arm_math.h for Cortex-M4/M3/M0 with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. + * Define the appropriate pre processor MACRO ARM_MATH_CM4 or ARM_MATH_CM3 or + * ARM_MATH_CM0 depending on the target processor in the application. + * + * Examples + * + * The library ships with a number of examples which demonstrate how to use the library functions. + * + * Building the Library + * + * The library installer contains project files to re build libraries on MDK Tool chain in the CMSIS\DSP_Lib\Source\ARM folder. + * - arm_cortexM0b_math.uvproj + * - arm_cortexM0l_math.uvproj + * - arm_cortexM3b_math.uvproj + * - arm_cortexM3l_math.uvproj + * - arm_cortexM4b_math.uvproj + * - arm_cortexM4l_math.uvproj + * - arm_cortexM4bf_math.uvproj + * - arm_cortexM4lf_math.uvproj + * + * Each library project have differant pre-processor macros. + * + * ARM_MATH_CMx: + * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target + * and ARM_MATH_CM0 for building library on cortex-M0 target. + * + * ARM_MATH_BIG_ENDIAN: + * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. + * + * ARM_MATH_MATRIX_CHECK: + * Define macro for checking on the input and output sizes of matrices + * + * ARM_MATH_ROUNDING: + * Define macro for rounding on support functions + * + * __FPU_PRESENT: + * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries + * + * + * The project can be built by opening the appropriate project in MDK-ARM 4.21 chain and defining the optional pre processor MACROs detailed above. + * + * Copyright Notice + * + * Copyright (C) 2010 ARM Limited. All rights reserved. + */ + + +/** + * @ingroup DSP_Functions + * @defgroup groupMath Basic Math Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupFastMath Fast Math Functions + * This set of functions provides a fast approximation to sine, cosine, and square root. + * As compared to most of the other functions in the CMSIS math library, the fast math functions + * operate on individual values and not arrays. + * There are separate functions for Q15, Q31, and floating-point data. + * + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupCmplxMath Complex Math Functions + * This set of functions operates on complex data vectors. + * The data in the complex arrays is stored in an interleaved fashion + * (real, imag, real, imag, ...). + * In the API functions, the number of samples in a complex array refers + * to the number of complex values; the array contains twice this number of + * real values. + */ + + +/** + * @ingroup DSP_Functions + * @defgroup groupFilters Filtering Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupMatrix Matrix Functions + * + * This set of functions provides basic matrix math operations. + * The functions operate on matrix data structures. For example, + * the type + * definition for the floating-point matrix structure is shown + * below: + *
    + *     typedef struct
    + *     {
    + *       uint16_t numRows;     // number of rows of the matrix.
    + *       uint16_t numCols;     // number of columns of the matrix.
    + *       float32_t *pData;     // points to the data of the matrix.
    + *     } arm_matrix_instance_f32;
    + * 
    + * There are similar definitions for Q15 and Q31 data types. + * + * The structure specifies the size of the matrix and then points to + * an array of data. The array is of size numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
    + *     pData[i*numCols + j]
    + * 
    + * + * \par Init Functions + * There is an associated initialization function for each type of matrix + * data structure. + * The initialization function sets the values of the internal structure fields. + * Refer to the function arm_mat_init_f32(), arm_mat_init_q31() + * and arm_mat_init_q15() for floating-point, Q31 and Q15 types, respectively. + * + * \par + * Use of the initialization function is optional. However, if initialization function is used + * then the instance structure cannot be placed into a const data section. + * To place the instance structure in a const data + * section, manually initialize the data structure. For example: + *
    + * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
    + * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
    + * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
    + * 
    + * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData points to the + * data array. + * + * \par Size Checking + * By default all of the matrix functions perform size checking on the input and + * output matrices. For example, the matrix addition function verifies that the + * two input matrices and the output matrix all have the same number of rows and + * columns. If the size check fails the functions return: + *
    + *     ARM_MATH_SIZE_MISMATCH
    + * 
    + * Otherwise the functions return + *
    + *     ARM_MATH_SUCCESS
    + * 
    + * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the #define + *
    + *     ARM_MATH_MATRIX_CHECK
    + * 
    + * within the library project settings. By default this macro is defined + * and size checking is enabled. By changing the project settings and + * undefining this macro size checking is eliminated and the functions + * run a bit faster. With size checking disabled the functions always + * return ARM_MATH_SUCCESS. + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupTransforms Transform Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupController Controller Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupStats Statistics Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupSupport Support Functions + */ + +/** + * @ingroup DSP_Functions + * @defgroup groupInterpolation Interpolation Functions + * These functions perform 1- and 2-dimensional interpolation of data. + * Linear interpolation is used for 1-dimensional data and + * bilinear interpolation is used for 2-dimensional data. + */ + +/** + * @ingroup DSP_Lib + * @defgroup groupExamples Examples + */ +#ifndef _ARM_MATH_H +#define _ARM_MATH_H + +#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ + +#if defined (ARM_MATH_CM4) + #include "core_cm4.h" +#elif defined (ARM_MATH_CM3) + #include "core_cm3.h" +#elif defined (ARM_MATH_CM0) + #include "core_cm0.h" +#else +#include "ARMCM4.h" +#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....." +#endif + +#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ +#include "string.h" + #include "math.h" +#ifdef __cplusplus +extern "C" +{ +#endif + + + /** + * @brief Macros required for reciprocal calculation in Normalized LMS + */ + +#define DELTA_Q31 (0x100) +#define DELTA_Q15 0x5 +#define INDEX_MASK 0x0000003F +#define PI 3.14159265358979f + + /** + * @brief Macros required for SINE and COSINE Fast math approximations + */ + +#define TABLE_SIZE 256 +#define TABLE_SPACING_Q31 0x800000 +#define TABLE_SPACING_Q15 0x80 + + /** + * @brief Macros required for SINE and COSINE Controller functions + */ + /* 1.31(q31) Fixed value of 2/360 */ + /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ +#define INPUT_SPACING 0xB60B61 + + + /** + * @brief Error status returned by some functions in the library. + */ + + typedef enum + { + ARM_MATH_SUCCESS = 0, /**< No error */ + ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ + ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ + ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ + ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ + ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ + ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ + } arm_status; + + /** + * @brief 8-bit fractional data type in 1.7 format. + */ + typedef int8_t q7_t; + + /** + * @brief 16-bit fractional data type in 1.15 format. + */ + typedef int16_t q15_t; + + /** + * @brief 32-bit fractional data type in 1.31 format. + */ + typedef int32_t q31_t; + + /** + * @brief 64-bit fractional data type in 1.63 format. + */ + typedef int64_t q63_t; + + /** + * @brief 32-bit floating-point type definition. + */ + typedef float float32_t; + + /** + * @brief 64-bit floating-point type definition. + */ + typedef double float64_t; + + /** + * @brief definition to read/write two 16 bit values. + */ +#define __SIMD32(addr) (*(int32_t **) & (addr)) + +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) + /** + * @brief definition to pack two 16 bit values. + */ +#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ + (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) + +#endif + + + /** + * @brief definition to pack four 8 bit values. + */ +#ifndef ARM_MATH_BIG_ENDIAN + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) +#else + +#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) + +#endif + + + /** + * @brief Clips Q63 to Q31 values. + */ + static __INLINE q31_t clip_q63_to_q31( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; + } + + /** + * @brief Clips Q63 to Q15 values. + */ + static __INLINE q15_t clip_q63_to_q15( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); + } + + /** + * @brief Clips Q31 to Q7 values. + */ + static __INLINE q7_t clip_q31_to_q7( + q31_t x) + { + return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? + ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; + } + + /** + * @brief Clips Q31 to Q15 values. + */ + static __INLINE q15_t clip_q31_to_q15( + q31_t x) + { + return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? + ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; + } + + /** + * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. + */ + + static __INLINE q63_t mult32x64( + q63_t x, + q31_t y) + { + return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + + (((q63_t) (x >> 32) * y))); + } + + +#if defined (ARM_MATH_CM0) && defined ( __CC_ARM ) +#define __CLZ __clz +#endif + +#if defined (ARM_MATH_CM0) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) || defined (__TASKING__) ) + + static __INLINE uint32_t __CLZ(q31_t data); + + + static __INLINE uint32_t __CLZ(q31_t data) + { + uint32_t count = 0; + uint32_t mask = 0x80000000; + + while((data & mask) == 0) + { + count += 1u; + mask = mask >> 1u; + } + + return(count); + + } + +#endif + + /** + * @brief Function to Calculates 1/in(reciprocal) value of Q31 Data type. + */ + + static __INLINE uint32_t arm_recip_q31( + q31_t in, + q31_t * dst, + q31_t * pRecipTable) + { + + uint32_t out, tempVal; + uint32_t index, i; + uint32_t signBits; + + if(in > 0) + { + signBits = __CLZ(in) - 1; + } + else + { + signBits = __CLZ(-in) - 1; + } + + /* Convert input sample to 1.31 format */ + in = in << signBits; + + /* calculation of index for initial approximated Val */ + index = (uint32_t) (in >> 24u); + index = (index & INDEX_MASK); + + /* 1.31 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0u; i < 2u; i++) + { + tempVal = (q31_t) (((q63_t) in * out) >> 31u); + tempVal = 0x7FFFFFFF - tempVal; + /* 1.31 with exp 1 */ + //out = (q31_t) (((q63_t) out * tempVal) >> 30u); + out = (q31_t) clip_q63_to_q31(((q63_t) out * tempVal) >> 30u); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1u); + + } + + /** + * @brief Function to Calculates 1/in(reciprocal) value of Q15 Data type. + */ + static __INLINE uint32_t arm_recip_q15( + q15_t in, + q15_t * dst, + q15_t * pRecipTable) + { + + uint32_t out = 0, tempVal = 0; + uint32_t index = 0, i = 0; + uint32_t signBits = 0; + + if(in > 0) + { + signBits = __CLZ(in) - 17; + } + else + { + signBits = __CLZ(-in) - 17; + } + + /* Convert input sample to 1.15 format */ + in = in << signBits; + + /* calculation of index for initial approximated Val */ + index = in >> 8; + index = (index & INDEX_MASK); + + /* 1.15 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0; i < 2; i++) + { + tempVal = (q15_t) (((q31_t) in * out) >> 15); + tempVal = 0x7FFF - tempVal; + /* 1.15 with exp 1 */ + out = (q15_t) (((q31_t) out * tempVal) >> 14); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1); + + } + + + /* + * @brief C custom defined intrinisic function for only M0 processors + */ +#if defined(ARM_MATH_CM0) + + static __INLINE q31_t __SSAT( + q31_t x, + uint32_t y) + { + int32_t posMax, negMin; + uint32_t i; + + posMax = 1; + for (i = 0; i < (y - 1); i++) + { + posMax = posMax * 2; + } + + if(x > 0) + { + posMax = (posMax - 1); + + if(x > posMax) + { + x = posMax; + } + } + else + { + negMin = -posMax; + + if(x < negMin) + { + x = negMin; + } + } + return (x); + + + } + +#endif /* end of ARM_MATH_CM0 */ + + + + /* + * @brief C custom defined intrinsic function for M3 and M0 processors + */ +#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) + + /* + * @brief C custom defined QADD8 for M3 and M0 processors + */ + static __INLINE q31_t __QADD8( + q31_t x, + q31_t y) + { + + q31_t sum; + q7_t r, s, t, u; + + r = (char) x; + s = (char) y; + + r = __SSAT((q31_t) (r + s), 8); + s = __SSAT(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8); + t = __SSAT(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); + u = __SSAT(((q31_t) ((x >> 24) + (y >> 24))), 8); + + sum = (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | + (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); + + return sum; + + } + + /* + * @brief C custom defined QSUB8 for M3 and M0 processors + */ + static __INLINE q31_t __QSUB8( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s, t, u; + + r = (char) x; + s = (char) y; + + r = __SSAT((r - s), 8); + s = __SSAT(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; + t = __SSAT(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; + u = __SSAT(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; + + sum = + (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 0x000000FF); + + return sum; + } + + /* + * @brief C custom defined QADD16 for M3 and M0 processors + */ + + /* + * @brief C custom defined QADD16 for M3 and M0 processors + */ + static __INLINE q31_t __QADD16( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = __SSAT(r + s, 16); + s = __SSAT(((q31_t) ((x >> 16) + (y >> 16))), 16) << 16; + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + + } + + /* + * @brief C custom defined SHADD16 for M3 and M0 processors + */ + static __INLINE q31_t __SHADD16( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = ((r >> 1) + (s >> 1)); + s = ((q31_t) ((x >> 17) + (y >> 17))) << 16; + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + + } + + /* + * @brief C custom defined QSUB16 for M3 and M0 processors + */ + static __INLINE q31_t __QSUB16( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = __SSAT(r - s, 16); + s = __SSAT(((q31_t) ((x >> 16) - (y >> 16))), 16) << 16; + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + } + + /* + * @brief C custom defined SHSUB16 for M3 and M0 processors + */ + static __INLINE q31_t __SHSUB16( + q31_t x, + q31_t y) + { + + q31_t diff; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = ((r >> 1) - (s >> 1)); + s = (((x >> 17) - (y >> 17)) << 16); + + diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return diff; + } + + /* + * @brief C custom defined QASX for M3 and M0 processors + */ + static __INLINE q31_t __QASX( + q31_t x, + q31_t y) + { + + q31_t sum = 0; + + sum = ((sum + clip_q31_to_q15((q31_t) ((short) (x >> 16) + (short) y))) << 16) + + clip_q31_to_q15((q31_t) ((short) x - (short) (y >> 16))); + + return sum; + } + + /* + * @brief C custom defined SHASX for M3 and M0 processors + */ + static __INLINE q31_t __SHASX( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = ((r >> 1) - (y >> 17)); + s = (((x >> 17) + (s >> 1)) << 16); + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + } + + + /* + * @brief C custom defined QSAX for M3 and M0 processors + */ + static __INLINE q31_t __QSAX( + q31_t x, + q31_t y) + { + + q31_t sum = 0; + + sum = ((sum + clip_q31_to_q15((q31_t) ((short) (x >> 16) - (short) y))) << 16) + + clip_q31_to_q15((q31_t) ((short) x + (short) (y >> 16))); + + return sum; + } + + /* + * @brief C custom defined SHSAX for M3 and M0 processors + */ + static __INLINE q31_t __SHSAX( + q31_t x, + q31_t y) + { + + q31_t sum; + q31_t r, s; + + r = (short) x; + s = (short) y; + + r = ((r >> 1) + (y >> 17)); + s = (((x >> 17) - (s >> 1)) << 16); + + sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); + + return sum; + } + + /* + * @brief C custom defined SMUSDX for M3 and M0 processors + */ + static __INLINE q31_t __SMUSDX( + q31_t x, + q31_t y) + { + + return ((q31_t)(((short) x * (short) (y >> 16)) - + ((short) (x >> 16) * (short) y))); + } + + /* + * @brief C custom defined SMUADX for M3 and M0 processors + */ + static __INLINE q31_t __SMUADX( + q31_t x, + q31_t y) + { + + return ((q31_t)(((short) x * (short) (y >> 16)) + + ((short) (x >> 16) * (short) y))); + } + + /* + * @brief C custom defined QADD for M3 and M0 processors + */ + static __INLINE q31_t __QADD( + q31_t x, + q31_t y) + { + return clip_q63_to_q31((q63_t) x + y); + } + + /* + * @brief C custom defined QSUB for M3 and M0 processors + */ + static __INLINE q31_t __QSUB( + q31_t x, + q31_t y) + { + return clip_q63_to_q31((q63_t) x - y); + } + + /* + * @brief C custom defined SMLAD for M3 and M0 processors + */ + static __INLINE q31_t __SMLAD( + q31_t x, + q31_t y, + q31_t sum) + { + + return (sum + ((short) (x >> 16) * (short) (y >> 16)) + + ((short) x * (short) y)); + } + + /* + * @brief C custom defined SMLADX for M3 and M0 processors + */ + static __INLINE q31_t __SMLADX( + q31_t x, + q31_t y, + q31_t sum) + { + + return (sum + ((short) (x >> 16) * (short) (y)) + + ((short) x * (short) (y >> 16))); + } + + /* + * @brief C custom defined SMLSDX for M3 and M0 processors + */ + static __INLINE q31_t __SMLSDX( + q31_t x, + q31_t y, + q31_t sum) + { + + return (sum - ((short) (x >> 16) * (short) (y)) + + ((short) x * (short) (y >> 16))); + } + + /* + * @brief C custom defined SMLALD for M3 and M0 processors + */ + static __INLINE q63_t __SMLALD( + q31_t x, + q31_t y, + q63_t sum) + { + + return (sum + ((short) (x >> 16) * (short) (y >> 16)) + + ((short) x * (short) y)); + } + + /* + * @brief C custom defined SMLALDX for M3 and M0 processors + */ + static __INLINE q63_t __SMLALDX( + q31_t x, + q31_t y, + q63_t sum) + { + + return (sum + ((short) (x >> 16) * (short) y)) + + ((short) x * (short) (y >> 16)); + } + + /* + * @brief C custom defined SMUAD for M3 and M0 processors + */ + static __INLINE q31_t __SMUAD( + q31_t x, + q31_t y) + { + + return (((x >> 16) * (y >> 16)) + + (((x << 16) >> 16) * ((y << 16) >> 16))); + } + + /* + * @brief C custom defined SMUSD for M3 and M0 processors + */ + static __INLINE q31_t __SMUSD( + q31_t x, + q31_t y) + { + + return (-((x >> 16) * (y >> 16)) + + (((x << 16) >> 16) * ((y << 16) >> 16))); + } + + + + +#endif /* (ARM_MATH_CM3) || defined (ARM_MATH_CM0) */ + + + /** + * @brief Instance structure for the Q7 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q7; + + /** + * @brief Instance structure for the Q15 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_f32; + + + /** + * @brief Processing function for the Q7 FIR filter. + * @param[in] *S points to an instance of the Q7 FIR filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_q7( + const arm_fir_instance_q7 * S, + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q7 FIR filter. + * @param[in,out] *S points to an instance of the Q7 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of samples that are processed. + * @return none + */ + void arm_fir_init_q7( + arm_fir_instance_q7 * S, + uint16_t numTaps, + q7_t * pCoeffs, + q7_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR filter. + * @param[in] *S points to an instance of the Q15 FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q15 FIR filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_fast_q15( + const arm_fir_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q15 FIR filter. + * @param[in,out] *S points to an instance of the Q15 FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if + * numTaps is not a supported value. + */ + + arm_status arm_fir_init_q15( + arm_fir_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR filter. + * @param[in] *S points to an instance of the Q31 FIR filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q31 FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_fast_q31( + const arm_fir_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 FIR filter. + * @param[in,out] *S points to an instance of the Q31 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return none. + */ + void arm_fir_init_q31( + arm_fir_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the floating-point FIR filter. + * @param[in] *S points to an instance of the floating-point FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_f32( + const arm_fir_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point FIR filter. + * @param[in,out] *S points to an instance of the floating-point FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return none. + */ + void arm_fir_init_f32( + arm_fir_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 Biquad cascade filter. + */ + typedef struct + { + int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + + } arm_biquad_casd_df1_inst_q15; + + + /** + * @brief Instance structure for the Q31 Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + + } arm_biquad_casd_df1_inst_q31; + + /** + * @brief Instance structure for the floating-point Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + + + } arm_biquad_casd_df1_inst_f32; + + + + /** + * @brief Processing function for the Q15 Biquad cascade filter. + * @param[in] *S points to an instance of the Q15 Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q15 Biquad cascade filter. + * @param[in,out] *S points to an instance of the Q15 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + * @return none + */ + + void arm_biquad_cascade_df1_init_q15( + arm_biquad_casd_df1_inst_q15 * S, + uint8_t numStages, + q15_t * pCoeffs, + q15_t * pState, + int8_t postShift); + + + /** + * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q15 Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 Biquad cascade filter + * @param[in] *S points to an instance of the Q31 Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q31 Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 Biquad cascade filter. + * @param[in,out] *S points to an instance of the Q31 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + * @return none + */ + + void arm_biquad_cascade_df1_init_q31( + arm_biquad_casd_df1_inst_q31 * S, + uint8_t numStages, + q31_t * pCoeffs, + q31_t * pState, + int8_t postShift); + + /** + * @brief Processing function for the floating-point Biquad cascade filter. + * @param[in] *S points to an instance of the floating-point Biquad cascade structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point Biquad cascade filter. + * @param[in,out] *S points to an instance of the floating-point Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @return none + */ + + void arm_biquad_cascade_df1_init_f32( + arm_biquad_casd_df1_inst_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float32_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f32; + + /** + * @brief Instance structure for the Q15 matrix structure. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q15_t *pData; /**< points to the data of the matrix. */ + + } arm_matrix_instance_q15; + + /** + * @brief Instance structure for the Q31 matrix structure. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q31_t *pData; /**< points to the data of the matrix. */ + + } arm_matrix_instance_q31; + + + + /** + * @brief Floating-point matrix addition. + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix addition. + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix addition. + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix transpose. + * @param[in] *pSrc points to the input matrix + * @param[out] *pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix transpose. + * @param[in] *pSrc points to the input matrix + * @param[out] *pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix transpose. + * @param[in] *pSrc points to the input matrix + * @param[out] *pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix multiplication + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix multiplication + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @param[in] *pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_fast_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @brief Q31 matrix multiplication + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_mult_fast_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Floating-point matrix subtraction + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix subtraction + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix subtraction + * @param[in] *pSrcA points to the first input matrix structure + * @param[in] *pSrcB points to the second input matrix structure + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix scaling. + * @param[in] *pSrc points to the input matrix + * @param[in] scale scale factor + * @param[out] *pDst points to the output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix scaling. + * @param[in] *pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scaleFract, + int32_t shift, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix scaling. + * @param[in] *pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ + + arm_status arm_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scaleFract, + int32_t shift, + arm_matrix_instance_q31 * pDst); + + + /** + * @brief Q31 matrix initialization. + * @param[in,out] *S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] *pData points to the matrix data array. + * @return none + */ + + void arm_mat_init_q31( + arm_matrix_instance_q31 * S, + uint16_t nRows, + uint16_t nColumns, + q31_t *pData); + + /** + * @brief Q15 matrix initialization. + * @param[in,out] *S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] *pData points to the matrix data array. + * @return none + */ + + void arm_mat_init_q15( + arm_matrix_instance_q15 * S, + uint16_t nRows, + uint16_t nColumns, + q15_t *pData); + + /** + * @brief Floating-point matrix initialization. + * @param[in,out] *S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] *pData points to the matrix data array. + * @return none + */ + + void arm_mat_init_f32( + arm_matrix_instance_f32 * S, + uint16_t nRows, + uint16_t nColumns, + float32_t *pData); + + + + /** + * @brief Instance structure for the Q15 PID Control. + */ + typedef struct + { + q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + #ifdef ARM_MATH_CM0 + q15_t A1; + q15_t A2; + #else + q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ + #endif + q15_t state[3]; /**< The state array of length 3. */ + q15_t Kp; /**< The proportional gain. */ + q15_t Ki; /**< The integral gain. */ + q15_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q15; + + /** + * @brief Instance structure for the Q31 PID Control. + */ + typedef struct + { + q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + q31_t A2; /**< The derived gain, A2 = Kd . */ + q31_t state[3]; /**< The state array of length 3. */ + q31_t Kp; /**< The proportional gain. */ + q31_t Ki; /**< The integral gain. */ + q31_t Kd; /**< The derivative gain. */ + + } arm_pid_instance_q31; + + /** + * @brief Instance structure for the floating-point PID Control. + */ + typedef struct + { + float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + float32_t A2; /**< The derived gain, A2 = Kd . */ + float32_t state[3]; /**< The state array of length 3. */ + float32_t Kp; /**< The proportional gain. */ + float32_t Ki; /**< The integral gain. */ + float32_t Kd; /**< The derivative gain. */ + } arm_pid_instance_f32; + + + + /** + * @brief Initialization function for the floating-point PID Control. + * @param[in,out] *S points to an instance of the PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + * @return none. + */ + void arm_pid_init_f32( + arm_pid_instance_f32 * S, + int32_t resetStateFlag); + + /** + * @brief Reset function for the floating-point PID Control. + * @param[in,out] *S is an instance of the floating-point PID Control structure + * @return none + */ + void arm_pid_reset_f32( + arm_pid_instance_f32 * S); + + + /** + * @brief Initialization function for the Q31 PID Control. + * @param[in,out] *S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + * @return none. + */ + void arm_pid_init_q31( + arm_pid_instance_q31 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q31 PID Control. + * @param[in,out] *S points to an instance of the Q31 PID Control structure + * @return none + */ + + void arm_pid_reset_q31( + arm_pid_instance_q31 * S); + + /** + * @brief Initialization function for the Q15 PID Control. + * @param[in,out] *S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + * @return none. + */ + void arm_pid_init_q15( + arm_pid_instance_q15 * S, + int32_t resetStateFlag); + + /** + * @brief Reset function for the Q15 PID Control. + * @param[in,out] *S points to an instance of the q15 PID Control structure + * @return none + */ + void arm_pid_reset_q15( + arm_pid_instance_q15 * S); + + + /** + * @brief Instance structure for the floating-point Linear Interpolate function. + */ + typedef struct + { + uint32_t nValues; + float32_t x1; + float32_t xSpacing; + float32_t *pYData; /**< pointer to the table of Y values */ + } arm_linear_interp_instance_f32; + + /** + * @brief Instance structure for the floating-point bilinear interpolation function. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + float32_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_f32; + + /** + * @brief Instance structure for the Q31 bilinear interpolation function. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q31_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q31; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q15_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q15; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + q7_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q7; + + + /** + * @brief Q7 vector multiplication. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_mult_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Q15 vector multiplication. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_mult_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Q31 vector multiplication. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_mult_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Floating-point vector multiplication. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_mult_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q15; + + /** + * @brief Instance structure for the Q31 CFFT/CIFFT function. + */ + + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q31; + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + float32_t *pTwiddle; /**< points to the twiddle factor table. */ + uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix4_instance_f32; + + /** + * @brief Processing function for the Q15 CFFT/CIFFT. + * @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + + /** + * @brief Initialization function for the Q15 CFFT/CIFFT. + * @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Processing function for the Q31 CFFT/CIFFT. + * @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + + /** + * @brief Initialization function for the Q31 CFFT/CIFFT. + * @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Processing function for the floating-point CFFT/CIFFT. + * @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. + * @return none. + */ + + void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Initialization function for the floating-point CFFT/CIFFT. + * @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in] fftLen length of the FFT. + * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLen is not a supported value. + */ + + arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + + + /*---------------------------------------------------------------------- + * Internal functions prototypes FFT function + ----------------------------------------------------------------------*/ + + /** + * @brief Core function for the floating-point CFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to the twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_f32( + float32_t * pSrc, + uint16_t fftLen, + float32_t * pCoef, + uint16_t twidCoefModifier); + + /** + * @brief Core function for the floating-point CIFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @param[in] onebyfftLen value of 1/fftLen. + * @return none. + */ + + void arm_radix4_butterfly_inverse_f32( + float32_t * pSrc, + uint16_t fftLen, + float32_t * pCoef, + uint16_t twidCoefModifier, + float32_t onebyfftLen); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of floating-point data type. + * @param[in] fftSize length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table. + * @param[in] *pBitRevTab points to the bit reversal table. + * @return none. + */ + + void arm_bitreversal_f32( + float32_t *pSrc, + uint16_t fftSize, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Core function for the Q31 CFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_q31( + q31_t *pSrc, + uint32_t fftLen, + q31_t *pCoef, + uint32_t twidCoefModifier); + + /** + * @brief Core function for the Q31 CIFFT butterfly process. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_inverse_q31( + q31_t * pSrc, + uint32_t fftLen, + q31_t * pCoef, + uint32_t twidCoefModifier); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of Q31 data type. + * @param[in] fftLen length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + * @param[in] *pBitRevTab points to bit reversal table. + * @return none. + */ + + void arm_bitreversal_q31( + q31_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Core function for the Q15 CFFT butterfly process. + * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef16 points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_q15( + q15_t *pSrc16, + uint32_t fftLen, + q15_t *pCoef16, + uint32_t twidCoefModifier); + + /** + * @brief Core function for the Q15 CIFFT butterfly process. + * @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] *pCoef16 points to twiddle coefficient buffer. + * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. + * @return none. + */ + + void arm_radix4_butterfly_inverse_q15( + q15_t *pSrc16, + uint32_t fftLen, + q15_t *pCoef16, + uint32_t twidCoefModifier); + + /** + * @brief In-place bit reversal function. + * @param[in, out] *pSrc points to the in-place buffer of Q15 data type. + * @param[in] fftLen length of the FFT. + * @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table + * @param[in] *pBitRevTab points to bit reversal table. + * @return none. + */ + + void arm_bitreversal_q15( + q15_t * pSrc, + uint32_t fftLen, + uint16_t bitRevFactor, + uint16_t *pBitRevTab); + + /** + * @brief Instance structure for the Q15 RFFT/RIFFT function. + */ + + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint32_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q15; + + /** + * @brief Instance structure for the Q31 RFFT/RIFFT function. + */ + + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint32_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_q31; + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ + + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint16_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_f32; + + /** + * @brief Processing function for the Q15 RFFT/RIFFT. + * @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst); + + /** + * @brief Initialization function for the Q15 RFFT/RIFFT. + * @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure. + * @param[in] *S_CFFT points to an instance of the Q15 CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + arm_status arm_rfft_init_q15( + arm_rfft_instance_q15 * S, + arm_cfft_radix4_instance_q15 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + /** + * @brief Processing function for the Q31 RFFT/RIFFT. + * @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst); + + /** + * @brief Initialization function for the Q31 RFFT/RIFFT. + * @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure. + * @param[in, out] *S_CFFT points to an instance of the Q31 CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + arm_status arm_rfft_init_q31( + arm_rfft_instance_q31 * S, + arm_cfft_radix4_instance_q31 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + /** + * @brief Initialization function for the floating-point RFFT/RIFFT. + * @param[in,out] *S points to an instance of the floating-point RFFT/RIFFT structure. + * @param[in,out] *S_CFFT points to an instance of the floating-point CFFT/CIFFT structure. + * @param[in] fftLenReal length of the FFT. + * @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. + * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported value. + */ + + arm_status arm_rfft_init_f32( + arm_rfft_instance_f32 * S, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + /** + * @brief Processing function for the floating-point RFFT/RIFFT. + * @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure. + * @param[in] *pSrc points to the input buffer. + * @param[out] *pDst points to the output buffer. + * @return none. + */ + + void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + + /** + * @brief Instance structure for the floating-point DCT4/IDCT4 function. + */ + + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + float32_t normalize; /**< normalizing factor. */ + float32_t *pTwiddle; /**< points to the twiddle factor table. */ + float32_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_f32; + + /** + * @brief Initialization function for the floating-point DCT4/IDCT4. + * @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure. + * @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure. + * @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. + */ + + arm_status arm_dct4_init_f32( + arm_dct4_instance_f32 * S, + arm_rfft_instance_f32 * S_RFFT, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint16_t N, + uint16_t Nby2, + float32_t normalize); + + /** + * @brief Processing function for the floating-point DCT4/IDCT4. + * @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure. + * @param[in] *pState points to state buffer. + * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. + * @return none. + */ + + void arm_dct4_f32( + const arm_dct4_instance_f32 * S, + float32_t * pState, + float32_t * pInlineBuffer); + + /** + * @brief Instance structure for the Q31 DCT4/IDCT4 function. + */ + + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q31_t normalize; /**< normalizing factor. */ + q31_t *pTwiddle; /**< points to the twiddle factor table. */ + q31_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q31; + + /** + * @brief Initialization function for the Q31 DCT4/IDCT4. + * @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure. + * @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure + * @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + + arm_status arm_dct4_init_q31( + arm_dct4_instance_q31 * S, + arm_rfft_instance_q31 * S_RFFT, + arm_cfft_radix4_instance_q31 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q31_t normalize); + + /** + * @brief Processing function for the Q31 DCT4/IDCT4. + * @param[in] *S points to an instance of the Q31 DCT4 structure. + * @param[in] *pState points to state buffer. + * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. + * @return none. + */ + + void arm_dct4_q31( + const arm_dct4_instance_q31 * S, + q31_t * pState, + q31_t * pInlineBuffer); + + /** + * @brief Instance structure for the Q15 DCT4/IDCT4 function. + */ + + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q15_t normalize; /**< normalizing factor. */ + q15_t *pTwiddle; /**< points to the twiddle factor table. */ + q15_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q15; + + /** + * @brief Initialization function for the Q15 DCT4/IDCT4. + * @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure. + * @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure. + * @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + + arm_status arm_dct4_init_q15( + arm_dct4_instance_q15 * S, + arm_rfft_instance_q15 * S_RFFT, + arm_cfft_radix4_instance_q15 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q15_t normalize); + + /** + * @brief Processing function for the Q15 DCT4/IDCT4. + * @param[in] *S points to an instance of the Q15 DCT4 structure. + * @param[in] *pState points to state buffer. + * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. + * @return none. + */ + + void arm_dct4_q15( + const arm_dct4_instance_q15 * S, + q15_t * pState, + q15_t * pInlineBuffer); + + /** + * @brief Floating-point vector addition. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_add_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Q7 vector addition. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_add_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Q15 vector addition. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_add_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Q31 vector addition. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_add_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Floating-point vector subtraction. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_sub_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Q7 vector subtraction. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_sub_q7( + q7_t * pSrcA, + q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Q15 vector subtraction. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_sub_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Q31 vector subtraction. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_sub_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Multiplies a floating-point vector by a scalar. + * @param[in] *pSrc points to the input vector + * @param[in] scale scale factor to be applied + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_scale_f32( + float32_t * pSrc, + float32_t scale, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Multiplies a Q7 vector by a scalar. + * @param[in] *pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_scale_q7( + q7_t * pSrc, + q7_t scaleFract, + int8_t shift, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Multiplies a Q15 vector by a scalar. + * @param[in] *pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_scale_q15( + q15_t * pSrc, + q15_t scaleFract, + int8_t shift, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Multiplies a Q31 vector by a scalar. + * @param[in] *pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_scale_q31( + q31_t * pSrc, + q31_t scaleFract, + int8_t shift, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Q7 vector absolute value. + * @param[in] *pSrc points to the input buffer + * @param[out] *pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_abs_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Floating-point vector absolute value. + * @param[in] *pSrc points to the input buffer + * @param[out] *pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_abs_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Q15 vector absolute value. + * @param[in] *pSrc points to the input buffer + * @param[out] *pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_abs_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Q31 vector absolute value. + * @param[in] *pSrc points to the input buffer + * @param[out] *pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + * @return none. + */ + + void arm_abs_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Dot product of floating-point vectors. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] *result output result returned here + * @return none. + */ + + void arm_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t blockSize, + float32_t * result); + + /** + * @brief Dot product of Q7 vectors. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] *result output result returned here + * @return none. + */ + + void arm_dot_prod_q7( + q7_t * pSrcA, + q7_t * pSrcB, + uint32_t blockSize, + q31_t * result); + + /** + * @brief Dot product of Q15 vectors. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] *result output result returned here + * @return none. + */ + + void arm_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + /** + * @brief Dot product of Q31 vectors. + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] *result output result returned here + * @return none. + */ + + void arm_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + /** + * @brief Shifts the elements of a Q7 vector a specified number of bits. + * @param[in] *pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_shift_q7( + q7_t * pSrc, + int8_t shiftBits, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Shifts the elements of a Q15 vector a specified number of bits. + * @param[in] *pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_shift_q15( + q15_t * pSrc, + int8_t shiftBits, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Shifts the elements of a Q31 vector a specified number of bits. + * @param[in] *pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_shift_q31( + q31_t * pSrc, + int8_t shiftBits, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Adds a constant offset to a floating-point vector. + * @param[in] *pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_offset_f32( + float32_t * pSrc, + float32_t offset, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Adds a constant offset to a Q7 vector. + * @param[in] *pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_offset_q7( + q7_t * pSrc, + q7_t offset, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Adds a constant offset to a Q15 vector. + * @param[in] *pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_offset_q15( + q15_t * pSrc, + q15_t offset, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Adds a constant offset to a Q31 vector. + * @param[in] *pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_offset_q31( + q31_t * pSrc, + q31_t offset, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Negates the elements of a floating-point vector. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_negate_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Negates the elements of a Q7 vector. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_negate_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Negates the elements of a Q15 vector. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_negate_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Negates the elements of a Q31 vector. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] blockSize number of samples in the vector + * @return none. + */ + + void arm_negate_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + /** + * @brief Copies the elements of a floating-point vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_copy_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Copies the elements of a Q7 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_copy_q7( + q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Copies the elements of a Q15 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_copy_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Copies the elements of a Q31 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_copy_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + /** + * @brief Fills a constant value into a floating-point vector. + * @param[in] value input value to be filled + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_fill_f32( + float32_t value, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Fills a constant value into a Q7 vector. + * @param[in] value input value to be filled + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_fill_q7( + q7_t value, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Fills a constant value into a Q15 vector. + * @param[in] value input value to be filled + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_fill_q15( + q15_t value, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Fills a constant value into a Q31 vector. + * @param[in] value input value to be filled + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_fill_q31( + q31_t value, + q31_t * pDst, + uint32_t blockSize); + +/** + * @brief Convolution of floating-point sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + +/** + * @brief Convolution of Q15 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + /** + * @brief Convolution of Q31 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + /** + * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + /** + * @brief Convolution of Q7 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. + * @return none. + */ + + void arm_conv_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + /** + * @brief Partial convolution of floating-point sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + /** + * @brief Partial convolution of Q31 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + /** + * @brief Partial convolution of Q7 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + + arm_status arm_conv_partial_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Instance structure for the Q15 FIR decimator. + */ + + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR decimator. + */ + + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + + } arm_fir_decimate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR decimator. + */ + + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + + } arm_fir_decimate_instance_f32; + + + + /** + * @brief Processing function for the floating-point FIR decimator. + * @param[in] *S points to an instance of the floating-point FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_f32( + const arm_fir_decimate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR decimator. + * @param[in,out] *S points to an instance of the floating-point FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + + arm_status arm_fir_decimate_init_f32( + arm_fir_decimate_instance_f32 * S, + uint16_t numTaps, + uint8_t M, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q15 FIR decimator. + * @param[in] *S points to an instance of the Q15 FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q15 FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Initialization function for the Q15 FIR decimator. + * @param[in,out] *S points to an instance of the Q15 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + + arm_status arm_fir_decimate_init_q15( + arm_fir_decimate_instance_q15 * S, + uint16_t numTaps, + uint8_t M, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR decimator. + * @param[in] *S points to an instance of the Q31 FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_q31( + const arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] *S points to an instance of the Q31 FIR decimator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + * @return none + */ + + void arm_fir_decimate_fast_q31( + arm_fir_decimate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR decimator. + * @param[in,out] *S points to an instance of the Q31 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + + arm_status arm_fir_decimate_init_q31( + arm_fir_decimate_instance_q31 * S, + uint16_t numTaps, + uint8_t M, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + + /** + * @brief Instance structure for the Q15 FIR interpolator. + */ + + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR interpolator. + */ + + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR interpolator. + */ + + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ + } arm_fir_interpolate_instance_f32; + + + /** + * @brief Processing function for the Q15 FIR interpolator. + * @param[in] *S points to an instance of the Q15 FIR interpolator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR interpolator. + * @param[in,out] *S points to an instance of the Q15 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficient buffer. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + + arm_status arm_fir_interpolate_init_q15( + arm_fir_interpolate_instance_q15 * S, + uint8_t L, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR interpolator. + * @param[in] *S points to an instance of the Q15 FIR interpolator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 FIR interpolator. + * @param[in,out] *S points to an instance of the Q31 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficient buffer. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + + arm_status arm_fir_interpolate_init_q31( + arm_fir_interpolate_instance_q31 * S, + uint8_t L, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point FIR interpolator. + * @param[in] *S points to an instance of the floating-point FIR interpolator structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point FIR interpolator. + * @param[in,out] *S points to an instance of the floating-point FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] *pCoeffs points to the filter coefficient buffer. + * @param[in] *pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + + arm_status arm_fir_interpolate_init_f32( + arm_fir_interpolate_instance_f32 * S, + uint8_t L, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + /** + * @brief Instance structure for the high precision Q31 Biquad cascade filter. + */ + + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ + + } arm_biquad_cas_df1_32x64_ins_q31; + + + /** + * @param[in] *S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @param[in,out] *S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format + * @return none + */ + + void arm_biquad_cas_df1_32x64_init_q31( + arm_biquad_cas_df1_32x64_ins_q31 * S, + uint8_t numStages, + q31_t * pCoeffs, + q63_t * pState, + uint8_t postShift); + + + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f32; + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] *S points to an instance of the filter data structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] *S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] *pCoeffs points to the filter coefficients. + * @param[in] *pState points to the state buffer. + * @return none + */ + + void arm_biquad_cascade_df2T_init_f32( + arm_biquad_cascade_df2T_instance_f32 * S, + uint8_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + + + /** + * @brief Instance structure for the Q15 FIR lattice filter. + */ + + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR lattice filter. + */ + + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR lattice filter. + */ + + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_f32; + + /** + * @brief Initialization function for the Q15 FIR lattice filter. + * @param[in] *S points to an instance of the Q15 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] *pState points to the state buffer. The array is of length numStages. + * @return none. + */ + + void arm_fir_lattice_init_q15( + arm_fir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t * pCoeffs, + q15_t * pState); + + + /** + * @brief Processing function for the Q15 FIR lattice filter. + * @param[in] *S points to an instance of the Q15 FIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + void arm_fir_lattice_q15( + const arm_fir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 FIR lattice filter. + * @param[in] *S points to an instance of the Q31 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] *pState points to the state buffer. The array is of length numStages. + * @return none. + */ + + void arm_fir_lattice_init_q31( + arm_fir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t * pCoeffs, + q31_t * pState); + + + /** + * @brief Processing function for the Q31 FIR lattice filter. + * @param[in] *S points to an instance of the Q31 FIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_fir_lattice_q31( + const arm_fir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +/** + * @brief Initialization function for the floating-point FIR lattice filter. + * @param[in] *S points to an instance of the floating-point FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] *pState points to the state buffer. The array is of length numStages. + * @return none. + */ + + void arm_fir_lattice_init_f32( + arm_fir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t * pCoeffs, + float32_t * pState); + + /** + * @brief Processing function for the floating-point FIR lattice filter. + * @param[in] *S points to an instance of the floating-point FIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Instance structure for the Q15 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_f32; + + /** + * @brief Processing function for the floating-point IIR lattice filter. + * @param[in] *S points to an instance of the floating-point IIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_f32( + const arm_iir_lattice_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point IIR lattice filter. + * @param[in] *S points to an instance of the floating-point IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize-1. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_init_f32( + arm_iir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t *pkCoeffs, + float32_t *pvCoeffs, + float32_t *pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 IIR lattice filter. + * @param[in] *S points to an instance of the Q31 IIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_q31( + const arm_iir_lattice_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 IIR lattice filter. + * @param[in] *S points to an instance of the Q31 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_init_q31( + arm_iir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t *pkCoeffs, + q31_t *pvCoeffs, + q31_t *pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 IIR lattice filter. + * @param[in] *S points to an instance of the Q15 IIR lattice structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_iir_lattice_q15( + const arm_iir_lattice_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 IIR lattice filter. + * @param[in] *S points to an instance of the fixed-point Q15 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] *pkCoeffs points to reflection coefficient buffer. The array is of length numStages. + * @param[in] *pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. + * @param[in] *pState points to state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process per call. + * @return none. + */ + + void arm_iir_lattice_init_q15( + arm_iir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t *pkCoeffs, + q15_t *pvCoeffs, + q15_t *pState, + uint32_t blockSize); + + /** + * @brief Instance structure for the floating-point LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that controls filter coefficient updates. */ + } arm_lms_instance_f32; + + /** + * @brief Processing function for floating-point LMS filter. + * @param[in] *S points to an instance of the floating-point LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_f32( + const arm_lms_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + /** + * @brief Initialization function for floating-point LMS filter. + * @param[in] *S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to the coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_init_f32( + arm_lms_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + /** + * @brief Instance structure for the Q15 LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q15; + + + /** + * @brief Initialization function for the Q15 LMS filter. + * @param[in] *S points to an instance of the Q15 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to the coefficient buffer. + * @param[in] *pState points to the state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + * @return none. + */ + + void arm_lms_init_q15( + arm_lms_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint32_t postShift); + + /** + * @brief Processing function for Q15 LMS filter. + * @param[in] *S points to an instance of the Q15 LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_q15( + const arm_lms_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + + } arm_lms_instance_q31; + + /** + * @brief Processing function for Q31 LMS filter. + * @param[in] *S points to an instance of the Q15 LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_q31( + const arm_lms_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + /** + * @brief Initialization function for Q31 LMS filter. + * @param[in] *S points to an instance of the Q31 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + * @return none. + */ + + void arm_lms_init_q31( + arm_lms_instance_q31 * S, + uint16_t numTaps, + q31_t *pCoeffs, + q31_t *pState, + q31_t mu, + uint32_t blockSize, + uint32_t postShift); + + /** + * @brief Instance structure for the floating-point normalized LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that control filter coefficient updates. */ + float32_t energy; /**< saves previous frame energy. */ + float32_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_f32; + + /** + * @brief Processing function for floating-point normalized LMS filter. + * @param[in] *S points to an instance of the floating-point normalized LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + /** + * @brief Initialization function for floating-point normalized LMS filter. + * @param[in] *S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_norm_init_f32( + arm_lms_norm_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q31_t *recipTable; /**< points to the reciprocal initial value table. */ + q31_t energy; /**< saves previous frame energy. */ + q31_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q31; + + /** + * @brief Processing function for Q31 normalized LMS filter. + * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_norm_q31( + arm_lms_norm_instance_q31 * S, + q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + /** + * @brief Initialization function for Q31 normalized LMS filter. + * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + * @return none. + */ + + void arm_lms_norm_init_q31( + arm_lms_norm_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint8_t postShift); + + /** + * @brief Instance structure for the Q15 normalized LMS filter. + */ + + typedef struct + { + uint16_t numTaps; /**< Number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + q15_t *recipTable; /**< Points to the reciprocal initial value table. */ + q15_t energy; /**< saves previous frame energy. */ + q15_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q15; + + /** + * @brief Processing function for Q15 normalized LMS filter. + * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] *pSrc points to the block of input data. + * @param[in] *pRef points to the block of reference data. + * @param[out] *pOut points to the block of output data. + * @param[out] *pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + * @return none. + */ + + void arm_lms_norm_q15( + arm_lms_norm_instance_q15 * S, + q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q15 normalized LMS filter. + * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] *pCoeffs points to coefficient buffer. + * @param[in] *pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + * @return none. + */ + + void arm_lms_norm_init_q15( + arm_lms_norm_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint8_t postShift); + + /** + * @brief Correlation of floating-point sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_f32( + float32_t * pSrcA, + uint32_t srcALen, + float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + /** + * @brief Correlation of Q15 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + /** + * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_fast_q15( + q15_t * pSrcA, + uint32_t srcALen, + q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + /** + * @brief Correlation of Q31 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + /** + * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_fast_q31( + q31_t * pSrcA, + uint32_t srcALen, + q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + /** + * @brief Correlation of Q7 sequences. + * @param[in] *pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] *pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @return none. + */ + + void arm_correlate_q7( + q7_t * pSrcA, + uint32_t srcALen, + q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + /** + * @brief Instance structure for the floating-point sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_f32; + + /** + * @brief Instance structure for the Q31 sparse FIR filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q31; + + /** + * @brief Instance structure for the Q15 sparse FIR filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q15; + + /** + * @brief Instance structure for the Q7 sparse FIR filter. + */ + + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q7; + + /** + * @brief Processing function for the floating-point sparse FIR filter. + * @param[in] *S points to an instance of the floating-point sparse FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] *pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_sparse_f32( + arm_fir_sparse_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + float32_t * pScratchIn, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point sparse FIR filter. + * @param[in,out] *S points to an instance of the floating-point sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] *pCoeffs points to the array of filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] *pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + * @return none + */ + + void arm_fir_sparse_init_f32( + arm_fir_sparse_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 sparse FIR filter. + * @param[in] *S points to an instance of the Q31 sparse FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] *pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_sparse_q31( + arm_fir_sparse_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst, + q31_t * pScratchIn, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 sparse FIR filter. + * @param[in,out] *S points to an instance of the Q31 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] *pCoeffs points to the array of filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] *pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + * @return none + */ + + void arm_fir_sparse_init_q31( + arm_fir_sparse_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + /** + * @brief Processing function for the Q15 sparse FIR filter. + * @param[in] *S points to an instance of the Q15 sparse FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] *pScratchIn points to a temporary buffer of size blockSize. + * @param[in] *pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_sparse_q15( + arm_fir_sparse_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst, + q15_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 sparse FIR filter. + * @param[in,out] *S points to an instance of the Q15 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] *pCoeffs points to the array of filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] *pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + * @return none + */ + + void arm_fir_sparse_init_q15( + arm_fir_sparse_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + /** + * @brief Processing function for the Q7 sparse FIR filter. + * @param[in] *S points to an instance of the Q7 sparse FIR structure. + * @param[in] *pSrc points to the block of input data. + * @param[out] *pDst points to the block of output data + * @param[in] *pScratchIn points to a temporary buffer of size blockSize. + * @param[in] *pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + * @return none. + */ + + void arm_fir_sparse_q7( + arm_fir_sparse_instance_q7 * S, + q7_t * pSrc, + q7_t * pDst, + q7_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q7 sparse FIR filter. + * @param[in,out] *S points to an instance of the Q7 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] *pCoeffs points to the array of filter coefficients. + * @param[in] *pState points to the state buffer. + * @param[in] *pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + * @return none + */ + + void arm_fir_sparse_init_q7( + arm_fir_sparse_instance_q7 * S, + uint16_t numTaps, + q7_t * pCoeffs, + q7_t * pState, + int32_t *pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /* + * @brief Floating-point sin_cos function. + * @param[in] theta input value in degrees + * @param[out] *pSinVal points to the processed sine output. + * @param[out] *pCosVal points to the processed cos output. + * @return none. + */ + + void arm_sin_cos_f32( + float32_t theta, + float32_t *pSinVal, + float32_t *pCcosVal); + + /* + * @brief Q31 sin_cos function. + * @param[in] theta scaled input value in degrees + * @param[out] *pSinVal points to the processed sine output. + * @param[out] *pCosVal points to the processed cosine output. + * @return none. + */ + + void arm_sin_cos_q31( + q31_t theta, + q31_t *pSinVal, + q31_t *pCosVal); + + + /** + * @brief Floating-point complex conjugate. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_conj_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex conjugate. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_conj_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + /** + * @brief Q15 complex conjugate. + * @param[in] *pSrc points to the input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_conj_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + + /** + * @brief Floating-point complex magnitude squared + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_squared_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex magnitude squared + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_squared_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + /** + * @brief Q15 complex magnitude squared + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_squared_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @ingroup groupController + */ + + /** + * @defgroup PID PID Motor Control + * + * A Proportional Integral Derivative (PID) controller is a generic feedback control + * loop mechanism widely used in industrial control systems. + * A PID controller is the most commonly used type of feedback controller. + * + * This set of functions implements (PID) controllers + * for Q15, Q31, and floating-point data types. The functions operate on a single sample + * of data and each call to the function returns a single processed value. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
    +   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
    +   *    A0 = Kp + Ki + Kd
    +   *    A1 = (-Kp ) - (2 * Kd )
    +   *    A2 = Kd  
    + * + * \par + * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant + * + * \par + * \image html PID.gif "Proportional Integral Derivative Controller" + * + * \par + * The PID controller calculates an "error" value as the difference between + * the measured output and the reference input. + * The controller attempts to minimize the error by adjusting the process control inputs. + * The proportional value determines the reaction to the current error, + * the integral value determines the reaction based on the sum of recent errors, + * and the derivative value determines the reaction based on the rate at which the error has been changing. + * + * \par Instance Structure + * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. + * A separate instance structure must be defined for each PID Controller. + * There are separate instance structure declarations for each of the 3 supported data types. + * + * \par Reset Functions + * There is also an associated reset function for each data type which clears the state array. + * + * \par Initialization Functions + * There is also an associated initialization function for each data type. + * The initialization function performs the following operations: + * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. + * - Zeros out the values in the state buffer. + * + * \par + * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. + * + * \par Fixed-Point Behavior + * Care must be taken when using the fixed-point versions of the PID Controller functions. + * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup PID + * @{ + */ + + /** + * @brief Process function for the floating-point PID Control. + * @param[in,out] *S is an instance of the floating-point PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + */ + + + static __INLINE float32_t arm_pid_f32( + arm_pid_instance_f32 * S, + float32_t in) + { + float32_t out; + + /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ + out = (S->A0 * in) + + (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + + /** + * @brief Process function for the Q31 PID Control. + * @param[in,out] *S points to an instance of the Q31 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 64-bit accumulator. + * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. + * Thus, if the accumulator result overflows it wraps around rather than clip. + * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. + * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. + */ + + static __INLINE q31_t arm_pid_q31( + arm_pid_instance_q31 * S, + q31_t in) + { + q63_t acc; + q31_t out; + + /* acc = A0 * x[n] */ + acc = (q63_t) S->A0 * in; + + /* acc += A1 * x[n-1] */ + acc += (q63_t) S->A1 * S->state[0]; + + /* acc += A2 * x[n-2] */ + acc += (q63_t) S->A2 * S->state[1]; + + /* convert output to 1.31 format to add y[n-1] */ + out = (q31_t) (acc >> 31u); + + /* out += y[n-1] */ + out += S->state[2]; + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + + /** + * @brief Process function for the Q15 PID Control. + * @param[in,out] *S points to an instance of the Q15 PID Control structure + * @param[in] in input sample to process + * @return out processed output sample. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using a 64-bit internal accumulator. + * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. + * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. + * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. + * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. + * Lastly, the accumulator is saturated to yield a result in 1.15 format. + */ + + static __INLINE q15_t arm_pid_q15( + arm_pid_instance_q15 * S, + q15_t in) + { + q63_t acc; + q15_t out; + + /* Implementation of PID controller */ + + #ifdef ARM_MATH_CM0 + + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0 )* in ; + + #else + + /* acc = A0 * x[n] */ + acc = (q31_t) __SMUAD(S->A0, in); + + #endif + + #ifdef ARM_MATH_CM0 + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc += (q31_t) S->A1 * S->state[0] ; + acc += (q31_t) S->A2 * S->state[1] ; + + #else + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc = __SMLALD(S->A1, (q31_t)__SIMD32(S->state), acc); + + #endif + + /* acc += y[n-1] */ + acc += (q31_t) S->state[2] << 15; + + /* saturate the output */ + out = (q15_t) (__SSAT((acc >> 15), 16)); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + + /** + * @} end of PID group + */ + + + /** + * @brief Floating-point matrix inverse. + * @param[in] *src points to the instance of the input floating-point matrix structure. + * @param[out] *dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + + arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 * src, + arm_matrix_instance_f32 * dst); + + + + /** + * @ingroup groupController + */ + + + /** + * @defgroup clarke Vector Clarke Transform + * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. + * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeFormula.gif + * where Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup clarke + * @{ + */ + + /** + * + * @brief Floating-point Clarke transform + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta + * @return none. + */ + + static __INLINE void arm_clarke_f32( + float32_t Ia, + float32_t Ib, + float32_t * pIalpha, + float32_t * pIbeta) + { + /* Calculate pIalpha using the equation, pIalpha = Ia */ + *pIalpha = Ia; + + /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ + *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); + + } + + /** + * @brief Clarke transform for Q31 version + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta + * @return none. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ + + static __INLINE void arm_clarke_q31( + q31_t Ia, + q31_t Ib, + q31_t * pIalpha, + q31_t * pIbeta) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIalpha from Ia by equation pIalpha = Ia */ + *pIalpha = Ia; + + /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); + + /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ + product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); + + /* pIbeta is calculated by adding the intermediate products */ + *pIbeta = __QADD(product1, product2); + } + + /** + * @} end of clarke group + */ + + /** + * @brief Converts the elements of the Q7 vector to Q31 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_q7_to_q31( + q7_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_clarke Vector Inverse Clarke Transform + * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeInvFormula.gif + * where pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_clarke + * @{ + */ + + /** + * @brief Floating-point Inverse Clarke transform + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] *pIa points to output three-phase coordinate a + * @param[out] *pIb points to output three-phase coordinate b + * @return none. + */ + + + static __INLINE void arm_inv_clarke_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pIa, + float32_t * pIb) + { + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ + *pIb = -0.5 * Ialpha + (float32_t) 0.8660254039 *Ibeta; + + } + + /** + * @brief Inverse Clarke transform for Q31 version + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] *pIa points to output three-phase coordinate a + * @param[out] *pIb points to output three-phase coordinate b + * @return none. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the subtraction, hence there is no risk of overflow. + */ + + static __INLINE void arm_inv_clarke_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pIa, + q31_t * pIb) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); + + /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); + + /* pIb is calculated by subtracting the products */ + *pIb = __QSUB(product2, product1); + + } + + /** + * @} end of inv_clarke group + */ + + /** + * @brief Converts the elements of the Q7 vector to Q15 vector. + * @param[in] *pSrc input pointer + * @param[out] *pDst output pointer + * @param[in] blockSize number of samples to process + * @return none. + */ + void arm_q7_to_q15( + q7_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup park Vector Park Transform + * + * Forward Park transform converts the input two-coordinate vector to flux and torque components. + * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents + * from the stationary to the moving reference frame and control the spatial relationship between + * the stator vector current and rotor flux vector. + * If we consider the d axis aligned with the rotor flux, the diagram below shows the + * current vector and the relationship from the two reference frames: + * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkFormula.gif + * where Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup park + * @{ + */ + + /** + * @brief Floating-point Park transform + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] *pId points to output rotor reference frame d + * @param[out] *pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none. + * + * The function implements the forward Park transform. + * + */ + + static __INLINE void arm_park_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pId, + float32_t * pIq, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ + *pId = Ialpha * cosVal + Ibeta * sinVal; + + /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ + *pIq = -Ialpha * sinVal + Ibeta * cosVal; + + } + + /** + * @brief Park transform for Q31 version + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] *pId points to output rotor reference frame d + * @param[out] *pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition and subtraction, hence there is no risk of overflow. + */ + + + static __INLINE void arm_park_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pId, + q31_t * pIq, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Ialpha * cosVal) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * sinVal) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Ialpha * sinVal) */ + product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * cosVal) */ + product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); + + /* Calculate pId by adding the two intermediate products 1 and 2 */ + *pId = __QADD(product1, product2); + + /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ + *pIq = __QSUB(product4, product3); + } + + /** + * @} end of park group + */ + + /** + * @brief Converts the elements of the Q7 vector to floating-point vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q7_to_float( + q7_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_park Vector Inverse Park transform + * Inverse Park transform converts the input flux and torque components to two-coordinate vector. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkInvFormula.gif + * where pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + /** + * @addtogroup inv_park + * @{ + */ + + /** + * @brief Floating-point Inverse Park transform + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none. + */ + + static __INLINE void arm_inv_park_f32( + float32_t Id, + float32_t Iq, + float32_t * pIalpha, + float32_t * pIbeta, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ + *pIalpha = Id * cosVal - Iq * sinVal; + + /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ + *pIbeta = Id * sinVal + Iq * cosVal; + + } + + + /** + * @brief Inverse Park transform for Q31 version + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none. + * + * Scaling and Overflow Behavior: + * \par + * The function is implemented using an internal 32-bit accumulator. + * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + * There is saturation on the addition, hence there is no risk of overflow. + */ + + + static __INLINE void arm_inv_park_q31( + q31_t Id, + q31_t Iq, + q31_t * pIalpha, + q31_t * pIbeta, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Id * cosVal) */ + product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Iq * sinVal) */ + product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Id * sinVal) */ + product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Iq * cosVal) */ + product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); + + /* Calculate pIalpha by using the two intermediate products 1 and 2 */ + *pIalpha = __QSUB(product1, product2); + + /* Calculate pIbeta by using the two intermediate products 3 and 4 */ + *pIbeta = __QADD(product4, product3); + + } + + /** + * @} end of Inverse park group + */ + + + /** + * @brief Converts the elements of the Q31 vector to floating-point vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q31_to_float( + q31_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup LinearInterpolate Linear Interpolation + * + * Linear interpolation is a method of curve fitting using linear polynomials. + * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line + * + * \par + * \image html LinearInterp.gif "Linear interpolation" + * + * \par + * A Linear Interpolate function calculates an output value(y), for the input(x) + * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) + * + * \par Algorithm: + *
    +   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
    +   *       where x0, x1 are nearest values of input x
    +   *             y0, y1 are nearest values to output y
    +   * 
    + * + * \par + * This set of functions implements Linear interpolation process + * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single + * sample of data and each call to the function returns a single processed value. + * S points to an instance of the Linear Interpolate function data structure. + * x is the input sample value. The functions returns the output value. + * + * \par + * if x is outside of the table boundary, Linear interpolation returns first value of the table + * if x is below input range and returns last value of table if x is above range. + */ + + /** + * @addtogroup LinearInterpolate + * @{ + */ + + /** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] *S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ + + static __INLINE float32_t arm_linear_interp_f32( + arm_linear_interp_instance_f32 * S, + float32_t x) + { + + float32_t y; + float32_t x0, x1; /* Nearest input values */ + float32_t y0, y1; /* Nearest output values */ + float32_t xSpacing = S->xSpacing; /* spacing between input values */ + int32_t i; /* Index variable */ + float32_t *pYData = S->pYData; /* pointer to output table */ + + /* Calculation of index */ + i = (x - S->x1) / xSpacing; + + if(i < 0) + { + /* Iniatilize output for below specified range as least output value of table */ + y = pYData[0]; + } + else if(i >= S->nValues) + { + /* Iniatilize output for above specified range as last output value of table */ + y = pYData[S->nValues-1]; + } + else + { + /* Calculation of nearest input values */ + x0 = S->x1 + i * xSpacing; + x1 = S->x1 + (i +1) * xSpacing; + + /* Read of nearest output values */ + y0 = pYData[i]; + y1 = pYData[i + 1]; + + /* Calculation of output */ + y = y0 + (x - x0) * ((y1 - y0)/(x1-x0)); + + } + + /* returns output value */ + return (y); + } + + /** + * + * @brief Process function for the Q31 Linear Interpolation Function. + * @param[in] *pYData pointer to Q31 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + + + static __INLINE q31_t arm_linear_interp_q31(q31_t *pYData, + q31_t x, uint32_t nValues) + { + q31_t y; /* output */ + q31_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & 0xFFF00000) >> 20); + + if(index >= (nValues - 1)) + { + return(pYData[nValues - 1]); + } + else if(index < 0) + { + return(pYData[0]); + } + else + { + + /* 20 bits for the fractional part */ + /* shift left by 11 to keep fract in 1.31 format */ + fract = (x & 0x000FFFFF) << 11; + + /* Read two nearest output values from the index in 1.31(q31) format */ + y0 = pYData[index]; + y1 = pYData[index + 1u]; + + /* Calculation of y0 * (1-fract) and y is in 2.30 format */ + y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); + + /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ + y += ((q31_t) (((q63_t) y1 * fract) >> 32)); + + /* Convert y to 1.31 format */ + return (y << 1u); + + } + + } + + /** + * + * @brief Process function for the Q15 Linear Interpolation Function. + * @param[in] *pYData pointer to Q15 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + + + static __INLINE q15_t arm_linear_interp_q15(q15_t *pYData, q31_t x, uint32_t nValues) + { + q63_t y; /* output */ + q15_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & 0xFFF00000) >> 20u); + + if(index >= (nValues - 1)) + { + return(pYData[nValues - 1]); + } + else if(index < 0) + { + return(pYData[0]); + } + else + { + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y0 = pYData[index]; + y1 = pYData[index + 1u]; + + /* Calculation of y0 * (1-fract) and y is in 13.35 format */ + y = ((q63_t) y0 * (0xFFFFF - fract)); + + /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ + y += ((q63_t) y1 * (fract)); + + /* convert y to 1.15 format */ + return (y >> 20); + } + + + } + + /** + * + * @brief Process function for the Q7 Linear Interpolation Function. + * @param[in] *pYData pointer to Q7 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + */ + + + static __INLINE q7_t arm_linear_interp_q7(q7_t *pYData, q31_t x, uint32_t nValues) + { + q31_t y; /* output */ + q7_t y0, y1; /* Nearest output values */ + q31_t fract; /* fractional part */ + int32_t index; /* Index to read nearest output values */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + index = ((x & 0xFFF00000) >> 20u); + + + if(index >= (nValues - 1)) + { + return(pYData[nValues - 1]); + } + else if(index < 0) + { + return(pYData[0]); + } + else + { + + /* 20 bits for the fractional part */ + /* fract is in 12.20 format */ + fract = (x & 0x000FFFFF); + + /* Read two nearest output values from the index and are in 1.7(q7) format */ + y0 = pYData[index]; + y1 = pYData[index + 1u]; + + /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ + y = ((y0 * (0xFFFFF - fract))); + + /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ + y += (y1 * fract); + + /* convert y to 1.7(q7) format */ + return (y >> 20u); + + } + + } + /** + * @} end of LinearInterpolate group + */ + + /** + * @brief Fast approximation to the trigonometric sine function for floating-point data. + * @param[in] x input value in radians. + * @return sin(x). + */ + + float32_t arm_sin_f32( + float32_t x); + + /** + * @brief Fast approximation to the trigonometric sine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + + q31_t arm_sin_q31( + q31_t x); + + /** + * @brief Fast approximation to the trigonometric sine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + + q15_t arm_sin_q15( + q15_t x); + + /** + * @brief Fast approximation to the trigonometric cosine function for floating-point data. + * @param[in] x input value in radians. + * @return cos(x). + */ + + float32_t arm_cos_f32( + float32_t x); + + /** + * @brief Fast approximation to the trigonometric cosine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + + q31_t arm_cos_q31( + q31_t x); + + /** + * @brief Fast approximation to the trigonometric cosine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + + q15_t arm_cos_q15( + q15_t x); + + + /** + * @ingroup groupFastMath + */ + + + /** + * @defgroup SQRT Square Root + * + * Computes the square root of a number. + * There are separate functions for Q15, Q31, and floating-point data types. + * The square root function is computed using the Newton-Raphson algorithm. + * This is an iterative algorithm of the form: + *
    +   *      x1 = x0 - f(x0)/f'(x0)
    +   * 
    + * where x1 is the current estimate, + * x0 is the previous estimate and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
    +   *     x0 = in/2                         [initial guess]
    +   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
    +   * 
    + */ + + + /** + * @addtogroup SQRT + * @{ + */ + + /** + * @brief Floating-point square root function. + * @param[in] in input value. + * @param[out] *pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + + static __INLINE arm_status arm_sqrt_f32( + float32_t in, float32_t *pOut) + { + if(in > 0) + { + +// #if __FPU_USED + #if (__FPU_USED == 1) && defined ( __CC_ARM ) + *pOut = __sqrtf(in); + #else + *pOut = sqrtf(in); + #endif + + return (ARM_MATH_SUCCESS); + } + else + { + *pOut = 0.0f; + return (ARM_MATH_ARGUMENT_ERROR); + } + + } + + + /** + * @brief Q31 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. + * @param[out] *pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + arm_status arm_sqrt_q31( + q31_t in, q31_t *pOut); + + /** + * @brief Q15 square root function. + * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. + * @param[out] *pOut square root of input value. + * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if + * in is negative value and returns zero output for negative values. + */ + arm_status arm_sqrt_q15( + q15_t in, q15_t *pOut); + + /** + * @} end of SQRT group + */ + + + + + + + /** + * @brief floating-point Circular write function. + */ + + static __INLINE void arm_circularWrite_f32( + int32_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const int32_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if(wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = wOffset; + } + + + + /** + * @brief floating-point Circular Read function. + */ + static __INLINE void arm_circularRead_f32( + int32_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + int32_t * dst, + int32_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if(dst == (int32_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if(rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + /** + * @brief Q15 Circular write function. + */ + + static __INLINE void arm_circularWrite_q15( + q15_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q15_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if(wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = wOffset; + } + + + + /** + * @brief Q15 Circular Read function. + */ + static __INLINE void arm_circularRead_q15( + q15_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q15_t * dst, + q15_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if(dst == (q15_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update wOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if(rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q7 Circular write function. + */ + + static __INLINE void arm_circularWrite_q7( + q7_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q7_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0u; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if(wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = wOffset; + } + + + + /** + * @brief Q7 Circular Read function. + */ + static __INLINE void arm_circularRead_q7( + q7_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q7_t * dst, + q7_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset, dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = (int32_t) (dst_base + dst_length); + + /* Loop over the blockSize */ + i = blockSize; + + while(i > 0u) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if(dst == (q7_t *) dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if(rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Sum of the squares of the elements of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_power_q31( + q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + /** + * @brief Sum of the squares of the elements of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_power_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Sum of the squares of the elements of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_power_q15( + q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + /** + * @brief Sum of the squares of the elements of a Q7 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_power_q7( + q7_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Mean value of a Q7 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_mean_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult); + + /** + * @brief Mean value of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + void arm_mean_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + /** + * @brief Mean value of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + void arm_mean_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Mean value of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + void arm_mean_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Variance of the elements of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_var_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Variance of the elements of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_var_q31( + q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + /** + * @brief Variance of the elements of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_var_q15( + q15_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Root Mean Square of the elements of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_rms_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Root Mean Square of the elements of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_rms_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Root Mean Square of the elements of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_rms_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + /** + * @brief Standard deviation of the elements of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_std_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + /** + * @brief Standard deviation of the elements of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_std_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + /** + * @brief Standard deviation of the elements of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output value. + * @return none. + */ + + void arm_std_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + /** + * @brief Floating-point complex magnitude + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_f32( + float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex magnitude + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_q31( + q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + /** + * @brief Q15 complex magnitude + * @param[in] *pSrc points to the complex input vector + * @param[out] *pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + * @return none. + */ + + void arm_cmplx_mag_q15( + q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + /** + * @brief Q15 complex dot product + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] *realResult real part of the result returned here + * @param[out] *imagResult imaginary part of the result returned here + * @return none. + */ + + void arm_cmplx_dot_prod_q15( + q15_t * pSrcA, + q15_t * pSrcB, + uint32_t numSamples, + q31_t * realResult, + q31_t * imagResult); + + /** + * @brief Q31 complex dot product + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] *realResult real part of the result returned here + * @param[out] *imagResult imaginary part of the result returned here + * @return none. + */ + + void arm_cmplx_dot_prod_q31( + q31_t * pSrcA, + q31_t * pSrcB, + uint32_t numSamples, + q63_t * realResult, + q63_t * imagResult); + + /** + * @brief Floating-point complex dot product + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] *realResult real part of the result returned here + * @param[out] *imagResult imaginary part of the result returned here + * @return none. + */ + + void arm_cmplx_dot_prod_f32( + float32_t * pSrcA, + float32_t * pSrcB, + uint32_t numSamples, + float32_t * realResult, + float32_t * imagResult); + + /** + * @brief Q15 complex-by-real multiplication + * @param[in] *pSrcCmplx points to the complex input vector + * @param[in] *pSrcReal points to the real input vector + * @param[out] *pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + * @return none. + */ + + void arm_cmplx_mult_real_q15( + q15_t * pSrcCmplx, + q15_t * pSrcReal, + q15_t * pCmplxDst, + uint32_t numSamples); + + /** + * @brief Q31 complex-by-real multiplication + * @param[in] *pSrcCmplx points to the complex input vector + * @param[in] *pSrcReal points to the real input vector + * @param[out] *pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + * @return none. + */ + + void arm_cmplx_mult_real_q31( + q31_t * pSrcCmplx, + q31_t * pSrcReal, + q31_t * pCmplxDst, + uint32_t numSamples); + + /** + * @brief Floating-point complex-by-real multiplication + * @param[in] *pSrcCmplx points to the complex input vector + * @param[in] *pSrcReal points to the real input vector + * @param[out] *pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + * @return none. + */ + + void arm_cmplx_mult_real_f32( + float32_t * pSrcCmplx, + float32_t * pSrcReal, + float32_t * pCmplxDst, + uint32_t numSamples); + + /** + * @brief Minimum value of a Q7 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *result is output pointer + * @param[in] index is the array index of the minimum value in the input buffer. + * @return none. + */ + + void arm_min_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * result, + uint32_t * index); + + /** + * @brief Minimum value of a Q15 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output pointer + * @param[in] *pIndex is the array index of the minimum value in the input buffer. + * @return none. + */ + + void arm_min_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of a Q31 vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output pointer + * @param[out] *pIndex is the array index of the minimum value in the input buffer. + * @return none. + */ + void arm_min_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of a floating-point vector. + * @param[in] *pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] *pResult is output pointer + * @param[out] *pIndex is the array index of the minimum value in the input buffer. + * @return none. + */ + + void arm_min_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of a Q7 vector. + * @param[in] *pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] *pResult maximum value returned here + * @param[out] *pIndex index of maximum value returned here + * @return none. + */ + + void arm_max_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of a Q15 vector. + * @param[in] *pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] *pResult maximum value returned here + * @param[out] *pIndex index of maximum value returned here + * @return none. + */ + + void arm_max_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of a Q31 vector. + * @param[in] *pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] *pResult maximum value returned here + * @param[out] *pIndex index of maximum value returned here + * @return none. + */ + + void arm_max_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] *pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] *pResult maximum value returned here + * @param[out] *pIndex index of maximum value returned here + * @return none. + */ + + void arm_max_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + /** + * @brief Q15 complex-by-complex multiplication + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_mult_cmplx_q15( + q15_t * pSrcA, + q15_t * pSrcB, + q15_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex-by-complex multiplication + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_mult_cmplx_q31( + q31_t * pSrcA, + q31_t * pSrcB, + q31_t * pDst, + uint32_t numSamples); + + /** + * @brief Floating-point complex-by-complex multiplication + * @param[in] *pSrcA points to the first input vector + * @param[in] *pSrcB points to the second input vector + * @param[out] *pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + * @return none. + */ + + void arm_cmplx_mult_cmplx_f32( + float32_t * pSrcA, + float32_t * pSrcB, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] *pSrc points to the floating-point input vector + * @param[out] *pDst points to the Q31 output vector + * @param[in] blockSize length of the input vector + * @return none. + */ + void arm_float_to_q31( + float32_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the floating-point vector to Q15 vector. + * @param[in] *pSrc points to the floating-point input vector + * @param[out] *pDst points to the Q15 output vector + * @param[in] blockSize length of the input vector + * @return none + */ + void arm_float_to_q15( + float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the floating-point vector to Q7 vector. + * @param[in] *pSrc points to the floating-point input vector + * @param[out] *pDst points to the Q7 output vector + * @param[in] blockSize length of the input vector + * @return none + */ + void arm_float_to_q7( + float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q15 vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q31_to_q15( + q31_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the Q31 vector to Q7 vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q31_to_q7( + q31_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the Q15 vector to floating-point vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q15_to_float( + q15_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q31 vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q15_to_q31( + q15_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q7 vector. + * @param[in] *pSrc is input pointer + * @param[out] *pDst is output pointer + * @param[in] blockSize is the number of samples to process + * @return none. + */ + void arm_q15_to_q7( + q15_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @ingroup groupInterpolation + */ + + /** + * @defgroup BilinearInterpolate Bilinear Interpolation + * + * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. + * The underlying function f(x, y) is sampled on a regular grid and the interpolation process + * determines values between the grid points. + * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. + * Bilinear interpolation is often used in image processing to rescale images. + * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. + * + * Algorithm + * \par + * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. + * For floating-point, the instance structure is defined as: + *
    +   *   typedef struct
    +   *   {
    +   *     uint16_t numRows;
    +   *     uint16_t numCols;
    +   *     float32_t *pData;
    +   * } arm_bilinear_interp_instance_f32;
    +   * 
    + * + * \par + * where numRows specifies the number of rows in the table; + * numCols specifies the number of columns in the table; + * and pData points to an array of size numRows*numCols values. + * The data table pTable is organized in row order and the supplied data values fall on integer indexes. + * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. + * + * \par + * Let (x, y) specify the desired interpolation point. Then define: + *
    +   *     XF = floor(x)
    +   *     YF = floor(y)
    +   * 
    + * \par + * The interpolated output point is computed as: + *
    +   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
    +   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
    +   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
    +   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
    +   * 
    + * Note that the coordinates (x, y) contain integer and fractional components. + * The integer components specify which portion of the table to use while the + * fractional components control the interpolation processor. + * + * \par + * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. + */ + + /** + * @addtogroup BilinearInterpolate + * @{ + */ + + /** + * + * @brief Floating-point bilinear interpolation. + * @param[in,out] *S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate. + * @param[in] Y interpolation coordinate. + * @return out interpolated value. + */ + + + static __INLINE float32_t arm_bilinear_interp_f32( + const arm_bilinear_interp_instance_f32 * S, + float32_t X, + float32_t Y) + { + float32_t out; + float32_t f00, f01, f10, f11; + float32_t *pData = S->pData; + int32_t xIndex, yIndex, index; + float32_t xdiff, ydiff; + float32_t b1, b2, b3, b4; + + xIndex = (int32_t) X; + yIndex = (int32_t) Y; + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if(xIndex < 0 || xIndex > (S->numRows-1) || yIndex < 0 || yIndex > ( S->numCols-1)) + { + return(0); + } + + /* Calculation of index for two nearest points in X-direction */ + index = (xIndex - 1) + (yIndex-1) * S->numCols ; + + + /* Read two nearest points in X-direction */ + f00 = pData[index]; + f01 = pData[index + 1]; + + /* Calculation of index for two nearest points in Y-direction */ + index = (xIndex-1) + (yIndex) * S->numCols; + + + /* Read two nearest points in Y-direction */ + f10 = pData[index]; + f11 = pData[index + 1]; + + /* Calculation of intermediate values */ + b1 = f00; + b2 = f01 - f00; + b3 = f10 - f00; + b4 = f00 - f01 - f10 + f11; + + /* Calculation of fractional part in X */ + xdiff = X - xIndex; + + /* Calculation of fractional part in Y */ + ydiff = Y - yIndex; + + /* Calculation of bi-linear interpolated output */ + out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; + + /* return to application */ + return (out); + + } + + /** + * + * @brief Q31 bilinear interpolation. + * @param[in,out] *S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + + static __INLINE q31_t arm_bilinear_interp_q31( + arm_bilinear_interp_instance_q31 * S, + q31_t X, + q31_t Y) + { + q31_t out; /* Temporary output */ + q31_t acc = 0; /* output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q31_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q31_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & 0xFFF00000) >> 20u); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & 0xFFF00000) >> 20u); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if(rI < 0 || rI > (S->numRows-1) || cI < 0 || cI > ( S->numCols-1)) + { + return(0); + } + + /* 20 bits for the fractional part */ + /* shift left xfract by 11 to keep 1.31 format */ + xfract = (X & 0x000FFFFF) << 11u; + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + nCols * (cI)]; + x2 = pYData[(rI) + nCols * (cI) + 1u]; + + /* 20 bits for the fractional part */ + /* shift left yfract by 11 to keep 1.31 format */ + yfract = (Y & 0x000FFFFF) << 11u; + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + nCols * (cI + 1)]; + y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ + out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); + acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); + + /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); + + /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ + out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); + acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); + + /* Convert acc to 1.31(q31) format */ + return (acc << 2u); + + } + + /** + * @brief Q15 bilinear interpolation. + * @param[in,out] *S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + + static __INLINE q15_t arm_bilinear_interp_q15( + arm_bilinear_interp_instance_q15 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q15_t x1, x2, y1, y2; /* Nearest output values */ + q31_t xfract, yfract; /* X, Y fractional parts */ + int32_t rI, cI; /* Row and column indices */ + q15_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & 0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & 0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if(rI < 0 || rI > (S->numRows-1) || cI < 0 || cI > ( S->numCols-1)) + { + return(0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & 0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + nCols * (cI)]; + x2 = pYData[(rI) + nCols * (cI) + 1u]; + + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + nCols * (cI + 1)]; + y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ + + /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ + /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ + out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); + acc = ((q63_t) out * (0xFFFFF - yfract)); + + /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); + acc += ((q63_t) out * (xfract)); + + /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); + acc += ((q63_t) out * (yfract)); + + /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ + out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u); + acc += ((q63_t) out * (yfract)); + + /* acc is in 13.51 format and down shift acc by 36 times */ + /* Convert out to 1.15 format */ + return (acc >> 36); + + } + + /** + * @brief Q7 bilinear interpolation. + * @param[in,out] *S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + + static __INLINE q7_t arm_bilinear_interp_q7( + arm_bilinear_interp_instance_q7 * S, + q31_t X, + q31_t Y) + { + q63_t acc = 0; /* output */ + q31_t out; /* Temporary output */ + q31_t xfract, yfract; /* X, Y fractional parts */ + q7_t x1, x2, y1, y2; /* Nearest output values */ + int32_t rI, cI; /* Row and column indices */ + q7_t *pYData = S->pData; /* pointer to output table values */ + uint32_t nCols = S->numCols; /* num of rows */ + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + rI = ((X & 0xFFF00000) >> 20); + + /* Input is in 12.20 format */ + /* 12 bits for the table index */ + /* Index value calculation */ + cI = ((Y & 0xFFF00000) >> 20); + + /* Care taken for table outside boundary */ + /* Returns zero output when values are outside table boundary */ + if(rI < 0 || rI > (S->numRows-1) || cI < 0 || cI > ( S->numCols-1)) + { + return(0); + } + + /* 20 bits for the fractional part */ + /* xfract should be in 12.20 format */ + xfract = (X & 0x000FFFFF); + + /* Read two nearest output values from the index */ + x1 = pYData[(rI) + nCols * (cI)]; + x2 = pYData[(rI) + nCols * (cI) + 1u]; + + + /* 20 bits for the fractional part */ + /* yfract should be in 12.20 format */ + yfract = (Y & 0x000FFFFF); + + /* Read two nearest output values from the index */ + y1 = pYData[(rI) + nCols * (cI + 1)]; + y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; + + /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ + out = ((x1 * (0xFFFFF - xfract))); + acc = (((q63_t) out * (0xFFFFF - yfract))); + + /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ + out = ((x2 * (0xFFFFF - yfract))); + acc += (((q63_t) out * (xfract))); + + /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y1 * (0xFFFFF - xfract))); + acc += (((q63_t) out * (yfract))); + + /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ + out = ((y2 * (yfract))); + acc += (((q63_t) out * (xfract))); + + /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ + return (acc >> 40); + + } + + /** + * @} end of BilinearInterpolate group + */ + + + + + + +#ifdef __cplusplus +} +#endif + + +#endif /* _ARM_MATH_H */ + + +/** + * + * End of file. + */ diff --git a/frameworks/CMSIS/LPC1768/include/core_cm3.h b/frameworks/CMSIS/LPC1768/include/core_cm3.h new file mode 100644 index 0000000000..b09ff8db47 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/core_cm3.h @@ -0,0 +1,1227 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V2.10 + * @date 19. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + + +/** \ingroup CMSIS_Core + \defgroup CMSIS_MISRA_Exceptions CMSIS MISRA-C:2004 Compliance Exceptions + CMSIS violates following MISRA-C2004 Rules: + + - Violates MISRA 2004 Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + - Violates MISRA 2004 Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + - Violates MISRA 2004 Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \ingroup CMSIS_Core + \defgroup CMSIS_core_definitions CMSIS Core Definitions + This file defines all structures and symbols for CMSIS core: + - CMSIS version number + - Cortex-M core + - Cortex-M core Revision Number + @{ + */ + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (0x02) /*!< [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (0x10) /*!< [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x03) /*!< Cortex core */ + + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + +/*!< __FPU_USED to be checked prior to making use of FPU specific registers and functions */ +#define __FPU_USED 0 + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + /* add preprocessor checks */ +#endif + +#include /*!< standard types definitions */ +#include "core_cmInstr.h" /*!< Core Instruction Access */ +#include "core_cmFunc.h" /*!< Core Function Access */ + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200 + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0 + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 4 + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0 + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +#ifdef __cplusplus + #define __I volatile /*!< defines 'read only' permissions */ +#else + #define __I volatile const /*!< defines 'read only' permissions */ +#endif +#define __O volatile /*!< defines 'write only' permissions */ +#define __IO volatile /*!< defines 'read / write' permissions */ + +/*@} end of group CMSIS_core_definitions */ + + + +/******************************************************************************* + * Register Abstraction + ******************************************************************************/ +/** \ingroup CMSIS_Core + \defgroup CMSIS_core_register CMSIS Core Register + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE CMSIS Core + Type definitions for the Cortex-M Core Registers + @{ + */ + +/** \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ +#else + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ +#endif + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + + +/** \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + + +/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ +#else + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ +#endif + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + + +/** \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/*@} end of group CMSIS_CORE */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC CMSIS NVIC + Type definitions for the Cortex-M NVIC Registers + @{ + */ + +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCB CMSIS SCB + Type definitions for the Cortex-M System Control Block Registers + @{ + */ + +/** \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5]; + __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Registers Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* SCB Hard Fault Status Registers Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB CMSIS System Control and ID Register not in the SCB + Type definitions for the Cortex-M System Control and ID Register not in the SCB + @{ + */ + +/** \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1]; + __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) + __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick CMSIS SysTick + Type definitions for the Cortex-M System Timer Registers + @{ + */ + +/** \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_ITM CMSIS ITM + Type definitions for the Cortex-M Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __O union + { + __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864]; + __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15]; + __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15]; + __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_TXENA_Pos 3 /*!< ITM TCR: TXENA Position */ +#define ITM_TCR_TXENA_Msk (1UL << ITM_TCR_TXENA_Pos) /*!< ITM TCR: TXENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +#if (__MPU_PRESENT == 1) +/** \ingroup CMSIS_core_register + \defgroup CMSIS_MPU CMSIS MPU + Type definitions for the Cortex-M Memory Protection Unit (MPU) + @{ + */ + +/** \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register */ +#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register */ +#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register */ +#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register */ +#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register */ +#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug CMSIS Core Debug + Type definitions for the Cortex-M Core Debug Registers + @{ + */ + +/** \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register */ +#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** \ingroup CMSIS_core_register + @{ + */ + +/* Memory mapping of Cortex-M3 Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if (__MPU_PRESENT == 1) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + ******************************************************************************/ +/** \ingroup CMSIS_Core + \defgroup CMSIS_Core_FunctionInterface CMSIS Core Function Interface + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions CMSIS Core NVIC Functions + @{ + */ + +/** \brief Set Priority Grouping + + This function sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + + \param [in] PriorityGroup Priority grouping field + */ +static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** \brief Get Priority Grouping + + This function gets the priority grouping from NVIC Interrupt Controller. + Priority grouping is SCB->AIRCR [10:8] PRIGROUP field. + + \return Priority grouping field + */ +static __INLINE uint32_t NVIC_GetPriorityGrouping(void) +{ + return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ +} + + +/** \brief Enable External Interrupt + + This function enables a device specific interrupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to enable + */ +static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +} + + +/** \brief Disable External Interrupt + + This function disables a device specific interrupt in the NVIC interrupt controller. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the external interrupt to disable + */ +static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ +} + + +/** \brief Get Pending Interrupt + + This function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Number of the interrupt for get pending + \return 0 Interrupt status is not pending + \return 1 Interrupt status is pending + */ +static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ +} + + +/** \brief Set Pending Interrupt + + This function sets the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for set pending + */ +static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ +} + + +/** \brief Clear Pending Interrupt + + This function clears the pending bit for the specified interrupt. + The interrupt number cannot be a negative value. + + \param [in] IRQn Number of the interrupt for clear pending + */ +static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Get Active Interrupt + + This function reads the active register in NVIC and returns the active bit. + \param [in] IRQn Number of the interrupt for get active + \return 0 Interrupt status is not active + \return 1 Interrupt status is active + */ +static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ +} + + +/** \brief Set Interrupt Priority + + This function sets the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + Note: The priority cannot be set for every core interrupt. + + \param [in] IRQn Number of the interrupt for set priority + \param [in] priority Priority to set + */ +static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ + else { + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ +} + + +/** \brief Get Interrupt Priority + + This function reads the priority for the specified interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + The returned priority value is automatically aligned to the implemented + priority bits of the microcontroller. + + \param [in] IRQn Number of the interrupt for get priority + \return Interrupt Priority + */ +static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ + else { + return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief Encode Priority + + This function encodes the priority for an interrupt with the given priority group, + preemptive priority value and sub priority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + + The returned priority value can be used for NVIC_SetPriority(...) function + + \param [in] PriorityGroup Used priority group + \param [in] PreemptPriority Preemptive priority value (starting from 0) + \param [in] SubPriority Sub priority value (starting from 0) + \return Encoded priority for the interrupt + */ +static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + return ( + ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | + ((SubPriority & ((1 << (SubPriorityBits )) - 1))) + ); +} + + +/** \brief Decode Priority + + This function decodes an interrupt priority value with the given priority group to + preemptive priority value and sub priority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + + The priority value can be retrieved with NVIC_GetPriority(...) function + + \param [in] Priority Priority value + \param [in] PriorityGroup Used priority group + \param [out] pPreemptPriority Preemptive priority value (starting from 0) + \param [out] pSubPriority Sub priority value (starting from 0) + */ +static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); + *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); +} + + +/** \brief System Reset + + This function initiate a system reset request to reset the MCU. + */ +static __INLINE void NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + while(1); /* wait until reset */ +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions CMSIS Core SysTick Functions + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + This function initializes the system tick timer and its interrupt and start the system tick timer. + Counter is in free running mode to generate periodical interrupts. + + \param [in] ticks Number of ticks between two interrupts + \return 0 Function succeeded + \return 1 Function failed + */ +static __INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ + SysTick->VAL = 0; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions CMSIS Core Debug Functions + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< external variable to receive characters */ +#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< value identifying ITM_RxBuffer is ready for next character */ + + +/** \brief ITM Send Character + + This function transmits a character via the ITM channel 0. + It just returns when no debugger is connected that has booked the output. + It is blocking when a debugger is connected, but the previous character send is not transmitted. + + \param [in] ch Character to transmit + \return Character to transmit + */ +static __INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && /* Trace enabled */ + (ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ + (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0].u32 == 0); + ITM->PORT[0].u8 = (uint8_t) ch; + } + return (ch); +} + + +/** \brief ITM Receive Character + + This function inputs a character via external variable ITM_RxBuffer. + It just returns when no debugger is connected that has booked the output. + It is blocking when a debugger is connected, but the previous character send is not transmitted. + + \return Received character + \return -1 No character received + */ +static __INLINE int32_t ITM_ReceiveChar (void) { + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** \brief ITM Check Character + + This function checks external variable ITM_RxBuffer whether a character is available or not. + It returns '1' if a character is available and '0' if no character is available. + + \return 0 No character available + \return 1 Character available + */ +static __INLINE int32_t ITM_CheckChar (void) { + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { + return (0); /* no character available */ + } else { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ + +#ifdef __cplusplus +} +#endif diff --git a/frameworks/CMSIS/LPC1768/include/core_cmFunc.h b/frameworks/CMSIS/LPC1768/include/core_cmFunc.h new file mode 100644 index 0000000000..e29757aef7 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/core_cmFunc.h @@ -0,0 +1,609 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V2.10 + * @date 26. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMFUNC_H +#define __CORE_CMFUNC_H + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +static __INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +static __INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR Register value + */ +static __INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +static __INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +static __INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +static __INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +static __INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +static __INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +static __INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +static __INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +static __INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +static __INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +static __INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +static __INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +static __INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +static __INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +static __INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i"); +} + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i"); +} + + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) ); +} + + +/** \brief Get ISPR Register + + This function returns the content of the ISPR Register. + + \return ISPR Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) ); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) ); +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f"); +} + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) ); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__( ( always_inline ) ) static __INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +#endif /* __CORE_CMFUNC_H */ diff --git a/frameworks/CMSIS/LPC1768/include/core_cmInstr.h b/frameworks/CMSIS/LPC1768/include/core_cmInstr.h new file mode 100644 index 0000000000..8ccd4fef1f --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/core_cmInstr.h @@ -0,0 +1,586 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V2.10 + * @date 19. July 2011 + * + * @note + * Copyright (C) 2009-2011 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMINSTR_H +#define __CORE_CMINSTR_H + + +/* ########################## Core Instruction Access ######################### */ +/** \ingroup CMSIS_Core + \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +#define __ISB() __isb(0xF) + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __dsb(0xF) + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __dmb(0xF) + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +static __INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +static __INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW(value, ptr) __strex(value, ptr) + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#define __CLREX __clrex + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +#endif /* (__CORTEX_M >= 0x03) */ + + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +__attribute__( ( always_inline ) ) static __INLINE void __NOP(void) +{ + __ASM volatile ("nop"); +} + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) static __INLINE void __WFI(void) +{ + __ASM volatile ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) static __INLINE void __WFE(void) +{ + __ASM volatile ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +__attribute__( ( always_inline ) ) static __INLINE void __SEV(void) +{ + __ASM volatile ("sev"); +} + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__attribute__( ( always_inline ) ) static __INLINE void __ISB(void) +{ + __ASM volatile ("isb"); +} + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__( ( always_inline ) ) static __INLINE void __DSB(void) +{ + __ASM volatile ("dsb"); +} + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__( ( always_inline ) ) static __INLINE void __DMB(void) +{ + __ASM volatile ("dmb"); +} + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE int32_t __REVSH(int32_t value) +{ + uint32_t result; + + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__( ( always_inline ) ) static __INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint8_t result; + + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__( ( always_inline ) ) static __INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint16_t result; + + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +__attribute__( ( always_inline ) ) static __INLINE void __CLREX(void) +{ + __ASM volatile ("clrex"); +} + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__attribute__( ( always_inline ) ) static __INLINE uint8_t __CLZ(uint32_t value) +{ + uint8_t result; + + __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H */ diff --git a/frameworks/CMSIS/LPC1768/include/debug_frmwrk.h b/frameworks/CMSIS/LPC1768/include/debug_frmwrk.h new file mode 100644 index 0000000000..dc3dfdace4 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/debug_frmwrk.h @@ -0,0 +1,80 @@ +/********************************************************************** +* $Id$ debug_frmwrk.h 2010-05-21 +*//** +* @file debug_frmwrk.h +* @brief Contains some utilities that used for debugging through UART +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ +#ifndef DEBUG_FRMWRK_H_ +#define DEBUG_FRMWRK_H_ + +//#include +#include "lpc17xx_uart.h" + +#define USED_UART_DEBUG_PORT 0 + +#if (USED_UART_DEBUG_PORT==0) +#define DEBUG_UART_PORT LPC_UART0 +#elif (USED_UART_DEBUG_PORT==1) +#define DEBUG_UART_PORT LPC_UART1 +#endif + +#define _DBG(x) _db_msg(DEBUG_UART_PORT, x) +#define _DBG_(x) _db_msg_(DEBUG_UART_PORT, x) +#define _DBC(x) _db_char(DEBUG_UART_PORT, x) +#define _DBD(x) _db_dec(DEBUG_UART_PORT, x) +#define _DBD16(x) _db_dec_16(DEBUG_UART_PORT, x) +#define _DBD32(x) _db_dec_32(DEBUG_UART_PORT, x) +#define _DBH(x) _db_hex(DEBUG_UART_PORT, x) +#define _DBH16(x) _db_hex_16(DEBUG_UART_PORT, x) +#define _DBH32(x) _db_hex_32(DEBUG_UART_PORT, x) +#define _DG _db_get_char(DEBUG_UART_PORT) +//void _printf (const char *format, ...); + +extern void (*_db_msg)(LPC_UART_TypeDef *UARTx, const void *s); +extern void (*_db_msg_)(LPC_UART_TypeDef *UARTx, const void *s); +extern void (*_db_char)(LPC_UART_TypeDef *UARTx, uint8_t ch); +extern void (*_db_dec)(LPC_UART_TypeDef *UARTx, uint8_t decn); +extern void (*_db_dec_16)(LPC_UART_TypeDef *UARTx, uint16_t decn); +extern void (*_db_dec_32)(LPC_UART_TypeDef *UARTx, uint32_t decn); +extern void (*_db_hex)(LPC_UART_TypeDef *UARTx, uint8_t hexn); +extern void (*_db_hex_16)(LPC_UART_TypeDef *UARTx, uint16_t hexn); +extern void (*_db_hex_32)(LPC_UART_TypeDef *UARTx, uint32_t hexn); +extern uint8_t (*_db_get_char)(LPC_UART_TypeDef *UARTx); + +void UARTPutChar (LPC_UART_TypeDef *UARTx, uint8_t ch); +void UARTPuts(LPC_UART_TypeDef *UARTx, const void *str); +void UARTPuts_(LPC_UART_TypeDef *UARTx, const void *str); +void UARTPutDec(LPC_UART_TypeDef *UARTx, uint8_t decnum); +void UARTPutDec16(LPC_UART_TypeDef *UARTx, uint16_t decnum); +void UARTPutDec32(LPC_UART_TypeDef *UARTx, uint32_t decnum); +void UARTPutHex (LPC_UART_TypeDef *UARTx, uint8_t hexnum); +void UARTPutHex16 (LPC_UART_TypeDef *UARTx, uint16_t hexnum); +void UARTPutHex32 (LPC_UART_TypeDef *UARTx, uint32_t hexnum); +uint8_t UARTGetChar (LPC_UART_TypeDef *UARTx); +void debug_frmwrk_init(void); + +#endif /* DEBUG_FRMWRK_H_ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_adc.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_adc.h new file mode 100644 index 0000000000..777bbd503e --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_adc.h @@ -0,0 +1,302 @@ +/********************************************************************** +* $Id$ lpc17xx_adc.h 2008-07-27 +*//** +* @file lpc17xx_adc.h +* @brief Contains the NXP ABL typedefs for C standard types. +* It is intended to be used in ISO C conforming development +* environments and checks for this insofar as it is possible +* to do so. +* @version 2.0 +* @date 27 Jul. 2008 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2008, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup ADC ADC (Analog-to-Digital Converter) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_ADC_H_ +#define LPC17XX_ADC_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Private macros ------------------------------------------------------------- */ +/** @defgroup ADC_Private_Macros ADC Private Macros + * @{ + */ + +/* -------------------------- BIT DEFINITIONS ----------------------------------- */ +/*********************************************************************//** + * Macro defines for ADC control register + **********************************************************************/ +/** Selects which of the AD0.0:7 pins is (are) to be sampled and converted */ +#define ADC_CR_CH_SEL(n) ((1UL << n)) +/** The APB clock (PCLK) is divided by (this value plus one) +* to produce the clock for the A/D */ +#define ADC_CR_CLKDIV(n) ((n<<8)) +/** Repeated conversions A/D enable bit */ +#define ADC_CR_BURST ((1UL<<16)) +/** ADC convert in power down mode */ +#define ADC_CR_PDN ((1UL<<21)) +/** Start mask bits */ +#define ADC_CR_START_MASK ((7UL<<24)) +/** Select Start Mode */ +#define ADC_CR_START_MODE_SEL(SEL) ((SEL<<24)) +/** Start conversion now */ +#define ADC_CR_START_NOW ((1UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on P2.10/EINT0 */ +#define ADC_CR_START_EINT0 ((2UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on P1.27/CAP0.1 */ +#define ADC_CR_START_CAP01 ((3UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on MAT0.1 */ +#define ADC_CR_START_MAT01 ((4UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on MAT0.3 */ +#define ADC_CR_START_MAT03 ((5UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on MAT1.0 */ +#define ADC_CR_START_MAT10 ((6UL<<24)) +/** Start conversion when the edge selected by bit 27 occurs on MAT1.1 */ +#define ADC_CR_START_MAT11 ((7UL<<24)) +/** Start conversion on a falling edge on the selected CAP/MAT signal */ +#define ADC_CR_EDGE ((1UL<<27)) + +/*********************************************************************//** + * Macro defines for ADC Global Data register + **********************************************************************/ +/** When DONE is 1, this field contains result value of ADC conversion */ +#define ADC_GDR_RESULT(n) (((n>>4)&0xFFF)) +/** These bits contain the channel from which the LS bits were converted */ +#define ADC_GDR_CH(n) (((n>>24)&0x7)) +/** This bit is 1 in burst mode if the results of one or + * more conversions was (were) lost */ +#define ADC_GDR_OVERRUN_FLAG ((1UL<<30)) +/** This bit is set to 1 when an A/D conversion completes */ +#define ADC_GDR_DONE_FLAG ((1UL<<31)) + +/** This bits is used to mask for Channel */ +#define ADC_GDR_CH_MASK ((7UL<<24)) +/*********************************************************************//** + * Macro defines for ADC Interrupt register + **********************************************************************/ +/** These bits allow control over which A/D channels generate + * interrupts for conversion completion */ +#define ADC_INTEN_CH(n) ((1UL<>4)&0xFFF)) +/** These bits mirror the OVERRRUN status flags that appear in the + * result register for each A/D channel */ +#define ADC_DR_OVERRUN_FLAG ((1UL<<30)) +/** This bit is set to 1 when an A/D conversion completes. It is cleared + * when this register is read */ +#define ADC_DR_DONE_FLAG ((1UL<<31)) + +/*********************************************************************//** + * Macro defines for ADC Status register +**********************************************************************/ +/** These bits mirror the DONE status flags that appear in the result + * register for each A/D channel */ +#define ADC_STAT_CH_DONE_FLAG(n) ((n&0xFF)) +/** These bits mirror the OVERRRUN status flags that appear in the + * result register for each A/D channel */ +#define ADC_STAT_CH_OVERRUN_FLAG(n) (((n>>8)&0xFF)) +/** This bit is the A/D interrupt flag */ +#define ADC_STAT_INT_FLAG ((1UL<<16)) + +/*********************************************************************//** + * Macro defines for ADC Trim register +**********************************************************************/ +/** Offset trim bits for ADC operation */ +#define ADC_ADCOFFS(n) (((n&0xF)<<4)) +/** Written to boot code*/ +#define ADC_TRIM(n) (((n&0xF)<<8)) + +/* ------------------- CHECK PARAM DEFINITIONS ------------------------- */ +/** Check ADC parameter */ +#define PARAM_ADCx(n) (((uint32_t *)n)==((uint32_t *)LPC_ADC)) + +/** Check ADC state parameter */ +#define PARAM_ADC_START_ON_EDGE_OPT(OPT) ((OPT == ADC_START_ON_RISING)||(OPT == ADC_START_ON_FALLING)) + +/** Check ADC state parameter */ +#define PARAM_ADC_DATA_STATUS(OPT) ((OPT== ADC_DATA_BURST)||(OPT== ADC_DATA_DONE)) + +/** Check ADC rate parameter */ +#define PARAM_ADC_RATE(rate) ((rate>0)&&(rate<=200000)) + +/** Check ADC channel selection parameter */ +#define PARAM_ADC_CHANNEL_SELECTION(SEL) ((SEL == ADC_CHANNEL_0)||(ADC_CHANNEL_1)\ +||(SEL == ADC_CHANNEL_2)|(ADC_CHANNEL_3)\ +||(SEL == ADC_CHANNEL_4)||(ADC_CHANNEL_5)\ +||(SEL == ADC_CHANNEL_6)||(ADC_CHANNEL_7)) + +/** Check ADC start option parameter */ +#define PARAM_ADC_START_OPT(OPT) ((OPT == ADC_START_CONTINUOUS)||(OPT == ADC_START_NOW)\ +||(OPT == ADC_START_ON_EINT0)||(OPT == ADC_START_ON_CAP01)\ +||(OPT == ADC_START_ON_MAT01)||(OPT == ADC_START_ON_MAT03)\ +||(OPT == ADC_START_ON_MAT10)||(OPT == ADC_START_ON_MAT11)) + +/** Check ADC interrupt type parameter */ +#define PARAM_ADC_TYPE_INT_OPT(OPT) ((OPT == ADC_ADINTEN0)||(OPT == ADC_ADINTEN1)\ +||(OPT == ADC_ADINTEN2)||(OPT == ADC_ADINTEN3)\ +||(OPT == ADC_ADINTEN4)||(OPT == ADC_ADINTEN5)\ +||(OPT == ADC_ADINTEN6)||(OPT == ADC_ADINTEN7)\ +||(OPT == ADC_ADGINTEN)) + +/** + * @} + */ + + +/* Public Types --------------------------------------------------------------- */ +/** @defgroup ADC_Public_Types ADC Public Types + * @{ + */ + +/*********************************************************************//** + * @brief ADC enumeration + **********************************************************************/ +/** @brief Channel Selection */ +typedef enum +{ + ADC_CHANNEL_0 = 0, /*!< Channel 0 */ + ADC_CHANNEL_1, /*!< Channel 1 */ + ADC_CHANNEL_2, /*!< Channel 2 */ + ADC_CHANNEL_3, /*!< Channel 3 */ + ADC_CHANNEL_4, /*!< Channel 4 */ + ADC_CHANNEL_5, /*!< Channel 5 */ + ADC_CHANNEL_6, /*!< Channel 6 */ + ADC_CHANNEL_7 /*!< Channel 7 */ +}ADC_CHANNEL_SELECTION; + +/** @brief Type of start option */ +typedef enum +{ + ADC_START_CONTINUOUS =0, /*!< Continuous mode */ + ADC_START_NOW, /*!< Start conversion now */ + ADC_START_ON_EINT0, /*!< Start conversion when the edge selected + * by bit 27 occurs on P2.10/EINT0 */ + ADC_START_ON_CAP01, /*!< Start conversion when the edge selected + * by bit 27 occurs on P1.27/CAP0.1 */ + ADC_START_ON_MAT01, /*!< Start conversion when the edge selected + * by bit 27 occurs on MAT0.1 */ + ADC_START_ON_MAT03, /*!< Start conversion when the edge selected + * by bit 27 occurs on MAT0.3 */ + ADC_START_ON_MAT10, /*!< Start conversion when the edge selected + * by bit 27 occurs on MAT1.0 */ + ADC_START_ON_MAT11 /*!< Start conversion when the edge selected + * by bit 27 occurs on MAT1.1 */ +} ADC_START_OPT; + + +/** @brief Type of edge when start conversion on the selected CAP/MAT signal */ +typedef enum +{ + ADC_START_ON_RISING = 0, /*!< Start conversion on a rising edge + *on the selected CAP/MAT signal */ + ADC_START_ON_FALLING /*!< Start conversion on a falling edge + *on the selected CAP/MAT signal */ +} ADC_START_ON_EDGE_OPT; + +/** @brief* ADC type interrupt enum */ +typedef enum +{ + ADC_ADINTEN0 = 0, /*!< Interrupt channel 0 */ + ADC_ADINTEN1, /*!< Interrupt channel 1 */ + ADC_ADINTEN2, /*!< Interrupt channel 2 */ + ADC_ADINTEN3, /*!< Interrupt channel 3 */ + ADC_ADINTEN4, /*!< Interrupt channel 4 */ + ADC_ADINTEN5, /*!< Interrupt channel 5 */ + ADC_ADINTEN6, /*!< Interrupt channel 6 */ + ADC_ADINTEN7, /*!< Interrupt channel 7 */ + ADC_ADGINTEN /*!< Individual channel/global flag done generate an interrupt */ +}ADC_TYPE_INT_OPT; + +/** @brief ADC Data status */ +typedef enum +{ + ADC_DATA_BURST = 0, /*Burst bit*/ + ADC_DATA_DONE /*Done bit*/ +}ADC_DATA_STATUS; + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup ADC_Public_Functions ADC Public Functions + * @{ + */ +/* Init/DeInit ADC peripheral ----------------*/ +void ADC_Init(LPC_ADC_TypeDef *ADCx, uint32_t rate); +void ADC_DeInit(LPC_ADC_TypeDef *ADCx); + +/* Enable/Disable ADC functions --------------*/ +void ADC_BurstCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_PowerdownCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState); +void ADC_StartCmd(LPC_ADC_TypeDef *ADCx, uint8_t start_mode); +void ADC_ChannelCmd (LPC_ADC_TypeDef *ADCx, uint8_t Channel, FunctionalState NewState); + +/* Configure ADC functions -------------------*/ +void ADC_EdgeStartConfig(LPC_ADC_TypeDef *ADCx, uint8_t EdgeOption); +void ADC_IntConfig (LPC_ADC_TypeDef *ADCx, ADC_TYPE_INT_OPT IntType, FunctionalState NewState); + +/* Get ADC information functions -------------------*/ +uint16_t ADC_ChannelGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel); +FlagStatus ADC_ChannelGetStatus(LPC_ADC_TypeDef *ADCx, uint8_t channel, uint32_t StatusType); +uint32_t ADC_GlobalGetData(LPC_ADC_TypeDef *ADCx); +FlagStatus ADC_GlobalGetStatus(LPC_ADC_TypeDef *ADCx, uint32_t StatusType); + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + + +#endif /* LPC17XX_ADC_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_can.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_can.h new file mode 100644 index 0000000000..7739e05008 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_can.h @@ -0,0 +1,872 @@ +/********************************************************************** +* $Id$ lpc17xx_can.h 2010-06-18 +*//** +* @file lpc17xx_can.h +* @brief Contains all macro definitions and function prototypes +* support for CAN firmware library on LPC17xx +* @version 3.0 +* @date 18. June. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup CAN CAN (Control Area Network) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_CAN_H_ +#define LPC17XX_CAN_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Public Types --------------------------------------------------------------- */ +/** @defgroup CAN_Public_Macros CAN Public Macros + * @{ + */ +#define MSG_ENABLE ((uint8_t)(0)) +#define MSG_DISABLE ((uint8_t)(1)) +#define CAN1_CTRL ((uint8_t)(0)) +#define CAN2_CTRL ((uint8_t)(1)) +#define PARAM_FULLCAN_IC(n) ((n==FULLCAN_IC0)||(n==FULLCAN_IC1)) +#define ID_11 1 +#define MAX_HW_FULLCAN_OBJ 64 +#define MAX_SW_FULLCAN_OBJ 32 + +/** + * @} + */ + +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup CAN_Private_Macros CAN Private Macros + * @{ + */ + +/* --------------------- BIT DEFINITIONS -------------------------------------- */ +/*********************************************************************//** + * Macro defines for CAN Mode Register + **********************************************************************/ +/** CAN Reset mode */ +#define CAN_MOD_RM ((uint32_t)(1)) +/** CAN Listen Only Mode */ +#define CAN_MOD_LOM ((uint32_t)(1<<1)) +/** CAN Self Test mode */ +#define CAN_MOD_STM ((uint32_t)(1<<2)) +/** CAN Transmit Priority mode */ +#define CAN_MOD_TPM ((uint32_t)(1<<3)) +/** CAN Sleep mode */ +#define CAN_MOD_SM ((uint32_t)(1<<4)) +/** CAN Receive Polarity mode */ +#define CAN_MOD_RPM ((uint32_t)(1<<5)) +/** CAN Test mode */ +#define CAN_MOD_TM ((uint32_t)(1<<7)) + +/*********************************************************************//** + * Macro defines for CAN Command Register + **********************************************************************/ +/** CAN Transmission Request */ +#define CAN_CMR_TR ((uint32_t)(1)) +/** CAN Abort Transmission */ +#define CAN_CMR_AT ((uint32_t)(1<<1)) +/** CAN Release Receive Buffer */ +#define CAN_CMR_RRB ((uint32_t)(1<<2)) +/** CAN Clear Data Overrun */ +#define CAN_CMR_CDO ((uint32_t)(1<<3)) +/** CAN Self Reception Request */ +#define CAN_CMR_SRR ((uint32_t)(1<<4)) +/** CAN Select Tx Buffer 1 */ +#define CAN_CMR_STB1 ((uint32_t)(1<<5)) +/** CAN Select Tx Buffer 2 */ +#define CAN_CMR_STB2 ((uint32_t)(1<<6)) +/** CAN Select Tx Buffer 3 */ +#define CAN_CMR_STB3 ((uint32_t)(1<<7)) + +/*********************************************************************//** + * Macro defines for CAN Global Status Register + **********************************************************************/ +/** CAN Receive Buffer Status */ +#define CAN_GSR_RBS ((uint32_t)(1)) +/** CAN Data Overrun Status */ +#define CAN_GSR_DOS ((uint32_t)(1<<1)) +/** CAN Transmit Buffer Status */ +#define CAN_GSR_TBS ((uint32_t)(1<<2)) +/** CAN Transmit Complete Status */ +#define CAN_GSR_TCS ((uint32_t)(1<<3)) +/** CAN Receive Status */ +#define CAN_GSR_RS ((uint32_t)(1<<4)) +/** CAN Transmit Status */ +#define CAN_GSR_TS ((uint32_t)(1<<5)) +/** CAN Error Status */ +#define CAN_GSR_ES ((uint32_t)(1<<6)) +/** CAN Bus Status */ +#define CAN_GSR_BS ((uint32_t)(1<<7)) +/** CAN Current value of the Rx Error Counter */ +#define CAN_GSR_RXERR(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Current value of the Tx Error Counter */ +#define CAN_GSR_TXERR(n) ((uint32_t)(n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Interrupt and Capture Register + **********************************************************************/ +/** CAN Receive Interrupt */ +#define CAN_ICR_RI ((uint32_t)(1)) +/** CAN Transmit Interrupt 1 */ +#define CAN_ICR_TI1 ((uint32_t)(1<<1)) +/** CAN Error Warning Interrupt */ +#define CAN_ICR_EI ((uint32_t)(1<<2)) +/** CAN Data Overrun Interrupt */ +#define CAN_ICR_DOI ((uint32_t)(1<<3)) +/** CAN Wake-Up Interrupt */ +#define CAN_ICR_WUI ((uint32_t)(1<<4)) +/** CAN Error Passive Interrupt */ +#define CAN_ICR_EPI ((uint32_t)(1<<5)) +/** CAN Arbitration Lost Interrupt */ +#define CAN_ICR_ALI ((uint32_t)(1<<6)) +/** CAN Bus Error Interrupt */ +#define CAN_ICR_BEI ((uint32_t)(1<<7)) +/** CAN ID Ready Interrupt */ +#define CAN_ICR_IDI ((uint32_t)(1<<8)) +/** CAN Transmit Interrupt 2 */ +#define CAN_ICR_TI2 ((uint32_t)(1<<9)) +/** CAN Transmit Interrupt 3 */ +#define CAN_ICR_TI3 ((uint32_t)(1<<10)) +/** CAN Error Code Capture */ +#define CAN_ICR_ERRBIT(n) ((uint32_t)((n&0x1F)<<16)) +/** CAN Error Direction */ +#define CAN_ICR_ERRDIR ((uint32_t)(1<<21)) +/** CAN Error Capture */ +#define CAN_ICR_ERRC(n) ((uint32_t)((n&0x3)<<22)) +/** CAN Arbitration Lost Capture */ +#define CAN_ICR_ALCBIT(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Interrupt Enable Register + **********************************************************************/ +/** CAN Receive Interrupt Enable */ +#define CAN_IER_RIE ((uint32_t)(1)) +/** CAN Transmit Interrupt Enable for buffer 1 */ +#define CAN_IER_TIE1 ((uint32_t)(1<<1)) +/** CAN Error Warning Interrupt Enable */ +#define CAN_IER_EIE ((uint32_t)(1<<2)) +/** CAN Data Overrun Interrupt Enable */ +#define CAN_IER_DOIE ((uint32_t)(1<<3)) +/** CAN Wake-Up Interrupt Enable */ +#define CAN_IER_WUIE ((uint32_t)(1<<4)) +/** CAN Error Passive Interrupt Enable */ +#define CAN_IER_EPIE ((uint32_t)(1<<5)) +/** CAN Arbitration Lost Interrupt Enable */ +#define CAN_IER_ALIE ((uint32_t)(1<<6)) +/** CAN Bus Error Interrupt Enable */ +#define CAN_IER_BEIE ((uint32_t)(1<<7)) +/** CAN ID Ready Interrupt Enable */ +#define CAN_IER_IDIE ((uint32_t)(1<<8)) +/** CAN Transmit Enable Interrupt for Buffer 2 */ +#define CAN_IER_TIE2 ((uint32_t)(1<<9)) +/** CAN Transmit Enable Interrupt for Buffer 3 */ +#define CAN_IER_TIE3 ((uint32_t)(1<<10)) + +/*********************************************************************//** + * Macro defines for CAN Bus Timing Register + **********************************************************************/ +/** CAN Baudrate Prescaler */ +#define CAN_BTR_BRP(n) ((uint32_t)(n&0x3FF)) +/** CAN Synchronization Jump Width */ +#define CAN_BTR_SJM(n) ((uint32_t)((n&0x3)<<14)) +/** CAN Time Segment 1 */ +#define CAN_BTR_TESG1(n) ((uint32_t)(n&0xF)<<16)) +/** CAN Time Segment 2 */ +#define CAN_BTR_TESG2(n) ((uint32_t)(n&0xF)<<20)) +/** CAN Sampling */ +#define CAN_BTR_SAM(n) ((uint32_t)(1<<23)) + +/*********************************************************************//** + * Macro defines for CAN Error Warning Limit Register + **********************************************************************/ +/** CAN Error Warning Limit */ +#define CAN_EWL_EWL(n) ((uint32_t)(n&0xFF)) + +/*********************************************************************//** + * Macro defines for CAN Status Register + **********************************************************************/ +/** CAN Receive Buffer Status */ +#define CAN_SR_RBS ((uint32_t)(1)) +/** CAN Data Overrun Status */ +#define CAN_SR_DOS ((uint32_t)(1<<1)) +/** CAN Transmit Buffer Status 1 */ +#define CAN_SR_TBS1 ((uint32_t)(1<<2)) +/** CAN Transmission Complete Status of Buffer 1 */ +#define CAN_SR_TCS1 ((uint32_t)(1<<3)) +/** CAN Receive Status */ +#define CAN_SR_RS ((uint32_t)(1<<4)) +/** CAN Transmit Status 1 */ +#define CAN_SR_TS1 ((uint32_t)(1<<5)) +/** CAN Error Status */ +#define CAN_SR_ES ((uint32_t)(1<<6)) +/** CAN Bus Status */ +#define CAN_SR_BS ((uint32_t)(1<<7)) +/** CAN Transmit Buffer Status 2 */ +#define CAN_SR_TBS2 ((uint32_t)(1<<10)) +/** CAN Transmission Complete Status of Buffer 2 */ +#define CAN_SR_TCS2 ((uint32_t)(1<<11)) +/** CAN Transmit Status 2 */ +#define CAN_SR_TS2 ((uint32_t)(1<<13)) +/** CAN Transmit Buffer Status 2 */ +#define CAN_SR_TBS3 ((uint32_t)(1<<18)) +/** CAN Transmission Complete Status of Buffer 2 */ +#define CAN_SR_TCS3 ((uint32_t)(1<<19)) +/** CAN Transmit Status 2 */ +#define CAN_SR_TS3 ((uint32_t)(1<<21)) + +/*********************************************************************//** + * Macro defines for CAN Receive Frame Status Register + **********************************************************************/ +/** CAN ID Index */ +#define CAN_RFS_ID_INDEX(n) ((uint32_t)(n&0x3FF)) +/** CAN Bypass */ +#define CAN_RFS_BP ((uint32_t)(1<<10)) +/** CAN Data Length Code */ +#define CAN_RFS_DLC(n) ((uint32_t)((n&0xF)<<16) +/** CAN Remote Transmission Request */ +#define CAN_RFS_RTR ((uint32_t)(1<<30)) +/** CAN control 11 bit or 29 bit Identifier */ +#define CAN_RFS_FF ((uint32_t)(1<<31)) + +/*********************************************************************//** + * Macro defines for CAN Receive Identifier Register + **********************************************************************/ +/** CAN 11 bit Identifier */ +#define CAN_RID_ID_11(n) ((uint32_t)(n&0x7FF)) +/** CAN 29 bit Identifier */ +#define CAN_RID_ID_29(n) ((uint32_t)(n&0x1FFFFFFF)) + +/*********************************************************************//** + * Macro defines for CAN Receive Data A Register + **********************************************************************/ +/** CAN Receive Data 1 */ +#define CAN_RDA_DATA1(n) ((uint32_t)(n&0xFF)) +/** CAN Receive Data 2 */ +#define CAN_RDA_DATA2(n) ((uint32_t)((n&0xFF)<<8)) +/** CAN Receive Data 3 */ +#define CAN_RDA_DATA3(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Receive Data 4 */ +#define CAN_RDA_DATA4(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Receive Data B Register + **********************************************************************/ +/** CAN Receive Data 5 */ +#define CAN_RDB_DATA5(n) ((uint32_t)(n&0xFF)) +/** CAN Receive Data 6 */ +#define CAN_RDB_DATA6(n) ((uint32_t)((n&0xFF)<<8)) +/** CAN Receive Data 7 */ +#define CAN_RDB_DATA7(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Receive Data 8 */ +#define CAN_RDB_DATA8(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Transmit Frame Information Register + **********************************************************************/ +/** CAN Priority */ +#define CAN_TFI_PRIO(n) ((uint32_t)(n&0xFF)) +/** CAN Data Length Code */ +#define CAN_TFI_DLC(n) ((uint32_t)((n&0xF)<<16)) +/** CAN Remote Frame Transmission */ +#define CAN_TFI_RTR ((uint32_t)(1<<30)) +/** CAN control 11-bit or 29-bit Identifier */ +#define CAN_TFI_FF ((uint32_t)(1<<31)) + +/*********************************************************************//** + * Macro defines for CAN Transmit Identifier Register + **********************************************************************/ +/** CAN 11-bit Identifier */ +#define CAN_TID_ID11(n) ((uint32_t)(n&0x7FF)) +/** CAN 11-bit Identifier */ +#define CAN_TID_ID29(n) ((uint32_t)(n&0x1FFFFFFF)) + +/*********************************************************************//** + * Macro defines for CAN Transmit Data A Register + **********************************************************************/ +/** CAN Transmit Data 1 */ +#define CAN_TDA_DATA1(n) ((uint32_t)(n&0xFF)) +/** CAN Transmit Data 2 */ +#define CAN_TDA_DATA2(n) ((uint32_t)((n&0xFF)<<8)) +/** CAN Transmit Data 3 */ +#define CAN_TDA_DATA3(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Transmit Data 4 */ +#define CAN_TDA_DATA4(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Transmit Data B Register + **********************************************************************/ +/** CAN Transmit Data 5 */ +#define CAN_TDA_DATA5(n) ((uint32_t)(n&0xFF)) +/** CAN Transmit Data 6 */ +#define CAN_TDA_DATA6(n) ((uint32_t)((n&0xFF)<<8)) +/** CAN Transmit Data 7 */ +#define CAN_TDA_DATA7(n) ((uint32_t)((n&0xFF)<<16)) +/** CAN Transmit Data 8 */ +#define CAN_TDA_DATA8(n) ((uint32_t)((n&0xFF)<<24)) + +/*********************************************************************//** + * Macro defines for CAN Sleep Clear Register + **********************************************************************/ +/** CAN1 Sleep mode */ +#define CAN1SLEEPCLR ((uint32_t)(1<<1)) +/** CAN2 Sleep Mode */ +#define CAN2SLEEPCLR ((uint32_t)(1<<2)) + +/*********************************************************************//** + * Macro defines for CAN Wake up Flags Register + **********************************************************************/ +/** CAN1 Sleep mode */ +#define CAN_WAKEFLAGES_CAN1WAKE ((uint32_t)(1<<1)) +/** CAN2 Sleep Mode */ +#define CAN_WAKEFLAGES_CAN2WAKE ((uint32_t)(1<<2)) + +/*********************************************************************//** + * Macro defines for Central transmit Status Register + **********************************************************************/ +/** CAN Transmit 1 */ +#define CAN_TSR_TS1 ((uint32_t)(1)) +/** CAN Transmit 2 */ +#define CAN_TSR_TS2 ((uint32_t)(1<<1)) +/** CAN Transmit Buffer Status 1 */ +#define CAN_TSR_TBS1 ((uint32_t)(1<<8)) +/** CAN Transmit Buffer Status 2 */ +#define CAN_TSR_TBS2 ((uint32_t)(1<<9)) +/** CAN Transmission Complete Status 1 */ +#define CAN_TSR_TCS1 ((uint32_t)(1<<16)) +/** CAN Transmission Complete Status 2 */ +#define CAN_TSR_TCS2 ((uint32_t)(1<<17)) + +/*********************************************************************//** + * Macro defines for Central Receive Status Register + **********************************************************************/ +/** CAN Receive Status 1 */ +#define CAN_RSR_RS1 ((uint32_t)(1)) +/** CAN Receive Status 1 */ +#define CAN_RSR_RS2 ((uint32_t)(1<<1)) +/** CAN Receive Buffer Status 1*/ +#define CAN_RSR_RB1 ((uint32_t)(1<<8)) +/** CAN Receive Buffer Status 2*/ +#define CAN_RSR_RB2 ((uint32_t)(1<<9)) +/** CAN Data Overrun Status 1 */ +#define CAN_RSR_DOS1 ((uint32_t)(1<<16)) +/** CAN Data Overrun Status 1 */ +#define CAN_RSR_DOS2 ((uint32_t)(1<<17)) + +/*********************************************************************//** + * Macro defines for Central Miscellaneous Status Register + **********************************************************************/ +/** Same CAN Error Status in CAN1GSR */ +#define CAN_MSR_E1 ((uint32_t)(1)) +/** Same CAN Error Status in CAN2GSR */ +#define CAN_MSR_E2 ((uint32_t)(1<<1)) +/** Same CAN Bus Status in CAN1GSR */ +#define CAN_MSR_BS1 ((uint32_t)(1<<8)) +/** Same CAN Bus Status in CAN2GSR */ +#define CAN_MSR_BS2 ((uint32_t)(1<<9)) + +/*********************************************************************//** + * Macro defines for Acceptance Filter Mode Register + **********************************************************************/ +/** CAN Acceptance Filter Off mode */ +#define CAN_AFMR_AccOff ((uint32_t)(1)) +/** CAN Acceptance File Bypass mode */ +#define CAN_AFMR_AccBP ((uint32_t)(1<<1)) +/** FullCAN Mode Enhancements */ +#define CAN_AFMR_eFCAN ((uint32_t)(1<<2)) + +/*********************************************************************//** + * Macro defines for Standard Frame Individual Start Address Register + **********************************************************************/ +/** The start address of the table of individual Standard Identifier */ +#define CAN_STT_sa(n) ((uint32_t)((n&1FF)<<2)) + +/*********************************************************************//** + * Macro defines for Standard Frame Group Start Address Register + **********************************************************************/ +/** The start address of the table of grouped Standard Identifier */ +#define CAN_SFF_GRP_sa(n) ((uint32_t)((n&3FF)<<2)) + +/*********************************************************************//** + * Macro defines for Extended Frame Start Address Register + **********************************************************************/ +/** The start address of the table of individual Extended Identifier */ +#define CAN_EFF_sa(n) ((uint32_t)((n&1FF)<<2)) + +/*********************************************************************//** + * Macro defines for Extended Frame Group Start Address Register + **********************************************************************/ +/** The start address of the table of grouped Extended Identifier */ +#define CAN_Eff_GRP_sa(n) ((uint32_t)((n&3FF)<<2)) + +/*********************************************************************//** + * Macro defines for End Of AF Table Register + **********************************************************************/ +/** The End of Table of AF LookUp Table */ +#define CAN_EndofTable(n) ((uint32_t)((n&3FF)<<2)) + +/*********************************************************************//** + * Macro defines for LUT Error Address Register + **********************************************************************/ +/** CAN Look-Up Table Error Address */ +#define CAN_LUTerrAd(n) ((uint32_t)((n&1FF)<<2)) + +/*********************************************************************//** + * Macro defines for LUT Error Register + **********************************************************************/ +/** CAN Look-Up Table Error */ +#define CAN_LUTerr ((uint32_t)(1)) + +/*********************************************************************//** + * Macro defines for Global FullCANInterrupt Enable Register + **********************************************************************/ +/** Global FullCANInterrupt Enable */ +#define CAN_FCANIE ((uint32_t)(1)) + +/*********************************************************************//** + * Macro defines for FullCAN Interrupt and Capture Register 0 + **********************************************************************/ +/** FullCAN Interrupt and Capture (0-31)*/ +#define CAN_FCANIC0_IntPnd(n) ((uint32_t)(1<=0)&&(data <= 0xFFFFFFFF)) + +/** Macro to check frequency value */ +#define PRAM_I2S_FREQ(freq) ((freq>=16000)&&(freq <= 96000)) + +/** Macro to check Frame Identifier */ +#define PARAM_ID_11(n) ((n>>11)==0) /*-- 11 bit --*/ +#define PARAM_ID_29(n) ((n>>29)==0) /*-- 29 bit --*/ + +/** Macro to check DLC value */ +#define PARAM_DLC(n) ((n>>4)==0) /*-- 4 bit --*/ +/** Macro to check ID format type */ +#define PARAM_ID_FORMAT(n) ((n==STD_ID_FORMAT)||(n==EXT_ID_FORMAT)) + +/** Macro to check Group identifier */ +#define PARAM_GRP_ID(x, y) ((x<=y)) + +/** Macro to check Frame type */ +#define PARAM_FRAME_TYPE(n) ((n==DATA_FRAME)||(n==REMOTE_FRAME)) + +/** Macro to check Control/Central Status type parameter */ +#define PARAM_CTRL_STS_TYPE(n) ((n==CANCTRL_GLOBAL_STS)||(n==CANCTRL_INT_CAP) \ +||(n==CANCTRL_ERR_WRN)||(n==CANCTRL_STS)) + +/** Macro to check CR status type */ +#define PARAM_CR_STS_TYPE(n) ((n==CANCR_TX_STS)||(n==CANCR_RX_STS) \ +||(n==CANCR_MS)) +/** Macro to check AF Mode type parameter */ +#define PARAM_AFMODE_TYPE(n) ((n==CAN_Normal)||(n==CAN_AccOff) \ +||(n==CAN_AccBP)||(n==CAN_eFCAN)) + +/** Macro to check Operation Mode */ +#define PARAM_MODE_TYPE(n) ((n==CAN_OPERATING_MODE)||(n==CAN_RESET_MODE) \ +||(n==CAN_LISTENONLY_MODE)||(n==CAN_SELFTEST_MODE) \ +||(n==CAN_TXPRIORITY_MODE)||(n==CAN_SLEEP_MODE) \ +||(n==CAN_RXPOLARITY_MODE)||(n==CAN_TEST_MODE)) + +/** Macro define for struct AF_Section parameter */ +#define PARAM_CTRL(n) ((n==CAN1_CTRL)|(n==CAN2_CTRL)) + +/** Macro define for struct AF_Section parameter */ +#define PARAM_MSG_DISABLE(n) ((n==MSG_ENABLE)|(n==MSG_DISABLE)) + +/**Macro to check Interrupt Type parameter */ +#define PARAM_INT_EN_TYPE(n) ((n==CANINT_RIE)||(n==CANINT_TIE1) \ +||(n==CANINT_EIE)||(n==CANINT_DOIE) \ +||(n==CANINT_WUIE)||(n==CANINT_EPIE) \ +||(n==CANINT_ALIE)||(n==CANINT_BEIE) \ +||(n==CANINT_IDIE)||(n==CANINT_TIE2) \ +||(n==CANINT_TIE3)||(n==CANINT_FCE)) + +/** Macro to check AFLUT Entry type */ +#define PARAM_AFLUT_ENTRY_TYPE(n) ((n==FULLCAN_ENTRY)||(n==EXPLICIT_STANDARD_ENTRY)\ +||(n==GROUP_STANDARD_ENTRY)||(n==EXPLICIT_EXTEND_ENTRY) \ +||(n==GROUP_EXTEND_ENTRY)) + +/** Macro to check position */ +#define PARAM_POSITION(n) (n<512) + +/** + * @} + */ + +/* Public Types --------------------------------------------------------------- */ +/** @defgroup CAN_Public_Types CAN Public Types + * @{ + */ + +/** CAN configuration structure */ +/*********************************************************************** + * CAN device configuration commands (IOCTL commands and arguments) + **********************************************************************/ +/** + * @brief CAN ID format definition + */ +typedef enum { + STD_ID_FORMAT = 0, /**< Use standard ID format (11 bit ID) */ + EXT_ID_FORMAT = 1 /**< Use extended ID format (29 bit ID) */ +} CAN_ID_FORMAT_Type; + +/** + * @brief AFLUT Entry type definition + */ +typedef enum { + FULLCAN_ENTRY = 0, + EXPLICIT_STANDARD_ENTRY, + GROUP_STANDARD_ENTRY, + EXPLICIT_EXTEND_ENTRY, + GROUP_EXTEND_ENTRY +} AFLUT_ENTRY_Type; + +/** + * @brief Symbolic names for type of CAN message + */ +typedef enum { + DATA_FRAME = 0, /**< Data frame */ + REMOTE_FRAME = 1 /**< Remote frame */ +} CAN_FRAME_Type; + +/** + * @brief CAN Control status definition + */ +typedef enum { + CANCTRL_GLOBAL_STS = 0, /**< CAN Global Status */ + CANCTRL_INT_CAP, /**< CAN Interrupt and Capture */ + CANCTRL_ERR_WRN, /**< CAN Error Warning Limit */ + CANCTRL_STS /**< CAN Control Status */ +} CAN_CTRL_STS_Type; + +/** + * @brief Central CAN status type definition + */ +typedef enum { + CANCR_TX_STS = 0, /**< Central CAN Tx Status */ + CANCR_RX_STS, /**< Central CAN Rx Status */ + CANCR_MS /**< Central CAN Miscellaneous Status */ +} CAN_CR_STS_Type; + +/** + * @brief FullCAN Interrupt Capture type definition + */ +typedef enum{ + FULLCAN_IC0, /**< FullCAN Interrupt and Capture 0 */ + FULLCAN_IC1 /**< FullCAN Interrupt and Capture 1 */ +}FullCAN_IC_Type; + +/** + * @brief CAN interrupt enable type definition + */ +typedef enum { + CANINT_RIE = 0, /**< CAN Receiver Interrupt Enable */ + CANINT_TIE1, /**< CAN Transmit Interrupt Enable */ + CANINT_EIE, /**< CAN Error Warning Interrupt Enable */ + CANINT_DOIE, /**< CAN Data Overrun Interrupt Enable */ + CANINT_WUIE, /**< CAN Wake-Up Interrupt Enable */ + CANINT_EPIE, /**< CAN Error Passive Interrupt Enable */ + CANINT_ALIE, /**< CAN Arbitration Lost Interrupt Enable */ + CANINT_BEIE, /**< CAN Bus Error Inter rupt Enable */ + CANINT_IDIE, /**< CAN ID Ready Interrupt Enable */ + CANINT_TIE2, /**< CAN Transmit Interrupt Enable for Buffer2 */ + CANINT_TIE3, /**< CAN Transmit Interrupt Enable for Buffer3 */ + CANINT_FCE /**< FullCAN Interrupt Enable */ +} CAN_INT_EN_Type; + +/** + * @brief Acceptance Filter Mode type definition + */ +typedef enum { + CAN_Normal = 0, /**< Normal Mode */ + CAN_AccOff, /**< Acceptance Filter Off Mode */ + CAN_AccBP, /**< Acceptance Fileter Bypass Mode */ + CAN_eFCAN /**< FullCAN Mode Enhancement */ +} CAN_AFMODE_Type; + +/** + * @brief CAN Mode Type definition + */ +typedef enum { + CAN_OPERATING_MODE = 0, /**< Operating Mode */ + CAN_RESET_MODE, /**< Reset Mode */ + CAN_LISTENONLY_MODE, /**< Listen Only Mode */ + CAN_SELFTEST_MODE, /**< Seft Test Mode */ + CAN_TXPRIORITY_MODE, /**< Transmit Priority Mode */ + CAN_SLEEP_MODE, /**< Sleep Mode */ + CAN_RXPOLARITY_MODE, /**< Receive Polarity Mode */ + CAN_TEST_MODE /**< Test Mode */ +} CAN_MODE_Type; + +/** + * @brief Error values that functions can return + */ +typedef enum { + CAN_OK = 1, /**< No error */ + CAN_OBJECTS_FULL_ERROR, /**< No more rx or tx objects available */ + CAN_FULL_OBJ_NOT_RCV, /**< Full CAN object not received */ + CAN_NO_RECEIVE_DATA, /**< No have receive data available */ + CAN_AF_ENTRY_ERROR, /**< Entry load in AFLUT is unvalid */ + CAN_CONFLICT_ID_ERROR, /**< Conflict ID occur */ + CAN_ENTRY_NOT_EXIT_ERROR /**< Entry remove outo AFLUT is not exit */ +} CAN_ERROR; + +/** + * @brief Pin Configuration structure + */ +typedef struct { + uint8_t RD; /**< Serial Inputs, from CAN transceivers, should be: + ** For CAN1: + - CAN_RD1_P0_0: RD pin is on P0.0 + - CAN_RD1_P0_21 : RD pin is on P0.21 + ** For CAN2: + - CAN_RD2_P0_4: RD pin is on P0.4 + - CAN_RD2_P2_7: RD pin is on P2.7 + */ + uint8_t TD; /**< Serial Outputs, To CAN transceivers, should be: + ** For CAN1: + - CAN_TD1_P0_1: TD pin is on P0.1 + - CAN_TD1_P0_22: TD pin is on P0.22 + ** For CAN2: + - CAN_TD2_P0_5: TD pin is on P0.5 + - CAN_TD2_P2_8: TD pin is on P2.8 + */ +} CAN_PinCFG_Type; + +/** + * @brief CAN message object structure + */ +typedef struct { + uint32_t id; /**< 29 bit identifier, it depend on "format" value + - if format = STD_ID_FORMAT, id should be 11 bit identifier + - if format = EXT_ID_FORMAT, id should be 29 bit identifier + */ + uint8_t dataA[4]; /**< Data field A */ + uint8_t dataB[4]; /**< Data field B */ + uint8_t len; /**< Length of data field in bytes, should be: + - 0000b-0111b: 0-7 bytes + - 1xxxb: 8 bytes + */ + uint8_t format; /**< Identifier Format, should be: + - STD_ID_FORMAT: Standard ID - 11 bit format + - EXT_ID_FORMAT: Extended ID - 29 bit format + */ + uint8_t type; /**< Remote Frame transmission, should be: + - DATA_FRAME: the number of data bytes called out by the DLC + field are send from the CANxTDA and CANxTDB registers + - REMOTE_FRAME: Remote Frame is sent + */ +} CAN_MSG_Type; + +/** + * @brief FullCAN Entry structure + */ +typedef struct { + uint8_t controller; /**< CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t disable; /**< Disable bit, should be: + - MSG_ENABLE: disable bit = 0 + - MSG_DISABLE: disable bit = 1 + */ + uint16_t id_11; /**< Standard ID, should be 11-bit value */ +} FullCAN_Entry; + +/** + * @brief Standard ID Frame Format Entry structure + */ +typedef struct { + uint8_t controller; /**< CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t disable; /**< Disable bit, should be: + - MSG_ENABLE: disable bit = 0 + - MSG_DISABLE: disable bit = 1 + */ + uint16_t id_11; /**< Standard ID, should be 11-bit value */ +} SFF_Entry; + +/** + * @brief Group of Standard ID Frame Format Entry structure + */ +typedef struct { + uint8_t controller1; /**< First CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t disable1; /**< First Disable bit, should be: + - MSG_ENABLE: disable bit = 0) + - MSG_DISABLE: disable bit = 1 + */ + uint16_t lowerID; /**< ID lower bound, should be 11-bit value */ + uint8_t controller2; /**< Second CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t disable2; /**< Second Disable bit, should be: + - MSG_ENABLE: disable bit = 0 + - MSG_DISABLE: disable bit = 1 + */ + uint16_t upperID; /**< ID upper bound, should be 11-bit value and + equal or greater than lowerID + */ +} SFF_GPR_Entry; + +/** + * @brief Extended ID Frame Format Entry structure + */ +typedef struct { + uint8_t controller; /**< CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint32_t ID_29; /**< Extend ID, shoud be 29-bit value */ +} EFF_Entry; + + +/** + * @brief Group of Extended ID Frame Format Entry structure + */ +typedef struct { + uint8_t controller1; /**< First CAN Controller, should be: + - CAN1_CTRL: CAN1 Controller + - CAN2_CTRL: CAN2 Controller + */ + uint8_t controller2; /**< Second Disable bit, should be: + - MSG_ENABLE: disable bit = 0(default) + - MSG_DISABLE: disable bit = 1 + */ + uint32_t lowerEID; /**< Extended ID lower bound, should be 29-bit value */ + uint32_t upperEID; /**< Extended ID upper bound, should be 29-bit value */ +} EFF_GPR_Entry; + + +/** + * @brief Acceptance Filter Section Table structure + */ +typedef struct { + FullCAN_Entry* FullCAN_Sec; /**< The pointer point to FullCAN_Entry */ + uint8_t FC_NumEntry; /**< FullCAN Entry Number */ + SFF_Entry* SFF_Sec; /**< The pointer point to SFF_Entry */ + uint8_t SFF_NumEntry; /**< Standard ID Entry Number */ + SFF_GPR_Entry* SFF_GPR_Sec; /**< The pointer point to SFF_GPR_Entry */ + uint8_t SFF_GPR_NumEntry; /**< Group Standard ID Entry Number */ + EFF_Entry* EFF_Sec; /**< The pointer point to EFF_Entry */ + uint8_t EFF_NumEntry; /**< Extended ID Entry Number */ + EFF_GPR_Entry* EFF_GPR_Sec; /**< The pointer point to EFF_GPR_Entry */ + uint8_t EFF_GPR_NumEntry; /**< Group Extended ID Entry Number */ +} AF_SectionDef; + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup CAN_Public_Functions CAN Public Functions + * @{ + */ + +/* Init/DeInit CAN peripheral -----------*/ +void CAN_Init(LPC_CAN_TypeDef *CANx, uint32_t baudrate); +void CAN_DeInit(LPC_CAN_TypeDef *CANx); + +/* CAN messages functions ---------------*/ +Status CAN_SendMsg(LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg); +Status CAN_ReceiveMsg(LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg); +CAN_ERROR FCAN_ReadObj(LPC_CANAF_TypeDef* CANAFx, CAN_MSG_Type *CAN_Msg); + +/* CAN configure functions ---------------*/ +void CAN_ModeConfig(LPC_CAN_TypeDef* CANx, CAN_MODE_Type mode, + FunctionalState NewState); +void CAN_SetAFMode(LPC_CANAF_TypeDef* CANAFx, CAN_AFMODE_Type AFmode); +void CAN_SetCommand(LPC_CAN_TypeDef* CANx, uint32_t CMRType); + +/* AFLUT functions ---------------------- */ +CAN_ERROR CAN_SetupAFLUT(LPC_CANAF_TypeDef* CANAFx, AF_SectionDef* AFSection); +CAN_ERROR CAN_LoadFullCANEntry(LPC_CAN_TypeDef* CANx, uint16_t ID); +CAN_ERROR CAN_LoadExplicitEntry(LPC_CAN_TypeDef* CANx, uint32_t ID, + CAN_ID_FORMAT_Type format); +CAN_ERROR CAN_LoadGroupEntry(LPC_CAN_TypeDef* CANx, uint32_t lowerID, + uint32_t upperID, CAN_ID_FORMAT_Type format); +CAN_ERROR CAN_RemoveEntry(AFLUT_ENTRY_Type EntryType, uint16_t position); + +/* CAN interrupt functions -----------------*/ +void CAN_IRQCmd(LPC_CAN_TypeDef* CANx, CAN_INT_EN_Type arg, FunctionalState NewState); +uint32_t CAN_IntGetStatus(LPC_CAN_TypeDef* CANx); + +/* CAN get status functions ----------------*/ +IntStatus CAN_FullCANIntGetStatus (LPC_CANAF_TypeDef* CANAFx); +uint32_t CAN_FullCANPendGetStatus (LPC_CANAF_TypeDef* CANAFx, FullCAN_IC_Type type); +uint32_t CAN_GetCTRLStatus(LPC_CAN_TypeDef* CANx, CAN_CTRL_STS_Type arg); +uint32_t CAN_GetCRStatus(LPC_CANCR_TypeDef* CANCRx, CAN_CR_STS_Type arg); + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LPC17XX_CAN_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_clkpwr.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_clkpwr.h new file mode 100644 index 0000000000..a33ea60f2d --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_clkpwr.h @@ -0,0 +1,406 @@ +/********************************************************************** +* $Id$ lpc17xx_clkpwr.h 2010-05-21 +*//** +* @file lpc17xx_clkpwr.h +* @brief Contains all macro definitions and function prototypes +* support for Clock and Power Control firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup CLKPWR CLKPWR (Clock Power) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_CLKPWR_H_ +#define LPC17XX_CLKPWR_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Public Macros -------------------------------------------------------------- */ +/** @defgroup CLKPWR_Public_Macros CLKPWR Public Macros + * @{ + */ + +/********************************************************************** + * Peripheral Clock Selection Definitions + **********************************************************************/ +/** Peripheral clock divider bit position for WDT */ +#define CLKPWR_PCLKSEL_WDT ((uint32_t)(0)) +/** Peripheral clock divider bit position for TIMER0 */ +#define CLKPWR_PCLKSEL_TIMER0 ((uint32_t)(2)) +/** Peripheral clock divider bit position for TIMER1 */ +#define CLKPWR_PCLKSEL_TIMER1 ((uint32_t)(4)) +/** Peripheral clock divider bit position for UART0 */ +#define CLKPWR_PCLKSEL_UART0 ((uint32_t)(6)) +/** Peripheral clock divider bit position for UART1 */ +#define CLKPWR_PCLKSEL_UART1 ((uint32_t)(8)) +/** Peripheral clock divider bit position for PWM1 */ +#define CLKPWR_PCLKSEL_PWM1 ((uint32_t)(12)) +/** Peripheral clock divider bit position for I2C0 */ +#define CLKPWR_PCLKSEL_I2C0 ((uint32_t)(14)) +/** Peripheral clock divider bit position for SPI */ +#define CLKPWR_PCLKSEL_SPI ((uint32_t)(16)) +/** Peripheral clock divider bit position for SSP1 */ +#define CLKPWR_PCLKSEL_SSP1 ((uint32_t)(20)) +/** Peripheral clock divider bit position for DAC */ +#define CLKPWR_PCLKSEL_DAC ((uint32_t)(22)) +/** Peripheral clock divider bit position for ADC */ +#define CLKPWR_PCLKSEL_ADC ((uint32_t)(24)) +/** Peripheral clock divider bit position for CAN1 */ +#define CLKPWR_PCLKSEL_CAN1 ((uint32_t)(26)) +/** Peripheral clock divider bit position for CAN2 */ +#define CLKPWR_PCLKSEL_CAN2 ((uint32_t)(28)) +/** Peripheral clock divider bit position for ACF */ +#define CLKPWR_PCLKSEL_ACF ((uint32_t)(30)) +/** Peripheral clock divider bit position for QEI */ +#define CLKPWR_PCLKSEL_QEI ((uint32_t)(32)) +/** Peripheral clock divider bit position for PCB */ +#define CLKPWR_PCLKSEL_PCB ((uint32_t)(36)) +/** Peripheral clock divider bit position for I2C1 */ +#define CLKPWR_PCLKSEL_I2C1 ((uint32_t)(38)) +/** Peripheral clock divider bit position for SSP0 */ +#define CLKPWR_PCLKSEL_SSP0 ((uint32_t)(42)) +/** Peripheral clock divider bit position for TIMER2 */ +#define CLKPWR_PCLKSEL_TIMER2 ((uint32_t)(44)) +/** Peripheral clock divider bit position for TIMER3 */ +#define CLKPWR_PCLKSEL_TIMER3 ((uint32_t)(46)) +/** Peripheral clock divider bit position for UART2 */ +#define CLKPWR_PCLKSEL_UART2 ((uint32_t)(48)) +/** Peripheral clock divider bit position for UART3 */ +#define CLKPWR_PCLKSEL_UART3 ((uint32_t)(50)) +/** Peripheral clock divider bit position for I2C2 */ +#define CLKPWR_PCLKSEL_I2C2 ((uint32_t)(52)) +/** Peripheral clock divider bit position for I2S */ +#define CLKPWR_PCLKSEL_I2S ((uint32_t)(54)) +/** Peripheral clock divider bit position for RIT */ +#define CLKPWR_PCLKSEL_RIT ((uint32_t)(58)) +/** Peripheral clock divider bit position for SYSCON */ +#define CLKPWR_PCLKSEL_SYSCON ((uint32_t)(60)) +/** Peripheral clock divider bit position for MC */ +#define CLKPWR_PCLKSEL_MC ((uint32_t)(62)) + +/** Macro for Peripheral Clock Selection register bit values + * Note: When CCLK_DIV_8, Peripheral�s clock is selected to + * PCLK_xyz = CCLK/8 except for CAN1, CAN2, and CAN filtering + * when �11�selects PCLK_xyz = CCLK/6 */ +/* Peripheral clock divider is set to 4 from CCLK */ +#define CLKPWR_PCLKSEL_CCLK_DIV_4 ((uint32_t)(0)) +/** Peripheral clock divider is the same with CCLK */ +#define CLKPWR_PCLKSEL_CCLK_DIV_1 ((uint32_t)(1)) +/** Peripheral clock divider is set to 2 from CCLK */ +#define CLKPWR_PCLKSEL_CCLK_DIV_2 ((uint32_t)(2)) + + +/******************************************************************** +* Power Control for Peripherals Definitions +**********************************************************************/ +/** Timer/Counter 0 power/clock control bit */ +#define CLKPWR_PCONP_PCTIM0 ((uint32_t)(1<<1)) +/* Timer/Counter 1 power/clock control bit */ +#define CLKPWR_PCONP_PCTIM1 ((uint32_t)(1<<2)) +/** UART0 power/clock control bit */ +#define CLKPWR_PCONP_PCUART0 ((uint32_t)(1<<3)) +/** UART1 power/clock control bit */ +#define CLKPWR_PCONP_PCUART1 ((uint32_t)(1<<4)) +/** PWM1 power/clock control bit */ +#define CLKPWR_PCONP_PCPWM1 ((uint32_t)(1<<6)) +/** The I2C0 interface power/clock control bit */ +#define CLKPWR_PCONP_PCI2C0 ((uint32_t)(1<<7)) +/** The SPI interface power/clock control bit */ +#define CLKPWR_PCONP_PCSPI ((uint32_t)(1<<8)) +/** The RTC power/clock control bit */ +#define CLKPWR_PCONP_PCRTC ((uint32_t)(1<<9)) +/** The SSP1 interface power/clock control bit */ +#define CLKPWR_PCONP_PCSSP1 ((uint32_t)(1<<10)) +/** A/D converter 0 (ADC0) power/clock control bit */ +#define CLKPWR_PCONP_PCAD ((uint32_t)(1<<12)) +/** CAN Controller 1 power/clock control bit */ +#define CLKPWR_PCONP_PCAN1 ((uint32_t)(1<<13)) +/** CAN Controller 2 power/clock control bit */ +#define CLKPWR_PCONP_PCAN2 ((uint32_t)(1<<14)) +/** GPIO power/clock control bit */ +#define CLKPWR_PCONP_PCGPIO ((uint32_t)(1<<15)) +/** Repetitive Interrupt Timer power/clock control bit */ +#define CLKPWR_PCONP_PCRIT ((uint32_t)(1<<16)) +/** Motor Control PWM */ +#define CLKPWR_PCONP_PCMC ((uint32_t)(1<<17)) +/** Quadrature Encoder Interface power/clock control bit */ +#define CLKPWR_PCONP_PCQEI ((uint32_t)(1<<18)) +/** The I2C1 interface power/clock control bit */ +#define CLKPWR_PCONP_PCI2C1 ((uint32_t)(1<<19)) +/** The SSP0 interface power/clock control bit */ +#define CLKPWR_PCONP_PCSSP0 ((uint32_t)(1<<21)) +/** Timer 2 power/clock control bit */ +#define CLKPWR_PCONP_PCTIM2 ((uint32_t)(1<<22)) +/** Timer 3 power/clock control bit */ +#define CLKPWR_PCONP_PCTIM3 ((uint32_t)(1<<23)) +/** UART 2 power/clock control bit */ +#define CLKPWR_PCONP_PCUART2 ((uint32_t)(1<<24)) +/** UART 3 power/clock control bit */ +#define CLKPWR_PCONP_PCUART3 ((uint32_t)(1<<25)) +/** I2C interface 2 power/clock control bit */ +#define CLKPWR_PCONP_PCI2C2 ((uint32_t)(1<<26)) +/** I2S interface power/clock control bit*/ +#define CLKPWR_PCONP_PCI2S ((uint32_t)(1<<27)) +/** GP DMA function power/clock control bit*/ +#define CLKPWR_PCONP_PCGPDMA ((uint32_t)(1<<29)) +/** Ethernet block power/clock control bit*/ +#define CLKPWR_PCONP_PCENET ((uint32_t)(1<<30)) +/** USB interface power/clock control bit*/ +#define CLKPWR_PCONP_PCUSB ((uint32_t)(1<<31)) + + +/** + * @} + */ +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup CLKPWR_Private_Macros CLKPWR Private Macros + * @{ + */ + +/* --------------------- BIT DEFINITIONS -------------------------------------- */ +/*********************************************************************//** + * Macro defines for Clock Source Select Register + **********************************************************************/ +/** Internal RC oscillator */ +#define CLKPWR_CLKSRCSEL_CLKSRC_IRC ((uint32_t)(0x00)) +/** Main oscillator */ +#define CLKPWR_CLKSRCSEL_CLKSRC_MAINOSC ((uint32_t)(0x01)) +/** RTC oscillator */ +#define CLKPWR_CLKSRCSEL_CLKSRC_RTC ((uint32_t)(0x02)) +/** Clock source selection bit mask */ +#define CLKPWR_CLKSRCSEL_BITMASK ((uint32_t)(0x03)) + +/*********************************************************************//** + * Macro defines for Clock Output Configuration Register + **********************************************************************/ +/* Clock Output Configuration register definition */ +/** Selects the CPU clock as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_CPU ((uint32_t)(0x00)) +/** Selects the main oscillator as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_MAINOSC ((uint32_t)(0x01)) +/** Selects the Internal RC oscillator as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_RC ((uint32_t)(0x02)) +/** Selects the USB clock as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_USB ((uint32_t)(0x03)) +/** Selects the RTC oscillator as the CLKOUT source */ +#define CLKPWR_CLKOUTCFG_CLKOUTSEL_RTC ((uint32_t)(0x04)) +/** Integer value to divide the output clock by, minus one */ +#define CLKPWR_CLKOUTCFG_CLKOUTDIV(n) ((uint32_t)((n&0x0F)<<4)) +/** CLKOUT enable control */ +#define CLKPWR_CLKOUTCFG_CLKOUT_EN ((uint32_t)(1<<8)) +/** CLKOUT activity indication */ +#define CLKPWR_CLKOUTCFG_CLKOUT_ACT ((uint32_t)(1<<9)) +/** Clock source selection bit mask */ +#define CLKPWR_CLKOUTCFG_BITMASK ((uint32_t)(0x3FF)) + +/*********************************************************************//** + * Macro defines for PPL0 Control Register + **********************************************************************/ +/** PLL 0 control enable */ +#define CLKPWR_PLL0CON_ENABLE ((uint32_t)(0x01)) +/** PLL 0 control connect */ +#define CLKPWR_PLL0CON_CONNECT ((uint32_t)(0x02)) +/** PLL 0 control bit mask */ +#define CLKPWR_PLL0CON_BITMASK ((uint32_t)(0x03)) + +/*********************************************************************//** + * Macro defines for PPL0 Configuration Register + **********************************************************************/ +/** PLL 0 Configuration MSEL field */ +#define CLKPWR_PLL0CFG_MSEL(n) ((uint32_t)(n&0x7FFF)) +/** PLL 0 Configuration NSEL field */ +#define CLKPWR_PLL0CFG_NSEL(n) ((uint32_t)((n<<16)&0xFF0000)) +/** PLL 0 Configuration bit mask */ +#define CLKPWR_PLL0CFG_BITMASK ((uint32_t)(0xFF7FFF)) + + +/*********************************************************************//** + * Macro defines for PPL0 Status Register + **********************************************************************/ +/** PLL 0 MSEL value */ +#define CLKPWR_PLL0STAT_MSEL(n) ((uint32_t)(n&0x7FFF)) +/** PLL NSEL get value */ +#define CLKPWR_PLL0STAT_NSEL(n) ((uint32_t)((n>>16)&0xFF)) +/** PLL status enable bit */ +#define CLKPWR_PLL0STAT_PLLE ((uint32_t)(1<<24)) +/** PLL status Connect bit */ +#define CLKPWR_PLL0STAT_PLLC ((uint32_t)(1<<25)) +/** PLL status lock */ +#define CLKPWR_PLL0STAT_PLOCK ((uint32_t)(1<<26)) + +/*********************************************************************//** + * Macro defines for PPL0 Feed Register + **********************************************************************/ +/** PLL0 Feed bit mask */ +#define CLKPWR_PLL0FEED_BITMASK ((uint32_t)0xFF) + +/*********************************************************************//** + * Macro defines for PLL1 Control Register + **********************************************************************/ +/** USB PLL control enable */ +#define CLKPWR_PLL1CON_ENABLE ((uint32_t)(0x01)) +/** USB PLL control connect */ +#define CLKPWR_PLL1CON_CONNECT ((uint32_t)(0x02)) +/** USB PLL control bit mask */ +#define CLKPWR_PLL1CON_BITMASK ((uint32_t)(0x03)) + +/*********************************************************************//** + * Macro defines for PLL1 Configuration Register + **********************************************************************/ +/** USB PLL MSEL set value */ +#define CLKPWR_PLL1CFG_MSEL(n) ((uint32_t)(n&0x1F)) +/** USB PLL PSEL set value */ +#define CLKPWR_PLL1CFG_PSEL(n) ((uint32_t)((n&0x03)<<5)) +/** USB PLL configuration bit mask */ +#define CLKPWR_PLL1CFG_BITMASK ((uint32_t)(0x7F)) + +/*********************************************************************//** + * Macro defines for PLL1 Status Register + **********************************************************************/ +/** USB PLL MSEL get value */ +#define CLKPWR_PLL1STAT_MSEL(n) ((uint32_t)(n&0x1F)) +/** USB PLL PSEL get value */ +#define CLKPWR_PLL1STAT_PSEL(n) ((uint32_t)((n>>5)&0x03)) +/** USB PLL status enable bit */ +#define CLKPWR_PLL1STAT_PLLE ((uint32_t)(1<<8)) +/** USB PLL status Connect bit */ +#define CLKPWR_PLL1STAT_PLLC ((uint32_t)(1<<9)) +/** USB PLL status lock */ +#define CLKPWR_PLL1STAT_PLOCK ((uint32_t)(1<<10)) + +/*********************************************************************//** + * Macro defines for PLL1 Feed Register + **********************************************************************/ +/** PLL1 Feed bit mask */ +#define CLKPWR_PLL1FEED_BITMASK ((uint32_t)0xFF) + +/*********************************************************************//** + * Macro defines for CPU Clock Configuration Register + **********************************************************************/ +/** CPU Clock configuration bit mask */ +#define CLKPWR_CCLKCFG_BITMASK ((uint32_t)(0xFF)) + +/*********************************************************************//** + * Macro defines for USB Clock Configuration Register + **********************************************************************/ +/** USB Clock Configuration bit mask */ +#define CLKPWR_USBCLKCFG_BITMASK ((uint32_t)(0x0F)) + +/*********************************************************************//** + * Macro defines for IRC Trim Register + **********************************************************************/ +/** IRC Trim bit mask */ +#define CLKPWR_IRCTRIM_BITMASK ((uint32_t)(0x0F)) + +/*********************************************************************//** + * Macro defines for Peripheral Clock Selection Register 0 and 1 + **********************************************************************/ +/** Peripheral Clock Selection 0 mask bit */ +#define CLKPWR_PCLKSEL0_BITMASK ((uint32_t)(0xFFF3F3FF)) +/** Peripheral Clock Selection 1 mask bit */ +#define CLKPWR_PCLKSEL1_BITMASK ((uint32_t)(0xFCF3F0F3)) +/** Macro to set peripheral clock of each type + * p: position of two bits that hold divider of peripheral clock + * n: value of divider of peripheral clock to be set */ +#define CLKPWR_PCLKSEL_SET(p,n) _SBF(p,n) +/** Macro to mask peripheral clock of each type */ +#define CLKPWR_PCLKSEL_BITMASK(p) _SBF(p,0x03) +/** Macro to get peripheral clock of each type */ +#define CLKPWR_PCLKSEL_GET(p, n) ((uint32_t)((n>>p)&0x03)) + +/*********************************************************************//** + * Macro defines for Power Mode Control Register + **********************************************************************/ +/** Power mode control bit 0 */ +#define CLKPWR_PCON_PM0 ((uint32_t)(1<<0)) +/** Power mode control bit 1 */ +#define CLKPWR_PCON_PM1 ((uint32_t)(1<<1)) +/** Brown-Out Reduced Power Mode */ +#define CLKPWR_PCON_BODPDM ((uint32_t)(1<<2)) +/** Brown-Out Global Disable */ +#define CLKPWR_PCON_BOGD ((uint32_t)(1<<3)) +/** Brown Out Reset Disable */ +#define CLKPWR_PCON_BORD ((uint32_t)(1<<4)) +/** Sleep Mode entry flag */ +#define CLKPWR_PCON_SMFLAG ((uint32_t)(1<<8)) +/** Deep Sleep entry flag */ +#define CLKPWR_PCON_DSFLAG ((uint32_t)(1<<9)) +/** Power-down entry flag */ +#define CLKPWR_PCON_PDFLAG ((uint32_t)(1<<10)) +/** Deep Power-down entry flag */ +#define CLKPWR_PCON_DPDFLAG ((uint32_t)(1<<11)) + +/*********************************************************************//** + * Macro defines for Power Control for Peripheral Register + **********************************************************************/ +/** Power Control for Peripherals bit mask */ +#define CLKPWR_PCONP_BITMASK 0xEFEFF7DE + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup CLKPWR_Public_Functions CLKPWR Public Functions + * @{ + */ + +void CLKPWR_SetPCLKDiv (uint32_t ClkType, uint32_t DivVal); +uint32_t CLKPWR_GetPCLKSEL (uint32_t ClkType); +uint32_t CLKPWR_GetPCLK (uint32_t ClkType); +void CLKPWR_ConfigPPWR (uint32_t PPType, FunctionalState NewState); +void CLKPWR_Sleep(void); +void CLKPWR_DeepSleep(void); +void CLKPWR_PowerDown(void); +void CLKPWR_DeepPowerDown(void); + +/** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LPC17XX_CLKPWR_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_dac.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_dac.h new file mode 100644 index 0000000000..da8776f511 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_dac.h @@ -0,0 +1,154 @@ +/********************************************************************** +* $Id$ lpc17xx_dac.h 2010-05-21 +*//** +* @file lpc17xx_dac.h +* @brief Contains all macro definitions and function prototypes +* support for Clock and Power Control firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup DAC DAC (Digital-to-Analog Controller) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_DAC_H_ +#define LPC17XX_DAC_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Public Macros -------------------------------------------------------------- */ +/** @defgroup DAC_Private_Macros DAC Private Macros + * @{ + */ + +/** After the selected settling time after this field is written with a +new VALUE, the voltage on the AOUT pin (with respect to VSSA) +is VALUE/1024 VREF */ +#define DAC_VALUE(n) ((uint32_t)((n&0x3FF)<<6)) +/** If this bit = 0: The settling time of the DAC is 1 microsecond max, + * and the maximum current is 700 microAmpere + * If this bit = 1: The settling time of the DAC is 2.5 microsecond + * and the maximum current is 350 microAmpere */ +#define DAC_BIAS_EN ((uint32_t)(1<<16)) +/** Value to reload interrupt DMA counter */ +#define DAC_CCNT_VALUE(n) ((uint32_t)(n&0xffff)) + +/** DCAR double buffering */ +#define DAC_DBLBUF_ENA ((uint32_t)(1<<1)) +/** DCAR Time out count enable */ +#define DAC_CNT_ENA ((uint32_t)(1<<2)) +/** DCAR DMA access */ +#define DAC_DMA_ENA ((uint32_t)(1<<3)) +/** DCAR DACCTRL mask bit */ +#define DAC_DACCTRL_MASK ((uint32_t)(0x0F)) + +/** Macro to determine if it is valid DAC peripheral */ +#define PARAM_DACx(n) (((uint32_t *)n)==((uint32_t *)LPC_DAC)) + +/** Macro to check DAC current optional parameter */ +#define PARAM_DAC_CURRENT_OPT(OPTION) ((OPTION == DAC_MAX_CURRENT_700uA)\ +||(OPTION == DAC_MAX_CURRENT_350uA)) +/** + * @} + */ +/* Public Types --------------------------------------------------------------- */ +/** @defgroup DAC_Public_Types DAC Public Types + * @{ + */ + +/** + * @brief Current option in DAC configuration option */ +typedef enum +{ + DAC_MAX_CURRENT_700uA = 0, /*!< The settling time of the DAC is 1 us max, + and the maximum current is 700 uA */ + DAC_MAX_CURRENT_350uA /*!< The settling time of the DAC is 2.5 us + and the maximum current is 350 uA */ +} DAC_CURRENT_OPT; + +/** + * @brief Configuration for DAC converter control register */ +typedef struct +{ + + uint8_t DBLBUF_ENA; /**< + -0: Disable DACR double buffering + -1: when bit CNT_ENA, enable DACR double buffering feature + */ + uint8_t CNT_ENA; /*!< + -0: Time out counter is disable + -1: Time out conter is enable + */ + uint8_t DMA_ENA; /*!< + -0: DMA access is disable + -1: DMA burst request + */ + uint8_t RESERVED; + +} DAC_CONVERTER_CFG_Type; + +/** + * @} + */ + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup DAC_Public_Functions DAC Public Functions + * @{ + */ + +void DAC_Init(LPC_DAC_TypeDef *DACx); +void DAC_UpdateValue (LPC_DAC_TypeDef *DACx, uint32_t dac_value); +void DAC_SetBias (LPC_DAC_TypeDef *DACx,uint32_t bias); +void DAC_ConfigDAConverterControl (LPC_DAC_TypeDef *DACx,DAC_CONVERTER_CFG_Type *DAC_ConverterConfigStruct); +void DAC_SetDMATimeOut(LPC_DAC_TypeDef *DACx,uint32_t time_out); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* LPC17XX_DAC_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ + diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_emac.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_emac.h new file mode 100644 index 0000000000..ebca02ce21 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_emac.h @@ -0,0 +1,711 @@ +/********************************************************************** +* $Id$ lpc17xx_emac.h 2010-05-21 +*//** +* @file lpc17xx_emac.h +* @brief Contains all macro definitions and function prototypes +* support for Ethernet MAC firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup EMAC EMAC (Ethernet Media Access Controller) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_EMAC_H_ +#define LPC17XX_EMAC_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define MCB_LPC_1768 +//#define IAR_LPC_1768 + +/* Public Macros -------------------------------------------------------------- */ +/** @defgroup EMAC_Public_Macros EMAC Public Macros + * @{ + */ + + +/* EMAC PHY status type definitions */ +#define EMAC_PHY_STAT_LINK (0) /**< Link Status */ +#define EMAC_PHY_STAT_SPEED (1) /**< Speed Status */ +#define EMAC_PHY_STAT_DUP (2) /**< Duplex Status */ + +/* EMAC PHY device Speed definitions */ +#define EMAC_MODE_AUTO (0) /**< Auto-negotiation mode */ +#define EMAC_MODE_10M_FULL (1) /**< 10Mbps FullDuplex mode */ +#define EMAC_MODE_10M_HALF (2) /**< 10Mbps HalfDuplex mode */ +#define EMAC_MODE_100M_FULL (3) /**< 100Mbps FullDuplex mode */ +#define EMAC_MODE_100M_HALF (4) /**< 100Mbps HalfDuplex mode */ + +/** + * @} + */ +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup EMAC_Private_Macros EMAC Private Macros + * @{ + */ + + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM */ +#define EMAC_NUM_RX_FRAG 4 /**< Num.of RX Fragments 4*1536= 6.0kB */ +#define EMAC_NUM_TX_FRAG 3 /**< Num.of TX Fragments 3*1536= 4.6kB */ +#define EMAC_ETH_MAX_FLEN 1536 /**< Max. Ethernet Frame Size */ +#define EMAC_TX_FRAME_TOUT 0x00100000 /**< Frame Transmit timeout count */ + +/* --------------------- BIT DEFINITIONS -------------------------------------- */ +/*********************************************************************//** + * Macro defines for MAC Configuration Register 1 + **********************************************************************/ +#define EMAC_MAC1_REC_EN 0x00000001 /**< Receive Enable */ +#define EMAC_MAC1_PASS_ALL 0x00000002 /**< Pass All Receive Frames */ +#define EMAC_MAC1_RX_FLOWC 0x00000004 /**< RX Flow Control */ +#define EMAC_MAC1_TX_FLOWC 0x00000008 /**< TX Flow Control */ +#define EMAC_MAC1_LOOPB 0x00000010 /**< Loop Back Mode */ +#define EMAC_MAC1_RES_TX 0x00000100 /**< Reset TX Logic */ +#define EMAC_MAC1_RES_MCS_TX 0x00000200 /**< Reset MAC TX Control Sublayer */ +#define EMAC_MAC1_RES_RX 0x00000400 /**< Reset RX Logic */ +#define EMAC_MAC1_RES_MCS_RX 0x00000800 /**< Reset MAC RX Control Sublayer */ +#define EMAC_MAC1_SIM_RES 0x00004000 /**< Simulation Reset */ +#define EMAC_MAC1_SOFT_RES 0x00008000 /**< Soft Reset MAC */ + +/*********************************************************************//** + * Macro defines for MAC Configuration Register 2 + **********************************************************************/ +#define EMAC_MAC2_FULL_DUP 0x00000001 /**< Full-Duplex Mode */ +#define EMAC_MAC2_FRM_LEN_CHK 0x00000002 /**< Frame Length Checking */ +#define EMAC_MAC2_HUGE_FRM_EN 0x00000004 /**< Huge Frame Enable */ +#define EMAC_MAC2_DLY_CRC 0x00000008 /**< Delayed CRC Mode */ +#define EMAC_MAC2_CRC_EN 0x00000010 /**< Append CRC to every Frame */ +#define EMAC_MAC2_PAD_EN 0x00000020 /**< Pad all Short Frames */ +#define EMAC_MAC2_VLAN_PAD_EN 0x00000040 /**< VLAN Pad Enable */ +#define EMAC_MAC2_ADET_PAD_EN 0x00000080 /**< Auto Detect Pad Enable */ +#define EMAC_MAC2_PPREAM_ENF 0x00000100 /**< Pure Preamble Enforcement */ +#define EMAC_MAC2_LPREAM_ENF 0x00000200 /**< Long Preamble Enforcement */ +#define EMAC_MAC2_NO_BACKOFF 0x00001000 /**< No Backoff Algorithm */ +#define EMAC_MAC2_BACK_PRESSURE 0x00002000 /**< Backoff Presurre / No Backoff */ +#define EMAC_MAC2_EXCESS_DEF 0x00004000 /**< Excess Defer */ + +/*********************************************************************//** + * Macro defines for Back-to-Back Inter-Packet-Gap Register + **********************************************************************/ +/** Programmable field representing the nibble time offset of the minimum possible period + * between the end of any transmitted packet to the beginning of the next */ +#define EMAC_IPGT_BBIPG(n) (n&0x7F) +/** Recommended value for Full Duplex of Programmable field representing the nibble time + * offset of the minimum possible period between the end of any transmitted packet to the + * beginning of the next */ +#define EMAC_IPGT_FULL_DUP (EMAC_IPGT_BBIPG(0x15)) +/** Recommended value for Half Duplex of Programmable field representing the nibble time + * offset of the minimum possible period between the end of any transmitted packet to the + * beginning of the next */ +#define EMAC_IPGT_HALF_DUP (EMAC_IPGT_BBIPG(0x12)) + +/*********************************************************************//** + * Macro defines for Non Back-to-Back Inter-Packet-Gap Register + **********************************************************************/ +/** Programmable field representing the Non-Back-to-Back Inter-Packet-Gap */ +#define EMAC_IPGR_NBBIPG_P2(n) (n&0x7F) +/** Recommended value for Programmable field representing the Non-Back-to-Back Inter-Packet-Gap Part 1 */ +#define EMAC_IPGR_P2_DEF (EMAC_IPGR_NBBIPG_P2(0x12)) +/** Programmable field representing the optional carrierSense window referenced in + * IEEE 802.3/4.2.3.2.1 'Carrier Deference' */ +#define EMAC_IPGR_NBBIPG_P1(n) ((n&0x7F)<<8) +/** Recommended value for Programmable field representing the Non-Back-to-Back Inter-Packet-Gap Part 2 */ +#define EMAC_IPGR_P1_DEF EMAC_IPGR_NBBIPG_P1(0x0C) + +/*********************************************************************//** + * Macro defines for Collision Window/Retry Register + **********************************************************************/ +/** Programmable field specifying the number of retransmission attempts following a collision before + * aborting the packet due to excessive collisions */ +#define EMAC_CLRT_MAX_RETX(n) (n&0x0F) +/** Programmable field representing the slot time or collision window during which collisions occur + * in properly configured networks */ +#define EMAC_CLRT_COLL(n) ((n&0x3F)<<8) +/** Default value for Collision Window / Retry register */ +#define EMAC_CLRT_DEF ((EMAC_CLRT_MAX_RETX(0x0F))|(EMAC_CLRT_COLL(0x37))) + +/*********************************************************************//** + * Macro defines for Maximum Frame Register + **********************************************************************/ +/** Represents a maximum receive frame of 1536 octets */ +#define EMAC_MAXF_MAXFRMLEN(n) (n&0xFFFF) + +/*********************************************************************//** + * Macro defines for PHY Support Register + **********************************************************************/ +#define EMAC_SUPP_SPEED 0x00000100 /**< Reduced MII Logic Current Speed */ +//#define EMAC_SUPP_RES_RMII 0x00000800 /**< Reset Reduced MII Logic */ + +/*********************************************************************//** + * Macro defines for Test Register + **********************************************************************/ +#define EMAC_TEST_SHCUT_PQUANTA 0x00000001 /**< Shortcut Pause Quanta */ +#define EMAC_TEST_TST_PAUSE 0x00000002 /**< Test Pause */ +#define EMAC_TEST_TST_BACKP 0x00000004 /**< Test Back Pressure */ + +/*********************************************************************//** + * Macro defines for MII Management Configuration Register + **********************************************************************/ +#define EMAC_MCFG_SCAN_INC 0x00000001 /**< Scan Increment PHY Address */ +#define EMAC_MCFG_SUPP_PREAM 0x00000002 /**< Suppress Preamble */ +#define EMAC_MCFG_CLK_SEL(n) ((n&0x0F)<<2) /**< Clock Select Field */ +#define EMAC_MCFG_RES_MII 0x00008000 /**< Reset MII Management Hardware */ +#define EMAC_MCFG_MII_MAXCLK 2500000UL /**< MII Clock max */ + +/*********************************************************************//** + * Macro defines for MII Management Command Register + **********************************************************************/ +#define EMAC_MCMD_READ 0x00000001 /**< MII Read */ +#define EMAC_MCMD_SCAN 0x00000002 /**< MII Scan continuously */ + +#define EMAC_MII_WR_TOUT 0x00050000 /**< MII Write timeout count */ +#define EMAC_MII_RD_TOUT 0x00050000 /**< MII Read timeout count */ + +/*********************************************************************//** + * Macro defines for MII Management Address Register + **********************************************************************/ +#define EMAC_MADR_REG_ADR(n) (n&0x1F) /**< MII Register Address field */ +#define EMAC_MADR_PHY_ADR(n) ((n&0x1F)<<8) /**< PHY Address Field */ + +/*********************************************************************//** + * Macro defines for MII Management Write Data Register + **********************************************************************/ +#define EMAC_MWTD_DATA(n) (n&0xFFFF) /**< Data field for MMI Management Write Data register */ + +/*********************************************************************//** + * Macro defines for MII Management Read Data Register + **********************************************************************/ +#define EMAC_MRDD_DATA(n) (n&0xFFFF) /**< Data field for MMI Management Read Data register */ + +/*********************************************************************//** + * Macro defines for MII Management Indicators Register + **********************************************************************/ +#define EMAC_MIND_BUSY 0x00000001 /**< MII is Busy */ +#define EMAC_MIND_SCAN 0x00000002 /**< MII Scanning in Progress */ +#define EMAC_MIND_NOT_VAL 0x00000004 /**< MII Read Data not valid */ +#define EMAC_MIND_MII_LINK_FAIL 0x00000008 /**< MII Link Failed */ + +/* Station Address 0 Register */ +/* Station Address 1 Register */ +/* Station Address 2 Register */ + + +/* Control register definitions --------------------------------------------------------------------------- */ +/*********************************************************************//** + * Macro defines for Command Register + **********************************************************************/ +#define EMAC_CR_RX_EN 0x00000001 /**< Enable Receive */ +#define EMAC_CR_TX_EN 0x00000002 /**< Enable Transmit */ +#define EMAC_CR_REG_RES 0x00000008 /**< Reset Host Registers */ +#define EMAC_CR_TX_RES 0x00000010 /**< Reset Transmit Datapath */ +#define EMAC_CR_RX_RES 0x00000020 /**< Reset Receive Datapath */ +#define EMAC_CR_PASS_RUNT_FRM 0x00000040 /**< Pass Runt Frames */ +#define EMAC_CR_PASS_RX_FILT 0x00000080 /**< Pass RX Filter */ +#define EMAC_CR_TX_FLOW_CTRL 0x00000100 /**< TX Flow Control */ +#define EMAC_CR_RMII 0x00000200 /**< Reduced MII Interface */ +#define EMAC_CR_FULL_DUP 0x00000400 /**< Full Duplex */ + +/*********************************************************************//** + * Macro defines for Status Register + **********************************************************************/ +#define EMAC_SR_RX_EN 0x00000001 /**< Enable Receive */ +#define EMAC_SR_TX_EN 0x00000002 /**< Enable Transmit */ + +/*********************************************************************//** + * Macro defines for Transmit Status Vector 0 Register + **********************************************************************/ +#define EMAC_TSV0_CRC_ERR 0x00000001 /**< CRC error */ +#define EMAC_TSV0_LEN_CHKERR 0x00000002 /**< Length Check Error */ +#define EMAC_TSV0_LEN_OUTRNG 0x00000004 /**< Length Out of Range */ +#define EMAC_TSV0_DONE 0x00000008 /**< Tramsmission Completed */ +#define EMAC_TSV0_MCAST 0x00000010 /**< Multicast Destination */ +#define EMAC_TSV0_BCAST 0x00000020 /**< Broadcast Destination */ +#define EMAC_TSV0_PKT_DEFER 0x00000040 /**< Packet Deferred */ +#define EMAC_TSV0_EXC_DEFER 0x00000080 /**< Excessive Packet Deferral */ +#define EMAC_TSV0_EXC_COLL 0x00000100 /**< Excessive Collision */ +#define EMAC_TSV0_LATE_COLL 0x00000200 /**< Late Collision Occured */ +#define EMAC_TSV0_GIANT 0x00000400 /**< Giant Frame */ +#define EMAC_TSV0_UNDERRUN 0x00000800 /**< Buffer Underrun */ +#define EMAC_TSV0_BYTES 0x0FFFF000 /**< Total Bytes Transferred */ +#define EMAC_TSV0_CTRL_FRAME 0x10000000 /**< Control Frame */ +#define EMAC_TSV0_PAUSE 0x20000000 /**< Pause Frame */ +#define EMAC_TSV0_BACK_PRESS 0x40000000 /**< Backpressure Method Applied */ +#define EMAC_TSV0_VLAN 0x80000000 /**< VLAN Frame */ + +/*********************************************************************//** + * Macro defines for Transmit Status Vector 1 Register + **********************************************************************/ +#define EMAC_TSV1_BYTE_CNT 0x0000FFFF /**< Transmit Byte Count */ +#define EMAC_TSV1_COLL_CNT 0x000F0000 /**< Transmit Collision Count */ + +/*********************************************************************//** + * Macro defines for Receive Status Vector Register + **********************************************************************/ +#define EMAC_RSV_BYTE_CNT 0x0000FFFF /**< Receive Byte Count */ +#define EMAC_RSV_PKT_IGNORED 0x00010000 /**< Packet Previously Ignored */ +#define EMAC_RSV_RXDV_SEEN 0x00020000 /**< RXDV Event Previously Seen */ +#define EMAC_RSV_CARR_SEEN 0x00040000 /**< Carrier Event Previously Seen */ +#define EMAC_RSV_REC_CODEV 0x00080000 /**< Receive Code Violation */ +#define EMAC_RSV_CRC_ERR 0x00100000 /**< CRC Error */ +#define EMAC_RSV_LEN_CHKERR 0x00200000 /**< Length Check Error */ +#define EMAC_RSV_LEN_OUTRNG 0x00400000 /**< Length Out of Range */ +#define EMAC_RSV_REC_OK 0x00800000 /**< Frame Received OK */ +#define EMAC_RSV_MCAST 0x01000000 /**< Multicast Frame */ +#define EMAC_RSV_BCAST 0x02000000 /**< Broadcast Frame */ +#define EMAC_RSV_DRIB_NIBB 0x04000000 /**< Dribble Nibble */ +#define EMAC_RSV_CTRL_FRAME 0x08000000 /**< Control Frame */ +#define EMAC_RSV_PAUSE 0x10000000 /**< Pause Frame */ +#define EMAC_RSV_UNSUPP_OPC 0x20000000 /**< Unsupported Opcode */ +#define EMAC_RSV_VLAN 0x40000000 /**< VLAN Frame */ + +/*********************************************************************//** + * Macro defines for Flow Control Counter Register + **********************************************************************/ +#define EMAC_FCC_MIRR_CNT(n) (n&0xFFFF) /**< Mirror Counter */ +#define EMAC_FCC_PAUSE_TIM(n) ((n&0xFFFF)<<16) /**< Pause Timer */ + +/*********************************************************************//** + * Macro defines for Flow Control Status Register + **********************************************************************/ +#define EMAC_FCS_MIRR_CNT(n) (n&0xFFFF) /**< Mirror Counter Current */ + + +/* Receive filter register definitions -------------------------------------------------------- */ +/*********************************************************************//** + * Macro defines for Receive Filter Control Register + **********************************************************************/ +#define EMAC_RFC_UCAST_EN 0x00000001 /**< Accept Unicast Frames Enable */ +#define EMAC_RFC_BCAST_EN 0x00000002 /**< Accept Broadcast Frames Enable */ +#define EMAC_RFC_MCAST_EN 0x00000004 /**< Accept Multicast Frames Enable */ +#define EMAC_RFC_UCAST_HASH_EN 0x00000008 /**< Accept Unicast Hash Filter Frames */ +#define EMAC_RFC_MCAST_HASH_EN 0x00000010 /**< Accept Multicast Hash Filter Fram.*/ +#define EMAC_RFC_PERFECT_EN 0x00000020 /**< Accept Perfect Match Enable */ +#define EMAC_RFC_MAGP_WOL_EN 0x00001000 /**< Magic Packet Filter WoL Enable */ +#define EMAC_RFC_PFILT_WOL_EN 0x00002000 /**< Perfect Filter WoL Enable */ + +/*********************************************************************//** + * Macro defines for Receive Filter WoL Status/Clear Registers + **********************************************************************/ +#define EMAC_WOL_UCAST 0x00000001 /**< Unicast Frame caused WoL */ +#define EMAC_WOL_BCAST 0x00000002 /**< Broadcast Frame caused WoL */ +#define EMAC_WOL_MCAST 0x00000004 /**< Multicast Frame caused WoL */ +#define EMAC_WOL_UCAST_HASH 0x00000008 /**< Unicast Hash Filter Frame WoL */ +#define EMAC_WOL_MCAST_HASH 0x00000010 /**< Multicast Hash Filter Frame WoL */ +#define EMAC_WOL_PERFECT 0x00000020 /**< Perfect Filter WoL */ +#define EMAC_WOL_RX_FILTER 0x00000080 /**< RX Filter caused WoL */ +#define EMAC_WOL_MAG_PACKET 0x00000100 /**< Magic Packet Filter caused WoL */ +#define EMAC_WOL_BITMASK 0x01BF /**< Receive Filter WoL Status/Clear bitmasl value */ + + +/* Module control register definitions ---------------------------------------------------- */ +/*********************************************************************//** + * Macro defines for Interrupt Status/Enable/Clear/Set Registers + **********************************************************************/ +#define EMAC_INT_RX_OVERRUN 0x00000001 /**< Overrun Error in RX Queue */ +#define EMAC_INT_RX_ERR 0x00000002 /**< Receive Error */ +#define EMAC_INT_RX_FIN 0x00000004 /**< RX Finished Process Descriptors */ +#define EMAC_INT_RX_DONE 0x00000008 /**< Receive Done */ +#define EMAC_INT_TX_UNDERRUN 0x00000010 /**< Transmit Underrun */ +#define EMAC_INT_TX_ERR 0x00000020 /**< Transmit Error */ +#define EMAC_INT_TX_FIN 0x00000040 /**< TX Finished Process Descriptors */ +#define EMAC_INT_TX_DONE 0x00000080 /**< Transmit Done */ +#define EMAC_INT_SOFT_INT 0x00001000 /**< Software Triggered Interrupt */ +#define EMAC_INT_WAKEUP 0x00002000 /**< Wakeup Event Interrupt */ + +/*********************************************************************//** + * Macro defines for Power Down Register + **********************************************************************/ +#define EMAC_PD_POWER_DOWN 0x80000000 /**< Power Down MAC */ + +/* Descriptor and status formats ---------------------------------------------------- */ +/*********************************************************************//** + * Macro defines for RX Descriptor Control Word + **********************************************************************/ +#define EMAC_RCTRL_SIZE(n) (n&0x7FF) /**< Buffer size field */ +#define EMAC_RCTRL_INT 0x80000000 /**< Generate RxDone Interrupt */ + +/*********************************************************************//** + * Macro defines for RX Status Hash CRC Word + **********************************************************************/ +#define EMAC_RHASH_SA 0x000001FF /**< Hash CRC for Source Address */ +#define EMAC_RHASH_DA 0x001FF000 /**< Hash CRC for Destination Address */ + +/*********************************************************************//** + * Macro defines for RX Status Information Word + **********************************************************************/ +#define EMAC_RINFO_SIZE 0x000007FF /**< Data size in bytes */ +#define EMAC_RINFO_CTRL_FRAME 0x00040000 /**< Control Frame */ +#define EMAC_RINFO_VLAN 0x00080000 /**< VLAN Frame */ +#define EMAC_RINFO_FAIL_FILT 0x00100000 /**< RX Filter Failed */ +#define EMAC_RINFO_MCAST 0x00200000 /**< Multicast Frame */ +#define EMAC_RINFO_BCAST 0x00400000 /**< Broadcast Frame */ +#define EMAC_RINFO_CRC_ERR 0x00800000 /**< CRC Error in Frame */ +#define EMAC_RINFO_SYM_ERR 0x01000000 /**< Symbol Error from PHY */ +#define EMAC_RINFO_LEN_ERR 0x02000000 /**< Length Error */ +#define EMAC_RINFO_RANGE_ERR 0x04000000 /**< Range Error (exceeded max. size) */ +#define EMAC_RINFO_ALIGN_ERR 0x08000000 /**< Alignment Error */ +#define EMAC_RINFO_OVERRUN 0x10000000 /**< Receive overrun */ +#define EMAC_RINFO_NO_DESCR 0x20000000 /**< No new Descriptor available */ +#define EMAC_RINFO_LAST_FLAG 0x40000000 /**< Last Fragment in Frame */ +#define EMAC_RINFO_ERR 0x80000000 /**< Error Occured (OR of all errors) */ +#define EMAC_RINFO_ERR_MASK (EMAC_RINFO_FAIL_FILT | EMAC_RINFO_CRC_ERR | EMAC_RINFO_SYM_ERR | \ +EMAC_RINFO_LEN_ERR | EMAC_RINFO_ALIGN_ERR | EMAC_RINFO_OVERRUN) + +/*********************************************************************//** + * Macro defines for TX Descriptor Control Word + **********************************************************************/ +#define EMAC_TCTRL_SIZE 0x000007FF /**< Size of data buffer in bytes */ +#define EMAC_TCTRL_OVERRIDE 0x04000000 /**< Override Default MAC Registers */ +#define EMAC_TCTRL_HUGE 0x08000000 /**< Enable Huge Frame */ +#define EMAC_TCTRL_PAD 0x10000000 /**< Pad short Frames to 64 bytes */ +#define EMAC_TCTRL_CRC 0x20000000 /**< Append a hardware CRC to Frame */ +#define EMAC_TCTRL_LAST 0x40000000 /**< Last Descriptor for TX Frame */ +#define EMAC_TCTRL_INT 0x80000000 /**< Generate TxDone Interrupt */ + +/*********************************************************************//** + * Macro defines for TX Status Information Word + **********************************************************************/ +#define EMAC_TINFO_COL_CNT 0x01E00000 /**< Collision Count */ +#define EMAC_TINFO_DEFER 0x02000000 /**< Packet Deferred (not an error) */ +#define EMAC_TINFO_EXCESS_DEF 0x04000000 /**< Excessive Deferral */ +#define EMAC_TINFO_EXCESS_COL 0x08000000 /**< Excessive Collision */ +#define EMAC_TINFO_LATE_COL 0x10000000 /**< Late Collision Occured */ +#define EMAC_TINFO_UNDERRUN 0x20000000 /**< Transmit Underrun */ +#define EMAC_TINFO_NO_DESCR 0x40000000 /**< No new Descriptor available */ +#define EMAC_TINFO_ERR 0x80000000 /**< Error Occured (OR of all errors) */ + +#ifdef MCB_LPC_1768 +/* DP83848C PHY definition ------------------------------------------------------------ */ + +/** PHY device reset time out definition */ +#define EMAC_PHY_RESP_TOUT 0x100000UL + +/* ENET Device Revision ID */ +#define EMAC_OLD_EMAC_MODULE_ID 0x39022000 /**< Rev. ID for first rev '-' */ + +/*********************************************************************//** + * Macro defines for DP83848C PHY Registers + **********************************************************************/ +#define EMAC_PHY_REG_BMCR 0x00 /**< Basic Mode Control Register */ +#define EMAC_PHY_REG_BMSR 0x01 /**< Basic Mode Status Register */ +#define EMAC_PHY_REG_IDR1 0x02 /**< PHY Identifier 1 */ +#define EMAC_PHY_REG_IDR2 0x03 /**< PHY Identifier 2 */ +#define EMAC_PHY_REG_ANAR 0x04 /**< Auto-Negotiation Advertisement */ +#define EMAC_PHY_REG_ANLPAR 0x05 /**< Auto-Neg. Link Partner Abitily */ +#define EMAC_PHY_REG_ANER 0x06 /**< Auto-Neg. Expansion Register */ +#define EMAC_PHY_REG_ANNPTR 0x07 /**< Auto-Neg. Next Page TX */ +#define EMAC_PHY_REG_LPNPA 0x08 + +/*********************************************************************//** + * Macro defines for PHY Extended Registers + **********************************************************************/ +#define EMAC_PHY_REG_STS 0x10 /**< Status Register */ +#define EMAC_PHY_REG_MICR 0x11 /**< MII Interrupt Control Register */ +#define EMAC_PHY_REG_MISR 0x12 /**< MII Interrupt Status Register */ +#define EMAC_PHY_REG_FCSCR 0x14 /**< False Carrier Sense Counter */ +#define EMAC_PHY_REG_RECR 0x15 /**< Receive Error Counter */ +#define EMAC_PHY_REG_PCSR 0x16 /**< PCS Sublayer Config. and Status */ +#define EMAC_PHY_REG_RBR 0x17 /**< RMII and Bypass Register */ +#define EMAC_PHY_REG_LEDCR 0x18 /**< LED Direct Control Register */ +#define EMAC_PHY_REG_PHYCR 0x19 /**< PHY Control Register */ +#define EMAC_PHY_REG_10BTSCR 0x1A /**< 10Base-T Status/Control Register */ +#define EMAC_PHY_REG_CDCTRL1 0x1B /**< CD Test Control and BIST Extens. */ +#define EMAC_PHY_REG_EDCR 0x1D /**< Energy Detect Control Register */ + +/*********************************************************************//** + * Macro defines for PHY Basic Mode Control Register + **********************************************************************/ +#define EMAC_PHY_BMCR_RESET (1<<15) /**< Reset bit */ +#define EMAC_PHY_BMCR_LOOPBACK (1<<14) /**< Loop back */ +#define EMAC_PHY_BMCR_SPEED_SEL (1<<13) /**< Speed selection */ +#define EMAC_PHY_BMCR_AN (1<<12) /**< Auto Negotiation */ +#define EMAC_PHY_BMCR_POWERDOWN (1<<11) /**< Power down mode */ +#define EMAC_PHY_BMCR_ISOLATE (1<<10) /**< Isolate */ +#define EMAC_PHY_BMCR_RE_AN (1<<9) /**< Restart auto negotiation */ +#define EMAC_PHY_BMCR_DUPLEX (1<<8) /**< Duplex mode */ + +/*********************************************************************//** + * Macro defines for PHY Basic Mode Status Status Register + **********************************************************************/ +#define EMAC_PHY_BMSR_100BE_T4 (1<<15) /**< 100 base T4 */ +#define EMAC_PHY_BMSR_100TX_FULL (1<<14) /**< 100 base full duplex */ +#define EMAC_PHY_BMSR_100TX_HALF (1<<13) /**< 100 base half duplex */ +#define EMAC_PHY_BMSR_10BE_FULL (1<<12) /**< 10 base T full duplex */ +#define EMAC_PHY_BMSR_10BE_HALF (1<<11) /**< 10 base T half duplex */ +#define EMAC_PHY_BMSR_NOPREAM (1<<6) /**< MF Preamable Supress */ +#define EMAC_PHY_BMSR_AUTO_DONE (1<<5) /**< Auto negotiation complete */ +#define EMAC_PHY_BMSR_REMOTE_FAULT (1<<4) /**< Remote fault */ +#define EMAC_PHY_BMSR_NO_AUTO (1<<3) /**< Auto Negotiation ability */ +#define EMAC_PHY_BMSR_LINK_ESTABLISHED (1<<2) /**< Link status */ + +/*********************************************************************//** + * Macro defines for PHY Status Register + **********************************************************************/ +#define EMAC_PHY_SR_REMOTE_FAULT (1<<6) /**< Remote Fault */ +#define EMAC_PHY_SR_JABBER (1<<5) /**< Jabber detect */ +#define EMAC_PHY_SR_AUTO_DONE (1<<4) /**< Auto Negotiation complete */ +#define EMAC_PHY_SR_LOOPBACK (1<<3) /**< Loop back status */ +#define EMAC_PHY_SR_DUP (1<<2) /**< Duplex status */ +#define EMAC_PHY_SR_SPEED (1<<1) /**< Speed status */ +#define EMAC_PHY_SR_LINK (1<<0) /**< Link Status */ + +#define EMAC_PHY_FULLD_100M 0x2100 /**< Full Duplex 100Mbit */ +#define EMAC_PHY_HALFD_100M 0x2000 /**< Half Duplex 100Mbit */ +#define EMAC_PHY_FULLD_10M 0x0100 /**< Full Duplex 10Mbit */ +#define EMAC_PHY_HALFD_10M 0x0000 /**< Half Duplex 10MBit */ +#define EMAC_PHY_AUTO_NEG 0x3000 /**< Select Auto Negotiation */ + +#define EMAC_DEF_ADR 0x0100 /**< Default PHY device address */ +#define EMAC_DP83848C_ID 0x20005C90 /**< PHY Identifier */ + +#define EMAC_PHY_SR_100_SPEED ((1<<14)|(1<<13)) +#define EMAC_PHY_SR_FULL_DUP ((1<<14)|(1<<12)) +#define EMAC_PHY_BMSR_LINK_STATUS (1<<2) /**< Link status */ + +#elif defined(IAR_LPC_1768) +/* KSZ8721BL PHY definition ------------------------------------------------------------ */ +/** PHY device reset time out definition */ +#define EMAC_PHY_RESP_TOUT 0x100000UL + +/* ENET Device Revision ID */ +#define EMAC_OLD_EMAC_MODULE_ID 0x39022000 /**< Rev. ID for first rev '-' */ + +/*********************************************************************//** + * Macro defines for KSZ8721BL PHY Registers + **********************************************************************/ +#define EMAC_PHY_REG_BMCR 0x00 /**< Basic Mode Control Register */ +#define EMAC_PHY_REG_BMSR 0x01 /**< Basic Mode Status Register */ +#define EMAC_PHY_REG_IDR1 0x02 /**< PHY Identifier 1 */ +#define EMAC_PHY_REG_IDR2 0x03 /**< PHY Identifier 2 */ +#define EMAC_PHY_REG_ANAR 0x04 /**< Auto-Negotiation Advertisement */ +#define EMAC_PHY_REG_ANLPAR 0x05 /**< Auto-Neg. Link Partner Abitily */ +#define EMAC_PHY_REG_ANER 0x06 /**< Auto-Neg. Expansion Register */ +#define EMAC_PHY_REG_ANNPTR 0x07 /**< Auto-Neg. Next Page TX */ +#define EMAC_PHY_REG_LPNPA 0x08 /**< Link Partner Next Page Ability */ +#define EMAC_PHY_REG_REC 0x15 /**< RXError Counter Register */ +#define EMAC_PHY_REG_ISC 0x1b /**< Interrupt Control/Status Register */ +#define EMAC_PHY_REG_100BASE 0x1f /**< 100BASE-TX PHY Control Register */ + +/*********************************************************************//** + * Macro defines for PHY Basic Mode Control Register + **********************************************************************/ +#define EMAC_PHY_BMCR_RESET (1<<15) /**< Reset bit */ +#define EMAC_PHY_BMCR_LOOPBACK (1<<14) /**< Loop back */ +#define EMAC_PHY_BMCR_SPEED_SEL (1<<13) /**< Speed selection */ +#define EMAC_PHY_BMCR_AN (1<<12) /**< Auto Negotiation */ +#define EMAC_PHY_BMCR_POWERDOWN (1<<11) /**< Power down mode */ +#define EMAC_PHY_BMCR_ISOLATE (1<<10) /**< Isolate */ +#define EMAC_PHY_BMCR_RE_AN (1<<9) /**< Restart auto negotiation */ +#define EMAC_PHY_BMCR_DUPLEX (1<<8) /**< Duplex mode */ +#define EMAC_PHY_BMCR_COLLISION (1<<7) /**< Collision test */ +#define EMAC_PHY_BMCR_TXDIS (1<<0) /**< Disable transmit */ + +/*********************************************************************//** + * Macro defines for PHY Basic Mode Status Register + **********************************************************************/ +#define EMAC_PHY_BMSR_100BE_T4 (1<<15) /**< 100 base T4 */ +#define EMAC_PHY_BMSR_100TX_FULL (1<<14) /**< 100 base full duplex */ +#define EMAC_PHY_BMSR_100TX_HALF (1<<13) /**< 100 base half duplex */ +#define EMAC_PHY_BMSR_10BE_FULL (1<<12) /**< 10 base T full duplex */ +#define EMAC_PHY_BMSR_10BE_HALF (1<<11) /**< 10 base T half duplex */ +#define EMAC_PHY_BMSR_NOPREAM (1<<6) /**< MF Preamable Supress */ +#define EMAC_PHY_BMSR_AUTO_DONE (1<<5) /**< Auto negotiation complete */ +#define EMAC_PHY_BMSR_REMOTE_FAULT (1<<4) /**< Remote fault */ +#define EMAC_PHY_BMSR_NO_AUTO (1<<3) /**< Auto Negotiation ability */ +#define EMAC_PHY_BMSR_LINK_STATUS (1<<2) /**< Link status */ +#define EMAC_PHY_BMSR_JABBER_DETECT (1<<1) /**< Jabber detect */ +#define EMAC_PHY_BMSR_EXTEND (1<<0) /**< Extended support */ + +/*********************************************************************//** + * Macro defines for PHY Identifier + **********************************************************************/ +/* PHY Identifier 1 bitmap definitions */ +#define EMAC_PHY_IDR1(n) (n & 0xFFFF) /**< PHY ID1 Number */ + +/* PHY Identifier 2 bitmap definitions */ +#define EMAC_PHY_IDR2(n) (n & 0xFFFF) /**< PHY ID2 Number */ + +/*********************************************************************//** + * Macro defines for Auto-Negotiation Advertisement + **********************************************************************/ +#define EMAC_PHY_AN_NEXTPAGE (1<<15) /**< Next page capable */ +#define EMAC_PHY_AN_REMOTE_FAULT (1<<13) /**< Remote Fault support */ +#define EMAC_PHY_AN_PAUSE (1<<10) /**< Pause support */ +#define EMAC_PHY_AN_100BASE_T4 (1<<9) /**< T4 capable */ +#define EMAC_PHY_AN_100BASE_TX_FD (1<<8) /**< TX with Full-duplex capable */ +#define EMAC_PHY_AN_100BASE_TX (1<<7) /**< TX capable */ +#define EMAC_PHY_AN_10BASE_T_FD (1<<6) /**< 10Mbps with full-duplex capable */ +#define EMAC_PHY_AN_10BASE_T (1<<5) /**< 10Mbps capable */ +#define EMAC_PHY_AN_FIELD(n) (n & 0x1F) /**< Selector Field */ + +#define EMAC_PHY_FULLD_100M 0x2100 /**< Full Duplex 100Mbit */ +#define EMAC_PHY_HALFD_100M 0x2000 /**< Half Duplex 100Mbit */ +#define EMAC_PHY_FULLD_10M 0x0100 /**< Full Duplex 10Mbit */ +#define EMAC_PHY_HALFD_10M 0x0000 /**< Half Duplex 10MBit */ +#define EMAC_PHY_AUTO_NEG 0x3000 /**< Select Auto Negotiation */ + +#define EMAC_PHY_SR_100_SPEED ((1<<14)|(1<<13)) +#define EMAC_PHY_SR_FULL_DUP ((1<<14)|(1<<12)) + +#define EMAC_DEF_ADR (0x01<<8) /**< Default PHY device address */ +#define EMAC_KSZ8721BL_ID ((0x22 << 16) | 0x1619 ) /**< PHY Identifier */ +#endif + +/** + * @} + */ + + +/* Public Types --------------------------------------------------------------- */ +/** @defgroup EMAC_Public_Types EMAC Public Types + * @{ + */ + +/* Descriptor and status formats ---------------------------------------------- */ + +/** + * @brief RX Descriptor structure type definition + */ +typedef struct { + uint32_t Packet; /**< Receive Packet Descriptor */ + uint32_t Ctrl; /**< Receive Control Descriptor */ +} RX_Desc; + +/** + * @brief RX Status structure type definition + */ +typedef struct { + uint32_t Info; /**< Receive Information Status */ + uint32_t HashCRC; /**< Receive Hash CRC Status */ +} RX_Stat; + +/** + * @brief TX Descriptor structure type definition + */ +typedef struct { + uint32_t Packet; /**< Transmit Packet Descriptor */ + uint32_t Ctrl; /**< Transmit Control Descriptor */ +} TX_Desc; + +/** + * @brief TX Status structure type definition + */ +typedef struct { + uint32_t Info; /**< Transmit Information Status */ +} TX_Stat; + + +/** + * @brief TX Data Buffer structure definition + */ +typedef struct { + uint32_t ulDataLen; /**< Data length */ + uint32_t *pbDataBuf; /**< A word-align data pointer to data buffer */ +} EMAC_PACKETBUF_Type; + +/** + * @brief EMAC configuration structure definition + */ +typedef struct { + uint32_t Mode; /**< Supported EMAC PHY device speed, should be one of the following: + - EMAC_MODE_AUTO + - EMAC_MODE_10M_FULL + - EMAC_MODE_10M_HALF + - EMAC_MODE_100M_FULL + - EMAC_MODE_100M_HALF + */ + uint8_t *pbEMAC_Addr; /**< Pointer to EMAC Station address that contains 6-bytes + of MAC address, it must be sorted in order (bEMAC_Addr[0]..[5]) + */ +} EMAC_CFG_Type; + + +/** + * @} + */ + + +/* Public Functions ----------------------------------------------------------- */ +/** @defgroup EMAC_Public_Functions EMAC Public Functions + * @{ + */ +/* Init/DeInit EMAC peripheral */ +Status EMAC_Init(EMAC_CFG_Type *EMAC_ConfigStruct); +void EMAC_DeInit(void); + +/* PHY functions --------------*/ +int32_t EMAC_CheckPHYStatus(uint32_t ulPHYState); +int32_t EMAC_SetPHYMode(uint32_t ulPHYMode); +int32_t EMAC_UpdatePHYStatus(void); + +/* Filter functions ----------*/ +void EMAC_SetHashFilter(uint8_t dstMAC_addr[], FunctionalState NewState); +void EMAC_SetFilterMode(uint32_t ulFilterMode, FunctionalState NewState); + +/* EMAC Packet Buffer functions */ +void EMAC_WritePacketBuffer(EMAC_PACKETBUF_Type *pDataStruct); +void EMAC_ReadPacketBuffer(EMAC_PACKETBUF_Type *pDataStruct); + +/* EMAC Interrupt functions -------*/ +void EMAC_IntCmd(uint32_t ulIntType, FunctionalState NewState); +IntStatus EMAC_IntGetStatus(uint32_t ulIntType); + +/* EMAC Index functions -----------*/ +Bool EMAC_CheckReceiveIndex(void); +Bool EMAC_CheckTransmitIndex(void); +void EMAC_UpdateRxConsumeIndex(void); +void EMAC_UpdateTxProduceIndex(void); + +FlagStatus EMAC_CheckReceiveDataStatus(uint32_t ulRxStatType); +uint32_t EMAC_GetReceiveDataSize(void); +FlagStatus EMAC_GetWoLStatus(uint32_t ulWoLMode); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* LPC17XX_EMAC_H_ */ + +/** + * @} + */ + +/* --------------------------------- End Of File ------------------------------ */ diff --git a/frameworks/CMSIS/LPC1768/include/lpc17xx_exti.h b/frameworks/CMSIS/LPC1768/include/lpc17xx_exti.h new file mode 100644 index 0000000000..5e5b8b87d6 --- /dev/null +++ b/frameworks/CMSIS/LPC1768/include/lpc17xx_exti.h @@ -0,0 +1,155 @@ +/********************************************************************** +* $Id$ lpc17xx_exti.h 2010-05-21 +*//** +* @file lpc17xx_exti.h +* @brief Contains all macro definitions and function prototypes +* support for External interrupt firmware library on LPC17xx +* @version 2.0 +* @date 21. May. 2010 +* @author NXP MCU SW Application Team +* +* Copyright(C) 2010, NXP Semiconductor +* All rights reserved. +* +*********************************************************************** +* Software that is described herein is for illustrative purposes only +* which provides customers with programming information regarding the +* products. This software is supplied "AS IS" without any warranties. +* NXP Semiconductors assumes no responsibility or liability for the +* use of the software, conveys no license or title under any patent, +* copyright, or mask work right to the product. NXP Semiconductors +* reserves the right to make changes in the software without +* notification. NXP Semiconductors also make no representation or +* warranty that such application will be suitable for the specified +* use without further testing or modification. +* Permission to use, copy, modify, and distribute this software and its +* documentation is hereby granted, under NXP Semiconductors' +* relevant copyright in the software, without fee, provided that it +* is used in conjunction with NXP Semiconductors microcontrollers. This +* copyright, permission, and disclaimer notice must appear in all copies of +* this code. +**********************************************************************/ + +/* Peripheral group ----------------------------------------------------------- */ +/** @defgroup EXTI EXTI (External Interrupt) + * @ingroup LPC1700CMSIS_FwLib_Drivers + * @{ + */ + +#ifndef LPC17XX_EXTI_H_ +#define LPC17XX_EXTI_H_ + +/* Includes ------------------------------------------------------------------- */ +#include "LPC17xx.h" +#include "lpc_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup EXTI_Private_Macros EXTI Private Macros + * @{ + */ +/*********************************************************************//** + * Macro defines for EXTI control register + **********************************************************************/ +#define EXTI_EINT0_BIT_MARK 0x01 +#define EXTI_EINT1_BIT_MARK 0x02 +#define EXTI_EINT2_BIT_MARK 0x04 +#define EXTI_EINT3_BIT_MARK 0x08 + +/** + * @} + */ + +/* Private Macros ------------------------------------------------------------- */ +/** @defgroup EXTI_Public_Types EXTI Public Types + * @{ + */ + +/** + * @brief EXTI external interrupt line option + */ +typedef enum +{ + EXTI_EINT0, /*!< External interrupt 0, P2.10 */ + EXTI_EINT1, /*!< External interrupt 0, P2.11 */ + EXTI_EINT2, /*!< External interrupt 0, P2.12 */ + EXTI_EINT3 /*!< External interrupt 0, P2.13 */ +} EXTI_LINE_ENUM; + +/** + * @brief EXTI mode option + */ +typedef enum +{ + EXTI_MODE_LEVEL_SENSITIVE, /*!< Level sensitivity is selected */ + EXTI_MODE_EDGE_SENSITIVE /*!< Edge sensitivity is selected */ +} EXTI_MODE_ENUM; + +/** + * @brief EXTI polarity option + */ +typedef enum +{ + EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE, /*!< Low active or falling edge sensitive + depending on pin mode */ + EXTI_POLARITY_HIGH_ACTIVE_OR_RISING_EDGE /*!< High active or rising edge sensitive + depending on pin mode */ +} EXTI_POLARITY_ENUM; + +/** + * @brief EXTI Initialize structure + */ +typedef struct +{ + EXTI_LINE_ENUM EXTI_Line; /*!